aboutsummaryrefslogtreecommitdiff
path: root/src/main
diff options
context:
space:
mode:
Diffstat (limited to 'src/main')
-rw-r--r--src/main/assembly/assemble_libraries.xml16
-rw-r--r--src/main/java/at/knowcenter/wag/egov/egiz/PdfAS.java1083
-rw-r--r--src/main/java/at/knowcenter/wag/egov/egiz/PdfASID.java173
-rw-r--r--src/main/java/at/knowcenter/wag/egov/egiz/cfg/ConfigLogger.java71
-rw-r--r--src/main/java/at/knowcenter/wag/egov/egiz/cfg/PropertyTree.java348
-rw-r--r--src/main/java/at/knowcenter/wag/egov/egiz/cfg/Settings.java57
-rw-r--r--src/main/java/at/knowcenter/wag/egov/egiz/cfg/SettingsReader.java683
-rw-r--r--src/main/java/at/knowcenter/wag/egov/egiz/commandline/Main.java917
-rw-r--r--src/main/java/at/knowcenter/wag/egov/egiz/exceptions/ConnectorFactoryException.java64
-rw-r--r--src/main/java/at/knowcenter/wag/egov/egiz/exceptions/ErrorCodeException.java308
-rw-r--r--src/main/java/at/knowcenter/wag/egov/egiz/exceptions/InvalidIDException.java52
-rw-r--r--src/main/java/at/knowcenter/wag/egov/egiz/exceptions/NormalizeException.java72
-rw-r--r--src/main/java/at/knowcenter/wag/egov/egiz/exceptions/PDFDocumentException.java69
-rw-r--r--src/main/java/at/knowcenter/wag/egov/egiz/exceptions/PlaceholderException.java56
-rw-r--r--src/main/java/at/knowcenter/wag/egov/egiz/exceptions/PresentableException.java65
-rw-r--r--src/main/java/at/knowcenter/wag/egov/egiz/exceptions/SettingNotFoundException.java70
-rw-r--r--src/main/java/at/knowcenter/wag/egov/egiz/exceptions/SettingsException.java63
-rw-r--r--src/main/java/at/knowcenter/wag/egov/egiz/exceptions/SignatorFactoryException.java37
-rw-r--r--src/main/java/at/knowcenter/wag/egov/egiz/exceptions/SignatureException.java72
-rw-r--r--src/main/java/at/knowcenter/wag/egov/egiz/exceptions/SignatureTypesException.java57
-rw-r--r--src/main/java/at/knowcenter/wag/egov/egiz/exceptions/WebException.java72
-rw-r--r--src/main/java/at/knowcenter/wag/egov/egiz/framework/FoundBlock.java198
-rw-r--r--src/main/java/at/knowcenter/wag/egov/egiz/framework/FoundKey.java96
-rw-r--r--src/main/java/at/knowcenter/wag/egov/egiz/framework/SignResult.java96
-rw-r--r--src/main/java/at/knowcenter/wag/egov/egiz/framework/Signator.java67
-rw-r--r--src/main/java/at/knowcenter/wag/egov/egiz/framework/SignatorFactory.java174
-rw-r--r--src/main/java/at/knowcenter/wag/egov/egiz/framework/VerificationFilter.java494
-rw-r--r--src/main/java/at/knowcenter/wag/egov/egiz/framework/Verificator.java52
-rw-r--r--src/main/java/at/knowcenter/wag/egov/egiz/framework/signators/BinarySignator_1_0_0.java195
-rw-r--r--src/main/java/at/knowcenter/wag/egov/egiz/framework/signators/DetachedSignator_1_0_0.java99
-rw-r--r--src/main/java/at/knowcenter/wag/egov/egiz/framework/signators/TextualSignator_1_0_0.java122
-rw-r--r--src/main/java/at/knowcenter/wag/egov/egiz/framework/verificators/BinaryVerificator_1_0_0.java373
-rw-r--r--src/main/java/at/knowcenter/wag/egov/egiz/framework/verificators/TextualVerificator_1_0_0.java136
-rw-r--r--src/main/java/at/knowcenter/wag/egov/egiz/framework/verificators/TextualVerificator_pdfasold.java97
-rw-r--r--src/main/java/at/knowcenter/wag/egov/egiz/pdf/AbsoluteTextSignature.java656
-rw-r--r--src/main/java/at/knowcenter/wag/egov/egiz/pdf/BinaryBlockInfo.java53
-rw-r--r--src/main/java/at/knowcenter/wag/egov/egiz/pdf/BinarySignature.java1731
-rw-r--r--src/main/java/at/knowcenter/wag/egov/egiz/pdf/BinarySignatureHolder.java146
-rw-r--r--src/main/java/at/knowcenter/wag/egov/egiz/pdf/EGIZDate.java189
-rw-r--r--src/main/java/at/knowcenter/wag/egov/egiz/pdf/IncrementalUpdateInformation.java152
-rw-r--r--src/main/java/at/knowcenter/wag/egov/egiz/pdf/PDFPage.java539
-rw-r--r--src/main/java/at/knowcenter/wag/egov/egiz/pdf/PDFSignatureCreation.java170
-rw-r--r--src/main/java/at/knowcenter/wag/egov/egiz/pdf/PDFSignatureObject.java50
-rw-r--r--src/main/java/at/knowcenter/wag/egov/egiz/pdf/PDFSignatureObjectIText.java490
-rw-r--r--src/main/java/at/knowcenter/wag/egov/egiz/pdf/PDFUtilities.java89
-rw-r--r--src/main/java/at/knowcenter/wag/egov/egiz/pdf/Placeholder.java552
-rw-r--r--src/main/java/at/knowcenter/wag/egov/egiz/pdf/Pos.java62
-rw-r--r--src/main/java/at/knowcenter/wag/egov/egiz/pdf/ReplaceInfo.java64
-rw-r--r--src/main/java/at/knowcenter/wag/egov/egiz/pdf/SignatureHolder.java62
-rw-r--r--src/main/java/at/knowcenter/wag/egov/egiz/pdf/SplitStrings.java162
-rw-r--r--src/main/java/at/knowcenter/wag/egov/egiz/pdf/StringInfo.java93
-rw-r--r--src/main/java/at/knowcenter/wag/egov/egiz/pdf/TablePos.java56
-rw-r--r--src/main/java/at/knowcenter/wag/egov/egiz/pdf/TextualSignature.java177
-rw-r--r--src/main/java/at/knowcenter/wag/egov/egiz/pdf/TextualSignatureHolder.java73
-rw-r--r--src/main/java/at/knowcenter/wag/egov/egiz/pdf/Utils.java96
-rw-r--r--src/main/java/at/knowcenter/wag/egov/egiz/sig/Connector.java59
-rw-r--r--src/main/java/at/knowcenter/wag/egov/egiz/sig/ConnectorFactory.java326
-rw-r--r--src/main/java/at/knowcenter/wag/egov/egiz/sig/ConnectorInformation.java89
-rw-r--r--src/main/java/at/knowcenter/wag/egov/egiz/sig/DummyLDAPAPI.java70
-rw-r--r--src/main/java/at/knowcenter/wag/egov/egiz/sig/LocalConnector.java117
-rw-r--r--src/main/java/at/knowcenter/wag/egov/egiz/sig/SignatureBlock.java306
-rw-r--r--src/main/java/at/knowcenter/wag/egov/egiz/sig/SignatureEntry.java155
-rw-r--r--src/main/java/at/knowcenter/wag/egov/egiz/sig/SignatureFieldDefinition.java80
-rw-r--r--src/main/java/at/knowcenter/wag/egov/egiz/sig/SignatureObject.java1499
-rw-r--r--src/main/java/at/knowcenter/wag/egov/egiz/sig/SignatureResponse.java470
-rw-r--r--src/main/java/at/knowcenter/wag/egov/egiz/sig/SignatureSeparator.java139
-rw-r--r--src/main/java/at/knowcenter/wag/egov/egiz/sig/SignatureTypeDefinition.java423
-rw-r--r--src/main/java/at/knowcenter/wag/egov/egiz/sig/SignatureTypes.java462
-rw-r--r--src/main/java/at/knowcenter/wag/egov/egiz/sig/X509Cert.java462
-rw-r--r--src/main/java/at/knowcenter/wag/egov/egiz/sig/connectors/A1Connector.java55
-rw-r--r--src/main/java/at/knowcenter/wag/egov/egiz/sig/connectors/BKUConnector.java813
-rw-r--r--src/main/java/at/knowcenter/wag/egov/egiz/sig/connectors/BKUPostConnection.java95
-rw-r--r--src/main/java/at/knowcenter/wag/egov/egiz/sig/connectors/ConnectorConfigurationKeys.java35
-rw-r--r--src/main/java/at/knowcenter/wag/egov/egiz/sig/connectors/MOAConnector.java880
-rw-r--r--src/main/java/at/knowcenter/wag/egov/egiz/table/Entry.java227
-rw-r--r--src/main/java/at/knowcenter/wag/egov/egiz/table/Style.java368
-rw-r--r--src/main/java/at/knowcenter/wag/egov/egiz/table/Table.java215
-rw-r--r--src/main/java/at/knowcenter/wag/egov/egiz/test/AbsTexTest.java141
-rw-r--r--src/main/java/at/knowcenter/wag/egov/egiz/test/BinSig.java345
-rw-r--r--src/main/java/at/knowcenter/wag/egov/egiz/test/ExtractTextTextual.java62
-rw-r--r--src/main/java/at/knowcenter/wag/egov/egiz/test/X509.java40
-rw-r--r--src/main/java/at/knowcenter/wag/egov/egiz/test/X509Ext.java48
-rw-r--r--src/main/java/at/knowcenter/wag/egov/egiz/tools/CodingHelper.java272
-rw-r--r--src/main/java/at/knowcenter/wag/egov/egiz/tools/FileHelper.java88
-rw-r--r--src/main/java/at/knowcenter/wag/egov/egiz/tools/Normalize.java48
-rw-r--r--src/main/java/at/knowcenter/wag/egov/egiz/tools/NormalizeV01.java166
-rw-r--r--src/main/java/at/knowcenter/wag/egov/egiz/tools/Normalizer.java270
-rw-r--r--src/main/java/at/knowcenter/wag/egov/egiz/web/AsynchronousDataResponder.java155
-rw-r--r--src/main/java/at/knowcenter/wag/egov/egiz/web/AsynchronousRedirectResponder.java196
-rw-r--r--src/main/java/at/knowcenter/wag/egov/egiz/web/FormFields.java210
-rw-r--r--src/main/java/at/knowcenter/wag/egov/egiz/web/LocalRequest.java80
-rw-r--r--src/main/java/at/knowcenter/wag/egov/egiz/web/LocalRequestHelper.java226
-rw-r--r--src/main/java/at/knowcenter/wag/egov/egiz/web/PdfASServletContextListener.java76
-rw-r--r--src/main/java/at/knowcenter/wag/egov/egiz/web/SessionAttributes.java46
-rw-r--r--src/main/java/at/knowcenter/wag/egov/egiz/web/SessionInformation.java126
-rw-r--r--src/main/java/at/knowcenter/wag/egov/egiz/web/SessionTable.java94
-rw-r--r--src/main/java/at/knowcenter/wag/egov/egiz/web/Sign.java525
-rw-r--r--src/main/java/at/knowcenter/wag/egov/egiz/web/SignPreview.java105
-rw-r--r--src/main/java/at/knowcenter/wag/egov/egiz/web/Verify.java285
-rw-r--r--src/main/java/at/knowcenter/wag/egov/egiz/web/VerifyPreview.java704
-rw-r--r--src/main/java/at/knowcenter/wag/exactparser/ByteArrayUtils.java140
-rw-r--r--src/main/java/at/knowcenter/wag/exactparser/ParseDocument.java265
-rw-r--r--src/main/java/at/knowcenter/wag/exactparser/parsing/IndirectObjectReference.java49
-rw-r--r--src/main/java/at/knowcenter/wag/exactparser/parsing/PDFNames.java176
-rw-r--r--src/main/java/at/knowcenter/wag/exactparser/parsing/PDFUtils.java1393
-rw-r--r--src/main/java/at/knowcenter/wag/exactparser/parsing/results/ArrayParseResult.java34
-rw-r--r--src/main/java/at/knowcenter/wag/exactparser/parsing/results/BooleanParseResult.java30
-rw-r--r--src/main/java/at/knowcenter/wag/exactparser/parsing/results/ContainerParseResult.java37
-rw-r--r--src/main/java/at/knowcenter/wag/exactparser/parsing/results/DictionaryParseResult.java33
-rw-r--r--src/main/java/at/knowcenter/wag/exactparser/parsing/results/EOFParseResult.java39
-rw-r--r--src/main/java/at/knowcenter/wag/exactparser/parsing/results/FooterParseResult.java45
-rw-r--r--src/main/java/at/knowcenter/wag/exactparser/parsing/results/HeaderParseResult.java40
-rw-r--r--src/main/java/at/knowcenter/wag/exactparser/parsing/results/HexStringParseResult.java28
-rw-r--r--src/main/java/at/knowcenter/wag/exactparser/parsing/results/IndirectObjectReferenceParseResult.java36
-rw-r--r--src/main/java/at/knowcenter/wag/exactparser/parsing/results/IntegerParseResult.java28
-rw-r--r--src/main/java/at/knowcenter/wag/exactparser/parsing/results/LiteralStringParseResult.java29
-rw-r--r--src/main/java/at/knowcenter/wag/exactparser/parsing/results/NameParseResult.java27
-rw-r--r--src/main/java/at/knowcenter/wag/exactparser/parsing/results/NullParseResult.java26
-rw-r--r--src/main/java/at/knowcenter/wag/exactparser/parsing/results/NumberParseResult.java33
-rw-r--r--src/main/java/at/knowcenter/wag/exactparser/parsing/results/ObjectHeaderParseResult.java43
-rw-r--r--src/main/java/at/knowcenter/wag/exactparser/parsing/results/ObjectParseResult.java42
-rw-r--r--src/main/java/at/knowcenter/wag/exactparser/parsing/results/ParseResult.java42
-rw-r--r--src/main/java/at/knowcenter/wag/exactparser/parsing/results/StartXRefParseResult.java28
-rw-r--r--src/main/java/at/knowcenter/wag/exactparser/parsing/results/StreamParseResult.java33
-rw-r--r--src/main/java/at/knowcenter/wag/exactparser/parsing/results/TrailerParseResult.java76
-rw-r--r--src/main/java/at/knowcenter/wag/exactparser/parsing/results/XRefLineParseResult.java32
-rw-r--r--src/main/java/at/knowcenter/wag/exactparser/parsing/results/XRefSectionParseResult.java58
-rw-r--r--src/main/java/at/knowcenter/wag/exactparser/parsing/results/XRefSubSectionParseResult.java51
-rw-r--r--src/main/java/com/lowagie/bc/asn1/ASN1Encodable.java65
-rw-r--r--src/main/java/com/lowagie/bc/asn1/ASN1EncodableVector.java9
-rw-r--r--src/main/java/com/lowagie/bc/asn1/ASN1InputStream.java450
-rw-r--r--src/main/java/com/lowagie/bc/asn1/ASN1Null.java33
-rw-r--r--src/main/java/com/lowagie/bc/asn1/ASN1OctetString.java141
-rw-r--r--src/main/java/com/lowagie/bc/asn1/ASN1OutputStream.java36
-rw-r--r--src/main/java/com/lowagie/bc/asn1/ASN1Sequence.java185
-rw-r--r--src/main/java/com/lowagie/bc/asn1/ASN1Set.java184
-rw-r--r--src/main/java/com/lowagie/bc/asn1/ASN1TaggedObject.java146
-rw-r--r--src/main/java/com/lowagie/bc/asn1/BERConstructedOctetString.java168
-rw-r--r--src/main/java/com/lowagie/bc/asn1/BERConstructedSequence.java34
-rw-r--r--src/main/java/com/lowagie/bc/asn1/BERInputStream.java197
-rw-r--r--src/main/java/com/lowagie/bc/asn1/BERNull.java30
-rw-r--r--src/main/java/com/lowagie/bc/asn1/BEROutputStream.java36
-rw-r--r--src/main/java/com/lowagie/bc/asn1/BERSequence.java59
-rw-r--r--src/main/java/com/lowagie/bc/asn1/BERSet.java59
-rw-r--r--src/main/java/com/lowagie/bc/asn1/BERTaggedObject.java119
-rw-r--r--src/main/java/com/lowagie/bc/asn1/DERApplicationSpecific.java67
-rw-r--r--src/main/java/com/lowagie/bc/asn1/DERBMPString.java121
-rw-r--r--src/main/java/com/lowagie/bc/asn1/DERBitString.java268
-rw-r--r--src/main/java/com/lowagie/bc/asn1/DERBoolean.java103
-rw-r--r--src/main/java/com/lowagie/bc/asn1/DERConstructedSequence.java53
-rw-r--r--src/main/java/com/lowagie/bc/asn1/DERConstructedSet.java75
-rw-r--r--src/main/java/com/lowagie/bc/asn1/DEREncodable.java6
-rw-r--r--src/main/java/com/lowagie/bc/asn1/DEREncodableVector.java30
-rw-r--r--src/main/java/com/lowagie/bc/asn1/DEREnumerated.java108
-rw-r--r--src/main/java/com/lowagie/bc/asn1/DERGeneralString.java86
-rw-r--r--src/main/java/com/lowagie/bc/asn1/DERGeneralizedTime.java188
-rw-r--r--src/main/java/com/lowagie/bc/asn1/DERIA5String.java123
-rw-r--r--src/main/java/com/lowagie/bc/asn1/DERInputStream.java258
-rw-r--r--src/main/java/com/lowagie/bc/asn1/DERInteger.java129
-rw-r--r--src/main/java/com/lowagie/bc/asn1/DERNull.java34
-rw-r--r--src/main/java/com/lowagie/bc/asn1/DERNumericString.java123
-rw-r--r--src/main/java/com/lowagie/bc/asn1/DERObject.java15
-rw-r--r--src/main/java/com/lowagie/bc/asn1/DERObjectIdentifier.java170
-rw-r--r--src/main/java/com/lowagie/bc/asn1/DEROctetString.java29
-rw-r--r--src/main/java/com/lowagie/bc/asn1/DEROutputStream.java81
-rw-r--r--src/main/java/com/lowagie/bc/asn1/DERPrintableString.java123
-rw-r--r--src/main/java/com/lowagie/bc/asn1/DERSequence.java67
-rw-r--r--src/main/java/com/lowagie/bc/asn1/DERSet.java70
-rw-r--r--src/main/java/com/lowagie/bc/asn1/DERString.java9
-rw-r--r--src/main/java/com/lowagie/bc/asn1/DERT61String.java116
-rw-r--r--src/main/java/com/lowagie/bc/asn1/DERTaggedObject.java88
-rw-r--r--src/main/java/com/lowagie/bc/asn1/DERTags.java36
-rw-r--r--src/main/java/com/lowagie/bc/asn1/DERUTCTime.java183
-rw-r--r--src/main/java/com/lowagie/bc/asn1/DERUTF8String.java177
-rw-r--r--src/main/java/com/lowagie/bc/asn1/DERUniversalString.java110
-rw-r--r--src/main/java/com/lowagie/bc/asn1/DERUnknownTag.java73
-rw-r--r--src/main/java/com/lowagie/bc/asn1/DERVisibleString.java116
-rw-r--r--src/main/java/com/lowagie/bc/asn1/OIDTokenizer.java48
-rw-r--r--src/main/java/com/lowagie/text/Anchor.java365
-rw-r--r--src/main/java/com/lowagie/text/Annotation.java737
-rw-r--r--src/main/java/com/lowagie/text/BadElementException.java89
-rw-r--r--src/main/java/com/lowagie/text/Cell.java1013
-rw-r--r--src/main/java/com/lowagie/text/Chapter.java156
-rw-r--r--src/main/java/com/lowagie/text/ChapterAutoNumber.java103
-rw-r--r--src/main/java/com/lowagie/text/Chunk.java937
-rw-r--r--src/main/java/com/lowagie/text/DocListener.java182
-rw-r--r--src/main/java/com/lowagie/text/DocWriter.java510
-rw-r--r--src/main/java/com/lowagie/text/Document.java916
-rw-r--r--src/main/java/com/lowagie/text/DocumentException.java186
-rw-r--r--src/main/java/com/lowagie/text/Element.java325
-rw-r--r--src/main/java/com/lowagie/text/ElementListener.java75
-rw-r--r--src/main/java/com/lowagie/text/ElementTags.java461
-rw-r--r--src/main/java/com/lowagie/text/Entities.java388
-rw-r--r--src/main/java/com/lowagie/text/ExceptionConverter.java135
-rw-r--r--src/main/java/com/lowagie/text/Font.java806
-rw-r--r--src/main/java/com/lowagie/text/FontFactory.java429
-rw-r--r--src/main/java/com/lowagie/text/FontFactoryImp.java659
-rw-r--r--src/main/java/com/lowagie/text/Graphic.java277
-rw-r--r--src/main/java/com/lowagie/text/GreekList.java141
-rw-r--r--src/main/java/com/lowagie/text/Header.java98
-rw-r--r--src/main/java/com/lowagie/text/HeaderFooter.java206
-rw-r--r--src/main/java/com/lowagie/text/Image.java2134
-rw-r--r--src/main/java/com/lowagie/text/ImgCCITT.java146
-rw-r--r--src/main/java/com/lowagie/text/ImgPostscript.java234
-rw-r--r--src/main/java/com/lowagie/text/ImgRaw.java97
-rw-r--r--src/main/java/com/lowagie/text/ImgTemplate.java91
-rw-r--r--src/main/java/com/lowagie/text/ImgWMF.java190
-rw-r--r--src/main/java/com/lowagie/text/Jpeg.java350
-rw-r--r--src/main/java/com/lowagie/text/List.java558
-rw-r--r--src/main/java/com/lowagie/text/ListItem.java293
-rw-r--r--src/main/java/com/lowagie/text/MarkupAttributes.java102
-rw-r--r--src/main/java/com/lowagie/text/Meta.java263
-rw-r--r--src/main/java/com/lowagie/text/PageSize.java152
-rw-r--r--src/main/java/com/lowagie/text/Paragraph.java516
-rw-r--r--src/main/java/com/lowagie/text/Phrase.java612
-rw-r--r--src/main/java/com/lowagie/text/Rectangle.java955
-rw-r--r--src/main/java/com/lowagie/text/RomanList.java291
-rw-r--r--src/main/java/com/lowagie/text/Row.java470
-rw-r--r--src/main/java/com/lowagie/text/Section.java660
-rw-r--r--src/main/java/com/lowagie/text/SimpleCell.java539
-rw-r--r--src/main/java/com/lowagie/text/SimpleTable.java357
-rw-r--r--src/main/java/com/lowagie/text/SpecialSymbol.java214
-rw-r--r--src/main/java/com/lowagie/text/SplitCharacter.java98
-rw-r--r--src/main/java/com/lowagie/text/StringCompare.java77
-rw-r--r--src/main/java/com/lowagie/text/Table.java1916
-rw-r--r--src/main/java/com/lowagie/text/TextElementArray.java75
-rw-r--r--src/main/java/com/lowagie/text/Watermark.java123
-rw-r--r--src/main/java/com/lowagie/text/ZapfDingbatsList.java119
-rw-r--r--src/main/java/com/lowagie/text/ZapfDingbatsNumberList.java132
-rw-r--r--src/main/java/com/lowagie/text/html/HtmlEncoder.java211
-rw-r--r--src/main/java/com/lowagie/text/html/HtmlParser.java206
-rw-r--r--src/main/java/com/lowagie/text/html/HtmlPeer.java112
-rw-r--r--src/main/java/com/lowagie/text/html/HtmlTagMap.java296
-rw-r--r--src/main/java/com/lowagie/text/html/HtmlTags.java331
-rw-r--r--src/main/java/com/lowagie/text/html/HtmlWriter.java1094
-rw-r--r--src/main/java/com/lowagie/text/html/SAXmyHtmlHandler.java293
-rw-r--r--src/main/java/com/lowagie/text/html/simpleparser/ALink.java57
-rw-r--r--src/main/java/com/lowagie/text/html/simpleparser/ChainedProperties.java127
-rw-r--r--src/main/java/com/lowagie/text/html/simpleparser/FactoryProperties.java244
-rw-r--r--src/main/java/com/lowagie/text/html/simpleparser/HTMLWorker.java623
-rw-r--r--src/main/java/com/lowagie/text/html/simpleparser/Img.java60
-rw-r--r--src/main/java/com/lowagie/text/html/simpleparser/IncCell.java124
-rw-r--r--src/main/java/com/lowagie/text/html/simpleparser/IncTable.java121
-rw-r--r--src/main/java/com/lowagie/text/html/simpleparser/StyleSheet.java112
-rw-r--r--src/main/java/com/lowagie/text/markup/MarkupParser.java736
-rw-r--r--src/main/java/com/lowagie/text/markup/MarkupTags.java266
-rw-r--r--src/main/java/com/lowagie/text/markup/WebColors.java246
-rw-r--r--src/main/java/com/lowagie/text/pdf/AcroFields.java1883
-rw-r--r--src/main/java/com/lowagie/text/pdf/ArabicLigaturizer.java771
-rw-r--r--src/main/java/com/lowagie/text/pdf/AsianFontMapper.java103
-rw-r--r--src/main/java/com/lowagie/text/pdf/BadPdfFormatException.java85
-rw-r--r--src/main/java/com/lowagie/text/pdf/Barcode.java477
-rw-r--r--src/main/java/com/lowagie/text/pdf/Barcode128.java825
-rw-r--r--src/main/java/com/lowagie/text/pdf/Barcode39.java392
-rw-r--r--src/main/java/com/lowagie/text/pdf/BarcodeCodabar.java345
-rw-r--r--src/main/java/com/lowagie/text/pdf/BarcodeEAN.java718
-rw-r--r--src/main/java/com/lowagie/text/pdf/BarcodeEANSUPP.java153
-rw-r--r--src/main/java/com/lowagie/text/pdf/BarcodeInter25.java338
-rw-r--r--src/main/java/com/lowagie/text/pdf/BarcodePDF417.java1604
-rw-r--r--src/main/java/com/lowagie/text/pdf/BarcodePostnet.java233
-rw-r--r--src/main/java/com/lowagie/text/pdf/BaseField.java665
-rw-r--r--src/main/java/com/lowagie/text/pdf/BaseFont.java1137
-rw-r--r--src/main/java/com/lowagie/text/pdf/BidiLine.java915
-rw-r--r--src/main/java/com/lowagie/text/pdf/BidiOrder.java1240
-rw-r--r--src/main/java/com/lowagie/text/pdf/ByteBuffer.java623
-rw-r--r--src/main/java/com/lowagie/text/pdf/CFFFont.java1184
-rw-r--r--src/main/java/com/lowagie/text/pdf/CFFFontSubset.java1633
-rw-r--r--src/main/java/com/lowagie/text/pdf/CJKFont.java626
-rw-r--r--src/main/java/com/lowagie/text/pdf/CMYKColor.java129
-rw-r--r--src/main/java/com/lowagie/text/pdf/ColorDetails.java101
-rw-r--r--src/main/java/com/lowagie/text/pdf/ColumnText.java1520
-rw-r--r--src/main/java/com/lowagie/text/pdf/DefaultFontMapper.java308
-rw-r--r--src/main/java/com/lowagie/text/pdf/DocumentFont.java599
-rw-r--r--src/main/java/com/lowagie/text/pdf/EnumerateTTC.java118
-rw-r--r--src/main/java/com/lowagie/text/pdf/ExtendedColor.java122
-rw-r--r--src/main/java/com/lowagie/text/pdf/ExtraEncoding.java74
-rw-r--r--src/main/java/com/lowagie/text/pdf/FdfReader.java214
-rw-r--r--src/main/java/com/lowagie/text/pdf/FdfWriter.java333
-rw-r--r--src/main/java/com/lowagie/text/pdf/FontDetails.java275
-rw-r--r--src/main/java/com/lowagie/text/pdf/FontMapper.java80
-rw-r--r--src/main/java/com/lowagie/text/pdf/FontSelector.java124
-rw-r--r--src/main/java/com/lowagie/text/pdf/GlyphList.java2200
-rw-r--r--src/main/java/com/lowagie/text/pdf/GrayColor.java85
-rw-r--r--src/main/java/com/lowagie/text/pdf/HyphenationAuto.java125
-rw-r--r--src/main/java/com/lowagie/text/pdf/HyphenationEvent.java78
-rw-r--r--src/main/java/com/lowagie/text/pdf/IntHashtable.java338
-rw-r--r--src/main/java/com/lowagie/text/pdf/LZWDecoder.java231
-rw-r--r--src/main/java/com/lowagie/text/pdf/MultiColumnText.java575
-rw-r--r--src/main/java/com/lowagie/text/pdf/OutputStreamCounter.java170
-rw-r--r--src/main/java/com/lowagie/text/pdf/PRAcroForm.java210
-rw-r--r--src/main/java/com/lowagie/text/pdf/PRIndirectReference.java103
-rw-r--r--src/main/java/com/lowagie/text/pdf/PRStream.java229
-rw-r--r--src/main/java/com/lowagie/text/pdf/PRTokeniser.java585
-rw-r--r--src/main/java/com/lowagie/text/pdf/PageResources.java187
-rw-r--r--src/main/java/com/lowagie/text/pdf/PatternColor.java79
-rw-r--r--src/main/java/com/lowagie/text/pdf/PdfAcroForm.java744
-rw-r--r--src/main/java/com/lowagie/text/pdf/PdfAction.java558
-rw-r--r--src/main/java/com/lowagie/text/pdf/PdfAnnotation.java742
-rw-r--r--src/main/java/com/lowagie/text/pdf/PdfAppearance.java155
-rw-r--r--src/main/java/com/lowagie/text/pdf/PdfArray.java227
-rw-r--r--src/main/java/com/lowagie/text/pdf/PdfBoolean.java134
-rw-r--r--src/main/java/com/lowagie/text/pdf/PdfBorderArray.java82
-rw-r--r--src/main/java/com/lowagie/text/pdf/PdfBorderDictionary.java100
-rw-r--r--src/main/java/com/lowagie/text/pdf/PdfCell.java890
-rw-r--r--src/main/java/com/lowagie/text/pdf/PdfChunk.java781
-rw-r--r--src/main/java/com/lowagie/text/pdf/PdfColor.java80
-rw-r--r--src/main/java/com/lowagie/text/pdf/PdfContentByte.java3053
-rw-r--r--src/main/java/com/lowagie/text/pdf/PdfContentParser.java204
-rw-r--r--src/main/java/com/lowagie/text/pdf/PdfContents.java147
-rw-r--r--src/main/java/com/lowagie/text/pdf/PdfCopy.java474
-rw-r--r--src/main/java/com/lowagie/text/pdf/PdfCopyFields.java208
-rw-r--r--src/main/java/com/lowagie/text/pdf/PdfCopyFieldsImp.java639
-rw-r--r--src/main/java/com/lowagie/text/pdf/PdfDashPattern.java144
-rw-r--r--src/main/java/com/lowagie/text/pdf/PdfDate.java210
-rw-r--r--src/main/java/com/lowagie/text/pdf/PdfDestination.java221
-rw-r--r--src/main/java/com/lowagie/text/pdf/PdfDictionary.java339
-rw-r--r--src/main/java/com/lowagie/text/pdf/PdfDocument.java3279
-rw-r--r--src/main/java/com/lowagie/text/pdf/PdfEncodings.java716
-rw-r--r--src/main/java/com/lowagie/text/pdf/PdfEncryption.java390
-rw-r--r--src/main/java/com/lowagie/text/pdf/PdfEncryptionStream.java85
-rw-r--r--src/main/java/com/lowagie/text/pdf/PdfEncryptor.java176
-rw-r--r--src/main/java/com/lowagie/text/pdf/PdfException.java86
-rw-r--r--src/main/java/com/lowagie/text/pdf/PdfFileSpecification.java194
-rw-r--r--src/main/java/com/lowagie/text/pdf/PdfFont.java188
-rw-r--r--src/main/java/com/lowagie/text/pdf/PdfFormField.java347
-rw-r--r--src/main/java/com/lowagie/text/pdf/PdfFormXObject.java103
-rw-r--r--src/main/java/com/lowagie/text/pdf/PdfFunction.java142
-rw-r--r--src/main/java/com/lowagie/text/pdf/PdfGState.java144
-rw-r--r--src/main/java/com/lowagie/text/pdf/PdfGraphics2D.java1450
-rw-r--r--src/main/java/com/lowagie/text/pdf/PdfICCBased.java86
-rw-r--r--src/main/java/com/lowagie/text/pdf/PdfImage.java279
-rw-r--r--src/main/java/com/lowagie/text/pdf/PdfImportedPage.java149
-rw-r--r--src/main/java/com/lowagie/text/pdf/PdfIndirectObject.java170
-rw-r--r--src/main/java/com/lowagie/text/pdf/PdfIndirectReference.java133
-rw-r--r--src/main/java/com/lowagie/text/pdf/PdfLayer.java302
-rw-r--r--src/main/java/com/lowagie/text/pdf/PdfLayerMembership.java139
-rw-r--r--src/main/java/com/lowagie/text/pdf/PdfLine.java477
-rw-r--r--src/main/java/com/lowagie/text/pdf/PdfLister.java187
-rw-r--r--src/main/java/com/lowagie/text/pdf/PdfLiteral.java111
-rw-r--r--src/main/java/com/lowagie/text/pdf/PdfMediaClipData.java63
-rw-r--r--src/main/java/com/lowagie/text/pdf/PdfName.java1141
-rw-r--r--src/main/java/com/lowagie/text/pdf/PdfNameTree.java165
-rw-r--r--src/main/java/com/lowagie/text/pdf/PdfNull.java87
-rw-r--r--src/main/java/com/lowagie/text/pdf/PdfNumber.java159
-rw-r--r--src/main/java/com/lowagie/text/pdf/PdfNumberTree.java159
-rw-r--r--src/main/java/com/lowagie/text/pdf/PdfOCG.java67
-rw-r--r--src/main/java/com/lowagie/text/pdf/PdfOCProperties.java59
-rw-r--r--src/main/java/com/lowagie/text/pdf/PdfObject.java369
-rw-r--r--src/main/java/com/lowagie/text/pdf/PdfOutline.java542
-rw-r--r--src/main/java/com/lowagie/text/pdf/PdfPCell.java735
-rw-r--r--src/main/java/com/lowagie/text/pdf/PdfPCellEvent.java74
-rw-r--r--src/main/java/com/lowagie/text/pdf/PdfPKCS7.java1276
-rw-r--r--src/main/java/com/lowagie/text/pdf/PdfPRow.java659
-rw-r--r--src/main/java/com/lowagie/text/pdf/PdfPSXObject.java99
-rw-r--r--src/main/java/com/lowagie/text/pdf/PdfPTable.java1081
-rw-r--r--src/main/java/com/lowagie/text/pdf/PdfPTableEvent.java94
-rw-r--r--src/main/java/com/lowagie/text/pdf/PdfPage.java197
-rw-r--r--src/main/java/com/lowagie/text/pdf/PdfPageElement.java78
-rw-r--r--src/main/java/com/lowagie/text/pdf/PdfPageEvent.java190
-rw-r--r--src/main/java/com/lowagie/text/pdf/PdfPageEventHelper.java202
-rw-r--r--src/main/java/com/lowagie/text/pdf/PdfPageLabels.java191
-rw-r--r--src/main/java/com/lowagie/text/pdf/PdfPages.java205
-rw-r--r--src/main/java/com/lowagie/text/pdf/PdfPattern.java83
-rw-r--r--src/main/java/com/lowagie/text/pdf/PdfPatternPainter.java391
-rw-r--r--src/main/java/com/lowagie/text/pdf/PdfPrinterGraphics2D.java73
-rw-r--r--src/main/java/com/lowagie/text/pdf/PdfReader.java3172
-rw-r--r--src/main/java/com/lowagie/text/pdf/PdfReaderInstance.java182
-rw-r--r--src/main/java/com/lowagie/text/pdf/PdfRectangle.java284
-rw-r--r--src/main/java/com/lowagie/text/pdf/PdfRendition.java61
-rw-r--r--src/main/java/com/lowagie/text/pdf/PdfResources.java91
-rw-r--r--src/main/java/com/lowagie/text/pdf/PdfShading.java261
-rw-r--r--src/main/java/com/lowagie/text/pdf/PdfShadingPattern.java119
-rw-r--r--src/main/java/com/lowagie/text/pdf/PdfSigGenericPKCS.java230
-rw-r--r--src/main/java/com/lowagie/text/pdf/PdfSignature.java97
-rw-r--r--src/main/java/com/lowagie/text/pdf/PdfSignatureAppearance.java1349
-rw-r--r--src/main/java/com/lowagie/text/pdf/PdfSpotColor.java132
-rw-r--r--src/main/java/com/lowagie/text/pdf/PdfStamper.java667
-rw-r--r--src/main/java/com/lowagie/text/pdf/PdfStamperImp.java1461
-rw-r--r--src/main/java/com/lowagie/text/pdf/PdfStream.java313
-rw-r--r--src/main/java/com/lowagie/text/pdf/PdfString.java236
-rw-r--r--src/main/java/com/lowagie/text/pdf/PdfStructureElement.java130
-rw-r--r--src/main/java/com/lowagie/text/pdf/PdfStructureTreeRoot.java146
-rw-r--r--src/main/java/com/lowagie/text/pdf/PdfTable.java316
-rw-r--r--src/main/java/com/lowagie/text/pdf/PdfTemplate.java267
-rw-r--r--src/main/java/com/lowagie/text/pdf/PdfTextArray.java99
-rw-r--r--src/main/java/com/lowagie/text/pdf/PdfTransition.java253
-rw-r--r--src/main/java/com/lowagie/text/pdf/PdfTransparencyGroup.java85
-rw-r--r--src/main/java/com/lowagie/text/pdf/PdfWriter.java2752
-rw-r--r--src/main/java/com/lowagie/text/pdf/PdfXConformanceException.java70
-rw-r--r--src/main/java/com/lowagie/text/pdf/Pfm2afm.java773
-rw-r--r--src/main/java/com/lowagie/text/pdf/PushbuttonField.java601
-rw-r--r--src/main/java/com/lowagie/text/pdf/RadioCheckField.java416
-rw-r--r--src/main/java/com/lowagie/text/pdf/RandomAccessFileOrArray.java609
-rw-r--r--src/main/java/com/lowagie/text/pdf/SequenceList.java317
-rw-r--r--src/main/java/com/lowagie/text/pdf/ShadingColor.java83
-rw-r--r--src/main/java/com/lowagie/text/pdf/SimpleBookmark.java745
-rw-r--r--src/main/java/com/lowagie/text/pdf/SimpleNamedDestination.java335
-rw-r--r--src/main/java/com/lowagie/text/pdf/SimpleXMLDocHandler.java80
-rw-r--r--src/main/java/com/lowagie/text/pdf/SimpleXMLDocHandlerComment.java59
-rw-r--r--src/main/java/com/lowagie/text/pdf/SimpleXMLParser.java1177
-rw-r--r--src/main/java/com/lowagie/text/pdf/SpotColor.java90
-rw-r--r--src/main/java/com/lowagie/text/pdf/StampContent.java81
-rw-r--r--src/main/java/com/lowagie/text/pdf/TextField.java661
-rw-r--r--src/main/java/com/lowagie/text/pdf/TrueTypeFont.java1377
-rw-r--r--src/main/java/com/lowagie/text/pdf/TrueTypeFontSubSet.java428
-rw-r--r--src/main/java/com/lowagie/text/pdf/TrueTypeFontUnicode.java456
-rw-r--r--src/main/java/com/lowagie/text/pdf/Type1Font.java807
-rw-r--r--src/main/java/com/lowagie/text/pdf/Type3Font.java306
-rw-r--r--src/main/java/com/lowagie/text/pdf/Type3Glyph.java94
-rw-r--r--src/main/java/com/lowagie/text/pdf/VerticalText.java349
-rw-r--r--src/main/java/com/lowagie/text/pdf/XfdfReader.java208
-rw-r--r--src/main/java/com/lowagie/text/pdf/codec/BmpImage.java1282
-rw-r--r--src/main/java/com/lowagie/text/pdf/codec/CCITTG4Encoder.java600
-rw-r--r--src/main/java/com/lowagie/text/pdf/codec/GifImage.java593
-rw-r--r--src/main/java/com/lowagie/text/pdf/codec/PngImage.java987
-rw-r--r--src/main/java/com/lowagie/text/pdf/codec/TIFFConstants.java296
-rw-r--r--src/main/java/com/lowagie/text/pdf/codec/TIFFDirectory.java656
-rw-r--r--src/main/java/com/lowagie/text/pdf/codec/TIFFFaxDecoder.java1477
-rw-r--r--src/main/java/com/lowagie/text/pdf/codec/TIFFField.java472
-rw-r--r--src/main/java/com/lowagie/text/pdf/codec/TIFFLZWDecoder.java255
-rw-r--r--src/main/java/com/lowagie/text/pdf/codec/TiffImage.java522
-rw-r--r--src/main/java/com/lowagie/text/pdf/codec/postscript/JavaCharStream.java547
-rw-r--r--src/main/java/com/lowagie/text/pdf/codec/postscript/MetaDoPS.java98
-rw-r--r--src/main/java/com/lowagie/text/pdf/codec/postscript/PACommand.java19
-rw-r--r--src/main/java/com/lowagie/text/pdf/codec/postscript/PAContext.java2772
-rw-r--r--src/main/java/com/lowagie/text/pdf/codec/postscript/PAEngine.java155
-rw-r--r--src/main/java/com/lowagie/text/pdf/codec/postscript/PAParser.java351
-rw-r--r--src/main/java/com/lowagie/text/pdf/codec/postscript/PAParserConstants.java60
-rw-r--r--src/main/java/com/lowagie/text/pdf/codec/postscript/PAParserTokenManager.java1011
-rw-r--r--src/main/java/com/lowagie/text/pdf/codec/postscript/PAPencil.java431
-rw-r--r--src/main/java/com/lowagie/text/pdf/codec/postscript/PAToken.java66
-rw-r--r--src/main/java/com/lowagie/text/pdf/codec/postscript/PainterException.java20
-rw-r--r--src/main/java/com/lowagie/text/pdf/codec/postscript/ParseException.java192
-rw-r--r--src/main/java/com/lowagie/text/pdf/codec/postscript/Token.java81
-rw-r--r--src/main/java/com/lowagie/text/pdf/codec/postscript/TokenMgrError.java133
-rw-r--r--src/main/java/com/lowagie/text/pdf/codec/wmf/InputMeta.java112
-rw-r--r--src/main/java/com/lowagie/text/pdf/codec/wmf/MetaBrush.java94
-rw-r--r--src/main/java/com/lowagie/text/pdf/codec/wmf/MetaDo.java760
-rw-r--r--src/main/java/com/lowagie/text/pdf/codec/wmf/MetaFont.java211
-rw-r--r--src/main/java/com/lowagie/text/pdf/codec/wmf/MetaObject.java71
-rw-r--r--src/main/java/com/lowagie/text/pdf/codec/wmf/MetaPen.java91
-rw-r--r--src/main/java/com/lowagie/text/pdf/codec/wmf/MetaState.java372
-rw-r--r--src/main/java/com/lowagie/text/pdf/events/FieldPositioningEvents.java186
-rw-r--r--src/main/java/com/lowagie/text/pdf/events/IndexEvents.java401
-rw-r--r--src/main/java/com/lowagie/text/pdf/events/PdfPCellEventForwarder.java91
-rw-r--r--src/main/java/com/lowagie/text/pdf/events/PdfPTableEventForwarder.java90
-rw-r--r--src/main/java/com/lowagie/text/pdf/events/PdfPageEventForwarder.java312
-rw-r--r--src/main/java/com/lowagie/text/pdf/fonts/FontsResourceAnchor.java62
-rw-r--r--src/main/java/com/lowagie/text/pdf/hyphenation/ByteVector.java124
-rw-r--r--src/main/java/com/lowagie/text/pdf/hyphenation/CharVector.java134
-rw-r--r--src/main/java/com/lowagie/text/pdf/hyphenation/Hyphen.java68
-rw-r--r--src/main/java/com/lowagie/text/pdf/hyphenation/Hyphenation.java83
-rw-r--r--src/main/java/com/lowagie/text/pdf/hyphenation/HyphenationException.java28
-rw-r--r--src/main/java/com/lowagie/text/pdf/hyphenation/HyphenationTree.java454
-rw-r--r--src/main/java/com/lowagie/text/pdf/hyphenation/Hyphenator.java240
-rw-r--r--src/main/java/com/lowagie/text/pdf/hyphenation/PatternConsumer.java55
-rw-r--r--src/main/java/com/lowagie/text/pdf/hyphenation/SimplePatternParser.java278
-rw-r--r--src/main/java/com/lowagie/text/pdf/hyphenation/TernaryTree.java667
-rw-r--r--src/main/java/com/lowagie/text/rtf/AbstractRtfField.java358
-rw-r--r--src/main/java/com/lowagie/text/rtf/GenericRtfField.java139
-rw-r--r--src/main/java/com/lowagie/text/rtf/RtfAddableElement.java127
-rw-r--r--src/main/java/com/lowagie/text/rtf/RtfBasicElement.java110
-rw-r--r--src/main/java/com/lowagie/text/rtf/RtfCell.java549
-rw-r--r--src/main/java/com/lowagie/text/rtf/RtfElement.java149
-rw-r--r--src/main/java/com/lowagie/text/rtf/RtfExtendedElement.java65
-rw-r--r--src/main/java/com/lowagie/text/rtf/RtfField.java84
-rw-r--r--src/main/java/com/lowagie/text/rtf/RtfFont.java162
-rw-r--r--src/main/java/com/lowagie/text/rtf/RtfHeaderFooter.java114
-rw-r--r--src/main/java/com/lowagie/text/rtf/RtfHeaderFooters.java160
-rw-r--r--src/main/java/com/lowagie/text/rtf/RtfMapper.java182
-rw-r--r--src/main/java/com/lowagie/text/rtf/RtfPageNumber.java105
-rw-r--r--src/main/java/com/lowagie/text/rtf/RtfRow.java443
-rw-r--r--src/main/java/com/lowagie/text/rtf/RtfTOC.java187
-rw-r--r--src/main/java/com/lowagie/text/rtf/RtfTOCEntry.java174
-rw-r--r--src/main/java/com/lowagie/text/rtf/RtfTable.java201
-rw-r--r--src/main/java/com/lowagie/text/rtf/RtfTableCell.java392
-rw-r--r--src/main/java/com/lowagie/text/rtf/RtfWriter.java2299
-rw-r--r--src/main/java/com/lowagie/text/rtf/RtfWriter2.java268
-rw-r--r--src/main/java/com/lowagie/text/rtf/document/RtfCodePage.java102
-rw-r--r--src/main/java/com/lowagie/text/rtf/document/RtfDocument.java301
-rw-r--r--src/main/java/com/lowagie/text/rtf/document/RtfDocumentHeader.java310
-rw-r--r--src/main/java/com/lowagie/text/rtf/document/RtfDocumentSettings.java182
-rw-r--r--src/main/java/com/lowagie/text/rtf/document/RtfInfoElement.java181
-rw-r--r--src/main/java/com/lowagie/text/rtf/document/RtfInfoGroup.java117
-rw-r--r--src/main/java/com/lowagie/text/rtf/document/RtfPageSetting.java435
-rw-r--r--src/main/java/com/lowagie/text/rtf/document/output/RtfDataCache.java86
-rw-r--r--src/main/java/com/lowagie/text/rtf/document/output/RtfDiskCache.java113
-rw-r--r--src/main/java/com/lowagie/text/rtf/document/output/RtfMemoryCache.java93
-rw-r--r--src/main/java/com/lowagie/text/rtf/field/RtfAnchor.java122
-rw-r--r--src/main/java/com/lowagie/text/rtf/field/RtfField.java445
-rw-r--r--src/main/java/com/lowagie/text/rtf/field/RtfPageNumber.java83
-rw-r--r--src/main/java/com/lowagie/text/rtf/field/RtfTOCEntry.java163
-rw-r--r--src/main/java/com/lowagie/text/rtf/field/RtfTableOfContents.java109
-rw-r--r--src/main/java/com/lowagie/text/rtf/field/RtfTotalPageNumber.java128
-rw-r--r--src/main/java/com/lowagie/text/rtf/graphic/RtfImage.java306
-rw-r--r--src/main/java/com/lowagie/text/rtf/headerfooter/RtfHeaderFooter.java326
-rw-r--r--src/main/java/com/lowagie/text/rtf/headerfooter/RtfHeaderFooterGroup.java393
-rw-r--r--src/main/java/com/lowagie/text/rtf/list/RtfList.java605
-rw-r--r--src/main/java/com/lowagie/text/rtf/list/RtfListItem.java182
-rw-r--r--src/main/java/com/lowagie/text/rtf/list/RtfListTable.java202
-rw-r--r--src/main/java/com/lowagie/text/rtf/style/RtfColor.java302
-rw-r--r--src/main/java/com/lowagie/text/rtf/style/RtfColorList.java137
-rw-r--r--src/main/java/com/lowagie/text/rtf/style/RtfFont.java681
-rw-r--r--src/main/java/com/lowagie/text/rtf/style/RtfFontList.java149
-rw-r--r--src/main/java/com/lowagie/text/rtf/style/RtfParagraphStyle.java665
-rw-r--r--src/main/java/com/lowagie/text/rtf/style/RtfStylesheetList.java121
-rw-r--r--src/main/java/com/lowagie/text/rtf/table/RtfBorder.java577
-rw-r--r--src/main/java/com/lowagie/text/rtf/table/RtfBorderGroup.java232
-rw-r--r--src/main/java/com/lowagie/text/rtf/table/RtfCell.java534
-rw-r--r--src/main/java/com/lowagie/text/rtf/table/RtfRow.java377
-rw-r--r--src/main/java/com/lowagie/text/rtf/table/RtfTable.java271
-rw-r--r--src/main/java/com/lowagie/text/rtf/text/RtfAnnotation.java133
-rw-r--r--src/main/java/com/lowagie/text/rtf/text/RtfChapter.java105
-rw-r--r--src/main/java/com/lowagie/text/rtf/text/RtfChunk.java202
-rw-r--r--src/main/java/com/lowagie/text/rtf/text/RtfNewPage.java53
-rw-r--r--src/main/java/com/lowagie/text/rtf/text/RtfParagraph.java211
-rw-r--r--src/main/java/com/lowagie/text/rtf/text/RtfPhrase.java203
-rw-r--r--src/main/java/com/lowagie/text/rtf/text/RtfSection.java201
-rw-r--r--src/main/java/com/lowagie/text/rtf/text/RtfTab.java140
-rw-r--r--src/main/java/com/lowagie/text/rtf/text/RtfTabGroup.java127
-rw-r--r--src/main/java/com/lowagie/text/xml/SAXiTextHandler.java921
-rw-r--r--src/main/java/com/lowagie/text/xml/SAXmyHandler.java128
-rw-r--r--src/main/java/com/lowagie/text/xml/TagMap.java213
-rw-r--r--src/main/java/com/lowagie/text/xml/XmlParser.java379
-rw-r--r--src/main/java/com/lowagie/text/xml/XmlPeer.java182
-rw-r--r--src/main/java/com/lowagie/text/xml/XmlToHtml.java144
-rw-r--r--src/main/java/com/lowagie/text/xml/XmlToPdf.java144
-rw-r--r--src/main/java/com/lowagie/text/xml/XmlToRtf.java144
-rw-r--r--src/main/java/com/lowagie/text/xml/XmlToXXX.java147
-rw-r--r--src/main/java/com/lowagie/text/xml/XmlWriter.java893
-rw-r--r--src/main/java/com/lowagie/text/xml/xmp/DublinCoreSchema.java187
-rw-r--r--src/main/java/com/lowagie/text/xml/xmp/PdfSchema.java105
-rw-r--r--src/main/java/com/lowagie/text/xml/xmp/XmpArray.java99
-rw-r--r--src/main/java/com/lowagie/text/xml/xmp/XmpBasicSchema.java141
-rw-r--r--src/main/java/com/lowagie/text/xml/xmp/XmpMMSchema.java97
-rw-r--r--src/main/java/com/lowagie/text/xml/xmp/XmpSchema.java158
-rw-r--r--src/main/java/com/lowagie/text/xml/xmp/XmpWriter.java276
-rw-r--r--src/main/java/com/lowagie/tools/BuildTutorial.java156
-rw-r--r--src/main/java/com/lowagie/tools/CvsLogParser.java138
-rw-r--r--src/main/java/com/lowagie/tools/Executable.java322
-rw-r--r--src/main/java/com/lowagie/tools/LPR.java716
-rw-r--r--src/main/java/com/lowagie/tools/SwingWorker.java127
-rw-r--r--src/main/java/com/lowagie/tools/ToolMenuItems.java84
-rw-r--r--src/main/java/com/lowagie/tools/Toolbox.java354
-rw-r--r--src/main/java/com/lowagie/tools/Versions.java143
-rw-r--r--src/main/java/com/lowagie/tools/arguments/BitsetArgument.java136
-rw-r--r--src/main/java/com/lowagie/tools/arguments/DirFilter.java65
-rw-r--r--src/main/java/com/lowagie/tools/arguments/FileArgument.java165
-rw-r--r--src/main/java/com/lowagie/tools/arguments/ImageArgument.java117
-rw-r--r--src/main/java/com/lowagie/tools/arguments/ImageFilter.java135
-rw-r--r--src/main/java/com/lowagie/tools/arguments/LabelAccessory.java158
-rw-r--r--src/main/java/com/lowagie/tools/arguments/OptionArgument.java210
-rw-r--r--src/main/java/com/lowagie/tools/arguments/PageSelectionTableDialog.java243
-rw-r--r--src/main/java/com/lowagie/tools/arguments/PageSelectorToolArgument.java112
-rw-r--r--src/main/java/com/lowagie/tools/arguments/PageSizeArgument.java172
-rw-r--r--src/main/java/com/lowagie/tools/arguments/PageTableModel.java146
-rw-r--r--src/main/java/com/lowagie/tools/arguments/PdfFilter.java77
-rw-r--r--src/main/java/com/lowagie/tools/arguments/TableMap.java89
-rw-r--r--src/main/java/com/lowagie/tools/arguments/TableSorter.java367
-rw-r--r--src/main/java/com/lowagie/tools/arguments/ToolArgument.java281
-rw-r--r--src/main/java/com/lowagie/tools/concat_pdf.java96
-rw-r--r--src/main/java/com/lowagie/tools/encrypt_pdf.java99
-rw-r--r--src/main/java/com/lowagie/tools/handout_pdf.java122
-rw-r--r--src/main/java/com/lowagie/tools/plugins/AbstractTool.java341
-rw-r--r--src/main/java/com/lowagie/tools/plugins/Bookmarks2XML.java148
-rw-r--r--src/main/java/com/lowagie/tools/plugins/Burst.java140
-rw-r--r--src/main/java/com/lowagie/tools/plugins/Concat.java185
-rw-r--r--src/main/java/com/lowagie/tools/plugins/Decrypt.java148
-rw-r--r--src/main/java/com/lowagie/tools/plugins/DvdCover.java201
-rw-r--r--src/main/java/com/lowagie/tools/plugins/Encrypt.java193
-rw-r--r--src/main/java/com/lowagie/tools/plugins/ExtractAttachments.java227
-rw-r--r--src/main/java/com/lowagie/tools/plugins/Handouts.java232
-rw-r--r--src/main/java/com/lowagie/tools/plugins/HtmlBookmarks.java288
-rw-r--r--src/main/java/com/lowagie/tools/plugins/ImageXRefViewer.java256
-rw-r--r--src/main/java/com/lowagie/tools/plugins/InspectPDF.java173
-rw-r--r--src/main/java/com/lowagie/tools/plugins/KnitTiff.java178
-rw-r--r--src/main/java/com/lowagie/tools/plugins/LPRClient.java245
-rw-r--r--src/main/java/com/lowagie/tools/plugins/NUp.java165
-rw-r--r--src/main/java/com/lowagie/tools/plugins/PhotoAlbum.java200
-rw-r--r--src/main/java/com/lowagie/tools/plugins/RemoveLaunchApplication.java189
-rw-r--r--src/main/java/com/lowagie/tools/plugins/ReversePages.java180
-rw-r--r--src/main/java/com/lowagie/tools/plugins/SelectedPages.java150
-rw-r--r--src/main/java/com/lowagie/tools/plugins/Split.java168
-rw-r--r--src/main/java/com/lowagie/tools/plugins/Tiff2Pdf.java192
-rw-r--r--src/main/java/com/lowagie/tools/plugins/TreeViewPDF.java160
-rw-r--r--src/main/java/com/lowagie/tools/plugins/Txt2Pdf.java169
-rw-r--r--src/main/java/com/lowagie/tools/plugins/Watermarker.java163
-rw-r--r--src/main/java/com/lowagie/tools/plugins/XML2Bookmarks.java156
-rw-r--r--src/main/java/com/lowagie/tools/plugins/treeview/AnalyzePDF.java507
-rw-r--r--src/main/java/com/lowagie/tools/plugins/treeview/ArrayTreeNode.java107
-rw-r--r--src/main/java/com/lowagie/tools/plugins/treeview/DictionaryTreeNode.java112
-rw-r--r--src/main/java/com/lowagie/tools/plugins/treeview/FileTreeNode.java86
-rw-r--r--src/main/java/com/lowagie/tools/plugins/treeview/ICommonAnalyzer.java79
-rw-r--r--src/main/java/com/lowagie/tools/plugins/treeview/IUpdatenodeview.java59
-rw-r--r--src/main/java/com/lowagie/tools/plugins/treeview/OutlinelistTreeNode.java98
-rw-r--r--src/main/java/com/lowagie/tools/plugins/treeview/PagelistTreeNode.java87
-rw-r--r--src/main/java/com/lowagie/tools/plugins/treeview/Pagetreenode.java208
-rw-r--r--src/main/java/com/lowagie/tools/plugins/treeview/ProgressDialog.java124
-rw-r--r--src/main/java/com/lowagie/tools/plugins/treeview/SimpletextTreeNode.java69
-rw-r--r--src/main/java/com/lowagie/tools/plugins/treeview/TextpaneTreeNode.java91
-rw-r--r--src/main/java/com/lowagie/tools/plugins/treeview/TreeViewInternalFrame.java272
-rw-r--r--src/main/java/com/lowagie/tools/plugins/treeview/UpdateableTreeNode.java74
-rw-r--r--src/main/java/com/lowagie/tools/split_pdf.java103
-rw-r--r--src/main/java/org/pdfbox/Decrypt.java122
-rw-r--r--src/main/java/org/pdfbox/Encrypt.java234
-rw-r--r--src/main/java/org/pdfbox/ExportFDF.java155
-rw-r--r--src/main/java/org/pdfbox/ExportXFDF.java155
-rw-r--r--src/main/java/org/pdfbox/ExtractImages.java210
-rw-r--r--src/main/java/org/pdfbox/ExtractText.java270
-rw-r--r--src/main/java/org/pdfbox/ImportFDF.java156
-rw-r--r--src/main/java/org/pdfbox/ImportXFDF.java157
-rw-r--r--src/main/java/org/pdfbox/Overlay.java530
-rw-r--r--src/main/java/org/pdfbox/PDFDebugger.java420
-rw-r--r--src/main/java/org/pdfbox/PDFReader.java308
-rw-r--r--src/main/java/org/pdfbox/PDFSplit.java227
-rw-r--r--src/main/java/org/pdfbox/PDFToImage.java270
-rw-r--r--src/main/java/org/pdfbox/PrintPDF.java118
-rw-r--r--src/main/java/org/pdfbox/TextToPDF.java259
-rw-r--r--src/main/java/org/pdfbox/Version.java100
-rw-r--r--src/main/java/org/pdfbox/afmparser/AFMParser.java1084
-rw-r--r--src/main/java/org/pdfbox/afmparser/package.html12
-rw-r--r--src/main/java/org/pdfbox/afmtypes/CharMetric.java299
-rw-r--r--src/main/java/org/pdfbox/afmtypes/Composite.java89
-rw-r--r--src/main/java/org/pdfbox/afmtypes/CompositePart.java93
-rw-r--r--src/main/java/org/pdfbox/afmtypes/FontMetric.java891
-rw-r--r--src/main/java/org/pdfbox/afmtypes/KernPair.java110
-rw-r--r--src/main/java/org/pdfbox/afmtypes/Ligature.java76
-rw-r--r--src/main/java/org/pdfbox/afmtypes/TrackKern.java127
-rw-r--r--src/main/java/org/pdfbox/afmtypes/package.html9
-rw-r--r--src/main/java/org/pdfbox/ant/PDFToTextTask.java100
-rw-r--r--src/main/java/org/pdfbox/ant/package.html18
-rw-r--r--src/main/java/org/pdfbox/cmapparser/CMapParser.java285
-rw-r--r--src/main/java/org/pdfbox/cmapparser/package.html9
-rw-r--r--src/main/java/org/pdfbox/cmaptypes/CMap.java161
-rw-r--r--src/main/java/org/pdfbox/cmaptypes/CodespaceRange.java88
-rw-r--r--src/main/java/org/pdfbox/cmaptypes/package.html9
-rw-r--r--src/main/java/org/pdfbox/cos/COSArray.java492
-rw-r--r--src/main/java/org/pdfbox/cos/COSBase.java86
-rw-r--r--src/main/java/org/pdfbox/cos/COSBoolean.java161
-rw-r--r--src/main/java/org/pdfbox/cos/COSDictionary.java1167
-rw-r--r--src/main/java/org/pdfbox/cos/COSDocument.java518
-rw-r--r--src/main/java/org/pdfbox/cos/COSFloat.java173
-rw-r--r--src/main/java/org/pdfbox/cos/COSInteger.java190
-rw-r--r--src/main/java/org/pdfbox/cos/COSName.java572
-rw-r--r--src/main/java/org/pdfbox/cos/COSNull.java88
-rw-r--r--src/main/java/org/pdfbox/cos/COSNumber.java115
-rw-r--r--src/main/java/org/pdfbox/cos/COSObject.java226
-rw-r--r--src/main/java/org/pdfbox/cos/COSStream.java495
-rw-r--r--src/main/java/org/pdfbox/cos/COSString.java403
-rw-r--r--src/main/java/org/pdfbox/cos/ICOSVisitor.java132
-rw-r--r--src/main/java/org/pdfbox/cos/package.html12
-rw-r--r--src/main/java/org/pdfbox/encoding/AFMEncoding.java76
-rw-r--r--src/main/java/org/pdfbox/encoding/DictionaryEncoding.java112
-rw-r--r--src/main/java/org/pdfbox/encoding/Encoding.java268
-rw-r--r--src/main/java/org/pdfbox/encoding/EncodingManager.java87
-rw-r--r--src/main/java/org/pdfbox/encoding/MacRomanEncoding.java267
-rw-r--r--src/main/java/org/pdfbox/encoding/PdfDocEncoding.java289
-rw-r--r--src/main/java/org/pdfbox/encoding/StandardEncoding.java209
-rw-r--r--src/main/java/org/pdfbox/encoding/WinAnsiEncoding.java281
-rw-r--r--src/main/java/org/pdfbox/encoding/package.html9
-rw-r--r--src/main/java/org/pdfbox/encryption/ARCFour.java182
-rw-r--r--src/main/java/org/pdfbox/encryption/DocumentEncryption.java427
-rw-r--r--src/main/java/org/pdfbox/encryption/PDFEncryption.java599
-rw-r--r--src/main/java/org/pdfbox/encryption/package.html9
-rw-r--r--src/main/java/org/pdfbox/examples/AbstractExample.java125
-rw-r--r--src/main/java/org/pdfbox/examples/fdf/PrintFields.java163
-rw-r--r--src/main/java/org/pdfbox/examples/fdf/SetField.java128
-rw-r--r--src/main/java/org/pdfbox/examples/fdf/package.html9
-rw-r--r--src/main/java/org/pdfbox/examples/package.html9
-rw-r--r--src/main/java/org/pdfbox/examples/pdmodel/AddJavascript.java96
-rw-r--r--src/main/java/org/pdfbox/examples/pdmodel/AddMessageToEachPage.java148
-rw-r--r--src/main/java/org/pdfbox/examples/pdmodel/AddMetadataFromDocInfo.java180
-rw-r--r--src/main/java/org/pdfbox/examples/pdmodel/CreateBlankPDF.java123
-rw-r--r--src/main/java/org/pdfbox/examples/pdmodel/CreateBookmarks.java119
-rw-r--r--src/main/java/org/pdfbox/examples/pdmodel/EmbeddedFiles.java170
-rw-r--r--src/main/java/org/pdfbox/examples/pdmodel/HelloWorld.java137
-rw-r--r--src/main/java/org/pdfbox/examples/pdmodel/HelloWorldTTF.java134
-rw-r--r--src/main/java/org/pdfbox/examples/pdmodel/HelloWorldType1AfmPfb.java134
-rw-r--r--src/main/java/org/pdfbox/examples/pdmodel/ImageToPDF.java146
-rw-r--r--src/main/java/org/pdfbox/examples/pdmodel/PrintBookmarks.java142
-rw-r--r--src/main/java/org/pdfbox/examples/pdmodel/PrintDocumentMetaData.java165
-rw-r--r--src/main/java/org/pdfbox/examples/pdmodel/RemoveFirstPage.java98
-rw-r--r--src/main/java/org/pdfbox/examples/pdmodel/ReplaceString.java186
-rw-r--r--src/main/java/org/pdfbox/examples/pdmodel/RubberStamp.java113
-rw-r--r--src/main/java/org/pdfbox/examples/pdmodel/ShowColorBoxes.java135
-rw-r--r--src/main/java/org/pdfbox/examples/pdmodel/package.html9
-rw-r--r--src/main/java/org/pdfbox/examples/persistence/AppendAndFillDoc.java282
-rw-r--r--src/main/java/org/pdfbox/examples/persistence/AppendDoc.java357
-rw-r--r--src/main/java/org/pdfbox/examples/persistence/CopyDoc.java140
-rw-r--r--src/main/java/org/pdfbox/examples/persistence/FieldsDoc.java177
-rw-r--r--src/main/java/org/pdfbox/examples/persistence/WriteDecodedDoc.java151
-rw-r--r--src/main/java/org/pdfbox/examples/persistence/package.html9
-rw-r--r--src/main/java/org/pdfbox/examples/signature/ShowSignature.java168
-rw-r--r--src/main/java/org/pdfbox/examples/signature/package.html9
-rw-r--r--src/main/java/org/pdfbox/examples/util/ExtractTextByArea.java119
-rw-r--r--src/main/java/org/pdfbox/examples/util/PrintTextLocations.java144
-rw-r--r--src/main/java/org/pdfbox/examples/util/package.html9
-rw-r--r--src/main/java/org/pdfbox/exceptions/COSVisitorException.java53
-rw-r--r--src/main/java/org/pdfbox/exceptions/CryptographyException.java82
-rw-r--r--src/main/java/org/pdfbox/exceptions/InvalidPasswordException.java51
-rw-r--r--src/main/java/org/pdfbox/exceptions/OutlineNotLocalException.java55
-rw-r--r--src/main/java/org/pdfbox/exceptions/WrappedException.java75
-rw-r--r--src/main/java/org/pdfbox/exceptions/WrappedIOException.java76
-rw-r--r--src/main/java/org/pdfbox/exceptions/package.html9
-rw-r--r--src/main/java/org/pdfbox/filter/ASCII85Filter.java103
-rw-r--r--src/main/java/org/pdfbox/filter/ASCIIHexFilter.java205
-rw-r--r--src/main/java/org/pdfbox/filter/CCITTFaxDecodeFilter.java735
-rw-r--r--src/main/java/org/pdfbox/filter/DCTFilter.java77
-rw-r--r--src/main/java/org/pdfbox/filter/Filter.java68
-rw-r--r--src/main/java/org/pdfbox/filter/FilterManager.java135
-rw-r--r--src/main/java/org/pdfbox/filter/FlateFilter.java303
-rw-r--r--src/main/java/org/pdfbox/filter/LZWDictionary.java215
-rw-r--r--src/main/java/org/pdfbox/filter/LZWFilter.java235
-rw-r--r--src/main/java/org/pdfbox/filter/LZWNode.java115
-rw-r--r--src/main/java/org/pdfbox/filter/RunLengthDecodeFilter.java126
-rw-r--r--src/main/java/org/pdfbox/filter/package.html9
-rw-r--r--src/main/java/org/pdfbox/io/ASCII85InputStream.java269
-rw-r--r--src/main/java/org/pdfbox/io/ASCII85OutputStream.java304
-rw-r--r--src/main/java/org/pdfbox/io/ByteArrayPushBackInputStream.java404
-rw-r--r--src/main/java/org/pdfbox/io/FastByteArrayOutputStream.java62
-rw-r--r--src/main/java/org/pdfbox/io/NBitInputStream.java124
-rw-r--r--src/main/java/org/pdfbox/io/NBitOutputStream.java116
-rw-r--r--src/main/java/org/pdfbox/io/PushBackInputStream.java92
-rw-r--r--src/main/java/org/pdfbox/io/RandomAccessFileInputStream.java132
-rw-r--r--src/main/java/org/pdfbox/io/RandomAccessFileOutputStream.java145
-rw-r--r--src/main/java/org/pdfbox/io/package.html9
-rw-r--r--src/main/java/org/pdfbox/package.html9
-rw-r--r--src/main/java/org/pdfbox/pdfparser/BaseParser.java1369
-rw-r--r--src/main/java/org/pdfbox/pdfparser/PDFObjectStreamParser.java137
-rw-r--r--src/main/java/org/pdfbox/pdfparser/PDFParser.java557
-rw-r--r--src/main/java/org/pdfbox/pdfparser/PDFStreamParser.java403
-rw-r--r--src/main/java/org/pdfbox/pdfparser/PDFXref.java96
-rw-r--r--src/main/java/org/pdfbox/pdfparser/package.html9
-rw-r--r--src/main/java/org/pdfbox/pdfviewer/ArrayEntry.java83
-rw-r--r--src/main/java/org/pdfbox/pdfviewer/MapEntry.java105
-rw-r--r--src/main/java/org/pdfbox/pdfviewer/PDFPagePanel.java102
-rw-r--r--src/main/java/org/pdfbox/pdfviewer/PDFTreeCellRenderer.java145
-rw-r--r--src/main/java/org/pdfbox/pdfviewer/PDFTreeModel.java332
-rw-r--r--src/main/java/org/pdfbox/pdfviewer/PageDrawer.java268
-rw-r--r--src/main/java/org/pdfbox/pdfviewer/PageWrapper.java118
-rw-r--r--src/main/java/org/pdfbox/pdfviewer/ReaderBottomPanel.java86
-rw-r--r--src/main/java/org/pdfbox/pdfviewer/package.html9
-rw-r--r--src/main/java/org/pdfbox/pdfwriter/COSStandardOutputStream.java180
-rw-r--r--src/main/java/org/pdfbox/pdfwriter/COSWriter.java1091
-rw-r--r--src/main/java/org/pdfbox/pdfwriter/COSWriterXRefEntry.java165
-rw-r--r--src/main/java/org/pdfbox/pdfwriter/ContentStreamWriter.java200
-rw-r--r--src/main/java/org/pdfbox/pdfwriter/package.html9
-rw-r--r--src/main/java/org/pdfbox/pdmodel/PDDestinationNameTreeNode.java90
-rw-r--r--src/main/java/org/pdfbox/pdmodel/PDDocument.java725
-rw-r--r--src/main/java/org/pdfbox/pdmodel/PDDocumentCatalog.java378
-rw-r--r--src/main/java/org/pdfbox/pdmodel/PDDocumentInformation.java297
-rw-r--r--src/main/java/org/pdfbox/pdmodel/PDDocumentNameDictionary.java164
-rw-r--r--src/main/java/org/pdfbox/pdmodel/PDEmbeddedFilesNameTreeNode.java89
-rw-r--r--src/main/java/org/pdfbox/pdmodel/PDPage.java776
-rw-r--r--src/main/java/org/pdfbox/pdmodel/PDPageNode.java459
-rw-r--r--src/main/java/org/pdfbox/pdmodel/PDResources.java313
-rw-r--r--src/main/java/org/pdfbox/pdmodel/common/COSArrayList.java643
-rw-r--r--src/main/java/org/pdfbox/pdmodel/common/COSDictionaryMap.java278
-rw-r--r--src/main/java/org/pdfbox/pdmodel/common/COSObjectable.java49
-rw-r--r--src/main/java/org/pdfbox/pdmodel/common/COSStreamArray.java304
-rw-r--r--src/main/java/org/pdfbox/pdmodel/common/DualCOSObjectable.java56
-rw-r--r--src/main/java/org/pdfbox/pdmodel/common/PDMatrix.java120
-rw-r--r--src/main/java/org/pdfbox/pdmodel/common/PDMemoryStream.java284
-rw-r--r--src/main/java/org/pdfbox/pdmodel/common/PDMetadata.java87
-rw-r--r--src/main/java/org/pdfbox/pdmodel/common/PDNameTreeNode.java337
-rw-r--r--src/main/java/org/pdfbox/pdmodel/common/PDNamedTextStream.java137
-rw-r--r--src/main/java/org/pdfbox/pdmodel/common/PDObjectStream.java151
-rw-r--r--src/main/java/org/pdfbox/pdmodel/common/PDRange.java146
-rw-r--r--src/main/java/org/pdfbox/pdmodel/common/PDRectangle.java295
-rw-r--r--src/main/java/org/pdfbox/pdmodel/common/PDStream.java538
-rw-r--r--src/main/java/org/pdfbox/pdmodel/common/PDTextStream.java180
-rw-r--r--src/main/java/org/pdfbox/pdmodel/common/filespecification/PDComplexFileSpecification.java326
-rw-r--r--src/main/java/org/pdfbox/pdmodel/common/filespecification/PDEmbeddedFile.java298
-rw-r--r--src/main/java/org/pdfbox/pdmodel/common/filespecification/PDFileSpecification.java83
-rw-r--r--src/main/java/org/pdfbox/pdmodel/common/filespecification/PDSimpleFileSpecification.java95
-rw-r--r--src/main/java/org/pdfbox/pdmodel/common/filespecification/package.html9
-rw-r--r--src/main/java/org/pdfbox/pdmodel/common/package.html9
-rw-r--r--src/main/java/org/pdfbox/pdmodel/documentinterchange/logicalstructure/PDMarkInfo.java149
-rw-r--r--src/main/java/org/pdfbox/pdmodel/documentinterchange/logicalstructure/PDStructureElement.java76
-rw-r--r--src/main/java/org/pdfbox/pdmodel/documentinterchange/logicalstructure/package.html10
-rw-r--r--src/main/java/org/pdfbox/pdmodel/documentinterchange/prepress/PDBoxStyle.java222
-rw-r--r--src/main/java/org/pdfbox/pdmodel/documentinterchange/prepress/package.html9
-rw-r--r--src/main/java/org/pdfbox/pdmodel/edit/PDPageContentStream.java648
-rw-r--r--src/main/java/org/pdfbox/pdmodel/edit/package.html9
-rw-r--r--src/main/java/org/pdfbox/pdmodel/encryption/PDEncryptionDictionary.java193
-rw-r--r--src/main/java/org/pdfbox/pdmodel/encryption/PDEncryptionManager.java131
-rw-r--r--src/main/java/org/pdfbox/pdmodel/encryption/PDStandardEncryption.java416
-rw-r--r--src/main/java/org/pdfbox/pdmodel/encryption/package.html9
-rw-r--r--src/main/java/org/pdfbox/pdmodel/fdf/FDFAnnotation.java114
-rw-r--r--src/main/java/org/pdfbox/pdmodel/fdf/FDFCatalog.java195
-rw-r--r--src/main/java/org/pdfbox/pdmodel/fdf/FDFDictionary.java465
-rw-r--r--src/main/java/org/pdfbox/pdmodel/fdf/FDFDocument.java377
-rw-r--r--src/main/java/org/pdfbox/pdmodel/fdf/FDFField.java763
-rw-r--r--src/main/java/org/pdfbox/pdmodel/fdf/FDFIconFit.java227
-rw-r--r--src/main/java/org/pdfbox/pdmodel/fdf/FDFJavaScript.java172
-rw-r--r--src/main/java/org/pdfbox/pdmodel/fdf/FDFNamedPageReference.java128
-rw-r--r--src/main/java/org/pdfbox/pdmodel/fdf/FDFOptionElement.java129
-rw-r--r--src/main/java/org/pdfbox/pdmodel/fdf/FDFPage.java148
-rw-r--r--src/main/java/org/pdfbox/pdmodel/fdf/FDFPageInfo.java85
-rw-r--r--src/main/java/org/pdfbox/pdmodel/fdf/FDFTemplate.java167
-rw-r--r--src/main/java/org/pdfbox/pdmodel/fdf/package.html9
-rw-r--r--src/main/java/org/pdfbox/pdmodel/font/PDCIDFont.java248
-rw-r--r--src/main/java/org/pdfbox/pdmodel/font/PDCIDFontType0Font.java66
-rw-r--r--src/main/java/org/pdfbox/pdmodel/font/PDCIDFontType2Font.java66
-rw-r--r--src/main/java/org/pdfbox/pdmodel/font/PDFont.java863
-rw-r--r--src/main/java/org/pdfbox/pdmodel/font/PDFontDescriptor.java530
-rw-r--r--src/main/java/org/pdfbox/pdmodel/font/PDFontDescriptorAFM.java446
-rw-r--r--src/main/java/org/pdfbox/pdmodel/font/PDFontDescriptorDictionary.java580
-rw-r--r--src/main/java/org/pdfbox/pdmodel/font/PDFontFactory.java108
-rw-r--r--src/main/java/org/pdfbox/pdmodel/font/PDMMType1Font.java62
-rw-r--r--src/main/java/org/pdfbox/pdmodel/font/PDSimpleFont.java239
-rw-r--r--src/main/java/org/pdfbox/pdmodel/font/PDTrueTypeFont.java437
-rw-r--r--src/main/java/org/pdfbox/pdmodel/font/PDType0Font.java129
-rw-r--r--src/main/java/org/pdfbox/pdmodel/font/PDType1AfmPfbFont.java206
-rw-r--r--src/main/java/org/pdfbox/pdmodel/font/PDType1Font.java267
-rw-r--r--src/main/java/org/pdfbox/pdmodel/font/PDType3Font.java152
-rw-r--r--src/main/java/org/pdfbox/pdmodel/font/Type3StreamParser.java607
-rw-r--r--src/main/java/org/pdfbox/pdmodel/font/package.html9
-rw-r--r--src/main/java/org/pdfbox/pdmodel/graphics/PDExtendedGraphicsState.java724
-rw-r--r--src/main/java/org/pdfbox/pdmodel/graphics/PDFontSetting.java133
-rw-r--r--src/main/java/org/pdfbox/pdmodel/graphics/PDGraphicsState.java438
-rw-r--r--src/main/java/org/pdfbox/pdmodel/graphics/PDLineDashPattern.java135
-rw-r--r--src/main/java/org/pdfbox/pdmodel/graphics/color/PDCalGray.java240
-rw-r--r--src/main/java/org/pdfbox/pdmodel/graphics/color/PDCalRGB.java289
-rw-r--r--src/main/java/org/pdfbox/pdmodel/graphics/color/PDColorSpace.java97
-rw-r--r--src/main/java/org/pdfbox/pdmodel/graphics/color/PDColorSpaceFactory.java218
-rw-r--r--src/main/java/org/pdfbox/pdmodel/graphics/color/PDColorSpaceInstance.java130
-rw-r--r--src/main/java/org/pdfbox/pdmodel/graphics/color/PDDeviceCMYK.java137
-rw-r--r--src/main/java/org/pdfbox/pdmodel/graphics/color/PDDeviceGray.java112
-rw-r--r--src/main/java/org/pdfbox/pdmodel/graphics/color/PDDeviceN.java244
-rw-r--r--src/main/java/org/pdfbox/pdmodel/graphics/color/PDDeviceNAttributes.java126
-rw-r--r--src/main/java/org/pdfbox/pdmodel/graphics/color/PDDeviceRGB.java130
-rw-r--r--src/main/java/org/pdfbox/pdmodel/graphics/color/PDGamma.java151
-rw-r--r--src/main/java/org/pdfbox/pdmodel/graphics/color/PDICCBased.java343
-rw-r--r--src/main/java/org/pdfbox/pdmodel/graphics/color/PDIndexed.java271
-rw-r--r--src/main/java/org/pdfbox/pdmodel/graphics/color/PDLab.java300
-rw-r--r--src/main/java/org/pdfbox/pdmodel/graphics/color/PDPattern.java122
-rw-r--r--src/main/java/org/pdfbox/pdmodel/graphics/color/PDSeparation.java198
-rw-r--r--src/main/java/org/pdfbox/pdmodel/graphics/color/PDTristimulus.java155
-rw-r--r--src/main/java/org/pdfbox/pdmodel/graphics/color/package.html9
-rw-r--r--src/main/java/org/pdfbox/pdmodel/graphics/package.html9
-rw-r--r--src/main/java/org/pdfbox/pdmodel/graphics/predictor/Average.java81
-rw-r--r--src/main/java/org/pdfbox/pdmodel/graphics/predictor/None.java104
-rw-r--r--src/main/java/org/pdfbox/pdmodel/graphics/predictor/Paeth.java121
-rw-r--r--src/main/java/org/pdfbox/pdmodel/graphics/predictor/PredictorAlgorithm.java336
-rw-r--r--src/main/java/org/pdfbox/pdmodel/graphics/predictor/Sub.java86
-rw-r--r--src/main/java/org/pdfbox/pdmodel/graphics/predictor/Up.java100
-rw-r--r--src/main/java/org/pdfbox/pdmodel/graphics/predictor/Uptimum.java153
-rw-r--r--src/main/java/org/pdfbox/pdmodel/graphics/predictor/package.html10
-rw-r--r--src/main/java/org/pdfbox/pdmodel/graphics/xobject/PDCcitt.java598
-rw-r--r--src/main/java/org/pdfbox/pdmodel/graphics/xobject/PDInlinedImage.java201
-rw-r--r--src/main/java/org/pdfbox/pdmodel/graphics/xobject/PDJpeg.java156
-rw-r--r--src/main/java/org/pdfbox/pdmodel/graphics/xobject/PDPixelMap.java236
-rw-r--r--src/main/java/org/pdfbox/pdmodel/graphics/xobject/PDXObject.java207
-rw-r--r--src/main/java/org/pdfbox/pdmodel/graphics/xobject/PDXObjectForm.java120
-rw-r--r--src/main/java/org/pdfbox/pdmodel/graphics/xobject/PDXObjectImage.java244
-rw-r--r--src/main/java/org/pdfbox/pdmodel/graphics/xobject/package.html9
-rw-r--r--src/main/java/org/pdfbox/pdmodel/interactive/action/PDActionFactory.java96
-rw-r--r--src/main/java/org/pdfbox/pdmodel/interactive/action/PDAdditionalActions.java106
-rw-r--r--src/main/java/org/pdfbox/pdmodel/interactive/action/PDAnnotationAdditionalActions.java380
-rw-r--r--src/main/java/org/pdfbox/pdmodel/interactive/action/PDDocumentCatalogAdditionalActions.java238
-rw-r--r--src/main/java/org/pdfbox/pdmodel/interactive/action/PDFormFieldAdditionalActions.java216
-rw-r--r--src/main/java/org/pdfbox/pdmodel/interactive/action/PDPageAdditionalActions.java150
-rw-r--r--src/main/java/org/pdfbox/pdmodel/interactive/action/package.html9
-rw-r--r--src/main/java/org/pdfbox/pdmodel/interactive/action/type/PDAction.java187
-rw-r--r--src/main/java/org/pdfbox/pdmodel/interactive/action/type/PDActionGoTo.java92
-rw-r--r--src/main/java/org/pdfbox/pdmodel/interactive/action/type/PDActionJavaScript.java102
-rw-r--r--src/main/java/org/pdfbox/pdmodel/interactive/action/type/PDActionLaunch.java244
-rw-r--r--src/main/java/org/pdfbox/pdmodel/interactive/action/type/PDActionRemoteGoTo.java187
-rw-r--r--src/main/java/org/pdfbox/pdmodel/interactive/action/type/PDActionURI.java183
-rw-r--r--src/main/java/org/pdfbox/pdmodel/interactive/action/type/PDWindowsLaunchParams.java180
-rw-r--r--src/main/java/org/pdfbox/pdmodel/interactive/action/type/package.html9
-rw-r--r--src/main/java/org/pdfbox/pdmodel/interactive/annotation/PDAnnotation.java503
-rw-r--r--src/main/java/org/pdfbox/pdmodel/interactive/annotation/PDAnnotationRubberStamp.java153
-rw-r--r--src/main/java/org/pdfbox/pdmodel/interactive/annotation/PDAnnotationUnknown.java54
-rw-r--r--src/main/java/org/pdfbox/pdmodel/interactive/annotation/PDAnnotationWidget.java65
-rw-r--r--src/main/java/org/pdfbox/pdmodel/interactive/annotation/PDAppearanceDictionary.java245
-rw-r--r--src/main/java/org/pdfbox/pdmodel/interactive/annotation/PDAppearanceStream.java146
-rw-r--r--src/main/java/org/pdfbox/pdmodel/interactive/annotation/package.html9
-rw-r--r--src/main/java/org/pdfbox/pdmodel/interactive/digitalsignature/PDSignature.java85
-rw-r--r--src/main/java/org/pdfbox/pdmodel/interactive/digitalsignature/package.html9
-rw-r--r--src/main/java/org/pdfbox/pdmodel/interactive/documentnavigation/destination/PDDestination.java125
-rw-r--r--src/main/java/org/pdfbox/pdmodel/interactive/documentnavigation/destination/PDNamedDestination.java142
-rw-r--r--src/main/java/org/pdfbox/pdmodel/interactive/documentnavigation/destination/PDPageDestination.java155
-rw-r--r--src/main/java/org/pdfbox/pdmodel/interactive/documentnavigation/destination/PDPageFitDestination.java102
-rw-r--r--src/main/java/org/pdfbox/pdmodel/interactive/documentnavigation/destination/PDPageFitHeightDestination.java132
-rw-r--r--src/main/java/org/pdfbox/pdmodel/interactive/documentnavigation/destination/PDPageFitRectangleDestination.java188
-rw-r--r--src/main/java/org/pdfbox/pdmodel/interactive/documentnavigation/destination/PDPageFitWidthDestination.java134
-rw-r--r--src/main/java/org/pdfbox/pdmodel/interactive/documentnavigation/destination/PDPageXYZDestination.java159
-rw-r--r--src/main/java/org/pdfbox/pdmodel/interactive/documentnavigation/destination/package.html9
-rw-r--r--src/main/java/org/pdfbox/pdmodel/interactive/documentnavigation/outline/PDDocumentOutline.java62
-rw-r--r--src/main/java/org/pdfbox/pdmodel/interactive/documentnavigation/outline/PDOutlineItem.java425
-rw-r--r--src/main/java/org/pdfbox/pdmodel/interactive/documentnavigation/outline/PDOutlineNode.java320
-rw-r--r--src/main/java/org/pdfbox/pdmodel/interactive/documentnavigation/outline/package.html9
-rw-r--r--src/main/java/org/pdfbox/pdmodel/interactive/documentnavigation/package.html9
-rw-r--r--src/main/java/org/pdfbox/pdmodel/interactive/form/PDAcroForm.java328
-rw-r--r--src/main/java/org/pdfbox/pdmodel/interactive/form/PDAppearance.java645
-rw-r--r--src/main/java/org/pdfbox/pdmodel/interactive/form/PDCheckbox.java187
-rw-r--r--src/main/java/org/pdfbox/pdmodel/interactive/form/PDChoiceButton.java95
-rw-r--r--src/main/java/org/pdfbox/pdmodel/interactive/form/PDChoiceField.java127
-rw-r--r--src/main/java/org/pdfbox/pdmodel/interactive/form/PDField.java610
-rw-r--r--src/main/java/org/pdfbox/pdmodel/interactive/form/PDFieldFactory.java218
-rw-r--r--src/main/java/org/pdfbox/pdmodel/interactive/form/PDPushButton.java84
-rw-r--r--src/main/java/org/pdfbox/pdmodel/interactive/form/PDRadioCollection.java170
-rw-r--r--src/main/java/org/pdfbox/pdmodel/interactive/form/PDSignature.java90
-rw-r--r--src/main/java/org/pdfbox/pdmodel/interactive/form/PDTextbox.java64
-rw-r--r--src/main/java/org/pdfbox/pdmodel/interactive/form/PDUnknownField.java72
-rw-r--r--src/main/java/org/pdfbox/pdmodel/interactive/form/PDVariableText.java324
-rw-r--r--src/main/java/org/pdfbox/pdmodel/interactive/form/package.html9
-rw-r--r--src/main/java/org/pdfbox/pdmodel/interactive/pagenavigation/PDThread.java152
-rw-r--r--src/main/java/org/pdfbox/pdmodel/interactive/pagenavigation/PDThreadBead.java234
-rw-r--r--src/main/java/org/pdfbox/pdmodel/interactive/pagenavigation/package.html9
-rw-r--r--src/main/java/org/pdfbox/pdmodel/interactive/viewerpreferences/PDViewerPreferences.java365
-rw-r--r--src/main/java/org/pdfbox/pdmodel/interactive/viewerpreferences/package.html9
-rw-r--r--src/main/java/org/pdfbox/pdmodel/package.html9
-rw-r--r--src/main/java/org/pdfbox/pdmodel/text/PDTextState.java286
-rw-r--r--src/main/java/org/pdfbox/pdmodel/text/package.html9
-rw-r--r--src/main/java/org/pdfbox/persistence/util/COSHEXTable.java566
-rw-r--r--src/main/java/org/pdfbox/persistence/util/COSObjectKey.java131
-rw-r--r--src/main/java/org/pdfbox/persistence/util/package.html9
-rw-r--r--src/main/java/org/pdfbox/pfb/PfbParser.java211
-rw-r--r--src/main/java/org/pdfbox/pfb/package.html9
-rw-r--r--src/main/java/org/pdfbox/searchengine/lucene/IndexFiles.java308
-rw-r--r--src/main/java/org/pdfbox/searchengine/lucene/LucenePDFDocument.java387
-rw-r--r--src/main/java/org/pdfbox/searchengine/lucene/package.html9
-rw-r--r--src/main/java/org/pdfbox/searchengine/package.html9
-rw-r--r--src/main/java/org/pdfbox/ttf/CMAPEncodingEntry.java219
-rw-r--r--src/main/java/org/pdfbox/ttf/CMAPTable.java122
-rw-r--r--src/main/java/org/pdfbox/ttf/DigitalSignatureTable.java45
-rw-r--r--src/main/java/org/pdfbox/ttf/GlyphData.java125
-rw-r--r--src/main/java/org/pdfbox/ttf/GlyphTable.java88
-rw-r--r--src/main/java/org/pdfbox/ttf/HeaderTable.java332
-rw-r--r--src/main/java/org/pdfbox/ttf/HorizontalHeaderTable.java332
-rw-r--r--src/main/java/org/pdfbox/ttf/HorizontalMetricsTable.java95
-rw-r--r--src/main/java/org/pdfbox/ttf/IndexToLocationTable.java96
-rw-r--r--src/main/java/org/pdfbox/ttf/MaximumProfileTable.java300
-rw-r--r--src/main/java/org/pdfbox/ttf/MemoryTTFDataStream.java231
-rw-r--r--src/main/java/org/pdfbox/ttf/NameRecord.java242
-rw-r--r--src/main/java/org/pdfbox/ttf/NamingTable.java112
-rw-r--r--src/main/java/org/pdfbox/ttf/OS2WindowsMetricsTable.java694
-rw-r--r--src/main/java/org/pdfbox/ttf/PostScriptTable.java304
-rw-r--r--src/main/java/org/pdfbox/ttf/RAFDataStream.java193
-rw-r--r--src/main/java/org/pdfbox/ttf/TTFDataStream.java253
-rw-r--r--src/main/java/org/pdfbox/ttf/TTFParser.java219
-rw-r--r--src/main/java/org/pdfbox/ttf/TTFTable.java115
-rw-r--r--src/main/java/org/pdfbox/ttf/TrueTypeFont.java221
-rw-r--r--src/main/java/org/pdfbox/ttf/package.html9
-rw-r--r--src/main/java/org/pdfbox/util/BitFlagHelper.java85
-rw-r--r--src/main/java/org/pdfbox/util/BoundingBox.java188
-rw-r--r--src/main/java/org/pdfbox/util/DateConverter.java281
-rw-r--r--src/main/java/org/pdfbox/util/DefaultFileFilter.java285
-rw-r--r--src/main/java/org/pdfbox/util/ErrorLogger.java72
-rw-r--r--src/main/java/org/pdfbox/util/ImageParameters.java234
-rw-r--r--src/main/java/org/pdfbox/util/Matrix.java350
-rw-r--r--src/main/java/org/pdfbox/util/PDFHighlighter.java213
-rw-r--r--src/main/java/org/pdfbox/util/PDFOperator.java153
-rw-r--r--src/main/java/org/pdfbox/util/PDFStreamEngine.java622
-rw-r--r--src/main/java/org/pdfbox/util/PDFText2HTML.java271
-rw-r--r--src/main/java/org/pdfbox/util/PDFTextStripper.java1033
-rw-r--r--src/main/java/org/pdfbox/util/PDFTextStripperByArea.java165
-rw-r--r--src/main/java/org/pdfbox/util/ResourceLoader.java169
-rw-r--r--src/main/java/org/pdfbox/util/SimpleConfigurator.java68
-rw-r--r--src/main/java/org/pdfbox/util/Splitter.java201
-rw-r--r--src/main/java/org/pdfbox/util/TextPosition.java203
-rw-r--r--src/main/java/org/pdfbox/util/TextPositionComparator.java126
-rw-r--r--src/main/java/org/pdfbox/util/XMLUtil.java103
-rw-r--r--src/main/java/org/pdfbox/util/operator/BeginText.java68
-rw-r--r--src/main/java/org/pdfbox/util/operator/Concatenate.java106
-rw-r--r--src/main/java/org/pdfbox/util/operator/EndText.java67
-rw-r--r--src/main/java/org/pdfbox/util/operator/GRestore.java67
-rw-r--r--src/main/java/org/pdfbox/util/operator/GSave.java66
-rw-r--r--src/main/java/org/pdfbox/util/operator/Invoke.java113
-rw-r--r--src/main/java/org/pdfbox/util/operator/MoveAndShow.java75
-rw-r--r--src/main/java/org/pdfbox/util/operator/MoveText.java76
-rw-r--r--src/main/java/org/pdfbox/util/operator/MoveTextSetLeading.java80
-rw-r--r--src/main/java/org/pdfbox/util/operator/NextLine.java82
-rw-r--r--src/main/java/org/pdfbox/util/operator/OperatorProcessor.java93
-rw-r--r--src/main/java/org/pdfbox/util/operator/SetCharSpacing.java79
-rw-r--r--src/main/java/org/pdfbox/util/operator/SetGraphicsStateParameters.java72
-rw-r--r--src/main/java/org/pdfbox/util/operator/SetHorizontalTextScaling.java64
-rw-r--r--src/main/java/org/pdfbox/util/operator/SetLineWidth.java64
-rw-r--r--src/main/java/org/pdfbox/util/operator/SetMatrix.java90
-rw-r--r--src/main/java/org/pdfbox/util/operator/SetMoveAndShow.java80
-rw-r--r--src/main/java/org/pdfbox/util/operator/SetNonStrokingCMYKColor.java69
-rw-r--r--src/main/java/org/pdfbox/util/operator/SetNonStrokingColorSpace.java86
-rw-r--r--src/main/java/org/pdfbox/util/operator/SetNonStrokingRGBColor.java69
-rw-r--r--src/main/java/org/pdfbox/util/operator/SetStrokingCMYKColor.java71
-rw-r--r--src/main/java/org/pdfbox/util/operator/SetStrokingColorSpace.java89
-rw-r--r--src/main/java/org/pdfbox/util/operator/SetStrokingRGBColor.java71
-rw-r--r--src/main/java/org/pdfbox/util/operator/SetTextFont.java96
-rw-r--r--src/main/java/org/pdfbox/util/operator/SetTextLeading.java69
-rw-r--r--src/main/java/org/pdfbox/util/operator/SetTextRenderingMode.java64
-rw-r--r--src/main/java/org/pdfbox/util/operator/SetTextRise.java64
-rw-r--r--src/main/java/org/pdfbox/util/operator/SetWordSpacing.java68
-rw-r--r--src/main/java/org/pdfbox/util/operator/ShowText.java73
-rw-r--r--src/main/java/org/pdfbox/util/operator/ShowTextGlyph.java99
-rw-r--r--src/main/java/org/pdfbox/util/operator/package.html9
-rw-r--r--src/main/java/org/pdfbox/util/operator/pagedrawer/AppendRectangleToPath.java77
-rw-r--r--src/main/java/org/pdfbox/util/operator/pagedrawer/BeginInlineImage.java114
-rw-r--r--src/main/java/org/pdfbox/util/operator/pagedrawer/ClosePath.java59
-rw-r--r--src/main/java/org/pdfbox/util/operator/pagedrawer/CurveTo.java73
-rw-r--r--src/main/java/org/pdfbox/util/operator/pagedrawer/CurveToReplicateFinalPoint.java69
-rw-r--r--src/main/java/org/pdfbox/util/operator/pagedrawer/CurveToReplicateInitialPoint.java76
-rw-r--r--src/main/java/org/pdfbox/util/operator/pagedrawer/FillEvenOddRule.java71
-rw-r--r--src/main/java/org/pdfbox/util/operator/pagedrawer/FillNonZeroRule.java71
-rw-r--r--src/main/java/org/pdfbox/util/operator/pagedrawer/Invoke.java180
-rw-r--r--src/main/java/org/pdfbox/util/operator/pagedrawer/LineTo.java65
-rw-r--r--src/main/java/org/pdfbox/util/operator/pagedrawer/MoveTo.java68
-rw-r--r--src/main/java/org/pdfbox/util/operator/pagedrawer/SetLineWidth.java65
-rw-r--r--src/main/java/org/pdfbox/util/operator/pagedrawer/SetNonStrokingCMYKColor.java64
-rw-r--r--src/main/java/org/pdfbox/util/operator/pagedrawer/SetNonStrokingColorSpace.java71
-rw-r--r--src/main/java/org/pdfbox/util/operator/pagedrawer/SetNonStrokingRGBColor.java65
-rw-r--r--src/main/java/org/pdfbox/util/operator/pagedrawer/SetStrokingCMYKColor.java64
-rw-r--r--src/main/java/org/pdfbox/util/operator/pagedrawer/SetStrokingColorSpace.java70
-rw-r--r--src/main/java/org/pdfbox/util/operator/pagedrawer/SetStrokingRGBColor.java65
-rw-r--r--src/main/java/org/pdfbox/util/operator/pagedrawer/StrokePath.java73
-rw-r--r--src/main/java/org/pdfbox/util/operator/pagedrawer/package.html9
-rw-r--r--src/main/java/org/pdfbox/util/package.html9
-rw-r--r--src/main/java/test/pdfbox/TestAll.java88
-rw-r--r--src/main/java/test/pdfbox/cos/TestCOSString.java92
-rw-r--r--src/main/java/test/pdfbox/cos/package.html9
-rw-r--r--src/main/java/test/pdfbox/encryption/TestEncryption.java179
-rw-r--r--src/main/java/test/pdfbox/encryption/package.html9
-rw-r--r--src/main/java/test/pdfbox/filter/TestFilters.java182
-rw-r--r--src/main/java/test/pdfbox/filter/package.html9
-rw-r--r--src/main/java/test/pdfbox/package.html9
-rw-r--r--src/main/java/test/pdfbox/pdfparser/TestPDFParser.java126
-rw-r--r--src/main/java/test/pdfbox/pdfparser/package.html9
-rw-r--r--src/main/java/test/pdfbox/pdmodel/TestFDF.java292
-rw-r--r--src/main/java/test/pdfbox/pdmodel/interactive/form/TestFields.java144
-rw-r--r--src/main/java/test/pdfbox/pdmodel/interactive/form/package.html9
-rw-r--r--src/main/java/test/pdfbox/pdmodel/package.html9
-rw-r--r--src/main/java/test/pdfbox/util/TestTextStripper.java371
-rw-r--r--src/main/java/test/pdfbox/util/TestTextStripperPerformance.java173
-rw-r--r--src/main/java/test/pdfbox/util/package.html9
-rw-r--r--src/main/resources/Resources/PDFBox_External_Fonts.properties4
-rw-r--r--src/main/resources/Resources/PDFTextStripper.properties78
-rw-r--r--src/main/resources/Resources/PageDrawer.properties77
-rw-r--r--src/main/resources/Resources/afm/Courier-Bold.afm342
-rw-r--r--src/main/resources/Resources/afm/Courier-BoldOblique.afm342
-rw-r--r--src/main/resources/Resources/afm/Courier-Oblique.afm342
-rw-r--r--src/main/resources/Resources/afm/Courier.afm342
-rw-r--r--src/main/resources/Resources/afm/Helvetica-Bold.afm2827
-rw-r--r--src/main/resources/Resources/afm/Helvetica-BoldOblique.afm2827
-rw-r--r--src/main/resources/Resources/afm/Helvetica-Oblique.afm3051
-rw-r--r--src/main/resources/Resources/afm/Helvetica.afm3051
-rw-r--r--src/main/resources/Resources/afm/Symbol.afm213
-rw-r--r--src/main/resources/Resources/afm/Times-Bold.afm2588
-rw-r--r--src/main/resources/Resources/afm/Times-BoldItalic.afm2384
-rw-r--r--src/main/resources/Resources/afm/Times-Italic.afm2667
-rw-r--r--src/main/resources/Resources/afm/Times-Roman.afm2419
-rw-r--r--src/main/resources/Resources/afm/ZapfDingbats.afm225
-rw-r--r--src/main/resources/Resources/cmap/00_ReadMe.pdfbin0 -> 13016 bytes
-rw-r--r--src/main/resources/Resources/cmap/78-EUC-H708
-rw-r--r--src/main/resources/Resources/cmap/78-EUC-V86
-rw-r--r--src/main/resources/Resources/cmap/78-H700
-rw-r--r--src/main/resources/Resources/cmap/78-RKSJ-H710
-rw-r--r--src/main/resources/Resources/cmap/78-RKSJ-V86
-rw-r--r--src/main/resources/Resources/cmap/78-V86
-rw-r--r--src/main/resources/Resources/cmap/78ms-RKSJ-H800
-rw-r--r--src/main/resources/Resources/cmap/78ms-RKSJ-V137
-rw-r--r--src/main/resources/Resources/cmap/83pv-RKSJ-H1
-rw-r--r--src/main/resources/Resources/cmap/90ms-RKSJ-H1
-rw-r--r--src/main/resources/Resources/cmap/90ms-RKSJ-UCS21
-rw-r--r--src/main/resources/Resources/cmap/90ms-RKSJ-V1
-rw-r--r--src/main/resources/Resources/cmap/90msp-RKSJ-H1
-rw-r--r--src/main/resources/Resources/cmap/90msp-RKSJ-V1
-rw-r--r--src/main/resources/Resources/cmap/90pv-RKSJ-H1
-rw-r--r--src/main/resources/Resources/cmap/90pv-RKSJ-UCS21
-rw-r--r--src/main/resources/Resources/cmap/90pv-RKSJ-UCS2C1
-rw-r--r--src/main/resources/Resources/cmap/90pv-RKSJ-V111
-rw-r--r--src/main/resources/Resources/cmap/Add-H709
-rw-r--r--src/main/resources/Resources/cmap/Add-RKSJ-H1
-rw-r--r--src/main/resources/Resources/cmap/Add-RKSJ-V1
-rw-r--r--src/main/resources/Resources/cmap/Add-V117
-rw-r--r--src/main/resources/Resources/cmap/Adobe-CNS1-31
-rw-r--r--src/main/resources/Resources/cmap/Adobe-CNS1-B5pc368
-rw-r--r--src/main/resources/Resources/cmap/Adobe-CNS1-H-CID91
-rw-r--r--src/main/resources/Resources/cmap/Adobe-CNS1-H-Host390
-rw-r--r--src/main/resources/Resources/cmap/Adobe-CNS1-H-Mac366
-rw-r--r--src/main/resources/Resources/cmap/Adobe-CNS1-UCS21
-rw-r--r--src/main/resources/Resources/cmap/Adobe-GB1-41
-rw-r--r--src/main/resources/Resources/cmap/Adobe-GB1-GBK-EUC4333
-rw-r--r--src/main/resources/Resources/cmap/Adobe-GB1-GBpc-EUC197
-rw-r--r--src/main/resources/Resources/cmap/Adobe-GB1-H-CID94
-rw-r--r--src/main/resources/Resources/cmap/Adobe-GB1-H-Host4358
-rw-r--r--src/main/resources/Resources/cmap/Adobe-GB1-H-Mac194
-rw-r--r--src/main/resources/Resources/cmap/Adobe-GB1-UCS21
-rw-r--r--src/main/resources/Resources/cmap/Adobe-Japan1-095
-rw-r--r--src/main/resources/Resources/cmap/Adobe-Japan1-195
-rw-r--r--src/main/resources/Resources/cmap/Adobe-Japan1-297
-rw-r--r--src/main/resources/Resources/cmap/Adobe-Japan1-41
-rw-r--r--src/main/resources/Resources/cmap/Adobe-Japan1-90ms-RKSJ291
-rw-r--r--src/main/resources/Resources/cmap/Adobe-Japan1-90pv-RKSJ389
-rw-r--r--src/main/resources/Resources/cmap/Adobe-Japan1-H-CID101
-rw-r--r--src/main/resources/Resources/cmap/Adobe-Japan1-H-Host311
-rw-r--r--src/main/resources/Resources/cmap/Adobe-Japan1-H-Mac249
-rw-r--r--src/main/resources/Resources/cmap/Adobe-Japan1-PS-H1062
-rw-r--r--src/main/resources/Resources/cmap/Adobe-Japan1-PS-V606
-rw-r--r--src/main/resources/Resources/cmap/Adobe-Japan1-UCS21
-rw-r--r--src/main/resources/Resources/cmap/Adobe-Korea1-21
-rw-r--r--src/main/resources/Resources/cmap/Adobe-Korea1-H-CID76
-rw-r--r--src/main/resources/Resources/cmap/Adobe-Korea1-H-Host735
-rw-r--r--src/main/resources/Resources/cmap/Adobe-Korea1-KSCms-UHC727
-rw-r--r--src/main/resources/Resources/cmap/Adobe-Korea1-KSCpc-EUC529
-rw-r--r--src/main/resources/Resources/cmap/Adobe-Korea1-UCS21
-rw-r--r--src/main/resources/Resources/cmap/B5pc-H1
-rw-r--r--src/main/resources/Resources/cmap/B5pc-UCS21
-rw-r--r--src/main/resources/Resources/cmap/B5pc-UCS2C1
-rw-r--r--src/main/resources/Resources/cmap/B5pc-V1
-rw-r--r--src/main/resources/Resources/cmap/CNS-EUC-H1
-rw-r--r--src/main/resources/Resources/cmap/CNS-EUC-V1
-rw-r--r--src/main/resources/Resources/cmap/ETHK-B5-H1222
-rw-r--r--src/main/resources/Resources/cmap/ETHK-B5-V72
-rw-r--r--src/main/resources/Resources/cmap/ETen-B5-H1
-rw-r--r--src/main/resources/Resources/cmap/ETen-B5-UCS21
-rw-r--r--src/main/resources/Resources/cmap/ETen-B5-V1
-rw-r--r--src/main/resources/Resources/cmap/ETenms-B5-H55
-rw-r--r--src/main/resources/Resources/cmap/ETenms-B5-V75
-rw-r--r--src/main/resources/Resources/cmap/EUC-H1
-rw-r--r--src/main/resources/Resources/cmap/EUC-V1
-rw-r--r--src/main/resources/Resources/cmap/Ext-H739
-rw-r--r--src/main/resources/Resources/cmap/Ext-RKSJ-H1
-rw-r--r--src/main/resources/Resources/cmap/Ext-RKSJ-V1
-rw-r--r--src/main/resources/Resources/cmap/Ext-V99
-rw-r--r--src/main/resources/Resources/cmap/GB-EUC-H1
-rw-r--r--src/main/resources/Resources/cmap/GB-EUC-V1
-rw-r--r--src/main/resources/Resources/cmap/GBK-EUC-H1
-rw-r--r--src/main/resources/Resources/cmap/GBK-EUC-UCS21
-rw-r--r--src/main/resources/Resources/cmap/GBK-EUC-V1
-rw-r--r--src/main/resources/Resources/cmap/GBK2K-H1
-rw-r--r--src/main/resources/Resources/cmap/GBK2K-V1
-rw-r--r--src/main/resources/Resources/cmap/GBKp-EUC-H1
-rw-r--r--src/main/resources/Resources/cmap/GBKp-EUC-V1
-rw-r--r--src/main/resources/Resources/cmap/GBT-EUC-H1
-rw-r--r--src/main/resources/Resources/cmap/GBT-EUC-V1
-rw-r--r--src/main/resources/Resources/cmap/GBpc-EUC-H1
-rw-r--r--src/main/resources/Resources/cmap/GBpc-EUC-UCS21
-rw-r--r--src/main/resources/Resources/cmap/GBpc-EUC-UCS2C1
-rw-r--r--src/main/resources/Resources/cmap/GBpc-EUC-V1
-rw-r--r--src/main/resources/Resources/cmap/H1
-rw-r--r--src/main/resources/Resources/cmap/HKdla-B5-H1116
-rw-r--r--src/main/resources/Resources/cmap/HKdla-B5-V71
-rw-r--r--src/main/resources/Resources/cmap/HKdlb-B5-H998
-rw-r--r--src/main/resources/Resources/cmap/HKdlb-B5-V71
-rw-r--r--src/main/resources/Resources/cmap/HKgccs-B5-H631
-rw-r--r--src/main/resources/Resources/cmap/HKgccs-B5-V71
-rw-r--r--src/main/resources/Resources/cmap/HKm314-B5-H621
-rw-r--r--src/main/resources/Resources/cmap/HKm314-B5-V71
-rw-r--r--src/main/resources/Resources/cmap/HKm471-B5-H771
-rw-r--r--src/main/resources/Resources/cmap/HKm471-B5-V71
-rw-r--r--src/main/resources/Resources/cmap/HKscs-B5-H1
-rw-r--r--src/main/resources/Resources/cmap/HKscs-B5-V1
-rw-r--r--src/main/resources/Resources/cmap/Hankaku70
-rw-r--r--src/main/resources/Resources/cmap/Hiragana68
-rw-r--r--src/main/resources/Resources/cmap/Identity-H316
-rw-r--r--src/main/resources/Resources/cmap/Identity-V50
-rw-r--r--src/main/resources/Resources/cmap/KSC-EUC-H1
-rw-r--r--src/main/resources/Resources/cmap/KSC-EUC-V1
-rw-r--r--src/main/resources/Resources/cmap/KSC-Johab-H4279
-rw-r--r--src/main/resources/Resources/cmap/KSC-Johab-V76
-rw-r--r--src/main/resources/Resources/cmap/KSCms-UHC-H1
-rw-r--r--src/main/resources/Resources/cmap/KSCms-UHC-HW-H1
-rw-r--r--src/main/resources/Resources/cmap/KSCms-UHC-HW-V1
-rw-r--r--src/main/resources/Resources/cmap/KSCms-UHC-UCS21
-rw-r--r--src/main/resources/Resources/cmap/KSCms-UHC-V1
-rw-r--r--src/main/resources/Resources/cmap/KSCpc-EUC-H1
-rw-r--r--src/main/resources/Resources/cmap/KSCpc-EUC-UCS21
-rw-r--r--src/main/resources/Resources/cmap/KSCpc-EUC-UCS2C1
-rw-r--r--src/main/resources/Resources/cmap/Katakana62
-rw-r--r--src/main/resources/Resources/cmap/NWP-H839
-rw-r--r--src/main/resources/Resources/cmap/NWP-V107
-rw-r--r--src/main/resources/Resources/cmap/RKSJ-H192
-rw-r--r--src/main/resources/Resources/cmap/RKSJ-V87
-rw-r--r--src/main/resources/Resources/cmap/Roman61
-rw-r--r--src/main/resources/Resources/cmap/UCS2-90ms-RKSJ7178
-rw-r--r--src/main/resources/Resources/cmap/UCS2-90pv-RKSJ6845
-rw-r--r--src/main/resources/Resources/cmap/UCS2-B5pc13150
-rw-r--r--src/main/resources/Resources/cmap/UCS2-GBK-EUC11253
-rw-r--r--src/main/resources/Resources/cmap/UCS2-GBpc-EUC9098
-rw-r--r--src/main/resources/Resources/cmap/UCS2-KSCms-UHC9070
-rw-r--r--src/main/resources/Resources/cmap/UCS2-KSCpc-EUC7076
-rw-r--r--src/main/resources/Resources/cmap/UniCNS-UCS2-H1
-rw-r--r--src/main/resources/Resources/cmap/UniCNS-UCS2-V1
-rw-r--r--src/main/resources/Resources/cmap/UniGB-UCS2-H1
-rw-r--r--src/main/resources/Resources/cmap/UniGB-UCS2-V1
-rw-r--r--src/main/resources/Resources/cmap/UniHojo-UCS2-H4418
-rw-r--r--src/main/resources/Resources/cmap/UniJIS-UCS2-H1
-rw-r--r--src/main/resources/Resources/cmap/UniJIS-UCS2-HW-H1
-rw-r--r--src/main/resources/Resources/cmap/UniJIS-UCS2-HW-V1
-rw-r--r--src/main/resources/Resources/cmap/UniJIS-UCS2-V1
-rw-r--r--src/main/resources/Resources/cmap/UniKS-UCS2-H1
-rw-r--r--src/main/resources/Resources/cmap/UniKS-UCS2-V1
-rw-r--r--src/main/resources/Resources/cmap/V1
-rw-r--r--src/main/resources/Resources/cmap/WP-Symbol87
-rw-r--r--src/main/resources/Resources/colorspace-profiles/CMY.pfbin0 -> 101936 bytes
-rw-r--r--src/main/resources/Resources/colorspace-profiles/CMYK.pfbin0 -> 487472 bytes
-rw-r--r--src/main/resources/Resources/colorspace-profiles/README.txt9
-rw-r--r--src/main/resources/Resources/colorspace-profiles/YCC601.pfbin0 -> 101940 bytes
-rw-r--r--src/main/resources/Resources/colorspace-profiles/YCC601L.pfbin0 -> 101956 bytes
-rw-r--r--src/main/resources/Resources/colorspace-profiles/YCC709.pfbin0 -> 101940 bytes
-rw-r--r--src/main/resources/Resources/colorspace-profiles/YCC709L.pfbin0 -> 101956 bytes
-rw-r--r--src/main/resources/Resources/colorspace-profiles/YLINEAR.pfbin0 -> 101940 bytes
-rw-r--r--src/main/resources/Resources/glyphlist.txt4296
-rw-r--r--src/main/resources/Resources/pdfbox.version2
-rw-r--r--src/main/resources/Resources/ttf/Arial-BoldItalicMT.ttfbin0 -> 63208 bytes
-rw-r--r--src/main/resources/Resources/ttf/Arial-BoldMT.ttfbin0 -> 58716 bytes
-rw-r--r--src/main/resources/Resources/ttf/ArialMT.ttfbin0 -> 65932 bytes
-rw-r--r--src/main/resources/com/lowagie/text/MPL-1.1.txt470
-rw-r--r--src/main/resources/com/lowagie/text/lgpl.txt437
-rw-r--r--src/main/resources/com/lowagie/text/pdf/fonts/Courier-Bold.afm342
-rw-r--r--src/main/resources/com/lowagie/text/pdf/fonts/Courier-BoldOblique.afm342
-rw-r--r--src/main/resources/com/lowagie/text/pdf/fonts/Courier-Oblique.afm342
-rw-r--r--src/main/resources/com/lowagie/text/pdf/fonts/Courier.afm342
-rw-r--r--src/main/resources/com/lowagie/text/pdf/fonts/Helvetica-Bold.afm2827
-rw-r--r--src/main/resources/com/lowagie/text/pdf/fonts/Helvetica-BoldOblique.afm2827
-rw-r--r--src/main/resources/com/lowagie/text/pdf/fonts/Helvetica-Oblique.afm3051
-rw-r--r--src/main/resources/com/lowagie/text/pdf/fonts/Helvetica.afm3051
-rw-r--r--src/main/resources/com/lowagie/text/pdf/fonts/Symbol.afm213
-rw-r--r--src/main/resources/com/lowagie/text/pdf/fonts/Times-Bold.afm2588
-rw-r--r--src/main/resources/com/lowagie/text/pdf/fonts/Times-BoldItalic.afm2384
-rw-r--r--src/main/resources/com/lowagie/text/pdf/fonts/Times-Italic.afm2667
-rw-r--r--src/main/resources/com/lowagie/text/pdf/fonts/Times-Roman.afm2419
-rw-r--r--src/main/resources/com/lowagie/text/pdf/fonts/ZapfDingbats.afm225
-rw-r--r--src/main/resources/com/lowagie/tools/plugins/tools.txt30
1225 files changed, 418833 insertions, 0 deletions
diff --git a/src/main/assembly/assemble_libraries.xml b/src/main/assembly/assemble_libraries.xml
new file mode 100644
index 0000000..446e9ba
--- /dev/null
+++ b/src/main/assembly/assemble_libraries.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- http://maven.apache.org/plugins/maven-assembly-plugin/assembly.html -->
+<assembly>
+ <id>libraries</id>
+ <formats>
+ <format>dir</format>
+ </formats>
+ <includeBaseDirectory>false</includeBaseDirectory>
+ <dependencySets>
+ <dependencySet>
+ <unpack>false</unpack>
+ <scope>compile</scope>
+ <outputDirectory>/</outputDirectory>
+ </dependencySet>
+ </dependencySets>
+</assembly>
diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/PdfAS.java b/src/main/java/at/knowcenter/wag/egov/egiz/PdfAS.java
new file mode 100644
index 0000000..53fafe2
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/egov/egiz/PdfAS.java
@@ -0,0 +1,1083 @@
+/**
+ * <copyright> Copyright (c) 2006 by Know-Center, Graz, Austria </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+ * NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
+ * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES.
+ *
+ * $Id: PdfAS.java,v 1.5 2006/10/31 08:04:50 wprinz Exp $
+ */
+package at.knowcenter.wag.egov.egiz;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Vector;
+
+import org.apache.log4j.Logger;
+
+import at.knowcenter.wag.egov.egiz.cfg.ConfigLogger;
+import at.knowcenter.wag.egov.egiz.cfg.SettingsReader;
+import at.knowcenter.wag.egov.egiz.exceptions.ConnectorFactoryException;
+import at.knowcenter.wag.egov.egiz.exceptions.NormalizeException;
+import at.knowcenter.wag.egov.egiz.exceptions.PDFDocumentException;
+import at.knowcenter.wag.egov.egiz.exceptions.PresentableException;
+import at.knowcenter.wag.egov.egiz.exceptions.SettingsException;
+import at.knowcenter.wag.egov.egiz.exceptions.SignatureException;
+import at.knowcenter.wag.egov.egiz.exceptions.SignatureTypesException;
+import at.knowcenter.wag.egov.egiz.framework.FoundBlock;
+import at.knowcenter.wag.egov.egiz.framework.FoundKey;
+import at.knowcenter.wag.egov.egiz.framework.SignResult;
+import at.knowcenter.wag.egov.egiz.framework.Signator;
+import at.knowcenter.wag.egov.egiz.framework.SignatorFactory;
+import at.knowcenter.wag.egov.egiz.framework.VerificationFilter;
+import at.knowcenter.wag.egov.egiz.pdf.IncrementalUpdateInformation;
+import at.knowcenter.wag.egov.egiz.pdf.PDFSignatureCreation;
+import at.knowcenter.wag.egov.egiz.pdf.PDFSignatureObject;
+import at.knowcenter.wag.egov.egiz.pdf.PDFUtilities;
+import at.knowcenter.wag.egov.egiz.pdf.SignatureHolder;
+import at.knowcenter.wag.egov.egiz.pdf.TextualSignatureHolder;
+import at.knowcenter.wag.egov.egiz.pdf.TablePos;
+import at.knowcenter.wag.egov.egiz.pdf.TextualSignature;
+import at.knowcenter.wag.egov.egiz.sig.Connector;
+import at.knowcenter.wag.egov.egiz.sig.ConnectorFactory;
+import at.knowcenter.wag.egov.egiz.sig.SignatureObject;
+import at.knowcenter.wag.egov.egiz.sig.SignatureResponse;
+import at.knowcenter.wag.egov.egiz.sig.SignatureTypeDefinition;
+import at.knowcenter.wag.egov.egiz.sig.SignatureTypes;
+import at.knowcenter.wag.egov.egiz.tools.Normalizer;
+import at.knowcenter.wag.exactparser.parsing.PDFUtils;
+import at.knowcenter.wag.exactparser.parsing.results.HeaderParseResult;
+
+import com.lowagie.text.Rectangle;
+import com.lowagie.text.pdf.PdfPTable;
+import com.lowagie.text.pdf.PdfReader;
+
+/**
+ * This class contains the major methods used by both, the commandline and the
+ * webapp, to perform signation and verification.
+ *
+ * @author wprinz
+ */
+public abstract class PdfAS
+{
+ /**
+ * The key of the strict mode setting.
+ */
+ public static final String STRICT_MODE_KEY = "strict_mode";
+
+ /**
+ * The left/right border.
+ */
+ public static final float SIGNATURE_BORDER = 100f;
+
+ /**
+ * The top/bottom border.
+ */
+ public static final float SIGNATURE_MARGIN = 20f;
+
+ /**
+ * The Mime Type of a PDF document.
+ */
+ public static final String PDF_MIME_TYPE = "application/pdf";
+
+ /**
+ * The logger definition.
+ */
+ private static final Logger logger_ = ConfigLogger.getLogger(PdfAS.class);
+
+ /**
+ * Tells, if strict PDF checking the PDF version is enabled.
+ *
+ * @return Returns true, if incoming PDFs should be checked strictly.
+ */
+ public static boolean isStrictPdfChecking()
+ {
+ try
+ {
+ SettingsReader settings = SettingsReader.getInstance();
+ String strict_mode = settings.getSetting(STRICT_MODE_KEY, "false");
+ if (strict_mode.equals("true"))
+ {
+ return true;
+ }
+ }
+ catch (SettingsException e)
+ {
+ e.printStackTrace();
+ }
+ return false;
+ }
+
+ /**
+ * Checks the version of the given PDF to be 1.4 or lower.
+ *
+ * @param pdf
+ * The PDF.
+ * @return Returns true, if the given PDF is strict 1.4, false otherwise.
+ * @throws PDFDocumentException
+ * Forwarded exception.
+ */
+ public static boolean isPdf14(byte[] pdf) throws PDFDocumentException
+ {
+ try
+ {
+ HeaderParseResult hpr = PDFUtils.parseHeader(pdf, 0);
+
+ if (hpr.major <= 1 && hpr.minor <= 4)
+ {
+ return true;
+ }
+ return false;
+ }
+ catch (Exception e)
+ {
+ throw new PDFDocumentException(201, e);
+ }
+ }
+
+ /**
+ * Applies strict version mode on the PDF and throws an exception, if the pdf
+ * is not 1.4.
+ *
+ * <p>
+ * If strict mode is deactivated, this does simply nothing.
+ * </p>
+ *
+ * @param pdf
+ * The pdf to be checked against strict mode.
+ * @throws PDFDocumentException
+ */
+ public static void applyStrictMode(byte[] pdf) throws PDFDocumentException
+ {
+ if (isStrictPdfChecking())
+ {
+ if (!isPdf14(pdf))
+ {
+ throw new PDFDocumentException(201, "StrictMode: The pdf version is not 1.4 or lower.");
+ }
+ }
+ }
+
+ /**
+ * Verifies the given PDF document.
+ *
+ * @param pdf
+ * The PDF document.
+ * @param connector
+ * The connector.
+ * @return Returns the List of results.
+ * @throws PresentableException
+ * Forwarded exception.
+ */
+ public static List verifyPdf(final byte[] pdf, final String connector) throws PresentableException
+ {
+ VerificationFilter vf = new VerificationFilter();
+ List signature_holders = vf.extractSignaturesFromPdf(pdf);
+ if (signature_holders.isEmpty())
+ {
+ throw new PDFDocumentException(206);
+ }
+
+ List results = verifySignatureHolders(signature_holders, connector);
+
+ return results;
+ }
+
+ /**
+ * Verifies the given text that is supposed to be extracted from a PDF
+ * document using text extraction mechanisms.
+ *
+ * @param text
+ * The text to be verified.
+ * @param connector
+ * The connecor.
+ * @return Returns the List of results.
+ * @throws PresentableException
+ * Forwarded exception.
+ */
+ public static List verifyText(final String text, final String connector) throws PresentableException
+ {
+ VerificationFilter vf = new VerificationFilter();
+ List signature_holders = vf.extractSignaturesFromPlainText(text);
+ if (signature_holders.isEmpty())
+ {
+ throw new PDFDocumentException(206);
+ }
+
+ List results = verifySignatureHolders(signature_holders, connector);
+
+ return results;
+ }
+
+ /**
+ * Extracts all signature blocks from the given raw text using textual mode.
+ *
+ * @param raw_text
+ * The raw text.
+ * @return Returns a List of all SignatureHolders extracted from the text.
+ * @throws PDFDocumentException
+ * F.e.
+ * @throws SignatureException
+ * F.e.
+ * @throws SignatureTypesException
+ * @throws NormalizeException
+ */
+ public static List extractSignatureHoldersTextual(String raw_text,
+ boolean old_style) throws PDFDocumentException, SignatureException, SignatureTypesException, NormalizeException
+ {
+ List signature_holders = new ArrayList();
+
+ String text = raw_text;
+ for (;;)
+ {
+ SignatureHolder holder = extractSignatureHolderTextual(text, old_style);
+ if (holder == null)
+ {
+ break;
+ }
+ {
+ logger_.debug("Found holder: " + holder.getSignatureObject().getSignationType());
+ }
+ signature_holders.add(0, holder);
+
+ text = holder.getSignedText();
+ }
+
+ return signature_holders;
+ }
+
+ /**
+ * Extracts the last signature holder from the given text.
+ *
+ * @param raw_text
+ * @param old_style
+ * @return Returns the found singature holder, or null, if none could be
+ * found.
+ * @throws SignatureException
+ * @throws SignatureTypesException
+ * @throws NormalizeException
+ */
+ public static SignatureHolder extractSignatureHolderTextual(String raw_text,
+ boolean old_style) throws SignatureException, SignatureTypesException, NormalizeException
+ {
+ SignatureTypes sig_types = SignatureTypes.getInstance();
+ List signatureTypes_ = sig_types.getSignatureTypeDefinitions();
+
+ List found_blocks = new ArrayList();
+ for (int cur_type = 0; cur_type < signatureTypes_.size(); cur_type++)
+ {
+ SignatureTypeDefinition cur_std = (SignatureTypeDefinition) signatureTypes_.get(cur_type);
+
+ List found_keys = findBlockInText(raw_text, cur_std, old_style);
+ if (found_keys != null)
+ {
+ FoundBlock found_block = new FoundBlock();
+ found_block.found_keys = found_keys;
+ found_block.end_index = raw_text.length();
+ found_block.std = cur_std;
+ found_blocks.add(found_block);
+ }
+ }
+
+ List last_most_blocks = sortOutEarlyBlocks(found_blocks);
+
+ List minimum_blocks = sortOutLargeBlocks(last_most_blocks);
+
+ if (minimum_blocks.size() > 1)
+ {
+ logger_.debug("There are still " + minimum_blocks.size() + " candidates:");
+
+ for (int i = 0; i < minimum_blocks.size(); i++)
+ {
+ FoundBlock fb = (FoundBlock) minimum_blocks.get(i);
+ logger_.debug(" fb: " + fb.std.getType());
+ }
+
+ logger_.debug("... checking for Semantic Equality.");
+ }
+
+ boolean semantic_equality = checkForSemanticEquality(minimum_blocks);
+
+ if (minimum_blocks.size() > 1)
+ {
+ logger_.debug("... Semantic Equality = " + semantic_equality);
+ }
+
+ if (!semantic_equality)
+ {
+ throw new SignatureException(314);
+ }
+
+ if (!minimum_blocks.isEmpty())
+ {
+ FoundBlock actual_block = (FoundBlock) minimum_blocks.get(0);
+
+ String signed_text = raw_text.substring(0, actual_block.getFirstKey().start_index);
+
+ SignatureObject signatureObject_ = new SignatureObject();
+ signatureObject_.setSigType(actual_block.std.getType());
+ signatureObject_.initByType();
+
+ int end_index = actual_block.end_index;
+ for (int i = 0; i < actual_block.found_keys.size(); i++)
+ {
+ FoundKey cur_key = (FoundKey) actual_block.found_keys.get(i);
+ int start_index = cur_key.getStartIndex() + cur_key.caption.length();
+
+ String value = raw_text.substring(start_index, end_index);
+
+ signatureObject_.setSigValueCaption(cur_key.getKey(), value, cur_key.caption);
+
+ end_index = cur_key.getStartIndex();
+ }
+
+ // this normalization is required to get rid of possible trailing newlines.
+ String normalized_text = normalizeText(signed_text);
+ SignatureHolder holder = new TextualSignatureHolder(normalized_text, signatureObject_);
+ return holder;
+ }
+
+ return null;
+ }
+
+ /**
+ * Tries to find a block of the given type in the text.
+ *
+ * @param text
+ * The text.
+ * @param sig_type_def
+ * The type of the block.
+ * @param old_style
+ * Tells, if the block is old style (SIG_KZ will be ignored), or if
+ * it is a new block.
+ * @return Returns a List of the found keys of the block, or null, if the
+ * block could not be found.
+ */
+ public static List findBlockInText(String text,
+ SignatureTypeDefinition sig_type_def, boolean old_style)
+ {
+ Vector keys = sig_type_def.getRevertSortedKeys();
+ Vector captions = sig_type_def.getRevertSortedCaptions();
+
+ int last_index = text.length();
+
+ List found_keys = new ArrayList();
+ for (int key_idx = 0; key_idx < keys.size(); key_idx++)
+ {
+ String key = (String) keys.get(key_idx);
+
+ if (old_style && key.equals(SignatureTypes.SIG_KZ))
+ {
+ // If separating the old style way - skip The "Kennzeichnung"
+ // key, because it wasn't present in old profiles.
+ continue;
+ }
+
+ String caption = (String) captions.get(key_idx);
+
+ int found_index = text.lastIndexOf(caption);
+
+ if (key.equals(SignatureTypes.SIG_ID))
+ {
+ if (found_index < 0 || found_index >= last_index)
+ {
+ // not found, SIG_ID is not required
+ continue;
+ }
+ FoundKey fk = new FoundKey(key, caption, found_index);
+ found_keys.add(fk);
+ }
+ else
+ {
+ if (found_index < 0 || found_index >= last_index)
+ {
+ // one key is not found - the profile doesn't match.
+ return null;
+ }
+
+ FoundKey fk = new FoundKey(key, caption, found_index);
+ found_keys.add(fk);
+ last_index = found_index;
+ }
+ }
+
+ sortFoundKeysDescendingly(found_keys);
+
+ boolean matched = checkThatOrderIsCorrectAndCorrectFoundKeys(found_keys, keys, old_style);
+ // boolean found_required = checkFoundRequiredKeys(found_keys, old_style);
+
+ if (matched)
+ {
+ return found_keys;
+ }
+ return null;
+ }
+
+ /**
+ * Sorts the FoundKeys List descendingly according to the start indices of the
+ * found keys (the first found key in the list will have the highest start
+ * index, the second one the second highest and so forth).
+ *
+ * @param found_keys
+ * The List of FoundKey objects to be sorted.
+ */
+ public static void sortFoundKeysDescendingly(List found_keys)
+ {
+ // sort the found_keys according to their start pos reversely.
+
+ Collections.sort(found_keys, new Comparator()
+ {
+ public int compare(Object arg0, Object arg1)
+ {
+ FoundKey fk0 = (FoundKey) arg0;
+ FoundKey fk1 = (FoundKey) arg1;
+ // sort reversely!
+ return fk1.start_index - fk0.start_index;
+ }
+ });
+ }
+
+ /**
+ * Sorts the FoundKeys List ascendingly according to the start indices of the
+ * found keys (the first found key in the list will have the lowest start
+ * index, the second one the second lowest and so forth).
+ *
+ * @param found_keys
+ * The List of FoundKey objects to be sorted.
+ */
+ public static void sortFoundKeysAscendingly(List found_keys)
+ {
+ // sort the found_keys according to their start pos.
+
+ Collections.sort(found_keys, new Comparator()
+ {
+ public int compare(Object arg0, Object arg1)
+ {
+ FoundKey fk0 = (FoundKey) arg0;
+ FoundKey fk1 = (FoundKey) arg1;
+ return fk0.start_index - fk1.start_index;
+ }
+ });
+ }
+
+ /**
+ * Checks that the found keys are in correct order regarding SIG_ID as
+ * optional key.
+ *
+ * <p>
+ * If the SIG_ID key is misplaced, it will be removed from the found keys
+ * list.
+ * </p>
+ *
+ * @param found_keys
+ * The found keys ordered descendingly to their start position
+ * @param profile_keys
+ * The profile keys.
+ * @param old_style
+ * Tells, if SIG_KZ should be ignored, or not.
+ * @return Returns true, if the keys are correct.
+ */
+ public static boolean checkThatOrderIsCorrectAndCorrectFoundKeys(
+ List found_keys, List profile_keys, boolean old_style)
+ {
+
+ int found_index = 0;
+ for (int profile_index = 0; profile_index < profile_keys.size(); profile_index++)
+ {
+ String key = (String) profile_keys.get(profile_index);
+
+ if (old_style && key.equals(SignatureTypes.SIG_KZ))
+ {
+ continue;
+ }
+
+ FoundKey found_key = (FoundKey) found_keys.get(found_index);
+
+ boolean match = key.equals(found_key.getKey());
+ if (match)
+ {
+ found_index++;
+ continue;
+ }
+
+ if (key.equals(SignatureTypes.SIG_ID))
+ {
+ continue;
+ }
+
+ // doesn't match
+ return false;
+ }
+
+ // remove all fields above the found_index - they are not correctly matched
+ // indices (should be only the ID
+ int size = found_keys.size();
+ for (int i = found_index; i < size; i++)
+ {
+ // this removes all (size - found_index) objects above found_index
+ found_keys.remove(found_index);
+ }
+
+ return true;
+ }
+
+ /**
+ * Sorts out early blocks and leaves only those at the bottom of the text.
+ *
+ * @param found_blocks
+ * The found blocks.
+ * @return Returns a list of the last blocks.
+ */
+ public static List sortOutEarlyBlocks(List found_blocks)
+ {
+ int last_most_index = Integer.MIN_VALUE;
+
+ List last_most_blocks = new ArrayList();
+ for (int block_index = 0; block_index < found_blocks.size(); block_index++)
+ {
+ FoundBlock block = (FoundBlock) found_blocks.get(block_index);
+
+ int this_last_index = block.getLastKey().start_index;
+ if (this_last_index < last_most_index)
+ {
+ // this block cannot be the last most block.
+ continue;
+ }
+ if (this_last_index == last_most_index)
+ {
+ last_most_blocks.add(block);
+ continue;
+ }
+ if (this_last_index > last_most_index)
+ {
+ last_most_blocks = new ArrayList();
+ last_most_blocks.add(block);
+ last_most_index = this_last_index;
+ }
+ }
+
+ return last_most_blocks;
+ }
+
+ /**
+ * Sorts out large blocks.
+ *
+ * @param found_blocks
+ * The found blocks.
+ * @return Returns a list of the smallest blocks.
+ */
+ public static List sortOutLargeBlocks(List found_blocks)
+ {
+ int last_min_size = Integer.MAX_VALUE;
+
+ List min_size_blocks = new ArrayList();
+ for (int block_index = 0; block_index < found_blocks.size(); block_index++)
+ {
+ FoundBlock block = (FoundBlock) found_blocks.get(block_index);
+
+ int size = block.getSize();
+
+ if (size > last_min_size)
+ {
+ // this block is larger
+ continue;
+ }
+ if (size == last_min_size)
+ {
+ min_size_blocks.add(block);
+ continue;
+ }
+ if (size < last_min_size)
+ {
+ min_size_blocks = new ArrayList();
+ min_size_blocks.add(block);
+ last_min_size = size;
+ }
+ }
+
+ return min_size_blocks;
+ }
+
+ /**
+ * Checks the list of blocks for semantic equality.
+ *
+ * @param found_blocks
+ * The list of found blocks.
+ * @return Returns true if all blocks are semantically equal.
+ */
+ public static boolean checkForSemanticEquality(List found_blocks)
+ {
+ if (found_blocks.size() <= 1)
+ {
+ return true;
+ }
+
+ for (int block_index = 0; block_index < found_blocks.size() - 1; block_index++)
+ {
+ FoundBlock first_block = (FoundBlock) found_blocks.get(block_index);
+ FoundBlock second_block = (FoundBlock) found_blocks.get(block_index + 1);
+
+ if (!first_block.isSemanticallyEqual(second_block))
+ {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ public static int getIndexOfFoundKey(List found_keys, String key)
+ {
+ for (int i = 0; i < found_keys.size(); i++)
+ {
+ FoundKey fk = (FoundKey) found_keys.get(i);
+ if (fk.getKey().equals(key))
+ {
+ return i;
+ }
+ }
+ return -1;
+ }
+
+ public static boolean containsFoundKey(List found_keys, String key)
+ {
+ return getIndexOfFoundKey(found_keys, key) >= 0;
+ }
+
+ /**
+ * Checks the found keys for the required keys regarding the old style.
+ *
+ * @param found_keys
+ * The found keys.
+ * @param old_style
+ * Flag that tells, if KZ is not required.
+ * @return Returns true, if all required keys were found.
+ */
+ public static boolean checkFoundRequiredKeys(List found_keys,
+ boolean old_style)
+ {
+ if (!containsFoundKey(found_keys, SignatureTypes.SIG_DATE))
+ {
+ return false;
+ }
+ if (!containsFoundKey(found_keys, SignatureTypes.SIG_ISSUER))
+ {
+ return false;
+ }
+ if (!containsFoundKey(found_keys, SignatureTypes.SIG_NUMBER))
+ {
+ return false;
+ }
+ if (!containsFoundKey(found_keys, SignatureTypes.SIG_VALUE))
+ {
+ return false;
+ }
+ if (!old_style && !containsFoundKey(found_keys, SignatureTypes.SIG_KZ))
+ {
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Verifies the List of SignatureHolders using the given connector.
+ *
+ * @param signature_holders
+ * The List of SignatureHolder objects to be verified.
+ * @param connector
+ * The connector.
+ * @return Returns the List of SignatureResponse objects.
+ * @throws PDFDocumentException
+ * F.e.
+ * @throws NormalizeException
+ * F.e.
+ * @throws SignatureException
+ * F.e.
+ */
+ public static List verifySignatureHolders(List signature_holders,
+ String connector) throws PDFDocumentException, NormalizeException, SignatureException
+ {
+ List results = new ArrayList();
+ for (int i = 0; i < signature_holders.size(); i++)
+ {
+ SignatureHolder holder = (SignatureHolder) signature_holders.get(i);
+
+ // logger_.debug();
+ // logger_.debug();
+ // logger_.debug("Verifying Holder " + i + "...");
+ // logger_.debug("holder[" + i + "].signed_text = " +
+ // holder.signed_text);
+ // logger_.debug("holder[" + i + "].sig_obj = ");
+ // logger_.debug("holder[" + i + "].type = " +
+ // (holder.signature_object.isTextual() ? "textual" : "binary"));
+ // logger_.debug(holder.signature_object.toString());
+
+ SignatureResponse result = verify(holder, connector);
+ results.add(result);
+
+ // logger_.debug();
+ // logger_.debug("check[" + i + "].cert = " +
+ // result.getCertificateCheckInfo());
+ // logger_.debug("check[" + i + "].sig = " +
+ // result.getSignatureCheckInfo().trim());
+ // logger_.debug("check[" + i + "].manifest = " +
+ // result.getSignatureManifestCheckInfo());
+ // logger_.debug();
+ }
+ return results;
+ }
+
+ /**
+ * Verifies a SignatureHolder using the given connector.
+ *
+ * @param signature_holder
+ * The SignatureHolder to be verified.
+ * @param connector
+ * The connector.
+ * @return Returns the SignatureResponse object.
+ * @throws NormalizeException
+ * F.e.
+ * @throws PDFDocumentException
+ * F.e.
+ * @throws SignatureException
+ * F.e.
+ */
+ public static SignatureResponse verify(SignatureHolder signature_holder,
+ String connector) throws NormalizeException, PDFDocumentException, SignatureException
+ {
+ String text_to_be_verified = signature_holder.getSignedText();
+
+ SignatureObject so_to_be_verified = signature_holder.getSignatureObject();
+
+ if (text_to_be_verified == null)
+ {
+ throw new SignatureException(311, "Document can not be verified because the text to be verified is either null.");
+ }
+ if (text_to_be_verified.length() <= 0)
+ {
+ throw new SignatureException(311, "Document can not be verified because the length of the text to be verified is 0. (length = " + text_to_be_verified.length() + ")");
+ }
+
+ if (so_to_be_verified == null)
+ {
+ throw new SignatureException(312, "Document can not be verified because no signature object are set.");
+ }
+
+ try
+ {
+ Connector connector_impl = ConnectorFactory.createConnector(connector);
+ return connector_impl.doVerify(text_to_be_verified, so_to_be_verified);
+ }
+ catch (ConnectorFactoryException e)
+ {
+ throw new SignatureException(310, e);
+ }
+ }
+
+ /**
+ * Signs the given text with the provided connector using the given signature
+ * type.
+ *
+ * @param text_to_sign
+ * The text String to be signed.
+ * @param signature_type
+ * The type of the signature.
+ * @param connector
+ * The connector.
+ * @param user_name
+ * The user name.
+ * @param user_password
+ * The user password.
+ * @return Returns the corresponding SignatureObject.
+ * @throws SignatureException
+ * F.e.
+ * @throws PDFDocumentException
+ * F.e.
+ */
+ public static SignatureObject sign(final String text_to_sign,
+ final String signature_type, final String connector,
+ final String user_name, final String user_password) throws SignatureException, PDFDocumentException
+ {
+ logger_.info("User signed a document: " + user_name);
+
+ if (text_to_sign == null) {
+ throw new SignatureException(301, "Signature can not be produced. Text is null.");
+ }
+ if (text_to_sign.length() <= 0)
+ {
+ throw new SignatureException(301, "Signature can not be produced. Text is empty. (length = " + text_to_sign.length() + ")");
+ }
+
+ try
+ {
+ Connector connector_impl = ConnectorFactory.createConnector(connector);
+ SignatureObject signed_signature_object = connector_impl.doSign(signature_type, user_name, text_to_sign);
+ return signed_signature_object;
+ }
+ catch (ConnectorFactoryException e)
+ {
+ throw new SignatureException(300, e);
+ }
+ }
+
+ /**
+ * Helper method that creates a SignatureObject and initializes it with the
+ * given type.
+ *
+ * @param signature_type
+ * The type.
+ * @return Returns the created SignatureObject.
+ * @throws SignatureException
+ * f.e.
+ * @throws SignatureTypesException
+ * f.e.
+ */
+ public static SignatureObject createSignatureObjectFromType(
+ final String signature_type) throws SignatureException, SignatureTypesException
+ {
+ SignatureObject sig_obj = new SignatureObject();
+ sig_obj.setSigType(signature_type);
+ sig_obj.initByType();
+
+ return sig_obj;
+ }
+
+ /**
+ * Signs the document using the given algorithm.
+ *
+ * @param algorithm
+ * The Signator algorithm to be used.
+ * @param pdf
+ * The PDF.
+ * @param signature_type
+ * The signature type.
+ * @param connector
+ * The connector.
+ * @param user_name
+ * The user name.
+ * @param user_password
+ * The password.
+ * @param pos
+ * The absolute position. If null, the position is either taken from
+ * the profile or computed automatically.
+ * @return Returns the SignResult.
+ * @throws PresentableException
+ * F.e.
+ */
+ public static SignResult sign(PdfASID algorithm, final byte[] pdf,
+ final String signature_type, final String connector,
+ final String user_name, final String user_password, TablePos pos) throws PresentableException
+ {
+ Signator signator = SignatorFactory.createSignator(algorithm);
+
+ IncrementalUpdateInformation iui = signator.prepareSign(pdf, signature_type, pos, ConnectorFactory.needsSIG_ID(connector));
+
+ iui.signed_signature_object = sign(iui.document_text, signature_type, connector, user_name, user_password);
+
+ SignResult sign_result = signator.finishSign(iui);
+
+ return sign_result;
+ }
+
+ /**
+ * Extracts and normalizes the text from the pdf.
+ *
+ * @param pdf
+ * The PDF document.
+ * @return Returns the text String.
+ * @throws PresentableException
+ * F.e.
+ */
+ public static String extractNormalizedTextTextual(final byte[] pdf) throws PresentableException
+ {
+// ByteArrayInputStream bais = new ByteArrayInputStream(pdf);
+// String raw_document_text = TextualSignature.extractTextTextual(bais);
+//
+// String document_text = normalizeText(raw_document_text);
+
+ return extractNormalizedTextTextual(pdf, pdf.length);
+ }
+
+ /**
+ * Extracts and normalizes the text from the pdf.
+ *
+ * @param pdf
+ * The PDF document.
+ * @param length
+ * The length of the PDF document. The decument is considered to be
+ * that long even if the byte array is longer.
+ * @return Returns the text String.
+ * @throws PresentableException
+ * F.e.
+ */
+ public static String extractNormalizedTextTextual(final byte[] pdf, final int length) throws PresentableException
+ {
+ ByteArrayInputStream bais = new ByteArrayInputStream(pdf, 0, length);
+ String raw_document_text = TextualSignature.extractTextTextual(bais);
+
+ String document_text = normalizeText(raw_document_text);
+
+ return document_text;
+ }
+
+ /**
+ * Normalizes the given text.
+ *
+ * @param text
+ * The text to be normalized.
+ * @return Returns the normalized text.
+ * @throws NormalizeException
+ * F.e.
+ */
+ public static String normalizeText(final String text) throws NormalizeException
+ {
+ Normalizer normalizer = new Normalizer();
+ String normalized_text = normalizer.normalize(text);
+ return normalized_text;
+ }
+
+ /**
+ * Creates the iText PDFPTable from a given SignatureObject.
+ *
+ * @param signature_object
+ * The SignatureObject.
+ * @return Returns the created PDFPTable.
+ * @throws PDFDocumentException
+ * F.e.
+ * @throws SignatureException
+ * F.e.
+ */
+ public static PdfPTable createPdfPTableFromSignatureObject(
+ final SignatureObject signature_object) throws PDFDocumentException, SignatureException
+ {
+ PDFSignatureCreation creation = new PDFSignatureCreation(signature_object);
+ PDFSignatureObject pdf_sig_obj = creation.getPDFSignatureObject();
+ PdfPTable pdf_table = (PdfPTable) pdf_sig_obj.getSignatureObject();
+
+ return pdf_table;
+ }
+
+ /**
+ * Sets the width of the table according to the layout of the document and
+ * calculates the y position where the PDFPTable should be placed.
+ *
+ * @param pdf
+ * The PDF document.
+ * @param pdf_table
+ * The PDFPTable to be placed.
+ * @return Returns the position where the PDFPTable should be placed.
+ * @throws PDFDocumentException
+ * F.e.
+ */
+ public static TablePos adjustTableAndCalculatePosition(final byte[] pdf,
+ PdfPTable pdf_table) throws PDFDocumentException
+ {
+ TablePos pos = new TablePos();
+
+ PdfReader reader = readInPdfDocument(pdf);
+
+ Rectangle psize = reader.getPageSizeWithRotation(reader.getNumberOfPages());
+ float page_width = psize.width();
+ float page_height = psize.height();
+
+ pos.width = page_width - SIGNATURE_BORDER;
+ pdf_table.setTotalWidth(pos.width);
+ pdf_table.setLockedWidth(true);
+
+ pos.pos_x = SIGNATURE_BORDER / 2;
+
+ float table_height = pdf_table.getTotalHeight();
+ float page_length = PDFUtilities.calculateLastPageLength(pdf);
+ pos.pos_y = page_height - page_length - SIGNATURE_MARGIN;
+
+ pos.page = reader.getNumberOfPages();
+ if (pos.pos_y <= table_height)
+ {
+ pos.page = -1;
+ // negative means to add a new page
+ pos.pos_y = page_height - SIGNATURE_BORDER / 2;
+ }
+
+ return pos;
+ }
+
+ /**
+ * Creates an iText Reader that parses the document.
+ * <p>
+ * This is a convenience function for wrapping the Reader's exceptions into
+ * PDFDocumentException.
+ * </p>
+ *
+ * @param pdf
+ * The PDF document.
+ * @return Returns the created PdfReader.
+ * @throws PDFDocumentException
+ * F.e.
+ */
+ public static PdfReader readInPdfDocument(final byte[] pdf) throws PDFDocumentException
+ {
+ try
+ {
+ return new PdfReader(pdf);
+ }
+ catch (IOException e)
+ {
+ throw new PDFDocumentException(201, e);
+ }
+ }
+
+ /**
+ * Parses the TablePos object from a given String with the appropriate format.
+ *
+ * @param pos_string
+ * The pos string. e.g. 1;40.0;600.0;300.0
+ * @return Returns the parsed TablePos object.
+ * @throws PDFDocumentException
+ * Thrown, if the String doesn't have the proper format.
+ */
+ public static TablePos parsePositionFromPosString(String pos_string) throws PDFDocumentException
+ {
+ String[] strs = pos_string.split(";");
+ if (strs.length != 4)
+ {
+ throw new PDFDocumentException(224, "Pos string (=" + pos_string + ") is invalid.");
+ }
+
+ try
+ {
+ TablePos pos = new TablePos();
+ pos.page = Integer.parseInt(strs[0]);
+ pos.pos_x = Float.parseFloat(strs[1]);
+ pos.pos_y = Float.parseFloat(strs[2]);
+ pos.width = Float.parseFloat(strs[3]);
+
+ if (pos.page < 1 && pos.page != -1)
+ {
+ throw new PDFDocumentException(225, "pos.page (=" + pos.page + ") must not be lower than -1 and must not be 0.");
+ }
+
+ if (pos.width <= 0.0f)
+ {
+ throw new PDFDocumentException(226, "pos.width (=" + pos.width + ") must not be lower or equal 0.");
+ }
+
+ return pos;
+ }
+ catch (NumberFormatException e)
+ {
+ throw new PDFDocumentException(224, "Pos string (=" + pos_string + ") cannot be parsed.");
+ }
+ }
+}
diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/PdfASID.java b/src/main/java/at/knowcenter/wag/egov/egiz/PdfASID.java
new file mode 100644
index 0000000..0193368
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/egov/egiz/PdfASID.java
@@ -0,0 +1,173 @@
+/**
+ * <copyright> Copyright (c) 2006 by Know-Center, Graz, Austria </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+ * NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
+ * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES.
+ *
+ * $Id: PdfASID.java,v 1.1 2006/08/25 17:04:16 wprinz Exp $
+ */
+package at.knowcenter.wag.egov.egiz;
+
+import java.io.Serializable;
+
+import at.knowcenter.wag.egov.egiz.exceptions.InvalidIDException;
+
+/**
+ * This class encapsulates the Pdf-AS ID ("Kennzeichnung") urn.
+ *
+ * @author wprinz
+ */
+public class PdfASID implements Serializable
+{
+
+ /**
+ * SVUID.
+ */
+ private static final long serialVersionUID = 4776635173830445739L;
+
+ /**
+ * The urn word that leads in the identifier.
+ */
+ protected static final String URN = "urn";
+
+ /**
+ * The namespace of the urn.
+ */
+ protected static final String NAMESPACE = "pdfsigfilter";
+
+ /**
+ * The separator between urn blocks.
+ */
+ protected static final String SPLIT_STRING = ":";
+
+ /**
+ * The vendor.
+ */
+ protected String vendor = null;
+
+ /**
+ * The algorithm type.
+ */
+ protected String type = null;
+
+ /**
+ * The version of the algorithm.
+ */
+ protected String version = null;
+
+ /**
+ * Constructor that fills in the parameters directly.
+ *
+ * @param vendor
+ * @param type
+ * @param version
+ */
+ public PdfASID(String vendor, String type, String version)
+ {
+ set(vendor, type, version);
+ }
+
+ /**
+ * Parses the given id String and throws an Exception if it is not valid.
+ *
+ * @param id
+ * The id String to be parsed.
+ */
+ public PdfASID(String id) throws InvalidIDException
+ {
+ String[] tokens = id.split(SPLIT_STRING);
+
+ if (tokens.length != 5)
+ {
+ throw new InvalidIDException(800, "The doesn't have enough tokens (" + id + ")");
+ }
+
+ if (!tokens[0].equals(URN))
+ {
+ throw new InvalidIDException(800, "The id must start with " + URN + " (" + id + ")");
+ }
+
+ if (!tokens[1].equals(NAMESPACE))
+ {
+ throw new InvalidIDException(800, "The namespace of the id must be " + NAMESPACE + " (" + id + ")");
+ }
+
+ set(tokens[2], tokens[3], tokens[4]);
+ }
+
+ /**
+ * Copy Constructor.
+ *
+ * @param other
+ * The other PdfASID to copy the data from.
+ */
+ public PdfASID(final PdfASID other)
+ {
+ set(other.vendor, other.type, other.version);
+ }
+
+ /**
+ * Auxiliary constructor.
+ *
+ * @param vendor
+ * The vendor.
+ * @param type
+ * The type.
+ * @param version
+ * The version.
+ */
+ private void set(String vendor, String type, String version)
+ {
+ this.vendor = vendor;
+ this.type = type;
+ this.version = version;
+ }
+
+ /**
+ * Returns the type.
+ *
+ * @return Returns the type.
+ */
+ public String getType()
+ {
+ return this.type;
+ }
+
+ /**
+ * Returns the vendor.
+ *
+ * @return Returns the vendor.
+ */
+ public String getVendor()
+ {
+ return this.vendor;
+ }
+
+ /**
+ * Returns the version.
+ *
+ * @return Returns the version.
+ */
+ public String getVersion()
+ {
+ return this.version;
+ }
+
+ /**
+ * @see java.lang.Object#toString()
+ */
+ public String toString()
+ {
+ return URN + SPLIT_STRING + NAMESPACE + SPLIT_STRING + this.vendor + SPLIT_STRING + this.type + SPLIT_STRING + this.version;
+ }
+
+}
diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/cfg/ConfigLogger.java b/src/main/java/at/knowcenter/wag/egov/egiz/cfg/ConfigLogger.java
new file mode 100644
index 0000000..3b32c22
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/egov/egiz/cfg/ConfigLogger.java
@@ -0,0 +1,71 @@
+/*
+ * <copyright>
+ * Copyright (c) 2006 by Know-Center, Graz, Austria
+ * </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF THE
+ * SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE,
+ * OR NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES
+ * SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING
+ * THIS SOFTWARE OR ITS DERIVATIVES.
+ *
+ * $Id: ConfigLogger.java,v 1.3 2006/08/30 13:55:50 wprinz Exp $
+ */
+package at.knowcenter.wag.egov.egiz.cfg;
+
+import java.util.ArrayList;
+
+import org.apache.log4j.Level;
+import org.apache.log4j.Logger;
+
+/**
+ * This logger class is the main logger class for the pdf-as project. It holds static logger
+ * instances with could be configured the level with one method.
+ */
+public class ConfigLogger {
+
+ /**
+ * The static logger cache. It holds all used logger instances that could be configured by this
+ * main class.
+ */
+ private static ArrayList logger_ = new ArrayList();
+ /**
+ * This is the Level to use. Default is INFO.
+ */
+ private static Level level_ = Level.INFO;
+
+ /**
+ * This method activates a new log4j logger instance and store the instance in the local logger
+ * store.
+ *
+ * @param classRef the caller class to be set
+ * @return a log4j logger instance
+ * @see Logger
+ */
+ public static Logger getLogger(Class classRef) {
+ Logger logger = Logger.getLogger(classRef);
+ //logger.setLevel(level_);
+ logger_.add(logger);
+ return logger;
+ }
+
+ /**
+ * This method is to set a new logger level for all stored config logger.
+ *
+ * @param level the level to set
+ */
+ public static void setLevel(Level level) {
+ level_ = level;
+ for (int log_idx = 0; log_idx < logger_.size(); log_idx++) {
+ Logger logger = (Logger) logger_.get(log_idx);
+ logger.setLevel(level_);
+ logger_.set(log_idx, logger);
+ }
+ }
+} \ No newline at end of file
diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/cfg/PropertyTree.java b/src/main/java/at/knowcenter/wag/egov/egiz/cfg/PropertyTree.java
new file mode 100644
index 0000000..fd700fe
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/egov/egiz/cfg/PropertyTree.java
@@ -0,0 +1,348 @@
+/*
+ * <copyright>
+ * Copyright (c) 2006 by Know-Center, Graz, Austria
+ * </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF THE
+ * SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE,
+ * OR NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES
+ * SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING
+ * THIS SOFTWARE OR ITS DERIVATIVES.
+ *
+ * $Id: PropertyTree.java,v 1.4 2006/10/31 08:06:28 wprinz Exp $
+ */
+package at.knowcenter.wag.egov.egiz.cfg;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Vector;
+
+/**
+ * This class can be used to store a property config tree. The property key are separated by the
+ * {@link at.knowcenter.wag.egov.egiz.cfg.PropertyTree#SPLIT_STRING}. Therefore the keys an also
+ * the values of a configuration is stored in nested hashes. The keys in an area are stored in a
+ * HashMap. The values of a key are stored in a Vector to overload some keys. The property tree can
+ * be used to extract sub nodes and sub keys of different tree levels.
+ *
+ * @author wlackner
+ * @see java.util.HashMap
+ * @see java.util.Vector
+ */
+public class PropertyTree implements Serializable {
+
+ /**
+ * SVUID.
+ */
+ private static final long serialVersionUID = -1686170519955886222L;
+
+ /**
+ * The key split string. A key can be a complex key. Sub keys are separated from each other with
+ * the split string. This string is used to devide the complex key.
+ */
+ public static final String SPLIT_STRING = "\\.";
+ /**
+ * Stores the key references to the sub nodes
+ */
+ private Map keys_ = new HashMap(3);
+ /**
+ * Stores all values of a node
+ */
+ private Vector values_ = new Vector(3);
+
+ /**
+ * The default constructor od the class.
+ */
+ public PropertyTree() {
+ }
+
+ /**
+ * This method takes a key value tupel and store them in the property tree. The key splitted into
+ * different levels (splitted by the string
+ * {@link at.knowcenter.wag.egov.egiz.cfg.PropertyTree#SPLIT_STRING}). All subnodes not stored in
+ * the tree will be created. The last part of the key (last splitted element) adds the value to
+ * there own value data structure (Vector). <br />
+ * <strong>Example: </strong> <code>setKeyValue("key.1_level.2_level","the value for k_1_2")</code
+ *
+ * @param splitKey the key that has to be store the value
+ * @param value only String values can be stored
+ */
+ public void setKeyValue(String splitKey, String value) {
+ String[] keys = splitKey.split(SPLIT_STRING);
+ PropertyTree curr_tree = this;
+ for (int key_idx = 0; key_idx < keys.length; key_idx++) {
+ String key = keys[key_idx];
+ if (!curr_tree.containsNode(key)) {
+ curr_tree.setSubTree(key, null);
+ }
+ if (key_idx < keys.length - 0)
+ curr_tree = (PropertyTree) curr_tree.getSubTree(key);
+ }
+ curr_tree.addValue(value);
+ }
+
+ /**
+ * Adds a String value to the current key
+ *
+ * @param value
+ */
+ private void addValue(String value) {
+ values_.add(value);
+ }
+
+ /**
+ * This method takes a key as input value, split them into subnodes and return the sub tree of the
+ * last node of the key. If the key or a sub node not found, the method return null. This means
+ * the key is not part of the sub property tree.
+ *
+ * @param splitKey the key that has to be found as sub node of the current node
+ * @return the sub tree (PropertyTree) or <code>null</code> if the key is not a subtree referece
+ */
+ private PropertyTree getLastSubTree(String splitKey) {
+ String[] keys = splitKey.split(SPLIT_STRING);
+ PropertyTree curr_tree = this;
+ for (int key_idx = 0; key_idx < keys.length; key_idx++) {
+ String key = keys[key_idx];
+ if (!curr_tree.containsNode(key)) {
+ return null;
+ }
+ curr_tree = (PropertyTree) curr_tree.getSubNode(key);
+ }
+ return curr_tree;
+ }
+
+ /**
+ * This method return the subtree that corresponds to a particular key. The key does not split.
+ * Therefore the key must be a children of the current node. Search only in the key map of the
+ * current node.
+ *
+ * @param key the key that has to be a sub node
+ * @return a sub tree (PropertyTree) or <code>null</code> if the key is not a children of the
+ * current node
+ */
+ private PropertyTree getSubNode(String key) {
+ return (PropertyTree) keys_.get(key);
+ }
+
+ /**
+ * Returns the last value (keys can be overloaded) of a key. The key are splitted into subnodes
+ * and the last node of the key is the current value holder. If a key or subnode is not in the sub
+ * tree the return value is <code>null.</code>
+ *
+ * @param key the key that holds the value (can be a nested key like <code>"key.1.2.3"</code>)
+ * @return the value of the key (last node of the key) or <code>null</code> otherwise
+ */
+ public String getLastValue(String key) {
+ PropertyTree curr_tree = getLastSubTree(key);
+ String result = null;
+ if (curr_tree != null && !curr_tree.values_.isEmpty()) {
+ result = (String) curr_tree.values_.lastElement();
+ }
+// if (logger_.isDebugEnabled()) {
+// logger_.debug("getLastValue:" + key + "=" + result);
+// }
+ return result;
+ }
+
+ /**
+ * Returns the first value (keys can be overloaded) of a key. The key are splitted into subnodes
+ * and the last node of the key is the current value holder. If a key or subnode is not in the sub
+ * tree the return value is <code>null</code>.
+ *
+ * @param key the key that holds the value (can be a nested key like <code>"key.1.2.3"</code>)
+ * @return the value of the key (last node of the key) or <code>null</code> otherwise
+ */
+ public String getFirstValue(String key) {
+ PropertyTree curr_tree = getLastSubTree(key);
+ String result = null;
+ if (curr_tree != null && !curr_tree.values_.isEmpty()) {
+ result = (String) curr_tree.values_.firstElement();
+ }
+// if (logger_.isDebugEnabled()) {
+// logger_.debug("getFirstValue:" + key + "=" + result);
+// }
+ return result;
+ }
+
+ /**
+ * This method return all values of the current node. The values are stored as String values.
+ *
+ * @return the values (type String) of the current node
+ * @see Vector
+ */
+ public Vector getValues() {
+ return values_;
+ }
+
+ /**
+ * This method return all keys (sub tree references) of the current node as a Map. The keys are
+ * stored as String values.
+ *
+ * @return the keys (type String) of the current node
+ * @see Map
+ */
+ public Map getKeyEntries() {
+ return keys_;
+ }
+
+ /**
+ * This method return all keys (sub tree references) of the current node as an ArrayList. The keys
+ * are stored as String values.
+ *
+ * @return the keys (type String) of the current node
+ * @see ArrayList
+ */
+ public ArrayList getKeys() {
+ if (!keys_.isEmpty()) {
+ Object[] objs = keys_.keySet().toArray();
+ ArrayList keys = new ArrayList(objs.length);
+ for (int idx = 0; idx < objs.length; idx++) {
+ keys.add((String) objs[idx]);
+ }
+ return keys;
+ }
+ return null;
+ }
+
+ /**
+ *
+ * This method return all sub tree references of a key as an ArrayList. The keys are stored as
+ * String values.
+ *
+ * @param key (can be a nested key like <code>"key.1.2.3"</code>)
+ * @return the keys (type String) of the current node
+ * @see ArrayList
+ */
+ public ArrayList getKeys(String key) {
+ PropertyTree curr_tree = getLastSubTree(key);
+ if (curr_tree != null) {
+ return curr_tree.getKeys();
+ }
+ return null;
+ }
+
+ /**
+ * This method return all values of a key. The values are stored as String values.
+ *
+ * @param key (can be a nested key like <code>"key.1.2.3"</code>)
+ * @return the values (type Vector) of the key or <code>null</code> if the key is not in the sub
+ * tree of the current node
+ * @see Vector
+ */
+ public Vector getValues(String key) {
+ PropertyTree curr_tree = getLastSubTree(key);
+ if (curr_tree != null) {
+ return curr_tree.values_;
+ }
+ return null;
+ }
+
+ /**
+ * Store a sub tree (type PropertyTree) in the current node. The key and it's sub tree are stored
+ * in a HashMap.
+ *
+ * @param key the reference of the sub tree
+ * @param tree the sub tree of the key
+ * @see HashMap
+ */
+ private void setSubTree(String key, PropertyTree tree) {
+ if (tree == null) {
+ tree = new PropertyTree();
+ }
+ keys_.put(key, tree);
+ }
+
+ /**
+ * Extracts a sub tree of a nested key. The Method returns the last sub tree of the nested key.
+ * <strong>Example: </strong>if the key is like: <code>key.1.2.3</code> the sub tree of the last
+ * node <code>3</code> is returned.
+ *
+ * @param key the reference of the sub tree
+ * @return a sub tree of the key or <code>null</code> if the key can not be found
+ */
+ public PropertyTree getSubTree(String key) {
+ return getLastSubTree(key);
+ }
+
+ /**
+ * This method checks if a key is a reference to a sub tree in the current node.
+ *
+ * @param key a simple key that is a parent reference of a sub tree
+ * @return true if the key is found, false otherwise
+ */
+ public boolean containsNode(String key) {
+ return keys_.containsKey(key);
+ }
+
+ /**
+ * The default toString method. It starts with the current node recursively downwards and return
+ * the String representation of the node.
+ *
+ * @return the string representation of the node
+ */
+ public String toString() {
+ return toString("", this);
+ }
+
+ /**
+ * This is a helper function to define the prefix for different levels in the toString method, not
+ * realy nice ;-).
+ * It replaces all "." chars with " ".
+ *
+ * @param key
+ * @return a replaces prefix string
+ */
+ private static String getEmptyString(String key) {
+ return key.replaceAll(".", " ");
+ }
+
+ /**
+ * This method concatenates all values of the current node and return them as a combinded string.
+ *
+ * @param prefix
+ * @param tree
+ * @return the string representation of the node values
+ */
+ private static String printValues(String prefix, PropertyTree tree) {
+ String os = "";
+ Iterator values = tree.getValues().iterator();
+ while (values.hasNext()) {
+ String value = (String) values.next();
+ os += prefix + "=" + value;
+ }
+ return os;
+ }
+
+ /**
+ * The toString method. It starts with a special level prefix, sub tree and recursively adds all
+ * sub trees.
+ *
+ * @param prefix the prefix for this node
+ * @param tree the current node
+ * @return the string representation of the node
+ */
+ public static String toString(String prefix, PropertyTree tree) {
+ String os = "";
+ Iterator entries = tree.getKeyEntries().entrySet().iterator();
+ while (entries.hasNext()) {
+ Map.Entry entry = (Map.Entry) entries.next();
+ String key = (String) entry.getKey();
+ PropertyTree sub = (PropertyTree) entry.getValue();
+ String os_key = "\n" + prefix + "." + key;
+ os += printValues(os_key, sub);
+ String subs = toString(prefix + getEmptyString(key) + " |", sub);
+ if (subs.length() > 0) {
+ os += os_key + "|" + subs;
+ }
+ }
+ return os;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/cfg/Settings.java b/src/main/java/at/knowcenter/wag/egov/egiz/cfg/Settings.java
new file mode 100644
index 0000000..b8eb35e
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/egov/egiz/cfg/Settings.java
@@ -0,0 +1,57 @@
+/*
+ * <copyright>
+ * Copyright (c) 2006 by Know-Center, Graz, Austria
+ * </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF THE
+ * SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE,
+ * OR NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES
+ * SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING
+ * THIS SOFTWARE OR ITS DERIVATIVES.
+ *
+ * $Id: Settings.java,v 1.2 2006/08/03 07:43:03 wprinz Exp $
+ */
+
+package at.knowcenter.wag.egov.egiz.cfg;
+
+import at.knowcenter.wag.egov.egiz.exceptions.SettingNotFoundException;
+
+/**
+ * Defines an interface reading a configuration file.
+ *
+ * @author wlackner
+ */
+public interface Settings {
+ /**
+ * Search for a key in the configuration file.
+ *
+ * @param key to search for
+ * @return the corresponding value
+ * @throws SettingNotFoundException if the key is not found
+ */
+ public String getSetting(String key) throws SettingNotFoundException;
+
+ /**
+ * Search for a key in the configuration file.
+ *
+ * @param key to search for
+ * @param defaultValue return this value if the key is not found
+ * @return the corresponding value
+ */
+ public String getSetting(String key, String defaultValue);
+
+ /**
+ *
+ * @param primaryKey to search for
+ * @param defaultKey to search for if the primaryKey is not found
+ * @param defaultValue return this value if the defaultKey is not found
+ * @return the corresponding value
+ */
+ public String getSetting(String primaryKey, String defaultKey, String defaultValue);
+} \ No newline at end of file
diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/cfg/SettingsReader.java b/src/main/java/at/knowcenter/wag/egov/egiz/cfg/SettingsReader.java
new file mode 100644
index 0000000..a884140
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/egov/egiz/cfg/SettingsReader.java
@@ -0,0 +1,683 @@
+/**
+ * <copyright> Copyright (c) 2006 by Know-Center, Graz, Austria </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+ * NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
+ * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES.
+ *
+ * $Id: SettingsReader.java,v 1.6 2006/10/31 08:06:36 wprinz Exp $
+ */
+
+package at.knowcenter.wag.egov.egiz.cfg;
+
+import java.io.FileInputStream;
+import java.io.File;
+import java.io.IOException;
+import java.io.Serializable;
+import java.util.Vector;
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.Properties;
+
+import org.apache.log4j.Level;
+import org.apache.log4j.Logger;
+
+import at.knowcenter.wag.egov.egiz.exceptions.SettingNotFoundException;
+import at.knowcenter.wag.egov.egiz.exceptions.SettingsException;
+
+/**
+ * The SettingsReader reads the <code>settings.txt</code> file. The
+ * <code>settings.txt</code> is a simple java property file that collects all
+ * parameters used in different modules.
+ *
+ * The SettingsReader provides methods to get the property keys and the
+ * corresponding values. The keys could be defined as combinations of single
+ * keys. Therefore it is possible to combine differen classes of keys. An
+ * example could be:
+ *
+ * <pre>
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ * #SettingNotFoundException
+ * error.code.100=Interner Fehler
+ * error.code.101=Die Konfigurationsdatei konnte nicht geladen werden
+ *
+ * #PDFDocumentException
+ * error.code.200=Das Dokument konnte nicht geladen werden
+ *
+ * #SignatureException
+ * error.code.300=Die Signatur ist ungültig
+ *
+ * #NormalizeException
+ * error.code.400=Die angegebene Version ist nicht bekannt
+ *
+ * normalizer.version=V01
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ * </pre>
+ *
+ * The internal representation of the example above is:
+ *
+ * <pre>
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ * .error|
+ * |.code|
+ * | |.200=Das Dokument konnte nicht geladen werden
+ * | |.100=Interner Fehler
+ * | |.400=Die angegebene Version ist nicht bekannt
+ * | |.101=Die Konfigurationsdatei konnte nicht geladen werden
+ * | |.300=Die Signatur ist ungültig
+ * .normalizer|
+ * |.version=V01
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ * </pre>
+ *
+ * @author wlackner
+ */
+public class SettingsReader implements Settings, Serializable
+{
+
+ /**
+ * SVUID.
+ */
+ private static final long serialVersionUID = -8754114172766023454L;
+
+ /**
+ * The system File separator char
+ */
+ private static final String FILE_SEP = System.getProperty("file.separator");
+
+ // /**
+ // * The system temp file path
+ // */
+ // private static final String TEMP_FILE_PATH =
+ // System.getProperty("java.io.tmpdir");
+
+ /**
+ * The current user path
+ */
+ private static final String USER_DIR = System.getProperty("user.dir");
+
+// /**
+// * The home path of the tomcat webaplication
+// */
+// private static final String CATALINA_HOME = System.getProperty("catalina.home");
+
+// /**
+// * The default application name used in templates, settings, jsp's etc.
+// */
+// private static final String APPL_NAME = "pdf-as";
+
+ // private static final String APPL_NAME = "egiz";
+ /**
+ * The config file path postfix
+ */
+ private static final String CFG = "cfg";
+
+ /**
+ * The file path postfix where certificates are stored
+ */
+ private static final String CERT = "certificates";
+
+// /**
+// * The web application path
+// */
+// private static final String WEB_APPL_DIR = "webapps" + FILE_SEP + APPL_NAME + FILE_SEP;
+
+ /**
+ * The path of the resources repository.
+ *
+ * <p>
+ * This usually contains sub directories for the templates, the configuration
+ * files, etc.
+ * </p>
+ */
+ public static String RESOURCES_PATH = null;
+
+ /**
+ * The path of the configuration directory.
+ */
+ public static String CONFIG_PATH = null;
+
+ /**
+ * The path of the certificated directory.
+ */
+ public static String CERT_PATH = null;
+
+ /**
+ * The name of the directory, where temporary files are stored.
+ */
+ protected static String TEMP_DIR_NAME = "pdfastmp";
+
+ // /**
+ // * The application config path for the command line tool
+ // */
+ // public static final String APPL_CONFIG_PATH = USER_DIR + FILE_SEP + CFG +
+ // FILE_SEP;
+ //
+ // /**
+ // * The application config path for the web application
+ // */
+ // public static final String WEB_CONFIG_PATH = CATALINA_HOME + FILE_SEP +
+ // WEB_APPL_DIR + CFG + FILE_SEP;
+ //
+ // /**
+ // * The certificates path for the command line tool
+ // */
+ // public static final String APPL_CERT_PATH = USER_DIR + FILE_SEP + CERT +
+ // FILE_SEP;
+ //
+ // /**
+ // * The certificates path for the cweb application
+ // */
+ // public static final String WEB_CERT_PATH = CATALINA_HOME + FILE_SEP +
+ // WEB_APPL_DIR + CERT + FILE_SEP;
+
+ /**
+ * The name of the default configuration file. The definition syntax is the
+ * java property config syntax.
+ */
+ public static final String CONFIG_FILE_DEFAULT_NAME = "config.properties";
+
+ /**
+ * The name of the help text configuration file. The definition syntax is the
+ * java property config syntax.
+ */
+ public static final String HELP_TEXT_FILE_DEFAULT_NAME = "help_text.properties";
+
+ /**
+ * The java properties from the settings file.
+ */
+ private Properties properties_ = null;
+
+ /**
+ * The settings reader instance. Used to make the class singleton.
+ */
+ private static SettingsReader instance_ = null;
+
+ /**
+ * The reference to the settings file.
+ */
+ private static String settingsFile_ = null;
+
+ /**
+ * The reference to the property representation of the settings file.
+ */
+ private PropertyTree pTree_ = new PropertyTree();
+
+ /**
+ * The logger definition.
+ */
+ private static final Logger logger_ = ConfigLogger.getLogger(SettingsReader.class);
+
+ /**
+ * Make this constructor private. Use the method
+ * {@link SettingsReader#getInstance()}to get an instance from this class.
+ * The only cause to do this is that the definition file should only be read
+ * once while getting often this instance. The method throws an IOException if
+ * the settings file could not be read.
+ *
+ * @param settingsFile
+ * load this file, if the <code>settingsFile == null</code> the
+ * default settings ({@link SettingsReader#CONFIG_FILE_DEFAULT_NAME})
+ * file is used
+ * @throws SettingsException
+ * if the settings file could not be read
+ */
+ private SettingsReader(String settingsFile) throws SettingsException
+ {
+ try
+ {
+ String cfg_path = CONFIG_PATH;
+ properties_ = new Properties();
+ if (settingsFile == null)
+ {
+ settingsFile = cfg_path + CONFIG_FILE_DEFAULT_NAME;
+ }
+ settingsFile_ = settingsFile;
+ if (logger_.isInfoEnabled())
+ {
+ File file = new File(settingsFile_);
+ logger_.info("load Settings:" + file.getAbsolutePath());
+ // Properties sys_prop = System.getProperties();
+ // Enumeration prop_keys = sys_prop.propertyNames();
+ // while (prop_keys.hasMoreElements()) {
+ // String key = (String) prop_keys.nextElement();
+ // String value = sys_prop.getProperty(key);
+ // logger_.info(key + "=" + value);
+ // }
+ }
+ FileInputStream sfs = new FileInputStream(settingsFile_);
+ properties_.load(sfs);
+
+ Properties help_prop = new Properties();
+ FileInputStream hfs = new FileInputStream(cfg_path + HELP_TEXT_FILE_DEFAULT_NAME);
+ help_prop.load(hfs);
+
+ // load properties from current package!
+ // properties_.load(getClass().getResourceAsStream(settingsFile_));
+ Enumeration prop_keys = properties_.propertyNames();
+ while (prop_keys.hasMoreElements())
+ {
+ String key = (String) prop_keys.nextElement();
+ String value = properties_.getProperty(key);
+ pTree_.setKeyValue(key, value);
+ }
+ prop_keys = help_prop.propertyNames();
+ while (prop_keys.hasMoreElements())
+ {
+ String key = (String) prop_keys.nextElement();
+ String value = help_prop.getProperty(key);
+ properties_.setProperty(key, value);
+ pTree_.setKeyValue(key, value);
+ }
+ }
+ catch (IOException e)
+ {
+ throw new SettingsException(e);
+ }
+ }
+
+ /**
+ * This method returns an synchronized instance of this class. The settings
+ * file is read only once using this class. This method returns the instance
+ * holding the definitions of the default settings file. Default file:
+ * {@link SettingsReader#CONFIG_FILE_DEFAULT_NAME}: "settings.txt"
+ *
+ * @return an instance of the SettingsReader
+ * @throws SettingsException
+ * if the default settings file could not be read
+ */
+ public synchronized static SettingsReader getInstance() throws SettingsException
+ {
+ return getInstance(null);
+ }
+
+ /**
+ * This method returns an synchronized instance of this class. The settings
+ * file is read only once using this class. This method returns the instance
+ * holding the definitions of the settingsFile. If the input param
+ * <code>settingsFile == null</code> the default settings file will be load.
+ * Default file: {@link SettingsReader#CONFIG_FILE_DEFAULT_NAME}:
+ * "settings.txt"
+ *
+ * If an instance of this class exist, the input param is ignored! The
+ * SettingsReader is singleton and therefore the first
+ * {@link SettingsReader#getInstance()}defines the settings file that has to
+ * be loaded. This means changes between a application lifecyle can not be
+ * done!
+ *
+ * @param settingsFile
+ * the settings file that should be load.
+ * @return an instance of the SettingsReader
+ * @throws SettingsException
+ * if the settings file could not be read
+ */
+ private synchronized static SettingsReader getInstance(String settingsFile) throws SettingsException
+ {
+ if (instance_ == null)
+ {
+ instance_ = new SettingsReader(settingsFile);
+ }
+ return instance_;
+ }
+
+ /**
+ * This method returns a property value to the corresponding key. If the key
+ * is not found in the property file a SettingNotFoundException is thrown.
+ *
+ * @param key
+ * get the value for that key in the property file
+ * @return the value of the property key.
+ * @throws SettingNotFoundException
+ * ErrorCode: 100
+ */
+ public String getSetting(String key) throws SettingNotFoundException
+ {
+ String result = properties_.getProperty(key);
+ if (result == null)
+ {
+ String log_message = "Configuration key not found: '" + key + "'! Check '" + settingsFile_ + "' file.";
+ if (logger_.isEnabledFor(Level.WARN))
+ {
+ logger_.warn(log_message);
+ }
+ SettingNotFoundException snf = new SettingNotFoundException(100, log_message);
+ throw snf;
+ }
+// if (logger_.isDebugEnabled())
+// {
+// logger_.debug("Get Property:" + key + "=" + result);
+// }
+ return result;
+ }
+
+ /**
+ * Relocates the relative file.
+ *
+ * @param file
+ * The relative file.
+ * @return Returns the usable file.
+ */
+ public static String relocateFile(String file)
+ {
+ // if (isWeb())
+ // {
+ // return CATALINA_HOME + FILE_SEP + WEB_APPL_DIR + file;
+ // }
+ //
+ // return file;
+ return RESOURCES_PATH + file;
+ }
+
+ /**
+ * This method returns a property value to the corresponding key. If the key
+ * is not found in the property file the input param defaultValue is returned.
+ *
+ * @param key
+ * get the value for that key in the property file
+ * @param defaultValue
+ * the default value if the key is not found
+ * @return the value of the property key
+ */
+ public String getSetting(String key, String defaultValue)
+ {
+
+ String result = properties_.getProperty(key);
+ if (result == null)
+ {
+ result = defaultValue;
+ }
+// if (logger_.isDebugEnabled())
+// {
+// logger_.debug("Get Property:" + key + "=" + result);
+// }
+ return result;
+ }
+
+ /**
+ * This method returns a property value to the corresponding key. If the key
+ * is not found in the property file the input param defaultKey is searched.
+ * If the default key is not found the input param defaultValue is returned.
+ *
+ * @param primaryKey
+ * get the value for that key in the property file
+ * @param defaultKey
+ * the default key that should be searched if the primaryKey is not
+ * found
+ * @param defaultValue
+ * the default value if the defaultKey is not found
+ * @return the value of the property key
+ */
+ public String getSetting(String primaryKey, String defaultKey,
+ String defaultValue)
+ {
+ String key = primaryKey;
+ String result = properties_.getProperty(key);
+ if (result == null)
+ {
+ key = defaultKey;
+ result = properties_.getProperty(key);
+ if (result == null)
+ {
+ result = defaultValue;
+ }
+ }
+// if (logger_.isDebugEnabled())
+// {
+// logger_.debug("Get Property:" + key + "=" + result);
+// }
+ return result;
+ }
+
+ /**
+ * This method returns an array of keys in the same hierarchy of the
+ * keyPrefix. The method search all keys in the property file that has the
+ * keyPrefix as leading substring. The <code>Object[]</code> collects all
+ * sub keys without the keyPrefix.
+ *
+ * @param keyPrefix
+ * to search for sub keys
+ * @return alls keys starting with the keyPrefix
+ */
+ public Vector getSettingKeys(String keyPrefix)
+ {
+ Vector keys = new Vector();
+ Enumeration names = properties_.propertyNames();
+ while (names.hasMoreElements())
+ {
+ String full_name = (String) names.nextElement();
+ if (full_name.indexOf(keyPrefix) == 0)
+ {
+ keys.add(full_name.substring(keyPrefix.length() + 1));
+ }
+ }
+ return keys;
+ }
+
+ /**
+ * If a property value is number (interger) this method extracts the value and
+ * convert it to an int. If the key ist not found or the conversion fails, the
+ * defaultValue is returned.
+ *
+ * @param key
+ * get the value for that key in the property file
+ * @param defaultValue
+ * the default value if the key is not found
+ * @return the int value of the property key
+ */
+ public int getIntSetting(String key, int defaultValue)
+ {
+ int int_property = defaultValue;
+ String value = null;
+ try
+ {
+ value = getSetting(key);
+ int_property = Integer.parseInt(value);
+ }
+ catch (NumberFormatException e)
+ {
+ if (logger_.isEnabledFor(Level.WARN))
+ {
+ logger_.warn("Can not convert " + value + " to int.");
+ }
+ }
+ catch (SettingNotFoundException e)
+ {
+ if (logger_.isEnabledFor(Level.WARN))
+ {
+ logger_.warn("Setting " + key + " not found, return default value:" + defaultValue);
+ }
+ }
+ return int_property;
+ }
+
+ /**
+ * This method returns an array of sub keys (children references) of the key.
+ * The method is a wrapper calling the method
+ * {@link PropertyTree#getKeys(String key)}.
+ *
+ * @param key
+ * get all sub keys for that key in the property file
+ * @return an list of sub keys (type String)
+ * @see PropertyTree
+ */
+ public ArrayList getKeys(String key)
+ {
+ return pTree_.getKeys(key);
+ }
+
+ /**
+ * This method returns a the first value from a key. This means the method
+ * search in the PropertyTree representation of the config file. The
+ * PropertyTree class can overload key value paires. But the config file can
+ * not overload keys. If a key is defined more than one times the last
+ * definition is stored it the property list. The method is a wrapper calling
+ * the method {@link PropertyTree#getFirstValue(String key)}.
+ *
+ * @param key
+ * get the value for that key in the property file
+ * @return the value of the property key
+ * @see PropertyTree
+ */
+ public String getValueFromKey(String key)
+ {
+ String value = pTree_.getFirstValue(key);
+// if (logger_.isDebugEnabled())
+// {
+// logger_.debug("getValueFromKey:" + key + "=" + value);
+// }
+ return value;
+ }
+
+ /**
+ * This method returns the PropertyTree representation of the configuration
+ * file.
+ *
+ * @return Returns the pTree.
+ * @see PropertyTree
+ */
+ public PropertyTree getPTree()
+ {
+ return pTree_;
+ }
+
+ // /**
+ // * This method checks the application context.
+ // *
+ // * @return true if the application is running in a webinterface, false
+ // * otherwise
+ // */
+ // public static boolean isWeb()
+ // {
+ // return CATALINA_HOME != null;
+ // }
+
+ /**
+ * Assembles the File of the temporary directory without checking if it really
+ * exists.
+ */
+ protected static File assembleTemporaryDirectoryFile()
+ {
+ File temp_dir = new File(RESOURCES_PATH + TEMP_DIR_NAME);
+ return temp_dir;
+ }
+
+ /**
+ * Returns the directory where temporary files should be stored.
+ *
+ * <p>
+ * If the directory doesn't exist, it is created.
+ * </p>
+ *
+ * @return Returns the directory where temporary files should be stored.
+ */
+ public static File getTemporaryDirectory()
+ {
+ File temp_dir = assembleTemporaryDirectoryFile();
+ if (!temp_dir.exists())
+ {
+ temp_dir.mkdirs();
+ }
+ return temp_dir;
+ }
+
+ /**
+ * Deletes all files in the temporary directory, if it exists.
+ *
+ * <p>
+ * This should be used to clear temporary files when the application shuts
+ * down.
+ * </p>
+ */
+ public static void clearTemporaryDirectory()
+ {
+ File temp_dir = assembleTemporaryDirectoryFile();
+ logger_.info("Clearing temporary directory: " + temp_dir);
+
+ if (!temp_dir.exists())
+ {
+ return;
+ }
+
+ File[] files = temp_dir.listFiles();
+ for (int i = 0; i < files.length; i++)
+ {
+ logger_.info(" Clearing temporary file: " + files[i]);
+ boolean delete_success = files[i].delete();
+ if (!delete_success)
+ {
+ logger_.error("Couldn't delete the temporary file: " + files[i]);
+ }
+ }
+ }
+
+ /**
+ * Initializes the paths of the SettingsReader for web application usage.
+ *
+ * @param base_dir The base directory of this web application. E.g. TOMCAT_HOME/webapps/pdf-as
+ */
+ public static void initializeForWeb(String base_dir)
+ {
+ RESOURCES_PATH = base_dir + FILE_SEP; //CATALINA_HOME + FILE_SEP + WEB_APPL_DIR;
+ CONFIG_PATH = RESOURCES_PATH + CFG + FILE_SEP;
+ CERT_PATH = RESOURCES_PATH + CERT + FILE_SEP;
+ }
+
+ /**
+ * Initializes the paths of the SettingsReader for commanline usage.
+ */
+ public static void initializeForCommandLine()
+ {
+ RESOURCES_PATH = USER_DIR + FILE_SEP;
+ CONFIG_PATH = RESOURCES_PATH + CFG + FILE_SEP;
+ CERT_PATH = RESOURCES_PATH + CERT + FILE_SEP;
+ }
+
+} \ No newline at end of file
diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/commandline/Main.java b/src/main/java/at/knowcenter/wag/egov/egiz/commandline/Main.java
new file mode 100644
index 0000000..7f5242b
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/egov/egiz/commandline/Main.java
@@ -0,0 +1,917 @@
+/**
+ * <copyright> Copyright (c) 2006 by Know-Center, Graz, Austria </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+ * NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
+ * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES.
+ *
+ * $Id: Main.java,v 1.5 2006/10/31 08:06:56 wprinz Exp $
+ */
+package at.knowcenter.wag.egov.egiz.commandline;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.PrintStream;
+import java.io.UnsupportedEncodingException;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.apache.log4j.Logger;
+import org.apache.log4j.PropertyConfigurator;
+
+import at.knowcenter.wag.egov.egiz.PdfAS;
+import at.knowcenter.wag.egov.egiz.PdfASID;
+import at.knowcenter.wag.egov.egiz.cfg.ConfigLogger;
+import at.knowcenter.wag.egov.egiz.cfg.SettingsReader;
+import at.knowcenter.wag.egov.egiz.exceptions.ConnectorFactoryException;
+import at.knowcenter.wag.egov.egiz.exceptions.ErrorCodeException;
+import at.knowcenter.wag.egov.egiz.exceptions.PDFDocumentException;
+import at.knowcenter.wag.egov.egiz.exceptions.PlaceholderException;
+import at.knowcenter.wag.egov.egiz.exceptions.PresentableException;
+import at.knowcenter.wag.egov.egiz.exceptions.SettingNotFoundException;
+import at.knowcenter.wag.egov.egiz.exceptions.SignatureException;
+import at.knowcenter.wag.egov.egiz.exceptions.SignatureTypesException;
+import at.knowcenter.wag.egov.egiz.framework.SignResult;
+import at.knowcenter.wag.egov.egiz.framework.SignatorFactory;
+import at.knowcenter.wag.egov.egiz.framework.VerificationFilter;
+import at.knowcenter.wag.egov.egiz.framework.signators.DetachedSignator_1_0_0;
+import at.knowcenter.wag.egov.egiz.pdf.SignatureHolder;
+import at.knowcenter.wag.egov.egiz.pdf.TablePos;
+import at.knowcenter.wag.egov.egiz.sig.ConnectorFactory;
+import at.knowcenter.wag.egov.egiz.sig.ConnectorInformation;
+import at.knowcenter.wag.egov.egiz.sig.SignatureResponse;
+import at.knowcenter.wag.egov.egiz.sig.SignatureTypes;
+import at.knowcenter.wag.egov.egiz.web.Verify;
+
+/**
+ * The main program entry point of the commandline tool.
+ *
+ * @author wprinz
+ */
+public abstract class Main
+{
+ /**
+ * Command line parameter setting the application mode sign|verify
+ */
+ protected static final String PARAMETER_MODE = "-mode";
+
+ /**
+ * Command line parameter setting the application to connect
+ */
+ protected static final String PARAMETER_CONNECTOR = "-connector";
+
+ /**
+ * Command line parameter setting the signature mode.
+ */
+ protected static final String PARAMETER_SIGNATURE_MODE = "-sigmode";
+
+ /**
+ * Command line parameter setting the signature type.
+ */
+ protected static final String PARAMETER_SIGNATURE_TYPE = "-sigtype";
+
+ /**
+ * Command line parameter setting the username
+ */
+ protected static final String PARAMETER_USER_NAME = "-username";
+
+ /**
+ * Command line parameter setting the users password
+ */
+ protected static final String PARAMETER_USER_PASSWORD = "-password";
+
+ /**
+ * Command line parameter selecting the position of the signature.
+ */
+ protected static final String PARAMETER_POS = "-pos";
+
+ /**
+ * Command line parameter selecting the signature which is going to be
+ * verified.
+ */
+ protected static final String PARAMETER_VERIFY_WHICH = "-verify_which";
+
+ /**
+ * The application mode sign
+ */
+ public static final String VALUE_MODE_SIGN = "sign";
+
+ /**
+ * The application mode verify
+ */
+ public static final String VALUE_MODE_VERIFY = "verify";
+
+ /**
+ * The application mode sign
+ */
+ public static final String VALUE_SIGNATURE_MODE_BINARY = "binary";
+
+ /**
+ * The application mode verify
+ */
+ public static final String VALUE_SIGNATURE_MODE_TEXTUAL = "textual";
+
+ /**
+ * The application mode verify
+ */
+ public static final String VALUE_SIGNATURE_MODE_DETACHED = "detached";
+
+ /**
+ * The logger definition.
+ */
+ private static final Logger logger_ = ConfigLogger.getLogger(Main.class);
+
+ /**
+ * Main program entry point.
+ *
+ * @param args
+ * The commandline arguments.
+ * @throws IOException
+ */
+ public static void main(String[] args) throws IOException
+ {
+ // ConfigLogger.setLevel(Level.DEBUG);
+
+ SettingsReader.initializeForCommandLine();
+ PropertyConfigurator.configure(SettingsReader.CONFIG_PATH + "log4j.properties");
+
+ try
+ {
+ // printUsage(System.out);
+
+ String mode = null;
+ String signature_mode = null;
+ String connector = null;
+
+ String signature_type = null;
+ String user_name = null;
+ String user_password = null;
+ String pos_string = null;
+
+ int verify_which = -1;
+
+ String input = null;
+ String output = null;
+
+ // for (int i = 0; i < args.length; i++)
+ // {
+ // logger_.debug("arg[" + i + "] = " + args[i]);
+ // }
+
+ for (int i = 0; i < args.length; i++)
+ {
+ String cur_arg = args[i].trim();
+
+ if (cur_arg.equals(PARAMETER_MODE))
+ {
+ i++;
+ if (i >= args.length)
+ {
+ printNoValue(PARAMETER_MODE);
+ return;
+ }
+ mode = args[i];
+ if (!checkMode(mode))
+ {
+ printUnrecognizedValue(PARAMETER_MODE, mode);
+ return;
+ }
+ continue;
+ }
+
+ if (cur_arg.equals(PARAMETER_CONNECTOR))
+ {
+ i++;
+ if (i >= args.length)
+ {
+ printNoValue(PARAMETER_CONNECTOR);
+ return;
+ }
+ connector = args[i];
+ if (!checkConnector(connector))
+ {
+ printUnrecognizedValue(PARAMETER_CONNECTOR, connector);
+ return;
+ }
+ continue;
+ }
+
+ if (cur_arg.equals(PARAMETER_SIGNATURE_MODE))
+ {
+ i++;
+ if (i >= args.length)
+ {
+ printNoValue(PARAMETER_SIGNATURE_MODE);
+ return;
+ }
+ signature_mode = args[i];
+ if (!checkSignatureMode(signature_mode))
+ {
+ printUnrecognizedValue(PARAMETER_SIGNATURE_MODE, signature_mode);
+ return;
+ }
+ continue;
+ }
+
+ if (cur_arg.equals(PARAMETER_SIGNATURE_TYPE))
+ {
+ i++;
+ if (i >= args.length)
+ {
+ printNoValue(PARAMETER_SIGNATURE_TYPE);
+ return;
+ }
+ signature_type = args[i];
+ if (!checkSignatureType(signature_type))
+ {
+ printUnrecognizedValue(PARAMETER_SIGNATURE_TYPE, signature_type);
+ return;
+ }
+ continue;
+ }
+
+ if (cur_arg.equals(PARAMETER_USER_NAME))
+ {
+ i++;
+ if (i >= args.length)
+ {
+ printNoValue(PARAMETER_USER_NAME);
+ return;
+ }
+ user_name = args[i];
+ continue;
+ }
+
+ if (cur_arg.equals(PARAMETER_USER_PASSWORD))
+ {
+ i++;
+ if (i >= args.length)
+ {
+ printNoValue(PARAMETER_USER_PASSWORD);
+ return;
+ }
+ user_password = args[i];
+ continue;
+ }
+
+ if (cur_arg.equals(PARAMETER_POS))
+ {
+ i++;
+ if (i >= args.length)
+ {
+ printNoValue(PARAMETER_POS);
+ return;
+ }
+ pos_string = args[i];
+ continue;
+ }
+
+ if (cur_arg.equals(PARAMETER_VERIFY_WHICH))
+ {
+ i++;
+ if (i >= args.length)
+ {
+ printNoValue(PARAMETER_VERIFY_WHICH);
+ return;
+ }
+ String str_verify_which = args[i];
+ try
+ {
+ verify_which = Integer.parseInt(str_verify_which);
+ }
+ catch (NumberFormatException e)
+ {
+ printUnrecognizedValue(PARAMETER_VERIFY_WHICH, str_verify_which);
+ return;
+ }
+
+ continue;
+ }
+
+ if (cur_arg.charAt(0) == '-')
+ {
+ printUnrecognizedOption(cur_arg);
+ return;
+ }
+
+ if (input == null)
+ {
+ input = cur_arg;
+ continue;
+ }
+
+ if (output == null)
+ {
+ output = cur_arg;
+ continue;
+ }
+
+ printUnrecognizedAdditionalCommandlineArgument(cur_arg);
+ return;
+ }
+
+ if (mode == null)
+ {
+ printMissingParameter("a mode", PARAMETER_MODE);
+ return;
+ }
+ if (connector == null)
+ {
+ printMissingParameter("a connector", PARAMETER_CONNECTOR);
+ return;
+ }
+ if (mode.equals(VALUE_MODE_SIGN))
+ {
+ if (signature_mode == null)
+ {
+ printMissingParameter("a signature mode", PARAMETER_SIGNATURE_MODE);
+ return;
+ }
+ if (signature_type == null)
+ {
+ SettingsReader settings = SettingsReader.getInstance();
+ String default_type = settings.getValueFromKey(SignatureTypes.DEFAULT_TYPE);
+ signature_type = default_type;
+ }
+ if (user_name == null)
+ {
+ user_name = "";
+ // printMissingParameter("a user name", PARAMETER_USER_NAME);
+ // return;
+ }
+ if (user_password == null)
+ {
+ user_password = "";
+ // printMissingParameter("a user password", PARAMETER_USER_PASSWORD);
+ // return;
+ }
+ }
+
+ if (input == null)
+ {
+ printMissing("an input document");
+ return;
+ }
+
+ File file = new File(input);
+ if (!file.exists())
+ {
+ System.err.println("The input file '" + input + "' doesn't exist.");
+ return;
+ }
+
+ carryOutCommand(mode, signature_mode, connector, signature_type, user_name, user_password, verify_which, input, output, pos_string);
+
+ }
+ catch (PresentableException e)
+ {
+ if (e instanceof ErrorCodeException)
+ {
+ ErrorCodeException ece = (ErrorCodeException) e;
+ printErrorCodeException(ece);
+ }
+ else
+ {
+ System.err.println("PresentableException:");
+ System.err.println(e.getMessage());
+ logger_.debug(e.toString());
+ }
+ }
+ finally
+ {
+ SettingsReader.clearTemporaryDirectory();
+ }
+ }
+
+ /**
+ * Carries out the actual command given via the commandline parameters.
+ *
+ * <p>
+ * This is simply the procedure that is executed after the commandline
+ * parameters have been parsed successfully.
+ * </p>
+ *
+ * @param mode
+ * The operation mode (e.g. "sign", "verify").
+ * @param signature_mode
+ * The signature mode (e.g. "binary", "textual").
+ * @param connector
+ * The connector (e.g. "bku", "a1").
+ * @param signature_type
+ * The signature type/profile. For signing only.
+ * @param user_name
+ * The user name. For signing only.
+ * @param user_password
+ * The user password. For signing only.
+ * @param verify_which
+ * The number of the signature to be verified. For verifying only.
+ * @param input
+ * The input file name.
+ * @param output
+ * The output file name.
+ * @throws PresentableException
+ */
+ protected static void carryOutCommand(final String mode,
+ final String signature_mode, final String connector,
+ final String signature_type, final String user_name,
+ final String user_password, final int verify_which, final String input,
+ String output, final String pos_string) throws PresentableException
+ {
+ File file = new File(input);
+
+ byte[] input_bytes = null;
+ try
+ {
+ FileInputStream fis = new FileInputStream(file);
+ input_bytes = new byte[(int) file.length()];
+ fis.read(input_bytes);
+ fis.close();
+ }
+ catch (IOException e)
+ {
+ throw new PDFDocumentException(201);
+ }
+
+ if (mode.equals(VALUE_MODE_SIGN))
+ {
+ System.out.println("Signing...");
+
+ PdfAS.applyStrictMode(input_bytes);
+
+ TablePos pos = null;
+ if (pos_string != null)
+ {
+ try
+ {
+ pos = PdfAS.parsePositionFromPosString(pos_string);
+ }
+ catch (PDFDocumentException e)
+ {
+ printUnrecognizedValue(PARAMETER_POS, pos_string);
+ return;
+
+ }
+ }
+
+ PdfASID algorithm = translateSignatureModeToPdfASID(signature_mode);
+ SignResult sign_result = PdfAS.sign(algorithm, input_bytes, signature_type, connector, user_name, user_password, pos);
+
+ try
+ {
+ if (output == null)
+ {
+ output = generateOutputFileNameFromInput(input, sign_result);
+ }
+
+ FileOutputStream fos = new FileOutputStream(output);
+ fos.write(sign_result.getData());
+ fos.close();
+ }
+ catch (IOException e)
+ {
+ throw new PDFDocumentException(205);
+ }
+
+ System.out.println("Signing was successful.");
+ }
+ else
+ {
+ System.out.println("Verifying...");
+
+ VerificationFilter vf = new VerificationFilter();
+
+ List signature_holders = null;
+
+ String extension = Verify.extractExtension(input);
+ if (extension != null && extension.equals("txt"))
+ {
+ try
+ {
+ String text = new String(input_bytes, "UTF-8");
+ signature_holders = vf.extractSignaturesFromPlainText(text);
+ }
+ catch (UnsupportedEncodingException e)
+ {
+ throw new PresentableException(e);
+ }
+ }
+ else
+ {
+ signature_holders = vf.extractSignaturesFromPdf(input_bytes);
+ }
+
+ if (signature_holders.isEmpty())
+ {
+ throw new PDFDocumentException(206);
+ }
+
+ List holders_to_verify = signature_holders;
+
+ if (verify_which >= 0)
+ {
+ if (verify_which >= signature_holders.size())
+ {
+ throw new SignatureException(312, "The selected signature to be verified doesn't exist.");
+ }
+
+ SignatureHolder holder = (SignatureHolder) signature_holders.get(verify_which);
+ holders_to_verify = new ArrayList();
+ holders_to_verify.add(holder);
+ }
+
+ List results = PdfAS.verifySignatureHolders(holders_to_verify, connector);
+ System.out.println("Verification results:");
+ formatVerifyResults(results, System.out);
+ }
+ }
+
+ /**
+ * Generates a suitable output file name for the output regarding the type of
+ * the sign_result.
+ *
+ * @param input
+ * The input file name.
+ * @param sign_result
+ * The sign result.
+ * @return Returns the output file name.
+ */
+ protected static String generateOutputFileNameFromInput(String input,
+ SignResult sign_result)
+ {
+ String output = input + "_out";
+ if (sign_result.getMimeType().equals(DetachedSignator_1_0_0.MIME_TYPE))
+ {
+ output += ".xml";
+ }
+ else
+ {
+ output += ".pdf";
+ }
+
+ return output;
+ }
+
+ /**
+ * Prints that the provided option was unrecognized.
+ *
+ * @param option
+ * The unrecognized option.
+ * @throws PresentableException
+ * Forwarded exception.
+ */
+ protected static void printUnrecognizedOption(final String option) throws PresentableException
+ {
+ System.err.println("Unrecognized option '" + option + "'.");
+ printUsage(System.out);
+ }
+
+ /**
+ * Prints that the provided value was unrecognized.
+ *
+ * @param parameter
+ * The parameter, which is missing a value.
+ * @throws PresentableException
+ * Forwarded exception.
+ */
+ protected static void printNoValue(final String parameter) throws PresentableException
+ {
+ System.err.println("The parameter " + parameter + " requires a value as next argument.");
+ printUsage(System.out);
+ }
+
+ /**
+ * Prints that the provided value was unrecognized.
+ *
+ * @param value
+ * The unrecognized value.
+ * @throws PresentableException
+ * Forwarded exception.
+ */
+ protected static void printUnrecognizedValue(final String parameter,
+ final String value) throws PresentableException
+ {
+ System.err.println("The parameter " + parameter + " doesn't recognize the provided value '" + value + "'.");
+ printUsage(System.out);
+ }
+
+ /**
+ * Prints that the provided additional commandline argument was unrecognized.
+ *
+ * @param argument
+ * The unrecognized argument.
+ * @throws PresentableException
+ * Forwarded exception.
+ */
+ protected static void printUnrecognizedAdditionalCommandlineArgument(
+ final String argument) throws PresentableException
+ {
+ System.err.println("Unrecognized additional commandline argument '" + argument + "'.");
+ printUsage(System.out);
+ }
+
+ /**
+ * Prints that a certain parameter was missing.
+ *
+ * @param missing_term
+ * A description of the missing parameter ("e.g. a mode").
+ * @param parameter
+ * The missing parameter itself (e.g. "-mode").
+ * @throws PresentableException
+ * Forwarded exception.
+ */
+ protected static void printMissingParameter(final String missing_term,
+ final String parameter) throws PresentableException
+ {
+ printMissing(missing_term + " ('" + parameter + "' parameter)");
+ }
+
+ /**
+ * Prints that something is missing.
+ *
+ * @param missing_term
+ * A descriptive message of the missing thing.
+ * @throws PresentableException
+ * Forwarded exception.
+ */
+ protected static void printMissing(final String missing_term) throws PresentableException
+ {
+ System.err.println("Please specify " + missing_term + ".");
+ printUsage(System.out);
+ }
+
+ /**
+ * Prints out the ErrorCodeException in a descriptive form.
+ *
+ * @param ece
+ * The ErrorCodeException to be printed.
+ */
+ protected static void printErrorCodeException(final ErrorCodeException ece)
+ {
+ if (ece instanceof PlaceholderException)
+ {
+ PlaceholderException phe = (PlaceholderException) ece;
+
+ System.err.println("Der Platzhalter des Feldes " + phe.getField() + " ist um " + phe.getMissing() + " Bytes zu kurz. ");
+ }
+
+ System.err.println("Fehler " + ece.getErrorCode() + ": " + ece.getErrorCodeMessage());
+
+ if (ece.hasExternalErrorMessage())
+ {
+ System.err.println("Externer Fehlergrund: " + ece.getExternalErrorCode() + ": " + ece.getExternalErrorMessage());
+ }
+
+ logger_.debug(ece.toString());
+ }
+
+ /**
+ * Prints the usage text.
+ *
+ * @param writer
+ * The writer to print the text to.
+ * @throws PresentableException
+ * Forwarded exception.
+ */
+ public static void printUsage(PrintStream writer) throws PresentableException
+ {
+ writer.println("Usage: pdf-as [OPTIONS] <input file> [output file]");
+ writer.println(" Required OPTIONS:");
+
+ writer.println(" " + PARAMETER_MODE + " <" + VALUE_MODE_SIGN + "|" + VALUE_MODE_VERIFY + ">");
+ writer.println(" " + VALUE_MODE_SIGN + " ... signs a document");
+ writer.println(" " + VALUE_MODE_VERIFY + " ... verifies a document");
+
+ writer.print(" " + PARAMETER_CONNECTOR + " ");
+ ConnectorInformation[] ci = ConnectorFactory.getConnectorInformationArray();
+ for (int i = 0; i < ci.length; i++)
+ {
+ String id = ci[i].getIdentifier();
+ if (!ConnectorFactory.isAvailableForCommandline(id))
+ {
+ continue;
+ }
+ writer.print(id);
+ if (i < ci.length - 1)
+ {
+ writer.print("|");
+ }
+ }
+ writer.println();
+ for (int i = 0; i < ci.length; i++)
+ {
+ String id = ci[i].getIdentifier();
+ if (!ConnectorFactory.isAvailableForCommandline(id))
+ {
+ continue;
+ }
+ writer.println(" " + id + " ... " + ci[i].getDescription());
+ }
+
+ writer.println(" OPTIONS for signation:");
+
+ writer.println(" " + PARAMETER_SIGNATURE_MODE + " <" + VALUE_SIGNATURE_MODE_BINARY + "|" + VALUE_SIGNATURE_MODE_TEXTUAL + ">");
+ writer.println(" " + VALUE_SIGNATURE_MODE_BINARY + " ... signs the complete binary document");
+ writer.println(" " + VALUE_SIGNATURE_MODE_TEXTUAL + " ... signs only the textual portion of the document");
+ writer.println(" " + VALUE_SIGNATURE_MODE_DETACHED + " ... signs the document and returns the xml signature of it.");
+
+ writer.print(" " + PARAMETER_SIGNATURE_TYPE + " <");
+ SignatureTypes sig_types = SignatureTypes.getInstance();
+ SettingsReader settings = SettingsReader.getInstance();
+ List types_array = sig_types.getSignatureTypes();
+ Iterator it = types_array.iterator();
+ while (it.hasNext())
+ {
+ String type = (String) it.next();
+ writer.print(type);
+ if (it.hasNext())
+ {
+ writer.print("|");
+ }
+ }
+ writer.println(">");
+ writer.println(" ... [optional] the profile to be used. If omitted, the default");
+ writer.println(" profile is used.");
+ String default_type = settings.getValueFromKey(SignatureTypes.DEFAULT_TYPE);
+ it = types_array.iterator();
+ while (it.hasNext())
+ {
+ String type = (String) it.next();
+ String descr_key = SignatureTypes.SIG_OBJ + type + "." + SignatureTypes.SIG_DESCR;
+ String type_descr = settings.getValueFromKey(descr_key);
+
+ writer.println(" " + type + " ... " + (type.equals(default_type) ? "(default) " : "") + type_descr);
+ }
+
+ writer.println(" " + PARAMETER_USER_NAME + " <user_name> ... the user name");
+ writer.println(" " + PARAMETER_USER_PASSWORD + " <password> ... the user password");
+
+ writer.println(" " + PARAMETER_POS + " <position> ... [optional] the absolute position of the signature block");
+ writer.println(" position has the format <pagenr>;<x>;<y>;<width>");
+ writer.println(" ... e.g. -pos=1;20.0;400.0;500.0");
+
+ writer.println(" OPTIONS for verification:");
+ writer.println(" " + PARAMETER_VERIFY_WHICH + " <number> ... [optional] zero based number of the signature");
+ writer.println(" to be verified. If omitted, all signatures are verified.");
+
+ writer.println(" Example usage:");
+ writer.println(" pdf-as " + PARAMETER_MODE + " " + VALUE_MODE_SIGN + " " + PARAMETER_CONNECTOR + " moa " + PARAMETER_USER_NAME + " name " + PARAMETER_USER_PASSWORD + " pwd some_document.pdf");
+ writer.println(" pdf-as " + PARAMETER_MODE + " " + VALUE_MODE_VERIFY + " some_document.pdf_out.pdf");
+
+ }
+
+ /**
+ * Checks the value for correctness.
+ *
+ * @param mode
+ * The parameter's value.
+ * @return Returns true, if the value is correct, false otherwise.
+ */
+ protected static boolean checkMode(String mode)
+ {
+ return mode.equals(VALUE_MODE_SIGN) || mode.equals(VALUE_MODE_VERIFY);
+ }
+
+ /**
+ * Checks the value for correctness.
+ *
+ * @param signature_mode
+ * The parameter's value.
+ * @return Returns true, if the value is correct, false otherwise.
+ */
+ protected static boolean checkSignatureMode(String signature_mode)
+ {
+ return signature_mode.equals(VALUE_SIGNATURE_MODE_BINARY) || signature_mode.equals(VALUE_SIGNATURE_MODE_TEXTUAL) || signature_mode.equals(VALUE_SIGNATURE_MODE_DETACHED);
+ }
+
+ /**
+ * Checks the value for correctness.
+ *
+ * @param connector
+ * The parameter's value.
+ * @return Returns true, if the value is correct, false otherwise.
+ * @throws ConnectorFactoryException
+ * F.e.
+ */
+ protected static boolean checkConnector(String connector) throws ConnectorFactoryException
+ {
+ return ConnectorFactory.isValidConnectorIdentifier(connector) && ConnectorFactory.isAvailableForCommandline(connector);
+ }
+
+ /**
+ * Checks the value for correctness.
+ *
+ * @param signature_type
+ * The parameter's value.
+ * @return Returns true, if the value is correct, false otherwise.
+ */
+ protected static boolean checkSignatureType(String signature_type) throws SignatureTypesException
+ {
+ SignatureTypes sig_types = SignatureTypes.getInstance();
+ List types_array = sig_types.getSignatureTypes();
+ Iterator it = types_array.iterator();
+ while (it.hasNext())
+ {
+ String type = (String) it.next();
+ if (type.equals(signature_type))
+ {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Translates the commandline argument to a PDF-AS-ID.
+ *
+ * @param signature_mode
+ * The signator mode commandline argument.
+ * @return Returns the corresponding PDFASID.
+ */
+ protected static PdfASID translateSignatureModeToPdfASID(String signature_mode)
+ {
+ if (signature_mode.equals(VALUE_SIGNATURE_MODE_BINARY))
+ {
+ return SignatorFactory.MOST_RECENT_BINARY_SIGNATOR_ID;
+ }
+ if (signature_mode.equals(VALUE_SIGNATURE_MODE_TEXTUAL))
+ {
+ return SignatorFactory.MOST_RECENT_TEXTUAL_SIGNATOR_ID;
+ }
+ if (signature_mode.equals(VALUE_SIGNATURE_MODE_DETACHED))
+ {
+ return SignatorFactory.MOST_RECENT_DETACHED_SIGNATOR_ID;
+ }
+ return null;
+ }
+
+ /**
+ * Formats the verification results.
+ *
+ * @param results
+ * The List of SignatureResponse verification results.
+ * @param writer
+ * The output sink to write the formatted text to.
+ * @throws SettingNotFoundException
+ * Forwarded exception.
+ */
+ protected static void formatVerifyResults(List results, PrintStream writer) throws SettingNotFoundException
+ {
+ Iterator it = results.iterator();
+ while (it.hasNext())
+ {
+ SignatureResponse result = (SignatureResponse) it.next();
+ formatSignatureResponse(result, writer);
+
+ if (it.hasNext())
+ {
+ writer.println();
+ }
+ }
+ }
+
+ /**
+ * Formats the SignatureResponse.
+ *
+ * @param result
+ * The SignatureResponse to be printed.
+ * @param writer
+ * The output sink to write the formatted text to.
+ * @throws SettingNotFoundException
+ * Forwarded exception.
+ */
+ public static void formatSignatureResponse(SignatureResponse result,
+ PrintStream writer) throws SettingNotFoundException
+ {
+
+ writer.println(" Zertifikat:");
+ writer.println(" Signator: " + result.getX509SubjectName());
+ writer.println(" Aussteller: " + result.getX509IssuerName());
+ writer.println(" Seriennummer: " + result.getX509SerialNumber());
+ List public_properties = result.getPublicProperties();
+ Iterator it = public_properties.iterator();
+ while (it.hasNext())
+ {
+ String public_property = (String) it.next();
+ writer.println(" Eigenschaft: " + public_property);
+ }
+
+ writer.println(" Zertifikat-Check:");
+ writer.println(" " + result.getCertificateCheckCode() + " - " + result.getCertificateCheckInfo());
+ writer.println(" Signatur-Check:");
+ writer.println(" " + result.getSignatureCheckCode() + " - " + result.getSignatureCheckInfo());
+ writer.println(" Manifest-Check:");
+ writer.println(" " + result.getSignatureManifestCheckCode() + " - " + result.getSignatureManifestCheckInfo());
+ }
+
+}
diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/exceptions/ConnectorFactoryException.java b/src/main/java/at/knowcenter/wag/egov/egiz/exceptions/ConnectorFactoryException.java
new file mode 100644
index 0000000..733ccb6
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/egov/egiz/exceptions/ConnectorFactoryException.java
@@ -0,0 +1,64 @@
+/**
+ * <copyright> Copyright (c) 2006 by Know-Center, Graz, Austria </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+ * NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
+ * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES.
+ *
+ * $Id: ConnectorFactoryException.java,v 1.2 2006/08/25 17:10:34 wprinz Exp $
+ */
+package at.knowcenter.wag.egov.egiz.exceptions;
+
+/**
+ * This exception is thrown when the connector factory encounters an error
+ * during providing a connector.
+ *
+ * <p>
+ * The most likely case for this exception is that a wrong connector identifier
+ * was provided.
+ * </p>
+ *
+ * @author wprinz
+ */
+public class ConnectorFactoryException extends PresentableException
+{
+
+ /**
+ * SVUID.
+ */
+ private static final long serialVersionUID = -1398538795243257880L;
+
+ /**
+ * @param message
+ */
+ public ConnectorFactoryException(String message)
+ {
+ super(message);
+ }
+
+ /**
+ * @param message
+ * @param cause
+ */
+ public ConnectorFactoryException(String message, Throwable cause)
+ {
+ super(message, cause);
+ }
+
+ /**
+ * @param cause
+ */
+ public ConnectorFactoryException(Throwable cause)
+ {
+ super(cause);
+ }
+
+}
diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/exceptions/ErrorCodeException.java b/src/main/java/at/knowcenter/wag/egov/egiz/exceptions/ErrorCodeException.java
new file mode 100644
index 0000000..42fe597
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/egov/egiz/exceptions/ErrorCodeException.java
@@ -0,0 +1,308 @@
+/*
+ * <copyright> Copyright (c) 2006 by Know-Center, Graz, Austria </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+ * NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
+ * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES.
+ *
+ * $Id: ErrorCodeException.java,v 1.1 2006/08/03 07:47:02 wprinz Exp $
+ */
+package at.knowcenter.wag.egov.egiz.exceptions;
+
+import org.apache.log4j.Logger;
+
+import at.knowcenter.wag.egov.egiz.cfg.ConfigLogger;
+import at.knowcenter.wag.egov.egiz.cfg.SettingsReader;
+
+/**
+ * This exception should be inherit, if an exception should be shown as a
+ * feedback message in user interfaces.
+ *
+ * <p>
+ * The error code is an integer number. The error codes are defined in an
+ * separate configuration file, readed be the SettingsReader. If the
+ * SettingsReader can not initialized, a corresponding error message can not
+ * read!
+ * </p>
+ * <p>
+ * The error code can be seen a a replacement of the exception message. For all
+ * intents and purposes, the error code should be used to provide exceptional
+ * feedback to the user. Nevertheless, if possible, a debug message String (the
+ * message parameter) should still be provided giving in depth developer
+ * descriptions of the problem. These message strings will then show up in the
+ * log files accordingly.
+ * </p>
+ *
+ * @author wlackner
+ * @author wprinz (enforced error code)
+ *
+ * @see at.knowcenter.wag.egov.egiz.cfg.SettingsReader
+ */
+public class ErrorCodeException extends PresentableException
+{
+ /**
+ * SVUID.
+ */
+ private static final long serialVersionUID = 2071967845179686593L;
+
+ /**
+ * Template key getting error messages
+ */
+ private static final String ERROR_CODE_KEY = "error.code.";
+
+ /**
+ * The default error message
+ */
+ private static final String DEFAULT_ERROR_MESSAGE = "Fehler Code:";
+
+ /**
+ * The logger definition.
+ */
+ private static final Logger logger_ = ConfigLogger.getLogger(ErrorCodeException.class);
+
+ /**
+ * The SettingsReader instance
+ */
+ private SettingsReader settings_ = null;
+
+ /**
+ * The default error code
+ */
+ private int error_code_ = -1;
+
+ /**
+ * If an external application is called
+ */
+ private String externalErrorCode_ = null;
+
+ /**
+ * If an external application is called
+ */
+ private String externalErrorMessage_ = null;
+
+ /**
+ * Constructor that sets the error code.
+ *
+ * @param error_code
+ * The error code.
+ */
+ public ErrorCodeException(final int error_code)
+ {
+ super("error code " + error_code);
+ this.error_code_ = error_code;
+ loadSettings();
+ }
+
+ /**
+ * Inherit Constructor from Exception,
+ *
+ * @param error_code
+ * The error code.
+ * @param message
+ * The in depth developer provided error message.
+ * @see Exception
+ */
+ public ErrorCodeException(final int error_code, String message)
+ {
+ super("error code " + error_code + ": " + message);
+ this.error_code_ = error_code;
+ loadSettings();
+ }
+
+ /**
+ * Inherit Constructor from Exception,
+ *
+ * @param error_code
+ * The error code.
+ * @param message
+ * The in depth developer provided error message.
+ * @param cause
+ * The cause of this exception.
+ * @see Exception
+ */
+ public ErrorCodeException(final int error_code, String message, Throwable cause)
+ {
+ super("error code " + error_code + ": " + message, cause);
+ this.error_code_ = error_code;
+ loadSettings();
+ }
+
+ /**
+ * Inherit Constructor from Exception,
+ *
+ * @param error_code
+ * The error code.
+ * @param cause
+ * The cause of this exception.
+ * @see Exception
+ */
+ public ErrorCodeException(final int error_code, Throwable cause)
+ {
+ super("error code " + error_code, cause);
+ this.error_code_ = error_code;
+ loadSettings();
+ }
+
+ /**
+ * Load the settings file. Call the SettingsReader instance.
+ */
+ private void loadSettings()
+ {
+ if (settings_ == null)
+ {
+ try
+ {
+ settings_ = SettingsReader.getInstance();
+ }
+ catch (SettingsException e)
+ {
+ String log_message = "Can not load pdf signature settings. Cause:\n" + e.getMessage();
+ logger_.error(log_message);
+ }
+ }
+ }
+
+ /**
+ * Return the manually stored error code. The error code is only a key for a
+ * configurable error message. The error code and its corresponding message
+ * have to be declared in an separate property file, loaded by the
+ * SettingsReader
+ *
+ * @see at.knowcenter.wag.egov.egiz.cfg.SettingsReader
+ * @return Returns the errorCode.
+ */
+ public int getErrorCode()
+ {
+ return this.error_code_;
+ }
+
+ /**
+ * Set a special error code in case of commuicating this error in an user
+ * interface. The error code is only a key for a configurable error message.
+ * The error code and its corresponding message have to be declared in an
+ * separate property file, loaded by the SettingsReader
+ *
+ * @see at.knowcenter.wag.egov.egiz.cfg.SettingsReader
+ * @param error_code
+ * The error code to be set.
+ */
+ public void setErrorCode(final int error_code)
+ {
+ this.error_code_ = error_code;
+ }
+
+ /**
+ * Set a special error code in case of commuicating this error in an user
+ * interface. The error code is a key for an external application error
+ * message. The error code and its corresponding message have to be declared
+ * by the external tool that used.
+ *
+ * @param errorCode
+ * The errorCode to set.
+ */
+ public void setExternalErrorCode(String errorCode)
+ {
+ externalErrorCode_ = errorCode;
+ }
+
+ /**
+ * Returns an external error code that is set manually
+ *
+ * @return the external error code if set, <code>null</code> otherwise
+ */
+ public String getExternalErrorCode()
+ {
+ return externalErrorCode_;
+ }
+
+ /**
+ * Set a special error message in case of commuicating this error in an user
+ * interface. The error message and its corresponding error code have to be
+ * declared by the external tool that used.
+ *
+ * @param errorMessage
+ */
+ public void setExternalErrorMessage(String errorMessage)
+ {
+ externalErrorMessage_ = errorMessage;
+ }
+
+ /**
+ * Returns an external error message that is set manually
+ *
+ * @return the external error message if set, <code>null</code> otherwise
+ */
+ public String getExternalErrorMessage()
+ {
+ return externalErrorMessage_;
+ }
+
+ /**
+ * Checks if an external error message is set.
+ *
+ * @return returns <code>true</code> if a message is set, <code>false</code>
+ * otherwise
+ */
+ public boolean hasExternalErrorMessage()
+ {
+ return (externalErrorMessage_ != null);
+ }
+
+ /**
+ * Get the configured error message that corresponds to the error code. If the
+ * config file can't be read, or an error code is not declared in the config
+ * file, the default error message would be returned.
+ *
+ * @return an error message that can be used for ui communication
+ */
+ public String getErrorCodeMessage()
+ {
+ String err_msg = null;
+ if (settings_ != null)
+ {
+ err_msg = settings_.getSetting(ERROR_CODE_KEY + error_code_, DEFAULT_ERROR_MESSAGE + error_code_);
+ }
+ return err_msg;
+ }
+
+ /**
+ * Get the configured error message that corresponds to the given error code.
+ * If the config file can't be read, or an error code is not declared in the
+ * config file, the default error message would be returned.
+ *
+ * @return an error message that can be used for ui communication
+ */
+ public static String getErrorCodeMessage(int errorCode)
+ {
+ SettingsReader settings = null;
+ String err_msg = DEFAULT_ERROR_MESSAGE + errorCode;
+ try
+ {
+ settings = SettingsReader.getInstance();
+ err_msg = settings.getSetting(ERROR_CODE_KEY + errorCode, DEFAULT_ERROR_MESSAGE + errorCode);
+ }
+ catch (SettingsException e)
+ {
+ e.printStackTrace();
+ }
+ return err_msg;
+ }
+
+ /**
+ * Checks if the exception has an ErrorCode state.
+ *
+ * @return true if an ErrorCode does exist false otherwise
+ */
+ public boolean hasErrorCode()
+ {
+ return error_code_ != 0;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/exceptions/InvalidIDException.java b/src/main/java/at/knowcenter/wag/egov/egiz/exceptions/InvalidIDException.java
new file mode 100644
index 0000000..33d189b
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/egov/egiz/exceptions/InvalidIDException.java
@@ -0,0 +1,52 @@
+/**
+ * <copyright> Copyright (c) 2006 by Know-Center, Graz, Austria </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+ * NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
+ * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES.
+ *
+ * $Id: InvalidIDException.java,v 1.1 2006/08/25 17:10:34 wprinz Exp $
+ */
+package at.knowcenter.wag.egov.egiz.exceptions;
+
+/**
+ * Thrown when parsing an ID ("Kennzeichnung") fails.
+ * @author wprinz
+ */
+public class InvalidIDException extends SignatureException
+{
+
+ /**
+ * SVUID.
+ */
+ private static final long serialVersionUID = -7945398356854048254L;
+
+ public InvalidIDException(int error_code, String message, Throwable cause)
+ {
+ super(error_code, message, cause);
+ }
+
+ public InvalidIDException(int error_code, String message)
+ {
+ super(error_code, message);
+ }
+
+ public InvalidIDException(int error_code, Throwable cause)
+ {
+ super(error_code, cause);
+ }
+
+ public InvalidIDException(int error_code)
+ {
+ super(error_code);
+ }
+
+}
diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/exceptions/NormalizeException.java b/src/main/java/at/knowcenter/wag/egov/egiz/exceptions/NormalizeException.java
new file mode 100644
index 0000000..3675edb
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/egov/egiz/exceptions/NormalizeException.java
@@ -0,0 +1,72 @@
+/*
+ * <copyright>
+ * Copyright (c) 2006 by Know-Center, Graz, Austria
+ * </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF THE
+ * SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE,
+ * OR NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES
+ * SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING
+ * THIS SOFTWARE OR ITS DERIVATIVES.
+ *
+ * $Id: NormalizeException.java,v 1.1 2006/08/03 07:47:02 wprinz Exp $
+ */
+package at.knowcenter.wag.egov.egiz.exceptions;
+
+
+/**
+ * This exception is thrown by the processing a normalizer.
+ *
+ * @author wlackner
+ */
+public class NormalizeException extends ErrorCodeException {
+
+ /**
+ * SVUID.
+ */
+ private static final long serialVersionUID = -4080682145462891501L;
+
+ /**
+ * @param error_code
+ * @param message
+ * @param cause
+ */
+ public NormalizeException(int error_code, String message, Throwable cause)
+ {
+ super(error_code, message, cause);
+ }
+
+ /**
+ * @param error_code
+ * @param message
+ */
+ public NormalizeException(int error_code, String message)
+ {
+ super(error_code, message);
+ }
+
+ /**
+ * @param error_code
+ * @param cause
+ */
+ public NormalizeException(int error_code, Throwable cause)
+ {
+ super(error_code, cause);
+ }
+
+ /**
+ * @param error_code
+ */
+ public NormalizeException(int error_code)
+ {
+ super(error_code);
+ }
+
+
+} \ No newline at end of file
diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/exceptions/PDFDocumentException.java b/src/main/java/at/knowcenter/wag/egov/egiz/exceptions/PDFDocumentException.java
new file mode 100644
index 0000000..a0cf56a
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/egov/egiz/exceptions/PDFDocumentException.java
@@ -0,0 +1,69 @@
+/*
+ * <copyright> Copyright (c) 2006 by Know-Center, Graz, Austria </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+ * NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
+ * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES.
+ *
+ * $Id: PDFDocumentException.java,v 1.1 2006/08/03 07:47:02 wprinz Exp $
+ */
+package at.knowcenter.wag.egov.egiz.exceptions;
+
+/**
+ * This exception is thrown in case of problems using pdf librarys.
+ *
+ * @author wlackner
+ */
+public class PDFDocumentException extends ErrorCodeException
+{
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = -4595955288382226408L;
+
+ /**
+ * @param error_code
+ * @param message
+ * @param cause
+ */
+ public PDFDocumentException(int error_code, String message, Throwable cause)
+ {
+ super(error_code, message, cause);
+ }
+
+ /**
+ * @param error_code
+ * @param message
+ */
+ public PDFDocumentException(int error_code, String message)
+ {
+ super(error_code, message);
+ }
+
+ /**
+ * @param error_code
+ * @param cause
+ */
+ public PDFDocumentException(int error_code, Throwable cause)
+ {
+ super(error_code, cause);
+ }
+
+ /**
+ * @param error_code
+ */
+ public PDFDocumentException(int error_code)
+ {
+ super(error_code);
+ }
+
+} \ No newline at end of file
diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/exceptions/PlaceholderException.java b/src/main/java/at/knowcenter/wag/egov/egiz/exceptions/PlaceholderException.java
new file mode 100644
index 0000000..1c82c3c
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/egov/egiz/exceptions/PlaceholderException.java
@@ -0,0 +1,56 @@
+/**
+ * <copyright> Copyright (c) 2006 by Know-Center, Graz, Austria </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+ * NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
+ * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES.
+ *
+ * $Id: PlaceholderException.java,v 1.1 2006/08/25 17:10:34 wprinz Exp $
+ */
+package at.knowcenter.wag.egov.egiz.exceptions;
+
+/**
+ * @author wprinz
+ */
+public class PlaceholderException extends PDFDocumentException
+{
+ /**
+ * SVUID.
+ */
+ private static final long serialVersionUID = -9149805408421810170L;
+
+
+ protected String field = null;
+ protected int missing = -1;
+
+ public PlaceholderException(String field, int missing)
+ {
+ super(700, field + ":" + missing);
+
+ this.field = field;
+ this.missing = missing;
+ }
+
+ public void setField (String field)
+ {
+ this.field = field;
+ }
+
+ public String getField()
+ {
+ return this.field;
+ }
+
+ public int getMissing()
+ {
+ return this.missing;
+ }
+}
diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/exceptions/PresentableException.java b/src/main/java/at/knowcenter/wag/egov/egiz/exceptions/PresentableException.java
new file mode 100644
index 0000000..ab87002
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/egov/egiz/exceptions/PresentableException.java
@@ -0,0 +1,65 @@
+/**
+ * <copyright> Copyright (c) 2006 by Know-Center, Graz, Austria </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+ * NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
+ * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES.
+ *
+ * $Id: PresentableException.java,v 1.2 2006/08/25 17:10:34 wprinz Exp $
+ */
+package at.knowcenter.wag.egov.egiz.exceptions;
+
+/**
+ * This exception should be the base for all exceptions that are to be presented
+ * to the user.
+ *
+ * <p>
+ * For example, exceptions that signal that a pdf file is corrupt should be
+ * represented as presentable exceptions so that the user interface frontends
+ * can present according texts.
+ * </p>
+ *
+ * @author wprinz
+ */
+public class PresentableException extends Exception
+{
+
+ /**
+ * SVUID.
+ */
+ private static final long serialVersionUID = -102406558526000792L;
+
+ /**
+ * @param message
+ */
+ public PresentableException(String message)
+ {
+ super(message);
+ }
+
+ /**
+ * @param message
+ * @param cause
+ */
+ public PresentableException(String message, Throwable cause)
+ {
+ super(message, cause);
+ }
+
+ /**
+ * @param cause
+ */
+ public PresentableException(Throwable cause)
+ {
+ super(cause);
+ }
+
+}
diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/exceptions/SettingNotFoundException.java b/src/main/java/at/knowcenter/wag/egov/egiz/exceptions/SettingNotFoundException.java
new file mode 100644
index 0000000..02a3b5b
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/egov/egiz/exceptions/SettingNotFoundException.java
@@ -0,0 +1,70 @@
+/*
+ * <copyright> Copyright (c) 2006 by Know-Center, Graz, Austria </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+ * NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
+ * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES.
+ *
+ * $Id: SettingNotFoundException.java,v 1.1 2006/08/03 07:47:03 wprinz Exp $
+ */
+package at.knowcenter.wag.egov.egiz.exceptions;
+
+/**
+ * This exception is thrown by the SettingsReader if a property key is not
+ * found.
+ *
+ * @author wlackner
+ */
+public class SettingNotFoundException extends ErrorCodeException
+{
+
+ /**
+ * SVUID.
+ */
+ private static final long serialVersionUID = -7502191288775676006L;
+
+ /**
+ * @param error_code
+ * @param message
+ * @param cause
+ */
+ public SettingNotFoundException(int error_code, String message, Throwable cause)
+ {
+ super(error_code, message, cause);
+ }
+
+ /**
+ * @param error_code
+ * @param message
+ */
+ public SettingNotFoundException(int error_code, String message)
+ {
+ super(error_code, message);
+ }
+
+ /**
+ * @param error_code
+ * @param cause
+ */
+ public SettingNotFoundException(int error_code, Throwable cause)
+ {
+ super(error_code, cause);
+ }
+
+ /**
+ * @param error_code
+ */
+ public SettingNotFoundException(int error_code)
+ {
+ super(error_code);
+ }
+
+} \ No newline at end of file
diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/exceptions/SettingsException.java b/src/main/java/at/knowcenter/wag/egov/egiz/exceptions/SettingsException.java
new file mode 100644
index 0000000..c53e6f2
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/egov/egiz/exceptions/SettingsException.java
@@ -0,0 +1,63 @@
+/**
+ * <copyright> Copyright (c) 2006 by Know-Center, Graz, Austria </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+ * NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
+ * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES.
+ *
+ * $Id: SettingsException.java,v 1.2 2006/08/25 17:10:34 wprinz Exp $
+ */
+package at.knowcenter.wag.egov.egiz.exceptions;
+
+/**
+ * Thrown when the settings couldn't be loaded.
+ *
+ * <p>
+ * This is most likely the case when the config file isn't found or when the
+ * settings are corrupt.
+ * </p>
+ *
+ * @author wprinz
+ */
+public class SettingsException extends PresentableException
+{
+
+ /**
+ * SVUID.
+ */
+ private static final long serialVersionUID = -99979541706943372L;
+
+ /**
+ * @param message
+ */
+ public SettingsException(String message)
+ {
+ super(message);
+ }
+
+ /**
+ * @param message
+ * @param cause
+ */
+ public SettingsException(String message, Throwable cause)
+ {
+ super(message, cause);
+ }
+
+ /**
+ * @param cause
+ */
+ public SettingsException(Throwable cause)
+ {
+ super(cause);
+ }
+
+}
diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/exceptions/SignatorFactoryException.java b/src/main/java/at/knowcenter/wag/egov/egiz/exceptions/SignatorFactoryException.java
new file mode 100644
index 0000000..dea7cfc
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/egov/egiz/exceptions/SignatorFactoryException.java
@@ -0,0 +1,37 @@
+/**
+ * <copyright> Copyright (c) 2006 by Know-Center, Graz, Austria </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+ * NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
+ * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES.
+ *
+ * $Id: SignatorFactoryException.java,v 1.1 2006/08/25 17:10:34 wprinz Exp $
+ */
+package at.knowcenter.wag.egov.egiz.exceptions;
+
+/**
+ * Exception coming out of the SignatorFactory.
+ * @author wprinz
+ */
+public class SignatorFactoryException extends PresentableException
+{
+
+ /**
+ * SVUID.
+ */
+ private static final long serialVersionUID = -4051644056058970435L;
+
+ public SignatorFactoryException(String message)
+ {
+ super(message);
+ }
+
+}
diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/exceptions/SignatureException.java b/src/main/java/at/knowcenter/wag/egov/egiz/exceptions/SignatureException.java
new file mode 100644
index 0000000..f036f49
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/egov/egiz/exceptions/SignatureException.java
@@ -0,0 +1,72 @@
+/*
+ * <copyright>
+ * Copyright (c) 2006 by Know-Center, Graz, Austria
+ * </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF THE
+ * SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE,
+ * OR NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES
+ * SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING
+ * THIS SOFTWARE OR ITS DERIVATIVES.
+ *
+ * $Id: SignatureException.java,v 1.1 2006/08/03 07:47:03 wprinz Exp $
+ */
+package at.knowcenter.wag.egov.egiz.exceptions;
+
+
+/**
+ * This exception is thrown by the processing a signature.
+ *
+ * @author wlackner
+ */
+public class SignatureException extends ErrorCodeException {
+
+ /**
+ * SVUID.
+ */
+ private static final long serialVersionUID = 6387300820234118374L;
+
+ /**
+ * @param error_code
+ * @param message
+ * @param cause
+ */
+ public SignatureException(int error_code, String message, Throwable cause)
+ {
+ super(error_code, message, cause);
+ }
+
+ /**
+ * @param error_code
+ * @param message
+ */
+ public SignatureException(int error_code, String message)
+ {
+ super(error_code, message);
+ }
+
+ /**
+ * @param error_code
+ * @param cause
+ */
+ public SignatureException(int error_code, Throwable cause)
+ {
+ super(error_code, cause);
+ }
+
+ /**
+ * @param error_code
+ */
+ public SignatureException(int error_code)
+ {
+ super(error_code);
+ }
+
+
+} \ No newline at end of file
diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/exceptions/SignatureTypesException.java b/src/main/java/at/knowcenter/wag/egov/egiz/exceptions/SignatureTypesException.java
new file mode 100644
index 0000000..4f51418
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/egov/egiz/exceptions/SignatureTypesException.java
@@ -0,0 +1,57 @@
+/**
+ * <copyright> Copyright (c) 2006 by Know-Center, Graz, Austria </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+ * NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
+ * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES.
+ *
+ * $Id: SignatureTypesException.java,v 1.2 2006/08/25 17:10:34 wprinz Exp $
+ */
+package at.knowcenter.wag.egov.egiz.exceptions;
+
+/**
+ * Exception for Signature Type problems.
+ * @author wprinz
+ */
+public class SignatureTypesException extends PresentableException
+{
+
+ /**
+ * SVUID.
+ */
+ private static final long serialVersionUID = -7899273202684297943L;
+
+ /**
+ * @param message
+ */
+ public SignatureTypesException(String message)
+ {
+ super(message);
+ }
+
+ /**
+ * @param message
+ * @param cause
+ */
+ public SignatureTypesException(String message, Throwable cause)
+ {
+ super(message, cause);
+ }
+
+ /**
+ * @param cause
+ */
+ public SignatureTypesException(Throwable cause)
+ {
+ super(cause);
+ }
+
+}
diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/exceptions/WebException.java b/src/main/java/at/knowcenter/wag/egov/egiz/exceptions/WebException.java
new file mode 100644
index 0000000..5f72211
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/egov/egiz/exceptions/WebException.java
@@ -0,0 +1,72 @@
+/*
+ * <copyright>
+ * Copyright (c) 2006 by Know-Center, Graz, Austria
+ * </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF THE
+ * SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE,
+ * OR NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES
+ * SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING
+ * THIS SOFTWARE OR ITS DERIVATIVES.
+ *
+ * $Id: WebException.java,v 1.2 2006/08/25 17:10:34 wprinz Exp $
+ */
+package at.knowcenter.wag.egov.egiz.exceptions;
+
+
+/**
+ * Exception for web problems.
+ * @author wlackner
+ */
+public class WebException extends ErrorCodeException {
+
+ /**
+ * SVUID.
+ */
+ private static final long serialVersionUID = 4329890155872840492L;
+
+ /**
+ * @param error_code
+ * @param message
+ * @param cause
+ */
+ public WebException(int error_code, String message, Throwable cause)
+ {
+ super(error_code, message, cause);
+ }
+
+ /**
+ * @param error_code
+ * @param message
+ */
+ public WebException(int error_code, String message)
+ {
+ super(error_code, message);
+ }
+
+ /**
+ * @param error_code
+ * @param cause
+ */
+ public WebException(int error_code, Throwable cause)
+ {
+ super(error_code, cause);
+ }
+
+ /**
+ * @param error_code
+ */
+ public WebException(int error_code)
+ {
+ super(error_code);
+ }
+
+
+
+}
diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/framework/FoundBlock.java b/src/main/java/at/knowcenter/wag/egov/egiz/framework/FoundBlock.java
new file mode 100644
index 0000000..53afa10
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/egov/egiz/framework/FoundBlock.java
@@ -0,0 +1,198 @@
+/**
+ * <copyright> Copyright (c) 2006 by Know-Center, Graz, Austria </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+ * NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
+ * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES.
+ *
+ * $Id: FoundBlock.java,v 1.2 2006/10/31 08:07:29 wprinz Exp $
+ */
+package at.knowcenter.wag.egov.egiz.framework;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import at.knowcenter.wag.egov.egiz.sig.SignatureTypeDefinition;
+import at.knowcenter.wag.egov.egiz.sig.SignatureTypes;
+
+/**
+ * Contains all the information about a found Block in text extracton.
+ *
+ * <p>
+ * This is basically the ordered list of found captions.
+ * </p>
+ *
+ * @author wprinz
+ */
+public class FoundBlock
+{
+ /**
+ * The ordered list of found keys.
+ */
+ public List found_keys = null;
+
+ /**
+ * The end index of the block.
+ */
+ public int end_index = 0;
+
+ /**
+ * The type of the block.
+ */
+ public SignatureTypeDefinition std = null;
+
+ /**
+ * Returns the first key of this block.
+ *
+ * @return Returns the first key of this block.
+ */
+ public FoundKey getFirstKey()
+ {
+ return (FoundKey) this.found_keys.get(found_keys.size() - 1);
+ }
+
+ /**
+ * Returns the last key of this block.
+ *
+ * @return Returns the last key of this block.
+ */
+ public FoundKey getLastKey()
+ {
+ return (FoundKey) this.found_keys.get(0);
+ }
+
+ /**
+ * Returns the size of this block.
+ *
+ * <p>
+ * Note that this doesn't give the exact size of the block, but rather a value
+ * suirable for comparison.
+ * </p>
+ *
+ * @return Returns the size of this block.
+ */
+ public int getSize()
+ {
+ int size = getLastKey().start_index - getFirstKey().start_index;
+ return size;
+ }
+
+ /**
+ * @see java.lang.Object#toString()
+ */
+ public String toString()
+ {
+ return "FoundBlock: std=" + this.std.getType() + ", #=" + this.found_keys.size() + ", size = " + getSize();
+ }
+
+ /**
+ * Tells, if this block is semantically equal to the other block.
+ *
+ * Two blocks are semantically equal, if all the required have the
+ * same captions in the same order.
+ *
+ * @param other_block
+ * The other block.
+ * @return Returns true, of this block is semantically equal to the other one,
+ * false otherwise.
+ */
+ public boolean isSemanticallyEqual(FoundBlock other_block)
+ {
+ List this_keys = filterOutNonRequiredFoundKeys(this.found_keys);
+ List other_keys = filterOutNonRequiredFoundKeys(other_block.found_keys);
+
+ if (this_keys.size() != other_keys.size())
+ {
+ return false;
+ }
+
+ for (int i = 0; i < this_keys.size(); i++)
+ {
+ FoundKey this_found_key = (FoundKey) this_keys.get(i);
+ FoundKey other_found_key = (FoundKey) other_keys.get(i);
+
+ if (!this_found_key.isSemanticallyEqual(other_found_key))
+ {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /**
+ * Filters out all non required keys from the List of found keys.
+ *
+ * @param found_keys The List of found keys.
+ *
+ * @return Rturns the subset List which contains only the required keys.
+ */
+ protected static List filterOutNonRequiredFoundKeys (List found_keys)
+ {
+ List required_found_keys = new ArrayList(found_keys.size());
+ for (int i = 0; i < found_keys.size(); i++)
+ {
+ FoundKey this_found_key = (FoundKey) found_keys.get(i);
+
+ if (!SignatureTypes.isRequiredKey(this_found_key.key))
+ {
+ continue;
+ }
+
+ required_found_keys.add(this_found_key);
+ }
+ return required_found_keys;
+ }
+
+ /**
+ * Tells, if this block is strictly semantically equal to the other block.
+ *
+ * Two blocks are strictly semantically equal, if they contain the same keys with the
+ * same captions in the same order.
+ *
+ * @param other_block
+ * The other block.
+ * @return Returns true, of this block is semantically equal to the other one,
+ * false otherwise.
+ */
+ public boolean isStrictlySemanticallyEqual(FoundBlock other_block)
+ {
+ if (this.found_keys.size() != other_block.found_keys.size())
+ {
+ return false;
+ }
+
+ for (int i = 0; i < this.found_keys.size(); i++)
+ {
+ FoundKey this_found_key = (FoundKey) this.found_keys.get(i);
+ FoundKey other_found_key = (FoundKey) other_block.found_keys.get(i);
+
+ if (!this_found_key.isSemanticallyEqual(other_found_key))
+ {
+ return false;
+ }
+ }
+ return true;
+ }
+
+
+ public FoundKey getDateFoundKey ()
+ {
+ for (int i = 0; i < this.found_keys.size(); i++)
+ {
+ FoundKey found_key = (FoundKey) this.found_keys.get(i);
+ if (found_key.key.equals(SignatureTypes.SIG_DATE))
+ {
+ return found_key;
+ }
+ }
+ throw new RuntimeException("There is no SIG_DATE in the list of found_keys. This must not happen.");
+ }
+}
diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/framework/FoundKey.java b/src/main/java/at/knowcenter/wag/egov/egiz/framework/FoundKey.java
new file mode 100644
index 0000000..67cc417
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/egov/egiz/framework/FoundKey.java
@@ -0,0 +1,96 @@
+/**
+ * <copyright> Copyright (c) 2006 by Know-Center, Graz, Austria </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+ * NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
+ * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES.
+ *
+ * $Id: FoundKey.java,v 1.1 2006/08/25 17:07:21 wprinz Exp $
+ */
+package at.knowcenter.wag.egov.egiz.framework;
+
+/**
+ * Holds the information of one found key.
+ * @author wprinz
+ */
+public class FoundKey
+{
+ /**
+ * The type of the key.
+ */
+ public String key = null;
+
+ /**
+ * The caption of the key.
+ */
+ public String caption = null;
+
+ /**
+ * The start index of the caption in the text.
+ */
+ public int start_index = -1;
+
+ /**
+ *
+ * @param key The type of the key.
+ * @param caption The caption of the key.
+ * @param start_index The start index of the caption in the text.
+ */
+ public FoundKey(String key, String caption, int start_index)
+ {
+ this.key = key;
+ this.caption = caption;
+ this.start_index = start_index;
+ }
+
+ /**
+ * Returns the key.
+ * @return Returns the key.
+ */
+ public String getKey()
+ {
+ return this.key;
+ }
+
+ /**
+ * Returns the start_index.
+ * @return Returns the start_index.
+ */
+ public int getStartIndex()
+ {
+ return this.start_index;
+ }
+
+ /**
+ * @see java.lang.Object#toString()
+ */
+ public String toString()
+ {
+ return this.key + "(" + this.caption + ")@" + this.start_index;
+ }
+
+ /**
+ * Tells, if this FoundKey is semantically equal to the other FoundKey.
+ *
+ * <p>
+ * Two FoundKeys are semantically equal if their key and caption are the same.
+ * </p>
+ *
+ * @param other_found_key
+ * The other FoundKey.
+ * @return Returns true if the two keys are semantically equal.
+ */
+ public boolean isSemanticallyEqual(FoundKey other_found_key)
+ {
+ return this.key.equals(other_found_key.key) && this.caption.equals(other_found_key.caption);
+ }
+
+}
diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/framework/SignResult.java b/src/main/java/at/knowcenter/wag/egov/egiz/framework/SignResult.java
new file mode 100644
index 0000000..c7dfcdb
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/egov/egiz/framework/SignResult.java
@@ -0,0 +1,96 @@
+/**
+ * <copyright> Copyright (c) 2006 by Know-Center, Graz, Austria </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+ * NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
+ * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES.
+ *
+ * $Id: SignResult.java,v 1.1 2006/08/25 17:07:21 wprinz Exp $
+ */
+package at.knowcenter.wag.egov.egiz.framework;
+
+import java.io.Serializable;
+
+/**
+ * This class holds the signed document, which is given by the mime type and the
+ * binary data.
+ *
+ * @author wprinz
+ */
+public class SignResult implements Serializable
+{
+ /**
+ * SVUID.
+ */
+ private static final long serialVersionUID = -6664489317508509973L;
+
+ /**
+ * The mime type of the data specifying the type of the document.
+ */
+ protected String mime_type = null;
+
+ /**
+ * The binary data of the document.
+ */
+ protected byte[] data = null;
+
+ /**
+ * Constructor.
+ *
+ * @param document_mime_type
+ * The mime type of the data specifying the type of the document.
+ * @param document_data
+ * The binary data of the document.
+ */
+ public SignResult(String document_mime_type, byte[] document_data)
+ {
+ if (document_mime_type == null && document_mime_type.length() == 0)
+ {
+ throw new IllegalArgumentException("Please provide a valid Mime Type for the SignResult. " + document_mime_type);
+ }
+ if (document_data == null)
+ {
+ throw new IllegalArgumentException("Please provide document data. " + document_data);
+ }
+
+ this.mime_type = document_mime_type;
+ this.data = document_data;
+ }
+
+ /**
+ * Returns the binary data.
+ *
+ * @return Returns the binary data.
+ */
+ public byte[] getData()
+ {
+ return this.data;
+ }
+
+ /**
+ * Returns the mime type.
+ *
+ * @return Returns the mime type.
+ */
+ public String getMimeType()
+ {
+ return this.mime_type;
+ }
+
+ /**
+ * @see java.lang.Object#toString()
+ */
+ public String toString()
+ {
+ return "SignResult:" + this.mime_type + "," + this.data.length;
+ }
+
+}
diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/framework/Signator.java b/src/main/java/at/knowcenter/wag/egov/egiz/framework/Signator.java
new file mode 100644
index 0000000..7719818
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/egov/egiz/framework/Signator.java
@@ -0,0 +1,67 @@
+/**
+ * <copyright> Copyright (c) 2006 by Know-Center, Graz, Austria </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+ * NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
+ * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES.
+ *
+ * $Id: Signator.java,v 1.1 2006/08/25 17:07:21 wprinz Exp $
+ */
+package at.knowcenter.wag.egov.egiz.framework;
+
+import at.knowcenter.wag.egov.egiz.exceptions.PDFDocumentException;
+import at.knowcenter.wag.egov.egiz.exceptions.PresentableException;
+import at.knowcenter.wag.egov.egiz.pdf.IncrementalUpdateInformation;
+import at.knowcenter.wag.egov.egiz.pdf.TablePos;
+
+/**
+ * The basic interface for signator algorithms.
+ *
+ * @author wprinz
+ */
+public interface Signator
+{
+ /**
+ * This is called before the data is sent to the connector.
+ *
+ * @param pdf
+ * The PDF document to be signed.
+ * @param signature_type
+ * The type/profile of the signature to apply.
+ * @param pos
+ * The table position. If null, the position is read from the
+ * profile, if this is null too, the position is computed.
+ * @param has_SIG_ID
+ * Tells the algorithm, id a SIG_ID field will be required after
+ * signing. Algorithms with fixed formatted signature blocks need to
+ * know this.
+ * @return Returns the IncrementalUpdateInformation.
+ * @throws PresentableException
+ * Forwarded exception.
+ */
+ public IncrementalUpdateInformation prepareSign(byte[] pdf,
+ String signature_type, TablePos pos, boolean has_SIG_ID) throws PresentableException;
+
+ /**
+ * This is called after the data has been signed by the connector.
+ *
+ * <p>
+ * Replaces all the left out placeholders with their values retrieved from the
+ * signation process.
+ * </p>
+ *
+ * @param iui
+ * The IncrementalUpdateInformation.
+ * @throws PDFDocumentException
+ * Forwarded exception.
+ */
+ public SignResult finishSign(IncrementalUpdateInformation iui) throws PresentableException;
+}
diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/framework/SignatorFactory.java b/src/main/java/at/knowcenter/wag/egov/egiz/framework/SignatorFactory.java
new file mode 100644
index 0000000..fbba7dc
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/egov/egiz/framework/SignatorFactory.java
@@ -0,0 +1,174 @@
+/**
+ * <copyright> Copyright (c) 2006 by Know-Center, Graz, Austria </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+ * NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
+ * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES.
+ *
+ * $Id: SignatorFactory.java,v 1.2 2006/08/30 14:02:35 wprinz Exp $
+ */
+package at.knowcenter.wag.egov.egiz.framework;
+
+import at.knowcenter.wag.egov.egiz.PdfASID;
+import at.knowcenter.wag.egov.egiz.exceptions.SignatorFactoryException;
+import at.knowcenter.wag.egov.egiz.framework.signators.BinarySignator_1_0_0;
+import at.knowcenter.wag.egov.egiz.framework.signators.DetachedSignator_1_0_0;
+import at.knowcenter.wag.egov.egiz.framework.signators.TextualSignator_1_0_0;
+
+/**
+ * This factory creates instances of Signator classes corresponding to the given
+ * PdfAS Algorithm IDs.
+ *
+ * @author wprinz
+ */
+public abstract class SignatorFactory
+{
+ /**
+ * The Vendor.
+ */
+ public static final String VENDOR = "bka.gv.at";
+
+ /**
+ * The binary Signator algorithm.
+ */
+ public static final String TYPE_BINARY = "binaer";
+
+ /**
+ * The textual Signator algorithm.
+ */
+ public static final String TYPE_TEXTUAL = "text";
+
+ /**
+ * This signator is only for testing the framework.
+ */
+ public static final String TYPE_TEST = "testalgo";
+
+ /**
+ * This application's current algorithm versions.
+ */
+ public static final String VERSION_1_0_0 = "v1.0.0";
+
+ /**
+ * The most recent binary algorithm this application provides.
+ */
+ public static final PdfASID MOST_RECENT_BINARY_SIGNATOR_ID = BinarySignator_1_0_0.MY_ID;
+
+ /**
+ * The most recent textual algorithm this application provides.
+ */
+ public static final PdfASID MOST_RECENT_TEXTUAL_SIGNATOR_ID = TextualSignator_1_0_0.MY_ID;
+
+ /**
+ * The most recent test algorithm this application provides.
+ */
+ public static final PdfASID MOST_RECENT_DETACHED_SIGNATOR_ID = DetachedSignator_1_0_0.MY_ID;
+
+ /**
+ * Creates a Signator for the given ID.
+ *
+ * @param id
+ * The ID of the Signator to be created.
+ * @return Returns the created Signator object.
+ * @throws SignatorFactoryException
+ * Thrown, if there is no appropriate Signator for the given ID.
+ */
+ public static Signator createSignator(PdfASID id) throws SignatorFactoryException
+ {
+ if (!id.getVendor().equals(VENDOR))
+ {
+ throw new SignatorFactoryException("The vendor '" + id.getVendor() + "' is unrecognized by this SignatorFactory. (id='" + id + "')");
+ }
+
+ if (id.getType().equals(TYPE_BINARY))
+ {
+ if (id.getVersion().equals(VERSION_1_0_0))
+ {
+ return new BinarySignator_1_0_0();
+ }
+
+ throw new SignatorFactoryException("The version '" + id.getVersion() + "' of type '" + id.getType() + "' is not supported by this SignatorFactory. (id='" + id + "')");
+ }
+
+ if (id.getType().equals(TYPE_TEXTUAL))
+ {
+ if (id.getVersion().equals(VERSION_1_0_0))
+ {
+ return new TextualSignator_1_0_0();
+ }
+
+ throw new SignatorFactoryException("The version '" + id.getVersion() + "' of type '" + id.getType() + "' is not supported by this SignatorFactory. (id='" + id + "')");
+ }
+
+ if (id.getType().equals(TYPE_TEST))
+ {
+ if (id.getVersion().equals(VERSION_1_0_0))
+ {
+ return new DetachedSignator_1_0_0();
+ }
+
+ throw new SignatorFactoryException("The version '" + id.getVersion() + "' of type '" + id.getType() + "' is not supported by this SignatorFactory. (id='" + id + "')");
+ }
+
+ throw new SignatorFactoryException("The type '" + id.getType() + "' is not supported by this SignatorFactory. (id='" + id + "')");
+ }
+
+ /**
+ * Creates the most recent signator the application provides for the given
+ * type.
+ *
+ * @param signator_type
+ * The type of the signator to be created (see the type field of
+ * PdfASID).
+ * @return Returns the created Signator instance.
+ * @throws SignatorFactoryException
+ * Thrown, if the type is unknown.
+ */
+ public static Signator createMostRecentSignator(String signator_type) throws SignatorFactoryException
+ {
+ PdfASID id = null;
+ if (signator_type.equals(TYPE_BINARY))
+ {
+ id = MOST_RECENT_BINARY_SIGNATOR_ID;
+ }
+ if (signator_type.equals(TYPE_TEXTUAL))
+ {
+ id = MOST_RECENT_TEXTUAL_SIGNATOR_ID;
+ }
+ if (signator_type.equals(TYPE_TEST))
+ {
+ id = MOST_RECENT_TEXTUAL_SIGNATOR_ID;
+ }
+
+ if (id == null)
+ {
+ throw new SignatorFactoryException("The type '" + signator_type + "' is not supported by this SignatorFactory.");
+ }
+
+ return createSignator(id);
+ }
+
+ /**
+ * Returns the list of available Signator algorithms of this application.
+ *
+ * <p>
+ * Use createMostRecentSignator to create the most recent signator for the
+ * type.
+ * </p>
+ *
+ * @return Returns the list of available Signator algorithms of this
+ * application.
+ */
+ public static String[] getAvailableTyes()
+ {
+ String[] types = new String[] { TYPE_BINARY, TYPE_TEXTUAL, TYPE_TEST };
+ return types;
+ }
+}
diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/framework/VerificationFilter.java b/src/main/java/at/knowcenter/wag/egov/egiz/framework/VerificationFilter.java
new file mode 100644
index 0000000..dd7a742
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/egov/egiz/framework/VerificationFilter.java
@@ -0,0 +1,494 @@
+/**
+ * <copyright> Copyright (c) 2006 by Know-Center, Graz, Austria </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+ * NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
+ * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES.
+ *
+ * $Id: VerificationFilter.java,v 1.5 2006/10/31 08:07:20 wprinz Exp $
+ */
+package at.knowcenter.wag.egov.egiz.framework;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.PrintStream;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.log4j.Logger;
+
+import at.knowcenter.wag.egov.egiz.PdfAS;
+import at.knowcenter.wag.egov.egiz.PdfASID;
+import at.knowcenter.wag.egov.egiz.cfg.ConfigLogger;
+import at.knowcenter.wag.egov.egiz.cfg.SettingsReader;
+import at.knowcenter.wag.egov.egiz.exceptions.InvalidIDException;
+import at.knowcenter.wag.egov.egiz.exceptions.NormalizeException;
+import at.knowcenter.wag.egov.egiz.exceptions.PDFDocumentException;
+import at.knowcenter.wag.egov.egiz.exceptions.PresentableException;
+import at.knowcenter.wag.egov.egiz.exceptions.SignatureException;
+import at.knowcenter.wag.egov.egiz.exceptions.SignatureTypesException;
+import at.knowcenter.wag.egov.egiz.framework.verificators.BinaryVerificator_1_0_0;
+import at.knowcenter.wag.egov.egiz.framework.verificators.TextualVerificator_1_0_0;
+import at.knowcenter.wag.egov.egiz.pdf.AbsoluteTextSignature;
+import at.knowcenter.wag.egov.egiz.pdf.BinarySignature;
+import at.knowcenter.wag.egov.egiz.pdf.Placeholder;
+import at.knowcenter.wag.egov.egiz.pdf.SignatureHolder;
+import at.knowcenter.wag.egov.egiz.pdf.StringInfo;
+import at.knowcenter.wag.exactparser.ParseDocument;
+import at.knowcenter.wag.exactparser.parsing.IndirectObjectReference;
+import at.knowcenter.wag.exactparser.parsing.PDFUtils;
+import at.knowcenter.wag.exactparser.parsing.results.ArrayParseResult;
+import at.knowcenter.wag.exactparser.parsing.results.DictionaryParseResult;
+import at.knowcenter.wag.exactparser.parsing.results.FooterParseResult;
+import at.knowcenter.wag.exactparser.parsing.results.IndirectObjectReferenceParseResult;
+import at.knowcenter.wag.exactparser.parsing.results.NumberParseResult;
+import at.knowcenter.wag.exactparser.parsing.results.ObjectParseResult;
+
+
+/**
+ * This filter transforms an arbitrary input pdf into an ordered List of
+ * SignatureHolders for verification.
+ *
+ * <p>
+ * The pdf document is parsed and the signature blocks (textual, binary, etc.)
+ * are extracted as verifyable SignatureHolder objects in the order they appear
+ * in the document.
+ * </p>
+ *
+ * @author wprinz
+ */
+public class VerificationFilter
+{
+ public static final byte[] EGIZ_DICT_NAME = { 'E', 'G', 'I', 'Z', 'S', 'i',
+ 'g', 'D', 'i', 'c', 't' };
+
+ public static final byte[] EGIZ_KZ_NAME = { 'I', 'D' };
+
+ /**
+ * The logger definition.
+ */
+ private static final Logger logger_ = ConfigLogger.getLogger(VerificationFilter.class);
+
+ /**
+ * Default constructor.
+ */
+ public VerificationFilter()
+ {
+ // empty block.
+ }
+
+ /**
+ * Extracts the List of SignatureHolders from the given PDF document.
+ *
+ * @param pdf
+ * The PDF document.
+ * @return Returns the ordered List of SignatureHolder objects (the first
+ * signature will be at index 0) extracted from the document or an
+ * empty list, if none could be found.
+ * @throws PresentableException
+ */
+ public List extractSignaturesFromPdf(final byte[] pdf) throws PresentableException
+ {
+ List holders = new ArrayList();
+
+ List blocks = null;
+ try
+ {
+ blocks = ParseDocument.parseDocument(pdf);
+ }
+ catch (Exception e)
+ {
+ throw new PDFDocumentException(201);
+ }
+
+// for (int i = 0; i < blocks.size(); i++)
+// {
+// FooterParseResult bpr = (FooterParseResult) blocks.get(i);
+// // logger_.debug("block[" + i + "] from " + bpr.start_index + " to
+// // " + bpr.next_index);
+// }
+
+ unrollLinearization(blocks);
+
+ for (int i = 0; i < blocks.size(); i++)
+ {
+ FooterParseResult bpr = (FooterParseResult) blocks.get(i);
+
+ int prev_end = 0;
+ if (i > 0)
+ {
+ FooterParseResult prev_bpr = (FooterParseResult) blocks.get(i - 1);
+ prev_end = prev_bpr.next_index;
+ }
+
+ // logger_.debug("block from " + prev_end + " to " +
+ // bpr.next_index);
+
+ if (containsEGIZDict(pdf, bpr))
+ {
+ logger_.debug("Parsing Binary Sig:");
+
+ PdfASID kz = extractKZFromEGIZBlock(pdf, bpr);
+
+ if (!kz.toString().equals(BinaryVerificator_1_0_0.MY_ID.toString()))
+ {
+ logger_.debug("Warning: Binary Kennzeichnung not recognized:" + kz.toString());
+ }
+
+ Verificator verificator = new BinaryVerificator_1_0_0();
+ List binary_holders = verificator.parseBlock(pdf, bpr, prev_end);
+
+ holders.addAll(binary_holders);
+
+ logger_.debug(":Parsing Binary Sig END - holders.size = " + holders.size());
+ }
+ else
+ {
+ logger_.debug("Extracting text for: " + prev_end + " to " + bpr.next_index);
+
+ Verificator verificator = new TextualVerificator_1_0_0();
+ List text_holders = verificator.parseBlock(pdf, bpr, prev_end);
+ logger_.debug("text_holders = " + text_holders.size());
+
+ if (prev_end == 0)
+ {
+ String rest_text = null;
+ if (!text_holders.isEmpty())
+ {
+ SignatureHolder first_holder = (SignatureHolder) text_holders.get(0);
+ rest_text = first_holder.getSignedText();
+ }
+ else
+ {
+ rest_text = PdfAS.extractNormalizedTextTextual(pdf, bpr.next_index);
+ }
+
+ List old_holders = PdfAS.extractSignatureHoldersTextual(rest_text, true);
+
+ logger_.debug("Found old holders = " + old_holders.size());
+ if (!old_holders.isEmpty())
+ {
+ // there must be only one old holder.
+ holders.add(0, old_holders.get(0));
+ }
+ }
+
+ if (!text_holders.isEmpty())
+ {
+ List actual_text_holders = throwOutBinHolders(text_holders);
+ holders.addAll(actual_text_holders);
+ }
+
+ logger_.debug(":Extracting tex END - holders.size = " + holders.size());
+ }
+ }
+
+ for (int i = 0; i < holders.size(); i++)
+ {
+ SignatureHolder holder = (SignatureHolder) holders.get(i);
+
+ PdfASID kz = holder.getSignatureObject().getKZ();
+ if (kz != null)
+ {
+ checkKZ(kz);
+ }
+ }
+
+ return holders;
+ }
+
+ /**
+ * Checks, if the given KZ is recognized by this application or logs a warning if it isn't.
+ * @param kz The Kennzeichnung.
+ */
+ protected void checkKZ (PdfASID kz)
+ {
+ if (!kz.getVendor().equals(SignatorFactory.VENDOR))
+ {
+ logger_.warn("The vendor " + kz.getVendor() + " isn't known by this application.");
+ }
+ if (!kz.getVersion().equals(SignatorFactory.VERSION_1_0_0))
+ {
+ logger_.warn("The version " + kz.getVersion() + " istn't supported by this application. This might cause problems.");
+ }
+ }
+
+ /**
+ * Throws out SignatureHolders with a binary KZ.
+ *
+ * @param text_holders
+ * The List of SignatureHolder objects.
+ * @return Returns the List of SignatureHolder objects, where no object has
+ * binary KZ.
+ */
+ private List throwOutBinHolders(List text_holders)
+ {
+ List actual_text_holders = new ArrayList();
+ for (int i = 0; i < text_holders.size(); i++)
+ {
+ SignatureHolder sh = (SignatureHolder) text_holders.get(i);
+ PdfASID kz = null;
+ try
+ {
+ kz = sh.getSignatureObject().getKZ();
+ }
+ catch (InvalidIDException e)
+ {
+ e.printStackTrace();
+ }
+ if (kz != null && kz.getType().equals(SignatorFactory.TYPE_BINARY))
+ {
+ logger_.info("Throwing out binary signature: " + kz);
+ continue;
+ }
+ actual_text_holders.add(sh);
+ }
+ return actual_text_holders;
+ }
+
+ /**
+ * Removes the linearization footer from the list of update blocks.
+ *
+ * @param blocks
+ * The list of FooterParseResult objects in \prev order.
+ */
+ protected void unrollLinearization(List blocks)
+ {
+ int linearization_index = -1;
+ for (int i = 0; i < blocks.size(); i++)
+ {
+ FooterParseResult bpr = (FooterParseResult) blocks.get(i);
+
+ if (bpr.sxpr.xref_index == 0)
+ {
+ if (linearization_index >= 0)
+ {
+ throw new RuntimeException("There is more than one linearization block! index = " + i);
+ }
+ linearization_index = i;
+ }
+ }
+
+ if (linearization_index >= 0)
+ {
+ // logger_.debug("The document is linearized - unrolling
+ // linearization block " + linearization_index);
+ blocks.remove(linearization_index);
+ }
+ }
+
+ /**
+ * Extracts the List of SignatureHolders from the given plain text document.
+ *
+ * <p>
+ * Note that this can only extract text signatures.
+ * </p>
+ *
+ * @param raw_text
+ * The plain text document.
+ * @return Returns the ordered List of SignatureHolder objects (the first
+ * signature will be at index 0) extracted from the document or an
+ * empty list, if none could be found.
+ * @throws SignatureException
+ * @throws PDFDocumentException
+ * @throws SignatureTypesException
+ * @throws NormalizeException
+ */
+ public List extractSignaturesFromPlainText(final String raw_text) throws PDFDocumentException, SignatureException, SignatureTypesException, NormalizeException
+ {
+ String normalized_text = PdfAS.normalizeText(raw_text);
+
+ //List text_holders = PdfAS.extractSignatureHoldersTextual(normalized_text, false);
+ List text_holders = AbsoluteTextSignature.extractSignatureHoldersFromText(normalized_text);
+
+ String rest_text = normalized_text;
+ if (!text_holders.isEmpty())
+ {
+ SignatureHolder holder = (SignatureHolder) text_holders.get(0);
+ rest_text = holder.getSignedText();
+ }
+
+ List old_holders = PdfAS.extractSignatureHoldersTextual(rest_text, true);
+ if (!old_holders.isEmpty())
+ {
+ text_holders.addAll(0, old_holders);
+ }
+
+ List actual_text_holders = throwOutBinHolders(text_holders);
+
+ return actual_text_holders;
+ }
+
+ /**
+ * Tells, if the given incremental update block contains a binary signature.
+ *
+ * <p>
+ * According to definition, if a block is a binary block, it must/cannot
+ * contain other signatures than this one.
+ * </p>
+ *
+ * @param block
+ * The incremental update block.
+ * @return Returns true, if this block is a binary signature block, false
+ * otherwise.
+ */
+ protected boolean containsEGIZDict(final byte[] pdf,
+ final FooterParseResult block)
+ {
+ int dict_index = PDFUtils.indexOfName(pdf, block.tpr.dpr.names, EGIZ_DICT_NAME);
+ if (dict_index <= 0)
+ {
+ return false;
+ }
+
+ return true;
+ }
+
+ /**
+ * Extracts the PDF AS ID of the egiz block.
+ *
+ * @param pdf
+ * The pdf.
+ * @param block
+ * The IU block.
+ * @return Returns the extracted PDF AS ID.
+ * @throws PDFDocumentException
+ * Forwarded exception.
+ * @throws InvalidIDException
+ * Forwarded exception.
+ */
+ protected PdfASID extractKZFromEGIZBlock(final byte[] pdf,
+ final FooterParseResult block) throws PDFDocumentException, InvalidIDException
+ {
+ int egiz_index = PDFUtils.indexOfName(pdf, block.tpr.dpr.names, VerificationFilter.EGIZ_DICT_NAME);
+ if (egiz_index < 0)
+ {
+ throw new PDFDocumentException(301, "egiz_index = " + egiz_index);
+ }
+
+ IndirectObjectReferenceParseResult egiz_dict_iorpr = (IndirectObjectReferenceParseResult) block.tpr.dpr.values.get(egiz_index);
+ // logger_.debug("egiz_dict_ir = " + egiz_dict_iorpr.ior.object_number
+ // + " " + egiz_dict_iorpr.ior.generation_number);
+
+ IndirectObjectReference ior = egiz_dict_iorpr.ior;
+
+ final int egiz_dict_offset = PDFUtils.getObjectOffsetFromXRefByIndirectObjectReference(block.xpr, ior);
+ // logger_.debug("egiz_dict_offset = " + egiz_dict_offset);
+
+ ObjectParseResult obj = PDFUtils.parseObject(pdf, egiz_dict_offset);
+ DictionaryParseResult egiz_dict = (DictionaryParseResult) obj.object;
+
+ int kz_index = PDFUtils.indexOfName(pdf, egiz_dict.names, EGIZ_KZ_NAME);
+ if (kz_index < 0)
+ {
+ throw new PDFDocumentException(301, "kz_index = " + kz_index);
+ }
+ ArrayParseResult kz_apr = (ArrayParseResult) egiz_dict.values.get(kz_index);
+
+ String kz_string = restoreKZ(pdf, kz_apr);
+ PdfASID kz = new PdfASID(kz_string);
+
+ return kz;
+ }
+
+ /**
+ * Restores the Kennzeichnung String from an Array.
+ *
+ * @param pdf
+ * The PDF.
+ * @param kz_apr
+ * The Array, as parsed from the EGIZ Dict.
+ * @return Returns the restored KZ.
+ * @throws PDFDocumentException
+ * Forwarded exception.
+ */
+ public static String restoreKZ(byte[] pdf, ArrayParseResult kz_apr) throws PDFDocumentException
+ {
+ try
+ {
+ List partition = new ArrayList();
+
+ for (int i = 0; i < kz_apr.elements.size() / 2; i++)
+ {
+ NumberParseResult start_npr = (NumberParseResult) kz_apr.elements.get(i * 2);
+ NumberParseResult length_npr = (NumberParseResult) kz_apr.elements.get(i * 2 + 1);
+
+ StringInfo si = new StringInfo();
+ si.string_start = start_npr.number;
+ si.string_length = length_npr.number;
+
+ partition.add(si);
+ }
+
+ String KZ = Placeholder.reconstructStringFromPartition(pdf, partition, BinarySignature.ENCODING_WIN);
+ return KZ;
+ }
+ catch (IOException e1)
+ {
+ throw new PDFDocumentException(201);
+ }
+ }
+
+
+ protected static void printFoundHolders (String list_caption, List found_holders, PrintStream writer)
+ {
+ writer.println("------------------------------------");
+ writer.println(list_caption + ": #=" + found_holders.size());
+
+ for (int i = 0; i < found_holders.size(); i++)
+ {
+ SignatureHolder holder = (SignatureHolder) found_holders.get(i);
+ String kz = "invalid";
+ try
+ {
+ PdfASID kz_id = holder.getSignatureObject().getKZ();
+ if (kz_id == null)
+ {
+ kz = "old signature";
+ }
+ else
+ {
+ kz = kz_id.toString();
+ }
+ }
+ catch (InvalidIDException e)
+ {
+ e.printStackTrace();
+ }
+ writer.println(" holder[" + i + "]: " + holder.getSignatureObject().getSignationType() + ", KZ=" + kz);
+ }
+
+ writer.println(":" + list_caption);
+ writer.println("------------------------------------");
+
+ }
+
+ public static void main(String[] args) throws IOException, PresentableException
+ {
+ SettingsReader.initializeForCommandLine();
+
+ File in = new File(args[0]);
+ FileInputStream fis = new FileInputStream(in);
+ byte[] pdf = new byte[(int) in.length()];
+ fis.read(pdf);
+ fis.close();
+
+ String text = PdfAS.extractNormalizedTextTextual(pdf, pdf.length);;
+
+ VerificationFilter vf = new VerificationFilter();
+ //List found = vf.extractSignaturesFromPdf(pdf);
+
+ List found = vf.extractSignaturesFromPlainText(text);
+
+ printFoundHolders("Final Holders", found, System.out);
+ }
+}
diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/framework/Verificator.java b/src/main/java/at/knowcenter/wag/egov/egiz/framework/Verificator.java
new file mode 100644
index 0000000..b17fc79
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/egov/egiz/framework/Verificator.java
@@ -0,0 +1,52 @@
+/**
+ * <copyright> Copyright (c) 2006 by Know-Center, Graz, Austria </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+ * NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
+ * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES.
+ *
+ * $Id: Verificator.java,v 1.1 2006/08/25 17:07:21 wprinz Exp $
+ */
+package at.knowcenter.wag.egov.egiz.framework;
+
+import java.util.List;
+
+import at.knowcenter.wag.egov.egiz.exceptions.PresentableException;
+import at.knowcenter.wag.exactparser.parsing.results.FooterParseResult;
+
+
+/**
+ * Given an Incremental Update Block and the corresponding PDF, a verificator
+ * extracts all Signatures of its type and returns them as valitatable
+ * SignatureHolders.
+ *
+ * @author wprinz
+ */
+public interface Verificator
+{
+ /**
+ * Parses the given document/Block for signatures of this type.
+ *
+ * @param pdf
+ * The whole pdf document. A Verificator must only access the
+ * document up to its given block (block.next_index) and must not
+ * modify any byte in the pdf array.
+ * @param block
+ * The incremental update block.
+ * @param start_of_whole_block
+ * The start of the incremental update block (the end of the previous
+ * block) - If 0, this is the first block (the original Document).
+ * @return Returns the List of SignatureHolder objects found for this block.
+ */
+ public List parseBlock(final byte[] pdf, final FooterParseResult block,
+ int start_of_whole_block) throws PresentableException;
+
+}
diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/framework/signators/BinarySignator_1_0_0.java b/src/main/java/at/knowcenter/wag/egov/egiz/framework/signators/BinarySignator_1_0_0.java
new file mode 100644
index 0000000..d28ac3b
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/egov/egiz/framework/signators/BinarySignator_1_0_0.java
@@ -0,0 +1,195 @@
+/**
+ * <copyright> Copyright (c) 2006 by Know-Center, Graz, Austria </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+ * NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
+ * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES.
+ *
+ * $Id: BinarySignator_1_0_0.java,v 1.1 2006/08/25 17:07:35 wprinz Exp $
+ */
+package at.knowcenter.wag.egov.egiz.framework.signators;
+
+import java.io.UnsupportedEncodingException;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import com.lowagie.text.pdf.PdfPTable;
+
+import at.knowcenter.wag.egov.egiz.PdfAS;
+import at.knowcenter.wag.egov.egiz.PdfASID;
+import at.knowcenter.wag.egov.egiz.cfg.SettingsReader;
+import at.knowcenter.wag.egov.egiz.exceptions.PDFDocumentException;
+import at.knowcenter.wag.egov.egiz.exceptions.PresentableException;
+import at.knowcenter.wag.egov.egiz.framework.SignResult;
+import at.knowcenter.wag.egov.egiz.framework.Signator;
+import at.knowcenter.wag.egov.egiz.framework.SignatorFactory;
+import at.knowcenter.wag.egov.egiz.pdf.BinarySignature;
+import at.knowcenter.wag.egov.egiz.pdf.IncrementalUpdateInformation;
+import at.knowcenter.wag.egov.egiz.pdf.ReplaceInfo;
+import at.knowcenter.wag.egov.egiz.pdf.StringInfo;
+import at.knowcenter.wag.egov.egiz.pdf.TablePos;
+import at.knowcenter.wag.egov.egiz.sig.SignatureFieldDefinition;
+import at.knowcenter.wag.egov.egiz.sig.SignatureObject;
+import at.knowcenter.wag.egov.egiz.sig.SignatureTypes;
+import at.knowcenter.wag.exactparser.ByteArrayUtils;
+
+/**
+ * Signs the document binary.
+ *
+ * <p>
+ * In prepareSign, an Incremental Update is created that contains the Signature
+ * block and the egiz dictionary. For formatting the layout, variable values are
+ * filled with placeholders. After the layout has been fixed, all variable
+ * fields (all holes in the byte ranges) are replaced with 0. This document is
+ * then base64 encoded and signed.
+ * </p>
+ * <p>
+ * In finishSign, the variable fields (values, /Cert) are replaced with the
+ * values according to the encoding.
+ * </p>
+ *
+ * @author wprinz
+ */
+public class BinarySignator_1_0_0 implements Signator
+{
+ /**
+ * The Pdf-AS ID of this Signator.
+ */
+ public static final PdfASID MY_ID = new PdfASID(SignatorFactory.VENDOR, SignatorFactory.TYPE_BINARY, SignatorFactory.VERSION_1_0_0);
+
+ /**
+ * Default constructor.
+ */
+ public BinarySignator_1_0_0()
+ {
+ // Default constructor.
+ }
+
+ /**
+ * @see at.knowcenter.wag.egov.egiz.framework.Signator#prepareSign(byte[],
+ * String, TablePos, boolean)
+ */
+ public IncrementalUpdateInformation prepareSign(byte[] pdf,
+ String signature_type, TablePos pos, boolean has_SIG_ID) throws PresentableException
+ {
+ try
+ {
+ SignatureObject signature_object = PdfAS.createSignatureObjectFromType(signature_type);
+ signature_object.fillValues((char) BinarySignature.LAYOUT_PLACEHOLDER, has_SIG_ID);
+
+ signature_object.setKZ(MY_ID);
+
+ PdfPTable pdf_table = PdfAS.createPdfPTableFromSignatureObject(signature_object);
+
+ if (pos == null)
+ {
+ String pos_string = SettingsReader.getInstance().getSetting(SignatureTypes.SIG_OBJ + signature_type + ".pos", null);
+ if (pos_string != null)
+ {
+ pos = PdfAS.parsePositionFromPosString(pos_string);
+ pdf_table.setTotalWidth(pos.width);
+ pdf_table.setLockedWidth(true);
+ }
+ else
+ {
+ pos = PdfAS.adjustTableAndCalculatePosition(pdf, pdf_table);
+ }
+ }
+ else
+ {
+ pdf_table.setTotalWidth(pos.width);
+ pdf_table.setLockedWidth(true);
+ }
+
+ List all_field_definitions = signature_object.getSignatureTypeDefinition().getFieldDefinitions();
+ List variable_field_definitions = new ArrayList();
+ for (int i = 0; i < all_field_definitions.size(); i++)
+ {
+ SignatureFieldDefinition sfd = (SignatureFieldDefinition) all_field_definitions.get(i);
+ if (sfd.placeholder_length > 0)
+ {
+ if (sfd.field_name.equals(SignatureTypes.SIG_ID) && has_SIG_ID == false)
+ {
+ continue;
+ }
+ variable_field_definitions.add(sfd);
+ }
+ }
+ IncrementalUpdateInformation iui = BinarySignature.writeIncrementalUpdate(pdf, pdf_table, pos, variable_field_definitions, all_field_definitions);
+
+ String temp_string = iui.temp_ir_number + " " + iui.temp_ir_generation + " obj";
+ byte[] temp_bytes = temp_string.getBytes("US-ASCII");
+ int temp_start = ByteArrayUtils.lastIndexOf(iui.signed_pdf, temp_bytes);
+ byte[] stream_bytes = new byte[] { '>', '>', 's', 't', 'r', 'e', 'a',
+ 'm', 0x0A };
+ int stream_start = ByteArrayUtils.indexOf(iui.signed_pdf, temp_start, stream_bytes);
+ iui.content_stream_start = stream_start + stream_bytes.length;
+
+ // update the stream indices
+ Iterator it = iui.replaces.iterator();
+ while (it.hasNext())
+ {
+ ReplaceInfo ri = (ReplaceInfo) it.next();
+
+ Iterator sit = ri.replaces.iterator();
+ while (sit.hasNext())
+ {
+ StringInfo si = (StringInfo) sit.next();
+ si.string_start += iui.content_stream_start;
+ }
+ }
+ // update KZ list indices:
+ it = iui.kz_list.iterator();
+ while (it.hasNext())
+ {
+ StringInfo si = (StringInfo) it.next();
+ si.string_start += iui.content_stream_start;
+ }
+
+ BinarySignature.markByteRanges(iui);
+
+ // byte [] old_signed_pdf = iui.signed_pdf;
+ iui.signed_pdf = BinarySignature.prepareDataToSign(iui.signed_pdf, iui.byte_ranges);
+
+ iui.document_text = BinarySignature.retrieveSignableTextFromData(iui.signed_pdf, iui.signed_pdf.length); // signed_pdf.length);
+
+ return iui;
+
+ }
+ catch (UnsupportedEncodingException e)
+ {
+ e.printStackTrace();
+ throw new PDFDocumentException(201, e);
+ }
+ }
+
+ /**
+ * @see at.knowcenter.wag.egov.egiz.framework.Signator#finishSign(at.knowcenter.wag.egov.egiz.pdf.IncrementalUpdateInformation)
+ */
+ public SignResult finishSign(IncrementalUpdateInformation iui) throws PresentableException
+ {
+ // PdfAS.prefixID(iui.signed_signature_object, PdfAS.BINARY_ID);
+ Iterator it = iui.replaces.iterator();
+ while (it.hasNext())
+ {
+ ReplaceInfo ri = (ReplaceInfo) it.next();
+
+ ri.value = iui.signed_signature_object.getSigValue(ri.sfd.field_name);
+ }
+ BinarySignature.replaceCertificate(iui);
+ BinarySignature.replacePlaceholders(iui);
+
+ SignResult sign_result = new SignResult(PdfAS.PDF_MIME_TYPE, iui.signed_pdf);
+ return sign_result;
+ }
+
+}
diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/framework/signators/DetachedSignator_1_0_0.java b/src/main/java/at/knowcenter/wag/egov/egiz/framework/signators/DetachedSignator_1_0_0.java
new file mode 100644
index 0000000..88d9338
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/egov/egiz/framework/signators/DetachedSignator_1_0_0.java
@@ -0,0 +1,99 @@
+/**
+ * <copyright> Copyright (c) 2006 by Know-Center, Graz, Austria </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+ * NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
+ * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES.
+ *
+ * $Id: DetachedSignator_1_0_0.java,v 1.1 2006/08/30 14:02:35 wprinz Exp $
+ */
+package at.knowcenter.wag.egov.egiz.framework.signators;
+
+import java.io.UnsupportedEncodingException;
+
+import at.knowcenter.wag.egov.egiz.PdfASID;
+import at.knowcenter.wag.egov.egiz.exceptions.PDFDocumentException;
+import at.knowcenter.wag.egov.egiz.exceptions.PresentableException;
+import at.knowcenter.wag.egov.egiz.framework.SignResult;
+import at.knowcenter.wag.egov.egiz.framework.Signator;
+import at.knowcenter.wag.egov.egiz.framework.SignatorFactory;
+import at.knowcenter.wag.egov.egiz.pdf.BinarySignature;
+import at.knowcenter.wag.egov.egiz.pdf.IncrementalUpdateInformation;
+import at.knowcenter.wag.egov.egiz.pdf.TablePos;
+
+/**
+ * This signator is just for testing purposes.
+ *
+ * <p>
+ * It doesn't modify the original document, but simply returns the XML signature
+ * response as the signed document.
+ * </p>
+ *
+ * @author wprinz
+ */
+public class DetachedSignator_1_0_0 implements Signator
+{
+ /**
+ * The Pdf-AS ID of this Signator.
+ */
+ public static final PdfASID MY_ID = new PdfASID(SignatorFactory.VENDOR, SignatorFactory.TYPE_TEST, SignatorFactory.VERSION_1_0_0);
+
+ /**
+ * The Mime Type.
+ */
+ public static final String MIME_TYPE = "text/xml";
+
+ /**
+ * Default constructor.
+ */
+ public DetachedSignator_1_0_0()
+ {
+ // Default constructor.
+ }
+
+ /**
+ * @see at.knowcenter.wag.egov.egiz.framework.Signator#prepareSign(byte[],
+ * String, TablePos, boolean)
+ */
+ public IncrementalUpdateInformation prepareSign(byte[] pdf,
+ String signature_type, TablePos pos, boolean has_SIG_ID) throws PresentableException
+ {
+ IncrementalUpdateInformation iui = new IncrementalUpdateInformation();
+ iui.original_document = pdf;
+ iui.signature_type = signature_type;
+ iui.pos = pos;
+
+ iui.document_text = BinarySignature.retrieveSignableTextFromData(iui.original_document, iui.original_document.length);
+
+ return iui;
+ }
+
+ /**
+ * @see at.knowcenter.wag.egov.egiz.framework.Signator#finishSign(at.knowcenter.wag.egov.egiz.pdf.IncrementalUpdateInformation)
+ */
+ public SignResult finishSign(IncrementalUpdateInformation iui) throws PresentableException
+ {
+ try
+ {
+ String response = iui.signed_signature_object.getRawSignatureResponse();
+ byte[] response_bytes = response.getBytes("UTF-8");
+
+ SignResult sign_result = new SignResult(MIME_TYPE, response_bytes);
+ return sign_result;
+ }
+ catch (UnsupportedEncodingException e)
+ {
+ e.printStackTrace();
+ throw new PDFDocumentException(300, e);
+ }
+ }
+
+}
diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/framework/signators/TextualSignator_1_0_0.java b/src/main/java/at/knowcenter/wag/egov/egiz/framework/signators/TextualSignator_1_0_0.java
new file mode 100644
index 0000000..6e605ff
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/egov/egiz/framework/signators/TextualSignator_1_0_0.java
@@ -0,0 +1,122 @@
+/**
+ * <copyright> Copyright (c) 2006 by Know-Center, Graz, Austria </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+ * NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
+ * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES.
+ *
+ * $Id: TextualSignator_1_0_0.java,v 1.3 2006/10/31 08:07:50 wprinz Exp $
+ */
+package at.knowcenter.wag.egov.egiz.framework.signators;
+
+import com.lowagie.text.pdf.PdfPTable;
+
+import at.knowcenter.wag.egov.egiz.PdfAS;
+import at.knowcenter.wag.egov.egiz.PdfASID;
+import at.knowcenter.wag.egov.egiz.cfg.SettingsReader;
+import at.knowcenter.wag.egov.egiz.exceptions.PresentableException;
+import at.knowcenter.wag.egov.egiz.framework.SignResult;
+import at.knowcenter.wag.egov.egiz.framework.Signator;
+import at.knowcenter.wag.egov.egiz.framework.SignatorFactory;
+import at.knowcenter.wag.egov.egiz.pdf.BinarySignature;
+import at.knowcenter.wag.egov.egiz.pdf.IncrementalUpdateInformation;
+import at.knowcenter.wag.egov.egiz.pdf.TablePos;
+import at.knowcenter.wag.egov.egiz.sig.SignatureTypes;
+
+/**
+ * Signs a document textually.
+ *
+ * <p>
+ * In prepareSign, the document text is extracted and normalized.
+ * </p>
+ * <p>
+ * In finishSign, the signed SignatureObject is transformed into a Signature
+ * block, which is then written as an Incremental Update.
+ * </p>
+ *
+ * @author wprinz
+ */
+public class TextualSignator_1_0_0 implements Signator
+{
+ /**
+ * The Pdf-AS ID of this Signator.
+ */
+ public static final PdfASID MY_ID = new PdfASID(SignatorFactory.VENDOR, SignatorFactory.TYPE_TEXTUAL, SignatorFactory.VERSION_1_0_0);
+
+ /**
+ * Default constructor.
+ */
+ public TextualSignator_1_0_0()
+ {
+ // Default constructor.
+ }
+
+ /**
+ * <p>
+ * The parameter has_SIG_ID is not used by this Signator because it doesn't
+ * pre-format the signature block.
+ * </p>
+ *
+ * @see at.knowcenter.wag.egov.egiz.framework.Signator#prepareSign(byte[],
+ * String, TablePos, boolean)
+ */
+ public IncrementalUpdateInformation prepareSign(byte[] pdf,
+ String signature_type, TablePos pos, boolean has_SIG_ID) throws PresentableException
+ {
+ IncrementalUpdateInformation iui = new IncrementalUpdateInformation();
+ iui.original_document = pdf;
+ iui.signature_type = signature_type;
+ iui.pos = pos;
+
+ iui.document_text = PdfAS.extractNormalizedTextTextual(pdf);
+ // logger_.debug("signed_text = " + document_text);
+
+ return iui;
+ }
+
+ /**
+ * @see at.knowcenter.wag.egov.egiz.framework.Signator#finishSign(at.knowcenter.wag.egov.egiz.pdf.IncrementalUpdateInformation)
+ */
+ public SignResult finishSign(IncrementalUpdateInformation iui) throws PresentableException
+ {
+ // PdfAS.prefixID(iui.signed_signature_object, PdfAS.TEXT_ID);
+
+ iui.signed_signature_object.setKZ(MY_ID);
+
+ PdfPTable pdf_table = PdfAS.createPdfPTableFromSignatureObject(iui.signed_signature_object);
+
+ if (iui.pos == null)
+ {
+ String pos_string = SettingsReader.getInstance().getSetting(SignatureTypes.SIG_OBJ + iui.signature_type + ".pos", null);
+ if (pos_string != null)
+ {
+ iui.pos = PdfAS.parsePositionFromPosString(pos_string);
+ pdf_table.setTotalWidth(iui.pos.width);
+ pdf_table.setLockedWidth(true);
+ }
+ else
+ {
+ iui.pos = PdfAS.adjustTableAndCalculatePosition(iui.original_document, pdf_table);
+ }
+ }
+ else
+ {
+ pdf_table.setTotalWidth(iui.pos.width);
+ pdf_table.setLockedWidth(true);
+ }
+
+ IncrementalUpdateInformation signed_iui = BinarySignature.writeIncrementalUpdate(iui.original_document, pdf_table, iui.pos, null, null);
+
+ SignResult sign_result = new SignResult(PdfAS.PDF_MIME_TYPE, signed_iui.signed_pdf);
+ return sign_result;
+ }
+
+}
diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/framework/verificators/BinaryVerificator_1_0_0.java b/src/main/java/at/knowcenter/wag/egov/egiz/framework/verificators/BinaryVerificator_1_0_0.java
new file mode 100644
index 0000000..9064629
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/egov/egiz/framework/verificators/BinaryVerificator_1_0_0.java
@@ -0,0 +1,373 @@
+/**
+ * <copyright> Copyright (c) 2006 by Know-Center, Graz, Austria </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+ * NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
+ * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES.
+ *
+ * $Id: BinaryVerificator_1_0_0.java,v 1.3 2006/10/11 08:03:22 wprinz Exp $
+ */
+package at.knowcenter.wag.egov.egiz.framework.verificators;
+
+import java.io.ByteArrayOutputStream;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.apache.log4j.Logger;
+
+import at.knowcenter.wag.egov.egiz.PdfASID;
+import at.knowcenter.wag.egov.egiz.cfg.ConfigLogger;
+import at.knowcenter.wag.egov.egiz.cfg.SettingsReader;
+import at.knowcenter.wag.egov.egiz.exceptions.PDFDocumentException;
+import at.knowcenter.wag.egov.egiz.exceptions.PresentableException;
+import at.knowcenter.wag.egov.egiz.framework.SignatorFactory;
+import at.knowcenter.wag.egov.egiz.framework.VerificationFilter;
+import at.knowcenter.wag.egov.egiz.framework.Verificator;
+import at.knowcenter.wag.egov.egiz.pdf.BinaryBlockInfo;
+import at.knowcenter.wag.egov.egiz.pdf.BinarySignature;
+import at.knowcenter.wag.egov.egiz.pdf.BinarySignatureHolder;
+import at.knowcenter.wag.egov.egiz.pdf.Placeholder;
+import at.knowcenter.wag.egov.egiz.pdf.ReplaceInfo;
+import at.knowcenter.wag.egov.egiz.pdf.StringInfo;
+import at.knowcenter.wag.egov.egiz.sig.SignatureObject;
+import at.knowcenter.wag.egov.egiz.sig.SignatureTypes;
+import at.knowcenter.wag.exactparser.parsing.IndirectObjectReference;
+import at.knowcenter.wag.exactparser.parsing.PDFUtils;
+import at.knowcenter.wag.exactparser.parsing.results.ArrayParseResult;
+import at.knowcenter.wag.exactparser.parsing.results.DictionaryParseResult;
+import at.knowcenter.wag.exactparser.parsing.results.FooterParseResult;
+import at.knowcenter.wag.exactparser.parsing.results.IndirectObjectReferenceParseResult;
+import at.knowcenter.wag.exactparser.parsing.results.LiteralStringParseResult;
+import at.knowcenter.wag.exactparser.parsing.results.NameParseResult;
+import at.knowcenter.wag.exactparser.parsing.results.NumberParseResult;
+import at.knowcenter.wag.exactparser.parsing.results.ObjectParseResult;
+import at.knowcenter.wag.exactparser.parsing.results.ParseResult;
+
+
+/**
+ * The BinaryVerificator parses the EGIT Dictionary and extracts the signature
+ * holder from it.
+ *
+ * @author wprinz
+ */
+public class BinaryVerificator_1_0_0 implements Verificator
+{
+ /**
+ * The Pdf-AS ID of this Verificator.
+ */
+ public static final PdfASID MY_ID = new PdfASID(SignatorFactory.VENDOR, SignatorFactory.TYPE_BINARY, SignatorFactory.VERSION_1_0_0);
+
+ /**
+ * The /ODS key in the EGIZ Dict.
+ */
+ public static final byte[] EGIZ_ODS_NAME = new byte[] { 'O', 'D', 'S' };
+
+ /**
+ * The /ID key in the EGIZ Dict.
+ */
+ public static final byte[] EGIZ_KZ_NAME = VerificationFilter.EGIZ_KZ_NAME;
+
+ /**
+ * The /ByteRange key in the EGIZ Dict.
+ */
+ public static final byte[] EGIZ_BYTE_RANGE_NAME = new byte[] { 'B', 'y', 't',
+ 'e', 'R', 'a', 'n', 'g', 'e' };
+
+ /**
+ * The /replaces key in the EGIZ Dict.
+ */
+ public static final byte[] EGIZ_REPLACES_NAME = new byte[] { 'r', 'e', 'p',
+ 'l', 'a', 'c', 'e', 's' };
+
+ /**
+ * The /encodings key in the EGIZ Dict.
+ */
+ public static final byte[] EGIZ_ENCODINGS_NAME = new byte[] { 'e', 'n', 'c',
+ 'o', 'd', 'i', 'n', 'g', 's' };
+
+ /**
+ * The /Cert key in the EGIZ Dict.
+ */
+ public static final byte[] EGIZ_CERT_NAME = new byte[] { 'C', 'e', 'r', 't' };
+
+ /**
+ * The logger definition.
+ */
+ private static final Logger logger_ = ConfigLogger.getLogger(BinaryVerificator_1_0_0.class);
+
+ /**
+ * Default constructor.
+ */
+ public BinaryVerificator_1_0_0()
+ {
+ // Default constructor.
+ }
+
+ /**
+ * @see at.knowcenter.wag.egov.egiz.framework.Verificator#parseBlock(byte[],
+ * at.knowcenter.wag.exactparser.parsing.results.FooterParseResult, int)
+ */
+ public List parseBlock(byte[] pdf, FooterParseResult block,
+ int start_of_whole_block) throws PresentableException
+ {
+ int egiz_index = PDFUtils.indexOfName(pdf, block.tpr.dpr.names, VerificationFilter.EGIZ_DICT_NAME);
+ if (egiz_index < 0)
+ {
+ throw new PDFDocumentException(301, "egiz_index = " + egiz_index);
+ }
+
+ IndirectObjectReferenceParseResult egiz_dict_iorpr = (IndirectObjectReferenceParseResult) block.tpr.dpr.values.get(egiz_index);
+
+ IndirectObjectReference ior = egiz_dict_iorpr.ior;
+
+ final int egiz_dict_offset = PDFUtils.getObjectOffsetFromXRefByIndirectObjectReference(block.xpr, ior);
+
+ ObjectParseResult obj = PDFUtils.parseObject(pdf, egiz_dict_offset);
+ DictionaryParseResult egiz_dict = (DictionaryParseResult) obj.object;
+
+ NumberParseResult ods_npr = (NumberParseResult) getRequiredValueOfKey(pdf, egiz_dict, EGIZ_ODS_NAME);
+
+ ArrayParseResult kz_apr = (ArrayParseResult) getRequiredValueOfKey(pdf, egiz_dict, EGIZ_KZ_NAME);
+ PdfASID kz = null;
+ String kz_string = VerificationFilter.restoreKZ(pdf, kz_apr);
+ kz = new PdfASID(kz_string);
+ if (!kz_string.equals(MY_ID.toString()))
+ {
+ logger_.warn("Warning: Kennzeichnung not recognized:" + kz_string);
+ }
+
+ ArrayParseResult byte_ranges_apr = (ArrayParseResult) getRequiredValueOfKey(pdf, egiz_dict, EGIZ_BYTE_RANGE_NAME);
+
+ ArrayParseResult replaces_apr = (ArrayParseResult) getRequiredValueOfKey(pdf, egiz_dict, EGIZ_REPLACES_NAME);
+
+ ArrayParseResult encodings_apr = (ArrayParseResult) getRequiredValueOfKey(pdf, egiz_dict, EGIZ_ENCODINGS_NAME);
+
+ ArrayParseResult cert_apr = (ArrayParseResult) getValueOfKey(pdf, egiz_dict, EGIZ_CERT_NAME);
+ byte[] cert = null;
+ if (cert_apr != null && !cert_apr.elements.isEmpty())
+ {
+ LiteralStringParseResult lspr = (LiteralStringParseResult) cert_apr.elements.get(0);
+ int str_length = lspr.content_end_index - lspr.content_start_index;
+ byte[] encoded = new byte[str_length];
+ System.arraycopy(pdf, lspr.content_start_index, encoded, 0, encoded.length);
+
+ cert = Placeholder.unescapePDFString(encoded);
+ }
+
+ int num_byte_ranges = byte_ranges_apr.elements.size() / 2;
+ List byte_ranges = new ArrayList();
+ for (int i = 0; i < num_byte_ranges; i++)
+ {
+ NumberParseResult start_npr = (NumberParseResult) byte_ranges_apr.elements.get(2 * i);
+ NumberParseResult length_npr = (NumberParseResult) byte_ranges_apr.elements.get(2 * i + 1);
+
+ StringInfo si = new StringInfo();
+ si.string_start = start_npr.number;
+ si.string_length = length_npr.number;
+ byte_ranges.add(si);
+ }
+
+ StringInfo sis[] = new StringInfo[num_byte_ranges - 1];
+ for (int i = 0; i < num_byte_ranges - 1; i++)
+ {
+ StringInfo prev = (StringInfo) byte_ranges.get(i);
+ StringInfo next = (StringInfo) byte_ranges.get(i + 1);
+
+ StringInfo hole = new StringInfo();
+ hole.string_start = prev.string_start + prev.string_length;
+ hole.string_length = next.string_start - hole.string_start;
+
+ sis[i] = hole;
+ }
+
+ int n = replaces_apr.elements.size();
+ byte[][] brevs = new byte[n][];
+ for (int i = 0; i < n; i++)
+ {
+ NameParseResult lspr = (NameParseResult) replaces_apr.elements.get(i);
+
+ byte[] brev = new byte[3];
+ System.arraycopy(pdf, lspr.name_start_index, brev, 0, brev.length);
+
+ brevs[i] = brev; // SignatureTypes.convertBrevToType(brev);
+ }
+
+ n = encodings_apr.elements.size();
+ byte[][] encodings = new byte[n][];
+ for (int i = 0; i < n; i++)
+ {
+ NameParseResult lspr = (NameParseResult) encodings_apr.elements.get(i);
+
+ byte[] enc = new byte[3];
+ System.arraycopy(pdf, lspr.name_start_index, enc, 0, enc.length);
+ encodings[i] = enc;
+ }
+
+ BinaryBlockInfo bbi = new BinaryBlockInfo();
+ bbi.replaces = BinarySignature.reconstructReplaces(pdf, brevs, sis, encodings);
+ bbi.signed_size = ods_npr.number;
+
+ // BinaryBlockInfo bbi = BinarySignature.retrieveEgizDictInformation(pdf,
+ // ior.object_number, ior.generation_number, egiz_dict_offset);
+
+ // byte[] original_pdf = BinarySignature.restoreEgizDictInformation(pdf,
+ // bbi);
+
+ byte[] signed_pdf = BinarySignature.prepareDataToSign(pdf, byte_ranges);
+ //String signed_text = BinarySignature.retrieveSignableTextFromData(signed_pdf, signed_pdf.length); // has been moved into the BinarySignatureHolder
+
+ SignatureObject signature_object = new SignatureObject();
+ String default_type = SettingsReader.getInstance().getValueFromKey(SignatureTypes.DEFAULT_TYPE);
+ signature_object.setSigType(default_type);
+ signature_object.initByType();
+
+ signature_object.setKZ(kz);
+
+ if (cert != null)
+ {
+ try
+ {
+ // ByteArrayInputStream bais = new ByteArrayInputStream(cert);
+ // CertificateFactory cf = CertificateFactory.getInstance("X.509");
+ // X509Certificate certificate = (X509Certificate)
+ // cf.generateCertificate(bais);
+
+ // trim zero bytes. - the base 64 cert must not have zero bytes.
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ for (int i = 0; i < cert.length; i++)
+ {
+ if (cert[i] != 0)
+ {
+ baos.write(cert[i]);
+ }
+ }
+ byte[] b64 = baos.toByteArray();
+
+ signature_object.storeNewCertificateInLocalStore(b64);
+ }
+ catch (Exception e)
+ {
+ e.printStackTrace();
+ }
+
+ }
+
+ Iterator rit = bbi.replaces.iterator();
+ while (rit.hasNext())
+ {
+ ReplaceInfo ri = (ReplaceInfo) rit.next();
+
+ String type = SignatureTypes.convertBrevToType(ri.brev);
+
+ // signature_object.setSigValue(ri.type, ri.value);
+ if (type.equals(SignatureTypes.SIG_DATE))
+ {
+ signature_object.setSignationDate(ri.value);
+ continue;
+ }
+
+ if (type.equals(SignatureTypes.SIG_ISSUER))
+ {
+ signature_object.setSignationIssuer(ri.value);
+ continue;
+ }
+
+ if (type.equals(SignatureTypes.SIG_VALUE))
+ {
+ signature_object.setSignationValue(ri.value);
+ continue;
+ }
+
+ if (type.equals(SignatureTypes.SIG_NUMBER))
+ {
+ signature_object.setSignationSerialNumber(ri.value);
+ continue;
+ }
+
+ if (type.equals(SignatureTypes.SIG_ID))
+ {
+ signature_object.setSignationIDs(ri.value);
+ continue;
+ }
+ }
+
+ BinarySignatureHolder signature_holder = new BinarySignatureHolder(signed_pdf, signed_pdf.length, signature_object);
+
+ List holders = new ArrayList();
+ holders.add(signature_holder);
+ return holders;
+ }
+
+ /**
+ * Retrieves the value of the key from the dictionary.
+ *
+ * @param pdf
+ * The PDF.
+ * @param egiz_dict
+ * The dictionary.
+ * @param name
+ * The name of the key.
+ * @return Returns the value of the key. An exception is thrown if the key
+ * doesn't exist.
+ * @throws PDFDocumentException
+ * Thrown, if the key doesn't exist in the dictionary.
+ */
+ protected ParseResult getRequiredValueOfKey(byte[] pdf,
+ DictionaryParseResult egiz_dict, byte[] name) throws PDFDocumentException
+ {
+ final int index = PDFUtils.indexOfName(pdf, egiz_dict.names, name);
+ checkIndex(index);
+ ParseResult value = (ParseResult) egiz_dict.values.get(index);
+ return value;
+ }
+
+ /**
+ * Throws an excaption, if the index is lower than 0.
+ *
+ * @param name_index
+ * The index.
+ * @throws PDFDocumentException
+ * Thrown, if the index is lower than 0.
+ */
+ protected void checkIndex(int name_index) throws PDFDocumentException
+ {
+ if (name_index < 0)
+ {
+ throw new PDFDocumentException(301, "The name wasn't found in the egiz dict.");
+ }
+ }
+
+ /**
+ * Retrieves the value of the key from the dictionary.
+ *
+ * @param pdf
+ * The PDF.
+ * @param egiz_dict
+ * The dictionary.
+ * @param name
+ * The name of the key.
+ * @return Returns the key's value, or null if the dictionary didn't contain
+ * that key.
+ */
+ protected ParseResult getValueOfKey(byte[] pdf,
+ DictionaryParseResult egiz_dict, byte[] name)
+ {
+ final int index = PDFUtils.indexOfName(pdf, egiz_dict.names, name);
+ if (index < 0)
+ {
+ return null;
+ }
+ ParseResult value = (ParseResult) egiz_dict.values.get(index);
+ return value;
+ }
+
+}
diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/framework/verificators/TextualVerificator_1_0_0.java b/src/main/java/at/knowcenter/wag/egov/egiz/framework/verificators/TextualVerificator_1_0_0.java
new file mode 100644
index 0000000..bbcebef
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/egov/egiz/framework/verificators/TextualVerificator_1_0_0.java
@@ -0,0 +1,136 @@
+/**
+ * <copyright> Copyright (c) 2006 by Know-Center, Graz, Austria </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+ * NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
+ * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES.
+ *
+ * $Id: TextualVerificator_1_0_0.java,v 1.4 2006/10/31 08:08:00 wprinz Exp $
+ */
+package at.knowcenter.wag.egov.egiz.framework.verificators;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.log4j.Logger;
+
+import at.knowcenter.wag.egov.egiz.PdfAS;
+import at.knowcenter.wag.egov.egiz.PdfASID;
+import at.knowcenter.wag.egov.egiz.cfg.ConfigLogger;
+import at.knowcenter.wag.egov.egiz.exceptions.PresentableException;
+import at.knowcenter.wag.egov.egiz.framework.SignatorFactory;
+import at.knowcenter.wag.egov.egiz.framework.Verificator;
+import at.knowcenter.wag.egov.egiz.pdf.AbsoluteTextSignature;
+import at.knowcenter.wag.egov.egiz.pdf.SignatureHolder;
+import at.knowcenter.wag.exactparser.parsing.results.FooterParseResult;
+
+
+/**
+ * The textual verificator.
+ *
+ * <p>
+ * All holders of the document so far including the block itself are extracted.
+ * If at least one has been found it is checked that this one doesn't belong to
+ * a previous block.
+ * </p>
+ * <p>
+ * Note that the KZ is not explicitely checked here, so this algorithm will find
+ * all blocks.
+ * </p>
+ * <p>
+ * Note that it will not find old style blocks as they don't have the SIG_KZ.
+ * </p>
+ *
+ * @author wprinz
+ */
+public class TextualVerificator_1_0_0 implements Verificator
+{
+ /**
+ * The Pdf-AS ID of this Verificator.
+ */
+ public static final PdfASID MY_ID = new PdfASID(SignatorFactory.VENDOR, SignatorFactory.TYPE_TEXTUAL, SignatorFactory.VERSION_1_0_0);
+
+ /**
+ * The logger definition.
+ */
+ private static final Logger logger_ = ConfigLogger.getLogger(TextualVerificator_1_0_0.class);
+
+ /**
+ * Default constructor.
+ */
+ public TextualVerificator_1_0_0()
+ {
+ // Default constructor.
+ }
+
+ /**
+ * @see at.knowcenter.wag.egov.egiz.framework.Verificator#parseBlock(byte[],
+ * at.knowcenter.wag.exactparser.parsing.results.FooterParseResult, int)
+ */
+ public List parseBlock(byte[] pdf, FooterParseResult block,
+ int start_of_whole_block) throws PresentableException
+ {
+ String block_text = PdfAS.extractNormalizedTextTextual(pdf, block.next_index);
+
+ logger_.debug("Scanning block:");
+ //List signature_holders = PdfAS.extractSignatureHoldersTextual(block_text, false);
+ List signature_holders = AbsoluteTextSignature.extractSignatureHoldersFromText(block_text);
+ logger_.debug(": end of Scanning block");
+
+ // logger_.debug("signature_holders = " + signature_holders.size());
+
+ if (signature_holders.isEmpty())
+ {
+ return signature_holders;
+ }
+
+ List text_holder_candidates = null;
+ if (start_of_whole_block > 0)
+ {
+ text_holder_candidates = new ArrayList();
+
+ String prev_text = PdfAS.extractNormalizedTextTextual(pdf, start_of_whole_block);
+
+ logger_.debug("Scanning prev block:");
+ //List prev_signature_holders = PdfAS.extractSignatureHoldersTextual(prev_text, false);
+ List prev_signature_holders = AbsoluteTextSignature.extractSignatureHoldersFromText(prev_text);
+ logger_.debug(": end of Scanning prev block");
+
+ // logger_.debug("prev_signature_holders = " +
+ // prev_signature_holders.size());
+
+ for (int i = prev_signature_holders.size(); i < signature_holders.size(); i++)
+ {
+ SignatureHolder holder = (SignatureHolder) signature_holders.get(i);
+ text_holder_candidates.add(holder);
+ }
+ }
+ else
+ {
+ logger_.debug("there is no prev - so all found signatures are possible candidates.");
+ text_holder_candidates = signature_holders;
+ }
+
+ List text_holders = new ArrayList();
+ for (int i = 0; i < text_holder_candidates.size(); i++)
+ {
+ SignatureHolder holder = (SignatureHolder) text_holder_candidates.get(i);
+ if (!holder.getSignatureObject().isTextual())
+ {
+ logger_.debug("Skipping found signature block because it's not textual.");
+ continue;
+ }
+ text_holders.add(holder);
+ }
+
+ return text_holders;
+ }
+}
diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/framework/verificators/TextualVerificator_pdfasold.java b/src/main/java/at/knowcenter/wag/egov/egiz/framework/verificators/TextualVerificator_pdfasold.java
new file mode 100644
index 0000000..5008ed3
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/egov/egiz/framework/verificators/TextualVerificator_pdfasold.java
@@ -0,0 +1,97 @@
+/**
+ * <copyright> Copyright (c) 2006 by Know-Center, Graz, Austria </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+ * NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
+ * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES.
+ *
+ * $Id: TextualVerificator_pdfasold.java,v 1.3 2006/10/11 08:03:22 wprinz Exp $
+ */
+package at.knowcenter.wag.egov.egiz.framework.verificators;
+
+import java.util.List;
+
+import org.apache.log4j.Logger;
+
+import at.knowcenter.wag.egov.egiz.PdfAS;
+import at.knowcenter.wag.egov.egiz.cfg.ConfigLogger;
+import at.knowcenter.wag.egov.egiz.exceptions.PDFDocumentException;
+import at.knowcenter.wag.egov.egiz.exceptions.PresentableException;
+import at.knowcenter.wag.egov.egiz.framework.Verificator;
+import at.knowcenter.wag.exactparser.parsing.results.FooterParseResult;
+
+
+/**
+ * This Verificator extracts a PDF-AS old signature from the original document.
+ *
+ * @author wprinz
+ */
+public class TextualVerificator_pdfasold implements Verificator
+{
+ /**
+ * The logger definition.
+ */
+ private static final Logger logger_ = ConfigLogger.getLogger(TextualVerificator_1_0_0.class);
+
+ /**
+ * Default Constructor.
+ */
+ public TextualVerificator_pdfasold()
+ {
+ // Default Constructor.
+ }
+
+ /**
+ * @see at.knowcenter.wag.egov.egiz.framework.Verificator#parseBlock(byte[], at.knowcenter.wag.exactparser.parsing.results.FooterParseResult, int)
+ */
+ public List parseBlock(byte[] pdf, FooterParseResult block,
+ int start_of_whole_block) throws PresentableException
+ {
+ if (start_of_whole_block != 0)
+ {
+ throw new PDFDocumentException(201, "The PDF-AS-old Verificator can only be applied on original documents.");
+ }
+
+ String normalized_text = PdfAS.extractNormalizedTextTextual(pdf, block.next_index);
+
+ logger_.debug("Scanning block:");
+ List signature_holders = PdfAS.extractSignatureHoldersTextual(normalized_text, true);
+ logger_.debug(": end of Scanning block");
+
+
+// List signature_holders = new ArrayList();
+//
+// SignatureTypes sig_types = SignatureTypes.getInstance();
+// List signatureTypes_ = sig_types.getSignatureTypeDefinitions();
+//
+// boolean can_separate = true;
+// int endIndex = normalized_text.length();
+// String signed_text = normalized_text;
+//
+// SignatureBlock sig_block = new SignatureBlock(signatureTypes_);
+// can_separate = sig_block.separateBlockFromRawText(signed_text, true);
+// if (can_separate)
+// {
+// endIndex = sig_block.getStartIndex();
+// signed_text = signed_text.substring(0, endIndex);
+//
+// SignatureObject sig_object = sig_block.getSignatureObject();
+//
+// SignatureHolder holder = new SignatureHolder();
+// holder.signed_text = signed_text;
+// holder.signature_object = sig_object;
+// signature_holders.add(0, holder);
+// }
+
+ return signature_holders;
+ }
+
+}
diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/pdf/AbsoluteTextSignature.java b/src/main/java/at/knowcenter/wag/egov/egiz/pdf/AbsoluteTextSignature.java
new file mode 100644
index 0000000..5523041
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/egov/egiz/pdf/AbsoluteTextSignature.java
@@ -0,0 +1,656 @@
+/**
+ * <copyright> Copyright (c) 2006 by Know-Center, Graz, Austria </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+ * NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
+ * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES.
+ *
+ * $Id: AbsoluteTextSignature.java,v 1.1 2006/10/31 08:08:33 wprinz Exp $
+ */package at.knowcenter.wag.egov.egiz.pdf;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Vector;
+
+import org.apache.log4j.Logger;
+
+import at.knowcenter.wag.egov.egiz.PdfAS;
+import at.knowcenter.wag.egov.egiz.cfg.ConfigLogger;
+import at.knowcenter.wag.egov.egiz.exceptions.SignatureException;
+import at.knowcenter.wag.egov.egiz.exceptions.SignatureTypesException;
+import at.knowcenter.wag.egov.egiz.framework.FoundBlock;
+import at.knowcenter.wag.egov.egiz.framework.FoundKey;
+import at.knowcenter.wag.egov.egiz.sig.SignatureObject;
+import at.knowcenter.wag.egov.egiz.sig.SignatureTypeDefinition;
+import at.knowcenter.wag.egov.egiz.sig.SignatureTypes;
+
+/**
+ * Contains methods and helpers that implement the absolute text signature.
+ * @author wprinz
+ */
+public class AbsoluteTextSignature
+{
+
+ /**
+ * The logger definition.
+ */
+ private static final Logger logger = ConfigLogger.getLogger(AbsoluteTextSignature.class);
+
+
+ /**
+ * Extracts all signature holders from a given text.
+ *
+ * <p>
+ * First the latest signature holder is extracted. Then the latest signature
+ * holder in the rest text, which is the second latest one, is extracted. Then
+ * the third latest signature holder is extracted and so forth until no more
+ * signature holders are found.
+ * </p>
+ *
+ * @param text
+ * The text.
+ * @return Returns the List of extracted signature holders ordered by their
+ * date ascendingly (the lowest, earliest date first, the latest,
+ * newest date last). An empty list is returned if no signature
+ * holders were found.
+ * @throws SignatureException
+ * F.e.
+ * @throws SignatureTypesException
+ * F.e.
+ */
+ public static List extractSignatureHoldersFromText(String text) throws SignatureException, SignatureTypesException
+ {
+ List holders = new ArrayList();
+
+ String current_text = text;
+ for (;;)
+ {
+ SignatureHolder signature_holder = extractLatestBlock(current_text);
+ if (signature_holder == null)
+ {
+ break;
+ }
+
+ holders.add(0, signature_holder);
+
+ current_text = signature_holder.getSignedText();
+ }
+
+ return holders;
+ }
+
+ /**
+ * Extracts the latest signature block from the given text and creates a
+ * SignatureHolder object that can be verified.
+ *
+ * @param text
+ * The text.
+ * @return Returns the SignatureObject extracted from the text, or null, if no
+ * latest block was found.
+ * @throws SignatureException
+ * F.e.
+ * @throws SignatureTypesException
+ * F.e.
+ */
+ public static SignatureHolder extractLatestBlock(String text) throws SignatureException, SignatureTypesException
+ {
+ FoundBlock latest_block = findLatestBlock(text);
+ if (latest_block == null)
+ {
+ return null;
+ }
+
+ String reconstructed_text = cutOutBlock(text, latest_block);
+
+ SignatureObject so = createSignatureObjectFromFoundBlock(text, latest_block);
+ TextualSignatureHolder tsh = new TextualSignatureHolder(reconstructed_text, so);
+
+ return tsh;
+ }
+
+ /**
+ * Finds the latest signature block for a given text.
+ *
+ * <p>
+ * The latest block is the one with the highest, most recent date. Usually
+ * this block will be extracted (cut out) of the text which will result in the
+ * originally signed text of this signature to be verified using the cut out
+ * data.
+ * </p>
+ *
+ * @param text
+ * The text to be analyzed.
+ * @return Returns the latest found block or null, if there was none.
+ * @throws SignatureException
+ * F.e.
+ * @throws SignatureTypesException
+ * F.e.
+ */
+ public static FoundBlock findLatestBlock(String text) throws SignatureException, SignatureTypesException
+ {
+// try
+// {
+// writeTextToFile(text, new File("C:\\wprinz\\text.utf8.txt"));
+// }
+// catch (IOException e)
+// {
+// e.printStackTrace();
+// }
+
+ SignatureTypes sig_types = SignatureTypes.getInstance();
+ List signatureTypes_ = sig_types.getSignatureTypeDefinitions();
+
+ List found_candidates = new ArrayList();
+
+ for (int i = 0; i < signatureTypes_.size(); i++)
+ {
+ SignatureTypeDefinition block_type = (SignatureTypeDefinition) signatureTypes_.get(i);
+ List found_candidates_for_type = findPotentialSignaturesForProfile(text, block_type);
+
+ found_candidates.addAll(found_candidates_for_type);
+ }
+
+ if (found_candidates.isEmpty())
+ {
+ logger.debug("no candidates found at all");
+ return null;
+ }
+
+ logger.debug("checking block integrity");
+ for (int i = 0; i < found_candidates.size(); i++)
+ {
+ FoundBlock found_block = (FoundBlock) found_candidates.get(i);
+
+ String date_value = getDateValue(text, found_block);
+ logger.debug("date_value = " + date_value);
+ EGIZDate date = EGIZDate.parseFromString(date_value);
+
+ logger.debug("found_block = " + date + " - " + found_block);
+
+ checkBlockIntegrity(text, found_block);
+ }
+
+ sortFoundBlocksByDate(text, found_candidates);
+
+ logger.debug("sorted blocks:");
+ for (int i = 0; i < found_candidates.size(); i++)
+ {
+ FoundBlock found_block = (FoundBlock) found_candidates.get(i);
+
+ String date_value = getDateValue(text, found_block);
+ EGIZDate date = EGIZDate.parseFromString(date_value);
+
+ logger.debug(" #" + i + ": " + date + " - " + found_block);
+ }
+
+ List latest_blocks = filterLastDateEqualBlocks(text, found_candidates);
+ logger.debug("latest blocks:");
+ for (int i = 0; i < latest_blocks.size(); i++)
+ {
+ FoundBlock found_block = (FoundBlock) latest_blocks.get(i);
+
+ String date_value = getDateValue(text, found_block);
+ EGIZDate date = EGIZDate.parseFromString(date_value);
+
+ logger.debug(" #" + i + ": " + date + " - " + found_block);
+ }
+
+ boolean semantic_equality = PdfAS.checkForSemanticEquality(latest_blocks);
+ logger.debug("semantic_equality = " + semantic_equality);
+ if (!semantic_equality)
+ {
+ throw new SignatureException(314, "The latest blocks weren't semantically equal.");
+ }
+
+ FoundBlock latest_block = (FoundBlock) latest_blocks.get(0);
+ logger.debug("latest block = " + latest_block);
+ return latest_block;
+ }
+
+ /**
+ * Finds the List of potential blocks within the given text for the given
+ * profile.
+ *
+ * @param text
+ * The text, in which potential block are to be sought.
+ * @param block_type
+ * The profile for which the text is to be sought.
+ * @return Returns the List of potential FoundBlocks or an empty List if none
+ * could be found.
+ */
+ public static List findPotentialSignaturesForProfile(String text,
+ SignatureTypeDefinition block_type)
+ {
+ logger.debug("find potential signatures for " + block_type.getType());
+
+ List found_blocks = new ArrayList();
+
+ final boolean old_style = false;
+
+ Vector keys = block_type.getRevertSortedKeys();
+ Vector captions = block_type.getRevertSortedCaptions();
+
+ String last_key = (String) keys.get(0);
+ logger.debug("last_key = " + last_key);
+ String last_caption = (String) captions.get(0);
+ logger.debug("last_caption = " + last_caption);
+
+ List found_last_captions = findIndices(text, last_caption);
+ if (logger.isDebugEnabled())
+ {
+ logger.debug("found " + found_last_captions.size() + " last captions.");
+ for (int i = 0; i < found_last_captions.size(); i++)
+ {
+ logger.debug(" found last caption at index " + found_last_captions.get(i));
+ }
+ }
+
+ for (int lci = 0; lci < found_last_captions.size(); lci++)
+ {
+ int last_caption_index = ((Integer) found_last_captions.get(lci)).intValue();
+ logger.debug("resolving signature block from last caption index " + last_caption_index);
+
+ int potential_block_end = findEndOfValue(text, last_caption_index);
+ logger.debug("potential_block_end = " + potential_block_end);
+
+ List found_keys = PdfAS.findBlockInText(text.substring(0, potential_block_end), block_type, old_style); // findRestKeys(text,
+ // keys,
+ // captions,
+ // last_caption_index);
+
+ if (found_keys == null)
+ {
+ logger.debug("Not all other captions could be found for the last_caption_index " + last_caption_index + " ==> discarding this index.");
+
+ continue;
+ }
+
+ // sort found keys ascendingly
+ PdfAS.sortFoundKeysAscendingly(found_keys);
+
+ boolean reverse_check_ok = reverseCheckFoundKeys(text, found_keys);
+ if (!reverse_check_ok)
+ {
+ logger.debug("The reverse check ruled this list of found keys out ==> they are discarded.");
+
+ continue;
+ }
+
+ logger.debug("The reverse check proved this list of found keys out ==> adding them as potential candidates.");
+
+ FoundBlock found_block = new FoundBlock();
+ found_block.std = block_type;
+ found_block.found_keys = found_keys;
+ found_block.end_index = findEndOfValue(text, last_caption_index);
+ found_blocks.add(found_block);
+ }
+
+ logger.debug("found " + found_blocks.size() + " potential signatures for " + block_type.getType());
+ return found_blocks;
+ }
+
+ /**
+ * Finds all indices of the given subtext within a given text.
+ *
+ * <p>
+ * This is usually used to find the indices of the last captions.
+ * </p>
+ *
+ * @param text
+ * The text to be searched.
+ * @param subtext
+ * The subtext to be sought.
+ * @return Returns the List of found indices.
+ */
+ public static List findIndices(String text, String subtext)
+ {
+ List found_indices = new ArrayList();
+ int search_from_index = 0;
+ for (;;)
+ {
+ int found_index = text.indexOf(subtext, search_from_index);
+ if (found_index < 0)
+ {
+ break;
+ }
+ found_indices.add(new Integer(found_index));
+ search_from_index = found_index + subtext.length();
+ }
+ return found_indices;
+ }
+
+ /**
+ * Finds the other keys/captions according to their order starting from the
+ * last_caption index upwards.
+ *
+ * @param text
+ * The text.
+ * @param keys
+ * The list of keys.
+ * @param captions
+ * The list of captions.
+ * @param last_caption_index
+ * The index of the last caption.
+ * @return Returns the List of found keys, if all keys could be found, or null
+ * if not all keys could be found.
+ */
+ public static List findRestKeys(String text, List keys, List captions,
+ int last_caption_index)
+ {
+ List found_keys = new ArrayList();
+
+ FoundKey last_caption_found_key = new FoundKey((String) keys.get(0), (String) captions.get(0), last_caption_index);
+ found_keys.add(last_caption_found_key);
+
+ String rest_text = text.substring(0, last_caption_index);
+
+ for (int i = 1; i < captions.size(); i++)
+ {
+ String sought_caption = (String) captions.get(i);
+ int index = rest_text.lastIndexOf(sought_caption);
+
+ if (index < 0)
+ {
+ return null;
+ }
+
+ FoundKey found_key = new FoundKey((String) keys.get(i), (String) captions.get(i), index);
+ found_keys.add(0, found_key);
+
+ rest_text = rest_text.substring(0, index);
+ }
+
+ return found_keys;
+ }
+
+ /**
+ * Performs a reverse (top to bottom) search for the found keys and checks
+ * that these indices are the same as those that were found during the regular
+ * (bottom up) search.
+ * <p>
+ * If a reverse check proves that the found keys are not at the same positions
+ * as during regular search, this list of found keys should be discarded.
+ * </p>
+ *
+ * @param text
+ * The text.
+ * @param found_keys
+ * The found keys to be reversely checked.
+ * @return Returns true, if all (also the non required) captions could be
+ * found at the same indices as during regular search, false
+ * otherwise.
+ */
+ public static boolean reverseCheckFoundKeys(String text, List found_keys)
+ {
+ int search_from_index = ((FoundKey) found_keys.get(0)).start_index;
+ for (int i = 0; i < found_keys.size(); i++)
+ {
+ FoundKey found_key = (FoundKey) found_keys.get(i);
+
+ int reverse_found_index = text.indexOf(found_key.caption, search_from_index);
+ if (reverse_found_index < 0)
+ {
+ throw new RuntimeException("The caption " + found_key.caption + " wasn't found in the text during reverse checking - there is something wrong.");
+ }
+
+ if (reverse_found_index != found_key.start_index)
+ {
+ logger.debug("The index for caption " + found_key.caption + " wasn't proved during reverse checking.");
+ return false;
+ }
+
+ search_from_index = found_key.start_index + found_key.caption.length();
+ }
+
+ return true;
+ }
+
+ /**
+ * Finds the end of the value in the text.
+ *
+ * <p>
+ * This simply scans for a '\n' from a given start index. The line up to and
+ * inclusive the '\n' is considered to be the value.
+ * </p>
+ * <p>
+ * Note that this method does NOT find the accurate value, if the value goes
+ * over multiple lines! This may bear a serious problem. Usually this method
+ * is only used to finding the end of the last value in a found block, because
+ * mid- values are exactly determined by their start index and the start of
+ * the next caption. Nevertheless, if the last value spans over multiple
+ * lines, this method will not retrieve it completely.
+ * </p>
+ *
+ * @param text
+ * The text.
+ * @param start_index
+ * The start index from where the end of the value is sought.
+ * @return Returns the end index of the value, which is the index of the first
+ * character not belonging to the value anymore (the character after
+ * the '\n').
+ */
+ public static int findEndOfValue(String text, int start_index)
+ {
+ int newline_index = text.indexOf('\n', start_index);
+ if (newline_index < 0)
+ {
+ return text.length();
+ }
+ return newline_index + 1;
+ }
+
+ /**
+ * Checks the integrity of a found block.
+ *
+ * <p>
+ * This is an assertive function.
+ * </p>
+ *
+ * @param text
+ * The text.
+ * @param found_block
+ * The found block.
+ */
+ public static void checkBlockIntegrity(String text, FoundBlock found_block)
+ {
+ for (int i = 0; i < found_block.found_keys.size() - 1; i++)
+ {
+ FoundKey this_key = (FoundKey) found_block.found_keys.get(i);
+ FoundKey next_key = (FoundKey) found_block.found_keys.get(i + 1);
+
+ int this_end_index = findEndOfValue(text, this_key.start_index);
+ if (this_end_index != next_key.start_index)
+ {
+ logger.warn("multi line value: " + this_key);
+ // throw new RuntimeException("The end index of found key " + this_key +
+ // " doesn't match the start index of found key " + next_key);
+ }
+ }
+
+ FoundKey last_key = (FoundKey) found_block.found_keys.get(found_block.found_keys.size() - 1);
+ if (findEndOfValue(text, last_key.start_index) != found_block.end_index)
+ {
+ throw new RuntimeException("The end index of last key " + last_key + " doesn't match the end index of the block " + found_block);
+ }
+
+ }
+
+ /**
+ * Cuts out the given found block from the text.
+ *
+ * @param text
+ * The text.
+ * @param block
+ * The found block.
+ * @return Returns the rest text without the block.
+ */
+ public static String cutOutBlock(String text, FoundBlock block)
+ {
+ int block_start_index = ((FoundKey) block.found_keys.get(0)).getStartIndex();
+ int block_end_index = block.end_index;
+
+ if (block_end_index == text.length())
+ {
+ // if the block is at the end of the text, remove the "\n" before the
+ // block as well.
+ String pre = text.substring(0, block_start_index - 1);
+ return pre;
+ }
+
+ String pre = text.substring(0, block_start_index);
+ String post = text.substring(block_end_index);
+
+ String rest_text = pre + post;
+ return rest_text;
+ }
+
+ /**
+ * Returns the value of the date field as String.
+ *
+ * @param text
+ * The text.
+ * @param block
+ * The found block.
+ * @return Returns the date value.
+ */
+ public static String getDateValue(String text, FoundBlock block)
+ {
+ FoundKey date_key = block.getDateFoundKey();
+ int date_value_start_index = date_key.start_index + date_key.caption.length();
+ int date_value_end_index = findEndOfValue(text, date_value_start_index);
+ String date_value = text.substring(date_value_start_index, date_value_end_index).trim();
+
+ return date_value;
+ }
+
+ /**
+ * Creates a SignatureObject from a found block by extracting the
+ * corresponding values.
+ *
+ * @param text
+ * The text.
+ * @param found_block
+ * The found block.
+ * @return Returns the created SignatureObject.
+ * @throws SignatureTypesException
+ * F.e.
+ * @throws SignatureException
+ * F.e.
+ */
+ public static SignatureObject createSignatureObjectFromFoundBlock(
+ String text, FoundBlock found_block) throws SignatureTypesException, SignatureException
+ {
+ SignatureObject signatureObject = new SignatureObject();
+
+ signatureObject.setSigType(found_block.std.getType());
+ signatureObject.initByType();
+
+ int end_index = found_block.end_index;
+ for (int i = found_block.found_keys.size() - 1; i >= 0; i--)
+ {
+ FoundKey cur_key = (FoundKey) found_block.found_keys.get(i);
+ int start_index = cur_key.getStartIndex() + cur_key.caption.length();
+
+ String value = text.substring(start_index, end_index);
+
+ signatureObject.setSigValueCaption(cur_key.getKey(), value, cur_key.caption);
+
+ end_index = cur_key.getStartIndex();
+ }
+
+ return signatureObject;
+
+ }
+
+ /**
+ * Parses the EGIZDate from a found block and the given text.
+ *
+ * @param text
+ * The text.
+ * @param found_block
+ * The found block.
+ * @return Returns the parsed EGIZDate.
+ */
+ public static EGIZDate getDateFromFoundBlock(String text,
+ FoundBlock found_block)
+ {
+ String date_value = getDateValue(text, found_block);
+ EGIZDate date = EGIZDate.parseFromString(date_value);
+ return date;
+ }
+
+ /**
+ * Sorts the List of found blocks by date.
+ *
+ * @param text
+ * The text.
+ * @param found_blocks
+ * The List of found blocks.
+ */
+ public static void sortFoundBlocksByDate(final String text, List found_blocks)
+ {
+ Collections.sort(found_blocks, new Comparator()
+ {
+ public int compare(Object arg0, Object arg1)
+ {
+ FoundBlock fb0 = (FoundBlock) arg0;
+ FoundBlock fb1 = (FoundBlock) arg1;
+
+ EGIZDate date0 = getDateFromFoundBlock(text, fb0);
+ EGIZDate date1 = getDateFromFoundBlock(text, fb1);
+ return date0.compareTo(date1);
+ }
+ });
+ }
+
+ /**
+ * Given a List of FoundBlock objects, this method returns the last blocks of
+ * this list that have the same date.
+ *
+ * <p>
+ * Usually a date sorted list (earliest first, latest last) will be provided
+ * to this method. Then the last date equal blocks are returned, which are the
+ * last blocks.
+ * </p>
+ *
+ * @param text
+ * The text to retrieve the values of the fields from.
+ * @param found_blocks
+ * The List of FoundBlock objects.
+ * @return Returns the List of the last date equal blocks.
+ */
+ public static List filterLastDateEqualBlocks(String text, List found_blocks)
+ {
+ List latest_blocks = new ArrayList();
+
+ latest_blocks.add(found_blocks.get(found_blocks.size() - 1));
+
+ for (int i = found_blocks.size() - 2; i >= 0; i--)
+ {
+ FoundBlock this_block = (FoundBlock) found_blocks.get(i);
+ FoundBlock succ_block = (FoundBlock) found_blocks.get(i + 1);
+
+ EGIZDate this_date = getDateFromFoundBlock(text, this_block);
+ EGIZDate succ_date = getDateFromFoundBlock(text, succ_block);
+
+ if (!this_date.equals(succ_date))
+ {
+ break;
+ }
+ latest_blocks.add(0, this_block);
+ }
+
+ return latest_blocks;
+ }
+
+}
diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/pdf/BinaryBlockInfo.java b/src/main/java/at/knowcenter/wag/egov/egiz/pdf/BinaryBlockInfo.java
new file mode 100644
index 0000000..cdc092f
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/egov/egiz/pdf/BinaryBlockInfo.java
@@ -0,0 +1,53 @@
+/**
+ * <copyright> Copyright (c) 2006 by Know-Center, Graz, Austria </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+ * NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
+ * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES.
+ *
+ * $Id: BinaryBlockInfo.java,v 1.1 2006/08/25 17:10:08 wprinz Exp $
+ */
+package at.knowcenter.wag.egov.egiz.pdf;
+
+import java.util.List;
+
+/**
+ * Helper class that holds information about a binary signature block.
+ *
+ * @author wprinz
+ */
+public class BinaryBlockInfo
+{
+ /**
+ * The signed size, in bytes.
+ *
+ * <p>
+ * This includes the block itself.
+ * </p>
+ */
+ public int signed_size = -1;
+
+ /**
+ * The List of ReplaceInfo objects that specify the replaced strings.
+ */
+ public List replaces = null;
+
+// /**
+// * The start of the /ODS number in the PDF.
+// */
+// public int ods_start = -1;
+//
+// /**
+// * The start of the \replaces array in the PDF.
+// */
+// public int array_start = -1;
+
+}
diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/pdf/BinarySignature.java b/src/main/java/at/knowcenter/wag/egov/egiz/pdf/BinarySignature.java
new file mode 100644
index 0000000..c5acbc4
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/egov/egiz/pdf/BinarySignature.java
@@ -0,0 +1,1731 @@
+/**
+ * <copyright> Copyright (c) 2006 by Know-Center, Graz, Austria </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+ * NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
+ * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES.
+ *
+ * $Id: BinarySignature.java,v 1.4 2006/10/11 07:57:58 wprinz Exp $
+ */
+package at.knowcenter.wag.egov.egiz.pdf;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.UnsupportedEncodingException;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Iterator;
+import java.util.List;
+
+import at.knowcenter.wag.egov.egiz.exceptions.PDFDocumentException;
+import at.knowcenter.wag.egov.egiz.exceptions.PlaceholderException;
+import at.knowcenter.wag.egov.egiz.exceptions.PresentableException;
+import at.knowcenter.wag.egov.egiz.exceptions.SettingNotFoundException;
+import at.knowcenter.wag.egov.egiz.exceptions.SignatureException;
+import at.knowcenter.wag.egov.egiz.exceptions.SignatureTypesException;
+import at.knowcenter.wag.egov.egiz.sig.SignatureBlock;
+import at.knowcenter.wag.egov.egiz.sig.SignatureFieldDefinition;
+import at.knowcenter.wag.egov.egiz.sig.SignatureObject;
+import at.knowcenter.wag.egov.egiz.sig.SignatureTypes;
+import at.knowcenter.wag.egov.egiz.sig.X509Cert;
+import at.knowcenter.wag.egov.egiz.tools.CodingHelper;
+import at.knowcenter.wag.exactparser.ByteArrayUtils;
+
+import com.lowagie.text.Document;
+import com.lowagie.text.DocumentException;
+import com.lowagie.text.Rectangle;
+import com.lowagie.text.pdf.PRStream;
+import com.lowagie.text.pdf.PdfArray;
+import com.lowagie.text.pdf.PdfContentByte;
+import com.lowagie.text.pdf.PdfDictionary;
+import com.lowagie.text.pdf.PdfIndirectObject;
+import com.lowagie.text.pdf.PdfIndirectReference;
+import com.lowagie.text.pdf.PdfName;
+import com.lowagie.text.pdf.PdfNumber;
+import com.lowagie.text.pdf.PdfObject;
+import com.lowagie.text.pdf.PdfPTable;
+import com.lowagie.text.pdf.PdfReader;
+import com.lowagie.text.pdf.PdfStamper;
+import com.lowagie.text.pdf.PdfStamperImp;
+import com.lowagie.text.pdf.PdfString;
+import com.lowagie.text.pdf.PdfTemplate;
+
+/**
+ * Contains various extension functions to digitally sign documents.
+ *
+ * <p>
+ * These functions are used to replace parts of the original Egiz plain text
+ * signature mechanism.
+ * </p>
+ *
+ * @author wprinz
+ */
+public abstract class BinarySignature
+{
+ /**
+ * The tolerance area of the line break algorithm.
+ *
+ * @see Placeholder#replacePlaceholderWithTolerance(byte[], List, byte[], int)
+ */
+ public static final int LINE_BREAK_TOLERANCE = 10;
+
+ /**
+ * The number of bytes left out for the certificate placeholder.
+ */
+ public static final int CERTIFICATE_PLACEHOLDER_LENGTH = 10000;
+
+ /**
+ * The placeholder character used to fill out Strings in the layout process.
+ */
+ public static final byte LAYOUT_PLACEHOLDER = 'w';
+
+ /**
+ * This placeholder is used to fill out holes between the byte ranges before
+ * the document is signed.
+ */
+ public static final byte SIGN_PLACEHOLDER = 0;
+
+ /**
+ * The nil brev used to define an unrecognized value.
+ */
+ public static final byte[] BREV_NIL = { 'n', 'i', 'l' };
+
+ /**
+ * The date brev.
+ */
+ public static final byte[] BREV_DAT = { 'd', 'a', 't' };
+
+ /**
+ * The issure brev.
+ */
+ public static final byte[] BREV_ISS = { 'i', 's', 's' };
+
+ /**
+ * The serial number brev.
+ */
+ public static final byte[] BREV_SNR = { 's', 'n', 'r' };
+
+ /**
+ * The value brev.
+ */
+ public static final byte[] BREV_VAL = { 'v', 'a', 'l' };
+
+ /**
+ * The SIG_ID brev.
+ */
+ public static final byte[] BREV_SID = { 's', 'i', 'd' };
+
+ /**
+ * No explicit encoding.
+ */
+ public static final byte[] ENCODING_NIL = { 'n', 'i', 'l' };
+
+ /**
+ * PDF WinAnsiEncoding.
+ */
+ public static final byte[] ENCODING_WIN = { 'w', 'i', 'n' };
+
+ /**
+ * URL encoding.
+ */
+ public static final byte[] ENCODING_URL = { 'u', 'r', 'l' };
+
+ /**
+ * The PDFName of the Egiz Dictionary.
+ *
+ * <p>
+ * Used to locate and identify the Egiz Dictionary in the document.
+ * </p>
+ */
+ public static final PdfName EGIZ_DICT_NAME = new PdfName("EGIZSigDict");
+
+ /**
+ * The PDFName of the Original Document Size (ODS) field in an Egiz
+ * Dictionary.
+ *
+ * <p>
+ * The ODS must be a positive integral number.
+ * </p>
+ */
+ public static final PdfName EGIZ_ODS_NAME = new PdfName("ODS");
+
+ /**
+ * The PDFName of the Kennzeichnung attribute.
+ */
+ public static final PdfName EGIZ_KZ_NAME = new PdfName("ID");
+
+ /**
+ * The PDFName of the /replaces field in an Egiz Dictionary.
+ */
+ public static final PdfName EGIZ_REPLACES_NAME = new PdfName("replaces");
+
+ /**
+ * The PDFName of the /encodings field in an Egiz Dictionary.
+ */
+ public static final PdfName EGIZ_ENCODINGS_NAME = new PdfName("encodings");
+
+ /**
+ * The PDFName of the byte ranges array.
+ */
+ public static final PdfName EGIZ_BYTERANGES_NAME = new PdfName("ByteRange");
+
+ /**
+ * The PdfName of the certificate array.
+ */
+ public static final PdfName EGIZ_CERTIFICATE_NAME = new PdfName("Cert");
+
+ /**
+ * The PDFName of the Signature XObject field in an Egiz Dictionary.
+ *
+ * <p>
+ * This must be an indirect reference to the XObject containing the Signature
+ * table.
+ * </p>
+ */
+ public static final PdfName EGIZ_XOBJ_NAME = new PdfName("SigXObject");
+
+ /**
+ * The number placeholder that is used to give numbers a fixed length.
+ */
+ protected static final PdfNumber NUMBER_PLACEHOLDER = new PdfNumber(99999999);
+
+ /**
+ * Extracts the signature text only.
+ *
+ * <p>
+ * The signature text is the text of the Signature XObject.
+ * </p>
+ *
+ * @param egiz_dict
+ * The Egiz Dictionary.
+ *
+ * @return Returns the signature text.
+ */
+ public static String extractSignatureTextOnly(PdfDictionary egiz_dict) throws IOException
+ {
+ PdfIndirectReference xobj_ir = (PdfIndirectReference) egiz_dict.get(EGIZ_XOBJ_NAME);
+ PRStream temp_stream = (PRStream) PdfReader.getPdfObject(xobj_ir);
+
+ byte[] stream_bytes = PdfReader.getStreamBytes(temp_stream);
+
+ return Utils.extractPureTextFromContentStream(stream_bytes);
+ }
+
+ /**
+ * Retrieves the size of the original document from the Egiz Dictionary.
+ *
+ * @param egiz_dict
+ * The Egiz Dictionary.
+ * @return Returns the size (in bytes) of the original document.
+ */
+ public static int getOriginalDocumentSizeFromEgizDict(PdfDictionary egiz_dict)
+ {
+ PdfObject ods_obj = egiz_dict.get(EGIZ_ODS_NAME);
+ PdfNumber ods_number = (PdfNumber) PdfReader.getPdfObject(ods_obj);
+
+ return ods_number.intValue();
+ }
+
+ /**
+ * Retrieves the previous Egiz dictionary from the given one, if a previous
+ * dictionary exists.
+ *
+ * @param egiz_dict
+ * The Egiz Dictionary.
+ * @return Returns the previous Egiz Dictionary, or null if there is none.
+ */
+ public static PdfDictionary getPreviousFromEgizDict(PdfDictionary egiz_dict)
+ {
+ PdfObject prev_obj = egiz_dict.get(PdfName.PREV);
+ PdfDictionary previous_dict = (PdfDictionary) PdfReader.getPdfObject(prev_obj);
+ return previous_dict;
+ }
+
+ /**
+ * Retrieves the Egiz Dictionary from the document if present.
+ *
+ * @param reader
+ * The reader to retrieve the dictionary from.
+ * @return Returns the Egiz Dictionary, if present, or returns null, if no
+ * egiz dictionary was found.
+ */
+ public static PdfDictionary getEgizDictFromReader(PdfReader reader)
+ {
+ PdfIndirectReference dict_ir = getEgizDictIndRefFromReader(reader);
+ if (dict_ir == null)
+ {
+ return null;
+ }
+
+ PdfDictionary egiz_dict = (PdfDictionary) PdfReader.getPdfObject(dict_ir);
+
+ return egiz_dict;
+ }
+
+ /**
+ * Retrieves the Egiz Dictionary's indirect reference from the reader.
+ *
+ * @param reader
+ * The reader.
+ * @return Returns the indirect reference of the Egiz Dictionary, or null, if
+ * none exists.
+ */
+ public static PdfIndirectReference getEgizDictIndRefFromReader(
+ PdfReader reader)
+ {
+ PdfDictionary catalog = reader.getCatalog();
+ PdfIndirectReference dict_ir = (PdfIndirectReference) catalog.get(EGIZ_DICT_NAME);
+ return dict_ir;
+ }
+
+ /**
+ * Retrieves the chain of Egiz Dictionaries from the reader.
+ *
+ * <p>
+ * The first element in the List will be the top most (oldest) Egiz
+ * Dictionary. The last element in the List will be the bottom most (latest)
+ * Egiz Dictionary. If the list is empty, no dictionary could be found at all,
+ * which means that the document is not digitally signed.
+ * </p>
+ *
+ * @param reader
+ * The reader.
+ * @return Returns the List of PdfDictionaries from the document.
+ */
+ public static List getEgizDictChainFromReader(PdfReader reader)
+ {
+ List dicts = new ArrayList();
+
+ PdfDictionary current_dict = getEgizDictFromReader(reader);
+ if (current_dict != null)
+ {
+ dicts.add(0, current_dict);
+
+ while ((current_dict = getPreviousFromEgizDict(current_dict)) != null)
+ {
+ dicts.add(0, current_dict);
+ }
+ }
+
+ return dicts;
+ }
+
+ /**
+ * Builds a digest of the given data.
+ *
+ * @param data
+ * The data to be digested.
+ * @param length
+ * The length of the data portion that should be used for digesting.
+ * This allows to build the digest only over parts of the data.
+ * @return Returns the created digest.
+ * @throws PDFDocumentException
+ * Forwarded exception.
+ */
+ public static byte[] buildDigest(final byte[] data, final int length) throws PDFDocumentException
+ {
+ MessageDigest sha_512 = null;
+ try
+ {
+ sha_512 = MessageDigest.getInstance("SHA-512");
+ }
+ catch (NoSuchAlgorithmException e)
+ {
+ e.printStackTrace();
+ throw new PDFDocumentException(202, "Digest algorithm not supported - NoSuchAlgorithmException", e);
+ }
+
+ sha_512.reset();
+ sha_512.update(data, 0, length);
+ byte[] digest = sha_512.digest();
+
+ return digest;
+ }
+
+ /**
+ * Retrieves the signable text from the given document.
+ *
+ * @param data
+ * The data.
+ * @param ods
+ * The original document size.
+ * @return Returns the signable text.
+ */
+ public static String retrieveSignableTextFromData(final byte[] data,
+ final int ods)
+ {
+ // byte[] digest = buildDigest(data, ods);
+ String raw_text = CodingHelper.encodeBase64(data);// digest); // data);
+ return raw_text;
+ }
+
+ /**
+ * Fills the holes in the byte ranges with the SIGN_PLACEHOLDER.
+ *
+ * @param data
+ * The given byte ranged data.
+ * @param byte_ranges
+ * The byte ranges.
+ * @return Returns the filled text.
+ */
+ public static byte[] prepareDataToSign(final byte[] data,
+ final List byte_ranges)
+ {
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ Iterator it = byte_ranges.iterator();
+ int last_end = 0;
+ while (it.hasNext())
+ {
+ StringInfo si = (StringInfo) it.next();
+
+ for (int i = last_end; i < si.string_start; i++)
+ {
+ baos.write(SIGN_PLACEHOLDER);
+ }
+
+ baos.write(data, si.string_start, si.string_length);
+
+ last_end = si.string_start + si.string_length;
+ }
+ byte[] data_to_sign = baos.toByteArray();
+
+ return data_to_sign;
+ }
+
+ /**
+ * Extracts the binary 'text' of a document.
+ *
+ * <p>
+ * If the document contains an Egiz Dictionary, which means that it is already
+ * signed, the binary text is the Base64 coded string of the original document
+ * followed by the Ascii representation of the signature block.
+ * </p>
+ * <p>
+ * If the document does not contain an Egiz Dictionary, which means that it is
+ * unsigned, only the binary Base64 coded original document is returned as
+ * binary text.
+ * </p>
+ * <p>
+ * This function is intented for being used instead of the "text extraction"
+ * mechanism used in the plain text Egiz project.
+ * </p>
+ *
+ * @param doc
+ * The file.
+ * @return Returns the binary text of the document.
+ * @throws PDFDocumentException
+ * Forwarded exception.
+ */
+ public static String extractTextBinary(File doc) throws PDFDocumentException
+ {
+ try
+ {
+ FileInputStream fis = new FileInputStream(doc);
+ return extractTextBinary(fis);
+ }
+ catch (FileNotFoundException e)
+ {
+ throw new PDFDocumentException(202, e);
+ }
+ }
+
+ /**
+ * Extracts the text binary.
+ *
+ * @param is
+ * @return Returns the binary text.
+ * @throws PDFDocumentException
+ */
+ public static String extractTextBinary(InputStream is) throws PDFDocumentException
+ {
+ try
+ {
+ // for some stupid reason this produces a read error if the is comes from
+ // a
+ // multipart servlet form..???
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ int i = -1;
+ int acc = 0;
+ byte[] b = new byte[1000];
+ while ((i = is.read(b)) > 0)
+ {
+ acc += i;
+ System.out.print(" " + i);
+ baos.write(b, 0, i);
+ }
+ System.out.println("acc = " + acc);
+ byte[] pdf = baos.toByteArray();
+
+ return extractTextBinary(pdf);
+ }
+ catch (IOException e)
+ {
+ throw new PDFDocumentException(202, e);
+ }
+ }
+
+ /**
+ * Extracts the signable text from a binary pdf document.
+ *
+ * <p>
+ * The signable text is the text that will be signed or verified afterwards.
+ * </p>
+ *
+ * @param pdf
+ * The pdf document.
+ * @return Returns the extracted text String.
+ * @throws PDFDocumentException
+ * Forwarded exception.
+ */
+ public static String extractTextBinary(final byte[] pdf) throws PDFDocumentException
+ {
+ try
+ {
+ PdfReader reader = new PdfReader(new ByteArrayInputStream(pdf));
+ PdfDictionary egiz_dict = getEgizDictFromReader(reader);
+ if (egiz_dict == null)
+ {
+ System.out.println("NO Egiz Dict found - whole doc = original doc");
+
+ int ods = pdf.length;
+ return retrieveSignableTextFromData(pdf, ods);
+ }
+
+ String sig_text = extractSignatureTextOnly(egiz_dict);
+
+ int ods = getOriginalDocumentSizeFromEgizDict(egiz_dict);
+
+ String raw_text = retrieveSignableTextFromData(pdf, ods);
+ raw_text += "\n";
+ raw_text += sig_text;
+
+ return raw_text;
+ }
+ catch (IOException e)
+ {
+ throw new PDFDocumentException(202, e);
+ }
+ }
+
+ /**
+ * Retrieves the List of SignatureHolders containing the information of all
+ * digital signatures of the given document.
+ *
+ * <p>
+ * If the List of SignatureHolders is empty, the document is not signed
+ * anyways.
+ * </p>
+ *
+ * @param pdf
+ * The complete pdf document.
+ * @return Returns the List of SignatureHolders.
+ * @throws PDFDocumentException
+ * @throws SignatureTypesException
+ * @throws SignatureException
+ */
+ public static List extractSignatureHoldersBinary(final byte[] pdf) throws PDFDocumentException, SignatureTypesException, SignatureException
+ {
+ try
+ {
+ PdfReader reader = new PdfReader(new ByteArrayInputStream(pdf));
+ List chain = getEgizDictChainFromReader(reader);
+
+ List signatures = new ArrayList();
+ Iterator it = chain.iterator();
+ while (it.hasNext())
+ {
+ PdfDictionary dict = (PdfDictionary) it.next();
+
+ int ods = getOriginalDocumentSizeFromEgizDict(dict);
+ String signature_text = extractSignatureTextOnly(dict);
+
+ SignatureTypes sig_types = SignatureTypes.getInstance();
+ List types = sig_types.getSignatureTypeDefinitions();
+ SignatureBlock sig_block = new SignatureBlock(types);
+ boolean could_separate = sig_block.separateBlockFromRawText(signature_text, false);
+
+ if (could_separate)
+ {
+ SignatureObject sig_object = sig_block.getSignatureObject();
+
+ SignatureHolder holder = new BinarySignatureHolder(pdf, ods, sig_object);
+ signatures.add(holder);
+ }
+ }
+
+ return signatures;
+ }
+ catch (IOException e)
+ {
+ throw new PDFDocumentException(201, e);
+ }
+ }
+
+ // /**
+ // * Signs a document with the given signature table using the Incremental
+ // * Update method.
+ // *
+ // * <p>
+ // * The table containing the signature text will be appended. As specified by
+ // * the parameters, the signature will be appended to the last page, or a
+ // plain
+ // * new page will be created for the signature to hold.
+ // * </p>
+ // * <p>
+ // * The table will be completely wrapped by an XObject, which will also be
+ // * indirectly referenced by the Egiz Dictionary. This will ease the
+ // * verification process.
+ // * </p>
+ // * <p>
+ // * An Egiz Dictionary will be added to the new document that contains
+ // * information about the signature. Basically the size of the original
+ // * document and the reference of the signature table.
+ // * </p>
+ // *
+ // * @param original_document
+ // * The file name of the original document.
+ // * @param new_document
+ // * The file name of the new document to be created.
+ // * @param pdf_table
+ // * The PdfPTable that contains the signature block.
+ // * @param pos_x
+ // * The x position where the table should be inserted.
+ // * @param pos_y
+ // * The y position where the table should be inserted (on the last
+ // * page). If this is negative, a new page will be appended to the
+ // * document. Then the table will be inserted on that new page using
+ // * the absolute value of pos_y. Note that pos_y specifies the top
+ // * line of the table.
+ // * @throws PresentableException
+ // * Forwarded exception.
+ // *
+ // * @see #writeIncrementalUpdate(byte[], PdfPTable, float, float, boolean)
+ // */
+ // public static void writeIncrementalUpdate(String original_document,
+ // String new_document, PdfPTable pdf_table, float pos_x, float pos_y,
+ // int egiz_dict_num_replaces) throws PresentableException
+ // {
+ // try
+ // {
+ // File original_document_file = new File(original_document);
+ // FileInputStream fis = new FileInputStream(original_document_file);
+ // byte[] pdf = new byte[(int) original_document_file.length()];
+ // fis.read(pdf);
+ // fis.close();
+ //
+ // byte[] signed_pdf = writeIncrementalUpdate(pdf, pdf_table, pos_x, pos_y,
+ // egiz_dict_num_replaces);
+ //
+ // File new_document_file = new File(new_document);
+ // FileOutputStream fos = new FileOutputStream(new_document_file);
+ // fos.write(signed_pdf);
+ // fos.close();
+ // }
+ // catch (IOException e)
+ // {
+ // throw new PresentableException(e);
+ // }
+ // }
+
+ /**
+ * Signs a document with the given signature table using the Incremental
+ * Update method.
+ *
+ * <p>
+ * The table containing the signature text will be appended. As specified by
+ * the parameters, the signature will be appended to the last page, or a plain
+ * new page will be created for the signature to hold.
+ * </p>
+ * <p>
+ * The table will be completely wrapped by an XObject, which will also be
+ * indirectly referenced by the Egiz Dictionary. This will ease the
+ * verification process.
+ * </p>
+ * <p>
+ * An Egiz Dictionary will be added to the new document that contains
+ * information about the signature. Basically the size of the original
+ * document and the reference of the signature table.
+ * </p>
+ *
+ * @param original_document
+ * The original document.
+ * @param pdf_table
+ * The PdfPTable that contains the signature block.
+ * @param pos
+ * The Position object giving the exact location where to place the
+ * table. if page is -1, a new page will be appended to the document.
+ * Then the table will be inserted on that new page using the
+ * coordinates.
+ * @return Returns the new document.
+ * @throws PresentableException
+ * Forwarded exception.
+ */
+ public static IncrementalUpdateInformation writeIncrementalUpdate(
+ byte[] original_document, PdfPTable pdf_table, TablePos pos,
+ List variable_field_definitions, List all_field_definitions) throws PresentableException
+ {
+ try
+ {
+ IncrementalUpdateInformation iui = new IncrementalUpdateInformation();
+ iui.original_document = original_document;
+ iui.start_index = original_document.length;
+
+ Document.compress = false;
+
+ // System.out.println("wprinz: STAMPING PDF");
+
+ PdfReader reader = new PdfReader(original_document);
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ // IMPORTANT: append the new content to the original document using
+ // incremental updated
+ // The stamper allows this by setting append = true
+ PdfStamper stamper = new PdfStamper(reader, baos, '\0', true);
+
+ int pdf_page_num = reader.getNumberOfPages();
+
+ // int signature_page = -1;
+ //
+ // if (pos_y >= 0)
+ // {
+ // signature_page = pdf_page_num;
+ // }
+ if (pos.page == -1)
+ {
+ pos.page = pdf_page_num + 1;
+
+ Rectangle psize = reader.getPageSizeWithRotation(pdf_page_num);
+ Rectangle rect = new Rectangle(psize);
+ stamper.insertPage(pos.page, rect);
+
+ // pos_y *= -1;
+ }
+
+ if (pos.page < 1 || pos.page > stamper.getReader().getNumberOfPages())
+ {
+ throw new PDFDocumentException(224, "The provided pos.page (=" + pos.page + ") is out of range.");
+ }
+ PdfContentByte content = stamper.getOverContent(pos.page);
+ // content = StampContent einer PageStamp.
+
+ // System.out.println("table_width = " + pdf_table.getTotalWidth() + ",
+ // table_height = " + pdf_table.getTotalHeight());
+
+ PdfTemplate table_template = content.createTemplate(pdf_table.getTotalWidth(), pdf_table.getTotalHeight());
+
+ pdf_table.writeSelectedRows(0, -1, 0, pdf_table.getTotalHeight(), table_template);
+
+ // table_template.moveTo(0, 0);
+ // table_template.lineTo(pdf_table.getTotalWidth(),
+ // pdf_table.getTotalHeight());
+ // table_template.stroke();
+ // table_template.moveTo(0, 0);
+ // table_template.lineTo(100, 100);
+ // table_template.stroke();
+
+ // pdf_table.writeSelectedRows(0, -1, SIGNATURE_BORDER / 2,
+ // table_position, content);
+
+ content.addTemplate(table_template, pos.pos_x, pos.pos_y - pdf_table.getTotalHeight());
+
+ // For debugging print a 100x100 grid
+// {
+// Rectangle psize = reader.getPageSizeWithRotation(pos.page);
+// float page_width = psize.width();
+// float page_height = psize.height();
+// for (float x = 0; x < page_width; x += 100)
+// {
+// content.moveTo(x, 0);
+// content.lineTo(x, page_height);
+// content.stroke();
+// }
+// for (float y = 0; y < page_height; y += 100)
+// {
+// content.moveTo(0, y);
+// content.lineTo(page_width, y);
+// content.stroke();
+// }
+// }
+
+ // content.setLineWidth(10.0f);
+ // content.moveTo(0, 0);
+ // content.lineTo(100, 100);
+ // content.stroke();
+
+ // PdfIndirectReference page_ref =
+ // stamper.getWriter().getPageReference(signature_page);
+ // System.out.println("page_ref = " + page_ref.toString());
+
+ // PdfObject page_obj = PdfReader.getPdfObject(page_ref);
+ // System.out.println("page_obj = " + page_obj);
+
+ // PdfDictionary page_dict = (PdfDictionary) page_obj;
+ // PdfObject resources_obj = page_dict.get(PdfName.RESOURCES);
+ // System.out.println("resources_obj = " + resources_obj);
+ // PdfDictionary resources = (PdfDictionary)
+ // PdfReader.getPdfObject(resources_obj);
+ // for (Iterator it = resources.getKeys().iterator(); it.hasNext();)
+ // {
+ // PdfName key = (PdfName) it.next();
+ // PdfObject value = resources.get(key);
+ // System.out.println(" " + key + " = " + value);
+ // }
+
+ // add the EGIZ dict:
+ if (variable_field_definitions != null)
+ {
+ createEgizDict(stamper, table_template, iui, variable_field_definitions, all_field_definitions);
+ }
+
+ stamper.close();
+ // System.out.println("wprinz: STAMPING FINISHED");
+
+ iui.signed_pdf = baos.toByteArray();
+
+ return iui;
+ }
+ catch (IOException e)
+ {
+ e.printStackTrace();
+ throw new PresentableException(e);
+ }
+ catch (DocumentException e)
+ {
+ e.printStackTrace();
+ throw new PresentableException(e);
+ }
+ }
+
+ /**
+ * Creates the EGIZ Dictionary and adds it to the document.
+ *
+ * @param stamper
+ * The PdfStamper.
+ * @param table_template
+ * The Template of the Signature block.
+ * @param iui
+ * The IncrementalUpdateInformation.
+ * @param variable_field_definitions
+ * The field definitions.
+ * @throws IOException
+ * @throws SettingNotFoundException
+ */
+ protected static void createEgizDict(PdfStamper stamper,
+ PdfTemplate table_template, IncrementalUpdateInformation iui,
+ List variable_field_definitions, List all_field_definitions) throws IOException, SettingNotFoundException
+ {
+ // iui.temp_ir = table_template.getIndirectReference();
+ iui.temp_ir_number = table_template.getIndirectReference().getNumber();
+ iui.temp_ir_generation = table_template.getIndirectReference().getGeneration();
+
+ byte[] content_stream = table_template.toPdf(null);
+ iui.content_stream_length = content_stream.length;
+
+ iui.replaces = determineReplacesInContentStream(content_stream, 0, content_stream.length, variable_field_definitions);
+ iui.kz_list = determineKZ(content_stream, 0, content_stream.length, all_field_definitions);
+
+ // PdfIndirectReference previous_egiz_dict_ind_ref =
+ // getEgizDictIndRefFromReader(reader);
+
+ PdfDictionary egiz_dict = new PdfDictionary(EGIZ_DICT_NAME);
+ egiz_dict.put(EGIZ_XOBJ_NAME, table_template.getIndirectReference());
+ egiz_dict.put(EGIZ_ODS_NAME, NUMBER_PLACEHOLDER);
+
+ PdfArray kz_array = new PdfArray();
+ for (int i = 0; i < iui.kz_list.size(); i++)
+ {
+ kz_array.add(NUMBER_PLACEHOLDER); // start
+ kz_array.add(NUMBER_PLACEHOLDER); // length
+ }
+ egiz_dict.put(EGIZ_KZ_NAME, kz_array);
+
+ int num_replaces = calcNumReps(iui.replaces);
+ int num_holes = num_replaces + 1 + 1;
+ // +1 = the /encodings hole
+ // +1 = the /Cert
+ int num_byte_ranges = num_holes + 1;
+
+ PdfArray byte_ranges_array = new PdfArray();
+ for (int i = 0; i < num_byte_ranges; i++)
+ {
+ byte_ranges_array.add(NUMBER_PLACEHOLDER); // start
+ byte_ranges_array.add(NUMBER_PLACEHOLDER); // length
+ }
+ egiz_dict.put(EGIZ_BYTERANGES_NAME, byte_ranges_array);
+
+ PdfArray encodings_array = new PdfArray();
+ encodings_array.add(new PdfName(new String(ENCODING_NIL))); // the
+ // /encodings
+ encodings_array.add(new PdfName(new String(ENCODING_NIL))); // the /Cert
+
+ // array itself
+ PdfArray replaces_array = new PdfArray();
+ replaces_array.add(new PdfName(new String(BREV_NIL, "US-ASCII"))); // the
+ // /encodings
+ replaces_array.add(new PdfName(new String(BREV_NIL, "US-ASCII"))); // the
+ // /Cert
+
+ Iterator it = iui.replaces.iterator();
+ while (it.hasNext())
+ {
+ ReplaceInfo ri = (ReplaceInfo) it.next();
+ for (int i = 0; i < ri.replaces.size(); i++)
+ {
+ byte[] brev = typeToBrev(ri.sfd.field_name);
+ String brev_string = new String(brev, "US-ASCII");
+ PdfName brev_name = new PdfName(brev_string);
+ replaces_array.add(brev_name);
+
+ encodings_array.add(new PdfName(new String(ENCODING_WIN, "US-ASCII")));
+ }
+ }
+ egiz_dict.put(EGIZ_REPLACES_NAME, replaces_array);
+
+ egiz_dict.put(EGIZ_ENCODINGS_NAME, encodings_array);
+
+ PdfArray cert_array = new PdfArray();
+ byte[] cert_bytes = new byte[CERTIFICATE_PLACEHOLDER_LENGTH];
+ for (int i = 0; i < cert_bytes.length; i++)
+ {
+ cert_bytes[i] = 0;
+ }
+ PdfString cert_placeholder = new PdfString(cert_bytes);
+ cert_array.add(cert_placeholder);
+ egiz_dict.put(EGIZ_CERTIFICATE_NAME, cert_array);
+
+ // if (previous_egiz_dict_ind_ref != null)
+ // {
+ // egiz_dict.put(PdfName.PREV, previous_egiz_dict_ind_ref);
+ // }
+ // no EGIZ chain
+
+ PdfIndirectObject dict_ref = stamper.getWriter().addToBody(egiz_dict);
+ // iui.egiz_dict_ir = dict_ref.getIndirectReference();
+ iui.egiz_dict_ir_number = dict_ref.getIndirectReference().getNumber();
+ iui.egiz_dict_ir_generation = dict_ref.getIndirectReference().getGeneration();
+
+ PdfIndirectReference root_ref = (PdfIndirectReference) stamper.getReader().getTrailer().get(PdfName.ROOT);
+ PdfDictionary root = (PdfDictionary) PdfReader.getPdfObject(root_ref);
+ // root.put(EGIZ_DICT_NAME, dict_ref.getIndirectReference());
+ ((PdfStamperImp) stamper.getWriter()).markUsed(root);
+
+ // PdfDictionary extra_cata = stamper.getWriter().getExtraCatalog();
+ // extra_cata.put(dict_type, dict_ref.getIndirectReference());
+
+ ((PdfStamperImp) stamper.getWriter()).setEgizDictTrailerInfo(EGIZ_DICT_NAME, dict_ref.getIndirectReference());
+ }
+
+ /**
+ * Converts a field name (type) to the corresponding BREV.
+ *
+ * @param type
+ * The field name (type).
+ * @return Returns the corresponding BREV, or BREV_NIL if the type is not
+ * recognized.
+ */
+ protected static byte[] typeToBrev(String type)
+ {
+ if (type.equals(SignatureTypes.SIG_DATE))
+ {
+ return BREV_DAT;
+ }
+ if (type.equals(SignatureTypes.SIG_ISSUER))
+ {
+ return BREV_ISS;
+ }
+ if (type.equals(SignatureTypes.SIG_VALUE))
+ {
+ return BREV_VAL;
+ }
+ if (type.equals(SignatureTypes.SIG_NUMBER))
+ {
+ return BREV_SNR;
+ }
+ if (type.equals(SignatureTypes.SIG_ID))
+ {
+ return BREV_SID;
+ }
+
+ return BREV_NIL;
+ }
+
+ /**
+ * Updates the information in the egiz dictionary to reflect the real offsets
+ * of the byte ranges.
+ *
+ * <p>
+ * This replaces the "dummy numbers" in the egiz dictionary with the correct
+ * values.
+ * </p>
+ *
+ * @param iui
+ * The IncrementalUpdateInformation.
+ * @throws PDFDocumentException
+ */
+ public static void markByteRanges(IncrementalUpdateInformation iui) throws PDFDocumentException
+ {
+ try
+ {
+ iui.byte_ranges = new ArrayList();
+
+ int num_digits = Integer.toString(NUMBER_PLACEHOLDER.intValue()).length();
+ byte[] signed_pdf = iui.signed_pdf;
+
+ String str = iui.egiz_dict_ir_number + " " + iui.egiz_dict_ir_generation + " obj";
+ byte[] obj_bytes = str.getBytes("US-ASCII");
+ int obj_index = ByteArrayUtils.lastIndexOf(signed_pdf, obj_bytes);
+ int obj_start = obj_index + obj_bytes.length;
+
+ String ods_str = "/ODS ";
+ byte[] ods_bytes = ods_str.getBytes("US-ASCII");
+ int ods_index = ByteArrayUtils.indexOf(signed_pdf, obj_start, ods_bytes);
+ int ods_start = ods_index + ods_bytes.length;
+
+ String kz_str = "/ID[";
+ byte[] kz_bytes = kz_str.getBytes("US-ASCII");
+ int kz_index = ByteArrayUtils.indexOf(signed_pdf, obj_start, kz_bytes);
+ int kz_start = kz_index + kz_bytes.length;
+
+ String br_str = "/ByteRange[";
+ byte[] br_bytes = br_str.getBytes("US-ASCII");
+ int br_index = ByteArrayUtils.indexOf(signed_pdf, obj_start, br_bytes);
+ int array_start = br_index + br_bytes.length;
+
+ String enc_str = "/encodings[";
+ byte[] enc_bytes = enc_str.getBytes("US-ASCII");
+ int enc_index = ByteArrayUtils.indexOf(signed_pdf, obj_start, enc_bytes);
+ int enc_start = enc_index + enc_bytes.length;
+
+ String cert_str = "/Cert[(";
+ byte[] cert_bytes = cert_str.getBytes("US-ASCII");
+ int cert_index = ByteArrayUtils.indexOf(signed_pdf, obj_start, cert_bytes);
+ int cert_start = cert_index + cert_bytes.length;
+
+ replaceNumber(signed_pdf, ods_start, signed_pdf.length, num_digits);
+
+ // update the Kennzeichnung byte ranges
+ int cur_pos = kz_start;
+ for (int i = 0; i < iui.kz_list.size(); i++)
+ {
+ StringInfo si = (StringInfo) iui.kz_list.get(i);
+
+ replaceNumber(signed_pdf, cur_pos, si.string_start, num_digits);
+ cur_pos += num_digits;
+ cur_pos += 1;
+ replaceNumber(signed_pdf, cur_pos, si.string_length, num_digits);
+ cur_pos += num_digits;
+ cur_pos += 1;
+ }
+
+ int num_replaces = calcNumReps(iui.replaces);
+ int num_holes = num_replaces + 1 + 1; // +1 = the /encodings hole
+ // int num_byte_ranges = num_holes + 1;
+
+ cur_pos = array_start;
+ int cur_br_start = 0;
+
+ // write the /encodings byte range
+ {
+ int enc_length = (1 + 3) * num_holes;
+
+ StringInfo byte_range = new StringInfo();
+ byte_range.string_start = cur_br_start;
+ byte_range.string_length = enc_start;
+ iui.byte_ranges.add(byte_range);
+
+ replaceNumber(signed_pdf, cur_pos, byte_range.string_start, num_digits);
+ cur_pos += num_digits;
+ cur_pos += 1;
+ replaceNumber(signed_pdf, cur_pos, byte_range.string_length, num_digits);
+ cur_pos += num_digits;
+ cur_pos += 1;
+
+ cur_br_start = enc_start + enc_length;
+
+ iui.enc_start = enc_start;
+ iui.enc_length = enc_length;
+ }
+
+ // write the /Cert byte range
+ {
+ int cert_length = CERTIFICATE_PLACEHOLDER_LENGTH;
+
+ StringInfo byte_range = new StringInfo();
+ byte_range.string_start = cur_br_start;
+ byte_range.string_length = cert_start - cur_br_start;
+ iui.byte_ranges.add(byte_range);
+
+ replaceNumber(signed_pdf, cur_pos, byte_range.string_start, num_digits);
+ cur_pos += num_digits;
+ cur_pos += 1;
+ replaceNumber(signed_pdf, cur_pos, byte_range.string_length, num_digits);
+ cur_pos += num_digits;
+ cur_pos += 1;
+
+ cur_br_start = cert_start + cert_length;
+
+ iui.cert_start = cert_start;
+ iui.cert_length = cert_length;
+ }
+
+ Iterator rit = iui.replaces.iterator();
+ while (rit.hasNext())
+ {
+ ReplaceInfo ri = (ReplaceInfo) rit.next();
+
+ // byte [] value_bytes = ri.value.getBytes("ISO-8859-1");
+ // int write_pos = 0;
+
+ Iterator sit = ri.replaces.iterator();
+ while (sit.hasNext())
+ {
+ StringInfo si = (StringInfo) sit.next();
+
+ StringInfo byte_range = new StringInfo();
+ byte_range.string_start = cur_br_start;
+ byte_range.string_length = si.string_start - cur_br_start;
+ iui.byte_ranges.add(byte_range);
+
+ replaceNumber(signed_pdf, cur_pos, byte_range.string_start, num_digits);
+ cur_pos += num_digits;
+ cur_pos += 1;
+ replaceNumber(signed_pdf, cur_pos, byte_range.string_length, num_digits);
+ cur_pos += num_digits;
+ cur_pos += 1;
+
+ cur_br_start = si.string_start + si.string_length;
+ }
+
+ }
+
+ StringInfo byte_range = new StringInfo();
+ byte_range.string_start = cur_br_start;
+ byte_range.string_length = signed_pdf.length - cur_br_start;
+ iui.byte_ranges.add(byte_range);
+
+ replaceNumber(signed_pdf, cur_pos, byte_range.string_start, num_digits);
+ cur_pos += num_digits;
+ cur_pos += 1;
+ replaceNumber(signed_pdf, cur_pos, byte_range.string_length, num_digits);
+ cur_pos += num_digits;
+ cur_pos += 1;
+
+ }
+ catch (IOException e)
+ {
+ throw new PDFDocumentException(201, e);
+ }
+
+ }
+
+ /**
+ * Replaces the certificate placeholder with the certificate from the signed
+ * Signature Object.
+ *
+ * @param iui
+ * The IncrementalUpdateInformation.
+ * @throws PDFDocumentException
+ */
+ public static void replaceCertificate(IncrementalUpdateInformation iui) throws PDFDocumentException
+ {
+ X509Cert cert = iui.signed_signature_object.getX509Cert();
+ // X509Certificate certificate = cert.getX509Certificate();
+ try
+ {
+ byte[] encoded = cert.getCertString().getBytes("US-ASCII"); // certificate.getEncoded();
+ byte[] escaped = Placeholder.escapePDFString(encoded);
+ if (escaped.length > iui.cert_length)
+ {
+ throw new PlaceholderException("certificate", escaped.length - iui.cert_length);
+ }
+ System.arraycopy(escaped, 0, iui.signed_pdf, iui.cert_start, escaped.length);
+ }
+ // catch (CertificateEncodingException e)
+ // {
+ // throw new PDFDocumentException(300, e);
+ // }
+ catch (UnsupportedEncodingException e)
+ {
+ throw new PDFDocumentException(300, e);
+ }
+ }
+
+ /**
+ * Replaces the placeholders with values from the signed SignatureObject.
+ *
+ * @param iui
+ * The IncrementalUpdateInformation.
+ * @throws PDFDocumentException
+ */
+ public static void replacePlaceholders(IncrementalUpdateInformation iui) throws PDFDocumentException
+ {
+ final byte[] signed_pdf = iui.signed_pdf;
+
+ // int num_replaces = calcNumReps(iui.replaces);
+ // int num_holes = num_replaces + 1 + 1; // +1 = the /encodings hole; +1 =
+ // the
+ // /Cert
+
+ int encoding_entry_index = 0;
+ {// /encodings itself
+ int enc_offset = iui.enc_start + encoding_entry_index * 4;
+ signed_pdf[enc_offset] = '/';
+ System.arraycopy(ENCODING_NIL, 0, signed_pdf, enc_offset + 1, ENCODING_NIL.length);
+ encoding_entry_index++;
+ }
+ {// /Cert itself
+ int enc_offset = iui.enc_start + encoding_entry_index * 4;
+ signed_pdf[enc_offset] = '/';
+ System.arraycopy(ENCODING_NIL, 0, signed_pdf, enc_offset + 1, ENCODING_NIL.length);
+ encoding_entry_index++;
+ }
+
+ for (int i = 0; i < iui.replaces.size(); i++)
+ {
+ ReplaceInfo ri = (ReplaceInfo) iui.replaces.get(i);
+
+ try
+ {
+ String value = ri.value;
+
+ if (value == null)
+ {
+ value = "";
+ }
+
+ byte[] encoding = ENCODING_WIN;
+ byte[] replace_bytes = Placeholder.applyWinAnsiEncoding(value);
+
+ String restored_value = Placeholder.unapplyWinAnsiEncoding(replace_bytes);
+ if (!value.equals(restored_value))
+ {
+ // debug:
+ System.out.println("WinAnsiEncoding doesn't fit - using URL instead!");
+ // /debug!
+
+ replace_bytes = Placeholder.applyURLEncoding(value);
+
+ encoding = ENCODING_URL;
+ }
+
+ for (int string_index = 0; string_index < ri.replaces.size(); string_index++)
+ {
+ int enc_offset = iui.enc_start + encoding_entry_index * 4;
+ signed_pdf[enc_offset] = '/';
+ System.arraycopy(encoding, 0, signed_pdf, enc_offset + 1, encoding.length);
+ encoding_entry_index++;
+ }
+
+ Placeholder.replacePlaceholderWithTolerance(signed_pdf, ri.replaces, replace_bytes, LINE_BREAK_TOLERANCE);
+ }
+ catch (PlaceholderException e)
+ {
+ throw new PlaceholderException(ri.sfd.field_name, e.getMissing());
+ }
+
+ }
+ }
+
+ /**
+ * Calculates the number of actual String replaces from a given ReplaceInfo
+ * list.
+ * <p>
+ * This is used to determine the number of actual replaces that has to be
+ * carried out. Accordingly to this number, entries in the dictionary are
+ * created.
+ * </p>
+ *
+ * @param replaces
+ * The ReplaceInfo list.
+ * @return Returns the number of string replaces.
+ */
+ protected static int calcNumReps(List replaces)
+ {
+ int number = 0;
+ Iterator it = replaces.iterator();
+ while (it.hasNext())
+ {
+ ReplaceInfo ri = (ReplaceInfo) it.next();
+ number += ri.replaces.size();
+ }
+ return number;
+ }
+
+ /**
+ * Determines the List of ReplaceInfo objects of replaces in the content
+ * stream regarding the given field definitions.
+ *
+ * <p>
+ * This method collects all variable String fields in a content stream and
+ * orders them according to their start offset.
+ * </p>
+ *
+ * @param pdf
+ * The PDF.
+ * @param begin
+ * The start of the content stream.
+ * @param end
+ * The end of the content stream.
+ * @param field_definitions
+ * The field definitions that are counceled to find out which and
+ * where varaible strings are.
+ * @return Returns the list of ReplaceInfo objects specifying the variable
+ * areas.
+ */
+ protected static List determineReplacesInContentStream(final byte[] pdf,
+ int begin, int end, List field_definitions)
+ {
+ List replaces = new ArrayList();
+ try
+ {
+
+ List strings = Placeholder.parseStrings(pdf, begin, end);
+
+ for (int index = 0; index < field_definitions.size(); index++)
+ {
+ SignatureFieldDefinition sfd = (SignatureFieldDefinition) field_definitions.get(index);
+
+ if (sfd.placeholder_length > 0)
+ {
+ ReplaceInfo ri = new ReplaceInfo();
+ ri.sfd = sfd;
+ ri.replaces = new ArrayList();
+
+ byte[] caption = sfd.caption.getBytes("ISO-8859-1");
+
+ int caption_index = findIndex(strings, caption);
+ int start_index = skipStrings(strings, caption_index, caption);
+ int next_index = findFirstNotPlaceholder(strings, start_index);
+
+ for (int i = start_index; i < next_index; i++)
+ {
+ StringInfo si = (StringInfo) strings.get(i);
+ ri.replaces.add(si);
+ }
+
+ replaces.add(ri);
+ }
+ }
+ }
+ catch (UnsupportedEncodingException e)
+ {
+ e.printStackTrace();
+ }
+
+ // sort replaces
+ Collections.sort(replaces, new Comparator()
+ {
+ public int compare(Object arg0, Object arg1)
+ {
+ ReplaceInfo ri0 = (ReplaceInfo) arg0;
+ ReplaceInfo ri1 = (ReplaceInfo) arg1;
+ int start0 = ((StringInfo) ri0.replaces.get(0)).string_start;
+ int start1 = ((StringInfo) ri1.replaces.get(0)).string_start;
+ return start0 - start1;
+ }
+ });
+
+ return replaces;
+ }
+
+ /**
+ * Determines the Kennzeichnug in the content stream.
+ *
+ * @param pdf
+ * The PDF.
+ * @param begin
+ * The start of the content stream.
+ * @param end
+ * The end of the content stream.
+ * @param field_definitions
+ * The field definitions.
+ * @return Returns the List of StringInfo objects representing the KZ field.
+ * @throws SettingNotFoundException
+ * F.e.
+ */
+ protected static List determineKZ(final byte[] pdf, int begin, int end,
+ List field_definitions) throws SettingNotFoundException
+ {
+ try
+ {
+ List strings = Placeholder.parseStrings(pdf, begin, end);
+
+ for (int index = 0; index < field_definitions.size(); index++)
+ {
+ SignatureFieldDefinition sfd = (SignatureFieldDefinition) field_definitions.get(index);
+
+ if (sfd.field_name.equals(SignatureTypes.SIG_KZ))
+ {
+ List kz_list = new ArrayList();
+
+ byte[] caption = sfd.caption.getBytes("ISO-8859-1");
+
+ int caption_index = findIndex(strings, caption);
+ int start_index = skipStrings(strings, caption_index, caption);
+
+ int end_index = -1;
+ for (end_index = start_index; end_index < strings.size(); end_index++)
+ {
+ StringInfo si = (StringInfo) strings.get(end_index);
+
+ if (startsWithCaption(si, field_definitions))
+ {
+ break;
+ }
+
+ kz_list.add(si);
+ }
+
+ return kz_list;
+ }
+ }
+ }
+ catch (UnsupportedEncodingException e)
+ {
+ e.printStackTrace();
+ }
+ throw new SettingNotFoundException(102, "Field " + SignatureTypes.SIG_KZ + " not found.");
+ }
+
+ /**
+ * Finds the index of the StringInfo within the StringInfo list that has the
+ * given content (caption).
+ *
+ * @param strings
+ * The list of StringInfos.
+ * @param caption
+ * The text to be matched to the strings.
+ * @return Returns the index of the found string, or -1 if no string matched.
+ */
+ protected static int findIndex(List strings, byte[] caption)
+ {
+ for (int i = 0; i < strings.size(); i++)
+ {
+ if (isCaption(strings, i, caption))
+ {
+ return i;
+ }
+ }
+ return -1;
+ }
+
+ protected static boolean isCaption(List strings, int index, byte[] caption)
+ {
+ try
+ {
+
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ for (int i = index; i < strings.size(); i++)
+ {
+ StringInfo si = (StringInfo) strings.get(i);
+ baos.write(si.copyStringBytes());
+ }
+ byte[] str_data = baos.toByteArray();
+ byte[] unescaped = Placeholder.unescapePDFString(str_data);
+ if (ByteArrayUtils.compareByteArrays(unescaped, 0, caption))
+ {
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+ }
+ catch (IOException e)
+ {
+ e.printStackTrace();
+ return false;
+ }
+
+ }
+
+ protected static int skipStrings(List strings, int index, byte[] caption)
+ {
+ int length = 0;
+ for (int i = index; i < strings.size(); i++)
+ {
+ StringInfo si = (StringInfo) strings.get(i);
+ length += si.string_length;
+
+ if (length >= caption.length)
+ {
+ return i + 1;
+ }
+ }
+ return -1;
+ }
+
+ /**
+ * Tells, if the given StringInfo contains only placeholder characters.
+ *
+ * @param si
+ * The StringInfo.
+ * @param placeholder
+ * The placeholder character.
+ * @return Returns true, if the string contains only the given placeholder
+ * characters, false otherwise.
+ */
+ protected static boolean isPlaceholder(StringInfo si, byte placeholder)
+ {
+ byte[] string_bytes = si.copyStringBytes();
+ for (int i = 0; i < string_bytes.length; i++)
+ {
+ if (string_bytes[i] != placeholder)
+ {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ protected static boolean startsWithCaption(StringInfo si,
+ List field_definitions)
+ {
+ try
+ {
+ for (int i = 0; i < field_definitions.size(); i++)
+ {
+ SignatureFieldDefinition sfd = (SignatureFieldDefinition) field_definitions.get(i);
+
+ String caption = sfd.caption;
+ String str = si.getString("ISO-8859-1");
+
+ if (caption.startsWith(str))
+ {
+ return true;
+ }
+ }
+ return false;
+ }
+ catch (UnsupportedEncodingException e)
+ {
+ e.printStackTrace();
+ return false;
+ }
+ }
+
+ /**
+ * Finds the first string after and at the given index not being a placeholder
+ * string.
+ *
+ * @param strings
+ * The list of StringInfos.
+ * @param start
+ * The index where to start the search.
+ * @return Returns the index of the first not placeholder string, or
+ * strings.size() if no more non placeholder strings could be found.
+ */
+ protected static int findFirstNotPlaceholder(List strings, int start)
+ {
+ for (int i = start; i < strings.size(); i++)
+ {
+ StringInfo si = (StringInfo) strings.get(i);
+ if (!isPlaceholder(si, LAYOUT_PLACEHOLDER))
+ {
+ return i;
+ }
+ }
+ return strings.size();
+ }
+
+ /**
+ * Restores the given String to its placeholder.
+ *
+ * @param pdf
+ * The PDF.
+ * @param si
+ * The string.
+ * @param placeholder
+ * The placeholder the string should be filled with.
+ */
+ public static void restorePlaceholder(final byte[] pdf, StringInfo si,
+ final byte placeholder)
+ {
+ byte[] ph = new byte[si.string_length];
+ for (int i = 0; i < ph.length; i++)
+ {
+ ph[i] = placeholder;
+ }
+ System.arraycopy(ph, 0, pdf, si.string_start, ph.length);
+ }
+
+ /**
+ * Reconstructs the replaces from the PDF and forms suitable value strings.
+ *
+ * @param pdf
+ * The PDF.
+ * @param brevs
+ * The brevs.
+ * @param sis
+ * The StringInfo objects of the strings.
+ * @return Returns the List of ReplaceInfo objects containing the restored
+ * values.
+ * @throws PDFDocumentException
+ */
+ public static List reconstructReplaces(final byte[] pdf, byte[][] brevs,
+ StringInfo[] sis, byte[][] encodings) throws PDFDocumentException
+ {
+ try
+ {
+ List replaces = new ArrayList();
+
+ ReplaceInfo cur_ri = null;
+
+ for (int cur = 0; cur < brevs.length; cur++)
+ {
+ if (ByteArrayUtils.compareByteArrays(brevs[cur], 0, BREV_NIL))
+ {
+ continue;
+ }
+
+ if (cur_ri == null || !ByteArrayUtils.compareByteArrays(cur_ri.brev, 0, brevs[cur]))
+ {
+ cur_ri = new ReplaceInfo();
+
+ cur_ri.replaces = new ArrayList();
+
+ cur_ri.brev = brevs[cur];
+ cur_ri.enc = encodings[cur];
+
+ replaces.add(cur_ri);
+ }
+
+ cur_ri.replaces.add(sis[cur]);
+ }
+
+ // restore value Strings
+ Iterator rit = replaces.iterator();
+ while (rit.hasNext())
+ {
+ ReplaceInfo ri = (ReplaceInfo) rit.next();
+ ri.value = Placeholder.reconstructStringFromPartition(pdf, ri.replaces, ri.enc);
+
+ // System.out.println(new String(ri.brev, "US-ASCII") + ": " +
+ // ri.value);
+ }
+
+ return replaces;
+ }
+ catch (IOException e)
+ {
+ throw new PDFDocumentException(310, e);
+ }
+
+ }
+
+ /**
+ * Reads an unsigned integer number.
+ *
+ * @param pdf
+ * The PDF.
+ * @param start_index
+ * The start index of the number.
+ * @param num_digits
+ * The number of digits.
+ * @return Returns the read number.
+ */
+ public static int readNumber(final byte[] pdf, final int start_index,
+ final int num_digits)
+ {
+ try
+ {
+ byte[] n_bytes = new byte[num_digits];
+ System.arraycopy(pdf, start_index, n_bytes, 0, num_digits);
+ String n_string = new String(n_bytes, "US-ASCII");
+
+ int n = Integer.parseInt(n_string);
+ return n;
+ }
+ catch (UnsupportedEncodingException e)
+ {
+ e.printStackTrace();
+ return -1;
+ }
+ }
+
+ /**
+ * Replaces a number by the new value.
+ *
+ * @param pdf
+ * The PDF.
+ * @param start_index
+ * The start index of the number.
+ * @param number
+ * The new number.
+ * @param num_digits
+ * The number of digits.
+ */
+ public static void replaceNumber(final byte[] pdf, final int start_index,
+ final int number, final int num_digits)
+ {
+ try
+ {
+ if (number < 0)
+ {
+ throw new IllegalArgumentException("The given number " + number + " must not be negative.");
+ }
+ String number_string = Integer.toString(number);
+ if (number_string.length() > num_digits)
+ {
+ throw new IllegalArgumentException("The given number " + number + " has more than " + num_digits + " digits.");
+ }
+
+ int leading_zeros = num_digits - number_string.length();
+ String zeros_string = "";
+ for (int i = 0; i < leading_zeros; i++)
+ {
+ zeros_string += "0";
+ }
+
+ String total_string = zeros_string + number_string;
+ byte[] total_bytes = total_string.getBytes("US-ASCII");
+ System.arraycopy(total_bytes, 0, pdf, start_index, num_digits);
+ }
+ catch (UnsupportedEncodingException e)
+ {
+ e.printStackTrace();
+ }
+ }
+
+ /**
+ * For debugging purposes.
+ *
+ * @param args
+ * @throws IOException
+ */
+ public static void main(String[] args) throws IOException
+ {
+ File signed_doc = new File("C:/wprinz/temp.pdf");
+
+ PdfReader reader = new PdfReader(new FileInputStream(signed_doc));
+ PdfDictionary egiz_dict = getEgizDictFromReader(reader);
+ if (egiz_dict == null)
+ {
+ System.out.println("NO Egiz Dict");
+ return;
+ }
+
+ String sig_text = extractSignatureTextOnly(egiz_dict);
+ System.out.println("Sig Text:");
+ System.out.println(sig_text);
+
+ int ods = getOriginalDocumentSizeFromEgizDict(egiz_dict);
+ System.out.println("Original Document Size = " + ods);
+ }
+
+}
diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/pdf/BinarySignatureHolder.java b/src/main/java/at/knowcenter/wag/egov/egiz/pdf/BinarySignatureHolder.java
new file mode 100644
index 0000000..1f522ff
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/egov/egiz/pdf/BinarySignatureHolder.java
@@ -0,0 +1,146 @@
+/**
+ * <copyright> Copyright (c) 2006 by Know-Center, Graz, Austria </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+ * NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
+ * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES.
+ *
+ * $Id: BinarySignatureHolder.java,v 1.1 2006/10/11 07:58:28 wprinz Exp $
+ */
+package at.knowcenter.wag.egov.egiz.pdf;
+
+import java.io.Serializable;
+
+import at.knowcenter.wag.egov.egiz.sig.SignatureObject;
+
+/**
+ * Data structure that holds the information of one binary signature block,
+ * which is the signed/signable pdf and the corresponding SignatureObject.
+ *
+ * <p>
+ * The actual signed text is computed by Base64 encoding the binary data when
+ * first requested.
+ * </p>
+ * <p>
+ * The corresponding getters can be used to retrieve the signed document (e.g.
+ * for displaying a preview).
+ * </p>
+ *
+ * @author wprinz
+ */
+public class BinarySignatureHolder implements Serializable, SignatureHolder
+{
+
+ /**
+ * SVUID.
+ */
+ private static final long serialVersionUID = -7208103904479272760L;
+
+ /**
+ * The whole pdf this holder was extracted from.
+ */
+ private byte[] signed_pdf = null;
+
+ /**
+ * The number of bytes that give the signed document.
+ */
+ private int signed_pdf_length = -1;
+
+ /**
+ * The signed text of this object.
+ *
+ * <p>
+ * This is the value that will be signed by the Connector.
+ * </p>
+ */
+ private String signed_text = null;
+
+ /**
+ * The signature object.
+ */
+ private SignatureObject signature_object = null;
+
+ /**
+ * Constructor that takes the pdf and the SignatureObject as parameters.
+ *
+ * @param pdf
+ * The pdf data.
+ * @param length
+ * The length (number of bytes) of the pdf data to be used for being
+ * converted into "signed text".
+ * @param so
+ * The signed signature object.
+ */
+ public BinarySignatureHolder(final byte[] pdf, final int length, SignatureObject so)
+ {
+ this.signed_pdf = pdf;
+ this.signed_pdf_length = length;
+ this.signature_object = so;
+
+ this.signed_text = null;
+ }
+
+ /**
+ * @see at.knowcenter.wag.egov.egiz.pdf.SignatureHolder#getSignedText()
+ */
+ public String getSignedText()
+ {
+ if (this.signed_text == null)
+ {
+ computeSignedText();
+ }
+ return this.signed_text;
+ }
+
+ /**
+ * @see at.knowcenter.wag.egov.egiz.pdf.SignatureHolder#getSignatureObject()
+ */
+ public SignatureObject getSignatureObject()
+ {
+ return this.signature_object;
+ }
+
+ /**
+ * Computes or recomputes the signed text from the underlying binary data.
+ *
+ * <p>
+ * This usually encodes the binary data of given length in Base64.
+ * </p>
+ *
+ * <p>
+ * This is usually called automatically when the signed text is first
+ * requested.
+ * </p>
+ */
+ protected void computeSignedText()
+ {
+ this.signed_text = BinarySignature.retrieveSignableTextFromData(this.signed_pdf, this.signed_pdf_length);
+ }
+
+ /**
+ * Returns the signed_pdf.
+ * @return Returns the signed_pdf.
+ */
+ public byte[] getSignedPdf()
+ {
+ return this.signed_pdf;
+ }
+
+ /**
+ * Returns the signed_pdf_length.
+ * @return Returns the signed_pdf_length.
+ */
+ public int getSignedPdfLength()
+ {
+ return this.signed_pdf_length;
+ }
+
+}
diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/pdf/EGIZDate.java b/src/main/java/at/knowcenter/wag/egov/egiz/pdf/EGIZDate.java
new file mode 100644
index 0000000..7b71d27
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/egov/egiz/pdf/EGIZDate.java
@@ -0,0 +1,189 @@
+/**
+ * <copyright> Copyright (c) 2006 by Know-Center, Graz, Austria </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+ * NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
+ * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES.
+ *
+ * $Id: EGIZDate.java,v 1.1 2006/10/31 08:08:33 wprinz Exp $
+ */
+package at.knowcenter.wag.egov.egiz.pdf;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * Represents a signature date and the signing time as can be found in the
+ * SIG_DATE field.
+ *
+ * <p>
+ * This is used to compare date values of signatures.
+ * </p>
+ *
+ * @author wprinz
+ */
+public class EGIZDate
+{
+
+ /**
+ * The year.
+ */
+ protected int year;
+
+ /**
+ * The month.
+ */
+ protected int month;
+
+ /**
+ * The day.
+ */
+ protected int day;
+
+ /**
+ * The hour.
+ */
+ protected int hour;
+
+ /**
+ * The minute.
+ */
+ protected int minute;
+
+ /**
+ * The second.
+ */
+ protected int second;
+
+ /**
+ * Constructor that fills the date with values.
+ *
+ * @param year
+ * The year.
+ * @param month
+ * The month.
+ * @param day
+ * The day.
+ * @param hour
+ * The hour.
+ * @param minute
+ * The minute.
+ * @param second
+ * The second.
+ */
+ public EGIZDate(int year, int month, int day, int hour, int minute, int second)
+ {
+ this.year = year;
+ this.month = month;
+ this.day = day;
+ this.hour = hour;
+ this.minute = minute;
+ this.second = second;
+ }
+
+ /**
+ * Parses the date information from a given date value.
+ *
+ * <p>
+ * Usually the date value is one extracted from the value of the SIG_DATE
+ * field.
+ * </p>
+ *
+ * @param date_value
+ * The date value String.
+ * @return Returns the parsed EGIZDate. An IllegalArgumentException is thrown
+ * if the date String has an illegal format.
+ */
+ public static EGIZDate parseFromString(String date_value)
+ {
+ // find the according RFC standard and cite it
+
+ // BKU writes a Z after the date for some reason.
+ Pattern date_pattern = Pattern.compile("^\\d\\d\\d\\d-\\d\\d-\\d\\dT\\d\\d:\\d\\d:\\d\\d[Z]?$");
+ Matcher date_matcher = date_pattern.matcher(date_value);
+ if (!date_matcher.matches())
+ {
+ throw new IllegalArgumentException("The date_value (" + date_value + " has an illegal format.");
+ }
+ // for some strange reasons capture groups don't work
+
+ int year = Integer.parseInt(date_value.substring(0, 4));
+ int month = Integer.parseInt(date_value.substring(5, 7));
+ int day = Integer.parseInt(date_value.substring(8, 10));
+ int hour = Integer.parseInt(date_value.substring(11, 13));
+ int minute = Integer.parseInt(date_value.substring(14, 16));
+ int second = Integer.parseInt(date_value.substring(17, 19));
+
+ return new EGIZDate(year, month, day, hour, minute, second);
+ }
+
+ /**
+ * @see java.lang.Object#equals(java.lang.Object)
+ */
+ public boolean equals(Object obj)
+ {
+ if (!(obj instanceof EGIZDate))
+ {
+ return false;
+ }
+
+ return toString().equals(obj.toString());
+ }
+
+ /**
+ * @see java.lang.Object#hashCode()
+ */
+ public int hashCode()
+ {
+ return toString().hashCode();
+ }
+
+ /**
+ * @see java.lang.Object#toString()
+ */
+ public String toString()
+ {
+ return "parsed date = " + year + "-" + month + "-" + day + "T" + hour + ":" + minute + ":" + second;
+ }
+
+ /**
+ * Converts the date to a long integer.
+ *
+ * <p>
+ * An earlier date is lower than a later date.
+ * </p>
+ * <p>
+ * E.g. a date in 1999 will get a smaller number than a date in 2006.
+ * </p>
+ *
+ * @return Returns the compareable long.
+ */
+ protected long toCompareableLong()
+ {
+ return +this.year * 12 * 31 * 24 * 60 * 60 + this.month * 31 * 24 * 60 * 60 + this.day * 24 * 60 * 60 + this.hour * 60 * 60 + this.minute * 60 + this.second;
+ }
+
+ /**
+ * Compares this EGIZDate to another EXIZDate.
+ *
+ * @param other
+ * The other EGIZDate.
+ * @return Returns negative if this date is earlier (lower) than the other
+ * date. Returns 0 if both dates are equal. Returns positive if this
+ * date is later (higher) than the other date.
+ */
+ public int compareTo(EGIZDate other)
+ {
+ long diff = toCompareableLong() - other.toCompareableLong();
+ return (int) diff;
+ }
+
+}
diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/pdf/IncrementalUpdateInformation.java b/src/main/java/at/knowcenter/wag/egov/egiz/pdf/IncrementalUpdateInformation.java
new file mode 100644
index 0000000..cb983cb
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/egov/egiz/pdf/IncrementalUpdateInformation.java
@@ -0,0 +1,152 @@
+/**
+ * <copyright> Copyright (c) 2006 by Know-Center, Graz, Austria </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+ * NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
+ * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES.
+ *
+ * $Id: IncrementalUpdateInformation.java,v 1.2 2006/10/31 08:09:33 wprinz Exp $
+ */
+package at.knowcenter.wag.egov.egiz.pdf;
+
+import java.io.Serializable;
+import java.util.List;
+
+import at.knowcenter.wag.egov.egiz.sig.SignatureObject;
+
+/**
+ * This parameter object contains all useful inforamtion the binary incremental
+ * update methods need to create and replace a binary singature block.
+ *
+ * <p>
+ * This class is basically used to transport information about the document from
+ * the prepareSign to the finishSign of the Signator. In future, this could be
+ * extended and encapsulated to task proprietary IUI instances. E.g. a
+ * BinarySignatorIUI, a TextualSignatorIUI, both implementing the core IUI
+ * interface, but encapsulating Binary or Textual specialities.
+ * </p>
+ *
+ * @author wprinz
+ */
+public class IncrementalUpdateInformation implements Serializable
+{
+ /**
+ * SVUID.
+ */
+ private static final long serialVersionUID = -5904526956127108035L;
+
+ /**
+ * The original PDF document.
+ */
+ public byte[] original_document = null;
+
+ /**
+ * The Singature type to be created.
+ */
+ public String signature_type = null;
+
+ /**
+ * The signed pdf document.
+ *
+ * <p>
+ * This is the original document plus the incremental update block.
+ * </p>
+ */
+ public byte[] signed_pdf = null;
+
+ /**
+ * The start index of this incremental update block.
+ */
+ int start_index = -1;
+
+ /**
+ * The indirect reference of the egiz dict.
+ */
+ // PdfIndirectReference egiz_dict_ir = null;
+ public int egiz_dict_ir_number;
+
+ public int egiz_dict_ir_generation;
+
+ /**
+ * The List of ReplaceInfo objects specifying the byte ranges where the
+ * variable data has to be fille in.
+ */
+ public List replaces = null;
+
+ /**
+ * The List of StringInfo objects specifying the byte ranges that should
+ * be/were signed.
+ */
+ public List byte_ranges = null;
+
+ /**
+ * The indirect reference of the signature x-object.
+ */
+ // public PdfIndirectReference temp_ir;
+ public int temp_ir_number;
+
+ public int temp_ir_generation;
+
+ /**
+ * The start index of the content stream of the signature x-object.
+ */
+ public int content_stream_start = -1;
+
+ /**
+ * The length of the content stream of the signature x-object.
+ */
+ public int content_stream_length = -1;
+
+ /**
+ * The document text for signing.
+ */
+ public String document_text;
+
+ /**
+ * The SignatureObject containing the variable values after the document text
+ * has been signed.
+ * <p>
+ * These values have to be filled in.
+ * </p>
+ */
+ public SignatureObject signed_signature_object;
+
+ /**
+ * The start of the /encodings array.
+ */
+ public int enc_start = -1;
+
+ /**
+ * The length of the /encodings array.
+ */
+ public int enc_length = -1;
+
+ /**
+ * The start of the first /Cert
+ */
+ public int cert_start = -1;
+
+ /**
+ * The length of the /cert placeholder.
+ */
+ public int cert_length = -1;
+
+ /**
+ * The list of strings of the KZ.
+ */
+ public List kz_list;
+
+ /**
+ * The table position.
+ */
+ public TablePos pos;
+
+}
diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/pdf/PDFPage.java b/src/main/java/at/knowcenter/wag/egov/egiz/pdf/PDFPage.java
new file mode 100644
index 0000000..bed1b65
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/egov/egiz/pdf/PDFPage.java
@@ -0,0 +1,539 @@
+/**
+ * <copyright> Copyright (c) 2006 by Know-Center, Graz, Austria </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+ * NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
+ * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES.
+ *
+ * $Id: PDFPage.java,v 1.5 2006/10/31 08:09:33 wprinz Exp $
+ */
+package at.knowcenter.wag.egov.egiz.pdf;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.log4j.Logger;
+import org.pdfbox.cos.COSName;
+import org.pdfbox.cos.COSStream;
+import org.pdfbox.pdmodel.PDPage;
+import org.pdfbox.pdmodel.PDResources;
+import org.pdfbox.pdmodel.common.PDStream;
+import org.pdfbox.pdmodel.graphics.xobject.PDXObject;
+import org.pdfbox.pdmodel.graphics.xobject.PDXObjectForm;
+import org.pdfbox.util.Matrix;
+import org.pdfbox.util.PDFOperator;
+import org.pdfbox.util.PDFTextStripper;
+import org.pdfbox.util.TextPosition;
+import org.pdfbox.util.operator.OperatorProcessor;
+
+import at.knowcenter.wag.egov.egiz.cfg.ConfigLogger;
+
+/**
+ * PDFPage is an inner class that is used to calculate the page length of a PDF
+ * Document page. It extends the PDFTextStripper class and implement one
+ * interested method: {@link PDFPage#showCharacter(TextPosition)}<br>
+ * This method is called when processing the FileStream. By calling the method
+ * {@link org.pdfbox.util.PDFStreamEngine#processStream(org.pdfbox.pdmodel.PDPage, org.pdfbox.pdmodel.PDResources, org.pdfbox.cos.COSStream)}
+ * the implemented method showCharacter is called.
+ *
+ * @author wlackner
+ * @see PDFTextStripper
+ */
+public class PDFPage extends PDFTextStripper
+{
+ /**
+ * The logger definition.
+ */
+ private static final Logger logger_ = ConfigLogger.getLogger(PDFPage.class);
+
+ /**
+ * The maximum (lowest) y position of a character.
+ */
+ protected float max_character_ypos = Float.NEGATIVE_INFINITY;
+
+ /**
+ * The maximum (lowest y position of an image.
+ */
+ protected float max_image_ypos = Float.NEGATIVE_INFINITY;
+
+ /**
+ * The empty constructor.
+ *
+ * @throws IOException
+ */
+ public PDFPage() throws IOException
+ {
+ super();
+
+ OperatorProcessor newInvoke = new MyInvoke();
+ newInvoke.setContext(this);
+ operators.put("Do", newInvoke);
+ }
+
+ // /**
+ // * You should override this method if you want to perform an action when a
+ // * string is being shown.
+ // *
+ // * @param string The string to display.
+ // *
+ // * @throws IOException If there is an error showing the string
+ // */
+ // public void showString( byte[] string ) throws IOException
+ // {
+ // float spaceWidth = 0;
+ // float spacing = 0;
+ // StringBuffer stringResult = new StringBuffer(string.length);
+ //
+ // float characterDisplacement = 0;
+ // float spaceDisplacement = 0;
+ //
+ // PDGraphicsState graphicsState = getGraphicsState();
+ // float fontSize = graphicsState.getTextState().getFontSize();
+ // float horizontalScaling =
+ // graphicsState.getTextState().getHorizontalScalingPercent()/100f;
+ // float rise = graphicsState.getTextState().getRise();
+ // final float wordSpacing = graphicsState.getTextState().getWordSpacing();
+ // final float characterSpacing =
+ // graphicsState.getTextState().getCharacterSpacing();
+ // float wordSpacingDisplacement = 0;
+ //
+ // PDFont font = graphicsState.getTextState().getFont();
+ //
+ // //This will typically be 1000 but in the case of a type3 font
+ // //this might be a different number
+ // float glyphSpaceToTextSpaceFactor = 1f/font.getFontMatrix().getValue( 0, 0
+ // );
+ // Float averageWidth = (Float)fontToAverageWidths.get( font );
+ // if( averageWidth == null )
+ // {
+ // averageWidth = new Float( font.getAverageFontWidth() );
+ // fontToAverageWidths.put( font, averageWidth );
+ // }
+ //
+ // Matrix initialMatrix = new Matrix();
+ // initialMatrix.setValue(0,0,1);
+ // initialMatrix.setValue(0,1,0);
+ // initialMatrix.setValue(0,2,0);
+ // initialMatrix.setValue(1,0,0);
+ // initialMatrix.setValue(1,1,1);
+ // initialMatrix.setValue(1,2,0);
+ // initialMatrix.setValue(2,0,0);
+ // initialMatrix.setValue(2,1,rise);
+ // initialMatrix.setValue(2,2,1);
+ //
+ //
+ // //this
+ // int codeLength = 1;
+ // Matrix ctm = graphicsState.getCurrentTransformationMatrix();
+ //
+ // //lets see what the space displacement should be
+ // spaceDisplacement = (font.getFontWidth( SPACE_BYTES, 0, 1
+ // )/glyphSpaceToTextSpaceFactor);
+ // if( spaceDisplacement == 0 )
+ // {
+ // spaceDisplacement =
+ // (averageWidth.floatValue()/glyphSpaceToTextSpaceFactor);
+ // //The average space width appears to be higher than necessary
+ // //so lets make it a little bit smaller.
+ // spaceDisplacement *= .80f;
+ // if( log.isDebugEnabled() )
+ // {
+ // log.debug( "Font: Space From Average=" + spaceDisplacement );
+ // }
+ // }
+ // int pageRotation = page.findRotation();
+ //
+ // // very strange.... the ctms are multiplied by right, but suddenly the
+ // textM is multiplied from the left.
+ // // but: PDF matrices are multiplied from left ==> ctm is wrong
+ // Matrix trm = initialMatrix.multiply( textMatrix ).multiply( ctm );
+ // float x = trm.getValue(2,0);
+ // float y = trm.getValue(2,1);
+ // float flipped_y = -y + page.findMediaBox().getHeight();
+ // if( pageRotation == 0 )
+ // {
+ // trm.setValue( 2,1, flipped_y );
+ // }
+ // else if( pageRotation == 90 )
+ // {
+ // trm.setValue( 2,0, y );
+ // trm.setValue( 2,1, x );
+ // }
+ // else if( pageRotation == 270 )
+ // {
+ // trm.setValue( 2,0, flipped_y );
+ // trm.setValue( 2,1, x );
+ // }
+ // for( int i=0; i<string.length; i+=codeLength )
+ // {
+ // if( log.isDebugEnabled() )
+ // {
+ // log.debug( "initialMatrix=" + initialMatrix );
+ // log.debug( "textMatrix=" + textMatrix );
+ // log.debug( "initialMatrix.multiply( textMatrix )=" +
+ // initialMatrix.multiply( textMatrix ) );
+ // log.debug( "ctm=" + ctm );
+ // log.debug( "trm=" + initialMatrix.multiply( textMatrix ).multiply( ctm ) );
+ // }
+ // codeLength = 1;
+ //
+ // String c = font.encode( string, i, codeLength );
+ //
+ // if( log.isDebugEnabled() )
+ // {
+ // log.debug( "Character Code=" + string[i] + "='" + c + "'" );
+ // }
+ // if( c == null && i+1<string.length)
+ // {
+ // //maybe a multibyte encoding
+ // codeLength++;
+ // if( log.isDebugEnabled() )
+ // {
+ // log.debug( "Multibyte Character Code=" + string[i] + string[i+1] );
+ // }
+ // c = font.encode( string, i, codeLength );
+ // }
+ // stringResult.append( c );
+ //
+ // //todo, handle horizontal displacement
+ // characterDisplacement += (font.getFontWidth( string, i, codeLength
+ // )/glyphSpaceToTextSpaceFactor);
+ //
+ //
+ // // PDF Spec - 5.5.2 Word Spacing
+ // //
+ // // Word spacing works the same was as character spacing, but applies
+ // // only to the space character, code 32.
+ // //
+ // // Note: Word spacing is applied to every occurrence of the single-byte
+ // // character code 32 in a string. This can occur when using a simple
+ // // font or a composite font that defines code 32 as a single-byte code.
+ // // It does not apply to occurrences of the byte value 32 in multiple-byte
+ // // codes.
+ // //
+ // // RDD - My interpretation of this is that only character code 32's that
+ // // encode to spaces should have word spacing applied. Cases have been
+ // // observed where a font has a space character with a character code
+ // // other than 32, and where word spacing (Tw) was used. In these cases,
+ // // applying word spacing to either the non-32 space or to the character
+ // // code 32 non-space resulted in errors consistent with this
+ // interpretation.
+ // //
+ //
+ // boolean withCS = false;
+ // if( (string[i] == 0x20) && c.equals( " " ) )
+ // {
+ // spacing += wordSpacing + characterSpacing;
+ // withCS = true;
+ // }
+ // else
+ // {
+ // spacing += characterSpacing;
+ // }
+ //
+ // if( log.isDebugEnabled() )
+ // {
+ // log.debug( "Checking code '" + c + "' font=" +
+ // graphicsState.getTextState().getFont() +
+ // " Tc=" + characterSpacing +
+ // " Tw=" + wordSpacing +
+ // " fontSize=" + fontSize +
+ // " horizontalScaling=" + horizontalScaling +
+ // " totalDisp=" + characterDisplacement +
+ // " spacing=" + spacing + "(" + withCS + ")" );
+ // }
+ // // We want to update the textMatrix using the width, in text space units.
+ // //
+ //
+ // }
+ //
+ // //The adjustment will always be zero. The adjustment as shown in the
+ // //TJ operator will be handled separately.
+ // float adjustment=0;
+ // //todo, need to compute the horizontal displacement
+ // float ty = 0;
+ // float tx =
+ // ((characterDisplacement-adjustment/glyphSpaceToTextSpaceFactor)*fontSize +
+ // spacing)
+ // *horizontalScaling;
+ //
+ // if( log.isDebugEnabled() )
+ // {
+ // log.debug( "disp=" + characterDisplacement + " adj=" + adjustment +
+ // " fSize=" + fontSize + " tx=" + tx );
+ // }
+ //
+ // float xScale = trm.getXScale();
+ // float yScale = trm.getYScale();
+ // float xPos = trm.getXPosition();
+ // float yPos = trm.getYPosition();
+ // spaceWidth = spaceDisplacement * xScale * fontSize;
+ // wordSpacingDisplacement = wordSpacing*xScale * fontSize;
+ // Matrix td = new Matrix();
+ // td.setValue( 2, 0, tx );
+ // td.setValue( 2, 1, ty );
+ //
+ // if( log.isDebugEnabled() )
+ // {
+ // log.debug( "TRM=" + trm );
+ // log.debug( "TextMatrix before " + textMatrix );
+ // }
+ // float xPosBefore = textMatrix.getXPosition();
+ // float yPosBefore = textMatrix.getYPosition();
+ // textMatrix = td.multiply( textMatrix );
+ // if( log.isDebugEnabled() )
+ // {
+ // log.debug( "TextMatrix after " + textMatrix );
+ // }
+ // float totalStringDisplacement = 0;
+ // if( pageRotation == 0 )
+ // {
+ // totalStringDisplacement = (textMatrix.getXPosition() - xPosBefore);
+ // }
+ // else if( pageRotation == 90 )
+ // {
+ // totalStringDisplacement = (textMatrix.getYPosition() - yPosBefore);
+ // }
+ // else if( pageRotation == 270 )
+ // {
+ // totalStringDisplacement = (yPosBefore - textMatrix.getYPosition());
+ // }
+ // showCharacter(
+ // new TextPosition(
+ // xPos,
+ // yPos,
+ // xScale,
+ // yScale,
+ // totalStringDisplacement,
+ // spaceWidth,
+ // stringResult.toString(),
+ // graphicsState.getTextState().getFont(),
+ // graphicsState.getTextState().getFontSize(),
+ // wordSpacingDisplacement ));
+ // }
+ //
+
+ protected void processOperator(PDFOperator operator, List arguments) throws IOException
+ {
+ logger_.debug("operator = " + operator);
+
+ super.processOperator(operator, arguments);
+ }
+
+ /**
+ * A method provided as an event interface to allow a subclass to perform some
+ * specific functionality when a character needs to be displayed. This method
+ * is used to calculate the latest position of a text in the page. Sorry for
+ * this missinterpretation of the method, but it is the only way to do this
+ * (provided by PDFBox)!!!
+ *
+ * @param text
+ * the character to be displayed -> calculate there y position.
+ */
+ protected void showCharacter(TextPosition text)
+ {
+ float current_y = text.getY();
+ String character = text.getCharacter();
+ // store ypos of the char if it is not empty
+ if (!character.equals(" ") && current_y > this.max_character_ypos)
+ {
+ this.max_character_ypos = current_y;
+ //logger_.debug("text.character=" + character + ", y=" + current_y);
+ // System.err.println(character + "|" + current_y);
+ }
+
+ // logger_.debug("text.character=" + character + ", y=" + current_y);
+ // System.err.println(character + "|" + current_y);
+ }
+
+ // use this funtion getting an unsorted text output
+ // public void showString(byte[] string) {
+ // logger_.debug(new String(string));
+ // }
+
+ /**
+ * Returns the calculated page length.
+ *
+ * @return the max page length value
+ */
+ public float getMaxPageLength()
+ {
+ float max_ypos = Float.NEGATIVE_INFINITY;
+
+ if (this.max_character_ypos > this.max_image_ypos)
+ {
+ max_ypos = this.max_character_ypos;
+ }
+ else
+ {
+ max_ypos = this.max_image_ypos;
+ }
+
+ return max_ypos;
+ }
+
+ public class MyInvoke extends OperatorProcessor
+ {
+
+ public void process(PDFOperator operator, List arguments) throws IOException
+ {
+ COSName name = (COSName) arguments.get(0);
+ logger_.debug("<Do name=\"" + name.getName() + "\">");
+
+ // PDResources res = context.getResources();
+
+ Map xobjects = context.getXObjects();
+ PDXObject xobject = (PDXObject) xobjects.get(name.getName());
+
+ PDStream stream = xobject.getPDStream();
+ COSStream cos_stream = stream.getStream();
+
+ COSName subtype = (COSName) cos_stream.getDictionaryObject(COSName.SUBTYPE);
+ if (subtype.equals(COSName.IMAGE))
+ {
+ logger_.debug("XObject Image");
+
+ Matrix ctm = context.getGraphicsState().getCurrentTransformationMatrix();
+ logger_.debug("ctm = " + ctm);
+
+ Pos [] coordinates = new Pos [] {
+ new Pos(0, 0, 1),
+ new Pos(1, 0, 1),
+ new Pos(0, 1, 1),
+ new Pos(1, 1, 1) };
+
+ Pos [] transformed_coordinates = transtormCoordinates(coordinates, ctm);
+
+ float actual_lowest_point = Float.NaN;
+
+ int pageRotation = page.findRotation();
+ logger_.debug("PageRotation = " + pageRotation);
+ if (pageRotation == 0)
+ {
+ float min_y = findMinY(transformed_coordinates);
+ logger_.debug("min_y = " + min_y);
+ float page_height = page.findMediaBox().getHeight();
+ logger_.debug("page_height = " + page_height);
+
+ actual_lowest_point = page_height - min_y;
+ }
+ if (pageRotation == 90)
+ {
+ float max_x = findMaxX(transformed_coordinates);
+ logger_.debug("max_x = " + max_x);
+// float page_width = page.findMediaBox().getWidth();
+// logger_.debug("page_width = " + page_width);
+
+ actual_lowest_point = max_x;
+ }
+ if (pageRotation == 180)
+ {
+ float min_y = findMinY(transformed_coordinates);
+ logger_.debug("min_y = " + min_y);
+ actual_lowest_point = min_y;
+ }
+ if (pageRotation == 270)
+ {
+ float min_x = findMinX(transformed_coordinates);
+ logger_.debug("min_x = " + min_x);
+// float page_width = page.findMediaBox().getWidth();
+// logger_.debug("page_width = " + page_width);
+
+ actual_lowest_point = min_x;
+ }
+
+
+ logger_.debug("actual_lowest_point = " + actual_lowest_point);
+
+ if (actual_lowest_point > PDFPage.this.max_image_ypos)
+ {
+ PDFPage.this.max_image_ypos = actual_lowest_point;
+ }
+
+ return;
+ }
+
+ if (xobject instanceof PDXObjectForm)
+ {
+ PDXObjectForm form = (PDXObjectForm) xobject;
+ COSStream invoke = (COSStream) form.getCOSObject();
+ PDResources pdResources = form.getResources();
+ PDPage page = context.getCurrentPage();
+ if (pdResources == null)
+ {
+ pdResources = page.findResources();
+ }
+
+ getContext().processSubStream(page, pdResources, invoke);
+ }
+ }
+ }
+
+ public static Pos [] transtormCoordinates (Pos [] coordinates, Matrix m)
+ {
+ Pos [] transformed = new Pos [coordinates.length];
+ for (int i = 0; i < coordinates.length; i++)
+ {
+ transformed[i] = transtormCoordinate(coordinates[i], m);
+ }
+ return transformed;
+ }
+
+ public static Pos transtormCoordinate (Pos pos, Matrix m)
+ {
+ Pos transformed = new Pos();
+ transformed.x = pos.x * m.getValue(0, 0) + pos.y * m.getValue(1, 0) + pos.z * m.getValue(2, 0);
+ transformed.y = pos.x * m.getValue(0, 1) + pos.y * m.getValue(1, 1) + pos.z * m.getValue(2, 1);
+ transformed.z = pos.x * m.getValue(0, 2) + pos.y * m.getValue(1, 2) + pos.z * m.getValue(2, 2);
+
+ logger_.debug(" transformed " + pos + " --> " + transformed);
+ return transformed;
+ }
+
+ public static float findMinY (Pos [] coordinates)
+ {
+ float min = Float.POSITIVE_INFINITY;
+ for (int i = 0; i < coordinates.length; i++)
+ {
+ if (coordinates[i].y < min)
+ {
+ min = coordinates[i].y;
+ }
+ }
+ return min;
+ }
+ public static float findMaxX (Pos [] coordinates)
+ {
+ float max = Float.NEGATIVE_INFINITY;
+ for (int i = 0; i < coordinates.length; i++)
+ {
+ if (coordinates[i].x > max)
+ {
+ max = coordinates[i].x;
+ }
+ }
+ return max;
+ }
+ public static float findMinX (Pos [] coordinates)
+ {
+ float min = Float.POSITIVE_INFINITY;
+ for (int i = 0; i < coordinates.length; i++)
+ {
+ if (coordinates[i].x < min)
+ {
+ min = coordinates[i].x;
+ }
+ }
+ return min;
+ }
+
+} \ No newline at end of file
diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/pdf/PDFSignatureCreation.java b/src/main/java/at/knowcenter/wag/egov/egiz/pdf/PDFSignatureCreation.java
new file mode 100644
index 0000000..453103b
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/egov/egiz/pdf/PDFSignatureCreation.java
@@ -0,0 +1,170 @@
+/*
+ * <copyright>
+ * Copyright (c) 2006 by Know-Center, Graz, Austria
+ * </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF THE
+ * SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE,
+ * OR NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES
+ * SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING
+ * THIS SOFTWARE OR ITS DERIVATIVES.
+ *
+ * $Id: PDFSignatureCreation.java,v 1.6 2006/10/31 08:09:33 wprinz Exp $
+ */
+package at.knowcenter.wag.egov.egiz.pdf;
+
+import org.apache.log4j.Level;
+import org.apache.log4j.Logger;
+
+import at.knowcenter.wag.egov.egiz.cfg.ConfigLogger;
+import at.knowcenter.wag.egov.egiz.cfg.SettingsReader;
+import at.knowcenter.wag.egov.egiz.exceptions.PDFDocumentException;
+import at.knowcenter.wag.egov.egiz.exceptions.SettingsException;
+import at.knowcenter.wag.egov.egiz.sig.SignatureObject;
+
+/**
+ * This class provides wrapper methods to get an access to abstract PDF documents (PDFSignator).
+ * There exists many open source libraries and commercial libraries that can implement the abstract
+ * interface. <br>
+ * This class is to load the corresponding implementation of an abstract PDFSignator class. Therefor
+ * it seams to be a factory. The factory settings are read from the configuration file calling the
+ * SettingsReader.
+ *
+ * @author wlackner
+ * @see at.knowcenter.wag.egov.egiz.cfg.SettingsReader
+ */
+public class PDFSignatureCreation {
+ /**
+ * The abstract signature object
+ */
+ private SignatureObject sigObject_ = null;
+ /**
+ * The abstract pdf siganture object
+ */
+ private PDFSignatureObject pdfSigObject_ = null;
+ /**
+ * The SettingsReader instance
+ */
+ private SettingsReader settings_ = null;
+ /**
+ * The factory class prefix
+ */
+ private final static String CLASS_PREFIX = ".PDFSignatureObject";
+ /**
+ * The factory class prefix of the default library
+ */
+ protected final static String DEFAULT_LIBRARY = "IText";
+ /**
+ * The settings key defined in the settings file
+ *
+ * @see SettingsReader
+ */
+ protected final static String SETTINGS_KEY = "pdf.signature.library";
+ /**
+ * The logger definition.
+ */
+ private static final Logger logger_ = ConfigLogger.getLogger(PDFSignatureCreation.class);
+
+ /**
+ * Load the configuration settings. Load the corresponding class implementation for the abstract
+ * PDFSignature class. Init with a signature object.
+ *
+ * @param sigObject the native signature object
+ * @throws PDFDocumentException ErrorCode:101
+ */
+ public PDFSignatureCreation(SignatureObject sigObject) throws PDFDocumentException {
+ try {
+ loadSettings();
+ } catch (PDFDocumentException e) {
+ e.setErrorCode(101);
+ throw e;
+ }
+ sigObject_ = sigObject;
+ }
+
+ /**
+ * Load the factory implementation. This method trys to load the configured PDF library.
+ *
+ * @throws PDFDocumentException
+ */
+ private PDFSignatureObject createPDFSignatureObject() throws PDFDocumentException {
+ PDFSignatureObject pdf_sig_object = null;
+ String class_name = this.getClass().getPackage().getName() + getClassName();
+ Class pdf_sig_obj_class = null;
+ try {
+ pdf_sig_obj_class = Class.forName(class_name);
+ } catch (ClassNotFoundException e) {
+ if (logger_.isEnabledFor(Level.FATAL)) {
+ logger_.fatal("Class not found:" + class_name);
+ }
+ throw new PDFDocumentException(203, "Can not load pdf signator library", e);
+ }
+ try {
+ pdf_sig_object = (PDFSignatureObject) pdf_sig_obj_class.newInstance();
+ } catch (InstantiationException e) {
+ if (logger_.isEnabledFor(Level.FATAL)) {
+ logger_.fatal("Can not instantiate:" + class_name);
+ }
+ throw new PDFDocumentException(203, "Can not load pdf signator library", e);
+ } catch (IllegalAccessException e) {
+ if (logger_.isEnabledFor(Level.FATAL)) {
+ logger_.fatal("Can not access:" + class_name);
+ }
+ throw new PDFDocumentException(203, "Can not load pdf signator library", e);
+ }
+ return pdf_sig_object;
+ }
+
+ /**
+ * load the class settings
+ *
+ * @throws PDFDocumentException
+ * @see SettingsReader
+ */
+ private void loadSettings() throws PDFDocumentException {
+ if (settings_ == null) {
+ try {
+ settings_ = SettingsReader.getInstance();
+ } catch (SettingsException e) {
+ String log_message = "Can not load pdf signature settings. Cause:\n" + e.getMessage();
+ logger_.error(log_message);
+ throw new PDFDocumentException(101, log_message, e);
+ }
+ }
+ }
+
+ /**
+ * Read the class postfix from the configuration file
+ *
+ * @return the full qualified class name
+ */
+ private String getClassName() {
+ String extract_class = settings_.getSetting(SETTINGS_KEY, DEFAULT_LIBRARY);
+ return CLASS_PREFIX + extract_class;
+ }
+
+ /**
+ * Creates a new pdf signature object using the configured pdf library.
+ *
+ * @return a new pdf signature object
+ * @throws PDFDocumentException ErrorCode:203
+ */
+ public PDFSignatureObject getPDFSignatureObject() throws PDFDocumentException {
+ if (pdfSigObject_ == null) {
+ try {
+ pdfSigObject_ = createPDFSignatureObject();
+ } catch (PDFDocumentException e) {
+ e.setErrorCode(203);
+ throw e;
+ }
+ pdfSigObject_.setSignatorObject(sigObject_);
+ }
+ return pdfSigObject_;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/pdf/PDFSignatureObject.java b/src/main/java/at/knowcenter/wag/egov/egiz/pdf/PDFSignatureObject.java
new file mode 100644
index 0000000..3584820
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/egov/egiz/pdf/PDFSignatureObject.java
@@ -0,0 +1,50 @@
+/*
+ * <copyright>
+ * Copyright (c) 2006 by Know-Center, Graz, Austria
+ * </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF THE
+ * SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE,
+ * OR NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES
+ * SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING
+ * THIS SOFTWARE OR ITS DERIVATIVES.
+ *
+ * $Id: PDFSignatureObject.java,v 1.3 2006/10/31 08:09:33 wprinz Exp $
+ */
+package at.knowcenter.wag.egov.egiz.pdf;
+
+import at.knowcenter.wag.egov.egiz.exceptions.PDFDocumentException;
+import at.knowcenter.wag.egov.egiz.sig.SignatureObject;
+
+/**
+ * Defines an interface to get access to PDF documents. There exists many open source libraries and
+ * commercial libraries.
+ *
+ * @author wlackner
+ */
+public interface PDFSignatureObject {
+ public void setSignatorObject(SignatureObject signatorObject);
+
+ /**
+ * Converts the current abstract signature object in a pdf signature object implementation
+ *
+ * @return the converted pdf signature object
+ * @throws PDFDocumentException
+ */
+ public Object getSignatureObject() throws PDFDocumentException;
+
+ /**
+ * Converts a abstract signature object in a pdf signature object implementation
+ *
+ * @param signatorObject the abstract signatorObject to convert
+ * @return the converted pdf signature object
+ * @throws PDFDocumentException
+ */
+ public Object getSignatureObject(SignatureObject signatorObject) throws PDFDocumentException;
+} \ No newline at end of file
diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/pdf/PDFSignatureObjectIText.java b/src/main/java/at/knowcenter/wag/egov/egiz/pdf/PDFSignatureObjectIText.java
new file mode 100644
index 0000000..56b5f86
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/egov/egiz/pdf/PDFSignatureObjectIText.java
@@ -0,0 +1,490 @@
+/*
+ * <copyright> Copyright (c) 2006 by Know-Center, Graz, Austria </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+ * NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
+ * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES.
+ *
+ * $Id: PDFSignatureObjectIText.java,v 1.5 2006/10/31 08:09:33 wprinz Exp $
+ */
+package at.knowcenter.wag.egov.egiz.pdf;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.util.ArrayList;
+import java.util.HashMap;
+
+import org.apache.log4j.Level;
+import org.apache.log4j.Logger;
+
+import at.knowcenter.wag.egov.egiz.cfg.ConfigLogger;
+import at.knowcenter.wag.egov.egiz.cfg.SettingsReader;
+import at.knowcenter.wag.egov.egiz.exceptions.ErrorCodeException;
+import at.knowcenter.wag.egov.egiz.exceptions.PDFDocumentException;
+import at.knowcenter.wag.egov.egiz.exceptions.SettingsException;
+import at.knowcenter.wag.egov.egiz.sig.SignatureObject;
+import at.knowcenter.wag.egov.egiz.table.Entry;
+import at.knowcenter.wag.egov.egiz.table.Style;
+import at.knowcenter.wag.egov.egiz.table.Table;
+
+import com.lowagie.text.BadElementException;
+import com.lowagie.text.Element;
+import com.lowagie.text.Font;
+import com.lowagie.text.Image;
+import com.lowagie.text.Phrase;
+import com.lowagie.text.pdf.PdfPCell;
+import com.lowagie.text.pdf.PdfPTable;
+
+/**
+ * This class is the IText implementation of the PDFSignatureObject interface.
+ * The class takes an abstract definition of a signature object and convert them
+ * into a pdf table that is used to sign a pdf document.
+ *
+ * @author wlackner
+ * @see at.knowcenter.wag.egov.egiz.sig.SignatureObject
+ * @see at.knowcenter.wag.egov.egiz.table.Table
+ * @see at.knowcenter.wag.egov.egiz.table.Entry
+ * @see at.knowcenter.wag.egov.egiz.table.Style
+ * @see com.lowagie.text.pdf.PdfPTable
+ * @see at.knowcenter.wag.egov.egiz.cfg.SettingsReader
+ */
+public class PDFSignatureObjectIText implements PDFSignatureObject
+{
+
+ /**
+ * The default font definition
+ */
+ private static Font DEFAULT_FONT = new Font(Font.HELVETICA, 8, Font.NORMAL);
+
+ /**
+ * The abstract signature object
+ */
+ private SignatureObject sigObject_ = null;
+
+ /**
+ * The IText pdf table object
+ */
+ private PdfPTable pdfSigObject_ = null;
+
+ /**
+ * The SettingsReader instance
+ */
+ private SettingsReader settings_ = null;
+
+ /**
+ * The logger definition.
+ */
+ private static final Logger logger_ = ConfigLogger.getLogger(PDFSignatureObjectIText.class);
+
+ /**
+ * Map the style align definitions to IText's align statements
+ */
+ private static HashMap alignMap_ = new HashMap();
+
+ /**
+ * Map the font definitions to IText's font statements
+ */
+ private static HashMap fontMap_ = new HashMap();
+
+ /**
+ * The empty constructor. It loads the ui definitions from signature tables
+ * and init the align map.
+ *
+ * @throws PDFDocumentException
+ */
+ public PDFSignatureObjectIText() throws PDFDocumentException
+ {
+ loadSettings();
+ initStyleMaps();
+ }
+
+ /**
+ * load the class settings
+ *
+ * @throws PDFDocumentException
+ * @see SettingsReader
+ */
+ private void loadSettings() throws PDFDocumentException
+ {
+ if (settings_ == null)
+ {
+ try
+ {
+ settings_ = SettingsReader.getInstance();
+ }
+ catch (SettingsException e)
+ {
+ String log_message = "Can not load pdf signature settings. Cause:\n" + e.getMessage();
+ logger_.error(log_message);
+ throw new PDFDocumentException(101, log_message, e);
+ }
+ }
+ }
+
+ /**
+ * This method initialize the style maps. It maps the style style definitions
+ * to IText styles.
+ */
+ private void initStyleMaps()
+ {
+ alignMap_.put(Style.TOP, new Integer(Element.ALIGN_TOP));
+ alignMap_.put(Style.MIDDLE, new Integer(Element.ALIGN_MIDDLE));
+ alignMap_.put(Style.BOTTOM, new Integer(Element.ALIGN_BOTTOM));
+ alignMap_.put(Style.LEFT, new Integer(Element.ALIGN_LEFT));
+ alignMap_.put(Style.CENTER, new Integer(Element.ALIGN_CENTER));
+ alignMap_.put(Style.RIGHT, new Integer(Element.ALIGN_RIGHT));
+
+ fontMap_.put(Style.HELVETICA, new Integer(Font.HELVETICA));
+ fontMap_.put(Style.TIMES_ROMAN, new Integer(Font.TIMES_ROMAN));
+ fontMap_.put(Style.COURIER, new Integer(Font.COURIER));
+ fontMap_.put(Style.NORMAL, new Integer(Font.NORMAL));
+ fontMap_.put(Style.BOLD, new Integer(Font.BOLD));
+ fontMap_.put(Style.ITALIC, new Integer(Font.ITALIC));
+ fontMap_.put(Style.BOLDITALIC, new Integer(Font.BOLDITALIC));
+ fontMap_.put(Style.UNDERLINE, new Integer(Font.UNDERLINE));
+ fontMap_.put(Style.STRIKETHRU, new Integer(Font.STRIKETHRU));
+ }
+
+ /**
+ * Set the abstract signature definition.
+ *
+ * @param signatorObject
+ * the abstract signator object
+ * @see at.knowcenter.wag.egov.egiz.pdf.PDFSignatureObject#setSignatorObject(at.knowcenter.wag.egov.egiz.sig.SignatureObject)
+ */
+ public void setSignatorObject(SignatureObject signatorObject)
+ {
+ sigObject_ = signatorObject;
+ }
+
+ /**
+ * This method maps the table cell definitions to the pdfCell element.
+ *
+ * @param pdfCell
+ * the pdf cell to be styled
+ * @param cellStyle
+ * the abstract style definition
+ * @see com.lowagie.text.pdf.PdfPCell
+ * @see at.knowcenter.wag.egov.egiz.table.Style
+ */
+ private void setCellStyle(PdfPCell pdfCell, Style cellStyle)
+ {
+ if (cellStyle != null)
+ {
+ if (cellStyle.getBgColor() != null)
+ {
+ pdfCell.setBackgroundColor(cellStyle.getBgColor());
+ }
+ pdfCell.setPadding(cellStyle.getPadding());
+ if (cellStyle.getBorder() > 0)
+ {
+ pdfCell.setBorderWidth(cellStyle.getBorder());
+ }
+ else
+ {
+ pdfCell.setBorder(0);
+ }
+ if (cellStyle.getVAlign() != null)
+ {
+ int align = ((Integer) alignMap_.get(cellStyle.getVAlign())).intValue();
+ pdfCell.setVerticalAlignment(align);
+ }
+ if (cellStyle.getHAlign() != null)
+ {
+ int align = ((Integer) alignMap_.get(cellStyle.getHAlign())).intValue();
+ pdfCell.setHorizontalAlignment(align);
+ }
+ }
+ }
+
+ /**
+ * This method maps the cell font definition to the iText Font Object
+ *
+ * @param fontString
+ * @return the corresponding iText Font Object
+ * @see com.lowagie.text.Font
+ */
+ private Font getCellFont(String fontString)
+ {
+ Font font = DEFAULT_FONT;
+ if (fontString == null)
+ {
+ return font;
+ }
+ Object cache_font = fontMap_.get(fontString);
+ if (cache_font != null)
+ {
+ return (Font) cache_font;
+ }
+ String[] font_arr = fontString.split(",");
+ if (font_arr.length != 3)
+ {
+ return font;
+ }
+ Object font_face = fontMap_.get(font_arr[0]);
+ if (font_face == null)
+ {
+ return font;
+ }
+ Object font_weight = fontMap_.get(font_arr[2]);
+ if (font_weight == null)
+ {
+ return font;
+ }
+ int face = ((Integer) font_face).intValue();
+ float height = Float.parseFloat(font_arr[1]);
+ int weight = ((Integer) font_weight).intValue();
+
+ font = new Font(face, height, weight);
+ fontMap_.put(fontString, font);
+ return font;
+ }
+
+ /**
+ * This method visualize an abstract table cell into a corresponding pdf table
+ * cell. The new pdf table cell is redered and get the style information from
+ * the abstract cell. Following types can be rendered:
+ * <ul>
+ * <li>text statements</li>
+ * <li>images</li>
+ * <li>tables</li>
+ * </ul>
+ *
+ * @param abstractCell
+ * the abstract cell definition
+ * @return the new redererd pdf table cell
+ * @throws PDFDocumentException
+ * ErrorCode:220, 221, 222
+ * @see com.lowagie.text.pdf.PdfPCell
+ * @see at.knowcenter.wag.egov.egiz.table.Entry
+ */
+ private PdfPCell renderCell(Entry abstractCell) throws PDFDocumentException
+ {
+ PdfPCell pdf_cell = null;
+ Style cell_style = abstractCell.getStyle();
+ switch (abstractCell.getType())
+ {
+ case Entry.TYPE_CAPTION:
+ case Entry.TYPE_VALUE:
+ String text = (String) abstractCell.getValue();
+ if (text == null)
+ {
+ text = "";
+ }
+ String font_string = cell_style.getFont();
+ if (abstractCell.getType() == Entry.TYPE_VALUE && cell_style.getValueFont() != null)
+ {
+ font_string = cell_style.getValueFont();
+ }
+ Font cell_font = getCellFont(font_string);
+ Phrase text_phrase = new Phrase(text, cell_font);
+ pdf_cell = new PdfPCell(text_phrase);
+ setCellStyle(pdf_cell, cell_style);
+ break;
+ case Entry.TYPE_IMAGE:
+ try
+ {
+ String img_ref = (String) abstractCell.getValue();
+ String img_location = SettingsReader.relocateFile(img_ref);
+ File img_file = new File (img_location);
+ if (!img_file.exists())
+ {
+ logger_.debug("Image file \"" + img_file.getCanonicalPath() + "\" doesn't exist.");
+ throw new PDFDocumentException(220, "Image file \"" + img_file.getCanonicalPath() + "\" doesn't exist.");
+ }
+ Image image = Image.getInstance(img_location);
+ pdf_cell = new PdfPCell(image, true);
+ setCellStyle(pdf_cell, cell_style);
+ }
+ catch (BadElementException e)
+ {
+ if (logger_.isDebugEnabled())
+ {
+ if (logger_.isDebugEnabled())
+ {
+ e.printStackTrace();
+ }
+ }
+ if (logger_.isEnabledFor(Level.ERROR))
+ {
+ logger_.error("BadElementException:" + e.getMessage());
+ }
+ PDFDocumentException pde = new PDFDocumentException(220, "PDF table can not created");
+ throw pde;
+ }
+ catch (MalformedURLException e)
+ {
+ if (logger_.isDebugEnabled())
+ {
+ e.printStackTrace();
+ }
+ if (logger_.isEnabledFor(Level.ERROR))
+ {
+ logger_.error("MalformedURLException:" + e.getMessage());
+ }
+ PDFDocumentException pde = new PDFDocumentException(221, "PDF table can not created");
+ throw pde;
+ }
+ catch (IOException e)
+ {
+ if (logger_.isDebugEnabled())
+ {
+ e.printStackTrace();
+ }
+ if (logger_.isEnabledFor(Level.ERROR))
+ {
+ logger_.error("Error Code:222 " + ErrorCodeException.getErrorCodeMessage(222) + ". IOException:" + e.getMessage());
+ }
+ PDFDocumentException pde = new PDFDocumentException(222, "PDF table can not created: Image can not loaded");
+ throw pde;
+ }
+ break;
+ case Entry.TYPE_TABLE:
+ Table table = (Table) abstractCell.getValue();
+ // inherit the style from the parent table
+ Style inherit_style = Style.doInherit(table.getStyle(), cell_style);
+ table.setStyle(inherit_style);
+ PdfPTable pdf_table = renderTable(table);
+ pdf_cell = new PdfPCell(pdf_table);
+ break;
+ }
+ return pdf_cell;
+ }
+
+ /**
+ * This method visualize an abstract table into a corresponding pdf table. The
+ * new pdf table is redered and get the style information from the abstract
+ * cell.
+ *
+ * @param abstractTable
+ * the abstract table definition
+ * @return the new redererd pdf table cell
+ * @throws PDFDocumentException
+ * ErrorCode:220, 221, 222, 223
+ * @see com.lowagie.text.pdf.PdfPTable
+ * @see at.knowcenter.wag.egov.egiz.table.Table
+ */
+ private PdfPTable renderTable(Table abstractTable) throws PDFDocumentException
+ {
+ if (abstractTable == null)
+ {
+ PDFDocumentException pde = new PDFDocumentException(223, "Table is not defined.");
+ throw pde;
+ }
+ PdfPTable pdf_table = null;
+ float[] cols = abstractTable.getColsRelativeWith();
+ int max_cols = abstractTable.getMaxCols();
+ if (cols == null)
+ {
+ cols = new float[max_cols];
+ // set the column ratio for all columns to 1
+ for (int cols_idx = 0; cols_idx < cols.length; cols_idx++)
+ {
+ cols[cols_idx] = 1;
+ }
+ }
+ pdf_table = new PdfPTable(cols);
+ pdf_table.setWidthPercentage(abstractTable.getWidth());
+ Style table_style = abstractTable.getStyle();
+ setCellStyle(pdf_table.getDefaultCell(), table_style);
+
+ ArrayList rows = abstractTable.getRows();
+ for (int row_idx = 0; row_idx < rows.size(); row_idx++)
+ {
+ ArrayList row = (ArrayList) rows.get(row_idx);
+ // logger_.debug("## Row:" + row_idx + " ## of table:" +
+ // abstractTable.getName());
+ for (int entry_idx = 0; entry_idx < row.size(); entry_idx++)
+ {
+ Entry cell = (Entry) row.get(entry_idx);
+ Style inherit_style = Style.doInherit(cell.getStyle(), table_style);
+ cell.setStyle(inherit_style);
+ // logger_.debug(cell.toString());
+ PdfPCell pdf_cell = renderCell(cell);
+ if (cell.getColSpan() > 1)
+ {
+ pdf_cell.setColspan(cell.getColSpan());
+ }
+ if (cell.isNoWrap())
+ {
+ pdf_cell.setNoWrap(true);
+ }
+ // System.err.println("valign:" + pdf_cell.getVerticalAlignment() + "
+ // halign:" +
+ // pdf_cell.getHorizontalAlignment());
+ pdf_table.addCell(pdf_cell);
+ }
+ }
+ // logger_.debug("render table:" + abstractTable.getName());
+ return pdf_table;
+ }
+
+ /**
+ * This method creates the pdf table object. It takes the abstract table
+ * definition from the signature object and render the abstract table.
+ *
+ * @param sigObject
+ * the signature object, the base for the abstract table definition
+ * @return R
+ * @throws PDFDocumentException
+ * ErrorCode:220, 221, 222, 223
+ */
+ private PdfPTable createPDFSignatureObject(SignatureObject sigObject) throws PDFDocumentException
+ {
+ Table table = sigObject.getAbstractTable();
+ PdfPTable pdf_table = renderTable(table);
+ return pdf_table;
+ }
+
+ /*
+ * This method search for the table definitions in the settings file an init
+ * @param sigObject
+ */
+ /*
+ * private void initTableSettings(SignatureObject sigObject) { String sig_type =
+ * sigObject.getSignationType(); String table_key = SignatureObject.SIG_OBJ +
+ * sig_type + ".table."; ArrayList main_rows = settings_.getKeys(table_key +
+ * "main"); }
+ */
+
+ /**
+ * Converts the current abstract signature object in a pdf signature object
+ * implementation
+ *
+ * @return the converted pdf signature object
+ * @see at.knowcenter.wag.egov.egiz.pdf.PDFSignatureObject#getSignatureObject()
+ */
+ public Object getSignatureObject() throws PDFDocumentException
+ {
+ if (pdfSigObject_ == null)
+ {
+ pdfSigObject_ = (PdfPTable) getSignatureObject(sigObject_);
+ }
+ return pdfSigObject_;
+ }
+
+ /**
+ * Converts a abstract signature object in a pdf signature object
+ * implementation
+ *
+ * @param sigObject
+ * the abstract signatorObject to convert
+ * @return the converted pdf signature object
+ * @throws PDFDocumentException
+ * @see at.knowcenter.wag.egov.egiz.pdf.PDFSignatureObject#getSignatureObject(at.knowcenter.wag.egov.egiz.sig.SignatureObject)
+ */
+ public Object getSignatureObject(SignatureObject sigObject) throws PDFDocumentException
+ {
+ // initTableSettings(sigObject);
+ return createPDFSignatureObject(sigObject);
+ }
+} \ No newline at end of file
diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/pdf/PDFUtilities.java b/src/main/java/at/knowcenter/wag/egov/egiz/pdf/PDFUtilities.java
new file mode 100644
index 0000000..8fa3b35
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/egov/egiz/pdf/PDFUtilities.java
@@ -0,0 +1,89 @@
+/**
+ * <copyright> Copyright (c) 2006 by Know-Center, Graz, Austria </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+ * NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
+ * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES.
+ *
+ * $Id: PDFUtilities.java,v 1.3 2006/10/31 08:09:33 wprinz Exp $
+ */
+package at.knowcenter.wag.egov.egiz.pdf;
+
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.IOException;
+import java.util.List;
+
+import org.pdfbox.pdfparser.PDFParser;
+import org.pdfbox.pdmodel.PDDocument;
+import org.pdfbox.pdmodel.PDPage;
+
+import at.knowcenter.wag.egov.egiz.cfg.SettingsReader;
+import at.knowcenter.wag.egov.egiz.exceptions.PDFDocumentException;
+
+import com.lowagie.text.DocumentException;
+
+/**
+ * Contains useful helpers for accessing PDF documents.
+ *
+ * @author wprinz
+ */
+public abstract class PDFUtilities
+{
+ public static float calculateLastPageLength(final byte[] pdf) throws PDFDocumentException
+ {
+ try
+ {
+ ByteArrayInputStream original_bais = new ByteArrayInputStream(pdf);
+ byte [] normalized_pdf = TextualSignature.normalizePDF(original_bais);
+
+ ByteArrayInputStream bais = new ByteArrayInputStream(normalized_pdf);
+
+ PDFParser parser = new PDFParser(bais);
+ File temporary_dir = SettingsReader.getTemporaryDirectory();
+ parser.setTempDirectory(temporary_dir);
+ parser.parse();
+
+ PDDocument pdfDocument_ = parser.getPDDocument();
+ float last_page_length = calculateLastPageLength(pdfDocument_);
+ pdfDocument_.close();
+
+ return last_page_length;
+ }
+ catch (IOException e)
+ {
+ throw new PDFDocumentException(201, e);
+ }
+ catch (DocumentException e)
+ {
+ throw new PDFDocumentException(201, e);
+ }
+ }
+
+ public static float calculateLastPageLength(PDDocument document) throws IOException
+ {
+ int last_page_id = document.getNumberOfPages();
+ List allPages = document.getDocumentCatalog().getAllPages();
+ PDPage last_page = (PDPage) allPages.get(last_page_id - 1);
+
+ return calculatePageLength(last_page);
+ }
+
+ public static float calculatePageLength(PDPage page) throws IOException
+ {
+ // logger_.debug("Last Page id:" + last_page_id);
+ // PDPage last_page = (PDPage) allPages.get(0);
+ PDFPage my_page = new PDFPage();
+ my_page.processStream(page, page.findResources(), page.getContents().getStream());
+ return my_page.getMaxPageLength();
+ }
+
+}
diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/pdf/Placeholder.java b/src/main/java/at/knowcenter/wag/egov/egiz/pdf/Placeholder.java
new file mode 100644
index 0000000..b9c3306
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/egov/egiz/pdf/Placeholder.java
@@ -0,0 +1,552 @@
+/**
+ * <copyright> Copyright (c) 2006 by Know-Center, Graz, Austria </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+ * NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
+ * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES.
+ *
+ * $Id: Placeholder.java,v 1.5 2006/10/31 08:17:50 wprinz Exp $
+ */
+package at.knowcenter.wag.egov.egiz.pdf;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.apache.commons.codec.net.URLCodec;
+import org.apache.log4j.Logger;
+
+import at.knowcenter.wag.egov.egiz.cfg.ConfigLogger;
+import at.knowcenter.wag.egov.egiz.exceptions.PDFDocumentException;
+import at.knowcenter.wag.egov.egiz.exceptions.PlaceholderException;
+import at.knowcenter.wag.exactparser.ByteArrayUtils;
+
+/**
+ * Helper class that provides functionality for dealing with placeholders and
+ * replacements in pdf.
+ *
+ * @author wprinz
+ */
+public abstract class Placeholder
+{
+ /**
+ * The logger definition.
+ */
+ private static final Logger logger_ = ConfigLogger.getLogger(Placeholder.class);
+
+ /**
+ * Escapes the String to be a suitable Literal String..
+ *
+ * @param data
+ * The String to be escaped.
+ * @return Returns the escaped PDF String.
+ */
+ public static byte[] escapePDFString(byte[] data)
+ {
+ try
+ {
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ for (int i = 0; i < data.length; i++)
+ {
+ byte[] escaped_bytes = escapeByte(data[i]);
+ baos.write(escaped_bytes);
+ }
+ return baos.toByteArray();
+ }
+ catch (IOException e)
+ {
+ e.printStackTrace();
+ return null;
+ }
+ }
+
+ /**
+ * Unescapes the PDF String.
+ *
+ * @param data
+ * The escaped String.
+ * @return Returns the unescaped String.
+ */
+ public static byte[] unescapePDFString(byte[] data)
+ {
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ for (int i = 0; i < data.length; i++)
+ {
+ if (data[i] == '\\' && data[i + 1] == '\\')
+ {
+ baos.write('\\');
+ i++;
+ continue;
+ }
+ if (data[i] == '\\' && data[i + 1] == '(')
+
+ {
+ baos.write('(');
+ i++;
+ continue;
+ }
+ if (data[i] == '\\' && data[i + 1] == ')')
+ {
+ baos.write(')');
+ i++;
+ continue;
+ }
+ baos.write(data[i]);
+ }
+ return baos.toByteArray();
+ }
+
+ /**
+ * Reconstructs the string from a partition of placeholders.
+ *
+ * @param pdf
+ * The PDF to read the string from.
+ * @param sis
+ * The list of StringInfo objects that specify the bytes of the
+ * string in the pdf.
+ * @return Returns the extracted and reconverted string.
+ * @throws IOException
+ * Forwarded exception.
+ */
+ public static String reconstructStringFromPartition(byte[] pdf, List sis,
+ byte[] enc) throws IOException
+ {
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+
+ Iterator it = sis.iterator();
+ while (it.hasNext())
+ {
+ StringInfo si = (StringInfo) it.next();
+
+ for (int i = si.string_start; i < si.string_start + si.string_length; i++)
+ {
+ if (pdf[i] != 0)
+ {
+ baos.write(pdf[i]);
+ }
+ }
+ }
+
+ baos.close();
+ byte[] bytes = baos.toByteArray();
+
+ byte[] unescaped_bytes = unescapePDFString(bytes);
+
+ if (!ByteArrayUtils.compareByteArrays(enc, 0, BinarySignature.ENCODING_WIN) && !ByteArrayUtils.compareByteArrays(enc, 0, BinarySignature.ENCODING_URL))
+ {
+ String enc_str = new String(enc, "US-ASCII");
+ logger_.warn("The encoding " + enc_str + " is not known by this application - trying to proceed anyways.");
+ }
+
+ String text = new String(unescaped_bytes, "windows-1252");
+
+ String str = text;
+ if (ByteArrayUtils.compareByteArrays(enc, 0, BinarySignature.ENCODING_URL))
+ {
+ str = unapplyURLEncoding(str);
+ }
+
+ return str;
+ }
+
+ /**
+ * Prepares the given String to a byte array that can be substituted into the
+ * placeholder.
+ *
+ * @param text
+ * The text to be prepared for substitution.
+ * @return Returns the prepared byte array.
+ */
+ public static byte[] applyWinAnsiEncoding(String text)
+ {
+ // text = text.replace("\\", "\\\\");
+ // text = text.replace("(", "\\(");
+ // text = text.replace(")", "\\)");
+
+ byte[] replace_bytes;
+ try
+ {
+ replace_bytes = text.getBytes("windows-1252");// CP1252 = WinAnsiEncoding
+
+ // test the opposite way:
+ // String restored_string = new String (replace_bytes, "windows-1252");
+ // if (!restored_string.equals(text))
+ // {
+ // String url_encoded = URLEncoder.encode(text);
+ // replace_bytes = url_encoded.getBytes("windows-1252");
+ // }
+ }
+ catch (UnsupportedEncodingException e)
+ {
+ e.printStackTrace();
+ return null;
+ }
+ return replace_bytes;
+ }
+
+ /**
+ * Unapplies the WinAnsi encoding.
+ *
+ * @param replace_bytes
+ * The bytes.
+ * @return Returns the decoded String.
+ */
+ public static String unapplyWinAnsiEncoding(byte[] replace_bytes)
+ {
+ try
+ {
+ String text = new String(replace_bytes, "windows-1252");
+
+ return text;
+ }
+ catch (UnsupportedEncodingException e)
+ {
+ e.printStackTrace();
+ return null;
+ }
+
+ }
+
+ /**
+ * Applies the URL encoding to the text.
+ *
+ * @param text
+ * The text
+ * @return Returns the URL and WinAnsi encoded text.
+ */
+ public static byte[] applyURLEncoding(String text)
+ {
+ URLCodec utf8_url_codec = new URLCodec("UTF-8");
+ String url_encoded = null;
+ try
+ {
+ url_encoded = utf8_url_codec.encode(text, "UTF-8");
+ }
+ catch (UnsupportedEncodingException e)
+ {
+ throw new RuntimeException("Couldn't url encode : " + text, e);
+ }
+ // String url_encoded = URLEncoder.encode(text);
+ return applyWinAnsiEncoding(url_encoded);
+ }
+
+ /**
+ * Unapplies the WinAnsi and URL encoding.
+ *
+ * @param winansi_str
+ * The Winansi and URL text.
+ * @return Returns the decoded text.
+ */
+ public static String unapplyURLEncoding(String winansi_str)
+ {
+ URLCodec utf8_url_codec = new URLCodec("UTF-8");
+ String url_decoded = null;
+ try
+ {
+ url_decoded = utf8_url_codec.decode(winansi_str, "UTF-8");
+ }
+ catch (Exception e)
+ {
+ throw new RuntimeException("Couldn't url decode : " + winansi_str, e);
+ }
+ // String url_decoded = URLDecoder.decode(winansi_str);
+ return url_decoded;
+ }
+
+ /**
+ * Restores the String from a previously prepared byte array.
+ *
+ * @param pdf_string
+ * The byte array.
+ * @return Returns the unprepared String.
+ */
+ public static String unprepareAndUnescapeString(byte[] pdf_string)
+ {
+ try
+ {
+ String text = new String(pdf_string, "windows-1252");
+
+ // This makes problems when "+" appears.
+ // if (isURLEncoded(text))
+ // {
+ // text = URLDecoder.decode(text);
+ // }
+
+ text = text.replace("\\)", ")");
+ text = text.replace("\\(", "(");
+ text = text.replace("\\\\", "\\");
+
+ return text;
+ }
+ catch (UnsupportedEncodingException e)
+ {
+ e.printStackTrace();
+ return null;
+ }
+ }
+
+ /**
+ * Checks the presence of typical URL encoded characters to tell if the string
+ * is URL encoded.
+ *
+ * <p>
+ * This heuristic checks if there are any non URL encoded characters in the
+ * String, like ASCII control characters, which aren't allowed in the
+ * URLEncoding characterset.
+ * </p>
+ *
+ * @param text
+ * The text under suspicion.
+ * @return Returns true if the String is URL encoded, false otherwise.
+ */
+ protected static boolean isURLEncoded(String text)
+ {
+ if (text.indexOf(' ') >= 0)
+ {
+ return false;
+ }
+ for (int i = 0; i < text.length(); i++)
+ {
+ char c = text.charAt(i);
+ if (0x00 <= c && c <= 0x1f)
+ {
+ return false;
+ }
+ if (c == 0x7F)
+ {
+ return false;
+ }
+ if (0x80 <= c)
+ {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /**
+ * Tells, if a break can occur behind the given character.
+ *
+ * @param character
+ * The character.
+ * @return Returns true, if a break may occur behind the character, false
+ * otherwise.
+ */
+ protected static boolean canBreakAfter(byte character)
+ {
+ return (character == ' ' || character == ',' || character == ';');
+ }
+
+ /**
+ * Scans the given PDF content stream for literal PDF strings.
+ *
+ * @param pdf
+ * The PDF.
+ * @param stream_start
+ * The start of the content stream to be scanned.
+ * @param stream_next
+ * The end of the content stream.
+ * @return Returns a list of StringInfo objects specifying the strings that
+ * could be found.
+ */
+ public static List parseStrings(byte[] pdf, int stream_start, int stream_next)
+ {
+ List strings = new ArrayList();
+ StringInfo cur_string = null;
+ for (int i = stream_start; i < stream_next; i++)
+ {
+ byte cur_byte = pdf[i];
+
+ if (cur_byte == '(' && pdf[i - 1] != '\\')
+ {
+ cur_string = new StringInfo();
+ cur_string.pdf = pdf;
+ cur_string.string_start = i + 1;
+ cur_string.string_length = -1;
+ // logger_.debug("String start = " + cur_string.string_start);
+ continue;
+ }
+ if (cur_byte == ')' && pdf[i - 1] != '\\')
+ {
+ cur_string.string_length = i - cur_string.string_start;
+ // logger_.debug("String length = " + cur_string.string_length);
+ strings.add(cur_string);
+
+ cur_string = null;
+ continue;
+ }
+ }
+
+ return strings;
+ }
+
+ /**
+ * Escapes the data byte if necessary.
+ *
+ * <p>
+ * Before bytes can be written into the pdf Strings, they have to be escaped.
+ * Special care has to be taken that escaped sequences are not split due to
+ * line breaks. This could have fatal consequences and usually renders the
+ * whole document invalid.
+ * </p>
+ *
+ * @param data
+ * The data byte to be escaped.
+ * @return Returns a new byte array escaping the data byte. If the byte needs
+ * not to be escaped, this new array will contain only the original
+ * data byte.
+ */
+ public static byte[] escapeByte(byte data)
+ {
+ if (data == '\\')
+ {
+ return new byte[] { '\\', '\\' };
+ }
+ if (data == '(')
+ {
+ return new byte[] { '\\', '(' };
+ }
+ if (data == ')')
+ {
+ return new byte[] { '\\', ')' };
+ }
+ return new byte[] { data };
+ }
+
+ /**
+ * Replaces the placeholder with the given String breaking lines with a given
+ * tolerance.
+ *
+ * @param pdf
+ * The PDF.
+ * @param sis
+ * The list of StringInfo objects describing the positions where the
+ * String should be filled in.
+ * @param replace_bytes
+ * The unescaped bytes to be filled in. Escaping is performed by this
+ * method.
+ * @param tolerance
+ * The tolerance for line wrapping. The tolerance counts from the end
+ * of a StringInfo backwards to its start. If a word that starts
+ * within the tolerance doesn't fit, it is wrapped into the next
+ * line.
+ * @throws PDFDocumentException
+ * Forwarded exception.
+ */
+ public static void replacePlaceholderWithTolerance(byte[] pdf, List sis,
+ byte[] replace_bytes, int tolerance) throws PDFDocumentException
+ {
+ try
+ {
+ // String rep_str = new String(replace_bytes);
+
+ SplitStrings ss = new SplitStrings(pdf, sis);
+
+ int read_index = 0;
+ while (read_index < replace_bytes.length)
+ {
+ if (!ss.isValidLine())
+ {
+ break;
+ }
+
+ byte[] token = readToken(replace_bytes, read_index);
+ // String token_str = new String(token);
+ byte[] escaped_token = escapeToken(token);
+
+ if (ss.fits(escaped_token))
+ {
+ ss.write(escaped_token);
+ read_index += token.length;
+ continue;
+ }
+ else
+ {
+ if (ss.getAvailable() < tolerance)
+ {
+ ss.newline();
+ continue;
+ }
+ else
+ {
+ // break the token
+ for (; read_index < replace_bytes.length; read_index++)
+ {
+ byte data = replace_bytes[read_index];
+
+ byte[] escaped_data = escapeByte(data);
+
+ if (ss.fits(escaped_data))
+ {
+ ss.write(escaped_data);
+ }
+ else
+ {
+ ss.newline();
+ break;
+ }
+ }
+ continue;
+
+ }
+ }
+ }
+ ss.fillRest();
+
+ if (read_index < replace_bytes.length)
+ {
+ logger_.error("The replace string was longer than the reserved placeholder.");
+ throw new PlaceholderException(null, replace_bytes.length - read_index);
+ }
+
+ }
+ catch (IOException e)
+ {
+ throw new PDFDocumentException(201, e);
+ }
+
+ }
+
+ protected static byte[] readToken(byte[] bytes, int index)
+ {
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ for (; index < bytes.length; index++)
+ {
+ byte data = bytes[index];
+
+ // byte [] escaped_data = escapeByte(data);
+ baos.write(data);
+
+ if (canBreakAfter(data))
+ {
+ break;
+ }
+ }
+
+ return baos.toByteArray();
+ }
+
+ protected static byte[] escapeToken(byte[] token) throws IOException
+ {
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+
+ for (int i = 0; i < token.length; i++)
+ {
+ byte[] escaped_data = escapeByte(token[i]);
+ baos.write(escaped_data);
+ }
+
+ return baos.toByteArray();
+ }
+}
diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/pdf/Pos.java b/src/main/java/at/knowcenter/wag/egov/egiz/pdf/Pos.java
new file mode 100644
index 0000000..4bc1a1a
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/egov/egiz/pdf/Pos.java
@@ -0,0 +1,62 @@
+/**
+ * <copyright> Copyright (c) 2006 by Know-Center, Graz, Austria </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+ * NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
+ * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES.
+ *
+ * $Id: Pos.java,v 1.1 2006/08/25 17:10:08 wprinz Exp $
+ */
+package at.knowcenter.wag.egov.egiz.pdf;
+
+/**
+ * Encapsulation of a position on a PDF page.
+ *
+ * @author wprinz
+ */
+public class Pos
+{
+
+ public float x;
+
+ public float y;
+
+ public float z;
+
+ /**
+ * Default constructor.
+ */
+ public Pos()
+ {
+ }
+
+ /**
+ * Constructor that sets the coordinates.
+ * @param xx
+ * @param yy
+ * @param zz
+ */
+ public Pos(float xx, float yy, float zz)
+ {
+ this.x = xx;
+ this.y = yy;
+ this.z = zz;
+ }
+
+ /**
+ * @see java.lang.Object#toString()
+ */
+ public String toString()
+ {
+ return "(" + this.x + "," + this.y + "," + this.z + ")";
+ }
+
+}
diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/pdf/ReplaceInfo.java b/src/main/java/at/knowcenter/wag/egov/egiz/pdf/ReplaceInfo.java
new file mode 100644
index 0000000..849d224
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/egov/egiz/pdf/ReplaceInfo.java
@@ -0,0 +1,64 @@
+/**
+ * <copyright> Copyright (c) 2006 by Know-Center, Graz, Austria </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+ * NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
+ * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES.
+ *
+ * $Id: ReplaceInfo.java,v 1.1 2006/08/25 17:10:08 wprinz Exp $
+ */
+package at.knowcenter.wag.egov.egiz.pdf;
+
+import java.io.Serializable;
+import java.util.List;
+
+import at.knowcenter.wag.egov.egiz.sig.SignatureFieldDefinition;
+
+/**
+ * Holds the information requeired to replace a certain value in the document
+ * completely.
+ *
+ * @author wprinz
+ */
+public class ReplaceInfo implements Serializable
+{
+
+ /**
+ * SVUID.
+ */
+ private static final long serialVersionUID = 7307210282876750431L;
+
+ /**
+ * The field definition of this value.
+ */
+ public SignatureFieldDefinition sfd = null;
+
+ /**
+ * The value itself.
+ */
+ public String value = null;
+
+ /**
+ * The list of Strings this value must be splitted to.
+ */
+ public List replaces = null;
+
+ /**
+ * The brev of this value.
+ */
+ public byte[] brev = null;
+
+ /**
+ * The encoding of this value.
+ */
+ public byte[] enc = null;
+
+}
diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/pdf/SignatureHolder.java b/src/main/java/at/knowcenter/wag/egov/egiz/pdf/SignatureHolder.java
new file mode 100644
index 0000000..d7fcce9
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/egov/egiz/pdf/SignatureHolder.java
@@ -0,0 +1,62 @@
+/**
+ * <copyright> Copyright (c) 2006 by Know-Center, Graz, Austria </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+ * NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
+ * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES.
+ *
+ * $Id: SignatureHolder.java,v 1.3 2006/10/11 07:57:58 wprinz Exp $
+ */
+package at.knowcenter.wag.egov.egiz.pdf;
+
+import at.knowcenter.wag.egov.egiz.sig.SignatureObject;
+
+/**
+ * Data structure that holds the information of one signature block, which is
+ * the signed/signable text and the corresponding SignatureObject.
+ *
+ * <p>
+ * Signators and Verifiactors should implement own classes for this interface
+ * that generate the text to be signed from the underlying data. For example a
+ * binary signature holder could generate the text to be signed by Base64
+ * encoding the binary data. Furthermore this allows to cache the text to be
+ * signed.
+ * </p>
+ *
+ * @author wprinz
+ */
+public interface SignatureHolder
+{
+
+ /**
+ * Returns the signed text (verification) or the to-be-signed signable text
+ * (signation).
+ *
+ * <p>
+ * Note that this text must be the one that was actually signed. This text is
+ * directly passed to the connector for signation/verification. No
+ * normalization or modification will be / must be done to this text between
+ * reading out from the signature holder and passing the text to the
+ * connector.
+ * </p>
+ *
+ * @return Returns the signed text or the to-be-signed signable text.
+ */
+ public String getSignedText();
+
+ /**
+ *
+ * @return Returns the SignatureObject containing the issuer, serial number,
+ * etc.
+ */
+ public SignatureObject getSignatureObject();
+
+} \ No newline at end of file
diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/pdf/SplitStrings.java b/src/main/java/at/knowcenter/wag/egov/egiz/pdf/SplitStrings.java
new file mode 100644
index 0000000..e3f75f1
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/egov/egiz/pdf/SplitStrings.java
@@ -0,0 +1,162 @@
+/**
+ * <copyright> Copyright (c) 2006 by Know-Center, Graz, Austria </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+ * NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
+ * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES.
+ *
+ * $Id: SplitStrings.java,v 1.1 2006/08/30 14:02:35 wprinz Exp $
+ */
+package at.knowcenter.wag.egov.egiz.pdf;
+
+import java.util.List;
+
+
+/**
+ * Class that helps filling out the placeholders.
+ *
+ * <p>
+ * This class treats a sequence of placeholder StringInfos like a continuous
+ * data area that can be filled out regarding the boundaries.
+ * </p>
+ *
+ * @author wprinz
+ */
+public class SplitStrings
+{
+ /**
+ * The byte used to fill unused bytes in the placeholders.
+ */
+ public static final byte FILL_BYTE = 0;
+
+ /**
+ * The underlying PDF.
+ */
+ protected byte[] pdf = null;
+
+ /**
+ * The strings to be filled out.
+ */
+ protected StringInfo[] strings = null;
+
+ /**
+ * The current string which is written to.
+ */
+ protected int cur_string = 0;
+
+ /**
+ * The current write position within the current string.
+ */
+ protected int cur_pos = 0;
+
+ /**
+ * Constructor.
+ *
+ * @param pdf
+ * The underlying PDF.
+ * @param strings
+ * The strings to be filled out.
+ */
+ public SplitStrings(byte[] pdf, List strings)
+ {
+ this.pdf = pdf;
+ this.strings = new StringInfo[strings.size()];
+ for (int i = 0; i < strings.size(); i++)
+ {
+ StringInfo si = (StringInfo) strings.get(i);
+ this.strings[i] = si;
+ }
+ }
+
+ /**
+ * Returns how many bytes are still available in the current string.
+ *
+ * @return Returns the number of bytes that are still available. (positive
+ * integer, or zero if none are available)
+ */
+ public int getAvailable()
+ {
+ return this.strings[this.cur_string].string_length - this.cur_pos;
+ }
+
+ /**
+ * Tells, if the whole data would fit into the current string.
+ *
+ * @param data
+ * The data to be matched for fitting
+ * @return Returns true, if the whole data fits, false otherwise.
+ */
+ public boolean fits(byte[] data)
+ {
+ return getAvailable() >= data.length;
+ }
+
+ /**
+ * Writes the data into the current string.
+ *
+ * <p>
+ * Note that the data must fit in.
+ * </p>
+ * @param data The data to be written.
+ */
+ public void write(byte[] data)
+ {
+ if (!fits(data))
+ {
+ throw new IllegalArgumentException("The data doesn't fit in.");
+ }
+
+ System.arraycopy(data, 0, pdf, this.strings[this.cur_string].string_start + this.cur_pos, data.length);
+
+ this.cur_pos += data.length;
+ }
+
+ /**
+ * Fills the current string with the fill character and moves on to the next
+ * string.
+ *
+ */
+ public void newline()
+ {
+ int end = this.strings[this.cur_string].string_start + this.strings[this.cur_string].string_length;
+ for (int i = this.strings[this.cur_string].string_start + this.cur_pos; i < end; i++)
+ {
+ pdf[i] = FILL_BYTE;
+ }
+
+ this.cur_string++;
+ this.cur_pos = 0;
+ }
+
+ /**
+ * Fills all rest bytes with the fill character.
+ *
+ * <p>
+ * This should be called when everything is finished to fill all strings properly.
+ * </p>
+ */
+ public void fillRest()
+ {
+ while (this.cur_string < this.strings.length)
+ {
+ newline();
+ }
+ }
+
+ /**
+ * Tells, if the current line is valid.
+ * @return Returns true, if this is a line that can be written to.
+ */
+ public boolean isValidLine ()
+ {
+ return this.cur_string < this.strings.length;
+ }
+}
diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/pdf/StringInfo.java b/src/main/java/at/knowcenter/wag/egov/egiz/pdf/StringInfo.java
new file mode 100644
index 0000000..5933e4b
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/egov/egiz/pdf/StringInfo.java
@@ -0,0 +1,93 @@
+/**
+ * <copyright> Copyright (c) 2006 by Know-Center, Graz, Austria </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+ * NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
+ * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES.
+ *
+ * $Id: StringInfo.java,v 1.2 2006/10/11 07:57:58 wprinz Exp $
+ */
+package at.knowcenter.wag.egov.egiz.pdf;
+
+import java.io.Serializable;
+import java.io.UnsupportedEncodingException;
+
+/**
+ * Specifies a certain data area within the pdf.
+ *
+ * <p>
+ * Actually this is a byte range, which is used to hold the placeholder ranges
+ * for later replacement.
+ * </p>
+ *
+ * @author wprinz
+ */
+public class StringInfo implements Serializable
+{
+ /**
+ * SVUID.
+ */
+ private static final long serialVersionUID = 5834801907046737048L;
+
+ /**
+ * The PDF document this range belongs to.
+ */
+ protected byte[] pdf = null;
+
+ /**
+ * The start offset of the range.
+ */
+ public int string_start = -1;
+
+ /**
+ * The length of the range.
+ */
+ public int string_length = -1;
+
+ /**
+ * Copies the bytes of this range to a new byte array.
+ *
+ * @return Returns the new byte array.
+ */
+ public byte[] copyStringBytes()
+ {
+ byte[] bytes = new byte[this.string_length];
+ System.arraycopy(this.pdf, this.string_start, bytes, 0, this.string_length);
+ return bytes;
+ }
+
+ /**
+ * Converts the range into a String.
+ *
+ * @return Returns the String.
+ * @throws UnsupportedEncodingException
+ * Forwarded exception.
+ */
+ public String getString(String encoding) throws UnsupportedEncodingException
+ {
+ byte[] bytes = copyStringBytes();
+ return new String(bytes, encoding);
+ }
+
+ public String toString()
+ {
+ try
+ {
+ return "(" + this.string_start + "," + this.string_length + ")" + getString("ISO-8859-1");
+ }
+ catch (UnsupportedEncodingException e)
+ {
+ e.printStackTrace();
+ return "(" + this.string_start + "," + this.string_length + ")";
+ }
+ }
+
+}
diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/pdf/TablePos.java b/src/main/java/at/knowcenter/wag/egov/egiz/pdf/TablePos.java
new file mode 100644
index 0000000..ba55cdf
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/egov/egiz/pdf/TablePos.java
@@ -0,0 +1,56 @@
+/**
+ * <copyright> Copyright (c) 2006 by Know-Center, Graz, Austria </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+ * NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
+ * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES.
+ *
+ * $Id: TablePos.java,v 1.1 2006/08/25 17:10:08 wprinz Exp $
+ */
+package at.knowcenter.wag.egov.egiz.pdf;
+
+import java.io.Serializable;
+
+/**
+ * Class that holds the exact position where the table should be written to the
+ * document.
+ *
+ * @author wprinz
+ */
+public class TablePos implements Serializable
+{
+
+ /**
+ * SVUID.
+ */
+ private static final long serialVersionUID = -5299027706623518059L;
+
+ /**
+ * The page on which the block should be displayed.
+ */
+ public int page = 0;
+
+ /**
+ * The x position.
+ */
+ public float pos_x = 0.0f;
+
+ /**
+ * The y position.
+ */
+ public float pos_y = 0.0f;
+
+ /**
+ * The width of the block.
+ */
+ public float width = 0.0f;
+
+}
diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/pdf/TextualSignature.java b/src/main/java/at/knowcenter/wag/egov/egiz/pdf/TextualSignature.java
new file mode 100644
index 0000000..140a6c3
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/egov/egiz/pdf/TextualSignature.java
@@ -0,0 +1,177 @@
+/**
+ * <copyright> Copyright (c) 2006 by Know-Center, Graz, Austria </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+ * NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
+ * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES.
+ *
+ * $Id: TextualSignature.java,v 1.4 2006/10/31 08:12:45 wprinz Exp $
+ */
+package at.knowcenter.wag.egov.egiz.pdf;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+
+import org.pdfbox.pdfparser.PDFParser;
+import org.pdfbox.pdmodel.PDDocument;
+import org.pdfbox.util.PDFTextStripper;
+
+import at.knowcenter.wag.egov.egiz.cfg.SettingsReader;
+import at.knowcenter.wag.egov.egiz.exceptions.PresentableException;
+
+import com.lowagie.text.Document;
+import com.lowagie.text.DocumentException;
+import com.lowagie.text.Rectangle;
+import com.lowagie.text.pdf.PdfContentByte;
+import com.lowagie.text.pdf.PdfImportedPage;
+import com.lowagie.text.pdf.PdfReader;
+import com.lowagie.text.pdf.PdfWriter;
+
+/**
+ * Contains helper function for textual signatures.
+ *
+ * @author wprinz
+ */
+public class TextualSignature
+{
+
+ /**
+ * Extracts the document text from a given pdf.
+ *
+ * @param pdf_stream
+ * The pdf_input stream.
+ * @return Returns the extracted document text.
+ * @throws PresentableException
+ * Forwarded exception.
+ */
+ public static String extractTextTextual(InputStream pdf_stream) throws PresentableException
+ {
+ try
+ {
+ // logger_.debug("====================================================");
+ // logger_.debug("extractText:");
+
+ // For text extraction, create a temporary object with iText just as the
+ // one
+ // created
+ // when being signed, but of course without adding content.
+
+
+ byte[] bytes = normalizePDF(pdf_stream);
+
+ ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
+
+ PDFParser parser = new PDFParser(bais);
+ File temporary_dir = SettingsReader.getTemporaryDirectory();
+ parser.setTempDirectory(temporary_dir);
+ parser.parse();
+
+ PDDocument doc = parser.getPDDocument();
+
+ PDFTextStripper stripper = new PDFTextStripper();
+ stripper.setSortByPosition(false);
+ // stripper.setStartPage(4);
+ // stripper.setEndPage(4);
+ String text = stripper.getText(doc);
+
+ doc.close();
+
+ // logger_.debug("text.length = " + text.length());
+ // logger_.debug("====================================================");
+
+ return text;
+
+ }
+ catch (Exception e)
+ {
+ throw new PresentableException(e);
+ }
+ }
+
+ /**
+ * Normalizes a given binary PDF to a version PDFbox can handle correctly.
+ *
+ * <p>
+ * PDFbox has serious problems with documents that use incremental updates or
+ * XObject forms. Therefor use this to remove incremental updates and create a
+ * streamlined document.
+ * </p>
+ *
+ * <p>
+ * Note that this has nothing to do with text normalization. It just unifies
+ * the PDF documents that are fed into PDFbox for text extraction and page
+ * length determination.
+ * </p>
+ *
+ * @param input_pdf
+ * The input pdf to be normalized.
+ * @return Returns the normalized pdf.
+ * @throws IOException
+ * @throws DocumentException
+ */
+ public static byte[] normalizePDF(InputStream input_pdf) throws IOException, DocumentException
+ {
+ PdfReader reader = new PdfReader(input_pdf);
+
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+
+ // For some reason the Reader -> ImportPage -> Writer mechanism produces
+ // problems en mass.
+ // The text extractor may not be able to extract proper text from
+ // documents
+ // created with
+ // this method (although it works when a Table is appended)... very
+ // fragile.
+
+ Document document = new Document();
+
+ PdfWriter writer = PdfWriter.getInstance(document, baos);
+ document.open();
+
+ PdfContentByte cb = writer.getDirectContent();
+ for (int page_num = 1; page_num <= reader.getNumberOfPages(); page_num++)
+ {
+ Rectangle new_size = reader.getPageSize(page_num);
+ document.setPageSize(new_size);
+ document.newPage();
+
+ PdfImportedPage page = writer.getImportedPage(reader, page_num);
+
+ // note that this will add an xobject form to the doc.
+ // the xobject form contains the content of the page.
+ cb.addTemplate(page, 0, 0);
+
+ // wprinz: debugging
+ // cb.beginText();
+ // cb.setFontAndSize(BaseFont.createFont(BaseFont.HELVETICA,
+ // BaseFont.CP1252, BaseFont.NOT_EMBEDDED), 14);
+ // cb.showText("page " + page_num);
+ // cb.endText();
+ // wprinz: end debugging
+ }
+
+ document.close();
+
+ // for (int i = 1; i <= reader.getNumberOfPages(); i++)
+ // {
+ // Rectangle rect = reader.getBoxSize(i, "bleed");
+ // logger_.debug("rect[" + i + "] = " + rect);
+ // }
+
+ baos.close();
+ byte[] normalizedPDF = baos.toByteArray();
+
+ return normalizedPDF;
+ }
+}
diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/pdf/TextualSignatureHolder.java b/src/main/java/at/knowcenter/wag/egov/egiz/pdf/TextualSignatureHolder.java
new file mode 100644
index 0000000..fd56125
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/egov/egiz/pdf/TextualSignatureHolder.java
@@ -0,0 +1,73 @@
+/**
+ * <copyright> Copyright (c) 2006 by Know-Center, Graz, Austria </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+ * NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
+ * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES.
+ *
+ * $Id: TextualSignatureHolder.java,v 1.1 2006/10/11 07:58:17 wprinz Exp $
+ */
+package at.knowcenter.wag.egov.egiz.pdf;
+
+import java.io.Serializable;
+
+import at.knowcenter.wag.egov.egiz.sig.SignatureObject;
+
+/**
+ * Data structure that holds the information of one signature block, which is
+ * the signed/signable text and the corresponding SignatureObject.
+ *
+ * @author wprinz
+ */
+public class TextualSignatureHolder implements Serializable, SignatureHolder
+{
+
+ /**
+ * SVUID.
+ */
+ private static final long serialVersionUID = -7208103904479272760L;
+
+ /**
+ * The signed text of this object.
+ *
+ * <p>
+ * This is the value that will be signed by the Connector.
+ * </p>
+ */
+ private String signed_text = null;
+
+ /**
+ * The signature object.
+ */
+ private SignatureObject signature_object = null;
+
+ public TextualSignatureHolder(String text, SignatureObject so)
+ {
+ this.signed_text = text;
+ this.signature_object = so;
+ }
+
+ /**
+ * @see at.knowcenter.wag.egov.egiz.pdf.SignatureHolder#getSignedText()
+ */
+ public String getSignedText()
+ {
+ return this.signed_text;
+ }
+
+ /**
+ * @see at.knowcenter.wag.egov.egiz.pdf.SignatureHolder#getSignatureObject()
+ */
+ public SignatureObject getSignatureObject()
+ {
+ return this.signature_object;
+ }
+}
diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/pdf/Utils.java b/src/main/java/at/knowcenter/wag/egov/egiz/pdf/Utils.java
new file mode 100644
index 0000000..c075d45
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/egov/egiz/pdf/Utils.java
@@ -0,0 +1,96 @@
+/**
+ * <copyright> Copyright (c) 2006 by Know-Center, Graz, Austria </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+ * NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
+ * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES.
+ *
+ * $Id: Utils.java,v 1.3 2006/10/31 08:13:02 wprinz Exp $
+ */
+package at.knowcenter.wag.egov.egiz.pdf;
+
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+
+/**
+ * Abstract class that contains helpful utility functions used by the digital
+ * signatures.
+ *
+ * @author wprinz
+ */
+public abstract class Utils
+{
+
+ /**
+ * Extracts the pure content text from a given content stream.
+ *
+ * <p>
+ * The pure content text is just an assembly of all strings that occur within the content stream in
+ * stream order.
+ * Each of these strings will be set on a new line.
+ * </p>
+ *
+ * @param stream_bytes The content stream.
+ * @return Returns the extracted string.
+ * @throws IOException Forwarded exception.
+ */
+ public static String extractPureTextFromContentStream(
+ final byte[] stream_bytes) throws IOException
+ {
+
+ // logger_.debug("stream_bytes:");
+ // logger_.debug(new String(stream_bytes, "US-ASCII"));
+ // logger_.debug(":end of stream_bytes");
+
+ final byte OPEN = '(';
+ final byte CLOSE = ')';
+
+ StringWriter strwrtr = new StringWriter();
+ PrintWriter printer = new PrintWriter(strwrtr);
+ int open_index = -1;
+ int close_index = -1;
+ for (int i = 0; i < stream_bytes.length; i++)
+ {
+ if (stream_bytes[i] == OPEN)
+ {
+ open_index = i;
+ continue;
+ }
+ if (stream_bytes[i] == CLOSE)
+ {
+ close_index = i;
+
+ // logger_.debug("open = " + open_index + ", close = " +
+ // close_index);
+
+ int len = close_index - open_index - 1;
+ // logger_.debug("len = " + len);
+
+ byte[] bytes = new byte[len];
+ System.arraycopy(stream_bytes, open_index + 1, bytes, 0, len);
+
+ String str = new String(bytes, "ISO-8859-1");
+ // logger_.debug("string = " + str);
+
+ printer.println(str);
+
+ continue;
+ }
+ }
+ strwrtr.close();
+ String signature_text = new String(strwrtr.getBuffer());
+ // logger_.debug(signature_text);
+
+ return signature_text;
+ }
+
+}
diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/sig/Connector.java b/src/main/java/at/knowcenter/wag/egov/egiz/sig/Connector.java
new file mode 100644
index 0000000..a3d8128
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/egov/egiz/sig/Connector.java
@@ -0,0 +1,59 @@
+/**
+ * <copyright> Copyright (c) 2006 by Know-Center, Graz, Austria </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+ * NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
+ * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES.
+ *
+ * $Id: Connector.java,v 1.3 2006/10/11 07:54:03 wprinz Exp $
+ */
+package at.knowcenter.wag.egov.egiz.sig;
+
+import at.knowcenter.wag.egov.egiz.exceptions.SignatureException;
+
+/**
+ * The basic interface for all connectors.
+ *
+ * @author wprinz
+ */
+public interface Connector
+{
+
+ /**
+ * Performs a sign.
+ *
+ * @param sig_type
+ * The signature type/profile.
+ * @param user_name
+ * The user name for user logging.
+ * @param text_to_sign
+ * The text to be signed.
+ * @return Returns the signed SignatureObject.
+ * @throws SignatureException
+ * F.e.
+ */
+ public SignatureObject doSign(String sig_type, String user_name,
+ String text_to_sign) throws SignatureException;
+
+ /**
+ * Performs a verify.
+ *
+ * @param signed_text
+ * The signed text to be verified.
+ * @param sig_obj
+ * The Signature object.
+ * @return Returns the SignatureResponse.
+ * @throws SignatureException
+ * F.e.
+ */
+ public SignatureResponse doVerify(String signed_text, SignatureObject sig_obj) throws SignatureException;
+
+}
diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/sig/ConnectorFactory.java b/src/main/java/at/knowcenter/wag/egov/egiz/sig/ConnectorFactory.java
new file mode 100644
index 0000000..f24f3a5
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/egov/egiz/sig/ConnectorFactory.java
@@ -0,0 +1,326 @@
+/**
+ * <copyright> Copyright (c) 2006 by Know-Center, Graz, Austria </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+ * NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
+ * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES.
+ *
+ * $Id: ConnectorFactory.java,v 1.4 2006/10/31 08:18:12 wprinz Exp $
+ */
+package at.knowcenter.wag.egov.egiz.sig;
+
+import java.lang.reflect.Field;
+
+import org.apache.log4j.Logger;
+
+import at.knowcenter.wag.egov.egiz.cfg.ConfigLogger;
+import at.knowcenter.wag.egov.egiz.cfg.SettingsReader;
+import at.knowcenter.wag.egov.egiz.exceptions.ConnectorFactoryException;
+import at.knowcenter.wag.egov.egiz.exceptions.SettingsException;
+import at.knowcenter.wag.egov.egiz.sig.connectors.A1Connector;
+import at.knowcenter.wag.egov.egiz.sig.connectors.BKUConnector;
+import at.knowcenter.wag.egov.egiz.sig.connectors.ConnectorConfigurationKeys;
+import at.knowcenter.wag.egov.egiz.sig.connectors.MOAConnector;
+
+/**
+ * This is a factory for creating the appropriate connector according to the
+ * connector identifier.
+ *
+ * @see at.knowcenter.wag.egov.egiz.sig.ConnectorInformation
+ * @author wprinz
+ */
+public abstract class ConnectorFactory
+{
+ /**
+ * The name of the field that holds the Connector implementation's unique
+ * identifier.
+ *
+ * <p>
+ * This must be a public static final String on the Connector implementation
+ * class.
+ * </p>
+ */
+ protected static final String CONNECTOR_INFORMATION_FIELD_NAME = "CONNECTOR_INFORMATION";
+
+ /**
+ * The list of available Connector implementations.
+ *
+ * <p>
+ * Note that this could also be generated dynamically from a config file,
+ * preferably enveloped by a Singleton.
+ * </p>
+ */
+ protected static Class[] AVAILABLE_CONNECTORS = { MOAConnector.class,
+ BKUConnector.class, A1Connector.class };
+
+ /**
+ * The logger definition.
+ */
+ private static final Logger logger_ = ConfigLogger.getLogger(ConnectorFactory.class);
+
+ /**
+ * Retrieves the ConnectorInformation from the connector Class.
+ *
+ * @param connector_class
+ * The connector Class.
+ * @return Returns the ConnectorInformation.
+ * @throws IllegalArgumentException
+ * F.e.
+ * @throws IllegalAccessException
+ * F.e.
+ * @throws SecurityException
+ * F.e.
+ * @throws NoSuchFieldException
+ * F.e.
+ */
+ protected static ConnectorInformation getConnectorInformationFromClass(
+ Class connector_class) throws IllegalArgumentException, IllegalAccessException, SecurityException, NoSuchFieldException
+ {
+ Field type_field = connector_class.getField(CONNECTOR_INFORMATION_FIELD_NAME);
+ ConnectorInformation connector_information = (ConnectorInformation) type_field.get(null);
+ return connector_information;
+ }
+
+ /**
+ * Gathers the ConnectorInformation objects of all registered connectors.
+ *
+ * <p>
+ * This is used by the user interface to provide a list of all available
+ * connectors.
+ * </p>
+ *
+ * @return Returns the ConnectorInformation objects.
+ * @throws ConnectorFactoryException
+ * F.e.
+ */
+ public static ConnectorInformation[] getConnectorInformationArray() throws ConnectorFactoryException
+ {
+ ConnectorInformation[] coninf = new ConnectorInformation[AVAILABLE_CONNECTORS.length];
+
+ for (int i = 0; i < coninf.length; i++)
+ {
+ try
+ {
+ coninf[i] = getConnectorInformationFromClass(AVAILABLE_CONNECTORS[i]);
+ }
+ catch (Exception e)
+ {
+ throw new ConnectorFactoryException(e);
+ }
+ }
+
+ return coninf;
+ }
+
+ /**
+ * Retrieves the connector Class belonging to the connector id.
+ *
+ * @param connector_identifier
+ * The connector id.
+ * @return Returns the corresponding connector class.
+ * @throws ConnectorFactoryException
+ * Thrown, if the id is invalid.
+ */
+ protected static Class getConnectorClass(String connector_identifier) throws ConnectorFactoryException
+ {
+ ConnectorInformation[] conids = getConnectorInformationArray();
+ for (int i = 0; i < conids.length; i++)
+ {
+ String connector_id = conids[i].getIdentifier();
+
+ if (connector_id.equals(connector_identifier))
+ {
+ Class conn_class = AVAILABLE_CONNECTORS[i];
+
+ return conn_class;
+ }
+ }
+
+ throw new ConnectorFactoryException("The connector '" + connector_identifier + "' couldn't be found in the list of available connectors.");
+ }
+
+ /**
+ * Creates a new connector given by the connector_identifier.
+ *
+ * @param connector_identifier
+ * The connector identifier of the new connector.
+ * @return Returns the new connector.
+ * @throws ConnectorFactoryException
+ * F.e.
+ */
+ public static Connector createConnector(String connector_identifier) throws ConnectorFactoryException
+ {
+
+ Class conn_class = getConnectorClass(connector_identifier);
+
+ try
+ {
+ Connector connector_obj = (Connector) conn_class.newInstance();
+ return connector_obj;
+ }
+ catch (Exception e)
+ {
+ throw new ConnectorFactoryException(e);
+ }
+ }
+
+ /**
+ * Tells, if the given connector identifier is valid.
+ *
+ * @param connector_identifier
+ * The connector identifier.
+ * @return Returns true, if the identifier is valid, false otherwise.
+ * @throws ConnectorFactoryException
+ * F.e.
+ */
+ public static boolean isValidConnectorIdentifier(String connector_identifier) throws ConnectorFactoryException
+ {
+ ConnectorInformation[] conids = getConnectorInformationArray();
+ for (int i = 0; i < conids.length; i++)
+ {
+ if (conids[i].getIdentifier().equals(connector_identifier))
+ {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Retrieves the availability of the connector from the flags specified in the
+ * config file.
+ *
+ * @param connector_identifier
+ * The connector.
+ * @param availability_key
+ * The key of the availability flag to be retrieved.
+ * @param default_value
+ * The default value to be used if the flag is not set in the config
+ * file.
+ * @return Returns true, if the flag was set to true, false, if the flag was
+ * set otherwise, or the default_value if the flag wasn't set at all.
+ * @throws ConnectorFactoryException
+ * Thrown, if the connector is invalid.
+ */
+ protected static boolean getAvailabilityUsingDefault(String connector_identifier,
+ String availability_key, boolean default_value) throws ConnectorFactoryException
+ {
+ if (!isValidConnectorIdentifier(connector_identifier))
+ {
+ throw new ConnectorFactoryException("The connector '" + connector_identifier + "' couldn't be found in the list of available connectors.");
+ }
+
+ SettingsReader settings_ = null;
+ try
+ {
+ settings_ = SettingsReader.getInstance();
+ }
+ catch (SettingsException e)
+ {
+ String log_message = "Can not load signature settings. Cause:\n" + e.getMessage();
+ logger_.error(log_message);
+ throw new RuntimeException(e);
+ }
+
+ String value = settings_.getValueFromKey(connector_identifier + "." + availability_key);
+ if (value == null)
+ {
+ return default_value;
+ }
+ return value.equals("true");
+ }
+
+ /**
+ * Tells, if the connector is available for being used in the Commandline
+ * (synchron) environment.
+ *
+ * <p>
+ * A connector is available for commandline processing if it requires no
+ * active user interaction for being executed or if it handles the user
+ * interaction itself.
+ * </p>
+ * <p>
+ * A commandline connector is executed synchronously. The client waits until
+ * the Connector has finished.
+ * </p>
+ * <p>
+ * Usually a synchron connector can also be used in a web environment.
+ * </p>
+ * <p>
+ * Examples for commandline connectors are: MOA, BKU. A1 is not suitible for
+ * commandline because it requires HTTP/HTML interaction, log in, etc.
+ * </p>
+ *
+ * @return Returns true, if the Connector is available for Commandline
+ * processing.
+ */
+ public static boolean isAvailableForCommandline(String connector_identifier) throws ConnectorFactoryException
+ {
+ return getAvailabilityUsingDefault(connector_identifier, ConnectorConfigurationKeys.AVAILABLE_FOR_COMMANDLINE, false);
+ }
+
+ /**
+ * Tells, if the Connector is available for being used in a Web (asynchron,
+ * local) environment.
+ *
+ * <p>
+ * A connector is available for Web if it can be used in a web environment.
+ * Often a web connector is also a local connector.
+ * </p>
+ * <p>
+ * Typical examples are the local BKU and A1. The later requires HTML log in
+ * and session handling.
+ * </p>
+ *
+ * @return Returns true, if the Connector is available for the Web
+ * application.
+ */
+ public static boolean isAvailableForWeb(String connector_identifier) throws ConnectorFactoryException
+ {
+ return getAvailabilityUsingDefault(connector_identifier, ConnectorConfigurationKeys.AVAILABLE_FOR_WEB, false);
+ }
+
+ /**
+ * Tells, if the given connector is local.
+ *
+ * @param connector_identifier
+ * The connector.
+ * @return Returns true, if the given connector is local, false otherwise.
+ * @throws ConnectorFactoryException
+ * F.e.
+ */
+ public static boolean isConnectorLocal(String connector_identifier) throws ConnectorFactoryException
+ {
+ return connector_identifier.equals("bku") || connector_identifier.equals("a1");
+ }
+
+ /**
+ * Tells, if the given connector needs or produces SIG_IDs.
+ *
+ * <p>
+ * This method is used when pre formatted signature blocks have to be created
+ * that have to know if there will be a SIG_ID field or not.
+ * </p>
+ * <p>
+ * Connectors like BKU produce SIG_IDs when signing that are needed when
+ * verifying.
+ * </p>
+ *
+ * @param connector
+ * The connector.
+ * @return Returns true, if the given connector uses SIG_IDs, false otherwise.
+ */
+ public static boolean needsSIG_ID(String connector)
+ {
+ return !connector.equals("moa");
+ }
+
+}
diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/sig/ConnectorInformation.java b/src/main/java/at/knowcenter/wag/egov/egiz/sig/ConnectorInformation.java
new file mode 100644
index 0000000..5855fec
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/egov/egiz/sig/ConnectorInformation.java
@@ -0,0 +1,89 @@
+/**
+ * <copyright> Copyright (c) 2006 by Know-Center, Graz, Austria </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+ * NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
+ * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES.
+ *
+ * $Id: ConnectorInformation.java,v 1.2 2006/08/25 17:09:41 wprinz Exp $
+ */
+package at.knowcenter.wag.egov.egiz.sig;
+
+import java.io.Serializable;
+
+/**
+ * Holds the information of one connectior.
+ *
+ * <p>
+ * An implementation of the Connector interface must provide a public static
+ * final ConnectorInformation field named
+ * ConnectorFactory#CONNECTOR_INFORMATION_FIELD_NAME that provides the
+ * information about this connector to the system.
+ * </p>
+ *
+ * @see at.knowcenter.wag.egov.egiz.sig.ConnectorFactory
+ *
+ * @author wprinz
+ */
+public class ConnectorInformation implements Serializable
+{
+ /**
+ * SVUID.
+ */
+ private static final long serialVersionUID = 5692836392376853268L;
+
+ /**
+ * The short identifier of the connector (e.g. "bku").
+ */
+ protected String connector_identifiert = null;
+
+ /**
+ * The user suitable description of the connector (e.g.
+ * "B&uuml;rgerkartenumgebung").
+ */
+ protected String connector_description = null;
+
+ /**
+ * Constructor that initializes this object.
+ *
+ * @param identifier
+ * The short identifier of the connector (e.g. "bku").
+ * @param description
+ * The user suitable description of the connector (e.g.
+ * "B&uuml;rgerkartenumgebung").
+ */
+ public ConnectorInformation(String identifier, String description)
+ {
+ this.connector_identifiert = identifier;
+ this.connector_description = description;
+ }
+
+ /**
+ * Returns the identifier of this connector.
+ *
+ * @return Returns the identifier of this connector.
+ */
+ public String getIdentifier()
+ {
+ return this.connector_identifiert;
+ }
+
+ /**
+ * Returns the description if this connector.
+ *
+ * @return Returns the description if this connector.
+ */
+ public String getDescription()
+ {
+ return this.connector_description;
+ }
+
+}
diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/sig/DummyLDAPAPI.java b/src/main/java/at/knowcenter/wag/egov/egiz/sig/DummyLDAPAPI.java
new file mode 100644
index 0000000..7e0834e
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/egov/egiz/sig/DummyLDAPAPI.java
@@ -0,0 +1,70 @@
+/**
+ * <copyright> Copyright (c) 2006 by Know-Center, Graz, Austria </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+ * NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
+ * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES.
+ *
+ * $Id: DummyLDAPAPI.java,v 1.3 2006/10/31 08:18:56 wprinz Exp $
+ */
+package at.knowcenter.wag.egov.egiz.sig;
+
+import java.io.File;
+import java.io.FileInputStream;
+
+import at.knowcenter.wag.egov.egiz.cfg.SettingsReader;
+
+/**
+ * This is just a dummy implementation until the real Egiz LDAP API is
+ * implemented.
+ *
+ * @author wprinz
+ */
+public class DummyLDAPAPI
+{
+ String url_ = null;
+
+ public DummyLDAPAPI(String url)
+ {
+ this.url_ = url;
+ }
+
+ public String getURL()
+ {
+ return this.url_;
+ }
+
+ public byte[] loadCertificateFromLDAP(String serial_number, String issuer)
+ {
+ //logger.debug("LDAP: serial_number = " + serial_number);
+ //logger.debug("LDAP: issuer = " + issuer);
+
+ byte[] data = null;
+ if (serial_number.equals("153868") && issuer.equals("CN=a-sign-TEST-Premium-Sig-01,OU=a-sign-TEST-Premium-Sig-01,O=A-Trust Ges. f. Sicherheitssysteme im elektr. Datenverkehr GmbH,C=AT"))
+ {
+ try
+ {
+ File test_file = new File(SettingsReader.CERT_PATH + File.separator + "ldap_test_cert.der");
+ data = new byte[(int) test_file.length()];
+ FileInputStream fis = new FileInputStream(test_file);
+ fis.read(data);
+ fis.close();
+ }
+ catch (Exception e)
+ {
+ e.printStackTrace();
+ data = null;
+ }
+ }
+
+ return data;
+ }
+}
diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/sig/LocalConnector.java b/src/main/java/at/knowcenter/wag/egov/egiz/sig/LocalConnector.java
new file mode 100644
index 0000000..13e0b65
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/egov/egiz/sig/LocalConnector.java
@@ -0,0 +1,117 @@
+/**
+ * <copyright> Copyright (c) 2006 by Know-Center, Graz, Austria </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+ * NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
+ * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES.
+ *
+ * $Id: LocalConnector.java,v 1.2 2006/08/25 17:09:41 wprinz Exp $
+ */
+package at.knowcenter.wag.egov.egiz.sig;
+
+import at.knowcenter.wag.egov.egiz.exceptions.SignatureException;
+
+/**
+ * A local connector is a refinement of a "normal" Connector that allows to
+ * explicitely do the request on a local client.
+ *
+ * <p>
+ * Basically the sign and verify procedures of this connector are split into
+ * three groups:
+ * </p>
+ * <ol>
+ * <li>Prepare the request to the local service.</li>
+ * <li>Carry out the request on the local client.</li>
+ * <li>Analyze the response from the local client.</li>
+ * </ol>
+ * <p>
+ * Usually the preparation and the analyzation are carried out on the server,
+ * whereas the connection to the local service is made from the local client.
+ * </p>
+ *
+ * @author wprinz
+ */
+public interface LocalConnector extends Connector
+{
+ /**
+ * Prepares the sign request string.
+ *
+ * @param user_name
+ * The user name.
+ * @param sign_text
+ * The text to be signed.
+ * @param signature_type
+ * The type of the signature.
+ * @return Returns the request string to be sent to the local service.
+ * @throws SignatureException
+ * F.e.
+ */
+ public String prepareSignRequest(String user_name, String sign_text,
+ String signature_type) throws SignatureException;
+
+ /**
+ * Prepares the verify request string.
+ *
+ * @param signed_text
+ * The signed text to be verified.
+ * @param signature_object
+ * The SignatureObject.
+ * @return Returns the request string.
+ * @throws SignatureException
+ * F.e.
+ */
+ public String prepareVerifyRequest(String signed_text,
+ SignatureObject signature_object) throws SignatureException;
+
+ /**
+ * Analyzes the sign response string.
+ *
+ * @param response_string
+ * The response string from the local service.
+ * @param signature_type
+ * The type of the signature.
+ * @return Returns the SignatureObject of the sign request.
+ * @throws SignatureException
+ * F.e.
+ */
+ public SignatureObject analyzeSignResponse(String response_string,
+ String signature_type) throws SignatureException;
+
+ /**
+ * Analyzes the verify response string.
+ *
+ * @param response_string
+ * The response string from the local service.
+ * @return Returns the SignatureResponse of the verify request.
+ * @throws SignatureException
+ * F.e.
+ */
+ public SignatureResponse analyzeVerifyResponse(String response_string) throws SignatureException;
+
+ /**
+ * Returns the sign URL of the local service.
+ *
+ * @param profile
+ * The signature type the URL should be retrieved from.
+ * @return Returns the sign URL of the local service.
+ */
+ public String getSignURL(String profile);
+
+ /**
+ * Returns the verify URL of the local service.
+ *
+ * @param profile
+ * The signature type the URL should be retrieved from.
+ * @return Returns the verify URL of the local service.
+ */
+ public String getVerifyURL(String profile);
+
+}
diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/sig/SignatureBlock.java b/src/main/java/at/knowcenter/wag/egov/egiz/sig/SignatureBlock.java
new file mode 100644
index 0000000..1902458
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/egov/egiz/sig/SignatureBlock.java
@@ -0,0 +1,306 @@
+/*
+ * <copyright> Copyright (c) 2006 by Know-Center, Graz, Austria </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+ * NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
+ * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES.
+ *
+ * $Id: SignatureBlock.java,v 1.4 2006/10/31 08:18:56 wprinz Exp $
+ */
+package at.knowcenter.wag.egov.egiz.sig;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Vector;
+
+import at.knowcenter.wag.egov.egiz.exceptions.SignatureException;
+import at.knowcenter.wag.egov.egiz.exceptions.SignatureTypesException;
+
+/**
+ * This method is to analyse a signature block string. It searches for
+ * configured signature types while compairing defined key words with the text.
+ *
+ * @author wlackner
+ */
+public class SignatureBlock
+{
+
+ /**
+ * Start index of the signature block text.
+ */
+ private int startIndex_ = -1;
+
+ /**
+ * End index of the signature block text.
+ */
+ private int endIndex_ = -1;
+
+ /**
+ * The type of the signature block.
+ */
+ private String type_ = null;
+
+ /**
+ * The signature type definition object.
+ */
+ private SignatureTypeDefinition sigTypeDef_ = null;
+
+ /**
+ * The signature block string.
+ */
+ private String signatureString_ = null;
+
+ /**
+ * The signature object build by the signature string using the signture
+ * definition.
+ */
+ private SignatureObject signatureObject_ = null;
+
+ /**
+ * A list of configured signature types.
+ */
+ List signatureTypes_ = null;
+
+ /**
+ * A list of found keys in the signature block string.
+ */
+ Map foundKeys_ = new HashMap();
+
+ int maxSize_ = -1;
+
+ /**
+ * The default constructor to analyse a signature block string. It uses a
+ * predefined signature type list to assign the text block to signature type.
+ * The analyse method have to be call separately -->
+ * separateBlockFromRawText()
+ *
+ * @param signatureTypes
+ */
+ public SignatureBlock(List signatureTypes)
+ {
+ signatureTypes_ = signatureTypes;
+ }
+
+ /**
+ * This method checks if all required keys are found in the signature block
+ * string.
+ *
+ * @param foundKeys
+ * the keys that are found in the singnature block string
+ * @return true if all required keys are found, false otherwise
+ */
+ private boolean checkRequiredFields(Map foundKeys)
+ {
+ String[] req_keys = SignatureTypes.REQUIRED_SIG_KEYS;
+ for (int req_idx = 0; req_idx < req_keys.length; req_idx++)
+ {
+ String key = req_keys[req_idx];
+ // SIG_ID could be optional --> only set in BKU signed documents
+ if (key.equals(SignatureTypes.SIG_ID))
+ {
+ continue;
+ }
+ // logger.debug("check:" + key + "=" + foundKeys.get(key));
+ if (foundKeys.get(key) == null)
+ {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /**
+ * This method is the base method to analyse a raw text separating a signature
+ * block string from the raw text. It searches for corresponding signature
+ * types from back to front in the raw text. Therefore a revert list of
+ * multiple signations can be extracted calling this method more than one
+ * times. The method extracts the start and end postition of a found signature
+ * block and extracts all keys used in that block. If all required fields are
+ * found a successful separation is done and can be access calling the method
+ * getStartIndex, getEndIndex, getType, getSignatureObject.
+ *
+ * @param rawText
+ * the raw text to separate a signature block from
+ * @return true if a separation has done successful false if no signature
+ * block can be found
+ */
+ public boolean separateBlockFromRawText(String rawText, boolean old_style)
+ {
+ endIndex_ = rawText.length();
+ boolean found_type = false;
+ for (int sig_type_idx = 0; sig_type_idx < signatureTypes_.size(); sig_type_idx++)
+ {
+ int last_index = endIndex_;
+ SignatureTypeDefinition sig_type_def = (SignatureTypeDefinition) signatureTypes_.get(sig_type_idx);
+ //logger.debug("Try sep type:" + sig_type_def.getType());
+
+ Vector keys = sig_type_def.getRevertSortedKeys();
+ Vector captions = sig_type_def.getRevertSortedCaptions();
+ Map found_keys = new HashMap();
+ for (int key_idx = 0; key_idx < keys.size(); key_idx++)
+ {
+ String key = (String) keys.get(key_idx);
+ if (old_style && key.equals(SignatureTypes.SIG_KZ))
+ {
+ // If separating the old style way - skip The "Kennzeichnung"
+ // key, because it wasn't present in old profiles.
+ continue;
+ }
+ String caption = (String) captions.get(key_idx);
+ int found_idx = rawText.lastIndexOf(caption);
+ //logger.debug("Try find:" + sig_type_def.getType() + "." + key + "." + caption + " at=" + found_idx);
+ if (found_idx >= 0 && found_idx < last_index)
+ {
+ if (key.equals(SignatureTypes.SIG_ID))
+ {
+ //logger.debug("store SIG_ID, but don't decrease last index:" + sig_type_def.getType() + "." + key + "." + caption + " at=" + found_idx);
+ found_keys.put(key, new Integer(found_idx));
+ // don't decrease last index as SIG_ID is not necessarily persistent
+ }
+ else
+ {
+ //logger.debug("store:" + sig_type_def.getType() + "." + key + "." + caption + " at=" + found_idx);
+ found_keys.put(key, new Integer(found_idx));
+ last_index = found_idx;
+ }
+ }
+ }
+ if (checkRequiredFields(found_keys) && found_keys.size() > maxSize_)
+ {
+ foundKeys_ = found_keys;
+ sigTypeDef_ = sig_type_def;
+ type_ = sig_type_def.getType();
+ startIndex_ = last_index;
+ signatureString_ = rawText.substring(startIndex_, endIndex_);
+ maxSize_ = found_keys.size();
+ found_type = true;
+ }
+ }
+ return found_type;
+ }
+
+ /**
+ * @return Returns the endIndex.
+ */
+ public int getEndIndex()
+ {
+ return endIndex_;
+ }
+
+ /**
+ * @return Returns the signatureObject of the separated signature block.
+ * @throws SignatureException
+ */
+ public SignatureObject getSignatureObject() throws SignatureException
+ {
+ if (signatureObject_ == null && foundKeys_ != null)
+ {
+ signatureObject_ = new SignatureObject();
+ try
+ {
+ signatureObject_.setSigType(type_);
+ signatureObject_.initByType();
+ }
+ catch (SignatureTypesException e)
+ {
+ SignatureException se = new SignatureException(101, "Can ot set signation type:" + type_, e);
+ throw se;
+ }
+ String sig_text = signatureString_;
+ Vector revert_keys = sigTypeDef_.getRevertSortedKeys();
+ Vector revert_captions = sigTypeDef_.getRevertSortedCaptions();
+ for (int key_idx = 0; key_idx < revert_keys.size(); key_idx++)
+ {
+ String key = (String) revert_keys.get(key_idx);
+ String caption = (String) revert_captions.get(key_idx);
+ int start_idx = sig_text.lastIndexOf(caption);
+ if (start_idx >= 0)
+ {
+ int sep_idx = start_idx + caption.length();
+ // logger.debug(sig_text);
+ // logger.debug("caption:" + caption + " start_idx:" + start_idx
+ // + " length:" +
+ // sig_text.length());
+ String value = sig_text.substring(sep_idx);
+ // logger.debug("key:" + key + " value:" + value);
+ signatureObject_.setSigValueCaption(key, value, caption);
+ sig_text = sig_text.substring(0, start_idx);
+ }
+ }
+ }
+ return signatureObject_;
+ }
+
+ /**
+ * @return Returns the startIndex.
+ */
+ public int getStartIndex()
+ {
+ return startIndex_;
+ }
+
+ /**
+ * @return Returns the type.
+ */
+ public String getType()
+ {
+ return type_;
+ }
+
+// /**
+// * @param endIndex
+// * The endIndex to set.
+// */
+// private void setEndIndex(int endIndex)
+// {
+// endIndex_ = endIndex;
+// }
+//
+// /**
+// * @param startIndex
+// * The startIndex to set.
+// */
+// private void setStartIndex(int startIndex)
+// {
+// startIndex_ = startIndex;
+// }
+//
+// /**
+// * @param type
+// * The type to set.
+// */
+// private void setType(String type)
+// {
+// type_ = type;
+// }
+
+ /**
+ * The standard toString method. Used for interal tests only.
+ */
+ public String toString()
+ {
+ String strg = "";
+ strg += "Type:" + type_ + "\n";
+ strg += "Start index:" + startIndex_ + "\n";
+ strg += "End index:" + endIndex_ + "\n";
+ strg += signatureString_ + "\n";
+ strg += sigTypeDef_ + "\n";
+ try
+ {
+ strg += getSignatureObject().toString();
+ }
+ catch (SignatureException e)
+ {
+ }
+ return strg;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/sig/SignatureEntry.java b/src/main/java/at/knowcenter/wag/egov/egiz/sig/SignatureEntry.java
new file mode 100644
index 0000000..2782f2b
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/egov/egiz/sig/SignatureEntry.java
@@ -0,0 +1,155 @@
+/*
+ * <copyright>
+ * Copyright (c) 2006 by Know-Center, Graz, Austria
+ * </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF THE
+ * SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE,
+ * OR NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES
+ * SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING
+ * THIS SOFTWARE OR ITS DERIVATIVES.
+ *
+ * $Id: SignatureEntry.java,v 1.3 2006/08/25 17:09:41 wprinz Exp $
+ */
+package at.knowcenter.wag.egov.egiz.sig;
+
+import java.io.Serializable;
+
+/**
+ * This class is to store a signature entry. The signature entry is 3-tupel. A key that is defined
+ * or declarated in the settings file, an optional caption or a value. <br>
+ * An additional helper value is a marker for the start index of the key, if the key is found in an
+ * analysing process extracting captions and values from a raw signature text.
+ *
+ * @author wlackner
+ * @see at.knowcenter.wag.egov.egiz.sig.SignatureObject
+ */
+public class SignatureEntry implements Serializable {
+
+ /**
+ * SVUID.
+ */
+ private static final long serialVersionUID = 4640380069301731879L;
+
+ /**
+ * The signature key.
+ */
+ private String key_ = null;
+ /**
+ * The signature caption for the key found or set in the signature text.
+ */
+ private String caption_ = null;
+ /**
+ * The signature value for the key found or set in the signature text.
+ */
+ private String value_ = null;
+ /**
+ * The starting index position of the key if it is found in the signature text.
+ */
+ private int startIndex_ = -1;
+
+ /**
+ * The empty constructor.
+ */
+ public SignatureEntry() {
+ }
+
+ /**
+ * A new <code>SignatureEntry</code> init with the key.
+ *
+ * @param key
+ */
+ public SignatureEntry(String key) {
+ key_ = key;
+ }
+
+ /**
+ * Returns the caption off the current key.
+ *
+ * @return Returns the caption.
+ */
+ public String getCaption() {
+ return caption_;
+ }
+
+ /**
+ * Set the caption of the current key.
+ *
+ * @param caption The caption to set.
+ */
+ public void setCaption(String caption) {
+ caption_ = caption;
+ }
+
+ /**
+ * Return the current key.
+ *
+ * @return Returns the key.
+ */
+ public String getKey() {
+ return key_;
+ }
+
+ /**
+ * Set the current key.
+ *
+ * @param key The key to set.
+ */
+ public void setKey(String key) {
+ key_ = key;
+ }
+
+ /**
+ * Return the start position of the key that caption is found in the signature text.
+ *
+ * @return Returns the startIndex.
+ */
+ public int getStartIndex() {
+ return startIndex_;
+ }
+
+ /**
+ * Set the start position of the current key.
+ *
+ * @param startIndex The startIndex to set.
+ */
+ public void setStartIndex(int startIndex) {
+ startIndex_ = startIndex;
+ }
+
+ /**
+ * Return the value of the current key.
+ *
+ * @return Returns the value.
+ */
+ public String getValue() {
+ return value_;
+ }
+
+ /**
+ * Set the value of the current key.
+ *
+ * @param value The value to set.
+ */
+ public void setValue(String value) {
+ value_ = value;
+ }
+
+ /**
+ * The toString method, used for tests or debugging.
+ */
+ public String toString() {
+ String the_string = "";
+ the_string += "\n Key:" + key_;
+ the_string += "\nCaption:" + caption_;
+ the_string += "\n Value:" + value_;
+// the_string += "\nStart I:" + startIndex_;
+ return the_string;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/sig/SignatureFieldDefinition.java b/src/main/java/at/knowcenter/wag/egov/egiz/sig/SignatureFieldDefinition.java
new file mode 100644
index 0000000..eacf575
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/egov/egiz/sig/SignatureFieldDefinition.java
@@ -0,0 +1,80 @@
+/**
+ * <copyright> Copyright (c) 2006 by Know-Center, Graz, Austria </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+ * NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
+ * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES.
+ *
+ * $Id: SignatureFieldDefinition.java,v 1.1 2006/08/25 17:09:41 wprinz Exp $
+ */
+package at.knowcenter.wag.egov.egiz.sig;
+
+import java.io.Serializable;
+
+/**
+ * This class contains the information about one field in the signature block.
+ *
+ * <p>
+ * E.g. Field "Issuer" could have the caption "Aussteller", the value null and
+ * the placeholder length of 500.
+ * </p>
+ *
+ * @author wprinz
+ */
+public class SignatureFieldDefinition implements Serializable
+{
+
+ /**
+ * SVUID.
+ */
+ private static final long serialVersionUID = -46020173047777315L;
+
+ /**
+ * The key identifier of this field.
+ */
+ public String field_name = null;
+
+ /**
+ * The static caption of the field.
+ */
+ public String caption = null;
+
+ /**
+ * The static value of the field.
+ *
+ * <p>
+ * Null means that this field has no static value and must be filled out.
+ * </p>
+ */
+ protected String value = null;
+
+ /**
+ * If the field is not static and has to be filled out, this gives the
+ * length of the placeholder that is reserved for filling out.
+ *
+ * <p>
+ * This has to be large enough so that it can hold the whole value to be
+ * filled out.
+ * </p>
+ */
+ public int placeholder_length = -1;
+
+ /**
+ * Stores the three byte abbreviation code of this field's field name.
+ */
+ //public byte [] brev = null;
+
+ public String toString()
+ {
+ return this.field_name + ": caption=" + this.caption + ", value=" + this.value + ", phlen=" + this.placeholder_length;
+ }
+
+} \ No newline at end of file
diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/sig/SignatureObject.java b/src/main/java/at/knowcenter/wag/egov/egiz/sig/SignatureObject.java
new file mode 100644
index 0000000..087ce4e
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/egov/egiz/sig/SignatureObject.java
@@ -0,0 +1,1499 @@
+/*
+ * <copyright> Copyright (c) 2006 by Know-Center, Graz, Austria </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+ * NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
+ * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES.
+ *
+ * $Id: SignatureObject.java,v 1.7 2006/10/31 08:18:56 wprinz Exp $
+ */
+package at.knowcenter.wag.egov.egiz.sig;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.Serializable;
+import java.io.UnsupportedEncodingException;
+import java.util.ArrayList;
+import java.util.Hashtable;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.Vector;
+
+import org.apache.log4j.Logger;
+
+import at.knowcenter.wag.egov.egiz.PdfASID;
+import at.knowcenter.wag.egov.egiz.cfg.ConfigLogger;
+import at.knowcenter.wag.egov.egiz.cfg.SettingsReader;
+import at.knowcenter.wag.egov.egiz.exceptions.InvalidIDException;
+import at.knowcenter.wag.egov.egiz.exceptions.NormalizeException;
+import at.knowcenter.wag.egov.egiz.exceptions.SettingNotFoundException;
+import at.knowcenter.wag.egov.egiz.exceptions.SettingsException;
+import at.knowcenter.wag.egov.egiz.exceptions.SignatureException;
+import at.knowcenter.wag.egov.egiz.exceptions.SignatureTypesException;
+import at.knowcenter.wag.egov.egiz.framework.SignatorFactory;
+import at.knowcenter.wag.egov.egiz.table.Entry;
+import at.knowcenter.wag.egov.egiz.table.Style;
+import at.knowcenter.wag.egov.egiz.table.Table;
+import at.knowcenter.wag.egov.egiz.tools.CodingHelper;
+import at.knowcenter.wag.egov.egiz.tools.FileHelper;
+import at.knowcenter.wag.egov.egiz.tools.Normalizer;
+
+/**
+ * This class represents the abstract signature object. It contains all methods
+ * reading the definitions from the settings file, analyse them and build the
+ * abstract signature table. <br>
+ * All values that build or used by the signation creation process, call the
+ * external services, can read or set separately. All other values are defined
+ * in the settings file.
+ *
+ * @author wlackner
+ */
+public class SignatureObject implements Serializable
+{
+
+ /**
+ * SVUID.
+ */
+ private static final long serialVersionUID = -3257189232362254713L;
+
+ /**
+ * The system file separator char
+ */
+ private static final String FILE_SEP = System.getProperty("file.separator");
+
+ /**
+ * The certificate extension
+ */
+ private static final String CERT_FILE_EXTENSION = ".der";
+
+ /**
+ * certificate import dir
+ */
+ private static final String CERT_ADD_DIR = "tobeadded";
+
+ /**
+ * The default style definition for images.
+ */
+ private Style defaultImageStyle_ = new Style();
+
+ /**
+ * The default style definition for captions.
+ */
+ private Style defaultCaptionStyle_ = new Style();
+
+ /**
+ * The default style definition for values.
+ */
+ private Style defaultValueStyle_ = new Style();
+
+ /**
+ * Standard key get/set the signature meta informations
+ */
+ public static final String SIG_META = "SIG_META";
+
+ /**
+ * Standard key get/set the certification value
+ */
+ public static final String SIG_CER = "SIG_CER";
+
+ /**
+ * Standard key get/set the certification digest value
+ */
+ public static final String SIG_CER_DIG = "SIG_CER_DIG";
+
+ private X509Cert x509Cert_ = null;
+
+ // public static final String SIG_RES = "SIG_RES";
+ // dummy value for debugging only
+ private String sigResponse_ = null;
+
+ /**
+ * The logger definition.
+ */
+ private static final Logger logger_ = ConfigLogger.getLogger(SignatureObject.class);
+
+ /**
+ * The normalizer reference
+ */
+ private Normalizer normalizer_ = null;
+
+ /**
+ * The settings reader reference
+ */
+ private SettingsReader settings_ = null;
+
+ // /**
+ // * The reference to the settings property tree
+ // */
+ // private PropertyTree pTree_ = null;
+ /**
+ * The current signature type used reading and analysing the property tree
+ */
+ private String sigType_ = null;
+
+ /**
+ * Reference from signature key to there corresponding value
+ */
+ private Hashtable sigEntries_ = new Hashtable(8);
+
+ /**
+ * The abstract table representation
+ */
+ private Table sigTable_ = null;
+
+ // private HashMap sigIndexMap_ = new HashMap();
+
+ /**
+ * Path value storing and fetching the certificates
+ */
+ private String certPath_ = null;
+
+ /**
+ * the signature definition object
+ */
+ private SignatureTypeDefinition signatureDefinition_ = null;
+
+ /**
+ * The raw xml response from the connector that was used to set the values in
+ * this SignatureObject.
+ *
+ * <p>
+ * This is set by the Connector so that signing Applications can use the
+ * returned XML values.
+ * </p>
+ */
+ protected String raw_signature_response = null;
+
+ /**
+ * The empty constructor. It initilize the normlizer, load the settings and
+ * set the default styles.
+ *
+ * @throws SignatureException
+ * ErrorCode:101, 400
+ */
+ public SignatureObject() throws SignatureException
+ {
+ initNormalizer();
+ loadSettings();
+ setDefaultStyles();
+ }
+
+ /**
+ * This method initialize the normalizer
+ *
+ * @throws SignatureException
+ * ErrorCode:400
+ */
+ private void initNormalizer() throws SignatureException
+ {
+ try
+ {
+ normalizer_ = new Normalizer();
+ }
+ catch (NormalizeException e)
+ {
+ SignatureException se = new SignatureException(400, "Normalizer can not be initialized", e);
+ throw se;
+ }
+ }
+
+ /**
+ * This method load the signature definitions
+ *
+ * @throws SignatureException
+ * ErrorCode:101
+ */
+ private void loadSettings() throws SignatureException
+ {
+ if (settings_ == null)
+ {
+ try
+ {
+ settings_ = SettingsReader.getInstance();
+ }
+ catch (SettingsException e)
+ {
+ String log_message = "Can not load pdf signature settings. Cause:\n" + e.getMessage();
+ logger_.error(log_message);
+ SignatureException se = new SignatureException(101, log_message, e);
+ se.setErrorCode(101);
+ throw se;
+ }
+ }
+ // pTree_ = settings_.getPTree();
+
+ certPath_ = SettingsReader.CERT_PATH;
+ }
+
+ /**
+ * This method set the default styles for images, captions and values.
+ */
+ private void setDefaultStyles()
+ {
+ defaultImageStyle_.setPadding(3);
+ defaultImageStyle_.setHAlign(Style.CENTER);
+ defaultImageStyle_.setVAlign(Style.MIDDLE);
+ defaultImageStyle_.setBgColor(null);
+
+ defaultCaptionStyle_.setHAlign(Style.CENTER);
+ defaultCaptionStyle_.setVAlign(Style.MIDDLE);
+
+ defaultValueStyle_.setVAlign(Style.MIDDLE);
+ }
+
+ /**
+ * Dummy getter Method for debugging only
+ *
+ * @return response string
+ */
+ public String getSigResponse()
+ {
+ return sigResponse_;
+ }
+
+ /**
+ * Dummy setter Method for debugging only
+ *
+ * @param sigRespone
+ * store the response string
+ */
+ public void setSigResponse(String sigRespone)
+ {
+ sigResponse_ = sigRespone;
+ }
+
+ /**
+ * This method set the signature type.
+ *
+ * @param sigType
+ * the signature type to be set
+ * @throws SignatureTypesException
+ */
+ public void setSigType(String sigType) throws SignatureTypesException
+ {
+ SignatureTypes sig_types = SignatureTypes.getInstance();
+ signatureDefinition_ = sig_types.getSignatureTypeDefinition(sigType_);
+ sigType_ = sigType;
+ }
+
+ /**
+ * Returns the default signation type
+ *
+ * @return the key for the default signature definition, if the key is not
+ * found it returns null
+ */
+ private String getDefaultSigType()
+ {
+ return settings_.getSetting(SignatureTypes.DEFAULT_TYPE, null);
+ }
+
+ /**
+ * This method checks if a given signature key is realy a defined signature
+ * key.
+ *
+ * @param sigKey
+ * the key to check
+ * @return true if the key is correct, false if the given key is not defined
+ */
+ public boolean isSigKey(String sigKey)
+ {
+ return signatureDefinition_.contains(sigKey);
+ }
+
+ /**
+ * This method adds an signaton value to the entry cache. If a key is not in
+ * the cache a new signature entry is createad. Therefor the method return
+ * true. <br>
+ * The value that has to be set would be normalized! <br>
+ * <b>If the key equals to <code>SIG_VALUE</code> all whitespaces are
+ * removed! </b> <br>
+ *
+ * @param key
+ * the key to be set
+ * @param value
+ * the value to be set
+ * @return <code>true</code> if a new signature value is created,
+ * <code>false</code> otherwise
+ */
+ public boolean setSigValue(String key, String value)
+ {
+ SignatureEntry sig_entry = null;
+ boolean is_new = false;
+ if (sigEntries_.containsKey(key))
+ {
+ sig_entry = (SignatureEntry) sigEntries_.get(key);
+ }
+ else
+ {
+ sig_entry = new SignatureEntry(key);
+ sigEntries_.put(key, sig_entry);
+ is_new = true;
+ }
+ value = normalizer_.normalize(value);
+ if (SignatureTypes.SIG_VALUE.equals(key) || SignatureTypes.SIG_ID.equals(key) || SignatureTypes.SIG_NUMBER.equals(key))
+ {
+ value = removeAllWhiteSpaces(value);
+ }
+ sig_entry.setValue(value);
+ return is_new;
+ }
+
+ public boolean setValueBruteForce(String key, String value)
+ {
+ SignatureEntry sig_entry = null;
+ boolean is_new = false;
+ if (sigEntries_.containsKey(key))
+ {
+ sig_entry = (SignatureEntry) sigEntries_.get(key);
+ }
+ else
+ {
+ sig_entry = new SignatureEntry(key);
+ sigEntries_.put(key, sig_entry);
+ is_new = true;
+ }
+ sig_entry.setValue(value);
+ return is_new;
+ }
+
+ /**
+ * Set the value and the caption to given key.
+ *
+ * @param key
+ * the key of the signature object
+ * @param value
+ * the value of the given key
+ * @param caption
+ * the caption of the given key
+ */
+ public void setSigValueCaption(String key, String value, String caption)
+ {
+ setSigValue(key, value);
+ SignatureEntry sig_entry = (SignatureEntry) sigEntries_.get(key);
+ sig_entry.setCaption(caption);
+ }
+
+ /**
+ * This method returns a value for a given signature key. If the key equals to
+ * <code>SIG_NORM</code> and the value is <code>null</code> the version
+ * string of the current normalizer is returned!
+ *
+ * @param key
+ * the key to get the value for
+ * @return a value for the given key
+ */
+ public String getSigValue(String key)
+ {
+ String value = null;
+ if (sigEntries_.containsKey(key))
+ {
+ value = ((SignatureEntry) sigEntries_.get(key)).getValue();
+ }
+ if (value == null && SignatureTypes.SIG_NORM.equals(key))
+ {
+ value = normalizer_.getVersion();
+ }
+ return value;
+ }
+
+ /**
+ * Sets the "Kennzeichnung".
+ *
+ * @param kz
+ * The "Kennzeichnung" to be set.
+ */
+ public void setKZ(PdfASID kz)
+ {
+ setSigValue(SignatureTypes.SIG_KZ, kz.toString());
+ }
+
+ /**
+ * Returns the "Kennzeichnung" of this signature.
+ *
+ * @return Returns the "Kennzeichnung" of this signature. Returns null if
+ * there is no "Kennzeichnung" or it is not recognized by this
+ * application.
+ */
+ public PdfASID getKZ() throws InvalidIDException
+ {
+ String kz_string = getSigValue(SignatureTypes.SIG_KZ);
+ if (kz_string == null)
+ {
+ return null;
+ }
+ PdfASID kz = null;
+ try
+ {
+ kz = new PdfASID(kz_string);
+ }
+ catch (InvalidIDException e)
+ {
+ e.printStackTrace();
+ }
+ return kz;
+ }
+
+ /**
+ * This method returns a caption for a given signature key. If the key exists
+ * and the coresponding value is <code>null</code> the key itself is
+ * returned as caption! If the key does not exist the method returns
+ * <code>null</code>.
+ *
+ * @param key
+ * the key to get the caption for
+ * @return a caption for the given key
+ */
+ private String getSigCaption(String key)
+ {
+ String caption = null;
+ if (sigEntries_.containsKey(key))
+ {
+ caption = ((SignatureEntry) sigEntries_.get(key)).getCaption();
+ if (caption == null)
+ {
+ caption = key;
+ }
+ }
+ return caption;
+ }
+
+ /**
+ * @return Returns the SignationType.
+ */
+ public String getSignationType()
+ {
+ if (sigType_ == null)
+ {
+ sigType_ = getDefaultSigType();
+ }
+ return sigType_;
+ }
+
+ /**
+ * @return Returns the SignationDate.
+ */
+ public String getSignationDate()
+ {
+ return getSigValue(SignatureTypes.SIG_DATE);
+ }
+
+ /**
+ * @param sigDate
+ * The SignationDate to set.
+ */
+ public void setSignationDate(String sigDate)
+ {
+ setSigValue(SignatureTypes.SIG_DATE, sigDate);
+ }
+
+ /**
+ * @return Returns the SignationName.
+ */
+ public String getSignationName()
+ {
+ return getSigValue(SignatureTypes.SIG_NAME);
+ }
+
+ /**
+ * @param sigName
+ * The SignationName to set.
+ */
+ public void setSignationName(String sigName)
+ {
+ setSigValue(SignatureTypes.SIG_NAME, sigName);
+ }
+
+ /**
+ * @return Returns the SignationNormVersion.
+ */
+ public String getSignationNormVersion()
+ {
+ return getSigValue(SignatureTypes.SIG_NORM);
+ }
+
+ /**
+ * @param sigNormVersion
+ * The SignationNormVersion to set.
+ */
+ public void setSignationNormVersion(String sigNormVersion)
+ {
+ setSigValue(SignatureTypes.SIG_NORM, sigNormVersion);
+ }
+
+ /**
+ * @return Returns the SignationIssuer.
+ */
+ public String getSignationIssuer()
+ {
+ String issuer = getSigValue(SignatureTypes.SIG_ISSUER);
+ X509Cert cert = loadCertificate(getSigValue(SignatureTypes.SIG_NUMBER), issuer);
+ if (cert != null)
+ {
+ setSigValue(SignatureTypes.SIG_ISSUER, cert.getIssuerName());
+ setSigValue(SIG_CER, cert.getCertString());
+ setSigValue(SIG_CER_DIG, cert.getCertDigest());
+ x509Cert_ = cert;
+ }
+ issuer = getSigValue(SignatureTypes.SIG_ISSUER);
+ return issuer;
+ }
+
+ /**
+ * @param sigIssuer
+ * The SignationIssuer to set.
+ */
+ public void setSignationIssuer(String sigIssuer)
+ {
+ setSigValue(SignatureTypes.SIG_ISSUER, sigIssuer);
+ }
+
+ /**
+ * @return Returns the SignationValue.
+ */
+ public String getSignationValue()
+ {
+ return getSigValue(SignatureTypes.SIG_VALUE);
+ }
+
+ /**
+ * @param sigValue
+ * The SignationValue to set.
+ */
+ public void setSignationValue(String sigValue)
+ {
+ setSigValue(SignatureTypes.SIG_VALUE, sigValue);
+ }
+
+ /**
+ * @return the reference to the signature label
+ */
+ public String getOfficialSeal()
+ {
+ return getSigValue(SignatureTypes.SIG_LABEL);
+ }
+
+ /**
+ * @param serialNumber
+ * The serial number of the signature to set
+ */
+ public void setSignationSerialNumber(String serialNumber)
+ {
+ setSigValue(SignatureTypes.SIG_NUMBER, serialNumber);
+ }
+
+ /**
+ * @return sigNumber the serial number of the signature
+ */
+ public String getSignationSerialNumber()
+ {
+ return getSigValue(SignatureTypes.SIG_NUMBER);
+ }
+
+ /**
+ * @param certDigest
+ * set the digest value for the X509Certificate
+ */
+ public void setX509CertificateDigest(String certDigest)
+ {
+ setSigValue(SIG_CER_DIG, certDigest);
+ }
+
+ /**
+ * This method load the current certificate getting the current SerialNumber
+ * and the current SignationIssuer. <br>
+ * It stores back the SignationIssuer, X509Certificate and
+ * X509CertificateDigest
+ */
+ private void loadCurrentCert()
+ {
+ X509Cert cert = loadCertificate(getSignationSerialNumber(), getSignationIssuer());
+ if (cert != null)
+ {
+ setSigValue(SignatureTypes.SIG_ISSUER, cert.getIssuerName());
+ setSigValue(SIG_CER, cert.getCertString());
+ setSigValue(SIG_CER_DIG, cert.getCertDigest());
+ x509Cert_ = cert;
+ }
+ }
+
+ /**
+ * @return the current X509CertificateDigest value.
+ */
+ public String getX509CertificateDigest()
+ {
+ String dig = getSigValue(SIG_CER_DIG);
+ if (dig == null)
+ {
+ loadCurrentCert();
+ dig = getSigValue(SIG_CER_DIG);
+ }
+ return dig;
+ }
+
+ /**
+ * @return the current X509v3 certificate string
+ */
+ public String getX509CertificateString()
+ {
+ String cert = getSigValue(SIG_CER);
+ if (cert == null)
+ {
+ loadCurrentCert();
+ cert = getSigValue(SIG_CER);
+ }
+ return cert;
+ }
+
+ /**
+ * @param x509Certificate
+ * The X509v3 certificate of the signature to set
+ */
+ public void setX509Certificate(String x509Certificate)
+ {
+ setSigValue(SIG_CER, x509Certificate);
+ storeCertificate(getSignationSerialNumber(), getSignationIssuer(), x509Certificate, getX509CertificateDigest());
+ }
+
+ /**
+ * return the 509v3 certificate of the given serialNumber and the given issuer
+ * string
+ *
+ * @param serialNumber
+ * the serialNumber which the certificates should load
+ * @param issuer
+ * the issuer which the certificates should load
+ * @return the X509v3 certificate string
+ */
+ public String getX509CertificateString(String serialNumber, String issuer)
+ {
+ X509Cert cert = loadCertificate(serialNumber, issuer);
+ if (cert != null)
+ {
+ return cert.getCertString();
+ }
+ return null;
+ }
+
+ public X509Cert getX509Cert(String serialNumber, String issuer)
+ {
+ return loadCertificate(serialNumber, issuer);
+ }
+
+ public X509Cert getX509Cert()
+ {
+ if (x509Cert_ == null)
+ {
+ loadCurrentCert();
+ }
+ return x509Cert_;
+ }
+
+ /**
+ * Set the signation id's build by a BKU signated SignatureObject.
+ *
+ * @param sigIds
+ * the string to store.
+ */
+ public void setSignationIDs(String sigIds)
+ {
+ setSigValue(SignatureTypes.SIG_ID, sigIds);
+ }
+
+ /**
+ * Set the signation id's build by a BKU signated SignatureObject.
+ *
+ * @param sigIds
+ * The sination id's are defined into five parts, that have the same
+ * base as prefix. Therefore the ids's are reduced by the base prefix
+ * and stored in the SignatureObject.
+ */
+ public void setSignationIDs(String[] sigIds)
+ {
+ String join = "";
+ String base = null;
+ for (int arr_idx = 0; arr_idx < sigIds.length; arr_idx++)
+ {
+ String id = sigIds[arr_idx];
+ if (logger_.isDebugEnabled())
+ {
+ logger_.debug("Set BKU id:" + id);
+ }
+ int id_idx = id.lastIndexOf("-");
+ if (arr_idx == 0)
+ {
+ base = id.substring(0, id_idx);
+ }
+ String cur_id = id.substring(id_idx + 1);
+ join += "-" + cur_id;
+ }
+ setSignationIDs(base + "@" + join.substring(1));
+ }
+
+ /**
+ * Checks if the current SignatureObject is siganted by MOA. It checks if the
+ * current SignatureObject has a signation id value.
+ *
+ * @return true if no signation id value is found, false otherwise
+ */
+ public boolean isMOASigned()
+ {
+ return getSignationIds() == null;
+ }
+
+ /**
+ * Tells if this SignatureObject is textual.
+ *
+ * @return Returns true, if it is textual.
+ */
+ public boolean isTextual()
+ {
+ PdfASID kz = null;
+ try
+ {
+ kz = getKZ();
+ }
+ catch (InvalidIDException e)
+ {
+ e.printStackTrace();
+ }
+ if (kz == null)
+ {
+ return true; // must be an old Signature
+ }
+
+ boolean textual = kz.getType().equals(SignatorFactory.TYPE_TEXTUAL);
+ return textual;
+ }
+
+ /**
+ * Tells, if this SignatureObject is binary.
+ *
+ * @return Returns true, if it is binary.
+ */
+ public boolean isBinary()
+ {
+ PdfASID kz = null;
+ try
+ {
+ kz = getKZ();
+ }
+ catch (InvalidIDException e)
+ {
+ e.printStackTrace();
+ }
+ if (kz == null)
+ {
+ return false; // must be an old Signature
+ }
+
+ boolean binary = kz.getType().equals(SignatorFactory.TYPE_BINARY);
+ return binary;
+ }
+
+ /**
+ * Takes the signation id value of the current SignatureObject and split them
+ * into the corresponding id array added with the id-base.
+ *
+ * @return the id array
+ */
+ public String[] getSignationIds()
+ {
+ String sig_ids = getSigValue(SignatureTypes.SIG_ID);
+ if (sig_ids == null || sig_ids.length() == 0)
+ {
+ return null;
+ }
+
+ // int index = sig_ids.indexOf(PdfAS.IDS);
+ // if (index < 0)
+ // {
+ // return null;
+ // }
+ // sig_ids = sig_ids.substring(index + PdfAS.IDS.length());
+ //
+ // if (sig_ids == null || sig_ids.length() == 0)
+ // {
+ // return null;
+ // }
+
+ String[] ids_str = sig_ids.split("@");
+ String base = ids_str[0];
+ String[] ids = ids_str[1].split("-");
+ String[] real_ids = new String[5];
+ real_ids[0] = base + "-" + ids[0];
+ real_ids[1] = "0-" + base + "-" + ids[1];
+ real_ids[2] = "0-" + base + "-" + ids[2];
+ real_ids[3] = "0-" + base + "-" + ids[3];
+ real_ids[4] = "0-" + base + "-" + ids[4];
+ if (logger_.isDebugEnabled())
+ {
+ for (int id_idx = 0; id_idx < real_ids.length; id_idx++)
+ {
+ logger_.debug("Set BKU id:" + real_ids[id_idx]);
+ }
+ }
+ return real_ids;
+ }
+
+ /**
+ * This method normalizes the issuer string to support unique issuer string
+ * for equition. Used to store and find corresponting certificates.
+ * Normalzing: normalizing the string using the normalizer, remove all white
+ * spaces, encode as base64 and replace all "/" chars with "_".
+ *
+ * @param issuer
+ * the issuer string to normalize
+ * @return the normalized issuer string
+ */
+ private String getIssuerFileHash(String issuer)
+ {
+ try
+ {
+ if (issuer != null)
+ {
+ issuer = normalizer_.normalize(issuer);
+ issuer = removeAllWhiteSpaces(issuer);
+ // added the ("UTF-8")
+ issuer = CodingHelper.encodeBase64(CodingHelper.buildDigest(issuer.getBytes("UTF-8")));
+ issuer = issuer.replaceAll("/", "_");
+ }
+ return issuer;
+ }
+ catch (UnsupportedEncodingException e)
+ {
+ e.printStackTrace();
+ throw new RuntimeException(e);
+ }
+ }
+
+ /**
+ * This method imports new certificates into the certstore path.
+ */
+ private void addNewCertificates()
+ {
+ String cert_add_path = certPath_ + CERT_ADD_DIR;
+ File cert_add_dir = new File(cert_add_path);
+ if (cert_add_dir.isDirectory())
+ {
+ File[] cert_files = cert_add_dir.listFiles();
+ for (int cert_file_idx = 0; cert_file_idx < cert_files.length; cert_file_idx++)
+ {
+ File cert_file = cert_files[cert_file_idx];
+ if (cert_file.isFile() && cert_file.canRead())
+ {
+ X509Cert cert = X509Cert.initByFile(cert_file);
+ // System.err.println("isCert:" + cert.isX509Cert() + ":" +
+ // cert_file.getAbsolutePath());
+ if (cert.isX509Cert())
+ {
+ String issuer = cert.getIssuerName();
+ String serial_number = cert.getSerialNumber();
+ String iss_hash = getIssuerFileHash(issuer);
+ String cert_store_path = certPath_ + iss_hash;
+
+ File cert_store_dir = new File(cert_store_path);
+ if (!cert_store_dir.exists())
+ {
+ cert_store_dir.mkdir();
+ }
+ if (cert_store_dir.isDirectory())
+ {
+ String cert_file_name = cert_store_path + FILE_SEP + serial_number + CERT_FILE_EXTENSION;
+ // boolean store =
+ FileHelper.writeToFile(cert_file_name, cert.getCertString());
+ // System.err.println("store:" + store + ":" +
+ // cert_file.getAbsolutePath());
+ }
+ }
+ boolean deleted = cert_file.delete();
+ if (deleted == false)
+ {
+ System.err.println("couldn't delete:" + cert_file.getAbsolutePath());
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * This method load a X509v3 certificate from the filesystem. The reference to
+ * the stored certificate is build by the serialNumber and the issuer string.
+ * The issuer string is normalized because if getting this value from a pdf
+ * extraction it can be splited into more sections or necessary spaces are
+ * removed. The real issuer value is stored in the certificates meta file. The
+ * certficate is devided into two files: certificate.der (the binary value)
+ * and the meta information used in SignatureObjects as well in
+ * SignatureImages of a signed pdf-document. The storing path of the
+ * certificate is build by:
+ * <ol>
+ * <li>normalize the issuer string</li>
+ * <li>reduce all white spaces in the normalized issuer string</li>
+ * <li>build a hash value of this reduced string</li>
+ * <li>code this hash value as base64 value</li>
+ * <li>add the base64 normalized issuer hash value to the certificate base
+ * store path</li>
+ * <li>add the serialNumber to the cert path</li>
+ * <li>add the <code>.der</code> extension to get the certificate binary</li>
+ * <li>add the <code>.txt</code> extension to get the meta information of
+ * the certificate</li>
+ * </ol>
+ *
+ * The certificate meta file is build by the base64 coded issuer string and
+ * the cert digest value devided by the <code>@</code> char.
+ *
+ * @param serialNumber
+ * the file name of the certificate .der|.txt
+ * @param issuer
+ * the file path value of the certificate
+ * @return String array: [0]--> issuer string; [1]-->certificate binary;
+ * [2]--> cert digest value
+ */
+ private X509Cert loadCertificate(String serialNumber, String issuer)
+ {
+ addNewCertificates();
+ X509Cert cert = null;
+ if (issuer != null && serialNumber != null)
+ {
+ String iss_hash = getIssuerFileHash(issuer);
+ String cert_store_path = certPath_ + iss_hash;
+ String cert_file_name = cert_store_path + FILE_SEP + serialNumber + CERT_FILE_EXTENSION;
+ if (logger_.isDebugEnabled())
+ {
+ logger_.debug("load certificate:" + cert_file_name);
+ }
+ cert = X509Cert.initByFilePath(cert_file_name);
+
+ if (cert == null)
+ {
+ logger_.info("The certificate '" + issuer + "', '" + serialNumber + "' wasn't found in the local certificate store - connecting to LDAP.");
+
+ // the certificate wasn't found in the local store
+ // - load it from the LDAP server.
+ String normalized_issuer = normalizer_.normalize(issuer);
+
+ byte[] cert_data = loadCertificateFromLDAP(serialNumber, normalized_issuer);
+ if (cert_data == null)
+ {
+ logger_.info("The certificate '" + issuer + "', '" + serialNumber + "' wasn't found on the LDAP server either.");
+
+ return null;
+ }
+
+ storeNewCertificateInLocalStore(cert_data);
+
+ // load the local cert
+ cert = X509Cert.initByFilePath(cert_file_name);
+
+ if (cert == null)
+ {
+ logger_.debug("The certificate should be loaded here, but is null - something's wrong.");
+ }
+ }
+ }
+ return cert;
+ }
+
+ /**
+ * This is an internal counter for added certificates.
+ */
+ protected static int new_cert_num = 0;
+
+ /**
+ * Writes the certificate data to a file and stores the file in the local
+ * certificate store.
+ *
+ * @param cert_data
+ * The binary certificate data.
+ */
+ public void storeNewCertificateInLocalStore(byte[] cert_data)
+ {
+ // write the loaded certificate to the add directory
+ String cert_add_path = certPath_ + CERT_ADD_DIR;
+ File cert_add_dir = new File(cert_add_path);
+ if (!cert_add_dir.exists())
+ {
+ cert_add_dir.mkdirs();
+ }
+ File save_file = new File(cert_add_dir, "newcert_" + new_cert_num + ".der");
+ new_cert_num++;
+ try
+ {
+ FileOutputStream fos = new FileOutputStream(save_file);
+ fos.write(cert_data);
+ fos.close();
+ }
+ catch (IOException e)
+ {
+ e.printStackTrace();
+ return;
+ }
+
+ // add the new certificate to the local store
+ addNewCertificates();
+ }
+
+ /**
+ * Connects to the LDAP server to look for the certificate.
+ *
+ * @param serialNumber
+ * The serial number String of the certificate being sought. E.g.
+ * "123455676744123432".
+ * @param issuer
+ * The issuer String of the certificate being sought.
+ *
+ * @return Returns the DER certificate file as can be stored in the local
+ * repository. Returns null, if the document wasn't found on the
+ * server.
+ */
+ protected byte[] loadCertificateFromLDAP(String serialNumber, String issuer)
+ {
+ String ldap_server_url = null;
+ try
+ {
+ ldap_server_url = settings_.getSetting("ldap.url");
+ }
+ catch (SettingNotFoundException e)
+ {
+ e.printStackTrace();
+ logger_.info("LDAP server url setting not found.");
+ return null;
+ }
+ logger_.debug("LDAP server url = " + ldap_server_url);
+
+ // TODO connect to LDAP using the EGIZ API.
+ DummyLDAPAPI api = new DummyLDAPAPI(ldap_server_url);
+ byte[] cert = api.loadCertificateFromLDAP(serialNumber, issuer);
+
+ return cert;
+ }
+
+ /**
+ * This method stores a X509v3 certificate to the filesystem. The reference to
+ * the stored certificate is build by the serialNumber and the issuer string.
+ * The issuer string is normalized because if getting this value from a pdf
+ * extraction it can be splited into more sections or necessary spaces are
+ * removed. The real issuer value is stored in the certificates meta file. The
+ * certficate is devided into two files: certificate.der (the binary value)
+ * and the meta information used in SignatureObjects as well in
+ * SignatureImages of a signed pdf-document. The storing path of the
+ * certificate is build by:
+ * <ol>
+ * <li>normalize the issuer string</li>
+ * <li>reduce all white spaces in the normalized issuer string</li>
+ * <li>build a hash value of this reduced string</li>
+ * <li>code this hash value as base64 value</li>
+ * <li>add the base64 normalized issuer hash value to the certificate base
+ * store path</li>
+ * <li>add the serialNumber to the cert path</li>
+ * <li>add the <code>.der</code> extension to get the certificate binary</li>
+ * <li>add the <code>.txt</code> extension to get the meta information of
+ * the certificate</li>
+ * </ol>
+ *
+ * The certificate meta file is build by the base64 coded issuer string and
+ * the cert digest value devided by the <code>@</code> char.
+ *
+ * @param serialNumber
+ * the file name of the certificate .der|.txt
+ * @param issuer
+ * the issuer string for the file path value of the certificate and
+ * for metainformation
+ * @param x509Certificate
+ * the x509v3 binary string
+ * @param x509Digest
+ * the digest value of the given x509Certificate
+ * @return true the certificate is stored completely, false otherwise
+ */
+ private boolean storeCertificate(String serialNumber, String issuer,
+ String x509Certificate, String x509Digest)
+ {
+ boolean store_complete = false;
+ if (issuer != null && serialNumber != null)
+ {
+ // String issuer_b64 = CodingHelper.encodeBase64(issuer.getBytes());
+ String iss_hash = getIssuerFileHash(issuer);
+ File cert_path_dir = new File(certPath_);
+ if (!cert_path_dir.exists())
+ {
+ cert_path_dir.mkdir();
+ }
+ String cert_store_path = certPath_ + iss_hash;
+ File cert_store_dir = new File(cert_store_path);
+ if (!cert_store_dir.exists())
+ {
+ cert_store_dir.mkdir();
+ }
+ if (cert_store_dir.isDirectory())
+ {
+ String cert_file_name = cert_store_path + FILE_SEP + serialNumber + CERT_FILE_EXTENSION;
+ if (logger_.isInfoEnabled())
+ {
+ logger_.info("store certificate:" + cert_file_name);
+ }
+ boolean store_cert_file = FileHelper.writeToFile(cert_file_name, x509Certificate);
+ store_complete = store_cert_file;// && store_cert_meta;
+ }
+ }
+ return store_complete;
+ }
+
+ /**
+ * @return Returns the AbstractTable.
+ * @see at.knowcenter.wag.egov.egiz.table.Table
+ */
+ public Table getAbstractTable()
+ {
+ if (sigTable_ == null)
+ {
+ sigTable_ = createSigTable(SignatureTypes.MAIN_TABLE);
+ }
+ return sigTable_;
+ }
+
+ /**
+ * This method read the style definitions from the settings file.
+ *
+ * @param styleKey
+ * the key to read the style definitions
+ * @return the defined style informations
+ * @see at.knowcenter.wag.egov.egiz.table.Style
+ */
+ private Style readStyle(String styleKey)
+ {
+ ArrayList styles = settings_.getKeys(styleKey);
+ Style style = new Style();
+ for (int style_idx = 0; style_idx < styles.size(); style_idx++)
+ {
+ String style_id = (String) styles.get(style_idx);
+ String style_val = settings_.getSetting(styleKey + "." + style_id, null);
+ style.setStyle(style_id, style_val);
+ }
+ return style;
+ }
+
+ /**
+ * This method creates an abstract signature table object. It takes all keys
+ * and values set by the signature object to create the corresponding abstract
+ * table object. The table definition is read from the settings file.
+ *
+ * @param tableKey
+ * is the name of the table definition in the settings file
+ * @return a new abstract signature table
+ * @see at.knowcenter.wag.egov.egiz.table.Style
+ * @see at.knowcenter.wag.egov.egiz.table.Table
+ * @see at.knowcenter.wag.egov.egiz.table.Entry
+ */
+ private Table createSigTable(String tableKey)
+ {
+ String table_key_prefix = SignatureTypes.SIG_OBJ + getSignationType() + "." + SignatureTypes.TABLE;
+ String table_key = table_key_prefix + tableKey;
+ // String caption_prefix = SignatureTypes.SIG_OBJ + getSignationType() +
+ // ".key.";
+ // String value_prefix = SignatureTypes.SIG_OBJ + getSignationType() +
+ // ".value.";
+ // ArrayList table_def_keys = settings_.getKeys(table_key);
+ Vector table_def_keys = settings_.getSettingKeys(table_key);
+ if (table_def_keys == null)
+ {
+ return null;
+ }
+ Table sig_table = new Table(tableKey);
+ boolean found_style = false;
+ for (int table_key_idx = table_def_keys.size() - 1; table_key_idx >= 0; table_key_idx--)
+ {
+ String table_def = (String) table_def_keys.get(table_key_idx);
+ int dot_idx = (table_def.indexOf(".") > 0 ? table_def.indexOf(".") : table_def.length());
+ table_def = table_def.substring(0, dot_idx);
+ String table_def_keys_prefix = table_key + "." + table_def;
+ String table_def_string = settings_.getSetting(table_def_keys_prefix, null);
+ if (table_def.matches("\\D*"))
+ {
+ // if the table key is not a number (row number index)
+ if (SignatureTypes.COLS_WITH.equals(table_def))
+ {
+ String[] cols_s = table_def_string.split(" ");
+ float[] cols_f = new float[cols_s.length];
+ for (int i = 0; i < cols_s.length; i++)
+ {
+ cols_f[i] = Float.parseFloat(cols_s[i]);
+ }
+ sig_table.setColsRelativeWith(cols_f);
+ }
+ if (SignatureTypes.STYLE.equals(table_def) && !found_style)
+ {
+ Style style = readStyle(table_def_keys_prefix);
+ sig_table.setStyle(style);
+ found_style = true;
+ }
+ continue;
+ }
+ if (table_def_string != null)
+ {
+ // analyse the row definition
+ String[] elems = table_def_string.split("\\|");
+ ArrayList row = new ArrayList();
+ for (int elem_idx = 0; elem_idx < elems.length; elem_idx++)
+ {
+ String elem = elems[elem_idx];
+ String[] key_type = elem.split("-");
+ if (key_type.length < 2)
+ {
+ return null;
+ }
+ String key = key_type[0];
+ String type = key_type[1];
+ if (SignatureTypes.TYPE_TABLE.equals(key))
+ {
+ // add a table entry
+ Table table = createSigTable(type);
+ if (table != null)
+ {
+ Entry entry = new Entry(Entry.TYPE_TABLE, table, key);
+ row.add(entry);
+ }
+ }
+ if (SignatureTypes.TYPE_IMAGE.equals(type))
+ {
+ // add an image entry
+ String value = getSigValue(key);
+ if (value != null)
+ {
+ Entry entry = new Entry(Entry.TYPE_IMAGE, value, key);
+ entry.setStyle(defaultImageStyle_);
+ row.add(entry);
+ }
+ }
+ if (SignatureTypes.TYPE_VALUE.equals(type))
+ {
+ // add a single value entry
+ String value = getSigValue(key);
+ Entry entry = new Entry(Entry.TYPE_VALUE, value, key);
+ if (entry != null)
+ {
+ entry.setColSpan(2);
+ entry.setStyle(defaultCaptionStyle_);
+ row.add(entry);
+ }
+ }
+ if ((SignatureTypes.TYPE_VALUE + SignatureTypes.TYPE_CAPTION).equals(type) || (SignatureTypes.TYPE_CAPTION + SignatureTypes.TYPE_VALUE).equals(type))
+ {
+ // add a caption value pair
+ String caption = getSigCaption(key);
+ String value = getSigValue(key);
+ if (value != null)
+ {
+ Entry c_entry = new Entry(Entry.TYPE_CAPTION, caption, key);
+ // c_entry.setNoWrap(true);
+ c_entry.setStyle(defaultCaptionStyle_);
+
+ Entry v_entry = new Entry(Entry.TYPE_VALUE, value, key);
+ v_entry.setStyle(defaultValueStyle_);
+ if (c_entry != null && v_entry != null)
+ {
+ row.add(c_entry);
+ row.add(v_entry);
+ }
+ }
+ }
+ }
+ sig_table.addRow(table_def, row);
+ }
+ }
+
+ return sig_table;
+ }
+
+ /**
+ * This method inits the signature object by the given type. It loads the
+ * configured values and captions from the config.properties file.
+ */
+ public void initByType() throws SignatureTypesException
+ {
+ if (sigType_ == null)
+ {
+ sigType_ = getDefaultSigType();
+ }
+ SignatureTypes sig_types = SignatureTypes.getInstance();
+ signatureDefinition_ = sig_types.getSignatureTypeDefinition(sigType_);
+ Map key_cap_map = signatureDefinition_.getKeyCaptionMap();
+ if (key_cap_map != null)
+ {
+ Iterator key_cap = key_cap_map.entrySet().iterator();
+ while (key_cap.hasNext())
+ {
+ Map.Entry entry = (Map.Entry) key_cap.next();
+ String key = (String) entry.getKey();
+ String caption = (String) entry.getValue();
+ SignatureEntry sig_entry = null;
+ if (sigEntries_.containsKey(key))
+ {
+ sig_entry = (SignatureEntry) sigEntries_.get(key);
+ }
+ else
+ {
+ sig_entry = new SignatureEntry(key);
+ sigEntries_.put(key, sig_entry);
+ }
+ sig_entry.setCaption(caption);
+ }
+ }
+
+ Map key_val_map = signatureDefinition_.getKeyValueMap();
+ if (key_val_map != null)
+ {
+ Set key_val_set = key_val_map.entrySet();
+ Iterator key_val = key_val_set.iterator();
+ while (key_val.hasNext())
+ {
+ Map.Entry entry = (Map.Entry) key_val.next();
+ String key = (String) entry.getKey();
+ String value = (String) entry.getValue();
+ if (SignatureTypes.SIG_NORM.equals(key))
+ {
+ try
+ {
+ normalizer_.setVersion(value);
+ }
+ catch (NormalizeException e)
+ {
+ throw new SignatureTypesException("Can not set normalizer Version:" + value);
+ }
+ }
+ // value = new String(CodingHelper.encodeUTF8(value));
+ if (logger_.isDebugEnabled())
+ {
+ logger_.debug("key:" + key + " value:" + value);
+ }
+ setSigValue(key, value);
+ }
+ }
+ }
+
+ /**
+ * This method returns a signature entry object.
+ *
+ * @param key
+ * the corresponding key
+ * @return the signature entry object of the given key, null if the key does
+ * not exist
+ */
+ public SignatureEntry getSigEntry(String key)
+ {
+ return (SignatureEntry) sigEntries_.get(key);
+ }
+
+ /**
+ * This method is a helper function to remove all white spaces from a text.
+ *
+ * @param text
+ * the white spaces should remove from
+ * @return a text without white spaces
+ */
+ private static String removeAllWhiteSpaces(String text)
+ {
+ return text.replaceAll("\\s", "");
+ }
+
+ public SignatureTypeDefinition getSignatureTypeDefinition()
+ {
+ return this.signatureDefinition_;
+ }
+
+ /**
+ *
+ * @param placeholder
+ * @return Returns the list of SignatureFieldDefinitions that's values in the
+ * SignatureObject have been filled out with placeholders.
+ */
+ public List fillValues(final char placeholder, boolean has_SIG_ID)
+ {
+ List variable_fields = new ArrayList();
+
+ List field_definitions = this.signatureDefinition_.getFieldDefinitions();
+ Iterator it = field_definitions.iterator();
+ while (it.hasNext())
+ {
+ SignatureFieldDefinition sfd = (SignatureFieldDefinition) it.next();
+ String value_string = null;
+ if (sfd.placeholder_length > 0)
+ {
+ if (sfd.field_name.equals(SignatureTypes.SIG_ID) && has_SIG_ID == false)
+ {
+ setValueBruteForce(SignatureTypes.SIG_ID, null);
+ continue;
+ }
+
+ char[] placeholder_chars = new char[sfd.placeholder_length];
+ for (int i = 0; i < placeholder_chars.length; i++)
+ {
+ placeholder_chars[i] = placeholder;
+ }
+ value_string = new String(placeholder_chars);
+
+ variable_fields.add(sfd);
+
+ setSigValue(sfd.field_name, value_string);
+ }
+ }
+
+ return variable_fields;
+ }
+
+ /**
+ * Returns the raw signature response XML string as set by the signing
+ * Connector.
+ *
+ * @return Returns the XML response String.
+ */
+ public String getRawSignatureResponse()
+ {
+ return this.raw_signature_response;
+ }
+
+ /**
+ * Sets the raw signature response XML string.
+ *
+ * <p>
+ * This should be used by the Connector to pass the response String to the
+ * signer.
+ * </p>
+ *
+ * @param raw_response_string
+ * The new raw signature response string.
+ */
+ public void setRawSignatureResponse(String raw_response_string)
+ {
+ this.raw_signature_response = raw_response_string;
+ }
+
+ /**
+ * The toString method, used for tests or debugging.
+ */
+ public String toString()
+ {
+ String strg = "";
+ Iterator it = sigEntries_.values().iterator();
+ while (it.hasNext())
+ {
+ SignatureEntry sig_entry = (SignatureEntry) it.next();
+ String key = sig_entry.getKey();
+ String caption = sig_entry.getCaption();
+ String value = sig_entry.getValue();
+ strg += key + "=" + caption + ":" + value + "\n";
+ }
+ strg += "Signation Type:" + getSignationType() + "\n";
+ return strg;
+ }
+
+} \ No newline at end of file
diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/sig/SignatureResponse.java b/src/main/java/at/knowcenter/wag/egov/egiz/sig/SignatureResponse.java
new file mode 100644
index 0000000..f576e65
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/egov/egiz/sig/SignatureResponse.java
@@ -0,0 +1,470 @@
+/*
+ * <copyright> Copyright (c) 2006 by Know-Center, Graz, Austria </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+ * NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
+ * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES.
+ *
+ * $Id: SignatureResponse.java,v 1.4 2006/08/03 07:43:04 wprinz Exp $
+ */
+package at.knowcenter.wag.egov.egiz.sig;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+
+import org.apache.log4j.Logger;
+
+import at.knowcenter.wag.egov.egiz.cfg.ConfigLogger;
+import at.knowcenter.wag.egov.egiz.cfg.PropertyTree;
+import at.knowcenter.wag.egov.egiz.cfg.SettingsReader;
+import at.knowcenter.wag.egov.egiz.exceptions.SettingNotFoundException;
+import at.knowcenter.wag.egov.egiz.exceptions.SettingsException;
+import at.knowcenter.wag.egov.egiz.exceptions.SignatureException;
+
+/**
+ * The response of a verification.
+ *
+ * @author wlackner
+ */
+public class SignatureResponse
+{
+ /**
+ * The siganture response config key
+ */
+ private static String SIG_RESP_KEY = "signature.response.";
+
+ /**
+ * Default response message
+ */
+ private static String SIG_RESP_DEFAULT_INFO = "Es ist leider keine nähere Information verfügbar:";
+
+ /**
+ * Response value for x509SubjectName_
+ */
+ private String x509SubjectName_ = null;
+
+ /**
+ * Response value for x509IssuerName
+ */
+ private String x509IssuerName = null;
+
+ /**
+ * Response value for x509SerialNumber
+ */
+ private String x509SerialNumber = null;
+
+ /**
+ * Response value for signatureCheckCode_
+ */
+ private String signatureCheckCode_ = null;
+
+ /**
+ * Response value for signatureCheckInfo_
+ */
+ private String signatureCheckInfo_ = null;
+
+ /**
+ * Response value for signatureManifestCheckCode_
+ */
+ private String signatureManifestCheckCode_ = null;
+
+ /**
+ * Response value for signatureManifestCheckInfo_
+ */
+ private String signatureManifestCheckInfo_ = null;
+
+ /**
+ * Response value for certificateCheckCode_
+ */
+ private String certificateCheckCode_ = null;
+
+ /**
+ * Response value for certificateCheckInfo_
+ */
+ private String certificateCheckInfo_ = null;
+
+ /**
+ * The X.509 certificated parsed from the response string.
+ */
+ protected X509Cert certificate_ = null;
+
+ // /**
+ // * Flag the marks that the response is an error response
+ // */
+ // private boolean isError_ = false;
+ //
+ // /**
+ // * The error code of an external application
+ // */
+ // private String errorCode_ = null;
+
+ /**
+ * The SettingsReader instance
+ */
+ private SettingsReader settings_ = null;
+
+ /**
+ * The logger definition.
+ */
+ private static final Logger logger_ = ConfigLogger.getLogger(SignatureResponse.class);
+
+ /**
+ *
+ *
+ */
+ public SignatureResponse()
+ {
+ try
+ {
+ loadSettings();
+ }
+ catch (SignatureException e)
+ {
+ logger_.warn(e.getMessage());
+ }
+ }
+
+ /**
+ * load the inital signature settings
+ *
+ * @throws SignatureException
+ * @see SettingsReader
+ */
+ private void loadSettings() throws SignatureException
+ {
+ if (settings_ == null)
+ {
+ try
+ {
+ settings_ = SettingsReader.getInstance();
+ }
+ catch (SettingsException e)
+ {
+ String log_message = "Can not load signature settings. Cause:\n" + e.getMessage();
+ logger_.error(log_message);
+ throw new SignatureException(101, log_message, e);
+ }
+ }
+ }
+
+ /**
+ * @return Returns the certificateCheckCode.
+ */
+ public String getCertificateCheckCode()
+ {
+ return certificateCheckCode_;
+ }
+
+ /**
+ * @param certificateCheckCode
+ * The certificateCheckCode to set.
+ */
+ public void setCertificateCheckCode(String certificateCheckCode)
+ {
+ if (logger_.isDebugEnabled())
+ {
+ logger_.debug("setCertificateCheckCode:" + certificateCheckCode);
+ }
+ certificateCheckCode_ = certificateCheckCode;
+ }
+
+ /**
+ * @return Returns the signatureCheckCode.
+ */
+ public String getSignatureCheckCode()
+ {
+ return signatureCheckCode_;
+ }
+
+ /**
+ * @param signatureCheckCode
+ * The signatureCheckCode to set.
+ */
+ public void setSignatureCheckCode(String signatureCheckCode)
+ {
+ if (logger_.isDebugEnabled())
+ {
+ logger_.debug("setSignatureCheckCode:" + signatureCheckCode);
+ }
+ signatureCheckCode_ = signatureCheckCode;
+ }
+
+ /**
+ * @return Returns the signatureManifestCheckCode.
+ */
+ public String getSignatureManifestCheckCode()
+ {
+ return signatureManifestCheckCode_;
+ }
+
+ /**
+ * @param signatureManifestCheckCode
+ * The signatureManifestCheckCode to set.
+ */
+ public void setSignatureManifestCheckCode(String signatureManifestCheckCode)
+ {
+ if (logger_.isDebugEnabled())
+ {
+ logger_.debug("setSignatureManifestCheckCode:" + signatureManifestCheckCode);
+ }
+ signatureManifestCheckCode_ = signatureManifestCheckCode;
+ }
+
+ /**
+ * @return Returns the x509IssuerName.
+ */
+ public String getX509IssuerName()
+ {
+ return x509IssuerName;
+ }
+
+ /**
+ * @param issuerName
+ * The x509IssuerName to set.
+ */
+ public void setX509IssuerName(String issuerName)
+ {
+ if (logger_.isDebugEnabled())
+ {
+ logger_.debug("setX509IssuerName:" + issuerName);
+ }
+ x509IssuerName = issuerName;
+ }
+
+ /**
+ * @return Returns the x509SerialNumber.
+ */
+ public String getX509SerialNumber()
+ {
+ return x509SerialNumber;
+ }
+
+ /**
+ * @param serialNumber
+ * The x509SerialNumber to set.
+ */
+ public void setX509SerialNumber(String serialNumber)
+ {
+ if (logger_.isDebugEnabled())
+ {
+ logger_.debug("setX509SerialNumber:" + serialNumber);
+ }
+ x509SerialNumber = serialNumber;
+ }
+
+ /**
+ * @return Returns the x509SubjectName.
+ */
+ public String getX509SubjectName()
+ {
+ return x509SubjectName_;
+ }
+
+ /**
+ * @param subjectName
+ * The x509SubjectName to set.
+ */
+ public void setX509SubjectName(String subjectName)
+ {
+ if (logger_.isDebugEnabled())
+ {
+ logger_.debug("setX509SubjectName:" + subjectName);
+ }
+ x509SubjectName_ = subjectName;
+ }
+
+ /**
+ * @return Returns the certificateCheckInfo.
+ */
+ public String getCertificateCheckInfo()
+ {
+ if (certificateCheckInfo_ == null)
+ {
+ if (settings_ != null)
+ {
+ certificateCheckInfo_ = settings_.getValueFromKey(SIG_RESP_KEY + "certificateCheckInfo." + getCertificateCheckCode());
+ }
+ }
+ if (certificateCheckInfo_ == null)
+ {
+ certificateCheckInfo_ = SIG_RESP_DEFAULT_INFO + getCertificateCheckCode();
+ }
+ return certificateCheckInfo_;
+ }
+
+ /**
+ * @param certificateCheckInfo
+ * The certificateCheckInfo to set.
+ */
+ public void setCertificateCheckInfo(String certificateCheckInfo)
+ {
+ if (logger_.isDebugEnabled())
+ {
+ logger_.debug("setCertificateCheckInfo:" + certificateCheckInfo);
+ }
+ certificateCheckInfo_ = certificateCheckInfo;
+ }
+
+ /**
+ * @return Returns the signatureCheckInfo.
+ */
+ public String getSignatureCheckInfo()
+ {
+ if (signatureCheckInfo_ == null)
+ {
+ if (settings_ != null)
+ {
+ signatureCheckInfo_ = settings_.getValueFromKey(SIG_RESP_KEY + "signatureCheckInfo." + getSignatureCheckCode());
+ }
+ }
+ if (signatureCheckInfo_ == null)
+ {
+ signatureCheckInfo_ = SIG_RESP_DEFAULT_INFO + getSignatureCheckCode();
+ }
+ return signatureCheckInfo_;
+ }
+
+ /**
+ * @param signatureCheckInfo
+ * The signatureCheckInfo to set.
+ */
+ public void setSignatureCheckInfo(String signatureCheckInfo)
+ {
+ if (logger_.isDebugEnabled())
+ {
+ logger_.debug("setSignatureCheckInfo:" + signatureCheckInfo);
+ }
+ signatureCheckInfo_ = signatureCheckInfo;
+ }
+
+ /**
+ * @return Returns the signatureManifestCheckInfo.
+ */
+ public String getSignatureManifestCheckInfo()
+ {
+ if (signatureManifestCheckInfo_ == null)
+ {
+ if (settings_ != null)
+ {
+ signatureManifestCheckInfo_ = settings_.getValueFromKey(SIG_RESP_KEY + "signatureManifestCheckInfo." + getSignatureManifestCheckCode());
+ }
+ }
+ if (signatureManifestCheckInfo_ == null)
+ {
+ signatureManifestCheckInfo_ = SIG_RESP_DEFAULT_INFO + getSignatureManifestCheckCode();
+ }
+ return signatureManifestCheckInfo_;
+ }
+
+ /**
+ * @param signatureManifestCheckInfo
+ * The signatureManifestCheckInfo to set.
+ */
+ public void setSignatureManifestCheckInfo(String signatureManifestCheckInfo)
+ {
+ if (logger_.isDebugEnabled())
+ {
+ logger_.debug("setSignatureManifestCheckInfo:" + signatureManifestCheckInfo);
+ }
+ signatureManifestCheckInfo_ = signatureManifestCheckInfo;
+ }
+
+ /**
+ * Returns the X.509 certificate of this response.
+ *
+ * @return Returns the X.509 certificate of this response.
+ */
+ public X509Cert getCertificate()
+ {
+ return certificate_;
+ }
+
+ /**
+ * Sets the X.509 certificate of this response.
+ *
+ * @param certificate
+ * The X.509 certificate to be set.
+ */
+ public void setCertificate(X509Cert certificate)
+ {
+ this.certificate_ = certificate;
+ }
+
+ /**
+ * Returns a list of Strings each stating one public property of the
+ * certificate.
+ *
+ * <p>
+ * Such public properties are certificate extensions each being assigned an
+ * own OID. For example the public property "Verwaltungseigenschaft" has the
+ * OID "1.2.40.0.10.1.1.1".
+ * </p>
+ * <p>
+ * This methods reads out the list of possible properties from the config file
+ * and compares these to the extensions defined on the certificate. If they
+ * match, a String containing useful information about the property is added
+ * to the list returned.
+ * </p>
+ *
+ * @return Returns the list of Strings representing the public properties of
+ * this certificate, if any.
+ * @throws SettingNotFoundException
+ */
+ public List getPublicProperties() throws SettingNotFoundException
+ {
+ List props = new ArrayList();
+
+ SettingsReader settings = this.settings_;
+
+ String root_oid = settings.getSetting("oid.root");
+
+ PropertyTree oids = settings.getPTree().getSubTree("oid");
+
+ Set non_critial_oids = this.certificate_.getX509Certificate().getNonCriticalExtensionOIDs();
+ Iterator ext_it = non_critial_oids.iterator();
+ while (ext_it.hasNext())
+ {
+ String oid = (String) ext_it.next();
+
+ if (oid.startsWith(root_oid))
+ {
+ String key = oid.replaceAll("\\.", "_");
+
+ String value = oids.getLastValue(key);
+ if (value == null)
+ {
+ value = oid;
+ }
+
+ props.add(value);
+ }
+ }
+
+ return props;
+ }
+
+ /**
+ * The toString method
+ */
+ public String toString()
+ {
+ String str = "";
+ str += "\nSignator:" + getX509SubjectName();
+ str += "\nAusteller:" + getX509IssuerName();
+ str += "\nSeriennummer:" + getX509SerialNumber();
+ str += "\nZertifikat-Code:" + getCertificateCheckCode() + "=" + getCertificateCheckInfo();
+ str += "\nSignatur-Check-Code:" + getSignatureCheckCode() + "=" + getSignatureCheckInfo();
+ str += "\nManifest-Check-Code:" + getSignatureManifestCheckCode() + "=" + getSignatureManifestCheckInfo();
+ return str;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/sig/SignatureSeparator.java b/src/main/java/at/knowcenter/wag/egov/egiz/sig/SignatureSeparator.java
new file mode 100644
index 0000000..3a210fa
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/egov/egiz/sig/SignatureSeparator.java
@@ -0,0 +1,139 @@
+/*
+ * <copyright>
+ * Copyright (c) 2006 by Know-Center, Graz, Austria
+ * </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF THE
+ * SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE,
+ * OR NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES
+ * SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING
+ * THIS SOFTWARE OR ITS DERIVATIVES.
+ *
+ * $Id: SignatureSeparator.java,v 1.4 2006/10/31 08:18:56 wprinz Exp $
+ */
+package at.knowcenter.wag.egov.egiz.sig;
+
+import java.util.List;
+import java.util.Stack;
+
+import at.knowcenter.wag.egov.egiz.exceptions.SignatureException;
+import at.knowcenter.wag.egov.egiz.exceptions.SignatureTypesException;
+
+/**
+ * This class separates all signature blocks in a raw text.
+ */
+public class SignatureSeparator {
+ /**
+ * The signature block stack. On top of the stack is the first signature block that can be
+ * extracted. First means nearest to the document text.
+ */
+ private Stack signatureBlocks_ = null;
+ /**
+ * A list of signature type definitions.
+ */
+ private List signatureTypes_ = null;
+ /**
+ * Indicator that shows that a raw text is signated
+ */
+ private boolean hasSignatureBlock_ = false;
+
+ /**
+ * The empty constructor. It loads all signature type infos to extract the signature block from
+ * the raw text.
+ *
+ * @throws SignatureTypesException
+ */
+ public SignatureSeparator() throws SignatureTypesException {
+ SignatureTypes sig_types = SignatureTypes.getInstance();
+ signatureTypes_ = sig_types.getSignatureTypeDefinitions();
+ }
+
+ /**
+ * This method takes a raw text as input and trys to separate all signature blocks. It returns
+ * true if a signature block is found.
+ *
+ * @param rawText
+ * @return true if a signature block is found false otherwise
+ */
+ public boolean separateBlock(String rawText) {
+ signatureBlocks_ = new Stack();
+ hasSignatureBlock_ = separateBlock(rawText, rawText.length());
+ return hasSignatureBlock_;
+ }
+
+ /**
+ * This method calls itself rekursively while signature blocks can be extracted. If a signature
+ * block is found (search from the bottom of the raw text) the raw text would be reduced by the
+ * length of the found signature block text.
+ *
+ * @param rawText the text to be separated
+ * @param endIndex the index to cut the tail from the raw text
+ * @return true if a signature block is found false otherwise
+ */
+ private boolean separateBlock(String rawText, int endIndex) {
+ boolean found = false;
+ boolean can_separate = true;
+ while (can_separate) {
+ SignatureBlock sig_block = new SignatureBlock(signatureTypes_);
+ String raw_text = rawText.substring(0, endIndex);
+ can_separate = sig_block.separateBlockFromRawText(raw_text, true);
+ if (can_separate) {
+ signatureBlocks_.push(sig_block);
+ endIndex = sig_block.getStartIndex();
+ found = true;
+ }
+ }
+ return found;
+ }
+
+ /**
+ * This method returns the start index of the first signature block. It is used to separate the
+ * real document text from the signature block texts.
+ *
+ * @return the start index of the first signature block
+ */
+ public int getStartIndex() {
+ int start_index = -1;
+ if (signatureBlocks_ != null && signatureBlocks_.size() > 0) {
+ SignatureBlock sig_block = (SignatureBlock) signatureBlocks_.peek();
+ return sig_block.getStartIndex();
+ }
+ return start_index;
+ }
+
+ /**
+ * @return the first found signature object in the given raw text or null if the raw text does not
+ * contain any signature objects
+ */
+ public SignatureObject getFirstSignatureObject() {
+ if (signatureBlocks_ != null && signatureBlocks_.size() > 0) {
+ SignatureBlock sig_block = (SignatureBlock) signatureBlocks_.peek();
+ try {
+ return sig_block.getSignatureObject();
+ } catch (SignatureException e) {
+ return null;
+ }
+ }
+ return null;
+ }
+
+ /**
+ * @return all separated signature blocks as stack, first is on top
+ */
+ public Stack getSignatureBlocks() {
+ return signatureBlocks_;
+ }
+
+ /**
+ * @return true if a signature block is found false otherwise
+ */
+ public boolean hasSignatureBlock() {
+ return hasSignatureBlock_;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/sig/SignatureTypeDefinition.java b/src/main/java/at/knowcenter/wag/egov/egiz/sig/SignatureTypeDefinition.java
new file mode 100644
index 0000000..4b14019
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/egov/egiz/sig/SignatureTypeDefinition.java
@@ -0,0 +1,423 @@
+/*
+ * <copyright> Copyright (c) 2006 by Know-Center, Graz, Austria </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+ * NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
+ * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES.
+ *
+ * $Id: SignatureTypeDefinition.java,v 1.3 2006/08/25 17:09:41 wprinz Exp $
+ */
+package at.knowcenter.wag.egov.egiz.sig;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Vector;
+
+import at.knowcenter.wag.egov.egiz.cfg.SettingsReader;
+import at.knowcenter.wag.egov.egiz.exceptions.SignatureException;
+
+public class SignatureTypeDefinition implements Serializable
+{
+
+ /**
+ * SVUID.
+ */
+ private static final long serialVersionUID = 1327407307346061147L;
+
+ /**
+ * The type of this definition
+ */
+ private String type_ = null;
+
+ /**
+ * A map of all key to caption tupls.
+ */
+ private Map keyCaptionMap_ = new HashMap();
+
+ /**
+ * A map of all key to value tupls.
+ */
+ private Map keyValueMap_ = new HashMap();
+
+ /**
+ * A list of sorted keys
+ */
+ private Vector sortedKeys_ = null;
+
+ /**
+ * A list of sorted captions
+ */
+ private Vector sortedCaptions_ = null;
+
+ /**
+ * A revert of sorted keys
+ */
+ private Vector revertSortedKeys_ = new Vector();
+
+ /**
+ * A revert list of sorted captions
+ */
+ private Vector revertSortedCaptions_ = new Vector();
+
+ /**
+ * The settings reader reference
+ */
+ private SettingsReader settings_ = null;
+
+ /**
+ * The constructor of the signature type definition. It reads the configured
+ * table definition of the signature block and load the type definition of a
+ * given type.
+ *
+ * @param settings
+ * a SettingsReader instance
+ * @param type
+ * the signature type to load
+ * @throws SignatureException
+ * @see SettingsReader
+ */
+ public SignatureTypeDefinition(SettingsReader settings, String type) throws SignatureException
+ {
+ settings_ = settings;
+ type_ = type;
+ readSigTable(SignatureTypes.MAIN_TABLE);
+ loadTypeDefinition();
+ readFieldDefinitions();
+ }
+
+ /**
+ * Load the configured signature type definitions. It reads all key-captions
+ * tupls that are used in the signature table. It also reads all key-value
+ * tupls.
+ *
+ * @throws SignatureException
+ */
+ private void loadTypeDefinition() throws SignatureException
+ {
+ if (sortedKeys_ == null)
+ {
+ sortKeys();
+ }
+
+ String key_prefix = SignatureTypes.SIG_OBJ + type_ + ".key";
+ ArrayList keys = settings_.getKeys(key_prefix);
+ if (keys == null)
+ {
+ SignatureException se = new SignatureException(100, "There is no key defined for type:" + type_);
+ ;
+ throw se;
+ }
+ for (int key_idx = 0; key_idx < keys.size(); key_idx++)
+ {
+ String sig_key = (String) keys.get(key_idx);
+ String sig_key_val = settings_.getValueFromKey(key_prefix + "." + sig_key);
+ if (sortedKeys_.contains(sig_key))
+ {
+ keyCaptionMap_.put(sig_key, sig_key_val);
+ }
+ }
+ String value_prefix = SignatureTypes.SIG_OBJ + type_ + ".value";
+ ArrayList values = settings_.getKeys(value_prefix);
+ if (values != null)
+ {
+ for (int key_idx = 0; key_idx < values.size(); key_idx++)
+ {
+ String val_key = (String) values.get(key_idx);
+ String val_key_val = settings_.getValueFromKey(value_prefix + "." + val_key);
+ keyValueMap_.put(val_key, val_key_val);
+ }
+ }
+ }
+
+ /**
+ * This method reads the table definition of singature type. It takes care
+ * about the linearization of the defined key-value pairs or sub tables. The
+ * linearisation is done reading a table from left to right and top to bottom.
+ * A sub table is alwais a normal cell element in the linearisation prozess.
+ * If a sub table exists therefore the linearisation of the subtable is taken
+ * es cell element in the parent table. t This method stores a revert sorted
+ * linearisation list of used keys in the table. This method is called
+ * recursivley if defined nested tables.
+ *
+ * @param tableKey
+ * the name of the table definition
+ */
+ private void readSigTable(String tableKey)
+ {
+ // System.err.println("read table:" + type_ + "." + tableKey);
+ String table_key_prefix = SignatureTypes.SIG_OBJ + type_ + "." + SignatureTypes.TABLE;
+ String table_key = table_key_prefix + tableKey;
+ String key_prefix = SignatureTypes.SIG_OBJ + type_ + ".key.";
+
+ // ArrayList table_def_keys = settings_.getKeys(table_key);
+ Vector table_def_keys = settings_.getSettingKeys(table_key);
+ if (table_def_keys != null)
+ {
+ for (int table_key_idx = 0; table_key_idx < table_def_keys.size(); table_key_idx++)
+ {
+ String table_row_id = (String) table_def_keys.get(table_key_idx);
+ String table_def_keys_name = table_key + "." + table_row_id;
+ String table_def_string = settings_.getValueFromKey(table_def_keys_name);
+ if (table_row_id.matches("\\D*"))
+ {
+ continue;
+ }
+ if (table_def_string != null)
+ {
+ // analyse the row definition
+ String[] elems = table_def_string.split("\\|");
+ // ArrayList row = new ArrayList();
+ int elem_idx = elems.length;
+ while (elem_idx > 0)
+ {
+ elem_idx--;
+ String elem = elems[elem_idx];
+ String[] key_type = elem.split("-");
+ if (key_type.length < 2)
+ {
+ return;
+ }
+ String key = key_type[0];
+ String type = key_type[1];
+ // System.err.println("key:" + type_ + "." + tableKey +
+ // "." + key + "=" + type);
+
+ if (SignatureTypes.TYPE_TABLE.equals(key))
+ {
+ // read sub table
+ readSigTable(type);
+ }
+ if (SignatureTypes.TYPE_IMAGE.equals(type))
+ {
+ // ignore images
+ }
+ if (SignatureTypes.TYPE_VALUE.equals(type))
+ {
+ String sig_key_val = settings_.getValueFromKey(key_prefix + key);
+ if (sig_key_val != null)
+ {
+ revertSortedKeys_.add(key);
+ revertSortedCaptions_.add(sig_key_val);
+ }
+ // ignore values without caption
+ }
+ if ((SignatureTypes.TYPE_VALUE + SignatureTypes.TYPE_CAPTION).equals(type) || (SignatureTypes.TYPE_CAPTION + SignatureTypes.TYPE_VALUE).equals(type))
+ {
+ String sig_key_val = settings_.getValueFromKey(key_prefix + key);
+ if (sig_key_val != null)
+ {
+ revertSortedKeys_.add(key);
+ revertSortedCaptions_.add(sig_key_val);
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * @return Returns the keys.
+ */
+ public Map getKeyCaptionMap()
+ {
+ return keyCaptionMap_;
+ }
+
+ /**
+ * @return Returns the keyValueMap.
+ */
+ public Map getKeyValueMap()
+ {
+ return keyValueMap_;
+ }
+
+ /**
+ * Returns a caption to a given key
+ *
+ * @param key
+ * @return the caption or null if the key is not found
+ */
+ public String getCaptionFromKey(String key)
+ {
+ return (String) keyCaptionMap_.get(key);
+ }
+
+ /**
+ * Returns a value to given key
+ *
+ * @param key
+ * @return the value or null if the key is not found
+ */
+ public String getValueFromKey(String key)
+ {
+ return (String) keyValueMap_.get(key);
+ }
+
+ /**
+ * @return Returns the sortedKeys.
+ */
+ public Vector getSortedKeys()
+ {
+ if (sortedKeys_ == null)
+ {
+ sortKeys();
+ }
+ return sortedKeys_;
+ }
+
+ /**
+ * @return Returns the sortedCaptions.
+ */
+ public Vector getSortedCaptions()
+ {
+ if (sortedCaptions_ == null)
+ {
+ sortKeys();
+ }
+ return sortedCaptions_;
+ }
+
+ /**
+ * @return Returns the revertSortedCaptions.
+ */
+ public Vector getRevertSortedCaptions()
+ {
+ return revertSortedCaptions_;
+ }
+
+ /**
+ * @return Returns the revertSortedKeys.
+ */
+ public Vector getRevertSortedKeys()
+ {
+ return revertSortedKeys_;
+ }
+
+ /**
+ * This method sort the reverted sorted key-caption and key-value lists.
+ *
+ */
+ private void sortKeys()
+ {
+ // String key_prefix = SignatureTypes.SIG_OBJ + type_ + ".key.";
+ sortedKeys_ = new Vector(revertSortedKeys_.size());
+ sortedCaptions_ = new Vector(revertSortedCaptions_.size());
+ for (int key_idx = revertSortedKeys_.size() - 1; key_idx >= 0; key_idx--)
+ {
+ sortedKeys_.add(revertSortedKeys_.get(key_idx));
+ sortedCaptions_.add(revertSortedCaptions_.get(key_idx));
+ }
+ }
+
+ /**
+ * This method checks if a given key is defined.
+ *
+ * @param key
+ * to find
+ * @return true if the key is find false otherwise
+ */
+ public boolean contains(String key)
+ {
+ return (keyValueMap_.get(key) != null);
+ }
+
+ /**
+ * The standard toString method. Used for internal tests only.
+ */
+ public String toString()
+ {
+ String strg = this.type_ + "\n";
+ Vector sk = getSortedKeys();
+ Vector sc = getSortedCaptions();
+ for (int i = 0; i < sk.size(); i++)
+ {
+ strg += sk.get(i) + "=" + sc.get(i) + "\n";
+ }
+ return strg;
+ }
+
+ /**
+ * @return Returns the signature type string.
+ */
+ public String getType()
+ {
+ return type_;
+ }
+
+ /**
+ * @return Returns the signature type description.
+ */
+ public String getDescription()
+ {
+ String descr_key = SignatureTypes.SIG_OBJ + type_ + ".description";
+ return settings_.getValueFromKey(descr_key);
+ }
+
+ protected String getSettingsKeyBase()
+ {
+ return SignatureTypes.SIG_OBJ + type_;
+ }
+
+ /**
+ * Gets the field definition of the given Field.
+ *
+ * @param field_name
+ * The name of the field.
+ * @return Returns the field's definition.
+ */
+ public SignatureFieldDefinition readFieldDefinition(String field_name)
+ {
+ SignatureFieldDefinition sfd = new SignatureFieldDefinition();
+
+ sfd.field_name = field_name;
+ sfd.caption = this.settings_.getValueFromKey(getSettingsKeyBase() + ".key." + field_name);
+ sfd.value = this.settings_.getValueFromKey(getSettingsKeyBase() + type_ + ".value." + field_name);
+ sfd.placeholder_length = -1;
+ String phlen_str = this.settings_.getValueFromKey(getSettingsKeyBase() + ".phlength." + field_name);
+ if (phlen_str == null)
+ {
+ phlen_str = this.settings_.getValueFromKey("defaults.phlength." + field_name);
+ }
+ if (phlen_str != null)
+ {
+ sfd.placeholder_length = Integer.parseInt(phlen_str);
+ }
+
+ return sfd;
+ }
+
+ List field_definitions_ = null;
+
+ protected void readFieldDefinitions()
+ {
+ this.field_definitions_ = new ArrayList();
+ for (int i = 0; i < this.sortedKeys_.size(); i++)
+ {
+ String key = (String) this.sortedKeys_.get(i);
+ SignatureFieldDefinition sfd = readFieldDefinition(key);
+ //sfd.brev = SignatureTypes.ALL_SIG_BREV[i];
+ this.field_definitions_.add(sfd);
+ }
+ }
+
+ /**
+ * Returns the list of field definitions of this Signature profile.
+ * @return Returns the list of field definitions of this Signature profile.
+ */
+ public List getFieldDefinitions()
+ {
+ return this.field_definitions_;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/sig/SignatureTypes.java b/src/main/java/at/knowcenter/wag/egov/egiz/sig/SignatureTypes.java
new file mode 100644
index 0000000..0350129
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/egov/egiz/sig/SignatureTypes.java
@@ -0,0 +1,462 @@
+/*
+ * <copyright> Copyright (c) 2006 by Know-Center, Graz, Austria </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+ * NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
+ * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES.
+ *
+ * $Id: SignatureTypes.java,v 1.5 2006/10/31 08:18:56 wprinz Exp $
+ */
+package at.knowcenter.wag.egov.egiz.sig;
+
+import java.awt.Color;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Vector;
+
+import org.apache.log4j.Logger;
+
+import at.knowcenter.wag.egov.egiz.cfg.ConfigLogger;
+import at.knowcenter.wag.egov.egiz.cfg.SettingsReader;
+import at.knowcenter.wag.egov.egiz.exceptions.SettingsException;
+import at.knowcenter.wag.egov.egiz.exceptions.SignatureException;
+import at.knowcenter.wag.egov.egiz.exceptions.SignatureTypesException;
+import at.knowcenter.wag.egov.egiz.table.Style;
+import at.knowcenter.wag.exactparser.ByteArrayUtils;
+
+public class SignatureTypes
+{
+
+ /**
+ * The settings key prefix for signature definitions. <code>"sig_obj."</code>
+ */
+ public static final String SIG_OBJ = "sig_obj.";
+
+ /**
+ * The settings key prefix for signature object types
+ */
+ public static final String TYPES = SIG_OBJ + "types";
+
+ /**
+ * The settings key prefix for the default signature object type
+ */
+ public static final String DEFAULT_TYPE = SIG_OBJ + "type.default";
+
+ /**
+ * The settings key postfix for the type description
+ */
+ public static final String SIG_DESCR = "description";
+
+ /**
+ * The state value activating an signature definition
+ */
+ private static final String STATE_ON = "on";
+
+ // /**
+ // * The state value de activating an signature definition
+ // */
+ // private static final String STATE_OFF = "off";
+
+ /**
+ * The settings key prefix for the signature table object definition
+ */
+ public static final String TABLE = "table.";
+
+ /**
+ * The settings key sub prefix getting the main table definition
+ */
+ public static final String MAIN_TABLE = "main";
+
+ /**
+ * The settings value refering to a table
+ */
+ public final static String TYPE_TABLE = "TABLE";
+
+ /**
+ * The settings value refering to an image
+ */
+ public final static String TYPE_IMAGE = "i";
+
+ /**
+ * The settings value refering to a text caption
+ */
+ public final static String TYPE_CAPTION = "c";
+
+ /**
+ * The settings value refering to a text value
+ */
+ public final static String TYPE_VALUE = "v";
+
+ /**
+ * The settings key sub prefix getting the width of columns for a table
+ * definition
+ */
+ public final static String COLS_WITH = "ColsWidth";
+
+ /**
+ * The settings key sub prefix getting the style definition
+ */
+ public final static String STYLE = "Style";
+
+ /**
+ * The default style definition for images.
+ */
+ private Style defaultImageStyle_ = new Style();
+
+ /**
+ * The default style definition for captions.
+ */
+ private Style defaultCaptionStyle_ = new Style();
+
+ /**
+ * The default style definition for values.
+ */
+ private Style defaultValueStyle_ = new Style();
+
+ /**
+ * Standard key get/set the singature name
+ */
+ public static final String SIG_NAME = "SIG_NAME";
+
+ /**
+ * Standard key get/set the signature date
+ */
+ public static final String SIG_DATE = "SIG_DATE";
+
+ /**
+ * Standard key get/set the signator issuer
+ */
+ public static final String SIG_ISSUER = "SIG_ISSUER";
+
+ /**
+ * Standard key get/set the siganture value
+ */
+ public static final String SIG_VALUE = "SIG_VALUE";
+
+ /**
+ * Standard key get/set the normalisation method used
+ */
+ public static final String SIG_NORM = "SIG_NORM";
+
+ /**
+ * Standard key get/set the signation id's used by BKU signated documents
+ */
+ public static final String SIG_ID = "SIG_ID";
+
+ /**
+ * The EGIZ Algorithm "Kennzeichnung".
+ */
+ public static final String SIG_KZ = "SIG_KZ";
+
+ /**
+ * Standard key get/set the reference to the signature label (image mark)
+ */
+ public static final String SIG_LABEL = "SIG_LABEL";
+
+ /**
+ * Standard key get/set the serial number of the signature
+ */
+ public static final String SIG_NUMBER = "SIG_NUMBER";
+
+ // public static final String SIG_TYPE = "SIG_TYPE";
+ /**
+ * Standard key get/set the signature meta informations
+ */
+ public static final String SIG_META = "SIG_META";
+
+ /**
+ * The logger definition.
+ */
+ private static final Logger logger_ = ConfigLogger.getLogger(SignatureTypes.class);
+
+ // /**
+ // * The normalizer reference
+ // */
+ // private Normalizer normalizer_ = null;
+
+ /**
+ * The settings reader reference
+ */
+ private SettingsReader settings_ = null;
+
+ // /**
+ // * The reference to the settings property tree
+ // */
+ // private PropertyTree pTree_ = null;
+
+ // /**
+ // * The current signature type used reading and analysing the property tree
+ // */
+ // private String sigType_ = null;
+
+ // /**
+ // * List of all keys used in the current signature definition
+ // */
+ // private ArrayList sigKeys_ = null;
+
+ /**
+ * Array of required signature keys
+ */
+ // public static String[] REQUIRED_SIG_KEYS = new String[]{SIG_NAME, SIG_DATE,
+ // SIG_ISSUER, SIG_VALUE, SIG_NUMBER, SIG_ID};
+ public static String[] REQUIRED_SIG_KEYS = new String[] { SIG_DATE,
+ SIG_ISSUER, SIG_VALUE, SIG_NUMBER, SIG_ID };
+
+ /**
+ * Tells, if the given key is a required key.
+ * <p>
+ * Note that the SIG_KZ is a required key.
+ * </p>
+ * @param key The key to be tested if it is a required key.
+ * @return Returns true, if the key is required, false otherwise.
+ */
+ public static boolean isRequiredKey (String key)
+ {
+ if (key.equals(SIG_KZ))
+ {
+ return true;
+ }
+
+ for (int i = 0; i < REQUIRED_SIG_KEYS.length; i++)
+ {
+ if (key.equals(REQUIRED_SIG_KEYS[i]))
+ {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public static String[] ALL_SIG_KEYS = new String[] { SIG_NAME, SIG_DATE,
+ SIG_ISSUER, SIG_VALUE, SIG_NORM, SIG_ID, SIG_LABEL, SIG_NUMBER, SIG_META };
+
+ public static byte [][] ALL_SIG_BREV = new byte[][] { { 'n', 'a', 'm' },
+ { 'd', 'a', 't' }, { 'i', 's', 's' }, { 'v', 'a', 'l' },
+ { 'n', 'o', 'r' }, { 's', 'i', 'd' }, { 'l', 'a', 'b' },
+ { 's', 'n', 'r' }, { 'm', 'e', 't' } };
+
+ // /**
+ // * Sorted representation of keys defined in rows
+ // */
+ // private ArrayList sortedSigKeys_ = new ArrayList();
+
+ // /**
+ // * Reference from signature key to there corresponding value
+ // */
+ // private Hashtable sigEntries_ = new Hashtable(8);
+
+ /**
+ * A list of all configured signature type definitions
+ */
+ private List signatureTypeDefinitions_ = new Vector();
+
+ /**
+ * A type-name to type-definition map
+ */
+ private Map typeDefMap_ = new HashMap();
+
+ // /**
+ // * A map of required keys used to reconstruct a signature block
+ // */
+ // private static HashMap requiredSigKeys_ = new HashMap();
+
+ /**
+ * A plain list of signature type names
+ */
+ ArrayList typeList_ = new ArrayList(4);
+
+ /**
+ * Used as singleton to read the singnature type definitions only one times of
+ * a session
+ */
+ private static SignatureTypes instance_ = null;
+
+ /**
+ * This is the private constructor method to provide a singleton instance of
+ * this class. It inits a normalizer, the settings reader, read the default
+ * styles and load the configured signature types.
+ *
+ * @throws SignatureTypesException
+ * @see SettingsReader
+ */
+ private SignatureTypes() throws SignatureTypesException
+ {
+ try
+ {
+ loadSettings();
+ }
+ catch (SettingsException e)
+ {
+ throw new SignatureTypesException(e);
+ }
+ setDefaultStyles();
+ loadSignatureTypes();
+ }
+
+ /**
+ * This static method returns the stored instance of this class. If the
+ * singleton does not exist, this method creates a new singleton and gives
+ * this instance back to the caller.
+ *
+ * @return the stored instance of this class
+ * @throws SignatureTypesException
+ */
+ public static SignatureTypes getInstance() throws SignatureTypesException
+ {
+ if (instance_ == null)
+ {
+ instance_ = new SignatureTypes();
+ }
+ return instance_;
+ }
+
+ /**
+ * This method load the signature definitions
+ *
+ * @throws SettingsException
+ *
+ * @throws SettingsException
+ * ErrorCode:101
+ */
+ private void loadSettings() throws SettingsException
+ {
+ if (settings_ == null)
+ {
+ settings_ = SettingsReader.getInstance();
+ }
+ // pTree_ = settings_.getPTree();
+ }
+
+ /**
+ * This method set the default styles for images, captions and values.
+ */
+ private void setDefaultStyles()
+ {
+ defaultImageStyle_.setPadding(3);
+ defaultImageStyle_.setHAlign(Style.CENTER);
+ defaultImageStyle_.setVAlign(Style.MIDDLE);
+ defaultImageStyle_.setBgColor(new Color(255, 255, 255));
+
+ defaultCaptionStyle_.setHAlign(Style.CENTER);
+ defaultCaptionStyle_.setVAlign(Style.MIDDLE);
+
+ defaultValueStyle_.setVAlign(Style.MIDDLE);
+ }
+
+ /**
+ * This method load the configured signature types. It stores the definition
+ * representations only if the type is set to ON. It stores the type
+ * definition object, the definition map and the simple type name list.
+ */
+ private void loadSignatureTypes()
+ {
+ if (settings_ != null)
+ {
+ ArrayList types = settings_.getKeys(TYPES);
+ for (int type_idx = 0; type_idx < types.size(); type_idx++)
+ {
+ String type = (String) types.get(type_idx);
+ if (STATE_ON.equals(settings_.getSetting(TYPES + "." + type, null)))
+ {
+ SignatureTypeDefinition sig_type_def;
+ try
+ {
+ sig_type_def = new SignatureTypeDefinition(settings_, type);
+ signatureTypeDefinitions_.add(sig_type_def);
+ typeDefMap_.put(type, sig_type_def);
+ typeList_.add(type);
+ }
+ catch (SignatureException e)
+ {
+ if (logger_.isDebugEnabled())
+ {
+ logger_.debug(e.getMessage());
+ }
+ e.printStackTrace();
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * @return a arrayList (String) of signature types
+ */
+ public ArrayList getSignatureTypes()
+ {
+ return typeList_;
+ }
+
+ /**
+ * @return a list of signature type definitions
+ */
+ public List getSignatureTypeDefinitions()
+ {
+ return signatureTypeDefinitions_;
+ }
+
+ /**
+ * This method returns the corresponding signature type definition to a given
+ * type key
+ *
+ * @param type
+ * the key to get the signature type definition
+ * @return the stored signature type definition
+ */
+ public SignatureTypeDefinition getSignatureTypeDefinition(String type)
+ {
+ return (SignatureTypeDefinition) typeDefMap_.get(type);
+ }
+
+ public static String convertBrevToType (final byte [] brev)
+ {
+ for (int i = 0; i < ALL_SIG_BREV.length; i++)
+ {
+ if (ByteArrayUtils.compareByteArrays(ALL_SIG_BREV[i], 0, brev))
+ {
+ return ALL_SIG_KEYS[i];
+ }
+ }
+ return null;
+ }
+
+ public static byte [] convertTypeToBrev (final String type)
+ {
+ for (int i = 0; i < ALL_SIG_KEYS.length; i++)
+ {
+ if (ALL_SIG_KEYS.equals(type))
+ {
+ return ALL_SIG_BREV[i];
+ }
+ }
+ return null;
+ }
+
+ /**
+ * The standard toString method. Used for testing only.
+ *
+ * @return the string representation of the class
+ */
+ public String toString()
+ {
+ String strg = "";
+ for (int i = 0; i < signatureTypeDefinitions_.size(); i++)
+ {
+ SignatureTypeDefinition std = (SignatureTypeDefinition) signatureTypeDefinitions_.get(i);
+ strg += "----------TYPE:" + std.getType() + "----------\n";
+ strg += std.toString();
+ }
+ return strg;
+ }
+
+} \ No newline at end of file
diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/sig/X509Cert.java b/src/main/java/at/knowcenter/wag/egov/egiz/sig/X509Cert.java
new file mode 100644
index 0000000..64631cb
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/egov/egiz/sig/X509Cert.java
@@ -0,0 +1,462 @@
+/*
+ * <copyright> Copyright (c) 2006 by Know-Center, Graz, Austria </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+ * NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
+ * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES.
+ *
+ * $Id: X509Cert.java,v 1.4 2006/08/25 17:09:41 wprinz Exp $
+ */
+package at.knowcenter.wag.egov.egiz.sig;
+
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.Serializable;
+import java.security.PublicKey;
+import java.security.cert.CertificateEncodingException;
+import java.security.cert.CertificateFactory;
+import java.security.cert.CertificateParsingException;
+import java.security.cert.X509Certificate;
+import java.util.List;
+
+import org.apache.log4j.Logger;
+
+import at.knowcenter.wag.egov.egiz.cfg.ConfigLogger;
+import at.knowcenter.wag.egov.egiz.tools.CodingHelper;
+import at.knowcenter.wag.egov.egiz.tools.FileHelper;
+
+public class X509Cert implements Serializable
+{
+
+ /**
+ * SVUID.
+ */
+ private static final long serialVersionUID = 6945327015386694557L;
+
+ /**
+ * The x509 certificate binary string Base64 coded
+ */
+ private String certString_ = null;
+
+ /**
+ * The name value of the issuer
+ */
+ private String issuerName_ = null;
+
+ /**
+ * The serial number of the certificate
+ */
+ private String serialNumber_ = null;
+
+ /**
+ * The digest value of the certificate
+ */
+ private String certDigest_ = null;
+
+ /**
+ * The name value of the subject
+ */
+ private String subjectName_ = null;
+
+ /**
+ * The X509Certificate object
+ */
+ private X509Certificate x509Cert_ = null;
+
+ /**
+ * The logger definition.
+ */
+ private static final Logger logger_ = ConfigLogger.getLogger(X509Cert.class);
+
+ /**
+ * The empty constructor not acessible from outside --> use the static init
+ * methods instead
+ */
+ private X509Cert()
+ {
+ }
+
+ /**
+ * Normalize the base64 coded .cer or .der string. Remove the begin and end
+ * statement and remove all whitespaces in the string. The result string
+ * (base64) is used by reconstructing the certiface sign by the verification
+ * process.
+ *
+ * @param certString
+ * the string to normalize
+ * @return the normalized cert string
+ */
+ private static String normalizeCertString(String certString)
+ {
+ certString = certString.replaceAll("-----BEGIN CERTIFICATE-----", "");
+ certString = certString.replaceAll("-----END CERTIFICATE-----", "");
+ certString = certString.replaceAll("\\s", "");
+ return certString;
+ }
+
+ /**
+ * This method initialzes a X509Certificate by a string value. It must be
+ * coded Base64 or as plain binary stream.
+ *
+ * @param certString
+ * the certificate string to analyse
+ * @return the X509Cert object
+ * @see CertificateFactory
+ * @see X509Certificate
+ */
+ public static X509Cert initByString(String certString)
+ {
+ if (certString == null)
+ {
+ return null;
+ }
+ certString = normalizeCertString(certString);
+ X509Cert x509_cert = new X509Cert();
+ x509_cert.setCertString(certString);
+ try
+ {
+ byte[] b64_dec = certString.getBytes("US-ASCII");
+ if (CodingHelper.isB64(b64_dec))
+ {
+ b64_dec = CodingHelper.decodeBase64(b64_dec);
+ }
+ else
+ {
+ b64_dec = CodingHelper.encodeBase64(b64_dec).getBytes("US-ASCII");
+ }
+ ByteArrayInputStream bais = new ByteArrayInputStream(b64_dec);
+ CertificateFactory cf = CertificateFactory.getInstance("X.509");
+ X509Certificate cert = (X509Certificate) cf.generateCertificate(bais);
+ bais.close();
+ x509_cert.setX509Cert(cert);
+
+ String serial_num = cert.getSerialNumber().toString();
+ String issuer = cert.getIssuerDN().getName();
+ issuer = issuer.replaceAll(", ", ",");
+ String subject_name = cert.getSubjectDN().getName();
+ x509_cert.setSerialNumber(serial_num);
+ x509_cert.setIssuerName(issuer);
+ x509_cert.setSubjectName(subject_name);
+ if (logger_.isDebugEnabled())
+ {
+ logger_.debug("Serial number from certificate:" + serial_num);
+ logger_.debug("Issuer name from certificate :" + issuer);
+ logger_.debug("Subject name from certificate :" + subject_name);
+ }
+ }
+ catch (java.security.cert.CertificateException ce)
+ {
+ // nothing to do, cause certString is not X509 conformc
+ ce.printStackTrace();
+ }
+ catch (IOException ioe)
+ {
+ // nothing to do, cause certString is not X509 conform
+ ioe.printStackTrace();
+ }
+ return x509_cert;
+ }
+
+ public static X509Cert initByByteArray(byte[] data)
+ {
+ X509Cert x509_cert = new X509Cert();
+ try
+ {
+ ByteArrayInputStream bais = new ByteArrayInputStream(data);
+ CertificateFactory cf = CertificateFactory.getInstance("X.509");
+ X509Certificate cert = (X509Certificate) cf.generateCertificate(bais);
+ bais.close();
+
+ x509_cert.setX509Cert(cert);
+
+ String serial_num = cert.getSerialNumber().toString();
+ String issuer = cert.getIssuerDN().getName();
+ issuer = issuer.replaceAll(", ", ",");
+ String subject_name = cert.getSubjectDN().getName();
+ x509_cert.setSerialNumber(serial_num);
+ x509_cert.setIssuerName(issuer);
+ x509_cert.setSubjectName(subject_name);
+ if (logger_.isDebugEnabled())
+ {
+ logger_.debug("Serial number from certificate:" + serial_num);
+ logger_.debug("Issuer name from certificate :" + issuer);
+ logger_.debug("Subject name from certificate :" + subject_name);
+ }
+ }
+ catch (java.security.cert.CertificateException ce)
+ {
+ // nothing to do, cause certString is not X509 conformc
+ ce.printStackTrace();
+ }
+ catch (IOException ioe)
+ {
+ // nothing to do, cause certString is not X509 conform
+ ioe.printStackTrace();
+ }
+
+ return x509_cert;
+ }
+
+ /**
+ * This method initialzes a X509Certificate by a file path value. The file
+ * must be a plain binary file like .cer format.
+ *
+ * @param filePath
+ * the certificate file to analyse
+ * @return the X509Cert object
+ * @see CertificateFactory
+ * @see X509Certificate
+ */
+ public static X509Cert initByFilePath(String filePath)
+ {
+ if (logger_.isDebugEnabled())
+ {
+ logger_.debug("Add cert file:" + filePath);
+ }
+ if (filePath == null)
+ {
+ return null;
+ }
+ X509Cert x509_cert = new X509Cert();
+ try
+ {
+ FileInputStream fis = new FileInputStream(filePath);
+ X509Certificate cert = null;
+ try
+ {
+ CertificateFactory cf = CertificateFactory.getInstance("X.509");
+ cert = (X509Certificate) cf.generateCertificate(fis);
+ }
+ catch (java.security.cert.CertificateException ce)
+ {
+ fis.close();
+ String cert_string = FileHelper.readFromFile(filePath);
+ return initByString(cert_string);
+ }
+ fis.close();
+ x509_cert.setX509Cert(cert);
+ String cert_string = FileHelper.readFromFile(filePath);
+ x509_cert.setCertString(normalizeCertString(cert_string));
+
+ String serial_num = cert.getSerialNumber().toString();
+ String issuer = cert.getIssuerDN().getName();
+ issuer = issuer.replaceAll(", ", ",");
+ String subject_name = cert.getSubjectDN().getName();
+ x509_cert.setSerialNumber(serial_num);
+ x509_cert.setIssuerName(issuer);
+ x509_cert.setSubjectName(subject_name);
+ if (logger_.isDebugEnabled())
+ {
+ logger_.debug("Serial number from certificate:" + serial_num);
+ logger_.debug("Issuer name from certificate :" + issuer);
+ logger_.debug("Subject name from certificate :" + subject_name);
+ }
+ }
+ catch (IOException ioe)
+ {
+ String cert_string = FileHelper.readFromFile(filePath);
+ return initByString(cert_string);
+ }
+ return x509_cert;
+
+ }
+
+ /**
+ * This method initialzes a X509Certificate by a file value. The file must be
+ * a plain binary file like .cer format.
+ *
+ * @param certFile
+ * the certificate file to analyse
+ * @return the X509Cert object
+ * @see CertificateFactory
+ * @see X509Certificate
+ */
+ public static X509Cert initByFile(File certFile)
+ {
+ return initByFilePath(certFile.getAbsolutePath());
+ }
+
+ /**
+ * This method checks if a certificate file is X509 conform.
+ *
+ * @return true if a certificate file is X509 conform, false otherwise
+ */
+ public boolean isX509Cert()
+ {
+ return x509Cert_ != null;
+ }
+
+ /**
+ * @return Returns the certificate digest value.
+ */
+ public String getCertDigest()
+ {
+ if (certDigest_ == null)
+ {
+ if (certString_ != null)
+ {
+ byte[] cert_b64 = CodingHelper.decodeBase64(certString_);
+ byte[] cert_hash = CodingHelper.buildDigest(cert_b64);
+ certDigest_ = new String(CodingHelper.encodeBase64(cert_hash));
+ }
+ }
+ return certDigest_;
+ }
+
+ /**
+ * @return Returns the certificate Base64 binary string.
+ */
+ public String getCertString()
+ {
+ return certString_;
+ }
+
+ /**
+ * @return Returns the issuer string.
+ */
+ public String getIssuerName()
+ {
+ return issuerName_;
+ }
+
+ /**
+ * @return Returns the serial number.
+ */
+ public String getSerialNumber()
+ {
+ return serialNumber_;
+ }
+
+ /**
+ * @return Returns the real X509Certifcate object.
+ * @see X509Certificate
+ */
+ public X509Certificate getX509Certificate()
+ {
+ return x509Cert_;
+ }
+
+ /**
+ * @return Returns the subject name.
+ */
+ public String getSubjectName()
+ {
+ return subjectName_;
+ }
+
+ // /**
+ // * @param certDigest
+ // * The certDigest to set.
+ // */
+ // private void setCertDigest(String certDigest)
+ // {
+ // certDigest_ = certDigest;
+ // }
+
+ /**
+ * @param certString
+ * The certString to set.
+ */
+ private void setCertString(String certString)
+ {
+ certString_ = certString;
+ }
+
+ /**
+ * @param issuerString
+ * The issuerString to set.
+ */
+ private void setIssuerName(String issuerString)
+ {
+ issuerName_ = issuerString;
+ }
+
+ /**
+ * @param serialNumber
+ * The serialNumber to set.
+ */
+ private void setSerialNumber(String serialNumber)
+ {
+ serialNumber_ = serialNumber;
+ }
+
+ /**
+ * @param cert
+ * The x509Cert to set.
+ */
+ private void setX509Cert(X509Certificate cert)
+ {
+ x509Cert_ = cert;
+ }
+
+ /**
+ * @param subjectName
+ * The subjectName to set.
+ */
+ private void setSubjectName(String subjectName)
+ {
+ subjectName_ = subjectName;
+ }
+
+ public byte[] getTBSCertificate() throws CertificateEncodingException
+ {
+ return x509Cert_.getTBSCertificate();
+ }
+
+ public String getSigAlgName()
+ {
+ return x509Cert_.getSigAlgName();
+ }
+
+ public String getSigAlgOID()
+ {
+ return x509Cert_.getSigAlgOID();
+ }
+
+ public List getExtendedKeyUsage()
+ {
+ List list = null;
+ try
+ {
+ list = x509Cert_.getExtendedKeyUsage();
+ if (list == null)
+ {
+ System.err.println("is realy null");
+ }
+ }
+ catch (CertificateParsingException e)
+ {
+ e.printStackTrace();
+ }
+ return null;
+ }
+
+ /**
+ * @return the public key of the X509Certificate
+ */
+ public PublicKey getPublicKey()
+ {
+ return x509Cert_.getPublicKey();
+ }
+
+ /**
+ * This method checks, if a X509Certificate has a public key with the rsa
+ * algorithm.
+ *
+ * @return true if the public key is produced with rsa, false otherwise
+ */
+ public boolean isRSA()
+ {
+ return (x509Cert_.getPublicKey().getAlgorithm()).indexOf("RSA") >= 0;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/sig/connectors/A1Connector.java b/src/main/java/at/knowcenter/wag/egov/egiz/sig/connectors/A1Connector.java
new file mode 100644
index 0000000..9144966
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/egov/egiz/sig/connectors/A1Connector.java
@@ -0,0 +1,55 @@
+/**
+ * <copyright> Copyright (c) 2006 by Know-Center, Graz, Austria </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+ * NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
+ * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES.
+ *
+ * $Id: A1Connector.java,v 1.2 2006/08/25 17:09:17 wprinz Exp $
+ */
+package at.knowcenter.wag.egov.egiz.sig.connectors;
+
+import at.knowcenter.wag.egov.egiz.exceptions.SignatureException;
+import at.knowcenter.wag.egov.egiz.sig.ConnectorInformation;
+
+/**
+ * @author wprinz
+ */
+public class A1Connector extends BKUConnector
+{
+ /**
+ * ConnectorInformation that identifies this Connector to the system.
+ *
+ * @see at.knowcenter.wag.egov.egiz.sig.ConnectorFactory
+ * @see ConnectorInformation
+ */
+ public static final ConnectorInformation CONNECTOR_INFORMATION = new ConnectorInformation("a1", "A-1");
+
+ /**
+ * Constructor.
+ *
+ * @throws SignatureException
+ * F.e.
+ */
+ public A1Connector() throws SignatureException
+ {
+ super();
+ }
+
+ /**
+ * Overrides the type of the BKUConnector to use the A1 settings.
+ */
+ protected String getType()
+ {
+ return CONNECTOR_INFORMATION.getIdentifier();
+ }
+
+}
diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/sig/connectors/BKUConnector.java b/src/main/java/at/knowcenter/wag/egov/egiz/sig/connectors/BKUConnector.java
new file mode 100644
index 0000000..96fa81b
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/egov/egiz/sig/connectors/BKUConnector.java
@@ -0,0 +1,813 @@
+/*
+ * <copyright> Copyright (c) 2006 by Know-Center, Graz, Austria </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+ * NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
+ * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES.
+ *
+ * $Id: BKUConnector.java,v 1.5 2006/10/31 08:18:41 wprinz Exp $
+ */
+package at.knowcenter.wag.egov.egiz.sig.connectors;
+
+import java.io.UnsupportedEncodingException;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.apache.log4j.Level;
+import org.apache.log4j.Logger;
+
+import at.knowcenter.wag.egov.egiz.cfg.ConfigLogger;
+import at.knowcenter.wag.egov.egiz.cfg.SettingsReader;
+import at.knowcenter.wag.egov.egiz.exceptions.SettingsException;
+import at.knowcenter.wag.egov.egiz.exceptions.SignatureException;
+import at.knowcenter.wag.egov.egiz.exceptions.SignatureTypesException;
+import at.knowcenter.wag.egov.egiz.sig.ConnectorInformation;
+import at.knowcenter.wag.egov.egiz.sig.LocalConnector;
+import at.knowcenter.wag.egov.egiz.sig.SignatureObject;
+import at.knowcenter.wag.egov.egiz.sig.SignatureResponse;
+import at.knowcenter.wag.egov.egiz.sig.X509Cert;
+import at.knowcenter.wag.egov.egiz.tools.CodingHelper;
+import at.knowcenter.wag.egov.egiz.tools.FileHelper;
+
+/**
+ * Connector for communicating with BKU.
+ *
+ * @author wlackner
+ * @author wprinz
+ */
+public class BKUConnector implements LocalConnector
+{
+ /**
+ * ConnectorInformation that identifies this Connector to the system.
+ *
+ * @see at.knowcenter.wag.egov.egiz.sig.ConnectorFactory
+ * @see ConnectorInformation
+ */
+ public static final ConnectorInformation CONNECTOR_INFORMATION = new ConnectorInformation("bku", "BKU");
+
+ /**
+ * The SettingsReader instance
+ */
+ private SettingsReader settings_ = null;
+
+ /**
+ * The logger definition.
+ */
+ private static final Logger logger_ = ConfigLogger.getLogger(BKUConnector.class);
+
+ /**
+ * The empty constructor
+ */
+ public BKUConnector() throws SignatureException
+ {
+ loadSettings();
+ }
+
+ /**
+ * load the inital signature settings
+ *
+ * @see SettingsReader
+ */
+ private void loadSettings() throws SignatureException
+ {
+ if (settings_ == null)
+ {
+ try
+ {
+ settings_ = SettingsReader.getInstance();
+ }
+ catch (SettingsException e)
+ {
+ String log_message = "Can not load signature settings. Cause:\n" + e.getMessage();
+ logger_.error(log_message);
+ throw new SignatureException(101, log_message, e);
+ }
+ }
+ }
+
+ /**
+ * This method calls the BKU signing a given text. The signaton type is to
+ * used initializing the corresponding SigantureObject. The initialized
+ * SignatureObject is filled out by the parsed BKU-Response. <br>
+ * If an error request is send back from BKU, an error message is generated an
+ * an exception is thrown.
+ *
+ * @param sigType
+ * the type of the SignatureObject that should be returned
+ * @param userName
+ * the name of the user calling this method
+ * @param signText
+ * the text that shoulf be signed from BKU
+ * @return the complete SingatureObject of the given type filled by values
+ * from the BKU-Request
+ * @throws SignatureException
+ * @see SignatureObject
+ */
+ public SignatureObject doSign(String sigType, String userName, String signText) throws SignatureException
+ {
+ String request_string = prepareSignRequest(userName, signText, sigType);
+
+ String sign_url = getSignURL(sigType);
+ String response_string = sendRequest(sign_url, request_string);
+
+ return analyzeSignResponse(response_string, sigType);
+ }
+
+ /**
+ * This method generates the BKU verify prozess. It checks if the given
+ * SignatureObject is signed by MOA or BKU. The verify template string is
+ * filled out by the corresponding method.
+ *
+ * @param normalizedText
+ * the normalized text to verify
+ * @param sigObject
+ * the SignatureObject holding the singature values
+ * @return a SignatureResponse object if the verify prozess does not fails
+ * @throws SignatureException
+ * @see SignatureResponse
+ */
+ public SignatureResponse doVerify(String normalizedText,
+ SignatureObject sigObject) throws SignatureException
+ {
+ String request_string = prepareVerifyRequest(normalizedText, sigObject);
+
+ String verify_url = getVerifyURL(sigObject.getSignationType());
+ String response_string = sendRequest(verify_url, request_string);
+
+ return analyzeVerifyResponse(response_string);
+ }
+
+ /**
+ * This method parses the BKU-Response string. It separates the
+ * SignatureValue, X509IssuerName, SigningTime, X509SerialNumber,
+ * X509Certificate, CertDigest, DigestValue and the signation id-s. If the
+ * X509Certificate is extracted it would be stored in the certificates
+ * directory.
+ *
+ * @param xmlResponse
+ * the response string from the BKU sign-request
+ * @param sigObj
+ * the SignatureObject that should be filled
+ * @throws SignatureException
+ * ErrorCode (303, 304)
+ * @see SignatureObject
+ * @see CodingHelper
+ * @see X509Cert
+ */
+ private void parseCreateXMLResponse(String xmlResponse, SignatureObject sigObj) throws SignatureException
+ {
+ Pattern sig_val_p_s = Pattern.compile("<[\\w]*:?SignatureValue>");
+ Pattern sig_val_p_e = Pattern.compile("</[\\w]*:?SignatureValue>");
+ Pattern iss_nam_p_s = Pattern.compile("<[\\w]*:?X509IssuerName>");
+ Pattern iss_nam_p_e = Pattern.compile("</[\\w]*:?X509IssuerName>");
+ Pattern sig_tim_p_s = Pattern.compile("<[\\w]*:?SigningTime>");
+ Pattern sig_tim_p_e = Pattern.compile("</[\\w]*:?SigningTime>");
+ Pattern ser_num_p_s = Pattern.compile("<[\\w]*:?X509SerialNumber>");
+ Pattern ser_num_p_e = Pattern.compile("</[\\w]*:?X509SerialNumber>");
+ Pattern sig_cer_p_s = Pattern.compile("<[\\w]*:?X509Certificate>");
+ Pattern sig_cer_p_e = Pattern.compile("</[\\w]*:?X509Certificate>");
+
+ Pattern sig_cer_d_p_s = Pattern.compile("<[\\w]*:?CertDigest>");
+ Pattern sig_cer_d_p_e = Pattern.compile("</[\\w]*:?CertDigest>");
+ Pattern dig_val_p_s = Pattern.compile("<[\\w]*:?DigestValue>");
+ Pattern dig_val_p_e = Pattern.compile("</[\\w]*:?DigestValue>");
+
+ Matcher sig_val_m_s = sig_val_p_s.matcher(xmlResponse);
+ Matcher sig_val_m_e = sig_val_p_e.matcher(xmlResponse);
+ Matcher iss_nam_m_s = iss_nam_p_s.matcher(xmlResponse);
+ Matcher iss_nam_m_e = iss_nam_p_e.matcher(xmlResponse);
+ Matcher sig_tim_m_s = sig_tim_p_s.matcher(xmlResponse);
+ Matcher sig_tim_m_e = sig_tim_p_e.matcher(xmlResponse);
+ Matcher ser_num_m_s = ser_num_p_s.matcher(xmlResponse);
+ Matcher ser_num_m_e = ser_num_p_e.matcher(xmlResponse);
+ Matcher sig_cer_m_s = sig_cer_p_s.matcher(xmlResponse);
+ Matcher sig_cer_m_e = sig_cer_p_e.matcher(xmlResponse);
+
+ Matcher sig_cer_d_m_s = sig_cer_d_p_s.matcher(xmlResponse);
+ Matcher sig_cer_d_m_e = sig_cer_d_p_e.matcher(xmlResponse);
+
+ String sig_val = "";
+ String iss_nam = "";
+ String ser_num = "";
+ String sig_tim = "";
+ String sig_cer = "";
+ String sig_dig = "";
+
+ // SignatureValue
+ if (sig_val_m_s.find() && sig_val_m_e.find())
+ {
+ sig_val = xmlResponse.substring(sig_val_m_s.end(), sig_val_m_e.start());
+ sig_val = sig_val.replaceAll("\\s", "");
+ sigObj.setSignationValue(sig_val);
+ }
+ // X509IssuerName
+ if (iss_nam_m_s.find() && iss_nam_m_e.find())
+ {
+ iss_nam = xmlResponse.substring(iss_nam_m_s.end(), iss_nam_m_e.start());
+ sigObj.setSignationIssuer(iss_nam);
+ }
+ // X509SerialNumber
+ if (ser_num_m_s.find() && ser_num_m_e.find())
+ {
+ ser_num = xmlResponse.substring(ser_num_m_s.end(), ser_num_m_e.start());
+ sigObj.setSignationSerialNumber(ser_num);
+ }
+ // SigningTime
+ if (sig_tim_m_s.find() && sig_tim_m_e.find())
+ {
+ sig_tim = xmlResponse.substring(sig_tim_m_s.end(), sig_tim_m_e.start());
+ sigObj.setSignationDate(sig_tim);
+ }
+ // CertDigest
+ if (sig_cer_d_m_s.find() && sig_cer_d_m_e.find())
+ {
+ String cert_digest = xmlResponse.substring(sig_cer_d_m_s.end(), sig_cer_d_m_e.start());
+ Matcher dig_val_m_s = dig_val_p_s.matcher(cert_digest);
+ Matcher dig_val_m_e = dig_val_p_e.matcher(cert_digest);
+ if (dig_val_m_s.find() && dig_val_m_e.find())
+ {
+ sig_dig = cert_digest.substring(dig_val_m_s.end(), dig_val_m_e.start());
+ sigObj.setX509CertificateDigest(sig_dig);
+ }
+ }
+ // extract Subject Name from X509Certificate
+ if (sig_cer_m_s.find() && sig_cer_m_e.find())
+ {
+ sig_cer = xmlResponse.substring(sig_cer_m_s.end(), sig_cer_m_e.start());
+ sig_cer = sig_cer.replaceAll("\\s", "");
+ sigObj.setX509Certificate(sig_cer);
+ X509Cert cert = X509Cert.initByString(sig_cer);
+ if (cert.isX509Cert())
+ {
+ sigObj.setX509Certificate(cert.getCertString());
+ String serial_num = cert.getSerialNumber();
+ String subject_name = cert.getSubjectName();
+ if (!ser_num.equals(serial_num))
+ {
+ SignatureException se = new SignatureException(303, "Serialnumber of certificate and tag X509SerialNumber differs!");
+ throw se;
+ }
+ sigObj.setSignationName(subject_name);
+ }
+ }
+
+ // extract Signature Id's
+ String[] ids = new String[5];
+ ids[0] = extractId(xmlResponse, "signature-");
+ ids[1] = extractId(xmlResponse, "signed-data-reference-");
+ ids[2] = extractId(xmlResponse, "signed-data-object-");
+ ids[3] = extractId(xmlResponse, "etsi-data-reference-");
+ ids[4] = extractId(xmlResponse, "etsi-data-object-");
+ sigObj.setSignationIDs(ids);
+ }
+
+ /**
+ * This emthod extracts id-values from a text. The id is given by the name.
+ *
+ * @param text
+ * the id-value that should extract from
+ * @param name
+ * the id-key
+ * @return the value of the given key in the text
+ */
+ private String extractId(String text, String name)
+ {
+ String id = null;
+ int start_idx = text.indexOf(name) + name.length();
+ int end_idx = text.indexOf("\"", start_idx);
+ id = text.substring(start_idx, end_idx);
+ if (logger_.isDebugEnabled())
+ {
+ logger_.debug("extract id:" + name + id);
+ }
+ return id;
+ }
+
+ /**
+ * This method reads the verify template from the file system and fills out
+ * the template with the SignatureObject values.
+ *
+ * @param normalizedText
+ * the normalized text to veryfied
+ * @param sigObject
+ * the SignatureObject holding the singature values
+ * @return the filled verify template string
+ * @throws SignatureException
+ * ErrorCode (311, 312, 313)
+ * @see SignatureObject
+ * @see CodingHelper
+ */
+ public String getVerifyTemplate(String normalizedText,
+ SignatureObject sigObject) throws SignatureException
+ {
+ try
+ {
+ if (normalizedText == null || normalizedText.length() == 0)
+ {
+ SignatureException se = new SignatureException(311, "Document can not be verified because normalized text is empty.");
+ throw se;
+ }
+ if (sigObject == null)
+ {
+ SignatureException se = new SignatureException(312, "Document can not be verified because no signature object are set.");
+ throw se;
+ }
+
+ String verify_template = getVerifyTemplateFileName(sigObject.getSignationType());
+ String sig_prop_filename = getSigPropFileName(sigObject.getSignationType());
+
+ String ver_temp_str = FileHelper.readFromFile(SettingsReader.relocateFile(verify_template));
+ String sig_prop_str = FileHelper.readFromFile(SettingsReader.relocateFile(sig_prop_filename));
+ if (logger_.isDebugEnabled())
+ {
+ //logger_.debug(verify_template);
+ logger_.debug(sig_prop_filename);
+ }
+
+ String x509_cert_string = sigObject.getX509CertificateString();
+ if (x509_cert_string == null)
+ {
+ SignatureException se = new SignatureException(313, "Document certificate is not defined.");
+ throw se;
+ }
+ String cert_alg = settings_.getValueFromKey("cert.alg.ecdsa");
+ X509Cert x509_cert = sigObject.getX509Cert();
+ if (x509_cert.isRSA())
+ {
+ cert_alg = settings_.getValueFromKey("cert.alg.rsa");
+ }
+
+ String[] ids = sigObject.getSignationIds();
+ sig_prop_str = sig_prop_str.replaceFirst("SigningTimeReplace", sigObject.getSignationDate());
+
+ String issuer_name = sigObject.getSignationIssuer();
+ // The issuer is already unicode, so it mustn't be encoded again.
+ //byte[] issuer_name = CodingHelper.encodeUTF8(sigObject.getSignationIssuer());
+ // new String(issuer_name); // this would double encode the String, not to mention the missing encoding
+ sig_prop_str = sig_prop_str.replaceFirst("X509IssuerNameReplace", issuer_name);
+
+ sig_prop_str = sig_prop_str.replaceFirst("X509SerialNumberReplace", sigObject.getSignationSerialNumber());
+ sig_prop_str = sig_prop_str.replaceFirst("DigestValueX509CertificateReplace", sigObject.getX509CertificateDigest());
+ sig_prop_str = sig_prop_str.replaceFirst("SigIdReplace", ids[0]);
+ sig_prop_str = sig_prop_str.replaceFirst("SigDataRefReplace", ids[1]);
+
+ ver_temp_str = ver_temp_str.replaceFirst("CertAlgReplace", cert_alg);
+ ver_temp_str = ver_temp_str.replaceFirst("TemplateQualifyingPropertiesReplace", sig_prop_str);
+ byte[] sig_prop_code = CodingHelper.buildDigest(sig_prop_str.getBytes("UTF-8"));
+ String sig_prop_hash = CodingHelper.encodeBase64(sig_prop_code);
+ ver_temp_str = ver_temp_str.replaceFirst("DigestValueSignedPropertiesReplace", sig_prop_hash);
+ if (logger_.isDebugEnabled())
+ {
+ logger_.debug("build digest from QualifyingProperties:start");
+ //logger_.debug("DATA :" + sig_prop_str);
+ logger_.debug("DIGEST:" + sig_prop_hash);
+ logger_.debug("build digest from QualifyingProperties:end");
+ }
+
+ ver_temp_str = ver_temp_str.replaceFirst("SignatureValueReplace", sigObject.getSignationValue());
+ ver_temp_str = ver_temp_str.replaceFirst("X509CertificateReplace", x509_cert_string);
+ byte[] data_value = normalizedText.getBytes("UTF-8");
+ byte[] data_value_hash = CodingHelper.buildDigest(data_value);
+ String object_data_hash = CodingHelper.encodeBase64(data_value_hash);
+ // String object_data = new String(data_value);
+ if (logger_.isDebugEnabled())
+ {
+ logger_.debug("build digest from data object:start");
+ //logger_.debug("DATA :" + normalizedText);
+ logger_.debug("DIGEST:" + object_data_hash);
+ logger_.debug("build digest from data object:end");
+ }
+
+ //String raw_b64 = CodingHelper.encodeUTF8AsBase64(normalizedText);
+ String raw_b64 = CodingHelper.encodeBase64(data_value);
+
+ ver_temp_str = ver_temp_str.replaceFirst("Base64ContentReplace", raw_b64);
+ ver_temp_str = ver_temp_str.replaceFirst("DigestValueSignedDataReplace", object_data_hash);
+
+ ver_temp_str = ver_temp_str.replaceAll("SigIdReplace", ids[0]);
+ ver_temp_str = ver_temp_str.replaceAll("SigDataRefReplace", ids[1]);
+ ver_temp_str = ver_temp_str.replaceAll("SigDataObjURIReplace", ids[2]);
+ ver_temp_str = ver_temp_str.replaceAll("EtsiDataRefReplace", ids[3]);
+ ver_temp_str = ver_temp_str.replaceAll("EtsiDataObjURIReplace", ids[4]);
+ if (logger_.isDebugEnabled())
+ {
+ //logger_.debug("VERIFY REQUEST:" + ver_temp_str);
+ }
+
+ return ver_temp_str;
+ }
+ catch (UnsupportedEncodingException e)
+ {
+ throw new SignatureException(310, e);
+ }
+ }
+
+ /**
+ * This method parses the verify response string and return a
+ * SignatureResponse object. The SignatureResponse object is filled out by the
+ * response values from the BKU-response.
+ *
+ * @param xmlResponse
+ * the response values from the BKU-verify request
+ * @return SignatureResponse object
+ * @see SignatureResponse
+ */
+ private SignatureResponse parseVerifyXMLResponse(String xmlResponse)
+ {
+ if (logger_.isInfoEnabled())
+ {
+ logger_.info("Try parsing the verify response");
+ }
+
+ Pattern sub_nam_p_s = Pattern.compile("<dsig:X509SubjectName>");
+ Pattern sub_nam_p_e = Pattern.compile("</dsig:X509SubjectName>");
+ Pattern iss_nam_p_s = Pattern.compile("<dsig:X509IssuerName>");
+ Pattern iss_nam_p_e = Pattern.compile("</dsig:X509IssuerName>");
+ Pattern ser_num_p_s = Pattern.compile("<dsig:X509SerialNumber>");
+ Pattern ser_num_p_e = Pattern.compile("</dsig:X509SerialNumber>");
+
+ Pattern sig_chk_p_s = Pattern.compile("<sl:SignatureCheck>");
+ Pattern sig_chk_p_e = Pattern.compile("</sl:SignatureCheck>");
+ Pattern man_chk_p_s = Pattern.compile("<sl:SignatureManifestCheck>");
+ Pattern man_chk_p_e = Pattern.compile("</sl:SignatureManifestCheck>");
+ Pattern cer_chk_p_s = Pattern.compile("<sl:CertificateCheck>");
+ Pattern cer_chk_p_e = Pattern.compile("</sl:CertificateCheck>");
+
+ Pattern code_p_s = Pattern.compile("<sl:Code>");
+ Pattern code_p_e = Pattern.compile("</sl:Code>");
+ Pattern info_p_s = Pattern.compile("<sl:Info>");
+ Pattern info_p_e = Pattern.compile("</sl:Info>");
+
+ Pattern cert_p_s = Pattern.compile("<dsig:X509Certificate>");
+ Pattern cert_p_e = Pattern.compile("</dsig:X509Certificate>");
+
+ Matcher sub_nam_m_s = sub_nam_p_s.matcher(xmlResponse);
+ Matcher sub_nam_m_e = sub_nam_p_e.matcher(xmlResponse);
+ Matcher iss_nam_m_s = iss_nam_p_s.matcher(xmlResponse);
+ Matcher iss_nam_m_e = iss_nam_p_e.matcher(xmlResponse);
+ Matcher ser_num_m_s = ser_num_p_s.matcher(xmlResponse);
+ Matcher ser_num_m_e = ser_num_p_e.matcher(xmlResponse);
+
+ Matcher sig_chk_m_s = sig_chk_p_s.matcher(xmlResponse);
+ Matcher sig_chk_m_e = sig_chk_p_e.matcher(xmlResponse);
+ Matcher man_chk_m_s = man_chk_p_s.matcher(xmlResponse);
+ Matcher man_chk_m_e = man_chk_p_e.matcher(xmlResponse);
+ Matcher cer_chk_m_s = cer_chk_p_s.matcher(xmlResponse);
+ Matcher cer_chk_m_e = cer_chk_p_e.matcher(xmlResponse);
+
+ Matcher cert_m_s = cert_p_s.matcher(xmlResponse);
+ Matcher cert_m_e = cert_p_e.matcher(xmlResponse);
+
+ SignatureResponse sig_res = new SignatureResponse();
+ if (sub_nam_m_s.find() && sub_nam_m_e.find())
+ {
+ String sub_nam = xmlResponse.substring(sub_nam_m_s.end(), sub_nam_m_e.start());
+ sig_res.setX509SubjectName(sub_nam);
+ }
+ if (iss_nam_m_s.find() && iss_nam_m_e.find())
+ {
+ String iss_nam = xmlResponse.substring(iss_nam_m_s.end(), iss_nam_m_e.start());
+ sig_res.setX509IssuerName(iss_nam);
+ }
+ if (ser_num_m_s.find() && ser_num_m_e.find())
+ {
+ String ser_num = xmlResponse.substring(ser_num_m_s.end(), ser_num_m_e.start());
+ sig_res.setX509SerialNumber(ser_num);
+ }
+ if (sig_chk_m_s.find() && sig_chk_m_e.find())
+ {
+ String sig_chk = xmlResponse.substring(sig_chk_m_s.end(), sig_chk_m_e.start());
+ Matcher code_m_s = code_p_s.matcher(sig_chk);
+ Matcher code_m_e = code_p_e.matcher(sig_chk);
+ Matcher info_m_s = info_p_s.matcher(sig_chk);
+ Matcher info_m_e = info_p_e.matcher(sig_chk);
+ if (code_m_s.find() && code_m_e.find())
+ {
+ String code = sig_chk.substring(code_m_s.end(), code_m_e.start());
+ sig_res.setSignatureCheckCode(code);
+ }
+ if (info_m_s.find() && info_m_e.find())
+ {
+ String info = sig_chk.substring(info_m_s.end(), info_m_e.start());
+ sig_res.setSignatureCheckInfo(info);
+ }
+ }
+ if (man_chk_m_s.find() && man_chk_m_e.find())
+ {
+ String man_chk = xmlResponse.substring(man_chk_m_s.end(), man_chk_m_e.start());
+ Matcher code_m_s = code_p_s.matcher(man_chk);
+ Matcher code_m_e = code_p_e.matcher(man_chk);
+ Matcher info_m_s = info_p_s.matcher(man_chk);
+ Matcher info_m_e = info_p_e.matcher(man_chk);
+ if (code_m_s.find() && code_m_e.find())
+ {
+ String code = man_chk.substring(code_m_s.end(), code_m_e.start());
+ sig_res.setSignatureManifestCheckCode(code);
+ }
+ if (info_m_s.find() && info_m_e.find())
+ {
+ String info = man_chk.substring(info_m_s.end(), info_m_e.start());
+ sig_res.setSignatureManifestCheckInfo(info);
+ }
+ }
+ if (cer_chk_m_s.find() && cer_chk_m_e.find())
+ {
+ String cer_chk = xmlResponse.substring(cer_chk_m_s.end(), cer_chk_m_e.start());
+ Matcher code_m_s = code_p_s.matcher(cer_chk);
+ Matcher code_m_e = code_p_e.matcher(cer_chk);
+ Matcher info_m_s = info_p_s.matcher(cer_chk);
+ Matcher info_m_e = info_p_e.matcher(cer_chk);
+ if (code_m_s.find() && code_m_e.find())
+ {
+ String code = cer_chk.substring(code_m_s.end(), code_m_e.start());
+ sig_res.setCertificateCheckCode(code);
+ }
+ if (info_m_s.find() && info_m_e.find())
+ {
+ String info = cer_chk.substring(info_m_s.end(), info_m_e.start());
+ sig_res.setCertificateCheckInfo(info);
+ }
+ }
+ if (cert_m_s.find() && cert_m_e.find())
+ {
+ String cert_string = xmlResponse.substring(cert_m_s.end(), cert_m_e.start());
+
+ X509Cert resp_cert = X509Cert.initByString(cert_string);
+ sig_res.setCertificate(resp_cert);
+ }
+
+ return sig_res;
+ }
+
+ public String prepareSignRequest(String userName, String signText,
+ String signType) throws SignatureException
+ {
+ if (logger_.isInfoEnabled())
+ {
+ logger_.info("Call " + getType() + " connector from user:" + userName);
+ }
+ String keybox_identifier = getSignKeyboxIdentifier(signType);
+ String sign_request_filename = getSignRequestTemplateFileName(signType);
+
+ String sign_req_str = FileHelper.readFromFile(SettingsReader.relocateFile(sign_request_filename));
+ if (logger_.isDebugEnabled())
+ {
+ //logger_.debug(sign_request_filename + "_signText.xml :" + signText);
+ }
+ String raw_b64 = CodingHelper.encodeUTF8AsBase64(signText);
+ if (sign_req_str == null || raw_b64 == null)
+ {
+ throw new SignatureException(300, "Can not read the create xml request template");
+ }
+ sign_req_str = sign_req_str.replaceFirst("KeyboxIdentifierReplace", keybox_identifier);
+ sign_req_str = sign_req_str.replaceFirst("Base64ContentReplace", raw_b64);
+ if (logger_.isDebugEnabled())
+ {
+ //logger_.debug(sign_request_filename + "_request.xml :"+ sign_req_str);
+ }
+
+ return sign_req_str;
+ }
+
+ public String prepareVerifyRequest(String normalizedText,
+ SignatureObject sigObject) throws SignatureException
+ {
+ String verify_request = getVerifyRequestTemplateFileName(sigObject.getSignationType());
+ String verify_req_str = FileHelper.readFromFile(SettingsReader.relocateFile(verify_request));
+
+ if (logger_.isDebugEnabled())
+ {
+ //logger_.debug(verify_request);
+ }
+
+ String verify_template_str = null;
+ if (sigObject.isMOASigned())
+ {
+ MOAConnector moa_conn = new MOAConnector();
+ // get the MOA-template
+ verify_template_str = moa_conn.getVerifyTemplate(normalizedText, sigObject);
+ }
+ else
+ {
+ // get the BKU-template
+ verify_template_str = getVerifyTemplate(normalizedText, sigObject);
+ }
+ verify_req_str = verify_req_str.replaceFirst("XMLContentReplace", verify_template_str);
+ if (logger_.isDebugEnabled())
+ {
+ //logger_.debug(verify_request + "_request.xml : " + verify_req_str);
+ }
+
+ return verify_req_str;
+ }
+
+ /**
+ * Sends the request to the given URL.
+ *
+ * @param url
+ * The URL.
+ * @param request_string
+ * The request string.
+ * @return Returns the response string.
+ * @throws SignatureException
+ * F.e.
+ */
+ protected String sendRequest(String url, String request_string) throws SignatureException
+ {
+ try
+ {
+ String response_string = BKUPostConnection.doPostRequest(url, request_string);
+ return response_string;
+ }
+ catch (Exception e)
+ {
+ SignatureException se = new SignatureException(320, e);
+ throw se;
+ }
+ }
+
+ public SignatureObject analyzeSignResponse(String response_string,
+ String sigType) throws SignatureException
+ {
+ //String sign_request_filename = getSignRequestTemplateFileName(sigType);
+
+ SignatureObject sig_obj = new SignatureObject();
+ sig_obj.setRawSignatureResponse(response_string);
+ try
+ {
+ sig_obj.setSigType(sigType);
+ sig_obj.initByType();
+ }
+ catch (SignatureTypesException e)
+ {
+ SignatureException se = new SignatureException(300, "Cannot init signature object with type:" + sigType, e);
+ throw se;
+ }
+ if (logger_.isDebugEnabled())
+ {
+ logger_.debug("Signature Type is:" + sig_obj.getSignationType());
+ }
+
+ if (!response_string.equals(""))
+ {
+ Pattern erc_p_s = Pattern.compile("<[\\w]*:?ErrorCode>");
+ Pattern erc_p_e = Pattern.compile("</[\\w]*:?ErrorCode>");
+ Matcher erc_m_s = erc_p_s.matcher(response_string);
+ Matcher erc_m_e = erc_p_e.matcher(response_string);
+ // System.err.println(response_string);
+
+ if (erc_m_s.find() && erc_m_e.find())
+ {
+ if (logger_.isEnabledFor(Level.ERROR))
+ {
+ //logger_.debug(sign_request_filename + "_response.xml : " + response_string);
+ logger_.error("BKU Error response: " + response_string);
+ }
+ Pattern erm_p_s = Pattern.compile("<[\\w]*:?Info>");
+ Pattern erm_p_e = Pattern.compile("</[\\w]*:?Info>");
+ Matcher erm_m_s = erm_p_s.matcher(response_string);
+ Matcher erm_m_e = erm_p_e.matcher(response_string);
+ SignatureException se = new SignatureException(0, "BKUSigExc");
+ String error_code = response_string.substring(erc_m_s.end(), erc_m_e.start());
+ se.setExternalErrorCode(error_code);
+ if (erm_m_s.find() && erm_m_e.find())
+ {
+ String error_mess = response_string.substring(erm_m_s.end(), erm_m_e.start());
+ se.setExternalErrorMessage(error_mess);
+ }
+ throw se;
+ }
+ else
+ {
+ if (logger_.isDebugEnabled())
+ {
+ //logger_.debug(sign_request_filename + "_response.xml : " + response_string);
+ }
+ parseCreateXMLResponse(response_string, sig_obj);
+ }
+ }
+ sig_obj.setSigResponse(response_string);
+ return sig_obj;
+ }
+
+ public SignatureResponse analyzeVerifyResponse(String response_string) throws SignatureException
+ {
+ if (!response_string.equals(""))
+ {
+ Pattern erc_p_s = Pattern.compile("<[\\w]*:?ErrorCode>");
+ Pattern erc_p_e = Pattern.compile("</[\\w]*:?ErrorCode>");
+ Matcher erc_m_s = erc_p_s.matcher(response_string);
+ Matcher erc_m_e = erc_p_e.matcher(response_string);
+
+ if (erc_m_s.find() && erc_m_e.find())
+ {
+ if (logger_.isEnabledFor(Level.ERROR))
+ {
+ //logger_.debug(getType() + "_response.xml : " + response_string);
+ logger_.error(getType() + "_response.xml : " + response_string);
+ }
+ Pattern erm_p_s = Pattern.compile("<[\\w]*:?Info>");
+ Pattern erm_p_e = Pattern.compile("</[\\w]*:?Info>");
+ Matcher erm_m_s = erm_p_s.matcher(response_string);
+ Matcher erm_m_e = erm_p_e.matcher(response_string);
+ SignatureException se = new SignatureException(0, "BKUSigExc");
+ if (erc_m_s.find() && erc_m_e.find())
+ {
+ String error_code = response_string.substring(erc_m_s.end(), erc_m_e.start());
+ se.setExternalErrorCode(error_code);
+ }
+ if (erm_m_s.find() && erm_m_e.find())
+ {
+ String error_mess = response_string.substring(erm_m_s.end(), erm_m_e.start());
+ se.setExternalErrorMessage(error_mess);
+ }
+ throw se;
+ }
+ else
+ {
+ if (logger_.isDebugEnabled())
+ {
+ //logger_.debug(getType() + "_response.xml : " + response_string);
+ }
+ return parseVerifyXMLResponse(response_string);
+ }
+ }
+ return null;
+ }
+
+ protected String getConnectorValueFromProfile(String profile, String key)
+ {
+ String value = settings_.getValueFromKey("sig_obj." + profile + "." + key);
+ if (value == null)
+ {
+ value = settings_.getValueFromKey(key);
+ }
+ return value;
+ }
+
+ public String getSignURL(String profile)
+ {
+ final String key = getType() + "." + ConnectorConfigurationKeys.VALUE_MODE_SIGN + ".url";
+ return getConnectorValueFromProfile(profile, key);
+ }
+
+ protected String getSignRequestTemplateFileName(String profile)
+ {
+ String key = getType() + "." + ConnectorConfigurationKeys.VALUE_MODE_SIGN + ".request";
+ return getConnectorValueFromProfile(profile, key);
+ }
+
+ protected String getSignKeyboxIdentifier(String profile)
+ {
+ String key = getType() + "." + ConnectorConfigurationKeys.VALUE_MODE_SIGN + ".KeyboxIdentifier";
+ return getConnectorValueFromProfile(profile, key);
+ }
+
+ public String getVerifyURL(String profile)
+ {
+ String key = getType() + "." + ConnectorConfigurationKeys.VALUE_MODE_VERIFY + ".url";
+ return getConnectorValueFromProfile(profile, key);
+ }
+
+ protected String getVerifyRequestTemplateFileName(String profile)
+ {
+ String key = getType() + "." + ConnectorConfigurationKeys.VALUE_MODE_VERIFY + ".request";
+ return getConnectorValueFromProfile(profile, key);
+ }
+
+ protected String getVerifyTemplateFileName(String profile)
+ {
+ String key = getType() + "." + ConnectorConfigurationKeys.VALUE_MODE_VERIFY + ".template";
+ return getConnectorValueFromProfile(profile, key);
+ }
+
+ protected String getSigPropFileName(String profile)
+ {
+ String key = getType() + "." + ConnectorConfigurationKeys.VALUE_MODE_VERIFY + ".template.SP";
+ return getConnectorValueFromProfile(profile, key);
+ }
+
+ /**
+ * Returns the type of this BKU-like connector.
+ *
+ * <p>
+ * All settings keys will be prefixed by this type. So to reuse the BKU
+ * connector, a deriving class has to implement this method specifying an own
+ * type.
+ * </p>
+ *
+ * @return Returns the type of this BKU-like connector.
+ */
+ protected String getType()
+ {
+ return CONNECTOR_INFORMATION.getIdentifier();
+ }
+} \ No newline at end of file
diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/sig/connectors/BKUPostConnection.java b/src/main/java/at/knowcenter/wag/egov/egiz/sig/connectors/BKUPostConnection.java
new file mode 100644
index 0000000..773b248
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/egov/egiz/sig/connectors/BKUPostConnection.java
@@ -0,0 +1,95 @@
+/**
+ * <copyright> Copyright (c) 2006 by Know-Center, Graz, Austria </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+ * NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
+ * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES.
+ *
+ * $Id: BKUPostConnection.java,v 1.3 2006/10/11 07:56:10 wprinz Exp $
+ */
+package at.knowcenter.wag.egov.egiz.sig.connectors;
+
+import java.io.IOException;
+
+import org.apache.commons.httpclient.HttpClient;
+import org.apache.commons.httpclient.HttpException;
+import org.apache.commons.httpclient.NameValuePair;
+import org.apache.commons.httpclient.methods.PostMethod;
+import org.apache.commons.httpclient.params.HttpMethodParams;
+import org.apache.log4j.Logger;
+
+import at.knowcenter.wag.egov.egiz.cfg.ConfigLogger;
+
+/**
+ * @author wprinz
+ */
+public abstract class BKUPostConnection
+{
+ /**
+ * The logger definition.
+ */
+ private static final Logger logger_ = ConfigLogger.getLogger(BKUPostConnection.class);
+
+ /**
+ * This method connects the BKU server getting the request and the url. The
+ * request is an XML Message send and recieve by the HttpClient module. The
+ * Response message of the BKU server is is send back to the calling method.
+ *
+ * @param url
+ * the URL which the BKU server is running
+ * @param request
+ * the request string (XML) to send.
+ * @return the response string (XML) of the BKU server
+ * @throws IOException
+ * @throws HttpException
+ * ErrorCode:320
+ */
+ public static String doPostRequest(String url, String request) throws HttpException, IOException
+ {
+
+ PostMethod post_method = new PostMethod(url);
+
+ // It is very important to specify the charset of the content (the request)
+ // as UTF-8 this way.
+ // The HttpClient will then perform the URL encoding assuming that the
+ // request is UTF-8 as the BKU expects.
+ // If the MethodParams are omitted, the HttpClient will assume that the
+ // request is ISO-8859-1 and thereby the BKU cannot properly decode it.
+ HttpMethodParams method_params = new HttpMethodParams();
+ method_params.setContentCharset("UTF-8");
+ post_method.setParams(method_params);
+
+ // This is just a hint: do not set the content-type this way or the BKU will
+ // assume it as text/XML, but the HttpClient sends it as URL-encoded.
+ // The HttpClient will automatically generate the proper Content-Type:
+ // application/x-www-form-urlencoded
+ // post.addRequestHeader(new Header("Content-Type",
+ // "text/xml;charset=UTF-8"));
+
+ NameValuePair[] data = { new NameValuePair("XMLRequest", request) };
+ post_method.setRequestBody(data);
+
+ HttpClient http_client = new HttpClient();
+ int method_response = http_client.executeMethod(post_method);
+ logger_.debug("method_response = " + method_response);
+
+ byte[] response_body = post_method.getResponseBody();
+ String response_string = new String(response_body, "UTF-8");
+
+ // Alternatively this could be used.
+ // The HttpClient is assumed to use the Content-Type provided by the
+ // response.
+ // String response_string = post.getResponseBodyAsString();
+
+ return response_string;
+ }
+
+}
diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/sig/connectors/ConnectorConfigurationKeys.java b/src/main/java/at/knowcenter/wag/egov/egiz/sig/connectors/ConnectorConfigurationKeys.java
new file mode 100644
index 0000000..a50dd1e
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/egov/egiz/sig/connectors/ConnectorConfigurationKeys.java
@@ -0,0 +1,35 @@
+/**
+ *
+ */
+package at.knowcenter.wag.egov.egiz.sig.connectors;
+
+/**
+ * This class contains the key constants used by the Connectors to retrieve
+ * templates etc. from the Configuration.
+ *
+ * @author wprinz
+ */
+public abstract class ConnectorConfigurationKeys
+{
+
+ /**
+ * The application mode sign
+ */
+ public static final String VALUE_MODE_SIGN = "sign";
+
+ /**
+ * The application mode verify
+ */
+ public static final String VALUE_MODE_VERIFY = "verify";
+
+ /**
+ * The key used to read out the available for web property.
+ */
+ public static final String AVAILABLE_FOR_WEB = "available_for_web";
+
+ /**
+ * The key used to read out the available for commandline property.
+ */
+ public static final String AVAILABLE_FOR_COMMANDLINE = "available_for_commandline";
+
+}
diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/sig/connectors/MOAConnector.java b/src/main/java/at/knowcenter/wag/egov/egiz/sig/connectors/MOAConnector.java
new file mode 100644
index 0000000..de1ee57
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/egov/egiz/sig/connectors/MOAConnector.java
@@ -0,0 +1,880 @@
+/*
+ * <copyright> Copyright (c) 2006 by Know-Center, Graz, Austria </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+ * NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
+ * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES.
+ *
+ * $Id: MOAConnector.java,v 1.5 2006/10/31 08:18:41 wprinz Exp $
+ */
+package at.knowcenter.wag.egov.egiz.sig.connectors;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.UnsupportedEncodingException;
+import java.util.Vector;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import javax.xml.namespace.QName;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.rpc.Call;
+import javax.xml.rpc.Service;
+import javax.xml.rpc.ServiceFactory;
+
+import org.apache.axis.message.SOAPBodyElement;
+import org.apache.log4j.Level;
+import org.apache.log4j.Logger;
+import org.apache.xml.serialize.OutputFormat;
+import org.apache.xml.serialize.XMLSerializer;
+import org.w3c.dom.Document;
+
+import at.knowcenter.wag.egov.egiz.cfg.ConfigLogger;
+import at.knowcenter.wag.egov.egiz.cfg.SettingsReader;
+import at.knowcenter.wag.egov.egiz.exceptions.SettingsException;
+import at.knowcenter.wag.egov.egiz.exceptions.SignatureException;
+import at.knowcenter.wag.egov.egiz.exceptions.SignatureTypesException;
+import at.knowcenter.wag.egov.egiz.exceptions.WebException;
+import at.knowcenter.wag.egov.egiz.sig.Connector;
+import at.knowcenter.wag.egov.egiz.sig.ConnectorInformation;
+import at.knowcenter.wag.egov.egiz.sig.SignatureObject;
+import at.knowcenter.wag.egov.egiz.sig.SignatureResponse;
+import at.knowcenter.wag.egov.egiz.sig.X509Cert;
+import at.knowcenter.wag.egov.egiz.tools.CodingHelper;
+import at.knowcenter.wag.egov.egiz.tools.FileHelper;
+
+/**
+ * Connector to access the MOA service.
+ *
+ * @author wlackner
+ * @author wprinz
+ */
+public class MOAConnector implements Connector
+{
+ /**
+ * ConnectorInformation that identifies this Connector to the system.
+ *
+ * @see at.knowcenter.wag.egov.egiz.sig.ConnectorFactory
+ * @see ConnectorInformation
+ */
+ public static final ConnectorInformation CONNECTOR_INFORMATION = new ConnectorInformation("moa", "MOA");
+
+ /**
+ * The class type value.
+ *
+ * <p>
+ * Just for convenience.
+ * </p>
+ */
+ private static final String TYPE = CONNECTOR_INFORMATION.getIdentifier();
+
+ /**
+ * The connector description.
+ */
+ public static final String DESCRIPTION = "MOA";
+
+ /**
+ * The SettingsReader instance
+ */
+ private SettingsReader settings_ = null;
+
+ /**
+ * MOA siganture verification mode
+ */
+ public static final String SERVICE_VERIFY = "SignatureVerification";
+
+ /**
+ * MOA siganture creation mode
+ */
+ public static final String SERVICE_SIGN = "SignatureCreation";
+
+ /**
+ * The logger definition.
+ */
+ private static final Logger logger_ = ConfigLogger.getLogger(MOAConnector.class);
+
+ /**
+ * The empty constructor
+ */
+ public MOAConnector() throws SignatureException
+ {
+ loadSettings();
+ }
+
+ /**
+ * load the inital signature settings
+ *
+ * @see SettingsReader
+ */
+ private void loadSettings() throws SignatureException
+ {
+ if (settings_ == null)
+ {
+ try
+ {
+ settings_ = SettingsReader.getInstance();
+ }
+ catch (SettingsException e)
+ {
+ String log_message = "Can not load signature settings. Cause:\n" + e.getMessage();
+ logger_.error(log_message);
+ throw new SignatureException(101, log_message, e);
+ }
+ }
+ }
+
+ /**
+ * This method calls the MOA signing a given text. The signaton type is to
+ * used initializing the corresponding SigantureObject. The initialized
+ * SignatureObject is filled out by the parsed MOA-Response. <br>
+ * If an error request is send back from MOA, an error message is generated an
+ * an exception is thrown.
+ *
+ * @param sigType
+ * the type of the SignatureObject that should be returned
+ * @param userName
+ * the name of the user calling this method
+ * @param signText
+ * the text that shoulf be signed from MOA
+ * @return the complete SingatureObject of the given type filled by values
+ * from the MOA-Request
+ * @throws SignatureException
+ * ErrorCode 300
+ * @see SignatureObject
+ */
+ public SignatureObject doSign(String sigType, String userName, String signText) throws SignatureException
+ {
+ SignatureObject sig_obj = new SignatureObject();
+ try
+ {
+ sig_obj.setSigType(sigType);
+ sig_obj.initByType();
+ }
+ catch (SignatureTypesException e)
+ {
+ SignatureException se = new SignatureException(300, "Can ot init signature object with type:" + sigType, e);
+ throw se;
+ }
+ if (logger_.isDebugEnabled())
+ {
+ logger_.debug("Signature Type is:" + sig_obj.getSignationType());
+ }
+ if (logger_.isInfoEnabled())
+ {
+ logger_.info("Call " + TYPE + " from user:" + userName);
+ }
+
+ String url = getSignURL(sigType);
+
+ String sign_request_filename = getSignRequestTemplateFileName(sigType);
+ String key_ident = getSignKeyIdentifier(sigType);
+ String sign_req_str = FileHelper.readFromFile(SettingsReader.relocateFile(sign_request_filename));
+ if (sign_req_str == null)
+ {
+ SignatureException se = new SignatureException(300, "File not found:" + sign_request_filename);
+ throw se;
+ }
+
+ sign_req_str = sign_req_str.replaceFirst("KeyIdentifierReplace", key_ident);
+ if (logger_.isDebugEnabled())
+ {
+ logger_.debug("error_signature_response = " + sign_req_str);
+ // FileHelper.writeToFile(sign_request_filename + "_signText.xml",
+ // signText);
+ }
+ // sign_req_str = sign_req_str.replaceFirst("XMLContentReplace", signText);
+ // now use the the base64 Template
+ signText = CodingHelper.encodeUTF8AsBase64(signText);
+ sign_req_str = sign_req_str.replaceFirst("Base64ContentReplace", signText);
+ if (logger_.isDebugEnabled())
+ {
+ //logger_.debug(sign_req_str);
+ // FileHelper.writeToFile(sign_request_filename + "_request.xml",
+ // sign_req_str);
+ }
+
+ String response_string = "";
+ try
+ {
+ response_string = MOAConnector.connectMOA(sign_req_str, MOAConnector.SERVICE_SIGN, url);
+ sig_obj.setRawSignatureResponse(response_string);
+ }
+ catch (WebException we)
+ {
+ if (logger_.isDebugEnabled())
+ {
+ we.printStackTrace();
+ }
+ SignatureException se = new SignatureException(we.getErrorCode(), we);
+ throw se;
+ }
+
+ if (!response_string.equals(""))
+ {
+ if (logger_.isInfoEnabled())
+ {
+ logger_.info("get MOA response");
+ }
+ Pattern erc_p_s = Pattern.compile("<ErrorCode>");
+ Pattern erc_p_e = Pattern.compile("</ErrorCode>");
+ Matcher erc_m_s = erc_p_s.matcher(response_string);
+ Matcher erc_m_e = erc_p_e.matcher(response_string);
+ // System.err.println(response_string);
+
+ if (erc_m_s.find() && erc_m_e.find())
+ {
+ if (logger_.isEnabledFor(Level.ERROR))
+ {
+ logger_.error("error_signature_response = " + response_string);
+ // FileHelper.writeToFile(sign_request_filename + "_response.xml",
+ // response_string);
+ //logger_.error("Write error response to file:" + sign_request_filename + "_response.xml");
+ }
+ Pattern erm_p_s = Pattern.compile("<Info>");
+ Pattern erm_p_e = Pattern.compile("</Info>");
+ Matcher erm_m_s = erm_p_s.matcher(response_string);
+ Matcher erm_m_e = erm_p_e.matcher(response_string);
+
+ String error_code = response_string.substring(erc_m_s.end(), erc_m_e.start());
+ logger_.debug("error_code = " + error_code);
+ String error_mess = "";
+ if (erm_m_s.find() && erm_m_e.find())
+ {
+ error_mess = response_string.substring(erm_m_s.end(), erm_m_e.start());
+ logger_.debug(error_mess);
+ }
+ SignatureException se = new SignatureException(0, "MOASigExc ext error code = " + error_code + ", err_mess = " + error_mess);
+ se.setExternalErrorCode(error_code);
+ se.setExternalErrorMessage(error_mess);
+ throw se;
+ }
+ else
+ {
+ if (logger_.isDebugEnabled())
+ {
+ logger_.debug("error_signature_response = " + response_string);
+ // FileHelper.writeToFile(sign_request_filename + "_response.xml",
+ // response_string);
+ }
+ parseCreateXMLResponse(response_string, sig_obj);
+ }
+ }
+ sig_obj.setSigResponse(response_string);
+ return sig_obj;
+ }
+
+ /**
+ * This method parses the MOA-Response string. It separates the
+ * SignatureValue, X509IssuerName, SigningTime, X509SerialNumber,
+ * X509Certificate, CertDigest and DigestValues. If the X509Certificate is
+ * extracted it would be stored in the certificates directory.
+ *
+ * @param xmlResponse
+ * the response string from the MOA sign-request
+ * @param sigObj
+ * the SignatureObject that should be filled
+ * @throws SignatureException
+ * ErrorCode (303, 304)
+ * @see SignatureObject
+ * @see CodingHelper
+ * @see X509Cert
+ */
+ private void parseCreateXMLResponse(String xmlResponse, SignatureObject sigObj) throws SignatureException
+ {
+ Pattern sig_val_p_s = Pattern.compile("<[\\w]*:?SignatureValue>");
+ Pattern sig_val_p_e = Pattern.compile("</[\\w]*:?SignatureValue>");
+ Pattern iss_nam_p_s = Pattern.compile("<[\\w]*:?X509IssuerName>");
+ Pattern iss_nam_p_e = Pattern.compile("</[\\w]*:?X509IssuerName>");
+ Pattern sig_tim_p_s = Pattern.compile("<[\\w]*:?SigningTime>");
+ Pattern sig_tim_p_e = Pattern.compile("</[\\w]*:?SigningTime>");
+ Pattern ser_num_p_s = Pattern.compile("<[\\w]*:?X509SerialNumber>");
+ Pattern ser_num_p_e = Pattern.compile("</[\\w]*:?X509SerialNumber>");
+ Pattern sig_cer_p_s = Pattern.compile("<[\\w]*:?X509Certificate>");
+ Pattern sig_cer_p_e = Pattern.compile("</[\\w]*:?X509Certificate>");
+
+ Pattern sig_cer_d_p_s = Pattern.compile("<[\\w]*:?CertDigest>");
+ Pattern sig_cer_d_p_e = Pattern.compile("</[\\w]*:?CertDigest>");
+ Pattern dig_val_p_s = Pattern.compile("<[\\w]*:?DigestValue>");
+ Pattern dig_val_p_e = Pattern.compile("</[\\w]*:?DigestValue>");
+
+ Matcher sig_val_m_s = sig_val_p_s.matcher(xmlResponse);
+ Matcher sig_val_m_e = sig_val_p_e.matcher(xmlResponse);
+ Matcher iss_nam_m_s = iss_nam_p_s.matcher(xmlResponse);
+ Matcher iss_nam_m_e = iss_nam_p_e.matcher(xmlResponse);
+ Matcher sig_tim_m_s = sig_tim_p_s.matcher(xmlResponse);
+ Matcher sig_tim_m_e = sig_tim_p_e.matcher(xmlResponse);
+ Matcher ser_num_m_s = ser_num_p_s.matcher(xmlResponse);
+ Matcher ser_num_m_e = ser_num_p_e.matcher(xmlResponse);
+ Matcher sig_cer_m_s = sig_cer_p_s.matcher(xmlResponse);
+ Matcher sig_cer_m_e = sig_cer_p_e.matcher(xmlResponse);
+
+ Matcher sig_cer_d_m_s = sig_cer_d_p_s.matcher(xmlResponse);
+ Matcher sig_cer_d_m_e = sig_cer_d_p_e.matcher(xmlResponse);
+
+ String sig_val = "";
+ String iss_nam = "";
+ String ser_num = "";
+ String sig_tim = "";
+ String sig_cer = "";
+ String sig_dig = "";
+
+ // SignatureValue
+ if (sig_val_m_s.find() && sig_val_m_e.find())
+ {
+ sig_val = xmlResponse.substring(sig_val_m_s.end(), sig_val_m_e.start());
+ sig_val = sig_val.replaceAll("\\s", "");
+ sigObj.setSignationValue(sig_val);
+ }
+ // X509IssuerName
+ if (iss_nam_m_s.find() && iss_nam_m_e.find())
+ {
+ iss_nam = xmlResponse.substring(iss_nam_m_s.end(), iss_nam_m_e.start());
+ sigObj.setSignationIssuer(iss_nam);
+ }
+ // X509SerialNumber
+ if (ser_num_m_s.find() && ser_num_m_e.find())
+ {
+ ser_num = xmlResponse.substring(ser_num_m_s.end(), ser_num_m_e.start());
+ sigObj.setSignationSerialNumber(ser_num);
+ }
+ // SigningTime
+ if (sig_tim_m_s.find() && sig_tim_m_e.find())
+ {
+ sig_tim = xmlResponse.substring(sig_tim_m_s.end(), sig_tim_m_e.start());
+ sigObj.setSignationDate(sig_tim);
+ }
+ // CertDigest
+ if (sig_cer_d_m_s.find() && sig_cer_d_m_e.find())
+ {
+ String cert_digest = xmlResponse.substring(sig_cer_d_m_s.end(), sig_cer_d_m_e.start());
+ Matcher dig_val_m_s = dig_val_p_s.matcher(cert_digest);
+ Matcher dig_val_m_e = dig_val_p_e.matcher(cert_digest);
+ if (dig_val_m_s.find() && dig_val_m_e.find())
+ {
+ sig_dig = cert_digest.substring(dig_val_m_s.end(), dig_val_m_e.start());
+ sigObj.setX509CertificateDigest(sig_dig);
+ }
+ }
+ // extract Subject Name from X509Certificate
+ if (sig_cer_m_s.find() && sig_cer_m_e.find())
+ {
+ sig_cer = xmlResponse.substring(sig_cer_m_s.end(), sig_cer_m_e.start());
+ sig_cer = sig_cer.replaceAll("\\s", "");
+ X509Cert cert = X509Cert.initByString(sig_cer);
+ if (cert.isX509Cert())
+ {
+ sigObj.setX509Certificate(cert.getCertString());
+ String serial_num = cert.getSerialNumber();
+ String subject_name = cert.getSubjectName();
+ if (!ser_num.equals(serial_num))
+ {
+ SignatureException se = new SignatureException(303, "Serialnumber of certificate and tag X509SerialNumber differs!");
+ throw se;
+ }
+ sigObj.setSignationName(subject_name);
+ }
+ }
+ }
+
+ /**
+ * This method reads the verify template from the file system and fills out
+ * the template with the SignatureObject values.
+ *
+ * @param normalizedText
+ * the normalized text to veryfied
+ * @param sigObject
+ * the SignatureObject holding the singature values
+ * @return the filled verify template string
+ * @throws SignatureException
+ * ErrorCode (311, 312, 313)
+ * @see SignatureObject
+ * @see CodingHelper
+ */
+ public String getVerifyTemplate(String normalizedText,
+ SignatureObject sigObject) throws SignatureException
+ {
+ try
+ {
+ if (normalizedText == null || normalizedText.length() == 0)
+ {
+ SignatureException se = new SignatureException(311, "Document can not be verified because normalized text is empty.");
+ throw se;
+ }
+ if (sigObject == null)
+ {
+ SignatureException se = new SignatureException(312, "Document can not be verified because no signature object are set.");
+ throw se;
+ }
+ String verify_template = getVerifyTemplateFileName(sigObject.getSignationType());
+ String sig_prop_template = getSigPropFileName(sigObject.getSignationType());
+ String verify_req_str = FileHelper.readFromFile(SettingsReader.relocateFile(verify_template));
+ String sig_prop_str = FileHelper.readFromFile(SettingsReader.relocateFile(sig_prop_template));
+
+ if (logger_.isDebugEnabled())
+ {
+ //logger_.debug(verify_template);
+ //logger_.debug(sig_prop_template);
+ }
+
+ String x509Certificate = sigObject.getX509CertificateString();
+ if (x509Certificate == null)
+ {
+ SignatureException se = new SignatureException(313, "Document certificate is not defined.");
+ throw se;
+ }
+ String cert_alg = settings_.getValueFromKey("cert.alg.ecdsa");
+ X509Cert x509_cert = sigObject.getX509Cert();
+ if (x509_cert.isRSA())
+ {
+ cert_alg = settings_.getValueFromKey("cert.alg.rsa");
+ }
+
+ sig_prop_str = sig_prop_str.replaceFirst("SigningTimeReplace", sigObject.getSignationDate());
+ // The issuer is already a valid Unicode String.
+ // No need to convert it - not to mention the missing encoding.
+ // byte[] issuer_name =
+ // CodingHelper.encodeUTF8(sigObject.getSignationIssuer());
+ // new String(issuer_name)
+ sig_prop_str = sig_prop_str.replaceFirst("X509IssuerNameReplace", sigObject.getSignationIssuer());
+ sig_prop_str = sig_prop_str.replaceFirst("X509SerialNumberReplace", sigObject.getSignationSerialNumber());
+ sig_prop_str = sig_prop_str.replaceFirst("DigestValueX509CertificateReplace", sigObject.getX509CertificateDigest());
+
+ verify_req_str = verify_req_str.replaceFirst("CertAlgReplace", cert_alg);
+ verify_req_str = verify_req_str.replaceFirst("TemplateSignedPropertiesReplace", sig_prop_str);
+ byte[] sig_prop_code = CodingHelper.buildDigest(sig_prop_str.getBytes("UTF-8")); // added
+ // the
+ // ("UTF-8")
+ // encoding
+ String sig_prop_hash = CodingHelper.encodeBase64(sig_prop_code);
+ verify_req_str = verify_req_str.replaceFirst("DigestValueSignedPropertiesReplace", sig_prop_hash);
+ if (logger_.isDebugEnabled())
+ {
+ logger_.debug("build digest from SignedProperties:start");
+ //logger_.debug("DATA :" + sig_prop_str);
+ logger_.debug("DIGEST:" + sig_prop_hash);
+ logger_.debug("build digest from SignedProperties:end");
+ }
+
+ verify_req_str = verify_req_str.replaceFirst("SignatureValueReplace", sigObject.getSignationValue());
+ verify_req_str = verify_req_str.replaceFirst("X509CertificateReplace", x509Certificate);
+ byte[] data_value = normalizedText.getBytes("UTF-8");
+ byte[] data_value_hash = CodingHelper.buildDigest(data_value);
+ // byte[] data_value_hash =
+ // CodingHelper.buildDigest(normalizedText.getBytes());
+ String object_data_hash = CodingHelper.encodeBase64(data_value_hash);
+ //String object_data = normalizedText; // new String(data_value);
+ // System.err.println(object_data_hash);
+ // very_req_str = very_req_str.replaceFirst("ObjectDataReplace",
+ // object_data);
+ String raw_b64 = CodingHelper.encodeBase64(data_value);
+ verify_req_str = verify_req_str.replaceFirst("Base64ContentReplace", raw_b64);
+
+ verify_req_str = verify_req_str.replaceFirst("DigestValueSignedDataReplace", object_data_hash);
+ if (logger_.isDebugEnabled())
+ {
+ // FileHelper.writeToFile(verify_template + "_verifyText.xml",
+ // normalizedText);
+ logger_.debug("build digest from data object:start");
+ //logger_.debug("DATA :" + object_data);
+ logger_.debug("DIGEST:" + object_data_hash);
+ logger_.debug("build digest from data object:end");
+ }
+ return verify_req_str;
+ }
+ catch (UnsupportedEncodingException e)
+ {
+ throw new SignatureException(310, e);
+ }
+ }
+
+ /**
+ * This method generates the MOA verify prozess. It checks if the given
+ * SignatureObject is signed by MOA or BKU. The verify template string is
+ * filled out by the corresponding method.
+ *
+ * @param normalizedText
+ * the normalized text to verify
+ * @param sigObject
+ * the SignatureObject holding the singature values
+ * @return a SignatureResponse object if the verify prozess does not fails
+ * @throws SignatureException
+ * @see SignatureResponse
+ */
+ public SignatureResponse doVerify(String normalizedText,
+ SignatureObject sigObject) throws SignatureException
+ {
+ String verify_url = getVerifyURL(sigObject.getSignationType()); // settings_.getValueFromKey(TYPE
+ // + "." +
+ // Signature.VALUE_MODE_VERIFY
+ // +
+ // ".url");
+ String verify_request = getVerifyRequestTemplateFileName(sigObject.getSignationType()); // settings_.getValueFromKey(TYPE
+ // +
+ // "."
+ // +
+ // Signature.VALUE_MODE_VERIFY
+ // +
+ // ".request");
+ String trust_profile = getVerifyTrustProfileID(sigObject.getSignationType());
+ String verify_req_str = FileHelper.readFromFile(SettingsReader.relocateFile(verify_request));
+
+ String verify_template_str = null;
+ if (sigObject.isMOASigned())
+ {
+ verify_template_str = getVerifyTemplate(normalizedText, sigObject);
+ }
+ else
+ {
+ BKUConnector bku_conn = new BKUConnector();
+ verify_template_str = bku_conn.getVerifyTemplate(normalizedText, sigObject);
+ }
+ verify_req_str = verify_req_str.replaceFirst("XMLContentReplace", verify_template_str);
+ verify_req_str = verify_req_str.replaceFirst("TrustProfileIDReplace", trust_profile);
+
+ if (logger_.isDebugEnabled())
+ {
+ //logger_.debug(verify_req_str);
+ // FileHelper.writeToFile(verify_request + "_request.xml",
+ // verify_req_str);
+ }
+ String response_string = "";
+ try
+ {
+ response_string = MOAConnector.connectMOA(verify_req_str, MOAConnector.SERVICE_VERIFY, verify_url);
+ }
+ catch (WebException we)
+ {
+ if (logger_.isDebugEnabled())
+ {
+ we.printStackTrace();
+ }
+ SignatureException se = new SignatureException(we.getErrorCode(), we);
+ throw se;
+ }
+
+ if (!response_string.equals(""))
+ {
+ Pattern erc_p_s = Pattern.compile("<[\\w]*:?ErrorCode>");
+ Pattern erc_p_e = Pattern.compile("</[\\w]*:?ErrorCode>");
+ Matcher erc_m_s = erc_p_s.matcher(response_string);
+ Matcher erc_m_e = erc_p_e.matcher(response_string);
+
+ if (erc_m_s.find() && erc_m_e.find())
+ {
+ if (logger_.isEnabledFor(Level.ERROR))
+ {
+ //logger_.debug(response_string);
+ // FileHelper.writeToFile(verify_request + "_response.xml",
+ // response_string);
+ logger_.error("Write error response to file:" + verify_request + "_response.xml");
+ }
+ Pattern erm_p_s = Pattern.compile("<[\\w]*:?Info>");
+ Pattern erm_p_e = Pattern.compile("</[\\w]*:?Info>");
+ Matcher erm_m_s = erm_p_s.matcher(response_string);
+ Matcher erm_m_e = erm_p_e.matcher(response_string);
+ SignatureException se = new SignatureException(0, "MOASigExc2");
+ String error_code = response_string.substring(erc_m_s.end(), erc_m_e.start());
+ se.setExternalErrorCode(error_code);
+ if (erm_m_s.find() && erm_m_e.find())
+ {
+ String error_mess = response_string.substring(erm_m_s.end(), erm_m_e.start());
+ se.setExternalErrorMessage(error_mess);
+ }
+ throw se;
+ }
+ else
+ {
+ if (logger_.isDebugEnabled())
+ {
+ //logger_.debug(verify_request + "_response.xml " + response_string);
+ }
+ return parseVerifyXMLResponse(response_string);
+ }
+ }
+ return null;
+ }
+
+ /**
+ * This method parses the verify response string and return a
+ * SignatureResponse object. The SignatureResponse object is filled out by the
+ * response values from the BKU-response.
+ *
+ * @param xmlResponse
+ * the response values from the MOA-verify request
+ * @return SignatureResponse object
+ * @see SignatureResponse
+ */
+ private SignatureResponse parseVerifyXMLResponse(String xmlResponse)
+ {
+ if (logger_.isInfoEnabled())
+ {
+ logger_.info("Try parsing the verify response");
+ }
+ Pattern sub_nam_p_s = Pattern.compile("<dsig:X509SubjectName>");
+ Pattern sub_nam_p_e = Pattern.compile("</dsig:X509SubjectName>");
+ Pattern iss_nam_p_s = Pattern.compile("<dsig:X509IssuerName>");
+ Pattern iss_nam_p_e = Pattern.compile("</dsig:X509IssuerName>");
+ Pattern ser_num_p_s = Pattern.compile("<dsig:X509SerialNumber>");
+ Pattern ser_num_p_e = Pattern.compile("</dsig:X509SerialNumber>");
+
+ Pattern sig_chk_p_s = Pattern.compile("<SignatureCheck>");
+ Pattern sig_chk_p_e = Pattern.compile("</SignatureCheck>");
+ Pattern man_chk_p_s = Pattern.compile("<SignatureManifestCheck>");
+ Pattern man_chk_p_e = Pattern.compile("</SignatureManifestCheck>");
+ Pattern cer_chk_p_s = Pattern.compile("<CertificateCheck>");
+ Pattern cer_chk_p_e = Pattern.compile("</CertificateCheck>");
+
+ Pattern code_p_s = Pattern.compile("<Code>");
+ Pattern code_p_e = Pattern.compile("</Code>");
+
+ Pattern cert_p_s = Pattern.compile("<dsig:X509Certificate>");
+ Pattern cert_p_e = Pattern.compile("</dsig:X509Certificate>");
+
+ Matcher sub_nam_m_s = sub_nam_p_s.matcher(xmlResponse);
+ Matcher sub_nam_m_e = sub_nam_p_e.matcher(xmlResponse);
+ Matcher iss_nam_m_s = iss_nam_p_s.matcher(xmlResponse);
+ Matcher iss_nam_m_e = iss_nam_p_e.matcher(xmlResponse);
+ Matcher ser_num_m_s = ser_num_p_s.matcher(xmlResponse);
+ Matcher ser_num_m_e = ser_num_p_e.matcher(xmlResponse);
+
+ Matcher sig_chk_m_s = sig_chk_p_s.matcher(xmlResponse);
+ Matcher sig_chk_m_e = sig_chk_p_e.matcher(xmlResponse);
+ Matcher man_chk_m_s = man_chk_p_s.matcher(xmlResponse);
+ Matcher man_chk_m_e = man_chk_p_e.matcher(xmlResponse);
+ Matcher cer_chk_m_s = cer_chk_p_s.matcher(xmlResponse);
+ Matcher cer_chk_m_e = cer_chk_p_e.matcher(xmlResponse);
+
+ Matcher cert_m_s = cert_p_s.matcher(xmlResponse);
+ Matcher cert_m_e = cert_p_e.matcher(xmlResponse);
+
+ SignatureResponse sig_res = new SignatureResponse();
+ if (sub_nam_m_s.find() && sub_nam_m_e.find())
+ {
+ String sub_nam = xmlResponse.substring(sub_nam_m_s.end(), sub_nam_m_e.start());
+ sig_res.setX509SubjectName(sub_nam);
+ }
+ if (iss_nam_m_s.find() && iss_nam_m_e.find())
+ {
+ String iss_nam = xmlResponse.substring(iss_nam_m_s.end(), iss_nam_m_e.start());
+ sig_res.setX509IssuerName(iss_nam);
+ }
+ if (ser_num_m_s.find() && ser_num_m_e.find())
+ {
+ String ser_num = xmlResponse.substring(ser_num_m_s.end(), ser_num_m_e.start());
+ sig_res.setX509SerialNumber(ser_num);
+ }
+ if (sig_chk_m_s.find() && sig_chk_m_e.find())
+ {
+ String sig_chk = xmlResponse.substring(sig_chk_m_s.end(), sig_chk_m_e.start());
+ Matcher code_m_s = code_p_s.matcher(sig_chk);
+ Matcher code_m_e = code_p_e.matcher(sig_chk);
+ if (code_m_s.find() && code_m_e.find())
+ {
+ String code = sig_chk.substring(code_m_s.end(), code_m_e.start());
+ sig_res.setSignatureCheckCode(code);
+ }
+ }
+ if (man_chk_m_s.find() && man_chk_m_e.find())
+ {
+ String man_chk = xmlResponse.substring(man_chk_m_s.end(), man_chk_m_e.start());
+ Matcher code_m_s = code_p_s.matcher(man_chk);
+ Matcher code_m_e = code_p_e.matcher(man_chk);
+ if (code_m_s.find() && code_m_e.find())
+ {
+ String code = man_chk.substring(code_m_s.end(), code_m_e.start());
+ sig_res.setSignatureManifestCheckCode(code);
+ }
+ }
+ if (cer_chk_m_s.find() && cer_chk_m_e.find())
+ {
+ String cer_chk = xmlResponse.substring(cer_chk_m_s.end(), cer_chk_m_e.start());
+ Matcher code_m_s = code_p_s.matcher(cer_chk);
+ Matcher code_m_e = code_p_e.matcher(cer_chk);
+ if (code_m_s.find() && code_m_e.find())
+ {
+ String code = cer_chk.substring(code_m_s.end(), code_m_e.start());
+ sig_res.setCertificateCheckCode(code);
+ }
+ }
+ if (cert_m_s.find() && cert_m_e.find())
+ {
+ String cert_string = xmlResponse.substring(cert_m_s.end(), cert_m_e.start());
+
+ X509Cert resp_cert = X509Cert.initByString(cert_string);
+ sig_res.setCertificate(resp_cert);
+ }
+
+ return sig_res;
+ }
+
+ protected String getConnectorValueFromProfile(String profile, String key)
+ {
+ String value = settings_.getValueFromKey("sig_obj." + profile + "." + key);
+ if (value == null)
+ {
+ value = settings_.getValueFromKey(key);
+ }
+ return value;
+ }
+
+ public String getSignURL(String profile)
+ {
+ final String key = TYPE + "." + ConnectorConfigurationKeys.VALUE_MODE_SIGN + ".url";
+ return getConnectorValueFromProfile(profile, key);
+ }
+
+ protected String getSignRequestTemplateFileName(String profile)
+ {
+ String key = TYPE + "." + ConnectorConfigurationKeys.VALUE_MODE_SIGN + ".request";
+ return getConnectorValueFromProfile(profile, key);
+ }
+
+ protected String getSignKeyIdentifier(String profile)
+ {
+ String key = TYPE + "." + ConnectorConfigurationKeys.VALUE_MODE_SIGN + ".KeyIdentifier";
+ return getConnectorValueFromProfile(profile, key);
+ }
+
+ public String getVerifyURL(String profile)
+ {
+ String key = TYPE + "." + ConnectorConfigurationKeys.VALUE_MODE_VERIFY + ".url";
+ return getConnectorValueFromProfile(profile, key);
+ }
+
+ protected String getVerifyRequestTemplateFileName(String profile)
+ {
+ String key = TYPE + "." + ConnectorConfigurationKeys.VALUE_MODE_VERIFY + ".request";
+ return getConnectorValueFromProfile(profile, key);
+ }
+
+ protected String getVerifyTemplateFileName(String profile)
+ {
+ String key = TYPE + "." + ConnectorConfigurationKeys.VALUE_MODE_VERIFY + ".template";
+ return getConnectorValueFromProfile(profile, key);
+ }
+
+ protected String getSigPropFileName(String profile)
+ {
+ String key = TYPE + "." + ConnectorConfigurationKeys.VALUE_MODE_VERIFY + ".template.SP";
+ return getConnectorValueFromProfile(profile, key);
+ }
+
+ protected String getVerifyTrustProfileID(String profile)
+ {
+ String key = TYPE + "." + ConnectorConfigurationKeys.VALUE_MODE_VERIFY + ".TrustProfileID";
+ return getConnectorValueFromProfile(profile, key);
+ }
+
+ /**
+ * This method connects the moa server getting the requestString, the given
+ * serviseMode and the endpointUrl. The requestString is the envelope of the
+ * SOAP Message send and recieve by the AXIS module. The Response SOAP message
+ * of the MOA server is parsed by AXIS and the message envelope is send back
+ * to the calling method.
+ *
+ * @param requestString
+ * the request string (XML) to send.
+ * @param serviceMode
+ * the mode which connect to MOA
+ * @param endpointURL
+ * the URL which the MOA server is running
+ * @return the response string (XML) of the MOA server
+ * @throws WebException
+ */
+ public static String connectMOA(String requestString, String serviceMode,
+ String endpointURL) throws WebException
+ {
+ try
+ {
+ if (logger_.isInfoEnabled())
+ {
+ logger_.info(serviceMode);
+ logger_.info(endpointURL);
+ }
+ // Parser/DOMBuilder instanzieren
+ DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+ factory.setNamespaceAware(true);
+ DocumentBuilder builder = factory.newDocumentBuilder();
+
+ // XML Datei in einen DOM-Baum umwandeln
+ ByteArrayInputStream bais = new ByteArrayInputStream(requestString.getBytes("UTF-8"));
+ Document xmlRequest = builder.parse(bais);
+
+ // Call öffnen
+ Call call = null;
+
+ // Neues BodyElement anlegen und mit dem DOM-Baum füllen
+ SOAPBodyElement body = new SOAPBodyElement(xmlRequest.getDocumentElement());
+ SOAPBodyElement[] params = new SOAPBodyElement[] { body };
+
+ // AXIS-Server instanzieren
+ Service service = ServiceFactory.newInstance().createService(new QName(serviceMode));
+ call = service.createCall();
+ call.setTargetEndpointAddress(endpointURL);
+
+ // Call auslösen und die Antworten speichern
+ if (logger_.isInfoEnabled())
+ {
+ logger_.info("Calling MOA:" + endpointURL);
+ }
+ Vector responses = (Vector) call.invoke(params);
+
+ // Erstes Body Element auslesen
+ SOAPBodyElement response = (SOAPBodyElement) responses.get(0);
+
+ // Aus der Response den DOM-Baum lesen
+ Document root_response = response.getAsDocument();
+ if (logger_.isInfoEnabled())
+ {
+ logger_.info("Return from MOA:" + serviceMode);
+ }
+
+ // XML-Formatierung konfiguieren
+ OutputFormat format = new OutputFormat((Document) root_response);
+ format.setLineSeparator("\n");
+ format.setIndenting(false);
+ format.setPreserveSpace(true);
+ format.setOmitXMLDeclaration(false);
+ format.setEncoding("UTF-8");
+
+ // Ausgabe der Webservice-Antwort auf die Konsole
+ // XMLSerializer conSerializer = new XMLSerializer(System.out, format);
+ // conSerializer.serialize(root_response);
+
+ // Ausgabe der Webservice-Antwort in Datei
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ XMLSerializer response_serializer = new XMLSerializer(baos, format);
+ response_serializer.serialize(root_response);
+ return baos.toString("UTF-8");
+ }
+ catch (Exception e)
+ {
+ throw new WebException(330, e);
+ }
+ // serialize signature only
+
+ // if
+ // (root_response.getDocumentElement().getLocalName().equals("CreateXMLSignatureResponse"))
+ // {
+ // Element signature = (Element)
+ // root_response.getElementsByTagNameNS("http://www.w3.org/2000/09/xmldsig#",
+ // "Signature").item(0);
+ // String signatureFile = getProperty(mode + "Request").substring(0,
+ // getProperty(mode +
+ // "Request").lastIndexOf('.')) + ".Signature.xml";
+ // fileSerializer = new XMLSerializer(new FileOutputStream(signatureFile),
+ // format);
+ // fileSerializer.serialize(signature);
+ // }
+
+ }
+} \ No newline at end of file
diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/table/Entry.java b/src/main/java/at/knowcenter/wag/egov/egiz/table/Entry.java
new file mode 100644
index 0000000..3f2caa7
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/egov/egiz/table/Entry.java
@@ -0,0 +1,227 @@
+/*
+ * <copyright> Copyright (c) 2006 by Know-Center, Graz, Austria </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+ * NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
+ * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES.
+ *
+ * $Id: Entry.java,v 1.3 2006/08/25 17:08:19 wprinz Exp $
+ */
+package at.knowcenter.wag.egov.egiz.table;
+
+import java.io.Serializable;
+
+/**
+ * This class implements a table entry for different types. A table entry can be
+ * styled and setting there column dimensions. The default value for the column
+ * dimension is 1. To declare the type of the entry use the public
+ * <code>TYPE_</code> definitions.
+ *
+ * @author wlackner
+ */
+public class Entry implements Serializable
+{
+
+ /**
+ * SVUID.
+ */
+ private static final long serialVersionUID = -7952755200668528348L;
+
+ /**
+ * Type for a text entry.
+ */
+ public final static int TYPE_CAPTION = 0;
+
+ /**
+ * Type for a text entry.
+ */
+ public final static int TYPE_VALUE = 1;
+
+ /**
+ * Type for an image entry.
+ */
+ public final static int TYPE_IMAGE = 2;
+
+ /**
+ * Type for a table entry.
+ */
+ public final static int TYPE_TABLE = 3;
+
+ /**
+ * The type info holder, default value is 0!
+ */
+ private int type_ = 0;
+
+ /**
+ * The entry value.
+ */
+ private Object value_ = null;
+
+ /**
+ * The key value
+ */
+ private String key_ = null;
+
+ /**
+ * The entry style information.
+ */
+ private Style style_ = null;
+
+ /**
+ * The column dimension.
+ */
+ private int colSpan_ = 1;
+
+ /**
+ * Text wrap indicator, default is <code>false</code>.
+ */
+ private boolean noWrap_ = false;
+
+ /**
+ * The empty constructor.
+ */
+ public Entry()
+ {
+ }
+
+ /**
+ * A constructor setting the type and the value.
+ *
+ * @param type
+ * the entry type to set
+ * @param value
+ * the entry value to set
+ */
+ public Entry(int type, Object value, String key)
+ {
+ type_ = type;
+ value_ = value;
+ key_ = key;
+ }
+
+ /**
+ * @return Returns the entry style.
+ */
+ public Style getStyle()
+ {
+ return style_;
+ }
+
+ /**
+ * @param style
+ * The style to set.
+ */
+ public void setStyle(Style style)
+ {
+ style_ = style;
+ }
+
+ /**
+ * @return Returns the entry type.
+ */
+ public int getType()
+ {
+ return type_;
+ }
+
+ /**
+ * @param type
+ * The type to set.
+ */
+ public void setType(int type)
+ {
+ type_ = type;
+ }
+
+ /**
+ * @return Returns the entry value.
+ */
+ public Object getValue()
+ {
+ return value_;
+ }
+
+ /**
+ * @param value
+ * The value to set.
+ */
+ public void setValue(Object value)
+ {
+ value_ = value;
+ }
+
+ /**
+ * @return Returns the key.
+ */
+
+ public String getKey()
+ {
+ return key_;
+ }
+
+ /**
+ * @param key
+ * The key to set.
+ */
+ public void setKey(String key)
+ {
+ key_ = key;
+ }
+
+ /**
+ * @return Returns the colSpan.
+ */
+ public int getColSpan()
+ {
+ return colSpan_;
+ }
+
+ /**
+ * @param colSpan
+ * The colSpan to set.
+ */
+ public void setColSpan(int colSpan)
+ {
+ colSpan_ = colSpan;
+ }
+
+ /**
+ * @return Returns the wrap indicator.
+ */
+ public boolean isNoWrap()
+ {
+ return noWrap_;
+ }
+
+ /**
+ * @param noWrap
+ * The wrap indicator to set.
+ */
+ public void setNoWrap(boolean noWrap)
+ {
+ noWrap_ = noWrap;
+ }
+
+ /**
+ * The toString method, used for tests or debugging.
+ */
+ public String toString()
+ {
+ Object obj = getValue();
+ String value = null;
+ if (obj != null)
+ {
+ value = obj.toString();
+ }
+ return "Type:" + getType() + " Value:" + value + " ColSpan:" + getColSpan();
+ }
+
+} \ No newline at end of file
diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/table/Style.java b/src/main/java/at/knowcenter/wag/egov/egiz/table/Style.java
new file mode 100644
index 0000000..285361a
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/egov/egiz/table/Style.java
@@ -0,0 +1,368 @@
+/*
+ * <copyright>
+ * Copyright (c) 2006 by Know-Center, Graz, Austria
+ * </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF THE
+ * SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE,
+ * OR NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES
+ * SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING
+ * THIS SOFTWARE OR ITS DERIVATIVES.
+ *
+ * $Id: Style.java,v 1.3 2006/08/25 17:08:19 wprinz Exp $
+ */
+package at.knowcenter.wag.egov.egiz.table;
+
+import java.awt.Color;
+import java.io.Serializable;
+
+/**
+ * This class implements an abstract style definiton used in tables or table entrys. Predefined
+ * values exists for valign and halign. Color definitions uses the native awt color declarations.
+ * <br>
+ * The predefined keys are used in the setting definition file to style tables and table entries.
+ * <br>
+ * It provides an static method to inherit style informations from a given style object.
+ * {@link at.knowcenter.wag.egov.egiz.table.Style#doInherit}
+ *
+ *
+ * @author wlackner
+ * @see java.awt.Color
+ */
+public class Style implements Serializable {
+ /**
+ * SVUID.
+ */
+ private static final long serialVersionUID = 5855722896712428387L;
+
+ /**
+ * valign statement key top
+ */
+ public final static String TOP = "top";
+ /**
+ * valign statement key middle
+ */
+ public final static String MIDDLE = "middle";
+ /**
+ * valign statement key bottom
+ */
+ public final static String BOTTOM = "bottom";
+ /**
+ * halign statement key left
+ */
+ public final static String LEFT = "left";
+ /**
+ * halign statement key center
+ */
+ public final static String CENTER = "center";
+ /**
+ * halign statement key right
+ */
+ public final static String RIGHT = "right";
+
+ /**
+ * bgcolor key
+ */
+ public final static String BGCOLOR = "bgcolor";
+ /**
+ * halign key
+ */
+ public final static String HALIGN = "halign";
+ /**
+ * valign key
+ */
+ public final static String VALIGN = "valign";
+ /**
+ * padding key, default padding = 1
+ */
+ public final static String PADDING = "padding";
+ /**
+ * border key, default border = 1;<br>
+ * The border value is one value for all border lines of an entry or table! <br>
+ * No separte definitions for top, right, bottom or left are possible.
+ */
+ public final static String BORDER = "border";
+
+ /**
+ * Font key
+ */
+ public final static String FONT = "font";
+
+ /**
+ * The value font key.
+ */
+ public final static String VALUEFONT = "valuefont";
+
+ /**
+ * Font name HELVETICA
+ */
+ public final static String HELVETICA = "HELVETICA";
+ /**
+ * Font name TIMES_ROMAN
+ */
+ public final static String TIMES_ROMAN = "TIMES_ROMAN";
+ /**
+ * Font name COURIER
+ */
+ public final static String COURIER = "COURIER";
+ /**
+ * Font type NORMAL
+ */
+ public final static String NORMAL = "NORMAL";
+ /**
+ * Font type BOLD
+ */
+ public final static String BOLD = "BOLD";
+ /**
+ * Font type ITALIC
+ */
+ public final static String ITALIC = "ITALIC";
+ /**
+ * Font type BOLDITALIC
+ */
+ public final static String BOLDITALIC = "BOLDITALIC";
+ /**
+ * Font type UNDERLINE
+ */
+ public final static String UNDERLINE = "UNDERLINE";
+ /**
+ * Font type STRIKETHRU
+ */
+ public final static String STRIKETHRU = "STRIKETHRU";
+
+
+ /**
+ * all paddings initialized with the default padding value (1)
+ */
+ private static final float DEFAULT_PADDING = 1;
+ /**
+ * all borders initialized with the default border value (1)
+ */
+ private static final float DEFAULT_BORDER = 1;
+ /**
+ * The background color definition.
+ */
+ private Color bgColor_ = null;
+ /**
+ * The current padding value -> initialized with the default padding value
+ */
+ private float padding_ = DEFAULT_PADDING;
+ /**
+ * The current halign value -> initialized with left
+ */
+ private String hAlign_ = LEFT;
+ /**
+ * The current valign value -> initialized with top
+ */
+ private String vAlign_ = TOP;
+ /**
+ * The current border value -> initialized with the default border value
+ */
+ private float border_ = DEFAULT_BORDER;
+ /**
+ * The font string of the style definition
+ */
+ private String font_ = null;
+ /**
+ * The font string of the value font.
+ */
+ private String valuefont_ = null;
+
+ /**
+ * The empty constructor.
+ */
+ public Style() {
+ }
+
+ /**
+ * Set a style attribute. The style attribute must be one of the public definitions
+ *
+ * @param id the style attribute to set
+ * @param value the style value to set for the given attribute
+ */
+ public void setStyle(String id, String value) {
+ if (BGCOLOR.equals(id)) {
+ String[] col_strg = value.split(" ");
+ if (col_strg.length == 3) {
+ int r = Integer.parseInt(col_strg[0]);
+ int g = Integer.parseInt(col_strg[1]);
+ int b = Integer.parseInt(col_strg[2]);
+ if (r < 256 && g < 256 && b < 256 && r >= 0 && g >= 0 && b >= 0) {
+ bgColor_ = new Color(r, g, b);
+ }
+ }
+ }
+ if (HALIGN.equals(id)) {
+ if (LEFT.equals(value) || CENTER.equals(value) || RIGHT.equals(value)) {
+ hAlign_ = value;
+ }
+ }
+ if (VALIGN.equals(id)) {
+ if (TOP.equals(value) || MIDDLE.equals(value) || BOTTOM.equals(value)) {
+ vAlign_ = value;
+ }
+ }
+ if (PADDING.equals(id)) {
+ padding_ = Float.parseFloat(value);
+ }
+ if (BORDER.equals(id)) {
+ border_ = Float.parseFloat(value);
+ }
+ if (FONT.equals(id)) {
+ font_ = value;
+ }
+ if (VALUEFONT.equals(id)) {
+ valuefont_ = value;
+ }
+ }
+
+ /**
+ * @return Returns the bgColor.
+ */
+ public Color getBgColor() {
+ return bgColor_;
+ }
+
+ /**
+ * @param bgColor The bgColor to set.
+ */
+ public void setBgColor(Color bgColor) {
+ bgColor_ = bgColor;
+ }
+
+ /**
+ * @return Returns the hAlign.
+ */
+ public String getHAlign() {
+ return hAlign_;
+ }
+
+ /**
+ * @param align The hAlign to set.
+ */
+ public void setHAlign(String align) {
+ hAlign_ = align;
+ }
+
+ /**
+ * @return Returns the padding.
+ */
+ public float getPadding() {
+ return padding_;
+ }
+
+ /**
+ * @param padding The padding to set.
+ */
+ public void setPadding(float padding) {
+ padding_ = padding;
+ }
+
+ /**
+ * @return Returns the vAlign.
+ */
+ public String getVAlign() {
+ return vAlign_;
+ }
+
+ /**
+ * @param align The vAlign to set.
+ */
+ public void setVAlign(String align) {
+ vAlign_ = align;
+ }
+
+ /**
+ * @return Returns the border.
+ */
+ public float getBorder() {
+ return border_;
+ }
+
+ /**
+ * @param border The border to set.
+ */
+ public void setBorder(float border) {
+ border_ = border;
+ }
+
+
+ /**
+ * @return Returns the font.
+ */
+ public String getFont() {
+ return font_;
+ }
+
+ /**
+ * @param font The font to set.
+ */
+ public void setFont(String font) {
+ font_ = font;
+ }
+
+
+ /**
+ * Returns the value font.
+ * @return Returns the value font.
+ */
+ public String getValueFont()
+ {
+ return valuefont_;
+ }
+
+ /**
+ * Sets the value font.
+ * @param valuefont The value font to be set.
+ */
+ public void setValueFont(String valuefont)
+ {
+ this.valuefont_ = valuefont;
+ }
+
+ /**
+ * The toString method, used for tests or debugging.
+ */
+ public String toString() {
+ return "bgcolor:" + getBgColor() + " halign:" + getHAlign() + " valign:" + getVAlign() + " padding:" + getPadding() + " border:" + getBorder() + " font:" + getFont() + " valuefont:" + getValueFont();
+ }
+
+ /**
+ * This method inherits all style attributes (values) from a given style object. A new style
+ * object is created if the base style object is null. If a value is not defined in the
+ * <code>baseStyle</code> object it would be inhert from the <code>inheritStyle</code> object.
+ *
+ * @param baseStyle the base style object that should be enhanced
+ * @param inhertStyle the style values that could inherit from
+ * @return an inherit style object
+ */
+ public static Style doInherit(Style baseStyle, Style inhertStyle) {
+ if (baseStyle == null) {
+ baseStyle = new Style();
+ }
+ if (inhertStyle != null) {
+
+ if (baseStyle.getBgColor() == null)
+ baseStyle.setBgColor(inhertStyle.getBgColor());
+ if (baseStyle.getBorder() == DEFAULT_BORDER)
+ baseStyle.setBorder(inhertStyle.getBorder());
+ if (baseStyle.getHAlign() == null)
+ baseStyle.setHAlign(inhertStyle.getHAlign());
+ if (baseStyle.getVAlign() == null)
+ baseStyle.setVAlign(inhertStyle.getVAlign());
+ if (baseStyle.getPadding() == DEFAULT_PADDING)
+ baseStyle.setPadding(inhertStyle.getPadding());
+ if (baseStyle.getFont() == null)
+ baseStyle.setFont(inhertStyle.getFont());
+ if (baseStyle.getValueFont() == null)
+ baseStyle.setValueFont(inhertStyle.getValueFont());
+ }
+ return baseStyle;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/table/Table.java b/src/main/java/at/knowcenter/wag/egov/egiz/table/Table.java
new file mode 100644
index 0000000..ceea1f3
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/egov/egiz/table/Table.java
@@ -0,0 +1,215 @@
+/*
+ * <copyright> Copyright (c) 2006 by Know-Center, Graz, Austria </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+ * NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
+ * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES.
+ *
+ * $Id: Table.java,v 1.2 2006/08/25 17:08:19 wprinz Exp $
+ */
+package at.knowcenter.wag.egov.egiz.table;
+
+import java.io.Serializable;
+import java.util.Map;
+import java.util.HashMap;
+import java.util.ArrayList;
+
+/**
+ * This class implements an abstract table definition. The table contains table
+ * rows and the table rows contains the table entries. A table can be styled and
+ * a relative column width can be set.
+ *
+ * @author wlackner
+ * @see at.knowcenter.wag.egov.egiz.table.Style
+ * @see at.knowcenter.wag.egov.egiz.table.Entry
+ */
+public class Table implements Serializable
+{
+
+ /**
+ * SVUID.
+ */
+ private static final long serialVersionUID = 8488947943674086618L;
+
+ /**
+ * The table column settings.
+ */
+ private float[] colsRelativeWith_ = null;
+
+ /**
+ * The row definitions.
+ */
+ private Map rows_ = new HashMap();
+
+ /**
+ * The table width.
+ */
+ private float width_ = 100;
+
+ /**
+ * The table style.
+ */
+ private Style style_ = null;
+
+ /**
+ * Number of columns that are defined for the current table.
+ */
+ private int maxCols_ = 0;
+
+ /**
+ * A table name.
+ */
+ private String name_ = null;
+
+ /**
+ * The table constructor init by a table name.
+ *
+ * @param name
+ * the name for the table.
+ */
+ public Table(String name)
+ {
+ name_ = name;
+ }
+
+ /**
+ * The width of the columns are relative to each other. This means the values
+ * are summarized and divided into portions of columns used. <br>
+ * Example: <code>[1,4]</code> means the second column is four times wider
+ * than the first column.
+ *
+ * @return Returns the relative width of the columns
+ */
+ public float[] getColsRelativeWith()
+ {
+ return colsRelativeWith_;
+ }
+
+ /**
+ * The width of the columns are relative to each other. This means the values
+ * are summarized and divided into portions of columns used. <br>
+ * Example: <code>[10,90]</code> means the first colum consumes 10% and the
+ * second column consumes 90% of the table width. <br>
+ * The relative width of the columns to set.
+ */
+ public void setColsRelativeWith(float[] cols)
+ {
+ colsRelativeWith_ = cols;
+ }
+
+ /**
+ * @return Returns the style.
+ */
+ public Style getStyle()
+ {
+ return style_;
+ }
+
+ /**
+ * @param style
+ * The style to set.
+ */
+ public void setStyle(Style style)
+ {
+ style_ = style;
+ }
+
+ /**
+ * @return Returns the width.
+ */
+ public float getWidth()
+ {
+ return width_;
+ }
+
+ /**
+ * @param width
+ * The width to set.
+ */
+ public void setWidth(float width)
+ {
+ width_ = width;
+ }
+
+ /**
+ * @return Returns the maxCols.
+ */
+ public int getMaxCols()
+ {
+ return maxCols_;
+ }
+
+ /**
+ * @return Returns the name.
+ */
+ public String getName()
+ {
+ return name_;
+ }
+
+ /**
+ * This method returns a sorted row list beginning with the row number 1. The
+ * entrys in a row also stored in a <code>{@link ArrayList}</code>.
+ *
+ * @return Returns the sorted (by row number) table rows.
+ */
+ public ArrayList getRows()
+ {
+ ArrayList rows = new ArrayList();
+ for (int row_idx = 1; row_idx <= rows_.size(); row_idx++)
+ {
+ ArrayList row = (ArrayList) rows_.get("" + row_idx);
+ rows.add(row);
+ }
+ return rows;
+ }
+
+ /**
+ * Add a comlete table row to the current table. Be carefull usding the
+ * correct row number because no check is done if a row with the given row
+ * number does exist! In that case the stored row would be replaced!
+ *
+ * @param rowNumber
+ * the row number to store the row entries
+ * @param row
+ * the entry list to store
+ */
+ public void addRow(String rowNumber, ArrayList row)
+ {
+ rows_.put(rowNumber, row);
+ if (row.size() > maxCols_)
+ {
+ maxCols_ = row.size();
+ }
+ }
+
+ /**
+ * The toString method, used for tests or debugging.
+ */
+ public String toString()
+ {
+ String the_string = "\n#### TABLE " + name_ + " BEGIN #####";
+ the_string += " Width:" + width_ + " max cols:" + maxCols_ + " cols:" + colsRelativeWith_;
+ the_string += "\nStyle:" + style_;
+ ArrayList rows = getRows();
+ for (int row_idx = 0; row_idx < rows.size(); row_idx++)
+ {
+ ArrayList row = (ArrayList) rows.get(row_idx);
+ String row_prefix = "\n ++ ROW " + row_idx + " ++ ";
+ for (int entry_idx = 0; entry_idx < row.size(); entry_idx++)
+ {
+ the_string += row_prefix + ((Entry) row.get(entry_idx)).toString();
+ }
+ }
+ the_string += "\n#### TABLE " + name_ + " END #####";
+ return the_string;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/test/AbsTexTest.java b/src/main/java/at/knowcenter/wag/egov/egiz/test/AbsTexTest.java
new file mode 100644
index 0000000..22b20ee
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/egov/egiz/test/AbsTexTest.java
@@ -0,0 +1,141 @@
+/**
+ *
+ */
+package at.knowcenter.wag.egov.egiz.test;
+
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStreamWriter;
+import java.util.List;
+
+import org.apache.log4j.Logger;
+import org.apache.log4j.PropertyConfigurator;
+
+import at.knowcenter.wag.egov.egiz.PdfAS;
+import at.knowcenter.wag.egov.egiz.cfg.ConfigLogger;
+import at.knowcenter.wag.egov.egiz.cfg.SettingsReader;
+import at.knowcenter.wag.egov.egiz.exceptions.PresentableException;
+import at.knowcenter.wag.egov.egiz.pdf.AbsoluteTextSignature;
+import at.knowcenter.wag.egov.egiz.pdf.SignatureHolder;
+import at.knowcenter.wag.egov.egiz.pdf.TextualSignature;
+import at.knowcenter.wag.egov.egiz.sig.SignatureResponse;
+
+/**
+ * Test file for testing the absolute text signature.
+ * @author wprinz
+ */
+public class AbsTexTest
+{
+
+ /**
+ * The logger definition.
+ */
+ private static final Logger logger = ConfigLogger.getLogger(AbsTexTest.class);
+
+ /**
+ * @param args
+ * @throws IOException
+ * @throws PresentableException
+ */
+ public static void main(String[] args) throws IOException, PresentableException
+ {
+ SettingsReader.initializeForCommandLine();
+ PropertyConfigurator.configure(SettingsReader.CONFIG_PATH + "log4j.properties");
+
+ File BASE_DIR = new File("C:\\wprinz\\Filer\\egiz\\docs\\abstexsig");
+ File original_file = new File(BASE_DIR, "AbsTexSig.pdf");
+ File signed_file = new File(BASE_DIR, "AbsTexSig.pdf_out.pdf");
+ File signed_signed_file = new File(BASE_DIR, "AbsTexSig.pdf_out.pdf_out.pdf");
+
+ File in = new File("C:\\wprinz\\Filer\\egiz\\docs\\Abnahmetests\\tests\\commandline\\alte_sig\\document4.pdf_asimoaold.pdf_out.pdf");
+ byte[] pdf = readInFile(in);
+
+ ByteArrayInputStream bais = new ByteArrayInputStream(pdf, 0, pdf.length);
+ String raw_text = TextualSignature.extractTextTextual(bais);
+
+ String text = PdfAS.extractNormalizedTextTextual(pdf, pdf.length);
+
+ writeTextToFile(raw_text, new File(BASE_DIR, "raw_text.utf8.txt"));
+ writeTextToFile(text, new File(BASE_DIR, "text.utf8.txt"));
+
+ if (true)
+ {
+ return;
+ }
+
+ String[] texts = new String[3];
+
+ byte[] original = readInFile(original_file);
+ byte[] signed = readInFile(signed_file);
+ byte[] signed2 = readInFile(signed_signed_file);
+
+ texts[0] = PdfAS.extractNormalizedTextTextual(original, original.length);
+ texts[1] = PdfAS.extractNormalizedTextTextual(signed, signed.length);
+ texts[2] = PdfAS.extractNormalizedTextTextual(signed2, signed2.length);
+
+ writeTextToFile(texts[0], new File(BASE_DIR, "original.utf8.txt"));
+ writeTextToFile(texts[1], new File(BASE_DIR, "signed.utf8.txt"));
+ writeTextToFile(texts[2], new File(BASE_DIR, "signed_signed.utf8.txt"));
+
+ // String text = texts[2];
+
+ List holders = AbsoluteTextSignature.extractSignatureHoldersFromText(text);
+ logger.debug("extracted " + holders.size() + " holders:");
+ for (int i = 0; i < holders.size(); i++)
+ {
+ SignatureHolder holder = (SignatureHolder) holders.get(i);
+
+ logger.debug(" #" + i + ": " + holder.getSignatureObject().getSignationDate() + ", " + holder.getSignatureObject().getSignatureTypeDefinition().getType());
+ }
+
+ SignatureHolder sh_latest = (SignatureHolder) holders.get(1);
+
+ SignatureHolder sh_earlier = (SignatureHolder) holders.get(0);
+
+ writeTextToFile(sh_latest.getSignedText(), new File(BASE_DIR, "reconstructed_latest.utf8.txt"));
+ writeTextToFile(sh_earlier.getSignedText(), new File(BASE_DIR, "reconstructed.utf8.txt"));
+
+ verifyReconstruction(sh_latest.getSignedText(), texts[1]);
+ verifyReconstruction(sh_earlier.getSignedText(), texts[0]);
+
+ SignatureResponse sr = PdfAS.verify(sh_latest, "moa");
+ System.out.println(sr);
+ sr = PdfAS.verify(sh_earlier, "moa");
+ System.out.println(sr);
+
+ }
+
+ public static byte[] readInFile(File file) throws IOException
+ {
+ FileInputStream fis = new FileInputStream(file);
+ byte[] ba = new byte[(int) file.length()];
+ fis.read(ba);
+ fis.close();
+ return ba;
+ }
+
+ public static void writeTextToFile(String text, File file) throws IOException
+ {
+ FileOutputStream fos = new FileOutputStream(file);
+ OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8");
+ osw.write(text);
+ osw.close();
+ }
+
+ public static void verifyReconstruction(String reconstructed_text,
+ String expected_text)
+ {
+ if (reconstructed_text.equals(expected_text))
+ {
+ System.out.println("TEXT MATCHED OK!");
+ }
+ else
+ {
+ System.err.println("TEXT DIDN'T MATCH!!!!!!!");
+ }
+ }
+
+}
diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/test/BinSig.java b/src/main/java/at/knowcenter/wag/egov/egiz/test/BinSig.java
new file mode 100644
index 0000000..612ada1
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/egov/egiz/test/BinSig.java
@@ -0,0 +1,345 @@
+/**
+ * <copyright> Copyright (c) 2006 by Know-Center, Graz, Austria </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+ * NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
+ * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES.
+ *
+ * $Id: BinSig.java,v 1.1 2006/10/31 08:19:52 wprinz Exp $
+ */
+package at.knowcenter.wag.egov.egiz.test;
+
+import java.awt.Color;
+import java.io.ByteArrayOutputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import at.knowcenter.wag.egov.egiz.exceptions.PDFDocumentException;
+import at.knowcenter.wag.egov.egiz.pdf.Placeholder;
+import at.knowcenter.wag.egov.egiz.pdf.SplitStrings;
+import at.knowcenter.wag.egov.egiz.pdf.StringInfo;
+
+import com.lowagie.text.BadElementException;
+import com.lowagie.text.Chunk;
+import com.lowagie.text.Document;
+import com.lowagie.text.DocumentException;
+import com.lowagie.text.Font;
+import com.lowagie.text.FontFactory;
+import com.lowagie.text.Paragraph;
+import com.lowagie.text.Phrase;
+import com.lowagie.text.Rectangle;
+import com.lowagie.text.pdf.BaseFont;
+import com.lowagie.text.pdf.PdfContentByte;
+import com.lowagie.text.pdf.PdfIndirectReference;
+import com.lowagie.text.pdf.PdfPCell;
+import com.lowagie.text.pdf.PdfPTable;
+import com.lowagie.text.pdf.PdfTemplate;
+import com.lowagie.text.pdf.PdfWriter;
+
+/**
+ * @author wprinz
+ */
+public class BinSig
+{
+
+ public static final String KEY_DATE = "Datum ÖÄÜ:";
+
+ public static final String KEY_SN = "Seriennummer öäü:";
+
+ public static final String KEY_SIGVAL = "Signaturwert ß:";
+
+ public static final String KEY_ISSUER = "Aussteller .,!?:";
+
+ /**
+ * @param args
+ * @throws DocumentException
+ * @throws IOException
+ * @throws PDFDocumentException
+ */
+ public static void main(String[] args) throws DocumentException, IOException, PDFDocumentException
+ {
+ BinSig bs = new BinSig();
+ bs.action();
+ }
+
+ public void action() throws IOException, DocumentException, PDFDocumentException
+ {
+ Document.compress = false;
+
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+
+ Document document = new Document();
+ PdfWriter writer = PdfWriter.getInstance(document, baos);
+
+ document.open();
+
+ Paragraph p1 = new Paragraph(new Chunk("This is my first paragraph. ", FontFactory.getFont(FontFactory.HELVETICA, 10)));
+ p1.add("The leading of this paragraph is calculated automagically. ");
+ p1.add("The default leading is 1.5 times the fontsize. ");
+ p1.add(new Chunk("You can add chunks "));
+ p1.add(new Phrase("or you can add phrases. "));
+ p1.add(new Phrase("Unless you change the leading with the method setLeading, the leading doesn't change if you add text with another leading. This can lead to some problems.", FontFactory.getFont(FontFactory.HELVETICA, 18)));
+ document.add(p1);
+ Paragraph p2 = new Paragraph(new Phrase("This is my second paragraph. ", FontFactory.getFont(FontFactory.HELVETICA, 12)));
+ p2.add("As you can see, it started on a new line.");
+ document.add(p2);
+ Paragraph p3 = new Paragraph("This is my third paragraph.", FontFactory.getFont(FontFactory.HELVETICA, 12));
+ document.add(p3);
+
+ PdfContentByte cb = writer.getDirectContent();
+
+ // Font tableFont = FontFactory.getFont(FontFactory.COURIER,
+ // Font.DEFAULTSIZE, Font.NORMAL);
+ // Font tableFont = FontFactory.getFont(FontFactory.HELVETICA,
+ // Font.DEFAULTSIZE, Font.NORMAL);
+
+ BaseFont bf = BaseFont.createFont(BaseFont.COURIER, BaseFont.WINANSI, false);
+ Font tableFont = new Font(bf, 12);
+
+ float padding = 0f;
+ Rectangle border = new Rectangle(0f, 0f);
+ border.setBorder(Rectangle.BOX);
+ border.setBorderWidth(1);
+ border.setBorderColor(Color.BLACK);
+ border.setBackgroundColor(new Color(.75f, .75f, 1f));
+ PdfPTable table = makeTestPage(tableFont, border, padding, true, true);
+
+ float width = 400;
+ table.setTotalWidth(width);
+ float height = table.getTotalHeight();
+
+ PdfTemplate template = cb.createTemplate(width, height);
+
+ // we add some graphics
+ // template.moveTo(0, 200);
+ // template.lineTo(500, 0);
+ // template.rectangle(0, 0, width, height);
+ // template.setLineWidth(3);
+ // template.stroke();
+
+ table.writeSelectedRows(0, -1, 0, table.getTotalHeight(), template);
+
+ // we add some text
+ // template.beginText();
+ // template.setFontAndSize(BaseFont.createFont(BaseFont.HELVETICA,
+ // BaseFont.CP1252, BaseFont.NOT_EMBEDDED), 12);
+ // template.setTextMatrix(0, 0);
+ // template.showText("Text at the position 0,0 (relative to the
+ // template!)");
+ // template.endText();
+
+ // we add the template on different positions
+ cb.addTemplate(template, 100, 500);
+
+ PdfIndirectReference template_ref = template.getIndirectReference();
+ System.out.println("template = " + template_ref.getNumber() + " " + template_ref.getGeneration());
+
+ document.close();
+
+ baos.close();
+ byte[] pdf = baos.toByteArray();
+
+ // not the best solution to parse the stream, but work's for now.
+ String pdf_string = new String(pdf, "ISO-8859-1");
+ int obj_start = pdf_string.lastIndexOf(template_ref.getNumber() + " " + template_ref.getGeneration() + " obj");
+ int stream_start = pdf_string.indexOf("stream\n", obj_start) + 7;
+ int stream_end = pdf_string.indexOf("endstream\nendobj", stream_start);
+ int stream_len = stream_end - stream_start;
+ byte[] stream = new byte[stream_len];
+ System.arraycopy(pdf, stream_start, stream, 0, stream_len);
+
+ String stream_string = new String(stream, "ISO-8859-1");
+ System.out.println(stream_string);
+
+ List strings = Placeholder.parseStrings(pdf, stream_start, stream_end);
+
+ List date = new ArrayList();
+ List sn = new ArrayList();
+ List sigval = new ArrayList();
+ List issuer = new ArrayList();
+
+ List[] partitions = new List[] { date, sn, sigval, issuer };
+
+ Iterator it = strings.iterator();
+ int cur_list = -1;
+ while (it.hasNext())
+ {
+ StringInfo si = (StringInfo) it.next();
+
+ String str = si.getString("ISO-8859-1");
+
+ if (str.equals(KEY_DATE))
+ {
+ cur_list = 0;
+ continue;
+ }
+ if (str.equals(KEY_SN))
+ {
+ cur_list = 1;
+ continue;
+ }
+ if (str.equals(KEY_SIGVAL))
+ {
+ cur_list = 2;
+ continue;
+ }
+ if (str.equals(KEY_ISSUER))
+ {
+ cur_list = 3;
+ continue;
+ }
+
+ partitions[cur_list].add(si);
+ }
+
+ String date_orig = "The Date doesn't make problems.";
+ String sn_orig = "0123456789abcdefghijklmnopqrstuvwxyz0123456789";
+ String sigval_orig = "ashdjklsbfkabsflkbadslkfblasdkfhajösdhfkjlasdhfkljasdbfljkasdhfljkasdhfljkasdhfasdfhj.";
+ String issuer_orig = "CN=Republik Österreich, \\\\O=Bund irgendwas, C=ÖÄÜsterreich, N=ein paar \\worte ohne (sinnn und) verstand #+ßÜ,ÄÖÜ;äöü";
+ BinSig.replacePlaceholder(new SplitStrings(pdf, date), date_orig.getBytes("ISO-8859-1"));
+ BinSig.replacePlaceholder(new SplitStrings(pdf, sn), sn_orig.getBytes("ISO-8859-1"));
+ BinSig.replacePlaceholder(new SplitStrings(pdf, sigval), sigval_orig.getBytes("ISO-8859-1"));
+ Placeholder.replacePlaceholderWithTolerance(pdf, issuer, issuer_orig.getBytes("ISO-8859-1"), 10);
+ // replacePlaceholders(pdf, "CN=Seppl Maximilian Hötürälß, ÖÜÄß", (byte)
+ // 'Y');
+
+ byte [] enc = { 'w', 'i', 'n' };
+ String date_rec = Placeholder.reconstructStringFromPartition(pdf, date, enc);
+ String sn_rec = Placeholder.reconstructStringFromPartition(pdf, sn, enc);
+ String sigval_rec = Placeholder.reconstructStringFromPartition(pdf, sigval, enc);
+ String issuer_rec = Placeholder.reconstructStringFromPartition(pdf, issuer, enc);
+
+ System.out.println("date ok = " + date_orig.equals(date_rec));
+ System.out.println("sn ok = " + sn_orig.equals(sn_rec));
+ System.out.println("sigval ok = " + sigval_orig.equals(sigval_rec));
+ System.out.println("issuer ok = " + issuer_orig.equals(issuer_rec));
+
+ FileOutputStream fos = new FileOutputStream("C:\\test.pdf");
+ fos.write(pdf);
+ fos.close();
+
+ System.out.println("finished");
+
+ }
+
+ private static PdfPTable makeTestPage(Font tableFont, Rectangle borders,
+ float padding, boolean ascender, boolean descender) throws BadElementException, DocumentException, IOException
+ {
+ // document.newPage();
+ PdfPTable table = null;
+ table = new PdfPTable(2);
+ table.setWidthPercentage(100f);
+
+ table.setWidths(new float[] { 30, 70 });
+
+ table.addCell(makeNormalCell(KEY_DATE));
+ table.addCell(makeValueCell("DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"));
+
+ table.addCell(makeNormalCell(KEY_SN));
+ table.addCell(makeValueCell("SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS"));
+
+ table.addCell(makeNormalCell(KEY_SIGVAL));
+ table.addCell(makeValueCell("WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"));
+
+ table.addCell(makeNormalCell(KEY_ISSUER));
+ table.addCell(makeValueCell("IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII"));
+
+ return table;
+ }
+
+ protected static PdfPCell makeCell(String text, int vAlignment,
+ int hAlignment, Font font, float leading, float padding,
+ Rectangle borders, boolean ascender, boolean descender)
+ {
+ Paragraph p = new Paragraph(text, font);
+ p.setLeading(leading);
+
+ PdfPCell cell = new PdfPCell(p);
+ cell.setLeading(leading, 0);
+ cell.setVerticalAlignment(vAlignment);
+ cell.setHorizontalAlignment(hAlignment);
+ cell.cloneNonPositionParameters(borders);
+ cell.setUseAscender(ascender);
+ cell.setUseDescender(descender);
+ cell.setUseBorderPadding(true);
+ cell.setPadding(padding);
+ return cell;
+ }
+
+ private static PdfPCell makeNormalCell(String text)
+ {
+
+ Paragraph p = new Paragraph(text);
+
+ PdfPCell cell = new PdfPCell(p);
+ cell.setBorder(PdfPCell.BOX);
+ cell.setBorderColor(Color.BLUE);
+ cell.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE);
+
+ return cell;
+ }
+
+ private static PdfPCell makeValueCell(String placeholder) throws DocumentException, IOException
+ {
+ BaseFont bf = BaseFont.createFont(BaseFont.COURIER, BaseFont.WINANSI, false);
+ Font ff = new Font(bf, 12);
+
+ Paragraph p = new Paragraph(placeholder, ff);
+
+ PdfPCell cell = new PdfPCell(p);
+ cell.setBorder(PdfPCell.BOX);
+ cell.setBorderColor(Color.RED);
+
+ return cell;
+ }
+
+ protected boolean isPlaceholder(byte[] pdf, StringInfo si, byte placeholder)
+ {
+ for (int i = si.string_start; i < si.string_start + si.string_length; i++)
+ {
+ if (pdf[i] != placeholder)
+ {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /**
+ * Replaces the given placeholders with the given bytes.
+ * @param ss The SplitStrings placeholders.
+ * @param replace_bytes The bytes to be filled in.
+ */
+ public static void replacePlaceholder(SplitStrings ss, byte[] replace_bytes)
+ {
+
+ for (int i = 0; i < replace_bytes.length; i++)
+ {
+ byte[] data = Placeholder.escapeByte(replace_bytes[i]);
+ if (!ss.fits(data))
+ {
+ ss.newline();
+ }
+ ss.write(data);
+ }
+ ss.fillRest();
+
+ // if (replace_read < replace_bytes.length)
+ // {
+ // System.err.println("The replace string was longer than the reserved placeholder.");
+ // throw new PlaceholderException(null, replace_bytes.length - replace_read);
+ // }
+ }
+
+}
diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/test/ExtractTextTextual.java b/src/main/java/at/knowcenter/wag/egov/egiz/test/ExtractTextTextual.java
new file mode 100644
index 0000000..e2433b0
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/egov/egiz/test/ExtractTextTextual.java
@@ -0,0 +1,62 @@
+/**
+ * <copyright> Copyright (c) 2006 by Know-Center, Graz, Austria </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+ * NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
+ * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES.
+ *
+ * $Id: ExtractTextTextual.java,v 1.1 2006/10/31 08:19:52 wprinz Exp $
+ */
+package at.knowcenter.wag.egov.egiz.test;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+
+import at.knowcenter.wag.egov.egiz.PdfAS;
+import at.knowcenter.wag.egov.egiz.cfg.SettingsReader;
+import at.knowcenter.wag.egov.egiz.exceptions.PresentableException;
+
+/**
+ * Test.
+ *
+ * @author wprinz
+ */
+public class ExtractTextTextual
+{
+
+ /**
+ * @param args
+ * @throws IOException
+ * @throws PresentableException
+ */
+ public static void main(String[] args) throws IOException, PresentableException
+ {
+ SettingsReader.initializeForCommandLine();
+
+ File in = new File(args[0]);
+ FileInputStream fis = new FileInputStream(in);
+ byte[] pdf = new byte[(int) in.length()];
+ fis.read(pdf);
+ fis.close();
+
+ String text = PdfAS.extractNormalizedTextTextual(pdf, pdf.length);
+
+ File out = new File(args[0] + ".txt");
+ FileOutputStream fos = new FileOutputStream(out);
+ fos.write(text.getBytes("UTF-8"));
+ fos.close();
+
+ System.out.println("finished. written to " + out.getAbsolutePath());
+ }
+
+}
diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/test/X509.java b/src/main/java/at/knowcenter/wag/egov/egiz/test/X509.java
new file mode 100644
index 0000000..059663a
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/egov/egiz/test/X509.java
@@ -0,0 +1,40 @@
+/**
+ *
+ */
+package at.knowcenter.wag.egov.egiz.test;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.security.cert.CertificateException;
+import java.security.cert.CertificateFactory;
+import java.security.cert.X509Certificate;
+
+/**
+ * @author wprinz
+ */
+public class X509
+{
+
+ /**
+ * @param args
+ * @throws CertificateException
+ * @throws IOException
+ */
+ public static void main(String[] args) throws CertificateException, IOException
+ {
+ File file = new File ("C:\\tr-test.der");
+
+ InputStream is = new FileInputStream(file);
+ CertificateFactory cf = CertificateFactory.getInstance("X.509");
+ X509Certificate cert = (X509Certificate)cf.generateCertificate(is);
+ is.close();
+
+ System.out.println("SerialNumber = " + cert.getSerialNumber());
+ System.out.println("Issuer = " + cert.getIssuerDN().getName());
+
+ System.out.println("finished.");
+ }
+
+}
diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/test/X509Ext.java b/src/main/java/at/knowcenter/wag/egov/egiz/test/X509Ext.java
new file mode 100644
index 0000000..30a489b
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/egov/egiz/test/X509Ext.java
@@ -0,0 +1,48 @@
+/**
+ *
+ */
+package at.knowcenter.wag.egov.egiz.test;
+
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.security.cert.CertificateException;
+import java.security.cert.CertificateFactory;
+import java.security.cert.X509Certificate;
+import java.util.Iterator;
+import java.util.Set;
+
+/**
+ * @author wprinz
+ */
+public class X509Ext
+{
+
+ /**
+ * @param args
+ * @throws CertificateException
+ * @throws IOException
+ */
+ public static void main(String[] args) throws CertificateException, IOException
+ {
+ InputStream is = new FileInputStream("C:\\oid.der");
+ CertificateFactory cf = CertificateFactory.getInstance("X.509");
+ X509Certificate cert = (X509Certificate)cf.generateCertificate(is);
+ is.close();
+
+ Set oids = cert.getNonCriticalExtensionOIDs();
+ Iterator it = oids.iterator();
+ while (it.hasNext())
+ {
+ String oid = (String) it.next();
+
+ System.out.println(oid);
+ }
+
+ // Perhaps use IAIK JCE to parse this in a future version.
+ byte [] octet_stream = cert.getExtensionValue("1.2.40.0.10.1.1.1");
+ System.out.println("octet_stream = " + octet_stream);
+
+ }
+
+}
diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/tools/CodingHelper.java b/src/main/java/at/knowcenter/wag/egov/egiz/tools/CodingHelper.java
new file mode 100644
index 0000000..7908486
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/egov/egiz/tools/CodingHelper.java
@@ -0,0 +1,272 @@
+/*
+ * <copyright> Copyright (c) 2006 by Know-Center, Graz, Austria </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+ * NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
+ * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES.
+ *
+ * $Id: CodingHelper.java,v 1.6 2006/10/11 07:52:36 wprinz Exp $
+ */
+package at.knowcenter.wag.egov.egiz.tools;
+
+import java.io.UnsupportedEncodingException;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+
+import org.apache.commons.codec.binary.Base64;
+
+/**
+ * This class provides encoding and decoding methods and other coding methods.
+ * All methods are static!
+ *
+ * @author wlackner
+ */
+public class CodingHelper
+{
+
+ /**
+ * Static Base64 object
+ */
+ private static Base64 b64 = new Base64();
+
+ /**
+ * This method encodes a given Unicode (Java) String to UTF-8 bytes and then
+ * encodes these UTF-8 bytes to a Base64 US-ASCII (Java) String.
+ *
+ * @param plain_string
+ * to be encoded
+ * @return the UTF-8 and Base64 encoded string
+ */
+ public static String encodeUTF8AsBase64(String plain_string)
+ {
+ try
+ {
+ byte[] utf8_bytes = plain_string.getBytes("UTF-8");
+ byte[] base64_bytes = b64.encode(utf8_bytes);
+ String encoded_string = new String(base64_bytes, "US-ASCII");
+ return encoded_string;
+ }
+ catch (UnsupportedEncodingException e)
+ {
+ e.printStackTrace();
+ throw new RuntimeException(e);
+ }
+ }
+
+ /**
+ * This method decodes the UTF-8 bytes from a Base64 US-ASCII (Java) String
+ * and decodes the UTF-8 bytes to a unicode (Java) String.
+ *
+ * @param encoded_string
+ * to be decoded
+ * @return the Base64 and UTF-8 decoded string
+ */
+ public static String decodeUTF8FromBase64(String encoded_string)
+ {
+ try
+ {
+ byte[] base64_bytes = encoded_string.getBytes("US-ASCII");
+ byte[] utf8_bytes = b64.decode(base64_bytes);
+ String plain_string = new String(utf8_bytes, "UTF-8");
+ return plain_string;
+ }
+ catch (UnsupportedEncodingException e)
+ {
+ e.printStackTrace();
+ throw new RuntimeException(e);
+ }
+ }
+
+ // /**
+ // * This method encodes a given string UTF-8
+ // *
+ // * @param theString to be encoded
+ // * @return the UTF-8 encoded string
+ // */
+ // public static byte[] encodeUTF8(String theString) {
+ // byte[] utf8 = null;
+ // try {
+ // utf8 = theString.getBytes("UTF-8");
+ // } catch (UnsupportedEncodingException e) {
+ // e.printStackTrace();
+ // }
+ // return utf8;
+ // }
+
+ // /**
+ // * This method decodes a given UTF-8 string
+ // *
+ // * @param theString to be decoded
+ // * @return the decoded UTF-8 string
+ // */
+ // public static String decodeUTF8(String theString) {
+ // byte[] ba = theString.getBytes();
+ // String the_string = decodeUTF8(ba);
+ // if (the_string != null) {
+ // return the_string;
+ // }
+ // return theString;
+ // }
+
+ // /**
+ // * This method decodes a given UTF-8 byte array
+ // *
+ // * @param ba the byte array to be decoded
+ // * @return the decoded UTF-8 string
+ // */
+ // public static String decodeUTF8(byte[] ba) {
+ // String the_string = null;
+ // try {
+ // the_string = new String(ba, "UTF-8");
+ // } catch (UnsupportedEncodingException e) {
+ // e.printStackTrace();
+ // }
+ // return the_string;
+ // }
+
+ /**
+ * This method decodes a given Base64 string.
+ *
+ * <p>
+ * Note that the given String must only contain Base64 characters. (The string
+ * will be converted to a byte array of "US-ASCII" (7 bit) bytes and then this
+ * byte array will be decoded using the Base64 algorithm.
+ * </p>
+ *
+ * @param theString
+ * to be decoded
+ * @return a Base64 decoded byte array
+ */
+ public static byte[] decodeBase64(String theString)
+ {
+ try
+ {
+ byte[] base64_bytes = theString.getBytes("US-ASCII");
+ return b64.decode(base64_bytes);
+ }
+ catch (UnsupportedEncodingException e)
+ {
+ e.printStackTrace();
+ throw new RuntimeException("Very Strange: US-ASCII encoding not supported???", e);
+ }
+ }
+
+ /**
+ * This method decodes a given Base64 byte array
+ *
+ * @param ba
+ * the byte array to be decoded
+ * @return a Base64 decoded byte array
+ */
+ public static byte[] decodeBase64(byte[] ba)
+ {
+ return b64.decode(ba);
+ }
+
+ /**
+ * This method encodes a given byte array Base64
+ *
+ * @param plainString
+ * the byte array to be encoded
+ * @return the Base64 encoded string
+ */
+ public static String encodeBase64(byte[] plainString)
+ {
+ try
+ {
+ byte[] base64_bytes = b64.encode(plainString);
+ return new String(base64_bytes, "US-ASCII");
+ }
+ catch (UnsupportedEncodingException e)
+ {
+ e.printStackTrace();
+ throw new RuntimeException("Very Strange: US-ASCII encoding not supported???", e);
+ }
+ }
+
+ /**
+ * This method builds an SHA-1 hash value of a given byte array.
+ *
+ * @param data
+ * the byte array to build the hash value for
+ * @return the calculated hash value as a byte array
+ * @see MessageDigest
+ */
+ public static byte[] buildDigest(byte[] data)
+ {
+ MessageDigest sha_1 = null;
+ try
+ {
+ sha_1 = MessageDigest.getInstance("SHA-1");
+ sha_1.update(data);
+ return sha_1.digest();
+ }
+ catch (NoSuchAlgorithmException e)
+ {
+ return null;
+ }
+ }
+
+ /**
+ * This method escapes a given string with HTML entities.
+ *
+ * @param rawString
+ * the string to escaped
+ * @return the HTML escaped string
+ */
+ public static String htmlEscape(String rawString)
+ {
+ rawString = rawString.replaceAll("\\&", "&amp;");
+ rawString = rawString.replaceAll("\\<", "&lt;");
+ rawString = rawString.replaceAll("\\>", "&gt;");
+ rawString = rawString.replaceAll("\">", "&quot;");
+ return rawString;
+ }
+
+ /**
+ * This method checks, if a byte array contains chars that are not base64
+ * conform.
+ *
+ * @param byteArray
+ * the array to test
+ * @return boolean, if a byte array is base64 conform, false otherwise
+ */
+ public static boolean isB64(byte[] byteArray)
+ {
+ try
+ {
+ return Base64.isArrayByteBase64(byteArray);
+ }
+ catch (ArrayIndexOutOfBoundsException e)
+ {
+ return false;
+ }
+ }
+
+ /**
+ * This method checks, if a string contains chars that are not base64 conform.
+ *
+ * @param string
+ * the chars to test
+ * @return boolean, if the given string is base64 conform, false otherwise
+ */
+ public static boolean isB64(String string)
+ {
+ try
+ {
+ return Base64.isArrayByteBase64(string.getBytes());
+ }
+ catch (ArrayIndexOutOfBoundsException e)
+ {
+ return false;
+ }
+ }
+} \ No newline at end of file
diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/tools/FileHelper.java b/src/main/java/at/knowcenter/wag/egov/egiz/tools/FileHelper.java
new file mode 100644
index 0000000..0c1a420
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/egov/egiz/tools/FileHelper.java
@@ -0,0 +1,88 @@
+/*
+ * <copyright>
+ * Copyright (c) 2006 by Know-Center, Graz, Austria
+ * </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF THE
+ * SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE,
+ * OR NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES
+ * SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING
+ * THIS SOFTWARE OR ITS DERIVATIVES.
+ *
+ * $Id: FileHelper.java,v 1.2 2006/05/15 12:05:21 wlackner Exp $
+ */
+package at.knowcenter.wag.egov.egiz.tools;
+
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.FileReader;
+import java.io.FileWriter;
+
+import org.apache.log4j.Logger;
+
+import at.knowcenter.wag.egov.egiz.cfg.ConfigLogger;
+
+/**
+ * This class provides file reader and writer methods. All methods are static!
+ *
+ * @author wlackner
+ */
+public class FileHelper {
+ /**
+ * The logger definition.
+ */
+ private static final Logger logger_ = ConfigLogger.getLogger(FileHelper.class);
+
+ /**
+ * This method reads a file by reading line by line.
+ *
+ * @param fileName the file to be read
+ * @return the content string of the file
+ */
+ public static String readFromFile(String fileName) {
+ String file_string = null;
+ try {
+ BufferedReader reader = new BufferedReader(new FileReader(fileName));
+ String line = null;
+ file_string = "";
+ while ((line = reader.readLine()) != null) {
+ file_string += line;
+ }
+ reader.close();
+ } catch (FileNotFoundException e) {
+ logger_.info("File not found:" + fileName);
+ } catch (IOException e) {
+ logger_.info("File can not read:" + fileName);
+ }
+ return file_string;
+ }
+
+ /**
+ * This method writes a file line by line.
+ *
+ * @param fileName the file to be written
+ * @param fileString the content to be written
+ * @return true if the file could be written sucessfully, false otherwise
+ */
+ public static boolean writeToFile(String fileName, String fileString) {
+ BufferedWriter writer;
+ try {
+ FileWriter fwriter = new FileWriter(fileName);
+ writer = new BufferedWriter(fwriter);
+ writer.write(fileString);
+ writer.close();
+ } catch (IOException e) {
+ logger_.info("File:" + fileName + " can not be written. Cause:" + e.getMessage());
+ return false;
+ }
+ return true;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/tools/Normalize.java b/src/main/java/at/knowcenter/wag/egov/egiz/tools/Normalize.java
new file mode 100644
index 0000000..a2df327
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/egov/egiz/tools/Normalize.java
@@ -0,0 +1,48 @@
+/*
+ * <copyright>
+ * Copyright (c) 2006 by Know-Center, Graz, Austria
+ * </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF THE
+ * SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE,
+ * OR NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES
+ * SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING
+ * THIS SOFTWARE OR ITS DERIVATIVES.
+ *
+ * $Id: Normalize.java,v 1.2 2006/05/15 12:05:21 wlackner Exp $
+ */
+package at.knowcenter.wag.egov.egiz.tools;
+
+
+/**
+ * Defines an interface to get access to different normalizer implementations.
+ *
+ * @author wlackner
+ */
+public interface Normalize {
+
+ /**
+ * Normalize a given text.
+ * @param rawText the raw text to normalize
+ * @return the normalized string
+ */
+ public String normalize(String rawText);
+ /**
+ * Return the current normalizer version string.
+ * @return the version string
+ */
+ public String getVersion();
+
+ /**
+ * Returns the normalizer line separator string.
+ * @return the line separator string
+ */
+ public String getNormCR();
+
+}
diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/tools/NormalizeV01.java b/src/main/java/at/knowcenter/wag/egov/egiz/tools/NormalizeV01.java
new file mode 100644
index 0000000..d3af9b5
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/egov/egiz/tools/NormalizeV01.java
@@ -0,0 +1,166 @@
+/*
+ * <copyright>
+ * Copyright (c) 2006 by Know-Center, Graz, Austria
+ * </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF THE
+ * SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE,
+ * OR NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES
+ * SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING
+ * THIS SOFTWARE OR ITS DERIVATIVES.
+ *
+ * $Id: NormalizeV01.java,v 1.5 2006/10/31 08:20:56 wprinz Exp $
+ */
+package at.knowcenter.wag.egov.egiz.tools;
+
+import java.io.Serializable;
+
+/**
+ * This ist the first version implementing a normalizer method. The normalize statements are
+ * performed by using regular expressions.
+ *
+ * @author wlackner
+ */
+public class NormalizeV01 implements Normalize, Serializable {
+
+ /**
+ * SVUID.
+ */
+ private static final long serialVersionUID = 2302956630639871601L;
+
+ /**
+ * The space string
+ */
+ private final static String NORM_SP = " "; //\u0020
+ /**
+ * The line break string --> use only \n because XML-Parser ignores \r\n
+ */
+ private final static String NORM_CR = "\n"; //
+ /**
+ * The apostrophe string
+ */
+ private final static String NORM_AP = "'"; //\u0027
+ /**
+ * The quotation mark string
+ */
+ private final static String NORM_QU = "\""; //\u0022
+ /**
+ * The hypens string
+ */
+ private final static String NORM_HY = "-"; //\u002D
+ /**
+ * The current version string
+ */
+ protected static final String VERSION = "V01";
+
+ /**
+ * The empty constructor.
+ */
+ public NormalizeV01() {
+ }
+
+ /**
+ * The normalizer implementation. <br>
+ * Normalizer algorithums:
+ * <ol>
+ * <li>code all multiple line breaks as \n\n</li>
+ * <li>replace all Tabs and form feeds with spaces</li>
+ * <li>code line breaks as \n</li>
+ * <li>reduce all multiple line breaks into one line break, code line break as \r</li>
+ * <li>replace all single line breaks with space</li>
+ * <li>normalize spaces</li>
+ * <li>remove spaces before and after a line break</li>
+ * <li>remove leading and trailing space or line break in the string</li>
+ * <li>normalize line breaks</li>
+ * <li>normalize apostrophes</li>
+ * <li>normalize quotations</li>
+ * <li>normalize hypens</li>
+ * </ol>
+ *
+ * @see at.knowcenter.wag.egov.egiz.tools.Normalize#normalize(java.lang.String)
+ */
+ public String normalize(String rawText) {
+ if (rawText == null || rawText.equals("null") || rawText.length() == 0) {
+ return "";
+ }
+ String normText = rawText;
+
+ // replace all null values
+ normText = normText.replaceAll("\u0000+", "");
+
+ // replace all Tabs and form feeds with spaces
+ normText = normText.replaceAll("[\t\f]", NORM_SP);
+
+ // replace all non breaking spaces with normal spaces
+ normText = normText.replaceAll("\u00a0+", NORM_SP);
+
+ // code all windows line breaks as \n
+ normText = normText.replaceAll("\r\n", "\n");
+
+ // code all mac line breaks as \n
+ normText = normText.replace('\r', '\n');
+
+ // reduce all multiple line breaks into two line breaks, code muliple line break as \r\r
+ normText = normText.replaceAll("\n[\\s\n]*\n", "\r\r");
+
+ // replace all single line breaks with one line break
+ normText = normText.replace('\n', '\r');
+
+ // normalize spaces
+ normText = normText.replaceAll(" +", NORM_SP);
+
+ // remove spaces before and after a single line break
+ normText = normText.replaceAll(" ?\r ?", "\r");
+
+ // remove spaces before and after a multiple line breaks
+ normText = normText.replaceAll(" ?\r\r ?", "\r");
+
+ // remove leading and trailing space or line break in the string
+ int start_idx = (normText.charAt(0) == ' ' || normText.charAt(0) == '\r' ? 1 : 0);
+ int end_idx = (normText.charAt(normText.length() - 1) == ' ' || normText.charAt(normText.length() - 1) == '\r' ? normText.length() - 1 : normText.length());
+ if (end_idx < start_idx) {
+ end_idx = start_idx;
+ }
+
+ // System.err.println("Start idx:" + start_idx + " End idx:" + end_idx + " Text length:" +
+ // normText_.length());
+ normText = normText.substring(start_idx, end_idx);
+
+ // normalize line breaks
+ normText = normText.replaceAll("\r", NORM_CR);
+
+ // normalize apostrophes
+ normText = normText.replaceAll("[\u0060\u00B4\u2018\u2019\u201A\u201B]", NORM_AP);
+
+ // normalize quotations
+ normText = normText.replaceAll("[\u201C\u201D\u201E\u201F]", NORM_QU);
+
+ // normalize hypens
+ normText = normText.replaceAll("[\u00AD\u2013\u2014]", NORM_HY);
+
+ return normText;
+ }
+
+ /**
+ * Return the version string.
+ *
+ * @see at.knowcenter.wag.egov.egiz.tools.Normalize#getVersion()
+ */
+ public String getVersion() {
+ return VERSION;
+ }
+
+ /**
+ * Returns the normalizer line separator string.
+ * @return the line separator string
+ */
+ public String getNormCR() {
+ return NORM_CR;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/tools/Normalizer.java b/src/main/java/at/knowcenter/wag/egov/egiz/tools/Normalizer.java
new file mode 100644
index 0000000..ab17e4a
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/egov/egiz/tools/Normalizer.java
@@ -0,0 +1,270 @@
+/*
+ * <copyright>
+ * Copyright (c) 2006 by Know-Center, Graz, Austria
+ * </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF THE
+ * SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE,
+ * OR NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES
+ * SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING
+ * THIS SOFTWARE OR ITS DERIVATIVES.
+ *
+ * $Id: Normalizer.java,v 1.5 2006/10/31 08:20:56 wprinz Exp $
+ */
+package at.knowcenter.wag.egov.egiz.tools;
+
+import java.io.Serializable;
+
+import org.apache.log4j.Level;
+import org.apache.log4j.Logger;
+
+import at.knowcenter.wag.egov.egiz.cfg.ConfigLogger;
+import at.knowcenter.wag.egov.egiz.cfg.SettingsReader;
+import at.knowcenter.wag.egov.egiz.exceptions.NormalizeException;
+import at.knowcenter.wag.egov.egiz.exceptions.SettingsException;
+
+/**
+ * This class provides wrapper methods to get an access to different normalizer implementations.
+ * <br>
+ * This class is to load the corresponding implementation of a normalizer class. Therefor it seams
+ * to be a factory. The factory settings are read from the configuration file calling the
+ * SettingsReader.
+ *
+ * @author wlackner
+ * @see at.knowcenter.wag.egov.egiz.tools.Normalizer
+ * @see at.knowcenter.wag.egov.egiz.tools.NormalizeV01
+ * @see at.knowcenter.wag.egov.egiz.cfg.SettingsReader
+ */
+public class Normalizer implements Serializable {
+
+ /**
+ * SVUID.
+ */
+ private static final long serialVersionUID = 4201772508393848555L;
+
+ /**
+ * The current raw string to normalize
+ */
+ private String rawString_ = null;
+ /**
+ * The current normalisation version string
+ */
+ private String normVersion_ = null;
+ /**
+ * The normalized string cache
+ */
+ private String normString_ = null;
+ /**
+ * The reference to the normalizer implementation
+ */
+ private Normalize normalize_ = null;
+// /**
+// * A given Encoding, not used now
+// */
+// private String encoding_ = null;
+ /**
+ * The SettingsReader instance
+ */
+ private SettingsReader settings_ = null;
+ /**
+ * The factory class prefix
+ */
+ private final static String CLASS_PREFIX = ".Normalize";
+ /**
+ * The default version string
+ */
+ protected final static String DEFAULT_VERSION = "V01";
+ /**
+ * The settings key defined in the settings file
+ *
+ * @see SettingsReader
+ */
+ protected final static String SETTINGS_VERSION_KEY = "normalizer.version";
+ /**
+ * The logger definition.
+ */
+ private static final Logger logger_ = ConfigLogger.getLogger(Normalizer.class);
+
+ /**
+ * New Normalizer init by the raw string and a normalizer version.
+ *
+ * @param rawString the raw string to normalize
+ * @param normVersion the nomalizer version that should be used
+ * @throws NormalizeException ErrorCode:400
+ */
+ public Normalizer(String rawString, String normVersion) throws NormalizeException {
+ rawString_ = rawString;
+ normVersion_ = normVersion;
+ init();
+ }
+
+ /**
+ * New Normalizer init by the raw string.
+ *
+ * @param rawString the raw string to normalize
+ * @throws NormalizeException ErrorCode:400
+ */
+ public Normalizer(String rawString) throws NormalizeException {
+ rawString_ = rawString;
+ init();
+ }
+
+ /**
+ * The empty constructor.
+ *
+ * @throws NormalizeException ErrorCode:400
+ */
+ public Normalizer() throws NormalizeException {
+ init();
+ }
+
+ /**
+ * Load the factory implementation. This method trys to load the configured normalizer library.
+ *
+ * @throws NormalizeException
+ */
+ public void init() throws NormalizeException {
+ loadSettings();
+ String class_name = this.getClass().getPackage().getName() + getClassName();
+ Class normalize_class = null;
+ try {
+ normalize_class = Class.forName(class_name);
+ } catch (ClassNotFoundException e) {
+ if (logger_.isEnabledFor(Level.FATAL)) {
+ logger_.fatal("Class not found:" + class_name);
+ }
+ NormalizeException ne = new NormalizeException(400, "Can not load normalizer library");
+ ne.setErrorCode(400);
+ throw ne;
+ }
+ try {
+ normalize_ = (Normalize) normalize_class.newInstance();
+ } catch (InstantiationException e) {
+ if (logger_.isEnabledFor(Level.FATAL)) {
+ logger_.fatal("Can not instantiate:" + class_name);
+ }
+ NormalizeException ne = new NormalizeException(400, "Can not load normalizer library");
+ ne.setErrorCode(400);
+ throw ne;
+ } catch (IllegalAccessException e) {
+ if (logger_.isEnabledFor(Level.FATAL)) {
+ logger_.fatal("Can not access:" + class_name);
+ }
+ NormalizeException ne = new NormalizeException(400, "Can not load normalizer library");
+ ne.setErrorCode(400);
+ throw ne;
+ }
+ }
+
+ /**
+ * Read the class postfix from the configuration file
+ *
+ * @return the full qualified class name
+ */
+ private String getClassName() {
+ if (normVersion_ == null) {
+ normVersion_ = settings_.getSetting(SETTINGS_VERSION_KEY, DEFAULT_VERSION);
+ }
+ return CLASS_PREFIX + normVersion_;
+ }
+
+ /*
+ * public void setEncoding(String encoding) { encoding_ = encoding; }
+ */
+
+ /**
+ * Set the raw string to normalize
+ */
+ public void setRawString(String rawString) {
+ rawString_ = rawString;
+ }
+
+ /**
+ * Return the normalized string. If the chached value does not exist the normalize method from the
+ * current normalizer implementation is called.
+ *
+ * @return the normalized string
+ */
+ public String getNormalizedString() {
+ if (normString_ == null) {
+ normalize();
+ }
+ return normString_;
+ }
+
+ /**
+ * Set a normalizer version. This activity load the new requested normalizer implementation.
+ *
+ * @param normVersion the normalizer version to be use
+ * @throws NormalizeException ErrorCode:400
+ */
+ public void setVersion(String normVersion) throws NormalizeException {
+ normVersion_ = normVersion;
+ init();
+ }
+
+ /**
+ * Return the current version string.
+ *
+ * @return the normaliser version string
+ */
+ public String getVersion() {
+ return normVersion_;
+ }
+
+ /**
+ * Wrapper method. Call the normalizer implementation method.
+ *
+ * @param rawString the raw string to normalize
+ * @return the normalized string
+ * @see NormalizeV01
+ */
+ public String normalize(String rawString) {
+ return normalize_.normalize(rawString);
+ }
+
+ /**
+ * Wrapper method. Call the normalizer implementation method. Normalize the current raw string.
+ *
+ * @return the normalized string
+ * @see NormalizeV01
+ */
+ public String normalize() {
+ if (normString_ == null) {
+ normString_ = normalize(rawString_);
+ }
+ return normString_;
+ }
+
+ /**
+ * Returns the normalizer line separator string.
+ * @return the line separator string
+ */
+ public String getNormCR() {
+ return normalize_.getNormCR();
+ }
+
+ /**
+ * load the class settings
+ *
+ * @throws NormalizeException
+ * @see SettingsReader
+ */
+ private void loadSettings() throws NormalizeException {
+ if (settings_ == null) {
+ try {
+ settings_ = SettingsReader.getInstance();
+ } catch (SettingsException e) {
+ String log_message = "Can not load normalizer settings. Cause:\n" + e.getMessage();
+ logger_.error(log_message);
+ throw new NormalizeException(400, log_message, e);
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/web/AsynchronousDataResponder.java b/src/main/java/at/knowcenter/wag/egov/egiz/web/AsynchronousDataResponder.java
new file mode 100644
index 0000000..847bbcf
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/egov/egiz/web/AsynchronousDataResponder.java
@@ -0,0 +1,155 @@
+/**
+ * <copyright> Copyright (c) 2006 by Know-Center, Graz, Austria </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+ * NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
+ * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES.
+ *
+ * $Id: AsynchronousDataResponder.java,v 1.3 2006/08/30 14:02:35 wprinz Exp $
+ */
+package at.knowcenter.wag.egov.egiz.web;
+
+import java.io.IOException;
+import java.util.List;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+
+import org.apache.commons.fileupload.FileItem;
+import org.apache.commons.fileupload.FileUploadException;
+import org.apache.commons.fileupload.disk.DiskFileItemFactory;
+import org.apache.commons.fileupload.servlet.ServletFileUpload;
+import org.apache.log4j.Logger;
+
+import at.knowcenter.wag.egov.egiz.cfg.ConfigLogger;
+import at.knowcenter.wag.egov.egiz.cfg.SettingsReader;
+
+/**
+ * Servlet that responds to the data post requests of the local service (e.g.
+ * BKU).
+ *
+ * @author wprinz
+ */
+public class AsynchronousDataResponder extends HttpServlet
+{
+
+ /**
+ * SVUID.
+ */
+ private static final long serialVersionUID = -4992297156381763174L;
+
+ /**
+ * The logger definition.
+ */
+ private static final Logger logger_ = ConfigLogger.getLogger(AsynchronousDataResponder.class);
+
+ protected void doGet(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException
+ {
+ logger_.debug("AsyncDataResp GET REQUEST.");
+ super.doGet(arg0, arg1);
+ }
+
+ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+ {
+ logger_.debug("AsyncDataResp !!!!!!!!!!!!!!!!!!!!!!");
+
+ HttpSession session = request.getSession(false);
+ if (session == null)
+ {
+ throw new ServletException("There is no session associated with this request.");
+ }
+
+ // String session_id_string = request.getParameter("session");
+ // if (session_id_string == null)
+ // {
+ // throw new ServletException("The session parameter is missing.");
+ // }
+
+ SessionInformation si = (SessionInformation) session.getAttribute(SessionAttributes.ATTRIBUTE_SESSION_INFORMATION);
+ // long session_id = Long.parseLong(session_id_string);
+ // SessionInformation si = SessionTable.get(session_id);
+ if (si == null)
+ {
+ throw new ServletException("The session is not found or no longer valid.");
+ }
+
+ // InputStream is = request.getInputStream();
+ // byte [] data = new byte[request.getContentLength()];
+ // is.read(data);
+ // is.close();
+ // String enc = request.getCharacterEncoding();
+ // String ct = request.getContentType();
+ // Enumeration enum = request.getHeaderNames();
+ //
+ // String dat = new String(data, "US-ASCII");
+ // // dat looks like: XMLResponse=blablabla ...
+ // // so the actual XMLResponse begins after the =
+ // String resp = URLDecoder.decode(dat, "UTF-8");
+
+ logger_.debug("Answer from local service: content-type = '" + request.getContentType() + "', character encoding = '" + request.getCharacterEncoding() + "'");
+
+ // .getParameter will use the character encoding specified by the
+ // content-type header.
+ // Unfortunately BKU forgets to specify a chatacter encoding.
+ // Therefor, .getParameter will assume US-ASCII or something.
+ // ==> we explicitely set UTF-8
+ if (request.getCharacterEncoding() == null)
+ {
+ request.setCharacterEncoding("UTF-8");
+ logger_.debug(" no character encoding specified - set to UTF-8");
+ }
+
+ logger_.debug("AsyncDataResponder: si.current_operation = " + si.current_operation);
+
+ String resp_string = request.getParameter("XMLResponse");
+ if (resp_string == null)
+ {
+ logger_.debug("response String is null => trying multipart form");
+
+ DiskFileItemFactory fif = new DiskFileItemFactory();
+ fif.setRepository(SettingsReader.getTemporaryDirectory());
+ ServletFileUpload sfu = new ServletFileUpload(fif);
+
+ try
+ {
+ List items = sfu.parseRequest(request);
+
+ for (int i = 0; i < items.size(); i++)
+ {
+ FileItem item = (FileItem) items.get(i);
+ logger_.debug("item = " + item.getFieldName());
+
+ if (item.getFieldName().equals("XMLResponse"))
+ {
+ resp_string = item.getString("UTF-8");
+ }
+ }
+ }
+ catch (FileUploadException e)
+ {
+ throw new ServletException("File Upload exception. cannot parse POST data");
+ }
+
+ }
+
+ si.response_string[si.current_operation] = resp_string; //request.getParameter("XMLResponse");
+ //logger_.debug("AsyncDataResponder: si.response_string[si.current_operation] = " + si.response_string[si.current_operation]);
+
+ si.current_operation++;
+
+ si.finished = true;
+
+ LocalRequestHelper.formatBKUOkResponse(response);
+ }
+}
diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/web/AsynchronousRedirectResponder.java b/src/main/java/at/knowcenter/wag/egov/egiz/web/AsynchronousRedirectResponder.java
new file mode 100644
index 0000000..fb5d2e3
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/egov/egiz/web/AsynchronousRedirectResponder.java
@@ -0,0 +1,196 @@
+/**
+ * <copyright> Copyright (c) 2006 by Know-Center, Graz, Austria </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+ * NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
+ * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES.
+ *
+ * $Id: AsynchronousRedirectResponder.java,v 1.4 2006/10/11 07:39:13 wprinz Exp $
+ */
+package at.knowcenter.wag.egov.egiz.web;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.servlet.RequestDispatcher;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+
+import org.apache.log4j.Logger;
+
+import at.knowcenter.wag.egov.egiz.PdfASID;
+import at.knowcenter.wag.egov.egiz.cfg.ConfigLogger;
+import at.knowcenter.wag.egov.egiz.exceptions.ErrorCodeException;
+import at.knowcenter.wag.egov.egiz.exceptions.PresentableException;
+import at.knowcenter.wag.egov.egiz.framework.Signator;
+import at.knowcenter.wag.egov.egiz.framework.SignatorFactory;
+import at.knowcenter.wag.egov.egiz.sig.ConnectorFactory;
+import at.knowcenter.wag.egov.egiz.sig.SignatureResponse;
+import at.knowcenter.wag.egov.egiz.sig.connectors.BKUConnector;
+
+/**
+ * Servlet that responds to the redirect requests of the local service (e.g.
+ * BKU).
+ *
+ * @author wprinz
+ */
+public class AsynchronousRedirectResponder extends HttpServlet
+{
+
+ /**
+ * SVUID.
+ */
+ private static final long serialVersionUID = -682360466333727236L;
+
+ /**
+ * The logger definition.
+ */
+ private static final Logger logger_ = ConfigLogger.getLogger(AsynchronousRedirectResponder.class);
+
+ protected void dispatch(HttpServletRequest request,
+ HttpServletResponse response, String resource) throws ServletException, IOException
+ {
+ response.setContentType("text/html");
+ response.setCharacterEncoding("UTF-8");
+
+ RequestDispatcher disp = getServletContext().getRequestDispatcher(resource);
+ disp.forward(request, response);
+ }
+
+ protected void dispatchToResults(List results, HttpServletRequest request,
+ HttpServletResponse response) throws ServletException, IOException
+ {
+ request.setAttribute("results", results);
+ dispatch(request, response, "/jsp/results.jsp");
+ }
+
+ protected void dispatchToRedirectRefreshPage (HttpServletRequest request,
+ HttpServletResponse response, String refresh_url) throws ServletException, IOException
+ {
+ request.setAttribute("refresh_url", refresh_url);
+ dispatch(request, response, LocalRequestHelper.REDIRECT_REFRESH_PAGE_JSP);
+ }
+
+ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+ {
+ logger_.debug("AsyncRedirResp");
+
+ SessionInformation si = null;
+
+ HttpSession session = null;
+ try
+ {
+ session = request.getSession(false);
+ //String session_id_string = request.getParameter("session");
+ if (session == null)
+ {
+ throw new ErrorCodeException(600, "The session is missing.");
+ }
+
+ si = (SessionInformation) session.getAttribute(SessionAttributes.ATTRIBUTE_SESSION_INFORMATION);
+// long session_id = Long.parseLong(session_id_string);
+// si = SessionTable.get(session_id);
+ if (si == null)
+ {
+ throw new ErrorCodeException(600, "The session is not found or is no longer valid.");
+ }
+
+ }
+ catch (PresentableException e)
+ {
+ e.printStackTrace();
+ Sign.prepareDispatchToErrorPage(e, request);
+ dispatch(request, response, "/jsp/error.jsp");
+
+ return;
+ }
+
+ try
+ {
+ if (si.finished == false)
+ {
+ String url = request.getRequestURL().toString();
+ logger_.debug("RequestURL = " + url);
+ String refresh_url = response.encodeURL(url);
+ logger_.debug("RefreshURL = " + refresh_url);
+ dispatchToRedirectRefreshPage(request, response, refresh_url);
+ return;
+ }
+
+ si.finished = false;
+
+ if (si.current_operation < si.requests.length)
+ {
+ LocalRequestHelper.prepareDispatchToLocalConnectionPage(si.requests[si.current_operation], request, response);
+ dispatch(request, response, LocalRequestHelper.LOCAL_CONNECTION_PAGE_JSP);
+ return;
+ }
+
+ // all requests have been carried out.
+ //session.removeAttribute(SessionAttributes.ATTRIBUTE_SESSION_INFORMATION);
+ //SessionTable.remove(si.session_id);
+
+ BKUConnector local_conn = (BKUConnector) ConnectorFactory.createConnector(si.connector);
+
+ if (si.application.equals("verify"))
+ {
+ List results = new ArrayList();
+
+ for (int i = 0; i < si.response_string.length; i++)
+ {
+ SignatureResponse sig_resp = local_conn.analyzeVerifyResponse(si.response_string[i]);
+ results.add(sig_resp);
+ }
+
+ dispatchToResults(results, request, response);
+ }
+ else
+ {
+ //logger_.debug("AsyncRedirResponder: si.response_string[0] = " + si.response_string[0]);
+ logger_.debug("AsyncRedirResponder: si.current_op = " + si.current_operation);
+
+ if (si.response_string[0] == null)
+ {
+ String url = request.getRequestURL().toString();
+ logger_.debug("RequestURL = " + url);
+ String refresh_url = response.encodeURL(url);
+ logger_.debug("RefreshURL = " + refresh_url);
+ dispatchToRedirectRefreshPage(request, response, refresh_url);
+ return ;
+ }
+
+ si.iui.signed_signature_object = local_conn.analyzeSignResponse(si.response_string[0], si.type);
+
+ PdfASID algorithm = FormFields.translateSignatureModeToPdfASID(si.mode);
+ Signator signator = SignatorFactory.createSignator(algorithm);
+
+ si.sign_result = signator.finishSign(si.iui);
+
+ Sign.returnSignResponse(si, response);
+ }
+
+ }
+ catch (PresentableException e)
+ {
+ session.removeAttribute(SessionAttributes.ATTRIBUTE_SESSION_INFORMATION);
+ //SessionTable.remove(si.session_id);
+
+ e.printStackTrace();
+ Sign.prepareDispatchToErrorPage(e, request);
+ dispatch(request, response, "/jsp/error.jsp");
+ }
+
+ }
+}
diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/web/FormFields.java b/src/main/java/at/knowcenter/wag/egov/egiz/web/FormFields.java
new file mode 100644
index 0000000..6331a54
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/egov/egiz/web/FormFields.java
@@ -0,0 +1,210 @@
+/**
+ * <copyright> Copyright (c) 2006 by Know-Center, Graz, Austria </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+ * NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
+ * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES.
+ *
+ * $Id: FormFields.java,v 1.4 2006/10/11 07:39:13 wprinz Exp $
+ */
+package at.knowcenter.wag.egov.egiz.web;
+
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.util.ArrayList;
+import java.util.Iterator;
+
+import javax.servlet.ServletException;
+
+import at.knowcenter.wag.egov.egiz.PdfASID;
+import at.knowcenter.wag.egov.egiz.cfg.SettingsReader;
+import at.knowcenter.wag.egov.egiz.exceptions.ConnectorFactoryException;
+import at.knowcenter.wag.egov.egiz.exceptions.SettingsException;
+import at.knowcenter.wag.egov.egiz.framework.SignatorFactory;
+import at.knowcenter.wag.egov.egiz.sig.ConnectorFactory;
+import at.knowcenter.wag.egov.egiz.sig.ConnectorInformation;
+import at.knowcenter.wag.egov.egiz.sig.SignatureTypes;
+
+/**
+ * Helper class that provides methods and constants for creating and dealing
+ * with the various form fields.
+ *
+ * @author wprinz
+ */
+public abstract class FormFields
+{
+ public static final String PARAMETER_FREE_TEXT_ENTRY = "freetext";
+
+ public static final String FIELD_UPLOAD = "upload";
+
+ public static final String FIELD_CONNECTOR = "connector";
+
+ public static final String FIELD_MODE = "mode";
+
+ public static final String FIELD_PREVIEW = "preview";
+
+ public static final String FIELD_RAW_DOCUMENT_TEXT = "raw_document_text";
+
+ public static final String FIELD_SIGNATURE_TYPE = "sig_type";
+
+ public static final String FIELD_VERIFY_WHICH = "verify_which";
+
+ public static final String FIELD_DOWNLOAD = "download";
+
+ public static final String VALUE_TRUE = "true";
+
+ public static final String VALUE_FALSE = "false";
+
+ public static final String VALUE_MODE_BINARY = "binary";
+
+ public static final String VALUE_MODE_TEXTUAL = "textual";
+
+ public static final String VALUE_MODE_DETACHED = "detached";
+
+ public static final String VALUE_VERIFY_WHICH_ALL = "all";
+
+ public static final String VALUE_DOWNLOAD_INLINE = "inline";
+
+ public static final String VALUE_DOWNLOAD_ATTACHMENT = "attachment";
+
+ protected static final String STYLE_CLASS_FIELD = "field";
+
+ /**
+ * Translates the form field to a PDF-AS-ID.
+ *
+ * @param signature_mode
+ * The signator mode form field.
+ * @return Returns the corresponding PDFASID.
+ */
+ protected static PdfASID translateSignatureModeToPdfASID(String signature_mode)
+ {
+ if (signature_mode.equals(VALUE_MODE_BINARY))
+ {
+ return SignatorFactory.MOST_RECENT_BINARY_SIGNATOR_ID;
+ }
+ if (signature_mode.equals(VALUE_MODE_TEXTUAL))
+ {
+ return SignatorFactory.MOST_RECENT_TEXTUAL_SIGNATOR_ID;
+ }
+ if (signature_mode.equals(VALUE_MODE_DETACHED))
+ {
+ return SignatorFactory.MOST_RECENT_DETACHED_SIGNATOR_ID;
+ }
+ return null;
+ }
+
+ /**
+ * Generates the HTML snippet of a FIELD_CONNECTOR select box that allows to
+ * choose a connector.
+ *
+ * @return Returns the HTML snippet.
+ * @throws SettingsException
+ * Forwarded exception.
+ * @throws ConnectorFactoryException
+ * Forwarded exception.
+ */
+ public static String generateConnectorSelectBox() throws SettingsException, ConnectorFactoryException
+ {
+ StringWriter sw = new StringWriter();
+ PrintWriter writer = new PrintWriter(sw);
+
+ writer.println("<select name=\"" + FIELD_CONNECTOR + "\" class=\"" + STYLE_CLASS_FIELD + "\">");
+
+ SettingsReader settings = SettingsReader.getInstance();
+ String default_connector = settings.getValueFromKey(SignatureTypes.DEFAULT_TYPE);
+
+ ConnectorInformation ci[] = ConnectorFactory.getConnectorInformationArray();
+
+ for (int i = 0; i < ci.length; i++)
+ {
+ String id = ci[i].getIdentifier();
+ if (!ConnectorFactory.isAvailableForWeb(id))
+ {
+ continue;
+ }
+
+ writer.print("<option value=\"" + id + "\"");
+ if (id.equals(default_connector))
+ {
+ writer.print(" selected=\"selected\"");
+ }
+ writer.println(">" + ci[i].getDescription() + "</option>");
+ }
+
+ writer.println("</select>");
+
+ return sw.toString();
+ }
+
+ /**
+ * Generates a HTML snippet of a FIELD_SIGNATURE_TYPE select box that allows
+ * to choose the signature type.
+ *
+ * @return Returns the HTML snippet.
+ * @throws ServletException
+ * Forwarded exception.
+ */
+ public static String generateTypeSelectBox() throws ServletException
+ {
+ try
+ {
+ StringWriter sw = new StringWriter();
+ PrintWriter writer = new PrintWriter(sw);
+
+ SettingsReader settings = SettingsReader.getInstance();
+ SignatureTypes sig_types = SignatureTypes.getInstance();
+
+ // SettingsReader settings = null;
+ // SignatureTypes sig_types = null;
+ // try
+ // {
+ // settings = SettingsReader.getInstance();
+ // sig_types = SignatureTypes.getInstance();
+ // }
+ // catch (IOException e)
+ // {
+ // String log_message = "Can not load signature settings. Cause:\n" +
+ // e.getMessage();
+ // logger_.error(log_message);
+ // req.setAttribute("error", "Das System konnte nicht gestartet werden.");
+ // req.setAttribute("cause", "Die Konfiguration ist fehlerhaft oder konnte
+ // nicht geladen werden.");
+ // dispatch(req, res, "/jsp/error.jsp");
+ // }
+
+ ArrayList types_array = sig_types.getSignatureTypes();
+ Iterator type_it = types_array.iterator();
+
+ String default_type = settings.getValueFromKey(SignatureTypes.DEFAULT_TYPE);
+
+ writer.println("<select class=\"" + STYLE_CLASS_FIELD + "\" name=\"" + FIELD_SIGNATURE_TYPE + "\">");
+
+ while (type_it.hasNext())
+ {
+ String type = (String) type_it.next();
+ String descr_key = SignatureTypes.SIG_OBJ + type + "." + SignatureTypes.SIG_DESCR;
+ String type_descr = settings.getValueFromKey(descr_key);
+
+ writer.println("<option value=\"" + type + "\" " + (type.equals(default_type) ? "selected=\"selected\"" : "") + ">" + type_descr + "</option>");
+
+ }
+
+ writer.println("</select>");
+
+ return sw.toString();
+ }
+ catch (Exception e)
+ {
+ throw new ServletException(e);
+ }
+ }
+
+}
diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/web/LocalRequest.java b/src/main/java/at/knowcenter/wag/egov/egiz/web/LocalRequest.java
new file mode 100644
index 0000000..d3c24a7
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/egov/egiz/web/LocalRequest.java
@@ -0,0 +1,80 @@
+/**
+ * <copyright> Copyright (c) 2006 by Know-Center, Graz, Austria </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+ * NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
+ * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES.
+ *
+ * $Id: LocalRequest.java,v 1.2 2006/08/25 17:06:11 wprinz Exp $
+ */
+package at.knowcenter.wag.egov.egiz.web;
+
+import java.io.Serializable;
+
+/**
+ * Encapsulates a local request, basicall an URL where the local request is sent
+ * to and a request string.
+ *
+ * @author wprinz
+ */
+public class LocalRequest implements Serializable
+{
+
+ /**
+ * SVUID.
+ */
+ private static final long serialVersionUID = -3734904043231861998L;
+
+ /**
+ * The URL the local request sould be directed at.
+ */
+ protected String url_;
+
+ /**
+ * The request string to be sent to that URL.
+ */
+ protected String request_string_;
+
+ /**
+ * Constructor that initializes the URL and request string.
+ *
+ * @param url
+ * The URL the local request sould be directed at.
+ * @param request_string
+ * The request string to be sent to that URL.
+ */
+ public LocalRequest(String url, String request_string)
+ {
+ this.url_ = url;
+ this.request_string_ = request_string;
+ }
+
+ /**
+ * Returns the URL.
+ *
+ * @return Returns the URL.
+ */
+ public String getUrl()
+ {
+ return url_;
+ }
+
+ /**
+ * Returns the request string.
+ *
+ * @return Returns the request string.
+ */
+ public String getRequestString()
+ {
+ return request_string_;
+ }
+
+}
diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/web/LocalRequestHelper.java b/src/main/java/at/knowcenter/wag/egov/egiz/web/LocalRequestHelper.java
new file mode 100644
index 0000000..50bea41
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/egov/egiz/web/LocalRequestHelper.java
@@ -0,0 +1,226 @@
+/**
+ * <copyright> Copyright (c) 2006 by Know-Center, Graz, Austria </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+ * NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
+ * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES.
+ *
+ * $Id: LocalRequestHelper.java,v 1.6 2006/10/31 08:22:04 wprinz Exp $
+ */
+package at.knowcenter.wag.egov.egiz.web;
+
+import java.io.IOException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import at.knowcenter.wag.egov.egiz.exceptions.ConnectorFactoryException;
+import at.knowcenter.wag.egov.egiz.exceptions.NormalizeException;
+import at.knowcenter.wag.egov.egiz.exceptions.PresentableException;
+import at.knowcenter.wag.egov.egiz.exceptions.SignatureException;
+import at.knowcenter.wag.egov.egiz.pdf.SignatureHolder;
+import at.knowcenter.wag.egov.egiz.sig.ConnectorFactory;
+import at.knowcenter.wag.egov.egiz.sig.LocalConnector;
+
+/**
+ * Contains commonly used helper functions for the local request procedure.
+ *
+ * @author wprinz
+ */
+public abstract class LocalRequestHelper
+{
+ /**
+ * The resource of the local connection page jsp.
+ */
+ public static final String LOCAL_CONNECTION_PAGE_JSP = "/jsp/local_connection_page.jsp";
+
+ /**
+ * The resource of the redirect refresh page jsp.
+ */
+ public static final String REDIRECT_REFRESH_PAGE_JSP = "/jsp/redirect_refresh_page.jsp";
+
+ /**
+ * Sets up the local sign procedure.
+ *
+ * @param response
+ * The HttpServletResponse the local request page is written to.
+ * @throws IOException
+ * Forwarded exception.
+ * @throws PresentableException
+ * Forwarded exception.
+ */
+ public static void processLocalSign(SessionInformation si,
+ HttpServletRequest request, HttpServletResponse response) throws IOException, PresentableException
+ {
+ LocalConnector local_conn = (LocalConnector) ConnectorFactory.createConnector(si.connector);
+
+ String document_text = si.iui.document_text;
+ String request_string = local_conn.prepareSignRequest(si.user_name, document_text, si.type);
+ String request_url = local_conn.getSignURL(si.type);
+
+ LocalRequest local_request = new LocalRequest(request_url, request_string);
+ List local_requests = new ArrayList();
+ local_requests.add(local_request);
+
+ // ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ // ObjectOutputStream oos = new ObjectOutputStream(baos);
+ // oos.writeObject(local_requests);
+ // oos.close();
+ // baos.close();
+
+ si.requests = new LocalRequest[1];
+ si.requests[0] = new LocalRequest(local_conn.getSignURL(si.type), request_string);
+ si.current_operation = 0;
+ si.response_string = new String[1];
+ si.response_string[0] = null;
+
+ // SessionTable.put(si);
+ request.getSession().setAttribute(SessionAttributes.ATTRIBUTE_SESSION_INFORMATION, si);
+
+ // byte [] requests_bytes = baos.toByteArray();
+ // String base64 = CodingHelper.encodeBase64(requests_bytes);
+
+ LocalRequestHelper.prepareDispatchToLocalConnectionPage(si.requests[0], request, response);
+ }
+
+ /**
+ * Sets up the local verify procedure.
+ *
+ * @param response
+ * The HttpServletResponse the local request page is written to.
+ * @throws SignatureException
+ * Forwarded exception.
+ * @throws NormalizeException
+ * Forwarded exception.
+ * @throws IOException
+ * Forwarded exception.
+ * @throws ConnectorFactoryException
+ * Forwarded exception.
+ */
+ public static void processLocalVerify(SessionInformation si,
+ List holders_to_verify, HttpServletRequest request,
+ HttpServletResponse response) throws SignatureException, NormalizeException, IOException, ConnectorFactoryException
+ {
+ si.requests = new LocalRequest[holders_to_verify.size()];
+ si.response_string = new String[si.requests.length];
+ si.current_operation = 0;
+ si.finished = false;
+
+ request.getSession().setAttribute(SessionAttributes.ATTRIBUTE_SESSION_INFORMATION, si);
+ // SessionTable.put(si);
+
+ LocalConnector local_conn = (LocalConnector) ConnectorFactory.createConnector(si.connector);
+
+ for (int i = 0; i < si.requests.length; i++)
+ {
+ SignatureHolder holder = (SignatureHolder) holders_to_verify.get(i);
+
+ String text_to_be_verified = holder.getSignedText();
+ // Normalizer normalizer = new Normalizer();
+ // String normalized = normalizer.normalize(holder.signed_text);
+
+ String request_string = local_conn.prepareVerifyRequest(text_to_be_verified, holder.getSignatureObject());
+
+ LocalRequest local_request = new LocalRequest(local_conn.getVerifyURL(holder.getSignatureObject().getSignationType()), request_string);
+ si.requests[i] = local_request;
+ si.response_string[i] = null;
+ }
+
+ // ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ // ObjectOutputStream oos = new ObjectOutputStream(baos);
+ // oos.writeObject(local_requests);
+ // oos.close();
+ // baos.close();
+
+ // byte [] requests_bytes = baos.toByteArray();
+ // String base64 = CodingHelper.encodeBase64(requests_bytes);
+
+ prepareDispatchToLocalConnectionPage(si.requests[0], request, response);
+ }
+
+ /**
+ * Formats the OK response from the web application back to the local BKU.
+ *
+ * <p>
+ * As stated in the BKU tutorial, this response must be plain text "<ok/>".
+ * Otherwise BKU will assume a failure.
+ * </p>
+ *
+ * @param response
+ * The HttpServletResponse to answer to.
+ * @throws IOException
+ * Forwarded exception.
+ */
+ protected static void formatBKUOkResponse(HttpServletResponse response) throws IOException
+ {
+ response.setContentType("text/plain");
+ response.setCharacterEncoding("ISO-8859-1");
+
+ response.getWriter().println("<ok/>");
+ }
+
+ /**
+ * Prepares the dispatch to the local data connection page.
+ *
+ * <p>
+ * The calling servlet just has to dispatch to the jsp after calling this
+ * method.
+ * </p>
+ *
+ * @param local_request
+ * The local request. Basically this contains the local service's
+ * target URL and the XML request string.
+ * @param response
+ * The HttpServletResponse to write this page to.
+ * @throws IOException
+ * Forwarded exception.
+ * @throws SignatureException
+ * Forwarded exception.
+ * @throws NormalizeException
+ * Forwarded exception.
+ */
+ public static void prepareDispatchToLocalConnectionPage(
+ LocalRequest local_request, HttpServletRequest request,
+ HttpServletResponse response) throws IOException, SignatureException, NormalizeException
+ {
+ response.setContentType("text/html");
+ response.setCharacterEncoding("UTF-8");
+
+ String local_request_url = local_request.getUrl();
+
+ String quoted_request = makeStringHTMLReady(local_request.getRequestString());
+
+ String host = request.getServerName(); // "129.27.153.77"
+ URL data_URL = new URL(request.getScheme(), host, request.getServerPort(), request.getContextPath() + "/AsynchronousDataResponder");
+ String data_url = response.encodeURL(data_URL.toString());
+ URL redirect_URL = new URL(request.getScheme(), host, request.getServerPort(), request.getContextPath() + "/AsynchronousRedirectResponder");
+ String redirect_url = response.encodeURL(redirect_URL.toString());
+
+ request.setAttribute("local_request_url", local_request_url);
+ request.setAttribute("quoted_request", quoted_request);
+ request.setAttribute("data_url", data_url);
+ request.setAttribute("redirect_url", redirect_url);
+ }
+
+ public static String makeStringHTMLReady(String input)
+ {
+ String output = input;
+
+ output = output.replaceAll("&", "&amp;");
+ output = output.replaceAll("\"", "&quot;");
+ output = output.replaceAll("<", "&lt;");
+ output = output.replaceAll(">", "&gt;");
+ return output;
+ }
+}
diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/web/PdfASServletContextListener.java b/src/main/java/at/knowcenter/wag/egov/egiz/web/PdfASServletContextListener.java
new file mode 100644
index 0000000..fab3e04
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/egov/egiz/web/PdfASServletContextListener.java
@@ -0,0 +1,76 @@
+/**
+ * <copyright> Copyright (c) 2006 by Know-Center, Graz, Austria </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+ * NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
+ * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES.
+ *
+ * $Id: PdfASServletContextListener.java,v 1.3 2006/10/31 08:22:04 wprinz Exp $
+ */
+package at.knowcenter.wag.egov.egiz.web;
+
+import java.io.File;
+import java.io.IOException;
+
+import javax.servlet.ServletContextEvent;
+import javax.servlet.ServletContextListener;
+
+import org.apache.log4j.Logger;
+
+import at.knowcenter.wag.egov.egiz.cfg.ConfigLogger;
+import at.knowcenter.wag.egov.egiz.cfg.SettingsReader;
+
+/**
+ * The ServletContextListener is notified when the webapplication starts up and shuts down.
+ *
+ * <p>
+ * Maintainance work is performed.
+ * </p>
+ *
+ * @author wprinz
+ */
+public class PdfASServletContextListener implements ServletContextListener
+{
+ /**
+ * The logger.
+ */
+ private static final Logger logger = ConfigLogger.getLogger(PdfASServletContextListener.class);
+
+ /**
+ * @see javax.servlet.ServletContextListener#contextInitialized(javax.servlet.ServletContextEvent)
+ */
+ public void contextInitialized(ServletContextEvent arg0)
+ {
+ logger.info("PDF-AS Context init");
+ String base_dir = arg0.getServletContext().getRealPath("/");
+ try
+ {
+ logger.info("PDF-AS base directory = " + new File(base_dir).getCanonicalPath());
+ }
+ catch (IOException e)
+ {
+ e.printStackTrace();
+ }
+
+ SettingsReader.initializeForWeb(base_dir);
+
+ SettingsReader.clearTemporaryDirectory();
+ }
+
+ /**
+ * @see javax.servlet.ServletContextListener#contextDestroyed(javax.servlet.ServletContextEvent)
+ */
+ public void contextDestroyed(ServletContextEvent arg0)
+ {
+ SettingsReader.clearTemporaryDirectory();
+ logger.info("PDF-AS Context exit");
+ }
+}
diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/web/SessionAttributes.java b/src/main/java/at/knowcenter/wag/egov/egiz/web/SessionAttributes.java
new file mode 100644
index 0000000..02b6855
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/egov/egiz/web/SessionAttributes.java
@@ -0,0 +1,46 @@
+/**
+ * <copyright> Copyright (c) 2006 by Know-Center, Graz, Austria </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+ * NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
+ * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES.
+ *
+ * $Id: SessionAttributes.java,v 1.2 2006/08/25 17:06:11 wprinz Exp $
+ */
+package at.knowcenter.wag.egov.egiz.web;
+
+/**
+ * Helper class that provides constants for the session attributes.
+ *
+ * @author wprinz
+ */
+public abstract class SessionAttributes
+{
+
+ /**
+ * The user name.
+ */
+ public static final String ATTRIBUTE_USER_NAME = "uname";
+
+ /**
+ * The user password.
+ */
+ public static final String ATTRIBUTE_USER_PASSWORD = "upass";
+
+ /**
+ * The attribute name under which the SessionInformation object is stored.
+ *
+ * <p>
+ * The SessionInformation class contains type safe references to the objects.
+ * </p>
+ */
+ public static final String ATTRIBUTE_SESSION_INFORMATION = "session_information";
+}
diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/web/SessionInformation.java b/src/main/java/at/knowcenter/wag/egov/egiz/web/SessionInformation.java
new file mode 100644
index 0000000..f3c34d3
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/egov/egiz/web/SessionInformation.java
@@ -0,0 +1,126 @@
+/**
+ * <copyright> Copyright (c) 2006 by Know-Center, Graz, Austria </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+ * NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
+ * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES.
+ *
+ * $Id: SessionInformation.java,v 1.2 2006/08/25 17:06:11 wprinz Exp $
+ */
+package at.knowcenter.wag.egov.egiz.web;
+
+import java.io.Serializable;
+import java.util.List;
+
+import at.knowcenter.wag.egov.egiz.framework.SignResult;
+import at.knowcenter.wag.egov.egiz.pdf.IncrementalUpdateInformation;
+
+/**
+ * This class is a collection of various session parameters that are passed
+ * between the servlets and jsps.
+ *
+ * <p>
+ * The SessionInformation class contains type safe references to the objects.
+ * </p>
+ *
+ * @author wprinz
+ */
+public class SessionInformation implements Serializable
+{
+
+ /**
+ * SVUID.
+ */
+ private static final long serialVersionUID = -7413884936584659150L;
+
+ // public long session_id = -1;
+
+ /**
+ * The connector.
+ */
+ public String connector = null;
+
+ /**
+ * For local requests, tells the application (sign, verify).
+ */
+ public String application = null;
+
+ /**
+ * Tells the operation mode (binary, textual).
+ */
+ public String mode = null;
+
+ /**
+ * The original, uploaded pdf.
+ */
+ public byte[] pdf = null;
+
+ /**
+ * The type/profile of the signature.
+ */
+ public String type = null;
+
+ /**
+ * The user name.
+ */
+ public String user_name = null;
+
+ /**
+ * The password.
+ */
+ public String user_password = null;
+
+ /**
+ * An array of local requests to be processed.
+ */
+ public LocalRequest[] requests = null;
+
+ /**
+ * The index of the local request to be processed next.
+ */
+ public int current_operation = 0;
+
+ /**
+ * An array of response strings of the local requests.
+ */
+ public String[] response_string = null;
+
+ /**
+ * Tells, if the current local request has been finished.
+ */
+ public boolean finished = false;
+
+ /**
+ * The incremental update information that has been extracted from the given
+ * PDF document.
+ */
+ public IncrementalUpdateInformation iui;
+
+ /**
+ * The signature holders.
+ */
+ public List signature_holders;
+
+ /**
+ * The suggested filename.
+ */
+ public String filename;
+
+ /**
+ * Tells, if the file download should be done inline or as attachment.
+ */
+ public boolean download_inline;
+
+ /**
+ * The sign result to be passed back to the user.
+ */
+ public SignResult sign_result;
+}
diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/web/SessionTable.java b/src/main/java/at/knowcenter/wag/egov/egiz/web/SessionTable.java
new file mode 100644
index 0000000..4d0ba21
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/egov/egiz/web/SessionTable.java
@@ -0,0 +1,94 @@
+/**
+ *
+ */
+package at.knowcenter.wag.egov.egiz.web;
+
+
+/**
+ * This class contains the session table that is used for local requests.
+ *
+ * @author wprinz
+ */
+public abstract class SessionTable
+{
+ // Session table no longer needed - because J2EE Servlet sessions are used.
+
+// /**
+// * The HashMap for mapping the session id to the SessionInformation object on
+// * the server.
+// */
+// protected static Map session_table = new HashMap();
+//
+// /**
+// * The random number generator used to generate session_ids.
+// */
+// protected static Random random = new Random();
+//
+// /**
+// * Generates a new SessionInformation object with a unique session_id.
+// *
+// * <p>
+// * The object has to be added to the session table by using put().
+// * </p>
+// *
+// * @return Returns the generated SessionInformation object.
+// *
+// * @see #put(SessionInformation)
+// */
+// public static SessionInformation generateSessionInformationObject()
+// {
+// SessionInformation si = new SessionInformation();
+// si.session_id = random.nextLong();
+//
+// return si;
+// }
+//
+// /**
+// * Puts the SessionInformation object into the session table.
+// *
+// * @param si
+// * The SessionInformation object. The session_id field must be filled
+// * out properly.
+// */
+// public static void put(SessionInformation si)
+// {
+// session_table.put(new Long(si.session_id), si);
+// }
+//
+// /**
+// * Gets the SessionInformation object associated with the given session_id.
+// *
+// * @param session_id
+// * The session_id.
+// * @return Returns the corresponding SessionInformation object or null, if no
+// * object is associated with that id.
+// */
+// public static SessionInformation get(final long session_id)
+// {
+// return (SessionInformation) session_table.get(new Long(session_id));
+// }
+//
+// /**
+// * Removes the SessionInformation object with the provided session_id from the
+// * session table.
+// *
+// * @param session_id
+// * The session_id to be removed.
+// */
+// public static void remove(long session_id)
+// {
+// session_table.remove(new Long(session_id));
+// }
+//
+// /**
+// * Simply clear the session table.
+// *
+// * <p>
+// * This should be used once in a while to tie up some loose ends.
+// * </p>
+// */
+// public static void clear()
+// {
+// session_table.clear();
+// }
+}
diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/web/Sign.java b/src/main/java/at/knowcenter/wag/egov/egiz/web/Sign.java
new file mode 100644
index 0000000..a3ded84
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/egov/egiz/web/Sign.java
@@ -0,0 +1,525 @@
+/**
+ * <copyright> Copyright (c) 2006 by Know-Center, Graz, Austria </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+ * NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
+ * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES.
+ *
+ * $Id: Sign.java,v 1.7 2006/10/11 07:39:13 wprinz Exp $
+ */
+package at.knowcenter.wag.egov.egiz.web;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.Serializable;
+import java.util.Iterator;
+import java.util.List;
+
+import javax.servlet.RequestDispatcher;
+import javax.servlet.ServletContext;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+
+import org.apache.commons.fileupload.FileItem;
+import org.apache.commons.fileupload.FileUploadException;
+import org.apache.commons.fileupload.disk.DiskFileItemFactory;
+import org.apache.commons.fileupload.servlet.ServletFileUpload;
+import org.apache.log4j.Logger;
+
+import at.knowcenter.wag.egov.egiz.PdfAS;
+import at.knowcenter.wag.egov.egiz.PdfASID;
+import at.knowcenter.wag.egov.egiz.cfg.ConfigLogger;
+import at.knowcenter.wag.egov.egiz.cfg.SettingsReader;
+import at.knowcenter.wag.egov.egiz.exceptions.ErrorCodeException;
+import at.knowcenter.wag.egov.egiz.exceptions.PDFDocumentException;
+import at.knowcenter.wag.egov.egiz.exceptions.PlaceholderException;
+import at.knowcenter.wag.egov.egiz.exceptions.PresentableException;
+import at.knowcenter.wag.egov.egiz.framework.SignResult;
+import at.knowcenter.wag.egov.egiz.framework.Signator;
+import at.knowcenter.wag.egov.egiz.framework.SignatorFactory;
+import at.knowcenter.wag.egov.egiz.framework.signators.DetachedSignator_1_0_0;
+import at.knowcenter.wag.egov.egiz.sig.ConnectorFactory;
+import at.knowcenter.wag.egov.egiz.tools.CodingHelper;
+
+/**
+ * This method is the sign servlet for the pdf-as web application. It takes get
+ * and post requests fill out jsp templates and give the user feedback about the
+ * results of the sign process
+ *
+ * @author wlackner
+ * @author wprinz
+ */
+public class Sign extends HttpServlet
+{
+
+ /**
+ * SVUID.
+ */
+ private static final long serialVersionUID = -4156938216903740438L;
+
+ /**
+ * Authorisation marker for the http header string.
+ */
+ protected static final String AUTH = "authorization";
+
+ /**
+ * Authorisation marker for the http header string.
+ */
+ protected static final String AUTH_BASIC = "Basic";
+
+ /**
+ * The logger.
+ */
+ private static final Logger logger_ = ConfigLogger.getLogger(Sign.class);
+
+ protected void dispatch(HttpServletRequest request,
+ HttpServletResponse response, String resource) throws ServletException, IOException
+ {
+ dispatch(request, response, resource, getServletContext());
+ }
+
+ protected static void dispatch(HttpServletRequest request,
+ HttpServletResponse response, String resource, ServletContext context) throws ServletException, IOException
+ {
+ response.setContentType("text/html");
+ response.setCharacterEncoding("UTF-8");
+
+ RequestDispatcher disp = context.getRequestDispatcher(resource);
+ disp.forward(request, response);
+ }
+
+ public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+ {
+ String authenticate = request.getHeader(AUTH);
+ if (authenticate != null)
+ {
+ logger_.info("authenticate:" + authenticate);
+ if (authenticate.indexOf(AUTH_BASIC) == 0)
+ {
+ authenticate = authenticate.substring(AUTH_BASIC.length() + 1);
+ logger_.info("authenticate:" + authenticate);
+ authenticate = new String(CodingHelper.decodeBase64(authenticate), "UTF-8");
+ logger_.info("authenticate:" + authenticate);
+
+ String[] auth_value = authenticate.split(":");
+ String user_name = auth_value[0];
+ String user_password = auth_value[1];
+ logger_.info("username:" + user_name);
+ logger_.info("password:" + user_password);
+
+ HttpSession session = request.getSession();
+ session.setAttribute(SessionAttributes.ATTRIBUTE_USER_NAME, user_name);
+ session.setAttribute(SessionAttributes.ATTRIBUTE_USER_PASSWORD, user_password);
+
+ dispatch(request, response, "/jsp/signupload.jsp");
+ return;
+ }
+ }
+
+ request.setAttribute("error", "Falsche Authentifikation");
+ request.setAttribute("cause", "Passwort oder Benutzername ist falsch");
+ dispatch(request, response, "/jsp/error.jsp");
+ }
+
+ public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+ {
+ DiskFileItemFactory fif = new DiskFileItemFactory();
+ fif.setRepository(SettingsReader.getTemporaryDirectory());
+ ServletFileUpload sfu = new ServletFileUpload(fif);
+
+ try
+ {
+ List items = sfu.parseRequest(request);
+
+ FileItem preview_fi = null;
+ FileItem sig_type_fi = null;
+ FileItem sig_app_fi = null;
+ FileItem mode_fi = null;
+ FileItem file_upload_fi = null;
+ FileItem download_fi = null;
+
+ Iterator it = items.iterator();
+ while (it.hasNext())
+ {
+ FileItem item = (FileItem) it.next();
+ logger_.debug("item = " + item.getFieldName());
+
+ if (item.isFormField())
+ {
+ byte[] item_data = item.get();
+ String item_string = new String(item_data, "UTF-8");
+ logger_.debug(" form field string = " + item_string);
+ }
+ else
+ {
+ logger_.debug(" filename = " + item.getName());
+ logger_.debug(" filesize = " + item.getSize());
+ }
+
+ if (item.getFieldName().equals(FormFields.FIELD_PREVIEW))
+ {
+ preview_fi = item;
+ continue;
+ }
+
+ if (item.getFieldName().equals(FormFields.FIELD_SIGNATURE_TYPE))
+ {
+ sig_type_fi = item;
+ continue;
+ }
+
+ if (item.getFieldName().equals(FormFields.FIELD_CONNECTOR))
+ {
+ sig_app_fi = item;
+ continue;
+ }
+
+ if (item.getFieldName().equals(FormFields.FIELD_MODE))
+ {
+ mode_fi = item;
+ continue;
+ }
+
+ if (item.getFieldName().equals(FormFields.FIELD_UPLOAD))
+ {
+ file_upload_fi = item;
+ continue;
+ }
+
+ if (item.getFieldName().equals(FormFields.FIELD_DOWNLOAD))
+ {
+ download_fi = item;
+ continue;
+ }
+
+ throw new ServletException("unrecognized POST data.");
+
+ }
+
+ if (preview_fi == null || sig_type_fi == null || sig_app_fi == null || file_upload_fi == null || download_fi == null)
+ {
+ throw new ServletException("Unsufficient data provided in request");
+ }
+
+ String mode = mode_fi.getString("UTF-8");
+ if (!mode.equals(FormFields.VALUE_MODE_BINARY) && !mode.equals(FormFields.VALUE_MODE_TEXTUAL) && !mode.equals(FormFields.VALUE_MODE_DETACHED))
+ {
+ throw new ServletException("The mode '" + mode + "' is unrecognized.");
+ }
+
+ String preview_str = preview_fi.getString("UTF-8");
+ boolean preview = false;
+ if (preview_str.equals("true"))
+ {
+ preview = true;
+ }
+
+ boolean download_inline = true;
+ if (download_fi.getString("UTF-8").equals(FormFields.VALUE_DOWNLOAD_ATTACHMENT))
+ {
+ download_inline = false;
+ }
+
+ String sig_type = sig_type_fi.getString("UTF-8");
+ String connector = sig_app_fi.getString("UTF-8");
+
+ String doc_file_name = file_upload_fi.getName();
+ logger_.debug(" file content type =" + file_upload_fi.getContentType());
+
+ String extension = Verify.extractExtension(doc_file_name);
+ if (extension != null && !extension.equals("pdf"))
+ {
+ throw new PDFDocumentException(201, "The provided file '" + doc_file_name + "' doesn't have the PDF extension (.pdf).");
+ }
+
+ byte[] pdf = file_upload_fi.get();
+ if (file_upload_fi.getSize() <= 0)
+ {
+ throw new PDFDocumentException(250, "The document is empty.");
+ }
+ PdfAS.applyStrictMode(pdf);
+
+ String user_name = (String) request.getSession().getAttribute(SessionAttributes.ATTRIBUTE_USER_NAME);
+ String user_password = (String) request.getSession().getAttribute(SessionAttributes.ATTRIBUTE_USER_PASSWORD);
+
+ SessionInformation si = new SessionInformation(); // SessionTable.generateSessionInformationObject();
+ si.connector = connector;
+ si.application = "sign";
+ si.mode = mode;
+ si.pdf = pdf;
+ si.type = sig_type;
+ si.user_name = user_name;
+ si.user_password = user_password;
+ si.filename = formatFileName(file_upload_fi.getName());
+ si.download_inline = download_inline;
+
+ prepareSign(si);
+
+ if (preview)
+ {
+ request.getSession().setAttribute(SessionAttributes.ATTRIBUTE_SESSION_INFORMATION, si);
+
+ String submit_url = response.encodeURL(request.getContextPath() + "/SignPreview");
+
+ request.setAttribute("submit_url", submit_url);
+
+ dispatch(request, response, "/jsp/signpreview.jsp");
+
+ return;
+ }
+
+ finishSign(si, request, response, getServletContext());
+ }
+ catch (FileUploadException e)
+ {
+ request.setAttribute("error", "Fehler beim Upload der Daten");
+ request.setAttribute("cause", "Beim Upload der Daten ist ein Fehler aufgetreten.");
+ dispatch(request, response, "/jsp/error.jsp");
+ }
+ catch (PresentableException e)
+ {
+ e.printStackTrace();
+ prepareDispatchToErrorPage(e, request);
+ dispatch(request, response, "/jsp/error.jsp");
+ }
+ }
+
+ public static void prepareSign(SessionInformation si) throws PresentableException
+ {
+ PdfASID algorithm = FormFields.translateSignatureModeToPdfASID(si.mode);
+ Signator signator = SignatorFactory.createSignator(algorithm);
+ si.iui = signator.prepareSign(si.pdf, si.type, null, ConnectorFactory.needsSIG_ID(si.connector));
+ }
+
+ public static void finishSign(SessionInformation si,
+ HttpServletRequest request, HttpServletResponse response, ServletContext context) throws PresentableException, IOException, ServletException
+ {
+ if (ConnectorFactory.isConnectorLocal(si.connector))
+ {
+ LocalRequestHelper.processLocalSign(si, request, response);
+ dispatch(request, response, LocalRequestHelper.LOCAL_CONNECTION_PAGE_JSP, context);
+ return;
+ }
+
+ PdfASID algorithm = FormFields.translateSignatureModeToPdfASID(si.mode);
+ Signator signator = SignatorFactory.createSignator(algorithm);
+
+ si.iui.signed_signature_object = PdfAS.sign(si.iui.document_text, si.type, si.connector, si.user_name, si.user_password);
+
+ si.sign_result = signator.finishSign(si.iui);
+
+ returnSignResponse(si, response);
+ }
+
+ public static void prepareDispatchToErrorPage(PresentableException pe,
+ HttpServletRequest request)
+ {
+ if (pe instanceof ErrorCodeException)
+ {
+ ErrorCodeException ece = (ErrorCodeException) pe;
+ request.setAttribute("error", "Fehler " + ece.getErrorCode());
+
+ String cause = ece.getErrorCodeMessage();
+ if (ece.hasExternalErrorMessage())
+ {
+ cause = ece.getExternalErrorCode() + ": " + ece.getExternalErrorMessage();
+ }
+ request.setAttribute("cause", cause);
+
+ if (pe instanceof PlaceholderException)
+ {
+ PlaceholderException phe = (PlaceholderException) ece;
+
+ request.setAttribute("cause", "Der Platzhalter des Feldes " + phe.getField() + " ist um " + phe.getMissing() + " Bytes zu kurz. " + ece.getErrorCodeMessage());
+ }
+ }
+ else
+ {
+ request.setAttribute("error", "PresentableException");
+ request.setAttribute("cause", pe.toString());
+ }
+ }
+
+ public void dispatchToPreview(String document_text, String connector,
+ String mode, String signature_type, String submit_url,
+ HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+ {
+ request.setAttribute("document_text", document_text);
+ request.setAttribute("connector", connector);
+ request.setAttribute("mode", mode);
+ request.setAttribute("signature_type", signature_type);
+ request.setAttribute("submit_url", submit_url);
+
+ dispatch(request, response, "/jsp/signpreview.jsp");
+ }
+
+ // public static void formatPreview(String document_text, String connector,
+ // String mode, String signature_type, String submit_url,
+ // HttpServletResponse response) throws ServletException, IOException
+ // {
+ // response.setContentType("text/html");
+ // response.setCharacterEncoding("UTF-8");
+ //
+ // PrintWriter writer = response.getWriter();
+ //
+ // writer.println("<html>");
+ // writer.println("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0
+ // Transitional//EN\"
+ // \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">");
+ // writer.println("<html>");
+ // writer.println("<head>");
+ // writer.println("<meta http-equiv=\"content-type\" content=\"text/html;
+ // charset=UTF-8\" />");
+ // writer.println("<title>PDF-AS Amtssignaturen Vorschau</title>");
+ // writer.println("<link rel=\"stylesheet\" type=\"text/css\"
+ // href=\"/pdf-as/css/styles.css\" />");
+ // writer.println("</head>");
+ //
+ // writer.println("<body>");
+ // writer.println("<div>");
+ //
+ // writer.println("<h1>PDF-AS Amtssignaturen</h1>");
+ //
+ // writer.println("<div id=\"nav\">");
+ // writer.println("<div id=\"nh\">Vorschau: Dokument Pr&uuml;fen</div>");
+ // writer.println("<form action=\"" + submit_url + "\"");
+ // writer.println(" name=\"submitform\"");
+ // writer.println(" enctype=\"multipart/form-data\"");
+ // writer.println(" accept-charset=\"UTF-8\"");
+ // writer.println(" method=\"post\">");
+ // writer.println("<div id=\"ct\">");
+ //
+ // writer.println("<input type=\"hidden\" name=\"" + FormFields.FIELD_PREVIEW
+ // + "\" value=\"" + FormFields.VALUE_FALSE + "\" />");
+ // writer.println("<input type=\"hidden\" name=\"" +
+ // FormFields.FIELD_SIGNATURE_TYPE + "\" value=\"" + signature_type + "\"
+ // />");
+ // writer.println("<input type=\"hidden\" name=\"" +
+ // FormFields.FIELD_CONNECTOR + "\" value=\"" + connector + "\" />");
+ // writer.println("<input type=\"hidden\" name=\"" + FormFields.FIELD_MODE +
+ // "\" value=\"" + mode + "\" />");
+ // writer.println("<input type=\"hidden\" name=\"" + "after_preview" + "\"
+ // value=\"" + "yes" + "\" />");
+ //
+ // writer.println("<textarea class=\"pr\" cols=\"80\" rows=\"14\" name=\"" +
+ // FormFields.FIELD_UPLOAD + "\" readonly=\"readonly\">" + document_text +
+ // "</textarea>");
+ // writer.println("<br/>");
+ //
+ // writer.println("<input class=\"ip\" type=\"submit\" value=\"Signieren...\"
+ // />");
+ //
+ // writer.println("</div>");
+ // writer.println("</form>");
+ // writer.println("</div>");
+ //
+ // writer.println("<a class=\"big\" href=\"/pdf-as/\">zurück</a>");
+ //
+ // writer.println("</div>");
+ // writer.println("</body>");
+ //
+ // writer.println("</html>");
+ // }
+
+ /**
+ * This class is just used to put the pdf byte array into the session.
+ *
+ * @author wprinz
+ */
+ protected class SignPreviewInfo implements Serializable
+ {
+ /**
+ * SVUID.
+ */
+ private static final long serialVersionUID = 3102824040163616332L;
+
+ public byte[] pdf = null;
+
+ public String mode = null;
+ }
+
+ /**
+ * Formats the file name so that it is suitable for content disposition.
+ *
+ * @param file_name
+ * The file name.
+ * @return Returns the formatted file name.
+ */
+ public static String formatFileName(String file_name)
+ {
+ File file = new File(file_name);
+ String file_name_only = file.getName();
+ // the file_name contains \\ ==> remove them so Internet Explorer works
+ // correctly.
+ return file_name_only;
+ }
+
+ /**
+ * Formats the file name according to the SignResult.
+ *
+ * @param file_name
+ * The file name.
+ * @param sign_result
+ * The sign result.
+ * @return Returns the formatted file name.
+ */
+ public static String formatFileNameForSignResult(String file_name,
+ SignResult sign_result)
+ {
+ String output = file_name + "_signed";
+ if (sign_result.getMimeType().equals(DetachedSignator_1_0_0.MIME_TYPE))
+ {
+ output += ".xml";
+ }
+ else
+ {
+ output += ".pdf";
+ }
+
+ return output;
+ }
+
+ /**
+ * Returns the data in the SignResult with proper content disposition.
+ *
+ * @param si
+ * SessionInformation.
+ * @param response
+ * The servlet response.
+ * @throws IOException
+ * The IO Exception.
+ */
+ public static void returnSignResponse(SessionInformation si,
+ HttpServletResponse response) throws IOException
+ {
+ SignResult sign_result = si.sign_result;
+
+ String file_name = formatFileNameForSignResult(si.filename, sign_result);
+
+ // The name parameter is actually deprecated in favour of Content-Disposition filename
+ // Unfortunately Acrobat reader does recognize neither of these parameters
+ // with its inline save-as. It always takes the page name.
+ response.setContentType(sign_result.getMimeType() + "; name=\"" + file_name + "\"");
+ if (si.download_inline)
+ {
+ response.addHeader("Content-Disposition", "inline; filename=\"" + file_name + "\"");
+ }
+ else
+ {
+ response.addHeader("Content-Disposition", "attachment; filename=\"" + file_name + "\"");
+ }
+ response.getOutputStream().write(sign_result.getData());
+
+ }
+} \ No newline at end of file
diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/web/SignPreview.java b/src/main/java/at/knowcenter/wag/egov/egiz/web/SignPreview.java
new file mode 100644
index 0000000..1b32bdf
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/egov/egiz/web/SignPreview.java
@@ -0,0 +1,105 @@
+/**
+ * <copyright> Copyright (c) 2006 by Know-Center, Graz, Austria </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+ * NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
+ * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES.
+ *
+ * $Id: SignPreview.java,v 1.2 2006/10/11 07:39:13 wprinz Exp $
+ */
+package at.knowcenter.wag.egov.egiz.web;
+
+import java.io.IOException;
+
+import javax.servlet.RequestDispatcher;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+
+import at.knowcenter.wag.egov.egiz.exceptions.ErrorCodeException;
+import at.knowcenter.wag.egov.egiz.exceptions.PresentableException;
+
+/**
+ * @author wprinz
+ */
+public class SignPreview extends HttpServlet
+{
+
+ /**
+ * SVUID.
+ */
+ private static final long serialVersionUID = -8818532511322299998L;
+
+ protected void dispatch(HttpServletRequest request,
+ HttpServletResponse response, String resource) throws ServletException, IOException
+ {
+ response.setContentType("text/html");
+ response.setCharacterEncoding("UTF-8");
+
+ RequestDispatcher disp = getServletContext().getRequestDispatcher(resource);
+ disp.forward(request, response);
+ }
+
+ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+ {
+ SessionInformation si = null;
+ HttpSession session = null;
+ try
+ {
+ session = request.getSession(false);
+ // String session_id_string = request.getParameter("session");
+ if (session == null)
+ {
+ throw new ErrorCodeException(600, "The session is missing.");
+ }
+
+ si = (SessionInformation) session.getAttribute(SessionAttributes.ATTRIBUTE_SESSION_INFORMATION);
+ // long session_id = Long.parseLong(session_id_string);
+ // si = SessionTable.get(session_id);
+ if (si == null)
+ {
+ throw new ErrorCodeException(600, "The session is not found or is no longer valid.");
+ }
+
+ }
+ catch (PresentableException e)
+ {
+ e.printStackTrace();
+ Sign.prepareDispatchToErrorPage(e, request);
+ dispatch(request, response, "/jsp/error.jsp");
+
+ return;
+ }
+
+ try
+ {
+ String preview = request.getParameter(FormFields.FIELD_PREVIEW);
+ if (preview != null && preview.equals(FormFields.VALUE_TRUE))
+ {
+ response.setContentType("application/pdf");
+ response.getOutputStream().write(si.iui.signed_pdf);
+ return;
+ }
+ else
+ {
+ Sign.finishSign(si, request, response, getServletContext());
+ }
+ }
+ catch (PresentableException e)
+ {
+ e.printStackTrace();
+ Sign.prepareDispatchToErrorPage(e, request);
+ dispatch(request, response, "/jsp/error.jsp");
+ }
+ }
+}
diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/web/Verify.java b/src/main/java/at/knowcenter/wag/egov/egiz/web/Verify.java
new file mode 100644
index 0000000..a8a5a5b
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/egov/egiz/web/Verify.java
@@ -0,0 +1,285 @@
+/*
+ * <copyright> Copyright (c) 2006 by Know-Center, Graz, Austria </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+ * NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
+ * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES.
+ *
+ * $Id: Verify.java,v 1.7 2006/10/11 07:39:13 wprinz Exp $
+ */
+package at.knowcenter.wag.egov.egiz.web;
+
+import java.io.IOException;
+import java.util.Iterator;
+import java.util.List;
+
+import javax.servlet.RequestDispatcher;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.commons.fileupload.FileItem;
+import org.apache.commons.fileupload.FileUploadException;
+import org.apache.commons.fileupload.disk.DiskFileItemFactory;
+import org.apache.commons.fileupload.servlet.ServletFileUpload;
+import org.apache.log4j.Logger;
+
+import at.knowcenter.wag.egov.egiz.PdfAS;
+import at.knowcenter.wag.egov.egiz.cfg.ConfigLogger;
+import at.knowcenter.wag.egov.egiz.cfg.SettingsReader;
+import at.knowcenter.wag.egov.egiz.exceptions.PDFDocumentException;
+import at.knowcenter.wag.egov.egiz.exceptions.PresentableException;
+import at.knowcenter.wag.egov.egiz.framework.VerificationFilter;
+import at.knowcenter.wag.egov.egiz.sig.ConnectorFactory;
+
+/**
+ * This method is the verify servlet for the pdf-as web application. It takes
+ * get and post requests fill out jsp templates and give the user feedback about
+ * the results of the verify process.
+ *
+ * @author wlackner
+ * @author wprinz
+ */
+public class Verify extends HttpServlet
+{
+
+ /**
+ * SVUID.
+ */
+ private static final long serialVersionUID = 309198792358636766L;
+
+ /**
+ * The logger.
+ */
+ private static final Logger logger_ = ConfigLogger.getLogger(Verify.class);
+
+ protected void dispatch(HttpServletRequest request,
+ HttpServletResponse response, String resource) throws ServletException, IOException
+ {
+ response.setContentType("text/html");
+ response.setCharacterEncoding("UTF-8");
+
+ RequestDispatcher disp = getServletContext().getRequestDispatcher(resource);
+ disp.forward(request, response);
+ }
+
+ protected void dispatchToResults(List results, HttpServletRequest request,
+ HttpServletResponse response) throws ServletException, IOException
+ {
+ request.setAttribute("results", results);
+ dispatch(request, response, "/jsp/results.jsp");
+ }
+
+
+ public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+ {
+ dispatch(request, response, "/jsp/verifyupload.jsp");
+ }
+
+ public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+ {
+
+ DiskFileItemFactory fif = new DiskFileItemFactory();
+ fif.setRepository(SettingsReader.getTemporaryDirectory());
+ ServletFileUpload sfu = new ServletFileUpload(fif);
+
+ try
+ {
+
+ List items = sfu.parseRequest(request);
+
+ FileItem upload_fi = null;
+ FileItem connector_fi = null;
+// FileItem mode_fi = null;
+ FileItem preview_fi = null;
+
+ {
+ Iterator it = items.iterator();
+ while (it.hasNext())
+ {
+ FileItem item = (FileItem) it.next();
+ logger_.debug("item = " + item.getFieldName());
+
+ if (item.isFormField())
+ {
+ byte[] item_data = item.get();
+ String item_string = new String(item_data, "UTF-8");
+ logger_.debug(" form field string = " + item_string);
+ }
+ else
+ {
+ logger_.debug(" filename = " + item.getName());
+ logger_.debug(" filesize = " + item.getSize());
+ }
+
+ if (item.getFieldName().equals(FormFields.FIELD_UPLOAD))
+ {
+ upload_fi = item;
+ continue;
+ }
+
+ if (item.getFieldName().equals(FormFields.FIELD_CONNECTOR))
+ {
+ connector_fi = item;
+ continue;
+ }
+
+// if (item.getFieldName().equals(FormFields.FIELD_MODE))
+// {
+// mode_fi = item;
+// continue;
+// }
+
+ if (item.getFieldName().equals(FormFields.FIELD_PREVIEW))
+ {
+ preview_fi = item;
+ continue;
+ }
+
+ throw new ServletException("unrecognized POST data.");
+ }
+ }
+
+ if (upload_fi == null || connector_fi == null || /*mode_fi == null ||*/ preview_fi == null)
+ {
+ throw new ServletException("Unsufficient data provided in request.");
+ }
+
+ String connector = connector_fi.getString("UTF-8");
+
+// String mode = mode_fi.getString("UTF-8");
+// if (!mode.equals(FormFields.VALUE_MODE_BINARY) && !mode.equals(FormFields.VALUE_MODE_TEXTUAL))
+// {
+// throw new ServletException("The mode '" + mode + "' is unrecognized.");
+// }
+
+ String preview_str = preview_fi.getString("UTF-8");
+ if (!preview_str.equals(FormFields.VALUE_TRUE) && !preview_str.equals(FormFields.VALUE_FALSE))
+ {
+ throw new ServletException("The preview '" + preview_str + "' is unrecognized.");
+ }
+ boolean preview = false;
+ if (preview_str.equals(FormFields.VALUE_TRUE))
+ {
+ preview = true;
+ }
+
+ // process the request
+ logger_.debug("file content type =" + upload_fi.getContentType());
+ logger_.debug("file size = " + upload_fi.getSize());
+ if (upload_fi.getSize() <= 0)
+ {
+ throw new PDFDocumentException(250, "The document is empty.");
+ }
+ byte[] document_bytes = upload_fi.get();
+
+ VerificationFilter vf = new VerificationFilter();
+ List signature_holders = null;
+
+ String doc_file_name = upload_fi.getName();
+ String extension = extractExtension(doc_file_name);
+
+ String raw_text = null;
+ if (doc_file_name == null || (extension != null && extension.equals("txt")))
+ {
+ raw_text = new String(document_bytes, "UTF-8");
+ signature_holders = vf.extractSignaturesFromPlainText(raw_text);
+ }
+ else
+ {
+ signature_holders = vf.extractSignaturesFromPdf(document_bytes);
+ }
+
+ if (signature_holders.size() == 0)
+ {
+ throw new PDFDocumentException(206, "PDF document not signed.");
+ }
+
+ if (preview)
+ {
+ SessionInformation si = new SessionInformation();
+ si.application = "verify";
+ si.connector = connector;
+ si.signature_holders = signature_holders;
+ request.getSession().setAttribute(SessionAttributes.ATTRIBUTE_SESSION_INFORMATION, si);
+
+ dispatch(request, response, "/jsp/verifylist.jsp");
+ //VerifyPreview.formatPreview(signature_holders, connector, request, response);
+ }
+ else
+ {
+ if (ConnectorFactory.isConnectorLocal(connector))
+ {
+ SessionInformation si = new SessionInformation(); //SessionTable.generateSessionInformationObject();
+ si.connector = connector;
+ si.application = "verify";
+ si.mode = null;
+ si.pdf = null;
+ si.type = null;
+ si.user_name = null;
+ si.user_password = null;
+
+ si.signature_holders = signature_holders;
+
+ LocalRequestHelper.processLocalVerify(si, si.signature_holders, request, response);
+ dispatch(request, response, LocalRequestHelper.LOCAL_CONNECTION_PAGE_JSP);
+ return;
+ }
+
+ List results = PdfAS.verifySignatureHolders(signature_holders, connector);
+ dispatchToResults(results, request, response);
+ }
+
+ }
+ catch (FileUploadException e)
+ {
+ request.setAttribute("error", "Fehler beim Upload der Daten");
+ request.setAttribute("cause", "Beim Upload der Daten ist ein Fehler aufgetreten.");
+ dispatch(request, response, "/jsp/error.jsp");
+ }
+ catch (PresentableException e)
+ {
+ e.printStackTrace();
+ Sign.prepareDispatchToErrorPage(e, request);
+ dispatch(request, response, "/jsp/error.jsp");
+ }
+
+ }
+
+ /**
+ * Extracts the extension from a file name string.
+ *
+ * <p>
+ * The extension of a file name is whatever text follows the last '.'.
+ * </p>
+ *
+ * @param file_name
+ * The file name.
+ * @return Returns the extension. If the file name ends with the '.', then an
+ * empty string is returned. If the file name doesn't contain any '.'
+ * or file_name is null, null is returned.
+ */
+ public static String extractExtension(String file_name)
+ {
+ if (file_name == null)
+ {
+ return null;
+ }
+
+ int dot_index = file_name.lastIndexOf('.');
+ if (dot_index < 0)
+ {
+ return null;
+ }
+ return file_name.substring(dot_index + 1);
+ }
+} \ No newline at end of file
diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/web/VerifyPreview.java b/src/main/java/at/knowcenter/wag/egov/egiz/web/VerifyPreview.java
new file mode 100644
index 0000000..c39fd91
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/egov/egiz/web/VerifyPreview.java
@@ -0,0 +1,704 @@
+/**
+ * <copyright> Copyright (c) 2006 by Know-Center, Graz, Austria </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+ * NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
+ * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES.
+ *
+ * $Id: VerifyPreview.java,v 1.4 2006/10/11 07:39:13 wprinz Exp $
+ */
+package at.knowcenter.wag.egov.egiz.web;
+
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import javax.servlet.RequestDispatcher;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+
+import org.apache.commons.fileupload.FileItem;
+import org.apache.commons.fileupload.FileUploadException;
+import org.apache.commons.fileupload.disk.DiskFileItemFactory;
+import org.apache.commons.fileupload.servlet.ServletFileUpload;
+import org.apache.log4j.Logger;
+
+import at.knowcenter.wag.egov.egiz.PdfAS;
+import at.knowcenter.wag.egov.egiz.PdfASID;
+import at.knowcenter.wag.egov.egiz.cfg.ConfigLogger;
+import at.knowcenter.wag.egov.egiz.cfg.SettingsReader;
+import at.knowcenter.wag.egov.egiz.exceptions.ErrorCodeException;
+import at.knowcenter.wag.egov.egiz.exceptions.InvalidIDException;
+import at.knowcenter.wag.egov.egiz.exceptions.PresentableException;
+import at.knowcenter.wag.egov.egiz.exceptions.SignatureException;
+import at.knowcenter.wag.egov.egiz.pdf.BinarySignatureHolder;
+import at.knowcenter.wag.egov.egiz.pdf.SignatureHolder;
+import at.knowcenter.wag.egov.egiz.pdf.TextualSignatureHolder;
+import at.knowcenter.wag.egov.egiz.sig.ConnectorFactory;
+import at.knowcenter.wag.egov.egiz.sig.SignatureEntry;
+import at.knowcenter.wag.egov.egiz.sig.SignatureObject;
+import at.knowcenter.wag.egov.egiz.sig.SignatureTypes;
+
+/**
+ * @author wprinz
+ */
+public class VerifyPreview extends HttpServlet
+{
+ /**
+ * SVUID.
+ */
+ private static final long serialVersionUID = 6954343542890239109L;
+
+ /**
+ * The logger.
+ */
+ private static final Logger logger_ = ConfigLogger.getLogger(VerifyPreview.class);
+
+ protected void dispatch(HttpServletRequest request,
+ HttpServletResponse response, String resource) throws ServletException, IOException
+ {
+ response.setContentType("text/html");
+ response.setCharacterEncoding("UTF-8");
+
+ RequestDispatcher disp = getServletContext().getRequestDispatcher(resource);
+ disp.forward(request, response);
+ }
+
+ protected static String generateNamePrefix(int num)
+ {
+ return SIG_INPUT_PREFIX + num + "_";
+ }
+
+ // public static void formatPreview(List signature_holders, String connector,
+ // HttpServletRequest request, HttpServletResponse response) throws
+ // ServletException, IOException
+ // {
+ // response.setContentType("text/html");
+ // response.setCharacterEncoding("UTF-8");
+ //
+ // PrintWriter writer = response.getWriter();
+ //
+ // writer.println("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0
+ // Transitional//EN\"
+ // \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">");
+ // writer.println("<html>");
+ // writer.println("<head>");
+ // writer.println("<meta http-equiv=\"content-type\" content=\"text/html;
+ // charset=UTF-8\" />");
+ // writer.println("<title>PDF-AS Amtssignaturen Vorschau</title>");
+ // writer.println("<link rel=\"stylesheet\" type=\"text/css\"
+ // href=\"/pdf-as/css/styles.css\" />");
+ //
+ // writer.println("<script type=\"text/javascript\">");
+ // writer.println(" function initSigValues()");
+ // writer.println(" {");
+ // for (int num = 0; num < signature_holders.size(); num++)
+ // {
+ // SignatureHolder signature_holder = (SignatureHolder)
+ // signature_holders.get(num);
+ // String name_prefix = generateNamePrefix(num);
+ // String java_script =
+ // renderRequiredKeysJavaScript(signature_holder.signature_object,
+ // name_prefix);
+ // writer.println(java_script);
+ //
+ // }
+ // writer.println(" }");
+ // writer.println("</script>");
+ //
+ // writer.println("</head>");
+ //
+ // writer.println("<body onload=\"initSigValues()\">");
+ // writer.println("<div>");
+ //
+ // writer.println("<h1>PDF-AS Amtssignaturen</h1>");
+ //
+ // writer.println("<div id=\"nav\">");
+ // writer.println("<div id=\"nh\">Vorschau: Dokument Pr&uuml;fen</div>");
+ // writer.println("<form action=\"" +
+ // response.encodeURL(request.getContextPath() + "/VerifyPreview") + "\"");
+ // writer.println(" name=\"submitform\"");
+ // writer.println(" enctype=\"multipart/form-data\"");
+ // writer.println(" accept-charset=\"UTF-8\"");
+ // writer.println(" method=\"post\">");
+ // writer.println("<div id=\"ct\">");
+ //
+ // // writer.println("<input type=\"hidden\" name=\"" + FormFields.FIELD_MODE
+ // +
+ // // "\" value=\"" + mode + "\" />");
+ // writer.println("<input type=\"hidden\" name=\"" +
+ // FormFields.FIELD_CONNECTOR + "\" value=\"" + connector + "\" />");
+ //
+ // // if (mode.equals(FormFields.VALUE_MODE_TEXTUAL))
+ // // {
+ // // String raw_document_text = ((SignatureHolder)
+ // // signature_holders.get(0)).signed_text;
+ // // writer.println("<textarea class=\"pr\" cols=\"80\" rows=\"14\" name=\""
+ // +
+ // // FormFields.FIELD_RAW_DOCUMENT_TEXT + "\">" + raw_document_text +
+ // // "</textarea>");
+ // // writer.println("<br/>");
+ // // }
+ //
+ // if (signature_holders.size() == 1)
+ // {
+ // writer.println("<div id=\"sh\">Rekonstruktion der Signaturmarke:</div>");
+ // }
+ // else
+ // {
+ // writer.println("<div id=\"sh\">Rekonstruktion der Signaturmarken:</div>");
+ // }
+ //
+ // // this special <div> is only needed because internet explorer doesn't
+ // // format the width of the
+ // // tables right when the div is not given.
+ // // probably this is because the table then tries to calculate the relative
+ // // width from the surrounding form object.
+ // writer.println("<div class=\"sigprevtablediv\">");
+ // int num = 0;
+ // Iterator it = signature_holders.iterator();
+ // while (it.hasNext())
+ // {
+ // SignatureHolder signature_holder = (SignatureHolder) it.next();
+ //
+ // String name_prefix = generateNamePrefix(num);
+ //
+ // String input_key = name_prefix + FormFields.FIELD_RAW_DOCUMENT_TEXT;
+ // if (signature_holder.signature_object.isBinary())
+ // {
+ // writer.println("<input type=\"hidden\" name=\"" + input_key + "\" value=\""
+ // + signature_holder.signed_text + "\" />");
+ // }
+ // else
+ // {
+ // writer.println("<div>");
+ // writer.println("<textarea class=\"pr\" cols=\"80\" rows=\"14\" name=\"" +
+ // input_key + "\">" + signature_holder.signed_text + "</textarea>");
+ // writer.println("</div>");
+ // }
+ //
+ // String html = renderRequiredKeys(signature_holder.signature_object,
+ // name_prefix, false);
+ // writer.println(html);
+ //
+ // writer.println("<input class=\"ip\" type=\"submit\" value=\"Werte
+ // &uuml;bernehmen und pr&uuml;fen...\" onclick=\"document.submitform." +
+ // FormFields.FIELD_VERIFY_WHICH + ".value='" + num + "'\" />");
+ //
+ // num++;
+ // }
+ // writer.println("</div>");
+ //
+ // writer.println("<input type=\"hidden\" name=\"" +
+ // FormFields.FIELD_VERIFY_WHICH + "\" value=\"xxx\" />");// +
+ // // FormFields.VALUE_VERIFY_WHICH_ALL
+ // // +
+ // // "\"
+ // // />");
+ // writer.println("<input class=\"ip\" type=\"submit\" value=\"Alle
+ // pr&uuml;fen...\" onclick=\"document.submitform." +
+ // FormFields.FIELD_VERIFY_WHICH + ".value='" +
+ // FormFields.VALUE_VERIFY_WHICH_ALL + "'\" />");
+ //
+ // writer.println("</div>");
+ // writer.println("</form>");
+ // writer.println("</div>");
+ //
+ // writer.println("<a class=\"big\" href=\"/pdf-as/\">zurück</a>");
+ //
+ // writer.println("</div>");
+ // writer.println("</body>");
+ //
+ // writer.println("</html>");
+ //
+ // }
+
+ public static String renderRequiredKeysJavaScript(
+ SignatureObject signature_object, String name_prefix)
+ {
+ StringWriter sw = new StringWriter();
+ PrintWriter writer = new PrintWriter(sw);
+
+ String[] rkeys = SignatureTypes.REQUIRED_SIG_KEYS;
+
+ for (int key_idx = 0; key_idx < rkeys.length; key_idx++)
+ {
+ String key = rkeys[key_idx];
+ SignatureEntry entry = signature_object.getSigEntry(key);
+ String value = entry.getValue();
+ if (SignatureTypes.SIG_ID.equals(key) && value == null)
+ {
+ continue;
+ }
+
+ value = value.replaceAll("\\s", " ");
+ value = value.replaceAll("\\\"", "\\\"");
+
+ String input_key = name_prefix + key;
+
+ writer.println(" document.submitform." + input_key + ".value = \"" + value + "\";");
+ }
+
+ return sw.toString();
+ }
+
+ public static String renderRequiredKeys(SignatureObject signature_object,
+ String name_prefix, boolean write_value)
+ {
+ StringWriter sw = new StringWriter();
+ PrintWriter writer = new PrintWriter(sw);
+
+ writer.println("<table cellpadding=\"1\" cellspacing=\"1\" class=\"st\">");
+
+ String[] rkeys = SignatureTypes.REQUIRED_SIG_KEYS;
+
+ for (int key_idx = 0; key_idx < rkeys.length; key_idx++)
+ {
+ String key = rkeys[key_idx];
+ SignatureEntry entry = signature_object.getSigEntry(key);
+ String caption = entry.getCaption();
+ String value = entry.getValue();
+ if (SignatureTypes.SIG_ID.equals(key) && value == null)
+ {
+ continue;
+ }
+
+ writer.println(" <tr>");
+ writer.println(" <td width=\"10%\"><span class=\"sca\">" + caption + ":</span></td>");
+ writer.println(" <td width=\"90%\">");
+
+ value = value.replaceAll("\\s", " ");
+ value = value.replaceAll("\\\"", "\\\"");
+
+ String input_key = name_prefix + key;
+ writer.println(" <input class=\"sin\" name=\"" + input_key + "\" type=\"text\" value=\"" + (write_value ? value : "wird automatisch ausgefüllt") + "\" />");
+
+ writer.println(" </td>");
+ writer.println(" </tr>");
+ }
+ writer.println("</table>");
+
+ return sw.toString();
+ }
+
+ public static String renderRequiredKeysText(SignatureObject signature_object)
+ {
+ StringWriter sw = new StringWriter();
+ PrintWriter writer = new PrintWriter(sw);
+
+ String title = "alte PDF-AS Signatur";
+ try
+ {
+ PdfASID kz = signature_object.getKZ();
+ if (kz != null)
+ {
+ title = kz.toString();
+ }
+ }
+ catch (InvalidIDException e)
+ {
+ e.printStackTrace();
+ }
+ writer.println("<div class=\"listtype\">Signatur: " + title + "</div>");
+ writer.println("<table cellpadding=\"1\" cellspacing=\"1\" class=\"listtable\">");
+
+ // just render useful information
+ String[] rkeys = { SignatureTypes.SIG_DATE, SignatureTypes.SIG_ISSUER,
+ SignatureTypes.SIG_NUMBER }; // SignatureTypes.REQUIRED_SIG_KEYS;
+
+ for (int key_idx = 0; key_idx < rkeys.length; key_idx++)
+ {
+ String key = rkeys[key_idx];
+ SignatureEntry entry = signature_object.getSigEntry(key);
+ String caption = entry.getCaption();
+ String value = entry.getValue();
+ if (SignatureTypes.SIG_ID.equals(key) && value == null)
+ {
+ continue;
+ }
+
+ writer.println(" <tr>");
+ writer.println(" <td width=\"10%\">" + caption + ":</td>");
+ writer.println(" <td width=\"90%\">");
+
+ value = value.replaceAll("\\s", " ");
+ value = value.replaceAll("\\\"", "\\\"");
+
+ writer.println(" " + value);
+
+ writer.println(" </td>");
+ writer.println(" </tr>");
+ }
+ writer.println("</table>");
+
+ return sw.toString();
+ }
+
+ protected void dispatchToResults(List results, HttpServletRequest request,
+ HttpServletResponse response, boolean backbutton) throws ServletException, IOException
+ {
+ request.setAttribute("results", results);
+ request.setAttribute("backbutton", backbutton ? "true" : "false");
+ dispatch(request, response, "/jsp/results.jsp");
+ }
+
+ // public static void formatVerifyResults(List results,
+ // HttpServletResponse response) throws IOException, SettingNotFoundException
+ // {
+ // response.setContentType("text/html");
+ // response.setCharacterEncoding("UTF-8");
+ //
+ // PrintWriter writer = response.getWriter();
+ //
+ // writer.println("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0
+ // Transitional//EN\"
+ // \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">");
+ // writer.println("<html>");
+ // writer.println("<head>");
+ // writer.println("<meta http-equiv=\"content-type\" content=\"text/html;
+ // charset=UTF-8\" />");
+ // writer.println("<title>PDF-AS Amtssignaturen Resultat</title>");
+ // writer.println("<link rel=\"stylesheet\" type=\"text/css\"
+ // href=\"/pdf-as/css/styles.css\" />");
+ // writer.println("</head>");
+ //
+ // writer.println("<body>");
+ // writer.println("<div>");
+ //
+ // writer.println("<h1>PDF-AS Amtssignaturen</h1>");
+ //
+ // writer.println("<div id=\"nav\">");
+ // writer.println("<div id=\"nh\">Resultat</div>");
+ // writer.println("<div id=\"res\">");
+ //
+ // Iterator it = results.iterator();
+ // while (it.hasNext())
+ // {
+ // SignatureResponse result = (SignatureResponse) it.next();
+ // formatSignatureResponse(result, writer);
+ //
+ // if (it.hasNext())
+ // {
+ // writer.println("<br />");
+ // }
+ // }
+ //
+ // writer.println("</div>");
+ // writer.println("</div>");
+ //
+ // writer.println("<a class=\"big\" href=\"/pdf-as/\">zurück</a>");
+ //
+ // writer.println("</div>");
+ // writer.println("</body>");
+ //
+ // writer.println("</html>");
+ //
+ // }
+ //
+ // public static void formatSignatureResponse(SignatureResponse result,
+ // PrintWriter writer) throws SettingNotFoundException
+ // {
+ // writer.println("<fieldset><legend><b>Zertifikat</b></legend>");
+ // writer.println("<table class=\"srt\">");
+ // writer.println(" <tr><td>Signator:</td><td class=\"srtd\">" +
+ // result.getX509SubjectName() + "</td></tr>");
+ // writer.println(" <tr><td>Aussteller:</td><td class=\"srtd\">" +
+ // result.getX509IssuerName() + "</td></tr>");
+ // writer.println(" <tr><td>Seriennummer:</td><td class=\"srtd\">" +
+ // result.getX509SerialNumber() + "</td></tr>");
+ // List public_properties = result.getPublicProperties();
+ // Iterator it = public_properties.iterator();
+ // while (it.hasNext())
+ // {
+ // String public_property = (String) it.next();
+ // writer.println(" <tr><td> Eigenschaft:</td><td class=\"srtd\">" +
+ // public_property + "</td></tr>");
+ // }
+ //
+ // writer.println(" <tr><td>Zertifikat:</td><td class=\"srcc_" +
+ // result.getCertificateCheckCode() + "\">" + result.getCertificateCheckInfo()
+ // + "</td></tr>");
+ //
+ // writer.println("</table>");
+ // writer.println("</fieldset>");
+ // writer.println("<fieldset><legend><b>Signatur-Check</b></legend>");
+ // writer.println("<div class=\"srsc_" + result.getSignatureCheckCode() +
+ // "\">" + result.getSignatureCheckInfo() + "</div>");
+ // writer.println("</fieldset>");
+ // writer.println("<fieldset><legend><b>Manifest-Check</b></legend>");
+ // writer.println("<div class=\"srmc_" +
+ // result.getSignatureManifestCheckCode() + "\">" +
+ // result.getSignatureManifestCheckInfo() + "</div>");
+ // writer.println("</fieldset>");
+ // }
+
+ /**
+ * Form field name prefix for signature table names
+ */
+ public static final String SIG_INPUT_PREFIX = "sig_inp_";
+
+ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+ {
+ SessionInformation si = null;
+ HttpSession session = null;
+ try
+ {
+ session = request.getSession(false);
+ // String session_id_string = request.getParameter("session");
+ if (session == null)
+ {
+ throw new ErrorCodeException(600, "The session is missing.");
+ }
+
+ si = (SessionInformation) session.getAttribute(SessionAttributes.ATTRIBUTE_SESSION_INFORMATION);
+ // long session_id = Long.parseLong(session_id_string);
+ // si = SessionTable.get(session_id);
+ if (si == null)
+ {
+ throw new ErrorCodeException(600, "The session is not found or is no longer valid.");
+ }
+
+ }
+ catch (PresentableException e)
+ {
+ e.printStackTrace();
+ Sign.prepareDispatchToErrorPage(e, request);
+ dispatch(request, response, "/jsp/error.jsp");
+
+ return;
+ }
+
+ try
+ {
+
+ int verify_which = -1;
+ boolean preview = false;
+
+ {
+ String str_verify_which = request.getParameter(FormFields.FIELD_VERIFY_WHICH);
+ logger_.debug("verify_which = " + str_verify_which);
+ if (str_verify_which.equals(FormFields.VALUE_VERIFY_WHICH_ALL))
+ {
+ verify_which = -1;
+ }
+ else
+ {
+ verify_which = Integer.parseInt(str_verify_which);
+ }
+ logger_.debug("verify_which = " + verify_which);
+ }
+
+ {
+ String preview_string = request.getParameter(FormFields.FIELD_PREVIEW);
+ if (preview_string.equals("true"))
+ {
+ preview = true;
+ }
+ }
+
+ List holders_to_verify = si.signature_holders;
+
+ if (verify_which >= 0)
+ {
+ if (verify_which >= si.signature_holders.size())
+ {
+ throw new SignatureException(312, "The selected signature to be verified doesn't exist.");
+ }
+
+ SignatureHolder holder = (SignatureHolder) si.signature_holders.get(verify_which);
+ holders_to_verify = new ArrayList();
+ holders_to_verify.add(holder);
+
+ if (preview == true)
+ {
+ if (holder instanceof BinarySignatureHolder)
+ {
+ BinarySignatureHolder binary_holder = (BinarySignatureHolder) holder;
+ response.setContentType("application/pdf");
+ response.getOutputStream().write(binary_holder.getSignedPdf(), 0, binary_holder.getSignedPdfLength());
+ }
+ else
+ // if (holder.getSignatureObject().isTextual())
+ {
+ // formatPreview(holders_to_verify, si.connector, request,
+ // response);
+ request.setAttribute(FormFields.FIELD_VERIFY_WHICH, new Integer(verify_which));
+ dispatch(request, response, "/jsp/verifypreview.jsp");
+ }
+
+ return;
+ }
+
+ }
+
+ if (ConnectorFactory.isConnectorLocal(si.connector))
+ {
+ LocalRequestHelper.processLocalVerify(si, holders_to_verify, request, response);
+ dispatch(request, response, LocalRequestHelper.LOCAL_CONNECTION_PAGE_JSP);
+ return;
+ }
+
+ List results = PdfAS.verifySignatureHolders(holders_to_verify, si.connector);
+ boolean backbutton = true;
+ if (verify_which >= 0)
+ {
+ backbutton = false;
+ }
+ dispatchToResults(results, request, response, backbutton);
+
+ }
+ catch (PresentableException e)
+ {
+ e.printStackTrace();
+ Sign.prepareDispatchToErrorPage(e, request);
+ dispatch(request, response, "/jsp/error.jsp");
+ }
+ }
+
+ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+ {
+ SessionInformation si = null;
+ HttpSession session = null;
+ try
+ {
+ session = request.getSession(false);
+ // String session_id_string = request.getParameter("session");
+ if (session == null)
+ {
+ throw new ErrorCodeException(600, "The session is missing.");
+ }
+
+ si = (SessionInformation) session.getAttribute(SessionAttributes.ATTRIBUTE_SESSION_INFORMATION);
+ // long session_id = Long.parseLong(session_id_string);
+ // si = SessionTable.get(session_id);
+ if (si == null)
+ {
+ throw new ErrorCodeException(600, "The session is not found or is no longer valid.");
+ }
+
+ }
+ catch (PresentableException e)
+ {
+ e.printStackTrace();
+ Sign.prepareDispatchToErrorPage(e, request);
+ dispatch(request, response, "/jsp/error.jsp");
+
+ return;
+ }
+
+ DiskFileItemFactory fif = new DiskFileItemFactory();
+ fif.setRepository(SettingsReader.getTemporaryDirectory());
+ ServletFileUpload sfu = new ServletFileUpload(fif);
+
+ try
+ {
+ String text_to_be_verified = null;
+ SignatureObject signature_object = new SignatureObject();
+
+ String default_type = SettingsReader.getInstance().getValueFromKey(SignatureTypes.DEFAULT_TYPE);
+ signature_object.setSigType(default_type);
+ signature_object.initByType();
+
+ int verify_which = -1;
+ boolean verify = false;
+
+ List items = sfu.parseRequest(request);
+
+ Iterator it = items.iterator();
+ while (it.hasNext())
+ {
+ FileItem item = (FileItem) it.next();
+ logger_.debug("item = " + item.getFieldName());
+
+ if (item.getFieldName().equals(FormFields.FIELD_RAW_DOCUMENT_TEXT))
+ {
+ String raw_document_text = item.getString("UTF-8");
+ text_to_be_verified = PdfAS.normalizeText(raw_document_text);
+ continue;
+ }
+
+ if (item.getFieldName().equals(FormFields.FIELD_VERIFY_WHICH))
+ {
+ String which_str = item.getString("UTF-8");
+ verify_which = Integer.parseInt(which_str);
+ continue;
+ }
+
+ if (item.getFieldName().equals("verify"))
+ {
+ if (item.getString("UTF-8").equals("true"))
+ {
+ verify = true;
+ }
+ continue;
+ }
+
+ String key = item.getFieldName();
+ String value = item.getString("UTF-8");
+
+ signature_object.setSigValue(key, value);
+ logger_.debug("sig_obj_number" + key + " = " + value);
+ }
+
+ SignatureHolder new_holder = new TextualSignatureHolder(text_to_be_verified, signature_object);
+ si.signature_holders.set(verify_which, new_holder);
+
+ if (verify == false)
+ {
+ dispatch(request, response, "/dataok.html");
+ return;
+ }
+
+ List holders_to_verify = si.signature_holders;
+
+ if (verify_which >= 0)
+ {
+ if (verify_which >= si.signature_holders.size())
+ {
+ throw new SignatureException(312, "The selected signature to be verified doesn't exist.");
+ }
+
+ SignatureHolder holder = (SignatureHolder) si.signature_holders.get(verify_which);
+ holders_to_verify = new ArrayList();
+ holders_to_verify.add(holder);
+ }
+
+ if (ConnectorFactory.isConnectorLocal(si.connector))
+ {
+ LocalRequestHelper.processLocalVerify(si, holders_to_verify, request, response);
+ dispatch(request, response, LocalRequestHelper.LOCAL_CONNECTION_PAGE_JSP);
+ return;
+ }
+
+ List results = PdfAS.verifySignatureHolders(holders_to_verify, si.connector);
+ dispatchToResults(results, request, response, true);
+ }
+ catch (FileUploadException e)
+ {
+ request.setAttribute("error", "Fehler beim Upload der Daten");
+ request.setAttribute("cause", "Beim Upload der Daten ist ein Fehler aufgetreten.");
+ dispatch(request, response, "/jsp/error.jsp");
+ }
+ catch (PresentableException e)
+ {
+ e.printStackTrace();
+ Sign.prepareDispatchToErrorPage(e, request);
+ dispatch(request, response, "/jsp/error.jsp");
+ }
+
+ }
+}
diff --git a/src/main/java/at/knowcenter/wag/exactparser/ByteArrayUtils.java b/src/main/java/at/knowcenter/wag/exactparser/ByteArrayUtils.java
new file mode 100644
index 0000000..e6b32ec
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/exactparser/ByteArrayUtils.java
@@ -0,0 +1,140 @@
+/**
+ * <copyright> Copyright (c) 2006 by Know-Center, Graz, Austria </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+ * NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
+ * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES.
+ *
+ * $Id: ByteArrayUtils.java,v 1.1 2006/08/25 17:00:59 wprinz Exp $
+ */
+package at.knowcenter.wag.exactparser;
+
+import java.io.UnsupportedEncodingException;
+
+/**
+ * Abstract class that contains utility methods for handling byte arrays.
+ *
+ * @author wprinz
+ */
+public abstract class ByteArrayUtils {
+
+ public static final String BYTE_ARRAY_ENCODING = "ISO-8859-1";
+
+ /**
+ * Converts the byte array to a String.
+ *
+ * @param data
+ * The byte array.
+ * @return Returns the String.
+ * @throws UnsupportedEncodingException
+ * Forwarded exception
+ */
+ public static String convertByteArrayToString(final byte[] data) throws UnsupportedEncodingException {
+ return new String(data, BYTE_ARRAY_ENCODING);
+ }
+
+ /**
+ * Finds the first occurance of search in data starting to search from the
+ * given index.
+ *
+ * @param data
+ * The big array.
+ * @param index
+ * The index to start searching from.
+ * @param search
+ * The sought array.
+ * @return Returns the index of the found occurence or -1 if nothing was
+ * found.
+ */
+ public static int indexOf(final byte[] data, final int index, final byte[] search) {
+ for (int i = index; i <= data.length - search.length; i++) {
+ if (compareByteArrays(data, i, search)) {
+ return i;
+ }
+ }
+ return -1;
+ }
+
+ /**
+ * Finds the last occurance of the array.
+ *
+ * @param data
+ * The source array to be searched.
+ * @param search
+ * The sought array.
+ * @return Returns the index of the last occurance - or -1 if nothing was
+ * found.
+ */
+ public static int lastIndexOf(final byte[] data, byte[] search) {
+ for (int index = data.length - search.length; index >= 0; index--) {
+ if (compareByteArrays(data, index, search)) {
+ return index;
+ }
+ }
+ return -1;
+ }
+
+ /**
+ * Compares the two byte arrays for equality.
+ *
+ * @param data
+ * The source array.
+ * @param index
+ * In index into the source array marking where the comparison should
+ * start.
+ * @param search
+ * The sought array.
+ * @return Returns true if the first search.length bytes of data+index and
+ * search match exactly. Returns false otherwise.
+ */
+ public static boolean compareByteArrays(final byte[] data, final int index, byte[] search) {
+ if (index < 0 || index >= data.length) {
+ throw new IndexOutOfBoundsException("The index " + index + " is out of bounds");
+ }
+
+ if (search.length > data.length) {
+ return false;
+ }
+
+ if (search.length > data.length - index) {
+ return false;
+ }
+
+ for (int i = 0; i < search.length; i++) {
+ if (data[index + i] != search[i]) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ /**
+ * Checks, if the sought data byte is contained within the byte array.
+ *
+ * @param byte_array
+ * The byte array.
+ * @param data
+ * A data byte sought within the byte array.
+ * @return Returns true, if the data byte was found (at least once) in the
+ * byte array, false otherwise.
+ */
+ public static boolean contains(final byte[] byte_array, final byte data) {
+ for (int i = 0; i < byte_array.length; i++) {
+ byte b = byte_array[i];
+ if (b == data) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+}
diff --git a/src/main/java/at/knowcenter/wag/exactparser/ParseDocument.java b/src/main/java/at/knowcenter/wag/exactparser/ParseDocument.java
new file mode 100644
index 0000000..a1ad10d
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/exactparser/ParseDocument.java
@@ -0,0 +1,265 @@
+/**
+ * <copyright> Copyright (c) 2006 by Know-Center, Graz, Austria </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+ * NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
+ * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES.
+ *
+ * $Id: ParseDocument.java,v 1.1 2006/08/25 17:00:59 wprinz Exp $
+ */
+package at.knowcenter.wag.exactparser;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import at.knowcenter.wag.exactparser.parsing.PDFUtils;
+import at.knowcenter.wag.exactparser.parsing.results.DictionaryParseResult;
+import at.knowcenter.wag.exactparser.parsing.results.FooterParseResult;
+import at.knowcenter.wag.exactparser.parsing.results.IndirectObjectReferenceParseResult;
+import at.knowcenter.wag.exactparser.parsing.results.NameParseResult;
+import at.knowcenter.wag.exactparser.parsing.results.NumberParseResult;
+import at.knowcenter.wag.exactparser.parsing.results.ObjectParseResult;
+import at.knowcenter.wag.exactparser.parsing.results.StartXRefParseResult;
+import at.knowcenter.wag.exactparser.parsing.results.TrailerParseResult;
+import at.knowcenter.wag.exactparser.parsing.results.XRefSectionParseResult;
+
+
+/**
+ * Test class.
+ * @author wprinz
+ */
+public class ParseDocument
+{
+
+ public static final String DOCUMENT = "C:/wprinz/temp.pdf";
+
+ public static final byte[] EGIZ_DICT_NAME = { 'E', 'G', 'I', 'Z', 'S', 'i',
+ 'g', 'D', 'i', 'c', 't' };
+
+ public static final byte[] EGIZ_ODS_NAME = { 'O', 'D', 'S' };
+
+ public static final byte[] EGIZ_XOBJ_NAME = { 'S', 'i', 'g', 'X', 'O', 'b',
+ 'j', 'e', 'c', 't' };
+
+ /**
+ * @param args
+ */
+ public static void main(String[] args)
+ {
+
+ try
+ {
+ File in = new File(DOCUMENT);
+ FileInputStream fis = new FileInputStream(in);
+ byte[] pdf = new byte[(int) in.length()];
+ fis.read(pdf);
+ fis.close();
+ fis = null;
+
+ List blocks = parseDocument(pdf);
+
+ Iterator it = blocks.iterator();
+ while (it.hasNext())
+ {
+ FooterParseResult bpr = (FooterParseResult) it.next();
+
+ System.out.print("block from " + bpr.start_index + " to " + bpr.next_index);
+
+ if (bpr.tpr.root != null)
+ {
+ int root_index = PDFUtils.getObjectOffsetFromXRefByIndirectObjectReference(bpr.xpr, bpr.tpr.root.ior);
+ ObjectParseResult root_opr = PDFUtils.parseObject(pdf, root_index);
+ DictionaryParseResult root_dpr = (DictionaryParseResult) root_opr.object;
+
+ int egiz_index = PDFUtils.indexOfName(pdf, root_dpr.names, EGIZ_DICT_NAME);
+ if (egiz_index >= 0)
+ {
+ System.out.print(" == EGIZDict");
+ }
+ }
+
+ System.out.println();
+ }
+
+ }
+ catch (IOException e)
+ {
+ e.printStackTrace();
+ }
+ }
+
+ public static List parseDocument(final byte[] pdf) throws IOException
+ {
+ //HeaderParseResult hpr = PDFUtils.parseHeader(pdf, 0);
+ //System.out.println("PDF-version = " + hpr.major + "." + hpr.minor);
+
+
+ List blocks = new ArrayList();
+
+ int last_start_xref = PDFUtils.findLastStartXRef(pdf);
+ StartXRefParseResult last_sxpr = PDFUtils.parseStartXRef(pdf, last_start_xref);
+ int xref_index = last_sxpr.xref_index;
+
+ for (;;)
+ {
+ FooterParseResult fpr = PDFUtils.parseFooter(pdf, xref_index);
+ blocks.add(0, fpr);
+
+ //System.out.println("tpr.has_predecessor = " + fpr.tpr.has_predecessor);
+ if (!fpr.tpr.has_predecessor)
+ {
+ // eventually parse the PDF header here.
+ break;
+ }
+
+ //System.out.println("tpr.prev = " + fpr.tpr.getPrev());
+
+ xref_index = fpr.tpr.getPrev();
+ }
+
+ return blocks;
+ }
+
+ // public static void parseEGIZ()
+ // {
+ //
+ // int root_index =
+ // PDFUtils.getObjectOffsetFromXRefByIndirectObjectReference(bpr.xpr,
+ // bpr.tpr.root.ior);
+ // ObjectParseResult root_opr = PDFUtils.parseObject(pdf, root_index);
+ // DictionaryParseResult root_dpr = (DictionaryParseResult) root_opr.object;
+ //
+ // int egiz_index = PDFUtils.indexOfName(pdf, root_dpr.names, EGIZ_DICT_NAME);
+ // if (egiz_index >= 0)
+ // {
+ // IndirectObjectReferenceParseResult egiz_iorpr =
+ // (IndirectObjectReferenceParseResult) root_dpr.values.get(egiz_index);
+ // System.out.println("EGIZ signature info at = " + egiz_iorpr);
+ //
+ // int egiz_dict_index =
+ // PDFUtils.getObjectOffsetFromXRefByIndirectObjectReference(bpr.xpr,
+ // egiz_iorpr.ior);
+ // ObjectParseResult opr = PDFUtils.parseObject(pdf, egiz_dict_index);
+ // DictionaryParseResult egiz_dict = (DictionaryParseResult) opr.object;
+ //
+ // for (int i = 0; i < egiz_dict.names.size(); i++)
+ // {
+ // NameParseResult npr = egiz_dict.names.get(i);
+ // int len = npr.next_index - npr.name_start_index;
+ // byte[] name = new byte[len];
+ // System.arraycopy(pdf, npr.name_start_index, name, 0, len);
+ // System.out.print(" " + new String(name, "US-ASCII") + " = ");
+ //
+ // System.out.println(egiz_dict.values.get(i));
+ // }
+ //
+ // // int key = PDFUtils.indexOfName(pdf, egiz_dict.names, new byte [] { 'K',
+ // // 'e', 'y'});
+ // // IndirectObjectReferenceParseResult key_iorpr =
+ // // (IndirectObjectReferenceParseResult) egiz_dict.values.get(key);
+ // // int key_offset =
+ // // PDFUtils.getObjectOffsetFromXRefByIndirectObjectReference(xpr,
+ // // key_iorpr.ior);
+ // // ObjectParseResult key_opr = PDFUtils.parseObject(pdf, key_offset);
+ // // StreamParseResult spr = (StreamParseResult) key_opr.object;
+ // // System.out.println(" key stream from " + spr.content_start_index + " to
+ // // " + spr.content_end_index);
+ // //
+ // // int data_len = spr.content_end_index - spr.content_start_index;
+ // // byte [] data = new byte[data_len];
+ // // System.arraycopy(pdf, spr.content_start_index, data, 0, data_len);
+ // // System.out.println(new String(data, "US-ASCII"));
+ //
+ // }
+ // else
+ // {
+ // System.out.println("No EGIZ block found.");
+ // }
+ //
+ // }
+
+ public static byte[] getOriginalDocument(final File file_name) throws IOException
+ {
+ FileInputStream fis = new FileInputStream(file_name);
+ byte[] pdf = new byte[(int) file_name.length()];
+ fis.read(pdf);
+ fis.close();
+ fis = null;
+
+ int last_start_xref = PDFUtils.findLastStartXRef(pdf);
+
+ StartXRefParseResult sxpr = PDFUtils.parseStartXRef(pdf, last_start_xref);
+
+ XRefSectionParseResult xpr = PDFUtils.parseXRefSection(pdf, sxpr.xref_index);
+
+ TrailerParseResult tpr = PDFUtils.parseTrailer(pdf, xpr.next_index);
+
+ System.out.println("tpr.info = " + tpr.info);
+ System.out.println("tpr.root = " + tpr.root);
+ System.out.println("tpr.size = " + tpr.size);
+
+ System.out.println("tpr.has_predecessor = " + tpr.has_predecessor);
+ if (tpr.has_predecessor)
+ {
+ System.out.println("tpr.prev = " + tpr.getPrev());
+ }
+
+ int root_index = PDFUtils.getObjectOffsetFromXRefByIndirectObjectReference(xpr, tpr.root.ior);
+ ObjectParseResult root_opr = PDFUtils.parseObject(pdf, root_index);
+ DictionaryParseResult root_dpr = (DictionaryParseResult) root_opr.object;
+
+ byte[] EGIZ_TYPE = new String("EGIZSigDict").getBytes("US-ASCII");
+ int egiz_index = PDFUtils.indexOfName(pdf, root_dpr.names, EGIZ_TYPE);
+ if (egiz_index >= 0)
+ {
+ System.out.println("The document is EGIZ-signed. ==> extract original document");
+
+ IndirectObjectReferenceParseResult egiz_iorpr = (IndirectObjectReferenceParseResult) root_dpr.values.get(egiz_index);
+ System.out.println("EGIZ signature info at = " + egiz_iorpr);
+
+ int egiz_dict_index = PDFUtils.getObjectOffsetFromXRefByIndirectObjectReference(xpr, egiz_iorpr.ior);
+ ObjectParseResult opr = PDFUtils.parseObject(pdf, egiz_dict_index);
+ DictionaryParseResult egiz_dict = (DictionaryParseResult) opr.object;
+
+ for (int i = 0; i < egiz_dict.names.size(); i++)
+ {
+ NameParseResult npr = (NameParseResult) egiz_dict.names.get(i);
+ int len = npr.next_index - npr.name_start_index;
+ byte[] name = new byte[len];
+ System.arraycopy(pdf, npr.name_start_index, name, 0, len);
+ System.out.print(" " + new String(name, "US-ASCII") + " = ");
+
+ System.out.println(egiz_dict.values.get(i));
+ }
+
+ // Original document size
+ int key = PDFUtils.indexOfName(pdf, egiz_dict.names, new byte[] { 'O',
+ 'D', 'S' });
+ NumberParseResult ods = (NumberParseResult) egiz_dict.values.get(key);
+
+ int original_document_size = ods.number;
+ System.out.println("Original Document Size = " + original_document_size);
+
+ byte[] original = new byte[original_document_size];
+ System.arraycopy(pdf, 0, original, 0, original_document_size);
+
+ return original;
+ }
+
+ System.out.println("No EGIZ block found. ==> the whold document is the original document");
+ return pdf;
+ }
+
+}
diff --git a/src/main/java/at/knowcenter/wag/exactparser/parsing/IndirectObjectReference.java b/src/main/java/at/knowcenter/wag/exactparser/parsing/IndirectObjectReference.java
new file mode 100644
index 0000000..fa68bf6
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/exactparser/parsing/IndirectObjectReference.java
@@ -0,0 +1,49 @@
+/**
+ * <copyright> Copyright (c) 2006 by Know-Center, Graz, Austria </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+ * NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
+ * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES.
+ *
+ * $Id: IndirectObjectReference.java,v 1.1 2006/08/25 17:00:59 wprinz Exp $
+ */
+package at.knowcenter.wag.exactparser.parsing;
+
+/**
+ * The IndirectObjectReference class completely holds a so called object
+ * identifier of an indirect object.
+ *
+ * <p>
+ * An indirect object is an object not contained within another object. In
+ * accordance, a direct object is structurally part of another object. For
+ * example, a direct String object that is the value of some key in a dictionary
+ * object.
+ * </p>
+ * <p>
+ * An object identifier uniquely identifies a specific indirect object by the
+ * object number and the generation number. In PDF such an object identifier may
+ * be used to reference to the object.
+ * </p>
+ *
+ * @author wprinz
+ */
+public class IndirectObjectReference {
+
+ public int object_number;
+
+ public int generation_number;
+
+ //@Override
+ public String toString() {
+ return object_number + " " + generation_number;
+ }
+
+}
diff --git a/src/main/java/at/knowcenter/wag/exactparser/parsing/PDFNames.java b/src/main/java/at/knowcenter/wag/exactparser/parsing/PDFNames.java
new file mode 100644
index 0000000..66e1931
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/exactparser/parsing/PDFNames.java
@@ -0,0 +1,176 @@
+/**
+ * <copyright> Copyright (c) 2006 by Know-Center, Graz, Austria </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+ * NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
+ * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES.
+ *
+ * $Id: PDFNames.java,v 1.1 2006/08/25 17:00:59 wprinz Exp $
+ */
+package at.knowcenter.wag.exactparser.parsing;
+
+/**
+ * Abstract class that contains several frequently used PDF constants.
+ *
+ * <p>
+ * The PDF specification partitions the character set (ASCII) into three groups:
+ * </p>
+ * <ul>
+ * <li>Whitespace characters (space, tab, etc., but also newline and carriage
+ * return) used to separate tokens. Unless otherwise specified a group of
+ * consecutive whitespace characters behaves like a single whitespace character.</li>
+ * <li>Delimiter characters ('(', '<', etc., but also '/', which precedes the
+ * PDF Key Names in dictionaries) that are used to encircle semantic groups.
+ * <li>Regular characters are per definition the rest characters that are
+ * neither whitespaces nor delimiters.</li>
+ * </ul>
+ * <p>
+ * Newlines consist per default of CR and LF, but also LF and even CR alone are
+ * allowed. It seems that all variations of newlines may exist within a single
+ * document.
+ * </p>
+ *
+ * @author wprinz
+ */
+public abstract class PDFNames
+{
+
+ /**
+ * The standard encoding of PDF tokens and names.
+ *
+ * <p>
+ * PDF is usually an 8 bit format. Binary data etc. can be saves just as it
+ * is. Nevertheless all PDF tokens ('xref', 'obj', etc.) and PDF Names
+ * ('/Size', '/Pages', '/Type', etc.) must be in 7 bit ASCII US encoding.
+ * </p>
+ * <p>
+ * Therefor, whenever using Java Strings to convert e.g. numbers to such PDF
+ * tokens use this encoding constant.
+ * </p>
+ * <p>
+ * The same applies for PDF token/name byte arrays that are retransfromed to
+ * Java Strings.
+ * </p>
+ */
+ public static final String PDF_STANDARD_ENCODING = "US-ASCII";
+
+ // Whitespace characters
+
+ // TABLE 3.1 White-space characters
+ // DECIMAL HEXADECIMAL OCTAL NAME
+ // 0 00 000 Null (NUL)
+ // 9 09 011 Tab (HT)
+ // 10 0A 012 Line feed (LF)
+ // 12 0C 014 Form feed (FF)
+ // 13 0D 015 Carriage return
+ // 32 20 040 Space (SP)
+
+ public static final byte WHITESPACE_NUL = 0x00;
+
+ public static final byte WHITESPACE_HT = 0x09;
+
+ public static final byte WHITESPACE_LF = 0x0A;
+
+ public static final byte WHITESPACE_FF = 0x0C;
+
+ public static final byte WHITESPACE_CR = 0x0D;
+
+ public static final byte WHITESPACE_SP = 0x20;
+
+ public static final byte[] WHITESPACE_CHARACTERS = { WHITESPACE_NUL,
+ WHITESPACE_HT, WHITESPACE_LF, WHITESPACE_FF, WHITESPACE_CR, WHITESPACE_SP };
+
+ // comment character
+
+ public static final byte COMMENT = '%';
+
+ // PDF-version
+
+ public static final byte[] PDF_VERSION_STR = { 'P', 'D', 'F', '-' };
+
+ public static final byte PDF_VERSION_SEPARATOR = '.';
+
+ // delimiter characters
+
+ public static final byte DELIMITER_STRING_OPEN = '(';
+
+ public static final byte DELIMITER_STRING_CLOSE = ')';
+
+ public static final byte DELIMITER_HEXSTRING_OPEN = '<';
+
+ public static final byte DELIMITER_HEXSTRING_CLOSE = '>';
+
+ public static final byte DELIMITER_ARRAY_OPEN = '[';
+
+ public static final byte DELIMITER_ARRAY_CLOSE = ']';
+
+ public static final byte DELIMITER_CURLY_OPEN = '{';
+
+ public static final byte DELIMITER_CURLY_CLOSE = '}';
+
+ public static final byte DELIMITER_NAME = '/';
+
+ public static final byte[] DELIMITER_CHARACTERS = { DELIMITER_STRING_OPEN,
+ DELIMITER_STRING_CLOSE, DELIMITER_HEXSTRING_OPEN,
+ DELIMITER_HEXSTRING_CLOSE, DELIMITER_ARRAY_OPEN, DELIMITER_ARRAY_CLOSE,
+ DELIMITER_CURLY_OPEN, DELIMITER_CURLY_CLOSE, DELIMITER_NAME };
+
+ // Footer
+
+ public static final byte[] XREF_STR = { 'x', 'r', 'e', 'f' };
+
+ public static final byte[] TRAILER_STR = { 't', 'r', 'a', 'i', 'l', 'e', 'r' };
+
+ public static final byte[] STARTXREF_STR = { 's', 't', 'a', 'r', 't', 'x',
+ 'r', 'e', 'f' };
+
+ public static final byte[] EOF_STR = { '%', '%', 'E', 'O', 'F' };
+
+ // objects
+
+ public static final byte[] OBJ_STR = { 'o', 'b', 'j' };
+
+ public static final byte[] ENDOBJ_STR = { 'e', 'n', 'd', 'o', 'b', 'j' };
+
+ public static final byte[] DICT_START_STR = { DELIMITER_HEXSTRING_OPEN,
+ DELIMITER_HEXSTRING_OPEN };
+
+ public static final byte[] DICT_END_STR = { DELIMITER_HEXSTRING_CLOSE,
+ DELIMITER_HEXSTRING_CLOSE };
+
+ public static final byte[] STREAM_STR = { 's', 't', 'r', 'e', 'a', 'm' };
+
+ public static final byte[] ENDSTREAM_STR = { 'e', 'n', 'd', 's', 't', 'r',
+ 'e', 'a', 'm' };
+
+ public static final byte[] NULL_STR = { 'n', 'u', 'l', 'l' };
+
+ public static final byte[] TRUE_STR = { 't', 'r', 'u', 'e' };
+
+ public static final byte[] FALSE_STR = { 'f', 'a', 'l', 's', 'e' };
+
+ // indirect object references
+
+ public static final byte[] REFERENCE_STR = { 'R' };
+
+ // Dictionary keys
+
+ public static final byte[] SIZE_STR = { 'S', 'i', 'z', 'e' };
+
+ public static final byte[] PREV_STR = { 'P', 'r', 'e', 'v' };
+
+ public static final byte[] ROOT_STR = { 'R', 'o', 'o', 't' };
+
+ public static final byte[] INFO_STR = { 'I', 'n', 'f', 'o' };
+
+ public static final byte[] LENGTH_STR = { 'L', 'e', 'n', 'g', 't', 'h' };
+
+}
diff --git a/src/main/java/at/knowcenter/wag/exactparser/parsing/PDFUtils.java b/src/main/java/at/knowcenter/wag/exactparser/parsing/PDFUtils.java
new file mode 100644
index 0000000..9a2f738
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/exactparser/parsing/PDFUtils.java
@@ -0,0 +1,1393 @@
+/**
+ * <copyright> Copyright (c) 2006 by Know-Center, Graz, Austria </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+ * NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
+ * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES.
+ *
+ * $Id: PDFUtils.java,v 1.1 2006/08/25 17:00:59 wprinz Exp $
+ */
+package at.knowcenter.wag.exactparser.parsing;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import at.knowcenter.wag.exactparser.ByteArrayUtils;
+import at.knowcenter.wag.exactparser.parsing.results.ArrayParseResult;
+import at.knowcenter.wag.exactparser.parsing.results.BooleanParseResult;
+import at.knowcenter.wag.exactparser.parsing.results.DictionaryParseResult;
+import at.knowcenter.wag.exactparser.parsing.results.EOFParseResult;
+import at.knowcenter.wag.exactparser.parsing.results.FooterParseResult;
+import at.knowcenter.wag.exactparser.parsing.results.HeaderParseResult;
+import at.knowcenter.wag.exactparser.parsing.results.HexStringParseResult;
+import at.knowcenter.wag.exactparser.parsing.results.IndirectObjectReferenceParseResult;
+import at.knowcenter.wag.exactparser.parsing.results.IntegerParseResult;
+import at.knowcenter.wag.exactparser.parsing.results.LiteralStringParseResult;
+import at.knowcenter.wag.exactparser.parsing.results.NameParseResult;
+import at.knowcenter.wag.exactparser.parsing.results.NullParseResult;
+import at.knowcenter.wag.exactparser.parsing.results.NumberParseResult;
+import at.knowcenter.wag.exactparser.parsing.results.ObjectHeaderParseResult;
+import at.knowcenter.wag.exactparser.parsing.results.ObjectParseResult;
+import at.knowcenter.wag.exactparser.parsing.results.ParseResult;
+import at.knowcenter.wag.exactparser.parsing.results.StartXRefParseResult;
+import at.knowcenter.wag.exactparser.parsing.results.StreamParseResult;
+import at.knowcenter.wag.exactparser.parsing.results.TrailerParseResult;
+import at.knowcenter.wag.exactparser.parsing.results.XRefLineParseResult;
+import at.knowcenter.wag.exactparser.parsing.results.XRefSectionParseResult;
+import at.knowcenter.wag.exactparser.parsing.results.XRefSubSectionParseResult;
+
+
+
+/**
+ * Abstract class that contains several static utility methods for parsing and
+ * analyzing PDF documents on the lowest level.
+ *
+ * <p>
+ * Most operations require random access to the PDF data (mostly to verify the
+ * synthax). So the whole PDF document has to be provided as a byte array. The
+ * term "pdf+index" states a specific position index within this byte array.
+ * </p>
+ *
+ * @author wprinz
+ *
+ */
+public abstract class PDFUtils
+{
+
+ public static boolean isWhitespace(final byte data)
+ {
+ return ByteArrayUtils.contains(PDFNames.WHITESPACE_CHARACTERS, data);
+ }
+
+ public static boolean isDelimiter(final byte data)
+ {
+ return ByteArrayUtils.contains(PDFNames.DELIMITER_CHARACTERS, data);
+ }
+
+ protected static boolean isRegular(final byte data)
+ {
+ return !(isWhitespace(data) || isDelimiter(data));
+ }
+
+ /**
+ * Skips whitespace.
+ *
+ * <p>
+ * Skips all whitespace, which may be none, one or multiple whitespace
+ * characters.
+ * </p>
+ * <p>
+ * Note that this also skips newline characters (which belong to whitespace as
+ * well).
+ * </p>
+ *
+ * @param data
+ * The PDF data.
+ * @param index
+ * The index.
+ * @return Returns the index of the first non whitespace character. This may
+ * be equal to index if no whitespaces were skipped at all.
+ */
+ public static int skipWhitespace(final byte[] data, final int index)
+ {
+ int non_whitespace_index = index;
+ while (isWhitespace(data[non_whitespace_index]))
+ {
+ non_whitespace_index++;
+ }
+ return non_whitespace_index;
+ }
+
+ /**
+ * Skips bytes until whitespace is reached.
+ *
+ * <p>
+ * Skips all non whitespace characters, which may be none at all.
+ * </p>
+ *
+ * @param data
+ * The PDF data.
+ * @param index
+ * The index.
+ * @return Returns the index of the first whitespace character. This may be
+ * equal to index if no non whitespaces were skipped at all.
+ */
+ public static int skipToWhitespace(final byte[] data, final int index)
+ {
+ int whitespace_index = index;
+ while (!isWhitespace(data[whitespace_index]))
+ {
+ whitespace_index++;
+ }
+ return whitespace_index;
+ }
+
+ protected static final byte[] LINE_TERMINATOR_CRLF = {
+ PDFNames.WHITESPACE_CR, PDFNames.WHITESPACE_LF };
+
+ protected static final byte[] LINE_TERMINATOR_CRALONE = { PDFNames.WHITESPACE_CR };
+
+ protected static final byte[] LINE_TERMINATOR_LF = { PDFNames.WHITESPACE_LF };
+
+ public static boolean isNewline(final byte[] data, final int index)
+ {
+ if (ByteArrayUtils.compareByteArrays(data, index, LINE_TERMINATOR_LF))
+ {
+ return true;
+ }
+ if (ByteArrayUtils.compareByteArrays(data, index, LINE_TERMINATOR_CRLF))
+ {
+ return true;
+ }
+ // although not specified by PDF, some applications use the CR alone as line
+ // terminator
+ if (ByteArrayUtils.compareByteArrays(data, index, LINE_TERMINATOR_CRALONE))
+ {
+ return true;
+ }
+ return false;
+ }
+
+ public static int skipNewline(final byte[] data, final int index)
+ {
+ if (ByteArrayUtils.compareByteArrays(data, index, LINE_TERMINATOR_LF))
+ {
+ return index + LINE_TERMINATOR_LF.length;
+ }
+ if (ByteArrayUtils.compareByteArrays(data, index, LINE_TERMINATOR_CRLF))
+ {
+ return index + LINE_TERMINATOR_CRLF.length;
+ }
+ // although not specified by PDF, some applications use the CR alone as line
+ // terminator
+ if (ByteArrayUtils.compareByteArrays(data, index, LINE_TERMINATOR_CRALONE))
+ {
+ return index + LINE_TERMINATOR_CRALONE.length;
+ }
+
+ assert false : "don't call this if you don't expect a newline - call skipWhitespace instead";
+ return index;
+ }
+
+ public static int skipToNewline(final byte[] data, final int index)
+ {
+ int current_index = index;
+ for (;;)
+ {
+ if (ByteArrayUtils.compareByteArrays(data, current_index, LINE_TERMINATOR_LF))
+ {
+ return current_index + LINE_TERMINATOR_LF.length;
+ }
+ if (ByteArrayUtils.compareByteArrays(data, index, LINE_TERMINATOR_CRLF))
+ {
+ return index + LINE_TERMINATOR_CRLF.length;
+ }
+ // although not specified by PDF, some applications use the CR alone as
+ // line terminator
+ if (ByteArrayUtils.compareByteArrays(data, index, LINE_TERMINATOR_CRALONE))
+ {
+ return index + LINE_TERMINATOR_CRALONE.length;
+ }
+ current_index++;
+ }
+ }
+
+ /**
+ * Parses a boolean value.
+ *
+ * @param pdf
+ * The PDF data.
+ * @param index
+ * The index.
+ * @return Returns the result of the parsing operation.
+ */
+ public static BooleanParseResult parseBoolean(final byte[] pdf,
+ final int index)
+ {
+ BooleanParseResult bpr = new BooleanParseResult();
+ bpr.start_index = index;
+
+ if (ByteArrayUtils.compareByteArrays(pdf, bpr.start_index, PDFNames.TRUE_STR))
+ {
+ bpr.value = true;
+ bpr.next_index = bpr.start_index + PDFNames.TRUE_STR.length;
+
+ return bpr;
+ }
+ if (ByteArrayUtils.compareByteArrays(pdf, bpr.start_index, PDFNames.FALSE_STR))
+ {
+ bpr.value = false;
+ bpr.next_index = bpr.start_index + PDFNames.FALSE_STR.length;
+
+ return bpr;
+ }
+
+ throw new RuntimeException("Boolean couldn't be parsed at index " + index);
+ }
+
+ public static boolean isSign(final byte data)
+ {
+ return data == '+' || data == '-';
+ }
+
+ public static boolean isNumeric(final byte data)
+ {
+ return '0' <= data && data <= '9';
+ }
+
+ /**
+ * Reads the (positive integer) number from the data. The number must be
+ * terminated by the end of line.
+ *
+ * @param data
+ * The data.
+ * @param index
+ * The index.
+ * @return Returns the read number.
+ */
+ public static int readNumberFromByteArray(final byte[] data, final int index)
+ {
+ NumberParseResult npr = parseNumberFromByteArray(data, index);
+
+ assert npr.number >= 0;
+ return npr.number;
+ }
+
+ /**
+ * Parses an unsigned integer.
+ *
+ * <p>
+ * The integer must be a block of successive number characters. It must not be
+ * preceded by a sign (not even '+').
+ * </p>
+ *
+ * @param pdf
+ * The PDF data.
+ * @param index
+ * The index.
+ * @return Returns the result of the parsing operation.
+ */
+ public static IntegerParseResult parseUnsignedInteger(final byte[] pdf,
+ final int index)
+ {
+ assert isNumeric(pdf[index]);
+
+ String number = "";
+
+ int cur_index = index;
+ while (isNumeric(pdf[cur_index]))
+ {
+
+ number += (char) pdf[cur_index];
+
+ cur_index++;
+ }
+
+ // TODO: make better
+ int int_value = Integer.parseInt(number);
+
+ assert int_value >= 0;
+
+ IntegerParseResult ipr = new IntegerParseResult();
+ ipr.start_index = index;
+ ipr.next_index = cur_index;
+ ipr.number = int_value;
+ return ipr;
+ }
+
+ /**
+ * Parses a (potentially) signed integer.
+ *
+ * <p>
+ * The integer must be a block of successive number characters. It may be
+ * preceded by a sign character ('+' or '-').
+ * </p>
+ *
+ * @param pdf
+ * The PDF data.
+ * @param index
+ * The index.
+ * @return Returns the result of the parsing operation.
+ */
+ public static IntegerParseResult parseInteger(final byte[] pdf,
+ final int index)
+ {
+ assert isSign(pdf[index]) || isNumeric(pdf[index]);
+
+ int sign = +1;
+ int number_start = index;
+ if (pdf[index] == '+')
+ {
+ sign = +1;
+ number_start++;
+ }
+ else
+ {
+ if (pdf[index] == '-')
+ {
+ sign = -1;
+ number_start++;
+ }
+ else
+ {
+ assert isNumeric(pdf[index]);
+ }
+ }
+
+ IntegerParseResult ipr = parseUnsignedInteger(pdf, number_start);
+ ipr.start_index = index;
+ ipr.number *= sign;
+ return ipr;
+ }
+
+ /**
+ * Parses an arbitrary number;
+ *
+ * @param pdf
+ * The PDF data.
+ * @param index
+ * The index.
+ * @return Returns the result of the parsing operation.
+ */
+ public static NumberParseResult parseNumberFromByteArray(final byte[] pdf,
+ int index)
+ {
+ String number = "";
+
+ assert isSign(pdf[index]) || isNumeric(pdf[index]);
+
+ int sign = +1;
+ if (pdf[index] == '+')
+ {
+ sign = +1;
+ index++;
+ }
+ else
+ {
+ if (pdf[index] == '-')
+ {
+ sign = -1;
+ index++;
+ }
+ else
+ {
+ assert isNumeric(pdf[index]);
+ }
+ }
+
+ while (isNumeric(pdf[index]) || pdf[index] == '.')
+ {
+
+ number += (char) pdf[index];
+
+ index++;
+ }
+
+ NumberParseResult npr = new NumberParseResult();
+ npr.next_index = index;
+ // TODO: make better
+ try
+ {
+ npr.number = Integer.parseInt(number) * sign;
+ }
+ catch (NumberFormatException e)
+ {
+ npr.floating = Float.parseFloat(number) * sign;
+ }
+
+ return npr;
+ }
+
+ /**
+ * Searches the last occurrence of the "startxref" entry ... in other words
+ * starts the search from the end of the document and works reversely.
+ *
+ * @param pdf
+ * The complete PDF file data.
+ * @return Returns the offset (byte index) of the "startxref" entry.
+ */
+ public static int findLastStartXRef(final byte[] pdf)
+ {
+ return ByteArrayUtils.lastIndexOf(pdf, PDFNames.STARTXREF_STR);
+ }
+
+ /**
+ * Parses the xref section at pdf+index.
+ *
+ * <p>
+ * An xref section starts with 'xref' and contains one or more xref
+ * sub-sections.
+ * </p>
+ *
+ * @param pdf
+ * The PDF data.
+ * @param index
+ * The start index of the xref table.
+ * @return Returns the result of the parsing operation.
+ */
+ public static XRefSectionParseResult parseXRefSection(final byte[] pdf,
+ final int index)
+ {
+ at.knowcenter.wag.exactparser.parsing.results.XRefSectionParseResult xpr = new XRefSectionParseResult();
+ xpr.start_index = index;
+
+ assert ByteArrayUtils.compareByteArrays(pdf, xpr.start_index, PDFNames.XREF_STR);
+ assert isNewline(pdf, xpr.start_index + PDFNames.XREF_STR.length);
+
+ int cur_index = skipWhitespace(pdf, xpr.start_index + PDFNames.XREF_STR.length);
+ // skipNewline(pdf, xpr.start_index + PDFNames.XREF_STR.length);
+
+ for (;;)
+ {
+ // trailer ends the xref section.
+ if (ByteArrayUtils.compareByteArrays(pdf, cur_index, PDFNames.TRAILER_STR))
+ {
+ break;
+ }
+
+ // no trailer ==> another xref section
+
+ XRefSubSectionParseResult sspr = parseXRefSubSection(pdf, cur_index);
+ xpr.appendXRefSubSection(sspr);
+
+ cur_index = sspr.next_index;
+ }
+
+ xpr.next_index = cur_index;
+ assert ByteArrayUtils.compareByteArrays(pdf, xpr.next_index, PDFNames.TRAILER_STR);
+
+ return xpr;
+ }
+
+ /**
+ * Parses a xref sub-section.
+ *
+ * @param pdf
+ * The PDF data.
+ * @param index
+ * The index.
+ * @return Returns the result of the parsing operation.
+ */
+ public static XRefSubSectionParseResult parseXRefSubSection(final byte[] pdf,
+ final int index)
+ {
+ XRefSubSectionParseResult sspr = new XRefSubSectionParseResult();
+ sspr.start_index = index;
+
+ NumberParseResult start_obj_num_npr = parseNumberFromByteArray(pdf, sspr.start_index);
+ sspr.start_obj_number = start_obj_num_npr.number;
+ assert sspr.start_obj_number >= 0;
+
+ assert isWhitespace(pdf[start_obj_num_npr.next_index]);
+ int num_obj_index = skipWhitespace(pdf, start_obj_num_npr.next_index);
+
+ NumberParseResult num_obj_npr = parseNumberFromByteArray(pdf, num_obj_index);
+ sspr.num_objects = num_obj_npr.number;
+
+ // assert isNewline(pdf, num_obj_npr.next_index);
+ assert isWhitespace(pdf[num_obj_npr.next_index]);
+ int start_of_line = skipWhitespace(pdf, num_obj_npr.next_index);
+ // skipNewline(pdf, num_obj_npr.next_index);
+
+ for (int i = 0; i < sspr.num_objects; i++)
+ {
+ final int cur_object_number = sspr.start_obj_number + i;
+
+ XRefLineParseResult lpr = parseXrefLine(pdf, start_of_line);
+ sspr.appendXRefLine(lpr);
+
+ // System.out.println("xref line of object " + (oc.start_obj_number + i) +
+ // " at " + lpr.start_index + ": " + lpr.object_offset + " " +
+ // lpr.generation_number + " " + (char) lpr.object_usage);
+
+ if (lpr.object_usage == 'n')
+ {
+ // check the line - this simple check may make problems with object
+ // streams and xref streams
+ ObjectHeaderParseResult ohpr = parseObjectHeader(pdf, lpr.object_offset);
+ assert ohpr.object_number == cur_object_number;
+ assert ohpr.generation_number == lpr.generation_number;
+ }
+
+ start_of_line = lpr.next_index;
+ }
+
+ sspr.next_index = start_of_line;
+ return sspr;
+ }
+
+ /**
+ * Parses a single 20 bytes xref line at pdf+index.
+ *
+ * @param pdf
+ * The PDF data.
+ * @param index
+ * The index.
+ * @return Returns the result of the parsing operation.
+ */
+ public static XRefLineParseResult parseXrefLine(final byte[] pdf,
+ final int index)
+ {
+ XRefLineParseResult lpr = new XRefLineParseResult();
+
+ lpr.start_index = index;
+
+ IntegerParseResult object_offset_ipr = parseUnsignedInteger(pdf, lpr.start_index);
+ lpr.object_offset = object_offset_ipr.number;
+ assert lpr.object_offset >= 0;
+ assert lpr.object_offset < pdf.length;
+ assert object_offset_ipr.next_index == lpr.start_index + 10;
+
+ assert pdf[object_offset_ipr.next_index] == PDFNames.WHITESPACE_SP; // Standard
+ // explicitely
+ // says 1
+ // single
+ // SPACE
+ int generation_number_index = object_offset_ipr.next_index + 1;
+
+ IntegerParseResult generation_number_ipr = parseUnsignedInteger(pdf, generation_number_index);
+ lpr.generation_number = generation_number_ipr.number;
+ assert generation_number_ipr.next_index == lpr.start_index + 16;
+
+ assert pdf[generation_number_ipr.next_index] == PDFNames.WHITESPACE_SP;
+ int usage_index = generation_number_ipr.next_index + 1;
+
+ lpr.object_usage = pdf[usage_index];
+ assert lpr.object_usage == 'n' || lpr.object_usage == 'f';
+
+ if (pdf[usage_index + 1] == PDFNames.WHITESPACE_SP)
+ {
+ assert pdf[usage_index + 2] == PDFNames.WHITESPACE_CR || pdf[usage_index + 2] == PDFNames.WHITESPACE_LF;
+ }
+ else
+ {
+ assert pdf[usage_index + 1] == PDFNames.WHITESPACE_CR;
+ assert pdf[usage_index + 2] == PDFNames.WHITESPACE_LF;
+ }
+
+ lpr.next_index = usage_index + 3;
+
+ assert lpr.next_index == lpr.start_index + 20;
+
+ return lpr;
+ }
+
+ public static int indexOfName(final byte[] pdf, List names,
+ byte[] sought)
+ {
+ for (int i = 0; i < names.size(); i++)
+ {
+ NameParseResult name = (NameParseResult) names.get(i);
+ if (ByteArrayUtils.compareByteArrays(pdf, name.name_start_index, sought))
+ {
+ return i;
+ }
+ }
+ return -1;
+ }
+
+ public static TrailerParseResult parseTrailer(final byte[] pdf,
+ final int index)
+ {
+ TrailerParseResult tpr = new TrailerParseResult();
+ tpr.start_index = index;
+ tpr.has_predecessor = false;
+
+ assert ByteArrayUtils.compareByteArrays(pdf, tpr.start_index, PDFNames.TRAILER_STR);
+
+ // assert isWhitespace(pdf[tpr.start_index + PDFNames.TRAILER_STR.length]);
+ tpr.contents_index = skipWhitespace(pdf, tpr.start_index + PDFNames.TRAILER_STR.length);
+
+ int trailer_dict_index = skipWhitespace(pdf, tpr.contents_index);
+
+ assert ByteArrayUtils.compareByteArrays(pdf, trailer_dict_index, PDFNames.DICT_START_STR);
+
+ tpr.dpr = parseDictionary(pdf, trailer_dict_index);
+
+ int cur_index = tpr.dpr.next_index;
+
+ int info_index = indexOfName(pdf, tpr.dpr.names, PDFNames.INFO_STR);
+ if (info_index >= 0)
+ {
+ tpr.info = (IndirectObjectReferenceParseResult) tpr.dpr.values.get(info_index);
+ }
+
+ int root_index = indexOfName(pdf, tpr.dpr.names, PDFNames.ROOT_STR);
+ if (root_index >= 0)
+ {
+ tpr.root = (IndirectObjectReferenceParseResult) tpr.dpr.values.get(root_index);
+ }
+
+ tpr.size = ((NumberParseResult) tpr.dpr.values.get(indexOfName(pdf, tpr.dpr.names, PDFNames.SIZE_STR))).number;
+
+ int prev_index = indexOfName(pdf, tpr.dpr.names, PDFNames.PREV_STR);
+ if (prev_index >= 0)
+ {
+ tpr.has_predecessor = true;
+ tpr.setPrev(((NumberParseResult) tpr.dpr.values.get(prev_index)).number);
+ }
+
+ //
+ // int cur_index = skipWhitespace(pdf, trailer_dict_index +
+ // PDFNames.DICT_START_STR.length);
+ // for (;;) {
+ // if (ByteArrayUtils.compareByteArrays(pdf, cur_index,
+ // PDFNames.DICT_END_STR)) {
+ // cur_index += PDFNames.DICT_END_STR.length;
+ // break;
+ // }
+ //
+ // assert pdf[cur_index] == PDFNames.DELIMITER_NAME;
+ // cur_index++;
+ //
+ // if (ByteArrayUtils.compareByteArrays(pdf, cur_index, PDFNames.INFO_STR))
+ // {
+ // assert isWhitespace(pdf[cur_index + PDFNames.INFO_STR.length]);
+ // int ir_index = skipWhitespace(pdf, cur_index + PDFNames.INFO_STR.length);
+ //
+ // IndirectObjectReferenceParseResult iorpr =
+ // parseIndirectObjectReference(pdf, ir_index);
+ // tpr.info = iorpr;
+ //
+ // cur_index = skipWhitespace(pdf, iorpr.next_index);
+ // continue;
+ // }
+ //
+ // if (ByteArrayUtils.compareByteArrays(pdf, cur_index, PDFNames.ROOT_STR))
+ // {
+ // assert isWhitespace(pdf[cur_index + PDFNames.ROOT_STR.length]);
+ // int ir_index = skipWhitespace(pdf, cur_index + PDFNames.ROOT_STR.length);
+ //
+ // IndirectObjectReferenceParseResult iorpr =
+ // parseIndirectObjectReference(pdf, ir_index);
+ // tpr.root = iorpr;
+ //
+ // cur_index = skipWhitespace(pdf, iorpr.next_index);
+ // continue;
+ // }
+ //
+ // if (ByteArrayUtils.compareByteArrays(pdf, cur_index, PDFNames.SIZE_STR))
+ // {
+ // assert isWhitespace(pdf[cur_index + PDFNames.SIZE_STR.length]);
+ // int size_index = skipWhitespace(pdf, cur_index +
+ // PDFNames.SIZE_STR.length);
+ //
+ // NumberParseResult npr = parseNumberFromByteArray(pdf, size_index);
+ // tpr.size = npr.number;
+ // assert tpr.size > 0;
+ //
+ // cur_index = skipWhitespace(pdf, npr.next_index);
+ // continue;
+ // }
+ //
+ // if (ByteArrayUtils.compareByteArrays(pdf, cur_index, PDFNames.PREV_STR))
+ // {
+ // assert isWhitespace(pdf[cur_index + PDFNames.PREV_STR.length]);
+ // int prev_index = skipWhitespace(pdf, cur_index +
+ // PDFNames.PREV_STR.length);
+ //
+ // NumberParseResult npr = parseNumberFromByteArray(pdf, prev_index);
+ // tpr.has_predecessor = true;
+ // tpr.setPrev(npr.number);
+ // assert tpr.getPrev() >= 0;
+ // assert tpr.getPrev() < pdf.length;
+ //
+ // assert ByteArrayUtils.compareByteArrays(pdf, tpr.getPrev(),
+ // PDFNames.XREF_STR);
+ //
+ // cur_index = skipWhitespace(pdf, npr.next_index);
+ // continue;
+ // }
+ //
+ // // unrecognized type
+ // // skip to next delimiter
+ // // TODO: this will not work with nested dicts.
+ // while (pdf[cur_index] != PDFNames.DELIMITER_NAME) {
+ // cur_index++;
+ // }
+ // }
+
+ tpr.contents_end_index = cur_index;
+ tpr.next_index = skipWhitespace(pdf, tpr.contents_end_index);
+
+ assert ByteArrayUtils.compareByteArrays(pdf, tpr.next_index, PDFNames.STARTXREF_STR);
+ return tpr;
+ }
+
+ /**
+ * Parses the startxref section at pdf+index.
+ *
+ * @param pdf
+ * The complete PDF file data.
+ * @param index
+ * The index of the startxref section.
+ * @return Returns the retsult of the parsing operation.
+ */
+ public static StartXRefParseResult parseStartXRef(final byte[] pdf,
+ final int index)
+ {
+ StartXRefParseResult spr = new StartXRefParseResult();
+ spr.next_index = index;
+
+ assert ByteArrayUtils.compareByteArrays(pdf, index, PDFNames.STARTXREF_STR);
+ assert isNewline(pdf, index + PDFNames.STARTXREF_STR.length);
+
+ int index_of_number = skipWhitespace(pdf, index + PDFNames.STARTXREF_STR.length);
+ // skipNewline(pdf, index + PDFNames.STARTXREF_STR.length);
+ NumberParseResult npr = parseNumberFromByteArray(pdf, index_of_number);
+ spr.xref_index = npr.number;
+
+ assert isNewline(pdf, npr.next_index);
+ spr.next_index = skipWhitespace(pdf, npr.next_index);
+ // skipNewline(pdf, npr.next_index);
+
+ assert ByteArrayUtils.compareByteArrays(pdf, spr.next_index, PDFNames.EOF_STR);
+
+ assert spr.xref_index >= 0;
+ assert spr.xref_index < pdf.length;
+
+ // A linearized document sets the startxref value of the first page's footer
+ // to 0.
+ if (spr.xref_index != 0)
+ {
+ assert ByteArrayUtils.compareByteArrays(pdf, spr.xref_index, PDFNames.XREF_STR);
+ }
+
+ return spr;
+ }
+
+ /**
+ * Parses the End Of File (EOF) marker at pdf+index.
+ *
+ * @param pdf
+ * The PDF data.
+ * @param index
+ * The index where to start the parsing.
+ * @return Returns the result of the parsing operation.
+ */
+ public static EOFParseResult parseEOF(final byte[] pdf, final int index)
+ {
+ EOFParseResult eofpr = new EOFParseResult();
+ eofpr.start_index = index;
+
+ assert ByteArrayUtils.compareByteArrays(pdf, eofpr.start_index, PDFNames.EOF_STR);
+
+ eofpr.eof_end_index = eofpr.start_index + PDFNames.EOF_STR.length;
+
+ // Note: The EOF marker is not necessarily terminated with a
+ // newline.
+
+ // perhaps explicitely determine a newline.
+
+ eofpr.next_index = eofpr.eof_end_index;
+
+ return eofpr;
+ }
+
+ public static boolean isIndirectObjectReference(final byte[] pdf,
+ final int index)
+ {
+ IndirectObjectReferenceParseResult iorpr = new IndirectObjectReferenceParseResult();
+ iorpr.ior = new IndirectObjectReference();
+ iorpr.start_index = index;
+
+ if (!PDFUtils.isNumeric(pdf[iorpr.start_index]))
+ {
+ return false;
+ }
+ NumberParseResult object_number_npr = parseNumberFromByteArray(pdf, iorpr.start_index);
+ iorpr.ior.object_number = object_number_npr.number;
+ if (iorpr.ior.object_number <= 0)
+ {
+ return false;
+ }
+
+ if (!isWhitespace(pdf[object_number_npr.next_index]))
+ {
+ return false;
+ }
+ int generation_number_index = skipWhitespace(pdf, object_number_npr.next_index);
+
+ if (!PDFUtils.isNumeric(pdf[generation_number_index]))
+ {
+ return false;
+ }
+ NumberParseResult generation_number_npr = parseNumberFromByteArray(pdf, generation_number_index);
+ iorpr.ior.generation_number = generation_number_npr.number;
+ if (iorpr.ior.generation_number < 0)
+ {
+ return false;
+ }
+
+ if (!isWhitespace(pdf[generation_number_npr.next_index]))
+ {
+ return false;
+ }
+ int R_index = skipWhitespace(pdf, generation_number_npr.next_index);
+
+ if (!ByteArrayUtils.compareByteArrays(pdf, R_index, PDFNames.REFERENCE_STR))
+ {
+ return false;
+ }
+
+ iorpr.next_index = R_index + PDFNames.REFERENCE_STR.length;
+
+ return true;
+ }
+
+ /**
+ * Parses an indirect object reference.
+ *
+ * @param pdf
+ * The PDF data.
+ * @param index
+ * The index.
+ * @return Returns the result of the parsing operation.
+ */
+ public static IndirectObjectReferenceParseResult parseIndirectObjectReference(
+ final byte[] pdf, final int index)
+ {
+
+ assert isIndirectObjectReference(pdf, index);
+
+ IndirectObjectReferenceParseResult iorpr = new IndirectObjectReferenceParseResult();
+ iorpr.ior = new IndirectObjectReference();
+ iorpr.start_index = index;
+
+ NumberParseResult object_number_npr = parseNumberFromByteArray(pdf, iorpr.start_index);
+ iorpr.ior.object_number = object_number_npr.number;
+ assert iorpr.ior.object_number > 0;
+
+ assert isWhitespace(pdf[object_number_npr.next_index]);
+ int generation_number_index = skipWhitespace(pdf, object_number_npr.next_index);
+
+ NumberParseResult generation_number_npr = parseNumberFromByteArray(pdf, generation_number_index);
+ iorpr.ior.generation_number = generation_number_npr.number;
+ assert iorpr.ior.generation_number >= 0;
+
+ assert isWhitespace(pdf[generation_number_npr.next_index]);
+ int R_index = skipWhitespace(pdf, generation_number_npr.next_index);
+
+ assert ByteArrayUtils.compareByteArrays(pdf, R_index, PDFNames.REFERENCE_STR);
+
+ iorpr.next_index = R_index + PDFNames.REFERENCE_STR.length;
+
+ return iorpr;
+ }
+
+ /**
+ * Parses the object header at pdf+index.
+ *
+ * @param pdf
+ * The PDF data.
+ * @param index
+ * The index.
+ * @return Returns the result of the parsing operation.
+ */
+ public static ObjectHeaderParseResult parseObjectHeader(final byte[] pdf,
+ final int index)
+ {
+ ObjectHeaderParseResult ohpr = new ObjectHeaderParseResult();
+
+ ohpr.start_index = index;
+
+ NumberParseResult object_number_npr = parseNumberFromByteArray(pdf, ohpr.start_index);
+ ohpr.object_number = object_number_npr.number;
+ assert ohpr.object_number > 0;
+
+ assert isWhitespace(pdf[object_number_npr.next_index]);
+ int generation_number_index = skipWhitespace(pdf, object_number_npr.next_index);
+
+ NumberParseResult generation_number_npr = parseNumberFromByteArray(pdf, generation_number_index);
+ ohpr.generation_number = generation_number_npr.number;
+ assert ohpr.generation_number >= 0;
+
+ assert isWhitespace(pdf[generation_number_npr.next_index]);
+ int obj_index = skipWhitespace(pdf, generation_number_npr.next_index);
+
+ assert ByteArrayUtils.compareByteArrays(pdf, obj_index, PDFNames.OBJ_STR);
+
+ // not all pdfwriters make a newline after obj...
+ // assert isNewline(pdf, obj_index + PDFNames.OBJ_STR.length);
+ // ohpr.next_index = skipNewline(pdf, obj_index + PDFNames.OBJ_STR.length);
+ ohpr.next_index = skipWhitespace(pdf, obj_index + PDFNames.OBJ_STR.length);
+
+ return ohpr;
+ }
+
+ public static ObjectParseResult parseObject(final byte[] pdf, final int index)
+ {
+ ObjectParseResult opr = new ObjectParseResult();
+ opr.start_index = index;
+
+ opr.header = parseObjectHeader(pdf, opr.start_index);
+ opr.content_index = opr.header.next_index;
+
+ int cur_index = skipWhitespace(pdf, opr.content_index);
+
+ opr.object = parseUnknownObject(pdf, cur_index);
+
+ cur_index = skipWhitespace(pdf, opr.object.next_index);
+
+ opr.end_of_content_index = cur_index;
+ assert ByteArrayUtils.compareByteArrays(pdf, opr.end_of_content_index, PDFNames.ENDOBJ_STR);
+
+ cur_index = opr.end_of_content_index + PDFNames.ENDOBJ_STR.length;
+
+ opr.next_index = cur_index;
+ //assert isNewline(pdf, cur_index);
+ //opr.next_index = skipNewline(pdf, cur_index);
+
+ return opr;
+ }
+
+ public static ParseResult parseUnknownObject(final byte[] pdf, final int index)
+ {
+ if (ByteArrayUtils.compareByteArrays(pdf, index, PDFNames.DICT_START_STR))
+ {
+ DictionaryParseResult dpr = parseDictionary(pdf, index);
+
+ int possible_stream_index = skipWhitespace(pdf, dpr.next_index);
+ if (ByteArrayUtils.compareByteArrays(pdf, possible_stream_index, PDFNames.STREAM_STR))
+ {
+ return parseStream(pdf, possible_stream_index, dpr);
+ }
+
+ return dpr;
+ }
+
+ if (ByteArrayUtils.compareByteArrays(pdf, index, PDFNames.NULL_STR))
+ {
+ return parseNull(pdf, index);
+ }
+
+ if (ByteArrayUtils.compareByteArrays(pdf, index, PDFNames.TRUE_STR) || ByteArrayUtils.compareByteArrays(pdf, index, PDFNames.FALSE_STR))
+ {
+ return parseBoolean(pdf, index);
+ }
+
+ final byte first_byte = pdf[index];
+
+ if (isNumeric(first_byte) || isSign(first_byte))
+ {
+
+ // try to parse a Indirect reference first - if this fails, parse a number
+ if (isIndirectObjectReference(pdf, index))
+ {
+ return parseIndirectObjectReference(pdf, index);
+ }
+
+ return parseNumberFromByteArray(pdf, index);
+ }
+
+ ParseResult pr = null;
+
+ switch (first_byte)
+ {
+ case PDFNames.DELIMITER_STRING_OPEN:
+ pr = parseLiteralString(pdf, index);
+ break;
+ case PDFNames.DELIMITER_HEXSTRING_OPEN:
+ pr = parseHexString(pdf, index);
+ break;
+ case PDFNames.DELIMITER_ARRAY_OPEN:
+ pr = parseArray(pdf, index);
+ break;
+ case PDFNames.DELIMITER_NAME:
+ pr = parseName(pdf, index);
+ break;
+ default:
+ throw new RuntimeException("Unknown first_byte when parsing an unknown object at index=" + index + ".");
+ // assert false : "nyi or invalid char";
+ }
+ assert pr != null;
+
+ return pr;
+ }
+
+ /**
+ * Parses a literal string.
+ *
+ * <p>
+ * A literal string is a string of ASCII characters enclosed by '(' and ')'.
+ * Balanced pairs of '(' and ')' are allowed within the string. Unbalanced '('
+ * or ')' must be escaped as '\(' or '\)'.
+ * </p>
+ *
+ * @param pdf
+ * The PDF data.
+ * @param index
+ * The index.
+ * @return Returns the result of the parsing operation.
+ */
+ public static LiteralStringParseResult parseLiteralString(final byte[] pdf,
+ final int index)
+ {
+ LiteralStringParseResult lspr = new LiteralStringParseResult();
+ lspr.start_index = index;
+
+ assert pdf[lspr.start_index] == PDFNames.DELIMITER_STRING_OPEN;
+
+ lspr.content_start_index = lspr.start_index + 1;
+
+ int cur_index = lspr.content_start_index;
+ int parenthesis_stack = 0;
+ for (;;)
+ {
+ if (pdf[cur_index] == '\\' && (pdf[cur_index + 1] == PDFNames.DELIMITER_STRING_CLOSE || pdf[cur_index + 1] == PDFNames.DELIMITER_STRING_OPEN))
+ {
+ cur_index += 2;
+ continue;
+ }
+ if (pdf[cur_index] == PDFNames.DELIMITER_STRING_OPEN)
+ {
+ parenthesis_stack++;
+ }
+ if (pdf[cur_index] == PDFNames.DELIMITER_STRING_CLOSE)
+ {
+ assert parenthesis_stack >= 0;
+
+ if (parenthesis_stack == 0)
+ {
+ break;
+ }
+
+ assert parenthesis_stack > 0;
+ parenthesis_stack--;
+
+ }
+
+ cur_index++;
+ }
+
+ lspr.content_end_index = cur_index;
+ assert pdf[lspr.content_end_index] == PDFNames.DELIMITER_STRING_CLOSE;
+
+ lspr.next_index = lspr.content_end_index + 1;
+
+ return lspr;
+ }
+
+ protected static boolean isHex(final byte data)
+ {
+ return isNumeric(data) || ('a' <= data && data <= 'f') || ('A' <= data && data <= 'f');
+ }
+
+ /**
+ * Parses a hexadecimal string.
+ *
+ * @param pdf
+ * The PDF data.
+ * @param index
+ * The index.
+ * @return Returns the result of the parsing operation.
+ */
+ public static HexStringParseResult parseHexString(final byte[] pdf,
+ final int index)
+ {
+ HexStringParseResult hspr = new HexStringParseResult();
+ hspr.start_index = index;
+
+ assert pdf[hspr.start_index] == PDFNames.DELIMITER_HEXSTRING_OPEN;
+
+ hspr.content_start_index = hspr.start_index + 1;
+
+ int cur_index = hspr.content_start_index;
+ while (isHex(pdf[cur_index]) || isWhitespace(pdf[cur_index]))
+ {
+ cur_index++;
+ }
+
+ hspr.content_end_index = cur_index;
+ assert pdf[hspr.content_end_index] == PDFNames.DELIMITER_HEXSTRING_CLOSE;
+
+ hspr.next_index = hspr.content_end_index + 1;
+
+ return hspr;
+ }
+
+ public static ArrayParseResult parseArray(final byte[] pdf, final int index)
+ {
+ ArrayParseResult apr = new ArrayParseResult();
+ apr.start_index = index;
+ assert pdf[apr.start_index] == PDFNames.DELIMITER_ARRAY_OPEN;
+
+ apr.content_start_index = apr.start_index + 1;
+
+ apr.elements = new ArrayList();
+
+ int cur_index = skipWhitespace(pdf, apr.content_start_index);
+ for (;;)
+ {
+ if (pdf[cur_index] == PDFNames.DELIMITER_ARRAY_CLOSE)
+ {
+ break;
+ }
+
+ ParseResult pr = parseUnknownObject(pdf, cur_index);
+ apr.elements.add(pr);
+
+ cur_index = skipWhitespace(pdf, pr.next_index);
+ }
+ assert pdf[cur_index] == PDFNames.DELIMITER_ARRAY_CLOSE;
+
+ apr.content_end_index = cur_index;
+ assert pdf[apr.content_end_index] == PDFNames.DELIMITER_ARRAY_CLOSE;
+
+ apr.next_index = apr.content_end_index + 1;
+ return apr;
+ }
+
+ /**
+ * Parses a PDF Name.
+ *
+ * @param pdf
+ * The PDF data.
+ * @param index
+ * The index.
+ * @return Returns the result of this parsing operation.
+ */
+ public static NameParseResult parseName(final byte[] pdf, final int index)
+ {
+ NameParseResult npr = new NameParseResult();
+ npr.start_index = index;
+
+ assert pdf[npr.start_index] == PDFNames.DELIMITER_NAME;
+
+ npr.name_start_index = npr.start_index + 1;
+
+ assert isRegular(pdf[npr.name_start_index]);
+
+ int cur_index = npr.name_start_index;
+ while (isRegular(pdf[cur_index]))
+ {
+ cur_index++;
+ }
+ assert !isRegular(pdf[cur_index]);
+
+ npr.next_index = cur_index;
+
+ return npr;
+ }
+
+ public static DictionaryParseResult parseDictionary(final byte[] pdf,
+ final int index)
+ {
+ DictionaryParseResult dpr = new DictionaryParseResult();
+ dpr.start_index = index;
+
+ assert ByteArrayUtils.compareByteArrays(pdf, index, PDFNames.DICT_START_STR);
+
+ dpr.content_start_index = dpr.start_index + PDFNames.DICT_START_STR.length;
+
+ dpr.names = new ArrayList();
+ dpr.values = new ArrayList();
+
+ int cur_index = skipWhitespace(pdf, dpr.content_start_index);
+ for (;;)
+ {
+ if (ByteArrayUtils.compareByteArrays(pdf, cur_index, PDFNames.DICT_END_STR))
+ {
+ break;
+ }
+
+ NameParseResult npr = parseName(pdf, cur_index);
+ dpr.names.add(npr);
+
+ cur_index = npr.next_index;
+ cur_index = skipWhitespace(pdf, cur_index);
+
+ ParseResult pr = parseUnknownObject(pdf, cur_index);
+ dpr.values.add(pr);
+
+ cur_index = pr.next_index;
+ cur_index = skipWhitespace(pdf, cur_index);
+ }
+
+ dpr.content_end_index = cur_index;
+ assert ByteArrayUtils.compareByteArrays(pdf, dpr.content_end_index, PDFNames.DICT_END_STR);
+ dpr.next_index = dpr.content_end_index + PDFNames.DICT_END_STR.length;
+
+ return dpr;
+ }
+
+ /**
+ * Parses a stream.
+ *
+ * @param pdf
+ * The PDF data.
+ * @param index
+ * The index.
+ * @param dpr
+ * The DictionaryParseResult of the stream's dictionary. This
+ * dictionary must precede the stream keyword. Usually this is
+ * provided in the stream object's dictionary via the /Length field.
+ * @return Returns the result of this parsing operation.
+ */
+ public static StreamParseResult parseStream(final byte[] pdf,
+ final int index, final DictionaryParseResult dpr)
+ {
+ StreamParseResult spr = new StreamParseResult();
+ spr.stream_dictionary = dpr;
+ spr.start_index = spr.stream_dictionary.start_index;
+ spr.stream_start_index = index;
+ assert ByteArrayUtils.compareByteArrays(pdf, index, PDFNames.STREAM_STR);
+
+ // assert that the provided dictionary really belongs to this stream
+ assert spr.stream_start_index == skipWhitespace(pdf, spr.stream_dictionary.next_index);
+
+ // see PDF Spec 1.4 chapter 3.2.7
+ assert pdf[spr.stream_start_index + PDFNames.STREAM_STR.length] == PDFNames.WHITESPACE_LF || (pdf[spr.stream_start_index + PDFNames.STREAM_STR.length] == PDFNames.WHITESPACE_CR && pdf[spr.stream_start_index + PDFNames.STREAM_STR.length + 1] == PDFNames.WHITESPACE_LF);
+ spr.content_start_index = skipNewline(pdf, spr.stream_start_index + PDFNames.STREAM_STR.length);
+
+ int length = -1;
+ for (int i = 0; i < spr.stream_dictionary.names.size(); i++)
+ {
+ NameParseResult name = (NameParseResult) spr.stream_dictionary.names.get(i);
+ if (ByteArrayUtils.compareByteArrays(pdf, name.name_start_index, PDFNames.LENGTH_STR))
+ {
+ ParseResult pr = (ParseResult) spr.stream_dictionary.values.get(i);
+ NumberParseResult npr = null;
+ if (pr instanceof IndirectObjectReferenceParseResult)
+ {
+ System.out.println("An object stream with indirect length - cannot parse this instantly - parse later again.");
+ spr.content_end_index = -1;
+ spr.next_index = -1;
+ return spr;
+
+ }
+ else
+ {
+ npr = (NumberParseResult) pr;
+ }
+ assert npr != null;
+
+ length = npr.number;
+ break;
+ }
+
+ }
+ assert length >= 0;
+
+ spr.content_end_index = spr.content_start_index + length;
+
+ int endstr_index = spr.content_end_index;
+ if (isNewline(pdf, endstr_index))
+ {
+ endstr_index = skipWhitespace(pdf, endstr_index);
+ }
+ assert ByteArrayUtils.compareByteArrays(pdf, endstr_index, PDFNames.ENDSTREAM_STR);
+
+ spr.next_index = endstr_index + PDFNames.ENDSTREAM_STR.length;
+
+ return spr;
+ }
+
+ public static NullParseResult parseNull(final byte[] pdf, final int index)
+ {
+ NullParseResult npr = new NullParseResult();
+ npr.start_index = index;
+
+ assert ByteArrayUtils.compareByteArrays(pdf, npr.start_index, PDFNames.NULL_STR);
+
+ npr.next_index = npr.start_index + PDFNames.NULL_STR.length;
+
+ return npr;
+ }
+
+ public static int getObjectOffsetFromXRefByIndirectObjectReference(
+ XRefSectionParseResult xpr, IndirectObjectReference ior)
+ {
+ Iterator it = xpr.xref_subsections.iterator();
+ while (it.hasNext())
+ {
+ XRefSubSectionParseResult section = (XRefSubSectionParseResult) it.next();
+
+ for (int i = 0; i < section.xref_lines.size(); i++)
+ {
+ if (section.start_obj_number + i == ior.object_number)
+ {
+ XRefLineParseResult lpr = (XRefLineParseResult) section.xref_lines.get(i);
+ return lpr.object_offset;
+ }
+ }
+ }
+
+ return -1;
+ }
+
+ public static HeaderParseResult parseHeader(final byte[] pdf, final int index)
+ {
+ HeaderParseResult hpr = new HeaderParseResult();
+ hpr.start_index = index;
+
+ assert pdf[hpr.start_index] == PDFNames.COMMENT;
+
+ assert ByteArrayUtils.compareByteArrays(pdf, hpr.start_index + 1, PDFNames.PDF_VERSION_STR);
+
+ hpr.major_index = hpr.start_index + 1 + PDFNames.PDF_VERSION_STR.length;
+
+ IntegerParseResult major_ipr = parseUnsignedInteger(pdf, hpr.major_index);
+ hpr.major = major_ipr.number;
+ assert hpr.major >= 1;
+
+ assert pdf[major_ipr.next_index] == PDFNames.PDF_VERSION_SEPARATOR;
+
+ hpr.minor_index = major_ipr.next_index + 1;
+
+ IntegerParseResult minor_ipr = parseUnsignedInteger(pdf, hpr.minor_index);
+ hpr.minor = minor_ipr.number;
+ assert hpr.minor >= 0;
+
+ assert isWhitespace(pdf[minor_ipr.next_index]);
+ hpr.binary_characters_index = skipWhitespace(pdf, minor_ipr.next_index);
+
+ assert pdf[hpr.binary_characters_index] == PDFNames.COMMENT;
+
+ hpr.next_index = skipToNewline(pdf, hpr.binary_characters_index);
+ return hpr;
+ }
+
+ /**
+ * Parses a PDF footer.
+ *
+ * <p>
+ * A PDF footer starts with the xref, followed by the trailer, the startxref
+ * and the EOF marker.
+ * </p>
+ *
+ * @param pdf
+ * The PDF data.
+ * @param index
+ * The index.
+ * @return Returns the result of the parsing operation.
+ *
+ * @see FooterParseResult
+ */
+ public static FooterParseResult parseFooter(final byte[] pdf, final int index)
+ {
+ FooterParseResult fpr = new FooterParseResult();
+ fpr.start_index = index;
+
+ fpr.xpr = PDFUtils.parseXRefSection(pdf, fpr.start_index);
+
+ fpr.tpr = PDFUtils.parseTrailer(pdf, fpr.xpr.next_index);
+
+ fpr.sxpr = PDFUtils.parseStartXRef(pdf, fpr.tpr.next_index);
+
+ fpr.eofpr = PDFUtils.parseEOF(pdf, fpr.sxpr.next_index);
+
+ fpr.next_index = fpr.eofpr.next_index;
+ return fpr;
+ }
+
+}
diff --git a/src/main/java/at/knowcenter/wag/exactparser/parsing/results/ArrayParseResult.java b/src/main/java/at/knowcenter/wag/exactparser/parsing/results/ArrayParseResult.java
new file mode 100644
index 0000000..53d2838
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/exactparser/parsing/results/ArrayParseResult.java
@@ -0,0 +1,34 @@
+/**
+ * <copyright> Copyright (c) 2006 by Know-Center, Graz, Austria </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+ * NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
+ * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES.
+ *
+ * $Id: ArrayParseResult.java,v 1.1 2006/08/25 17:00:59 wprinz Exp $
+ */
+package at.knowcenter.wag.exactparser.parsing.results;
+
+import java.util.List;
+
+/**
+ * The result of parsing a hex string.
+ *
+ * @see at.knowcenter.wag.exactparser.parsing.results.LiteralStringParseResult
+ *
+ * @author wprinz
+ */
+public class ArrayParseResult extends ContainerParseResult {
+
+ public List elements = null;
+
+
+}
diff --git a/src/main/java/at/knowcenter/wag/exactparser/parsing/results/BooleanParseResult.java b/src/main/java/at/knowcenter/wag/exactparser/parsing/results/BooleanParseResult.java
new file mode 100644
index 0000000..5b6c31d
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/exactparser/parsing/results/BooleanParseResult.java
@@ -0,0 +1,30 @@
+/**
+ * <copyright> Copyright (c) 2006 by Know-Center, Graz, Austria </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+ * NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
+ * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES.
+ *
+ * $Id: BooleanParseResult.java,v 1.1 2006/08/25 17:00:59 wprinz Exp $
+ */
+package at.knowcenter.wag.exactparser.parsing.results;
+
+/**
+ * Parse result of parsing a boolean value.
+ *
+ * @author wprinz
+ */
+public class BooleanParseResult extends ParseResult
+{
+
+ public boolean value = false;
+
+}
diff --git a/src/main/java/at/knowcenter/wag/exactparser/parsing/results/ContainerParseResult.java b/src/main/java/at/knowcenter/wag/exactparser/parsing/results/ContainerParseResult.java
new file mode 100644
index 0000000..3ca8dc2
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/exactparser/parsing/results/ContainerParseResult.java
@@ -0,0 +1,37 @@
+/**
+ * <copyright> Copyright (c) 2006 by Know-Center, Graz, Austria </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+ * NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
+ * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES.
+ *
+ * $Id: ContainerParseResult.java,v 1.1 2006/08/25 17:00:59 wprinz Exp $
+ */
+package at.knowcenter.wag.exactparser.parsing.results;
+
+/**
+ * Base class of container parse results.
+ *
+ * <p>
+ * Containers are types that include some content.
+ * E.g. literal strings include string data as content,
+ * arrays include elements as content etc.
+ * </p>
+ *
+ * @author wprinz
+ */
+public class ContainerParseResult extends ParseResult {
+
+ public int content_start_index = -1;
+ public int content_end_index = -1;
+
+
+}
diff --git a/src/main/java/at/knowcenter/wag/exactparser/parsing/results/DictionaryParseResult.java b/src/main/java/at/knowcenter/wag/exactparser/parsing/results/DictionaryParseResult.java
new file mode 100644
index 0000000..b976bd2
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/exactparser/parsing/results/DictionaryParseResult.java
@@ -0,0 +1,33 @@
+/**
+ * <copyright> Copyright (c) 2006 by Know-Center, Graz, Austria </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+ * NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
+ * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES.
+ *
+ * $Id: DictionaryParseResult.java,v 1.1 2006/08/25 17:00:59 wprinz Exp $
+ */
+package at.knowcenter.wag.exactparser.parsing.results;
+
+import java.util.List;
+
+/**
+ * The result of parsing a dictionary.
+ *
+ * @author wprinz
+ */
+public class DictionaryParseResult extends ContainerParseResult
+{
+
+ public List names = null;
+
+ public List values = null;
+}
diff --git a/src/main/java/at/knowcenter/wag/exactparser/parsing/results/EOFParseResult.java b/src/main/java/at/knowcenter/wag/exactparser/parsing/results/EOFParseResult.java
new file mode 100644
index 0000000..19d864d
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/exactparser/parsing/results/EOFParseResult.java
@@ -0,0 +1,39 @@
+/**
+ * <copyright> Copyright (c) 2006 by Know-Center, Graz, Austria </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+ * NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
+ * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES.
+ *
+ * $Id: EOFParseResult.java,v 1.1 2006/08/25 17:00:59 wprinz Exp $
+ */
+package at.knowcenter.wag.exactparser.parsing.results;
+
+/**
+ * The result of parsing the End Of File marker.
+ *
+ * @author wprinz
+ */
+public class EOFParseResult extends ParseResult
+{
+
+ /**
+ * The index of the byte after the EOF marker.
+ *
+ * <p>
+ * A newline is not necessary after the EOF marker, but if it is present it will be considered
+ * as part of it.
+ * So eof_end_index marks this newline.
+ * If eof_end_index == next_index, then no new line is present.
+ * </p>
+ */
+ public int eof_end_index = -1;
+}
diff --git a/src/main/java/at/knowcenter/wag/exactparser/parsing/results/FooterParseResult.java b/src/main/java/at/knowcenter/wag/exactparser/parsing/results/FooterParseResult.java
new file mode 100644
index 0000000..d8eb2e1
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/exactparser/parsing/results/FooterParseResult.java
@@ -0,0 +1,45 @@
+/**
+ * <copyright> Copyright (c) 2006 by Know-Center, Graz, Austria </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+ * NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
+ * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES.
+ *
+ * $Id: FooterParseResult.java,v 1.1 2006/08/25 17:00:59 wprinz Exp $
+ */
+package at.knowcenter.wag.exactparser.parsing.results;
+
+
+/**
+ * The result of parsing a PDF footer block.
+ *
+ * <p>
+ * A PDF footer block starts with the xref table followed by the trailer, the
+ * startxref and finally the EOF marker. Usually the footer should be at the end
+ * of the file. All object offsets in the footer's xref table should be before
+ * the footer itself. Nevertheless, there are PDF Writers (e.g. Microsoft Word)
+ * that put the footer at the beginning of the document so that all indirect
+ * objects are after the EOF marker.
+ * </p>
+ *
+ * @author wprinz
+ */
+public class FooterParseResult extends ParseResult
+{
+
+ public StartXRefParseResult sxpr = null;
+
+ public EOFParseResult eofpr = null;
+
+ public XRefSectionParseResult xpr = null;
+
+ public TrailerParseResult tpr = null;
+}
diff --git a/src/main/java/at/knowcenter/wag/exactparser/parsing/results/HeaderParseResult.java b/src/main/java/at/knowcenter/wag/exactparser/parsing/results/HeaderParseResult.java
new file mode 100644
index 0000000..893fa07
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/exactparser/parsing/results/HeaderParseResult.java
@@ -0,0 +1,40 @@
+/**
+ * <copyright> Copyright (c) 2006 by Know-Center, Graz, Austria </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+ * NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
+ * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES.
+ *
+ * $Id: HeaderParseResult.java,v 1.1 2006/08/25 17:00:59 wprinz Exp $
+ */
+package at.knowcenter.wag.exactparser.parsing.results;
+
+/**
+ * The result of parsing the PDF header.
+ *
+ * <p>
+ * The header contains the PDF version and is usually followed by some binary
+ * characers.
+ * </p>
+ *
+ * @author wprinz
+ */
+public class HeaderParseResult extends ParseResult
+{
+ public int major_index = -1;
+ public int minor_index = -1;
+
+ public int major = -1;
+ public int minor = -1;
+
+ public int binary_characters_index = -1;
+
+}
diff --git a/src/main/java/at/knowcenter/wag/exactparser/parsing/results/HexStringParseResult.java b/src/main/java/at/knowcenter/wag/exactparser/parsing/results/HexStringParseResult.java
new file mode 100644
index 0000000..fdaaf66
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/exactparser/parsing/results/HexStringParseResult.java
@@ -0,0 +1,28 @@
+/**
+ * <copyright> Copyright (c) 2006 by Know-Center, Graz, Austria </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+ * NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
+ * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES.
+ *
+ * $Id: HexStringParseResult.java,v 1.1 2006/08/25 17:00:59 wprinz Exp $
+ */
+package at.knowcenter.wag.exactparser.parsing.results;
+
+/**
+ * The result of parsing a hex string.
+ *
+ * @see at.knowcenter.wag.exactparser.parsing.results.LiteralStringParseResult
+ *
+ * @author wprinz
+ */
+public class HexStringParseResult extends ContainerParseResult {
+}
diff --git a/src/main/java/at/knowcenter/wag/exactparser/parsing/results/IndirectObjectReferenceParseResult.java b/src/main/java/at/knowcenter/wag/exactparser/parsing/results/IndirectObjectReferenceParseResult.java
new file mode 100644
index 0000000..d839004
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/exactparser/parsing/results/IndirectObjectReferenceParseResult.java
@@ -0,0 +1,36 @@
+/**
+ * <copyright> Copyright (c) 2006 by Know-Center, Graz, Austria </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+ * NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
+ * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES.
+ *
+ * $Id: IndirectObjectReferenceParseResult.java,v 1.1 2006/08/25 17:00:59 wprinz Exp $
+ */
+package at.knowcenter.wag.exactparser.parsing.results;
+
+import at.knowcenter.wag.exactparser.parsing.IndirectObjectReference;
+
+/**
+ * The ParseResult of parsing an indirect object reference.
+ *
+ * @author wprinz
+ */
+public class IndirectObjectReferenceParseResult extends ParseResult {
+
+ public IndirectObjectReference ior;
+
+ //@Override
+ public String toString()
+ {
+ return ior.toString() + " R";
+ }
+}
diff --git a/src/main/java/at/knowcenter/wag/exactparser/parsing/results/IntegerParseResult.java b/src/main/java/at/knowcenter/wag/exactparser/parsing/results/IntegerParseResult.java
new file mode 100644
index 0000000..5eec5e5
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/exactparser/parsing/results/IntegerParseResult.java
@@ -0,0 +1,28 @@
+/**
+ * <copyright> Copyright (c) 2006 by Know-Center, Graz, Austria </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+ * NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
+ * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES.
+ *
+ * $Id: IntegerParseResult.java,v 1.1 2006/08/25 17:00:59 wprinz Exp $
+ */
+package at.knowcenter.wag.exactparser.parsing.results;
+
+/**
+ * @author wprinz
+ */
+public class IntegerParseResult extends ParseResult
+{
+
+ public int number;
+
+}
diff --git a/src/main/java/at/knowcenter/wag/exactparser/parsing/results/LiteralStringParseResult.java b/src/main/java/at/knowcenter/wag/exactparser/parsing/results/LiteralStringParseResult.java
new file mode 100644
index 0000000..0c7872d
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/exactparser/parsing/results/LiteralStringParseResult.java
@@ -0,0 +1,29 @@
+/**
+ * <copyright> Copyright (c) 2006 by Know-Center, Graz, Austria </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+ * NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
+ * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES.
+ *
+ * $Id: LiteralStringParseResult.java,v 1.1 2006/08/25 17:00:59 wprinz Exp $
+ */
+package at.knowcenter.wag.exactparser.parsing.results;
+
+/**
+ * The result of parsing a simple string (ASCII string).
+ *
+ * @see at.knowcenter.wag.exactparser.parsing.results.HexStringParseResult
+ *
+ * @author wprinz
+ */
+public class LiteralStringParseResult extends ContainerParseResult {
+
+}
diff --git a/src/main/java/at/knowcenter/wag/exactparser/parsing/results/NameParseResult.java b/src/main/java/at/knowcenter/wag/exactparser/parsing/results/NameParseResult.java
new file mode 100644
index 0000000..9a8aa39
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/exactparser/parsing/results/NameParseResult.java
@@ -0,0 +1,27 @@
+/**
+ * <copyright> Copyright (c) 2006 by Know-Center, Graz, Austria </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+ * NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
+ * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES.
+ *
+ * $Id: NameParseResult.java,v 1.1 2006/08/25 17:00:59 wprinz Exp $
+ */
+package at.knowcenter.wag.exactparser.parsing.results;
+
+/**
+ * @author wprinz
+ */
+public class NameParseResult extends ParseResult {
+
+ public int name_start_index = -1;
+
+}
diff --git a/src/main/java/at/knowcenter/wag/exactparser/parsing/results/NullParseResult.java b/src/main/java/at/knowcenter/wag/exactparser/parsing/results/NullParseResult.java
new file mode 100644
index 0000000..fd6e57d
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/exactparser/parsing/results/NullParseResult.java
@@ -0,0 +1,26 @@
+/**
+ * <copyright> Copyright (c) 2006 by Know-Center, Graz, Austria </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+ * NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
+ * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES.
+ *
+ * $Id: NullParseResult.java,v 1.1 2006/08/25 17:00:59 wprinz Exp $
+ */
+package at.knowcenter.wag.exactparser.parsing.results;
+
+/**
+ * The result of parsing a "null".
+ *
+ * @author wprinz
+ */
+public class NullParseResult extends ParseResult {
+}
diff --git a/src/main/java/at/knowcenter/wag/exactparser/parsing/results/NumberParseResult.java b/src/main/java/at/knowcenter/wag/exactparser/parsing/results/NumberParseResult.java
new file mode 100644
index 0000000..a6882c1
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/exactparser/parsing/results/NumberParseResult.java
@@ -0,0 +1,33 @@
+/**
+ * <copyright> Copyright (c) 2006 by Know-Center, Graz, Austria </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+ * NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
+ * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES.
+ *
+ * $Id: NumberParseResult.java,v 1.1 2006/08/25 17:00:59 wprinz Exp $
+ */
+package at.knowcenter.wag.exactparser.parsing.results;
+
+/**
+ * The ParseResult of parsing an integer number.
+ *
+ * @author wprinz
+ */
+public class NumberParseResult extends ParseResult {
+ /**
+ * The (signed) integer number.
+ */
+ public int number;
+
+ // TODO: make better
+ public float floating;
+} \ No newline at end of file
diff --git a/src/main/java/at/knowcenter/wag/exactparser/parsing/results/ObjectHeaderParseResult.java b/src/main/java/at/knowcenter/wag/exactparser/parsing/results/ObjectHeaderParseResult.java
new file mode 100644
index 0000000..5a2265a
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/exactparser/parsing/results/ObjectHeaderParseResult.java
@@ -0,0 +1,43 @@
+/**
+ * <copyright> Copyright (c) 2006 by Know-Center, Graz, Austria </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+ * NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
+ * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES.
+ *
+ * $Id: ObjectHeaderParseResult.java,v 1.1 2006/08/25 17:00:59 wprinz Exp $
+ */
+package at.knowcenter.wag.exactparser.parsing.results;
+
+/**
+ * The ParseResult of a parsing an object header.
+ *
+ * <p>
+ * Note that this information regards only the object header and not the
+ * contents of the object itself. (meaning: next points to the contents and not
+ * to the end of the whole object)
+ * </p>
+ *
+ * @author Administrator
+ */
+public class ObjectHeaderParseResult extends ParseResult {
+
+ /**
+ * The object's object number.
+ */
+ public int object_number = -1;
+
+ /**
+ * The object's generation number.
+ */
+ public int generation_number = -1;
+
+}
diff --git a/src/main/java/at/knowcenter/wag/exactparser/parsing/results/ObjectParseResult.java b/src/main/java/at/knowcenter/wag/exactparser/parsing/results/ObjectParseResult.java
new file mode 100644
index 0000000..4d9c224
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/exactparser/parsing/results/ObjectParseResult.java
@@ -0,0 +1,42 @@
+/**
+ * <copyright> Copyright (c) 2006 by Know-Center, Graz, Austria </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+ * NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
+ * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES.
+ *
+ * $Id: ObjectParseResult.java,v 1.1 2006/08/25 17:00:59 wprinz Exp $
+ */
+package at.knowcenter.wag.exactparser.parsing.results;
+
+
+/**
+ * The ParseResult of parsing an indirect object.
+ * @author wprinz
+ */
+public class ObjectParseResult extends ParseResult {
+
+ public int content_index = -1;
+ public int end_of_content_index = -1;
+
+ public ObjectHeaderParseResult header = null;
+
+/* enum ObjectType
+ {
+ UNKNOWN_TO_PARSER,
+ OBJ_DICTIONARY
+ };
+
+ public ObjectType object_type = ObjectType.UNKNOWN_TO_PARSER;
+ */
+ public ParseResult object = null;
+
+}
diff --git a/src/main/java/at/knowcenter/wag/exactparser/parsing/results/ParseResult.java b/src/main/java/at/knowcenter/wag/exactparser/parsing/results/ParseResult.java
new file mode 100644
index 0000000..d7ad4e9
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/exactparser/parsing/results/ParseResult.java
@@ -0,0 +1,42 @@
+/**
+ * <copyright> Copyright (c) 2006 by Know-Center, Graz, Austria </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+ * NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
+ * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES.
+ *
+ * $Id: ParseResult.java,v 1.1 2006/08/25 17:00:59 wprinz Exp $
+ */
+package at.knowcenter.wag.exactparser.parsing.results;
+
+/**
+ * Base class of all parse results.
+ *
+ * @author wprinz
+ */
+public class ParseResult {
+
+ /**
+ * The start index, where the parser started its work and where the parsed
+ * entity begins.
+ */
+ public int start_index = -1;
+
+ /**
+ * The index of the next entity following the currently parsed entity.
+ *
+ * <p>
+ * This is the index of the first byte not belonging to this entity anymore.
+ * </p>
+ */
+ public int next_index = -1;
+
+}
diff --git a/src/main/java/at/knowcenter/wag/exactparser/parsing/results/StartXRefParseResult.java b/src/main/java/at/knowcenter/wag/exactparser/parsing/results/StartXRefParseResult.java
new file mode 100644
index 0000000..801e04b
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/exactparser/parsing/results/StartXRefParseResult.java
@@ -0,0 +1,28 @@
+/**
+ * <copyright> Copyright (c) 2006 by Know-Center, Graz, Austria </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+ * NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
+ * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES.
+ *
+ * $Id: StartXRefParseResult.java,v 1.1 2006/08/25 17:00:59 wprinz Exp $
+ */
+package at.knowcenter.wag.exactparser.parsing.results;
+
+
+/**
+ * The ParseResult of parsing a startxref entry.
+ * @author wprinz
+ */
+public class StartXRefParseResult extends ParseResult {
+
+ public int xref_index;
+}
diff --git a/src/main/java/at/knowcenter/wag/exactparser/parsing/results/StreamParseResult.java b/src/main/java/at/knowcenter/wag/exactparser/parsing/results/StreamParseResult.java
new file mode 100644
index 0000000..6682d55
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/exactparser/parsing/results/StreamParseResult.java
@@ -0,0 +1,33 @@
+/**
+ * <copyright> Copyright (c) 2006 by Know-Center, Graz, Austria </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+ * NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
+ * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES.
+ *
+ * $Id: StreamParseResult.java,v 1.1 2006/08/25 17:00:59 wprinz Exp $
+ */
+package at.knowcenter.wag.exactparser.parsing.results;
+
+
+/**
+ * The result of parsing a hex string.
+ *
+ * @see at.knowcenter.wag.exactparser.parsing.results.LiteralStringParseResult
+ *
+ * @author wprinz
+ */
+public class StreamParseResult extends ContainerParseResult {
+
+ public DictionaryParseResult stream_dictionary = null;
+
+ public int stream_start_index = -1;
+}
diff --git a/src/main/java/at/knowcenter/wag/exactparser/parsing/results/TrailerParseResult.java b/src/main/java/at/knowcenter/wag/exactparser/parsing/results/TrailerParseResult.java
new file mode 100644
index 0000000..d958cdb
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/exactparser/parsing/results/TrailerParseResult.java
@@ -0,0 +1,76 @@
+/**
+ * <copyright> Copyright (c) 2006 by Know-Center, Graz, Austria </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+ * NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
+ * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES.
+ *
+ * $Id: TrailerParseResult.java,v 1.1 2006/08/25 17:00:59 wprinz Exp $
+ */
+package at.knowcenter.wag.exactparser.parsing.results;
+
+/**
+ * The ParseResult of parsing the trailer.
+ *
+ * @author wprinz
+ */
+public class TrailerParseResult extends ParseResult {
+
+ public int contents_index = -1;
+ public int contents_end_index = -1;
+
+ public DictionaryParseResult dpr = null;
+
+ public IndirectObjectReferenceParseResult info;
+
+ public IndirectObjectReferenceParseResult root;
+
+ /**
+ * The content of the "/Size" entry.
+ */
+ public int size;
+
+ /**
+ * Tells, if this PDF footer has a predecessor (as specified by
+ * the /Prev entry).
+ */
+ public boolean has_predecessor = false;
+
+ /**
+ * The index of the predecessor.
+ *
+ * <p>
+ * Only valid if has_predecessor is true.
+ * </p>
+ * <p>
+ * Use getPrev and setPrev to access this member variable.
+ * </p>
+ *
+ * @see #getPrev()
+ * @see #setPrev(int)
+ */
+ private int prev = -1;
+
+ public int getPrev() {
+ assert has_predecessor;
+ return prev;
+ }
+
+ public void setPrev(int prev) {
+ assert has_predecessor : "Set has_predecessor to true first.";
+ this.prev = prev;
+ }
+
+
+
+
+
+}
diff --git a/src/main/java/at/knowcenter/wag/exactparser/parsing/results/XRefLineParseResult.java b/src/main/java/at/knowcenter/wag/exactparser/parsing/results/XRefLineParseResult.java
new file mode 100644
index 0000000..e04e88d
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/exactparser/parsing/results/XRefLineParseResult.java
@@ -0,0 +1,32 @@
+/**
+ * <copyright> Copyright (c) 2006 by Know-Center, Graz, Austria </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+ * NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
+ * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES.
+ *
+ * $Id: XRefLineParseResult.java,v 1.1 2006/08/25 17:00:59 wprinz Exp $
+ */
+package at.knowcenter.wag.exactparser.parsing.results;
+
+/**
+ * The ParseResult of parsing a single xref line.
+ *
+ * @author wprinz
+ */
+public class XRefLineParseResult extends ParseResult {
+
+ public int object_offset;
+
+ public int generation_number;
+
+ public byte object_usage;
+}
diff --git a/src/main/java/at/knowcenter/wag/exactparser/parsing/results/XRefSectionParseResult.java b/src/main/java/at/knowcenter/wag/exactparser/parsing/results/XRefSectionParseResult.java
new file mode 100644
index 0000000..8b2858c
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/exactparser/parsing/results/XRefSectionParseResult.java
@@ -0,0 +1,58 @@
+/**
+ * <copyright> Copyright (c) 2006 by Know-Center, Graz, Austria </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+ * NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
+ * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES.
+ *
+ * $Id: XRefSectionParseResult.java,v 1.1 2006/08/25 17:00:59 wprinz Exp $
+ */
+package at.knowcenter.wag.exactparser.parsing.results;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * The ParseResult of an xref parsing operation.
+ *
+ * <p>
+ * This contains one whole xref table section. An xref section starts with the
+ * word xref and contains one or more xref sub-sections.
+ * </p>
+ * <p>
+ * Due to Incremental Updates, there may be more than one xref section in a
+ * document. All xref section together are called the xref table. Using this
+ * aggregated xref table, an application has the full access to all indirect
+ * objects in the document.
+ * </p>
+ * <p>
+ * In many PDF libraries and applications one xref section is also informally
+ * called xref table.
+ * </p>
+ *
+ * @author wprinz
+ */
+public class XRefSectionParseResult extends ParseResult
+{
+
+ public List xref_subsections = new ArrayList();
+
+ /**
+ * Appends another cross-reference (xref) sub-section to the xref table.
+ *
+ * @param xref_section
+ * The xref section to be appended.
+ */
+ public void appendXRefSubSection(XRefSubSectionParseResult xref_section)
+ {
+ xref_subsections.add(xref_section);
+ }
+}
diff --git a/src/main/java/at/knowcenter/wag/exactparser/parsing/results/XRefSubSectionParseResult.java b/src/main/java/at/knowcenter/wag/exactparser/parsing/results/XRefSubSectionParseResult.java
new file mode 100644
index 0000000..41982c4
--- /dev/null
+++ b/src/main/java/at/knowcenter/wag/exactparser/parsing/results/XRefSubSectionParseResult.java
@@ -0,0 +1,51 @@
+/**
+ * <copyright> Copyright (c) 2006 by Know-Center, Graz, Austria </copyright>
+ *
+ * This software is the confidential and proprietary information of Know-Center,
+ * Graz, Austria. You shall not disclose such Confidential Information and shall
+ * use it only in accordance with the terms of the license agreement you entered
+ * into with Know-Center.
+ *
+ * KNOW-CENTER MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
+ * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+ * NON-INFRINGEMENT. KNOW-CENTER SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
+ * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
+ * DERIVATIVES.
+ *
+ * $Id: XRefSubSectionParseResult.java,v 1.1 2006/08/25 17:00:59 wprinz Exp $
+ */
+package at.knowcenter.wag.exactparser.parsing.results;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Contains an xref sub-section.
+ *
+ * <p>
+ * An xref sub-section is an ordered list of xref lines. The object numbers of the
+ * corresponding objects are numbered incrementally.
+ * </p>
+ * <p>
+ * xref sections are important in Incremental Updates because they allow to
+ * specify explicitely which objects (object numbers) are contained in the xref.
+ * </p>
+ *
+ * @author wprinz
+ */
+public class XRefSubSectionParseResult extends ParseResult {
+
+ public int start_obj_number;
+
+ public int num_objects;
+
+ public List xref_lines = new ArrayList();
+
+ public void appendXRefLine(XRefLineParseResult xref_line) {
+ assert xref_lines.size() < num_objects;
+
+ xref_lines.add(xref_line);
+ }
+
+}
diff --git a/src/main/java/com/lowagie/bc/asn1/ASN1Encodable.java b/src/main/java/com/lowagie/bc/asn1/ASN1Encodable.java
new file mode 100644
index 0000000..01e0bdc
--- /dev/null
+++ b/src/main/java/com/lowagie/bc/asn1/ASN1Encodable.java
@@ -0,0 +1,65 @@
+package com.lowagie.bc.asn1;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+
+/**
+ * Abstract Syntax Notation One (ASN.1) is a formal language for abstractly describing messages to be exchanged between distributed computer systems.
+ */
+public abstract class ASN1Encodable
+ implements DEREncodable
+{
+ /**
+ * Encodes the ASN1Encodable object.
+ * @return an encoded bytearray
+ * @throws IOException
+ */
+ public byte[] getEncoded()
+ throws IOException
+ {
+ ByteArrayOutputStream bOut = new ByteArrayOutputStream();
+ ASN1OutputStream aOut = new ASN1OutputStream(bOut);
+
+ aOut.writeObject(this);
+
+ return bOut.toByteArray();
+ }
+
+ /**
+ * @see java.lang.Object#hashCode()
+ */
+ public int hashCode()
+ {
+ return this.getDERObject().hashCode();
+ }
+
+ /**
+ * @see java.lang.Object#equals(java.lang.Object)
+ */
+ public boolean equals(
+ Object o)
+ {
+ if ((o == null) || !(o instanceof DEREncodable))
+ {
+ return false;
+ }
+
+ DEREncodable other = (DEREncodable)o;
+
+ return this.getDERObject().equals(other.getDERObject());
+ }
+
+ /**
+ * @see com.lowagie.bc.asn1.DEREncodable#getDERObject()
+ */
+ public DERObject getDERObject()
+ {
+ return this.toASN1Object();
+ }
+
+ /**
+ * Abstract method that returns the object as an ASN1 object.
+ * @return an encodable object
+ */
+ public abstract DERObject toASN1Object();
+}
diff --git a/src/main/java/com/lowagie/bc/asn1/ASN1EncodableVector.java b/src/main/java/com/lowagie/bc/asn1/ASN1EncodableVector.java
new file mode 100644
index 0000000..b702437
--- /dev/null
+++ b/src/main/java/com/lowagie/bc/asn1/ASN1EncodableVector.java
@@ -0,0 +1,9 @@
+package com.lowagie.bc.asn1;
+
+/**
+ * the parent class for this will eventually disappear. Use this one!
+ */
+public class ASN1EncodableVector
+ extends DEREncodableVector
+{
+}
diff --git a/src/main/java/com/lowagie/bc/asn1/ASN1InputStream.java b/src/main/java/com/lowagie/bc/asn1/ASN1InputStream.java
new file mode 100644
index 0000000..1980af3
--- /dev/null
+++ b/src/main/java/com/lowagie/bc/asn1/ASN1InputStream.java
@@ -0,0 +1,450 @@
+package com.lowagie.bc.asn1;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.EOFException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Vector;
+
+/**
+ * a general purpose ASN.1 decoder - note: this class differs from the
+ * others in that it returns null after it has read the last object in
+ * the stream. If an ASN.1 NULL is encountered a DER/BER Null object is
+ * returned.
+ */
+public class ASN1InputStream
+ extends DERInputStream
+{
+ private DERObject END_OF_STREAM = new DERObject() {
+ void encode(
+ DEROutputStream out)
+ throws IOException
+ {
+ throw new IOException("Eeek!");
+ }
+
+ };
+ boolean eofFound = false;
+
+ public ASN1InputStream(
+ InputStream is)
+ {
+ super(is);
+ }
+
+ protected int readLength()
+ throws IOException
+ {
+ int length = read();
+ if (length < 0)
+ {
+ throw new IOException("EOF found when length expected");
+ }
+
+ if (length == 0x80)
+ {
+ return -1; // indefinite-length encoding
+ }
+
+ if (length > 127)
+ {
+ int size = length & 0x7f;
+
+ length = 0;
+ for (int i = 0; i < size; i++)
+ {
+ int next = read();
+
+ if (next < 0)
+ {
+ throw new IOException("EOF found reading length");
+ }
+
+ length = (length << 8) + next;
+ }
+ }
+
+ return length;
+ }
+
+ protected void readFully(
+ byte[] bytes)
+ throws IOException
+ {
+ int left = bytes.length;
+ int len;
+
+ if (left == 0)
+ {
+ return;
+ }
+
+ while ((len = read(bytes, bytes.length - left, left)) > 0)
+ {
+ if ((left -= len) == 0)
+ {
+ return;
+ }
+ }
+
+ if (left != 0)
+ {
+ throw new EOFException("EOF encountered in middle of object");
+ }
+ }
+
+ /**
+ * build an object given its tag and a byte stream to construct it
+ * from.
+ */
+ protected DERObject buildObject(
+ int tag,
+ byte[] bytes)
+ throws IOException
+ {
+ if ((tag & APPLICATION) != 0)
+ {
+ return new DERApplicationSpecific(tag, bytes);
+ }
+
+ switch (tag)
+ {
+ case NULL:
+ return new DERNull();
+ case SEQUENCE | CONSTRUCTED:
+ ByteArrayInputStream bIn = new ByteArrayInputStream(bytes);
+ ASN1InputStream aIn = new ASN1InputStream(bIn);
+ ASN1EncodableVector v = new ASN1EncodableVector();
+
+ DERObject obj = aIn.readObject();
+
+ while (obj != null)
+ {
+ v.add(obj);
+ obj = aIn.readObject();
+ }
+
+ return new DERSequence(v);
+ case SET | CONSTRUCTED:
+ bIn = new ByteArrayInputStream(bytes);
+ aIn = new ASN1InputStream(bIn);
+ v = new ASN1EncodableVector();
+
+ obj = aIn.readObject();
+
+ while (obj != null)
+ {
+ v.add(obj);
+ obj = aIn.readObject();
+ }
+
+ return new DERSet(v);
+ case BOOLEAN:
+ return new DERBoolean(bytes);
+ case INTEGER:
+ return new DERInteger(bytes);
+ case ENUMERATED:
+ return new DEREnumerated(bytes);
+ case OBJECT_IDENTIFIER:
+ return new DERObjectIdentifier(bytes);
+ case BIT_STRING:
+ int padBits = bytes[0];
+ byte[] data = new byte[bytes.length - 1];
+
+ System.arraycopy(bytes, 1, data, 0, bytes.length - 1);
+
+ return new DERBitString(data, padBits);
+ case UTF8_STRING:
+ return new DERUTF8String(bytes);
+ case PRINTABLE_STRING:
+ return new DERPrintableString(bytes);
+ case IA5_STRING:
+ return new DERIA5String(bytes);
+ case T61_STRING:
+ return new DERT61String(bytes);
+ case VISIBLE_STRING:
+ return new DERVisibleString(bytes);
+ case GENERAL_STRING:
+ return new DERGeneralString(bytes);
+ case UNIVERSAL_STRING:
+ return new DERUniversalString(bytes);
+ case BMP_STRING:
+ return new DERBMPString(bytes);
+ case OCTET_STRING:
+ return new DEROctetString(bytes);
+ case UTC_TIME:
+ return new DERUTCTime(bytes);
+ case GENERALIZED_TIME:
+ return new DERGeneralizedTime(bytes);
+ default:
+ //
+ // with tagged object tag number is bottom 5 bits
+ //
+ if ((tag & TAGGED) != 0)
+ {
+ int tagNo = tag & 0x1f;
+
+ if (tagNo == 0x1f)
+ {
+ int idx = 0;
+
+ tagNo = 0;
+
+ while ((bytes[idx] & 0x80) != 0)
+ {
+ tagNo |= (bytes[idx++] & 0x7f);
+ tagNo <<= 7;
+ }
+
+ tagNo |= (bytes[idx] & 0x7f);
+
+ byte[] tmp = bytes;
+
+ bytes = new byte[tmp.length - (idx + 1)];
+ System.arraycopy(tmp, idx + 1, bytes, 0, bytes.length);
+ }
+
+ if (bytes.length == 0) // empty tag!
+ {
+ if ((tag & CONSTRUCTED) == 0)
+ {
+ return new DERTaggedObject(false, tagNo, new DERNull());
+ }
+ else
+ {
+ return new DERTaggedObject(false, tagNo, new DERSequence());
+ }
+ }
+
+ //
+ // simple type - implicit... return an octet string
+ //
+ if ((tag & CONSTRUCTED) == 0)
+ {
+ return new DERTaggedObject(false, tagNo, new DEROctetString(bytes));
+ }
+
+ bIn = new ByteArrayInputStream(bytes);
+ aIn = new ASN1InputStream(bIn);
+
+ DEREncodable dObj = aIn.readObject();
+
+ //
+ // explicitly tagged (probably!) - if it isn't we'd have to
+ // tell from the context
+ //
+ if (aIn.available() == 0)
+ {
+ return new DERTaggedObject(tagNo, dObj);
+ }
+
+ //
+ // another implicit object, we'll create a sequence...
+ //
+ v = new ASN1EncodableVector();
+
+ while (dObj != null)
+ {
+ v.add(dObj);
+ dObj = aIn.readObject();
+ }
+
+ return new DERTaggedObject(false, tagNo, new DERSequence(v));
+ }
+
+ return new DERUnknownTag(tag, bytes);
+ }
+ }
+
+ /**
+ * read a string of bytes representing an indefinite length object.
+ */
+ private byte[] readIndefiniteLengthFully()
+ throws IOException
+ {
+ ByteArrayOutputStream bOut = new ByteArrayOutputStream();
+ int b, b1;
+
+ b1 = read();
+
+ while ((b = read()) >= 0)
+ {
+ if (b1 == 0 && b == 0)
+ {
+ break;
+ }
+
+ bOut.write(b1);
+ b1 = b;
+ }
+
+ return bOut.toByteArray();
+ }
+
+ private BERConstructedOctetString buildConstructedOctetString()
+ throws IOException
+ {
+ Vector octs = new Vector();
+
+ for (;;)
+ {
+ DERObject o = readObject();
+
+ if (o == END_OF_STREAM)
+ {
+ break;
+ }
+
+ octs.addElement(o);
+ }
+
+ return new BERConstructedOctetString(octs);
+ }
+
+ public DERObject readObject()
+ throws IOException
+ {
+ int tag = read();
+ if (tag == -1)
+ {
+ if (eofFound)
+ {
+ throw new EOFException("attempt to read past end of file.");
+ }
+
+ eofFound = true;
+
+ return null;
+ }
+
+ int length = readLength();
+
+ if (length < 0) // indefinite length method
+ {
+ switch (tag)
+ {
+ case NULL:
+ return new BERNull();
+ case SEQUENCE | CONSTRUCTED:
+ ASN1EncodableVector v = new ASN1EncodableVector();
+
+ for (;;)
+ {
+ DERObject obj = readObject();
+
+ if (obj == END_OF_STREAM)
+ {
+ break;
+ }
+
+ v.add(obj);
+ }
+ return new BERSequence(v);
+ case SET | CONSTRUCTED:
+ v = new ASN1EncodableVector();
+
+ for (;;)
+ {
+ DERObject obj = readObject();
+
+ if (obj == END_OF_STREAM)
+ {
+ break;
+ }
+
+ v.add(obj);
+ }
+ return new BERSet(v);
+ case OCTET_STRING | CONSTRUCTED:
+ return buildConstructedOctetString();
+ default:
+ //
+ // with tagged object tag number is bottom 5 bits
+ //
+ if ((tag & TAGGED) != 0)
+ {
+ int tagNo = tag & 0x1f;
+
+ if (tagNo == 0x1f)
+ {
+ int b = read();
+
+ tagNo = 0;
+
+ while ((b >= 0) && ((b & 0x80) != 0))
+ {
+ tagNo |= (b & 0x7f);
+ tagNo <<= 7;
+ b = read();
+ }
+
+ tagNo |= (b & 0x7f);
+ }
+
+ //
+ // simple type - implicit... return an octet string
+ //
+ if ((tag & CONSTRUCTED) == 0)
+ {
+ byte[] bytes = readIndefiniteLengthFully();
+
+ return new BERTaggedObject(false, tagNo, new DEROctetString(bytes));
+ }
+
+ //
+ // either constructed or explicitly tagged
+ //
+ DERObject dObj = readObject();
+
+ if (dObj == END_OF_STREAM) // empty tag!
+ {
+ return new DERTaggedObject(tagNo);
+ }
+
+ DERObject next = readObject();
+
+ //
+ // explicitly tagged (probably!) - if it isn't we'd have to
+ // tell from the context
+ //
+ if (next == END_OF_STREAM)
+ {
+ return new BERTaggedObject(tagNo, dObj);
+ }
+
+ //
+ // another implicit object, we'll create a sequence...
+ //
+ v = new ASN1EncodableVector();
+
+ v.add(dObj);
+
+ do
+ {
+ v.add(next);
+ next = readObject();
+ }
+ while (next != END_OF_STREAM);
+
+ return new BERTaggedObject(false, tagNo, new BERSequence(v));
+ }
+
+ throw new IOException("unknown BER object encountered");
+ }
+ }
+ else
+ {
+ if (tag == 0 && length == 0) // end of contents marker.
+ {
+ return END_OF_STREAM;
+ }
+
+ byte[] bytes = new byte[length];
+
+ readFully(bytes);
+
+ return buildObject(tag, bytes);
+ }
+ }
+}
diff --git a/src/main/java/com/lowagie/bc/asn1/ASN1Null.java b/src/main/java/com/lowagie/bc/asn1/ASN1Null.java
new file mode 100644
index 0000000..4d490d0
--- /dev/null
+++ b/src/main/java/com/lowagie/bc/asn1/ASN1Null.java
@@ -0,0 +1,33 @@
+package com.lowagie.bc.asn1;
+
+import java.io.IOException;
+
+/**
+ * A NULL object.
+ */
+public abstract class ASN1Null
+ extends DERObject
+{
+ public ASN1Null()
+ {
+ }
+
+ public int hashCode()
+ {
+ return 0;
+ }
+
+ public boolean equals(
+ Object o)
+ {
+ if ((o == null) || !(o instanceof ASN1Null))
+ {
+ return false;
+ }
+
+ return true;
+ }
+
+ abstract void encode(DEROutputStream out)
+ throws IOException;
+}
diff --git a/src/main/java/com/lowagie/bc/asn1/ASN1OctetString.java b/src/main/java/com/lowagie/bc/asn1/ASN1OctetString.java
new file mode 100644
index 0000000..bdd6a1b
--- /dev/null
+++ b/src/main/java/com/lowagie/bc/asn1/ASN1OctetString.java
@@ -0,0 +1,141 @@
+package com.lowagie.bc.asn1;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.util.Enumeration;
+import java.util.Vector;
+
+public abstract class ASN1OctetString
+ extends DERObject
+{
+ byte[] string;
+
+ /**
+ * return an Octet String from a tagged object.
+ *
+ * @param obj the tagged object holding the object we want.
+ * @param explicit true if the object is meant to be explicitly
+ * tagged false otherwise.
+ * @exception IllegalArgumentException if the tagged object cannot
+ * be converted.
+ */
+ public static ASN1OctetString getInstance(
+ ASN1TaggedObject obj,
+ boolean explicit)
+ {
+ return getInstance(obj.getObject());
+ }
+
+ /**
+ * return an Octet String from the given object.
+ *
+ * @param obj the object we want converted.
+ * @exception IllegalArgumentException if the object cannot be converted.
+ */
+ public static ASN1OctetString getInstance(
+ Object obj)
+ {
+ if (obj == null || obj instanceof ASN1OctetString)
+ {
+ return (ASN1OctetString)obj;
+ }
+
+ if (obj instanceof ASN1TaggedObject)
+ {
+ return getInstance(((ASN1TaggedObject)obj).getObject());
+ }
+
+ if (obj instanceof ASN1Sequence)
+ {
+ Vector v = new Vector();
+ Enumeration e = ((ASN1Sequence)obj).getObjects();
+
+ while (e.hasMoreElements())
+ {
+ v.addElement(e.nextElement());
+ }
+
+ return new BERConstructedOctetString(v);
+ }
+
+ throw new IllegalArgumentException("illegal object in getInstance: " + obj.getClass().getName());
+ }
+
+ /**
+ * @param string the octets making up the octet string.
+ */
+ public ASN1OctetString(
+ byte[] string)
+ {
+ this.string = string;
+ }
+
+ public ASN1OctetString(
+ DEREncodable obj)
+ {
+ try
+ {
+ ByteArrayOutputStream bOut = new ByteArrayOutputStream();
+ DEROutputStream dOut = new DEROutputStream(bOut);
+
+ dOut.writeObject(obj);
+ dOut.close();
+
+ this.string = bOut.toByteArray();
+ }
+ catch (IOException e)
+ {
+ throw new IllegalArgumentException("Error processing object : " + e.toString());
+ }
+ }
+
+ public byte[] getOctets()
+ {
+ return string;
+ }
+
+ public int hashCode()
+ {
+ byte[] b = this.getOctets();
+ int value = 0;
+
+ for (int i = 0; i != b.length; i++)
+ {
+ value ^= (b[i] & 0xff) << (i % 4);
+ }
+
+ return value;
+ }
+
+ public boolean equals(
+ Object o)
+ {
+ if (o == null || !(o instanceof DEROctetString))
+ {
+ return false;
+ }
+
+ DEROctetString other = (DEROctetString)o;
+
+ byte[] b1 = other.getOctets();
+ byte[] b2 = this.getOctets();
+
+ if (b1.length != b2.length)
+ {
+ return false;
+ }
+
+ for (int i = 0; i != b1.length; i++)
+ {
+ if (b1[i] != b2[i])
+ {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ abstract void encode(DEROutputStream out)
+ throws IOException;
+}
diff --git a/src/main/java/com/lowagie/bc/asn1/ASN1OutputStream.java b/src/main/java/com/lowagie/bc/asn1/ASN1OutputStream.java
new file mode 100644
index 0000000..36a5d39
--- /dev/null
+++ b/src/main/java/com/lowagie/bc/asn1/ASN1OutputStream.java
@@ -0,0 +1,36 @@
+package com.lowagie.bc.asn1;
+
+import java.io.IOException;
+import java.io.OutputStream;
+
+public class ASN1OutputStream
+ extends DEROutputStream
+{
+ public ASN1OutputStream(
+ OutputStream os)
+ {
+ super(os);
+ }
+
+ public void writeObject(
+ Object obj)
+ throws IOException
+ {
+ if (obj == null)
+ {
+ writeNull();
+ }
+ else if (obj instanceof DERObject)
+ {
+ ((DERObject)obj).encode(this);
+ }
+ else if (obj instanceof DEREncodable)
+ {
+ ((DEREncodable)obj).getDERObject().encode(this);
+ }
+ else
+ {
+ throw new IOException("object not ASN1Encodable");
+ }
+ }
+}
diff --git a/src/main/java/com/lowagie/bc/asn1/ASN1Sequence.java b/src/main/java/com/lowagie/bc/asn1/ASN1Sequence.java
new file mode 100644
index 0000000..167d45f
--- /dev/null
+++ b/src/main/java/com/lowagie/bc/asn1/ASN1Sequence.java
@@ -0,0 +1,185 @@
+package com.lowagie.bc.asn1;
+
+import java.io.IOException;
+import java.util.Enumeration;
+import java.util.Vector;
+
+public abstract class ASN1Sequence
+ extends DERObject
+{
+ private Vector seq = new Vector();
+
+ /**
+ * return an ASN1Sequence from the given object.
+ *
+ * @param obj the object we want converted.
+ * @exception IllegalArgumentException if the object cannot be converted.
+ */
+ public static ASN1Sequence getInstance(
+ Object obj)
+ {
+ if (obj == null || obj instanceof ASN1Sequence)
+ {
+ return (ASN1Sequence)obj;
+ }
+
+ throw new IllegalArgumentException("unknown object in getInstance");
+ }
+
+ /**
+ * Return an ASN1 sequence from a tagged object. There is a special
+ * case here, if an object appears to have been explicitly tagged on
+ * reading but we were expecting it to be implictly tagged in the
+ * normal course of events it indicates that we lost the surrounding
+ * sequence - so we need to add it back (this will happen if the tagged
+ * object is a sequence that contains other sequences). If you are
+ * dealing with implicitly tagged sequences you really <b>should</b>
+ * be using this method.
+ *
+ * @param obj the tagged object.
+ * @param explicit true if the object is meant to be explicitly tagged,
+ * false otherwise.
+ * @exception IllegalArgumentException if the tagged object cannot
+ * be converted.
+ */
+ public static ASN1Sequence getInstance(
+ ASN1TaggedObject obj,
+ boolean explicit)
+ {
+ if (explicit)
+ {
+ if (!obj.isExplicit())
+ {
+ throw new IllegalArgumentException("object implicit - explicit expected.");
+ }
+
+ return (ASN1Sequence)obj.getObject();
+ }
+ else
+ {
+ //
+ // constructed object which appears to be explicitly tagged
+ // when it should be implicit means we have to add the
+ // surrounding sequence.
+ //
+ if (obj.isExplicit())
+ {
+ if (obj instanceof BERTaggedObject)
+ {
+ return new BERSequence(obj.getObject());
+ }
+ else
+ {
+ return new DERSequence(obj.getObject());
+ }
+ }
+ else
+ {
+ if (obj.getObject() instanceof ASN1Sequence)
+ {
+ return (ASN1Sequence)obj.getObject();
+ }
+ }
+ }
+
+ throw new IllegalArgumentException(
+ "unknown object in getInstanceFromTagged");
+ }
+
+ public Enumeration getObjects()
+ {
+ return seq.elements();
+ }
+
+ /**
+ * return the object at the sequence postion indicated by index.
+ *
+ * @param index the sequence number (starting at zero) of the object
+ * @return the object at the sequence postion indicated by index.
+ */
+ public DEREncodable getObjectAt(
+ int index)
+ {
+ return (DEREncodable)seq.elementAt(index);
+ }
+
+ /**
+ * return the number of objects in this sequence.
+ *
+ * @return the number of objects in this sequence.
+ */
+ public int size()
+ {
+ return seq.size();
+ }
+
+ public int hashCode()
+ {
+ Enumeration e = this.getObjects();
+ int hashCode = 0;
+
+ while (e.hasMoreElements())
+ {
+ Object o = e.nextElement();
+
+ if (o != null)
+ {
+ hashCode ^= o.hashCode();
+ }
+ }
+
+ return hashCode;
+ }
+
+ public boolean equals(
+ Object o)
+ {
+ if (o == null || !(o instanceof ASN1Sequence))
+ {
+ return false;
+ }
+
+ ASN1Sequence other = (ASN1Sequence)o;
+
+ if (this.size() != other.size())
+ {
+ return false;
+ }
+
+ Enumeration s1 = this.getObjects();
+ Enumeration s2 = other.getObjects();
+
+ while (s1.hasMoreElements())
+ {
+ Object o1 = s1.nextElement();
+ Object o2 = s2.nextElement();
+
+ if (o1 != null && o2 != null)
+ {
+ if (!o1.equals(o2))
+ {
+ return false;
+ }
+ }
+ else if (o1 == null && o2 == null)
+ {
+ continue;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ protected void addObject(
+ DEREncodable obj)
+ {
+ seq.addElement(obj);
+ }
+
+ abstract void encode(DEROutputStream out)
+ throws IOException;
+}
diff --git a/src/main/java/com/lowagie/bc/asn1/ASN1Set.java b/src/main/java/com/lowagie/bc/asn1/ASN1Set.java
new file mode 100644
index 0000000..f0d6c97
--- /dev/null
+++ b/src/main/java/com/lowagie/bc/asn1/ASN1Set.java
@@ -0,0 +1,184 @@
+package com.lowagie.bc.asn1;
+
+import java.io.IOException;
+import java.util.Enumeration;
+import java.util.Vector;
+
+abstract public class ASN1Set
+ extends DERObject
+{
+ protected Vector set = new Vector();
+
+ /**
+ * return an ASN1Set from the given object.
+ *
+ * @param obj the object we want converted.
+ * @exception IllegalArgumentException if the object cannot be converted.
+ */
+ public static ASN1Set getInstance(
+ Object obj)
+ {
+ if (obj == null || obj instanceof ASN1Set)
+ {
+ return (ASN1Set)obj;
+ }
+
+ throw new IllegalArgumentException("unknown object in getInstance");
+ }
+
+ /**
+ * Return an ASN1 set from a tagged object. There is a special
+ * case here, if an object appears to have been explicitly tagged on
+ * reading but we were expecting it to be implictly tagged in the
+ * normal course of events it indicates that we lost the surrounding
+ * set - so we need to add it back (this will happen if the tagged
+ * object is a sequence that contains other sequences). If you are
+ * dealing with implicitly tagged sets you really <b>should</b>
+ * be using this method.
+ *
+ * @param obj the tagged object.
+ * @param explicit true if the object is meant to be explicitly tagged
+ * false otherwise.
+ * @exception IllegalArgumentException if the tagged object cannot
+ * be converted.
+ */
+ public static ASN1Set getInstance(
+ ASN1TaggedObject obj,
+ boolean explicit)
+ {
+ if (explicit)
+ {
+ if (!obj.isExplicit())
+ {
+ throw new IllegalArgumentException("object implicit - explicit expected.");
+ }
+
+ return (ASN1Set)obj.getObject();
+ }
+ else
+ {
+ //
+ // constructed object which appears to be explicitly tagged
+ // and it's really implicit means we have to add the
+ // surrounding sequence.
+ //
+ if (obj.isExplicit())
+ {
+ ASN1Set set = new DERSet(obj.getObject());
+
+ return set;
+ }
+ else
+ {
+ if (obj.getObject() instanceof ASN1Set)
+ {
+ return (ASN1Set)obj.getObject();
+ }
+
+ //
+ // in this case the parser returns a sequence, convert it
+ // into a set.
+ //
+ ASN1EncodableVector v = new ASN1EncodableVector();
+
+ if (obj.getObject() instanceof ASN1Sequence)
+ {
+ ASN1Sequence s = (ASN1Sequence)obj.getObject();
+ Enumeration e = s.getObjects();
+
+ while (e.hasMoreElements())
+ {
+ v.add((DEREncodable)e.nextElement());
+ }
+
+ return new DERSet(v);
+ }
+ }
+ }
+
+ throw new IllegalArgumentException(
+ "unknown object in getInstanceFromTagged");
+ }
+
+ public ASN1Set()
+ {
+ }
+
+ public Enumeration getObjects()
+ {
+ return set.elements();
+ }
+
+ /**
+ * return the object at the set postion indicated by index.
+ *
+ * @param index the set number (starting at zero) of the object
+ * @return the object at the set postion indicated by index.
+ */
+ public DEREncodable getObjectAt(
+ int index)
+ {
+ return (DEREncodable)set.elementAt(index);
+ }
+
+ /**
+ * return the number of objects in this set.
+ *
+ * @return the number of objects in this set.
+ */
+ public int size()
+ {
+ return set.size();
+ }
+
+ public int hashCode()
+ {
+ Enumeration e = this.getObjects();
+ int hashCode = 0;
+
+ while (e.hasMoreElements())
+ {
+ hashCode ^= e.nextElement().hashCode();
+ }
+
+ return hashCode;
+ }
+
+ public boolean equals(
+ Object o)
+ {
+ if (o == null || !(o instanceof ASN1Set))
+ {
+ return false;
+ }
+
+ ASN1Set other = (ASN1Set)o;
+
+ if (this.size() != other.size())
+ {
+ return false;
+ }
+
+ Enumeration s1 = this.getObjects();
+ Enumeration s2 = other.getObjects();
+
+ while (s1.hasMoreElements())
+ {
+ if (!s1.nextElement().equals(s2.nextElement()))
+ {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ protected void addObject(
+ DEREncodable obj)
+ {
+ set.addElement(obj);
+ }
+
+ abstract void encode(DEROutputStream out)
+ throws IOException;
+}
diff --git a/src/main/java/com/lowagie/bc/asn1/ASN1TaggedObject.java b/src/main/java/com/lowagie/bc/asn1/ASN1TaggedObject.java
new file mode 100644
index 0000000..c70cb42
--- /dev/null
+++ b/src/main/java/com/lowagie/bc/asn1/ASN1TaggedObject.java
@@ -0,0 +1,146 @@
+package com.lowagie.bc.asn1;
+
+import java.io.IOException;
+
+/**
+ * ASN.1 TaggedObject - in ASN.1 nottation this is any object proceeded by
+ * a [n] where n is some number - these are assume to follow the construction
+ * rules (as with sequences).
+ */
+public abstract class ASN1TaggedObject
+ extends DERObject
+{
+ int tagNo;
+ boolean empty = false;
+ boolean explicit = true;
+ DEREncodable obj = null;
+
+ static public ASN1TaggedObject getInstance(
+ ASN1TaggedObject obj,
+ boolean explicit)
+ {
+ if (explicit)
+ {
+ return (ASN1TaggedObject)obj.getObject();
+ }
+
+ throw new IllegalArgumentException("implicitly tagged tagged object");
+ }
+
+ /**
+ * @param tagNo the tag number for this object.
+ * @param obj the tagged object.
+ */
+ public ASN1TaggedObject(
+ int tagNo,
+ DEREncodable obj)
+ {
+ this.explicit = true;
+ this.tagNo = tagNo;
+ this.obj = obj;
+ }
+
+ /**
+ * @param explicit true if the object is explicitly tagged.
+ * @param tagNo the tag number for this object.
+ * @param obj the tagged object.
+ */
+ public ASN1TaggedObject(
+ boolean explicit,
+ int tagNo,
+ DEREncodable obj)
+ {
+ this.explicit = explicit;
+ this.tagNo = tagNo;
+ this.obj = obj;
+ }
+
+ public boolean equals(
+ Object o)
+ {
+ if (o == null || !(o instanceof ASN1TaggedObject))
+ {
+ return false;
+ }
+
+ ASN1TaggedObject other = (ASN1TaggedObject)o;
+
+ if (tagNo != other.tagNo || empty != other.empty || explicit != other.explicit)
+ {
+ return false;
+ }
+
+ if(obj == null)
+ {
+ if(other.obj != null)
+ {
+ return false;
+ }
+ }
+ else
+ {
+ if(!(obj.equals(other.obj)))
+ {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ public int hashCode()
+ {
+ int code = tagNo;
+
+ if (obj != null)
+ {
+ code ^= obj.hashCode();
+ }
+
+ return code;
+ }
+
+ public int getTagNo()
+ {
+ return tagNo;
+ }
+
+ /**
+ * return whether or not the object may be explicitly tagged.
+ * <p>
+ * Note: if the object has been read from an input stream, the only
+ * time you can be sure if isExplicit is returning the true state of
+ * affairs is if it returns false. An implicitly tagged object may appear
+ * to be explicitly tagged, so you need to understand the context under
+ * which the reading was done as well, see getObject below.
+ */
+ public boolean isExplicit()
+ {
+ return explicit;
+ }
+
+ public boolean isEmpty()
+ {
+ return empty;
+ }
+
+ /**
+ * return whatever was following the tag.
+ * <p>
+ * Note: tagged objects are generally context dependent if you're
+ * trying to extract a tagged object you should be going via the
+ * appropriate getInstance method.
+ */
+ public DERObject getObject()
+ {
+ if (obj != null)
+ {
+ return obj.getDERObject();
+ }
+
+ return null;
+ }
+
+ abstract void encode(DEROutputStream out)
+ throws IOException;
+}
diff --git a/src/main/java/com/lowagie/bc/asn1/BERConstructedOctetString.java b/src/main/java/com/lowagie/bc/asn1/BERConstructedOctetString.java
new file mode 100644
index 0000000..5c44187
--- /dev/null
+++ b/src/main/java/com/lowagie/bc/asn1/BERConstructedOctetString.java
@@ -0,0 +1,168 @@
+package com.lowagie.bc.asn1;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.util.Enumeration;
+import java.util.Vector;
+
+public class BERConstructedOctetString
+ extends DEROctetString
+{
+ /**
+ * convert a vector of octet strings into a single byte string
+ */
+ static private byte[] toBytes(
+ Vector octs)
+ {
+ ByteArrayOutputStream bOut = new ByteArrayOutputStream();
+
+ for (int i = 0; i != octs.size(); i++)
+ {
+ DEROctetString o = (DEROctetString)octs.elementAt(i);
+
+ try
+ {
+ bOut.write(o.getOctets());
+ }
+ catch (IOException e)
+ {
+ throw new RuntimeException("exception converting octets " + e.toString());
+ }
+ }
+
+ return bOut.toByteArray();
+ }
+
+ private Vector octs;
+
+ /**
+ * @param string the octets making up the octet string.
+ */
+ public BERConstructedOctetString(
+ byte[] string)
+ {
+ super(string);
+ }
+
+ public BERConstructedOctetString(
+ Vector octs)
+ {
+ super(toBytes(octs));
+
+ this.octs = octs;
+ }
+
+ public BERConstructedOctetString(
+ DERObject obj)
+ {
+ super(obj);
+ }
+
+ public BERConstructedOctetString(
+ DEREncodable obj)
+ {
+ super(obj.getDERObject());
+ }
+
+ public byte[] getOctets()
+ {
+ return string;
+ }
+
+ /**
+ * return the DER octets that make up this string.
+ */
+ public Enumeration getObjects()
+ {
+ if (octs == null)
+ {
+ return generateOcts().elements();
+ }
+
+ return octs.elements();
+ }
+
+ private Vector generateOcts()
+ {
+ int start = 0;
+ int end = 0;
+ Vector vec = new Vector();
+
+ while ((end + 1) < string.length)
+ {
+ if (string[end] == 0 && string[end + 1] == 0)
+ {
+ byte[] nStr = new byte[end - start + 1];
+
+ System.arraycopy(string, start, nStr, 0, nStr.length);
+
+ vec.addElement(new DEROctetString(nStr));
+ start = end + 1;
+ }
+ end++;
+ }
+
+ byte[] nStr = new byte[string.length - start];
+
+ System.arraycopy(string, start, nStr, 0, nStr.length);
+
+ vec.addElement(new DEROctetString(nStr));
+
+ return vec;
+ }
+
+ public void encode(
+ DEROutputStream out)
+ throws IOException
+ {
+ if (out instanceof ASN1OutputStream || out instanceof BEROutputStream)
+ {
+ out.write(CONSTRUCTED | OCTET_STRING);
+
+ out.write(0x80);
+
+ //
+ // write out the octet array
+ //
+ if (octs != null)
+ {
+ for (int i = 0; i != octs.size(); i++)
+ {
+ out.writeObject(octs.elementAt(i));
+ }
+ }
+ else
+ {
+ int start = 0;
+ int end = 0;
+
+ while ((end + 1) < string.length)
+ {
+ if (string[end] == 0 && string[end + 1] == 0)
+ {
+ byte[] nStr = new byte[end - start + 1];
+
+ System.arraycopy(string, start, nStr, 0, nStr.length);
+
+ out.writeObject(new DEROctetString(nStr));
+ start = end + 1;
+ }
+ end++;
+ }
+
+ byte[] nStr = new byte[string.length - start];
+
+ System.arraycopy(string, start, nStr, 0, nStr.length);
+
+ out.writeObject(new DEROctetString(nStr));
+ }
+
+ out.write(0x00);
+ out.write(0x00);
+ }
+ else
+ {
+ super.encode(out);
+ }
+ }
+}
diff --git a/src/main/java/com/lowagie/bc/asn1/BERConstructedSequence.java b/src/main/java/com/lowagie/bc/asn1/BERConstructedSequence.java
new file mode 100644
index 0000000..2d5d081
--- /dev/null
+++ b/src/main/java/com/lowagie/bc/asn1/BERConstructedSequence.java
@@ -0,0 +1,34 @@
+package com.lowagie.bc.asn1;
+
+import java.io.IOException;
+import java.util.Enumeration;
+
+public class BERConstructedSequence
+ extends DERConstructedSequence
+{
+ /*
+ */
+ void encode(
+ DEROutputStream out)
+ throws IOException
+ {
+ if (out instanceof ASN1OutputStream || out instanceof BEROutputStream)
+ {
+ out.write(SEQUENCE | CONSTRUCTED);
+ out.write(0x80);
+
+ Enumeration e = getObjects();
+ while (e.hasMoreElements())
+ {
+ out.writeObject(e.nextElement());
+ }
+
+ out.write(0x00);
+ out.write(0x00);
+ }
+ else
+ {
+ super.encode(out);
+ }
+ }
+}
diff --git a/src/main/java/com/lowagie/bc/asn1/BERInputStream.java b/src/main/java/com/lowagie/bc/asn1/BERInputStream.java
new file mode 100644
index 0000000..395c1e7
--- /dev/null
+++ b/src/main/java/com/lowagie/bc/asn1/BERInputStream.java
@@ -0,0 +1,197 @@
+package com.lowagie.bc.asn1;
+
+import java.io.ByteArrayOutputStream;
+import java.io.EOFException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Vector;
+
+public class BERInputStream
+ extends DERInputStream
+{
+ private DERObject END_OF_STREAM = new DERObject() {
+ void encode(
+ DEROutputStream out)
+ throws IOException
+ {
+ throw new IOException("Eeek!");
+ }
+
+ };
+ public BERInputStream(
+ InputStream is)
+ {
+ super(is);
+ }
+
+ /**
+ * read a string of bytes representing an indefinite length object.
+ */
+ private byte[] readIndefiniteLengthFully()
+ throws IOException
+ {
+ ByteArrayOutputStream bOut = new ByteArrayOutputStream();
+ int b, b1;
+
+ b1 = read();
+
+ while ((b = read()) >= 0)
+ {
+ if (b1 == 0 && b == 0)
+ {
+ break;
+ }
+
+ bOut.write(b1);
+ b1 = b;
+ }
+
+ return bOut.toByteArray();
+ }
+
+ private BERConstructedOctetString buildConstructedOctetString()
+ throws IOException
+ {
+ Vector octs = new Vector();
+
+ for (;;)
+ {
+ DERObject o = readObject();
+
+ if (o == END_OF_STREAM)
+ {
+ break;
+ }
+
+ octs.addElement(o);
+ }
+
+ return new BERConstructedOctetString(octs);
+ }
+
+ public DERObject readObject()
+ throws IOException
+ {
+ int tag = read();
+ if (tag == -1)
+ {
+ throw new EOFException();
+ }
+
+ int length = readLength();
+
+ if (length < 0) // indefinite length method
+ {
+ switch (tag)
+ {
+ case NULL:
+ return null;
+ case SEQUENCE | CONSTRUCTED:
+ BERConstructedSequence seq = new BERConstructedSequence();
+
+ for (;;)
+ {
+ DERObject obj = readObject();
+
+ if (obj == END_OF_STREAM)
+ {
+ break;
+ }
+
+ seq.addObject(obj);
+ }
+ return seq;
+ case OCTET_STRING | CONSTRUCTED:
+ return buildConstructedOctetString();
+ case SET | CONSTRUCTED:
+ ASN1EncodableVector v = new ASN1EncodableVector();
+
+ for (;;)
+ {
+ DERObject obj = readObject();
+
+ if (obj == END_OF_STREAM)
+ {
+ break;
+ }
+
+ v.add(obj);
+ }
+ return new BERSet(v);
+ default:
+ //
+ // with tagged object tag number is bottom 5 bits
+ //
+ if ((tag & TAGGED) != 0)
+ {
+ if ((tag & 0x1f) == 0x1f)
+ {
+ throw new IOException("unsupported high tag encountered");
+ }
+
+ //
+ // simple type - implicit... return an octet string
+ //
+ if ((tag & CONSTRUCTED) == 0)
+ {
+ byte[] bytes = readIndefiniteLengthFully();
+
+ return new BERTaggedObject(false, tag & 0x1f, new DEROctetString(bytes));
+ }
+
+ //
+ // either constructed or explicitly tagged
+ //
+ DERObject dObj = readObject();
+
+ if (dObj == END_OF_STREAM) // empty tag!
+ {
+ return new DERTaggedObject(tag & 0x1f);
+ }
+
+ DERObject next = readObject();
+
+ //
+ // explicitly tagged (probably!) - if it isn't we'd have to
+ // tell from the context
+ //
+ if (next == END_OF_STREAM)
+ {
+ return new BERTaggedObject(tag & 0x1f, dObj);
+ }
+
+ //
+ // another implicit object, we'll create a sequence...
+ //
+ seq = new BERConstructedSequence();
+
+ seq.addObject(dObj);
+
+ do
+ {
+ seq.addObject(next);
+ next = readObject();
+ }
+ while (next != END_OF_STREAM);
+
+ return new BERTaggedObject(false, tag & 0x1f, seq);
+ }
+
+ throw new IOException("unknown BER object encountered");
+ }
+ }
+ else
+ {
+ if (tag == 0 && length == 0) // end of contents marker.
+ {
+ return END_OF_STREAM;
+ }
+
+ byte[] bytes = new byte[length];
+
+ readFully(bytes);
+
+ return buildObject(tag, bytes);
+ }
+ }
+}
diff --git a/src/main/java/com/lowagie/bc/asn1/BERNull.java b/src/main/java/com/lowagie/bc/asn1/BERNull.java
new file mode 100644
index 0000000..868691f
--- /dev/null
+++ b/src/main/java/com/lowagie/bc/asn1/BERNull.java
@@ -0,0 +1,30 @@
+package com.lowagie.bc.asn1;
+
+import java.io.IOException;
+
+/**
+ * A BER NULL object.
+ */
+public class BERNull
+ extends DERNull
+{
+ public BERNull()
+ {
+ }
+
+ void encode(
+ DEROutputStream out)
+ throws IOException
+ {
+ if (out instanceof ASN1OutputStream || out instanceof BEROutputStream)
+ {
+ out.write(NULL);
+ out.write(0);
+ out.write(0);
+ }
+ else
+ {
+ super.encode(out);
+ }
+ }
+}
diff --git a/src/main/java/com/lowagie/bc/asn1/BEROutputStream.java b/src/main/java/com/lowagie/bc/asn1/BEROutputStream.java
new file mode 100644
index 0000000..9ae1126
--- /dev/null
+++ b/src/main/java/com/lowagie/bc/asn1/BEROutputStream.java
@@ -0,0 +1,36 @@
+package com.lowagie.bc.asn1;
+
+import java.io.IOException;
+import java.io.OutputStream;
+
+public class BEROutputStream
+ extends DEROutputStream
+{
+ public BEROutputStream(
+ OutputStream os)
+ {
+ super(os);
+ }
+
+ public void writeObject(
+ Object obj)
+ throws IOException
+ {
+ if (obj == null)
+ {
+ writeNull();
+ }
+ else if (obj instanceof DERObject)
+ {
+ ((DERObject)obj).encode(this);
+ }
+ else if (obj instanceof DEREncodable)
+ {
+ ((DEREncodable)obj).getDERObject().encode(this);
+ }
+ else
+ {
+ throw new IOException("object not BEREncodable");
+ }
+ }
+}
diff --git a/src/main/java/com/lowagie/bc/asn1/BERSequence.java b/src/main/java/com/lowagie/bc/asn1/BERSequence.java
new file mode 100644
index 0000000..5654568
--- /dev/null
+++ b/src/main/java/com/lowagie/bc/asn1/BERSequence.java
@@ -0,0 +1,59 @@
+package com.lowagie.bc.asn1;
+
+import java.io.IOException;
+import java.util.Enumeration;
+
+public class BERSequence
+ extends DERSequence
+{
+ /**
+ * create an empty sequence
+ */
+ public BERSequence()
+ {
+ }
+
+ /**
+ * create a sequence containing one object
+ */
+ public BERSequence(
+ DEREncodable obj)
+ {
+ super(obj);
+ }
+
+ /**
+ * create a sequence containing a vector of objects.
+ */
+ public BERSequence(
+ DEREncodableVector v)
+ {
+ super(v);
+ }
+
+ /*
+ */
+ void encode(
+ DEROutputStream out)
+ throws IOException
+ {
+ if (out instanceof ASN1OutputStream || out instanceof BEROutputStream)
+ {
+ out.write(SEQUENCE | CONSTRUCTED);
+ out.write(0x80);
+
+ Enumeration e = getObjects();
+ while (e.hasMoreElements())
+ {
+ out.writeObject(e.nextElement());
+ }
+
+ out.write(0x00);
+ out.write(0x00);
+ }
+ else
+ {
+ super.encode(out);
+ }
+ }
+}
diff --git a/src/main/java/com/lowagie/bc/asn1/BERSet.java b/src/main/java/com/lowagie/bc/asn1/BERSet.java
new file mode 100644
index 0000000..0f608dc
--- /dev/null
+++ b/src/main/java/com/lowagie/bc/asn1/BERSet.java
@@ -0,0 +1,59 @@
+package com.lowagie.bc.asn1;
+
+import java.io.IOException;
+import java.util.Enumeration;
+
+public class BERSet
+ extends DERSet
+{
+ /**
+ * create an empty sequence
+ */
+ public BERSet()
+ {
+ }
+
+ /**
+ * create a set containing one object
+ */
+ public BERSet(
+ DEREncodable obj)
+ {
+ super(obj);
+ }
+
+ /**
+ * create a set containing a vector of objects.
+ */
+ public BERSet(
+ DEREncodableVector v)
+ {
+ super(v);
+ }
+
+ /*
+ */
+ void encode(
+ DEROutputStream out)
+ throws IOException
+ {
+ if (out instanceof ASN1OutputStream || out instanceof BEROutputStream)
+ {
+ out.write(SET | CONSTRUCTED);
+ out.write(0x80);
+
+ Enumeration e = getObjects();
+ while (e.hasMoreElements())
+ {
+ out.writeObject(e.nextElement());
+ }
+
+ out.write(0x00);
+ out.write(0x00);
+ }
+ else
+ {
+ super.encode(out);
+ }
+ }
+}
diff --git a/src/main/java/com/lowagie/bc/asn1/BERTaggedObject.java b/src/main/java/com/lowagie/bc/asn1/BERTaggedObject.java
new file mode 100644
index 0000000..203bc22
--- /dev/null
+++ b/src/main/java/com/lowagie/bc/asn1/BERTaggedObject.java
@@ -0,0 +1,119 @@
+package com.lowagie.bc.asn1;
+
+import java.io.IOException;
+import java.util.Enumeration;
+
+/**
+ * BER TaggedObject - in ASN.1 nottation this is any object proceeded by
+ * a [n] where n is some number - these are assume to follow the construction
+ * rules (as with sequences).
+ */
+public class BERTaggedObject
+ extends DERTaggedObject
+{
+ /**
+ * @param tagNo the tag number for this object.
+ * @param obj the tagged object.
+ */
+ public BERTaggedObject(
+ int tagNo,
+ DEREncodable obj)
+ {
+ super(tagNo, obj);
+ }
+
+ /**
+ * @param explicit true if an explicitly tagged object.
+ * @param tagNo the tag number for this object.
+ * @param obj the tagged object.
+ */
+ public BERTaggedObject(
+ boolean explicit,
+ int tagNo,
+ DEREncodable obj)
+ {
+ super(explicit, tagNo, obj);
+ }
+
+ /**
+ * create an implicitly tagged object that contains a zero
+ * length sequence.
+ */
+ public BERTaggedObject(
+ int tagNo)
+ {
+ super(false, tagNo, new BERConstructedSequence());
+ }
+
+ void encode(
+ DEROutputStream out)
+ throws IOException
+ {
+ if (out instanceof ASN1OutputStream || out instanceof BEROutputStream)
+ {
+ out.write(CONSTRUCTED | TAGGED | tagNo);
+ out.write(0x80);
+
+ if (!empty)
+ {
+ if (!explicit)
+ {
+ if (obj instanceof ASN1OctetString)
+ {
+ Enumeration e;
+
+ if (obj instanceof BERConstructedOctetString)
+ {
+ e = ((BERConstructedOctetString)obj).getObjects();
+ }
+ else
+ {
+ ASN1OctetString octs = (ASN1OctetString)obj;
+ BERConstructedOctetString berO = new BERConstructedOctetString(octs.getOctets());
+
+ e = berO.getObjects();
+ }
+
+ while (e.hasMoreElements())
+ {
+ out.writeObject(e.nextElement());
+ }
+ }
+ else if (obj instanceof ASN1Sequence)
+ {
+ Enumeration e = ((ASN1Sequence)obj).getObjects();
+
+ while (e.hasMoreElements())
+ {
+ out.writeObject(e.nextElement());
+ }
+ }
+ else if (obj instanceof ASN1Set)
+ {
+ Enumeration e = ((ASN1Set)obj).getObjects();
+
+ while (e.hasMoreElements())
+ {
+ out.writeObject(e.nextElement());
+ }
+ }
+ else
+ {
+ throw new RuntimeException("not implemented: " + obj.getClass().getName());
+ }
+ }
+ else
+ {
+ out.writeObject(obj);
+ }
+ }
+
+ out.write(0x00);
+ out.write(0x00);
+ }
+ else
+ {
+ super.encode(out);
+ }
+ }
+}
diff --git a/src/main/java/com/lowagie/bc/asn1/DERApplicationSpecific.java b/src/main/java/com/lowagie/bc/asn1/DERApplicationSpecific.java
new file mode 100644
index 0000000..2ef11d4
--- /dev/null
+++ b/src/main/java/com/lowagie/bc/asn1/DERApplicationSpecific.java
@@ -0,0 +1,67 @@
+package com.lowagie.bc.asn1;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+
+/**
+ * Base class for an application specific object
+ */
+public class DERApplicationSpecific
+ extends DERObject
+{
+ private int tag;
+ private byte[] octets;
+
+ public DERApplicationSpecific(
+ int tag,
+ byte[] octets)
+ {
+ this.tag = tag;
+ this.octets = octets;
+ }
+
+ public DERApplicationSpecific(
+ int tag,
+ DEREncodable object)
+ throws IOException
+ {
+ this.tag = tag | DERTags.CONSTRUCTED;
+
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ DEROutputStream dos = new DEROutputStream(baos);
+
+ dos.writeObject(object);
+
+ this.octets = baos.toByteArray();
+ }
+
+ public boolean isConstructed()
+ {
+ return (tag & DERTags.CONSTRUCTED) != 0;
+ }
+
+ public byte[] getContents()
+ {
+ return octets;
+ }
+
+ public int getApplicationTag()
+ {
+ return tag & 0x1F;
+ }
+
+ public DERObject getObject()
+ throws IOException
+ {
+ return new ASN1InputStream(new ByteArrayInputStream(getContents())).readObject();
+ }
+
+ /* (non-Javadoc)
+ * @see org.bouncycastle.asn1.DERObject#encode(org.bouncycastle.asn1.DEROutputStream)
+ */
+ void encode(DEROutputStream out) throws IOException
+ {
+ out.writeEncoded(DERTags.APPLICATION | tag, octets);
+ }
+}
diff --git a/src/main/java/com/lowagie/bc/asn1/DERBMPString.java b/src/main/java/com/lowagie/bc/asn1/DERBMPString.java
new file mode 100644
index 0000000..2e712e8
--- /dev/null
+++ b/src/main/java/com/lowagie/bc/asn1/DERBMPString.java
@@ -0,0 +1,121 @@
+package com.lowagie.bc.asn1;
+
+import java.io.IOException;
+
+/**
+ * DER BMPString object.
+ */
+public class DERBMPString
+ extends DERObject
+ implements DERString
+{
+ String string;
+
+ /**
+ * return a BMP String from the given object.
+ *
+ * @param obj the object we want converted.
+ * @exception IllegalArgumentException if the object cannot be converted.
+ */
+ public static DERBMPString getInstance(
+ Object obj)
+ {
+ if (obj == null || obj instanceof DERBMPString)
+ {
+ return (DERBMPString)obj;
+ }
+
+ if (obj instanceof ASN1OctetString)
+ {
+ return new DERBMPString(((ASN1OctetString)obj).getOctets());
+ }
+
+ if (obj instanceof ASN1TaggedObject)
+ {
+ return getInstance(((ASN1TaggedObject)obj).getObject());
+ }
+
+ throw new IllegalArgumentException("illegal object in getInstance: " + obj.getClass().getName());
+ }
+
+ /**
+ * return a BMP String from a tagged object.
+ *
+ * @param obj the tagged object holding the object we want
+ * @param explicit true if the object is meant to be explicitly
+ * tagged false otherwise.
+ * @exception IllegalArgumentException if the tagged object cannot
+ * be converted.
+ */
+ public static DERBMPString getInstance(
+ ASN1TaggedObject obj,
+ boolean explicit)
+ {
+ return getInstance(obj.getObject());
+ }
+
+
+ /**
+ * basic constructor - byte encoded string.
+ */
+ public DERBMPString(
+ byte[] string)
+ {
+ char[] cs = new char[string.length / 2];
+
+ for (int i = 0; i != cs.length; i++)
+ {
+ cs[i] = (char)((string[2 * i] << 8) | (string[2 * i + 1] & 0xff));
+ }
+
+ this.string = new String(cs);
+ }
+
+ /**
+ * basic constructor
+ */
+ public DERBMPString(
+ String string)
+ {
+ this.string = string;
+ }
+
+ public String getString()
+ {
+ return string;
+ }
+
+ public int hashCode()
+ {
+ return this.getString().hashCode();
+ }
+
+ public boolean equals(
+ Object o)
+ {
+ if (!(o instanceof DERBMPString))
+ {
+ return false;
+ }
+
+ DERBMPString s = (DERBMPString)o;
+
+ return this.getString().equals(s.getString());
+ }
+
+ void encode(
+ DEROutputStream out)
+ throws IOException
+ {
+ char[] c = string.toCharArray();
+ byte[] b = new byte[c.length * 2];
+
+ for (int i = 0; i != c.length; i++)
+ {
+ b[2 * i] = (byte)(c[i] >> 8);
+ b[2 * i + 1] = (byte)c[i];
+ }
+
+ out.writeEncoded(BMP_STRING, b);
+ }
+}
diff --git a/src/main/java/com/lowagie/bc/asn1/DERBitString.java b/src/main/java/com/lowagie/bc/asn1/DERBitString.java
new file mode 100644
index 0000000..a5acd39
--- /dev/null
+++ b/src/main/java/com/lowagie/bc/asn1/DERBitString.java
@@ -0,0 +1,268 @@
+package com.lowagie.bc.asn1;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+
+public class DERBitString
+ extends DERObject
+ implements DERString
+{
+ private static final char[] table = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
+
+ protected byte[] data;
+ protected int padBits;
+
+ /**
+ * return the correct number of pad bits for a bit string defined in
+ * a 32 bit constant
+ */
+ static protected int getPadBits(
+ int bitString)
+ {
+ int val = 0;
+ for (int i = 3; i >= 0; i--)
+ {
+ //
+ // this may look a little odd, but if it isn't done like this pre jdk1.2
+ // JVM's break!
+ //
+ if (i != 0)
+ {
+ if ((bitString >> (i * 8)) != 0)
+ {
+ val = (bitString >> (i * 8)) & 0xFF;
+ break;
+ }
+ }
+ else
+ {
+ if (bitString != 0)
+ {
+ val = bitString & 0xFF;
+ break;
+ }
+ }
+ }
+
+ if (val == 0)
+ {
+ return 7;
+ }
+
+
+ int bits = 1;
+
+ while (((val <<= 1) & 0xFF) != 0)
+ {
+ bits++;
+ }
+
+ return 8 - bits;
+ }
+
+ /**
+ * return the correct number of bytes for a bit string defined in
+ * a 32 bit constant
+ */
+ static protected byte[] getBytes(int bitString)
+ {
+ int bytes = 4;
+ for (int i = 3; i >= 1; i--)
+ {
+ if ((bitString & (0xFF << (i * 8))) != 0)
+ {
+ break;
+ }
+ bytes--;
+ }
+
+ byte[] result = new byte[bytes];
+ for (int i = 0; i < bytes; i++)
+ {
+ result[i] = (byte) ((bitString >> (i * 8)) & 0xFF);
+ }
+
+ return result;
+ }
+
+ /**
+ * return a Bit String from the passed in object
+ *
+ * @exception IllegalArgumentException if the object cannot be converted.
+ */
+ public static DERBitString getInstance(
+ Object obj)
+ {
+ if (obj == null || obj instanceof DERBitString)
+ {
+ return (DERBitString)obj;
+ }
+
+ if (obj instanceof ASN1OctetString)
+ {
+ byte[] bytes = ((ASN1OctetString)obj).getOctets();
+ int padBits = bytes[0];
+ byte[] data = new byte[bytes.length - 1];
+
+ System.arraycopy(bytes, 1, data, 0, bytes.length - 1);
+
+ return new DERBitString(data, padBits);
+ }
+
+ if (obj instanceof ASN1TaggedObject)
+ {
+ return getInstance(((ASN1TaggedObject)obj).getObject());
+ }
+
+ throw new IllegalArgumentException("illegal object in getInstance: " + obj.getClass().getName());
+ }
+
+ /**
+ * return a Bit String from a tagged object.
+ *
+ * @param obj the tagged object holding the object we want
+ * @param explicit true if the object is meant to be explicitly
+ * tagged false otherwise.
+ * @exception IllegalArgumentException if the tagged object cannot
+ * be converted.
+ */
+ public static DERBitString getInstance(
+ ASN1TaggedObject obj,
+ boolean explicit)
+ {
+ return getInstance(obj.getObject());
+ }
+
+ protected DERBitString(
+ byte data,
+ int padBits)
+ {
+ this.data = new byte[1];
+ this.data[0] = data;
+ this.padBits = padBits;
+ }
+
+ /**
+ * @param data the octets making up the bit string.
+ * @param padBits the number of extra bits at the end of the string.
+ */
+ public DERBitString(
+ byte[] data,
+ int padBits)
+ {
+ this.data = data;
+ this.padBits = padBits;
+ }
+
+ public DERBitString(
+ byte[] data)
+ {
+ this(data, 0);
+ }
+
+ public DERBitString(
+ DEREncodable obj)
+ {
+ try
+ {
+ ByteArrayOutputStream bOut = new ByteArrayOutputStream();
+ DEROutputStream dOut = new DEROutputStream(bOut);
+
+ dOut.writeObject(obj);
+ dOut.close();
+
+ this.data = bOut.toByteArray();
+ this.padBits = 0;
+ }
+ catch (IOException e)
+ {
+ throw new IllegalArgumentException("Error processing object : " + e.toString());
+ }
+ }
+
+ public byte[] getBytes()
+ {
+ return data;
+ }
+
+ public int getPadBits()
+ {
+ return padBits;
+ }
+
+ void encode(
+ DEROutputStream out)
+ throws IOException
+ {
+ byte[] bytes = new byte[getBytes().length + 1];
+
+ bytes[0] = (byte)getPadBits();
+ System.arraycopy(getBytes(), 0, bytes, 1, bytes.length - 1);
+
+ out.writeEncoded(BIT_STRING, bytes);
+ }
+
+ public int hashCode()
+ {
+ int value = 0;
+
+ for (int i = 0; i != data.length; i++)
+ {
+ value ^= (data[i] & 0xff) << (i % 4);
+ }
+
+ return value;
+ }
+
+ public boolean equals(
+ Object o)
+ {
+ if (o == null || !(o instanceof DERBitString))
+ {
+ return false;
+ }
+
+ DERBitString other = (DERBitString)o;
+
+ if (data.length != other.data.length)
+ {
+ return false;
+ }
+
+ for (int i = 0; i != data.length; i++)
+ {
+ if (data[i] != other.data[i])
+ {
+ return false;
+ }
+ }
+
+ return (padBits == other.padBits);
+ }
+
+ public String getString()
+ {
+ StringBuffer buf = new StringBuffer("#");
+ ByteArrayOutputStream bOut = new ByteArrayOutputStream();
+ ASN1OutputStream aOut = new ASN1OutputStream(bOut);
+
+ try
+ {
+ aOut.writeObject(this);
+ }
+ catch (IOException e)
+ {
+ throw new RuntimeException("internal error encoding BitString");
+ }
+
+ byte[] string = bOut.toByteArray();
+
+ for (int i = 0; i != string.length; i++)
+ {
+ buf.append(table[(string[i] >>> 4) % 0xf]);
+ buf.append(table[string[i] & 0xf]);
+ }
+
+ return buf.toString();
+ }
+}
diff --git a/src/main/java/com/lowagie/bc/asn1/DERBoolean.java b/src/main/java/com/lowagie/bc/asn1/DERBoolean.java
new file mode 100644
index 0000000..5b6d1bf
--- /dev/null
+++ b/src/main/java/com/lowagie/bc/asn1/DERBoolean.java
@@ -0,0 +1,103 @@
+package com.lowagie.bc.asn1;
+
+import java.io.IOException;
+
+public class DERBoolean
+ extends DERObject
+{
+ byte value;
+
+ public static final DERBoolean FALSE = new DERBoolean(false);
+ public static final DERBoolean TRUE = new DERBoolean(true);
+
+ /**
+ * return a boolean from the passed in object.
+ *
+ * @exception IllegalArgumentException if the object cannot be converted.
+ */
+ public static DERBoolean getInstance(
+ Object obj)
+ {
+ if (obj == null || obj instanceof DERBoolean)
+ {
+ return (DERBoolean)obj;
+ }
+
+ if (obj instanceof ASN1OctetString)
+ {
+ return new DERBoolean(((ASN1OctetString)obj).getOctets());
+ }
+
+ if (obj instanceof ASN1TaggedObject)
+ {
+ return getInstance(((ASN1TaggedObject)obj).getObject());
+ }
+
+ throw new IllegalArgumentException("illegal object in getInstance: " + obj.getClass().getName());
+ }
+
+ /**
+ * return a DERBoolean from the passed in boolean.
+ */
+ public static DERBoolean getInstance(
+ boolean value)
+ {
+ return (value ? TRUE : FALSE);
+ }
+
+ /**
+ * return a Boolean from a tagged object.
+ *
+ * @param obj the tagged object holding the object we want
+ * @param explicit true if the object is meant to be explicitly
+ * tagged false otherwise.
+ * @exception IllegalArgumentException if the tagged object cannot
+ * be converted.
+ */
+ public static DERBoolean getInstance(
+ ASN1TaggedObject obj,
+ boolean explicit)
+ {
+ return getInstance(obj.getObject());
+ }
+
+ public DERBoolean(
+ byte[] value)
+ {
+ this.value = value[0];
+ }
+
+ public DERBoolean(
+ boolean value)
+ {
+ this.value = (value) ? (byte)0xff : (byte)0;
+ }
+
+ public boolean isTrue()
+ {
+ return (value != 0);
+ }
+
+ void encode(
+ DEROutputStream out)
+ throws IOException
+ {
+ byte[] bytes = new byte[1];
+
+ bytes[0] = value;
+
+ out.writeEncoded(BOOLEAN, bytes);
+ }
+
+ public boolean equals(
+ Object o)
+ {
+ if ((o == null) || !(o instanceof DERBoolean))
+ {
+ return false;
+ }
+
+ return (value == ((DERBoolean)o).value);
+ }
+
+}
diff --git a/src/main/java/com/lowagie/bc/asn1/DERConstructedSequence.java b/src/main/java/com/lowagie/bc/asn1/DERConstructedSequence.java
new file mode 100644
index 0000000..607e53b
--- /dev/null
+++ b/src/main/java/com/lowagie/bc/asn1/DERConstructedSequence.java
@@ -0,0 +1,53 @@
+package com.lowagie.bc.asn1;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.util.Enumeration;
+
+/**
+ * //@deprecated use DERSequence.
+ */
+public class DERConstructedSequence
+ extends ASN1Sequence
+{
+ public void addObject(
+ DEREncodable obj)
+ {
+ super.addObject(obj);
+ }
+
+ public int getSize()
+ {
+ return size();
+ }
+
+ /*
+ * A note on the implementation:
+ * <p>
+ * As DER requires the constructed, definite-length model to
+ * be used for structured types, this varies slightly from the
+ * ASN.1 descriptions given. Rather than just outputing SEQUENCE,
+ * we also have to specify CONSTRUCTED, and the objects length.
+ */
+ void encode(
+ DEROutputStream out)
+ throws IOException
+ {
+ ByteArrayOutputStream bOut = new ByteArrayOutputStream();
+ DEROutputStream dOut = new DEROutputStream(bOut);
+ Enumeration e = this.getObjects();
+
+ while (e.hasMoreElements())
+ {
+ Object obj = e.nextElement();
+
+ dOut.writeObject(obj);
+ }
+
+ dOut.close();
+
+ byte[] bytes = bOut.toByteArray();
+
+ out.writeEncoded(SEQUENCE | CONSTRUCTED, bytes);
+ }
+}
diff --git a/src/main/java/com/lowagie/bc/asn1/DERConstructedSet.java b/src/main/java/com/lowagie/bc/asn1/DERConstructedSet.java
new file mode 100644
index 0000000..7f52ca1
--- /dev/null
+++ b/src/main/java/com/lowagie/bc/asn1/DERConstructedSet.java
@@ -0,0 +1,75 @@
+package com.lowagie.bc.asn1;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.util.Enumeration;
+
+public class DERConstructedSet
+ extends ASN1Set
+{
+ public DERConstructedSet()
+ {
+ }
+
+ /**
+ * @param obj - a single object that makes up the set.
+ */
+ public DERConstructedSet(
+ DEREncodable obj)
+ {
+ this.addObject(obj);
+ }
+
+ /**
+ * @param v - a vector of objects making up the set.
+ */
+ public DERConstructedSet(
+ DEREncodableVector v)
+ {
+ for (int i = 0; i != v.size(); i++)
+ {
+ this.addObject(v.get(i));
+ }
+ }
+
+ public void addObject(
+ DEREncodable obj)
+ {
+ super.addObject(obj);
+ }
+
+ public int getSize()
+ {
+ return size();
+ }
+
+ /*
+ * A note on the implementation:
+ * <p>
+ * As DER requires the constructed, definite-length model to
+ * be used for structured types, this varies slightly from the
+ * ASN.1 descriptions given. Rather than just outputing SET,
+ * we also have to specify CONSTRUCTED, and the objects length.
+ */
+ void encode(
+ DEROutputStream out)
+ throws IOException
+ {
+ ByteArrayOutputStream bOut = new ByteArrayOutputStream();
+ DEROutputStream dOut = new DEROutputStream(bOut);
+ Enumeration e = this.getObjects();
+
+ while (e.hasMoreElements())
+ {
+ Object obj = e.nextElement();
+
+ dOut.writeObject(obj);
+ }
+
+ dOut.close();
+
+ byte[] bytes = bOut.toByteArray();
+
+ out.writeEncoded(SET | CONSTRUCTED, bytes);
+ }
+}
diff --git a/src/main/java/com/lowagie/bc/asn1/DEREncodable.java b/src/main/java/com/lowagie/bc/asn1/DEREncodable.java
new file mode 100644
index 0000000..322ffc0
--- /dev/null
+++ b/src/main/java/com/lowagie/bc/asn1/DEREncodable.java
@@ -0,0 +1,6 @@
+package com.lowagie.bc.asn1;
+
+public interface DEREncodable
+{
+ public DERObject getDERObject();
+}
diff --git a/src/main/java/com/lowagie/bc/asn1/DEREncodableVector.java b/src/main/java/com/lowagie/bc/asn1/DEREncodableVector.java
new file mode 100644
index 0000000..24d4c51
--- /dev/null
+++ b/src/main/java/com/lowagie/bc/asn1/DEREncodableVector.java
@@ -0,0 +1,30 @@
+package com.lowagie.bc.asn1;
+
+import java.util.Vector;
+
+/**
+ * a general class for building up a vector of DER encodable objects -
+ * this will eventually be superceded by ASN1EncodableVector so you should
+ * use that class in preference.
+ */
+public class DEREncodableVector
+{
+ private Vector v = new Vector();
+
+ public void add(
+ DEREncodable obj)
+ {
+ v.addElement(obj);
+ }
+
+ public DEREncodable get(
+ int i)
+ {
+ return (DEREncodable)v.elementAt(i);
+ }
+
+ public int size()
+ {
+ return v.size();
+ }
+}
diff --git a/src/main/java/com/lowagie/bc/asn1/DEREnumerated.java b/src/main/java/com/lowagie/bc/asn1/DEREnumerated.java
new file mode 100644
index 0000000..36b3f98
--- /dev/null
+++ b/src/main/java/com/lowagie/bc/asn1/DEREnumerated.java
@@ -0,0 +1,108 @@
+package com.lowagie.bc.asn1;
+
+import java.io.IOException;
+import java.math.BigInteger;
+
+public class DEREnumerated
+ extends DERObject
+{
+ byte[] bytes;
+
+ /**
+ * return an integer from the passed in object
+ *
+ * @exception IllegalArgumentException if the object cannot be converted.
+ */
+ public static DEREnumerated getInstance(
+ Object obj)
+ {
+ if (obj == null || obj instanceof DEREnumerated)
+ {
+ return (DEREnumerated)obj;
+ }
+
+ if (obj instanceof ASN1OctetString)
+ {
+ return new DEREnumerated(((ASN1OctetString)obj).getOctets());
+ }
+
+ if (obj instanceof ASN1TaggedObject)
+ {
+ return getInstance(((ASN1TaggedObject)obj).getObject());
+ }
+
+ throw new IllegalArgumentException("illegal object in getInstance: " + obj.getClass().getName());
+ }
+
+ /**
+ * return an Enumerated from a tagged object.
+ *
+ * @param obj the tagged object holding the object we want
+ * @param explicit true if the object is meant to be explicitly
+ * tagged false otherwise.
+ * @exception IllegalArgumentException if the tagged object cannot
+ * be converted.
+ */
+ public static DEREnumerated getInstance(
+ ASN1TaggedObject obj,
+ boolean explicit)
+ {
+ return getInstance(obj.getObject());
+ }
+
+ public DEREnumerated(
+ int value)
+ {
+ bytes = BigInteger.valueOf(value).toByteArray();
+ }
+
+ public DEREnumerated(
+ BigInteger value)
+ {
+ bytes = value.toByteArray();
+ }
+
+ public DEREnumerated(
+ byte[] bytes)
+ {
+ this.bytes = bytes;
+ }
+
+ public BigInteger getValue()
+ {
+ return new BigInteger(bytes);
+ }
+
+ void encode(
+ DEROutputStream out)
+ throws IOException
+ {
+ out.writeEncoded(ENUMERATED, bytes);
+ }
+
+ public boolean equals(
+ Object o)
+ {
+ if (o == null || !(o instanceof DEREnumerated))
+ {
+ return false;
+ }
+
+ DEREnumerated other = (DEREnumerated)o;
+
+ if (bytes.length != other.bytes.length)
+ {
+ return false;
+ }
+
+ for (int i = 0; i != bytes.length; i++)
+ {
+ if (bytes[i] != other.bytes[i])
+ {
+ return false;
+ }
+ }
+
+ return true;
+ }
+}
diff --git a/src/main/java/com/lowagie/bc/asn1/DERGeneralString.java b/src/main/java/com/lowagie/bc/asn1/DERGeneralString.java
new file mode 100644
index 0000000..641620b
--- /dev/null
+++ b/src/main/java/com/lowagie/bc/asn1/DERGeneralString.java
@@ -0,0 +1,86 @@
+package com.lowagie.bc.asn1;
+
+import java.io.IOException;
+
+public class DERGeneralString
+ extends DERObject implements DERString
+{
+ private String string;
+
+ public static DERGeneralString getInstance(
+ Object obj)
+ {
+ if (obj == null || obj instanceof DERGeneralString)
+ {
+ return (DERGeneralString) obj;
+ }
+ if (obj instanceof ASN1OctetString)
+ {
+ return new DERGeneralString(((ASN1OctetString) obj).getOctets());
+ }
+ if (obj instanceof ASN1TaggedObject)
+ {
+ return getInstance(((ASN1TaggedObject) obj).getObject());
+ }
+ throw new IllegalArgumentException("illegal object in getInstance: "
+ + obj.getClass().getName());
+ }
+
+ public static DERGeneralString getInstance(
+ ASN1TaggedObject obj,
+ boolean explicit)
+ {
+ return getInstance(obj.getObject());
+ }
+
+ public DERGeneralString(byte[] string)
+ {
+ char[] cs = new char[string.length];
+ for (int i = 0; i != cs.length; i++) {
+ cs[i] = (char) (string[i] & 0xff);
+ }
+ this.string = new String(cs);
+ }
+
+ public DERGeneralString(String string)
+ {
+ this.string = string;
+ }
+
+ public String getString()
+ {
+ return string;
+ }
+
+ public byte[] getOctets()
+ {
+ char[] cs = string.toCharArray();
+ byte[] bs = new byte[cs.length];
+ for (int i = 0; i != cs.length; i++)
+ {
+ bs[i] = (byte) cs[i];
+ }
+ return bs;
+ }
+
+ void encode(DEROutputStream out)
+ throws IOException
+ {
+ out.writeEncoded(GENERAL_STRING, this.getOctets());
+ }
+
+ public int hashCode()
+ {
+ return this.getString().hashCode();
+ }
+
+ public boolean equals(Object o)
+ {
+ if (!(o instanceof DERGeneralString))
+ {
+ return false;
+ }
+ DERGeneralString s = (DERGeneralString) o;
+ return this.getString().equals(s.getString());
+ }
+}
diff --git a/src/main/java/com/lowagie/bc/asn1/DERGeneralizedTime.java b/src/main/java/com/lowagie/bc/asn1/DERGeneralizedTime.java
new file mode 100644
index 0000000..28cab51
--- /dev/null
+++ b/src/main/java/com/lowagie/bc/asn1/DERGeneralizedTime.java
@@ -0,0 +1,188 @@
+package com.lowagie.bc.asn1;
+
+import java.io.IOException;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.SimpleTimeZone;
+
+/**
+ * Generalized time object.
+ */
+public class DERGeneralizedTime
+ extends DERObject
+{
+ String time;
+
+ /**
+ * return a generalized time from the passed in object
+ *
+ * @exception IllegalArgumentException if the object cannot be converted.
+ */
+ public static DERGeneralizedTime getInstance(
+ Object obj)
+ {
+ if (obj == null || obj instanceof DERGeneralizedTime)
+ {
+ return (DERGeneralizedTime)obj;
+ }
+
+ if (obj instanceof ASN1OctetString)
+ {
+ return new DERGeneralizedTime(((ASN1OctetString)obj).getOctets());
+ }
+
+ throw new IllegalArgumentException("illegal object in getInstance: " + obj.getClass().getName());
+ }
+
+ /**
+ * return a Generalized Time object from a tagged object.
+ *
+ * @param obj the tagged object holding the object we want
+ * @param explicit true if the object is meant to be explicitly
+ * tagged false otherwise.
+ * @exception IllegalArgumentException if the tagged object cannot
+ * be converted.
+ */
+ public static DERGeneralizedTime getInstance(
+ ASN1TaggedObject obj,
+ boolean explicit)
+ {
+ return getInstance(obj.getObject());
+ }
+
+ /**
+ * The correct format for this is YYYYMMDDHHMMSSZ, or without the Z
+ * for local time, or Z+-HHMM on the end, for difference between local
+ * time and UTC time.
+ * <p>
+ *
+ * @param time the time string.
+ */
+ public DERGeneralizedTime(
+ String time)
+ {
+ this.time = time;
+ }
+
+ /**
+ * base constructer from a java.util.date object
+ */
+ public DERGeneralizedTime(
+ Date time)
+ {
+ SimpleDateFormat dateF = new SimpleDateFormat("yyyyMMddHHmmss'Z'");
+
+ dateF.setTimeZone(new SimpleTimeZone(0,"Z"));
+
+ this.time = dateF.format(time);
+ }
+
+ DERGeneralizedTime(
+ byte[] bytes)
+ {
+ //
+ // explicitly convert to characters
+ //
+ char[] dateC = new char[bytes.length];
+
+ for (int i = 0; i != dateC.length; i++)
+ {
+ dateC[i] = (char)(bytes[i] & 0xff);
+ }
+
+ this.time = new String(dateC);
+ }
+
+ /**
+ * return the time - always in the form of
+ * YYYYMMDDhhmmssGMT(+hh:mm|-hh:mm).
+ * <p>
+ * Normally in a certificate we would expect "Z" rather than "GMT",
+ * however adding the "GMT" means we can just use:
+ * <pre>
+ * dateF = new SimpleDateFormat("yyyyMMddHHmmssz");
+ * </pre>
+ * To read in the time and get a date which is compatible with our local
+ * time zone.
+ */
+ public String getTime()
+ {
+ //
+ // standardise the format.
+ //
+ if (time.charAt(time.length() - 1) == 'Z')
+ {
+ return time.substring(0, time.length() - 1) + "GMT+00:00";
+ }
+ else
+ {
+ int signPos = time.length() - 5;
+ char sign = time.charAt(signPos);
+ if (sign == '-' || sign == '+')
+ {
+ return time.substring(0, signPos)
+ + "GMT"
+ + time.substring(signPos, signPos + 3)
+ + ":"
+ + time.substring(signPos + 3);
+ }
+ else
+ {
+ signPos = time.length() - 3;
+ sign = time.charAt(signPos);
+ if (sign == '-' || sign == '+')
+ {
+ return time.substring(0, signPos)
+ + "GMT"
+ + time.substring(signPos)
+ + ":00";
+ }
+ }
+ }
+
+ return time;
+ }
+
+ public Date getDate()
+ throws ParseException
+ {
+ SimpleDateFormat dateF = new SimpleDateFormat("yyyyMMddHHmmss'Z'");
+
+ dateF.setTimeZone(new SimpleTimeZone(0, "Z"));
+
+ return dateF.parse(time);
+ }
+
+ private byte[] getOctets()
+ {
+ char[] cs = time.toCharArray();
+ byte[] bs = new byte[cs.length];
+
+ for (int i = 0; i != cs.length; i++)
+ {
+ bs[i] = (byte)cs[i];
+ }
+
+ return bs;
+ }
+
+
+ void encode(
+ DEROutputStream out)
+ throws IOException
+ {
+ out.writeEncoded(GENERALIZED_TIME, this.getOctets());
+ }
+
+ public boolean equals(
+ Object o)
+ {
+ if ((o == null) || !(o instanceof DERGeneralizedTime))
+ {
+ return false;
+ }
+
+ return time.equals(((DERGeneralizedTime)o).time);
+ }
+}
diff --git a/src/main/java/com/lowagie/bc/asn1/DERIA5String.java b/src/main/java/com/lowagie/bc/asn1/DERIA5String.java
new file mode 100644
index 0000000..d60cdc6
--- /dev/null
+++ b/src/main/java/com/lowagie/bc/asn1/DERIA5String.java
@@ -0,0 +1,123 @@
+package com.lowagie.bc.asn1;
+
+import java.io.IOException;
+
+/**
+ * DER IA5String object - this is an ascii string.
+ */
+public class DERIA5String
+ extends DERObject
+ implements DERString
+{
+ String string;
+
+ /**
+ * return a IA5 string from the passed in object
+ *
+ * @exception IllegalArgumentException if the object cannot be converted.
+ */
+ public static DERIA5String getInstance(
+ Object obj)
+ {
+ if (obj == null || obj instanceof DERIA5String)
+ {
+ return (DERIA5String)obj;
+ }
+
+ if (obj instanceof ASN1OctetString)
+ {
+ return new DERIA5String(((ASN1OctetString)obj).getOctets());
+ }
+
+ if (obj instanceof ASN1TaggedObject)
+ {
+ return getInstance(((ASN1TaggedObject)obj).getObject());
+ }
+
+ throw new IllegalArgumentException("illegal object in getInstance: " + obj.getClass().getName());
+ }
+
+ /**
+ * return an IA5 String from a tagged object.
+ *
+ * @param obj the tagged object holding the object we want
+ * @param explicit true if the object is meant to be explicitly
+ * tagged false otherwise.
+ * @exception IllegalArgumentException if the tagged object cannot
+ * be converted.
+ */
+ public static DERIA5String getInstance(
+ ASN1TaggedObject obj,
+ boolean explicit)
+ {
+ return getInstance(obj.getObject());
+ }
+
+ /**
+ * basic constructor - with bytes.
+ */
+ public DERIA5String(
+ byte[] string)
+ {
+ char[] cs = new char[string.length];
+
+ for (int i = 0; i != cs.length; i++)
+ {
+ cs[i] = (char)(string[i] & 0xff);
+ }
+
+ this.string = new String(cs);
+ }
+
+ /**
+ * basic constructor - with string.
+ */
+ public DERIA5String(
+ String string)
+ {
+ this.string = string;
+ }
+
+ public String getString()
+ {
+ return string;
+ }
+
+ public byte[] getOctets()
+ {
+ char[] cs = string.toCharArray();
+ byte[] bs = new byte[cs.length];
+
+ for (int i = 0; i != cs.length; i++)
+ {
+ bs[i] = (byte)cs[i];
+ }
+
+ return bs;
+ }
+
+ void encode(
+ DEROutputStream out)
+ throws IOException
+ {
+ out.writeEncoded(IA5_STRING, this.getOctets());
+ }
+
+ public int hashCode()
+ {
+ return this.getString().hashCode();
+ }
+
+ public boolean equals(
+ Object o)
+ {
+ if (!(o instanceof DERIA5String))
+ {
+ return false;
+ }
+
+ DERIA5String s = (DERIA5String)o;
+
+ return this.getString().equals(s.getString());
+ }
+}
diff --git a/src/main/java/com/lowagie/bc/asn1/DERInputStream.java b/src/main/java/com/lowagie/bc/asn1/DERInputStream.java
new file mode 100644
index 0000000..3148a3f
--- /dev/null
+++ b/src/main/java/com/lowagie/bc/asn1/DERInputStream.java
@@ -0,0 +1,258 @@
+package com.lowagie.bc.asn1;
+
+import java.io.ByteArrayInputStream;
+import java.io.EOFException;
+import java.io.FilterInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+/**
+ * Don't use this class. It will eventually disappear, use ASN1InputStream.
+ * <br>
+ * This class is scheduled for removal.
+ */
+public class DERInputStream
+ extends FilterInputStream implements DERTags
+{
+ public DERInputStream(
+ InputStream is)
+ {
+ super(is);
+ }
+
+ protected int readLength()
+ throws IOException
+ {
+ int length = read();
+ if (length < 0)
+ {
+ throw new IOException("EOF found when length expected");
+ }
+
+ if (length == 0x80)
+ {
+ return -1; // indefinite-length encoding
+ }
+
+ if (length > 127)
+ {
+ int size = length & 0x7f;
+
+ length = 0;
+ for (int i = 0; i < size; i++)
+ {
+ int next = read();
+
+ if (next < 0)
+ {
+ throw new IOException("EOF found reading length");
+ }
+
+ length = (length << 8) + next;
+ }
+ }
+
+ return length;
+ }
+
+ protected void readFully(
+ byte[] bytes)
+ throws IOException
+ {
+ int left = bytes.length;
+
+ if (left == 0)
+ {
+ return;
+ }
+
+ while (left > 0)
+ {
+ int l = read(bytes, bytes.length - left, left);
+
+ if (l < 0)
+ {
+ throw new EOFException("unexpected end of stream");
+ }
+
+ left -= l;
+ }
+ }
+
+ /**
+ * build an object given its tag and a byte stream to construct it
+ * from.
+ */
+ protected DERObject buildObject(
+ int tag,
+ byte[] bytes)
+ throws IOException
+ {
+ switch (tag)
+ {
+ case NULL:
+ return null;
+ case SEQUENCE | CONSTRUCTED:
+ ByteArrayInputStream bIn = new ByteArrayInputStream(bytes);
+ BERInputStream dIn = new BERInputStream(bIn);
+ DERConstructedSequence seq = new DERConstructedSequence();
+
+ try
+ {
+ for (;;)
+ {
+ DERObject obj = dIn.readObject();
+
+ seq.addObject(obj);
+ }
+ }
+ catch (EOFException ex)
+ {
+ return seq;
+ }
+ case SET | CONSTRUCTED:
+ bIn = new ByteArrayInputStream(bytes);
+ dIn = new BERInputStream(bIn);
+
+ ASN1EncodableVector v = new ASN1EncodableVector();
+
+ try
+ {
+ for (;;)
+ {
+ DERObject obj = dIn.readObject();
+
+ v.add(obj);
+ }
+ }
+ catch (EOFException ex)
+ {
+ return new DERConstructedSet(v);
+ }
+ case BOOLEAN:
+ return new DERBoolean(bytes);
+ case INTEGER:
+ return new DERInteger(bytes);
+ case ENUMERATED:
+ return new DEREnumerated(bytes);
+ case OBJECT_IDENTIFIER:
+ return new DERObjectIdentifier(bytes);
+ case BIT_STRING:
+ int padBits = bytes[0];
+ byte[] data = new byte[bytes.length - 1];
+
+ System.arraycopy(bytes, 1, data, 0, bytes.length - 1);
+
+ return new DERBitString(data, padBits);
+ case UTF8_STRING:
+ return new DERUTF8String(bytes);
+ case PRINTABLE_STRING:
+ return new DERPrintableString(bytes);
+ case IA5_STRING:
+ return new DERIA5String(bytes);
+ case T61_STRING:
+ return new DERT61String(bytes);
+ case VISIBLE_STRING:
+ return new DERVisibleString(bytes);
+ case UNIVERSAL_STRING:
+ return new DERUniversalString(bytes);
+ case GENERAL_STRING:
+ return new DERGeneralString(bytes);
+ case BMP_STRING:
+ return new DERBMPString(bytes);
+ case OCTET_STRING:
+ return new DEROctetString(bytes);
+ case UTC_TIME:
+ return new DERUTCTime(bytes);
+ case GENERALIZED_TIME:
+ return new DERGeneralizedTime(bytes);
+ default:
+ //
+ // with tagged object tag number is bottom 5 bits
+ //
+ if ((tag & TAGGED) != 0)
+ {
+ if ((tag & 0x1f) == 0x1f)
+ {
+ throw new IOException("unsupported high tag encountered");
+ }
+
+ if (bytes.length == 0) // empty tag!
+ {
+ if ((tag & CONSTRUCTED) == 0)
+ {
+ return new DERTaggedObject(false, tag & 0x1f, new DERNull());
+ }
+ else
+ {
+ return new DERTaggedObject(false, tag & 0x1f, new DERConstructedSequence());
+ }
+ }
+
+ //
+ // simple type - implicit... return an octet string
+ //
+ if ((tag & CONSTRUCTED) == 0)
+ {
+ return new DERTaggedObject(false, tag & 0x1f, new DEROctetString(bytes));
+ }
+
+ bIn = new ByteArrayInputStream(bytes);
+ dIn = new BERInputStream(bIn);
+
+ DEREncodable dObj = dIn.readObject();
+
+ //
+ // explicitly tagged (probably!) - if it isn't we'd have to
+ // tell from the context
+ //
+ if (dIn.available() == 0)
+ {
+ return new DERTaggedObject(tag & 0x1f, dObj);
+ }
+
+ //
+ // another implicit object, we'll create a sequence...
+ //
+ seq = new DERConstructedSequence();
+
+ seq.addObject(dObj);
+
+ try
+ {
+ for (;;)
+ {
+ dObj = dIn.readObject();
+
+ seq.addObject(dObj);
+ }
+ }
+ catch (EOFException ex)
+ {
+ // ignore --
+ }
+
+ return new DERTaggedObject(false, tag & 0x1f, seq);
+ }
+
+ return new DERUnknownTag(tag, bytes);
+ }
+ }
+
+ public DERObject readObject()
+ throws IOException
+ {
+ int tag = read();
+ if (tag == -1)
+ {
+ throw new EOFException();
+ }
+
+ int length = readLength();
+ byte[] bytes = new byte[length];
+
+ readFully(bytes);
+
+ return buildObject(tag, bytes);
+ }
+}
diff --git a/src/main/java/com/lowagie/bc/asn1/DERInteger.java b/src/main/java/com/lowagie/bc/asn1/DERInteger.java
new file mode 100644
index 0000000..9df0d62
--- /dev/null
+++ b/src/main/java/com/lowagie/bc/asn1/DERInteger.java
@@ -0,0 +1,129 @@
+package com.lowagie.bc.asn1;
+
+import java.io.IOException;
+import java.math.BigInteger;
+
+public class DERInteger
+ extends DERObject
+{
+ byte[] bytes;
+
+ /**
+ * return an integer from the passed in object
+ *
+ * @exception IllegalArgumentException if the object cannot be converted.
+ */
+ public static DERInteger getInstance(
+ Object obj)
+ {
+ if (obj == null || obj instanceof DERInteger)
+ {
+ return (DERInteger)obj;
+ }
+
+ if (obj instanceof ASN1OctetString)
+ {
+ return new DERInteger(((ASN1OctetString)obj).getOctets());
+ }
+
+ if (obj instanceof ASN1TaggedObject)
+ {
+ return getInstance(((ASN1TaggedObject)obj).getObject());
+ }
+
+ throw new IllegalArgumentException("illegal object in getInstance: " + obj.getClass().getName());
+ }
+
+ /**
+ * return an Integer from a tagged object.
+ *
+ * @param obj the tagged object holding the object we want
+ * @param explicit true if the object is meant to be explicitly
+ * tagged false otherwise.
+ * @exception IllegalArgumentException if the tagged object cannot
+ * be converted.
+ */
+ public static DERInteger getInstance(
+ ASN1TaggedObject obj,
+ boolean explicit)
+ {
+ return getInstance(obj.getObject());
+ }
+
+ public DERInteger(
+ int value)
+ {
+ bytes = BigInteger.valueOf(value).toByteArray();
+ }
+
+ public DERInteger(
+ BigInteger value)
+ {
+ bytes = value.toByteArray();
+ }
+
+ public DERInteger(
+ byte[] bytes)
+ {
+ this.bytes = bytes;
+ }
+
+ public BigInteger getValue()
+ {
+ return new BigInteger(bytes);
+ }
+
+ /**
+ * in some cases positive values get crammed into a space,
+ * that's not quite big enough...
+ */
+ public BigInteger getPositiveValue()
+ {
+ return new BigInteger(1, bytes);
+ }
+
+ void encode(
+ DEROutputStream out)
+ throws IOException
+ {
+ out.writeEncoded(INTEGER, bytes);
+ }
+
+ public int hashCode()
+ {
+ int value = 0;
+
+ for (int i = 0; i != bytes.length; i++)
+ {
+ value ^= (bytes[i] & 0xff) << (i % 4);
+ }
+
+ return value;
+ }
+
+ public boolean equals(
+ Object o)
+ {
+ if (o == null || !(o instanceof DERInteger))
+ {
+ return false;
+ }
+
+ DERInteger other = (DERInteger)o;
+
+ if (bytes.length != other.bytes.length)
+ {
+ return false;
+ }
+
+ for (int i = 0; i != bytes.length; i++)
+ {
+ if (bytes[i] != other.bytes[i])
+ {
+ return false;
+ }
+ }
+
+ return true;
+ }
+}
diff --git a/src/main/java/com/lowagie/bc/asn1/DERNull.java b/src/main/java/com/lowagie/bc/asn1/DERNull.java
new file mode 100644
index 0000000..3ce810a
--- /dev/null
+++ b/src/main/java/com/lowagie/bc/asn1/DERNull.java
@@ -0,0 +1,34 @@
+package com.lowagie.bc.asn1;
+
+import java.io.IOException;
+
+/**
+ * A NULL object.
+ */
+public class DERNull
+ extends ASN1Null
+{
+ byte[] zeroBytes = new byte[0];
+
+ public DERNull()
+ {
+ }
+
+ void encode(
+ DEROutputStream out)
+ throws IOException
+ {
+ out.writeEncoded(NULL, zeroBytes);
+ }
+
+ public boolean equals(
+ Object o)
+ {
+ if ((o == null) || !(o instanceof DERNull))
+ {
+ return false;
+ }
+
+ return true;
+ }
+}
diff --git a/src/main/java/com/lowagie/bc/asn1/DERNumericString.java b/src/main/java/com/lowagie/bc/asn1/DERNumericString.java
new file mode 100644
index 0000000..6d58c6c
--- /dev/null
+++ b/src/main/java/com/lowagie/bc/asn1/DERNumericString.java
@@ -0,0 +1,123 @@
+package com.lowagie.bc.asn1;
+
+import java.io.IOException;
+
+/**
+ * DER NumericString object - this is an ascii string of characters {0,1,2,3,4,5,6,7,8,9, }.
+ */
+public class DERNumericString
+ extends DERObject
+ implements DERString
+{
+ String string;
+
+ /**
+ * return a Numeric string from the passed in object
+ *
+ * @exception IllegalArgumentException if the object cannot be converted.
+ */
+ public static DERNumericString getInstance(
+ Object obj)
+ {
+ if (obj == null || obj instanceof DERNumericString)
+ {
+ return (DERNumericString)obj;
+ }
+
+ if (obj instanceof ASN1OctetString)
+ {
+ return new DERNumericString(((ASN1OctetString)obj).getOctets());
+ }
+
+ if (obj instanceof ASN1TaggedObject)
+ {
+ return getInstance(((ASN1TaggedObject)obj).getObject());
+ }
+
+ throw new IllegalArgumentException("illegal object in getInstance: " + obj.getClass().getName());
+ }
+
+ /**
+ * return an Numeric String from a tagged object.
+ *
+ * @param obj the tagged object holding the object we want
+ * @param explicit true if the object is meant to be explicitly
+ * tagged false otherwise.
+ * @exception IllegalArgumentException if the tagged object cannot
+ * be converted.
+ */
+ public static DERNumericString getInstance(
+ ASN1TaggedObject obj,
+ boolean explicit)
+ {
+ return getInstance(obj.getObject());
+ }
+
+ /**
+ * basic constructor - with bytes.
+ */
+ public DERNumericString(
+ byte[] string)
+ {
+ char[] cs = new char[string.length];
+
+ for (int i = 0; i != cs.length; i++)
+ {
+ cs[i] = (char)(string[i] & 0xff);
+ }
+
+ this.string = new String(cs);
+ }
+
+ /**
+ * basic constructor - with string.
+ */
+ public DERNumericString(
+ String string)
+ {
+ this.string = string;
+ }
+
+ public String getString()
+ {
+ return string;
+ }
+
+ public byte[] getOctets()
+ {
+ char[] cs = string.toCharArray();
+ byte[] bs = new byte[cs.length];
+
+ for (int i = 0; i != cs.length; i++)
+ {
+ bs[i] = (byte)cs[i];
+ }
+
+ return bs;
+ }
+
+ void encode(
+ DEROutputStream out)
+ throws IOException
+ {
+ out.writeEncoded(NUMERIC_STRING, this.getOctets());
+ }
+
+ public int hashCode()
+ {
+ return this.getString().hashCode();
+ }
+
+ public boolean equals(
+ Object o)
+ {
+ if (!(o instanceof DERNumericString))
+ {
+ return false;
+ }
+
+ DERNumericString s = (DERNumericString)o;
+
+ return this.getString().equals(s.getString());
+ }
+}
diff --git a/src/main/java/com/lowagie/bc/asn1/DERObject.java b/src/main/java/com/lowagie/bc/asn1/DERObject.java
new file mode 100644
index 0000000..abb86d0
--- /dev/null
+++ b/src/main/java/com/lowagie/bc/asn1/DERObject.java
@@ -0,0 +1,15 @@
+package com.lowagie.bc.asn1;
+
+import java.io.IOException;
+
+public abstract class DERObject
+ implements DERTags, DEREncodable
+{
+ public DERObject getDERObject()
+ {
+ return this;
+ }
+
+ abstract void encode(DEROutputStream out)
+ throws IOException;
+}
diff --git a/src/main/java/com/lowagie/bc/asn1/DERObjectIdentifier.java b/src/main/java/com/lowagie/bc/asn1/DERObjectIdentifier.java
new file mode 100644
index 0000000..04c2d86
--- /dev/null
+++ b/src/main/java/com/lowagie/bc/asn1/DERObjectIdentifier.java
@@ -0,0 +1,170 @@
+package com.lowagie.bc.asn1;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+
+public class DERObjectIdentifier
+ extends DERObject
+{
+ String identifier;
+
+ /**
+ * return an OID from the passed in object
+ *
+ * @exception IllegalArgumentException if the object cannot be converted.
+ */
+ public static DERObjectIdentifier getInstance(
+ Object obj)
+ {
+ if (obj == null || obj instanceof DERObjectIdentifier)
+ {
+ return (DERObjectIdentifier)obj;
+ }
+
+ if (obj instanceof ASN1OctetString)
+ {
+ return new DERObjectIdentifier(((ASN1OctetString)obj).getOctets());
+ }
+
+ if (obj instanceof ASN1TaggedObject)
+ {
+ return getInstance(((ASN1TaggedObject)obj).getObject());
+ }
+
+ throw new IllegalArgumentException("illegal object in getInstance: " + obj.getClass().getName());
+ }
+
+ /**
+ * return an Object Identifier from a tagged object.
+ *
+ * @param obj the tagged object holding the object we want
+ * @param explicit true if the object is meant to be explicitly
+ * tagged false otherwise.
+ * @exception IllegalArgumentException if the tagged object cannot
+ * be converted.
+ */
+ public static DERObjectIdentifier getInstance(
+ ASN1TaggedObject obj,
+ boolean explicit)
+ {
+ return getInstance(obj.getObject());
+ }
+
+
+ DERObjectIdentifier(
+ byte[] bytes)
+ {
+ StringBuffer objId = new StringBuffer();
+ int value = 0;
+ boolean first = true;
+
+ for (int i = 0; i != bytes.length; i++)
+ {
+ int b = bytes[i] & 0xff;
+
+ value = value * 128 + (b & 0x7f);
+ if ((b & 0x80) == 0) // end of number reached
+ {
+ if (first)
+ {
+ switch (value / 40)
+ {
+ case 0:
+ objId.append('0');
+ break;
+ case 1:
+ objId.append('1');
+ value -= 40;
+ break;
+ default:
+ objId.append('2');
+ value -= 80;
+ }
+ first = false;
+ }
+
+ objId.append('.');
+ objId.append(Integer.toString(value));
+ value = 0;
+ }
+ }
+
+ this.identifier = objId.toString();
+ }
+
+ public DERObjectIdentifier(
+ String identifier)
+ {
+ this.identifier = identifier;
+ }
+
+ public String getId()
+ {
+ return identifier;
+ }
+
+ private void writeField(
+ OutputStream out,
+ int fieldValue)
+ throws IOException
+ {
+ if (fieldValue >= (1 << 7))
+ {
+ if (fieldValue >= (1 << 14))
+ {
+ if (fieldValue >= (1 << 21))
+ {
+ if (fieldValue >= (1 << 28))
+ {
+ out.write((fieldValue >> 28) | 0x80);
+ }
+ out.write((fieldValue >> 21) | 0x80);
+ }
+ out.write((fieldValue >> 14) | 0x80);
+ }
+ out.write((fieldValue >> 7) | 0x80);
+ }
+ out.write(fieldValue & 0x7f);
+ }
+
+ void encode(
+ DEROutputStream out)
+ throws IOException
+ {
+ OIDTokenizer tok = new OIDTokenizer(identifier);
+ ByteArrayOutputStream bOut = new ByteArrayOutputStream();
+ DEROutputStream dOut = new DEROutputStream(bOut);
+
+ writeField(bOut,
+ Integer.parseInt(tok.nextToken()) * 40
+ + Integer.parseInt(tok.nextToken()));
+
+ while (tok.hasMoreTokens())
+ {
+ writeField(bOut, Integer.parseInt(tok.nextToken()));
+ }
+
+ dOut.close();
+
+ byte[] bytes = bOut.toByteArray();
+
+ out.writeEncoded(OBJECT_IDENTIFIER, bytes);
+ }
+
+ public int hashCode()
+ {
+ return identifier.hashCode();
+ }
+
+ public boolean equals(
+ Object o)
+ {
+ if ((o == null) || !(o instanceof DERObjectIdentifier))
+ {
+ return false;
+ }
+
+ return identifier.equals(((DERObjectIdentifier)o).identifier);
+ }
+}
diff --git a/src/main/java/com/lowagie/bc/asn1/DEROctetString.java b/src/main/java/com/lowagie/bc/asn1/DEROctetString.java
new file mode 100644
index 0000000..46ab32d
--- /dev/null
+++ b/src/main/java/com/lowagie/bc/asn1/DEROctetString.java
@@ -0,0 +1,29 @@
+package com.lowagie.bc.asn1;
+
+import java.io.IOException;
+
+public class DEROctetString
+ extends ASN1OctetString
+{
+ /**
+ * @param string the octets making up the octet string.
+ */
+ public DEROctetString(
+ byte[] string)
+ {
+ super(string);
+ }
+
+ public DEROctetString(
+ DEREncodable obj)
+ {
+ super(obj);
+ }
+
+ void encode(
+ DEROutputStream out)
+ throws IOException
+ {
+ out.writeEncoded(OCTET_STRING, string);
+ }
+}
diff --git a/src/main/java/com/lowagie/bc/asn1/DEROutputStream.java b/src/main/java/com/lowagie/bc/asn1/DEROutputStream.java
new file mode 100644
index 0000000..457cae4
--- /dev/null
+++ b/src/main/java/com/lowagie/bc/asn1/DEROutputStream.java
@@ -0,0 +1,81 @@
+package com.lowagie.bc.asn1;
+
+import java.io.FilterOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+
+public class DEROutputStream
+ extends FilterOutputStream implements DERTags
+{
+ public DEROutputStream(
+ OutputStream os)
+ {
+ super(os);
+ }
+
+ private void writeLength(
+ int length)
+ throws IOException
+ {
+ if (length > 127)
+ {
+ int size = 1;
+ int val = length;
+
+ while ((val >>>= 8) != 0)
+ {
+ size++;
+ }
+
+ write((byte)(size | 0x80));
+
+ for (int i = (size - 1) * 8; i >= 0; i -= 8)
+ {
+ write((byte)(length >> i));
+ }
+ }
+ else
+ {
+ write((byte)length);
+ }
+ }
+
+ void writeEncoded(
+ int tag,
+ byte[] bytes)
+ throws IOException
+ {
+ write(tag);
+ writeLength(bytes.length);
+ write(bytes);
+ }
+
+ protected void writeNull()
+ throws IOException
+ {
+ write(NULL);
+ write(0x00);
+ }
+
+ public void writeObject(
+ Object obj)
+ throws IOException
+ {
+ if (obj == null)
+ {
+ writeNull();
+ }
+ else if (obj instanceof DERObject)
+ {
+ ((DERObject)obj).encode(this);
+ }
+ else if (obj instanceof DEREncodable)
+ {
+ ((DEREncodable)obj).getDERObject().encode(this);
+ }
+ else
+ {
+ throw new IOException("object not DEREncodable");
+ }
+ }
+}
diff --git a/src/main/java/com/lowagie/bc/asn1/DERPrintableString.java b/src/main/java/com/lowagie/bc/asn1/DERPrintableString.java
new file mode 100644
index 0000000..ac3f588
--- /dev/null
+++ b/src/main/java/com/lowagie/bc/asn1/DERPrintableString.java
@@ -0,0 +1,123 @@
+package com.lowagie.bc.asn1;
+
+import java.io.IOException;
+
+/**
+ * DER PrintableString object.
+ */
+public class DERPrintableString
+ extends DERObject
+ implements DERString
+{
+ String string;
+
+ /**
+ * return a printable string from the passed in object.
+ *
+ * @exception IllegalArgumentException if the object cannot be converted.
+ */
+ public static DERPrintableString getInstance(
+ Object obj)
+ {
+ if (obj == null || obj instanceof DERPrintableString)
+ {
+ return (DERPrintableString)obj;
+ }
+
+ if (obj instanceof ASN1OctetString)
+ {
+ return new DERPrintableString(((ASN1OctetString)obj).getOctets());
+ }
+
+ if (obj instanceof ASN1TaggedObject)
+ {
+ return getInstance(((ASN1TaggedObject)obj).getObject());
+ }
+
+ throw new IllegalArgumentException("illegal object in getInstance: " + obj.getClass().getName());
+ }
+
+ /**
+ * return a Printable String from a tagged object.
+ *
+ * @param obj the tagged object holding the object we want
+ * @param explicit true if the object is meant to be explicitly
+ * tagged false otherwise.
+ * @exception IllegalArgumentException if the tagged object cannot
+ * be converted.
+ */
+ public static DERPrintableString getInstance(
+ ASN1TaggedObject obj,
+ boolean explicit)
+ {
+ return getInstance(obj.getObject());
+ }
+
+ /**
+ * basic constructor - byte encoded string.
+ */
+ public DERPrintableString(
+ byte[] string)
+ {
+ char[] cs = new char[string.length];
+
+ for (int i = 0; i != cs.length; i++)
+ {
+ cs[i] = (char)(string[i] & 0xff);
+ }
+
+ this.string = new String(cs);
+ }
+
+ /**
+ * basic constructor
+ */
+ public DERPrintableString(
+ String string)
+ {
+ this.string = string;
+ }
+
+ public String getString()
+ {
+ return string;
+ }
+
+ public byte[] getOctets()
+ {
+ char[] cs = string.toCharArray();
+ byte[] bs = new byte[cs.length];
+
+ for (int i = 0; i != cs.length; i++)
+ {
+ bs[i] = (byte)cs[i];
+ }
+
+ return bs;
+ }
+
+ void encode(
+ DEROutputStream out)
+ throws IOException
+ {
+ out.writeEncoded(PRINTABLE_STRING, this.getOctets());
+ }
+
+ public int hashCode()
+ {
+ return this.getString().hashCode();
+ }
+
+ public boolean equals(
+ Object o)
+ {
+ if (!(o instanceof DERPrintableString))
+ {
+ return false;
+ }
+
+ DERPrintableString s = (DERPrintableString)o;
+
+ return this.getString().equals(s.getString());
+ }
+}
diff --git a/src/main/java/com/lowagie/bc/asn1/DERSequence.java b/src/main/java/com/lowagie/bc/asn1/DERSequence.java
new file mode 100644
index 0000000..5ffd2dd
--- /dev/null
+++ b/src/main/java/com/lowagie/bc/asn1/DERSequence.java
@@ -0,0 +1,67 @@
+package com.lowagie.bc.asn1;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.util.Enumeration;
+
+public class DERSequence
+ extends ASN1Sequence
+{
+ /**
+ * create an empty sequence
+ */
+ public DERSequence()
+ {
+ }
+
+ /**
+ * create a sequence containing one object
+ */
+ public DERSequence(
+ DEREncodable obj)
+ {
+ this.addObject(obj);
+ }
+
+ /**
+ * create a sequence containing a vector of objects.
+ */
+ public DERSequence(
+ DEREncodableVector v)
+ {
+ for (int i = 0; i != v.size(); i++)
+ {
+ this.addObject(v.get(i));
+ }
+ }
+
+ /*
+ * A note on the implementation:
+ * <p>
+ * As DER requires the constructed, definite-length model to
+ * be used for structured types, this varies slightly from the
+ * ASN.1 descriptions given. Rather than just outputing SEQUENCE,
+ * we also have to specify CONSTRUCTED, and the objects length.
+ */
+ void encode(
+ DEROutputStream out)
+ throws IOException
+ {
+ ByteArrayOutputStream bOut = new ByteArrayOutputStream();
+ DEROutputStream dOut = new DEROutputStream(bOut);
+ Enumeration e = this.getObjects();
+
+ while (e.hasMoreElements())
+ {
+ Object obj = e.nextElement();
+
+ dOut.writeObject(obj);
+ }
+
+ dOut.close();
+
+ byte[] bytes = bOut.toByteArray();
+
+ out.writeEncoded(SEQUENCE | CONSTRUCTED, bytes);
+ }
+}
diff --git a/src/main/java/com/lowagie/bc/asn1/DERSet.java b/src/main/java/com/lowagie/bc/asn1/DERSet.java
new file mode 100644
index 0000000..fe4978c
--- /dev/null
+++ b/src/main/java/com/lowagie/bc/asn1/DERSet.java
@@ -0,0 +1,70 @@
+package com.lowagie.bc.asn1;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.util.Enumeration;
+
+/**
+ * A DER encoded set object
+ */
+public class DERSet
+ extends ASN1Set
+{
+ /**
+ * create an empty set
+ */
+ public DERSet()
+ {
+ }
+
+ /**
+ * @param obj - a single object that makes up the set.
+ */
+ public DERSet(
+ DEREncodable obj)
+ {
+ this.addObject(obj);
+ }
+
+ /**
+ * @param v - a vector of objects making up the set.
+ */
+ public DERSet(
+ DEREncodableVector v)
+ {
+ for (int i = 0; i != v.size(); i++)
+ {
+ this.addObject(v.get(i));
+ }
+ }
+
+ /*
+ * A note on the implementation:
+ * <p>
+ * As DER requires the constructed, definite-length model to
+ * be used for structured types, this varies slightly from the
+ * ASN.1 descriptions given. Rather than just outputing SET,
+ * we also have to specify CONSTRUCTED, and the objects length.
+ */
+ void encode(
+ DEROutputStream out)
+ throws IOException
+ {
+ ByteArrayOutputStream bOut = new ByteArrayOutputStream();
+ DEROutputStream dOut = new DEROutputStream(bOut);
+ Enumeration e = this.getObjects();
+
+ while (e.hasMoreElements())
+ {
+ Object obj = e.nextElement();
+
+ dOut.writeObject(obj);
+ }
+
+ dOut.close();
+
+ byte[] bytes = bOut.toByteArray();
+
+ out.writeEncoded(SET | CONSTRUCTED, bytes);
+ }
+}
diff --git a/src/main/java/com/lowagie/bc/asn1/DERString.java b/src/main/java/com/lowagie/bc/asn1/DERString.java
new file mode 100644
index 0000000..44409b2
--- /dev/null
+++ b/src/main/java/com/lowagie/bc/asn1/DERString.java
@@ -0,0 +1,9 @@
+package com.lowagie.bc.asn1;
+
+/**
+ * basic interface for DER string objects.
+ */
+public interface DERString
+{
+ public String getString();
+}
diff --git a/src/main/java/com/lowagie/bc/asn1/DERT61String.java b/src/main/java/com/lowagie/bc/asn1/DERT61String.java
new file mode 100644
index 0000000..228fd49
--- /dev/null
+++ b/src/main/java/com/lowagie/bc/asn1/DERT61String.java
@@ -0,0 +1,116 @@
+package com.lowagie.bc.asn1;
+
+import java.io.IOException;
+
+/**
+ * DER T61String (also the teletex string)
+ */
+public class DERT61String
+ extends DERObject
+ implements DERString
+{
+ String string;
+
+ /**
+ * return a T61 string from the passed in object.
+ *
+ * @exception IllegalArgumentException if the object cannot be converted.
+ */
+ public static DERT61String getInstance(
+ Object obj)
+ {
+ if (obj == null || obj instanceof DERT61String)
+ {
+ return (DERT61String)obj;
+ }
+
+ if (obj instanceof ASN1OctetString)
+ {
+ return new DERT61String(((ASN1OctetString)obj).getOctets());
+ }
+
+ if (obj instanceof ASN1TaggedObject)
+ {
+ return getInstance(((ASN1TaggedObject)obj).getObject());
+ }
+
+ throw new IllegalArgumentException("illegal object in getInstance: " + obj.getClass().getName());
+ }
+
+ /**
+ * return an T61 String from a tagged object.
+ *
+ * @param obj the tagged object holding the object we want
+ * @param explicit true if the object is meant to be explicitly
+ * tagged false otherwise.
+ * @exception IllegalArgumentException if the tagged object cannot
+ * be converted.
+ */
+ public static DERT61String getInstance(
+ ASN1TaggedObject obj,
+ boolean explicit)
+ {
+ return getInstance(obj.getObject());
+ }
+
+ /**
+ * basic constructor - with bytes.
+ */
+ public DERT61String(
+ byte[] string)
+ {
+ char[] cs = new char[string.length];
+
+ for (int i = 0; i != cs.length; i++)
+ {
+ cs[i] = (char)(string[i] & 0xff);
+ }
+
+ this.string = new String(cs);
+ }
+
+ /**
+ * basic constructor - with string.
+ */
+ public DERT61String(
+ String string)
+ {
+ this.string = string;
+ }
+
+ public String getString()
+ {
+ return string;
+ }
+
+ void encode(
+ DEROutputStream out)
+ throws IOException
+ {
+ out.writeEncoded(T61_STRING, this.getOctets());
+ }
+
+ public byte[] getOctets()
+ {
+ char[] cs = string.toCharArray();
+ byte[] bs = new byte[cs.length];
+
+ for (int i = 0; i != cs.length; i++)
+ {
+ bs[i] = (byte)cs[i];
+ }
+
+ return bs;
+ }
+
+ public boolean equals(
+ Object o)
+ {
+ if ((o == null) || !(o instanceof DERT61String))
+ {
+ return false;
+ }
+
+ return this.getString().equals(((DERT61String)o).getString());
+ }
+}
diff --git a/src/main/java/com/lowagie/bc/asn1/DERTaggedObject.java b/src/main/java/com/lowagie/bc/asn1/DERTaggedObject.java
new file mode 100644
index 0000000..dbc9e36
--- /dev/null
+++ b/src/main/java/com/lowagie/bc/asn1/DERTaggedObject.java
@@ -0,0 +1,88 @@
+package com.lowagie.bc.asn1;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+
+/**
+ * DER TaggedObject - in ASN.1 nottation this is any object proceeded by
+ * a [n] where n is some number - these are assume to follow the construction
+ * rules (as with sequences).
+ */
+public class DERTaggedObject
+ extends ASN1TaggedObject
+{
+ /**
+ * @param tagNo the tag number for this object.
+ * @param obj the tagged object.
+ */
+ public DERTaggedObject(
+ int tagNo,
+ DEREncodable obj)
+ {
+ super(tagNo, obj);
+ }
+
+ /**
+ * @param explicit true if an explicitly tagged object.
+ * @param tagNo the tag number for this object.
+ * @param obj the tagged object.
+ */
+ public DERTaggedObject(
+ boolean explicit,
+ int tagNo,
+ DEREncodable obj)
+ {
+ super(explicit, tagNo, obj);
+ }
+
+ /**
+ * create an implicitly tagged object that contains a zero
+ * length sequence.
+ */
+ public DERTaggedObject(
+ int tagNo)
+ {
+ super(false, tagNo, new DERSequence());
+ }
+
+ void encode(
+ DEROutputStream out)
+ throws IOException
+ {
+ if (!empty)
+ {
+ ByteArrayOutputStream bOut = new ByteArrayOutputStream();
+ DEROutputStream dOut = new DEROutputStream(bOut);
+
+ dOut.writeObject(obj);
+ dOut.close();
+
+ byte[] bytes = bOut.toByteArray();
+
+ if (explicit)
+ {
+ out.writeEncoded(CONSTRUCTED | TAGGED | tagNo, bytes);
+ }
+ else
+ {
+ //
+ // need to mark constructed types...
+ //
+ if ((bytes[0] & CONSTRUCTED) != 0)
+ {
+ bytes[0] = (byte)(CONSTRUCTED | TAGGED | tagNo);
+ }
+ else
+ {
+ bytes[0] = (byte)(TAGGED | tagNo);
+ }
+
+ out.write(bytes);
+ }
+ }
+ else
+ {
+ out.writeEncoded(CONSTRUCTED | TAGGED | tagNo, new byte[0]);
+ }
+ }
+}
diff --git a/src/main/java/com/lowagie/bc/asn1/DERTags.java b/src/main/java/com/lowagie/bc/asn1/DERTags.java
new file mode 100644
index 0000000..7b5ddec
--- /dev/null
+++ b/src/main/java/com/lowagie/bc/asn1/DERTags.java
@@ -0,0 +1,36 @@
+package com.lowagie.bc.asn1;
+
+public interface DERTags
+{
+ public static final int BOOLEAN = 0x01;
+ public static final int INTEGER = 0x02;
+ public static final int BIT_STRING = 0x03;
+ public static final int OCTET_STRING = 0x04;
+ public static final int NULL = 0x05;
+ public static final int OBJECT_IDENTIFIER = 0x06;
+ public static final int EXTERNAL = 0x08;
+ public static final int ENUMERATED = 0x0a;
+ public static final int SEQUENCE = 0x10;
+ public static final int SEQUENCE_OF = 0x10; // for completeness
+ public static final int SET = 0x11;
+ public static final int SET_OF = 0x11; // for completeness
+
+
+ public static final int NUMERIC_STRING = 0x12;
+ public static final int PRINTABLE_STRING = 0x13;
+ public static final int T61_STRING = 0x14;
+ public static final int VIDEOTEX_STRING = 0x15;
+ public static final int IA5_STRING = 0x16;
+ public static final int UTC_TIME = 0x17;
+ public static final int GENERALIZED_TIME = 0x18;
+ public static final int GRAPHIC_STRING = 0x19;
+ public static final int VISIBLE_STRING = 0x1a;
+ public static final int GENERAL_STRING = 0x1b;
+ public static final int UNIVERSAL_STRING = 0x1c;
+ public static final int BMP_STRING = 0x1e;
+ public static final int UTF8_STRING = 0x0c;
+
+ public static final int CONSTRUCTED = 0x20;
+ public static final int APPLICATION = 0x40;
+ public static final int TAGGED = 0x80;
+}
diff --git a/src/main/java/com/lowagie/bc/asn1/DERUTCTime.java b/src/main/java/com/lowagie/bc/asn1/DERUTCTime.java
new file mode 100644
index 0000000..200b23e
--- /dev/null
+++ b/src/main/java/com/lowagie/bc/asn1/DERUTCTime.java
@@ -0,0 +1,183 @@
+package com.lowagie.bc.asn1;
+
+import java.io.IOException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.SimpleTimeZone;
+
+/**
+ * UTC time object.
+ */
+public class DERUTCTime
+ extends DERObject
+{
+ String time;
+
+ /**
+ * return an UTC Time from the passed in object.
+ *
+ * @exception IllegalArgumentException if the object cannot be converted.
+ */
+ public static DERUTCTime getInstance(
+ Object obj)
+ {
+ if (obj == null || obj instanceof DERUTCTime)
+ {
+ return (DERUTCTime)obj;
+ }
+
+ if (obj instanceof ASN1OctetString)
+ {
+ return new DERUTCTime(((ASN1OctetString)obj).getOctets());
+ }
+
+ throw new IllegalArgumentException("illegal object in getInstance: " + obj.getClass().getName());
+ }
+
+ /**
+ * return an UTC Time from a tagged object.
+ *
+ * @param obj the tagged object holding the object we want
+ * @param explicit true if the object is meant to be explicitly
+ * tagged false otherwise.
+ * @exception IllegalArgumentException if the tagged object cannot
+ * be converted.
+ */
+ public static DERUTCTime getInstance(
+ ASN1TaggedObject obj,
+ boolean explicit)
+ {
+ return getInstance(obj.getObject());
+ }
+
+ /**
+ * The correct format for this is YYMMDDHHMMSSZ (it used to be that seconds were
+ * never encoded. When you're creating one of these objects from scratch, that's
+ * what you want to use, otherwise we'll try to deal with whatever gets read from
+ * the input stream... (this is why the input format is different from the getTime()
+ * method output).
+ * <p>
+ *
+ * @param time the time string.
+ */
+ public DERUTCTime(
+ String time)
+ {
+ this.time = time;
+ }
+
+ /**
+ * base constructer from a java.util.date object
+ */
+ public DERUTCTime(
+ Date time)
+ {
+ SimpleDateFormat dateF = new SimpleDateFormat("yyMMddHHmmss'Z'");
+
+ dateF.setTimeZone(new SimpleTimeZone(0,"Z"));
+
+ this.time = dateF.format(time);
+ }
+
+ DERUTCTime(
+ byte[] bytes)
+ {
+ //
+ // explicitly convert to characters
+ //
+ char[] dateC = new char[bytes.length];
+
+ for (int i = 0; i != dateC.length; i++)
+ {
+ dateC[i] = (char)(bytes[i] & 0xff);
+ }
+
+ this.time = new String(dateC);
+ }
+
+ /**
+ * return the time - always in the form of
+ * YYMMDDhhmmssGMT(+hh:mm|-hh:mm).
+ * <p>
+ * Normally in a certificate we would expect "Z" rather than "GMT",
+ * however adding the "GMT" means we can just use:
+ * <pre>
+ * dateF = new SimpleDateFormat("yyMMddHHmmssz");
+ * </pre>
+ * To read in the time and get a date which is compatible with our local
+ * time zone.
+ * <p>
+ * <b>Note:</b> In some cases, due to the local date processing, this
+ * may lead to unexpected results. If you want to stick the normal
+ * convention of 1950 to 2049 use the getAdjustedTime() method.
+ */
+ public String getTime()
+ {
+ //
+ // standardise the format.
+ //
+ if (time.length() == 11)
+ {
+ return time.substring(0, 10) + "00GMT+00:00";
+ }
+ else if (time.length() == 13)
+ {
+ return time.substring(0, 12) + "GMT+00:00";
+ }
+ else if (time.length() == 17)
+ {
+ return time.substring(0, 12) + "GMT" + time.substring(12, 15) + ":" + time.substring(15, 17);
+ }
+
+ return time;
+ }
+
+ /**
+ * return the time as an adjusted date with a 4 digit year. This goes
+ * in the range of 1950 - 2049.
+ */
+ public String getAdjustedTime()
+ {
+ String d = this.getTime();
+
+ if (d.charAt(0) < '5')
+ {
+ return "20" + d;
+ }
+ else
+ {
+ return "19" + d;
+ }
+ }
+
+ private byte[] getOctets()
+ {
+ char[] cs = time.toCharArray();
+ byte[] bs = new byte[cs.length];
+
+ for (int i = 0; i != cs.length; i++)
+ {
+ bs[i] = (byte)cs[i];
+ }
+
+ return bs;
+ }
+
+ void encode(
+ DEROutputStream out)
+ throws IOException
+ {
+ out.writeEncoded(UTC_TIME, this.getOctets());
+ }
+
+ public boolean equals(
+ Object o)
+ {
+ if ((o == null) || !(o instanceof DERUTCTime))
+ {
+ return false;
+ }
+
+ return time.equals(((DERUTCTime)o).time);
+ }
+}
diff --git a/src/main/java/com/lowagie/bc/asn1/DERUTF8String.java b/src/main/java/com/lowagie/bc/asn1/DERUTF8String.java
new file mode 100644
index 0000000..13f992b
--- /dev/null
+++ b/src/main/java/com/lowagie/bc/asn1/DERUTF8String.java
@@ -0,0 +1,177 @@
+package com.lowagie.bc.asn1;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+
+/**
+ * DER UTF8String object.
+ */
+public class DERUTF8String
+ extends DERObject
+ implements DERString
+{
+ String string;
+
+ /**
+ * return an UTF8 string from the passed in object.
+ *
+ * @exception IllegalArgumentException if the object cannot be converted.
+ */
+ public static DERUTF8String getInstance(
+ Object obj)
+ {
+ if (obj == null || obj instanceof DERUTF8String)
+ {
+ return (DERUTF8String)obj;
+ }
+
+ if (obj instanceof ASN1OctetString)
+ {
+ return new DERUTF8String(((ASN1OctetString)obj).getOctets());
+ }
+
+ if (obj instanceof ASN1TaggedObject)
+ {
+ return getInstance(((ASN1TaggedObject)obj).getObject());
+ }
+
+ throw new IllegalArgumentException("illegal object in getInstance: " + obj.getClass().getName());
+ }
+
+ /**
+ * return an UTF8 String from a tagged object.
+ *
+ * @param obj the tagged object holding the object we want
+ * @param explicit true if the object is meant to be explicitly
+ * tagged false otherwise.
+ * @exception IllegalArgumentException if the tagged object cannot
+ * be converted.
+ */
+ public static DERUTF8String getInstance(
+ ASN1TaggedObject obj,
+ boolean explicit)
+ {
+ return getInstance(obj.getObject());
+ }
+
+ /**
+ * basic constructor - byte encoded string.
+ */
+ DERUTF8String(
+ byte[] string)
+ {
+ int i = 0;
+ int length = 0;
+
+ while (i < string.length)
+ {
+ length++;
+ if ((string[i] & 0xe0) == 0xe0)
+ {
+ i += 3;
+ }
+ else if ((string[i] & 0xc0) == 0xc0)
+ {
+ i += 2;
+ }
+ else
+ {
+ i += 1;
+ }
+ }
+
+ char[] cs = new char[length];
+
+ i = 0;
+ length = 0;
+
+ while (i < string.length)
+ {
+ char ch;
+
+ if ((string[i] & 0xe0) == 0xe0)
+ {
+ ch = (char)(((string[i] & 0x1f) << 12)
+ | ((string[i + 1] & 0x3f) << 6) | (string[i + 2] & 0x3f));
+ i += 3;
+ }
+ else if ((string[i] & 0xc0) == 0xc0)
+ {
+ ch = (char)(((string[i] & 0x3f) << 6) | (string[i + 1] & 0x3f));
+ i += 2;
+ }
+ else
+ {
+ ch = (char)(string[i] & 0xff);
+ i += 1;
+ }
+
+ cs[length++] = ch;
+ }
+
+ this.string = new String(cs);
+ }
+
+ /**
+ * basic constructor
+ */
+ public DERUTF8String(
+ String string)
+ {
+ this.string = string;
+ }
+
+ public String getString()
+ {
+ return string;
+ }
+
+ public int hashCode()
+ {
+ return this.getString().hashCode();
+ }
+
+ public boolean equals(
+ Object o)
+ {
+ if (!(o instanceof DERUTF8String))
+ {
+ return false;
+ }
+
+ DERUTF8String s = (DERUTF8String)o;
+
+ return this.getString().equals(s.getString());
+ }
+
+ void encode(
+ DEROutputStream out)
+ throws IOException
+ {
+ char[] c = string.toCharArray();
+ ByteArrayOutputStream bOut = new ByteArrayOutputStream();
+
+ for (int i = 0; i != c.length; i++)
+ {
+ char ch = c[i];
+
+ if (ch < 0x0080)
+ {
+ bOut.write(ch);
+ }
+ else if (ch < 0x0800)
+ {
+ bOut.write(0xc0 | (ch >> 6));
+ bOut.write(0x80 | (ch & 0x3f));
+ }
+ else
+ {
+ bOut.write(0xe0 | (ch >> 12));
+ bOut.write(0x80 | ((ch >> 6) & 0x3F));
+ bOut.write(0x80 | (ch & 0x3F));
+ }
+ }
+
+ out.writeEncoded(UTF8_STRING, bOut.toByteArray());
+ }
+}
diff --git a/src/main/java/com/lowagie/bc/asn1/DERUniversalString.java b/src/main/java/com/lowagie/bc/asn1/DERUniversalString.java
new file mode 100644
index 0000000..eed5f08
--- /dev/null
+++ b/src/main/java/com/lowagie/bc/asn1/DERUniversalString.java
@@ -0,0 +1,110 @@
+package com.lowagie.bc.asn1;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+
+/**
+ * DER UniversalString object.
+ */
+public class DERUniversalString
+ extends DERObject
+ implements DERString
+{
+ private static final char[] table = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
+ private byte[] string;
+
+ /**
+ * return a Universal String from the passed in object.
+ *
+ * @exception IllegalArgumentException if the object cannot be converted.
+ */
+ public static DERUniversalString getInstance(
+ Object obj)
+ {
+ if (obj == null || obj instanceof DERUniversalString)
+ {
+ return (DERUniversalString)obj;
+ }
+
+ if (obj instanceof ASN1OctetString)
+ {
+ return new DERUniversalString(((ASN1OctetString)obj).getOctets());
+ }
+
+ throw new IllegalArgumentException("illegal object in getInstance: " + obj.getClass().getName());
+ }
+
+ /**
+ * return a Universal String from a tagged object.
+ *
+ * @param obj the tagged object holding the object we want
+ * @param explicit true if the object is meant to be explicitly
+ * tagged false otherwise.
+ * @exception IllegalArgumentException if the tagged object cannot
+ * be converted.
+ */
+ public static DERUniversalString getInstance(
+ ASN1TaggedObject obj,
+ boolean explicit)
+ {
+ return getInstance(obj.getObject());
+ }
+
+ /**
+ * basic constructor - byte encoded string.
+ */
+ public DERUniversalString(
+ byte[] string)
+ {
+ this.string = string;
+ }
+
+ public String getString()
+ {
+ StringBuffer buf = new StringBuffer("#");
+ ByteArrayOutputStream bOut = new ByteArrayOutputStream();
+ ASN1OutputStream aOut = new ASN1OutputStream(bOut);
+
+ try
+ {
+ aOut.writeObject(this);
+ }
+ catch (IOException e)
+ {
+ throw new RuntimeException("internal error encoding BitString");
+ }
+
+ byte[] string = bOut.toByteArray();
+
+ for (int i = 0; i != string.length; i++)
+ {
+ buf.append(table[(string[i] >>> 4) % 0xf]);
+ buf.append(table[string[i] & 0xf]);
+ }
+
+ return buf.toString();
+ }
+
+ public byte[] getOctets()
+ {
+ return string;
+ }
+
+ void encode(
+ DEROutputStream out)
+ throws IOException
+ {
+ out.writeEncoded(UNIVERSAL_STRING, this.getOctets());
+ }
+
+ public boolean equals(
+ Object o)
+ {
+ if ((o == null) || !(o instanceof DERUniversalString))
+ {
+ return false;
+ }
+
+ return this.getString().equals(((DERUniversalString)o).getString());
+ }
+}
diff --git a/src/main/java/com/lowagie/bc/asn1/DERUnknownTag.java b/src/main/java/com/lowagie/bc/asn1/DERUnknownTag.java
new file mode 100644
index 0000000..fb653ba
--- /dev/null
+++ b/src/main/java/com/lowagie/bc/asn1/DERUnknownTag.java
@@ -0,0 +1,73 @@
+package com.lowagie.bc.asn1;
+
+import java.io.IOException;
+
+/**
+ * We insert one of these when we find a tag we don't recognise.
+ */
+public class DERUnknownTag
+ extends DERObject
+{
+ int tag;
+ byte[] data;
+
+ /**
+ * @param tag the tag value.
+ * @param data the octets making up the time.
+ */
+ public DERUnknownTag(
+ int tag,
+ byte[] data)
+ {
+ this.tag = tag;
+ this.data = data;
+ }
+
+ public int getTag()
+ {
+ return tag;
+ }
+
+ public byte[] getData()
+ {
+ return data;
+ }
+
+ void encode(
+ DEROutputStream out)
+ throws IOException
+ {
+ out.writeEncoded(tag, data);
+ }
+
+ public boolean equals(
+ Object o)
+ {
+ if ((o == null) || !(o instanceof DERUnknownTag))
+ {
+ return false;
+ }
+
+ DERUnknownTag other = (DERUnknownTag)o;
+
+ if(tag != other.tag)
+ {
+ return false;
+ }
+
+ if(data.length != other.data.length)
+ {
+ return false;
+ }
+
+ for(int i = 0; i < data.length; i++)
+ {
+ if(data[i] != other.data[i])
+ {
+ return false;
+ }
+ }
+
+ return true;
+ }
+}
diff --git a/src/main/java/com/lowagie/bc/asn1/DERVisibleString.java b/src/main/java/com/lowagie/bc/asn1/DERVisibleString.java
new file mode 100644
index 0000000..629f677
--- /dev/null
+++ b/src/main/java/com/lowagie/bc/asn1/DERVisibleString.java
@@ -0,0 +1,116 @@
+package com.lowagie.bc.asn1;
+
+import java.io.IOException;
+
+/**
+ * DER VisibleString object.
+ */
+public class DERVisibleString
+ extends DERObject
+ implements DERString
+{
+ String string;
+
+ /**
+ * return a Visible String from the passed in object.
+ *
+ * @exception IllegalArgumentException if the object cannot be converted.
+ */
+ public static DERVisibleString getInstance(
+ Object obj)
+ {
+ if (obj == null || obj instanceof DERVisibleString)
+ {
+ return (DERVisibleString)obj;
+ }
+
+ if (obj instanceof ASN1OctetString)
+ {
+ return new DERVisibleString(((ASN1OctetString)obj).getOctets());
+ }
+
+ if (obj instanceof ASN1TaggedObject)
+ {
+ return getInstance(((ASN1TaggedObject)obj).getObject());
+ }
+
+ throw new IllegalArgumentException("illegal object in getInstance: " + obj.getClass().getName());
+ }
+
+ /**
+ * return a Visible String from a tagged object.
+ *
+ * @param obj the tagged object holding the object we want
+ * @param explicit true if the object is meant to be explicitly
+ * tagged false otherwise.
+ * @exception IllegalArgumentException if the tagged object cannot
+ * be converted.
+ */
+ public static DERVisibleString getInstance(
+ ASN1TaggedObject obj,
+ boolean explicit)
+ {
+ return getInstance(obj.getObject());
+ }
+
+ /**
+ * basic constructor - byte encoded string.
+ */
+ public DERVisibleString(
+ byte[] string)
+ {
+ char[] cs = new char[string.length];
+
+ for (int i = 0; i != cs.length; i++)
+ {
+ cs[i] = (char)(string[i] & 0xff);
+ }
+
+ this.string = new String(cs);
+ }
+
+ /**
+ * basic constructor
+ */
+ public DERVisibleString(
+ String string)
+ {
+ this.string = string;
+ }
+
+ public String getString()
+ {
+ return string;
+ }
+
+ public byte[] getOctets()
+ {
+ char[] cs = string.toCharArray();
+ byte[] bs = new byte[cs.length];
+
+ for (int i = 0; i != cs.length; i++)
+ {
+ bs[i] = (byte)cs[i];
+ }
+
+ return bs;
+ }
+
+ void encode(
+ DEROutputStream out)
+ throws IOException
+ {
+ out.writeEncoded(VISIBLE_STRING, this.getOctets());
+ }
+
+ public boolean equals(
+ Object o)
+ {
+ if ((o == null) || !(o instanceof DERVisibleString))
+ {
+ return false;
+ }
+
+ return this.getString().equals(((DERVisibleString)o).getString());
+ }
+}
diff --git a/src/main/java/com/lowagie/bc/asn1/OIDTokenizer.java b/src/main/java/com/lowagie/bc/asn1/OIDTokenizer.java
new file mode 100644
index 0000000..16d3445
--- /dev/null
+++ b/src/main/java/com/lowagie/bc/asn1/OIDTokenizer.java
@@ -0,0 +1,48 @@
+package com.lowagie.bc.asn1;
+
+/**
+ * class for breaking up an OID into it's component tokens, ala
+ * java.util.StringTokenizer. We need this class as some of the
+ * lightweight Java environment don't support classes like
+ * StringTokenizer.
+ */
+public class OIDTokenizer
+{
+ private String oid;
+ private int index;
+
+ public OIDTokenizer(
+ String oid)
+ {
+ this.oid = oid;
+ this.index = 0;
+ }
+
+ public boolean hasMoreTokens()
+ {
+ return (index != -1);
+ }
+
+ public String nextToken()
+ {
+ if (index == -1)
+ {
+ return null;
+ }
+
+ String token;
+ int end = oid.indexOf('.', index);
+
+ if (end == -1)
+ {
+ token = oid.substring(index);
+ index = -1;
+ return token;
+ }
+
+ token = oid.substring(index, end);
+
+ index = end + 1;
+ return token;
+ }
+}
diff --git a/src/main/java/com/lowagie/text/Anchor.java b/src/main/java/com/lowagie/text/Anchor.java
new file mode 100644
index 0000000..33e6011
--- /dev/null
+++ b/src/main/java/com/lowagie/text/Anchor.java
@@ -0,0 +1,365 @@
+/*
+ * $Id: Anchor.java,v 1.84 2005/05/03 13:03:49 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text;
+
+import java.net.URL;
+import java.net.MalformedURLException;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.Properties;
+
+import com.lowagie.text.markup.MarkupTags;
+import com.lowagie.text.markup.MarkupParser;
+
+/**
+ * An <CODE>Anchor</CODE> can be a reference or a destination of a reference.
+ * <P>
+ * An <CODE>Anchor</CODE> is a special kind of <CODE>Phrase</CODE>.
+ * It is constructed in the same way.
+ * <P>
+ * Example:
+ * <BLOCKQUOTE><PRE>
+ * <STRONG>Anchor anchor = new Anchor("this is a link");</STRONG>
+ * <STRONG>anchor.setName("LINK");</STRONG>
+ * <STRONG>anchor.setReference("http://www.lowagie.com");</STRONG>
+ * </PRE></BLOCKQUOTE>
+ *
+ * @see Element
+ * @see Phrase
+ */
+
+public class Anchor extends Phrase implements TextElementArray, MarkupAttributes {
+
+ // membervariables
+
+/** This is the anchor tag. */
+ public static final String ANCHOR = "anchor";
+
+/** This is the name of the <CODE>Anchor</CODE>. */
+ protected String name = null;
+
+/** This is the reference of the <CODE>Anchor</CODE>. */
+ protected String reference = null;
+
+ // constructors
+
+/**
+ * Constructs an <CODE>Anchor</CODE> without specifying a leading.
+ */
+
+ public Anchor() {
+ super(16);
+ }
+
+/**
+ * Constructs an <CODE>Anchor</CODE> with a certain leading.
+ *
+ * @param leading the leading
+ */
+
+ public Anchor(float leading) {
+ super(leading);
+ }
+
+/**
+ * Constructs an <CODE>Anchor</CODE> with a certain <CODE>Chunk</CODE>.
+ *
+ * @param chunk a <CODE>Chunk</CODE>
+ */
+
+ public Anchor(Chunk chunk) {
+ super(chunk);
+ }
+
+/**
+ * Constructs an <CODE>Anchor</CODE> with a certain <CODE>String</CODE>.
+ *
+ * @param string a <CODE>String</CODE>
+ */
+
+ public Anchor(String string) {
+ super(string);
+ }
+
+/**
+ * Constructs an <CODE>Anchor</CODE> with a certain <CODE>String</CODE>
+ * and a certain <CODE>Font</CODE>.
+ *
+ * @param string a <CODE>String</CODE>
+ * @param font a <CODE>Font</CODE>
+ */
+
+ public Anchor(String string, Font font) {
+ super(string, font);
+ }
+
+/**
+ * Constructs an <CODE>Anchor</CODE> with a certain <CODE>Chunk</CODE>
+ * and a certain leading.
+ *
+ * @param leading the leading
+ * @param chunk a <CODE>Chunk</CODE>
+ */
+
+ public Anchor(float leading, Chunk chunk) {
+ super(leading, chunk);
+ }
+
+/**
+ * Constructs an <CODE>Anchor</CODE> with a certain leading
+ * and a certain <CODE>String</CODE>.
+ *
+ * @param leading the leading
+ * @param string a <CODE>String</CODE>
+ */
+
+ public Anchor(float leading, String string) {
+ super(leading, string);
+ }
+
+/**
+ * Constructs an <CODE>Anchor</CODE> with a certain leading,
+ * a certain <CODE>String</CODE> and a certain <CODE>Font</CODE>.
+ *
+ * @param leading the leading
+ * @param string a <CODE>String</CODE>
+ * @param font a <CODE>Font</CODE>
+ */
+
+ public Anchor(float leading, String string, Font font) {
+ super(leading, string, font);
+ }
+
+/**
+ * Returns an <CODE>Anchor</CODE> that has been constructed taking in account
+ * the value of some <VAR>attributes</VAR>.
+ *
+ * @param attributes Some attributes
+ */
+
+ public Anchor(Properties attributes) {
+ this("", FontFactory.getFont(attributes));
+ String value;
+ if ((value = (String)attributes.remove(ElementTags.ITEXT)) != null) {
+ Chunk chunk = new Chunk(value);
+ if ((value = (String)attributes.remove(ElementTags.GENERICTAG)) != null) {
+ chunk.setGenericTag(value);
+ }
+ add(chunk);
+ }
+ if ((value = (String)attributes.remove(ElementTags.LEADING)) != null) {
+ setLeading(Float.valueOf(value + "f").floatValue());
+ }
+ else if ((value = (String)attributes.remove(MarkupTags.CSS_KEY_LINEHEIGHT)) != null) {
+ setLeading(MarkupParser.parseLength(value));
+ }
+ if ((value = (String)attributes.remove(ElementTags.NAME)) != null) {
+ setName(value);
+ }
+ if ((value = (String)attributes.remove(ElementTags.REFERENCE)) != null) {
+ setReference(value);
+ }
+ if (attributes.size() > 0) setMarkupAttributes(attributes);
+ }
+
+ // implementation of the Element-methods
+
+/**
+ * Processes the element by adding it (or the different parts) to an
+ * <CODE>ElementListener</CODE>.
+ *
+ * @param listener an <CODE>ElementListener</CODE>
+ * @return <CODE>true</CODE> if the element was processed successfully
+ */
+
+ public boolean process(ElementListener listener) {
+ try {
+ Chunk chunk;
+ Iterator i = getChunks().iterator();
+ boolean localDestination = (reference != null && reference.startsWith("#"));
+ boolean notGotoOK = true;
+ while (i.hasNext()) {
+ chunk = (Chunk) i.next();
+ if (name != null && notGotoOK && !chunk.isEmpty()) {
+ chunk.setLocalDestination(name);
+ notGotoOK = false;
+ }
+ if (localDestination) {
+ chunk.setLocalGoto(reference.substring(1));
+ }
+ listener.add(chunk);
+ }
+ return true;
+ }
+ catch(DocumentException de) {
+ return false;
+ }
+ }
+
+/**
+ * Gets all the chunks in this element.
+ *
+ * @return an <CODE>ArrayList</CODE>
+ */
+
+ public ArrayList getChunks() {
+ ArrayList tmp = new ArrayList();
+ Chunk chunk;
+ Iterator i = iterator();
+ boolean localDestination = (reference != null && reference.startsWith("#"));
+ boolean notGotoOK = true;
+ while (i.hasNext()) {
+ chunk = (Chunk) i.next();
+ if (name != null && notGotoOK && !chunk.isEmpty()) {
+ chunk.setLocalDestination(name);
+ notGotoOK = false;
+ }
+ if (localDestination) {
+ chunk.setLocalGoto(reference.substring(1));
+ }
+ else if (reference != null)
+ chunk.setAnchor(reference);
+ tmp.add(chunk);
+ }
+ return tmp;
+ }
+
+/**
+ * Gets the type of the text element.
+ *
+ * @return a type
+ */
+
+ public int type() {
+ return Element.ANCHOR;
+ }
+
+ // methods
+
+/**
+ * Gets an iterator of <CODE>Element</CODE>s.
+ *
+ * @return an <CODE>Iterator</CODE>
+ */
+
+ // suggestion by by Curt Thompson
+ public Iterator getElements() {
+ return this.iterator();
+ }
+
+/**
+ * Sets the name of this <CODE>Anchor</CODE>.
+ *
+ * @param name a new name
+ */
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+/**
+ * Sets the reference of this <CODE>Anchor</CODE>.
+ *
+ * @param reference a new reference
+ */
+
+ public void setReference(String reference) {
+ this.reference = reference;
+ }
+
+ // methods to retrieve information
+
+/**
+ * Returns the name of this <CODE>Anchor</CODE>.
+ *
+ * @return a name
+ */
+
+ public String name() {
+ return name;
+ }
+
+/**
+ * Gets the reference of this <CODE>Anchor</CODE>.
+ *
+ * @return a reference
+ */
+
+ public String reference() {
+ return reference;
+ }
+
+/**
+ * Gets the reference of this <CODE>Anchor</CODE>.
+ *
+ * @return an <CODE>URL</CODE>
+ */
+
+ public URL url() {
+ try {
+ return new URL(reference);
+ }
+ catch(MalformedURLException mue) {
+ return null;
+ }
+ }
+
+/**
+ * Checks if a given tag corresponds with this object.
+ *
+ * @param tag the given tag
+ * @return true if the tag corresponds
+ */
+
+ public static boolean isTag(String tag) {
+ return ElementTags.ANCHOR.equals(tag);
+ }
+}
diff --git a/src/main/java/com/lowagie/text/Annotation.java b/src/main/java/com/lowagie/text/Annotation.java
new file mode 100644
index 0000000..debc897
--- /dev/null
+++ b/src/main/java/com/lowagie/text/Annotation.java
@@ -0,0 +1,737 @@
+/*
+ * $Id: Annotation.java,v 1.72 2005/11/01 12:27:05 psoares33 Exp $
+ * $Name: $
+ *
+ * Copyright 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text;
+
+import java.net.URL;
+import java.util.HashMap;
+import java.util.ArrayList;
+import java.util.Properties;
+import java.util.Set;
+
+/**
+ * An <CODE>Annotation</CODE> is a little note that can be added to a page on
+ * a document.
+ *
+ * @see Element
+ * @see Anchor
+ */
+
+public class Annotation implements Element, MarkupAttributes {
+
+ // membervariables
+
+ /** This is a possible annotation type. */
+ public static final int TEXT = 0;
+
+ /** This is a possible annotation type. */
+ public static final int URL_NET = 1;
+
+ /** This is a possible annotation type. */
+ public static final int URL_AS_STRING = 2;
+
+ /** This is a possible annotation type. */
+ public static final int FILE_DEST = 3;
+
+ /** This is a possible annotation type. */
+ public static final int FILE_PAGE = 4;
+
+ /** This is a possible annotation type. */
+ public static final int NAMED_DEST = 5;
+
+ /** This is a possible annotation type. */
+ public static final int LAUNCH = 6;
+
+ /** This is a possible annotation type. */
+ public static final int SCREEN = 7;
+
+ /** This is a possible attribute. */
+ public static String TITLE = "title";
+
+ /** This is a possible attribute. */
+ public static String CONTENT = "content";
+
+ /** This is a possible attribute. */
+ public static String URL = "url";
+
+ /** This is a possible attribute. */
+ public static String FILE = "file";
+
+ /** This is a possible attribute. */
+ public static String DESTINATION = "destination";
+
+ /** This is a possible attribute. */
+ public static String PAGE = "page";
+
+ /** This is a possible attribute. */
+ public static String NAMED = "named";
+
+ /** This is a possible attribute. */
+ public static String APPLICATION = "application";
+
+ /** This is a possible attribute. */
+ public static String PARAMETERS = "parameters";
+
+ /** This is a possible attribute. */
+ public static String OPERATION = "operation";
+
+ /** This is a possible attribute. */
+ public static String DEFAULTDIR = "defaultdir";
+
+ /** This is a possible attribute. */
+ public static String LLX = "llx";
+
+ /** This is a possible attribute. */
+ public static String LLY = "lly";
+
+ /** This is a possible attribute. */
+ public static String URX = "urx";
+
+ /** This is a possible attribute. */
+ public static String URY = "ury";
+
+ /** This is a possible attribute. */
+ public static String MIMETYPE = "mime";
+
+ /** This is the type of annotation. */
+ protected int annotationtype;
+
+ /** This is the title of the <CODE>Annotation</CODE>. */
+ protected HashMap annotationAttributes = new HashMap();
+
+ /** Contains extra markupAttributes */
+ protected Properties markupAttributes = null;
+
+ /** This is the lower left x-value */
+ protected float llx = Float.NaN;
+
+ /** This is the lower left y-value */
+ protected float lly = Float.NaN;
+
+ /** This is the upper right x-value */
+ protected float urx = Float.NaN;
+
+ /** This is the upper right y-value */
+ protected float ury = Float.NaN;
+
+ // constructors
+
+ /**
+ * Constructs an <CODE>Annotation</CODE> with a certain title and some
+ * text.
+ *
+ * @param llx
+ * lower left x coordinate
+ * @param lly
+ * lower left y coordinate
+ * @param urx
+ * upper right x coordinate
+ * @param ury
+ * upper right y coordinate
+ */
+
+ private Annotation(float llx, float lly, float urx, float ury) {
+ this.llx = llx;
+ this.lly = lly;
+ this.urx = urx;
+ this.ury = ury;
+ }
+
+ public Annotation(Annotation an) {
+ annotationtype = an.annotationtype;
+ annotationAttributes = an.annotationAttributes;
+ markupAttributes = an.markupAttributes;
+ llx = an.llx;
+ lly = an.lly;
+ urx = an.urx;
+ ury = an.ury;
+ }
+
+ /**
+ * Constructs an <CODE>Annotation</CODE> with a certain title and some
+ * text.
+ *
+ * @param title
+ * the title of the annotation
+ * @param text
+ * the content of the annotation
+ */
+
+ public Annotation(String title, String text) {
+ annotationtype = TEXT;
+ annotationAttributes.put(TITLE, title);
+ annotationAttributes.put(CONTENT, text);
+ }
+
+ /**
+ * Constructs an <CODE>Annotation</CODE> with a certain title and some
+ * text.
+ *
+ * @param title
+ * the title of the annotation
+ * @param text
+ * the content of the annotation
+ * @param llx
+ * the lower left x-value
+ * @param lly
+ * the lower left y-value
+ * @param urx
+ * the upper right x-value
+ * @param ury
+ * the upper right y-value
+ */
+
+ public Annotation(String title, String text, float llx, float lly,
+ float urx, float ury) {
+ this(llx, lly, urx, ury);
+ annotationtype = TEXT;
+ annotationAttributes.put(TITLE, title);
+ annotationAttributes.put(CONTENT, text);
+ }
+
+ /**
+ * Constructs an <CODE>Annotation</CODE>.
+ *
+ * @param llx
+ * the lower left x-value
+ * @param lly
+ * the lower left y-value
+ * @param urx
+ * the upper right x-value
+ * @param ury
+ * the upper right y-value
+ * @param url
+ * the external reference
+ */
+
+ public Annotation(float llx, float lly, float urx, float ury, URL url) {
+ this(llx, lly, urx, ury);
+ annotationtype = URL_NET;
+ annotationAttributes.put(URL, url);
+ }
+
+ /**
+ * Constructs an <CODE>Annotation</CODE>.
+ *
+ * @param llx
+ * the lower left x-value
+ * @param lly
+ * the lower left y-value
+ * @param urx
+ * the upper right x-value
+ * @param ury
+ * the upper right y-value
+ * @param url
+ * the external reference
+ */
+
+ public Annotation(float llx, float lly, float urx, float ury, String url) {
+ this(llx, lly, urx, ury);
+ annotationtype = URL_AS_STRING;
+ annotationAttributes.put(FILE, url);
+ }
+
+ /**
+ * Constructs an <CODE>Annotation</CODE>.
+ *
+ * @param llx
+ * the lower left x-value
+ * @param lly
+ * the lower left y-value
+ * @param urx
+ * the upper right x-value
+ * @param ury
+ * the upper right y-value
+ * @param file
+ * an external PDF file
+ * @param dest
+ * the destination in this file
+ */
+
+ public Annotation(float llx, float lly, float urx, float ury, String file,
+ String dest) {
+ this(llx, lly, urx, ury);
+ annotationtype = FILE_DEST;
+ annotationAttributes.put(FILE, file);
+ annotationAttributes.put(DESTINATION, dest);
+ }
+
+ /**
+ * Creates a Screen anotation to embed media clips
+ *
+ * @param llx
+ * @param lly
+ * @param urx
+ * @param ury
+ * @param moviePath
+ * path to the media clip file
+ * @param mimeType
+ * mime type of the media
+ * @param showOnDisplay
+ * if true play on display of the page
+ */
+ public Annotation(float llx, float lly, float urx, float ury,
+ String moviePath, String mimeType, boolean showOnDisplay) {
+ this(llx, lly, urx, ury);
+ annotationtype = SCREEN;
+ annotationAttributes.put(FILE, moviePath);
+ annotationAttributes.put(MIMETYPE, mimeType);
+ annotationAttributes.put(PARAMETERS, new boolean[] {
+ false /* embedded */, showOnDisplay });
+ }
+
+ /**
+ * Constructs an <CODE>Annotation</CODE>.
+ *
+ * @param llx
+ * the lower left x-value
+ * @param lly
+ * the lower left y-value
+ * @param urx
+ * the upper right x-value
+ * @param ury
+ * the upper right y-value
+ * @param file
+ * an external PDF file
+ * @param page
+ * a page number in this file
+ */
+
+ public Annotation(float llx, float lly, float urx, float ury, String file,
+ int page) {
+ this(llx, lly, urx, ury);
+ annotationtype = FILE_PAGE;
+ annotationAttributes.put(FILE, file);
+ annotationAttributes.put(PAGE, new Integer(page));
+ }
+
+ /**
+ * Constructs an <CODE>Annotation</CODE>.
+ *
+ * @param llx
+ * the lower left x-value
+ * @param lly
+ * the lower left y-value
+ * @param urx
+ * the upper right x-value
+ * @param ury
+ * the upper right y-value
+ * @param named
+ * a named destination in this file
+ */
+
+ public Annotation(float llx, float lly, float urx, float ury, int named) {
+ this(llx, lly, urx, ury);
+ annotationtype = NAMED_DEST;
+ annotationAttributes.put(NAMED, new Integer(named));
+ }
+
+ /**
+ * Constructs an <CODE>Annotation</CODE>.
+ *
+ * @param llx
+ * the lower left x-value
+ * @param lly
+ * the lower left y-value
+ * @param urx
+ * the upper right x-value
+ * @param ury
+ * the upper right y-value
+ * @param application
+ * an external application
+ * @param parameters
+ * parameters to pass to this application
+ * @param operation
+ * the operation to pass to this application
+ * @param defaultdir
+ * the default directory to run this application in
+ */
+
+ public Annotation(float llx, float lly, float urx, float ury,
+ String application, String parameters, String operation,
+ String defaultdir) {
+ this(llx, lly, urx, ury);
+ annotationtype = LAUNCH;
+ annotationAttributes.put(APPLICATION, application);
+ annotationAttributes.put(PARAMETERS, parameters);
+ annotationAttributes.put(OPERATION, operation);
+ annotationAttributes.put(DEFAULTDIR, defaultdir);
+ }
+
+ /**
+ * Returns an <CODE>Annotation</CODE> that has been constructed taking in
+ * account the value of some <VAR>attributes </VAR>.
+ *
+ * @param attributes
+ * Some attributes
+ */
+
+ public Annotation(Properties attributes) {
+ String value = (String) attributes.remove(ElementTags.LLX);
+ if (value != null) {
+ llx = Float.valueOf(value + "f").floatValue();
+ }
+ value = (String) attributes.remove(ElementTags.LLY);
+ if (value != null) {
+ lly = Float.valueOf(value + "f").floatValue();
+ }
+ value = (String) attributes.remove(ElementTags.URX);
+ if (value != null) {
+ urx = Float.valueOf(value + "f").floatValue();
+ }
+ value = (String) attributes.remove(ElementTags.URY);
+ if (value != null) {
+ ury = Float.valueOf(value + "f").floatValue();
+ }
+ String title = (String) attributes.remove(ElementTags.TITLE);
+ String text = (String) attributes.remove(ElementTags.CONTENT);
+ if (title != null || text != null) {
+ annotationtype = TEXT;
+ } else if ((value = (String) attributes.remove(ElementTags.URL)) != null) {
+ annotationtype = URL_AS_STRING;
+ annotationAttributes.put(FILE, value);
+ } else if ((value = (String) attributes.remove(ElementTags.NAMED)) != null) {
+ annotationtype = NAMED_DEST;
+ annotationAttributes.put(NAMED, Integer.valueOf(value));
+ } else {
+ String file = (String) attributes.remove(ElementTags.FILE);
+ String destination = (String) attributes
+ .remove(ElementTags.DESTINATION);
+ String page = (String) attributes.remove(ElementTags.PAGE);
+ if (file != null) {
+ annotationAttributes.put(FILE, file);
+ if (destination != null) {
+ annotationtype = FILE_DEST;
+ annotationAttributes.put(DESTINATION, destination);
+ } else if (page != null) {
+ annotationtype = FILE_PAGE;
+ annotationAttributes.put(FILE, file);
+ annotationAttributes.put(PAGE, Integer.valueOf(page));
+ }
+ } else if ((value = (String) attributes.remove(ElementTags.NAMED)) != null) {
+ annotationtype = LAUNCH;
+ annotationAttributes.put(APPLICATION, value);
+ annotationAttributes.put(PARAMETERS, attributes
+ .remove(ElementTags.PARAMETERS));
+ annotationAttributes.put(OPERATION, attributes
+ .remove(ElementTags.OPERATION));
+ annotationAttributes.put(DEFAULTDIR, attributes
+ .remove(ElementTags.DEFAULTDIR));
+ }
+ }
+ if (annotationtype == TEXT) {
+ if (title == null)
+ title = "";
+ if (text == null)
+ text = "";
+ annotationAttributes.put(TITLE, title);
+ annotationAttributes.put(CONTENT, text);
+ }
+ if (attributes.size() > 0)
+ setMarkupAttributes(attributes);
+ }
+
+ // implementation of the Element-methods
+
+ /**
+ * Gets the type of the text element.
+ *
+ * @return a type
+ */
+
+ public int type() {
+ return Element.ANNOTATION;
+ }
+
+ // methods
+
+ /**
+ * Processes the element by adding it (or the different parts) to an <CODE>
+ * ElementListener</CODE>.
+ *
+ * @param listener
+ * an <CODE>ElementListener</CODE>
+ * @return <CODE>true</CODE> if the element was processed successfully
+ */
+
+ public boolean process(ElementListener listener) {
+ try {
+ return listener.add(this);
+ } catch (DocumentException de) {
+ return false;
+ }
+ }
+
+ /**
+ * Gets all the chunks in this element.
+ *
+ * @return an <CODE>ArrayList</CODE>
+ */
+
+ public ArrayList getChunks() {
+ return new ArrayList();
+ }
+
+ // methods
+
+ /**
+ * Sets the dimensions of this annotation.
+ *
+ * @param llx
+ * the lower left x-value
+ * @param lly
+ * the lower left y-value
+ * @param urx
+ * the upper right x-value
+ * @param ury
+ * the upper right y-value
+ */
+
+ public void setDimensions(float llx, float lly, float urx, float ury) {
+ this.llx = llx;
+ this.lly = lly;
+ this.urx = urx;
+ this.ury = ury;
+ }
+
+ // methods to retrieve information
+
+ /**
+ * Returns the lower left x-value.
+ *
+ * @return a value
+ */
+
+ public float llx() {
+ return llx;
+ }
+
+ /**
+ * Returns the lower left y-value.
+ *
+ * @return a value
+ */
+
+ public float lly() {
+ return lly;
+ }
+
+ /**
+ * Returns the uppper right x-value.
+ *
+ * @return a value
+ */
+
+ public float urx() {
+ return urx;
+ }
+
+ /**
+ * Returns the uppper right y-value.
+ *
+ * @return a value
+ */
+
+ public float ury() {
+ return ury;
+ }
+
+ /**
+ * Returns the lower left x-value.
+ *
+ * @param def
+ * the default value
+ * @return a value
+ */
+
+ public float llx(float def) {
+ if (Float.isNaN(llx))
+ return def;
+ return llx;
+ }
+
+ /**
+ * Returns the lower left y-value.
+ *
+ * @param def
+ * the default value
+ * @return a value
+ */
+
+ public float lly(float def) {
+ if (Float.isNaN(lly))
+ return def;
+ return lly;
+ }
+
+ /**
+ * Returns the upper right x-value.
+ *
+ * @param def
+ * the default value
+ * @return a value
+ */
+
+ public float urx(float def) {
+ if (Float.isNaN(urx))
+ return def;
+ return urx;
+ }
+
+ /**
+ * Returns the upper right y-value.
+ *
+ * @param def
+ * the default value
+ * @return a value
+ */
+
+ public float ury(float def) {
+ if (Float.isNaN(ury))
+ return def;
+ return ury;
+ }
+
+ /**
+ * Returns the type of this <CODE>Annotation</CODE>.
+ *
+ * @return a type
+ */
+
+ public int annotationType() {
+ return annotationtype;
+ }
+
+ /**
+ * Returns the title of this <CODE>Annotation</CODE>.
+ *
+ * @return a name
+ */
+
+ public String title() {
+ String s = (String) annotationAttributes.get(TITLE);
+ if (s == null)
+ s = "";
+ return s;
+ }
+
+ /**
+ * Gets the content of this <CODE>Annotation</CODE>.
+ *
+ * @return a reference
+ */
+
+ public String content() {
+ String s = (String) annotationAttributes.get(CONTENT);
+ if (s == null)
+ s = "";
+ return s;
+ }
+
+ /**
+ * Gets the content of this <CODE>Annotation</CODE>.
+ *
+ * @return a reference
+ */
+
+ public HashMap attributes() {
+ return annotationAttributes;
+ }
+
+ /**
+ * Checks if a given tag corresponds with this object.
+ *
+ * @param tag
+ * the given tag
+ * @return true if the tag corresponds
+ */
+
+ public static boolean isTag(String tag) {
+ return ElementTags.ANNOTATION.equals(tag);
+ }
+
+ /**
+ * @see com.lowagie.text.MarkupAttributes#setMarkupAttribute(java.lang.String,
+ * java.lang.String)
+ */
+ public void setMarkupAttribute(String name, String value) {
+ if (markupAttributes == null) markupAttributes = new Properties();
+ markupAttributes.put(name, value);
+ }
+
+ /**
+ * @see com.lowagie.text.MarkupAttributes#setMarkupAttributes(java.util.Properties)
+ */
+ public void setMarkupAttributes(Properties markupAttributes) {
+ this.markupAttributes = markupAttributes;
+ }
+
+ /**
+ * @see com.lowagie.text.MarkupAttributes#getMarkupAttribute(java.lang.String)
+ */
+ public String getMarkupAttribute(String name) {
+ return (markupAttributes == null) ? null : String
+ .valueOf(markupAttributes.get(name));
+ }
+
+ /**
+ * @see com.lowagie.text.MarkupAttributes#getMarkupAttributeNames()
+ */
+ public Set getMarkupAttributeNames() {
+ return Chunk.getKeySet(markupAttributes);
+ }
+
+ /**
+ * @see com.lowagie.text.MarkupAttributes#getMarkupAttributes()
+ */
+ public Properties getMarkupAttributes() {
+ return markupAttributes;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/BadElementException.java b/src/main/java/com/lowagie/text/BadElementException.java
new file mode 100644
index 0000000..7c7b459
--- /dev/null
+++ b/src/main/java/com/lowagie/text/BadElementException.java
@@ -0,0 +1,89 @@
+/*
+ * $Id: BadElementException.java,v 1.50 2004/12/14 11:33:49 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text;
+
+/**
+ * Signals an attempt to create an <CODE>Element</CODE> that hasn't got the right form.
+ *
+ * @see DocumentException
+ * @see Cell
+ * @see Table
+ */
+
+public class BadElementException extends DocumentException {
+
+ // constructors
+ /**
+ * Constructs a BadElementException
+ * @param ex an Exception object that has to be turned into a BadElementException
+ */
+ public BadElementException(Exception ex) {
+ super(ex);
+ }
+
+/**
+ * Constructs a <CODE>BadElementException</CODE> whithout a message.
+ */
+
+ BadElementException() {
+ super();
+ }
+
+/**
+ * Constructs a <code>BadElementException</code> with a message.
+ *
+ * @param message a message describing the exception
+ */
+
+ public BadElementException(String message) {
+ super(message);
+ }
+}
diff --git a/src/main/java/com/lowagie/text/Cell.java b/src/main/java/com/lowagie/text/Cell.java
new file mode 100644
index 0000000..32d6b70
--- /dev/null
+++ b/src/main/java/com/lowagie/text/Cell.java
@@ -0,0 +1,1013 @@
+/*
+ * $Id: Cell.java,v 1.106 2005/11/12 18:00:57 psoares33 Exp $
+ * $Name: $
+ *
+ * Copyright 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text;
+
+import java.awt.Color;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.Properties;
+
+import com.lowagie.text.markup.MarkupParser;
+import com.lowagie.text.pdf.PdfPCell;
+
+/**
+ * A <CODE>Cell</CODE> is a <CODE>Rectangle</CODE> containing other
+ * <CODE>Element</CODE>s.
+ * <P>
+ * A <CODE>Cell</CODE> must be added to a <CODE>Table</CODE>.
+ * The <CODE>Table</CODE> will place the <CODE>Cell</CODE> in
+ * a <CODE>Row</CODE>.
+ * <P>
+ * Example:
+ * <BLOCKQUOTE><PRE>
+ * Table table = new Table(3);
+ * table.setBorderWidth(1);
+ * table.setBorderColor(new Color(0, 0, 255));
+ * table.setCellpadding(5);
+ * table.setCellspacing(5);
+ * <STRONG>Cell cell = new Cell("header");</STRONG>
+ * <STRONG>cell.setHeader(true);</STRONG>
+ * <STRONG>cell.setColspan(3);</STRONG>
+ * table.addCell(cell);
+ * <STRONG>cell = new Cell("example cell with colspan 1 and rowspan 2");</STRONG>
+ * <STRONG>cell.setRowspan(2);</STRONG>
+ * <STRONG>cell.setBorderColor(new Color(255, 0, 0));</STRONG>
+ * table.addCell(cell);
+ * table.addCell("1.1");
+ * table.addCell("2.1");
+ * table.addCell("1.2");
+ * table.addCell("2.2");
+ * </PRE></BLOCKQUOTE>
+ *
+ * @see Rectangle
+ * @see Element
+ * @see Table
+ * @see Row
+ */
+
+public class Cell extends Rectangle implements TextElementArray {
+
+ // static final membervariable
+
+ // This accessor replaces the dangerous static member DUMMY_CELL
+ /**
+ * Get dummy cell used when merging inner tables.
+ * @return a cell with colspan 3 and no border
+ */
+ public static Cell getDummyCell() {
+ Cell cell = new Cell(true);
+ cell.setColspan(3);
+ cell.setBorder(NO_BORDER);
+ return cell;
+ }
+
+ // membervariables
+
+/** This is the <CODE>ArrayList</CODE> of <CODE>Element</CODE>s. */
+ protected ArrayList arrayList = null;
+
+/** This is the horizontal alignment. */
+ protected int horizontalAlignment = Element.ALIGN_UNDEFINED;
+
+/** This is the vertical alignment. */
+ protected int verticalAlignment = Element.ALIGN_UNDEFINED;
+
+/** This is the vertical alignment. */
+ protected String width;
+
+/** This is the colspan. */
+ protected int colspan = 1;
+
+/** This is the rowspan. */
+ protected int rowspan = 1;
+
+/** This is the leading. */
+ float leading = Float.NaN;
+
+/** Is this <CODE>Cell</CODE> a header? */
+ protected boolean header;
+
+ /** Indicates that the largest ascender height should be used to determine the
+ * height of the first line. Note that this only has an effect when rendered
+ * to PDF. Setting this to true can help with vertical alignment problems. */
+ protected boolean useAscender = false;
+
+ /** Indicates that the largest descender height should be added to the height of
+ * the last line (so characters like y don't dip into the border). Note that
+ * this only has an effect when rendered to PDF. */
+ protected boolean useDescender = false;
+
+ /**
+ * Adjusts the cell contents to compensate for border widths. Note that
+ * this only has an effect when rendered to PDF.
+ */
+ protected boolean useBorderPadding;
+
+ // constructors
+
+/**
+ * Constructs an empty <CODE>Cell</CODE>.
+ */
+
+ public Cell() {
+ // creates a Rectangle with BY DEFAULT a border of 0.5
+ super(0, 0, 0, 0);
+ setBorder(UNDEFINED);
+ setBorderWidth(0.5f);
+
+ // initializes the arraylist and adds an element
+ arrayList = new ArrayList();
+ }
+
+/**
+ * Constructs an empty <CODE>Cell</CODE> (for internal use only).
+ *
+ * @param dummy a dummy value
+ */
+
+ public Cell(boolean dummy) {
+ this();
+ arrayList.add(new Paragraph(0));
+ }
+
+/**
+ * Constructs a <CODE>Cell</CODE> with a certain content.
+ * <P>
+ * The <CODE>String</CODE> will be converted into a <CODE>Paragraph</CODE>.
+ *
+ * @param content a <CODE>String</CODE>
+ */
+
+ public Cell(String content) {
+ // creates a Rectangle with BY DEFAULT a border of 0.5
+ super(0, 0, 0, 0);
+ setBorder(UNDEFINED);
+ setBorderWidth(0.5f);
+
+ // initializes the arraylist and adds an element
+ arrayList = new ArrayList();
+ try {
+ addElement(new Paragraph(content));
+ }
+ catch(BadElementException bee) {
+ }
+ }
+
+/**
+ * Constructs a <CODE>Cell</CODE> with a certain <CODE>Element</CODE>.
+ * <P>
+ * if the element is a <CODE>ListItem</CODE>, <CODE>Row</CODE> or
+ * <CODE>Cell</CODE>, an exception will be thrown.
+ *
+ * @param element the element
+ * @throws BadElementException when the creator was called with a <CODE>ListItem</CODE>, <CODE>Row</CODE> or <CODE>Cell</CODE>
+ */
+
+ public Cell(Element element) throws BadElementException {
+ // creates a Rectangle with BY DEFAULT a border of 0.5
+ super(0, 0, 0, 0);
+ setBorder(UNDEFINED);
+ setBorderWidth(0.5f);
+
+ // Update by Benoit WIART <b.wiart@proxiad.com>
+ if(element instanceof Phrase) {
+ Phrase p = (Phrase)element;
+ leading = p.leading();
+ }
+
+ // initializes the arraylist and adds an element
+ arrayList = new ArrayList();
+ addElement(element);
+ }
+
+/**
+ * Returns a <CODE>Cell</CODE> that has been constructed taking in account
+ * the value of some <VAR>attributes</VAR>.
+ *
+ * @param attributes Some attributes
+ */
+
+ public Cell(Properties attributes) {
+ this();
+ String value;
+ if ((value = (String)attributes.remove(ElementTags.HORIZONTALALIGN)) != null) {
+ setHorizontalAlignment(value);
+ }
+ if ((value = (String)attributes.remove(ElementTags.VERTICALALIGN)) != null) {
+ setVerticalAlignment(value);
+ }
+ if ((value = (String)attributes.remove(ElementTags.WIDTH)) != null) {
+ setWidth(value);
+ }
+ if ((value = (String)attributes.remove(ElementTags.COLSPAN)) != null) {
+ setColspan(Integer.parseInt(value));
+ }
+ if ((value = (String)attributes.remove(ElementTags.ROWSPAN)) != null) {
+ setRowspan(Integer.parseInt(value));
+ }
+ if ((value = (String)attributes.remove(ElementTags.LEADING)) != null) {
+ setLeading(Float.valueOf(value + "f").floatValue());
+ }
+ if ((value = (String)attributes.remove(ElementTags.HEADER)) != null) {
+ setHeader(new Boolean(value).booleanValue());
+ }
+ if ((value = (String)attributes.remove(ElementTags.NOWRAP)) != null) {
+ setNoWrap(new Boolean(value).booleanValue());
+ }
+ if ((value = (String)attributes.remove(ElementTags.BORDERWIDTH)) != null) {
+ setBorderWidth(Float.valueOf(value + "f").floatValue());
+ }
+ int border = 0;
+ if ((value = (String)attributes.remove(ElementTags.LEFT)) != null) {
+ if (new Boolean(value).booleanValue()) border |= Rectangle.LEFT;
+ }
+ if ((value = (String)attributes.remove(ElementTags.RIGHT)) != null) {
+ if (new Boolean(value).booleanValue()) border |= Rectangle.RIGHT;
+ }
+ if ((value = (String)attributes.remove(ElementTags.TOP)) != null) {
+ if (new Boolean(value).booleanValue()) border |= Rectangle.TOP;
+ }
+ if ((value = (String)attributes.remove(ElementTags.BOTTOM)) != null) {
+ if (new Boolean(value).booleanValue()) border |= Rectangle.BOTTOM;
+ }
+ setBorder(border);
+ String r = (String)attributes.remove(ElementTags.RED);
+ String g = (String)attributes.remove(ElementTags.GREEN);
+ String b = (String)attributes.remove(ElementTags.BLUE);
+ if (r != null || g != null || b != null) {
+ int red = 0;
+ int green = 0;
+ int blue = 0;
+ if (r != null) red = Integer.parseInt(r);
+ if (g != null) green = Integer.parseInt(g);
+ if (b != null) blue = Integer.parseInt(b);
+ setBorderColor(new Color(red, green, blue));
+ }
+ else if ((value = (String)attributes.remove(ElementTags.BORDERCOLOR)) != null) {
+ setBorderColor(MarkupParser.decodeColor(value));
+ }
+ r = (String)attributes.remove(ElementTags.BGRED);
+ g = (String)attributes.remove(ElementTags.BGGREEN);
+ b = (String)attributes.remove(ElementTags.BGBLUE);
+ if (r != null || g != null || b != null) {
+ int red = 0;
+ int green = 0;
+ int blue = 0;
+ if (r != null) red = Integer.parseInt(r);
+ if (g != null) green = Integer.parseInt(g);
+ if (b != null) blue = Integer.parseInt(b);
+ setBackgroundColor(new Color(red, green, blue));
+ }
+ else if ((value = (String)attributes.remove(ElementTags.BACKGROUNDCOLOR)) != null) {
+ setBackgroundColor(MarkupParser.decodeColor(value));
+ }
+ if ((value = (String)attributes.remove(ElementTags.GRAYFILL)) != null) {
+ setGrayFill(Float.valueOf(value + "f").floatValue());
+ }
+ if (attributes.size() > 0) setMarkupAttributes(attributes);
+ }
+
+ // implementation of the Element-methods
+
+/**
+ * Processes the element by adding it (or the different parts) to an
+ * <CODE>ElementListener</CODE>.
+ *
+ * @param listener an <CODE>ElementListener</CODE>
+ * @return <CODE>true</CODE> if the element was processed successfully
+ */
+
+ public boolean process(ElementListener listener) {
+ try {
+ return listener.add(this);
+ }
+ catch(DocumentException de) {
+ return false;
+ }
+ }
+
+/**
+ * Gets the type of the text element.
+ *
+ * @return a type
+ */
+
+ public int type() {
+ return Element.CELL;
+ }
+
+/**
+ * Gets all the chunks in this element.
+ *
+ * @return an <CODE>ArrayList</CODE>
+ */
+
+ public ArrayList getChunks() {
+ ArrayList tmp = new ArrayList();
+ for (Iterator i = arrayList.iterator(); i.hasNext(); ) {
+ tmp.addAll(((Element) i.next()).getChunks());
+ }
+ return tmp;
+ }
+
+ // methods to set the membervariables
+
+/**
+ * Adds an element to this <CODE>Cell</CODE>.
+ * <P>
+ * Remark: you can't add <CODE>ListItem</CODE>s, <CODE>Row</CODE>s, <CODE>Cell</CODE>s,
+ * <CODE>JPEG</CODE>s, <CODE>GIF</CODE>s or <CODE>PNG</CODE>s to a <CODE>Cell</CODE>.
+ *
+ * @param element The <CODE>Element</CODE> to add
+ * @throws BadElementException if the method was called with a <CODE>ListItem</CODE>, <CODE>Row</CODE> or <CODE>Cell</CODE>
+ */
+
+ public void addElement(Element element) throws BadElementException {
+ if (isTable()) {
+ Table table = (Table) arrayList.get(0);
+ Cell tmp = new Cell(element);
+ tmp.setBorder(NO_BORDER);
+ tmp.setColspan(table.columns());
+ table.addCell(tmp);
+ return;
+ }
+ switch(element.type()) {
+ case Element.LISTITEM:
+ case Element.ROW:
+ case Element.CELL:
+ throw new BadElementException("You can't add listitems, rows or cells to a cell.");
+ case Element.LIST:
+ if (Float.isNaN(leading)) {
+ leading = ((List) element).leading();
+ }
+ if (((List) element).size() == 0) return;
+ arrayList.add(element);
+ return;
+ case Element.ANCHOR:
+ case Element.PARAGRAPH:
+ case Element.PHRASE:
+ if (Float.isNaN(leading)) {
+ leading = ((Phrase) element).leading();
+ }
+ if (((Phrase) element).isEmpty()) return;
+ arrayList.add(element);
+ return;
+ case Element.CHUNK:
+ if (((Chunk) element).isEmpty()) return;
+ arrayList.add(element);
+ return;
+ case Element.TABLE:
+ Table table = new Table(3);
+ float[] widths = new float[3];
+ widths[1] = ((Table)element).widthPercentage();
+
+ switch(((Table)element).alignment()) {
+ case Element.ALIGN_LEFT:
+ widths[0] = 0f;
+ widths[2] = 100f - widths[1];
+ break;
+ case Element.ALIGN_CENTER:
+ widths[0] = (100f - widths[1]) / 2f;
+ widths[2] = widths[0];
+ break;
+ case Element.ALIGN_RIGHT:
+ widths[0] = 100f - widths[1];
+ widths[2] = 0f;
+ }
+ table.setWidths(widths);
+ Cell tmp;
+ if (arrayList.size() == 0) {
+ table.addCell(getDummyCell());
+ }
+ else {
+ tmp = new Cell();
+ tmp.setBorder(NO_BORDER);
+ tmp.setColspan(3);
+ for (Iterator i = arrayList.iterator(); i.hasNext(); ) {
+ tmp.add((Element) i.next());
+ }
+ table.addCell(tmp);
+ }
+ tmp = new Cell();
+ tmp.setBorder(NO_BORDER);
+ table.addCell(tmp);
+ table.insertTable((Table)element);
+ table.addCell(tmp);
+ table.addCell(getDummyCell());
+ clear();
+ arrayList.add(table);
+ return;
+ default:
+ arrayList.add(element);
+ }
+ }
+
+/**
+ * Add an <CODE>Object</CODE> to this cell.
+ *
+ * @param o the object to add
+ * @return always <CODE>true</CODE>
+ */
+
+ public boolean add(Object o) {
+ try {
+ this.addElement((Element) o);
+ return true;
+ }
+ catch(ClassCastException cce) {
+ throw new ClassCastException("You can only add objects that implement the Element interface.");
+ }
+ catch(BadElementException bee) {
+ throw new ClassCastException(bee.getMessage());
+ }
+ }
+
+/**
+ * Sets the leading.
+ *
+ * @param value the new value
+ */
+
+ public void setLeading(float value) {
+ leading = value;
+ }
+
+/**
+ * Sets the horizontal alignment.
+ *
+ * @param value the new value
+ */
+
+ public void setHorizontalAlignment(int value) {
+ horizontalAlignment = value;
+ }
+
+/**
+ * Sets the alignment of this cell.
+ *
+ * @param alignment the new alignment as a <CODE>String</CODE>
+ */
+
+ public void setHorizontalAlignment(String alignment) {
+ if (ElementTags.ALIGN_CENTER.equalsIgnoreCase(alignment)) {
+ this.horizontalAlignment = Element.ALIGN_CENTER;
+ return;
+ }
+ if (ElementTags.ALIGN_RIGHT.equalsIgnoreCase(alignment)) {
+ this.horizontalAlignment = Element.ALIGN_RIGHT;
+ return;
+ }
+ if (ElementTags.ALIGN_JUSTIFIED.equalsIgnoreCase(alignment)) {
+ this.horizontalAlignment = Element.ALIGN_JUSTIFIED;
+ return;
+ }
+ if (ElementTags.ALIGN_JUSTIFIED_ALL.equalsIgnoreCase(alignment)) {
+ this.horizontalAlignment = Element.ALIGN_JUSTIFIED_ALL;
+ return;
+ }
+ this.horizontalAlignment = Element.ALIGN_LEFT;
+ }
+
+/**
+ * Sets the vertical alignment.
+ *
+ * @param value the new value
+ */
+
+ public void setVerticalAlignment(int value) {
+ verticalAlignment = value;
+ }
+
+/**
+ * Sets the alignment of this paragraph.
+ *
+ * @param alignment the new alignment as a <CODE>String</CODE>
+ */
+
+ public void setVerticalAlignment(String alignment) {
+ if (ElementTags.ALIGN_MIDDLE.equalsIgnoreCase(alignment)) {
+ this.verticalAlignment = Element.ALIGN_MIDDLE;
+ return;
+ }
+ if (ElementTags.ALIGN_BOTTOM.equalsIgnoreCase(alignment)) {
+ this.verticalAlignment = Element.ALIGN_BOTTOM;
+ return;
+ }
+ if (ElementTags.ALIGN_BASELINE.equalsIgnoreCase(alignment)) {
+ this.verticalAlignment = Element.ALIGN_BASELINE;
+ return;
+ }
+ this.verticalAlignment = Element.ALIGN_TOP;
+ }
+
+/**
+ * Sets the width.
+ *
+ * @param value the new value
+ */
+
+ public void setWidth(String value) {
+ width = value;
+ }
+
+/**
+ * Sets the colspan.
+ *
+ * @param value the new value
+ */
+
+ public void setColspan(int value) {
+ colspan = value;
+ }
+
+/**
+ * Sets the rowspan.
+ *
+ * @param value the new value
+ */
+
+ public void setRowspan(int value) {
+ rowspan = value;
+ }
+
+/**
+ * Sets header.
+ *
+ * @param value the new value
+ */
+
+ public void setHeader(boolean value) {
+ header = value;
+ }
+
+/**
+ * Set nowrap.
+ *
+ * @param value the new value
+ */
+
+ public void setNoWrap(boolean value) {
+ maxLines = 1;
+ }
+
+ // methods to retrieve information
+
+/**
+ * Gets the number of <CODE>Element</CODE>s in the Cell.
+ *
+ * @return a <CODE>size</CODE>.
+ */
+
+ public int size() {
+ return arrayList.size();
+ }
+
+/**
+ * Checks if the <CODE>Cell</CODE> is empty.
+ *
+ * @return <CODE>false</CODE> if there are non-empty <CODE>Element</CODE>s in the <CODE>Cell</CODE>.
+ */
+
+ public boolean isEmpty() {
+ switch(size()) {
+ case 0:
+ return true;
+ case 1:
+ Element element = (Element) arrayList.get(0);
+ switch (element.type()) {
+ case Element.CHUNK:
+ return ((Chunk) element).isEmpty();
+ case Element.ANCHOR:
+ case Element.PHRASE:
+ case Element.PARAGRAPH:
+ return ((Phrase) element).isEmpty();
+ case Element.LIST:
+ return ((List) element).size() == 0;
+ }
+ return false;
+ default:
+ return false;
+ }
+ }
+
+/**
+ * Makes sure there is at least 1 object in the Cell.
+ *
+ * Otherwise it might not be shown in the table.
+ */
+
+ void fill() {
+ if (size() == 0) arrayList.add(new Paragraph(0));
+ }
+
+/**
+ * Checks if the <CODE>Cell</CODE> is empty.
+ *
+ * @return <CODE>false</CODE> if there are non-empty <CODE>Element</CODE>s in the <CODE>Cell</CODE>.
+ */
+
+ public boolean isTable() {
+ return (size() == 1) && (((Element)arrayList.get(0)).type() == Element.TABLE);
+ }
+
+/**
+ * Gets an iterator of <CODE>Element</CODE>s.
+ *
+ * @return an <CODE>Iterator</CODE>.
+ */
+
+ public Iterator getElements() {
+ return arrayList.iterator();
+ }
+
+/**
+ * Gets the horizontal alignment.
+ *
+ * @return a value
+ */
+
+ public int horizontalAlignment() {
+ return horizontalAlignment;
+ }
+
+/**
+ * Gets the vertical alignment.
+ *
+ * @return a value
+ */
+
+ public int verticalAlignment() {
+ return verticalAlignment;
+ }
+
+/**
+ * Gets the width.
+ *
+ * @return a value
+ */
+
+ public String cellWidth() {
+ return width;
+ }
+
+/**
+ * Gets the colspan.
+ *
+ * @return a value
+ */
+
+ public int colspan() {
+ return colspan;
+ }
+
+/**
+ * Gets the rowspan.
+ *
+ * @return a value
+ */
+
+ public int rowspan() {
+ return rowspan;
+ }
+
+/**
+ * Gets the leading.
+ *
+ * @return a value
+ */
+
+ public float leading() {
+ if (Float.isNaN(leading)) {
+ return 16;
+ }
+ return leading;
+ }
+
+/**
+ * Is this <CODE>Cell</CODE> a header?
+ *
+ * @return a value
+ */
+
+ public boolean header() {
+ return header;
+ }
+
+/**
+ * Get nowrap.
+ *
+ * @return a value
+ */
+
+ public boolean noWrap() {
+ return maxLines == 1;
+ }
+
+/**
+ * Clears all the <CODE>Element</CODE>s of this <CODE>Cell</CODE>.
+ */
+ public void clear() {
+ arrayList.clear();
+ }
+
+/**
+ * This method throws an <CODE>UnsupportedOperationException</CODE>.
+ * @return NA
+ */
+ public float top() {
+ throw new UnsupportedOperationException("Dimensions of a Cell can't be calculated. See the FAQ.");
+ }
+
+/**
+ * This method throws an <CODE>UnsupportedOperationException</CODE>.
+ * @return NA
+ */
+ public float bottom() {
+ throw new UnsupportedOperationException("Dimensions of a Cell can't be calculated. See the FAQ.");
+ }
+
+/**
+ * This method throws an <CODE>UnsupportedOperationException</CODE>.
+ * @return NA
+ */
+ public float left() {
+ throw new UnsupportedOperationException("Dimensions of a Cell can't be calculated. See the FAQ.");
+ }
+
+/**
+ * This method throws an <CODE>UnsupportedOperationException</CODE>.
+ * @return NA
+ */
+ public float right() {
+ throw new UnsupportedOperationException("Dimensions of a Cell can't be calculated. See the FAQ.");
+ }
+
+/**
+ * This method throws an <CODE>UnsupportedOperationException</CODE>.
+ * @param margin
+ * @return NA
+ */
+ public float top(int margin) {
+ throw new UnsupportedOperationException("Dimensions of a Cell can't be calculated. See the FAQ.");
+ }
+
+/**
+ * This method throws an <CODE>UnsupportedOperationException</CODE>.
+ * @param margin
+ * @return NA
+ */
+ public float bottom(int margin) {
+ throw new UnsupportedOperationException("Dimensions of a Cell can't be calculated. See the FAQ.");
+ }
+
+/**
+ * This method throws an <CODE>UnsupportedOperationException</CODE>.
+ * @param margin
+ * @return NA
+ */
+ public float left(int margin) {
+ throw new UnsupportedOperationException("Dimensions of a Cell can't be calculated. See the FAQ.");
+ }
+
+/**
+ * This method throws an <CODE>UnsupportedOperationException</CODE>.
+ * @param margin NA
+ * @return NA
+ */
+ public float right(int margin) {
+ throw new UnsupportedOperationException("Dimensions of a Cell can't be calculated. See the FAQ.");
+ }
+
+/**
+ * This method throws an <CODE>UnsupportedOperationException</CODE>.
+ * @param value NA
+ */
+ public void setTop(int value) {
+ throw new UnsupportedOperationException("Dimensions of a Cell are attributed automagically. See the FAQ.");
+ }
+
+/**
+ * This method throws an <CODE>UnsupportedOperationException</CODE>.
+ * @param value NA
+ */
+ public void setBottom(int value) {
+ throw new UnsupportedOperationException("Dimensions of a Cell are attributed automagically. See the FAQ.");
+ }
+
+/**
+ * This method throws an <CODE>UnsupportedOperationException</CODE>.
+ * @param value NA
+ */
+ public void setLeft(int value) {
+ throw new UnsupportedOperationException("Dimensions of a Cell are attributed automagically. See the FAQ.");
+ }
+
+/**
+ * This method throws an <CODE>UnsupportedOperationException</CODE>.
+ * @param value NA
+ */
+ public void setRight(int value) {
+ throw new UnsupportedOperationException("Dimensions of a Cell are attributed automagically. See the FAQ.");
+ }
+
+/**
+ * Checks if a given tag corresponds with this object.
+ *
+ * @param tag the given tag
+ * @return true if the tag corresponds
+ */
+
+ public static boolean isTag(String tag) {
+ return ElementTags.CELL.equals(tag);
+ }
+
+/** Does this <CODE>Cell</CODE> force a group change? */
+ protected boolean groupChange = true;
+
+/**
+ * Does this <CODE>Cell</CODE> force a group change?
+ *
+ * @return a value
+ */
+
+ public boolean getGroupChange() {
+ return groupChange;
+ }
+
+/**
+ * Sets group change.
+ *
+ * @param value the new value
+ */
+
+ public void setGroupChange(boolean value) {
+ groupChange = value;
+ }
+
+ /**
+ * Getter for {@link #maxLines}
+ * @return the maxLines value
+ */
+ public int getMaxLines() {
+ return maxLines;
+ }
+ /**
+ * Setter for {@link #maxLines}
+ * @param value the maximum number of lines
+ */
+ public void setMaxLines(int value) {
+ maxLines = value;
+ }
+ /**
+ * Maximum number of lines allowed in the cell.
+ * The default value of this property is not to limit the maximum number of lines
+ * (contributed by dperezcar@fcc.es)
+ */
+ protected int maxLines = Integer.MAX_VALUE;
+ /**Setter for {@link #showTruncation}
+ * @param value Can be null for avoiding marking the truncation.*/
+ public void setShowTruncation(String value) {
+ showTruncation = value;
+ }
+ /**
+ * Getter for {@link #showTruncation}
+ * @return the showTruncation value
+ */
+ public String getShowTruncation() {
+ return showTruncation;
+ }
+ /**
+ * If a truncation happens due to the {@link #maxLines} property, then this text will
+ * be added to indicate a truncation has happened.
+ * Default value is null, and means avoiding marking the truncation.
+ * A useful value of this property could be e.g. "..."
+ * (contributed by dperezcar@fcc.es)
+ */
+ String showTruncation;
+
+
+ /**
+ * Sets the value of {@link #useAscender}.
+ * @param use use ascender height if true
+ */
+ public void setUseAscender(boolean use) {
+ useAscender = use;
+ }
+
+ /**
+ * Gets the value of {@link #useAscender}
+ * @return useAscender
+ */
+ public boolean isUseAscender() {
+ return useAscender;
+ }
+
+ /**
+ * Sets the value of {@link #useDescender}.
+ * @param use use descender height if true
+ */
+ public void setUseDescender(boolean use) {
+ useDescender = use;
+ }
+
+ /**
+ * gets the value of {@link #useDescender }
+ * @return useDescender
+ */
+ public boolean isUseDescender() {
+ return useDescender;
+ }
+
+ /**
+ * Sets the value of {@link #useBorderPadding}.
+ * @param use adjust layour for borders if true
+ */
+ public void setUseBorderPadding(boolean use) {
+ useBorderPadding = use;
+ }
+
+ /**
+ * Gets the value of {@link #useBorderPadding}.
+ * @return useBorderPadding
+ */
+ public boolean isUseBorderPadding() {
+ return useBorderPadding;
+ }
+
+ /**
+ * Creates a PdfPCell based on this Cell object.
+ * @return a PdfPCell
+ * @throws BadElementException
+ */
+ public PdfPCell createPdfPCell() throws BadElementException {
+ if (rowspan > 1) throw new BadElementException("PdfPCells can't have a rowspan > 1");
+ if (isTable()) return new PdfPCell(((Table)arrayList.get(0)).createPdfPTable());
+ PdfPCell cell = new PdfPCell();
+ cell.setVerticalAlignment(verticalAlignment);
+ cell.setHorizontalAlignment(horizontalAlignment);
+ cell.setColspan(colspan);
+ cell.setUseBorderPadding(useBorderPadding);
+ cell.setUseDescender(useDescender);
+ cell.setLeading(leading(), 0);
+ cell.cloneNonPositionParameters(this);
+ cell.setNoWrap(noWrap());
+ for (Iterator i = getElements(); i.hasNext(); ) {
+ Element e = (Element)i.next();
+ if (e.type() == Element.PHRASE || e.type() == Element.PARAGRAPH) {
+ Paragraph p = new Paragraph((Phrase)e);
+ p.setAlignment(horizontalAlignment);
+ e = p;
+ }
+ cell.addElement(e);
+ }
+ return cell;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/Chapter.java b/src/main/java/com/lowagie/text/Chapter.java
new file mode 100644
index 0000000..19006b7
--- /dev/null
+++ b/src/main/java/com/lowagie/text/Chapter.java
@@ -0,0 +1,156 @@
+/*
+ * $Id: Chapter.java,v 1.69 2005/04/13 09:51:14 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ *
+ */
+
+package com.lowagie.text;
+
+import java.util.ArrayList;
+import java.util.Properties;
+
+/**
+ * A <CODE>Chapter</CODE> is a special <CODE>Section</CODE>.
+ * <P>
+ * A chapter number has to be created using a <CODE>Paragraph</CODE> as title
+ * and an <CODE>int</CODE> as chapter number. The chapter number is shown be
+ * default. If you don't want to see the chapter number, you have to set the
+ * numberdepth to <VAR>0</VAR>.
+ * <P>
+ * Example:
+ * <BLOCKQUOTE><PRE>
+ * Paragraph title2 = new Paragraph("This is Chapter 2", FontFactory.getFont(FontFactory.HELVETICA, 18, Font.BOLDITALIC, new Color(0, 0, 255)));
+ * <STRONG>Chapter chapter2 = new Chapter(title2, 2);</STRONG>
+ * <STRONG>chapter2.setNumberDepth(0);</STRONG>
+ * Paragraph someText = new Paragraph("This is some text");
+ * <STRONG>chapter2.add(someText);</STRONG>
+ * Paragraph title21 = new Paragraph("This is Section 1 in Chapter 2", FontFactory.getFont(FontFactory.HELVETICA, 16, Font.BOLD, new Color(255, 0, 0)));
+ * Section section1 = <STRONG>chapter2.addSection(title21);</STRONG>
+ * Paragraph someSectionText = new Paragraph("This is some silly paragraph in a chapter and/or section. It contains some text to test the functionality of Chapters and Section.");
+ * section1.add(someSectionText);
+ * </PRE></BLOCKQUOTE>
+ */
+
+public class Chapter extends Section implements TextElementArray {
+
+ // constructors
+
+ /**
+ * Constructs a new <CODE>Chapter</CODE>.
+ *
+ * @param title the Chapter title (as a <CODE>Paragraph</CODE>)
+ * @param number the Chapter number
+ */
+
+ public Chapter(Paragraph title, int number) {
+ super(title, 1);
+ numbers = new ArrayList();
+ numbers.add(new Integer(number));
+ }
+
+/**
+ * Constructs a new <CODE>Chapter</CODE>.
+ *
+ * @param title the Chapter title (as a <CODE>String</CODE>)
+ * @param number the Chapter number
+ */
+
+ public Chapter(String title, int number) {
+ this(new Paragraph(title), number);
+ }
+
+/**
+ * Creates a new <CODE>Chapter</CODE> following a set of attributes.
+ *
+ * @param attributes the attributes
+ * @param number a userdefined Chapter number
+ */
+
+ public Chapter(Properties attributes, int number) {
+ this(new Paragraph(""), number);
+
+ String value;
+ if ((value = (String)attributes.remove(ElementTags.NUMBERDEPTH)) != null) {
+ setNumberDepth(Integer.parseInt(value));
+ }
+ if ((value = (String)attributes.remove(ElementTags.INDENT)) != null) {
+ setIndentation(Float.valueOf(value + "f").floatValue());
+ }
+ if ((value = (String)attributes.remove(ElementTags.INDENTATIONLEFT)) != null) {
+ setIndentationLeft(Float.valueOf(value + "f").floatValue());
+ }
+ if ((value = (String)attributes.remove(ElementTags.INDENTATIONRIGHT)) != null) {
+ setIndentationRight(Float.valueOf(value + "f").floatValue());
+ }
+ }
+
+ // implementation of the Element-methods
+
+/**
+ * Gets the type of the text element.
+ *
+ * @return a type
+ */
+
+ public int type() {
+ return Element.CHAPTER;
+ }
+
+ // methods
+
+/**
+ * Checks if a given tag corresponds with this object.
+ *
+ * @param tag the given tag
+ * @return true if the tag corresponds
+ */
+
+ public static boolean isTag(String tag) {
+ return ElementTags.CHAPTER.equals(tag);
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/ChapterAutoNumber.java b/src/main/java/com/lowagie/text/ChapterAutoNumber.java
new file mode 100644
index 0000000..efb83ba
--- /dev/null
+++ b/src/main/java/com/lowagie/text/ChapterAutoNumber.java
@@ -0,0 +1,103 @@
+/*
+ * Copyright 2005 by Michael Niedermair.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text;
+
+import com.lowagie.text.Chapter;
+import com.lowagie.text.Paragraph;
+
+/**
+ * Chapter with auto numbering.
+ *
+ * @author Michael Niedermair
+ */
+public class ChapterAutoNumber extends Chapter {
+
+ /**
+ * the chapter number (for all instance)
+ */
+ private static int chapternumber = 0;
+
+ /**
+ * Create a new object.
+ *
+ * @param para the Chapter title (as a <CODE>Paragraph</CODE>)
+ */
+ public ChapterAutoNumber(final Paragraph para) {
+ super(para, ++chapternumber);
+ }
+
+ /**
+ * Create a new objet.
+ *
+ * @param title the Chapter title (as a <CODE>String</CODE>)
+ */
+ public ChapterAutoNumber(final String title) {
+ super(title, ++chapternumber);
+ }
+
+ /**
+ * Create a new section for this chapter and ad it.
+ *
+ * @param title the Section title (as a <CODE>String</CODE>)
+ * @return Returns the new section.
+ */
+ public Section addSection(final String title) {
+ return addSection(title, 2);
+ }
+
+ /**
+ * Create a new section for this chapter and add it.
+ *
+ * @param title the Section title (as a <CODE>Paragraph</CODE>)
+ * @return Returns the new section.
+ */
+ public Section addSection(final Paragraph title) {
+ return addSection(title, 2);
+ }
+
+}
diff --git a/src/main/java/com/lowagie/text/Chunk.java b/src/main/java/com/lowagie/text/Chunk.java
new file mode 100644
index 0000000..c72e54c
--- /dev/null
+++ b/src/main/java/com/lowagie/text/Chunk.java
@@ -0,0 +1,937 @@
+/*
+ * $Id: Chunk.java,v 1.114 2005/12/08 14:56:53 psoares33 Exp $
+ * $Name: $
+ *
+ * Copyright 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text;
+
+import java.awt.Color;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Hashtable;
+import java.util.Properties;
+import java.util.Set;
+import java.net.URL;
+
+import com.lowagie.text.pdf.PdfAction;
+import com.lowagie.text.pdf.PdfAnnotation;
+import com.lowagie.text.pdf.HyphenationEvent;
+import com.lowagie.text.pdf.PdfContentByte;
+import com.lowagie.text.markup.MarkupTags;
+import com.lowagie.text.markup.MarkupParser;
+
+/**
+ * This is the smallest significant part of text that can be added to a
+ * document.
+ * <P>
+ * Most elements can be divided in one or more <CODE>Chunk</CODE>s. A chunk
+ * is a <CODE>String</CODE> with a certain <CODE>Font</CODE>. All other
+ * layout parameters should be defined in the object to which this chunk of text
+ * is added.
+ * <P>
+ * Example: <BLOCKQUOTE>
+ *
+ * <PRE>
+ *
+ * <STRONG>Chunk chunk = new Chunk("Hello world",
+ * FontFactory.getFont(FontFactory.COURIER, 20, Font.ITALIC, new Color(255, 0,
+ * 0))); </STRONG> document.add(chunk);
+ *
+ * </PRE>
+ *
+ * </BLOCKQUOTE>
+ */
+
+public class Chunk implements Element, MarkupAttributes {
+
+ // public static membervariables
+
+ /**
+ * The character stand in for an image.
+ */
+ public static final String OBJECT_REPLACEMENT_CHARACTER = "\ufffc";
+
+ /** This is a Chunk containing a newline. */
+ public static final Chunk NEWLINE = new Chunk("\n");
+
+ /** This is a Chunk containing a newpage. */
+ public static final Chunk NEXTPAGE = new Chunk("");
+ static {
+ NEXTPAGE.setNewPage();
+ }
+
+ /** Key for sub/superscript. */
+ public static final String SUBSUPSCRIPT = "SUBSUPSCRIPT";
+
+ /** Key for underline. */
+ public static final String UNDERLINE = "UNDERLINE";
+
+ /** Key for color. */
+ public static final String COLOR = "COLOR";
+
+ /** Key for encoding. */
+ public static final String ENCODING = "ENCODING";
+
+ /** Key for remote goto. */
+ public static final String REMOTEGOTO = "REMOTEGOTO";
+
+ /** Key for local goto. */
+ public static final String LOCALGOTO = "LOCALGOTO";
+
+ /** Key for local destination. */
+ public static final String LOCALDESTINATION = "LOCALDESTINATION";
+
+ /** Key for image. */
+ public static final String IMAGE = "IMAGE";
+
+ /** Key for generic tag. */
+ public static final String GENERICTAG = "GENERICTAG";
+
+ /** Key for newpage. */
+ public static final String NEWPAGE = "NEWPAGE";
+
+ /** Key for split character. */
+ public static final String SPLITCHARACTER = "SPLITCHARACTER";
+
+ /** Key for Action. */
+ public static final String ACTION = "ACTION";
+
+ /** Key for background. */
+ public static final String BACKGROUND = "BACKGROUND";
+
+ /** Key for annotation. */
+ public static final String PDFANNOTATION = "PDFANNOTATION";
+
+ /** Key for hyphenation. */
+ public static final String HYPHENATION = "HYPHENATION";
+
+ /** Key for text rendering mode. */
+ public static final String TEXTRENDERMODE = "TEXTRENDERMODE";
+
+ /** Key for text skewing. */
+ public static final String SKEW = "SKEW";
+
+ /** Key for text horizontal scaling. */
+ public static final String HSCALE = "HSCALE";
+
+ // member variables
+
+ /** This is the content of this chunk of text. */
+ protected StringBuffer content = null;
+
+ /** This is the <CODE>Font</CODE> of this chunk of text. */
+ protected Font font = null;
+
+ /** Contains some of the attributes for this Chunk. */
+ protected HashMap attributes = null;
+
+ /** Contains extra markupAttributes */
+ protected Properties markupAttributes = null;
+
+ // constructors
+
+ /**
+ * Empty constructor.
+ */
+ protected Chunk() {
+ }
+
+ /**
+ * A <CODE>Chunk</CODE> copy constructor.
+ * @param ck the <CODE>Chunk</CODE> to be copied
+ */
+ public Chunk(Chunk ck) {
+ if (ck.content != null) {
+ content = new StringBuffer(ck.content.toString());
+ }
+ if (ck.font != null) {
+ font = new Font(ck.font);
+ }
+ if (ck.attributes != null) {
+ attributes = new HashMap(ck.attributes);
+ }
+ if (ck.markupAttributes != null) {
+ markupAttributes = new Properties();
+ markupAttributes.putAll(ck.markupAttributes);
+ }
+ }
+
+ /**
+ * Constructs a chunk of text with a certain content and a certain <CODE>
+ * Font</CODE>.
+ *
+ * @param content
+ * the content
+ * @param font
+ * the font
+ */
+
+ public Chunk(String content, Font font) {
+ this.content = new StringBuffer(content);
+ this.font = font;
+ }
+
+ /**
+ * Constructs a chunk of text with a certain content, without specifying a
+ * <CODE>Font</CODE>.
+ *
+ * @param content
+ * the content
+ */
+ public Chunk(String content) {
+ this(content, new Font());
+ }
+
+ /**
+ * Constructs a chunk of text with a char and a certain <CODE>Font</CODE>.
+ *
+ * @param c
+ * the content
+ * @param font
+ * the font
+ */
+ public Chunk(char c, Font font) {
+ this.content = new StringBuffer();
+ this.content.append(c);
+ this.font = font;
+ }
+
+ /**
+ * Constructs a chunk of text with a char, without specifying a <CODE>Font
+ * </CODE>.
+ *
+ * @param c
+ * the content
+ */
+ public Chunk(char c) {
+ this(c, new Font());
+ }
+
+ /**
+ * Constructs a chunk containing an <CODE>Image</CODE>.
+ *
+ * @param image
+ * the image
+ * @param offsetX
+ * the image offset in the x direction
+ * @param offsetY
+ * the image offset in the y direction
+ */
+
+ public Chunk(Image image, float offsetX, float offsetY) {
+ this(OBJECT_REPLACEMENT_CHARACTER, new Font());
+ Image copyImage = Image.getInstance(image);
+ copyImage.setAbsolutePosition(Float.NaN, Float.NaN);
+ setAttribute(IMAGE, new Object[] { copyImage, new Float(offsetX),
+ new Float(offsetY), new Boolean(false) });
+ }
+
+ /**
+ * Constructs a chunk containing an <CODE>Image</CODE>.
+ *
+ * @param image
+ * the image
+ * @param offsetX
+ * the image offset in the x direction
+ * @param offsetY
+ * the image offset in the y direction
+ * @param changeLeading
+ * true if the leading has to be adapted to the image
+ */
+
+ public Chunk(Image image, float offsetX, float offsetY,
+ boolean changeLeading) {
+ this(OBJECT_REPLACEMENT_CHARACTER, new Font());
+ setAttribute(IMAGE, new Object[] { image, new Float(offsetX),
+ new Float(offsetY), new Boolean(changeLeading) });
+ }
+
+ /**
+ * Returns a <CODE>Chunk</CODE> that has been constructed taking in
+ * account the value of some <VAR>attributes </VAR>.
+ *
+ * @param attributes
+ * Some attributes
+ */
+
+ public Chunk(Properties attributes) {
+ this("", FontFactory.getFont(attributes));
+ String value;
+ if ((value = (String) attributes.remove(ElementTags.ITEXT)) != null) {
+ append(value);
+ }
+ if ((value = (String) attributes.remove(ElementTags.LOCALGOTO)) != null) {
+ setLocalGoto(value);
+ }
+ if ((value = (String) attributes.remove(ElementTags.REMOTEGOTO)) != null) {
+ String destination = (String) attributes
+ .remove(ElementTags.DESTINATION);
+ String page = (String) attributes.remove(ElementTags.PAGE);
+ if (page != null) {
+ setRemoteGoto(value, Integer.parseInt(page));
+ } else if (destination != null) {
+ setRemoteGoto(value, destination);
+ }
+ }
+ if ((value = (String) attributes.remove(ElementTags.LOCALDESTINATION)) != null) {
+ setLocalDestination(value);
+ }
+ if ((value = (String) attributes.remove(ElementTags.SUBSUPSCRIPT)) != null) {
+ setTextRise(Float.valueOf(value + "f").floatValue());
+ }
+ if ((value = (String) attributes
+ .remove(MarkupTags.CSS_KEY_VERTICALALIGN)) != null
+ && value.endsWith("%")) {
+ float p = Float.valueOf(
+ value.substring(0, value.length() - 1) + "f").floatValue() / 100f;
+ setTextRise(p * font.size());
+ }
+ if ((value = (String) attributes.remove(ElementTags.GENERICTAG)) != null) {
+ setGenericTag(value);
+ }
+ if ((value = (String) attributes.remove(ElementTags.BACKGROUNDCOLOR)) != null) {
+ setBackground(MarkupParser.decodeColor(value));
+ }
+ if (attributes.size() > 0)
+ setMarkupAttributes(attributes);
+ }
+
+ // implementation of the Element-methods
+
+ /**
+ * Processes the element by adding it (or the different parts) to an <CODE>
+ * ElementListener</CODE>.
+ *
+ * @param listener
+ * an <CODE>ElementListener</CODE>
+ * @return <CODE>true</CODE> if the element was processed successfully
+ */
+
+ public boolean process(ElementListener listener) {
+ try {
+ return listener.add(this);
+ } catch (DocumentException de) {
+ return false;
+ }
+ }
+
+ /**
+ * Gets the type of the text element.
+ *
+ * @return a type
+ */
+
+ public int type() {
+ return Element.CHUNK;
+ }
+
+ /**
+ * Gets all the chunks in this element.
+ *
+ * @return an <CODE>ArrayList</CODE>
+ */
+
+ public ArrayList getChunks() {
+ ArrayList tmp = new ArrayList();
+ tmp.add(this);
+ return tmp;
+ }
+
+ // methods
+
+ /**
+ * appends some text to this <CODE>Chunk</CODE>.
+ *
+ * @param string
+ * <CODE>String</CODE>
+ * @return a <CODE>StringBuffer</CODE>
+ */
+
+ public StringBuffer append(String string) {
+ return content.append(string);
+ }
+
+ // methods to retrieve information
+
+ /**
+ * Gets the font of this <CODE>Chunk</CODE>.
+ *
+ * @return a <CODE>Font</CODE>
+ */
+
+ public Font font() {
+ return font;
+ }
+
+ /**
+ * Sets the font of this <CODE>Chunk</CODE>.
+ *
+ * @param font
+ * a <CODE>Font</CODE>
+ */
+
+ public void setFont(Font font) {
+ this.font = font;
+ }
+
+ /**
+ * Returns the content of this <CODE>Chunk</CODE>.
+ *
+ * @return a <CODE>String</CODE>
+ */
+
+ public String content() {
+ return content.toString();
+ }
+
+ /**
+ * Returns the content of this <CODE>Chunk</CODE>.
+ *
+ * @return a <CODE>String</CODE>
+ */
+
+ public String toString() {
+ return content.toString();
+ }
+
+ /**
+ * Checks is this <CODE>Chunk</CODE> is empty.
+ *
+ * @return <CODE>false</CODE> if the Chunk contains other characters than
+ * space.
+ */
+
+ public boolean isEmpty() {
+ return (content.toString().trim().length() == 0)
+ && (content.toString().indexOf("\n") == -1)
+ && (attributes == null);
+ }
+
+ /**
+ * Gets the width of the Chunk in points.
+ *
+ * @return a width in points
+ */
+ public float getWidthPoint() {
+ if (getImage() != null) {
+ return getImage().scaledWidth();
+ }
+ return font.getCalculatedBaseFont(true).getWidthPoint(content(),
+ font.getCalculatedSize())
+ * getHorizontalScaling();
+ }
+
+ /**
+ * Sets the text displacement relative to the baseline. Positive values rise
+ * the text, negative values lower the text.
+ * <P>
+ * It can be used to implement sub/superscript.
+ *
+ * @param rise
+ * the displacement in points
+ * @return this <CODE>Chunk</CODE>
+ */
+
+ public Chunk setTextRise(float rise) {
+ return setAttribute(SUBSUPSCRIPT, new Float(rise));
+ }
+
+ /**
+ * Gets the text displacement relatiev to the baseline.
+ *
+ * @return a displacement in points
+ */
+ public float getTextRise() {
+ if (attributes.containsKey(SUBSUPSCRIPT)) {
+ Float f = (Float) attributes.get(SUBSUPSCRIPT);
+ return f.floatValue();
+ }
+ return 0.0f;
+ }
+
+ /**
+ * Sets the text rendering mode. It can outline text, simulate bold and make
+ * text invisible.
+ *
+ * @param mode
+ * the text rendering mode. It can be <CODE>
+ * PdfContentByte.TEXT_RENDER_MODE_FILL</CODE>,<CODE>
+ * PdfContentByte.TEXT_RENDER_MODE_STROKE</CODE>,<CODE>
+ * PdfContentByte.TEXT_RENDER_MODE_FILL_STROKE</CODE> and <CODE>
+ * PdfContentByte.TEXT_RENDER_MODE_INVISIBLE</CODE>.
+ * @param strokeWidth
+ * the stroke line width for the modes <CODE>
+ * PdfContentByte.TEXT_RENDER_MODE_STROKE</CODE> and <CODE>
+ * PdfContentByte.TEXT_RENDER_MODE_FILL_STROKE</CODE>.
+ * @param strokeColor
+ * the stroke color or <CODE>null</CODE> to follow the text
+ * color
+ * @return this <CODE>Chunk</CODE>
+ */
+ public Chunk setTextRenderMode(int mode, float strokeWidth,
+ Color strokeColor) {
+ return setAttribute(TEXTRENDERMODE, new Object[] { new Integer(mode),
+ new Float(strokeWidth), strokeColor });
+ }
+
+ /**
+ * Skews the text to simulate italic and other effects. Try <CODE>alpha=0
+ * </CODE> and <CODE>beta=12</CODE>.
+ *
+ * @param alpha
+ * the first angle in degrees
+ * @param beta
+ * the second angle in degrees
+ * @return this <CODE>Chunk</CODE>
+ */
+ public Chunk setSkew(float alpha, float beta) {
+ alpha = (float) Math.tan(alpha * Math.PI / 180);
+ beta = (float) Math.tan(beta * Math.PI / 180);
+ return setAttribute(SKEW, new float[] { alpha, beta });
+ }
+
+ /**
+ * Sets the text horizontal scaling. A value of 1 is normal and a value of
+ * 0.5f shrinks the text to half it's width.
+ *
+ * @param scale
+ * the horizontal scaling factor
+ * @return this <CODE>Chunk</CODE>
+ */
+ public Chunk setHorizontalScaling(float scale) {
+ return setAttribute(HSCALE, new Float(scale));
+ }
+
+ /**
+ * Gets the horizontal scaling.
+ *
+ * @return a percentage in float
+ */
+ public float getHorizontalScaling() {
+ if (attributes == null)
+ return 1f;
+ Float f = (Float) attributes.get(HSCALE);
+ if (f == null)
+ return 1f;
+ return f.floatValue();
+ }
+
+ /**
+ * Sets an action for this <CODE>Chunk</CODE>.
+ *
+ * @param action
+ * the action
+ * @return this <CODE>Chunk</CODE>
+ */
+
+ public Chunk setAction(PdfAction action) {
+ return setAttribute(ACTION, action);
+ }
+
+ /**
+ * Sets an anchor for this <CODE>Chunk</CODE>.
+ *
+ * @param url
+ * the <CODE>URL</CODE> to link to
+ * @return this <CODE>Chunk</CODE>
+ */
+
+ public Chunk setAnchor(URL url) {
+ return setAttribute(ACTION, new PdfAction(url.toExternalForm()));
+ }
+
+ /**
+ * Sets an anchor for this <CODE>Chunk</CODE>.
+ *
+ * @param url
+ * the url to link to
+ * @return this <CODE>Chunk</CODE>
+ */
+
+ public Chunk setAnchor(String url) {
+ return setAttribute(ACTION, new PdfAction(url));
+ }
+
+ /**
+ * Sets a local goto for this <CODE>Chunk</CODE>.
+ * <P>
+ * There must be a local destination matching the name.
+ *
+ * @param name
+ * the name of the destination to go to
+ * @return this <CODE>Chunk</CODE>
+ */
+
+ public Chunk setLocalGoto(String name) {
+ return setAttribute(LOCALGOTO, name);
+ }
+
+ /**
+ * Sets the color of the background <CODE>Chunk</CODE>.
+ *
+ * @param color
+ * the color of the background
+ * @return this <CODE>Chunk</CODE>
+ */
+ public Chunk setBackground(Color color) {
+ return setBackground(color, 0, 0, 0, 0);
+ }
+
+ /**
+ * Sets the color and the size of the background <CODE>Chunk</CODE>.
+ *
+ * @param color
+ * the color of the background
+ * @param extraLeft
+ * increase the size of the rectangle in the left
+ * @param extraBottom
+ * increase the size of the rectangle in the bottom
+ * @param extraRight
+ * increase the size of the rectangle in the right
+ * @param extraTop
+ * increase the size of the rectangle in the top
+ * @return this <CODE>Chunk</CODE>
+ */
+ public Chunk setBackground(Color color, float extraLeft, float extraBottom,
+ float extraRight, float extraTop) {
+ return setAttribute(BACKGROUND, new Object[] { color,
+ new float[] { extraLeft, extraBottom, extraRight, extraTop } });
+ }
+
+ /**
+ * Sets an horizontal line that can be an underline or a strikethrough.
+ * Actually, the line can be anywhere vertically and has always the <CODE>
+ * Chunk</CODE> width. Multiple call to this method will produce multiple
+ * lines.
+ *
+ * @param thickness
+ * the absolute thickness of the line
+ * @param yPosition
+ * the absolute y position relative to the baseline
+ * @return this <CODE>Chunk</CODE>
+ */
+ public Chunk setUnderline(float thickness, float yPosition) {
+ return setUnderline(null, thickness, 0f, yPosition, 0f,
+ PdfContentByte.LINE_CAP_BUTT);
+ }
+
+ /**
+ * Sets an horizontal line that can be an underline or a strikethrough.
+ * Actually, the line can be anywhere vertically and has always the <CODE>
+ * Chunk</CODE> width. Multiple call to this method will produce multiple
+ * lines.
+ *
+ * @param color
+ * the color of the line or <CODE>null</CODE> to follow the
+ * text color
+ * @param thickness
+ * the absolute thickness of the line
+ * @param thicknessMul
+ * the thickness multiplication factor with the font size
+ * @param yPosition
+ * the absolute y position relative to the baseline
+ * @param yPositionMul
+ * the position multiplication factor with the font size
+ * @param cap
+ * the end line cap. Allowed values are
+ * PdfContentByte.LINE_CAP_BUTT, PdfContentByte.LINE_CAP_ROUND
+ * and PdfContentByte.LINE_CAP_PROJECTING_SQUARE
+ * @return this <CODE>Chunk</CODE>
+ */
+ public Chunk setUnderline(Color color, float thickness, float thicknessMul,
+ float yPosition, float yPositionMul, int cap) {
+ if (attributes == null)
+ attributes = new HashMap();
+ Object obj[] = {
+ color,
+ new float[] { thickness, thicknessMul, yPosition, yPositionMul,
+ (float) cap } };
+ Object unders[][] = addToArray((Object[][]) attributes.get(UNDERLINE),
+ obj);
+ return setAttribute(UNDERLINE, unders);
+ }
+
+ /**
+ * Utility method to extend an array.
+ *
+ * @param original
+ * the original array or <CODE>null</CODE>
+ * @param item
+ * the item to be added to the array
+ * @return a new array with the item appended
+ */
+ public static Object[][] addToArray(Object original[][], Object item[]) {
+ if (original == null) {
+ original = new Object[1][];
+ original[0] = item;
+ return original;
+ } else {
+ Object original2[][] = new Object[original.length + 1][];
+ System.arraycopy(original, 0, original2, 0, original.length);
+ original2[original.length] = item;
+ return original2;
+ }
+ }
+
+ /**
+ * Sets a generic annotation to this <CODE>Chunk</CODE>.
+ *
+ * @param annotation
+ * the annotation
+ * @return this <CODE>Chunk</CODE>
+ */
+ public Chunk setAnnotation(PdfAnnotation annotation) {
+ return setAttribute(PDFANNOTATION, annotation);
+ }
+
+ /**
+ * sets the hyphenation engine to this <CODE>Chunk</CODE>.
+ *
+ * @param hyphenation
+ * the hyphenation engine
+ * @return this <CODE>Chunk</CODE>
+ */
+ public Chunk setHyphenation(HyphenationEvent hyphenation) {
+ return setAttribute(HYPHENATION, hyphenation);
+ }
+
+ /**
+ * Sets a goto for a remote destination for this <CODE>Chunk</CODE>.
+ *
+ * @param filename
+ * the file name of the destination document
+ * @param name
+ * the name of the destination to go to
+ * @return this <CODE>Chunk</CODE>
+ */
+
+ public Chunk setRemoteGoto(String filename, String name) {
+ return setAttribute(REMOTEGOTO, new Object[] { filename, name });
+ }
+
+ /**
+ * Sets a goto for a remote destination for this <CODE>Chunk</CODE>.
+ *
+ * @param filename
+ * the file name of the destination document
+ * @param page
+ * the page of the destination to go to. First page is 1
+ * @return this <CODE>Chunk</CODE>
+ */
+
+ public Chunk setRemoteGoto(String filename, int page) {
+ return setAttribute(REMOTEGOTO, new Object[] { filename,
+ new Integer(page) });
+ }
+
+ /**
+ * Sets a local destination for this <CODE>Chunk</CODE>.
+ *
+ * @param name
+ * the name for this destination
+ * @return this <CODE>Chunk</CODE>
+ */
+ public Chunk setLocalDestination(String name) {
+ return setAttribute(LOCALDESTINATION, name);
+ }
+
+ /**
+ * Sets the generic tag <CODE>Chunk</CODE>.
+ * <P>
+ * The text for this tag can be retrieved with <CODE>PdfPageEvent</CODE>.
+ *
+ * @param text
+ * the text for the tag
+ * @return this <CODE>Chunk</CODE>
+ */
+
+ public Chunk setGenericTag(String text) {
+ return setAttribute(GENERICTAG, text);
+ }
+
+ /**
+ * Sets the split characters.
+ *
+ * @param splitCharacter
+ * the <CODE>SplitCharacter</CODE> interface
+ * @return this <CODE>Chunk</CODE>
+ */
+
+ public Chunk setSplitCharacter(SplitCharacter splitCharacter) {
+ return setAttribute(SPLITCHARACTER, splitCharacter);
+ }
+
+ /**
+ * Sets a new page tag..
+ *
+ * @return this <CODE>Chunk</CODE>
+ */
+
+ public Chunk setNewPage() {
+ return setAttribute(NEWPAGE, null);
+ }
+
+ /**
+ * Sets an arbitrary attribute.
+ *
+ * @param name
+ * the key for the attribute
+ * @param obj
+ * the value of the attribute
+ * @return this <CODE>Chunk</CODE>
+ */
+
+ private Chunk setAttribute(String name, Object obj) {
+ if (attributes == null)
+ attributes = new HashMap();
+ attributes.put(name, obj);
+ return this;
+ }
+
+ /**
+ * Gets the attributes for this <CODE>Chunk</CODE>.
+ * <P>
+ * It may be null.
+ *
+ * @return the attributes for this <CODE>Chunk</CODE>
+ */
+
+ public HashMap getAttributes() {
+ return attributes;
+ }
+
+ /**
+ * Checks the attributes of this <CODE>Chunk</CODE>.
+ *
+ * @return false if there aren't any.
+ */
+
+ public boolean hasAttributes() {
+ return attributes != null;
+ }
+
+ /**
+ * Returns the image.
+ *
+ * @return the image
+ */
+
+ public Image getImage() {
+ if (attributes == null)
+ return null;
+ Object obj[] = (Object[]) attributes.get(Chunk.IMAGE);
+ if (obj == null)
+ return null;
+ else {
+ return (Image) obj[0];
+ }
+ }
+
+ /**
+ * Checks if a given tag corresponds with this object.
+ *
+ * @param tag
+ * the given tag
+ * @return true if the tag corresponds
+ */
+
+ public static boolean isTag(String tag) {
+ return ElementTags.CHUNK.equals(tag);
+ }
+
+ /**
+ * @see com.lowagie.text.MarkupAttributes#setMarkupAttribute(java.lang.String,
+ * java.lang.String)
+ */
+ public void setMarkupAttribute(String name, String value) {
+ if (markupAttributes == null)
+ markupAttributes = new Properties();
+ markupAttributes.put(name, value);
+ }
+
+ /**
+ * @see com.lowagie.text.MarkupAttributes#setMarkupAttributes(java.util.Properties)
+ */
+ public void setMarkupAttributes(Properties markupAttributes) {
+ this.markupAttributes = markupAttributes;
+ }
+
+ /**
+ * @see com.lowagie.text.MarkupAttributes#getMarkupAttribute(java.lang.String)
+ */
+ public String getMarkupAttribute(String name) {
+ return (markupAttributes == null) ? null : String
+ .valueOf(markupAttributes.get(name));
+ }
+
+ /**
+ * @see com.lowagie.text.MarkupAttributes#getMarkupAttributeNames()
+ */
+ public Set getMarkupAttributeNames() {
+ return getKeySet(markupAttributes);
+ }
+
+ /**
+ * @see com.lowagie.text.MarkupAttributes#getMarkupAttributes()
+ */
+ public Properties getMarkupAttributes() {
+ return markupAttributes;
+ }
+
+ /**
+ * Gets the keys of a Hashtable
+ *
+ * @param table
+ * a Hashtable
+ * @return the keyset of a Hashtable (or an empty set if table is null)
+ */
+ public static Set getKeySet(Hashtable table) {
+ return (table == null) ? Collections.EMPTY_SET : table.keySet();
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/DocListener.java b/src/main/java/com/lowagie/text/DocListener.java
new file mode 100644
index 0000000..bea3564
--- /dev/null
+++ b/src/main/java/com/lowagie/text/DocListener.java
@@ -0,0 +1,182 @@
+/*
+ * $Id: DocListener.java,v 1.52 2004/12/14 11:52:47 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright (c) 1999, 2000, 2001, 2002 Bruno Lowagie.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text;
+
+/**
+ * A class that implements <CODE>DocListener</CODE> will perform some
+ * actions when some actions are performed on a <CODE>Document</CODE>.
+ *
+ * @see ElementListener
+ * @see Document
+ * @see DocWriter
+ */
+
+public interface DocListener extends ElementListener {
+
+ // methods
+
+/**
+ * Signals that the <CODE>Document</CODE> has been opened and that
+ * <CODE>Elements</CODE> can be added.
+ */
+
+ public void open();
+
+/**
+ * Sets the pagesize.
+ *
+ * @param pageSize the new pagesize
+ * @return a <CODE>boolean</CODE>
+ */
+
+ public boolean setPageSize(Rectangle pageSize);
+
+/**
+ * Signals that a <CODE>Watermark</CODE> was added to the <CODE>Document</CODE>.
+ *
+ * @param watermark the Watermark object
+ * @return <CODE>true</CODE> if the element was added, <CODE>false</CODE> if not.
+ */
+
+ public boolean add(Watermark watermark);
+
+/**
+ * Signals that a <CODE>Watermark</CODE> was removed from the <CODE>Document</CODE>.
+ */
+
+ public void removeWatermark();
+
+/**
+ * Sets the margins.
+ *
+ * @param marginLeft the margin on the left
+ * @param marginRight the margin on the right
+ * @param marginTop the margin on the top
+ * @param marginBottom the margin on the bottom
+ * @return a <CODE>boolean</CODE>
+ */
+
+ public boolean setMargins(float marginLeft, float marginRight, float marginTop, float marginBottom);
+
+ /**
+ * Parameter that allows you to do margin mirroring (odd/even pages)
+ * @param marginMirroring
+ * @return true if succesfull
+ */
+ public boolean setMarginMirroring(boolean marginMirroring);
+
+/**
+ * Signals that an new page has to be started.
+ *
+ * @return <CODE>true</CODE> if the page was added, <CODE>false</CODE> if not.
+ * @throws DocumentException when a document isn't open yet, or has been closed
+ */
+
+ public boolean newPage() throws DocumentException;
+
+/**
+ * Changes the header of this document.
+ *
+ * @param header the new header
+ */
+
+ public void setHeader(HeaderFooter header);
+
+/**
+ * Resets the header of this document.
+ */
+
+ public void resetHeader();
+
+/**
+ * Changes the footer of this document.
+ *
+ * @param footer the new footer
+ */
+
+ public void setFooter(HeaderFooter footer);
+
+/**
+ * Resets the footer of this document.
+ */
+
+ public void resetFooter();
+
+/**
+ * Sets the page number to 0.
+ */
+
+ public void resetPageCount();
+
+/**
+ * Sets the page number.
+ *
+ * @param pageN the new page number
+ */
+
+ public void setPageCount(int pageN);
+
+/**
+ * Clears text wrapping around images (if applicable).
+ * Method suggested by Pelikan Stephan
+ * @throws DocumentException
+ */
+ public void clearTextWrap() throws DocumentException;
+
+/**
+ * Signals that the <CODE>Document</CODE> was closed and that no other
+ * <CODE>Elements</CODE> will be added.
+ * <P>
+ * The outputstream of every writer implementing <CODE>DocListener</CODE> will be closed.
+ */
+
+ public void close();
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/DocWriter.java b/src/main/java/com/lowagie/text/DocWriter.java
new file mode 100644
index 0000000..9622017
--- /dev/null
+++ b/src/main/java/com/lowagie/text/DocWriter.java
@@ -0,0 +1,510 @@
+/*
+ * $Id: DocWriter.java,v 1.70 2004/12/14 11:52:47 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text;
+
+import java.io.BufferedOutputStream;
+import java.io.OutputStream;
+import java.io.IOException;
+import java.util.Iterator;
+import com.lowagie.text.pdf.OutputStreamCounter;
+
+/**
+ * An abstract <CODE>Writer</CODE> class for documents.
+ * <P>
+ * <CODE>DocWriter</CODE> is the abstract class of several writers such
+ * as <CODE>PdfWriter</CODE> and <CODE>HtmlWriter</CODE>.
+ * A <CODE>DocWriter</CODE> can be added as a <CODE>DocListener</CODE>
+ * to a certain <CODE>Document</CODE> by getting an instance (see method
+ * <CODE>getInstance()</CODE> in the specific writer-classes).
+ * Every <CODE>Element</CODE> added to the original <CODE>Document</CODE>
+ * will be written to the <CODE>OutputStream</CODE> of the listening
+ * <CODE>DocWriter</CODE>.
+ *
+ * @see Document
+ * @see DocListener
+ */
+
+public abstract class DocWriter implements DocListener {
+
+/** This is some byte that is often used. */
+ public static final byte NEWLINE = (byte)'\n';
+
+/** This is some byte that is often used. */
+ public static final byte TAB = (byte)'\t';
+
+/** This is some byte that is often used. */
+ public static final byte LT = (byte)'<';
+
+/** This is some byte that is often used. */
+ public static final byte SPACE = (byte)' ';
+
+/** This is some byte that is often used. */
+ public static final byte EQUALS = (byte)'=';
+
+/** This is some byte that is often used. */
+ public static final byte QUOTE = (byte)'\"';
+
+/** This is some byte that is often used. */
+ public static final byte GT = (byte)'>';
+
+/** This is some byte that is often used. */
+ public static final byte FORWARD = (byte)'/';
+
+ // membervariables
+
+/** The pageSize. */
+ protected Rectangle pageSize;
+
+/** This is the document that has to be written. */
+ protected Document document;
+
+/** The outputstream of this writer. */
+ protected OutputStreamCounter os;
+
+/** Is the writer open for writing? */
+ protected boolean open = false;
+
+/** Do we have to pause all writing actions? */
+ protected boolean pause = false;
+
+/** Closes the stream on document close */
+ protected boolean closeStream = true;
+
+ // constructor
+
+ protected DocWriter() {
+ }
+
+/**
+ * Constructs a <CODE>DocWriter</CODE>.
+ *
+ * @param document The <CODE>Document</CODE> that has to be written
+ * @param os The <CODE>OutputStream</CODE> the writer has to write to.
+ */
+
+ protected DocWriter(Document document, OutputStream os) {
+ this.document = document;
+ this.os = new OutputStreamCounter(new BufferedOutputStream(os));
+ }
+
+ // implementation of the DocListener methods
+
+/**
+ * Signals that an <CODE>Element</CODE> was added to the <CODE>Document</CODE>.
+ * <P>
+ * This method should be overriden in the specific <CODE>DocWriter<CODE> classes
+ * derived from this abstract class.
+ *
+ * @param element A high level object to add
+ * @return <CODE>false</CODE>
+ * @throws DocumentException when a document isn't open yet, or has been closed
+ */
+
+ public boolean add(Element element) throws DocumentException {
+ return false;
+ }
+
+/**
+ * Signals that the <CODE>Document</CODE> was opened.
+ */
+
+ public void open() {
+ open = true;
+ }
+
+/**
+ * Sets the pagesize.
+ *
+ * @param pageSize the new pagesize
+ * @return a <CODE>boolean</CODE>
+ */
+
+ public boolean setPageSize(Rectangle pageSize) {
+ this.pageSize = pageSize;
+ return true;
+ }
+
+/**
+ * Sets the <CODE>Watermark</CODE>.
+ * <P>
+ * This method should be overriden in the specific <CODE>DocWriter<CODE> classes
+ * derived from this abstract class if they actually support the use of
+ * a <CODE>Watermark</CODE>.
+ *
+ * @param watermark A watermark object
+ * @return <CODE>false</CODE> (because watermarks aren't supported by default).
+ */
+
+ public boolean add(Watermark watermark) {
+ return false;
+ }
+
+/**
+ * Removes the <CODE>Watermark</CODE> (if there is one).
+ */
+
+ public void removeWatermark() {
+ }
+
+/**
+ * Sets the margins.
+ * <P>
+ * This does nothing. Has to be overridden if needed.
+ *
+ * @param marginLeft the margin on the left
+ * @param marginRight the margin on the right
+ * @param marginTop the margin on the top
+ * @param marginBottom the margin on the bottom
+ * @return <CODE>false</CODE>
+ */
+
+ public boolean setMargins(float marginLeft, float marginRight, float marginTop, float marginBottom) {
+ return false;
+ }
+
+/**
+ * Signals that an new page has to be started.
+ * <P>
+ * This does nothing. Has to be overridden if needed.
+ *
+ * @return <CODE>true</CODE> if the page was added, <CODE>false</CODE> if not.
+ * @throws DocumentException when a document isn't open yet, or has been closed
+ */
+
+ public boolean newPage() throws DocumentException {
+ if (!open) {
+ return false;
+ }
+ return true;
+ }
+
+/**
+ * Changes the header of this document.
+ * <P>
+ * This method should be overriden in the specific <CODE>DocWriter<CODE> classes
+ * derived from this abstract class if they actually support the use of
+ * headers.
+ *
+ * @param header the new header
+ */
+
+ public void setHeader(HeaderFooter header) {
+ }
+
+/**
+ * Resets the header of this document.
+ * <P>
+ * This method should be overriden in the specific <CODE>DocWriter<CODE> classes
+ * derived from this abstract class if they actually support the use of
+ * headers.
+ */
+
+ public void resetHeader() {
+ }
+
+/**
+ * Changes the footer of this document.
+ * <P>
+ * This method should be overriden in the specific <CODE>DocWriter<CODE> classes
+ * derived from this abstract class if they actually support the use of
+ * footers.
+ *
+ * @param footer the new footer
+ */
+
+ public void setFooter(HeaderFooter footer) {
+ }
+
+/**
+ * Resets the footer of this document.
+ * <P>
+ * This method should be overriden in the specific <CODE>DocWriter<CODE> classes
+ * derived from this abstract class if they actually support the use of
+ * footers.
+ */
+
+ public void resetFooter() {
+ }
+
+/**
+ * Sets the page number to 0.
+ * <P>
+ * This method should be overriden in the specific <CODE>DocWriter<CODE> classes
+ * derived from this abstract class if they actually support the use of
+ * pagenumbers.
+ */
+
+ public void resetPageCount() {
+ }
+
+/**
+ * Sets the page number.
+ * <P>
+ * This method should be overriden in the specific <CODE>DocWriter<CODE> classes
+ * derived from this abstract class if they actually support the use of
+ * pagenumbers.
+ *
+ * @param pageN the new page number
+ */
+
+ public void setPageCount(int pageN) {
+ }
+
+/**
+ * Signals that the <CODE>Document</CODE> was closed and that no other
+ * <CODE>Elements</CODE> will be added.
+ */
+
+ public void close() {
+ open = false;
+ try {
+ os.flush();
+ if (closeStream)
+ os.close();
+ }
+ catch(IOException ioe) {
+ throw new ExceptionConverter(ioe);
+ }
+ }
+
+ // methods
+
+/** Converts a <CODE>String</CODE> into a <CODE>Byte</CODE> array
+ * according to the ISO-8859-1 codepage.
+ * @param text the text to be converted
+ * @return the conversion result
+ */
+
+ public static final byte[] getISOBytes(String text)
+ {
+ if (text == null)
+ return null;
+ int len = text.length();
+ byte b[] = new byte[len];
+ for (int k = 0; k < len; ++k)
+ b[k] = (byte)text.charAt(k);
+ return b;
+ }
+
+/**
+ * Let the writer know that all writing has to be paused.
+ */
+
+ public void pause() {
+ pause = true;
+ }
+
+/**
+ * Let the writer know that writing may be resumed.
+ */
+
+ public void resume() {
+ pause = false;
+ }
+
+/**
+ * Flushes the <CODE>BufferedOutputStream</CODE>.
+ */
+
+ public void flush() {
+ try {
+ os.flush();
+ }
+ catch(IOException ioe) {
+ throw new ExceptionConverter(ioe);
+ }
+ }
+
+/**
+ * Writes a <CODE>String</CODE> to the <CODE>OutputStream</CODE>.
+ *
+ * @param string the <CODE>String</CODE> to write
+ * @throws IOException
+ */
+
+ protected void write(String string) throws IOException {
+ os.write(getISOBytes(string));
+ }
+
+/**
+ * Writes a number of tabs.
+ *
+ * @param indent the number of tabs to add
+ * @throws IOException
+ */
+
+ protected void addTabs(int indent) throws IOException {
+ os.write(NEWLINE);
+ for (int i = 0; i < indent; i++) {
+ os.write(TAB);
+ }
+ }
+
+/**
+ * Writes a key-value pair to the outputstream.
+ *
+ * @param key the name of an attribute
+ * @param value the value of an attribute
+ * @throws IOException
+ */
+
+ protected void write(String key, String value)
+ throws IOException {
+ os.write(SPACE);
+ write(key);
+ os.write(EQUALS);
+ os.write(QUOTE);
+ write(value);
+ os.write(QUOTE);
+ }
+
+/**
+ * Writes a starttag to the outputstream.
+ *
+ * @param tag the name of the tag
+ * @throws IOException
+ */
+
+ protected void writeStart(String tag)
+ throws IOException {
+ os.write(LT);
+ write(tag);
+ }
+
+/**
+ * Writes an endtag to the outputstream.
+ *
+ * @param tag the name of the tag
+ * @throws IOException
+ */
+
+ protected void writeEnd(String tag)
+ throws IOException {
+ os.write(LT);
+ os.write(FORWARD);
+ write(tag);
+ os.write(GT);
+ }
+
+/**
+ * Writes an endtag to the outputstream.
+ * @throws IOException
+ */
+
+ protected void writeEnd()
+ throws IOException {
+ os.write(SPACE);
+ os.write(FORWARD);
+ os.write(GT);
+ }
+
+/**
+ * Writes the markup attributes of the specified <CODE>MarkupAttributes</CODE>
+ * object to the <CODE>OutputStream</CODE>.
+ * @param mAtt the <CODE>MarkupAttributes</CODE> to write.
+ * @return true, if writing the markup attributes succeeded
+ * @throws IOException
+ */
+ protected boolean writeMarkupAttributes(MarkupAttributes mAtt)
+ throws IOException
+ {
+ Iterator attributeIterator = mAtt.getMarkupAttributeNames().iterator();
+ boolean result = attributeIterator.hasNext();
+ while (attributeIterator.hasNext()) {
+ String name = String.valueOf(attributeIterator.next());
+ write(name, mAtt.getMarkupAttribute(name));
+ }
+ return result;
+ }
+
+
+/**
+ * Returns <CODE>true</CODE> if the specified <CODE>Element</CODE> implements
+ * <CODE>MarkupAttributes</CODE> and has one or more attributes to write.
+ * @param element the <CODE>Element</CODE> to check.
+ * @return <CODE>boolean</CODE>.
+ */
+ protected static boolean hasMarkupAttributes(Element element) {
+ return (element instanceof MarkupAttributes &&
+ !(((MarkupAttributes)element).getMarkupAttributeNames().isEmpty()));
+ }
+
+ /** Checks if the stream is to be closed on document close
+ * @return true if the stream is closed on documnt close
+ *
+ */
+ public boolean isCloseStream() {
+ return closeStream;
+ }
+
+ /** Sets the close state of the stream after document close
+ * @param closeStream true if the stream is closed on document close
+ *
+ */
+ public void setCloseStream(boolean closeStream) {
+ this.closeStream = closeStream;
+ }
+
+
+ /**
+ * @see com.lowagie.text.DocListener#clearTextWrap()
+ */
+ public void clearTextWrap() throws DocumentException {
+ // do nothing
+ }
+ /**
+ * @see com.lowagie.text.DocListener#setMarginMirroring(boolean)
+ */
+ public boolean setMarginMirroring(boolean MarginMirroring) {
+ return false;
+ }
+
+}
diff --git a/src/main/java/com/lowagie/text/Document.java b/src/main/java/com/lowagie/text/Document.java
new file mode 100644
index 0000000..ebce896
--- /dev/null
+++ b/src/main/java/com/lowagie/text/Document.java
@@ -0,0 +1,916 @@
+/*
+ * $Id: Document.java,v 1.110 2006/06/23 11:56:04 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text;
+
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Iterator;
+
+import java.util.Date;
+
+/**
+ * A generic Document class.
+ * <P>
+ * All kinds of Text-elements can be added to a <CODE>HTMLDocument</CODE>.
+ * The <CODE>Document</CODE> signals all the listeners when an element has
+ * been added.
+ * <P>
+ * Remark:
+ * <OL>
+ * <LI>Once a document is created you can add some meta information.
+ * <LI>You can also set the headers/footers.
+ * <LI>You have to open the document before you can write content.
+ * <LI>You can only write content (no more meta-formation!) once a document is
+ * opened.
+ * <LI>When you change the header/footer on a certain page, this will be
+ * effective starting on the next page.
+ * <LI>Ater closing the document, every listener (as well as its <CODE>
+ * OutputStream</CODE>) is closed too.
+ * </OL>
+ * Example: <BLOCKQUOTE>
+ *
+ * <PRE>// creation of the document with a certain size and certain margins
+ * <STRONG>Document document = new Document(PageSize.A4, 50, 50, 50, 50);
+ * </STRONG> try { // creation of the different writers HtmlWriter.getInstance(
+ * <STRONG>document </STRONG>, System.out); PdfWriter.getInstance(
+ * <STRONG>document </STRONG>, new FileOutputStream("text.pdf"));
+ * // we add some meta information to the document
+ * <STRONG>document.addAuthor("Bruno Lowagie"); </STRONG>
+ * <STRONG>document.addSubject("This is the result of a Test."); </STRONG>
+ * // we define a header and a footer HeaderFooter header = new
+ * HeaderFooter(new Phrase("This is a header."), false); HeaderFooter footer =
+ * new HeaderFooter(new Phrase("This is page "), new Phrase("."));
+ * footer.setAlignment(Element.ALIGN_CENTER);
+ * <STRONG>document.setHeader(header); </STRONG>
+ * <STRONG>document.setFooter(footer); </STRONG>// we open the document for
+ * writing <STRONG>document.open(); </STRONG> <STRONG>document.add(new
+ * Paragraph("Hello world")); </STRONG>} catch(DocumentException de) {
+ * System.err.println(de.getMessage()); } <STRONG>document.close(); </STRONG>
+ * </CODE>
+ * </PRE>
+ *
+ * </BLOCKQUOTE>
+ */
+
+public class Document implements DocListener {
+
+ // membervariables
+
+ /** This constant may only be changed by Paulo Soares and/or Bruno Lowagie. */
+ private static final String ITEXT_VERSION = "iText 1.4.2 (by lowagie.com)";
+
+ /**
+ * Allows the pdf documents to be produced without compression for debugging
+ * purposes.
+ */
+ public static boolean compress = true;
+
+ /** The DocListener. */
+ private ArrayList listeners = new ArrayList();
+
+ /** Is the document open or not? */
+ protected boolean open;
+
+ /** Has the document already been closed? */
+ protected boolean close;
+
+ // membervariables concerning the layout
+
+ /** The size of the page. */
+ protected Rectangle pageSize;
+
+ /** The watermark on the pages. */
+ protected Watermark watermark = null;
+
+ /** margin in x direction starting from the left */
+ protected float marginLeft = 0;
+
+ /** margin in x direction starting from the right */
+ protected float marginRight = 0;
+
+ /** margin in y direction starting from the top */
+ protected float marginTop = 0;
+
+ /** margin in y direction starting from the bottom */
+ protected float marginBottom = 0;
+
+ protected boolean marginMirroring = false;
+
+ /** Content of JavaScript onLoad function */
+ protected String javaScript_onLoad = null;
+
+ /** Content of JavaScript onUnLoad function */
+ protected String javaScript_onUnLoad = null;
+
+ /** Style class in HTML body tag */
+ protected String htmlStyleClass = null;
+
+ // headers, footers
+
+ /** Current pagenumber */
+ protected int pageN = 0;
+
+ /** This is the textual part of a Page; it can contain a header */
+ protected HeaderFooter header = null;
+
+ /** This is the textual part of the footer */
+ protected HeaderFooter footer = null;
+
+ // constructor
+
+ /**
+ * Constructs a new <CODE>Document</CODE> -object.
+ */
+
+ public Document() {
+ this(PageSize.A4);
+ }
+
+ /**
+ * Constructs a new <CODE>Document</CODE> -object.
+ *
+ * @param pageSize
+ * the pageSize
+ */
+
+ public Document(Rectangle pageSize) {
+ this(pageSize, 36, 36, 36, 36);
+ }
+
+ /**
+ * Constructs a new <CODE>Document</CODE> -object.
+ *
+ * @param pageSize
+ * the pageSize
+ * @param marginLeft
+ * the margin on the left
+ * @param marginRight
+ * the margin on the right
+ * @param marginTop
+ * the margin on the top
+ * @param marginBottom
+ * the margin on the bottom
+ */
+
+ public Document(Rectangle pageSize, float marginLeft, float marginRight,
+ float marginTop, float marginBottom) {
+ this.pageSize = pageSize;
+ this.marginLeft = marginLeft;
+ this.marginRight = marginRight;
+ this.marginTop = marginTop;
+ this.marginBottom = marginBottom;
+ }
+
+ // listener methods
+
+ /**
+ * Adds a <CODE>DocListener</CODE> to the <CODE>Document</CODE>.
+ *
+ * @param listener
+ * the new DocListener.
+ */
+
+ public void addDocListener(DocListener listener) {
+ listeners.add(listener);
+ }
+
+ /**
+ * Removes a <CODE>DocListener</CODE> from the <CODE>Document</CODE>.
+ *
+ * @param listener
+ * the DocListener that has to be removed.
+ */
+
+ public void removeDocListener(DocListener listener) {
+ listeners.remove(listener);
+ }
+
+ // methods implementing the DocListener interface
+
+ /**
+ * Adds an <CODE>Element</CODE> to the <CODE>Document</CODE>.
+ *
+ * @param element
+ * the <CODE>Element</CODE> to add
+ * @return <CODE>true</CODE> if the element was added, <CODE>false
+ * </CODE> if not
+ * @throws DocumentException
+ * when a document isn't open yet, or has been closed
+ */
+
+ public boolean add(Element element) throws DocumentException {
+ if (close) {
+ throw new DocumentException(
+ "The document has been closed. You can't add any Elements.");
+ }
+ int type = element.type();
+ if (open) {
+ if (!(type == Element.CHUNK || type == Element.PHRASE
+ || type == Element.PARAGRAPH || type == Element.TABLE
+ || type == Element.PTABLE
+ || type == Element.MULTI_COLUMN_TEXT
+ || type == Element.ANCHOR || type == Element.ANNOTATION
+ || type == Element.CHAPTER || type == Element.SECTION
+ || type == Element.LIST || type == Element.LISTITEM
+ || type == Element.RECTANGLE || type == Element.JPEG
+ || type == Element.IMGRAW || type == Element.IMGTEMPLATE || type == Element.GRAPHIC)) {
+ throw new DocumentException(
+ "The document is open; you can only add Elements with content.");
+ }
+ } else {
+ if (!(type == Element.HEADER || type == Element.TITLE
+ || type == Element.SUBJECT || type == Element.KEYWORDS
+ || type == Element.AUTHOR || type == Element.PRODUCER
+ || type == Element.CREATOR || type == Element.CREATIONDATE)) {
+ throw new DocumentException(
+ "The document is not open yet; you can only add Meta information.");
+ }
+ }
+ boolean success = false;
+ DocListener listener;
+ for (Iterator iterator = listeners.iterator(); iterator.hasNext();) {
+ listener = (DocListener) iterator.next();
+ success |= listener.add(element);
+ }
+ return success;
+ }
+
+ /**
+ * Opens the document.
+ * <P>
+ * Once the document is opened, you can't write any Header- or
+ * Meta-information anymore. You have to open the document before you can
+ * begin to add content to the body of the document.
+ */
+
+ public void open() {
+ if (!close) {
+ open = true;
+ }
+ DocListener listener;
+ for (Iterator iterator = listeners.iterator(); iterator.hasNext();) {
+ listener = (DocListener) iterator.next();
+ listener.setPageSize(pageSize);
+ listener.setMargins(marginLeft, marginRight, marginTop,
+ marginBottom);
+ listener.open();
+ }
+ }
+
+ /**
+ * Sets the pagesize.
+ *
+ * @param pageSize
+ * the new pagesize
+ * @return a <CODE>boolean</CODE>
+ */
+
+ public boolean setPageSize(Rectangle pageSize) {
+ this.pageSize = pageSize;
+ DocListener listener;
+ for (Iterator iterator = listeners.iterator(); iterator.hasNext();) {
+ listener = (DocListener) iterator.next();
+ listener.setPageSize(pageSize);
+ }
+ return true;
+ }
+
+ /**
+ * Sets the <CODE>Watermark</CODE>.
+ *
+ * @param watermark
+ * the watermark to add
+ * @return <CODE>true</CODE> if the element was added, <CODE>false
+ * </CODE> if not.
+ */
+
+ public boolean add(Watermark watermark) {
+ this.watermark = watermark;
+ DocListener listener;
+ for (Iterator iterator = listeners.iterator(); iterator.hasNext();) {
+ listener = (DocListener) iterator.next();
+ listener.add(watermark);
+ }
+ return true;
+ }
+
+ /**
+ * Removes the <CODE>Watermark</CODE>.
+ */
+
+ public void removeWatermark() {
+ this.watermark = null;
+ DocListener listener;
+ for (Iterator iterator = listeners.iterator(); iterator.hasNext();) {
+ listener = (DocListener) iterator.next();
+ listener.removeWatermark();
+ }
+ }
+
+ /**
+ * Sets the margins.
+ *
+ * @param marginLeft
+ * the margin on the left
+ * @param marginRight
+ * the margin on the right
+ * @param marginTop
+ * the margin on the top
+ * @param marginBottom
+ * the margin on the bottom
+ * @return a <CODE>boolean</CODE>
+ */
+
+ public boolean setMargins(float marginLeft, float marginRight,
+ float marginTop, float marginBottom) {
+ this.marginLeft = marginLeft;
+ this.marginRight = marginRight;
+ this.marginTop = marginTop;
+ this.marginBottom = marginBottom;
+ DocListener listener;
+ for (Iterator iterator = listeners.iterator(); iterator.hasNext();) {
+ listener = (DocListener) iterator.next();
+ listener.setMargins(marginLeft, marginRight, marginTop,
+ marginBottom);
+ }
+ return true;
+ }
+
+ /**
+ * Signals that an new page has to be started.
+ *
+ * @return <CODE>true</CODE> if the page was added, <CODE>false</CODE>
+ * if not.
+ * @throws DocumentException
+ * when a document isn't open yet, or has been closed
+ */
+
+ public boolean newPage() throws DocumentException {
+ if (!open || close) {
+ return false;
+ }
+ DocListener listener;
+ for (Iterator iterator = listeners.iterator(); iterator.hasNext();) {
+ listener = (DocListener) iterator.next();
+ listener.newPage();
+ }
+ return true;
+ }
+
+ /**
+ * Changes the header of this document.
+ *
+ * @param header
+ * the new header
+ */
+
+ public void setHeader(HeaderFooter header) {
+ this.header = header;
+ DocListener listener;
+ for (Iterator iterator = listeners.iterator(); iterator.hasNext();) {
+ listener = (DocListener) iterator.next();
+ listener.setHeader(header);
+ }
+ }
+
+ /**
+ * Resets the header of this document.
+ */
+
+ public void resetHeader() {
+ this.header = null;
+ DocListener listener;
+ for (Iterator iterator = listeners.iterator(); iterator.hasNext();) {
+ listener = (DocListener) iterator.next();
+ listener.resetHeader();
+ }
+ }
+
+ /**
+ * Changes the footer of this document.
+ *
+ * @param footer
+ * the new footer
+ */
+
+ public void setFooter(HeaderFooter footer) {
+ this.footer = footer;
+ DocListener listener;
+ for (Iterator iterator = listeners.iterator(); iterator.hasNext();) {
+ listener = (DocListener) iterator.next();
+ listener.setFooter(footer);
+ }
+ }
+
+ /**
+ * Resets the footer of this document.
+ */
+
+ public void resetFooter() {
+ this.footer = null;
+ DocListener listener;
+ for (Iterator iterator = listeners.iterator(); iterator.hasNext();) {
+ listener = (DocListener) iterator.next();
+ listener.resetFooter();
+ }
+ }
+
+ /**
+ * Sets the page number to 0.
+ */
+
+ public void resetPageCount() {
+ pageN = 0;
+ DocListener listener;
+ for (Iterator iterator = listeners.iterator(); iterator.hasNext();) {
+ listener = (DocListener) iterator.next();
+ listener.resetPageCount();
+ }
+ }
+
+ /**
+ * Sets the page number.
+ *
+ * @param pageN
+ * the new page number
+ */
+
+ public void setPageCount(int pageN) {
+ this.pageN = pageN;
+ DocListener listener;
+ for (Iterator iterator = listeners.iterator(); iterator.hasNext();) {
+ listener = (DocListener) iterator.next();
+ listener.setPageCount(pageN);
+ }
+ }
+
+ /**
+ * Returns the current page number.
+ *
+ * @return the current page number
+ */
+
+ public int getPageNumber() {
+ return this.pageN;
+ }
+
+ /**
+ * Closes the document.
+ * <P>
+ * Once all the content has been written in the body, you have to close the
+ * body. After that nothing can be written to the body anymore.
+ */
+
+ public void close() {
+ if (!close) {
+ open = false;
+ close = true;
+ }
+ DocListener listener;
+ for (Iterator iterator = listeners.iterator(); iterator.hasNext();) {
+ listener = (DocListener) iterator.next();
+ listener.close();
+ }
+ }
+
+ // methods concerning the header or some meta information
+
+ /**
+ * Adds a user defined header to the document.
+ *
+ * @param name
+ * the name of the header
+ * @param content
+ * the content of the header
+ * @return <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise
+ */
+
+ public boolean addHeader(String name, String content) {
+ try {
+ return add(new Header(name, content));
+ } catch (DocumentException de) {
+ throw new ExceptionConverter(de);
+ }
+ }
+
+ /**
+ * Adds the title to a Document.
+ *
+ * @param title
+ * the title
+ * @return <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise
+ */
+
+ public boolean addTitle(String title) {
+ try {
+ return add(new Meta(Element.TITLE, title));
+ } catch (DocumentException de) {
+ throw new ExceptionConverter(de);
+ }
+ }
+
+ /**
+ * Adds the subject to a Document.
+ *
+ * @param subject
+ * the subject
+ * @return <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise
+ */
+
+ public boolean addSubject(String subject) {
+ try {
+ return add(new Meta(Element.SUBJECT, subject));
+ } catch (DocumentException de) {
+ throw new ExceptionConverter(de);
+ }
+ }
+
+ /**
+ * Adds the keywords to a Document.
+ *
+ * @param keywords
+ * adds the keywords to the document
+ * @return <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise
+ */
+
+ public boolean addKeywords(String keywords) {
+ try {
+ return add(new Meta(Element.KEYWORDS, keywords));
+ } catch (DocumentException de) {
+ throw new ExceptionConverter(de);
+ }
+ }
+
+ /**
+ * Adds the author to a Document.
+ *
+ * @param author
+ * the name of the author
+ * @return <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise
+ */
+
+ public boolean addAuthor(String author) {
+ try {
+ return add(new Meta(Element.AUTHOR, author));
+ } catch (DocumentException de) {
+ throw new ExceptionConverter(de);
+ }
+ }
+
+ /**
+ * Adds the creator to a Document.
+ *
+ * @param creator
+ * the name of the creator
+ * @return <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise
+ */
+
+ public boolean addCreator(String creator) {
+ try {
+ return add(new Meta(Element.CREATOR, creator));
+ } catch (DocumentException de) {
+ throw new ExceptionConverter(de);
+ }
+ }
+
+ /**
+ * Adds the producer to a Document.
+ *
+ * @return <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise
+ */
+
+ public boolean addProducer() {
+ try {
+ return add(new Meta(Element.PRODUCER, "iText by lowagie.com"));
+ } catch (DocumentException de) {
+ throw new ExceptionConverter(de);
+ }
+ }
+
+ /**
+ * Adds the current date and time to a Document.
+ *
+ * @return <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise
+ */
+
+ public boolean addCreationDate() {
+ try {
+ /* bugfix by 'taqua' (Thomas) */
+ final SimpleDateFormat sdf = new SimpleDateFormat(
+ "EEE MMM dd HH:mm:ss zzz yyyy");
+ return add(new Meta(Element.CREATIONDATE, sdf.format(new Date())));
+ } catch (DocumentException de) {
+ throw new ExceptionConverter(de);
+ }
+ }
+
+ // methods to get the layout of the document.
+
+ /**
+ * Returns the left margin.
+ *
+ * @return the left margin
+ */
+
+ public float leftMargin() {
+ return marginLeft;
+ }
+
+ /**
+ * Return the right margin.
+ *
+ * @return the right margin
+ */
+
+ public float rightMargin() {
+ return marginRight;
+ }
+
+ /**
+ * Returns the top margin.
+ *
+ * @return the top margin
+ */
+
+ public float topMargin() {
+ return marginTop;
+ }
+
+ /**
+ * Returns the bottom margin.
+ *
+ * @return the bottom margin
+ */
+
+ public float bottomMargin() {
+ return marginBottom;
+ }
+
+ /**
+ * Returns the lower left x-coordinate.
+ *
+ * @return the lower left x-coordinate
+ */
+
+ public float left() {
+ return pageSize.left(marginLeft);
+ }
+
+ /**
+ * Returns the upper right x-coordinate.
+ *
+ * @return the upper right x-coordinate
+ */
+
+ public float right() {
+ return pageSize.right(marginRight);
+ }
+
+ /**
+ * Returns the upper right y-coordinate.
+ *
+ * @return the upper right y-coordinate
+ */
+
+ public float top() {
+ return pageSize.top(marginTop);
+ }
+
+ /**
+ * Returns the lower left y-coordinate.
+ *
+ * @return the lower left y-coordinate
+ */
+
+ public float bottom() {
+ return pageSize.bottom(marginBottom);
+ }
+
+ /**
+ * Returns the lower left x-coordinate considering a given margin.
+ *
+ * @param margin
+ * a margin
+ * @return the lower left x-coordinate
+ */
+
+ public float left(float margin) {
+ return pageSize.left(marginLeft + margin);
+ }
+
+ /**
+ * Returns the upper right x-coordinate, considering a given margin.
+ *
+ * @param margin
+ * a margin
+ * @return the upper right x-coordinate
+ */
+
+ public float right(float margin) {
+ return pageSize.right(marginRight + margin);
+ }
+
+ /**
+ * Returns the upper right y-coordinate, considering a given margin.
+ *
+ * @param margin
+ * a margin
+ * @return the upper right y-coordinate
+ */
+
+ public float top(float margin) {
+ return pageSize.top(marginTop + margin);
+ }
+
+ /**
+ * Returns the lower left y-coordinate, considering a given margin.
+ *
+ * @param margin
+ * a margin
+ * @return the lower left y-coordinate
+ */
+
+ public float bottom(float margin) {
+ return pageSize.bottom(marginBottom + margin);
+ }
+
+ /**
+ * Gets the pagesize.
+ *
+ * @return the page size
+ */
+
+ public Rectangle getPageSize() {
+ return this.pageSize;
+ }
+
+ /**
+ * Checks if the document is open.
+ *
+ * @return <CODE>true</CODE> if the document is open
+ */
+ public boolean isOpen() {
+ return open;
+ }
+
+ /**
+ * Gets the iText version.
+ * This method may only be changed by Paulo Soares and/or Bruno Lowagie.
+ * @return iText version
+ */
+ public static final String getVersion() {
+ return ITEXT_VERSION;
+ }
+
+ /**
+ * Adds a JavaScript onLoad function to the HTML body tag
+ *
+ * @param code
+ * the JavaScript code to be executed on load of the HTML page
+ */
+
+ public void setJavaScript_onLoad(String code) {
+ this.javaScript_onLoad = code;
+ }
+
+ /**
+ * Gets the JavaScript onLoad command.
+ *
+ * @return the JavaScript onLoad command
+ */
+
+ public String getJavaScript_onLoad() {
+ return this.javaScript_onLoad;
+ }
+
+ /**
+ * Adds a JavaScript onUnLoad function to the HTML body tag
+ *
+ * @param code
+ * the JavaScript code to be executed on unload of the HTML page
+ */
+
+ public void setJavaScript_onUnLoad(String code) {
+ this.javaScript_onUnLoad = code;
+ }
+
+ /**
+ * Gets the JavaScript onUnLoad command.
+ *
+ * @return the JavaScript onUnLoad command
+ */
+
+ public String getJavaScript_onUnLoad() {
+ return this.javaScript_onUnLoad;
+ }
+
+ /**
+ * Adds a style class to the HTML body tag
+ *
+ * @param htmlStyleClass
+ * the style class for the HTML body tag
+ */
+
+ public void setHtmlStyleClass(String htmlStyleClass) {
+ this.htmlStyleClass = htmlStyleClass;
+ }
+
+ /**
+ * Gets the style class of the HTML body tag
+ *
+ * @return the style class of the HTML body tag
+ */
+
+ public String getHtmlStyleClass() {
+ return this.htmlStyleClass;
+ }
+
+ /**
+ * @see com.lowagie.text.DocListener#clearTextWrap()
+ */
+ public void clearTextWrap() throws DocumentException {
+ if (open && !close) {
+ DocListener listener;
+ for (Iterator iterator = listeners.iterator(); iterator.hasNext();) {
+ listener = (DocListener) iterator.next();
+ listener.clearTextWrap();
+ }
+ }
+ }
+
+ /**
+ * Set the margin mirroring. It will mirror margins for odd/even pages.
+ * <p>
+ * Note: it will not work with {@link Table}.
+ *
+ * @param marginMirroring
+ * <CODE>true</CODE> to mirror the margins
+ * @return always <CODE>true</CODE>
+ */
+ public boolean setMarginMirroring(boolean marginMirroring) {
+ this.marginMirroring = marginMirroring;
+ DocListener listener;
+ for (Iterator iterator = listeners.iterator(); iterator.hasNext();) {
+ listener = (DocListener) iterator.next();
+ listener.setMarginMirroring(marginMirroring);
+ }
+ return true;
+ }
+
+ /**
+ * Gets the margin mirroring flag.
+ *
+ * @return the margin mirroring flag
+ */
+ public boolean isMarginMirroring() {
+ return marginMirroring;
+ }
+}
diff --git a/src/main/java/com/lowagie/text/DocumentException.java b/src/main/java/com/lowagie/text/DocumentException.java
new file mode 100644
index 0000000..53d7174
--- /dev/null
+++ b/src/main/java/com/lowagie/text/DocumentException.java
@@ -0,0 +1,186 @@
+/*
+ * $Id: DocumentException.java,v 1.50 2004/12/14 11:52:46 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ *
+ */
+
+package com.lowagie.text;
+
+/**
+ * Signals that an error has occurred in a <CODE>Document</CODE>.
+ *
+ * @see BadElementException
+ * @see Document
+ * @see DocWriter
+ * @see DocListener
+ */
+
+public class DocumentException extends Exception {
+ private Exception ex;
+
+ /**
+ * Creates a Document exception.
+ * @param ex an exception that has to be turned into a DocumentException
+ */
+ public DocumentException(Exception ex) {
+ this.ex = ex;
+ }
+
+ // constructors
+
+/**
+ * Constructs a <CODE>DocumentException</CODE> whithout a message.
+ */
+
+ public DocumentException() {
+ super();
+ }
+
+/**
+ * Constructs a <code>DocumentException</code> with a message.
+ *
+ * @param message a message describing the exception
+ */
+
+ public DocumentException(String message) {
+ super(message);
+ }
+
+ /**
+ * We print the message of the checked exception
+ * @return the error message
+ */
+ public String getMessage() {
+ if (ex == null)
+ return super.getMessage();
+ else
+ return ex.getMessage();
+ }
+
+ /**
+ * and make sure we also produce a localized version
+ * @return a localized message
+ */
+ public String getLocalizedMessage() {
+ if (ex == null)
+ return super.getLocalizedMessage();
+ else
+ return ex.getLocalizedMessage();
+ }
+
+ /**
+ * The toString() is changed to be prefixed with ExceptionConverter
+ * @return the String version of the exception
+ */
+ public String toString() {
+ if (ex == null)
+ return super.toString();
+ else
+ return split(getClass().getName()) + ": " + ex;
+ }
+
+ /** we have to override this as well */
+ public void printStackTrace() {
+ printStackTrace(System.err);
+ }
+
+ /**
+ * here we prefix, with s.print(), not s.println(), the stack
+ * trace with "ExceptionConverter:"
+ * @param s a printstream object
+ */
+ public void printStackTrace(java.io.PrintStream s) {
+ if (ex == null)
+ super.printStackTrace(s);
+ else {
+ synchronized (s) {
+ s.print(split(getClass().getName()) + ": ");
+ ex.printStackTrace(s);
+ }
+ }
+ }
+
+ /**
+ * Again, we prefix the stack trace with "ExceptionConverter:"
+ * @param s A PrintWriter object
+ */
+ public void printStackTrace(java.io.PrintWriter s) {
+ if (ex == null)
+ super.printStackTrace(s);
+ else {
+ synchronized (s) {
+ s.print(split(getClass().getName()) + ": ");
+ ex.printStackTrace(s);
+ }
+ }
+ }
+
+ /**
+ * Removes everything in a String that comes before a '.'
+ * @param s the original string
+ * @return the part that comes after the dot
+ */
+ private static String split(String s) {
+ int i = s.lastIndexOf('.');
+ if (i < 0)
+ return s;
+ else
+ return s.substring(i + 1);
+ }
+
+ /** requests to fill in the stack trace we will have to ignore.
+ * We can't throw an exception here, because this method
+ * is called by the constructor of Throwable */
+// public Throwable fillInStackTrace() {
+// if (ex == null)
+// return super.fillInStackTrace();
+// else
+// return this;
+// }
+
+}
diff --git a/src/main/java/com/lowagie/text/Element.java b/src/main/java/com/lowagie/text/Element.java
new file mode 100644
index 0000000..1822a97
--- /dev/null
+++ b/src/main/java/com/lowagie/text/Element.java
@@ -0,0 +1,325 @@
+/*
+ * $Id: Element.java,v 1.66 2005/05/04 14:41:15 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text;
+
+import java.util.ArrayList;
+
+/**
+ * Interface for a text element.
+ * <P>
+ * Remark: I looked at the interface javax.swing.text.Element, but I decided to
+ * write my own text-classes for two reasons:
+ * <OL>
+ * <LI>The javax.swing.text-classes may be very generic, I think they are
+ * overkill: they are to heavy for what they have to do.
+ * <LI>A lot of people using iText (formerly known as rugPdf), still use
+ * JDK1.1.x. I try to keep the Java2 requirements limited to the Collection
+ * classes (I think they're really great). However, if I use the
+ * javax.swing.text classes, it will become very difficult to downgrade rugPdf.
+ * </OL>
+ *
+ * @see Anchor
+ * @see Cell
+ * @see Chapter
+ * @see Chunk
+ * @see Graphic
+ * @see Header
+ * @see Image
+ * @see Jpeg
+ * @see List
+ * @see ListItem
+ * @see Meta
+ * @see Paragraph
+ * @see Phrase
+ * @see Rectangle
+ * @see Row
+ * @see Section
+ * @see Table
+ */
+
+public interface Element {
+
+ // static membervariables (meta information)
+
+ /** This is a possible type of <CODE>Element</CODE>. */
+ public static final int HEADER = 0;
+
+ /** This is a possible type of <CODE>Element</CODE>. */
+ public static final int TITLE = 1;
+
+ /** This is a possible type of <CODE>Element</CODE>. */
+ public static final int SUBJECT = 2;
+
+ /** This is a possible type of <CODE>Element</CODE>. */
+ public static final int KEYWORDS = 3;
+
+ /** This is a possible type of <CODE>Element </CIDE>. */
+ public static final int AUTHOR = 4;
+
+ /** This is a possible type of <CODE>Element </CIDE>. */
+ public static final int PRODUCER = 5;
+
+ /** This is a possible type of <CODE>Element </CIDE>. */
+ public static final int CREATIONDATE = 6;
+
+ /** This is a possible type of <CODE>Element </CIDE>. */
+ public static final int CREATOR = 7;
+
+ // static membervariables (content)
+
+ /** This is a possible type of <CODE>Element</CODE>. */
+ public static final int CHUNK = 10;
+
+ /** This is a possible type of <CODE>Element</CODE>. */
+ public static final int PHRASE = 11;
+
+ /** This is a possible type of <CODE>Element</CODE>. */
+ public static final int PARAGRAPH = 12;
+
+ /** This is a possible type of <CODE>Element</CODE> */
+ public static final int SECTION = 13;
+
+ /** This is a possible type of <CODE>Element</CODE> */
+ public static final int LIST = 14;
+
+ /** This is a possible type of <CODE>Element</CODE> */
+ public static final int LISTITEM = 15;
+
+ /** This is a possible type of <CODE>Element</CODE> */
+ public static final int CHAPTER = 16;
+
+ /** This is a possible type of <CODE>Element</CODE> */
+ public static final int ANCHOR = 17;
+
+ // static membervariables (tables)
+
+ /** This is a possible type of <CODE>Element</CODE>. */
+ public static final int CELL = 20;
+
+ /** This is a possible type of <CODE>Element</CODE>. */
+ public static final int ROW = 21;
+
+ /** This is a possible type of <CODE>Element</CODE>. */
+ public static final int TABLE = 22;
+
+ /** This is a possible type of <CODE>Element</CODE>. */
+ public static final int PTABLE = 23;
+
+ // static membervariables (annotations)
+
+ /** This is a possible type of <CODE>Element</CODE>. */
+ public static final int ANNOTATION = 29;
+
+ // static membervariables (geometric figures)
+
+ /** This is a possible type of <CODE>Element</CODE>. */
+ public static final int RECTANGLE = 30;
+
+ /** This is a possible type of <CODE>Element</CODE>. */
+ public static final int JPEG = 32;
+
+ /** This is a possible type of <CODE>Element</CODE>. */
+ public static final int IMGRAW = 34;
+
+ /** This is a possible type of <CODE>Element</CODE>. */
+ public static final int IMGTEMPLATE = 35;
+
+ /** This is a possible type of <CODE>Element</CODE>. */
+ public static final int GRAPHIC = 39;
+
+ /** This is a possible type of <CODE>Element</CODE>. */
+ public static final int MULTI_COLUMN_TEXT = 40;
+
+ // static membervariables (alignment)
+
+ /**
+ * A possible value for paragraph alignment. This specifies that the text is
+ * aligned to the left indent and extra whitespace should be placed on the
+ * right.
+ */
+ public static final int ALIGN_UNDEFINED = -1;
+
+ /**
+ * A possible value for paragraph alignment. This specifies that the text is
+ * aligned to the left indent and extra whitespace should be placed on the
+ * right.
+ */
+ public static final int ALIGN_LEFT = 0;
+
+ /**
+ * A possible value for paragraph alignment. This specifies that the text is
+ * aligned to the center and extra whitespace should be placed equally on
+ * the left and right.
+ */
+ public static final int ALIGN_CENTER = 1;
+
+ /**
+ * A possible value for paragraph alignment. This specifies that the text is
+ * aligned to the right indent and extra whitespace should be placed on the
+ * left.
+ */
+ public static final int ALIGN_RIGHT = 2;
+
+ /**
+ * A possible value for paragraph alignment. This specifies that extra
+ * whitespace should be spread out through the rows of the paragraph with
+ * the text lined up with the left and right indent except on the last line
+ * which should be aligned to the left.
+ */
+ public static final int ALIGN_JUSTIFIED = 3;
+
+ /**
+ * A possible value for vertical alignment.
+ */
+
+ public static final int ALIGN_TOP = 4;
+
+ /**
+ * A possible value for vertical alignment.
+ */
+
+ public static final int ALIGN_MIDDLE = 5;
+
+ /**
+ * A possible value for vertical alignment.
+ */
+
+ public static final int ALIGN_BOTTOM = 6;
+
+ /**
+ * A possible value for vertical alignment.
+ */
+ public static final int ALIGN_BASELINE = 7;
+
+ /**
+ * Does the same as ALIGN_JUSTIFIED but the last line is also spread out.
+ */
+ public static final int ALIGN_JUSTIFIED_ALL = 8;
+
+ // static member variables for CCITT compression
+
+ /**
+ * Pure two-dimensional encoding (Group 4)
+ */
+ public static final int CCITTG4 = 0x100;
+
+ /**
+ * Pure one-dimensional encoding (Group 3, 1-D)
+ */
+ public static final int CCITTG3_1D = 0x101;
+
+ /**
+ * Mixed one- and two-dimensional encoding (Group 3, 2-D)
+ */
+ public static final int CCITTG3_2D = 0x102;
+
+ /**
+ * A flag indicating whether 1-bits are to be interpreted as black pixels
+ * and 0-bits as white pixels,
+ */
+ public static final int CCITT_BLACKIS1 = 1;
+
+ /**
+ * A flag indicating whether the filter expects extra 0-bits before each
+ * encoded line so that the line begins on a byte boundary.
+ */
+ public static final int CCITT_ENCODEDBYTEALIGN = 2;
+
+ /**
+ * A flag indicating whether end-of-line bit patterns are required to be
+ * present in the encoding.
+ */
+ public static final int CCITT_ENDOFLINE = 4;
+
+ /**
+ * A flag indicating whether the filter expects the encoded data to be
+ * terminated by an end-of-block pattern, overriding the Rows parameter. The
+ * use of this flag will set the key /EndOfBlock to false.
+ */
+ public static final int CCITT_ENDOFBLOCK = 8;
+
+ // methods
+
+ /**
+ * Processes the element by adding it (or the different parts) to an <CODE>
+ * ElementListener</CODE>.
+ *
+ * @param listener
+ * an <CODE>ElementListener</CODE>
+ * @return <CODE>true</CODE> if the element was processed successfully
+ */
+
+ public boolean process(ElementListener listener);
+
+ /**
+ * Gets the type of the text element.
+ *
+ * @return a type
+ */
+
+ public int type();
+
+ /**
+ * Gets all the chunks in this element.
+ *
+ * @return an <CODE>ArrayList</CODE>
+ */
+
+ public ArrayList getChunks();
+
+ /**
+ * Gets the content of the text element.
+ *
+ * @return a type
+ */
+
+ public String toString();
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/ElementListener.java b/src/main/java/com/lowagie/text/ElementListener.java
new file mode 100644
index 0000000..cfde339
--- /dev/null
+++ b/src/main/java/com/lowagie/text/ElementListener.java
@@ -0,0 +1,75 @@
+/*
+ * $Id: ElementListener.java,v 1.48 2004/12/14 11:52:46 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2001, 2002 by Bruno Lowagie.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text;
+
+import java.util.EventListener;
+
+/**
+ * A class that implements <CODE>ElementListener</CODE> will perform some
+ * actions when an <CODE>Element</CODE> is added.
+ *
+ * @see DocListener
+ */
+
+public interface ElementListener extends EventListener {
+
+ // methods
+
+/**
+ * Signals that an <CODE>Element</CODE> was added to the <CODE>Document</CODE>.
+ *
+ * @param element a high level object
+ * @return <CODE>true</CODE> if the element was added, <CODE>false</CODE> if not.
+ * @throws DocumentException when a document isn't open yet, or has been closed
+ */
+
+ public boolean add(Element element) throws DocumentException;
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/ElementTags.java b/src/main/java/com/lowagie/text/ElementTags.java
new file mode 100644
index 0000000..bb06d7e
--- /dev/null
+++ b/src/main/java/com/lowagie/text/ElementTags.java
@@ -0,0 +1,461 @@
+/*
+ * $Id: ElementTags.java,v 1.84 2005/04/06 07:01:18 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright (c) 2001, 2002 Bruno Lowagie.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text;
+
+/**
+ * A class that contains all the possible tagnames and their attributes.
+ */
+
+public class ElementTags {
+
+/** the root tag. */
+ public static final String ITEXT = "itext";
+
+/** attribute of the root and annotation tag (also a special tag within a chapter or section) */
+ public static final String TITLE = "title";
+
+/** attribute of the root tag */
+ public static final String SUBJECT = "subject";
+
+/** attribute of the root tag */
+ public static final String KEYWORDS = "keywords";
+
+/** attribute of the root tag */
+ public static final String AUTHOR = "author";
+
+/** attribute of the root tag */
+ public static final String CREATIONDATE = "creationdate";
+
+/** attribute of the root tag */
+ public static final String PRODUCER = "producer";
+
+ // Chapters and Sections
+
+/** the chapter tag */
+ public static final String CHAPTER = "chapter";
+
+/** the section tag */
+ public static final String SECTION = "section";
+
+/** attribute of section/chapter tag */
+ public static final String NUMBERDEPTH = "numberdepth";
+
+/** attribute of section/chapter tag */
+ public static final String DEPTH = "depth";
+
+/** attribute of section/chapter tag */
+ public static final String NUMBER = "number";
+
+/** attribute of section/chapter tag */
+ public static final String INDENT = "indent";
+
+/** attribute of chapter/section/paragraph/table/cell tag */
+ public static final String LEFT = "left";
+
+/** attribute of chapter/section/paragraph/table/cell tag */
+ public static final String RIGHT = "right";
+
+ // Phrases, Anchors, Lists and Paragraphs
+
+/** the phrase tag */
+ public static final String PHRASE = "phrase";
+
+/** the anchor tag */
+ public static final String ANCHOR = "anchor";
+
+/** the list tag */
+ public static final String LIST = "list";
+
+/** the listitem tag */
+ public static final String LISTITEM = "listitem";
+
+/** the paragraph tag */
+ public static final String PARAGRAPH = "paragraph";
+
+/** attribute of phrase/paragraph/cell tag */
+ public static final String LEADING = "leading";
+
+/** attribute of paragraph/image/table tag */
+ public static final String ALIGN = "align";
+
+/** attribute of paragraph */
+ public static final String KEEPTOGETHER = "keeptogether";
+
+/** attribute of anchor tag */
+ public static final String NAME = "name";
+
+/** attribute of anchor tag */
+ public static final String REFERENCE = "reference";
+
+/** attribute of list tag */
+ public static final String LISTSYMBOL = "listsymbol";
+
+/** attribute of list tag */
+ public static final String NUMBERED = "numbered";
+
+/** attribute of the list tag */
+ public static final String LETTERED = "lettered";
+
+/** attribute of list tag */
+ public static final String FIRST = "first";
+
+/** attribute of list tag */
+ public static final String SYMBOLINDENT = "symbolindent";
+
+/** attribute of list tag */
+ public static final String INDENTATIONLEFT = "indentationleft";
+
+/** attribute of list tag */
+ public static final String INDENTATIONRIGHT = "indentationright";
+
+ // Chunks
+
+/** the chunk tag */
+ public static final String IGNORE = "ignore";
+
+/** the chunk tag */
+ public static final String ENTITY = "entity";
+
+/** the chunk tag */
+ public static final String ID = "id";
+
+/** the chunk tag */
+ public static final String CHUNK = "chunk";
+
+/** attribute of the chunk tag */
+ public static final String ENCODING = "encoding";
+
+/** attribute of the chunk tag */
+ public static final String EMBEDDED = "embedded";
+
+/** attribute of the chunk/table/cell tag */
+ public static final String COLOR = "color";
+
+/** attribute of the chunk/table/cell tag */
+ public static final String RED = "red";
+
+/** attribute of the chunk/table/cell tag */
+ public static final String GREEN = "green";
+
+/** attribute of the chunk/table/cell tag */
+ public static final String BLUE = "blue";
+
+/** attribute of the chunk tag */
+ public static final String SUBSUPSCRIPT = Chunk.SUBSUPSCRIPT.toLowerCase();
+
+/** attribute of the chunk tag */
+ public static final String LOCALGOTO = Chunk.LOCALGOTO.toLowerCase();
+
+/** attribute of the chunk tag */
+ public static final String REMOTEGOTO = Chunk.REMOTEGOTO.toLowerCase();
+
+/** attribute of the chunk tag */
+ public static final String LOCALDESTINATION = Chunk.LOCALDESTINATION.toLowerCase();
+
+/** attribute of the chunk tag */
+ public static final String GENERICTAG = Chunk.GENERICTAG.toLowerCase();
+
+ // tables/cells
+
+/** the table tag */
+ public static final String TABLE = "table";
+
+/** the cell tag */
+ public static final String ROW = "row";
+
+/** the cell tag */
+ public static final String CELL = "cell";
+
+/** attribute of the table tag */
+ public static final String COLUMNS = "columns";
+
+/** attribute of the table tag */
+ public static final String LASTHEADERROW = "lastHeaderRow";
+
+/** attribute of the table tag */
+ public static final String CELLPADDING = "cellpadding";
+
+/** attribute of the table tag */
+ public static final String CELLSPACING = "cellspacing";
+
+/** attribute of the table tag */
+ public static final String OFFSET = "offset";
+
+/** attribute of the table tag */
+ public static final String WIDTHS = "widths";
+
+/** attribute of the table tag */
+ public static final String TABLEFITSPAGE = "tablefitspage";
+
+/** attribute of the table tag */
+ public static final String CELLSFITPAGE = "cellsfitpage";
+
+/** attribute of the cell tag */
+ public static final String HORIZONTALALIGN = "horizontalalign";
+
+/** attribute of the cell tag */
+ public static final String VERTICALALIGN = "verticalalign";
+
+/** attribute of the cell tag */
+ public static final String COLSPAN = "colspan";
+
+/** attribute of the cell tag */
+ public static final String ROWSPAN = "rowspan";
+
+/** attribute of the cell tag */
+ public static final String HEADER = "header";
+
+/** attribute of the cell tag */
+ public static final String NOWRAP = "nowrap";
+
+/** attribute of the table/cell tag */
+ public static final String BORDERWIDTH = "borderwidth";
+
+/** attribute of the table/cell tag */
+ public static final String TOP = "top";
+
+/** attribute of the table/cell tag */
+ public static final String BOTTOM = "bottom";
+
+/** attribute of the table/cell tag */
+ public static final String WIDTH = "width";
+
+/** attribute of the table/cell tag */
+ public static final String BORDERCOLOR = "bordercolor";
+
+/** attribute of the table/cell tag */
+ public static final String BACKGROUNDCOLOR = "backgroundcolor";
+
+/** attribute of the table/cell tag */
+ public static final String BGRED = "bgred";
+
+/** attribute of the table/cell tag */
+ public static final String BGGREEN = "bggreen";
+
+/** attribute of the table/cell tag */
+ public static final String BGBLUE = "bgblue";
+
+/** attribute of the table/cell tag */
+ public static final String GRAYFILL = "grayfill";
+
+ // Misc
+
+/** the image tag */
+ public static final String IMAGE = "image";
+
+/** attribute of the image and annotation tag */
+ public static final String URL = "url";
+
+/** attribute of the image tag */
+ public static final String UNDERLYING = "underlying";
+
+/** attribute of the image tag */
+ public static final String TEXTWRAP = "textwrap";
+
+/** attribute of the image tag */
+ public static final String ALT = "alt";
+
+/** attribute of the image tag */
+ public static final String ABSOLUTEX = "absolutex";
+
+/** attribute of the image tag */
+ public static final String ABSOLUTEY = "absolutey";
+
+/** attribute of the image tag */
+ public static final String PLAINWIDTH = "plainwidth";
+
+/** attribute of the image tag */
+ public static final String PLAINHEIGHT = "plainheight";
+
+/** attribute of the image tag */
+ public static final String SCALEDWIDTH = "scaledwidth";
+
+/** attribute of the image tag */
+ public static final String SCALEDHEIGHT = "scaledheight";
+
+/** attribute of the image tag */
+ public static final String ROTATION = "rotation";
+
+/** the newpage tag */
+ public static final String NEWPAGE = "newpage";
+
+/** the newpage tag */
+ public static final String NEWLINE = "newline";
+
+/** the annotation tag */
+ public static final String ANNOTATION = "annotation";
+
+/** attribute of the annotation tag */
+ public static String FILE = "file";
+
+/** attribute of the annotation tag */
+ public static String DESTINATION = "destination";
+
+/** attribute of the annotation tag */
+ public static String PAGE = "page";
+
+/** attribute of the annotation tag */
+ public static String NAMED = "named";
+
+/** attribute of the annotation tag */
+ public static String APPLICATION = "application";
+
+/** attribute of the annotation tag */
+ public static String PARAMETERS = "parameters";
+
+/** attribute of the annotation tag */
+ public static String OPERATION = "operation";
+
+/** attribute of the annotation tag */
+ public static String DEFAULTDIR = "defaultdir";
+
+/** attribute of the annotation tag */
+ public static String LLX = "llx";
+
+/** attribute of the annotation tag */
+ public static String LLY = "lly";
+
+/** attribute of the annotation tag */
+ public static String URX = "urx";
+
+/** attribute of the annotation tag */
+ public static String URY = "ury";
+
+/** attribute of the annotation tag */
+ public static final String CONTENT = "content";
+
+ // alignment attribute values
+
+/** the possible value of an alignment attribute */
+ public static final String ALIGN_LEFT = "Left";
+
+/** the possible value of an alignment attribute */
+ public static final String ALIGN_CENTER = "Center";
+
+/** the possible value of an alignment attribute */
+ public static final String ALIGN_RIGHT = "Right";
+
+/** the possible value of an alignment attribute */
+ public static final String ALIGN_JUSTIFIED = "Justify";
+
+/** the possible value of an alignment attribute */
+ public static final String ALIGN_JUSTIFIED_ALL = "JustifyAll";
+
+/** the possible value of an alignment attribute */
+ public static final String ALIGN_TOP = "Top";
+
+/** the possible value of an alignment attribute */
+ public static final String ALIGN_MIDDLE = "Middle";
+
+/** the possible value of an alignment attribute */
+ public static final String ALIGN_BOTTOM = "Bottom";
+
+/** the possible value of an alignment attribute */
+ public static final String ALIGN_BASELINE = "Baseline";
+
+/** the possible value of an alignment attribute */
+ public static final String DEFAULT = "Default";
+
+/** the possible value of an alignment attribute */
+ public static final String UNKNOWN = "unknown";
+
+/** the possible value of an alignment attribute */
+ public static final String FONT = "font";
+
+/** the possible value of an alignment attribute */
+ public static final String SIZE = "size";
+
+/** the possible value of an alignment attribute */
+ public static final String STYLE = "fontstyle";
+
+/** the possible value of a tag */
+ public static final String HORIZONTALRULE = "horizontalrule";
+
+ /** the possible value of a tag */
+ public static final String PAGE_SIZE = "pagesize";
+
+ /** the possible value of a tag */
+ public static final String ORIENTATION = "orientation";
+
+ // methods
+
+/**
+ * Translates the alignment value.
+ *
+ * @param alignment the alignment value
+ * @return the translated value
+ */
+
+ public static String getAlignment(int alignment) {
+ switch(alignment) {
+ case Element.ALIGN_LEFT:
+ return ALIGN_LEFT;
+ case Element.ALIGN_CENTER:
+ return ALIGN_CENTER;
+ case Element.ALIGN_RIGHT:
+ return ALIGN_RIGHT;
+ case Element.ALIGN_JUSTIFIED:
+ case Element.ALIGN_JUSTIFIED_ALL:
+ return ALIGN_JUSTIFIED;
+ case Element.ALIGN_TOP:
+ return ALIGN_TOP;
+ case Element.ALIGN_MIDDLE:
+ return ALIGN_MIDDLE;
+ case Element.ALIGN_BOTTOM:
+ return ALIGN_BOTTOM;
+ case Element.ALIGN_BASELINE:
+ return ALIGN_BASELINE;
+ default:
+ return DEFAULT;
+ }
+ }
+
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/Entities.java b/src/main/java/com/lowagie/text/Entities.java
new file mode 100644
index 0000000..ad14e62
--- /dev/null
+++ b/src/main/java/com/lowagie/text/Entities.java
@@ -0,0 +1,388 @@
+/*
+ * $Id: Entities.java,v 1.43 2004/12/14 11:52:46 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 1999, 2000, 2001, 2002 Bruno Lowagie.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text;
+
+import java.util.HashMap;
+
+/**
+ * This class contains entities that can be used in an entity tag.
+ */
+
+public class Entities {
+
+ /** This is a map that contains all possible id values of the entity tag. */
+ public static final HashMap map;
+
+ static {
+ map = new HashMap();
+ map.put("169", new Integer(227));
+ map.put("172", new Integer(216));
+ map.put("174", new Integer(210));
+ map.put("177", new Integer(177));
+ map.put("215", new Integer(180));
+ map.put("247", new Integer(184));
+ map.put("8230", new Integer(188));
+ map.put("8242", new Integer(162));
+ map.put("8243", new Integer(178));
+ map.put("8260", new Integer(164));
+ map.put("8364", new Integer(240));
+ map.put("8465", new Integer(193));
+ map.put("8472", new Integer(195));
+ map.put("8476", new Integer(194));
+ map.put("8482", new Integer(212));
+ map.put("8501", new Integer(192));
+ map.put("8592", new Integer(172));
+ map.put("8593", new Integer(173));
+ map.put("8594", new Integer(174));
+ map.put("8595", new Integer(175));
+ map.put("8596", new Integer(171));
+ map.put("8629", new Integer(191));
+ map.put("8656", new Integer(220));
+ map.put("8657", new Integer(221));
+ map.put("8658", new Integer(222));
+ map.put("8659", new Integer(223));
+ map.put("8660", new Integer(219));
+ map.put("8704", new Integer(34));
+ map.put("8706", new Integer(182));
+ map.put("8707", new Integer(36));
+ map.put("8709", new Integer(198));
+ map.put("8711", new Integer(209));
+ map.put("8712", new Integer(206));
+ map.put("8713", new Integer(207));
+ map.put("8717", new Integer(39));
+ map.put("8719", new Integer(213));
+ map.put("8721", new Integer(229));
+ map.put("8722", new Integer(45));
+ map.put("8727", new Integer(42));
+ map.put("8729", new Integer(183));
+ map.put("8730", new Integer(214));
+ map.put("8733", new Integer(181));
+ map.put("8734", new Integer(165));
+ map.put("8736", new Integer(208));
+ map.put("8743", new Integer(217));
+ map.put("8744", new Integer(218));
+ map.put("8745", new Integer(199));
+ map.put("8746", new Integer(200));
+ map.put("8747", new Integer(242));
+ map.put("8756", new Integer(92));
+ map.put("8764", new Integer(126));
+ map.put("8773", new Integer(64));
+ map.put("8776", new Integer(187));
+ map.put("8800", new Integer(185));
+ map.put("8801", new Integer(186));
+ map.put("8804", new Integer(163));
+ map.put("8805", new Integer(179));
+ map.put("8834", new Integer(204));
+ map.put("8835", new Integer(201));
+ map.put("8836", new Integer(203));
+ map.put("8838", new Integer(205));
+ map.put("8839", new Integer(202));
+ map.put("8853", new Integer(197));
+ map.put("8855", new Integer(196));
+ map.put("8869", new Integer(94));
+ map.put("8901", new Integer(215));
+ map.put("8992", new Integer(243));
+ map.put("8993", new Integer(245));
+ map.put("9001", new Integer(225));
+ map.put("9002", new Integer(241));
+ map.put("913", new Integer(65));
+ map.put("914", new Integer(66));
+ map.put("915", new Integer(71));
+ map.put("916", new Integer(68));
+ map.put("917", new Integer(69));
+ map.put("918", new Integer(90));
+ map.put("919", new Integer(72));
+ map.put("920", new Integer(81));
+ map.put("921", new Integer(73));
+ map.put("922", new Integer(75));
+ map.put("923", new Integer(76));
+ map.put("924", new Integer(77));
+ map.put("925", new Integer(78));
+ map.put("926", new Integer(88));
+ map.put("927", new Integer(79));
+ map.put("928", new Integer(80));
+ map.put("929", new Integer(82));
+ map.put("931", new Integer(83));
+ map.put("932", new Integer(84));
+ map.put("933", new Integer(85));
+ map.put("934", new Integer(70));
+ map.put("935", new Integer(67));
+ map.put("936", new Integer(89));
+ map.put("937", new Integer(87));
+ map.put("945", new Integer(97));
+ map.put("946", new Integer(98));
+ map.put("947", new Integer(103));
+ map.put("948", new Integer(100));
+ map.put("949", new Integer(101));
+ map.put("950", new Integer(122));
+ map.put("951", new Integer(104));
+ map.put("952", new Integer(113));
+ map.put("953", new Integer(105));
+ map.put("954", new Integer(107));
+ map.put("955", new Integer(108));
+ map.put("956", new Integer(109));
+ map.put("957", new Integer(110));
+ map.put("958", new Integer(120));
+ map.put("959", new Integer(111));
+ map.put("960", new Integer(112));
+ map.put("961", new Integer(114));
+ map.put("962", new Integer(86));
+ map.put("963", new Integer(115));
+ map.put("964", new Integer(116));
+ map.put("965", new Integer(117));
+ map.put("966", new Integer(102));
+ map.put("967", new Integer(99));
+ map.put("9674", new Integer(224));
+ map.put("968", new Integer(121));
+ map.put("969", new Integer(119));
+ map.put("977", new Integer(74));
+ map.put("978", new Integer(161));
+ map.put("981", new Integer(106));
+ map.put("982", new Integer(118));
+ map.put("9824", new Integer(170));
+ map.put("9827", new Integer(167));
+ map.put("9829", new Integer(169));
+ map.put("9830", new Integer(168));
+ map.put("Alpha", new Integer(65));
+ map.put("Beta", new Integer(66));
+ map.put("Chi", new Integer(67));
+ map.put("Delta", new Integer(68));
+ map.put("Epsilon", new Integer(69));
+ map.put("Eta", new Integer(72));
+ map.put("Gamma", new Integer(71));
+ map.put("Iota", new Integer(73));
+ map.put("Kappa", new Integer(75));
+ map.put("Lambda", new Integer(76));
+ map.put("Mu", new Integer(77));
+ map.put("Nu", new Integer(78));
+ map.put("Omega", new Integer(87));
+ map.put("Omicron", new Integer(79));
+ map.put("Phi", new Integer(70));
+ map.put("Pi", new Integer(80));
+ map.put("Prime", new Integer(178));
+ map.put("Psi", new Integer(89));
+ map.put("Rho", new Integer(82));
+ map.put("Sigma", new Integer(83));
+ map.put("Tau", new Integer(84));
+ map.put("Theta", new Integer(81));
+ map.put("Upsilon", new Integer(85));
+ map.put("Xi", new Integer(88));
+ map.put("Zeta", new Integer(90));
+ map.put("alefsym", new Integer(192));
+ map.put("alpha", new Integer(97));
+ map.put("and", new Integer(217));
+ map.put("ang", new Integer(208));
+ map.put("asymp", new Integer(187));
+ map.put("beta", new Integer(98));
+ map.put("cap", new Integer(199));
+ map.put("chi", new Integer(99));
+ map.put("clubs", new Integer(167));
+ map.put("cong", new Integer(64));
+ map.put("copy", new Integer(211));
+ map.put("crarr", new Integer(191));
+ map.put("cup", new Integer(200));
+ map.put("dArr", new Integer(223));
+ map.put("darr", new Integer(175));
+ map.put("delta", new Integer(100));
+ map.put("diams", new Integer(168));
+ map.put("divide", new Integer(184));
+ map.put("empty", new Integer(198));
+ map.put("epsilon", new Integer(101));
+ map.put("equiv", new Integer(186));
+ map.put("eta", new Integer(104));
+ map.put("euro", new Integer(240));
+ map.put("exist", new Integer(36));
+ map.put("forall", new Integer(34));
+ map.put("frasl", new Integer(164));
+ map.put("gamma", new Integer(103));
+ map.put("ge", new Integer(179));
+ map.put("hArr", new Integer(219));
+ map.put("harr", new Integer(171));
+ map.put("hearts", new Integer(169));
+ map.put("hellip", new Integer(188));
+ map.put("horizontal arrow extender", new Integer(190));
+ map.put("image", new Integer(193));
+ map.put("infin", new Integer(165));
+ map.put("int", new Integer(242));
+ map.put("iota", new Integer(105));
+ map.put("isin", new Integer(206));
+ map.put("kappa", new Integer(107));
+ map.put("lArr", new Integer(220));
+ map.put("lambda", new Integer(108));
+ map.put("lang", new Integer(225));
+ map.put("large brace extender", new Integer(239));
+ map.put("large integral extender", new Integer(244));
+ map.put("large left brace (bottom)", new Integer(238));
+ map.put("large left brace (middle)", new Integer(237));
+ map.put("large left brace (top)", new Integer(236));
+ map.put("large left bracket (bottom)", new Integer(235));
+ map.put("large left bracket (extender)", new Integer(234));
+ map.put("large left bracket (top)", new Integer(233));
+ map.put("large left parenthesis (bottom)", new Integer(232));
+ map.put("large left parenthesis (extender)", new Integer(231));
+ map.put("large left parenthesis (top)", new Integer(230));
+ map.put("large right brace (bottom)", new Integer(254));
+ map.put("large right brace (middle)", new Integer(253));
+ map.put("large right brace (top)", new Integer(252));
+ map.put("large right bracket (bottom)", new Integer(251));
+ map.put("large right bracket (extender)", new Integer(250));
+ map.put("large right bracket (top)", new Integer(249));
+ map.put("large right parenthesis (bottom)", new Integer(248));
+ map.put("large right parenthesis (extender)", new Integer(247));
+ map.put("large right parenthesis (top)", new Integer(246));
+ map.put("larr", new Integer(172));
+ map.put("le", new Integer(163));
+ map.put("lowast", new Integer(42));
+ map.put("loz", new Integer(224));
+ map.put("minus", new Integer(45));
+ map.put("mu", new Integer(109));
+ map.put("nabla", new Integer(209));
+ map.put("ne", new Integer(185));
+ map.put("not", new Integer(216));
+ map.put("notin", new Integer(207));
+ map.put("nsub", new Integer(203));
+ map.put("nu", new Integer(110));
+ map.put("omega", new Integer(119));
+ map.put("omicron", new Integer(111));
+ map.put("oplus", new Integer(197));
+ map.put("or", new Integer(218));
+ map.put("otimes", new Integer(196));
+ map.put("part", new Integer(182));
+ map.put("perp", new Integer(94));
+ map.put("phi", new Integer(102));
+ map.put("pi", new Integer(112));
+ map.put("piv", new Integer(118));
+ map.put("plusmn", new Integer(177));
+ map.put("prime", new Integer(162));
+ map.put("prod", new Integer(213));
+ map.put("prop", new Integer(181));
+ map.put("psi", new Integer(121));
+ map.put("rArr", new Integer(222));
+ map.put("radic", new Integer(214));
+ map.put("radical extender", new Integer(96));
+ map.put("rang", new Integer(241));
+ map.put("rarr", new Integer(174));
+ map.put("real", new Integer(194));
+ map.put("reg", new Integer(210));
+ map.put("rho", new Integer(114));
+ map.put("sdot", new Integer(215));
+ map.put("sigma", new Integer(115));
+ map.put("sigmaf", new Integer(86));
+ map.put("sim", new Integer(126));
+ map.put("spades", new Integer(170));
+ map.put("sub", new Integer(204));
+ map.put("sube", new Integer(205));
+ map.put("sum", new Integer(229));
+ map.put("sup", new Integer(201));
+ map.put("supe", new Integer(202));
+ map.put("tau", new Integer(116));
+ map.put("there4", new Integer(92));
+ map.put("theta", new Integer(113));
+ map.put("thetasym", new Integer(74));
+ map.put("times", new Integer(180));
+ map.put("trade", new Integer(212));
+ map.put("uArr", new Integer(221));
+ map.put("uarr", new Integer(173));
+ map.put("upsih", new Integer(161));
+ map.put("upsilon", new Integer(117));
+ map.put("vertical arrow extender", new Integer(189));
+ map.put("weierp", new Integer(195));
+ map.put("xi", new Integer(120));
+ map.put("zeta", new Integer(122));
+ }
+
+ /**
+ * Gets a chunk with a symbol character.
+ * @param e a symbol value (see Entities class: alfa is greek alfa,...)
+ * @param font the font if the symbol isn't found (otherwise Font.SYMBIL)
+ * @return a Chunk
+ */
+
+ public static Chunk get(String e, Font font) {
+ int s = getCorrespondingSymbol(e);
+ if (s == -1) {
+ try {
+ return new Chunk(String.valueOf((char)Integer.parseInt(e)), font);
+ }
+ catch(Exception exception) {
+ return new Chunk(e, font);
+ }
+ }
+ Font symbol = new Font(Font.SYMBOL, font.size(), font.style(), font.color());
+ return new Chunk(String.valueOf((char)s), symbol);
+ }
+
+/**
+ * Looks for the corresponding symbol in the font Symbol.
+ *
+ * @param c the original ASCII-char
+ * @return the corresponding symbol in font Symbol
+ */
+
+ public static int getCorrespondingSymbol(String c) {
+ Integer integer = (Integer) map.get(c);
+ if (integer == null) {
+ return -1;
+ }
+ return integer.intValue();
+ }
+
+/**
+ * Checks if a given tag corresponds with this object.
+ *
+ * @param tag the given tag
+ * @return true if the tag corresponds
+ */
+
+ public static boolean isTag(String tag) {
+ return ElementTags.ENTITY.equals(tag);
+ }
+}
diff --git a/src/main/java/com/lowagie/text/ExceptionConverter.java b/src/main/java/com/lowagie/text/ExceptionConverter.java
new file mode 100644
index 0000000..8d25395
--- /dev/null
+++ b/src/main/java/com/lowagie/text/ExceptionConverter.java
@@ -0,0 +1,135 @@
+/*
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+package com.lowagie.text;
+
+/**
+ * The ExceptionConverter changes a checked exception into an
+ * unchecked exception.
+ */
+public class ExceptionConverter extends RuntimeException {
+ /** we keep a handle to the wrapped exception */
+ private Exception ex;
+ /** prefix for the exception */
+ private String prefix;
+
+ /**
+ * Construct a RuntimeException based on another Exception
+ * @param ex the exception that has to be turned into a RuntimeException
+ */
+ public ExceptionConverter(Exception ex) {
+ this.ex = ex;
+ prefix = (ex instanceof RuntimeException) ? "" : "ExceptionConverter: ";
+ }
+
+ /**
+ * and allow the user of ExceptionConverter to get a handle to it.
+ * @return the original exception
+ */
+ public Exception getException() {
+ return ex;
+ }
+
+ /**
+ * We print the message of the checked exception
+ * @return message of the original exception
+ */
+ public String getMessage() {
+ return ex.getMessage();
+ }
+
+ /**
+ * and make sure we also produce a localized version
+ * @return localized version of the message
+ */
+ public String getLocalizedMessage() {
+ return ex.getLocalizedMessage();
+ }
+
+ /**
+ * The toString() is changed to be prefixed with ExceptionConverter
+ * @return Stringversion of the exception
+ */
+ public String toString() {
+ return prefix + ex;
+ }
+
+ /** we have to override this as well */
+ public void printStackTrace() {
+ printStackTrace(System.err);
+ }
+
+ /**
+ * here we prefix, with s.print(), not s.println(), the stack
+ * trace with "ExceptionConverter:"
+ * @param s
+ */
+ public void printStackTrace(java.io.PrintStream s) {
+ synchronized (s) {
+ s.print(prefix);
+ ex.printStackTrace(s);
+ }
+ }
+
+ /**
+ * Again, we prefix the stack trace with "ExceptionConverter:"
+ * @param s
+ */
+ public void printStackTrace(java.io.PrintWriter s) {
+ synchronized (s) {
+ s.print(prefix);
+ ex.printStackTrace(s);
+ }
+ }
+
+ /**
+ * requests to fill in the stack trace we will have to ignore.
+ * We can't throw an exception here, because this method
+ * is called by the constructor of Throwable
+ * @return a Throwable
+ */
+ public Throwable fillInStackTrace() {
+ return this;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/Font.java b/src/main/java/com/lowagie/text/Font.java
new file mode 100644
index 0000000..412a833
--- /dev/null
+++ b/src/main/java/com/lowagie/text/Font.java
@@ -0,0 +1,806 @@
+/*
+ * $Id: Font.java,v 1.94 2005/10/05 14:16:04 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text;
+
+import java.awt.Color;
+
+import com.lowagie.text.pdf.BaseFont;
+import com.lowagie.text.markup.MarkupTags;
+
+/**
+ * Contains all the specifications of a font: fontfamily, size, style and color.
+ * <P>
+ * Example: <BLOCKQUOTE>
+ *
+ * <PRE>
+ *
+ * Paragraph p = new Paragraph("This is a paragraph", <STRONG>new
+ * Font(Font.HELVETICA, 18, Font.BOLDITALIC, new Color(0, 0, 255)) </STRONG>);
+ *
+ * </PRE>
+ *
+ * </BLOCKQUOTE>
+ */
+
+public class Font implements Comparable {
+
+ // static membervariables for the different families
+
+ /** a possible value of a font family. */
+ public static final int COURIER = 0;
+
+ /** a possible value of a font family. */
+ public static final int HELVETICA = 1;
+
+ /** a possible value of a font family. */
+ public static final int TIMES_ROMAN = 2;
+
+ /** a possible value of a font family. */
+ public static final int SYMBOL = 3;
+
+ /** a possible value of a font family. */
+ public static final int ZAPFDINGBATS = 4;
+
+ // static membervariables for the different styles
+
+ /** this is a possible style. */
+ public static final int NORMAL = 0;
+
+ /** this is a possible style. */
+ public static final int BOLD = 1;
+
+ /** this is a possible style. */
+ public static final int ITALIC = 2;
+
+ /** this is a possible style. */
+ public static final int UNDERLINE = 4;
+
+ /** this is a possible style. */
+ public static final int STRIKETHRU = 8;
+
+ /** this is a possible style. */
+ public static final int BOLDITALIC = BOLD | ITALIC;
+
+ // static membervariables
+
+ /** the value of an undefined attribute. */
+ public static final int UNDEFINED = -1;
+
+ /** the value of the default size. */
+ public static final int DEFAULTSIZE = 12;
+
+ // membervariables
+
+ /** the value of the fontfamily. */
+ private int family = UNDEFINED;
+
+ /** the value of the fontsize. */
+ private float size = UNDEFINED;
+
+ /** the value of the style. */
+ private int style = UNDEFINED;
+
+ /** the value of the color. */
+ private Color color = null;
+
+ /** the external font */
+ private BaseFont baseFont = null;
+
+ // constructors
+
+ /**
+ * Copy constructor of a Font
+ *
+ * @param other
+ * the font that has to be copied
+ */
+ public Font(Font other) {
+ this.color = other.color;
+ this.family = other.family;
+ this.size = other.size;
+ this.style = other.style;
+ this.baseFont = other.baseFont;
+ }
+
+ /**
+ * Constructs a Font.
+ *
+ * @param family
+ * the family to which this font belongs
+ * @param size
+ * the size of this font
+ * @param style
+ * the style of this font
+ * @param color
+ * the <CODE>Color</CODE> of this font.
+ */
+
+ public Font(int family, float size, int style, Color color) {
+ this.family = family;
+ this.size = size;
+ this.style = style;
+ this.color = color;
+ }
+
+ /**
+ * Constructs a Font.
+ *
+ * @param bf
+ * the external font
+ * @param size
+ * the size of this font
+ * @param style
+ * the style of this font
+ * @param color
+ * the <CODE>Color</CODE> of this font.
+ */
+
+ public Font(BaseFont bf, float size, int style, Color color) {
+ this.baseFont = bf;
+ this.size = size;
+ this.style = style;
+ this.color = color;
+ }
+
+ /**
+ * Constructs a Font.
+ *
+ * @param bf
+ * the external font
+ * @param size
+ * the size of this font
+ * @param style
+ * the style of this font
+ */
+ public Font(BaseFont bf, float size, int style) {
+ this(bf, size, style, null);
+ }
+
+ /**
+ * Constructs a Font.
+ *
+ * @param bf
+ * the external font
+ * @param size
+ * the size of this font
+ */
+ public Font(BaseFont bf, float size) {
+ this(bf, size, UNDEFINED, null);
+ }
+
+ /**
+ * Constructs a Font.
+ *
+ * @param bf
+ * the external font
+ */
+ public Font(BaseFont bf) {
+ this(bf, UNDEFINED, UNDEFINED, null);
+ }
+
+ /**
+ * Constructs a Font.
+ *
+ * @param family
+ * the family to which this font belongs
+ * @param size
+ * the size of this font
+ * @param style
+ * the style of this font
+ */
+
+ public Font(int family, float size, int style) {
+ this(family, size, style, null);
+ }
+
+ /**
+ * Constructs a Font.
+ *
+ * @param family
+ * the family to which this font belongs
+ * @param size
+ * the size of this font
+ */
+
+ public Font(int family, float size) {
+ this(family, size, UNDEFINED, null);
+ }
+
+ /**
+ * Constructs a Font.
+ *
+ * @param family
+ * the family to which this font belongs
+ */
+
+ public Font(int family) {
+ this(family, UNDEFINED, UNDEFINED, null);
+ }
+
+ /**
+ * Constructs a Font.
+ */
+
+ public Font() {
+ this(UNDEFINED, UNDEFINED, UNDEFINED, null);
+ }
+
+ // implementation of the Comparable interface
+
+ /**
+ * Compares this <CODE>Font</CODE> with another
+ *
+ * @param object
+ * the other <CODE>Font</CODE>
+ * @return a value
+ */
+
+ public int compareTo(Object object) {
+ if (object == null) {
+ return -1;
+ }
+ Font font;
+ try {
+ font = (Font) object;
+ if (baseFont != null && !baseFont.equals(font.getBaseFont())) {
+ return -2;
+ }
+ if (this.family != font.family()) {
+ return 1;
+ }
+ if (this.size != font.size()) {
+ return 2;
+ }
+ if (this.style != font.style()) {
+ return 3;
+ }
+ if (this.color == null) {
+ if (font.color == null) {
+ return 0;
+ }
+ return 4;
+ }
+ if (font.color == null) {
+ return 4;
+ }
+ if (this.color.equals(font.color())) {
+ return 0;
+ }
+ return 4;
+ } catch (ClassCastException cce) {
+ return -3;
+ }
+ }
+
+ // methods
+
+ /**
+ * Sets the family using a <CODE>String</CODE> ("Courier", "Helvetica",
+ * "Times New Roman", "Symbol" or "ZapfDingbats").
+ *
+ * @param family
+ * A <CODE>String</CODE> representing a certain font-family.
+ */
+
+ public void setFamily(String family) {
+ this.family = getFamilyIndex(family);
+ }
+
+ /**
+ * Translates a <CODE>String</CODE> -value of a certain family into the
+ * index that is used for this family in this class.
+ *
+ * @param family
+ * A <CODE>String</CODE> representing a certain font-family
+ * @return the corresponding index
+ */
+
+ public static int getFamilyIndex(String family) {
+ if (family.equalsIgnoreCase(FontFactory.COURIER)) {
+ return COURIER;
+ }
+ if (family.equalsIgnoreCase(FontFactory.HELVETICA)) {
+ return HELVETICA;
+ }
+ if (family.equalsIgnoreCase(FontFactory.TIMES_ROMAN)) {
+ return TIMES_ROMAN;
+ }
+ if (family.equalsIgnoreCase(FontFactory.SYMBOL)) {
+ return SYMBOL;
+ }
+ if (family.equalsIgnoreCase(FontFactory.ZAPFDINGBATS)) {
+ return ZAPFDINGBATS;
+ }
+ return UNDEFINED;
+ }
+
+ /**
+ * Gets the familyname as a String.
+ *
+ * @return the familyname
+ */
+
+ public String getFamilyname() {
+ String tmp = "unknown";
+ switch (family()) {
+ case Font.COURIER:
+ return FontFactory.COURIER;
+ case Font.HELVETICA:
+ return FontFactory.HELVETICA;
+ case Font.TIMES_ROMAN:
+ return FontFactory.TIMES_ROMAN;
+ case Font.SYMBOL:
+ return FontFactory.SYMBOL;
+ case Font.ZAPFDINGBATS:
+ return FontFactory.ZAPFDINGBATS;
+ default:
+ if (baseFont != null) {
+ String[][] names = baseFont.getFamilyFontName();
+ for (int i = 0; i < names.length; i++) {
+ if ("0".equals(names[i][2])) {
+ return names[i][3];
+ }
+ if ("1033".equals(names[i][2])) {
+ tmp = names[i][3];
+ }
+ if ("".equals(names[i][2])) {
+ tmp = names[i][3];
+ }
+ }
+ }
+ }
+ return tmp;
+ }
+
+ /**
+ * Sets the size.
+ *
+ * @param size
+ * The new size of the font.
+ */
+
+ public void setSize(float size) {
+ this.size = size;
+ }
+
+ /**
+ * Sets the style using a <CODE>String</CODE> containing one of more of
+ * the following values: normal, bold, italic, underline, strike.
+ *
+ * @param style
+ * A <CODE>String</CODE> representing a certain style.
+ */
+
+ public void setStyle(String style) {
+ if (this.style == UNDEFINED)
+ this.style = NORMAL;
+ this.style |= getStyleValue(style);
+ }
+
+ /**
+ * Sets the style.
+ *
+ * @param style
+ * the style.
+ */
+
+ public void setStyle(int style) {
+ if (this.style == UNDEFINED)
+ this.style = NORMAL;
+ this.style |= style;
+ }
+
+ /**
+ * Translates a <CODE>String</CODE> -value of a certain style into the
+ * index value is used for this style in this class.
+ *
+ * @param style
+ * A <CODE>String</CODE>
+ * @return the corresponding value
+ */
+
+ public static int getStyleValue(String style) {
+ int s = 0;
+ if (style.indexOf(MarkupTags.CSS_VALUE_NORMAL) != -1) {
+ s |= NORMAL;
+ }
+ if (style.indexOf(MarkupTags.CSS_VALUE_BOLD) != -1) {
+ s |= BOLD;
+ }
+ if (style.indexOf(MarkupTags.CSS_VALUE_ITALIC) != -1) {
+ s |= ITALIC;
+ }
+ if (style.indexOf(MarkupTags.CSS_VALUE_OBLIQUE) != -1) {
+ s |= ITALIC;
+ }
+ if (style.indexOf(MarkupTags.CSS_VALUE_UNDERLINE) != -1) {
+ s |= UNDERLINE;
+ }
+ if (style.indexOf(MarkupTags.CSS_VALUE_LINETHROUGH) != -1) {
+ s |= STRIKETHRU;
+ }
+ return s;
+ }
+
+ /**
+ * Sets the color.
+ *
+ * @param color
+ * the new color of the font
+ */
+
+ public void setColor(Color color) {
+ this.color = color;
+ }
+
+ /**
+ * Sets the color.
+ *
+ * @param red
+ * the red-value of the new color
+ * @param green
+ * the green-value of the new color
+ * @param blue
+ * the blue-value of the new color
+ */
+
+ public void setColor(int red, int green, int blue) {
+ this.color = new Color(red, green, blue);
+ }
+
+ /**
+ * Gets the leading that can be used with this font.
+ *
+ * @param linespacing
+ * a certain linespacing
+ * @return the height of a line
+ */
+
+ public float leading(float linespacing) {
+ if (size == UNDEFINED) {
+ return linespacing * DEFAULTSIZE;
+ }
+ return linespacing * size;
+ }
+
+ /**
+ * Checks if the properties of this font are undefined or null.
+ * <P>
+ * If so, the standard should be used.
+ *
+ * @return a <CODE>boolean</CODE>
+ */
+
+ public boolean isStandardFont() {
+ return (family == UNDEFINED && size == UNDEFINED && style == UNDEFINED
+ && color == null && baseFont == null);
+ }
+
+ /**
+ * Replaces the attributes that are equal to <VAR>null </VAR> with the
+ * attributes of a given font.
+ *
+ * @param font
+ * the font of a bigger element class
+ * @return a <CODE>Font</CODE>
+ */
+
+ public Font difference(Font font) {
+ // size
+ float dSize = font.size;
+ if (dSize == UNDEFINED) {
+ dSize = this.size;
+ }
+ // style
+ int dStyle = UNDEFINED;
+ int style1 = this.style;
+ int style2 = font.style();
+ if (style1 != UNDEFINED || style2 != UNDEFINED) {
+ if (style1 == UNDEFINED)
+ style1 = 0;
+ if (style2 == UNDEFINED)
+ style2 = 0;
+ dStyle = style1 | style2;
+ }
+ // color
+ Color dColor = font.color;
+ if (dColor == null) {
+ dColor = this.color;
+ }
+ // family
+ if (font.baseFont != null) {
+ return new Font(font.baseFont, dSize, dStyle, dColor);
+ }
+ if (font.family() != UNDEFINED) {
+ return new Font(font.family, dSize, dStyle, dColor);
+ }
+ if (this.baseFont != null) {
+ if (dStyle == style1) {
+ return new Font(this.baseFont, dSize, dStyle, dColor);
+ } else {
+ return FontFactory.getFont(this.getFamilyname(), dSize, dStyle,
+ dColor);
+ }
+ }
+ return new Font(this.family, dSize, dStyle, dColor);
+ }
+
+ // methods to retrieve the membervariables
+
+ /**
+ * Gets the family of this font.
+ *
+ * @return the value of the family
+ */
+
+ public int family() {
+ return family;
+ }
+
+ /**
+ * Gets the size of this font.
+ *
+ * @return a size
+ */
+
+ public float size() {
+ return size;
+ }
+
+ /**
+ * Gets the style of this font.
+ *
+ * @return a size
+ */
+
+ public int style() {
+ return style;
+ }
+
+ /**
+ * checks if this font is Bold.
+ *
+ * @return a <CODE>boolean</CODE>
+ */
+
+ public boolean isBold() {
+ if (style == UNDEFINED) {
+ return false;
+ }
+ return (style & BOLD) == BOLD;
+ }
+
+ /**
+ * checks if this font is Bold.
+ *
+ * @return a <CODE>boolean</CODE>
+ */
+
+ public boolean isItalic() {
+ if (style == UNDEFINED) {
+ return false;
+ }
+ return (style & ITALIC) == ITALIC;
+ }
+
+ /**
+ * checks if this font is underlined.
+ *
+ * @return a <CODE>boolean</CODE>
+ */
+
+ public boolean isUnderlined() {
+ if (style == UNDEFINED) {
+ return false;
+ }
+ return (style & UNDERLINE) == UNDERLINE;
+ }
+
+ /**
+ * checks if the style of this font is STRIKETHRU.
+ *
+ * @return a <CODE>boolean</CODE>
+ */
+
+ public boolean isStrikethru() {
+ if (style == UNDEFINED) {
+ return false;
+ }
+ return (style & STRIKETHRU) == STRIKETHRU;
+ }
+
+ /**
+ * Gets the color of this font.
+ *
+ * @return a color
+ */
+
+ public Color color() {
+ return color;
+ }
+
+ /**
+ * Gets the <CODE>BaseFont</CODE> inside this object.
+ *
+ * @return the <CODE>BaseFont</CODE>
+ */
+
+ public BaseFont getBaseFont() {
+ return baseFont;
+ }
+
+ /**
+ * Gets the <CODE>BaseFont</CODE> this class represents. For the built-in
+ * fonts a <CODE>BaseFont</CODE> is calculated.
+ *
+ * @param specialEncoding
+ * <CODE>true</CODE> to use the special encoding for Symbol and
+ * ZapfDingbats, <CODE>false</CODE> to always use <CODE>Cp1252
+ * </CODE>
+ * @return the <CODE>BaseFont</CODE> this class represents
+ */
+ public BaseFont getCalculatedBaseFont(boolean specialEncoding) {
+ if (baseFont != null)
+ return baseFont;
+ int style = this.style;
+ if (style == UNDEFINED) {
+ style = NORMAL;
+ }
+ String fontName = BaseFont.HELVETICA;
+ String encoding = BaseFont.WINANSI;
+ BaseFont cfont = null;
+ switch (family) {
+ case COURIER:
+ switch (style & BOLDITALIC) {
+ case BOLD:
+ fontName = BaseFont.COURIER_BOLD;
+ break;
+ case ITALIC:
+ fontName = BaseFont.COURIER_OBLIQUE;
+ break;
+ case BOLDITALIC:
+ fontName = BaseFont.COURIER_BOLDOBLIQUE;
+ break;
+ default:
+ //case NORMAL:
+ fontName = BaseFont.COURIER;
+ break;
+ }
+ break;
+ case TIMES_ROMAN:
+ switch (style & BOLDITALIC) {
+ case BOLD:
+ fontName = BaseFont.TIMES_BOLD;
+ break;
+ case ITALIC:
+ fontName = BaseFont.TIMES_ITALIC;
+ break;
+ case BOLDITALIC:
+ fontName = BaseFont.TIMES_BOLDITALIC;
+ break;
+ default:
+ case NORMAL:
+ fontName = BaseFont.TIMES_ROMAN;
+ break;
+ }
+ break;
+ case SYMBOL:
+ fontName = BaseFont.SYMBOL;
+ if (specialEncoding)
+ encoding = BaseFont.SYMBOL;
+ break;
+ case ZAPFDINGBATS:
+ fontName = BaseFont.ZAPFDINGBATS;
+ if (specialEncoding)
+ encoding = BaseFont.ZAPFDINGBATS;
+ break;
+ default:
+ case Font.HELVETICA:
+ switch (style & BOLDITALIC) {
+ case BOLD:
+ fontName = BaseFont.HELVETICA_BOLD;
+ break;
+ case ITALIC:
+ fontName = BaseFont.HELVETICA_OBLIQUE;
+ break;
+ case BOLDITALIC:
+ fontName = BaseFont.HELVETICA_BOLDOBLIQUE;
+ break;
+ default:
+ case NORMAL:
+ fontName = BaseFont.HELVETICA;
+ break;
+ }
+ break;
+ }
+ try {
+ cfont = BaseFont.createFont(fontName, encoding, false);
+ } catch (Exception ee) {
+ throw new ExceptionConverter(ee);
+ }
+ return cfont;
+ }
+
+ /**
+ * Gets the style that can be used with the calculated <CODE>BaseFont
+ * </CODE>.
+ *
+ * @return the style that can be used with the calculated <CODE>BaseFont
+ * </CODE>
+ */
+ public int getCalculatedStyle() {
+ int style = this.style;
+ if (style == UNDEFINED) {
+ style = NORMAL;
+ }
+ if (baseFont != null)
+ return style;
+ if (family == SYMBOL || family == ZAPFDINGBATS)
+ return style;
+ else
+ return style & (~BOLDITALIC);
+ }
+
+ /**
+ * Gets the size that can be used with the calculated <CODE>BaseFont
+ * </CODE>.
+ *
+ * @return the size that can be used with the calculated <CODE>BaseFont
+ * </CODE>
+ */
+ public float getCalculatedSize() {
+ float s = this.size;
+ if (s == UNDEFINED) {
+ s = DEFAULTSIZE;
+ }
+ return s;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/FontFactory.java b/src/main/java/com/lowagie/text/FontFactory.java
new file mode 100644
index 0000000..4d96836
--- /dev/null
+++ b/src/main/java/com/lowagie/text/FontFactory.java
@@ -0,0 +1,429 @@
+/*
+ * $Id: FontFactory.java,v 1.73 2006/05/29 11:00:30 psoares33 Exp $
+ * $Name: $
+ *
+ * Copyright 2002 by Bruno Lowagie.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text;
+
+import java.awt.Color;
+import java.io.IOException;
+import java.util.Hashtable;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.Properties;
+import java.util.Set;
+import java.util.Enumeration;
+import java.io.File;
+import com.lowagie.text.pdf.BaseFont;
+import com.lowagie.text.markup.MarkupTags;
+import com.lowagie.text.markup.MarkupParser;
+
+/**
+ * If you are using True Type fonts, you can declare the paths of the different ttf- and ttc-files
+ * to this static class first and then create fonts in your code using one of the static getFont-method
+ * without having to enter a path as parameter.
+ *
+ * @author Bruno Lowagie
+ */
+
+public class FontFactory {
+
+/** This is a possible value of a base 14 type 1 font */
+ public static final String COURIER = BaseFont.COURIER;
+
+/** This is a possible value of a base 14 type 1 font */
+ public static final String COURIER_BOLD = BaseFont.COURIER_BOLD;
+
+/** This is a possible value of a base 14 type 1 font */
+ public static final String COURIER_OBLIQUE = BaseFont.COURIER_OBLIQUE;
+
+/** This is a possible value of a base 14 type 1 font */
+ public static final String COURIER_BOLDOBLIQUE = BaseFont.COURIER_BOLDOBLIQUE;
+
+/** This is a possible value of a base 14 type 1 font */
+ public static final String HELVETICA = BaseFont.HELVETICA;
+
+/** This is a possible value of a base 14 type 1 font */
+ public static final String HELVETICA_BOLD = BaseFont.HELVETICA_BOLD;
+
+/** This is a possible value of a base 14 type 1 font */
+ public static final String HELVETICA_OBLIQUE = BaseFont.HELVETICA_OBLIQUE;
+
+/** This is a possible value of a base 14 type 1 font */
+ public static final String HELVETICA_BOLDOBLIQUE = BaseFont.HELVETICA_BOLDOBLIQUE;
+
+/** This is a possible value of a base 14 type 1 font */
+ public static final String SYMBOL = BaseFont.SYMBOL;
+
+/** This is a possible value of a base 14 type 1 font */
+ public static final String TIMES = "Times";
+
+/** This is a possible value of a base 14 type 1 font */
+ public static final String TIMES_ROMAN = BaseFont.TIMES_ROMAN;
+
+/** This is a possible value of a base 14 type 1 font */
+ public static final String TIMES_BOLD = BaseFont.TIMES_BOLD;
+
+/** This is a possible value of a base 14 type 1 font */
+ public static final String TIMES_ITALIC = BaseFont.TIMES_ITALIC;
+
+/** This is a possible value of a base 14 type 1 font */
+ public static final String TIMES_BOLDITALIC = BaseFont.TIMES_BOLDITALIC;
+
+/** This is a possible value of a base 14 type 1 font */
+ public static final String ZAPFDINGBATS = BaseFont.ZAPFDINGBATS;
+
+ private static FontFactoryImp fontImp = new FontFactoryImp();
+
+/** This is the default encoding to use. */
+ public static String defaultEncoding = BaseFont.WINANSI;
+
+/** This is the default value of the <VAR>embedded</VAR> variable. */
+ public static boolean defaultEmbedding = BaseFont.NOT_EMBEDDED;
+
+/** Creates new FontFactory */
+ private FontFactory() {
+ }
+
+/**
+ * Constructs a <CODE>Font</CODE>-object.
+ *
+ * @param fontname the name of the font
+ * @param encoding the encoding of the font
+ * @param embedded true if the font is to be embedded in the PDF
+ * @param size the size of this font
+ * @param style the style of this font
+ * @param color the <CODE>Color</CODE> of this font.
+ * @return the Font constructed based on the parameters
+ */
+
+ public static Font getFont(String fontname, String encoding, boolean embedded, float size, int style, Color color) {
+ return fontImp.getFont(fontname, encoding, embedded, size, style, color);
+ }
+
+/**
+ * Constructs a <CODE>Font</CODE>-object.
+ *
+ * @param fontname the name of the font
+ * @param encoding the encoding of the font
+ * @param embedded true if the font is to be embedded in the PDF
+ * @param size the size of this font
+ * @param style the style of this font
+ * @param color the <CODE>Color</CODE> of this font.
+ * @param cached true if the font comes from the cache or is added to
+ * the cache if new, false if the font is always created new
+ * @return the Font constructed based on the parameters
+ */
+
+ public static Font getFont(String fontname, String encoding, boolean embedded, float size, int style, Color color, boolean cached) {
+ return fontImp.getFont(fontname, encoding, embedded, size, style, color, cached);
+ }
+
+/**
+ * Constructs a <CODE>Font</CODE>-object.
+ *
+ * @param attributes the attributes of a <CODE>Font</CODE> object.
+ * @return the Font constructed based on the attributes
+ */
+
+ public static Font getFont(Properties attributes) {
+ fontImp.defaultEmbedding = defaultEmbedding;
+ fontImp.defaultEncoding = defaultEncoding;
+ return fontImp.getFont(attributes);
+ }
+
+/**
+ * Constructs a <CODE>Font</CODE>-object.
+ *
+ * @param fontname the name of the font
+ * @param encoding the encoding of the font
+ * @param embedded true if the font is to be embedded in the PDF
+ * @param size the size of this font
+ * @param style the style of this font
+ * @return the Font constructed based on the parameters
+ */
+
+ public static Font getFont(String fontname, String encoding, boolean embedded, float size, int style) {
+ return getFont(fontname, encoding, embedded, size, style, null);
+ }
+
+/**
+ * Constructs a <CODE>Font</CODE>-object.
+ *
+ * @param fontname the name of the font
+ * @param encoding the encoding of the font
+ * @param embedded true if the font is to be embedded in the PDF
+ * @param size the size of this font
+ * @return the Font constructed based on the parameters
+ */
+
+ public static Font getFont(String fontname, String encoding, boolean embedded, float size) {
+ return getFont(fontname, encoding, embedded, size, Font.UNDEFINED, null);
+ }
+
+/**
+ * Constructs a <CODE>Font</CODE>-object.
+ *
+ * @param fontname the name of the font
+ * @param encoding the encoding of the font
+ * @param embedded true if the font is to be embedded in the PDF
+ * @return the Font constructed based on the parameters
+ */
+
+ public static Font getFont(String fontname, String encoding, boolean embedded) {
+ return getFont(fontname, encoding, embedded, Font.UNDEFINED, Font.UNDEFINED, null);
+ }
+
+/**
+ * Constructs a <CODE>Font</CODE>-object.
+ *
+ * @param fontname the name of the font
+ * @param encoding the encoding of the font
+ * @param size the size of this font
+ * @param style the style of this font
+ * @param color the <CODE>Color</CODE> of this font.
+ * @return the Font constructed based on the parameters
+ */
+
+ public static Font getFont(String fontname, String encoding, float size, int style, Color color) {
+ return getFont(fontname, encoding, defaultEmbedding, size, style, color);
+ }
+
+/**
+ * Constructs a <CODE>Font</CODE>-object.
+ *
+ * @param fontname the name of the font
+ * @param encoding the encoding of the font
+ * @param size the size of this font
+ * @param style the style of this font
+ * @return the Font constructed based on the parameters
+ */
+
+ public static Font getFont(String fontname, String encoding, float size, int style) {
+ return getFont(fontname, encoding, defaultEmbedding, size, style, null);
+ }
+
+/**
+ * Constructs a <CODE>Font</CODE>-object.
+ *
+ * @param fontname the name of the font
+ * @param encoding the encoding of the font
+ * @param size the size of this font
+ * @return the Font constructed based on the parameters
+ */
+
+ public static Font getFont(String fontname, String encoding, float size) {
+ return getFont(fontname, encoding, defaultEmbedding, size, Font.UNDEFINED, null);
+ }
+
+/**
+ * Constructs a <CODE>Font</CODE>-object.
+ *
+ * @param fontname the name of the font
+ * @param encoding the encoding of the font
+ * @return the Font constructed based on the parameters
+ */
+
+ public static Font getFont(String fontname, String encoding) {
+ return getFont(fontname, encoding, defaultEmbedding, Font.UNDEFINED, Font.UNDEFINED, null);
+ }
+
+/**
+ * Constructs a <CODE>Font</CODE>-object.
+ *
+ * @param fontname the name of the font
+ * @param size the size of this font
+ * @param style the style of this font
+ * @param color the <CODE>Color</CODE> of this font.
+ * @return the Font constructed based on the parameters
+ */
+
+ public static Font getFont(String fontname, float size, int style, Color color) {
+ return getFont(fontname, defaultEncoding, defaultEmbedding, size, style, color);
+ }
+
+/**
+ * Constructs a <CODE>Font</CODE>-object.
+ *
+ * @param fontname the name of the font
+ * @param size the size of this font
+ * @param style the style of this font
+ * @return the Font constructed based on the parameters
+ */
+
+ public static Font getFont(String fontname, float size, int style) {
+ return getFont(fontname, defaultEncoding, defaultEmbedding, size, style, null);
+ }
+
+/**
+ * Constructs a <CODE>Font</CODE>-object.
+ *
+ * @param fontname the name of the font
+ * @param size the size of this font
+ * @return the Font constructed based on the parameters
+ */
+
+ public static Font getFont(String fontname, float size) {
+ return getFont(fontname, defaultEncoding, defaultEmbedding, size, Font.UNDEFINED, null);
+ }
+
+/**
+ * Constructs a <CODE>Font</CODE>-object.
+ *
+ * @param fontname the name of the font
+ * @return the Font constructed based on the parameters
+ */
+
+ public static Font getFont(String fontname) {
+ return getFont(fontname, defaultEncoding, defaultEmbedding, Font.UNDEFINED, Font.UNDEFINED, null);
+ }
+
+ /**
+ * Register a font by giving explicitly the font family and name.
+ * @param familyName the font family
+ * @param fullName the font name
+ * @param path the font path
+ */
+ public void registerFamily(String familyName, String fullName, String path) {
+ fontImp.registerFamily(familyName, fullName, path);
+ }
+
+/**
+ * Register a ttf- or a ttc-file.
+ *
+ * @param path the path to a ttf- or ttc-file
+ */
+
+ public static void register(String path) {
+ register(path, null);
+ }
+
+/**
+ * Register a font file and use an alias for the font contained in it.
+ *
+ * @param path the path to a font file
+ * @param alias the alias you want to use for the font
+ */
+
+ public static void register(String path, String alias) {
+ fontImp.register(path, alias);
+ }
+
+ /** Register all the fonts in a directory.
+ * @param dir the directory
+ * @return the number of fonts registered
+ */
+ public static int registerDirectory(String dir) {
+ return fontImp.registerDirectory(dir);
+ }
+
+ /** Register fonts in some probable directories. It usually works in Windows,
+ * Linux and Solaris.
+ * @return the number of fonts registered
+ */
+ public static int registerDirectories() {
+ return fontImp.registerDirectories();
+ }
+
+/**
+ * Gets a set of registered fontnames.
+ * @return a set of registered fonts
+ */
+
+ public static Set getRegisteredFonts() {
+ return fontImp.getRegisteredFonts();
+ }
+
+/**
+ * Gets a set of registered fontnames.
+ * @return a set of registered font families
+ */
+
+ public static Set getRegisteredFamilies() {
+ return fontImp.getRegisteredFamilies();
+ }
+
+/**
+ * Gets a set of registered fontnames.
+ * @param fontname of a font that may or may not be registered
+ * @return true if a given font is registered
+ */
+
+ public static boolean contains(String fontname) {
+ return fontImp.isRegistered(fontname);
+ }
+
+/**
+ * Checks if a certain font is registered.
+ *
+ * @param fontname the name of the font that has to be checked.
+ * @return true if the font is found
+ */
+
+ public static boolean isRegistered(String fontname) {
+ return fontImp.isRegistered(fontname);
+ }
+
+ /**
+ * Gets the font factory implementation.
+ * @return the font factory implementation
+ */
+ public static FontFactoryImp getFontImp() {
+ return fontImp;
+ }
+
+ /**
+ * Sets the font factory implementation.
+ * @param fontImp the font factory implementation
+ */
+ public static void setFontImp(FontFactoryImp fontImp) {
+ if (fontImp == null)
+ throw new NullPointerException("FontFactoryImp cannot be null.");
+ FontFactory.fontImp = fontImp;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/FontFactoryImp.java b/src/main/java/com/lowagie/text/FontFactoryImp.java
new file mode 100644
index 0000000..b9ae4c1
--- /dev/null
+++ b/src/main/java/com/lowagie/text/FontFactoryImp.java
@@ -0,0 +1,659 @@
+/*
+ * $Id: FontFactoryImp.java,v 1.5 2006/06/23 12:54:11 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2002 by Bruno Lowagie.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text;
+
+import java.awt.Color;
+import java.io.IOException;
+import java.util.Hashtable;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.Properties;
+import java.util.Set;
+import java.util.Enumeration;
+import java.io.File;
+import com.lowagie.text.pdf.BaseFont;
+import com.lowagie.text.markup.MarkupTags;
+import com.lowagie.text.markup.MarkupParser;
+
+/**
+ * If you are using True Type fonts, you can declare the paths of the different ttf- and ttc-files
+ * to this class first and then create fonts in your code using one of the getFont method
+ * without having to enter a path as parameter.
+ *
+ * @author Bruno Lowagie
+ */
+
+public class FontFactoryImp {
+
+/** This is a map of postscriptfontnames of True Type fonts and the path of their ttf- or ttc-file. */
+ private Properties trueTypeFonts = new Properties();
+
+ private static String[] TTFamilyOrder = {
+ "3", "1", "1033",
+ "3", "0", "1033",
+ "1", "0", "0",
+ "0", "3", "0"
+ };
+
+/** This is a map of fontfamilies. */
+ private Hashtable fontFamilies = new Hashtable();
+
+/** This is the default encoding to use. */
+ public String defaultEncoding = BaseFont.WINANSI;
+
+/** This is the default value of the <VAR>embedded</VAR> variable. */
+ public boolean defaultEmbedding = BaseFont.NOT_EMBEDDED;
+
+/** Creates new FontFactory */
+ public FontFactoryImp() {
+ trueTypeFonts.setProperty(FontFactory.COURIER.toLowerCase(), FontFactory.COURIER);
+ trueTypeFonts.setProperty(FontFactory.COURIER_BOLD.toLowerCase(), FontFactory.COURIER_BOLD);
+ trueTypeFonts.setProperty(FontFactory.COURIER_OBLIQUE.toLowerCase(), FontFactory.COURIER_OBLIQUE);
+ trueTypeFonts.setProperty(FontFactory.COURIER_BOLDOBLIQUE.toLowerCase(), FontFactory.COURIER_BOLDOBLIQUE);
+ trueTypeFonts.setProperty(FontFactory.HELVETICA.toLowerCase(), FontFactory.HELVETICA);
+ trueTypeFonts.setProperty(FontFactory.HELVETICA_BOLD.toLowerCase(), FontFactory.HELVETICA_BOLD);
+ trueTypeFonts.setProperty(FontFactory.HELVETICA_OBLIQUE.toLowerCase(), FontFactory.HELVETICA_OBLIQUE);
+ trueTypeFonts.setProperty(FontFactory.HELVETICA_BOLDOBLIQUE.toLowerCase(), FontFactory.HELVETICA_BOLDOBLIQUE);
+ trueTypeFonts.setProperty(FontFactory.SYMBOL.toLowerCase(), FontFactory.SYMBOL);
+ trueTypeFonts.setProperty(FontFactory.TIMES_ROMAN.toLowerCase(), FontFactory.TIMES_ROMAN);
+ trueTypeFonts.setProperty(FontFactory.TIMES_BOLD.toLowerCase(), FontFactory.TIMES_BOLD);
+ trueTypeFonts.setProperty(FontFactory.TIMES_ITALIC.toLowerCase(), FontFactory.TIMES_ITALIC);
+ trueTypeFonts.setProperty(FontFactory.TIMES_BOLDITALIC.toLowerCase(), FontFactory.TIMES_BOLDITALIC);
+ trueTypeFonts.setProperty(FontFactory.ZAPFDINGBATS.toLowerCase(), FontFactory.ZAPFDINGBATS);
+
+ ArrayList tmp;
+ tmp = new ArrayList();
+ tmp.add(FontFactory.COURIER);
+ tmp.add(FontFactory.COURIER_BOLD);
+ tmp.add(FontFactory.COURIER_OBLIQUE);
+ tmp.add(FontFactory.COURIER_BOLDOBLIQUE);
+ fontFamilies.put(FontFactory.COURIER.toLowerCase(), tmp);
+ tmp = new ArrayList();
+ tmp.add(FontFactory.HELVETICA);
+ tmp.add(FontFactory.HELVETICA_BOLD);
+ tmp.add(FontFactory.HELVETICA_OBLIQUE);
+ tmp.add(FontFactory.HELVETICA_BOLDOBLIQUE);
+ fontFamilies.put(FontFactory.HELVETICA.toLowerCase(), tmp);
+ tmp = new ArrayList();
+ tmp.add(FontFactory.SYMBOL);
+ fontFamilies.put(FontFactory.SYMBOL.toLowerCase(), tmp);
+ tmp = new ArrayList();
+ tmp.add(FontFactory.TIMES_ROMAN);
+ tmp.add(FontFactory.TIMES_BOLD);
+ tmp.add(FontFactory.TIMES_ITALIC);
+ tmp.add(FontFactory.TIMES_BOLDITALIC);
+ fontFamilies.put(FontFactory.TIMES.toLowerCase(), tmp);
+ fontFamilies.put(FontFactory.TIMES_ROMAN.toLowerCase(), tmp);
+ tmp = new ArrayList();
+ tmp.add(FontFactory.ZAPFDINGBATS);
+ fontFamilies.put(FontFactory.ZAPFDINGBATS.toLowerCase(), tmp);
+ }
+
+ /**
+ * Constructs a <CODE>Font</CODE>-object.
+ *
+ * @param fontname the name of the font
+ * @param encoding the encoding of the font
+ * @param embedded true if the font is to be embedded in the PDF
+ * @param size the size of this font
+ * @param style the style of this font
+ * @param color the <CODE>Color</CODE> of this font.
+ * @return the Font constructed based on the parameters
+ */
+ public Font getFont(String fontname, String encoding, boolean embedded, float size, int style, Color color) {
+ return getFont(fontname, encoding, embedded, size, style, color, true);
+ }
+
+
+
+ /**
+ * Constructs a <CODE>Font</CODE>-object.
+ *
+ * @param fontname the name of the font
+ * @param encoding the encoding of the font
+ * @param embedded true if the font is to be embedded in the PDF
+ * @param size the size of this font
+ * @param style the style of this font
+ * @param color the <CODE>Color</CODE> of this font.
+ * @param cached true if the font comes from the cache or is added to
+ * the cache if new, false if the font is always created new
+ * @return the Font constructed based on the parameters
+ */
+ public Font getFont(String fontname, String encoding, boolean embedded, float size, int style, Color color, boolean cached) {
+ if (fontname == null) return new Font(Font.UNDEFINED, size, style, color);
+ String lowercasefontname = fontname.toLowerCase();
+ ArrayList tmp = (ArrayList) fontFamilies.get(lowercasefontname);
+ if (tmp != null) {
+ // some bugs were fixed here by Daniel Marczisovszky
+ int s = style == Font.UNDEFINED ? Font.NORMAL : style;
+ int fs = Font.NORMAL;
+ boolean found = false;
+ for (Iterator i = tmp.iterator(); i.hasNext(); ) {
+ String f = (String) i.next();
+ String lcf = f.toLowerCase();
+ fs = Font.NORMAL;
+ if (lcf.toLowerCase().indexOf("bold") != -1) fs |= Font.BOLD;
+ if (lcf.toLowerCase().indexOf("italic") != -1 || lcf.toLowerCase().indexOf("oblique") != -1) fs |= Font.ITALIC;
+ if ((s & Font.BOLDITALIC) == fs) {
+ fontname = f;
+ found = true;
+ break;
+ }
+ }
+ if (style != Font.UNDEFINED && found) {
+ style &= ~fs;
+ }
+ }
+ BaseFont basefont = null;
+ try {
+ try {
+ // the font is a type 1 font or CJK font
+ basefont = BaseFont.createFont(fontname, encoding, embedded, cached, null, null);
+ }
+ catch(DocumentException de) {
+ // the font is a true type font or an unknown font
+ fontname = trueTypeFonts.getProperty(fontname.toLowerCase());
+ // the font is not registered as truetype font
+ if (fontname == null) return new Font(Font.UNDEFINED, size, style, color);
+ // the font is registered as truetype font
+ basefont = BaseFont.createFont(fontname, encoding, embedded, cached, null, null);
+ }
+ }
+ catch(DocumentException de) {
+ // this shouldn't happen
+ throw new ExceptionConverter(de);
+ }
+ catch(IOException ioe) {
+ // the font is registered as a true type font, but the path was wrong
+ return new Font(Font.UNDEFINED, size, style, color);
+ }
+ catch(NullPointerException npe) {
+ // null was entered as fontname and/or encoding
+ return new Font(Font.UNDEFINED, size, style, color);
+ }
+ return new Font(basefont, size, style, color);
+ }
+
+
+/**
+ * Constructs a <CODE>Font</CODE>-object.
+ *
+ * @param attributes the attributes of a <CODE>Font</CODE> object.
+ * @return the Font constructed based on the attributes
+ */
+
+ public Font getFont(Properties attributes) {
+ String fontname = null;
+ String encoding = defaultEncoding;
+ boolean embedded = defaultEmbedding;
+ float size = Font.UNDEFINED;
+ int style = Font.NORMAL;
+ Color color = null;
+ String value = (String) attributes.remove(MarkupTags.HTML_ATTR_STYLE);
+ if (value != null && value.length() > 0) {
+ Properties styleAttributes = MarkupParser.parseAttributes(value);
+ if (styleAttributes.size() == 0) {
+ attributes.put(MarkupTags.HTML_ATTR_STYLE, value);
+ }
+ else {
+ fontname = (String)styleAttributes.remove(MarkupTags.CSS_KEY_FONTFAMILY);
+ if (fontname != null) {
+ String tmp;
+ while (fontname.indexOf(",") != -1) {
+ tmp = fontname.substring(0, fontname.indexOf(","));
+ if (isRegistered(tmp)) {
+ fontname = tmp;
+ }
+ else {
+ fontname = fontname.substring(fontname.indexOf(",") + 1);
+ }
+ }
+ }
+ if ((value = (String)styleAttributes.remove(MarkupTags.CSS_KEY_FONTSIZE)) != null) {
+ size = MarkupParser.parseLength(value);
+ }
+ if ((value = (String)styleAttributes.remove(MarkupTags.CSS_KEY_FONTWEIGHT)) != null) {
+ style |= Font.getStyleValue(value);
+ }
+ if ((value = (String)styleAttributes.remove(MarkupTags.CSS_KEY_FONTSTYLE)) != null) {
+ style |= Font.getStyleValue(value);
+ }
+ if ((value = (String)styleAttributes.remove(MarkupTags.CSS_KEY_COLOR)) != null) {
+ color = MarkupParser.decodeColor(value);
+ }
+ attributes.putAll(styleAttributes);
+ for (Enumeration e = styleAttributes.keys(); e.hasMoreElements();) {
+ Object o = e.nextElement();
+ attributes.put(o, styleAttributes.get(o));
+ }
+ }
+ }
+ if ((value = (String)attributes.remove(ElementTags.ENCODING)) != null) {
+ encoding = value;
+ }
+ if ("true".equals(attributes.remove(ElementTags.EMBEDDED))) {
+ embedded = true;
+ }
+ if ((value = (String)attributes.remove(ElementTags.FONT)) != null) {
+ fontname = value;
+ }
+ if ((value = (String)attributes.remove(ElementTags.SIZE)) != null) {
+ size = Float.valueOf(value + "f").floatValue();
+ }
+ if ((value = (String)attributes.remove(MarkupTags.HTML_ATTR_STYLE)) != null) {
+ style |= Font.getStyleValue(value);
+ }
+ if ((value = (String)attributes.remove(ElementTags.STYLE)) != null) {
+ style |= Font.getStyleValue(value);
+ }
+ String r = (String)attributes.remove(ElementTags.RED);
+ String g = (String)attributes.remove(ElementTags.GREEN);
+ String b = (String)attributes.remove(ElementTags.BLUE);
+ if (r != null || g != null || b != null) {
+ int red = 0;
+ int green = 0;
+ int blue = 0;
+ if (r != null) red = Integer.parseInt(r);
+ if (g != null) green = Integer.parseInt(g);
+ if (b != null) blue = Integer.parseInt(b);
+ color = new Color(red, green, blue);
+ }
+ else if ((value = (String)attributes.remove(ElementTags.COLOR)) != null) {
+ color = MarkupParser.decodeColor(value);
+ }
+ if (fontname == null) {
+ return getFont(null, encoding, embedded, size, style, color);
+ }
+ return getFont(fontname, encoding, embedded, size, style, color);
+ }
+
+/**
+ * Constructs a <CODE>Font</CODE>-object.
+ *
+ * @param fontname the name of the font
+ * @param encoding the encoding of the font
+ * @param embedded true if the font is to be embedded in the PDF
+ * @param size the size of this font
+ * @param style the style of this font
+ * @return the Font constructed based on the parameters
+ */
+
+ public Font getFont(String fontname, String encoding, boolean embedded, float size, int style) {
+ return getFont(fontname, encoding, embedded, size, style, null);
+ }
+
+/**
+ * Constructs a <CODE>Font</CODE>-object.
+ *
+ * @param fontname the name of the font
+ * @param encoding the encoding of the font
+ * @param embedded true if the font is to be embedded in the PDF
+ * @param size the size of this font
+ * @return the Font constructed based on the parameters
+ */
+
+ public Font getFont(String fontname, String encoding, boolean embedded, float size) {
+ return getFont(fontname, encoding, embedded, size, Font.UNDEFINED, null);
+ }
+
+/**
+ * Constructs a <CODE>Font</CODE>-object.
+ *
+ * @param fontname the name of the font
+ * @param encoding the encoding of the font
+ * @param embedded true if the font is to be embedded in the PDF
+ * @return the Font constructed based on the parameters
+ */
+
+ public Font getFont(String fontname, String encoding, boolean embedded) {
+ return getFont(fontname, encoding, embedded, Font.UNDEFINED, Font.UNDEFINED, null);
+ }
+
+/**
+ * Constructs a <CODE>Font</CODE>-object.
+ *
+ * @param fontname the name of the font
+ * @param encoding the encoding of the font
+ * @param size the size of this font
+ * @param style the style of this font
+ * @param color the <CODE>Color</CODE> of this font.
+ * @return the Font constructed based on the parameters
+ */
+
+ public Font getFont(String fontname, String encoding, float size, int style, Color color) {
+ return getFont(fontname, encoding, defaultEmbedding, size, style, color);
+ }
+
+/**
+ * Constructs a <CODE>Font</CODE>-object.
+ *
+ * @param fontname the name of the font
+ * @param encoding the encoding of the font
+ * @param size the size of this font
+ * @param style the style of this font
+ * @return the Font constructed based on the parameters
+ */
+
+ public Font getFont(String fontname, String encoding, float size, int style) {
+ return getFont(fontname, encoding, defaultEmbedding, size, style, null);
+ }
+
+/**
+ * Constructs a <CODE>Font</CODE>-object.
+ *
+ * @param fontname the name of the font
+ * @param encoding the encoding of the font
+ * @param size the size of this font
+ * @return the Font constructed based on the parameters
+ */
+
+ public Font getFont(String fontname, String encoding, float size) {
+ return getFont(fontname, encoding, defaultEmbedding, size, Font.UNDEFINED, null);
+ }
+
+/**
+ * Constructs a <CODE>Font</CODE>-object.
+ *
+ * @param fontname the name of the font
+ * @param encoding the encoding of the font
+ * @return the Font constructed based on the parameters
+ */
+
+ public Font getFont(String fontname, String encoding) {
+ return getFont(fontname, encoding, defaultEmbedding, Font.UNDEFINED, Font.UNDEFINED, null);
+ }
+
+/**
+ * Constructs a <CODE>Font</CODE>-object.
+ *
+ * @param fontname the name of the font
+ * @param size the size of this font
+ * @param style the style of this font
+ * @param color the <CODE>Color</CODE> of this font.
+ * @return the Font constructed based on the parameters
+ */
+
+ public Font getFont(String fontname, float size, int style, Color color) {
+ return getFont(fontname, defaultEncoding, defaultEmbedding, size, style, color);
+ }
+
+/**
+ * Constructs a <CODE>Font</CODE>-object.
+ *
+ * @param fontname the name of the font
+ * @param size the size of this font
+ * @param style the style of this font
+ * @return the Font constructed based on the parameters
+ */
+
+ public Font getFont(String fontname, float size, int style) {
+ return getFont(fontname, defaultEncoding, defaultEmbedding, size, style, null);
+ }
+
+/**
+ * Constructs a <CODE>Font</CODE>-object.
+ *
+ * @param fontname the name of the font
+ * @param size the size of this font
+ * @return the Font constructed based on the parameters
+ */
+
+ public Font getFont(String fontname, float size) {
+ return getFont(fontname, defaultEncoding, defaultEmbedding, size, Font.UNDEFINED, null);
+ }
+
+/**
+ * Constructs a <CODE>Font</CODE>-object.
+ *
+ * @param fontname the name of the font
+ * @return the Font constructed based on the parameters
+ */
+
+ public Font getFont(String fontname) {
+ return getFont(fontname, defaultEncoding, defaultEmbedding, Font.UNDEFINED, Font.UNDEFINED, null);
+ }
+
+ /**
+ * Register a font by giving explicitly the font family and name.
+ * @param familyName the font family
+ * @param fullName the font name
+ * @param path the font path
+ */
+ public void registerFamily(String familyName, String fullName, String path) {
+ if (path != null)
+ trueTypeFonts.setProperty(fullName, path);
+ ArrayList tmp = (ArrayList) fontFamilies.get(familyName);
+ if (tmp == null) {
+ tmp = new ArrayList();
+ tmp.add(fullName);
+ fontFamilies.put(familyName, tmp);
+ }
+ else {
+ int fullNameLength = fullName.length();
+ boolean inserted = false;
+ for (int j = 0; j < tmp.size(); ++j) {
+ if (((String)tmp.get(j)).length() >= fullNameLength) {
+ tmp.add(j, fullName);
+ inserted = true;
+ break;
+ }
+ }
+ if (!inserted)
+ tmp.add(fullName);
+ }
+ }
+
+/**
+ * Register a ttf- or a ttc-file.
+ *
+ * @param path the path to a ttf- or ttc-file
+ */
+
+ public void register(String path) {
+ register(path, null);
+ }
+
+/**
+ * Register a font file and use an alias for the font contained in it.
+ *
+ * @param path the path to a font file
+ * @param alias the alias you want to use for the font
+ */
+
+ public void register(String path, String alias) {
+ try {
+ if (path.toLowerCase().endsWith(".ttf") || path.toLowerCase().endsWith(".otf") || path.toLowerCase().indexOf(".ttc,") > 0) {
+ Object allNames[] = BaseFont.getAllFontNames(path, BaseFont.WINANSI, null);
+ trueTypeFonts.setProperty(((String)allNames[0]).toLowerCase(), path);
+ if (alias != null) {
+ trueTypeFonts.setProperty(alias.toLowerCase(), path);
+ }
+ // register all the font names with all the locales
+ String[][] names = (String[][])allNames[2]; //full name
+ for (int i = 0; i < names.length; i++) {
+ trueTypeFonts.setProperty(names[i][3].toLowerCase(), path);
+ }
+ String fullName = null;
+ String familyName = null;
+ names = (String[][])allNames[1]; //family name
+ for (int k = 0; k < TTFamilyOrder.length; k += 3) {
+ for (int i = 0; i < names.length; i++) {
+ if (TTFamilyOrder[k].equals(names[i][0]) && TTFamilyOrder[k + 1].equals(names[i][1]) && TTFamilyOrder[k + 2].equals(names[i][2])) {
+ familyName = names[i][3].toLowerCase();
+ k = TTFamilyOrder.length;
+ break;
+ }
+ }
+ }
+ if (familyName != null) {
+ String lastName = "";
+ names = (String[][])allNames[2]; //full name
+ for (int i = 0; i < names.length; i++) {
+ for (int k = 0; k < TTFamilyOrder.length; k += 3) {
+ if (TTFamilyOrder[k].equals(names[i][0]) && TTFamilyOrder[k + 1].equals(names[i][1]) && TTFamilyOrder[k + 2].equals(names[i][2])) {
+ fullName = names[i][3];
+ if (fullName.equals(lastName))
+ continue;
+ lastName = fullName;
+ registerFamily(familyName, fullName, null);
+ break;
+ }
+ }
+ }
+ }
+ }
+ else if (path.toLowerCase().endsWith(".ttc")) {
+ if (alias != null)
+ System.err.println("class FontFactory: You can't define an alias for a true type collection.");
+ String[] names = BaseFont.enumerateTTCNames(path);
+ for (int i = 0; i < names.length; i++) {
+ register(path + "," + i);
+ }
+ }
+ else if (path.toLowerCase().endsWith(".afm") || path.toLowerCase().endsWith(".pfm")) {
+ BaseFont bf = BaseFont.createFont(path, BaseFont.CP1252, false);
+ String fullName = (bf.getFullFontName()[0][3]).toLowerCase();
+ String familyName = (bf.getFamilyFontName()[0][3]).toLowerCase();
+ String psName = bf.getPostscriptFontName().toLowerCase();
+ registerFamily(familyName, fullName, null);
+ trueTypeFonts.setProperty(psName, path);
+ trueTypeFonts.setProperty(fullName, path);
+ }
+ }
+ catch(DocumentException de) {
+ // this shouldn't happen
+ throw new ExceptionConverter(de);
+ }
+ catch(IOException ioe) {
+ throw new ExceptionConverter(ioe);
+ }
+ }
+
+ /** Register all the fonts in a directory.
+ * @param dir the directory
+ * @return the number of fonts registered
+ */
+ public int registerDirectory(String dir) {
+ int count = 0;
+ try {
+ File file = new File(dir);
+ if (!file.exists() || !file.isDirectory())
+ return 0;
+ String files[] = file.list();
+ if (files == null)
+ return 0;
+ for (int k = 0; k < files.length; ++k) {
+ try {
+ file = new File(dir, files[k]);
+ String name = file.getPath().toLowerCase();
+ if (name.endsWith(".ttf") || name.endsWith(".otf") || name.endsWith(".afm") || name.endsWith(".pfm") || name.endsWith(".ttc")) {
+ register(file.getPath(), null);
+ ++count;
+ }
+ }
+ catch (Exception e) {
+ //empty on purpose
+ }
+ }
+ }
+ catch (Exception e) {
+ //empty on purpose
+ }
+ return count;
+ }
+
+ /** Register fonts in some probable directories. It usually works in Windows,
+ * Linux and Solaris.
+ * @return the number of fonts registered
+ */
+ public int registerDirectories() {
+ int count = 0;
+ count += registerDirectory("c:/windows/fonts");
+ count += registerDirectory("c:/winnt/fonts");
+ count += registerDirectory("d:/windows/fonts");
+ count += registerDirectory("d:/winnt/fonts");
+ count += registerDirectory("/usr/X/lib/X11/fonts/TrueType");
+ count += registerDirectory("/usr/openwin/lib/X11/fonts/TrueType");
+ count += registerDirectory("/usr/share/fonts/default/TrueType");
+ count += registerDirectory("/usr/X11R6/lib/X11/fonts/ttf");
+ count += registerDirectory("/Library/Fonts");
+ count += registerDirectory("/System/LIbrary/Fonts");
+ return count;
+ }
+
+/**
+ * Gets a set of registered fontnames.
+ * @return a set of registered fonts
+ */
+
+ public Set getRegisteredFonts() {
+ return Chunk.getKeySet(trueTypeFonts);
+ }
+
+/**
+ * Gets a set of registered fontnames.
+ * @return a set of registered font families
+ */
+
+ public Set getRegisteredFamilies() {
+ return Chunk.getKeySet(fontFamilies);
+ }
+
+/**
+ * Checks if a certain font is registered.
+ *
+ * @param fontname the name of the font that has to be checked.
+ * @return true if the font is found
+ */
+ public boolean isRegistered(String fontname) {
+ return trueTypeFonts.containsKey(fontname.toLowerCase());
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/Graphic.java b/src/main/java/com/lowagie/text/Graphic.java
new file mode 100644
index 0000000..5d65c42
--- /dev/null
+++ b/src/main/java/com/lowagie/text/Graphic.java
@@ -0,0 +1,277 @@
+/*
+ * $Id: Graphic.java,v 1.57 2004/12/14 12:33:47 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text;
+
+import java.awt.Color;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.HashMap;
+
+import com.lowagie.text.pdf.PdfContentByte;
+
+/**
+ * A <CODE>Graphic</CODE> element can contain several geometric figures (curves, lines,...).
+ * <P>
+ * If you want to use this <CODE>Element</CODE>, please read the Sections 8.4 and 8.5 of
+ * the PDF Reference Manual version 1.3 first.
+ *
+ * @see Element
+ */
+
+public class Graphic extends PdfContentByte implements Element {
+
+/** This is a type of Graphic. */
+ public static final String HORIZONTAL_LINE = "HORIZONTAL";
+
+/** This is a type of Graphic. */
+ public static final String BORDER = "BORDER";
+
+/** Contains some of the attributes for this Graphic. */
+ private HashMap attributes;
+
+ // constructor
+
+/**
+ * Constructs a <CODE>Graphic</CODE>-object.
+ */
+
+ public Graphic() {
+ super(null);
+ }
+
+ // implementation of the Element interface
+
+/**
+ * Processes the element by adding it (or the different parts) to an
+ * <CODE>ElementListener</CODE>.
+ *
+ * @param listener an <CODE>ElementListener</CODE>
+ * <CODE>true</CODE> if the element was processed successfully
+ * @return true if processing this object succeeded
+ */
+
+ public boolean process(ElementListener listener) {
+ try {
+ return listener.add(this);
+ }
+ catch(DocumentException de) {
+ return false;
+ }
+ }
+
+/**
+ * Gets the type of the text element.
+ *
+ * @return a type
+ */
+
+ public int type() {
+ return Element.GRAPHIC;
+ }
+
+/**
+ * Gets all the chunks in this element.
+ *
+ * @return an <CODE>ArrayList</CODE>
+ */
+
+ public ArrayList getChunks() {
+ return new ArrayList();
+ }
+
+ /**
+ * Orders this graphic to draw a horizontal, centered line.
+ * @param linewidth the line width
+ * @param percentage the percentage horizontal width in relation to the margins or if negative, an absolute value
+ */
+
+ public void setHorizontalLine(float linewidth, float percentage) {
+ if (attributes == null) attributes = new HashMap();
+ attributes.put(HORIZONTAL_LINE, new Object[]{new Float(linewidth), new Float(percentage), Color.black, new Integer(Element.ALIGN_CENTER)});
+ }
+
+ /**
+ * Orders this graphic to draw a horizontal line with some alignment.
+ * @param linewidth the line width
+ * @param percentage the percentage horizontal width in relation to the margins or if negative, an absolute value
+ * @param align the line alignment
+ */
+ public void setHorizontalLine(float linewidth, float percentage, int align) {
+ if (attributes == null) attributes = new HashMap();
+ attributes.put(HORIZONTAL_LINE, new Object[]{new Float(linewidth), new Float(percentage), Color.black, new Integer(align)});
+ }
+
+ /**
+ * Orders this graphic to draw a horizontal, centered line.
+ * @param linewidth the line width
+ * @param percentage the percentage horizontal width in relation to the margins or if negative, an absolute value
+ * @param color the color of the line
+ */
+
+ public void setHorizontalLine(float linewidth, float percentage, Color color) {
+ if (attributes == null) attributes = new HashMap();
+ attributes.put(HORIZONTAL_LINE, new Object[]{new Float(linewidth), new Float(percentage), color, new Integer(Element.ALIGN_CENTER)});
+ }
+
+ /**
+ * Orders this graphic to draw a horizontal, centered line.
+ * @param linewidth the line width
+ * @param percentage the percentage horizontal width in relation to the margins or if negative, an absolute value
+ * @param color the color of the line
+ * @param align the line alignment
+ */
+ public void setHorizontalLine(float linewidth, float percentage, Color color, int align) {
+ if (attributes == null) attributes = new HashMap();
+ attributes.put(HORIZONTAL_LINE, new Object[]{new Float(linewidth), new Float(percentage), color, new Integer(align)});
+ }
+
+/**
+ * draws a horizontal line.
+ * @param lineWidth width of the line
+ * @param color color of the line
+ * @param x1 start position of the line
+ * @param x2 end position of the line
+ * @param y y-coordinate of the line
+ */
+
+ public void drawHorizontalLine(float lineWidth, Color color, float x1, float x2, float y) {
+ setLineWidth(lineWidth);
+ setColorStroke(color);
+ moveTo(x1, y);
+ lineTo(x2, y);
+ stroke();
+ resetRGBColorStroke();
+ }
+
+/**
+ * Orders this graphic to draw a horizontal line.
+ * @param linewidth linewidth of the border
+ * @param extraSpace extraspace needed as marging on the page
+ */
+
+ public void setBorder(float linewidth, float extraSpace) {
+ if (attributes == null) attributes = new HashMap();
+ attributes.put(BORDER, new Object[]{new Float(linewidth), new Float(extraSpace), new Color(0, 0, 0)});
+ }
+
+/**
+ * Orders this graphic to draw a horizontal line.
+ * @param linewidth linewidth of the border
+ * @param extraSpace extraspace needed as marging on the page
+ * @param color color of the borderbox
+ */
+
+ public void setBorder(float linewidth, float extraSpace, Color color) {
+ if (attributes == null) attributes = new HashMap();
+ attributes.put(BORDER, new Object[]{new Float(linewidth), new Float(extraSpace), color});
+ }
+
+/**
+ * Draws a border
+ * @param lineWidth linewidth of the border
+ * @param color color of the borderbox
+ * @param llx lower left x coordinate
+ * @param lly lower left y coordinate
+ * @param urx upper right x coordinate
+ * @param ury upper right y coordinate
+ */
+ public void drawBorder(float lineWidth, Color color, float llx, float lly, float urx, float ury) {
+ setLineWidth(lineWidth);
+ setColorStroke(color);
+ rectangle(llx, lly, urx - llx, ury - lly);
+ stroke();
+ resetRGBColorStroke();
+ }
+
+/**
+ * Processes the attributes of this object.
+ * @param llx lower left x coordinate
+ * @param lly lower left y coordinate
+ * @param urx upper right x coordinate
+ * @param ury upper right y coordinate
+ * @param y
+ */
+
+ public void processAttributes(float llx, float lly, float urx, float ury, float y) {
+ if (attributes == null) return;
+ String attribute;
+ Object[] o;
+ for (Iterator i = attributes.keySet().iterator(); i.hasNext(); ) {
+ attribute = (String) i.next();
+ o = (Object[]) attributes.get(attribute);
+ if (HORIZONTAL_LINE.equals(attribute)) {
+ float p = ((Float)o[1]).floatValue();
+ float w;
+ if (p < 0)
+ w = -p;
+ else
+ w = (urx - llx) * p / 100.0f;
+ int align = ((Integer)o[3]).intValue();
+ float s;
+ switch (align) {
+ case Element.ALIGN_LEFT:
+ s = 0;
+ break;
+ case Element.ALIGN_RIGHT:
+ s = urx - llx - w;
+ break;
+ default:
+ s = (urx - llx - w) / 2;
+ }
+ drawHorizontalLine(((Float)o[0]).floatValue(), (Color)o[2], s + llx, s + w + llx, y);
+ }
+ if (BORDER.equals(attribute)) {
+ float extra = ((Float)o[1]).floatValue();
+ drawBorder(((Float)o[0]).floatValue(), (Color)o[2], llx - extra, lly - extra, urx + extra, ury + extra);
+ }
+ }
+ }
+}
diff --git a/src/main/java/com/lowagie/text/GreekList.java b/src/main/java/com/lowagie/text/GreekList.java
new file mode 100644
index 0000000..5cebe91
--- /dev/null
+++ b/src/main/java/com/lowagie/text/GreekList.java
@@ -0,0 +1,141 @@
+/*
+ * Copyright 2003 by Michael Niedermair.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+package com.lowagie.text;
+
+/**
+ *
+ * A special-version of <CODE>LIST</CODE> whitch use greek-letters.
+ *
+ * @see com.lowagie.text.List
+ * @version 2003-06-22
+ * @author Michael Niedermair
+ */
+
+public class GreekList extends List {
+
+ /**
+ * UpperCase or LowerCase
+ */
+ protected boolean greeklower;
+
+ /**
+ * Initialisierung
+ *
+ * @param symbolIndent indent
+ */
+ public GreekList(int symbolIndent) {
+ super(true, symbolIndent);
+ setGreekFont();
+ }
+
+ /**
+ * Initialisierung
+ * @param greeklower greek-char in lowercase
+ * @param symbolIndent indent
+ */
+ public GreekList(boolean greeklower, int symbolIndent) {
+ super(true, symbolIndent);
+ this.greeklower = greeklower;
+ setGreekFont();
+ }
+
+ /**
+ * change the font to SYMBOL
+ */
+ protected void setGreekFont() {
+ float fontsize = symbol.font().size();
+ symbol.setFont(FontFactory.getFont(FontFactory.SYMBOL, fontsize, Font.NORMAL));
+ }
+
+ /**
+ * set the greek-letters to lowercase otherwise to uppercase
+ *
+ * @param greeklower
+ */
+ public void setGreekLower(boolean greeklower) {
+ this.greeklower = greeklower;
+ }
+
+ /**
+ * Checks if the list is greek-letter with lowercase
+ *
+ * @return <CODE>true</CODE> if the greek-letter is lowercase, <CODE>false</CODE> otherwise.
+ */
+ public boolean isGreekLower() {
+ return greeklower;
+ }
+
+ /**
+ * Adds an <CODE>Object</CODE> to the <CODE>List</CODE>.
+ *
+ * @param o the object to add.
+ * @return true if adding the object succeeded
+ */
+ public boolean add(Object o) {
+ if (o instanceof ListItem) {
+ ListItem item = (ListItem) o;
+ Chunk chunk;
+ if (greeklower)
+ chunk = SpecialSymbol.get((char) (first + list.size() + 944), symbol.font());
+ else
+ chunk = SpecialSymbol.get((char) (first + list.size() + 912), symbol.font());
+ chunk.append(".");
+ item.setListSymbol(chunk);
+ item.setIndentationLeft(symbolIndent);
+ item.setIndentationRight(0);
+ list.add(item);
+ } else if (o instanceof List) {
+ List nested = (List) o;
+ nested.setIndentationLeft(nested.indentationLeft() + symbolIndent);
+ first--;
+ return list.add(nested);
+ } else if (o instanceof String) {
+ return this.add(new ListItem((String) o));
+ }
+ return false;
+ }
+}
diff --git a/src/main/java/com/lowagie/text/Header.java b/src/main/java/com/lowagie/text/Header.java
new file mode 100644
index 0000000..6ccea55
--- /dev/null
+++ b/src/main/java/com/lowagie/text/Header.java
@@ -0,0 +1,98 @@
+/*
+ * $Id: Header.java,v 1.61 2005/05/04 14:31:10 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text;
+
+/**
+ * This is an <CODE>Element</CODE> that contains
+ * some userdefined meta information about the document.
+ * <P>
+ * <B>Example:</B>
+ * <BLOCKQUOTE><PRE>
+ * <STRONG>Header header = new Header("inspired by", "William Shakespeare");</STRONG>
+ * </PRE></BLOCKQUOTE>
+ *
+ * @see Element
+ * @see Meta
+ */
+
+public class Header extends Meta implements Element {
+
+ // membervariables
+
+/** This is the content of this chunk of text. */
+ private StringBuffer name;
+
+ // constructors
+
+/**
+ * Constructs a <CODE>Meta</CODE>.
+ *
+ * @param name the name of the meta-information
+ * @param content the content
+ */
+
+ public Header(String name, String content) {
+ super(Element.HEADER, content);
+ this.name = new StringBuffer(name);
+ }
+
+ // methods to retrieve information
+
+/**
+ * Returns the name of the meta information.
+ *
+ * @return a <CODE>String</CODE>
+ */
+
+ public String name() {
+ return name.toString();
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/HeaderFooter.java b/src/main/java/com/lowagie/text/HeaderFooter.java
new file mode 100644
index 0000000..4e4182a
--- /dev/null
+++ b/src/main/java/com/lowagie/text/HeaderFooter.java
@@ -0,0 +1,206 @@
+/*
+ * $Id: HeaderFooter.java,v 1.68 2005/05/04 14:31:18 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text;
+
+import com.lowagie.text.Paragraph;
+import com.lowagie.text.Phrase;
+
+/**
+ * A <CODE>HeaderFooter</CODE>-object is a <CODE>Rectangle</CODe> with text
+ * that can be put above and/or below every page.
+ * <P>
+ * Example:
+ * <BLOCKQUOTE><PRE>
+ * <STRONG>HeaderFooter header = new HeaderFooter(new Phrase("This is a header."), false);</STRONG>
+ * <STRONG>HeaderFooter footer = new HeaderFooter(new Phrase("This is page "), new Phrase("."));</STRONG>
+ * document.setHeader(header);
+ * document.setFooter(footer);
+ * </PRE></BLOCKQUOTE>
+ */
+
+public class HeaderFooter extends Rectangle implements MarkupAttributes {
+
+ // membervariables
+
+/** Does the page contain a pagenumber? */
+ private boolean numbered;
+
+/** This is the <CODE>Phrase</CODE> that comes before the pagenumber. */
+ private Phrase before = null;
+
+/** This is number of the page. */
+ private int pageN;
+
+/** This is the <CODE>Phrase</CODE> that comes after the pagenumber. */
+ private Phrase after = null;
+
+/** This is alignment of the header/footer. */
+ private int alignment;
+
+ // constructors
+
+/**
+ * Constructs a <CODE>HeaderFooter</CODE>-object.
+ *
+ * @param before the <CODE>Phrase</CODE> before the pagenumber
+ * @param after the <CODE>Phrase</CODE> before the pagenumber
+ */
+
+ public HeaderFooter(Phrase before, Phrase after) {
+ super(0, 0, 0, 0);
+ setBorder(TOP + BOTTOM);
+ setBorderWidth(1);
+
+ numbered = true;
+ this.before = before;
+ this.after = after;
+ }
+
+/**
+ * Constructs a <CODE>Header</CODE>-object with a pagenumber at the end.
+ *
+ * @param before the <CODE>Phrase</CODE> before the pagenumber
+ * @param numbered <CODE>true</CODE> if the page has to be numbered
+ */
+
+ public HeaderFooter(Phrase before, boolean numbered) {
+ super(0, 0, 0, 0);
+ setBorder(TOP + BOTTOM);
+ setBorderWidth(1);
+
+ this.numbered = numbered;
+ this.before = before;
+ }
+
+ // methods
+
+/**
+ * Checks if the HeaderFooter contains a page number.
+ *
+ * @return true if the page has to be numbered
+ */
+
+ public boolean isNumbered() {
+ return numbered;
+ }
+
+/**
+ * Gets the part that comes before the pageNumber.
+ *
+ * @return a Phrase
+ */
+
+ public Phrase getBefore() {
+ return before;
+ }
+
+/**
+ * Gets the part that comes after the pageNumber.
+ *
+ * @return a Phrase
+ */
+
+ public Phrase getAfter() {
+ return after;
+ }
+
+/**
+ * Sets the page number.
+ *
+ * @param pageN the new page number
+ */
+
+ public void setPageNumber(int pageN) {
+ this.pageN = pageN;
+ }
+
+/**
+ * Sets the alignment.
+ *
+ * @param alignment the new alignment
+ */
+
+ public void setAlignment(int alignment) {
+ this.alignment = alignment;
+ }
+
+ // methods to retrieve the membervariables
+
+/**
+ * Gets the <CODE>Paragraph</CODE> that can be used as header or footer.
+ *
+ * @return a <CODE>Paragraph</CODE>
+ */
+
+ public Paragraph paragraph() {
+ Paragraph paragraph = new Paragraph(before.leading());
+ paragraph.add(before);
+ if (numbered) {
+ paragraph.addSpecial(new Chunk(String.valueOf(pageN), before.font()));
+ }
+ if (after != null) {
+ paragraph.addSpecial(after);
+ }
+ paragraph.setAlignment(alignment);
+ return paragraph;
+ }
+
+ /**
+ * Gets the alignment of this HeaderFooter.
+ *
+ * @return alignment
+ */
+
+ public int alignment() {
+ return alignment;
+ }
+
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/Image.java b/src/main/java/com/lowagie/text/Image.java
new file mode 100644
index 0000000..788e7ed
--- /dev/null
+++ b/src/main/java/com/lowagie/text/Image.java
@@ -0,0 +1,2134 @@
+/*
+ * $Id: Image.java,v 1.115 2006/02/16 16:17:59 psoares33 Exp $
+ * $Name: $
+ *
+ * Copyright 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text;
+
+import java.awt.Graphics2D;
+import java.awt.color.ICC_Profile;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.lang.reflect.Constructor;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Properties;
+import java.util.Set;
+
+import com.lowagie.text.pdf.PRIndirectReference;
+import com.lowagie.text.pdf.PRTokeniser;
+import com.lowagie.text.pdf.PdfArray;
+import com.lowagie.text.pdf.PdfContentByte;
+import com.lowagie.text.pdf.PdfDictionary;
+import com.lowagie.text.pdf.PdfIndirectReference;
+import com.lowagie.text.pdf.PdfName;
+import com.lowagie.text.pdf.PdfNumber;
+import com.lowagie.text.pdf.PdfOCG;
+import com.lowagie.text.pdf.PdfObject;
+import com.lowagie.text.pdf.PdfReader;
+import com.lowagie.text.pdf.PdfTemplate;
+import com.lowagie.text.pdf.PdfWriter;
+import com.lowagie.text.pdf.RandomAccessFileOrArray;
+import com.lowagie.text.pdf.codec.BmpImage;
+import com.lowagie.text.pdf.codec.CCITTG4Encoder;
+import com.lowagie.text.pdf.codec.GifImage;
+import com.lowagie.text.pdf.codec.PngImage;
+import com.lowagie.text.pdf.codec.TiffImage;
+
+/**
+ * An <CODE>Image</CODE> is the representation of a graphic element (JPEG, PNG
+ * or GIF) that has to be inserted into the document
+ *
+ * @see Element
+ * @see Rectangle
+ */
+
+public abstract class Image extends Rectangle implements Element,
+ MarkupAttributes {
+
+ // static membervariables
+
+ /** this is a kind of image alignment. */
+ public static final int DEFAULT = 0;
+
+ /** this is a kind of image alignment. */
+ public static final int RIGHT = 2;
+
+ /** this is a kind of image alignment. */
+ public static final int LEFT = 0;
+
+ /** this is a kind of image alignment. */
+ public static final int MIDDLE = 1;
+
+ /** this is a kind of image alignment. */
+ public static final int TEXTWRAP = 4;
+
+ /** this is a kind of image alignment. */
+ public static final int UNDERLYING = 8;
+
+ /** This represents a coordinate in the transformation matrix. */
+ public static final int AX = 0;
+
+ /** This represents a coordinate in the transformation matrix. */
+ public static final int AY = 1;
+
+ /** This represents a coordinate in the transformation matrix. */
+ public static final int BX = 2;
+
+ /** This represents a coordinate in the transformation matrix. */
+ public static final int BY = 3;
+
+ /** This represents a coordinate in the transformation matrix. */
+ public static final int CX = 4;
+
+ /** This represents a coordinate in the transformation matrix. */
+ public static final int CY = 5;
+
+ /** This represents a coordinate in the transformation matrix. */
+ public static final int DX = 6;
+
+ /** This represents a coordinate in the transformation matrix. */
+ public static final int DY = 7;
+
+ /** type of image */
+ public static final int ORIGINAL_NONE = 0;
+
+ /** type of image */
+ public static final int ORIGINAL_JPEG = 1;
+
+ /** type of image */
+ public static final int ORIGINAL_PNG = 2;
+
+ /** type of image */
+ public static final int ORIGINAL_GIF = 3;
+
+ /** type of image */
+ public static final int ORIGINAL_BMP = 4;
+
+ /** type of image */
+ public static final int ORIGINAL_TIFF = 5;
+
+ /** type of image */
+ public static final int ORIGINAL_WMF = 6;
+
+ /** type of image */
+ public static final int ORIGINAL_PS = 7;
+
+ /** Image color inversion */
+ protected boolean invert = false;
+
+ /** The imagetype. */
+ protected int type;
+
+ /** The URL of the image. */
+ protected URL url;
+
+ /** The raw data of the image. */
+ protected byte rawData[];
+
+ /** The template to be treated as an image. */
+ protected PdfTemplate template[] = new PdfTemplate[1];
+
+ /** The alignment of the Image. */
+ protected int alignment;
+
+ /** Text that can be shown instead of the image. */
+ protected String alt;
+
+ /** This is the absolute X-position of the image. */
+ protected float absoluteX = Float.NaN;
+
+ /** This is the absolute Y-position of the image. */
+ protected float absoluteY = Float.NaN;
+
+ /** This is the width of the image without rotation. */
+ protected float plainWidth;
+
+ /** This is the width of the image without rotation. */
+ protected float plainHeight;
+
+ /** This is the scaled width of the image taking rotation into account. */
+ protected float scaledWidth;
+
+ /** This is the original height of the image taking rotation into account. */
+ protected float scaledHeight;
+
+ /** This is the rotation of the image. */
+ protected float rotation;
+
+ /** this is the colorspace of a jpeg-image. */
+ protected int colorspace = -1;
+
+ /**
+ * this is the bits per component of the raw image. It also flags a CCITT
+ * image.
+ */
+ protected int bpc = 1;
+
+ /** this is the transparency information of the raw image */
+ protected int transparency[];
+
+ // for the moment these variables are only used for Images in class Table
+ // code contributed by Pelikan Stephan
+ /** the indentation to the left. */
+ protected float indentationLeft = 0;
+
+ /** the indentation to the right. */
+ protected float indentationRight = 0;
+
+ // serial stamping
+
+ protected Long mySerialId = getSerialId();
+
+ static long serialId = 0;
+
+ /** Holds value of property dpiX. */
+ protected int dpiX = 0;
+
+ /** Holds value of property dpiY. */
+ protected int dpiY = 0;
+
+ protected boolean mask = false;
+
+ protected Image imageMask;
+
+ /** Holds value of property interpolation. */
+ protected boolean interpolation;
+
+ /** if the annotation is not null the image will be clickable. */
+ protected Annotation annotation = null;
+
+ /** Contains extra markupAttributes */
+ protected Properties markupAttributes;
+
+ /** ICC Profile attached */
+ protected ICC_Profile profile = null;
+
+ /** Holds value of property deflated. */
+ protected boolean deflated = false;
+
+ private PdfDictionary additional = null;
+
+ /** Holds value of property smask. */
+ private boolean smask;
+
+ /** Holds value of property XYRatio. */
+ private float XYRatio = 0;
+
+ /** Holds value of property originalType. */
+ protected int originalType = ORIGINAL_NONE;
+
+ /** Holds value of property originalData. */
+ protected byte[] originalData;
+
+ /** The spacing before the image. */
+ protected float spacingBefore;
+
+ /** The spacing after the image. */
+ protected float spacingAfter;
+
+ /**
+ * Holds value of property widthPercentage.
+ */
+ private float widthPercentage = 100;
+
+ protected PdfOCG layer;
+
+ /**
+ * Holds value of property initialRotation.
+ */
+ private float initialRotation;
+
+ // constructors
+
+ /**
+ * Constructs an <CODE>Image</CODE> -object, using an <VAR>url </VAR>.
+ *
+ * @param url
+ * the <CODE>URL</CODE> where the image can be found.
+ */
+
+ public Image(URL url) {
+ super(0, 0);
+ this.url = url;
+ this.alignment = DEFAULT;
+ rotation = 0;
+ }
+
+ /**
+ * Constructs an <CODE>Image</CODE> -object, using an <VAR>url </VAR>.
+ *
+ * @param image
+ * another Image object.
+ */
+
+ protected Image(Image image) {
+ super(image);
+ this.type = image.type;
+ this.url = image.url;
+ this.alignment = image.alignment;
+ this.alt = image.alt;
+ this.absoluteX = image.absoluteX;
+ this.absoluteY = image.absoluteY;
+ this.plainWidth = image.plainWidth;
+ this.plainHeight = image.plainHeight;
+ this.scaledWidth = image.scaledWidth;
+ this.scaledHeight = image.scaledHeight;
+ this.rotation = image.rotation;
+ this.colorspace = image.colorspace;
+ this.rawData = image.rawData;
+ this.template = image.template;
+ this.bpc = image.bpc;
+ this.transparency = image.transparency;
+ this.mySerialId = image.mySerialId;
+ this.invert = image.invert;
+ this.dpiX = image.dpiX;
+ this.dpiY = image.dpiY;
+ this.mask = image.mask;
+ this.imageMask = image.imageMask;
+ this.interpolation = image.interpolation;
+ this.annotation = image.annotation;
+ this.markupAttributes = image.markupAttributes;
+ this.profile = image.profile;
+ this.deflated = image.deflated;
+ this.additional = image.additional;
+ this.smask = image.smask;
+ this.XYRatio = image.XYRatio;
+ this.originalData = image.originalData;
+ this.originalType = image.originalType;
+ this.spacingAfter = image.spacingAfter;
+ this.spacingBefore = image.spacingBefore;
+ this.widthPercentage = image.widthPercentage;
+ this.layer = image.layer;
+ this.initialRotation = image.initialRotation;
+ this.directReference = image.directReference;
+ }
+
+ /**
+ * gets an instance of an Image
+ *
+ * @param image
+ * an Image object
+ * @return a new Image object
+ */
+
+ public static Image getInstance(Image image) {
+ if (image == null)
+ return null;
+ try {
+ Class cs = image.getClass();
+ Constructor constructor = cs
+ .getDeclaredConstructor(new Class[] { Image.class });
+ return (Image) constructor.newInstance(new Object[] { image });
+ } catch (Exception e) {
+ throw new ExceptionConverter(e);
+ }
+ }
+
+ /**
+ * Gets an instance of an Image.
+ *
+ * @param url
+ * an URL
+ * @return an Image
+ * @throws BadElementException
+ * @throws MalformedURLException
+ * @throws IOException
+ */
+
+ public static Image getInstance(URL url) throws BadElementException,
+ MalformedURLException, IOException {
+ InputStream is = null;
+ try {
+ is = url.openStream();
+ int c1 = is.read();
+ int c2 = is.read();
+ int c3 = is.read();
+ int c4 = is.read();
+ is.close();
+
+ is = null;
+ if (c1 == 'G' && c2 == 'I' && c3 == 'F') {
+ GifImage gif = new GifImage(url);
+ Image img = gif.getImage(1);
+ return img;
+ }
+ if (c1 == 0xFF && c2 == 0xD8) {
+ return new Jpeg(url);
+ }
+ if (c1 == PngImage.PNGID[0] && c2 == PngImage.PNGID[1]
+ && c3 == PngImage.PNGID[2] && c4 == PngImage.PNGID[3]) {
+ return PngImage.getImage(url);
+ }
+ if (c1 == '%' && c2 == '!' && c3 == 'P' && c4 == 'S') {
+ return new ImgPostscript(url);
+ }
+ if (c1 == 0xD7 && c2 == 0xCD) {
+ return new ImgWMF(url);
+ }
+ if (c1 == 'B' && c2 == 'M') {
+ return BmpImage.getImage(url);
+ }
+ if ((c1 == 'M' && c2 == 'M' && c3 == 0 && c4 == 42)
+ || (c1 == 'I' && c2 == 'I' && c3 == 42 && c4 == 0)) {
+ RandomAccessFileOrArray ra = null;
+ try {
+ if (url.getProtocol().equals("file")) {
+ String file = url.getFile();
+ file = unEscapeURL(file);
+ ra = new RandomAccessFileOrArray(file);
+ } else
+ ra = new RandomAccessFileOrArray(url);
+ Image img = TiffImage.getTiffImage(ra, 1);
+ img.url = url;
+ return img;
+ } finally {
+ if (ra != null)
+ ra.close();
+ }
+
+ }
+ throw new IOException(url.toString()
+ + " is not a recognized imageformat.");
+ } finally {
+ if (is != null) {
+ is.close();
+ }
+ }
+ }
+
+ /**
+ * gets an instance of an Image
+ *
+ * @param imgb
+ * raw image date
+ * @return an Image object
+ * @throws BadElementException
+ * @throws MalformedURLException
+ * @throws IOException
+ */
+ public static Image getInstance(byte imgb[]) throws BadElementException,
+ MalformedURLException, IOException {
+ InputStream is = null;
+ try {
+ is = new java.io.ByteArrayInputStream(imgb);
+ int c1 = is.read();
+ int c2 = is.read();
+ int c3 = is.read();
+ int c4 = is.read();
+ is.close();
+
+ is = null;
+ if (c1 == 'G' && c2 == 'I' && c3 == 'F') {
+ GifImage gif = new GifImage(imgb);
+ return gif.getImage(1);
+ }
+ if (c1 == 0xFF && c2 == 0xD8) {
+ return new Jpeg(imgb);
+ }
+ if (c1 == PngImage.PNGID[0] && c2 == PngImage.PNGID[1]
+ && c3 == PngImage.PNGID[2] && c4 == PngImage.PNGID[3]) {
+ return PngImage.getImage(imgb);
+ }
+ if (c1 == '%' && c2 == '!' && c3 == 'P' && c4 == 'S') {
+ return new ImgPostscript(imgb);
+ }
+ if (c1 == 0xD7 && c2 == 0xCD) {
+ return new ImgWMF(imgb);
+ }
+ if (c1 == 'B' && c2 == 'M') {
+ return BmpImage.getImage(imgb);
+ }
+ if ((c1 == 'M' && c2 == 'M' && c3 == 0 && c4 == 42)
+ || (c1 == 'I' && c2 == 'I' && c3 == 42 && c4 == 0)) {
+ RandomAccessFileOrArray ra = null;
+ try {
+ ra = new RandomAccessFileOrArray(imgb);
+ Image img = TiffImage.getTiffImage(ra, 1);
+ if (img.getOriginalData() == null)
+ img.setOriginalData(imgb);
+ return img;
+ } finally {
+ if (ra != null)
+ ra.close();
+ }
+
+ }
+ throw new IOException(
+ "The byte array is not a recognized imageformat.");
+ } finally {
+ if (is != null) {
+ is.close();
+ }
+ }
+ }
+
+ /**
+ * Gets an instance of an Image from a java.awt.Image.
+ *
+ * @param image
+ * the <CODE>java.awt.Image</CODE> to convert
+ * @param color
+ * if different from <CODE>null</CODE> the transparency pixels
+ * are replaced by this color
+ * @param forceBW
+ * if <CODE>true</CODE> the image is treated as black and white
+ * @return an object of type <CODE>ImgRaw</CODE>
+ * @throws BadElementException
+ * on error
+ * @throws IOException
+ * on error
+ */
+
+ public static Image getInstance(java.awt.Image image, java.awt.Color color,
+ boolean forceBW) throws BadElementException, IOException {
+ java.awt.image.PixelGrabber pg = new java.awt.image.PixelGrabber(image,
+ 0, 0, -1, -1, true);
+ try {
+ pg.grabPixels();
+ } catch (InterruptedException e) {
+ throw new IOException(
+ "java.awt.Image Interrupted waiting for pixels!");
+ }
+ if ((pg.getStatus() & java.awt.image.ImageObserver.ABORT) != 0) {
+ throw new IOException("java.awt.Image fetch aborted or errored");
+ }
+ int w = pg.getWidth();
+ int h = pg.getHeight();
+ int[] pixels = (int[]) pg.getPixels();
+ if (forceBW) {
+ int byteWidth = (w / 8) + ((w & 7) != 0 ? 1 : 0);
+ byte[] pixelsByte = new byte[byteWidth * h];
+
+ int index = 0;
+ int size = h * w;
+ int transColor = 1;
+ if (color != null) {
+ transColor = (color.getRed() + color.getGreen()
+ + color.getBlue() < 384) ? 0 : 1;
+ }
+ int transparency[] = null;
+ int cbyte = 0x80;
+ int wMarker = 0;
+ int currByte = 0;
+ if (color != null) {
+ for (int j = 0; j < size; j++) {
+ int alpha = (pixels[j] >> 24) & 0xff;
+ if (alpha < 250) {
+ if (transColor == 1)
+ currByte |= cbyte;
+ } else {
+ if ((pixels[j] & 0x888) != 0)
+ currByte |= cbyte;
+ }
+ cbyte >>= 1;
+ if (cbyte == 0 || wMarker + 1 >= w) {
+ pixelsByte[index++] = (byte) currByte;
+ cbyte = 0x80;
+ currByte = 0;
+ }
+ ++wMarker;
+ if (wMarker >= w)
+ wMarker = 0;
+ }
+ } else {
+ for (int j = 0; j < size; j++) {
+ if (transparency == null) {
+ int alpha = (pixels[j] >> 24) & 0xff;
+ if (alpha == 0) {
+ transparency = new int[2];
+ transparency[0] = transparency[1] = ((pixels[j] & 0x888) != 0) ? 1
+ : 0;
+ }
+ }
+ if ((pixels[j] & 0x888) != 0)
+ currByte |= cbyte;
+ cbyte >>= 1;
+ if (cbyte == 0 || wMarker + 1 >= w) {
+ pixelsByte[index++] = (byte) currByte;
+ cbyte = 0x80;
+ currByte = 0;
+ }
+ ++wMarker;
+ if (wMarker >= w)
+ wMarker = 0;
+ }
+ }
+ return Image.getInstance(w, h, 1, 1, pixelsByte, transparency);
+ } else {
+ byte[] pixelsByte = new byte[w * h * 3];
+ byte[] smask = null;
+
+ int index = 0;
+ int size = h * w;
+ int red = 255;
+ int green = 255;
+ int blue = 255;
+ if (color != null) {
+ red = color.getRed();
+ green = color.getGreen();
+ blue = color.getBlue();
+ }
+ int transparency[] = null;
+ if (color != null) {
+ for (int j = 0; j < size; j++) {
+ int alpha = (pixels[j] >> 24) & 0xff;
+ if (alpha < 250) {
+ pixelsByte[index++] = (byte) red;
+ pixelsByte[index++] = (byte) green;
+ pixelsByte[index++] = (byte) blue;
+ } else {
+ pixelsByte[index++] = (byte) ((pixels[j] >> 16) & 0xff);
+ pixelsByte[index++] = (byte) ((pixels[j] >> 8) & 0xff);
+ pixelsByte[index++] = (byte) ((pixels[j]) & 0xff);
+ }
+ }
+ } else {
+ int transparentPixel = 0;
+ smask = new byte[w * h];
+ boolean shades = false;
+ for (int j = 0; j < size; j++) {
+ byte alpha = smask[j] = (byte) ((pixels[j] >> 24) & 0xff);
+ /* bugfix by Chris Nokleberg */
+ if (!shades) {
+ if (alpha != 0 && alpha != -1) {
+ shades = true;
+ } else if (transparency == null) {
+ if (alpha == 0) {
+ transparentPixel = pixels[j] & 0xffffff;
+ transparency = new int[6];
+ transparency[0] = transparency[1] = (transparentPixel >> 16) & 0xff;
+ transparency[2] = transparency[3] = (transparentPixel >> 8) & 0xff;
+ transparency[4] = transparency[5] = transparentPixel & 0xff;
+ }
+ } else if ((pixels[j] & 0xffffff) != transparentPixel) {
+ shades = true;
+ }
+ }
+ pixelsByte[index++] = (byte) ((pixels[j] >> 16) & 0xff);
+ pixelsByte[index++] = (byte) ((pixels[j] >> 8) & 0xff);
+ pixelsByte[index++] = (byte) ((pixels[j]) & 0xff);
+ }
+ if (shades)
+ transparency = null;
+ else
+ smask = null;
+ }
+ Image img = Image.getInstance(w, h, 3, 8, pixelsByte, transparency);
+ if (smask != null) {
+ Image sm = Image.getInstance(w, h, 1, 8, smask);
+ try {
+ sm.makeMask();
+ img.setImageMask(sm);
+ } catch (DocumentException de) {
+ throw new ExceptionConverter(de);
+ }
+ }
+ return img;
+ }
+ }
+
+ /**
+ * Gets an instance of an Image from a java.awt.Image.
+ *
+ * @param image
+ * the <CODE>java.awt.Image</CODE> to convert
+ * @param color
+ * if different from <CODE>null</CODE> the transparency pixels
+ * are replaced by this color
+ * @return an object of type <CODE>ImgRaw</CODE>
+ * @throws BadElementException
+ * on error
+ * @throws IOException
+ * on error
+ */
+ public static Image getInstance(java.awt.Image image, java.awt.Color color)
+ throws BadElementException, IOException {
+ return Image.getInstance(image, color, false);
+ }
+
+ /**
+ * Gets an instance of a Image from a java.awt.Image.
+ * The image is added as a JPEG with a userdefined quality.
+ *
+ * @param writer
+ * the <CODE>PdfWriter</CODE> object to which the image will be added
+ * @param awtImage
+ * the <CODE>java.awt.Image</CODE> to convert
+ * @param quality
+ * a float value between 0 and 1
+ * @return an object of type <CODE>PdfTemplate</CODE>
+ * @throws BadElementException
+ * on error
+ * @throws IOException
+ */
+ public static Image getInstance(PdfWriter writer, java.awt.Image awtImage, float quality) throws BadElementException, IOException {
+ return getInstance(new PdfContentByte(writer), awtImage, quality);
+ }
+
+ /**
+ * Gets an instance of a Image from a java.awt.Image.
+ * The image is added as a JPEG with a userdefined quality.
+ *
+ * @param cb
+ * the <CODE>PdfContentByte</CODE> object to which the image will be added
+ * @param awtImage
+ * the <CODE>java.awt.Image</CODE> to convert
+ * @param quality
+ * a float value between 0 and 1
+ * @return an object of type <CODE>PdfTemplate</CODE>
+ * @throws BadElementException
+ * on error
+ * @throws IOException
+ */
+ public static Image getInstance(PdfContentByte cb, java.awt.Image awtImage, float quality) throws BadElementException, IOException {
+ java.awt.image.PixelGrabber pg = new java.awt.image.PixelGrabber(awtImage,
+ 0, 0, -1, -1, true);
+ try {
+ pg.grabPixels();
+ } catch (InterruptedException e) {
+ throw new IOException(
+ "java.awt.Image Interrupted waiting for pixels!");
+ }
+ if ((pg.getStatus() & java.awt.image.ImageObserver.ABORT) != 0) {
+ throw new IOException("java.awt.Image fetch aborted or errored");
+ }
+ int w = pg.getWidth();
+ int h = pg.getHeight();
+ PdfTemplate tp = cb.createTemplate(w, h);
+ Graphics2D g2d = tp.createGraphics(w, h, true, quality);
+ g2d.drawImage(awtImage, 0, 0, null);
+ g2d.dispose();
+ return getInstance(tp);
+ }
+
+ /**
+ * Gets an instance of an Image.
+ *
+ * @param filename
+ * a filename
+ * @return an object of type <CODE>Gif</CODE>,<CODE>Jpeg</CODE> or
+ * <CODE>Png</CODE>
+ * @throws BadElementException
+ * @throws MalformedURLException
+ * @throws IOException
+ */
+
+ public static Image getInstance(String filename)
+ throws BadElementException, MalformedURLException, IOException {
+ return getInstance(toURL(filename));
+ }
+
+ /**
+ * Gets an instance of an Image in raw mode.
+ *
+ * @param width
+ * the width of the image in pixels
+ * @param height
+ * the height of the image in pixels
+ * @param components
+ * 1,3 or 4 for GrayScale, RGB and CMYK
+ * @param data
+ * the image data
+ * @param bpc
+ * bits per component
+ * @return an object of type <CODE>ImgRaw</CODE>
+ * @throws BadElementException
+ * on error
+ */
+
+ public static Image getInstance(int width, int height, int components,
+ int bpc, byte data[]) throws BadElementException {
+ return Image.getInstance(width, height, components, bpc, data, null);
+ }
+
+ /**
+ * Reuses an existing image.
+ * @param ref the reference to the image dictionary
+ * @throws BadElementException on error
+ * @return the image
+ */
+ public static Image getInstance(PRIndirectReference ref) throws BadElementException {
+ PdfDictionary dic = (PdfDictionary)PdfReader.getPdfObjectRelease(ref);
+ int width = ((PdfNumber)PdfReader.getPdfObjectRelease(dic.get(PdfName.WIDTH))).intValue();
+ int height = ((PdfNumber)PdfReader.getPdfObjectRelease(dic.get(PdfName.HEIGHT))).intValue();
+ Image imask = null;
+ PdfObject obj = dic.get(PdfName.SMASK);
+ if (obj != null && obj.isIndirect()) {
+ imask = getInstance((PRIndirectReference)obj);
+ }
+ else {
+ obj = dic.get(PdfName.MASK);
+ if (obj != null && obj.isIndirect()) {
+ PdfObject obj2 = PdfReader.getPdfObjectRelease(obj);
+ if (obj2 instanceof PdfDictionary)
+ imask = getInstance((PRIndirectReference)obj);
+ }
+ }
+ Image img = new ImgRaw(width, height, 1, 1, null);
+ img.imageMask = imask;
+ img.directReference = ref;
+ return img;
+ }
+
+ /**
+ * gets an instance of an Image
+ *
+ * @param template
+ * a PdfTemplate that has to be wrapped in an Image object
+ * @return an Image object
+ * @throws BadElementException
+ */
+ public static Image getInstance(PdfTemplate template)
+ throws BadElementException {
+ return new ImgTemplate(template);
+ }
+
+ /**
+ * Creates an Image with CCITT G3 or G4 compression. It assumes that the
+ * data bytes are already compressed.
+ *
+ * @param width
+ * the exact width of the image
+ * @param height
+ * the exact height of the image
+ * @param reverseBits
+ * reverses the bits in <code>data</code>. Bit 0 is swapped
+ * with bit 7 and so on
+ * @param typeCCITT
+ * the type of compression in <code>data</code>. It can be
+ * CCITTG4, CCITTG31D, CCITTG32D
+ * @param parameters
+ * parameters associated with this stream. Possible values are
+ * CCITT_BLACKIS1, CCITT_ENCODEDBYTEALIGN, CCITT_ENDOFLINE and
+ * CCITT_ENDOFBLOCK or a combination of them
+ * @param data
+ * the image data
+ * @return an Image object
+ * @throws BadElementException
+ * on error
+ */
+ public static Image getInstance(int width, int height, boolean reverseBits,
+ int typeCCITT, int parameters, byte[] data)
+ throws BadElementException {
+ return Image.getInstance(width, height, reverseBits, typeCCITT,
+ parameters, data, null);
+ }
+
+ /**
+ * Creates an Image with CCITT G3 or G4 compression. It assumes that the
+ * data bytes are already compressed.
+ *
+ * @param width
+ * the exact width of the image
+ * @param height
+ * the exact height of the image
+ * @param reverseBits
+ * reverses the bits in <code>data</code>. Bit 0 is swapped
+ * with bit 7 and so on
+ * @param typeCCITT
+ * the type of compression in <code>data</code>. It can be
+ * CCITTG4, CCITTG31D, CCITTG32D
+ * @param parameters
+ * parameters associated with this stream. Possible values are
+ * CCITT_BLACKIS1, CCITT_ENCODEDBYTEALIGN, CCITT_ENDOFLINE and
+ * CCITT_ENDOFBLOCK or a combination of them
+ * @param data
+ * the image data
+ * @param transparency
+ * transparency information in the Mask format of the image
+ * dictionary
+ * @return an Image object
+ * @throws BadElementException
+ * on error
+ */
+ public static Image getInstance(int width, int height, boolean reverseBits,
+ int typeCCITT, int parameters, byte[] data, int transparency[])
+ throws BadElementException {
+ if (transparency != null && transparency.length != 2)
+ throw new BadElementException(
+ "Transparency length must be equal to 2 with CCITT images");
+ Image img = new ImgCCITT(width, height, reverseBits, typeCCITT,
+ parameters, data);
+ img.transparency = transparency;
+ return img;
+ }
+
+ /**
+ * Gets an instance of an Image in raw mode.
+ *
+ * @param width
+ * the width of the image in pixels
+ * @param height
+ * the height of the image in pixels
+ * @param components
+ * 1,3 or 4 for GrayScale, RGB and CMYK
+ * @param data
+ * the image data
+ * @param bpc
+ * bits per component
+ * @param transparency
+ * transparency information in the Mask format of the image
+ * dictionary
+ * @return an object of type <CODE>ImgRaw</CODE>
+ * @throws BadElementException
+ * on error
+ */
+
+ public static Image getInstance(int width, int height, int components,
+ int bpc, byte data[], int transparency[])
+ throws BadElementException {
+ if (transparency != null && transparency.length != components * 2)
+ throw new BadElementException(
+ "Transparency length must be equal to (componentes * 2)");
+ if (components == 1 && bpc == 1) {
+ byte g4[] = CCITTG4Encoder.compress(data, width, height);
+ return Image.getInstance(width, height, false, Image.CCITTG4,
+ Image.CCITT_BLACKIS1, g4, transparency);
+ }
+ Image img = new ImgRaw(width, height, components, bpc, data);
+ img.transparency = transparency;
+ return img;
+ }
+
+ /**
+ * Returns an <CODE>Image</CODE> that has been constructed taking in
+ * account the value of some <VAR>attributes </VAR>.
+ *
+ * @param attributes
+ * Some attributes
+ * @return an <CODE>Image</CODE>
+ * @throws BadElementException
+ * @throws MalformedURLException
+ * @throws IOException
+ */
+
+ public static Image getInstance(Properties attributes)
+ throws BadElementException, MalformedURLException, IOException {
+ String value = (String) attributes.remove(ElementTags.URL);
+ if (value == null)
+ throw new MalformedURLException("The URL of the image is missing.");
+ Image image = Image.getInstance(value);
+ int align = 0;
+ if ((value = (String) attributes.remove(ElementTags.ALIGN)) != null) {
+ if (ElementTags.ALIGN_LEFT.equalsIgnoreCase(value))
+ align |= Image.LEFT;
+ else if (ElementTags.ALIGN_RIGHT.equalsIgnoreCase(value))
+ align |= Image.RIGHT;
+ else if (ElementTags.ALIGN_MIDDLE.equalsIgnoreCase(value))
+ align |= Image.MIDDLE;
+ }
+ if ((value = (String) attributes.remove(ElementTags.UNDERLYING)) != null) {
+ if (new Boolean(value).booleanValue())
+ align |= Image.UNDERLYING;
+ }
+ if ((value = (String) attributes.remove(ElementTags.TEXTWRAP)) != null) {
+ if (new Boolean(value).booleanValue())
+ align |= Image.TEXTWRAP;
+ }
+ image.setAlignment(align);
+ if ((value = (String) attributes.remove(ElementTags.ALT)) != null) {
+ image.setAlt(value);
+ }
+ String x;
+ String y;
+ if (((x = (String) attributes.remove(ElementTags.ABSOLUTEX)) != null)
+ && ((y = (String) attributes.remove(ElementTags.ABSOLUTEY)) != null)) {
+ image.setAbsolutePosition(Float.valueOf(x + "f").floatValue(),
+ Float.valueOf(y + "f").floatValue());
+ }
+ if ((value = (String) attributes.remove(ElementTags.PLAINWIDTH)) != null) {
+ image.scaleAbsoluteWidth(Float.valueOf(value + "f").floatValue());
+ }
+ if ((value = (String) attributes.remove(ElementTags.PLAINHEIGHT)) != null) {
+ image.scaleAbsoluteHeight(Float.valueOf(value + "f").floatValue());
+ }
+ if ((value = (String) attributes.remove(ElementTags.ROTATION)) != null) {
+ image.setRotation(Float.valueOf(value + "f").floatValue());
+ }
+ if (attributes.size() > 0)
+ image.setMarkupAttributes(attributes);
+ return image;
+ }
+
+ // methods to set information
+
+ /**
+ * Sets the alignment for the image.
+ *
+ * @param alignment
+ * the alignment
+ */
+
+ public void setAlignment(int alignment) {
+ this.alignment = alignment;
+ }
+
+ /**
+ * Sets the alternative information for the image.
+ *
+ * @param alt
+ * the alternative information
+ */
+
+ public void setAlt(String alt) {
+ this.alt = alt;
+ }
+
+ /**
+ * Sets the absolute position of the <CODE>Image</CODE>.
+ *
+ * @param absoluteX
+ * @param absoluteY
+ */
+
+ public void setAbsolutePosition(float absoluteX, float absoluteY) {
+ this.absoluteX = absoluteX;
+ this.absoluteY = absoluteY;
+ }
+
+ /**
+ * Scale the image to an absolute width and an absolute height.
+ *
+ * @param newWidth
+ * the new width
+ * @param newHeight
+ * the new height
+ */
+
+ public void scaleAbsolute(float newWidth, float newHeight) {
+ plainWidth = newWidth;
+ plainHeight = newHeight;
+ float[] matrix = matrix();
+ scaledWidth = matrix[DX] - matrix[CX];
+ scaledHeight = matrix[DY] - matrix[CY];
+ }
+
+ /**
+ * Scale the image to an absolute width.
+ *
+ * @param newWidth
+ * the new width
+ */
+
+ public void scaleAbsoluteWidth(float newWidth) {
+ plainWidth = newWidth;
+ float[] matrix = matrix();
+ scaledWidth = matrix[DX] - matrix[CX];
+ scaledHeight = matrix[DY] - matrix[CY];
+ }
+
+ /**
+ * Scale the image to an absolute height.
+ *
+ * @param newHeight
+ * the new height
+ */
+
+ public void scaleAbsoluteHeight(float newHeight) {
+ plainHeight = newHeight;
+ float[] matrix = matrix();
+ scaledWidth = matrix[DX] - matrix[CX];
+ scaledHeight = matrix[DY] - matrix[CY];
+ }
+
+ /**
+ * Scale the image to a certain percentage.
+ *
+ * @param percent
+ * the scaling percentage
+ */
+
+ public void scalePercent(float percent) {
+ scalePercent(percent, percent);
+ }
+
+ /**
+ * Scale the width and height of an image to a certain percentage.
+ *
+ * @param percentX
+ * the scaling percentage of the width
+ * @param percentY
+ * the scaling percentage of the height
+ */
+
+ public void scalePercent(float percentX, float percentY) {
+ plainWidth = (width() * percentX) / 100f;
+ plainHeight = (height() * percentY) / 100f;
+ float[] matrix = matrix();
+ scaledWidth = matrix[DX] - matrix[CX];
+ scaledHeight = matrix[DY] - matrix[CY];
+ }
+
+ /**
+ * Scales the image so that it fits a certain width and height.
+ *
+ * @param fitWidth
+ * the width to fit
+ * @param fitHeight
+ * the height to fit
+ */
+
+ public void scaleToFit(float fitWidth, float fitHeight) {
+ scalePercent(100);
+ float percentX = (fitWidth * 100) / scaledWidth();
+ float percentY = (fitHeight * 100) / scaledHeight();
+ scalePercent(percentX < percentY ? percentX : percentY);
+ }
+
+ /**
+ * Gets the current image rotation in radians.
+ * @return the current image rotation in radians
+ */
+ public float getImageRotation() {
+ float rot = (float) ((rotation - initialRotation) % (2.0 * Math.PI));
+ if (rot < 0) {
+ rot += 2.0 * Math.PI; //__IDS__
+ }
+ return rot;
+ }
+
+ /**
+ * Sets the rotation of the image in radians.
+ *
+ * @param r
+ * rotation in radians
+ */
+
+ public void setRotation(float r) {
+ double d = Math.PI; //__IDS__
+ rotation = (float) ((r + initialRotation) % (2.0 * d)); //__IDS__
+ if (rotation < 0) {
+ rotation += 2.0 * d; //__IDS__
+ }
+ float[] matrix = matrix();
+ scaledWidth = matrix[DX] - matrix[CX];
+ scaledHeight = matrix[DY] - matrix[CY];
+ }
+
+ /**
+ * Sets the rotation of the image in degrees.
+ *
+ * @param deg
+ * rotation in degrees
+ */
+
+ public void setRotationDegrees(float deg) {
+ double d = Math.PI; //__IDS__
+ setRotation(deg / 180 * (float) d); //__IDS__
+ }
+
+ /**
+ * Sets the annotation of this Image.
+ *
+ * @param annotation
+ * the annotation
+ */
+
+ public void setAnnotation(Annotation annotation) {
+ this.annotation = annotation;
+ }
+
+ /**
+ * Gets the annotation.
+ *
+ * @return the annotation that is linked to this image
+ */
+
+ public Annotation annotation() {
+ return annotation;
+ }
+
+ // methods to retrieve information
+
+ /**
+ * Gets the bpc for the image.
+ * <P>
+ * Remark: this only makes sense for Images of the type <CODE>RawImage
+ * </CODE>.
+ *
+ * @return a bpc value
+ */
+
+ public int bpc() {
+ return bpc;
+ }
+
+ /**
+ * Gets the raw data for the image.
+ * <P>
+ * Remark: this only makes sense for Images of the type <CODE>RawImage
+ * </CODE>.
+ *
+ * @return the raw data
+ */
+
+ public byte[] rawData() {
+ return rawData;
+ }
+
+ /**
+ * Gets the template to be used as an image.
+ * <P>
+ * Remark: this only makes sense for Images of the type <CODE>ImgTemplate
+ * </CODE>.
+ *
+ * @return the template
+ */
+
+ public PdfTemplate templateData() {
+ return template[0];
+ }
+
+ /**
+ * Sets data from a PdfTemplate
+ *
+ * @param template
+ * the template with the content
+ */
+ public void setTemplateData(PdfTemplate template) {
+ this.template[0] = template;
+ }
+
+ /**
+ * Checks if the <CODE>Images</CODE> has to be added at an absolute
+ * position.
+ *
+ * @return a boolean
+ */
+
+ public boolean hasAbsolutePosition() {
+ return !Float.isNaN(absoluteY);
+ }
+
+ /**
+ * Checks if the <CODE>Images</CODE> has to be added at an absolute X
+ * position.
+ *
+ * @return a boolean
+ */
+
+ public boolean hasAbsoluteX() {
+ return !Float.isNaN(absoluteX);
+ }
+
+ /**
+ * Returns the absolute X position.
+ *
+ * @return a position
+ */
+
+ public float absoluteX() {
+ return absoluteX;
+ }
+
+ /**
+ * Returns the absolute Y position.
+ *
+ * @return a position
+ */
+
+ public float absoluteY() {
+ return absoluteY;
+ }
+
+ /**
+ * Returns the type.
+ *
+ * @return a type
+ */
+
+ public int type() {
+ return type;
+ }
+
+ /**
+ * Returns <CODE>true</CODE> if the image is a <CODE>Jpeg</CODE>
+ * -object.
+ *
+ * @return a <CODE>boolean</CODE>
+ */
+
+ public boolean isJpeg() {
+ return type == JPEG;
+ }
+
+ /**
+ * Returns <CODE>true</CODE> if the image is a <CODE>ImgRaw</CODE>
+ * -object.
+ *
+ * @return a <CODE>boolean</CODE>
+ */
+
+ public boolean isImgRaw() {
+ return type == IMGRAW;
+ }
+
+ /**
+ * Returns <CODE>true</CODE> if the image is an <CODE>ImgTemplate</CODE>
+ * -object.
+ *
+ * @return a <CODE>boolean</CODE>
+ */
+
+ public boolean isImgTemplate() {
+ return type == IMGTEMPLATE;
+ }
+
+ /**
+ * Gets the <CODE>String</CODE> -representation of the reference to the
+ * image.
+ *
+ * @return a <CODE>String</CODE>
+ */
+
+ public URL url() {
+ return url;
+ }
+
+ /**
+ * Gets the alignment for the image.
+ *
+ * @return a value
+ */
+
+ public int alignment() {
+ return alignment;
+ }
+
+ /**
+ * Gets the alternative text for the image.
+ *
+ * @return a <CODE>String</CODE>
+ */
+
+ public String alt() {
+ return alt;
+ }
+
+ /**
+ * Gets the scaled width of the image.
+ *
+ * @return a value
+ */
+
+ public float scaledWidth() {
+ return scaledWidth;
+ }
+
+ /**
+ * Gets the scaled height of the image.
+ *
+ * @return a value
+ */
+
+ public float scaledHeight() {
+ return scaledHeight;
+ }
+
+ /**
+ * Gets the colorspace for the image.
+ * <P>
+ * Remark: this only makes sense for Images of the type <CODE>Jpeg</CODE>.
+ *
+ * @return a colorspace value
+ */
+
+ public int colorspace() {
+ return colorspace;
+ }
+
+ /**
+ * Returns the transformation matrix of the image.
+ *
+ * @return an array [AX, AY, BX, BY, CX, CY, DX, DY]
+ */
+
+ public float[] matrix() {
+ float[] matrix = new float[8];
+ float cosX = (float) Math.cos(rotation);
+ float sinX = (float) Math.sin(rotation);
+ matrix[AX] = plainWidth * cosX;
+ matrix[AY] = plainWidth * sinX;
+ matrix[BX] = (-plainHeight) * sinX;
+ matrix[BY] = plainHeight * cosX;
+ if (rotation < Math.PI / 2f) {
+ matrix[CX] = matrix[BX];
+ matrix[CY] = 0;
+ matrix[DX] = matrix[AX];
+ matrix[DY] = matrix[AY] + matrix[BY];
+ } else if (rotation < Math.PI) {
+ matrix[CX] = matrix[AX] + matrix[BX];
+ matrix[CY] = matrix[BY];
+ matrix[DX] = 0;
+ matrix[DY] = matrix[AY];
+ } else if (rotation < Math.PI * 1.5f) {
+ matrix[CX] = matrix[AX];
+ matrix[CY] = matrix[AY] + matrix[BY];
+ matrix[DX] = matrix[BX];
+ matrix[DY] = 0;
+ } else {
+ matrix[CX] = 0;
+ matrix[CY] = matrix[AY];
+ matrix[DX] = matrix[AX] + matrix[BX];
+ matrix[DY] = matrix[BY];
+ }
+ return matrix;
+ }
+
+ /**
+ * This method is an alternative for the <CODE>InputStream.skip()</CODE>
+ * -method that doesn't seem to work properly for big values of <CODE>size
+ * </CODE>.
+ *
+ * @param is
+ * the <CODE>InputStream</CODE>
+ * @param size
+ * the number of bytes to skip
+ * @throws IOException
+ */
+
+ static public void skip(InputStream is, int size) throws IOException {
+ long n;
+ while (size > 0) {
+ n = is.skip(size);
+ if (n <= 0)
+ break;
+ size -= n;
+ }
+ }
+
+ private static String excUri = " <>#%\"{}[]|\\\u005E\u0060";
+ private static String[] excUriEsc = {"%20", "%3C", "%3E", "%23", "%25", "%22", "%7B", "%7D", "%5B", "%5D", "%7C", "%5C", "%5E", "%60"};
+
+ /**
+ * Holds value of property directReference.
+ */
+ private PdfIndirectReference directReference;
+
+ /**
+ * This method makes a valid URL from a given filename.
+ * <P>
+ * This method makes the conversion of this library from the JAVA 2 platform
+ * to a JDK1.1.x-version easier.
+ *
+ * @param filename
+ * a given filename
+ * @return a valid URL
+ * @throws MalformedURLException
+ */
+
+ public static URL toURL(String filename) throws MalformedURLException {
+ if (filename.startsWith("file:/") || filename.startsWith("http://")
+ || filename.startsWith("https://")
+ || filename.startsWith("jar:")) {
+ return new URL(filename);
+ }
+ File f = new File(filename);
+ String path = f.getAbsolutePath();
+ if (File.separatorChar != '/') {
+ path = path.replace(File.separatorChar, '/');
+ }
+ if (!path.startsWith("/")) {
+ path = "/" + path;
+ }
+ if (!path.endsWith("/") && f.isDirectory()) {
+ path = path + "/";
+ }
+ char[] t = path.toCharArray();
+ StringBuffer sb = new StringBuffer();
+ for (int k = 0; k < t.length; ++k) {
+ char c = t[k];
+ int a = excUri.indexOf(c);
+ if (a >= 0)
+ sb.append(excUriEsc[a]);
+ else
+ sb.append(c);
+ }
+ return new URL("file", "", sb.toString());
+ }
+
+ /**
+ * Unescapes an URL. All the "%xx" are replaced by the 'xx' hex char value.
+ * @param src the url to unescape
+ * @return the eunescaped value
+ */
+ public static String unEscapeURL(String src) {
+ StringBuffer bf = new StringBuffer();
+ char[] s = src.toCharArray();
+ for (int k = 0; k < s.length; ++k) {
+ char c = s[k];
+ if (c == '%') {
+ if (k + 2 >= s.length) {
+ bf.append(c);
+ continue;
+ }
+ int a0 = PRTokeniser.getHex((int)s[k + 1]);
+ int a1 = PRTokeniser.getHex((int)s[k + 2]);
+ if (a0 < 0 || a1 < 0) {
+ bf.append(c);
+ continue;
+ }
+ bf.append((char)(a0 * 16 + a1));
+ k += 2;
+ }
+ else
+ bf.append(c);
+ }
+ return bf.toString();
+ }
+
+ /**
+ * Returns the transparency.
+ *
+ * @return the transparency values
+ */
+
+ public int[] getTransparency() {
+ return transparency;
+ }
+
+ /**
+ * Sets the transparency values
+ *
+ * @param transparency
+ * the transparency values
+ */
+ public void setTransparency(int transparency[]) {
+ this.transparency = transparency;
+ }
+
+ /**
+ * Checks if a given tag corresponds with this object.
+ *
+ * @param tag
+ * the given tag
+ * @return true if the tag corresponds
+ */
+
+ public static boolean isTag(String tag) {
+ return ElementTags.IMAGE.equals(tag);
+ }
+
+ /**
+ * Gets the plain width of the image.
+ *
+ * @return a value
+ */
+
+ public float plainWidth() {
+ return plainWidth;
+ }
+
+ /**
+ * Gets the plain height of the image.
+ *
+ * @return a value
+ */
+
+ public float plainHeight() {
+ return plainHeight;
+ }
+
+ static protected synchronized Long getSerialId() {
+ ++serialId;
+ return new Long(serialId);
+ }
+
+ /**
+ * Returns a serial id for the Image (reuse the same image more than once)
+ *
+ * @return a serialId
+ */
+ public Long getMySerialId() {
+ return mySerialId;
+ }
+
+ /**
+ * Gets the dots-per-inch in the X direction. Returns 0 if not available.
+ *
+ * @return the dots-per-inch in the X direction
+ */
+ public int getDpiX() {
+ return dpiX;
+ }
+
+ /**
+ * Gets the dots-per-inch in the Y direction. Returns 0 if not available.
+ *
+ * @return the dots-per-inch in the Y direction
+ */
+ public int getDpiY() {
+ return dpiY;
+ }
+
+ /**
+ * Sets the dots per inch value
+ *
+ * @param dpiX
+ * dpi for x coordinates
+ * @param dpiY
+ * dpi for y coordinates
+ */
+ public void setDpi(int dpiX, int dpiY) {
+ this.dpiX = dpiX;
+ this.dpiY = dpiY;
+ }
+
+ /**
+ * Returns <CODE>true</CODE> if this <CODE>Image</CODE> has the
+ * requisites to be a mask.
+ *
+ * @return <CODE>true</CODE> if this <CODE>Image</CODE> can be a mask
+ */
+ public boolean isMaskCandidate() {
+ if (type == IMGRAW) {
+ if (bpc > 0xff)
+ return true;
+ }
+ return colorspace == 1;
+ }
+
+ /**
+ * Make this <CODE>Image</CODE> a mask.
+ *
+ * @throws DocumentException
+ * if this <CODE>Image</CODE> can not be a mask
+ */
+ public void makeMask() throws DocumentException {
+ if (!isMaskCandidate())
+ throw new DocumentException("This image can not be an image mask.");
+ mask = true;
+ }
+
+ /**
+ * Sets the explicit masking.
+ *
+ * @param mask
+ * the mask to be applied
+ * @throws DocumentException
+ * on error
+ */
+ public void setImageMask(Image mask) throws DocumentException {
+ if (this.mask)
+ throw new DocumentException(
+ "An image mask cannot contain another image mask.");
+ if (!mask.mask)
+ throw new DocumentException(
+ "The image mask is not a mask. Did you do makeMask()?");
+ imageMask = mask;
+ smask = (mask.bpc > 1 && mask.bpc <= 8);
+ }
+
+ /**
+ * Gets the explicit masking.
+ *
+ * @return the explicit masking
+ */
+ public Image getImageMask() {
+ return imageMask;
+ }
+
+ /**
+ * Returns <CODE>true</CODE> if this <CODE>Image</CODE> is a mask.
+ *
+ * @return <CODE>true</CODE> if this <CODE>Image</CODE> is a mask
+ */
+ public boolean isMask() {
+ return mask;
+ }
+
+ /**
+ * Inverts the meaning of the bits of a mask.
+ *
+ * @param invert
+ * <CODE>true</CODE> to invert the meaning of the bits of a
+ * mask
+ */
+ public void setInvertMask(boolean invert) {
+ this.invert = invert;
+ }
+
+ /**
+ * Returns <CODE>true</CODE> if the bits are to be inverted in the mask.
+ *
+ * @return <CODE>true</CODE> if the bits are to be inverted in the mask
+ */
+ public boolean isInvertMask() {
+ return invert;
+ }
+
+ /**
+ * Getter for the inverted value
+ *
+ * @return true if the image is inverted
+ */
+ public boolean isInverted() {
+ return invert;
+ }
+
+ /**
+ * Sets inverted true or false
+ *
+ * @param invert
+ * true or false
+ */
+ public void setInverted(boolean invert) {
+ this.invert = invert;
+ }
+
+ /**
+ * Getter for property interpolation.
+ *
+ * @return Value of property interpolation.
+ */
+ public boolean isInterpolation() {
+ return interpolation;
+ }
+
+ /**
+ * Sets the image interpolation. Image interpolation attempts to produce a
+ * smooth transition between adjacent sample values.
+ *
+ * @param interpolation
+ * New value of property interpolation.
+ */
+ public void setInterpolation(boolean interpolation) {
+ this.interpolation = interpolation;
+ }
+
+ /**
+ * @see com.lowagie.text.MarkupAttributes#setMarkupAttribute(java.lang.String,
+ * java.lang.String)
+ */
+ public void setMarkupAttribute(String name, String value) {
+ if (markupAttributes == null) markupAttributes = new Properties();
+ markupAttributes.put(name, value);
+ }
+
+ /**
+ * @see com.lowagie.text.MarkupAttributes#setMarkupAttributes(java.util.Properties)
+ */
+ public void setMarkupAttributes(Properties markupAttributes) {
+ this.markupAttributes = markupAttributes;
+ }
+
+ /**
+ * @see com.lowagie.text.MarkupAttributes#getMarkupAttribute(java.lang.String)
+ */
+ public String getMarkupAttribute(String name) {
+ return (markupAttributes == null) ? null : String
+ .valueOf(markupAttributes.get(name));
+ }
+
+ /**
+ * @see com.lowagie.text.MarkupAttributes#getMarkupAttributeNames()
+ */
+ public Set getMarkupAttributeNames() {
+ return Chunk.getKeySet(markupAttributes);
+ }
+
+ /**
+ * @see com.lowagie.text.MarkupAttributes#getMarkupAttributes()
+ */
+ public Properties getMarkupAttributes() {
+ return markupAttributes;
+ }
+
+ /**
+ * Tags this image with an ICC profile.
+ *
+ * @param profile
+ * the profile
+ */
+ public void tagICC(ICC_Profile profile) {
+ this.profile = profile;
+ }
+
+ /**
+ * Checks is the image has an ICC profile.
+ *
+ * @return the ICC profile or <CODE>null</CODE>
+ */
+ public boolean hasICCProfile() {
+ return (this.profile != null);
+ }
+
+ /**
+ * Gets the images ICC profile.
+ *
+ * @return the ICC profile
+ */
+ public ICC_Profile getICCProfile() {
+ return profile;
+ }
+
+ /**
+ * Getter for property deflated.
+ *
+ * @return Value of property deflated.
+ *
+ */
+ public boolean isDeflated() {
+ return this.deflated;
+ }
+
+ /**
+ * Setter for property deflated.
+ *
+ * @param deflated
+ * New value of property deflated.
+ *
+ */
+ public void setDeflated(boolean deflated) {
+ this.deflated = deflated;
+ }
+
+ /**
+ * Getter for property indexed.
+ *
+ * @return Value of property indexed.
+ *
+ */
+ public PdfDictionary getAdditional() {
+ return this.additional;
+ }
+
+ /**
+ * Sets the /Colorspace key.
+ *
+ * @param additional
+ * New value of property indexed.
+ */
+ public void setAdditional(PdfDictionary additional) {
+ this.additional = additional;
+ }
+
+ /**
+ * Getter for property smask.
+ *
+ * @return Value of property smask.
+ *
+ */
+ public boolean isSmask() {
+ return this.smask;
+ }
+
+ /**
+ * Setter for property smask.
+ *
+ * @param smask
+ * New value of property smask.
+ *
+ */
+ public void setSmask(boolean smask) {
+ this.smask = smask;
+ }
+
+ /**
+ * Gets the X/Y pixel dimensionless aspect ratio.
+ *
+ * @return the X/Y pixel dimensionless aspect ratio
+ */
+ public float getXYRatio() {
+ return this.XYRatio;
+ }
+
+ /**
+ * Sets the X/Y pixel dimensionless aspect ratio.
+ *
+ * @param XYRatio
+ * the X/Y pixel dimensionless aspect ratio
+ */
+ public void setXYRatio(float XYRatio) {
+ this.XYRatio = XYRatio;
+ }
+
+ /**
+ * Gets the left indentation.
+ *
+ * @return the left indentation
+ */
+ public float indentationLeft() {
+ return indentationLeft;
+ }
+
+ /**
+ * Gets the right indentation.
+ *
+ * @return the right indentation
+ */
+ public float indentationRight() {
+ return indentationRight;
+ }
+
+ /**
+ * Sets the left indentation.
+ *
+ * @param f
+ */
+ public void setIndentationLeft(float f) {
+ indentationLeft = f;
+ }
+
+ /**
+ * Sets the right indentation.
+ *
+ * @param f
+ */
+ public void setIndentationRight(float f) {
+ indentationRight = f;
+ }
+
+ /**
+ * Getter for property originalType.
+ *
+ * @return Value of property originalType.
+ *
+ */
+ public int getOriginalType() {
+ return this.originalType;
+ }
+
+ /**
+ * Setter for property originalType.
+ *
+ * @param originalType
+ * New value of property originalType.
+ *
+ */
+ public void setOriginalType(int originalType) {
+ this.originalType = originalType;
+ }
+
+ /**
+ * Getter for property originalData.
+ *
+ * @return Value of property originalData.
+ *
+ */
+ public byte[] getOriginalData() {
+ return this.originalData;
+ }
+
+ /**
+ * Setter for property originalData.
+ *
+ * @param originalData
+ * New value of property originalData.
+ *
+ */
+ public void setOriginalData(byte[] originalData) {
+ this.originalData = originalData;
+ }
+
+ /**
+ * Sets the url of the image
+ *
+ * @param url
+ * the url of the image
+ */
+ public void setUrl(URL url) {
+ this.url = url;
+ }
+
+ /**
+ * Sets the spacing before this image.
+ *
+ * @param spacing
+ * the new spacing
+ */
+
+ public void setSpacingBefore(float spacing) {
+ this.spacingBefore = spacing;
+ }
+
+ /**
+ * Sets the spacing after this image.
+ *
+ * @param spacing
+ * the new spacing
+ */
+
+ public void setSpacingAfter(float spacing) {
+ this.spacingAfter = spacing;
+ }
+
+ /**
+ * Gets the spacing before this image.
+ *
+ * @return the spacing
+ */
+
+ public float spacingBefore() {
+ return spacingBefore;
+ }
+
+ /**
+ * Gets the spacing before this image.
+ *
+ * @return the spacing
+ */
+
+ public float spacingAfter() {
+ return spacingAfter;
+ }
+
+ /**
+ * Getter for property widthPercentage.
+ *
+ * @return Value of property widthPercentage.
+ */
+ public float getWidthPercentage() {
+ return this.widthPercentage;
+ }
+
+ /**
+ * Setter for property widthPercentage.
+ *
+ * @param widthPercentage
+ * New value of property widthPercentage.
+ */
+ public void setWidthPercentage(float widthPercentage) {
+ this.widthPercentage = widthPercentage;
+ }
+
+ /**
+ * Gets the layer this image belongs to.
+ *
+ * @return the layer this image belongs to or <code>null</code> for no
+ * layer defined
+ */
+ public PdfOCG getLayer() {
+ return layer;
+ }
+
+ /**
+ * Sets the layer this image belongs to.
+ *
+ * @param layer
+ * the layer this image belongs to
+ */
+ public void setLayer(PdfOCG layer) {
+ this.layer = layer;
+ }
+
+ private PdfObject simplifyColorspace(PdfObject obj) {
+ if (obj == null || !obj.isArray())
+ return obj;
+ PdfObject first = (PdfObject)(((PdfArray)obj).getArrayList().get(0));
+ if (PdfName.CALGRAY.equals(first))
+ return PdfName.DEVICEGRAY;
+ else if (PdfName.CALRGB.equals(first))
+ return PdfName.DEVICERGB;
+ else
+ return obj;
+ }
+
+ /**
+ * Replaces CalRGB and CalGray colorspaces with DeviceRGB and DeviceGray.
+ */
+ public void simplifyColorspace() {
+ if (additional == null)
+ return;
+ PdfObject value = additional.get(PdfName.COLORSPACE);
+ if (value == null || !value.isArray())
+ return;
+ PdfObject cs = simplifyColorspace(value);
+ if (cs.isName())
+ value = cs;
+ else {
+ PdfObject first = (PdfObject)(((PdfArray)value).getArrayList().get(0));
+ if (PdfName.INDEXED.equals(first)) {
+ ArrayList array = ((PdfArray)value).getArrayList();
+ if (array.size() >= 2 && ((PdfObject)array.get(1)).isArray()) {
+ array.set(1, simplifyColorspace((PdfObject)array.get(1)));
+ }
+ }
+ }
+ additional.put(PdfName.COLORSPACE, value);
+ }
+
+ /**
+ * Getter for property initialRotation.
+ * @return Value of property initialRotation.
+ */
+ public float getInitialRotation() {
+ return this.initialRotation;
+ }
+
+ /**
+ * Some image formats, like TIFF may present the images rotated that have
+ * to be compensated.
+ * @param initialRotation New value of property initialRotation.
+ */
+ public void setInitialRotation(float initialRotation) {
+ float old_rot = rotation - this.initialRotation;
+ this.initialRotation = initialRotation;
+ setRotation(old_rot);
+ }
+
+ /**
+ * Getter for property directReference.
+ * @return Value of property directReference.
+ */
+ public PdfIndirectReference getDirectReference() {
+ return this.directReference;
+ }
+
+ /**
+ * Setter for property directReference.
+ * @param directReference New value of property directReference.
+ */
+ public void setDirectReference(PdfIndirectReference directReference) {
+ this.directReference = directReference;
+ }
+
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/ImgCCITT.java b/src/main/java/com/lowagie/text/ImgCCITT.java
new file mode 100644
index 0000000..91fb50a
--- /dev/null
+++ b/src/main/java/com/lowagie/text/ImgCCITT.java
@@ -0,0 +1,146 @@
+/*
+ * $Id: ImgCCITT.java,v 1.47 2005/05/04 14:31:06 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2000, 2001, 2002 by Paulo Soares.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text;
+
+import java.net.URL;
+
+/**
+ * CCITT Image data that has to be inserted into the document
+ *
+ * @see Element
+ * @see Image
+ *
+ * @author Paulo Soares
+ */
+
+public class ImgCCITT extends Image implements Element {
+ /** A table to do fast bit reversal.
+ */
+ static final byte bitReversal[] = {
+ (byte)0x00, (byte)0x80, (byte)0x40, (byte)0xc0, (byte)0x20, (byte)0xa0, (byte)0x60, (byte)0xe0,
+ (byte)0x10, (byte)0x90, (byte)0x50, (byte)0xd0, (byte)0x30, (byte)0xb0, (byte)0x70, (byte)0xf0,
+ (byte)0x08, (byte)0x88, (byte)0x48, (byte)0xc8, (byte)0x28, (byte)0xa8, (byte)0x68, (byte)0xe8,
+ (byte)0x18, (byte)0x98, (byte)0x58, (byte)0xd8, (byte)0x38, (byte)0xb8, (byte)0x78, (byte)0xf8,
+ (byte)0x04, (byte)0x84, (byte)0x44, (byte)0xc4, (byte)0x24, (byte)0xa4, (byte)0x64, (byte)0xe4,
+ (byte)0x14, (byte)0x94, (byte)0x54, (byte)0xd4, (byte)0x34, (byte)0xb4, (byte)0x74, (byte)0xf4,
+ (byte)0x0c, (byte)0x8c, (byte)0x4c, (byte)0xcc, (byte)0x2c, (byte)0xac, (byte)0x6c, (byte)0xec,
+ (byte)0x1c, (byte)0x9c, (byte)0x5c, (byte)0xdc, (byte)0x3c, (byte)0xbc, (byte)0x7c, (byte)0xfc,
+ (byte)0x02, (byte)0x82, (byte)0x42, (byte)0xc2, (byte)0x22, (byte)0xa2, (byte)0x62, (byte)0xe2,
+ (byte)0x12, (byte)0x92, (byte)0x52, (byte)0xd2, (byte)0x32, (byte)0xb2, (byte)0x72, (byte)0xf2,
+ (byte)0x0a, (byte)0x8a, (byte)0x4a, (byte)0xca, (byte)0x2a, (byte)0xaa, (byte)0x6a, (byte)0xea,
+ (byte)0x1a, (byte)0x9a, (byte)0x5a, (byte)0xda, (byte)0x3a, (byte)0xba, (byte)0x7a, (byte)0xfa,
+ (byte)0x06, (byte)0x86, (byte)0x46, (byte)0xc6, (byte)0x26, (byte)0xa6, (byte)0x66, (byte)0xe6,
+ (byte)0x16, (byte)0x96, (byte)0x56, (byte)0xd6, (byte)0x36, (byte)0xb6, (byte)0x76, (byte)0xf6,
+ (byte)0x0e, (byte)0x8e, (byte)0x4e, (byte)0xce, (byte)0x2e, (byte)0xae, (byte)0x6e, (byte)0xee,
+ (byte)0x1e, (byte)0x9e, (byte)0x5e, (byte)0xde, (byte)0x3e, (byte)0xbe, (byte)0x7e, (byte)0xfe,
+ (byte)0x01, (byte)0x81, (byte)0x41, (byte)0xc1, (byte)0x21, (byte)0xa1, (byte)0x61, (byte)0xe1,
+ (byte)0x11, (byte)0x91, (byte)0x51, (byte)0xd1, (byte)0x31, (byte)0xb1, (byte)0x71, (byte)0xf1,
+ (byte)0x09, (byte)0x89, (byte)0x49, (byte)0xc9, (byte)0x29, (byte)0xa9, (byte)0x69, (byte)0xe9,
+ (byte)0x19, (byte)0x99, (byte)0x59, (byte)0xd9, (byte)0x39, (byte)0xb9, (byte)0x79, (byte)0xf9,
+ (byte)0x05, (byte)0x85, (byte)0x45, (byte)0xc5, (byte)0x25, (byte)0xa5, (byte)0x65, (byte)0xe5,
+ (byte)0x15, (byte)0x95, (byte)0x55, (byte)0xd5, (byte)0x35, (byte)0xb5, (byte)0x75, (byte)0xf5,
+ (byte)0x0d, (byte)0x8d, (byte)0x4d, (byte)0xcd, (byte)0x2d, (byte)0xad, (byte)0x6d, (byte)0xed,
+ (byte)0x1d, (byte)0x9d, (byte)0x5d, (byte)0xdd, (byte)0x3d, (byte)0xbd, (byte)0x7d, (byte)0xfd,
+ (byte)0x03, (byte)0x83, (byte)0x43, (byte)0xc3, (byte)0x23, (byte)0xa3, (byte)0x63, (byte)0xe3,
+ (byte)0x13, (byte)0x93, (byte)0x53, (byte)0xd3, (byte)0x33, (byte)0xb3, (byte)0x73, (byte)0xf3,
+ (byte)0x0b, (byte)0x8b, (byte)0x4b, (byte)0xcb, (byte)0x2b, (byte)0xab, (byte)0x6b, (byte)0xeb,
+ (byte)0x1b, (byte)0x9b, (byte)0x5b, (byte)0xdb, (byte)0x3b, (byte)0xbb, (byte)0x7b, (byte)0xfb,
+ (byte)0x07, (byte)0x87, (byte)0x47, (byte)0xc7, (byte)0x27, (byte)0xa7, (byte)0x67, (byte)0xe7,
+ (byte)0x17, (byte)0x97, (byte)0x57, (byte)0xd7, (byte)0x37, (byte)0xb7, (byte)0x77, (byte)0xf7,
+ (byte)0x0f, (byte)0x8f, (byte)0x4f, (byte)0xcf, (byte)0x2f, (byte)0xaf, (byte)0x6f, (byte)0xef,
+ (byte)0x1f, (byte)0x9f, (byte)0x5f, (byte)0xdf, (byte)0x3f, (byte)0xbf, (byte)0x7f, (byte)0xff
+ };
+
+ /** Reverses the bits in the array.
+ * @param data data to reverse bits
+ */
+ public static void ReverseBits(byte data[]) {
+ for (int k = 0; k < data.length; ++k)
+ data[k] = bitReversal[(int)data[k] & 0xff];
+ }
+
+ ImgCCITT(Image image) {
+ super(image);
+ }
+
+ /** Creates an Image with CCITT compression.
+ *
+ * @param width the exact width of the image
+ * @param height the exact height of the image
+ * @param reverseBits reverses the bits in <code>data</code>.
+ * Bit 0 is swapped with bit 7 and so on
+ * @param typeCCITT the type of compression in <code>data</code>. It can be
+ * CCITTG4, CCITTG31D, CCITTG32D
+ * @param parameters parameters associated with this stream. Possible values are
+ * CCITT_BLACKIS1, CCITT_ENCODEDBYTEALIGN, CCITT_ENDOFLINE and CCITT_ENDOFBLOCK or a
+ * combination of them
+ * @param data the image data
+ * @throws BadElementException on error
+ */
+
+ public ImgCCITT(int width, int height, boolean reverseBits, int typeCCITT, int parameters, byte[] data) throws BadElementException{
+ super((URL)null);
+ if (typeCCITT != CCITTG4 && typeCCITT != CCITTG3_1D && typeCCITT != CCITTG3_2D)
+ throw new BadElementException("The CCITT compression type must be CCITTG4, CCITTG3_1D or CCITTG3_2D");
+ if (reverseBits)
+ ReverseBits(data);
+ type = IMGRAW;
+ scaledHeight = height;
+ setTop(scaledHeight);
+ scaledWidth = width;
+ setRight(scaledWidth);
+ colorspace = parameters;
+ bpc = typeCCITT;
+ rawData = data;
+ plainWidth = width();
+ plainHeight = height();
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/ImgPostscript.java b/src/main/java/com/lowagie/text/ImgPostscript.java
new file mode 100644
index 0000000..3d6d902
--- /dev/null
+++ b/src/main/java/com/lowagie/text/ImgPostscript.java
@@ -0,0 +1,234 @@
+/*
+ * $Id: ImgPostscript.java,v 1.6 2006/04/22 16:56:40 psoares33 Exp $
+ * $Name: $
+ *
+ * Copyright 1999, 2000, 2001, 2002 by Paulo Soares.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text;
+
+import java.io.*;
+import java.net.*;
+import com.lowagie.text.pdf.*;
+import com.lowagie.text.pdf.codec.postscript.*;
+import java.util.StringTokenizer;
+
+/**
+ * An <CODE>ImgPostscript</CODE> is the representation of an EPS
+ * that has to be inserted into the document
+ *
+ * @see Element
+ * @see Image
+ */
+
+public class ImgPostscript
+extends Image
+implements Element {
+
+ // Constructors
+
+ ImgPostscript(Image image) {
+ super(image);
+ }
+
+ public ImgPostscript(byte[] content,float width,float height) throws
+ BadElementException, IOException {
+ super( (URL)null);
+ rawData = content;
+ originalData = content;
+ processParameters();
+ this.urx=width;
+ this.ury=height;
+ }
+ /**
+ * Constructs an <CODE>ImgPostscript</CODE>-object, using an <VAR>url</VAR>.
+ *
+ * @param url the <CODE>URL</CODE> where the image can be found
+ * @throws BadElementException on error
+ * @throws IOException on error
+ */
+
+ public ImgPostscript(URL url) throws BadElementException, IOException {
+ super(url);
+ processParameters();
+ }
+
+ /**
+ * Constructs an <CODE>ImgPostscript</CODE>-object, using a <VAR>filename</VAR>.
+ *
+ * @param filename a <CODE>String</CODE>-representation of the file that contains the image.
+ * @throws BadElementException on error
+ * @throws MalformedURLException on error
+ * @throws IOException on error
+ */
+
+ public ImgPostscript(String filename) throws BadElementException,
+ MalformedURLException, IOException {
+ this(Image.toURL(filename));
+ }
+
+ /**
+ * Constructs an <CODE>ImgPostscript</CODE>-object from memory.
+ *
+ * @param img the memory image
+ * @throws BadElementException on error
+ * @throws IOException on error
+ */
+
+ public ImgPostscript(byte[] img) throws BadElementException, IOException {
+ super( (URL)null);
+ rawData = img;
+ originalData = img;
+ processParameters();
+ }
+
+
+ /**
+ * This method checks if the image is a valid Postscript and processes some parameters.
+ * @throws BadElementException
+ * @throws IOException
+ */
+
+ private void processParameters() throws BadElementException, IOException {
+ type = IMGTEMPLATE;
+ originalType = ORIGINAL_PS;
+ InputStream is = null;
+ try {
+ if (rawData == null) {
+ is = url.openStream();
+ }
+ else {
+ is = new java.io.ByteArrayInputStream(rawData);
+ }
+ String boundingbox=null;
+ String templatebox=null;
+ Reader r = new BufferedReader(new InputStreamReader(is));
+ // StreamTokenizer st = new StreamTokenizer(r);
+ while (r.ready()) {
+ char c;
+ StringBuffer sb = new StringBuffer();
+ while ( (c = ( (char) r.read())) != '\n'&&c!='\r') {
+ sb.append(c);
+ }
+ //System.out.println("<<" + sb.toString() + ">>");
+ if (sb.toString().startsWith("%%BoundingBox:")) {
+ boundingbox = sb.toString();
+
+ }
+ if (sb.toString().startsWith("%%TemplateBox:")) {
+ templatebox = sb.toString();
+ }
+ if (sb.toString().startsWith("%%EndComments")) {
+ break;
+ }
+ if ((!sb.toString().startsWith("%%"))&&(!sb.toString().startsWith("%!"))) {
+ break;
+ }
+
+ }
+ if(boundingbox==null){
+ scaledHeight=PageSize.A4.height();
+ setTop(scaledHeight);
+ scaledWidth=PageSize.A4.width();
+ setRight(scaledWidth);
+ return;
+ }
+ StringTokenizer st=new StringTokenizer(boundingbox,": \r\n");
+ st.nextElement();
+ String xx1=st.nextToken();
+ String yy1=st.nextToken();
+ String xx2=st.nextToken();
+ String yy2=st.nextToken();
+
+ int left = Integer.parseInt(xx1);
+ int bottom = Integer.parseInt(yy1);
+ int right = Integer.parseInt(xx2);
+ int top = Integer.parseInt(yy2);
+ int inch = 1;
+ dpiX = 72;
+ dpiY = 72;
+ scaledHeight = (float) (top-bottom ) / inch *1f;
+ setTop(top);
+ scaledWidth = (float) (right - left) / inch * 1f;
+ setRight(right);
+ }
+ finally {
+ if (is != null) {
+ is.close();
+ }
+ plainWidth = width();
+ plainHeight = height();
+ }
+ }
+
+ /** Reads the Postscript into a template.
+ * @param template the template to read to
+ * @throws IOException on error
+ * @throws DocumentException on error
+ */
+ public void readPostscript(PdfTemplate template) throws IOException,
+ DocumentException {
+ setTemplateData(template);
+ template.setWidth(width());
+ template.setHeight(height());
+ InputStream is = null;
+ try {
+ if (rawData == null) {
+ is = url.openStream();
+ }
+ else {
+ is = new java.io.ByteArrayInputStream(rawData);
+ }
+ MetaDoPS meta = new MetaDoPS(is, template);
+ meta.readAll();
+ }
+ finally {
+ if (is != null) {
+ is.close();
+ }
+ }
+ }
+}
diff --git a/src/main/java/com/lowagie/text/ImgRaw.java b/src/main/java/com/lowagie/text/ImgRaw.java
new file mode 100644
index 0000000..813e8ae
--- /dev/null
+++ b/src/main/java/com/lowagie/text/ImgRaw.java
@@ -0,0 +1,97 @@
+/*
+ * $Id: ImgRaw.java,v 1.61 2005/05/04 14:31:11 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2000, 2001, 2002 by Paulo Soares.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text;
+
+import java.net.URL;
+
+/**
+ * Raw Image data that has to be inserted into the document
+ *
+ * @see Element
+ * @see Image
+ *
+ * @author Paulo Soares
+ */
+
+public class ImgRaw extends Image implements Element {
+
+ ImgRaw(Image image) {
+ super(image);
+ }
+
+/** Creats an Image in raw mode.
+ *
+ * @param width the exact width of the image
+ * @param height the exact height of the image
+ * @param components 1,3 or 4 for GrayScale, RGB and CMYK
+ * @param bpc bits per component. Must be 1,2,4 or 8
+ * @param data the image data
+ * @throws BadElementException on error
+ */
+
+ public ImgRaw(int width, int height, int components, int bpc, byte[] data) throws BadElementException{
+ super((URL)null);
+ type = IMGRAW;
+ scaledHeight = height;
+ setTop(scaledHeight);
+ scaledWidth = width;
+ setRight(scaledWidth);
+ if (components != 1 && components != 3 && components != 4)
+ throw new BadElementException("Components must be 1, 3, or 4.");
+ if (bpc != 1 && bpc != 2 && bpc != 4 && bpc != 8)
+ throw new BadElementException("Bits-per-component must be 1, 2, 4, or 8.");
+ colorspace = components;
+ this.bpc = bpc;
+ rawData = data;
+ plainWidth = width();
+ plainHeight = height();
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/ImgTemplate.java b/src/main/java/com/lowagie/text/ImgTemplate.java
new file mode 100644
index 0000000..5cc01bf
--- /dev/null
+++ b/src/main/java/com/lowagie/text/ImgTemplate.java
@@ -0,0 +1,91 @@
+/*
+ * $Id: ImgTemplate.java,v 1.52 2005/05/04 14:31:10 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2000, 2001, 2002 by Paulo Soares.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text;
+
+import java.net.URL;
+import com.lowagie.text.pdf.PdfTemplate;
+
+/**
+ * PdfTemplate that has to be inserted into the document
+ *
+ * @see Element
+ * @see Image
+ *
+ * @author Paulo Soares
+ */
+
+public class ImgTemplate extends Image implements Element {
+
+ ImgTemplate(Image image) {
+ super(image);
+ }
+
+ /** Creats an Image from a PdfTemplate.
+ *
+ * @param template the PdfTemplate
+ * @throws BadElementException on error
+ */
+ public ImgTemplate(PdfTemplate template) throws BadElementException{
+ super((URL)null);
+ if (template == null)
+ throw new BadElementException("The template can not be null.");
+ if (template.getType() == PdfTemplate.TYPE_PATTERN)
+ throw new BadElementException("A pattern can not be used as a template to create an image.");
+ type = IMGTEMPLATE;
+ scaledHeight = template.getHeight();
+ setTop(scaledHeight);
+ scaledWidth = template.getWidth();
+ setRight(scaledWidth);
+ setTemplateData(template);
+ plainWidth = width();
+ plainHeight = height();
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/ImgWMF.java b/src/main/java/com/lowagie/text/ImgWMF.java
new file mode 100644
index 0000000..25b989c
--- /dev/null
+++ b/src/main/java/com/lowagie/text/ImgWMF.java
@@ -0,0 +1,190 @@
+/*
+ * $Id: ImgWMF.java,v 1.47 2005/05/04 14:31:10 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 1999, 2000, 2001, 2002 by Paulo Soares.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text;
+
+import java.io.InputStream;
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URL;
+import com.lowagie.text.pdf.codec.wmf.InputMeta;
+import com.lowagie.text.pdf.codec.wmf.MetaDo;
+import com.lowagie.text.pdf.*;
+
+/**
+ * An <CODE>ImgWMF</CODE> is the representation of a windows metafile
+ * that has to be inserted into the document
+ *
+ * @see Element
+ * @see Image
+ */
+
+public class ImgWMF extends Image implements Element {
+
+ // Constructors
+
+ ImgWMF(Image image) {
+ super(image);
+ }
+
+ /**
+ * Constructs an <CODE>ImgWMF</CODE>-object, using an <VAR>url</VAR>.
+ *
+ * @param url the <CODE>URL</CODE> where the image can be found
+ * @throws BadElementException on error
+ * @throws IOException on error
+ */
+
+ public ImgWMF(URL url) throws BadElementException, IOException {
+ super(url);
+ processParameters();
+ }
+
+ /**
+ * Constructs an <CODE>ImgWMF</CODE>-object, using a <VAR>filename</VAR>.
+ *
+ * @param filename a <CODE>String</CODE>-representation of the file that contains the image.
+ * @throws BadElementException on error
+ * @throws MalformedURLException on error
+ * @throws IOException on error
+ */
+
+ public ImgWMF(String filename) throws BadElementException, MalformedURLException, IOException {
+ this(Image.toURL(filename));
+ }
+
+ /**
+ * Constructs an <CODE>ImgWMF</CODE>-object from memory.
+ *
+ * @param img the memory image
+ * @throws BadElementException on error
+ * @throws IOException on error
+ */
+
+ public ImgWMF(byte[] img) throws BadElementException, IOException {
+ super((URL)null);
+ rawData = img;
+ originalData = img;
+ processParameters();
+ }
+
+/**
+ * This method checks if the image is a valid WMF and processes some parameters.
+ * @throws BadElementException
+ * @throws IOException
+ */
+
+ private void processParameters() throws BadElementException, IOException {
+ type = IMGTEMPLATE;
+ originalType = ORIGINAL_WMF;
+ InputStream is = null;
+ try {
+ String errorID;
+ if (rawData == null){
+ is = url.openStream();
+ errorID = url.toString();
+ }
+ else{
+ is = new java.io.ByteArrayInputStream(rawData);
+ errorID = "Byte array";
+ }
+ InputMeta in = new InputMeta(is);
+ if (in.readInt() != 0x9AC6CDD7) {
+ throw new BadElementException(errorID + " is not a valid placeable windows metafile.");
+ }
+ in.readWord();
+ int left = in.readShort();
+ int top = in.readShort();
+ int right = in.readShort();
+ int bottom = in.readShort();
+ int inch = in.readWord();
+ dpiX = 72;
+ dpiY = 72;
+ scaledHeight = (float)(bottom - top) / inch * 72f;
+ setTop(scaledHeight);
+ scaledWidth = (float)(right - left) / inch * 72f;
+ setRight(scaledWidth);
+ }
+ finally {
+ if (is != null) {
+ is.close();
+ }
+ plainWidth = width();
+ plainHeight = height();
+ }
+ }
+
+ /** Reads the WMF into a template.
+ * @param template the template to read to
+ * @throws IOException on error
+ * @throws DocumentException on error
+ */
+ public void readWMF(PdfTemplate template) throws IOException, DocumentException {
+ setTemplateData(template);
+ template.setWidth(width());
+ template.setHeight(height());
+ InputStream is = null;
+ try {
+ if (rawData == null){
+ is = url.openStream();
+ }
+ else{
+ is = new java.io.ByteArrayInputStream(rawData);
+ }
+ MetaDo meta = new MetaDo(is, template);
+ meta.readAll();
+ }
+ finally {
+ if (is != null) {
+ is.close();
+ }
+ }
+ }
+}
diff --git a/src/main/java/com/lowagie/text/Jpeg.java b/src/main/java/com/lowagie/text/Jpeg.java
new file mode 100644
index 0000000..1b95486
--- /dev/null
+++ b/src/main/java/com/lowagie/text/Jpeg.java
@@ -0,0 +1,350 @@
+/*
+ * $Id: Jpeg.java,v 1.59 2004/12/14 12:33:47 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text;
+
+import java.io.InputStream;
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URL;
+
+/**
+ * An <CODE>Jpeg</CODE> is the representation of a graphic element (JPEG)
+ * that has to be inserted into the document
+ *
+ * @see Element
+ * @see Image
+ */
+
+public class Jpeg extends Image implements Element {
+
+ // public static final membervariables
+
+ /** This is a type of marker. */
+ public static final int NOT_A_MARKER = -1;
+
+ /** This is a type of marker. */
+ public static final int VALID_MARKER = 0;
+
+ /** Acceptable Jpeg markers. */
+ public static final int[] VALID_MARKERS = {0xC0, 0xC1, 0xC2};
+
+ /** This is a type of marker. */
+ public static final int UNSUPPORTED_MARKER = 1;
+
+ /** Unsupported Jpeg markers. */
+ public static final int[] UNSUPPORTED_MARKERS = {0xC3, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCD, 0xCE, 0xCF};
+
+ /** This is a type of marker. */
+ public static final int NOPARAM_MARKER = 2;
+
+ /** Jpeg markers without additional parameters. */
+ public static final int[] NOPARAM_MARKERS = {0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0x01};
+
+ /** Marker value */
+ public static final int M_APP0 = 0xE0;
+ /** Marker value */
+ public static final int M_APPE = 0xEE;
+
+ /** sequence that is used in all Jpeg files */
+ public static final byte JFIF_ID[] = {0x4A, 0x46, 0x49, 0x46, 0x00};
+ // Constructors
+
+ Jpeg(Image image) {
+ super(image);
+ }
+
+ /**
+ * Constructs a <CODE>Jpeg</CODE>-object, using an <VAR>url</VAR>.
+ *
+ * @param url the <CODE>URL</CODE> where the image can be found
+ * @throws BadElementException
+ * @throws IOException
+ */
+
+ public Jpeg(URL url) throws BadElementException, IOException {
+ super(url);
+ processParameters();
+ }
+
+ /**
+ * Constructs a <CODE>Jpeg</CODE>-object, using an <VAR>url</VAR>.
+ *
+ * @param url the <CODE>URL</CODE> where the image can be found.
+ * @param width new width of the Jpeg
+ * @param height new height of the Jpeg
+ * @throws BadElementException
+ * @throws IOException
+ * @deprecated use Image.getInstance(...) to create an Image
+ */
+
+ public Jpeg(URL url, float width, float height) throws BadElementException, IOException {
+ this(url);
+ scaledWidth = width;
+ scaledHeight = height;
+ }
+
+ /**
+ * Constructs a <CODE>Jpeg</CODE>-object, using a <VAR>filename</VAR>.
+ *
+ * @param filename a <CODE>String</CODE>-representation of the file that contains the Image.
+ * @throws BadElementException
+ * @throws MalformedURLException
+ * @throws IOException
+ * @deprecated use Image.getInstance(...) to create an Image
+ */
+
+ public Jpeg(String filename) throws BadElementException, MalformedURLException, IOException {
+ this(Image.toURL(filename));
+ }
+
+ /**
+ * Constructs a <CODE>Jpeg</CODE>-object, using a <VAR>filename</VAR>.
+ *
+ * @param filename a <CODE>String</CODE>-representation of the file that contains the Image.
+ * @param width new width of the Jpeg
+ * @param height new height of the Jpeg
+ * @throws BadElementException
+ * @throws MalformedURLException
+ * @throws IOException
+ * @deprecated use Image.getInstance(...) to create an Image
+ */
+
+ public Jpeg(String filename, float width, float height) throws BadElementException, MalformedURLException, IOException {
+ this(Image.toURL(filename), width, height);
+ }
+
+ /**
+ * Constructs a <CODE>Jpeg</CODE>-object from memory.
+ *
+ * @param img the memory image
+ * @throws BadElementException
+ * @throws IOException
+ */
+
+ public Jpeg(byte[] img) throws BadElementException, IOException {
+ super((URL)null);
+ rawData = img;
+ originalData = img;
+ processParameters();
+ }
+
+ /**
+ * Constructs a <CODE>Jpeg</CODE>-object from memory.
+ *
+ * @param img the memory image.
+ * @param width the width you want the image to have
+ * @param height the height you want the image to have
+ * @throws BadElementException
+ * @throws IOException
+ */
+
+ public Jpeg(byte[] img, float width, float height) throws BadElementException, IOException {
+ this(img);
+ scaledWidth = width;
+ scaledHeight = height;
+ }
+
+ // private static methods
+
+ /**
+ * Reads a short from the <CODE>InputStream</CODE>.
+ *
+ * @param is the <CODE>InputStream</CODE>
+ * @return an int
+ * @throws IOException
+ */
+
+ private static final int getShort(InputStream is) throws IOException {
+ return (is.read() << 8) + is.read();
+ }
+
+ /**
+ * Returns a type of marker.
+ *
+ * @param marker an int
+ * @return a type: <VAR>VALID_MARKER</CODE>, <VAR>UNSUPPORTED_MARKER</VAR> or <VAR>NOPARAM_MARKER</VAR>
+ */
+
+ private static final int marker(int marker) {
+ for (int i = 0; i < VALID_MARKERS.length; i++) {
+ if (marker == VALID_MARKERS[i]) {
+ return VALID_MARKER;
+ }
+ }
+ for (int i = 0; i < NOPARAM_MARKERS.length; i++) {
+ if (marker == NOPARAM_MARKERS[i]) {
+ return NOPARAM_MARKER;
+ }
+ }
+ for (int i = 0; i < UNSUPPORTED_MARKERS.length; i++) {
+ if (marker == UNSUPPORTED_MARKERS[i]) {
+ return UNSUPPORTED_MARKER;
+ }
+ }
+ return NOT_A_MARKER;
+ }
+
+ // private methods
+
+ /**
+ * This method checks if the image is a valid JPEG and processes some parameters.
+ * @throws BadElementException
+ * @throws IOException
+ */
+
+ private void processParameters() throws BadElementException, IOException {
+ type = JPEG;
+ originalType = ORIGINAL_JPEG;
+ InputStream is = null;
+ try {
+ String errorID;
+ if (rawData == null){
+ is = url.openStream();
+ errorID = url.toString();
+ }
+ else{
+ is = new java.io.ByteArrayInputStream(rawData);
+ errorID = "Byte array";
+ }
+ if (is.read() != 0xFF || is.read() != 0xD8) {
+ throw new BadElementException(errorID + " is not a valid JPEG-file.");
+ }
+ boolean firstPass = true;
+ int len;
+ while (true) {
+ int v = is.read();
+ if (v < 0)
+ throw new IOException("Premature EOF while reading JPG.");
+ if (v == 0xFF) {
+ int marker = is.read();
+ if (firstPass && marker == M_APP0) {
+ firstPass = false;
+ len = getShort(is);
+ if (len < 16) {
+ skip(is, len - 2);
+ continue;
+ }
+ byte bcomp[] = new byte[JFIF_ID.length];
+ int r = is.read(bcomp);
+ if (r != bcomp.length)
+ throw new BadElementException(errorID + " corrupted JFIF marker.");
+ boolean found = true;
+ for (int k = 0; k < bcomp.length; ++k) {
+ if (bcomp[k] != JFIF_ID[k]) {
+ found = false;
+ break;
+ }
+ }
+ if (!found) {
+ skip(is, len - 2 - bcomp.length);
+ continue;
+ }
+ skip(is, 2);
+ int units = is.read();
+ int dx = getShort(is);
+ int dy = getShort(is);
+ if (units == 1) {
+ dpiX = dx;
+ dpiY = dy;
+ }
+ else if (units == 2) {
+ dpiX = (int)((float)dx * 2.54f + 0.5f);
+ dpiY = (int)((float)dy * 2.54f + 0.5f);
+ }
+ skip(is, len - 2 - bcomp.length - 7);
+ continue;
+ }
+ if (marker == M_APPE) {
+ len = getShort(is);
+ byte[] byteappe = new byte[len];
+ for (int k = 0; k < len; ++k) {
+ byteappe[k] = (byte)is.read();
+ }
+ if (byteappe.length > 12) {
+ String appe = new String(byteappe, 0, 5, "ISO-8859-1");
+ if (appe.equals("Adobe")) {
+ invert = true;
+ }
+ }
+ }
+ firstPass = false;
+ int markertype = marker(marker);
+ if (markertype == VALID_MARKER) {
+ skip(is, 2);
+ if (is.read() != 0x08) {
+ throw new BadElementException(errorID + " must have 8 bits per component.");
+ }
+ scaledHeight = getShort(is);
+ setTop(scaledHeight);
+ scaledWidth = getShort(is);
+ setRight(scaledWidth);
+ colorspace = is.read();
+ bpc = 8;
+ break;
+ }
+ else if (markertype == UNSUPPORTED_MARKER) {
+ throw new BadElementException(errorID + ": unsupported JPEG marker: " + marker);
+ }
+ else if (markertype != NOPARAM_MARKER) {
+ skip(is, getShort(is) - 2);
+ }
+ }
+ }
+ }
+ finally {
+ if (is != null) {
+ is.close();
+ }
+ plainWidth = width();
+ plainHeight = height();
+ }
+ }
+}
diff --git a/src/main/java/com/lowagie/text/List.java b/src/main/java/com/lowagie/text/List.java
new file mode 100644
index 0000000..547cd31
--- /dev/null
+++ b/src/main/java/com/lowagie/text/List.java
@@ -0,0 +1,558 @@
+/*
+ * $Id: List.java,v 1.76 2005/09/27 23:28:52 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.Properties;
+import java.util.Set;
+
+/**
+ * A <CODE>List</CODE> contains several <CODE>ListItem</CODE>s.
+ * <P>
+ * <B>Example 1:</B>
+ * <BLOCKQUOTE><PRE>
+ * <STRONG>List list = new List(true, 20);</STRONG>
+ * <STRONG>list.add(new ListItem("First line"));</STRONG>
+ * <STRONG>list.add(new ListItem("The second line is longer to see what happens once the end of the line is reached. Will it start on a new line?"));</STRONG>
+ * <STRONG>list.add(new ListItem("Third line"));</STRONG>
+ * </PRE></BLOCKQUOTE>
+ *
+ * The result of this code looks like this:
+ * <OL>
+ * <LI>
+ * First line
+ * </LI>
+ * <LI>
+ * The second line is longer to see what happens once the end of the line is reached. Will it start on a new line?
+ * </LI>
+ * <LI>
+ * Third line
+ * </LI>
+ * </OL>
+ *
+ * <B>Example 2:</B>
+ * <BLOCKQUOTE><PRE>
+ * <STRONG>List overview = new List(false, 10);</STRONG>
+ * <STRONG>overview.add(new ListItem("This is an item"));</STRONG>
+ * <STRONG>overview.add("This is another item");</STRONG>
+ * </PRE></BLOCKQUOTE>
+ *
+ * The result of this code looks like this:
+ * <UL>
+ * <LI>
+ * This is an item
+ * </LI>
+ * <LI>
+ * This is another item
+ * </LI>
+ * </UL>
+ *
+ * @see Element
+ * @see ListItem
+ */
+
+public class List implements TextElementArray, MarkupAttributes {
+
+ // membervariables
+ /** a possible value for the numbered parameter */
+ public static final boolean ORDERED = true;
+ /** a possible value for the numbered parameter */
+ public static final boolean UNORDERED = false;
+ /** a possible value for the lettered parameter */
+ public static final boolean NUMBERICAL = false;
+ /** a possible value for the lettered parameter */
+ public static final boolean ALPHABETICAL = true;
+
+
+/** This is the <CODE>ArrayList</CODE> containing the different <CODE>ListItem</CODE>s. */
+ protected ArrayList list = new ArrayList();
+
+/** This variable indicates if the list has to be numbered. */
+ protected boolean numbered;
+ protected boolean lettered;
+
+/** This variable indicates the first number of a numbered list. */
+ protected int first = 1;
+ protected char firstCh = 'A';
+ protected char lastCh = 'Z';
+
+/** This is the listsymbol of a list that is not numbered. */
+ protected Chunk symbol = new Chunk("-");
+
+/** The indentation of this list on the left side. */
+ protected float indentationLeft = 0;
+
+/** The indentation of this list on the right side. */
+ protected float indentationRight = 0;
+
+/** The indentation of the listitems. */
+ protected float symbolIndent;
+
+/** Contains extra markupAttributes */
+ protected Properties markupAttributes;
+
+ // constructors
+
+/**
+ * Constructs a <CODE>List</CODE>.
+ * <P>
+ * Remark: the parameter <VAR>symbolIndent</VAR> is important for instance when
+ * generating PDF-documents; it indicates the indentation of the listsymbol.
+ * It is not important for HTML-documents.
+ *
+ * @param numbered a boolean
+ * @param symbolIndent the indentation that has to be used for the listsymbol
+ */
+
+ public List(boolean numbered, float symbolIndent) {
+ this.numbered = numbered;
+ this.lettered = false;
+ this.symbolIndent = symbolIndent;
+ }
+
+ /**
+ * Creates a list
+ * @param numbered has the list to be numbered?
+ * @param lettered has the list to be 'numbered' with letters
+ * @param symbolIndent the indentation of the symbol
+ */
+ public List(boolean numbered, boolean lettered, float symbolIndent ) {
+ this.numbered = numbered;
+ this.lettered = lettered;
+ this.symbolIndent = symbolIndent;
+ }
+
+ /**
+ * Returns a <CODE>List</CODE> that has been constructed taking in account
+ * the value of some <VAR>attributes</VAR>.
+ *
+ * @param attributes Some attributes
+ */
+
+ public List(Properties attributes) {
+ String value= (String)attributes.remove(ElementTags.LISTSYMBOL);
+ if (value == null) {
+ value = "-";
+ }
+ symbol = new Chunk(value, FontFactory.getFont(attributes));
+
+ this.numbered = false;
+ if ((value = (String)attributes.remove(ElementTags.NUMBERED)) != null) {
+ this.numbered = new Boolean(value).booleanValue();
+ if ( this.lettered && this.numbered )
+ this.lettered = false;
+ }
+ if ((value = (String)attributes.remove(ElementTags.LETTERED)) != null) {
+ this.lettered = new Boolean(value).booleanValue();
+ if ( this.numbered && this.lettered )
+ this.numbered = false;
+ }
+ this.symbolIndent = 0;
+ if ((value = (String)attributes.remove(ElementTags.SYMBOLINDENT)) != null) {
+ this.symbolIndent = Float.parseFloat(value);
+ }
+
+ if ((value = (String)attributes.remove(ElementTags.FIRST)) != null) {
+ char khar = value.charAt(0);
+ if ( Character.isLetter( khar ) ) {
+ setFirst( khar );
+ }
+ else {
+ setFirst(Integer.parseInt(value));
+ }
+ }
+ if ((value = (String)attributes.remove(ElementTags.INDENTATIONLEFT)) != null) {
+ setIndentationLeft(Float.valueOf(value + "f").floatValue());
+ }
+ if ((value = (String)attributes.remove(ElementTags.INDENTATIONRIGHT)) != null) {
+ setIndentationRight(Float.valueOf(value + "f").floatValue());
+ }
+ if (attributes.size() > 0) setMarkupAttributes(attributes);
+ }
+
+ // implementation of the Element-methods
+
+/**
+ * Processes the element by adding it (or the different parts) to an
+ * <CODE>ElementListener</CODE>.
+ *
+ * @param listener an <CODE>ElementListener</CODE>
+ * @return <CODE>true</CODE> if the element was processed successfully
+ */
+
+ public boolean process(ElementListener listener) {
+ try {
+ for (Iterator i = list.iterator(); i.hasNext(); ) {
+ listener.add((Element) i.next());
+ }
+ return true;
+ }
+ catch(DocumentException de) {
+ return false;
+ }
+ }
+
+/**
+ * Gets the type of the text element.
+ *
+ * @return a type
+ */
+
+ public int type() {
+ return Element.LIST;
+ }
+
+/**
+ * Gets all the chunks in this element.
+ *
+ * @return an <CODE>ArrayList</CODE>
+ */
+
+ public ArrayList getChunks() {
+ ArrayList tmp = new ArrayList();
+ for (Iterator i = list.iterator(); i.hasNext(); ) {
+ tmp.addAll(((Element) i.next()).getChunks());
+ }
+ return tmp;
+ }
+
+ // methods to set the membervariables
+
+/**
+ * Adds an <CODE>Object</CODE> to the <CODE>List</CODE>.
+ *
+ * @param o the object to add.
+ * @return true if adding the object succeeded
+ */
+
+ public boolean add(Object o) {
+ if (o instanceof ListItem) {
+ ListItem item = (ListItem) o;
+ if (numbered || lettered) {
+ Chunk chunk;
+ if ( lettered )
+ chunk = new Chunk(nextLetter(), symbol.font());
+ else
+ chunk = new Chunk(String.valueOf(first + list.size()), symbol.font());
+ chunk.append(".");
+ item.setListSymbol(chunk);
+ }
+ else {
+ item.setListSymbol(symbol);
+ }
+ item.setIndentationLeft(symbolIndent);
+ item.setIndentationRight(0);
+ list.add(item);
+ }
+ else if (o instanceof List) {
+ List nested = (List) o;
+ nested.setIndentationLeft(nested.indentationLeft() + symbolIndent);
+ first--;
+ return list.add(nested);
+ }
+ else if (o instanceof String) {
+ return this.add(new ListItem((String) o));
+ }
+ return false;
+ }
+
+/**
+ * Sets the indentation of this paragraph on the left side.
+ *
+ * @param indentation the new indentation
+ */
+
+ public void setIndentationLeft(float indentation) {
+ this.indentationLeft = indentation;
+ }
+
+/**
+ * Sets the indentation of this paragraph on the right side.
+ *
+ * @param indentation the new indentation
+ */
+
+ public void setIndentationRight(float indentation) {
+ this.indentationRight = indentation;
+ }
+
+/**
+ * Sets the number that has to come first in the list.
+ *
+ * @param first a number
+ */
+
+ public void setFirst(int first) {
+ this.first = first;
+ }
+
+
+/**
+ * Sets the Letter that has to come first in the list.
+ *
+ * @param first a letter
+ */
+
+ public void setFirst(char first) {
+ this.firstCh = first;
+ if ( Character.isLowerCase( this.firstCh )) {
+ this.lastCh = 'z';
+ }
+ else {
+ this.lastCh = 'Z';
+ }
+ }
+
+/**
+ * Sets the listsymbol.
+ *
+ * @param symbol a <CODE>Chunk</CODE>
+ */
+
+ public void setListSymbol(Chunk symbol) {
+ this.symbol = symbol;
+ }
+
+/**
+ * Sets the listsymbol.
+ * <P>
+ * This is a shortcut for <CODE>setListSymbol(Chunk symbol)</CODE>.
+ *
+ * @param symbol a <CODE>String</CODE>
+ */
+
+ public void setListSymbol(String symbol) {
+ this.symbol = new Chunk(symbol);
+ }
+
+ // methods to retrieve information
+
+/**
+ * Gets all the items in the list.
+ *
+ * @return an <CODE>ArrayList</CODE> containing <CODE>ListItem</CODE>s.
+ */
+
+ public ArrayList getItems() {
+ return list;
+ }
+
+/**
+ * Gets the size of the list.
+ *
+ * @return a <CODE>size</CODE>
+ */
+
+ public int size() {
+ return list.size();
+ }
+
+/**
+ * Gets the leading of the first listitem.
+ *
+ * @return a <CODE>leading</CODE>
+ */
+
+ public float leading() {
+ if (list.size() < 1) {
+ return -1;
+ }
+ ListItem item = (ListItem) list.get(0);
+ return item.leading();
+ }
+
+/**
+ * Checks if the list is numbered.
+ *
+ * @return <CODE>true</CODE> if the list is numbered, <CODE>false</CODE> otherwise.
+ */
+
+ public boolean isNumbered() {
+ return numbered;
+ }
+
+/**
+ * Gets the symbol indentation.
+ * @return the symbol indentation
+ */
+
+ public float symbolIndent() {
+ return symbolIndent;
+ }
+
+/**
+ * Gets the Chunk containing the symbol.
+ * @return a Chunk with a symbol
+ */
+
+ public Chunk symbol() {
+ return symbol;
+ }
+
+/**
+ * Gets the first number .
+ * @return a number
+ */
+
+ public int first() {
+ return first;
+ }
+
+/**
+ * Gets the indentation of this paragraph on the left side.
+ *
+ * @return the indentation
+ */
+
+ public float indentationLeft() {
+ return indentationLeft;
+ }
+
+/**
+ * Gets the indentation of this paragraph on the right side.
+ *
+ * @return the indentation
+ */
+
+ public float indentationRight() {
+ return indentationRight;
+ }
+
+/**
+ * Checks if a given tag corresponds with the listsymbol tag of this object.
+ *
+ * @param tag the given tag
+ * @return true if the tag corresponds
+ */
+
+ public static boolean isSymbol(String tag) {
+ return ElementTags.LISTSYMBOL.equals(tag);
+ }
+
+/**
+ * Checks if a given tag corresponds with this object.
+ *
+ * @param tag the given tag
+ * @return true if the tag corresponds
+ */
+
+ public static boolean isTag(String tag) {
+ return ElementTags.LIST.equals(tag);
+ }
+
+/**
+ * Retrieves the next letter in the sequence
+ *
+ * @return String contains the next character (A-Z or a-z)
+ */
+ private String nextLetter() {
+ int num_in_list = listItemsInList(); //list.size();
+ int max_ival = (lastCh + 0);
+ int ival = (firstCh + num_in_list);
+ while ( ival > max_ival ) {
+ ival -= 26;
+ }
+ char[] new_char = new char[1];
+ new_char[0] = (char) ival;
+ String ret = new String( new_char );
+ return ret;
+ }
+
+ /**
+ * Counts the number of ListItems in the list ommiting nested lists
+ *
+ * @return Integer number of ListItems in the list
+ */
+ private int listItemsInList() {
+ int result = 0;
+ for (Iterator i = list.iterator(); i.hasNext(); ) {
+ if (!(i.next() instanceof List)) result++;
+ }
+ return result;
+ }
+
+/**
+ * @see com.lowagie.text.MarkupAttributes#setMarkupAttribute(java.lang.String, java.lang.String)
+ */
+ public void setMarkupAttribute(String name, String value) {
+ if (markupAttributes == null) markupAttributes = new Properties();
+ markupAttributes.put(name, value);
+ }
+
+/**
+ * @see com.lowagie.text.MarkupAttributes#setMarkupAttributes(java.util.Properties)
+ */
+ public void setMarkupAttributes(Properties markupAttributes) {
+ this.markupAttributes = markupAttributes;
+ }
+
+/**
+ * @see com.lowagie.text.MarkupAttributes#getMarkupAttribute(java.lang.String)
+ */
+ public String getMarkupAttribute(String name) {
+ return (markupAttributes == null) ? null : String.valueOf(markupAttributes.get(name));
+ }
+
+/**
+ * @see com.lowagie.text.MarkupAttributes#getMarkupAttributeNames()
+ */
+ public Set getMarkupAttributeNames() {
+ return Chunk.getKeySet(markupAttributes);
+ }
+
+/**
+ * @see com.lowagie.text.MarkupAttributes#getMarkupAttributes()
+ */
+ public Properties getMarkupAttributes() {
+ return markupAttributes;
+ }
+}
diff --git a/src/main/java/com/lowagie/text/ListItem.java b/src/main/java/com/lowagie/text/ListItem.java
new file mode 100644
index 0000000..b16848b
--- /dev/null
+++ b/src/main/java/com/lowagie/text/ListItem.java
@@ -0,0 +1,293 @@
+/*
+ * $Id: ListItem.java,v 1.79 2006/04/12 11:41:05 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text;
+
+import java.util.Properties;
+
+import com.lowagie.text.markup.MarkupTags;
+import com.lowagie.text.markup.MarkupParser;
+
+/**
+ * A <CODE>ListItem</CODE> is a <CODE>Paragraph</CODE>
+ * that can be added to a <CODE>List</CODE>.
+ * <P>
+ * <B>Example 1:</B>
+ * <BLOCKQUOTE><PRE>
+ * List list = new List(true, 20);
+ * list.add(<STRONG>new ListItem("First line")</STRONG>);
+ * list.add(<STRONG>new ListItem("The second line is longer to see what happens once the end of the line is reached. Will it start on a new line?")</STRONG>);
+ * list.add(<STRONG>new ListItem("Third line")</STRONG>);
+ * </PRE></BLOCKQUOTE>
+ *
+ * The result of this code looks like this:
+ * <OL>
+ * <LI>
+ * First line
+ * </LI>
+ * <LI>
+ * The second line is longer to see what happens once the end of the line is reached. Will it start on a new line?
+ * </LI>
+ * <LI>
+ * Third line
+ * </LI>
+ * </OL>
+ *
+ * <B>Example 2:</B>
+ * <BLOCKQUOTE><PRE>
+ * List overview = new List(false, 10);
+ * overview.add(<STRONG>new ListItem("This is an item")</STRONG>);
+ * overview.add("This is another item");
+ * </PRE></BLOCKQUOTE>
+ *
+ * The result of this code looks like this:
+ * <UL>
+ * <LI>
+ * This is an item
+ * </LI>
+ * <LI>
+ * This is another item
+ * </LI>
+ * </UL>
+ *
+ * @see Element
+ * @see List
+ * @see Paragraph
+ */
+
+public class ListItem extends Paragraph implements TextElementArray, MarkupAttributes {
+
+ // membervariables
+
+/** this is the symbol that wil proceed the listitem. */
+ private Chunk symbol;
+
+ // constructors
+
+/**
+ * Constructs a <CODE>ListItem</CODE>.
+ */
+
+ public ListItem() {
+ super();
+ }
+
+/**
+ * Constructs a <CODE>ListItem</CODE> with a certain leading.
+ *
+ * @param leading the leading
+ */
+
+ public ListItem(float leading) {
+ super(leading);
+ }
+
+/**
+ * Constructs a <CODE>ListItem</CODE> with a certain <CODE>Chunk</CODE>.
+ *
+ * @param chunk a <CODE>Chunk</CODE>
+ */
+
+ public ListItem(Chunk chunk) {
+ super(chunk);
+ }
+
+/**
+ * Constructs a <CODE>ListItem</CODE> with a certain <CODE>String</CODE>.
+ *
+ * @param string a <CODE>String</CODE>
+ */
+
+ public ListItem(String string) {
+ super(string);
+ }
+
+/**
+ * Constructs a <CODE>ListItem</CODE> with a certain <CODE>String</CODE>
+ * and a certain <CODE>Font</CODE>.
+ *
+ * @param string a <CODE>String</CODE>
+ * @param font a <CODE>String</CODE>
+ */
+
+ public ListItem(String string, Font font) {
+ super(string, font);
+ }
+
+/**
+ * Constructs a <CODE>ListItem</CODE> with a certain <CODE>Chunk</CODE>
+ * and a certain leading.
+ *
+ * @param leading the leading
+ * @param chunk a <CODE>Chunk</CODE>
+ */
+
+ public ListItem(float leading, Chunk chunk) {
+ super(leading, chunk);
+ }
+
+/**
+ * Constructs a <CODE>ListItem</CODE> with a certain <CODE>String</CODE>
+ * and a certain leading.
+ *
+ * @param leading the leading
+ * @param string a <CODE>String</CODE>
+ */
+
+ public ListItem(float leading, String string) {
+ super(leading, string);
+ }
+
+/**
+ * Constructs a <CODE>ListItem</CODE> with a certain leading, <CODE>String</CODE>
+ * and <CODE>Font</CODE>.
+ *
+ * @param leading the leading
+ * @param string a <CODE>String</CODE>
+ * @param font a <CODE>Font</CODE>
+ */
+
+ public ListItem(float leading, String string, Font font) {
+ super(leading, string, font);
+ }
+
+/**
+ * Constructs a <CODE>ListItem</CODE> with a certain <CODE>Phrase</CODE>.
+ *
+ * @param phrase a <CODE>Phrase</CODE>
+ */
+
+ public ListItem(Phrase phrase) {
+ super(phrase);
+ }
+
+ /**
+ * Returns a <CODE>ListItem</CODE> that has been constructed taking in account
+ * the value of some <VAR>attributes</VAR>.
+ *
+ * @param attributes Some attributes
+ */
+
+ public ListItem(Properties attributes) {
+ super("", FontFactory.getFont(attributes));
+ String value;
+ if ((value = (String)attributes.remove(ElementTags.ITEXT)) != null) {
+ add(new Chunk(value));
+ }
+ if ((value = (String)attributes.remove(ElementTags.LEADING)) != null) {
+ setLeading(Float.valueOf(value + "f").floatValue());
+ }
+ else if ((value = (String)attributes.remove(MarkupTags.CSS_KEY_LINEHEIGHT)) != null) {
+ setLeading(MarkupParser.parseLength(value));
+ }
+ if ((value = (String)attributes.remove(ElementTags.INDENTATIONLEFT)) != null) {
+ setIndentationLeft(Float.valueOf(value + "f").floatValue());
+ }
+ if ((value = (String)attributes.remove(ElementTags.INDENTATIONRIGHT)) != null) {
+ setIndentationRight(Float.valueOf(value + "f").floatValue());
+ }
+ if ((value = (String)attributes.remove(ElementTags.ALIGN)) != null) {
+ setAlignment(value);
+ }
+ if (attributes.size() > 0) setMarkupAttributes(attributes);
+ }
+
+ // implementation of the Element-methods
+
+/**
+ * Gets the type of the text element.
+ *
+ * @return a type
+ */
+
+ public int type() {
+ return Element.LISTITEM;
+ }
+
+ // methods
+
+/**
+ * Sets the listsymbol.
+ *
+ * @param symbol a <CODE>Chunk</CODE>
+ */
+
+ public void setListSymbol(Chunk symbol) {
+ if (this.symbol == null) {
+ this.symbol = symbol;
+ if (this.symbol.font().isStandardFont()) {
+ this.symbol.setFont(font);
+ }
+ }
+ }
+
+ // methods to retrieve information
+
+/**
+ * Returns the listsymbol.
+ *
+ * @return a <CODE>Chunk</CODE>
+ */
+
+ public Chunk listSymbol() {
+ return symbol;
+ }
+
+/**
+ * Checks if a given tag corresponds with this object.
+ *
+ * @param tag the given tag
+ * @return true if the tag corresponds
+ */
+
+ public static boolean isTag(String tag) {
+ return ElementTags.LISTITEM.equals(tag);
+ }
+}
diff --git a/src/main/java/com/lowagie/text/MarkupAttributes.java b/src/main/java/com/lowagie/text/MarkupAttributes.java
new file mode 100644
index 0000000..53c13f7
--- /dev/null
+++ b/src/main/java/com/lowagie/text/MarkupAttributes.java
@@ -0,0 +1,102 @@
+/*
+ * Copyright 2002 by Matt Benson.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text;
+
+
+import java.util.Set;
+import java.util.Properties;
+
+
+/**
+ * Defines the interface for an <CODE>Element</CODE> with markup attributes--
+ * that is, random String-to-String properties for representation in markup
+ * languages such as HTML and XML.
+ *
+ * @author <a href="mailto:orangeherbert@users.sourceforge.net">Matt Benson</a>
+ */
+public interface MarkupAttributes extends com.lowagie.text.Element {
+
+/**
+ * Sets the specified attribute.
+ *
+ * @param name <CODE>String</CODE> attribute name.
+ * @param value <CODE>String</CODE> attribute value.
+ */
+ public void setMarkupAttribute(String name, String value);
+
+/**
+ * Sets the markupAttributes.
+ *
+ * @param markupAttributes a <CODE>Properties</CODE>-object containing markupattributes
+ */
+ public void setMarkupAttributes(Properties markupAttributes);
+
+/**
+ * Returns the value of the specified attribute.
+ *
+ * @param name <CODE>String</CODE> attribute name.
+ * @return <CODE>String</CODE>.
+ */
+ public String getMarkupAttribute(String name);
+
+/**
+ * Returns a <CODE>Set</CODE> of <CODE>String</CODE> attribute names for the
+ * <CODE>MarkupAttributes</CODE> implementor.
+ *
+ * @return <CODE>Set</CODE>.
+ */
+ public Set getMarkupAttributeNames();
+
+/**
+ * Return a <CODE>Properties</CODE>-object containing all the markupAttributes.
+ *
+ * @return <CODE>Properties</CODE>
+ */
+ public Properties getMarkupAttributes();
+
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/Meta.java b/src/main/java/com/lowagie/text/Meta.java
new file mode 100644
index 0000000..d34c1d3
--- /dev/null
+++ b/src/main/java/com/lowagie/text/Meta.java
@@ -0,0 +1,263 @@
+/*
+ * $Id: Meta.java,v 1.65 2005/04/13 09:17:11 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text;
+
+import java.util.ArrayList;
+import java.util.Properties;
+import java.util.Set;
+
+/**
+ * This is an <CODE>Element</CODE> that contains
+ * some meta information about the document.
+ * <P>
+ * An object of type <CODE>Meta</CODE> can not be constructed by the user.
+ * Userdefined meta information should be placed in a <CODE>Header</CODE>-object.
+ * <CODE>Meta</CODE> is reserved for: Subject, Keywords, Author, Title, Producer
+ * and Creationdate information.
+ *
+ * @see Element
+ * @see Header
+ */
+
+public class Meta implements Element, MarkupAttributes {
+
+ // membervariables
+
+/** This is the type of Meta-information this object contains. */
+ private int type;
+
+/** This is the content of the Meta-information. */
+ private StringBuffer content;
+
+/** Contains extra markupAttributes */
+ protected Properties markupAttributes;
+
+ // constructors
+
+/**
+ * Constructs a <CODE>Meta</CODE>.
+ *
+ * @param type the type of meta-information
+ * @param content the content
+ */
+
+ Meta(int type, String content) {
+ this.type = type;
+ this.content = new StringBuffer(content);
+ }
+
+/**
+ * Constructs a <CODE>Meta</CODE>.
+ *
+ * @param tag the tagname of the meta-information
+ * @param content the content
+ */
+
+ public Meta(String tag, String content) {
+ this.type = Meta.getType(tag);
+ this.content = new StringBuffer(content);
+ }
+
+ // implementation of the Element-methods
+
+/**
+ * Processes the element by adding it (or the different parts) to a
+ * <CODE>ElementListener</CODE>.
+ *
+ * @param listener the <CODE>ElementListener</CODE>
+ * @return <CODE>true</CODE> if the element was processed successfully
+ */
+
+ public boolean process(ElementListener listener) {
+ try {
+ return listener.add(this);
+ }
+ catch(DocumentException de) {
+ return false;
+ }
+ }
+
+/**
+ * Gets the type of the text element.
+ *
+ * @return a type
+ */
+
+ public int type() {
+ return type;
+ }
+
+/**
+ * Gets all the chunks in this element.
+ *
+ * @return an <CODE>ArrayList</CODE>
+ */
+
+ public ArrayList getChunks() {
+ return new ArrayList();
+ }
+
+ // methods
+
+/**
+ * appends some text to this <CODE>Meta</CODE>.
+ *
+ * @param string a <CODE>String</CODE>
+ * @return a <CODE>StringBuffer</CODE>
+ */
+
+ public StringBuffer append(String string) {
+ return content.append(string);
+ }
+
+ // methods to retrieve information
+
+/**
+ * Returns the content of the meta information.
+ *
+ * @return a <CODE>String</CODE>
+ */
+
+ public String content() {
+ return content.toString();
+ }
+
+/**
+ * Returns the name of the meta information.
+ *
+ * @return a <CODE>String</CODE>
+ */
+
+ public String name() {
+ switch (type) {
+ case Element.SUBJECT:
+ return ElementTags.SUBJECT;
+ case Element.KEYWORDS:
+ return ElementTags.KEYWORDS;
+ case Element.AUTHOR:
+ return ElementTags.AUTHOR;
+ case Element.TITLE:
+ return ElementTags.TITLE;
+ case Element.PRODUCER:
+ return ElementTags.PRODUCER;
+ case Element.CREATIONDATE:
+ return ElementTags.CREATIONDATE;
+ default:
+ return ElementTags.UNKNOWN;
+ }
+ }
+
+/**
+ * Returns the name of the meta information.
+ *
+ * @param tag iText tag for meta information
+ * @return the Element value corresponding with the given tag
+ */
+
+ public static int getType(String tag) {
+ if (ElementTags.SUBJECT.equals(tag)) {
+ return Element.SUBJECT;
+ }
+ if (ElementTags.KEYWORDS.equals(tag)) {
+ return Element.KEYWORDS;
+ }
+ if (ElementTags.AUTHOR.equals(tag)) {
+ return Element.AUTHOR;
+ }
+ if (ElementTags.TITLE.equals(tag)) {
+ return Element.TITLE;
+ }
+ if (ElementTags.PRODUCER.equals(tag)) {
+ return Element.PRODUCER;
+ }
+ if (ElementTags.CREATIONDATE.equals(tag)) {
+ return Element.CREATIONDATE;
+ }
+ return Element.HEADER;
+ }
+
+
+/**
+ * @see com.lowagie.text.MarkupAttributes#setMarkupAttribute(java.lang.String, java.lang.String)
+ */
+ public void setMarkupAttribute(String name, String value) {
+ if (markupAttributes == null) markupAttributes = new Properties();
+ markupAttributes.put(name, value);
+ }
+
+/**
+ * @see com.lowagie.text.MarkupAttributes#setMarkupAttributes(java.util.Properties)
+ */
+ public void setMarkupAttributes(Properties markupAttributes) {
+ this.markupAttributes = markupAttributes;
+ }
+
+/**
+ * @see com.lowagie.text.MarkupAttributes#getMarkupAttribute(java.lang.String)
+ */
+ public String getMarkupAttribute(String name) {
+ return (markupAttributes == null) ? null : String.valueOf(markupAttributes.get(name));
+ }
+
+/**
+ * @see com.lowagie.text.MarkupAttributes#getMarkupAttributeNames()
+ */
+ public Set getMarkupAttributeNames() {
+ return Chunk.getKeySet(markupAttributes);
+ }
+
+/**
+ * @see com.lowagie.text.MarkupAttributes#getMarkupAttributes()
+ */
+ public Properties getMarkupAttributes() {
+ return markupAttributes;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/PageSize.java b/src/main/java/com/lowagie/text/PageSize.java
new file mode 100644
index 0000000..f89c319
--- /dev/null
+++ b/src/main/java/com/lowagie/text/PageSize.java
@@ -0,0 +1,152 @@
+/*
+ * $Id: PageSize.java,v 1.58 2005/05/04 14:31:08 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text;
+
+/**
+ * The <CODE>PageSize</CODE>-object contains a number of rectangles representing the most common papersizes.
+ *
+ * @see Rectangle
+ */
+
+public class PageSize {
+
+ // membervariables
+
+/** This is the letter format */
+ public static final Rectangle LETTER = new Rectangle(612,792);
+
+/** This is the note format */
+ public static final Rectangle NOTE = new Rectangle(540,720);
+
+/** This is the legal format */
+ public static final Rectangle LEGAL = new Rectangle(612,1008);
+
+/** This is the a0 format */
+ public static final Rectangle A0 = new Rectangle(2384,3370);
+
+/** This is the a1 format */
+ public static final Rectangle A1 = new Rectangle(1684,2384);
+
+/** This is the a2 format */
+ public static final Rectangle A2 = new Rectangle(1190,1684);
+
+/** This is the a3 format */
+ public static final Rectangle A3 = new Rectangle(842,1190);
+
+/** This is the a4 format */
+ public static final Rectangle A4 = new Rectangle(595,842);
+
+/** This is the a5 format */
+ public static final Rectangle A5 = new Rectangle(421,595);
+
+/** This is the a6 format */
+ public static final Rectangle A6 = new Rectangle(297,421);
+
+/** This is the a7 format */
+ public static final Rectangle A7 = new Rectangle(210,297);
+
+/** This is the a8 format */
+ public static final Rectangle A8 = new Rectangle(148,210);
+
+/** This is the a9 format */
+ public static final Rectangle A9 = new Rectangle(105,148);
+
+/** This is the a10 format */
+ public static final Rectangle A10 = new Rectangle(74,105);
+
+/** This is the b0 format */
+ public static final Rectangle B0 = new Rectangle(2836,4008);
+
+/** This is the b1 format */
+ public static final Rectangle B1 = new Rectangle(2004,2836);
+
+/** This is the b2 format */
+ public static final Rectangle B2 = new Rectangle(1418,2004);
+
+/** This is the b3 format */
+ public static final Rectangle B3 = new Rectangle(1002,1418);
+
+/** This is the b4 format */
+ public static final Rectangle B4 = new Rectangle(709,1002);
+
+/** This is the b5 format */
+ public static final Rectangle B5 = new Rectangle(501,709);
+
+/** This is the archE format */
+ public static final Rectangle ARCH_E = new Rectangle(2592,3456);
+
+/** This is the archD format */
+ public static final Rectangle ARCH_D = new Rectangle(1728,2592);
+
+/** This is the archC format */
+ public static final Rectangle ARCH_C = new Rectangle(1296,1728);
+
+/** This is the archB format */
+ public static final Rectangle ARCH_B = new Rectangle(864,1296);
+
+/** This is the archA format */
+ public static final Rectangle ARCH_A = new Rectangle(648,864);
+
+/** This is the flsa format */
+ public static final Rectangle FLSA = new Rectangle(612,936);
+
+/** This is the flse format */
+ public static final Rectangle FLSE = new Rectangle(612,936);
+
+/** This is the halfletter format */
+ public static final Rectangle HALFLETTER = new Rectangle(396,612);
+
+/** This is the 11x17 format */
+ public static final Rectangle _11X17 = new Rectangle(792,1224);
+
+/** This is the ledger format */
+ public static final Rectangle LEDGER = new Rectangle(1224,792);
+}
diff --git a/src/main/java/com/lowagie/text/Paragraph.java b/src/main/java/com/lowagie/text/Paragraph.java
new file mode 100644
index 0000000..32031cc
--- /dev/null
+++ b/src/main/java/com/lowagie/text/Paragraph.java
@@ -0,0 +1,516 @@
+/*
+ * $Id: Paragraph.java,v 1.83 2005/05/03 13:03:48 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text;
+
+import java.util.Properties;
+
+import com.lowagie.text.markup.MarkupTags;
+import com.lowagie.text.markup.MarkupParser;
+
+/**
+ * A <CODE>Paragraph</CODE> is a series of <CODE>Chunk</CODE>s and/or <CODE>Phrases</CODE>.
+ * <P>
+ * A <CODE>Paragraph</CODE> has the same qualities of a <CODE>Phrase</CODE>, but also
+ * some additional layout-parameters:
+ * <UL>
+ * <LI>the indentation
+ * <LI>the alignment of the text
+ * </UL>
+ *
+ * Example:
+ * <BLOCKQUOTE><PRE>
+ * <STRONG>Paragraph p = new Paragraph("This is a paragraph",
+ * FontFactory.getFont(FontFactory.HELVETICA, 18, Font.BOLDITALIC, new Color(0, 0, 255)));</STRONG>
+ * </PRE></BLOCKQUOTE>
+ *
+ * @see Element
+ * @see Phrase
+ * @see ListItem
+ */
+
+public class Paragraph extends Phrase implements TextElementArray, MarkupAttributes {
+
+ // membervariables
+
+/** The alignment of the text. */
+ protected int alignment = Element.ALIGN_UNDEFINED;
+
+/** The indentation of this paragraph on the left side. */
+ protected float indentationLeft;
+
+/** The indentation of this paragraph on the right side. */
+ protected float indentationRight;
+
+/** The spacing before the paragraph. */
+ protected float spacingBefore;
+
+/** The spacing after the paragraph. */
+ protected float spacingAfter;
+
+/** Does the paragraph has to be kept together on 1 page. */
+ protected boolean keeptogether = false;
+
+ /** The text leading that is multiplied by the biggest font size in the line. */
+ protected float multipliedLeading = 0;
+
+ /**
+ * Holds value of property firstLineIndent.
+ */
+ private float firstLineIndent = 0;
+
+ /**
+ * Holds value of property extraParagraphSpace.
+ */
+ private float extraParagraphSpace = 0;
+
+ // constructors
+
+/**
+ * Constructs a <CODE>Paragraph</CODE>.
+ */
+
+ public Paragraph() {
+ super();
+ }
+
+/**
+ * Constructs a <CODE>Paragraph</CODE> with a certain leading.
+ *
+ * @param leading the leading
+ */
+
+ public Paragraph(float leading) {
+ super(leading);
+ }
+
+/**
+ * Constructs a <CODE>Paragraph</CODE> with a certain <CODE>Chunk</CODE>.
+ *
+ * @param chunk a <CODE>Chunk</CODE>
+ */
+
+ public Paragraph(Chunk chunk) {
+ super(chunk);
+ }
+
+/**
+ * Constructs a <CODE>Paragraph</CODE> with a certain <CODE>Chunk</CODE>
+ * and a certain leading.
+ *
+ * @param leading the leading
+ * @param chunk a <CODE>Chunk</CODE>
+ */
+
+ public Paragraph(float leading, Chunk chunk) {
+ super(leading, chunk);
+ }
+
+/**
+ * Constructs a <CODE>Paragraph</CODE> with a certain <CODE>String</CODE>.
+ *
+ * @param string a <CODE>String</CODE>
+ */
+
+ public Paragraph(String string) {
+ super(string);
+ }
+
+/**
+ * Constructs a <CODE>Paragraph</CODE> with a certain <CODE>String</CODE>
+ * and a certain <CODE>Font</CODE>.
+ *
+ * @param string a <CODE>String</CODE>
+ * @param font a <CODE>Font</CODE>
+ */
+
+ public Paragraph(String string, Font font) {
+ super(string, font);
+ }
+
+/**
+ * Constructs a <CODE>Paragraph</CODE> with a certain <CODE>String</CODE>
+ * and a certain leading.
+ *
+ * @param leading the leading
+ * @param string a <CODE>String</CODE>
+ */
+
+ public Paragraph(float leading, String string) {
+ super(leading, string);
+ }
+
+/**
+ * Constructs a <CODE>Paragraph</CODE> with a certain leading, <CODE>String</CODE>
+ * and <CODE>Font</CODE>.
+ *
+ * @param leading the leading
+ * @param string a <CODE>String</CODE>
+ * @param font a <CODE>Font</CODE>
+ */
+
+ public Paragraph(float leading, String string, Font font) {
+ super(leading, string, font);
+ }
+
+/**
+ * Constructs a <CODE>Paragraph</CODE> with a certain <CODE>Phrase</CODE>.
+ *
+ * @param phrase a <CODE>Phrase</CODE>
+ */
+
+ public Paragraph(Phrase phrase) {
+ super(phrase.leading, "", phrase.font());
+ super.add(phrase);
+ }
+
+/**
+ * Returns a <CODE>Paragraph</CODE> that has been constructed taking in account
+ * the value of some <VAR>attributes</VAR>.
+ *
+ * @param attributes Some attributes
+ */
+
+ public Paragraph(Properties attributes) {
+ this("", FontFactory.getFont(attributes));
+ String value;
+ if ((value = (String)attributes.remove(ElementTags.ITEXT)) != null) {
+ Chunk chunk = new Chunk(value);
+ if ((value = (String)attributes.remove(ElementTags.GENERICTAG)) != null) {
+ chunk.setGenericTag(value);
+ }
+ add(chunk);
+ }
+ if ((value = (String)attributes.remove(ElementTags.ALIGN)) != null) {
+ setAlignment(value);
+ }
+ if ((value = (String)attributes.remove(ElementTags.LEADING)) != null) {
+ setLeading(Float.valueOf(value + "f").floatValue());
+ }
+ else if ((value = (String)attributes.remove(MarkupTags.CSS_KEY_LINEHEIGHT)) != null) {
+ setLeading(MarkupParser.parseLength(value));
+ }
+ else {
+ setLeading(16);
+ }
+ if ((value = (String)attributes.remove(ElementTags.INDENTATIONLEFT)) != null) {
+ setIndentationLeft(Float.valueOf(value + "f").floatValue());
+ }
+ if ((value = (String)attributes.remove(ElementTags.INDENTATIONRIGHT)) != null) {
+ setIndentationRight(Float.valueOf(value + "f").floatValue());
+ }
+ if ((value = (String)attributes.remove(ElementTags.KEEPTOGETHER)) != null) {
+ keeptogether = new Boolean(value).booleanValue();
+ }
+ if (attributes.size() > 0) setMarkupAttributes(attributes);
+ }
+
+ // implementation of the Element-methods
+
+/**
+ * Gets the type of the text element.
+ *
+ * @return a type
+ */
+
+ public int type() {
+ return Element.PARAGRAPH;
+ }
+
+ // methods
+
+/**
+ * Adds an <CODE>Object</CODE> to the <CODE>Paragraph</CODE>.
+ *
+ * @param o object the object to add.
+ * @return true is adding the object succeeded
+ */
+
+ public boolean add(Object o) {
+ if (o instanceof List) {
+ List list = (List) o;
+ list.setIndentationLeft(list.indentationLeft() + indentationLeft);
+ list.setIndentationRight(indentationRight);
+ return super.add(list);
+ }
+ else if (o instanceof Image) {
+ super.addSpecial((Image) o);
+ return true;
+ }
+ else if (o instanceof Paragraph) {
+ super.add(o);
+ super.add(Chunk.NEWLINE);
+ return true;
+ }
+ return super.add(o);
+ }
+
+ // setting the membervariables
+
+/**
+ * Sets the alignment of this paragraph.
+ *
+ * @param alignment the new alignment
+ */
+
+ public void setAlignment(int alignment) {
+ this.alignment = alignment;
+ }
+
+/**
+ * Sets the alignment of this paragraph.
+ *
+ * @param alignment the new alignment as a <CODE>String</CODE>
+ */
+
+ public void setAlignment(String alignment) {
+ if (ElementTags.ALIGN_CENTER.equalsIgnoreCase(alignment)) {
+ this.alignment = Element.ALIGN_CENTER;
+ return;
+ }
+ if (ElementTags.ALIGN_RIGHT.equalsIgnoreCase(alignment)) {
+ this.alignment = Element.ALIGN_RIGHT;
+ return;
+ }
+ if (ElementTags.ALIGN_JUSTIFIED.equalsIgnoreCase(alignment)) {
+ this.alignment = Element.ALIGN_JUSTIFIED;
+ return;
+ }
+ if (ElementTags.ALIGN_JUSTIFIED_ALL.equalsIgnoreCase(alignment)) {
+ this.alignment = Element.ALIGN_JUSTIFIED_ALL;
+ return;
+ }
+ this.alignment = Element.ALIGN_LEFT;
+ }
+
+/**
+ * Sets the indentation of this paragraph on the left side.
+ *
+ * @param indentation the new indentation
+ */
+
+ public void setIndentationLeft(float indentation) {
+ this.indentationLeft = indentation;
+ }
+
+/**
+ * Sets the indentation of this paragraph on the right side.
+ *
+ * @param indentation the new indentation
+ */
+
+ public void setIndentationRight(float indentation) {
+ this.indentationRight = indentation;
+ }
+
+/**
+ * Sets the spacing before this paragraph.
+ *
+ * @param spacing the new spacing
+ */
+
+ public void setSpacingBefore(float spacing) {
+ this.spacingBefore = spacing;
+ }
+
+/**
+ * Sets the spacing after this paragraph.
+ *
+ * @param spacing the new spacing
+ */
+
+ public void setSpacingAfter(float spacing) {
+ this.spacingAfter = spacing;
+ }
+
+/**
+ * Indicates that the paragraph has to be kept together on one page.
+ *
+ * @param keeptogether true of the paragraph may not be split over 2 pages
+ */
+
+ public void setKeepTogether(boolean keeptogether) {
+ this.keeptogether = keeptogether;
+ }
+
+/**
+ * Checks if this paragraph has to be kept together on one page.
+ *
+ * @return true if the paragraph may not be split over 2 pages.
+ */
+
+ public boolean getKeepTogether() {
+ return keeptogether;
+ }
+
+ // methods to retrieve information
+
+/**
+ * Gets the alignment of this paragraph.
+ *
+ * @return alignment
+ */
+
+ public int alignment() {
+ return alignment;
+ }
+
+/**
+ * Gets the indentation of this paragraph on the left side.
+ *
+ * @return the indentation
+ */
+
+ public float indentationLeft() {
+ return indentationLeft;
+ }
+
+/**
+ * Gets the indentation of this paragraph on the right side.
+ *
+ * @return the indentation
+ */
+
+ public float indentationRight() {
+ return indentationRight;
+ }
+
+/**
+ * Gets the spacing before this paragraph.
+ *
+ * @return the spacing
+ */
+
+ public float spacingBefore() {
+ return spacingBefore;
+ }
+
+/**
+ * Gets the spacing before this paragraph.
+ *
+ * @return the spacing
+ */
+
+ public float spacingAfter() {
+ return spacingAfter;
+ }
+
+/**
+ * Checks if a given tag corresponds with this object.
+ *
+ * @param tag the given tag
+ * @return true if the tag corresponds
+ */
+
+ public static boolean isTag(String tag) {
+ return ElementTags.PARAGRAPH.equals(tag);
+ }
+
+ /**
+ * Sets the leading fixed and variable. The resultant leading will be
+ * fixedLeading+multipliedLeading*maxFontSize where maxFontSize is the
+ * size of the bigest font in the line.
+ * @param fixedLeading the fixed leading
+ * @param multipliedLeading the variable leading
+ */
+ public void setLeading(float fixedLeading, float multipliedLeading) {
+ this.leading = fixedLeading;
+ this.multipliedLeading = multipliedLeading;
+ }
+
+ /**
+ * @see com.lowagie.text.Phrase#setLeading(float)
+ */
+ public void setLeading(float fixedLeading) {
+ this.leading = fixedLeading;
+ this.multipliedLeading = 0;
+ }
+
+ /**
+ * Gets the variable leading
+ * @return the leading
+ */
+ public float getMultipliedLeading() {
+ return multipliedLeading;
+ }
+
+ /**
+ * Getter for property firstLineIndent.
+ * @return Value of property firstLineIndent.
+ */
+ public float getFirstLineIndent() {
+ return this.firstLineIndent;
+ }
+
+ /**
+ * Setter for property firstLineIndent.
+ * @param firstLineIndent New value of property firstLineIndent.
+ */
+ public void setFirstLineIndent(float firstLineIndent) {
+ this.firstLineIndent = firstLineIndent;
+ }
+
+ /**
+ * Getter for property extraParagraphSpace.
+ * @return Value of property extraParagraphSpace.
+ */
+ public float getExtraParagraphSpace() {
+ return this.extraParagraphSpace;
+ }
+
+ /**
+ * Setter for property extraParagraphSpace.
+ * @param extraParagraphSpace New value of property extraParagraphSpace.
+ */
+ public void setExtraParagraphSpace(float extraParagraphSpace) {
+ this.extraParagraphSpace = extraParagraphSpace;
+ }
+
+}
diff --git a/src/main/java/com/lowagie/text/Phrase.java b/src/main/java/com/lowagie/text/Phrase.java
new file mode 100644
index 0000000..7362163
--- /dev/null
+++ b/src/main/java/com/lowagie/text/Phrase.java
@@ -0,0 +1,612 @@
+/*
+ * $Id: Phrase.java,v 1.106 2006/01/14 16:15:25 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.Properties;
+import java.util.Set;
+
+import com.lowagie.text.markup.MarkupTags;
+import com.lowagie.text.markup.MarkupParser;
+
+/**
+ * A <CODE>Phrase</CODE> is a series of <CODE>Chunk</CODE>s.
+ * <P>
+ * A <CODE>Phrase</CODE> has a main <CODE>Font</CODE>, but some chunks
+ * within the phrase can have a <CODE>Font</CODE> that differs from the
+ * main <CODE>Font</CODE>. All the <CODE>Chunk</CODE>s in a <CODE>Phrase</CODE>
+ * have the same <CODE>leading</CODE>.
+ * <P>
+ * Example:
+ * <BLOCKQUOTE><PRE>
+ * // When no parameters are passed, the default leading = 16
+ * <STRONG>Phrase phrase0 = new Phrase();</STRONG>
+ * <STRONG>Phrase phrase1 = new Phrase("this is a phrase");</STRONG>
+ * // In this example the leading is passed as a parameter
+ * <STRONG>Phrase phrase2 = new Phrase(16, "this is a phrase with leading 16");</STRONG>
+ * // When a Font is passed (explicitely or embedded in a chunk), the default leading = 1.5 * size of the font
+ * <STRONG>Phrase phrase3 = new Phrase("this is a phrase with a red, normal font Courier, size 12", FontFactory.getFont(FontFactory.COURIER, 12, Font.NORMAL, new Color(255, 0, 0)));</STRONG>
+ * <STRONG>Phrase phrase4 = new Phrase(new Chunk("this is a phrase"));</STRONG>
+ * <STRONG>Phrase phrase5 = new Phrase(18, new Chunk("this is a phrase", FontFactory.getFont(FontFactory.HELVETICA, 16, Font.BOLD, new Color(255, 0, 0)));</STRONG>
+ * </PRE></BLOCKQUOTE>
+ *
+ * @see Element
+ * @see Chunk
+ * @see Paragraph
+ * @see Anchor
+ */
+
+public class Phrase extends ArrayList implements TextElementArray, MarkupAttributes {
+
+ // membervariables
+
+/** This is the leading of this phrase. */
+ protected float leading = Float.NaN;
+
+/** This is the font of this phrase. */
+ protected Font font = new Font();
+
+/** Contains extra markupAttributes */
+ protected Properties markupAttributes;
+
+ // constructors
+
+/**
+ * Constructs a Phrase that can be used in the static getInstance() method.
+ * @param dummy a dummy parameter
+ */
+ private Phrase(boolean dummy) {
+ }
+
+/**
+ * Constructs a <CODE>Phrase</CODE> without specifying a leading.
+ */
+
+ public Phrase() {
+ this(16);
+ }
+
+/**
+ * Constructs a <CODE>Phrase</CODE> with a certain leading.
+ *
+ * @param leading the leading
+ */
+
+ public Phrase(float leading) {
+ this.leading = leading;
+ }
+
+/**
+ * Constructs a <CODE>Phrase</CODE> with a certain <CODE>Chunk</CODE>.
+ *
+ * @param chunk a <CODE>Chunk</CODE>
+ */
+
+ public Phrase(Chunk chunk) {
+ super.add(chunk);
+ }
+
+/**
+ * Constructs a <CODE>Phrase</CODE> with a certain <CODE>Chunk</CODE>
+ * and a certain leading.
+ *
+ * @param leading the leading
+ * @param chunk a <CODE>Chunk</CODE>
+ */
+
+ public Phrase(float leading, Chunk chunk) {
+ this(leading);
+ super.add(chunk);
+ }
+
+/**
+ * Constructs a <CODE>Phrase</CODE> with a certain <CODE>String</CODE>.
+ *
+ * @param string a <CODE>String</CODE>
+ */
+
+ public Phrase(String string) {
+ this(Float.NaN, string, new Font());
+ }
+
+/**
+ * Constructs a <CODE>Phrase</CODE> with a certain <CODE>String</CODE> and a certain <CODE>Font</CODE>.
+ *
+ * @param string a <CODE>String</CODE>
+ * @param font a <CODE>Font</CODE>
+ */
+
+ public Phrase(String string, Font font) {
+ this(Float.NaN, string, font);
+ this.font = font;
+ }
+
+/**
+ * Constructs a <CODE>Phrase</CODE> with a certain leading and a certain <CODE>String</CODE>.
+ *
+ * @param leading the leading
+ * @param string a <CODE>String</CODE>
+ */
+
+ public Phrase(float leading, String string) {
+ this(leading, string, new Font());
+ }
+
+/**
+ * Constructs a <CODE>Phrase</CODE> with a certain leading, a certain <CODE>String</CODE>
+ * and a certain <CODE>Font</CODE>.
+ *
+ * @param leading the leading
+ * @param string a <CODE>String</CODE>
+ * @param font a <CODE>Font</CODE>
+ */
+
+ public Phrase(float leading, String string, Font font) {
+ this(leading);
+ this.font = font;
+ /* bugfix by August Detlefsen */
+ if (string != null && string.length() != 0) {
+ super.add(new Chunk(string, font));
+ }
+ }
+
+ /**
+ * Gets a special kind of Phrase that changes some characters into corresponding symbols.
+ * @param string
+ * @return a newly constructed Phrase
+ */
+ public static final Phrase getInstance(String string) {
+ return getInstance(16, string, new Font());
+ }
+
+ /**
+ * Gets a special kind of Phrase that changes some characters into corresponding symbols.
+ * @param leading
+ * @param string
+ * @return a newly constructed Phrase
+ */
+ public static final Phrase getInstance(int leading, String string) {
+ return getInstance(leading, string, new Font());
+ }
+
+ /**
+ * Gets a special kind of Phrase that changes some characters into corresponding symbols.
+ * @param leading
+ * @param string
+ * @param font
+ * @return a newly constructed Phrase
+ */
+ public static final Phrase getInstance(int leading, String string, Font font) {
+ Phrase p = new Phrase(true);
+ p.setLeading(leading);
+ p.font = font;
+ if (font.family() != Font.SYMBOL && font.family() != Font.ZAPFDINGBATS && font.getBaseFont() == null) {
+ int index;
+ while((index = SpecialSymbol.index(string)) > -1) {
+ if (index > 0) {
+ String firstPart = string.substring(0, index);
+ /* bugfix [ #461272 ] CODE CHANGE REQUIRED IN Phrase.java
+ by Arekh Nambiar */
+ ((ArrayList)p).add(new Chunk(firstPart, font));
+ string = string.substring(index);
+ }
+ Font symbol = new Font(Font.SYMBOL, font.size(), font.style(), font.color());
+ StringBuffer buf = new StringBuffer();
+ buf.append(SpecialSymbol.getCorrespondingSymbol(string.charAt(0)));
+ string = string.substring(1);
+ while (SpecialSymbol.index(string) == 0) {
+ buf.append(SpecialSymbol.getCorrespondingSymbol(string.charAt(0)));
+ string = string.substring(1);
+ }
+ ((ArrayList)p).add(new Chunk(buf.toString(), symbol));
+ }
+ }
+ /* bugfix by August Detlefsen */
+ if (string != null && string.length() != 0) {
+ ((ArrayList)p).add(new Chunk(string, font));
+ }
+ return p;
+ }
+
+/**
+ * Returns a <CODE>Phrase</CODE> that has been constructed taking in account
+ * the value of some <VAR>attributes</VAR>.
+ *
+ * @param attributes Some attributes
+ */
+
+ public Phrase(Properties attributes) {
+ this("", FontFactory.getFont(attributes));
+ clear();
+ String value;
+ if ((value = (String)attributes.remove(ElementTags.LEADING)) != null) {
+ setLeading(Float.valueOf(value + "f").floatValue());
+ }
+ else if ((value = (String)attributes.remove(MarkupTags.CSS_KEY_LINEHEIGHT)) != null) {
+ setLeading(MarkupParser.parseLength(value));
+ }
+ if ((value = (String)attributes.remove(ElementTags.ITEXT)) != null) {
+ Chunk chunk = new Chunk(value);
+ if ((value = (String)attributes.remove(ElementTags.GENERICTAG)) != null) {
+ chunk.setGenericTag(value);
+ }
+ add(chunk);
+ }
+ if (attributes.size() > 0) setMarkupAttributes(attributes);
+ }
+
+ // implementation of the Element-methods
+
+/**
+ * Processes the element by adding it (or the different parts) to an
+ * <CODE>ElementListener</CODE>.
+ *
+ * @param listener an <CODE>ElementListener</CODE>
+ * @return <CODE>true</CODE> if the element was processed successfully
+ */
+
+ public boolean process(ElementListener listener) {
+ try {
+ for (Iterator i = iterator(); i.hasNext(); ) {
+ listener.add((Element) i.next());
+ }
+ return true;
+ }
+ catch(DocumentException de) {
+ return false;
+ }
+ }
+
+/**
+ * Gets the type of the text element.
+ *
+ * @return a type
+ */
+
+ public int type() {
+ return Element.PHRASE;
+ }
+
+/**
+ * Gets all the chunks in this element.
+ *
+ * @return an <CODE>ArrayList</CODE>
+ */
+
+ public ArrayList getChunks() {
+ ArrayList tmp = new ArrayList();
+ for (Iterator i = iterator(); i.hasNext(); ) {
+ tmp.addAll(((Element) i.next()).getChunks());
+ }
+ return tmp;
+ }
+
+ // overriding some of the ArrayList-methods
+
+/**
+ * Adds a <CODE>Chunk</CODE>, an <CODE>Anchor</CODE> or another <CODE>Phrase</CODE>
+ * to this <CODE>Phrase</CODE>.
+ *
+ * @param index index at which the specified element is to be inserted
+ * @param o an object of type <CODE>Chunk</CODE>, <CODE>Anchor</CODE> or <CODE>Phrase</CODE>
+ * @throws ClassCastException when you try to add something that isn't a <CODE>Chunk</CODE>, <CODE>Anchor</CODE> or <CODE>Phrase</CODE>
+ */
+
+ public void add(int index, Object o) {
+ if (o == null) return;
+ try {
+ Element element = (Element) o;
+ if (element.type() == Element.CHUNK) {
+ Chunk chunk = (Chunk) element;
+ if (!font.isStandardFont()) {
+ chunk.setFont(font.difference(chunk.font()));
+ }
+ super.add(index, chunk);
+ }
+ else if (element.type() == Element.PHRASE ||
+ element.type() == Element.ANCHOR ||
+ element.type() == Element.ANNOTATION ||
+ element.type() == Element.TABLE || // line added by David Freels
+ element.type() == Element.GRAPHIC) {
+ super.add(index, element);
+ }
+ else {
+ throw new ClassCastException(String.valueOf(element.type()));
+ }
+ }
+ catch(ClassCastException cce) {
+ throw new ClassCastException("Insertion of illegal Element: " + cce.getMessage());
+ }
+ }
+
+/**
+ * Adds a <CODE>Chunk</CODE>, <CODE>Anchor</CODE> or another <CODE>Phrase</CODE>
+ * to this <CODE>Phrase</CODE>.
+ *
+ * @param o an object of type <CODE>Chunk</CODE>, <CODE>Anchor</CODE> or <CODE>Phrase</CODE>
+ * @return a boolean
+ * @throws ClassCastException when you try to add something that isn't a <CODE>Chunk</CODE>, <CODE>Anchor</CODE> or <CODE>Phrase</CODE>
+ */
+
+ public boolean add(Object o) {
+ if (o == null) return false;
+ if (o instanceof String) {
+ return super.add(new Chunk((String) o, font));
+ }
+ try {
+ Element element = (Element) o;
+ switch(element.type()) {
+ case Element.CHUNK:
+ return addChunk((Chunk) o);
+ case Element.PHRASE:
+ case Element.PARAGRAPH:
+ Phrase phrase = (Phrase) o;
+ boolean success = true;
+ Element e;
+ for (Iterator i = phrase.iterator(); i.hasNext(); ) {
+ e = (Element) i.next();
+ if (e instanceof Chunk) {
+ success &= addChunk((Chunk)e);
+ }
+ else {
+ success &= this.add(e);
+ }
+ }
+ return success;
+ case Element.ANCHOR:
+ return super.add((Anchor) o);
+ case Element.ANNOTATION:
+ return super.add((Annotation) o);
+ case Element.TABLE: // case added by David Freels
+ return super.add((Table) o);
+ case Element.PTABLE: // case added by mr. Karen Vardanyan
+ // This will only work for PDF!!! Not for RTF/HTML
+ return super.add((com.lowagie.text.pdf.PdfPTable) o);
+ case Element.LIST:
+ return super.add((List) o);
+ case Element.GRAPHIC: // suggested by Steven Balthazor
+ return super.add((Graphic) o);
+ default:
+ throw new ClassCastException(String.valueOf(element.type()));
+ }
+ }
+ catch(ClassCastException cce) {
+ throw new ClassCastException("Insertion of illegal Element: " + cce.getMessage());
+ }
+ }
+
+/**
+ * Adds a Chunk.
+ * <p>
+ * This method is a hack to solve a problem I had with phrases that were split between chunks
+ * in the wrong place.
+ * @param chunk a Chunk to add to the Phrase
+ * @return true if adding the Chunk succeeded
+ */
+
+ private synchronized boolean addChunk(Chunk chunk) {
+ if (!font.isStandardFont()) {
+ chunk.setFont(font.difference(chunk.font()));
+ }
+ if (size() > 0 && !chunk.hasAttributes()) {
+ try {
+ Chunk previous = (Chunk) get(size() - 1);
+ if (!previous.hasAttributes() && previous.font().compareTo(chunk.font()) == 0 && !"".equals(previous.content().trim()) && !"".equals(chunk.content().trim())) {
+ previous.append(chunk.content());
+ return true;
+ }
+ }
+ catch(ClassCastException cce) {
+ }
+ }
+ return super.add(chunk);
+ }
+
+/**
+ * Adds a collection of <CODE>Chunk</CODE>s
+ * to this <CODE>Phrase</CODE>.
+ *
+ * @param collection a collection of <CODE>Chunk</CODE>s, <CODE>Anchor</CODE>s and <CODE>Phrase</CODE>s.
+ * @return <CODE>true</CODE> if the action succeeded, <CODE>false</CODE> if not.
+ * @throws ClassCastException when you try to add something that isn't a <CODE>Chunk</CODE>, <CODE>Anchor</CODE> or <CODE>Phrase</CODE>
+ */
+
+ public boolean addAll(Collection collection) {
+ for (Iterator iterator = collection.iterator(); iterator.hasNext(); ) {
+ this.add(iterator.next());
+ }
+ return true;
+ }
+
+/**
+ * Adds a <CODE>Object</CODE> to the <CODE>Paragraph</CODE>.
+ *
+ * @param object the object to add.
+ */
+
+ protected void addSpecial(Object object) {
+ super.add(object);
+ }
+
+ // methods
+
+/**
+ * Sets the leading of this phrase.
+ *
+ * @param leading the new leading
+ */
+
+ public void setLeading(float leading) {
+ this.leading = leading;
+ }
+
+ // methods to retrieve information
+
+/**
+ * Checks is this <CODE>Phrase</CODE> contains no or 1 empty <CODE>Chunk</CODE>.
+ *
+ * @return <CODE>false</CODE> if the <CODE>Phrase</CODE>
+ * contains more than one or more non-empty<CODE>Chunk</CODE>s.
+ */
+
+ public boolean isEmpty() {
+ switch(size()) {
+ case 0:
+ return true;
+ case 1:
+ Element element = (Element) get(0);
+ if (element.type() == Element.CHUNK && ((Chunk) element).isEmpty()) {
+ return true;
+ }
+ return false;
+ default:
+ return false;
+ }
+ }
+
+/**
+ * Checks you if the leading of this phrase is defined.
+ *
+ * @return true if the leading is defined
+ */
+
+ public boolean leadingDefined() {
+ if (Float.isNaN(leading)) {
+ return false;
+ }
+ return true;
+ }
+
+/**
+ * Gets the leading of this phrase.
+ *
+ * @return the linespacing
+ */
+
+ public float leading() {
+ if (Float.isNaN(leading)) {
+ return font.leading(1.5f);
+ }
+ return leading;
+ }
+
+/**
+ * Gets the font of the first <CODE>Chunk</CODE> that appears in this <CODE>Phrase</CODE>.
+ *
+ * @return a <CODE>Font</CODE>
+ */
+
+ public Font font() {
+ return font;
+ }
+
+/**
+ * Returns the content as a String object.
+ * This method differs from toString because toString will return an ArrayList with the toString value of the Chunks in this Phrase.
+ */
+ public String content() {
+ StringBuffer buf = new StringBuffer();
+ for (Iterator i = getChunks().iterator(); i.hasNext(); ) {
+ buf.append(i.next().toString());
+ }
+ return buf.toString();
+ }
+
+/**
+ * Checks if a given tag corresponds with this object.
+ *
+ * @param tag the given tag
+ * @return true if the tag corresponds
+ */
+
+ public static boolean isTag(String tag) {
+ return ElementTags.PHRASE.equals(tag);
+ }
+
+
+/**
+ * @see com.lowagie.text.MarkupAttributes#setMarkupAttribute(java.lang.String, java.lang.String)
+ */
+ public void setMarkupAttribute(String name, String value) {
+ if (markupAttributes == null) markupAttributes = new Properties();
+ markupAttributes.put(name, value);
+ }
+
+/**
+ * @see com.lowagie.text.MarkupAttributes#setMarkupAttributes(java.util.Properties)
+ */
+ public void setMarkupAttributes(Properties markupAttributes) {
+ this.markupAttributes = markupAttributes;
+ }
+
+/**
+ * @see com.lowagie.text.MarkupAttributes#getMarkupAttribute(java.lang.String)
+ */
+ public String getMarkupAttribute(String name) {
+ return (markupAttributes == null) ? null : String.valueOf(markupAttributes.get(name));
+ }
+
+/**
+ * @see com.lowagie.text.MarkupAttributes#getMarkupAttributeNames()
+ */
+ public Set getMarkupAttributeNames() {
+ return Chunk.getKeySet(markupAttributes);
+ }
+
+/**
+ * @see com.lowagie.text.MarkupAttributes#getMarkupAttributes()
+ */
+ public Properties getMarkupAttributes() {
+ return markupAttributes;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/Rectangle.java b/src/main/java/com/lowagie/text/Rectangle.java
new file mode 100644
index 0000000..801ace0
--- /dev/null
+++ b/src/main/java/com/lowagie/text/Rectangle.java
@@ -0,0 +1,955 @@
+/*
+ * $Id: Rectangle.java,v 1.76 2005/12/12 08:31:40 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text;
+
+import java.awt.Color;
+import java.util.ArrayList;
+import java.util.Properties;
+import java.util.Set;
+import com.lowagie.text.pdf.GrayColor;
+
+/**
+ * A <CODE>Rectangle</CODE> is the representation of a geometric figure.
+ *
+ * Rectangles support constant width borders using
+ * {@link #setBorderWidth(float)}and {@link #setBorder(int)}. They also
+ * support borders that vary in width/color on each side using methods like
+ * {@link #setBorderWidthLeft(float)}or
+ * {@link #setBorderColorLeft(java.awt.Color)}.
+ *
+ * @see Element
+ * @see Table
+ * @see Cell
+ * @see HeaderFooter
+ */
+
+public class Rectangle implements Element, MarkupAttributes {
+
+ // static membervariables (concerning the presence of borders)
+
+ /** This is the value that will be used as <VAR>undefined </VAR>. */
+ public static final int UNDEFINED = -1;
+
+ /** This represents one side of the border of the <CODE>Rectangle</CODE>. */
+ public static final int TOP = 1;
+
+ /** This represents one side of the border of the <CODE>Rectangle</CODE>. */
+ public static final int BOTTOM = 2;
+
+ /** This represents one side of the border of the <CODE>Rectangle</CODE>. */
+ public static final int LEFT = 4;
+
+ /** This represents one side of the border of the <CODE>Rectangle</CODE>. */
+ public static final int RIGHT = 8;
+
+ /** This represents a rectangle without borders. */
+ public static final int NO_BORDER = 0;
+
+ /** This represents a type of border. */
+ public static final int BOX = TOP + BOTTOM + LEFT + RIGHT;
+
+ // membervariables
+
+ /** the lower left x-coordinate. */
+ protected float llx;
+
+ /** the lower left y-coordinate. */
+ protected float lly;
+
+ /** the upper right x-coordinate. */
+ protected float urx;
+
+ /** the upper right y-coordinate. */
+ protected float ury;
+
+ /** This represents the status of the 4 sides of the rectangle. */
+ protected int border = UNDEFINED;
+
+ /** This is the width of the border around this rectangle. */
+ protected float borderWidth = UNDEFINED;
+
+ /** The color of the border of this rectangle. */
+ protected Color color = null;
+
+ /** The color of the left border of this rectangle. */
+ protected Color borderColorLeft = null;
+
+ /** The color of the right border of this rectangle. */
+ protected Color borderColorRight = null;
+
+ /** The color of the top border of this rectangle. */
+ protected Color borderColorTop = null;
+
+ /** The color of the bottom border of this rectangle. */
+ protected Color borderColorBottom = null;
+
+ /** The width of the left border of this rectangle. */
+ protected float borderWidthLeft = UNDEFINED;
+
+ /** The width of the right border of this rectangle. */
+ protected float borderWidthRight = UNDEFINED;
+
+ /** The width of the top border of this rectangle. */
+ protected float borderWidthTop = UNDEFINED;
+
+ /** The width of the bottom border of this rectangle. */
+ protected float borderWidthBottom = UNDEFINED;
+
+ /** Whether variable width borders are used. */
+ protected boolean useVariableBorders = false;
+
+ /** This is the color of the background of this rectangle. */
+ protected Color background = null;
+
+ protected int rotation = 0;
+
+ /** Contains extra markupAttributes */
+ protected Properties markupAttributes;
+
+ // constructors
+
+ /**
+ * Constructs a <CODE>Rectangle</CODE> -object.
+ *
+ * @param llx
+ * lower left x
+ * @param lly
+ * lower left y
+ * @param urx
+ * upper right x
+ * @param ury
+ * upper right y
+ */
+
+ public Rectangle(float llx, float lly, float urx, float ury) {
+ this.llx = llx;
+ this.lly = lly;
+ this.urx = urx;
+ this.ury = ury;
+ }
+
+ /**
+ * Constructs a <CODE>Rectangle</CODE> -object starting from the origin
+ * (0, 0).
+ *
+ * @param urx
+ * upper right x
+ * @param ury
+ * upper right y
+ */
+
+ public Rectangle(float urx, float ury) {
+ this(0, 0, urx, ury);
+ }
+
+ /**
+ * Constructs a <CODE>Rectangle</CODE> -object.
+ *
+ * @param rect
+ * another <CODE>Rectangle</CODE>
+ */
+
+ public Rectangle(Rectangle rect) {
+ this(rect.llx, rect.lly, rect.urx, rect.ury);
+ cloneNonPositionParameters(rect);
+ }
+
+ /**
+ * Copies all of the parameters from a <CODE>Rectangle</CODE> object
+ * except the position.
+ *
+ * @param rect
+ * <CODE>Rectangle</CODE> to copy from
+ */
+
+ public void cloneNonPositionParameters(Rectangle rect) {
+ this.rotation = rect.rotation;
+ this.border = rect.border;
+ this.borderWidth = rect.borderWidth;
+ this.color = rect.color;
+ this.background = rect.background;
+ this.borderColorLeft = rect.borderColorLeft;
+ this.borderColorRight = rect.borderColorRight;
+ this.borderColorTop = rect.borderColorTop;
+ this.borderColorBottom = rect.borderColorBottom;
+ this.borderWidthLeft = rect.borderWidthLeft;
+ this.borderWidthRight = rect.borderWidthRight;
+ this.borderWidthTop = rect.borderWidthTop;
+ this.borderWidthBottom = rect.borderWidthBottom;
+ this.useVariableBorders = rect.useVariableBorders;
+ }
+
+ /**
+ * Copies all of the parameters from a <CODE>Rectangle</CODE> object
+ * except the position.
+ *
+ * @param rect
+ * <CODE>Rectangle</CODE> to copy from
+ */
+
+ public void softCloneNonPositionParameters(Rectangle rect) {
+ if (rect.rotation != 0)
+ this.rotation = rect.rotation;
+ if (rect.border != UNDEFINED)
+ this.border = rect.border;
+ if (rect.borderWidth != UNDEFINED)
+ this.borderWidth = rect.borderWidth;
+ if (rect.color != null)
+ this.color = rect.color;
+ if (rect.background != null)
+ this.background = rect.background;
+ if (rect.borderColorLeft != null)
+ this.borderColorLeft = rect.borderColorLeft;
+ if (rect.borderColorRight != null)
+ this.borderColorRight = rect.borderColorRight;
+ if (rect.borderColorTop != null)
+ this.borderColorTop = rect.borderColorTop;
+ if (rect.borderColorBottom != null)
+ this.borderColorBottom = rect.borderColorBottom;
+ if (rect.borderWidthLeft != UNDEFINED)
+ this.borderWidthLeft = rect.borderWidthLeft;
+ if (rect.borderWidthRight != UNDEFINED)
+ this.borderWidthRight = rect.borderWidthRight;
+ if (rect.borderWidthTop != UNDEFINED)
+ this.borderWidthTop = rect.borderWidthTop;
+ if (rect.borderWidthBottom != UNDEFINED)
+ this.borderWidthBottom = rect.borderWidthBottom;
+ if (useVariableBorders)
+ this.useVariableBorders = rect.useVariableBorders;
+ }
+
+ // implementation of the Element interface
+
+ /**
+ * Processes the element by adding it (or the different parts) to an <CODE>
+ * ElementListener</CODE>.
+ *
+ * @param listener
+ * an <CODE>ElementListener</CODE>
+ * @return <CODE>true</CODE> if the element was processed successfully
+ */
+
+ public boolean process(ElementListener listener) {
+ try {
+ return listener.add(this);
+ } catch (DocumentException de) {
+ return false;
+ }
+ }
+
+ /**
+ * Gets the type of the text element.
+ *
+ * @return a type
+ */
+
+ public int type() {
+ return Element.RECTANGLE;
+ }
+
+ /**
+ * Gets all the chunks in this element.
+ *
+ * @return an <CODE>ArrayList</CODE>
+ */
+
+ public ArrayList getChunks() {
+ return new ArrayList();
+ }
+
+ // methods
+
+ /**
+ * Switches lowerleft with upperright
+ */
+ public void normalize() {
+ if (llx > urx) {
+ float a = llx;
+ llx = urx;
+ urx = a;
+ }
+ if (lly > ury) {
+ float a = lly;
+ lly = ury;
+ ury = a;
+ }
+ }
+
+ /**
+ * Gets a Rectangle that is altered to fit on the page.
+ *
+ * @param top
+ * the top position
+ * @param bottom
+ * the bottom position
+ * @return a <CODE>Rectangle</CODE>
+ */
+
+ public Rectangle rectangle(float top, float bottom) {
+ Rectangle tmp = new Rectangle(this);
+ if (top() > top) {
+ tmp.setTop(top);
+ tmp.setBorder(border - (border & TOP));
+ }
+ if (bottom() < bottom) {
+ tmp.setBottom(bottom);
+ tmp.setBorder(border - (border & BOTTOM));
+ }
+ return tmp;
+ }
+
+ /**
+ * Swaps the values of urx and ury and of lly and llx in order to rotate the
+ * rectangle.
+ *
+ * @return a <CODE>Rectangle</CODE>
+ */
+
+ public Rectangle rotate() {
+ Rectangle rect = new Rectangle(lly, llx, ury, urx);
+ rect.rotation = rotation + 90;
+ rect.rotation %= 360;
+ return rect;
+ }
+
+ // methods to set the membervariables
+
+ /**
+ * Sets the lower left x-coordinate.
+ *
+ * @param value
+ * the new value
+ */
+
+ public void setLeft(float value) {
+ llx = value;
+ }
+
+ /**
+ * Sets the upper right x-coordinate.
+ *
+ * @param value
+ * the new value
+ */
+
+ public void setRight(float value) {
+ urx = value;
+ }
+
+ /**
+ * Sets the upper right y-coordinate.
+ *
+ * @param value
+ * the new value
+ */
+
+ public void setTop(float value) {
+ ury = value;
+ }
+
+ /**
+ * Sets the lower left y-coordinate.
+ *
+ * @param value
+ * the new value
+ */
+
+ public void setBottom(float value) {
+ lly = value;
+ }
+
+ /**
+ * Enables/Disables the border on the specified sides. The border is
+ * specified as an integer bitwise combination of the constants: <CODE>
+ * LEFT, RIGHT, TOP, BOTTOM</CODE>.
+ *
+ * @see #enableBorderSide(int)
+ * @see #disableBorderSide(int)
+ * @param value
+ * the new value
+ */
+
+ public void setBorder(int value) {
+ border = value;
+ }
+
+ /**
+ * Enables the border on the specified side.
+ *
+ * @param side
+ * the side to enable. One of <CODE>LEFT, RIGHT, TOP, BOTTOM
+ * </CODE>
+ */
+ public void enableBorderSide(int side) {
+ if (border == UNDEFINED) {
+ border = 0;
+ }
+ border |= side;
+ }
+
+ /**
+ * Disables the border on the specified side.
+ *
+ * @param side
+ * the side to disable. One of <CODE>LEFT, RIGHT, TOP, BOTTOM
+ * </CODE>
+ */
+ public void disableBorderSide(int side) {
+ if (border == UNDEFINED) {
+ border = 0;
+ }
+ border &= ~side;
+ }
+
+ /**
+ * Sets the borderwidth of the table.
+ *
+ * @param value
+ * the new value
+ */
+
+ public void setBorderWidth(float value) {
+ borderWidth = value;
+ }
+
+ /**
+ * Sets the color of the border.
+ *
+ * @param value
+ * the new value
+ */
+
+ public void setBorderColor(Color value) {
+ color = value;
+ }
+
+ /**
+ * Sets the value of the border color
+ *
+ * @param value
+ * a color value
+ */
+ public void setBorderColorRight(Color value) {
+ borderColorRight = value;
+ }
+
+ /**
+ * Sets the value of the border color
+ *
+ * @param value
+ * a color value
+ */
+ public void setBorderColorLeft(Color value) {
+ borderColorLeft = value;
+ }
+
+ /**
+ * Sets the value of the border color
+ *
+ * @param value
+ * a color value
+ */
+ public void setBorderColorTop(Color value) {
+ borderColorTop = value;
+ }
+
+ /**
+ * Sets the value of the border color
+ *
+ * @param value
+ * a color value
+ */
+ public void setBorderColorBottom(Color value) {
+ borderColorBottom = value;
+ }
+
+ /**
+ * Sets the backgroundcolor of the rectangle.
+ *
+ * @param value
+ * the new value
+ */
+
+ public void setBackgroundColor(Color value) {
+ background = value;
+ }
+
+ /**
+ * Sets the grayscale of the rectangle.
+ *
+ * @param value
+ * the new value
+ */
+
+ public void setGrayFill(float value) {
+ background = new GrayColor(value);
+ }
+
+ // methods to get the membervariables
+
+ /**
+ * Returns the lower left x-coordinate.
+ *
+ * @return the lower left x-coordinate
+ */
+
+ public float left() {
+ return llx;
+ }
+
+ /**
+ * Returns the upper right x-coordinate.
+ *
+ * @return the upper right x-coordinate
+ */
+
+ public float right() {
+ return urx;
+ }
+
+ /**
+ * Returns the upper right y-coordinate.
+ *
+ * @return the upper right y-coordinate
+ */
+
+ public float top() {
+ return ury;
+ }
+
+ /**
+ * Returns the lower left y-coordinate.
+ *
+ * @return the lower left y-coordinate
+ */
+
+ public float bottom() {
+ return lly;
+ }
+
+ /**
+ * Returns the lower left x-coordinate, considering a given margin.
+ *
+ * @param margin
+ * a margin
+ * @return the lower left x-coordinate
+ */
+
+ public float left(float margin) {
+ return llx + margin;
+ }
+
+ /**
+ * Returns the upper right x-coordinate, considering a given margin.
+ *
+ * @param margin
+ * a margin
+ * @return the upper right x-coordinate
+ */
+
+ public float right(float margin) {
+ return urx - margin;
+ }
+
+ /**
+ * Returns the upper right y-coordinate, considering a given margin.
+ *
+ * @param margin
+ * a margin
+ * @return the upper right y-coordinate
+ */
+
+ public float top(float margin) {
+ return ury - margin;
+ }
+
+ /**
+ * Returns the lower left y-coordinate, considering a given margin.
+ *
+ * @param margin
+ * a margin
+ * @return the lower left y-coordinate
+ */
+
+ public float bottom(float margin) {
+ return lly + margin;
+ }
+
+ /**
+ * Returns the width of the rectangle.
+ *
+ * @return a width
+ */
+
+ public float width() {
+ return urx - llx;
+ }
+
+ /**
+ * Returns the height of the rectangle.
+ *
+ * @return a height
+ */
+
+ public float height() {
+ return ury - lly;
+ }
+
+ /**
+ * Indicates if the table has borders.
+ *
+ * @return a boolean
+ */
+
+ public boolean hasBorders() {
+ return (border > 0)
+ && ((borderWidth > 0) || (borderWidthLeft > 0)
+ || (borderWidthRight > 0) || (borderWidthTop > 0) || (borderWidthBottom > 0));
+ }
+
+ /**
+ * Indicates if the table has a some type of border.
+ *
+ * @param type
+ * the type of border
+ * @return a boolean
+ */
+
+ public boolean hasBorder(int type) {
+ return border != UNDEFINED && (border & type) == type;
+ }
+
+ /**
+ * Returns the exact type of the border.
+ *
+ * @return a value
+ */
+
+ public int border() {
+ return border;
+ }
+
+ /**
+ * Gets the borderwidth.
+ *
+ * @return a value
+ */
+
+ public float borderWidth() {
+ return borderWidth;
+ }
+
+ /**
+ * Gets the color of the border.
+ *
+ * @return a value
+ */
+
+ public Color borderColor() {
+ return color;
+ }
+
+ /**
+ * Gets the backgroundcolor.
+ *
+ * @return a value
+ */
+
+ public Color backgroundColor() {
+ return background;
+ }
+
+ /**
+ * Gets the grayscale.
+ *
+ * @return a value
+ */
+
+ public float grayFill() {
+ if (background instanceof GrayColor)
+ return ((GrayColor)background).getGray();
+ else
+ return 0;
+ }
+
+ /**
+ * Gets the rotation of the rectangle
+ *
+ * @return a rotation value
+ */
+ public int getRotation() {
+ return rotation;
+ }
+
+ /**
+ * @see com.lowagie.text.MarkupAttributes#setMarkupAttribute(java.lang.String,
+ * java.lang.String)
+ */
+ public void setMarkupAttribute(String name, String value) {
+ if (markupAttributes == null)
+ markupAttributes = new Properties();
+ markupAttributes.put(name, value);
+ }
+
+ /**
+ * @see com.lowagie.text.MarkupAttributes#setMarkupAttributes(java.util.Properties)
+ */
+ public void setMarkupAttributes(Properties markupAttributes) {
+ this.markupAttributes = markupAttributes;
+ }
+
+ /**
+ * @see com.lowagie.text.MarkupAttributes#getMarkupAttribute(java.lang.String)
+ */
+ public String getMarkupAttribute(String name) {
+ return (markupAttributes == null) ? null : String
+ .valueOf(markupAttributes.get(name));
+ }
+
+ /**
+ * @see com.lowagie.text.MarkupAttributes#getMarkupAttributeNames()
+ */
+ public Set getMarkupAttributeNames() {
+ return Chunk.getKeySet(markupAttributes);
+ }
+
+ /**
+ * @see com.lowagie.text.MarkupAttributes#getMarkupAttributes()
+ */
+ public Properties getMarkupAttributes() {
+ return markupAttributes;
+ }
+
+ /**
+ * Gets the color of a border.
+ *
+ * @return a color value
+ */
+ public Color getBorderColorLeft() {
+ if (borderColorLeft == null) return color;
+ return borderColorLeft;
+ }
+
+ /**
+ * Gets the color of a border.
+ *
+ * @return a color value
+ */
+ public Color getBorderColorRight() {
+ if (borderColorRight == null) return color;
+ return borderColorRight;
+ }
+
+ /**
+ * Gets the color of a border.
+ *
+ * @return a color value
+ */
+ public Color getBorderColorTop() {
+ if (borderColorTop == null) return color;
+ return borderColorTop;
+ }
+
+ /**
+ * Gets the color of a border.
+ *
+ * @return a color value
+ */
+ public Color getBorderColorBottom() {
+ if (borderColorBottom == null) return color;
+ return borderColorBottom;
+ }
+
+ /**
+ * Gets the width of a border.
+ *
+ * @return a width
+ */
+ public float getBorderWidthLeft() {
+ return getVariableBorderWidth(borderWidthLeft, LEFT);
+ }
+
+ /**
+ * Sets the width of a border
+ *
+ * @param borderWidthLeft
+ * a width
+ */
+ public void setBorderWidthLeft(float borderWidthLeft) {
+ this.borderWidthLeft = borderWidthLeft;
+ updateBorderBasedOnWidth(borderWidthLeft, LEFT);
+ }
+
+ /**
+ * Gets the width of a border.
+ *
+ * @return a width
+ */
+ public float getBorderWidthRight() {
+ return getVariableBorderWidth(borderWidthRight, RIGHT);
+ }
+
+ /**
+ * Sets the width of a border
+ *
+ * @param borderWidthRight
+ * a width
+ */
+ public void setBorderWidthRight(float borderWidthRight) {
+ this.borderWidthRight = borderWidthRight;
+ updateBorderBasedOnWidth(borderWidthRight, RIGHT);
+ }
+
+ /**
+ * Gets the width of a border.
+ *
+ * @return a width
+ */
+ public float getBorderWidthTop() {
+ return getVariableBorderWidth(borderWidthTop, TOP);
+ }
+
+ /**
+ * Sets the width of a border
+ *
+ * @param borderWidthTop
+ * a width
+ */
+ public void setBorderWidthTop(float borderWidthTop) {
+ this.borderWidthTop = borderWidthTop;
+ updateBorderBasedOnWidth(borderWidthTop, TOP);
+ }
+
+ /**
+ * Gets the width of a border.
+ *
+ * @return a width
+ */
+ public float getBorderWidthBottom() {
+ return getVariableBorderWidth(borderWidthBottom, BOTTOM);
+ }
+
+ /**
+ * Sets the width of a border
+ *
+ * @param borderWidthBottom
+ * a width
+ */
+ public void setBorderWidthBottom(float borderWidthBottom) {
+ this.borderWidthBottom = borderWidthBottom;
+ updateBorderBasedOnWidth(borderWidthBottom, BOTTOM);
+ }
+
+ /**
+ * Updates the border flag for a side based on the specified width. A width
+ * of 0 will disable the border on that side. Any other width enables it.
+ *
+ * @param width
+ * width of border
+ * @param side
+ * border side constant
+ */
+
+ private void updateBorderBasedOnWidth(float width, int side) {
+ useVariableBorders = true;
+ if (width > 0) {
+ enableBorderSide(side);
+ } else {
+ disableBorderSide(side);
+ }
+ }
+
+ private float getVariableBorderWidth(float variableWidthValue, int side) {
+ if ((border & side) != 0) {
+ return variableWidthValue != UNDEFINED ? variableWidthValue
+ : borderWidth;
+ } else {
+ return 0;
+ }
+ }
+
+ /**
+ * Indicates whether variable width borders are being used. Returns true if
+ * <CODE>setBorderWidthLeft, setBorderWidthRight, setBorderWidthTop, or
+ * setBorderWidthBottom</CODE> has been called.
+ *
+ * @return true if variable width borders are in use
+ *
+ */
+ public boolean isUseVariableBorders() {
+ return useVariableBorders;
+ }
+
+ /**
+ * Sets a parameter indicating if the rectangle has variable borders
+ *
+ * @param useVariableBorders
+ * indication if the rectangle has variable borders
+ */
+ public void setUseVariableBorders(boolean useVariableBorders) {
+ this.useVariableBorders = useVariableBorders;
+ }
+
+ /**
+ * @see java.lang.Object#toString()
+ */
+ public String toString() {
+ StringBuffer buf = new StringBuffer("Rectangle: ");
+ buf.append(width());
+ buf.append("x");
+ buf.append(height());
+ buf.append(" (rot: ");
+ buf.append(rotation);
+ buf.append(" degrees)");
+ return buf.toString();
+ }
+
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/RomanList.java b/src/main/java/com/lowagie/text/RomanList.java
new file mode 100644
index 0000000..e4b9ed7
--- /dev/null
+++ b/src/main/java/com/lowagie/text/RomanList.java
@@ -0,0 +1,291 @@
+/*
+ * Copyright 2003 by Michael Niedermair.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+package com.lowagie.text;
+
+/**
+ *
+ * A special-version of <CODE>LIST</CODE> which use roman-letters.
+ *
+ * @see com.lowagie.text.List
+ * @version 2003-06-22
+ * @author Michael Niedermair
+ */
+
+public class RomanList extends List {
+
+ /**
+ * UpperCase or LowerCase
+ */
+ protected boolean romanlower;
+
+ /**
+ * Initialization
+ *
+ * @param symbolIndent indent
+ */
+ public RomanList(int symbolIndent) {
+ super(true, symbolIndent);
+ }
+
+ /**
+ * Initialization
+ * @param romanlower roman-char in lowercase
+ * @param symbolIndent indent
+ */
+ public RomanList(boolean romanlower, int symbolIndent) {
+ super(true, symbolIndent);
+ this.romanlower = romanlower;
+ }
+
+ /**
+ * set the roman-letters to lowercase otherwise to uppercase
+ *
+ * @param romanlower
+ */
+ public void setRomanLower(boolean romanlower) {
+ this.romanlower = romanlower;
+ }
+
+ /**
+ * Checks if the list is roman-letter with lowercase
+ *
+ * @return <CODE>true</CODE> if the roman-letter is lowercase, <CODE>false</CODE> otherwise.
+ */
+ public boolean isRomanLower() {
+ return romanlower;
+ }
+
+ /**
+ * Adds an <CODE>Object</CODE> to the <CODE>List</CODE>.
+ *
+ * @param o the object to add.
+ * @return true if adding the object succeeded
+ */
+ public boolean add(Object o) {
+ if (o instanceof ListItem) {
+ ListItem item = (ListItem) o;
+ Chunk chunk;
+ if (romanlower)
+ chunk = new Chunk(toRomanLowerCase(first + list.size()), symbol.font());
+ else
+ chunk = new Chunk(toRomanUppercase(first + list.size()), symbol.font());
+ chunk.append(".");
+ item.setListSymbol(chunk);
+ item.setIndentationLeft(symbolIndent);
+ item.setIndentationRight(0);
+ list.add(item);
+ } else if (o instanceof List) {
+ List nested = (List) o;
+ nested.setIndentationLeft(nested.indentationLeft() + symbolIndent);
+ first--;
+ return list.add(nested);
+ } else if (o instanceof String) {
+ return this.add(new ListItem((String) o));
+ }
+ return false;
+ }
+
+ // ****************************************************************************************
+
+ /*
+ * Wandelt eine Integer-Zahl in römische Schreibweise um
+ *
+ * Regeln: http://de.wikipedia.org/wiki/R%F6mische_Ziffern
+ *
+ * 1. Die Ziffern werden addiert, wobei sie von groß nach klein sortiert sind:
+ *
+ * XVII = 10+5+1+1=17
+ *
+ * 2. Eine kleinere Ziffer, die links von einer größeren steht, wird abgezogen:
+ *
+ * IV = 5-1=4
+ * CM = 1000-100=900
+ *
+ * 3. Maximal drei gleiche Ziffern stehen nebeneinander (Ausnahme: IIII auf Zifferblaettern von Uhren):
+ *
+ * XL = 40 (und nicht XXXX)
+ * IX = 9 (und nicht VIIII)
+ * Diese "Subtraktionsschreibweise" ist erst im Mittelalter allgemein gebräuchlich geworden.
+ * Vorher wurde oft "IIII" für "4" geshrieben.
+ *
+ * 4. Bei mehreren möglichen Schreibweisen wird in der Regel der kürzesten der Vorzug gegeben:
+ *
+ * IC = 99 (auch LXLIX)
+ * IL = 49 (auch XLIX oder sogar XLVIV)
+ * Andererseits gibt es die Vorschrift, nach der ein Symbol, das einen Wert von 10n darstellt,
+ * nicht einem Symbol, das einen Wert von 10(n+1) darstellt, direkt voranstehen darf.
+ * Nach dieser Regel wäre die Schreibweise "XCIX" für "99" der Schreibweise "IC" vorzuziehen.
+ *
+ * 5. Die römischen Zahlen V, L und D können nicht größeren Zahlen voran gestellt werden:
+ *
+ * XCV = 95 (nicht VC)
+ *
+ * Zahlen über 3000 werden dargestellt durch Einkastung der Tausender: |IX|LIV=9054
+ *
+ *
+ * Zahlen größer als 3.000.000 werden durch Doppelstrich etc. dargestellt.
+ */
+
+ /**
+ * Array with Roman digits.
+ */
+ private static final RomanDigit[] roman =
+ {
+ new RomanDigit('m', 1000, false),
+ new RomanDigit('d', 500, false),
+ new RomanDigit('c', 100, true),
+ new RomanDigit('l', 50, false),
+ new RomanDigit('x', 10, true),
+ new RomanDigit('v', 5, false),
+ new RomanDigit('i', 1, true)};
+
+ /**
+ * changes an int into a lower case roman number.
+ * @param number the original number
+ * @return the roman number (lower case)
+ */
+ public static String toRoman(int number) {
+ return toRomanLowerCase(number);
+ }
+
+ /**
+ * Changes an int into an upper case roman number.
+ * @param number the original number
+ * @return the roman number (upper case)
+ */
+ public static String toRomanUppercase(int number) {
+ return toRomanLowerCase(number).toUpperCase();
+ }
+
+ /**
+ * Changes an int into a lower case roman number.
+ * @param number the original number
+ * @return the roman number (lower case)
+ */
+ public static String toRomanLowerCase(int number) {
+
+ // Buffer
+ StringBuffer buf = new StringBuffer();
+
+ // kleiner 0 ? Vorzeichen festlegen
+ if (number < 0) {
+ buf.append('-');
+ number = -number;
+ }
+
+ // größer 3000
+ if (number > 3000) {
+ // rekursiver Aufruf (ohne tausender-Bereich)
+ buf.append('|');
+ buf.append(toRomanLowerCase(number / 1000));
+ buf.append('|');
+ // tausender-Bereich
+ number = number - (number / 1000) * 1000;
+ }
+
+ // Schleife
+ int pos = 0;
+ while (true) {
+ // roman-array durchlaufen
+ RomanDigit dig = roman[pos];
+
+ // solange Zahl größer roman-Wert
+ while (number >= dig.value) {
+ // Zeichen hinzufügen
+ buf.append(dig.digit);
+ // Wert des Zeichens abziehen
+ number -= dig.value;
+ }
+
+ // Abbruch
+ if (number <= 0) {
+ break;
+ }
+ // pre=false suchen (ab Stelle pos)
+ int j = pos;
+ while (!roman[++j].pre);
+
+ // neuer Wert größer
+ if (number + roman[j].value >= dig.value) {
+ // hinzufügen
+ buf.append(roman[j].digit).append(dig.digit);
+ // Wert vom Rest abziehen
+ number -= dig.value - roman[j].value;
+ }
+ pos++;
+ }
+ return buf.toString();
+ }
+
+ /**
+ * Helper class for Roman Digits
+ */
+ private static class RomanDigit {
+
+ /** part of a roman number */
+ public char digit;
+
+ /** value of the roman digit */
+ public int value;
+
+ /** can the digit be used as a prefix */
+ public boolean pre;
+
+ /**
+ * Constructs a roman digit
+ * @param digit the roman digit
+ * @param value the value
+ * @param pre can it be used as a prefix
+ */
+ RomanDigit(char digit, int value, boolean pre) {
+ this.digit = digit;
+ this.value = value;
+ this.pre = pre;
+ }
+ }
+
+}
diff --git a/src/main/java/com/lowagie/text/Row.java b/src/main/java/com/lowagie/text/Row.java
new file mode 100644
index 0000000..3604d92
--- /dev/null
+++ b/src/main/java/com/lowagie/text/Row.java
@@ -0,0 +1,470 @@
+/*
+ * $Id: Row.java,v 1.63 2005/04/13 09:17:11 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU LIBRARY GENERAL PUBLIC LICENSE for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text;
+
+import java.util.ArrayList;
+import java.util.Properties;
+import java.util.Set;
+
+/**
+ * A <CODE>Row</CODE> is part of a <CODE>Table</CODE>
+ * and contains some <CODE>Cells</CODE>.
+ * <P>
+ * All <CODE>Row</CODE>s are constructed by a <CODE>Table</CODE>-object.
+ * You don't have to construct any <CODE>Row</CODE> yourself.
+ * In fact you can't construct a <CODE>Row</CODE> outside the package.
+ * <P>
+ * Since a <CODE>Cell</CODE> can span several rows and/or columns
+ * a row can contain reserved space without any content.
+ *
+ * @see Element
+ * @see Cell
+ * @see Table
+ */
+
+public class Row implements Element, MarkupAttributes {
+
+ // membervariables
+
+/** id of a null element in a Row*/
+ public static final int NULL = 0;
+
+/** id of the Cell element in a Row*/
+ public static final int CELL = 1;
+
+/** id of the Table element in a Row*/
+ public static final int TABLE = 2;
+
+/** This is the number of columns in the <CODE>Row</CODE>. */
+ protected int columns;
+
+/** This is a valid position the <CODE>Row</CODE>. */
+ protected int currentColumn;
+
+/** This is the array that keeps track of reserved cells. */
+ protected boolean[] reserved;
+
+/** This is the array of Objects (<CODE>Cell</CODE> or <CODE>Table</CODE>). */
+ protected Object[] cells;
+
+/** This is the vertical alignment. */
+ protected int horizontalAlignment;
+
+/** This is the vertical alignment. */
+ protected int verticalAlignment;
+
+/** Contains extra markupAttributes */
+ protected Properties markupAttributes;
+
+ // constructors
+
+/**
+ * Constructs a <CODE>Row</CODE> with a certain number of <VAR>columns</VAR>.
+ *
+ * @param columns a number of columns
+ */
+
+ protected Row(int columns) {
+ this.columns = columns;
+ reserved = new boolean[columns];
+ cells = new Object[columns];
+ currentColumn = 0;
+ }
+
+ // implementation of the Element-methods
+
+/**
+ * Processes the element by adding it (or the different parts) to a
+ * <CODE>ElementListener</CODE>.
+ *
+ * @param listener an <CODE>ElementListener</CODE>
+ * @return <CODE>true</CODE> if the element was processed successfully
+ */
+
+ public boolean process(ElementListener listener) {
+ try {
+ return listener.add(this);
+ }
+ catch(DocumentException de) {
+ return false;
+ }
+ }
+
+/**
+ * Gets the type of the text element.
+ *
+ * @return a type
+ */
+
+ public int type() {
+ return Element.ROW;
+ }
+
+/**
+ * Gets all the chunks in this element.
+ *
+ * @return an <CODE>ArrayList</CODE>
+ */
+
+ public ArrayList getChunks() {
+ return new ArrayList();
+ }
+
+/**
+ * Returns a <CODE>Row</CODE> that is a copy of this <CODE>Row</CODE>
+ * in which a certain column has been deleted.
+ *
+ * @param column the number of the column to delete
+ */
+
+ void deleteColumn(int column) {
+ if ((column >= columns) || (column < 0)) {
+ throw new IndexOutOfBoundsException("getCell at illegal index : " + column);
+ }
+ columns--;
+ boolean newReserved[] = new boolean[columns];
+ Object newCells[] = new Cell[columns];
+
+ for (int i = 0; i < column; i++) {
+ newReserved[i] = reserved[i];
+ newCells[i] = cells[i];
+ if (newCells[i] != null && (i + ((Cell) newCells[i]).colspan() > column)) {
+ ((Cell) newCells[i]).setColspan(((Cell) cells[i]).colspan() - 1);
+ }
+ }
+ for (int i = column; i < columns; i++) {
+ newReserved[i] = reserved[i + 1];
+ newCells[i] = cells[i + 1];
+ }
+ if (cells[column] != null && ((Cell) cells[column]).colspan() > 1) {
+ newCells[column] = cells[column];
+ ((Cell) newCells[column]).setColspan(((Cell) newCells[column]).colspan() - 1);
+ }
+ reserved = newReserved;
+ cells = newCells;
+ }
+
+ // methods
+
+/**
+ * Adds a <CODE>Cell</CODE> to the <CODE>Row</CODE>.
+ *
+ * @param element the element to add (currently only Cells and Tables supported)
+ * @return the column position the <CODE>Cell</CODE> was added,
+ * or <CODE>-1</CODE> if the <CODE>element</CODE> couldn't be added.
+ */
+
+ int addElement(Object element) {
+ return addElement(element, currentColumn);
+ }
+
+/**
+ * Adds an element to the <CODE>Row</CODE> at the position given.
+ *
+ * @param element the element to add. (currently only Cells and Tables supported
+ * @param column the position where to add the cell.
+ * @return the column position the <CODE>Cell</CODE> was added,
+ * or <CODE>-1</CODE> if the <CODE>Cell</CODE> couldn't be added.
+ */
+
+ int addElement(Object element, int column) {
+ if (element == null) throw new NullPointerException("addCell - null argument");
+ if ((column < 0) || (column > columns)) throw new IndexOutOfBoundsException("addCell - illegal column argument");
+ if ( !((getObjectID(element) == CELL) || (getObjectID(element) == TABLE)) ) throw new IllegalArgumentException("addCell - only Cells or Tables allowed");
+
+ int lColspan = ( (Cell.class.isInstance(element)) ? ((Cell) element).colspan() : 1);
+
+ if ( reserve(column, lColspan) == false ) {
+ return -1;
+ }
+
+ cells[column] = element;
+ currentColumn += lColspan - 1;
+
+ return column;
+ }
+
+/**
+ * Puts <CODE>Cell</CODE> to the <CODE>Row</CODE> at the position given, doesn't reserve colspan.
+ *
+ * @param aElement the cell to add.
+ * @param column the position where to add the cell.
+ */
+
+ void setElement(Object aElement, int column) {
+ if (reserved[column] == true) throw new IllegalArgumentException("setElement - position already taken");
+
+ cells[column] = aElement;
+ if (aElement != null) {
+ reserved[column] = true;
+ }
+ }
+
+/**
+ * Reserves a <CODE>Cell</CODE> in the <CODE>Row</CODE>.
+ *
+ * @param column the column that has to be reserved.
+ * @return <CODE>true</CODE> if the column was reserved, <CODE>false</CODE> if not.
+ */
+
+ boolean reserve(int column) {
+ return reserve(column, 1);
+ }
+
+
+/**
+ * Reserves a <CODE>Cell</CODE> in the <CODE>Row</CODE>.
+ *
+ * @param column the column that has to be reserved.
+ * @param size the number of columns
+ * @return <CODE>true</CODE> if the column was reserved, <CODE>false</CODE> if not.
+ */
+
+ boolean reserve(int column, int size) {
+ if ((column < 0) || ((column + size) > columns)) throw new IndexOutOfBoundsException("reserve - incorrect column/size");
+
+ for(int i=column; i < column + size; i++)
+ {
+ if (reserved[i] == true) {
+ // undo reserve
+ for(int j=i; j >= column; j--) {
+ reserved[i] = false;
+ }
+ return false;
+ }
+ reserved[i] = true;
+ }
+ return true;
+ }
+
+/**
+ * Sets the horizontal alignment.
+ *
+ * @param value the new value
+ */
+
+ public void setHorizontalAlignment(int value) {
+ horizontalAlignment = value;
+ }
+
+/**
+ * Sets the vertical alignment.
+ *
+ * @param value the new value
+ */
+
+ public void setVerticalAlignment(int value) {
+ verticalAlignment = value;
+ }
+
+ // methods to retrieve information
+
+/**
+ * Returns true/false when this position in the <CODE>Row</CODE> has been reserved, either filled or through a colspan of an Element.
+ *
+ * @param column the column.
+ * @return <CODE>true</CODE> if the column was reserved, <CODE>false</CODE> if not.
+ */
+
+ boolean isReserved(int column) {
+ return reserved[column];
+ }
+
+/**
+ * Returns the type-id of the element in a Row.
+ *
+ * @param column the column of which you'd like to know the type
+ * @return the type-id of the element in the row
+ */
+
+ int getElementID(int column) {
+ if (cells[column] == null) return NULL;
+ else if (Cell.class.isInstance(cells[column])) return CELL;
+ else if (Table.class.isInstance(cells[column])) return TABLE;
+
+ return -1;
+ }
+
+
+/**
+ * Returns the type-id of an Object.
+ *
+ * @param element the object of which you'd like to know the type-id, -1 if invalid
+ * @return the type-id of an object
+ */
+
+ int getObjectID(Object element) {
+ if (element == null) return NULL;
+ else if (Cell.class.isInstance(element)) return CELL;
+ else if (Table.class.isInstance(element)) return TABLE;
+
+ return -1;
+ }
+
+
+/**
+ * Gets a <CODE>Cell</CODE> or <CODE>Table</CODE> from a certain column.
+ *
+ * @param column the column the <CODE>Cell/Table</CODE> is in.
+ * @return the <CODE>Cell</CODE>,<CODE>Table</CODE> or <VAR>Object</VAR> if the column was
+ * reserved or null if empty.
+ */
+
+ public Object getCell(int column) {
+ if ((column < 0) || (column > columns)) {
+ throw new IndexOutOfBoundsException("getCell at illegal index :" + column + " max is " + columns);
+ }
+ return cells[column];
+ }
+
+/**
+ * Checks if the row is empty.
+ *
+ * @return <CODE>true</CODE> if none of the columns is reserved.
+ */
+
+ public boolean isEmpty() {
+ for (int i = 0; i < columns; i++) {
+ if (cells[i] != null) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+/**
+ * Gets the index of the current, valid position
+ *
+ * @return a value
+ */
+
+ int validPosition() {
+ return currentColumn;
+ }
+
+/**
+ * Gets the number of columns.
+ *
+ * @return a value
+ */
+
+ public int columns() {
+ return columns;
+ }
+
+/**
+ * Gets the horizontal alignment.
+ *
+ * @return a value
+ */
+
+ public int horizontalAlignment() {
+ return horizontalAlignment;
+ }
+
+/**
+ * Gets the vertical alignment.
+ *
+ * @return a value
+ */
+
+ public int verticalAlignment() {
+ return verticalAlignment;
+ }
+
+/**
+ * Checks if a given tag corresponds with this object.
+ *
+ * @param tag the given tag
+ * @return true if the tag corresponds
+ */
+
+ public static boolean isTag(String tag) {
+ return ElementTags.ROW.equals(tag);
+ }
+
+
+/**
+ * @see com.lowagie.text.MarkupAttributes#setMarkupAttribute(java.lang.String, java.lang.String)
+ */
+ public void setMarkupAttribute(String name, String value) {
+ if (markupAttributes == null) markupAttributes = new Properties();
+ markupAttributes.put(name, value);
+ }
+
+/**
+ * @see com.lowagie.text.MarkupAttributes#setMarkupAttributes(java.util.Properties)
+ */
+ public void setMarkupAttributes(Properties markupAttributes) {
+ this.markupAttributes = markupAttributes;
+ }
+
+/**
+ * @see com.lowagie.text.MarkupAttributes#getMarkupAttribute(java.lang.String)
+ */
+ public String getMarkupAttribute(String name) {
+ return (markupAttributes == null) ? null : String.valueOf(markupAttributes.get(name));
+ }
+
+/**
+ * @see com.lowagie.text.MarkupAttributes#getMarkupAttributeNames()
+ */
+ public Set getMarkupAttributeNames() {
+ return Chunk.getKeySet(markupAttributes);
+ }
+
+/**
+ * @see com.lowagie.text.MarkupAttributes#getMarkupAttributes()
+ */
+ public Properties getMarkupAttributes() {
+ return markupAttributes;
+ }
+}
diff --git a/src/main/java/com/lowagie/text/Section.java b/src/main/java/com/lowagie/text/Section.java
new file mode 100644
index 0000000..ea5c4ec
--- /dev/null
+++ b/src/main/java/com/lowagie/text/Section.java
@@ -0,0 +1,660 @@
+/*
+ * $Id: Section.java,v 1.81 2005/09/28 07:55:29 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.Properties;
+
+/**
+ * A <CODE>Section</CODE> is a part of a <CODE>Document</CODE> containing
+ * other <CODE>Section</CODE>s, <CODE>Paragraph</CODE>s, <CODE>List</CODE>
+ * and/or <CODE>Table</CODE>s.
+ * <P>
+ * Remark: you can not construct a <CODE>Section</CODE> yourself.
+ * You will have to ask an instance of <CODE>Section</CODE> to the
+ * <CODE>Chapter</CODE> or <CODE>Section</CODE> to which you want to
+ * add the new <CODE>Section</CODE>.
+ * <P>
+ * Example:
+ * <BLOCKQUOTE><PRE>
+ * Paragraph title2 = new Paragraph("This is Chapter 2", FontFactory.getFont(FontFactory.HELVETICA, 18, Font.BOLDITALIC, new Color(0, 0, 255)));
+ * Chapter chapter2 = new Chapter(title2, 2);
+ * Paragraph someText = new Paragraph("This is some text");
+ * chapter2.add(someText);
+ * Paragraph title21 = new Paragraph("This is Section 1 in Chapter 2", FontFactory.getFont(FontFactory.HELVETICA, 16, Font.BOLD, new Color(255, 0, 0)));
+ * <STRONG>Section section1 = chapter2.addSection(title21);</STRONG>
+ * Paragraph someSectionText = new Paragraph("This is some silly paragraph in a chapter and/or section. It contains some text to test the functionality of Chapters and Section.");
+ * <STRONG>section1.add(someSectionText);</STRONG>
+ * Paragraph title211 = new Paragraph("This is SubSection 1 in Section 1 in Chapter 2", FontFactory.getFont(FontFactory.HELVETICA, 14, Font.BOLD, new Color(255, 0, 0)));
+ * <STRONG>Section section11 = section1.addSection(40, title211, 2);</STRONG>
+ * <STRONG>section11.add(someSectionText);</STRONG>
+ * </PRE></BLOCKQUOTE>
+ */
+
+public class Section extends ArrayList implements TextElementArray {
+
+ // membervariables
+
+/** This is the title of this section. */
+ protected Paragraph title;
+
+/** This is the number of sectionnumbers that has to be shown before the section title. */
+ protected int numberDepth;
+
+/** The indentation of this section on the left side. */
+ protected float indentationLeft;
+
+/** The indentation of this section on the right side. */
+ protected float indentationRight;
+
+/** The additional indentation of the content of this section. */
+ protected float sectionIndent;
+
+/** This is the number of subsections. */
+ protected int subsections = 0;
+
+/** This is the complete list of sectionnumbers of this section and the parents of this section. */
+ protected ArrayList numbers = null;
+
+ /** false if the bookmark children are not visible */
+ protected boolean bookmarkOpen = true;
+
+ /** The bookmark title if different from the content title */
+ protected String bookmarkTitle;
+ // constructors
+
+/**
+ * Constructs a new <CODE>Section</CODE>.
+ */
+
+ protected Section() {
+ title = new Paragraph();
+ numberDepth = 1;
+ }
+
+/**
+ * Constructs a new <CODE>Section</CODE>.
+ *
+ * @param title a <CODE>Paragraph</CODE>
+ * @param numberDepth the numberDepth
+ */
+
+ Section(Paragraph title, int numberDepth) {
+ this.numberDepth = numberDepth;
+ this.title = title;
+ }
+
+ // private methods
+
+/**
+ * Sets the number of this section.
+ *
+ * @param number the number of this section
+ * @param numbers an <CODE>ArrayList</CODE>, containing the numbers of the Parent
+ */
+
+ private void setNumbers(int number, ArrayList numbers) {
+ this.numbers = new ArrayList();
+ this.numbers.add(new Integer(number));
+ this.numbers.addAll(numbers);
+ }
+
+ // implementation of the Element-methods
+
+/**
+ * Processes the element by adding it (or the different parts) to an
+ * <CODE>ElementListener</CODE>.
+ *
+ * @param listener the <CODE>ElementListener</CODE>
+ * @return <CODE>true</CODE> if the element was processed successfully
+ */
+
+ public boolean process(ElementListener listener) {
+ try {
+ for (Iterator i = iterator(); i.hasNext(); ) {
+ listener.add((Element) i.next());
+ }
+ return true;
+ }
+ catch(DocumentException de) {
+ return false;
+ }
+ }
+
+/**
+ * Gets the type of the text element.
+ *
+ * @return a type
+ */
+
+ public int type() {
+ return Element.SECTION;
+ }
+
+/**
+ * Gets all the chunks in this element.
+ *
+ * @return an <CODE>ArrayList</CODE>
+ */
+
+ public ArrayList getChunks() {
+ ArrayList tmp = new ArrayList();
+ for (Iterator i = iterator(); i.hasNext(); ) {
+ tmp.addAll(((Element) i.next()).getChunks());
+ }
+ return tmp;
+ }
+
+ // overriding some of the ArrayList-methods
+
+/**
+ * Adds a <CODE>Paragraph</CODE>, <CODE>List</CODE> or <CODE>Table</CODE>
+ * to this <CODE>Section</CODE>.
+ *
+ * @param index index at which the specified element is to be inserted
+ * @param o an object of type <CODE>Paragraph</CODE>, <CODE>List</CODE> or <CODE>Table</CODE>=
+ * @throws ClassCastException if the object is not a <CODE>Paragraph</CODE>, <CODE>List</CODE> or <CODE>Table</CODE>
+ */
+
+ public void add(int index, Object o) {
+ try {
+ Element element = (Element) o;
+ if (element.type() == Element.PARAGRAPH ||
+ element.type() == Element.LIST ||
+ element.type() == Element.CHUNK ||
+ element.type() == Element.PHRASE ||
+ element.type() == Element.ANCHOR ||
+ element.type() == Element.ANNOTATION ||
+ element.type() == Element.TABLE ||
+ element.type() == Element.PTABLE ||
+ element.type() == Element.IMGTEMPLATE ||
+ element.type() == Element.JPEG ||
+ element.type() == Element.IMGRAW) {
+ super.add(index, element);
+ }
+ else {
+ throw new ClassCastException(String.valueOf(element.type()));
+ }
+ }
+ catch(ClassCastException cce) {
+ throw new ClassCastException("Insertion of illegal Element: " + cce.getMessage());
+ }
+ }
+
+/**
+ * Adds a <CODE>Paragraph</CODE>, <CODE>List</CODE>, <CODE>Table</CODE> or another <CODE>Section</CODE>
+ * to this <CODE>Section</CODE>.
+ *
+ * @param o an object of type <CODE>Paragraph</CODE>, <CODE>List</CODE>, <CODE>Table</CODE> or another <CODE>Section</CODE>
+ * @return a boolean
+ * @throws ClassCastException if the object is not a <CODE>Paragraph</CODE>, <CODE>List</CODE>, <CODE>Table</CODE> or <CODE>Section</CODE>
+ */
+
+ public boolean add(Object o) {
+ try {
+ Element element = (Element) o;
+ if (element.type() == Element.PARAGRAPH ||
+ element.type() == Element.LIST ||
+ element.type() == Element.CHUNK ||
+ element.type() == Element.PHRASE ||
+ element.type() == Element.ANCHOR ||
+ element.type() == Element.ANNOTATION ||
+ element.type() == Element.TABLE ||
+ element.type() == Element.IMGTEMPLATE ||
+ element.type() == Element.PTABLE ||
+ element.type() == Element.JPEG ||
+ element.type() == Element.IMGRAW) {
+ return super.add(o);
+ }
+ else if (element.type() == Element.SECTION) {
+ Section section = (Section) o;
+ section.setNumbers(++subsections, numbers);
+ return super.add(section);
+ }
+ else {
+ throw new ClassCastException(String.valueOf(element.type()));
+ }
+ }
+ catch(ClassCastException cce) {
+ throw new ClassCastException("Insertion of illegal Element: " + cce.getMessage());
+ }
+ }
+
+/**
+ * Adds a collection of <CODE>Element</CODE>s
+ * to this <CODE>Section</CODE>.
+ *
+ * @param collection a collection of <CODE>Paragraph</CODE>s, <CODE>List</CODE>s and/or <CODE>Table</CODE>s
+ * @return <CODE>true</CODE> if the action succeeded, <CODE>false</CODE> if not.
+ * @throws ClassCastException if one of the objects isn't a <CODE>Paragraph</CODE>, <CODE>List</CODE>, <CODE>Table</CODE>
+ */
+
+ public boolean addAll(Collection collection) {
+ for (Iterator iterator = collection.iterator(); iterator.hasNext(); ) {
+ this.add(iterator.next());
+ }
+ return true;
+ }
+
+ // methods that return a Section
+
+/**
+ * Creates a <CODE>Section</CODE>, adds it to this <CODE>Section</CODE> and returns it.
+ *
+ * @param indentation the indentation of the new section
+ * @param title the title of the new section
+ * @param numberDepth the numberDepth of the section
+ * @return a new Section object
+ */
+
+ public Section addSection(float indentation, Paragraph title, int numberDepth) {
+ Section section = new Section(title, numberDepth);
+ section.setIndentation(indentation);
+ add(section);
+ return section;
+ }
+
+/**
+ * Creates a <CODE>Section</CODE>, adds it to this <CODE>Section</CODE> and returns it.
+ *
+ * @param indentation the indentation of the new section
+ * @param title the title of the new section
+ * @return a new Section object
+ */
+
+ public Section addSection(float indentation, Paragraph title) {
+ Section section = new Section(title, 1);
+ section.setIndentation(indentation);
+ add(section);
+ return section;
+ }
+
+/**
+ * Creates a <CODE>Section</CODE>, add it to this <CODE>Section</CODE> and returns it.
+ *
+ * @param title the title of the new section
+ * @param numberDepth the numberDepth of the section
+ * @return a new Section object
+ */
+
+ public Section addSection(Paragraph title, int numberDepth) {
+ Section section = new Section(title, numberDepth);
+ add(section);
+ return section;
+ }
+
+/**
+ * Creates a <CODE>Section</CODE>, adds it to this <CODE>Section</CODE> and returns it.
+ *
+ * @param title the title of the new section
+ * @return a new Section object
+ */
+
+ public Section addSection(Paragraph title) {
+ Section section = new Section(title, numberDepth + 1);
+ add(section);
+ return section;
+ }
+
+/**
+ * Adds a <CODE>Section</CODE> to this <CODE>Section</CODE> and returns it.
+ *
+ * @param indentation the indentation of the new section
+ * @param title the title of the new section
+ * @param numberDepth the numberDepth of the section
+ * @return a new Section object
+ */
+
+ public Section addSection(float indentation, String title, int numberDepth) {
+ Section section = new Section(new Paragraph(title), numberDepth);
+ section.setIndentation(indentation);
+ add(section);
+ return section;
+ }
+
+/**
+ * Adds a <CODE>Section</CODE> to this <CODE>Section</CODE> and returns it.
+ *
+ * @param title the title of the new section
+ * @param numberDepth the numberDepth of the section
+ * @return a new Section object
+ */
+
+ public Section addSection(String title, int numberDepth) {
+ Section section = new Section(new Paragraph(title), numberDepth);
+ add(section);
+ return section;
+ }
+
+/**
+ * Adds a <CODE>Section</CODE> to this <CODE>Section</CODE> and returns it.
+ *
+ * @param indentation the indentation of the new section
+ * @param title the title of the new section
+ * @return a new Section object
+ */
+
+ public Section addSection(float indentation, String title) {
+ Section section = new Section(new Paragraph(title), 1);
+ section.setIndentation(indentation);
+ add(section);
+ return section;
+ }
+
+/**
+ * Adds a <CODE>Section</CODE> to this <CODE>Section</CODE> and returns it.
+ *
+ * @param title the title of the new section
+ * @return a new Section object
+ */
+
+ public Section addSection(String title) {
+ Section section = new Section(new Paragraph(title), numberDepth + 1);
+ add(section);
+ return section;
+ }
+
+/**
+ * Creates a given <CODE>Section</CODE> following a set of attributes and adds it to this one.
+ *
+ * @param attributes the attributes
+ * @return a Section
+ */
+
+ public Section addSection(Properties attributes) {
+ Section section = new Section(new Paragraph(""), 1);
+ String value;
+ if ((value = (String)attributes.remove(ElementTags.NUMBER)) != null) {
+ subsections = Integer.parseInt(value) - 1;
+ }
+ section.set(attributes);
+ add(section);
+ return section;
+ }
+
+
+ // public methods
+
+/**
+ * Alters the attributes of this <CODE>Section</CODE>.
+ *
+ * @param attributes the attributes
+ */
+
+ public void set(Properties attributes) {
+ String value;
+ if ((value = (String)attributes.remove(ElementTags.NUMBERDEPTH)) != null) {
+ setNumberDepth(Integer.parseInt(value));
+ }
+ if ((value = (String)attributes.remove(ElementTags.INDENT)) != null) {
+ setIndentation(Float.valueOf(value + "f").floatValue());
+ }
+ if ((value = (String)attributes.remove(ElementTags.INDENTATIONLEFT)) != null) {
+ setIndentationLeft(Float.valueOf(value + "f").floatValue());
+ }
+ if ((value = (String)attributes.remove(ElementTags.INDENTATIONRIGHT)) != null) {
+ setIndentationRight(Float.valueOf(value + "f").floatValue());
+ }
+ }
+
+/**
+ * Sets the title of this section.
+ *
+ * @param title the new title
+ */
+
+ public void setTitle(Paragraph title) {
+ this.title = title;
+ }
+
+/**
+ * Sets the depth of the sectionnumbers that will be shown preceding the title.
+ * <P>
+ * If the numberdepth is 0, the sections will not be numbered. If the numberdepth
+ * is 1, the section will be numbered with their own number. If the numberdepth is
+ * higher (for instance x > 1), the numbers of x - 1 parents will be shown.
+ *
+ * @param numberDepth the new numberDepth
+ */
+
+ public void setNumberDepth(int numberDepth) {
+ this.numberDepth = numberDepth;
+ }
+
+/**
+ * Sets the indentation of this <CODE>Section</CODE> on the left side.
+ *
+ * @param indentation the indentation
+ */
+
+ public void setIndentationLeft(float indentation) {
+ indentationLeft = indentation;
+ }
+
+/**
+ * Sets the indentation of this <CODE>Section</CODE> on the right side.
+ *
+ * @param indentation the indentation
+ */
+
+ public void setIndentationRight(float indentation) {
+ indentationRight = indentation;
+ }
+
+/**
+ * Sets the indentation of the content of this <CODE>Section</CODE>.
+ *
+ * @param indentation the indentation
+ */
+
+ public void setIndentation(float indentation) {
+ sectionIndent = indentation;
+ }
+
+ // methods to retrieve information
+
+/**
+ * Checks if this object is a <CODE>Chapter</CODE>.
+ *
+ * @return <CODE>true</CODE> if it is a <CODE>Chapter</CODE>,
+ * <CODE>false</CODE> if it is a <CODE>Section</CODE>.
+ */
+
+ public boolean isChapter() {
+ return type() == Element.CHAPTER;
+ }
+
+/**
+ * Checks if this object is a <CODE>Section</CODE>.
+ *
+ * @return <CODE>true</CODE> if it is a <CODE>Section</CODE>,
+ * <CODE>false</CODE> if it is a <CODE>Chapter</CODE>.
+ */
+
+ public boolean isSection() {
+ return type() == Element.SECTION;
+ }
+
+/**
+ * Returns the numberdepth of this <CODE>Section</CODE>.
+ *
+ * @return the numberdepth
+ */
+
+ public int numberDepth() {
+ return numberDepth;
+ }
+
+/**
+ * Returns the indentation of this <CODE>Section</CODE> on the left side.
+ *
+ * @return the indentation
+ */
+
+ public float indentationLeft() {
+ return indentationLeft;
+ }
+
+/**
+ * Returns the indentation of this <CODE>Section</CODE> on the right side.
+ *
+ * @return the indentation
+ */
+
+ public float indentationRight() {
+ return indentationRight;
+ }
+
+/**
+ * Returns the indentation of the content of this <CODE>Section</CODE>.
+ *
+ * @return the indentation
+ */
+
+ public float indentation() {
+ return sectionIndent;
+ }
+
+/**
+ * Returns the depth of this section.
+ *
+ * @return the depth
+ */
+
+ public int depth() {
+ return numbers.size();
+ }
+
+/**
+ * Returns the title, preceeded by a certain number of sectionnumbers.
+ *
+ * @return a <CODE>Paragraph</CODE>
+ */
+
+ public Paragraph title() {
+ if (title == null) {
+ return null;
+ }
+ int depth = Math.min(numbers.size(), numberDepth);
+ if (depth < 1) {
+ return title;
+ }
+ StringBuffer buf = new StringBuffer(" ");
+ for (int i = 0; i < depth; i++) {
+ buf.insert(0, ".");
+ buf.insert(0, ((Integer) numbers.get(i)).intValue());
+ }
+ Paragraph result = new Paragraph(title);
+ result.setMarkupAttributes(title.getMarkupAttributes());
+ result.add(0, new Chunk(buf.toString(), title.font()));
+ return result;
+ }
+
+/**
+ * Checks if a given tag corresponds with a title tag for this object.
+ *
+ * @param tag the given tag
+ * @return true if the tag corresponds
+ */
+
+ public static boolean isTitle(String tag) {
+ return ElementTags.TITLE.equals(tag);
+ }
+
+/**
+ * Checks if a given tag corresponds with this object.
+ *
+ * @param tag the given tag
+ * @return true if the tag corresponds
+ */
+
+ public static boolean isTag(String tag) {
+ return ElementTags.SECTION.equals(tag);
+ }
+
+ /** Getter for property bookmarkOpen.
+ * @return Value of property bookmarkOpen.
+ */
+ public boolean isBookmarkOpen() {
+ return bookmarkOpen;
+ }
+
+ /** Setter for property bookmarkOpen.
+ * @param bookmarkOpen false if the bookmark children are not
+ * visible.
+ */
+ public void setBookmarkOpen(boolean bookmarkOpen) {
+ this.bookmarkOpen = bookmarkOpen;
+ }
+
+ /**
+ * Gets the bookmark title.
+ * @return the bookmark title
+ */
+ public Paragraph getBookmarkTitle() {
+ if (bookmarkTitle == null)
+ return title();
+ else
+ return new Paragraph(bookmarkTitle);
+ }
+
+ /**
+ * Sets the bookmark title. The bookmark title is the same as the section title but
+ * can be changed with this method.
+ * @param bookmarkTitle the bookmark title
+ */
+ public void setBookmarkTitle(String bookmarkTitle) {
+ this.bookmarkTitle = bookmarkTitle;
+ }
+
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/SimpleCell.java b/src/main/java/com/lowagie/text/SimpleCell.java
new file mode 100644
index 0000000..ab3a057
--- /dev/null
+++ b/src/main/java/com/lowagie/text/SimpleCell.java
@@ -0,0 +1,539 @@
+/*
+ * $Id: SimpleCell.java,v 1.7 2005/09/18 13:17:57 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 1999-2005 by Bruno Lowagie.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU LIBRARY GENERAL PUBLIC LICENSE for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+package com.lowagie.text;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+
+import com.lowagie.text.pdf.PdfContentByte;
+import com.lowagie.text.pdf.PdfPCell;
+import com.lowagie.text.pdf.PdfPCellEvent;
+import com.lowagie.text.pdf.PdfPTable;
+
+/**
+ * Rectangle that can be used for Cells.
+ * This Rectangle is padded and knows how to draw itself in a PdfPTable or PdfPcellEvent.
+ */
+public class SimpleCell extends Rectangle implements PdfPCellEvent, Element, TextElementArray {
+
+ /** the CellAttributes object represents a row. */
+ public static final boolean ROW = true;
+ /** the CellAttributes object represents a cell. */
+ public static final boolean CELL = false;
+ /** the content of the Cell. */
+ private ArrayList content = new ArrayList();
+ /** the width of the Cell. */
+ private float width = 0f;
+ /** the widthpercentage of the Cell. */
+ private float widthpercentage = 0f;
+ /** an extra spacing variable */
+ private float spacing_left = Float.NaN;
+ /** an extra spacing variable */
+ private float spacing_right = Float.NaN;
+ /** an extra spacing variable */
+ private float spacing_top = Float.NaN;
+ /** an extra spacing variable */
+ private float spacing_bottom = Float.NaN;
+ /** an extra padding variable */
+ private float padding_left = Float.NaN;
+ /** an extra padding variable */
+ private float padding_right = Float.NaN;
+ /** an extra padding variable */
+ private float padding_top = Float.NaN;
+ /** an extra padding variable */
+ private float padding_bottom = Float.NaN;
+ /** the colspan of a Cell */
+ private int colspan = 1;
+ /** horizontal alignment inside the Cell. */
+ private int horizontalAlignment = Element.ALIGN_UNDEFINED;
+ /** vertical alignment inside the Cell. */
+ private int verticalAlignment = Element.ALIGN_UNDEFINED;
+ /** indicates if these are the attributes of a single Cell (false) or a group of Cells (true). */
+ private boolean cellgroup = false;
+ /** Indicates that the largest ascender height should be used to determine the
+ * height of the first line. Note that this only has an effect when rendered
+ * to PDF. Setting this to true can help with vertical alignment problems. */
+ protected boolean useAscender = false;
+ /** Indicates that the largest descender height should be added to the height of
+ * the last line (so characters like y don't dip into the border). Note that
+ * this only has an effect when rendered to PDF. */
+ protected boolean useDescender = false;
+ /**
+ * Adjusts the cell contents to compensate for border widths. Note that
+ * this only has an effect when rendered to PDF.
+ */
+ protected boolean useBorderPadding;
+
+ /**
+ * A CellAttributes object is always constructed without any dimensions.
+ * Dimensions are defined after creation.
+ * @param row only true if the CellAttributes object represents a row.
+ */
+ public SimpleCell(boolean row) {
+ super(0f, 0f, 0f, 0f);
+ cellgroup = row;
+ setBorder(BOX);
+ }
+
+ /**
+ * Adds content to this object.
+ * @param element
+ * @throws BadElementException
+ */
+ public void addElement(Element element) throws BadElementException {
+ if (cellgroup) {
+ if (element instanceof SimpleCell) {
+ if(((SimpleCell)element).isCellgroup()) {
+ throw new BadElementException("You can't add one row to another row.");
+ }
+ content.add(element);
+ return;
+ }
+ else {
+ throw new BadElementException("You can only add cells to rows, no objects of type " + element.getClass().getName());
+ }
+ }
+ if (element.type() == Element.PARAGRAPH
+ || element.type() == Element.PHRASE
+ || element.type() == Element.ANCHOR
+ || element.type() == Element.CHUNK
+ || element.type() == Element.LIST
+ || element.type() == Element.JPEG
+ || element.type() == Element.IMGRAW
+ || element.type() == Element.IMGTEMPLATE) {
+ content.add(element);
+ }
+ else {
+ throw new BadElementException("You can't add an element of type " + element.getClass().getName() + " to a SimpleCell.");
+ }
+ }
+
+ /**
+ * Creates a Cell with these attributes.
+ * @param rowAttributes
+ * @return a cell based on these attributes.
+ * @throws BadElementException
+ */
+ public Cell createCell(SimpleCell rowAttributes) throws BadElementException {
+ Cell cell = new Cell();
+ cell.cloneNonPositionParameters(rowAttributes);
+ cell.softCloneNonPositionParameters(this);
+ cell.setColspan(colspan);
+ cell.setHorizontalAlignment(horizontalAlignment);
+ cell.setVerticalAlignment(verticalAlignment);
+ cell.setUseAscender(useAscender);
+ cell.setUseBorderPadding(useBorderPadding);
+ cell.setUseDescender(useDescender);
+ Element element;
+ for (Iterator i = content.iterator(); i.hasNext(); ) {
+ element = (Element)i.next();
+ cell.addElement(element);
+ }
+ return cell;
+ }
+
+ /**
+ * Creates a PdfPCell with these attributes.
+ * @param rowAttributes
+ * @return a PdfPCell based on these attributes.
+ */
+ public PdfPCell createPdfPCell(SimpleCell rowAttributes) {
+ PdfPCell cell = new PdfPCell();
+ cell.setBorder(NO_BORDER);
+ SimpleCell tmp = new SimpleCell(CELL);
+ tmp.setSpacing_left(spacing_left);
+ tmp.setSpacing_right(spacing_right);
+ tmp.setSpacing_top(spacing_top);
+ tmp.setSpacing_bottom(spacing_bottom);
+ tmp.cloneNonPositionParameters(rowAttributes);
+ tmp.softCloneNonPositionParameters(this);
+ cell.setCellEvent(tmp);
+ cell.setHorizontalAlignment(rowAttributes.horizontalAlignment);
+ cell.setVerticalAlignment(rowAttributes.verticalAlignment);
+ cell.setUseAscender(rowAttributes.useAscender);
+ cell.setUseBorderPadding(rowAttributes.useBorderPadding);
+ cell.setUseDescender(rowAttributes.useDescender);
+ cell.setColspan(colspan);
+ if (horizontalAlignment != Element.ALIGN_UNDEFINED)
+ cell.setHorizontalAlignment(horizontalAlignment);
+ if (verticalAlignment != Element.ALIGN_UNDEFINED)
+ cell.setVerticalAlignment(verticalAlignment);
+ if (useAscender)
+ cell.setUseAscender(useAscender);
+ if (useBorderPadding)
+ cell.setUseBorderPadding(useBorderPadding);
+ if (useDescender)
+ cell.setUseDescender(useDescender);
+ float p;
+ float sp_left = spacing_left;
+ if (Float.isNaN(sp_left)) sp_left = 0f;
+ float sp_right = spacing_right;
+ if (Float.isNaN(sp_right)) sp_right = 0f;
+ float sp_top = spacing_top;
+ if (Float.isNaN(sp_top)) sp_top = 0f;
+ float sp_bottom = spacing_bottom;
+ if (Float.isNaN(sp_bottom)) sp_bottom = 0f;
+ p = padding_left;
+ if (Float.isNaN(p)) p = 0f;
+ cell.setPaddingLeft(p + sp_left);
+ p = padding_right;
+ if (Float.isNaN(p)) p = 0f;
+ cell.setPaddingRight(p + sp_right);
+ p = padding_top;
+ if (Float.isNaN(p)) p = 0f;
+ cell.setPaddingTop(p + sp_top);
+ p = padding_bottom;
+ if (Float.isNaN(p)) p = 0f;
+ cell.setPaddingBottom(p + sp_bottom);
+ Element element;
+ for (Iterator i = content.iterator(); i.hasNext(); ) {
+ element = (Element)i.next();
+ cell.addElement(element);
+ }
+ return cell;
+ }
+
+ /**
+ * @param rectangle
+ * @param spacing
+ * @return a rectangle
+ */
+ public static SimpleCell getDimensionlessInstance(Rectangle rectangle, float spacing) {
+ SimpleCell event = new SimpleCell(CELL);
+ event.cloneNonPositionParameters(rectangle);
+ event.setSpacing(spacing * 2f);
+ return event;
+ }
+
+ /**
+ * @see com.lowagie.text.pdf.PdfPCellEvent#cellLayout(com.lowagie.text.pdf.PdfPCell, com.lowagie.text.Rectangle, com.lowagie.text.pdf.PdfContentByte[])
+ */
+ public void cellLayout(PdfPCell cell, Rectangle position, PdfContentByte[] canvases) {
+ float sp_left = spacing_left;
+ if (Float.isNaN(sp_left)) sp_left = 0f;
+ float sp_right = spacing_right;
+ if (Float.isNaN(sp_right)) sp_right = 0f;
+ float sp_top = spacing_top;
+ if (Float.isNaN(sp_top)) sp_top = 0f;
+ float sp_bottom = spacing_bottom;
+ if (Float.isNaN(sp_bottom)) sp_bottom = 0f;
+ Rectangle rect = new Rectangle(position.left(sp_left), position.bottom(sp_bottom), position.right(sp_right), position.top(sp_top));
+ rect.cloneNonPositionParameters(this);
+ canvases[PdfPTable.BACKGROUNDCANVAS].rectangle(rect);
+ rect.setBackgroundColor(null);
+ canvases[PdfPTable.LINECANVAS].rectangle(rect);
+ }
+
+ /** Sets the padding parameters if they are undefined.
+ * @param padding*/
+ public void setPadding(float padding) {
+ if (Float.isNaN(padding_right)) {
+ setPadding_right(padding);
+ }
+ if (Float.isNaN(padding_left)) {
+ setPadding_left(padding);
+ }
+ if (Float.isNaN(padding_top)) {
+ setPadding_top(padding);
+ }
+ if (Float.isNaN(padding_bottom)) {
+ setPadding_bottom(padding);
+ }
+ }
+
+ /**
+ * @return Returns the colspan.
+ */
+ public int getColspan() {
+ return colspan;
+ }
+ /**
+ * @param colspan The colspan to set.
+ */
+ public void setColspan(int colspan) {
+ if (colspan > 0) this.colspan = colspan;
+ }
+ /**
+ * @return Returns the padding_bottom.
+ */
+ public float getPadding_bottom() {
+ return padding_bottom;
+ }
+ /**
+ * @param padding_bottom The padding_bottom to set.
+ */
+ public void setPadding_bottom(float padding_bottom) {
+ this.padding_bottom = padding_bottom;
+ }
+ /**
+ * @return Returns the padding_left.
+ */
+ public float getPadding_left() {
+ return padding_left;
+ }
+ /**
+ * @param padding_left The padding_left to set.
+ */
+ public void setPadding_left(float padding_left) {
+ this.padding_left = padding_left;
+ }
+ /**
+ * @return Returns the padding_right.
+ */
+ public float getPadding_right() {
+ return padding_right;
+ }
+ /**
+ * @param padding_right The padding_right to set.
+ */
+ public void setPadding_right(float padding_right) {
+ this.padding_right = padding_right;
+ }
+ /**
+ * @return Returns the padding_top.
+ */
+ public float getPadding_top() {
+ return padding_top;
+ }
+ /**
+ * @param padding_top The padding_top to set.
+ */
+ public void setPadding_top(float padding_top) {
+ this.padding_top = padding_top;
+ }
+ /**
+ * @return Returns the spacing.
+ */
+ public float getSpacing_left() {
+ return spacing_left;
+ }
+ /**
+ * @return Returns the spacing.
+ */
+ public float getSpacing_right() {
+ return spacing_right;
+ }
+ /**
+ * @return Returns the spacing.
+ */
+ public float getSpacing_top() {
+ return spacing_top;
+ }
+ /**
+ * @return Returns the spacing.
+ */
+ public float getSpacing_bottom() {
+ return spacing_bottom;
+ }
+
+ /**
+ * @param spacing The spacing to set.
+ */
+ public void setSpacing(float spacing) {
+ this.spacing_left = spacing;
+ this.spacing_right = spacing;
+ this.spacing_top = spacing;
+ this.spacing_bottom = spacing;
+ }
+
+ /**
+ * @param spacing The spacing to set.
+ */
+ public void setSpacing_left(float spacing) {
+ this.spacing_left = spacing;
+ }
+
+ /**
+ * @param spacing The spacing to set.
+ */
+ public void setSpacing_right(float spacing) {
+ this.spacing_right = spacing;
+ }
+
+ /**
+ * @param spacing The spacing to set.
+ */
+ public void setSpacing_top(float spacing) {
+ this.spacing_top = spacing;
+ }
+
+ /**
+ * @param spacing The spacing to set.
+ */
+ public void setSpacing_bottom(float spacing) {
+ this.spacing_bottom = spacing;
+ }
+
+ /**
+ * @return Returns the cellgroup.
+ */
+ public boolean isCellgroup() {
+ return cellgroup;
+ }
+ /**
+ * @param cellgroup The cellgroup to set.
+ */
+ public void setCellgroup(boolean cellgroup) {
+ this.cellgroup = cellgroup;
+ }
+ /**
+ * @return Returns the horizontal alignment.
+ */
+ public int getHorizontalAlignment() {
+ return horizontalAlignment;
+ }
+ /**
+ * @param horizontalAlignment The horizontalAlignment to set.
+ */
+ public void setHorizontalAlignment(int horizontalAlignment) {
+ this.horizontalAlignment = horizontalAlignment;
+ }
+ /**
+ * @return Returns the vertical alignment.
+ */
+ public int getVerticalAlignment() {
+ return verticalAlignment;
+ }
+ /**
+ * @param verticalAlignment The verticalAligment to set.
+ */
+ public void setVerticalAlignment(int verticalAlignment) {
+ this.verticalAlignment = verticalAlignment;
+ }
+ /**
+ * @return Returns the width.
+ */
+ public float getWidth() {
+ return width;
+ }
+ /**
+ * @param width The width to set.
+ */
+ public void setWidth(float width) {
+ this.width = width;
+ }
+ /**
+ * @return Returns the widthpercentage.
+ */
+ public float getWidthpercentage() {
+ return widthpercentage;
+ }
+ /**
+ * @param widthpercentage The widthpercentage to set.
+ */
+ public void setWidthpercentage(float widthpercentage) {
+ this.widthpercentage = widthpercentage;
+ }
+ /**
+ * @return Returns the useAscender.
+ */
+ public boolean isUseAscender() {
+ return useAscender;
+ }
+ /**
+ * @param useAscender The useAscender to set.
+ */
+ public void setUseAscender(boolean useAscender) {
+ this.useAscender = useAscender;
+ }
+ /**
+ * @return Returns the useBorderPadding.
+ */
+ public boolean isUseBorderPadding() {
+ return useBorderPadding;
+ }
+ /**
+ * @param useBorderPadding The useBorderPadding to set.
+ */
+ public void setUseBorderPadding(boolean useBorderPadding) {
+ this.useBorderPadding = useBorderPadding;
+ }
+ /**
+ * @return Returns the useDescender.
+ */
+ public boolean isUseDescender() {
+ return useDescender;
+ }
+ /**
+ * @param useDescender The useDescender to set.
+ */
+ public void setUseDescender(boolean useDescender) {
+ this.useDescender = useDescender;
+ }
+
+ /**
+ * @return Returns the content.
+ */
+ ArrayList getContent() {
+ return content;
+ }
+
+ /**
+ * @see com.lowagie.text.TextElementArray#add(java.lang.Object)
+ */
+ public boolean add(Object o) {
+ try {
+ addElement((Element)o);
+ return true;
+ }
+ catch(ClassCastException e) {
+ return false;
+ }
+ catch(BadElementException e) {
+ throw new ExceptionConverter(e);
+ }
+ }
+ /**
+ * @see com.lowagie.text.Element#type()
+ */
+ public int type() {
+ return Element.CELL;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/SimpleTable.java b/src/main/java/com/lowagie/text/SimpleTable.java
new file mode 100644
index 0000000..fac3e7d
--- /dev/null
+++ b/src/main/java/com/lowagie/text/SimpleTable.java
@@ -0,0 +1,357 @@
+/*
+ * $Id: SimpleTable.java,v 1.4 2005/12/09 12:49:34 psoares33 Exp $
+ * $Name: $
+ *
+ * Copyright 1999-2005 by Bruno Lowagie.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU LIBRARY GENERAL PUBLIC LICENSE for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+package com.lowagie.text;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+
+import com.lowagie.text.pdf.PdfContentByte;
+import com.lowagie.text.pdf.PdfPTable;
+import com.lowagie.text.pdf.PdfPTableEvent;
+
+/**
+ * Rectangle that can be used for Cells.
+ * This Rectangle is padded and knows how to draw itself in a PdfPTable or PdfPcellEvent.
+ */
+public class SimpleTable extends Rectangle implements PdfPTableEvent, Element, TextElementArray {
+
+ /** the content of a Table. */
+ private ArrayList content = new ArrayList();
+ /** the width of the Table. */
+ private float width = 0f;
+ /** the widthpercentage of the Table. */
+ private float widthpercentage = 0f;
+ /** the spacing of the Cells. */
+ private float cellspacing;
+ /** the padding of the Cells. */
+ private float cellpadding;
+ /** the alignment of the table. */
+ private int alignment;
+
+ /**
+ * A RectangleCell is always constructed without any dimensions.
+ * Dimensions are defined after creation.
+ */
+ public SimpleTable() {
+ super(0f, 0f, 0f, 0f);
+ setBorder(BOX);
+ setBorderWidth(2f);
+ }
+
+ /**
+ * Adds content to this object.
+ * @param element
+ * @throws BadElementException
+ */
+ public void addElement(SimpleCell element) throws BadElementException {
+ if(!element.isCellgroup()) {
+ throw new BadElementException("You can't add cells to a table directly, add them to a row first.");
+ }
+ content.add(element);
+ }
+
+ /**
+ * Creates a Table object based on this TableAttributes object.
+ * @return a com.lowagie.text.Table object
+ * @throws BadElementException
+ */
+ public Table createTable() throws BadElementException {
+ if (content.size() == 0) throw new BadElementException("Trying to create a table without rows.");
+ SimpleCell row = (SimpleCell)content.get(0);
+ SimpleCell cell;
+ int columns = 0;
+ for (Iterator i = row.getContent().iterator(); i.hasNext(); ) {
+ cell = (SimpleCell)i.next();
+ columns += cell.getColspan();
+ }
+ float[] widths = new float[columns];
+ float[] widthpercentages = new float[columns];
+ Table table = new Table(columns);
+ table.setAlignment(alignment);
+ table.setSpacing(cellspacing);
+ table.setPadding(cellpadding);
+ table.cloneNonPositionParameters(this);
+ int pos;
+ for (Iterator rows = content.iterator(); rows.hasNext(); ) {
+ row = (SimpleCell)rows.next();
+ pos = 0;
+ for (Iterator cells = row.getContent().iterator(); cells.hasNext(); ) {
+ cell = (SimpleCell)cells.next();
+ table.addCell(cell.createCell(row));
+ if (cell.getColspan() == 1) {
+ if (cell.getWidth() > 0) widths[pos] = cell.getWidth();
+ if (cell.getWidthpercentage() > 0) widthpercentages[pos] = cell.getWidthpercentage();
+ }
+ pos += cell.getColspan();
+ }
+ }
+ float sumWidths = 0f;
+ for(int i = 0; i < columns; i++) {
+ if (widths[i] == 0) {
+ sumWidths = 0;
+ break;
+ }
+ sumWidths += widths[i];
+ }
+ if (sumWidths > 0) {
+ table.setAbsWidth(String.valueOf(sumWidths));
+ table.setWidths(widths);
+ }
+ else {
+ for(int i = 0; i < columns; i++) {
+ if (widthpercentages[i] == 0) {
+ sumWidths = 0;
+ break;
+ }
+ sumWidths += widthpercentages[i];
+ }
+ if (sumWidths > 0) {
+ table.setWidths(widthpercentages);
+ }
+ }
+ if (width > 0) {
+ table.setAbsWidth(String.valueOf(width));
+ }
+ if (widthpercentage > 0) {
+ table.setWidth(widthpercentage);
+ }
+ return table;
+ }
+
+ /**
+ * Creates a PdfPTable object based on this TableAttributes object.
+ * @return a com.lowagie.text.pdf.PdfPTable object
+ * @throws DocumentException
+ */
+ public PdfPTable createPdfPTable() throws DocumentException {
+ if (content.size() == 0) throw new BadElementException("Trying to create a table without rows.");
+ SimpleCell row = (SimpleCell)content.get(0);
+ SimpleCell cell;
+ int columns = 0;
+ for (Iterator i = row.getContent().iterator(); i.hasNext(); ) {
+ cell = (SimpleCell)i.next();
+ columns += cell.getColspan();
+ }
+ float[] widths = new float[columns];
+ float[] widthpercentages = new float[columns];
+ PdfPTable table = new PdfPTable(columns);
+ table.setTableEvent(this);
+ table.setHorizontalAlignment(alignment);
+ int pos;
+ for (Iterator rows = content.iterator(); rows.hasNext(); ) {
+ row = (SimpleCell)rows.next();
+ pos = 0;
+ for (Iterator cells = row.getContent().iterator(); cells.hasNext(); ) {
+ cell = (SimpleCell)cells.next();
+ if (Float.isNaN(cell.getSpacing_left())) {
+ cell.setSpacing_left(cellspacing / 2f);
+ }
+ if (Float.isNaN(cell.getSpacing_right())) {
+ cell.setSpacing_right(cellspacing / 2f);
+ }
+ if (Float.isNaN(cell.getSpacing_top())) {
+ cell.setSpacing_top(cellspacing / 2f);
+ }
+ if (Float.isNaN(cell.getSpacing_bottom())) {
+ cell.setSpacing_bottom(cellspacing / 2f);
+ }
+ cell.setPadding(cellpadding);
+ table.addCell(cell.createPdfPCell(row));
+ if (cell.getColspan() == 1) {
+ if (cell.getWidth() > 0) widths[pos] = cell.getWidth();
+ if (cell.getWidthpercentage() > 0) widthpercentages[pos] = cell.getWidthpercentage();
+ }
+ pos += cell.getColspan();
+ }
+ }
+ float sumWidths = 0f;
+ for(int i = 0; i < columns; i++) {
+ if (widths[i] == 0) {
+ sumWidths = 0;
+ break;
+ }
+ sumWidths += widths[i];
+ }
+ if (sumWidths > 0) {
+ table.setTotalWidth(sumWidths);
+ table.setWidths(widths);
+ }
+ else {
+ for(int i = 0; i < columns; i++) {
+ if (widthpercentages[i] == 0) {
+ sumWidths = 0;
+ break;
+ }
+ sumWidths += widthpercentages[i];
+ }
+ if (sumWidths > 0) {
+ table.setWidths(widthpercentages);
+ }
+ }
+ if (width > 0) {
+ table.setTotalWidth(width);
+ }
+ if (widthpercentage > 0) {
+ table.setWidthPercentage(widthpercentage);
+ }
+ return table;
+ }
+
+ /**
+ * @param rectangle
+ * @param spacing
+ * @return a rectangle
+ */
+ public static SimpleTable getDimensionlessInstance(Rectangle rectangle, float spacing) {
+ SimpleTable event = new SimpleTable();
+ event.cloneNonPositionParameters(rectangle);
+ event.setCellspacing(spacing);
+ return event;
+ }
+
+ /**
+ * @see com.lowagie.text.pdf.PdfPTableEvent#tableLayout(com.lowagie.text.pdf.PdfPTable, float[][], float[], int, int, com.lowagie.text.pdf.PdfContentByte[])
+ */
+ public void tableLayout(PdfPTable table, float[][] widths, float[] heights, int headerRows, int rowStart, PdfContentByte[] canvases) {
+ float[] width = widths[0];
+ Rectangle rect = new Rectangle(width[0], heights[heights.length - 1], width[width.length - 1], heights[0]);
+ rect.cloneNonPositionParameters(this);
+ int bd = rect.border();
+ rect.setBorder(Rectangle.NO_BORDER);
+ canvases[PdfPTable.BACKGROUNDCANVAS].rectangle(rect);
+ rect.setBorder(bd);
+ rect.setBackgroundColor(null);
+ canvases[PdfPTable.LINECANVAS].rectangle(rect);
+ }
+
+ /**
+ * @return Returns the cellpadding.
+ */
+ public float getCellpadding() {
+ return cellpadding;
+ }
+ /**
+ * @param cellpadding The cellpadding to set.
+ */
+ public void setCellpadding(float cellpadding) {
+ this.cellpadding = cellpadding;
+ }
+ /**
+ * @return Returns the cellspacing.
+ */
+ public float getCellspacing() {
+ return cellspacing;
+ }
+ /**
+ * @param cellspacing The cellspacing to set.
+ */
+ public void setCellspacing(float cellspacing) {
+ this.cellspacing = cellspacing;
+ }
+
+ /**
+ * @return Returns the alignment.
+ */
+ public int getAlignment() {
+ return alignment;
+ }
+ /**
+ * @param alignment The alignment to set.
+ */
+ public void setAlignment(int alignment) {
+ this.alignment = alignment;
+ }
+ /**
+ * @return Returns the width.
+ */
+ public float getWidth() {
+ return width;
+ }
+ /**
+ * @param width The width to set.
+ */
+ public void setWidth(float width) {
+ this.width = width;
+ }
+ /**
+ * @return Returns the widthpercentage.
+ */
+ public float getWidthpercentage() {
+ return widthpercentage;
+ }
+ /**
+ * @param widthpercentage The widthpercentage to set.
+ */
+ public void setWidthpercentage(float widthpercentage) {
+ this.widthpercentage = widthpercentage;
+ }
+ /**
+ * @see com.lowagie.text.Element#type()
+ */
+ public int type() {
+ return Element.TABLE;
+ }
+
+ /**
+ * @see com.lowagie.text.TextElementArray#add(java.lang.Object)
+ */
+ public boolean add(Object o) {
+ try {
+ addElement((SimpleCell)o);
+ return true;
+ }
+ catch(ClassCastException e) {
+ return false;
+ }
+ catch(BadElementException e) {
+ throw new ExceptionConverter(e);
+ }
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/SpecialSymbol.java b/src/main/java/com/lowagie/text/SpecialSymbol.java
new file mode 100644
index 0000000..ec12583
--- /dev/null
+++ b/src/main/java/com/lowagie/text/SpecialSymbol.java
@@ -0,0 +1,214 @@
+/*
+ * $Id: SpecialSymbol.java,v 1.1 2004/12/23 09:14:47 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text;
+
+/**
+ * This class contains the symbols that correspond with special symbols.
+ * <P>
+ * When you construct a <CODE>Phrase</CODE> with Phrase.getInstance using a <CODE>String</CODE>,
+ * this <CODE>String</CODE> can contain special Symbols. These are characters with an int value
+ * between 913 and 937 (except 930) and between 945 and 969. With this class the value of the
+ * corresponding character of the Font Symbol, can be retrieved.
+ *
+ * @see Phrase
+ *
+ * @author Bruno Lowagie
+ * @author Evelyne De Cordier
+ */
+
+public class SpecialSymbol {
+
+/**
+ * Returns the first occurrence of a special symbol in a <CODE>String</CODE>.
+ *
+ * @param string a <CODE>String</CODE>
+ * @return an index of -1 if no special symbol was found
+ */
+
+ public static int index(String string) {
+ int length = string.length();
+ for (int i = 0; i < length; i++) {
+ if (getCorrespondingSymbol(string.charAt(i)) != ' ') {
+ return i;
+ }
+ }
+ return -1;
+ }
+
+/**
+ * Gets a chunk with a symbol character.
+ * @param c a character that has to be changed into a symbol
+ * @param font Font if there is no SYMBOL character corresponding with c
+ * @return a SYMBOL version of a character
+ */
+
+ public static Chunk get(char c, Font font) {
+ char greek = SpecialSymbol.getCorrespondingSymbol(c);
+ if (greek == ' ') {
+ return new Chunk(String.valueOf(c), font);
+ }
+ Font symbol = new Font(Font.SYMBOL, font.size(), font.style(), font.color());
+ String s = String.valueOf(greek);
+ return new Chunk(s, symbol);
+ }
+
+/**
+ * Looks for the corresponding symbol in the font Symbol.
+ *
+ * @param c the original ASCII-char
+ * @return the corresponding symbol in font Symbol
+ */
+
+ public static char getCorrespondingSymbol(char c) {
+ switch(c) {
+ case 913:
+ return 'A'; // ALFA
+ case 914:
+ return 'B'; // BETA
+ case 915:
+ return 'G'; // GAMMA
+ case 916:
+ return 'D'; // DELTA
+ case 917:
+ return 'E'; // EPSILON
+ case 918:
+ return 'Z'; // ZETA
+ case 919:
+ return 'H'; // ETA
+ case 920:
+ return 'Q'; // THETA
+ case 921:
+ return 'I'; // IOTA
+ case 922:
+ return 'K'; // KAPPA
+ case 923:
+ return 'L'; // LAMBDA
+ case 924:
+ return 'M'; // MU
+ case 925:
+ return 'N'; // NU
+ case 926:
+ return 'X'; // XI
+ case 927:
+ return 'O'; // OMICRON
+ case 928:
+ return 'P'; // PI
+ case 929:
+ return 'R'; // RHO
+ case 931:
+ return 'S'; // SIGMA
+ case 932:
+ return 'T'; // TAU
+ case 933:
+ return 'U'; // UPSILON
+ case 934:
+ return 'J'; // PHI
+ case 935:
+ return 'C'; // CHI
+ case 936:
+ return 'Y'; // PSI
+ case 937:
+ return 'W'; // OMEGA
+ case 945:
+ return 'a'; // alfa
+ case 946:
+ return 'b'; // beta
+ case 947:
+ return 'g'; // gamma
+ case 948:
+ return 'd'; // delta
+ case 949:
+ return 'e'; // epsilon
+ case 950:
+ return 'z'; // zeta
+ case 951:
+ return 'h'; // eta
+ case 952:
+ return 'q'; // theta
+ case 953:
+ return 'i'; // iota
+ case 954:
+ return 'k'; // kappa
+ case 955:
+ return 'l'; // lambda
+ case 956:
+ return 'm'; // mu
+ case 957:
+ return 'n'; // nu
+ case 958:
+ return 'x'; // xi
+ case 959:
+ return 'o'; // omicron
+ case 960:
+ return 'p'; // pi
+ case 961:
+ return 'r'; // rho
+ case 962:
+ return 's'; // sigma
+ case 963:
+ return 's'; // sigma
+ case 964:
+ return 't'; // tau
+ case 965:
+ return 'u'; // upsilon
+ case 966:
+ return 'j'; // phi
+ case 967:
+ return 'c'; // chi
+ case 968:
+ return 'y'; // psi
+ case 969:
+ return 'w'; // omega
+ default:
+ return ' ';
+ }
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/SplitCharacter.java b/src/main/java/com/lowagie/text/SplitCharacter.java
new file mode 100644
index 0000000..ea1e802
--- /dev/null
+++ b/src/main/java/com/lowagie/text/SplitCharacter.java
@@ -0,0 +1,98 @@
+/*
+ * $Id: SplitCharacter.java,v 1.44 2005/05/04 14:31:17 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2001, 2002 by Paulo Soares
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text;
+
+import com.lowagie.text.pdf.PdfChunk;
+
+/** Interface for customizing the split character.
+ *
+ * @author Paulo Soares (psoares@consiste.pt)
+ */
+
+public interface SplitCharacter {
+
+ /**
+ * Returns <CODE>true</CODE> if the character can split a line. The splitting implementation
+ * is free to look ahead or look behind characters to make a decision.
+ * <p>
+ * The default implementation is:
+ * <p>
+ * <pre>
+ * public boolean isSplitCharacter(int start, int current, int end, char[] cc, PdfChunk[] ck) {
+ * char c;
+ * if (ck == null)
+ * c = cc[current];
+ * else
+ * c = ck[Math.min(current, ck.length - 1)].getUnicodeEquivalent(cc[current]);
+ * if (c <= ' ' || c == '-') {
+ * return true;
+ * }
+ * if (c < 0x2e80)
+ * return false;
+ * return ((c >= 0x2e80 && c < 0xd7a0)
+ * || (c >= 0xf900 && c < 0xfb00)
+ * || (c >= 0xfe30 && c < 0xfe50)
+ * || (c >= 0xff61 && c < 0xffa0));
+ * }
+ * </pre>
+ * @param start the lower limit of <CODE>cc</CODE> inclusive
+ * @param current the pointer to the character in <CODE>cc</CODE>
+ * @param end the upper limit of <CODE>cc</CODE> exclusive
+ * @param cc an array of characters at least <CODE>end</CODE> sized
+ * @param ck an array of <CODE>PdfChunk</CODE>. The main use is to be able to call
+ * {@link PdfChunk#getUnicodeEquivalent(char)}. It may be <CODE>null</CODE>
+ * or shorter than <CODE>end</CODE>. If <CODE>null</CODE> no convertion takes place.
+ * If shorter than <CODE>end</CODE> the last element is used
+ * @return <CODE>true</CODE> if the character(s) can split a line
+ */
+
+ public boolean isSplitCharacter(int start, int current, int end, char cc[], PdfChunk ck[]);
+}
diff --git a/src/main/java/com/lowagie/text/StringCompare.java b/src/main/java/com/lowagie/text/StringCompare.java
new file mode 100644
index 0000000..9c7bde0
--- /dev/null
+++ b/src/main/java/com/lowagie/text/StringCompare.java
@@ -0,0 +1,77 @@
+/*
+ * $Id: StringCompare.java,v 1.54 2005/05/04 14:31:10 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * Copyright (c) 2000 Volker Richert
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text;
+
+import java.util.Comparator;
+
+/**
+ * This class was used in the 1.1-version of iText (by Volker Richert).
+ * Paulo Soares suggested I should add it to the original library, so
+ * that in the future it would be easier to port it to the JDK1.1.x.
+ */
+
+public class StringCompare implements Comparator {
+
+/**
+ * Compares 2 objects.
+ *
+ * @param o1 a first object
+ * @param o2 a second object
+ * @return a value
+ * @throws ClassCastException if the objects aren't Strings
+ */
+
+ public int compare(Object o1, Object o2) {
+ return ((String)o1).compareTo((String)o2);
+ }
+
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/Table.java b/src/main/java/com/lowagie/text/Table.java
new file mode 100644
index 0000000..da7e4d8
--- /dev/null
+++ b/src/main/java/com/lowagie/text/Table.java
@@ -0,0 +1,1916 @@
+/*
+ * $Id: Table.java,v 1.138 2005/12/09 12:33:26 psoares33 Exp $
+ * $Name: $
+ *
+ * Copyright 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU LIBRARY GENERAL PUBLIC LICENSE for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ *
+ * Some methods in this class were contributed by Geert Poels, Kris Jespers and
+ * Steve Ogryzek. Check the CVS repository.
+ */
+
+package com.lowagie.text;
+
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.Point;
+import java.text.DecimalFormat;
+import java.util.ArrayList;
+import java.util.Hashtable;
+import java.util.Iterator;
+import java.util.Properties;
+import java.util.StringTokenizer;
+
+import com.lowagie.text.markup.MarkupParser;
+import com.lowagie.text.pdf.PdfPCell;
+import com.lowagie.text.pdf.PdfPTable;
+/**
+ * A <CODE>Table</CODE> is a <CODE>Rectangle</CODE> that contains <CODE>Cell</CODE>s,
+ * ordered in some kind of matrix.
+ * <P>
+ * Tables that span multiple pages are cut into different parts automatically.
+ * If you want a table header to be repeated on every page, you may not forget to
+ * mark the end of the header section by using the method <CODE>endHeaders()</CODE>.
+ * <P>
+ * The matrix of a table is not necessarily an m x n-matrix. It can contain holes
+ * or cells that are bigger than the unit. Believe me or not, but it took some serious
+ * thinking to make this as userfriendly as possible. I hope you wil find the result
+ * quite simple (I love simple solutions, especially for complex problems).
+ * I didn't want it to be something as complex as the Java <CODE>GridBagLayout</CODE>.
+ * <P>
+ * Example:
+ * <BLOCKQUOTE><PRE>
+ * // Remark: You MUST know the number of columns when constructing a Table.
+ * // The number of rows is not important.
+ * <STRONG>Table table = new Table(3);</STRONG>
+ * <STRONG>table.setBorderWidth(1);</STRONG>
+ * <STRONG>table.setBorderColor(new Color(0, 0, 255));</STRONG>
+ * <STRONG>table.setPadding(5);</STRONG>
+ * <STRONG>table.setSpacing(5);</STRONG>
+ * Cell cell = new Cell("header");
+ * cell.setHeader(true);
+ * cell.setColspan(3);
+ * <STRONG>table.addCell(cell);</STRONG>
+ * <STRONG>table.endHeaders();</STRONG>
+ * cell = new Cell("example cell with colspan 1 and rowspan 2");
+ * cell.setRowspan(2);
+ * cell.setBorderColor(new Color(255, 0, 0));
+ * <STRONG>table.addCell(cell);</STRONG>
+ * <STRONG>table.addCell("1.1");</STRONG>
+ * <STRONG>table.addCell("2.1");</STRONG>
+ * <STRONG>table.addCell("1.2");</STRONG>
+ * <STRONG>table.addCell("2.2");</STRONG>
+ * <STRONG>table.addCell("cell test1");</STRONG>
+ * cell = new Cell("big cell");
+ * cell.setRowspan(2);
+ * cell.setColspan(2);
+ * <STRONG>table.addCell(cell);</STRONG>
+ * <STRONG>table.addCell("cell test2");</STRONG>
+ * </PRE></BLOCKQUOTE>
+ * The result of this code is a table:
+ * <TABLE ALIGN="Center" BORDER="1" BORDERCOLOR="#0000ff" CELLPADDING="5" CELLSPACING="5">
+ * <TR ALIGN="Left" VALIGN="Left">
+ * <TH ALIGN="Left" COLSPAN="3" VALIGN="Left">
+ * header
+ * </TH>
+ * </TR>
+ * <TR ALIGN="Left" VALIGN="Left">
+ * <TD ALIGN="Left" BORDERCOLOR="#ff0000" ROWSPAN="2" VALIGN="Left">
+ * example cell with colspan 1 and rowspan 2
+ * </TD>
+ * <TD ALIGN="Left" VALIGN="Left">
+ * 1.1
+ * </TD>
+ * <TD ALIGN="Left" VALIGN="Left">
+ * 2.1
+ * </TD>
+ * </TR>
+ * <TR ALIGN="Left" VALIGN="Left">
+ * <TD ALIGN="Left" VALIGN="Left">
+ * 1.2
+ * </TD>
+ * <TD ALIGN="Left" VALIGN="Left">
+ * 2.2
+ * </TD>
+ * </TR>
+ * <TR ALIGN="Left" VALIGN="Left">
+ * <TD ALIGN="Left" VALIGN="Left">
+ * cell test1
+ * </TD>
+ * <TD ALIGN="Left" COLSPAN="2" ROWSPAN="2" VALIGN="Left">
+ * big cell
+ * </TD>
+ * </TR>
+ * <TR ALIGN="Left" VALIGN="Left">
+ * <TD ALIGN="Left" VALIGN="Left">
+ * cell test2
+ * </TD>
+ * </TR>
+ * </TABLE>
+ *
+ * @see Rectangle
+ * @see Element
+ * @see Row
+ * @see Cell
+ */
+
+public class Table extends Rectangle implements Element, MarkupAttributes {
+
+ // membervariables
+
+ // these variables contain the data of the table
+
+ /** This is the number of columns in the <CODE>Table</CODE>. */
+ private int columns;
+
+ // this is the current Position in the table
+ private Point curPosition = new Point(0, 0);
+
+ /** This is the list of <CODE>Row</CODE>s. */
+ private ArrayList rows = new ArrayList();
+
+ // these variables contain the layout of the table
+
+ /** This Empty Cell contains the DEFAULT layout of each Cell added with the method addCell(String content). */
+ private Cell defaultLayout = new Cell(true);
+
+ /** This is the number of the last row of the table headers. */
+ private int lastHeaderRow = -1;
+
+ /** This is the horizontal alignment. */
+ private int alignment = Element.ALIGN_CENTER;
+
+ /** This is cellpadding. */
+ private float cellpadding;
+
+ /** This is cellspacing. */
+ private float cellspacing;
+
+ /** This is the width of the table (in percent of the available space). */
+ private float widthPercentage = 80;
+
+ // member variable added by Evelyne De Cordier
+ /** This is the width of the table (in pixels). */
+ private String absWidth = "";
+
+ /** This is an array containing the widths (in percentages) of every column. */
+ private float[] widths;
+
+ /** Boolean to track errors (some checks will be performed) */
+ boolean mDebug = false;
+
+ /** Boolean to track if a table was inserted (to avoid unnecessary computations afterwards) */
+ boolean mTableInserted = false;
+
+ /**
+ * Boolean to automatically fill empty cells before a table is rendered
+ * (takes CPU so may be set to false in case of certainty)
+ */
+ boolean mAutoFillEmptyCells = false;
+
+ /** If true this table may not be split over two pages. */
+ boolean tableFitsPage = false;
+
+ /** If true cells may not be split over two pages. */
+ boolean cellsFitPage = false;
+
+ /** This is the offset of the table. */
+ float offset = Float.NaN;
+
+ /** contains the attributes that are added to each odd (or even) row */
+ protected Hashtable alternatingRowAttributes = null;
+
+ /** if you want to generate tables the old way, set this value to false. */
+ protected boolean convert2pdfptable = false;
+
+ // constructors
+
+ /**
+ * Constructs a <CODE>Table</CODE> with a certain number of columns.
+ *
+ * @param columns The number of columns in the table
+ * @throws BadElementException if the creator was called with less than 1 column
+ */
+
+ public Table(int columns) throws BadElementException {
+ this(columns, 1);
+ }
+
+ /**
+ * Constructs a <CODE>Table</CODE> with a certain number of columns
+ * and a certain number of <CODE>Row</CODE>s.
+ *
+ * @param columns The number of columns in the table
+ * @param rows The number of rows
+ * @throws BadElementException if the creator was called with less than 1 column
+ */
+
+ public Table(int columns, int rows) throws BadElementException {
+ // a Rectangle is create with BY DEFAULT a border with a width of 1
+ super(0, 0, 0, 0);
+ setBorder(BOX);
+ setBorderWidth(1);
+ defaultLayout.setBorder(BOX);
+
+ // a table should have at least 1 column
+ if (columns <= 0) {
+ throw new BadElementException("A table should have at least 1 column.");
+ }
+ this.columns = columns;
+
+ // a certain number of rows are created
+ for (int i = 0; i < rows; i++) {
+ this.rows.add(new Row(columns));
+ }
+ curPosition = new Point(0, 0);
+
+ // the DEFAULT widths are calculated
+ widths = new float[columns];
+ float width = 100f / columns;
+ for (int i = 0; i < columns; i++) {
+ widths[i] = width;
+ }
+ }
+
+ /**
+ * Returns a <CODE>Table</CODE> that has been constructed taking in account
+ * the value of some <VAR>attributes</VAR>.
+ *
+ * @param attributes Some attributes
+ */
+
+ public Table(Properties attributes) {
+ // a Rectangle is create with BY DEFAULT a border with a width of 1
+ super(0, 0, 0, 0);
+ setBorder(BOX);
+ setBorderWidth(1);
+ defaultLayout.setBorder(BOX);
+
+ String value = (String)attributes.remove(ElementTags.COLUMNS);
+ if (value == null) {
+ columns = 1;
+ }
+ else {
+ columns = Integer.parseInt(value);
+ if (columns <= 0) {
+ columns = 1;
+ }
+ }
+
+ rows.add(new Row(columns));
+ curPosition.setLocation(0, curPosition.y);
+
+ if ((value = (String)attributes.remove(ElementTags.LASTHEADERROW)) != null) {
+ setLastHeaderRow(Integer.parseInt(value));
+ }
+ if ((value = (String)attributes.remove(ElementTags.ALIGN)) != null) {
+ setAlignment(value);
+ }
+ if ((value = (String)attributes.remove(ElementTags.CELLSPACING)) != null) {
+ setSpacing(Float.valueOf(value + "f").floatValue());
+ }
+ if ((value = (String)attributes.remove(ElementTags.CELLPADDING)) != null) {
+ setPadding(Float.valueOf(value + "f").floatValue());
+ }
+ if ((value = (String)attributes.remove(ElementTags.OFFSET)) != null) {
+ setOffset(Float.valueOf(value + "f").floatValue());
+ }
+ if ((value = (String)attributes.remove(ElementTags.WIDTH)) != null) {
+ if (value.endsWith("%"))
+ setWidth(Float.valueOf(value.substring(0, value.length() - 1) + "f").floatValue());
+ else
+ setAbsWidth(value);
+ }
+ widths = new float[columns];
+ for (int i = 0; i < columns; i++) {
+ widths[i] = 0;
+ }
+ if ((value = (String)attributes.remove(ElementTags.WIDTHS)) != null) {
+ StringTokenizer widthTokens = new StringTokenizer(value, ";");
+ int i = 0;
+ while (widthTokens.hasMoreTokens()) {
+ value = widthTokens.nextToken();
+ widths[i] = Float.valueOf(value + "f").floatValue();
+ i++;
+ }
+ columns = i;
+ }
+ if ((value = (String)attributes.remove(ElementTags.TABLEFITSPAGE)) != null) {
+ tableFitsPage = new Boolean(value).booleanValue();
+ }
+ if ((value = (String)attributes.remove(ElementTags.CELLSFITPAGE)) != null) {
+ cellsFitPage = new Boolean(value).booleanValue();
+ }
+ if ((value = (String)attributes.remove(ElementTags.BORDERWIDTH)) != null) {
+ setBorderWidth(Float.valueOf(value + "f").floatValue());
+ }
+ int border = 0;
+ if ((value = (String)attributes.remove(ElementTags.LEFT)) != null) {
+ if (new Boolean(value).booleanValue()) border |= Rectangle.LEFT;
+ }
+ if ((value = (String)attributes.remove(ElementTags.RIGHT)) != null) {
+ if (new Boolean(value).booleanValue()) border |= Rectangle.RIGHT;
+ }
+ if ((value = (String)attributes.remove(ElementTags.TOP)) != null) {
+ if (new Boolean(value).booleanValue()) border |= Rectangle.TOP;
+ }
+ if ((value = (String)attributes.remove(ElementTags.BOTTOM)) != null) {
+ if (new Boolean(value).booleanValue()) border |= Rectangle.BOTTOM;
+ }
+ setBorder(border);
+ String r = (String)attributes.remove(ElementTags.RED);
+ String g = (String)attributes.remove(ElementTags.GREEN);
+ String b = (String)attributes.remove(ElementTags.BLUE);
+ if (r != null || g != null || b != null) {
+ int red = 0;
+ int green = 0;
+ int blue = 0;
+ if (r != null) red = Integer.parseInt(r);
+ if (g != null) green = Integer.parseInt(g);
+ if (b != null) blue = Integer.parseInt(b);
+ setBorderColor(new Color(red, green, blue));
+ }
+ else if ((value = attributes.getProperty(ElementTags.BORDERCOLOR)) != null) {
+ setBorderColor(MarkupParser.decodeColor(value));
+ }
+ r = (String)attributes.remove(ElementTags.BGRED);
+ g = (String)attributes.remove(ElementTags.BGGREEN);
+ b = (String)attributes.remove(ElementTags.BGBLUE);
+ if (r != null || g != null || b != null) {
+ int red = 0;
+ int green = 0;
+ int blue = 0;
+ if (r != null) red = Integer.parseInt(r);
+ if (g != null) green = Integer.parseInt(g);
+ if (b != null) blue = Integer.parseInt(b);
+ setBackgroundColor(new Color(red, green, blue));
+ }
+ else if ((value = (String)attributes.remove(ElementTags.BACKGROUNDCOLOR)) != null) {
+ setBackgroundColor(MarkupParser.decodeColor(value));
+ }
+ if ((value = (String)attributes.remove(ElementTags.GRAYFILL)) != null) {
+ setGrayFill(Float.valueOf(value + "f").floatValue());
+ }
+ if (attributes.size() > 0) setMarkupAttributes(attributes);
+ }
+
+ // implementation of the Element-methods
+
+ /**
+ * Processes the element by adding it (or the different parts) to an
+ * <CODE>ElementListener</CODE>.
+ *
+ * @param listener an <CODE>ElementListener</CODE>
+ * @return <CODE>true</CODE> if the element was processed successfully
+ */
+
+ public boolean process(ElementListener listener) {
+ try {
+ return listener.add(this);
+ }
+ catch(DocumentException de) {
+ return false;
+ }
+ }
+
+ /**
+ * Performs extra checks when executing table code (currently only when cells are added).
+ * @param aDebug
+ */
+ public void setDebug(boolean aDebug) {
+ mDebug = aDebug;
+ }
+
+ /**
+ * Sets the default layout of the Table to
+ * the provided Cell
+ * @param value a cell with all the defaults
+ */
+ public void setDefaultLayout(Cell value) {
+ defaultLayout = value;
+ }
+
+ /**
+ * Enables/disables automatic insertion of empty cells before table is rendered. (default = false)
+ * As some people may want to create a table, fill only a couple of the cells and don't bother with
+ * investigating which empty ones need to be added, this default behaviour may be very welcome.
+ * Disabling is recommended to increase speed. (empty cells should be added through extra code then)
+ *
+ * @param aDoAutoFill enable/disable autofill
+ */
+
+ public void setAutoFillEmptyCells(boolean aDoAutoFill) {
+ mAutoFillEmptyCells = aDoAutoFill;
+ }
+
+ /**
+ * Allows you to control when a page break occurs.
+ * <P>
+ * When a table doesn't fit a page, it is split in two parts.
+ * If you want to avoid this, you should set the <VAR>tableFitsPage</VAR> value to true.
+ *
+ * @param fitPage enter true if you don't want to split cells
+ */
+
+ public void setTableFitsPage(boolean fitPage) {
+ this.tableFitsPage = fitPage;
+ if (fitPage) setCellsFitPage(true);
+ }
+
+ /**
+ * Allows you to control when a page break occurs.
+ * <P>
+ * When a cell doesn't fit a page, it is split in two parts.
+ * If you want to avoid this, you should set the <VAR>cellsFitPage</VAR> value to true.
+ *
+ * @param fitPage enter true if you don't want to split cells
+ */
+
+ public void setCellsFitPage(boolean fitPage) {
+ this.cellsFitPage = fitPage;
+ }
+
+ /**
+ * Checks if this <CODE>Table</CODE> has to fit a page.
+ *
+ * @return true if the table may not be split
+ */
+
+ public boolean hasToFitPageTable() {
+ return tableFitsPage;
+ }
+
+ /**
+ * Checks if the cells of this <CODE>Table</CODE> have to fit a page.
+ *
+ * @return true if the cells may not be split
+ */
+
+ public boolean hasToFitPageCells() {
+ return cellsFitPage;
+ }
+
+ /**
+ * Sets the offset of this table.
+ *
+ * Normally a newline is added before you add a Table object.
+ * This newline uses the current leading.
+ * If you want to control the space between the table and the previous
+ * element yourself, you have to set the offset of this table.
+ *
+ * @param offset the space between this table and the previous object.
+ */
+
+ public void setOffset(float offset) {
+ this.offset = offset;
+ }
+
+ /**
+ * Gets the offset of this table.
+ *
+ * @return the space between this table and the previous element.
+ */
+
+ public float getOffset() {
+ return offset;
+ }
+
+ /**
+ * Gets the type of the text element.
+ *
+ * @return a type
+ */
+
+ public int type() {
+ return Element.TABLE;
+ }
+
+ /**
+ * Gets all the chunks in this element.
+ *
+ * @return an <CODE>ArrayList</CODE>
+ */
+
+ public ArrayList getChunks() {
+ return new ArrayList();
+ }
+
+ // methods to add content to the table
+
+ /**
+ * Adds a <CODE>Cell</CODE> to the <CODE>Table</CODE> at a certain row and column.
+ *
+ * @param aCell The <CODE>Cell</CODE> to add
+ * @param row The row where the <CODE>Cell</CODE> will be added
+ * @param column The column where the <CODE>Cell</CODE> will be added
+ * @throws BadElementException
+ */
+
+ public void addCell(Cell aCell, int row, int column) throws BadElementException {
+ addCell(aCell, new Point(row,column));
+ }
+
+ /**
+ * Adds a <CODE>Cell</CODE> to the <CODE>Table</CODE> at a certain location.
+ *
+ * @param aCell The <CODE>Cell</CODE> to add
+ * @param aLocation The location where the <CODE>Cell</CODE> will be added
+ * @throws BadElementException
+ */
+
+ public void addCell(Cell aCell, Point aLocation) throws BadElementException {
+ if (aCell == null) throw new NullPointerException("addCell - cell has null-value");
+ if (aLocation == null) throw new NullPointerException("addCell - point has null-value");
+ if (aCell.isTable()) insertTable((Table)aCell.getElements().next(), aLocation);
+ if (mDebug == true) {
+ if (aLocation.x < 0) throw new BadElementException("row coordinate of location must be >= 0");
+ if ((aLocation.y <= 0) && (aLocation.y > columns)) throw new BadElementException("column coordinate of location must be >= 0 and < nr of columns");
+ if (!isValidLocation(aCell, aLocation)) throw new BadElementException("Adding a cell at the location (" + aLocation.x + "," + aLocation.y + ") with a colspan of " + aCell.colspan() + " and a rowspan of " + aCell.rowspan() + " is illegal (beyond boundaries/overlapping).");
+ }
+ if (aCell.border() == UNDEFINED) aCell.setBorder(defaultLayout.border());
+ aCell.fill();
+ placeCell(rows, aCell, aLocation);
+ setCurrentLocationToNextValidPosition(aLocation);
+ }
+
+
+ /**
+ * Adds a <CODE>Cell</CODE> to the <CODE>Table</CODE>.
+ *
+ * @param cell a <CODE>Cell</CODE>
+ */
+
+ public void addCell(Cell cell) {
+ try {
+ addCell(cell, curPosition);
+ }
+ catch(BadElementException bee) {
+ // don't add the cell
+ }
+ }
+
+ /**
+ * Adds a <CODE>Cell</CODE> to the <CODE>Table</CODE>.
+ * <P>
+ * This is a shortcut for <CODE>addCell(Cell cell)</CODE>.
+ * The <CODE>Phrase</CODE> will be converted to a <CODE>Cell</CODE>.
+ *
+ * @param content a <CODE>Phrase</CODE>
+ * @throws BadElementException this should never happen
+ */
+
+ public void addCell(Phrase content) throws BadElementException {
+ addCell(content, curPosition);
+ }
+
+ /**
+ * Adds a <CODE>Cell</CODE> to the <CODE>Table</CODE>.
+ * <P>
+ * This is a shortcut for <CODE>addCell(Cell cell, Point location)</CODE>.
+ * The <CODE>Phrase</CODE> will be converted to a <CODE>Cell</CODE>.
+ *
+ * @param content a <CODE>Phrase</CODE>
+ * @param location a <CODE>Point</CODE>
+ * @throws BadElementException this should never happen
+ */
+
+ public void addCell(Phrase content, Point location) throws BadElementException {
+ Cell cell = new Cell(content);
+ cell.setBorder(defaultLayout.border());
+ cell.setBorderWidth(defaultLayout.borderWidth());
+ cell.setBorderColor(defaultLayout.borderColor());
+ cell.setBackgroundColor(defaultLayout.backgroundColor());
+ cell.setHorizontalAlignment(defaultLayout.horizontalAlignment());
+ cell.setVerticalAlignment(defaultLayout.verticalAlignment());
+ cell.setColspan(defaultLayout.colspan());
+ cell.setRowspan(defaultLayout.rowspan());
+ addCell(cell, location);
+ }
+
+ /**
+ * Adds a <CODE>Cell</CODE> to the <CODE>Table</CODE>.
+ * <P>
+ * This is a shortcut for <CODE>addCell(Cell cell)</CODE>.
+ * The <CODE>String</CODE> will be converted to a <CODE>Cell</CODE>.
+ *
+ * @param content a <CODE>String</CODE>
+ * @throws BadElementException this should never happen
+ */
+
+ public void addCell(String content) throws BadElementException {
+ addCell(new Phrase(content), curPosition);
+ }
+
+ /**
+ * Adds a <CODE>Cell</CODE> to the <CODE>Table</CODE>.
+ * <P>
+ * This is a shortcut for <CODE>addCell(Cell cell, Point location)</CODE>.
+ * The <CODE>String</CODE> will be converted to a <CODE>Cell</CODE>.
+ *
+ * @param content a <CODE>String</CODE>
+ * @param location a <CODE>Point</CODE>
+ * @throws BadElementException this should never happen
+ */
+
+ public void addCell(String content, Point location) throws BadElementException {
+ addCell(new Phrase(content), location);
+ }
+
+ /**
+ * To put a table within the existing table at the current position
+ * generateTable will of course re-arrange the widths of the columns.
+ *
+ * @param aTable the table you want to insert
+ */
+
+ public void insertTable(Table aTable) {
+ if (aTable == null) throw new NullPointerException("insertTable - table has null-value");
+ insertTable(aTable, curPosition);
+ }
+
+ /**
+ * To put a table within the existing table at the given position
+ * generateTable will of course re-arrange the widths of the columns.
+ *
+ * @param aTable The <CODE>Table</CODE> to add
+ * @param row The row where the <CODE>Cell</CODE> will be added
+ * @param column The column where the <CODE>Cell</CODE> will be added
+ */
+
+ public void insertTable(Table aTable, int row, int column) {
+ if (aTable == null) throw new NullPointerException("insertTable - table has null-value");
+ insertTable(aTable, new Point(row, column));
+ }
+
+ /**
+ * To put a table within the existing table at the given position
+ * generateTable will of course re-arrange the widths of the columns.
+ *
+ * @param aTable the table you want to insert
+ * @param aLocation a <CODE>Point</CODE>
+ */
+ public void insertTable(Table aTable, Point aLocation) {
+
+ if (aTable == null) throw new NullPointerException("insertTable - table has null-value");
+ if (aLocation == null) throw new NullPointerException("insertTable - point has null-value");
+ mTableInserted = true;
+ aTable.complete();
+ if (mDebug == true) {
+ if (aLocation.y > columns) System.err.println("insertTable -- wrong columnposition("+ aLocation.y + ") of location; max =" + columns);
+ }
+ int rowCount = aLocation.x + 1 - rows.size();
+ int i = 0;
+ if ( rowCount > 0 ) { //create new rows ?
+ for (; i < rowCount; i++) {
+ rows.add(new Row(columns));
+ }
+ }
+
+ ((Row) rows.get(aLocation.x)).setElement(aTable,aLocation.y);
+
+ setCurrentLocationToNextValidPosition(aLocation);
+ }
+
+/**
+ * Will fill empty cells with valid blank <CODE>Cell</CODE>s
+ */
+
+ public void complete() {
+ if (mTableInserted == true) {
+ mergeInsertedTables(); // integrate tables in the table
+ mTableInserted = false;
+ }
+ if (mAutoFillEmptyCells == true) {
+ fillEmptyMatrixCells();
+ }
+ if (alternatingRowAttributes != null) {
+ Properties even = new Properties();
+ Properties odd = new Properties();
+ String name;
+ String[] value;
+ for (Iterator iterator = alternatingRowAttributes.keySet().iterator(); iterator.hasNext(); ) {
+ name = String.valueOf(iterator.next());
+ value = (String[])alternatingRowAttributes.get(name);
+ even.setProperty(name, value[0]);
+ odd.setProperty(name, value[1]);
+ }
+ Row row;
+ for (int i = lastHeaderRow + 1; i < rows.size(); i++) {
+ row = (Row)rows.get(i);
+ row.setMarkupAttributes(i % 2 == 0 ? even : odd);
+ }
+ }
+ }
+
+ /**
+ * Changes the border in the default layout of the <CODE>Cell</CODE>s
+ * added with method <CODE>addCell(String content)</CODE>.
+ *
+ * @param value the new border value
+ */
+
+ public void setDefaultCellBorder(int value) {
+ defaultLayout.setBorder(value);
+ }
+
+ /**
+ * Changes the width of the borders in the default layout of the <CODE>Cell</CODE>s
+ * added with method <CODE>addCell(String content)</CODE>.
+ *
+ * @param value the new width
+ */
+
+ public void setDefaultCellBorderWidth(float value) {
+ defaultLayout.setBorderWidth(value);
+ }
+
+ /**
+ * Changes the bordercolor in the default layout of the <CODE>Cell</CODE>s
+ * added with method <CODE>addCell(String content)</CODE>.
+ *
+ * @param color the new color
+ */
+
+ public void setDefaultCellBorderColor(Color color) {
+ defaultLayout.setBorderColor(color);
+ }
+
+ /**
+ * Changes the backgroundcolor in the default layout of the <CODE>Cell</CODE>s
+ * added with method <CODE>addCell(String content)</CODE>.
+ *
+ * @param color the new color
+ */
+
+ public void setDefaultCellBackgroundColor(Color color) {
+ defaultLayout.setBackgroundColor(color);
+ }
+
+ /**
+ * Changes the grayfill in the default layout of the <CODE>Cell</CODE>s
+ * added with method <CODE>addCell(String content)</CODE>.
+ *
+ * @param value the new value
+ */
+
+ public void setDefaultCellGrayFill(float value) {
+ if (value >= 0 && value <= 1) {
+ defaultLayout.setGrayFill(value);
+ }
+ }
+
+ /**
+ * Changes the horizontalAlignment in the default layout of the <CODE>Cell</CODE>s
+ * added with method <CODE>addCell(String content)</CODE>.
+ *
+ * @param value the new alignment value
+ */
+
+ public void setDefaultHorizontalAlignment(int value) {
+ defaultLayout.setHorizontalAlignment(value);
+ }
+
+ /**
+ * Changes the verticalAlignment in the default layout of the <CODE>Cell</CODE>s
+ * added with method <CODE>addCell(String content)</CODE>.
+ *
+ * @param value the new alignment value
+ */
+
+ public void setDefaultVerticalAlignment(int value) {
+ defaultLayout.setVerticalAlignment(value);
+ }
+
+ /**
+ * Changes the rowspan in the default layout of the <CODE>Cell</CODE>s
+ * added with method <CODE>addCell(String content)</CODE>.
+ *
+ * @param value the new rowspan value
+ */
+
+ public void setDefaultRowspan(int value) {
+ defaultLayout.setRowspan(value);
+ }
+
+ /**
+ * Changes the colspan in the default layout of the <CODE>Cell</CODE>s
+ * added with method <CODE>addCell(String content)</CODE>.
+ *
+ * @param value the new colspan value
+ */
+
+ public void setDefaultColspan(int value) {
+ defaultLayout.setColspan(value);
+ }
+
+ // methods
+
+ /**
+ * Sets the unset cell properties to be the table defaults.
+ *
+ * @param aCell The cell to set to table defaults as necessary.
+ */
+
+ private void assumeTableDefaults(Cell aCell) {
+
+ if (aCell.border() == Rectangle.UNDEFINED) {
+ aCell.setBorder(defaultLayout.border());
+ }
+ if (aCell.borderWidth() == Rectangle.UNDEFINED) {
+ aCell.setBorderWidth(defaultLayout.borderWidth());
+ }
+ if (aCell.borderColor() == null) {
+ aCell.setBorderColor(defaultLayout.borderColor());
+ }
+ if (aCell.backgroundColor() == null) {
+ aCell.setBackgroundColor(defaultLayout.backgroundColor());
+ }
+ if (aCell.horizontalAlignment() == Element.ALIGN_UNDEFINED) {
+ aCell.setHorizontalAlignment(defaultLayout.horizontalAlignment());
+ }
+ if (aCell.verticalAlignment() == Element.ALIGN_UNDEFINED) {
+ aCell.setVerticalAlignment(defaultLayout.verticalAlignment());
+ }
+ }
+
+ /**
+ * Deletes a column in this table.
+ *
+ * @param column the number of the column that has to be deleted
+ * @throws BadElementException
+ */
+
+ public void deleteColumn(int column) throws BadElementException {
+ float newWidths[] = new float[--columns];
+ for (int i = 0; i < column; i++) {
+ newWidths[i] = widths[i];
+ }
+ for (int i = column; i < columns; i++) {
+ newWidths[i] = widths[i + 1];
+ }
+ setWidths(newWidths);
+ for (int i = 0; i < columns; i++) {
+ newWidths[i] = widths[i];
+ }
+ widths = newWidths;
+ Row row;
+ int size = rows.size();
+ for (int i = 0; i < size; i++) {
+ row = (Row) rows.get(i);
+ row.deleteColumn(column);
+ rows.set(i, row);
+ }
+ if (column == columns) {
+ curPosition.setLocation(curPosition.x+1, 0);
+ }
+ }
+
+ /**
+ * Deletes a row.
+ *
+ * @param row the number of the row to delete
+ * @return boolean <CODE>true</CODE> if the row was deleted; <CODE>false</CODE> if not
+ */
+
+ public boolean deleteRow(int row) {
+ if (row < 0 || row >= rows.size()) {
+ return false;
+ }
+ rows.remove(row);
+ curPosition.setLocation(curPosition.x-1, curPosition.y);
+ return true;
+ }
+
+ /**
+ * Deletes all rows in this table.
+ * (contributed by dperezcar@fcc.es)
+ */
+
+ public void deleteAllRows() {
+ rows.clear();
+ rows.add(new Row(columns));
+ curPosition.setLocation(0, 0);
+ lastHeaderRow = -1;
+ }
+
+ /**
+ * Deletes the last row in this table.
+ *
+ * @return boolean <CODE>true</CODE> if the row was deleted; <CODE>false</CODE> if not
+ */
+
+ public boolean deleteLastRow() {
+ return deleteRow(rows.size() - 1);
+ }
+
+ /**
+ * Marks the last row of the table headers.
+ *
+ * @return the number of the last row of the table headers
+ */
+
+ public int endHeaders() {
+ /* patch sep 8 2001 Francesco De Milato */
+ lastHeaderRow = curPosition.x - 1;
+ return lastHeaderRow;
+ }
+
+ // methods to set the membervariables
+
+ /**
+ * Sets the horizontal alignment.
+ *
+ * @param value the new value
+ */
+
+ public void setLastHeaderRow(int value) {
+ lastHeaderRow = value;
+ }
+
+ /**
+ * Sets the horizontal alignment.
+ *
+ * @param value the new value
+ */
+
+ public void setAlignment(int value) {
+ alignment = value;
+ }
+
+ /**
+ * Sets the alignment of this paragraph.
+ *
+ * @param alignment the new alignment as a <CODE>String</CODE>
+ */
+
+ public void setAlignment(String alignment) {
+ if (ElementTags.ALIGN_LEFT.equalsIgnoreCase(alignment)) {
+ this.alignment = Element.ALIGN_LEFT;
+ return;
+ }
+ if (ElementTags.RIGHT.equalsIgnoreCase(alignment)) {
+ this.alignment = Element.ALIGN_RIGHT;
+ return;
+ }
+ this.alignment = Element.ALIGN_CENTER;
+ }
+
+ /**
+ * Sets the cellpadding.
+ *
+ * @param value the new value
+ */
+
+ public void setSpaceInsideCell(float value) {
+ cellpadding = value;
+ }
+
+ /**
+ * Sets the cellspacing.
+ *
+ * @param value the new value
+ */
+
+ public void setSpaceBetweenCells(float value) {
+ cellspacing = value;
+ }
+
+ /**
+ * Sets the cellpadding.
+ *
+ * @param value the new value
+ */
+
+ public void setPadding(float value) {
+ cellpadding = value;
+ }
+
+ /**
+ * Sets the cellspacing.
+ *
+ * @param value the new value
+ */
+
+ public void setSpacing(float value) {
+ cellspacing = value;
+ }
+
+ /**
+ * Sets the cellspacing (the meaning of cellpadding and cellspacing was inverted by mistake).
+ *
+ * @param value the new value
+ * @deprecated use setSpacing instead
+ */
+
+ public void setCellpadding(float value) {
+ cellspacing = value;
+ }
+
+ /**
+ * Sets the cellpadding (the meaning of cellpadding and cellspacing was inverted by mistake).
+ *
+ * @param value the new value
+ * @deprecated use setPadding instead
+ */
+
+ public void setCellspacing(float value) {
+ cellpadding = value;
+ }
+
+ /**
+ * Sets the width of this table (in percentage of the available space).
+ *
+ * @param width the width
+ */
+
+ public void setWidth(float width) {
+ this.widthPercentage = width;
+ }
+
+ /**
+ * Sets the width of this table (in percentage of the available space).
+ *
+ * @param width the width
+ */
+
+ public void setAbsWidth(String width) {
+ this.absWidth = width;
+ }
+
+ /**
+ * Sets the widths of the different columns (percentages).
+ * <P>
+ * You can give up relative values of borderwidths.
+ * The sum of these values will be considered 100%.
+ * The values will be recalculated as percentages of this sum.
+ * <P>
+ * example:
+ * <BLOCKQUOTE><PRE>
+ * float[] widths = {2, 1, 1};
+ * <STRONG>table.setWidths(widths)</STRONG>
+ * </PRE></BLOCKQUOTE>
+ * The widths will be: a width of 50% for the first column,
+ * 25% for the second and third column.
+ *
+ * @param widths an array with values
+ * @throws BadElementException
+ */
+
+ public void setWidths(float[] widths) throws BadElementException {
+ if (widths.length != columns) {
+ throw new BadElementException("Wrong number of columns.");
+ }
+
+ // The sum of all values is 100%
+ float hundredPercent = 0;
+ for (int i = 0; i < columns; i++) {
+ hundredPercent += widths[i];
+ }
+
+ // The different percentages are calculated
+ float width;
+ this.widths[columns - 1] = 100;
+ for (int i = 0; i < columns - 1; i++) {
+ width = (100.0f * widths[i]) / hundredPercent;
+ this.widths[i] = width;
+ this.widths[columns - 1] -= width;
+ }
+ }
+
+ /**
+ * Sets the widths of the different columns (percentages).
+ * <P>
+ * You can give up relative values of borderwidths.
+ * The sum of these values will be considered 100%.
+ * The values will be recalculated as percentages of this sum.
+ *
+ * @param widths an array with values
+ * @throws DocumentException
+ */
+
+ public void setWidths(int[] widths) throws DocumentException {
+ float tb[] = new float[widths.length];
+ for (int k = 0; k < widths.length; ++k)
+ tb[k] = widths[k];
+ setWidths(tb);
+ }
+ // methods to retrieve the membervariables
+
+ /**
+ * Gets the number of columns.
+ *
+ * @return a value
+ */
+
+ public int columns() {
+ return columns;
+ }
+
+ /**
+ * Gets the number of rows in this <CODE>Table</CODE>.
+ *
+ * @return the number of rows in this <CODE>Table</CODE>
+ */
+
+ public int size() {
+ return rows.size();
+ }
+
+ /**
+ * Gets the proportional widths of the columns in this <CODE>Table</CODE>.
+ *
+ * @return the proportional widths of the columns in this <CODE>Table</CODE>
+ */
+
+ public float[] getProportionalWidths() {
+ return widths;
+ }
+
+ /**
+ * Gets an <CODE>Iterator</CODE> of all the <CODE>Row</CODE>s.
+ *
+ * @return an <CODE>Iterator</CODE>
+ */
+
+ public Iterator iterator() {
+ return rows.iterator();
+ }
+
+ /**
+ * Gets the horizontal alignment.
+ *
+ * @return a value
+ */
+
+ public int alignment() {
+ return alignment;
+ }
+
+ /**
+ * Gets the cellpadding.
+ *
+ * @return a value
+ */
+
+ public float cellpadding() {
+ return cellpadding;
+ }
+
+ /**
+ * Gets the cellspacing.
+ *
+ * @return a value
+ */
+
+ public float cellspacing() {
+ return cellspacing;
+ }
+
+ /**
+ * Gets the table width (a percentage).
+ *
+ * @return the table width
+ */
+
+ public float widthPercentage() {
+ return widthPercentage;
+ }
+
+ /**
+ * Gets the table width (in pixels).
+ *
+ * @return the table width
+ */
+
+ public String absWidth() {
+ return absWidth;
+ }
+
+ /**
+ * Gets the first number of the row that doesn't contain headers.
+ *
+ * @return a rownumber
+ */
+
+ public int firstDataRow() {
+ return lastHeaderRow + 1;
+ }
+
+ /**
+ * Gets the last number of the rows that contain headers.
+ *
+ * @return a rownumber
+ */
+ public int lastHeaderRow() {
+ return this.lastHeaderRow;
+ }
+
+ /**
+ * Gets the dimension of this table
+ *
+ * @return dimension
+ */
+
+ public Dimension getDimension() {
+ return new Dimension(columns, rows.size());
+ }
+
+ /**
+ * returns the element at the position row, column
+ * (Cast to Cell or Table)
+ *
+ * @param row
+ * @param column
+ * @return dimension
+ */
+
+ public Object getElement(int row, int column) {
+ return ((Row) rows.get(row)).getCell(column);
+ }
+
+ /**
+ * Integrates all added tables and recalculates column widths.
+ */
+
+ private void mergeInsertedTables() {
+ int i=0, j=0;
+ float [] lNewWidths = null;
+ int [] lDummyWidths = new int[columns]; // to keep track in how many new cols this one will be split
+ float[][] lDummyColumnWidths = new float[columns][]; // bugfix Tony Copping
+ int [] lDummyHeights = new int[rows.size()]; // to keep track in how many new rows this one will be split
+ ArrayList newRows = null;
+ boolean isTable=false;
+ int lTotalRows = 0, lTotalColumns = 0;
+ int lNewMaxRows = 0, lNewMaxColumns = 0;
+
+ Table lDummyTable = null;
+
+ // first we'll add new columns when needed
+ // check one column at a time, find maximum needed nr of cols
+ // Search internal tables and find one with max columns
+ for (j=0; j < columns; j++) {
+ lNewMaxColumns = 1; // value to hold in how many columns the current one will be split
+ float [] tmpWidths = null;
+ for (i=0; i < rows.size(); i++) {
+ if ( Table.class.isInstance(((Row) rows.get(i)).getCell(j)) ) {
+ isTable=true;
+ lDummyTable = ((Table) ((Row) rows.get(i)).getCell(j));
+ if( tmpWidths == null) {
+ tmpWidths = lDummyTable.widths;
+ lNewMaxColumns=tmpWidths.length;
+ }
+ else {
+ int cols = lDummyTable.getDimension().width;
+ float [] tmpWidthsN = new float[ cols * tmpWidths.length];
+ float tpW=0, btW=0, totW=0;
+ int tpI=0, btI=0, totI=0;
+ tpW+=tmpWidths[0];
+ btW+=lDummyTable.widths[0];
+ while( tpI<tmpWidths.length && btI<cols) {
+ if( btW>tpW) {
+ tmpWidthsN[totI] = tpW-totW;
+ tpI++;
+ if(tpI<tmpWidths.length) {
+ tpW+=tmpWidths[tpI];
+ }
+ }
+ else {
+ tmpWidthsN[totI] = btW-totW;
+ btI++;
+ if(Math.abs(btW - tpW) < 0.0001) {
+ tpI++;
+ if(tpI<tmpWidths.length) {
+ tpW+=tmpWidths[tpI];
+ }
+ }
+ if(btI<cols) {
+ btW+=lDummyTable.widths[btI];
+ }
+ }
+ totW+=tmpWidthsN[totI];
+ totI++;
+ }
+ /*if( tpI<tmpWidths.length)
+ {
+ System.arraycopy(tmpWidths, tpI, tmpWidthsN, totI, tmpWidths.length-tpI);
+ totI +=tmpWidths.length-tpI;
+ }
+ else if(btI<cols)
+ {
+ System.arraycopy(lDummyTable.widths, btI, tmpWidthsN, totI, lDummyTable.widths.length-btI);
+ totI +=lDummyTable.widths.length-btI; }*/
+ tmpWidths = new float[totI];
+ System.arraycopy(tmpWidthsN, 0, tmpWidths, 0, totI);
+ lNewMaxColumns=totI;
+ }
+ /*if ( lDummyTable.getDimension().width > lNewMaxColumns )
+ {
+ lNewMaxColumns = lDummyTable.getDimension().width;
+ lDummyColumnWidths[j] = lDummyTable.widths; // bugfix Tony Copping
+ }*/
+ }
+ }
+ lDummyColumnWidths[j] = tmpWidths;
+ lTotalColumns += lNewMaxColumns;
+ lDummyWidths [j] = lNewMaxColumns;
+ }
+
+ // next we'll add new rows when needed
+ for (i=0; i < rows.size(); i++) {
+ lNewMaxRows = 1; // holds value in how many rows the current one will be split
+ for (j=0; j < columns; j++) {
+ if ( Table.class.isInstance(((Row) rows.get(i)).getCell(j)) ) {
+ isTable=true;
+ lDummyTable = (Table) ((Row) rows.get(i)).getCell(j);
+ if ( lDummyTable.getDimension().height > lNewMaxRows ) {
+ lNewMaxRows = lDummyTable.getDimension().height;
+ }
+ }
+ }
+ lTotalRows += lNewMaxRows;
+ lDummyHeights [i] = lNewMaxRows;
+ }
+
+ if ( (lTotalColumns != columns) || (lTotalRows != rows.size()) || isTable) // NO ADJUSTMENT
+ {
+ // ** WIDTH
+ // set correct width for new columns
+ // divide width over new nr of columns
+ // Take new max columns of internal table and work out widths for each col
+ lNewWidths = new float [lTotalColumns];
+ int lDummy = 0;
+ for (int tel=0; tel < widths.length;tel++) {
+ if ( lDummyWidths[tel] != 1) {
+ // divide
+ for (int tel2 = 0; tel2 < lDummyWidths[tel]; tel2++) {
+ // lNewWidths[lDummy] = widths[tel] / lDummyWidths[tel];
+ lNewWidths[lDummy] = widths[tel] * lDummyColumnWidths[tel][tel2] / 100f; // bugfix Tony Copping
+ lDummy++;
+ }
+ }
+ else {
+ lNewWidths[lDummy] = widths[tel];
+ lDummy++;
+ }
+ }
+
+ // ** FILL OUR NEW TABLE
+ // generate new table
+ // set new widths
+ // copy old values
+ newRows = new ArrayList(lTotalRows);
+ for (i = 0; i < lTotalRows; i++) {
+ newRows.add(new Row(lTotalColumns));
+ }
+ int lDummyRow = 0, lDummyColumn = 0; // to remember where we are in the new, larger table
+ Object lDummyElement = null;
+ for (i=0; i < rows.size(); i++) {
+ lDummyColumn = 0;
+ lNewMaxRows = 1;
+ for (j=0; j < columns; j++) {
+ if ( Table.class.isInstance(((Row) rows.get(i)).getCell(j)) ) // copy values from embedded table
+ {
+ lDummyTable = (Table) ((Row) rows.get(i)).getCell(j);
+
+ // Work out where columns in table table correspond to columns in current table
+ int colMap[] = new int[lDummyTable.widths.length+1];
+ int cb=0, ct=0;
+
+ for( ; cb<lDummyTable.widths.length;cb++) {
+ colMap[cb] = lDummyColumn+ct;
+
+ float wb;
+ wb = lDummyTable.widths[cb];
+
+ float wt=0;
+ while( ct<lDummyWidths[j]) {
+ wt+=lDummyColumnWidths[j][ct++];
+ if(Math.abs(convertWidth(wb) - convertWidth(wt)) < 0.0001) break;
+ }
+ }
+ colMap[cb] = lDummyColumn+ct;
+
+ // need to change this to work out how many cols to span
+ for (int k=0; k < lDummyTable.getDimension().height; k++) {
+ for (int l=0; l < lDummyTable.getDimension().width; l++) {
+ lDummyElement = lDummyTable.getElement(k,l);
+ if (lDummyElement != null) {
+ int col=lDummyColumn+l;
+
+ if ( Cell.class.isInstance(lDummyElement) ) {
+ Cell lDummyC = (Cell)lDummyElement;
+ // Find col to add cell in and set col span
+ col = colMap[l];
+ int ot = colMap[l+lDummyC.colspan()];
+
+ lDummyC.setColspan(ot-col);
+ }
+
+ ((Row) newRows.get(k + lDummyRow)).addElement(lDummyElement,col); // use addElement to set reserved status ok in row
+ }
+ }
+ }
+ }
+ else // copy others values
+ {
+ Object aElement = getElement(i,j);
+
+ if ( Cell.class.isInstance(aElement) ) {
+
+ // adjust spans for cell
+ ((Cell) aElement).setRowspan(((Cell) ((Row) rows.get(i)).getCell(j)).rowspan() + lDummyHeights[i] - 1);
+ ((Cell) aElement).setColspan(((Cell) ((Row) rows.get(i)).getCell(j)).colspan() + lDummyWidths[j] - 1);
+
+ // most likely this cell covers a larger area because of the row/cols splits : define not-to-be-filled cells
+ placeCell(newRows,((Cell) aElement), new Point(lDummyRow,lDummyColumn));
+ }
+ }
+ lDummyColumn += lDummyWidths[j];
+ }
+ lDummyRow += lDummyHeights[i];
+ }
+
+ // Set our new matrix
+ columns = lTotalColumns;
+ rows = newRows;
+ this.widths = lNewWidths;
+ }
+ }
+
+ /**
+ * adds new<CODE>Cell</CODE>'s to empty/null spaces.
+ */
+
+ private void fillEmptyMatrixCells() {
+ try {
+ for (int i=0; i < rows.size(); i++) {
+ for (int j=0; j < columns; j++) {
+ if ( ((Row) rows.get(i)).isReserved(j) == false) {
+ addCell(defaultLayout, new Point(i, j));
+ }
+ }
+ }
+ }
+ catch(BadElementException bee) {
+ throw new ExceptionConverter(bee);
+ }
+ }
+
+ /**
+ * check if <CODE>Cell</CODE> 'fits' the table.
+ * <P>
+ * <UL><LI>rowspan/colspan not beyond borders
+ * <LI>spanned cell don't overlap existing cells</UL>
+ *
+ * @param aCell the cell that has to be checked
+ * @param aLocation the location where the cell has to be placed
+ * @return true if the location was valid
+ */
+ private boolean isValidLocation(Cell aCell, Point aLocation) {
+ // rowspan not beyond last column
+ if ( aLocation.x < rows.size() ) // if false : new location is already at new, not-yet-created area so no check
+ {
+ if ((aLocation.y + aCell.colspan()) > columns) {
+ return false;
+ }
+
+ int difx = ((rows.size() - aLocation.x) > aCell.rowspan()) ? aCell.rowspan() : rows.size() - aLocation.x;
+ int dify = ((columns - aLocation.y) > aCell.colspan()) ? aCell.colspan() : columns - aLocation.y;
+ // no other content at cells targetted by rowspan/colspan
+ for (int i=aLocation.x; i < (aLocation.x + difx); i++) {
+ for (int j=aLocation.y; j < (aLocation.y + dify); j++) {
+ if ( ((Row) rows.get(i)).isReserved(j) == true ) {
+ return false;
+ }
+ }
+ }
+ }
+ else {
+ if ((aLocation.y + aCell.colspan()) > columns) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ /**
+ * Inserts a Cell in a cell-array and reserves cells defined by row-/colspan.
+ *
+ * @param someRows some rows
+ * @param aCell the cell that has to be inserted
+ * @param aPosition the position where the cell has to be placed
+ */
+
+ private void placeCell(ArrayList someRows, Cell aCell, Point aPosition) {
+ int i;
+ Row row = null;
+ int lColumns = ((Row) someRows.get(0)).columns();
+ int rowCount = aPosition.x + aCell.rowspan() - someRows.size();
+ assumeTableDefaults(aCell);
+ if ( (aPosition.x + aCell.rowspan()) > someRows.size() ) //create new rows ?
+ {
+ for (i = 0; i < rowCount; i++) {
+ row = new Row(lColumns);
+ someRows.add(row);
+ }
+ }
+
+ // reserve cell in rows below
+ for (i = aPosition.x + 1; i < (aPosition.x + aCell.rowspan()); i++) {
+ if ( !((Row) someRows.get(i)).reserve(aPosition.y, aCell.colspan())) {
+
+ // should be impossible to come here :-)
+ throw new RuntimeException("addCell - error in reserve");
+ }
+ }
+ row = (Row) someRows.get(aPosition.x);
+ row.addElement(aCell, aPosition.y);
+
+ }
+
+ /**
+ * Gives you the posibility to add columns.
+ *
+ * @param aColumns the number of columns to add
+ */
+
+ public void addColumns(int aColumns) {
+ ArrayList newRows = new ArrayList(rows.size());
+
+ int newColumns = columns + aColumns;
+ Row row;
+ for (int i = 0; i < rows.size(); i++) {
+ row = new Row(newColumns);
+ for (int j = 0; j < columns; j++) {
+ row.setElement(((Row) rows.get(i)).getCell(j) ,j);
+ }
+ for (int j = columns; j < newColumns && i < curPosition.x; j++) {
+ row.setElement(defaultLayout, j);
+ }
+ newRows.add(row);
+ }
+
+ // applied 1 column-fix; last column needs to have a width of 0
+ float [] newWidths = new float[newColumns];
+ for (int j = 0; j < columns; j++) {
+ newWidths[j] = widths[j];
+ }
+ for (int j = columns; j < newColumns ; j++) {
+ newWidths[j] = 0;
+ }
+ columns = newColumns;
+ widths = newWidths;
+ rows = newRows;
+ }
+
+ /**
+ * Gets an array with the positions of the borders between every column.
+ * <P>
+ * This method translates the widths expressed in percentages into the
+ * x-coordinate of the borders of the columns on a real document.
+ *
+ * @param left this is the position of the first border at the left (cellpadding not included)
+ * @param totalWidth this is the space between the first border at the left
+ * and the last border at the right (cellpadding not included)
+ * @return an array with borderpositions
+ */
+
+ public float[] getWidths(float left, float totalWidth) {
+ // for x columns, there are x+1 borders
+ float[] w = new float[columns + 1];
+ // the border at the left is calculated
+ switch(alignment) {
+ case Element.ALIGN_LEFT:
+ w[0] = left;
+ break;
+ case Element.ALIGN_RIGHT:
+ w[0] = left + (totalWidth * (100 - widthPercentage)) / 100;
+ break;
+ case Element.ALIGN_CENTER:
+ default:
+ w[0] = left + (totalWidth * (100 - widthPercentage)) / 200;
+ }
+ // the total available width is changed
+ totalWidth = (totalWidth * widthPercentage) / 100;
+ // the inner borders are calculated
+ for (int i = 1; i < columns; i++) {
+ w[i] = w[i - 1] + (widths[i - 1] * totalWidth / 100);
+ }
+ // the border at the right is calculated
+ w[columns] = w[0] + totalWidth;
+ return w;
+ }
+
+ /**
+ * Sets current col/row to valid(empty) pos after addCell/Table
+ * @param aLocation a location in the Table
+ */
+ private void setCurrentLocationToNextValidPosition(Point aLocation) {
+ // set latest location to next valid position
+ int i, j;
+ i = aLocation.x;
+ j = aLocation.y;
+ do {
+ if ( (j + 1) == columns ) { // goto next row
+ i++;
+ j = 0;
+ }
+ else {
+ j++;
+ }
+ }
+ while (
+ (i < rows.size()) && (j < columns) && (((Row) rows.get(i)).isReserved(j) == true)
+ );
+ curPosition = new Point(i, j);
+ }
+
+
+
+ /**
+ * Checks if a given tag corresponds with this object.
+ *
+ * @param tag the given tag
+ * @return true if the tag corresponds
+ */
+
+ public static boolean isTag(String tag) {
+ return ElementTags.TABLE.equals(tag);
+ }
+
+ /**
+ * Allows clients to set up alternating attributes for each Row in the Table.
+ * <P>
+ * This code was contributed by Matt Benson.
+ *
+ * @param name the name of the attribute
+ * @param value0 the value of the attribute for even rows
+ * @param value1 the value of the attribute for odd rows
+ */
+ public void setAlternatingRowAttribute(String name, String value0, String value1) {
+ if (value0 == null || value1 == null) {
+ throw new NullPointerException("MarkupTable#setAlternatingRowAttribute(): null values are not permitted.");
+ }
+ if (alternatingRowAttributes == null) alternatingRowAttributes = new Hashtable();
+
+ // we could always use new Arrays but this is big enough
+ String[] value = (String[])(alternatingRowAttributes.get(name));
+ if (value == null) value = new String[2];
+ value[0] = value0;
+ value[1] = value1;
+ alternatingRowAttributes.put(name, value);
+ }
+
+ /**
+ * This method throws an <CODE>UnsupportedOperationException</CODE>.
+ * @return NA
+ */
+ public float top() {
+ throw new UnsupportedOperationException("Dimensions of a Table can't be calculated. See the FAQ.");
+ }
+
+ /**
+ * This method throws an <CODE>UnsupportedOperationException</CODE>.
+ * @return NA
+ */
+ public float bottom() {
+ throw new UnsupportedOperationException("Dimensions of a Table can't be calculated. See the FAQ.");
+ }
+
+ /**
+ * This method throws an <CODE>UnsupportedOperationException</CODE>.
+ * @return NA
+ */
+ public float left() {
+ throw new UnsupportedOperationException("Dimensions of a Table can't be calculated. See the FAQ.");
+ }
+
+ /**
+ * This method throws an <CODE>UnsupportedOperationException</CODE>.
+ * @return NA
+ */
+ public float right() {
+ throw new UnsupportedOperationException("Dimensions of a Table can't be calculated. See the FAQ.");
+ }
+
+ /**
+ * This method throws an <CODE>UnsupportedOperationException</CODE>.
+ * @param margin NA
+ * @return NA
+ */
+ public float top(int margin) {
+ throw new UnsupportedOperationException("Dimensions of a Table can't be calculated. See the FAQ.");
+ }
+
+ /**
+ * This method throws an <CODE>UnsupportedOperationException</CODE>.
+ * @param margin NA
+ * @return NA
+ */
+ public float bottom(int margin) {
+ throw new UnsupportedOperationException("Dimensions of a Table can't be calculated. See the FAQ.");
+ }
+
+ /**
+ * This method throws an <CODE>UnsupportedOperationException</CODE>.
+ * @param margin NA
+ * @return NA
+ */
+ public float left(int margin) {
+ throw new UnsupportedOperationException("Dimensions of a Table can't be calculated. See the FAQ.");
+ }
+
+ /**
+ * This method throws an <CODE>UnsupportedOperationException</CODE>.
+ * @param margin NA
+ * @return NA
+ */
+ public float right(int margin) {
+ throw new UnsupportedOperationException("Dimensions of a Table can't be calculated. See the FAQ.");
+ }
+
+ /**
+ * This method throws an <CODE>UnsupportedOperationException</CODE>.
+ * @param value NA
+ */
+ public void setTop(int value) {
+ throw new UnsupportedOperationException("Dimensions of a Table are attributed automagically. See the FAQ.");
+ }
+
+ /**
+ * This method throws an <CODE>UnsupportedOperationException</CODE>.
+ * @param value NA
+ */
+ public void setBottom(int value) {
+ throw new UnsupportedOperationException("Dimensions of a Table are attributed automagically. See the FAQ.");
+ }
+
+ /**
+ * This method throws an <CODE>UnsupportedOperationException</CODE>.
+ * @param value NA
+ */
+ public void setLeft(int value) {
+ throw new UnsupportedOperationException("Dimensions of a Table are attributed automagically. See the FAQ.");
+ }
+
+ /**
+ * This method throws an <CODE>UnsupportedOperationException</CODE>.
+ * @param value NA
+ */
+ public void setRight(int value) {
+ throw new UnsupportedOperationException("Dimensions of a Table are attributed automagically. See the FAQ.");
+ }
+
+ /**
+ * Returns the next row 0-based index where a new cell would be added.
+ * (contributed by dperezcar@fcc.es)
+ * @return x coordinate for the next row
+ */
+ public int getNextRow() {
+ return curPosition.x;
+ }
+
+ /**
+ * Returns the next column 0-based index where a new cell would be added.
+ * (contributed by dperezcar@fcc.es)
+ * @return y coordinate for the next row
+ */
+ public int getNextColumn() {
+ return curPosition.y;
+ }
+
+ private static final double convertWidth( double val) {
+ if( val == 0) {
+ return 0;
+ }
+ try {
+ String tmp = widthFormat.format( val);
+ Number result = widthFormat.parse( tmp);
+
+ return result.doubleValue();
+ }
+ catch( java.text.ParseException pe) {
+ throw new RuntimeException( "Could not convert double to width for val:" + val);
+ }
+ }
+
+ private static DecimalFormat widthFormat = new DecimalFormat( "0.00");
+
+ /**
+ * Create a PdfPTable based on this Table object.
+ * @return a PdfPTable object
+ * @throws BadElementException
+ */
+ public PdfPTable createPdfPTable() throws BadElementException {
+ if (!convert2pdfptable) {
+ throw new BadElementException("No error, just an old style table");
+ }
+ setAutoFillEmptyCells(true);
+ complete();
+ PdfPTable pdfptable = new PdfPTable(widths);
+ pdfptable.setTableEvent(SimpleTable.getDimensionlessInstance(this, cellspacing));
+ pdfptable.setHeaderRows(lastHeaderRow + 1);
+ pdfptable.setSplitLate(cellsFitPage);
+ if (!Float.isNaN(offset)) {
+ pdfptable.setSpacingBefore(offset);
+ }
+ pdfptable.setHorizontalAlignment(alignment);
+ if (absWidth.length() > 0) {
+ try {
+ pdfptable.setTotalWidth(Float.parseFloat(absWidth));
+ }
+ catch(Exception e1) {
+ try {
+ pdfptable.setTotalWidth(Integer.parseInt(absWidth));
+ }
+ catch(Exception e2) {
+ pdfptable.setWidthPercentage(widthPercentage);
+ }
+ }
+ }
+ else {
+ pdfptable.setWidthPercentage(widthPercentage);
+ }
+ Row row;
+ for (Iterator iterator = iterator(); iterator.hasNext(); ) {
+ row = (Row) iterator.next();
+ Element cell;
+ PdfPCell pcell;
+ for (int i = 0; i < row.columns(); i++) {
+ if ((cell = (Element)row.getCell(i)) != null) {
+ if (cell instanceof Table) {
+ pcell = new PdfPCell(((Table)cell).createPdfPTable());
+ }
+ else if (cell instanceof Cell) {
+ pcell = ((Cell)cell).createPdfPCell();
+ pcell.setPadding(cellpadding + cellspacing / 2f);
+ pcell.setCellEvent(SimpleCell.getDimensionlessInstance((Cell)cell, cellspacing));
+ }
+ else {
+ pcell = new PdfPCell();
+ }
+ pdfptable.addCell(pcell);
+ }
+ }
+ }
+ return pdfptable;
+ }
+
+ /**
+ * Method to check if the Table should be converted to a PdfPTable or not.
+ * @return false if the table should be handled the oldfashioned way.
+ */
+ public boolean isConvert2pdfptable() {
+ return convert2pdfptable;
+ }
+ /**
+ * If set to true, iText will try to convert the Table to a PdfPTable.
+ * @param convert2pdfptable true if you want iText to try to convert the Table to a PdfPTable
+ */
+ public void setConvert2pdfptable(boolean convert2pdfptable) {
+ this.convert2pdfptable = convert2pdfptable;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/TextElementArray.java b/src/main/java/com/lowagie/text/TextElementArray.java
new file mode 100644
index 0000000..c03a733
--- /dev/null
+++ b/src/main/java/com/lowagie/text/TextElementArray.java
@@ -0,0 +1,75 @@
+/*
+ * $Id: TextElementArray.java,v 1.59 2005/05/04 14:31:18 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright (c) 1999, 2000, 2001, 2002 Bruno Lowagie.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text;
+
+/**
+ * Interface for a text element to which other objects can be added.
+ *
+ * @see Phrase
+ * @see Paragraph
+ * @see Section
+ * @see ListItem
+ * @see Chapter
+ * @see Anchor
+ * @see Cell
+ */
+
+public interface TextElementArray extends Element {
+
+ /**
+ * Adds an object to the <CODE>TextElementArray</CODE>.
+ *
+ * @param o an object that has to be added
+ * @return <CODE>true</CODE> if the addition succeeded; <CODE>false</CODE> otherwise
+ */
+
+ public boolean add(Object o);
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/Watermark.java b/src/main/java/com/lowagie/text/Watermark.java
new file mode 100644
index 0000000..771672b
--- /dev/null
+++ b/src/main/java/com/lowagie/text/Watermark.java
@@ -0,0 +1,123 @@
+/*
+ * $Id: Watermark.java,v 1.52 2004/12/14 11:52:47 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2000, 2001, 2002 by Bruno Lowagie.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text;
+
+import java.net.MalformedURLException;
+
+/**
+ * A <CODE>Watermark</CODE> is a graphic element (GIF or JPEG)
+ * that is shown on a certain position on each page.
+ *
+ * @see Element
+ * @see Jpeg
+ */
+
+public class Watermark extends Image implements Element {
+
+ // membervariables
+
+/** This is the offset in x-direction of the Watermark. */
+ private float offsetX = 0;
+
+/** This is the offset in y-direction of the Watermark. */
+ private float offsetY = 0;
+
+ // Constructors
+
+/**
+ * Constructs a <CODE>Watermark</CODE>-object, using an <CODE>Image</CODE>.
+ *
+ * @param image an <CODE>Image</CODE>-object
+ * @param offsetX the offset in x-direction
+ * @param offsetY the offset in y-direction
+ * @throws MalformedURLException
+ */
+
+ public Watermark(Image image, float offsetX, float offsetY) throws MalformedURLException {
+ super(image);
+ this.offsetX = offsetX;
+ this.offsetY = offsetY;
+ }
+
+ // implementation of the Element interface
+
+/**
+ * Gets the type of the text element.
+ *
+ * @return a type
+ */
+
+ public int type() {
+ return type;
+ }
+
+ // methods to retrieve information
+
+/**
+ * Returns the offset in x direction.
+ *
+ * @return an offset
+ */
+
+ public float offsetX() {
+ return offsetX;
+ }
+
+/**
+ * Returns the offset in y direction.
+ *
+ * @return an offset
+ */
+
+ public float offsetY() {
+ return offsetY;
+ }
+}
diff --git a/src/main/java/com/lowagie/text/ZapfDingbatsList.java b/src/main/java/com/lowagie/text/ZapfDingbatsList.java
new file mode 100644
index 0000000..179b218
--- /dev/null
+++ b/src/main/java/com/lowagie/text/ZapfDingbatsList.java
@@ -0,0 +1,119 @@
+/*
+ * Copyright 2003 by Michael Niedermair.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+package com.lowagie.text;
+
+/**
+ *
+ * A special-version of <CODE>LIST</CODE> whitch use zapfdingbats-letters.
+ *
+ * @see com.lowagie.text.List
+ * @version 2003-06-22
+ * @author Michael Niedermair
+ */
+
+public class ZapfDingbatsList extends List {
+
+ /**
+ * char-number in zapfdingbats
+ */
+ protected int zn;
+
+ /**
+ * Creates a ZapfDingbatsList
+ *
+ * @param zn a char-number
+ * @param symbolIndent indent
+ */
+ public ZapfDingbatsList(int zn, int symbolIndent) {
+ super(true, symbolIndent);
+ this.zn = zn;
+ float fontsize = symbol.font().size();
+ symbol.setFont(FontFactory.getFont(FontFactory.ZAPFDINGBATS, fontsize, Font.NORMAL));
+ }
+
+ /**
+ * set the char-number
+ * @param zn a char-number
+ */
+ public void setCharNumber(int zn) {
+ this.zn = zn;
+ }
+
+ /**
+ * get the char-number
+ *
+ * @return char-number
+ */
+ public int getCharNumber() {
+ return zn;
+ }
+
+ /**
+ * Adds an <CODE>Object</CODE> to the <CODE>List</CODE>.
+ *
+ * @param o the object to add.
+ * @return true if adding the object succeeded
+ */
+ public boolean add(Object o) {
+ if (o instanceof ListItem) {
+ ListItem item = (ListItem) o;
+ Chunk chunk = new Chunk((char)zn, symbol.font());
+ item.setListSymbol(chunk);
+ item.setIndentationLeft(symbolIndent);
+ item.setIndentationRight(0);
+ list.add(item);
+ } else if (o instanceof List) {
+ List nested = (List) o;
+ nested.setIndentationLeft(nested.indentationLeft() + symbolIndent);
+ first--;
+ return list.add(nested);
+ } else if (o instanceof String) {
+ return this.add(new ListItem((String) o));
+ }
+ return false;
+ }
+}
diff --git a/src/main/java/com/lowagie/text/ZapfDingbatsNumberList.java b/src/main/java/com/lowagie/text/ZapfDingbatsNumberList.java
new file mode 100644
index 0000000..513fbfa
--- /dev/null
+++ b/src/main/java/com/lowagie/text/ZapfDingbatsNumberList.java
@@ -0,0 +1,132 @@
+/*
+ * Copyright 2003 by Michael Niedermair.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+package com.lowagie.text;
+
+/**
+ *
+ * A special-version of <CODE>LIST</CODE> whitch use zapfdingbats-numbers (1..10).
+ *
+ * @see com.lowagie.text.List
+ * @version 2003-06-22
+ * @author Michael Niedermair
+ */
+
+public class ZapfDingbatsNumberList extends List {
+
+ /**
+ * which type
+ */
+ protected int type;
+
+ /**
+ * Creates a ZapdDingbatsNumberList
+ * @param type the type of list
+ * @param symbolIndent indent
+ */
+ public ZapfDingbatsNumberList(int type, int symbolIndent) {
+ super(true, symbolIndent);
+ this.type = type;
+ float fontsize = symbol.font().size();
+ symbol.setFont(FontFactory.getFont(FontFactory.ZAPFDINGBATS, fontsize, Font.NORMAL));
+ }
+
+ /**
+ * set the type
+ *
+ * @param type
+ */
+ public void setType(int type) {
+ this.type = type;
+ }
+
+ /**
+ * get the type
+ *
+ * @return char-number
+ */
+ public int getType() {
+ return type;
+ }
+
+ /**
+ * Adds an <CODE>Object</CODE> to the <CODE>List</CODE>.
+ *
+ * @param o the object to add.
+ * @return true if adding the object succeeded
+ */
+ public boolean add(Object o) {
+ if (o instanceof ListItem) {
+ ListItem item = (ListItem) o;
+ Chunk chunk;
+ switch (type ) {
+ case 0:
+ chunk = new Chunk((char)(first + list.size() + 171), symbol.font());
+ break;
+ case 1:
+ chunk = new Chunk((char)(first + list.size() + 181), symbol.font());
+ break;
+ case 2:
+ chunk = new Chunk((char)(first + list.size() + 191), symbol.font());
+ break;
+ default:
+ chunk = new Chunk((char)(first + list.size() + 201), symbol.font());
+ }
+ item.setListSymbol(chunk);
+ item.setIndentationLeft(symbolIndent);
+ item.setIndentationRight(0);
+ list.add(item);
+ } else if (o instanceof List) {
+ List nested = (List) o;
+ nested.setIndentationLeft(nested.indentationLeft() + symbolIndent);
+ first--;
+ return list.add(nested);
+ } else if (o instanceof String) {
+ return this.add(new ListItem((String) o));
+ }
+ return false;
+ }
+}
diff --git a/src/main/java/com/lowagie/text/html/HtmlEncoder.java b/src/main/java/com/lowagie/text/html/HtmlEncoder.java
new file mode 100644
index 0000000..2501815
--- /dev/null
+++ b/src/main/java/com/lowagie/text/html/HtmlEncoder.java
@@ -0,0 +1,211 @@
+/*
+ * $Id: HtmlEncoder.java,v 1.56 2005/05/04 14:33:47 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.html;
+
+import java.awt.Color;
+
+import com.lowagie.text.Element;
+
+/**
+ * This class converts a <CODE>String</CODE> to the HTML-format of a String.
+ * <P>
+ * To convert the <CODE>String</CODE>, each character is examined:
+ * <UL>
+ * <LI>ASCII-characters from 000 till 031 are represented as &amp;#xxx;<BR>
+ * (with xxx = the value of the character)
+ * <LI>ASCII-characters from 032 t/m 127 are represented by the character itself, except for:
+ * <UL>
+ * <LI>'\n' becomes &lt;BR&gt;\n
+ * <LI>&quot; becomes &amp;quot;
+ * <LI>&amp; becomes &amp;amp;
+ * <LI>&lt; becomes &amp;lt;
+ * <LI>&gt; becomes &amp;gt;
+ * </UL>
+ * <LI>ASCII-characters from 128 till 255 are represented as &amp;#xxx;<BR>
+ * (with xxx = the value of the character)
+ * </UL>
+ * <P>
+ * Example:
+ * <P><BLOCKQUOTE><PRE>
+ * String htmlPresentation = HtmlEncoder.encode("Marie-Th&#233;r&#232;se S&#248;rensen");
+ * </PRE></BLOCKQUOTE><P>
+ * for more info: see O'Reilly; "HTML: The Definitive Guide" (page 164)
+ *
+ * @author mario.maccarini@rug.ac.be
+ */
+
+public class HtmlEncoder {
+
+ // membervariables
+
+/** List with the HTML translation of all the characters. */
+ private static final String[] htmlCode = new String[256];
+
+ static {
+ for (int i = 0; i < 10; i++) {
+ htmlCode[i] = "&#00" + i + ";";
+ }
+
+ for (int i = 10; i < 32; i++) {
+ htmlCode[i] = "&#0" + i + ";";
+ }
+
+ for (int i = 32; i < 128; i++) {
+ htmlCode[i] = String.valueOf((char)i);
+ }
+
+ // Special characters
+ htmlCode['\t'] = "\t";
+ htmlCode['\n'] = "<" + HtmlTags.NEWLINE + " />\n";
+ htmlCode['\"'] = "&quot;"; // double quote
+ htmlCode['&'] = "&amp;"; // ampersand
+ htmlCode['<'] = "&lt;"; // lower than
+ htmlCode['>'] = "&gt;"; // greater than
+
+ for (int i = 128; i < 256; i++) {
+ htmlCode[i] = "&#" + i + ";";
+ }
+ }
+
+
+ // constructors
+
+/**
+ * This class will never be constructed.
+ * <P>
+ * HtmlEncoder only contains static methods.
+ */
+
+ private HtmlEncoder () { }
+
+ // methods
+
+/**
+ * Converts a <CODE>String</CODE> to the HTML-format of this <CODE>String</CODE>.
+ *
+ * @param string The <CODE>String</CODE> to convert
+ * @return a <CODE>String</CODE>
+ */
+
+ public static String encode(String string) {
+ int n = string.length();
+ char character;
+ StringBuffer buffer = new StringBuffer();
+ // loop over all the characters of the String.
+ for (int i = 0; i < n; i++) {
+ character = string.charAt(i);
+ // the Htmlcode of these characters are added to a StringBuffer one by one
+ if (character < 256) {
+ buffer.append(htmlCode[character]);
+ }
+ else {
+ // Improvement posted by Joachim Eyrich
+ buffer.append("&#").append((int)character).append(";");
+ }
+ }
+ return buffer.toString().trim();
+ }
+
+/**
+ * Converts a <CODE>Color</CODE> into a HTML representation of this <CODE>Color</CODE>.
+ *
+ * @param color the <CODE>Color</CODE> that has to be converted.
+ * @return the HTML representation of this <COLOR>Color</COLOR>
+ */
+
+ public static String encode(Color color) {
+ StringBuffer buffer = new StringBuffer("#");
+ if (color.getRed() < 16) {
+ buffer.append('0');
+ }
+ buffer.append(Integer.toString(color.getRed(), 16));
+ if (color.getGreen() < 16) {
+ buffer.append('0');
+ }
+ buffer.append(Integer.toString(color.getGreen(), 16));
+ if (color.getBlue() < 16) {
+ buffer.append('0');
+ }
+ buffer.append(Integer.toString(color.getBlue(), 16));
+ return buffer.toString();
+ }
+
+/**
+ * Translates the alignment value.
+ *
+ * @param alignment the alignment value
+ * @return the translated value
+ */
+
+ public static String getAlignment(int alignment) {
+ switch(alignment) {
+ case Element.ALIGN_LEFT:
+ return HtmlTags.ALIGN_LEFT;
+ case Element.ALIGN_CENTER:
+ return HtmlTags.ALIGN_CENTER;
+ case Element.ALIGN_RIGHT:
+ return HtmlTags.ALIGN_RIGHT;
+ case Element.ALIGN_JUSTIFIED:
+ case Element.ALIGN_JUSTIFIED_ALL:
+ return HtmlTags.ALIGN_JUSTIFIED;
+ case Element.ALIGN_TOP:
+ return HtmlTags.ALIGN_TOP;
+ case Element.ALIGN_MIDDLE:
+ return HtmlTags.ALIGN_MIDDLE;
+ case Element.ALIGN_BOTTOM:
+ return HtmlTags.ALIGN_BOTTOM;
+ case Element.ALIGN_BASELINE:
+ return HtmlTags.ALIGN_BASELINE;
+ default:
+ return "";
+ }
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/html/HtmlParser.java b/src/main/java/com/lowagie/text/html/HtmlParser.java
new file mode 100644
index 0000000..ba46998
--- /dev/null
+++ b/src/main/java/com/lowagie/text/html/HtmlParser.java
@@ -0,0 +1,206 @@
+/*
+ * $Id: HtmlParser.java,v 1.12 2005/11/29 16:00:10 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2001, 2002 by Bruno Lowagie.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.html;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.Reader;
+
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+
+import com.lowagie.text.DocumentException;
+import com.lowagie.text.ExceptionConverter;
+import com.lowagie.text.DocListener;
+import com.lowagie.text.xml.XmlParser;
+
+/**
+ * This class can be used to parse some HTML files.
+ */
+
+public class HtmlParser extends XmlParser {
+
+/**
+ * Constructs an HtmlParser.
+ */
+
+ public HtmlParser() {
+ super();
+ }
+
+/**
+ * Parses a given file.
+ * @param document the document the parser will write to
+ * @param is the InputSource with the content
+ */
+
+ public void go(DocListener document, InputSource is) {
+ try {
+ parser.parse(is, new SAXmyHtmlHandler(document));
+ }
+ catch(SAXException se) {
+ throw new ExceptionConverter(se);
+ }
+ catch(IOException ioe) {
+ throw new ExceptionConverter(ioe);
+ }
+ catch(DocumentException de) {
+ throw new ExceptionConverter(de);
+ }
+ }
+
+/**
+ * Parses a given file that validates with the iText DTD and writes the content to a document.
+ * @param document the document the parser will write to
+ * @param is the InputSource with the content
+ */
+
+ public static void parse(DocListener document, InputSource is) {
+ HtmlParser p = new HtmlParser();
+ p.go(document, is);
+ }
+
+/**
+ * Parses a given file.
+ * @param document the document the parser will write to
+ * @param file the file with the content
+ */
+
+ public void go(DocListener document, String file) {
+ try {
+ parser.parse(file, new SAXmyHtmlHandler(document));
+ }
+ catch(SAXException se) {
+ throw new ExceptionConverter(se);
+ }
+ catch(IOException ioe) {
+ throw new ExceptionConverter(ioe);
+ }
+ catch(DocumentException de) {
+ throw new ExceptionConverter(de);
+ }
+ }
+
+/**
+ * Parses a given file that validates with the iText DTD and writes the content to a document.
+ * @param document the document the parser will write to
+ * @param file the file with the content
+ */
+
+ public static void parse(DocListener document, String file) {
+ HtmlParser p = new HtmlParser();
+ p.go(document, file);
+ }
+
+/**
+ * Parses a given file.
+ * @param document the document the parser will write to
+ * @param is the InputStream with the content
+ */
+
+ public void go(DocListener document, InputStream is) {
+ try {
+ parser.parse(new InputSource(is), new SAXmyHtmlHandler(document));
+ }
+ catch(SAXException se) {
+ throw new ExceptionConverter(se);
+ }
+ catch(IOException ioe) {
+ throw new ExceptionConverter(ioe);
+ }
+ catch(DocumentException de) {
+ throw new ExceptionConverter(de);
+ }
+ }
+
+/**
+ * Parses a given file that validates with the iText DTD and writes the content to a document.
+ * @param document the document the parser will write to
+ * @param is the InputStream with the content
+ */
+
+ public static void parse(DocListener document, InputStream is) {
+ HtmlParser p = new HtmlParser();
+ p.go(document, new InputSource(is));
+ }
+
+/**
+ * Parses a given file.
+ * @param document the document the parser will write to
+ * @param is the Reader with the content
+ */
+
+ public void go(DocListener document, Reader is) {
+ try {
+ parser.parse(new InputSource(is), new SAXmyHtmlHandler(document));
+ }
+ catch(SAXException se) {
+ throw new ExceptionConverter(se);
+ }
+ catch(IOException ioe) {
+ throw new ExceptionConverter(ioe);
+ }
+ catch(DocumentException de) {
+ throw new ExceptionConverter(de);
+ }
+ }
+
+/**
+ * Parses a given file that validates with the iText DTD and writes the content to a document.
+ * @param document the document the parser will write to
+ * @param is the Reader with the content
+ */
+
+ public static void parse(DocListener document, Reader is) {
+ HtmlParser p = new HtmlParser();
+ p.go(document, new InputSource(is));
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/html/HtmlPeer.java b/src/main/java/com/lowagie/text/html/HtmlPeer.java
new file mode 100644
index 0000000..44a7a25
--- /dev/null
+++ b/src/main/java/com/lowagie/text/html/HtmlPeer.java
@@ -0,0 +1,112 @@
+/*
+ * $Id: HtmlPeer.java,v 1.9 2006/03/23 09:51:50 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2001, 2002 by Bruno Lowagie.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.html;
+
+import java.util.Properties;
+
+import org.xml.sax.Attributes;
+
+import com.lowagie.text.ElementTags;
+import com.lowagie.text.xml.XmlPeer;
+
+/**
+ * This interface is implemented by the peer of all the iText objects.
+ */
+
+public class HtmlPeer extends XmlPeer {
+
+ /**
+ * Creates a XmlPeer.
+ *
+ * @param name
+ * the iText name of the tag
+ * @param alias
+ * the Html name of the tag
+ */
+
+ public HtmlPeer(String name, String alias) {
+ super(name, alias.toLowerCase());
+ }
+
+ /**
+ * Sets an alias for an attribute.
+ *
+ * @param name
+ * the iText tagname
+ * @param alias
+ * the custom tagname
+ */
+
+ public void addAlias(String name, String alias) {
+ attributeAliases.put(alias.toLowerCase(), name);
+ }
+
+ /**
+ * @see com.lowagie.text.xml.XmlPeer#getAttributes(org.xml.sax.Attributes)
+ */
+ public Properties getAttributes(Attributes attrs) {
+ Properties attributes = new Properties();
+ attributes.putAll(attributeValues);
+ if (defaultContent != null) {
+ attributes.put(ElementTags.ITEXT, defaultContent);
+ }
+ if (attrs != null) {
+ String attribute, value;
+ for (int i = 0; i < attrs.getLength(); i++) {
+ attribute = getName(attrs.getQName(i).toLowerCase());
+ value = attrs.getValue(i).toLowerCase();
+ attributes.setProperty(attribute, value);
+ }
+ }
+ return attributes;
+ }
+}
+
diff --git a/src/main/java/com/lowagie/text/html/HtmlTagMap.java b/src/main/java/com/lowagie/text/html/HtmlTagMap.java
new file mode 100644
index 0000000..bd7ef81
--- /dev/null
+++ b/src/main/java/com/lowagie/text/html/HtmlTagMap.java
@@ -0,0 +1,296 @@
+/*
+ * $Id: HtmlTagMap.java,v 1.15 2005/05/03 14:43:59 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2001, 2002 by Bruno Lowagie.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.html;
+
+import java.util.HashMap;
+
+import com.lowagie.text.ElementTags;
+import com.lowagie.text.FontFactory;
+import com.lowagie.text.markup.MarkupTags;
+
+/**
+ * The <CODE>Tags</CODE>-class maps several XHTML-tags to iText-objects.
+ */
+
+public class HtmlTagMap extends HashMap {
+
+/**
+ * Constructs an HtmlTagMap.
+ */
+
+ public HtmlTagMap() {
+ super();
+ HtmlPeer peer;
+
+ peer = new HtmlPeer(ElementTags.ITEXT, HtmlTags.HTML);
+ put(peer.getAlias(), peer);
+
+ peer = new HtmlPeer(ElementTags.PHRASE, HtmlTags.SPAN);
+ put(peer.getAlias(), peer);
+
+ peer = new HtmlPeer(ElementTags.CHUNK, HtmlTags.CHUNK);
+ peer.addAlias(ElementTags.FONT, HtmlTags.FONT);
+ peer.addAlias(ElementTags.SIZE, HtmlTags.SIZE);
+ peer.addAlias(ElementTags.COLOR, HtmlTags.COLOR);
+ put(peer.getAlias(), peer);
+
+ peer = new HtmlPeer(ElementTags.ANCHOR, HtmlTags.ANCHOR);
+ peer.addAlias(ElementTags.NAME, HtmlTags.NAME);
+ peer.addAlias(ElementTags.REFERENCE, HtmlTags.REFERENCE);
+ put(peer.getAlias(), peer);
+
+ peer = new HtmlPeer(ElementTags.PARAGRAPH, HtmlTags.PARAGRAPH);
+ peer.addAlias(ElementTags.ALIGN, HtmlTags.ALIGN);
+ put(peer.getAlias(), peer);
+
+ peer = new HtmlPeer(ElementTags.PARAGRAPH, HtmlTags.DIV);
+ peer.addAlias(ElementTags.ALIGN, HtmlTags.ALIGN);
+ put(peer.getAlias(), peer);
+
+ peer = new HtmlPeer(ElementTags.PARAGRAPH, HtmlTags.H[0]);
+ peer.addValue(ElementTags.SIZE, "20");
+ put(peer.getAlias(), peer);
+
+ peer = new HtmlPeer(ElementTags.PARAGRAPH, HtmlTags.H[1]);
+ peer.addValue(ElementTags.SIZE, "18");
+ put(peer.getAlias(), peer);
+
+ peer = new HtmlPeer(ElementTags.PARAGRAPH, HtmlTags.H[2]);
+ peer.addValue(ElementTags.SIZE, "16");
+ put(peer.getAlias(), peer);
+
+ peer = new HtmlPeer(ElementTags.PARAGRAPH, HtmlTags.H[3]);
+ peer.addValue(ElementTags.SIZE, "14");
+ put(peer.getAlias(), peer);
+
+ peer = new HtmlPeer(ElementTags.PARAGRAPH, HtmlTags.H[4]);
+ peer.addValue(ElementTags.SIZE, "12");
+ put(peer.getAlias(), peer);
+
+ peer = new HtmlPeer(ElementTags.PARAGRAPH, HtmlTags.H[5]);
+ peer.addValue(ElementTags.SIZE, "10");
+ put(peer.getAlias(), peer);
+
+ peer = new HtmlPeer(ElementTags.LIST, HtmlTags.ORDEREDLIST);
+ peer.addValue(ElementTags.NUMBERED, "true");
+ peer.addValue(ElementTags.SYMBOLINDENT, "20");
+ put(peer.getAlias(), peer);
+
+ peer = new HtmlPeer(ElementTags.LIST, HtmlTags.UNORDEREDLIST);
+ peer.addValue(ElementTags.NUMBERED, "false");
+ peer.addValue(ElementTags.SYMBOLINDENT, "20");
+ put(peer.getAlias(), peer);
+
+ peer = new HtmlPeer(ElementTags.LISTITEM, HtmlTags.LISTITEM);
+ put(peer.getAlias(), peer);
+
+ peer = new HtmlPeer(ElementTags.PHRASE, HtmlTags.I);
+ peer.addValue(ElementTags.STYLE, MarkupTags.CSS_VALUE_ITALIC);
+ put(peer.getAlias(), peer);
+
+ peer = new HtmlPeer(ElementTags.PHRASE, HtmlTags.EM);
+ peer.addValue(ElementTags.STYLE, MarkupTags.CSS_VALUE_ITALIC);
+ put(peer.getAlias(), peer);
+
+ peer = new HtmlPeer(ElementTags.PHRASE, HtmlTags.B);
+ peer.addValue(ElementTags.STYLE, MarkupTags.CSS_VALUE_BOLD);
+ put(peer.getAlias(), peer);
+
+ peer = new HtmlPeer(ElementTags.PHRASE, HtmlTags.STRONG);
+ peer.addValue(ElementTags.STYLE, MarkupTags.CSS_VALUE_BOLD);
+ put(peer.getAlias(), peer);
+
+ peer = new HtmlPeer(ElementTags.PHRASE, HtmlTags.S);
+ peer.addValue(ElementTags.STYLE, MarkupTags.CSS_VALUE_LINETHROUGH);
+ put(peer.getAlias(), peer);
+
+ peer = new HtmlPeer(ElementTags.PHRASE, HtmlTags.CODE);
+ peer.addValue(ElementTags.FONT, FontFactory.COURIER);
+ put(peer.getAlias(), peer);
+
+ peer = new HtmlPeer(ElementTags.PHRASE, HtmlTags.VAR);
+ peer.addValue(ElementTags.FONT, FontFactory.COURIER);
+ peer.addValue(ElementTags.STYLE, MarkupTags.CSS_VALUE_ITALIC);
+ put(peer.getAlias(), peer);
+
+ peer = new HtmlPeer(ElementTags.PHRASE, HtmlTags.U);
+ peer.addValue(ElementTags.STYLE, MarkupTags.CSS_VALUE_UNDERLINE);
+ put(peer.getAlias(), peer);
+
+ peer = new HtmlPeer(ElementTags.CHUNK, HtmlTags.SUP);
+ peer.addValue(ElementTags.SUBSUPSCRIPT, "6.0");
+ put(peer.getAlias(), peer);
+
+ peer = new HtmlPeer(ElementTags.CHUNK, HtmlTags.SUB);
+ peer.addValue(ElementTags.SUBSUPSCRIPT, "-6.0");
+ put(peer.getAlias(), peer);
+
+ peer = new HtmlPeer(ElementTags.HORIZONTALRULE, HtmlTags.HORIZONTALRULE);
+ put(peer.getAlias(), peer);
+
+ peer = new HtmlPeer(ElementTags.TABLE, HtmlTags.TABLE);
+ peer.addAlias(ElementTags.WIDTH, HtmlTags.WIDTH);
+ peer.addAlias(ElementTags.BACKGROUNDCOLOR, HtmlTags.BACKGROUNDCOLOR);
+ peer.addAlias(ElementTags.BORDERCOLOR, HtmlTags.BORDERCOLOR);
+ peer.addAlias(ElementTags.COLUMNS, HtmlTags.COLUMNS);
+ peer.addAlias(ElementTags.CELLPADDING, HtmlTags.CELLPADDING);
+ peer.addAlias(ElementTags.CELLSPACING, HtmlTags.CELLSPACING);
+ peer.addAlias(ElementTags.BORDERWIDTH, HtmlTags.BORDERWIDTH);
+ peer.addAlias(ElementTags.ALIGN, HtmlTags.ALIGN);
+ put(peer.getAlias(), peer);
+
+ peer = new HtmlPeer(ElementTags.ROW, HtmlTags.ROW);
+ put(peer.getAlias(), peer);
+
+ peer = new HtmlPeer(ElementTags.CELL, HtmlTags.CELL);
+ peer.addAlias(ElementTags.WIDTH, HtmlTags.WIDTH);
+ peer.addAlias(ElementTags.BACKGROUNDCOLOR, HtmlTags.BACKGROUNDCOLOR);
+ peer.addAlias(ElementTags.BORDERCOLOR, HtmlTags.BORDERCOLOR);
+ peer.addAlias(ElementTags.COLSPAN, HtmlTags.COLSPAN);
+ peer.addAlias(ElementTags.ROWSPAN, HtmlTags.ROWSPAN);
+ peer.addAlias(ElementTags.NOWRAP, HtmlTags.NOWRAP);
+ peer.addAlias(ElementTags.HORIZONTALALIGN, HtmlTags.HORIZONTALALIGN);
+ peer.addAlias(ElementTags.VERTICALALIGN, HtmlTags.VERTICALALIGN);
+ peer.addValue(ElementTags.HEADER, "false");
+ put(peer.getAlias(), peer);
+
+ peer = new HtmlPeer(ElementTags.CELL, HtmlTags.HEADERCELL);
+ peer.addAlias(ElementTags.WIDTH, HtmlTags.WIDTH);
+ peer.addAlias(ElementTags.BACKGROUNDCOLOR, HtmlTags.BACKGROUNDCOLOR);
+ peer.addAlias(ElementTags.BORDERCOLOR, HtmlTags.BORDERCOLOR);
+ peer.addAlias(ElementTags.COLSPAN, HtmlTags.COLSPAN);
+ peer.addAlias(ElementTags.ROWSPAN, HtmlTags.ROWSPAN);
+ peer.addAlias(ElementTags.NOWRAP, HtmlTags.NOWRAP);
+ peer.addAlias(ElementTags.HORIZONTALALIGN, HtmlTags.HORIZONTALALIGN);
+ peer.addAlias(ElementTags.VERTICALALIGN, HtmlTags.VERTICALALIGN);
+ peer.addValue(ElementTags.HEADER, "true");
+ put(peer.getAlias(), peer);
+
+ peer = new HtmlPeer(ElementTags.IMAGE, HtmlTags.IMAGE);
+ peer.addAlias(ElementTags.URL, HtmlTags.URL);
+ peer.addAlias(ElementTags.ALT, HtmlTags.ALT);
+ peer.addAlias(ElementTags.PLAINWIDTH, HtmlTags.PLAINWIDTH);
+ peer.addAlias(ElementTags.PLAINHEIGHT, HtmlTags.PLAINHEIGHT);
+ put(peer.getAlias(), peer);
+
+ peer = new HtmlPeer(ElementTags.NEWLINE, HtmlTags.NEWLINE);
+ put(peer.getAlias(), peer);
+ }
+
+/**
+ * Checks if this is the root tag.
+ * @param tag a tagvalue
+ * @return true if tag is HTML or html
+ */
+
+ public boolean isHtml(String tag) {
+ return HtmlTags.HTML.equalsIgnoreCase(tag);
+ }
+
+/**
+ * Checks if this is the head tag.
+ * @param tag a tagvalue
+ * @return true if tag is HEAD or head
+ */
+
+ public boolean isHead(String tag) {
+ return HtmlTags.HEAD.equalsIgnoreCase(tag);
+ }
+
+/**
+ * Checks if this is the meta tag.
+ * @param tag a tagvalue
+ * @return true if tag is META or meta
+ */
+
+ public boolean isMeta(String tag) {
+ return HtmlTags.META.equalsIgnoreCase(tag);
+ }
+
+/**
+ * Checks if this is the linl tag.
+ * @param tag a tagvalue
+ * @return true if tag is LINK or link
+ */
+
+ public boolean isLink(String tag) {
+ return HtmlTags.LINK.equalsIgnoreCase(tag);
+ }
+
+/**
+ * Checks if this is the title tag.
+ * @param tag a tagvalue
+ * @return true if tag is TITLE or title
+ */
+
+ public boolean isTitle(String tag) {
+ return HtmlTags.TITLE.equalsIgnoreCase(tag);
+ }
+
+/**
+ * Checks if this is the root tag.
+ * @param tag a tagvalue
+ * @return true if tag is BODY or body
+ */
+
+ public boolean isBody(String tag) {
+ return HtmlTags.BODY.equalsIgnoreCase(tag);
+ }
+
+/**
+ * Checks if this is a special tag.
+ * @param tag a tagvalue
+ * @return true if tag is a HTML, HEAD, META, LINK or BODY tag (case insensitive)
+ */
+ public boolean isSpecialTag(String tag) {
+ return isHtml(tag) || isHead(tag) || isMeta(tag) || isLink(tag) || isBody(tag);
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/html/HtmlTags.java b/src/main/java/com/lowagie/text/html/HtmlTags.java
new file mode 100644
index 0000000..43dbcc4
--- /dev/null
+++ b/src/main/java/com/lowagie/text/html/HtmlTags.java
@@ -0,0 +1,331 @@
+/*
+ * $Id: HtmlTags.java,v 1.69 2005/05/03 14:43:58 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2001, 2002 by Bruno Lowagie.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.html;
+
+/**
+ * A class that contains all the possible tagnames and their attributes.
+ */
+
+public class HtmlTags {
+
+/** the root tag. */
+ public static final String HTML = "html";
+
+/** the head tag */
+ public static final String HEAD = "head";
+
+/** This is a possible HTML attribute for the HEAD tag. */
+ public static final String CONTENT = "content";
+
+/** the meta tag */
+ public static final String META = "meta";
+
+/** attribute of the root tag */
+ public static final String SUBJECT = "subject";
+
+/** attribute of the root tag */
+ public static final String KEYWORDS = "keywords";
+
+/** attribute of the root tag */
+ public static final String AUTHOR = "author";
+
+/** the title tag. */
+ public static final String TITLE = "title";
+
+/** the script tag. */
+ public static final String SCRIPT = "script";
+
+/** This is a possible HTML attribute for the SCRIPT tag. */
+ public static final String LANGUAGE = "language";
+
+/** This is a possible value for the LANGUAGE attribute. */
+ public static final String JAVASCRIPT = "JavaScript";
+
+/** the body tag. */
+ public static final String BODY = "body";
+
+/** This is a possible HTML attribute for the BODY tag */
+ public static final String JAVASCRIPT_ONLOAD = "onLoad";
+
+/** This is a possible HTML attribute for the BODY tag */
+ public static final String JAVASCRIPT_ONUNLOAD = "onUnLoad";
+
+/** This is a possible HTML attribute for the BODY tag. */
+ public static final String TOPMARGIN = "topmargin";
+
+/** This is a possible HTML attribute for the BODY tag. */
+ public static final String BOTTOMMARGIN = "bottommargin";
+
+/** This is a possible HTML attribute for the BODY tag. */
+ public static final String LEFTMARGIN = "leftmargin";
+
+/** This is a possible HTML attribute for the BODY tag. */
+ public static final String RIGHTMARGIN = "rightmargin";
+
+ // Phrases, Anchors, Lists and Paragraphs
+
+/** the chunk tag */
+ public static final String CHUNK = "font";
+
+/** the phrase tag */
+ public static final String CODE = "code";
+
+/** the phrase tag */
+ public static final String VAR = "var";
+
+/** the anchor tag */
+ public static final String ANCHOR = "a";
+
+/** the list tag */
+ public static final String ORDEREDLIST = "ol";
+
+/** the list tag */
+ public static final String UNORDEREDLIST = "ul";
+
+/** the listitem tag */
+ public static final String LISTITEM = "li";
+
+/** the paragraph tag */
+ public static final String PARAGRAPH = "p";
+
+/** attribute of anchor tag */
+ public static final String NAME = "name";
+
+/** attribute of anchor tag */
+ public static final String REFERENCE = "href";
+
+/** attribute of anchor tag */
+ public static final String[] H = new String[6];
+ static {
+ H[0] = "h1";
+ H[1] = "h2";
+ H[2] = "h3";
+ H[3] = "h4";
+ H[4] = "h5";
+ H[5] = "h6";
+ }
+
+ // Chunks
+
+/** attribute of the chunk tag */
+ public static final String FONT = "face";
+
+/** attribute of the chunk tag */
+ public static final String SIZE = "point-size";
+
+/** attribute of the chunk/table/cell tag */
+ public static final String COLOR = "color";
+
+/** some phrase tag */
+ public static final String EM = "em";
+
+/** some phrase tag */
+ public static final String I = "i";
+
+/** some phrase tag */
+ public static final String STRONG = "strong";
+
+/** some phrase tag */
+ public static final String B = "b";
+
+/** some phrase tag */
+ public static final String S = "s";
+
+/** some phrase tag */
+ public static final String U = "u";
+
+/** some phrase tag */
+ public static final String SUB = "sub";
+
+/** some phrase tag */
+ public static final String SUP = "sup";
+
+/** the possible value of a tag */
+ public static final String HORIZONTALRULE = "hr";
+
+ // tables/cells
+
+/** the table tag */
+ public static final String TABLE = "table";
+
+/** the cell tag */
+ public static final String ROW = "tr";
+
+/** the cell tag */
+ public static final String CELL = "td";
+
+/** attribute of the cell tag */
+ public static final String HEADERCELL = "th";
+
+/** attribute of the table tag */
+ public static final String COLUMNS = "cols";
+
+/** attribute of the table tag */
+ public static final String CELLPADDING = "cellpadding";
+
+/** attribute of the table tag */
+ public static final String CELLSPACING = "cellspacing";
+
+/** attribute of the cell tag */
+ public static final String COLSPAN = "colspan";
+
+/** attribute of the cell tag */
+ public static final String ROWSPAN = "rowspan";
+
+/** attribute of the cell tag */
+ public static final String NOWRAP = "nowrap";
+
+/** attribute of the table/cell tag */
+ public static final String BORDERWIDTH = "border";
+
+/** attribute of the table/cell tag */
+ public static final String WIDTH = "width";
+
+/** attribute of the table/cell tag */
+ public static final String BACKGROUNDCOLOR = "bgcolor";
+
+/** attribute of the table/cell tag */
+ public static final String BORDERCOLOR = "bordercolor";
+
+/** attribute of paragraph/image/table tag */
+ public static final String ALIGN = "align";
+
+/** attribute of chapter/section/paragraph/table/cell tag */
+ public static final String LEFT = "left";
+
+/** attribute of chapter/section/paragraph/table/cell tag */
+ public static final String RIGHT = "right";
+
+/** attribute of the cell tag */
+ public static final String HORIZONTALALIGN = "align";
+
+/** attribute of the cell tag */
+ public static final String VERTICALALIGN = "valign";
+
+/** attribute of the table/cell tag */
+ public static final String TOP = "top";
+
+/** attribute of the table/cell tag */
+ public static final String BOTTOM = "bottom";
+
+ // Misc
+
+/** the image tag */
+ public static final String IMAGE = "img";
+
+/** attribute of the image tag */
+ public static final String URL = "src";
+
+/** attribute of the image tag */
+ public static final String ALT = "alt";
+
+/** attribute of the image tag */
+ public static final String PLAINWIDTH = "width";
+
+/** attribute of the image tag */
+ public static final String PLAINHEIGHT = "height";
+
+/** the newpage tag */
+ public static final String NEWLINE = "br";
+
+ // alignment attribute values
+
+/** the possible value of an alignment attribute */
+ public static final String ALIGN_LEFT = "Left";
+
+/** the possible value of an alignment attribute */
+ public static final String ALIGN_CENTER = "Center";
+
+/** the possible value of an alignment attribute */
+ public static final String ALIGN_RIGHT = "Right";
+
+/** the possible value of an alignment attribute */
+ public static final String ALIGN_JUSTIFIED = "Justify";
+
+/** the possible value of an alignment attribute */
+ public static final String ALIGN_TOP = "Top";
+
+/** the possible value of an alignment attribute */
+ public static final String ALIGN_MIDDLE = "Middle";
+
+/** the possible value of an alignment attribute */
+ public static final String ALIGN_BOTTOM = "Bottom";
+
+/** the possible value of an alignment attribute */
+ public static final String ALIGN_BASELINE = "Baseline";
+
+/** the possible value of an alignment attribute */
+ public static final String DEFAULT = "Default";
+
+ /** The DIV tag. */
+ public static final String DIV = "div";
+
+ /** The SPAN tag. */
+ public static final String SPAN = "span";
+ /** The LINK tag. */
+ public static final String LINK = "link";
+
+ /** This is a possible HTML attribute for the LINK tag. */
+ public static final String TEXT_CSS = "text/css";
+
+ /** This is a possible HTML attribute for the LINK tag. */
+ public static final String REL = "rel";
+
+ /** This is used for inline css style information */
+ public static final String STYLE = "style";
+
+ /** This is a possible HTML attribute for the LINK tag. */
+ public static final String TYPE = "type";
+
+ /** This is a possible HTML attribute. */
+ public static final String STYLESHEET = "stylesheet";
+
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/html/HtmlWriter.java b/src/main/java/com/lowagie/text/html/HtmlWriter.java
new file mode 100644
index 0000000..69ce91c
--- /dev/null
+++ b/src/main/java/com/lowagie/text/html/HtmlWriter.java
@@ -0,0 +1,1094 @@
+/*
+ * $Id: HtmlWriter.java,v 1.109 2005/11/01 12:27:05 psoares33 Exp $
+ * $Name: $
+ *
+ * Copyright 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU LIBRARY GENERAL PUBLIC LICENSE for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.html;
+
+import java.io.OutputStream;
+import java.io.IOException;
+import java.util.Date;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Properties;
+import java.util.Stack;
+import java.util.EmptyStackException;
+
+import com.lowagie.text.*;
+import com.lowagie.text.markup.MarkupTags;
+
+/**
+ * A <CODE>DocWriter</CODE> class for HTML.
+ * <P>
+ * An <CODE>HtmlWriter</CODE> can be added as a <CODE>DocListener</CODE>
+ * to a certain <CODE>Document</CODE> by getting an instance.
+ * Every <CODE>Element</CODE> added to the original <CODE>Document</CODE>
+ * will be written to the <CODE>OutputStream</CODE> of this <CODE>HtmlWriter</CODE>.
+ * <P>
+ * Example:
+ * <BLOCKQUOTE><PRE>
+ * // creation of the document with a certain size and certain margins
+ * Document document = new Document(PageSize.A4, 50, 50, 50, 50);
+ * try {
+ * // this will write HTML to the Standard OutputStream
+ * <STRONG>HtmlWriter.getInstance(document, System.out);</STRONG>
+ * // this will write HTML to a file called text.html
+ * <STRONG>HtmlWriter.getInstance(document, new FileOutputStream("text.html"));</STRONG>
+ * // this will write HTML to for instance the OutputStream of a HttpServletResponse-object
+ * <STRONG>HtmlWriter.getInstance(document, response.getOutputStream());</STRONG>
+ * }
+ * catch(DocumentException de) {
+ * System.err.println(de.getMessage());
+ * }
+ * // this will close the document and all the OutputStreams listening to it
+ * <STRONG>document.close();</CODE>
+ * </PRE></BLOCKQUOTE>
+ */
+
+public class HtmlWriter extends DocWriter implements DocListener {
+
+ // static membervariables (tags)
+
+/** This is a possible HTML-tag. */
+ public static final byte[] BEGINCOMMENT = getISOBytes("<!-- ");
+
+/** This is a possible HTML-tag. */
+ public static final byte[] ENDCOMMENT = getISOBytes(" -->");
+
+/** This is a possible HTML-tag. */
+ public static final String NBSP = "&nbsp;";
+
+ // membervariables
+
+/** This is the current font of the HTML. */
+ protected Stack currentfont = new Stack();
+
+/** This is the standard font of the HTML. */
+ protected Font standardfont = new Font();
+
+/** This is a path for images. */
+ protected String imagepath = null;
+
+/** Stores the page number. */
+ protected int pageN = 0;
+
+/** This is the textual part of a header */
+ protected HeaderFooter header = null;
+
+/** This is the textual part of the footer */
+ protected HeaderFooter footer = null;
+
+ // constructor
+
+/**
+ * Constructs a <CODE>HtmlWriter</CODE>.
+ *
+ * @param doc The <CODE>Document</CODE> that has to be written as HTML
+ * @param os The <CODE>OutputStream</CODE> the writer has to write to.
+ */
+
+ protected HtmlWriter(Document doc, OutputStream os) {
+ super(doc, os);
+
+ document.addDocListener(this);
+ this.pageN = document.getPageNumber();
+ try {
+ os.write(LT);
+ os.write(getISOBytes(HtmlTags.HTML));
+ os.write(GT);
+ os.write(NEWLINE);
+ os.write(TAB);
+ os.write(LT);
+ os.write(getISOBytes(HtmlTags.HEAD));
+ os.write(GT);
+ }
+ catch(IOException ioe) {
+ throw new ExceptionConverter(ioe);
+ }
+ }
+
+ // get an instance of the HtmlWriter
+
+/**
+ * Gets an instance of the <CODE>HtmlWriter</CODE>.
+ *
+ * @param document The <CODE>Document</CODE> that has to be written
+ * @param os The <CODE>OutputStream</CODE> the writer has to write to.
+ * @return a new <CODE>HtmlWriter</CODE>
+ */
+
+ public static HtmlWriter getInstance(Document document, OutputStream os) {
+ return new HtmlWriter(document, os);
+ }
+
+ // implementation of the DocListener methods
+
+/**
+ * Signals that an new page has to be started.
+ *
+ * @return <CODE>true</CODE> if this action succeeded, <CODE>false</CODE> if not.
+ * @throws DocumentException when a document isn't open yet, or has been closed
+ */
+
+ public boolean newPage() throws DocumentException {
+ try {
+ writeStart(HtmlTags.DIV);
+ write(" ");
+ write(HtmlTags.STYLE);
+ write("=\"");
+ writeCssProperty(MarkupTags.CSS_KEY_PAGE_BREAK_BEFORE, MarkupTags.CSS_VALUE_ALWAYS);
+ write("\" /");
+ os.write(GT);
+ }
+ catch(IOException ioe) {
+ throw new DocumentException(ioe);
+ }
+ return true;
+ }
+
+/**
+ * Signals that an <CODE>Element</CODE> was added to the <CODE>Document</CODE>.
+ *
+ * @param element a high level object that has to be translated to HTML
+ * @return <CODE>true</CODE> if the element was added, <CODE>false</CODE> if not.
+ * @throws DocumentException when a document isn't open yet, or has been closed
+ */
+
+ public boolean add(Element element) throws DocumentException {
+ if (pause) {
+ return false;
+ }
+ try {
+
+ switch(element.type()) {
+ case Element.HEADER:
+ try {
+ Header h = (Header) element;
+ if (HtmlTags.STYLESHEET.equals(h.name())) {
+ writeLink(h);
+ }
+ else if (HtmlTags.JAVASCRIPT.equals(h.name())) {
+ writeJavaScript(h);
+ }
+ else {
+ writeHeader(h);
+ }
+ }
+ catch(ClassCastException cce) {
+ }
+ return true;
+ case Element.SUBJECT:
+ case Element.KEYWORDS:
+ case Element.AUTHOR:
+ Meta meta = (Meta) element;
+ writeHeader(meta);
+ return true;
+ case Element.TITLE:
+ addTabs(2);
+ writeStart(HtmlTags.TITLE);
+ os.write(GT);
+ addTabs(3);
+ write(HtmlEncoder.encode(((Meta)element).content()));
+ addTabs(2);
+ writeEnd(HtmlTags.TITLE);
+ return true;
+ case Element.CREATOR:
+ writeComment("Creator: " + HtmlEncoder.encode(((Meta)element).content()));
+ return true;
+ case Element.PRODUCER:
+ writeComment("Producer: " + HtmlEncoder.encode(((Meta)element).content()));
+ return true;
+ case Element.CREATIONDATE:
+ writeComment("Creationdate: " + HtmlEncoder.encode(((Meta)element).content()));
+ return true;
+ default:
+ write(element, 2);
+ return true;
+ }
+ }
+ catch(IOException ioe) {
+ throw new ExceptionConverter(ioe);
+ }
+ }
+
+/**
+ * Signals that the <CODE>Document</CODE> has been opened and that
+ * <CODE>Elements</CODE> can be added.
+ * <P>
+ * The <CODE>HEAD</CODE>-section of the HTML-document is written.
+ */
+
+ public void open() {
+ super.open();
+ try {
+ writeComment(Document.getVersion());
+ writeComment("CreationDate: " + new Date().toString());
+ addTabs(1);
+ writeEnd(HtmlTags.HEAD);
+ addTabs(1);
+ writeStart(HtmlTags.BODY);
+ if (document.leftMargin() > 0) {
+ write(HtmlTags.LEFTMARGIN, String.valueOf(document.leftMargin()));
+ }
+ if (document.rightMargin() > 0) {
+ write(HtmlTags.RIGHTMARGIN, String.valueOf(document.rightMargin()));
+ }
+ if (document.topMargin() > 0) {
+ write(HtmlTags.TOPMARGIN, String.valueOf(document.topMargin()));
+ }
+ if (document.bottomMargin() > 0) {
+ write(HtmlTags.BOTTOMMARGIN, String.valueOf(document.bottomMargin()));
+ }
+ if (pageSize.backgroundColor() != null) {
+ write(HtmlTags.BACKGROUNDCOLOR, HtmlEncoder.encode(pageSize.backgroundColor()));
+ }
+ if (document.getJavaScript_onLoad() != null) {
+ write(HtmlTags.JAVASCRIPT_ONLOAD, HtmlEncoder.encode(document.getJavaScript_onLoad()));
+ }
+ if (document.getJavaScript_onUnLoad() != null) {
+ write(HtmlTags.JAVASCRIPT_ONUNLOAD, HtmlEncoder.encode(document.getJavaScript_onUnLoad()));
+ }
+ if (document.getHtmlStyleClass() != null) {
+ write(MarkupTags.HTML_ATTR_CSS_CLASS, document.getHtmlStyleClass());
+ }
+ os.write(GT);
+ initHeader(); // line added by David Freels
+ }
+ catch(IOException ioe) {
+ throw new ExceptionConverter(ioe);
+ }
+ }
+
+/**
+ * Signals that the <CODE>Document</CODE> was closed and that no other
+ * <CODE>Elements</CODE> will be added.
+ */
+
+ public void close() {
+ try {
+ initFooter(); // line added by David Freels
+ addTabs(1);
+ writeEnd(HtmlTags.BODY);
+ os.write(NEWLINE);
+ writeEnd(HtmlTags.HTML);
+ super.close();
+ }
+ catch(IOException ioe) {
+ throw new ExceptionConverter(ioe);
+ }
+ }
+
+ // some protected methods
+
+/**
+ * Adds the header to the top of the </CODE>Document</CODE>
+ */
+
+ protected void initHeader() {
+ if (header != null) {
+ try {
+ add(header.paragraph());
+ }
+ catch(Exception e) {
+ throw new ExceptionConverter(e);
+ }
+ }
+ }
+
+/**
+ * Adds the header to the top of the </CODE>Document</CODE>
+ */
+
+ protected void initFooter() {
+ if (footer != null) {
+ try {
+ // Set the page number. HTML has no notion of a page, so it should always
+ // add up to 1
+ footer.setPageNumber(pageN + 1);
+ add(footer.paragraph());
+ }
+ catch(Exception e) {
+ throw new ExceptionConverter(e);
+ }
+ }
+ }
+
+/**
+ * Writes a Metatag in the header.
+ *
+ * @param meta the element that has to be written
+ * @throws IOException
+ */
+
+ protected void writeHeader(Meta meta) throws IOException {
+ addTabs(2);
+ writeStart(HtmlTags.META);
+ switch(meta.type()) {
+ case Element.HEADER:
+ write(HtmlTags.NAME, ((Header) meta).name());
+ break;
+ case Element.SUBJECT:
+ write(HtmlTags.NAME, HtmlTags.SUBJECT);
+ break;
+ case Element.KEYWORDS:
+ write(HtmlTags.NAME, HtmlTags.KEYWORDS);
+ break;
+ case Element.AUTHOR:
+ write(HtmlTags.NAME, HtmlTags.AUTHOR);
+ break;
+ }
+ write(HtmlTags.CONTENT, HtmlEncoder.encode(meta.content()));
+ writeEnd();
+ }
+
+/**
+ * Writes a link in the header.
+ *
+ * @param header the element that has to be written
+ * @throws IOException
+ */
+
+ protected void writeLink(Header header) throws IOException {
+ addTabs(2);
+ writeStart(HtmlTags.LINK);
+ write(HtmlTags.REL, header.name());
+ write(HtmlTags.TYPE, HtmlTags.TEXT_CSS);
+ write(HtmlTags.REFERENCE, header.content());
+ writeEnd();
+ }
+
+/**
+ * Writes a JavaScript section or, if the markup attribute HtmlTags.URL is set, a JavaScript reference in the header.
+ *
+ * @param header the element that has to be written
+ * @throws IOException
+ */
+
+ protected void writeJavaScript(Header header) throws IOException {
+ addTabs(2);
+ writeStart(HtmlTags.SCRIPT);
+ write(HtmlTags.LANGUAGE, HtmlTags.JAVASCRIPT);
+ if (header.getMarkupAttribute(HtmlTags.URL) != null) {
+ /* JavaScript reference example:
+ *
+ * <script language="JavaScript" src="/myPath/MyFunctions.js"/>
+ */
+ write(HtmlTags.URL, header.getMarkupAttribute(HtmlTags.URL));
+ os.write(GT);
+ writeEnd(HtmlTags.SCRIPT);
+ }
+ else {
+ /* JavaScript coding convention:
+ *
+ * <script language="JavaScript" type="text/javascript">
+ * <!--
+ * // ... JavaScript methods ...
+ * //-->
+ * </script>
+ */
+ write(HtmlTags.TYPE, MarkupTags.HTML_VALUE_JAVASCRIPT);
+ os.write(GT);
+ addTabs(2);
+ write(new String(BEGINCOMMENT) + "\n");
+ write(header.content());
+ addTabs(2);
+ write("//" + new String(ENDCOMMENT));
+ addTabs(2);
+ writeEnd(HtmlTags.SCRIPT);
+ }
+ }
+
+/**
+ * Writes some comment.
+ * <P>
+ * This method writes some comment.
+ *
+ * @param comment the comment that has to be written
+ * @throws IOException
+ */
+
+ protected void writeComment(String comment) throws IOException {
+ addTabs(2);
+ os.write(BEGINCOMMENT);
+ write(comment);
+ os.write(ENDCOMMENT);
+ }
+
+ // public methods
+
+/**
+ * Changes the standardfont.
+ *
+ * @param standardfont The font
+ */
+
+ public void setStandardFont(Font standardfont) {
+ this.standardfont = standardfont;
+ }
+
+/**
+ * Checks if a given font is the same as the font that was last used.
+ *
+ * @param font the font of an object
+ * @return true if the font differs
+ */
+
+ public boolean isOtherFont(Font font) {
+ try {
+ Font cFont = (Font) currentfont.peek();
+ if (cFont.compareTo(font) == 0) return false;
+ return true;
+ }
+ catch(EmptyStackException ese) {
+ if (standardfont.compareTo(font) == 0) return false;
+ return true;
+ }
+ }
+
+/**
+ * Sets the basepath for images.
+ * <P>
+ * This is especially useful if you add images using a file,
+ * rather than an URL. In PDF there is no problem, since
+ * the images are added inline, but in HTML it is sometimes
+ * necessary to use a relative path or a special path to some
+ * images directory.
+ *
+ * @param imagepath the new imagepath
+ */
+
+ public void setImagepath(String imagepath) {
+ this.imagepath = imagepath;
+ }
+
+/**
+ * Resets the imagepath.
+ */
+
+ public void resetImagepath() {
+ imagepath = null;
+ }
+
+/**
+ * Changes the header of this document.
+ *
+ * @param header the new header
+ */
+
+ public void setHeader(HeaderFooter header) {
+ this.header = header;
+ }
+
+/**
+ * Changes the footer of this document.
+ *
+ * @param footer the new footer
+ */
+
+ public void setFooter(HeaderFooter footer) {
+ this.footer = footer;
+ }
+
+/**
+ * Signals that a <CODE>String</CODE> was added to the <CODE>Document</CODE>.
+ *
+ * @param string a String to add to the HTML
+ * @return <CODE>true</CODE> if the string was added, <CODE>false</CODE> if not.
+ * @throws DocumentException when a document isn't open yet, or has been closed
+ */
+
+ public boolean add(String string) throws DocumentException{
+ if (pause) {
+ return false;
+ }
+ try
+ {
+ write(string);
+ return true;
+ }
+ catch(IOException ioe) {
+ throw new ExceptionConverter(ioe);
+ }
+ }
+
+/**
+ * Writes the HTML representation of an element.
+ *
+ * @param element the element
+ * @param indent the indentation
+ * @throws IOException
+ */
+
+ protected void write(Element element, int indent) throws IOException {
+ Properties styleAttributes = null;
+ switch(element.type()) {
+ case Element.CHUNK:
+ {
+ Chunk chunk = (Chunk) element;
+ // if the chunk contains an image, return the image representation
+ Image image = chunk.getImage();
+ if (image != null) {
+ write(image, indent);
+ return;
+ }
+
+ if (chunk.isEmpty()) return;
+ HashMap attributes = chunk.getAttributes();
+ if (attributes != null && attributes.get(Chunk.NEWPAGE) != null) {
+ return;
+ }
+ // This doesn't seem to work:
+ //if (attributes != null && attributes.get(Chunk.SUBSUPSCRIPT) != null) {
+ // float p = (((Float)attributes.get(Chunk.SUBSUPSCRIPT)).floatValue() * 100f) / chunk.font().size();
+ // styleAttributes = new Properties();
+ // styleAttributes.setProperty(MarkupTags.CSS_VERTICALALIGN, "" + p + "%");
+ //}
+ boolean tag = isOtherFont(chunk.font()) || hasMarkupAttributes(chunk) || styleAttributes != null;
+ if (tag) {
+ // start span tag
+ addTabs(indent);
+ writeStart(HtmlTags.SPAN);
+ if (isOtherFont(chunk.font())) {
+ write(chunk.font(), styleAttributes);
+ }
+ if (hasMarkupAttributes(chunk)) {
+ writeMarkupAttributes(chunk);
+ }
+ os.write(GT);
+ }
+ if (attributes != null && attributes.get(Chunk.SUBSUPSCRIPT) != null) {
+ // start sup or sub tag
+ if (((Float)attributes.get(Chunk.SUBSUPSCRIPT)).floatValue() > 0) {
+ writeStart(HtmlTags.SUP);
+ }
+ else {
+ writeStart(HtmlTags.SUB);
+ }
+ os.write(GT);
+ }
+ // contents
+ write(HtmlEncoder.encode(chunk.content()));
+ if (attributes != null && attributes.get(Chunk.SUBSUPSCRIPT) != null) {
+ // end sup or sub tag
+ os.write(LT);
+ os.write(FORWARD);
+ if (((Float)attributes.get(Chunk.SUBSUPSCRIPT)).floatValue() > 0) {
+ write(HtmlTags.SUP);
+ }
+ else {
+ write(HtmlTags.SUB);
+ }
+ os.write(GT);
+ }
+ if (tag) {
+ // end tag
+ writeEnd(MarkupTags.HTML_TAG_SPAN);
+ }
+ return;
+ }
+ case Element.PHRASE:
+ {
+ Phrase phrase = (Phrase) element;
+ styleAttributes = new Properties();
+ if (phrase.leadingDefined()) styleAttributes.setProperty(MarkupTags.CSS_KEY_LINEHEIGHT, String.valueOf(phrase.leading()) + "pt");
+
+ // start tag
+ addTabs(indent);
+ writeStart(MarkupTags.HTML_TAG_SPAN);
+ if (hasMarkupAttributes(phrase)) {
+ writeMarkupAttributes(phrase);
+ }
+ write(phrase.font(), styleAttributes);
+ os.write(GT);
+ currentfont.push(phrase.font());
+ // contents
+ for (Iterator i = phrase.iterator(); i.hasNext(); ) {
+ write((Element) i.next(), indent + 1);
+ }
+ // end tag
+ addTabs(indent);
+ writeEnd(MarkupTags.HTML_TAG_SPAN);
+ currentfont.pop();
+ return;
+ }
+ case Element.ANCHOR:
+ {
+ Anchor anchor = (Anchor) element;
+ styleAttributes = new Properties();
+ if (anchor.leadingDefined()) styleAttributes.setProperty(MarkupTags.CSS_KEY_LINEHEIGHT, String.valueOf(anchor.leading()) + "pt");
+
+ // start tag
+ addTabs(indent);
+ writeStart(HtmlTags.ANCHOR);
+ if (anchor.name() != null) {
+ write(HtmlTags.NAME, anchor.name());
+ }
+ if (anchor.reference() != null) {
+ write(HtmlTags.REFERENCE, anchor.reference());
+ }
+ if (hasMarkupAttributes(anchor)) {
+ writeMarkupAttributes(anchor);
+ }
+ write(anchor.font(), styleAttributes);
+ os.write(GT);
+ currentfont.push(anchor.font());
+ // contents
+ for (Iterator i = anchor.iterator(); i.hasNext(); ) {
+ write((Element) i.next(), indent + 1);
+ }
+ // end tag
+ addTabs(indent);
+ writeEnd(HtmlTags.ANCHOR);
+ currentfont.pop();
+ return;
+ }
+ case Element.PARAGRAPH:
+ {
+ Paragraph paragraph = (Paragraph) element;
+ styleAttributes = new Properties();
+ if (paragraph.leadingDefined()) styleAttributes.setProperty(MarkupTags.CSS_KEY_LINEHEIGHT, String.valueOf(paragraph.leading()) + "pt");
+ // start tag
+ addTabs(indent);
+ writeStart(HtmlTags.DIV);
+ if (hasMarkupAttributes(paragraph)) {
+ writeMarkupAttributes(paragraph);
+ }
+ String alignment = HtmlEncoder.getAlignment(paragraph.alignment());
+ if (!"".equals(alignment)) {
+ write(HtmlTags.ALIGN, alignment);
+ }
+ write(paragraph.font(), styleAttributes);
+ os.write(GT);
+ currentfont.push(paragraph.font());
+ // contents
+ for (Iterator i = paragraph.iterator(); i.hasNext(); ) {
+ write((Element) i.next(), indent + 1);
+ }
+ // end tag
+ addTabs(indent);
+ writeEnd(HtmlTags.DIV);
+ currentfont.pop();
+ return;
+ }
+ case Element.SECTION:
+ case Element.CHAPTER:
+ {
+ // part of the start tag + contents
+ writeSection((Section) element, indent);
+ return;
+ }
+ case Element.LIST:
+ {
+ List list = (List) element;
+ // start tag
+ addTabs(indent);
+ if (list.isNumbered()) {
+ writeStart(HtmlTags.ORDEREDLIST);
+ }
+ else {
+ writeStart(HtmlTags.UNORDEREDLIST);
+ }
+ if (hasMarkupAttributes(list)) {
+ writeMarkupAttributes(list);
+ }
+ os.write(GT);
+ // contents
+ for (Iterator i = list.getItems().iterator(); i.hasNext(); ) {
+ write((Element) i.next(), indent + 1);
+ }
+ // end tag
+ addTabs(indent);
+ if (list.isNumbered()) {
+ writeEnd(HtmlTags.ORDEREDLIST);
+ }
+ else {
+ writeEnd(HtmlTags.UNORDEREDLIST);
+ }
+ return;
+ }
+ case Element.LISTITEM:
+ {
+ ListItem listItem = (ListItem) element;
+ styleAttributes = new Properties();
+ if (listItem.leadingDefined()) styleAttributes.setProperty(MarkupTags.CSS_KEY_LINEHEIGHT, String.valueOf(listItem.leading()) + "pt");
+
+ // start tag
+ addTabs(indent);
+ writeStart(HtmlTags.LISTITEM);
+ if (hasMarkupAttributes(listItem)) {
+ writeMarkupAttributes(listItem);
+ }
+ write(listItem.font(), styleAttributes);
+ os.write(GT);
+ currentfont.push(listItem.font());
+ // contents
+ for (Iterator i = listItem.iterator(); i.hasNext(); ) {
+ write((Element) i.next(), indent + 1);
+ }
+ // end tag
+ addTabs(indent);
+ writeEnd(HtmlTags.LISTITEM);
+ currentfont.pop();
+ return;
+ }
+ case Element.CELL:
+ {
+ Cell cell = (Cell) element;
+
+ // start tag
+ addTabs(indent);
+ if (cell.header()) {
+ writeStart(HtmlTags.HEADERCELL);
+ }
+ else {
+ writeStart(HtmlTags.CELL);
+ }
+ if (hasMarkupAttributes(cell)) {
+ writeMarkupAttributes(cell);
+ }
+ if (cell.borderWidth() != Rectangle.UNDEFINED) {
+ write(HtmlTags.BORDERWIDTH, String.valueOf(cell.borderWidth()));
+ }
+ if (cell.borderColor() != null) {
+ write(HtmlTags.BORDERCOLOR, HtmlEncoder.encode(cell.borderColor()));
+ }
+ if (cell.backgroundColor() != null) {
+ write(HtmlTags.BACKGROUNDCOLOR, HtmlEncoder.encode(cell.backgroundColor()));
+ }
+ String alignment = HtmlEncoder.getAlignment(cell.horizontalAlignment());
+ if (!"".equals(alignment)) {
+ write(HtmlTags.HORIZONTALALIGN, alignment);
+ }
+ alignment = HtmlEncoder.getAlignment(cell.verticalAlignment());
+ if (!"".equals(alignment)) {
+ write(HtmlTags.VERTICALALIGN, alignment);
+ }
+ if (cell.cellWidth() != null) {
+ write(HtmlTags.WIDTH, cell.cellWidth());
+ }
+ if (cell.colspan() != 1) {
+ write(HtmlTags.COLSPAN, String.valueOf(cell.colspan()));
+ }
+ if (cell.rowspan() != 1) {
+ write(HtmlTags.ROWSPAN, String.valueOf(cell.rowspan()));
+ }
+ if (cell.noWrap()) {
+ write(HtmlTags.NOWRAP, String.valueOf(true));
+ }
+ os.write(GT);
+ // contents
+ if (cell.isEmpty()) {
+ write(NBSP);
+ } else {
+ for (Iterator i = cell.getElements(); i.hasNext(); ) {
+ write((Element) i.next(), indent + 1);
+ }
+ }
+ // end tag
+ addTabs(indent);
+ if (cell.header()) {
+ writeEnd(HtmlTags.HEADERCELL);
+ }
+ else {
+ writeEnd(HtmlTags.CELL);
+ }
+ return;
+ }
+ case Element.ROW:
+ {
+ Row row = (Row) element;
+
+ // start tag
+ addTabs(indent);
+ writeStart(HtmlTags.ROW);
+ if (hasMarkupAttributes(row)) {
+ writeMarkupAttributes(row);
+ }
+ os.write(GT);
+ // contents
+ Element cell;
+ for (int i = 0; i < row.columns(); i++) {
+ if ((cell = (Element)row.getCell(i)) != null) {
+ write(cell, indent + 1);
+ }
+ }
+ // end tag
+ addTabs(indent);
+ writeEnd(HtmlTags.ROW);
+ return;
+ }
+ case Element.TABLE:
+ {
+ Table table;
+ try {
+ table = (Table) element;
+ }
+ catch(ClassCastException cce) {
+ try {
+ table = ((SimpleTable)element).createTable();
+ } catch (BadElementException e) {
+ throw new ExceptionConverter(e);
+ }
+ }
+ table.complete();
+ // start tag
+ addTabs(indent);
+ writeStart(HtmlTags.TABLE);
+ if (hasMarkupAttributes(table)) {
+ writeMarkupAttributes(table);
+ }
+ os.write(SPACE);
+ write(HtmlTags.WIDTH);
+ os.write(EQUALS);
+ os.write(QUOTE);
+ if (! "".equals(table.absWidth())){
+ write(table.absWidth());
+ }
+ else{
+ write(String.valueOf(table.widthPercentage()));
+ write("%");
+ }
+ os.write(QUOTE);
+ String alignment = HtmlEncoder.getAlignment(table.alignment());
+ if (!"".equals(alignment)) {
+ write(HtmlTags.ALIGN, alignment);
+ }
+ write(HtmlTags.CELLPADDING, String.valueOf(table.cellpadding()));
+ write(HtmlTags.CELLSPACING, String.valueOf(table.cellspacing()));
+ if (table.borderWidth() != Rectangle.UNDEFINED) {
+ write(HtmlTags.BORDERWIDTH, String.valueOf(table.borderWidth()));
+ }
+ if (table.borderColor() != null) {
+ write(HtmlTags.BORDERCOLOR, HtmlEncoder.encode(table.borderColor()));
+ }
+ if (table.backgroundColor() != null) {
+ write(HtmlTags.BACKGROUNDCOLOR, HtmlEncoder.encode(table.backgroundColor()));
+ }
+ os.write(GT);
+ // contents
+ Row row;
+ for (Iterator iterator = table.iterator(); iterator.hasNext(); ) {
+ row = (Row) iterator.next();
+ write(row, indent + 1);
+ }
+ // end tag
+ addTabs(indent);
+ writeEnd(HtmlTags.TABLE);
+ return;
+ }
+ case Element.ANNOTATION:
+ {
+ Annotation annotation = (Annotation) element;
+ writeComment(annotation.title() + ": " + annotation.content());
+ if (hasMarkupAttributes(annotation)) {
+ os.write(BEGINCOMMENT);
+ writeMarkupAttributes(annotation);
+ os.write(ENDCOMMENT);
+ }
+ return;
+ }
+ case Element.IMGRAW:
+ case Element.JPEG:
+ case Element.IMGTEMPLATE:
+ {
+ Image image = (Image) element;
+ if (image.url() == null) {
+ return;
+ }
+
+ // start tag
+ addTabs(indent);
+ writeStart(HtmlTags.IMAGE);
+ String path = image.url().toString();
+ if (imagepath != null) {
+ if (path.indexOf("/") > 0) {
+ path = imagepath + path.substring(path.lastIndexOf("/") + 1);
+ }
+ else {
+ path = imagepath + path;
+ }
+ }
+ write(HtmlTags.URL, path);
+ if ((image.alignment() & Image.LEFT) > 0) {
+ write(HtmlTags.ALIGN, HtmlTags.ALIGN_LEFT);
+ }
+ else if ((image.alignment() & Image.RIGHT) > 0) {
+ write(HtmlTags.ALIGN, HtmlTags.ALIGN_RIGHT);
+ }
+ else if ((image.alignment() & Image.MIDDLE) > 0) {
+ write(HtmlTags.ALIGN, HtmlTags.ALIGN_MIDDLE);
+ }
+ if (image.alt() != null) {
+ write(HtmlTags.ALT, image.alt());
+ }
+ write(HtmlTags.PLAINWIDTH, String.valueOf(image.scaledWidth()));
+ write(HtmlTags.PLAINHEIGHT, String.valueOf(image.scaledHeight()));
+ if (hasMarkupAttributes(image)){
+ writeMarkupAttributes(image);
+ }
+ writeEnd();
+ return;
+ }
+
+ default:
+ return;
+ }
+ }
+
+/**
+ * Writes the HTML representation of a section.
+ *
+ * @param section the section to write
+ * @param indent the indentation
+ * @throws IOException
+ */
+
+ protected void writeSection(Section section, int indent) throws IOException {
+ if (section.title() != null) {
+ int depth = section.depth() - 1;
+ if (depth > 5) {
+ depth = 5;
+ }
+ Properties styleAttributes = new Properties();
+ if (section.title().leadingDefined()) styleAttributes.setProperty(MarkupTags.CSS_KEY_LINEHEIGHT, String.valueOf(section.title().leading()) + "pt");
+ // start tag
+ addTabs(indent);
+ writeStart(HtmlTags.H[depth]);
+ write(section.title().font(), styleAttributes);
+ String alignment = HtmlEncoder.getAlignment(section.title().alignment());
+ if (!"".equals(alignment)) {
+ write(HtmlTags.ALIGN, alignment);
+ }
+ if (hasMarkupAttributes(section.title())) {
+ writeMarkupAttributes(section.title());
+ }
+ os.write(GT);
+ currentfont.push(section.title().font());
+ // contents
+ for (Iterator i = section.title().iterator(); i.hasNext(); ) {
+ write((Element)i.next(), indent + 1);
+ }
+ // end tag
+ addTabs(indent);
+ writeEnd(HtmlTags.H[depth]);
+ currentfont.pop();
+ }
+ for (Iterator i = section.iterator(); i.hasNext(); ) {
+ write((Element) i.next(), indent);
+ }
+ }
+
+ /**
+ * Writes the representation of a <CODE>Font</CODE>.
+ *
+ * @param font a <CODE>Font</CODE>
+ * @param styleAttributes the style of the font
+ * @throws IOException
+ */
+
+ protected void write(Font font, Properties styleAttributes) throws IOException {
+ if (font == null || !isOtherFont(font) /* || styleAttributes == null*/) return;
+ write(" ");
+ write(HtmlTags.STYLE);
+ write("=\"");
+ if (styleAttributes != null) {
+ String key;
+ for (Enumeration e = styleAttributes.propertyNames(); e.hasMoreElements(); ) {
+ key = (String)e.nextElement();
+ writeCssProperty(key, styleAttributes.getProperty(key));
+ }
+ }
+ if (isOtherFont(font)) {
+ writeCssProperty(MarkupTags.CSS_KEY_FONTFAMILY, font.getFamilyname());
+
+ if (font.size() != Font.UNDEFINED) {
+ writeCssProperty(MarkupTags.CSS_KEY_FONTSIZE, String.valueOf(font.size()) + "pt");
+ }
+ if (font.color() != null) {
+ writeCssProperty(MarkupTags.CSS_KEY_COLOR, HtmlEncoder.encode(font.color()));
+ }
+
+ int fontstyle = font.style();
+ if (fontstyle != Font.UNDEFINED && fontstyle != Font.NORMAL) {
+ switch (fontstyle & Font.BOLDITALIC) {
+ case Font.BOLD:
+ writeCssProperty(MarkupTags.CSS_KEY_FONTWEIGHT, MarkupTags.CSS_VALUE_BOLD);
+ break;
+ case Font.ITALIC:
+ writeCssProperty(MarkupTags.CSS_KEY_FONTSTYLE, MarkupTags.CSS_VALUE_ITALIC);
+ break;
+ case Font.BOLDITALIC:
+ writeCssProperty(MarkupTags.CSS_KEY_FONTWEIGHT, MarkupTags.CSS_VALUE_BOLD);
+ writeCssProperty(MarkupTags.CSS_KEY_FONTSTYLE, MarkupTags.CSS_VALUE_ITALIC);
+ break;
+ }
+
+ // CSS only supports one decoration tag so if both are specified
+ // only one of the two will display
+ if ((fontstyle & Font.UNDERLINE) > 0) {
+ writeCssProperty(MarkupTags.CSS_KEY_TEXTDECORATION, MarkupTags.CSS_VALUE_UNDERLINE);
+ }
+ if ((fontstyle & Font.STRIKETHRU) > 0) {
+ writeCssProperty(MarkupTags.CSS_KEY_TEXTDECORATION, MarkupTags.CSS_VALUE_LINETHROUGH);
+ }
+ }
+ }
+ write("\"");
+ }
+
+ /**
+ * Writes out a CSS property.
+ * @param prop a CSS property
+ * @param value the value of the CSS property
+ * @throws IOException
+ */
+ protected void writeCssProperty(String prop, String value) throws IOException {
+ write(new StringBuffer(prop).append(": ").append(value).append("; ").toString());
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/html/SAXmyHtmlHandler.java b/src/main/java/com/lowagie/text/html/SAXmyHtmlHandler.java
new file mode 100644
index 0000000..76c2e6a
--- /dev/null
+++ b/src/main/java/com/lowagie/text/html/SAXmyHtmlHandler.java
@@ -0,0 +1,293 @@
+/*
+ * $Id: SAXmyHtmlHandler.java,v 1.25 2006/03/23 09:51:50 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2001, 2002 by Bruno Lowagie.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.html;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Properties;
+
+import org.xml.sax.Attributes;
+
+import com.lowagie.text.Cell;
+import com.lowagie.text.DocListener;
+import com.lowagie.text.DocumentException;
+import com.lowagie.text.Element;
+import com.lowagie.text.ElementTags;
+import com.lowagie.text.ExceptionConverter;
+import com.lowagie.text.Paragraph;
+import com.lowagie.text.Table;
+import com.lowagie.text.html.HtmlTagMap;
+import com.lowagie.text.html.HtmlTags;
+import com.lowagie.text.pdf.BaseFont;
+import com.lowagie.text.xml.SAXiTextHandler;
+import com.lowagie.text.xml.XmlPeer;
+
+/**
+ * The <CODE>Tags</CODE>-class maps several XHTML-tags to iText-objects.
+ */
+
+public class SAXmyHtmlHandler extends SAXiTextHandler // SAXmyHandler
+{
+
+ /** These are the properties of the body section. */
+ private Properties bodyAttributes = new Properties();
+
+ /** This is the status of the table border. */
+ private boolean tableBorder = false;
+
+ /**
+ * Constructs a new SAXiTextHandler that will translate all the events
+ * triggered by the parser to actions on the <CODE>Document</CODE>-object.
+ *
+ * @param document
+ * this is the document on which events must be triggered
+ * @throws IOException
+ * @throws DocumentException
+ */
+
+ public SAXmyHtmlHandler(DocListener document)
+ throws DocumentException, IOException {
+ super(document, new HtmlTagMap());
+ }
+ /**
+ * Constructs a new SAXiTextHandler that will translate all the events
+ * triggered by the parser to actions on the <CODE>Document</CODE>-object.
+ *
+ * @param document
+ * this is the document on which events must be triggered
+ * @param bf
+ * @throws IOException
+ * @throws DocumentException
+ */
+
+ public SAXmyHtmlHandler(DocListener document, BaseFont bf)
+ throws DocumentException, IOException {
+ super(document, new HtmlTagMap(), bf);
+ }
+
+ /**
+ * Constructs a new SAXiTextHandler that will translate all the events
+ * triggered by the parser to actions on the <CODE>Document</CODE>-object.
+ *
+ * @param document
+ * this is the document on which events must be triggered
+ * @param htmlTags
+ * a tagmap translating HTML tags to iText tags
+ * @throws IOException
+ * @throws DocumentException
+ */
+
+ public SAXmyHtmlHandler(DocListener document, HashMap htmlTags)
+ throws DocumentException, IOException {
+ super(document, htmlTags);
+ }
+
+ /**
+ * This method gets called when a start tag is encountered.
+ *
+ * @param uri
+ * the Uniform Resource Identifier
+ * @param lname
+ * the local name (without prefix), or the empty string if
+ * Namespace processing is not being performed.
+ * @param name
+ * the name of the tag that is encountered
+ * @param attrs
+ * the list of attributes
+ */
+
+ public void startElement(String uri, String lname, String name,
+ Attributes attrs) {
+ // System.err.println("Start: " + name);
+
+ // super.handleStartingTags is replaced with handleStartingTags
+ // suggestion by Vu Ngoc Tan/Hop
+ name = name.toLowerCase();
+ if (((HtmlTagMap) myTags).isHtml(name)) {
+ // we do nothing
+ return;
+ }
+ if (((HtmlTagMap) myTags).isHead(name)) {
+ // we do nothing
+ return;
+ }
+ if (((HtmlTagMap) myTags).isTitle(name)) {
+ // we do nothing
+ return;
+ }
+ if (((HtmlTagMap) myTags).isMeta(name)) {
+ // we look if we can change the body attributes
+ String meta = null;
+ String content = null;
+ if (attrs != null) {
+ for (int i = 0; i < attrs.getLength(); i++) {
+ String attribute = attrs.getQName(i);
+ if (attribute.equalsIgnoreCase(HtmlTags.CONTENT))
+ content = attrs.getValue(i);
+ else if (attribute.equalsIgnoreCase(HtmlTags.NAME))
+ meta = attrs.getValue(i);
+ }
+ }
+ if (meta != null && content != null) {
+ bodyAttributes.put(meta, content);
+ }
+ return;
+ }
+ if (((HtmlTagMap) myTags).isLink(name)) {
+ // we do nothing for the moment, in a later version we could extract
+ // the style sheet
+ return;
+ }
+ if (((HtmlTagMap) myTags).isBody(name)) {
+ // maybe we could extract some info about the document: color,
+ // margins,...
+ // but that's for a later version...
+ XmlPeer peer = new XmlPeer(ElementTags.ITEXT, name);
+ peer.addAlias(ElementTags.TOP, HtmlTags.TOPMARGIN);
+ peer.addAlias(ElementTags.BOTTOM, HtmlTags.BOTTOMMARGIN);
+ peer.addAlias(ElementTags.RIGHT, HtmlTags.RIGHTMARGIN);
+ peer.addAlias(ElementTags.LEFT, HtmlTags.LEFTMARGIN);
+ String content = null;
+ bodyAttributes.putAll(peer.getAttributes(attrs));
+ handleStartingTags(peer.getTag(), bodyAttributes);
+ return;
+ }
+ if (myTags.containsKey(name)) {
+ XmlPeer peer = (XmlPeer) myTags.get(name);
+ if (Table.isTag(peer.getTag()) || Cell.isTag(peer.getTag())) {
+ Properties p = peer.getAttributes(attrs);
+ String value;
+ if (Table.isTag(peer.getTag())
+ && (value = p.getProperty(ElementTags.BORDERWIDTH)) != null) {
+ if (Float.valueOf(value + "f").floatValue() > 0) {
+ tableBorder = true;
+ }
+ }
+ if (tableBorder) {
+ p.put(ElementTags.LEFT, String.valueOf(true));
+ p.put(ElementTags.RIGHT, String.valueOf(true));
+ p.put(ElementTags.TOP, String.valueOf(true));
+ p.put(ElementTags.BOTTOM, String.valueOf(true));
+ }
+ handleStartingTags(peer.getTag(), p);
+ return;
+ }
+ handleStartingTags(peer.getTag(), peer.getAttributes(attrs));
+ return;
+ }
+ Properties attributes = new Properties();
+ if (attrs != null) {
+ for (int i = 0; i < attrs.getLength(); i++) {
+ String attribute = attrs.getQName(i).toLowerCase();
+ attributes.setProperty(attribute, attrs.getValue(i).toLowerCase());
+ }
+ }
+ handleStartingTags(name, attributes);
+ }
+
+ /**
+ * This method gets called when an end tag is encountered.
+ *
+ * @param uri
+ * the Uniform Resource Identifier
+ * @param lname
+ * the local name (without prefix), or the empty string if
+ * Namespace processing is not being performed.
+ * @param name
+ * the name of the tag that ends
+ */
+
+ public void endElement(String uri, String lname, String name) {
+ // System.err.println("End: " + name);
+ name = name.toLowerCase();
+ if (Paragraph.isTag(name)) {
+ try {
+ document.add((Element) stack.pop());
+ return;
+ } catch (DocumentException e) {
+ throw new ExceptionConverter(e);
+ }
+ }
+ if (((HtmlTagMap) myTags).isHead(name)) {
+ // we do nothing
+ return;
+ }
+ if (((HtmlTagMap) myTags).isTitle(name)) {
+ if (currentChunk != null) {
+ bodyAttributes.put(ElementTags.TITLE, currentChunk.content());
+ }
+ return;
+ }
+ if (((HtmlTagMap) myTags).isMeta(name)) {
+ // we do nothing
+ return;
+ }
+ if (((HtmlTagMap) myTags).isLink(name)) {
+ // we do nothing
+ return;
+ }
+ if (((HtmlTagMap) myTags).isBody(name)) {
+ // we do nothing
+ return;
+ }
+ if (myTags.containsKey(name)) {
+ XmlPeer peer = (XmlPeer) myTags.get(name);
+ if (Table.isTag(peer.getTag())) {
+ tableBorder = false;
+ }
+ super.handleEndingTags(peer.getTag());
+ return;
+ }
+ // super.handleEndingTags is replaced with handleEndingTags
+ // suggestion by Ken Auer
+ handleEndingTags(name);
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/html/simpleparser/ALink.java b/src/main/java/com/lowagie/text/html/simpleparser/ALink.java
new file mode 100644
index 0000000..a190e38
--- /dev/null
+++ b/src/main/java/com/lowagie/text/html/simpleparser/ALink.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright 2005 Paulo Soares
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.html.simpleparser;
+
+import com.lowagie.text.Paragraph;
+/**
+ *
+ * @author psoares
+ */
+public interface ALink {
+ boolean process(Paragraph current, ChainedProperties cprops);
+}
diff --git a/src/main/java/com/lowagie/text/html/simpleparser/ChainedProperties.java b/src/main/java/com/lowagie/text/html/simpleparser/ChainedProperties.java
new file mode 100644
index 0000000..c3e078a
--- /dev/null
+++ b/src/main/java/com/lowagie/text/html/simpleparser/ChainedProperties.java
@@ -0,0 +1,127 @@
+/*
+ * Copyright 2004 Paulo Soares
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.html.simpleparser;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+
+public class ChainedProperties {
+
+ public final static int fontSizes[] = {8, 10, 12, 14, 18, 24, 36};
+ public ArrayList chain = new ArrayList();
+
+ /** Creates a new instance of ChainedProperties */
+ public ChainedProperties() {
+ }
+
+ public String getProperty(String key) {
+ for (int k = chain.size() - 1; k >= 0; --k) {
+ Object obj[] = (Object[])chain.get(k);
+ HashMap prop = (HashMap)obj[1];
+ String ret = (String)prop.get(key);
+ if (ret != null)
+ return ret;
+ }
+ return null;
+ }
+
+ public boolean hasProperty(String key) {
+ for (int k = chain.size() - 1; k >= 0; --k) {
+ Object obj[] = (Object[])chain.get(k);
+ HashMap prop = (HashMap)obj[1];
+ if (prop.containsKey(key))
+ return true;
+ }
+ return false;
+ }
+
+ public void addToChain(String key, HashMap prop) {
+ // adjust the font size
+ String value = (String)prop.get("size");
+ if (value != null) {
+ if (value.endsWith("px")) {
+ prop.put("size", value.substring(0, value.length() - 2));
+ }
+ else {
+ int s = 0;
+ if (value.startsWith("+") || value.startsWith("-")) {
+ String old = getProperty("basefontsize");
+ if (old == null)
+ old = "12";
+ float f = Float.valueOf(old).floatValue();
+ int c = (int)f;
+ for (int k = fontSizes.length - 1; k >= 0; --k) {
+ if (c >= fontSizes[k]) {
+ s = k;
+ break;
+ }
+ }
+ int inc = Integer.parseInt(value.startsWith("+") ? value.substring(1) : value);
+ s += inc;
+ }
+ else
+ s = Integer.parseInt(value) - 1;
+ if (s < 0)
+ s = 0;
+ else if (s >= fontSizes.length)
+ s = fontSizes.length - 1;
+ prop.put("size", Integer.toString(fontSizes[s]));
+ }
+ }
+ chain.add(new Object[]{key, prop});
+ }
+
+ public void removeChain(String key) {
+ for (int k = chain.size() - 1; k >= 0; --k) {
+ if (key.equals(((Object[])chain.get(k))[0])) {
+ chain.remove(k);
+ return;
+ }
+ }
+ }
+}
diff --git a/src/main/java/com/lowagie/text/html/simpleparser/FactoryProperties.java b/src/main/java/com/lowagie/text/html/simpleparser/FactoryProperties.java
new file mode 100644
index 0000000..a017a1a
--- /dev/null
+++ b/src/main/java/com/lowagie/text/html/simpleparser/FactoryProperties.java
@@ -0,0 +1,244 @@
+/*
+ * Copyright 2004 Paulo Soares
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.html.simpleparser;
+
+import com.lowagie.text.*;
+import com.lowagie.text.pdf.*;
+import java.util.HashMap;
+import java.util.StringTokenizer;
+import java.awt.Color;
+
+/**
+ *
+ * @author psoares
+ */
+public class FactoryProperties {
+
+ private FontFactoryImp fontImp;
+
+ /** Creates a new instance of FactoryProperties */
+ public FactoryProperties() {
+ }
+
+ public Chunk createChunk(String text, ChainedProperties props) {
+ Chunk ck = new Chunk(text, getFont(props));
+ if (props.hasProperty("sub"))
+ ck.setTextRise(-6);
+ else if (props.hasProperty("sup"))
+ ck.setTextRise(6);
+ return ck;
+ }
+
+ private static void setParagraphLeading(Paragraph p, String leading) {
+ if (leading == null) {
+ p.setLeading(0, 1.5f);
+ return;
+ }
+ try {
+ StringTokenizer tk = new StringTokenizer(leading, " ,");
+ String v = tk.nextToken();
+ float v1 = Float.valueOf(v).floatValue();
+ if (!tk.hasMoreTokens()) {
+ p.setLeading(v1, 0);
+ return;
+ }
+ v = tk.nextToken();
+ float v2 = Float.valueOf(v).floatValue();
+ p.setLeading(v1, v2);
+ }
+ catch (Exception e) {
+ p.setLeading(0, 1.5f);
+ }
+
+ }
+
+ public static Paragraph createParagraph(HashMap props) {
+ Paragraph p = new Paragraph();
+ String value = (String)props.get("align");
+ if (value != null) {
+ if (value.equalsIgnoreCase("center"))
+ p.setAlignment(Element.ALIGN_CENTER);
+ else if (value.equalsIgnoreCase("right"))
+ p.setAlignment(Element.ALIGN_RIGHT);
+ else if (value.equalsIgnoreCase("justify"))
+ p.setAlignment(Element.ALIGN_JUSTIFIED);
+ }
+ setParagraphLeading(p, (String)props.get("leading"));
+ return p;
+ }
+
+ public static void createParagraph(Paragraph p, ChainedProperties props) {
+ String value = props.getProperty("align");
+ if (value != null) {
+ if (value.equalsIgnoreCase("center"))
+ p.setAlignment(Element.ALIGN_CENTER);
+ else if (value.equalsIgnoreCase("right"))
+ p.setAlignment(Element.ALIGN_RIGHT);
+ else if (value.equalsIgnoreCase("justify"))
+ p.setAlignment(Element.ALIGN_JUSTIFIED);
+ }
+ setParagraphLeading(p, props.getProperty("leading"));
+ value = props.getProperty("before");
+ if (value != null) {
+ try {
+ p.setSpacingBefore(Float.valueOf(value).floatValue());
+ }
+ catch (Exception e) {}
+ }
+ value = props.getProperty("after");
+ if (value != null) {
+ try {
+ p.setSpacingAfter(Float.valueOf(value).floatValue());
+ }
+ catch (Exception e) {}
+ }
+ value = props.getProperty("extraparaspace");
+ if (value != null) {
+ try {
+ p.setExtraParagraphSpace(Float.valueOf(value).floatValue());
+ }
+ catch (Exception e) {}
+ }
+ }
+
+ public static Paragraph createParagraph(ChainedProperties props) {
+ Paragraph p = new Paragraph();
+ createParagraph(p, props);
+ return p;
+ }
+
+ public static ListItem createListItem(ChainedProperties props) {
+ ListItem p = new ListItem();
+ createParagraph(p, props);
+ return p;
+ }
+
+ public Font getFont(ChainedProperties props) {
+ String face = props.getProperty("face");
+ if (face != null) {
+ StringTokenizer tok = new StringTokenizer(face, ",");
+ while (tok.hasMoreTokens()) {
+ face = tok.nextToken().trim();
+ if (FontFactory.isRegistered(face))
+ break;
+ }
+ }
+ int style = 0;
+ if (props.hasProperty("i"))
+ style |= Font.ITALIC;
+ if (props.hasProperty("b"))
+ style |= Font.BOLD;
+ if (props.hasProperty("u"))
+ style |= Font.UNDERLINE;
+ String value = props.getProperty("size");
+ float size = 12;
+ if (value != null)
+ size = Float.valueOf(value).floatValue();
+ Color color = decodeColor(props.getProperty("color"));
+ String encoding = props.getProperty("encoding");
+ if (encoding == null)
+ encoding = BaseFont.WINANSI;
+ FontFactoryImp ff = fontImp;
+ if (ff == null)
+ ff = FontFactory.getFontImp();
+ return ff.getFont(face, encoding, true, size, style, color);
+ }
+
+ public static Color decodeColor(String s) {
+ if (s == null)
+ return null;
+ s = s.toLowerCase().trim();
+ Color c = (Color)colorTable.get(s);
+ if (c != null)
+ return c;
+ try {
+ if (s.startsWith("#"))
+ return new Color(Integer.parseInt(s.substring(1), 16));
+ }
+ catch (Exception e) {
+ }
+ return null;
+ }
+
+ public FontFactoryImp getFontImp() {
+ return fontImp;
+ }
+
+ public void setFontImp(FontFactoryImp fontImp) {
+ this.fontImp = fontImp;
+ }
+
+ public static HashMap colorTable = new HashMap();
+ public static HashMap followTags = new HashMap();
+ static {
+ followTags.put("i", "i");
+ followTags.put("b", "b");
+ followTags.put("u", "u");
+ followTags.put("sub", "sub");
+ followTags.put("sup", "sup");
+ followTags.put("em", "i");
+ followTags.put("strong", "b");
+
+ colorTable.put("black", new Color(0x000000));
+ colorTable.put("green", new Color(0x008000));
+ colorTable.put("silver", new Color(0xC0C0C0));
+ colorTable.put("lime", new Color(0x00FF00));
+ colorTable.put("gray", new Color(0x808080));
+ colorTable.put("olive", new Color(0x808000));
+ colorTable.put("white", new Color(0xFFFFFF));
+ colorTable.put("yellow", new Color(0xFFFF00));
+ colorTable.put("maroon", new Color(0x800000));
+ colorTable.put("navy", new Color(0x000080));
+ colorTable.put("red", new Color(0xFF0000));
+ colorTable.put("blue", new Color(0x0000FF));
+ colorTable.put("purple", new Color(0x800080));
+ colorTable.put("teal", new Color(0x008080));
+ colorTable.put("fuchsia", new Color(0xFF00FF));
+ colorTable.put("aqua", new Color(0x00FFFF));
+ }
+}
diff --git a/src/main/java/com/lowagie/text/html/simpleparser/HTMLWorker.java b/src/main/java/com/lowagie/text/html/simpleparser/HTMLWorker.java
new file mode 100644
index 0000000..b28fe04
--- /dev/null
+++ b/src/main/java/com/lowagie/text/html/simpleparser/HTMLWorker.java
@@ -0,0 +1,623 @@
+/*
+ * Copyright 2004 Paulo Soares
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.html.simpleparser;
+
+import com.lowagie.text.*;
+import com.lowagie.text.pdf.*;
+import java.util.Stack;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.StringTokenizer;
+import java.io.IOException;
+import java.io.Reader;
+import java.io.File;
+
+public class HTMLWorker implements SimpleXMLDocHandler, DocListener {
+
+ protected ArrayList objectList;
+ protected DocListener document;
+ private Paragraph currentParagraph;
+ private ChainedProperties cprops = new ChainedProperties();
+ private Stack stack = new Stack();
+ private boolean pendingTR = false;
+ private boolean pendingTD = false;
+ private boolean pendingLI = false;
+ private StyleSheet style = new StyleSheet();
+ private boolean isPRE = false;
+ private Stack tableState = new Stack();
+ private boolean skipText = false;
+ private HashMap interfaceProps;
+ private FactoryProperties factoryProperties = new FactoryProperties();
+
+ /** Creates a new instance of HTMLWorker */
+ public HTMLWorker(DocListener document) {
+ this.document = document;
+ }
+
+ public void setStyleSheet(StyleSheet style) {
+ this.style = style;
+ }
+
+ public StyleSheet getStyleSheet() {
+ return style;
+ }
+
+ public void setInterfaceProps(HashMap interfaceProps) {
+ this.interfaceProps = interfaceProps;
+ FontFactoryImp ff = null;
+ if (interfaceProps != null)
+ ff = (FontFactoryImp)interfaceProps.get("font_factory");
+ factoryProperties.setFontImp(ff);
+ }
+
+ public HashMap getInterfaceProps() {
+ return interfaceProps;
+ }
+
+ public void parse(Reader reader) throws IOException {
+ SimpleXMLParser.parse(this, null, reader, true);
+ }
+
+ public static ArrayList parseToList(Reader reader, StyleSheet style) throws IOException {
+ return parseToList(reader, style, null);
+ }
+
+ public static ArrayList parseToList(Reader reader, StyleSheet style, HashMap interfaceProps) throws IOException {
+ HTMLWorker worker = new HTMLWorker(null);
+ if (style != null)
+ worker.style = style;
+ worker.document = worker;
+ worker.setInterfaceProps(interfaceProps);
+ worker.objectList = new ArrayList();
+ worker.parse(reader);
+ return worker.objectList;
+ }
+
+ public void endDocument() {
+ try {
+ for (int k = 0; k < stack.size(); ++k)
+ document.add((Element)stack.elementAt(k));
+ if (currentParagraph != null)
+ document.add(currentParagraph);
+ currentParagraph = null;
+ }
+ catch (Exception e) {
+ throw new ExceptionConverter(e);
+ }
+ }
+
+ public void startDocument() {
+ HashMap h = new HashMap();
+ style.applyStyle("body", h);
+ cprops.addToChain("body", h);
+ }
+
+ public void startElement(String tag, HashMap h) {
+ if (!tagsSupported.containsKey(tag))
+ return;
+ try {
+ style.applyStyle(tag, h);
+ String follow = (String)FactoryProperties.followTags.get(tag);
+ if (follow != null) {
+ HashMap prop = new HashMap();
+ prop.put(follow, null);
+ cprops.addToChain(follow, prop);
+ return;
+ }
+ if (tag.equals("a")) {
+ cprops.addToChain(tag, h);
+ if (currentParagraph == null)
+ currentParagraph = new Paragraph();
+ stack.push(currentParagraph);
+ currentParagraph = new Paragraph();
+ return;
+ }
+ if (tag.equals("br")) {
+ if (currentParagraph == null)
+ currentParagraph = new Paragraph();
+ currentParagraph.add(factoryProperties.createChunk("\n", cprops));
+ return;
+ }
+ if (tag.equals("font") || tag.equals("span")) {
+ cprops.addToChain(tag, h);
+ return;
+ }
+ if (tag.equals("img")) {
+ String src = (String)h.get("src");
+ if (src == null)
+ return;
+ cprops.addToChain(tag, h);
+ Image img = null;
+ if (interfaceProps != null) {
+ HashMap images = (HashMap)interfaceProps.get("img_static");
+ if (images != null) {
+ Image tim = (Image)images.get(src);
+ if (tim != null)
+ img = Image.getInstance(tim);
+ } else {
+ if (!src.startsWith("http")) { // relative src references only
+ String baseurl = (String)interfaceProps.get("img_baseurl");
+ if (baseurl != null) {
+ src = baseurl+src;
+ img = Image.getInstance(src);
+ }
+ }
+ }
+ }
+ if (img == null) {
+ if (!src.startsWith("http")) {
+ String path = cprops.getProperty("image_path");
+ if (path == null)
+ path = "";
+ src = new File(path, src).getPath();
+ }
+ img = Image.getInstance(src);
+ }
+ String align = (String)h.get("align");
+ String width = (String)h.get("width");
+ String height = (String)h.get("height");
+ String before = cprops.getProperty("before");
+ String after = cprops.getProperty("after");
+ if (before != null)
+ img.setSpacingBefore(Float.valueOf(before).floatValue());
+ if (after != null)
+ img.setSpacingAfter(Float.valueOf(after).floatValue());
+ float wp = lengthParse(width, (int)img.width());
+ float lp = lengthParse(height, (int)img.height());
+ if (wp > 0 && lp > 0)
+ img.scalePercent(wp > lp ? lp : wp);
+ else if (wp > 0)
+ img.scalePercent(wp);
+ else if (lp > 0)
+ img.scalePercent(lp);
+ img.setWidthPercentage(0);
+ if (align != null) {
+ endElement("p");
+ int ralign = Image.MIDDLE;
+ if (align.equalsIgnoreCase("left"))
+ ralign = Image.LEFT;
+ else if (align.equalsIgnoreCase("right"))
+ ralign = Image.RIGHT;
+ img.setAlignment(ralign);
+ Img i = null;
+ boolean skip = false;
+ if (interfaceProps != null) {
+ i = (Img)interfaceProps.get("img_interface");
+ if (i != null)
+ skip = i.process(img, h, cprops, document);
+ }
+ if (!skip)
+ document.add(img);
+ cprops.removeChain(tag);
+ }
+ else {
+ cprops.removeChain(tag);
+ if (currentParagraph == null)
+ currentParagraph = FactoryProperties.createParagraph(cprops);
+ currentParagraph.add(new Chunk(img, 0, 0));
+ }
+ return;
+ }
+ endElement("p");
+ if (tag.equals("h1") || tag.equals("h2") || tag.equals("h3") || tag.equals("h4") || tag.equals("h5") || tag.equals("h6")) {
+ if (!h.containsKey("size"))
+ h.put("size", tag.substring(1));
+ cprops.addToChain(tag, h);
+ return;
+ }
+ if (tag.equals("ul")) {
+ if (pendingLI)
+ endElement("li");
+ skipText = true;
+ cprops.addToChain(tag, h);
+ com.lowagie.text.List list = new com.lowagie.text.List(false, 10);
+ list.setListSymbol("\u2022");
+ stack.push(list);
+ return;
+ }
+ if (tag.equals("ol")) {
+ if (pendingLI)
+ endElement("li");
+ skipText = true;
+ cprops.addToChain(tag, h);
+ com.lowagie.text.List list = new com.lowagie.text.List(true, 10);
+ stack.push(list);
+ return;
+ }
+ if (tag.equals("li")) {
+ if (pendingLI)
+ endElement("li");
+ skipText = false;
+ pendingLI = true;
+ cprops.addToChain(tag, h);
+ stack.push(FactoryProperties.createListItem(cprops));
+ return;
+ }
+ if (tag.equals("div") || tag.equals("body")) {
+ cprops.addToChain(tag, h);
+ return;
+ }
+ if (tag.equals("pre")) {
+ if (!h.containsKey("face")) {
+ h.put("face", "Courier");
+ }
+ cprops.addToChain(tag, h);
+ isPRE = true;
+ return;
+ }
+ if (tag.equals("p")) {
+ cprops.addToChain(tag, h);
+ currentParagraph = FactoryProperties.createParagraph(h);
+ return;
+ }
+ if (tag.equals("tr")) {
+ if (pendingTR)
+ endElement("tr");
+ skipText = true;
+ pendingTR = true;
+ cprops.addToChain("tr", h);
+ return;
+ }
+ if (tag.equals("td") || tag.equals("th")) {
+ if (pendingTD)
+ endElement(tag);
+ skipText = false;
+ pendingTD = true;
+ cprops.addToChain("td", h);
+ stack.push(new IncCell(tag, cprops));
+ return;
+ }
+ if (tag.equals("table")) {
+ cprops.addToChain("table", h);
+ IncTable table = new IncTable(h);
+ stack.push(table);
+ tableState.push(new boolean[]{pendingTR, pendingTD});
+ pendingTR = pendingTD = false;
+ skipText = true;
+ return;
+ }
+ }
+ catch (Exception e) {
+ throw new ExceptionConverter(e);
+ }
+ }
+
+ public void endElement(String tag) {
+ if (!tagsSupported.containsKey(tag))
+ return;
+ try {
+ String follow = (String)FactoryProperties.followTags.get(tag);
+ if (follow != null) {
+ cprops.removeChain(follow);
+ return;
+ }
+ if (tag.equals("font") || tag.equals("span")) {
+ cprops.removeChain(tag);
+ return;
+ }
+ if (tag.equals("a")) {
+ if (currentParagraph == null)
+ currentParagraph = new Paragraph();
+ ALink i = null;
+ boolean skip = false;
+ if (interfaceProps != null) {
+ i = (ALink)interfaceProps.get("alink_interface");
+ if (i != null)
+ skip = i.process(currentParagraph, cprops);
+ }
+ if (!skip) {
+ String href = cprops.getProperty("href");
+ if (href != null) {
+ ArrayList chunks = currentParagraph.getChunks();
+ for (int k = 0; k < chunks.size(); ++k) {
+ Chunk ck = (Chunk)chunks.get(k);
+ ck.setAnchor(href);
+ }
+ }
+ }
+ Paragraph tmp = (Paragraph)stack.pop();
+ Phrase tmp2 = new Phrase();
+ tmp2.add(currentParagraph);
+ tmp.add(tmp2);
+ currentParagraph = tmp;
+ cprops.removeChain("a");
+ return;
+ }
+ if (tag.equals("br")) {
+ return;
+ }
+ if (currentParagraph != null) {
+ if (stack.empty())
+ document.add(currentParagraph);
+ else {
+ Object obj = stack.pop();
+ if (obj instanceof TextElementArray) {
+ TextElementArray current = (TextElementArray)obj;
+ current.add(currentParagraph);
+ }
+ stack.push(obj);
+ }
+ }
+ currentParagraph = null;
+ if (tag.equals("ul") || tag.equals("ol")) {
+ if (pendingLI)
+ endElement("li");
+ skipText = false;
+ cprops.removeChain(tag);
+ if (stack.empty())
+ return;
+ Object obj = stack.pop();
+ if (!(obj instanceof com.lowagie.text.List)) {
+ stack.push(obj);
+ return;
+ }
+ if (stack.empty())
+ document.add((Element)obj);
+ else
+ ((TextElementArray)stack.peek()).add(obj);
+ return;
+ }
+ if (tag.equals("li")) {
+ pendingLI = false;
+ skipText = true;
+ cprops.removeChain(tag);
+ if (stack.empty())
+ return;
+ Object obj = stack.pop();
+ if (!(obj instanceof ListItem)) {
+ stack.push(obj);
+ return;
+ }
+ if (stack.empty()) {
+ document.add((Element)obj);
+ return;
+ }
+ Object list = stack.pop();
+ if (!(list instanceof com.lowagie.text.List)) {
+ stack.push(list);
+ return;
+ }
+ ListItem item = (ListItem)obj;
+ ((com.lowagie.text.List)list).add(item);
+ ArrayList cks = item.getChunks();
+ if (cks.size() > 0)
+ item.listSymbol().setFont(((Chunk)cks.get(0)).font());
+ stack.push(list);
+ return;
+ }
+ if (tag.equals("div") || tag.equals("body")) {
+ cprops.removeChain(tag);
+ return;
+ }
+ if (tag.equals("pre")) {
+ cprops.removeChain(tag);
+ isPRE = false;
+ return;
+ }
+ if (tag.equals("p")) {
+ cprops.removeChain(tag);
+ return;
+ }
+ if (tag.equals("h1") || tag.equals("h2") || tag.equals("h3") || tag.equals("h4") || tag.equals("h5") || tag.equals("h6")) {
+ cprops.removeChain(tag);
+ return;
+ }
+ if (tag.equals("table")) {
+ if (pendingTR)
+ endElement("tr");
+ cprops.removeChain("table");
+ IncTable table = (IncTable) stack.pop();
+ PdfPTable tb = table.buildTable();
+ tb.setSplitRows(true);
+ if (stack.empty())
+ document.add(tb);
+ else
+ ((TextElementArray)stack.peek()).add(tb);
+ boolean state[] = (boolean[])tableState.pop();
+ pendingTR = state[0];
+ pendingTD = state[1];
+ skipText = false;
+ return;
+ }
+ if (tag.equals("tr")) {
+ if (pendingTD)
+ endElement("td");
+ pendingTR = false;
+ cprops.removeChain("tr");
+ ArrayList cells = new ArrayList();
+ IncTable table = null;
+ while (true) {
+ Object obj = stack.pop();
+ if (obj instanceof IncCell) {
+ cells.add(((IncCell)obj).getCell());
+ }
+ if (obj instanceof IncTable) {
+ table = (IncTable)obj;
+ break;
+ }
+ }
+ table.addCols(cells);
+ table.endRow();
+ stack.push(table);
+ skipText = true;
+ return;
+ }
+ if (tag.equals("td") || tag.equals("th")) {
+ pendingTD = false;
+ cprops.removeChain("td");
+ skipText = true;
+ return;
+ }
+ }
+ catch (Exception e) {
+ throw new ExceptionConverter(e);
+ }
+ }
+
+ public void text(String str) {
+ if (skipText)
+ return;
+ String content = str;
+ if (isPRE) {
+ if (currentParagraph == null)
+ currentParagraph = new Paragraph();
+ currentParagraph.add(factoryProperties.createChunk(content, cprops));
+ return;
+ }
+ if (content.trim().length() == 0 && content.indexOf(' ') < 0) {
+ return;
+ }
+
+ StringBuffer buf = new StringBuffer();
+ int len = content.length();
+ char character;
+ boolean newline = false;
+ for (int i = 0; i < len; i++) {
+ switch(character = content.charAt(i)) {
+ case ' ':
+ if (!newline) {
+ buf.append(character);
+ }
+ break;
+ case '\n':
+ if (i > 0) {
+ newline = true;
+ buf.append(' ');
+ }
+ break;
+ case '\r':
+ break;
+ case '\t':
+ break;
+ default:
+ newline = false;
+ buf.append(character);
+ }
+ }
+ if (currentParagraph == null)
+ currentParagraph = FactoryProperties.createParagraph(cprops);
+ currentParagraph.add(factoryProperties.createChunk(buf.toString(), cprops));
+ }
+
+ public boolean add(Element element) throws DocumentException {
+ objectList.add(element);
+ return true;
+ }
+
+ public boolean add(Watermark watermark) {
+ return true;
+ }
+
+ public void clearTextWrap() throws DocumentException {
+ }
+
+ public void close() {
+ }
+
+ public boolean newPage() throws DocumentException {
+ return true;
+ }
+
+ public void open() {
+ }
+
+ public void removeWatermark() {
+ }
+
+ public void resetFooter() {
+ }
+
+ public void resetHeader() {
+ }
+
+ public void resetPageCount() {
+ }
+
+ public void setFooter(HeaderFooter footer) {
+ }
+
+ public void setHeader(HeaderFooter header) {
+ }
+
+ public boolean setMarginMirroring(boolean marginMirroring) {
+ return true;
+ }
+
+ public boolean setMargins(float marginLeft, float marginRight, float marginTop, float marginBottom) {
+ return true;
+ }
+
+ public void setPageCount(int pageN) {
+ }
+
+ public boolean setPageSize(Rectangle pageSize) {
+ return true;
+ }
+
+ public static final String tagsSupportedString = "ol ul li a pre font span br p div body table td th tr i b u sub sup em strong"
+ + " h1 h2 h3 h4 h5 h6 img";
+
+ public static final HashMap tagsSupported = new HashMap();
+
+ static {
+ StringTokenizer tok = new StringTokenizer(tagsSupportedString);
+ while (tok.hasMoreTokens())
+ tagsSupported.put(tok.nextToken(), null);
+ }
+
+ private static float lengthParse(String txt, int c) {
+ if (txt == null)
+ return -1;
+ if (txt.endsWith("%")) {
+ float vf = Float.valueOf(txt.substring(0, txt.length() - 1)).floatValue();
+ return vf;
+ }
+ int v = Integer.parseInt(txt);
+ return (float)v / c * 100f;
+ }
+}
diff --git a/src/main/java/com/lowagie/text/html/simpleparser/Img.java b/src/main/java/com/lowagie/text/html/simpleparser/Img.java
new file mode 100644
index 0000000..a7c066c
--- /dev/null
+++ b/src/main/java/com/lowagie/text/html/simpleparser/Img.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2005 Paulo Soares
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.html.simpleparser;
+
+import com.lowagie.text.Image;
+import com.lowagie.text.DocListener;
+import java.util.HashMap;
+
+/**
+ *
+ * @author psoares
+ */
+public interface Img {
+ boolean process(Image img, HashMap h, ChainedProperties cprops, DocListener doc);
+}
diff --git a/src/main/java/com/lowagie/text/html/simpleparser/IncCell.java b/src/main/java/com/lowagie/text/html/simpleparser/IncCell.java
new file mode 100644
index 0000000..3f25e0c
--- /dev/null
+++ b/src/main/java/com/lowagie/text/html/simpleparser/IncCell.java
@@ -0,0 +1,124 @@
+/*
+ * Copyright 2004 Paulo Soares
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.html.simpleparser;
+
+import com.lowagie.text.*;
+import com.lowagie.text.pdf.*;
+import java.util.ArrayList;
+/**
+ *
+ * @author psoares
+ */
+public class IncCell implements TextElementArray {
+
+ private ArrayList chunks = new ArrayList();
+ private PdfPCell cell;
+
+ /** Creates a new instance of IncCell */
+ public IncCell(String tag, ChainedProperties props) {
+ cell = new PdfPCell((Phrase)null);
+ String value = props.getProperty("colspan");
+ if (value != null)
+ cell.setColspan(Integer.parseInt(value));
+ value = props.getProperty("align");
+ if (tag.equals("th"))
+ cell.setHorizontalAlignment(Element.ALIGN_CENTER);
+ if (value != null) {
+ if ("center".equalsIgnoreCase(value))
+ cell.setHorizontalAlignment(Element.ALIGN_CENTER);
+ else if ("right".equalsIgnoreCase(value))
+ cell.setHorizontalAlignment(Element.ALIGN_RIGHT);
+ else if ("left".equalsIgnoreCase(value))
+ cell.setHorizontalAlignment(Element.ALIGN_LEFT);
+ else if ("justify".equalsIgnoreCase(value))
+ cell.setHorizontalAlignment(Element.ALIGN_JUSTIFIED);
+ }
+ value = props.getProperty("valign");
+ cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
+ if (value != null) {
+ if ("top".equalsIgnoreCase(value))
+ cell.setVerticalAlignment(Element.ALIGN_TOP);
+ else if ("bottom".equalsIgnoreCase(value))
+ cell.setVerticalAlignment(Element.ALIGN_BOTTOM);
+ }
+ value = props.getProperty("border");
+ float border = 0;
+ if (value != null)
+ border = Float.valueOf(value).floatValue();
+ cell.setBorderWidth(border);
+ value = props.getProperty("cellpadding");
+ if (value != null)
+ cell.setPadding(Float.valueOf(value).floatValue());
+ cell.setUseDescender(true);
+ value = props.getProperty("bgcolor");
+ cell.setBackgroundColor(FactoryProperties.decodeColor(value));
+ }
+
+ public boolean add(Object o) {
+ if (!(o instanceof Element))
+ return false;
+ cell.addElement((Element)o);
+ return true;
+ }
+
+ public ArrayList getChunks() {
+ return chunks;
+ }
+
+ public boolean process(ElementListener listener) {
+ return true;
+ }
+
+ public int type() {
+ return 0;
+ }
+
+ public PdfPCell getCell() {
+ return cell;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/html/simpleparser/IncTable.java b/src/main/java/com/lowagie/text/html/simpleparser/IncTable.java
new file mode 100644
index 0000000..92b569b
--- /dev/null
+++ b/src/main/java/com/lowagie/text/html/simpleparser/IncTable.java
@@ -0,0 +1,121 @@
+/*
+ * Copyright 2004 Paulo Soares
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.html.simpleparser;
+
+import com.lowagie.text.pdf.*;
+import java.util.HashMap;
+import java.util.ArrayList;
+import java.util.Collections;
+
+/**
+ *
+ * @author psoares
+ */
+public class IncTable {
+ private HashMap props = new HashMap();
+ private ArrayList rows = new ArrayList();
+ private ArrayList cols;
+ /** Creates a new instance of IncTable */
+ public IncTable(HashMap props) {
+ this.props.putAll(props);
+ }
+
+ public void addCol(PdfPCell cell) {
+ if (cols == null)
+ cols = new ArrayList();
+ cols.add(cell);
+ }
+
+ public void addCols(ArrayList ncols) {
+ if (cols == null)
+ cols = new ArrayList(ncols);
+ else
+ cols.addAll(ncols);
+ }
+
+ public void endRow() {
+ if (cols != null) {
+ Collections.reverse(cols);
+ rows.add(cols);
+ cols = null;
+ }
+ }
+
+ public ArrayList getRows() {
+ return rows;
+ }
+
+ public PdfPTable buildTable() {
+ if (rows.size() == 0)
+ return new PdfPTable(1);
+ int ncol = 0;
+ ArrayList c0 = (ArrayList)rows.get(0);
+ for (int k = 0; k < c0.size(); ++k) {
+ ncol += ((PdfPCell)c0.get(k)).getColspan();
+ }
+ PdfPTable table = new PdfPTable(ncol);
+ String width = (String)props.get("width");
+ if (width == null)
+ table.setWidthPercentage(100);
+ else {
+ if (width.endsWith("%"))
+ table.setWidthPercentage(Float.valueOf(width.substring(0, width.length() - 1)).floatValue());
+ else {
+ table.setTotalWidth(Float.valueOf(width).floatValue());
+ table.setLockedWidth(true);
+ }
+ }
+ for (int row = 0; row < rows.size(); ++row) {
+ ArrayList col = (ArrayList)rows.get(row);
+ for (int k = 0; k < col.size(); ++k) {
+ table.addCell((PdfPCell)col.get(k));
+ }
+ }
+ return table;
+ }
+}
diff --git a/src/main/java/com/lowagie/text/html/simpleparser/StyleSheet.java b/src/main/java/com/lowagie/text/html/simpleparser/StyleSheet.java
new file mode 100644
index 0000000..a659715
--- /dev/null
+++ b/src/main/java/com/lowagie/text/html/simpleparser/StyleSheet.java
@@ -0,0 +1,112 @@
+/*
+ * Copyright 2004 Paulo Soares
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.html.simpleparser;
+
+import java.util.HashMap;
+
+public class StyleSheet {
+
+ public HashMap classMap = new HashMap();
+ public HashMap tagMap = new HashMap();
+
+ /** Creates a new instance of StyleSheet */
+ public StyleSheet() {
+ }
+
+ public void applyStyle(String tag, HashMap props) {
+ HashMap map = (HashMap)tagMap.get(tag.toLowerCase());
+ if (map != null) {
+ HashMap temp = new HashMap(map);
+ temp.putAll(props);
+ props.putAll(temp);
+ }
+ String cm = (String)props.get("class");
+ if (cm == null)
+ return;
+ map = (HashMap)classMap.get(cm.toLowerCase());
+ if (map == null)
+ return;
+ props.remove("class");
+ HashMap temp = new HashMap(map);
+ temp.putAll(props);
+ props.putAll(temp);
+ }
+
+ private void applyMap(HashMap map, HashMap props) {
+
+ }
+
+ public void loadStyle(String style, HashMap props) {
+ classMap.put(style.toLowerCase(), props);
+ }
+
+ public void loadStyle(String style, String key, String value) {
+ style = style.toLowerCase();
+ HashMap props = (HashMap)classMap.get(style);
+ if (props == null) {
+ props = new HashMap();
+ classMap.put(style, props);
+ }
+ props.put(key, value);
+ }
+
+ public void loadTagStyle(String tag, HashMap props) {
+ tagMap.put(tag.toLowerCase(), props);
+ }
+
+ public void loadTagStyle(String tag, String key, String value) {
+ tag = tag.toLowerCase();
+ HashMap props = (HashMap)tagMap.get(tag);
+ if (props == null) {
+ props = new HashMap();
+ tagMap.put(tag, props);
+ }
+ props.put(key, value);
+ }
+
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/markup/MarkupParser.java b/src/main/java/com/lowagie/text/markup/MarkupParser.java
new file mode 100644
index 0000000..d2446d3
--- /dev/null
+++ b/src/main/java/com/lowagie/text/markup/MarkupParser.java
@@ -0,0 +1,736 @@
+/*
+ * $Id: MarkupParser.java,v 1.56 2005/07/07 10:04:49 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2001, 2002 by Bruno Lowagie.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.markup;
+
+import java.awt.Color;
+import java.io.BufferedReader;
+import java.io.FileReader;
+import java.util.HashMap;
+import java.util.Properties;
+import java.util.StringTokenizer;
+
+import com.lowagie.text.Element;
+import com.lowagie.text.ExceptionConverter;
+import com.lowagie.text.Font;
+import com.lowagie.text.FontFactory;
+import com.lowagie.text.ListItem;
+import com.lowagie.text.Paragraph;
+import com.lowagie.text.Phrase;
+import com.lowagie.text.Rectangle;
+import com.lowagie.text.SimpleCell;
+import com.lowagie.text.SimpleTable;
+
+/**
+ * This class is a HashMap that contains selectors (String) and styles (a
+ * Properties object). Given a tag and its attributes (id/class), this class can
+ * return an iText object with the according style.
+ *
+ * @author blowagie
+ */
+public class MarkupParser extends HashMap {
+ /**
+ * HashMap with styles for each known combination of tag/id/class. The key
+ * is a String-combination, the value a Properties object.
+ */
+ protected HashMap stylecache = new HashMap();
+
+ /**
+ * HashMap with fonts for each known combination of tag/id/class. The key is
+ * the same String-combination used for the stylecache.
+ */
+ protected HashMap fontcache = new HashMap();
+
+ // processing CSS
+
+ /**
+ * Creates new MarkupParser
+ *
+ * @param file
+ * the path to a CSS file.
+ */
+ public MarkupParser(String file) {
+ super();
+ try {
+ FileReader reader = new FileReader(file);
+ BufferedReader br = new BufferedReader(reader);
+ StringBuffer buf = new StringBuffer();
+ String line;
+ while ((line = br.readLine()) != null) {
+ buf.append(line.trim());
+ }
+ String string = buf.toString();
+ string = removeComment(string, "/*", "*/");
+ StringTokenizer tokenizer = new StringTokenizer(string, "}");
+ String tmp;
+ int pos;
+ String selector;
+ String attributes;
+ while (tokenizer.hasMoreTokens()) {
+ tmp = tokenizer.nextToken();
+ pos = tmp.indexOf("{");
+ if (pos > 0) {
+ selector = tmp.substring(0, pos).trim();
+ attributes = tmp.substring(pos + 1).trim();
+ if (attributes.endsWith("}"))
+ attributes = attributes.substring(0, attributes
+ .length() - 1);
+ put(selector, parseAttributes(attributes));
+ }
+ }
+ } catch (Exception e) {
+ throw new ExceptionConverter(e);
+ }
+ }
+
+ /**
+ * Removes the comments sections of a String.
+ *
+ * @param string
+ * the original String
+ * @param startComment
+ * the String that marks the start of a Comment section
+ * @param endComment
+ * the String that marks the end of a Comment section.
+ * @return the String stripped of its comment section
+ */
+ public static String removeComment(String string, String startComment,
+ String endComment) {
+ StringBuffer result = new StringBuffer();
+ int pos = 0;
+ int end = endComment.length();
+ int start = string.indexOf(startComment, pos);
+ while (start > -1) {
+ result.append(string.substring(pos, start));
+ pos = string.indexOf(endComment, start) + end;
+ start = string.indexOf(startComment, pos);
+ }
+ result.append(string.substring(pos));
+ return result.toString();
+ }
+
+ /**
+ * This method parses a String with attributes and returns a Properties
+ * object.
+ *
+ * @param string
+ * a String of this form: 'key1="value1"; key2="value2";...
+ * keyN="valueN" '
+ * @return a Properties object
+ */
+ public static Properties parseAttributes(String string) {
+ Properties result = new Properties();
+ if (string == null)
+ return result;
+ StringTokenizer keyValuePairs = new StringTokenizer(string, ";");
+ StringTokenizer keyValuePair;
+ String key;
+ String value;
+ while (keyValuePairs.hasMoreTokens()) {
+ keyValuePair = new StringTokenizer(keyValuePairs.nextToken(), ":");
+ if (keyValuePair.hasMoreTokens())
+ key = keyValuePair.nextToken().trim();
+ else
+ continue;
+ if (keyValuePair.hasMoreTokens())
+ value = keyValuePair.nextToken().trim();
+ else
+ continue;
+ if (value.startsWith("\""))
+ value = value.substring(1);
+ if (value.endsWith("\""))
+ value = value.substring(0, value.length() - 1);
+ result.setProperty(key, value);
+ }
+ return result;
+ }
+
+ // reading attributevalues
+
+ /**
+ * Parses a length.
+ *
+ * @param string
+ * a length in the form of an optional + or -, followed by a
+ * number and a unit.
+ * @return a float
+ */
+
+ public static float parseLength(String string) {
+ int pos = 0;
+ int length = string.length();
+ boolean ok = true;
+ while (ok && pos < length) {
+ switch (string.charAt(pos)) {
+ case '+':
+ case '-':
+ case '0':
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ case '6':
+ case '7':
+ case '8':
+ case '9':
+ case '.':
+ pos++;
+ break;
+ default:
+ ok = false;
+ }
+ }
+ if (pos == 0)
+ return 0f;
+ if (pos == length)
+ return Float.valueOf(string + "f").floatValue();
+ float f = Float.valueOf(string.substring(0, pos) + "f").floatValue();
+ string = string.substring(pos);
+ // inches
+ if (string.startsWith("in")) {
+ return f * 72f;
+ }
+ // centimeters
+ if (string.startsWith("cm")) {
+ return (f / 2.54f) * 72f;
+ }
+ // millimeters
+ if (string.startsWith("mm")) {
+ return (f / 25.4f) * 72f;
+ }
+ // picas
+ if (string.startsWith("pc")) {
+ return f * 12f;
+ }
+ // default: we assume the length was measured in points
+ return f;
+ }
+
+ /**
+ * Converts a <CODE>Color</CODE> into a HTML representation of this <CODE>
+ * Color</CODE>.
+ *
+ * @param color
+ * the <CODE>Color</CODE> that has to be converted.
+ * @return the HTML representation of this <COLOR>Color </COLOR>
+ */
+
+ public static Color decodeColor(String color) {
+ int red = 0;
+ int green = 0;
+ int blue = 0;
+ try {
+ red = Integer.parseInt(color.substring(1, 3), 16);
+ green = Integer.parseInt(color.substring(3, 5), 16);
+ blue = Integer.parseInt(color.substring(5), 16);
+ } catch (Exception sioobe) {
+ // empty on purpose
+ }
+ return new Color(red, green, blue);
+ }
+
+ // helper methods
+
+ /**
+ * Generates a key for an tag/id/class combination and adds the style
+ * attributes to the stylecache.
+ *
+ * @param attributes
+ * a Properties object with the tagname and the attributes of the
+ * tag.
+ * @return a key
+ */
+ private String getKey(Properties attributes) {
+ String tag = attributes.getProperty(MarkupTags.ITEXT_TAG);
+ String id = attributes.getProperty(MarkupTags.HTML_ATTR_CSS_ID);
+ String cl = attributes.getProperty(MarkupTags.HTML_ATTR_CSS_CLASS);
+ if (id == null) {
+ id = "";
+ } else {
+ id = "#" + id;
+ }
+ if (cl == null) {
+ cl = "";
+ } else {
+ cl = "." + cl;
+ }
+ String key = tag + id + cl;
+ if (!stylecache.containsKey(key) && key.length() > 0) {
+ Properties props = new Properties();
+ Properties tagprops = (Properties) get(tag);
+ Properties idprops = (Properties) get(id);
+ Properties clprops = (Properties) get(cl);
+ Properties tagidprops = (Properties) get(tag + id);
+ Properties tagclprops = (Properties) get(tag + cl);
+ if (tagprops != null)
+ props.putAll(tagprops);
+ if (idprops != null)
+ props.putAll(idprops);
+ if (clprops != null)
+ props.putAll(clprops);
+ if (tagidprops != null)
+ props.putAll(tagidprops);
+ if (tagclprops != null)
+ props.putAll(tagclprops);
+ stylecache.put(key, props);
+ }
+ return key;
+ }
+
+ // getting the objects based on the tag and its attributes
+
+ /**
+ * Returns pagebreak information.
+ *
+ * @param attributes
+ * @return true if a page break is needed before the tag
+ */
+ public boolean getPageBreakBefore(Properties attributes) {
+ String key = getKey(attributes);
+ Properties styleattributes = (Properties) stylecache.get(key);
+ if (styleattributes != null
+ && MarkupTags.CSS_VALUE_ALWAYS.equals(styleattributes
+ .getProperty(MarkupTags.CSS_KEY_PAGE_BREAK_BEFORE))) {
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Returns pagebreak information.
+ *
+ * @param attributes
+ * @return true if a page break is needed after the tag
+ */
+ public boolean getPageBreakAfter(Properties attributes) {
+ String key = getKey(attributes);
+ Properties styleattributes = (Properties) stylecache.get(key);
+ if (styleattributes != null
+ && MarkupTags.CSS_VALUE_ALWAYS.equals(styleattributes
+ .getProperty(MarkupTags.CSS_KEY_PAGE_BREAK_AFTER))) {
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Returns an object based on a tag and its attributes.
+ *
+ * @param attributes
+ * a Properties object with the tagname and the attributes of the
+ * tag.
+ * @return an iText object
+ */
+ public Element getObject(Properties attributes) {
+ String key = getKey(attributes);
+ Properties styleattributes = (Properties) stylecache.get(key);
+ if (styleattributes != null
+ && MarkupTags.CSS_VALUE_HIDDEN.equals(styleattributes
+ .get(MarkupTags.CSS_KEY_VISIBILITY))) {
+ return null;
+ }
+ String display = styleattributes
+ .getProperty(MarkupTags.CSS_KEY_DISPLAY);
+ Element element = null;
+ if (MarkupTags.CSS_VALUE_INLINE.equals(display)) {
+ element = retrievePhrase(getFont(attributes), styleattributes);
+ } else if (MarkupTags.CSS_VALUE_BLOCK.equals(display)) {
+ element = retrieveParagraph(getFont(attributes), styleattributes);
+ } else if (MarkupTags.CSS_VALUE_LISTITEM.equals(display)) {
+ element = retrieveListItem(getFont(attributes), styleattributes);
+ } else if (MarkupTags.CSS_VALUE_TABLECELL.equals(display)) {
+ element = retrieveTableCell(attributes, styleattributes);
+ } else if (MarkupTags.CSS_VALUE_TABLEROW.equals(display)) {
+ element = retrieveTableRow(attributes, styleattributes);
+ } else if (MarkupTags.CSS_VALUE_TABLE.equals(display)) {
+ element = retrieveTable(attributes, styleattributes);
+ }
+ return element;
+ }
+
+ /**
+ * Returns a font based on the ID and CLASS attributes of a tag.
+ *
+ * @param attributes
+ * a Properties object with the tagname and the attributes of the
+ * tag.
+ * @return an iText Font;
+ */
+ public Font getFont(Properties attributes) {
+ String key = getKey(attributes);
+ Font f = (Font) fontcache.get(key);
+ if (f != null) {
+ return f;
+ } else {
+ Properties styleattributes = (Properties) stylecache.get(key);
+ f = retrieveFont(styleattributes);
+ fontcache.put(key, f);
+ }
+ return f;
+ }
+
+ /**
+ * Returns a rectangle based on the width and height attributes of a tag,
+ * can be overridden by the ID and CLASS attributes.
+ *
+ * @param attrs
+ * the attributes that came with the tag
+ * @return an iText Rectangle object
+ */
+ public Rectangle getRectangle(Properties attrs) {
+ String width = null;
+ String height = null;
+ String key = getKey(attrs);
+ Properties styleattributes = (Properties) stylecache.get(key);
+ if (styleattributes != null) {
+ width = styleattributes.getProperty(MarkupTags.HTML_ATTR_WIDTH);
+ height = styleattributes.getProperty(MarkupTags.HTML_ATTR_HEIGHT);
+ }
+ if (width == null)
+ width = attrs.getProperty(MarkupTags.HTML_ATTR_WIDTH);
+ if (height == null)
+ height = attrs.getProperty(MarkupTags.HTML_ATTR_HEIGHT);
+ if (width == null || height == null)
+ return null;
+ return new Rectangle(parseLength(width), parseLength(height));
+ }
+
+ // retrieving objects based on the styleAttributes
+
+ /**
+ * Retrieves a Phrase based on some style attributes.
+ *
+ * @param font
+ * @param styleattributes
+ * a Properties object containing keys and values
+ * @return an iText Phrase object
+ */
+ public Element retrievePhrase(Font font, Properties styleattributes) {
+ Phrase p = new Phrase("", font);
+ if (styleattributes == null)
+ return p;
+ String leading = styleattributes
+ .getProperty(MarkupTags.CSS_KEY_LINEHEIGHT);
+ if (leading != null) {
+ if (leading.endsWith("%")) {
+ p.setLeading(p.font().size() * (parseLength(leading) / 100f));
+ } else {
+ p.setLeading(parseLength(leading));
+ }
+ }
+ return p;
+ }
+
+ /**
+ * Retrieves a Paragraph based on some style attributes.
+ *
+ * @param font
+ * @param styleattributes
+ * a Properties object containing keys and values
+ * @return an iText Paragraph object
+ */
+ public Element retrieveParagraph(Font font, Properties styleattributes) {
+ Paragraph p = new Paragraph((Phrase) retrievePhrase(font,
+ styleattributes));
+ if (styleattributes == null)
+ return p;
+ String margin = styleattributes.getProperty(MarkupTags.CSS_KEY_MARGIN);
+ float f;
+ if (margin != null) {
+ f = parseLength(margin);
+ p.setIndentationLeft(f);
+ p.setIndentationRight(f);
+ p.setSpacingBefore(f);
+ p.setSpacingAfter(f);
+ }
+ margin = styleattributes.getProperty(MarkupTags.CSS_KEY_MARGINLEFT);
+ if (margin != null) {
+ f = parseLength(margin);
+ p.setIndentationLeft(f);
+ }
+ margin = styleattributes.getProperty(MarkupTags.CSS_KEY_MARGINRIGHT);
+ if (margin != null) {
+ f = parseLength(margin);
+ p.setIndentationRight(f);
+ }
+ margin = styleattributes.getProperty(MarkupTags.CSS_KEY_MARGINTOP);
+ if (margin != null) {
+ f = parseLength(margin);
+ p.setSpacingBefore(f);
+ }
+ margin = styleattributes.getProperty(MarkupTags.CSS_KEY_MARGINBOTTOM);
+ if (margin != null) {
+ f = parseLength(margin);
+ p.setSpacingAfter(f);
+ }
+ String align = styleattributes
+ .getProperty(MarkupTags.CSS_KEY_TEXTALIGN);
+ if (MarkupTags.CSS_VALUE_TEXTALIGNLEFT.equals(align)) {
+ p.setAlignment(Element.ALIGN_LEFT);
+ } else if (MarkupTags.CSS_VALUE_TEXTALIGNRIGHT.equals(align)) {
+ p.setAlignment(Element.ALIGN_RIGHT);
+ } else if (MarkupTags.CSS_VALUE_TEXTALIGNCENTER.equals(align)) {
+ p.setAlignment(Element.ALIGN_CENTER);
+ } else if (MarkupTags.CSS_VALUE_TEXTALIGNJUSTIFY.equals(align)) {
+ p.setAlignment(Element.ALIGN_JUSTIFIED);
+ }
+ return p;
+ }
+
+ /**
+ * Gets a table based on the styleattributes.
+ *
+ * @param attributes
+ * @param styleattributes
+ * @return an iText Table
+ */
+ private Element retrieveTable(Properties attributes,
+ Properties styleattributes) {
+ SimpleTable table = new SimpleTable();
+ applyBordersColors(table, attributes, styleattributes);
+ return table;
+ }
+
+ /**
+ * Returns a Cell based on the styleattributes.
+ *
+ * @param attributes
+ * @param styleattributes
+ * @return an iText Cell
+ */
+ private Element retrieveTableRow(Properties attributes,
+ Properties styleattributes) {
+ SimpleCell row = new SimpleCell(SimpleCell.ROW);
+ applyBordersColors(row, attributes, styleattributes);
+ String width = null;
+ if (attributes != null)
+ width = attributes.getProperty(MarkupTags.HTML_ATTR_WIDTH);
+ if (width == null)
+ width = styleattributes.getProperty(MarkupTags.HTML_ATTR_WIDTH);
+ if (width != null) {
+ if (width.endsWith("%")) {
+ row.setWidthpercentage(parseLength(width));
+ } else {
+ row.setWidth(parseLength(width));
+ }
+ }
+ String margin = styleattributes.getProperty(MarkupTags.CSS_KEY_MARGIN);
+ float f;
+ if (margin != null) {
+ f = parseLength(margin);
+ row.setSpacing(f);
+ }
+ margin = styleattributes.getProperty(MarkupTags.CSS_KEY_MARGINLEFT);
+ if (margin != null) {
+ f = parseLength(margin);
+ row.setSpacing_left(f);
+ }
+ margin = styleattributes.getProperty(MarkupTags.CSS_KEY_MARGINRIGHT);
+ if (margin != null) {
+ f = parseLength(margin);
+ row.setSpacing_right(f);
+ }
+ margin = styleattributes.getProperty(MarkupTags.CSS_KEY_MARGINTOP);
+ if (margin != null) {
+ f = parseLength(margin);
+ row.setSpacing_top(f);
+ }
+ margin = styleattributes.getProperty(MarkupTags.CSS_KEY_MARGINBOTTOM);
+ if (margin != null) {
+ f = parseLength(margin);
+ row.setSpacing_bottom(f);
+ }
+ String padding = styleattributes.getProperty(MarkupTags.CSS_KEY_PADDING);
+ if (padding != null) {
+ f = parseLength(padding);
+ row.setPadding(f);
+ }
+ padding = styleattributes.getProperty(MarkupTags.CSS_KEY_PADDINGLEFT);
+ if (padding != null) {
+ f = parseLength(padding);
+ row.setSpacing_left(f);
+ }
+ padding = styleattributes.getProperty(MarkupTags.CSS_KEY_PADDINGRIGHT);
+ if (padding != null) {
+ f = parseLength(padding);
+ row.setSpacing_right(f);
+ }
+ padding = styleattributes.getProperty(MarkupTags.CSS_KEY_PADDINGTOP);
+ if (padding != null) {
+ f = parseLength(padding);
+ row.setSpacing_top(f);
+ }
+ padding = styleattributes.getProperty(MarkupTags.CSS_KEY_PADDINGBOTTOM);
+ if (padding != null) {
+ f = parseLength(padding);
+ row.setSpacing_bottom(f);
+ }
+ return row;
+ }
+
+ /**
+ * Returns a Cell based on the styleattributes.
+ *
+ * @param attributes
+ * @param styleattributes
+ * @return an iText Cell
+ */
+ private Element retrieveTableCell(Properties attributes,
+ Properties styleattributes) {
+ SimpleCell cell = (SimpleCell) retrieveTableRow(attributes,
+ styleattributes);
+ cell.setCellgroup(false);
+ return cell;
+ }
+
+ /**
+ * Returns a ListItem based on the styleattributes.
+ *
+ * @param font
+ * @param styleattributes
+ * @return an iText ListItem
+ */
+ private Element retrieveListItem(Font font, Properties styleattributes) {
+ ListItem li = new ListItem();
+ return li;
+ }
+
+ /**
+ * Applies colors to a Rectangle object.
+ * @param rect
+ * @param attributes
+ * @param styleattributes
+ */
+ private void applyBordersColors(Rectangle rect, Properties attributes, Properties styleattributes) {
+ String s = styleattributes.getProperty(MarkupTags.CSS_KEY_BORDERWIDTH);
+ float f;
+ if (s != null) {
+ f = parseLength(s);
+ rect.setBorderWidth(f);
+ }
+ s = styleattributes.getProperty(MarkupTags.CSS_KEY_BORDERWIDTHLEFT);
+ if (s != null) {
+ f = parseLength(s);
+ rect.setBorderWidthLeft(f);
+ }
+ s = styleattributes.getProperty(MarkupTags.CSS_KEY_BORDERWIDTHRIGHT);
+ if (s != null) {
+ f = parseLength(s);
+ rect.setBorderWidthRight(f);
+ }
+ s = styleattributes.getProperty(MarkupTags.CSS_KEY_BORDERWIDTHTOP);
+ if (s != null) {
+ f = parseLength(s);
+ rect.setBorderWidthTop(f);
+ }
+ s = styleattributes.getProperty(MarkupTags.CSS_KEY_BORDERWIDTHBOTTOM);
+ if (s != null) {
+ f = parseLength(s);
+ rect.setBorderWidthBottom(f);
+ }
+ s = styleattributes.getProperty(MarkupTags.CSS_KEY_BORDERCOLOR);
+ if (s != null) {
+ rect.setBorderColor(decodeColor(s));
+ }
+ }
+
+ /**
+ * Retrieves a font from the FontFactory based on some style attributes.
+ * Looks for the font-family, font-size, font-weight, font-style and color.
+ * Takes the default encoding and embedded value.
+ *
+ * @param styleAttributes
+ * a Properties object containing keys and values
+ * @return an iText Font object
+ */
+
+ public Font retrieveFont(Properties styleAttributes) {
+ String fontname = null;
+ String encoding = FontFactory.defaultEncoding;
+ boolean embedded = FontFactory.defaultEmbedding;
+ float size = Font.UNDEFINED;
+ int style = Font.NORMAL;
+ Color color = null;
+ String value = (String) styleAttributes
+ .get(MarkupTags.CSS_KEY_FONTFAMILY);
+ if (value != null) {
+ if (value.indexOf(",") == -1) {
+ fontname = value.trim();
+ } else {
+ String tmp;
+ while (value.indexOf(",") != -1) {
+ tmp = value.substring(0, value.indexOf(",")).trim();
+ if (FontFactory.isRegistered(tmp)) {
+ fontname = tmp;
+ break;
+ } else {
+ value = value.substring(value.indexOf(",") + 1);
+ }
+ }
+ }
+ }
+ if ((value = (String) styleAttributes.get(MarkupTags.CSS_KEY_FONTSIZE)) != null) {
+ size = MarkupParser.parseLength(value);
+ }
+ if ((value = (String) styleAttributes
+ .get(MarkupTags.CSS_KEY_FONTWEIGHT)) != null) {
+ style |= Font.getStyleValue(value);
+ }
+ if ((value = (String) styleAttributes.get(MarkupTags.CSS_KEY_FONTSTYLE)) != null) {
+ style |= Font.getStyleValue(value);
+ }
+ if ((value = (String) styleAttributes.get(MarkupTags.CSS_KEY_COLOR)) != null) {
+ color = MarkupParser.decodeColor(value);
+ }
+ return FontFactory.getFont(fontname, encoding, embedded, size, style,
+ color);
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/markup/MarkupTags.java b/src/main/java/com/lowagie/text/markup/MarkupTags.java
new file mode 100644
index 0000000..e712124
--- /dev/null
+++ b/src/main/java/com/lowagie/text/markup/MarkupTags.java
@@ -0,0 +1,266 @@
+/*
+ * $Id: MarkupTags.java,v 1.51 2005/06/17 13:39:13 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2001, 2002 by Bruno Lowagie.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.markup;
+
+/**
+ * A class that contains all the possible tagnames and their attributes.
+ */
+
+public class MarkupTags {
+
+ // iText specific
+
+ /** the key for any tag */
+ public static final String ITEXT_TAG = "tag";
+
+ // HTML tags
+
+ /** the markup for the body part of a file */
+ public static final String HTML_TAG_BODY = "body";
+
+ /** The DIV tag. */
+ public static final String HTML_TAG_DIV = "div";
+
+ /** This is a possible HTML-tag. */
+ public static final String HTML_TAG_LINK = "link";
+
+ /** The SPAN tag. */
+ public static final String HTML_TAG_SPAN = "span";
+
+ // HTML attributes
+
+ /** the height attribute. */
+ public static final String HTML_ATTR_HEIGHT = "height";
+
+ /** the hyperlink reference attribute. */
+ public static final String HTML_ATTR_HREF = "href";
+
+ /** This is a possible HTML attribute for the LINK tag. */
+ public static final String HTML_ATTR_REL = "rel";
+
+ /** This is used for inline css style information */
+ public static final String HTML_ATTR_STYLE = "style";
+
+ /** This is a possible HTML attribute for the LINK tag. */
+ public static final String HTML_ATTR_TYPE = "type";
+
+ /** This is a possible HTML attribute. */
+ public static final String HTML_ATTR_STYLESHEET = "stylesheet";
+
+ /** the width attribute. */
+ public static final String HTML_ATTR_WIDTH = "width";
+
+ /** attribute for specifying externally defined CSS class */
+ public static final String HTML_ATTR_CSS_CLASS = "class";
+
+ /** The ID attribute. */
+ public static final String HTML_ATTR_CSS_ID = "id";
+
+ // HTML values
+
+ /** This is a possible value for the language attribute (SCRIPT tag). */
+ public static final String HTML_VALUE_JAVASCRIPT = "text/javascript";
+
+ /** This is a possible HTML attribute for the LINK tag. */
+ public static final String HTML_VALUE_CSS = "text/css";
+
+ // CSS keys
+
+ /** the CSS tag for background color */
+ public static final String CSS_KEY_BGCOLOR = "background-color";
+
+ /** the CSS tag for text color */
+ public static final String CSS_KEY_COLOR = "color";
+
+ /** CSS key that indicate the way something has to be displayed */
+ public static final String CSS_KEY_DISPLAY = "display";
+
+ /** the CSS tag for the font family */
+ public static final String CSS_KEY_FONTFAMILY = "font-family";
+
+ /** the CSS tag for the font size */
+ public static final String CSS_KEY_FONTSIZE = "font-size";
+
+ /** the CSS tag for the font style */
+ public static final String CSS_KEY_FONTSTYLE = "font-style";
+
+ /** the CSS tag for the font weight */
+ public static final String CSS_KEY_FONTWEIGHT = "font-weight";
+
+ /** the CSS tag for text decorations */
+ public static final String CSS_KEY_LINEHEIGHT = "line-height";
+
+ /** the CSS tag for the margin of an object */
+ public static final String CSS_KEY_MARGIN = "margin";
+
+ /** the CSS tag for the margin of an object */
+ public static final String CSS_KEY_MARGINLEFT = "margin-left";
+
+ /** the CSS tag for the margin of an object */
+ public static final String CSS_KEY_MARGINRIGHT = "margin-right";
+
+ /** the CSS tag for the margin of an object */
+ public static final String CSS_KEY_MARGINTOP = "margin-top";
+
+ /** the CSS tag for the margin of an object */
+ public static final String CSS_KEY_MARGINBOTTOM = "margin-bottom";
+
+ /** the CSS tag for the margin of an object */
+ public static final String CSS_KEY_PADDING = "padding";
+
+ /** the CSS tag for the margin of an object */
+ public static final String CSS_KEY_PADDINGLEFT = "padding-left";
+
+ /** the CSS tag for the margin of an object */
+ public static final String CSS_KEY_PADDINGRIGHT = "padding-right";
+
+ /** the CSS tag for the margin of an object */
+ public static final String CSS_KEY_PADDINGTOP = "padding-top";
+
+ /** the CSS tag for the margin of an object */
+ public static final String CSS_KEY_PADDINGBOTTOM = "padding-bottom";
+
+ /** the CSS tag for the margin of an object */
+ public static final String CSS_KEY_BORDERCOLOR = "border-color";
+
+ /** the CSS tag for the margin of an object */
+ public static final String CSS_KEY_BORDERWIDTH = "border-width";
+
+ /** the CSS tag for the margin of an object */
+ public static final String CSS_KEY_BORDERWIDTHLEFT = "border-left-width";
+
+ /** the CSS tag for the margin of an object */
+ public static final String CSS_KEY_BORDERWIDTHRIGHT = "border-right-width";
+
+ /** the CSS tag for the margin of an object */
+ public static final String CSS_KEY_BORDERWIDTHTOP = "border-top-width";
+
+ /** the CSS tag for the margin of an object */
+ public static final String CSS_KEY_BORDERWIDTHBOTTOM = "border-bottom-width";
+
+ /** the CSS tag for adding a page break when the document is printed */
+ public static final String CSS_KEY_PAGE_BREAK_AFTER = "page-break-after";
+
+ /** the CSS tag for adding a page break when the document is printed */
+ public static final String CSS_KEY_PAGE_BREAK_BEFORE = "page-break-before";
+
+ /** the CSS tag for the horizontal alignment of an object */
+ public static final String CSS_KEY_TEXTALIGN = "text-align";
+
+ /** the CSS tag for text decorations */
+ public static final String CSS_KEY_TEXTDECORATION = "text-decoration";
+
+ /** the CSS tag for text decorations */
+ public static final String CSS_KEY_VERTICALALIGN = "vertical-align";
+
+ /** the CSS tag for the visibility of objects */
+ public static final String CSS_KEY_VISIBILITY = "visibility";
+
+ // CSS values
+
+ /** value for the CSS tag for adding a page break when the document is printed */
+ public static final String CSS_VALUE_ALWAYS = "always";
+
+ /** A possible value for the DISPLAY key */
+ public static final String CSS_VALUE_BLOCK = "block";
+
+ /** a CSS value for text font weight */
+ public static final String CSS_VALUE_BOLD = "bold";
+
+ /** the value if you want to hide objects. */
+ public static final String CSS_VALUE_HIDDEN = "hidden";
+
+ /** A possible value for the DISPLAY key */
+ public static final String CSS_VALUE_INLINE = "inline";
+
+ /** a CSS value for text font style */
+ public static final String CSS_VALUE_ITALIC = "italic";
+
+ /** a CSS value for text decoration */
+ public static final String CSS_VALUE_LINETHROUGH = "line-through";
+
+ /** A possible value for the DISPLAY key */
+ public static final String CSS_VALUE_LISTITEM = "list-item";
+
+ /** a CSS value */
+ public static final String CSS_VALUE_NONE = "none";
+
+ /** a CSS value */
+ public static final String CSS_VALUE_NORMAL = "normal";
+
+ /** a CSS value for text font style */
+ public static final String CSS_VALUE_OBLIQUE = "oblique";
+
+ /** A possible value for the DISPLAY key */
+ public static final String CSS_VALUE_TABLE = "table";
+
+ /** A possible value for the DISPLAY key */
+ public static final String CSS_VALUE_TABLEROW = "table-row";
+
+ /** A possible value for the DISPLAY key */
+ public static final String CSS_VALUE_TABLECELL = "table-cell";
+
+ /** the CSS value for a horizontal alignment of an object */
+ public static final String CSS_VALUE_TEXTALIGNLEFT = "left";
+
+ /** the CSS value for a horizontal alignment of an object */
+ public static final String CSS_VALUE_TEXTALIGNRIGHT = "right";
+
+ /** the CSS value for a horizontal alignment of an object */
+ public static final String CSS_VALUE_TEXTALIGNCENTER = "center";
+
+ /** the CSS value for a horizontal alignment of an object */
+ public static final String CSS_VALUE_TEXTALIGNJUSTIFY = "justify";
+
+ /** a CSS value for text decoration */
+ public static final String CSS_VALUE_UNDERLINE = "underline";
+
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/markup/WebColors.java b/src/main/java/com/lowagie/text/markup/WebColors.java
new file mode 100644
index 0000000..c4119b2
--- /dev/null
+++ b/src/main/java/com/lowagie/text/markup/WebColors.java
@@ -0,0 +1,246 @@
+/*
+ * $Id: WebColors.java,v 1.3 2005/08/24 11:37:28 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2001, 2002 by Bruno Lowagie.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.markup;
+
+import java.awt.Color;
+import java.util.HashMap;
+
+/**
+ * This class is a HashMap that contains the names of colors as a key and the
+ * corresponding Color as value. (Source: Wikipedia
+ * http://en.wikipedia.org/wiki/Web_colors )
+ *
+ * @author blowagie
+ */
+public class WebColors extends HashMap {
+
+ /** HashMap containing all the names and corresponding color values. */
+ public static final WebColors NAMES = new WebColors();
+ static {
+ NAMES.put("aliceblue", new int[] { 0xf0, 0xf8, 0xff, 0x00 });
+ NAMES.put("antiquewhite", new int[] { 0xfa, 0xeb, 0xd7, 0x00 });
+ NAMES.put("aqua", new int[] { 0x00, 0xff, 0xff, 0x00 });
+ NAMES.put("aquamarine", new int[] { 0x7f, 0xff, 0xd4, 0x00 });
+ NAMES.put("azure", new int[] { 0xf0, 0xff, 0xff, 0x00 });
+ NAMES.put("beige", new int[] { 0xf5, 0xf5, 0xdc, 0x00 });
+ NAMES.put("bisque", new int[] { 0xff, 0xe4, 0xc4, 0x00 });
+ NAMES.put("black", new int[] { 0x00, 0x00, 0x00, 0x00 });
+ NAMES.put("blanchedalmond", new int[] { 0xff, 0xeb, 0xcd, 0x00 });
+ NAMES.put("blue", new int[] { 0x00, 0x00, 0xff, 0x00 });
+ NAMES.put("blueviolet", new int[] { 0x8a, 0x2b, 0xe2, 0x00 });
+ NAMES.put("brown", new int[] { 0xa5, 0x2a, 0x2a, 0x00 });
+ NAMES.put("burlywood", new int[] { 0xde, 0xb8, 0x87, 0x00 });
+ NAMES.put("cadetblue", new int[] { 0x5f, 0x9e, 0xa0, 0x00 });
+ NAMES.put("chartreuse", new int[] { 0x7f, 0xff, 0x00, 0x00 });
+ NAMES.put("chocolate", new int[] { 0xd2, 0x69, 0x1e, 0x00 });
+ NAMES.put("coral", new int[] { 0xff, 0x7f, 0x50, 0x00 });
+ NAMES.put("cornflowerblue", new int[] { 0x64, 0x95, 0xed, 0x00 });
+ NAMES.put("cornsilk", new int[] { 0xff, 0xf8, 0xdc, 0x00 });
+ NAMES.put("crimson", new int[] { 0xdc, 0x14, 0x3c, 0x00 });
+ NAMES.put("cyan", new int[] { 0x00, 0xff, 0xff, 0x00 });
+ NAMES.put("darkblue", new int[] { 0x00, 0x00, 0x8b, 0x00 });
+ NAMES.put("darkcyan", new int[] { 0x00, 0x8b, 0x8b, 0x00 });
+ NAMES.put("darkgoldenrod", new int[] { 0xb8, 0x86, 0x0b, 0x00 });
+ NAMES.put("darkgray", new int[] { 0xa9, 0xa9, 0xa9, 0x00 });
+ NAMES.put("darkgreen", new int[] { 0x00, 0x64, 0x00, 0x00 });
+ NAMES.put("darkkhaki", new int[] { 0xbd, 0xb7, 0x6b, 0x00 });
+ NAMES.put("darkmagenta", new int[] { 0x8b, 0x00, 0x8b, 0x00 });
+ NAMES.put("darkolivegreen", new int[] { 0x55, 0x6b, 0x2f, 0x00 });
+ NAMES.put("darkorange", new int[] { 0xff, 0x8c, 0x00, 0x00 });
+ NAMES.put("darkorchid", new int[] { 0x99, 0x32, 0xcc, 0x00 });
+ NAMES.put("darkred", new int[] { 0x8b, 0x00, 0x00, 0x00 });
+ NAMES.put("darksalmon", new int[] { 0xe9, 0x96, 0x7a, 0x00 });
+ NAMES.put("darkseagreen", new int[] { 0x8f, 0xbc, 0x8f, 0x00 });
+ NAMES.put("darkslateblue", new int[] { 0x48, 0x3d, 0x8b, 0x00 });
+ NAMES.put("darkslategray", new int[] { 0x2f, 0x4f, 0x4f, 0x00 });
+ NAMES.put("darkturquoise", new int[] { 0x00, 0xce, 0xd1, 0x00 });
+ NAMES.put("darkviolet", new int[] { 0x94, 0x00, 0xd3, 0x00 });
+ NAMES.put("deeppink", new int[] { 0xff, 0x14, 0x93, 0x00 });
+ NAMES.put("deepskyblue", new int[] { 0x00, 0xbf, 0xff, 0x00 });
+ NAMES.put("dimgray", new int[] { 0x69, 0x69, 0x69, 0x00 });
+ NAMES.put("dodgerblue", new int[] { 0x1e, 0x90, 0xff, 0x00 });
+ NAMES.put("firebrick", new int[] { 0xb2, 0x22, 0x22, 0x00 });
+ NAMES.put("floralwhite", new int[] { 0xff, 0xfa, 0xf0, 0x00 });
+ NAMES.put("forestgreen", new int[] { 0x22, 0x8b, 0x22, 0x00 });
+ NAMES.put("fuchsia", new int[] { 0xff, 0x00, 0xff, 0x00 });
+ NAMES.put("gainsboro", new int[] { 0xdc, 0xdc, 0xdc, 0x00 });
+ NAMES.put("ghostwhite", new int[] { 0xf8, 0xf8, 0xff, 0x00 });
+ NAMES.put("gold", new int[] { 0xff, 0xd7, 0x00, 0x00 });
+ NAMES.put("goldenrod", new int[] { 0xda, 0xa5, 0x20, 0x00 });
+ NAMES.put("gray", new int[] { 0x80, 0x80, 0x80, 0x00 });
+ NAMES.put("green", new int[] { 0x00, 0x80, 0x00, 0x00 });
+ NAMES.put("greenyellow", new int[] { 0xad, 0xff, 0x2f, 0x00 });
+ NAMES.put("honeydew", new int[] { 0xf0, 0xff, 0xf0, 0x00 });
+ NAMES.put("hotpink", new int[] { 0xff, 0x69, 0xb4, 0x00 });
+ NAMES.put("indianred", new int[] { 0xcd, 0x5c, 0x5c, 0x00 });
+ NAMES.put("indigo", new int[] { 0x4b, 0x00, 0x82, 0x00 });
+ NAMES.put("ivory", new int[] { 0xff, 0xff, 0xf0, 0x00 });
+ NAMES.put("khaki", new int[] { 0xf0, 0xe6, 0x8c, 0x00 });
+ NAMES.put("lavender", new int[] { 0xe6, 0xe6, 0xfa, 0x00 });
+ NAMES.put("lavenderblush", new int[] { 0xff, 0xf0, 0xf5, 0x00 });
+ NAMES.put("lawngreen", new int[] { 0x7c, 0xfc, 0x00, 0x00 });
+ NAMES.put("lemonchiffon", new int[] { 0xff, 0xfa, 0xcd, 0x00 });
+ NAMES.put("lightblue", new int[] { 0xad, 0xd8, 0xe6, 0x00 });
+ NAMES.put("lightcoral", new int[] { 0xf0, 0x80, 0x80, 0x00 });
+ NAMES.put("lightcyan", new int[] { 0xe0, 0xff, 0xff, 0x00 });
+ NAMES.put("lightgoldenrodyellow", new int[] { 0xfa, 0xfa, 0xd2, 0x00 });
+ NAMES.put("lightgreen", new int[] { 0x90, 0xee, 0x90, 0x00 });
+ NAMES.put("lightgrey", new int[] { 0xd3, 0xd3, 0xd3, 0x00 });
+ NAMES.put("lightpink", new int[] { 0xff, 0xb6, 0xc1, 0x00 });
+ NAMES.put("lightsalmon", new int[] { 0xff, 0xa0, 0x7a, 0x00 });
+ NAMES.put("lightseagreen", new int[] { 0x20, 0xb2, 0xaa, 0x00 });
+ NAMES.put("lightskyblue", new int[] { 0x87, 0xce, 0xfa, 0x00 });
+ NAMES.put("lightslategray", new int[] { 0x77, 0x88, 0x99, 0x00 });
+ NAMES.put("lightsteelblue", new int[] { 0xb0, 0xc4, 0xde, 0x00 });
+ NAMES.put("lightyellow", new int[] { 0xff, 0xff, 0xe0, 0x00 });
+ NAMES.put("lime", new int[] { 0x00, 0xff, 0x00, 0x00 });
+ NAMES.put("limegreen", new int[] { 0x32, 0xcd, 0x32, 0x00 });
+ NAMES.put("linen", new int[] { 0xfa, 0xf0, 0xe6, 0x00 });
+ NAMES.put("magenta", new int[] { 0xff, 0x00, 0xff, 0x00 });
+ NAMES.put("maroon", new int[] { 0x80, 0x00, 0x00, 0x00 });
+ NAMES.put("mediumaquamarine", new int[] { 0x66, 0xcd, 0xaa, 0x00 });
+ NAMES.put("mediumblue", new int[] { 0x00, 0x00, 0xcd, 0x00 });
+ NAMES.put("mediumorchid", new int[] { 0xba, 0x55, 0xd3, 0x00 });
+ NAMES.put("mediumpurple", new int[] { 0x93, 0x70, 0xdb, 0x00 });
+ NAMES.put("mediumseagreen", new int[] { 0x3c, 0xb3, 0x71, 0x00 });
+ NAMES.put("mediumslateblue", new int[] { 0x7b, 0x68, 0xee, 0x00 });
+ NAMES.put("mediumspringgreen", new int[] { 0x00, 0xfa, 0x9a, 0x00 });
+ NAMES.put("mediumturquoise", new int[] { 0x48, 0xd1, 0xcc, 0x00 });
+ NAMES.put("mediumvioletred", new int[] { 0xc7, 0x15, 0x85, 0x00 });
+ NAMES.put("midnightblue", new int[] { 0x19, 0x19, 0x70, 0x00 });
+ NAMES.put("mintcream", new int[] { 0xf5, 0xff, 0xfa, 0x00 });
+ NAMES.put("mistyrose", new int[] { 0xff, 0xe4, 0xe1, 0x00 });
+ NAMES.put("moccasin", new int[] { 0xff, 0xe4, 0xb5, 0x00 });
+ NAMES.put("navajowhite", new int[] { 0xff, 0xde, 0xad, 0x00 });
+ NAMES.put("navy", new int[] { 0x00, 0x00, 0x80, 0x00 });
+ NAMES.put("oldlace", new int[] { 0xfd, 0xf5, 0xe6, 0x00 });
+ NAMES.put("olive", new int[] { 0x80, 0x80, 0x00, 0x00 });
+ NAMES.put("olivedrab", new int[] { 0x6b, 0x8e, 0x23, 0x00 });
+ NAMES.put("orange", new int[] { 0xff, 0xa5, 0x00, 0x00 });
+ NAMES.put("orangered", new int[] { 0xff, 0x45, 0x00, 0x00 });
+ NAMES.put("orchid", new int[] { 0xda, 0x70, 0xd6, 0x00 });
+ NAMES.put("palegoldenrod", new int[] { 0xee, 0xe8, 0xaa, 0x00 });
+ NAMES.put("palegreen", new int[] { 0x98, 0xfb, 0x98, 0x00 });
+ NAMES.put("paleturquoise", new int[] { 0xaf, 0xee, 0xee, 0x00 });
+ NAMES.put("palevioletred", new int[] { 0xdb, 0x70, 0x93, 0x00 });
+ NAMES.put("papayawhip", new int[] { 0xff, 0xef, 0xd5, 0x00 });
+ NAMES.put("peachpuff", new int[] { 0xff, 0xda, 0xb9, 0x00 });
+ NAMES.put("peru", new int[] { 0xcd, 0x85, 0x3f, 0x00 });
+ NAMES.put("pink", new int[] { 0xff, 0xc0, 0xcb, 0x00 });
+ NAMES.put("plum", new int[] { 0xdd, 0xa0, 0xdd, 0x00 });
+ NAMES.put("powderblue", new int[] { 0xb0, 0xe0, 0xe6, 0x00 });
+ NAMES.put("purple", new int[] { 0x80, 0x00, 0x80, 0x00 });
+ NAMES.put("red", new int[] { 0xff, 0x00, 0x00, 0x00 });
+ NAMES.put("rosybrown", new int[] { 0xbc, 0x8f, 0x8f, 0x00 });
+ NAMES.put("royalblue", new int[] { 0x41, 0x69, 0xe1, 0x00 });
+ NAMES.put("saddlebrown", new int[] { 0x8b, 0x45, 0x13, 0x00 });
+ NAMES.put("salmon", new int[] { 0xfa, 0x80, 0x72, 0x00 });
+ NAMES.put("sandybrown", new int[] { 0xf4, 0xa4, 0x60, 0x00 });
+ NAMES.put("seagreen", new int[] { 0x2e, 0x8b, 0x57, 0x00 });
+ NAMES.put("seashell", new int[] { 0xff, 0xf5, 0xee, 0x00 });
+ NAMES.put("sienna", new int[] { 0xa0, 0x52, 0x2d, 0x00 });
+ NAMES.put("silver", new int[] { 0xc0, 0xc0, 0xc0, 0x00 });
+ NAMES.put("skyblue", new int[] { 0x87, 0xce, 0xeb, 0x00 });
+ NAMES.put("slateblue", new int[] { 0x6a, 0x5a, 0xcd, 0x00 });
+ NAMES.put("slategray", new int[] { 0x70, 0x80, 0x90, 0x00 });
+ NAMES.put("snow", new int[] { 0xff, 0xfa, 0xfa, 0x00 });
+ NAMES.put("springgreen", new int[] { 0x00, 0xff, 0x7f, 0x00 });
+ NAMES.put("steelblue", new int[] { 0x46, 0x82, 0xb4, 0x00 });
+ NAMES.put("tan", new int[] { 0xd2, 0xb4, 0x8c, 0x00 });
+ NAMES.put("transparent", new int[] { 0x00, 0x00, 0x00, 0xff });
+ NAMES.put("teal", new int[] { 0x00, 0x80, 0x80, 0x00 });
+ NAMES.put("thistle", new int[] { 0xd8, 0xbf, 0xd8, 0x00 });
+ NAMES.put("tomato", new int[] { 0xff, 0x63, 0x47, 0x00 });
+ NAMES.put("turquoise", new int[] { 0x40, 0xe0, 0xd0, 0x00 });
+ NAMES.put("violet", new int[] { 0xee, 0x82, 0xee, 0x00 });
+ NAMES.put("wheat", new int[] { 0xf5, 0xde, 0xb3, 0x00 });
+ NAMES.put("white", new int[] { 0xff, 0xff, 0xff, 0x00 });
+ NAMES.put("whitesmoke", new int[] { 0xf5, 0xf5, 0xf5, 0x00 });
+ NAMES.put("yellow", new int[] { 0xff, 0xff, 0x00, 0x00 });
+ NAMES.put("yellowgreen", new int[] { 0x9, 0xacd, 0x32, 0x00 });
+ }
+
+ /**
+ * Gives you a Color based on a name.
+ *
+ * @param name
+ * a name such as black, violet, cornflowerblue
+ * @return the corresponding Color object
+ * @throws IllegalArgumentException
+ * if the String isn't a know representation of a color.
+ */
+ public static Color getRGBColor(String name)
+ throws IllegalArgumentException {
+ int[] c = { 0, 0, 0, 0 };
+ if (name.startsWith("#")) {
+ if (name.length() == 4) {
+ c[0] = Integer.parseInt(name.substring(1, 2), 16) * 16;
+ c[1] = Integer.parseInt(name.substring(2, 3), 16) * 16;
+ c[2] = Integer.parseInt(name.substring(3), 16) * 16;
+ return new Color(c[0], c[1], c[2], c[3]);
+ }
+ if (name.length() == 7) {
+ c[0] = Integer.parseInt(name.substring(1, 3), 16);
+ c[1] = Integer.parseInt(name.substring(3, 5), 16);
+ c[2] = Integer.parseInt(name.substring(5), 16);
+ return new Color(c[0], c[1], c[2], c[3]);
+ }
+ throw new IllegalArgumentException(
+ "Unknown color format. Must be #RGB or #RRGGBB");
+ }
+ name = name.toLowerCase();
+ if (!NAMES.containsKey(name))
+ throw new IllegalArgumentException("Color '" + name
+ + "' not found.");
+ c = (int[]) NAMES.get(name);
+ return new Color(c[0], c[1], c[2], c[3]);
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/pdf/AcroFields.java b/src/main/java/com/lowagie/text/pdf/AcroFields.java
new file mode 100644
index 0000000..30e33ca
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/AcroFields.java
@@ -0,0 +1,1883 @@
+/*
+ * Copyright 2003-2005 by Paulo Soares.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+package com.lowagie.text.pdf;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Iterator;
+import java.util.Comparator;
+import java.util.Collections;
+import com.lowagie.text.Rectangle;
+import com.lowagie.text.Element;
+import com.lowagie.text.ExceptionConverter;
+import com.lowagie.text.DocumentException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.awt.Color;
+
+/** Query and change fields in existing documents either by method
+ * calls or by FDF merging.
+ * @author Paulo Soares (psoares@consiste.pt)
+ */
+public class AcroFields {
+
+ PdfReader reader;
+ PdfWriter writer;
+ HashMap fields;
+ private int topFirst;
+ private HashMap sigNames;
+ private boolean append;
+ static private final int DA_FONT = 0;
+ static private final int DA_SIZE = 1;
+ static private final int DA_COLOR = 2;
+ private HashMap extensionFonts = new HashMap();
+ /**
+ * A field type invalid or not found.
+ */
+ public static final int FIELD_TYPE_NONE = 0;
+ /**
+ * A field type.
+ */
+ public static final int FIELD_TYPE_PUSHBUTTON = 1;
+ /**
+ * A field type.
+ */
+ public static final int FIELD_TYPE_CHECKBOX = 2;
+ /**
+ * A field type.
+ */
+ public static final int FIELD_TYPE_RADIOBUTTON = 3;
+ /**
+ * A field type.
+ */
+ public static final int FIELD_TYPE_TEXT = 4;
+ /**
+ * A field type.
+ */
+ public static final int FIELD_TYPE_LIST = 5;
+ /**
+ * A field type.
+ */
+ public static final int FIELD_TYPE_COMBO = 6;
+ /**
+ * A field type.
+ */
+ public static final int FIELD_TYPE_SIGNATURE = 7;
+
+ private boolean lastWasString;
+
+ /** Holds value of property generateAppearances. */
+ private boolean generateAppearances = true;
+
+ private HashMap localFonts = new HashMap();
+
+ private float extraMarginLeft;
+ private float extraMarginTop;
+ private ArrayList substitutionFonts;
+
+ AcroFields(PdfReader reader, PdfWriter writer) {
+ this.reader = reader;
+ this.writer = writer;
+ if (writer instanceof PdfStamperImp) {
+ append = ((PdfStamperImp)writer).isAppend();
+ }
+ fill();
+ }
+
+ void fill() {
+ fields = new HashMap();
+ PdfDictionary top = (PdfDictionary)PdfReader.getPdfObjectRelease(reader.getCatalog().get(PdfName.ACROFORM));
+ if (top == null)
+ return;
+ PdfArray arrfds = (PdfArray)PdfReader.getPdfObjectRelease(top.get(PdfName.FIELDS));
+ if (arrfds == null || arrfds.size() == 0)
+ return;
+ arrfds = null;
+ for (int k = 1; k <= reader.getNumberOfPages(); ++k) {
+ if ((k % 100) == 0)
+ System.out.println(k);
+ PdfDictionary page = reader.getPageNRelease(k);
+ PdfArray annots = (PdfArray)PdfReader.getPdfObjectRelease(page.get(PdfName.ANNOTS), page);
+ if (annots == null)
+ continue;
+ ArrayList arr = annots.getArrayList();
+ for (int j = 0; j < arr.size(); ++j) {
+ PdfObject annoto = PdfReader.getPdfObject((PdfObject)arr.get(j), annots);
+ if ((annoto instanceof PdfIndirectReference) && !annoto.isIndirect()) {
+ PdfReader.releaseLastXrefPartial((PdfObject)arr.get(j));
+ continue;
+ }
+ PdfDictionary annot = (PdfDictionary)annoto;
+ if (!PdfName.WIDGET.equals(annot.get(PdfName.SUBTYPE))) {
+ PdfReader.releaseLastXrefPartial((PdfObject)arr.get(j));
+ continue;
+ }
+ PdfDictionary widget = annot;
+ PdfDictionary dic = new PdfDictionary();
+ dic.putAll(annot);
+ String name = "";
+ PdfDictionary value = null;
+ PdfObject lastV = null;
+ while (annot != null) {
+ dic.mergeDifferent(annot);
+ PdfString t = (PdfString)PdfReader.getPdfObject(annot.get(PdfName.T));
+ if (t != null)
+ name = t.toUnicodeString() + "." + name;
+ if (lastV == null && annot.get(PdfName.V) != null)
+ lastV = PdfReader.getPdfObjectRelease(annot.get(PdfName.V));
+ if (value == null && t != null) {
+ value = annot;
+ if (annot.get(PdfName.V) == null && lastV != null)
+ value.put(PdfName.V, lastV);
+ }
+ annot = (PdfDictionary)PdfReader.getPdfObject(annot.get(PdfName.PARENT), annot);
+ }
+ if (name.length() > 0)
+ name = name.substring(0, name.length() - 1);
+ Item item = (Item)fields.get(name);
+ if (item == null) {
+ item = new Item();
+ fields.put(name, item);
+ }
+ if (value == null)
+ item.values.add(widget);
+ else
+ item.values.add(value);
+ item.widgets.add(widget);
+ item.widget_refs.add(arr.get(j)); // must be a reference
+ if (top != null)
+ dic.mergeDifferent(top);
+ item.merged.add(dic);
+ item.page.add(new Integer(k));
+ item.tabOrder.add(new Integer(j));
+ }
+ }
+ }
+
+ /** Gets the list of appearance names. Use it to get the names allowed
+ * with radio and checkbox fields. If the /Opt key exists the values will
+ * also be included. The name 'Off' may also be valid
+ * even if not returned in the list.
+ * @param fieldName the fully qualified field name
+ * @return the list of names or <CODE>null</CODE> if the field does not exist
+ */
+ public String[] getAppearanceStates(String fieldName) {
+ Item fd = (Item)fields.get(fieldName);
+ if (fd == null)
+ return null;
+ HashMap names = new HashMap();
+ PdfDictionary vals = (PdfDictionary)fd.values.get(0);
+ PdfObject opts = PdfReader.getPdfObject(vals.get(PdfName.OPT));
+ if (opts != null) {
+ if (opts.isString())
+ names.put(((PdfString)opts).toUnicodeString(), null);
+ else if (opts.isArray()) {
+ ArrayList list = ((PdfArray)opts).getArrayList();
+ for (int k = 0; k < list.size(); ++k) {
+ PdfObject v = PdfReader.getPdfObject((PdfObject)list.get(k));
+ if (v != null && v.isString())
+ names.put(((PdfString)v).toUnicodeString(), null);
+ }
+ }
+ }
+ ArrayList wd = fd.widgets;
+ for (int k = 0; k < wd.size(); ++k) {
+ PdfDictionary dic = (PdfDictionary)wd.get(k);
+ dic = (PdfDictionary)PdfReader.getPdfObject(dic.get(PdfName.AP));
+ if (dic == null)
+ continue;
+ PdfObject ob = PdfReader.getPdfObject(dic.get(PdfName.N));
+ if (ob == null || !ob.isDictionary())
+ continue;
+ dic = (PdfDictionary)ob;
+ for (Iterator it = dic.getKeys().iterator(); it.hasNext();) {
+ String name = PdfName.decodeName(((PdfName)it.next()).toString());
+ names.put(name, null);
+ }
+ }
+ String out[] = new String[names.size()];
+ return (String[])names.keySet().toArray(out);
+ }
+
+ private String[] getListOption(String fieldName, int idx) {
+ Item fd = (Item)fields.get(fieldName);
+ if (fd == null)
+ return null;
+ PdfObject obj = PdfReader.getPdfObject(((PdfDictionary)fd.merged.get(0)).get(PdfName.OPT));
+ if (obj == null || !obj.isArray())
+ return null;
+ PdfArray ar = (PdfArray)obj;
+ String[] ret = new String[ar.size()];
+ ArrayList a = ar.getArrayList();
+ for (int k = 0; k < a.size(); ++k) {
+ obj = PdfReader.getPdfObject((PdfObject)a.get(k));
+ try {
+ if (obj.isArray()) {
+ obj = (PdfObject)((PdfArray)obj).getArrayList().get(idx);
+ }
+ if (obj.isString())
+ ret[k] = ((PdfString)obj).toUnicodeString();
+ else
+ ret[k] = obj.toString();
+ }
+ catch (Exception e) {
+ ret[k] = "";
+ }
+ }
+ return ret;
+ }
+
+ /**
+ * Gets the list of export option values from fields of type list or combo.
+ * If the field doesn't exist or the field type is not list or combo it will return
+ * <CODE>null</CODE>.
+ * @param fieldName the field name
+ * @return the list of export option values from fields of type list or combo
+ */
+ public String[] getListOptionExport(String fieldName) {
+ return getListOption(fieldName, 0);
+ }
+
+ /**
+ * Gets the list of display option values from fields of type list or combo.
+ * If the field doesn't exist or the field type is not list or combo it will return
+ * <CODE>null</CODE>.
+ * @param fieldName the field name
+ * @return the list of export option values from fields of type list or combo
+ */
+ public String[] getListOptionDisplay(String fieldName) {
+ return getListOption(fieldName, 1);
+ }
+
+ /**
+ * Sets the option list for fields of type list or combo. One of <CODE>exportValues</CODE>
+ * or <CODE>displayValues</CODE> may be <CODE>null</CODE> but not both. This method will only
+ * set the list but will not set the value or appearance. For that, calling <CODE>setField()</CODE>
+ * is required.
+ * <p>
+ * An example:
+ * <p>
+ * <PRE>
+ * PdfReader pdf = new PdfReader("input.pdf");
+ * PdfStamper stp = new PdfStamper(pdf, new FileOutputStream("output.pdf"));
+ * AcroFields af = stp.getAcroFields();
+ * af.setListOption("ComboBox", new String[]{"a", "b", "c"}, new String[]{"first", "second", "third"});
+ * af.setField("ComboBox", "b");
+ * stp.close();
+ * </PRE>
+ * @param fieldName the field name
+ * @param exportValues the export values
+ * @param displayValues the display values
+ * @return <CODE>true</CODE> if the operation succeeded, <CODE>false</CODE> otherwise
+ */
+ public boolean setListOption(String fieldName, String[] exportValues, String[] displayValues) {
+ if (exportValues == null && displayValues == null)
+ return false;
+ if (exportValues != null && displayValues != null && exportValues.length != displayValues.length)
+ throw new IllegalArgumentException("The export and the display array must have the same size.");
+ int ftype = getFieldType(fieldName);
+ if (ftype != FIELD_TYPE_COMBO && ftype != FIELD_TYPE_LIST)
+ return false;
+ Item fd = (Item)fields.get(fieldName);
+ String[] sing = null;
+ if (exportValues == null && displayValues != null)
+ sing = displayValues;
+ else if (exportValues != null && displayValues == null)
+ sing = exportValues;
+ PdfArray opt = new PdfArray();
+ if (sing != null) {
+ for (int k = 0; k < sing.length; ++k)
+ opt.add(new PdfString(sing[k], PdfObject.TEXT_UNICODE));
+ }
+ else {
+ for (int k = 0; k < exportValues.length; ++k) {
+ PdfArray a = new PdfArray();
+ a.add(new PdfString(exportValues[k], PdfObject.TEXT_UNICODE));
+ a.add(new PdfString(displayValues[k], PdfObject.TEXT_UNICODE));
+ opt.add(a);
+ }
+ }
+ ((PdfDictionary)fd.values.get(0)).put(PdfName.OPT, opt);
+ for (int j = 0; j < fd.merged.size(); ++j)
+ ((PdfDictionary)fd.merged.get(j)).put(PdfName.OPT, opt);
+ return true;
+ }
+
+ /**
+ * Gets the field type. The type can be one of: <CODE>FIELD_TYPE_PUSHBUTTON</CODE>,
+ * <CODE>FIELD_TYPE_CHECKBOX</CODE>, <CODE>FIELD_TYPE_RADIOBUTTON</CODE>,
+ * <CODE>FIELD_TYPE_TEXT</CODE>, <CODE>FIELD_TYPE_LIST</CODE>,
+ * <CODE>FIELD_TYPE_COMBO</CODE> or <CODE>FIELD_TYPE_SIGNATURE</CODE>.
+ * <p>
+ * If the field does not exist or is invalid it returns
+ * <CODE>FIELD_TYPE_NONE</CODE>.
+ * @param fieldName the field name
+ * @return the field type
+ */
+ public int getFieldType(String fieldName) {
+ Item fd = (Item)fields.get(fieldName);
+ if (fd == null)
+ return FIELD_TYPE_NONE;
+ PdfObject type = PdfReader.getPdfObject(((PdfDictionary)fd.merged.get(0)).get(PdfName.FT));
+ if (type == null)
+ return FIELD_TYPE_NONE;
+ int ff = 0;
+ PdfObject ffo = PdfReader.getPdfObject(((PdfDictionary)fd.merged.get(0)).get(PdfName.FF));
+ if (ffo != null && ffo.type() == PdfObject.NUMBER)
+ ff = ((PdfNumber)ffo).intValue();
+ if (PdfName.BTN.equals(type)) {
+ if ((ff & PdfFormField.FF_PUSHBUTTON) != 0)
+ return FIELD_TYPE_PUSHBUTTON;
+ if ((ff & PdfFormField.FF_RADIO) != 0)
+ return FIELD_TYPE_RADIOBUTTON;
+ else
+ return FIELD_TYPE_CHECKBOX;
+ }
+ else if (PdfName.TX.equals(type)) {
+ return FIELD_TYPE_TEXT;
+ }
+ else if (PdfName.CH.equals(type)) {
+ if ((ff & PdfFormField.FF_COMBO) != 0)
+ return FIELD_TYPE_COMBO;
+ else
+ return FIELD_TYPE_LIST;
+ }
+ else if (PdfName.SIG.equals(type)) {
+ return FIELD_TYPE_SIGNATURE;
+ }
+ return FIELD_TYPE_NONE;
+ }
+
+ /**
+ * Export the fields as a FDF.
+ * @param writer the FDF writer
+ */
+ public void exportAsFdf(FdfWriter writer) {
+ for (Iterator it = fields.entrySet().iterator(); it.hasNext();) {
+ Map.Entry entry = (Map.Entry)it.next();
+ Item item = (Item)entry.getValue();
+ String name = (String)entry.getKey();
+ PdfObject v = PdfReader.getPdfObject(((PdfDictionary)item.merged.get(0)).get(PdfName.V));
+ if (v == null)
+ continue;
+ String value = getField(name);
+ if (lastWasString)
+ writer.setFieldAsString(name, value);
+ else
+ writer.setFieldAsName(name, value);
+ }
+ }
+
+ /**
+ * Renames a field. Only the last part of the name can be renamed. For example,
+ * if the original field is "ab.cd.ef" only the "ef" part can be renamed.
+ * @param oldName the old field name
+ * @param newName the new field name
+ * @return <CODE>true</CODE> if the renaming was successful, <CODE>false</CODE>
+ * otherwise
+ */
+ public boolean renameField(String oldName, String newName) {
+ int idx1 = oldName.lastIndexOf('.') + 1;
+ int idx2 = newName.lastIndexOf('.') + 1;
+ if (idx1 != idx2)
+ return false;
+ if (!oldName.substring(0, idx1).equals(newName.substring(0, idx2)))
+ return false;
+ if (fields.containsKey(newName))
+ return false;
+ Item item = (Item)fields.get(oldName);
+ if (item == null)
+ return false;
+ newName = newName.substring(idx2);
+ PdfString ss = new PdfString(newName, PdfObject.TEXT_UNICODE);
+ for (int k = 0; k < item.merged.size(); ++k) {
+ PdfDictionary dic = (PdfDictionary)item.values.get(k);
+ dic.put(PdfName.T, ss);
+ markUsed(dic);
+ dic = (PdfDictionary)item.merged.get(k);
+ dic.put(PdfName.T, ss);
+ }
+ fields.remove(oldName);
+ fields.put(newName, item);
+ return true;
+ }
+
+ static private Object[] splitDAelements(String da) {
+ try {
+ PRTokeniser tk = new PRTokeniser(PdfEncodings.convertToBytes(da, null));
+ ArrayList stack = new ArrayList();
+ Object ret[] = new Object[3];
+ while (tk.nextToken()) {
+ if (tk.getTokenType() == PRTokeniser.TK_COMMENT)
+ continue;
+ if (tk.getTokenType() == PRTokeniser.TK_OTHER) {
+ String operator = tk.getStringValue();
+ if (operator.equals("Tf")) {
+ if (stack.size() >= 2) {
+ ret[DA_FONT] = stack.get(stack.size() - 2);
+ ret[DA_SIZE] = new Float((String)stack.get(stack.size() - 1));
+ }
+ }
+ else if (operator.equals("g")) {
+ if (stack.size() >= 1) {
+ float gray = new Float((String)stack.get(stack.size() - 1)).floatValue();
+ if (gray != 0)
+ ret[DA_COLOR] = new GrayColor(gray);
+ }
+ }
+ else if (operator.equals("rg")) {
+ if (stack.size() >= 3) {
+ float red = new Float((String)stack.get(stack.size() - 3)).floatValue();
+ float green = new Float((String)stack.get(stack.size() - 2)).floatValue();
+ float blue = new Float((String)stack.get(stack.size() - 1)).floatValue();
+ ret[DA_COLOR] = new Color(red, green, blue);
+ }
+ }
+ else if (operator.equals("k")) {
+ if (stack.size() >= 4) {
+ float cyan = new Float((String)stack.get(stack.size() - 4)).floatValue();
+ float magenta = new Float((String)stack.get(stack.size() - 3)).floatValue();
+ float yellow = new Float((String)stack.get(stack.size() - 2)).floatValue();
+ float black = new Float((String)stack.get(stack.size() - 1)).floatValue();
+ ret[DA_COLOR] = new CMYKColor(cyan, magenta, yellow, black);
+ }
+ }
+ stack.clear();
+ }
+ else
+ stack.add(tk.getStringValue());
+ }
+ return ret;
+ }
+ catch (IOException ioe) {
+ throw new ExceptionConverter(ioe);
+ }
+ }
+
+ PdfAppearance getAppearance(PdfDictionary merged, String text, String fieldName) throws IOException, DocumentException {
+ topFirst = 0;
+ int flags = 0;
+ TextField tx = null;
+ if (fieldCache == null || !fieldCache.containsKey(fieldName)) {
+ tx = new TextField(writer, null, null);
+ tx.setExtraMargin(extraMarginLeft, extraMarginTop);
+ tx.setBorderWidth(0);
+ tx.setSubstitutionFonts(substitutionFonts);
+ // the text size and color
+ PdfString da = (PdfString)PdfReader.getPdfObject(merged.get(PdfName.DA));
+ if (da != null) {
+ Object dab[] = splitDAelements(da.toUnicodeString());
+ if (dab[DA_SIZE] != null)
+ tx.setFontSize(((Float)dab[DA_SIZE]).floatValue());
+ if (dab[DA_COLOR] != null)
+ tx.setTextColor((Color)dab[DA_COLOR]);
+ if (dab[DA_FONT] != null) {
+ PdfDictionary font = (PdfDictionary)PdfReader.getPdfObject(merged.get(PdfName.DR));
+ if (font != null) {
+ font = (PdfDictionary)PdfReader.getPdfObject(font.get(PdfName.FONT));
+ if (font != null) {
+ PdfObject po = font.get(new PdfName((String)dab[DA_FONT]));
+ if (po != null && po.type() == PdfObject.INDIRECT) {
+ PRIndirectReference por = (PRIndirectReference)po;
+ BaseFont bp = new DocumentFont((PRIndirectReference)po);
+ tx.setFont(bp);
+ Integer porkey = new Integer(por.getNumber());
+ BaseFont porf = (BaseFont)extensionFonts.get(porkey);
+ if (porf == null) {
+ if (!extensionFonts.containsKey(porkey)) {
+ PdfDictionary fo = (PdfDictionary)PdfReader.getPdfObject(po);
+ PdfDictionary fd = (PdfDictionary)PdfReader.getPdfObject(fo.get(PdfName.FONTDESCRIPTOR));
+ if (fd != null) {
+ PRStream prs = (PRStream)PdfReader.getPdfObject(fd.get(PdfName.FONTFILE2));
+ if (prs == null)
+ prs = (PRStream)PdfReader.getPdfObject(fd.get(PdfName.FONTFILE3));
+ if (prs == null) {
+ extensionFonts.put(porkey, null);
+ }
+ else {
+ try {
+ porf = BaseFont.createFont("font.ttf", BaseFont.IDENTITY_H, true, false, PdfReader.getStreamBytes(prs), null);
+ }
+ catch (Exception e) {
+ porf = null;
+ }
+ extensionFonts.put(porkey, porf);
+ }
+ }
+ }
+ }
+ tx.setExtensionFont(porf);
+ }
+ else {
+ BaseFont bf = (BaseFont)localFonts.get(dab[DA_FONT]);
+ if (bf == null) {
+ String fn[] = (String[])stdFieldFontNames.get(dab[DA_FONT]);
+ if (fn != null) {
+ try {
+ String enc = "winansi";
+ if (fn.length > 1)
+ enc = fn[1];
+ bf = BaseFont.createFont(fn[0], enc, false);
+ tx.setFont(bf);
+ }
+ catch (Exception e) {
+ // empty
+ }
+ }
+ }
+ else
+ tx.setFont(bf);
+ }
+ }
+ }
+ }
+ }
+ //rotation, border and backgound color
+ PdfDictionary mk = (PdfDictionary)PdfReader.getPdfObject(merged.get(PdfName.MK));
+ if (mk != null) {
+ PdfArray ar = (PdfArray)PdfReader.getPdfObject(mk.get(PdfName.BC));
+ Color border = getMKColor(ar);
+ tx.setBorderColor(border);
+ if (border != null)
+ tx.setBorderWidth(1);
+ ar = (PdfArray)PdfReader.getPdfObject(mk.get(PdfName.BG));
+ tx.setBackgroundColor(getMKColor(ar));
+ PdfNumber rotation = (PdfNumber)PdfReader.getPdfObject(mk.get(PdfName.R));
+ if (rotation != null)
+ tx.setRotation(rotation.intValue());
+ }
+ //multiline
+ PdfNumber nfl = (PdfNumber)PdfReader.getPdfObject(merged.get(PdfName.FF));
+ if (nfl != null)
+ flags = nfl.intValue();
+ tx.setOptions(((flags & PdfFormField.FF_MULTILINE) == 0 ? 0 : TextField.MULTILINE) | ((flags & PdfFormField.FF_COMB) == 0 ? 0 : TextField.COMB));
+ if ((flags & PdfFormField.FF_COMB) != 0) {
+ PdfNumber maxLen = (PdfNumber)PdfReader.getPdfObject(merged.get(PdfName.MAXLEN));
+ int len = 0;
+ if (maxLen != null)
+ len = maxLen.intValue();
+ tx.setMaxCharacterLength(len);
+ }
+ //alignment
+ nfl = (PdfNumber)PdfReader.getPdfObject(merged.get(PdfName.Q));
+ if (nfl != null) {
+ if (nfl.intValue() == PdfFormField.Q_CENTER)
+ tx.setAlignment(Element.ALIGN_CENTER);
+ else if (nfl.intValue() == PdfFormField.Q_RIGHT)
+ tx.setAlignment(Element.ALIGN_RIGHT);
+ }
+ //border styles
+ PdfDictionary bs = (PdfDictionary)PdfReader.getPdfObject(merged.get(PdfName.BS));
+ if (bs != null) {
+ PdfNumber w = (PdfNumber)PdfReader.getPdfObject(bs.get(PdfName.W));
+ if (w != null)
+ tx.setBorderWidth(w.floatValue());
+ PdfName s = (PdfName)PdfReader.getPdfObject(bs.get(PdfName.S));
+ if (PdfName.D.equals(s))
+ tx.setBorderStyle(PdfBorderDictionary.STYLE_DASHED);
+ else if (PdfName.B.equals(s))
+ tx.setBorderStyle(PdfBorderDictionary.STYLE_BEVELED);
+ else if (PdfName.I.equals(s))
+ tx.setBorderStyle(PdfBorderDictionary.STYLE_INSET);
+ else if (PdfName.U.equals(s))
+ tx.setBorderStyle(PdfBorderDictionary.STYLE_UNDERLINE);
+ }
+ else {
+ PdfArray bd = (PdfArray)PdfReader.getPdfObject(merged.get(PdfName.BORDER));
+ if (bd != null) {
+ ArrayList ar = bd.getArrayList();
+ if (ar.size() >= 3)
+ tx.setBorderWidth(((PdfNumber)ar.get(2)).floatValue());
+ if (ar.size() >= 4)
+ tx.setBorderStyle(PdfBorderDictionary.STYLE_DASHED);
+ }
+ }
+ //rect
+ PdfArray rect = (PdfArray)PdfReader.getPdfObject(merged.get(PdfName.RECT));
+ Rectangle box = PdfReader.getNormalizedRectangle(rect);
+ if (tx.getRotation() == 90 || tx.getRotation() == 270)
+ box = box.rotate();
+ tx.setBox(box);
+ if (fieldCache != null)
+ fieldCache.put(fieldName, tx);
+ }
+ else {
+ tx = (TextField)fieldCache.get(fieldName);
+ tx.setWriter(writer);
+ }
+ PdfName fieldType = (PdfName)PdfReader.getPdfObject(merged.get(PdfName.FT));
+ if (PdfName.TX.equals(fieldType)) {
+ tx.setText(text);
+ return tx.getAppearance();
+ }
+ if (!PdfName.CH.equals(fieldType))
+ throw new DocumentException("An appearance was requested without a variable text field.");
+ PdfArray opt = (PdfArray)PdfReader.getPdfObject(merged.get(PdfName.OPT));
+ if ((flags & PdfFormField.FF_COMBO) != 0 && opt == null) {
+ tx.setText(text);
+ return tx.getAppearance();
+ }
+ if (opt != null) {
+ ArrayList op = opt.getArrayList();
+ String choices[] = new String[op.size()];
+ String choicesExp[] = new String[op.size()];
+ for (int k = 0; k < op.size(); ++k) {
+ PdfObject obj = (PdfObject)op.get(k);
+ if (obj.isString()) {
+ choices[k] = choicesExp[k] = ((PdfString)obj).toUnicodeString();
+ }
+ else {
+ ArrayList opar = ((PdfArray)obj).getArrayList();
+ choicesExp[k] = ((PdfString)opar.get(0)).toUnicodeString();
+ choices[k] = ((PdfString)opar.get(1)).toUnicodeString();
+ }
+ }
+ if ((flags & PdfFormField.FF_COMBO) != 0) {
+ for (int k = 0; k < choices.length; ++k) {
+ if (text.equals(choicesExp[k])) {
+ text = choices[k];
+ break;
+ }
+ }
+ tx.setText(text);
+ return tx.getAppearance();
+ }
+ int idx = 0;
+ for (int k = 0; k < choicesExp.length; ++k) {
+ if (text.equals(choicesExp[k])) {
+ idx = k;
+ break;
+ }
+ }
+ tx.setChoices(choices);
+ tx.setChoiceExports(choicesExp);
+ tx.setChoiceSelection(idx);
+ }
+ PdfAppearance app = tx.getListAppearance();
+ topFirst = tx.getTopFirst();
+ return app;
+ }
+
+ Color getMKColor(PdfArray ar) {
+ if (ar == null)
+ return null;
+ ArrayList cc = ar.getArrayList();
+ switch (cc.size()) {
+ case 1:
+ return new GrayColor(((PdfNumber)cc.get(0)).floatValue());
+ case 3:
+ return new Color(((PdfNumber)cc.get(0)).floatValue(), ((PdfNumber)cc.get(1)).floatValue(), ((PdfNumber)cc.get(2)).floatValue());
+ case 4:
+ return new CMYKColor(((PdfNumber)cc.get(0)).floatValue(), ((PdfNumber)cc.get(1)).floatValue(), ((PdfNumber)cc.get(2)).floatValue(), ((PdfNumber)cc.get(3)).floatValue());
+ default:
+ return null;
+ }
+ }
+
+ /** Gets the field value.
+ * @param name the fully qualified field name
+ * @return the field value
+ */
+ public String getField(String name) {
+ Item item = (Item)fields.get(name);
+ if (item == null)
+ return null;
+ lastWasString = false;
+ PdfObject v = PdfReader.getPdfObject(((PdfDictionary)item.merged.get(0)).get(PdfName.V));
+ if (v == null)
+ return "";
+ PdfName type = (PdfName)PdfReader.getPdfObject(((PdfDictionary)item.merged.get(0)).get(PdfName.FT));
+ if (PdfName.BTN.equals(type)) {
+ PdfNumber ff = (PdfNumber)PdfReader.getPdfObject(((PdfDictionary)item.merged.get(0)).get(PdfName.FF));
+ int flags = 0;
+ if (ff != null)
+ flags = ff.intValue();
+ if ((flags & PdfFormField.FF_PUSHBUTTON) != 0)
+ return "";
+ String value = "";
+ if (v.isName())
+ value = PdfName.decodeName(v.toString());
+ else if (v.isString())
+ value = ((PdfString)v).toUnicodeString();
+ PdfObject opts = PdfReader.getPdfObject(((PdfDictionary)item.values.get(0)).get(PdfName.OPT));
+ if (opts != null && opts.isArray()) {
+ ArrayList list = ((PdfArray)opts).getArrayList();
+ int idx = 0;
+ try {
+ idx = Integer.parseInt(value);
+ PdfString ps = (PdfString)list.get(idx);
+ value = ps.toUnicodeString();
+ lastWasString = true;
+ }
+ catch (Exception e) {
+ }
+ }
+ return value;
+ }
+ if (v.isString()) {
+ lastWasString = true;
+ return ((PdfString)v).toUnicodeString();
+ }
+ return PdfName.decodeName(v.toString());
+ }
+
+ /**
+ * Sets a field property. Valid property names are:
+ * <p>
+ * <ul>
+ * <li>textfont - sets the text font. The value for this entry is a <CODE>BaseFont</CODE>.<br>
+ * <li>textcolor - sets the text color. The value for this entry is a <CODE>java.awt.Color</CODE>.<br>
+ * <li>textsize - sets the text size. The value for this entry is a <CODE>Float</CODE>.
+ * <li>bgcolor - sets the background color. The value for this entry is a <CODE>java.awt.Color</CODE>.
+ * If <code>null</code> removes the background.<br>
+ * <li>bordercolor - sets the border color. The value for this entry is a <CODE>java.awt.Color</CODE>.
+ * If <code>null</code> removes the border.<br>
+ * </ul>
+ * @param field the field name
+ * @param name the property name
+ * @param value the property value
+ * @param inst an array of <CODE>int</CODE> indexing into <CODE>AcroField.Item.merged</CODE> elements to process.
+ * Set to <CODE>null</CODE> to process all
+ * @return <CODE>true</CODE> if the property exists, <CODE>false</CODE> otherwise
+ */
+ public boolean setFieldProperty(String field, String name, Object value, int inst[]) {
+ if (writer == null)
+ throw new RuntimeException("This AcroFields instance is read-only.");
+ try {
+ Item item = (Item)fields.get(field);
+ if (item == null)
+ return false;
+ InstHit hit = new InstHit(inst);
+ if (name.equalsIgnoreCase("textfont")) {
+ for (int k = 0; k < item.merged.size(); ++k) {
+ if (hit.isHit(k)) {
+ PdfString da = (PdfString)PdfReader.getPdfObject(((PdfDictionary)item.merged.get(k)).get(PdfName.DA));
+ PdfDictionary dr = (PdfDictionary)PdfReader.getPdfObject(((PdfDictionary)item.merged.get(k)).get(PdfName.DR));
+ if (da != null && dr != null) {
+ Object dao[] = splitDAelements(da.toUnicodeString());
+ PdfAppearance cb = new PdfAppearance();
+ if (dao[DA_FONT] != null) {
+ BaseFont bf = (BaseFont)value;
+ PdfName psn = (PdfName)PdfAppearance.stdFieldFontNames.get(bf.getPostscriptFontName());
+ if (psn == null) {
+ psn = new PdfName(bf.getPostscriptFontName());
+ }
+ PdfDictionary fonts = (PdfDictionary)PdfReader.getPdfObject(dr.get(PdfName.FONT));
+ if (fonts == null) {
+ fonts = new PdfDictionary();
+ dr.put(PdfName.FONT, fonts);
+ }
+ PdfIndirectReference fref = (PdfIndirectReference)fonts.get(psn);
+ PdfDictionary top = (PdfDictionary)PdfReader.getPdfObject(reader.getCatalog().get(PdfName.ACROFORM));
+ markUsed(top);
+ dr = (PdfDictionary)PdfReader.getPdfObject(top.get(PdfName.DR));
+ if (dr == null) {
+ dr = new PdfDictionary();
+ top.put(PdfName.DR, dr);
+ }
+ markUsed(dr);
+ PdfDictionary fontsTop = (PdfDictionary)PdfReader.getPdfObject(dr.get(PdfName.FONT));
+ if (fontsTop == null) {
+ fontsTop = new PdfDictionary();
+ dr.put(PdfName.FONT, fontsTop);
+ }
+ markUsed(fontsTop);
+ PdfIndirectReference frefTop = (PdfIndirectReference)fontsTop.get(psn);
+ if (frefTop != null) {
+ if (fref == null)
+ fonts.put(psn, frefTop);
+ }
+ else if (fref == null) {
+ FontDetails fd;
+ if (bf.getFontType() == BaseFont.FONT_TYPE_DOCUMENT) {
+ fd = new FontDetails(null, ((DocumentFont)bf).getIndirectReference(), bf);
+ }
+ else {
+ bf.setSubset(false);
+ fd = writer.addSimple(bf);
+ localFonts.put(psn.toString().substring(1), bf);
+ }
+ fontsTop.put(psn, fd.getIndirectReference());
+ fonts.put(psn, fd.getIndirectReference());
+ }
+ ByteBuffer buf = cb.getInternalBuffer();
+ buf.append(psn.getBytes()).append(' ').append(((Float)dao[DA_SIZE]).floatValue()).append(" Tf ");
+ if (dao[DA_COLOR] != null)
+ cb.setColorFill((Color)dao[DA_COLOR]);
+ PdfString s = new PdfString(cb.toString());
+ ((PdfDictionary)item.merged.get(k)).put(PdfName.DA, s);
+ ((PdfDictionary)item.widgets.get(k)).put(PdfName.DA, s);
+ markUsed((PdfDictionary)item.widgets.get(k));
+ }
+ }
+ }
+ }
+ }
+ else if (name.equalsIgnoreCase("textcolor")) {
+ for (int k = 0; k < item.merged.size(); ++k) {
+ if (hit.isHit(k)) {
+ PdfString da = (PdfString)PdfReader.getPdfObject(((PdfDictionary)item.merged.get(k)).get(PdfName.DA));
+ if (da != null) {
+ Object dao[] = splitDAelements(da.toUnicodeString());
+ PdfAppearance cb = new PdfAppearance();
+ if (dao[DA_FONT] != null) {
+ ByteBuffer buf = cb.getInternalBuffer();
+ buf.append(new PdfName((String)dao[DA_FONT]).getBytes()).append(' ').append(((Float)dao[DA_SIZE]).floatValue()).append(" Tf ");
+ cb.setColorFill((Color)value);
+ PdfString s = new PdfString(cb.toString());
+ ((PdfDictionary)item.merged.get(k)).put(PdfName.DA, s);
+ ((PdfDictionary)item.widgets.get(k)).put(PdfName.DA, s);
+ markUsed((PdfDictionary)item.widgets.get(k));
+ }
+ }
+ }
+ }
+ }
+ else if (name.equalsIgnoreCase("textsize")) {
+ for (int k = 0; k < item.merged.size(); ++k) {
+ if (hit.isHit(k)) {
+ PdfString da = (PdfString)PdfReader.getPdfObject(((PdfDictionary)item.merged.get(k)).get(PdfName.DA));
+ if (da != null) {
+ Object dao[] = splitDAelements(da.toUnicodeString());
+ PdfAppearance cb = new PdfAppearance();
+ if (dao[DA_FONT] != null) {
+ ByteBuffer buf = cb.getInternalBuffer();
+ buf.append(new PdfName((String)dao[DA_FONT]).getBytes()).append(' ').append(((Float)value).floatValue()).append(" Tf ");
+ if (dao[DA_COLOR] != null)
+ cb.setColorFill((Color)dao[DA_COLOR]);
+ PdfString s = new PdfString(cb.toString());
+ ((PdfDictionary)item.merged.get(k)).put(PdfName.DA, s);
+ ((PdfDictionary)item.widgets.get(k)).put(PdfName.DA, s);
+ markUsed((PdfDictionary)item.widgets.get(k));
+ }
+ }
+ }
+ }
+ }
+ else if (name.equalsIgnoreCase("bgcolor") || name.equalsIgnoreCase("bordercolor")) {
+ PdfName dname = (name.equalsIgnoreCase("bgcolor") ? PdfName.BG : PdfName.BC);
+ for (int k = 0; k < item.merged.size(); ++k) {
+ if (hit.isHit(k)) {
+ PdfObject obj = PdfReader.getPdfObject(((PdfDictionary)item.merged.get(k)).get(PdfName.MK));
+ markUsed(obj);
+ PdfDictionary mk = (PdfDictionary)obj;
+ if (mk == null) {
+ if (value == null)
+ return true;
+ mk = new PdfDictionary();
+ ((PdfDictionary)item.merged.get(k)).put(PdfName.MK, mk);
+ ((PdfDictionary)item.widgets.get(k)).put(PdfName.MK, mk);
+ markUsed((PdfDictionary)item.widgets.get(k));
+ }
+ if (value == null)
+ mk.remove(dname);
+ else
+ mk.put(dname, PdfFormField.getMKColor((Color)value));
+ }
+ }
+ }
+ else
+ return false;
+ return true;
+ }
+ catch (Exception e) {
+ throw new ExceptionConverter(e);
+ }
+ }
+
+ /**
+ * Sets a field property. Valid property names are:
+ * <p>
+ * <ul>
+ * <li>flags - a set of flags specifying various characteristics of the field’s widget annotation.
+ * The value of this entry replaces that of the F entry in the form’s corresponding annotation dictionary.<br>
+ * <li>setflags - a set of flags to be set (turned on) in the F entry of the form’s corresponding
+ * widget annotation dictionary. Bits equal to 1 cause the corresponding bits in F to be set to 1.<br>
+ * <li>clrflags - a set of flags to be cleared (turned off) in the F entry of the form’s corresponding
+ * widget annotation dictionary. Bits equal to 1 cause the corresponding
+ * bits in F to be set to 0.<br>
+ * <li>fflags - a set of flags specifying various characteristics of the field. The value
+ * of this entry replaces that of the Ff entry in the form’s corresponding field dictionary.<br>
+ * <li>setfflags - a set of flags to be set (turned on) in the Ff entry of the form’s corresponding
+ * field dictionary. Bits equal to 1 cause the corresponding bits in Ff to be set to 1.<br>
+ * <li>clrfflags - a set of flags to be cleared (turned off) in the Ff entry of the form’s corresponding
+ * field dictionary. Bits equal to 1 cause the corresponding bits in Ff
+ * to be set to 0.<br>
+ * </ul>
+ * @param field the field name
+ * @param name the property name
+ * @param value the property value
+ * @param inst an array of <CODE>int</CODE> indexing into <CODE>AcroField.Item.merged</CODE> elements to process.
+ * Set to <CODE>null</CODE> to process all
+ * @return <CODE>true</CODE> if the property exists, <CODE>false</CODE> otherwise
+ */
+ public boolean setFieldProperty(String field, String name, int value, int inst[]) {
+ if (writer == null)
+ throw new RuntimeException("This AcroFields instance is read-only.");
+ Item item = (Item)fields.get(field);
+ if (item == null)
+ return false;
+ InstHit hit = new InstHit(inst);
+ if (name.equalsIgnoreCase("flags")) {
+ PdfNumber num = new PdfNumber(value);
+ for (int k = 0; k < item.merged.size(); ++k) {
+ if (hit.isHit(k)) {
+ ((PdfDictionary)item.merged.get(k)).put(PdfName.F, num);
+ ((PdfDictionary)item.widgets.get(k)).put(PdfName.F, num);
+ markUsed((PdfDictionary)item.widgets.get(k));
+ }
+ }
+ }
+ else if (name.equalsIgnoreCase("setflags")) {
+ for (int k = 0; k < item.merged.size(); ++k) {
+ if (hit.isHit(k)) {
+ PdfNumber num = (PdfNumber)PdfReader.getPdfObject(((PdfDictionary)item.widgets.get(k)).get(PdfName.F));
+ int val = 0;
+ if (num != null)
+ val = num.intValue();
+ num = new PdfNumber(val | value);
+ ((PdfDictionary)item.merged.get(k)).put(PdfName.F, num);
+ ((PdfDictionary)item.widgets.get(k)).put(PdfName.F, num);
+ markUsed((PdfDictionary)item.widgets.get(k));
+ }
+ }
+ }
+ else if (name.equalsIgnoreCase("clrflags")) {
+ for (int k = 0; k < item.merged.size(); ++k) {
+ if (hit.isHit(k)) {
+ PdfNumber num = (PdfNumber)PdfReader.getPdfObject(((PdfDictionary)item.widgets.get(k)).get(PdfName.F));
+ int val = 0;
+ if (num != null)
+ val = num.intValue();
+ num = new PdfNumber(val & (~value));
+ ((PdfDictionary)item.merged.get(k)).put(PdfName.F, num);
+ ((PdfDictionary)item.widgets.get(k)).put(PdfName.F, num);
+ markUsed((PdfDictionary)item.widgets.get(k));
+ }
+ }
+ }
+ else if (name.equalsIgnoreCase("fflags")) {
+ PdfNumber num = new PdfNumber(value);
+ for (int k = 0; k < item.merged.size(); ++k) {
+ if (hit.isHit(k)) {
+ ((PdfDictionary)item.merged.get(k)).put(PdfName.FF, num);
+ ((PdfDictionary)item.values.get(k)).put(PdfName.FF, num);
+ markUsed((PdfDictionary)item.values.get(k));
+ }
+ }
+ }
+ else if (name.equalsIgnoreCase("setfflags")) {
+ for (int k = 0; k < item.merged.size(); ++k) {
+ if (hit.isHit(k)) {
+ PdfNumber num = (PdfNumber)PdfReader.getPdfObject(((PdfDictionary)item.values.get(k)).get(PdfName.FF));
+ int val = 0;
+ if (num != null)
+ val = num.intValue();
+ num = new PdfNumber(val | value);
+ ((PdfDictionary)item.merged.get(k)).put(PdfName.FF, num);
+ ((PdfDictionary)item.values.get(k)).put(PdfName.FF, num);
+ markUsed((PdfDictionary)item.values.get(k));
+ }
+ }
+ }
+ else if (name.equalsIgnoreCase("clrfflags")) {
+ for (int k = 0; k < item.merged.size(); ++k) {
+ if (hit.isHit(k)) {
+ PdfNumber num = (PdfNumber)PdfReader.getPdfObject(((PdfDictionary)item.values.get(k)).get(PdfName.FF));
+ int val = 0;
+ if (num != null)
+ val = num.intValue();
+ num = new PdfNumber(val & (~value));
+ ((PdfDictionary)item.merged.get(k)).put(PdfName.FF, num);
+ ((PdfDictionary)item.values.get(k)).put(PdfName.FF, num);
+ markUsed((PdfDictionary)item.values.get(k));
+ }
+ }
+ }
+ else
+ return false;
+ return true;
+ }
+
+ /** Sets the fields by FDF merging.
+ * @param fdf the FDF form
+ * @throws IOException on error
+ * @throws DocumentException on error
+ */
+ public void setFields(FdfReader fdf) throws IOException, DocumentException {
+ HashMap fd = fdf.getFields();
+ for (Iterator i = fd.keySet().iterator(); i.hasNext();) {
+ String f = (String)i.next();
+ String v = fdf.getFieldValue(f);
+ if (v != null)
+ setField(f, v);
+ }
+ }
+
+ /** Sets the fields by XFDF merging.
+ * @param xfdf the XFDF form
+ * @throws IOException on error
+ * @throws DocumentException on error
+ */
+
+ public void setFields(XfdfReader xfdf) throws IOException, DocumentException {
+ HashMap fd = xfdf.getFields();
+ for (Iterator i = fd.keySet().iterator(); i.hasNext();) {
+ String f = (String)i.next();
+ String v = xfdf.getFieldValue(f);
+ if (v != null)
+ setField(f, v);
+ }
+ }
+
+ /** Sets the field value.
+ * @param name the fully qualified field name
+ * @param value the field value
+ * @throws IOException on error
+ * @throws DocumentException on error
+ * @return <CODE>true</CODE> if the field was found and changed,
+ * <CODE>false</CODE> otherwise
+ */
+ public boolean setField(String name, String value) throws IOException, DocumentException {
+ return setField(name, value, value);
+ }
+
+ /** Sets the field value and the display string. The display string
+ * is used to build the appearance in the cases where the value
+ * is modified by Acrobat with JavaScript and the algorithm is
+ * known.
+ * @param name the fully qualified field name
+ * @param value the field value
+ * @param display the string that is used for the appearance
+ * @return <CODE>true</CODE> if the field was found and changed,
+ * <CODE>false</CODE> otherwise
+ * @throws IOException on error
+ * @throws DocumentException on error
+ */
+ public boolean setField(String name, String value, String display) throws IOException, DocumentException {
+ if (writer == null)
+ throw new DocumentException("This AcroFields instance is read-only.");
+ Item item = (Item)fields.get(name);
+ if (item == null)
+ return false;
+ PdfName type = (PdfName)PdfReader.getPdfObject(((PdfDictionary)item.merged.get(0)).get(PdfName.FT));
+ if (PdfName.TX.equals(type)) {
+ PdfNumber maxLen = (PdfNumber)PdfReader.getPdfObject(((PdfDictionary)item.merged.get(0)).get(PdfName.MAXLEN));
+ int len = 0;
+ if (maxLen != null)
+ len = maxLen.intValue();
+ if (len > 0)
+ value = value.substring(0, Math.min(len, value.length()));
+ }
+ if (PdfName.TX.equals(type) || PdfName.CH.equals(type)) {
+ PdfString v = new PdfString(value, PdfObject.TEXT_UNICODE);
+ for (int idx = 0; idx < item.values.size(); ++idx) {
+ PdfDictionary valueDic = (PdfDictionary)item.values.get(idx);
+ valueDic.put(PdfName.V, v);
+ valueDic.remove(PdfName.I);
+ markUsed(valueDic);
+ PdfDictionary merged = (PdfDictionary)item.merged.get(idx);
+ merged.remove(PdfName.I);
+ merged.put(PdfName.V, v);
+ PdfDictionary widget = (PdfDictionary)item.widgets.get(idx);
+ if (generateAppearances) {
+ PdfAppearance app = getAppearance(merged, display, name);
+ if (PdfName.CH.equals(type)) {
+ PdfNumber n = new PdfNumber(topFirst);
+ widget.put(PdfName.TI, n);
+ merged.put(PdfName.TI, n);
+ }
+ PdfDictionary appDic = (PdfDictionary)PdfReader.getPdfObject(widget.get(PdfName.AP));
+ if (appDic == null) {
+ appDic = new PdfDictionary();
+ widget.put(PdfName.AP, appDic);
+ merged.put(PdfName.AP, appDic);
+ }
+ appDic.put(PdfName.N, app.getIndirectReference());
+ writer.releaseTemplate(app);
+ }
+ else {
+ widget.remove(PdfName.AP);
+ merged.remove(PdfName.AP);
+ }
+ markUsed(widget);
+ }
+ return true;
+ }
+ else if (PdfName.BTN.equals(type)) {
+ PdfNumber ff = (PdfNumber)PdfReader.getPdfObject(((PdfDictionary)item.merged.get(0)).get(PdfName.FF));
+ int flags = 0;
+ if (ff != null)
+ flags = ff.intValue();
+ if ((flags & PdfFormField.FF_PUSHBUTTON) != 0)
+ return true;
+ PdfName v = new PdfName(value);
+ if ((flags & PdfFormField.FF_RADIO) == 0) {
+ for (int idx = 0; idx < item.values.size(); ++idx) {
+ ((PdfDictionary)item.values.get(idx)).put(PdfName.V, v);
+ markUsed((PdfDictionary)item.values.get(idx));
+ PdfDictionary merged = (PdfDictionary)item.merged.get(idx);
+ merged.put(PdfName.V, v);
+ merged.put(PdfName.AS, v);
+ PdfDictionary widget = (PdfDictionary)item.widgets.get(idx);
+ if (isInAP(widget, v))
+ widget.put(PdfName.AS, v);
+ else
+ widget.put(PdfName.AS, PdfName.Off);
+ markUsed(widget);
+ }
+ }
+ else {
+ ArrayList lopt = new ArrayList();
+ PdfObject opts = PdfReader.getPdfObject(((PdfDictionary)item.values.get(0)).get(PdfName.OPT));
+ if (opts != null && opts.isArray()) {
+ ArrayList list = ((PdfArray)opts).getArrayList();
+ for (int k = 0; k < list.size(); ++k) {
+ PdfObject vv = PdfReader.getPdfObject((PdfObject)list.get(k));
+ if (vv != null && vv.isString())
+ lopt.add(((PdfString)vv).toUnicodeString());
+ else
+ lopt.add(null);
+ }
+ }
+ int vidx = lopt.indexOf(value);
+ PdfName valt = null;
+ PdfName vt;
+ if (vidx >= 0) {
+ vt = valt = new PdfName(String.valueOf(vidx));
+ }
+ else
+ vt = v;
+ for (int idx = 0; idx < item.values.size(); ++idx) {
+ PdfDictionary merged = (PdfDictionary)item.merged.get(idx);
+ PdfDictionary widget = (PdfDictionary)item.widgets.get(idx);
+ markUsed((PdfDictionary)item.values.get(idx));
+ if (valt != null) {
+ PdfString ps = new PdfString(value, PdfObject.TEXT_UNICODE);
+ ((PdfDictionary)item.values.get(idx)).put(PdfName.V, ps);
+ merged.put(PdfName.V, ps);
+ }
+ else {
+ ((PdfDictionary)item.values.get(idx)).put(PdfName.V, v);
+ merged.put(PdfName.V, v);
+ }
+ markUsed(widget);
+ if (isInAP(widget, vt)) {
+ merged.put(PdfName.AS, vt);
+ widget.put(PdfName.AS, vt);
+ }
+ else {
+ merged.put(PdfName.AS, PdfName.Off);
+ widget.put(PdfName.AS, PdfName.Off);
+ }
+ }
+ }
+ return true;
+ }
+ return false;
+ }
+
+ boolean isInAP(PdfDictionary dic, PdfName check) {
+ PdfDictionary appDic = (PdfDictionary)PdfReader.getPdfObject(dic.get(PdfName.AP));
+ if (appDic == null)
+ return false;
+ PdfDictionary NDic = (PdfDictionary)PdfReader.getPdfObject(appDic.get(PdfName.N));
+ return (NDic != null && NDic.get(check) != null);
+ }
+
+ /** Gets all the fields. The fields are keyed by the fully qualified field name and
+ * the value is an instance of <CODE>AcroFields.Item</CODE>.
+ * @return all the fields
+ */
+ public HashMap getFields() {
+ return fields;
+ }
+
+ /**
+ * Gets the field structure.
+ * @param name the name of the field
+ * @return the field structure or <CODE>null</CODE> if the field
+ * does not exist
+ */
+ public Item getFieldItem(String name) {
+ return (Item)fields.get(name);
+ }
+
+ /**
+ * Gets the field box positions in the document. The return is an array of <CODE>float</CODE>
+ * multiple of 5. For each of this groups the values are: [page, llx, lly, urx,
+ * ury].
+ * @param name the field name
+ * @return the positions or <CODE>null</CODE> if field does not exist
+ */
+ public float[] getFieldPositions(String name) {
+ Item item = (Item)fields.get(name);
+ if (item == null)
+ return null;
+ float ret[] = new float[item.page.size() * 5];
+ int ptr = 0;
+ for (int k = 0; k < item.page.size(); ++k) {
+ try {
+ PdfDictionary wd = (PdfDictionary)item.widgets.get(k);
+ PdfArray rect = (PdfArray)wd.get(PdfName.RECT);
+ if (rect == null)
+ continue;
+ Rectangle r = PdfReader.getNormalizedRectangle(rect);
+ ret[ptr] = ((Integer)item.page.get(k)).floatValue();
+ ++ptr;
+ ret[ptr++] = r.left();
+ ret[ptr++] = r.bottom();
+ ret[ptr++] = r.right();
+ ret[ptr++] = r.top();
+ }
+ catch (Exception e) {
+ // empty on purpose
+ }
+ }
+ if (ptr < ret.length) {
+ float ret2[] = new float[ptr];
+ System.arraycopy(ret, 0, ret2, 0, ptr);
+ return ret2;
+ }
+ return ret;
+ }
+
+ private int removeRefFromArray(PdfArray array, PdfObject refo) {
+ ArrayList ar = array.getArrayList();
+ if (refo == null || !refo.isIndirect())
+ return ar.size();
+ PdfIndirectReference ref = (PdfIndirectReference)refo;
+ for (int j = 0; j < ar.size(); ++j) {
+ PdfObject obj = (PdfObject)ar.get(j);
+ if (!obj.isIndirect())
+ continue;
+ if (((PdfIndirectReference)obj).getNumber() == ref.getNumber())
+ ar.remove(j--);
+ }
+ return ar.size();
+ }
+
+ /**
+ * Removes all the fields from <CODE>page</CODE>.
+ * @param page the page to remove the fields from
+ * @return <CODE>true</CODE> if any field was removed, <CODE>false otherwise</CODE>
+ */
+ public boolean removeFieldsFromPage(int page) {
+ if (page < 1)
+ return false;
+ String names[] = new String[fields.size()];
+ fields.keySet().toArray(names);
+ boolean found = false;
+ for (int k = 0; k < names.length; ++k) {
+ boolean fr = removeField(names[k], page);
+ found = (found || fr);
+ }
+ return found;
+ }
+
+ /**
+ * Removes a field from the document. If page equals -1 all the fields with this
+ * <CODE>name</CODE> are removed from the document otherwise only the fields in
+ * that particular page are removed.
+ * @param name the field name
+ * @param page the page to remove the field from or -1 to remove it from all the pages
+ * @return <CODE>true</CODE> if the field exists, <CODE>false otherwise</CODE>
+ */
+ public boolean removeField(String name, int page) {
+ Item item = (Item)fields.get(name);
+ if (item == null)
+ return false;
+ PdfDictionary acroForm = (PdfDictionary)PdfReader.getPdfObject(reader.getCatalog().get(PdfName.ACROFORM), reader.getCatalog());
+
+ if (acroForm == null)
+ return false;
+ PdfArray arrayf = (PdfArray)PdfReader.getPdfObject(acroForm.get(PdfName.FIELDS), acroForm);
+ if (arrayf == null)
+ return false;
+ for (int k = 0; k < item.widget_refs.size(); ++k) {
+ int pageV = ((Integer)item.page.get(k)).intValue();
+ if (page != -1 && page != pageV)
+ continue;
+ PdfIndirectReference ref = (PdfIndirectReference)item.widget_refs.get(k);
+ PdfDictionary wd = (PdfDictionary)PdfReader.getPdfObject(ref);
+ PdfDictionary pageDic = reader.getPageN(pageV);
+ PdfArray annots = (PdfArray)PdfReader.getPdfObject(pageDic.get(PdfName.ANNOTS), pageDic);
+ if (annots != null) {
+ if (removeRefFromArray(annots, ref) == 0) {
+ pageDic.remove(PdfName.ANNOTS);
+ markUsed(pageDic);
+ }
+ else
+ markUsed(annots);
+ }
+ PdfReader.killIndirect(ref);
+ PdfIndirectReference kid = ref;
+ while ((ref = (PdfIndirectReference)wd.get(PdfName.PARENT)) != null) {
+ wd = (PdfDictionary)PdfReader.getPdfObject(ref);
+ PdfArray kids = (PdfArray)PdfReader.getPdfObject(wd.get(PdfName.KIDS));
+ if (removeRefFromArray(kids, kid) != 0)
+ break;
+ kid = ref;
+ PdfReader.killIndirect(ref);
+ }
+ if (ref == null) {
+ removeRefFromArray(arrayf, kid);
+ markUsed(arrayf);
+ }
+ if (page != -1) {
+ item.merged.remove(k);
+ item.page.remove(k);
+ item.values.remove(k);
+ item.widget_refs.remove(k);
+ item.widgets.remove(k);
+ --k;
+ }
+ }
+ if (page == -1 || item.merged.size() == 0)
+ fields.remove(name);
+ return true;
+ }
+
+ /**
+ * Removes a field from the document.
+ * @param name the field name
+ * @return <CODE>true</CODE> if the field exists, <CODE>false otherwise</CODE>
+ */
+ public boolean removeField(String name) {
+ return removeField(name, -1);
+ }
+
+ /** Gets the property generateAppearances.
+ * @return the property generateAppearances
+ */
+ public boolean isGenerateAppearances() {
+ return this.generateAppearances;
+ }
+
+ /** Sets the option to generate appearances. Not generating apperances
+ * will speed-up form filling but the results can be
+ * unexpected in Acrobat. Don't use it unless your environment is well
+ * controlled. The default is <CODE>true</CODE>.
+ * @param generateAppearances the option to generate appearances
+ */
+ public void setGenerateAppearances(boolean generateAppearances) {
+ this.generateAppearances = generateAppearances;
+ PdfDictionary top = (PdfDictionary)PdfReader.getPdfObject(reader.getCatalog().get(PdfName.ACROFORM));
+ if (generateAppearances)
+ top.remove(PdfName.NEEDAPPEARANCES);
+ else
+ top.put(PdfName.NEEDAPPEARANCES, PdfBoolean.PDFTRUE);
+ }
+
+ /** The field representations for retrieval and modification. */
+ public static class Item {
+ /** An array of <CODE>PdfDictionary</CODE> where the value tag /V
+ * is present.
+ */
+ public ArrayList values = new ArrayList();
+ /** An array of <CODE>PdfDictionary</CODE> with the widgets.
+ */
+ public ArrayList widgets = new ArrayList();
+ /** An array of <CODE>PdfDictionary</CODE> with the widget references.
+ */
+ public ArrayList widget_refs = new ArrayList();
+ /** An array of <CODE>PdfDictionary</CODE> with all the field
+ * and widget tags merged.
+ */
+ public ArrayList merged = new ArrayList();
+ /** An array of <CODE>Integer</CODE> with the page numbers where
+ * the widgets are displayed.
+ */
+ public ArrayList page = new ArrayList();
+ /** An array of <CODE>Integer</CODE> with the tab order of the field in the page.
+ */
+ public ArrayList tabOrder = new ArrayList();
+ }
+
+ private static class InstHit {
+ IntHashtable hits;
+ public InstHit(int inst[]) {
+ if (inst == null)
+ return;
+ hits = new IntHashtable();
+ for (int k = 0; k < inst.length; ++k)
+ hits.put(inst[k], 1);
+ }
+
+ public boolean isHit(int n) {
+ if (hits == null)
+ return true;
+ return hits.containsKey(n);
+ }
+ }
+
+ /**
+ * Gets the field names that have signatures and are signed.
+ * @return the field names that have signatures and are signed
+ */
+ public ArrayList getSignatureNames() {
+ if (sigNames != null)
+ return new ArrayList(sigNames.keySet());
+ sigNames = new HashMap();
+ ArrayList sorter = new ArrayList();
+ for (Iterator it = fields.entrySet().iterator(); it.hasNext();) {
+ Map.Entry entry = (Map.Entry)it.next();
+ Item item = (Item)entry.getValue();
+ PdfDictionary merged = (PdfDictionary)item.merged.get(0);
+ if (!PdfName.SIG.equals(merged.get(PdfName.FT)))
+ continue;
+ PdfObject vo = PdfReader.getPdfObject(merged.get(PdfName.V));
+ if (vo == null || vo.type() != PdfObject.DICTIONARY)
+ continue;
+ PdfDictionary v = (PdfDictionary)vo;
+ PdfObject contents = v.get(PdfName.CONTENTS);
+ if (contents == null || contents.type() != PdfObject.STRING)
+ continue;
+ PdfObject ro = v.get(PdfName.BYTERANGE);
+ if (ro == null || ro.type() != PdfObject.ARRAY)
+ continue;
+ ArrayList ra = ((PdfArray)ro).getArrayList();
+ if (ra.size() < 2)
+ continue;
+ int length = ((PdfNumber)ra.get(ra.size() - 1)).intValue() + ((PdfNumber)ra.get(ra.size() - 2)).intValue();
+ sorter.add(new Object[]{entry.getKey(), new int[]{length, 0}});
+ }
+ Collections.sort(sorter, new AcroFields.SorterComparator());
+ if (sorter.size() > 0) {
+ if (((int[])((Object[])sorter.get(sorter.size() - 1))[1])[0] == reader.getFileLength())
+ totalRevisions = sorter.size();
+ else
+ totalRevisions = sorter.size() + 1;
+ for (int k = 0; k < sorter.size(); ++k) {
+ Object objs[] = (Object[])sorter.get(k);
+ String name = (String)objs[0];
+ int p[] = (int[])objs[1];
+ p[1] = k + 1;
+ sigNames.put(name, p);
+ }
+ }
+ return new ArrayList(sigNames.keySet());
+ }
+
+ /**
+ * Gets the field names that have blank signatures.
+ * @return the field names that have blank signatures
+ */
+ public ArrayList getBlankSignatureNames() {
+ getSignatureNames();
+ ArrayList sigs = new ArrayList();
+ for (Iterator it = fields.entrySet().iterator(); it.hasNext();) {
+ Map.Entry entry = (Map.Entry)it.next();
+ Item item = (Item)entry.getValue();
+ PdfDictionary merged = (PdfDictionary)item.merged.get(0);
+ if (!PdfName.SIG.equals(merged.get(PdfName.FT)))
+ continue;
+ if (sigNames.containsKey(entry.getKey()))
+ continue;
+ sigs.add(entry.getKey());
+ }
+ return sigs;
+ }
+
+ /**
+ * Gets the signature dictionary, the one keyed by /V.
+ * @param name the field name
+ * @return the signature dictionary keyed by /V or <CODE>null</CODE> if the field is not
+ * a signature
+ */
+ public PdfDictionary getSignatureDictionary(String name) {
+ getSignatureNames();
+ if (!sigNames.containsKey(name))
+ return null;
+ Item item = (Item)fields.get(name);
+ PdfDictionary merged = (PdfDictionary)item.merged.get(0);
+ return (PdfDictionary)PdfReader.getPdfObject(merged.get(PdfName.V));
+ }
+
+ /**
+ * Checks is the signature covers the entire document or just part of it.
+ * @param name the signature field name
+ * @return <CODE>true</CODE> if the signature covers the entire document,
+ * <CODE>false</CODE> otherwise
+ */
+ public boolean signatureCoversWholeDocument(String name) {
+ getSignatureNames();
+ if (!sigNames.containsKey(name))
+ return false;
+ return ((int[])sigNames.get(name))[0] == reader.getFileLength();
+ }
+
+ /**
+ * Verifies a signature. An example usage is:
+ * <p>
+ * <pre>
+ * KeyStore kall = PdfPKCS7.loadCacertsKeyStore();
+ * PdfReader reader = new PdfReader("my_signed_doc.pdf");
+ * AcroFields af = reader.getAcroFields();
+ * ArrayList names = af.getSignatureNames();
+ * for (int k = 0; k &lt; names.size(); ++k) {
+ * String name = (String)names.get(k);
+ * System.out.println("Signature name: " + name);
+ * System.out.println("Signature covers whole document: " + af.signatureCoversWholeDocument(name));
+ * PdfPKCS7 pk = af.verifySignature(name);
+ * Calendar cal = pk.getSignDate();
+ * Certificate pkc[] = pk.getCertificates();
+ * System.out.println("Subject: " + PdfPKCS7.getSubjectFields(pk.getSigningCertificate()));
+ * System.out.println("Document modified: " + !pk.verify());
+ * Object fails[] = PdfPKCS7.verifyCertificates(pkc, kall, null, cal);
+ * if (fails == null)
+ * System.out.println("Certificates verified against the KeyStore");
+ * else
+ * System.out.println("Certificate failed: " + fails[1]);
+ * }
+ * </pre>
+ * @param name the signature field name
+ * @return a <CODE>PdfPKCS7</CODE> class to continue the verification
+ */
+ public PdfPKCS7 verifySignature(String name) {
+ return verifySignature(name, null);
+ }
+
+ /**
+ * Verifies a signature. An example usage is:
+ * <p>
+ * <pre>
+ * KeyStore kall = PdfPKCS7.loadCacertsKeyStore();
+ * PdfReader reader = new PdfReader("my_signed_doc.pdf");
+ * AcroFields af = reader.getAcroFields();
+ * ArrayList names = af.getSignatureNames();
+ * for (int k = 0; k &lt; names.size(); ++k) {
+ * String name = (String)names.get(k);
+ * System.out.println("Signature name: " + name);
+ * System.out.println("Signature covers whole document: " + af.signatureCoversWholeDocument(name));
+ * PdfPKCS7 pk = af.verifySignature(name);
+ * Calendar cal = pk.getSignDate();
+ * Certificate pkc[] = pk.getCertificates();
+ * System.out.println("Subject: " + PdfPKCS7.getSubjectFields(pk.getSigningCertificate()));
+ * System.out.println("Document modified: " + !pk.verify());
+ * Object fails[] = PdfPKCS7.verifyCertificates(pkc, kall, null, cal);
+ * if (fails == null)
+ * System.out.println("Certificates verified against the KeyStore");
+ * else
+ * System.out.println("Certificate failed: " + fails[1]);
+ * }
+ * </pre>
+ * @param name the signature field name
+ * @param provider the provider or <code>null</code> for the default provider
+ * @return a <CODE>PdfPKCS7</CODE> class to continue the verification
+ */
+ public PdfPKCS7 verifySignature(String name, String provider) {
+ PdfDictionary v = getSignatureDictionary(name);
+ if (v == null)
+ return null;
+ try {
+ PdfName sub = (PdfName)PdfReader.getPdfObject(v.get(PdfName.SUBFILTER));
+ PdfString contents = (PdfString)PdfReader.getPdfObject(v.get(PdfName.CONTENTS));
+ PdfPKCS7 pk = null;
+ if (sub.equals(PdfName.ADBE_X509_RSA_SHA1)) {
+ PdfString cert = (PdfString)PdfReader.getPdfObject(v.get(PdfName.CERT));
+ pk = new PdfPKCS7(contents.getOriginalBytes(), cert.getBytes(), provider);
+ }
+ else
+ pk = new PdfPKCS7(contents.getOriginalBytes(), provider);
+ updateByteRange(pk, v);
+ PdfString str = (PdfString)PdfReader.getPdfObject(v.get(PdfName.M));
+ if (str != null)
+ pk.setSignDate(PdfDate.decode(str.toString()));
+ str = (PdfString)PdfReader.getPdfObject(v.get(PdfName.NAME));
+ if (str != null)
+ pk.setSignName(str.toUnicodeString());
+ str = (PdfString)PdfReader.getPdfObject(v.get(PdfName.REASON));
+ if (str != null)
+ pk.setReason(str.toUnicodeString());
+ str = (PdfString)PdfReader.getPdfObject(v.get(PdfName.LOCATION));
+ if (str != null)
+ pk.setLocation(str.toUnicodeString());
+ return pk;
+ }
+ catch (Exception e) {
+ throw new ExceptionConverter(e);
+ }
+ }
+
+ private void updateByteRange(PdfPKCS7 pkcs7, PdfDictionary v) {
+ PdfArray b = (PdfArray)PdfReader.getPdfObject(v.get(PdfName.BYTERANGE));
+ RandomAccessFileOrArray rf = reader.getSafeFile();
+ try {
+ rf.reOpen();
+ byte buf[] = new byte[8192];
+ ArrayList ar = b.getArrayList();
+ for (int k = 0; k < ar.size(); ++k) {
+ int start = ((PdfNumber)ar.get(k)).intValue();
+ int length = ((PdfNumber)ar.get(++k)).intValue();
+ rf.seek(start);
+ while (length > 0) {
+ int rd = rf.read(buf, 0, Math.min(length, buf.length));
+ if (rd <= 0)
+ break;
+ length -= rd;
+ pkcs7.update(buf, 0, rd);
+ }
+ }
+ }
+ catch (Exception e) {
+ throw new ExceptionConverter(e);
+ }
+ finally {
+ try{rf.close();}catch(Exception e){}
+ }
+ }
+
+ private void markUsed(PdfObject obj) {
+ if (!append)
+ return;
+ ((PdfStamperImp)writer).markUsed(obj);
+ }
+
+ /**
+ * Gets the total number of revisions this document has.
+ * @return the total number of revisions
+ */
+ public int getTotalRevisions() {
+ getSignatureNames();
+ return this.totalRevisions;
+ }
+
+ /**
+ * Gets this <CODE>field</CODE> revision.
+ * @param field the signature field name
+ * @return the revision or zero if it's not a signature field
+ */
+ public int getRevision(String field) {
+ getSignatureNames();
+ if (!sigNames.containsKey(field))
+ return 0;
+ return ((int[])sigNames.get(field))[1];
+ }
+
+ /**
+ * Extracts a revision from the document.
+ * @param field the signature field name
+ * @return an <CODE>InputStream</CODE> covering the revision. Returns <CODE>null</CODE> if
+ * it's not a signature field
+ * @throws IOException on error
+ */
+ public InputStream extractRevision(String field) throws IOException {
+ getSignatureNames();
+ int length = ((int[])sigNames.get(field))[0];
+ RandomAccessFileOrArray raf = reader.getSafeFile();
+ raf.reOpen();
+ raf.seek(0);
+ return new RevisionStream(raf, length);
+ }
+
+ /**
+ * Gets the appearances cache.
+ * @return the appearances cache
+ */
+ public HashMap getFieldCache() {
+ return this.fieldCache;
+ }
+
+ /**
+ * Sets a cache for field appearances. Parsing the existing PDF to
+ * create a new TextField is time expensive. For those tasks that repeatedly
+ * fill the same PDF with different field values the use of the cache has dramatic
+ * speed advantages. An example usage:
+ * <p>
+ * <pre>
+ * String pdfFile = ...;// the pdf file used as template
+ * ArrayList xfdfFiles = ...;// the xfdf file names
+ * ArrayList pdfOutFiles = ...;// the output file names, one for each element in xpdfFiles
+ * HashMap cache = new HashMap();// the appearances cache
+ * PdfReader originalReader = new PdfReader(pdfFile);
+ * for (int k = 0; k &lt; xfdfFiles.size(); ++k) {
+ * PdfReader reader = new PdfReader(originalReader);
+ * XfdfReader xfdf = new XfdfReader((String)xfdfFiles.get(k));
+ * PdfStamper stp = new PdfStamper(reader, new FileOutputStream((String)pdfOutFiles.get(k)));
+ * AcroFields af = stp.getAcroFields();
+ * af.setFieldCache(cache);
+ * af.setFields(xfdf);
+ * stp.close();
+ * }
+ * </pre>
+ * @param fieldCache an HasMap that will carry the cached appearances
+ */
+ public void setFieldCache(HashMap fieldCache) {
+ this.fieldCache = fieldCache;
+ }
+
+ /**
+ * Sets extra margins in text fields to better mimic the Acrobat layout.
+ * @param extraMarginLeft the extra marging left
+ * @param extraMarginTop the extra margin top
+ */
+ public void setExtraMargin(float extraMarginLeft, float extraMarginTop) {
+ this.extraMarginLeft = extraMarginLeft;
+ this.extraMarginTop = extraMarginTop;
+ }
+
+ /**
+ * Adds a substitution font to the list. The fonts in this list will be used if the original
+ * font doesn't contain the needed glyphs.
+ * @param font the font
+ */
+ public void addSubstitutionFont(BaseFont font) {
+ if (substitutionFonts == null)
+ substitutionFonts = new ArrayList();
+ substitutionFonts.add(font);
+ }
+
+ private static final HashMap stdFieldFontNames = new HashMap();
+
+ /**
+ * Holds value of property totalRevisions.
+ */
+ private int totalRevisions;
+
+ /**
+ * Holds value of property fieldCache.
+ */
+ private HashMap fieldCache;
+
+ static {
+ stdFieldFontNames.put("CoBO", new String[]{"Courier-BoldOblique"});
+ stdFieldFontNames.put("CoBo", new String[]{"Courier-Bold"});
+ stdFieldFontNames.put("CoOb", new String[]{"Courier-Oblique"});
+ stdFieldFontNames.put("Cour", new String[]{"Courier"});
+ stdFieldFontNames.put("HeBO", new String[]{"Helvetica-BoldOblique"});
+ stdFieldFontNames.put("HeBo", new String[]{"Helvetica-Bold"});
+ stdFieldFontNames.put("HeOb", new String[]{"Helvetica-Oblique"});
+ stdFieldFontNames.put("Helv", new String[]{"Helvetica"});
+ stdFieldFontNames.put("Symb", new String[]{"Symbol"});
+ stdFieldFontNames.put("TiBI", new String[]{"Times-BoldItalic"});
+ stdFieldFontNames.put("TiBo", new String[]{"Times-Bold"});
+ stdFieldFontNames.put("TiIt", new String[]{"Times-Italic"});
+ stdFieldFontNames.put("TiRo", new String[]{"Times-Roman"});
+ stdFieldFontNames.put("ZaDb", new String[]{"ZapfDingbats"});
+ stdFieldFontNames.put("HySm", new String[]{"HYSMyeongJo-Medium", "UniKS-UCS2-H"});
+ stdFieldFontNames.put("HyGo", new String[]{"HYGoThic-Medium", "UniKS-UCS2-H"});
+ stdFieldFontNames.put("KaGo", new String[]{"HeiseiKakuGo-W5", "UniKS-UCS2-H"});
+ stdFieldFontNames.put("KaMi", new String[]{"HeiseiMin-W3", "UniJIS-UCS2-H"});
+ stdFieldFontNames.put("MHei", new String[]{"MHei-Medium", "UniCNS-UCS2-H"});
+ stdFieldFontNames.put("MSun", new String[]{"MSung-Light", "UniCNS-UCS2-H"});
+ stdFieldFontNames.put("STSo", new String[]{"STSong-Light", "UniGB-UCS2-H"});
+ }
+
+ private static class RevisionStream extends InputStream {
+ private byte b[] = new byte[1];
+ private RandomAccessFileOrArray raf;
+ private int length;
+ private int rangePosition = 0;
+ private boolean closed;
+
+ private RevisionStream(RandomAccessFileOrArray raf, int length) {
+ this.raf = raf;
+ this.length = length;
+ }
+
+ public int read() throws IOException {
+ int n = read(b);
+ if (n != 1)
+ return -1;
+ return b[0] & 0xff;
+ }
+
+ public int read(byte[] b, int off, int len) throws IOException {
+ if (b == null) {
+ throw new NullPointerException();
+ } else if ((off < 0) || (off > b.length) || (len < 0) ||
+ ((off + len) > b.length) || ((off + len) < 0)) {
+ throw new IndexOutOfBoundsException();
+ } else if (len == 0) {
+ return 0;
+ }
+ if (rangePosition >= length) {
+ close();
+ return -1;
+ }
+ int elen = Math.min(len, length - rangePosition);
+ raf.readFully(b, off, elen);
+ rangePosition += elen;
+ return elen;
+ }
+
+ public void close() throws IOException {
+ if (!closed) {
+ raf.close();
+ closed = true;
+ }
+ }
+ }
+
+ private static class SorterComparator implements Comparator {
+ public int compare(Object o1, Object o2) {
+ int n1 = ((int[])((Object[])o1)[1])[0];
+ int n2 = ((int[])((Object[])o2)[1])[0];
+ return n1 - n2;
+ }
+ }
+
+ /**
+ * Gets the list of substitution fonts. The list is composed of <CODE>BaseFont</CODE> and can be <CODE>null</CODE>. The fonts in this list will be used if the original
+ * font doesn't contain the needed glyphs.
+ * @return the list
+ */
+ public ArrayList getSubstitutionFonts() {
+ return substitutionFonts;
+ }
+
+ /**
+ * Sets a list of substitution fonts. The list is composed of <CODE>BaseFont</CODE> and can also be <CODE>null</CODE>. The fonts in this list will be used if the original
+ * font doesn't contain the needed glyphs.
+ * @param substitutionFonts the list
+ */
+ public void setSubstitutionFonts(ArrayList substitutionFonts) {
+ this.substitutionFonts = substitutionFonts;
+ }
+}
diff --git a/src/main/java/com/lowagie/text/pdf/ArabicLigaturizer.java b/src/main/java/com/lowagie/text/pdf/ArabicLigaturizer.java
new file mode 100644
index 0000000..959b7b5
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/ArabicLigaturizer.java
@@ -0,0 +1,771 @@
+/*
+ * Copyright 2003 by Paulo Soares.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+package com.lowagie.text.pdf;
+
+/** Shape arabic characters. This code was converted from a C version
+ * at www.pango.org.
+ *
+ * @author Paulo Soares (psoares@consiste.pt)
+ */
+public class ArabicLigaturizer {
+
+ static boolean isVowel(char s) {
+ return ((s >= 0x064B) && (s <= 0x0655)) || (s == 0x0670);
+ }
+
+ static char charshape(char s, int which)
+ /* which 0=isolated 1=final 2=initial 3=medial */
+ {
+ int l, r, m;
+ if ((s >= 0x0621) && (s <= 0x06D3)) {
+ l = 0;
+ r = chartable.length - 1;
+ while (l <= r) {
+ m = (l + r) / 2;
+ if (s == chartable[m][0]) {
+ return chartable[m][which + 1];
+ }
+ else if (s < chartable[m][0]) {
+ r = m - 1;
+ }
+ else {
+ l = m + 1;
+ }
+ }
+ }
+ else if (s >= 0xfef5 && s <= 0xfefb)
+ return (char)(s + which);
+ return s;
+ }
+
+ static int shapecount(char s) {
+ int l, r, m;
+ if ((s >= 0x0621) && (s <= 0x06D3) && !isVowel(s)) {
+ l = 0;
+ r = chartable.length - 1;
+ while (l <= r) {
+ m = (l + r) / 2;
+ if (s == chartable[m][0]) {
+ return chartable[m].length - 1;
+ }
+ else if (s < chartable[m][0]) {
+ r = m - 1;
+ }
+ else {
+ l = m + 1;
+ }
+ }
+ }
+ else if (s == ZWJ) {
+ return 4;
+ }
+ return 1;
+ }
+
+ static int ligature(char newchar, charstruct oldchar) {
+ /* 0 == no ligature possible; 1 == vowel; 2 == two chars; 3 == Lam+Alef */
+ int retval = 0;
+
+ if (oldchar.basechar == 0)
+ return 0;
+ if (isVowel(newchar)) {
+ retval = 1;
+ if ((oldchar.vowel != 0) && (newchar != SHADDA)) {
+ retval = 2; /* we eliminate the old vowel .. */
+ }
+ switch (newchar) {
+ case SHADDA:
+ if (oldchar.mark1 == 0) {
+ oldchar.mark1 = SHADDA;
+ }
+ else {
+ return 0; /* no ligature possible */
+ }
+ break;
+ case HAMZABELOW:
+ switch (oldchar.basechar) {
+ case ALEF:
+ oldchar.basechar = ALEFHAMZABELOW;
+ retval = 2;
+ break;
+ case LAM_ALEF:
+ oldchar.basechar = LAM_ALEFHAMZABELOW;
+ retval = 2;
+ break;
+ default:
+ oldchar.mark1 = HAMZABELOW;
+ break;
+ }
+ break;
+ case HAMZAABOVE:
+ switch (oldchar.basechar) {
+ case ALEF:
+ oldchar.basechar = ALEFHAMZA;
+ retval = 2;
+ break;
+ case LAM_ALEF:
+ oldchar.basechar = LAM_ALEFHAMZA;
+ retval = 2;
+ break;
+ case WAW:
+ oldchar.basechar = WAWHAMZA;
+ retval = 2;
+ break;
+ case YEH:
+ case ALEFMAKSURA:
+ case FARSIYEH:
+ oldchar.basechar = YEHHAMZA;
+ retval = 2;
+ break;
+ default: /* whatever sense this may make .. */
+ oldchar.mark1 = HAMZAABOVE;
+ break;
+ }
+ break;
+ case MADDA:
+ switch (oldchar.basechar) {
+ case ALEF:
+ oldchar.basechar = ALEFMADDA;
+ retval = 2;
+ break;
+ }
+ break;
+ default:
+ oldchar.vowel = newchar;
+ break;
+ }
+ if (retval == 1) {
+ oldchar.lignum++;
+ }
+ return retval;
+ }
+ if (oldchar.vowel != 0) { /* if we already joined a vowel, we can't join a Hamza */
+ return 0;
+ }
+
+ switch (oldchar.basechar) {
+ case LAM:
+ switch (newchar) {
+ case ALEF:
+ oldchar.basechar = LAM_ALEF;
+ oldchar.numshapes = 2;
+ retval = 3;
+ break;
+ case ALEFHAMZA:
+ oldchar.basechar = LAM_ALEFHAMZA;
+ oldchar.numshapes = 2;
+ retval = 3;
+ break;
+ case ALEFHAMZABELOW:
+ oldchar.basechar = LAM_ALEFHAMZABELOW;
+ oldchar.numshapes = 2;
+ retval = 3;
+ break;
+ case ALEFMADDA:
+ oldchar.basechar = LAM_ALEFMADDA;
+ oldchar.numshapes = 2;
+ retval = 3;
+ break;
+ }
+ break;
+ case 0:
+ oldchar.basechar = newchar;
+ oldchar.numshapes = shapecount(newchar);
+ retval = 1;
+ break;
+ }
+ return retval;
+ }
+
+ static void copycstostring(StringBuffer string, charstruct s, int level) {
+ /* s is a shaped charstruct; i is the index into the string */
+ if (s.basechar == 0)
+ return;
+
+ string.append(s.basechar);
+ s.lignum--;
+ if (s.mark1 != 0) {
+ if ((level & ar_novowel) == 0) {
+ string.append(s.mark1);
+ s.lignum--;
+ }
+ else {
+ s.lignum--;
+ }
+ }
+ if (s.vowel != 0) {
+ if ((level & ar_novowel) == 0) {
+ string.append(s.vowel);
+ s.lignum--;
+ }
+ else { /* vowel elimination */
+ s.lignum--;
+ }
+ }
+// while (s.lignum > 0) { /* NULL-insertion for Langbox-font */
+// string[i] = 0;
+// i++;
+// (s.lignum)--;
+// }
+// return i;
+ }
+
+ // return len
+ static void doublelig(StringBuffer string, int level)
+ /* Ok. We have presentation ligatures in our font. */
+ {
+ int len;
+ int olen = len = string.length();
+ int j = 0, si = 1;
+ char lapresult;
+
+ while (si < olen) {
+ lapresult = 0;
+ if ((level & ar_composedtashkeel) != 0) {
+ switch (string.charAt(j)) {
+ case SHADDA:
+ switch (string.charAt(si)) {
+ case KASRA:
+ lapresult = 0xFC62;
+ break;
+ case FATHA:
+ lapresult = 0xFC60;
+ break;
+ case DAMMA:
+ lapresult = 0xFC61;
+ break;
+ case 0x064C:
+ lapresult = 0xFC5E;
+ break;
+ case 0x064D:
+ lapresult = 0xFC5F;
+ break;
+ }
+ break;
+ case KASRA:
+ if (string.charAt(si) == SHADDA)
+ lapresult = 0xFC62;
+ break;
+ case FATHA:
+ if (string.charAt(si) == SHADDA)
+ lapresult = 0xFC60;
+ break;
+ case DAMMA:
+ if (string.charAt(si) == SHADDA)
+ lapresult = 0xFC61;
+ break;
+ }
+ }
+
+ if ((level & ar_lig) != 0) {
+ switch (string.charAt(j)) {
+ case 0xFEDF: /* LAM initial */
+ switch (string.charAt(si)) {
+ case 0xFE9E:
+ lapresult = 0xFC3F;
+ break; /* JEEM final */
+ case 0xFEA0:
+ lapresult = 0xFCC9;
+ break; /* JEEM medial */
+ case 0xFEA2:
+ lapresult = 0xFC40;
+ break; /* HAH final */
+ case 0xFEA4:
+ lapresult = 0xFCCA;
+ break; /* HAH medial */
+ case 0xFEA6:
+ lapresult = 0xFC41;
+ break; /* KHAH final */
+ case 0xFEA8:
+ lapresult = 0xFCCB;
+ break; /* KHAH medial */
+ case 0xFEE2:
+ lapresult = 0xFC42;
+ break; /* MEEM final */
+ case 0xFEE4:
+ lapresult = 0xFCCC;
+ break; /* MEEM medial */
+ }
+ break;
+ case 0xFE97: /* TEH inital */
+ switch (string.charAt(si)) {
+ case 0xFEA0:
+ lapresult = 0xFCA1;
+ break; /* JEEM medial */
+ case 0xFEA4:
+ lapresult = 0xFCA2;
+ break; /* HAH medial */
+ case 0xFEA8:
+ lapresult = 0xFCA3;
+ break; /* KHAH medial */
+ }
+ break;
+ case 0xFE91: /* BEH inital */
+ switch (string.charAt(si)) {
+ case 0xFEA0:
+ lapresult = 0xFC9C;
+ break; /* JEEM medial */
+ case 0xFEA4:
+ lapresult = 0xFC9D;
+ break; /* HAH medial */
+ case 0xFEA8:
+ lapresult = 0xFC9E;
+ break; /* KHAH medial */
+ }
+ break;
+ case 0xFEE7: /* NOON inital */
+ switch (string.charAt(si)) {
+ case 0xFEA0:
+ lapresult = 0xFCD2;
+ break; /* JEEM initial */
+ case 0xFEA4:
+ lapresult = 0xFCD3;
+ break; /* HAH medial */
+ case 0xFEA8:
+ lapresult = 0xFCD4;
+ break; /* KHAH medial */
+ }
+ break;
+
+ case 0xFEE8: /* NOON medial */
+ switch (string.charAt(si)) {
+ case 0xFEAE:
+ lapresult = 0xFC8A;
+ break; /* REH final */
+ case 0xFEB0:
+ lapresult = 0xFC8B;
+ break; /* ZAIN final */
+ }
+ break;
+ case 0xFEE3: /* MEEM initial */
+ switch (string.charAt(si)) {
+ case 0xFEA0:
+ lapresult = 0xFCCE;
+ break; /* JEEM medial */
+ case 0xFEA4:
+ lapresult = 0xFCCF;
+ break; /* HAH medial */
+ case 0xFEA8:
+ lapresult = 0xFCD0;
+ break; /* KHAH medial */
+ case 0xFEE4:
+ lapresult = 0xFCD1;
+ break; /* MEEM medial */
+ }
+ break;
+
+ case 0xFED3: /* FEH initial */
+ switch (string.charAt(si)) {
+ case 0xFEF2:
+ lapresult = 0xFC32;
+ break; /* YEH final */
+ }
+ break;
+
+ default:
+ break;
+ } /* end switch string[si] */
+ }
+ if (lapresult != 0) {
+ string.setCharAt(j, lapresult);
+ len--;
+ si++; /* jump over one character */
+ /* we'll have to change this, too. */
+ }
+ else {
+ j++;
+ string.setCharAt(j, string.charAt(si));
+ si++;
+ }
+ }
+ string.setLength(len);
+ }
+
+ static boolean connects_to_left(charstruct a) {
+ return a.numshapes > 2;
+ }
+
+ static void shape(char text[], StringBuffer string, int level) {
+ /* string is assumed to be empty and big enough.
+ * text is the original text.
+ * This routine does the basic arabic reshaping.
+ * *len the number of non-null characters.
+ *
+ * Note: We have to unshape each character first!
+ */
+ int join;
+ int which;
+ char nextletter;
+
+ int p = 0; /* initialize for output */
+ charstruct oldchar = new charstruct();
+ charstruct curchar = new charstruct();
+ while (p < text.length) {
+ nextletter = text[p++];
+ //nextletter = unshape (nextletter);
+
+ join = ligature(nextletter, curchar);
+ if (join == 0) { /* shape curchar */
+ int nc = shapecount(nextletter);
+ //(*len)++;
+ if (nc == 1) {
+ which = 0; /* final or isolated */
+ }
+ else {
+ which = 2; /* medial or initial */
+ }
+ if (connects_to_left(oldchar)) {
+ which++;
+ }
+
+ which = which % (curchar.numshapes);
+ curchar.basechar = charshape(curchar.basechar, which);
+
+ /* get rid of oldchar */
+ copycstostring(string, oldchar, level);
+ oldchar = curchar; /* new values in oldchar */
+
+ /* init new curchar */
+ curchar = new charstruct();
+ curchar.basechar = nextletter;
+ curchar.numshapes = nc;
+ curchar.lignum++;
+ // (*len) += unligature (&curchar, level);
+ }
+ else if (join == 1) {
+ }
+ // else
+ // {
+ // (*len) += unligature (&curchar, level);
+ // }
+ // p = g_utf8_next_char (p);
+ }
+
+ /* Handle last char */
+ if (connects_to_left(oldchar))
+ which = 1;
+ else
+ which = 0;
+ which = which % (curchar.numshapes);
+ curchar.basechar = charshape(curchar.basechar, which);
+
+ /* get rid of oldchar */
+ copycstostring(string, oldchar, level);
+ copycstostring(string, curchar, level);
+ }
+
+ static int arabic_shape(char src[], int srcoffset, int srclength, char dest[], int destoffset, int destlength, int level) {
+ char str[] = new char[srclength];
+ for (int k = srclength + srcoffset - 1; k >= srcoffset; --k)
+ str[k - srcoffset] = src[k];
+ StringBuffer string = new StringBuffer(srclength);
+ shape(str, string, level);
+ if ((level & (ar_composedtashkeel | ar_lig)) != 0)
+ doublelig(string, level);
+// string.reverse();
+ System.arraycopy(string.toString().toCharArray(), 0, dest, destoffset, string.length());
+ return string.length();
+ }
+
+ static void processNumbers(char text[], int offset, int length, int options) {
+ int limit = offset + length;
+ if ((options & DIGITS_MASK) != 0) {
+ char digitBase = '\u0030'; // European digits
+ switch (options & DIGIT_TYPE_MASK) {
+ case DIGIT_TYPE_AN:
+ digitBase = '\u0660'; // Arabic-Indic digits
+ break;
+
+ case DIGIT_TYPE_AN_EXTENDED:
+ digitBase = '\u06f0'; // Eastern Arabic-Indic digits (Persian and Urdu)
+ break;
+
+ default:
+ break;
+ }
+
+ switch (options & DIGITS_MASK) {
+ case DIGITS_EN2AN: {
+ int digitDelta = digitBase - '\u0030';
+ for (int i = offset; i < limit; ++i) {
+ char ch = text[i];
+ if (ch <= '\u0039' && ch >= '\u0030') {
+ text[i] += digitDelta;
+ }
+ }
+ }
+ break;
+
+ case DIGITS_AN2EN: {
+ char digitTop = (char)(digitBase + 9);
+ int digitDelta = '\u0030' - digitBase;
+ for (int i = offset; i < limit; ++i) {
+ char ch = text[i];
+ if (ch <= digitTop && ch >= digitBase) {
+ text[i] += digitDelta;
+ }
+ }
+ }
+ break;
+
+ case DIGITS_EN2AN_INIT_LR:
+ shapeToArabicDigitsWithContext(text, 0, length, digitBase, false);
+ break;
+
+ case DIGITS_EN2AN_INIT_AL:
+ shapeToArabicDigitsWithContext(text, 0, length, digitBase, true);
+ break;
+
+ default:
+ break;
+ }
+ }
+ }
+
+ static void shapeToArabicDigitsWithContext(char[] dest, int start, int length, char digitBase, boolean lastStrongWasAL) {
+ digitBase -= '0'; // move common adjustment out of loop
+
+ int limit = start + length;
+ for(int i = start; i < limit; ++i) {
+ char ch = dest[i];
+ switch (BidiOrder.getDirection(ch)) {
+ case BidiOrder.L:
+ case BidiOrder.R:
+ lastStrongWasAL = false;
+ break;
+ case BidiOrder.AL:
+ lastStrongWasAL = true;
+ break;
+ case BidiOrder.EN:
+ if (lastStrongWasAL && ch <= '\u0039') {
+ dest[i] = (char)(ch + digitBase);
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ }
+
+ private static final char ALEF = 0x0627;
+ private static final char ALEFHAMZA = 0x0623;
+ private static final char ALEFHAMZABELOW = 0x0625;
+ private static final char ALEFMADDA = 0x0622;
+ private static final char LAM = 0x0644;
+ private static final char HAMZA = 0x0621;
+ private static final char TATWEEL = 0x0640;
+ private static final char ZWJ = 0x200D;
+
+ private static final char HAMZAABOVE = 0x0654;
+ private static final char HAMZABELOW = 0x0655;
+
+ private static final char WAWHAMZA = 0x0624;
+ private static final char YEHHAMZA = 0x0626;
+ private static final char WAW = 0x0648;
+ private static final char ALEFMAKSURA = 0x0649;
+ private static final char YEH = 0x064A;
+ private static final char FARSIYEH = 0x06CC;
+
+ private static final char SHADDA = 0x0651;
+ private static final char KASRA = 0x0650;
+ private static final char FATHA = 0x064E;
+ private static final char DAMMA = 0x064F;
+ private static final char MADDA = 0x0653;
+
+ private static final char LAM_ALEF = 0xFEFB;
+ private static final char LAM_ALEFHAMZA = 0xFEF7;
+ private static final char LAM_ALEFHAMZABELOW = 0xFEF9;
+ private static final char LAM_ALEFMADDA = 0xFEF5;
+
+ private static final char chartable[][] = {
+ {0x0621, 0xFE80}, /* HAMZA */
+ {0x0622, 0xFE81, 0xFE82}, /* ALEF WITH MADDA ABOVE */
+ {0x0623, 0xFE83, 0xFE84}, /* ALEF WITH HAMZA ABOVE */
+ {0x0624, 0xFE85, 0xFE86}, /* WAW WITH HAMZA ABOVE */
+ {0x0625, 0xFE87, 0xFE88}, /* ALEF WITH HAMZA BELOW */
+ {0x0626, 0xFE89, 0xFE8A, 0xFE8B, 0xFE8C}, /* YEH WITH HAMZA ABOVE */
+ {0x0627, 0xFE8D, 0xFE8E}, /* ALEF */
+ {0x0628, 0xFE8F, 0xFE90, 0xFE91, 0xFE92}, /* BEH */
+ {0x0629, 0xFE93, 0xFE94}, /* TEH MARBUTA */
+ {0x062A, 0xFE95, 0xFE96, 0xFE97, 0xFE98}, /* TEH */
+ {0x062B, 0xFE99, 0xFE9A, 0xFE9B, 0xFE9C}, /* THEH */
+ {0x062C, 0xFE9D, 0xFE9E, 0xFE9F, 0xFEA0}, /* JEEM */
+ {0x062D, 0xFEA1, 0xFEA2, 0xFEA3, 0xFEA4}, /* HAH */
+ {0x062E, 0xFEA5, 0xFEA6, 0xFEA7, 0xFEA8}, /* KHAH */
+ {0x062F, 0xFEA9, 0xFEAA}, /* DAL */
+ {0x0630, 0xFEAB, 0xFEAC}, /* THAL */
+ {0x0631, 0xFEAD, 0xFEAE}, /* REH */
+ {0x0632, 0xFEAF, 0xFEB0}, /* ZAIN */
+ {0x0633, 0xFEB1, 0xFEB2, 0xFEB3, 0xFEB4}, /* SEEN */
+ {0x0634, 0xFEB5, 0xFEB6, 0xFEB7, 0xFEB8}, /* SHEEN */
+ {0x0635, 0xFEB9, 0xFEBA, 0xFEBB, 0xFEBC}, /* SAD */
+ {0x0636, 0xFEBD, 0xFEBE, 0xFEBF, 0xFEC0}, /* DAD */
+ {0x0637, 0xFEC1, 0xFEC2, 0xFEC3, 0xFEC4}, /* TAH */
+ {0x0638, 0xFEC5, 0xFEC6, 0xFEC7, 0xFEC8}, /* ZAH */
+ {0x0639, 0xFEC9, 0xFECA, 0xFECB, 0xFECC}, /* AIN */
+ {0x063A, 0xFECD, 0xFECE, 0xFECF, 0xFED0}, /* GHAIN */
+ {0x0640, 0x0640, 0x0640, 0x0640, 0x0640}, /* TATWEEL */
+ {0x0641, 0xFED1, 0xFED2, 0xFED3, 0xFED4}, /* FEH */
+ {0x0642, 0xFED5, 0xFED6, 0xFED7, 0xFED8}, /* QAF */
+ {0x0643, 0xFED9, 0xFEDA, 0xFEDB, 0xFEDC}, /* KAF */
+ {0x0644, 0xFEDD, 0xFEDE, 0xFEDF, 0xFEE0}, /* LAM */
+ {0x0645, 0xFEE1, 0xFEE2, 0xFEE3, 0xFEE4}, /* MEEM */
+ {0x0646, 0xFEE5, 0xFEE6, 0xFEE7, 0xFEE8}, /* NOON */
+ {0x0647, 0xFEE9, 0xFEEA, 0xFEEB, 0xFEEC}, /* HEH */
+ {0x0648, 0xFEED, 0xFEEE}, /* WAW */
+ {0x0649, 0xFEEF, 0xFEF0, 0xFBE8, 0xFBE9}, /* ALEF MAKSURA */
+ {0x064A, 0xFEF1, 0xFEF2, 0xFEF3, 0xFEF4}, /* YEH */
+ {0x0671, 0xFB50, 0xFB51}, /* ALEF WASLA */
+ {0x0679, 0xFB66, 0xFB67, 0xFB68, 0xFB69}, /* TTEH */
+ {0x067A, 0xFB5E, 0xFB5F, 0xFB60, 0xFB61}, /* TTEHEH */
+ {0x067B, 0xFB52, 0xFB53, 0xFB54, 0xFB55}, /* BEEH */
+ {0x067E, 0xFB56, 0xFB57, 0xFB58, 0xFB59}, /* PEH */
+ {0x067F, 0xFB62, 0xFB63, 0xFB64, 0xFB65}, /* TEHEH */
+ {0x0680, 0xFB5A, 0xFB5B, 0xFB5C, 0xFB5D}, /* BEHEH */
+ {0x0683, 0xFB76, 0xFB77, 0xFB78, 0xFB79}, /* NYEH */
+ {0x0684, 0xFB72, 0xFB73, 0xFB74, 0xFB75}, /* DYEH */
+ {0x0686, 0xFB7A, 0xFB7B, 0xFB7C, 0xFB7D}, /* TCHEH */
+ {0x0687, 0xFB7E, 0xFB7F, 0xFB80, 0xFB81}, /* TCHEHEH */
+ {0x0688, 0xFB88, 0xFB89}, /* DDAL */
+ {0x068C, 0xFB84, 0xFB85}, /* DAHAL */
+ {0x068D, 0xFB82, 0xFB83}, /* DDAHAL */
+ {0x068E, 0xFB86, 0xFB87}, /* DUL */
+ {0x0691, 0xFB8C, 0xFB8D}, /* RREH */
+ {0x0698, 0xFB8A, 0xFB8B}, /* JEH */
+ {0x06A4, 0xFB6A, 0xFB6B, 0xFB6C, 0xFB6D}, /* VEH */
+ {0x06A6, 0xFB6E, 0xFB6F, 0xFB70, 0xFB71}, /* PEHEH */
+ {0x06A9, 0xFB8E, 0xFB8F, 0xFB90, 0xFB91}, /* KEHEH */
+ {0x06AD, 0xFBD3, 0xFBD4, 0xFBD5, 0xFBD6}, /* NG */
+ {0x06AF, 0xFB92, 0xFB93, 0xFB94, 0xFB95}, /* GAF */
+ {0x06B1, 0xFB9A, 0xFB9B, 0xFB9C, 0xFB9D}, /* NGOEH */
+ {0x06B3, 0xFB96, 0xFB97, 0xFB98, 0xFB99}, /* GUEH */
+ {0x06BA, 0xFB9E, 0xFB9F}, /* NOON GHUNNA */
+ {0x06BB, 0xFBA0, 0xFBA1, 0xFBA2, 0xFBA3}, /* RNOON */
+ {0x06BE, 0xFBAA, 0xFBAB, 0xFBAC, 0xFBAD}, /* HEH DOACHASHMEE */
+ {0x06C0, 0xFBA4, 0xFBA5}, /* HEH WITH YEH ABOVE */
+ {0x06C1, 0xFBA6, 0xFBA7, 0xFBA8, 0xFBA9}, /* HEH GOAL */
+ {0x06C5, 0xFBE0, 0xFBE1}, /* KIRGHIZ OE */
+ {0x06C6, 0xFBD9, 0xFBDA}, /* OE */
+ {0x06C7, 0xFBD7, 0xFBD8}, /* U */
+ {0x06C8, 0xFBDB, 0xFBDC}, /* YU */
+ {0x06C9, 0xFBE2, 0xFBE3}, /* KIRGHIZ YU */
+ {0x06CB, 0xFBDE, 0xFBDF}, /* VE */
+ {0x06CC, 0xFBFC, 0xFBFD, 0xFBFE, 0xFBFF}, /* FARSI YEH */
+ {0x06D0, 0xFBE4, 0xFBE5, 0xFBE6, 0xFBE7}, /* E */
+ {0x06D2, 0xFBAE, 0xFBAF}, /* YEH BARREE */
+ {0x06D3, 0xFBB0, 0xFBB1} /* YEH BARREE WITH HAMZA ABOVE */
+ };
+
+ public static final int ar_nothing = 0x0;
+ public static final int ar_novowel = 0x1;
+ public static final int ar_composedtashkeel = 0x4;
+ public static final int ar_lig = 0x8;
+ /**
+ * Digit shaping option: Replace European digits (U+0030...U+0039) by Arabic-Indic digits.
+ */
+ public static final int DIGITS_EN2AN = 0x20;
+
+ /**
+ * Digit shaping option: Replace Arabic-Indic digits by European digits (U+0030...U+0039).
+ */
+ public static final int DIGITS_AN2EN = 0x40;
+
+ /**
+ * Digit shaping option:
+ * Replace European digits (U+0030...U+0039) by Arabic-Indic digits
+ * if the most recent strongly directional character
+ * is an Arabic letter (its Bidi direction value is RIGHT_TO_LEFT_ARABIC).
+ * The initial state at the start of the text is assumed to be not an Arabic,
+ * letter, so European digits at the start of the text will not change.
+ * Compare to DIGITS_ALEN2AN_INIT_AL.
+ */
+ public static final int DIGITS_EN2AN_INIT_LR = 0x60;
+
+ /**
+ * Digit shaping option:
+ * Replace European digits (U+0030...U+0039) by Arabic-Indic digits
+ * if the most recent strongly directional character
+ * is an Arabic letter (its Bidi direction value is RIGHT_TO_LEFT_ARABIC).
+ * The initial state at the start of the text is assumed to be an Arabic,
+ * letter, so European digits at the start of the text will change.
+ * Compare to DIGITS_ALEN2AN_INT_LR.
+ */
+ public static final int DIGITS_EN2AN_INIT_AL = 0x80;
+
+ /** Not a valid option value. */
+ private static final int DIGITS_RESERVED = 0xa0;
+
+ /**
+ * Bit mask for digit shaping options.
+ */
+ public static final int DIGITS_MASK = 0xe0;
+
+ /**
+ * Digit type option: Use Arabic-Indic digits (U+0660...U+0669).
+ */
+ public static final int DIGIT_TYPE_AN = 0;
+
+ /**
+ * Digit type option: Use Eastern (Extended) Arabic-Indic digits (U+06f0...U+06f9).
+ */
+ public static final int DIGIT_TYPE_AN_EXTENDED = 0x100;
+
+ /**
+ * Bit mask for digit type options.
+ */
+ public static final int DIGIT_TYPE_MASK = 0x0100; // 0x3f00?
+
+ static class charstruct {
+ char basechar;
+ char mark1; /* has to be initialized to zero */
+ char vowel;
+ int lignum; /* is a ligature with lignum aditional characters */
+ int numshapes = 1;
+ };
+
+
+}
diff --git a/src/main/java/com/lowagie/text/pdf/AsianFontMapper.java b/src/main/java/com/lowagie/text/pdf/AsianFontMapper.java
new file mode 100644
index 0000000..484ab0e
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/AsianFontMapper.java
@@ -0,0 +1,103 @@
+/*
+ * Copyright 2004 by Takenori.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+package com.lowagie.text.pdf;
+
+import java.awt.Font;
+
+import com.lowagie.text.pdf.BaseFont;
+import com.lowagie.text.pdf.DefaultFontMapper;
+
+public class AsianFontMapper extends DefaultFontMapper {
+
+ public static String ChineseSimplifiedFont = "STSong-Light";
+ public static String ChineseSimplifiedEncoding_H = "UniGB-UCS2-H";
+ public static String ChineseSimplifiedEncoding_V = "UniGB-UCS2-V";
+
+ public static String ChineseTraditionalFont_MHei = "MHei-Medium";
+ public static String ChineseTraditionalFont_MSung = "MSung-Light";
+ public static String ChineseTraditionalEncoding_H = "UniCNS-UCS2-H";
+ public static String ChineseTraditionalEncoding_V = "UniCNS-UCS2-V";
+
+ public static String JapaneseFont_Go = "HeiseiKakuGo-W5";
+ public static String JapaneseFont_Min = "HeiseiMin-W3";
+ public static String JapaneseEncoding_H = "UniJIS-UCS2-H";
+ public static String JapaneseEncoding_V = "UniJIS-UCS2-V";
+ public static String JapaneseEncoding_HW_H = "UniJIS-UCS2-HW-H";
+ public static String JapaneseEncoding_HW_V = "UniJIS-UCS2-HW-V";
+
+ public static String KoreanFont_GoThic = "HYGoThic-Medium";
+ public static String KoreanFont_SMyeongJo = "HYSMyeongJo-Medium";
+ public static String KoreanEncoding_H = "UniKS-UCS2-H";
+ public static String KoreanEncoding_V = "UniKS-UCS2-V";
+
+ private String defaultFont;
+ private String encoding;
+
+ public AsianFontMapper(String font, String encoding) {
+ super();
+
+ this.defaultFont = font;
+ this.encoding = encoding;
+ }
+
+ public BaseFont awtToPdf(Font font) {
+ try {
+ BaseFontParameters p = getBaseFontParameters(font.getFontName());
+ if (p != null){
+ return BaseFont.createFont(p.fontName, p.encoding, p.embedded, p.cached, p.ttfAfm, p.pfb);
+ }else{
+ return BaseFont.createFont(defaultFont, encoding, true);
+ }
+ }
+ catch (Exception e) {
+ e.printStackTrace();
+ }
+ return null;
+
+ }
+
+}
diff --git a/src/main/java/com/lowagie/text/pdf/BadPdfFormatException.java b/src/main/java/com/lowagie/text/pdf/BadPdfFormatException.java
new file mode 100644
index 0000000..70c4001
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/BadPdfFormatException.java
@@ -0,0 +1,85 @@
+/*
+ * $Id: BadPdfFormatException.java,v 1.55 2006/02/16 16:17:48 psoares33 Exp $
+ * $Name: $
+ *
+ * Copyright 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf;
+
+/**
+ * Signals that a bad PDF format has been used to construct a <CODE>PdfObject</CODE>.
+ *
+ * @see PdfException
+ * @see PdfBoolean
+ * @see PdfNumber
+ * @see PdfString
+ * @see PdfName
+ * @see PdfDictionary
+ */
+
+public class BadPdfFormatException extends PdfException {
+
+ // constructors
+
+/**
+ * Constructs a <CODE>BadPdfFormatException</CODE> whithout a message.
+ */
+
+ BadPdfFormatException() {
+ super();
+ }
+
+/**
+ * Constructs a <code>BadPdfFormatException</code> with a message.
+ *
+ * @param message a message describing the exception
+ */
+
+ BadPdfFormatException(String message) {
+ super(message);
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/pdf/Barcode.java b/src/main/java/com/lowagie/text/pdf/Barcode.java
new file mode 100644
index 0000000..5eea0dc
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/Barcode.java
@@ -0,0 +1,477 @@
+/*
+ * $Id: Barcode.java,v 1.20 2006/02/09 18:07:56 psoares33 Exp $
+ *
+ * Copyright 2002-2006 by Paulo Soares.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+package com.lowagie.text.pdf;
+
+import com.lowagie.text.ExceptionConverter;
+import com.lowagie.text.Rectangle;
+import com.lowagie.text.Image;
+import java.awt.Color;
+/** Base class containing properties and methods commom to all
+ * barcode types.
+ *
+ * @author Paulo Soares (psoares@consiste.pt)
+ */
+public abstract class Barcode {
+ /** A type of barcode */
+ public static final int EAN13 = 1;
+ /** A type of barcode */
+ public static final int EAN8 = 2;
+ /** A type of barcode */
+ public static final int UPCA = 3;
+ /** A type of barcode */
+ public static final int UPCE = 4;
+ /** A type of barcode */
+ public static final int SUPP2 = 5;
+ /** A type of barcode */
+ public static final int SUPP5 = 6;
+ /** A type of barcode */
+ public static final int POSTNET = 7;
+ /** A type of barcode */
+ public static final int PLANET = 8;
+ /** A type of barcode */
+ public static final int CODE128 = 9;
+ /** A type of barcode */
+ public static final int CODE128_UCC = 10;
+ /** A type of barcode */
+ public static final int CODE128_RAW = 11;
+ /** A type of barcode */
+ public static final int CODABAR = 12;
+
+ /** The minimum bar width.
+ */
+ protected float x;
+
+ /** The bar multiplier for wide bars or the distance between
+ * bars for Postnet and Planet.
+ */
+ protected float n;
+
+ /** The text font. <CODE>null</CODE> if no text.
+ */
+ protected BaseFont font;
+
+ /** The size of the text or the height of the shorter bar
+ * in Postnet.
+ */
+ protected float size;
+
+ /** If positive, the text distance under the bars. If zero or negative,
+ * the text distance above the bars.
+ */
+ protected float baseline;
+
+ /** The height of the bars.
+ */
+ protected float barHeight;
+
+ /** The text alignment. Can be <CODE>Element.ALIGN_LEFT</CODE>,
+ * <CODE>Element.ALIGN_CENTER</CODE> or <CODE>Element.ALIGN_RIGHT</CODE>.
+ */
+ protected int textAlignment;
+
+ /** The optional checksum generation.
+ */
+ protected boolean generateChecksum;
+
+ /** Shows the generated checksum in the the text.
+ */
+ protected boolean checksumText;
+
+ /** Show the start and stop character '*' in the text for
+ * the barcode 39 or 'ABCD' for codabar.
+ */
+ protected boolean startStopText;
+
+ /** Generates extended barcode 39.
+ */
+ protected boolean extended;
+
+ /** The code to generate.
+ */
+ protected String code = "";
+
+ /** Show the guard bars for barcode EAN.
+ */
+ protected boolean guardBars;
+
+ /** The code type.
+ */
+ protected int codeType;
+
+ /** The ink spreading. */
+ protected float inkSpreading = 0;
+
+ /** Gets the minimum bar width.
+ * @return the minimum bar width
+ */
+ public float getX() {
+ return x;
+ }
+
+ /** Sets the minimum bar width.
+ * @param x the minimum bar width
+ */
+ public void setX(float x) {
+ this.x = x;
+ }
+
+ /** Gets the bar multiplier for wide bars.
+ * @return the bar multiplier for wide bars
+ */
+ public float getN() {
+ return n;
+ }
+
+ /** Sets the bar multiplier for wide bars.
+ * @param n the bar multiplier for wide bars
+ */
+ public void setN(float n) {
+ this.n = n;
+ }
+
+ /** Gets the text font. <CODE>null</CODE> if no text.
+ * @return the text font. <CODE>null</CODE> if no text
+ */
+ public BaseFont getFont() {
+ return font;
+ }
+
+ /** Sets the text font.
+ * @param font the text font. Set to <CODE>null</CODE> to suppress any text
+ */
+ public void setFont(BaseFont font) {
+ this.font = font;
+ }
+
+ /** Gets the size of the text.
+ * @return the size of the text
+ */
+ public float getSize() {
+ return size;
+ }
+
+ /** Sets the size of the text.
+ * @param size the size of the text
+ */
+ public void setSize(float size) {
+ this.size = size;
+ }
+
+ /** Gets the text baseline.
+ * If positive, the text distance under the bars. If zero or negative,
+ * the text distance above the bars.
+ * @return the baseline.
+ */
+ public float getBaseline() {
+ return baseline;
+ }
+
+ /** Sets the text baseline.
+ * If positive, the text distance under the bars. If zero or negative,
+ * the text distance above the bars.
+ * @param baseline the baseline.
+ */
+ public void setBaseline(float baseline) {
+ this.baseline = baseline;
+ }
+
+ /** Gets the height of the bars.
+ * @return the height of the bars
+ */
+ public float getBarHeight() {
+ return barHeight;
+ }
+
+ /** Sets the height of the bars.
+ * @param barHeight the height of the bars
+ */
+ public void setBarHeight(float barHeight) {
+ this.barHeight = barHeight;
+ }
+
+ /** Gets the text alignment. Can be <CODE>Element.ALIGN_LEFT</CODE>,
+ * <CODE>Element.ALIGN_CENTER</CODE> or <CODE>Element.ALIGN_RIGHT</CODE>.
+ * @return the text alignment
+ */
+ public int getTextAlignment() {
+ return textAlignment;
+ }
+
+ /** Sets the text alignment. Can be <CODE>Element.ALIGN_LEFT</CODE>,
+ * <CODE>Element.ALIGN_CENTER</CODE> or <CODE>Element.ALIGN_RIGHT</CODE>.
+ * @param textAlignment the text alignment
+ */
+ public void setTextAlignment(int textAlignment) {
+ this.textAlignment = textAlignment;
+ }
+
+ /** Gets the optional checksum generation.
+ * @return the optional checksum generation
+ */
+ public boolean isGenerateChecksum() {
+ return generateChecksum;
+ }
+
+ /** Setter for property generateChecksum.
+ * @param generateChecksum New value of property generateChecksum.
+ */
+ public void setGenerateChecksum(boolean generateChecksum) {
+ this.generateChecksum = generateChecksum;
+ }
+
+ /** Gets the property to show the generated checksum in the the text.
+ * @return value of property checksumText
+ */
+ public boolean isChecksumText() {
+ return checksumText;
+ }
+
+ /** Sets the property to show the generated checksum in the the text.
+ * @param checksumText new value of property checksumText
+ */
+ public void setChecksumText(boolean checksumText) {
+ this.checksumText = checksumText;
+ }
+
+ /** Sets the property to show the start and stop character '*' in the text for
+ * the barcode 39.
+ * @return value of property startStopText
+ */
+ public boolean isStartStopText() {
+ return startStopText;
+ }
+
+ /** Gets the property to show the start and stop character '*' in the text for
+ * the barcode 39.
+ * @param startStopText new value of property startStopText
+ */
+ public void setStartStopText(boolean startStopText) {
+ this.startStopText = startStopText;
+ }
+
+ /** Gets the property to generate extended barcode 39.
+ * @return value of property extended.
+ */
+ public boolean isExtended() {
+ return extended;
+ }
+
+ /** Sets the property to generate extended barcode 39.
+ * @param extended new value of property extended
+ */
+ public void setExtended(boolean extended) {
+ this.extended = extended;
+ }
+
+ /** Gets the code to generate.
+ * @return the code to generate
+ */
+ public String getCode() {
+ return code;
+ }
+
+ /** Sets the code to generate.
+ * @param code the code to generate
+ */
+ public void setCode(String code) {
+ this.code = code;
+ }
+
+ /** Gets the property to show the guard bars for barcode EAN.
+ * @return value of property guardBars
+ */
+ public boolean isGuardBars() {
+ return guardBars;
+ }
+
+ /** Sets the property to show the guard bars for barcode EAN.
+ * @param guardBars new value of property guardBars
+ */
+ public void setGuardBars(boolean guardBars) {
+ this.guardBars = guardBars;
+ }
+
+ /** Gets the code type.
+ * @return the code type
+ */
+ public int getCodeType() {
+ return codeType;
+ }
+
+ /** Sets the code type.
+ * @param codeType the code type
+ */
+ public void setCodeType(int codeType) {
+ this.codeType = codeType;
+ }
+
+ /** Gets the maximum area that the barcode and the text, if
+ * any, will occupy. The lower left corner is always (0, 0).
+ * @return the size the barcode occupies.
+ */
+ public abstract Rectangle getBarcodeSize();
+
+ /** Places the barcode in a <CODE>PdfContentByte</CODE>. The
+ * barcode is always placed at coodinates (0, 0). Use the
+ * translation matrix to move it elsewhere.<p>
+ * The bars and text are written in the following colors:<p>
+ * <P><TABLE BORDER=1>
+ * <TR>
+ * <TH><P><CODE>barColor</CODE></TH>
+ * <TH><P><CODE>textColor</CODE></TH>
+ * <TH><P>Result</TH>
+ * </TR>
+ * <TR>
+ * <TD><P><CODE>null</CODE></TD>
+ * <TD><P><CODE>null</CODE></TD>
+ * <TD><P>bars and text painted with current fill color</TD>
+ * </TR>
+ * <TR>
+ * <TD><P><CODE>barColor</CODE></TD>
+ * <TD><P><CODE>null</CODE></TD>
+ * <TD><P>bars and text painted with <CODE>barColor</CODE></TD>
+ * </TR>
+ * <TR>
+ * <TD><P><CODE>null</CODE></TD>
+ * <TD><P><CODE>textColor</CODE></TD>
+ * <TD><P>bars painted with current color<br>text painted with <CODE>textColor</CODE></TD>
+ * </TR>
+ * <TR>
+ * <TD><P><CODE>barColor</CODE></TD>
+ * <TD><P><CODE>textColor</CODE></TD>
+ * <TD><P>bars painted with <CODE>barColor</CODE><br>text painted with <CODE>textColor</CODE></TD>
+ * </TR>
+ * </TABLE>
+ * @param cb the <CODE>PdfContentByte</CODE> where the barcode will be placed
+ * @param barColor the color of the bars. It can be <CODE>null</CODE>
+ * @param textColor the color of the text. It can be <CODE>null</CODE>
+ * @return the dimensions the barcode occupies
+ */
+ public abstract Rectangle placeBarcode(PdfContentByte cb, Color barColor, Color textColor);
+
+ /** Creates a template with the barcode.
+ * @param cb the <CODE>PdfContentByte</CODE> to create the template. It
+ * serves no other use
+ * @param barColor the color of the bars. It can be <CODE>null</CODE>
+ * @param textColor the color of the text. It can be <CODE>null</CODE>
+ * @return the template
+ * @see #placeBarcode(PdfContentByte cb, Color barColor, Color textColor)
+ */
+ public PdfTemplate createTemplateWithBarcode(PdfContentByte cb, Color barColor, Color textColor) {
+ PdfTemplate tp = cb.createTemplate(0, 0);
+ Rectangle rect = placeBarcode(tp, barColor, textColor);
+ tp.setBoundingBox(rect);
+ return tp;
+ }
+
+ /** Creates an <CODE>Image</CODE> with the barcode.
+ * @param cb the <CODE>PdfContentByte</CODE> to create the <CODE>Image</CODE>. It
+ * serves no other use
+ * @param barColor the color of the bars. It can be <CODE>null</CODE>
+ * @param textColor the color of the text. It can be <CODE>null</CODE>
+ * @return the <CODE>Image</CODE>
+ * @see #placeBarcode(PdfContentByte cb, Color barColor, Color textColor)
+ */
+ public Image createImageWithBarcode(PdfContentByte cb, Color barColor, Color textColor) {
+ try {
+ return Image.getInstance(createTemplateWithBarcode(cb, barColor, textColor));
+ }
+ catch (Exception e) {
+ throw new ExceptionConverter(e);
+ }
+ }
+
+ /** Creates a <CODE>java.awt.Image</CODE>. This image only
+ * contains the bars without any text.
+ * @param foreground the color of the bars
+ * @param background the color of the background
+ * @return the image
+ */
+ public abstract java.awt.Image createAwtImage(Color foreground, Color background);
+
+ /** Gets the amount of ink spreading.
+ * @return the ink spreading
+ *
+ */
+ public float getInkSpreading() {
+ return this.inkSpreading;
+ }
+
+ /** Sets the amount of ink spreading. This value will be subtracted
+ * to the width of each bar. The actual value will depend on the ink
+ * and the printing medium.
+ * @param inkSpreading the ink spreading
+ *
+ */
+ public void setInkSpreading(float inkSpreading) {
+ }
+
+ /**
+ * The alternate text to be used, if present.
+ */
+ protected String altText;
+
+ /**
+ * Gets the alternate text.
+ * @return the alternate text
+ */
+ public String getAltText() {
+ return this.altText;
+ }
+
+ /**
+ * Sets the alternate text. If present, this text will be used instead of the
+ * text derived from the supplied code.
+ * @param altText the alternate text
+ */
+ public void setAltText(String altText) {
+ this.altText = altText;
+ }
+
+}
diff --git a/src/main/java/com/lowagie/text/pdf/Barcode128.java b/src/main/java/com/lowagie/text/pdf/Barcode128.java
new file mode 100644
index 0000000..f9fb656
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/Barcode128.java
@@ -0,0 +1,825 @@
+/*
+ * $Id: Barcode128.java,v 1.18 2006/02/09 18:07:56 psoares33 Exp $
+ *
+ * Copyright 2002-2006 by Paulo Soares.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+package com.lowagie.text.pdf;
+import com.lowagie.text.Rectangle;
+import com.lowagie.text.Element;
+import com.lowagie.text.ExceptionConverter;
+import java.awt.Color;
+import java.awt.Image;
+import java.awt.Canvas;
+import java.awt.image.MemoryImageSource;
+
+/**
+ * Implements the code 128 and UCC/EAN-128. Other symbologies are allowed in raw mode.<p>
+ * The code types allowed are:<br>
+ * <ul>
+ * <li><b>CODE128</b> - plain barcode 128.
+ * <li><b>CODE128_UCC</b> - support for UCC/EAN-128 with a full list of AI.
+ * <li><b>CODE128_RAW</b> - raw mode. The code attribute has the actual codes from 0
+ * to 105 followed by '&#92;uffff' and the human readable text.
+ * </ul>
+ * The default parameters are:
+ * <pre>
+ * x = 0.8f;
+ * font = BaseFont.createFont("Helvetica", "winansi", false);
+ * size = 8;
+ * baseline = size;
+ * barHeight = size * 3;
+ * textAlignment = Element.ALIGN_CENTER;
+ * codeType = CODE128;
+ * </pre>
+ * @author Paulo Soares (psoares@consiste.pt)
+ */
+public class Barcode128 extends Barcode{
+
+ /** The bars to generate the code.
+ */
+ static byte BARS[][] =
+ {
+ {2, 1, 2, 2, 2, 2},
+ {2, 2, 2, 1, 2, 2},
+ {2, 2, 2, 2, 2, 1},
+ {1, 2, 1, 2, 2, 3},
+ {1, 2, 1, 3, 2, 2},
+ {1, 3, 1, 2, 2, 2},
+ {1, 2, 2, 2, 1, 3},
+ {1, 2, 2, 3, 1, 2},
+ {1, 3, 2, 2, 1, 2},
+ {2, 2, 1, 2, 1, 3},
+ {2, 2, 1, 3, 1, 2},
+ {2, 3, 1, 2, 1, 2},
+ {1, 1, 2, 2, 3, 2},
+ {1, 2, 2, 1, 3, 2},
+ {1, 2, 2, 2, 3, 1},
+ {1, 1, 3, 2, 2, 2},
+ {1, 2, 3, 1, 2, 2},
+ {1, 2, 3, 2, 2, 1},
+ {2, 2, 3, 2, 1, 1},
+ {2, 2, 1, 1, 3, 2},
+ {2, 2, 1, 2, 3, 1},
+ {2, 1, 3, 2, 1, 2},
+ {2, 2, 3, 1, 1, 2},
+ {3, 1, 2, 1, 3, 1},
+ {3, 1, 1, 2, 2, 2},
+ {3, 2, 1, 1, 2, 2},
+ {3, 2, 1, 2, 2, 1},
+ {3, 1, 2, 2, 1, 2},
+ {3, 2, 2, 1, 1, 2},
+ {3, 2, 2, 2, 1, 1},
+ {2, 1, 2, 1, 2, 3},
+ {2, 1, 2, 3, 2, 1},
+ {2, 3, 2, 1, 2, 1},
+ {1, 1, 1, 3, 2, 3},
+ {1, 3, 1, 1, 2, 3},
+ {1, 3, 1, 3, 2, 1},
+ {1, 1, 2, 3, 1, 3},
+ {1, 3, 2, 1, 1, 3},
+ {1, 3, 2, 3, 1, 1},
+ {2, 1, 1, 3, 1, 3},
+ {2, 3, 1, 1, 1, 3},
+ {2, 3, 1, 3, 1, 1},
+ {1, 1, 2, 1, 3, 3},
+ {1, 1, 2, 3, 3, 1},
+ {1, 3, 2, 1, 3, 1},
+ {1, 1, 3, 1, 2, 3},
+ {1, 1, 3, 3, 2, 1},
+ {1, 3, 3, 1, 2, 1},
+ {3, 1, 3, 1, 2, 1},
+ {2, 1, 1, 3, 3, 1},
+ {2, 3, 1, 1, 3, 1},
+ {2, 1, 3, 1, 1, 3},
+ {2, 1, 3, 3, 1, 1},
+ {2, 1, 3, 1, 3, 1},
+ {3, 1, 1, 1, 2, 3},
+ {3, 1, 1, 3, 2, 1},
+ {3, 3, 1, 1, 2, 1},
+ {3, 1, 2, 1, 1, 3},
+ {3, 1, 2, 3, 1, 1},
+ {3, 3, 2, 1, 1, 1},
+ {3, 1, 4, 1, 1, 1},
+ {2, 2, 1, 4, 1, 1},
+ {4, 3, 1, 1, 1, 1},
+ {1, 1, 1, 2, 2, 4},
+ {1, 1, 1, 4, 2, 2},
+ {1, 2, 1, 1, 2, 4},
+ {1, 2, 1, 4, 2, 1},
+ {1, 4, 1, 1, 2, 2},
+ {1, 4, 1, 2, 2, 1},
+ {1, 1, 2, 2, 1, 4},
+ {1, 1, 2, 4, 1, 2},
+ {1, 2, 2, 1, 1, 4},
+ {1, 2, 2, 4, 1, 1},
+ {1, 4, 2, 1, 1, 2},
+ {1, 4, 2, 2, 1, 1},
+ {2, 4, 1, 2, 1, 1},
+ {2, 2, 1, 1, 1, 4},
+ {4, 1, 3, 1, 1, 1},
+ {2, 4, 1, 1, 1, 2},
+ {1, 3, 4, 1, 1, 1},
+ {1, 1, 1, 2, 4, 2},
+ {1, 2, 1, 1, 4, 2},
+ {1, 2, 1, 2, 4, 1},
+ {1, 1, 4, 2, 1, 2},
+ {1, 2, 4, 1, 1, 2},
+ {1, 2, 4, 2, 1, 1},
+ {4, 1, 1, 2, 1, 2},
+ {4, 2, 1, 1, 1, 2},
+ {4, 2, 1, 2, 1, 1},
+ {2, 1, 2, 1, 4, 1},
+ {2, 1, 4, 1, 2, 1},
+ {4, 1, 2, 1, 2, 1},
+ {1, 1, 1, 1, 4, 3},
+ {1, 1, 1, 3, 4, 1},
+ {1, 3, 1, 1, 4, 1},
+ {1, 1, 4, 1, 1, 3},
+ {1, 1, 4, 3, 1, 1},
+ {4, 1, 1, 1, 1, 3},
+ {4, 1, 1, 3, 1, 1},
+ {1, 1, 3, 1, 4, 1},
+ {1, 1, 4, 1, 3, 1},
+ {3, 1, 1, 1, 4, 1},
+ {4, 1, 1, 1, 3, 1},
+ {2, 1, 1, 4, 1, 2},
+ {2, 1, 1, 2, 1, 4},
+ {2, 1, 1, 2, 3, 2}
+ };
+
+ /** The stop bars.
+ */
+ static byte BARS_STOP[] = {2, 3, 3, 1, 1, 1, 2};
+ /** The charset code change.
+ */
+ public static final char CODE_AB_TO_C = 99;
+ /** The charset code change.
+ */
+ public static final char CODE_AC_TO_B = 100;
+ /** The charset code change.
+ */
+ public static final char CODE_BC_TO_A = 101;
+ /** The code for UCC/EAN-128.
+ */
+ public static final char FNC1_INDEX = 102;
+ /** The start code.
+ */
+ public static final char START_A = 103;
+ /** The start code.
+ */
+ public static final char START_B = 104;
+ /** The start code.
+ */
+ public static final char START_C = 105;
+
+ public static final char FNC1 = '\u00ca';
+ public static final char DEL = '\u00c3';
+ public static final char FNC3 = '\u00c4';
+ public static final char FNC2 = '\u00c5';
+ public static final char SHIFT = '\u00c6';
+ public static final char CODE_C = '\u00c7';
+ public static final char CODE_A = '\u00c8';
+ public static final char FNC4 = '\u00c8';
+ public static final char STARTA = '\u00cb';
+ public static final char STARTB = '\u00cc';
+ public static final char STARTC = '\u00cd';
+
+ private static final IntHashtable ais = new IntHashtable();
+ /** Creates new Barcode128 */
+ public Barcode128() {
+ try {
+ x = 0.8f;
+ font = BaseFont.createFont("Helvetica", "winansi", false);
+ size = 8;
+ baseline = size;
+ barHeight = size * 3;
+ textAlignment = Element.ALIGN_CENTER;
+ codeType = CODE128;
+ }
+ catch (Exception e) {
+ throw new ExceptionConverter(e);
+ }
+ }
+
+ /**
+ * Removes the FNC1 codes in the text.
+ * @param code the text to clean
+ * @return the cleaned text
+ */
+ public static String removeFNC1(String code) {
+ int len = code.length();
+ StringBuffer buf = new StringBuffer(len);
+ for (int k = 0; k < len; ++k) {
+ char c = code.charAt(k);
+ if (c >= 32 && c <= 126)
+ buf.append(c);
+ }
+ return buf.toString();
+ }
+
+ /**
+ * Gets the human readable text of a sequence of AI.
+ * @param code the text
+ * @return the human readable text
+ */
+ public static String getHumanReadableUCCEAN(String code) {
+ StringBuffer buf = new StringBuffer();
+ String fnc1 = String.valueOf(FNC1);
+ try {
+ while (true) {
+ if (code.startsWith(fnc1)) {
+ code = code.substring(1);
+ continue;
+ }
+ int n = 0;
+ int idlen = 0;
+ for (int k = 2; k < 5; ++k) {
+ if (code.length() < k)
+ break;
+ if ((n = ais.get(Integer.parseInt(code.substring(0, k)))) != 0) {
+ idlen = k;
+ break;
+ }
+ }
+ if (idlen == 0)
+ break;
+ buf.append('(').append(code.substring(0, idlen)).append(')');
+ code = code.substring(idlen);
+ if (n > 0) {
+ n -= idlen;
+ if (code.length() <= n)
+ break;
+ buf.append(removeFNC1(code.substring(0, n)));
+ code = code.substring(n);
+ }
+ else {
+ int idx = code.indexOf(FNC1);
+ if (idx < 0)
+ break;
+ buf.append(code.substring(0,idx));
+ code = code.substring(idx + 1);
+ }
+ }
+ }
+ catch (Exception e) {
+ //empty
+ }
+ buf.append(removeFNC1(code));
+ return buf.toString();
+ }
+
+ /** Returns <CODE>true</CODE> if the next <CODE>numDigits</CODE>
+ * starting from index <CODE>textIndex</CODE> are numeric skipping any FNC1.
+ * @param text the text to check
+ * @param textIndex where to check from
+ * @param numDigits the number of digits to check
+ * @return the check result
+ */
+ static boolean isNextDigits(String text, int textIndex, int numDigits) {
+ int len = text.length();
+ while (textIndex < len && numDigits > 0) {
+ if (text.charAt(textIndex) == FNC1) {
+ ++textIndex;
+ continue;
+ }
+ int n = Math.min(2, numDigits);
+ if (textIndex + n > len)
+ return false;
+ while (n-- > 0) {
+ char c = text.charAt(textIndex++);
+ if (c < '0' || c > '9')
+ return false;
+ --numDigits;
+ }
+ }
+ return numDigits == 0;
+ }
+
+ /** Packs the digits for charset C also considering FNC1. It assumes that all the parameters
+ * are valid.
+ * @param text the text to pack
+ * @param textIndex where to pack from
+ * @param numDigits the number of digits to pack. It is always an even number
+ * @return the packed digits, two digits per character
+ */
+ static String getPackedRawDigits(String text, int textIndex, int numDigits) {
+ String out = "";
+ int start = textIndex;
+ while (numDigits > 0) {
+ if (text.charAt(textIndex) == FNC1) {
+ out += FNC1_INDEX;
+ ++textIndex;
+ continue;
+ }
+ numDigits -= 2;
+ int c1 = text.charAt(textIndex++) - '0';
+ int c2 = text.charAt(textIndex++) - '0';
+ out += (char)(c1 * 10 + c2);
+ }
+ return (char)(textIndex - start) + out;
+ }
+
+ /** Converts the human readable text to the characters needed to
+ * create a barcode. Some optimization is done to get the shortest code.
+ * @param text the text to convert
+ * @param ucc <CODE>true</CODE> if it is an UCC/EAN-128. In this case
+ * the character FNC1 is added
+ * @return the code ready to be fed to getBarsCode128Raw()
+ */
+ public static String getRawText(String text, boolean ucc) {
+ String out = "";
+ int tLen = text.length();
+ if (tLen == 0) {
+ out += START_B;
+ if (ucc)
+ out += FNC1_INDEX;
+ return out;
+ }
+ int c = 0;
+ for (int k = 0; k < tLen; ++k) {
+ c = text.charAt(k);
+ if (c > 127 && c != FNC1)
+ throw new RuntimeException("There are illegal characters for barcode 128 in '" + text + "'.");
+ }
+ c = text.charAt(0);
+ char currentCode = START_B;
+ int index = 0;
+ if (isNextDigits(text, index, 2)) {
+ currentCode = START_C;
+ out += currentCode;
+ if (ucc)
+ out += FNC1_INDEX;
+ String out2 = getPackedRawDigits(text, index, 2);
+ index += (int)out2.charAt(0);
+ out += out2.substring(1);
+ }
+ else if (c < ' ') {
+ currentCode = START_A;
+ out += currentCode;
+ if (ucc)
+ out += FNC1_INDEX;
+ out += (char)(c + 64);
+ ++index;
+ }
+ else {
+ out += currentCode;
+ if (ucc)
+ out += FNC1_INDEX;
+ if (c == FNC1)
+ out += FNC1_INDEX;
+ else
+ out += (char)(c - ' ');
+ ++index;
+ }
+ while (index < tLen) {
+ switch (currentCode) {
+ case START_A:
+ {
+ if (isNextDigits(text, index, 4)) {
+ currentCode = START_C;
+ out += CODE_AB_TO_C;
+ String out2 = getPackedRawDigits(text, index, 4);
+ index += (int)out2.charAt(0);
+ out += out2.substring(1);
+ }
+ else {
+ c = text.charAt(index++);
+ if (c == FNC1)
+ out += FNC1_INDEX;
+ else if (c > '_') {
+ currentCode = START_B;
+ out += CODE_AC_TO_B;
+ out += (char)(c - ' ');
+ }
+ else if (c < ' ')
+ out += (char)(c + 64);
+ else
+ out += (char)(c - ' ');
+ }
+ }
+ break;
+ case START_B:
+ {
+ if (isNextDigits(text, index, 4)) {
+ currentCode = START_C;
+ out += CODE_AB_TO_C;
+ String out2 = getPackedRawDigits(text, index, 4);
+ index += (int)out2.charAt(0);
+ out += out2.substring(1);
+ }
+ else {
+ c = text.charAt(index++);
+ if (c == FNC1)
+ out += FNC1_INDEX;
+ else if (c < ' ') {
+ currentCode = START_A;
+ out += CODE_BC_TO_A;
+ out += (char)(c + 64);
+ }
+ else {
+ out += (char)(c - ' ');
+ }
+ }
+ }
+ break;
+ case START_C:
+ {
+ if (isNextDigits(text, index, 2)) {
+ String out2 = getPackedRawDigits(text, index, 2);
+ index += (int)out2.charAt(0);
+ out += out2.substring(1);
+ }
+ else {
+ c = text.charAt(index++);
+ if (c == FNC1)
+ out += FNC1_INDEX;
+ else if (c < ' ') {
+ currentCode = START_A;
+ out += CODE_BC_TO_A;
+ out += (char)(c + 64);
+ }
+ else {
+ currentCode = START_B;
+ out += CODE_AC_TO_B;
+ out += (char)(c - ' ');
+ }
+ }
+ }
+ break;
+ }
+ }
+ return out;
+ }
+
+ /** Generates the bars. The input has the actual barcodes, not
+ * the human readable text.
+ * @param text the barcode
+ * @return the bars
+ */
+ public static byte[] getBarsCode128Raw(String text) {
+ int idx = text.indexOf('\uffff');
+ if (idx >= 0)
+ text = text.substring(0, idx);
+ int chk = text.charAt(0);
+ for (int k = 1; k < text.length(); ++k)
+ chk += k * text.charAt(k);
+ chk = chk % 103;
+ text += (char)chk;
+ byte bars[] = new byte[(text.length() + 1) * 6 + 7];
+ int k;
+ for (k = 0; k < text.length(); ++k)
+ System.arraycopy(BARS[text.charAt(k)], 0, bars, k * 6, 6);
+ System.arraycopy(BARS_STOP, 0, bars, k * 6, 7);
+ return bars;
+ }
+
+ /** Gets the maximum area that the barcode and the text, if
+ * any, will occupy. The lower left corner is always (0, 0).
+ * @return the size the barcode occupies.
+ */
+ public Rectangle getBarcodeSize() {
+ float fontX = 0;
+ float fontY = 0;
+ String fullCode;
+ if (font != null) {
+ if (baseline > 0)
+ fontY = baseline - font.getFontDescriptor(BaseFont.DESCENT, size);
+ else
+ fontY = -baseline + size;
+ if (codeType == CODE128_RAW) {
+ int idx = code.indexOf('\uffff');
+ if (idx < 0)
+ fullCode = "";
+ else
+ fullCode = code.substring(idx + 1);
+ }
+ else if (codeType == CODE128_UCC)
+ fullCode = getHumanReadableUCCEAN(code);
+ else
+ fullCode = removeFNC1(code);
+ fontX = font.getWidthPoint(altText != null ? altText : fullCode, size);
+ }
+ if (codeType == CODE128_RAW) {
+ int idx = code.indexOf('\uffff');
+ if (idx >= 0)
+ fullCode = code.substring(0, idx);
+ else
+ fullCode = code;
+ }
+ else {
+ fullCode = getRawText(code, codeType == CODE128_UCC);
+ }
+ int len = fullCode.length();
+ float fullWidth = (len + 2) * 11 * x + 2 * x;
+ fullWidth = Math.max(fullWidth, fontX);
+ float fullHeight = barHeight + fontY;
+ return new Rectangle(fullWidth, fullHeight);
+ }
+
+ /** Places the barcode in a <CODE>PdfContentByte</CODE>. The
+ * barcode is always placed at coodinates (0, 0). Use the
+ * translation matrix to move it elsewhere.<p>
+ * The bars and text are written in the following colors:<p>
+ * <P><TABLE BORDER=1>
+ * <TR>
+ * <TH><P><CODE>barColor</CODE></TH>
+ * <TH><P><CODE>textColor</CODE></TH>
+ * <TH><P>Result</TH>
+ * </TR>
+ * <TR>
+ * <TD><P><CODE>null</CODE></TD>
+ * <TD><P><CODE>null</CODE></TD>
+ * <TD><P>bars and text painted with current fill color</TD>
+ * </TR>
+ * <TR>
+ * <TD><P><CODE>barColor</CODE></TD>
+ * <TD><P><CODE>null</CODE></TD>
+ * <TD><P>bars and text painted with <CODE>barColor</CODE></TD>
+ * </TR>
+ * <TR>
+ * <TD><P><CODE>null</CODE></TD>
+ * <TD><P><CODE>textColor</CODE></TD>
+ * <TD><P>bars painted with current color<br>text painted with <CODE>textColor</CODE></TD>
+ * </TR>
+ * <TR>
+ * <TD><P><CODE>barColor</CODE></TD>
+ * <TD><P><CODE>textColor</CODE></TD>
+ * <TD><P>bars painted with <CODE>barColor</CODE><br>text painted with <CODE>textColor</CODE></TD>
+ * </TR>
+ * </TABLE>
+ * @param cb the <CODE>PdfContentByte</CODE> where the barcode will be placed
+ * @param barColor the color of the bars. It can be <CODE>null</CODE>
+ * @param textColor the color of the text. It can be <CODE>null</CODE>
+ * @return the dimensions the barcode occupies
+ */
+ public Rectangle placeBarcode(PdfContentByte cb, Color barColor, Color textColor) {
+ String fullCode;
+ if (codeType == CODE128_RAW) {
+ int idx = code.indexOf('\uffff');
+ if (idx < 0)
+ fullCode = "";
+ else
+ fullCode = code.substring(idx + 1);
+ }
+ else if (codeType == CODE128_UCC)
+ fullCode = getHumanReadableUCCEAN(code);
+ else
+ fullCode = removeFNC1(code);
+ float fontX = 0;
+ if (font != null) {
+ fontX = font.getWidthPoint(fullCode = altText != null ? altText : fullCode, size);
+ }
+ String bCode;
+ if (codeType == CODE128_RAW) {
+ int idx = code.indexOf('\uffff');
+ if (idx >= 0)
+ bCode = code.substring(0, idx);
+ else
+ bCode = code;
+ }
+ else {
+ bCode = getRawText(code, codeType == CODE128_UCC);
+ }
+ int len = bCode.length();
+ float fullWidth = (len + 2) * 11 * x + 2 * x;
+ float barStartX = 0;
+ float textStartX = 0;
+ switch (textAlignment) {
+ case Element.ALIGN_LEFT:
+ break;
+ case Element.ALIGN_RIGHT:
+ if (fontX > fullWidth)
+ barStartX = fontX - fullWidth;
+ else
+ textStartX = fullWidth - fontX;
+ break;
+ default:
+ if (fontX > fullWidth)
+ barStartX = (fontX - fullWidth) / 2;
+ else
+ textStartX = (fullWidth - fontX) / 2;
+ break;
+ }
+ float barStartY = 0;
+ float textStartY = 0;
+ if (font != null) {
+ if (baseline <= 0)
+ textStartY = barHeight - baseline;
+ else {
+ textStartY = -font.getFontDescriptor(BaseFont.DESCENT, size);
+ barStartY = textStartY + baseline;
+ }
+ }
+ byte bars[] = getBarsCode128Raw(bCode);
+ boolean print = true;
+ if (barColor != null)
+ cb.setColorFill(barColor);
+ for (int k = 0; k < bars.length; ++k) {
+ float w = bars[k] * x;
+ if (print)
+ cb.rectangle(barStartX, barStartY, w - inkSpreading, barHeight);
+ print = !print;
+ barStartX += w;
+ }
+ cb.fill();
+ if (font != null) {
+ if (textColor != null)
+ cb.setColorFill(textColor);
+ cb.beginText();
+ cb.setFontAndSize(font, size);
+ cb.setTextMatrix(textStartX, textStartY);
+ cb.showText(fullCode);
+ cb.endText();
+ }
+ return getBarcodeSize();
+ }
+
+ /** Creates a <CODE>java.awt.Image</CODE>. This image only
+ * contains the bars without any text.
+ * @param foreground the color of the bars
+ * @param background the color of the background
+ * @return the image
+ */
+ public java.awt.Image createAwtImage(Color foreground, Color background) {
+ int f = foreground.getRGB();
+ int g = background.getRGB();
+ Canvas canvas = new Canvas();
+ String bCode;
+ if (codeType == CODE128_RAW) {
+ int idx = code.indexOf('\uffff');
+ if (idx >= 0)
+ bCode = code.substring(0, idx);
+ else
+ bCode = code;
+ }
+ else {
+ bCode = getRawText(code, codeType == CODE128_UCC);
+ }
+ int len = bCode.length();
+ int fullWidth = (len + 2) * 11 + 2;
+ byte bars[] = getBarsCode128Raw(bCode);
+
+ boolean print = true;
+ int ptr = 0;
+ int height = (int)barHeight;
+ int pix[] = new int[fullWidth * height];
+ for (int k = 0; k < bars.length; ++k) {
+ int w = bars[k];
+ int c = g;
+ if (print)
+ c = f;
+ print = !print;
+ for (int j = 0; j < w; ++j)
+ pix[ptr++] = c;
+ }
+ for (int k = fullWidth; k < pix.length; k += fullWidth) {
+ System.arraycopy(pix, 0, pix, k, fullWidth);
+ }
+ Image img = canvas.createImage(new MemoryImageSource(fullWidth, height, pix, 0, fullWidth));
+
+ return img;
+ }
+
+ /**
+ * Sets the code to generate. If it's an UCC code and starts with '(' it will
+ * be split by the AI. This code in UCC mode is valid:
+ * <p>
+ * <code>(01)00000090311314(10)ABC123(15)060916</code>
+ * @param code the code to generate
+ */
+ public void setCode(String code) {
+ if (getCodeType() == Barcode128.CODE128_UCC && code.startsWith("(")) {
+ int idx = 0;
+ String ret = "";
+ while (idx >= 0) {
+ int end = code.indexOf(')', idx);
+ if (end < 0)
+ throw new IllegalArgumentException("Badly formed UCC string: " + code);
+ String sai = code.substring(idx + 1, end);
+ if (sai.length() < 2)
+ throw new IllegalArgumentException("AI too short: (" + sai + ")");
+ int ai = Integer.parseInt(sai);
+ int len = ais.get(ai);
+ if (len == 0)
+ throw new IllegalArgumentException("AI not found: (" + sai + ")");
+ sai = String.valueOf(ai);
+ if (sai.length() == 1)
+ sai = "0" + sai;
+ idx = code.indexOf('(', end);
+ int next = (idx < 0 ? code.length() : idx);
+ ret += sai + code.substring(end + 1, next);
+ if (len < 0) {
+ if (idx >= 0)
+ ret += FNC1;
+ }
+ else if (next - end - 1 + sai.length() != len)
+ throw new IllegalArgumentException("Invalid AI length: (" + sai + ")");
+ }
+ super.setCode(ret);
+ }
+ else
+ super.setCode(code);
+ }
+
+ static {
+ ais.put(0, 20);
+ ais.put(1, 16);
+ ais.put(2, 16);
+ ais.put(10, -1);
+ ais.put(11, 9);
+ ais.put(12, 8);
+ ais.put(13, 8);
+ ais.put(15, 8);
+ ais.put(17, 8);
+ ais.put(20, 4);
+ ais.put(21, -1);
+ ais.put(22, -1);
+ ais.put(23, -1);
+ ais.put(240, -1);
+ ais.put(241, -1);
+ ais.put(250, -1);
+ ais.put(251, -1);
+ ais.put(252, -1);
+ ais.put(30, -1);
+ for (int k = 3100; k < 3700; ++k)
+ ais.put(k, 10);
+ ais.put(37, -1);
+ for (int k = 3900; k < 3940; ++k)
+ ais.put(k, -1);
+ ais.put(400, -1);
+ ais.put(401, -1);
+ ais.put(402, 20);
+ ais.put(403, -1);
+ for (int k = 410; k < 416; ++k)
+ ais.put(k, 16);
+ ais.put(420, -1);
+ ais.put(421, -1);
+ ais.put(422, 6);
+ ais.put(423, -1);
+ ais.put(424, 6);
+ ais.put(425, 6);
+ ais.put(426, 6);
+ ais.put(7001, 17);
+ ais.put(7002, -1);
+ for (int k = 7030; k < 704; ++k)
+ ais.put(k, -1);
+ ais.put(8001, 18);
+ ais.put(8002, -1);
+ ais.put(8003, -1);
+ ais.put(8004, -1);
+ ais.put(8005, 10);
+ ais.put(8006, 22);
+ ais.put(8007, -1);
+ ais.put(8008, -1);
+ ais.put(8018, 22);
+ ais.put(8020, -1);
+ ais.put(8100, 10);
+ ais.put(8101, 14);
+ ais.put(8102, 6);
+ for (int k = 90; k < 100; ++k)
+ ais.put(k, -1);
+ }
+}
diff --git a/src/main/java/com/lowagie/text/pdf/Barcode39.java b/src/main/java/com/lowagie/text/pdf/Barcode39.java
new file mode 100644
index 0000000..cf9ecdf
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/Barcode39.java
@@ -0,0 +1,392 @@
+/*
+ * $Id: Barcode39.java,v 1.18 2006/02/09 18:07:56 psoares33 Exp $
+ *
+ * Copyright 2002-2006 by Paulo Soares.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+package com.lowagie.text.pdf;
+
+import com.lowagie.text.ExceptionConverter;
+import com.lowagie.text.Element;
+import com.lowagie.text.Rectangle;
+import java.awt.Color;
+import java.awt.Image;
+import java.awt.Canvas;
+import java.awt.image.MemoryImageSource;
+
+/** Implements the code 39 and code 39 extended. The default parameters are:
+ * <pre>
+ *x = 0.8f;
+ *n = 2;
+ *font = BaseFont.createFont("Helvetica", "winansi", false);
+ *size = 8;
+ *baseline = size;
+ *barHeight = size * 3;
+ *textAlignment = Element.ALIGN_CENTER;
+ *generateChecksum = false;
+ *checksumText = false;
+ *startStopText = true;
+ *extended = false;
+ * </pre>
+ *
+ * @author Paulo Soares (psoares@consiste.pt)
+ */
+public class Barcode39 extends Barcode{
+
+ /** The bars to generate the code.
+ */
+ static byte BARS[][] =
+ {
+ {0,0,0,1,1,0,1,0,0},
+ {1,0,0,1,0,0,0,0,1},
+ {0,0,1,1,0,0,0,0,1},
+ {1,0,1,1,0,0,0,0,0},
+ {0,0,0,1,1,0,0,0,1},
+ {1,0,0,1,1,0,0,0,0},
+ {0,0,1,1,1,0,0,0,0},
+ {0,0,0,1,0,0,1,0,1},
+ {1,0,0,1,0,0,1,0,0},
+ {0,0,1,1,0,0,1,0,0},
+ {1,0,0,0,0,1,0,0,1},
+ {0,0,1,0,0,1,0,0,1},
+ {1,0,1,0,0,1,0,0,0},
+ {0,0,0,0,1,1,0,0,1},
+ {1,0,0,0,1,1,0,0,0},
+ {0,0,1,0,1,1,0,0,0},
+ {0,0,0,0,0,1,1,0,1},
+ {1,0,0,0,0,1,1,0,0},
+ {0,0,1,0,0,1,1,0,0},
+ {0,0,0,0,1,1,1,0,0},
+ {1,0,0,0,0,0,0,1,1},
+ {0,0,1,0,0,0,0,1,1},
+ {1,0,1,0,0,0,0,1,0},
+ {0,0,0,0,1,0,0,1,1},
+ {1,0,0,0,1,0,0,1,0},
+ {0,0,1,0,1,0,0,1,0},
+ {0,0,0,0,0,0,1,1,1},
+ {1,0,0,0,0,0,1,1,0},
+ {0,0,1,0,0,0,1,1,0},
+ {0,0,0,0,1,0,1,1,0},
+ {1,1,0,0,0,0,0,0,1},
+ {0,1,1,0,0,0,0,0,1},
+ {1,1,1,0,0,0,0,0,0},
+ {0,1,0,0,1,0,0,0,1},
+ {1,1,0,0,1,0,0,0,0},
+ {0,1,1,0,1,0,0,0,0},
+ {0,1,0,0,0,0,1,0,1},
+ {1,1,0,0,0,0,1,0,0},
+ {0,1,1,0,0,0,1,0,0},
+ {0,1,0,1,0,1,0,0,0},
+ {0,1,0,1,0,0,0,1,0},
+ {0,1,0,0,0,1,0,1,0},
+ {0,0,0,1,0,1,0,1,0},
+ {0,1,0,0,1,0,1,0,0}
+ };
+
+ /** The index chars to <CODE>BARS</CODE>.
+ */
+ static String CHARS = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%*";
+
+ /** The character combinations to make the code 39 extended.
+ */
+ static String EXTENDED = "%U" +
+ "$A$B$C$D$E$F$G$H$I$J$K$L$M$N$O$P$Q$R$S$T$U$V$W$X$Y$Z" +
+ "%A%B%C%D%E /A/B/C/D/E/F/G/H/I/J/K/L - ./O" +
+ " 0 1 2 3 4 5 6 7 8 9/Z%F%G%H%I%J%V" +
+ " A B C D E F G H I J K L M N O P Q R S T U V W X Y Z" +
+ "%K%L%M%N%O%W" +
+ "+A+B+C+D+E+F+G+H+I+J+K+L+M+N+O+P+Q+R+S+T+U+V+W+X+Y+Z" +
+ "%P%Q%R%S%T";
+
+ /** Creates a new Barcode39.
+ */
+ public Barcode39() {
+ try {
+ x = 0.8f;
+ n = 2;
+ font = BaseFont.createFont("Helvetica", "winansi", false);
+ size = 8;
+ baseline = size;
+ barHeight = size * 3;
+ textAlignment = Element.ALIGN_CENTER;
+ generateChecksum = false;
+ checksumText = false;
+ startStopText = true;
+ extended = false;
+ }
+ catch (Exception e) {
+ throw new ExceptionConverter(e);
+ }
+ }
+
+ /** Creates the bars.
+ * @param text the text to create the bars. This text does not include the start and
+ * stop characters
+ * @return the bars
+ */
+ public static byte[] getBarsCode39(String text) {
+ text = "*" + text + "*";
+ byte bars[] = new byte[text.length() * 10 - 1];
+ for (int k = 0; k < text.length(); ++k) {
+ int idx = CHARS.indexOf(text.charAt(k));
+ if (idx < 0)
+ throw new IllegalArgumentException("The character '" + text.charAt(k) + "' is illegal in code 39.");
+ System.arraycopy(BARS[idx], 0, bars, k * 10, 9);
+ }
+ return bars;
+ }
+
+ /** Converts the extended text into a normal, escaped text,
+ * ready to generate bars.
+ * @param text the extended text
+ * @return the escaped text
+ */
+ public static String getCode39Ex(String text) {
+ String out = "";
+ for (int k = 0; k < text.length(); ++k) {
+ char c = text.charAt(k);
+ if (c > 127)
+ throw new IllegalArgumentException("The character '" + c + "' is illegal in code 39 extended.");
+ char c1 = EXTENDED.charAt(c * 2);
+ char c2 = EXTENDED.charAt(c * 2 + 1);
+ if (c1 != ' ')
+ out += c1;
+ out += c2;
+ }
+ return out;
+ }
+
+ /** Calculates the checksum.
+ * @param text the text
+ * @return the checksum
+ */
+ static char getChecksum(String text) {
+ int chk = 0;
+ for (int k = 0; k < text.length(); ++k) {
+ int idx = CHARS.indexOf(text.charAt(k));
+ if (idx < 0)
+ throw new IllegalArgumentException("The character '" + text.charAt(k) + "' is illegal in code 39.");
+ chk += idx;
+ }
+ return CHARS.charAt(chk % 43);
+ }
+
+ /** Gets the maximum area that the barcode and the text, if
+ * any, will occupy. The lower left corner is always (0, 0).
+ * @return the size the barcode occupies.
+ */
+ public Rectangle getBarcodeSize() {
+ float fontX = 0;
+ float fontY = 0;
+ if (font != null) {
+ if (baseline > 0)
+ fontY = baseline - font.getFontDescriptor(BaseFont.DESCENT, size);
+ else
+ fontY = -baseline + size;
+ String fullCode = code;
+ if (generateChecksum && checksumText)
+ fullCode += getChecksum(fullCode);
+ if (startStopText)
+ fullCode = "*" + fullCode + "*";
+ fontX = font.getWidthPoint(altText != null ? altText : fullCode, size);
+ }
+ String fullCode = code;
+ if (extended)
+ fullCode = getCode39Ex(code);
+ int len = fullCode.length() + 2;
+ if (generateChecksum)
+ ++len;
+ float fullWidth = len * (6 * x + 3 * x * n) + (len - 1) * x;
+ fullWidth = Math.max(fullWidth, fontX);
+ float fullHeight = barHeight + fontY;
+ return new Rectangle(fullWidth, fullHeight);
+ }
+
+ /** Places the barcode in a <CODE>PdfContentByte</CODE>. The
+ * barcode is always placed at coodinates (0, 0). Use the
+ * translation matrix to move it elsewhere.<p>
+ * The bars and text are written in the following colors:<p>
+ * <P><TABLE BORDER=1>
+ * <TR>
+ * <TH><P><CODE>barColor</CODE></TH>
+ * <TH><P><CODE>textColor</CODE></TH>
+ * <TH><P>Result</TH>
+ * </TR>
+ * <TR>
+ * <TD><P><CODE>null</CODE></TD>
+ * <TD><P><CODE>null</CODE></TD>
+ * <TD><P>bars and text painted with current fill color</TD>
+ * </TR>
+ * <TR>
+ * <TD><P><CODE>barColor</CODE></TD>
+ * <TD><P><CODE>null</CODE></TD>
+ * <TD><P>bars and text painted with <CODE>barColor</CODE></TD>
+ * </TR>
+ * <TR>
+ * <TD><P><CODE>null</CODE></TD>
+ * <TD><P><CODE>textColor</CODE></TD>
+ * <TD><P>bars painted with current color<br>text painted with <CODE>textColor</CODE></TD>
+ * </TR>
+ * <TR>
+ * <TD><P><CODE>barColor</CODE></TD>
+ * <TD><P><CODE>textColor</CODE></TD>
+ * <TD><P>bars painted with <CODE>barColor</CODE><br>text painted with <CODE>textColor</CODE></TD>
+ * </TR>
+ * </TABLE>
+ * @param cb the <CODE>PdfContentByte</CODE> where the barcode will be placed
+ * @param barColor the color of the bars. It can be <CODE>null</CODE>
+ * @param textColor the color of the text. It can be <CODE>null</CODE>
+ * @return the dimensions the barcode occupies
+ */
+ public Rectangle placeBarcode(PdfContentByte cb, Color barColor, Color textColor) {
+ String fullCode = code;
+ float fontX = 0;
+ if (font != null) {
+ if (generateChecksum && checksumText)
+ fullCode += getChecksum(fullCode);
+ if (startStopText)
+ fullCode = "*" + fullCode + "*";
+ fontX = font.getWidthPoint(fullCode = altText != null ? altText : fullCode, size);
+ }
+ String bCode = code;
+ if (extended)
+ bCode = getCode39Ex(code);
+ if (generateChecksum)
+ bCode += getChecksum(bCode);
+ int len = bCode.length() + 2;
+ float fullWidth = len * (6 * x + 3 * x * n) + (len - 1) * x;
+ float barStartX = 0;
+ float textStartX = 0;
+ switch (textAlignment) {
+ case Element.ALIGN_LEFT:
+ break;
+ case Element.ALIGN_RIGHT:
+ if (fontX > fullWidth)
+ barStartX = fontX - fullWidth;
+ else
+ textStartX = fullWidth - fontX;
+ break;
+ default:
+ if (fontX > fullWidth)
+ barStartX = (fontX - fullWidth) / 2;
+ else
+ textStartX = (fullWidth - fontX) / 2;
+ break;
+ }
+ float barStartY = 0;
+ float textStartY = 0;
+ if (font != null) {
+ if (baseline <= 0)
+ textStartY = barHeight - baseline;
+ else {
+ textStartY = -font.getFontDescriptor(BaseFont.DESCENT, size);
+ barStartY = textStartY + baseline;
+ }
+ }
+ byte bars[] = getBarsCode39(bCode);
+ boolean print = true;
+ if (barColor != null)
+ cb.setColorFill(barColor);
+ for (int k = 0; k < bars.length; ++k) {
+ float w = (bars[k] == 0 ? x : x * n);
+ if (print)
+ cb.rectangle(barStartX, barStartY, w - inkSpreading, barHeight);
+ print = !print;
+ barStartX += w;
+ }
+ cb.fill();
+ if (font != null) {
+ if (textColor != null)
+ cb.setColorFill(textColor);
+ cb.beginText();
+ cb.setFontAndSize(font, size);
+ cb.setTextMatrix(textStartX, textStartY);
+ cb.showText(fullCode);
+ cb.endText();
+ }
+ return getBarcodeSize();
+ }
+
+ /** Creates a <CODE>java.awt.Image</CODE>. This image only
+ * contains the bars without any text.
+ * @param foreground the color of the bars
+ * @param background the color of the background
+ * @return the image
+ */
+ public java.awt.Image createAwtImage(Color foreground, Color background) {
+ int f = foreground.getRGB();
+ int g = background.getRGB();
+ Canvas canvas = new Canvas();
+
+ String bCode = code;
+ if (extended)
+ bCode = getCode39Ex(code);
+ if (generateChecksum)
+ bCode += getChecksum(bCode);
+ int len = bCode.length() + 2;
+ int nn = (int)n;
+ int fullWidth = len * (6 + 3 * nn) + (len - 1);
+ byte bars[] = getBarsCode39(bCode);
+ boolean print = true;
+ int ptr = 0;
+ int height = (int)barHeight;
+ int pix[] = new int[fullWidth * height];
+ for (int k = 0; k < bars.length; ++k) {
+ int w = (bars[k] == 0 ? 1 : nn);
+ int c = g;
+ if (print)
+ c = f;
+ print = !print;
+ for (int j = 0; j < w; ++j)
+ pix[ptr++] = c;
+ }
+ for (int k = fullWidth; k < pix.length; k += fullWidth) {
+ System.arraycopy(pix, 0, pix, k, fullWidth);
+ }
+ Image img = canvas.createImage(new MemoryImageSource(fullWidth, height, pix, 0, fullWidth));
+
+ return img;
+ }
+}
diff --git a/src/main/java/com/lowagie/text/pdf/BarcodeCodabar.java b/src/main/java/com/lowagie/text/pdf/BarcodeCodabar.java
new file mode 100644
index 0000000..7b9537c
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/BarcodeCodabar.java
@@ -0,0 +1,345 @@
+/*
+ * $Id: BarcodeCodabar.java,v 1.14 2006/02/09 18:07:56 psoares33 Exp $
+ *
+ * Copyright 2002-2006 by Paulo Soares.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+package com.lowagie.text.pdf;
+
+import com.lowagie.text.ExceptionConverter;
+import com.lowagie.text.Element;
+import com.lowagie.text.Rectangle;
+import java.awt.Color;
+import java.awt.Image;
+import java.awt.Canvas;
+import java.awt.image.MemoryImageSource;
+
+/** Implements the code codabar. The default parameters are:
+ * <pre>
+ *x = 0.8f;
+ *n = 2;
+ *font = BaseFont.createFont("Helvetica", "winansi", false);
+ *size = 8;
+ *baseline = size;
+ *barHeight = size * 3;
+ *textAlignment = Element.ALIGN_CENTER;
+ *generateChecksum = false;
+ *checksumText = false;
+ *startStopText = false;
+ * </pre>
+ *
+ * @author Paulo Soares (psoares@consiste.pt)
+ */
+public class BarcodeCodabar extends Barcode{
+
+ /** The bars to generate the code.
+ */
+ static byte BARS[][] =
+ {
+ {0,0,0,0,0,1,1}, // 0
+ {0,0,0,0,1,1,0}, // 1
+ {0,0,0,1,0,0,1}, // 2
+ {1,1,0,0,0,0,0}, // 3
+ {0,0,1,0,0,1,0}, // 4
+ {1,0,0,0,0,1,0}, // 5
+ {0,1,0,0,0,0,1}, // 6
+ {0,1,0,0,1,0,0}, // 7
+ {0,1,1,0,0,0,0}, // 8
+ {1,0,0,1,0,0,0}, // 9
+ {0,0,0,1,1,0,0}, // -
+ {0,0,1,1,0,0,0}, // $
+ {1,0,0,0,1,0,1}, // :
+ {1,0,1,0,0,0,1}, // /
+ {1,0,1,0,1,0,0}, // .
+ {0,0,1,0,1,0,1}, // +
+ {0,0,1,1,0,1,0}, // a
+ {0,1,0,1,0,0,1}, // b
+ {0,0,0,1,0,1,1}, // c
+ {0,0,0,1,1,1,0} // d
+ };
+
+ /** The index chars to <CODE>BARS</CODE>.
+ */
+ static String CHARS = "0123456789-$:/.+ABCD";
+
+ static final int START_STOP_IDX = 16;
+ /** Creates a new BarcodeCodabar.
+ */
+ public BarcodeCodabar() {
+ try {
+ x = 0.8f;
+ n = 2;
+ font = BaseFont.createFont("Helvetica", "winansi", false);
+ size = 8;
+ baseline = size;
+ barHeight = size * 3;
+ textAlignment = Element.ALIGN_CENTER;
+ generateChecksum = false;
+ checksumText = false;
+ startStopText = false;
+ codeType = CODABAR;
+ }
+ catch (Exception e) {
+ throw new ExceptionConverter(e);
+ }
+ }
+
+ /** Creates the bars.
+ * @param text the text to create the bars
+ * @return the bars
+ */
+ public static byte[] getBarsCodabar(String text) {
+ text = text.toUpperCase();
+ int len = text.length();
+ if (len < 2)
+ throw new IllegalArgumentException("Codabar must have at least a start and stop character.");
+ if (CHARS.indexOf(text.charAt(0)) < START_STOP_IDX || CHARS.indexOf(text.charAt(len - 1)) < START_STOP_IDX)
+ throw new IllegalArgumentException("Codabar must have one of 'ABCD' as start/stop character.");
+ byte bars[] = new byte[text.length() * 8 - 1];
+ for (int k = 0; k < len; ++k) {
+ int idx = CHARS.indexOf(text.charAt(k));
+ if (idx >= START_STOP_IDX && k > 0 && k < len - 1)
+ throw new IllegalArgumentException("In codabar, start/stop characters are only allowed at the extremes.");
+ if (idx < 0)
+ throw new IllegalArgumentException("The character '" + text.charAt(k) + "' is illegal in codabar.");
+ System.arraycopy(BARS[idx], 0, bars, k * 8, 7);
+ }
+ return bars;
+ }
+
+ public static String calculateChecksum(String code) {
+ if (code.length() < 2)
+ return code;
+ String text = code.toUpperCase();
+ int sum = 0;
+ int len = text.length();
+ for (int k = 0; k < len; ++k)
+ sum += CHARS.indexOf(text.charAt(k));
+ sum = (sum + 15) / 16 * 16 - sum;
+ return code.substring(0, len - 1) + CHARS.charAt(sum) + code.substring(len - 1);
+ }
+
+ /** Gets the maximum area that the barcode and the text, if
+ * any, will occupy. The lower left corner is always (0, 0).
+ * @return the size the barcode occupies.
+ */
+ public Rectangle getBarcodeSize() {
+ float fontX = 0;
+ float fontY = 0;
+ String text = code;
+ if (generateChecksum && checksumText)
+ text = calculateChecksum(code);
+ if (!startStopText)
+ text = text.substring(1, text.length() - 1);
+ if (font != null) {
+ if (baseline > 0)
+ fontY = baseline - font.getFontDescriptor(BaseFont.DESCENT, size);
+ else
+ fontY = -baseline + size;
+ fontX = font.getWidthPoint(altText != null ? altText : text, size);
+ }
+ text = code;
+ if (generateChecksum)
+ text = calculateChecksum(code);
+ byte bars[] = getBarsCodabar(text);
+ int wide = 0;
+ for (int k = 0; k < bars.length; ++k) {
+ wide += (int)bars[k];
+ }
+ int narrow = bars.length - wide;
+ float fullWidth = x * (narrow + wide * n);
+ fullWidth = Math.max(fullWidth, fontX);
+ float fullHeight = barHeight + fontY;
+ return new Rectangle(fullWidth, fullHeight);
+ }
+
+ /** Places the barcode in a <CODE>PdfContentByte</CODE>. The
+ * barcode is always placed at coodinates (0, 0). Use the
+ * translation matrix to move it elsewhere.<p>
+ * The bars and text are written in the following colors:<p>
+ * <P><TABLE BORDER=1>
+ * <TR>
+ * <TH><P><CODE>barColor</CODE></TH>
+ * <TH><P><CODE>textColor</CODE></TH>
+ * <TH><P>Result</TH>
+ * </TR>
+ * <TR>
+ * <TD><P><CODE>null</CODE></TD>
+ * <TD><P><CODE>null</CODE></TD>
+ * <TD><P>bars and text painted with current fill color</TD>
+ * </TR>
+ * <TR>
+ * <TD><P><CODE>barColor</CODE></TD>
+ * <TD><P><CODE>null</CODE></TD>
+ * <TD><P>bars and text painted with <CODE>barColor</CODE></TD>
+ * </TR>
+ * <TR>
+ * <TD><P><CODE>null</CODE></TD>
+ * <TD><P><CODE>textColor</CODE></TD>
+ * <TD><P>bars painted with current color<br>text painted with <CODE>textColor</CODE></TD>
+ * </TR>
+ * <TR>
+ * <TD><P><CODE>barColor</CODE></TD>
+ * <TD><P><CODE>textColor</CODE></TD>
+ * <TD><P>bars painted with <CODE>barColor</CODE><br>text painted with <CODE>textColor</CODE></TD>
+ * </TR>
+ * </TABLE>
+ * @param cb the <CODE>PdfContentByte</CODE> where the barcode will be placed
+ * @param barColor the color of the bars. It can be <CODE>null</CODE>
+ * @param textColor the color of the text. It can be <CODE>null</CODE>
+ * @return the dimensions the barcode occupies
+ */
+ public Rectangle placeBarcode(PdfContentByte cb, Color barColor, Color textColor) {
+ String fullCode = code;
+ if (generateChecksum && checksumText)
+ fullCode = calculateChecksum(code);
+ if (!startStopText)
+ fullCode = fullCode.substring(1, fullCode.length() - 1);
+ float fontX = 0;
+ if (font != null) {
+ fontX = font.getWidthPoint(fullCode = altText != null ? altText : fullCode, size);
+ }
+ byte bars[] = getBarsCodabar(generateChecksum ? calculateChecksum(code) : code);
+ int wide = 0;
+ for (int k = 0; k < bars.length; ++k) {
+ wide += (int)bars[k];
+ }
+ int narrow = bars.length - wide;
+ float fullWidth = x * (narrow + wide * n);
+ float barStartX = 0;
+ float textStartX = 0;
+ switch (textAlignment) {
+ case Element.ALIGN_LEFT:
+ break;
+ case Element.ALIGN_RIGHT:
+ if (fontX > fullWidth)
+ barStartX = fontX - fullWidth;
+ else
+ textStartX = fullWidth - fontX;
+ break;
+ default:
+ if (fontX > fullWidth)
+ barStartX = (fontX - fullWidth) / 2;
+ else
+ textStartX = (fullWidth - fontX) / 2;
+ break;
+ }
+ float barStartY = 0;
+ float textStartY = 0;
+ if (font != null) {
+ if (baseline <= 0)
+ textStartY = barHeight - baseline;
+ else {
+ textStartY = -font.getFontDescriptor(BaseFont.DESCENT, size);
+ barStartY = textStartY + baseline;
+ }
+ }
+ boolean print = true;
+ if (barColor != null)
+ cb.setColorFill(barColor);
+ for (int k = 0; k < bars.length; ++k) {
+ float w = (bars[k] == 0 ? x : x * n);
+ if (print)
+ cb.rectangle(barStartX, barStartY, w - inkSpreading, barHeight);
+ print = !print;
+ barStartX += w;
+ }
+ cb.fill();
+ if (font != null) {
+ if (textColor != null)
+ cb.setColorFill(textColor);
+ cb.beginText();
+ cb.setFontAndSize(font, size);
+ cb.setTextMatrix(textStartX, textStartY);
+ cb.showText(fullCode);
+ cb.endText();
+ }
+ return getBarcodeSize();
+ }
+
+ /** Creates a <CODE>java.awt.Image</CODE>. This image only
+ * contains the bars without any text.
+ * @param foreground the color of the bars
+ * @param background the color of the background
+ * @return the image
+ */
+ public java.awt.Image createAwtImage(Color foreground, Color background) {
+ int f = foreground.getRGB();
+ int g = background.getRGB();
+ Canvas canvas = new Canvas();
+
+ String fullCode = code;
+ if (generateChecksum && checksumText)
+ fullCode = calculateChecksum(code);
+ if (!startStopText)
+ fullCode = fullCode.substring(1, fullCode.length() - 1);
+ byte bars[] = getBarsCodabar(generateChecksum ? calculateChecksum(code) : code);
+ int wide = 0;
+ for (int k = 0; k < bars.length; ++k) {
+ wide += (int)bars[k];
+ }
+ int narrow = bars.length - wide;
+ int fullWidth = narrow + wide * (int)n;
+ boolean print = true;
+ int ptr = 0;
+ int height = (int)barHeight;
+ int pix[] = new int[fullWidth * height];
+ for (int k = 0; k < bars.length; ++k) {
+ int w = (bars[k] == 0 ? 1 : (int)n);
+ int c = g;
+ if (print)
+ c = f;
+ print = !print;
+ for (int j = 0; j < w; ++j)
+ pix[ptr++] = c;
+ }
+ for (int k = fullWidth; k < pix.length; k += fullWidth) {
+ System.arraycopy(pix, 0, pix, k, fullWidth);
+ }
+ Image img = canvas.createImage(new MemoryImageSource(fullWidth, height, pix, 0, fullWidth));
+
+ return img;
+ }
+}
diff --git a/src/main/java/com/lowagie/text/pdf/BarcodeEAN.java b/src/main/java/com/lowagie/text/pdf/BarcodeEAN.java
new file mode 100644
index 0000000..c6d5f28
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/BarcodeEAN.java
@@ -0,0 +1,718 @@
+/*
+ * Copyright 2002 by Paulo Soares.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+package com.lowagie.text.pdf;
+
+import com.lowagie.text.Rectangle;
+import com.lowagie.text.ExceptionConverter;
+import java.util.Arrays;
+import java.awt.Color;
+import java.awt.Image;
+import java.awt.Canvas;
+import java.awt.image.MemoryImageSource;
+
+/** Generates barcodes in several formats: EAN13, EAN8, UPCA, UPCE,
+ * supplemental 2 and 5. The default parameters are:
+ * <pre>
+ *x = 0.8f;
+ *font = BaseFont.createFont("Helvetica", "winansi", false);
+ *size = 8;
+ *baseline = size;
+ *barHeight = size * 3;
+ *guardBars = true;
+ *codeType = EAN13;
+ *code = "";
+ * </pre>
+ *
+ * @author Paulo Soares (psoares@consiste.pt)
+ */
+public class BarcodeEAN extends Barcode{
+
+ /** The bar positions that are guard bars.*/
+ static int GUARD_EMPTY[] = {};
+ /** The bar positions that are guard bars.*/
+ static int GUARD_UPCA[] = {0, 2, 4, 6, 28, 30, 52, 54, 56, 58};
+ /** The bar positions that are guard bars.*/
+ static int GUARD_EAN13[] = {0, 2, 28, 30, 56, 58};
+ /** The bar positions that are guard bars.*/
+ static int GUARD_EAN8[] = {0, 2, 20, 22, 40, 42};
+ /** The bar positions that are guard bars.*/
+ static int GUARD_UPCE[] = {0, 2, 28, 30, 32};
+ /** The x coordinates to place the text.*/
+ static float TEXTPOS_EAN13[] = {6.5f, 13.5f, 20.5f, 27.5f, 34.5f, 41.5f, 53.5f, 60.5f, 67.5f, 74.5f, 81.5f, 88.5f};
+ /** The x coordinates to place the text.*/
+ static float TEXTPOS_EAN8[] = {6.5f, 13.5f, 20.5f, 27.5f, 39.5f, 46.5f, 53.5f, 60.5f};
+ /** The basic bar widths.*/
+ static byte BARS[][] =
+ {
+ {3, 2, 1, 1}, // 0
+ {2, 2, 2, 1}, // 1
+ {2, 1, 2, 2}, // 2
+ {1, 4, 1, 1}, // 3
+ {1, 1, 3, 2}, // 4
+ {1, 2, 3, 1}, // 5
+ {1, 1, 1, 4}, // 6
+ {1, 3, 1, 2}, // 7
+ {1, 2, 1, 3}, // 8
+ {3, 1, 1, 2} // 9
+ };
+
+ /** The total number of bars for EAN13.*/
+ static final int TOTALBARS_EAN13 = 11 + 12 * 4;
+ /** The total number of bars for EAN8.*/
+ static final int TOTALBARS_EAN8 = 11 + 8 * 4;
+ /** The total number of bars for UPCE.*/
+ static final int TOTALBARS_UPCE = 9 + 6 * 4;
+ /** The total number of bars for supplemental 2.*/
+ static final int TOTALBARS_SUPP2 = 13;
+ /** The total number of bars for supplemental 5.*/
+ static final int TOTALBARS_SUPP5 = 31;
+ /** Marker for odd parity.*/
+ static final int ODD = 0;
+ /** Marker for even parity.*/
+ static final int EVEN = 1;
+
+ /** Sequence of parities to be used with EAN13.*/
+ static byte PARITY13[][] =
+ {
+ {ODD, ODD, ODD, ODD, ODD, ODD}, // 0
+ {ODD, ODD, EVEN, ODD, EVEN, EVEN}, // 1
+ {ODD, ODD, EVEN, EVEN, ODD, EVEN}, // 2
+ {ODD, ODD, EVEN, EVEN, EVEN, ODD}, // 3
+ {ODD, EVEN, ODD, ODD, EVEN, EVEN}, // 4
+ {ODD, EVEN, EVEN, ODD, ODD, EVEN}, // 5
+ {ODD, EVEN, EVEN, EVEN, ODD, ODD}, // 6
+ {ODD, EVEN, ODD, EVEN, ODD, EVEN}, // 7
+ {ODD, EVEN, ODD, EVEN, EVEN, ODD}, // 8
+ {ODD, EVEN, EVEN, ODD, EVEN, ODD} // 9
+ };
+
+ /** Sequence of parities to be used with supplemental 2.*/
+ static byte PARITY2[][] =
+ {
+ {ODD, ODD}, // 0
+ {ODD, EVEN}, // 1
+ {EVEN, ODD}, // 2
+ {EVEN, EVEN} // 3
+ };
+
+ /** Sequence of parities to be used with supplemental 2.*/
+ static byte PARITY5[][] =
+ {
+ {EVEN, EVEN, ODD, ODD, ODD}, // 0
+ {EVEN, ODD, EVEN, ODD, ODD}, // 1
+ {EVEN, ODD, ODD, EVEN, ODD}, // 2
+ {EVEN, ODD, ODD, ODD, EVEN}, // 3
+ {ODD, EVEN, EVEN, ODD, ODD}, // 4
+ {ODD, ODD, EVEN, EVEN, ODD}, // 5
+ {ODD, ODD, ODD, EVEN, EVEN}, // 6
+ {ODD, EVEN, ODD, EVEN, ODD}, // 7
+ {ODD, EVEN, ODD, ODD, EVEN}, // 8
+ {ODD, ODD, EVEN, ODD, EVEN} // 9
+ };
+
+ /** Sequence of parities to be used with UPCE.*/
+ static byte PARITYE[][] =
+ {
+ {EVEN, EVEN, EVEN, ODD, ODD, ODD}, // 0
+ {EVEN, EVEN, ODD, EVEN, ODD, ODD}, // 1
+ {EVEN, EVEN, ODD, ODD, EVEN, ODD}, // 2
+ {EVEN, EVEN, ODD, ODD, ODD, EVEN}, // 3
+ {EVEN, ODD, EVEN, EVEN, ODD, ODD}, // 4
+ {EVEN, ODD, ODD, EVEN, EVEN, ODD}, // 5
+ {EVEN, ODD, ODD, ODD, EVEN, EVEN}, // 6
+ {EVEN, ODD, EVEN, ODD, EVEN, ODD}, // 7
+ {EVEN, ODD, EVEN, ODD, ODD, EVEN}, // 8
+ {EVEN, ODD, ODD, EVEN, ODD, EVEN} // 9
+ };
+
+ /** Creates new BarcodeEAN */
+ public BarcodeEAN() {
+ try {
+ x = 0.8f;
+ font = BaseFont.createFont("Helvetica", "winansi", false);
+ size = 8;
+ baseline = size;
+ barHeight = size * 3;
+ guardBars = true;
+ codeType = EAN13;
+ code = "";
+ }
+ catch (Exception e) {
+ throw new ExceptionConverter(e);
+ }
+ }
+
+ /** Calculates the EAN parity character.
+ * @param code the code
+ * @return the parity character
+ */
+ public static int calculateEANParity(String code) {
+ int mul = 3;
+ int total = 0;
+ for (int k = code.length() - 1; k >= 0; --k) {
+ int n = code.charAt(k) - '0';
+ total += mul * n;
+ mul ^= 2;
+ }
+ return (10 - (total % 10)) % 10;
+ }
+
+ /** Converts an UPCA code into an UPCE code. If the code can not
+ * be converted a <CODE>null</CODE> is returned.
+ * @param text the code to convert. It must have 12 numeric characters
+ * @return the 8 converted digits or <CODE>null</CODE> if the
+ * code could not be converted
+ */
+ static public String convertUPCAtoUPCE(String text) {
+ if (text.length() != 12 || !(text.startsWith("0") || text.startsWith("1")))
+ return null;
+ if (text.substring(3, 6).equals("000") || text.substring(3, 6).equals("100")
+ || text.substring(3, 6).equals("200")) {
+ if (text.substring(6, 8).equals("00"))
+ return text.substring(0, 1) + text.substring(1, 3) + text.substring(8, 11) + text.substring(3, 4) + text.substring(11);
+ }
+ else if (text.substring(4, 6).equals("00")) {
+ if (text.substring(6, 9).equals("000"))
+ return text.substring(0, 1) + text.substring(1, 4) + text.substring(9, 11) + "3" + text.substring(11);
+ }
+ else if (text.substring(5, 6).equals("0")) {
+ if (text.substring(6, 10).equals("0000"))
+ return text.substring(0, 1) + text.substring(1, 5) + text.substring(10, 11) + "4" + text.substring(11);
+ }
+ else if (text.charAt(10) >= '5') {
+ if (text.substring(6, 10).equals("0000"))
+ return text.substring(0, 1) + text.substring(1, 6) + text.substring(10, 11) + text.substring(11);
+ }
+ return null;
+ }
+
+ /** Creates the bars for the barcode EAN13 and UPCA.
+ * @param _code the text with 13 digits
+ * @return the barcode
+ */
+ public static byte[] getBarsEAN13(String _code) {
+ int code[] = new int[_code.length()];
+ for (int k = 0; k < code.length; ++k)
+ code[k] = _code.charAt(k) - '0';
+ byte bars[] = new byte[TOTALBARS_EAN13];
+ int pb = 0;
+ bars[pb++] = 1;
+ bars[pb++] = 1;
+ bars[pb++] = 1;
+ byte sequence[] = PARITY13[code[0]];
+ for (int k = 0; k < sequence.length; ++k) {
+ int c = code[k + 1];
+ byte stripes[] = BARS[c];
+ if (sequence[k] == ODD) {
+ bars[pb++] = stripes[0];
+ bars[pb++] = stripes[1];
+ bars[pb++] = stripes[2];
+ bars[pb++] = stripes[3];
+ }
+ else {
+ bars[pb++] = stripes[3];
+ bars[pb++] = stripes[2];
+ bars[pb++] = stripes[1];
+ bars[pb++] = stripes[0];
+ }
+ }
+ bars[pb++] = 1;
+ bars[pb++] = 1;
+ bars[pb++] = 1;
+ bars[pb++] = 1;
+ bars[pb++] = 1;
+ for (int k = 7; k < 13; ++k) {
+ int c = code[k];
+ byte stripes[] = BARS[c];
+ bars[pb++] = stripes[0];
+ bars[pb++] = stripes[1];
+ bars[pb++] = stripes[2];
+ bars[pb++] = stripes[3];
+ }
+ bars[pb++] = 1;
+ bars[pb++] = 1;
+ bars[pb++] = 1;
+ return bars;
+ }
+
+ /** Creates the bars for the barcode EAN8.
+ * @param _code the text with 8 digits
+ * @return the barcode
+ */
+ public static byte[] getBarsEAN8(String _code) {
+ int code[] = new int[_code.length()];
+ for (int k = 0; k < code.length; ++k)
+ code[k] = _code.charAt(k) - '0';
+ byte bars[] = new byte[TOTALBARS_EAN8];
+ int pb = 0;
+ bars[pb++] = 1;
+ bars[pb++] = 1;
+ bars[pb++] = 1;
+ for (int k = 0; k < 4; ++k) {
+ int c = code[k];
+ byte stripes[] = BARS[c];
+ bars[pb++] = stripes[0];
+ bars[pb++] = stripes[1];
+ bars[pb++] = stripes[2];
+ bars[pb++] = stripes[3];
+ }
+ bars[pb++] = 1;
+ bars[pb++] = 1;
+ bars[pb++] = 1;
+ bars[pb++] = 1;
+ bars[pb++] = 1;
+ for (int k = 4; k < 8; ++k) {
+ int c = code[k];
+ byte stripes[] = BARS[c];
+ bars[pb++] = stripes[0];
+ bars[pb++] = stripes[1];
+ bars[pb++] = stripes[2];
+ bars[pb++] = stripes[3];
+ }
+ bars[pb++] = 1;
+ bars[pb++] = 1;
+ bars[pb++] = 1;
+ return bars;
+ }
+
+ /** Creates the bars for the barcode UPCE.
+ * @param _code the text with 8 digits
+ * @return the barcode
+ */
+ public static byte[] getBarsUPCE(String _code) {
+ int code[] = new int[_code.length()];
+ for (int k = 0; k < code.length; ++k)
+ code[k] = _code.charAt(k) - '0';
+ byte bars[] = new byte[TOTALBARS_UPCE];
+ boolean flip = (code[0] != 0);
+ int pb = 0;
+ bars[pb++] = 1;
+ bars[pb++] = 1;
+ bars[pb++] = 1;
+ byte sequence[] = PARITYE[code[code.length - 1]];
+ for (int k = 1; k < code.length - 1; ++k) {
+ int c = code[k];
+ byte stripes[] = BARS[c];
+ if (sequence[k - 1] == (flip ? EVEN : ODD)) {
+ bars[pb++] = stripes[0];
+ bars[pb++] = stripes[1];
+ bars[pb++] = stripes[2];
+ bars[pb++] = stripes[3];
+ }
+ else {
+ bars[pb++] = stripes[3];
+ bars[pb++] = stripes[2];
+ bars[pb++] = stripes[1];
+ bars[pb++] = stripes[0];
+ }
+ }
+ bars[pb++] = 1;
+ bars[pb++] = 1;
+ bars[pb++] = 1;
+ bars[pb++] = 1;
+ bars[pb++] = 1;
+ bars[pb++] = 1;
+ return bars;
+ }
+
+ /** Creates the bars for the barcode supplemental 2.
+ * @param _code the text with 2 digits
+ * @return the barcode
+ */
+ public static byte[] getBarsSupplemental2(String _code) {
+ int code[] = new int[2];
+ for (int k = 0; k < code.length; ++k)
+ code[k] = _code.charAt(k) - '0';
+ byte bars[] = new byte[TOTALBARS_SUPP2];
+ int pb = 0;
+ int parity = (code[0] * 10 + code[1]) % 4;
+ bars[pb++] = 1;
+ bars[pb++] = 1;
+ bars[pb++] = 2;
+ byte sequence[] = PARITY2[parity];
+ for (int k = 0; k < sequence.length; ++k) {
+ if (k == 1) {
+ bars[pb++] = 1;
+ bars[pb++] = 1;
+ }
+ int c = code[k];
+ byte stripes[] = BARS[c];
+ if (sequence[k] == ODD) {
+ bars[pb++] = stripes[0];
+ bars[pb++] = stripes[1];
+ bars[pb++] = stripes[2];
+ bars[pb++] = stripes[3];
+ }
+ else {
+ bars[pb++] = stripes[3];
+ bars[pb++] = stripes[2];
+ bars[pb++] = stripes[1];
+ bars[pb++] = stripes[0];
+ }
+ }
+ return bars;
+ }
+
+ /** Creates the bars for the barcode supplemental 5.
+ * @param _code the text with 5 digits
+ * @return the barcode
+ */
+ public static byte[] getBarsSupplemental5(String _code) {
+ int code[] = new int[5];
+ for (int k = 0; k < code.length; ++k)
+ code[k] = _code.charAt(k) - '0';
+ byte bars[] = new byte[TOTALBARS_SUPP5];
+ int pb = 0;
+ int parity = (((code[0] + code[2] + code[4]) * 3) + ((code[1] + code[3]) * 9)) % 10;
+ bars[pb++] = 1;
+ bars[pb++] = 1;
+ bars[pb++] = 2;
+ byte sequence[] = PARITY5[parity];
+ for (int k = 0; k < sequence.length; ++k) {
+ if (k != 0) {
+ bars[pb++] = 1;
+ bars[pb++] = 1;
+ }
+ int c = code[k];
+ byte stripes[] = BARS[c];
+ if (sequence[k] == ODD) {
+ bars[pb++] = stripes[0];
+ bars[pb++] = stripes[1];
+ bars[pb++] = stripes[2];
+ bars[pb++] = stripes[3];
+ }
+ else {
+ bars[pb++] = stripes[3];
+ bars[pb++] = stripes[2];
+ bars[pb++] = stripes[1];
+ bars[pb++] = stripes[0];
+ }
+ }
+ return bars;
+ }
+
+ /** Gets the maximum area that the barcode and the text, if
+ * any, will occupy. The lower left corner is always (0, 0).
+ * @return the size the barcode occupies.
+ */
+ public Rectangle getBarcodeSize() {
+ float width = 0;
+ float height = barHeight;
+ if (font != null) {
+ if (baseline <= 0)
+ height += -baseline + size;
+ else
+ height += baseline - font.getFontDescriptor(BaseFont.DESCENT, size);
+ }
+ switch (codeType) {
+ case EAN13:
+ width = x * (11 + 12 * 7);
+ if (font != null) {
+ width += font.getWidthPoint(code.charAt(0), size);
+ }
+ break;
+ case EAN8:
+ width = x * (11 + 8 * 7);
+ break;
+ case UPCA:
+ width = x * (11 + 12 * 7);
+ if (font != null) {
+ width += font.getWidthPoint(code.charAt(0), size) + font.getWidthPoint(code.charAt(11), size);
+ }
+ break;
+ case UPCE:
+ width = x * (9 + 6 * 7);
+ if (font != null) {
+ width += font.getWidthPoint(code.charAt(0), size) + font.getWidthPoint(code.charAt(7), size);
+ }
+ break;
+ case SUPP2:
+ width = x * (6 + 2 * 7);
+ break;
+ case SUPP5:
+ width = x * (4 + 5 * 7 + 4 * 2);
+ break;
+ default:
+ throw new RuntimeException("Invalid code type.");
+ }
+ return new Rectangle(width, height);
+ }
+
+ /** Places the barcode in a <CODE>PdfContentByte</CODE>. The
+ * barcode is always placed at coodinates (0, 0). Use the
+ * translation matrix to move it elsewhere.<p>
+ * The bars and text are written in the following colors:<p>
+ * <P><TABLE BORDER=1>
+ * <TR>
+ * <TH><P><CODE>barColor</CODE></TH>
+ * <TH><P><CODE>textColor</CODE></TH>
+ * <TH><P>Result</TH>
+ * </TR>
+ * <TR>
+ * <TD><P><CODE>null</CODE></TD>
+ * <TD><P><CODE>null</CODE></TD>
+ * <TD><P>bars and text painted with current fill color</TD>
+ * </TR>
+ * <TR>
+ * <TD><P><CODE>barColor</CODE></TD>
+ * <TD><P><CODE>null</CODE></TD>
+ * <TD><P>bars and text painted with <CODE>barColor</CODE></TD>
+ * </TR>
+ * <TR>
+ * <TD><P><CODE>null</CODE></TD>
+ * <TD><P><CODE>textColor</CODE></TD>
+ * <TD><P>bars painted with current color<br>text painted with <CODE>textColor</CODE></TD>
+ * </TR>
+ * <TR>
+ * <TD><P><CODE>barColor</CODE></TD>
+ * <TD><P><CODE>textColor</CODE></TD>
+ * <TD><P>bars painted with <CODE>barColor</CODE><br>text painted with <CODE>textColor</CODE></TD>
+ * </TR>
+ * </TABLE>
+ * @param cb the <CODE>PdfContentByte</CODE> where the barcode will be placed
+ * @param barColor the color of the bars. It can be <CODE>null</CODE>
+ * @param textColor the color of the text. It can be <CODE>null</CODE>
+ * @return the dimensions the barcode occupies
+ */
+ public Rectangle placeBarcode(PdfContentByte cb, Color barColor, Color textColor) {
+ Rectangle rect = getBarcodeSize();
+ float barStartX = 0;
+ float barStartY = 0;
+ float textStartY = 0;
+ if (font != null) {
+ if (baseline <= 0)
+ textStartY = barHeight - baseline;
+ else {
+ textStartY = -font.getFontDescriptor(BaseFont.DESCENT, size);
+ barStartY = textStartY + baseline;
+ }
+ }
+ switch (codeType) {
+ case EAN13:
+ case UPCA:
+ case UPCE:
+ if (font != null)
+ barStartX += font.getWidthPoint(code.charAt(0), size);
+ break;
+ }
+ byte bars[] = null;
+ int guard[] = GUARD_EMPTY;
+ switch (codeType) {
+ case EAN13:
+ bars = getBarsEAN13(code);
+ guard = GUARD_EAN13;
+ break;
+ case EAN8:
+ bars = getBarsEAN8(code);
+ guard = GUARD_EAN8;
+ break;
+ case UPCA:
+ bars = getBarsEAN13("0" + code);
+ guard = GUARD_UPCA;
+ break;
+ case UPCE:
+ bars = getBarsUPCE(code);
+ guard = GUARD_UPCE;
+ break;
+ case SUPP2:
+ bars = getBarsSupplemental2(code);
+ break;
+ case SUPP5:
+ bars = getBarsSupplemental5(code);
+ break;
+ }
+ float keepBarX = barStartX;
+ boolean print = true;
+ float gd = 0;
+ if (font != null && baseline > 0 && guardBars) {
+ gd = baseline / 2;
+ }
+ if (barColor != null)
+ cb.setColorFill(barColor);
+ for (int k = 0; k < bars.length; ++k) {
+ float w = bars[k] * x;
+ if (print) {
+ if (Arrays.binarySearch(guard, k) >= 0)
+ cb.rectangle(barStartX, barStartY - gd, w - inkSpreading, barHeight + gd);
+ else
+ cb.rectangle(barStartX, barStartY, w - inkSpreading, barHeight);
+ }
+ print = !print;
+ barStartX += w;
+ }
+ cb.fill();
+ if (font != null) {
+ if (textColor != null)
+ cb.setColorFill(textColor);
+ cb.beginText();
+ cb.setFontAndSize(font, size);
+ switch (codeType) {
+ case EAN13:
+ cb.setTextMatrix(0, textStartY);
+ cb.showText(code.substring(0, 1));
+ for (int k = 1; k < 13; ++k) {
+ String c = code.substring(k, k + 1);
+ float len = font.getWidthPoint(c, size);
+ float pX = keepBarX + TEXTPOS_EAN13[k - 1] * x - len / 2;
+ cb.setTextMatrix(pX, textStartY);
+ cb.showText(c);
+ }
+ break;
+ case EAN8:
+ for (int k = 0; k < 8; ++k) {
+ String c = code.substring(k, k + 1);
+ float len = font.getWidthPoint(c, size);
+ float pX = TEXTPOS_EAN8[k] * x - len / 2;
+ cb.setTextMatrix(pX, textStartY);
+ cb.showText(c);
+ }
+ break;
+ case UPCA:
+ cb.setTextMatrix(0, textStartY);
+ cb.showText(code.substring(0, 1));
+ for (int k = 1; k < 11; ++k) {
+ String c = code.substring(k, k + 1);
+ float len = font.getWidthPoint(c, size);
+ float pX = keepBarX + TEXTPOS_EAN13[k] * x - len / 2;
+ cb.setTextMatrix(pX, textStartY);
+ cb.showText(c);
+ }
+ cb.setTextMatrix(keepBarX + x * (11 + 12 * 7), textStartY);
+ cb.showText(code.substring(11, 12));
+ break;
+ case UPCE:
+ cb.setTextMatrix(0, textStartY);
+ cb.showText(code.substring(0, 1));
+ for (int k = 1; k < 7; ++k) {
+ String c = code.substring(k, k + 1);
+ float len = font.getWidthPoint(c, size);
+ float pX = keepBarX + TEXTPOS_EAN13[k - 1] * x - len / 2;
+ cb.setTextMatrix(pX, textStartY);
+ cb.showText(c);
+ }
+ cb.setTextMatrix(keepBarX + x * (9 + 6 * 7), textStartY);
+ cb.showText(code.substring(7, 8));
+ break;
+ case SUPP2:
+ case SUPP5:
+ for (int k = 0; k < code.length(); ++k) {
+ String c = code.substring(k, k + 1);
+ float len = font.getWidthPoint(c, size);
+ float pX = (7.5f + (9 * k)) * x - len / 2;
+ cb.setTextMatrix(pX, textStartY);
+ cb.showText(c);
+ }
+ break;
+ }
+ cb.endText();
+ }
+ return rect;
+ }
+
+ /** Creates a <CODE>java.awt.Image</CODE>. This image only
+ * contains the bars without any text.
+ * @param foreground the color of the bars
+ * @param background the color of the background
+ * @return the image
+ */
+ public java.awt.Image createAwtImage(Color foreground, Color background) {
+ int f = foreground.getRGB();
+ int g = background.getRGB();
+ Canvas canvas = new Canvas();
+
+ int width = 0;
+ byte bars[] = null;
+ switch (codeType) {
+ case EAN13:
+ bars = getBarsEAN13(code);
+ width = 11 + 12 * 7;
+ break;
+ case EAN8:
+ bars = getBarsEAN8(code);
+ width = 11 + 8 * 7;
+ break;
+ case UPCA:
+ bars = getBarsEAN13("0" + code);
+ width = 11 + 12 * 7;
+ break;
+ case UPCE:
+ bars = getBarsUPCE(code);
+ width = 9 + 6 * 7;
+ break;
+ case SUPP2:
+ bars = getBarsSupplemental2(code);
+ width = 6 + 2 * 7;
+ break;
+ case SUPP5:
+ bars = getBarsSupplemental5(code);
+ width = 4 + 5 * 7 + 4 * 2;
+ break;
+ default:
+ throw new RuntimeException("Invalid code type.");
+ }
+
+ boolean print = true;
+ int ptr = 0;
+ int height = (int)barHeight;
+ int pix[] = new int[width * height];
+ for (int k = 0; k < bars.length; ++k) {
+ int w = bars[k];
+ int c = g;
+ if (print)
+ c = f;
+ print = !print;
+ for (int j = 0; j < w; ++j)
+ pix[ptr++] = c;
+ }
+ for (int k = width; k < pix.length; k += width) {
+ System.arraycopy(pix, 0, pix, k, width);
+ }
+ Image img = canvas.createImage(new MemoryImageSource(width, height, pix, 0, width));
+
+ return img;
+ }
+}
diff --git a/src/main/java/com/lowagie/text/pdf/BarcodeEANSUPP.java b/src/main/java/com/lowagie/text/pdf/BarcodeEANSUPP.java
new file mode 100644
index 0000000..7e0d794
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/BarcodeEANSUPP.java
@@ -0,0 +1,153 @@
+/*
+ * Copyright 2002 by Paulo Soares.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+package com.lowagie.text.pdf;
+import com.lowagie.text.Rectangle;
+import java.awt.Color;
+
+/** This class takes 2 barcodes, an EAN/UPC and a supplemental
+ * and creates a single barcode with both combined in the
+ * expected layout. The UPC/EAN should have a positive text
+ * baseline and the supplemental a negative one (in the supplemental
+ * the text is on the top of the barcode.<p>
+ * The default parameters are:
+ * <pre>
+ *n = 8; // horizontal distance between the two barcodes
+ * </pre>
+ *
+ * @author Paulo Soares (psoares@consiste.pt)
+ */
+public class BarcodeEANSUPP extends Barcode{
+
+ /** The barcode with the EAN/UPC.
+ */
+ protected Barcode ean;
+ /** The barcode with the supplemental.
+ */
+ protected Barcode supp;
+
+ /** Creates new combined barcode.
+ * @param ean the EAN/UPC barcode
+ * @param supp the supplemental barcode
+ */
+ public BarcodeEANSUPP(Barcode ean, Barcode supp) {
+ n = 8; // horizontal distance between the two barcodes
+ this.ean = ean;
+ this.supp = supp;
+ }
+
+ /** Gets the maximum area that the barcode and the text, if
+ * any, will occupy. The lower left corner is always (0, 0).
+ * @return the size the barcode occupies.
+ */
+ public Rectangle getBarcodeSize() {
+ Rectangle rect = ean.getBarcodeSize();
+ rect.setRight(rect.width() + supp.getBarcodeSize().width() + n);
+ return rect;
+ }
+
+ /** Places the barcode in a <CODE>PdfContentByte</CODE>. The
+ * barcode is always placed at coodinates (0, 0). Use the
+ * translation matrix to move it elsewhere.<p>
+ * The bars and text are written in the following colors:<p>
+ * <P><TABLE BORDER=1>
+ * <TR>
+ * <TH><P><CODE>barColor</CODE></TH>
+ * <TH><P><CODE>textColor</CODE></TH>
+ * <TH><P>Result</TH>
+ * </TR>
+ * <TR>
+ * <TD><P><CODE>null</CODE></TD>
+ * <TD><P><CODE>null</CODE></TD>
+ * <TD><P>bars and text painted with current fill color</TD>
+ * </TR>
+ * <TR>
+ * <TD><P><CODE>barColor</CODE></TD>
+ * <TD><P><CODE>null</CODE></TD>
+ * <TD><P>bars and text painted with <CODE>barColor</CODE></TD>
+ * </TR>
+ * <TR>
+ * <TD><P><CODE>null</CODE></TD>
+ * <TD><P><CODE>textColor</CODE></TD>
+ * <TD><P>bars painted with current color<br>text painted with <CODE>textColor</CODE></TD>
+ * </TR>
+ * <TR>
+ * <TD><P><CODE>barColor</CODE></TD>
+ * <TD><P><CODE>textColor</CODE></TD>
+ * <TD><P>bars painted with <CODE>barColor</CODE><br>text painted with <CODE>textColor</CODE></TD>
+ * </TR>
+ * </TABLE>
+ * @param cb the <CODE>PdfContentByte</CODE> where the barcode will be placed
+ * @param barColor the color of the bars. It can be <CODE>null</CODE>
+ * @param textColor the color of the text. It can be <CODE>null</CODE>
+ * @return the dimensions the barcode occupies
+ */
+ public Rectangle placeBarcode(PdfContentByte cb, Color barColor, Color textColor) {
+ if (supp.getFont() != null)
+ supp.setBarHeight(ean.getBarHeight() + supp.getBaseline() - supp.getFont().getFontDescriptor(BaseFont.CAPHEIGHT, supp.getSize()));
+ else
+ supp.setBarHeight(ean.getBarHeight());
+ Rectangle eanR = ean.getBarcodeSize();
+ cb.saveState();
+ ean.placeBarcode(cb, barColor, textColor);
+ cb.restoreState();
+ cb.saveState();
+ cb.concatCTM(1, 0, 0, 1, eanR.width() + n, eanR.height() - ean.getBarHeight());
+ supp.placeBarcode(cb, barColor, textColor);
+ cb.restoreState();
+ return getBarcodeSize();
+ }
+
+ /** Creates a <CODE>java.awt.Image</CODE>. This image only
+ * contains the bars without any text.
+ * @param foreground the color of the bars
+ * @param background the color of the background
+ * @return the image
+ */
+ public java.awt.Image createAwtImage(Color foreground, Color background) {
+ throw new UnsupportedOperationException("The two barcodes must be composed externally.");
+ }
+}
diff --git a/src/main/java/com/lowagie/text/pdf/BarcodeInter25.java b/src/main/java/com/lowagie/text/pdf/BarcodeInter25.java
new file mode 100644
index 0000000..f8700d6
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/BarcodeInter25.java
@@ -0,0 +1,338 @@
+/*
+ * $Id: BarcodeInter25.java,v 1.17 2006/02/09 18:07:56 psoares33 Exp $
+ *
+ * Copyright 2002-2006 by Paulo Soares.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+package com.lowagie.text.pdf;
+
+import com.lowagie.text.ExceptionConverter;
+import com.lowagie.text.Element;
+import com.lowagie.text.Rectangle;
+import java.awt.Color;
+import java.awt.Image;
+import java.awt.Canvas;
+import java.awt.image.MemoryImageSource;
+
+/** Implements the code interleaved 2 of 5. The text can include
+ * non numeric characters that are printed but do not generate bars.
+ * The default parameters are:
+ * <pre>
+ *x = 0.8f;
+ *n = 2;
+ *font = BaseFont.createFont("Helvetica", "winansi", false);
+ *size = 8;
+ *baseline = size;
+ *barHeight = size * 3;
+ *textAlignment = Element.ALIGN_CENTER;
+ *generateChecksum = false;
+ *checksumText = false;
+ * </pre>
+ *
+ * @author Paulo Soares (psoares@consiste.pt)
+ */
+public class BarcodeInter25 extends Barcode{
+
+ /** The bars to generate the code.
+ */
+ static byte BARS[][] =
+ {
+ {0,0,1,1,0},
+ {1,0,0,0,1},
+ {0,1,0,0,1},
+ {1,1,0,0,0},
+ {0,0,1,0,1},
+ {1,0,1,0,0},
+ {0,1,1,0,0},
+ {0,0,0,1,1},
+ {1,0,0,1,0},
+ {0,1,0,1,0}
+ };
+
+ /** Creates new BarcodeInter25 */
+ public BarcodeInter25() {
+ try {
+ x = 0.8f;
+ n = 2;
+ font = BaseFont.createFont("Helvetica", "winansi", false);
+ size = 8;
+ baseline = size;
+ barHeight = size * 3;
+ textAlignment = Element.ALIGN_CENTER;
+ generateChecksum = false;
+ checksumText = false;
+ }
+ catch (Exception e) {
+ throw new ExceptionConverter(e);
+ }
+ }
+
+ /** Deletes all the non numeric characters from <CODE>text</CODE>.
+ * @param text the text
+ * @return a <CODE>String</CODE> with only numeric characters
+ */
+ public static String keepNumbers(String text) {
+ StringBuffer sb = new StringBuffer();
+ for (int k = 0; k < text.length(); ++k) {
+ char c = text.charAt(k);
+ if (c >= '0' && c <= '9')
+ sb.append(c);
+ }
+ return sb.toString();
+ }
+
+ /** Calculates the checksum.
+ * @param text the numeric text
+ * @return the checksum
+ */
+ public static char getChecksum(String text) {
+ int mul = 3;
+ int total = 0;
+ for (int k = text.length() - 1; k >= 0; --k) {
+ int n = text.charAt(k) - '0';
+ total += mul * n;
+ mul ^= 2;
+ }
+ return (char)(((10 - (total % 10)) % 10) + '0');
+ }
+
+ /** Creates the bars for the barcode.
+ * @param text the text. It can contain non numeric characters
+ * @return the barcode
+ */
+ public static byte[] getBarsInter25(String text) {
+ text = keepNumbers(text);
+ if ((text.length() & 1) != 0)
+ throw new IllegalArgumentException("The text length must be even.");
+ byte bars[] = new byte[text.length() * 5 + 7];
+ int pb = 0;
+ bars[pb++] = 0;
+ bars[pb++] = 0;
+ bars[pb++] = 0;
+ bars[pb++] = 0;
+ int len = text.length() / 2;
+ for (int k = 0; k < len; ++k) {
+ int c1 = text.charAt(k * 2) - '0';
+ int c2 = text.charAt(k * 2 + 1) - '0';
+ byte b1[] = BARS[c1];
+ byte b2[] = BARS[c2];
+ for (int j = 0; j < 5; ++j) {
+ bars[pb++] = b1[j];
+ bars[pb++] = b2[j];
+ }
+ }
+ bars[pb++] = 1;
+ bars[pb++] = 0;
+ bars[pb++] = 0;
+ return bars;
+ }
+
+ /** Gets the maximum area that the barcode and the text, if
+ * any, will occupy. The lower left corner is always (0, 0).
+ * @return the size the barcode occupies.
+ */
+ public Rectangle getBarcodeSize() {
+ float fontX = 0;
+ float fontY = 0;
+ if (font != null) {
+ if (baseline > 0)
+ fontY = baseline - font.getFontDescriptor(BaseFont.DESCENT, size);
+ else
+ fontY = -baseline + size;
+ String fullCode = code;
+ if (generateChecksum && checksumText)
+ fullCode += getChecksum(fullCode);
+ fontX = font.getWidthPoint(altText != null ? altText : fullCode, size);
+ }
+ String fullCode = keepNumbers(code);
+ int len = fullCode.length();
+ if (generateChecksum)
+ ++len;
+ float fullWidth = len * (3 * x + 2 * x * n) + (6 + n ) * x;
+ fullWidth = Math.max(fullWidth, fontX);
+ float fullHeight = barHeight + fontY;
+ return new Rectangle(fullWidth, fullHeight);
+ }
+
+ /** Places the barcode in a <CODE>PdfContentByte</CODE>. The
+ * barcode is always placed at coodinates (0, 0). Use the
+ * translation matrix to move it elsewhere.<p>
+ * The bars and text are written in the following colors:<p>
+ * <P><TABLE BORDER=1>
+ * <TR>
+ * <TH><P><CODE>barColor</CODE></TH>
+ * <TH><P><CODE>textColor</CODE></TH>
+ * <TH><P>Result</TH>
+ * </TR>
+ * <TR>
+ * <TD><P><CODE>null</CODE></TD>
+ * <TD><P><CODE>null</CODE></TD>
+ * <TD><P>bars and text painted with current fill color</TD>
+ * </TR>
+ * <TR>
+ * <TD><P><CODE>barColor</CODE></TD>
+ * <TD><P><CODE>null</CODE></TD>
+ * <TD><P>bars and text painted with <CODE>barColor</CODE></TD>
+ * </TR>
+ * <TR>
+ * <TD><P><CODE>null</CODE></TD>
+ * <TD><P><CODE>textColor</CODE></TD>
+ * <TD><P>bars painted with current color<br>text painted with <CODE>textColor</CODE></TD>
+ * </TR>
+ * <TR>
+ * <TD><P><CODE>barColor</CODE></TD>
+ * <TD><P><CODE>textColor</CODE></TD>
+ * <TD><P>bars painted with <CODE>barColor</CODE><br>text painted with <CODE>textColor</CODE></TD>
+ * </TR>
+ * </TABLE>
+ * @param cb the <CODE>PdfContentByte</CODE> where the barcode will be placed
+ * @param barColor the color of the bars. It can be <CODE>null</CODE>
+ * @param textColor the color of the text. It can be <CODE>null</CODE>
+ * @return the dimensions the barcode occupies
+ */
+ public Rectangle placeBarcode(PdfContentByte cb, Color barColor, Color textColor) {
+ String fullCode = code;
+ float fontX = 0;
+ if (font != null) {
+ if (generateChecksum && checksumText)
+ fullCode += getChecksum(fullCode);
+ fontX = font.getWidthPoint(fullCode = altText != null ? altText : fullCode, size);
+ }
+ String bCode = keepNumbers(code);
+ if (generateChecksum)
+ bCode += getChecksum(bCode);
+ int len = bCode.length();
+ float fullWidth = len * (3 * x + 2 * x * n) + (6 + n ) * x;
+ float barStartX = 0;
+ float textStartX = 0;
+ switch (textAlignment) {
+ case Element.ALIGN_LEFT:
+ break;
+ case Element.ALIGN_RIGHT:
+ if (fontX > fullWidth)
+ barStartX = fontX - fullWidth;
+ else
+ textStartX = fullWidth - fontX;
+ break;
+ default:
+ if (fontX > fullWidth)
+ barStartX = (fontX - fullWidth) / 2;
+ else
+ textStartX = (fullWidth - fontX) / 2;
+ break;
+ }
+ float barStartY = 0;
+ float textStartY = 0;
+ if (font != null) {
+ if (baseline <= 0)
+ textStartY = barHeight - baseline;
+ else {
+ textStartY = -font.getFontDescriptor(BaseFont.DESCENT, size);
+ barStartY = textStartY + baseline;
+ }
+ }
+ byte bars[] = getBarsInter25(bCode);
+ boolean print = true;
+ if (barColor != null)
+ cb.setColorFill(barColor);
+ for (int k = 0; k < bars.length; ++k) {
+ float w = (bars[k] == 0 ? x : x * n);
+ if (print)
+ cb.rectangle(barStartX, barStartY, w - inkSpreading, barHeight);
+ print = !print;
+ barStartX += w;
+ }
+ cb.fill();
+ if (font != null) {
+ if (textColor != null)
+ cb.setColorFill(textColor);
+ cb.beginText();
+ cb.setFontAndSize(font, size);
+ cb.setTextMatrix(textStartX, textStartY);
+ cb.showText(fullCode);
+ cb.endText();
+ }
+ return getBarcodeSize();
+ }
+
+ /** Creates a <CODE>java.awt.Image</CODE>. This image only
+ * contains the bars without any text.
+ * @param foreground the color of the bars
+ * @param background the color of the background
+ * @return the image
+ */
+ public java.awt.Image createAwtImage(Color foreground, Color background) {
+ int f = foreground.getRGB();
+ int g = background.getRGB();
+ Canvas canvas = new Canvas();
+
+ String bCode = keepNumbers(code);
+ if (generateChecksum)
+ bCode += getChecksum(bCode);
+ int len = bCode.length();
+ int nn = (int)n;
+ int fullWidth = len * (3 + 2 * nn) + (6 + nn );
+ byte bars[] = getBarsInter25(bCode);
+ boolean print = true;
+ int ptr = 0;
+ int height = (int)barHeight;
+ int pix[] = new int[fullWidth * height];
+ for (int k = 0; k < bars.length; ++k) {
+ int w = (bars[k] == 0 ? 1 : nn);
+ int c = g;
+ if (print)
+ c = f;
+ print = !print;
+ for (int j = 0; j < w; ++j)
+ pix[ptr++] = c;
+ }
+ for (int k = fullWidth; k < pix.length; k += fullWidth) {
+ System.arraycopy(pix, 0, pix, k, fullWidth);
+ }
+ Image img = canvas.createImage(new MemoryImageSource(fullWidth, height, pix, 0, fullWidth));
+
+ return img;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/pdf/BarcodePDF417.java b/src/main/java/com/lowagie/text/pdf/BarcodePDF417.java
new file mode 100644
index 0000000..c0d3c6e
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/BarcodePDF417.java
@@ -0,0 +1,1604 @@
+/*
+ *
+ * Copyright 2003 Paulo Soares
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf;
+
+import com.lowagie.text.Image;
+import com.lowagie.text.BadElementException;
+import java.util.ArrayList;
+import java.io.UnsupportedEncodingException;
+import com.lowagie.text.pdf.codec.CCITTG4Encoder;
+import java.awt.Color;
+import java.awt.Canvas;
+import java.awt.image.MemoryImageSource;
+
+/** Generates the 2D barcode PDF417. Supports dimensioning auto-sizing, fixed
+ * and variable sizes, automatic and manual error levels, raw codeword input,
+ * codeword size optimization and bitmap inversion. The output can
+ * be a CCITT G4 <CODE>Image</CODE> or a raw bitmap.
+ * @author Paulo Soares (psoares@consiste.pt)
+ */
+public class BarcodePDF417 {
+
+ /** Auto-size is made based on <CODE>aspectRatio</CODE> and <CODE>yHeight</CODE>. */
+ public static final int PDF417_USE_ASPECT_RATIO = 0;
+ /** The size of the barcode will be at least <CODE>codeColumns*codeRows</CODE>. */
+ public static final int PDF417_FIXED_RECTANGLE = 1;
+ /** The size will be at least <CODE>codeColumns</CODE>
+ * with a variable number of <CODE>codeRows</CODE>.
+ */
+ public static final int PDF417_FIXED_COLUMNS = 2;
+ /** The size will be at least <CODE>codeRows</CODE>
+ * with a variable number of <CODE>codeColumns</CODE>.
+ */
+ public static final int PDF417_FIXED_ROWS = 4;
+ /** The error level correction is set automatically according
+ * to ISO 15438 recomendations.
+ */
+ public static final int PDF417_AUTO_ERROR_LEVEL = 0;
+ /** The error level correction is set by the user. It can be 0 to 8. */
+ public static final int PDF417_USE_ERROR_LEVEL = 16;
+ /**
+ * One single binary segment is used
+ */
+ public static final int PDF417_FORCE_BINARY = 32;
+ /** No <CODE>text</CODE> interpretation is done and the content of <CODE>codewords</CODE>
+ * is used directly.
+ */
+ public static final int PDF417_USE_RAW_CODEWORDS = 64;
+ /** Inverts the output bits of the raw bitmap that is normally
+ * bit one for black. It has only effect for the raw bitmap.
+ */
+ public static final int PDF417_INVERT_BITMAP = 128;
+ /** Use Macro PDF417 Encoding
+ * @see #setMacroFileId(String)
+ * @see #setMacroSegmentId(int)
+ * @see #setMacroSegmentCount(int)
+ */
+ public static final int PDF417_USE_MACRO = 256;
+
+
+ private int macroSegmentCount=0;
+ private int macroSegmentId=-1;
+ private String macroFileId;
+ protected int bitPtr;
+ protected int cwPtr;
+ protected SegmentList segmentList;
+
+ /** Creates a new <CODE>BarcodePDF417</CODE> with the default settings. */
+ public BarcodePDF417() {
+ setDefaultParameters();
+ }
+
+ /**
+ * Sets the segment id for macro PDF417 encoding
+ * @param id the id (starting at 0)
+ * @see #setMacroSegmentCount(int)
+ */
+ public void setMacroSegmentId(int id) {
+ this.macroSegmentId = id;
+ }
+
+ /**
+ * Sets the segment count for macro PDF417 encoding
+ * @param cnt the number of macro segments
+ * @see #setMacroSegmentId(int)
+ */
+ public void setMacroSegmentCount(int cnt) {
+ this.macroSegmentCount = cnt;
+ }
+
+ /**
+ * Sets the File ID for macro PDF417 encoding
+ * @param id the file id
+ */
+ public void setMacroFileId(String id) {
+ this.macroFileId = id;
+ }
+
+ protected boolean checkSegmentType(Segment segment, char type) {
+ if (segment == null)
+ return false;
+ return segment.type == type;
+ }
+
+ protected int getSegmentLength(Segment segment) {
+ if (segment == null)
+ return 0;
+ return segment.end - segment.start;
+ }
+
+ /** Set the default settings that correspond to <CODE>PDF417_USE_ASPECT_RATIO</CODE>
+ * and <CODE>PDF417_AUTO_ERROR_LEVEL</CODE>.
+ */
+ public void setDefaultParameters() {
+ options = 0;
+ outBits = null;
+ text = new byte[0];
+ yHeight = 3;
+ aspectRatio = 0.5f;
+ }
+
+ protected void outCodeword17(int codeword) {
+ int bytePtr = bitPtr / 8;
+ int bit = bitPtr - bytePtr * 8;
+ outBits[bytePtr++] |= codeword >> (9 + bit);
+ outBits[bytePtr++] |= codeword >> (1 + bit);
+ codeword <<= 8;
+ outBits[bytePtr] |= codeword >> (1 + bit);
+ bitPtr += 17;
+ }
+
+ protected void outCodeword18(int codeword) {
+ int bytePtr = bitPtr / 8;
+ int bit = bitPtr - bytePtr * 8;
+ outBits[bytePtr++] |= codeword >> (10 + bit);
+ outBits[bytePtr++] |= codeword >> (2 + bit);
+ codeword <<= 8;
+ outBits[bytePtr] |= codeword >> (2 + bit);
+ if (bit == 7)
+ outBits[++bytePtr] |= 0x80;
+ bitPtr += 18;
+ }
+
+ protected void outCodeword(int codeword) {
+ outCodeword17(codeword);
+ }
+
+ protected void outStopPattern() {
+ outCodeword18(STOP_PATTERN);
+ }
+
+ protected void outStartPattern() {
+ outCodeword17(START_PATTERN);
+ }
+
+ protected void outPaintCode() {
+ int codePtr = 0;
+ bitColumns = START_CODE_SIZE * (codeColumns + 3) + STOP_SIZE;
+ int lenBits = ((bitColumns - 1) / 8 + 1) * codeRows;
+ outBits = new byte[lenBits];
+ for (int row = 0; row < codeRows; ++row) {
+ bitPtr = ((bitColumns - 1) / 8 + 1) * 8 * row;
+ int rowMod = row % 3;
+ int cluster[] = CLUSTERS[rowMod];
+ outStartPattern();
+ int edge = 0;
+ switch (rowMod) {
+ case 0:
+ edge = 30 * (row / 3) + ((codeRows - 1) / 3);
+ break;
+ case 1:
+ edge = 30 * (row / 3) + errorLevel * 3 + ((codeRows - 1) % 3);
+ break;
+ default:
+ edge = 30 * (row / 3) + codeColumns - 1;
+ break;
+ }
+ outCodeword(cluster[edge]);
+
+ for (int column = 0; column < codeColumns; ++column) {
+ outCodeword(cluster[codewords[codePtr++]]);
+ }
+
+ switch (rowMod) {
+ case 0:
+ edge = 30 * (row / 3) + codeColumns - 1;
+ break;
+ case 1:
+ edge = 30 * (row / 3) + ((codeRows - 1) / 3);
+ break;
+ default:
+ edge = 30 * (row / 3) + errorLevel * 3 + ((codeRows - 1) % 3);
+ break;
+ }
+ outCodeword(cluster[edge]);
+ outStopPattern();
+ }
+ if ((options & PDF417_INVERT_BITMAP) != 0) {
+ for (int k = 0; k < outBits.length; ++k)
+ outBits[k] ^= 0xff;
+ }
+ }
+
+ protected void calculateErrorCorrection(int dest) {
+ if (errorLevel < 0 || errorLevel > 8)
+ errorLevel = 0;
+ int A[] = ERROR_LEVEL[errorLevel];
+ int Alength = 2 << errorLevel;
+ for (int k = 0; k < Alength; ++k)
+ codewords[dest + k] = 0;
+ int lastE = Alength - 1;
+ for (int k = 0; k < lenCodewords; ++k) {
+ int t1 = codewords[k] + codewords[dest];
+ for (int e = 0; e <= lastE; ++e) {
+ int t2 = (t1 * A[lastE - e]) % MOD;
+ int t3 = MOD - t2;
+ codewords[dest + e] = ((e == lastE ? 0 : codewords[dest + e + 1]) + t3) % MOD;
+ }
+ }
+ for (int k = 0; k < Alength; ++k)
+ codewords[dest + k] = (MOD - codewords[dest + k]) % MOD;
+ }
+
+ private static int getTextTypeAndValue(byte[] input, int maxLength, int idx) {
+ if (idx >= maxLength)
+ return 0;
+ char c = (char)(input[idx] & 0xff);
+ if (c >= 'A' && c <= 'Z')
+ return (ALPHA + c - 'A');
+ if (c >= 'a' && c <= 'z')
+ return (LOWER + c - 'a');
+ if (c == ' ')
+ return (ALPHA + LOWER + MIXED + SPACE);
+ int ms = MIXED_SET.indexOf(c);
+ int ps = PUNCTUATION_SET.indexOf(c);
+ if (ms < 0 && ps < 0)
+ return (ISBYTE + c);
+ if (ms == ps)
+ return (MIXED + PUNCTUATION + ms);
+ if (ms >= 0)
+ return (MIXED + ms);
+ return (PUNCTUATION + ps);
+ }
+
+ protected int getTextTypeAndValue(int maxLength, int idx) {
+ return getTextTypeAndValue(text, maxLength,idx);
+ }
+
+ private void textCompaction(byte[] input, int start, int length) {
+ int dest[] = new int[ABSOLUTE_MAX_TEXT_SIZE * 2];
+ int mode = ALPHA;
+ int ptr = 0;
+ int fullBytes = 0;
+ int v = 0;
+ int k;
+ int size;
+ length += start;
+ for (k = start; k < length; ++k) {
+ v = getTextTypeAndValue(input, length, k);
+ if ((v & mode) != 0) {
+ dest[ptr++] = v & 0xff;
+ continue;
+ }
+ if ((v & ISBYTE) != 0) {
+ if ((ptr & 1) != 0) {
+ dest[ptr++] = (mode & PUNCTUATION) != 0 ? PAL : PS;
+ mode = (mode & PUNCTUATION) != 0 ? ALPHA : mode;
+ }
+ dest[ptr++] = BYTESHIFT;
+ dest[ptr++] = v & 0xff;
+ fullBytes += 2;
+ continue;
+ }
+ switch (mode) {
+ case ALPHA:
+ if ((v & LOWER) != 0) {
+ dest[ptr++] = LL;
+ dest[ptr++] = v & 0xff;
+ mode = LOWER;
+ }
+ else if ((v & MIXED) != 0) {
+ dest[ptr++] = ML;
+ dest[ptr++] = v & 0xff;
+ mode = MIXED;
+ }
+ else if ((getTextTypeAndValue(input, length, k + 1) & getTextTypeAndValue(input, length, k + 2) & PUNCTUATION) != 0) {
+ dest[ptr++] = ML;
+ dest[ptr++] = PL;
+ dest[ptr++] = v & 0xff;
+ mode = PUNCTUATION;
+ }
+ else {
+ dest[ptr++] = PS;
+ dest[ptr++] = v & 0xff;
+ }
+ break;
+ case LOWER:
+ if ((v & ALPHA) != 0) {
+ if ((getTextTypeAndValue(input, length, k + 1) & getTextTypeAndValue(input, length, k + 2) & ALPHA) != 0) {
+ dest[ptr++] = ML;
+ dest[ptr++] = AL;
+ mode = ALPHA;
+ }
+ else {
+ dest[ptr++] = AS;
+ }
+ dest[ptr++] = v & 0xff;
+ }
+ else if ((v & MIXED) != 0) {
+ dest[ptr++] = ML;
+ dest[ptr++] = v & 0xff;
+ mode = MIXED;
+ }
+ else if ((getTextTypeAndValue(input, length, k + 1) & getTextTypeAndValue(input, length, k + 2) & PUNCTUATION) != 0) {
+ dest[ptr++] = ML;
+ dest[ptr++] = PL;
+ dest[ptr++] = v & 0xff;
+ mode = PUNCTUATION;
+ }
+ else {
+ dest[ptr++] = PS;
+ dest[ptr++] = v & 0xff;
+ }
+ break;
+ case MIXED:
+ if ((v & LOWER) != 0) {
+ dest[ptr++] = LL;
+ dest[ptr++] = v & 0xff;
+ mode = LOWER;
+ }
+ else if ((v & ALPHA) != 0) {
+ dest[ptr++] = AL;
+ dest[ptr++] = v & 0xff;
+ mode = ALPHA;
+ }
+ else if ((getTextTypeAndValue(input, length, k + 1) & getTextTypeAndValue(input, length, k + 2) & PUNCTUATION) != 0) {
+ dest[ptr++] = PL;
+ dest[ptr++] = v & 0xff;
+ mode = PUNCTUATION;
+ }
+ else {
+ dest[ptr++] = PS;
+ dest[ptr++] = v & 0xff;
+ }
+ break;
+ case PUNCTUATION:
+ dest[ptr++] = PAL;
+ mode = ALPHA;
+ --k;
+ break;
+ }
+ }
+ if ((ptr & 1) != 0)
+ dest[ptr++] = PS;
+ size = (ptr + fullBytes) / 2;
+ if (size + cwPtr > MAX_DATA_CODEWORDS) {
+ throw new IndexOutOfBoundsException("The text is too big.");
+ }
+ length = ptr;
+ ptr = 0;
+ while (ptr < length) {
+ v = dest[ptr++];
+ if (v >= 30) {
+ codewords[cwPtr++] = v;
+ codewords[cwPtr++] = dest[ptr++];
+ }
+ else
+ codewords[cwPtr++] = v * 30 + dest[ptr++];
+ }
+ }
+ protected void textCompaction(int start, int length) {
+ textCompaction(text, start, length);
+ }
+
+ protected void basicNumberCompaction(int start, int length) {
+ basicNumberCompaction(text, start, length);
+ }
+
+ private void basicNumberCompaction(byte[] input, int start, int length) {
+ int ret = cwPtr;
+ int retLast = length / 3;
+ int ni, k;
+ cwPtr += retLast + 1;
+ for (k = 0; k <= retLast; ++k)
+ codewords[ret + k] = 0;
+ codewords[ret + retLast] = 1;
+ length += start;
+ for (ni = start; ni < length; ++ni) {
+ // multiply by 10
+ for (k = retLast; k >= 0; --k)
+ codewords[ret + k] *= 10;
+ // add the digit
+ codewords[ret + retLast] += input[ni] - '0';
+ // propagate carry
+ for (k = retLast; k > 0; --k) {
+ codewords[ret + k - 1] += codewords[ret + k] / 900;
+ codewords[ret + k] %= 900;
+ }
+ }
+ }
+
+ private void numberCompaction(byte[] input, int start, int length) {
+ int full = (length / 44) * 15;
+ int size = length % 44;
+ int k;
+ if (size == 0)
+ size = full;
+ else
+ size = full + size / 3 + 1;
+ if (size + cwPtr > MAX_DATA_CODEWORDS) {
+ throw new IndexOutOfBoundsException("The text is too big.");
+ }
+ length += start;
+ for (k = start; k < length; k += 44) {
+ size = length - k < 44 ? length - k : 44;
+ basicNumberCompaction(input, k, size);
+ }
+ }
+
+ protected void numberCompaction(int start, int length) {
+ numberCompaction(text, start, length);
+ }
+
+ protected void byteCompaction6(int start) {
+ int length = 6;
+ int ret = cwPtr;
+ int retLast = 4;
+ int ni, k;
+ cwPtr += retLast + 1;
+ for (k = 0; k <= retLast ; ++k)
+ codewords[ret + k] = 0;
+ length += start;
+ for (ni = start; ni < length; ++ni) {
+ // multiply by 256
+ for (k = retLast; k >= 0; --k)
+ codewords[ret + k] *= 256;
+ // add the digit
+ codewords[ret + retLast] += (int)text[ni] & 0xff;
+ // propagate carry
+ for (k = retLast; k > 0; --k) {
+ codewords[ret + k - 1] += codewords[ret + k] / 900;
+ codewords[ret + k] %= 900;
+ }
+ }
+ }
+
+ void byteCompaction(int start, int length) {
+ int k, j;
+ int size = (length / 6) * 5 + (length % 6);
+ if (size + cwPtr > MAX_DATA_CODEWORDS) {
+ throw new IndexOutOfBoundsException("The text is too big.");
+ }
+ length += start;
+ for (k = start; k < length; k += 6) {
+ size = length - k < 44 ? length - k : 6;
+ if (size < 6) {
+ for (j = 0; j < size; ++j)
+ codewords[cwPtr++] = (int)text[k + j] & 0xff;
+ }
+ else {
+ byteCompaction6(k);
+ }
+ }
+ }
+
+ void breakString() {
+ int textLength = text.length;
+ int lastP = 0;
+ int startN = 0;
+ int nd = 0;
+ char c = 0;
+ int k, j;
+ boolean lastTxt, txt;
+ Segment v;
+ Segment vp;
+ Segment vn;
+
+ if ((options & PDF417_FORCE_BINARY) != 0) {
+ segmentList.add('B', 0, textLength);
+ return;
+ }
+ for (k = 0; k < textLength; ++k) {
+ c = (char)(text[k] & 0xff);
+ if (c >= '0' && c <= '9') {
+ if (nd == 0)
+ startN = k;
+ ++nd;
+ continue;
+ }
+ if (nd >= 13) {
+ if (lastP != startN) {
+ c = (char)(text[lastP] & 0xff);
+ lastTxt = (c >= ' ' && c < 127) || c == '\r' || c == '\n' || c == '\t';
+ for (j = lastP; j < startN; ++j) {
+ c = (char)(text[j] & 0xff);
+ txt = (c >= ' ' && c < 127) || c == '\r' || c == '\n' || c == '\t';
+ if (txt != lastTxt) {
+ segmentList.add(lastTxt ? 'T' : 'B', lastP, j);
+ lastP = j;
+ lastTxt = txt;
+ }
+ }
+ segmentList.add(lastTxt ? 'T' : 'B', lastP, startN);
+ }
+ segmentList.add('N', startN, k);
+ lastP = k;
+ }
+ nd = 0;
+ }
+ if (nd < 13)
+ startN = textLength;
+ if (lastP != startN) {
+ c = (char)(text[lastP] & 0xff);
+ lastTxt = (c >= ' ' && c < 127) || c == '\r' || c == '\n' || c == '\t';
+ for (j = lastP; j < startN; ++j) {
+ c = (char)(text[j] & 0xff);
+ txt = (c >= ' ' && c < 127) || c == '\r' || c == '\n' || c == '\t';
+ if (txt != lastTxt) {
+ segmentList.add(lastTxt ? 'T' : 'B', lastP, j);
+ lastP = j;
+ lastTxt = txt;
+ }
+ }
+ segmentList.add(lastTxt ? 'T' : 'B', lastP, startN);
+ }
+ if (nd >= 13)
+ segmentList.add('N', startN, textLength);
+ //optimize
+ //merge short binary
+ for (k = 0; k < segmentList.size(); ++k) {
+ v = segmentList.get(k);
+ vp = segmentList.get(k - 1);
+ vn = segmentList.get(k + 1);;
+ if (checkSegmentType(v, 'B') && getSegmentLength(v) == 1) {
+ if (checkSegmentType(vp, 'T') && checkSegmentType(vn, 'T')
+ && getSegmentLength(vp) + getSegmentLength(vn) >= 3) {
+ vp.end = vn.end;
+ segmentList.remove(k);
+ segmentList.remove(k);
+ k = -1;
+ continue;
+ }
+ }
+ }
+ //merge text sections
+ for (k = 0; k < segmentList.size(); ++k) {
+ v = segmentList.get(k);
+ vp = segmentList.get(k - 1);
+ vn = segmentList.get(k + 1);;
+ if (checkSegmentType(v, 'T') && getSegmentLength(v) >= 5) {
+ boolean redo = false;
+ if ((checkSegmentType(vp, 'B') && getSegmentLength(vp) == 1) || checkSegmentType(vp, 'T')) {
+ redo = true;
+ v.start = vp.start;
+ segmentList.remove(k - 1);
+ --k;
+ }
+ if ((checkSegmentType(vn, 'B') && getSegmentLength(vn) == 1) || checkSegmentType(vn, 'T')) {
+ redo = true;
+ v.end = vn.end;
+ segmentList.remove(k + 1);
+ }
+ if (redo) {
+ k = -1;
+ continue;
+ }
+ }
+ }
+ //merge binary sections
+ for (k = 0; k < segmentList.size(); ++k) {
+ v = segmentList.get(k);
+ vp = segmentList.get(k - 1);
+ vn = segmentList.get(k + 1);;
+ if (checkSegmentType(v, 'B')) {
+ boolean redo = false;
+ if ((checkSegmentType(vp, 'T') && getSegmentLength(vp) < 5) || checkSegmentType(vp, 'B')) {
+ redo = true;
+ v.start = vp.start;
+ segmentList.remove(k - 1);
+ --k;
+ }
+ if ((checkSegmentType(vn, 'T') && getSegmentLength(vn) < 5) || checkSegmentType(vn, 'B')) {
+ redo = true;
+ v.end = vn.end;
+ segmentList.remove(k + 1);
+ }
+ if (redo) {
+ k = -1;
+ continue;
+ }
+ }
+ }
+ // check if all numbers
+ if (segmentList.size() == 1 && (v = segmentList.get(0)).type == 'T' && getSegmentLength(v) >= 8) {
+ for (k = v.start; k < v.end; ++k) {
+ c = (char)(text[k] & 0xff);
+ if (c < '0' || c > '9')
+ break;
+ }
+ if (k == v.end)
+ v.type = 'N';
+ }
+ }
+
+ protected void assemble() {
+ int k;
+ if (segmentList.size() == 0)
+ return;
+ cwPtr = 1;
+ for (k = 0; k < segmentList.size(); ++k) {
+ Segment v = segmentList.get(k);
+ switch (v.type) {
+ case 'T':
+ if (k != 0)
+ codewords[cwPtr++] = TEXT_MODE;
+ textCompaction(v.start, getSegmentLength(v));
+ break;
+ case 'N':
+ codewords[cwPtr++] = NUMERIC_MODE;
+ numberCompaction(v.start, getSegmentLength(v));
+ break;
+ case 'B':
+ codewords[cwPtr++] = (getSegmentLength(v) % 6) != 0 ? BYTE_MODE : BYTE_MODE_6;
+ byteCompaction(v.start, getSegmentLength(v));
+ break;
+ }
+ }
+
+ if ((options & PDF417_USE_MACRO) != 0) {
+ macroCodes();
+ }
+
+ }
+
+ private void macroCodes() {
+ if (macroSegmentId < 0) {
+ throw new IllegalStateException("macroSegmentId must be >=0");
+ }
+ if (macroSegmentId >= macroSegmentCount) {
+ throw new IllegalStateException("macroSegmentId must be < macroSemgentCount");
+ }
+ if (macroSegmentCount < 1) {
+ throw new IllegalStateException("macroSemgentCount must be > 0");
+ }
+
+ codewords[cwPtr++] = MACRO_SEGMENT_ID;
+ append(macroSegmentId, 5);
+
+ if (macroFileId != null) {
+ append(macroFileId);
+ }
+
+ codewords[cwPtr++] = MACRO_SEGMENT_COUNT;
+ codewords[cwPtr++] = 1;
+ append(macroSegmentCount, 5);
+
+ if (macroSegmentId >= macroSegmentCount-1) {
+ codewords[cwPtr++] = MACRO_LAST_SEGMENT;
+ }
+
+ }
+
+ private void append(int in, int len) {
+ StringBuffer sb = new StringBuffer(len+1);
+ sb.append(Integer.toString(in));
+ for(int i = sb.length(); i < len; i++) {
+ sb.insert(0, "0");
+ }
+
+ byte[] bytes = PdfEncodings.convertToBytes(sb.toString(), "cp437");
+ numberCompaction(bytes, 0, bytes.length);
+ }
+
+ private void append(String s) {
+ byte[] bytes = PdfEncodings.convertToBytes(s, "cp437");
+ textCompaction(bytes, 0, bytes.length);
+ }
+
+
+ protected static int maxPossibleErrorLevel(int remain) {
+ int level = 8;
+ int size = 512;
+ while (level > 0) {
+ if (remain >= size)
+ return level;
+ --level;
+ size >>= 1;
+ }
+ return 0;
+ }
+
+ protected void dumpList() {
+ if (segmentList.size() == 0)
+ return;
+ for (int k = 0; k < segmentList.size(); ++k) {
+ Segment v = segmentList.get(k);
+ int len = getSegmentLength(v);
+ char c[] = new char[len];
+ for (int j = 0; j < len; ++j) {
+ c[j] = (char)(text[v.start + j] & 0xff);
+ if (c[j] == '\r')
+ c[j] = '\n';
+ }
+ System.out.println("" + v.type + new String(c));
+ }
+ }
+
+ protected int getMaxSquare() {
+ if (codeColumns > 21) {
+ codeColumns = 29;
+ codeRows = 32;
+ }
+ else {
+ codeColumns = 16;
+ codeRows = 58;
+ }
+ return MAX_DATA_CODEWORDS + 2;
+ }
+
+ /** Paints the barcode. If no exception was thrown a valid barcode is available. */
+ public void paintCode() {
+ int maxErr, lenErr, tot, pad;
+ if ((options & PDF417_USE_RAW_CODEWORDS) != 0) {
+ if (lenCodewords > MAX_DATA_CODEWORDS || lenCodewords < 1 || lenCodewords != codewords[0]) {
+ throw new IllegalArgumentException("Invalid codeword size.");
+ }
+ }
+ else {
+ if (text == null)
+ throw new NullPointerException("Text cannot be null.");
+ if (text.length > ABSOLUTE_MAX_TEXT_SIZE) {
+ throw new IndexOutOfBoundsException("The text is too big.");
+ }
+ segmentList = new SegmentList();
+ breakString();
+ //dumpList();
+ assemble();
+ segmentList = null;
+ codewords[0] = lenCodewords = cwPtr;
+ }
+ maxErr = maxPossibleErrorLevel(MAX_DATA_CODEWORDS + 2 - lenCodewords);
+ if ((options & PDF417_USE_ERROR_LEVEL) == 0) {
+ if (lenCodewords < 41)
+ errorLevel = 2;
+ else if (lenCodewords < 161)
+ errorLevel = 3;
+ else if (lenCodewords < 321)
+ errorLevel = 4;
+ else
+ errorLevel = 5;
+ }
+ if (errorLevel < 0)
+ errorLevel = 0;
+ else if (errorLevel > maxErr)
+ errorLevel = maxErr;
+ if (codeColumns < 1)
+ codeColumns = 1;
+ else if (codeColumns > 30)
+ codeColumns = 30;
+ if (codeRows < 3)
+ codeRows = 3;
+ else if (codeRows > 90)
+ codeRows = 90;
+ lenErr = 2 << errorLevel;
+ boolean fixedColumn = (options & PDF417_FIXED_ROWS) == 0;
+ boolean skipRowColAdjust = false;
+ tot = lenCodewords + lenErr;
+ if ((options & PDF417_FIXED_RECTANGLE) != 0) {
+ tot = codeColumns * codeRows;
+ if (tot > MAX_DATA_CODEWORDS + 2) {
+ tot = getMaxSquare();
+ }
+ if (tot < lenCodewords + lenErr)
+ tot = lenCodewords + lenErr;
+ else
+ skipRowColAdjust = true;
+ }
+ else if ((options & (PDF417_FIXED_COLUMNS | PDF417_FIXED_ROWS)) == 0) {
+ double c, b;
+ fixedColumn = true;
+ if (aspectRatio < 0.001)
+ aspectRatio = 0.001f;
+ else if (aspectRatio > 1000)
+ aspectRatio = 1000;
+ b = 73 * aspectRatio - 4;
+ c = (-b + Math.sqrt(b * b + 4 * 17 * aspectRatio * (lenCodewords + lenErr) * yHeight)) / (2 * 17 * aspectRatio);
+ codeColumns = (int)(c + 0.5);
+ if (codeColumns < 1)
+ codeColumns = 1;
+ else if (codeColumns > 30)
+ codeColumns = 30;
+ }
+ if (!skipRowColAdjust) {
+ if (fixedColumn) {
+ codeRows = (tot - 1) / codeColumns + 1;
+ if (codeRows < 3)
+ codeRows = 3;
+ else if (codeRows > 90) {
+ codeRows = 90;
+ codeColumns = (tot - 1) / 90 + 1;
+ }
+ }
+ else {
+ codeColumns = (tot - 1) / codeRows + 1;
+ if (codeColumns > 30) {
+ codeColumns = 30;
+ codeRows = (tot - 1) / 30 + 1;
+ }
+ }
+ tot = codeRows * codeColumns;
+ }
+ if (tot > MAX_DATA_CODEWORDS + 2) {
+ tot = getMaxSquare();
+ }
+ errorLevel = maxPossibleErrorLevel(tot - lenCodewords);
+ lenErr = 2 << errorLevel;
+ pad = tot - lenErr - lenCodewords;
+ cwPtr = lenCodewords;
+ while (pad-- != 0)
+ codewords[cwPtr++] = TEXT_MODE;
+ codewords[0] = lenCodewords = cwPtr;
+ calculateErrorCorrection(lenCodewords);
+ lenCodewords = tot;
+ outPaintCode();
+ }
+
+ /** Gets an <CODE>Image</CODE> with the barcode. The image will have to be
+ * scaled in the Y direction by <CODE>yHeight</CODE>for the barcode
+ * to have the right printing aspect.
+ * @return the barcode <CODE>Image</CODE>
+ * @throws BadElementException on error
+ */
+ public Image getImage() throws BadElementException {
+ paintCode();
+ byte g4[] = CCITTG4Encoder.compress(outBits, bitColumns, codeRows);
+ return Image.getInstance(bitColumns, codeRows, false, Image.CCITTG4, (options & PDF417_INVERT_BITMAP) == 0 ? 0 : Image.CCITT_BLACKIS1, g4, null);
+ }
+
+ /** Creates a <CODE>java.awt.Image</CODE>.
+ * @param foreground the color of the bars
+ * @param background the color of the background
+ * @return the image
+ */
+ public java.awt.Image createAwtImage(Color foreground, Color background) {
+ int f = foreground.getRGB();
+ int g = background.getRGB();
+ Canvas canvas = new Canvas();
+
+ paintCode();
+ int h = (int)yHeight;
+ int pix[] = new int[bitColumns * codeRows * h];
+ int stride = (bitColumns + 7) / 8;
+ int ptr = 0;
+ for (int k = 0; k < codeRows; ++k) {
+ int p = k * stride;
+ for (int j = 0; j < bitColumns; ++j) {
+ int b = outBits[p + (j / 8)] & 0xff;
+ b <<= j % 8;
+ pix[ptr++] = (b & 0x80) == 0 ? g : f;
+ }
+ for (int j = 1; j < h; ++j) {
+ System.arraycopy(pix, ptr - bitColumns, pix, ptr + bitColumns * (j - 1), bitColumns);
+ }
+ ptr += bitColumns * (h - 1);
+ }
+
+ java.awt.Image img = canvas.createImage(new MemoryImageSource(bitColumns, codeRows * h, pix, 0, bitColumns));
+ return img;
+ }
+
+ /** Gets the raw image bits of the barcode. The image will have to
+ * be scaled in the Y direction by <CODE>yHeight</CODE>.
+ * @return The raw barcode image
+ */
+ public byte[] getOutBits() {
+ return this.outBits;
+ }
+
+ /** Gets the number of X pixels of <CODE>outBits</CODE>.
+ * @return the number of X pixels of <CODE>outBits</CODE>
+ */
+ public int getBitColumns() {
+ return this.bitColumns;
+ }
+
+ /** Gets the number of Y pixels of <CODE>outBits</CODE>.
+ * It is also the number of rows in the barcode.
+ * @return the number of Y pixels of <CODE>outBits</CODE>
+ */
+ public int getCodeRows() {
+ return this.codeRows;
+ }
+
+ /** Sets the number of barcode rows. This number may be changed
+ * to keep the barcode valid.
+ * @param codeRows the number of barcode rows
+ */
+ public void setCodeRows(int codeRows) {
+ this.codeRows = codeRows;
+ }
+
+ /** Gets the number of barcode data columns.
+ * @return he number of barcode data columns
+ */
+ public int getCodeColumns() {
+ return this.codeColumns;
+ }
+
+ /** Sets the number of barcode data columns.
+ * This number may be changed to keep the barcode valid.
+ * @param codeColumns the number of barcode data columns
+ */
+ public void setCodeColumns(int codeColumns) {
+ this.codeColumns = codeColumns;
+ }
+
+ /** Gets the codeword array. This array is always 928 elements long.
+ * It can be writen to if the option <CODE>PDF417_USE_RAW_CODEWORDS</CODE>
+ * is set.
+ * @return the codeword array
+ */
+ public int[] getCodewords() {
+ return this.codewords;
+ }
+
+ /** Gets the length of the codewords.
+ * @return the length of the codewords
+ */
+ public int getLenCodewords() {
+ return this.lenCodewords;
+ }
+
+ /** Sets the length of the codewords.
+ * @param lenCodewords the length of the codewords
+ */
+ public void setLenCodewords(int lenCodewords) {
+ this.lenCodewords = lenCodewords;
+ }
+
+ /** Gets the error level correction used for the barcode. It may different
+ * from the previously set value.
+ * @return the error level correction used for the barcode
+ */
+ public int getErrorLevel() {
+ return this.errorLevel;
+ }
+
+ /** Sets the error level correction for the barcode.
+ * @param errorLevel the error level correction for the barcode
+ */
+ public void setErrorLevel(int errorLevel) {
+ this.errorLevel = errorLevel;
+ }
+
+ /** Gets the bytes that form the barcode. This bytes should
+ * be interpreted in the codepage Cp437.
+ * @return the bytes that form the barcode
+ */
+ public byte[] getText() {
+ return this.text;
+ }
+
+ /** Sets the bytes that form the barcode. This bytes should
+ * be interpreted in the codepage Cp437.
+ * @param text the bytes that form the barcode
+ */
+ public void setText(byte[] text) {
+ this.text = text;
+ }
+
+ /** Sets the text that will form the barcode. This text is converted
+ * to bytes using the encoding Cp437.
+ * @param s the text that will form the barcode
+ * @throws UnsupportedEncodingException if the encoding Cp437 is not supported
+ */
+ public void setText(String s) {
+ this.text = PdfEncodings.convertToBytes(s, "cp437");
+ }
+
+ /** Gets the options to generate the barcode.
+ * @return the options to generate the barcode
+ */
+ public int getOptions() {
+ return this.options;
+ }
+
+ /** Sets the options to generate the barcode. This can be all
+ * the <CODE>PDF417_*</CODE> constants.
+ * @param options the options to generate the barcode
+ */
+ public void setOptions(int options) {
+ this.options = options;
+ }
+
+ /** Gets the barcode aspect ratio.
+ * @return the barcode aspect ratio
+ */
+ public float getAspectRatio() {
+ return this.aspectRatio;
+ }
+
+ /** Sets the barcode aspect ratio. A ratio or 0.5 will make the
+ * barcode width twice as large as the height.
+ * @param aspectRatio the barcode aspect ratio
+ */
+ public void setAspectRatio(float aspectRatio) {
+ this.aspectRatio = aspectRatio;
+ }
+
+ /** Gets the Y pixel height relative to X.
+ * @return the Y pixel height relative to X
+ */
+ public float getYHeight() {
+ return this.yHeight;
+ }
+
+ /** Sets the Y pixel height relative to X. It is usually 3.
+ * @param yHeight the Y pixel height relative to X
+ */
+ public void setYHeight(float yHeight) {
+ this.yHeight = yHeight;
+ }
+
+ protected static final int START_PATTERN = 0x1fea8;
+ protected static final int STOP_PATTERN = 0x3fa29;
+ protected static final int START_CODE_SIZE = 17;
+ protected static final int STOP_SIZE = 18;
+ protected static final int MOD = 929;
+ protected static final int ALPHA = 0x10000;
+ protected static final int LOWER = 0x20000;
+ protected static final int MIXED = 0x40000;
+ protected static final int PUNCTUATION = 0x80000;
+ protected static final int ISBYTE = 0x100000;
+ protected static final int BYTESHIFT = 913;
+ protected static final int PL = 25;
+ protected static final int LL = 27;
+ protected static final int AS = 27;
+ protected static final int ML = 28;
+ protected static final int AL = 28;
+ protected static final int PS = 29;
+ protected static final int PAL = 29;
+ protected static final int SPACE = 26;
+ protected static final int TEXT_MODE = 900;
+ protected static final int BYTE_MODE_6 = 924;
+ protected static final int BYTE_MODE = 901;
+ protected static final int NUMERIC_MODE = 902;
+ protected static final int ABSOLUTE_MAX_TEXT_SIZE = 5420;
+ protected static final int MAX_DATA_CODEWORDS = 926;
+ protected static final int MACRO_SEGMENT_ID=928;
+ protected static final int MACRO_SEGMENT_COUNT=923;
+ protected static final int MACRO_LAST_SEGMENT=922;
+
+ static String MIXED_SET = "0123456789&\r\t,:#-.$/+%*=^";
+ static String PUNCTUATION_SET = ";<>@[\\]_`~!\r\t,:\n-.$/\"|*()?{}'";
+
+ static int CLUSTERS[][] =
+ {{
+ 0x1d5c0, 0x1eaf0, 0x1f57c, 0x1d4e0, 0x1ea78, 0x1f53e, 0x1a8c0, 0x1d470,
+ 0x1a860, 0x15040, 0x1a830, 0x15020, 0x1adc0, 0x1d6f0, 0x1eb7c, 0x1ace0,
+ 0x1d678, 0x1eb3e, 0x158c0, 0x1ac70, 0x15860, 0x15dc0, 0x1aef0, 0x1d77c,
+ 0x15ce0, 0x1ae78, 0x1d73e, 0x15c70, 0x1ae3c, 0x15ef0, 0x1af7c, 0x15e78,
+ 0x1af3e, 0x15f7c, 0x1f5fa, 0x1d2e0, 0x1e978, 0x1f4be, 0x1a4c0, 0x1d270,
+ 0x1e93c, 0x1a460, 0x1d238, 0x14840, 0x1a430, 0x1d21c, 0x14820, 0x1a418,
+ 0x14810, 0x1a6e0, 0x1d378, 0x1e9be, 0x14cc0, 0x1a670, 0x1d33c, 0x14c60,
+ 0x1a638, 0x1d31e, 0x14c30, 0x1a61c, 0x14ee0, 0x1a778, 0x1d3be, 0x14e70,
+ 0x1a73c, 0x14e38, 0x1a71e, 0x14f78, 0x1a7be, 0x14f3c, 0x14f1e, 0x1a2c0,
+ 0x1d170, 0x1e8bc, 0x1a260, 0x1d138, 0x1e89e, 0x14440, 0x1a230, 0x1d11c,
+ 0x14420, 0x1a218, 0x14410, 0x14408, 0x146c0, 0x1a370, 0x1d1bc, 0x14660,
+ 0x1a338, 0x1d19e, 0x14630, 0x1a31c, 0x14618, 0x1460c, 0x14770, 0x1a3bc,
+ 0x14738, 0x1a39e, 0x1471c, 0x147bc, 0x1a160, 0x1d0b8, 0x1e85e, 0x14240,
+ 0x1a130, 0x1d09c, 0x14220, 0x1a118, 0x1d08e, 0x14210, 0x1a10c, 0x14208,
+ 0x1a106, 0x14360, 0x1a1b8, 0x1d0de, 0x14330, 0x1a19c, 0x14318, 0x1a18e,
+ 0x1430c, 0x14306, 0x1a1de, 0x1438e, 0x14140, 0x1a0b0, 0x1d05c, 0x14120,
+ 0x1a098, 0x1d04e, 0x14110, 0x1a08c, 0x14108, 0x1a086, 0x14104, 0x141b0,
+ 0x14198, 0x1418c, 0x140a0, 0x1d02e, 0x1a04c, 0x1a046, 0x14082, 0x1cae0,
+ 0x1e578, 0x1f2be, 0x194c0, 0x1ca70, 0x1e53c, 0x19460, 0x1ca38, 0x1e51e,
+ 0x12840, 0x19430, 0x12820, 0x196e0, 0x1cb78, 0x1e5be, 0x12cc0, 0x19670,
+ 0x1cb3c, 0x12c60, 0x19638, 0x12c30, 0x12c18, 0x12ee0, 0x19778, 0x1cbbe,
+ 0x12e70, 0x1973c, 0x12e38, 0x12e1c, 0x12f78, 0x197be, 0x12f3c, 0x12fbe,
+ 0x1dac0, 0x1ed70, 0x1f6bc, 0x1da60, 0x1ed38, 0x1f69e, 0x1b440, 0x1da30,
+ 0x1ed1c, 0x1b420, 0x1da18, 0x1ed0e, 0x1b410, 0x1da0c, 0x192c0, 0x1c970,
+ 0x1e4bc, 0x1b6c0, 0x19260, 0x1c938, 0x1e49e, 0x1b660, 0x1db38, 0x1ed9e,
+ 0x16c40, 0x12420, 0x19218, 0x1c90e, 0x16c20, 0x1b618, 0x16c10, 0x126c0,
+ 0x19370, 0x1c9bc, 0x16ec0, 0x12660, 0x19338, 0x1c99e, 0x16e60, 0x1b738,
+ 0x1db9e, 0x16e30, 0x12618, 0x16e18, 0x12770, 0x193bc, 0x16f70, 0x12738,
+ 0x1939e, 0x16f38, 0x1b79e, 0x16f1c, 0x127bc, 0x16fbc, 0x1279e, 0x16f9e,
+ 0x1d960, 0x1ecb8, 0x1f65e, 0x1b240, 0x1d930, 0x1ec9c, 0x1b220, 0x1d918,
+ 0x1ec8e, 0x1b210, 0x1d90c, 0x1b208, 0x1b204, 0x19160, 0x1c8b8, 0x1e45e,
+ 0x1b360, 0x19130, 0x1c89c, 0x16640, 0x12220, 0x1d99c, 0x1c88e, 0x16620,
+ 0x12210, 0x1910c, 0x16610, 0x1b30c, 0x19106, 0x12204, 0x12360, 0x191b8,
+ 0x1c8de, 0x16760, 0x12330, 0x1919c, 0x16730, 0x1b39c, 0x1918e, 0x16718,
+ 0x1230c, 0x12306, 0x123b8, 0x191de, 0x167b8, 0x1239c, 0x1679c, 0x1238e,
+ 0x1678e, 0x167de, 0x1b140, 0x1d8b0, 0x1ec5c, 0x1b120, 0x1d898, 0x1ec4e,
+ 0x1b110, 0x1d88c, 0x1b108, 0x1d886, 0x1b104, 0x1b102, 0x12140, 0x190b0,
+ 0x1c85c, 0x16340, 0x12120, 0x19098, 0x1c84e, 0x16320, 0x1b198, 0x1d8ce,
+ 0x16310, 0x12108, 0x19086, 0x16308, 0x1b186, 0x16304, 0x121b0, 0x190dc,
+ 0x163b0, 0x12198, 0x190ce, 0x16398, 0x1b1ce, 0x1638c, 0x12186, 0x16386,
+ 0x163dc, 0x163ce, 0x1b0a0, 0x1d858, 0x1ec2e, 0x1b090, 0x1d84c, 0x1b088,
+ 0x1d846, 0x1b084, 0x1b082, 0x120a0, 0x19058, 0x1c82e, 0x161a0, 0x12090,
+ 0x1904c, 0x16190, 0x1b0cc, 0x19046, 0x16188, 0x12084, 0x16184, 0x12082,
+ 0x120d8, 0x161d8, 0x161cc, 0x161c6, 0x1d82c, 0x1d826, 0x1b042, 0x1902c,
+ 0x12048, 0x160c8, 0x160c4, 0x160c2, 0x18ac0, 0x1c570, 0x1e2bc, 0x18a60,
+ 0x1c538, 0x11440, 0x18a30, 0x1c51c, 0x11420, 0x18a18, 0x11410, 0x11408,
+ 0x116c0, 0x18b70, 0x1c5bc, 0x11660, 0x18b38, 0x1c59e, 0x11630, 0x18b1c,
+ 0x11618, 0x1160c, 0x11770, 0x18bbc, 0x11738, 0x18b9e, 0x1171c, 0x117bc,
+ 0x1179e, 0x1cd60, 0x1e6b8, 0x1f35e, 0x19a40, 0x1cd30, 0x1e69c, 0x19a20,
+ 0x1cd18, 0x1e68e, 0x19a10, 0x1cd0c, 0x19a08, 0x1cd06, 0x18960, 0x1c4b8,
+ 0x1e25e, 0x19b60, 0x18930, 0x1c49c, 0x13640, 0x11220, 0x1cd9c, 0x1c48e,
+ 0x13620, 0x19b18, 0x1890c, 0x13610, 0x11208, 0x13608, 0x11360, 0x189b8,
+ 0x1c4de, 0x13760, 0x11330, 0x1cdde, 0x13730, 0x19b9c, 0x1898e, 0x13718,
+ 0x1130c, 0x1370c, 0x113b8, 0x189de, 0x137b8, 0x1139c, 0x1379c, 0x1138e,
+ 0x113de, 0x137de, 0x1dd40, 0x1eeb0, 0x1f75c, 0x1dd20, 0x1ee98, 0x1f74e,
+ 0x1dd10, 0x1ee8c, 0x1dd08, 0x1ee86, 0x1dd04, 0x19940, 0x1ccb0, 0x1e65c,
+ 0x1bb40, 0x19920, 0x1eedc, 0x1e64e, 0x1bb20, 0x1dd98, 0x1eece, 0x1bb10,
+ 0x19908, 0x1cc86, 0x1bb08, 0x1dd86, 0x19902, 0x11140, 0x188b0, 0x1c45c,
+ 0x13340, 0x11120, 0x18898, 0x1c44e, 0x17740, 0x13320, 0x19998, 0x1ccce,
+ 0x17720, 0x1bb98, 0x1ddce, 0x18886, 0x17710, 0x13308, 0x19986, 0x17708,
+ 0x11102, 0x111b0, 0x188dc, 0x133b0, 0x11198, 0x188ce, 0x177b0, 0x13398,
+ 0x199ce, 0x17798, 0x1bbce, 0x11186, 0x13386, 0x111dc, 0x133dc, 0x111ce,
+ 0x177dc, 0x133ce, 0x1dca0, 0x1ee58, 0x1f72e, 0x1dc90, 0x1ee4c, 0x1dc88,
+ 0x1ee46, 0x1dc84, 0x1dc82, 0x198a0, 0x1cc58, 0x1e62e, 0x1b9a0, 0x19890,
+ 0x1ee6e, 0x1b990, 0x1dccc, 0x1cc46, 0x1b988, 0x19884, 0x1b984, 0x19882,
+ 0x1b982, 0x110a0, 0x18858, 0x1c42e, 0x131a0, 0x11090, 0x1884c, 0x173a0,
+ 0x13190, 0x198cc, 0x18846, 0x17390, 0x1b9cc, 0x11084, 0x17388, 0x13184,
+ 0x11082, 0x13182, 0x110d8, 0x1886e, 0x131d8, 0x110cc, 0x173d8, 0x131cc,
+ 0x110c6, 0x173cc, 0x131c6, 0x110ee, 0x173ee, 0x1dc50, 0x1ee2c, 0x1dc48,
+ 0x1ee26, 0x1dc44, 0x1dc42, 0x19850, 0x1cc2c, 0x1b8d0, 0x19848, 0x1cc26,
+ 0x1b8c8, 0x1dc66, 0x1b8c4, 0x19842, 0x1b8c2, 0x11050, 0x1882c, 0x130d0,
+ 0x11048, 0x18826, 0x171d0, 0x130c8, 0x19866, 0x171c8, 0x1b8e6, 0x11042,
+ 0x171c4, 0x130c2, 0x171c2, 0x130ec, 0x171ec, 0x171e6, 0x1ee16, 0x1dc22,
+ 0x1cc16, 0x19824, 0x19822, 0x11028, 0x13068, 0x170e8, 0x11022, 0x13062,
+ 0x18560, 0x10a40, 0x18530, 0x10a20, 0x18518, 0x1c28e, 0x10a10, 0x1850c,
+ 0x10a08, 0x18506, 0x10b60, 0x185b8, 0x1c2de, 0x10b30, 0x1859c, 0x10b18,
+ 0x1858e, 0x10b0c, 0x10b06, 0x10bb8, 0x185de, 0x10b9c, 0x10b8e, 0x10bde,
+ 0x18d40, 0x1c6b0, 0x1e35c, 0x18d20, 0x1c698, 0x18d10, 0x1c68c, 0x18d08,
+ 0x1c686, 0x18d04, 0x10940, 0x184b0, 0x1c25c, 0x11b40, 0x10920, 0x1c6dc,
+ 0x1c24e, 0x11b20, 0x18d98, 0x1c6ce, 0x11b10, 0x10908, 0x18486, 0x11b08,
+ 0x18d86, 0x10902, 0x109b0, 0x184dc, 0x11bb0, 0x10998, 0x184ce, 0x11b98,
+ 0x18dce, 0x11b8c, 0x10986, 0x109dc, 0x11bdc, 0x109ce, 0x11bce, 0x1cea0,
+ 0x1e758, 0x1f3ae, 0x1ce90, 0x1e74c, 0x1ce88, 0x1e746, 0x1ce84, 0x1ce82,
+ 0x18ca0, 0x1c658, 0x19da0, 0x18c90, 0x1c64c, 0x19d90, 0x1cecc, 0x1c646,
+ 0x19d88, 0x18c84, 0x19d84, 0x18c82, 0x19d82, 0x108a0, 0x18458, 0x119a0,
+ 0x10890, 0x1c66e, 0x13ba0, 0x11990, 0x18ccc, 0x18446, 0x13b90, 0x19dcc,
+ 0x10884, 0x13b88, 0x11984, 0x10882, 0x11982, 0x108d8, 0x1846e, 0x119d8,
+ 0x108cc, 0x13bd8, 0x119cc, 0x108c6, 0x13bcc, 0x119c6, 0x108ee, 0x119ee,
+ 0x13bee, 0x1ef50, 0x1f7ac, 0x1ef48, 0x1f7a6, 0x1ef44, 0x1ef42, 0x1ce50,
+ 0x1e72c, 0x1ded0, 0x1ef6c, 0x1e726, 0x1dec8, 0x1ef66, 0x1dec4, 0x1ce42,
+ 0x1dec2, 0x18c50, 0x1c62c, 0x19cd0, 0x18c48, 0x1c626, 0x1bdd0, 0x19cc8,
+ 0x1ce66, 0x1bdc8, 0x1dee6, 0x18c42, 0x1bdc4, 0x19cc2, 0x1bdc2, 0x10850,
+ 0x1842c, 0x118d0, 0x10848, 0x18426, 0x139d0, 0x118c8, 0x18c66, 0x17bd0,
+ 0x139c8, 0x19ce6, 0x10842, 0x17bc8, 0x1bde6, 0x118c2, 0x17bc4, 0x1086c,
+ 0x118ec, 0x10866, 0x139ec, 0x118e6, 0x17bec, 0x139e6, 0x17be6, 0x1ef28,
+ 0x1f796, 0x1ef24, 0x1ef22, 0x1ce28, 0x1e716, 0x1de68, 0x1ef36, 0x1de64,
+ 0x1ce22, 0x1de62, 0x18c28, 0x1c616, 0x19c68, 0x18c24, 0x1bce8, 0x19c64,
+ 0x18c22, 0x1bce4, 0x19c62, 0x1bce2, 0x10828, 0x18416, 0x11868, 0x18c36,
+ 0x138e8, 0x11864, 0x10822, 0x179e8, 0x138e4, 0x11862, 0x179e4, 0x138e2,
+ 0x179e2, 0x11876, 0x179f6, 0x1ef12, 0x1de34, 0x1de32, 0x19c34, 0x1bc74,
+ 0x1bc72, 0x11834, 0x13874, 0x178f4, 0x178f2, 0x10540, 0x10520, 0x18298,
+ 0x10510, 0x10508, 0x10504, 0x105b0, 0x10598, 0x1058c, 0x10586, 0x105dc,
+ 0x105ce, 0x186a0, 0x18690, 0x1c34c, 0x18688, 0x1c346, 0x18684, 0x18682,
+ 0x104a0, 0x18258, 0x10da0, 0x186d8, 0x1824c, 0x10d90, 0x186cc, 0x10d88,
+ 0x186c6, 0x10d84, 0x10482, 0x10d82, 0x104d8, 0x1826e, 0x10dd8, 0x186ee,
+ 0x10dcc, 0x104c6, 0x10dc6, 0x104ee, 0x10dee, 0x1c750, 0x1c748, 0x1c744,
+ 0x1c742, 0x18650, 0x18ed0, 0x1c76c, 0x1c326, 0x18ec8, 0x1c766, 0x18ec4,
+ 0x18642, 0x18ec2, 0x10450, 0x10cd0, 0x10448, 0x18226, 0x11dd0, 0x10cc8,
+ 0x10444, 0x11dc8, 0x10cc4, 0x10442, 0x11dc4, 0x10cc2, 0x1046c, 0x10cec,
+ 0x10466, 0x11dec, 0x10ce6, 0x11de6, 0x1e7a8, 0x1e7a4, 0x1e7a2, 0x1c728,
+ 0x1cf68, 0x1e7b6, 0x1cf64, 0x1c722, 0x1cf62, 0x18628, 0x1c316, 0x18e68,
+ 0x1c736, 0x19ee8, 0x18e64, 0x18622, 0x19ee4, 0x18e62, 0x19ee2, 0x10428,
+ 0x18216, 0x10c68, 0x18636, 0x11ce8, 0x10c64, 0x10422, 0x13de8, 0x11ce4,
+ 0x10c62, 0x13de4, 0x11ce2, 0x10436, 0x10c76, 0x11cf6, 0x13df6, 0x1f7d4,
+ 0x1f7d2, 0x1e794, 0x1efb4, 0x1e792, 0x1efb2, 0x1c714, 0x1cf34, 0x1c712,
+ 0x1df74, 0x1cf32, 0x1df72, 0x18614, 0x18e34, 0x18612, 0x19e74, 0x18e32,
+ 0x1bef4
+ }, {
+ 0x1f560, 0x1fab8, 0x1ea40, 0x1f530, 0x1fa9c, 0x1ea20, 0x1f518, 0x1fa8e,
+ 0x1ea10, 0x1f50c, 0x1ea08, 0x1f506, 0x1ea04, 0x1eb60, 0x1f5b8, 0x1fade,
+ 0x1d640, 0x1eb30, 0x1f59c, 0x1d620, 0x1eb18, 0x1f58e, 0x1d610, 0x1eb0c,
+ 0x1d608, 0x1eb06, 0x1d604, 0x1d760, 0x1ebb8, 0x1f5de, 0x1ae40, 0x1d730,
+ 0x1eb9c, 0x1ae20, 0x1d718, 0x1eb8e, 0x1ae10, 0x1d70c, 0x1ae08, 0x1d706,
+ 0x1ae04, 0x1af60, 0x1d7b8, 0x1ebde, 0x15e40, 0x1af30, 0x1d79c, 0x15e20,
+ 0x1af18, 0x1d78e, 0x15e10, 0x1af0c, 0x15e08, 0x1af06, 0x15f60, 0x1afb8,
+ 0x1d7de, 0x15f30, 0x1af9c, 0x15f18, 0x1af8e, 0x15f0c, 0x15fb8, 0x1afde,
+ 0x15f9c, 0x15f8e, 0x1e940, 0x1f4b0, 0x1fa5c, 0x1e920, 0x1f498, 0x1fa4e,
+ 0x1e910, 0x1f48c, 0x1e908, 0x1f486, 0x1e904, 0x1e902, 0x1d340, 0x1e9b0,
+ 0x1f4dc, 0x1d320, 0x1e998, 0x1f4ce, 0x1d310, 0x1e98c, 0x1d308, 0x1e986,
+ 0x1d304, 0x1d302, 0x1a740, 0x1d3b0, 0x1e9dc, 0x1a720, 0x1d398, 0x1e9ce,
+ 0x1a710, 0x1d38c, 0x1a708, 0x1d386, 0x1a704, 0x1a702, 0x14f40, 0x1a7b0,
+ 0x1d3dc, 0x14f20, 0x1a798, 0x1d3ce, 0x14f10, 0x1a78c, 0x14f08, 0x1a786,
+ 0x14f04, 0x14fb0, 0x1a7dc, 0x14f98, 0x1a7ce, 0x14f8c, 0x14f86, 0x14fdc,
+ 0x14fce, 0x1e8a0, 0x1f458, 0x1fa2e, 0x1e890, 0x1f44c, 0x1e888, 0x1f446,
+ 0x1e884, 0x1e882, 0x1d1a0, 0x1e8d8, 0x1f46e, 0x1d190, 0x1e8cc, 0x1d188,
+ 0x1e8c6, 0x1d184, 0x1d182, 0x1a3a0, 0x1d1d8, 0x1e8ee, 0x1a390, 0x1d1cc,
+ 0x1a388, 0x1d1c6, 0x1a384, 0x1a382, 0x147a0, 0x1a3d8, 0x1d1ee, 0x14790,
+ 0x1a3cc, 0x14788, 0x1a3c6, 0x14784, 0x14782, 0x147d8, 0x1a3ee, 0x147cc,
+ 0x147c6, 0x147ee, 0x1e850, 0x1f42c, 0x1e848, 0x1f426, 0x1e844, 0x1e842,
+ 0x1d0d0, 0x1e86c, 0x1d0c8, 0x1e866, 0x1d0c4, 0x1d0c2, 0x1a1d0, 0x1d0ec,
+ 0x1a1c8, 0x1d0e6, 0x1a1c4, 0x1a1c2, 0x143d0, 0x1a1ec, 0x143c8, 0x1a1e6,
+ 0x143c4, 0x143c2, 0x143ec, 0x143e6, 0x1e828, 0x1f416, 0x1e824, 0x1e822,
+ 0x1d068, 0x1e836, 0x1d064, 0x1d062, 0x1a0e8, 0x1d076, 0x1a0e4, 0x1a0e2,
+ 0x141e8, 0x1a0f6, 0x141e4, 0x141e2, 0x1e814, 0x1e812, 0x1d034, 0x1d032,
+ 0x1a074, 0x1a072, 0x1e540, 0x1f2b0, 0x1f95c, 0x1e520, 0x1f298, 0x1f94e,
+ 0x1e510, 0x1f28c, 0x1e508, 0x1f286, 0x1e504, 0x1e502, 0x1cb40, 0x1e5b0,
+ 0x1f2dc, 0x1cb20, 0x1e598, 0x1f2ce, 0x1cb10, 0x1e58c, 0x1cb08, 0x1e586,
+ 0x1cb04, 0x1cb02, 0x19740, 0x1cbb0, 0x1e5dc, 0x19720, 0x1cb98, 0x1e5ce,
+ 0x19710, 0x1cb8c, 0x19708, 0x1cb86, 0x19704, 0x19702, 0x12f40, 0x197b0,
+ 0x1cbdc, 0x12f20, 0x19798, 0x1cbce, 0x12f10, 0x1978c, 0x12f08, 0x19786,
+ 0x12f04, 0x12fb0, 0x197dc, 0x12f98, 0x197ce, 0x12f8c, 0x12f86, 0x12fdc,
+ 0x12fce, 0x1f6a0, 0x1fb58, 0x16bf0, 0x1f690, 0x1fb4c, 0x169f8, 0x1f688,
+ 0x1fb46, 0x168fc, 0x1f684, 0x1f682, 0x1e4a0, 0x1f258, 0x1f92e, 0x1eda0,
+ 0x1e490, 0x1fb6e, 0x1ed90, 0x1f6cc, 0x1f246, 0x1ed88, 0x1e484, 0x1ed84,
+ 0x1e482, 0x1ed82, 0x1c9a0, 0x1e4d8, 0x1f26e, 0x1dba0, 0x1c990, 0x1e4cc,
+ 0x1db90, 0x1edcc, 0x1e4c6, 0x1db88, 0x1c984, 0x1db84, 0x1c982, 0x1db82,
+ 0x193a0, 0x1c9d8, 0x1e4ee, 0x1b7a0, 0x19390, 0x1c9cc, 0x1b790, 0x1dbcc,
+ 0x1c9c6, 0x1b788, 0x19384, 0x1b784, 0x19382, 0x1b782, 0x127a0, 0x193d8,
+ 0x1c9ee, 0x16fa0, 0x12790, 0x193cc, 0x16f90, 0x1b7cc, 0x193c6, 0x16f88,
+ 0x12784, 0x16f84, 0x12782, 0x127d8, 0x193ee, 0x16fd8, 0x127cc, 0x16fcc,
+ 0x127c6, 0x16fc6, 0x127ee, 0x1f650, 0x1fb2c, 0x165f8, 0x1f648, 0x1fb26,
+ 0x164fc, 0x1f644, 0x1647e, 0x1f642, 0x1e450, 0x1f22c, 0x1ecd0, 0x1e448,
+ 0x1f226, 0x1ecc8, 0x1f666, 0x1ecc4, 0x1e442, 0x1ecc2, 0x1c8d0, 0x1e46c,
+ 0x1d9d0, 0x1c8c8, 0x1e466, 0x1d9c8, 0x1ece6, 0x1d9c4, 0x1c8c2, 0x1d9c2,
+ 0x191d0, 0x1c8ec, 0x1b3d0, 0x191c8, 0x1c8e6, 0x1b3c8, 0x1d9e6, 0x1b3c4,
+ 0x191c2, 0x1b3c2, 0x123d0, 0x191ec, 0x167d0, 0x123c8, 0x191e6, 0x167c8,
+ 0x1b3e6, 0x167c4, 0x123c2, 0x167c2, 0x123ec, 0x167ec, 0x123e6, 0x167e6,
+ 0x1f628, 0x1fb16, 0x162fc, 0x1f624, 0x1627e, 0x1f622, 0x1e428, 0x1f216,
+ 0x1ec68, 0x1f636, 0x1ec64, 0x1e422, 0x1ec62, 0x1c868, 0x1e436, 0x1d8e8,
+ 0x1c864, 0x1d8e4, 0x1c862, 0x1d8e2, 0x190e8, 0x1c876, 0x1b1e8, 0x1d8f6,
+ 0x1b1e4, 0x190e2, 0x1b1e2, 0x121e8, 0x190f6, 0x163e8, 0x121e4, 0x163e4,
+ 0x121e2, 0x163e2, 0x121f6, 0x163f6, 0x1f614, 0x1617e, 0x1f612, 0x1e414,
+ 0x1ec34, 0x1e412, 0x1ec32, 0x1c834, 0x1d874, 0x1c832, 0x1d872, 0x19074,
+ 0x1b0f4, 0x19072, 0x1b0f2, 0x120f4, 0x161f4, 0x120f2, 0x161f2, 0x1f60a,
+ 0x1e40a, 0x1ec1a, 0x1c81a, 0x1d83a, 0x1903a, 0x1b07a, 0x1e2a0, 0x1f158,
+ 0x1f8ae, 0x1e290, 0x1f14c, 0x1e288, 0x1f146, 0x1e284, 0x1e282, 0x1c5a0,
+ 0x1e2d8, 0x1f16e, 0x1c590, 0x1e2cc, 0x1c588, 0x1e2c6, 0x1c584, 0x1c582,
+ 0x18ba0, 0x1c5d8, 0x1e2ee, 0x18b90, 0x1c5cc, 0x18b88, 0x1c5c6, 0x18b84,
+ 0x18b82, 0x117a0, 0x18bd8, 0x1c5ee, 0x11790, 0x18bcc, 0x11788, 0x18bc6,
+ 0x11784, 0x11782, 0x117d8, 0x18bee, 0x117cc, 0x117c6, 0x117ee, 0x1f350,
+ 0x1f9ac, 0x135f8, 0x1f348, 0x1f9a6, 0x134fc, 0x1f344, 0x1347e, 0x1f342,
+ 0x1e250, 0x1f12c, 0x1e6d0, 0x1e248, 0x1f126, 0x1e6c8, 0x1f366, 0x1e6c4,
+ 0x1e242, 0x1e6c2, 0x1c4d0, 0x1e26c, 0x1cdd0, 0x1c4c8, 0x1e266, 0x1cdc8,
+ 0x1e6e6, 0x1cdc4, 0x1c4c2, 0x1cdc2, 0x189d0, 0x1c4ec, 0x19bd0, 0x189c8,
+ 0x1c4e6, 0x19bc8, 0x1cde6, 0x19bc4, 0x189c2, 0x19bc2, 0x113d0, 0x189ec,
+ 0x137d0, 0x113c8, 0x189e6, 0x137c8, 0x19be6, 0x137c4, 0x113c2, 0x137c2,
+ 0x113ec, 0x137ec, 0x113e6, 0x137e6, 0x1fba8, 0x175f0, 0x1bafc, 0x1fba4,
+ 0x174f8, 0x1ba7e, 0x1fba2, 0x1747c, 0x1743e, 0x1f328, 0x1f996, 0x132fc,
+ 0x1f768, 0x1fbb6, 0x176fc, 0x1327e, 0x1f764, 0x1f322, 0x1767e, 0x1f762,
+ 0x1e228, 0x1f116, 0x1e668, 0x1e224, 0x1eee8, 0x1f776, 0x1e222, 0x1eee4,
+ 0x1e662, 0x1eee2, 0x1c468, 0x1e236, 0x1cce8, 0x1c464, 0x1dde8, 0x1cce4,
+ 0x1c462, 0x1dde4, 0x1cce2, 0x1dde2, 0x188e8, 0x1c476, 0x199e8, 0x188e4,
+ 0x1bbe8, 0x199e4, 0x188e2, 0x1bbe4, 0x199e2, 0x1bbe2, 0x111e8, 0x188f6,
+ 0x133e8, 0x111e4, 0x177e8, 0x133e4, 0x111e2, 0x177e4, 0x133e2, 0x177e2,
+ 0x111f6, 0x133f6, 0x1fb94, 0x172f8, 0x1b97e, 0x1fb92, 0x1727c, 0x1723e,
+ 0x1f314, 0x1317e, 0x1f734, 0x1f312, 0x1737e, 0x1f732, 0x1e214, 0x1e634,
+ 0x1e212, 0x1ee74, 0x1e632, 0x1ee72, 0x1c434, 0x1cc74, 0x1c432, 0x1dcf4,
+ 0x1cc72, 0x1dcf2, 0x18874, 0x198f4, 0x18872, 0x1b9f4, 0x198f2, 0x1b9f2,
+ 0x110f4, 0x131f4, 0x110f2, 0x173f4, 0x131f2, 0x173f2, 0x1fb8a, 0x1717c,
+ 0x1713e, 0x1f30a, 0x1f71a, 0x1e20a, 0x1e61a, 0x1ee3a, 0x1c41a, 0x1cc3a,
+ 0x1dc7a, 0x1883a, 0x1987a, 0x1b8fa, 0x1107a, 0x130fa, 0x171fa, 0x170be,
+ 0x1e150, 0x1f0ac, 0x1e148, 0x1f0a6, 0x1e144, 0x1e142, 0x1c2d0, 0x1e16c,
+ 0x1c2c8, 0x1e166, 0x1c2c4, 0x1c2c2, 0x185d0, 0x1c2ec, 0x185c8, 0x1c2e6,
+ 0x185c4, 0x185c2, 0x10bd0, 0x185ec, 0x10bc8, 0x185e6, 0x10bc4, 0x10bc2,
+ 0x10bec, 0x10be6, 0x1f1a8, 0x1f8d6, 0x11afc, 0x1f1a4, 0x11a7e, 0x1f1a2,
+ 0x1e128, 0x1f096, 0x1e368, 0x1e124, 0x1e364, 0x1e122, 0x1e362, 0x1c268,
+ 0x1e136, 0x1c6e8, 0x1c264, 0x1c6e4, 0x1c262, 0x1c6e2, 0x184e8, 0x1c276,
+ 0x18de8, 0x184e4, 0x18de4, 0x184e2, 0x18de2, 0x109e8, 0x184f6, 0x11be8,
+ 0x109e4, 0x11be4, 0x109e2, 0x11be2, 0x109f6, 0x11bf6, 0x1f9d4, 0x13af8,
+ 0x19d7e, 0x1f9d2, 0x13a7c, 0x13a3e, 0x1f194, 0x1197e, 0x1f3b4, 0x1f192,
+ 0x13b7e, 0x1f3b2, 0x1e114, 0x1e334, 0x1e112, 0x1e774, 0x1e332, 0x1e772,
+ 0x1c234, 0x1c674, 0x1c232, 0x1cef4, 0x1c672, 0x1cef2, 0x18474, 0x18cf4,
+ 0x18472, 0x19df4, 0x18cf2, 0x19df2, 0x108f4, 0x119f4, 0x108f2, 0x13bf4,
+ 0x119f2, 0x13bf2, 0x17af0, 0x1bd7c, 0x17a78, 0x1bd3e, 0x17a3c, 0x17a1e,
+ 0x1f9ca, 0x1397c, 0x1fbda, 0x17b7c, 0x1393e, 0x17b3e, 0x1f18a, 0x1f39a,
+ 0x1f7ba, 0x1e10a, 0x1e31a, 0x1e73a, 0x1ef7a, 0x1c21a, 0x1c63a, 0x1ce7a,
+ 0x1defa, 0x1843a, 0x18c7a, 0x19cfa, 0x1bdfa, 0x1087a, 0x118fa, 0x139fa,
+ 0x17978, 0x1bcbe, 0x1793c, 0x1791e, 0x138be, 0x179be, 0x178bc, 0x1789e,
+ 0x1785e, 0x1e0a8, 0x1e0a4, 0x1e0a2, 0x1c168, 0x1e0b6, 0x1c164, 0x1c162,
+ 0x182e8, 0x1c176, 0x182e4, 0x182e2, 0x105e8, 0x182f6, 0x105e4, 0x105e2,
+ 0x105f6, 0x1f0d4, 0x10d7e, 0x1f0d2, 0x1e094, 0x1e1b4, 0x1e092, 0x1e1b2,
+ 0x1c134, 0x1c374, 0x1c132, 0x1c372, 0x18274, 0x186f4, 0x18272, 0x186f2,
+ 0x104f4, 0x10df4, 0x104f2, 0x10df2, 0x1f8ea, 0x11d7c, 0x11d3e, 0x1f0ca,
+ 0x1f1da, 0x1e08a, 0x1e19a, 0x1e3ba, 0x1c11a, 0x1c33a, 0x1c77a, 0x1823a,
+ 0x1867a, 0x18efa, 0x1047a, 0x10cfa, 0x11dfa, 0x13d78, 0x19ebe, 0x13d3c,
+ 0x13d1e, 0x11cbe, 0x13dbe, 0x17d70, 0x1bebc, 0x17d38, 0x1be9e, 0x17d1c,
+ 0x17d0e, 0x13cbc, 0x17dbc, 0x13c9e, 0x17d9e, 0x17cb8, 0x1be5e, 0x17c9c,
+ 0x17c8e, 0x13c5e, 0x17cde, 0x17c5c, 0x17c4e, 0x17c2e, 0x1c0b4, 0x1c0b2,
+ 0x18174, 0x18172, 0x102f4, 0x102f2, 0x1e0da, 0x1c09a, 0x1c1ba, 0x1813a,
+ 0x1837a, 0x1027a, 0x106fa, 0x10ebe, 0x11ebc, 0x11e9e, 0x13eb8, 0x19f5e,
+ 0x13e9c, 0x13e8e, 0x11e5e, 0x13ede, 0x17eb0, 0x1bf5c, 0x17e98, 0x1bf4e,
+ 0x17e8c, 0x17e86, 0x13e5c, 0x17edc, 0x13e4e, 0x17ece, 0x17e58, 0x1bf2e,
+ 0x17e4c, 0x17e46, 0x13e2e, 0x17e6e, 0x17e2c, 0x17e26, 0x10f5e, 0x11f5c,
+ 0x11f4e, 0x13f58, 0x19fae, 0x13f4c, 0x13f46, 0x11f2e, 0x13f6e, 0x13f2c,
+ 0x13f26
+ }, {
+ 0x1abe0, 0x1d5f8, 0x153c0, 0x1a9f0, 0x1d4fc, 0x151e0, 0x1a8f8, 0x1d47e,
+ 0x150f0, 0x1a87c, 0x15078, 0x1fad0, 0x15be0, 0x1adf8, 0x1fac8, 0x159f0,
+ 0x1acfc, 0x1fac4, 0x158f8, 0x1ac7e, 0x1fac2, 0x1587c, 0x1f5d0, 0x1faec,
+ 0x15df8, 0x1f5c8, 0x1fae6, 0x15cfc, 0x1f5c4, 0x15c7e, 0x1f5c2, 0x1ebd0,
+ 0x1f5ec, 0x1ebc8, 0x1f5e6, 0x1ebc4, 0x1ebc2, 0x1d7d0, 0x1ebec, 0x1d7c8,
+ 0x1ebe6, 0x1d7c4, 0x1d7c2, 0x1afd0, 0x1d7ec, 0x1afc8, 0x1d7e6, 0x1afc4,
+ 0x14bc0, 0x1a5f0, 0x1d2fc, 0x149e0, 0x1a4f8, 0x1d27e, 0x148f0, 0x1a47c,
+ 0x14878, 0x1a43e, 0x1483c, 0x1fa68, 0x14df0, 0x1a6fc, 0x1fa64, 0x14cf8,
+ 0x1a67e, 0x1fa62, 0x14c7c, 0x14c3e, 0x1f4e8, 0x1fa76, 0x14efc, 0x1f4e4,
+ 0x14e7e, 0x1f4e2, 0x1e9e8, 0x1f4f6, 0x1e9e4, 0x1e9e2, 0x1d3e8, 0x1e9f6,
+ 0x1d3e4, 0x1d3e2, 0x1a7e8, 0x1d3f6, 0x1a7e4, 0x1a7e2, 0x145e0, 0x1a2f8,
+ 0x1d17e, 0x144f0, 0x1a27c, 0x14478, 0x1a23e, 0x1443c, 0x1441e, 0x1fa34,
+ 0x146f8, 0x1a37e, 0x1fa32, 0x1467c, 0x1463e, 0x1f474, 0x1477e, 0x1f472,
+ 0x1e8f4, 0x1e8f2, 0x1d1f4, 0x1d1f2, 0x1a3f4, 0x1a3f2, 0x142f0, 0x1a17c,
+ 0x14278, 0x1a13e, 0x1423c, 0x1421e, 0x1fa1a, 0x1437c, 0x1433e, 0x1f43a,
+ 0x1e87a, 0x1d0fa, 0x14178, 0x1a0be, 0x1413c, 0x1411e, 0x141be, 0x140bc,
+ 0x1409e, 0x12bc0, 0x195f0, 0x1cafc, 0x129e0, 0x194f8, 0x1ca7e, 0x128f0,
+ 0x1947c, 0x12878, 0x1943e, 0x1283c, 0x1f968, 0x12df0, 0x196fc, 0x1f964,
+ 0x12cf8, 0x1967e, 0x1f962, 0x12c7c, 0x12c3e, 0x1f2e8, 0x1f976, 0x12efc,
+ 0x1f2e4, 0x12e7e, 0x1f2e2, 0x1e5e8, 0x1f2f6, 0x1e5e4, 0x1e5e2, 0x1cbe8,
+ 0x1e5f6, 0x1cbe4, 0x1cbe2, 0x197e8, 0x1cbf6, 0x197e4, 0x197e2, 0x1b5e0,
+ 0x1daf8, 0x1ed7e, 0x169c0, 0x1b4f0, 0x1da7c, 0x168e0, 0x1b478, 0x1da3e,
+ 0x16870, 0x1b43c, 0x16838, 0x1b41e, 0x1681c, 0x125e0, 0x192f8, 0x1c97e,
+ 0x16de0, 0x124f0, 0x1927c, 0x16cf0, 0x1b67c, 0x1923e, 0x16c78, 0x1243c,
+ 0x16c3c, 0x1241e, 0x16c1e, 0x1f934, 0x126f8, 0x1937e, 0x1fb74, 0x1f932,
+ 0x16ef8, 0x1267c, 0x1fb72, 0x16e7c, 0x1263e, 0x16e3e, 0x1f274, 0x1277e,
+ 0x1f6f4, 0x1f272, 0x16f7e, 0x1f6f2, 0x1e4f4, 0x1edf4, 0x1e4f2, 0x1edf2,
+ 0x1c9f4, 0x1dbf4, 0x1c9f2, 0x1dbf2, 0x193f4, 0x193f2, 0x165c0, 0x1b2f0,
+ 0x1d97c, 0x164e0, 0x1b278, 0x1d93e, 0x16470, 0x1b23c, 0x16438, 0x1b21e,
+ 0x1641c, 0x1640e, 0x122f0, 0x1917c, 0x166f0, 0x12278, 0x1913e, 0x16678,
+ 0x1b33e, 0x1663c, 0x1221e, 0x1661e, 0x1f91a, 0x1237c, 0x1fb3a, 0x1677c,
+ 0x1233e, 0x1673e, 0x1f23a, 0x1f67a, 0x1e47a, 0x1ecfa, 0x1c8fa, 0x1d9fa,
+ 0x191fa, 0x162e0, 0x1b178, 0x1d8be, 0x16270, 0x1b13c, 0x16238, 0x1b11e,
+ 0x1621c, 0x1620e, 0x12178, 0x190be, 0x16378, 0x1213c, 0x1633c, 0x1211e,
+ 0x1631e, 0x121be, 0x163be, 0x16170, 0x1b0bc, 0x16138, 0x1b09e, 0x1611c,
+ 0x1610e, 0x120bc, 0x161bc, 0x1209e, 0x1619e, 0x160b8, 0x1b05e, 0x1609c,
+ 0x1608e, 0x1205e, 0x160de, 0x1605c, 0x1604e, 0x115e0, 0x18af8, 0x1c57e,
+ 0x114f0, 0x18a7c, 0x11478, 0x18a3e, 0x1143c, 0x1141e, 0x1f8b4, 0x116f8,
+ 0x18b7e, 0x1f8b2, 0x1167c, 0x1163e, 0x1f174, 0x1177e, 0x1f172, 0x1e2f4,
+ 0x1e2f2, 0x1c5f4, 0x1c5f2, 0x18bf4, 0x18bf2, 0x135c0, 0x19af0, 0x1cd7c,
+ 0x134e0, 0x19a78, 0x1cd3e, 0x13470, 0x19a3c, 0x13438, 0x19a1e, 0x1341c,
+ 0x1340e, 0x112f0, 0x1897c, 0x136f0, 0x11278, 0x1893e, 0x13678, 0x19b3e,
+ 0x1363c, 0x1121e, 0x1361e, 0x1f89a, 0x1137c, 0x1f9ba, 0x1377c, 0x1133e,
+ 0x1373e, 0x1f13a, 0x1f37a, 0x1e27a, 0x1e6fa, 0x1c4fa, 0x1cdfa, 0x189fa,
+ 0x1bae0, 0x1dd78, 0x1eebe, 0x174c0, 0x1ba70, 0x1dd3c, 0x17460, 0x1ba38,
+ 0x1dd1e, 0x17430, 0x1ba1c, 0x17418, 0x1ba0e, 0x1740c, 0x132e0, 0x19978,
+ 0x1ccbe, 0x176e0, 0x13270, 0x1993c, 0x17670, 0x1bb3c, 0x1991e, 0x17638,
+ 0x1321c, 0x1761c, 0x1320e, 0x1760e, 0x11178, 0x188be, 0x13378, 0x1113c,
+ 0x17778, 0x1333c, 0x1111e, 0x1773c, 0x1331e, 0x1771e, 0x111be, 0x133be,
+ 0x177be, 0x172c0, 0x1b970, 0x1dcbc, 0x17260, 0x1b938, 0x1dc9e, 0x17230,
+ 0x1b91c, 0x17218, 0x1b90e, 0x1720c, 0x17206, 0x13170, 0x198bc, 0x17370,
+ 0x13138, 0x1989e, 0x17338, 0x1b99e, 0x1731c, 0x1310e, 0x1730e, 0x110bc,
+ 0x131bc, 0x1109e, 0x173bc, 0x1319e, 0x1739e, 0x17160, 0x1b8b8, 0x1dc5e,
+ 0x17130, 0x1b89c, 0x17118, 0x1b88e, 0x1710c, 0x17106, 0x130b8, 0x1985e,
+ 0x171b8, 0x1309c, 0x1719c, 0x1308e, 0x1718e, 0x1105e, 0x130de, 0x171de,
+ 0x170b0, 0x1b85c, 0x17098, 0x1b84e, 0x1708c, 0x17086, 0x1305c, 0x170dc,
+ 0x1304e, 0x170ce, 0x17058, 0x1b82e, 0x1704c, 0x17046, 0x1302e, 0x1706e,
+ 0x1702c, 0x17026, 0x10af0, 0x1857c, 0x10a78, 0x1853e, 0x10a3c, 0x10a1e,
+ 0x10b7c, 0x10b3e, 0x1f0ba, 0x1e17a, 0x1c2fa, 0x185fa, 0x11ae0, 0x18d78,
+ 0x1c6be, 0x11a70, 0x18d3c, 0x11a38, 0x18d1e, 0x11a1c, 0x11a0e, 0x10978,
+ 0x184be, 0x11b78, 0x1093c, 0x11b3c, 0x1091e, 0x11b1e, 0x109be, 0x11bbe,
+ 0x13ac0, 0x19d70, 0x1cebc, 0x13a60, 0x19d38, 0x1ce9e, 0x13a30, 0x19d1c,
+ 0x13a18, 0x19d0e, 0x13a0c, 0x13a06, 0x11970, 0x18cbc, 0x13b70, 0x11938,
+ 0x18c9e, 0x13b38, 0x1191c, 0x13b1c, 0x1190e, 0x13b0e, 0x108bc, 0x119bc,
+ 0x1089e, 0x13bbc, 0x1199e, 0x13b9e, 0x1bd60, 0x1deb8, 0x1ef5e, 0x17a40,
+ 0x1bd30, 0x1de9c, 0x17a20, 0x1bd18, 0x1de8e, 0x17a10, 0x1bd0c, 0x17a08,
+ 0x1bd06, 0x17a04, 0x13960, 0x19cb8, 0x1ce5e, 0x17b60, 0x13930, 0x19c9c,
+ 0x17b30, 0x1bd9c, 0x19c8e, 0x17b18, 0x1390c, 0x17b0c, 0x13906, 0x17b06,
+ 0x118b8, 0x18c5e, 0x139b8, 0x1189c, 0x17bb8, 0x1399c, 0x1188e, 0x17b9c,
+ 0x1398e, 0x17b8e, 0x1085e, 0x118de, 0x139de, 0x17bde, 0x17940, 0x1bcb0,
+ 0x1de5c, 0x17920, 0x1bc98, 0x1de4e, 0x17910, 0x1bc8c, 0x17908, 0x1bc86,
+ 0x17904, 0x17902, 0x138b0, 0x19c5c, 0x179b0, 0x13898, 0x19c4e, 0x17998,
+ 0x1bcce, 0x1798c, 0x13886, 0x17986, 0x1185c, 0x138dc, 0x1184e, 0x179dc,
+ 0x138ce, 0x179ce, 0x178a0, 0x1bc58, 0x1de2e, 0x17890, 0x1bc4c, 0x17888,
+ 0x1bc46, 0x17884, 0x17882, 0x13858, 0x19c2e, 0x178d8, 0x1384c, 0x178cc,
+ 0x13846, 0x178c6, 0x1182e, 0x1386e, 0x178ee, 0x17850, 0x1bc2c, 0x17848,
+ 0x1bc26, 0x17844, 0x17842, 0x1382c, 0x1786c, 0x13826, 0x17866, 0x17828,
+ 0x1bc16, 0x17824, 0x17822, 0x13816, 0x17836, 0x10578, 0x182be, 0x1053c,
+ 0x1051e, 0x105be, 0x10d70, 0x186bc, 0x10d38, 0x1869e, 0x10d1c, 0x10d0e,
+ 0x104bc, 0x10dbc, 0x1049e, 0x10d9e, 0x11d60, 0x18eb8, 0x1c75e, 0x11d30,
+ 0x18e9c, 0x11d18, 0x18e8e, 0x11d0c, 0x11d06, 0x10cb8, 0x1865e, 0x11db8,
+ 0x10c9c, 0x11d9c, 0x10c8e, 0x11d8e, 0x1045e, 0x10cde, 0x11dde, 0x13d40,
+ 0x19eb0, 0x1cf5c, 0x13d20, 0x19e98, 0x1cf4e, 0x13d10, 0x19e8c, 0x13d08,
+ 0x19e86, 0x13d04, 0x13d02, 0x11cb0, 0x18e5c, 0x13db0, 0x11c98, 0x18e4e,
+ 0x13d98, 0x19ece, 0x13d8c, 0x11c86, 0x13d86, 0x10c5c, 0x11cdc, 0x10c4e,
+ 0x13ddc, 0x11cce, 0x13dce, 0x1bea0, 0x1df58, 0x1efae, 0x1be90, 0x1df4c,
+ 0x1be88, 0x1df46, 0x1be84, 0x1be82, 0x13ca0, 0x19e58, 0x1cf2e, 0x17da0,
+ 0x13c90, 0x19e4c, 0x17d90, 0x1becc, 0x19e46, 0x17d88, 0x13c84, 0x17d84,
+ 0x13c82, 0x17d82, 0x11c58, 0x18e2e, 0x13cd8, 0x11c4c, 0x17dd8, 0x13ccc,
+ 0x11c46, 0x17dcc, 0x13cc6, 0x17dc6, 0x10c2e, 0x11c6e, 0x13cee, 0x17dee,
+ 0x1be50, 0x1df2c, 0x1be48, 0x1df26, 0x1be44, 0x1be42, 0x13c50, 0x19e2c,
+ 0x17cd0, 0x13c48, 0x19e26, 0x17cc8, 0x1be66, 0x17cc4, 0x13c42, 0x17cc2,
+ 0x11c2c, 0x13c6c, 0x11c26, 0x17cec, 0x13c66, 0x17ce6, 0x1be28, 0x1df16,
+ 0x1be24, 0x1be22, 0x13c28, 0x19e16, 0x17c68, 0x13c24, 0x17c64, 0x13c22,
+ 0x17c62, 0x11c16, 0x13c36, 0x17c76, 0x1be14, 0x1be12, 0x13c14, 0x17c34,
+ 0x13c12, 0x17c32, 0x102bc, 0x1029e, 0x106b8, 0x1835e, 0x1069c, 0x1068e,
+ 0x1025e, 0x106de, 0x10eb0, 0x1875c, 0x10e98, 0x1874e, 0x10e8c, 0x10e86,
+ 0x1065c, 0x10edc, 0x1064e, 0x10ece, 0x11ea0, 0x18f58, 0x1c7ae, 0x11e90,
+ 0x18f4c, 0x11e88, 0x18f46, 0x11e84, 0x11e82, 0x10e58, 0x1872e, 0x11ed8,
+ 0x18f6e, 0x11ecc, 0x10e46, 0x11ec6, 0x1062e, 0x10e6e, 0x11eee, 0x19f50,
+ 0x1cfac, 0x19f48, 0x1cfa6, 0x19f44, 0x19f42, 0x11e50, 0x18f2c, 0x13ed0,
+ 0x19f6c, 0x18f26, 0x13ec8, 0x11e44, 0x13ec4, 0x11e42, 0x13ec2, 0x10e2c,
+ 0x11e6c, 0x10e26, 0x13eec, 0x11e66, 0x13ee6, 0x1dfa8, 0x1efd6, 0x1dfa4,
+ 0x1dfa2, 0x19f28, 0x1cf96, 0x1bf68, 0x19f24, 0x1bf64, 0x19f22, 0x1bf62,
+ 0x11e28, 0x18f16, 0x13e68, 0x11e24, 0x17ee8, 0x13e64, 0x11e22, 0x17ee4,
+ 0x13e62, 0x17ee2, 0x10e16, 0x11e36, 0x13e76, 0x17ef6, 0x1df94, 0x1df92,
+ 0x19f14, 0x1bf34, 0x19f12, 0x1bf32, 0x11e14, 0x13e34, 0x11e12, 0x17e74,
+ 0x13e32, 0x17e72, 0x1df8a, 0x19f0a, 0x1bf1a, 0x11e0a, 0x13e1a, 0x17e3a,
+ 0x1035c, 0x1034e, 0x10758, 0x183ae, 0x1074c, 0x10746, 0x1032e, 0x1076e,
+ 0x10f50, 0x187ac, 0x10f48, 0x187a6, 0x10f44, 0x10f42, 0x1072c, 0x10f6c,
+ 0x10726, 0x10f66, 0x18fa8, 0x1c7d6, 0x18fa4, 0x18fa2, 0x10f28, 0x18796,
+ 0x11f68, 0x18fb6, 0x11f64, 0x10f22, 0x11f62, 0x10716, 0x10f36, 0x11f76,
+ 0x1cfd4, 0x1cfd2, 0x18f94, 0x19fb4, 0x18f92, 0x19fb2, 0x10f14, 0x11f34,
+ 0x10f12, 0x13f74, 0x11f32, 0x13f72, 0x1cfca, 0x18f8a, 0x19f9a, 0x10f0a,
+ 0x11f1a, 0x13f3a, 0x103ac, 0x103a6, 0x107a8, 0x183d6, 0x107a4, 0x107a2,
+ 0x10396, 0x107b6, 0x187d4, 0x187d2, 0x10794, 0x10fb4, 0x10792, 0x10fb2,
+ 0x1c7ea
+ }};
+
+ static int ERROR_LEVEL[][] =
+ {{
+ 27, 917
+ }, {
+ 522, 568, 723, 809
+ }, {
+ 237, 308, 436, 284, 646, 653, 428, 379
+ }, {
+ 274, 562, 232, 755, 599, 524, 801, 132, 295, 116, 442, 428, 295, 42, 176, 65
+ }, {
+ 361, 575, 922, 525, 176, 586, 640, 321, 536, 742, 677, 742, 687, 284, 193, 517,
+ 273, 494, 263, 147, 593, 800, 571, 320, 803, 133, 231, 390, 685, 330, 63, 410
+ }, {
+ 539, 422, 6, 93, 862, 771, 453, 106, 610, 287, 107, 505, 733, 877, 381, 612,
+ 723, 476, 462, 172, 430, 609, 858, 822, 543, 376, 511, 400, 672, 762, 283, 184,
+ 440, 35, 519, 31, 460, 594, 225, 535, 517, 352, 605, 158, 651, 201, 488, 502,
+ 648, 733, 717, 83, 404, 97, 280, 771, 840, 629, 4, 381, 843, 623, 264, 543
+ }, {
+ 521, 310, 864, 547, 858, 580, 296, 379, 53, 779, 897, 444, 400, 925, 749, 415,
+ 822, 93, 217, 208, 928, 244, 583, 620, 246, 148, 447, 631, 292, 908, 490, 704,
+ 516, 258, 457, 907, 594, 723, 674, 292, 272, 96, 684, 432, 686, 606, 860, 569,
+ 193, 219, 129, 186, 236, 287, 192, 775, 278, 173, 40, 379, 712, 463, 646, 776,
+ 171, 491, 297, 763, 156, 732, 95, 270, 447, 90, 507, 48, 228, 821, 808, 898,
+ 784, 663, 627, 378, 382, 262, 380, 602, 754, 336, 89, 614, 87, 432, 670, 616,
+ 157, 374, 242, 726, 600, 269, 375, 898, 845, 454, 354, 130, 814, 587, 804, 34,
+ 211, 330, 539, 297, 827, 865, 37, 517, 834, 315, 550, 86, 801, 4, 108, 539
+ }, {
+ 524, 894, 75, 766, 882, 857, 74, 204, 82, 586, 708, 250, 905, 786, 138, 720,
+ 858, 194, 311, 913, 275, 190, 375, 850, 438, 733, 194, 280, 201, 280, 828, 757,
+ 710, 814, 919, 89, 68, 569, 11, 204, 796, 605, 540, 913, 801, 700, 799, 137,
+ 439, 418, 592, 668, 353, 859, 370, 694, 325, 240, 216, 257, 284, 549, 209, 884,
+ 315, 70, 329, 793, 490, 274, 877, 162, 749, 812, 684, 461, 334, 376, 849, 521,
+ 307, 291, 803, 712, 19, 358, 399, 908, 103, 511, 51, 8, 517, 225, 289, 470,
+ 637, 731, 66, 255, 917, 269, 463, 830, 730, 433, 848, 585, 136, 538, 906, 90,
+ 2, 290, 743, 199, 655, 903, 329, 49, 802, 580, 355, 588, 188, 462, 10, 134,
+ 628, 320, 479, 130, 739, 71, 263, 318, 374, 601, 192, 605, 142, 673, 687, 234,
+ 722, 384, 177, 752, 607, 640, 455, 193, 689, 707, 805, 641, 48, 60, 732, 621,
+ 895, 544, 261, 852, 655, 309, 697, 755, 756, 60, 231, 773, 434, 421, 726, 528,
+ 503, 118, 49, 795, 32, 144, 500, 238, 836, 394, 280, 566, 319, 9, 647, 550,
+ 73, 914, 342, 126, 32, 681, 331, 792, 620, 60, 609, 441, 180, 791, 893, 754,
+ 605, 383, 228, 749, 760, 213, 54, 297, 134, 54, 834, 299, 922, 191, 910, 532,
+ 609, 829, 189, 20, 167, 29, 872, 449, 83, 402, 41, 656, 505, 579, 481, 173,
+ 404, 251, 688, 95, 497, 555, 642, 543, 307, 159, 924, 558, 648, 55, 497, 10
+ }, {
+ 352, 77, 373, 504, 35, 599, 428, 207, 409, 574, 118, 498, 285, 380, 350, 492,
+ 197, 265, 920, 155, 914, 299, 229, 643, 294, 871, 306, 88, 87, 193, 352, 781,
+ 846, 75, 327, 520, 435, 543, 203, 666, 249, 346, 781, 621, 640, 268, 794, 534,
+ 539, 781, 408, 390, 644, 102, 476, 499, 290, 632, 545, 37, 858, 916, 552, 41,
+ 542, 289, 122, 272, 383, 800, 485, 98, 752, 472, 761, 107, 784, 860, 658, 741,
+ 290, 204, 681, 407, 855, 85, 99, 62, 482, 180, 20, 297, 451, 593, 913, 142,
+ 808, 684, 287, 536, 561, 76, 653, 899, 729, 567, 744, 390, 513, 192, 516, 258,
+ 240, 518, 794, 395, 768, 848, 51, 610, 384, 168, 190, 826, 328, 596, 786, 303,
+ 570, 381, 415, 641, 156, 237, 151, 429, 531, 207, 676, 710, 89, 168, 304, 402,
+ 40, 708, 575, 162, 864, 229, 65, 861, 841, 512, 164, 477, 221, 92, 358, 785,
+ 288, 357, 850, 836, 827, 736, 707, 94, 8, 494, 114, 521, 2, 499, 851, 543,
+ 152, 729, 771, 95, 248, 361, 578, 323, 856, 797, 289, 51, 684, 466, 533, 820,
+ 669, 45, 902, 452, 167, 342, 244, 173, 35, 463, 651, 51, 699, 591, 452, 578,
+ 37, 124, 298, 332, 552, 43, 427, 119, 662, 777, 475, 850, 764, 364, 578, 911,
+ 283, 711, 472, 420, 245, 288, 594, 394, 511, 327, 589, 777, 699, 688, 43, 408,
+ 842, 383, 721, 521, 560, 644, 714, 559, 62, 145, 873, 663, 713, 159, 672, 729,
+ 624, 59, 193, 417, 158, 209, 563, 564, 343, 693, 109, 608, 563, 365, 181, 772,
+ 677, 310, 248, 353, 708, 410, 579, 870, 617, 841, 632, 860, 289, 536, 35, 777,
+ 618, 586, 424, 833, 77, 597, 346, 269, 757, 632, 695, 751, 331, 247, 184, 45,
+ 787, 680, 18, 66, 407, 369, 54, 492, 228, 613, 830, 922, 437, 519, 644, 905,
+ 789, 420, 305, 441, 207, 300, 892, 827, 141, 537, 381, 662, 513, 56, 252, 341,
+ 242, 797, 838, 837, 720, 224, 307, 631, 61, 87, 560, 310, 756, 665, 397, 808,
+ 851, 309, 473, 795, 378, 31, 647, 915, 459, 806, 590, 731, 425, 216, 548, 249,
+ 321, 881, 699, 535, 673, 782, 210, 815, 905, 303, 843, 922, 281, 73, 469, 791,
+ 660, 162, 498, 308, 155, 422, 907, 817, 187, 62, 16, 425, 535, 336, 286, 437,
+ 375, 273, 610, 296, 183, 923, 116, 667, 751, 353, 62, 366, 691, 379, 687, 842,
+ 37, 357, 720, 742, 330, 5, 39, 923, 311, 424, 242, 749, 321, 54, 669, 316,
+ 342, 299, 534, 105, 667, 488, 640, 672, 576, 540, 316, 486, 721, 610, 46, 656,
+ 447, 171, 616, 464, 190, 531, 297, 321, 762, 752, 533, 175, 134, 14, 381, 433,
+ 717, 45, 111, 20, 596, 284, 736, 138, 646, 411, 877, 669, 141, 919, 45, 780,
+ 407, 164, 332, 899, 165, 726, 600, 325, 498, 655, 357, 752, 768, 223, 849, 647,
+ 63, 310, 863, 251, 366, 304, 282, 738, 675, 410, 389, 244, 31, 121, 303, 263
+ }};
+
+ /** Holds value of property outBits. */
+ private byte[] outBits;
+
+ /** Holds value of property bitColumns. */
+ private int bitColumns;
+
+ /** Holds value of property codeRows. */
+ private int codeRows;
+
+ /** Holds value of property codeColumns. */
+ private int codeColumns;
+
+ /** Holds value of property codewords. */
+ private int[] codewords = new int[MAX_DATA_CODEWORDS + 2];
+
+ /** Holds value of property lenCodewords. */
+ private int lenCodewords;
+
+ /** Holds value of property errorLevel. */
+ private int errorLevel;
+
+ /** Holds value of property text. */
+ private byte[] text;
+
+ /** Holds value of property options. */
+ private int options;
+
+ /** Holds value of property aspectRatio. */
+ private float aspectRatio;
+
+ /** Holds value of property yHeight. */
+ private float yHeight;
+
+ protected static class Segment {
+ public char type;
+ public int start;
+ public int end;
+
+ public Segment(char type, int start, int end) {
+ this.type = type;
+ this.start = start;
+ this.end = end;
+ }
+ }
+
+ protected static class SegmentList {
+ protected ArrayList list = new ArrayList();
+
+ public void add(char type, int start, int end) {
+ list.add(new Segment(type, start, end));
+ }
+
+ public Segment get(int idx) {
+ if (idx < 0 || idx >= list.size())
+ return null;
+ return (Segment)list.get(idx);
+ }
+
+ public void remove(int idx) {
+ if (idx < 0 || idx >= list.size())
+ return;
+ list.remove(idx);
+ }
+
+ public int size() {
+ return list.size();
+ }
+ }
+}
diff --git a/src/main/java/com/lowagie/text/pdf/BarcodePostnet.java b/src/main/java/com/lowagie/text/pdf/BarcodePostnet.java
new file mode 100644
index 0000000..5befa67
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/BarcodePostnet.java
@@ -0,0 +1,233 @@
+/*
+ * Copyright 2002 by Paulo Soares.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+package com.lowagie.text.pdf;
+import com.lowagie.text.Rectangle;
+import java.awt.Color;
+import java.awt.Image;
+import java.awt.Canvas;
+import java.awt.image.MemoryImageSource;
+
+/** Implements the Postnet and Planet barcodes. The default parameters are:
+ * <pre>
+ *n = 72f / 22f; // distance between bars
+ *x = 0.02f * 72f; // bar width
+ *barHeight = 0.125f * 72f; // height of the tall bars
+ *size = 0.05f * 72f; // height of the short bars
+ *codeType = POSTNET; // type of code
+ * </pre>
+ *
+ * @author Paulo Soares (psoares@consiste.pt)
+ */
+public class BarcodePostnet extends Barcode{
+
+ /** The bars for each character.
+ */
+ static byte BARS[][] =
+ {
+ {1,1,0,0,0},
+ {0,0,0,1,1},
+ {0,0,1,0,1},
+ {0,0,1,1,0},
+ {0,1,0,0,1},
+ {0,1,0,1,0},
+ {0,1,1,0,0},
+ {1,0,0,0,1},
+ {1,0,0,1,0},
+ {1,0,1,0,0}
+ };
+
+ /** Creates new BarcodePostnet */
+ public BarcodePostnet() {
+ n = 72f / 22f; // distance between bars
+ x = 0.02f * 72f; // bar width
+ barHeight = 0.125f * 72f; // height of the tall bars
+ size = 0.05f * 72f; // height of the short bars
+ codeType = POSTNET; // type of code
+ }
+
+ /** Creates the bars for Postnet.
+ * @param text the code to be created without checksum
+ * @return the bars
+ */
+ public static byte[] getBarsPostnet(String text) {
+ int total = 0;
+ for (int k = text.length() - 1; k >= 0; --k) {
+ int n = text.charAt(k) - '0';
+ total += n;
+ }
+ text += (char)(((10 - (total % 10)) % 10) + '0');
+ byte bars[] = new byte[text.length() * 5 + 2];
+ bars[0] = 1;
+ bars[bars.length - 1] = 1;
+ for (int k = 0; k < text.length(); ++k) {
+ int c = text.charAt(k) - '0';
+ System.arraycopy(BARS[c], 0, bars, k * 5 + 1, 5);
+ }
+ return bars;
+ }
+
+ /** Gets the maximum area that the barcode and the text, if
+ * any, will occupy. The lower left corner is always (0, 0).
+ * @return the size the barcode occupies.
+ */
+ public Rectangle getBarcodeSize() {
+ float width = ((code.length() + 1) * 5 + 1) * n + x;
+ return new Rectangle(width, barHeight);
+ }
+
+ /** Places the barcode in a <CODE>PdfContentByte</CODE>. The
+ * barcode is always placed at coodinates (0, 0). Use the
+ * translation matrix to move it elsewhere.<p>
+ * The bars and text are written in the following colors:<p>
+ * <P><TABLE BORDER=1>
+ * <TR>
+ * <TH><P><CODE>barColor</CODE></TH>
+ * <TH><P><CODE>textColor</CODE></TH>
+ * <TH><P>Result</TH>
+ * </TR>
+ * <TR>
+ * <TD><P><CODE>null</CODE></TD>
+ * <TD><P><CODE>null</CODE></TD>
+ * <TD><P>bars and text painted with current fill color</TD>
+ * </TR>
+ * <TR>
+ * <TD><P><CODE>barColor</CODE></TD>
+ * <TD><P><CODE>null</CODE></TD>
+ * <TD><P>bars and text painted with <CODE>barColor</CODE></TD>
+ * </TR>
+ * <TR>
+ * <TD><P><CODE>null</CODE></TD>
+ * <TD><P><CODE>textColor</CODE></TD>
+ * <TD><P>bars painted with current color<br>text painted with <CODE>textColor</CODE></TD>
+ * </TR>
+ * <TR>
+ * <TD><P><CODE>barColor</CODE></TD>
+ * <TD><P><CODE>textColor</CODE></TD>
+ * <TD><P>bars painted with <CODE>barColor</CODE><br>text painted with <CODE>textColor</CODE></TD>
+ * </TR>
+ * </TABLE>
+ * @param cb the <CODE>PdfContentByte</CODE> where the barcode will be placed
+ * @param barColor the color of the bars. It can be <CODE>null</CODE>
+ * @param textColor the color of the text. It can be <CODE>null</CODE>
+ * @return the dimensions the barcode occupies
+ */
+ public Rectangle placeBarcode(PdfContentByte cb, Color barColor, Color textColor) {
+ if (barColor != null)
+ cb.setColorFill(barColor);
+ byte bars[] = getBarsPostnet(code);
+ byte flip = 1;
+ if (codeType == PLANET) {
+ flip = 0;
+ bars[0] = 0;
+ bars[bars.length - 1] = 0;
+ }
+ float startX = 0;
+ for (int k = 0; k < bars.length; ++k) {
+ cb.rectangle(startX, 0, x - inkSpreading, bars[k] == flip ? barHeight : size);
+ startX += n;
+ }
+ cb.fill();
+ return getBarcodeSize();
+ }
+
+ /** Creates a <CODE>java.awt.Image</CODE>. This image only
+ * contains the bars without any text.
+ * @param foreground the color of the bars
+ * @param background the color of the background
+ * @return the image
+ *
+ */
+ public java.awt.Image createAwtImage(Color foreground, Color background) {
+ int f = foreground.getRGB();
+ int g = background.getRGB();
+ Canvas canvas = new Canvas();
+ int barWidth = (int)x;
+ if (barWidth <= 0)
+ barWidth = 1;
+ int barDistance = (int)n;
+ if (barDistance <= barWidth)
+ barDistance = barWidth + 1;
+ int barShort = (int)size;
+ if (barShort <= 0)
+ barShort = 1;
+ int barTall = (int)barHeight;
+ if (barTall <= barShort)
+ barTall = barShort + 1;
+ int width = ((code.length() + 1) * 5 + 1) * barDistance + barWidth;
+ int pix[] = new int[width * barTall];
+ byte bars[] = getBarsPostnet(code);
+ byte flip = 1;
+ if (codeType == PLANET) {
+ flip = 0;
+ bars[0] = 0;
+ bars[bars.length - 1] = 0;
+ }
+ int idx = 0;
+ for (int k = 0; k < bars.length; ++k) {
+ boolean dot = (bars[k] == flip);
+ for (int j = 0; j < barDistance; ++j) {
+ pix[idx + j] = ((dot && j < barWidth) ? f : g);
+ }
+ idx += barDistance;
+ }
+ int limit = width * (barTall - barShort);
+ for (int k = width; k < limit; k += width)
+ System.arraycopy(pix, 0, pix, k, width);
+ idx = limit;
+ for (int k = 0; k < bars.length; ++k) {
+ for (int j = 0; j < barDistance; ++j) {
+ pix[idx + j] = ((j < barWidth) ? f : g);
+ }
+ idx += barDistance;
+ }
+ for (int k = limit + width; k < pix.length; k += width)
+ System.arraycopy(pix, limit, pix, k, width);
+ Image img = canvas.createImage(new MemoryImageSource(width, barTall, pix, 0, width));
+
+ return img;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/pdf/BaseField.java b/src/main/java/com/lowagie/text/pdf/BaseField.java
new file mode 100644
index 0000000..8817bbd
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/BaseField.java
@@ -0,0 +1,665 @@
+/*
+ * Copyright 2005 by Paulo Soares.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf;
+
+import java.awt.Color;
+import com.lowagie.text.Element;
+import com.lowagie.text.DocumentException;
+import com.lowagie.text.Rectangle;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.HashMap;
+
+/** Common field variables.
+ * @author Paulo Soares (psoares@consiste.pt)
+ */
+public abstract class BaseField {
+
+ /** A thin border with 1 point width. */
+ public static final float BORDER_WIDTH_THIN = 1;
+ /** A medium border with 2 point width. */
+ public static final float BORDER_WIDTH_MEDIUM = 2;
+ /** A thick border with 3 point width. */
+ public static final float BORDER_WIDTH_THICK = 3;
+ /** The field is visible. */
+ public static final int VISIBLE = 0;
+ /** The field is hidden. */
+ public static final int HIDDEN = 1;
+ /** The field is visible but does not print. */
+ public static final int VISIBLE_BUT_DOES_NOT_PRINT = 2;
+ /** The field is hidden but is printable. */
+ public static final int HIDDEN_BUT_PRINTABLE = 3;
+ /** The user may not change the value of the field. */
+ public static final int READ_ONLY = 1;
+ /** The field must have a value at the time it is exported by a submit-form
+ * action.
+ */
+ public static final int REQUIRED = 2;
+ /** The field may contain multiple lines of text.
+ * This flag is only meaningful with text fields.
+ */
+ public static final int MULTILINE = 4;
+ /** The field will not scroll (horizontally for single-line
+ * fields, vertically for multiple-line fields) to accommodate more text
+ * than will fit within its annotation rectangle. Once the field is full, no
+ * further text will be accepted.
+ */
+ public static final int DO_NOT_SCROLL = 8;
+ /** The field is intended for entering a secure password that should
+ * not be echoed visibly to the screen.
+ */
+ public static final int PASSWORD = 16;
+ /** The text entered in the field represents the pathname of
+ * a file whose contents are to be submitted as the value of the field.
+ */
+ public static final int FILE_SELECTION = 32;
+ /** The text entered in the field will not be spell-checked.
+ * This flag is meaningful only in text fields and in combo
+ * fields with the <CODE>EDIT</CODE> flag set.
+ */
+ public static final int DO_NOT_SPELL_CHECK = 64;
+ /** If set the combo box includes an editable text box as well as a drop list; if
+ * clear, it includes only a drop list.
+ * This flag is only meaningful with combo fields.
+ */
+ public static final int EDIT = 128;
+
+ /**
+ * combo box flag.
+ */
+ public static final int COMB = 256;
+
+ protected float borderWidth = BORDER_WIDTH_THIN;
+ protected int borderStyle = PdfBorderDictionary.STYLE_SOLID;
+ protected Color borderColor;
+ protected Color backgroundColor;
+ protected Color textColor;
+ protected BaseFont font;
+ protected float fontSize = 0;
+ protected int alignment = Element.ALIGN_LEFT;
+ protected PdfWriter writer;
+ protected String text;
+ protected Rectangle box;
+
+ /** Holds value of property rotation. */
+ protected int rotation = 0;
+
+ /** Holds value of property visibility. */
+ protected int visibility;
+
+ /** Holds value of property fieldName. */
+ protected String fieldName;
+
+ /** Holds value of property options. */
+ protected int options;
+
+ /** Holds value of property maxCharacterLength. */
+ protected int maxCharacterLength;
+
+ private final static HashMap fieldKeys = new HashMap();
+
+ static {
+ fieldKeys.putAll(PdfCopyFieldsImp.fieldKeys);
+ fieldKeys.put(PdfName.T, new Integer(1));
+ }
+ /** Creates a new <CODE>TextField</CODE>.
+ * @param writer the document <CODE>PdfWriter</CODE>
+ * @param box the field location and dimensions
+ * @param fieldName the field name. If <CODE>null</CODE> only the widget keys
+ * will be included in the field allowing it to be used as a kid field.
+ */
+ public BaseField(PdfWriter writer, Rectangle box, String fieldName) {
+ this.writer = writer;
+ this.box = box;
+ this.fieldName = fieldName;
+ }
+
+ protected BaseFont getRealFont() throws IOException, DocumentException {
+ if (font == null)
+ return BaseFont.createFont(BaseFont.HELVETICA, BaseFont.WINANSI, false);
+ else
+ return font;
+ }
+
+ protected PdfAppearance getBorderAppearance() throws IOException, DocumentException {
+ PdfAppearance app = new PdfContentByte(writer).createAppearance(box.width(), box.height());
+ switch (rotation) {
+ case 90:
+ app.setMatrix(0, 1, -1, 0, box.height(), 0);
+ break;
+ case 180:
+ app.setMatrix(-1, 0, 0, -1, box.width(), box.height());
+ break;
+ case 270:
+ app.setMatrix(0, -1, 1, 0, 0, box.width());
+ break;
+ }
+ // background
+ if (backgroundColor != null) {
+ app.setColorFill(backgroundColor);
+ app.rectangle(0, 0, box.width(), box.height());
+ app.fill();
+ }
+ // border
+ if (borderStyle == PdfBorderDictionary.STYLE_UNDERLINE) {
+ if (borderWidth != 0 && borderColor != null) {
+ app.setColorStroke(borderColor);
+ app.setLineWidth(borderWidth);
+ app.moveTo(0, borderWidth / 2);
+ app.lineTo(box.width(), borderWidth / 2);
+ app.stroke();
+ }
+ }
+ else if (borderStyle == PdfBorderDictionary.STYLE_BEVELED) {
+ if (borderWidth != 0 && borderColor != null) {
+ app.setColorStroke(borderColor);
+ app.setLineWidth(borderWidth);
+ app.rectangle(borderWidth / 2, borderWidth / 2, box.width() - borderWidth, box.height() - borderWidth);
+ app.stroke();
+ }
+ // beveled
+ Color actual = backgroundColor;
+ if (actual == null)
+ actual = Color.white;
+ app.setGrayFill(1);
+ drawTopFrame(app);
+ app.setColorFill(actual.darker());
+ drawBottomFrame(app);
+ }
+ else if (borderStyle == PdfBorderDictionary.STYLE_INSET) {
+ if (borderWidth != 0 && borderColor != null) {
+ app.setColorStroke(borderColor);
+ app.setLineWidth(borderWidth);
+ app.rectangle(borderWidth / 2, borderWidth / 2, box.width() - borderWidth, box.height() - borderWidth);
+ app.stroke();
+ }
+ // inset
+ app.setGrayFill(0.5f);
+ drawTopFrame(app);
+ app.setGrayFill(0.75f);
+ drawBottomFrame(app);
+ }
+ else {
+ if (borderWidth != 0 && borderColor != null) {
+ if (borderStyle == PdfBorderDictionary.STYLE_DASHED)
+ app.setLineDash(3, 0);
+ app.setColorStroke(borderColor);
+ app.setLineWidth(borderWidth);
+ app.rectangle(borderWidth / 2, borderWidth / 2, box.width() - borderWidth, box.height() - borderWidth);
+ app.stroke();
+ if ((options & COMB) != 0 && maxCharacterLength > 1) {
+ float step = box.width() / maxCharacterLength;
+ float yb = borderWidth / 2;
+ float yt = box.height() - borderWidth / 2;
+ for (int k = 1; k < maxCharacterLength; ++k) {
+ float x = step * k;
+ app.moveTo(x, yb);
+ app.lineTo(x, yt);
+ }
+ app.stroke();
+ }
+ }
+ }
+ return app;
+ }
+
+ protected static ArrayList getHardBreaks(String text) {
+ ArrayList arr = new ArrayList();
+ char cs[] = text.toCharArray();
+ int len = cs.length;
+ StringBuffer buf = new StringBuffer();
+ for (int k = 0; k < len; ++k) {
+ char c = cs[k];
+ if (c == '\r') {
+ if (k + 1 < len && cs[k + 1] == '\n')
+ ++k;
+ arr.add(buf.toString());
+ buf = new StringBuffer();
+ }
+ else if (c == '\n') {
+ arr.add(buf.toString());
+ buf = new StringBuffer();
+ }
+ else
+ buf.append(c);
+ }
+ arr.add(buf.toString());
+ return arr;
+ }
+
+ protected static void trimRight(StringBuffer buf) {
+ int len = buf.length();
+ while (true) {
+ if (len == 0)
+ return;
+ if (buf.charAt(--len) != ' ')
+ return;
+ buf.setLength(len);
+ }
+ }
+
+ protected static ArrayList breakLines(ArrayList breaks, BaseFont font, float fontSize, float width) {
+ ArrayList lines = new ArrayList();
+ StringBuffer buf = new StringBuffer();
+ for (int ck = 0; ck < breaks.size(); ++ck) {
+ buf.setLength(0);
+ float w = 0;
+ char cs[] = ((String)breaks.get(ck)).toCharArray();
+ int len = cs.length;
+ // 0 inline first, 1 inline, 2 spaces
+ int state = 0;
+ int lastspace = -1;
+ char c = 0;
+ int refk = 0;
+ for (int k = 0; k < len; ++k) {
+ c = cs[k];
+ switch (state) {
+ case 0:
+ w += font.getWidthPoint(c, fontSize);
+ buf.append(c);
+ if (w > width) {
+ w = 0;
+ if (buf.length() > 1) {
+ --k;
+ buf.setLength(buf.length() - 1);
+ }
+ lines.add(buf.toString());
+ buf.setLength(0);
+ refk = k;
+ if (c == ' ')
+ state = 2;
+ else
+ state = 1;
+ }
+ else {
+ if (c != ' ')
+ state = 1;
+ }
+ break;
+ case 1:
+ w += font.getWidthPoint(c, fontSize);
+ buf.append(c);
+ if (c == ' ')
+ lastspace = k;
+ if (w > width) {
+ w = 0;
+ if (lastspace >= 0) {
+ k = lastspace;
+ buf.setLength(lastspace - refk);
+ trimRight(buf);
+ lines.add(buf.toString());
+ buf.setLength(0);
+ refk = k;
+ lastspace = -1;
+ state = 2;
+ }
+ else {
+ if (buf.length() > 1) {
+ --k;
+ buf.setLength(buf.length() - 1);
+ }
+ lines.add(buf.toString());
+ buf.setLength(0);
+ refk = k;
+ if (c == ' ')
+ state = 2;
+ }
+ }
+ break;
+ case 2:
+ if (c != ' ') {
+ w = 0;
+ --k;
+ state = 1;
+ }
+ break;
+ }
+ }
+ trimRight(buf);
+ lines.add(buf.toString());
+ }
+ return lines;
+ }
+
+ private void drawTopFrame(PdfAppearance app) {
+ app.moveTo(borderWidth, borderWidth);
+ app.lineTo(borderWidth, box.height() - borderWidth);
+ app.lineTo(box.width() - borderWidth, box.height() - borderWidth);
+ app.lineTo(box.width() - 2 * borderWidth, box.height() - 2 * borderWidth);
+ app.lineTo(2 * borderWidth, box.height() - 2 * borderWidth);
+ app.lineTo(2 * borderWidth, 2 * borderWidth);
+ app.lineTo(borderWidth, borderWidth);
+ app.fill();
+ }
+
+ private void drawBottomFrame(PdfAppearance app) {
+ app.moveTo(borderWidth, borderWidth);
+ app.lineTo(box.width() - borderWidth, borderWidth);
+ app.lineTo(box.width() - borderWidth, box.height() - borderWidth);
+ app.lineTo(box.width() - 2 * borderWidth, box.height() - 2 * borderWidth);
+ app.lineTo(box.width() - 2 * borderWidth, 2 * borderWidth);
+ app.lineTo(2 * borderWidth, 2 * borderWidth);
+ app.lineTo(borderWidth, borderWidth);
+ app.fill();
+ }
+ /** Gets the border width in points.
+ * @return the border width in points
+ */
+ public float getBorderWidth() {
+ return this.borderWidth;
+ }
+
+ /** Sets the border width in points. To eliminate the border
+ * set the border color to <CODE>null</CODE>.
+ * @param borderWidth the border width in points
+ */
+ public void setBorderWidth(float borderWidth) {
+ this.borderWidth = borderWidth;
+ }
+
+ /** Gets the border style.
+ * @return the border style
+ */
+ public int getBorderStyle() {
+ return this.borderStyle;
+ }
+
+ /** Sets the border style. The styles are found in <CODE>PdfBorderDictionary</CODE>
+ * and can be <CODE>STYLE_SOLID</CODE>, <CODE>STYLE_DASHED</CODE>,
+ * <CODE>STYLE_BEVELED</CODE>, <CODE>STYLE_INSET</CODE> and
+ * <CODE>STYLE_UNDERLINE</CODE>.
+ * @param borderStyle the border style
+ */
+ public void setBorderStyle(int borderStyle) {
+ this.borderStyle = borderStyle;
+ }
+
+ /** Gets the border color.
+ * @return the border color
+ */
+ public Color getBorderColor() {
+ return this.borderColor;
+ }
+
+ /** Sets the border color. Set to <CODE>null</CODE> to remove
+ * the border.
+ * @param borderColor the border color
+ */
+ public void setBorderColor(Color borderColor) {
+ this.borderColor = borderColor;
+ }
+
+ /** Gets the background color.
+ * @return the background color
+ */
+ public Color getBackgroundColor() {
+ return this.backgroundColor;
+ }
+
+ /** Sets the background color. Set to <CODE>null</CODE> for
+ * transparent background.
+ * @param backgroundColor the background color
+ */
+ public void setBackgroundColor(Color backgroundColor) {
+ this.backgroundColor = backgroundColor;
+ }
+
+ /** Gets the text color.
+ * @return the text color
+ */
+ public Color getTextColor() {
+ return this.textColor;
+ }
+
+ /** Sets the text color. If <CODE>null</CODE> the color used
+ * will be black.
+ * @param textColor the text color
+ */
+ public void setTextColor(Color textColor) {
+ this.textColor = textColor;
+ }
+
+ /** Gets the text font.
+ * @return the text font
+ */
+ public BaseFont getFont() {
+ return this.font;
+ }
+
+ /** Sets the text font. If <CODE>null</CODE> then Helvetica
+ * will be used.
+ * @param font the text font
+ */
+ public void setFont(BaseFont font) {
+ this.font = font;
+ }
+
+ /** Gets the font size.
+ * @return the font size
+ */
+ public float getFontSize() {
+ return this.fontSize;
+ }
+
+ /** Sets the font size. If 0 then auto-sizing will be used but
+ * only for text fields.
+ * @param fontSize the font size
+ */
+ public void setFontSize(float fontSize) {
+ this.fontSize = fontSize;
+ }
+
+ /** Gets the text horizontal alignment.
+ * @return the text horizontal alignment
+ */
+ public int getAlignment() {
+ return this.alignment;
+ }
+
+ /** Sets the text horizontal alignment. It can be <CODE>Element.ALIGN_LEFT</CODE>,
+ * <CODE>Element.ALIGN_CENTER</CODE> and <CODE>Element.ALIGN_RIGHT</CODE>.
+ * @param alignment the text horizontal alignment
+ */
+ public void setAlignment(int alignment) {
+ this.alignment = alignment;
+ }
+
+ /** Gets the text.
+ * @return the text
+ */
+ public String getText() {
+ return this.text;
+ }
+
+ /** Sets the text for text fields.
+ * @param text the text
+ */
+ public void setText(String text) {
+ this.text = text;
+ }
+
+ /** Gets the field dimension and position.
+ * @return the field dimension and position
+ */
+ public Rectangle getBox() {
+ return this.box;
+ }
+
+ /** Sets the field dimension and position.
+ * @param box the field dimension and position
+ */
+ public void setBox(Rectangle box) {
+ this.box = box;
+ }
+
+ /** Gets the field rotation.
+ * @return the field rotation
+ */
+ public int getRotation() {
+ return this.rotation;
+ }
+
+ /** Sets the field rotation. This value should be the same as
+ * the page rotation where the field will be shown.
+ * @param rotation the field rotation
+ */
+ public void setRotation(int rotation) {
+ if (rotation % 90 != 0)
+ throw new IllegalArgumentException("Rotation must be a multiple of 90.");
+ rotation %= 360;
+ if (rotation < 0)
+ rotation += 360;
+ this.rotation = rotation;
+ }
+
+ /** Convenience method to set the field rotation the same as the
+ * page rotation.
+ * @param page the page
+ */
+ public void setRotationFromPage(Rectangle page) {
+ setRotation(page.getRotation());
+ }
+
+ /** Gets the field visibility flag.
+ * @return the field visibility flag
+ */
+ public int getVisibility() {
+ return this.visibility;
+ }
+
+ /** Sets the field visibility flag. This flags can be one of
+ * <CODE>VISIBLE</CODE>, <CODE>HIDDEN</CODE>, <CODE>VISIBLE_BUT_DOES_NOT_PRINT</CODE>
+ * and <CODE>HIDDEN_BUT_PRINTABLE</CODE>.
+ * @param visibility field visibility flag
+ */
+ public void setVisibility(int visibility) {
+ this.visibility = visibility;
+ }
+
+ /** Gets the field name.
+ * @return the field name
+ */
+ public String getFieldName() {
+ return this.fieldName;
+ }
+
+ /** Sets the field name.
+ * @param fieldName the field name. If <CODE>null</CODE> only the widget keys
+ * will be included in the field allowing it to be used as a kid field.
+ */
+ public void setFieldName(String fieldName) {
+ this.fieldName = fieldName;
+ }
+
+ /** Gets the option flags.
+ * @return the option flags
+ */
+ public int getOptions() {
+ return this.options;
+ }
+
+ /** Sets the option flags. The option flags can be a combination by oring of
+ * <CODE>READ_ONLY</CODE>, <CODE>REQUIRED</CODE>,
+ * <CODE>MULTILINE</CODE>, <CODE>DO_NOT_SCROLL</CODE>,
+ * <CODE>PASSWORD</CODE>, <CODE>FILE_SELECTION</CODE>,
+ * <CODE>DO_NOT_SPELL_CHECK</CODE> and <CODE>EDIT</CODE>.
+ * @param options the option flags
+ */
+ public void setOptions(int options) {
+ this.options = options;
+ }
+
+ /** Gets the maximum length of the field’s text, in characters.
+ * @return the maximum length of the field’s text, in characters.
+ */
+ public int getMaxCharacterLength() {
+ return this.maxCharacterLength;
+ }
+
+ /** Sets the maximum length of the field’s text, in characters.
+ * It is only meaningful for text fields.
+ * @param maxCharacterLength the maximum length of the field’s text, in characters
+ */
+ public void setMaxCharacterLength(int maxCharacterLength) {
+ this.maxCharacterLength = maxCharacterLength;
+ }
+
+ /**
+ * Getter for property writer.
+ * @return Value of property writer.
+ */
+ public PdfWriter getWriter() {
+ return writer;
+ }
+
+ /**
+ * Setter for property writer.
+ * @param writer New value of property writer.
+ */
+ public void setWriter(PdfWriter writer) {
+ this.writer = writer;
+ }
+
+ /**
+ * Moves the field keys from <CODE>from</CODE> to <CODE>to</CODE>. The moved keys
+ * are removed from <CODE>from</CODE>.
+ * @param from the source
+ * @param to the destination. It may be <CODE>null</CODE>
+ */
+ public static void moveFields(PdfDictionary from, PdfDictionary to) {
+ for (Iterator i = from.getKeys().iterator(); i.hasNext();) {
+ PdfName key = (PdfName)i.next();
+ if (fieldKeys.containsKey(key)) {
+ if (to != null)
+ to.put(key, from.get(key));
+ i.remove();
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/pdf/BaseFont.java b/src/main/java/com/lowagie/text/pdf/BaseFont.java
new file mode 100644
index 0000000..a393e38
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/BaseFont.java
@@ -0,0 +1,1137 @@
+/*
+ * $Id: BaseFont.java,v 1.68 2006/02/23 16:45:48 psoares33 Exp $
+ * $Name: $
+ *
+ * Copyright 2000, 2001, 2002 by Paulo Soares.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf;
+import java.io.*;
+import com.lowagie.text.DocumentException;
+import java.util.HashMap;
+import java.util.ArrayList;
+import java.util.Iterator;
+
+/**
+ * Base class for the several font types supported
+ *
+ * @author Paulo Soares (psoares@consiste.pt)
+ */
+
+public abstract class BaseFont {
+
+ /** This is a possible value of a base 14 type 1 font */
+ public static final String COURIER = "Courier";
+
+ /** This is a possible value of a base 14 type 1 font */
+ public static final String COURIER_BOLD = "Courier-Bold";
+
+ /** This is a possible value of a base 14 type 1 font */
+ public static final String COURIER_OBLIQUE = "Courier-Oblique";
+
+ /** This is a possible value of a base 14 type 1 font */
+ public static final String COURIER_BOLDOBLIQUE = "Courier-BoldOblique";
+
+ /** This is a possible value of a base 14 type 1 font */
+ public static final String HELVETICA = "Helvetica";
+
+ /** This is a possible value of a base 14 type 1 font */
+ public static final String HELVETICA_BOLD = "Helvetica-Bold";
+
+ /** This is a possible value of a base 14 type 1 font */
+ public static final String HELVETICA_OBLIQUE = "Helvetica-Oblique";
+
+ /** This is a possible value of a base 14 type 1 font */
+ public static final String HELVETICA_BOLDOBLIQUE = "Helvetica-BoldOblique";
+
+ /** This is a possible value of a base 14 type 1 font */
+ public static final String SYMBOL = "Symbol";
+
+ /** This is a possible value of a base 14 type 1 font */
+ public static final String TIMES_ROMAN = "Times-Roman";
+
+ /** This is a possible value of a base 14 type 1 font */
+ public static final String TIMES_BOLD = "Times-Bold";
+
+ /** This is a possible value of a base 14 type 1 font */
+ public static final String TIMES_ITALIC = "Times-Italic";
+
+ /** This is a possible value of a base 14 type 1 font */
+ public static final String TIMES_BOLDITALIC = "Times-BoldItalic";
+
+ /** This is a possible value of a base 14 type 1 font */
+ public static final String ZAPFDINGBATS = "ZapfDingbats";
+
+ /** The maximum height above the baseline reached by glyphs in this
+ * font, excluding the height of glyphs for accented characters.
+ */
+ public static final int ASCENT = 1;
+ /** The y coordinate of the top of flat capital letters, measured from
+ * the baseline.
+ */
+ public static final int CAPHEIGHT = 2;
+ /** The maximum depth below the baseline reached by glyphs in this
+ * font. The value is a negative number.
+ */
+ public static final int DESCENT = 3;
+ /** The angle, expressed in degrees counterclockwise from the vertical,
+ * of the dominant vertical strokes of the font. The value is
+ * negative for fonts that slope to the right, as almost all italic fonts do.
+ */
+ public static final int ITALICANGLE = 4;
+ /** The lower left x glyph coordinate.
+ */
+ public static final int BBOXLLX = 5;
+ /** The lower left y glyph coordinate.
+ */
+ public static final int BBOXLLY = 6;
+ /** The upper right x glyph coordinate.
+ */
+ public static final int BBOXURX = 7;
+ /** The upper right y glyph coordinate.
+ */
+ public static final int BBOXURY = 8;
+
+ /** java.awt.Font property */
+ public static final int AWT_ASCENT = 9;
+ /** java.awt.Font property */
+ public static final int AWT_DESCENT = 10;
+ /** java.awt.Font property */
+ public static final int AWT_LEADING = 11;
+ /** java.awt.Font property */
+ public static final int AWT_MAXADVANCE = 12;
+
+ /** The font is Type 1.
+ */
+ public static final int FONT_TYPE_T1 = 0;
+ /** The font is True Type with a standard encoding.
+ */
+ public static final int FONT_TYPE_TT = 1;
+ /** The font is CJK.
+ */
+ public static final int FONT_TYPE_CJK = 2;
+ /** The font is True Type with a Unicode encoding.
+ */
+ public static final int FONT_TYPE_TTUNI = 3;
+ /** A font already inside the document.
+ */
+ public static final int FONT_TYPE_DOCUMENT = 4;
+ /** A Type3 font.
+ */
+ public static final int FONT_TYPE_T3 = 5;
+ /** The Unicode encoding with horizontal writing.
+ */
+ public static final String IDENTITY_H = "Identity-H";
+ /** The Unicode encoding with vertical writing.
+ */
+ public static final String IDENTITY_V = "Identity-V";
+
+ /** A possible encoding. */
+ public static final String CP1250 = "Cp1250";
+
+ /** A possible encoding. */
+ public static final String CP1252 = "Cp1252";
+
+ /** A possible encoding. */
+ public static final String CP1257 = "Cp1257";
+
+ /** A possible encoding. */
+ public static final String WINANSI = "Cp1252";
+
+ /** A possible encoding. */
+ public static final String MACROMAN = "MacRoman";
+
+ public static final int[] CHAR_RANGE_LATIN = {0, 0x17f, 0x2000, 0x206f, 0x20a0, 0x20cf, 0xfb00, 0xfb06};
+ public static final int[] CHAR_RANGE_ARABIC = {0, 0x7f, 0x0600, 0x067f, 0x20a0, 0x20cf, 0xfb50, 0xfbff, 0xfe70, 0xfeff};
+ public static final int[] CHAR_RANGE_HEBREW = {0, 0x7f, 0x0590, 0x05ff, 0x20a0, 0x20cf, 0xfb1d, 0xfb4f};
+ public static final int[] CHAR_RANGE_CYRILLIC = {0, 0x7f, 0x0400, 0x052f, 0x2000, 0x206f, 0x20a0, 0x20cf};
+
+/** if the font has to be embedded */
+ public static final boolean EMBEDDED = true;
+
+/** if the font doesn't have to be embedded */
+ public static final boolean NOT_EMBEDDED = false;
+/** if the font has to be cached */
+ public static final boolean CACHED = true;
+/** if the font doesn't have to be cached */
+ public static final boolean NOT_CACHED = false;
+
+ /** The path to the font resources. */
+ public static final String RESOURCE_PATH = "com/lowagie/text/pdf/fonts/";
+ /** The fake CID code that represents a newline. */
+ public static final char CID_NEWLINE = '\u7fff';
+
+ protected ArrayList subsetRanges;
+ /** The font type.
+ */
+ int fontType;
+/** a not defined character in a custom PDF encoding */
+ public static final String notdef = ".notdef";
+
+/** table of characters widths for this encoding */
+ protected int widths[] = new int[256];
+
+/** encoding names */
+ protected String differences[] = new String[256];
+/** same as differences but with the unicode codes */
+ protected char unicodeDifferences[] = new char[256];
+
+ protected int charBBoxes[][] = new int[256][];
+/** encoding used with this font */
+ protected String encoding;
+
+/** true if the font is to be embedded in the PDF */
+ protected boolean embedded;
+
+/**
+ * true if the font must use it's built in encoding. In that case the
+ * <CODE>encoding</CODE> is only used to map a char to the position inside
+ * the font, not to the expected char name.
+ */
+ protected boolean fontSpecific = true;
+
+/** cache for the fonts already used. */
+ protected static HashMap fontCache = new HashMap();
+
+/** list of the 14 built in fonts. */
+ protected static final HashMap BuiltinFonts14 = new HashMap();
+
+ /** Forces the output of the width array. Only matters for the 14
+ * built-in fonts.
+ */
+ protected boolean forceWidthsOutput = false;
+
+ /** Converts <CODE>char</CODE> directly to <CODE>byte</CODE>
+ * by casting.
+ */
+ protected boolean directTextToByte = false;
+
+ /** Indicates if all the glyphs and widths for that particular
+ * encoding should be included in the document.
+ */
+ protected boolean subset = true;
+
+ protected boolean fastWinansi = false;
+
+ static {
+ BuiltinFonts14.put(COURIER, PdfName.COURIER);
+ BuiltinFonts14.put(COURIER_BOLD, PdfName.COURIER_BOLD);
+ BuiltinFonts14.put(COURIER_BOLDOBLIQUE, PdfName.COURIER_BOLDOBLIQUE);
+ BuiltinFonts14.put(COURIER_OBLIQUE, PdfName.COURIER_OBLIQUE);
+ BuiltinFonts14.put(HELVETICA, PdfName.HELVETICA);
+ BuiltinFonts14.put(HELVETICA_BOLD, PdfName.HELVETICA_BOLD);
+ BuiltinFonts14.put(HELVETICA_BOLDOBLIQUE, PdfName.HELVETICA_BOLDOBLIQUE);
+ BuiltinFonts14.put(HELVETICA_OBLIQUE, PdfName.HELVETICA_OBLIQUE);
+ BuiltinFonts14.put(SYMBOL, PdfName.SYMBOL);
+ BuiltinFonts14.put(TIMES_ROMAN, PdfName.TIMES_ROMAN);
+ BuiltinFonts14.put(TIMES_BOLD, PdfName.TIMES_BOLD);
+ BuiltinFonts14.put(TIMES_BOLDITALIC, PdfName.TIMES_BOLDITALIC);
+ BuiltinFonts14.put(TIMES_ITALIC, PdfName.TIMES_ITALIC);
+ BuiltinFonts14.put(ZAPFDINGBATS, PdfName.ZAPFDINGBATS);
+ }
+
+ /** Generates the PDF stream with the Type1 and Truetype fonts returning
+ * a PdfStream.
+ */
+ static class StreamFont extends PdfStream {
+
+ /** Generates the PDF stream with the Type1 and Truetype fonts returning
+ * a PdfStream.
+ * @param contents the content of the stream
+ * @param lengths an array of int that describes the several lengths of each part of the font
+ * @throws DocumentException error in the stream compression
+ */
+ public StreamFont(byte contents[], int lengths[]) throws DocumentException {
+ try {
+ bytes = contents;
+ put(PdfName.LENGTH, new PdfNumber(bytes.length));
+ for (int k = 0; k < lengths.length; ++k) {
+ put(new PdfName("Length" + (k + 1)), new PdfNumber(lengths[k]));
+ }
+ flateCompress();
+ }
+ catch (Exception e) {
+ throw new DocumentException(e);
+ }
+ }
+
+ /**
+ * Generates the PDF stream for a font.
+ * @param contents the content of a stream
+ * @param subType the subtype of the font.
+ * @throws DocumentException
+ */
+ public StreamFont(byte contents[], String subType) throws DocumentException {
+ try {
+ bytes = contents;
+ put(PdfName.LENGTH, new PdfNumber(bytes.length));
+ if (subType != null)
+ put(PdfName.SUBTYPE, new PdfName(subType));
+ flateCompress();
+ }
+ catch (Exception e) {
+ throw new DocumentException(e);
+ }
+ }
+ }
+
+ /**
+ *Creates new BaseFont
+ */
+ protected BaseFont() {
+ }
+
+ /** Creates a new font. This font can be one of the 14 built in types,
+ * a Type1 font referred by an AFM file, a TrueType font (simple or collection) or a CJK font from the
+ * Adobe Asian Font Pack. TrueType fonts and CJK fonts can have an optional style modifier
+ * appended to the name. These modifiers are: Bold, Italic and BoldItalic. An
+ * example would be "STSong-Light,Bold". Note that this modifiers do not work if
+ * the font is embedded. Fonts in TrueType collections are addressed by index such as "msgothic.ttc,1".
+ * This would get the second font (indexes start at 0), in this case "MS PGothic".
+ * <P>
+ * The fonts are cached and if they already exist they are extracted from the cache,
+ * not parsed again.
+ * <P>
+ * This method calls:<br>
+ * <PRE>
+ * createFont(name, encoding, embedded, true, null, null);
+ * </PRE>
+ * @param name the name of the font or it's location on file
+ * @param encoding the encoding to be applied to this font
+ * @param embedded true if the font is to be embedded in the PDF
+ * @return returns a new font. This font may come from the cache
+ * @throws DocumentException the font is invalid
+ * @throws IOException the font file could not be read
+ */
+ public static BaseFont createFont(String name, String encoding, boolean embedded) throws DocumentException, IOException {
+ return createFont(name, encoding, embedded, true, null, null);
+ }
+
+ /** Creates a new font. This font can be one of the 14 built in types,
+ * a Type1 font referred by an AFM file, a TrueType font (simple or collection) or a CJK font from the
+ * Adobe Asian Font Pack. TrueType fonts and CJK fonts can have an optional style modifier
+ * appended to the name. These modifiers are: Bold, Italic and BoldItalic. An
+ * example would be "STSong-Light,Bold". Note that this modifiers do not work if
+ * the font is embedded. Fonts in TrueType collections are addressed by index such as "msgothic.ttc,1".
+ * This would get the second font (indexes start at 0), in this case "MS PGothic".
+ * <P>
+ * The fonts may or may not be cached depending on the flag <CODE>cached</CODE>.
+ * If the <CODE>byte</CODE> arrays are present the font will be
+ * read from them instead of the name. The name is still required to identify
+ * the font type.
+ * @param name the name of the font or it's location on file
+ * @param encoding the encoding to be applied to this font
+ * @param embedded true if the font is to be embedded in the PDF
+ * @param cached true if the font comes from the cache or is added to
+ * the cache if new, false if the font is always created new
+ * @param ttfAfm the true type font or the afm in a byte array
+ * @param pfb the pfb in a byte array
+ * @return returns a new font. This font may come from the cache but only if cached
+ * is true, otherwise it will always be created new
+ * @throws DocumentException the font is invalid
+ * @throws IOException the font file could not be read
+ */
+ public static BaseFont createFont(String name, String encoding, boolean embedded, boolean cached, byte ttfAfm[], byte pfb[]) throws DocumentException, IOException {
+ String nameBase = getBaseName(name);
+ encoding = normalizeEncoding(encoding);
+ boolean isBuiltinFonts14 = BuiltinFonts14.containsKey(name);
+ boolean isCJKFont = isBuiltinFonts14 ? false : CJKFont.isCJKFont(nameBase, encoding);
+ if (isBuiltinFonts14 || isCJKFont)
+ embedded = false;
+ else if (encoding.equals(IDENTITY_H) || encoding.equals(IDENTITY_V))
+ embedded = true;
+ BaseFont fontFound = null;
+ BaseFont fontBuilt = null;
+ String key = name + "\n" + encoding + "\n" + embedded;
+ if (cached) {
+ synchronized (fontCache) {
+ fontFound = (BaseFont)fontCache.get(key);
+ }
+ if (fontFound != null)
+ return fontFound;
+ }
+ if (isBuiltinFonts14 || name.toLowerCase().endsWith(".afm") || name.toLowerCase().endsWith(".pfm")) {
+ fontBuilt = new Type1Font(name, encoding, embedded, ttfAfm, pfb);
+ fontBuilt.fastWinansi = encoding.equals(CP1252);
+ }
+ else if (nameBase.toLowerCase().endsWith(".ttf") || nameBase.toLowerCase().endsWith(".otf") || nameBase.toLowerCase().indexOf(".ttc,") > 0) {
+ if (encoding.equals(IDENTITY_H) || encoding.equals(IDENTITY_V))
+ fontBuilt = new TrueTypeFontUnicode(name, encoding, embedded, ttfAfm);
+ else {
+ fontBuilt = new TrueTypeFont(name, encoding, embedded, ttfAfm);
+ fontBuilt.fastWinansi = encoding.equals(CP1252);
+ }
+ }
+ else if (isCJKFont)
+ fontBuilt = new CJKFont(name, encoding, embedded);
+ else
+ throw new DocumentException("Font '" + name + "' with '" + encoding + "' is not recognized.");
+ if (cached) {
+ synchronized (fontCache) {
+ fontFound = (BaseFont)fontCache.get(key);
+ if (fontFound != null)
+ return fontFound;
+ fontCache.put(key, fontBuilt);
+ }
+ }
+ return fontBuilt;
+ }
+
+ /**
+ * Creates a font based on an existing document font. The created font font may not
+ * behave as expected, depending on the encoding or subset.
+ * @param fontRef the reference to the document font
+ * @return the font
+ */
+ public static BaseFont createFont(PRIndirectReference fontRef) {
+ return new DocumentFont(fontRef);
+ }
+
+ /**
+ * Gets the name without the modifiers Bold, Italic or BoldItalic.
+ * @param name the full name of the font
+ * @return the name without the modifiers Bold, Italic or BoldItalic
+ */
+ protected static String getBaseName(String name) {
+ if (name.endsWith(",Bold"))
+ return name.substring(0, name.length() - 5);
+ else if (name.endsWith(",Italic"))
+ return name.substring(0, name.length() - 7);
+ else if (name.endsWith(",BoldItalic"))
+ return name.substring(0, name.length() - 11);
+ else
+ return name;
+ }
+
+ /**
+ * Normalize the encoding names. "winansi" is changed to "Cp1252" and
+ * "macroman" is changed to "MacRoman".
+ * @param enc the encoding to be normalized
+ * @return the normalized encoding
+ */
+ protected static String normalizeEncoding(String enc) {
+ if (enc.equals("winansi") || enc.equals(""))
+ return CP1252;
+ else if (enc.equals("macroman"))
+ return MACROMAN;
+ else
+ return enc;
+ }
+
+ /**
+ * Creates the <CODE>widths</CODE> and the <CODE>differences</CODE> arrays
+ */
+ protected void createEncoding() {
+ if (fontSpecific) {
+ for (int k = 0; k < 256; ++k) {
+ widths[k] = getRawWidth(k, null);
+ charBBoxes[k] = getRawCharBBox(k, null);
+ }
+ }
+ else {
+ String s;
+ String name;
+ char c;
+ byte b[] = new byte[1];
+ for (int k = 0; k < 256; ++k) {
+ b[0] = (byte)k;
+ s = PdfEncodings.convertToString(b, encoding);
+ if (s.length() > 0) {
+ c = s.charAt(0);
+ }
+ else {
+ c = '?';
+ }
+ name = GlyphList.unicodeToName((int)c);
+ if (name == null)
+ name = notdef;
+ differences[k] = name;
+ unicodeDifferences[k] = c;
+ widths[k] = getRawWidth((int)c, name);
+ charBBoxes[k] = getRawCharBBox((int)c, name);
+ }
+ }
+ }
+
+ /**
+ * Gets the width from the font according to the Unicode char <CODE>c</CODE>
+ * or the <CODE>name</CODE>. If the <CODE>name</CODE> is null it's a symbolic font.
+ * @param c the unicode char
+ * @param name the glyph name
+ * @return the width of the char
+ */
+ abstract int getRawWidth(int c, String name);
+
+ /**
+ * Gets the kerning between two Unicode chars.
+ * @param char1 the first char
+ * @param char2 the second char
+ * @return the kerning to be applied in normalized 1000 units
+ */
+ public abstract int getKerning(char char1, char char2);
+
+ /**
+ * Sets the kerning between two Unicode chars.
+ * @param char1 the first char
+ * @param char2 the second char
+ * @param kern the kerning to apply in normalized 1000 units
+ * @return <code>true</code> if the kerning was applied, <code>false</code> otherwise
+ */
+ public abstract boolean setKerning(char char1, char char2, int kern);
+
+ /**
+ * Gets the width of a <CODE>char</CODE> in normalized 1000 units.
+ * @param char1 the unicode <CODE>char</CODE> to get the width of
+ * @return the width in normalized 1000 units
+ */
+ public int getWidth(char char1) {
+ if (fastWinansi) {
+ if (char1 < 128 || (char1 >= 160 && char1 <= 255))
+ return widths[char1];
+ return widths[PdfEncodings.winansi.get(char1)];
+ }
+ return getWidth(new String(new char[]{char1}));
+ }
+
+ /**
+ * Gets the width of a <CODE>String</CODE> in normalized 1000 units.
+ * @param text the <CODE>String</CODE> to get the witdth of
+ * @return the width in normalized 1000 units
+ */
+ public int getWidth(String text) {
+ int total = 0;
+ if (fastWinansi) {
+ int len = text.length();
+ for (int k = 0; k < len; ++k) {
+ char char1 = text.charAt(k);
+ if (char1 < 128 || (char1 >= 160 && char1 <= 255))
+ total += widths[char1];
+ else
+ total += widths[PdfEncodings.winansi.get(char1)];
+ }
+ return total;
+ }
+ else {
+ byte mbytes[] = convertToBytes(text);
+ for (int k = 0; k < mbytes.length; ++k)
+ total += widths[0xff & mbytes[k]];
+ }
+ return total;
+ }
+
+/**
+ * Gets the descent of a <CODE>String</CODE> in normalized 1000 units. The descent will always be
+ * less than or equal to zero even if all the characters have an higher descent.
+ * @param text the <CODE>String</CODE> to get the descent of
+ * @return the dexcent in normalized 1000 units
+ */
+ public int getDescent(String text) {
+ int min = 0;
+ char chars[] = text.toCharArray();
+ for (int k = 0; k < chars.length; ++k) {
+ int bbox[] = getCharBBox(chars[k]);
+ if (bbox != null && bbox[1] < min)
+ min = bbox[1];
+ }
+ return min;
+ }
+
+/**
+ * Gets the ascent of a <CODE>String</CODE> in normalized 1000 units. The ascent will always be
+ * greater than or equal to zero even if all the characters have a lower ascent.
+ * @param text the <CODE>String</CODE> to get the ascent of
+ * @return the ascent in normalized 1000 units
+ */
+ public int getAscent(String text) {
+ int max = 0;
+ char chars[] = text.toCharArray();
+ for (int k = 0; k < chars.length; ++k) {
+ int bbox[] = getCharBBox(chars[k]);
+ if (bbox != null && bbox[3] > max)
+ max = bbox[3];
+ }
+ return max;
+ }
+
+/**
+ * Gets the descent of a <CODE>String</CODE> in points. The descent will always be
+ * less than or equal to zero even if all the characters have an higher descent.
+ * @param text the <CODE>String</CODE> to get the descent of
+ * @param fontSize the size of the font
+ * @return the dexcent in points
+ */
+ public float getDescentPoint(String text, float fontSize)
+ {
+ return (float)getDescent(text) * 0.001f * fontSize;
+ }
+
+/**
+ * Gets the ascent of a <CODE>String</CODE> in points. The ascent will always be
+ * greater than or equal to zero even if all the characters have a lower ascent.
+ * @param text the <CODE>String</CODE> to get the ascent of
+ * @param fontSize the size of the font
+ * @return the ascent in points
+ */
+ public float getAscentPoint(String text, float fontSize)
+ {
+ return (float)getAscent(text) * 0.001f * fontSize;
+ }
+// ia>
+
+ /**
+ * Gets the width of a <CODE>String</CODE> in points taking kerning
+ * into account.
+ * @param text the <CODE>String</CODE> to get the witdth of
+ * @param fontSize the font size
+ * @return the width in points
+ */
+ public float getWidthPointKerned(String text, float fontSize) {
+ float size = (float)getWidth(text) * 0.001f * fontSize;
+ if (!hasKernPairs())
+ return size;
+ int len = text.length() - 1;
+ int kern = 0;
+ char c[] = text.toCharArray();
+ for (int k = 0; k < len; ++k) {
+ kern += getKerning(c[k], c[k + 1]);
+ }
+ return size + kern * 0.001f * fontSize;
+ }
+
+ /**
+ * Gets the width of a <CODE>String</CODE> in points.
+ * @param text the <CODE>String</CODE> to get the witdth of
+ * @param fontSize the font size
+ * @return the width in points
+ */
+ public float getWidthPoint(String text, float fontSize) {
+ return (float)getWidth(text) * 0.001f * fontSize;
+ }
+
+ /**
+ * Gets the width of a <CODE>char</CODE> in points.
+ * @param char1 the <CODE>char</CODE> to get the witdth of
+ * @param fontSize the font size
+ * @return the width in points
+ */
+ public float getWidthPoint(char char1, float fontSize) {
+ return getWidth(char1) * 0.001f * fontSize;
+ }
+
+ /**
+ * Converts a <CODE>String</CODE> to a </CODE>byte</CODE> array according
+ * to the font's encoding.
+ * @param text the <CODE>String</CODE> to be converted
+ * @return an array of <CODE>byte</CODE> representing the conversion according to the font's encoding
+ */
+ byte[] convertToBytes(String text) {
+ if (directTextToByte)
+ return PdfEncodings.convertToBytes(text, null);
+ return PdfEncodings.convertToBytes(text, encoding);
+ }
+
+ /** Outputs to the writer the font dictionaries and streams.
+ * @param writer the writer for this document
+ * @param ref the font indirect reference
+ * @param params several parameters that depend on the font type
+ * @throws IOException on error
+ * @throws DocumentException error in generating the object
+ */
+ abstract void writeFont(PdfWriter writer, PdfIndirectReference ref, Object params[]) throws DocumentException, IOException;
+
+ /** Gets the encoding used to convert <CODE>String</CODE> into <CODE>byte[]</CODE>.
+ * @return the encoding name
+ */
+ public String getEncoding() {
+ return encoding;
+ }
+
+ /** Gets the font parameter identified by <CODE>key</CODE>. Valid values
+ * for <CODE>key</CODE> are <CODE>ASCENT</CODE>, <CODE>AWT_ASCENT</CODE>, <CODE>CAPHEIGHT</CODE>,
+ * <CODE>DESCENT</CODE>, <CODE>AWT_DESCENT</CODE>,
+ * <CODE>ITALICANGLE</CODE>, <CODE>BBOXLLX</CODE>, <CODE>BBOXLLY</CODE>, <CODE>BBOXURX</CODE>
+ * and <CODE>BBOXURY</CODE>.
+ * @param key the parameter to be extracted
+ * @param fontSize the font size in points
+ * @return the parameter in points
+ */
+ public abstract float getFontDescriptor(int key, float fontSize);
+
+ /** Gets the font type. The font types can be: FONT_TYPE_T1,
+ * FONT_TYPE_TT, FONT_TYPE_CJK and FONT_TYPE_TTUNI.
+ * @return the font type
+ */
+ public int getFontType() {
+ return fontType;
+ }
+
+ /** Gets the embedded flag.
+ * @return <CODE>true</CODE> if the font is embedded.
+ */
+ public boolean isEmbedded() {
+ return embedded;
+ }
+
+ /** Gets the symbolic flag of the font.
+ * @return <CODE>true</CODE> if the font is symbolic
+ */
+ public boolean isFontSpecific() {
+ return fontSpecific;
+ }
+
+ /** Creates a unique subset prefix to be added to the font name when the font is embedded and subset.
+ * @return the subset prefix
+ */
+ public static String createSubsetPrefix() {
+ String s = "";
+ for (int k = 0; k < 6; ++k)
+ s += (char)(Math.random() * 26 + 'A');
+ return s + "+";
+ }
+
+ /** Gets the Unicode character corresponding to the byte output to the pdf stream.
+ * @param index the byte index
+ * @return the Unicode character
+ */
+ char getUnicodeDifferences(int index) {
+ return unicodeDifferences[index];
+ }
+
+ /** Gets the postscript font name.
+ * @return the postscript font name
+ */
+ public abstract String getPostscriptFontName();
+
+ /**
+ * Sets the font name that will appear in the pdf font dictionary.
+ * Use with care as it can easily make a font unreadable if not embedded.
+ * @param name the new font name
+ */
+ public abstract void setPostscriptFontName(String name);
+
+ /** Gets the full name of the font. If it is a True Type font
+ * each array element will have {Platform ID, Platform Encoding ID,
+ * Language ID, font name}. The interpretation of this values can be
+ * found in the Open Type specification, chapter 2, in the 'name' table.<br>
+ * For the other fonts the array has a single element with {"", "", "",
+ * font name}.
+ * @return the full name of the font
+ */
+ public abstract String[][] getFullFontName();
+
+ /** Gets the full name of the font. If it is a True Type font
+ * each array element will have {Platform ID, Platform Encoding ID,
+ * Language ID, font name}. The interpretation of this values can be
+ * found in the Open Type specification, chapter 2, in the 'name' table.<br>
+ * For the other fonts the array has a single element with {"", "", "",
+ * font name}.
+ * @param name the name of the font
+ * @param encoding the encoding of the font
+ * @param ttfAfm the true type font or the afm in a byte array
+ * @throws DocumentException on error
+ * @throws IOException on error
+ * @return the full name of the font
+ */
+ public static String[][] getFullFontName(String name, String encoding, byte ttfAfm[]) throws DocumentException, IOException {
+ String nameBase = getBaseName(name);
+ BaseFont fontBuilt = null;
+ if (nameBase.toLowerCase().endsWith(".ttf") || nameBase.toLowerCase().endsWith(".otf") || nameBase.toLowerCase().indexOf(".ttc,") > 0)
+ fontBuilt = new TrueTypeFont(name, CP1252, false, ttfAfm, true);
+ else
+ fontBuilt = createFont(name, encoding, false, false, ttfAfm, null);
+ return fontBuilt.getFullFontName();
+ }
+
+ /** Gets all the names from the font. Only the required tables are read.
+ * @param name the name of the font
+ * @param encoding the encoding of the font
+ * @param ttfAfm the true type font or the afm in a byte array
+ * @throws DocumentException on error
+ * @throws IOException on error
+ * @return an array of Object[] built with {getPostscriptFontName(), getFamilyFontName(), getFullFontName()}
+ */
+ public static Object[] getAllFontNames(String name, String encoding, byte ttfAfm[]) throws DocumentException, IOException {
+ String nameBase = getBaseName(name);
+ BaseFont fontBuilt = null;
+ if (nameBase.toLowerCase().endsWith(".ttf") || nameBase.toLowerCase().endsWith(".otf") || nameBase.toLowerCase().indexOf(".ttc,") > 0)
+ fontBuilt = new TrueTypeFont(name, CP1252, false, ttfAfm, true);
+ else
+ fontBuilt = createFont(name, encoding, false, false, ttfAfm, null);
+ return new Object[]{fontBuilt.getPostscriptFontName(), fontBuilt.getFamilyFontName(), fontBuilt.getFullFontName()};
+ }
+
+ /** Gets the family name of the font. If it is a True Type font
+ * each array element will have {Platform ID, Platform Encoding ID,
+ * Language ID, font name}. The interpretation of this values can be
+ * found in the Open Type specification, chapter 2, in the 'name' table.<br>
+ * For the other fonts the array has a single element with {"", "", "",
+ * font name}.
+ * @return the family name of the font
+ */
+ public abstract String[][] getFamilyFontName();
+
+ /** Gets the code pages supported by the font. This has only meaning
+ * with True Type fonts.
+ * @return the code pages supported by the font
+ */
+ public String[] getCodePagesSupported() {
+ return new String[0];
+ }
+
+ /** Enumerates the postscript font names present inside a
+ * True Type Collection.
+ * @param ttcFile the file name of the font
+ * @throws DocumentException on error
+ * @throws IOException on error
+ * @return the postscript font names
+ */
+ public static String[] enumerateTTCNames(String ttcFile) throws DocumentException, IOException {
+ return new EnumerateTTC(ttcFile).getNames();
+ }
+
+ /** Enumerates the postscript font names present inside a
+ * True Type Collection.
+ * @param ttcArray the font as a <CODE>byte</CODE> array
+ * @throws DocumentException on error
+ * @throws IOException on error
+ * @return the postscript font names
+ */
+ public static String[] enumerateTTCNames(byte ttcArray[]) throws DocumentException, IOException {
+ return new EnumerateTTC(ttcArray).getNames();
+ }
+
+ /** Gets the font width array.
+ * @return the font width array
+ */
+ public int[] getWidths() {
+ return widths;
+ }
+
+ /** Gets the array with the names of the characters.
+ * @return the array with the names of the characters
+ */
+ public String[] getDifferences() {
+ return differences;
+ }
+
+ /** Gets the array with the unicode characters.
+ * @return the array with the unicode characters
+ */
+ public char[] getUnicodeDifferences() {
+ return unicodeDifferences;
+ }
+
+ /** Gets the state of the property.
+ * @return value of property forceWidthsOutput
+ */
+ public boolean isForceWidthsOutput() {
+ return forceWidthsOutput;
+ }
+
+ /** Set to <CODE>true</CODE> to force the generation of the
+ * widths array.
+ * @param forceWidthsOutput <CODE>true</CODE> to force the generation of the
+ * widths array
+ */
+ public void setForceWidthsOutput(boolean forceWidthsOutput) {
+ this.forceWidthsOutput = forceWidthsOutput;
+ }
+
+ /** Gets the direct conversion of <CODE>char</CODE> to <CODE>byte</CODE>.
+ * @return value of property directTextToByte.
+ * @see #setDirectTextToByte(boolean directTextToByte)
+ */
+ public boolean isDirectTextToByte() {
+ return directTextToByte;
+ }
+
+ /** Sets the conversion of <CODE>char</CODE> directly to <CODE>byte</CODE>
+ * by casting. This is a low level feature to put the bytes directly in
+ * the content stream without passing through String.getBytes().
+ * @param directTextToByte New value of property directTextToByte.
+ */
+ public void setDirectTextToByte(boolean directTextToByte) {
+ this.directTextToByte = directTextToByte;
+ }
+
+ /** Indicates if all the glyphs and widths for that particular
+ * encoding should be included in the document.
+ * @return <CODE>false</CODE> to include all the glyphs and widths.
+ */
+ public boolean isSubset() {
+ return subset;
+ }
+
+ /** Indicates if all the glyphs and widths for that particular
+ * encoding should be included in the document. When set to <CODE>true</CODE>
+ * only the glyphs used will be included in the font. When set to <CODE>false</CODE>
+ * and {@link #addSubsetRange(int[])} was not called the full font will be included
+ * otherwise just the characters ranges will be included.
+ * @param subset new value of property subset
+ */
+ public void setSubset(boolean subset) {
+ this.subset = subset;
+ }
+
+ /** Gets the font resources.
+ * @param key the full name of the resource
+ * @return the <CODE>InputStream</CODE> to get the resource or
+ * <CODE>null</CODE> if not found
+ */
+ public static InputStream getResourceStream(String key) {
+ return getResourceStream(key, null);
+ }
+
+ /** Gets the font resources.
+ * @param key the full name of the resource
+ * @param loader the ClassLoader to load the resource or null to try the ones available
+ * @return the <CODE>InputStream</CODE> to get the resource or
+ * <CODE>null</CODE> if not found
+ */
+ public static InputStream getResourceStream(String key, ClassLoader loader) {
+ if (key.startsWith("/"))
+ key = key.substring(1);
+ InputStream is = null;
+ if (loader != null) {
+ is = loader.getResourceAsStream(key);
+ if (is != null)
+ return is;
+ }
+ // Try to use Context Class Loader to load the properties file.
+ try {
+ java.lang.reflect.Method getCCL =
+ Thread.class.getMethod("getContextClassLoader", new Class[0]);
+ if (getCCL != null) {
+ ClassLoader contextClassLoader =
+ (ClassLoader)getCCL.invoke(Thread.currentThread(),
+ new Object[0]);
+ if (contextClassLoader != null)
+ is = contextClassLoader.getResourceAsStream(key);
+ }
+ } catch (Throwable e) {}
+
+ if (is == null) {
+ is = BaseFont.class.getResourceAsStream("/" + key);
+ }
+ if (is == null) {
+ is = ClassLoader.getSystemResourceAsStream(key);
+ }
+ return is;
+ }
+
+ /** Gets the Unicode equivalent to a CID.
+ * The (inexistent) CID <FF00> is translated as '\n'.
+ * It has only meaning with CJK fonts with Identity encoding.
+ * @param c the CID code
+ * @return the Unicode equivalent
+ */
+ public char getUnicodeEquivalent(char c) {
+ return c;
+ }
+
+ /** Gets the CID code given an Unicode.
+ * It has only meaning with CJK fonts.
+ * @param c the Unicode
+ * @return the CID equivalent
+ */
+ public char getCidCode(char c) {
+ return c;
+ }
+
+ /** Checks if the font has any kerning pairs.
+ * @return <CODE>true</CODE> if the font has any kerning pairs
+ */
+ public abstract boolean hasKernPairs();
+
+ /**
+ * Checks if a character exists in this font.
+ * @param c the character to check
+ * @return <CODE>true</CODE> if the character has a glyph,
+ * <CODE>false</CODE> otherwise
+ */
+ public boolean charExists(char c) {
+ byte b[] = convertToBytes(new String(new char[]{c}));
+ return b.length > 0;
+ }
+
+ /**
+ * Sets the character advance.
+ * @param c the character
+ * @param advance the character advance normalized to 1000 units
+ * @return <CODE>true</CODE> if the advance was set,
+ * <CODE>false</CODE> otherwise
+ */
+ public boolean setCharAdvance(char c, int advance) {
+ byte b[] = convertToBytes(new String(new char[]{c}));
+ if (b.length == 0)
+ return false;
+ widths[0xff & b[0]] = advance;
+ return true;
+ }
+
+ private static void addFont(PRIndirectReference fontRef, IntHashtable hits, ArrayList fonts) {
+ PdfObject obj = PdfReader.getPdfObject(fontRef);
+ if (!obj.isDictionary())
+ return;
+ PdfDictionary font = (PdfDictionary)obj;
+ PdfName subtype = (PdfName)PdfReader.getPdfObject(font.get(PdfName.SUBTYPE));
+ if (!PdfName.TYPE1.equals(subtype) && !PdfName.TRUETYPE.equals(subtype))
+ return;
+ PdfName name = (PdfName)PdfReader.getPdfObject(font.get(PdfName.BASEFONT));
+ fonts.add(new Object[]{PdfName.decodeName(name.toString()), fontRef});
+ hits.put(fontRef.getNumber(), 1);
+ }
+
+ private static void recourseFonts(PdfDictionary page, IntHashtable hits, ArrayList fonts, int level) {
+ ++level;
+ if (level > 50) // in case we have an endless loop
+ return;
+ PdfDictionary resources = (PdfDictionary)PdfReader.getPdfObject(page.get(PdfName.RESOURCES));
+ if (resources == null)
+ return;
+ PdfDictionary font = (PdfDictionary)PdfReader.getPdfObject(resources.get(PdfName.FONT));
+ if (font != null) {
+ for (Iterator it = font.getKeys().iterator(); it.hasNext();) {
+ PdfObject ft = font.get((PdfName)it.next());
+ if (ft == null || !ft.isIndirect())
+ continue;
+ int hit = ((PRIndirectReference)ft).getNumber();
+ if (hits.containsKey(hit))
+ continue;
+ addFont((PRIndirectReference)ft, hits, fonts);
+ }
+ }
+ PdfDictionary xobj = (PdfDictionary)PdfReader.getPdfObject(resources.get(PdfName.XOBJECT));
+ if (xobj != null) {
+ for (Iterator it = xobj.getKeys().iterator(); it.hasNext();) {
+ recourseFonts((PdfDictionary)PdfReader.getPdfObject(xobj.get((PdfName)it.next())), hits, fonts, level);
+ }
+ }
+ }
+
+ /**
+ * Gets a list of all document fonts. Each element of the <CODE>ArrayList</CODE>
+ * contains a <CODE>Object[]{String,PRIndirectReference}</CODE> with the font name
+ * and the indirect reference to it.
+ * @param reader the document where the fonts are to be listed from
+ * @return the list of fonts and references
+ */
+ public static ArrayList getDocumentFonts(PdfReader reader) {
+ IntHashtable hits = new IntHashtable();
+ ArrayList fonts = new ArrayList();
+ int npages = reader.getNumberOfPages();
+ for (int k = 1; k <= npages; ++k)
+ recourseFonts(reader.getPageN(k), hits, fonts, 1);
+ return fonts;
+ }
+
+ /**
+ * Gets a list of the document fonts in a particular page. Each element of the <CODE>ArrayList</CODE>
+ * contains a <CODE>Object[]{String,PRIndirectReference}</CODE> with the font name
+ * and the indirect reference to it.
+ * @param reader the document where the fonts are to be listed from
+ * @param page the page to list the fonts from
+ * @return the list of fonts and references
+ */
+ public static ArrayList getDocumentFonts(PdfReader reader, int page) {
+ IntHashtable hits = new IntHashtable();
+ ArrayList fonts = new ArrayList();
+ recourseFonts(reader.getPageN(page), hits, fonts, 1);
+ return fonts;
+ }
+
+ /**
+ * Gets the smallest box enclosing the character contours. It will return
+ * <CODE>null</CODE> if the font has not the information or the character has no
+ * contours, as in the case of the space, for example. Characters with no contours may
+ * also return [0,0,0,0].
+ * @param c the character to get the contour bounding box from
+ * @return an array of four floats with the bounding box in the format [llx,lly,urx,ury] or
+ * <code>null</code>
+ */
+ public int[] getCharBBox(char c) {
+ byte b[] = convertToBytes(new String(new char[]{c}));
+ if (b.length == 0)
+ return null;
+ else
+ return charBBoxes[b[0] & 0xff];
+ }
+
+ protected abstract int[] getRawCharBBox(int c, String name);
+
+ /**
+ * iText expects Arabic Diactrics (tashkeel) to have zero advance but some fonts,
+ * most notably those that come with Windows, like times.ttf, have non-zero
+ * advance for those characters. This method makes those character to have zero
+ * width advance and work correctly in the iText Arabic shaping and reordering
+ * context.
+ */
+ public void correctArabicAdvance() {
+ for (char c = '\u064b'; c <= '\u0658'; ++c)
+ setCharAdvance(c, 0);
+ setCharAdvance('\u0670', 0);
+ for (char c = '\u06d6'; c <= '\u06dc'; ++c)
+ setCharAdvance(c, 0);
+ for (char c = '\u06df'; c <= '\u06e4'; ++c)
+ setCharAdvance(c, 0);
+ for (char c = '\u06e7'; c <= '\u06e8'; ++c)
+ setCharAdvance(c, 0);
+ for (char c = '\u06ea'; c <= '\u06ed'; ++c)
+ setCharAdvance(c, 0);
+ }
+
+ /**
+ * Adds a character range when subsetting. The range is an <CODE>int</CODE> array
+ * where the first element is the start range inclusive and the second element is the
+ * end range inclusive. Several ranges are allowed in the same array.
+ * @param range the character range
+ */
+ public void addSubsetRange(int[] range) {
+ if (subsetRanges == null)
+ subsetRanges = new ArrayList();
+ subsetRanges.add(range);
+ }
+}
diff --git a/src/main/java/com/lowagie/text/pdf/BidiLine.java b/src/main/java/com/lowagie/text/pdf/BidiLine.java
new file mode 100644
index 0000000..54dd32e
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/BidiLine.java
@@ -0,0 +1,915 @@
+/*
+ *
+ * Copyright 2002 Paulo Soares
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf;
+
+import java.util.ArrayList;
+
+import com.lowagie.text.Chunk;
+
+/** Does all the line bidirectional processing with PdfChunk assembly.
+ *
+ * @author Paulo Soares (psoares@consiste.pt)
+ */
+public class BidiLine {
+
+ protected int runDirection;
+ protected int pieceSize = 2048;
+ protected char text[] = new char[pieceSize];
+ protected PdfChunk detailChunks[] = new PdfChunk[pieceSize];
+ protected int totalTextLength = 0;
+
+ protected byte orderLevels[] = new byte[pieceSize];
+ protected int indexChars[] = new int[pieceSize];
+
+ protected ArrayList chunks = new ArrayList();
+ protected int indexChunk = 0;
+ protected int indexChunkChar = 0;
+ protected int currentChar = 0;
+
+ protected int storedRunDirection;
+ protected char storedText[] = new char[0];
+ protected PdfChunk storedDetailChunks[] = new PdfChunk[0];
+ protected int storedTotalTextLength = 0;
+
+ protected byte storedOrderLevels[] = new byte[0];
+ protected int storedIndexChars[] = new int[0];
+
+ protected int storedIndexChunk = 0;
+ protected int storedIndexChunkChar = 0;
+ protected int storedCurrentChar = 0;
+
+ protected boolean shortStore;
+// protected ArabicShaping arabic = new ArabicShaping(ArabicShaping.LETTERS_SHAPE | ArabicShaping.LENGTH_GROW_SHRINK | ArabicShaping.TEXT_DIRECTION_LOGICAL);
+ protected static final IntHashtable mirrorChars = new IntHashtable();
+ protected int arabicOptions;
+
+ /** Creates new BidiLine */
+ public BidiLine() {
+ }
+
+ public BidiLine(BidiLine org) {
+ runDirection = org.runDirection;
+ pieceSize = org.pieceSize;
+ text = (char[])org.text.clone();
+ detailChunks = (PdfChunk[])org.detailChunks.clone();
+ totalTextLength = org.totalTextLength;
+
+ orderLevels = (byte[])org.orderLevels.clone();
+ indexChars = (int[])org.indexChars.clone();
+
+ chunks = new ArrayList(org.chunks);
+ indexChunk = org.indexChunk;
+ indexChunkChar = org.indexChunkChar;
+ currentChar = org.currentChar;
+
+ storedRunDirection = org.storedRunDirection;
+ storedText = (char[])org.storedText.clone();
+ storedDetailChunks = (PdfChunk[])org.storedDetailChunks.clone();
+ storedTotalTextLength = org.storedTotalTextLength;
+
+ storedOrderLevels = (byte[])org.storedOrderLevels.clone();
+ storedIndexChars = (int[])org.storedIndexChars.clone();
+
+ storedIndexChunk = org.storedIndexChunk;
+ storedIndexChunkChar = org.storedIndexChunkChar;
+ storedCurrentChar = org.storedCurrentChar;
+
+ shortStore = org.shortStore;
+ arabicOptions = org.arabicOptions;
+ }
+
+ public boolean isEmpty() {
+ return (currentChar >= totalTextLength && indexChunk >= chunks.size());
+ }
+
+ public void clearChunks() {
+ chunks.clear();
+ totalTextLength = 0;
+ currentChar = 0;
+ }
+
+ public boolean getParagraph(int runDirection) {
+ this.runDirection = runDirection;
+ currentChar = 0;
+ totalTextLength = 0;
+ boolean hasText = false;
+ char c;
+ char uniC;
+ BaseFont bf;
+ for (; indexChunk < chunks.size(); ++indexChunk) {
+ PdfChunk ck = (PdfChunk)chunks.get(indexChunk);
+ bf = ck.font().getFont();
+ String s = ck.toString();
+ int len = s.length();
+ for (; indexChunkChar < len; ++indexChunkChar) {
+ c = s.charAt(indexChunkChar);
+ uniC = bf.getUnicodeEquivalent(c);
+ if (uniC == '\r' || uniC == '\n') {
+ // next condition is never true for CID
+ if (uniC == '\r' && indexChunkChar + 1 < len && s.charAt(indexChunkChar + 1) == '\n')
+ ++indexChunkChar;
+ ++indexChunkChar;
+ if (indexChunkChar >= len) {
+ indexChunkChar = 0;
+ ++indexChunk;
+ }
+ hasText = true;
+ if (totalTextLength == 0)
+ detailChunks[0] = ck;
+ break;
+ }
+ addPiece(c, ck);
+ }
+ if (hasText)
+ break;
+ indexChunkChar = 0;
+ }
+ if (totalTextLength == 0)
+ return hasText;
+
+ // remove trailing WS
+ totalTextLength = trimRight(0, totalTextLength - 1) + 1;
+ if (totalTextLength == 0)
+ return true;
+
+ if (runDirection == PdfWriter.RUN_DIRECTION_LTR || runDirection == PdfWriter.RUN_DIRECTION_RTL) {
+ if (orderLevels.length < totalTextLength) {
+ orderLevels = new byte[pieceSize];
+ indexChars = new int[pieceSize];
+ }
+ ArabicLigaturizer.processNumbers(text, 0, totalTextLength, arabicOptions);
+ BidiOrder order = new BidiOrder(text, 0, totalTextLength, (byte)(runDirection == PdfWriter.RUN_DIRECTION_RTL ? 1 : 0));
+ byte od[] = order.getLevels();
+ for (int k = 0; k < totalTextLength; ++k) {
+ orderLevels[k] = od[k];
+ indexChars[k] = k;
+ }
+ doArabicShapping();
+ mirrorGlyphs();
+ }
+ totalTextLength = trimRightEx(0, totalTextLength - 1) + 1;
+ return true;
+ }
+
+ public void addChunk(PdfChunk chunk) {
+ chunks.add(chunk);
+ }
+
+ public void addChunks(ArrayList chunks) {
+ this.chunks.addAll(chunks);
+ }
+
+ public void addPiece(char c, PdfChunk chunk) {
+ if (totalTextLength >= pieceSize) {
+ char tempText[] = text;
+ PdfChunk tempDetailChunks[] = detailChunks;
+ pieceSize *= 2;
+ text = new char[pieceSize];
+ detailChunks = new PdfChunk[pieceSize];
+ System.arraycopy(tempText, 0, text, 0, totalTextLength);
+ System.arraycopy(tempDetailChunks, 0, detailChunks, 0, totalTextLength);
+ }
+ text[totalTextLength] = c;
+ detailChunks[totalTextLength++] = chunk;
+ }
+
+ public void save() {
+ if (indexChunk > 0) {
+ if (indexChunk >= chunks.size())
+ chunks.clear();
+ else {
+ for (--indexChunk; indexChunk >= 0; --indexChunk)
+ chunks.remove(indexChunk);
+ }
+ indexChunk = 0;
+ }
+ storedRunDirection = runDirection;
+ storedTotalTextLength = totalTextLength;
+ storedIndexChunk = indexChunk;
+ storedIndexChunkChar = indexChunkChar;
+ storedCurrentChar = currentChar;
+ shortStore = (currentChar < totalTextLength);
+ if (!shortStore) {
+ // long save
+ if (storedText.length < totalTextLength) {
+ storedText = new char[totalTextLength];
+ storedDetailChunks = new PdfChunk[totalTextLength];
+ }
+ System.arraycopy(text, 0, storedText, 0, totalTextLength);
+ System.arraycopy(detailChunks, 0, storedDetailChunks, 0, totalTextLength);
+ }
+ if (runDirection == PdfWriter.RUN_DIRECTION_LTR || runDirection == PdfWriter.RUN_DIRECTION_RTL) {
+ if (storedOrderLevels.length < totalTextLength) {
+ storedOrderLevels = new byte[totalTextLength];
+ storedIndexChars = new int[totalTextLength];
+ }
+ System.arraycopy(orderLevels, currentChar, storedOrderLevels, currentChar, totalTextLength - currentChar);
+ System.arraycopy(indexChars, currentChar, storedIndexChars, currentChar, totalTextLength - currentChar);
+ }
+ }
+
+ public void restore() {
+ runDirection = storedRunDirection;
+ totalTextLength = storedTotalTextLength;
+ indexChunk = storedIndexChunk;
+ indexChunkChar = storedIndexChunkChar;
+ currentChar = storedCurrentChar;
+ if (!shortStore) {
+ // long restore
+ System.arraycopy(storedText, 0, text, 0, totalTextLength);
+ System.arraycopy(storedDetailChunks, 0, detailChunks, 0, totalTextLength);
+ }
+ if (runDirection == PdfWriter.RUN_DIRECTION_LTR || runDirection == PdfWriter.RUN_DIRECTION_RTL) {
+ System.arraycopy(storedOrderLevels, currentChar, orderLevels, currentChar, totalTextLength - currentChar);
+ System.arraycopy(storedIndexChars, currentChar, indexChars, currentChar, totalTextLength - currentChar);
+ }
+ }
+
+ public void mirrorGlyphs() {
+ for (int k = 0; k < totalTextLength; ++k) {
+ if ((orderLevels[k] & 1) == 1) {
+ int mirror = mirrorChars.get(text[k]);
+ if (mirror != 0)
+ text[k] = (char)mirror;
+ }
+ }
+ }
+
+ public void doArabicShapping() {
+ int src = 0;
+ int dest = 0;
+ for (;;) {
+ while (src < totalTextLength) {
+ char c = text[src];
+ if (c >= 0x0600 && c <= 0x06ff)
+ break;
+ if (src != dest) {
+ text[dest] = text[src];
+ detailChunks[dest] = detailChunks[src];
+ orderLevels[dest] = orderLevels[src];
+ }
+ ++src;
+ ++dest;
+ }
+ if (src >= totalTextLength) {
+ totalTextLength = dest;
+ return;
+ }
+ int startArabicIdx = src;
+ ++src;
+ while (src < totalTextLength) {
+ char c = text[src];
+ if (c < 0x0600 || c > 0x06ff)
+ break;
+ ++src;
+ }
+ int arabicWordSize = src - startArabicIdx;
+ int size = ArabicLigaturizer.arabic_shape(text, startArabicIdx, arabicWordSize, text, dest, arabicWordSize, arabicOptions /*PangoArabicShapping.ar_novowel PangoArabicShapping.ar_lig | PangoArabicShapping.ar_composedtashkeel*/);
+ if (startArabicIdx != dest) {
+ for (int k = 0; k < size; ++k) {
+ detailChunks[dest] = detailChunks[startArabicIdx];
+ orderLevels[dest++] = orderLevels[startArabicIdx++];
+ }
+ }
+ else
+ dest += size;
+ }
+ }
+
+ public PdfLine processLine(float width, int alignment, int runDirection, int arabicOptions) {
+ this.arabicOptions = arabicOptions;
+ save();
+ boolean isRTL = (runDirection == PdfWriter.RUN_DIRECTION_RTL);
+ if (currentChar >= totalTextLength) {
+ boolean hasText = getParagraph(runDirection);
+ if (!hasText)
+ return null;
+ if (totalTextLength == 0) {
+ ArrayList ar = new ArrayList();
+ PdfChunk ck = new PdfChunk("", detailChunks[0]);
+ ar.add(ck);
+ return new PdfLine(0, 0, alignment, true, ar, isRTL);
+ }
+ }
+ float originalWidth = width;
+ int lastSplit = -1;
+ if (currentChar != 0)
+ currentChar = trimLeftEx(currentChar, totalTextLength - 1);
+ int oldCurrentChar = currentChar;
+ char c = 0;
+ char uniC = 0;
+ PdfChunk ck = null;
+ float charWidth = 0;
+ PdfChunk lastValidChunk = null;
+ for (; currentChar < totalTextLength; ++currentChar) {
+ c = text[currentChar];
+ ck = detailChunks[currentChar];
+ uniC = ck.getUnicodeEquivalent(c);
+ if (PdfChunk.noPrint(uniC))
+ continue;
+ charWidth = ck.getCharWidth(c);
+ if (ck.isExtSplitCharacter(oldCurrentChar, currentChar, totalTextLength, text, detailChunks))
+ lastSplit = currentChar;
+ if (width - charWidth < 0)
+ break;
+ width -= charWidth;
+ lastValidChunk = ck;
+ }
+ if (lastValidChunk == null) {
+ // not even a single char fit; must output the first char
+ ++currentChar;
+ return new PdfLine(0, 0, alignment, false, createArrayOfPdfChunks(currentChar - 1, currentChar - 1), isRTL);
+ }
+ if (currentChar >= totalTextLength) {
+ // there was more line than text
+ return new PdfLine(0, width, alignment, true, createArrayOfPdfChunks(oldCurrentChar, totalTextLength - 1), isRTL);
+ }
+ int newCurrentChar = trimRightEx(oldCurrentChar, currentChar - 1);
+ if (newCurrentChar < oldCurrentChar) {
+ // only WS
+ return new PdfLine(0, width, alignment, false, createArrayOfPdfChunks(oldCurrentChar, currentChar - 1), isRTL);
+ }
+ if (newCurrentChar == currentChar - 1) { // middle of word
+ HyphenationEvent he = (HyphenationEvent)lastValidChunk.getAttribute(Chunk.HYPHENATION);
+ if (he != null) {
+ int word[] = getWord(oldCurrentChar, newCurrentChar);
+ if (word != null) {
+ float testWidth = width + getWidth(word[0], currentChar - 1);
+ String pre = he.getHyphenatedWordPre(new String(text, word[0], word[1] - word[0]), lastValidChunk.font().getFont(), lastValidChunk.font().size(), testWidth);
+ String post = he.getHyphenatedWordPost();
+ if (pre.length() > 0) {
+ PdfChunk extra = new PdfChunk(pre, lastValidChunk);
+ currentChar = word[1] - post.length();
+ return new PdfLine(0, testWidth - lastValidChunk.font().width(pre), alignment, false, createArrayOfPdfChunks(oldCurrentChar, word[0] - 1, extra), isRTL);
+ }
+ }
+ }
+ }
+ if (lastSplit == -1 || lastSplit >= newCurrentChar) {
+ // no split point or split point ahead of end
+ return new PdfLine(0, width + getWidth(newCurrentChar + 1, currentChar - 1), alignment, false, createArrayOfPdfChunks(oldCurrentChar, newCurrentChar), isRTL);
+ }
+ // standard split
+ currentChar = lastSplit + 1;
+ newCurrentChar = trimRightEx(oldCurrentChar, lastSplit);
+ if (newCurrentChar < oldCurrentChar) {
+ // only WS again
+ newCurrentChar = currentChar - 1;
+ }
+ return new PdfLine(0, originalWidth - getWidth(oldCurrentChar, newCurrentChar), alignment, false, createArrayOfPdfChunks(oldCurrentChar, newCurrentChar), isRTL);
+ }
+
+ /** Gets the width of a range of characters.
+ * @param startIdx the first index to calculate
+ * @param lastIdx the last inclusive index to calculate
+ * @return the sum of all widths
+ */
+ public float getWidth(int startIdx, int lastIdx) {
+ char c = 0;
+ char uniC;
+ PdfChunk ck = null;
+ float width = 0;
+ for (; startIdx <= lastIdx; ++startIdx) {
+ c = text[startIdx];
+ ck = detailChunks[startIdx];
+ uniC = ck.getUnicodeEquivalent(c);
+ if (PdfChunk.noPrint(uniC))
+ continue;
+ width += detailChunks[startIdx].getCharWidth(c);
+ }
+ return width;
+ }
+
+ public ArrayList createArrayOfPdfChunks(int startIdx, int endIdx) {
+ return createArrayOfPdfChunks(startIdx, endIdx, null);
+ }
+
+ public ArrayList createArrayOfPdfChunks(int startIdx, int endIdx, PdfChunk extraPdfChunk) {
+ boolean bidi = (runDirection == PdfWriter.RUN_DIRECTION_LTR || runDirection == PdfWriter.RUN_DIRECTION_RTL);
+ if (bidi)
+ reorder(startIdx, endIdx);
+ ArrayList ar = new ArrayList();
+ PdfChunk refCk = detailChunks[startIdx];
+ PdfChunk ck = null;
+ StringBuffer buf = new StringBuffer();
+ char c;
+ int idx = 0;
+ for (; startIdx <= endIdx; ++startIdx) {
+ idx = bidi ? indexChars[startIdx] : startIdx;
+ c = text[idx];
+ ck = detailChunks[idx];
+ if (PdfChunk.noPrint(ck.getUnicodeEquivalent(c)))
+ continue;
+ if (ck.isImage()) {
+ if (buf.length() > 0) {
+ ar.add(new PdfChunk(buf.toString(), refCk));
+ buf = new StringBuffer();
+ }
+ ar.add(ck);
+ }
+ else if (ck == refCk) {
+ buf.append(c);
+ }
+ else {
+ if (buf.length() > 0) {
+ ar.add(new PdfChunk(buf.toString(), refCk));
+ buf = new StringBuffer();
+ }
+ if (!ck.isImage())
+ buf.append(c);
+ refCk = ck;
+ }
+ }
+ if (buf.length() > 0) {
+ ar.add(new PdfChunk(buf.toString(), refCk));
+ }
+ if (extraPdfChunk != null)
+ ar.add(extraPdfChunk);
+ return ar;
+ }
+
+ public int[] getWord(int startIdx, int idx) {
+ int last = idx;
+ int first = idx;
+ // forward
+ for (; last < totalTextLength; ++last) {
+ if (!Character.isLetter(text[last]))
+ break;
+ }
+ if (last == idx)
+ return null;
+ // backward
+ for (; first >= startIdx; --first) {
+ if (!Character.isLetter(text[first]))
+ break;
+ }
+ ++first;
+ return new int[]{first, last};
+ }
+
+ public int trimRight(int startIdx, int endIdx) {
+ int idx = endIdx;
+ char c;
+ for (; idx >= startIdx; --idx) {
+ c = detailChunks[idx].getUnicodeEquivalent(text[idx]);
+ if (!isWS(c))
+ break;
+ }
+ return idx;
+ }
+
+ public int trimLeft(int startIdx, int endIdx) {
+ int idx = startIdx;
+ char c;
+ for (; idx <= endIdx; ++idx) {
+ c = detailChunks[idx].getUnicodeEquivalent(text[idx]);
+ if (!isWS(c))
+ break;
+ }
+ return idx;
+ }
+
+ public int trimRightEx(int startIdx, int endIdx) {
+ int idx = endIdx;
+ char c = 0;
+ for (; idx >= startIdx; --idx) {
+ c = detailChunks[idx].getUnicodeEquivalent(text[idx]);
+ if (!isWS(c) && !PdfChunk.noPrint(c))
+ break;
+ }
+ return idx;
+ }
+
+ public int trimLeftEx(int startIdx, int endIdx) {
+ int idx = startIdx;
+ char c = 0;
+ for (; idx <= endIdx; ++idx) {
+ c = detailChunks[idx].getUnicodeEquivalent(text[idx]);
+ if (!isWS(c) && !PdfChunk.noPrint(c))
+ break;
+ }
+ return idx;
+ }
+
+ public void reorder(int start, int end) {
+ byte maxLevel = orderLevels[start];
+ byte minLevel = maxLevel;
+ byte onlyOddLevels = maxLevel;
+ byte onlyEvenLevels = maxLevel;
+ for (int k = start + 1; k <= end; ++k) {
+ byte b = orderLevels[k];
+ if (b > maxLevel)
+ maxLevel = b;
+ else if (b < minLevel)
+ minLevel = b;
+ onlyOddLevels &= b;
+ onlyEvenLevels |= b;
+ }
+ if ((onlyEvenLevels & 1) == 0) // nothing to do
+ return;
+ if ((onlyOddLevels & 1) == 1) { // single inversion
+ flip(start, end + 1);
+ return;
+ }
+ minLevel |= 1;
+ for (; maxLevel >= minLevel; --maxLevel) {
+ int pstart = start;
+ for (;;) {
+ for (;pstart <= end; ++pstart) {
+ if (orderLevels[pstart] >= maxLevel)
+ break;
+ }
+ if (pstart > end)
+ break;
+ int pend = pstart + 1;
+ for (; pend <= end; ++pend) {
+ if (orderLevels[pend] < maxLevel)
+ break;
+ }
+ flip(pstart, pend);
+ pstart = pend + 1;
+ }
+ }
+ }
+
+ public void flip(int start, int end) {
+ int mid = (start + end) / 2;
+ --end;
+ for (; start < mid; ++start, --end) {
+ int temp = indexChars[start];
+ indexChars[start] = indexChars[end];
+ indexChars[end] = temp;
+ }
+ }
+
+ public static boolean isWS(char c) {
+ return (c <= ' ');
+ }
+
+ static {
+ mirrorChars.put(0x0028, 0x0029); // LEFT PARENTHESIS
+ mirrorChars.put(0x0029, 0x0028); // RIGHT PARENTHESIS
+ mirrorChars.put(0x003C, 0x003E); // LESS-THAN SIGN
+ mirrorChars.put(0x003E, 0x003C); // GREATER-THAN SIGN
+ mirrorChars.put(0x005B, 0x005D); // LEFT SQUARE BRACKET
+ mirrorChars.put(0x005D, 0x005B); // RIGHT SQUARE BRACKET
+ mirrorChars.put(0x007B, 0x007D); // LEFT CURLY BRACKET
+ mirrorChars.put(0x007D, 0x007B); // RIGHT CURLY BRACKET
+ mirrorChars.put(0x00AB, 0x00BB); // LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+ mirrorChars.put(0x00BB, 0x00AB); // RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+ mirrorChars.put(0x2039, 0x203A); // SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+ mirrorChars.put(0x203A, 0x2039); // SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+ mirrorChars.put(0x2045, 0x2046); // LEFT SQUARE BRACKET WITH QUILL
+ mirrorChars.put(0x2046, 0x2045); // RIGHT SQUARE BRACKET WITH QUILL
+ mirrorChars.put(0x207D, 0x207E); // SUPERSCRIPT LEFT PARENTHESIS
+ mirrorChars.put(0x207E, 0x207D); // SUPERSCRIPT RIGHT PARENTHESIS
+ mirrorChars.put(0x208D, 0x208E); // SUBSCRIPT LEFT PARENTHESIS
+ mirrorChars.put(0x208E, 0x208D); // SUBSCRIPT RIGHT PARENTHESIS
+ mirrorChars.put(0x2208, 0x220B); // ELEMENT OF
+ mirrorChars.put(0x2209, 0x220C); // NOT AN ELEMENT OF
+ mirrorChars.put(0x220A, 0x220D); // SMALL ELEMENT OF
+ mirrorChars.put(0x220B, 0x2208); // CONTAINS AS MEMBER
+ mirrorChars.put(0x220C, 0x2209); // DOES NOT CONTAIN AS MEMBER
+ mirrorChars.put(0x220D, 0x220A); // SMALL CONTAINS AS MEMBER
+ mirrorChars.put(0x2215, 0x29F5); // DIVISION SLASH
+ mirrorChars.put(0x223C, 0x223D); // TILDE OPERATOR
+ mirrorChars.put(0x223D, 0x223C); // REVERSED TILDE
+ mirrorChars.put(0x2243, 0x22CD); // ASYMPTOTICALLY EQUAL TO
+ mirrorChars.put(0x2252, 0x2253); // APPROXIMATELY EQUAL TO OR THE IMAGE OF
+ mirrorChars.put(0x2253, 0x2252); // IMAGE OF OR APPROXIMATELY EQUAL TO
+ mirrorChars.put(0x2254, 0x2255); // COLON EQUALS
+ mirrorChars.put(0x2255, 0x2254); // EQUALS COLON
+ mirrorChars.put(0x2264, 0x2265); // LESS-THAN OR EQUAL TO
+ mirrorChars.put(0x2265, 0x2264); // GREATER-THAN OR EQUAL TO
+ mirrorChars.put(0x2266, 0x2267); // LESS-THAN OVER EQUAL TO
+ mirrorChars.put(0x2267, 0x2266); // GREATER-THAN OVER EQUAL TO
+ mirrorChars.put(0x2268, 0x2269); // [BEST FIT] LESS-THAN BUT NOT EQUAL TO
+ mirrorChars.put(0x2269, 0x2268); // [BEST FIT] GREATER-THAN BUT NOT EQUAL TO
+ mirrorChars.put(0x226A, 0x226B); // MUCH LESS-THAN
+ mirrorChars.put(0x226B, 0x226A); // MUCH GREATER-THAN
+ mirrorChars.put(0x226E, 0x226F); // [BEST FIT] NOT LESS-THAN
+ mirrorChars.put(0x226F, 0x226E); // [BEST FIT] NOT GREATER-THAN
+ mirrorChars.put(0x2270, 0x2271); // [BEST FIT] NEITHER LESS-THAN NOR EQUAL TO
+ mirrorChars.put(0x2271, 0x2270); // [BEST FIT] NEITHER GREATER-THAN NOR EQUAL TO
+ mirrorChars.put(0x2272, 0x2273); // [BEST FIT] LESS-THAN OR EQUIVALENT TO
+ mirrorChars.put(0x2273, 0x2272); // [BEST FIT] GREATER-THAN OR EQUIVALENT TO
+ mirrorChars.put(0x2274, 0x2275); // [BEST FIT] NEITHER LESS-THAN NOR EQUIVALENT TO
+ mirrorChars.put(0x2275, 0x2274); // [BEST FIT] NEITHER GREATER-THAN NOR EQUIVALENT TO
+ mirrorChars.put(0x2276, 0x2277); // LESS-THAN OR GREATER-THAN
+ mirrorChars.put(0x2277, 0x2276); // GREATER-THAN OR LESS-THAN
+ mirrorChars.put(0x2278, 0x2279); // NEITHER LESS-THAN NOR GREATER-THAN
+ mirrorChars.put(0x2279, 0x2278); // NEITHER GREATER-THAN NOR LESS-THAN
+ mirrorChars.put(0x227A, 0x227B); // PRECEDES
+ mirrorChars.put(0x227B, 0x227A); // SUCCEEDS
+ mirrorChars.put(0x227C, 0x227D); // PRECEDES OR EQUAL TO
+ mirrorChars.put(0x227D, 0x227C); // SUCCEEDS OR EQUAL TO
+ mirrorChars.put(0x227E, 0x227F); // [BEST FIT] PRECEDES OR EQUIVALENT TO
+ mirrorChars.put(0x227F, 0x227E); // [BEST FIT] SUCCEEDS OR EQUIVALENT TO
+ mirrorChars.put(0x2280, 0x2281); // [BEST FIT] DOES NOT PRECEDE
+ mirrorChars.put(0x2281, 0x2280); // [BEST FIT] DOES NOT SUCCEED
+ mirrorChars.put(0x2282, 0x2283); // SUBSET OF
+ mirrorChars.put(0x2283, 0x2282); // SUPERSET OF
+ mirrorChars.put(0x2284, 0x2285); // [BEST FIT] NOT A SUBSET OF
+ mirrorChars.put(0x2285, 0x2284); // [BEST FIT] NOT A SUPERSET OF
+ mirrorChars.put(0x2286, 0x2287); // SUBSET OF OR EQUAL TO
+ mirrorChars.put(0x2287, 0x2286); // SUPERSET OF OR EQUAL TO
+ mirrorChars.put(0x2288, 0x2289); // [BEST FIT] NEITHER A SUBSET OF NOR EQUAL TO
+ mirrorChars.put(0x2289, 0x2288); // [BEST FIT] NEITHER A SUPERSET OF NOR EQUAL TO
+ mirrorChars.put(0x228A, 0x228B); // [BEST FIT] SUBSET OF WITH NOT EQUAL TO
+ mirrorChars.put(0x228B, 0x228A); // [BEST FIT] SUPERSET OF WITH NOT EQUAL TO
+ mirrorChars.put(0x228F, 0x2290); // SQUARE IMAGE OF
+ mirrorChars.put(0x2290, 0x228F); // SQUARE ORIGINAL OF
+ mirrorChars.put(0x2291, 0x2292); // SQUARE IMAGE OF OR EQUAL TO
+ mirrorChars.put(0x2292, 0x2291); // SQUARE ORIGINAL OF OR EQUAL TO
+ mirrorChars.put(0x2298, 0x29B8); // CIRCLED DIVISION SLASH
+ mirrorChars.put(0x22A2, 0x22A3); // RIGHT TACK
+ mirrorChars.put(0x22A3, 0x22A2); // LEFT TACK
+ mirrorChars.put(0x22A6, 0x2ADE); // ASSERTION
+ mirrorChars.put(0x22A8, 0x2AE4); // TRUE
+ mirrorChars.put(0x22A9, 0x2AE3); // FORCES
+ mirrorChars.put(0x22AB, 0x2AE5); // DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE
+ mirrorChars.put(0x22B0, 0x22B1); // PRECEDES UNDER RELATION
+ mirrorChars.put(0x22B1, 0x22B0); // SUCCEEDS UNDER RELATION
+ mirrorChars.put(0x22B2, 0x22B3); // NORMAL SUBGROUP OF
+ mirrorChars.put(0x22B3, 0x22B2); // CONTAINS AS NORMAL SUBGROUP
+ mirrorChars.put(0x22B4, 0x22B5); // NORMAL SUBGROUP OF OR EQUAL TO
+ mirrorChars.put(0x22B5, 0x22B4); // CONTAINS AS NORMAL SUBGROUP OR EQUAL TO
+ mirrorChars.put(0x22B6, 0x22B7); // ORIGINAL OF
+ mirrorChars.put(0x22B7, 0x22B6); // IMAGE OF
+ mirrorChars.put(0x22C9, 0x22CA); // LEFT NORMAL FACTOR SEMIDIRECT PRODUCT
+ mirrorChars.put(0x22CA, 0x22C9); // RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT
+ mirrorChars.put(0x22CB, 0x22CC); // LEFT SEMIDIRECT PRODUCT
+ mirrorChars.put(0x22CC, 0x22CB); // RIGHT SEMIDIRECT PRODUCT
+ mirrorChars.put(0x22CD, 0x2243); // REVERSED TILDE EQUALS
+ mirrorChars.put(0x22D0, 0x22D1); // DOUBLE SUBSET
+ mirrorChars.put(0x22D1, 0x22D0); // DOUBLE SUPERSET
+ mirrorChars.put(0x22D6, 0x22D7); // LESS-THAN WITH DOT
+ mirrorChars.put(0x22D7, 0x22D6); // GREATER-THAN WITH DOT
+ mirrorChars.put(0x22D8, 0x22D9); // VERY MUCH LESS-THAN
+ mirrorChars.put(0x22D9, 0x22D8); // VERY MUCH GREATER-THAN
+ mirrorChars.put(0x22DA, 0x22DB); // LESS-THAN EQUAL TO OR GREATER-THAN
+ mirrorChars.put(0x22DB, 0x22DA); // GREATER-THAN EQUAL TO OR LESS-THAN
+ mirrorChars.put(0x22DC, 0x22DD); // EQUAL TO OR LESS-THAN
+ mirrorChars.put(0x22DD, 0x22DC); // EQUAL TO OR GREATER-THAN
+ mirrorChars.put(0x22DE, 0x22DF); // EQUAL TO OR PRECEDES
+ mirrorChars.put(0x22DF, 0x22DE); // EQUAL TO OR SUCCEEDS
+ mirrorChars.put(0x22E0, 0x22E1); // [BEST FIT] DOES NOT PRECEDE OR EQUAL
+ mirrorChars.put(0x22E1, 0x22E0); // [BEST FIT] DOES NOT SUCCEED OR EQUAL
+ mirrorChars.put(0x22E2, 0x22E3); // [BEST FIT] NOT SQUARE IMAGE OF OR EQUAL TO
+ mirrorChars.put(0x22E3, 0x22E2); // [BEST FIT] NOT SQUARE ORIGINAL OF OR EQUAL TO
+ mirrorChars.put(0x22E4, 0x22E5); // [BEST FIT] SQUARE IMAGE OF OR NOT EQUAL TO
+ mirrorChars.put(0x22E5, 0x22E4); // [BEST FIT] SQUARE ORIGINAL OF OR NOT EQUAL TO
+ mirrorChars.put(0x22E6, 0x22E7); // [BEST FIT] LESS-THAN BUT NOT EQUIVALENT TO
+ mirrorChars.put(0x22E7, 0x22E6); // [BEST FIT] GREATER-THAN BUT NOT EQUIVALENT TO
+ mirrorChars.put(0x22E8, 0x22E9); // [BEST FIT] PRECEDES BUT NOT EQUIVALENT TO
+ mirrorChars.put(0x22E9, 0x22E8); // [BEST FIT] SUCCEEDS BUT NOT EQUIVALENT TO
+ mirrorChars.put(0x22EA, 0x22EB); // [BEST FIT] NOT NORMAL SUBGROUP OF
+ mirrorChars.put(0x22EB, 0x22EA); // [BEST FIT] DOES NOT CONTAIN AS NORMAL SUBGROUP
+ mirrorChars.put(0x22EC, 0x22ED); // [BEST FIT] NOT NORMAL SUBGROUP OF OR EQUAL TO
+ mirrorChars.put(0x22ED, 0x22EC); // [BEST FIT] DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL
+ mirrorChars.put(0x22F0, 0x22F1); // UP RIGHT DIAGONAL ELLIPSIS
+ mirrorChars.put(0x22F1, 0x22F0); // DOWN RIGHT DIAGONAL ELLIPSIS
+ mirrorChars.put(0x22F2, 0x22FA); // ELEMENT OF WITH LONG HORIZONTAL STROKE
+ mirrorChars.put(0x22F3, 0x22FB); // ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
+ mirrorChars.put(0x22F4, 0x22FC); // SMALL ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
+ mirrorChars.put(0x22F6, 0x22FD); // ELEMENT OF WITH OVERBAR
+ mirrorChars.put(0x22F7, 0x22FE); // SMALL ELEMENT OF WITH OVERBAR
+ mirrorChars.put(0x22FA, 0x22F2); // CONTAINS WITH LONG HORIZONTAL STROKE
+ mirrorChars.put(0x22FB, 0x22F3); // CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
+ mirrorChars.put(0x22FC, 0x22F4); // SMALL CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE
+ mirrorChars.put(0x22FD, 0x22F6); // CONTAINS WITH OVERBAR
+ mirrorChars.put(0x22FE, 0x22F7); // SMALL CONTAINS WITH OVERBAR
+ mirrorChars.put(0x2308, 0x2309); // LEFT CEILING
+ mirrorChars.put(0x2309, 0x2308); // RIGHT CEILING
+ mirrorChars.put(0x230A, 0x230B); // LEFT FLOOR
+ mirrorChars.put(0x230B, 0x230A); // RIGHT FLOOR
+ mirrorChars.put(0x2329, 0x232A); // LEFT-POINTING ANGLE BRACKET
+ mirrorChars.put(0x232A, 0x2329); // RIGHT-POINTING ANGLE BRACKET
+ mirrorChars.put(0x2768, 0x2769); // MEDIUM LEFT PARENTHESIS ORNAMENT
+ mirrorChars.put(0x2769, 0x2768); // MEDIUM RIGHT PARENTHESIS ORNAMENT
+ mirrorChars.put(0x276A, 0x276B); // MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT
+ mirrorChars.put(0x276B, 0x276A); // MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT
+ mirrorChars.put(0x276C, 0x276D); // MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT
+ mirrorChars.put(0x276D, 0x276C); // MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT
+ mirrorChars.put(0x276E, 0x276F); // HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT
+ mirrorChars.put(0x276F, 0x276E); // HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT
+ mirrorChars.put(0x2770, 0x2771); // HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT
+ mirrorChars.put(0x2771, 0x2770); // HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT
+ mirrorChars.put(0x2772, 0x2773); // LIGHT LEFT TORTOISE SHELL BRACKET
+ mirrorChars.put(0x2773, 0x2772); // LIGHT RIGHT TORTOISE SHELL BRACKET
+ mirrorChars.put(0x2774, 0x2775); // MEDIUM LEFT CURLY BRACKET ORNAMENT
+ mirrorChars.put(0x2775, 0x2774); // MEDIUM RIGHT CURLY BRACKET ORNAMENT
+ mirrorChars.put(0x27D5, 0x27D6); // LEFT OUTER JOIN
+ mirrorChars.put(0x27D6, 0x27D5); // RIGHT OUTER JOIN
+ mirrorChars.put(0x27DD, 0x27DE); // LONG RIGHT TACK
+ mirrorChars.put(0x27DE, 0x27DD); // LONG LEFT TACK
+ mirrorChars.put(0x27E2, 0x27E3); // WHITE CONCAVE-SIDED DIAMOND WITH LEFTWARDS TICK
+ mirrorChars.put(0x27E3, 0x27E2); // WHITE CONCAVE-SIDED DIAMOND WITH RIGHTWARDS TICK
+ mirrorChars.put(0x27E4, 0x27E5); // WHITE SQUARE WITH LEFTWARDS TICK
+ mirrorChars.put(0x27E5, 0x27E4); // WHITE SQUARE WITH RIGHTWARDS TICK
+ mirrorChars.put(0x27E6, 0x27E7); // MATHEMATICAL LEFT WHITE SQUARE BRACKET
+ mirrorChars.put(0x27E7, 0x27E6); // MATHEMATICAL RIGHT WHITE SQUARE BRACKET
+ mirrorChars.put(0x27E8, 0x27E9); // MATHEMATICAL LEFT ANGLE BRACKET
+ mirrorChars.put(0x27E9, 0x27E8); // MATHEMATICAL RIGHT ANGLE BRACKET
+ mirrorChars.put(0x27EA, 0x27EB); // MATHEMATICAL LEFT DOUBLE ANGLE BRACKET
+ mirrorChars.put(0x27EB, 0x27EA); // MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET
+ mirrorChars.put(0x2983, 0x2984); // LEFT WHITE CURLY BRACKET
+ mirrorChars.put(0x2984, 0x2983); // RIGHT WHITE CURLY BRACKET
+ mirrorChars.put(0x2985, 0x2986); // LEFT WHITE PARENTHESIS
+ mirrorChars.put(0x2986, 0x2985); // RIGHT WHITE PARENTHESIS
+ mirrorChars.put(0x2987, 0x2988); // Z NOTATION LEFT IMAGE BRACKET
+ mirrorChars.put(0x2988, 0x2987); // Z NOTATION RIGHT IMAGE BRACKET
+ mirrorChars.put(0x2989, 0x298A); // Z NOTATION LEFT BINDING BRACKET
+ mirrorChars.put(0x298A, 0x2989); // Z NOTATION RIGHT BINDING BRACKET
+ mirrorChars.put(0x298B, 0x298C); // LEFT SQUARE BRACKET WITH UNDERBAR
+ mirrorChars.put(0x298C, 0x298B); // RIGHT SQUARE BRACKET WITH UNDERBAR
+ mirrorChars.put(0x298D, 0x2990); // LEFT SQUARE BRACKET WITH TICK IN TOP CORNER
+ mirrorChars.put(0x298E, 0x298F); // RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER
+ mirrorChars.put(0x298F, 0x298E); // LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER
+ mirrorChars.put(0x2990, 0x298D); // RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER
+ mirrorChars.put(0x2991, 0x2992); // LEFT ANGLE BRACKET WITH DOT
+ mirrorChars.put(0x2992, 0x2991); // RIGHT ANGLE BRACKET WITH DOT
+ mirrorChars.put(0x2993, 0x2994); // LEFT ARC LESS-THAN BRACKET
+ mirrorChars.put(0x2994, 0x2993); // RIGHT ARC GREATER-THAN BRACKET
+ mirrorChars.put(0x2995, 0x2996); // DOUBLE LEFT ARC GREATER-THAN BRACKET
+ mirrorChars.put(0x2996, 0x2995); // DOUBLE RIGHT ARC LESS-THAN BRACKET
+ mirrorChars.put(0x2997, 0x2998); // LEFT BLACK TORTOISE SHELL BRACKET
+ mirrorChars.put(0x2998, 0x2997); // RIGHT BLACK TORTOISE SHELL BRACKET
+ mirrorChars.put(0x29B8, 0x2298); // CIRCLED REVERSE SOLIDUS
+ mirrorChars.put(0x29C0, 0x29C1); // CIRCLED LESS-THAN
+ mirrorChars.put(0x29C1, 0x29C0); // CIRCLED GREATER-THAN
+ mirrorChars.put(0x29C4, 0x29C5); // SQUARED RISING DIAGONAL SLASH
+ mirrorChars.put(0x29C5, 0x29C4); // SQUARED FALLING DIAGONAL SLASH
+ mirrorChars.put(0x29CF, 0x29D0); // LEFT TRIANGLE BESIDE VERTICAL BAR
+ mirrorChars.put(0x29D0, 0x29CF); // VERTICAL BAR BESIDE RIGHT TRIANGLE
+ mirrorChars.put(0x29D1, 0x29D2); // BOWTIE WITH LEFT HALF BLACK
+ mirrorChars.put(0x29D2, 0x29D1); // BOWTIE WITH RIGHT HALF BLACK
+ mirrorChars.put(0x29D4, 0x29D5); // TIMES WITH LEFT HALF BLACK
+ mirrorChars.put(0x29D5, 0x29D4); // TIMES WITH RIGHT HALF BLACK
+ mirrorChars.put(0x29D8, 0x29D9); // LEFT WIGGLY FENCE
+ mirrorChars.put(0x29D9, 0x29D8); // RIGHT WIGGLY FENCE
+ mirrorChars.put(0x29DA, 0x29DB); // LEFT DOUBLE WIGGLY FENCE
+ mirrorChars.put(0x29DB, 0x29DA); // RIGHT DOUBLE WIGGLY FENCE
+ mirrorChars.put(0x29F5, 0x2215); // REVERSE SOLIDUS OPERATOR
+ mirrorChars.put(0x29F8, 0x29F9); // BIG SOLIDUS
+ mirrorChars.put(0x29F9, 0x29F8); // BIG REVERSE SOLIDUS
+ mirrorChars.put(0x29FC, 0x29FD); // LEFT-POINTING CURVED ANGLE BRACKET
+ mirrorChars.put(0x29FD, 0x29FC); // RIGHT-POINTING CURVED ANGLE BRACKET
+ mirrorChars.put(0x2A2B, 0x2A2C); // MINUS SIGN WITH FALLING DOTS
+ mirrorChars.put(0x2A2C, 0x2A2B); // MINUS SIGN WITH RISING DOTS
+ mirrorChars.put(0x2A2D, 0x2A2C); // PLUS SIGN IN LEFT HALF CIRCLE
+ mirrorChars.put(0x2A2E, 0x2A2D); // PLUS SIGN IN RIGHT HALF CIRCLE
+ mirrorChars.put(0x2A34, 0x2A35); // MULTIPLICATION SIGN IN LEFT HALF CIRCLE
+ mirrorChars.put(0x2A35, 0x2A34); // MULTIPLICATION SIGN IN RIGHT HALF CIRCLE
+ mirrorChars.put(0x2A3C, 0x2A3D); // INTERIOR PRODUCT
+ mirrorChars.put(0x2A3D, 0x2A3C); // RIGHTHAND INTERIOR PRODUCT
+ mirrorChars.put(0x2A64, 0x2A65); // Z NOTATION DOMAIN ANTIRESTRICTION
+ mirrorChars.put(0x2A65, 0x2A64); // Z NOTATION RANGE ANTIRESTRICTION
+ mirrorChars.put(0x2A79, 0x2A7A); // LESS-THAN WITH CIRCLE INSIDE
+ mirrorChars.put(0x2A7A, 0x2A79); // GREATER-THAN WITH CIRCLE INSIDE
+ mirrorChars.put(0x2A7D, 0x2A7E); // LESS-THAN OR SLANTED EQUAL TO
+ mirrorChars.put(0x2A7E, 0x2A7D); // GREATER-THAN OR SLANTED EQUAL TO
+ mirrorChars.put(0x2A7F, 0x2A80); // LESS-THAN OR SLANTED EQUAL TO WITH DOT INSIDE
+ mirrorChars.put(0x2A80, 0x2A7F); // GREATER-THAN OR SLANTED EQUAL TO WITH DOT INSIDE
+ mirrorChars.put(0x2A81, 0x2A82); // LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE
+ mirrorChars.put(0x2A82, 0x2A81); // GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE
+ mirrorChars.put(0x2A83, 0x2A84); // LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE RIGHT
+ mirrorChars.put(0x2A84, 0x2A83); // GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE LEFT
+ mirrorChars.put(0x2A8B, 0x2A8C); // LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE GREATER-THAN
+ mirrorChars.put(0x2A8C, 0x2A8B); // GREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE LESS-THAN
+ mirrorChars.put(0x2A91, 0x2A92); // LESS-THAN ABOVE GREATER-THAN ABOVE DOUBLE-LINE EQUAL
+ mirrorChars.put(0x2A92, 0x2A91); // GREATER-THAN ABOVE LESS-THAN ABOVE DOUBLE-LINE EQUAL
+ mirrorChars.put(0x2A93, 0x2A94); // LESS-THAN ABOVE SLANTED EQUAL ABOVE GREATER-THAN ABOVE SLANTED EQUAL
+ mirrorChars.put(0x2A94, 0x2A93); // GREATER-THAN ABOVE SLANTED EQUAL ABOVE LESS-THAN ABOVE SLANTED EQUAL
+ mirrorChars.put(0x2A95, 0x2A96); // SLANTED EQUAL TO OR LESS-THAN
+ mirrorChars.put(0x2A96, 0x2A95); // SLANTED EQUAL TO OR GREATER-THAN
+ mirrorChars.put(0x2A97, 0x2A98); // SLANTED EQUAL TO OR LESS-THAN WITH DOT INSIDE
+ mirrorChars.put(0x2A98, 0x2A97); // SLANTED EQUAL TO OR GREATER-THAN WITH DOT INSIDE
+ mirrorChars.put(0x2A99, 0x2A9A); // DOUBLE-LINE EQUAL TO OR LESS-THAN
+ mirrorChars.put(0x2A9A, 0x2A99); // DOUBLE-LINE EQUAL TO OR GREATER-THAN
+ mirrorChars.put(0x2A9B, 0x2A9C); // DOUBLE-LINE SLANTED EQUAL TO OR LESS-THAN
+ mirrorChars.put(0x2A9C, 0x2A9B); // DOUBLE-LINE SLANTED EQUAL TO OR GREATER-THAN
+ mirrorChars.put(0x2AA1, 0x2AA2); // DOUBLE NESTED LESS-THAN
+ mirrorChars.put(0x2AA2, 0x2AA1); // DOUBLE NESTED GREATER-THAN
+ mirrorChars.put(0x2AA6, 0x2AA7); // LESS-THAN CLOSED BY CURVE
+ mirrorChars.put(0x2AA7, 0x2AA6); // GREATER-THAN CLOSED BY CURVE
+ mirrorChars.put(0x2AA8, 0x2AA9); // LESS-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL
+ mirrorChars.put(0x2AA9, 0x2AA8); // GREATER-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL
+ mirrorChars.put(0x2AAA, 0x2AAB); // SMALLER THAN
+ mirrorChars.put(0x2AAB, 0x2AAA); // LARGER THAN
+ mirrorChars.put(0x2AAC, 0x2AAD); // SMALLER THAN OR EQUAL TO
+ mirrorChars.put(0x2AAD, 0x2AAC); // LARGER THAN OR EQUAL TO
+ mirrorChars.put(0x2AAF, 0x2AB0); // PRECEDES ABOVE SINGLE-LINE EQUALS SIGN
+ mirrorChars.put(0x2AB0, 0x2AAF); // SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN
+ mirrorChars.put(0x2AB3, 0x2AB4); // PRECEDES ABOVE EQUALS SIGN
+ mirrorChars.put(0x2AB4, 0x2AB3); // SUCCEEDS ABOVE EQUALS SIGN
+ mirrorChars.put(0x2ABB, 0x2ABC); // DOUBLE PRECEDES
+ mirrorChars.put(0x2ABC, 0x2ABB); // DOUBLE SUCCEEDS
+ mirrorChars.put(0x2ABD, 0x2ABE); // SUBSET WITH DOT
+ mirrorChars.put(0x2ABE, 0x2ABD); // SUPERSET WITH DOT
+ mirrorChars.put(0x2ABF, 0x2AC0); // SUBSET WITH PLUS SIGN BELOW
+ mirrorChars.put(0x2AC0, 0x2ABF); // SUPERSET WITH PLUS SIGN BELOW
+ mirrorChars.put(0x2AC1, 0x2AC2); // SUBSET WITH MULTIPLICATION SIGN BELOW
+ mirrorChars.put(0x2AC2, 0x2AC1); // SUPERSET WITH MULTIPLICATION SIGN BELOW
+ mirrorChars.put(0x2AC3, 0x2AC4); // SUBSET OF OR EQUAL TO WITH DOT ABOVE
+ mirrorChars.put(0x2AC4, 0x2AC3); // SUPERSET OF OR EQUAL TO WITH DOT ABOVE
+ mirrorChars.put(0x2AC5, 0x2AC6); // SUBSET OF ABOVE EQUALS SIGN
+ mirrorChars.put(0x2AC6, 0x2AC5); // SUPERSET OF ABOVE EQUALS SIGN
+ mirrorChars.put(0x2ACD, 0x2ACE); // SQUARE LEFT OPEN BOX OPERATOR
+ mirrorChars.put(0x2ACE, 0x2ACD); // SQUARE RIGHT OPEN BOX OPERATOR
+ mirrorChars.put(0x2ACF, 0x2AD0); // CLOSED SUBSET
+ mirrorChars.put(0x2AD0, 0x2ACF); // CLOSED SUPERSET
+ mirrorChars.put(0x2AD1, 0x2AD2); // CLOSED SUBSET OR EQUAL TO
+ mirrorChars.put(0x2AD2, 0x2AD1); // CLOSED SUPERSET OR EQUAL TO
+ mirrorChars.put(0x2AD3, 0x2AD4); // SUBSET ABOVE SUPERSET
+ mirrorChars.put(0x2AD4, 0x2AD3); // SUPERSET ABOVE SUBSET
+ mirrorChars.put(0x2AD5, 0x2AD6); // SUBSET ABOVE SUBSET
+ mirrorChars.put(0x2AD6, 0x2AD5); // SUPERSET ABOVE SUPERSET
+ mirrorChars.put(0x2ADE, 0x22A6); // SHORT LEFT TACK
+ mirrorChars.put(0x2AE3, 0x22A9); // DOUBLE VERTICAL BAR LEFT TURNSTILE
+ mirrorChars.put(0x2AE4, 0x22A8); // VERTICAL BAR DOUBLE LEFT TURNSTILE
+ mirrorChars.put(0x2AE5, 0x22AB); // DOUBLE VERTICAL BAR DOUBLE LEFT TURNSTILE
+ mirrorChars.put(0x2AEC, 0x2AED); // DOUBLE STROKE NOT SIGN
+ mirrorChars.put(0x2AED, 0x2AEC); // REVERSED DOUBLE STROKE NOT SIGN
+ mirrorChars.put(0x2AF7, 0x2AF8); // TRIPLE NESTED LESS-THAN
+ mirrorChars.put(0x2AF8, 0x2AF7); // TRIPLE NESTED GREATER-THAN
+ mirrorChars.put(0x2AF9, 0x2AFA); // DOUBLE-LINE SLANTED LESS-THAN OR EQUAL TO
+ mirrorChars.put(0x2AFA, 0x2AF9); // DOUBLE-LINE SLANTED GREATER-THAN OR EQUAL TO
+ mirrorChars.put(0x3008, 0x3009); // LEFT ANGLE BRACKET
+ mirrorChars.put(0x3009, 0x3008); // RIGHT ANGLE BRACKET
+ mirrorChars.put(0x300A, 0x300B); // LEFT DOUBLE ANGLE BRACKET
+ mirrorChars.put(0x300B, 0x300A); // RIGHT DOUBLE ANGLE BRACKET
+ mirrorChars.put(0x300C, 0x300D); // [BEST FIT] LEFT CORNER BRACKET
+ mirrorChars.put(0x300D, 0x300C); // [BEST FIT] RIGHT CORNER BRACKET
+ mirrorChars.put(0x300E, 0x300F); // [BEST FIT] LEFT WHITE CORNER BRACKET
+ mirrorChars.put(0x300F, 0x300E); // [BEST FIT] RIGHT WHITE CORNER BRACKET
+ mirrorChars.put(0x3010, 0x3011); // LEFT BLACK LENTICULAR BRACKET
+ mirrorChars.put(0x3011, 0x3010); // RIGHT BLACK LENTICULAR BRACKET
+ mirrorChars.put(0x3014, 0x3015); // LEFT TORTOISE SHELL BRACKET
+ mirrorChars.put(0x3015, 0x3014); // RIGHT TORTOISE SHELL BRACKET
+ mirrorChars.put(0x3016, 0x3017); // LEFT WHITE LENTICULAR BRACKET
+ mirrorChars.put(0x3017, 0x3016); // RIGHT WHITE LENTICULAR BRACKET
+ mirrorChars.put(0x3018, 0x3019); // LEFT WHITE TORTOISE SHELL BRACKET
+ mirrorChars.put(0x3019, 0x3018); // RIGHT WHITE TORTOISE SHELL BRACKET
+ mirrorChars.put(0x301A, 0x301B); // LEFT WHITE SQUARE BRACKET
+ mirrorChars.put(0x301B, 0x301A); // RIGHT WHITE SQUARE BRACKET
+ mirrorChars.put(0xFF08, 0xFF09); // FULLWIDTH LEFT PARENTHESIS
+ mirrorChars.put(0xFF09, 0xFF08); // FULLWIDTH RIGHT PARENTHESIS
+ mirrorChars.put(0xFF1C, 0xFF1E); // FULLWIDTH LESS-THAN SIGN
+ mirrorChars.put(0xFF1E, 0xFF1C); // FULLWIDTH GREATER-THAN SIGN
+ mirrorChars.put(0xFF3B, 0xFF3D); // FULLWIDTH LEFT SQUARE BRACKET
+ mirrorChars.put(0xFF3D, 0xFF3B); // FULLWIDTH RIGHT SQUARE BRACKET
+ mirrorChars.put(0xFF5B, 0xFF5D); // FULLWIDTH LEFT CURLY BRACKET
+ mirrorChars.put(0xFF5D, 0xFF5B); // FULLWIDTH RIGHT CURLY BRACKET
+ mirrorChars.put(0xFF5F, 0xFF60); // FULLWIDTH LEFT WHITE PARENTHESIS
+ mirrorChars.put(0xFF60, 0xFF5F); // FULLWIDTH RIGHT WHITE PARENTHESIS
+ mirrorChars.put(0xFF62, 0xFF63); // [BEST FIT] HALFWIDTH LEFT CORNER BRACKET
+ mirrorChars.put(0xFF63, 0xFF62); // [BEST FIT] HALFWIDTH RIGHT CORNER BRACKET
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/pdf/BidiOrder.java b/src/main/java/com/lowagie/text/pdf/BidiOrder.java
new file mode 100644
index 0000000..97f9f74
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/BidiOrder.java
@@ -0,0 +1,1240 @@
+package com.lowagie.text.pdf;
+
+/*
+ *
+ * Copyright 2003 Paulo Soares
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+/*
+ * (C) Copyright IBM Corp. 1999, All Rights Reserved
+ *
+ * version 1.1
+ */
+
+/**
+ * Reference implementation of the Unicode 3.0 Bidi algorithm.
+ *
+ * <p>
+ * This implementation is not optimized for performance. It is intended
+ * as a reference implementation that closely follows the specification
+ * of the Bidirectional Algorithm in The Unicode Standard version 3.0.
+ * <p>
+ * <b>Input:</b><br>
+ * There are two levels of input to the algorithm, since clients may prefer
+ * to supply some information from out-of-band sources rather than relying on
+ * the default behavior.
+ * <ol>
+ * <li>unicode type array
+ * <li>unicode type array, with externally supplied base line direction
+ * </ol>
+ * <p><b>Output:</b><br>
+ * Output is separated into several stages as well, to better enable clients
+ * to evaluate various aspects of implementation conformance.
+ * <ol>
+ * <li>levels array over entire paragraph
+ * <li>reordering array over entire paragraph
+ * <li>levels array over line
+ * <li>reordering array over line
+ * </ol>
+ * Note that for conformance, algorithms are only required to generate correct
+ * reordering and character directionality (odd or even levels) over a line.
+ * Generating identical level arrays over a line is not required. Bidi
+ * explicit format codes (LRE, RLE, LRO, RLO, PDF) and BN can be assigned
+ * arbitrary levels and positions as long as the other text matches.
+ * <p>
+ * As the algorithm is defined to operate on a single paragraph at a time,
+ * this implementation is written to handle single paragraphs. Thus
+ * rule P1 is presumed by this implementation-- the data provided to the
+ * implementation is assumed to be a single paragraph, and either contains no
+ * 'B' codes, or a single 'B' code at the end of the input. 'B' is allowed
+ * as input to illustrate how the algorithm assigns it a level.
+ * <p>
+ * Also note that rules L3 and L4 depend on the rendering engine that uses
+ * the result of the bidi algorithm. This implementation assumes that the
+ * rendering engine expects combining marks in visual order (e.g. to the
+ * left of their base character in RTL runs) and that it adjust the glyphs
+ * used to render mirrored characters that are in RTL runs so that they
+ * render appropriately.
+ *
+ * @author Doug Felt
+ */
+
+public final class BidiOrder {
+ private byte[] initialTypes;
+ private byte[] embeddings; // generated from processing format codes
+ private byte paragraphEmbeddingLevel = -1; // undefined
+
+ private int textLength; // for convenience
+ private byte[] resultTypes; // for paragraph, not lines
+ private byte[] resultLevels; // for paragraph, not lines
+
+ // The bidi types
+
+ /** Left-to-right*/
+ public static final byte L = 0;
+
+ /** Left-to-Right Embedding */
+ public static final byte LRE = 1;
+
+ /** Left-to-Right Override */
+ public static final byte LRO = 2;
+
+ /** Right-to-Left */
+ public static final byte R = 3;
+
+ /** Right-to-Left Arabic */
+ public static final byte AL = 4;
+
+ /** Right-to-Left Embedding */
+ public static final byte RLE = 5;
+
+ /** Right-to-Left Override */
+ public static final byte RLO = 6;
+
+ /** Pop Directional Format */
+ public static final byte PDF = 7;
+
+ /** European Number */
+ public static final byte EN = 8;
+
+ /** European Number Separator */
+ public static final byte ES = 9;
+
+ /** European Number Terminator */
+ public static final byte ET = 10;
+
+ /** Arabic Number */
+ public static final byte AN = 11;
+
+ /** Common Number Separator */
+ public static final byte CS = 12;
+
+ /** Non-Spacing Mark */
+ public static final byte NSM = 13;
+
+ /** Boundary Neutral */
+ public static final byte BN = 14;
+
+ /** Paragraph Separator */
+ public static final byte B = 15;
+
+ /** Segment Separator */
+ public static final byte S = 16;
+
+ /** Whitespace */
+ public static final byte WS = 17;
+
+ /** Other Neutrals */
+ public static final byte ON = 18;
+
+ /** Minimum bidi type value. */
+ public static final byte TYPE_MIN = 0;
+
+ /** Maximum bidi type value. */
+ public static final byte TYPE_MAX = 18;
+
+ //
+ // Input
+ //
+
+ /**
+ * Initialize using an array of direction types. Types range from TYPE_MIN to TYPE_MAX inclusive
+ * and represent the direction codes of the characters in the text.
+ *
+ * @param types the types array
+ */
+ public BidiOrder(byte[] types) {
+ validateTypes(types);
+
+ this.initialTypes = (byte[])types.clone(); // client type array remains unchanged
+
+ runAlgorithm();
+ }
+
+ /**
+ * Initialize using an array of direction types and an externally supplied paragraph embedding level.
+ * The embedding level may be -1, 0, or 1. -1 means to apply the default algorithm (rules P2 and P3),
+ * 0 is for LTR paragraphs, and 1 is for RTL paragraphs.
+ *
+ * @param types the types array
+ * @param paragraphEmbeddingLevel the externally supplied paragraph embedding level.
+ */
+ public BidiOrder(byte[] types, byte paragraphEmbeddingLevel) {
+ validateTypes(types);
+ validateParagraphEmbeddingLevel(paragraphEmbeddingLevel);
+
+ this.initialTypes = (byte[])types.clone(); // client type array remains unchanged
+ this.paragraphEmbeddingLevel = paragraphEmbeddingLevel;
+
+ runAlgorithm();
+ }
+
+ public BidiOrder(char text[], int offset, int length, byte paragraphEmbeddingLevel) {
+ initialTypes = new byte[length];
+ for (int k = 0; k < length; ++k) {
+ initialTypes[k] = rtypes[text[offset + k]];
+ }
+ validateParagraphEmbeddingLevel(paragraphEmbeddingLevel);
+
+ this.paragraphEmbeddingLevel = paragraphEmbeddingLevel;
+
+ runAlgorithm();
+ }
+
+ public final static byte getDirection(char c) {
+ return rtypes[c];
+ }
+
+ /**
+ * The algorithm.
+ * Does not include line-based processing (Rules L1, L2).
+ * These are applied later in the line-based phase of the algorithm.
+ */
+ private void runAlgorithm() {
+ textLength = initialTypes.length;
+
+ // Initialize output types.
+ // Result types initialized to input types.
+ resultTypes = (byte[])initialTypes.clone();
+
+
+ // 1) determining the paragraph level
+ // Rule P1 is the requirement for entering this algorithm.
+ // Rules P2, P3.
+ // If no externally supplied paragraph embedding level, use default.
+ if (paragraphEmbeddingLevel == -1) {
+ determineParagraphEmbeddingLevel();
+ }
+
+ // Initialize result levels to paragraph embedding level.
+ resultLevels = new byte[textLength];
+ setLevels(0, textLength, paragraphEmbeddingLevel);
+
+ // 2) Explicit levels and directions
+ // Rules X1-X8.
+ determineExplicitEmbeddingLevels();
+
+ // Rule X9.
+ textLength = removeExplicitCodes();
+
+ // Rule X10.
+ // Run remainder of algorithm one level run at a time
+ byte prevLevel = paragraphEmbeddingLevel;
+ int start = 0;
+ while (start < textLength) {
+ byte level = resultLevels[start];
+ byte prevType = typeForLevel(Math.max(prevLevel, level));
+
+ int limit = start + 1;
+ while (limit < textLength && resultLevels[limit] == level) {
+ ++limit;
+ }
+
+ byte succLevel = limit < textLength ? resultLevels[limit] : paragraphEmbeddingLevel;
+ byte succType = typeForLevel(Math.max(succLevel, level));
+
+ // 3) resolving weak types
+ // Rules W1-W7.
+ resolveWeakTypes(start, limit, level, prevType, succType);
+
+ // 4) resolving neutral types
+ // Rules N1-N3.
+ resolveNeutralTypes(start, limit, level, prevType, succType);
+
+ // 5) resolving implicit embedding levels
+ // Rules I1, I2.
+ resolveImplicitLevels(start, limit, level, prevType, succType);
+
+ prevLevel = level;
+ start = limit;
+ }
+
+ // Reinsert explicit codes and assign appropriate levels to 'hide' them.
+ // This is for convenience, so the resulting level array maps 1-1
+ // with the initial array.
+ // See the implementation suggestions section of TR#9 for guidelines on
+ // how to implement the algorithm without removing and reinserting the codes.
+ textLength = reinsertExplicitCodes(textLength);
+ }
+
+ /**
+ * 1) determining the paragraph level.
+ * <p>
+ * Rules P2, P3.
+ * <p>
+ * At the end of this function, the member variable paragraphEmbeddingLevel is set to either 0 or 1.
+ */
+ private void determineParagraphEmbeddingLevel() {
+ byte strongType = -1; // unknown
+
+ // Rule P2.
+ for (int i = 0; i < textLength; ++i) {
+ byte t = resultTypes[i];
+ if (t == L || t == AL || t == R) {
+ strongType = t;
+ break;
+ }
+ }
+
+ // Rule P3.
+ if (strongType == -1) { // none found
+ // default embedding level when no strong types found is 0.
+ paragraphEmbeddingLevel = 0;
+ } else if (strongType == L) {
+ paragraphEmbeddingLevel = 0;
+ } else { // AL, R
+ paragraphEmbeddingLevel = 1;
+ }
+ }
+
+ /**
+ * Process embedding format codes.
+ * <p>
+ * Calls processEmbeddings to generate an embedding array from the explicit format codes. The
+ * embedding overrides in the array are then applied to the result types, and the result levels are
+ * initialized.
+ * @see #processEmbeddings
+ */
+ private void determineExplicitEmbeddingLevels() {
+ embeddings = processEmbeddings(resultTypes, paragraphEmbeddingLevel);
+
+ for (int i = 0; i < textLength; ++i) {
+ byte level = embeddings[i];
+ if ((level & 0x80) != 0) {
+ level &= 0x7f;
+ resultTypes[i] = typeForLevel(level);
+ }
+ resultLevels[i] = level;
+ }
+ }
+
+ /**
+ * Rules X9.
+ * Remove explicit codes so that they may be ignored during the remainder
+ * of the main portion of the algorithm. The length of the resulting text
+ * is returned.
+ * @return the length of the data excluding explicit codes and BN.
+ */
+ private int removeExplicitCodes() {
+ int w = 0;
+ for (int i = 0; i < textLength; ++i) {
+ byte t = initialTypes[i];
+ if (!(t == LRE || t == RLE || t == LRO || t == RLO || t == PDF || t == BN)) {
+ embeddings[w] = embeddings[i];
+ resultTypes[w] = resultTypes[i];
+ resultLevels[w] = resultLevels[i];
+ w++;
+ }
+ }
+ return w; // new textLength while explicit levels are removed
+ }
+
+ /**
+ * Reinsert levels information for explicit codes.
+ * This is for ease of relating the level information
+ * to the original input data. Note that the levels
+ * assigned to these codes are arbitrary, they're
+ * chosen so as to avoid breaking level runs.
+ * @param textLength the length of the data after compression
+ * @return the length of the data (original length of
+ * types array supplied to constructor)
+ */
+ private int reinsertExplicitCodes(int textLength) {
+ for (int i = initialTypes.length; --i >= 0;) {
+ byte t = initialTypes[i];
+ if (t == LRE || t == RLE || t == LRO || t == RLO || t == PDF || t == BN) {
+ embeddings[i] = 0;
+ resultTypes[i] = t;
+ resultLevels[i] = -1;
+ } else {
+ --textLength;
+ embeddings[i] = embeddings[textLength];
+ resultTypes[i] = resultTypes[textLength];
+ resultLevels[i] = resultLevels[textLength];
+ }
+ }
+
+ // now propagate forward the levels information (could have
+ // propagated backward, the main thing is not to introduce a level
+ // break where one doesn't already exist).
+
+ if (resultLevels[0] == -1) {
+ resultLevels[0] = paragraphEmbeddingLevel;
+ }
+ for (int i = 1; i < initialTypes.length; ++i) {
+ if (resultLevels[i] == -1) {
+ resultLevels[i] = resultLevels[i-1];
+ }
+ }
+
+ // Embedding information is for informational purposes only
+ // so need not be adjusted.
+
+ return initialTypes.length;
+ }
+
+ /**
+ * 2) determining explicit levels
+ * Rules X1 - X8
+ *
+ * The interaction of these rules makes handling them a bit complex.
+ * This examines resultTypes but does not modify it. It returns embedding and
+ * override information in the result array. The low 7 bits are the level, the high
+ * bit is set if the level is an override, and clear if it is an embedding.
+ */
+ private static byte[] processEmbeddings(byte[] resultTypes, byte paragraphEmbeddingLevel) {
+ final int EXPLICIT_LEVEL_LIMIT = 62;
+
+ int textLength = resultTypes.length;
+ byte[] embeddings = new byte[textLength];
+
+ // This stack will store the embedding levels and override status in a single byte
+ // as described above.
+ byte[] embeddingValueStack = new byte[EXPLICIT_LEVEL_LIMIT];
+ int stackCounter = 0;
+
+ // An LRE or LRO at level 60 is invalid, since the new level 62 is invalid. But
+ // an RLE at level 60 is valid, since the new level 61 is valid. The current wording
+ // of the rules requires that the RLE remain valid even if a previous LRE is invalid.
+ // This keeps track of ignored LRE or LRO codes at level 60, so that the matching PDFs
+ // will not try to pop the stack.
+ int overflowAlmostCounter = 0;
+
+ // This keeps track of ignored pushes at level 61 or higher, so that matching PDFs will
+ // not try to pop the stack.
+ int overflowCounter = 0;
+
+ // Rule X1.
+
+ // Keep the level separate from the value (level | override status flag) for ease of access.
+ byte currentEmbeddingLevel = paragraphEmbeddingLevel;
+ byte currentEmbeddingValue = paragraphEmbeddingLevel;
+
+ // Loop through types, handling all remaining rules
+ for (int i = 0; i < textLength; ++i) {
+
+ embeddings[i] = currentEmbeddingValue;
+
+ byte t = resultTypes[i];
+
+ // Rules X2, X3, X4, X5
+ switch (t) {
+ case RLE:
+ case LRE:
+ case RLO:
+ case LRO:
+ // Only need to compute new level if current level is valid
+ if (overflowCounter == 0) {
+ byte newLevel;
+ if (t == RLE || t == RLO) {
+ newLevel = (byte)((currentEmbeddingLevel + 1) | 1); // least greater odd
+ } else { // t == LRE || t == LRO
+ newLevel = (byte)((currentEmbeddingLevel + 2) & ~1); // least greater even
+ }
+
+ // If the new level is valid, push old embedding level and override status
+ // No check for valid stack counter, since the level check suffices.
+ if (newLevel < EXPLICIT_LEVEL_LIMIT) {
+ embeddingValueStack[stackCounter] = currentEmbeddingValue;
+ stackCounter++;
+
+ currentEmbeddingLevel = newLevel;
+ if (t == LRO || t == RLO) { // override
+ currentEmbeddingValue = (byte)(newLevel | 0x80);
+ } else {
+ currentEmbeddingValue = newLevel;
+ }
+
+ // Adjust level of format mark (for expositional purposes only, this gets
+ // removed later).
+ embeddings[i] = currentEmbeddingValue;
+ break;
+ }
+
+ // Otherwise new level is invalid, but a valid level can still be achieved if this
+ // level is 60 and we encounter an RLE or RLO further on. So record that we
+ // 'almost' overflowed.
+ if (currentEmbeddingLevel == 60) {
+ overflowAlmostCounter++;
+ break;
+ }
+ }
+
+ // Otherwise old or new level is invalid.
+ overflowCounter++;
+ break;
+
+ case PDF:
+ // The only case where this did not actually overflow but may have almost overflowed
+ // is when there was an RLE or RLO on level 60, which would result in level 61. So we
+ // only test the almost overflow condition in that case.
+ //
+ // Also note that there may be a PDF without any pushes at all.
+
+ if (overflowCounter > 0) {
+ --overflowCounter;
+ } else if (overflowAlmostCounter > 0 && currentEmbeddingLevel != 61) {
+ --overflowAlmostCounter;
+ } else if (stackCounter > 0) {
+ --stackCounter;
+ currentEmbeddingValue = embeddingValueStack[stackCounter];
+ currentEmbeddingLevel = (byte)(currentEmbeddingValue & 0x7f);
+ }
+ break;
+
+ case B:
+ // Rule X8.
+
+ // These values are reset for clarity, in this implementation B can only
+ // occur as the last code in the array.
+ stackCounter = 0;
+ overflowCounter = 0;
+ overflowAlmostCounter = 0;
+ currentEmbeddingLevel = paragraphEmbeddingLevel;
+ currentEmbeddingValue = paragraphEmbeddingLevel;
+
+ embeddings[i] = paragraphEmbeddingLevel;
+ break;
+
+ default:
+ break;
+ }
+ }
+
+ return embeddings;
+ }
+
+
+ /**
+ * 3) resolving weak types
+ * Rules W1-W7.
+ *
+ * Note that some weak types (EN, AN) remain after this processing is complete.
+ */
+ private void resolveWeakTypes(int start, int limit, byte level, byte sor, byte eor) {
+
+ // Rule W1.
+ // Changes all NSMs.
+ byte preceedingCharacterType = sor;
+ for (int i = start; i < limit; ++i) {
+ byte t = resultTypes[i];
+ if (t == NSM) {
+ resultTypes[i] = preceedingCharacterType;
+ } else {
+ preceedingCharacterType = t;
+ }
+ }
+
+ // Rule W2.
+ // EN does not change at the start of the run, because sor != AL.
+ for (int i = start; i < limit; ++i) {
+ if (resultTypes[i] == EN) {
+ for (int j = i - 1; j >= start; --j) {
+ byte t = resultTypes[j];
+ if (t == L || t == R || t == AL) {
+ if (t == AL) {
+ resultTypes[i] = AN;
+ }
+ break;
+ }
+ }
+ }
+ }
+
+ // Rule W3.
+ for (int i = start; i < limit; ++i) {
+ if (resultTypes[i] == AL) {
+ resultTypes[i] = R;
+ }
+ }
+
+ // Rule W4.
+ // Since there must be values on both sides for this rule to have an
+ // effect, the scan skips the first and last value.
+ //
+ // Although the scan proceeds left to right, and changes the type values
+ // in a way that would appear to affect the computations later in the scan,
+ // there is actually no problem. A change in the current value can only
+ // affect the value to its immediate right, and only affect it if it is
+ // ES or CS. But the current value can only change if the value to its
+ // right is not ES or CS. Thus either the current value will not change,
+ // or its change will have no effect on the remainder of the analysis.
+
+ for (int i = start + 1; i < limit - 1; ++i) {
+ if (resultTypes[i] == ES || resultTypes[i] == CS) {
+ byte prevSepType = resultTypes[i-1];
+ byte succSepType = resultTypes[i+1];
+ if (prevSepType == EN && succSepType == EN) {
+ resultTypes[i] = EN;
+ } else if (resultTypes[i] == CS && prevSepType == AN && succSepType == AN) {
+ resultTypes[i] = AN;
+ }
+ }
+ }
+
+ // Rule W5.
+ for (int i = start; i < limit; ++i) {
+ if (resultTypes[i] == ET) {
+ // locate end of sequence
+ int runstart = i;
+ int runlimit = findRunLimit(runstart, limit, new byte[] { ET });
+
+ // check values at ends of sequence
+ byte t = runstart == start ? sor : resultTypes[runstart - 1];
+
+ if (t != EN) {
+ t = runlimit == limit ? eor : resultTypes[runlimit];
+ }
+
+ if (t == EN) {
+ setTypes(runstart, runlimit, EN);
+ }
+
+ // continue at end of sequence
+ i = runlimit;
+ }
+ }
+
+ // Rule W6.
+ for (int i = start; i < limit; ++i) {
+ byte t = resultTypes[i];
+ if (t == ES || t == ET || t == CS) {
+ resultTypes[i] = ON;
+ }
+ }
+
+ // Rule W7.
+ for (int i = start; i < limit; ++i) {
+ if (resultTypes[i] == EN) {
+ // set default if we reach start of run
+ byte prevStrongType = sor;
+ for (int j = i - 1; j >= start; --j) {
+ byte t = resultTypes[j];
+ if (t == L || t == R) { // AL's have been removed
+ prevStrongType = t;
+ break;
+ }
+ }
+ if (prevStrongType == L) {
+ resultTypes[i] = L;
+ }
+ }
+ }
+ }
+
+ /**
+ * 6) resolving neutral types
+ * Rules N1-N2.
+ */
+ private void resolveNeutralTypes(int start, int limit, byte level, byte sor, byte eor) {
+
+ for (int i = start; i < limit; ++i) {
+ byte t = resultTypes[i];
+ if (t == WS || t == ON || t == B || t == S) {
+ // find bounds of run of neutrals
+ int runstart = i;
+ int runlimit = findRunLimit(runstart, limit, new byte[] {B, S, WS, ON});
+
+ // determine effective types at ends of run
+ byte leadingType;
+ byte trailingType;
+
+ if (runstart == start) {
+ leadingType = sor;
+ } else {
+ leadingType = resultTypes[runstart - 1];
+ if (leadingType == L || leadingType == R) {
+ // found the strong type
+ } else if (leadingType == AN) {
+ leadingType = R;
+ } else if (leadingType == EN) {
+ // Since EN's with previous strong L types have been changed
+ // to L in W7, the leadingType must be R.
+ leadingType = R;
+ }
+ }
+
+ if (runlimit == limit) {
+ trailingType = eor;
+ } else {
+ trailingType = resultTypes[runlimit];
+ if (trailingType == L || trailingType == R) {
+ // found the strong type
+ } else if (trailingType == AN) {
+ trailingType = R;
+ } else if (trailingType == EN) {
+ trailingType = R;
+ }
+ }
+
+ byte resolvedType;
+ if (leadingType == trailingType) {
+ // Rule N1.
+ resolvedType = leadingType;
+ } else {
+ // Rule N2.
+ // Notice the embedding level of the run is used, not
+ // the paragraph embedding level.
+ resolvedType = typeForLevel(level);
+ }
+
+ setTypes(runstart, runlimit, resolvedType);
+
+ // skip over run of (former) neutrals
+ i = runlimit;
+ }
+ }
+ }
+
+ /**
+ * 7) resolving implicit embedding levels
+ * Rules I1, I2.
+ */
+ private void resolveImplicitLevels(int start, int limit, byte level, byte sor, byte eor) {
+ if ((level & 1) == 0) { // even level
+ for (int i = start; i < limit; ++i) {
+ byte t = resultTypes[i];
+ // Rule I1.
+ if (t == L ) {
+ // no change
+ } else if (t == R) {
+ resultLevels[i] += 1;
+ } else { // t == AN || t == EN
+ resultLevels[i] += 2;
+ }
+ }
+ } else { // odd level
+ for (int i = start; i < limit; ++i) {
+ byte t = resultTypes[i];
+ // Rule I2.
+ if (t == R) {
+ // no change
+ } else { // t == L || t == AN || t == EN
+ resultLevels[i] += 1;
+ }
+ }
+ }
+ }
+
+ //
+ // Output
+ //
+
+ public byte[] getLevels() {
+ return getLevels(new int[]{textLength});
+ }
+
+ /**
+ * Return levels array breaking lines at offsets in linebreaks. <br>
+ * Rule L1.
+ * <p>
+ * The returned levels array contains the resolved level for each
+ * bidi code passed to the constructor.
+ * <p>
+ * The linebreaks array must include at least one value.
+ * The values must be in strictly increasing order (no duplicates)
+ * between 1 and the length of the text, inclusive. The last value
+ * must be the length of the text.
+ *
+ * @param linebreaks the offsets at which to break the paragraph
+ * @return the resolved levels of the text
+ */
+ public byte[] getLevels(int[] linebreaks) {
+
+ // Note that since the previous processing has removed all
+ // P, S, and WS values from resultTypes, the values referred to
+ // in these rules are the initial types, before any processing
+ // has been applied (including processing of overrides).
+ //
+ // This example implementation has reinserted explicit format codes
+ // and BN, in order that the levels array correspond to the
+ // initial text. Their final placement is not normative.
+ // These codes are treated like WS in this implementation,
+ // so they don't interrupt sequences of WS.
+
+ validateLineBreaks(linebreaks, textLength);
+
+ byte[] result = (byte[])resultLevels.clone(); // will be returned to caller
+
+ // don't worry about linebreaks since if there is a break within
+ // a series of WS values preceeding S, the linebreak itself
+ // causes the reset.
+ for (int i = 0; i < result.length; ++i) {
+ byte t = initialTypes[i];
+ if (t == B || t == S) {
+ // Rule L1, clauses one and two.
+ result[i] = paragraphEmbeddingLevel;
+
+ // Rule L1, clause three.
+ for (int j = i - 1; j >= 0; --j) {
+ if (isWhitespace(initialTypes[j])) { // including format codes
+ result[j] = paragraphEmbeddingLevel;
+ } else {
+ break;
+ }
+ }
+ }
+ }
+
+ // Rule L1, clause four.
+ int start = 0;
+ for (int i = 0; i < linebreaks.length; ++i) {
+ int limit = linebreaks[i];
+ for (int j = limit - 1; j >= start; --j) {
+ if (isWhitespace(initialTypes[j])) { // including format codes
+ result[j] = paragraphEmbeddingLevel;
+ } else {
+ break;
+ }
+ }
+
+ start = limit;
+ }
+
+ return result;
+ }
+
+ /**
+ * Return reordering array breaking lines at offsets in linebreaks.
+ * <p>
+ * The reordering array maps from a visual index to a logical index.
+ * Lines are concatenated from left to right. So for example, the
+ * fifth character from the left on the third line is
+ * <pre> getReordering(linebreaks)[linebreaks[1] + 4]</pre>
+ * (linebreaks[1] is the position after the last character of the
+ * second line, which is also the index of the first character on the
+ * third line, and adding four gets the fifth character from the left).
+ * <p>
+ * The linebreaks array must include at least one value.
+ * The values must be in strictly increasing order (no duplicates)
+ * between 1 and the length of the text, inclusive. The last value
+ * must be the length of the text.
+ *
+ * @param linebreaks the offsets at which to break the paragraph.
+ */
+ public int[] getReordering(int[] linebreaks) {
+ validateLineBreaks(linebreaks, textLength);
+
+ byte[] levels = getLevels(linebreaks);
+
+ return computeMultilineReordering(levels, linebreaks);
+ }
+
+ /**
+ * Return multiline reordering array for a given level array.
+ * Reordering does not occur across a line break.
+ */
+ private static int[] computeMultilineReordering(byte[] levels, int[] linebreaks) {
+ int[] result = new int[levels.length];
+
+ int start = 0;
+ for (int i = 0; i < linebreaks.length; ++i) {
+ int limit = linebreaks[i];
+
+ byte[] templevels = new byte[limit - start];
+ System.arraycopy(levels, start, templevels, 0, templevels.length);
+
+ int[] temporder = computeReordering(templevels);
+ for (int j = 0; j < temporder.length; ++j) {
+ result[start + j] = temporder[j] + start;
+ }
+
+ start = limit;
+ }
+
+ return result;
+ }
+
+ /**
+ * Return reordering array for a given level array. This reorders a single line.
+ * The reordering is a visual to logical map. For example,
+ * the leftmost char is string.charAt(order[0]).
+ * Rule L2.
+ */
+ private static int[] computeReordering(byte[] levels) {
+ int lineLength = levels.length;
+
+ int[] result = new int[lineLength];
+
+ // initialize order
+ for (int i = 0; i < lineLength; ++i) {
+ result[i] = i;
+ }
+
+ // locate highest level found on line.
+ // Note the rules say text, but no reordering across line bounds is performed,
+ // so this is sufficient.
+ byte highestLevel = 0;
+ byte lowestOddLevel = 63;
+ for (int i = 0; i < lineLength; ++i) {
+ byte level = levels[i];
+ if (level > highestLevel) {
+ highestLevel = level;
+ }
+ if (((level & 1) != 0) && level < lowestOddLevel) {
+ lowestOddLevel = level;
+ }
+ }
+
+ for (int level = highestLevel; level >= lowestOddLevel; --level) {
+ for (int i = 0; i < lineLength; ++i) {
+ if (levels[i] >= level) {
+ // find range of text at or above this level
+ int start = i;
+ int limit = i + 1;
+ while (limit < lineLength && levels[limit] >= level) {
+ ++limit;
+ }
+
+ // reverse run
+ for (int j = start, k = limit - 1; j < k; ++j, --k) {
+ int temp = result[j];
+ result[j] = result[k];
+ result[k] = temp;
+ }
+
+ // skip to end of level run
+ i = limit;
+ }
+ }
+ }
+
+ return result;
+ }
+
+ /**
+ * Return the base level of the paragraph.
+ */
+ public byte getBaseLevel() {
+ return paragraphEmbeddingLevel;
+ }
+
+ // --- internal utilities -------------------------------------------------
+
+ /**
+ * Return true if the type is considered a whitespace type for the line break rules.
+ */
+ private static boolean isWhitespace(byte biditype) {
+ switch (biditype) {
+ case LRE:
+ case RLE:
+ case LRO:
+ case RLO:
+ case PDF:
+ case BN:
+ case WS:
+ return true;
+ default:
+ return false;
+ }
+ }
+
+ /**
+ * Return the strong type (L or R) corresponding to the level.
+ */
+ private static byte typeForLevel(int level) {
+ return ((level & 0x1) == 0) ? L : R;
+ }
+
+ /**
+ * Return the limit of the run starting at index that includes only resultTypes in validSet.
+ * This checks the value at index, and will return index if that value is not in validSet.
+ */
+ private int findRunLimit(int index, int limit, byte[] validSet) {
+ --index;
+ loop:
+ while (++index < limit) {
+ byte t = resultTypes[index];
+ for (int i = 0; i < validSet.length; ++i) {
+ if (t == validSet[i]) {
+ continue loop;
+ }
+ }
+ // didn't find a match in validSet
+ return index;
+ }
+ return limit;
+ }
+
+ /**
+ * Return the start of the run including index that includes only resultTypes in validSet.
+ * This assumes the value at index is valid, and does not check it.
+ */
+ private int findRunStart(int index, byte[] validSet) {
+ loop:
+ while (--index >= 0) {
+ byte t = resultTypes[index];
+ for (int i = 0; i < validSet.length; ++i) {
+ if (t == validSet[i]) {
+ continue loop;
+ }
+ }
+ return index + 1;
+ }
+ return 0;
+ }
+
+ /**
+ * Set resultTypes from start up to (but not including) limit to newType.
+ */
+ private void setTypes(int start, int limit, byte newType) {
+ for (int i = start; i < limit; ++i) {
+ resultTypes[i] = newType;
+ }
+ }
+
+ /**
+ * Set resultLevels from start up to (but not including) limit to newLevel.
+ */
+ private void setLevels(int start, int limit, byte newLevel) {
+ for (int i = start; i < limit; ++i) {
+ resultLevels[i] = newLevel;
+ }
+ }
+
+ // --- input validation ---------------------------------------------------
+
+ /**
+ * Throw exception if type array is invalid.
+ */
+ private static void validateTypes(byte[] types) {
+ if (types == null) {
+ throw new IllegalArgumentException("types is null");
+ }
+ for (int i = 0; i < types.length; ++i) {
+ if (types[i] < TYPE_MIN || types[i] > TYPE_MAX) {
+ throw new IllegalArgumentException("illegal type value at " + i + ": " + types[i]);
+ }
+ }
+ for (int i = 0; i < types.length - 1; ++i) {
+ if (types[i] == B) {
+ throw new IllegalArgumentException("B type before end of paragraph at index: " + i);
+ }
+ }
+ }
+
+ /**
+ * Throw exception if paragraph embedding level is invalid. Special allowance for -1 so that
+ * default processing can still be performed when using this API.
+ */
+ private static void validateParagraphEmbeddingLevel(byte paragraphEmbeddingLevel) {
+ if (paragraphEmbeddingLevel != -1 &&
+ paragraphEmbeddingLevel != 0 &&
+ paragraphEmbeddingLevel != 1) {
+ throw new IllegalArgumentException("illegal paragraph embedding level: " + paragraphEmbeddingLevel);
+ }
+ }
+
+ /**
+ * Throw exception if line breaks array is invalid.
+ */
+ private static void validateLineBreaks(int[] linebreaks, int textLength) {
+ int prev = 0;
+ for (int i = 0; i < linebreaks.length; ++i) {
+ int next = linebreaks[i];
+ if (next <= prev) {
+ throw new IllegalArgumentException("bad linebreak: " + next + " at index: " + i);
+ }
+ prev = next;
+ }
+ if (prev != textLength) {
+ throw new IllegalArgumentException("last linebreak must be at " + textLength);
+ }
+ }
+
+ private static final byte rtypes[] = new byte[0x10000];
+
+ private static char baseTypes[] = {
+ 0, 8, (char)BN, 9, 9, (char)S, 10, 10, (char)B, 11, 11, (char)S, 12, 12, (char)WS, 13, 13, (char)B,
+ 14, 27, (char)BN, 28, 30, (char)B, 31, 31, (char)S, 32, 32, (char)WS, 33, 34, (char)ON, 35, 37, (char)ET,
+ 38, 42, (char)ON, 43, 43, (char)ET, 44, 44, (char)CS, 45, 45, (char)ET, 46, 46, (char)CS, 47, 47, (char)ES,
+ 48, 57, (char)EN, 58, 58, (char)CS, 59, 64, (char)ON, 65, 90, (char)L, 91, 96, (char)ON, 97, 122, (char)L,
+ 123, 126, (char)ON, 127, 132, (char)BN, 133, 133, (char)B, 134, 159, (char)BN, 160, 160, (char)CS,
+ 161, 161, (char)ON, 162, 165, (char)ET, 166, 169, (char)ON, 170, 170, (char)L, 171, 175, (char)ON,
+ 176, 177, (char)ET, 178, 179, (char)EN, 180, 180, (char)ON, 181, 181, (char)L, 182, 184, (char)ON,
+ 185, 185, (char)EN, 186, 186, (char)L, 187, 191, (char)ON, 192, 214, (char)L, 215, 215, (char)ON,
+ 216, 246, (char)L, 247, 247, (char)ON, 248, 696, (char)L, 697, 698, (char)ON, 699, 705, (char)L,
+ 706, 719, (char)ON, 720, 721, (char)L, 722, 735, (char)ON, 736, 740, (char)L, 741, 749, (char)ON,
+ 750, 750, (char)L, 751, 767, (char)ON, 768, 855, (char)NSM, 856, 860, (char)L, 861, 879, (char)NSM,
+ 880, 883, (char)L, 884, 885, (char)ON, 886, 893, (char)L, 894, 894, (char)ON, 895, 899, (char)L,
+ 900, 901, (char)ON, 902, 902, (char)L, 903, 903, (char)ON, 904, 1013, (char)L, 1014, 1014, (char)ON,
+ 1015, 1154, (char)L, 1155, 1158, (char)NSM, 1159, 1159, (char)L, 1160, 1161, (char)NSM,
+ 1162, 1417, (char)L, 1418, 1418, (char)ON, 1419, 1424, (char)L, 1425, 1441, (char)NSM,
+ 1442, 1442, (char)L, 1443, 1465, (char)NSM, 1466, 1466, (char)L, 1467, 1469, (char)NSM,
+ 1470, 1470, (char)R, 1471, 1471, (char)NSM, 1472, 1472, (char)R, 1473, 1474, (char)NSM,
+ 1475, 1475, (char)R, 1476, 1476, (char)NSM, 1477, 1487, (char)L, 1488, 1514, (char)R,
+ 1515, 1519, (char)L, 1520, 1524, (char)R, 1525, 1535, (char)L, 1536, 1539, (char)AL,
+ 1540, 1547, (char)L, 1548, 1548, (char)CS, 1549, 1549, (char)AL, 1550, 1551, (char)ON,
+ 1552, 1557, (char)NSM, 1558, 1562, (char)L, 1563, 1563, (char)AL, 1564, 1566, (char)L,
+ 1567, 1567, (char)AL, 1568, 1568, (char)L, 1569, 1594, (char)AL, 1595, 1599, (char)L,
+ 1600, 1610, (char)AL, 1611, 1624, (char)NSM, 1625, 1631, (char)L, 1632, 1641, (char)AN,
+ 1642, 1642, (char)ET, 1643, 1644, (char)AN, 1645, 1647, (char)AL, 1648, 1648, (char)NSM,
+ 1649, 1749, (char)AL, 1750, 1756, (char)NSM, 1757, 1757, (char)AL, 1758, 1764, (char)NSM,
+ 1765, 1766, (char)AL, 1767, 1768, (char)NSM, 1769, 1769, (char)ON, 1770, 1773, (char)NSM,
+ 1774, 1775, (char)AL, 1776, 1785, (char)EN, 1786, 1805, (char)AL, 1806, 1806, (char)L,
+ 1807, 1807, (char)BN, 1808, 1808, (char)AL, 1809, 1809, (char)NSM, 1810, 1839, (char)AL,
+ 1840, 1866, (char)NSM, 1867, 1868, (char)L, 1869, 1871, (char)AL, 1872, 1919, (char)L,
+ 1920, 1957, (char)AL, 1958, 1968, (char)NSM, 1969, 1969, (char)AL, 1970, 2304, (char)L,
+ 2305, 2306, (char)NSM, 2307, 2363, (char)L, 2364, 2364, (char)NSM, 2365, 2368, (char)L,
+ 2369, 2376, (char)NSM, 2377, 2380, (char)L, 2381, 2381, (char)NSM, 2382, 2384, (char)L,
+ 2385, 2388, (char)NSM, 2389, 2401, (char)L, 2402, 2403, (char)NSM, 2404, 2432, (char)L,
+ 2433, 2433, (char)NSM, 2434, 2491, (char)L, 2492, 2492, (char)NSM, 2493, 2496, (char)L,
+ 2497, 2500, (char)NSM, 2501, 2508, (char)L, 2509, 2509, (char)NSM, 2510, 2529, (char)L,
+ 2530, 2531, (char)NSM, 2532, 2545, (char)L, 2546, 2547, (char)ET, 2548, 2560, (char)L,
+ 2561, 2562, (char)NSM, 2563, 2619, (char)L, 2620, 2620, (char)NSM, 2621, 2624, (char)L,
+ 2625, 2626, (char)NSM, 2627, 2630, (char)L, 2631, 2632, (char)NSM, 2633, 2634, (char)L,
+ 2635, 2637, (char)NSM, 2638, 2671, (char)L, 2672, 2673, (char)NSM, 2674, 2688, (char)L,
+ 2689, 2690, (char)NSM, 2691, 2747, (char)L, 2748, 2748, (char)NSM, 2749, 2752, (char)L,
+ 2753, 2757, (char)NSM, 2758, 2758, (char)L, 2759, 2760, (char)NSM, 2761, 2764, (char)L,
+ 2765, 2765, (char)NSM, 2766, 2785, (char)L, 2786, 2787, (char)NSM, 2788, 2800, (char)L,
+ 2801, 2801, (char)ET, 2802, 2816, (char)L, 2817, 2817, (char)NSM, 2818, 2875, (char)L,
+ 2876, 2876, (char)NSM, 2877, 2878, (char)L, 2879, 2879, (char)NSM, 2880, 2880, (char)L,
+ 2881, 2883, (char)NSM, 2884, 2892, (char)L, 2893, 2893, (char)NSM, 2894, 2901, (char)L,
+ 2902, 2902, (char)NSM, 2903, 2945, (char)L, 2946, 2946, (char)NSM, 2947, 3007, (char)L,
+ 3008, 3008, (char)NSM, 3009, 3020, (char)L, 3021, 3021, (char)NSM, 3022, 3058, (char)L,
+ 3059, 3064, (char)ON, 3065, 3065, (char)ET, 3066, 3066, (char)ON, 3067, 3133, (char)L,
+ 3134, 3136, (char)NSM, 3137, 3141, (char)L, 3142, 3144, (char)NSM, 3145, 3145, (char)L,
+ 3146, 3149, (char)NSM, 3150, 3156, (char)L, 3157, 3158, (char)NSM, 3159, 3259, (char)L,
+ 3260, 3260, (char)NSM, 3261, 3275, (char)L, 3276, 3277, (char)NSM, 3278, 3392, (char)L,
+ 3393, 3395, (char)NSM, 3396, 3404, (char)L, 3405, 3405, (char)NSM, 3406, 3529, (char)L,
+ 3530, 3530, (char)NSM, 3531, 3537, (char)L, 3538, 3540, (char)NSM, 3541, 3541, (char)L,
+ 3542, 3542, (char)NSM, 3543, 3632, (char)L, 3633, 3633, (char)NSM, 3634, 3635, (char)L,
+ 3636, 3642, (char)NSM, 3643, 3646, (char)L, 3647, 3647, (char)ET, 3648, 3654, (char)L,
+ 3655, 3662, (char)NSM, 3663, 3760, (char)L, 3761, 3761, (char)NSM, 3762, 3763, (char)L,
+ 3764, 3769, (char)NSM, 3770, 3770, (char)L, 3771, 3772, (char)NSM, 3773, 3783, (char)L,
+ 3784, 3789, (char)NSM, 3790, 3863, (char)L, 3864, 3865, (char)NSM, 3866, 3892, (char)L,
+ 3893, 3893, (char)NSM, 3894, 3894, (char)L, 3895, 3895, (char)NSM, 3896, 3896, (char)L,
+ 3897, 3897, (char)NSM, 3898, 3901, (char)ON, 3902, 3952, (char)L, 3953, 3966, (char)NSM,
+ 3967, 3967, (char)L, 3968, 3972, (char)NSM, 3973, 3973, (char)L, 3974, 3975, (char)NSM,
+ 3976, 3983, (char)L, 3984, 3991, (char)NSM, 3992, 3992, (char)L, 3993, 4028, (char)NSM,
+ 4029, 4037, (char)L, 4038, 4038, (char)NSM, 4039, 4140, (char)L, 4141, 4144, (char)NSM,
+ 4145, 4145, (char)L, 4146, 4146, (char)NSM, 4147, 4149, (char)L, 4150, 4151, (char)NSM,
+ 4152, 4152, (char)L, 4153, 4153, (char)NSM, 4154, 4183, (char)L, 4184, 4185, (char)NSM,
+ 4186, 5759, (char)L, 5760, 5760, (char)WS, 5761, 5786, (char)L, 5787, 5788, (char)ON,
+ 5789, 5905, (char)L, 5906, 5908, (char)NSM, 5909, 5937, (char)L, 5938, 5940, (char)NSM,
+ 5941, 5969, (char)L, 5970, 5971, (char)NSM, 5972, 6001, (char)L, 6002, 6003, (char)NSM,
+ 6004, 6070, (char)L, 6071, 6077, (char)NSM, 6078, 6085, (char)L, 6086, 6086, (char)NSM,
+ 6087, 6088, (char)L, 6089, 6099, (char)NSM, 6100, 6106, (char)L, 6107, 6107, (char)ET,
+ 6108, 6108, (char)L, 6109, 6109, (char)NSM, 6110, 6127, (char)L, 6128, 6137, (char)ON,
+ 6138, 6143, (char)L, 6144, 6154, (char)ON, 6155, 6157, (char)NSM, 6158, 6158, (char)WS,
+ 6159, 6312, (char)L, 6313, 6313, (char)NSM, 6314, 6431, (char)L, 6432, 6434, (char)NSM,
+ 6435, 6438, (char)L, 6439, 6443, (char)NSM, 6444, 6449, (char)L, 6450, 6450, (char)NSM,
+ 6451, 6456, (char)L, 6457, 6459, (char)NSM, 6460, 6463, (char)L, 6464, 6464, (char)ON,
+ 6465, 6467, (char)L, 6468, 6469, (char)ON, 6470, 6623, (char)L, 6624, 6655, (char)ON,
+ 6656, 8124, (char)L, 8125, 8125, (char)ON, 8126, 8126, (char)L, 8127, 8129, (char)ON,
+ 8130, 8140, (char)L, 8141, 8143, (char)ON, 8144, 8156, (char)L, 8157, 8159, (char)ON,
+ 8160, 8172, (char)L, 8173, 8175, (char)ON, 8176, 8188, (char)L, 8189, 8190, (char)ON,
+ 8191, 8191, (char)L, 8192, 8202, (char)WS, 8203, 8205, (char)BN, 8206, 8206, (char)L,
+ 8207, 8207, (char)R, 8208, 8231, (char)ON, 8232, 8232, (char)WS, 8233, 8233, (char)B,
+ 8234, 8234, (char)LRE, 8235, 8235, (char)RLE, 8236, 8236, (char)PDF, 8237, 8237, (char)LRO,
+ 8238, 8238, (char)RLO, 8239, 8239, (char)WS, 8240, 8244, (char)ET, 8245, 8276, (char)ON,
+ 8277, 8278, (char)L, 8279, 8279, (char)ON, 8280, 8286, (char)L, 8287, 8287, (char)WS,
+ 8288, 8291, (char)BN, 8292, 8297, (char)L, 8298, 8303, (char)BN, 8304, 8304, (char)EN,
+ 8305, 8307, (char)L, 8308, 8313, (char)EN, 8314, 8315, (char)ET, 8316, 8318, (char)ON,
+ 8319, 8319, (char)L, 8320, 8329, (char)EN, 8330, 8331, (char)ET, 8332, 8334, (char)ON,
+ 8335, 8351, (char)L, 8352, 8369, (char)ET, 8370, 8399, (char)L, 8400, 8426, (char)NSM,
+ 8427, 8447, (char)L, 8448, 8449, (char)ON, 8450, 8450, (char)L, 8451, 8454, (char)ON,
+ 8455, 8455, (char)L, 8456, 8457, (char)ON, 8458, 8467, (char)L, 8468, 8468, (char)ON,
+ 8469, 8469, (char)L, 8470, 8472, (char)ON, 8473, 8477, (char)L, 8478, 8483, (char)ON,
+ 8484, 8484, (char)L, 8485, 8485, (char)ON, 8486, 8486, (char)L, 8487, 8487, (char)ON,
+ 8488, 8488, (char)L, 8489, 8489, (char)ON, 8490, 8493, (char)L, 8494, 8494, (char)ET,
+ 8495, 8497, (char)L, 8498, 8498, (char)ON, 8499, 8505, (char)L, 8506, 8507, (char)ON,
+ 8508, 8511, (char)L, 8512, 8516, (char)ON, 8517, 8521, (char)L, 8522, 8523, (char)ON,
+ 8524, 8530, (char)L, 8531, 8543, (char)ON, 8544, 8591, (char)L, 8592, 8721, (char)ON,
+ 8722, 8723, (char)ET, 8724, 9013, (char)ON, 9014, 9082, (char)L, 9083, 9108, (char)ON,
+ 9109, 9109, (char)L, 9110, 9168, (char)ON, 9169, 9215, (char)L, 9216, 9254, (char)ON,
+ 9255, 9279, (char)L, 9280, 9290, (char)ON, 9291, 9311, (char)L, 9312, 9371, (char)EN,
+ 9372, 9449, (char)L, 9450, 9450, (char)EN, 9451, 9751, (char)ON, 9752, 9752, (char)L,
+ 9753, 9853, (char)ON, 9854, 9855, (char)L, 9856, 9873, (char)ON, 9874, 9887, (char)L,
+ 9888, 9889, (char)ON, 9890, 9984, (char)L, 9985, 9988, (char)ON, 9989, 9989, (char)L,
+ 9990, 9993, (char)ON, 9994, 9995, (char)L, 9996, 10023, (char)ON, 10024, 10024, (char)L,
+ 10025, 10059, (char)ON, 10060, 10060, (char)L, 10061, 10061, (char)ON, 10062, 10062, (char)L,
+ 10063, 10066, (char)ON, 10067, 10069, (char)L, 10070, 10070, (char)ON, 10071, 10071, (char)L,
+ 10072, 10078, (char)ON, 10079, 10080, (char)L, 10081, 10132, (char)ON, 10133, 10135, (char)L,
+ 10136, 10159, (char)ON, 10160, 10160, (char)L, 10161, 10174, (char)ON, 10175, 10191, (char)L,
+ 10192, 10219, (char)ON, 10220, 10223, (char)L, 10224, 11021, (char)ON, 11022, 11903, (char)L,
+ 11904, 11929, (char)ON, 11930, 11930, (char)L, 11931, 12019, (char)ON, 12020, 12031, (char)L,
+ 12032, 12245, (char)ON, 12246, 12271, (char)L, 12272, 12283, (char)ON, 12284, 12287, (char)L,
+ 12288, 12288, (char)WS, 12289, 12292, (char)ON, 12293, 12295, (char)L, 12296, 12320, (char)ON,
+ 12321, 12329, (char)L, 12330, 12335, (char)NSM, 12336, 12336, (char)ON, 12337, 12341, (char)L,
+ 12342, 12343, (char)ON, 12344, 12348, (char)L, 12349, 12351, (char)ON, 12352, 12440, (char)L,
+ 12441, 12442, (char)NSM, 12443, 12444, (char)ON, 12445, 12447, (char)L, 12448, 12448, (char)ON,
+ 12449, 12538, (char)L, 12539, 12539, (char)ON, 12540, 12828, (char)L, 12829, 12830, (char)ON,
+ 12831, 12879, (char)L, 12880, 12895, (char)ON, 12896, 12923, (char)L, 12924, 12925, (char)ON,
+ 12926, 12976, (char)L, 12977, 12991, (char)ON, 12992, 13003, (char)L, 13004, 13007, (char)ON,
+ 13008, 13174, (char)L, 13175, 13178, (char)ON, 13179, 13277, (char)L, 13278, 13279, (char)ON,
+ 13280, 13310, (char)L, 13311, 13311, (char)ON, 13312, 19903, (char)L, 19904, 19967, (char)ON,
+ 19968, 42127, (char)L, 42128, 42182, (char)ON, 42183, 64284, (char)L, 64285, 64285, (char)R,
+ 64286, 64286, (char)NSM, 64287, 64296, (char)R, 64297, 64297, (char)ET, 64298, 64310, (char)R,
+ 64311, 64311, (char)L, 64312, 64316, (char)R, 64317, 64317, (char)L, 64318, 64318, (char)R,
+ 64319, 64319, (char)L, 64320, 64321, (char)R, 64322, 64322, (char)L, 64323, 64324, (char)R,
+ 64325, 64325, (char)L, 64326, 64335, (char)R, 64336, 64433, (char)AL, 64434, 64466, (char)L,
+ 64467, 64829, (char)AL, 64830, 64831, (char)ON, 64832, 64847, (char)L, 64848, 64911, (char)AL,
+ 64912, 64913, (char)L, 64914, 64967, (char)AL, 64968, 65007, (char)L, 65008, 65020, (char)AL,
+ 65021, 65021, (char)ON, 65022, 65023, (char)L, 65024, 65039, (char)NSM, 65040, 65055, (char)L,
+ 65056, 65059, (char)NSM, 65060, 65071, (char)L, 65072, 65103, (char)ON, 65104, 65104, (char)CS,
+ 65105, 65105, (char)ON, 65106, 65106, (char)CS, 65107, 65107, (char)L, 65108, 65108, (char)ON,
+ 65109, 65109, (char)CS, 65110, 65118, (char)ON, 65119, 65119, (char)ET, 65120, 65121, (char)ON,
+ 65122, 65123, (char)ET, 65124, 65126, (char)ON, 65127, 65127, (char)L, 65128, 65128, (char)ON,
+ 65129, 65130, (char)ET, 65131, 65131, (char)ON, 65132, 65135, (char)L, 65136, 65140, (char)AL,
+ 65141, 65141, (char)L, 65142, 65276, (char)AL, 65277, 65278, (char)L, 65279, 65279, (char)BN,
+ 65280, 65280, (char)L, 65281, 65282, (char)ON, 65283, 65285, (char)ET, 65286, 65290, (char)ON,
+ 65291, 65291, (char)ET, 65292, 65292, (char)CS, 65293, 65293, (char)ET, 65294, 65294, (char)CS,
+ 65295, 65295, (char)ES, 65296, 65305, (char)EN, 65306, 65306, (char)CS, 65307, 65312, (char)ON,
+ 65313, 65338, (char)L, 65339, 65344, (char)ON, 65345, 65370, (char)L, 65371, 65381, (char)ON,
+ 65382, 65503, (char)L, 65504, 65505, (char)ET, 65506, 65508, (char)ON, 65509, 65510, (char)ET,
+ 65511, 65511, (char)L, 65512, 65518, (char)ON, 65519, 65528, (char)L, 65529, 65531, (char)BN,
+ 65532, 65533, (char)ON, 65534, 65535, (char)L};
+
+ static {
+ for (int k = 0; k < baseTypes.length; ++k) {
+ int start = baseTypes[k];
+ int end = baseTypes[++k];
+ byte b = (byte)baseTypes[++k];
+ while (start <= end)
+ rtypes[start++] = b;
+ }
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/pdf/ByteBuffer.java b/src/main/java/com/lowagie/text/pdf/ByteBuffer.java
new file mode 100644
index 0000000..695d4c5
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/ByteBuffer.java
@@ -0,0 +1,623 @@
+/*
+ * $Id: ByteBuffer.java,v 1.69 2006/01/31 18:05:22 psoares33 Exp $
+ * $Name: $
+ *
+ * Copyright 2000, 2001, 2002 by Paulo Soares.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf;
+import java.io.UnsupportedEncodingException;
+import java.io.OutputStream;
+import java.io.IOException;
+import com.lowagie.text.DocWriter;
+import java.text.DecimalFormat;
+import java.text.DecimalFormatSymbols;
+import java.util.Locale;
+
+/**
+ * Acts like a <CODE>StringBuffer</CODE> but works with <CODE>byte</CODE> arrays.
+ * Floating point is converted to a format suitable to the PDF.
+ * @author Paulo Soares (psoares@consiste.pt)
+ */
+
+public class ByteBuffer extends OutputStream {
+ /** The count of bytes in the buffer. */
+ protected int count;
+
+ /** The buffer where the bytes are stored. */
+ protected byte buf[];
+
+ private static int byteCacheSize = 0;
+
+ private static byte[][] byteCache = new byte[byteCacheSize][];
+ public static byte ZERO = (byte)'0';
+ private static final char[] chars = new char[] {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
+ private static final byte[] bytes = new byte[] {48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102};
+ /**
+ * If <CODE>true</CODE> always output floating point numbers with 6 decimal digits.
+ * If <CODE>false</CODE> uses the faster, although less precise, representation.
+ */
+ public static boolean HIGH_PRECISION = false;
+ private static final DecimalFormatSymbols dfs = new DecimalFormatSymbols(Locale.US);
+
+ /** Creates new ByteBuffer with capacity 128 */
+ public ByteBuffer() {
+ this(128);
+ }
+
+ /**
+ * Creates a byte buffer with a certain capacity.
+ * @param size the initial capacity
+ */
+ public ByteBuffer(int size) {
+ if (size < 1)
+ size = 128;
+ buf = new byte[size];
+ }
+
+ /**
+ * Sets the cache size.
+ * <P>
+ * This can only be used to increment the size.
+ * If the size that is passed through is smaller than the current size, nothing happens.
+ *
+ * @param size the size of the cache
+ */
+
+ public static void setCacheSize(int size) {
+ if (size > 3276700) size = 3276700;
+ if (size <= byteCacheSize) return;
+ byte[][] tmpCache = new byte[size][];
+ for (int i = 0; i < byteCacheSize; i++) {
+ tmpCache[i] = byteCache[i];
+ }
+ byteCache = tmpCache;
+ byteCacheSize = size;
+ }
+
+ /**
+ * You can fill the cache in advance if you want to.
+ *
+ * @param decimals
+ */
+
+ public static void fillCache(int decimals) {
+ int step = 1;
+ switch(decimals) {
+ case 0:
+ step = 100;
+ break;
+ case 1:
+ step = 10;
+ break;
+ }
+ for (int i = 1; i < byteCacheSize; i += step) {
+ if (byteCache[i] != null) continue;
+ byteCache[i] = convertToBytes(i);
+ }
+ }
+
+ /**
+ * Converts an double (multiplied by 100 and cast to an int) into an array of bytes.
+ *
+ * @param i the int
+ * @return a bytearray
+ */
+
+ private static byte[] convertToBytes(int i) {
+ int size = (int)Math.floor(Math.log(i) / Math.log(10));
+ if (i % 100 != 0) {
+ size += 2;
+ }
+ if (i % 10 != 0) {
+ size++;
+ }
+ if (i < 100) {
+ size++;
+ if (i < 10) {
+ size++;
+ }
+ }
+ size--;
+ byte[] cache = new byte[size];
+ size --;
+ if (i < 100) {
+ cache[0] = (byte)'0';
+ }
+ if (i % 10 != 0) {
+ cache[size--] = bytes[i % 10];
+ }
+ if (i % 100 != 0) {
+ cache[size--] = bytes[(i / 10) % 10];
+ cache[size--] = (byte)'.';
+ }
+ size = (int)Math.floor(Math.log(i) / Math.log(10)) - 1;
+ int add = 0;
+ while (add < size) {
+ cache[add] = bytes[(i / (int)Math.pow(10, size - add + 1)) % 10];
+ add++;
+ }
+ return cache;
+ }
+
+ /**
+ * Appends an <CODE>int</CODE>. The size of the array will grow by one.
+ * @param b the int to be appended
+ * @return a reference to this <CODE>ByteBuffer</CODE> object
+ */
+ public ByteBuffer append_i(int b) {
+ int newcount = count + 1;
+ if (newcount > buf.length) {
+ byte newbuf[] = new byte[Math.max(buf.length << 1, newcount)];
+ System.arraycopy(buf, 0, newbuf, 0, count);
+ buf = newbuf;
+ }
+ buf[count] = (byte)b;
+ count = newcount;
+ return this;
+ }
+
+ /**
+ * Appends the subarray of the <CODE>byte</CODE> array. The buffer will grow by
+ * <CODE>len</CODE> bytes.
+ * @param b the array to be appended
+ * @param off the offset to the start of the array
+ * @param len the length of bytes to append
+ * @return a reference to this <CODE>ByteBuffer</CODE> object
+ */
+ public ByteBuffer append(byte b[], int off, int len) {
+ if ((off < 0) || (off > b.length) || (len < 0) ||
+ ((off + len) > b.length) || ((off + len) < 0) || len == 0)
+ return this;
+ int newcount = count + len;
+ if (newcount > buf.length) {
+ byte newbuf[] = new byte[Math.max(buf.length << 1, newcount)];
+ System.arraycopy(buf, 0, newbuf, 0, count);
+ buf = newbuf;
+ }
+ System.arraycopy(b, off, buf, count, len);
+ count = newcount;
+ return this;
+ }
+
+ /**
+ * Appends an array of bytes.
+ * @param b the array to be appended
+ * @return a reference to this <CODE>ByteBuffer</CODE> object
+ */
+ public ByteBuffer append(byte b[]) {
+ return append(b, 0, b.length);
+ }
+
+ /**
+ * Appends a <CODE>String</CODE> to the buffer. The <CODE>String</CODE> is
+ * converted according to the encoding ISO-8859-1.
+ * @param str the <CODE>String</CODE> to be appended
+ * @return a reference to this <CODE>ByteBuffer</CODE> object
+ */
+ public ByteBuffer append(String str) {
+ if (str != null)
+ return append(DocWriter.getISOBytes(str));
+ return this;
+ }
+
+ /**
+ * Appends a <CODE>char</CODE> to the buffer. The <CODE>char</CODE> is
+ * converted according to the encoding ISO-8859-1.
+ * @param c the <CODE>char</CODE> to be appended
+ * @return a reference to this <CODE>ByteBuffer</CODE> object
+ */
+ public ByteBuffer append(char c) {
+ return append_i(c);
+ }
+
+ /**
+ * Appends another <CODE>ByteBuffer</CODE> to this buffer.
+ * @param buf the <CODE>ByteBuffer</CODE> to be appended
+ * @return a reference to this <CODE>ByteBuffer</CODE> object
+ */
+ public ByteBuffer append(ByteBuffer buf) {
+ return append(buf.buf, 0, buf.count);
+ }
+
+ /**
+ * Appends the string representation of an <CODE>int</CODE>.
+ * @param i the <CODE>int</CODE> to be appended
+ * @return a reference to this <CODE>ByteBuffer</CODE> object
+ */
+ public ByteBuffer append(int i) {
+ return append((double)i);
+ }
+
+ public ByteBuffer append(byte b) {
+ return append_i(b);
+ }
+
+ public ByteBuffer appendHex(byte b) {
+ append(bytes[(b >> 4) & 0x0f]);
+ return append(bytes[b & 0x0f]);
+ }
+
+ /**
+ * Appends a string representation of a <CODE>float</CODE> according
+ * to the Pdf conventions.
+ * @param i the <CODE>float</CODE> to be appended
+ * @return a reference to this <CODE>ByteBuffer</CODE> object
+ */
+ public ByteBuffer append(float i) {
+ return append((double)i);
+ }
+
+ /**
+ * Appends a string representation of a <CODE>double</CODE> according
+ * to the Pdf conventions.
+ * @param d the <CODE>double</CODE> to be appended
+ * @return a reference to this <CODE>ByteBuffer</CODE> object
+ */
+ public ByteBuffer append(double d) {
+ append(formatDouble(d, this));
+ return this;
+ }
+
+ /**
+ * Outputs a <CODE>double</CODE> into a format suitable for the PDF.
+ * @param d a double
+ * @return the <CODE>String</CODE> representation of the <CODE>double</CODE>
+ */
+ public static String formatDouble(double d) {
+ return formatDouble(d, null);
+ }
+
+ /**
+ * Outputs a <CODE>double</CODE> into a format suitable for the PDF.
+ * @param d a double
+ * @param buf a ByteBuffer
+ * @return the <CODE>String</CODE> representation of the <CODE>double</CODE> if
+ * <CODE>buf</CODE> is <CODE>null</CODE>. If <CODE>buf</CODE> is <B>not</B> <CODE>null</CODE>,
+ * then the double is appended directly to the buffer and this methods returns <CODE>null</CODE>.
+ */
+ public static String formatDouble(double d, ByteBuffer buf) {
+ if (HIGH_PRECISION) {
+ DecimalFormat dn = new DecimalFormat("0.######", dfs);
+ String sform = dn.format(d);
+ if (buf == null)
+ return sform;
+ else {
+ buf.append(sform);
+ return null;
+ }
+ }
+ boolean negative = false;
+ if (Math.abs(d) < 0.000015) {
+ if (buf != null) {
+ buf.append(ZERO);
+ return null;
+ } else {
+ return "0";
+ }
+ }
+ if (d < 0) {
+ negative = true;
+ d = -d;
+ }
+ if (d < 1.0) {
+ d += 0.000005;
+ if (d >= 1) {
+ if (negative) {
+ if (buf != null) {
+ buf.append((byte)'-');
+ buf.append((byte)'1');
+ return null;
+ } else {
+ return "-1";
+ }
+ } else {
+ if (buf != null) {
+ buf.append((byte)'1');
+ return null;
+ } else {
+ return "1";
+ }
+ }
+ }
+ if (buf != null) {
+ int v = (int) (d * 100000);
+
+ if (negative) buf.append((byte)'-');
+ buf.append((byte)'0');
+ buf.append((byte)'.');
+
+ buf.append( (byte)(v / 10000 + ZERO) );
+ if (v % 10000 != 0) {
+ buf.append( (byte)((v / 1000) % 10 + ZERO) );
+ if (v % 1000 != 0) {
+ buf.append( (byte)((v / 100) % 10 + ZERO) );
+ if (v % 100 != 0) {
+ buf.append((byte)((v / 10) % 10 + ZERO) );
+ if (v % 10 != 0) {
+ buf.append((byte)((v) % 10 + ZERO) );
+ }
+ }
+ }
+ }
+ return null;
+ } else {
+ int x = 100000;
+ int v = (int) (d * x);
+
+ StringBuffer res = new StringBuffer();
+ if (negative) res.append('-');
+ res.append("0.");
+
+ while( v < x/10 ) {
+ res.append('0');
+ x /= 10;
+ }
+ res.append(v);
+ int cut = res.length() - 1;
+ while (res.charAt(cut) == '0') {
+ --cut;
+ }
+ res.setLength(cut + 1);
+ return res.toString();
+ }
+ } else if (d <= 32767) {
+ d += 0.005;
+ int v = (int) (d * 100);
+
+ if (v < byteCacheSize && byteCache[v] != null) {
+ if (buf != null) {
+ if (negative) buf.append((byte)'-');
+ buf.append(byteCache[v]);
+ return null;
+ } else {
+ String tmp = PdfEncodings.convertToString(byteCache[v], null);
+ if (negative) tmp = "-" + tmp;
+ return tmp;
+ }
+ }
+ if (buf != null) {
+ if (v < byteCacheSize) {
+ //create the cachebyte[]
+ byte[] cache;
+ int size = 0;
+ if (v >= 1000000) {
+ //the original number is >=10000, we need 5 more bytes
+ size += 5;
+ } else if (v >= 100000) {
+ //the original number is >=1000, we need 4 more bytes
+ size += 4;
+ } else if (v >= 10000) {
+ //the original number is >=100, we need 3 more bytes
+ size += 3;
+ } else if (v >= 1000) {
+ //the original number is >=10, we need 2 more bytes
+ size += 2;
+ } else if (v >= 100) {
+ //the original number is >=1, we need 1 more bytes
+ size += 1;
+ }
+
+ //now we must check if we have a decimal number
+ if (v % 100 != 0) {
+ //yes, do not forget the "."
+ size += 2;
+ }
+ if (v % 10 != 0) {
+ size++;
+ }
+ cache = new byte[size];
+ int add = 0;
+ if (v >= 1000000) {
+ cache[add++] = bytes[(v / 1000000)];
+ }
+ if (v >= 100000) {
+ cache[add++] = bytes[(v / 100000) % 10];
+ }
+ if (v >= 10000) {
+ cache[add++] = bytes[(v / 10000) % 10];
+ }
+ if (v >= 1000) {
+ cache[add++] = bytes[(v / 1000) % 10];
+ }
+ if (v >= 100) {
+ cache[add++] = bytes[(v / 100) % 10];
+ }
+
+ if (v % 100 != 0) {
+ cache[add++] = (byte)'.';
+ cache[add++] = bytes[(v / 10) % 10];
+ if (v % 10 != 0) {
+ cache[add++] = bytes[v % 10];
+ }
+ }
+ byteCache[v] = cache;
+ }
+
+ if (negative) buf.append((byte)'-');
+ if (v >= 1000000) {
+ buf.append( bytes[(v / 1000000)] );
+ }
+ if (v >= 100000) {
+ buf.append( bytes[(v / 100000) % 10] );
+ }
+ if (v >= 10000) {
+ buf.append( bytes[(v / 10000) % 10] );
+ }
+ if (v >= 1000) {
+ buf.append( bytes[(v / 1000) % 10] );
+ }
+ if (v >= 100) {
+ buf.append( bytes[(v / 100) % 10] );
+ }
+
+ if (v % 100 != 0) {
+ buf.append((byte)'.');
+ buf.append( bytes[(v / 10) % 10] );
+ if (v % 10 != 0) {
+ buf.append( bytes[v % 10] );
+ }
+ }
+ return null;
+ } else {
+ StringBuffer res = new StringBuffer();
+ if (negative) res.append('-');
+ if (v >= 1000000) {
+ res.append( chars[(v / 1000000)] );
+ }
+ if (v >= 100000) {
+ res.append( chars[(v / 100000) % 10] );
+ }
+ if (v >= 10000) {
+ res.append( chars[(v / 10000) % 10] );
+ }
+ if (v >= 1000) {
+ res.append( chars[(v / 1000) % 10] );
+ }
+ if (v >= 100) {
+ res.append( chars[(v / 100) % 10] );
+ }
+
+ if (v % 100 != 0) {
+ res.append('.');
+ res.append( chars[(v / 10) % 10] );
+ if (v % 10 != 0) {
+ res.append( chars[v % 10] );
+ }
+ }
+ return res.toString();
+ }
+ } else {
+ StringBuffer res = new StringBuffer();
+ if (negative) res.append('-');
+ d += 0.5;
+ long v = (long) d;
+ return res.append(v).toString();
+ }
+ }
+
+ /**
+ * Sets the size to zero.
+ */
+ public void reset() {
+ count = 0;
+ }
+
+ /**
+ * Creates a newly allocated byte array. Its size is the current
+ * size of this output stream and the valid contents of the buffer
+ * have been copied into it.
+ *
+ * @return the current contents of this output stream, as a byte array.
+ */
+ public byte[] toByteArray() {
+ byte newbuf[] = new byte[count];
+ System.arraycopy(buf, 0, newbuf, 0, count);
+ return newbuf;
+ }
+
+ /**
+ * Returns the current size of the buffer.
+ *
+ * @return the value of the <code>count</code> field, which is the number of valid bytes in this byte buffer.
+ */
+ public int size() {
+ return count;
+ }
+
+ public void setSize(int size) {
+ if (size > count || size < 0)
+ throw new IndexOutOfBoundsException("The new size must be positive and <= of the current size");
+ count = size;
+ }
+
+ /**
+ * Converts the buffer's contents into a string, translating bytes into
+ * characters according to the platform's default character encoding.
+ *
+ * @return String translated from the buffer's contents.
+ */
+ public String toString() {
+ return new String(buf, 0, count);
+ }
+
+ /**
+ * Converts the buffer's contents into a string, translating bytes into
+ * characters according to the specified character encoding.
+ *
+ * @param enc a character-encoding name.
+ * @return String translated from the buffer's contents.
+ * @throws UnsupportedEncodingException
+ * If the named encoding is not supported.
+ */
+ public String toString(String enc) throws UnsupportedEncodingException {
+ return new String(buf, 0, count, enc);
+ }
+
+ /**
+ * Writes the complete contents of this byte buffer output to
+ * the specified output stream argument, as if by calling the output
+ * stream's write method using <code>out.write(buf, 0, count)</code>.
+ *
+ * @param out the output stream to which to write the data.
+ * @exception IOException if an I/O error occurs.
+ */
+ public void writeTo(OutputStream out) throws IOException {
+ out.write(buf, 0, count);
+ }
+
+ public void write(int b) throws IOException {
+ append((byte)b);
+ }
+
+ public void write(byte[] b, int off, int len) {
+ append(b, off, len);
+ }
+
+ public byte[] getBuffer() {
+ return buf;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/pdf/CFFFont.java b/src/main/java/com/lowagie/text/pdf/CFFFont.java
new file mode 100644
index 0000000..2d15f96
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/CFFFont.java
@@ -0,0 +1,1184 @@
+/*
+ *
+ * Copyright 2003 Sivan Toledo
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ */
+
+/*
+ * Comments by Sivan Toledo:
+ * I created this class in order to add to iText the ability to utilize
+ * OpenType fonts with CFF glyphs (these usually have an .otf extension).
+ * The CFF font within the CFF table of the OT font might be either a CID
+ * or a Type1 font. (CFF fonts may also contain multiple fonts; I do not
+ * know if this is allowed in an OT table). The PDF spec, however, only
+ * allow a CID font with an Identity-H or Identity-V encoding. Otherwise,
+ * you are limited to an 8-bit encoding.
+ * Adobe fonts come in both flavors. That is, the OTFs sometimes have
+ * a CID CFF inside (for Japanese fonts), and sometimes a Type1 CFF
+ * (virtually all the others, Latin/Greek/Cyrillic). So to easily use
+ * all the glyphs in the latter, without creating multiple 8-bit encoding,
+ * I wrote this class, whose main purpose is to convert a Type1 font inside
+ * a CFF container (which might include other fonts) into a CID CFF font
+ * that can be directly embeded in the PDF.
+ *
+ * Limitations of the current version:
+ * 1. It does not extract a single CID font from a CFF that contains that
+ * particular CID along with other fonts. The Adobe Japanese OTF's that
+ * I have only have one font in the CFF table, so these can be
+ * embeded in the PDF as is.
+ * 2. It does not yet subset fonts.
+ * 3. It may or may not work on CFF fonts that are not within OTF's.
+ * I didn't try that. In any case, that would probably only be
+ * useful for subsetting CID fonts, not for CFF Type1 fonts (I don't
+ * think there are any available.
+ * I plan to extend the class to support these three features at some
+ * future time.
+ */
+
+package com.lowagie.text.pdf;
+
+/**
+ * @author stoledo
+ */
+
+import java.util.Iterator;
+import java.util.LinkedList;
+import com.lowagie.text.ExceptionConverter;
+
+public class CFFFont {
+
+ static final String operatorNames[] = {
+ "version", "Notice", "FullName", "FamilyName",
+ "Weight", "FontBBox", "BlueValues", "OtherBlues",
+ "FamilyBlues", "FamilyOtherBlues", "StdHW", "StdVW",
+ "UNKNOWN_12", "UniqueID", "XUID", "charset",
+ "Encoding", "CharStrings", "Private", "Subrs",
+ "defaultWidthX", "nominalWidthX", "UNKNOWN_22", "UNKNOWN_23",
+ "UNKNOWN_24", "UNKNOWN_25", "UNKNOWN_26", "UNKNOWN_27",
+ "UNKNOWN_28", "UNKNOWN_29", "UNKNOWN_30", "UNKNOWN_31",
+ "Copyright", "isFixedPitch", "ItalicAngle", "UnderlinePosition",
+ "UnderlineThickness", "PaintType", "CharstringType", "FontMatrix",
+ "StrokeWidth", "BlueScale", "BlueShift", "BlueFuzz",
+ "StemSnapH", "StemSnapV", "ForceBold", "UNKNOWN_12_15",
+ "UNKNOWN_12_16", "LanguageGroup", "ExpansionFactor", "initialRandomSeed",
+ "SyntheticBase", "PostScript", "BaseFontName", "BaseFontBlend",
+ "UNKNOWN_12_24", "UNKNOWN_12_25", "UNKNOWN_12_26", "UNKNOWN_12_27",
+ "UNKNOWN_12_28", "UNKNOWN_12_29", "ROS", "CIDFontVersion",
+ "CIDFontRevision", "CIDFontType", "CIDCount", "UIDBase",
+ "FDArray", "FDSelect", "FontName"
+ };
+
+ static final String standardStrings[] = {
+ // Automatically generated from Appendix A of the CFF specification; do
+ // not edit. Size should be 391.
+ ".notdef", "space", "exclam", "quotedbl", "numbersign", "dollar",
+ "percent", "ampersand", "quoteright", "parenleft", "parenright",
+ "asterisk", "plus", "comma", "hyphen", "period", "slash", "zero", "one",
+ "two", "three", "four", "five", "six", "seven", "eight", "nine", "colon",
+ "semicolon", "less", "equal", "greater", "question", "at", "A", "B", "C",
+ "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R",
+ "S", "T", "U", "V", "W", "X", "Y", "Z", "bracketleft", "backslash",
+ "bracketright", "asciicircum", "underscore", "quoteleft", "a", "b", "c",
+ "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r",
+ "s", "t", "u", "v", "w", "x", "y", "z", "braceleft", "bar", "braceright",
+ "asciitilde", "exclamdown", "cent", "sterling", "fraction", "yen",
+ "florin", "section", "currency", "quotesingle", "quotedblleft",
+ "guillemotleft", "guilsinglleft", "guilsinglright", "fi", "fl", "endash",
+ "dagger", "daggerdbl", "periodcentered", "paragraph", "bullet",
+ "quotesinglbase", "quotedblbase", "quotedblright", "guillemotright",
+ "ellipsis", "perthousand", "questiondown", "grave", "acute", "circumflex",
+ "tilde", "macron", "breve", "dotaccent", "dieresis", "ring", "cedilla",
+ "hungarumlaut", "ogonek", "caron", "emdash", "AE", "ordfeminine", "Lslash",
+ "Oslash", "OE", "ordmasculine", "ae", "dotlessi", "lslash", "oslash", "oe",
+ "germandbls", "onesuperior", "logicalnot", "mu", "trademark", "Eth",
+ "onehalf", "plusminus", "Thorn", "onequarter", "divide", "brokenbar",
+ "degree", "thorn", "threequarters", "twosuperior", "registered", "minus",
+ "eth", "multiply", "threesuperior", "copyright", "Aacute", "Acircumflex",
+ "Adieresis", "Agrave", "Aring", "Atilde", "Ccedilla", "Eacute",
+ "Ecircumflex", "Edieresis", "Egrave", "Iacute", "Icircumflex", "Idieresis",
+ "Igrave", "Ntilde", "Oacute", "Ocircumflex", "Odieresis", "Ograve",
+ "Otilde", "Scaron", "Uacute", "Ucircumflex", "Udieresis", "Ugrave",
+ "Yacute", "Ydieresis", "Zcaron", "aacute", "acircumflex", "adieresis",
+ "agrave", "aring", "atilde", "ccedilla", "eacute", "ecircumflex",
+ "edieresis", "egrave", "iacute", "icircumflex", "idieresis", "igrave",
+ "ntilde", "oacute", "ocircumflex", "odieresis", "ograve", "otilde",
+ "scaron", "uacute", "ucircumflex", "udieresis", "ugrave", "yacute",
+ "ydieresis", "zcaron", "exclamsmall", "Hungarumlautsmall",
+ "dollaroldstyle", "dollarsuperior", "ampersandsmall", "Acutesmall",
+ "parenleftsuperior", "parenrightsuperior", "twodotenleader",
+ "onedotenleader", "zerooldstyle", "oneoldstyle", "twooldstyle",
+ "threeoldstyle", "fouroldstyle", "fiveoldstyle", "sixoldstyle",
+ "sevenoldstyle", "eightoldstyle", "nineoldstyle", "commasuperior",
+ "threequartersemdash", "periodsuperior", "questionsmall", "asuperior",
+ "bsuperior", "centsuperior", "dsuperior", "esuperior", "isuperior",
+ "lsuperior", "msuperior", "nsuperior", "osuperior", "rsuperior",
+ "ssuperior", "tsuperior", "ff", "ffi", "ffl", "parenleftinferior",
+ "parenrightinferior", "Circumflexsmall", "hyphensuperior", "Gravesmall",
+ "Asmall", "Bsmall", "Csmall", "Dsmall", "Esmall", "Fsmall", "Gsmall",
+ "Hsmall", "Ismall", "Jsmall", "Ksmall", "Lsmall", "Msmall", "Nsmall",
+ "Osmall", "Psmall", "Qsmall", "Rsmall", "Ssmall", "Tsmall", "Usmall",
+ "Vsmall", "Wsmall", "Xsmall", "Ysmall", "Zsmall", "colonmonetary",
+ "onefitted", "rupiah", "Tildesmall", "exclamdownsmall", "centoldstyle",
+ "Lslashsmall", "Scaronsmall", "Zcaronsmall", "Dieresissmall", "Brevesmall",
+ "Caronsmall", "Dotaccentsmall", "Macronsmall", "figuredash",
+ "hypheninferior", "Ogoneksmall", "Ringsmall", "Cedillasmall",
+ "questiondownsmall", "oneeighth", "threeeighths", "fiveeighths",
+ "seveneighths", "onethird", "twothirds", "zerosuperior", "foursuperior",
+ "fivesuperior", "sixsuperior", "sevensuperior", "eightsuperior",
+ "ninesuperior", "zeroinferior", "oneinferior", "twoinferior",
+ "threeinferior", "fourinferior", "fiveinferior", "sixinferior",
+ "seveninferior", "eightinferior", "nineinferior", "centinferior",
+ "dollarinferior", "periodinferior", "commainferior", "Agravesmall",
+ "Aacutesmall", "Acircumflexsmall", "Atildesmall", "Adieresissmall",
+ "Aringsmall", "AEsmall", "Ccedillasmall", "Egravesmall", "Eacutesmall",
+ "Ecircumflexsmall", "Edieresissmall", "Igravesmall", "Iacutesmall",
+ "Icircumflexsmall", "Idieresissmall", "Ethsmall", "Ntildesmall",
+ "Ogravesmall", "Oacutesmall", "Ocircumflexsmall", "Otildesmall",
+ "Odieresissmall", "OEsmall", "Oslashsmall", "Ugravesmall", "Uacutesmall",
+ "Ucircumflexsmall", "Udieresissmall", "Yacutesmall", "Thornsmall",
+ "Ydieresissmall", "001.000", "001.001", "001.002", "001.003", "Black",
+ "Bold", "Book", "Light", "Medium", "Regular", "Roman", "Semibold"
+ };
+
+ //private String[] strings;
+ public String getString(char sid) {
+ if (sid < standardStrings.length) return standardStrings[sid];
+ if (sid >= standardStrings.length+(stringOffsets.length-1)) return null;
+ int j = sid - standardStrings.length;
+ //java.lang.System.err.println("going for "+j);
+ int p = getPosition();
+ seek(stringOffsets[j]);
+ StringBuffer s = new StringBuffer();
+ for (int k=stringOffsets[j]; k<stringOffsets[j+1]; k++) {
+ s.append(getCard8());
+ }
+ seek(p);
+ return s.toString();
+ }
+
+ char getCard8() {
+ try {
+ byte i = buf.readByte();
+ return (char)(i & 0xff);
+ }
+ catch (Exception e) {
+ throw new ExceptionConverter(e);
+ }
+ }
+
+ char getCard16() {
+ try {
+ return buf.readChar();
+ }
+ catch (Exception e) {
+ throw new ExceptionConverter(e);
+ }
+ }
+
+ int getOffset(int offSize) {
+ int offset = 0;
+ for (int i=0; i<offSize; i++) {
+ offset *= 256;
+ offset += getCard8();
+ }
+ return offset;
+ }
+
+ void seek(int offset) {
+ try {
+ buf.seek(offset);
+ }
+ catch (Exception e) {
+ throw new ExceptionConverter(e);
+ }
+ }
+
+ short getShort() {
+ try {
+ return buf.readShort();
+ }
+ catch (Exception e) {
+ throw new ExceptionConverter(e);
+ }
+ }
+
+ int getInt() {
+ try {
+ return buf.readInt();
+ }
+ catch (Exception e) {
+ throw new ExceptionConverter(e);
+ }
+ }
+
+ int getPosition() {
+ try {
+ return buf.getFilePointer();
+ }
+ catch (Exception e) {
+ throw new ExceptionConverter(e);
+ }
+ }
+ int nextIndexOffset;
+ // read the offsets in the next index
+ // data structure, convert to global
+ // offsets, and return them.
+ // Sets the nextIndexOffset.
+ int[] getIndex(int nextIndexOffset) {
+ int count, indexOffSize;
+
+ seek(nextIndexOffset);
+ count = getCard16();
+ int[] offsets = new int[count+1];
+
+ if (count==0) {
+ offsets[0] = -1;
+ nextIndexOffset += 2;
+ return offsets;
+ }
+
+ indexOffSize = getCard8();
+
+ for (int j=0; j<=count; j++) {
+ //nextIndexOffset = ofset to relative segment
+ offsets[j] = nextIndexOffset
+ //2-> count in the index header. 1->offset size in index header
+ + 2+1
+ //offset array size * offset size
+ + (count+1)*indexOffSize
+ //???zero <-> one base
+ - 1
+ // read object offset relative to object array base
+ + getOffset(indexOffSize);
+ }
+ //nextIndexOffset = offsets[count];
+ return offsets;
+ }
+
+ protected String key;
+ protected Object[] args = new Object[48];
+ protected int arg_count = 0;
+
+ protected void getDictItem() {
+ for (int i=0; i<arg_count; i++) args[i]=null;
+ arg_count = 0;
+ key = null;
+ boolean gotKey = false;
+
+ while (!gotKey) {
+ char b0 = getCard8();
+ if (b0 == 29) {
+ int item = getInt();
+ args[arg_count] = new Integer(item);
+ arg_count++;
+ //System.err.println(item+" ");
+ continue;
+ }
+ if (b0 == 28) {
+ short item = getShort();
+ args[arg_count] = new Integer(item);
+ arg_count++;
+ //System.err.println(item+" ");
+ continue;
+ }
+ if (b0 >= 32 && b0 <= 246) {
+ byte item = (byte) (b0-139);
+ args[arg_count] = new Integer(item);
+ arg_count++;
+ //System.err.println(item+" ");
+ continue;
+ }
+ if (b0 >= 247 && b0 <= 250) {
+ char b1 = getCard8();
+ short item = (short) ((b0-247)*256+b1+108);
+ args[arg_count] = new Integer(item);
+ arg_count++;
+ //System.err.println(item+" ");
+ continue;
+ }
+ if (b0 >= 251 && b0 <= 254) {
+ char b1 = getCard8();
+ short item = (short) (-(b0-251)*256-b1-108);
+ args[arg_count] = new Integer(item);
+ arg_count++;
+ //System.err.println(item+" ");
+ continue;
+ }
+ if (b0 == 30) {
+ String item = "";
+ boolean done = false;
+ char buffer = 0;
+ byte avail = 0;
+ int nibble = 0;
+ while (!done) {
+ // get a nibble
+ if (avail==0) { buffer = getCard8(); avail=2; }
+ if (avail==1) { nibble = (buffer / 16); avail--; }
+ if (avail==2) { nibble = (buffer % 16); avail--; }
+ switch (nibble) {
+ case 0xa: item += "." ; break;
+ case 0xb: item += "E" ; break;
+ case 0xc: item += "E-"; break;
+ case 0xe: item += "-" ; break;
+ case 0xf: done=true ; break;
+ default:
+ if (nibble >= 0 && nibble <= 9)
+ item += String.valueOf(nibble);
+ else {
+ item += "<NIBBLE ERROR: "+String.valueOf(nibble)+">";
+ done = true;
+ }
+ break;
+ }
+ }
+ args[arg_count] = item;
+ arg_count++;
+ //System.err.println(" real=["+item+"]");
+ continue;
+ }
+ if (b0 <= 21) {
+ gotKey=true;
+ if (b0 != 12) key = operatorNames[b0];
+ else key = operatorNames[32 + getCard8()];
+ //for (int i=0; i<arg_count; i++)
+ // System.err.print(args[i].toString()+" ");
+ //System.err.println(key+" ;");
+ continue;
+ }
+ }
+ }
+
+ /** List items for the linked list that builds the new CID font.
+ */
+
+ protected static abstract class Item {
+ protected int myOffset = -1;
+ /** remember the current offset and increment by item's size in bytes. */
+ public void increment(int[] currentOffset) {
+ myOffset = currentOffset[0];
+ }
+ /** Emit the byte stream for this item. */
+ public void emit(byte[] buffer) {}
+ /** Fix up cross references to this item (applies only to markers). */
+ public void xref() {}
+ }
+
+ protected static abstract class OffsetItem extends Item {
+ public int value;
+ /** set the value of an offset item that was initially unknown.
+ * It will be fixed up latex by a call to xref on some marker.
+ */
+ public void set(int offset) { this.value = offset; }
+ }
+
+
+ /** A range item.
+ */
+
+ protected static final class RangeItem extends Item {
+ public int offset, length;
+ private RandomAccessFileOrArray buf;
+ public RangeItem(RandomAccessFileOrArray buf, int offset, int length) {
+ this.offset = offset;
+ this.length = length;
+ this.buf = buf;
+ }
+ public void increment(int[] currentOffset) {
+ super.increment(currentOffset);
+ currentOffset[0] += length;
+ }
+ public void emit(byte[] buffer) {
+ //System.err.println("range emit offset "+offset+" size="+length);
+ try {
+ buf.seek(offset);
+ for (int i=myOffset; i<myOffset+length; i++)
+ buffer[i] = buf.readByte();
+ }
+ catch (Exception e) {
+ throw new ExceptionConverter(e);
+ }
+ //System.err.println("finished range emit");
+ }
+ }
+
+ /** An index-offset item for the list.
+ * The size denotes the required size in the CFF. A positive
+ * value means that we need a specific size in bytes (for offset arrays)
+ * and a negative value means that this is a dict item that uses a
+ * variable-size representation.
+ */
+ static protected final class IndexOffsetItem extends OffsetItem {
+ public final int size;
+ public IndexOffsetItem(int size, int value) {this.size=size; this.value=value;}
+ public IndexOffsetItem(int size) {this.size=size; }
+
+ public void increment(int[] currentOffset) {
+ super.increment(currentOffset);
+ currentOffset[0] += size;
+ }
+ public void emit(byte[] buffer) {
+ int i=0;
+ switch (size) {
+ case 4:
+ buffer[myOffset+i] = (byte) ((value >>> 24) & 0xff);
+ i++;
+ case 3:
+ buffer[myOffset+i] = (byte) ((value >>> 16) & 0xff);
+ i++;
+ case 2:
+ buffer[myOffset+i] = (byte) ((value >>> 8) & 0xff);
+ i++;
+ case 1:
+ buffer[myOffset+i] = (byte) ((value >>> 0) & 0xff);
+ i++;
+ }
+ /*
+ int mask = 0xff;
+ for (int i=size-1; i>=0; i--) {
+ buffer[myOffset+i] = (byte) (value & mask);
+ mask <<= 8;
+ }
+ */
+ }
+ }
+
+ static protected final class IndexBaseItem extends Item {
+ public IndexBaseItem() {}
+ }
+
+ static protected final class IndexMarkerItem extends Item {
+ private OffsetItem offItem;
+ private IndexBaseItem indexBase;
+ public IndexMarkerItem(OffsetItem offItem, IndexBaseItem indexBase) {
+ this.offItem = offItem;
+ this.indexBase = indexBase;
+ }
+ public void xref() {
+ //System.err.println("index marker item, base="+indexBase.myOffset+" my="+this.myOffset);
+ offItem.set(this.myOffset-indexBase.myOffset+1);
+ }
+ }
+ /**
+ *
+ * @author orly manor
+ *
+ * TODO To change the template for this generated type comment go to
+ * Window - Preferences - Java - Code Generation - Code and Comments
+ */
+ static protected final class SubrMarkerItem extends Item {
+ private OffsetItem offItem;
+ private IndexBaseItem indexBase;
+ public SubrMarkerItem(OffsetItem offItem, IndexBaseItem indexBase) {
+ this.offItem = offItem;
+ this.indexBase = indexBase;
+ }
+ public void xref() {
+ //System.err.println("index marker item, base="+indexBase.myOffset+" my="+this.myOffset);
+ offItem.set(this.myOffset-indexBase.myOffset);
+ }
+ }
+
+
+ /** an unknown offset in a dictionary for the list.
+ * We will fix up the offset later; for now, assume it's large.
+ */
+ static protected final class DictOffsetItem extends OffsetItem {
+ public final int size;
+ public DictOffsetItem() {this.size=5; }
+
+ public void increment(int[] currentOffset) {
+ super.increment(currentOffset);
+ currentOffset[0] += size;
+ }
+ // this is incomplete!
+ public void emit(byte[] buffer) {
+ if (size==5) {
+ buffer[myOffset] = 29;
+ buffer[myOffset+1] = (byte) ((value >>> 24) & 0xff);
+ buffer[myOffset+2] = (byte) ((value >>> 16) & 0xff);
+ buffer[myOffset+3] = (byte) ((value >>> 8) & 0xff);
+ buffer[myOffset+4] = (byte) ((value >>> 0) & 0xff);
+ }
+ }
+ }
+
+ /** Card24 item.
+ */
+
+ static protected final class UInt24Item extends Item {
+ public int value;
+ public UInt24Item(int value) {this.value=value;}
+
+ public void increment(int[] currentOffset) {
+ super.increment(currentOffset);
+ currentOffset[0] += 3;
+ }
+ // this is incomplete!
+ public void emit(byte[] buffer) {
+ buffer[myOffset+0] = (byte) ((value >>> 16) & 0xff);
+ buffer[myOffset+1] = (byte) ((value >>> 8) & 0xff);
+ buffer[myOffset+2] = (byte) ((value >>> 0) & 0xff);
+ }
+ }
+
+ /** Card32 item.
+ */
+
+ static protected final class UInt32Item extends Item {
+ public int value;
+ public UInt32Item(int value) {this.value=value;}
+
+ public void increment(int[] currentOffset) {
+ super.increment(currentOffset);
+ currentOffset[0] += 4;
+ }
+ // this is incomplete!
+ public void emit(byte[] buffer) {
+ buffer[myOffset+0] = (byte) ((value >>> 24) & 0xff);
+ buffer[myOffset+1] = (byte) ((value >>> 16) & 0xff);
+ buffer[myOffset+2] = (byte) ((value >>> 8) & 0xff);
+ buffer[myOffset+3] = (byte) ((value >>> 0) & 0xff);
+ }
+ }
+
+ /** A SID or Card16 item.
+ */
+
+ static protected final class UInt16Item extends Item {
+ public char value;
+ public UInt16Item(char value) {this.value=value;}
+
+ public void increment(int[] currentOffset) {
+ super.increment(currentOffset);
+ currentOffset[0] += 2;
+ }
+ // this is incomplete!
+ public void emit(byte[] buffer) {
+ buffer[myOffset+0] = (byte) ((value >>> 8) & 0xff);
+ buffer[myOffset+1] = (byte) ((value >>> 0) & 0xff);
+ }
+ }
+
+ /** A Card8 item.
+ */
+
+ static protected final class UInt8Item extends Item {
+ public char value;
+ public UInt8Item(char value) {this.value=value;}
+
+ public void increment(int[] currentOffset) {
+ super.increment(currentOffset);
+ currentOffset[0] += 1;
+ }
+ // this is incomplete!
+ public void emit(byte[] buffer) {
+ buffer[myOffset+0] = (byte) ((value >>> 0) & 0xff);
+ }
+ }
+
+ static protected final class StringItem extends Item {
+ public String s;
+ public StringItem(String s) {this.s=s;}
+
+ public void increment(int[] currentOffset) {
+ super.increment(currentOffset);
+ currentOffset[0] += s.length();
+ }
+ public void emit(byte[] buffer) {
+ for (int i=0; i<s.length(); i++)
+ buffer[myOffset+i] = (byte) (s.charAt(i) & 0xff);
+ }
+ }
+
+
+ /** A dictionary number on the list.
+ * This implementation is inefficient: it doesn't use the variable-length
+ * representation.
+ */
+
+ static protected final class DictNumberItem extends Item {
+ public final int value;
+ public int size = 5;
+ public DictNumberItem(int value) {this.value=value;}
+ public void increment(int[] currentOffset) {
+ super.increment(currentOffset);
+ currentOffset[0] += size;
+ }
+ // this is imcomplete!
+ public void emit(byte[] buffer) {
+ if (size==5) {
+ buffer[myOffset] = 29;
+ buffer[myOffset+1] = (byte) ((value >>> 24) & 0xff);
+ buffer[myOffset+2] = (byte) ((value >>> 16) & 0xff);
+ buffer[myOffset+3] = (byte) ((value >>> 8) & 0xff);
+ buffer[myOffset+4] = (byte) ((value >>> 0) & 0xff);
+ }
+ }
+ }
+
+ /** An offset-marker item for the list.
+ * It is used to mark an offset and to set the offset list item.
+ */
+
+ static protected final class MarkerItem extends Item {
+ OffsetItem p;
+ public MarkerItem(OffsetItem pointerToMarker) {p=pointerToMarker;}
+ public void xref() {
+ p.set(this.myOffset);
+ }
+ }
+
+ /** a utility that creates a range item for an entire index
+ *
+ * @param indexOffset where the index is
+ * @return a range item representing the entire index
+ */
+
+ protected RangeItem getEntireIndexRange(int indexOffset) {
+ seek(indexOffset);
+ int count = getCard16();
+ if (count==0) {
+ return new RangeItem(buf,indexOffset,2);
+ } else {
+ int indexOffSize = getCard8();
+ seek(indexOffset+2+1+count*indexOffSize);
+ int size = getOffset(indexOffSize)-1;
+ return new RangeItem(buf,indexOffset,
+ 2+1+(count+1)*indexOffSize+size);
+ }
+ }
+
+
+ /** get a single CID font. The PDF architecture (1.4)
+ * supports 16-bit strings only with CID CFF fonts, not
+ * in Type-1 CFF fonts, so we convert the font to CID if
+ * it is in the Type-1 format.
+ * Two other tasks that we need to do are to select
+ * only a single font from the CFF package (this again is
+ * a PDF restriction) and to subset the CharStrings glyph
+ * description.
+ */
+
+
+ public byte[] getCID(String fontName)
+ //throws java.io.FileNotFoundException
+ {
+ int j;
+ for (j=0; j<fonts.length; j++)
+ if (fontName.equals(fonts[j].name)) break;
+ if (j==fonts.length) return null;
+
+ LinkedList l = new LinkedList();
+
+ // copy the header
+
+ seek(0);
+
+ int major = getCard8();
+ int minor = getCard8();
+ int hdrSize = getCard8();
+ int offSize = getCard8();
+ nextIndexOffset = hdrSize;
+
+ l.addLast(new RangeItem(buf,0,hdrSize));
+
+ int nglyphs=-1, nstrings=-1;
+ if ( ! fonts[j].isCID ) {
+ // count the glyphs
+ seek(fonts[j].charstringsOffset);
+ nglyphs = getCard16();
+ seek(stringIndexOffset);
+ nstrings = getCard16()+standardStrings.length;
+ //System.err.println("number of glyphs = "+nglyphs);
+ }
+
+ // create a name index
+
+ l.addLast(new UInt16Item((char)1)); // count
+ l.addLast(new UInt8Item((char)1)); // offSize
+ l.addLast(new UInt8Item((char)1)); // first offset
+ l.addLast(new UInt8Item((char)( 1+fonts[j].name.length() )));
+ l.addLast(new StringItem(fonts[j].name));
+
+ // create the topdict Index
+
+
+ l.addLast(new UInt16Item((char)1)); // count
+ l.addLast(new UInt8Item((char)2)); // offSize
+ l.addLast(new UInt16Item((char)1)); // first offset
+ OffsetItem topdictIndex1Ref = new IndexOffsetItem(2);
+ l.addLast(topdictIndex1Ref);
+ IndexBaseItem topdictBase = new IndexBaseItem();
+ l.addLast(topdictBase);
+
+ /*
+ int maxTopdictLen = (topdictOffsets[j+1]-topdictOffsets[j])
+ + 9*2 // at most 9 new keys
+ + 8*5 // 8 new integer arguments
+ + 3*2;// 3 new SID arguments
+ */
+
+ //int topdictNext = 0;
+ //byte[] topdict = new byte[maxTopdictLen];
+
+ OffsetItem charsetRef = new DictOffsetItem();
+ OffsetItem charstringsRef = new DictOffsetItem();
+ OffsetItem fdarrayRef = new DictOffsetItem();
+ OffsetItem fdselectRef = new DictOffsetItem();
+
+ if ( !fonts[j].isCID ) {
+ // create a ROS key
+ l.addLast(new DictNumberItem(nstrings));
+ l.addLast(new DictNumberItem(nstrings+1));
+ l.addLast(new DictNumberItem(0));
+ l.addLast(new UInt8Item((char)12));
+ l.addLast(new UInt8Item((char)30));
+ // create a CIDCount key
+ l.addLast(new DictNumberItem(nglyphs));
+ l.addLast(new UInt8Item((char)12));
+ l.addLast(new UInt8Item((char)34));
+ // What about UIDBase (12,35)? Don't know what is it.
+ // I don't think we need FontName; the font I looked at didn't have it.
+ }
+
+ // create an FDArray key
+ l.addLast(fdarrayRef);
+ l.addLast(new UInt8Item((char)12));
+ l.addLast(new UInt8Item((char)36));
+ // create an FDSelect key
+ l.addLast(fdselectRef);
+ l.addLast(new UInt8Item((char)12));
+ l.addLast(new UInt8Item((char)37));
+ // create an charset key
+ l.addLast(charsetRef);
+ l.addLast(new UInt8Item((char)15));
+ // create a CharStrings key
+ l.addLast(charstringsRef);
+ l.addLast(new UInt8Item((char)17));
+
+ seek(topdictOffsets[j]);
+ while (getPosition() < topdictOffsets[j+1]) {
+ int p1 = getPosition();
+ getDictItem();
+ int p2 = getPosition();
+ if (key=="Encoding"
+ || key=="Private"
+ || key=="FDSelect"
+ || key=="FDArray"
+ || key=="charset"
+ || key=="CharStrings"
+ ) {
+ // just drop them
+ } else {
+ l.add(new RangeItem(buf,p1,p2-p1));
+ }
+ }
+
+ l.addLast(new IndexMarkerItem(topdictIndex1Ref,topdictBase));
+
+ // Copy the string index and append new strings.
+ // We need 3 more strings: Registry, Ordering, and a FontName for one FD.
+ // The total length is at most "Adobe"+"Identity"+63 = 76
+
+ if (fonts[j].isCID) {
+ l.addLast(getEntireIndexRange(stringIndexOffset));
+ } else {
+ String fdFontName = fonts[j].name+"-OneRange";
+ if (fdFontName.length() > 127)
+ fdFontName = fdFontName.substring(0,127);
+ String extraStrings = "Adobe"+"Identity"+fdFontName;
+
+ int origStringsLen = stringOffsets[stringOffsets.length-1]
+ - stringOffsets[0];
+ int stringsBaseOffset = stringOffsets[0]-1;
+
+ byte stringsIndexOffSize;
+ if (origStringsLen+extraStrings.length() <= 0xff) stringsIndexOffSize = 1;
+ else if (origStringsLen+extraStrings.length() <= 0xffff) stringsIndexOffSize = 2;
+ else if (origStringsLen+extraStrings.length() <= 0xffffff) stringsIndexOffSize = 3;
+ else stringsIndexOffSize = 4;
+
+ l.addLast(new UInt16Item((char)((stringOffsets.length-1)+3))); // count
+ l.addLast(new UInt8Item((char)stringsIndexOffSize)); // offSize
+ for (int i=0; i<stringOffsets.length; i++)
+ l.addLast(new IndexOffsetItem(stringsIndexOffSize,
+ stringOffsets[i]-stringsBaseOffset));
+ int currentStringsOffset = stringOffsets[stringOffsets.length-1]
+ - stringsBaseOffset;
+ //l.addLast(new IndexOffsetItem(stringsIndexOffSize,currentStringsOffset));
+ currentStringsOffset += ("Adobe").length();
+ l.addLast(new IndexOffsetItem(stringsIndexOffSize,currentStringsOffset));
+ currentStringsOffset += ("Identity").length();
+ l.addLast(new IndexOffsetItem(stringsIndexOffSize,currentStringsOffset));
+ currentStringsOffset += fdFontName.length();
+ l.addLast(new IndexOffsetItem(stringsIndexOffSize,currentStringsOffset));
+
+ l.addLast(new RangeItem(buf,stringOffsets[0],origStringsLen));
+ l.addLast(new StringItem(extraStrings));
+ }
+
+ // copy the global subroutine index
+
+ l.addLast(getEntireIndexRange(gsubrIndexOffset));
+
+ // deal with fdarray, fdselect, and the font descriptors
+
+ if (fonts[j].isCID) {
+ // copy the FDArray, FDSelect, charset
+ } else {
+ // create FDSelect
+ l.addLast(new MarkerItem(fdselectRef));
+ l.addLast(new UInt8Item((char)3)); // format identifier
+ l.addLast(new UInt16Item((char)1)); // nRanges
+
+ l.addLast(new UInt16Item((char)0)); // Range[0].firstGlyph
+ l.addLast(new UInt8Item((char)0)); // Range[0].fd
+
+ l.addLast(new UInt16Item((char)nglyphs)); // sentinel
+
+ // recreate a new charset
+ // This format is suitable only for fonts without subsetting
+
+ l.addLast(new MarkerItem(charsetRef));
+ l.addLast(new UInt8Item((char)2)); // format identifier
+
+ l.addLast(new UInt16Item((char)1)); // first glyph in range (ignore .notdef)
+ l.addLast(new UInt16Item((char)(nglyphs-1))); // nLeft
+ // now all are covered, the data structure is complete.
+
+ // create a font dict index (fdarray)
+
+ l.addLast(new MarkerItem(fdarrayRef));
+ l.addLast(new UInt16Item((char)1));
+ l.addLast(new UInt8Item((char)1)); // offSize
+ l.addLast(new UInt8Item((char)1)); // first offset
+
+ OffsetItem privateIndex1Ref = new IndexOffsetItem(1);
+ l.addLast(privateIndex1Ref);
+ IndexBaseItem privateBase = new IndexBaseItem();
+ l.addLast(privateBase);
+
+ // looking at the PS that acrobat generates from a PDF with
+ // a CFF opentype font embeded with an identity-H encoding,
+ // it seems that it does not need a FontName.
+ //l.addLast(new DictNumberItem((standardStrings.length+(stringOffsets.length-1)+2)));
+ //l.addLast(new UInt8Item((char)12));
+ //l.addLast(new UInt8Item((char)38)); // FontName
+
+ l.addLast(new DictNumberItem(fonts[j].privateLength));
+ OffsetItem privateRef = new DictOffsetItem();
+ l.addLast(privateRef);
+ l.addLast(new UInt8Item((char)18)); // Private
+
+ l.addLast(new IndexMarkerItem(privateIndex1Ref,privateBase));
+
+ // copy the private index & local subroutines
+
+ l.addLast(new MarkerItem(privateRef));
+ // copy the private dict and the local subroutines.
+ // the length of the private dict seems to NOT include
+ // the local subroutines.
+ l.addLast(new RangeItem(buf,fonts[j].privateOffset,fonts[j].privateLength));
+ if (fonts[j].privateSubrs >= 0) {
+ //System.err.println("has subrs="+fonts[j].privateSubrs+" ,len="+fonts[j].privateLength);
+ l.addLast(getEntireIndexRange(fonts[j].privateSubrs));
+ }
+ }
+
+ // copy the charstring index
+
+ l.addLast(new MarkerItem(charstringsRef));
+ l.addLast(getEntireIndexRange(fonts[j].charstringsOffset));
+
+ // now create the new CFF font
+
+ int[] currentOffset = new int[1];
+ currentOffset[0] = 0;
+
+ Iterator listIter = l.iterator();
+ while ( listIter.hasNext() ) {
+ Item item = (Item) listIter.next();
+ item.increment(currentOffset);
+ }
+
+ listIter = l.iterator();
+ while ( listIter.hasNext() ) {
+ Item item = (Item) listIter.next();
+ item.xref();
+ }
+
+ int size = currentOffset[0];
+ byte[] b = new byte[size];
+
+ listIter = l.iterator();
+ while ( listIter.hasNext() ) {
+ Item item = (Item) listIter.next();
+ item.emit(b);
+ }
+
+ return b;
+ }
+
+
+ public boolean isCID(String fontName) {
+ int j;
+ for (j=0; j<fonts.length; j++)
+ if (fontName.equals(fonts[j].name)) return fonts[j].isCID;
+ return false;
+ }
+
+ public boolean exists(String fontName) {
+ int j;
+ for (j=0; j<fonts.length; j++)
+ if (fontName.equals(fonts[j].name)) return true;
+ return false;
+ }
+
+
+ public String[] getNames() {
+ String[] names = new String[ fonts.length ];
+ for (int i=0; i<fonts.length; i++)
+ names[i] = fonts[i].name;
+ return names;
+ }
+ /**
+ * A random Access File or an array
+ * (contributed by orly manor)
+ */
+ protected RandomAccessFileOrArray buf;
+ private int offSize;
+
+ protected int nameIndexOffset;
+ protected int topdictIndexOffset;
+ protected int stringIndexOffset;
+ protected int gsubrIndexOffset;
+ protected int[] nameOffsets;
+ protected int[] topdictOffsets;
+ protected int[] stringOffsets;
+ protected int[] gsubrOffsets;
+
+ /**
+ * @author orly manor
+ * TODO Changed from private to protected by Ygal&Oren
+ */
+ protected final class Font {
+ public String name;
+ public String fullName;
+ public boolean isCID = false;
+ public int privateOffset = -1; // only if not CID
+ public int privateLength = -1; // only if not CID
+ public int privateSubrs = -1;
+ public int charstringsOffset = -1;
+ public int encodingOffset = -1;
+ public int charsetOffset = -1;
+ public int fdarrayOffset = -1; // only if CID
+ public int fdselectOffset = -1; // only if CID
+ public int[] fdprivateOffsets;
+ public int[] fdprivateLengths;
+ public int[] fdprivateSubrs;
+
+ // Added by Oren & Ygal
+ public int nglyphs;
+ public int nstrings;
+ public int CharsetLength;
+ public int[] charstringsOffsets;
+ public int[] charset;
+ public int[] FDSelect;
+ public int FDSelectLength;
+ public int FDSelectFormat;
+ public int CharstringType = 2;
+ public int FDArrayCount;
+ public int FDArrayOffsize;
+ public int[] FDArrayOffsets;
+ public int[] PrivateSubrsOffset;
+ public int[][] PrivateSubrsOffsetsArray;
+ public int[] SubrsOffsets;
+ }
+ // Changed from private to protected by Ygal&Oren
+ protected Font[] fonts;
+
+ public CFFFont(RandomAccessFileOrArray inputbuffer) {
+
+ //System.err.println("CFF: nStdString = "+standardStrings.length);
+ buf = inputbuffer;
+ seek(0);
+
+ int major, minor;
+ major = getCard8();
+ minor = getCard8();
+
+ //System.err.println("CFF Major-Minor = "+major+"-"+minor);
+
+ int hdrSize = getCard8();
+
+ offSize = getCard8();
+
+ //System.err.println("offSize = "+offSize);
+
+ //int count, indexOffSize, indexOffset, nextOffset;
+
+ nameIndexOffset = hdrSize;
+ nameOffsets = getIndex(nameIndexOffset);
+ topdictIndexOffset = nameOffsets[nameOffsets.length-1];
+ topdictOffsets = getIndex(topdictIndexOffset);
+ stringIndexOffset = topdictOffsets[topdictOffsets.length-1];
+ stringOffsets = getIndex(stringIndexOffset);
+ gsubrIndexOffset = stringOffsets[stringOffsets.length-1];
+ gsubrOffsets = getIndex(gsubrIndexOffset);
+
+ fonts = new Font[nameOffsets.length-1];
+
+ // now get the name index
+
+ /*
+ names = new String[nfonts];
+ privateOffset = new int[nfonts];
+ charsetOffset = new int[nfonts];
+ encodingOffset = new int[nfonts];
+ charstringsOffset = new int[nfonts];
+ fdarrayOffset = new int[nfonts];
+ fdselectOffset = new int[nfonts];
+ */
+
+ for (int j=0; j<nameOffsets.length-1; j++) {
+ fonts[j] = new Font();
+ seek(nameOffsets[j]);
+ fonts[j].name = "";
+ for (int k=nameOffsets[j]; k<nameOffsets[j+1]; k++) {
+ fonts[j].name += (char)getCard8();
+ }
+ //System.err.println("name["+j+"]=<"+fonts[j].name+">");
+ }
+
+ // string index
+
+ //strings = new String[stringOffsets.length-1];
+ /*
+ System.err.println("std strings = "+standardStrings.length);
+ System.err.println("fnt strings = "+(stringOffsets.length-1));
+ for (char j=0; j<standardStrings.length+(stringOffsets.length-1); j++) {
+ //seek(stringOffsets[j]);
+ //strings[j] = "";
+ //for (int k=stringOffsets[j]; k<stringOffsets[j+1]; k++) {
+ // strings[j] += (char)getCard8();
+ //}
+ System.err.println("j="+(int)j+" <? "+(standardStrings.length+(stringOffsets.length-1)));
+ System.err.println("strings["+(int)j+"]=<"+getString(j)+">");
+ }
+ */
+
+ // top dict
+
+ for (int j=0; j<topdictOffsets.length-1; j++) {
+ seek(topdictOffsets[j]);
+ while (getPosition() < topdictOffsets[j+1]) {
+ getDictItem();
+ if (key=="FullName") {
+ //System.err.println("getting fullname sid = "+((Integer)args[0]).intValue());
+ fonts[j].fullName = getString((char)((Integer)args[0]).intValue());
+ //System.err.println("got it");
+ } else if (key=="ROS")
+ fonts[j].isCID = true;
+ else if (key=="Private") {
+ fonts[j].privateLength = ((Integer)args[0]).intValue();
+ fonts[j].privateOffset = ((Integer)args[1]).intValue();
+ }
+ else if (key=="charset"){
+ fonts[j].charsetOffset = ((Integer)args[0]).intValue();
+
+ }
+ else if (key=="Encoding"){
+ fonts[j].encodingOffset = ((Integer)args[0]).intValue();
+ ReadEncoding(fonts[j].encodingOffset);
+ }
+ else if (key=="CharStrings") {
+ fonts[j].charstringsOffset = ((Integer)args[0]).intValue();
+ //System.err.println("charstrings "+fonts[j].charstringsOffset);
+ // Added by Oren & Ygal
+ int p = getPosition();
+ fonts[j].charstringsOffsets = getIndex(fonts[j].charstringsOffset);
+ seek(p);
+ } else if (key=="FDArray")
+ fonts[j].fdarrayOffset = ((Integer)args[0]).intValue();
+ else if (key=="FDSelect")
+ fonts[j].fdselectOffset = ((Integer)args[0]).intValue();
+ else if (key=="CharstringType")
+ fonts[j].CharstringType = ((Integer)args[0]).intValue();
+ }
+
+ // private dict
+ if (fonts[j].privateOffset >= 0) {
+ //System.err.println("PRIVATE::");
+ seek(fonts[j].privateOffset);
+ while (getPosition() < fonts[j].privateOffset+fonts[j].privateLength) {
+ getDictItem();
+ if (key=="Subrs")
+ //Add the private offset to the lsubrs since the offset is
+ // relative to the begining of the PrivateDict
+ fonts[j].privateSubrs = ((Integer)args[0]).intValue()+fonts[j].privateOffset;
+ }
+ }
+
+ // fdarray index
+ if (fonts[j].fdarrayOffset >= 0) {
+ int[] fdarrayOffsets = getIndex(fonts[j].fdarrayOffset);
+
+ fonts[j].fdprivateOffsets = new int[fdarrayOffsets.length-1];
+ fonts[j].fdprivateLengths = new int[fdarrayOffsets.length-1];
+
+ //System.err.println("FD Font::");
+
+ for (int k=0; k<fdarrayOffsets.length-1; k++) {
+ seek(fdarrayOffsets[k]);
+ while (getPosition() < fdarrayOffsets[k+1])
+ getDictItem();
+ if (key=="Private") {
+ fonts[j].fdprivateLengths[k] = ((Integer)args[0]).intValue();
+ fonts[j].fdprivateOffsets[k] = ((Integer)args[1]).intValue();
+ }
+
+ }
+ }
+ }
+ //System.err.println("CFF: done");
+ }
+
+ // ADDED BY Oren & Ygal
+
+ void ReadEncoding(int nextIndexOffset){
+ int format;
+ seek(nextIndexOffset);
+ format = getCard8();
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/pdf/CFFFontSubset.java b/src/main/java/com/lowagie/text/pdf/CFFFontSubset.java
new file mode 100644
index 0000000..111f899
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/CFFFontSubset.java
@@ -0,0 +1,1633 @@
+/*
+ * $Id: CFFFontSubset.java,v 1.3 2005/02/17 09:20:54 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2004 Oren Manor and Ygal Blum
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999-2005 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000-2005 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+package com.lowagie.text.pdf;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.ArrayList;
+import java.io.*;
+
+/**
+ * This Class subsets a CFF Type Font. The subset is preformed for CID fonts and NON CID fonts.
+ * The Charstring is subseted for both types. For CID fonts only the FDArray which are used are embedded.
+ * The Lsubroutines of the FDArrays used are subsetted as well. The Subroutine subset supports both Type1 and Type2
+ * formatting altough only tested on Type2 Format.
+ * For Non CID the Lsubroutines are subsetted. On both types the Gsubroutines is subsetted.
+ * A font which was not of CID type is transformed into CID as a part of the subset process.
+ * The CID synthetic creation was written by Sivan Toledo <sivan@math.tau.ac.il>
+ * @author Oren Manor <manorore@post.tau.ac.il> & Ygal Blum <blumygal@post.tau.ac.il>
+ */
+public class CFFFontSubset extends CFFFont {
+
+ /**
+ * The Strings in this array represent Type1/Type2 operator names
+ */
+ static final String SubrsFunctions[] = {
+ "RESERVED_0","hstem","RESERVED_2","vstem","vmoveto","rlineto","hlineto","vlineto",
+ "rrcurveto","RESERVED_9","callsubr","return","escape","RESERVED_13",
+ "endchar","RESERVED_15","RESERVED_16","RESERVED_17","hstemhm","hintmask",
+ "cntrmask","rmoveto","hmoveto","vstemhm","rcurveline","rlinecurve","vvcurveto",
+ "hhcurveto","shortint","callgsubr","vhcurveto","hvcurveto"
+ };
+ /**
+ * The Strings in this array represent Type1/Type2 escape operator names
+ */
+ static final String SubrsEscapeFuncs[] = {
+ "RESERVED_0","RESERVED_1","RESERVED_2","and","or","not","RESERVED_6",
+ "RESERVED_7","RESERVED_8","abs","add","sub","div","RESERVED_13","neg",
+ "eq","RESERVED_16","RESERVED_17","drop","RESERVED_19","put","get","ifelse",
+ "random","mul","RESERVED_25","sqrt","dup","exch","index","roll","RESERVED_31",
+ "RESERVED_32","RESERVED_33","hflex","flex","hflex1","flex1","RESERVED_REST"
+ };
+
+ /**
+ * A HashMap containing the glyphs used in the text after being converted
+ * to glyph number by the CMap
+ */
+ HashMap GlyphsUsed;
+ /**
+ * The GlyphsUsed keys as an ArrayList
+ */
+ ArrayList glyphsInList;
+ /**
+ * A HashMap for keeping the FDArrays being used by the font
+ */
+ HashMap FDArrayUsed = new HashMap();
+ /**
+ * A HashMaps array for keeping the subroutines used in each FontDict
+ */
+ HashMap[] hSubrsUsed;
+ /**
+ * The SubroutinesUsed HashMaps as ArrayLists
+ */
+ ArrayList[] lSubrsUsed;
+ /**
+ * A HashMap for keeping the Global subroutines used in the font
+ */
+ HashMap hGSubrsUsed = new HashMap();
+ /**
+ * The Global SubroutinesUsed HashMaps as ArrayLists
+ */
+ ArrayList lGSubrsUsed = new ArrayList();
+ /**
+ * A HashMap for keeping the subroutines used in a non-cid font
+ */
+ HashMap hSubrsUsedNonCID = new HashMap();
+ /**
+ * The SubroutinesUsed HashMap as ArrayList
+ */
+ ArrayList lSubrsUsedNonCID = new ArrayList();
+ /**
+ * An array of the new Indexs for the local Subr. One index for each FontDict
+ */
+ byte[][] NewLSubrsIndex;
+ /**
+ * The new subroutines index for a non-cid font
+ */
+ byte[] NewSubrsIndexNonCID;
+ /**
+ * The new global subroutines index of the font
+ */
+ byte[] NewGSubrsIndex;
+ /**
+ * The new CharString of the font
+ */
+ byte[] NewCharStringsIndex;
+
+ /**
+ * The bias for the global subroutines
+ */
+ int GBias = 0;
+
+ /**
+ * The linked list for generating the new font stream
+ */
+ LinkedList OutputList;
+
+ /**
+ * Number of arguments to the stem operators in a subroutine calculated recursivly
+ */
+ int NumOfHints=0;
+
+
+ /**
+ * C'tor for CFFFontSubset
+ * @param rf - The font file
+ * @param GlyphsUsed - a HashMap that contains the glyph used in the subset
+ */
+ public CFFFontSubset(RandomAccessFileOrArray rf,HashMap GlyphsUsed){
+ // Use CFFFont c'tor in order to parse the font file.
+ super(rf);
+ this.GlyphsUsed = GlyphsUsed;
+ //Put the glyphs into a list
+ glyphsInList = new ArrayList(GlyphsUsed.keySet());
+
+
+ for (int i=0;i<fonts.length;++i)
+ {
+ // Read the number of glyphs in the font
+ seek(fonts[i].charstringsOffset);
+ fonts[i].nglyphs = getCard16();
+
+ // Jump to the count field of the String Index
+ seek(stringIndexOffset);
+ fonts[i].nstrings = getCard16()+standardStrings.length;
+
+ // For each font save the offset array of the charstring
+ fonts[i].charstringsOffsets = getIndex(fonts[i].charstringsOffset);
+
+ // Proces the FDSelect if exist
+ if (fonts[i].fdselectOffset>=0)
+ {
+ // Proces the FDSelect
+ readFDSelect(i);
+ // Build the FDArrayUsed hashmap
+ BuildFDArrayUsed(i);
+ }
+ if (fonts[i].isCID)
+ // Build the FD Array used Hash Map
+ ReadFDArray(i);
+ // compute the charset length
+ fonts[i].CharsetLength = CountCharset(fonts[i].charsetOffset,fonts[i].nglyphs);
+ }
+ }
+
+ /**
+ * Calculates the length of the charset according to its format
+ * @param Offset The Charset Offset
+ * @param NumofGlyphs Number of glyphs in the font
+ * @return the length of the Charset
+ */
+ int CountCharset(int Offset,int NumofGlyphs){
+ int format;
+ int Length=0;
+ seek(Offset);
+ // Read the format
+ format = getCard8();
+ // Calc according to format
+ switch (format){
+ case 0:
+ Length = 1+2*NumofGlyphs;
+ break;
+ case 1:
+ Length = 1+3*CountRange(NumofGlyphs,1);
+ break;
+ case 2:
+ Length = 1+4*CountRange(NumofGlyphs,2);
+ break;
+ default:
+ break;
+ }
+ return Length;
+ }
+
+ /**
+ * Function calculates the number of ranges in the Charset
+ * @param NumofGlyphs The number of glyphs in the font
+ * @param Type The format of the Charset
+ * @return The number of ranges in the Charset data structure
+ */
+ int CountRange(int NumofGlyphs,int Type){
+ int num=0;
+ char Sid;
+ int i=1,nLeft,Places;
+ while (i<NumofGlyphs){
+ num++;
+ Sid = getCard16();
+ if (Type==1)
+ nLeft = getCard8();
+ else
+ nLeft = getCard16();
+ i += nLeft+1;
+ }
+ return num;
+ }
+
+
+ /**
+ * Read the FDSelect of the font and compute the array and its length
+ * @param Font The index of the font being processed
+ * @return The Processed FDSelect of the font
+ */
+ protected void readFDSelect(int Font)
+ {
+ // Restore the number of glyphs
+ int NumOfGlyphs = fonts[Font].nglyphs;
+ int[] FDSelect = new int[NumOfGlyphs];
+ // Go to the beginning of the FDSelect
+ seek(fonts[Font].fdselectOffset);
+ // Read the FDSelect's format
+ fonts[Font].FDSelectFormat = getCard8();
+
+ switch(fonts[Font].FDSelectFormat){
+ // Format==0 means each glyph has an entry that indicated
+ // its FD.
+ case 0:
+ for (int i=0;i<NumOfGlyphs;i++)
+ {
+ FDSelect[i] = getCard8();
+ }
+ // The FDSelect's Length is one for each glyph + the format
+ // for later use
+ fonts[Font].FDSelectLength = fonts[Font].nglyphs+1;
+ break;
+ case 3:
+ // Format==3 means the ranges version
+ // The number of ranges
+ int nRanges = getCard16();
+ int l=0;
+ // Read the first in the first range
+ int first = getCard16();
+ for (int i=0;i<nRanges;i++)
+ {
+ // Read the FD index
+ int fd = getCard8();
+ // Read the first of the next range
+ int last = getCard16();
+ // Calc the steps and write to the array
+ int steps = last-first;
+ for (int k=0;k<steps;k++)
+ {
+ FDSelect[l] = fd;
+ l++;
+ }
+ // The last from this iteration is the first of the next
+ first = last;
+ }
+ // Store the length for later use
+ fonts[Font].FDSelectLength = 1+2+nRanges*3+2;
+ break;
+ default:
+ break;
+ }
+ // Save the FDSelect of the font
+ fonts[Font].FDSelect = FDSelect;
+ }
+
+ /**
+ * Function reads the FDSelect and builds the FDArrayUsed HashMap According to the glyphs used
+ * @param Font the Number of font being processed
+ */
+ protected void BuildFDArrayUsed(int Font)
+ {
+ int[] FDSelect = fonts[Font].FDSelect;
+ // For each glyph used
+ for (int i=0;i<glyphsInList.size();i++)
+ {
+ // Pop the glyphs index
+ int glyph = ((Integer)glyphsInList.get(i)).intValue();
+ // Pop the glyph's FD
+ int FD = FDSelect[glyph];
+ // Put the FD index into the FDArrayUsed HashMap
+ FDArrayUsed.put(new Integer(FD),null);
+ }
+ }
+
+ /**
+ * Read the FDArray count, offsize and Offset array
+ * @param Font
+ */
+ protected void ReadFDArray(int Font)
+ {
+ seek(fonts[Font].fdarrayOffset);
+ fonts[Font].FDArrayCount = getCard16();
+ fonts[Font].FDArrayOffsize = getCard8();
+ // Since we will change values inside the FDArray objects
+ // We increase its offsize to prevent errors
+ if (fonts[Font].FDArrayOffsize < 4)
+ fonts[Font].FDArrayOffsize++;
+ fonts[Font].FDArrayOffsets = getIndex(fonts[Font].fdarrayOffset);
+ }
+
+
+ /**
+ * The Process function extracts one font out of the CFF file and returns a
+ * subset version of the original.
+ * @param fontName - The name of the font to be taken out of the CFF
+ * @return The new font stream
+ * @throws IOException
+ */
+ public byte[] Process(String fontName)throws IOException{
+ try
+ {
+ // Verify that the file is open
+ buf.reOpen();
+ // Find the Font that we will be dealing with
+ int j;
+ for (j=0; j<fonts.length; j++)
+ if (fontName.equals(fonts[j].name)) break;
+ if (j==fonts.length) return null;
+
+ // Calc the bias for the global subrs
+ if (gsubrIndexOffset >= 0)
+ GBias = CalcBias(gsubrIndexOffset,j);
+
+ // Prepare the new CharStrings Index
+ BuildNewCharString(j);
+ // Prepare the new Global and Local Subrs Indices
+ BuildNewLGSubrs(j);
+ // Build the new file
+ byte[] Ret = BuildNewFile(j);
+ return Ret;
+ }
+ finally {
+ try {
+ buf.close();
+ }
+ catch (Exception e) {
+ // empty on purpose
+ }
+ }
+ }
+
+ /**
+ * Function calcs bias according to the CharString type and the count
+ * of the subrs
+ * @param Offset The offset to the relevent subrs index
+ * @param Font the font
+ * @return The calculated Bias
+ */
+ protected int CalcBias(int Offset,int Font)
+ {
+ seek(Offset);
+ int nSubrs = getCard16();
+ // If type==1 -> bias=0
+ if (fonts[Font].CharstringType == 1)
+ return 0;
+ // else calc according to the count
+ else if (nSubrs < 1240)
+ return 107;
+ else if (nSubrs < 33900)
+ return 1131;
+ else
+ return 32768;
+ }
+
+ /**
+ *Function uses BuildNewIndex to create the new index of the subset charstrings
+ * @param FontIndex the font
+ * @throws IOException
+ */
+ protected void BuildNewCharString(int FontIndex) throws IOException
+ {
+ NewCharStringsIndex = BuildNewIndex(fonts[FontIndex].charstringsOffsets,GlyphsUsed);
+ }
+
+ /**
+ * Function builds the new local & global subsrs indices. IF CID then All of
+ * the FD Array lsubrs will be subsetted.
+ * @param Font the font
+ * @throws IOException
+ */
+ protected void BuildNewLGSubrs(int Font)throws IOException
+ {
+ // If the font is CID then the lsubrs are divided into FontDicts.
+ // for each FD array the lsubrs will be subsetted.
+ if(fonts[Font].isCID)
+ {
+ // Init the hasmap-array and the arraylist-array to hold the subrs used
+ // in each private dict.
+ hSubrsUsed = new HashMap[fonts[Font].fdprivateOffsets.length];
+ lSubrsUsed = new ArrayList[fonts[Font].fdprivateOffsets.length];
+ // A [][] which will store the byte array for each new FD Array lsubs index
+ NewLSubrsIndex = new byte[fonts[Font].fdprivateOffsets.length][];
+ // An array to hold the offset for each Lsubr index
+ fonts[Font].PrivateSubrsOffset = new int[fonts[Font].fdprivateOffsets.length];
+ // A [][] which will store the offset array for each lsubr index
+ fonts[Font].PrivateSubrsOffsetsArray = new int[fonts[Font].fdprivateOffsets.length][];
+
+ // Put the FDarrayUsed into a list
+ ArrayList FDInList = new ArrayList(FDArrayUsed.keySet());
+ // For each FD array which is used subset the lsubr
+ for (int j=0;j<FDInList.size();j++)
+ {
+ // The FDArray index, Hash Map, Arrat List to work on
+ int FD = ((Integer)FDInList.get(j)).intValue();
+ hSubrsUsed[FD] = new HashMap();
+ lSubrsUsed[FD] = new ArrayList();
+ //Reads the private dicts looking for the subr operator and
+ // store both the offest for the index and its offset array
+ BuildFDSubrsOffsets(Font,FD);
+ // Verify that FDPrivate has a LSubrs index
+ if(fonts[Font].PrivateSubrsOffset[FD]>=0)
+ {
+ //Scans the Charsting data storing the used Local and Global subroutines
+ // by the glyphs. Scans the Subrs recursivley.
+ BuildSubrUsed(Font,FD,fonts[Font].PrivateSubrsOffset[FD],fonts[Font].PrivateSubrsOffsetsArray[FD],hSubrsUsed[FD],lSubrsUsed[FD]);
+ // Builds the New Local Subrs index
+ NewLSubrsIndex[FD] = BuildNewIndex(fonts[Font].PrivateSubrsOffsetsArray[FD],hSubrsUsed[FD]);
+ }
+ }
+ }
+ // If the font is not CID && the Private Subr exists then subset:
+ else if (fonts[Font].privateSubrs>=0)
+ {
+ // Build the subrs offsets;
+ fonts[Font].SubrsOffsets = getIndex(fonts[Font].privateSubrs);
+ //Scans the Charsting data storing the used Local and Global subroutines
+ // by the glyphs. Scans the Subrs recursivley.
+ BuildSubrUsed(Font,-1,fonts[Font].privateSubrs,fonts[Font].SubrsOffsets,hSubrsUsedNonCID,lSubrsUsedNonCID);
+ }
+ // For all fonts susbset the Global Subroutines
+ // Scan the Global Subr Hashmap recursivly on the Gsubrs
+ BuildGSubrsUsed(Font);
+ if (fonts[Font].privateSubrs>=0)
+ // Builds the New Local Subrs index
+ NewSubrsIndexNonCID = BuildNewIndex(fonts[Font].SubrsOffsets,hSubrsUsedNonCID);
+ //Builds the New Global Subrs index
+ NewGSubrsIndex = BuildNewIndex(gsubrOffsets,hGSubrsUsed);
+ }
+
+ /**
+ * The function finds for the FD array processed the local subr offset and its
+ * offset array.
+ * @param Font the font
+ * @param FD The FDARRAY processed
+ */
+ protected void BuildFDSubrsOffsets(int Font,int FD)
+ {
+ // Initiate to -1 to indicate lsubr operator present
+ fonts[Font].PrivateSubrsOffset[FD] = -1;
+ // Goto begining of objects
+ seek(fonts[Font].fdprivateOffsets[FD]);
+ // While in the same object:
+ while (getPosition() < fonts[Font].fdprivateOffsets[FD]+fonts[Font].fdprivateLengths[FD])
+ {
+ getDictItem();
+ // If the dictItem is the "Subrs" then find and store offset,
+ if (key=="Subrs")
+ fonts[Font].PrivateSubrsOffset[FD] = ((Integer)args[0]).intValue()+fonts[Font].fdprivateOffsets[FD];
+ }
+ //Read the lsub index if the lsubr was found
+ if (fonts[Font].PrivateSubrsOffset[FD] >= 0)
+ fonts[Font].PrivateSubrsOffsetsArray[FD] = getIndex(fonts[Font].PrivateSubrsOffset[FD]);
+ }
+
+ /**
+ * Function uses ReadAsubr on the glyph used to build the LSubr & Gsubr HashMap.
+ * The HashMap (of the lsub only) is then scaned recursivly for Lsubr & Gsubrs
+ * calls.
+ * @param Font the font
+ * @param FD FD array processed. 0 indicates function was called by non CID font
+ * @param SubrOffset the offset to the subr index to calc the bias
+ * @param SubrsOffsets the offset array of the subr index
+ * @param hSubr HashMap of the subrs used
+ * @param lSubr ArrayList of the subrs used
+ */
+ protected void BuildSubrUsed(int Font,int FD,int SubrOffset,int[] SubrsOffsets,HashMap hSubr,ArrayList lSubr)
+ {
+
+ // Calc the Bias for the subr index
+ int LBias = CalcBias(SubrOffset,Font);
+
+ // For each glyph used find its GID, start & end pos
+ for (int i=0;i<glyphsInList.size();i++)
+ {
+ int glyph = ((Integer)glyphsInList.get(i)).intValue();
+ int Start = fonts[Font].charstringsOffsets[glyph];
+ int End = fonts[Font].charstringsOffsets[glyph+1];
+
+ // IF CID:
+ if (FD >= 0)
+ {
+ EmptyStack();
+ NumOfHints=0;
+ // Using FDSELECT find the FD Array the glyph belongs to.
+ int GlyphFD = fonts[Font].FDSelect[glyph];
+ // If the Glyph is part of the FD being processed
+ if (GlyphFD == FD)
+ // Find the Subrs called by the glyph and insert to hash:
+ ReadASubr(Start,End,GBias,LBias,hSubr,lSubr,SubrsOffsets);
+ }
+ else
+ // If the font is not CID
+ //Find the Subrs called by the glyph and insert to hash:
+ ReadASubr(Start,End,GBias,LBias,hSubr,lSubr,SubrsOffsets);
+ }
+ // For all Lsubrs used, check recusrivly for Lsubr & Gsubr used
+ for (int i=0;i<lSubr.size();i++)
+ {
+ // Pop the subr value from the hash
+ int Subr = ((Integer)lSubr.get(i)).intValue();
+ // Ensure the Lsubr call is valid
+ if (Subr < SubrsOffsets.length-1 && Subr>=0)
+ {
+ // Read and process the subr
+ int Start = SubrsOffsets[Subr];
+ int End = SubrsOffsets[Subr+1];
+ ReadASubr(Start,End,GBias,LBias,hSubr,lSubr,SubrsOffsets);
+ }
+ }
+ }
+
+ /**
+ * Function scans the Glsubr used ArrayList to find recursive calls
+ * to Gsubrs and adds to Hashmap & ArrayList
+ * @param Font the font
+ */
+ protected void BuildGSubrsUsed(int Font)
+ {
+ int LBias = 0;
+ int SizeOfNonCIDSubrsUsed = 0;
+ if (fonts[Font].privateSubrs>=0)
+ {
+ LBias = CalcBias(fonts[Font].privateSubrs,Font);
+ SizeOfNonCIDSubrsUsed = lSubrsUsedNonCID.size();
+ }
+
+ // For each global subr used
+ for (int i=0;i<lGSubrsUsed.size();i++)
+ {
+ //Pop the value + check valid
+ int Subr = ((Integer)lGSubrsUsed.get(i)).intValue();
+ if (Subr < gsubrOffsets.length-1 && Subr>=0)
+ {
+ // Read the subr and process
+ int Start = gsubrOffsets[Subr];
+ int End = gsubrOffsets[Subr+1];
+
+ if (fonts[Font].isCID)
+ ReadASubr(Start,End,GBias,0,hGSubrsUsed,lGSubrsUsed,null);
+ else
+ {
+ ReadASubr(Start,End,GBias,LBias,hSubrsUsedNonCID,lSubrsUsedNonCID,fonts[Font].SubrsOffsets);
+ if (SizeOfNonCIDSubrsUsed < lSubrsUsedNonCID.size())
+ {
+ for (int j=SizeOfNonCIDSubrsUsed;j<lSubrsUsedNonCID.size();j++)
+ {
+ //Pop the value + check valid
+ int LSubr = ((Integer)lSubrsUsedNonCID.get(j)).intValue();
+ if (LSubr < fonts[Font].SubrsOffsets.length-1 && LSubr>=0)
+ {
+ // Read the subr and process
+ int LStart = fonts[Font].SubrsOffsets[LSubr];
+ int LEnd = fonts[Font].SubrsOffsets[LSubr+1];
+ ReadASubr(LStart,LEnd,GBias,LBias,hSubrsUsedNonCID,lSubrsUsedNonCID,fonts[Font].SubrsOffsets);
+ }
+ }
+ SizeOfNonCIDSubrsUsed = lSubrsUsedNonCID.size();
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * The function reads a subrs (glyph info) between begin and end.
+ * Adds calls to a Lsubr to the hSubr and lSubrs.
+ * Adds calls to a Gsubr to the hGSubr and lGSubrs.
+ * @param begin the start point of the subr
+ * @param end the end point of the subr
+ * @param GBias the bias of the Global Subrs
+ * @param LBias the bias of the Local Subrs
+ * @param hSubr the HashMap for the lSubrs
+ * @param lSubr the ArrayList for the lSubrs
+ */
+ protected void ReadASubr(int begin,int end,int GBias,int LBias,HashMap hSubr,ArrayList lSubr,int[] LSubrsOffsets)
+ {
+ // Clear the stack for the subrs
+ EmptyStack();
+ NumOfHints = 0;
+ // Goto begining of the subr
+ seek(begin);
+ while (getPosition() < end)
+ {
+ // Read the next command
+ ReadCommand();
+ int pos = getPosition();
+ Object TopElement=null;
+ if (arg_count > 0)
+ TopElement = args[arg_count-1];
+ int NumOfArgs = arg_count;
+ // Check the modification needed on the Argument Stack according to key;
+ HandelStack();
+ // a call to a Lsubr
+ if (key=="callsubr")
+ {
+ // Verify that arguments are passed
+ if (NumOfArgs > 0)
+ {
+ // Calc the index of the Subrs
+ int Subr = ((Integer)TopElement).intValue() + LBias;
+ // If the subr isn't in the HashMap -> Put in
+ if (!hSubr.containsKey(new Integer (Subr)))
+ {
+ hSubr.put(new Integer(Subr),null);
+ lSubr.add(new Integer(Subr));
+ }
+ CalcHints(LSubrsOffsets[Subr],LSubrsOffsets[Subr+1],LBias,GBias,LSubrsOffsets);
+ seek(pos);
+ }
+ }
+ // a call to a Gsubr
+ else if (key=="callgsubr")
+ {
+ // Verify that arguments are passed
+ if (NumOfArgs > 0)
+ {
+ // Calc the index of the Subrs
+ int Subr = ((Integer)TopElement).intValue() + GBias;
+ // If the subr isn't in the HashMap -> Put in
+ if (!hGSubrsUsed.containsKey(new Integer (Subr)))
+ {
+ hGSubrsUsed.put(new Integer(Subr),null);
+ lGSubrsUsed.add(new Integer(Subr));
+ }
+ CalcHints(gsubrOffsets[Subr],gsubrOffsets[Subr+1],LBias,GBias,LSubrsOffsets);
+ seek(pos);
+ }
+ }
+ // A call to "stem"
+ else if (key == "hstem" || key == "vstem" || key == "hstemhm" || key == "vstemhm")
+ // Increment the NumOfHints by the number couples of of arguments
+ NumOfHints += NumOfArgs/2;
+ // A call to "mask"
+ else if (key == "hintmask" || key == "cntrmask")
+ {
+ // Compute the size of the mask
+ int SizeOfMask = NumOfHints/8;
+ if (NumOfHints%8 != 0 || SizeOfMask == 0)
+ SizeOfMask++;
+ // Continue the pointer in SizeOfMask steps
+ for (int i=0;i<SizeOfMask;i++)
+ getCard8();
+ }
+ }
+ }
+
+ /**
+ * Function Checks how the current operator effects the run time stack after being run
+ * An operator may increase or decrease the stack size
+ */
+ protected void HandelStack()
+ {
+ // Findout what the operator does to the stack
+ int StackHandel = StackOpp();
+ if (StackHandel < 2)
+ {
+ // The operators that enlarge the stack by one
+ if (StackHandel==1)
+ PushStack();
+ // The operators that pop the stack
+ else
+ {
+ // Abs value for the for loop
+ StackHandel *= -1;
+ for (int i=0;i<StackHandel;i++)
+ PopStack();
+ }
+
+ }
+ // All other flush the stack
+ else
+ EmptyStack();
+ }
+
+ /**
+ * Function checks the key and return the change to the stack after the operator
+ * @return The change in the stack. 2-> flush the stack
+ */
+ protected int StackOpp()
+ {
+ if (key == "ifelse")
+ return -3;
+ if (key == "roll" || key == "put")
+ return -2;
+ if (key == "callsubr" || key == "callgsubr" || key == "add" || key == "sub" ||
+ key == "div" || key == "mul" || key == "drop" || key == "and" ||
+ key == "or" || key == "eq")
+ return -1;
+ if (key == "abs" || key == "neg" || key == "sqrt" || key == "exch" ||
+ key == "index" || key == "get" || key == "not" || key == "return")
+ return 0;
+ if (key == "random" || key == "dup")
+ return 1;
+ return 2;
+ }
+
+ /**
+ * Empty the Type2 Stack
+ *
+ */
+ protected void EmptyStack()
+ {
+ // Null the arguments
+ for (int i=0; i<arg_count; i++) args[i]=null;
+ arg_count = 0;
+ }
+
+ /**
+ * Pop one element from the stack
+ *
+ */
+ protected void PopStack()
+ {
+ if (arg_count>0)
+ {
+ args[arg_count-1]=null;
+ arg_count--;
+ }
+ }
+
+ /**
+ * Add an item to the stack
+ *
+ */
+ protected void PushStack()
+ {
+ arg_count++;
+ }
+
+ /**
+ * The function reads the next command after the file pointer is set
+ */
+ protected void ReadCommand()
+ {
+ key = null;
+ boolean gotKey = false;
+ // Until a key is found
+ while (!gotKey) {
+ // Read the first Char
+ char b0 = getCard8();
+ // decode according to the type1/type2 format
+ if (b0 == 28) // the two next bytes represent a short int;
+ {
+ int first = getCard8();
+ int second = getCard8();
+ args[arg_count] = new Integer(first<<8 | second);
+ arg_count++;
+ continue;
+ }
+ if (b0 >= 32 && b0 <= 246) // The byte read is the byte;
+ {
+ args[arg_count] = new Integer(b0 - 139);
+ arg_count++;
+ continue;
+ }
+ if (b0 >= 247 && b0 <= 250) // The byte read and the next byte constetute a short int
+ {
+ int w = getCard8();
+ args[arg_count] = new Integer((b0-247)*256 + w + 108);
+ arg_count++;
+ continue;
+ }
+ if (b0 >= 251 && b0 <= 254)// Same as above except negative
+ {
+ int w = getCard8();
+ args[arg_count] = new Integer(-(b0-251)*256 - w - 108);
+ arg_count++;
+ continue;
+ }
+ if (b0 == 255)// The next for bytes represent a double.
+ {
+ int first = getCard8();
+ int second = getCard8();
+ int third = getCard8();
+ int fourth = getCard8();
+ args[arg_count] = new Integer(first<<24 | second<<16 | third<<8 | fourth);
+ arg_count++;
+ continue;
+ }
+ if (b0<=31 && b0 != 28) // An operator was found.. Set Key.
+ {
+ gotKey=true;
+ // 12 is an escape command therefor the next byte is a part
+ // of this command
+ if (b0 == 12)
+ {
+ int b1 = getCard8();
+ if (b1>SubrsEscapeFuncs.length-1)
+ b1 = SubrsEscapeFuncs.length-1;
+ key = SubrsEscapeFuncs[b1];
+ }
+ else
+ key = SubrsFunctions[b0];
+ continue;
+ }
+ }
+ }
+
+ /**
+ * The function reads the subroutine and returns the number of the hint in it.
+ * If a call to another subroutine is found the function calls recursively.
+ * @param begin the start point of the subr
+ * @param end the end point of the subr
+ * @param LBias the bias of the Local Subrs
+ * @param GBias the bias of the Global Subrs
+ * @param LSubrsOffsets The Offsets array of the subroutines
+ * @return The number of hints in the subroutine read.
+ */
+ protected int CalcHints(int begin,int end,int LBias,int GBias,int[] LSubrsOffsets)
+ {
+ // Goto begining of the subr
+ seek(begin);
+ while (getPosition() < end)
+ {
+ // Read the next command
+ ReadCommand();
+ int pos = getPosition();
+ Object TopElement = null;
+ if (arg_count>0)
+ TopElement = args[arg_count-1];
+ int NumOfArgs = arg_count;
+ //Check the modification needed on the Argument Stack according to key;
+ HandelStack();
+ // a call to a Lsubr
+ if (key=="callsubr")
+ {
+ if (NumOfArgs>0)
+ {
+ int Subr = ((Integer)TopElement).intValue() + LBias;
+ CalcHints(LSubrsOffsets[Subr],LSubrsOffsets[Subr+1],LBias,GBias,LSubrsOffsets);
+ seek(pos);
+ }
+ }
+ // a call to a Gsubr
+ else if (key=="callgsubr")
+ {
+ if (NumOfArgs>0)
+ {
+ int Subr = ((Integer)TopElement).intValue() + GBias;
+ CalcHints(gsubrOffsets[Subr],gsubrOffsets[Subr+1],LBias,GBias,LSubrsOffsets);
+ seek(pos);
+ }
+ }
+ // A call to "stem"
+ else if (key == "hstem" || key == "vstem" || key == "hstemhm" || key == "vstemhm")
+ // Increment the NumOfHints by the number couples of of arguments
+ NumOfHints += NumOfArgs/2;
+ // A call to "mask"
+ else if (key == "hintmask" || key == "cntrmask")
+ {
+ // Compute the size of the mask
+ int SizeOfMask = NumOfHints/8;
+ if (NumOfHints%8 != 0 || SizeOfMask == 0)
+ SizeOfMask++;
+ // Continue the pointer in SizeOfMask steps
+ for (int i=0;i<SizeOfMask;i++)
+ getCard8();
+ }
+ }
+ return NumOfHints;
+ }
+
+
+ /**
+ * Function builds the new offset array, object array and assembles the index.
+ * used for creating the glyph and subrs subsetted index
+ * @param Offsets the offset array of the original index
+ * @param Used the hashmap of the used objects
+ * @return the new index subset version
+ * @throws IOException
+ */
+ protected byte[] BuildNewIndex(int[] Offsets,HashMap Used) throws IOException
+ {
+ int Offset=0;
+ int[] NewOffsets = new int[Offsets.length];
+ // Build the Offsets Array for the Subset
+ for (int i=0;i<Offsets.length;++i)
+ {
+ NewOffsets[i] = Offset;
+ // If the object in the offset is also present in the used
+ // HashMap then increment the offset var by its size
+ if (Used.containsKey(new Integer(i)))
+ Offset += Offsets[i+1] - Offsets[i];
+ // Else the same offset is kept in i+1.
+ }
+ // Offset var determines the size of the object array
+ byte[] NewObjects = new byte[Offset];
+ // Build the new Object array
+ for (int i=0;i<Offsets.length-1;++i)
+ {
+ int start = NewOffsets[i];
+ int end = NewOffsets[i+1];
+ // If start != End then the Object is used
+ // So, we will copy the object data from the font file
+ if (start != end)
+ {
+ // All offsets are Global Offsets relative to the begining of the font file.
+ // Jump the file pointer to the start address to read from.
+ buf.seek(Offsets[i]);
+ // Read from the buffer and write into the array at start.
+ buf.readFully(NewObjects, start, end-start);
+ }
+ }
+ // Use AssembleIndex to build the index from the offset & object arrays
+ return AssembleIndex(NewOffsets,NewObjects);
+ }
+
+ /**
+ * Function creates the new index, inserting the count,offsetsize,offset array
+ * and object array.
+ * @param NewOffsets the subsetted offset array
+ * @param NewObjects the subsetted object array
+ * @return the new index created
+ */
+ protected byte[] AssembleIndex(int[] NewOffsets,byte[] NewObjects)
+ {
+ // Calc the index' count field
+ char Count = (char)(NewOffsets.length-1);
+ // Calc the size of the object array
+ int Size = NewOffsets[NewOffsets.length-1];
+ // Calc the Offsize
+ byte Offsize;
+ if (Size <= 0xff) Offsize = 1;
+ else if (Size <= 0xffff) Offsize = 2;
+ else if (Size <= 0xffffff) Offsize = 3;
+ else Offsize = 4;
+ // The byte array for the new index. The size is calc by
+ // Count=2, Offsize=1, OffsetArray = Offsize*(Count+1), The object array
+ byte[] NewIndex = new byte[2+1+Offsize*(Count+1)+NewObjects.length];
+ // The counter for writing
+ int Place = 0;
+ // Write the count field
+ NewIndex[Place++] = (byte) ((Count >>> 8) & 0xff);
+ NewIndex[Place++] = (byte) ((Count >>> 0) & 0xff);
+ // Write the offsize field
+ NewIndex[Place++] = Offsize;
+ // Write the offset array according to the offsize
+ for (int i=0;i<NewOffsets.length;i++)
+ {
+ // The value to be written
+ int Num = NewOffsets[i]-NewOffsets[0]+1;
+ // Write in bytes according to the offsize
+ switch (Offsize) {
+ case 4:
+ NewIndex[Place++] = (byte) ((Num >>> 24) & 0xff);
+ case 3:
+ NewIndex[Place++] = (byte) ((Num >>> 16) & 0xff);
+ case 2:
+ NewIndex[Place++] = (byte) ((Num >>> 8) & 0xff);
+ case 1:
+ NewIndex[Place++] = (byte) ((Num >>> 0) & 0xff);
+ }
+ }
+ // Write the new object array one by one
+ for (int i=0;i<NewObjects.length;i++)
+ {
+ NewIndex[Place++] = NewObjects[i];
+ }
+ // Return the new index
+ return NewIndex;
+ }
+
+ /**
+ * The function builds the new output stream according to the subset process
+ * @param Font the font
+ * @return the subseted font stream
+ * @throws IOException
+ */
+ protected byte[] BuildNewFile(int Font)throws IOException
+ {
+ // Prepare linked list for new font components
+ OutputList = new LinkedList();
+
+ // copy the header of the font
+ CopyHeader();
+
+ // create a name index
+ BuildIndexHeader(1,1,1);
+ OutputList.addLast(new UInt8Item((char)( 1+fonts[Font].name.length() )));
+ OutputList.addLast(new StringItem(fonts[Font].name));
+
+ // create the topdict Index
+ BuildIndexHeader(1,2,1);
+ OffsetItem topdictIndex1Ref = new IndexOffsetItem(2);
+ OutputList.addLast(topdictIndex1Ref);
+ IndexBaseItem topdictBase = new IndexBaseItem();
+ OutputList.addLast(topdictBase);
+
+ // Initialise the Dict Items for later use
+ OffsetItem charsetRef = new DictOffsetItem();
+ OffsetItem charstringsRef = new DictOffsetItem();
+ OffsetItem fdarrayRef = new DictOffsetItem();
+ OffsetItem fdselectRef = new DictOffsetItem();
+ OffsetItem privateRef = new DictOffsetItem();
+
+ // If the font is not CID create the following keys
+ if ( !fonts[Font].isCID ) {
+ // create a ROS key
+ OutputList.addLast(new DictNumberItem(fonts[Font].nstrings));
+ OutputList.addLast(new DictNumberItem(fonts[Font].nstrings+1));
+ OutputList.addLast(new DictNumberItem(0));
+ OutputList.addLast(new UInt8Item((char)12));
+ OutputList.addLast(new UInt8Item((char)30));
+ // create a CIDCount key
+ OutputList.addLast(new DictNumberItem(fonts[Font].nglyphs));
+ OutputList.addLast(new UInt8Item((char)12));
+ OutputList.addLast(new UInt8Item((char)34));
+ // Sivan's comments
+ // What about UIDBase (12,35)? Don't know what is it.
+ // I don't think we need FontName; the font I looked at didn't have it.
+ }
+ // Go to the TopDict of the font being processed
+ seek(topdictOffsets[Font]);
+ // Run untill the end of the TopDict
+ while (getPosition() < topdictOffsets[Font+1]) {
+ int p1 = getPosition();
+ getDictItem();
+ int p2 = getPosition();
+ // The encoding key is disregarded since CID has no encoding
+ if (key=="Encoding"
+ // These keys will be added manualy by the process.
+ || key=="Private"
+ || key=="FDSelect"
+ || key=="FDArray"
+ || key=="charset"
+ || key=="CharStrings"
+ ) {
+ }else {
+ //OtherWise copy key "as is" to the output list
+ OutputList.add(new RangeItem(buf,p1,p2-p1));
+ }
+ }
+ // Create the FDArray, FDSelect, Charset and CharStrings Keys
+ CreateKeys(fdarrayRef,fdselectRef,charsetRef,charstringsRef);
+
+ // Mark the end of the top dict area
+ OutputList.addLast(new IndexMarkerItem(topdictIndex1Ref,topdictBase));
+
+ // Copy the string index
+
+ if (fonts[Font].isCID)
+ OutputList.addLast(getEntireIndexRange(stringIndexOffset));
+ // If the font is not CID we need to append new strings.
+ // We need 3 more strings: Registry, Ordering, and a FontName for one FD.
+ // The total length is at most "Adobe"+"Identity"+63 = 76
+ else
+ CreateNewStringIndex(Font);
+
+ // copy the new subsetted global subroutine index
+ OutputList.addLast(new RangeItem(new RandomAccessFileOrArray(NewGSubrsIndex),0,NewGSubrsIndex.length));
+
+ // deal with fdarray, fdselect, and the font descriptors
+ // If the font is CID:
+ if (fonts[Font].isCID) {
+ // copy the FDArray, FDSelect, charset
+
+ // Copy FDSelect
+ // Mark the beginning
+ OutputList.addLast(new MarkerItem(fdselectRef));
+ // If an FDSelect exists copy it
+ if (fonts[Font].fdselectOffset>=0)
+ OutputList.addLast(new RangeItem(buf,fonts[Font].fdselectOffset,fonts[Font].FDSelectLength));
+ // Else create a new one
+ else
+ CreateFDSelect(fdselectRef,fonts[Font].nglyphs);
+
+ // Copy the Charset
+ // Mark the beginning and copy entirly
+ OutputList.addLast(new MarkerItem(charsetRef));
+ OutputList.addLast(new RangeItem(buf,fonts[Font].charsetOffset,fonts[Font].CharsetLength));
+
+ // Copy the FDArray
+ // If an FDArray exists
+ if (fonts[Font].fdarrayOffset>=0)
+ {
+ // Mark the beginning
+ OutputList.addLast(new MarkerItem(fdarrayRef));
+ // Build a new FDArray with its private dicts and their LSubrs
+ Reconstruct(Font);
+ }
+ else
+ // Else create a new one
+ CreateFDArray(fdarrayRef,privateRef,Font);
+
+ }
+ // If the font is not CID
+ else
+ {
+ // create FDSelect
+ CreateFDSelect(fdselectRef,fonts[Font].nglyphs);
+ // recreate a new charset
+ CreateCharset(charsetRef,fonts[Font].nglyphs);
+ // create a font dict index (fdarray)
+ CreateFDArray(fdarrayRef,privateRef,Font);
+ }
+
+ // if a private dict exists insert its subsetted version
+ if (fonts[Font].privateOffset>=0)
+ {
+ // Mark the beginning of the private dict
+ IndexBaseItem PrivateBase = new IndexBaseItem();
+ OutputList.addLast(PrivateBase);
+ OutputList.addLast(new MarkerItem(privateRef));
+
+ OffsetItem Subr = new DictOffsetItem();
+ // Build and copy the new private dict
+ CreateNonCIDPrivate(Font,Subr);
+ // Copy the new LSubrs index
+ CreateNonCIDSubrs(Font,PrivateBase,Subr);
+ }
+
+ // copy the charstring index
+ OutputList.addLast(new MarkerItem(charstringsRef));
+
+ // Add the subsetted charstring
+ OutputList.addLast(new RangeItem(new RandomAccessFileOrArray(NewCharStringsIndex),0,NewCharStringsIndex.length));
+
+ // now create the new CFF font
+ int[] currentOffset = new int[1];
+ currentOffset[0] = 0;
+ // Count and save the offset for each item
+ Iterator listIter = OutputList.iterator();
+ while ( listIter.hasNext() ) {
+ Item item = (Item) listIter.next();
+ item.increment(currentOffset);
+ }
+ // Compute the Xref for each of the offset items
+ listIter = OutputList.iterator();
+ while ( listIter.hasNext() ) {
+ Item item = (Item) listIter.next();
+ item.xref();
+ }
+
+ int size = currentOffset[0];
+ byte[] b = new byte[size];
+
+ // Emit all the items into the new byte array
+ listIter = OutputList.iterator();
+ while ( listIter.hasNext() ) {
+ Item item = (Item) listIter.next();
+ item.emit(b);
+ }
+ // Return the new stream
+ return b;
+ }
+
+ /**
+ * Function Copies the header from the original fileto the output list
+ */
+ protected void CopyHeader()
+ {
+ seek(0);
+ int major = getCard8();
+ int minor = getCard8();
+ int hdrSize = getCard8();
+ int offSize = getCard8();
+ nextIndexOffset = hdrSize;
+ OutputList.addLast(new RangeItem(buf,0,hdrSize));
+ }
+
+ /**
+ * Function Build the header of an index
+ * @param Count the count field of the index
+ * @param Offsize the offsize field of the index
+ * @param First the first offset of the index
+ */
+ protected void BuildIndexHeader(int Count,int Offsize,int First)
+ {
+ // Add the count field
+ OutputList.addLast(new UInt16Item((char)Count)); // count
+ // Add the offsize field
+ OutputList.addLast(new UInt8Item((char)Offsize)); // offSize
+ // Add the first offset according to the offsize
+ switch(Offsize){
+ case 1:
+ OutputList.addLast(new UInt8Item((char)First)); // first offset
+ break;
+ case 2:
+ OutputList.addLast(new UInt16Item((char)First)); // first offset
+ break;
+ case 3:
+ OutputList.addLast(new UInt24Item((char)First)); // first offset
+ break;
+ case 4:
+ OutputList.addLast(new UInt32Item((char)First)); // first offset
+ break;
+ default:
+ break;
+ }
+ }
+
+ /**
+ * Function adds the keys into the TopDict
+ * @param fdarrayRef OffsetItem for the FDArray
+ * @param fdselectRef OffsetItem for the FDSelect
+ * @param charsetRef OffsetItem for the CharSet
+ * @param charstringsRef OffsetItem for the CharString
+ */
+ protected void CreateKeys(OffsetItem fdarrayRef,OffsetItem fdselectRef,OffsetItem charsetRef,OffsetItem charstringsRef)
+ {
+ // create an FDArray key
+ OutputList.addLast(fdarrayRef);
+ OutputList.addLast(new UInt8Item((char)12));
+ OutputList.addLast(new UInt8Item((char)36));
+ // create an FDSelect key
+ OutputList.addLast(fdselectRef);
+ OutputList.addLast(new UInt8Item((char)12));
+ OutputList.addLast(new UInt8Item((char)37));
+ // create an charset key
+ OutputList.addLast(charsetRef);
+ OutputList.addLast(new UInt8Item((char)15));
+ // create a CharStrings key
+ OutputList.addLast(charstringsRef);
+ OutputList.addLast(new UInt8Item((char)17));
+ }
+
+ /**
+ * Function takes the original string item and adds the new strings
+ * to accomodate the CID rules
+ * @param Font the font
+ */
+ protected void CreateNewStringIndex(int Font)
+ {
+ String fdFontName = fonts[Font].name+"-OneRange";
+ if (fdFontName.length() > 127)
+ fdFontName = fdFontName.substring(0,127);
+ String extraStrings = "Adobe"+"Identity"+fdFontName;
+
+ int origStringsLen = stringOffsets[stringOffsets.length-1]
+ - stringOffsets[0];
+ int stringsBaseOffset = stringOffsets[0]-1;
+
+ byte stringsIndexOffSize;
+ if (origStringsLen+extraStrings.length() <= 0xff) stringsIndexOffSize = 1;
+ else if (origStringsLen+extraStrings.length() <= 0xffff) stringsIndexOffSize = 2;
+ else if (origStringsLen+extraStrings.length() <= 0xffffff) stringsIndexOffSize = 3;
+ else stringsIndexOffSize = 4;
+
+ OutputList.addLast(new UInt16Item((char)((stringOffsets.length-1)+3))); // count
+ OutputList.addLast(new UInt8Item((char)stringsIndexOffSize)); // offSize
+ for (int i=0; i<stringOffsets.length; i++)
+ OutputList.addLast(new IndexOffsetItem(stringsIndexOffSize,
+ stringOffsets[i]-stringsBaseOffset));
+ int currentStringsOffset = stringOffsets[stringOffsets.length-1]
+ - stringsBaseOffset;
+ //l.addLast(new IndexOffsetItem(stringsIndexOffSize,currentStringsOffset));
+ currentStringsOffset += ("Adobe").length();
+ OutputList.addLast(new IndexOffsetItem(stringsIndexOffSize,currentStringsOffset));
+ currentStringsOffset += ("Identity").length();
+ OutputList.addLast(new IndexOffsetItem(stringsIndexOffSize,currentStringsOffset));
+ currentStringsOffset += fdFontName.length();
+ OutputList.addLast(new IndexOffsetItem(stringsIndexOffSize,currentStringsOffset));
+
+ OutputList.addLast(new RangeItem(buf,stringOffsets[0],origStringsLen));
+ OutputList.addLast(new StringItem(extraStrings));
+ }
+
+ /**
+ * Function creates new FDSelect for non-CID fonts.
+ * The FDSelect built uses a single range for all glyphs
+ * @param fdselectRef OffsetItem for the FDSelect
+ * @param nglyphs the number of glyphs in the font
+ */
+ protected void CreateFDSelect(OffsetItem fdselectRef,int nglyphs)
+ {
+ OutputList.addLast(new MarkerItem(fdselectRef));
+ OutputList.addLast(new UInt8Item((char)3)); // format identifier
+ OutputList.addLast(new UInt16Item((char)1)); // nRanges
+
+ OutputList.addLast(new UInt16Item((char)0)); // Range[0].firstGlyph
+ OutputList.addLast(new UInt8Item((char)0)); // Range[0].fd
+
+ OutputList.addLast(new UInt16Item((char)nglyphs)); // sentinel
+ }
+
+ /**
+ * Function creates new CharSet for non-CID fonts.
+ * The CharSet built uses a single range for all glyphs
+ * @param charsetRef OffsetItem for the CharSet
+ * @param nglyphs the number of glyphs in the font
+ */
+ protected void CreateCharset(OffsetItem charsetRef,int nglyphs)
+ {
+ OutputList.addLast(new MarkerItem(charsetRef));
+ OutputList.addLast(new UInt8Item((char)2)); // format identifier
+ OutputList.addLast(new UInt16Item((char)1)); // first glyph in range (ignore .notdef)
+ OutputList.addLast(new UInt16Item((char)(nglyphs-1))); // nLeft
+ }
+
+ /**
+ * Function creates new FDArray for non-CID fonts.
+ * The FDArray built has only the "Private" operator that points to the font's
+ * original private dict
+ * @param fdarrayRef OffsetItem for the FDArray
+ * @param privateRef OffsetItem for the Private Dict
+ * @param Font the font
+ */
+ protected void CreateFDArray(OffsetItem fdarrayRef,OffsetItem privateRef,int Font)
+ {
+ OutputList.addLast(new MarkerItem(fdarrayRef));
+ // Build the header (count=offsize=first=1)
+ BuildIndexHeader(1,1,1);
+
+ // Mark
+ OffsetItem privateIndex1Ref = new IndexOffsetItem(1);
+ OutputList.addLast(privateIndex1Ref);
+ IndexBaseItem privateBase = new IndexBaseItem();
+ // Insert the private operands and operator
+ OutputList.addLast(privateBase);
+ // Calc the new size of the private after subsetting
+ // Origianl size
+ int NewSize = fonts[Font].privateLength;
+ // Calc the original size of the Subr offset in the private
+ int OrgSubrsOffsetSize = CalcSubrOffsetSize(fonts[Font].privateOffset,fonts[Font].privateLength);
+ // Increase the ptivate's size
+ if (OrgSubrsOffsetSize != 0)
+ NewSize += 5-OrgSubrsOffsetSize;
+ OutputList.addLast(new DictNumberItem(NewSize));
+ OutputList.addLast(privateRef);
+ OutputList.addLast(new UInt8Item((char)18)); // Private
+
+ OutputList.addLast(new IndexMarkerItem(privateIndex1Ref,privateBase));
+ }
+
+ /**
+ * Function reconstructs the FDArray, PrivateDict and LSubr for CID fonts
+ * @param Font the font
+ * @throws IOException
+ */
+ void Reconstruct(int Font)throws IOException
+ {
+ // Init for later use
+ OffsetItem[] fdPrivate = new DictOffsetItem[fonts[Font].FDArrayOffsets.length-1];
+ IndexBaseItem[] fdPrivateBase = new IndexBaseItem[fonts[Font].fdprivateOffsets.length];
+ OffsetItem[] fdSubrs = new DictOffsetItem[fonts[Font].fdprivateOffsets.length];
+ // Reconstruct each type
+ ReconstructFDArray(Font,fdPrivate);
+ ReconstructPrivateDict(Font,fdPrivate,fdPrivateBase,fdSubrs);
+ ReconstructPrivateSubrs(Font,fdPrivateBase,fdSubrs);
+ }
+
+ /**
+ * Function subsets the FDArray and builds the new one with new offsets
+ * @param Font The font
+ * @param fdPrivate OffsetItem Array (one for each FDArray)
+ * @throws IOException
+ */
+ void ReconstructFDArray(int Font,OffsetItem[] fdPrivate)throws IOException
+ {
+ // Build the header of the index
+ BuildIndexHeader(fonts[Font].FDArrayCount,fonts[Font].FDArrayOffsize,1);
+
+ // For each offset create an Offset Item
+ OffsetItem[] fdOffsets = new IndexOffsetItem[fonts[Font].FDArrayOffsets.length-1];
+ for (int i=0;i<fonts[Font].FDArrayOffsets.length-1;i++)
+ {
+ fdOffsets[i] = new IndexOffsetItem(fonts[Font].FDArrayOffsize);
+ OutputList.addLast(fdOffsets[i]);
+ }
+
+ // Declare beginning of the object array
+ IndexBaseItem fdArrayBase = new IndexBaseItem();
+ OutputList.addLast(fdArrayBase);
+
+ // For each object check if that FD is used.
+ // if is used build a new one by changing the private object
+ // Else do nothing
+ // At the end of each object mark its ending (Even if wasn't written)
+ for (int k=0; k<fonts[Font].FDArrayOffsets.length-1; k++) {
+ if (FDArrayUsed.containsKey(new Integer (k)))
+ {
+ // Goto begining of objects
+ seek(fonts[Font].FDArrayOffsets[k]);
+ while (getPosition() < fonts[Font].FDArrayOffsets[k+1])
+ {
+ int p1 = getPosition();
+ getDictItem();
+ int p2 = getPosition();
+ // If the dictItem is the "Private" then compute and copy length,
+ // use marker for offset and write operator number
+ if (key=="Private") {
+ // Save the original length of the private dict
+ int NewSize = ((Integer)args[0]).intValue();
+ // Save the size of the offset to the subrs in that private
+ int OrgSubrsOffsetSize = CalcSubrOffsetSize(fonts[Font].fdprivateOffsets[k],fonts[Font].fdprivateLengths[k]);
+ // Increase the private's length accordingly
+ if (OrgSubrsOffsetSize != 0)
+ NewSize += 5-OrgSubrsOffsetSize;
+ // Insert the new size, OffsetItem and operator key number
+ OutputList.addLast(new DictNumberItem(NewSize));
+ fdPrivate[k] = new DictOffsetItem();
+ OutputList.addLast(fdPrivate[k]);
+ OutputList.addLast(new UInt8Item((char)18)); // Private
+ // Go back to place
+ seek(p2);
+ }
+ // Else copy the entire range
+ else // other than private
+ OutputList.addLast(new RangeItem(buf,p1,p2-p1));
+ }
+ }
+ // Mark the ending of the object (even if wasn't written)
+ OutputList.addLast(new IndexMarkerItem(fdOffsets[k],fdArrayBase));
+ }
+ }
+ /**
+ * Function Adds the new private dicts (only for the FDs used) to the list
+ * @param Font the font
+ * @param fdPrivate OffsetItem array one element for each private
+ * @param fdPrivateBase IndexBaseItem array one element for each private
+ * @param fdSubrs OffsetItem array one element for each private
+ * @throws IOException
+ */
+ void ReconstructPrivateDict(int Font,OffsetItem[] fdPrivate,IndexBaseItem[] fdPrivateBase,
+ OffsetItem[] fdSubrs)throws IOException
+ {
+
+ // For each fdarray private dict check if that FD is used.
+ // if is used build a new one by changing the subrs offset
+ // Else do nothing
+ for (int i=0;i<fonts[Font].fdprivateOffsets.length;i++)
+ {
+ if (FDArrayUsed.containsKey(new Integer (i)))
+ {
+ // Mark beginning
+ OutputList.addLast(new MarkerItem(fdPrivate[i]));
+ fdPrivateBase[i] = new IndexBaseItem();
+ OutputList.addLast(fdPrivateBase[i]);
+ // Goto begining of objects
+ seek(fonts[Font].fdprivateOffsets[i]);
+ while (getPosition() < fonts[Font].fdprivateOffsets[i]+fonts[Font].fdprivateLengths[i])
+ {
+ int p1 = getPosition();
+ getDictItem();
+ int p2 = getPosition();
+ // If the dictItem is the "Subrs" then,
+ // use marker for offset and write operator number
+ if (key=="Subrs") {
+ fdSubrs[i] = new DictOffsetItem();
+ OutputList.addLast(fdSubrs[i]);
+ OutputList.addLast(new UInt8Item((char)19)); // Subrs
+ }
+ // Else copy the entire range
+ else
+ OutputList.addLast(new RangeItem(buf,p1,p2-p1));
+ }
+ }
+ }
+ }
+
+ /**
+ * Function Adds the new LSubrs dicts (only for the FDs used) to the list
+ * @param Font The index of the font
+ * @param fdPrivateBase The IndexBaseItem array for the linked list
+ * @param fdSubrs OffsetItem array for the linked list
+ * @throws IOException
+ */
+
+ void ReconstructPrivateSubrs(int Font,IndexBaseItem[] fdPrivateBase,
+ OffsetItem[] fdSubrs)throws IOException
+ {
+ // For each private dict
+ for (int i=0;i<fonts[Font].fdprivateLengths.length;i++)
+ {
+ // If that private dict's Subrs are used insert the new LSubrs
+ // computed earlier
+ if (fdSubrs[i]!= null && fonts[Font].PrivateSubrsOffset[i] >= 0)
+ {
+ OutputList.addLast(new SubrMarkerItem(fdSubrs[i],fdPrivateBase[i]));
+ OutputList.addLast(new RangeItem(new RandomAccessFileOrArray(NewLSubrsIndex[i]),0,NewLSubrsIndex[i].length));
+ }
+ }
+ }
+
+ /**
+ * Calculates how many byte it took to write the offset for the subrs in a specific
+ * private dict.
+ * @param Offset The Offset for the private dict
+ * @param Size The size of the private dict
+ * @return The size of the offset of the subrs in the private dict
+ */
+ int CalcSubrOffsetSize(int Offset,int Size)
+ {
+ // Set the size to 0
+ int OffsetSize = 0;
+ // Go to the beginning of the private dict
+ seek(Offset);
+ // Go until the end of the private dict
+ while (getPosition() < Offset+Size)
+ {
+ int p1 = getPosition();
+ getDictItem();
+ int p2 = getPosition();
+ // When reached to the subrs offset
+ if (key=="Subrs") {
+ // The Offsize (minus the subrs key)
+ OffsetSize = p2-p1-1;
+ }
+ // All other keys are ignored
+ }
+ // return the size
+ return OffsetSize;
+ }
+
+ /**
+ * Function computes the size of an index
+ * @param indexOffset The offset for the computed index
+ * @return The size of the index
+ */
+ protected int countEntireIndexRange(int indexOffset)
+ {
+ // Go to the beginning of the index
+ seek(indexOffset);
+ // Read the count field
+ int count = getCard16();
+ // If count==0 -> size=2
+ if (count==0)
+ return 2;
+ else
+ {
+ // Read the offsize field
+ int indexOffSize = getCard8();
+ // Go to the last element of the offset array
+ seek(indexOffset+2+1+count*indexOffSize);
+ // The size of the object array is the value of the last element-1
+ int size = getOffset(indexOffSize)-1;
+ // Return the size of the entire index
+ return 2+1+(count+1)*indexOffSize+size;
+ }
+ }
+
+ /**
+ * The function creates a private dict for a font that was not CID
+ * All the keys are copied as is except for the subrs key
+ * @param Font the font
+ * @param Subr The OffsetItem for the subrs of the private
+ */
+ void CreateNonCIDPrivate(int Font,OffsetItem Subr)
+ {
+ // Go to the beginning of the private dict and read untill the end
+ seek(fonts[Font].privateOffset);
+ while (getPosition() < fonts[Font].privateOffset+fonts[Font].privateLength)
+ {
+ int p1 = getPosition();
+ getDictItem();
+ int p2 = getPosition();
+ // If the dictItem is the "Subrs" then,
+ // use marker for offset and write operator number
+ if (key=="Subrs") {
+ OutputList.addLast(Subr);
+ OutputList.addLast(new UInt8Item((char)19)); // Subrs
+ }
+ // Else copy the entire range
+ else
+ OutputList.addLast(new RangeItem(buf,p1,p2-p1));
+ }
+ }
+
+ /**
+ * the function marks the beginning of the subrs index and adds the subsetted subrs
+ * index to the output list.
+ * @param Font the font
+ * @param PrivateBase IndexBaseItem for the private that's referencing to the subrs
+ * @param Subrs OffsetItem for the subrs
+ * @throws IOException
+ */
+ void CreateNonCIDSubrs(int Font,IndexBaseItem PrivateBase,OffsetItem Subrs)throws IOException
+ {
+ // Mark the beginning of the Subrs index
+ OutputList.addLast(new SubrMarkerItem(Subrs,PrivateBase));
+ // Put the subsetted new subrs index
+ OutputList.addLast(new RangeItem(new RandomAccessFileOrArray(NewSubrsIndexNonCID),0,NewSubrsIndexNonCID.length));
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/pdf/CJKFont.java b/src/main/java/com/lowagie/text/pdf/CJKFont.java
new file mode 100644
index 0000000..2137faf
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/CJKFont.java
@@ -0,0 +1,626 @@
+/*
+ * $Id: CJKFont.java,v 1.64 2005/05/04 14:33:05 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2000, 2001, 2002 by Paulo Soares.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf;
+
+import com.lowagie.text.DocumentException;
+import java.io.*;
+import java.util.HashMap;
+import java.util.Properties;
+import java.util.Hashtable;
+import java.util.StringTokenizer;
+import java.util.Enumeration;
+
+/**
+ * Creates a CJK font compatible with the fonts in the Adobe Asian font Pack.
+ *
+ * @author Paulo Soares (psoares@consiste.pt)
+ */
+
+class CJKFont extends BaseFont {
+ /** The encoding used in the PDF document for CJK fonts
+ */
+ static final String CJK_ENCODING = "UnicodeBigUnmarked";
+ private static final int FIRST = 0;
+ private static final int BRACKET = 1;
+ private static final int SERIAL = 2;
+ private static final int V1Y = 880;
+
+ static Properties cjkFonts = new Properties();
+ static Properties cjkEncodings = new Properties();
+ static Hashtable allCMaps = new Hashtable();
+ static Hashtable allFonts = new Hashtable();
+ private static boolean propertiesLoaded = false;
+
+ /** The font name */
+ private String fontName;
+ /** The style modifier */
+ private String style = "";
+ /** The CMap name associated with this font */
+ private String CMap;
+
+ private boolean cidDirect = false;
+
+ private char[] translationMap;
+ private IntHashtable vMetrics;
+ private IntHashtable hMetrics;
+ private HashMap fontDesc;
+ private boolean vertical = false;
+
+ private static void loadProperties() {
+ if (propertiesLoaded)
+ return;
+ synchronized (allFonts) {
+ if (propertiesLoaded)
+ return;
+ try {
+ InputStream is = getResourceStream(RESOURCE_PATH + "cjkfonts.properties");
+ cjkFonts.load(is);
+ is.close();
+ is = getResourceStream(RESOURCE_PATH + "cjkencodings.properties");
+ cjkEncodings.load(is);
+ is.close();
+ }
+ catch (Exception e) {
+ cjkFonts = new Properties();
+ cjkEncodings = new Properties();
+ }
+ propertiesLoaded = true;
+ }
+ }
+
+ /** Creates a CJK font.
+ * @param fontName the name of the font
+ * @param enc the encoding of the font
+ * @param emb always <CODE>false</CODE>. CJK font and not embedded
+ * @throws DocumentException on error
+ * @throws IOException on error
+ */
+ CJKFont(String fontName, String enc, boolean emb) throws DocumentException, IOException {
+ loadProperties();
+ fontType = FONT_TYPE_CJK;
+ String nameBase = getBaseName(fontName);
+ if (!isCJKFont(nameBase, enc))
+ throw new DocumentException("Font '" + fontName + "' with '" + enc + "' encoding is not a CJK font.");
+ if (nameBase.length() < fontName.length()) {
+ style = fontName.substring(nameBase.length());
+ fontName = nameBase;
+ }
+ this.fontName = fontName;
+ encoding = CJK_ENCODING;
+ vertical = enc.endsWith("V");
+ CMap = enc;
+ if (enc.startsWith("Identity-")) {
+ cidDirect = true;
+ String s = cjkFonts.getProperty(fontName);
+ s = s.substring(0, s.indexOf('_'));
+ char c[] = (char[])allCMaps.get(s);
+ if (c == null) {
+ c = readCMap(s);
+ if (c == null)
+ throw new DocumentException("The cmap " + s + " does not exist as a resource.");
+ c[CID_NEWLINE] = '\n';
+ allCMaps.put(s, c);
+ }
+ translationMap = c;
+ }
+ else {
+ char c[] = (char[])allCMaps.get(enc);
+ if (c == null) {
+ String s = cjkEncodings.getProperty(enc);
+ if (s == null)
+ throw new DocumentException("The resource cjkencodings.properties does not contain the encoding " + enc);
+ StringTokenizer tk = new StringTokenizer(s);
+ String nt = tk.nextToken();
+ c = (char[])allCMaps.get(nt);
+ if (c == null) {
+ c = readCMap(nt);
+ allCMaps.put(nt, c);
+ }
+ if (tk.hasMoreTokens()) {
+ String nt2 = tk.nextToken();
+ char m2[] = readCMap(nt2);
+ for (int k = 0; k < 0x10000; ++k) {
+ if (m2[k] == 0)
+ m2[k] = c[k];
+ }
+ allCMaps.put(enc, m2);
+ c = m2;
+ }
+ }
+ translationMap = c;
+ }
+ fontDesc = (HashMap)allFonts.get(fontName);
+ if (fontDesc == null) {
+ fontDesc = readFontProperties(fontName);
+ allFonts.put(fontName, fontDesc);
+ }
+ hMetrics = (IntHashtable)fontDesc.get("W");
+ vMetrics = (IntHashtable)fontDesc.get("W2");
+ }
+
+ /** Checks if its a valid CJK font.
+ * @param fontName the font name
+ * @param enc the encoding
+ * @return <CODE>true</CODE> if it is CJK font
+ */
+ public static boolean isCJKFont(String fontName, String enc) {
+ loadProperties();
+ String encodings = cjkFonts.getProperty(fontName);
+ return (encodings != null && (enc.equals("Identity-H") || enc.equals("Identity-V") || encodings.indexOf("_" + enc + "_") >= 0));
+ }
+
+ public int getWidth(String text) {
+ int total = 0;
+ for (int k = 0; k < text.length(); ++k) {
+ int c = text.charAt(k);
+ if (!cidDirect)
+ c = translationMap[c];
+ int v;
+ if (vertical)
+ v = vMetrics.get(c);
+ else
+ v = hMetrics.get(c);
+ if (v > 0)
+ total += v;
+ else
+ total += 1000;
+ }
+ return total;
+ }
+
+ int getRawWidth(int c, String name) {
+ return 0;
+ }
+
+ public int getKerning(char char1, char char2) {
+ return 0;
+ }
+
+ private PdfDictionary getFontDescriptor() {
+ PdfDictionary dic = new PdfDictionary(PdfName.FONTDESCRIPTOR);
+ dic.put(PdfName.ASCENT, new PdfLiteral((String)fontDesc.get("Ascent")));
+ dic.put(PdfName.CAPHEIGHT, new PdfLiteral((String)fontDesc.get("CapHeight")));
+ dic.put(PdfName.DESCENT, new PdfLiteral((String)fontDesc.get("Descent")));
+ dic.put(PdfName.FLAGS, new PdfLiteral((String)fontDesc.get("Flags")));
+ dic.put(PdfName.FONTBBOX, new PdfLiteral((String)fontDesc.get("FontBBox")));
+ dic.put(PdfName.FONTNAME, new PdfName(fontName + style));
+ dic.put(PdfName.ITALICANGLE, new PdfLiteral((String)fontDesc.get("ItalicAngle")));
+ dic.put(PdfName.STEMV, new PdfLiteral((String)fontDesc.get("StemV")));
+ PdfDictionary pdic = new PdfDictionary();
+ pdic.put(PdfName.PANOSE, new PdfString((String)fontDesc.get("Panose"), null));
+ dic.put(PdfName.STYLE, pdic);
+ return dic;
+ }
+
+ private PdfDictionary getCIDFont(PdfIndirectReference fontDescriptor, IntHashtable cjkTag) {
+ PdfDictionary dic = new PdfDictionary(PdfName.FONT);
+ dic.put(PdfName.SUBTYPE, PdfName.CIDFONTTYPE0);
+ dic.put(PdfName.BASEFONT, new PdfName(fontName + style));
+ dic.put(PdfName.FONTDESCRIPTOR, fontDescriptor);
+ int keys[] = cjkTag.toOrderedKeys();
+ String w = convertToHCIDMetrics(keys, hMetrics);
+ if (w != null)
+ dic.put(PdfName.W, new PdfLiteral(w));
+ if (vertical) {
+ w = convertToVCIDMetrics(keys, vMetrics, hMetrics);;
+ if (w != null)
+ dic.put(PdfName.W2, new PdfLiteral(w));
+ }
+ else
+ dic.put(PdfName.DW, new PdfNumber(1000));
+ PdfDictionary cdic = new PdfDictionary();
+ cdic.put(PdfName.REGISTRY, new PdfString((String)fontDesc.get("Registry"), null));
+ cdic.put(PdfName.ORDERING, new PdfString((String)fontDesc.get("Ordering"), null));
+ cdic.put(PdfName.SUPPLEMENT, new PdfLiteral((String)fontDesc.get("Supplement")));
+ dic.put(PdfName.CIDSYSTEMINFO, cdic);
+ return dic;
+ }
+
+ private PdfDictionary getFontBaseType(PdfIndirectReference CIDFont) {
+ PdfDictionary dic = new PdfDictionary(PdfName.FONT);
+ dic.put(PdfName.SUBTYPE, PdfName.TYPE0);
+ String name = fontName;
+ if (style.length() > 0)
+ name += "-" + style.substring(1);
+ name += "-" + CMap;
+ dic.put(PdfName.BASEFONT, new PdfName(name));
+ dic.put(PdfName.ENCODING, new PdfName(CMap));
+ dic.put(PdfName.DESCENDANTFONTS, new PdfArray(CIDFont));
+ return dic;
+ }
+
+ void writeFont(PdfWriter writer, PdfIndirectReference ref, Object params[]) throws DocumentException, IOException {
+ IntHashtable cjkTag = (IntHashtable)params[0];
+ PdfIndirectReference ind_font = null;
+ PdfObject pobj = null;
+ PdfIndirectObject obj = null;
+ pobj = getFontDescriptor();
+ if (pobj != null){
+ obj = writer.addToBody(pobj);
+ ind_font = obj.getIndirectReference();
+ }
+ pobj = getCIDFont(ind_font, cjkTag);
+ if (pobj != null){
+ obj = writer.addToBody(pobj);
+ ind_font = obj.getIndirectReference();
+ }
+ pobj = getFontBaseType(ind_font);
+ writer.addToBody(pobj, ref);
+ }
+
+ private float getDescNumber(String name) {
+ return Integer.parseInt((String)fontDesc.get(name));
+ }
+
+ private float getBBox(int idx) {
+ String s = (String)fontDesc.get("FontBBox");
+ StringTokenizer tk = new StringTokenizer(s, " []\r\n\t\f");
+ String ret = tk.nextToken();
+ for (int k = 0; k < idx; ++k)
+ ret = tk.nextToken();
+ return Integer.parseInt(ret);
+ }
+
+ /** Gets the font parameter identified by <CODE>key</CODE>. Valid values
+ * for <CODE>key</CODE> are <CODE>ASCENT</CODE>, <CODE>CAPHEIGHT</CODE>, <CODE>DESCENT</CODE>
+ * and <CODE>ITALICANGLE</CODE>.
+ * @param key the parameter to be extracted
+ * @param fontSize the font size in points
+ * @return the parameter in points
+ */
+ public float getFontDescriptor(int key, float fontSize) {
+ switch (key) {
+ case AWT_ASCENT:
+ case ASCENT:
+ return getDescNumber("Ascent") * fontSize / 1000;
+ case CAPHEIGHT:
+ return getDescNumber("CapHeight") * fontSize / 1000;
+ case AWT_DESCENT:
+ case DESCENT:
+ return getDescNumber("Descent") * fontSize / 1000;
+ case ITALICANGLE:
+ return getDescNumber("ItalicAngle");
+ case BBOXLLX:
+ return fontSize * getBBox(0) / 1000;
+ case BBOXLLY:
+ return fontSize * getBBox(1) / 1000;
+ case BBOXURX:
+ return fontSize * getBBox(2) / 1000;
+ case BBOXURY:
+ return fontSize * getBBox(3) / 1000;
+ case AWT_LEADING:
+ return 0;
+ case AWT_MAXADVANCE:
+ return fontSize * (getBBox(2) - getBBox(0)) / 1000;
+ }
+ return 0;
+ }
+
+ public String getPostscriptFontName() {
+ return fontName;
+ }
+
+ /** Gets the full name of the font. If it is a True Type font
+ * each array element will have {Platform ID, Platform Encoding ID,
+ * Language ID, font name}. The interpretation of this values can be
+ * found in the Open Type specification, chapter 2, in the 'name' table.<br>
+ * For the other fonts the array has a single element with {"", "", "",
+ * font name}.
+ * @return the full name of the font
+ */
+ public String[][] getFullFontName() {
+ return new String[][]{{"", "", "", fontName}};
+ }
+
+ /** Gets the family name of the font. If it is a True Type font
+ * each array element will have {Platform ID, Platform Encoding ID,
+ * Language ID, font name}. The interpretation of this values can be
+ * found in the Open Type specification, chapter 2, in the 'name' table.<br>
+ * For the other fonts the array has a single element with {"", "", "",
+ * font name}.
+ * @return the family name of the font
+ */
+ public String[][] getFamilyFontName() {
+ return getFullFontName();
+ }
+
+ static char[] readCMap(String name) {
+ try {
+ name = name + ".cmap";
+ InputStream is = getResourceStream(RESOURCE_PATH + name);
+ char c[] = new char[0x10000];
+ for (int k = 0; k < 0x10000; ++k)
+ c[k] = (char)((is.read() << 8) + is.read());
+ return c;
+ }
+ catch (Exception e) {
+ // empty on purpose
+ }
+ return null;
+ }
+
+ static IntHashtable createMetric(String s) {
+ IntHashtable h = new IntHashtable();
+ StringTokenizer tk = new StringTokenizer(s);
+ while (tk.hasMoreTokens()) {
+ int n1 = Integer.parseInt(tk.nextToken());
+ h.put(n1, Integer.parseInt(tk.nextToken()));
+ }
+ return h;
+ }
+
+ static String convertToHCIDMetrics(int keys[], IntHashtable h) {
+ if (keys.length == 0)
+ return null;
+ int lastCid = 0;
+ int lastValue = 0;
+ int start;
+ for (start = 0; start < keys.length; ++start) {
+ lastCid = keys[start];
+ lastValue = h.get(lastCid);
+ if (lastValue != 0) {
+ ++start;
+ break;
+ }
+ }
+ if (lastValue == 0)
+ return null;
+ StringBuffer buf = new StringBuffer();
+ buf.append('[');
+ buf.append(lastCid);
+ int state = FIRST;
+ for (int k = start; k < keys.length; ++k) {
+ int cid = keys[k];
+ int value = h.get(cid);
+ if (value == 0)
+ continue;
+ switch (state) {
+ case FIRST: {
+ if (cid == lastCid + 1 && value == lastValue) {
+ state = SERIAL;
+ }
+ else if (cid == lastCid + 1) {
+ state = BRACKET;
+ buf.append('[').append(lastValue);
+ }
+ else {
+ buf.append('[').append(lastValue).append(']').append(cid);
+ }
+ break;
+ }
+ case BRACKET: {
+ if (cid == lastCid + 1 && value == lastValue) {
+ state = SERIAL;
+ buf.append(']').append(lastCid);
+ }
+ else if (cid == lastCid + 1) {
+ buf.append(' ').append(lastValue);
+ }
+ else {
+ state = FIRST;
+ buf.append(' ').append(lastValue).append(']').append(cid);
+ }
+ break;
+ }
+ case SERIAL: {
+ if (cid != lastCid + 1 || value != lastValue) {
+ buf.append(' ').append(lastCid).append(' ').append(lastValue).append(' ').append(cid);
+ state = FIRST;
+ }
+ break;
+ }
+ }
+ lastValue = value;
+ lastCid = cid;
+ }
+ switch (state) {
+ case FIRST: {
+ buf.append('[').append(lastValue).append("]]");
+ break;
+ }
+ case BRACKET: {
+ buf.append(' ').append(lastValue).append("]]");
+ break;
+ }
+ case SERIAL: {
+ buf.append(' ').append(lastCid).append(' ').append(lastValue).append(']');
+ break;
+ }
+ }
+ return buf.toString();
+ }
+
+ static String convertToVCIDMetrics(int keys[], IntHashtable v, IntHashtable h) {
+ if (keys.length == 0)
+ return null;
+ int lastCid = 0;
+ int lastValue = 0;
+ int lastHValue = 0;
+ int start;
+ for (start = 0; start < keys.length; ++start) {
+ lastCid = keys[start];
+ lastValue = v.get(lastCid);
+ if (lastValue != 0) {
+ ++start;
+ break;
+ }
+ else
+ lastHValue = h.get(lastCid);
+ }
+ if (lastValue == 0)
+ return null;
+ if (lastHValue == 0)
+ lastHValue = 1000;
+ StringBuffer buf = new StringBuffer();
+ buf.append('[');
+ buf.append(lastCid);
+ int state = FIRST;
+ for (int k = start; k < keys.length; ++k) {
+ int cid = keys[k];
+ int value = v.get(cid);
+ if (value == 0)
+ continue;
+ int hValue = h.get(lastCid);
+ if (hValue == 0)
+ hValue = 1000;
+ switch (state) {
+ case FIRST: {
+ if (cid == lastCid + 1 && value == lastValue && hValue == lastHValue) {
+ state = SERIAL;
+ }
+ else {
+ buf.append(' ').append(lastCid).append(' ').append(-lastValue).append(' ').append(lastHValue / 2).append(' ').append(V1Y).append(' ').append(cid);
+ }
+ break;
+ }
+ case SERIAL: {
+ if (cid != lastCid + 1 || value != lastValue || hValue != lastHValue) {
+ buf.append(' ').append(lastCid).append(' ').append(-lastValue).append(' ').append(lastHValue / 2).append(' ').append(V1Y).append(' ').append(cid);
+ state = FIRST;
+ }
+ break;
+ }
+ }
+ lastValue = value;
+ lastCid = cid;
+ lastHValue = hValue;
+ }
+ buf.append(' ').append(lastCid).append(' ').append(-lastValue).append(' ').append(lastHValue / 2).append(' ').append(V1Y).append(" ]");
+ return buf.toString();
+ }
+
+ static HashMap readFontProperties(String name) {
+ try {
+ name += ".properties";
+ InputStream is = getResourceStream(RESOURCE_PATH + name);
+ Properties p = new Properties();
+ p.load(is);
+ is.close();
+ IntHashtable W = createMetric(p.getProperty("W"));
+ p.remove("W");
+ IntHashtable W2 = createMetric(p.getProperty("W2"));
+ p.remove("W2");
+ HashMap map = new HashMap();
+ for (Enumeration e = p.keys(); e.hasMoreElements();) {
+ Object obj = e.nextElement();
+ map.put(obj, p.getProperty((String)obj));
+ }
+ map.put("W", W);
+ map.put("W2", W2);
+ return map;
+ }
+ catch (Exception e) {
+ // empty on purpose
+ }
+ return null;
+ }
+
+ public char getUnicodeEquivalent(char c) {
+ if (cidDirect)
+ return translationMap[c];
+ return c;
+ }
+
+ public char getCidCode(char c) {
+ if (cidDirect)
+ return c;
+ return translationMap[c];
+ }
+
+ /** Checks if the font has any kerning pairs.
+ * @return always <CODE>false</CODE>
+ */
+ public boolean hasKernPairs() {
+ return false;
+ }
+
+ /**
+ * Checks if a character exists in this font.
+ * @param c the character to check
+ * @return <CODE>true</CODE> if the character has a glyph,
+ * <CODE>false</CODE> otherwise
+ */
+ public boolean charExists(char c) {
+ return translationMap[c] != 0;
+ }
+
+ /**
+ * Sets the character advance.
+ * @param c the character
+ * @param advance the character advance normalized to 1000 units
+ * @return <CODE>true</CODE> if the advance was set,
+ * <CODE>false</CODE> otherwise. Will always return <CODE>false</CODE>
+ */
+ public boolean setCharAdvance(char c, int advance) {
+ return false;
+ }
+
+ /**
+ * Sets the font name that will appear in the pdf font dictionary.
+ * Use with care as it can easily make a font unreadable if not embedded.
+ * @param name the new font name
+ */
+ public void setPostscriptFontName(String name) {
+ fontName = name;
+ }
+
+ public boolean setKerning(char char1, char char2, int kern) {
+ return false;
+ }
+
+ public int[] getCharBBox(char c) {
+ return null;
+ }
+
+ protected int[] getRawCharBBox(int c, String name) {
+ return null;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/pdf/CMYKColor.java b/src/main/java/com/lowagie/text/pdf/CMYKColor.java
new file mode 100644
index 0000000..4acee83
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/CMYKColor.java
@@ -0,0 +1,129 @@
+/*
+ * $Id: CMYKColor.java,v 1.44 2005/12/11 15:31:04 psoares33 Exp $
+ * $Name: $
+ *
+ * Copyright 2001, 2002 by Paulo Soares.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf;
+
+/**
+ *
+ * @author Paulo Soares (psoares@consiste.pt)
+ */
+public class CMYKColor extends ExtendedColor {
+
+ float cyan;
+ float magenta;
+ float yellow;
+ float black;
+
+ /**
+ * Constructs a CMYK Color beased on 4 colorvalues (values are integers from 0 to 255).
+ * @param intCyan
+ * @param intMagenta
+ * @param intYellow
+ * @param intBlack
+ */
+ public CMYKColor(int intCyan, int intMagenta, int intYellow, int intBlack) {
+ this((float)intCyan / 255f, (float)intMagenta / 255f, (float)intYellow / 255f, (float)intBlack / 255f);
+ }
+
+ /**
+ * Construct a CMYK Color.
+ * @param floatCyan
+ * @param floatMagenta
+ * @param floatYellow
+ * @param floatBlack
+ */
+ public CMYKColor(float floatCyan, float floatMagenta, float floatYellow, float floatBlack) {
+ super(TYPE_CMYK, 1f - floatCyan - floatBlack, 1f - floatMagenta - floatBlack, 1f - floatYellow - floatBlack);
+ cyan = normalize(floatCyan);
+ magenta = normalize(floatMagenta);
+ yellow = normalize(floatYellow);
+ black = normalize(floatBlack);
+ }
+
+ /**
+ * @return the cyan value
+ */
+ public float getCyan() {
+ return cyan;
+ }
+
+ /**
+ * @return the magenta value
+ */
+ public float getMagenta() {
+ return magenta;
+ }
+
+ /**
+ * @return the yellow value
+ */
+ public float getYellow() {
+ return yellow;
+ }
+
+ /**
+ * @return the black value
+ */
+ public float getBlack() {
+ return black;
+ }
+
+ public boolean equals(Object obj) {
+ if (!(obj instanceof CMYKColor))
+ return false;
+ CMYKColor c2 = (CMYKColor)obj;
+ return (cyan == c2.cyan && magenta == c2.magenta && yellow == c2.yellow && black == c2.black);
+ }
+
+ public int hashCode() {
+ return Float.floatToIntBits(cyan) ^ Float.floatToIntBits(magenta) ^ Float.floatToIntBits(yellow) ^ Float.floatToIntBits(black);
+ }
+
+}
diff --git a/src/main/java/com/lowagie/text/pdf/ColorDetails.java b/src/main/java/com/lowagie/text/pdf/ColorDetails.java
new file mode 100644
index 0000000..b945c06
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/ColorDetails.java
@@ -0,0 +1,101 @@
+/*
+ * $Id: ColorDetails.java,v 1.43 2005/05/04 14:31:49 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2001, 2002 by Paulo Soares.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf;
+
+import java.io.IOException;
+/** Each spotcolor in the document will have an instance of this class
+ *
+ * @author Phillip Pan (phillip@formstar.com)
+ */
+class ColorDetails {
+
+ /** The indirect reference to this color
+ */
+ PdfIndirectReference indirectReference;
+ /** The color name that appears in the document body stream
+ */
+ PdfName colorName;
+ /** The color
+ */
+ PdfSpotColor spotcolor;
+
+ /** Each spot color used in a document has an instance of this class.
+ * @param colorName the color name
+ * @param indirectReference the indirect reference to the font
+ * @param scolor the <CODE>PDfSpotColor</CODE>
+ */
+ ColorDetails(PdfName colorName, PdfIndirectReference indirectReference, PdfSpotColor scolor) {
+ this.colorName = colorName;
+ this.indirectReference = indirectReference;
+ this.spotcolor = scolor;
+ }
+
+ /** Gets the indirect reference to this color.
+ * @return the indirect reference to this color
+ */
+ PdfIndirectReference getIndirectReference() {
+ return indirectReference;
+ }
+
+ /** Gets the color name as it appears in the document body.
+ * @return the color name
+ */
+ PdfName getColorName() {
+ return colorName;
+ }
+
+ /** Gets the <CODE>SpotColor</CODE> object.
+ * @return the <CODE>PdfSpotColor</CODE>
+ */
+ PdfObject getSpotColor(PdfWriter writer) throws IOException {
+ return spotcolor.getSpotObject(writer);
+ }
+}
diff --git a/src/main/java/com/lowagie/text/pdf/ColumnText.java b/src/main/java/com/lowagie/text/pdf/ColumnText.java
new file mode 100644
index 0000000..3197290
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/ColumnText.java
@@ -0,0 +1,1520 @@
+/*
+ * $Id: ColumnText.java,v 1.68 2006/01/29 20:28:23 psoares33 Exp $
+ * $Name: $
+ *
+ * Copyright 2001, 2002 by Paulo Soares.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf;
+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.Stack;
+import java.util.Iterator;
+import com.lowagie.text.Phrase;
+import com.lowagie.text.Chunk;
+import com.lowagie.text.Paragraph;
+import com.lowagie.text.Graphic;
+import com.lowagie.text.ListItem;
+import com.lowagie.text.Element;
+import com.lowagie.text.DocumentException;
+import com.lowagie.text.ExceptionConverter;
+import com.lowagie.text.Image;
+import com.lowagie.text.SimpleTable;
+
+/**
+ * Formats text in a columnwise form. The text is bound
+ * on the left and on the right by a sequence of lines. This allows the column
+ * to have any shape, not only rectangular.
+ * <P>
+ * Several parameters can be set like the first paragraph line indent and
+ * extra space between paragraphs.
+ * <P>
+ * A call to the method <CODE>go</CODE> will return one of the following
+ * situations: the column ended or the text ended.
+ * <P>
+ * I the column ended, a new column definition can be loaded with the method
+ * <CODE>setColumns</CODE> and the method <CODE>go</CODE> can be called again.
+ * <P>
+ * If the text ended, more text can be loaded with <CODE>addText</CODE>
+ * and the method <CODE>go</CODE> can be called again.<BR>
+ * The only limitation is that one or more complete paragraphs must be loaded
+ * each time.
+ * <P>
+ * Full bidirectional reordering is supported. If the run direction is
+ * <CODE>PdfWriter.RUN_DIRECTION_RTL</CODE> the meaning of the horizontal
+ * alignments and margins is mirrored.
+ * @author Paulo Soares (psoares@consiste.pt)
+ */
+
+public class ColumnText {
+ /** Eliminate the arabic vowels */
+ public static final int AR_NOVOWEL = ArabicLigaturizer.ar_novowel;
+ /** Compose the tashkeel in the ligatures. */
+ public static final int AR_COMPOSEDTASHKEEL = ArabicLigaturizer.ar_composedtashkeel;
+ /** Do some extra double ligatures. */
+ public static final int AR_LIG = ArabicLigaturizer.ar_lig;
+ /**
+ * Digit shaping option: Replace European digits (U+0030...U+0039) by Arabic-Indic digits.
+ */
+ public static final int DIGITS_EN2AN = ArabicLigaturizer.DIGITS_EN2AN;
+
+ /**
+ * Digit shaping option: Replace Arabic-Indic digits by European digits (U+0030...U+0039).
+ */
+ public static final int DIGITS_AN2EN = ArabicLigaturizer.DIGITS_AN2EN;
+
+ /**
+ * Digit shaping option:
+ * Replace European digits (U+0030...U+0039) by Arabic-Indic digits
+ * if the most recent strongly directional character
+ * is an Arabic letter (its Bidi direction value is RIGHT_TO_LEFT_ARABIC).
+ * The initial state at the start of the text is assumed to be not an Arabic,
+ * letter, so European digits at the start of the text will not change.
+ * Compare to DIGITS_ALEN2AN_INIT_AL.
+ */
+ public static final int DIGITS_EN2AN_INIT_LR = ArabicLigaturizer.DIGITS_EN2AN_INIT_LR;
+
+ /**
+ * Digit shaping option:
+ * Replace European digits (U+0030...U+0039) by Arabic-Indic digits
+ * if the most recent strongly directional character
+ * is an Arabic letter (its Bidi direction value is RIGHT_TO_LEFT_ARABIC).
+ * The initial state at the start of the text is assumed to be an Arabic,
+ * letter, so European digits at the start of the text will change.
+ * Compare to DIGITS_ALEN2AN_INT_LR.
+ */
+ public static final int DIGITS_EN2AN_INIT_AL = ArabicLigaturizer.DIGITS_EN2AN_INIT_AL;
+
+ /**
+ * Digit type option: Use Arabic-Indic digits (U+0660...U+0669).
+ */
+ public static final int DIGIT_TYPE_AN = ArabicLigaturizer.DIGIT_TYPE_AN;
+
+ /**
+ * Digit type option: Use Eastern (Extended) Arabic-Indic digits (U+06f0...U+06f9).
+ */
+ public static final int DIGIT_TYPE_AN_EXTENDED = ArabicLigaturizer.DIGIT_TYPE_AN_EXTENDED;
+
+ protected int runDirection = PdfWriter.RUN_DIRECTION_DEFAULT;
+
+ /** the space char ratio */
+ public static final float GLOBAL_SPACE_CHAR_RATIO = 0;
+
+ /** Initial value of the status. */
+ public static final int START_COLUMN = 0;
+
+ /** Signals that there is no more text available. */
+ public static final int NO_MORE_TEXT = 1;
+
+ /** Signals that there is no more column. */
+ public static final int NO_MORE_COLUMN = 2;
+
+ /** The column is valid. */
+ protected static final int LINE_STATUS_OK = 0;
+
+ /** The line is out the column limits. */
+ protected static final int LINE_STATUS_OFFLIMITS = 1;
+
+ /** The line cannot fit this column position. */
+ protected static final int LINE_STATUS_NOLINE = 2;
+
+ /** Upper bound of the column. */
+ protected float maxY;
+
+ /** Lower bound of the column. */
+ protected float minY;
+
+ protected float leftX;
+
+ protected float rightX;
+
+ /** The column alignment. Default is left alignment. */
+ protected int alignment = Element.ALIGN_LEFT;
+
+ /** The left column bound. */
+ protected ArrayList leftWall;
+
+ /** The right column bound. */
+ protected ArrayList rightWall;
+
+ /** The chunks that form the text. */
+// protected ArrayList chunks = new ArrayList();
+ protected BidiLine bidiLine;
+
+ /** The current y line location. Text will be written at this line minus the leading. */
+ protected float yLine;
+
+ /** The leading for the current line. */
+ protected float currentLeading = 16;
+
+ /** The fixed text leading. */
+ protected float fixedLeading = 16;
+
+ /** The text leading that is multiplied by the biggest font size in the line. */
+ protected float multipliedLeading = 0;
+
+ /** The <CODE>PdfContent</CODE> where the text will be written to. */
+ protected PdfContentByte canvas;
+
+ protected PdfContentByte[] canvases;
+
+ /** The line status when trying to fit a line to a column. */
+ protected int lineStatus;
+
+ /** The first paragraph line indent. */
+ protected float indent = 0;
+
+ /** The following paragraph lines indent. */
+ protected float followingIndent = 0;
+
+ /** The right paragraph lines indent. */
+ protected float rightIndent = 0;
+
+ /** The extra space between paragraphs. */
+ protected float extraParagraphSpace = 0;
+
+ /** The width of the line when the column is defined as a simple rectangle. */
+ protected float rectangularWidth = -1;
+
+ protected boolean rectangularMode = false;
+ /** Holds value of property spaceCharRatio. */
+ private float spaceCharRatio = GLOBAL_SPACE_CHAR_RATIO;
+
+ private boolean lastWasNewline = true;
+
+ /** Holds value of property linesWritten. */
+ private int linesWritten;
+
+ private float firstLineY;
+ private boolean firstLineYDone = false;
+
+ /** Holds value of property arabicOptions. */
+ private int arabicOptions = 0;
+
+ protected float descender;
+
+ protected boolean composite = false;
+
+ protected ColumnText compositeColumn;
+
+ protected LinkedList compositeElements;
+
+ protected int listIdx = 0;
+
+ private boolean splittedRow;
+
+ protected Phrase waitPhrase;
+
+ /** if true, first line height is adjusted so that the max ascender touches the top */
+ private boolean useAscender = false;
+
+ /**
+ * Creates a <CODE>ColumnText</CODE>.
+ * @param canvas the place where the text will be written to. Can
+ * be a template.
+ */
+ public ColumnText(PdfContentByte canvas) {
+ this.canvas = canvas;
+ }
+
+ /** Creates an independent duplicated of the instance <CODE>org</CODE>.
+ * @param org the original <CODE>ColumnText</CODE>
+ * @return the duplicated
+ */
+ public static ColumnText duplicate(ColumnText org) {
+ ColumnText ct = new ColumnText(null);
+ ct.setACopy(org);
+ return ct;
+ }
+
+ /** Makes this instance an independent copy of <CODE>org</CODE>.
+ * @param org the original <CODE>ColumnText</CODE>
+ * @return itself
+ */
+ public ColumnText setACopy(ColumnText org) {
+ setSimpleVars(org);
+ if (org.bidiLine != null)
+ bidiLine = new BidiLine(org.bidiLine);
+ return this;
+ }
+
+ protected void setSimpleVars(ColumnText org) {
+ maxY = org.maxY;
+ minY = org.minY;
+ alignment = org.alignment;
+ leftWall = null;
+ if (org.leftWall != null)
+ leftWall = new ArrayList(org.leftWall);
+ rightWall = null;
+ if (org.rightWall != null)
+ rightWall = new ArrayList(org.rightWall);
+ yLine = org.yLine;
+ currentLeading = org.currentLeading;
+ fixedLeading = org.fixedLeading;
+ multipliedLeading = org.multipliedLeading;
+ canvas = org.canvas;
+ canvases = org.canvases;
+ lineStatus = org.lineStatus;
+ indent = org.indent;
+ followingIndent = org.followingIndent;
+ rightIndent = org.rightIndent;
+ extraParagraphSpace = org.extraParagraphSpace;
+ rectangularWidth = org.rectangularWidth;
+ rectangularMode = org.rectangularMode;
+ spaceCharRatio = org.spaceCharRatio;
+ lastWasNewline = org.lastWasNewline;
+ linesWritten = org.linesWritten;
+ arabicOptions = org.arabicOptions;
+ runDirection = org.runDirection;
+ descender = org.descender;
+ composite = org.composite;
+ splittedRow = org.splittedRow;
+ if (org.composite) {
+ compositeElements = new LinkedList(org.compositeElements);
+ if (splittedRow) {
+ PdfPTable table = (PdfPTable)compositeElements.getFirst();
+ compositeElements.set(0, new PdfPTable(table));
+ }
+ if (org.compositeColumn != null)
+ compositeColumn = duplicate(org.compositeColumn);
+ }
+ listIdx = org.listIdx;
+ firstLineY = org.firstLineY;
+ leftX = org.leftX;
+ rightX = org.rightX;
+ firstLineYDone = org.firstLineYDone;
+ waitPhrase = org.waitPhrase;
+ useAscender = org.useAscender;
+ filledWidth = org.filledWidth;
+ }
+
+ private void addWaitingPhrase() {
+ if (bidiLine == null && waitPhrase != null) {
+ bidiLine = new BidiLine();
+ for (Iterator j = waitPhrase.getChunks().iterator(); j.hasNext();) {
+ bidiLine.addChunk(new PdfChunk((Chunk)j.next(), null));
+ }
+ waitPhrase = null;
+ }
+ }
+
+ /**
+ * Adds a <CODE>Phrase</CODE> to the current text array.
+ * Will not have any effect if addElement() was called before.
+ * @param phrase the text
+ */
+ public void addText(Phrase phrase) {
+ if (phrase == null || composite)
+ return;
+ addWaitingPhrase();
+ if (bidiLine == null) {
+ waitPhrase = phrase;
+ return;
+ }
+ for (Iterator j = phrase.getChunks().iterator(); j.hasNext();) {
+ bidiLine.addChunk(new PdfChunk((Chunk)j.next(), null));
+ }
+ }
+
+ /**
+ * Replaces the current text array with this <CODE>Phrase</CODE>.
+ * Anything added previously with addElement() is lost.
+ * @param phrase the text
+ */
+ public void setText(Phrase phrase) {
+ bidiLine = null;
+ composite = false;
+ compositeColumn = null;
+ compositeElements = null;
+ listIdx = 0;
+ splittedRow = false;
+ waitPhrase = phrase;
+ }
+
+ /**
+ * Adds a <CODE>Chunk</CODE> to the current text array.
+ * Will not have any effect if addElement() was called before.
+ * @param chunk the text
+ */
+ public void addText(Chunk chunk) {
+ if (chunk == null || composite)
+ return;
+ addText(new Phrase(chunk));
+ }
+
+ /**
+ * Adds an element. Elements supported are <CODE>Paragraph</CODE>,
+ * <CODE>List</CODE>, <CODE>PdfPTable</CODE>, <CODE>Image</CODE> and
+ * <CODE>Graphic</CODE>.
+ * <p>
+ * It removes all the text placed with <CODE>addText()</CODE>.
+ * @param element the <CODE>Element</CODE>
+ */
+ public void addElement(Element element) {
+ if (element == null)
+ return;
+ if (element instanceof Image) {
+ Image img = (Image)element;
+ PdfPTable t = new PdfPTable(1);
+ float w = img.getWidthPercentage();
+ if (w == 0) {
+ t.setTotalWidth(img.scaledWidth());
+ t.setLockedWidth(true);
+ }
+ else
+ t.setWidthPercentage(w);
+ t.setSpacingAfter(img.spacingAfter());
+ t.setSpacingBefore(img.spacingBefore());
+ switch (img.alignment()) {
+ case Image.LEFT:
+ t.setHorizontalAlignment(Element.ALIGN_LEFT);
+ break;
+ case Image.RIGHT:
+ t.setHorizontalAlignment(Element.ALIGN_RIGHT);
+ break;
+ default:
+ t.setHorizontalAlignment(Element.ALIGN_CENTER);
+ break;
+ }
+ PdfPCell c = new PdfPCell(img, true);
+ c.setPadding(0);
+ c.setBorder(img.border());
+ c.setBorderColor(img.borderColor());
+ c.setBorderWidth(img.borderWidth());
+ c.setBackgroundColor(img.backgroundColor());
+ t.addCell(c);
+ element = t;
+ }
+ if (element.type() == Element.CHUNK) {
+ element = new Paragraph((Chunk)element);
+ }
+ else if (element.type() == Element.PHRASE) {
+ element = new Paragraph((Phrase)element);
+ }
+ if (element instanceof SimpleTable) {
+ try {
+ element = ((SimpleTable)element).createPdfPTable();
+ } catch (DocumentException e) {
+ throw new IllegalArgumentException("Element not allowed.");
+ }
+ }
+ else if (element.type() != Element.PARAGRAPH && element.type() != Element.LIST && element.type() != Element.PTABLE && element.type() != Element.GRAPHIC)
+ throw new IllegalArgumentException("Element not allowed.");
+ if (!composite) {
+ composite = true;
+ compositeElements = new LinkedList();
+ bidiLine = null;
+ waitPhrase = null;
+ }
+ compositeElements.add(element);
+ }
+
+ /**
+ * Converts a sequence of lines representing one of the column bounds into
+ * an internal format.
+ * <p>
+ * Each array element will contain a <CODE>float[4]</CODE> representing
+ * the line x = ax + b.
+ * @param cLine the column array
+ * @return the converted array
+ */
+ protected ArrayList convertColumn(float cLine[]) {
+ if (cLine.length < 4)
+ throw new RuntimeException("No valid column line found.");
+ ArrayList cc = new ArrayList();
+ for (int k = 0; k < cLine.length - 2; k += 2) {
+ float x1 = cLine[k];
+ float y1 = cLine[k + 1];
+ float x2 = cLine[k + 2];
+ float y2 = cLine[k + 3];
+ if (y1 == y2)
+ continue;
+ // x = ay + b
+ float a = (x1 - x2) / (y1 - y2);
+ float b = x1 - a * y1;
+ float r[] = new float[4];
+ r[0] = Math.min(y1, y2);
+ r[1] = Math.max(y1, y2);
+ r[2] = a;
+ r[3] = b;
+ cc.add(r);
+ maxY = Math.max(maxY, r[1]);
+ minY = Math.min(minY, r[0]);
+ }
+ if (cc.size() == 0)
+ throw new RuntimeException("No valid column line found.");
+ return cc;
+ }
+
+ /**
+ * Finds the intersection between the <CODE>yLine</CODE> and the column. It will
+ * set the <CODE>lineStatus</CODE> apropriatly.
+ * @param wall the column to intersect
+ * @return the x coordinate of the intersection
+ */
+ protected float findLimitsPoint(ArrayList wall) {
+ lineStatus = LINE_STATUS_OK;
+ if (yLine < minY || yLine > maxY) {
+ lineStatus = LINE_STATUS_OFFLIMITS;
+ return 0;
+ }
+ for (int k = 0; k < wall.size(); ++k) {
+ float r[] = (float[])wall.get(k);
+ if (yLine < r[0] || yLine > r[1])
+ continue;
+ return r[2] * yLine + r[3];
+ }
+ lineStatus = LINE_STATUS_NOLINE;
+ return 0;
+ }
+
+ /**
+ * Finds the intersection between the <CODE>yLine</CODE> and the two
+ * column bounds. It will set the <CODE>lineStatus</CODE> apropriatly.
+ * @return a <CODE>float[2]</CODE>with the x coordinates of the intersection
+ */
+ protected float[] findLimitsOneLine() {
+ float x1 = findLimitsPoint(leftWall);
+ if (lineStatus == LINE_STATUS_OFFLIMITS || lineStatus == LINE_STATUS_NOLINE)
+ return null;
+ float x2 = findLimitsPoint(rightWall);
+ if (lineStatus == LINE_STATUS_NOLINE)
+ return null;
+ return new float[]{x1, x2};
+ }
+
+ /**
+ * Finds the intersection between the <CODE>yLine</CODE>,
+ * the <CODE>yLine-leading</CODE>and the two
+ * column bounds. It will set the <CODE>lineStatus</CODE> apropriatly.
+ * @return a <CODE>float[4]</CODE>with the x coordinates of the intersection
+ */
+ protected float[] findLimitsTwoLines() {
+ boolean repeat = false;
+ for (;;) {
+ if (repeat && currentLeading == 0)
+ return null;
+ repeat = true;
+ float x1[] = findLimitsOneLine();
+ if (lineStatus == LINE_STATUS_OFFLIMITS)
+ return null;
+ yLine -= currentLeading;
+ if (lineStatus == LINE_STATUS_NOLINE) {
+ continue;
+ }
+ float x2[] = findLimitsOneLine();
+ if (lineStatus == LINE_STATUS_OFFLIMITS)
+ return null;
+ if (lineStatus == LINE_STATUS_NOLINE) {
+ yLine -= currentLeading;
+ continue;
+ }
+ if (x1[0] >= x2[1] || x2[0] >= x1[1])
+ continue;
+ return new float[]{x1[0], x1[1], x2[0], x2[1]};
+ }
+ }
+
+ /**
+ * Sets the columns bounds. Each column bound is described by a
+ * <CODE>float[]</CODE> with the line points [x1,y1,x2,y2,...].
+ * The array must have at least 4 elements.
+ * @param leftLine the left column bound
+ * @param rightLine the right column bound
+ */
+ public void setColumns(float leftLine[], float rightLine[]) {
+ maxY = -10e20f;
+ minY = 10e20f;
+ rightWall = convertColumn(rightLine);
+ leftWall = convertColumn(leftLine);
+ rectangularWidth = -1;
+ rectangularMode = false;
+ }
+
+ /**
+ * Simplified method for rectangular columns.
+ * @param phrase a <CODE>Phrase</CODE>
+ * @param llx the lower left x corner
+ * @param lly the lower left y corner
+ * @param urx the upper right x corner
+ * @param ury the upper right y corner
+ * @param leading the leading
+ * @param alignment the column alignment
+ */
+ public void setSimpleColumn(Phrase phrase, float llx, float lly, float urx, float ury, float leading, int alignment) {
+ addText(phrase);
+ setSimpleColumn(llx, lly, urx, ury, leading, alignment);
+ }
+
+ /**
+ * Simplified method for rectangular columns.
+ * @param llx the lower left x corner
+ * @param lly the lower left y corner
+ * @param urx the upper right x corner
+ * @param ury the upper right y corner
+ * @param leading the leading
+ * @param alignment the column alignment
+ */
+ public void setSimpleColumn(float llx, float lly, float urx, float ury, float leading, int alignment) {
+ setLeading(leading);
+ this.alignment = alignment;
+ setSimpleColumn(llx, lly, urx, ury);
+ }
+
+ /**
+ * Simplified method for rectangular columns.
+ * @param llx
+ * @param lly
+ * @param urx
+ * @param ury
+ */
+ public void setSimpleColumn(float llx, float lly, float urx, float ury) {
+ leftX = Math.min(llx, urx);
+ maxY = Math.max(lly, ury);
+ minY = Math.min(lly, ury);
+ rightX = Math.max(llx, urx);
+ yLine = maxY;
+ rectangularWidth = rightX - leftX;
+ if (rectangularWidth < 0)
+ rectangularWidth = 0;
+ rectangularMode = true;
+ }
+ /**
+ * Sets the leading to fixed
+ * @param leading the leading
+ */
+ public void setLeading(float leading) {
+ fixedLeading = leading;
+ multipliedLeading = 0;
+ }
+
+ /**
+ * Sets the leading fixed and variable. The resultant leading will be
+ * fixedLeading+multipliedLeading*maxFontSize where maxFontSize is the
+ * size of the bigest font in the line.
+ * @param fixedLeading the fixed leading
+ * @param multipliedLeading the variable leading
+ */
+ public void setLeading(float fixedLeading, float multipliedLeading) {
+ this.fixedLeading = fixedLeading;
+ this.multipliedLeading = multipliedLeading;
+ }
+
+ /**
+ * Gets the fixed leading
+ * @return the leading
+ */
+ public float getLeading() {
+ return fixedLeading;
+ }
+
+ /**
+ * Gets the variable leading
+ * @return the leading
+ */
+ public float getMultipliedLeading() {
+ return multipliedLeading;
+ }
+
+ /**
+ * Sets the yLine. The line will be written to yLine-leading.
+ * @param yLine the yLine
+ */
+ public void setYLine(float yLine) {
+ this.yLine = yLine;
+ }
+
+ /**
+ * Gets the yLine.
+ * @return the yLine
+ */
+ public float getYLine() {
+ return yLine;
+ }
+
+ /**
+ * Sets the alignment.
+ * @param alignment the alignment
+ */
+ public void setAlignment(int alignment) {
+ this.alignment = alignment;
+ }
+
+ /**
+ * Gets the alignment.
+ * @return the alignment
+ */
+ public int getAlignment() {
+ return alignment;
+ }
+
+ /**
+ * Sets the first paragraph line indent.
+ * @param indent the indent
+ */
+ public void setIndent(float indent) {
+ this.indent = indent;
+ lastWasNewline = true;
+ }
+
+ /**
+ * Gets the first paragraph line indent.
+ * @return the indent
+ */
+ public float getIndent() {
+ return indent;
+ }
+
+ /**
+ * Sets the following paragraph lines indent.
+ * @param indent the indent
+ */
+ public void setFollowingIndent(float indent) {
+ this.followingIndent = indent;
+ lastWasNewline = true;
+ }
+
+ /**
+ * Gets the following paragraph lines indent.
+ * @return the indent
+ */
+ public float getFollowingIndent() {
+ return followingIndent;
+ }
+
+ /**
+ * Sets the right paragraph lines indent.
+ * @param indent the indent
+ */
+ public void setRightIndent(float indent) {
+ this.rightIndent = indent;
+ lastWasNewline = true;
+ }
+
+ /**
+ * Gets the right paragraph lines indent.
+ * @return the indent
+ */
+ public float getRightIndent() {
+ return rightIndent;
+ }
+
+ /**
+ * Outputs the lines to the document. It is equivalent to <CODE>go(false)</CODE>.
+ * @return returns the result of the operation. It can be <CODE>NO_MORE_TEXT</CODE>
+ * and/or <CODE>NO_MORE_COLUMN</CODE>
+ * @throws DocumentException on error
+ */
+ public int go() throws DocumentException {
+ return go(false);
+ }
+
+ /**
+ * Outputs the lines to the document. The output can be simulated.
+ * @param simulate <CODE>true</CODE> to simulate the writting to the document
+ * @return returns the result of the operation. It can be <CODE>NO_MORE_TEXT</CODE>
+ * and/or <CODE>NO_MORE_COLUMN</CODE>
+ * @throws DocumentException on error
+ */
+ public int go(boolean simulate) throws DocumentException {
+ if (composite)
+ return goComposite(simulate);
+ addWaitingPhrase();
+ if (bidiLine == null)
+ return NO_MORE_TEXT;
+ descender = 0;
+ linesWritten = 0;
+ boolean dirty = false;
+ float ratio = spaceCharRatio;
+ Object currentValues[] = new Object[2];
+ PdfFont currentFont = null;
+ Float lastBaseFactor = new Float(0);
+ currentValues[1] = lastBaseFactor;
+ PdfDocument pdf = null;
+ PdfContentByte graphics = null;
+ PdfContentByte text = null;
+ firstLineY = Float.NaN;
+ int localRunDirection = PdfWriter.RUN_DIRECTION_NO_BIDI;
+ if (runDirection != PdfWriter.RUN_DIRECTION_DEFAULT)
+ localRunDirection = runDirection;
+ if (canvas != null) {
+ graphics = canvas;
+ pdf = canvas.getPdfDocument();
+ text = canvas.getDuplicate();
+ }
+ else if (!simulate)
+ throw new NullPointerException("ColumnText.go with simulate==false and text==null.");
+ if (!simulate) {
+ if (ratio == GLOBAL_SPACE_CHAR_RATIO)
+ ratio = text.getPdfWriter().getSpaceCharRatio();
+ else if (ratio < 0.001f)
+ ratio = 0.001f;
+ }
+ float firstIndent = 0;
+
+ int status = 0;
+ if (rectangularMode) {
+ for (;;) {
+ firstIndent = (lastWasNewline ? indent : followingIndent);
+ if (rectangularWidth <= firstIndent + rightIndent) {
+ status = NO_MORE_COLUMN;
+ if (bidiLine.isEmpty())
+ status |= NO_MORE_TEXT;
+ break;
+ }
+ if (bidiLine.isEmpty()) {
+ status = NO_MORE_TEXT;
+ break;
+ }
+ PdfLine line = bidiLine.processLine(rectangularWidth - firstIndent - rightIndent, alignment, localRunDirection, arabicOptions);
+ if (line == null) {
+ status = NO_MORE_TEXT;
+ break;
+ }
+ float maxSize = line.getMaxSizeSimple();
+ if (isUseAscender() && Float.isNaN(firstLineY)) {
+ currentLeading = line.getAscender();
+ }
+ else {
+ currentLeading = fixedLeading + maxSize * multipliedLeading;
+ }
+ if (yLine > maxY || yLine - currentLeading < minY ) {
+ status = NO_MORE_COLUMN;
+ bidiLine.restore();
+ break;
+ }
+ yLine -= currentLeading;
+ if (!simulate && !dirty) {
+ text.beginText();
+ dirty = true;
+ }
+ if (Float.isNaN(firstLineY)) {
+ firstLineY = yLine;
+ }
+ updateFilledWidth(rectangularWidth - line.widthLeft());
+ if (!simulate) {
+ currentValues[0] = currentFont;
+ text.setTextMatrix(leftX + (line.isRTL() ? rightIndent : firstIndent) + line.indentLeft(), yLine);
+ pdf.writeLineToContent(line, text, graphics, currentValues, ratio);
+ currentFont = (PdfFont)currentValues[0];
+ }
+ lastWasNewline = line.isNewlineSplit();
+ yLine -= line.isNewlineSplit() ? extraParagraphSpace : 0;
+ ++linesWritten;
+ descender = line.getDescender();
+ }
+ }
+ else {
+ currentLeading = fixedLeading;
+ for (;;) {
+ firstIndent = (lastWasNewline ? indent : followingIndent);
+ float yTemp = yLine;
+ float xx[] = findLimitsTwoLines();
+ if (xx == null) {
+ status = NO_MORE_COLUMN;
+ if (bidiLine.isEmpty())
+ status |= NO_MORE_TEXT;
+ yLine = yTemp;
+ break;
+ }
+ if (bidiLine.isEmpty()) {
+ status = NO_MORE_TEXT;
+ yLine = yTemp;
+ break;
+ }
+ float x1 = Math.max(xx[0], xx[2]);
+ float x2 = Math.min(xx[1], xx[3]);
+ if (x2 - x1 <= firstIndent + rightIndent)
+ continue;
+ if (!simulate && !dirty) {
+ text.beginText();
+ dirty = true;
+ }
+ PdfLine line = bidiLine.processLine(x2 - x1 - firstIndent - rightIndent, alignment, localRunDirection, arabicOptions);
+ if (line == null) {
+ status = NO_MORE_TEXT;
+ yLine = yTemp;
+ break;
+ }
+ if (!simulate) {
+ currentValues[0] = currentFont;
+ text.setTextMatrix(x1 + (line.isRTL() ? rightIndent : firstIndent) + line.indentLeft(), yLine);
+ pdf.writeLineToContent(line, text, graphics, currentValues, ratio);
+ currentFont = (PdfFont)currentValues[0];
+ }
+ lastWasNewline = line.isNewlineSplit();
+ yLine -= line.isNewlineSplit() ? extraParagraphSpace : 0;
+ ++linesWritten;
+ descender = line.getDescender();
+ }
+ }
+ if (dirty) {
+ text.endText();
+ canvas.add(text);
+ }
+ return status;
+ }
+
+ /**
+ * Sets the extra space between paragraphs.
+ * @return the extra space between paragraphs
+ */
+ public float getExtraParagraphSpace() {
+ return extraParagraphSpace;
+ }
+
+ /**
+ * Sets the extra space between paragraphs.
+ * @param extraParagraphSpace the extra space between paragraphs
+ */
+ public void setExtraParagraphSpace(float extraParagraphSpace) {
+ this.extraParagraphSpace = extraParagraphSpace;
+ }
+
+ /**
+ * Clears the chunk array. A call to <CODE>go()</CODE> will always return
+ * NO_MORE_TEXT.
+ */
+ public void clearChunks() {
+ if (bidiLine != null)
+ bidiLine.clearChunks();
+ }
+
+ /** Gets the space/character extra spacing ratio for
+ * fully justified text.
+ * @return the space/character extra spacing ratio
+ */
+ public float getSpaceCharRatio() {
+ return spaceCharRatio;
+ }
+
+ /** Sets the ratio between the extra word spacing and the extra character spacing
+ * when the text is fully justified.
+ * Extra word spacing will grow <CODE>spaceCharRatio</CODE> times more than extra character spacing.
+ * If the ratio is <CODE>PdfWriter.NO_SPACE_CHAR_RATIO</CODE> then the extra character spacing
+ * will be zero.
+ * @param spaceCharRatio the ratio between the extra word spacing and the extra character spacing
+ */
+ public void setSpaceCharRatio(float spaceCharRatio) {
+ this.spaceCharRatio = spaceCharRatio;
+ }
+
+ /** Sets the run direction.
+ * @param runDirection the run direction
+ */
+ public void setRunDirection(int runDirection) {
+ if (runDirection < PdfWriter.RUN_DIRECTION_DEFAULT || runDirection > PdfWriter.RUN_DIRECTION_RTL)
+ throw new RuntimeException("Invalid run direction: " + runDirection);
+ this.runDirection = runDirection;
+ }
+
+ /** Gets the run direction.
+ * @return the run direction
+ */
+ public int getRunDirection() {
+ return runDirection;
+ }
+
+ /** Gets the number of lines written.
+ * @return the number of lines written
+ */
+ public int getLinesWritten() {
+ return this.linesWritten;
+ }
+
+ /** Gets the arabic shaping options.
+ * @return the arabic shaping options
+ */
+ public int getArabicOptions() {
+ return this.arabicOptions;
+ }
+
+ /** Sets the arabic shaping options. The option can be AR_NOVOWEL,
+ * AR_COMPOSEDTASHKEEL and AR_LIG.
+ * @param arabicOptions the arabic shaping options
+ */
+ public void setArabicOptions(int arabicOptions) {
+ this.arabicOptions = arabicOptions;
+ }
+
+ /** Gets the biggest descender value of the last line written.
+ * @return the biggest descender value of the last line written
+ */
+ public float getDescender() {
+ return descender;
+ }
+
+ /** Gets the width that the line will occupy after writing.
+ * Only the width of the first line is returned.
+ * @param phrase the <CODE>Phrase</CODE> containing the line
+ * @param runDirection the run direction
+ * @param arabicOptions the options for the arabic shaping
+ * @return the width of the line
+ */
+ public static float getWidth(Phrase phrase, int runDirection, int arabicOptions) {
+ ColumnText ct = new ColumnText(null);
+ ct.addText(phrase);
+ ct.addWaitingPhrase();
+ PdfLine line = ct.bidiLine.processLine(20000, Element.ALIGN_LEFT, runDirection, arabicOptions);
+ if (line == null)
+ return 0;
+ else
+ return 20000 - line.widthLeft();
+ }
+
+ /** Gets the width that the line will occupy after writing.
+ * Only the width of the first line is returned.
+ * @param phrase the <CODE>Phrase</CODE> containing the line
+ * @return the width of the line
+ */
+ public static float getWidth(Phrase phrase) {
+ return getWidth(phrase, PdfWriter.RUN_DIRECTION_NO_BIDI, 0);
+ }
+
+ /** Shows a line of text. Only the first line is written.
+ * @param canvas where the text is to be written to
+ * @param alignment the alignment. It is not influenced by the run direction
+ * @param phrase the <CODE>Phrase</CODE> with the text
+ * @param x the x reference position
+ * @param y the y reference position
+ * @param rotation the rotation to be applied in degrees counterclockwise
+ * @param runDirection the run direction
+ * @param arabicOptions the options for the arabic shaping
+ */
+ public static void showTextAligned(PdfContentByte canvas, int alignment, Phrase phrase, float x, float y, float rotation, int runDirection, int arabicOptions) {
+ if (alignment != Element.ALIGN_LEFT && alignment != Element.ALIGN_CENTER
+ && alignment != Element.ALIGN_RIGHT)
+ alignment = Element.ALIGN_LEFT;
+ canvas.saveState();
+ ColumnText ct = new ColumnText(canvas);
+ if (rotation == 0) {
+ if (alignment == Element.ALIGN_LEFT)
+ ct.setSimpleColumn(phrase, x, y - 1, 20000 + x, y + 2, 2, alignment);
+ else if (alignment == Element.ALIGN_RIGHT)
+ ct.setSimpleColumn(phrase, x-20000, y-1, x, y+2, 2, alignment);
+ else
+ ct.setSimpleColumn(phrase, x-20000, y-1, x+20000, y+2, 2, alignment);
+ }
+ else {
+ double alpha = rotation * Math.PI / 180.0;
+ float cos = (float)Math.cos(alpha);
+ float sin = (float)Math.sin(alpha);
+ canvas.concatCTM(cos, sin, -sin, cos, x, y);
+ if (alignment == Element.ALIGN_LEFT)
+ ct.setSimpleColumn(phrase, 0, -1, 20000, 2, 2, alignment);
+ else if (alignment == Element.ALIGN_RIGHT)
+ ct.setSimpleColumn(phrase, -20000, -1, 0, 2, 2, alignment);
+ else
+ ct.setSimpleColumn(phrase, -20000, -1, 20000, 2, 2, alignment);
+ }
+ if (runDirection == PdfWriter.RUN_DIRECTION_RTL) {
+ if (alignment == Element.ALIGN_LEFT)
+ alignment = Element.ALIGN_RIGHT;
+ else if (alignment == Element.ALIGN_RIGHT)
+ alignment = Element.ALIGN_LEFT;
+ }
+ ct.setAlignment(alignment);
+ ct.setArabicOptions(arabicOptions);
+ ct.setRunDirection(runDirection);
+ try {
+ ct.go();
+ }
+ catch (DocumentException e) {
+ throw new ExceptionConverter(e);
+ }
+ canvas.restoreState();
+ }
+
+ /** Shows a line of text. Only the first line is written.
+ * @param canvas where the text is to be written to
+ * @param alignment the alignment
+ * @param phrase the <CODE>Phrase</CODE> with the text
+ * @param x the x reference position
+ * @param y the y reference position
+ * @param rotation the rotation to be applied in degrees counterclockwise
+ */
+ public static void showTextAligned(PdfContentByte canvas, int alignment, Phrase phrase, float x, float y, float rotation) {
+ showTextAligned(canvas, alignment, phrase, x, y, rotation, PdfWriter.RUN_DIRECTION_NO_BIDI, 0);
+ }
+
+ protected int goComposite(boolean simulate) throws DocumentException {
+ if (!rectangularMode)
+ throw new DocumentException("Irregular columns are not supported in composite mode.");
+ linesWritten = 0;
+ descender = 0;
+ boolean firstPass = true;
+ main_loop:
+ while (true) {
+ if (compositeElements.isEmpty())
+ return NO_MORE_TEXT;
+ Element element = (Element)compositeElements.getFirst();
+ if (element.type() == Element.PARAGRAPH) {
+ Paragraph para = (Paragraph)element;
+ int status = 0;
+ for (int keep = 0; keep < 2; ++keep) {
+ float lastY = yLine;
+ boolean createHere = false;
+ if (compositeColumn == null) {
+ compositeColumn = new ColumnText(canvas);
+ compositeColumn.setUseAscender(firstPass ? useAscender : false);
+ compositeColumn.setAlignment(para.alignment());
+ compositeColumn.setIndent(para.indentationLeft() + para.getFirstLineIndent());
+ compositeColumn.setExtraParagraphSpace(para.getExtraParagraphSpace());
+ compositeColumn.setFollowingIndent(para.indentationLeft());
+ compositeColumn.setRightIndent(para.indentationRight());
+ compositeColumn.setLeading(para.leading(), para.getMultipliedLeading());
+ compositeColumn.setRunDirection(runDirection);
+ compositeColumn.setArabicOptions(arabicOptions);
+ compositeColumn.setSpaceCharRatio(spaceCharRatio);
+ compositeColumn.addText(para);
+ if (!firstPass) {
+ yLine -= para.spacingBefore();
+ }
+ createHere = true;
+ }
+ compositeColumn.leftX = leftX;
+ compositeColumn.rightX = rightX;
+ compositeColumn.yLine = yLine;
+ compositeColumn.rectangularWidth = rectangularWidth;
+ compositeColumn.rectangularMode = rectangularMode;
+ compositeColumn.minY = minY;
+ compositeColumn.maxY = maxY;
+ boolean keepCandidate = (para.getKeepTogether() && createHere && !firstPass);
+ status = compositeColumn.go(simulate || (keepCandidate && keep == 0));
+ updateFilledWidth(compositeColumn.filledWidth);
+ if ((status & NO_MORE_TEXT) == 0 && keepCandidate) {
+ compositeColumn = null;
+ yLine = lastY;
+ return NO_MORE_COLUMN;
+ }
+ if (simulate || !keepCandidate)
+ break;
+ if (keep == 0) {
+ compositeColumn = null;
+ yLine = lastY;
+ }
+ }
+ firstPass = false;
+ yLine = compositeColumn.yLine;
+ linesWritten += compositeColumn.linesWritten;
+ descender = compositeColumn.descender;
+ if ((status & NO_MORE_TEXT) != 0) {
+ compositeColumn = null;
+ compositeElements.removeFirst();
+ yLine -= para.spacingAfter();
+ }
+ if ((status & NO_MORE_COLUMN) != 0) {
+ return NO_MORE_COLUMN;
+ }
+ }
+ else if (element.type() == Element.LIST) {
+ com.lowagie.text.List list = (com.lowagie.text.List)element;
+ ArrayList items = list.getItems();
+ ListItem item = null;
+ float listIndentation = list.indentationLeft();
+ int count = 0;
+ Stack stack = new Stack();
+ for (int k = 0; k < items.size(); ++k) {
+ Object obj = items.get(k);
+ if (obj instanceof ListItem) {
+ if (count == listIdx) {
+ item = (ListItem)obj;
+ break;
+ }
+ else ++count;
+ }
+ else if (obj instanceof com.lowagie.text.List) {
+ stack.push(new Object[]{list, new Integer(k), new Float(listIndentation)});
+ list = (com.lowagie.text.List)obj;
+ items = list.getItems();
+ listIndentation += list.indentationLeft();
+ k = -1;
+ continue;
+ }
+ if (k == items.size() - 1) {
+ if (!stack.isEmpty()) {
+ Object objs[] = (Object[])stack.pop();
+ list = (com.lowagie.text.List)objs[0];
+ items = list.getItems();
+ k = ((Integer)objs[1]).intValue();
+ listIndentation = ((Float)objs[2]).floatValue();
+ }
+ }
+ }
+ int status = 0;
+ for (int keep = 0; keep < 2; ++keep) {
+ float lastY = yLine;
+ boolean createHere = false;
+ if (compositeColumn == null) {
+ if (item == null) {
+ listIdx = 0;
+ compositeElements.removeFirst();
+ continue main_loop;
+ }
+ compositeColumn = new ColumnText(canvas);
+ compositeColumn.setUseAscender(firstPass ? useAscender : false);
+ compositeColumn.setAlignment(item.alignment());
+ compositeColumn.setIndent(item.indentationLeft() + listIndentation + item.getFirstLineIndent());
+ compositeColumn.setExtraParagraphSpace(item.getExtraParagraphSpace());
+ compositeColumn.setFollowingIndent(compositeColumn.getIndent());
+ compositeColumn.setRightIndent(item.indentationRight() + list.indentationRight());
+ compositeColumn.setLeading(item.leading(), item.getMultipliedLeading());
+ compositeColumn.setRunDirection(runDirection);
+ compositeColumn.setArabicOptions(arabicOptions);
+ compositeColumn.setSpaceCharRatio(spaceCharRatio);
+ compositeColumn.addText(item);
+ if (!firstPass) {
+ yLine -= item.spacingBefore();
+ }
+ createHere = true;
+ }
+ compositeColumn.leftX = leftX;
+ compositeColumn.rightX = rightX;
+ compositeColumn.yLine = yLine;
+ compositeColumn.rectangularWidth = rectangularWidth;
+ compositeColumn.rectangularMode = rectangularMode;
+ compositeColumn.minY = minY;
+ compositeColumn.maxY = maxY;
+ boolean keepCandidate = (item.getKeepTogether() && createHere && !firstPass);
+ status = compositeColumn.go(simulate || (keepCandidate && keep == 0));
+ updateFilledWidth(compositeColumn.filledWidth);
+ if ((status & NO_MORE_TEXT) == 0 && keepCandidate) {
+ compositeColumn = null;
+ yLine = lastY;
+ return NO_MORE_COLUMN;
+ }
+ if (simulate || !keepCandidate)
+ break;
+ if (keep == 0) {
+ compositeColumn = null;
+ yLine = lastY;
+ }
+ }
+ firstPass = false;
+ yLine = compositeColumn.yLine;
+ linesWritten += compositeColumn.linesWritten;
+ descender = compositeColumn.descender;
+ if (!Float.isNaN(compositeColumn.firstLineY) && !compositeColumn.firstLineYDone) {
+ if (!simulate)
+ showTextAligned(canvas, Element.ALIGN_LEFT, new Phrase(item.listSymbol()), compositeColumn.leftX + listIndentation, compositeColumn.firstLineY, 0);
+ compositeColumn.firstLineYDone = true;
+ }
+ if ((status & NO_MORE_TEXT) != 0) {
+ compositeColumn = null;
+ ++listIdx;
+ yLine -= item.spacingAfter();
+ }
+ if ((status & NO_MORE_COLUMN) != 0) {
+ return NO_MORE_COLUMN;
+ }
+ }
+ else if (element.type() == Element.PTABLE) {
+ if (yLine < minY || yLine > maxY)
+ return NO_MORE_COLUMN;
+ PdfPTable table = (PdfPTable)element;
+ if (table.size() <= table.getHeaderRows()) {
+ compositeElements.removeFirst();
+ continue;
+ }
+ float yTemp = yLine;
+ float yLineWrite = yLine;
+ if (!firstPass && listIdx == 0) {
+ yTemp -= table.spacingBefore();
+ yLineWrite = yTemp;
+ }
+ currentLeading = 0;
+ if (yTemp < minY || yTemp > maxY)
+ return NO_MORE_COLUMN;
+ float x1 = leftX;
+ float tableWidth;
+ if (table.isLockedWidth()) {
+ tableWidth = table.getTotalWidth();
+ updateFilledWidth(tableWidth);
+ }
+ else {
+ tableWidth = rectangularWidth * table.getWidthPercentage() / 100f;
+ table.setTotalWidth(tableWidth);
+ }
+ int k;
+ boolean skipHeader = (!firstPass && table.isSkipFirstHeader() && listIdx <= table.getHeaderRows());
+ if (!skipHeader) {
+ yTemp -= table.getHeaderHeight();
+ if (yTemp < minY || yTemp > maxY) {
+ if (firstPass) {
+ compositeElements.removeFirst();
+ continue;
+ }
+ return NO_MORE_COLUMN;
+ }
+ }
+ if (listIdx < table.getHeaderRows())
+ listIdx = table.getHeaderRows();
+ for (k = listIdx; k < table.size(); ++k) {
+ float rowHeight = table.getRowHeight(k);
+ if (yTemp - rowHeight < minY)
+ break;
+ yTemp -= rowHeight;
+ }
+ if (k < table.size()) {
+ if (table.isSplitRows() && (!table.isSplitLate() || (k == listIdx && firstPass))) {
+ if (!splittedRow) {
+ splittedRow = true;
+ table = new PdfPTable(table);
+ compositeElements.set(0, table);
+ ArrayList rows = table.getRows();
+ for (int i = table.getHeaderRows(); i < listIdx; ++i)
+ rows.set(i, null);
+ }
+ float h = yTemp - minY;
+ PdfPRow newRow = table.getRow(k).splitRow(h);
+ if (newRow == null) {
+ if (k == listIdx)
+ return NO_MORE_COLUMN;
+ }
+ else {
+ yTemp = minY;
+ table.getRows().add(++k, newRow);
+ }
+ }
+ else if (!table.isSplitRows() && k == listIdx && firstPass) {
+ compositeElements.removeFirst();
+ splittedRow = false;
+ continue;
+ }
+ else if (k == listIdx && !firstPass && (!table.isSplitRows() || table.isSplitLate())) {
+ return NO_MORE_COLUMN;
+ }
+ }
+ firstPass = false;
+ if (!simulate) {
+ switch (table.getHorizontalAlignment()) {
+ case Element.ALIGN_LEFT:
+ break;
+ case Element.ALIGN_RIGHT:
+ x1 += rectangularWidth - tableWidth;
+ break;
+ default:
+ x1 += (rectangularWidth - tableWidth) / 2f;
+ }
+ int realHeaderRows = table.getHeaderRows();
+ int footerRows = table.getFooterRows();
+ if (footerRows > realHeaderRows)
+ footerRows = realHeaderRows;
+ realHeaderRows -= footerRows;
+ PdfPTable nt = PdfPTable.shallowCopy(table);
+ ArrayList rows = table.getRows();
+ ArrayList sub = nt.getRows();
+ if (!skipHeader) {
+ for (int j = 0; j < realHeaderRows; ++j)
+ sub.add(rows.get(j));
+ }
+ else
+ nt.setHeaderRows(footerRows);
+ for (int j = listIdx; j < k; ++j)
+ sub.add(rows.get(j));
+ for (int j = 0; j < footerRows; ++j)
+ sub.add(rows.get(j + realHeaderRows));
+ float rowHeight = 0;
+ if (table.isExtendLastRow()) {
+ PdfPRow last = (PdfPRow)sub.get(sub.size() - 1 - footerRows);
+ rowHeight = last.getMaxHeights();
+ last.setMaxHeights(yTemp - minY + rowHeight);
+ yTemp = minY;
+ }
+ if (canvases != null)
+ nt.writeSelectedRows(0, -1, x1, yLineWrite, canvases);
+ else
+ nt.writeSelectedRows(0, -1, x1, yLineWrite, canvas);
+ if (table.isExtendLastRow()) {
+ PdfPRow last = (PdfPRow)sub.get(sub.size() - 1 - footerRows);
+ last.setMaxHeights(rowHeight);
+ }
+ }
+ else if (table.isExtendLastRow() && minY > PdfPRow.BOTTOM_LIMIT)
+ yTemp = minY;
+ yLine = yTemp;
+ if (k >= table.size()) {
+ yLine -= table.spacingAfter();
+ compositeElements.removeFirst();
+ splittedRow = false;
+ listIdx = 0;
+ }
+ else {
+ if (splittedRow) {
+ ArrayList rows = table.getRows();
+ for (int i = listIdx; i < k; ++i)
+ rows.set(i, null);
+ }
+ listIdx = k;
+ return NO_MORE_COLUMN;
+ }
+ }
+ else if (element.type() == Element.GRAPHIC) {
+ if (!simulate) {
+ Graphic gr = (Graphic)element;
+ ByteBuffer bf = gr.getInternalBuffer();
+ ByteBuffer store = null;
+ if (bf.size() > 0) {
+ store = new ByteBuffer();
+ store.append(bf);
+ bf.reset();
+ }
+ gr.processAttributes(leftX, minY, rightX, maxY, yLine);
+ canvas.add(gr);
+ bf.reset();
+ if (store != null) {
+ bf.append(store);
+ }
+ }
+ compositeElements.removeFirst();
+ }
+ else
+ compositeElements.removeFirst();
+ }
+ }
+
+ /**
+ * Gets the canvas.
+ * @return a PdfContentByte.
+ */
+ public PdfContentByte getCanvas() {
+ return canvas;
+ }
+
+ /**
+ * Sets the canvas.
+ * @param canvas
+ */
+ public void setCanvas(PdfContentByte canvas) {
+ this.canvas = canvas;
+ this.canvases = null;
+ if (compositeColumn != null)
+ compositeColumn.setCanvas(canvas);
+ }
+
+ /**
+ * Sets the canvases.
+ * @param canvases
+ */
+ public void setCanvases(PdfContentByte[] canvases) {
+ this.canvases = canvases;
+ this.canvas = canvases[PdfPTable.TEXTCANVAS];
+ if (compositeColumn != null)
+ compositeColumn.setCanvases(canvases);
+ }
+
+ /**
+ * Gets the canvases.
+ * @return an array of PdfContentByte
+ */
+ public PdfContentByte[] getCanvases() {
+ return canvases;
+ }
+
+ /**
+ * Checks if the element has a height of 0.
+ * @return true or false
+ */
+ public boolean zeroHeightElement() {
+ return composite == true && compositeElements.size() > 0 && ((Element)compositeElements.getFirst()).type() == Element.GRAPHIC;
+ }
+
+ /**
+ * Checks if UseAscender is enabled/disabled.
+ * @return true is the adjustment of the first line height is based on max ascender.
+ */
+ public boolean isUseAscender() {
+ return useAscender;
+ }
+
+ /**
+ * Enables/Disables adjustment of first line height based on max ascender.
+ * @param use enable adjustment if true
+ */
+ public void setUseAscender(boolean use) {
+ useAscender = use;
+ }
+
+ /**
+ * Checks the status variable and looks if there's still some text.
+ */
+ public static boolean hasMoreText(int status) {
+ return (status & ColumnText.NO_MORE_TEXT) == 0;
+ }
+
+ /**
+ * Holds value of property filledWidth.
+ */
+ private float filledWidth;
+
+ /**
+ * Gets the real width used by the largest line.
+ * @return the real width used by the largest line
+ */
+ public float getFilledWidth() {
+
+ return this.filledWidth;
+ }
+
+ /**
+ * Sets the real width used by the largest line. Only used to set it
+ * to zero to start another measurement.
+ * @param filledWidth the real width used by the largest line
+ */
+ public void setFilledWidth(float filledWidth) {
+
+ this.filledWidth = filledWidth;
+ }
+
+ /**
+ * Replaces the <CODE>filledWidth</CODE> if greater than the existing one.
+ * @param w the new <CODE>filledWidth</CODE> if greater than the existing one
+ */
+ public void updateFilledWidth(float w) {
+ if (w > filledWidth)
+ filledWidth = w;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/pdf/DefaultFontMapper.java b/src/main/java/com/lowagie/text/pdf/DefaultFontMapper.java
new file mode 100644
index 0000000..bf3b645
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/DefaultFontMapper.java
@@ -0,0 +1,308 @@
+/*
+ * Copyright 2004 by Paulo Soares.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+package com.lowagie.text.pdf;
+
+import java.awt.Font;
+import com.lowagie.text.ExceptionConverter;
+import java.util.HashMap;
+import java.io.File;
+/** Default class to map awt fonts to BaseFont.
+ * @author Paulo Soares (psoares@consiste.pt)
+ */
+
+public class DefaultFontMapper implements FontMapper {
+
+ /** A representation of BaseFont parameters.
+ */
+ public static class BaseFontParameters {
+ /** The font name.
+ */
+ public String fontName;
+ /** The encoding for that font.
+ */
+ public String encoding;
+ /** The embedding for that font.
+ */
+ public boolean embedded;
+ /** Whether the font is cached of not.
+ */
+ public boolean cached;
+ /** The font bytes for ttf and afm.
+ */
+ public byte ttfAfm[];
+ /** The font bytes for pfb.
+ */
+ public byte pfb[];
+
+ /** Constructs default BaseFont parameters.
+ * @param fontName the font name or location
+ */
+ public BaseFontParameters(String fontName) {
+ this.fontName = fontName;
+ encoding = BaseFont.CP1252;
+ embedded = BaseFont.EMBEDDED;
+ cached = BaseFont.CACHED;
+ }
+ }
+
+ /** Maps aliases to names.
+ */
+ private HashMap aliases = new HashMap();
+ /** Maps names to BaseFont parameters.
+ */
+ private HashMap mapper = new HashMap();
+ /**
+ * Returns a BaseFont which can be used to represent the given AWT Font
+ *
+ * @param font the font to be converted
+ * @return a BaseFont which has similar properties to the provided Font
+ */
+
+ public BaseFont awtToPdf(Font font) {
+ try {
+ BaseFontParameters p = getBaseFontParameters(font.getFontName());
+ if (p != null)
+ return BaseFont.createFont(p.fontName, p.encoding, p.embedded, p.cached, p.ttfAfm, p.pfb);
+ String fontKey = null;
+ String logicalName = font.getName();
+
+ if (logicalName.equalsIgnoreCase("DialogInput") || logicalName.equalsIgnoreCase("Monospaced") || logicalName.equalsIgnoreCase("Courier")) {
+
+ if (font.isItalic()) {
+ if (font.isBold()) {
+ fontKey = BaseFont.COURIER_BOLDOBLIQUE;
+
+ } else {
+ fontKey = BaseFont.COURIER_OBLIQUE;
+ }
+
+ } else {
+ if (font.isBold()) {
+ fontKey = BaseFont.COURIER_BOLD;
+
+ } else {
+ fontKey = BaseFont.COURIER;
+ }
+ }
+
+ } else if (logicalName.equalsIgnoreCase("Serif") || logicalName.equalsIgnoreCase("TimesRoman")) {
+
+ if (font.isItalic()) {
+ if (font.isBold()) {
+ fontKey = BaseFont.TIMES_BOLDITALIC;
+
+ } else {
+ fontKey = BaseFont.TIMES_ITALIC;
+ }
+
+ } else {
+ if (font.isBold()) {
+ fontKey = BaseFont.TIMES_BOLD;
+
+ } else {
+ fontKey = BaseFont.TIMES_ROMAN;
+ }
+ }
+
+ } else { // default, this catches Dialog and SansSerif
+
+ if (font.isItalic()) {
+ if (font.isBold()) {
+ fontKey = BaseFont.HELVETICA_BOLDOBLIQUE;
+
+ } else {
+ fontKey = BaseFont.HELVETICA_OBLIQUE;
+ }
+
+ } else {
+ if (font.isBold()) {
+ fontKey = BaseFont.HELVETICA_BOLD;
+ } else {
+ fontKey = BaseFont.HELVETICA;
+ }
+ }
+ }
+ return BaseFont.createFont(fontKey, BaseFont.CP1252, false);
+ }
+ catch (Exception e) {
+ throw new ExceptionConverter(e);
+ }
+ }
+
+ /**
+ * Returns an AWT Font which can be used to represent the given BaseFont
+ *
+ * @param font the font to be converted
+ * @param size the desired point size of the resulting font
+ * @return a Font which has similar properties to the provided BaseFont
+ */
+
+ public Font pdfToAwt(BaseFont font, int size) {
+ String names[][] = font.getFullFontName();
+ if (names.length == 1)
+ return new Font(names[0][3], 0, size);
+ String name10 = null;
+ String name3x = null;
+ for (int k = 0; k < names.length; ++k) {
+ String name[] = names[k];
+ if (name[0].equals("1") && name[1].equals("0"))
+ name10 = name[3];
+ else if (name[2].equals("1033")) {
+ name3x = name[3];
+ break;
+ }
+ }
+ String finalName = name3x;
+ if (finalName == null)
+ finalName = name10;
+ if (finalName == null)
+ finalName = names[0][3];
+ return new Font(finalName, 0, size);
+ }
+
+ /** Maps a name to a BaseFont parameter.
+ * @param awtName the name
+ * @param parameters the BaseFont parameter
+ */
+ public void putName(String awtName, BaseFontParameters parameters) {
+ mapper.put(awtName, parameters);
+ }
+
+ /** Maps an alias to a name.
+ * @param alias the alias
+ * @param awtName the name
+ */
+ public void putAlias(String alias, String awtName) {
+ aliases.put(alias, awtName);
+ }
+
+ /** Looks for a BaseFont parameter associated with a name.
+ * @param name the name
+ * @return the BaseFont parameter or <CODE>null</CODE> if not found.
+ */
+ public BaseFontParameters getBaseFontParameters(String name) {
+ String alias = (String)aliases.get(name);
+ if (alias == null)
+ return (BaseFontParameters)mapper.get(name);
+ BaseFontParameters p = (BaseFontParameters)mapper.get(alias);
+ if (p == null)
+ return (BaseFontParameters)mapper.get(name);
+ else
+ return p;
+ }
+
+ /**
+ * Inserts the names in this map.
+ * @param allNames the returned value of calling {@link BaseFont#getAllFontNames(String, String, byte[])}
+ * @param path the full path to the font
+ */
+ public void insertNames(Object allNames[], String path) {
+ String names[][] = (String[][])allNames[2];
+ String main = null;
+ for (int k = 0; k < names.length; ++k) {
+ String name[] = names[k];
+ if (name[2].equals("1033")) {
+ main = name[3];
+ break;
+ }
+ }
+ if (main == null)
+ main = names[0][3];
+ BaseFontParameters p = new BaseFontParameters(path);
+ mapper.put(main, p);
+ for (int k = 0; k < names.length; ++k) {
+ aliases.put(names[k][3], main);
+ }
+ aliases.put(allNames[0], main);
+ }
+
+ /** Inserts all the fonts recognized by iText in the
+ * <CODE>directory</CODE> into the map. The encoding
+ * will be <CODE>BaseFont.CP1252</CODE> but can be
+ * changed later.
+ * @param dir the directory to scan
+ * @return the number of files processed
+ */
+ public int insertDirectory(String dir) {
+ File file = new File(dir);
+ if (!file.exists() || !file.isDirectory())
+ return 0;
+ File files[] = file.listFiles();
+ int count = 0;
+ for (int k = 0; k < files.length; ++k) {
+ file = files[k];
+ String name = file.getPath().toLowerCase();
+ try {
+ if (name.endsWith(".ttf") || name.endsWith(".otf") || name.endsWith(".afm")) {
+ Object allNames[] = BaseFont.getAllFontNames(file.getPath(), BaseFont.CP1252, null);
+ insertNames(allNames, file.getPath());
+ ++count;
+ }
+ else if (name.endsWith(".ttc")) {
+ String ttcs[] = BaseFont.enumerateTTCNames(file.getPath());
+ for (int j = 0; j < ttcs.length; ++j) {
+ String nt = file.getPath() + "," + j;
+ Object allNames[] = BaseFont.getAllFontNames(nt, BaseFont.CP1252, null);
+ insertNames(allNames, nt);
+ }
+ ++count;
+ }
+ }
+ catch (Exception e) {
+ }
+ }
+ return count;
+ }
+
+ public HashMap getMapper() {
+ return mapper;
+ }
+
+ public HashMap getAliases() {
+ return aliases;
+ }
+}
diff --git a/src/main/java/com/lowagie/text/pdf/DocumentFont.java b/src/main/java/com/lowagie/text/pdf/DocumentFont.java
new file mode 100644
index 0000000..b3c4942
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/DocumentFont.java
@@ -0,0 +1,599 @@
+/*
+ * Copyright 2004 by Paulo Soares.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+package com.lowagie.text.pdf;
+
+import java.io.IOException;
+import java.util.ArrayList;
+
+import com.lowagie.text.DocumentException;
+import com.lowagie.text.ExceptionConverter;
+import java.util.HashMap;
+
+/**
+ *
+ * @author psoares
+ */
+public class DocumentFont extends BaseFont {
+ // code, [glyph, width]
+ private HashMap metrics = new HashMap();
+ private String fontName;
+ private PRIndirectReference refFont;
+ private PdfDictionary font;
+ private IntHashtable uni2byte = new IntHashtable();
+ private float Ascender = 800;
+ private float CapHeight = 700;
+ private float Descender = -200;
+ private float ItalicAngle = 0;
+ private float llx = -50;
+ private float lly = -200;
+ private float urx = 100;
+ private float ury = 900;
+ private boolean isType0 = false;
+
+ private BaseFont cjkMirror;
+
+ private static String cjkNames[] = {"HeiseiMin-W3", "HeiseiKakuGo-W5", "STSong-Light", "MHei-Medium",
+ "MSung-Light", "HYGoThic-Medium", "HYSMyeongJo-Medium", "MSungStd-Light", "STSongStd-Light",
+ "HYSMyeongJoStd-Medium", "KozMinPro-Regular"};
+
+ private static String cjkEncs[] = {"UniJIS-UCS2-H", "UniJIS-UCS2-H", "UniGB-UCS2-H", "UniCNS-UCS2-H",
+ "UniCNS-UCS2-H", "UniKS-UCS2-H", "UniKS-UCS2-H", "UniCNS-UCS2-H", "UniGB-UCS2-H",
+ "UniKS-UCS2-H", "UniJIS-UCS2-H"};
+
+ private static String cjkNames2[] = {"MSungStd-Light", "STSongStd-Light", "HYSMyeongJoStd-Medium", "KozMinPro-Regular"};
+
+ private static String cjkEncs2[] = {"UniCNS-UCS2-H", "UniGB-UCS2-H", "UniKS-UCS2-H", "UniJIS-UCS2-H",
+ "UniCNS-UTF16-H", "UniGB-UTF16-H", "UniKS-UTF16-H", "UniJIS-UTF16-H"};
+
+ private static final int stdEnc[] = {
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 32,33,34,35,36,37,38,8217,40,41,42,43,44,45,46,47,
+ 48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,
+ 64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,
+ 80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,
+ 8216,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,
+ 112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,161,162,163,8260,165,402,167,164,39,8220,171,8249,8250,64257,64258,
+ 0,8211,8224,8225,183,0,182,8226,8218,8222,8221,187,8230,8240,0,191,
+ 0,96,180,710,732,175,728,729,168,0,730,184,0,733,731,711,
+ 8212,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,198,0,170,0,0,0,0,321,216,338,186,0,0,0,0,
+ 0,230,0,0,0,305,0,0,322,248,339,223,0,0,0,0};
+
+ /** Creates a new instance of DocumentFont */
+ DocumentFont(PRIndirectReference refFont) {
+ encoding = "";
+ fontSpecific = false;
+ this.refFont = refFont;
+ fontType = FONT_TYPE_DOCUMENT;
+ font = (PdfDictionary)PdfReader.getPdfObject(refFont);
+ fontName = PdfName.decodeName(((PdfName)PdfReader.getPdfObject(font.get(PdfName.BASEFONT))).toString());
+ PdfName subType = (PdfName)PdfReader.getPdfObject(font.get(PdfName.SUBTYPE));
+ if (PdfName.TYPE1.equals(subType) || PdfName.TRUETYPE.equals(subType))
+ doType1TT();
+ else {
+ for (int k = 0; k < cjkNames.length; ++k) {
+ if (fontName.startsWith(cjkNames[k])) {
+ fontName = cjkNames[k];
+ try {
+ cjkMirror = BaseFont.createFont(fontName, cjkEncs[k], false);
+ }
+ catch (Exception e) {
+ throw new ExceptionConverter(e);
+ }
+ return;
+ }
+ }
+ String enc = PdfName.decodeName(((PdfName)PdfReader.getPdfObject(font.get(PdfName.ENCODING))).toString());
+ for (int k = 0; k < cjkEncs2.length; ++k) {
+ if (enc.startsWith(cjkEncs2[k])) {
+ try {
+ if (k > 3)
+ k -= 4;
+ cjkMirror = BaseFont.createFont(cjkNames2[k], cjkEncs2[k], false);
+ }
+ catch (Exception e) {
+ throw new ExceptionConverter(e);
+ }
+ return;
+ }
+ }
+ if (PdfName.TYPE0.equals(subType) && enc.equals("Identity-H")) {
+ processType0(font);
+ isType0 = true;
+ }
+ }
+ }
+
+ private void processType0(PdfDictionary font) {
+ try {
+ byte[] touni = PdfReader.getStreamBytes((PRStream)PdfReader.getPdfObjectRelease(font.get(PdfName.TOUNICODE)));
+ PdfArray df = (PdfArray)PdfReader.getPdfObjectRelease(font.get(PdfName.DESCENDANTFONTS));
+ PdfDictionary cidft = (PdfDictionary)PdfReader.getPdfObjectRelease((PdfObject)df.getArrayList().get(0));
+ PdfNumber dwo = (PdfNumber)PdfReader.getPdfObjectRelease(cidft.get(PdfName.DW));
+ int dw = 1000;
+ if (dwo != null)
+ dw = dwo.intValue();
+ IntHashtable widths = readWidths((PdfArray)PdfReader.getPdfObjectRelease(cidft.get(PdfName.W)));
+ PdfDictionary fontDesc = (PdfDictionary)PdfReader.getPdfObjectRelease(cidft.get(PdfName.FONTDESCRIPTOR));
+ fillFontDesc(fontDesc);
+ fillMetrics(touni, widths, dw);
+ } catch (Exception e) {
+ throw new ExceptionConverter(e);
+ }
+ }
+
+ private IntHashtable readWidths(PdfArray ws) {
+ IntHashtable hh = new IntHashtable();
+ if (ws == null)
+ return hh;
+ ArrayList ar = ws.getArrayList();
+ for (int k = 0; k < ar.size(); ++k) {
+ int c1 = ((PdfNumber)PdfReader.getPdfObjectRelease((PdfObject)ar.get(k))).intValue();
+ PdfObject obj = PdfReader.getPdfObjectRelease((PdfObject)ar.get(++k));
+ if (obj.isArray()) {
+ ArrayList ar2 = ((PdfArray)obj).getArrayList();
+ for (int j = 0; j < ar2.size(); ++j) {
+ int c2 = ((PdfNumber)PdfReader.getPdfObjectRelease((PdfObject)ar2.get(j))).intValue();
+ hh.put(c1++, c2);
+ }
+ }
+ else {
+ int c2 = ((PdfNumber)obj).intValue();
+ int w = ((PdfNumber)PdfReader.getPdfObjectRelease((PdfObject)ar.get(++k))).intValue();
+ for (; c1 <= c2; ++c1)
+ hh.put(c1, w);
+ }
+ }
+ return hh;
+ }
+
+ private String decodeString(PdfString ps) {
+ if (ps.isHexWriting())
+ return PdfEncodings.convertToString(ps.getBytes(), "UnicodeBigUnmarked");
+ else
+ return ps.toUnicodeString();
+ }
+
+ private void fillMetrics(byte[] touni, IntHashtable widths, int dw) {
+ try {
+ PdfContentParser ps = new PdfContentParser(new PRTokeniser(touni));
+ PdfObject ob = null;
+ PdfObject last = null;
+ while ((ob = ps.readPRObject()) != null) {
+ if (ob.type() == PdfContentParser.COMMAND_TYPE) {
+ if (ob.toString().equals("beginbfchar")) {
+ int n = ((PdfNumber)last).intValue();
+ for (int k = 0; k < n; ++k) {
+ String cid = decodeString((PdfString)ps.readPRObject());
+ String uni = decodeString((PdfString)ps.readPRObject());
+ if (uni.length() == 1) {
+ int cidc = (int)cid.charAt(0);
+ int unic = (int)uni.charAt(uni.length() - 1);
+ int w = dw;
+ if (widths.containsKey(cidc))
+ w = widths.get(cidc);
+ metrics.put(new Integer(unic), new int[]{cidc, w});
+ }
+ }
+ }
+ else if (ob.toString().equals("beginbfrange")) {
+ int n = ((PdfNumber)last).intValue();
+ for (int k = 0; k < n; ++k) {
+ String cid1 = decodeString((PdfString)ps.readPRObject());
+ String cid2 = decodeString((PdfString)ps.readPRObject());
+ int cid1c = (int)cid1.charAt(0);
+ int cid2c = (int)cid2.charAt(0);
+ PdfObject ob2 = ps.readPRObject();
+ if (ob2.isString()) {
+ String uni = decodeString((PdfString)ob2);
+ if (uni.length() == 1) {
+ int unic = (int)uni.charAt(uni.length() - 1);
+ for (; cid1c <= cid2c; cid1c++, unic++) {
+ int w = dw;
+ if (widths.containsKey(cid1c))
+ w = widths.get(cid1c);
+ metrics.put(new Integer(unic), new int[]{cid1c, w});
+ }
+ }
+ }
+ else {
+ ArrayList ar = ((PdfArray)ob2).getArrayList();
+ for (int j = 0; j < ar.size(); ++j, ++cid1c) {
+ String uni = decodeString((PdfString)ar.get(j));
+ if (uni.length() == 1) {
+ int unic = (int)uni.charAt(uni.length() - 1);
+ int w = dw;
+ if (widths.containsKey(cid1c))
+ w = widths.get(cid1c);
+ metrics.put(new Integer(unic), new int[]{cid1c, w});
+ }
+ }
+ }
+ }
+ }
+ }
+ else
+ last = ob;
+ }
+ }
+ catch (Exception e) {
+ throw new ExceptionConverter(e);
+ }
+ }
+
+ private void doType1TT() {
+ PdfObject enc = PdfReader.getPdfObject(font.get(PdfName.ENCODING));
+ if (enc == null)
+ fillEncoding(null);
+ else {
+ if (enc.isName())
+ fillEncoding((PdfName)enc);
+ else {
+ PdfDictionary encDic = (PdfDictionary)enc;
+ enc = PdfReader.getPdfObject(encDic.get(PdfName.BASEENCODING));
+ if (enc == null)
+ fillEncoding(null);
+ else
+ fillEncoding((PdfName)enc);
+ PdfArray diffs = (PdfArray)PdfReader.getPdfObject(encDic.get(PdfName.DIFFERENCES));
+ if (diffs != null) {
+ ArrayList dif = diffs.getArrayList();
+ int currentNumber = 0;
+ for (int k = 0; k < dif.size(); ++k) {
+ PdfObject obj = (PdfObject)dif.get(k);
+ if (obj.isNumber())
+ currentNumber = ((PdfNumber)obj).intValue();
+ else {
+ int c[] = GlyphList.nameToUnicode(PdfName.decodeName(((PdfName)obj).toString()));
+ if (c != null && c.length > 0)
+ uni2byte.put(c[0], currentNumber);
+ ++currentNumber;
+ }
+ }
+ }
+ }
+ }
+ PdfArray newWidths = (PdfArray)PdfReader.getPdfObject(font.get(PdfName.WIDTHS));
+ PdfNumber first = (PdfNumber)PdfReader.getPdfObject(font.get(PdfName.FIRSTCHAR));
+ PdfNumber last = (PdfNumber)PdfReader.getPdfObject(font.get(PdfName.LASTCHAR));
+ if (BuiltinFonts14.containsKey(fontName)) {
+ BaseFont bf;
+ try {
+ bf = BaseFont.createFont(fontName, WINANSI, false);
+ }
+ catch (Exception e) {
+ throw new ExceptionConverter(e);
+ }
+ int e[] = uni2byte.toOrderedKeys();
+ for (int k = 0; k < e.length; ++k) {
+ int n = uni2byte.get(e[k]);
+ widths[n] = bf.getRawWidth(n, GlyphList.unicodeToName(e[k]));
+ }
+ Ascender = bf.getFontDescriptor(ASCENT, 1000);
+ CapHeight = bf.getFontDescriptor(CAPHEIGHT, 1000);
+ Descender = bf.getFontDescriptor(DESCENT, 1000);
+ ItalicAngle = bf.getFontDescriptor(ITALICANGLE, 1000);
+ llx = bf.getFontDescriptor(BBOXLLX, 1000);
+ lly = bf.getFontDescriptor(BBOXLLY, 1000);
+ urx = bf.getFontDescriptor(BBOXURX, 1000);
+ ury = bf.getFontDescriptor(BBOXURY, 1000);
+ }
+ if (first != null && last != null && newWidths != null) {
+ int f = first.intValue();
+ ArrayList ar = newWidths.getArrayList();
+ for (int k = 0; k < ar.size(); ++k) {
+ widths[f + k] = ((PdfNumber)ar.get(k)).intValue();
+ }
+ }
+ fillFontDesc((PdfDictionary)PdfReader.getPdfObject(font.get(PdfName.FONTDESCRIPTOR)));
+ }
+
+ private void fillFontDesc(PdfDictionary fontDesc) {
+ if (fontDesc == null)
+ return;
+ PdfNumber v = (PdfNumber)PdfReader.getPdfObject(fontDesc.get(PdfName.ASCENT));
+ if (v != null)
+ Ascender = v.floatValue();
+ v = (PdfNumber)PdfReader.getPdfObject(fontDesc.get(PdfName.CAPHEIGHT));
+ if (v != null)
+ CapHeight = v.floatValue();
+ v = (PdfNumber)PdfReader.getPdfObject(fontDesc.get(PdfName.DESCENT));
+ if (v != null)
+ Descender = v.floatValue();
+ v = (PdfNumber)PdfReader.getPdfObject(fontDesc.get(PdfName.ITALICANGLE));
+ if (v != null)
+ ItalicAngle = v.floatValue();
+ PdfArray bbox = (PdfArray)PdfReader.getPdfObject(fontDesc.get(PdfName.FONTBBOX));
+ if (bbox != null) {
+ ArrayList ar = bbox.getArrayList();
+ llx = ((PdfNumber)ar.get(0)).floatValue();
+ lly = ((PdfNumber)ar.get(1)).floatValue();
+ urx = ((PdfNumber)ar.get(2)).floatValue();
+ ury = ((PdfNumber)ar.get(3)).floatValue();
+ if (llx > urx) {
+ float t = llx;
+ llx = urx;
+ urx = t;
+ }
+ if (lly > ury) {
+ float t = lly;
+ lly = ury;
+ ury = t;
+ }
+ }
+ }
+
+ private void fillEncoding(PdfName encoding) {
+ if (PdfName.MAC_ROMAN_ENCODING.equals(encoding) || PdfName.WIN_ANSI_ENCODING.equals(encoding)) {
+ byte b[] = new byte[256];
+ for (int k = 0; k < 256; ++k)
+ b[k] = (byte)k;
+ String enc = WINANSI;
+ if (PdfName.MAC_ROMAN_ENCODING.equals(encoding))
+ enc = MACROMAN;
+ String cv = PdfEncodings.convertToString(b, enc);
+ char arr[] = cv.toCharArray();
+ for (int k = 0; k < 256; ++k)
+ uni2byte.put(arr[k], k);
+ }
+ else {
+ for (int k = 0; k < 256; ++k)
+ uni2byte.put(stdEnc[k], k);
+ }
+ }
+
+ /** Gets the family name of the font. If it is a True Type font
+ * each array element will have {Platform ID, Platform Encoding ID,
+ * Language ID, font name}. The interpretation of this values can be
+ * found in the Open Type specification, chapter 2, in the 'name' table.<br>
+ * For the other fonts the array has a single element with {"", "", "",
+ * font name}.
+ * @return the family name of the font
+ *
+ */
+ public String[][] getFamilyFontName() {
+ return null;
+ }
+
+ /** Gets the font parameter identified by <CODE>key</CODE>. Valid values
+ * for <CODE>key</CODE> are <CODE>ASCENT</CODE>, <CODE>CAPHEIGHT</CODE>, <CODE>DESCENT</CODE>,
+ * <CODE>ITALICANGLE</CODE>, <CODE>BBOXLLX</CODE>, <CODE>BBOXLLY</CODE>, <CODE>BBOXURX</CODE>
+ * and <CODE>BBOXURY</CODE>.
+ * @param key the parameter to be extracted
+ * @param fontSize the font size in points
+ * @return the parameter in points
+ *
+ */
+ public float getFontDescriptor(int key, float fontSize) {
+ if (cjkMirror != null)
+ return cjkMirror.getFontDescriptor(key, fontSize);
+ switch (key) {
+ case AWT_ASCENT:
+ case ASCENT:
+ return Ascender * fontSize / 1000;
+ case CAPHEIGHT:
+ return CapHeight * fontSize / 1000;
+ case AWT_DESCENT:
+ case DESCENT:
+ return Descender * fontSize / 1000;
+ case ITALICANGLE:
+ return ItalicAngle;
+ case BBOXLLX:
+ return llx * fontSize / 1000;
+ case BBOXLLY:
+ return lly * fontSize / 1000;
+ case BBOXURX:
+ return urx * fontSize / 1000;
+ case BBOXURY:
+ return ury * fontSize / 1000;
+ case AWT_LEADING:
+ return 0;
+ case AWT_MAXADVANCE:
+ return (urx - llx) * fontSize / 1000;
+ }
+ return 0;
+ }
+
+ /** Gets the full name of the font. If it is a True Type font
+ * each array element will have {Platform ID, Platform Encoding ID,
+ * Language ID, font name}. The interpretation of this values can be
+ * found in the Open Type specification, chapter 2, in the 'name' table.<br>
+ * For the other fonts the array has a single element with {"", "", "",
+ * font name}.
+ * @return the full name of the font
+ *
+ */
+ public String[][] getFullFontName() {
+ return null;
+ }
+
+ /** Gets the kerning between two Unicode chars.
+ * @param char1 the first char
+ * @param char2 the second char
+ * @return the kerning to be applied
+ *
+ */
+ public int getKerning(char char1, char char2) {
+ return 0;
+ }
+
+ /** Gets the postscript font name.
+ * @return the postscript font name
+ *
+ */
+ public String getPostscriptFontName() {
+ return fontName;
+ }
+
+ /** Gets the width from the font according to the Unicode char <CODE>c</CODE>
+ * or the <CODE>name</CODE>. If the <CODE>name</CODE> is null it's a symbolic font.
+ * @param c the unicode char
+ * @param name the glyph name
+ * @return the width of the char
+ *
+ */
+ int getRawWidth(int c, String name) {
+ return 0;
+ }
+
+ /** Checks if the font has any kerning pairs.
+ * @return <CODE>true</CODE> if the font has any kerning pairs
+ *
+ */
+ public boolean hasKernPairs() {
+ return false;
+ }
+
+ /** Outputs to the writer the font dictionaries and streams.
+ * @param writer the writer for this document
+ * @param ref the font indirect reference
+ * @param params several parameters that depend on the font type
+ * @throws IOException on error
+ * @throws DocumentException error in generating the object
+ *
+ */
+ void writeFont(PdfWriter writer, PdfIndirectReference ref, Object[] params) throws DocumentException, IOException {
+ }
+
+ public int getWidth(String text) {
+ if (cjkMirror != null)
+ return cjkMirror.getWidth(text);
+ else if (isType0) {
+ char[] chars = text.toCharArray();
+ int len = chars.length;
+ int total = 0;
+ for (int k = 0; k < len; ++k) {
+ int[] ws = (int[])metrics.get(new Integer((int)chars[k]));
+ if (ws != null)
+ total += ws[1];
+ }
+ return total;
+ }
+ else
+ return super.getWidth(text);
+ }
+
+ byte[] convertToBytes(String text) {
+ if (cjkMirror != null)
+ return PdfEncodings.convertToBytes(text, CJKFont.CJK_ENCODING);
+ else if (isType0) {
+ char[] chars = text.toCharArray();
+ int len = chars.length;
+ byte[] b = new byte[len * 2];
+ int bptr = 0;
+ for (int k = 0; k < len; ++k) {
+ int[] ws = (int[])metrics.get(new Integer((int)chars[k]));
+ if (ws != null) {
+ int g = ws[0];
+ b[bptr++] = (byte)(g / 256);
+ b[bptr++] = (byte)(g);
+ }
+ }
+ if (bptr == b.length)
+ return b;
+ else {
+ byte[] nb = new byte[bptr];
+ System.arraycopy(b, 0, nb, 0, bptr);
+ return nb;
+ }
+ }
+ else {
+ char cc[] = text.toCharArray();
+ byte b[] = new byte[cc.length];
+ int ptr = 0;
+ for (int k = 0; k < cc.length; ++k) {
+ if (uni2byte.containsKey(cc[k]))
+ b[ptr++] = (byte)uni2byte.get(cc[k]);
+ }
+ if (ptr == b.length)
+ return b;
+ else {
+ byte[] b2 = new byte[ptr];
+ System.arraycopy(b, 0, b2, 0, ptr);
+ return b2;
+ }
+ }
+ }
+
+ PdfIndirectReference getIndirectReference() {
+ return refFont;
+ }
+
+ public boolean charExists(char c) {
+ if (cjkMirror != null)
+ return cjkMirror.charExists(c);
+ else if (isType0) {
+ return metrics.containsKey(new Integer((int)c));
+ }
+ else
+ return super.charExists(c);
+ }
+
+ /**
+ * Sets the font name that will appear in the pdf font dictionary.
+ * It does nothing in this case as the font is already in the document.
+ * @param name the new font name
+ */
+ public void setPostscriptFontName(String name) {
+ }
+
+ public boolean setKerning(char char1, char char2, int kern) {
+ return false;
+ }
+
+ public int[] getCharBBox(char c) {
+ return null;
+ }
+
+ protected int[] getRawCharBBox(int c, String name) {
+ return null;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/pdf/EnumerateTTC.java b/src/main/java/com/lowagie/text/pdf/EnumerateTTC.java
new file mode 100644
index 0000000..d4110a3
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/EnumerateTTC.java
@@ -0,0 +1,118 @@
+/*
+ * $Id: EnumerateTTC.java,v 1.45 2005/05/04 14:31:46 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2001, 2002 by Paulo Soares.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf;
+
+import java.io.*;
+import java.util.HashMap;
+import com.lowagie.text.DocumentException;
+/** Enumerates all the fonts inside a True Type Collection.
+ *
+ * @author Paulo Soares (psoares@consiste.pt)
+ */
+class EnumerateTTC extends TrueTypeFont{
+
+ protected String[] names;
+
+ EnumerateTTC(String ttcFile) throws DocumentException, IOException {
+ fileName = ttcFile;
+ rf = new RandomAccessFileOrArray(ttcFile);
+ findNames();
+ }
+
+ EnumerateTTC(byte ttcArray[]) throws DocumentException, IOException {
+ fileName = "Byte array TTC";
+ rf = new RandomAccessFileOrArray(ttcArray);
+ findNames();
+ }
+
+ void findNames() throws DocumentException, IOException {
+ tables = new HashMap();
+
+ try {
+ String mainTag = readStandardString(4);
+ if (!mainTag.equals("ttcf"))
+ throw new DocumentException(fileName + " is not a valid TTC file.");
+ rf.skipBytes(4);
+ int dirCount = rf.readInt();
+ names = new String[dirCount];
+ int dirPos = rf.getFilePointer();
+ for (int dirIdx = 0; dirIdx < dirCount; ++dirIdx) {
+ tables.clear();
+ rf.seek(dirPos);
+ rf.skipBytes(dirIdx * 4);
+ directoryOffset = rf.readInt();
+ rf.seek(directoryOffset);
+ if (rf.readInt() != 0x00010000)
+ throw new DocumentException(fileName + " is not a valid TTF file.");
+ int num_tables = rf.readUnsignedShort();
+ rf.skipBytes(6);
+ for (int k = 0; k < num_tables; ++k) {
+ String tag = readStandardString(4);
+ rf.skipBytes(4);
+ int table_location[] = new int[2];
+ table_location[0] = rf.readInt();
+ table_location[1] = rf.readInt();
+ tables.put(tag, table_location);
+ }
+ names[dirIdx] = getBaseFont();
+ }
+ }
+ finally {
+ if (rf != null)
+ rf.close();
+ }
+ }
+
+ String[] getNames() {
+ return names;
+ }
+
+}
diff --git a/src/main/java/com/lowagie/text/pdf/ExtendedColor.java b/src/main/java/com/lowagie/text/pdf/ExtendedColor.java
new file mode 100644
index 0000000..c0dfc66
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/ExtendedColor.java
@@ -0,0 +1,122 @@
+/*
+ * $Id: ExtendedColor.java,v 1.43 2005/03/29 14:08:15 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2001, 2002 by Paulo Soares.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf;
+
+import java.awt.Color;
+/**
+ *
+ * @author Paulo Soares (psoares@consiste.pt)
+ */
+public class ExtendedColor extends Color{
+
+ /** a type of extended color. */
+ public static final int TYPE_RGB = 0;
+ /** a type of extended color. */
+ public static final int TYPE_GRAY = 1;
+ /** a type of extended color. */
+ public static final int TYPE_CMYK = 2;
+ /** a type of extended color. */
+ public static final int TYPE_SEPARATION = 3;
+ /** a type of extended color. */
+ public static final int TYPE_PATTERN = 4;
+ /** a type of extended color. */
+ public static final int TYPE_SHADING = 5;
+
+ protected int type;
+
+ /**
+ * Constructs an extended color of a certain type.
+ * @param type
+ */
+ public ExtendedColor(int type) {
+ super(0, 0, 0);
+ this.type = type;
+ }
+
+ /**
+ * Constructs an extended color of a certain type and a certain color.
+ * @param type
+ * @param red
+ * @param green
+ * @param blue
+ */
+ public ExtendedColor(int type, float red, float green, float blue) {
+ super(normalize(red), normalize(green), normalize(blue));
+ this.type = type;
+ }
+
+ /**
+ * Gets the type of this color.
+ * @return one of the types (see constants)
+ */
+ public int getType() {
+ return type;
+ }
+
+ /**
+ * Gets the type of a given color.
+ * @param color
+ * @return one of the types (see constants)
+ */
+ public static int getType(Color color) {
+ if (color instanceof ExtendedColor)
+ return ((ExtendedColor)color).getType();
+ return TYPE_RGB;
+ }
+
+ static final float normalize(float value) {
+ if (value < 0)
+ return 0;
+ if (value > 1)
+ return 1;
+ return value;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/pdf/ExtraEncoding.java b/src/main/java/com/lowagie/text/pdf/ExtraEncoding.java
new file mode 100644
index 0000000..5862022
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/ExtraEncoding.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright 2003 Paulo Soares
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf;
+
+/**
+ * Classes implementing this interface can create custom encodings or
+ * replace existing ones. It is used in the context of <code>PdfEncoding</code>.
+ * @author Paulo Soares (psoares@consiste.pt)
+ */
+public interface ExtraEncoding {
+
+ /**
+ * Converts an Unicode string to a byte array according to some encoding.
+ * @param text the Unicode string
+ * @param encoding the requested encoding. It's mainly of use if the same class
+ * supports more than one encoding.
+ * @return the conversion or <CODE>null</CODE> if no conversion is supported
+ */
+ public byte[] charToByte(String text, String encoding);
+
+ /**
+ * Converts a byte array to an Unicode string according to some encoding.
+ * @param b the input byte array
+ * @param encoding the requested encoding. It's mainly of use if the same class
+ * supports more than one encoding.
+ * @return the conversion or <CODE>null</CODE> if no conversion is supported
+ */
+ public String byteToChar(byte b[], String encoding);
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/pdf/FdfReader.java b/src/main/java/com/lowagie/text/pdf/FdfReader.java
new file mode 100644
index 0000000..7a846fe
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/FdfReader.java
@@ -0,0 +1,214 @@
+/*
+ * Copyright 2003 by Paulo Soares.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+package com.lowagie.text.pdf;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.HashMap;
+import java.util.ArrayList;
+import java.net.URL;
+/** Reads an FDF form and makes the fields available
+ * @author Paulo Soares (psoares@consiste.pt)
+ */
+public class FdfReader extends PdfReader {
+
+ HashMap fields;
+ String fileSpec;
+ PdfName encoding;
+
+ /** Reads an FDF form.
+ * @param filename the file name of the form
+ * @throws IOException on error
+ */
+ public FdfReader(String filename) throws IOException {
+ super(filename);
+ }
+
+ /** Reads an FDF form.
+ * @param pdfIn the byte array with the form
+ * @throws IOException on error
+ */
+ public FdfReader(byte pdfIn[]) throws IOException {
+ super(pdfIn);
+ }
+
+ /** Reads an FDF form.
+ * @param url the URL of the document
+ * @throws IOException on error
+ */
+ public FdfReader(URL url) throws IOException {
+ super(url);
+ }
+
+ /** Reads an FDF form.
+ * @param is the <CODE>InputStream</CODE> containing the document. The stream is read to the
+ * end but is not closed
+ * @throws IOException on error
+ */
+ public FdfReader(InputStream is) throws IOException {
+ super(is);
+ }
+
+ protected void readPdf() throws IOException {
+ fields = new HashMap();
+ try {
+ tokens.checkFdfHeader();
+ rebuildXref();
+ readDocObj();
+ }
+ finally {
+ try {
+ tokens.close();
+ }
+ catch (Exception e) {
+ // empty on purpose
+ }
+ }
+ readFields();
+ }
+
+ protected void kidNode(PdfDictionary merged, String name) {
+ PdfArray kids = (PdfArray)getPdfObject(merged.get(PdfName.KIDS));
+ if (kids == null || kids.getArrayList().size() == 0) {
+ if (name.length() > 0)
+ name = name.substring(1);
+ fields.put(name, merged);
+ }
+ else {
+ merged.remove(PdfName.KIDS);
+ ArrayList ar = kids.getArrayList();
+ for (int k = 0; k < ar.size(); ++k) {
+ PdfDictionary dic = new PdfDictionary();
+ dic.merge(merged);
+ PdfDictionary newDic = (PdfDictionary)getPdfObject((PdfObject)ar.get(k));
+ PdfString t = (PdfString)getPdfObject(newDic.get(PdfName.T));
+ String newName = name;
+ if (t != null)
+ newName += "." + t.toUnicodeString();
+ dic.merge(newDic);
+ dic.remove(PdfName.T);
+ kidNode(dic, newName);
+ }
+ }
+ }
+
+ protected void readFields() throws IOException {
+ catalog = (PdfDictionary)getPdfObject(trailer.get(PdfName.ROOT));
+ PdfDictionary fdf = (PdfDictionary)getPdfObject(catalog.get(PdfName.FDF));
+ PdfString fs = (PdfString)getPdfObject(fdf.get(PdfName.F));
+ if (fs != null)
+ fileSpec = fs.toUnicodeString();
+ PdfArray fld = (PdfArray)getPdfObject(fdf.get(PdfName.FIELDS));
+ if (fld == null)
+ return;
+ encoding = (PdfName)getPdfObject(fdf.get(PdfName.ENCODING));
+ PdfDictionary merged = new PdfDictionary();
+ merged.put(PdfName.KIDS, fld);
+ kidNode(merged, "");
+ }
+
+ /** Gets all the fields. The map is keyed by the fully qualified
+ * field name and the value is a merged <CODE>PdfDictionary</CODE>
+ * with the field content.
+ * @return all the fields
+ */
+ public HashMap getFields() {
+ return fields;
+ }
+
+ /** Gets the field dictionary.
+ * @param name the fully qualified field name
+ * @return the field dictionary
+ */
+ public PdfDictionary getField(String name) {
+ return (PdfDictionary)fields.get(name);
+ }
+
+ /** Gets the field value or <CODE>null</CODE> if the field does not
+ * exist or has no value defined.
+ * @param name the fully qualified field name
+ * @return the field value or <CODE>null</CODE>
+ */
+ public String getFieldValue(String name) {
+ PdfDictionary field = (PdfDictionary)fields.get(name);
+ if (field == null)
+ return null;
+ PdfObject v = getPdfObject(field.get(PdfName.V));
+ if (v == null)
+ return null;
+ if (v.isName())
+ return PdfName.decodeName(((PdfName)v).toString());
+ else if (v.isString()) {
+ PdfString vs = (PdfString)v;
+ if (encoding == null || vs.getEncoding() != null)
+ return vs.toUnicodeString();
+ byte b[] = vs.getBytes();
+ if (b.length >= 2 && b[0] == (byte)254 && b[1] == (byte)255)
+ return vs.toUnicodeString();
+ try {
+ if (encoding.equals(PdfName.SHIFT_JIS))
+ return new String(b, "SJIS");
+ else if (encoding.equals(PdfName.UHC))
+ return new String(b, "MS949");
+ else if (encoding.equals(PdfName.GBK))
+ return new String(b, "GBK");
+ else if (encoding.equals(PdfName.BIGFIVE))
+ return new String(b, "Big5");
+ }
+ catch (Exception e) {
+ }
+ return vs.toUnicodeString();
+ }
+ return null;
+ }
+
+ /** Gets the PDF file specification contained in the FDF.
+ * @return the PDF file specification contained in the FDF
+ */
+ public String getFileSpec() {
+ return fileSpec;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/pdf/FdfWriter.java b/src/main/java/com/lowagie/text/pdf/FdfWriter.java
new file mode 100644
index 0000000..1174e8f
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/FdfWriter.java
@@ -0,0 +1,333 @@
+/*
+ * Copyright 2003 by Paulo Soares.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+package com.lowagie.text.pdf;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Iterator;
+import java.util.StringTokenizer;
+
+import com.lowagie.text.DocWriter;
+import com.lowagie.text.DocumentException;
+
+/** Writes an FDF form.
+ * @author Paulo Soares (psoares@consiste.pt)
+ */
+public class FdfWriter {
+ static byte[] HEADER_FDF = DocWriter.getISOBytes("%FDF-1.2\n%\u00e2\u00e3\u00cf\u00d3\n");
+ HashMap fields = new HashMap();
+
+ /** The PDF file associated with the FDF. */
+ private String file;
+
+ /** Creates a new FdfWriter. */
+ public FdfWriter() {
+ }
+
+ /** Writes the content to a stream.
+ * @param os the stream
+ * @throws DocumentException on error
+ * @throws IOException on error
+ */
+ public void writeTo(OutputStream os) throws DocumentException, IOException {
+ Wrt wrt = new Wrt(os, this);
+ wrt.writeTo();
+ }
+
+ boolean setField(String field, PdfObject value) {
+ HashMap map = fields;
+ StringTokenizer tk = new StringTokenizer(field, ".");
+ if (!tk.hasMoreTokens())
+ return false;
+ while (true) {
+ String s = tk.nextToken();
+ Object obj = map.get(s);
+ if (tk.hasMoreTokens()) {
+ if (obj == null) {
+ obj = new HashMap();
+ map.put(s, obj);
+ map = (HashMap)obj;
+ continue;
+ }
+ else if (obj instanceof HashMap)
+ map = (HashMap)obj;
+ else
+ return false;
+ }
+ else {
+ if (obj == null || !(obj instanceof HashMap)) {
+ map.put(s, value);
+ return true;
+ }
+ else
+ return false;
+ }
+ }
+ }
+
+ void iterateFields(HashMap values, HashMap map, String name) {
+ for (Iterator it = map.keySet().iterator(); it.hasNext();) {
+ String s = (String)it.next();
+ Object obj = map.get(s);
+ if (obj instanceof HashMap)
+ iterateFields(values, (HashMap)obj, name + "." + s);
+ else
+ values.put((name + "." + s).substring(1), obj);
+ }
+ }
+
+ /** Removes the field value.
+ * @param field the field name
+ * @return <CODE>true</CODE> if the field was found and removed,
+ * <CODE>false</CODE> otherwise
+ */
+ public boolean removeField(String field) {
+ HashMap map = fields;
+ StringTokenizer tk = new StringTokenizer(field, ".");
+ if (!tk.hasMoreTokens())
+ return false;
+ ArrayList hist = new ArrayList();
+ while (true) {
+ String s = tk.nextToken();
+ Object obj = map.get(s);
+ if (obj == null)
+ return false;
+ hist.add(map);
+ hist.add(s);
+ if (tk.hasMoreTokens()) {
+ if (obj instanceof HashMap)
+ map = (HashMap)obj;
+ else
+ return false;
+ }
+ else {
+ if (obj instanceof HashMap)
+ return false;
+ else
+ break;
+ }
+ }
+ for (int k = hist.size() - 2; k >= 0; k -= 2) {
+ map = (HashMap)hist.get(k);
+ String s = (String)hist.get(k + 1);
+ map.remove(s);
+ if (map.size() > 0)
+ break;
+ }
+ return true;
+ }
+
+ /** Gets all the fields. The map is keyed by the fully qualified
+ * field name and the values are <CODE>PdfObject</CODE>.
+ * @return a map with all the fields
+ */
+ public HashMap getFields() {
+ HashMap values = new HashMap();
+ iterateFields(values, fields, "");
+ return values;
+ }
+
+ /** Gets the field value.
+ * @param field the field name
+ * @return the field value or <CODE>null</CODE> if not found
+ */
+ public String getField(String field) {
+ HashMap map = fields;
+ StringTokenizer tk = new StringTokenizer(field, ".");
+ if (!tk.hasMoreTokens())
+ return null;
+ while (true) {
+ String s = tk.nextToken();
+ Object obj = map.get(s);
+ if (obj == null)
+ return null;
+ if (tk.hasMoreTokens()) {
+ if (obj instanceof HashMap)
+ map = (HashMap)obj;
+ else
+ return null;
+ }
+ else {
+ if (obj instanceof HashMap)
+ return null;
+ else {
+ if (((PdfObject)obj).isString())
+ return ((PdfString)obj).toUnicodeString();
+ else
+ return PdfName.decodeName(obj.toString());
+ }
+ }
+ }
+ }
+
+ /** Sets the field value as a name.
+ * @param field the fully qualified field name
+ * @param value the value
+ * @return <CODE>true</CODE> if the value was inserted,
+ * <CODE>false</CODE> if the name is incompatible with
+ * an existing field
+ */
+ public boolean setFieldAsName(String field, String value) {
+ return setField(field, new PdfName(value));
+ }
+
+ /** Sets the field value as a string.
+ * @param field the fully qualified field name
+ * @param value the value
+ * @return <CODE>true</CODE> if the value was inserted,
+ * <CODE>false</CODE> if the name is incompatible with
+ * an existing field
+ */
+ public boolean setFieldAsString(String field, String value) {
+ return setField(field, new PdfString(value, PdfObject.TEXT_UNICODE));
+ }
+
+ /** Sets all the fields from this <CODE>FdfReader</CODE>
+ * @param fdf the <CODE>FdfReader</CODE>
+ */
+ public void setFields(FdfReader fdf) {
+ HashMap map = fdf.getFields();
+ for (Iterator it = map.keySet().iterator(); it.hasNext();) {
+ String key = (String)it.next();
+ PdfDictionary dic = (PdfDictionary)map.get(key);
+ PdfObject v = dic.get(PdfName.V);
+ if (v != null) {
+ setField(key, v);
+ }
+ }
+ }
+
+ /** Sets all the fields from this <CODE>PdfReader</CODE>
+ * @param pdf the <CODE>PdfReader</CODE>
+ */
+ public void setFields(PdfReader pdf) {
+ setFields(pdf.getAcroFields());
+ }
+
+ /** Sets all the fields from this <CODE>AcroFields</CODE>
+ * @param af the <CODE>AcroFields</CODE>
+ */
+ public void setFields(AcroFields af) {
+ for (Iterator it = af.getFields().entrySet().iterator(); it.hasNext();) {
+ Map.Entry entry = (Map.Entry)it.next();
+ String fn = (String)entry.getKey();
+ AcroFields.Item item = (AcroFields.Item)entry.getValue();
+ PdfDictionary dic = (PdfDictionary)item.merged.get(0);
+ PdfObject v = PdfReader.getPdfObjectRelease(dic.get(PdfName.V));
+ if (v == null)
+ continue;
+ PdfObject ft = PdfReader.getPdfObjectRelease(dic.get(PdfName.FT));
+ if (ft == null || PdfName.SIG.equals(ft))
+ continue;
+ setField(fn, v);
+ }
+ }
+
+ /** Gets the PDF file name associated with the FDF.
+ * @return the PDF file name associated with the FDF
+ */
+ public String getFile() {
+ return this.file;
+ }
+
+ /** Sets the PDF file name associated with the FDF.
+ * @param file the PDF file name associated with the FDF
+ *
+ */
+ public void setFile(String file) {
+ this.file = file;
+ }
+
+ static class Wrt extends PdfWriter {
+ private FdfWriter fdf;
+
+ Wrt(OutputStream os, FdfWriter fdf) throws DocumentException, IOException {
+ super(new PdfDocument(), os);
+ this.fdf = fdf;
+ this.os.write(HEADER_FDF);
+ body = new PdfBody(this);
+ }
+
+ void writeTo() throws DocumentException, IOException {
+ PdfDictionary dic = new PdfDictionary();
+ dic.put(PdfName.FIELDS, calculate(fdf.fields));
+ if (fdf.file != null)
+ dic.put(PdfName.F, new PdfString(fdf.file, PdfObject.TEXT_UNICODE));
+ PdfDictionary fd = new PdfDictionary();
+ fd.put(PdfName.FDF, dic);
+ PdfIndirectReference ref = addToBody(fd).getIndirectReference();
+ os.write(getISOBytes("trailer\n"));
+ PdfDictionary trailer = new PdfDictionary();
+ trailer.put(PdfName.ROOT, ref);
+ trailer.toPdf(null, os);
+ os.write(getISOBytes("\n%%EOF\n"));
+ os.close();
+ }
+
+
+ PdfArray calculate(HashMap map) throws IOException {
+ PdfArray ar = new PdfArray();
+ for (Iterator it = map.keySet().iterator(); it.hasNext();) {
+ String key = (String)it.next();
+ Object v = map.get(key);
+ PdfDictionary dic = new PdfDictionary();
+ dic.put(PdfName.T, new PdfString(key, PdfObject.TEXT_UNICODE));
+ if (v instanceof HashMap) {
+ dic.put(PdfName.KIDS, calculate((HashMap)v));
+ }
+ else {
+ dic.put(PdfName.V, (PdfObject)v);
+ }
+ ar.add(dic);
+ }
+ return ar;
+ }
+ }
+}
diff --git a/src/main/java/com/lowagie/text/pdf/FontDetails.java b/src/main/java/com/lowagie/text/pdf/FontDetails.java
new file mode 100644
index 0000000..6aa72e4
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/FontDetails.java
@@ -0,0 +1,275 @@
+/*
+ * $Id: FontDetails.java,v 1.46 2006/02/23 16:45:49 psoares33 Exp $
+ * $Name: $
+ *
+ * Copyright 2001, 2002 by Paulo Soares.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf;
+
+import com.lowagie.text.ExceptionConverter;
+import java.util.HashMap;
+import java.io.UnsupportedEncodingException;
+/** Each font in the document will have an instance of this class
+ * where the characters used will be represented.
+ *
+ * @author Paulo Soares (psoares@consiste.pt)
+ */
+class FontDetails {
+
+ /** The indirect reference to this font
+ */
+ PdfIndirectReference indirectReference;
+ /** The font name that appears in the document body stream
+ */
+ PdfName fontName;
+ /** The font
+ */
+ BaseFont baseFont;
+ /** The font if its an instance of <CODE>TrueTypeFontUnicode</CODE>
+ */
+ TrueTypeFontUnicode ttu;
+
+ CJKFont cjkFont;
+ /** The array used with single byte encodings
+ */
+ byte shortTag[];
+ /** The map used with double byte encodings. The key is Integer(glyph) and the
+ * value is int[]{glyph, width, Unicode code}
+ */
+ HashMap longTag;
+
+ IntHashtable cjkTag;
+ /** The font type
+ */
+ int fontType;
+ /** <CODE>true</CODE> if the font is symbolic
+ */
+ boolean symbolic;
+ /** Indicates if all the glyphs and widths for that particular
+ * encoding should be included in the document.
+ */
+ protected boolean subset = true;
+ /** Each font used in a document has an instance of this class.
+ * This class stores the characters used in the document and other
+ * specifics unique to the current working document.
+ * @param fontName the font name
+ * @param indirectReference the indirect reference to the font
+ * @param baseFont the <CODE>BaseFont</CODE>
+ */
+ FontDetails(PdfName fontName, PdfIndirectReference indirectReference, BaseFont baseFont) {
+ this.fontName = fontName;
+ this.indirectReference = indirectReference;
+ this.baseFont = baseFont;
+ fontType = baseFont.getFontType();
+ switch (fontType) {
+ case BaseFont.FONT_TYPE_T1:
+ case BaseFont.FONT_TYPE_TT:
+ shortTag = new byte[256];
+ break;
+ case BaseFont.FONT_TYPE_CJK:
+ cjkTag = new IntHashtable();
+ cjkFont = (CJKFont)baseFont;
+ break;
+ case BaseFont.FONT_TYPE_TTUNI:
+ longTag = new HashMap();
+ ttu = (TrueTypeFontUnicode)baseFont;
+ symbolic = baseFont.isFontSpecific();
+ break;
+ }
+ }
+
+ /** Gets the indirect reference to this font.
+ * @return the indirect reference to this font
+ */
+ PdfIndirectReference getIndirectReference() {
+ return indirectReference;
+ }
+
+ /** Gets the font name as it appears in the document body.
+ * @return the font name
+ */
+ PdfName getFontName() {
+ return fontName;
+ }
+
+ /** Gets the <CODE>BaseFont</CODE> of this font.
+ * @return the <CODE>BaseFont</CODE> of this font
+ */
+ BaseFont getBaseFont() {
+ return baseFont;
+ }
+
+ /** Converts the text into bytes to be placed in the document.
+ * The conversion is done according to the font and the encoding and the characters
+ * used are stored.
+ * @param text the text to convert
+ * @return the conversion
+ */
+ byte[] convertToBytes(String text) {
+ byte b[] = null;
+ switch (fontType) {
+ case BaseFont.FONT_TYPE_T3:
+ return baseFont.convertToBytes(text);
+ case BaseFont.FONT_TYPE_T1:
+ case BaseFont.FONT_TYPE_TT: {
+ b = baseFont.convertToBytes(text);
+ int len = b.length;
+ for (int k = 0; k < len; ++k)
+ shortTag[((int)b[k]) & 0xff] = 1;
+ break;
+ }
+ case BaseFont.FONT_TYPE_CJK: {
+ int len = text.length();
+ for (int k = 0; k < len; ++k)
+ cjkTag.put(cjkFont.getCidCode(text.charAt(k)), 0);
+ b = baseFont.convertToBytes(text);
+ break;
+ }
+ case BaseFont.FONT_TYPE_DOCUMENT: {
+ b = baseFont.convertToBytes(text);
+ break;
+ }
+ case BaseFont.FONT_TYPE_TTUNI: {
+ try {
+ int len = text.length();
+ int metrics[] = null;
+ char glyph[] = new char[len];
+ int i = 0;
+ if (symbolic) {
+ b = PdfEncodings.convertToBytes(text, "symboltt");
+ len = b.length;
+ for (int k = 0; k < len; ++k) {
+ metrics = ttu.getMetricsTT(b[k] & 0xff);
+ if (metrics == null)
+ continue;
+ longTag.put(new Integer(metrics[0]), new int[]{metrics[0], metrics[1], ttu.getUnicodeDifferences(b[k] & 0xff)});
+ glyph[i++] = (char)metrics[0];
+ }
+ }
+ else {
+ for (int k = 0; k < len; ++k) {
+ char c = text.charAt(k);
+ metrics = ttu.getMetricsTT(c);
+ if (metrics == null)
+ continue;
+ int m0 = metrics[0];
+ Integer gl = new Integer(m0);
+ if (!longTag.containsKey(gl))
+ longTag.put(gl, new int[]{m0, metrics[1], c});
+ glyph[i++] = (char)m0;
+ }
+ }
+ String s = new String(glyph, 0, i);
+ b = s.getBytes(CJKFont.CJK_ENCODING);
+ }
+ catch (UnsupportedEncodingException e) {
+ throw new ExceptionConverter(e);
+ }
+ break;
+ }
+ }
+ return b;
+ }
+
+ /** Writes the font definition to the document.
+ * @param writer the <CODE>PdfWriter</CODE> of this document
+ */
+ void writeFont(PdfWriter writer) {
+ try {
+ switch (fontType) {
+ case BaseFont.FONT_TYPE_T3:
+ baseFont.writeFont(writer, indirectReference, null);
+ break;
+ case BaseFont.FONT_TYPE_T1:
+ case BaseFont.FONT_TYPE_TT: {
+ int firstChar;
+ int lastChar;
+ for (firstChar = 0; firstChar < 256; ++firstChar) {
+ if (shortTag[firstChar] != 0)
+ break;
+ }
+ for (lastChar = 255; lastChar >= firstChar; --lastChar) {
+ if (shortTag[lastChar] != 0)
+ break;
+ }
+ if (firstChar > 255) {
+ firstChar = 255;
+ lastChar = 255;
+ }
+ baseFont.writeFont(writer, indirectReference, new Object[]{new Integer(firstChar), new Integer(lastChar), shortTag, new Boolean(subset)});
+ break;
+ }
+ case BaseFont.FONT_TYPE_CJK:
+ baseFont.writeFont(writer, indirectReference, new Object[]{cjkTag});
+ break;
+ case BaseFont.FONT_TYPE_TTUNI:
+ baseFont.writeFont(writer, indirectReference, new Object[]{longTag, new Boolean(subset)});
+ break;
+ }
+ }
+ catch(Exception e) {
+ throw new ExceptionConverter(e);
+ }
+ }
+
+ /** Indicates if all the glyphs and widths for that particular
+ * encoding should be included in the document.
+ * @return <CODE>false</CODE> to include all the glyphs and widths.
+ */
+ public boolean isSubset() {
+ return subset;
+ }
+
+ /** Indicates if all the glyphs and widths for that particular
+ * encoding should be included in the document. Set to <CODE>false</CODE>
+ * to include all.
+ * @param subset new value of property subset
+ */
+ public void setSubset(boolean subset) {
+ this.subset = subset;
+ }
+}
diff --git a/src/main/java/com/lowagie/text/pdf/FontMapper.java b/src/main/java/com/lowagie/text/pdf/FontMapper.java
new file mode 100644
index 0000000..331a3cb
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/FontMapper.java
@@ -0,0 +1,80 @@
+/*
+ * Copyright 2002 by Jeremy Bowman <bowmanjm@attbi.com>.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf;
+
+import java.awt.Font;
+
+/**
+ * A FontMapper implementation handles mappings between AWT Fonts and PDF
+ * fonts. An interface is used instead of a fixed class because there isn't
+ * an exact correlation between the font types, so each application is free
+ * to define a mapping which is appropriate for it.
+ */
+
+public interface FontMapper {
+
+ /**
+ * Returns a BaseFont which can be used to represent the given AWT Font
+ *
+ * @param font the font to be converted
+ * @return a BaseFont which has similar properties to the provided Font
+ */
+
+ public BaseFont awtToPdf(Font font);
+
+ /**
+ * Returns an AWT Font which can be used to represent the given BaseFont
+ *
+ * @param font the font to be converted
+ * @param size the desired point size of the resulting font
+ * @return a Font which has similar properties to the provided BaseFont
+ */
+
+ public Font pdfToAwt(BaseFont font, int size);
+
+}
diff --git a/src/main/java/com/lowagie/text/pdf/FontSelector.java b/src/main/java/com/lowagie/text/pdf/FontSelector.java
new file mode 100644
index 0000000..628150f
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/FontSelector.java
@@ -0,0 +1,124 @@
+/*
+ * Copyright 2003 by Paulo Soares.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+package com.lowagie.text.pdf;
+
+import java.util.ArrayList;
+import com.lowagie.text.*;
+
+/** Selects the appropriate fonts that contain the glyphs needed to
+ * render text correctly. The fonts are checked in order until the
+ * character is found.
+ * <p>
+ * The built in fonts "Symbol" and "ZapfDingbats", if used, have a special encoding
+ * to allow the characters to be referred by Unicode.
+ * @author Paulo Soares (psoares@consiste.pt)
+ */
+public class FontSelector {
+
+ protected ArrayList fonts = new ArrayList();
+
+ /**
+ * Adds a <CODE>Font</CODE> to be searched for valid characters.
+ * @param font the <CODE>Font</CODE>
+ */
+ public void addFont(Font font) {
+ if (font.getBaseFont() != null) {
+ fonts.add(font);
+ return;
+ }
+ BaseFont bf = font.getCalculatedBaseFont(true);
+ Font f2 = new Font(bf, font.size(), font.getCalculatedStyle(), font.color());
+ fonts.add(f2);
+ }
+
+ /**
+ * Process the text so that it will render with a combination of fonts
+ * if needed.
+ * @param text the text
+ * @return a <CODE>Phrase</CODE> with one or more chunks
+ */
+ public Phrase process(String text) {
+ int fsize = fonts.size();
+ if (fsize == 0)
+ throw new IndexOutOfBoundsException("No font is defined.");
+ char cc[] = text.toCharArray();
+ int len = cc.length;
+ StringBuffer sb = new StringBuffer();
+ Font font = null;
+ int lastidx = -1;
+ Phrase ret = new Phrase();
+ for (int k = 0; k < len; ++k) {
+ char c = cc[k];
+ if (c == '\n' || c == '\r') {
+ sb.append(c);
+ continue;
+ }
+ for (int f = 0; f < fsize; ++f) {
+ font = (Font)fonts.get(f);
+ if (font.getBaseFont().charExists(c)) {
+ if (lastidx == f)
+ sb.append(c);
+ else {
+ if (sb.length() > 0 && lastidx != -1) {
+ Chunk ck = new Chunk(sb.toString(), (Font)fonts.get(lastidx));
+ ret.add(ck);
+ sb.setLength(0);
+ }
+ sb.append(c);
+ lastidx = f;
+ }
+ break;
+ }
+ }
+ }
+ if (sb.length() > 0) {
+ Chunk ck = new Chunk(sb.toString(), (Font)fonts.get(lastidx));
+ ret.add(ck);
+ }
+ return ret;
+ }
+}
diff --git a/src/main/java/com/lowagie/text/pdf/GlyphList.java b/src/main/java/com/lowagie/text/pdf/GlyphList.java
new file mode 100644
index 0000000..59a3dc1
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/GlyphList.java
@@ -0,0 +1,2200 @@
+/*
+ * $Id: GlyphList.java,v 1.52 2005/05/04 14:32:31 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2001, 2002 Paulo Soares
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf;
+
+import java.util.HashMap;
+
+public class GlyphList
+{
+ private static HashMap unicode2names = new HashMap();
+ private static HashMap names2unicode = new HashMap();
+
+ private static final int unicode[] =
+ {
+ 0x0041,
+ 0x00C6,
+ 0x01FC,
+ 0xF7E6,
+ 0x00C1,
+ 0xF7E1,
+ 0x0102,
+ 0x00C2,
+ 0xF7E2,
+ 0xF6C9,
+ 0xF7B4,
+ 0x00C4,
+ 0xF7E4,
+ 0x00C0,
+ 0xF7E0,
+ 0x0391,
+ 0x0386,
+ 0x0100,
+ 0x0104,
+ 0x00C5,
+ 0x01FA,
+ 0xF7E5,
+ 0xF761,
+ 0x00C3,
+ 0xF7E3,
+ 0x0042,
+ 0x0392,
+ 0xF6F4,
+ 0xF762,
+ 0x0043,
+ 0x0106,
+ 0xF6CA,
+ 0xF6F5,
+ 0x010C,
+ 0x00C7,
+ 0xF7E7,
+ 0x0108,
+ 0x010A,
+ 0xF7B8,
+ 0x03A7,
+ 0xF6F6,
+ 0xF763,
+ 0x0044,
+ 0x010E,
+ 0x0110,
+ 0x2206,
+ 0x0394,
+ 0xF6CB,
+ 0xF6CC,
+ 0xF6CD,
+ 0xF7A8,
+ 0xF6F7,
+ 0xF764,
+ 0x0045,
+ 0x00C9,
+ 0xF7E9,
+ 0x0114,
+ 0x011A,
+ 0x00CA,
+ 0xF7EA,
+ 0x00CB,
+ 0xF7EB,
+ 0x0116,
+ 0x00C8,
+ 0xF7E8,
+ 0x0112,
+ 0x014A,
+ 0x0118,
+ 0x0395,
+ 0x0388,
+ 0xF765,
+ 0x0397,
+ 0x0389,
+ 0x00D0,
+ 0xF7F0,
+ 0x20AC,
+ 0x0046,
+ 0xF766,
+ 0x0047,
+ 0x0393,
+ 0x011E,
+ 0x01E6,
+ 0x011C,
+ 0x0122,
+ 0x0120,
+ 0xF6CE,
+ 0xF760,
+ 0xF767,
+ 0x0048,
+ 0x25CF,
+ 0x25AA,
+ 0x25AB,
+ 0x25A1,
+ 0x0126,
+ 0x0124,
+ 0xF768,
+ 0xF6CF,
+ 0xF6F8,
+ 0x0049,
+ 0x0132,
+ 0x00CD,
+ 0xF7ED,
+ 0x012C,
+ 0x00CE,
+ 0xF7EE,
+ 0x00CF,
+ 0xF7EF,
+ 0x0130,
+ 0x2111,
+ 0x00CC,
+ 0xF7EC,
+ 0x012A,
+ 0x012E,
+ 0x0399,
+ 0x03AA,
+ 0x038A,
+ 0xF769,
+ 0x0128,
+ 0x004A,
+ 0x0134,
+ 0xF76A,
+ 0x004B,
+ 0x039A,
+ 0x0136,
+ 0xF76B,
+ 0x004C,
+ 0xF6BF,
+ 0x0139,
+ 0x039B,
+ 0x013D,
+ 0x013B,
+ 0x013F,
+ 0x0141,
+ 0xF6F9,
+ 0xF76C,
+ 0x004D,
+ 0xF6D0,
+ 0xF7AF,
+ 0xF76D,
+ 0x039C,
+ 0x004E,
+ 0x0143,
+ 0x0147,
+ 0x0145,
+ 0xF76E,
+ 0x00D1,
+ 0xF7F1,
+ 0x039D,
+ 0x004F,
+ 0x0152,
+ 0xF6FA,
+ 0x00D3,
+ 0xF7F3,
+ 0x014E,
+ 0x00D4,
+ 0xF7F4,
+ 0x00D6,
+ 0xF7F6,
+ 0xF6FB,
+ 0x00D2,
+ 0xF7F2,
+ 0x01A0,
+ 0x0150,
+ 0x014C,
+ 0x2126,
+ 0x03A9,
+ 0x038F,
+ 0x039F,
+ 0x038C,
+ 0x00D8,
+ 0x01FE,
+ 0xF7F8,
+ 0xF76F,
+ 0x00D5,
+ 0xF7F5,
+ 0x0050,
+ 0x03A6,
+ 0x03A0,
+ 0x03A8,
+ 0xF770,
+ 0x0051,
+ 0xF771,
+ 0x0052,
+ 0x0154,
+ 0x0158,
+ 0x0156,
+ 0x211C,
+ 0x03A1,
+ 0xF6FC,
+ 0xF772,
+ 0x0053,
+ 0x250C,
+ 0x2514,
+ 0x2510,
+ 0x2518,
+ 0x253C,
+ 0x252C,
+ 0x2534,
+ 0x251C,
+ 0x2524,
+ 0x2500,
+ 0x2502,
+ 0x2561,
+ 0x2562,
+ 0x2556,
+ 0x2555,
+ 0x2563,
+ 0x2551,
+ 0x2557,
+ 0x255D,
+ 0x255C,
+ 0x255B,
+ 0x255E,
+ 0x255F,
+ 0x255A,
+ 0x2554,
+ 0x2569,
+ 0x2566,
+ 0x2560,
+ 0x2550,
+ 0x256C,
+ 0x2567,
+ 0x2568,
+ 0x2564,
+ 0x2565,
+ 0x2559,
+ 0x2558,
+ 0x2552,
+ 0x2553,
+ 0x256B,
+ 0x256A,
+ 0x015A,
+ 0x0160,
+ 0xF6FD,
+ 0x015E,
+ 0xF6C1,
+ 0x015C,
+ 0x0218,
+ 0x03A3,
+ 0xF773,
+ 0x0054,
+ 0x03A4,
+ 0x0166,
+ 0x0164,
+ 0x0162,
+ 0x021A,
+ 0x0398,
+ 0x00DE,
+ 0xF7FE,
+ 0xF6FE,
+ 0xF774,
+ 0x0055,
+ 0x00DA,
+ 0xF7FA,
+ 0x016C,
+ 0x00DB,
+ 0xF7FB,
+ 0x00DC,
+ 0xF7FC,
+ 0x00D9,
+ 0xF7F9,
+ 0x01AF,
+ 0x0170,
+ 0x016A,
+ 0x0172,
+ 0x03A5,
+ 0x03D2,
+ 0x03AB,
+ 0x038E,
+ 0x016E,
+ 0xF775,
+ 0x0168,
+ 0x0056,
+ 0xF776,
+ 0x0057,
+ 0x1E82,
+ 0x0174,
+ 0x1E84,
+ 0x1E80,
+ 0xF777,
+ 0x0058,
+ 0x039E,
+ 0xF778,
+ 0x0059,
+ 0x00DD,
+ 0xF7FD,
+ 0x0176,
+ 0x0178,
+ 0xF7FF,
+ 0x1EF2,
+ 0xF779,
+ 0x005A,
+ 0x0179,
+ 0x017D,
+ 0xF6FF,
+ 0x017B,
+ 0x0396,
+ 0xF77A,
+ 0x0061,
+ 0x00E1,
+ 0x0103,
+ 0x00E2,
+ 0x00B4,
+ 0x0301,
+ 0x00E4,
+ 0x00E6,
+ 0x01FD,
+ 0x2015,
+ 0x0410,
+ 0x0411,
+ 0x0412,
+ 0x0413,
+ 0x0414,
+ 0x0415,
+ 0x0401,
+ 0x0416,
+ 0x0417,
+ 0x0418,
+ 0x0419,
+ 0x041A,
+ 0x041B,
+ 0x041C,
+ 0x041D,
+ 0x041E,
+ 0x041F,
+ 0x0420,
+ 0x0421,
+ 0x0422,
+ 0x0423,
+ 0x0424,
+ 0x0425,
+ 0x0426,
+ 0x0427,
+ 0x0428,
+ 0x0429,
+ 0x042A,
+ 0x042B,
+ 0x042C,
+ 0x042D,
+ 0x042E,
+ 0x042F,
+ 0x0490,
+ 0x0402,
+ 0x0403,
+ 0x0404,
+ 0x0405,
+ 0x0406,
+ 0x0407,
+ 0x0408,
+ 0x0409,
+ 0x040A,
+ 0x040B,
+ 0x040C,
+ 0x040E,
+ 0xF6C4,
+ 0xF6C5,
+ 0x0430,
+ 0x0431,
+ 0x0432,
+ 0x0433,
+ 0x0434,
+ 0x0435,
+ 0x0451,
+ 0x0436,
+ 0x0437,
+ 0x0438,
+ 0x0439,
+ 0x043A,
+ 0x043B,
+ 0x043C,
+ 0x043D,
+ 0x043E,
+ 0x043F,
+ 0x0440,
+ 0x0441,
+ 0x0442,
+ 0x0443,
+ 0x0444,
+ 0x0445,
+ 0x0446,
+ 0x0447,
+ 0x0448,
+ 0x0449,
+ 0x044A,
+ 0x044B,
+ 0x044C,
+ 0x044D,
+ 0x044E,
+ 0x044F,
+ 0x0491,
+ 0x0452,
+ 0x0453,
+ 0x0454,
+ 0x0455,
+ 0x0456,
+ 0x0457,
+ 0x0458,
+ 0x0459,
+ 0x045A,
+ 0x045B,
+ 0x045C,
+ 0x045E,
+ 0x040F,
+ 0x0462,
+ 0x0472,
+ 0x0474,
+ 0xF6C6,
+ 0x045F,
+ 0x0463,
+ 0x0473,
+ 0x0475,
+ 0xF6C7,
+ 0xF6C8,
+ 0x04D9,
+ 0x200E,
+ 0x200F,
+ 0x200D,
+ 0x066A,
+ 0x060C,
+ 0x0660,
+ 0x0661,
+ 0x0662,
+ 0x0663,
+ 0x0664,
+ 0x0665,
+ 0x0666,
+ 0x0667,
+ 0x0668,
+ 0x0669,
+ 0x061B,
+ 0x061F,
+ 0x0621,
+ 0x0622,
+ 0x0623,
+ 0x0624,
+ 0x0625,
+ 0x0626,
+ 0x0627,
+ 0x0628,
+ 0x0629,
+ 0x062A,
+ 0x062B,
+ 0x062C,
+ 0x062D,
+ 0x062E,
+ 0x062F,
+ 0x0630,
+ 0x0631,
+ 0x0632,
+ 0x0633,
+ 0x0634,
+ 0x0635,
+ 0x0636,
+ 0x0637,
+ 0x0638,
+ 0x0639,
+ 0x063A,
+ 0x0640,
+ 0x0641,
+ 0x0642,
+ 0x0643,
+ 0x0644,
+ 0x0645,
+ 0x0646,
+ 0x0648,
+ 0x0649,
+ 0x064A,
+ 0x064B,
+ 0x064C,
+ 0x064D,
+ 0x064E,
+ 0x064F,
+ 0x0650,
+ 0x0651,
+ 0x0652,
+ 0x0647,
+ 0x06A4,
+ 0x067E,
+ 0x0686,
+ 0x0698,
+ 0x06AF,
+ 0x0679,
+ 0x0688,
+ 0x0691,
+ 0x06BA,
+ 0x06D2,
+ 0x06D5,
+ 0x20AA,
+ 0x05BE,
+ 0x05C3,
+ 0x05D0,
+ 0x05D1,
+ 0x05D2,
+ 0x05D3,
+ 0x05D4,
+ 0x05D5,
+ 0x05D6,
+ 0x05D7,
+ 0x05D8,
+ 0x05D9,
+ 0x05DA,
+ 0x05DB,
+ 0x05DC,
+ 0x05DD,
+ 0x05DE,
+ 0x05DF,
+ 0x05E0,
+ 0x05E1,
+ 0x05E2,
+ 0x05E3,
+ 0x05E4,
+ 0x05E5,
+ 0x05E6,
+ 0x05E7,
+ 0x05E8,
+ 0x05E9,
+ 0x05EA,
+ 0xFB2A,
+ 0xFB2B,
+ 0xFB4B,
+ 0xFB1F,
+ 0x05F0,
+ 0x05F1,
+ 0x05F2,
+ 0xFB35,
+ 0x05B4,
+ 0x05B5,
+ 0x05B6,
+ 0x05BB,
+ 0x05B8,
+ 0x05B7,
+ 0x05B0,
+ 0x05B2,
+ 0x05B1,
+ 0x05B3,
+ 0x05C2,
+ 0x05C1,
+ 0x05B9,
+ 0x05BC,
+ 0x05BD,
+ 0x05BF,
+ 0x05C0,
+ 0x02BC,
+ 0x2105,
+ 0x2113,
+ 0x2116,
+ 0x202C,
+ 0x202D,
+ 0x202E,
+ 0x200C,
+ 0x066D,
+ 0x02BD,
+ 0x00E0,
+ 0x2135,
+ 0x03B1,
+ 0x03AC,
+ 0x0101,
+ 0x0026,
+ 0xF726,
+ 0x2220,
+ 0x2329,
+ 0x232A,
+ 0x0387,
+ 0x0105,
+ 0x2248,
+ 0x00E5,
+ 0x01FB,
+ 0x2194,
+ 0x21D4,
+ 0x21D3,
+ 0x21D0,
+ 0x21D2,
+ 0x21D1,
+ 0x2193,
+ 0xF8E7,
+ 0x2190,
+ 0x2192,
+ 0x2191,
+ 0x2195,
+ 0x21A8,
+ 0xF8E6,
+ 0x005E,
+ 0x007E,
+ 0x002A,
+ 0x2217,
+ 0xF6E9,
+ 0x0040,
+ 0x00E3,
+ 0x0062,
+ 0x005C,
+ 0x007C,
+ 0x03B2,
+ 0x2588,
+ 0xF8F4,
+ 0x007B,
+ 0xF8F3,
+ 0xF8F2,
+ 0xF8F1,
+ 0x007D,
+ 0xF8FE,
+ 0xF8FD,
+ 0xF8FC,
+ 0x005B,
+ 0xF8F0,
+ 0xF8EF,
+ 0xF8EE,
+ 0x005D,
+ 0xF8FB,
+ 0xF8FA,
+ 0xF8F9,
+ 0x02D8,
+ 0x00A6,
+ 0xF6EA,
+ 0x2022,
+ 0x0063,
+ 0x0107,
+ 0x02C7,
+ 0x21B5,
+ 0x010D,
+ 0x00E7,
+ 0x0109,
+ 0x010B,
+ 0x00B8,
+ 0x00A2,
+ 0xF6DF,
+ 0xF7A2,
+ 0xF6E0,
+ 0x03C7,
+ 0x25CB,
+ 0x2297,
+ 0x2295,
+ 0x02C6,
+ 0x2663,
+ 0x003A,
+ 0x20A1,
+ 0x002C,
+ 0xF6C3,
+ 0xF6E1,
+ 0xF6E2,
+ 0x2245,
+ 0x00A9,
+ 0xF8E9,
+ 0xF6D9,
+ 0x00A4,
+ 0xF6D1,
+ 0xF6D2,
+ 0xF6D4,
+ 0xF6D5,
+ 0x0064,
+ 0x2020,
+ 0x2021,
+ 0xF6D3,
+ 0xF6D6,
+ 0x010F,
+ 0x0111,
+ 0x00B0,
+ 0x03B4,
+ 0x2666,
+ 0x00A8,
+ 0xF6D7,
+ 0xF6D8,
+ 0x0385,
+ 0x00F7,
+ 0x2593,
+ 0x2584,
+ 0x0024,
+ 0xF6E3,
+ 0xF724,
+ 0xF6E4,
+ 0x20AB,
+ 0x02D9,
+ 0x0323,
+ 0x0131,
+ 0xF6BE,
+ 0x22C5,
+ 0xF6EB,
+ 0x0065,
+ 0x00E9,
+ 0x0115,
+ 0x011B,
+ 0x00EA,
+ 0x00EB,
+ 0x0117,
+ 0x00E8,
+ 0x0038,
+ 0x2088,
+ 0xF738,
+ 0x2078,
+ 0x2208,
+ 0x2026,
+ 0x0113,
+ 0x2014,
+ 0x2205,
+ 0x2013,
+ 0x014B,
+ 0x0119,
+ 0x03B5,
+ 0x03AD,
+ 0x003D,
+ 0x2261,
+ 0x212E,
+ 0xF6EC,
+ 0x03B7,
+ 0x03AE,
+ 0x00F0,
+ 0x0021,
+ 0x203C,
+ 0x00A1,
+ 0xF7A1,
+ 0xF721,
+ 0x2203,
+ 0x0066,
+ 0x2640,
+ 0xFB00,
+ 0xFB03,
+ 0xFB04,
+ 0xFB01,
+ 0x2012,
+ 0x25A0,
+ 0x25AC,
+ 0x0035,
+ 0x215D,
+ 0x2085,
+ 0xF735,
+ 0x2075,
+ 0xFB02,
+ 0x0192,
+ 0x0034,
+ 0x2084,
+ 0xF734,
+ 0x2074,
+ 0x2044,
+ 0x2215,
+ 0x20A3,
+ 0x0067,
+ 0x03B3,
+ 0x011F,
+ 0x01E7,
+ 0x011D,
+ 0x0123,
+ 0x0121,
+ 0x00DF,
+ 0x2207,
+ 0x0060,
+ 0x0300,
+ 0x003E,
+ 0x2265,
+ 0x00AB,
+ 0x00BB,
+ 0x2039,
+ 0x203A,
+ 0x0068,
+ 0x0127,
+ 0x0125,
+ 0x2665,
+ 0x0309,
+ 0x2302,
+ 0x02DD,
+ 0x002D,
+ 0x00AD,
+ 0xF6E5,
+ 0xF6E6,
+ 0x0069,
+ 0x00ED,
+ 0x012D,
+ 0x00EE,
+ 0x00EF,
+ 0x00EC,
+ 0x0133,
+ 0x012B,
+ 0x221E,
+ 0x222B,
+ 0x2321,
+ 0xF8F5,
+ 0x2320,
+ 0x2229,
+ 0x25D8,
+ 0x25D9,
+ 0x263B,
+ 0x012F,
+ 0x03B9,
+ 0x03CA,
+ 0x0390,
+ 0x03AF,
+ 0xF6ED,
+ 0x0129,
+ 0x006A,
+ 0x0135,
+ 0x006B,
+ 0x03BA,
+ 0x0137,
+ 0x0138,
+ 0x006C,
+ 0x013A,
+ 0x03BB,
+ 0x013E,
+ 0x013C,
+ 0x0140,
+ 0x003C,
+ 0x2264,
+ 0x258C,
+ 0x20A4,
+ 0xF6C0,
+ 0x2227,
+ 0x00AC,
+ 0x2228,
+ 0x017F,
+ 0x25CA,
+ 0x0142,
+ 0xF6EE,
+ 0x2591,
+ 0x006D,
+ 0x00AF,
+ 0x02C9,
+ 0x2642,
+ 0x2212,
+ 0x2032,
+ 0xF6EF,
+ 0x00B5,
+ 0x03BC,
+ 0x00D7,
+ 0x266A,
+ 0x266B,
+ 0x006E,
+ 0x0144,
+ 0x0149,
+ 0x0148,
+ 0x0146,
+ 0x0039,
+ 0x2089,
+ 0xF739,
+ 0x2079,
+ 0x2209,
+ 0x2260,
+ 0x2284,
+ 0x207F,
+ 0x00F1,
+ 0x03BD,
+ 0x0023,
+ 0x006F,
+ 0x00F3,
+ 0x014F,
+ 0x00F4,
+ 0x00F6,
+ 0x0153,
+ 0x02DB,
+ 0x00F2,
+ 0x01A1,
+ 0x0151,
+ 0x014D,
+ 0x03C9,
+ 0x03D6,
+ 0x03CE,
+ 0x03BF,
+ 0x03CC,
+ 0x0031,
+ 0x2024,
+ 0x215B,
+ 0xF6DC,
+ 0x00BD,
+ 0x2081,
+ 0xF731,
+ 0x00BC,
+ 0x00B9,
+ 0x2153,
+ 0x25E6,
+ 0x00AA,
+ 0x00BA,
+ 0x221F,
+ 0x00F8,
+ 0x01FF,
+ 0xF6F0,
+ 0x00F5,
+ 0x0070,
+ 0x00B6,
+ 0x0028,
+ 0xF8ED,
+ 0xF8EC,
+ 0x208D,
+ 0x207D,
+ 0xF8EB,
+ 0x0029,
+ 0xF8F8,
+ 0xF8F7,
+ 0x208E,
+ 0x207E,
+ 0xF8F6,
+ 0x2202,
+ 0x0025,
+ 0x002E,
+ 0x00B7,
+ 0x2219,
+ 0xF6E7,
+ 0xF6E8,
+ 0x22A5,
+ 0x2030,
+ 0x20A7,
+ 0x03C6,
+ 0x03D5,
+ 0x03C0,
+ 0x002B,
+ 0x00B1,
+ 0x211E,
+ 0x220F,
+ 0x2282,
+ 0x2283,
+ 0x221D,
+ 0x03C8,
+ 0x0071,
+ 0x003F,
+ 0x00BF,
+ 0xF7BF,
+ 0xF73F,
+ 0x0022,
+ 0x201E,
+ 0x201C,
+ 0x201D,
+ 0x2018,
+ 0x201B,
+ 0x2019,
+ 0x201A,
+ 0x0027,
+ 0x0072,
+ 0x0155,
+ 0x221A,
+ 0xF8E5,
+ 0x0159,
+ 0x0157,
+ 0x2286,
+ 0x2287,
+ 0x00AE,
+ 0xF8E8,
+ 0xF6DA,
+ 0x2310,
+ 0x03C1,
+ 0x02DA,
+ 0xF6F1,
+ 0x2590,
+ 0xF6DD,
+ 0x0073,
+ 0x015B,
+ 0x0161,
+ 0x015F,
+ 0xF6C2,
+ 0x015D,
+ 0x0219,
+ 0x2033,
+ 0x00A7,
+ 0x003B,
+ 0x0037,
+ 0x215E,
+ 0x2087,
+ 0xF737,
+ 0x2077,
+ 0x2592,
+ 0x03C3,
+ 0x03C2,
+ 0x223C,
+ 0x0036,
+ 0x2086,
+ 0xF736,
+ 0x2076,
+ 0x002F,
+ 0x263A,
+ 0x0020,
+ 0x00A0,
+ 0x2660,
+ 0xF6F2,
+ 0x00A3,
+ 0x220B,
+ 0x2211,
+ 0x263C,
+ 0x0074,
+ 0x03C4,
+ 0x0167,
+ 0x0165,
+ 0x0163,
+ 0x021B,
+ 0x2234,
+ 0x03B8,
+ 0x03D1,
+ 0x00FE,
+ 0x0033,
+ 0x215C,
+ 0x2083,
+ 0xF733,
+ 0x00BE,
+ 0xF6DE,
+ 0x00B3,
+ 0x02DC,
+ 0x0303,
+ 0x0384,
+ 0x2122,
+ 0xF8EA,
+ 0xF6DB,
+ 0x25BC,
+ 0x25C4,
+ 0x25BA,
+ 0x25B2,
+ 0xF6F3,
+ 0x0032,
+ 0x2025,
+ 0x2082,
+ 0xF732,
+ 0x00B2,
+ 0x2154,
+ 0x0075,
+ 0x00FA,
+ 0x016D,
+ 0x00FB,
+ 0x00FC,
+ 0x00F9,
+ 0x01B0,
+ 0x0171,
+ 0x016B,
+ 0x005F,
+ 0x2017,
+ 0x222A,
+ 0x2200,
+ 0x0173,
+ 0x2580,
+ 0x03C5,
+ 0x03CB,
+ 0x03B0,
+ 0x03CD,
+ 0x016F,
+ 0x0169,
+ 0x0076,
+ 0x0077,
+ 0x1E83,
+ 0x0175,
+ 0x1E85,
+ 0x2118,
+ 0x1E81,
+ 0x0078,
+ 0x03BE,
+ 0x0079,
+ 0x00FD,
+ 0x0177,
+ 0x00FF,
+ 0x00A5,
+ 0x1EF3,
+ 0x007A,
+ 0x017A,
+ 0x017E,
+ 0x017C,
+ 0x0030,
+ 0x2080,
+ 0xF730,
+ 0x2070,
+ 0x03B6
+ };
+
+ private static final String names[] =
+ {
+ "A",
+ "AE",
+ "AEacute",
+ "AEsmall",
+ "Aacute",
+ "Aacutesmall",
+ "Abreve",
+ "Acircumflex",
+ "Acircumflexsmall",
+ "Acute",
+ "Acutesmall",
+ "Adieresis",
+ "Adieresissmall",
+ "Agrave",
+ "Agravesmall",
+ "Alpha",
+ "Alphatonos",
+ "Amacron",
+ "Aogonek",
+ "Aring",
+ "Aringacute",
+ "Aringsmall",
+ "Asmall",
+ "Atilde",
+ "Atildesmall",
+ "B",
+ "Beta",
+ "Brevesmall",
+ "Bsmall",
+ "C",
+ "Cacute",
+ "Caron",
+ "Caronsmall",
+ "Ccaron",
+ "Ccedilla",
+ "Ccedillasmall",
+ "Ccircumflex",
+ "Cdotaccent",
+ "Cedillasmall",
+ "Chi",
+ "Circumflexsmall",
+ "Csmall",
+ "D",
+ "Dcaron",
+ "Dcroat",
+ "Delta",
+ "Delta",
+ "Dieresis",
+ "DieresisAcute",
+ "DieresisGrave",
+ "Dieresissmall",
+ "Dotaccentsmall",
+ "Dsmall",
+ "E",
+ "Eacute",
+ "Eacutesmall",
+ "Ebreve",
+ "Ecaron",
+ "Ecircumflex",
+ "Ecircumflexsmall",
+ "Edieresis",
+ "Edieresissmall",
+ "Edotaccent",
+ "Egrave",
+ "Egravesmall",
+ "Emacron",
+ "Eng",
+ "Eogonek",
+ "Epsilon",
+ "Epsilontonos",
+ "Esmall",
+ "Eta",
+ "Etatonos",
+ "Eth",
+ "Ethsmall",
+ "Euro",
+ "F",
+ "Fsmall",
+ "G",
+ "Gamma",
+ "Gbreve",
+ "Gcaron",
+ "Gcircumflex",
+ "Gcommaaccent",
+ "Gdotaccent",
+ "Grave",
+ "Gravesmall",
+ "Gsmall",
+ "H",
+ "H18533",
+ "H18543",
+ "H18551",
+ "H22073",
+ "Hbar",
+ "Hcircumflex",
+ "Hsmall",
+ "Hungarumlaut",
+ "Hungarumlautsmall",
+ "I",
+ "IJ",
+ "Iacute",
+ "Iacutesmall",
+ "Ibreve",
+ "Icircumflex",
+ "Icircumflexsmall",
+ "Idieresis",
+ "Idieresissmall",
+ "Idotaccent",
+ "Ifraktur",
+ "Igrave",
+ "Igravesmall",
+ "Imacron",
+ "Iogonek",
+ "Iota",
+ "Iotadieresis",
+ "Iotatonos",
+ "Ismall",
+ "Itilde",
+ "J",
+ "Jcircumflex",
+ "Jsmall",
+ "K",
+ "Kappa",
+ "Kcommaaccent",
+ "Ksmall",
+ "L",
+ "LL",
+ "Lacute",
+ "Lambda",
+ "Lcaron",
+ "Lcommaaccent",
+ "Ldot",
+ "Lslash",
+ "Lslashsmall",
+ "Lsmall",
+ "M",
+ "Macron",
+ "Macronsmall",
+ "Msmall",
+ "Mu",
+ "N",
+ "Nacute",
+ "Ncaron",
+ "Ncommaaccent",
+ "Nsmall",
+ "Ntilde",
+ "Ntildesmall",
+ "Nu",
+ "O",
+ "OE",
+ "OEsmall",
+ "Oacute",
+ "Oacutesmall",
+ "Obreve",
+ "Ocircumflex",
+ "Ocircumflexsmall",
+ "Odieresis",
+ "Odieresissmall",
+ "Ogoneksmall",
+ "Ograve",
+ "Ogravesmall",
+ "Ohorn",
+ "Ohungarumlaut",
+ "Omacron",
+ "Omega",
+ "Omega",
+ "Omegatonos",
+ "Omicron",
+ "Omicrontonos",
+ "Oslash",
+ "Oslashacute",
+ "Oslashsmall",
+ "Osmall",
+ "Otilde",
+ "Otildesmall",
+ "P",
+ "Phi",
+ "Pi",
+ "Psi",
+ "Psmall",
+ "Q",
+ "Qsmall",
+ "R",
+ "Racute",
+ "Rcaron",
+ "Rcommaaccent",
+ "Rfraktur",
+ "Rho",
+ "Ringsmall",
+ "Rsmall",
+ "S",
+ "SF010000",
+ "SF020000",
+ "SF030000",
+ "SF040000",
+ "SF050000",
+ "SF060000",
+ "SF070000",
+ "SF080000",
+ "SF090000",
+ "SF100000",
+ "SF110000",
+ "SF190000",
+ "SF200000",
+ "SF210000",
+ "SF220000",
+ "SF230000",
+ "SF240000",
+ "SF250000",
+ "SF260000",
+ "SF270000",
+ "SF280000",
+ "SF360000",
+ "SF370000",
+ "SF380000",
+ "SF390000",
+ "SF400000",
+ "SF410000",
+ "SF420000",
+ "SF430000",
+ "SF440000",
+ "SF450000",
+ "SF460000",
+ "SF470000",
+ "SF480000",
+ "SF490000",
+ "SF500000",
+ "SF510000",
+ "SF520000",
+ "SF530000",
+ "SF540000",
+ "Sacute",
+ "Scaron",
+ "Scaronsmall",
+ "Scedilla",
+ "Scedilla",
+ "Scircumflex",
+ "Scommaaccent",
+ "Sigma",
+ "Ssmall",
+ "T",
+ "Tau",
+ "Tbar",
+ "Tcaron",
+ "Tcommaaccent",
+ "Tcommaaccent",
+ "Theta",
+ "Thorn",
+ "Thornsmall",
+ "Tildesmall",
+ "Tsmall",
+ "U",
+ "Uacute",
+ "Uacutesmall",
+ "Ubreve",
+ "Ucircumflex",
+ "Ucircumflexsmall",
+ "Udieresis",
+ "Udieresissmall",
+ "Ugrave",
+ "Ugravesmall",
+ "Uhorn",
+ "Uhungarumlaut",
+ "Umacron",
+ "Uogonek",
+ "Upsilon",
+ "Upsilon1",
+ "Upsilondieresis",
+ "Upsilontonos",
+ "Uring",
+ "Usmall",
+ "Utilde",
+ "V",
+ "Vsmall",
+ "W",
+ "Wacute",
+ "Wcircumflex",
+ "Wdieresis",
+ "Wgrave",
+ "Wsmall",
+ "X",
+ "Xi",
+ "Xsmall",
+ "Y",
+ "Yacute",
+ "Yacutesmall",
+ "Ycircumflex",
+ "Ydieresis",
+ "Ydieresissmall",
+ "Ygrave",
+ "Ysmall",
+ "Z",
+ "Zacute",
+ "Zcaron",
+ "Zcaronsmall",
+ "Zdotaccent",
+ "Zeta",
+ "Zsmall",
+ "a",
+ "aacute",
+ "abreve",
+ "acircumflex",
+ "acute",
+ "acutecomb",
+ "adieresis",
+ "ae",
+ "aeacute",
+ "afii00208",
+ "afii10017",
+ "afii10018",
+ "afii10019",
+ "afii10020",
+ "afii10021",
+ "afii10022",
+ "afii10023",
+ "afii10024",
+ "afii10025",
+ "afii10026",
+ "afii10027",
+ "afii10028",
+ "afii10029",
+ "afii10030",
+ "afii10031",
+ "afii10032",
+ "afii10033",
+ "afii10034",
+ "afii10035",
+ "afii10036",
+ "afii10037",
+ "afii10038",
+ "afii10039",
+ "afii10040",
+ "afii10041",
+ "afii10042",
+ "afii10043",
+ "afii10044",
+ "afii10045",
+ "afii10046",
+ "afii10047",
+ "afii10048",
+ "afii10049",
+ "afii10050",
+ "afii10051",
+ "afii10052",
+ "afii10053",
+ "afii10054",
+ "afii10055",
+ "afii10056",
+ "afii10057",
+ "afii10058",
+ "afii10059",
+ "afii10060",
+ "afii10061",
+ "afii10062",
+ "afii10063",
+ "afii10064",
+ "afii10065",
+ "afii10066",
+ "afii10067",
+ "afii10068",
+ "afii10069",
+ "afii10070",
+ "afii10071",
+ "afii10072",
+ "afii10073",
+ "afii10074",
+ "afii10075",
+ "afii10076",
+ "afii10077",
+ "afii10078",
+ "afii10079",
+ "afii10080",
+ "afii10081",
+ "afii10082",
+ "afii10083",
+ "afii10084",
+ "afii10085",
+ "afii10086",
+ "afii10087",
+ "afii10088",
+ "afii10089",
+ "afii10090",
+ "afii10091",
+ "afii10092",
+ "afii10093",
+ "afii10094",
+ "afii10095",
+ "afii10096",
+ "afii10097",
+ "afii10098",
+ "afii10099",
+ "afii10100",
+ "afii10101",
+ "afii10102",
+ "afii10103",
+ "afii10104",
+ "afii10105",
+ "afii10106",
+ "afii10107",
+ "afii10108",
+ "afii10109",
+ "afii10110",
+ "afii10145",
+ "afii10146",
+ "afii10147",
+ "afii10148",
+ "afii10192",
+ "afii10193",
+ "afii10194",
+ "afii10195",
+ "afii10196",
+ "afii10831",
+ "afii10832",
+ "afii10846",
+ "afii299",
+ "afii300",
+ "afii301",
+ "afii57381",
+ "afii57388",
+ "afii57392",
+ "afii57393",
+ "afii57394",
+ "afii57395",
+ "afii57396",
+ "afii57397",
+ "afii57398",
+ "afii57399",
+ "afii57400",
+ "afii57401",
+ "afii57403",
+ "afii57407",
+ "afii57409",
+ "afii57410",
+ "afii57411",
+ "afii57412",
+ "afii57413",
+ "afii57414",
+ "afii57415",
+ "afii57416",
+ "afii57417",
+ "afii57418",
+ "afii57419",
+ "afii57420",
+ "afii57421",
+ "afii57422",
+ "afii57423",
+ "afii57424",
+ "afii57425",
+ "afii57426",
+ "afii57427",
+ "afii57428",
+ "afii57429",
+ "afii57430",
+ "afii57431",
+ "afii57432",
+ "afii57433",
+ "afii57434",
+ "afii57440",
+ "afii57441",
+ "afii57442",
+ "afii57443",
+ "afii57444",
+ "afii57445",
+ "afii57446",
+ "afii57448",
+ "afii57449",
+ "afii57450",
+ "afii57451",
+ "afii57452",
+ "afii57453",
+ "afii57454",
+ "afii57455",
+ "afii57456",
+ "afii57457",
+ "afii57458",
+ "afii57470",
+ "afii57505",
+ "afii57506",
+ "afii57507",
+ "afii57508",
+ "afii57509",
+ "afii57511",
+ "afii57512",
+ "afii57513",
+ "afii57514",
+ "afii57519",
+ "afii57534",
+ "afii57636",
+ "afii57645",
+ "afii57658",
+ "afii57664",
+ "afii57665",
+ "afii57666",
+ "afii57667",
+ "afii57668",
+ "afii57669",
+ "afii57670",
+ "afii57671",
+ "afii57672",
+ "afii57673",
+ "afii57674",
+ "afii57675",
+ "afii57676",
+ "afii57677",
+ "afii57678",
+ "afii57679",
+ "afii57680",
+ "afii57681",
+ "afii57682",
+ "afii57683",
+ "afii57684",
+ "afii57685",
+ "afii57686",
+ "afii57687",
+ "afii57688",
+ "afii57689",
+ "afii57690",
+ "afii57694",
+ "afii57695",
+ "afii57700",
+ "afii57705",
+ "afii57716",
+ "afii57717",
+ "afii57718",
+ "afii57723",
+ "afii57793",
+ "afii57794",
+ "afii57795",
+ "afii57796",
+ "afii57797",
+ "afii57798",
+ "afii57799",
+ "afii57800",
+ "afii57801",
+ "afii57802",
+ "afii57803",
+ "afii57804",
+ "afii57806",
+ "afii57807",
+ "afii57839",
+ "afii57841",
+ "afii57842",
+ "afii57929",
+ "afii61248",
+ "afii61289",
+ "afii61352",
+ "afii61573",
+ "afii61574",
+ "afii61575",
+ "afii61664",
+ "afii63167",
+ "afii64937",
+ "agrave",
+ "aleph",
+ "alpha",
+ "alphatonos",
+ "amacron",
+ "ampersand",
+ "ampersandsmall",
+ "angle",
+ "angleleft",
+ "angleright",
+ "anoteleia",
+ "aogonek",
+ "approxequal",
+ "aring",
+ "aringacute",
+ "arrowboth",
+ "arrowdblboth",
+ "arrowdbldown",
+ "arrowdblleft",
+ "arrowdblright",
+ "arrowdblup",
+ "arrowdown",
+ "arrowhorizex",
+ "arrowleft",
+ "arrowright",
+ "arrowup",
+ "arrowupdn",
+ "arrowupdnbse",
+ "arrowvertex",
+ "asciicircum",
+ "asciitilde",
+ "asterisk",
+ "asteriskmath",
+ "asuperior",
+ "at",
+ "atilde",
+ "b",
+ "backslash",
+ "bar",
+ "beta",
+ "block",
+ "braceex",
+ "braceleft",
+ "braceleftbt",
+ "braceleftmid",
+ "bracelefttp",
+ "braceright",
+ "bracerightbt",
+ "bracerightmid",
+ "bracerighttp",
+ "bracketleft",
+ "bracketleftbt",
+ "bracketleftex",
+ "bracketlefttp",
+ "bracketright",
+ "bracketrightbt",
+ "bracketrightex",
+ "bracketrighttp",
+ "breve",
+ "brokenbar",
+ "bsuperior",
+ "bullet",
+ "c",
+ "cacute",
+ "caron",
+ "carriagereturn",
+ "ccaron",
+ "ccedilla",
+ "ccircumflex",
+ "cdotaccent",
+ "cedilla",
+ "cent",
+ "centinferior",
+ "centoldstyle",
+ "centsuperior",
+ "chi",
+ "circle",
+ "circlemultiply",
+ "circleplus",
+ "circumflex",
+ "club",
+ "colon",
+ "colonmonetary",
+ "comma",
+ "commaaccent",
+ "commainferior",
+ "commasuperior",
+ "congruent",
+ "copyright",
+ "copyrightsans",
+ "copyrightserif",
+ "currency",
+ "cyrBreve",
+ "cyrFlex",
+ "cyrbreve",
+ "cyrflex",
+ "d",
+ "dagger",
+ "daggerdbl",
+ "dblGrave",
+ "dblgrave",
+ "dcaron",
+ "dcroat",
+ "degree",
+ "delta",
+ "diamond",
+ "dieresis",
+ "dieresisacute",
+ "dieresisgrave",
+ "dieresistonos",
+ "divide",
+ "dkshade",
+ "dnblock",
+ "dollar",
+ "dollarinferior",
+ "dollaroldstyle",
+ "dollarsuperior",
+ "dong",
+ "dotaccent",
+ "dotbelowcomb",
+ "dotlessi",
+ "dotlessj",
+ "dotmath",
+ "dsuperior",
+ "e",
+ "eacute",
+ "ebreve",
+ "ecaron",
+ "ecircumflex",
+ "edieresis",
+ "edotaccent",
+ "egrave",
+ "eight",
+ "eightinferior",
+ "eightoldstyle",
+ "eightsuperior",
+ "element",
+ "ellipsis",
+ "emacron",
+ "emdash",
+ "emptyset",
+ "endash",
+ "eng",
+ "eogonek",
+ "epsilon",
+ "epsilontonos",
+ "equal",
+ "equivalence",
+ "estimated",
+ "esuperior",
+ "eta",
+ "etatonos",
+ "eth",
+ "exclam",
+ "exclamdbl",
+ "exclamdown",
+ "exclamdownsmall",
+ "exclamsmall",
+ "existential",
+ "f",
+ "female",
+ "ff",
+ "ffi",
+ "ffl",
+ "fi",
+ "figuredash",
+ "filledbox",
+ "filledrect",
+ "five",
+ "fiveeighths",
+ "fiveinferior",
+ "fiveoldstyle",
+ "fivesuperior",
+ "fl",
+ "florin",
+ "four",
+ "fourinferior",
+ "fouroldstyle",
+ "foursuperior",
+ "fraction",
+ "fraction",
+ "franc",
+ "g",
+ "gamma",
+ "gbreve",
+ "gcaron",
+ "gcircumflex",
+ "gcommaaccent",
+ "gdotaccent",
+ "germandbls",
+ "gradient",
+ "grave",
+ "gravecomb",
+ "greater",
+ "greaterequal",
+ "guillemotleft",
+ "guillemotright",
+ "guilsinglleft",
+ "guilsinglright",
+ "h",
+ "hbar",
+ "hcircumflex",
+ "heart",
+ "hookabovecomb",
+ "house",
+ "hungarumlaut",
+ "hyphen",
+ "hyphen",
+ "hypheninferior",
+ "hyphensuperior",
+ "i",
+ "iacute",
+ "ibreve",
+ "icircumflex",
+ "idieresis",
+ "igrave",
+ "ij",
+ "imacron",
+ "infinity",
+ "integral",
+ "integralbt",
+ "integralex",
+ "integraltp",
+ "intersection",
+ "invbullet",
+ "invcircle",
+ "invsmileface",
+ "iogonek",
+ "iota",
+ "iotadieresis",
+ "iotadieresistonos",
+ "iotatonos",
+ "isuperior",
+ "itilde",
+ "j",
+ "jcircumflex",
+ "k",
+ "kappa",
+ "kcommaaccent",
+ "kgreenlandic",
+ "l",
+ "lacute",
+ "lambda",
+ "lcaron",
+ "lcommaaccent",
+ "ldot",
+ "less",
+ "lessequal",
+ "lfblock",
+ "lira",
+ "ll",
+ "logicaland",
+ "logicalnot",
+ "logicalor",
+ "longs",
+ "lozenge",
+ "lslash",
+ "lsuperior",
+ "ltshade",
+ "m",
+ "macron",
+ "macron",
+ "male",
+ "minus",
+ "minute",
+ "msuperior",
+ "mu",
+ "mu",
+ "multiply",
+ "musicalnote",
+ "musicalnotedbl",
+ "n",
+ "nacute",
+ "napostrophe",
+ "ncaron",
+ "ncommaaccent",
+ "nine",
+ "nineinferior",
+ "nineoldstyle",
+ "ninesuperior",
+ "notelement",
+ "notequal",
+ "notsubset",
+ "nsuperior",
+ "ntilde",
+ "nu",
+ "numbersign",
+ "o",
+ "oacute",
+ "obreve",
+ "ocircumflex",
+ "odieresis",
+ "oe",
+ "ogonek",
+ "ograve",
+ "ohorn",
+ "ohungarumlaut",
+ "omacron",
+ "omega",
+ "omega1",
+ "omegatonos",
+ "omicron",
+ "omicrontonos",
+ "one",
+ "onedotenleader",
+ "oneeighth",
+ "onefitted",
+ "onehalf",
+ "oneinferior",
+ "oneoldstyle",
+ "onequarter",
+ "onesuperior",
+ "onethird",
+ "openbullet",
+ "ordfeminine",
+ "ordmasculine",
+ "orthogonal",
+ "oslash",
+ "oslashacute",
+ "osuperior",
+ "otilde",
+ "p",
+ "paragraph",
+ "parenleft",
+ "parenleftbt",
+ "parenleftex",
+ "parenleftinferior",
+ "parenleftsuperior",
+ "parenlefttp",
+ "parenright",
+ "parenrightbt",
+ "parenrightex",
+ "parenrightinferior",
+ "parenrightsuperior",
+ "parenrighttp",
+ "partialdiff",
+ "percent",
+ "period",
+ "periodcentered",
+ "periodcentered",
+ "periodinferior",
+ "periodsuperior",
+ "perpendicular",
+ "perthousand",
+ "peseta",
+ "phi",
+ "phi1",
+ "pi",
+ "plus",
+ "plusminus",
+ "prescription",
+ "product",
+ "propersubset",
+ "propersuperset",
+ "proportional",
+ "psi",
+ "q",
+ "question",
+ "questiondown",
+ "questiondownsmall",
+ "questionsmall",
+ "quotedbl",
+ "quotedblbase",
+ "quotedblleft",
+ "quotedblright",
+ "quoteleft",
+ "quotereversed",
+ "quoteright",
+ "quotesinglbase",
+ "quotesingle",
+ "r",
+ "racute",
+ "radical",
+ "radicalex",
+ "rcaron",
+ "rcommaaccent",
+ "reflexsubset",
+ "reflexsuperset",
+ "registered",
+ "registersans",
+ "registerserif",
+ "revlogicalnot",
+ "rho",
+ "ring",
+ "rsuperior",
+ "rtblock",
+ "rupiah",
+ "s",
+ "sacute",
+ "scaron",
+ "scedilla",
+ "scedilla",
+ "scircumflex",
+ "scommaaccent",
+ "second",
+ "section",
+ "semicolon",
+ "seven",
+ "seveneighths",
+ "seveninferior",
+ "sevenoldstyle",
+ "sevensuperior",
+ "shade",
+ "sigma",
+ "sigma1",
+ "similar",
+ "six",
+ "sixinferior",
+ "sixoldstyle",
+ "sixsuperior",
+ "slash",
+ "smileface",
+ "space",
+ "space",
+ "spade",
+ "ssuperior",
+ "sterling",
+ "suchthat",
+ "summation",
+ "sun",
+ "t",
+ "tau",
+ "tbar",
+ "tcaron",
+ "tcommaaccent",
+ "tcommaaccent",
+ "therefore",
+ "theta",
+ "theta1",
+ "thorn",
+ "three",
+ "threeeighths",
+ "threeinferior",
+ "threeoldstyle",
+ "threequarters",
+ "threequartersemdash",
+ "threesuperior",
+ "tilde",
+ "tildecomb",
+ "tonos",
+ "trademark",
+ "trademarksans",
+ "trademarkserif",
+ "triagdn",
+ "triaglf",
+ "triagrt",
+ "triagup",
+ "tsuperior",
+ "two",
+ "twodotenleader",
+ "twoinferior",
+ "twooldstyle",
+ "twosuperior",
+ "twothirds",
+ "u",
+ "uacute",
+ "ubreve",
+ "ucircumflex",
+ "udieresis",
+ "ugrave",
+ "uhorn",
+ "uhungarumlaut",
+ "umacron",
+ "underscore",
+ "underscoredbl",
+ "union",
+ "universal",
+ "uogonek",
+ "upblock",
+ "upsilon",
+ "upsilondieresis",
+ "upsilondieresistonos",
+ "upsilontonos",
+ "uring",
+ "utilde",
+ "v",
+ "w",
+ "wacute",
+ "wcircumflex",
+ "wdieresis",
+ "weierstrass",
+ "wgrave",
+ "x",
+ "xi",
+ "y",
+ "yacute",
+ "ycircumflex",
+ "ydieresis",
+ "yen",
+ "ygrave",
+ "z",
+ "zacute",
+ "zcaron",
+ "zdotaccent",
+ "zero",
+ "zeroinferior",
+ "zerooldstyle",
+ "zerosuperior",
+ "zeta"
+ };
+
+ static
+ {
+ for (int k = 0; k < unicode.length; ++k)
+ {
+ Integer num = new Integer(unicode[k]);
+ unicode2names.put(num, names[k]);
+ int code[] = (int[])names2unicode.get(names[k]);
+ if (code == null)
+ {
+ names2unicode.put(names[k], new int[]{unicode[k]});
+ }
+ else
+ {
+ int code2[] = new int[code.length + 1];
+ System.arraycopy(code, 0, code2, 0, code.length);
+ code2[code.length] = unicode[k];
+ names2unicode.put(names[k], code2);
+ }
+ }
+ }
+
+ public static int[] nameToUnicode(String name)
+ {
+ return (int[])names2unicode.get(name);
+ }
+
+ public static String unicodeToName(int num)
+ {
+ return (String)unicode2names.get(new Integer(num));
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/pdf/GrayColor.java b/src/main/java/com/lowagie/text/pdf/GrayColor.java
new file mode 100644
index 0000000..4c14e79
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/GrayColor.java
@@ -0,0 +1,85 @@
+/*
+ * $Id: GrayColor.java,v 1.44 2006/02/22 10:53:08 psoares33 Exp $
+ * $Name: $
+ *
+ * Copyright 2001, 2002 by Paulo Soares.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf;
+
+/**
+ *
+ * @author Paulo Soares (psoares@consiste.pt)
+ */
+public class GrayColor extends ExtendedColor {
+
+ private float gray;
+
+ public static final GrayColor GRAYBLACK = new GrayColor(0f);
+ public static final GrayColor GRAYWHITE = new GrayColor(1f);
+
+ public GrayColor(int intGray) {
+ this((float)intGray / 255f);
+ }
+
+ public GrayColor(float floatGray) {
+ super(TYPE_GRAY, floatGray, floatGray, floatGray);
+ gray = normalize(floatGray);
+ }
+
+ public float getGray() {
+ return gray;
+ }
+
+ public boolean equals(Object obj) {
+ return obj instanceof GrayColor && ((GrayColor)obj).gray == this.gray;
+ }
+
+ public int hashCode() {
+ return Float.floatToIntBits(gray);
+ }
+
+}
diff --git a/src/main/java/com/lowagie/text/pdf/HyphenationAuto.java b/src/main/java/com/lowagie/text/pdf/HyphenationAuto.java
new file mode 100644
index 0000000..3e49d79
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/HyphenationAuto.java
@@ -0,0 +1,125 @@
+/*
+ * Copyright 2002 Paulo Soares
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf;
+
+import com.lowagie.text.pdf.hyphenation.Hyphenator;
+import com.lowagie.text.pdf.hyphenation.Hyphenation;
+
+/** Hyphenates words automatically accordingly to the language and country.
+ * The hyphenator engine was taken from FOP and uses the TEX patterns. If a language
+ * is not provided and a TEX pattern for it exists, it can be easily adapted.
+ *
+ * @author Paulo Soares (psoares@consiste.pt)
+ */
+public class HyphenationAuto implements HyphenationEvent {
+
+ /** The hyphenator engine.
+ */
+ protected Hyphenator hyphenator;
+ /** The second part of the hyphenated word.
+ */
+ protected String post;
+
+ /** Creates a new hyphenation instance usable in <CODE>Chunk</CODE>.
+ * @param lang the language ("en" for english, for example)
+ * @param country the country ("GB" for Great-Britain or "none" for no country, for example)
+ * @param leftMin the minimun number of letters before the hyphen
+ * @param rightMin the minimun number of letters after the hyphen
+ */
+ public HyphenationAuto(String lang, String country, int leftMin, int rightMin) {
+ hyphenator = new Hyphenator(lang, country, leftMin, rightMin);
+ }
+
+ /** Gets the hyphen symbol.
+ * @return the hyphen symbol
+ */
+ public String getHyphenSymbol() {
+ return "-";
+ }
+
+ /** Hyphenates a word and returns the first part of it. To get
+ * the second part of the hyphenated word call <CODE>getHyphenatedWordPost()</CODE>.
+ * @param word the word to hyphenate
+ * @param font the font used by this word
+ * @param fontSize the font size used by this word
+ * @param remainingWidth the width available to fit this word in
+ * @return the first part of the hyphenated word including
+ * the hyphen symbol, if any
+ */
+ public String getHyphenatedWordPre(String word, BaseFont font, float fontSize, float remainingWidth) {
+ post = word;
+ String hyphen = getHyphenSymbol();
+ float hyphenWidth = font.getWidthPoint(hyphen, fontSize);
+ if (hyphenWidth > remainingWidth)
+ return "";
+ Hyphenation hyphenation = hyphenator.hyphenate(word);
+ if (hyphenation == null) {
+ return "";
+ }
+ int len = hyphenation.length();
+ int k;
+ for (k = 0; k < len; ++k) {
+ if (font.getWidthPoint(hyphenation.getPreHyphenText(k), fontSize) + hyphenWidth > remainingWidth)
+ break;
+ }
+ --k;
+ if (k < 0)
+ return "";
+ post = hyphenation.getPostHyphenText(k);
+ return hyphenation.getPreHyphenText(k) + hyphen;
+ }
+
+ /** Gets the second part of the hyphenated word. Must be called
+ * after <CODE>getHyphenatedWordPre()</CODE>.
+ * @return the second part of the hyphenated word
+ */
+ public String getHyphenatedWordPost() {
+ return post;
+ }
+
+}
diff --git a/src/main/java/com/lowagie/text/pdf/HyphenationEvent.java b/src/main/java/com/lowagie/text/pdf/HyphenationEvent.java
new file mode 100644
index 0000000..b465cea
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/HyphenationEvent.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2002 Paulo Soares
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf;
+
+/** Called by <code>Chunk</code> to hyphenate a word.
+ *
+ * @author Paulo Soares (psoares@consiste.pt)
+ */
+public interface HyphenationEvent {
+
+ /** Gets the hyphen symbol.
+ * @return the hyphen symbol
+ */
+ public String getHyphenSymbol();
+
+ /** Hyphenates a word and returns the first part of it. To get
+ * the second part of the hyphenated word call <CODE>getHyphenatedWordPost()</CODE>.
+ * @param word the word to hyphenate
+ * @param font the font used by this word
+ * @param fontSize the font size used by this word
+ * @param remainingWidth the width available to fit this word in
+ * @return the first part of the hyphenated word including
+ * the hyphen symbol, if any
+ */
+ public String getHyphenatedWordPre(String word, BaseFont font, float fontSize, float remainingWidth);
+
+ /** Gets the second part of the hyphenated word. Must be called
+ * after <CODE>getHyphenatedWordPre()</CODE>.
+ * @return the second part of the hyphenated word
+ */
+ public String getHyphenatedWordPost();
+}
+
diff --git a/src/main/java/com/lowagie/text/pdf/IntHashtable.java b/src/main/java/com/lowagie/text/pdf/IntHashtable.java
new file mode 100644
index 0000000..633439a
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/IntHashtable.java
@@ -0,0 +1,338 @@
+// IntHashtable - a Hashtable that uses ints as the keys
+//
+// This is 90% based on JavaSoft's java.util.Hashtable.
+//
+// Visit the ACME Labs Java page for up-to-date versions of this and other
+// fine Java utilities: http://www.acme.com/java/
+
+package com.lowagie.text.pdf;
+
+import java.util.Arrays;
+import java.util.NoSuchElementException;
+import java.util.Iterator;
+
+/// A Hashtable that uses ints as the keys.
+// <P>
+// Use just like java.util.Hashtable, except that the keys must be ints.
+// This is much faster than creating a new Integer for each access.
+// <P>
+// <A HREF="/resources/classes/Acme/IntHashtable.java">Fetch the software.</A><BR>
+// <A HREF="/resources/classes/Acme.tar.gz">Fetch the entire Acme package.</A>
+// <P>
+// @see java.util.Hashtable
+
+public class IntHashtable implements Cloneable {
+ /// The hash table data.
+ private IntHashtableEntry table[];
+
+ /// The total number of entries in the hash table.
+ private int count;
+
+ /// Rehashes the table when count exceeds this threshold.
+ private int threshold;
+
+ /// The load factor for the hashtable.
+ private float loadFactor;
+
+ /// Constructs a new, empty hashtable with the specified initial
+ // capacity and the specified load factor.
+ // @param initialCapacity the initial number of buckets
+ // @param loadFactor a number between 0.0 and 1.0, it defines
+ // the threshold for rehashing the hashtable into
+ // a bigger one.
+ // @exception IllegalArgumentException If the initial capacity
+ // is less than or equal to zero.
+ // @exception IllegalArgumentException If the load factor is
+ // less than or equal to zero.
+ public IntHashtable( int initialCapacity, float loadFactor ) {
+ if ( initialCapacity <= 0 || loadFactor <= 0.0 )
+ throw new IllegalArgumentException();
+ this.loadFactor = loadFactor;
+ table = new IntHashtableEntry[initialCapacity];
+ threshold = (int) ( initialCapacity * loadFactor );
+ }
+
+ /// Constructs a new, empty hashtable with the specified initial
+ // capacity.
+ // @param initialCapacity the initial number of buckets
+ public IntHashtable( int initialCapacity ) {
+ this( initialCapacity, 0.75f );
+ }
+
+ /// Constructs a new, empty hashtable. A default capacity and load factor
+ // is used. Note that the hashtable will automatically grow when it gets
+ // full.
+ public IntHashtable() {
+ this( 101, 0.75f );
+ }
+
+ /// Returns the number of elements contained in the hashtable.
+ public int size() {
+ return count;
+ }
+
+ /// Returns true if the hashtable contains no elements.
+ public boolean isEmpty() {
+ return count == 0;
+ }
+
+ /// Returns true if the specified object is an element of the hashtable.
+ // This operation is more expensive than the containsKey() method.
+ // @param value the value that we are looking for
+ // @exception NullPointerException If the value being searched
+ // for is equal to null.
+ // @see IntHashtable#containsKey
+ public boolean contains( int value ) {
+ IntHashtableEntry tab[] = table;
+ for ( int i = tab.length ; i-- > 0 ; ) {
+ for ( IntHashtableEntry e = tab[i] ; e != null ; e = e.next ) {
+ if ( e.value == value )
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /// Returns true if the collection contains an element for the key.
+ // @param key the key that we are looking for
+ // @see IntHashtable#contains
+ public boolean containsKey( int key ) {
+ IntHashtableEntry tab[] = table;
+ int hash = key;
+ int index = ( hash & 0x7FFFFFFF ) % tab.length;
+ for ( IntHashtableEntry e = tab[index] ; e != null ; e = e.next ) {
+ if ( e.hash == hash && e.key == key )
+ return true;
+ }
+ return false;
+ }
+
+ /// Gets the object associated with the specified key in the
+ // hashtable.
+ // @param key the specified key
+ // @returns the element for the key or null if the key
+ // is not defined in the hash table.
+ // @see IntHashtable#put
+ public int get( int key ) {
+ IntHashtableEntry tab[] = table;
+ int hash = key;
+ int index = ( hash & 0x7FFFFFFF ) % tab.length;
+ for ( IntHashtableEntry e = tab[index] ; e != null ; e = e.next ) {
+ if ( e.hash == hash && e.key == key )
+ return e.value;
+ }
+ return 0;
+ }
+
+ /// Rehashes the content of the table into a bigger table.
+ // This method is called automatically when the hashtable's
+ // size exceeds the threshold.
+ protected void rehash() {
+ int oldCapacity = table.length;
+ IntHashtableEntry oldTable[] = table;
+
+ int newCapacity = oldCapacity * 2 + 1;
+ IntHashtableEntry newTable[] = new IntHashtableEntry[newCapacity];
+
+ threshold = (int) ( newCapacity * loadFactor );
+ table = newTable;
+
+ for ( int i = oldCapacity ; i-- > 0 ; ) {
+ for ( IntHashtableEntry old = oldTable[i] ; old != null ; ) {
+ IntHashtableEntry e = old;
+ old = old.next;
+
+ int index = ( e.hash & 0x7FFFFFFF ) % newCapacity;
+ e.next = newTable[index];
+ newTable[index] = e;
+ }
+ }
+ }
+
+ /// Puts the specified element into the hashtable, using the specified
+ // key. The element may be retrieved by doing a get() with the same key.
+ // The key and the element cannot be null.
+ // @param key the specified key in the hashtable
+ // @param value the specified element
+ // @exception NullPointerException If the value of the element
+ // is equal to null.
+ // @see IntHashtable#get
+ // @return the old value of the key, or null if it did not have one.
+ public int put( int key, int value ) {
+ // Makes sure the key is not already in the hashtable.
+ IntHashtableEntry tab[] = table;
+ int hash = key;
+ int index = ( hash & 0x7FFFFFFF ) % tab.length;
+ for ( IntHashtableEntry e = tab[index] ; e != null ; e = e.next ) {
+ if ( e.hash == hash && e.key == key ) {
+ int old = e.value;
+ e.value = value;
+ return old;
+ }
+ }
+
+ if ( count >= threshold ) {
+ // Rehash the table if the threshold is exceeded.
+ rehash();
+ return put( key, value );
+ }
+
+ // Creates the new entry.
+ IntHashtableEntry e = new IntHashtableEntry();
+ e.hash = hash;
+ e.key = key;
+ e.value = value;
+ e.next = tab[index];
+ tab[index] = e;
+ ++count;
+ return 0;
+ }
+
+ /// Removes the element corresponding to the key. Does nothing if the
+ // key is not present.
+ // @param key the key that needs to be removed
+ // @return the value of key, or null if the key was not found.
+ public int remove( int key ) {
+ IntHashtableEntry tab[] = table;
+ int hash = key;
+ int index = ( hash & 0x7FFFFFFF ) % tab.length;
+ for ( IntHashtableEntry e = tab[index], prev = null ; e != null ; prev = e, e = e.next ) {
+ if ( e.hash == hash && e.key == key ) {
+ if ( prev != null )
+ prev.next = e.next;
+ else
+ tab[index] = e.next;
+ --count;
+ return e.value;
+ }
+ }
+ return 0;
+ }
+
+ /// Clears the hash table so that it has no more elements in it.
+ public void clear() {
+ IntHashtableEntry tab[] = table;
+ for ( int index = tab.length; --index >= 0; )
+ tab[index] = null;
+ count = 0;
+ }
+
+ public Object clone() {
+ try {
+ IntHashtable t = (IntHashtable)super.clone();
+ t.table = new IntHashtableEntry[table.length];
+ for (int i = table.length ; i-- > 0 ; ) {
+ t.table[i] = (table[i] != null)
+ ? (IntHashtableEntry)table[i].clone() : null;
+ }
+ return t;
+ } catch (CloneNotSupportedException e) {
+ // this shouldn't happen, since we are Cloneable
+ throw new InternalError();
+ }
+ }
+
+ public int[] toOrderedKeys() {
+ int res[] = getKeys();
+ Arrays.sort(res);
+ return res;
+ }
+
+ public int[] getKeys() {
+ int res[] = new int[count];
+ int ptr = 0;
+ int index = table.length;
+ IntHashtableEntry entry = null;
+ while (true) {
+ if (entry == null)
+ while ((index-- > 0) && ((entry = table[index]) == null));
+ if (entry == null)
+ break;
+ IntHashtableEntry e = entry;
+ entry = e.next;
+ res[ptr++] = e.key;
+ }
+ return res;
+ }
+
+ public int getOneKey() {
+ if (count == 0)
+ return 0;
+ int index = table.length;
+ IntHashtableEntry entry = null;
+ while ((index-- > 0) && ((entry = table[index]) == null));
+ if (entry == null)
+ return 0;
+ return entry.key;
+ }
+
+ static class IntHashtableEntry {
+ int hash;
+ int key;
+ int value;
+ IntHashtableEntry next;
+
+ public int getKey() {
+ return key;
+ }
+
+ public int getValue() {
+ return value;
+ }
+
+ protected Object clone() {
+ IntHashtableEntry entry = new IntHashtableEntry();
+ entry.hash = hash;
+ entry.key = key;
+ entry.value = value;
+ entry.next = (next != null) ? (IntHashtableEntry)next.clone() : null;
+ return entry;
+ }
+ }
+
+ public Iterator getEntryIterator() {
+ return new IntHashtableIterator(table);
+ }
+
+ static class IntHashtableIterator implements Iterator {
+ // boolean keys;
+ int index;
+ IntHashtableEntry table[];
+ IntHashtableEntry entry;
+
+ IntHashtableIterator(IntHashtableEntry table[] /* , boolean keys */) {
+ this.table = table;
+ // this.keys = keys;
+ this.index = table.length;
+ }
+
+ public boolean hasNext() {
+ if (entry != null) {
+ return true;
+ }
+ while (index-- > 0) {
+ if ((entry = table[index]) != null) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public Object next() {
+ if (entry == null) {
+ while ((index-- > 0) && ((entry = table[index]) == null));
+ }
+ if (entry != null) {
+ IntHashtableEntry e = entry;
+ entry = e.next;
+ return e;
+ }
+ throw new NoSuchElementException("IntHashtableIterator");
+ }
+
+ public void remove() {
+ throw new UnsupportedOperationException("remove() not supported.");
+ }
+
+ }
+}
diff --git a/src/main/java/com/lowagie/text/pdf/LZWDecoder.java b/src/main/java/com/lowagie/text/pdf/LZWDecoder.java
new file mode 100644
index 0000000..b8bedcf
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/LZWDecoder.java
@@ -0,0 +1,231 @@
+/*
+ * Copyright (c) 2001 Sun Microsystems, Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * -Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * -Redistribution in binary form must reproduct the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of contributors may
+ * be used to endorse or promote products derived from this software without
+ * specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any kind. ALL
+ * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING ANY
+ * IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ * NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN AND ITS LICENSORS SHALL NOT BE
+ * LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
+ * OR DISTRIBUTING THE SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR ITS
+ * LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT,
+ * INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER
+ * CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF
+ * OR INABILITY TO USE SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that Software is not designed,licensed or intended for use in
+ * the design, construction, operation or maintenance of any nuclear facility.
+ *
+ * Adapted from the JAI codecs TIFFLZWDecoder.
+ */
+package com.lowagie.text.pdf;
+import java.io.OutputStream;
+import java.io.IOException;
+import com.lowagie.text.ExceptionConverter;
+/**
+ * A class for performing LZW decoding.
+ *
+ *
+ */
+public class LZWDecoder {
+
+ byte stringTable[][];
+ byte data[] = null;
+ OutputStream uncompData;
+ int tableIndex, bitsToGet = 9;
+ int bytePointer, bitPointer;
+ int nextData = 0;
+ int nextBits = 0;
+
+ int andTable[] = {
+ 511,
+ 1023,
+ 2047,
+ 4095
+ };
+
+ public LZWDecoder() {
+ }
+
+ /**
+ * Method to decode LZW compressed data.
+ *
+ * @param data The compressed data.
+ * @param uncompData Array to return the uncompressed data in.
+ */
+ public void decode(byte data[], OutputStream uncompData) {
+
+ if(data[0] == (byte)0x00 && data[1] == (byte)0x01) {
+ throw new RuntimeException("LZW flavour not supported.");
+ }
+
+ initializeStringTable();
+
+ this.data = data;
+ this.uncompData = uncompData;
+
+ // Initialize pointers
+ bytePointer = 0;
+ bitPointer = 0;
+
+ nextData = 0;
+ nextBits = 0;
+
+ int code, oldCode = 0;
+ byte string[];
+
+ while ((code = getNextCode()) != 257) {
+
+ if (code == 256) {
+
+ initializeStringTable();
+ code = getNextCode();
+
+ if (code == 257) {
+ break;
+ }
+
+ writeString(stringTable[code]);
+ oldCode = code;
+
+ } else {
+
+ if (code < tableIndex) {
+
+ string = stringTable[code];
+
+ writeString(string);
+ addStringToTable(stringTable[oldCode], string[0]);
+ oldCode = code;
+
+ } else {
+
+ string = stringTable[oldCode];
+ string = composeString(string, string[0]);
+ writeString(string);
+ addStringToTable(string);
+ oldCode = code;
+ }
+ }
+ }
+ }
+
+
+ /**
+ * Initialize the string table.
+ */
+ public void initializeStringTable() {
+
+ stringTable = new byte[8192][];
+
+ for (int i=0; i<256; i++) {
+ stringTable[i] = new byte[1];
+ stringTable[i][0] = (byte)i;
+ }
+
+ tableIndex = 258;
+ bitsToGet = 9;
+ }
+
+ /**
+ * Write out the string just uncompressed.
+ */
+ public void writeString(byte string[]) {
+ try {
+ uncompData.write(string);
+ }
+ catch (IOException e) {
+ throw new ExceptionConverter(e);
+ }
+ }
+
+ /**
+ * Add a new string to the string table.
+ */
+ public void addStringToTable(byte oldString[], byte newString) {
+ int length = oldString.length;
+ byte string[] = new byte[length + 1];
+ System.arraycopy(oldString, 0, string, 0, length);
+ string[length] = newString;
+
+ // Add this new String to the table
+ stringTable[tableIndex++] = string;
+
+ if (tableIndex == 511) {
+ bitsToGet = 10;
+ } else if (tableIndex == 1023) {
+ bitsToGet = 11;
+ } else if (tableIndex == 2047) {
+ bitsToGet = 12;
+ }
+ }
+
+ /**
+ * Add a new string to the string table.
+ */
+ public void addStringToTable(byte string[]) {
+
+ // Add this new String to the table
+ stringTable[tableIndex++] = string;
+
+ if (tableIndex == 511) {
+ bitsToGet = 10;
+ } else if (tableIndex == 1023) {
+ bitsToGet = 11;
+ } else if (tableIndex == 2047) {
+ bitsToGet = 12;
+ }
+ }
+
+ /**
+ * Append <code>newString</code> to the end of <code>oldString</code>.
+ */
+ public byte[] composeString(byte oldString[], byte newString) {
+ int length = oldString.length;
+ byte string[] = new byte[length + 1];
+ System.arraycopy(oldString, 0, string, 0, length);
+ string[length] = newString;
+
+ return string;
+ }
+
+ // Returns the next 9, 10, 11 or 12 bits
+ public int getNextCode() {
+ // Attempt to get the next code. The exception is caught to make
+ // this robust to cases wherein the EndOfInformation code has been
+ // omitted from a strip. Examples of such cases have been observed
+ // in practice.
+ try {
+ nextData = (nextData << 8) | (data[bytePointer++] & 0xff);
+ nextBits += 8;
+
+ if (nextBits < bitsToGet) {
+ nextData = (nextData << 8) | (data[bytePointer++] & 0xff);
+ nextBits += 8;
+ }
+
+ int code =
+ (nextData >> (nextBits - bitsToGet)) & andTable[bitsToGet-9];
+ nextBits -= bitsToGet;
+
+ return code;
+ } catch(ArrayIndexOutOfBoundsException e) {
+ // Strip not terminated as expected: return EndOfInformation code.
+ return 257;
+ }
+ }
+}
diff --git a/src/main/java/com/lowagie/text/pdf/MultiColumnText.java b/src/main/java/com/lowagie/text/pdf/MultiColumnText.java
new file mode 100644
index 0000000..4de2069
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/MultiColumnText.java
@@ -0,0 +1,575 @@
+/*
+ * $Id: MultiColumnText.java,v 1.19 2006/03/20 12:11:46 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2004 Steve Appling
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999-2005 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000-2005 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf;
+
+import com.lowagie.text.*;
+
+import java.util.ArrayList;
+
+/**
+ * Formats content into one or more columns bounded by a
+ * rectangle. The columns may be simple rectangles or
+ * more complicated shapes. Add all of the columns before
+ * adding content. Column continuation is supported. A MultiColumnText object may be added to
+ * a document using <CODE>Document.add</CODE>.
+ * @author Steve Appling
+ */
+public class MultiColumnText implements Element {
+
+ /** special constant for automatic calculation of height */
+ public static final float AUTOMATIC = -1f;
+
+ /**
+ * total desiredHeight of columns. If <CODE>AUTOMATIC</CODE>, this means fill pages until done.
+ * This may be larger than one page
+ */
+ private float desiredHeight;
+
+ /**
+ * total height of element written out so far
+ */
+ private float totalHeight;
+
+ /**
+ * true if all the text could not be written out due to height restriction
+ */
+ private boolean overflow;
+
+ /**
+ * Top of the columns - y position on starting page.
+ * If <CODE>AUTOMATIC</CODE>, it means current y position when added to document
+ */
+ private float top;
+
+ /**
+ * used to store the y position of the bottom of the page
+ */
+ private float pageBottom;
+
+ /**
+ * ColumnText object used to do all the real work. This same object is used for all columns
+ */
+ private ColumnText columnText;
+
+ /**
+ * Array of <CODE>ColumnDef</CODE> objects used to define the columns
+ */
+ private ArrayList columnDefs;
+
+ /**
+ * true if all columns are simple (rectangular)
+ */
+ private boolean simple = true;
+
+ private int currentColumn = 0;
+
+ private float nextY = AUTOMATIC;
+
+ private boolean columnsRightToLeft = false;
+
+ private PdfDocument document;
+ /**
+ * Default constructor. Sets height to <CODE>AUTOMATIC</CODE>.
+ * Columns will repeat on each page as necessary to accomodate content length.
+ */
+ public MultiColumnText() {
+ this(AUTOMATIC);
+ }
+
+ /**
+ * Construct a MultiColumnText container of the specified height.
+ * If height is <CODE>AUTOMATIC</CODE>, fill complete pages until done.
+ * If a specific height is used, it may span one or more pages.
+ *
+ * @param height
+ */
+ public MultiColumnText(float height) {
+ columnDefs = new ArrayList();
+ desiredHeight = height;
+ top = AUTOMATIC;
+ // canvas will be set later
+ columnText = new ColumnText(null);
+ totalHeight = 0f;
+ }
+
+ /**
+ * Construct a MultiColumnText container of the specified height
+ * starting at the specified Y position.
+ *
+ * @param height
+ * @param top
+ */
+ public MultiColumnText(float top, float height) {
+ columnDefs = new ArrayList();
+ desiredHeight = height;
+ this.top = top;
+ nextY = top;
+ // canvas will be set later
+ columnText = new ColumnText(null);
+ totalHeight = 0f;
+ }
+
+ /**
+ * Indicates that all of the text did not fit in the
+ * specified height. Note that isOverflow will return
+ * false before the MultiColumnText object has been
+ * added to the document. It will always be false if
+ * the height is AUTOMATIC.
+ *
+ * @return true if there is still space left in the column
+ */
+ public boolean isOverflow() {
+ return overflow;
+ }
+
+ /**
+ * Copy the parameters from the specified ColumnText to use
+ * when rendering. Parameters like <CODE>setArabicOptions</CODE>
+ * must be set in this way.
+ *
+ * @param sourceColumn
+ */
+ public void useColumnParams(ColumnText sourceColumn) {
+ // note that canvas will be overwritten later
+ columnText.setSimpleVars(sourceColumn);
+ }
+
+ /**
+ * Add a new column. The parameters are limits for each column
+ * wall in the format of a sequence of points (x1,y1,x2,y2,...).
+ *
+ * @param left limits for left column
+ * @param right limits for right column
+ */
+ public void addColumn(float[] left, float[] right) {
+ ColumnDef nextDef = new ColumnDef(left, right);
+ simple = nextDef.isSimple();
+ columnDefs.add(nextDef);
+ }
+
+ /**
+ * Add a simple rectangular column with specified left
+ * and right x position boundaries.
+ *
+ * @param left left boundary
+ * @param right right boundary
+ */
+ public void addSimpleColumn(float left, float right) {
+ ColumnDef newCol = new ColumnDef(left, right);
+ columnDefs.add(newCol);
+ }
+
+ /**
+ * Add the specified number of evenly spaced rectangular columns.
+ * Columns will be seperated by the specified gutterWidth.
+ *
+ * @param left left boundary of first column
+ * @param right right boundary of last column
+ * @param gutterWidth width of gutter spacing between columns
+ * @param numColumns number of columns to add
+ */
+ public void addRegularColumns(float left, float right, float gutterWidth, int numColumns) {
+ float currX = left;
+ float width = right - left;
+ float colWidth = (width - (gutterWidth * (numColumns - 1))) / numColumns;
+ for (int i = 0; i < numColumns; i++) {
+ addSimpleColumn(currX, currX + colWidth);
+ currX += colWidth + gutterWidth;
+ }
+ }
+
+ /**
+ * Add an element to be rendered in a column.
+ * Note that you can only add a <CODE>Phrase</CODE>
+ * or a <CODE>Chunk</CODE> if the columns are
+ * not all simple. This is an underlying restriction in
+ * {@link com.lowagie.text.pdf.ColumnText}
+ *
+ * @param element element to add
+ * @throws DocumentException if element can't be added
+ */
+ public void addElement(Element element) throws DocumentException {
+ if (simple) {
+ columnText.addElement(element);
+ } else if (element instanceof Phrase) {
+ columnText.addText((Phrase) element);
+ } else if (element instanceof Chunk) {
+ columnText.addText((Chunk) element);
+ } else {
+ throw new DocumentException("Can't add " + element.getClass() + " to MultiColumnText with complex columns");
+ }
+ }
+
+
+ /**
+ * Write out the columns. After writing, use
+ * {@link #isOverflow()} to see if all text was written.
+ * @param canvas PdfContentByte to write with
+ * @param document document to write to (only used to get page limit info)
+ * @param documentY starting y position to begin writing at
+ * @return the current height (y position) after writing the columns
+ * @throws DocumentException on error
+ */
+ public float write(PdfContentByte canvas, PdfDocument document, float documentY) throws DocumentException {
+ this.document = document;
+ columnText.setCanvas(canvas);
+ if (columnDefs.size() == 0) {
+ throw new DocumentException("MultiColumnText has no columns");
+ }
+ overflow = false;
+ pageBottom = document.bottom();
+ float currentHeight = 0;
+ boolean done = false;
+ try {
+ while (!done) {
+ if (nextY == AUTOMATIC) {
+ nextY = document.getVerticalPosition(true); // RS - 07/07/2005 - - Get current doc writing position for top of columns on new page.
+ }
+ if (top == AUTOMATIC) {
+ top = document.getVerticalPosition(true); // RS - 07/07/2005 - Get current doc writing position for top of columns on new page.
+ }
+
+ ColumnDef currentDef = (ColumnDef) columnDefs.get(getCurrentColumn());
+ columnText.setYLine(top);
+
+ float[] left = currentDef.resolvePositions(Rectangle.LEFT);
+ float[] right = currentDef.resolvePositions(Rectangle.RIGHT);
+ if (document.isMarginMirroring() && document.getPageNumber() % 2 == 0){
+ float delta = document.rightMargin() - document.left();
+ left = (float[])left.clone();
+ right = (float[])right.clone();
+ for (int i = 0; i < left.length; i += 2) {
+ left[i] -= delta;
+ }
+ for (int i = 0; i < right.length; i += 2) {
+ right[i] -= delta;
+ }
+ }
+
+ currentHeight = Math.max(currentHeight, getHeight(left, right));
+
+ if (currentDef.isSimple()) {
+ columnText.setSimpleColumn(left[2], left[3], right[0], right[1]);
+ } else {
+ columnText.setColumns(left, right);
+ }
+
+ int result = columnText.go();
+ if ((result & ColumnText.NO_MORE_TEXT) != 0) {
+ done = true;
+ top = columnText.getYLine();
+ } else if (shiftCurrentColumn()) {
+ top = nextY;
+ } else { // check if we are done because of height
+ totalHeight += currentHeight;
+ if ((desiredHeight != AUTOMATIC) && (totalHeight >= desiredHeight)) {
+ overflow = true;
+ break;
+ } else { // need to start new page and reset the columns
+ documentY = nextY;
+ newPage();
+ currentHeight = 0;
+ }
+ }
+ }
+ } catch (DocumentException ex) {
+ ex.printStackTrace();
+ throw ex;
+ }
+ if (desiredHeight == AUTOMATIC && columnDefs.size() == 1) {
+ currentHeight = documentY - columnText.getYLine();
+ }
+ return currentHeight;
+ }
+
+ private void newPage() throws DocumentException {
+ resetCurrentColumn();
+ if (desiredHeight == AUTOMATIC) {
+ top = nextY = AUTOMATIC;
+ }
+ else {
+ top = nextY;
+ }
+ totalHeight = 0;
+ if (document != null) {
+ document.newPage();
+ }
+ }
+
+ /**
+ * Figure out the height of a column from the border extents
+ *
+ * @param left left border
+ * @param right right border
+ * @return height
+ */
+ private float getHeight(float[] left, float[] right) {
+ float max = Float.MIN_VALUE;
+ float min = Float.MAX_VALUE;
+ for (int i = 0; i < left.length; i += 2) {
+ min = Math.min(min, left[i + 1]);
+ max = Math.max(max, left[i + 1]);
+ }
+ for (int i = 0; i < right.length; i += 2) {
+ min = Math.min(min, right[i + 1]);
+ max = Math.max(max, right[i + 1]);
+ }
+ return max - min;
+ }
+
+
+ /**
+ * Processes the element by adding it to an
+ * <CODE>ElementListener</CODE>.
+ *
+ * @param listener an <CODE>ElementListener</CODE>
+ * @return <CODE>true</CODE> if the element was processed successfully
+ */
+ public boolean process(ElementListener listener) {
+ try {
+ return listener.add(this);
+ } catch (DocumentException de) {
+ return false;
+ }
+ }
+
+ /**
+ * Gets the type of the text element.
+ *
+ * @return a type
+ */
+
+ public int type() {
+ return Element.MULTI_COLUMN_TEXT;
+ }
+
+ /**
+ * Returns null - not used
+ *
+ * @return null
+ */
+
+ public ArrayList getChunks() {
+ return null;
+ }
+
+ /**
+ * Calculates the appropriate y position for the bottom
+ * of the columns on this page.
+ *
+ * @return the y position of the bottom of the columns
+ */
+ private float getColumnBottom() {
+ if (desiredHeight == AUTOMATIC) {
+ return pageBottom;
+ } else {
+ return Math.max(top - (desiredHeight - totalHeight), pageBottom);
+ }
+ }
+
+ /**
+ * Moves the text insertion point to the beginning of the next column, issuing a page break if
+ * needed.
+ * @throws DocumentException on error
+ */
+ public void nextColumn() throws DocumentException {
+ currentColumn = (currentColumn + 1) % columnDefs.size();
+ top = nextY;
+ if (currentColumn == 0) {
+ newPage();
+ }
+ }
+
+ /**
+ * Gets the current column.
+ * @return the current column
+ */
+ public int getCurrentColumn() {
+ if (columnsRightToLeft) {
+ return (columnDefs.size() - currentColumn - 1);
+ }
+ return currentColumn;
+ }
+
+ /**
+ * Resets the current column.
+ */
+ public void resetCurrentColumn() {
+ currentColumn = 0;
+ }
+
+ /**
+ * Shifts the current column.
+ * @return true if the currentcolumn has changed
+ */
+ public boolean shiftCurrentColumn() {
+ if (currentColumn + 1 < columnDefs.size()) {
+ currentColumn++;
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Sets the direction of the columns.
+ * @param direction true = right2left; false = left2right
+ */
+ public void setColumnsRightToLeft(boolean direction) {
+ columnsRightToLeft = direction;
+ }
+
+ /** Sets the ratio between the extra word spacing and the extra character spacing
+ * when the text is fully justified.
+ * Extra word spacing will grow <CODE>spaceCharRatio</CODE> times more than extra character spacing.
+ * If the ratio is <CODE>PdfWriter.NO_SPACE_CHAR_RATIO</CODE> then the extra character spacing
+ * will be zero.
+ * @param spaceCharRatio the ratio between the extra word spacing and the extra character spacing
+ */
+ public void setSpaceCharRatio(float spaceCharRatio) {
+ columnText.setSpaceCharRatio(spaceCharRatio);
+ }
+
+ /** Sets the run direction.
+ * @param runDirection the run direction
+ */
+ public void setRunDirection(int runDirection) {
+ columnText.setRunDirection(runDirection);
+ }
+
+ /** Sets the arabic shaping options. The option can be AR_NOVOWEL,
+ * AR_COMPOSEDTASHKEEL and AR_LIG.
+ * @param arabicOptions the arabic shaping options
+ */
+ public void setArabicOptions(int arabicOptions) {
+ columnText.setArabicOptions(arabicOptions);
+ }
+
+ /** Sets the default alignment
+ * @param alignment the default alignment
+ */
+ public void setAlignment(int alignment) {
+ columnText.setAlignment(alignment);
+ }
+
+ /**
+ * Inner class used to define a column
+ */
+ private class ColumnDef {
+ private float[] left;
+ private float[] right;
+
+ ColumnDef(float[] newLeft, float[] newRight) {
+ left = newLeft;
+ right = newRight;
+ }
+
+ ColumnDef(float leftPosition, float rightPosition) {
+ left = new float[4];
+ left[0] = leftPosition; // x1
+ left[1] = top; // y1
+ left[2] = leftPosition; // x2
+ if (desiredHeight == AUTOMATIC || top == AUTOMATIC) {
+ left[3] = AUTOMATIC;
+ } else {
+ left[3] = top - desiredHeight;
+ }
+
+ right = new float[4];
+ right[0] = rightPosition; // x1
+ right[1] = top; // y1
+ right[2] = rightPosition; // x2
+ if (desiredHeight == AUTOMATIC || top == AUTOMATIC) {
+ right[3] = AUTOMATIC;
+ } else {
+ right[3] = top - desiredHeight;
+ }
+ }
+
+ /**
+ * Resolves the positions for the specified side of the column
+ * into real numbers once the top of the column is known.
+ *
+ * @param side either <CODE>Rectangle.LEFT</CODE>
+ * or <CODE>Rectangle.RIGHT</CODE>
+ * @return the array of floats for the side
+ */
+ float[] resolvePositions(int side) {
+ if (side == Rectangle.LEFT) {
+ return resolvePositions(left);
+ } else {
+ return resolvePositions(right);
+ }
+ }
+
+ private float[] resolvePositions(float[] positions) {
+ if (!isSimple()) {
+ return positions;
+ }
+ if (top == AUTOMATIC) {
+ // this is bad - must be programmer error
+ throw new RuntimeException("resolvePositions called with top=AUTOMATIC (-1). " +
+ "Top position must be set befure lines can be resolved");
+ }
+ positions[1] = top;
+ positions[3] = getColumnBottom();
+ return positions;
+ }
+
+ /**
+ * Checks if column definition is a simple rectangle
+ * @return true if it is a simple column
+ */
+ private boolean isSimple() {
+ return (left.length == 4 && right.length == 4) && (left[0] == left[2] && right[0] == right[2]);
+ }
+
+ }
+}
diff --git a/src/main/java/com/lowagie/text/pdf/OutputStreamCounter.java b/src/main/java/com/lowagie/text/pdf/OutputStreamCounter.java
new file mode 100644
index 0000000..bae72bc
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/OutputStreamCounter.java
@@ -0,0 +1,170 @@
+/*
+ * Copyright 2004 by Paulo Soares.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+package com.lowagie.text.pdf;
+import java.io.OutputStream;
+import java.io.IOException;
+
+/**
+ *
+ * @author psoares
+ */
+public class OutputStreamCounter extends OutputStream {
+
+ protected OutputStream out;
+ protected int counter = 0;
+
+ /** Creates a new instance of OutputStreamCounter */
+ public OutputStreamCounter(OutputStream out) {
+ this.out = out;
+ }
+
+ /** Closes this output stream and releases any system resources
+ * associated with this stream. The general contract of <code>close</code>
+ * is that it closes the output stream. A closed stream cannot perform
+ * output operations and cannot be reopened.
+ * <p>
+ * The <code>close</code> method of <code>OutputStream</code> does nothing.
+ *
+ * @exception IOException if an I/O error occurs.
+ *
+ */
+ public void close() throws IOException {
+ out.close();
+ }
+
+ /** Flushes this output stream and forces any buffered output bytes
+ * to be written out. The general contract of <code>flush</code> is
+ * that calling it is an indication that, if any bytes previously
+ * written have been buffered by the implementation of the output
+ * stream, such bytes should immediately be written to their
+ * intended destination.
+ * <p>
+ * The <code>flush</code> method of <code>OutputStream</code> does nothing.
+ *
+ * @exception IOException if an I/O error occurs.
+ *
+ */
+ public void flush() throws IOException {
+ out.flush();
+ }
+
+ /** Writes <code>b.length</code> bytes from the specified byte array
+ * to this output stream. The general contract for <code>write(b)</code>
+ * is that it should have exactly the same effect as the call
+ * <code>write(b, 0, b.length)</code>.
+ *
+ * @param b the data.
+ * @exception IOException if an I/O error occurs.
+ * @see java.io.OutputStream#write(byte[], int, int)
+ *
+ */
+ public void write(byte[] b) throws IOException {
+ counter += b.length;
+ out.write(b);
+ }
+
+ /** Writes the specified byte to this output stream. The general
+ * contract for <code>write</code> is that one byte is written
+ * to the output stream. The byte to be written is the eight
+ * low-order bits of the argument <code>b</code>. The 24
+ * high-order bits of <code>b</code> are ignored.
+ * <p>
+ * Subclasses of <code>OutputStream</code> must provide an
+ * implementation for this method.
+ *
+ * @param b the <code>byte</code>.
+ * @exception IOException if an I/O error occurs. In particular,
+ * an <code>IOException</code> may be thrown if the
+ * output stream has been closed.
+ *
+ */
+ public void write(int b) throws IOException {
+ ++counter;
+ out.write(b);
+ }
+
+ /** Writes <code>len</code> bytes from the specified byte array
+ * starting at offset <code>off</code> to this output stream.
+ * The general contract for <code>write(b, off, len)</code> is that
+ * some of the bytes in the array <code>b</code> are written to the
+ * output stream in order; element <code>b[off]</code> is the first
+ * byte written and <code>b[off+len-1]</code> is the last byte written
+ * by this operation.
+ * <p>
+ * The <code>write</code> method of <code>OutputStream</code> calls
+ * the write method of one argument on each of the bytes to be
+ * written out. Subclasses are encouraged to override this method and
+ * provide a more efficient implementation.
+ * <p>
+ * If <code>b</code> is <code>null</code>, a
+ * <code>NullPointerException</code> is thrown.
+ * <p>
+ * If <code>off</code> is negative, or <code>len</code> is negative, or
+ * <code>off+len</code> is greater than the length of the array
+ * <code>b</code>, then an <tt>IndexOutOfBoundsException</tt> is thrown.
+ *
+ * @param b the data.
+ * @param off the start offset in the data.
+ * @param len the number of bytes to write.
+ * @exception IOException if an I/O error occurs. In particular,
+ * an <code>IOException</code> is thrown if the output
+ * stream is closed.
+ *
+ */
+ public void write(byte[] b, int off, int len) throws IOException {
+ counter += len;
+ out.write(b, off, len);
+ }
+
+ public int getCounter() {
+ return counter;
+ }
+
+ public void resetCounter() {
+ counter = 0;
+ }
+}
diff --git a/src/main/java/com/lowagie/text/pdf/PRAcroForm.java b/src/main/java/com/lowagie/text/pdf/PRAcroForm.java
new file mode 100644
index 0000000..986b2ab
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/PRAcroForm.java
@@ -0,0 +1,210 @@
+/*
+ * $Id: PRAcroForm.java,v 1.35 2005/05/04 14:31:42 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2001, 2002 by Paulo Soares.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * This class written by Mark Thompson, Copyright (C) 2002 by Mark Thompson.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.HashMap;
+
+/**
+ * This class captures an AcroForm on input. Basically, it extends Dictionary
+ * by indexing the fields of an AcroForm
+ * @author Mark Thompson
+ */
+
+public class PRAcroForm extends PdfDictionary {
+
+ /**
+ * This class holds the information for a single field
+ */
+ public static class FieldInformation {
+ String name;
+ PdfDictionary info;
+ PRIndirectReference ref;
+
+ FieldInformation(String name, PdfDictionary info, PRIndirectReference ref) {
+ this.name = name; this.info = info; this.ref = ref;
+ }
+ public String getName() { return name; }
+ public PdfDictionary getInfo() { return info; }
+ public PRIndirectReference getRef() { return ref; }
+ };
+ ArrayList fields;
+ ArrayList stack;
+ HashMap fieldByName;
+ PdfReader reader;
+
+ /**
+ * Constructor
+ * @param reader reader of the input file
+ */
+ public PRAcroForm(PdfReader reader) {
+ this.reader = reader;
+ fields = new ArrayList();
+ fieldByName = new HashMap();
+ stack = new ArrayList();
+ }
+ /**
+ * Number of fields found
+ * @return size
+ */
+ public int size() {
+ return fields.size();
+ }
+
+ public ArrayList getFields() {
+ return fields;
+ }
+
+ public FieldInformation getField(String name) {
+ return (FieldInformation)fieldByName.get(name);
+ }
+
+ /**
+ * Given the title (/T) of a reference, return the associated reference
+ * @param name a string containing the path
+ * @return a reference to the field, or null
+ */
+ public PRIndirectReference getRefByName(String name) {
+ FieldInformation fi = (FieldInformation)fieldByName.get(name);
+ if (fi == null) return null;
+ return fi.getRef();
+ }
+ /**
+ * Read, and comprehend the acroform
+ * @param root the docment root
+ */
+ public void readAcroForm(PdfDictionary root) {
+ hashMap = root.hashMap;
+ pushAttrib(root);
+ PdfArray fieldlist = (PdfArray)PdfReader.getPdfObjectRelease(root.get(PdfName.FIELDS));
+ iterateFields(fieldlist, null, null);
+ }
+
+ /**
+ * After reading, we index all of the fields. Recursive.
+ * @param fieldlist An array of fields
+ * @param fieldDict the last field dictionary we encountered (recursively)
+ * @param title the pathname of the field, up to this point or null
+ */
+ protected void iterateFields(PdfArray fieldlist, PRIndirectReference fieldDict, String title) {
+ for (Iterator it = fieldlist.getArrayList().iterator(); it.hasNext();) {
+ PRIndirectReference ref = (PRIndirectReference)it.next();
+ PdfDictionary dict = (PdfDictionary) PdfReader.getPdfObjectRelease(ref);
+
+ // if we are not a field dictionary, pass our parent's values
+ PRIndirectReference myFieldDict = fieldDict;
+ String myTitle = title;
+ PdfString tField = (PdfString)dict.get(PdfName.T);
+ boolean isFieldDict = tField != null;
+
+ if (isFieldDict) {
+ myFieldDict = ref;
+ if (title == null) myTitle = tField.toString();
+ else myTitle = title + '.' + tField.toString();
+ }
+
+ PdfArray kids = (PdfArray)dict.get(PdfName.KIDS);
+ if (kids != null) {
+ pushAttrib(dict);
+ iterateFields(kids, myFieldDict, myTitle);
+ stack.remove(stack.size() - 1); // pop
+ }
+ else { // leaf node
+ if (myFieldDict != null) {
+ PdfDictionary mergedDict = (PdfDictionary)stack.get(stack.size() - 1);
+ if (isFieldDict)
+ mergedDict = mergeAttrib(mergedDict, dict);
+
+ mergedDict.put(PdfName.T, new PdfString(myTitle));
+ FieldInformation fi = new FieldInformation(myTitle, mergedDict, myFieldDict);
+ fields.add(fi);
+ fieldByName.put(myTitle, fi);
+ }
+ }
+ }
+ }
+ /**
+ * merge field attributes from two dictionaries
+ * @param parent one dictionary
+ * @param child the other dictionary
+ * @return a merged dictionary
+ */
+ protected PdfDictionary mergeAttrib(PdfDictionary parent, PdfDictionary child) {
+ PdfDictionary targ = new PdfDictionary();
+ if (parent != null) targ.putAll(parent);
+
+ for (Iterator it = child.getKeys().iterator(); it.hasNext();) {
+ PdfName key = (PdfName) it.next();
+ if (key.equals(PdfName.DR) || key.equals(PdfName.DA) ||
+ key.equals(PdfName.Q) || key.equals(PdfName.FF) ||
+ key.equals(PdfName.DV) || key.equals(PdfName.V)
+ || key.equals(PdfName.FT)
+ || key.equals(PdfName.F)) {
+ targ.put(key,child.get(key));
+ }
+ }
+ return targ;
+ }
+ /**
+ * stack a level of dictionary. Merge in a dictionary from this level
+ */
+ protected void pushAttrib(PdfDictionary dict) {
+ PdfDictionary dic = null;
+ if (stack.size() != 0) {
+ dic = (PdfDictionary)stack.get(stack.size() - 1);
+ }
+ dic = mergeAttrib(dic, dict);
+ stack.add(dic);
+ }
+}
diff --git a/src/main/java/com/lowagie/text/pdf/PRIndirectReference.java b/src/main/java/com/lowagie/text/pdf/PRIndirectReference.java
new file mode 100644
index 0000000..2ff852f
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/PRIndirectReference.java
@@ -0,0 +1,103 @@
+/*
+ * $Id: PRIndirectReference.java,v 1.46 2005/05/04 14:33:11 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2001, 2002 by Paulo Soares.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf;
+import java.io.OutputStream;
+import java.io.IOException;
+
+public class PRIndirectReference extends PdfIndirectReference {
+
+ protected PdfReader reader;
+ // membervariables
+
+ // constructors
+
+/**
+ * Constructs a <CODE>PdfIndirectReference</CODE>.
+ *
+ * @param reader a <CODE>PdfReader</CODE>
+ * @param number the object number.
+ * @param generation the generation number.
+ */
+
+ PRIndirectReference(PdfReader reader, int number, int generation) {
+ type = INDIRECT;
+ this.number = number;
+ this.generation = generation;
+ this.reader = reader;
+ }
+
+/**
+ * Constructs a <CODE>PdfIndirectReference</CODE>.
+ *
+ * @param reader a <CODE>PdfReader</CODE>
+ * @param number the object number.
+ */
+
+ PRIndirectReference(PdfReader reader, int number) {
+ this(reader, number, 0);
+ }
+
+ // methods
+
+ public void toPdf(PdfWriter writer, OutputStream os) throws IOException {
+ int n = writer.getNewObjectNumber(reader, number, generation);
+ os.write(PdfEncodings.convertToBytes(new StringBuffer().append(n).append(" 0 R").toString(), null));
+ }
+
+ public PdfReader getReader() {
+ return reader;
+ }
+
+ public void setNumber(int number, int generation) {
+ this.number = number;
+ this.generation = generation;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/pdf/PRStream.java b/src/main/java/com/lowagie/text/pdf/PRStream.java
new file mode 100644
index 0000000..272a45f
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/PRStream.java
@@ -0,0 +1,229 @@
+/*
+ * $Id: PRStream.java,v 1.46 2005/05/04 14:32:34 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2001, 2002 by Paulo Soares.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf;
+
+import java.io.*;
+import com.lowagie.text.ExceptionConverter;
+import java.util.zip.DeflaterOutputStream;
+import com.lowagie.text.Document;
+import java.io.OutputStream;
+import java.io.IOException;
+
+public class PRStream extends PdfStream {
+
+ protected PdfReader reader;
+ protected int offset;
+ protected int length;
+
+ //added by ujihara for decryption
+ protected int objNum = 0;
+ protected int objGen = 0;
+
+ public PRStream(PRStream stream, PdfDictionary newDic) {
+ reader = stream.reader;
+ offset = stream.offset;
+ length = stream.length;
+ compressed = stream.compressed;
+ streamBytes = stream.streamBytes;
+ bytes = stream.bytes;
+ objNum = stream.objNum;
+ objGen = stream.objGen;
+ if (newDic != null)
+ putAll(newDic);
+ else
+ hashMap.putAll(stream.hashMap);
+ }
+
+ public PRStream(PRStream stream, PdfDictionary newDic, PdfReader reader) {
+ this(stream, newDic);
+ this.reader = reader;
+ }
+
+ public PRStream(PdfReader reader, int offset) {
+ this.reader = reader;
+ this.offset = offset;
+ }
+
+ public PRStream(PdfReader reader, byte conts[]) {
+ this.reader = reader;
+ this.offset = -1;
+ if (Document.compress) {
+ try {
+ ByteArrayOutputStream stream = new ByteArrayOutputStream();
+ DeflaterOutputStream zip = new DeflaterOutputStream(stream);
+ zip.write(conts);
+ zip.close();
+ bytes = stream.toByteArray();
+ }
+ catch (IOException ioe) {
+ throw new ExceptionConverter(ioe);
+ }
+ put(PdfName.FILTER, PdfName.FLATEDECODE);
+ }
+ else
+ bytes = conts;
+ setLength(bytes.length);
+ }
+
+ /**Sets the data associated with the stream
+ * @param data raw data, decrypted and uncompressed.
+ */
+ public void setData(byte[] data) {
+ remove(PdfName.FILTER);
+ this.offset = -1;
+ if (Document.compress) {
+ try {
+ ByteArrayOutputStream stream = new ByteArrayOutputStream();
+ DeflaterOutputStream zip = new DeflaterOutputStream(stream);
+ zip.write(data);
+ zip.close();
+ bytes = stream.toByteArray();
+ }
+ catch (IOException ioe) {
+ throw new ExceptionConverter(ioe);
+ }
+ put(PdfName.FILTER, PdfName.FLATEDECODE);
+ }
+ else
+ bytes = data;
+ setLength(bytes.length);
+ }
+
+ public void setLength(int length) {
+ this.length = length;
+ put(PdfName.LENGTH, new PdfNumber(length));
+ }
+
+ public int getOffset() {
+ return offset;
+ }
+
+ public int getLength() {
+ return length;
+ }
+
+ public PdfReader getReader() {
+ return reader;
+ }
+
+ public byte[] getBytes() {
+ return bytes;
+ }
+
+ public void setObjNum(int objNum, int objGen) {
+ this.objNum = objNum;
+ this.objGen = objGen;
+ }
+
+ int getObjNum() {
+ return objNum;
+ }
+
+ int getObjGen() {
+ return objGen;
+ }
+
+ public void toPdf(PdfWriter writer, OutputStream os) throws IOException {
+ superToPdf(writer, os);
+ os.write(STARTSTREAM);
+ if (length > 0) {
+ PdfEncryption crypto = null;
+ if (writer != null)
+ crypto = writer.getEncryption();
+ if (offset < 0) {
+ if (crypto == null)
+ os.write(bytes);
+ else {
+ crypto.prepareKey();
+ byte buf[] = new byte[length];
+ System.arraycopy(bytes, 0, buf, 0, length);
+ crypto.encryptRC4(buf);
+ os.write(buf);
+ }
+ }
+ else {
+ byte buf[] = new byte[Math.min(length, 4092)];
+ RandomAccessFileOrArray file = writer.getReaderFile(reader);
+ boolean isOpen = file.isOpen();
+ try {
+ file.seek(offset);
+ int size = length;
+
+ //added by ujihara for decryption
+ PdfEncryption decrypt = reader.getDecrypt();
+ if (decrypt != null) {
+ decrypt.setHashKey(objNum, objGen);
+ decrypt.prepareKey();
+ }
+
+ if (crypto != null)
+ crypto.prepareKey();
+ while (size > 0) {
+ int r = file.read(buf, 0, Math.min(size, buf.length));
+ size -= r;
+
+ if (decrypt != null)
+ decrypt.encryptRC4(buf, 0, r); //added by ujihara for decryption
+
+ if (crypto != null)
+ crypto.encryptRC4(buf, 0, r);
+ os.write(buf, 0, r);
+ }
+ }
+ finally {
+ if (!isOpen)
+ try{file.close();}catch(Exception e){}
+ }
+ }
+ }
+ os.write(ENDSTREAM);
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/pdf/PRTokeniser.java b/src/main/java/com/lowagie/text/pdf/PRTokeniser.java
new file mode 100644
index 0000000..9aaa881
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/PRTokeniser.java
@@ -0,0 +1,585 @@
+/*
+ * $Id: PRTokeniser.java,v 1.51 2005/12/22 18:29:21 psoares33 Exp $
+ *
+ * Copyright 2001, 2002 by Paulo Soares.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf;
+
+import java.io.*;
+/**
+ *
+ * @author Paulo Soares (psoares@consiste.pt)
+ */
+public class PRTokeniser {
+
+ public static final int TK_NUMBER = 1;
+ public static final int TK_STRING = 2;
+ public static final int TK_NAME = 3;
+ public static final int TK_COMMENT = 4;
+ public static final int TK_START_ARRAY = 5;
+ public static final int TK_END_ARRAY = 6;
+ public static final int TK_START_DIC = 7;
+ public static final int TK_END_DIC = 8;
+ public static final int TK_REF = 9;
+ public static final int TK_OTHER = 10;
+ public static final boolean delims[] = {
+ true, true, false, false, false, false, false, false, false, false,
+ true, true, false, true, true, false, false, false, false, false,
+ false, false, false, false, false, false, false, false, false, false,
+ false, false, false, true, false, false, false, false, true, false,
+ false, true, true, false, false, false, false, false, true, false,
+ false, false, false, false, false, false, false, false, false, false,
+ false, true, false, true, false, false, false, false, false, false,
+ false, false, false, false, false, false, false, false, false, false,
+ false, false, false, false, false, false, false, false, false, false,
+ false, false, true, false, true, false, false, false, false, false,
+ false, false, false, false, false, false, false, false, false, false,
+ false, false, false, false, false, false, false, false, false, false,
+ false, false, false, false, false, false, false, false, false, false,
+ false, false, false, false, false, false, false, false, false, false,
+ false, false, false, false, false, false, false, false, false, false,
+ false, false, false, false, false, false, false, false, false, false,
+ false, false, false, false, false, false, false, false, false, false,
+ false, false, false, false, false, false, false, false, false, false,
+ false, false, false, false, false, false, false, false, false, false,
+ false, false, false, false, false, false, false, false, false, false,
+ false, false, false, false, false, false, false, false, false, false,
+ false, false, false, false, false, false, false, false, false, false,
+ false, false, false, false, false, false, false, false, false, false,
+ false, false, false, false, false, false, false, false, false, false,
+ false, false, false, false, false, false, false, false, false, false,
+ false, false, false, false, false, false, false};
+
+ static final String EMPTY = "";
+
+
+ protected RandomAccessFileOrArray file;
+ protected int type;
+ protected String stringValue;
+ protected int reference;
+ protected int generation;
+ protected boolean hexString;
+
+ private static final int LINE_SEGMENT_SIZE = 256;
+
+ public PRTokeniser(String filename) throws IOException {
+ file = new RandomAccessFileOrArray(filename);
+ }
+
+ public PRTokeniser(byte pdfIn[]) {
+ file = new RandomAccessFileOrArray(pdfIn);
+ }
+
+ public PRTokeniser(RandomAccessFileOrArray file) {
+ this.file = file;
+ }
+
+ public void seek(int pos) throws IOException {
+ file.seek(pos);
+ }
+
+ public int getFilePointer() throws IOException {
+ return file.getFilePointer();
+ }
+
+ public void close() throws IOException {
+ file.close();
+ }
+
+ public int length() throws IOException {
+ return file.length();
+ }
+
+ public int read() throws IOException {
+ return file.read();
+ }
+
+ public RandomAccessFileOrArray getSafeFile() {
+ return new RandomAccessFileOrArray(file);
+ }
+
+ public RandomAccessFileOrArray getFile() {
+ return file;
+ }
+
+ public String readString(int size) throws IOException {
+ StringBuffer buf = new StringBuffer();
+ int ch;
+ while ((size--) > 0) {
+ ch = file.read();
+ if (ch == -1)
+ break;
+ buf.append((char)ch);
+ }
+ return buf.toString();
+ }
+
+ public static final boolean isWhitespace(int ch) {
+ return (ch == 0 || ch == 9 || ch == 10 || ch == 12 || ch == 13 || ch == 32);
+ }
+
+ public static final boolean isDelimiter(int ch) {
+ return (ch == '(' || ch == ')' || ch == '<' || ch == '>' || ch == '[' || ch == ']' || ch == '/' || ch == '%');
+ }
+
+ public static final boolean isDelimiterWhitespace(int ch) {
+ return delims[ch + 1];
+ }
+
+ public int getTokenType() {
+ return type;
+ }
+
+ public String getStringValue() {
+ return stringValue;
+ }
+
+ public int getReference() {
+ return reference;
+ }
+
+ public int getGeneration() {
+ return generation;
+ }
+
+ public void backOnePosition(int ch) throws IOException {
+ if (ch != -1)
+ file.pushBack((byte)ch);
+ }
+
+ public void throwError(String error) throws IOException {
+ throw new IOException(error + " at file pointer " + file.getFilePointer());
+ }
+
+ public char checkPdfHeader() throws IOException {
+ file.setStartOffset(0);
+ String str = readString(1024);
+ int idx = str.indexOf("%PDF-1.");
+ if (idx < 0)
+ throw new IOException("PDF header signature not found.");
+ file.setStartOffset(idx);
+ return str.charAt(idx + 7);
+ }
+
+ public void checkFdfHeader() throws IOException {
+ file.setStartOffset(0);
+ String str = readString(1024);
+ int idx = str.indexOf("%FDF-1.2");
+ if (idx < 0)
+ throw new IOException("FDF header signature not found.");
+ file.setStartOffset(idx);
+ }
+
+ public int getStartxref() throws IOException {
+ int size = Math.min(1024, file.length());
+ int pos = file.length() - size;
+ file.seek(pos);
+ String str = readString(1024);
+ int idx = str.lastIndexOf("startxref");
+ if (idx < 0)
+ throw new IOException("PDF startxref not found.");
+ return pos + idx;
+ }
+
+ public static int getHex(int v) {
+ if (v >= '0' && v <= '9')
+ return v - '0';
+ if (v >= 'A' && v <= 'F')
+ return v - 'A' + 10;
+ if (v >= 'a' && v <= 'f')
+ return v - 'a' + 10;
+ return -1;
+ }
+
+ public void nextValidToken() throws IOException {
+ int level = 0;
+ String n1 = null;
+ String n2 = null;
+ int ptr = 0;
+ while (nextToken()) {
+ if (type == TK_COMMENT)
+ continue;
+ switch (level) {
+ case 0:
+ {
+ if (type != TK_NUMBER)
+ return;
+ ptr = file.getFilePointer();
+ n1 = stringValue;
+ ++level;
+ break;
+ }
+ case 1:
+ {
+ if (type != TK_NUMBER) {
+ file.seek(ptr);
+ type = TK_NUMBER;
+ stringValue = n1;
+ return;
+ }
+ n2 = stringValue;
+ ++level;
+ break;
+ }
+ default:
+ {
+ if (type != TK_OTHER || !stringValue.equals("R")) {
+ file.seek(ptr);
+ type = TK_NUMBER;
+ stringValue = n1;
+ return;
+ }
+ type = TK_REF;
+ reference = Integer.parseInt(n1);
+ generation = Integer.parseInt(n2);
+ return;
+ }
+ }
+ }
+ throwError("Unexpected end of file");
+ }
+
+ public boolean nextToken() throws IOException {
+ StringBuffer outBuf = null;
+ stringValue = EMPTY;
+ int ch = 0;
+ do {
+ ch = file.read();
+ } while (ch != -1 && isWhitespace(ch));
+ if (ch == -1)
+ return false;
+ switch (ch) {
+ case '[':
+ type = TK_START_ARRAY;
+ break;
+ case ']':
+ type = TK_END_ARRAY;
+ break;
+ case '/':
+ {
+ outBuf = new StringBuffer();
+ type = TK_NAME;
+ while (true) {
+ ch = file.read();
+ if (delims[ch + 1])
+ break;
+ if (ch == '#') {
+ ch = (getHex(file.read()) << 4) + getHex(file.read());
+ }
+ outBuf.append((char)ch);
+ }
+ backOnePosition(ch);
+ break;
+ }
+ case '>':
+ ch = file.read();
+ if (ch != '>')
+ throwError("'>' not expected");
+ type = TK_END_DIC;
+ break;
+ case '<':
+ {
+ int v1 = file.read();
+ if (v1 == '<') {
+ type = TK_START_DIC;
+ break;
+ }
+ outBuf = new StringBuffer();
+ type = TK_STRING;
+ hexString = true;
+ int v2 = 0;
+ while (true) {
+ while (isWhitespace(v1))
+ v1 = file.read();
+ if (v1 == '>')
+ break;
+ v1 = getHex(v1);
+ if (v1 < 0)
+ break;
+ v2 = file.read();
+ while (isWhitespace(v2))
+ v2 = file.read();
+ if (v2 == '>') {
+ ch = v1 << 4;
+ outBuf.append((char)ch);
+ break;
+ }
+ v2 = getHex(v2);
+ if (v2 < 0)
+ break;
+ ch = (v1 << 4) + v2;
+ outBuf.append((char)ch);
+ v1 = file.read();
+ }
+ if (v1 < 0 || v2 < 0)
+ throwError("Error reading string");
+ break;
+ }
+ case '%':
+ type = TK_COMMENT;
+ do {
+ ch = file.read();
+ } while (ch != -1 && ch != '\r' && ch != '\n');
+ break;
+ case '(':
+ {
+ outBuf = new StringBuffer();
+ type = TK_STRING;
+ hexString = false;
+ int nesting = 0;
+ while (true) {
+ ch = file.read();
+ if (ch == -1)
+ break;
+ if (ch == '(') {
+ ++nesting;
+ }
+ else if (ch == ')') {
+ --nesting;
+ }
+ else if (ch == '\\') {
+ boolean lineBreak = false;
+ ch = file.read();
+ switch (ch) {
+ case 'n':
+ ch = '\n';
+ break;
+ case 'r':
+ ch = '\r';
+ break;
+ case 't':
+ ch = '\t';
+ break;
+ case 'b':
+ ch = '\b';
+ break;
+ case 'f':
+ ch = '\f';
+ break;
+ case '(':
+ case ')':
+ case '\\':
+ break;
+ case '\r':
+ lineBreak = true;
+ ch = file.read();
+ if (ch != '\n')
+ backOnePosition(ch);
+ break;
+ case '\n':
+ lineBreak = true;
+ break;
+ default:
+ {
+ if (ch < '0' || ch > '7') {
+ break;
+ }
+ int octal = ch - '0';
+ ch = file.read();
+ if (ch < '0' || ch > '7') {
+ backOnePosition(ch);
+ ch = octal;
+ break;
+ }
+ octal = (octal << 3) + ch - '0';
+ ch = file.read();
+ if (ch < '0' || ch > '7') {
+ backOnePosition(ch);
+ ch = octal;
+ break;
+ }
+ octal = (octal << 3) + ch - '0';
+ ch = octal & 0xff;
+ break;
+ }
+ }
+ if (lineBreak)
+ continue;
+ if (ch < 0)
+ break;
+ }
+ else if (ch == '\r') {
+ ch = file.read();
+ if (ch < 0)
+ break;
+ if (ch != '\n') {
+ backOnePosition(ch);
+ ch = '\n';
+ }
+ }
+ if (nesting == -1)
+ break;
+ outBuf.append((char)ch);
+ }
+ if (ch == -1)
+ throwError("Error reading string");
+ break;
+ }
+ default:
+ {
+ outBuf = new StringBuffer();
+ if (ch == '-' || ch == '+' || ch == '.' || (ch >= '0' && ch <= '9')) {
+ type = TK_NUMBER;
+ do {
+ outBuf.append((char)ch);
+ ch = file.read();
+ } while (ch != -1 && ((ch >= '0' && ch <= '9') || ch == '.'));
+ }
+ else {
+ type = TK_OTHER;
+ do {
+ outBuf.append((char)ch);
+ ch = file.read();
+ } while (!delims[ch + 1]);
+ }
+ backOnePosition(ch);
+ break;
+ }
+ }
+ if (outBuf != null)
+ stringValue = outBuf.toString();
+ return true;
+ }
+
+ public int intValue() {
+ return Integer.parseInt(stringValue);
+ }
+
+ public boolean readLineSegment(byte input[]) throws IOException {
+ int c = -1;
+ boolean eol = false;
+ int ptr = 0;
+ int len = input.length;
+ // ssteward, pdftk-1.10, 040922:
+ // skip initial whitespace; added this because PdfReader.rebuildXref()
+ // assumes that line provided by readLineSegment does not have init. whitespace;
+ if ( ptr < len ) {
+ while ( isWhitespace( (c = read()) ) );
+ }
+ while ( !eol && ptr < len ) {
+ switch (c) {
+ case -1:
+ case '\n':
+ eol = true;
+ break;
+ case '\r':
+ eol = true;
+ int cur = getFilePointer();
+ if ((read()) != '\n') {
+ seek(cur);
+ }
+ break;
+ default:
+ input[ptr++] = (byte)c;
+ break;
+ }
+
+ // break loop? do it before we read() again
+ if( eol || len <= ptr ) {
+ break;
+ }
+ else {
+ c = read();
+ }
+ }
+ if (ptr >= len) {
+ eol = false;
+ while (!eol) {
+ switch (c = read()) {
+ case -1:
+ case '\n':
+ eol = true;
+ break;
+ case '\r':
+ eol = true;
+ int cur = getFilePointer();
+ if ((read()) != '\n') {
+ seek(cur);
+ }
+ break;
+ }
+ }
+ }
+
+ if ((c == -1) && (ptr == 0)) {
+ return false;
+ }
+ if (ptr + 2 <= len) {
+ input[ptr++] = (byte)' ';
+ input[ptr] = (byte)'X';
+ }
+ return true;
+ }
+
+ public static int[] checkObjectStart(byte line[]) {
+ try {
+ PRTokeniser tk = new PRTokeniser(line);
+ int num = 0;
+ int gen = 0;
+ if (!tk.nextToken() || tk.getTokenType() != TK_NUMBER)
+ return null;
+ num = tk.intValue();
+ if (!tk.nextToken() || tk.getTokenType() != TK_NUMBER)
+ return null;
+ gen = tk.intValue();
+ if (!tk.nextToken())
+ return null;
+ if (!tk.getStringValue().equals("obj"))
+ return null;
+ return new int[]{num, gen};
+ }
+ catch (Exception ioe) {
+ // empty on purpose
+ }
+ return null;
+ }
+
+ public boolean isHexString() {
+ return this.hexString;
+ }
+
+}
diff --git a/src/main/java/com/lowagie/text/pdf/PageResources.java b/src/main/java/com/lowagie/text/pdf/PageResources.java
new file mode 100644
index 0000000..e065945
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/PageResources.java
@@ -0,0 +1,187 @@
+/*
+ * $Id: PageResources.java,v 1.14 2005/10/17 17:35:34 psoares33 Exp $
+ *
+ * Copyright 2003-2005 by Paulo Soares.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+package com.lowagie.text.pdf;
+
+import java.util.HashMap;
+import java.util.Iterator;
+
+class PageResources {
+
+ protected PdfDictionary fontDictionary = new PdfDictionary();
+ protected PdfDictionary xObjectDictionary = new PdfDictionary();
+ protected PdfDictionary colorDictionary = new PdfDictionary();
+ protected PdfDictionary patternDictionary = new PdfDictionary();
+ protected PdfDictionary shadingDictionary = new PdfDictionary();
+ protected PdfDictionary extGStateDictionary = new PdfDictionary();
+ protected PdfDictionary propertyDictionary = new PdfDictionary();
+ protected HashMap forbiddenNames;
+ protected PdfDictionary originalResources;
+ protected int namePtr[] = {0};
+ protected HashMap usedNames;
+
+ PageResources() {
+ }
+
+ void setOriginalResources(PdfDictionary resources, int newNamePtr[]) {
+ if (newNamePtr != null)
+ namePtr = newNamePtr;
+ originalResources = resources;
+ forbiddenNames = new HashMap();
+ usedNames = new HashMap();
+ if (resources == null)
+ return;
+ for (Iterator i = resources.getKeys().iterator(); i.hasNext();) {
+ PdfObject sub = PdfReader.getPdfObject(resources.get((PdfName)i.next()));
+ if (sub.isDictionary()) {
+ PdfDictionary dic = (PdfDictionary)sub;
+ for (Iterator j = dic.getKeys().iterator(); j.hasNext();) {
+ forbiddenNames.put(j.next(), null);
+ }
+ }
+ }
+ }
+
+ PdfName translateName(PdfName name) {
+ PdfName translated = name;
+ if (forbiddenNames != null) {
+ translated = (PdfName)usedNames.get(name);
+ if (translated == null) {
+ while (true) {
+ translated = new PdfName("Xi" + (namePtr[0]++));
+ if (!forbiddenNames.containsKey(translated))
+ break;
+ }
+ usedNames.put(name, translated);
+ }
+ }
+ return translated;
+ }
+
+ PdfName addFont(PdfName name, PdfIndirectReference reference) {
+ name = translateName(name);
+ fontDictionary.put(name, reference);
+ return name;
+ }
+
+ PdfName addXObject(PdfName name, PdfIndirectReference reference) {
+ name = translateName(name);
+ xObjectDictionary.put(name, reference);
+ return name;
+ }
+
+ PdfName addColor(PdfName name, PdfIndirectReference reference) {
+ name = translateName(name);
+ colorDictionary.put(name, reference);
+ return name;
+ }
+
+ void addDefaultColor(PdfName name, PdfObject obj) {
+ if (obj == null || obj.isNull())
+ colorDictionary.remove(name);
+ else
+ colorDictionary.put(name, obj);
+ }
+
+ void addDefaultColor(PdfDictionary dic) {
+ colorDictionary.merge(dic);
+ }
+
+ void addDefaultColorDiff(PdfDictionary dic) {
+ colorDictionary.mergeDifferent(dic);
+ }
+
+ PdfName addShading(PdfName name, PdfIndirectReference reference) {
+ name = translateName(name);
+ shadingDictionary.put(name, reference);
+ return name;
+ }
+
+ PdfName addPattern(PdfName name, PdfIndirectReference reference) {
+ name = translateName(name);
+ patternDictionary.put(name, reference);
+ return name;
+ }
+
+ PdfName addExtGState(PdfName name, PdfIndirectReference reference) {
+ name = translateName(name);
+ extGStateDictionary.put(name, reference);
+ return name;
+ }
+
+ PdfName addProperty(PdfName name, PdfIndirectReference reference) {
+ name = translateName(name);
+ propertyDictionary.put(name, reference);
+ return name;
+ }
+
+ PdfDictionary getResources() {
+ PdfResources resources = new PdfResources();
+ if (originalResources != null)
+ resources.putAll(originalResources);
+ resources.put(PdfName.PROCSET, new PdfLiteral("[/PDF /Text /ImageB /ImageC /ImageI]"));
+ resources.add(PdfName.FONT, fontDictionary);
+ resources.add(PdfName.XOBJECT, xObjectDictionary);
+ resources.add(PdfName.COLORSPACE, colorDictionary);
+ resources.add(PdfName.PATTERN, patternDictionary);
+ resources.add(PdfName.SHADING, shadingDictionary);
+ resources.add(PdfName.EXTGSTATE, extGStateDictionary);
+ resources.add(PdfName.PROPERTIES, propertyDictionary);
+ return resources;
+ }
+
+ boolean hasResources() {
+ return (fontDictionary.size() > 0
+ || xObjectDictionary.size() > 0
+ || colorDictionary.size() > 0
+ || patternDictionary.size() > 0
+ || shadingDictionary.size() > 0
+ || extGStateDictionary.size() > 0
+ || propertyDictionary.size() > 0);
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/pdf/PatternColor.java b/src/main/java/com/lowagie/text/pdf/PatternColor.java
new file mode 100644
index 0000000..4268e1c
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/PatternColor.java
@@ -0,0 +1,79 @@
+/*
+ * Copyright 2004 by Paulo Soares.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+package com.lowagie.text.pdf;
+
+/** Represents a pattern. Can be used in high-level constructs (Paragraph, Cell, etc.).
+ */
+public class PatternColor extends ExtendedColor {
+ /**
+ * The actual pattern.
+ */
+ PdfPatternPainter painter;
+
+ /** Creates a color representing a pattern.
+ * @param painter the actual pattern
+ */
+ public PatternColor(PdfPatternPainter painter) {
+ super(TYPE_PATTERN, .5f, .5f, .5f);
+ this.painter = painter;
+ }
+
+ /** Gets the pattern.
+ * @return the pattern
+ */
+ public PdfPatternPainter getPainter() {
+ return this.painter;
+ }
+
+ public boolean equals(Object obj) {
+ return this == obj;
+ }
+
+ public int hashCode() {
+ return painter.hashCode();
+ }
+}
diff --git a/src/main/java/com/lowagie/text/pdf/PdfAcroForm.java b/src/main/java/com/lowagie/text/pdf/PdfAcroForm.java
new file mode 100644
index 0000000..7893eb8
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/PdfAcroForm.java
@@ -0,0 +1,744 @@
+/*
+ * $Id: PdfAcroForm.java,v 1.44 2005/03/30 10:10:58 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2002 Bruno Lowagie
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf;
+
+import java.util.Iterator;
+import java.util.HashMap;
+
+import com.lowagie.text.Rectangle;
+import com.lowagie.text.ExceptionConverter;
+
+/**
+ * Each PDF document can contain maximum 1 AcroForm.
+ */
+
+public class PdfAcroForm extends PdfDictionary {
+
+ private PdfWriter writer;
+
+
+ /** This is a map containing FieldTemplates. */
+ private HashMap fieldTemplates = new HashMap();
+
+ /** This is an array containing DocumentFields. */
+ private PdfArray documentFields = new PdfArray();
+
+ /** This is an array containing the calculationorder of the fields. */
+ private PdfArray calculationOrder = new PdfArray();
+
+ /** Contains the signature flags. */
+ private int sigFlags = 0;
+
+ /** Creates new PdfAcroForm
+ * @param writer*/
+ PdfAcroForm(PdfWriter writer) {
+ super();
+ this.writer = writer;
+ }
+
+ /**
+ * Adds fieldTemplates.
+ * @param ft
+ */
+
+ void addFieldTemplates(HashMap ft) {
+ fieldTemplates.putAll(ft);
+ }
+
+ /**
+ * Adds documentFields.
+ * @param ref
+ */
+
+ void addDocumentField(PdfIndirectReference ref) {
+ documentFields.add(ref);
+ }
+
+ /**
+ * Checks if the Acroform is valid
+ * @return true if the Acroform is valid
+ */
+
+ boolean isValid() {
+ if (documentFields.size() == 0) return false;
+ put(PdfName.FIELDS, documentFields);
+ if (sigFlags != 0)
+ put(PdfName.SIGFLAGS, new PdfNumber(sigFlags));
+ if (calculationOrder.size() > 0)
+ put(PdfName.CO, calculationOrder);
+ if (fieldTemplates.size() == 0) return true;
+ PdfDictionary dic = new PdfDictionary();
+ for (Iterator it = fieldTemplates.keySet().iterator(); it.hasNext();) {
+ PdfTemplate template = (PdfTemplate)it.next();
+ PdfFormField.mergeResources(dic, (PdfDictionary)template.getResources());
+ }
+ put(PdfName.DR, dic);
+ PdfDictionary fonts = (PdfDictionary)dic.get(PdfName.FONT);
+ if (fonts != null) {
+ put(PdfName.DA, new PdfString("/Helv 0 Tf 0 g "));
+ writer.eliminateFontSubset(fonts);
+ }
+ return true;
+ }
+
+ /**
+ * Adds an object to the calculationOrder.
+ * @param formField
+ */
+
+ public void addCalculationOrder(PdfFormField formField) {
+ calculationOrder.add(formField.getIndirectReference());
+ }
+
+ /**
+ * Sets the signature flags.
+ * @param f
+ */
+
+ public void setSigFlags(int f) {
+ sigFlags |= f;
+ }
+
+ /**
+ * Adds a formfield to the AcroForm.
+ * @param formField
+ */
+
+ public void addFormField(PdfFormField formField) {
+ writer.addAnnotation(formField);
+ }
+
+ /**
+ * @param name
+ * @param caption
+ * @param value
+ * @param url
+ * @param font
+ * @param fontSize
+ * @param llx
+ * @param lly
+ * @param urx
+ * @param ury
+ * @return a PdfFormField
+ */
+ public PdfFormField addHtmlPostButton(String name, String caption, String value, String url, BaseFont font, float fontSize, float llx, float lly, float urx, float ury) {
+ PdfAction action = PdfAction.createSubmitForm(url, null, PdfAction.SUBMIT_HTML_FORMAT);
+ PdfFormField button = new PdfFormField(writer, llx, lly, urx, ury, action);
+ setButtonParams(button, PdfFormField.FF_PUSHBUTTON, name, value);
+ drawButton(button, caption, font, fontSize, llx, lly, urx, ury);
+ addFormField(button);
+ return button;
+ }
+
+ /**
+ * @param name
+ * @param caption
+ * @param value
+ * @param font
+ * @param fontSize
+ * @param llx
+ * @param lly
+ * @param urx
+ * @param ury
+ * @return a PdfFormField
+ */
+ public PdfFormField addResetButton(String name, String caption, String value, BaseFont font, float fontSize, float llx, float lly, float urx, float ury) {
+ PdfAction action = PdfAction.createResetForm(null, 0);
+ PdfFormField button = new PdfFormField(writer, llx, lly, urx, ury, action);
+ setButtonParams(button, PdfFormField.FF_PUSHBUTTON, name, value);
+ drawButton(button, caption, font, fontSize, llx, lly, urx, ury);
+ addFormField(button);
+ return button;
+ }
+
+ /**
+ * @param name
+ * @param value
+ * @param url
+ * @param appearance
+ * @param llx
+ * @param lly
+ * @param urx
+ * @param ury
+ * @return a PdfFormField
+ */
+ public PdfFormField addMap(String name, String value, String url, PdfContentByte appearance, float llx, float lly, float urx, float ury) {
+ PdfAction action = PdfAction.createSubmitForm(url, null, PdfAction.SUBMIT_HTML_FORMAT | PdfAction.SUBMIT_COORDINATES);
+ PdfFormField button = new PdfFormField(writer, llx, lly, urx, ury, action);
+ setButtonParams(button, PdfFormField.FF_PUSHBUTTON, name, null);
+ PdfContentByte cb = writer.getDirectContent();
+ PdfAppearance pa = cb.createAppearance(urx - llx, ury - lly);
+ pa.add(appearance);
+ button.setAppearance(PdfAnnotation.APPEARANCE_NORMAL, pa);
+ addFormField(button);
+ return button;
+ }
+
+ /**
+ * @param button
+ * @param characteristics
+ * @param name
+ * @param value
+ */
+ public void setButtonParams(PdfFormField button, int characteristics, String name, String value) {
+ button.setButton(characteristics);
+ button.setFlags(PdfAnnotation.FLAGS_PRINT);
+ button.setPage();
+ button.setFieldName(name);
+ if (value != null) button.setValueAsString(value);
+ }
+
+ /**
+ * @param button
+ * @param caption
+ * @param font
+ * @param fontSize
+ * @param llx
+ * @param lly
+ * @param urx
+ * @param ury
+ */
+ public void drawButton(PdfFormField button, String caption, BaseFont font, float fontSize, float llx, float lly, float urx, float ury) {
+ PdfContentByte cb = writer.getDirectContent();
+ PdfAppearance pa = cb.createAppearance(urx - llx, ury - lly);
+ pa.drawButton(0f, 0f, urx - llx, ury - lly, caption, font, fontSize);
+ button.setAppearance(PdfAnnotation.APPEARANCE_NORMAL, pa);
+ }
+
+ /**
+ * @param name
+ * @param value
+ * @return a PdfFormField
+ */
+ public PdfFormField addHiddenField(String name, String value) {
+ PdfFormField hidden = PdfFormField.createEmpty(writer);
+ hidden.setFieldName(name);
+ hidden.setValueAsName(value);
+ addFormField(hidden);
+ return hidden;
+ }
+
+ /**
+ * @param name
+ * @param text
+ * @param font
+ * @param fontSize
+ * @param llx
+ * @param lly
+ * @param urx
+ * @param ury
+ * @return a PdfFormField
+ */
+ public PdfFormField addSingleLineTextField(String name, String text, BaseFont font, float fontSize, float llx, float lly, float urx, float ury) {
+ PdfFormField field = PdfFormField.createTextField(writer, PdfFormField.SINGLELINE, PdfFormField.PLAINTEXT, 0);
+ setTextFieldParams(field, text, name, llx, lly, urx, ury);
+ drawSingleLineOfText(field, text, font, fontSize, llx, lly, urx, ury);
+ addFormField(field);
+ return field;
+ }
+
+ /**
+ * @param name
+ * @param text
+ * @param font
+ * @param fontSize
+ * @param llx
+ * @param lly
+ * @param urx
+ * @param ury
+ * @return a PdfFormField
+ */
+ public PdfFormField addMultiLineTextField(String name, String text, BaseFont font, float fontSize, float llx, float lly, float urx, float ury) {
+ PdfFormField field = PdfFormField.createTextField(writer, PdfFormField.MULTILINE, PdfFormField.PLAINTEXT, 0);
+ setTextFieldParams(field, text, name, llx, lly, urx, ury);
+ drawMultiLineOfText(field, text, font, fontSize, llx, lly, urx, ury);
+ addFormField(field);
+ return field;
+ }
+
+ /**
+ * @param name
+ * @param text
+ * @param font
+ * @param fontSize
+ * @param llx
+ * @param lly
+ * @param urx
+ * @param ury
+ * @return PdfFormField
+ */
+ public PdfFormField addSingleLinePasswordField(String name, String text, BaseFont font, float fontSize, float llx, float lly, float urx, float ury) {
+ PdfFormField field = PdfFormField.createTextField(writer, PdfFormField.SINGLELINE, PdfFormField.PASSWORD, 0);
+ setTextFieldParams(field, text, name, llx, lly, urx, ury);
+ drawSingleLineOfText(field, text, font, fontSize, llx, lly, urx, ury);
+ addFormField(field);
+ return field;
+ }
+
+ /**
+ * @param field
+ * @param text
+ * @param name
+ * @param llx
+ * @param lly
+ * @param urx
+ * @param ury
+ */
+ public void setTextFieldParams(PdfFormField field, String text, String name, float llx, float lly, float urx, float ury) {
+ field.setWidget(new Rectangle(llx, lly, urx, ury), PdfAnnotation.HIGHLIGHT_INVERT);
+ field.setValueAsString(text);
+ field.setDefaultValueAsString(text);
+ field.setFieldName(name);
+ field.setFlags(PdfAnnotation.FLAGS_PRINT);
+ field.setPage();
+ }
+
+ /**
+ * @param field
+ * @param text
+ * @param font
+ * @param fontSize
+ * @param llx
+ * @param lly
+ * @param urx
+ * @param ury
+ */
+ public void drawSingleLineOfText(PdfFormField field, String text, BaseFont font, float fontSize, float llx, float lly, float urx, float ury) {
+ PdfContentByte cb = writer.getDirectContent();
+ PdfAppearance tp = cb.createAppearance(urx - llx, ury - lly);
+ PdfAppearance tp2 = (PdfAppearance)tp.getDuplicate();
+ tp2.setFontAndSize(font, fontSize);
+ tp2.resetRGBColorFill();
+ field.setDefaultAppearanceString(tp2);
+ tp.drawTextField(0f, 0f, urx - llx, ury - lly);
+ tp.beginVariableText();
+ tp.saveState();
+ tp.rectangle(3f, 3f, urx - llx - 6f, ury - lly - 6f);
+ tp.clip();
+ tp.newPath();
+ tp.beginText();
+ tp.setFontAndSize(font, fontSize);
+ tp.resetRGBColorFill();
+ tp.setTextMatrix(4, (ury - lly) / 2 - (fontSize * 0.3f));
+ tp.showText(text);
+ tp.endText();
+ tp.restoreState();
+ tp.endVariableText();
+ field.setAppearance(PdfAnnotation.APPEARANCE_NORMAL, tp);
+ }
+
+ /**
+ * @param field
+ * @param text
+ * @param font
+ * @param fontSize
+ * @param llx
+ * @param lly
+ * @param urx
+ * @param ury
+ */
+ public void drawMultiLineOfText(PdfFormField field, String text, BaseFont font, float fontSize, float llx, float lly, float urx, float ury) {
+ PdfContentByte cb = writer.getDirectContent();
+ PdfAppearance tp = cb.createAppearance(urx - llx, ury - lly);
+ PdfAppearance tp2 = (PdfAppearance)tp.getDuplicate();
+ tp2.setFontAndSize(font, fontSize);
+ tp2.resetRGBColorFill();
+ field.setDefaultAppearanceString(tp2);
+ tp.drawTextField(0f, 0f, urx - llx, ury - lly);
+ tp.beginVariableText();
+ tp.saveState();
+ tp.rectangle(3f, 3f, urx - llx - 6f, ury - lly - 6f);
+ tp.clip();
+ tp.newPath();
+ tp.beginText();
+ tp.setFontAndSize(font, fontSize);
+ tp.resetRGBColorFill();
+ tp.setTextMatrix(4, 5);
+ java.util.StringTokenizer tokenizer = new java.util.StringTokenizer(text, "\n");
+ float yPos = ury - lly;
+ while (tokenizer.hasMoreTokens()) {
+ yPos -= fontSize * 1.2f;
+ tp.showTextAligned(PdfContentByte.ALIGN_LEFT, tokenizer.nextToken(), 3, yPos, 0);
+ }
+ tp.endText();
+ tp.restoreState();
+ tp.endVariableText();
+ field.setAppearance(PdfAnnotation.APPEARANCE_NORMAL, tp);
+ }
+
+ /**
+ * @param name
+ * @param value
+ * @param status
+ * @param llx
+ * @param lly
+ * @param urx
+ * @param ury
+ * @return a PdfFormField
+ */
+ public PdfFormField addCheckBox(String name, String value, boolean status, float llx, float lly, float urx, float ury) {
+ PdfFormField field = PdfFormField.createCheckBox(writer);
+ setCheckBoxParams(field, name, value, status, llx, lly, urx, ury);
+ drawCheckBoxAppearences(field, value, llx, lly, urx, ury);
+ addFormField(field);
+ return field;
+ }
+
+ /**
+ * @param field
+ * @param name
+ * @param value
+ * @param status
+ * @param llx
+ * @param lly
+ * @param urx
+ * @param ury
+ */
+ public void setCheckBoxParams(PdfFormField field, String name, String value, boolean status, float llx, float lly, float urx, float ury) {
+ field.setWidget(new Rectangle(llx, lly, urx, ury), PdfAnnotation.HIGHLIGHT_TOGGLE);
+ field.setFieldName(name);
+ if (status) {
+ field.setValueAsName(value);
+ field.setAppearanceState(value);
+ }
+ else {
+ field.setValueAsName("Off");
+ field.setAppearanceState("Off");
+ }
+ field.setFlags(PdfAnnotation.FLAGS_PRINT);
+ field.setPage();
+ field.setBorderStyle(new PdfBorderDictionary(1, PdfBorderDictionary.STYLE_SOLID));
+ }
+
+ /**
+ * @param field
+ * @param value
+ * @param llx
+ * @param lly
+ * @param urx
+ * @param ury
+ */
+ public void drawCheckBoxAppearences(PdfFormField field, String value, float llx, float lly, float urx, float ury) {
+ BaseFont font = null;
+ try {
+ font = BaseFont.createFont(BaseFont.ZAPFDINGBATS, BaseFont.WINANSI, BaseFont.NOT_EMBEDDED);
+ }
+ catch(Exception e) {
+ throw new ExceptionConverter(e);
+ }
+ float size = (ury - lly);
+ PdfContentByte cb = writer.getDirectContent();
+ PdfAppearance tpOn = cb.createAppearance(urx - llx, ury - lly);
+ PdfAppearance tp2 = (PdfAppearance)tpOn.getDuplicate();
+ tp2.setFontAndSize(font, size);
+ tp2.resetRGBColorFill();
+ field.setDefaultAppearanceString(tp2);
+ tpOn.drawTextField(0f, 0f, urx - llx, ury - lly);
+ tpOn.saveState();
+ tpOn.resetRGBColorFill();
+ tpOn.beginText();
+ tpOn.setFontAndSize(font, size);
+ tpOn.showTextAligned(PdfContentByte.ALIGN_CENTER, "4", (urx - llx) / 2, (ury - lly) / 2 - (size * 0.3f), 0);
+ tpOn.endText();
+ tpOn.restoreState();
+ field.setAppearance(PdfAnnotation.APPEARANCE_NORMAL, value, tpOn);
+ PdfAppearance tpOff = cb.createAppearance(urx - llx, ury - lly);
+ tpOff.drawTextField(0f, 0f, urx - llx, ury - lly);
+ field.setAppearance(PdfAnnotation.APPEARANCE_NORMAL, "Off", tpOff);
+ }
+
+ /**
+ * @param name
+ * @param defaultValue
+ * @param noToggleToOff
+ * @return a PdfFormField
+ */
+ public PdfFormField getRadioGroup(String name, String defaultValue, boolean noToggleToOff) {
+ PdfFormField radio = PdfFormField.createRadioButton(writer, noToggleToOff);
+ radio.setFieldName(name);
+ radio.setValueAsName(defaultValue);
+ return radio;
+ }
+
+ /**
+ * @param radiogroup
+ */
+ public void addRadioGroup(PdfFormField radiogroup) {
+ addFormField(radiogroup);
+ }
+
+ /**
+ * @param radiogroup
+ * @param value
+ * @param llx
+ * @param lly
+ * @param urx
+ * @param ury
+ * @return a PdfFormField
+ */
+ public PdfFormField addRadioButton(PdfFormField radiogroup, String value, float llx, float lly, float urx, float ury) {
+ PdfFormField radio = PdfFormField.createEmpty(writer);
+ radio.setWidget(new Rectangle(llx, lly, urx, ury), PdfAnnotation.HIGHLIGHT_TOGGLE);
+ String name = ((PdfName)radiogroup.get(PdfName.V)).toString().substring(1);
+ if (name.equals(value)) {
+ radio.setAppearanceState(value);
+ }
+ else {
+ radio.setAppearanceState("Off");
+ }
+ drawRadioAppearences(radio, value, llx, lly, urx, ury);
+ radiogroup.addKid(radio);
+ return radio;
+ }
+
+ /**
+ * @param field
+ * @param value
+ * @param llx
+ * @param lly
+ * @param urx
+ * @param ury
+ */
+ public void drawRadioAppearences(PdfFormField field, String value, float llx, float lly, float urx, float ury) {
+ PdfContentByte cb = writer.getDirectContent();
+ PdfAppearance tpOn = cb.createAppearance(urx - llx, ury - lly);
+ tpOn.drawRadioField(0f, 0f, urx - llx, ury - lly, true);
+ field.setAppearance(PdfAnnotation.APPEARANCE_NORMAL, value, tpOn);
+ PdfAppearance tpOff = cb.createAppearance(urx - llx, ury - lly);
+ tpOff.drawRadioField(0f, 0f, urx - llx, ury - lly, false);
+ field.setAppearance(PdfAnnotation.APPEARANCE_NORMAL, "Off", tpOff);
+ }
+
+ /**
+ * @param name
+ * @param options
+ * @param defaultValue
+ * @param font
+ * @param fontSize
+ * @param llx
+ * @param lly
+ * @param urx
+ * @param ury
+ * @return a PdfFormField
+ */
+ public PdfFormField addSelectList(String name, String[] options, String defaultValue, BaseFont font, float fontSize, float llx, float lly, float urx, float ury) {
+ PdfFormField choice = PdfFormField.createList(writer, options, 0);
+ setChoiceParams(choice, name, defaultValue, llx, lly, urx, ury);
+ StringBuffer text = new StringBuffer();
+ for (int i = 0; i < options.length; i++) {
+ text.append(options[i]).append("\n");
+ }
+ drawMultiLineOfText(choice, text.toString(), font, fontSize, llx, lly, urx, ury);
+ addFormField(choice);
+ return choice;
+ }
+
+ /**
+ * @param name
+ * @param options
+ * @param defaultValue
+ * @param font
+ * @param fontSize
+ * @param llx
+ * @param lly
+ * @param urx
+ * @param ury
+ * @return a PdfFormField
+ */
+ public PdfFormField addSelectList(String name, String[][] options, String defaultValue, BaseFont font, float fontSize, float llx, float lly, float urx, float ury) {
+ PdfFormField choice = PdfFormField.createList(writer, options, 0);
+ setChoiceParams(choice, name, defaultValue, llx, lly, urx, ury);
+ StringBuffer text = new StringBuffer();
+ for (int i = 0; i < options.length; i++) {
+ text.append(options[i][1]).append("\n");
+ }
+ drawMultiLineOfText(choice, text.toString(), font, fontSize, llx, lly, urx, ury);
+ addFormField(choice);
+ return choice;
+ }
+
+ /**
+ * @param name
+ * @param options
+ * @param defaultValue
+ * @param editable
+ * @param font
+ * @param fontSize
+ * @param llx
+ * @param lly
+ * @param urx
+ * @param ury
+ * @return a PdfFormField
+ */
+ public PdfFormField addComboBox(String name, String[] options, String defaultValue, boolean editable, BaseFont font, float fontSize, float llx, float lly, float urx, float ury) {
+ PdfFormField choice = PdfFormField.createCombo(writer, editable, options, 0);
+ setChoiceParams(choice, name, defaultValue, llx, lly, urx, ury);
+ if (defaultValue == null) {
+ defaultValue = options[0];
+ }
+ drawSingleLineOfText(choice, defaultValue, font, fontSize, llx, lly, urx, ury);
+ addFormField(choice);
+ return choice;
+ }
+
+ /**
+ * @param name
+ * @param options
+ * @param defaultValue
+ * @param editable
+ * @param font
+ * @param fontSize
+ * @param llx
+ * @param lly
+ * @param urx
+ * @param ury
+ * @return a PdfFormField
+ */
+ public PdfFormField addComboBox(String name, String[][] options, String defaultValue, boolean editable, BaseFont font, float fontSize, float llx, float lly, float urx, float ury) {
+ PdfFormField choice = PdfFormField.createCombo(writer, editable, options, 0);
+ setChoiceParams(choice, name, defaultValue, llx, lly, urx, ury);
+ String value = null;
+ for (int i = 0; i < options.length; i++) {
+ if (options[i][0].equals(defaultValue)) {
+ value = options[i][1];
+ break;
+ }
+ }
+ if (value == null) {
+ value = options[0][1];
+ }
+ drawSingleLineOfText(choice, value, font, fontSize, llx, lly, urx, ury);
+ addFormField(choice);
+ return choice;
+ }
+
+ /**
+ * @param field
+ * @param name
+ * @param defaultValue
+ * @param llx
+ * @param lly
+ * @param urx
+ * @param ury
+ */
+ public void setChoiceParams(PdfFormField field, String name, String defaultValue, float llx, float lly, float urx, float ury) {
+ field.setWidget(new Rectangle(llx, lly, urx, ury), PdfAnnotation.HIGHLIGHT_INVERT);
+ if (defaultValue != null) {
+ field.setValueAsString(defaultValue);
+ field.setDefaultValueAsString(defaultValue);
+ }
+ field.setFieldName(name);
+ field.setFlags(PdfAnnotation.FLAGS_PRINT);
+ field.setPage();
+ field.setBorderStyle(new PdfBorderDictionary(2, PdfBorderDictionary.STYLE_SOLID));
+ }
+
+ /**
+ * @param name
+ * @param llx
+ * @param lly
+ * @param urx
+ * @param ury
+ * @return a PdfFormField
+ */
+ public PdfFormField addSignature(String name,
+ float llx, float lly, float urx, float ury) {
+ PdfFormField signature = PdfFormField.createSignature(writer);
+ setSignatureParams(signature, name, llx, lly, urx, ury);
+ drawSignatureAppearences(signature, llx, lly, urx, ury);
+ addFormField(signature);
+ return signature;
+ }
+
+ /**
+ * @param field
+ * @param name
+ * @param llx
+ * @param lly
+ * @param urx
+ * @param ury
+ */
+ public void setSignatureParams(PdfFormField field, String name,
+ float llx, float lly, float urx, float ury) {
+ field.setWidget(new Rectangle(llx, lly, urx, ury), PdfAnnotation.HIGHLIGHT_INVERT);
+ field.setFieldName(name);
+ field.setFlags(PdfAnnotation.FLAGS_PRINT);
+ field.setPage();
+ field.setMKBorderColor(java.awt.Color.black);
+ field.setMKBackgroundColor(java.awt.Color.white);
+ }
+
+ /**
+ * @param field
+ * @param llx
+ * @param lly
+ * @param urx
+ * @param ury
+ */
+ public void drawSignatureAppearences(PdfFormField field,
+ float llx, float lly, float urx, float ury) {
+ PdfContentByte cb = writer.getDirectContent();
+ PdfAppearance tp = cb.createAppearance(urx - llx, ury - lly);
+ tp.setGrayFill(1.0f);
+ tp.rectangle(0, 0, urx - llx, ury - lly);
+ tp.fill();
+ tp.setGrayStroke(0);
+ tp.setLineWidth(1);
+ tp.rectangle(0.5f, 0.5f, urx - llx - 0.5f, ury - lly - 0.5f);
+ tp.closePathStroke();
+ tp.saveState();
+ tp.rectangle(1, 1, urx - llx - 2, ury - lly - 2);
+ tp.clip();
+ tp.newPath();
+ tp.restoreState();
+ field.setAppearance(PdfAnnotation.APPEARANCE_NORMAL, tp);
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/pdf/PdfAction.java b/src/main/java/com/lowagie/text/pdf/PdfAction.java
new file mode 100644
index 0000000..054fd30
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/PdfAction.java
@@ -0,0 +1,558 @@
+/*
+ * $Id: PdfAction.java,v 1.71 2006/05/18 09:38:35 psoares33 Exp $
+ * $Name: $
+ *
+ * Copyright 2001, 2002 by Bruno Lowagie.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf;
+
+import java.net.URL;
+import com.lowagie.text.ExceptionConverter;
+import java.io.IOException;
+import java.util.ArrayList;
+
+/**
+ * A <CODE>PdfAction</CODE> defines an action that can be triggered from a PDF file.
+ *
+ * @see PdfDictionary
+ */
+
+public class PdfAction extends PdfDictionary {
+
+ /** A named action to go to the first page.
+ */
+ public static final int FIRSTPAGE = 1;
+ /** A named action to go to the previous page.
+ */
+ public static final int PREVPAGE = 2;
+ /** A named action to go to the next page.
+ */
+ public static final int NEXTPAGE = 3;
+ /** A named action to go to the last page.
+ */
+ public static final int LASTPAGE = 4;
+
+ /** A named action to open a print dialog.
+ */
+ public static final int PRINTDIALOG = 5;
+
+ /** a possible submitvalue */
+ public static final int SUBMIT_EXCLUDE = 1;
+ /** a possible submitvalue */
+ public static final int SUBMIT_INCLUDE_NO_VALUE_FIELDS = 2;
+ /** a possible submitvalue */
+ public static final int SUBMIT_HTML_FORMAT = 4;
+ /** a possible submitvalue */
+ public static final int SUBMIT_HTML_GET = 8;
+ /** a possible submitvalue */
+ public static final int SUBMIT_COORDINATES = 16;
+ /** a possible submitvalue */
+ public static final int SUBMIT_XFDF = 32;
+ /** a possible submitvalue */
+ public static final int SUBMIT_INCLUDE_APPEND_SAVES = 64;
+ /** a possible submitvalue */
+ public static final int SUBMIT_INCLUDE_ANNOTATIONS = 128;
+ /** a possible submitvalue */
+ public static final int SUBMIT_PDF = 256;
+ /** a possible submitvalue */
+ public static final int SUBMIT_CANONICAL_FORMAT = 512;
+ /** a possible submitvalue */
+ public static final int SUBMIT_EXCL_NON_USER_ANNOTS = 1024;
+ /** a possible submitvalue */
+ public static final int SUBMIT_EXCL_F_KEY = 2048;
+ /** a possible submitvalue */
+ public static final int SUBMIT_EMBED_FORM = 8196;
+ /** a possible submitvalue */
+ public static final int RESET_EXCLUDE = 1;
+
+ // constructors
+
+ /** Create an empty action.
+ */
+ public PdfAction() {
+ }
+
+ /**
+ * Constructs a new <CODE>PdfAction</CODE> of Subtype URI.
+ *
+ * @param url the Url to go to
+ */
+
+ public PdfAction(URL url) {
+ this(url.toExternalForm());
+ }
+
+ /**
+ * Construct a new <CODE>PdfAction</CODE> of Subtype URI that accepts the x and y coordinate of the position that was clicked.
+ * @param url
+ * @param isMap
+ */
+ public PdfAction(URL url, boolean isMap) {
+ this(url.toExternalForm(), isMap);
+ }
+
+ /**
+ * Constructs a new <CODE>PdfAction</CODE> of Subtype URI.
+ *
+ * @param url the url to go to
+ */
+
+ public PdfAction(String url) {
+ this(url, false);
+ }
+
+ /**
+ * Construct a new <CODE>PdfAction</CODE> of Subtype URI that accepts the x and y coordinate of the position that was clicked.
+ * @param url
+ * @param isMap
+ */
+
+ public PdfAction(String url, boolean isMap) {
+ put(PdfName.S, PdfName.URI);
+ put(PdfName.URI, new PdfString(url));
+ if (isMap)
+ put(PdfName.ISMAP, PdfBoolean.PDFTRUE);
+ }
+
+ /**
+ * Constructs a new <CODE>PdfAction</CODE> of Subtype GoTo.
+ * @param destination the destination to go to
+ */
+
+ PdfAction(PdfIndirectReference destination) {
+ put(PdfName.S, PdfName.GOTO);
+ put(PdfName.D, destination);
+ }
+
+ /**
+ * Constructs a new <CODE>PdfAction</CODE> of Subtype GoToR.
+ * @param filename the file name to go to
+ * @param name the named destination to go to
+ */
+
+ public PdfAction(String filename, String name) {
+ put(PdfName.S, PdfName.GOTOR);
+ put(PdfName.F, new PdfString(filename));
+ put(PdfName.D, new PdfString(name));
+ }
+
+ /**
+ * Constructs a new <CODE>PdfAction</CODE> of Subtype GoToR.
+ * @param filename the file name to go to
+ * @param page the page destination to go to
+ */
+
+ public PdfAction(String filename, int page) {
+ put(PdfName.S, PdfName.GOTOR);
+ put(PdfName.F, new PdfString(filename));
+ put(PdfName.D, new PdfLiteral("[" + (page - 1) + " /FitH 10000]"));
+ }
+
+ /** Implements name actions. The action can be FIRSTPAGE, LASTPAGE,
+ * NEXTPAGE, PREVPAGE and PRINTDIALOG.
+ * @param named the named action
+ */
+ public PdfAction(int named) {
+ put(PdfName.S, PdfName.NAMED);
+ switch (named) {
+ case FIRSTPAGE:
+ put(PdfName.N, PdfName.FIRSTPAGE);
+ break;
+ case LASTPAGE:
+ put(PdfName.N, PdfName.LASTPAGE);
+ break;
+ case NEXTPAGE:
+ put(PdfName.N, PdfName.NEXTPAGE);
+ break;
+ case PREVPAGE:
+ put(PdfName.N, PdfName.PREVPAGE);
+ break;
+ case PRINTDIALOG:
+ put(PdfName.S, PdfName.JAVASCRIPT);
+ put(PdfName.JS, new PdfString("this.print(true);\r"));
+ break;
+ default:
+ throw new RuntimeException("Invalid named action.");
+ }
+ }
+
+ /** Launchs an application or a document.
+ * @param application the application to be launched or the document to be opened or printed.
+ * @param parameters (Windows-specific) A parameter string to be passed to the application.
+ * It can be <CODE>null</CODE>.
+ * @param operation (Windows-specific) the operation to perform: "open" - Open a document,
+ * "print" - Print a document.
+ * It can be <CODE>null</CODE>.
+ * @param defaultDir (Windows-specific) the default directory in standard DOS syntax.
+ * It can be <CODE>null</CODE>.
+ */
+ public PdfAction(String application, String parameters, String operation, String defaultDir) {
+ put(PdfName.S, PdfName.LAUNCH);
+ if (parameters == null && operation == null && defaultDir == null)
+ put(PdfName.F, new PdfString(application));
+ else {
+ PdfDictionary dic = new PdfDictionary();
+ dic.put(PdfName.F, new PdfString(application));
+ if (parameters != null)
+ dic.put(PdfName.P, new PdfString(parameters));
+ if (operation != null)
+ dic.put(PdfName.O, new PdfString(operation));
+ if (defaultDir != null)
+ dic.put(PdfName.D, new PdfString(defaultDir));
+ put(PdfName.WIN, dic);
+ }
+ }
+
+ /** Launchs an application or a document.
+ * @param application the application to be launched or the document to be opened or printed.
+ * @param parameters (Windows-specific) A parameter string to be passed to the application.
+ * It can be <CODE>null</CODE>.
+ * @param operation (Windows-specific) the operation to perform: "open" - Open a document,
+ * "print" - Print a document.
+ * It can be <CODE>null</CODE>.
+ * @param defaultDir (Windows-specific) the default directory in standard DOS syntax.
+ * It can be <CODE>null</CODE>.
+ * @return a Launch action
+ */
+ public static PdfAction createLaunch(String application, String parameters, String operation, String defaultDir) {
+ return new PdfAction(application, parameters, operation, defaultDir);
+ }
+
+ /**Creates a Rendition action
+ * @param file
+ * @param fs
+ * @param mimeType
+ * @param ref
+ * @return a Media Clip action
+ * @throws IOException
+ */
+ public static PdfAction rendition(String file, PdfFileSpecification fs, String mimeType, PdfIndirectReference ref) throws IOException {
+ PdfAction js = new PdfAction();
+ js.put(PdfName.S, PdfName.RENDITION);
+ js.put(PdfName.R, new PdfRendition(file, fs, mimeType));
+ js.put(new PdfName("OP"), new PdfNumber(0));
+ js.put(new PdfName("AN"), ref);
+ return js;
+ }
+
+ /** Creates a JavaScript action. If the JavaScript is smaller than
+ * 50 characters it will be placed as a string, otherwise it will
+ * be placed as a compressed stream.
+ * @param code the JavaScript code
+ * @param writer the writer for this action
+ * @param unicode select JavaScript unicode. Note that the internal
+ * Acrobat JavaScript engine does not support unicode,
+ * so this may or may not work for you
+ * @return the JavaScript action
+ */
+ public static PdfAction javaScript(String code, PdfWriter writer, boolean unicode) {
+ PdfAction js = new PdfAction();
+ js.put(PdfName.S, PdfName.JAVASCRIPT);
+ if (unicode && code.length() < 50) {
+ js.put(PdfName.JS, new PdfString(code, PdfObject.TEXT_UNICODE));
+ }
+ else if (!unicode && code.length() < 100) {
+ js.put(PdfName.JS, new PdfString(code));
+ }
+ else {
+ try {
+ byte b[] = PdfEncodings.convertToBytes(code, unicode ? PdfObject.TEXT_UNICODE : PdfObject.TEXT_PDFDOCENCODING);
+ PdfStream stream = new PdfStream(b);
+ stream.flateCompress();
+ js.put(PdfName.JS, writer.addToBody(stream).getIndirectReference());
+ }
+ catch (Exception e) {
+ throw new ExceptionConverter(e);
+ }
+ }
+ return js;
+ }
+
+ /** Creates a JavaScript action. If the JavaScript is smaller than
+ * 50 characters it will be place as a string, otherwise it will
+ * be placed as a compressed stream.
+ * @param code the JavaScript code
+ * @param writer the writer for this action
+ * @return the JavaScript action
+ */
+ public static PdfAction javaScript(String code, PdfWriter writer) {
+ return javaScript(code, writer, false);
+ }
+
+ /**
+ * A Hide action hides or shows an object.
+ * @param obj object to hide or show
+ * @param hide true is hide, false is show
+ * @return a Hide Action
+ */
+ static PdfAction createHide(PdfObject obj, boolean hide) {
+ PdfAction action = new PdfAction();
+ action.put(PdfName.S, PdfName.HIDE);
+ action.put(PdfName.T, obj);
+ if (!hide)
+ action.put(PdfName.H, PdfBoolean.PDFFALSE);
+ return action;
+ }
+
+ /**
+ * A Hide action hides or shows an annotation.
+ * @param annot
+ * @param hide
+ * @return A Hide Action
+ */
+ public static PdfAction createHide(PdfAnnotation annot, boolean hide) {
+ return createHide(annot.getIndirectReference(), hide);
+ }
+
+ /**
+ * A Hide action hides or shows an annotation.
+ * @param name
+ * @param hide
+ * @return A Hide Action
+ */
+ public static PdfAction createHide(String name, boolean hide) {
+ return createHide(new PdfString(name), hide);
+ }
+
+ static PdfArray buildArray(Object names[]) {
+ PdfArray array = new PdfArray();
+ for (int k = 0; k < names.length; ++k) {
+ Object obj = names[k];
+ if (obj instanceof String)
+ array.add(new PdfString((String)obj));
+ else if (obj instanceof PdfAnnotation)
+ array.add(((PdfAnnotation)obj).getIndirectReference());
+ else
+ throw new RuntimeException("The array must contain String or PdfAnnotation.");
+ }
+ return array;
+ }
+
+ /**
+ * A Hide action hides or shows objects.
+ * @param names
+ * @param hide
+ * @return A Hide Action
+ */
+ public static PdfAction createHide(Object names[], boolean hide) {
+ return createHide(buildArray(names), hide);
+ }
+
+ /**
+ * Creates a submit form.
+ * @param file the URI to submit the form to
+ * @param names the objects to submit
+ * @param flags submit properties
+ * @return A PdfAction
+ */
+ public static PdfAction createSubmitForm(String file, Object names[], int flags) {
+ PdfAction action = new PdfAction();
+ action.put(PdfName.S, PdfName.SUBMITFORM);
+ PdfDictionary dic = new PdfDictionary();
+ dic.put(PdfName.F, new PdfString(file));
+ dic.put(PdfName.FS, PdfName.URL);
+ action.put(PdfName.F, dic);
+ if (names != null)
+ action.put(PdfName.FIELDS, buildArray(names));
+ action.put(PdfName.FLAGS, new PdfNumber(flags));
+ return action;
+ }
+
+ /**
+ * Creates a resetform.
+ * @param names the objects to reset
+ * @param flags submit properties
+ * @return A PdfAction
+ */
+ public static PdfAction createResetForm(Object names[], int flags) {
+ PdfAction action = new PdfAction();
+ action.put(PdfName.S, PdfName.RESETFORM);
+ if (names != null)
+ action.put(PdfName.FIELDS, buildArray(names));
+ action.put(PdfName.FLAGS, new PdfNumber(flags));
+ return action;
+ }
+
+ /**
+ * Creates an Import field.
+ * @param file
+ * @return A PdfAction
+ */
+ public static PdfAction createImportData(String file) {
+ PdfAction action = new PdfAction();
+ action.put(PdfName.S, PdfName.IMPORTDATA);
+ action.put(PdfName.F, new PdfString(file));
+ return action;
+ }
+
+ /** Add a chained action.
+ * @param na the next action
+ */
+ public void next(PdfAction na) {
+ PdfObject nextAction = get(PdfName.NEXT);
+ if (nextAction == null)
+ put(PdfName.NEXT, na);
+ else if (nextAction.isDictionary()) {
+ PdfArray array = new PdfArray(nextAction);
+ array.add(na);
+ put(PdfName.NEXT, array);
+ }
+ else {
+ ((PdfArray)nextAction).add(na);
+ }
+ }
+
+ /** Creates a GoTo action to an internal page.
+ * @param page the page to go. First page is 1
+ * @param dest the destination for the page
+ * @param writer the writer for this action
+ * @return a GoTo action
+ */
+ public static PdfAction gotoLocalPage(int page, PdfDestination dest, PdfWriter writer) {
+ PdfIndirectReference ref = writer.getPageReference(page);
+ dest.addPage(ref);
+ PdfAction action = new PdfAction();
+ action.put(PdfName.S, PdfName.GOTO);
+ action.put(PdfName.D, dest);
+ return action;
+ }
+
+ /**
+ * Creates a GoTo action to a named destination.
+ * @param dest the named destination
+ * @param isName if true sets the destination as a name, if false sets it as a String
+ * @return a GoTo action
+ */
+ public static PdfAction gotoLocalPage(String dest, boolean isName) {
+ PdfAction action = new PdfAction();
+ action.put(PdfName.S, PdfName.GOTO);
+ if (isName)
+ action.put(PdfName.D, new PdfName(dest));
+ else
+ action.put(PdfName.D, new PdfString(dest, null));
+ return action;
+ }
+
+ /**
+ * Creates a GoToR action to a named destination.
+ * @param filename the file name to go to
+ * @param dest the destination name
+ * @param isName if true sets the destination as a name, if false sets it as a String
+ * @param newWindow open the document in a new window if <CODE>true</CODE>, if false the current document is replaced by the new document.
+ * @return a GoToR action
+ */
+ public static PdfAction gotoRemotePage(String filename, String dest, boolean isName, boolean newWindow) {
+ PdfAction action = new PdfAction();
+ action.put(PdfName.F, new PdfString(filename));
+ action.put(PdfName.S, PdfName.GOTOR);
+ if (isName)
+ action.put(PdfName.D, new PdfName(dest));
+ else
+ action.put(PdfName.D, new PdfString(dest, null));
+ if (newWindow)
+ action.put(PdfName.NEWWINDOW, PdfBoolean.PDFTRUE);
+ return action;
+ }
+
+ /**
+ * A set-OCG-state action (PDF 1.5) sets the state of one or more optional content
+ * groups.
+ * @param state an array consisting of any number of sequences beginning with a <CODE>PdfName</CODE>
+ * or <CODE>String</CODE> (ON, OFF, or Toggle) followed by one or more optional content group dictionaries
+ * <CODE>PdfLayer</CODE> or a <CODE>PdfIndirectReference</CODE> to a <CODE>PdfLayer</CODE>.<br>
+ * The array elements are processed from left to right; each name is applied
+ * to the subsequent groups until the next name is encountered:
+ * <ul>
+ * <li>ON sets the state of subsequent groups to ON</li>
+ * <li>OFF sets the state of subsequent groups to OFF</li>
+ * <li>Toggle reverses the state of subsequent groups</li>
+ * </ul>
+ * @param preserveRB if <CODE>true</CODE>, indicates that radio-button state relationships between optional
+ * content groups (as specified by the RBGroups entry in the current configuration
+ * dictionary) should be preserved when the states in the
+ * <CODE>state</CODE> array are applied. That is, if a group is set to ON (either by ON or Toggle) during
+ * processing of the <CODE>state</CODE> array, any other groups belong to the same radio-button
+ * group are turned OFF. If a group is set to OFF, there is no effect on other groups.<br>
+ * If <CODE>false</CODE>, radio-button state relationships, if any, are ignored
+ * @return the action
+ */
+ public static PdfAction setOCGstate(ArrayList state, boolean preserveRB) {
+ PdfAction action = new PdfAction();
+ action.put(PdfName.S, PdfName.SETOCGSTATE);
+ PdfArray a = new PdfArray();
+ for (int k = 0; k < state.size(); ++k) {
+ Object o = state.get(k);
+ if (o == null)
+ continue;
+ if (o instanceof PdfIndirectReference)
+ a.add((PdfIndirectReference)o);
+ else if (o instanceof PdfLayer)
+ a.add(((PdfLayer)o).getRef());
+ else if (o instanceof PdfName)
+ a.add((PdfName)o);
+ else if (o instanceof String) {
+ PdfName name = null;
+ String s = (String)o;
+ if (s.equalsIgnoreCase("on"))
+ name = PdfName.ON;
+ else if (s.equalsIgnoreCase("off"))
+ name = PdfName.OFF;
+ else if (s.equalsIgnoreCase("toggle"))
+ name = PdfName.TOGGLE;
+ else
+ throw new IllegalArgumentException("A string '" + s + " was passed in state. Only 'ON', 'OFF' and 'Toggle' are allowed.");
+ a.add(name);
+ }
+ else
+ throw new IllegalArgumentException("Invalid type was passed in state: " + o.getClass().getName());
+ }
+ action.put(PdfName.STATE, a);
+ if (!preserveRB)
+ action.put(PdfName.PRESERVERB, PdfBoolean.PDFFALSE);
+ return action;
+ }
+}
diff --git a/src/main/java/com/lowagie/text/pdf/PdfAnnotation.java b/src/main/java/com/lowagie/text/pdf/PdfAnnotation.java
new file mode 100644
index 0000000..53deae7
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/PdfAnnotation.java
@@ -0,0 +1,742 @@
+/*
+ * $Id: PdfAnnotation.java,v 1.66 2006/06/04 22:23:39 psoares33 Exp $
+ * $Name: $
+ *
+ * Copyright 1999, 2000, 2001, 2002 Bruno Lowagie
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf;
+
+import com.lowagie.text.Rectangle;
+import java.util.HashMap;
+import java.awt.Color;
+import java.io.*;
+/**
+ * A <CODE>PdfAnnotation</CODE> is a note that is associated with a page.
+ *
+ * @see PdfDictionary
+ */
+
+public class PdfAnnotation extends PdfDictionary {
+ /** highlight attributename */
+ public static final PdfName HIGHLIGHT_NONE = PdfName.N;
+ /** highlight attributename */
+ public static final PdfName HIGHLIGHT_INVERT = PdfName.I;
+ /** highlight attributename */
+ public static final PdfName HIGHLIGHT_OUTLINE = PdfName.O;
+ /** highlight attributename */
+ public static final PdfName HIGHLIGHT_PUSH = PdfName.P;
+ /** highlight attributename */
+ public static final PdfName HIGHLIGHT_TOGGLE = PdfName.T;
+ /** flagvalue */
+ public static final int FLAGS_INVISIBLE = 1;
+ /** flagvalue */
+ public static final int FLAGS_HIDDEN = 2;
+ /** flagvalue */
+ public static final int FLAGS_PRINT = 4;
+ /** flagvalue */
+ public static final int FLAGS_NOZOOM = 8;
+ /** flagvalue */
+ public static final int FLAGS_NOROTATE = 16;
+ /** flagvalue */
+ public static final int FLAGS_NOVIEW = 32;
+ /** flagvalue */
+ public static final int FLAGS_READONLY = 64;
+ /** flagvalue */
+ public static final int FLAGS_LOCKED = 128;
+ /** flagvalue */
+ public static final int FLAGS_TOGGLENOVIEW = 256;
+ /** appearance attributename */
+ public static final PdfName APPEARANCE_NORMAL = PdfName.N;
+ /** appearance attributename */
+ public static final PdfName APPEARANCE_ROLLOVER = PdfName.R;
+ /** appearance attributename */
+ public static final PdfName APPEARANCE_DOWN = PdfName.D;
+ /** attributevalue */
+ public static final PdfName AA_ENTER = PdfName.E;
+ /** attributevalue */
+ public static final PdfName AA_EXIT = PdfName.X;
+ /** attributevalue */
+ public static final PdfName AA_DOWN = PdfName.D;
+ /** attributevalue */
+ public static final PdfName AA_UP = PdfName.U;
+ /** attributevalue */
+ public static final PdfName AA_FOCUS = PdfName.FO;
+ /** attributevalue */
+ public static final PdfName AA_BLUR = PdfName.BL;
+ /** attributevalue */
+ public static final PdfName AA_JS_KEY = PdfName.K;
+ /** attributevalue */
+ public static final PdfName AA_JS_FORMAT = PdfName.F;
+ /** attributevalue */
+ public static final PdfName AA_JS_CHANGE = PdfName.V;
+ /** attributevalue */
+ public static final PdfName AA_JS_OTHER_CHANGE = PdfName.C;
+ /** attributevalue */
+ public static final int MARKUP_HIGHLIGHT = 0;
+ /** attributevalue */
+ public static final int MARKUP_UNDERLINE = 1;
+ /** attributevalue */
+ public static final int MARKUP_STRIKEOUT = 2;
+
+ protected PdfWriter writer;
+ protected PdfIndirectReference reference;
+ protected HashMap templates;
+ protected boolean form = false;
+ protected boolean annotation = true;
+
+ /** Holds value of property used. */
+ protected boolean used = false;
+
+ /** Holds value of property placeInPage. */
+ private int placeInPage = -1;
+
+ // constructors
+ public PdfAnnotation(PdfWriter writer, Rectangle rect) {
+ this.writer = writer;
+ if (rect != null)
+ put(PdfName.RECT, new PdfRectangle(rect));
+ }
+
+/**
+ * Constructs a new <CODE>PdfAnnotation</CODE> of subtype text.
+ * @param writer
+ * @param llx
+ * @param lly
+ * @param urx
+ * @param ury
+ * @param title
+ * @param content
+ */
+
+ PdfAnnotation(PdfWriter writer, float llx, float lly, float urx, float ury, PdfString title, PdfString content) {
+ this.writer = writer;
+ put(PdfName.SUBTYPE, PdfName.TEXT);
+ put(PdfName.T, title);
+ put(PdfName.RECT, new PdfRectangle(llx, lly, urx, ury));
+ put(PdfName.CONTENTS, content);
+ }
+
+/**
+ * Constructs a new <CODE>PdfAnnotation</CODE> of subtype link (Action).
+ * @param writer
+ * @param llx
+ * @param lly
+ * @param urx
+ * @param ury
+ * @param action
+ */
+
+ public PdfAnnotation(PdfWriter writer, float llx, float lly, float urx, float ury, PdfAction action) {
+ this.writer = writer;
+ put(PdfName.SUBTYPE, PdfName.LINK);
+ put(PdfName.RECT, new PdfRectangle(llx, lly, urx, ury));
+ put(PdfName.A, action);
+ put(PdfName.BORDER, new PdfBorderArray(0, 0, 0));
+ put(PdfName.C, new PdfColor(0x00, 0x00, 0xFF));
+ }
+
+ /**
+ * Creates a screen PdfAnnotation
+ * @param writer
+ * @param rect
+ * @param clipTitle
+ * @param fs
+ * @param mimeType
+ * @param playOnDisplay
+ * @return a screen PdfAnnotation
+ * @throws IOException
+ */
+ public static PdfAnnotation createScreen(PdfWriter writer, Rectangle rect, String clipTitle, PdfFileSpecification fs,
+ String mimeType, boolean playOnDisplay) throws IOException {
+ PdfAnnotation ann = new PdfAnnotation(writer, rect);
+ ann.put(PdfName.SUBTYPE, PdfName.SCREEN);
+ ann.put (PdfName.F, new PdfNumber(FLAGS_PRINT));
+ ann.put(PdfName.TYPE, PdfName.ANNOT);
+ ann.setPage();
+ PdfIndirectReference ref = ann.getIndirectReference();
+ PdfAction action = PdfAction.rendition(clipTitle,fs,mimeType, ref);
+ PdfIndirectReference actionRef = writer.addToBody(action).getIndirectReference();
+ // for play on display add trigger event
+ if (playOnDisplay)
+ {
+ PdfDictionary aa = new PdfDictionary();
+ aa.put(new PdfName("PV"), actionRef);
+ ann.put(PdfName.AA, aa);
+ }
+ ann.put(PdfName.A, actionRef);
+ return ann;
+ }
+
+ public PdfIndirectReference getIndirectReference() {
+ if (reference == null) {
+ reference = writer.getPdfIndirectReference();
+ }
+ return reference;
+ }
+
+ /**
+ * @param writer
+ * @param rect
+ * @param title
+ * @param contents
+ * @param open
+ * @param icon
+ * @return a PdfAnnotation
+ */
+ public static PdfAnnotation createText(PdfWriter writer, Rectangle rect, String title, String contents, boolean open, String icon) {
+ PdfAnnotation annot = new PdfAnnotation(writer, rect);
+ annot.put(PdfName.SUBTYPE, PdfName.TEXT);
+ if (title != null)
+ annot.put(PdfName.T, new PdfString(title, PdfObject.TEXT_UNICODE));
+ if (contents != null)
+ annot.put(PdfName.CONTENTS, new PdfString(contents, PdfObject.TEXT_UNICODE));
+ if (open)
+ annot.put(PdfName.OPEN, PdfBoolean.PDFTRUE);
+ if (icon != null) {
+ annot.put(PdfName.NAME, new PdfName(icon));
+ }
+ return annot;
+ }
+
+ /**
+ * Creates a link.
+ * @param writer
+ * @param rect
+ * @param highlight
+ * @return A PdfAnnotation
+ */
+ protected static PdfAnnotation createLink(PdfWriter writer, Rectangle rect, PdfName highlight) {
+ PdfAnnotation annot = new PdfAnnotation(writer, rect);
+ annot.put(PdfName.SUBTYPE, PdfName.LINK);
+ if (!highlight.equals(HIGHLIGHT_INVERT))
+ annot.put(PdfName.H, highlight);
+ return annot;
+ }
+
+ /**
+ * Creates an Annotation with an Action.
+ * @param writer
+ * @param rect
+ * @param highlight
+ * @param action
+ * @return A PdfAnnotation
+ */
+ public static PdfAnnotation createLink(PdfWriter writer, Rectangle rect, PdfName highlight, PdfAction action) {
+ PdfAnnotation annot = createLink(writer, rect, highlight);
+ annot.putEx(PdfName.A, action);
+ return annot;
+ }
+
+ /**
+ * Creates an Annotation with an local destination.
+ * @param writer
+ * @param rect
+ * @param highlight
+ * @param namedDestination
+ * @return A PdfAnnotation
+ */
+ public static PdfAnnotation createLink(PdfWriter writer, Rectangle rect, PdfName highlight, String namedDestination) {
+ PdfAnnotation annot = createLink(writer, rect, highlight);
+ annot.put(PdfName.DEST, new PdfString(namedDestination));
+ return annot;
+ }
+
+ /**
+ * Creates an Annotation with a PdfDestination.
+ * @param writer
+ * @param rect
+ * @param highlight
+ * @param page
+ * @param dest
+ * @return A PdfAnnotation
+ */
+ public static PdfAnnotation createLink(PdfWriter writer, Rectangle rect, PdfName highlight, int page, PdfDestination dest) {
+ PdfAnnotation annot = createLink(writer, rect, highlight);
+ PdfIndirectReference ref = writer.getPageReference(page);
+ dest.addPage(ref);
+ annot.put(PdfName.DEST, dest);
+ return annot;
+ }
+
+ /**
+ * Add some free text to the document.
+ * @param writer
+ * @param rect
+ * @param contents
+ * @param defaultAppearance
+ * @return A PdfAnnotation
+ */
+ public static PdfAnnotation createFreeText(PdfWriter writer, Rectangle rect, String contents, PdfContentByte defaultAppearance) {
+ PdfAnnotation annot = new PdfAnnotation(writer, rect);
+ annot.put(PdfName.SUBTYPE, PdfName.FREETEXT);
+ annot.put(PdfName.CONTENTS, new PdfString(contents, PdfObject.TEXT_UNICODE));
+ annot.setDefaultAppearanceString(defaultAppearance);
+ return annot;
+ }
+
+ /**
+ * Adds a line to the document. Move over the line and a tooltip is shown.
+ * @param writer
+ * @param rect
+ * @param contents
+ * @param x1
+ * @param y1
+ * @param x2
+ * @param y2
+ * @return A PdfAnnotation
+ */
+ public static PdfAnnotation createLine(PdfWriter writer, Rectangle rect, String contents, float x1, float y1, float x2, float y2) {
+ PdfAnnotation annot = new PdfAnnotation(writer, rect);
+ annot.put(PdfName.SUBTYPE, PdfName.LINE);
+ annot.put(PdfName.CONTENTS, new PdfString(contents, PdfObject.TEXT_UNICODE));
+ PdfArray array = new PdfArray(new PdfNumber(x1));
+ array.add(new PdfNumber(y1));
+ array.add(new PdfNumber(x2));
+ array.add(new PdfNumber(y2));
+ annot.put(PdfName.L, array);
+ return annot;
+ }
+
+ /**
+ * Adds a circle or a square that shows a tooltip when you pass over it.
+ * @param writer
+ * @param rect
+ * @param contents The tooltip
+ * @param square true if you want a square, false if you want a circle
+ * @return A PdfAnnotation
+ */
+ public static PdfAnnotation createSquareCircle(PdfWriter writer, Rectangle rect, String contents, boolean square) {
+ PdfAnnotation annot = new PdfAnnotation(writer, rect);
+ if (square)
+ annot.put(PdfName.SUBTYPE, PdfName.SQUARE);
+ else
+ annot.put(PdfName.SUBTYPE, PdfName.CIRCLE);
+ annot.put(PdfName.CONTENTS, new PdfString(contents, PdfObject.TEXT_UNICODE));
+ return annot;
+ }
+
+ public static PdfAnnotation createMarkup(PdfWriter writer, Rectangle rect, String contents, int type, float quadPoints[]) {
+ PdfAnnotation annot = new PdfAnnotation(writer, rect);
+ PdfName name = PdfName.HIGHLIGHT;
+ switch (type) {
+ case MARKUP_UNDERLINE:
+ name = PdfName.UNDERLINE;
+ break;
+ case MARKUP_STRIKEOUT:
+ name = PdfName.STRIKEOUT;
+ break;
+ }
+ annot.put(PdfName.SUBTYPE, name);
+ annot.put(PdfName.CONTENTS, new PdfString(contents, PdfObject.TEXT_UNICODE));
+ PdfArray array = new PdfArray();
+ for (int k = 0; k < quadPoints.length; ++k)
+ array.add(new PdfNumber(quadPoints[k]));
+ annot.put(PdfName.QUADPOINTS, array);
+ return annot;
+ }
+
+ /**
+ * Adds a Stamp to your document. Move over the stamp and a tooltip is shown
+ * @param writer
+ * @param rect
+ * @param contents
+ * @param name
+ * @return A PdfAnnotation
+ */
+ public static PdfAnnotation createStamp(PdfWriter writer, Rectangle rect, String contents, String name) {
+ PdfAnnotation annot = new PdfAnnotation(writer, rect);
+ annot.put(PdfName.SUBTYPE, PdfName.STAMP);
+ annot.put(PdfName.CONTENTS, new PdfString(contents, PdfObject.TEXT_UNICODE));
+ annot.put(PdfName.NAME, new PdfName(name));
+ return annot;
+ }
+
+ public static PdfAnnotation createInk(PdfWriter writer, Rectangle rect, String contents, float inkList[][]) {
+ PdfAnnotation annot = new PdfAnnotation(writer, rect);
+ annot.put(PdfName.SUBTYPE, PdfName.INK);
+ annot.put(PdfName.CONTENTS, new PdfString(contents, PdfObject.TEXT_UNICODE));
+ PdfArray outer = new PdfArray();
+ for (int k = 0; k < inkList.length; ++k) {
+ PdfArray inner = new PdfArray();
+ float deep[] = inkList[k];
+ for (int j = 0; j < deep.length; ++j)
+ inner.add(new PdfNumber(deep[j]));
+ outer.add(inner);
+ }
+ annot.put(PdfName.INKLIST, outer);
+ return annot;
+ }
+
+ /** Creates a file attachment annotation.
+ * @param writer the <CODE>PdfWriter</CODE>
+ * @param rect the dimensions in the page of the annotation
+ * @param contents the file description
+ * @param fileStore an array with the file. If it's <CODE>null</CODE>
+ * the file will be read from the disk
+ * @param file the path to the file. It will only be used if
+ * <CODE>fileStore</CODE> is not <CODE>null</CODE>
+ * @param fileDisplay the actual file name stored in the pdf
+ * @throws IOException on error
+ * @return the annotation
+ */
+ public static PdfAnnotation createFileAttachment(PdfWriter writer, Rectangle rect, String contents, byte fileStore[], String file, String fileDisplay) throws IOException {
+ return createFileAttachment(writer, rect, contents, PdfFileSpecification.fileEmbedded(writer, file, fileDisplay, fileStore));
+ }
+
+ /** Creates a file attachment annotation
+ * @param writer
+ * @param rect
+ * @param contents
+ * @param fs
+ * @return the annotation
+ * @throws IOException
+ */
+ public static PdfAnnotation createFileAttachment(PdfWriter writer, Rectangle rect, String contents, PdfFileSpecification fs) throws IOException {
+ PdfAnnotation annot = new PdfAnnotation(writer, rect);
+ annot.put(PdfName.SUBTYPE, PdfName.FILEATTACHMENT);
+ if (contents != null)
+ annot.put(PdfName.CONTENTS, new PdfString(contents, PdfObject.TEXT_UNICODE));
+ annot.put(PdfName.FS, fs.getReference());
+ return annot;
+ }
+
+ /**
+ * Adds a popup to your document.
+ * @param writer
+ * @param rect
+ * @param contents
+ * @param open
+ * @return A PdfAnnotation
+ */
+ public static PdfAnnotation createPopup(PdfWriter writer, Rectangle rect, String contents, boolean open) {
+ PdfAnnotation annot = new PdfAnnotation(writer, rect);
+ annot.put(PdfName.SUBTYPE, PdfName.POPUP);
+ if (contents != null)
+ annot.put(PdfName.CONTENTS, new PdfString(contents, PdfObject.TEXT_UNICODE));
+ if (open)
+ annot.put(PdfName.OPEN, PdfBoolean.PDFTRUE);
+ return annot;
+ }
+
+ public void setDefaultAppearanceString(PdfContentByte cb) {
+ byte b[] = cb.getInternalBuffer().toByteArray();
+ int len = b.length;
+ for (int k = 0; k < len; ++k) {
+ if (b[k] == '\n')
+ b[k] = 32;
+ }
+ put(PdfName.DA, new PdfString(b));
+ }
+
+ public void setFlags(int flags) {
+ if (flags == 0)
+ remove(PdfName.F);
+ else
+ put(PdfName.F, new PdfNumber(flags));
+ }
+
+ public void setBorder(PdfBorderArray border) {
+ putDel(PdfName.BORDER, border);
+ }
+
+ public void setBorderStyle(PdfBorderDictionary border) {
+ putDel(PdfName.BS, border);
+ }
+
+ /**
+ * Sets the annotation's highlighting mode. The values can be
+ * <CODE>HIGHLIGHT_NONE</CODE>, <CODE>HIGHLIGHT_INVERT</CODE>,
+ * <CODE>HIGHLIGHT_OUTLINE</CODE> and <CODE>HIGHLIGHT_PUSH</CODE>;
+ * @param highlight the annotation's highlighting mode
+ */
+ public void setHighlighting(PdfName highlight) {
+ if (highlight.equals(HIGHLIGHT_INVERT))
+ remove(PdfName.H);
+ else
+ put(PdfName.H, highlight);
+ }
+
+ public void setAppearance(PdfName ap, PdfTemplate template) {
+ PdfDictionary dic = (PdfDictionary)get(PdfName.AP);
+ if (dic == null)
+ dic = new PdfDictionary();
+ dic.put(ap, template.getIndirectReference());
+ put(PdfName.AP, dic);
+ if (!form)
+ return;
+ if (templates == null)
+ templates = new HashMap();
+ templates.put(template, null);
+ }
+
+ public void setAppearance(PdfName ap, String state, PdfTemplate template) {
+ PdfDictionary dicAp = (PdfDictionary)get(PdfName.AP);
+ if (dicAp == null)
+ dicAp = new PdfDictionary();
+
+ PdfDictionary dic;
+ PdfObject obj = dicAp.get(ap);
+ if (obj != null && obj.isDictionary())
+ dic = (PdfDictionary)obj;
+ else
+ dic = new PdfDictionary();
+ dic.put(new PdfName(state), template.getIndirectReference());
+ dicAp.put(ap, dic);
+ put(PdfName.AP, dicAp);
+ if (!form)
+ return;
+ if (templates == null)
+ templates = new HashMap();
+ templates.put(template, null);
+ }
+
+ public void setAppearanceState(String state) {
+ if (state == null) {
+ remove(PdfName.AS);
+ return;
+ }
+ put(PdfName.AS, new PdfName(state));
+ }
+
+ public void setColor(Color color) {
+ putDel(PdfName.C, new PdfColor(color));
+ }
+
+ public void setTitle(String title) {
+ if (title == null) {
+ remove(PdfName.T);
+ return;
+ }
+ put(PdfName.T, new PdfString(title, PdfObject.TEXT_UNICODE));
+ }
+
+ public void setPopup(PdfAnnotation popup) {
+ put(PdfName.POPUP, popup.getIndirectReference());
+ popup.put(PdfName.PARENT, getIndirectReference());
+ }
+
+ public void setAction(PdfAction action) {
+ putDel(PdfName.A, action);
+ }
+
+ public void setAdditionalActions(PdfName key, PdfAction action) {
+ PdfDictionary dic;
+ PdfObject obj = get(PdfName.AA);
+ if (obj != null && obj.isDictionary())
+ dic = (PdfDictionary)obj;
+ else
+ dic = new PdfDictionary();
+ dic.put(key, action);
+ put(PdfName.AA, dic);
+ }
+
+ /** Getter for property used.
+ * @return Value of property used.
+ */
+ public boolean isUsed() {
+ return used;
+ }
+
+ /** Setter for property used.
+ */
+ void setUsed() {
+ used = true;
+ }
+
+ HashMap getTemplates() {
+ return templates;
+ }
+
+ /** Getter for property form.
+ * @return Value of property form.
+ */
+ public boolean isForm() {
+ return form;
+ }
+
+ /** Getter for property annotation.
+ * @return Value of property annotation.
+ */
+ public boolean isAnnotation() {
+ return annotation;
+ }
+
+ public void setPage(int page) {
+ put(PdfName.P, writer.getPageReference(page));
+ }
+
+ public void setPage() {
+ put(PdfName.P, writer.getCurrentPage());
+ }
+
+ /** Getter for property placeInPage.
+ * @return Value of property placeInPage.
+ */
+ public int getPlaceInPage() {
+ return placeInPage;
+ }
+
+ /** Places the annotation in a specified page that must be greater
+ * or equal to the current one. With <code>PdfStamper</code> the page
+ * can be any. The first page is 1.
+ * @param placeInPage New value of property placeInPage.
+ */
+ public void setPlaceInPage(int placeInPage) {
+ this.placeInPage = placeInPage;
+ }
+
+ public void setRotate(int v) {
+ put(PdfName.ROTATE, new PdfNumber(v));
+ }
+
+ PdfDictionary getMK() {
+ PdfDictionary mk = (PdfDictionary)get(PdfName.MK);
+ if (mk == null) {
+ mk = new PdfDictionary();
+ put(PdfName.MK, mk);
+ }
+ return mk;
+ }
+
+ public void setMKRotation(int rotation) {
+ getMK().put(PdfName.R, new PdfNumber(rotation));
+ }
+
+ public static PdfArray getMKColor(Color color) {
+ PdfArray array = new PdfArray();
+ int type = ExtendedColor.getType(color);
+ switch (type) {
+ case ExtendedColor.TYPE_GRAY: {
+ array.add(new PdfNumber(((GrayColor)color).getGray()));
+ break;
+ }
+ case ExtendedColor.TYPE_CMYK: {
+ CMYKColor cmyk = (CMYKColor)color;
+ array.add(new PdfNumber(cmyk.getCyan()));
+ array.add(new PdfNumber(cmyk.getMagenta()));
+ array.add(new PdfNumber(cmyk.getYellow()));
+ array.add(new PdfNumber(cmyk.getBlack()));
+ break;
+ }
+ case ExtendedColor.TYPE_SEPARATION:
+ case ExtendedColor.TYPE_PATTERN:
+ case ExtendedColor.TYPE_SHADING:
+ throw new RuntimeException("Separations, patterns and shadings are not allowed in MK dictionary.");
+ default:
+ array.add(new PdfNumber(color.getRed() / 255f));
+ array.add(new PdfNumber(color.getGreen() / 255f));
+ array.add(new PdfNumber(color.getBlue() / 255f));
+ }
+ return array;
+ }
+
+ public void setMKBorderColor(Color color) {
+ if (color == null)
+ getMK().remove(PdfName.BC);
+ else
+ getMK().put(PdfName.BC, getMKColor(color));
+ }
+
+ public void setMKBackgroundColor(Color color) {
+ if (color == null)
+ getMK().remove(PdfName.BG);
+ else
+ getMK().put(PdfName.BG, getMKColor(color));
+ }
+
+ public void setMKNormalCaption(String caption) {
+ getMK().put(PdfName.CA, new PdfString(caption, PdfObject.TEXT_UNICODE));
+ }
+
+ public void setMKRolloverCaption(String caption) {
+ getMK().put(PdfName.RC, new PdfString(caption, PdfObject.TEXT_UNICODE));
+ }
+
+ public void setMKAlternateCaption(String caption) {
+ getMK().put(PdfName.AC, new PdfString(caption, PdfObject.TEXT_UNICODE));
+ }
+
+ public void setMKNormalIcon(PdfTemplate template) {
+ getMK().put(PdfName.I, template.getIndirectReference());
+ }
+
+ public void setMKRolloverIcon(PdfTemplate template) {
+ getMK().put(PdfName.RI, template.getIndirectReference());
+ }
+
+ public void setMKAlternateIcon(PdfTemplate template) {
+ getMK().put(PdfName.IX, template.getIndirectReference());
+ }
+
+ public void setMKIconFit(PdfName scale, PdfName scalingType, float leftoverLeft, float leftoverBottom, boolean fitInBounds) {
+ PdfDictionary dic = new PdfDictionary();
+ if (!scale.equals(PdfName.A))
+ dic.put(PdfName.SW, scale);
+ if (!scalingType.equals(PdfName.P))
+ dic.put(PdfName.S, scalingType);
+ if (leftoverLeft != 0.5f || leftoverBottom != 0.5f) {
+ PdfArray array = new PdfArray(new PdfNumber(leftoverLeft));
+ array.add(new PdfNumber(leftoverBottom));
+ dic.put(PdfName.A, array);
+ }
+ if (fitInBounds)
+ dic.put(PdfName.FB, PdfBoolean.PDFTRUE);
+ getMK().put(PdfName.IF, dic);
+ }
+
+ public void setMKTextPosition(int tp) {
+ getMK().put(PdfName.TP, new PdfNumber(tp));
+ }
+
+ /**
+ * Sets the layer this annotation belongs to.
+ * @param layer the layer this annotation belongs to
+ */
+ public void setLayer(PdfOCG layer) {
+ put(PdfName.OC, layer.getRef());
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/pdf/PdfAppearance.java b/src/main/java/com/lowagie/text/pdf/PdfAppearance.java
new file mode 100644
index 0000000..2189762
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/PdfAppearance.java
@@ -0,0 +1,155 @@
+/*
+ * Copyright 2002 Paulo Soares
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf;
+import com.lowagie.text.Rectangle;
+import java.util.HashMap;
+
+/**
+ * Implements the appearance stream to be used with form fields..
+ */
+
+public class PdfAppearance extends PdfTemplate {
+
+ public static final HashMap stdFieldFontNames = new HashMap();
+ static {
+ stdFieldFontNames.put("Courier-BoldOblique", new PdfName("CoBO"));
+ stdFieldFontNames.put("Courier-Bold", new PdfName("CoBo"));
+ stdFieldFontNames.put("Courier-Oblique", new PdfName("CoOb"));
+ stdFieldFontNames.put("Courier", new PdfName("Cour"));
+ stdFieldFontNames.put("Helvetica-BoldOblique", new PdfName("HeBO"));
+ stdFieldFontNames.put("Helvetica-Bold", new PdfName("HeBo"));
+ stdFieldFontNames.put("Helvetica-Oblique", new PdfName("HeOb"));
+ stdFieldFontNames.put("Helvetica", new PdfName("Helv"));
+ stdFieldFontNames.put("Symbol", new PdfName("Symb"));
+ stdFieldFontNames.put("Times-BoldItalic", new PdfName("TiBI"));
+ stdFieldFontNames.put("Times-Bold", new PdfName("TiBo"));
+ stdFieldFontNames.put("Times-Italic", new PdfName("TiIt"));
+ stdFieldFontNames.put("Times-Roman", new PdfName("TiRo"));
+ stdFieldFontNames.put("ZapfDingbats", new PdfName("ZaDb"));
+ stdFieldFontNames.put("HYSMyeongJo-Medium", new PdfName("HySm"));
+ stdFieldFontNames.put("HYGoThic-Medium", new PdfName("HyGo"));
+ stdFieldFontNames.put("HeiseiKakuGo-W5", new PdfName("KaGo"));
+ stdFieldFontNames.put("HeiseiMin-W3", new PdfName("KaMi"));
+ stdFieldFontNames.put("MHei-Medium", new PdfName("MHei"));
+ stdFieldFontNames.put("MSung-Light", new PdfName("MSun"));
+ stdFieldFontNames.put("STSong-Light", new PdfName("STSo"));
+ stdFieldFontNames.put("MSungStd-Light", new PdfName("MSun"));
+ stdFieldFontNames.put("STSongStd-Light", new PdfName("STSo"));
+ stdFieldFontNames.put("HYSMyeongJoStd-Medium", new PdfName("HySm"));
+ stdFieldFontNames.put("KozMinPro-Regular", new PdfName("KaMi"));
+ }
+
+ /**
+ *Creates a <CODE>PdfAppearance</CODE>.
+ */
+
+ PdfAppearance() {
+ super();
+ separator = ' ';
+ }
+
+ PdfAppearance(PdfIndirectReference iref) {
+ thisReference = iref;
+ }
+
+ /**
+ * Creates new PdfTemplate
+ *
+ * @param wr the <CODE>PdfWriter</CODE>
+ */
+
+ PdfAppearance(PdfWriter wr) {
+ super(wr);
+ separator = ' ';
+ }
+
+ /**
+ * Set the font and the size for the subsequent text writing.
+ *
+ * @param bf the font
+ * @param size the font size in points
+ */
+ public void setFontAndSize(BaseFont bf, float size) {
+ checkWriter();
+ state.size = size;
+ if (bf.getFontType() == BaseFont.FONT_TYPE_DOCUMENT) {
+ state.fontDetails = new FontDetails(null, ((DocumentFont)bf).getIndirectReference(), bf);
+ }
+ else
+ state.fontDetails = writer.addSimple(bf);
+ PdfName psn = (PdfName)stdFieldFontNames.get(bf.getPostscriptFontName());
+ if (psn == null) {
+ if (bf.isSubset() && bf.getFontType() == BaseFont.FONT_TYPE_TTUNI)
+ psn = state.fontDetails.getFontName();
+ else {
+ psn = new PdfName(bf.getPostscriptFontName());
+ state.fontDetails.setSubset(false);
+ }
+ }
+ PageResources prs = getPageResources();
+// PdfName name = state.fontDetails.getFontName();
+ prs.addFont(psn, state.fontDetails.getIndirectReference());
+ content.append(psn.getBytes()).append(' ').append(size).append(" Tf").append_i(separator);
+ }
+
+ public PdfContentByte getDuplicate() {
+ PdfAppearance tpl = new PdfAppearance();
+ tpl.writer = writer;
+ tpl.pdf = pdf;
+ tpl.thisReference = thisReference;
+ tpl.pageResources = pageResources;
+ tpl.bBox = new Rectangle(bBox);
+ tpl.group = group;
+ tpl.layer = layer;
+ if (matrix != null) {
+ tpl.matrix = new PdfArray(matrix);
+ }
+ tpl.separator = separator;
+ return tpl;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/pdf/PdfArray.java b/src/main/java/com/lowagie/text/pdf/PdfArray.java
new file mode 100644
index 0000000..30be4ef
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/PdfArray.java
@@ -0,0 +1,227 @@
+/*
+ * $Id: PdfArray.java,v 1.62 2005/11/29 21:05:02 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 1999, 2000, 2001, 2002 Bruno Lowagie
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.ListIterator;
+
+/**
+ * <CODE>PdfArray</CODE> is the PDF Array object.
+ * <P>
+ * An array is a sequence of PDF objects. An array may contain a mixture of object types.
+ * An array is written as a left square bracket ([), followed by a sequence of objects,
+ * followed by a right square bracket (]).<BR>
+ * This object is described in the 'Portable Document Format Reference Manual version 1.3'
+ * section 4.6 (page 40).
+ *
+ * @see PdfObject
+ */
+
+public class PdfArray extends PdfObject {
+
+ // membervariables
+
+/** this is the actual array of PdfObjects */
+ protected ArrayList arrayList;
+
+ // constructors
+
+/**
+ * Constructs an empty <CODE>PdfArray</CODE>-object.
+ */
+
+ public PdfArray() {
+ super(ARRAY);
+ arrayList = new ArrayList();
+ }
+
+/**
+ * Constructs an <CODE>PdfArray</CODE>-object, containing 1 <CODE>PdfObject</CODE>.
+ *
+ * @param object a <CODE>PdfObject</CODE> that has to be added to the array
+ */
+
+ public PdfArray(PdfObject object) {
+ super(ARRAY);
+ arrayList = new ArrayList();
+ arrayList.add(object);
+ }
+
+ public PdfArray(float values[]) {
+ super(ARRAY);
+ arrayList = new ArrayList();
+ add(values);
+ }
+
+ public PdfArray(int values[]) {
+ super(ARRAY);
+ arrayList = new ArrayList();
+ add(values);
+ }
+
+/**
+ * Constructs an <CODE>PdfArray</CODE>-object, containing all the <CODE>PdfObject</CODE>s in a given <CODE>PdfArray</CODE>.
+ *
+ * @param array a <CODE>PdfArray</CODE> that has to be added to the array
+ */
+
+ public PdfArray(PdfArray array) {
+ super(ARRAY);
+ arrayList = new ArrayList(array.getArrayList());
+ }
+
+ // methods overriding some methods in PdfObject
+
+/**
+ * Returns the PDF representation of this <CODE>PdfArray</CODE>.
+ *
+ * @return an array of <CODE>byte</CODE>s
+ */
+
+ public void toPdf(PdfWriter writer, OutputStream os) throws IOException {
+ os.write('[');
+
+ Iterator i = arrayList.iterator();
+ PdfObject object;
+ int type = 0;
+ if (i.hasNext()) {
+ object = (PdfObject) i.next();
+ object.toPdf(writer, os);
+ }
+ while (i.hasNext()) {
+ object = (PdfObject) i.next();
+ type = object.type();
+ if (type != PdfObject.ARRAY && type != PdfObject.DICTIONARY && type != PdfObject.NAME && type != PdfObject.STRING)
+ os.write(' ');
+ object.toPdf(writer, os);
+ }
+ os.write(']');
+ }
+
+ // methods concerning the ArrayList-membervalue
+
+/**
+ * Returns an ArrayList containing <CODE>PdfObject</CODE>s.
+ *
+ * @return an ArrayList
+ */
+
+ public ArrayList getArrayList() {
+ return arrayList;
+ }
+
+/**
+ * Returns the number of entries in the array.
+ *
+ * @return the size of the ArrayList
+ */
+
+ public int size() {
+ return arrayList.size();
+ }
+
+/**
+ * Adds a <CODE>PdfObject</CODE> to the <CODE>PdfArray</CODE>.
+ *
+ * @param object <CODE>PdfObject</CODE> to add
+ * @return <CODE>true</CODE>
+ */
+
+ public boolean add(PdfObject object) {
+ return arrayList.add(object);
+ }
+
+ public boolean add(float values[]) {
+ for (int k = 0; k < values.length; ++k)
+ arrayList.add(new PdfNumber(values[k]));
+ return true;
+ }
+
+ public boolean add(int values[]) {
+ for (int k = 0; k < values.length; ++k)
+ arrayList.add(new PdfNumber(values[k]));
+ return true;
+ }
+
+/**
+ * Adds a <CODE>PdfObject</CODE> to the <CODE>PdfArray</CODE>.
+ * <P>
+ * The newly added object will be the first element in the <CODE>ArrayList</CODE>.
+ *
+ * @param object <CODE>PdfObject</CODE> to add
+ */
+
+ public void addFirst(PdfObject object) {
+ arrayList.add(0, object);
+ }
+
+/**
+ * Checks if the <CODE>PdfArray</CODE> already contains a certain <CODE>PdfObject</CODE>.
+ *
+ * @param object <CODE>PdfObject</CODE> to check
+ * @return <CODE>true</CODE>
+ */
+
+ public boolean contains(PdfObject object) {
+ return arrayList.contains(object);
+ }
+
+ public ListIterator listIterator() {
+ return arrayList.listIterator();
+ }
+
+ public String toString() {
+ return arrayList.toString();
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/pdf/PdfBoolean.java b/src/main/java/com/lowagie/text/pdf/PdfBoolean.java
new file mode 100644
index 0000000..1bd2fc8
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/PdfBoolean.java
@@ -0,0 +1,134 @@
+/*
+ * $Id: PdfBoolean.java,v 1.55 2005/11/29 21:05:02 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 1999, 2000, 2001, 2002 Bruno Lowagie
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf;
+
+/**
+ * <CODE>PdfBoolean</CODE> is the boolean object represented by the keywords <VAR>true</VAR> or <VAR>false</VAR>.
+ * <P>
+ * This object is described in the 'Portable Document Format Reference Manual version 1.3'
+ * section 4.2 (page 37).
+ *
+ * @see PdfObject
+ * @see BadPdfFormatException
+ */
+
+public class PdfBoolean extends PdfObject {
+
+ // static membervariables (possible values of a boolean object)
+ public static final PdfBoolean PDFTRUE = new PdfBoolean(true);
+ public static final PdfBoolean PDFFALSE = new PdfBoolean(false);
+/** A possible value of <CODE>PdfBoolean</CODE> */
+ public static final String TRUE = "true";
+
+/** A possible value of <CODE>PdfBoolean</CODE> */
+ public static final String FALSE = "false";
+
+ // membervariables
+
+/** the boolean value of this object */
+ private boolean value;
+
+ // constructors
+
+/**
+ * Constructs a <CODE>PdfBoolean</CODE>-object.
+ *
+ * @param value the value of the new <CODE>PdfObject</CODE>
+ */
+
+ public PdfBoolean(boolean value) {
+ super(BOOLEAN);
+ if (value) {
+ setContent(TRUE);
+ }
+ else {
+ setContent(FALSE);
+ }
+ this.value = value;
+ }
+
+/**
+ * Constructs a <CODE>PdfBoolean</CODE>-object.
+ *
+ * @param value the value of the new <CODE>PdfObject</CODE>, represented as a <CODE>String</CODE>
+ *
+ * @throws BadPdfFormatException thrown if the <VAR>value</VAR> isn't '<CODE>true</CODE>' or '<CODE>false</CODE>'
+ */
+
+ public PdfBoolean(String value) throws BadPdfFormatException {
+ super(BOOLEAN, value);
+ if (value.equals(TRUE)) {
+ this.value = true;
+ }
+ else if (value.equals(FALSE)) {
+ this.value = false;
+ }
+ else {
+ throw new BadPdfFormatException("The value has to be 'true' of 'false', instead of '" + value + "'.");
+ }
+ }
+
+ // methods returning the value of this object
+
+/**
+ * Returns the primitive value of the <CODE>PdfBoolean</CODE>-object.
+ *
+ * @return the actual value of the object.
+ */
+
+ public boolean booleanValue() {
+ return value;
+ }
+
+ public String toString() {
+ return String.valueOf(value);
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/pdf/PdfBorderArray.java b/src/main/java/com/lowagie/text/pdf/PdfBorderArray.java
new file mode 100644
index 0000000..170bb4c
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/PdfBorderArray.java
@@ -0,0 +1,82 @@
+/*
+ * $Id: PdfBorderArray.java,v 1.55 2005/05/04 14:32:24 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 1999, 2000, 2001, 2002 Bruno Lowagie
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf;
+
+/**
+ * A <CODE>PdfBorderArray</CODE> defines the border of a <CODE>PdfAnnotation</CODE>.
+ *
+ * @see PdfArray
+ */
+
+public class PdfBorderArray extends PdfArray {
+
+ // constructors
+
+/**
+ * Constructs a new <CODE>PdfBorderArray</CODE>.
+ */
+
+ public PdfBorderArray(float hRadius, float vRadius, float width) {
+ this(hRadius, vRadius, width, null);
+ }
+
+/**
+ * Constructs a new <CODE>PdfBorderArray</CODE>.
+ */
+
+ public PdfBorderArray(float hRadius, float vRadius, float width, PdfDashPattern dash) {
+ super(new PdfNumber(hRadius));
+ add(new PdfNumber(vRadius));
+ add(new PdfNumber(width));
+ if (dash != null)
+ add(dash);
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/pdf/PdfBorderDictionary.java b/src/main/java/com/lowagie/text/pdf/PdfBorderDictionary.java
new file mode 100644
index 0000000..687b9b0
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/PdfBorderDictionary.java
@@ -0,0 +1,100 @@
+/*
+ * $Id: PdfBorderDictionary.java,v 1.54 2005/05/04 14:31:49 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 1999, 2000, 2001, 2002 Bruno Lowagie
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf;
+
+/**
+ * A <CODE>PdfBorderDictionary</CODE> define the appearance of a Border (Annotations).
+ *
+ * @see PdfDictionary
+ */
+
+public class PdfBorderDictionary extends PdfDictionary {
+
+ public static final int STYLE_SOLID = 0;
+ public static final int STYLE_DASHED = 1;
+ public static final int STYLE_BEVELED = 2;
+ public static final int STYLE_INSET = 3;
+ public static final int STYLE_UNDERLINE = 4;
+ // constructors
+
+/**
+ * Constructs a <CODE>PdfBorderDictionary</CODE>.
+ */
+
+ public PdfBorderDictionary(float borderWidth, int borderStyle, PdfDashPattern dashes) {
+ put(PdfName.W, new PdfNumber(borderWidth));
+ switch (borderStyle) {
+ case STYLE_SOLID:
+ put(PdfName.S, PdfName.S);
+ break;
+ case STYLE_DASHED:
+ if (dashes != null)
+ put(PdfName.D, dashes);
+ put(PdfName.S, PdfName.D);
+ break;
+ case STYLE_BEVELED:
+ put(PdfName.S, PdfName.B);
+ break;
+ case STYLE_INSET:
+ put(PdfName.S, PdfName.I);
+ break;
+ case STYLE_UNDERLINE:
+ put(PdfName.S, PdfName.U);
+ break;
+ default:
+ throw new IllegalArgumentException("Invalid border style.");
+ }
+ }
+
+ public PdfBorderDictionary(float borderWidth, int borderStyle) {
+ this(borderWidth, borderStyle, null);
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/pdf/PdfCell.java b/src/main/java/com/lowagie/text/pdf/PdfCell.java
new file mode 100644
index 0000000..909b884
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/PdfCell.java
@@ -0,0 +1,890 @@
+/*
+ * $Id: PdfCell.java,v 1.98 2005/11/01 12:27:04 psoares33 Exp $
+ * $Name: $
+ *
+ * Copyright 1999, 2000, 2001, 2002 Bruno Lowagie
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+
+import com.lowagie.text.*;
+
+/**
+ * A <CODE>PdfCell</CODE> is the PDF translation of a <CODE>Cell</CODE>.
+ * <P>
+ * A <CODE>PdfCell</CODE> is an <CODE>ArrayList</CODE> of <CODE>PdfLine</CODE>s.
+ * <P>
+ * When using variable borders ({@link com.lowagie.text.Rectangle#isUseVariableBorders isUseVariableBorders()} == true),
+ * the borders are drawn completely inside the cell Rectangle
+ * so that adjacent cell borders will not overlap.
+ * Otherwise, the borders are drawn on top of the edges of the
+ * cell Rectangle and will overlap the borders of adjacent
+ * cells.
+ *
+ * @see com.lowagie.text.Rectangle
+ * @see com.lowagie.text.Cell
+ * @see PdfLine
+ * @see PdfTable
+ */
+
+public class PdfCell extends Rectangle {
+
+ // membervariables
+
+ /**
+ * These are the PdfLines in the Cell.
+ */
+ private ArrayList lines;
+
+ /**
+ * These are the PdfLines in the Cell.
+ */
+ private PdfLine line;
+
+ /**
+ * These are the Images in the Cell.
+ */
+ private ArrayList images;
+
+ /**
+ * This is the leading of the lines.
+ */
+ private float leading;
+
+ /**
+ * This is the number of the row the cell is in.
+ */
+ private int rownumber;
+
+ /**
+ * This is the rowspan of the cell.
+ */
+ private int rowspan;
+
+ /**
+ * This is the cellspacing of the cell.
+ */
+ private float cellspacing;
+
+ /**
+ * This is the cellpadding of the cell.
+ */
+ private float cellpadding;
+
+ /**
+ * Indicates if this cell belongs to the header of a <CODE>PdfTable</CODE>
+ */
+ private boolean header = false;
+
+ /**
+ * This is the total height of the content of the cell. Note that the actual cell
+ * height may be larger due to another cell on the row *
+ */
+ private float contentHeight = 0.0f;
+
+ /**
+ * Indicates that the largest ascender height should be used to
+ * determine the height of the first line. Setting this to true can help
+ * with vertical alignment problems. */
+ private boolean useAscender;
+
+ /**
+ * Indicates that the largest descender height should be added to the height of
+ * the last line (so characters like y don't dip into the border). */
+ private boolean useDescender;
+
+ /**
+ * Adjusts the cell contents to compensate for border widths.
+ */
+ private boolean useBorderPadding;
+
+ private int verticalAlignment;
+
+ private PdfLine firstLine;
+ private PdfLine lastLine;
+
+ // constructors
+
+ /**
+ * Constructs a <CODE>PdfCell</CODE>-object.
+ *
+ * @param cell the original <CODE>Cell</CODE>
+ * @param rownumber the number of the <CODE>Row</CODE> the <CODE>Cell</CODE> was in.
+ * @param left the left border of the <CODE>PdfCell</CODE>
+ * @param right the right border of the <CODE>PdfCell</CODE>
+ * @param top the top border of the <CODE>PdfCell</CODE>
+ * @param cellspacing the cellspacing of the <CODE>Table</CODE>
+ * @param cellpadding the cellpadding of the <CODE>Table</CODE>
+ */
+
+ public PdfCell(Cell cell, int rownumber, float left, float right, float top, float cellspacing, float cellpadding) {
+ // constructs a Rectangle (the bottomvalue will be changed afterwards)
+ super(left, top, right, top);
+ // copying the other Rectangle attributes from class Cell
+ cloneNonPositionParameters(cell);
+ this.cellpadding = cellpadding;
+ this.cellspacing = cellspacing;
+ this.verticalAlignment = cell.verticalAlignment();
+ this.useAscender = cell.isUseAscender();
+ this.useDescender = cell.isUseDescender();
+ this.useBorderPadding = cell.isUseBorderPadding();
+
+ // initialisation of some parameters
+ PdfChunk chunk;
+ Element element;
+ PdfChunk overflow;
+ lines = new ArrayList();
+ images = new ArrayList();
+ leading = cell.leading();
+ int alignment = cell.horizontalAlignment();
+ left += cellspacing + cellpadding;
+ right -= cellspacing + cellpadding;
+
+ left += getBorderWidthInside(LEFT);
+ right -= getBorderWidthInside(RIGHT);
+
+
+ contentHeight = 0;
+
+ rowspan = cell.rowspan();
+
+ ArrayList allActions;
+ int aCounter;
+ // we loop over all the elements of the cell
+ for (Iterator i = cell.getElements(); i.hasNext();) {
+ element = (Element) i.next();
+ switch (element.type()) {
+ case Element.JPEG:
+ case Element.IMGRAW:
+ case Element.IMGTEMPLATE:
+ addImage((Image) element, left, right, 0.4f * leading, alignment); //
+ break;
+ // if the element is a list
+ case Element.LIST:
+ if (line != null && line.size() > 0) {
+ line.resetAlignment();
+ addLine(line);
+ }
+ allActions = new ArrayList();
+ processActions(element, null, allActions);
+ aCounter = 0;
+ ListItem item;
+ // we loop over all the listitems
+ for (Iterator items = ((List) element).getItems().iterator(); items.hasNext();) {
+ item = (ListItem) items.next();
+ line = new PdfLine(left + item.indentationLeft(), right, alignment, item.leading());
+ line.setListItem(item);
+ for (Iterator j = item.getChunks().iterator(); j.hasNext();) {
+ chunk = new PdfChunk((Chunk) j.next(), (PdfAction) (allActions.get(aCounter++)));
+ while ((overflow = line.add(chunk)) != null) {
+ addLine(line);
+ line = new PdfLine(left + item.indentationLeft(), right, alignment, item.leading());
+ chunk = overflow;
+ }
+ line.resetAlignment();
+ addLine(line);
+ line = new PdfLine(left + item.indentationLeft(), right, alignment, leading);
+ }
+ }
+ line = new PdfLine(left, right, alignment, leading);
+ break;
+ // if the element is something else
+ default:
+ allActions = new ArrayList();
+ processActions(element, null, allActions);
+ aCounter = 0;
+
+ float currentLineLeading = leading;
+ float currentLeft = left;
+ float currentRight = right;
+ if (element instanceof Phrase) {
+ currentLineLeading = ((Phrase) element).leading();
+ }
+ if (element instanceof Paragraph) {
+ Paragraph p = (Paragraph) element;
+ currentLeft += p.indentationLeft();
+ currentRight -= p.indentationRight();
+ }
+ if (line == null) {
+ line = new PdfLine(currentLeft, currentRight, alignment, currentLineLeading);
+ }
+ // we loop over the chunks
+ ArrayList chunks = element.getChunks();
+ if (chunks.isEmpty()) {
+ addLine(line); // add empty line - all cells need some lines even if they are empty
+ line = new PdfLine(currentLeft, currentRight, alignment, currentLineLeading);
+ }
+ else {
+ for (Iterator j = chunks.iterator(); j.hasNext();) {
+ Chunk c = (Chunk) j.next();
+ chunk = new PdfChunk(c, (PdfAction) (allActions.get(aCounter++)));
+ while ((overflow = line.add(chunk)) != null) {
+ addLine(line);
+ line = new PdfLine(currentLeft, currentRight, alignment, currentLineLeading);
+ chunk = overflow;
+ }
+ }
+ }
+ // if the element is a paragraph, section or chapter, we reset the alignment and add the line
+ switch (element.type()) {
+ case Element.PARAGRAPH:
+ case Element.SECTION:
+ case Element.CHAPTER:
+ line.resetAlignment();
+ flushCurrentLine();
+ }
+ }
+ }
+ flushCurrentLine();
+ if (lines.size() > cell.getMaxLines()) {
+ while (lines.size() > cell.getMaxLines()) {
+ removeLine(lines.size() - 1);
+ }
+ if (cell.getMaxLines() > 0) {
+ String more = cell.getShowTruncation();
+ if (more != null && more.length() > 0) {
+ // Denote that the content has been truncated
+ lastLine = (PdfLine) lines.get(lines.size() - 1);
+ if (lastLine.size() >= 0) {
+ PdfChunk lastChunk = lastLine.getChunk(lastLine.size() - 1);
+ float moreWidth = new PdfChunk(more, lastChunk).width();
+ while (lastChunk.toString().length() > 0 && lastChunk.width() + moreWidth > right - left) {
+ // Remove characters to leave room for the 'more' indicator
+ lastChunk.setValue(lastChunk.toString().substring(0, lastChunk.length() - 1));
+ }
+ lastChunk.setValue(lastChunk.toString() + more);
+ } else {
+ lastLine.add(new PdfChunk(new Chunk(more), null));
+ }
+ }
+ }
+ }
+ // we set some additional parameters
+ if (useDescender && lastLine != null) {
+ contentHeight -= lastLine.getDescender();
+ }
+
+ // adjust first line height so that it touches the top
+ if (lines.size() > 0) {
+ firstLine = (PdfLine) lines.get(0);
+ float firstLineRealHeight = firstLineRealHeight();
+ contentHeight -= firstLine.height();
+ firstLine.height = firstLineRealHeight;
+ contentHeight += firstLineRealHeight;
+ }
+
+ float newBottom = top - contentHeight - (2f * cellpadding()) - (2f * cellspacing());
+ newBottom -= getBorderWidthInside(TOP) + getBorderWidthInside(BOTTOM);
+ setBottom(newBottom);
+
+ this.rownumber = rownumber;
+ }
+
+
+
+
+ // overriding of the Rectangle methods
+
+
+ /**
+ * Sets the bottom of the Rectangle and determines the proper {link #verticalOffset}
+ * to appropriately align the contents vertically.
+ * @param value
+ */
+ public void setBottom(float value) {
+ super.setBottom(value);
+ float firstLineRealHeight = firstLineRealHeight();
+
+ float totalHeight = ury - value; // can't use top (already compensates for cellspacing)
+ float nonContentHeight = (cellpadding() * 2f) + (cellspacing() * 2f);
+ nonContentHeight += getBorderWidthInside(TOP) + getBorderWidthInside(BOTTOM);
+
+ float interiorHeight = totalHeight - nonContentHeight;
+ float extraHeight = 0.0f;
+
+ switch (verticalAlignment) {
+ case Element.ALIGN_BOTTOM:
+ extraHeight = interiorHeight - contentHeight;
+ break;
+ case Element.ALIGN_MIDDLE:
+ extraHeight = (interiorHeight - contentHeight) / 2.0f;
+ break;
+ default: // ALIGN_TOP
+ extraHeight = 0f;
+ }
+
+ extraHeight += cellpadding() + cellspacing();
+ extraHeight += getBorderWidthInside(TOP);
+ if (firstLine != null) {
+ firstLine.height = firstLineRealHeight + extraHeight;
+ }
+ }
+
+ /**
+ * Returns the lower left x-coordinaat.
+ *
+ * @return the lower left x-coordinaat
+ */
+
+ public float left() {
+ return super.left(cellspacing);
+ }
+
+ /**
+ * Returns the upper right x-coordinate.
+ *
+ * @return the upper right x-coordinate
+ */
+
+ public float right() {
+ return super.right(cellspacing);
+ }
+
+ /**
+ * Returns the upper right y-coordinate.
+ *
+ * @return the upper right y-coordinate
+ */
+
+ public float top() {
+ return super.top(cellspacing);
+ }
+
+ /**
+ * Returns the lower left y-coordinate.
+ *
+ * @return the lower left y-coordinate
+ */
+
+ public float bottom() {
+ return super.bottom(cellspacing);
+ }
+
+ // methods
+
+ private void addLine(PdfLine line) {
+ lines.add(line);
+ contentHeight += line.height();
+ lastLine = line;
+ this.line = null;
+ }
+
+ private PdfLine removeLine(int index) {
+ PdfLine oldLine = (PdfLine) lines.remove(index);
+ contentHeight -= oldLine.height();
+ if (index == 0) {
+ if (lines.size() > 0) {
+ firstLine = (PdfLine) lines.get(0);
+ float firstLineRealHeight = firstLineRealHeight();
+ contentHeight -= firstLine.height();
+ firstLine.height = firstLineRealHeight;
+ contentHeight += firstLineRealHeight;
+ }
+ }
+ return oldLine;
+ }
+
+ private void flushCurrentLine() {
+ if (line != null && line.size() > 0) {
+ addLine(line);
+ }
+ }
+
+ /**
+ * Calculates what the height of the first line should be so that the content will be
+ * flush with the top. For text, this is the height of the ascender. For an image,
+ * it is the actual height of the image.
+ * @return the real height of the first line
+ */
+ private float firstLineRealHeight() {
+ float firstLineRealHeight = 0f;
+ if (firstLine != null) {
+ PdfChunk chunk = firstLine.getChunk(0);
+ if (chunk != null) {
+ Image image = chunk.getImage();
+ if (image != null) {
+ firstLineRealHeight = firstLine.getChunk(0).getImage().scaledHeight();
+ } else {
+ firstLineRealHeight = useAscender ? firstLine.getAscender() : leading;
+ }
+ }
+ }
+ return firstLineRealHeight;
+ }
+
+ /**
+ * Gets the amount of the border for the specified side that is inside the Rectangle.
+ * For non-variable width borders this is only 1/2 the border width on that side. This
+ * always returns 0 if {@link #useBorderPadding} is false;
+ * @param side the side to check. One of the side constants in {@link com.lowagie.text.Rectangle}
+ * @return the borderwidth inside the cell
+ */
+ private float getBorderWidthInside(int side) {
+ float width = 0f;
+ if (useBorderPadding) {
+ switch (side) {
+ case Rectangle.LEFT:
+ width = getBorderWidthLeft();
+ break;
+
+ case Rectangle.RIGHT:
+ width = getBorderWidthRight();
+ break;
+
+ case Rectangle.TOP:
+ width = getBorderWidthTop();
+ break;
+
+ default: // default and BOTTOM
+ width = getBorderWidthBottom();
+ break;
+ }
+ // non-variable (original style) borders overlap the rectangle (only 1/2 counts)
+ if (!isUseVariableBorders()) {
+ width = width / 2f;
+ }
+ }
+ return width;
+ }
+
+
+ /**
+ * Adds an image to this Cell.
+ *
+ * @param i the image to add
+ * @param left the left border
+ * @param right the right border
+ * @param extraHeight extra height to add above image
+ * @param alignment horizontal alignment (constant from Element class)
+ * @return the height of the image
+ */
+
+ private float addImage(Image i, float left, float right, float extraHeight, int alignment) {
+ Image image = Image.getInstance(i);
+ if (image.scaledWidth() > right - left) {
+ image.scaleToFit(right - left, Float.MAX_VALUE);
+ }
+ flushCurrentLine();
+ if (line == null) {
+ line = new PdfLine(left, right, alignment, leading);
+ }
+ PdfLine imageLine = line;
+
+ // left and right in chunk is relative to the start of the line
+ right = right - left;
+ left = 0f;
+
+ if ((image.alignment() & Image.RIGHT) == Image.RIGHT) { // fix Uwe Zimmerman
+ left = right - image.scaledWidth();
+ } else if ((image.alignment() & Image.MIDDLE) == Image.MIDDLE) {
+ left = left + ((right - left - image.scaledWidth()) / 2f);
+ }
+ Chunk imageChunk = new Chunk(image, left, 0);
+ imageLine.add(new PdfChunk(imageChunk, null));
+ addLine(imageLine);
+ return imageLine.height();
+ }
+
+ /**
+ * Gets the lines of a cell that can be drawn between certain limits.
+ * <P>
+ * Remark: all the lines that can be drawn are removed from the object!
+ *
+ * @param top the top of the part of the table that can be drawn
+ * @param bottom the bottom of the part of the table that can be drawn
+ * @return an <CODE>ArrayList</CODE> of <CODE>PdfLine</CODE>s
+ */
+
+ public ArrayList getLines(float top, float bottom) {
+ float lineHeight;
+ float currentPosition = Math.min(top(), top);
+ setTop(currentPosition + cellspacing);
+ ArrayList result = new ArrayList();
+
+ // if the bottom of the page is higher than the top of the cell: do nothing
+ if (top() < bottom) {
+ return result;
+ }
+
+ // we loop over the lines
+ int size = lines.size();
+ boolean aboveBottom = true;
+ for (int i = 0; i < size && aboveBottom; i++) {
+ line = (PdfLine) lines.get(i);
+ lineHeight = line.height();
+ currentPosition -= lineHeight;
+ // if the currentPosition is higher than the bottom, we add the line to the result
+ if (currentPosition > (bottom + cellpadding + getBorderWidthInside(BOTTOM))) { // bugfix by Tom Ring and Veerendra Namineni
+ result.add(line);
+ } else {
+ aboveBottom = false;
+ }
+ }
+ // if the bottom of the cell is higher than the bottom of the page, the cell is written, so we can remove all lines
+ float difference = 0f;
+ if (!header) {
+ if (aboveBottom) {
+ lines = new ArrayList();
+ contentHeight = 0f;
+ } else {
+ size = result.size();
+ for (int i = 0; i < size; i++) {
+ line = removeLine(0);
+ difference += line.height();
+ }
+ }
+ }
+ if (difference > 0) {
+ Image image;
+ for (Iterator i = images.iterator(); i.hasNext();) {
+ image = (Image) i.next();
+ image.setAbsolutePosition(image.absoluteX(), image.absoluteY() - difference - leading);
+ }
+ }
+ return result;
+ }
+
+ /**
+ * Gets the images of a cell that can be drawn between certain limits.
+ * <P>
+ * Remark: all the lines that can be drawn are removed from the object!
+ *
+ * @param top the top of the part of the table that can be drawn
+ * @param bottom the bottom of the part of the table that can be drawn
+ * @return an <CODE>ArrayList</CODE> of <CODE>Image</CODE>s
+ */
+
+ public ArrayList getImages(float top, float bottom) {
+
+ // if the bottom of the page is higher than the top of the cell: do nothing
+ if (top() < bottom) {
+ return new ArrayList();
+ }
+ top = Math.min(top(), top);
+ // initialisations
+ Image image;
+ float height;
+ ArrayList result = new ArrayList();
+ // we loop over the images
+ for (Iterator i = images.iterator(); i.hasNext() && !header;) {
+ image = (Image) i.next();
+ height = image.absoluteY();
+ // if the currentPosition is higher than the bottom, we add the line to the result
+ if (top - height > (bottom + cellpadding)) {
+ image.setAbsolutePosition(image.absoluteX(), top - height);
+ result.add(image);
+ i.remove();
+ }
+ }
+ return result;
+ }
+
+ /**
+ * Checks if this cell belongs to the header of a <CODE>PdfTable</CODE>.
+ *
+ * @return <CODE>void</CODE>
+ */
+
+ boolean isHeader() {
+ return header;
+ }
+
+ /**
+ * Indicates that this cell belongs to the header of a <CODE>PdfTable</CODE>.
+ */
+
+ void setHeader() {
+ header = true;
+ }
+
+ /**
+ * Checks if the cell may be removed.
+ * <P>
+ * Headers may allways be removed, even if they are drawn only partially:
+ * they will be repeated on each following page anyway!
+ *
+ * @return <CODE>true</CODE> if all the lines are allready drawn; <CODE>false</CODE> otherwise.
+ */
+
+ boolean mayBeRemoved() {
+ return (header || (lines.size() == 0 && images.size() == 0));
+ }
+
+ /**
+ * Returns the number of lines in the cell.
+ *
+ * @return a value
+ */
+
+ public int size() {
+ return lines.size();
+ }
+
+ /**
+ * Returns the number of lines in the cell that are not empty.
+ *
+ * @return a value
+ */
+
+ public int remainingLines() {
+ if (lines.size() == 0) return 0;
+ int result = 0;
+ int size = lines.size();
+ PdfLine line;
+ for (int i = 0; i < size; i++) {
+ line = (PdfLine) lines.get(i);
+ if (line.size() > 0) result++;
+ }
+ return result;
+ }
+
+ /**
+ * Returns the height needed to draw the remaining text.
+ *
+ * @return a height
+ */
+
+ public float remainingHeight() {
+ float result = 0f;
+ for (Iterator i = images.iterator(); i.hasNext();) {
+ Image image = (Image) i.next();
+ result += image.scaledHeight();
+ }
+ return remainingLines() * leading + 2 * cellpadding + cellspacing + result + leading / 2.5f;
+ }
+
+ // methods to retrieve membervariables
+
+ /**
+ * Gets the leading of a cell.
+ *
+ * @return the leading of the lines is the cell.
+ */
+
+ public float leading() {
+ return leading;
+ }
+
+ /**
+ * Gets the number of the row this cell is in..
+ *
+ * @return a number
+ */
+
+ public int rownumber() {
+ return rownumber;
+ }
+
+ /**
+ * Gets the rowspan of a cell.
+ *
+ * @return the rowspan of the cell
+ */
+
+ public int rowspan() {
+ return rowspan;
+ }
+
+ /**
+ * Gets the cellspacing of a cell.
+ *
+ * @return a value
+ */
+
+ public float cellspacing() {
+ return cellspacing;
+ }
+
+ /**
+ * Gets the cellpadding of a cell..
+ *
+ * @return a value
+ */
+
+ public float cellpadding() {
+ return cellpadding;
+ }
+
+ /**
+ * Processes all actions contained in the cell.
+ * @param element an element in the cell
+ * @param action an action that should be coupled to the cell
+ * @param allActions
+ */
+
+ protected void processActions(Element element, PdfAction action, ArrayList allActions) {
+ if (element.type() == Element.ANCHOR) {
+ String url = ((Anchor) element).reference();
+ if (url != null) {
+ action = new PdfAction(url);
+ }
+ }
+ Iterator i;
+ switch (element.type()) {
+ case Element.PHRASE:
+ case Element.SECTION:
+ case Element.ANCHOR:
+ case Element.CHAPTER:
+ case Element.LISTITEM:
+ case Element.PARAGRAPH:
+ for (i = ((ArrayList) element).iterator(); i.hasNext();) {
+ processActions((Element) i.next(), action, allActions);
+ }
+ break;
+ case Element.CHUNK:
+ allActions.add(action);
+ break;
+ case Element.LIST:
+ for (i = ((List) element).getItems().iterator(); i.hasNext();) {
+ processActions((Element) i.next(), action, allActions);
+ }
+ break;
+ default:
+ int n = element.getChunks().size();
+ while (n-- > 0)
+ allActions.add(action);
+ break;
+ }
+ }
+
+ /**
+ * This is the number of the group the cell is in.
+ */
+ private int groupNumber;
+
+ /**
+ * Gets the number of the group this cell is in..
+ *
+ * @return a number
+ */
+
+ public int getGroupNumber() {
+ return groupNumber;
+ }
+
+ /**
+ * Sets the group number.
+ * @param number
+ */
+
+ void setGroupNumber(int number) {
+ groupNumber = number;
+ }
+
+ /**
+ * Gets a Rectangle that is altered to fit on the page.
+ *
+ * @param top the top position
+ * @param bottom the bottom position
+ * @return a <CODE>Rectangle</CODE>
+ */
+
+ public Rectangle rectangle(float top, float bottom) {
+ Rectangle tmp = new Rectangle(left(), bottom(), right(), top());
+ tmp.cloneNonPositionParameters(this);
+ if (top() > top) {
+ tmp.setTop(top);
+ tmp.setBorder(border - (border & TOP));
+ }
+ if (bottom() < bottom) {
+ tmp.setBottom(bottom);
+ tmp.setBorder(border - (border & BOTTOM));
+ }
+ return tmp;
+ }
+
+ /**
+ * Sets the value of {@link #useAscender}.
+ * @param use use ascender height if true
+ */
+ public void setUseAscender(boolean use) {
+ useAscender = use;
+ }
+
+ /**
+ * Gets the value of {@link #useAscender}
+ * @return useAscender
+ */
+ public boolean isUseAscender() {
+ return useAscender;
+ }
+
+ /**
+ * Sets the value of {@link #useDescender}.
+ * @param use use descender height if true
+ */
+ public void setUseDescender(boolean use) {
+ useDescender = use;
+ }
+
+ /**
+ * gets the value of {@link #useDescender }
+ * @return useDescender
+ */
+ public boolean isUseDescender() {
+ return useDescender;
+ }
+
+ /**
+ * Sets the value of {@link #useBorderPadding}.
+ * @param use adjust layour for borders if true
+ */
+ public void setUseBorderPadding(boolean use) {
+ useBorderPadding = use;
+ }
+
+ /**
+ * Gets the value of {@link #useBorderPadding}.
+ * @return useBorderPadding
+ */
+ public boolean isUseBorderPadding() {
+ return useBorderPadding;
+ }
+
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/pdf/PdfChunk.java b/src/main/java/com/lowagie/text/pdf/PdfChunk.java
new file mode 100644
index 0000000..2906552
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/PdfChunk.java
@@ -0,0 +1,781 @@
+/*
+ * $Id: PdfChunk.java,v 1.71 2006/02/16 16:17:52 psoares33 Exp $
+ * $Name: $
+ *
+ * Copyright 1999, 2000, 2001, 2002 Bruno Lowagie
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf;
+
+import java.awt.Color;
+
+import com.lowagie.text.Chunk;
+import com.lowagie.text.Font;
+import com.lowagie.text.Image;
+import com.lowagie.text.SplitCharacter;
+import java.util.HashMap;
+import java.util.Iterator;
+
+/**
+ * A <CODE>PdfChunk</CODE> is the PDF translation of a <CODE>Chunk</CODE>.
+ * <P>
+ * A <CODE>PdfChunk</CODE> is a <CODE>PdfString</CODE> in a certain
+ * <CODE>PdfFont</CODE> and <CODE>Color</CODE>.
+ *
+ * @see PdfString
+ * @see com.lowagie.text.Chunk
+ * @see com.lowagie.text.Font
+ */
+
+public class PdfChunk implements SplitCharacter{
+
+ private static final char singleSpace[] = {' '};
+ private static final PdfChunk thisChunk[] = new PdfChunk[1];
+ private static final float ITALIC_ANGLE = 0.21256f;
+/** The allowed attributes in variable <CODE>attributes</CODE>. */
+ private static final HashMap keysAttributes = new HashMap();
+
+/** The allowed attributes in variable <CODE>noStroke</CODE>. */
+ private static final HashMap keysNoStroke = new HashMap();
+
+ static {
+ keysAttributes.put(Chunk.ACTION, null);
+ keysAttributes.put(Chunk.UNDERLINE, null);
+ keysAttributes.put(Chunk.REMOTEGOTO, null);
+ keysAttributes.put(Chunk.LOCALGOTO, null);
+ keysAttributes.put(Chunk.LOCALDESTINATION, null);
+ keysAttributes.put(Chunk.GENERICTAG, null);
+ keysAttributes.put(Chunk.NEWPAGE, null);
+ keysAttributes.put(Chunk.IMAGE, null);
+ keysAttributes.put(Chunk.BACKGROUND, null);
+ keysAttributes.put(Chunk.PDFANNOTATION, null);
+ keysAttributes.put(Chunk.SKEW, null);
+ keysAttributes.put(Chunk.HSCALE, null);
+ keysNoStroke.put(Chunk.SUBSUPSCRIPT, null);
+ keysNoStroke.put(Chunk.SPLITCHARACTER, null);
+ keysNoStroke.put(Chunk.HYPHENATION, null);
+ keysNoStroke.put(Chunk.TEXTRENDERMODE, null);
+ }
+
+ // membervariables
+
+ /** The value of this object. */
+ protected String value = PdfObject.NOTHING;
+
+ /** The encoding. */
+ protected String encoding = BaseFont.WINANSI;
+
+
+/** The font for this <CODE>PdfChunk</CODE>. */
+ protected PdfFont font;
+
+ protected BaseFont baseFont;
+
+ protected SplitCharacter splitCharacter;
+/**
+ * Metric attributes.
+ * <P>
+ * This attributes require the mesurement of characters widths when rendering
+ * such as underline.
+ */
+ protected HashMap attributes = new HashMap();
+
+/**
+ * Non metric attributes.
+ * <P>
+ * This attributes do not require the mesurement of characters widths when rendering
+ * such as Color.
+ */
+ protected HashMap noStroke = new HashMap();
+
+/** <CODE>true</CODE> if the chunk split was cause by a newline. */
+ protected boolean newlineSplit;
+
+/** The image in this <CODE>PdfChunk</CODE>, if it has one */
+ protected Image image;
+
+/** The offset in the x direction for the image */
+ protected float offsetX;
+
+/** The offset in the y direction for the image */
+ protected float offsetY;
+
+/** Indicates if the height and offset of the Image has to be taken into account */
+ protected boolean changeLeading = false;
+
+ // constructors
+
+/**
+ * Constructs a <CODE>PdfChunk</CODE>-object.
+ *
+ * @param string the content of the <CODE>PdfChunk</CODE>-object
+ * @param other Chunk with the same style you want for the new Chunk
+ */
+
+ PdfChunk(String string, PdfChunk other) {
+ thisChunk[0] = this;
+ value = string;
+ this.font = other.font;
+ this.attributes = other.attributes;
+ this.noStroke = other.noStroke;
+ this.baseFont = other.baseFont;
+ Object obj[] = (Object[])attributes.get(Chunk.IMAGE);
+ if (obj == null)
+ image = null;
+ else {
+ image = (Image)obj[0];
+ offsetX = ((Float)obj[1]).floatValue();
+ offsetY = ((Float)obj[2]).floatValue();
+ changeLeading = ((Boolean)obj[3]).booleanValue();
+ }
+ encoding = font.getFont().getEncoding();
+ splitCharacter = (SplitCharacter)noStroke.get(Chunk.SPLITCHARACTER);
+ if (splitCharacter == null)
+ splitCharacter = this;
+ }
+
+/**
+ * Constructs a <CODE>PdfChunk</CODE>-object.
+ *
+ * @param chunk the original <CODE>Chunk</CODE>-object
+ * @param action the <CODE>PdfAction</CODE> if the <CODE>Chunk</CODE> comes from an <CODE>Anchor</CODE>
+ */
+
+ PdfChunk(Chunk chunk, PdfAction action) {
+ thisChunk[0] = this;
+ value = chunk.content();
+
+ Font f = chunk.font();
+ float size = f.size();
+ if (size == Font.UNDEFINED)
+ size = 12;
+ baseFont = f.getBaseFont();
+ int style = f.style();
+ if (style == Font.UNDEFINED) {
+ style = Font.NORMAL;
+ }
+ if (baseFont == null) {
+ // translation of the font-family to a PDF font-family
+ baseFont = f.getCalculatedBaseFont(false);
+ }
+ else {
+ // bold simulation
+ if ((style & Font.BOLD) != 0)
+ attributes.put(Chunk.TEXTRENDERMODE, new Object[]{new Integer(PdfContentByte.TEXT_RENDER_MODE_FILL_STROKE), new Float(size / 30f), null});
+ // italic simulation
+ if ((style & Font.ITALIC) != 0)
+ attributes.put(Chunk.SKEW, new float[]{0, ITALIC_ANGLE});
+ }
+ font = new PdfFont(baseFont, size);
+ // other style possibilities
+ HashMap attr = chunk.getAttributes();
+ if (attr != null) {
+ for (Iterator i = attr.keySet().iterator(); i.hasNext();) {
+ Object name = i.next();
+ if (keysAttributes.containsKey(name)) {
+ attributes.put(name, attr.get(name));
+ }
+ else if (keysNoStroke.containsKey(name)) {
+ noStroke.put(name, attr.get(name));
+ }
+ }
+ if ("".equals(attr.get(Chunk.GENERICTAG))) {
+ attributes.put(Chunk.GENERICTAG, chunk.content());
+ }
+ }
+ if (f.isUnderlined()) {
+ Object obj[] = {null, new float[]{0, 1f / 15, 0, -1f / 3, 0}};
+ Object unders[][] = Chunk.addToArray((Object[][])attributes.get(Chunk.UNDERLINE), obj);
+ attributes.put(Chunk.UNDERLINE, unders);
+ }
+ if (f.isStrikethru()) {
+ Object obj[] = {null, new float[]{0, 1f / 15, 0, 1f / 3, 0}};
+ Object unders[][] = Chunk.addToArray((Object[][])attributes.get(Chunk.UNDERLINE), obj);
+ attributes.put(Chunk.UNDERLINE, unders);
+ }
+ if (action != null)
+ attributes.put(Chunk.ACTION, action);
+ // the color can't be stored in a PdfFont
+ noStroke.put(Chunk.COLOR, f.color());
+ noStroke.put(Chunk.ENCODING, font.getFont().getEncoding());
+ Object obj[] = (Object[])attributes.get(Chunk.IMAGE);
+ if (obj == null) {
+ image = null;
+ }
+ else {
+ attributes.remove(Chunk.HSCALE); // images are scaled in other ways
+ image = (Image)obj[0];
+ offsetX = ((Float)obj[1]).floatValue();
+ offsetY = ((Float)obj[2]).floatValue();
+ changeLeading = ((Boolean)obj[3]).booleanValue();
+ }
+ font.setImage(image);
+ Float hs = (Float)attributes.get(Chunk.HSCALE);
+ if (hs != null)
+ font.setHorizontalScaling(hs.floatValue());
+ encoding = font.getFont().getEncoding();
+ splitCharacter = (SplitCharacter)noStroke.get(Chunk.SPLITCHARACTER);
+ if (splitCharacter == null)
+ splitCharacter = this;
+ }
+
+ // methods
+
+ /** Gets the Unicode equivalent to a CID.
+ * The (inexistent) CID <FF00> is translated as '\n'.
+ * It has only meaning with CJK fonts with Identity encoding.
+ * @param c the CID code
+ * @return the Unicode equivalent
+ */
+ public char getUnicodeEquivalent(char c) {
+ return baseFont.getUnicodeEquivalent(c);
+ }
+
+ protected int getWord(String text, int start) {
+ int len = text.length();
+ while (start < len) {
+ if (!Character.isLetter(text.charAt(start)))
+ break;
+ ++start;
+ }
+ return start;
+ }
+
+/**
+ * Splits this <CODE>PdfChunk</CODE> if it's too long for the given width.
+ * <P>
+ * Returns <VAR>null</VAR> if the <CODE>PdfChunk</CODE> wasn't truncated.
+ *
+ * @param width a given width
+ * @return the <CODE>PdfChunk</CODE> that doesn't fit into the width.
+ */
+
+ PdfChunk split(float width) {
+ newlineSplit = false;
+ if (image != null) {
+ if (image.scaledWidth() > width) {
+ PdfChunk pc = new PdfChunk(Chunk.OBJECT_REPLACEMENT_CHARACTER, this);
+ value = "";
+ attributes = new HashMap();
+ image = null;
+ font = PdfFont.getDefaultFont();
+ return pc;
+ }
+ else
+ return null;
+ }
+ HyphenationEvent hyphenationEvent = (HyphenationEvent)noStroke.get(Chunk.HYPHENATION);
+ int currentPosition = 0;
+ int splitPosition = -1;
+ float currentWidth = 0;
+
+ // loop over all the characters of a string
+ // or until the totalWidth is reached
+ int lastSpace = -1;
+ float lastSpaceWidth = 0;
+ int length = value.length();
+ char valueArray[] = value.toCharArray();
+ char character = 0;
+ BaseFont ft = font.getFont();
+ if (ft.getFontType() == BaseFont.FONT_TYPE_CJK && ft.getUnicodeEquivalent(' ') != ' ') {
+ while (currentPosition < length) {
+ // the width of every character is added to the currentWidth
+ char cidChar = valueArray[currentPosition];
+ character = ft.getUnicodeEquivalent(cidChar);
+ // if a newLine or carriageReturn is encountered
+ if (character == '\n') {
+ newlineSplit = true;
+ String returnValue = value.substring(currentPosition + 1);
+ value = value.substring(0, currentPosition);
+ if (value.length() < 1) {
+ value = "\u0001";
+ }
+ PdfChunk pc = new PdfChunk(returnValue, this);
+ return pc;
+ }
+ currentWidth += font.width(cidChar);
+ if (character == ' ') {
+ lastSpace = currentPosition + 1;
+ lastSpaceWidth = currentWidth;
+ }
+ if (currentWidth > width)
+ break;
+ // if a split-character is encountered, the splitPosition is altered
+ if (splitCharacter.isSplitCharacter(0, currentPosition, length, valueArray, thisChunk))
+ splitPosition = currentPosition + 1;
+ currentPosition++;
+ }
+ }
+ else {
+ while (currentPosition < length) {
+ // the width of every character is added to the currentWidth
+ character = valueArray[currentPosition];
+ // if a newLine or carriageReturn is encountered
+ if (character == '\r' || character == '\n') {
+ newlineSplit = true;
+ int inc = 1;
+ if (character == '\r' && currentPosition + 1 < length && valueArray[currentPosition + 1] == '\n')
+ inc = 2;
+ String returnValue = value.substring(currentPosition + inc);
+ value = value.substring(0, currentPosition);
+ if (value.length() < 1) {
+ value = " ";
+ }
+ PdfChunk pc = new PdfChunk(returnValue, this);
+ return pc;
+ }
+ currentWidth += font.width(character);
+ if (character == ' ') {
+ lastSpace = currentPosition + 1;
+ lastSpaceWidth = currentWidth;
+ }
+ if (currentWidth > width)
+ break;
+ // if a split-character is encountered, the splitPosition is altered
+ if (splitCharacter.isSplitCharacter(0, currentPosition, length, valueArray, null))
+ splitPosition = currentPosition + 1;
+ currentPosition++;
+ }
+ }
+
+ // if all the characters fit in the total width, null is returned (there is no overflow)
+ if (currentPosition == length) {
+ return null;
+ }
+ // otherwise, the string has to be truncated
+ if (splitPosition < 0) {
+ String returnValue = value;
+ value = "";
+ PdfChunk pc = new PdfChunk(returnValue, this);
+ return pc;
+ }
+ if (lastSpace > splitPosition && splitCharacter.isSplitCharacter(0, 0, 1, singleSpace, null))
+ splitPosition = lastSpace;
+ if (hyphenationEvent != null && lastSpace < currentPosition) {
+ int wordIdx = getWord(value, lastSpace);
+ if (wordIdx > lastSpace) {
+ String pre = hyphenationEvent.getHyphenatedWordPre(value.substring(lastSpace, wordIdx), font.getFont(), font.size(), width - lastSpaceWidth);
+ String post = hyphenationEvent.getHyphenatedWordPost();
+ if (pre.length() > 0) {
+ String returnValue = post + value.substring(wordIdx);
+ value = trim(value.substring(0, lastSpace) + pre);
+ PdfChunk pc = new PdfChunk(returnValue, this);
+ return pc;
+ }
+ }
+ }
+ String returnValue = value.substring(splitPosition);
+ value = trim(value.substring(0, splitPosition));
+ PdfChunk pc = new PdfChunk(returnValue, this);
+ return pc;
+ }
+
+/**
+ * Truncates this <CODE>PdfChunk</CODE> if it's too long for the given width.
+ * <P>
+ * Returns <VAR>null</VAR> if the <CODE>PdfChunk</CODE> wasn't truncated.
+ *
+ * @param width a given width
+ * @return the <CODE>PdfChunk</CODE> that doesn't fit into the width.
+ */
+
+ PdfChunk truncate(float width) {
+ if (image != null) {
+ if (image.scaledWidth() > width) {
+ PdfChunk pc = new PdfChunk("", this);
+ value = "";
+ attributes.remove(Chunk.IMAGE);
+ image = null;
+ font = PdfFont.getDefaultFont();
+ return pc;
+ }
+ else
+ return null;
+ }
+
+ int currentPosition = 0;
+ float currentWidth = 0;
+
+ // it's no use trying to split if there isn't even enough place for a space
+ if (width < font.width()) {
+ String returnValue = value.substring(1);
+ value = value.substring(0, 1);
+ PdfChunk pc = new PdfChunk(returnValue, this);
+ return pc;
+ }
+
+ // loop over all the characters of a string
+ // or until the totalWidth is reached
+ int length = value.length();
+ char character;
+ while (currentPosition < length) {
+ // the width of every character is added to the currentWidth
+ character = value.charAt(currentPosition);
+ currentWidth += font.width(character);
+ if (currentWidth > width)
+ break;
+ currentPosition++;
+ }
+
+ // if all the characters fit in the total width, null is returned (there is no overflow)
+ if (currentPosition == length) {
+ return null;
+ }
+
+ // otherwise, the string has to be truncated
+ //currentPosition -= 2;
+ // we have to chop off minimum 1 character from the chunk
+ if (currentPosition == 0) {
+ currentPosition = 1;
+ }
+ String returnValue = value.substring(currentPosition);
+ value = value.substring(0, currentPosition);
+ PdfChunk pc = new PdfChunk(returnValue, this);
+ return pc;
+ }
+
+ // methods to retrieve the membervariables
+
+/**
+ * Returns the font of this <CODE>Chunk</CODE>.
+ *
+ * @return a <CODE>PdfFont</CODE>
+ */
+
+ PdfFont font() {
+ return font;
+ }
+
+/**
+ * Returns the color of this <CODE>Chunk</CODE>.
+ *
+ * @return a <CODE>Color</CODE>
+ */
+
+ Color color() {
+ return (Color)noStroke.get(Chunk.COLOR);
+ }
+
+/**
+ * Returns the width of this <CODE>PdfChunk</CODE>.
+ *
+ * @return a width
+ */
+
+ float width() {
+ return font.width(value);
+ }
+
+/**
+ * Checks if the <CODE>PdfChunk</CODE> split was caused by a newline.
+ * @return <CODE>true</CODE> if the <CODE>PdfChunk</CODE> split was caused by a newline.
+ */
+
+ public boolean isNewlineSplit()
+ {
+ return newlineSplit;
+ }
+
+/**
+ * Gets the width of the <CODE>PdfChunk</CODE> taking into account the
+ * extra character and word spacing.
+ * @param charSpacing the extra character spacing
+ * @param wordSpacing the extra word spacing
+ * @return the calculated width
+ */
+
+ public float getWidthCorrected(float charSpacing, float wordSpacing)
+ {
+ if (image != null) {
+ return image.scaledWidth() + charSpacing;
+ }
+ int numberOfSpaces = 0;
+ int idx = -1;
+ while ((idx = value.indexOf(' ', idx + 1)) >= 0)
+ ++numberOfSpaces;
+ return width() + (value.length() * charSpacing + numberOfSpaces * wordSpacing);
+ }
+
+ /**
+ * Gets the text displacement relatiev to the baseline.
+ * @return a displacement in points
+ */
+ public float getTextRise() {
+ Float f = (Float) getAttribute(Chunk.SUBSUPSCRIPT);
+ if (f != null) {
+ return f.floatValue();
+ }
+ return 0.0f;
+ }
+
+/**
+ * Trims the last space.
+ * @return the width of the space trimmed, otherwise 0
+ */
+
+ public float trimLastSpace()
+ {
+ BaseFont ft = font.getFont();
+ if (ft.getFontType() == BaseFont.FONT_TYPE_CJK && ft.getUnicodeEquivalent(' ') != ' ') {
+ if (value.length() > 1 && value.endsWith("\u0001")) {
+ value = value.substring(0, value.length() - 1);
+ return font.width('\u0001');
+ }
+ }
+ else {
+ if (value.length() > 1 && value.endsWith(" ")) {
+ value = value.substring(0, value.length() - 1);
+ return font.width(' ');
+ }
+ }
+ return 0;
+ }
+
+/**
+ * Gets an attribute. The search is made in <CODE>attributes</CODE>
+ * and <CODE>noStroke</CODE>.
+ * @param name the attribute key
+ * @return the attribute value or null if not found
+ */
+
+ Object getAttribute(String name)
+ {
+ if (attributes.containsKey(name))
+ return attributes.get(name);
+ return noStroke.get(name);
+ }
+
+/**
+ *Checks if the attribute exists.
+ * @param name the attribute key
+ * @return <CODE>true</CODE> if the attribute exists
+ */
+
+ boolean isAttribute(String name)
+ {
+ if (attributes.containsKey(name))
+ return true;
+ return noStroke.containsKey(name);
+ }
+
+/**
+ * Checks if this <CODE>PdfChunk</CODE> needs some special metrics handling.
+ * @return <CODE>true</CODE> if this <CODE>PdfChunk</CODE> needs some special metrics handling.
+ */
+
+ boolean isStroked()
+ {
+ return (attributes.size() > 0);
+ }
+
+/**
+ * Checks if there is an image in the <CODE>PdfChunk</CODE>.
+ * @return <CODE>true</CODE> if an image is present
+ */
+
+ boolean isImage()
+ {
+ return image != null;
+ }
+
+/**
+ * Gets the image in the <CODE>PdfChunk</CODE>.
+ * @return the image or <CODE>null</CODE>
+ */
+
+ Image getImage()
+ {
+ return image;
+ }
+
+/**
+ * Sets the image offset in the x direction
+ * @param offsetX the image offset in the x direction
+ */
+
+ void setImageOffsetX(float offsetX)
+ {
+ this.offsetX = offsetX;
+ }
+
+/**
+ * Gets the image offset in the x direction
+ * @return the image offset in the x direction
+ */
+
+ float getImageOffsetX()
+ {
+ return offsetX;
+ }
+
+/**
+ * Sets the image offset in the y direction
+ * @param offsetY the image offset in the y direction
+ */
+
+ void setImageOffsetY(float offsetY)
+ {
+ this.offsetY = offsetY;
+ }
+
+/**
+ * Gets the image offset in the y direction
+ * @return Gets the image offset in the y direction
+ */
+
+ float getImageOffsetY()
+ {
+ return offsetY;
+ }
+
+/**
+ * sets the value.
+ * @param value content of the Chunk
+ */
+
+ void setValue(String value)
+ {
+ this.value = value;
+ }
+
+ /**
+ * @see java.lang.Object#toString()
+ */
+ public String toString() {
+ return value;
+ }
+
+ /**
+ * Tells you if this string is in Chinese, Japanese, Korean or Identity-H.
+ * @return true if the Chunk has a special encoding
+ */
+
+ boolean isSpecialEncoding() {
+ return encoding.equals(CJKFont.CJK_ENCODING) || encoding.equals(BaseFont.IDENTITY_H);
+ }
+
+ /**
+ * Gets the encoding of this string.
+ *
+ * @return a <CODE>String</CODE>
+ */
+
+ String getEncoding() {
+ return encoding;
+ }
+
+ int length() {
+ return value.length();
+ }
+/**
+ * Checks if a character can be used to split a <CODE>PdfString</CODE>.
+ * <P>
+ * for the moment every character less than or equal to SPACE and the character '-' are 'splitCharacters'.
+ *
+ * @param start start position in the array
+ * @param current current position in the array
+ * @param end end position in the array
+ * @param cc the character array that has to be checked
+ * @param ck chunk array
+ * @return <CODE>true</CODE> if the character can be used to split a string, <CODE>false</CODE> otherwise
+ */
+ public boolean isSplitCharacter(int start, int current, int end, char[] cc, PdfChunk[] ck) {
+ char c;
+ if (ck == null)
+ c = cc[current];
+ else
+ c = ck[Math.min(current, ck.length - 1)].getUnicodeEquivalent(cc[current]);
+ if (c <= ' ' || c == '-') {
+ return true;
+ }
+ if (c < 0x2e80)
+ return false;
+ return ((c >= 0x2e80 && c < 0xd7a0)
+ || (c >= 0xf900 && c < 0xfb00)
+ || (c >= 0xfe30 && c < 0xfe50)
+ || (c >= 0xff61 && c < 0xffa0));
+ }
+
+ boolean isExtSplitCharacter(int start, int current, int end, char[] cc, PdfChunk[] ck) {
+ return splitCharacter.isSplitCharacter(start, current, end, cc, ck);
+ }
+
+/**
+ * Removes all the <VAR>' '</VAR> and <VAR>'-'</VAR>-characters on the right of a <CODE>String</CODE>.
+ * <P>
+ * @param string the <CODE>String<CODE> that has to be trimmed.
+ * @return the trimmed <CODE>String</CODE>
+ */
+ String trim(String string) {
+ BaseFont ft = font.getFont();
+ if (ft.getFontType() == BaseFont.FONT_TYPE_CJK && ft.getUnicodeEquivalent(' ') != ' ') {
+ while (string.endsWith("\u0001")) {
+ string = string.substring(0, string.length() - 1);
+ }
+ }
+ else {
+ while (string.endsWith(" ") || string.endsWith("\t")) {
+ string = string.substring(0, string.length() - 1);
+ }
+ }
+ return string;
+ }
+
+ public boolean changeLeading() {
+ return changeLeading;
+ }
+
+ float getCharWidth(char c) {
+ if (noPrint(c))
+ return 0;
+ return font.width(c);
+ }
+
+ public static boolean noPrint(char c) {
+ return ((c >= 0x200b && c <= 0x200f) || (c >= 0x202a && c <= 0x202e));
+ }
+
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/pdf/PdfColor.java b/src/main/java/com/lowagie/text/pdf/PdfColor.java
new file mode 100644
index 0000000..b07348d
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/PdfColor.java
@@ -0,0 +1,80 @@
+/*
+ * $Id: PdfColor.java,v 1.54 2005/05/04 14:31:42 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 1999, 2000, 2001, 2002 Bruno Lowagie
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf;
+import java.awt.Color;
+/**
+ * A <CODE>PdfColor</CODE> defines a Color (it's a <CODE>PdfArray</CODE> containing 3 values).
+ *
+ * @see PdfDictionary
+ */
+
+class PdfColor extends PdfArray {
+
+ // constructors
+
+/**
+ * Constructs a new <CODE>PdfColor</CODE>.
+ *
+ * @param red a value between 0 and 255
+ * @param green a value between 0 and 255
+ * @param blue a value between 0 and 255
+ */
+
+ PdfColor(int red, int green, int blue) {
+ super(new PdfNumber((double)(red & 0xFF) / 0xFF));
+ add(new PdfNumber((double)(green & 0xFF) / 0xFF));
+ add(new PdfNumber((double)(blue & 0xFF) / 0xFF));
+ }
+
+ PdfColor(Color color) {
+ this(color.getRed(), color.getGreen(), color.getBlue());
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/pdf/PdfContentByte.java b/src/main/java/com/lowagie/text/pdf/PdfContentByte.java
new file mode 100644
index 0000000..07669cd
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/PdfContentByte.java
@@ -0,0 +1,3053 @@
+/*
+ * $Id: PdfContentByte.java,v 1.100 2006/05/18 09:39:28 psoares33 Exp $
+ * $Name: $
+ *
+ * Copyright 1999, 2000, 2001, 2002 Bruno Lowagie
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf;
+import java.awt.Color;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.awt.geom.AffineTransform;
+import java.awt.print.PrinterJob;
+
+import com.lowagie.text.DocumentException;
+import com.lowagie.text.Element;
+import com.lowagie.text.Image;
+import com.lowagie.text.Rectangle;
+import com.lowagie.text.Annotation;
+import com.lowagie.text.ExceptionConverter;
+import com.lowagie.text.pdf.ExtendedColor;
+
+/**
+ * <CODE>PdfContentByte</CODE> is an object containing the user positioned
+ * text and graphic contents of a page. It knows how to apply the proper
+ * font encoding.
+ */
+
+public class PdfContentByte {
+
+ /**
+ * This class keeps the graphic state of the current page
+ */
+
+ static class GraphicState {
+
+ /** This is the font in use */
+ FontDetails fontDetails;
+
+ /** This is the color in use */
+ ColorDetails colorDetails;
+
+ /** This is the font size in use */
+ float size;
+
+ /** The x position of the text line matrix. */
+ protected float xTLM = 0;
+ /** The y position of the text line matrix. */
+ protected float yTLM = 0;
+
+ /** The current text leading. */
+ protected float leading = 0;
+
+ /** The current horizontal scaling */
+ protected float scale = 100;
+
+ /** The current character spacing */
+ protected float charSpace = 0;
+
+ /** The current word spacing */
+ protected float wordSpace = 0;
+
+ GraphicState() {
+ }
+
+ GraphicState(GraphicState cp) {
+ fontDetails = cp.fontDetails;
+ colorDetails = cp.colorDetails;
+ size = cp.size;
+ xTLM = cp.xTLM;
+ yTLM = cp.yTLM;
+ leading = cp.leading;
+ scale = cp.scale;
+ charSpace = cp.charSpace;
+ wordSpace = cp.wordSpace;
+ }
+ }
+
+ /** The alignement is center */
+ public static final int ALIGN_CENTER = Element.ALIGN_CENTER;
+
+ /** The alignement is left */
+ public static final int ALIGN_LEFT = Element.ALIGN_LEFT;
+
+ /** The alignement is right */
+ public static final int ALIGN_RIGHT = Element.ALIGN_RIGHT;
+
+ /** A possible line cap value */
+ public static final int LINE_CAP_BUTT = 0;
+ /** A possible line cap value */
+ public static final int LINE_CAP_ROUND = 1;
+ /** A possible line cap value */
+ public static final int LINE_CAP_PROJECTING_SQUARE = 2;
+
+ /** A possible line join value */
+ public static final int LINE_JOIN_MITER = 0;
+ /** A possible line join value */
+ public static final int LINE_JOIN_ROUND = 1;
+ /** A possible line join value */
+ public static final int LINE_JOIN_BEVEL = 2;
+
+ /** A possible text rendering value */
+ public static final int TEXT_RENDER_MODE_FILL = 0;
+ /** A possible text rendering value */
+ public static final int TEXT_RENDER_MODE_STROKE = 1;
+ /** A possible text rendering value */
+ public static final int TEXT_RENDER_MODE_FILL_STROKE = 2;
+ /** A possible text rendering value */
+ public static final int TEXT_RENDER_MODE_INVISIBLE = 3;
+ /** A possible text rendering value */
+ public static final int TEXT_RENDER_MODE_FILL_CLIP = 4;
+ /** A possible text rendering value */
+ public static final int TEXT_RENDER_MODE_STROKE_CLIP = 5;
+ /** A possible text rendering value */
+ public static final int TEXT_RENDER_MODE_FILL_STROKE_CLIP = 6;
+ /** A possible text rendering value */
+ public static final int TEXT_RENDER_MODE_CLIP = 7;
+
+ private static final float[] unitRect = {0, 0, 0, 1, 1, 0, 1, 1};
+ // membervariables
+
+ /** This is the actual content */
+ protected ByteBuffer content = new ByteBuffer();
+
+ /** This is the writer */
+ protected PdfWriter writer;
+
+ /** This is the PdfDocument */
+ protected PdfDocument pdf;
+
+ /** This is the GraphicState in use */
+ protected GraphicState state = new GraphicState();
+
+ /** The list were we save/restore the state */
+ protected ArrayList stateList = new ArrayList();
+
+ /** The list were we save/restore the layer depth */
+ protected ArrayList layerDepth;
+
+ /** The separator between commands.
+ */
+ protected int separator = '\n';
+
+ private static HashMap abrev = new HashMap();
+
+ static {
+ abrev.put(PdfName.BITSPERCOMPONENT, "/BPC ");
+ abrev.put(PdfName.COLORSPACE, "/CS ");
+ abrev.put(PdfName.DECODE, "/D ");
+ abrev.put(PdfName.DECODEPARMS, "/DP ");
+ abrev.put(PdfName.FILTER, "/F ");
+ abrev.put(PdfName.HEIGHT, "/H ");
+ abrev.put(PdfName.IMAGEMASK, "/IM ");
+ abrev.put(PdfName.INTENT, "/Intent ");
+ abrev.put(PdfName.INTERPOLATE, "/I ");
+ abrev.put(PdfName.WIDTH, "/W ");
+ }
+
+ // constructors
+
+ /**
+ * Constructs a new <CODE>PdfContentByte</CODE>-object.
+ *
+ * @param wr the writer associated to this content
+ */
+
+ public PdfContentByte(PdfWriter wr) {
+ if (wr != null) {
+ writer = wr;
+ pdf = writer.getPdfDocument();
+ }
+ }
+
+ // methods to get the content of this object
+
+ /**
+ * Returns the <CODE>String</CODE> representation of this <CODE>PdfContentByte</CODE>-object.
+ *
+ * @return a <CODE>String</CODE>
+ */
+
+ public String toString() {
+ return content.toString();
+ }
+
+ /**
+ * Gets the internal buffer.
+ * @return the internal buffer
+ */
+ public ByteBuffer getInternalBuffer() {
+ return content;
+ }
+
+ /** Returns the PDF representation of this <CODE>PdfContentByte</CODE>-object.
+ *
+ * @param writer the <CODE>PdfWriter</CODE>
+ * @return a <CODE>byte</CODE> array with the representation
+ */
+
+ public byte[] toPdf(PdfWriter writer) {
+ return content.toByteArray();
+ }
+
+ // methods to add graphical content
+
+ /**
+ * Adds the content of another <CODE>PdfContent</CODE>-object to this object.
+ *
+ * @param other another <CODE>PdfByteContent</CODE>-object
+ */
+
+ public void add(PdfContentByte other) {
+ if (other.writer != null && writer != other.writer)
+ throw new RuntimeException("Inconsistent writers. Are you mixing two documents?");
+ content.append(other.content);
+ }
+
+ /**
+ * Gets the x position of the text line matrix.
+ *
+ * @return the x position of the text line matrix
+ */
+ public float getXTLM() {
+ return state.xTLM;
+ }
+
+ /**
+ * Gets the y position of the text line matrix.
+ *
+ * @return the y position of the text line matrix
+ */
+ public float getYTLM() {
+ return state.yTLM;
+ }
+
+ /**
+ * Gets the current text leading.
+ *
+ * @return the current text leading
+ */
+ public float getLeading() {
+ return state.leading;
+ }
+
+ /**
+ * Gets the current character spacing.
+ *
+ * @return the current character spacing
+ */
+ public float getCharacterSpacing() {
+ return state.charSpace;
+ }
+
+ /**
+ * Gets the current word spacing.
+ *
+ * @return the current word spacing
+ */
+ public float getWordSpacing() {
+ return state.wordSpace;
+ }
+
+ /**
+ * Gets the current character spacing.
+ *
+ * @return the current character spacing
+ */
+ public float getHorizontalScaling() {
+ return state.scale;
+ }
+
+ /**
+ * Changes the <VAR>Flatness</VAR>.
+ * <P>
+ * <VAR>Flatness</VAR> sets the maximum permitted distance in device pixels between the
+ * mathematically correct path and an approximation constructed from straight line segments.<BR>
+ *
+ * @param flatness a value
+ */
+
+ public void setFlatness(float flatness) {
+ if (flatness >= 0 && flatness <= 100) {
+ content.append(flatness).append(" i").append_i(separator);
+ }
+ }
+
+ /**
+ * Changes the <VAR>Line cap style</VAR>.
+ * <P>
+ * The <VAR>line cap style</VAR> specifies the shape to be used at the end of open subpaths
+ * when they are stroked.<BR>
+ * Allowed values are LINE_CAP_BUTT, LINE_CAP_ROUND and LINE_CAP_PROJECTING_SQUARE.<BR>
+ *
+ * @param style a value
+ */
+
+ public void setLineCap(int style) {
+ if (style >= 0 && style <= 2) {
+ content.append(style).append(" J").append_i(separator);
+ }
+ }
+
+ /**
+ * Changes the value of the <VAR>line dash pattern</VAR>.
+ * <P>
+ * The line dash pattern controls the pattern of dashes and gaps used to stroke paths.
+ * It is specified by an <I>array</I> and a <I>phase</I>. The array specifies the length
+ * of the alternating dashes and gaps. The phase specifies the distance into the dash
+ * pattern to start the dash.<BR>
+ *
+ * @param phase the value of the phase
+ */
+
+ public void setLineDash(float phase) {
+ content.append("[] ").append(phase).append(" d").append_i(separator);
+ }
+
+ /**
+ * Changes the value of the <VAR>line dash pattern</VAR>.
+ * <P>
+ * The line dash pattern controls the pattern of dashes and gaps used to stroke paths.
+ * It is specified by an <I>array</I> and a <I>phase</I>. The array specifies the length
+ * of the alternating dashes and gaps. The phase specifies the distance into the dash
+ * pattern to start the dash.<BR>
+ *
+ * @param phase the value of the phase
+ * @param unitsOn the number of units that must be 'on' (equals the number of units that must be 'off').
+ */
+
+ public void setLineDash(float unitsOn, float phase) {
+ content.append("[").append(unitsOn).append("] ").append(phase).append(" d").append_i(separator);
+ }
+
+ /**
+ * Changes the value of the <VAR>line dash pattern</VAR>.
+ * <P>
+ * The line dash pattern controls the pattern of dashes and gaps used to stroke paths.
+ * It is specified by an <I>array</I> and a <I>phase</I>. The array specifies the length
+ * of the alternating dashes and gaps. The phase specifies the distance into the dash
+ * pattern to start the dash.<BR>
+ *
+ * @param phase the value of the phase
+ * @param unitsOn the number of units that must be 'on'
+ * @param unitsOff the number of units that must be 'off'
+ */
+
+ public void setLineDash(float unitsOn, float unitsOff, float phase) {
+ content.append("[").append(unitsOn).append(' ').append(unitsOff).append("] ").append(phase).append(" d").append_i(separator);
+ }
+
+ /**
+ * Changes the value of the <VAR>line dash pattern</VAR>.
+ * <P>
+ * The line dash pattern controls the pattern of dashes and gaps used to stroke paths.
+ * It is specified by an <I>array</I> and a <I>phase</I>. The array specifies the length
+ * of the alternating dashes and gaps. The phase specifies the distance into the dash
+ * pattern to start the dash.<BR>
+ *
+ * @param array length of the alternating dashes and gaps
+ * @param phase the value of the phase
+ */
+
+ public final void setLineDash(float[] array, float phase) {
+ content.append("[");
+ for (int i = 0; i < array.length; i++) {
+ content.append(array[i]);
+ if (i < array.length - 1) content.append(' ');
+ }
+ content.append("] ").append(phase).append(" d").append_i(separator);
+ }
+
+ /**
+ * Changes the <VAR>Line join style</VAR>.
+ * <P>
+ * The <VAR>line join style</VAR> specifies the shape to be used at the corners of paths
+ * that are stroked.<BR>
+ * Allowed values are LINE_JOIN_MITER (Miter joins), LINE_JOIN_ROUND (Round joins) and LINE_JOIN_BEVEL (Bevel joins).<BR>
+ *
+ * @param style a value
+ */
+
+ public void setLineJoin(int style) {
+ if (style >= 0 && style <= 2) {
+ content.append(style).append(" j").append_i(separator);
+ }
+ }
+
+ /**
+ * Changes the <VAR>line width</VAR>.
+ * <P>
+ * The line width specifies the thickness of the line used to stroke a path and is measured
+ * in user space units.<BR>
+ *
+ * @param w a width
+ */
+
+ public void setLineWidth(float w) {
+ content.append(w).append(" w").append_i(separator);
+ }
+
+ /**
+ * Changes the <VAR>Miter limit</VAR>.
+ * <P>
+ * When two line segments meet at a sharp angle and mitered joins have been specified as the
+ * line join style, it is possible for the miter to extend far beyond the thickness of the line
+ * stroking path. The miter limit imposes a maximum on the ratio of the miter length to the line
+ * witdh. When the limit is exceeded, the join is converted from a miter to a bevel.<BR>
+ *
+ * @param miterLimit a miter limit
+ */
+
+ public void setMiterLimit(float miterLimit) {
+ if (miterLimit > 1) {
+ content.append(miterLimit).append(" M").append_i(separator);
+ }
+ }
+
+ /**
+ * Modify the current clipping path by intersecting it with the current path, using the
+ * nonzero winding number rule to determine which regions lie inside the clipping
+ * path.
+ */
+
+ public void clip() {
+ content.append("W").append_i(separator);
+ }
+
+ /**
+ * Modify the current clipping path by intersecting it with the current path, using the
+ * even-odd rule to determine which regions lie inside the clipping path.
+ */
+
+ public void eoClip() {
+ content.append("W*").append_i(separator);
+ }
+
+ /**
+ * Changes the currentgray tint for filling paths (device dependent colors!).
+ * <P>
+ * Sets the color space to <B>DeviceGray</B> (or the <B>DefaultGray</B> color space),
+ * and sets the gray tint to use for filling paths.</P>
+ *
+ * @param gray a value between 0 (black) and 1 (white)
+ */
+
+ public void setGrayFill(float gray) {
+ content.append(gray).append(" g").append_i(separator);
+ }
+
+ /**
+ * Changes the current gray tint for filling paths to black.
+ */
+
+ public void resetGrayFill() {
+ content.append("0 g").append_i(separator);
+ }
+
+ /**
+ * Changes the currentgray tint for stroking paths (device dependent colors!).
+ * <P>
+ * Sets the color space to <B>DeviceGray</B> (or the <B>DefaultGray</B> color space),
+ * and sets the gray tint to use for stroking paths.</P>
+ *
+ * @param gray a value between 0 (black) and 1 (white)
+ */
+
+ public void setGrayStroke(float gray) {
+ content.append(gray).append(" G").append_i(separator);
+ }
+
+ /**
+ * Changes the current gray tint for stroking paths to black.
+ */
+
+ public void resetGrayStroke() {
+ content.append("0 G").append_i(separator);
+ }
+
+ /**
+ * Helper to validate and write the RGB color components
+ * @param red the intensity of red. A value between 0 and 1
+ * @param green the intensity of green. A value between 0 and 1
+ * @param blue the intensity of blue. A value between 0 and 1
+ */
+ private void HelperRGB(float red, float green, float blue) {
+ PdfWriter.checkPDFXConformance(writer, PdfWriter.PDFXKEY_RGB, null);
+ if (red < 0)
+ red = 0.0f;
+ else if (red > 1.0f)
+ red = 1.0f;
+ if (green < 0)
+ green = 0.0f;
+ else if (green > 1.0f)
+ green = 1.0f;
+ if (blue < 0)
+ blue = 0.0f;
+ else if (blue > 1.0f)
+ blue = 1.0f;
+ content.append(red).append(' ').append(green).append(' ').append(blue);
+ }
+
+ /**
+ * Changes the current color for filling paths (device dependent colors!).
+ * <P>
+ * Sets the color space to <B>DeviceRGB</B> (or the <B>DefaultRGB</B> color space),
+ * and sets the color to use for filling paths.</P>
+ * <P>
+ * Following the PDF manual, each operand must be a number between 0 (minimum intensity) and
+ * 1 (maximum intensity).</P>
+ *
+ * @param red the intensity of red. A value between 0 and 1
+ * @param green the intensity of green. A value between 0 and 1
+ * @param blue the intensity of blue. A value between 0 and 1
+ */
+
+ public void setRGBColorFillF(float red, float green, float blue) {
+ HelperRGB(red, green, blue);
+ content.append(" rg").append_i(separator);
+ }
+
+ /**
+ * Changes the current color for filling paths to black.
+ */
+
+ public void resetRGBColorFill() {
+ content.append("0 g").append_i(separator);
+ }
+
+ /**
+ * Changes the current color for stroking paths (device dependent colors!).
+ * <P>
+ * Sets the color space to <B>DeviceRGB</B> (or the <B>DefaultRGB</B> color space),
+ * and sets the color to use for stroking paths.</P>
+ * <P>
+ * Following the PDF manual, each operand must be a number between 0 (miniumum intensity) and
+ * 1 (maximum intensity).
+ *
+ * @param red the intensity of red. A value between 0 and 1
+ * @param green the intensity of green. A value between 0 and 1
+ * @param blue the intensity of blue. A value between 0 and 1
+ */
+
+ public void setRGBColorStrokeF(float red, float green, float blue) {
+ HelperRGB(red, green, blue);
+ content.append(" RG").append_i(separator);
+ }
+
+ /**
+ * Changes the current color for stroking paths to black.
+ *
+ */
+
+ public void resetRGBColorStroke() {
+ content.append("0 G").append_i(separator);
+ }
+
+ /**
+ * Helper to validate and write the CMYK color components.
+ *
+ * @param cyan the intensity of cyan. A value between 0 and 1
+ * @param magenta the intensity of magenta. A value between 0 and 1
+ * @param yellow the intensity of yellow. A value between 0 and 1
+ * @param black the intensity of black. A value between 0 and 1
+ */
+ private void HelperCMYK(float cyan, float magenta, float yellow, float black) {
+ if (cyan < 0)
+ cyan = 0.0f;
+ else if (cyan > 1.0f)
+ cyan = 1.0f;
+ if (magenta < 0)
+ magenta = 0.0f;
+ else if (magenta > 1.0f)
+ magenta = 1.0f;
+ if (yellow < 0)
+ yellow = 0.0f;
+ else if (yellow > 1.0f)
+ yellow = 1.0f;
+ if (black < 0)
+ black = 0.0f;
+ else if (black > 1.0f)
+ black = 1.0f;
+ content.append(cyan).append(' ').append(magenta).append(' ').append(yellow).append(' ').append(black);
+ }
+
+ /**
+ * Changes the current color for filling paths (device dependent colors!).
+ * <P>
+ * Sets the color space to <B>DeviceCMYK</B> (or the <B>DefaultCMYK</B> color space),
+ * and sets the color to use for filling paths.</P>
+ * <P>
+ * Following the PDF manual, each operand must be a number between 0 (no ink) and
+ * 1 (maximum ink).</P>
+ *
+ * @param cyan the intensity of cyan. A value between 0 and 1
+ * @param magenta the intensity of magenta. A value between 0 and 1
+ * @param yellow the intensity of yellow. A value between 0 and 1
+ * @param black the intensity of black. A value between 0 and 1
+ */
+
+ public void setCMYKColorFillF(float cyan, float magenta, float yellow, float black) {
+ HelperCMYK(cyan, magenta, yellow, black);
+ content.append(" k").append_i(separator);
+ }
+
+ /**
+ * Changes the current color for filling paths to black.
+ *
+ */
+
+ public void resetCMYKColorFill() {
+ content.append("0 0 0 1 k").append_i(separator);
+ }
+
+ /**
+ * Changes the current color for stroking paths (device dependent colors!).
+ * <P>
+ * Sets the color space to <B>DeviceCMYK</B> (or the <B>DefaultCMYK</B> color space),
+ * and sets the color to use for stroking paths.</P>
+ * <P>
+ * Following the PDF manual, each operand must be a number between 0 (miniumum intensity) and
+ * 1 (maximum intensity).
+ *
+ * @param cyan the intensity of cyan. A value between 0 and 1
+ * @param magenta the intensity of magenta. A value between 0 and 1
+ * @param yellow the intensity of yellow. A value between 0 and 1
+ * @param black the intensity of black. A value between 0 and 1
+ */
+
+ public void setCMYKColorStrokeF(float cyan, float magenta, float yellow, float black) {
+ HelperCMYK(cyan, magenta, yellow, black);
+ content.append(" K").append_i(separator);
+ }
+
+ /**
+ * Changes the current color for stroking paths to black.
+ *
+ */
+
+ public void resetCMYKColorStroke() {
+ content.append("0 0 0 1 K").append_i(separator);
+ }
+
+ /**
+ * Move the current point <I>(x, y)</I>, omitting any connecting line segment.
+ *
+ * @param x new x-coordinate
+ * @param y new y-coordinate
+ */
+
+ public void moveTo(float x, float y) {
+ content.append(x).append(' ').append(y).append(" m").append_i(separator);
+ }
+
+ /**
+ * Appends a straight line segment from the current point <I>(x, y)</I>. The new current
+ * point is <I>(x, y)</I>.
+ *
+ * @param x new x-coordinate
+ * @param y new y-coordinate
+ */
+
+ public void lineTo(float x, float y) {
+ content.append(x).append(' ').append(y).append(" l").append_i(separator);
+ }
+
+ /**
+ * Appends a Bêzier curve to the path, starting from the current point.
+ *
+ * @param x1 x-coordinate of the first control point
+ * @param y1 y-coordinate of the first control point
+ * @param x2 x-coordinate of the second control point
+ * @param y2 y-coordinate of the second control point
+ * @param x3 x-coordinaat of the ending point (= new current point)
+ * @param y3 y-coordinaat of the ending point (= new current point)
+ */
+
+ public void curveTo(float x1, float y1, float x2, float y2, float x3, float y3) {
+ content.append(x1).append(' ').append(y1).append(' ').append(x2).append(' ').append(y2).append(' ').append(x3).append(' ').append(y3).append(" c").append_i(separator);
+ }
+
+ /**
+ * Appends a Bêzier curve to the path, starting from the current point.
+ *
+ * @param x2 x-coordinate of the second control point
+ * @param y2 y-coordinate of the second control point
+ * @param x3 x-coordinaat of the ending point (= new current point)
+ * @param y3 y-coordinaat of the ending point (= new current point)
+ */
+
+ public void curveTo(float x2, float y2, float x3, float y3) {
+ content.append(x2).append(' ').append(y2).append(' ').append(x3).append(' ').append(y3).append(" v").append_i(separator);
+ }
+
+ /**
+ * Appends a Bêzier curve to the path, starting from the current point.
+ *
+ * @param x1 x-coordinate of the first control point
+ * @param y1 y-coordinate of the first control point
+ * @param x3 x-coordinaat of the ending point (= new current point)
+ * @param y3 y-coordinaat of the ending point (= new current point)
+ */
+
+ public void curveFromTo(float x1, float y1, float x3, float y3) {
+ content.append(x1).append(' ').append(y1).append(' ').append(x3).append(' ').append(y3).append(" y").append_i(separator);
+ }
+
+ /** Draws a circle. The endpoint will (x+r, y).
+ *
+ * @param x x center of circle
+ * @param y y center of circle
+ * @param r radius of circle
+ */
+ public void circle(float x, float y, float r) {
+ float b = 0.5523f;
+ moveTo(x + r, y);
+ curveTo(x + r, y + r * b, x + r * b, y + r, x, y + r);
+ curveTo(x - r * b, y + r, x - r, y + r * b, x - r, y);
+ curveTo(x - r, y - r * b, x - r * b, y - r, x, y - r);
+ curveTo(x + r * b, y - r, x + r, y - r * b, x + r, y);
+ }
+
+
+
+ /**
+ * Adds a rectangle to the current path.
+ *
+ * @param x x-coordinate of the starting point
+ * @param y y-coordinate of the starting point
+ * @param w width
+ * @param h height
+ */
+
+ public void rectangle(float x, float y, float w, float h) {
+ content.append(x).append(' ').append(y).append(' ').append(w).append(' ').append(h).append(" re").append_i(separator);
+ }
+
+ private boolean compareColors(Color c1, Color c2) {
+ if (c1 == null && c2 == null)
+ return true;
+ if (c1 == null || c2 == null)
+ return false;
+ if (c1 instanceof ExtendedColor)
+ return c1.equals(c2);
+ return c2.equals(c1);
+ }
+
+ /**
+ * Adds a variable width border to the current path.
+ * Only use if {@link com.lowagie.text.Rectangle#isUseVariableBorders() Rectangle.isUseVariableBorders}
+ * = true.
+ * @param rect a <CODE>Rectangle</CODE>
+ */
+ public void variableRectangle(Rectangle rect) {
+ float t = rect.top();
+ float b = rect.bottom();
+ float r = rect.right();
+ float l = rect.left();
+ float wt = rect.getBorderWidthTop();
+ float wb = rect.getBorderWidthBottom();
+ float wr = rect.getBorderWidthRight();
+ float wl = rect.getBorderWidthLeft();
+ Color ct = rect.getBorderColorTop();
+ Color cb = rect.getBorderColorBottom();
+ Color cr = rect.getBorderColorRight();
+ Color cl = rect.getBorderColorLeft();
+ saveState();
+ setLineCap(PdfContentByte.LINE_CAP_BUTT);
+ setLineJoin(PdfContentByte.LINE_JOIN_MITER);
+ float clw = 0;
+ boolean cdef = false;
+ Color ccol = null;
+ boolean cdefi = false;
+ Color cfil = null;
+ // draw top
+ if (wt > 0) {
+ setLineWidth(clw = wt);
+ cdef = true;
+ if (ct == null)
+ resetRGBColorStroke();
+ else
+ setColorStroke(ct);
+ ccol = ct;
+ moveTo(l, t - wt / 2f);
+ lineTo(r, t - wt / 2f);
+ stroke();
+ }
+
+ // Draw bottom
+ if (wb > 0) {
+ if (wb != clw)
+ setLineWidth(clw = wb);
+ if (!cdef || !compareColors(ccol, cb)) {
+ cdef = true;
+ if (cb == null)
+ resetRGBColorStroke();
+ else
+ setColorStroke(cb);
+ ccol = cb;
+ }
+ moveTo(r, b + wb / 2f);
+ lineTo(l, b + wb / 2f);
+ stroke();
+ }
+
+ // Draw right
+ if (wr > 0) {
+ if (wr != clw)
+ setLineWidth(clw = wr);
+ if (!cdef || !compareColors(ccol, cr)) {
+ cdef = true;
+ if (cr == null)
+ resetRGBColorStroke();
+ else
+ setColorStroke(cr);
+ ccol = cr;
+ }
+ boolean bt = compareColors(ct, cr);
+ boolean bb = compareColors(cb, cr);
+ moveTo(r - wr / 2f, bt ? t : t - wt);
+ lineTo(r - wr / 2f, bb ? b : b + wb);
+ stroke();
+ if (!bt || !bb) {
+ cdefi = true;
+ if (cr == null)
+ resetRGBColorFill();
+ else
+ setColorFill(cr);
+ cfil = cr;
+ if (!bt) {
+ moveTo(r, t);
+ lineTo(r, t - wt);
+ lineTo(r - wr, t - wt);
+ fill();
+ }
+ if (!bb) {
+ moveTo(r, b);
+ lineTo(r, b + wb);
+ lineTo(r - wr, b + wb);
+ fill();
+ }
+ }
+ }
+
+ // Draw Left
+ if (wl > 0) {
+ if (wl != clw)
+ setLineWidth(wl);
+ if (!cdef || !compareColors(ccol, cl)) {
+ if (cl == null)
+ resetRGBColorStroke();
+ else
+ setColorStroke(cl);
+ }
+ boolean bt = compareColors(ct, cl);
+ boolean bb = compareColors(cb, cl);
+ moveTo(l + wl / 2f, bt ? t : t - wt);
+ lineTo(l + wl / 2f, bb ? b : b + wb);
+ stroke();
+ if (!bt || !bb) {
+ if (!cdefi || !compareColors(cfil, cl)) {
+ if (cl == null)
+ resetRGBColorFill();
+ else
+ setColorFill(cl);
+ }
+ if (!bt) {
+ moveTo(l, t);
+ lineTo(l, t - wt);
+ lineTo(l + wl, t - wt);
+ fill();
+ }
+ if (!bb) {
+ moveTo(l, b);
+ lineTo(l, b + wb);
+ lineTo(l + wl, b + wb);
+ fill();
+ }
+ }
+ }
+ restoreState();
+ }
+
+ /**
+ * Adds a border (complete or partially) to the current path..
+ *
+ * @param rectangle a <CODE>Rectangle</CODE>
+ */
+
+ public void rectangle(Rectangle rectangle) {
+ // the coordinates of the border are retrieved
+ float x1 = rectangle.left();
+ float y1 = rectangle.bottom();
+ float x2 = rectangle.right();
+ float y2 = rectangle.top();
+
+ // the backgroundcolor is set
+ Color background = rectangle.backgroundColor();
+ if (background != null) {
+ setColorFill(background);
+ rectangle(x1, y1, x2 - x1, y2 - y1);
+ fill();
+ resetRGBColorFill();
+ }
+
+ // if the element hasn't got any borders, nothing is added
+ if (! rectangle.hasBorders()) {
+ return;
+ }
+
+ // if any of the individual border colors are set
+ // we draw the borders all around using the
+ // different colors
+ if (rectangle.isUseVariableBorders()) {
+ variableRectangle(rectangle);
+ }
+ else {
+ // the width is set to the width of the element
+ if (rectangle.borderWidth() != Rectangle.UNDEFINED) {
+ setLineWidth(rectangle.borderWidth());
+ }
+
+ // the color is set to the color of the element
+ Color color = rectangle.borderColor();
+ if (color != null) {
+ setColorStroke(color);
+ }
+
+ // if the box is a rectangle, it is added as a rectangle
+ if (rectangle.hasBorder(Rectangle.BOX)) {
+ rectangle(x1, y1, x2 - x1, y2 - y1);
+ }
+ // if the border isn't a rectangle, the different sides are added apart
+ else {
+ if (rectangle.hasBorder(Rectangle.RIGHT)) {
+ moveTo(x2, y1);
+ lineTo(x2, y2);
+ }
+ if (rectangle.hasBorder(Rectangle.LEFT)) {
+ moveTo(x1, y1);
+ lineTo(x1, y2);
+ }
+ if (rectangle.hasBorder(Rectangle.BOTTOM)) {
+ moveTo(x1, y1);
+ lineTo(x2, y1);
+ }
+ if (rectangle.hasBorder(Rectangle.TOP)) {
+ moveTo(x1, y2);
+ lineTo(x2, y2);
+ }
+ }
+
+ stroke();
+
+ if (color != null) {
+ resetRGBColorStroke();
+ }
+ }
+ }
+
+ /**
+ * Closes the current subpath by appending a straight line segment from the current point
+ * to the starting point of the subpath.
+ */
+
+ public void closePath() {
+ content.append("h").append_i(separator);
+ }
+
+ /**
+ * Ends the path without filling or stroking it.
+ */
+
+ public void newPath() {
+ content.append("n").append_i(separator);
+ }
+
+ /**
+ * Strokes the path.
+ */
+
+ public void stroke() {
+ content.append("S").append_i(separator);
+ }
+
+ /**
+ * Closes the path and strokes it.
+ */
+
+ public void closePathStroke() {
+ content.append("s").append_i(separator);
+ }
+
+ /**
+ * Fills the path, using the non-zero winding number rule to determine the region to fill.
+ */
+
+ public void fill() {
+ content.append("f").append_i(separator);
+ }
+
+ /**
+ * Fills the path, using the even-odd rule to determine the region to fill.
+ */
+
+ public void eoFill() {
+ content.append("f*").append_i(separator);
+ }
+
+ /**
+ * Fills the path using the non-zero winding number rule to determine the region to fill and strokes it.
+ */
+
+ public void fillStroke() {
+ content.append("B").append_i(separator);
+ }
+
+ /**
+ * Closes the path, fills it using the non-zero winding number rule to determine the region to fill and strokes it.
+ */
+
+ public void closePathFillStroke() {
+ content.append("b").append_i(separator);
+ }
+
+ /**
+ * Fills the path, using the even-odd rule to determine the region to fill and strokes it.
+ */
+
+ public void eoFillStroke() {
+ content.append("B*").append_i(separator);
+ }
+
+ /**
+ * Closes the path, fills it using the even-odd rule to determine the region to fill and strokes it.
+ */
+
+ public void closePathEoFillStroke() {
+ content.append("b*").append_i(separator);
+ }
+
+ /**
+ * Adds an <CODE>Image</CODE> to the page. The <CODE>Image</CODE> must have
+ * absolute positioning.
+ * @param image the <CODE>Image</CODE> object
+ * @throws DocumentException if the <CODE>Image</CODE> does not have absolute positioning
+ */
+ public void addImage(Image image) throws DocumentException {
+ addImage(image, false);
+ }
+
+ /**
+ * Adds an <CODE>Image</CODE> to the page. The <CODE>Image</CODE> must have
+ * absolute positioning. The image can be placed inline.
+ * @param image the <CODE>Image</CODE> object
+ * @param inlineImage <CODE>true</CODE> to place this image inline, <CODE>false</CODE> otherwise
+ * @throws DocumentException if the <CODE>Image</CODE> does not have absolute positioning
+ */
+ public void addImage(Image image, boolean inlineImage) throws DocumentException {
+ if (!image.hasAbsolutePosition())
+ throw new DocumentException("The image must have absolute positioning.");
+ float matrix[] = image.matrix();
+ matrix[Image.CX] = image.absoluteX() - matrix[Image.CX];
+ matrix[Image.CY] = image.absoluteY() - matrix[Image.CY];
+ addImage(image, matrix[0], matrix[1], matrix[2], matrix[3], matrix[4], matrix[5], inlineImage);
+ }
+
+ /**
+ * Adds an <CODE>Image</CODE> to the page. The positioning of the <CODE>Image</CODE>
+ * is done with the transformation matrix. To position an <CODE>image</CODE> at (x,y)
+ * use addImage(image, image_width, 0, 0, image_height, x, y).
+ * @param image the <CODE>Image</CODE> object
+ * @param a an element of the transformation matrix
+ * @param b an element of the transformation matrix
+ * @param c an element of the transformation matrix
+ * @param d an element of the transformation matrix
+ * @param e an element of the transformation matrix
+ * @param f an element of the transformation matrix
+ * @throws DocumentException on error
+ */
+ public void addImage(Image image, float a, float b, float c, float d, float e, float f) throws DocumentException {
+ addImage(image, a, b, c, d, e, f, false);
+ }
+
+ /**
+ * Adds an <CODE>Image</CODE> to the page. The positioning of the <CODE>Image</CODE>
+ * is done with the transformation matrix. To position an <CODE>image</CODE> at (x,y)
+ * use addImage(image, image_width, 0, 0, image_height, x, y). The image can be placed inline.
+ * @param image the <CODE>Image</CODE> object
+ * @param a an element of the transformation matrix
+ * @param b an element of the transformation matrix
+ * @param c an element of the transformation matrix
+ * @param d an element of the transformation matrix
+ * @param e an element of the transformation matrix
+ * @param f an element of the transformation matrix
+ * @param inlineImage <CODE>true</CODE> to place this image inline, <CODE>false</CODE> otherwise
+ * @throws DocumentException on error
+ */
+ public void addImage(Image image, float a, float b, float c, float d, float e, float f, boolean inlineImage) throws DocumentException {
+ try {
+ if (image.getLayer() != null)
+ beginLayer(image.getLayer());
+ if (image.isImgTemplate()) {
+ writer.addDirectImageSimple(image);
+ PdfTemplate template = image.templateData();
+ float w = template.getWidth();
+ float h = template.getHeight();
+ addTemplate(template, a / w, b / w, c / h, d / h, e, f);
+ }
+ else {
+ content.append("q ");
+ content.append(a).append(' ');
+ content.append(b).append(' ');
+ content.append(c).append(' ');
+ content.append(d).append(' ');
+ content.append(e).append(' ');
+ content.append(f).append(" cm");
+ if (inlineImage) {
+ content.append("\nBI\n");
+ PdfImage pimage = new PdfImage(image, "", null);
+ for (Iterator it = pimage.getKeys().iterator(); it.hasNext();) {
+ PdfName key = (PdfName)it.next();
+ PdfObject value = pimage.get(key);
+ String s = (String)abrev.get(key);
+ if (s == null)
+ continue;
+ content.append(s);
+ boolean check = true;
+ if (key.equals(PdfName.COLORSPACE) && value.isArray()) {
+ ArrayList ar = ((PdfArray)value).getArrayList();
+ if (ar.size() == 4
+ && PdfName.INDEXED.equals(ar.get(0))
+ && ((PdfObject)ar.get(1)).isName()
+ && ((PdfObject)ar.get(2)).isNumber()
+ && ((PdfObject)ar.get(3)).isString()
+ ) {
+ check = false;
+ }
+
+ }
+ if (check && key.equals(PdfName.COLORSPACE) && !value.isName()) {
+ PdfName cs = writer.getColorspaceName();
+ PageResources prs = getPageResources();
+ prs.addColor(cs, writer.addToBody(value).getIndirectReference());
+ value = cs;
+ }
+ value.toPdf(null, content);
+ content.append('\n');
+ }
+ content.append("ID\n");
+ pimage.writeContent(content);
+ content.append("\nEI\nQ").append_i(separator);
+ }
+ else {
+ PdfName name;
+ PageResources prs = getPageResources();
+ Image maskImage = image.getImageMask();
+ if (maskImage != null) {
+ name = writer.addDirectImageSimple(maskImage);
+ prs.addXObject(name, writer.getImageReference(name));
+ }
+ name = writer.addDirectImageSimple(image);
+ name = prs.addXObject(name, writer.getImageReference(name));
+ content.append(' ').append(name.getBytes()).append(" Do Q").append_i(separator);
+ }
+ }
+ if (image.hasBorders()) {
+ saveState();
+ float w = image.width();
+ float h = image.height();
+ concatCTM(a / w, b / w, c / h, d / h, e, f);
+ rectangle(image);
+ restoreState();
+ }
+ if (image.getLayer() != null)
+ endLayer();
+ Annotation annot = image.annotation();
+ if (annot == null)
+ return;
+ float[] r = new float[unitRect.length];
+ for (int k = 0; k < unitRect.length; k += 2) {
+ r[k] = a * unitRect[k] + c * unitRect[k + 1] + e;
+ r[k + 1] = b * unitRect[k] + d * unitRect[k + 1] + f;
+ }
+ float llx = r[0];
+ float lly = r[1];
+ float urx = llx;
+ float ury = lly;
+ for (int k = 2; k < r.length; k += 2) {
+ llx = Math.min(llx, r[k]);
+ lly = Math.min(lly, r[k + 1]);
+ urx = Math.max(urx, r[k]);
+ ury = Math.max(ury, r[k + 1]);
+ }
+ annot = new Annotation(annot);
+ annot.setDimensions(llx, lly, urx, ury);
+ PdfAnnotation an = PdfDocument.convertAnnotation(writer, annot);
+ if (an == null)
+ return;
+ addAnnotation(an);
+ }
+ catch (Exception ee) {
+ throw new DocumentException(ee);
+ }
+ }
+
+ /**
+ * Makes this <CODE>PdfContentByte</CODE> empty.
+ */
+ public void reset() {
+ content.reset();
+ stateList.clear();
+ state = new GraphicState();
+ }
+
+ /**
+ * Starts the writing of text.
+ */
+ public void beginText() {
+ state.xTLM = 0;
+ state.yTLM = 0;
+ content.append("BT").append_i(separator);
+ }
+
+ /**
+ * Ends the writing of text and makes the current font invalid.
+ */
+ public void endText() {
+ content.append("ET").append_i(separator);
+ }
+
+ /**
+ * Saves the graphic state. <CODE>saveState</CODE> and
+ * <CODE>restoreState</CODE> must be balanced.
+ */
+ public void saveState() {
+ content.append("q").append_i(separator);
+ stateList.add(new GraphicState(state));
+ }
+
+ /**
+ * Restores the graphic state. <CODE>saveState</CODE> and
+ * <CODE>restoreState</CODE> must be balanced.
+ */
+ public void restoreState() {
+ content.append("Q").append_i(separator);
+ int idx = stateList.size() - 1;
+ if (idx < 0)
+ throw new RuntimeException("Unbalanced save/restore state operators.");
+ state = (GraphicState)stateList.get(idx);
+ stateList.remove(idx);
+ }
+
+ /**
+ * Sets the character spacing parameter.
+ *
+ * @param charSpace a parameter
+ */
+ public void setCharacterSpacing(float charSpace) {
+ state.charSpace = charSpace;
+ content.append(charSpace).append(" Tc").append_i(separator);
+ }
+
+ /**
+ * Sets the word spacing parameter.
+ *
+ * @param wordSpace a parameter
+ */
+ public void setWordSpacing(float wordSpace) {
+ state.wordSpace = wordSpace;
+ content.append(wordSpace).append(" Tw").append_i(separator);
+ }
+
+ /**
+ * Sets the horizontal scaling parameter.
+ *
+ * @param scale a parameter
+ */
+ public void setHorizontalScaling(float scale) {
+ state.scale = scale;
+ content.append(scale).append(" Tz").append_i(separator);
+ }
+
+ /**
+ * Sets the text leading parameter.
+ * <P>
+ * The leading parameter is measured in text space units. It specifies the vertical distance
+ * between the baselines of adjacent lines of text.</P>
+ *
+ * @param leading the new leading
+ */
+ public void setLeading(float leading) {
+ state.leading = leading;
+ content.append(leading).append(" TL").append_i(separator);
+ }
+
+ /**
+ * Set the font and the size for the subsequent text writing.
+ *
+ * @param bf the font
+ * @param size the font size in points
+ */
+ public void setFontAndSize(BaseFont bf, float size) {
+ checkWriter();
+ state.size = size;
+ state.fontDetails = writer.addSimple(bf);
+ PageResources prs = getPageResources();
+ PdfName name = state.fontDetails.getFontName();
+ name = prs.addFont(name, state.fontDetails.getIndirectReference());
+ content.append(name.getBytes()).append(' ').append(size).append(" Tf").append_i(separator);
+ }
+
+ /**
+ * Sets the text rendering parameter.
+ *
+ * @param rendering a parameter
+ */
+ public void setTextRenderingMode(int rendering) {
+ content.append(rendering).append(" Tr").append_i(separator);
+ }
+
+ /**
+ * Sets the text rise parameter.
+ * <P>
+ * This allows to write text in subscript or superscript mode.</P>
+ *
+ * @param rise a parameter
+ */
+ public void setTextRise(float rise) {
+ content.append(rise).append(" Ts").append_i(separator);
+ }
+
+ /**
+ * A helper to insert into the content stream the <CODE>text</CODE>
+ * converted to bytes according to the font's encoding.
+ *
+ * @param text the text to write
+ */
+ private void showText2(String text) {
+ if (state.fontDetails == null)
+ throw new NullPointerException("Font and size must be set before writing any text");
+ byte b[] = state.fontDetails.convertToBytes(text);
+ escapeString(b, content);
+ }
+
+ /**
+ * Shows the <CODE>text</CODE>.
+ *
+ * @param text the text to write
+ */
+ public void showText(String text) {
+ showText2(text);
+ content.append("Tj").append_i(separator);
+ }
+
+ /**
+ * Constructs a kern array for a text in a certain font
+ * @param text the text
+ * @param font the font
+ * @return a PdfTextArray
+ */
+ public static PdfTextArray getKernArray(String text, BaseFont font) {
+ PdfTextArray pa = new PdfTextArray();
+ StringBuffer acc = new StringBuffer();
+ int len = text.length() - 1;
+ char c[] = text.toCharArray();
+ if (len >= 0)
+ acc.append(c, 0, 1);
+ for (int k = 0; k < len; ++k) {
+ char c2 = c[k + 1];
+ int kern = font.getKerning(c[k], c2);
+ if (kern == 0) {
+ acc.append(c2);
+ }
+ else {
+ pa.add(acc.toString());
+ acc.setLength(0);
+ acc.append(c, k + 1, 1);
+ pa.add(-kern);
+ }
+ }
+ pa.add(acc.toString());
+ return pa;
+ }
+
+ /**
+ * Shows the <CODE>text</CODE> kerned.
+ *
+ * @param text the text to write
+ */
+ public void showTextKerned(String text) {
+ if (state.fontDetails == null)
+ throw new NullPointerException("Font and size must be set before writing any text");
+ BaseFont bf = state.fontDetails.getBaseFont();
+ if (bf.hasKernPairs())
+ showText(getKernArray(text, bf));
+ else
+ showText(text);
+ }
+
+ /**
+ * Moves to the next line and shows <CODE>text</CODE>.
+ *
+ * @param text the text to write
+ */
+ public void newlineShowText(String text) {
+ state.yTLM -= state.leading;
+ showText2(text);
+ content.append("'").append_i(separator);
+ }
+
+ /**
+ * Moves to the next line and shows text string, using the given values of the character and word spacing parameters.
+ *
+ * @param wordSpacing a parameter
+ * @param charSpacing a parameter
+ * @param text the text to write
+ */
+ public void newlineShowText(float wordSpacing, float charSpacing, String text) {
+ state.yTLM -= state.leading;
+ content.append(wordSpacing).append(' ').append(charSpacing);
+ showText2(text);
+ content.append("\"").append_i(separator);
+
+ // The " operator sets charSpace and wordSpace into graphics state
+ // (cfr PDF reference v1.6, table 5.6)
+ state.charSpace = charSpacing;
+ state.wordSpace = wordSpacing;
+ }
+
+ /**
+ * Changes the text matrix.
+ * <P>
+ * Remark: this operation also initializes the current point position.</P>
+ *
+ * @param a operand 1,1 in the matrix
+ * @param b operand 1,2 in the matrix
+ * @param c operand 2,1 in the matrix
+ * @param d operand 2,2 in the matrix
+ * @param x operand 3,1 in the matrix
+ * @param y operand 3,2 in the matrix
+ */
+ public void setTextMatrix(float a, float b, float c, float d, float x, float y) {
+ state.xTLM = x;
+ state.yTLM = y;
+ content.append(a).append(' ').append(b).append_i(' ')
+ .append(c).append_i(' ').append(d).append_i(' ')
+ .append(x).append_i(' ').append(y).append(" Tm").append_i(separator);
+ }
+
+ /**
+ * Changes the text matrix. The first four parameters are {1,0,0,1}.
+ * <P>
+ * Remark: this operation also initializes the current point position.</P>
+ *
+ * @param x operand 3,1 in the matrix
+ * @param y operand 3,2 in the matrix
+ */
+ public void setTextMatrix(float x, float y) {
+ setTextMatrix(1, 0, 0, 1, x, y);
+ }
+
+ /**
+ * Moves to the start of the next line, offset from the start of the current line.
+ *
+ * @param x x-coordinate of the new current point
+ * @param y y-coordinate of the new current point
+ */
+ public void moveText(float x, float y) {
+ state.xTLM += x;
+ state.yTLM += y;
+ content.append(x).append(' ').append(y).append(" Td").append_i(separator);
+ }
+
+ /**
+ * Moves to the start of the next line, offset from the start of the current line.
+ * <P>
+ * As a side effect, this sets the leading parameter in the text state.</P>
+ *
+ * @param x offset of the new current point
+ * @param y y-coordinate of the new current point
+ */
+ public void moveTextWithLeading(float x, float y) {
+ state.xTLM += x;
+ state.yTLM += y;
+ state.leading = -y;
+ content.append(x).append(' ').append(y).append(" TD").append_i(separator);
+ }
+
+ /**
+ * Moves to the start of the next line.
+ */
+ public void newlineText() {
+ state.yTLM -= state.leading;
+ content.append("T*").append_i(separator);
+ }
+
+ /**
+ * Gets the size of this content.
+ *
+ * @return the size of the content
+ */
+ int size() {
+ return content.size();
+ }
+
+ /**
+ * Escapes a <CODE>byte</CODE> array according to the PDF conventions.
+ *
+ * @param b the <CODE>byte</CODE> array to escape
+ * @return an escaped <CODE>byte</CODE> array
+ */
+ static byte[] escapeString(byte b[]) {
+ ByteBuffer content = new ByteBuffer();
+ escapeString(b, content);
+ return content.toByteArray();
+ }
+
+ /**
+ * Escapes a <CODE>byte</CODE> array according to the PDF conventions.
+ *
+ * @param b the <CODE>byte</CODE> array to escape
+ * @param content the content
+ */
+ static void escapeString(byte b[], ByteBuffer content) {
+ content.append_i('(');
+ for (int k = 0; k < b.length; ++k) {
+ byte c = b[k];
+ switch ((int)c) {
+ case '\r':
+ content.append("\\r");
+ break;
+ case '\n':
+ content.append("\\n");
+ break;
+ case '\t':
+ content.append("\\t");
+ break;
+ case '\b':
+ content.append("\\b");
+ break;
+ case '\f':
+ content.append("\\f");
+ break;
+ case '(':
+ case ')':
+ case '\\':
+ content.append_i('\\').append_i(c);
+ break;
+ default:
+ content.append_i(c);
+ }
+ }
+ content.append(")");
+ }
+
+ /**
+ * Adds an outline to the document.
+ *
+ * @param outline the outline
+ * @deprecated not needed anymore. The outlines are extracted
+ * from the root outline
+ */
+ public void addOutline(PdfOutline outline) {
+ // for compatibility
+ }
+ /**
+ * Adds a named outline to the document.
+ *
+ * @param outline the outline
+ * @param name the name for the local destination
+ */
+ public void addOutline(PdfOutline outline, String name) {
+ checkWriter();
+ pdf.addOutline(outline, name);
+ }
+ /**
+ * Gets the root outline.
+ *
+ * @return the root outline
+ */
+ public PdfOutline getRootOutline() {
+ checkWriter();
+ return pdf.getRootOutline();
+ }
+
+ /**
+ * Computes the width of the given string taking in account
+ * the current values of "Character spacing", "Word Spacing"
+ * and "Horizontal Scaling".
+ * The additional spacing is not computed for the last character
+ * of the string.
+ * @param text the string to get width of
+ * @param kerned the kerning option
+ * @return the width
+ */
+
+ public float getEffectiveStringWidth(String text, boolean kerned) {
+ BaseFont bf = state.fontDetails.getBaseFont();
+
+ float w;
+ if (kerned)
+ w = bf.getWidthPointKerned(text, state.size);
+ else
+ w = bf.getWidthPoint(text, state.size);
+
+ if (state.charSpace != 0.0f && text.length() > 1) {
+ w += state.charSpace * (text.length() -1);
+ }
+
+ int ft = bf.getFontType();
+ if (state.wordSpace != 0.0f && (ft == BaseFont.FONT_TYPE_T1 || ft == BaseFont.FONT_TYPE_TT || ft == BaseFont.FONT_TYPE_T3)) {
+ for (int i = 0; i < (text.length() -1); i++) {
+ if (text.charAt(i) == ' ')
+ w += state.wordSpace;
+ }
+ }
+ if (state.scale != 100.0)
+ w = (w * state.scale) / 100.0f;
+
+ //System.out.println("String width = " + Float.toString(w));
+ return w;
+ }
+
+ /**
+ * Shows text right, left or center aligned with rotation.
+ * @param alignment the alignment can be ALIGN_CENTER, ALIGN_RIGHT or ALIGN_LEFT
+ * @param text the text to show
+ * @param x the x pivot position
+ * @param y the y pivot position
+ * @param rotation the rotation to be applied in degrees counterclockwise
+ */
+ public void showTextAligned(int alignment, String text, float x, float y, float rotation) {
+ showTextAligned(alignment, text, x, y, rotation, false);
+ }
+
+ private void showTextAligned(int alignment, String text, float x, float y, float rotation, boolean kerned) {
+ if (state.fontDetails == null)
+ throw new NullPointerException("Font and size must be set before writing any text");
+ if (rotation == 0) {
+ switch (alignment) {
+ case ALIGN_CENTER:
+ x -= getEffectiveStringWidth(text, kerned) / 2;
+ break;
+ case ALIGN_RIGHT:
+ x -= getEffectiveStringWidth(text, kerned);
+ break;
+ }
+ setTextMatrix(x, y);
+ if (kerned)
+ showTextKerned(text);
+ else
+ showText(text);
+ }
+ else {
+ double alpha = rotation * Math.PI / 180.0;
+ float cos = (float)Math.cos(alpha);
+ float sin = (float)Math.sin(alpha);
+ float len;
+ switch (alignment) {
+ case ALIGN_CENTER:
+ len = getEffectiveStringWidth(text, kerned) / 2;
+ x -= len * cos;
+ y -= len * sin;
+ break;
+ case ALIGN_RIGHT:
+ len = getEffectiveStringWidth(text, kerned);
+ x -= len * cos;
+ y -= len * sin;
+ break;
+ }
+ setTextMatrix(cos, sin, -sin, cos, x, y);
+ if (kerned)
+ showTextKerned(text);
+ else
+ showText(text);
+ setTextMatrix(0f, 0f);
+ }
+ }
+
+ /**
+ * Shows text kerned right, left or center aligned with rotation.
+ * @param alignment the alignment can be ALIGN_CENTER, ALIGN_RIGHT or ALIGN_LEFT
+ * @param text the text to show
+ * @param x the x pivot position
+ * @param y the y pivot position
+ * @param rotation the rotation to be applied in degrees counterclockwise
+ */
+ public void showTextAlignedKerned(int alignment, String text, float x, float y, float rotation) {
+ showTextAligned(alignment, text, x, y, rotation, true);
+ }
+
+ /**
+ * Concatenate a matrix to the current transformation matrix.
+ * @param a an element of the transformation matrix
+ * @param b an element of the transformation matrix
+ * @param c an element of the transformation matrix
+ * @param d an element of the transformation matrix
+ * @param e an element of the transformation matrix
+ * @param f an element of the transformation matrix
+ **/
+ public void concatCTM(float a, float b, float c, float d, float e, float f) {
+ content.append(a).append(' ').append(b).append(' ').append(c).append(' ');
+ content.append(d).append(' ').append(e).append(' ').append(f).append(" cm").append_i(separator);
+ }
+
+ /**
+ * Generates an array of bezier curves to draw an arc.
+ * <P>
+ * (x1, y1) and (x2, y2) are the corners of the enclosing rectangle.
+ * Angles, measured in degrees, start with 0 to the right (the positive X
+ * axis) and increase counter-clockwise. The arc extends from startAng
+ * to startAng+extent. I.e. startAng=0 and extent=180 yields an openside-down
+ * semi-circle.
+ * <P>
+ * The resulting coordinates are of the form float[]{x1,y1,x2,y2,x3,y3, x4,y4}
+ * such that the curve goes from (x1, y1) to (x4, y4) with (x2, y2) and
+ * (x3, y3) as their respective Bezier control points.
+ * <P>
+ * Note: this code was taken from ReportLab (www.reportlab.com), an excelent
+ * PDF generator for Python.
+ *
+ * @param x1 a corner of the enclosing rectangle
+ * @param y1 a corner of the enclosing rectangle
+ * @param x2 a corner of the enclosing rectangle
+ * @param y2 a corner of the enclosing rectangle
+ * @param startAng starting angle in degrees
+ * @param extent angle extent in degrees
+ * @return a list of float[] with the bezier curves
+ */
+ public static ArrayList bezierArc(float x1, float y1, float x2, float y2, float startAng, float extent) {
+ float tmp;
+ if (x1 > x2) {
+ tmp = x1;
+ x1 = x2;
+ x2 = tmp;
+ }
+ if (y2 > y1) {
+ tmp = y1;
+ y1 = y2;
+ y2 = tmp;
+ }
+
+ float fragAngle;
+ int Nfrag;
+ if (Math.abs(extent) <= 90f) {
+ fragAngle = extent;
+ Nfrag = 1;
+ }
+ else {
+ Nfrag = (int)(Math.ceil(Math.abs(extent)/90f));
+ fragAngle = extent / Nfrag;
+ }
+ float x_cen = (x1+x2)/2f;
+ float y_cen = (y1+y2)/2f;
+ float rx = (x2-x1)/2f;
+ float ry = (y2-y1)/2f;
+ float halfAng = (float)(fragAngle * Math.PI / 360.);
+ float kappa = (float)(Math.abs(4. / 3. * (1. - Math.cos(halfAng)) / Math.sin(halfAng)));
+ ArrayList pointList = new ArrayList();
+ for (int i = 0; i < Nfrag; ++i) {
+ float theta0 = (float)((startAng + i*fragAngle) * Math.PI / 180.);
+ float theta1 = (float)((startAng + (i+1)*fragAngle) * Math.PI / 180.);
+ float cos0 = (float)Math.cos(theta0);
+ float cos1 = (float)Math.cos(theta1);
+ float sin0 = (float)Math.sin(theta0);
+ float sin1 = (float)Math.sin(theta1);
+ if (fragAngle > 0f) {
+ pointList.add(new float[]{x_cen + rx * cos0,
+ y_cen - ry * sin0,
+ x_cen + rx * (cos0 - kappa * sin0),
+ y_cen - ry * (sin0 + kappa * cos0),
+ x_cen + rx * (cos1 + kappa * sin1),
+ y_cen - ry * (sin1 - kappa * cos1),
+ x_cen + rx * cos1,
+ y_cen - ry * sin1});
+ }
+ else {
+ pointList.add(new float[]{x_cen + rx * cos0,
+ y_cen - ry * sin0,
+ x_cen + rx * (cos0 + kappa * sin0),
+ y_cen - ry * (sin0 - kappa * cos0),
+ x_cen + rx * (cos1 - kappa * sin1),
+ y_cen - ry * (sin1 + kappa * cos1),
+ x_cen + rx * cos1,
+ y_cen - ry * sin1});
+ }
+ }
+ return pointList;
+ }
+
+ /**
+ * Draws a partial ellipse inscribed within the rectangle x1,y1,x2,y2,
+ * starting at startAng degrees and covering extent degrees. Angles
+ * start with 0 to the right (+x) and increase counter-clockwise.
+ *
+ * @param x1 a corner of the enclosing rectangle
+ * @param y1 a corner of the enclosing rectangle
+ * @param x2 a corner of the enclosing rectangle
+ * @param y2 a corner of the enclosing rectangle
+ * @param startAng starting angle in degrees
+ * @param extent angle extent in degrees
+ */
+ public void arc(float x1, float y1, float x2, float y2, float startAng, float extent) {
+ ArrayList ar = bezierArc(x1, y1, x2, y2, startAng, extent);
+ if (ar.size() == 0)
+ return;
+ float pt[] = (float [])ar.get(0);
+ moveTo(pt[0], pt[1]);
+ for (int k = 0; k < ar.size(); ++k) {
+ pt = (float [])ar.get(k);
+ curveTo(pt[2], pt[3], pt[4], pt[5], pt[6], pt[7]);
+ }
+ }
+
+ /**
+ * Draws an ellipse inscribed within the rectangle x1,y1,x2,y2.
+ *
+ * @param x1 a corner of the enclosing rectangle
+ * @param y1 a corner of the enclosing rectangle
+ * @param x2 a corner of the enclosing rectangle
+ * @param y2 a corner of the enclosing rectangle
+ */
+ public void ellipse(float x1, float y1, float x2, float y2) {
+ arc(x1, y1, x2, y2, 0f, 360f);
+ }
+
+ /**
+ * Create a new colored tiling pattern.
+ *
+ * @param width the width of the pattern
+ * @param height the height of the pattern
+ * @param xstep the desired horizontal spacing between pattern cells.
+ * May be either positive or negative, but not zero.
+ * @param ystep the desired vertical spacing between pattern cells.
+ * May be either positive or negative, but not zero.
+ * @return the <CODE>PdfPatternPainter</CODE> where the pattern will be created
+ */
+ public PdfPatternPainter createPattern(float width, float height, float xstep, float ystep) {
+ checkWriter();
+ if ( xstep == 0.0f || ystep == 0.0f )
+ throw new RuntimeException("XStep or YStep can not be ZERO.");
+ PdfPatternPainter painter = new PdfPatternPainter(writer);
+ painter.setWidth(width);
+ painter.setHeight(height);
+ painter.setXStep(xstep);
+ painter.setYStep(ystep);
+ writer.addSimplePattern(painter);
+ return painter;
+ }
+
+ /**
+ * Create a new colored tiling pattern. Variables xstep and ystep are set to the same values
+ * of width and height.
+ * @param width the width of the pattern
+ * @param height the height of the pattern
+ * @return the <CODE>PdfPatternPainter</CODE> where the pattern will be created
+ */
+ public PdfPatternPainter createPattern(float width, float height) {
+ return createPattern(width, height, width, height);
+ }
+
+ /**
+ * Create a new uncolored tiling pattern.
+ *
+ * @param width the width of the pattern
+ * @param height the height of the pattern
+ * @param xstep the desired horizontal spacing between pattern cells.
+ * May be either positive or negative, but not zero.
+ * @param ystep the desired vertical spacing between pattern cells.
+ * May be either positive or negative, but not zero.
+ * @param color the default color. Can be <CODE>null</CODE>
+ * @return the <CODE>PdfPatternPainter</CODE> where the pattern will be created
+ */
+ public PdfPatternPainter createPattern(float width, float height, float xstep, float ystep, Color color) {
+ checkWriter();
+ if ( xstep == 0.0f || ystep == 0.0f )
+ throw new RuntimeException("XStep or YStep can not be ZERO.");
+ PdfPatternPainter painter = new PdfPatternPainter(writer, color);
+ painter.setWidth(width);
+ painter.setHeight(height);
+ painter.setXStep(xstep);
+ painter.setYStep(ystep);
+ writer.addSimplePattern(painter);
+ return painter;
+ }
+
+ /**
+ * Create a new uncolored tiling pattern.
+ * Variables xstep and ystep are set to the same values
+ * of width and height.
+ * @param width the width of the pattern
+ * @param height the height of the pattern
+ * @param color the default color. Can be <CODE>null</CODE>
+ * @return the <CODE>PdfPatternPainter</CODE> where the pattern will be created
+ */
+ public PdfPatternPainter createPattern(float width, float height, Color color) {
+ return createPattern(width, height, width, height, color);
+ }
+
+ /**
+ * Creates a new template.
+ * <P>
+ * Creates a new template that is nothing more than a form XObject. This template can be included
+ * in this <CODE>PdfContentByte</CODE> or in another template. Templates are only written
+ * to the output when the document is closed permitting things like showing text in the first page
+ * that is only defined in the last page.
+ *
+ * @param width the bounding box width
+ * @param height the bounding box height
+ * @return the templated created
+ */
+ public PdfTemplate createTemplate(float width, float height) {
+ return createTemplate(width, height, null);
+ }
+
+ PdfTemplate createTemplate(float width, float height, PdfName forcedName) {
+ checkWriter();
+ PdfTemplate template = new PdfTemplate(writer);
+ template.setWidth(width);
+ template.setHeight(height);
+ writer.addDirectTemplateSimple(template, forcedName);
+ return template;
+ }
+
+ /**
+ * Creates a new appearance to be used with form fields.
+ *
+ * @param width the bounding box width
+ * @param height the bounding box height
+ * @return the appearance created
+ */
+ public PdfAppearance createAppearance(float width, float height) {
+ return createAppearance(width, height, null);
+ }
+
+ PdfAppearance createAppearance(float width, float height, PdfName forcedName) {
+ checkWriter();
+ PdfAppearance template = new PdfAppearance(writer);
+ template.setWidth(width);
+ template.setHeight(height);
+ writer.addDirectTemplateSimple(template, forcedName);
+ return template;
+ }
+
+ /**
+ * Adds a PostScript XObject to this content.
+ *
+ * @param psobject the object
+ */
+ public void addPSXObject(PdfPSXObject psobject) {
+ checkWriter();
+ PdfName name = writer.addDirectTemplateSimple(psobject, null);
+ PageResources prs = getPageResources();
+ name = prs.addXObject(name, psobject.getIndirectReference());
+ content.append(name.getBytes()).append(" Do").append_i(separator);
+ }
+
+ /**
+ * Adds a template to this content.
+ *
+ * @param template the template
+ * @param a an element of the transformation matrix
+ * @param b an element of the transformation matrix
+ * @param c an element of the transformation matrix
+ * @param d an element of the transformation matrix
+ * @param e an element of the transformation matrix
+ * @param f an element of the transformation matrix
+ */
+ public void addTemplate(PdfTemplate template, float a, float b, float c, float d, float e, float f) {
+ checkWriter();
+ checkNoPattern(template);
+ PdfName name = writer.addDirectTemplateSimple(template, null);
+ PageResources prs = getPageResources();
+ name = prs.addXObject(name, template.getIndirectReference());
+ content.append("q ");
+ content.append(a).append(' ');
+ content.append(b).append(' ');
+ content.append(c).append(' ');
+ content.append(d).append(' ');
+ content.append(e).append(' ');
+ content.append(f).append(" cm ");
+ content.append(name.getBytes()).append(" Do Q").append_i(separator);
+ }
+
+ /**
+ * Adds a template to this content.
+ *
+ * @param template the template
+ * @param x the x location of this template
+ * @param y the y location of this template
+ */
+ public void addTemplate(PdfTemplate template, float x, float y) {
+ addTemplate(template, 1, 0, 0, 1, x, y);
+ }
+
+ /**
+ * Changes the current color for filling paths (device dependent colors!).
+ * <P>
+ * Sets the color space to <B>DeviceCMYK</B> (or the <B>DefaultCMYK</B> color space),
+ * and sets the color to use for filling paths.</P>
+ * <P>
+ * This method is described in the 'Portable Document Format Reference Manual version 1.3'
+ * section 8.5.2.1 (page 331).</P>
+ * <P>
+ * Following the PDF manual, each operand must be a number between 0 (no ink) and
+ * 1 (maximum ink). This method however accepts only integers between 0x00 and 0xFF.</P>
+ *
+ * @param cyan the intensity of cyan
+ * @param magenta the intensity of magenta
+ * @param yellow the intensity of yellow
+ * @param black the intensity of black
+ */
+
+ public void setCMYKColorFill(int cyan, int magenta, int yellow, int black) {
+ content.append((float)(cyan & 0xFF) / 0xFF);
+ content.append(' ');
+ content.append((float)(magenta & 0xFF) / 0xFF);
+ content.append(' ');
+ content.append((float)(yellow & 0xFF) / 0xFF);
+ content.append(' ');
+ content.append((float)(black & 0xFF) / 0xFF);
+ content.append(" k").append_i(separator);
+ }
+ /**
+ * Changes the current color for stroking paths (device dependent colors!).
+ * <P>
+ * Sets the color space to <B>DeviceCMYK</B> (or the <B>DefaultCMYK</B> color space),
+ * and sets the color to use for stroking paths.</P>
+ * <P>
+ * This method is described in the 'Portable Document Format Reference Manual version 1.3'
+ * section 8.5.2.1 (page 331).</P>
+ * Following the PDF manual, each operand must be a number between 0 (miniumum intensity) and
+ * 1 (maximum intensity). This method however accepts only integers between 0x00 and 0xFF.
+ *
+ * @param cyan the intensity of red
+ * @param magenta the intensity of green
+ * @param yellow the intensity of blue
+ * @param black the intensity of black
+ */
+
+ public void setCMYKColorStroke(int cyan, int magenta, int yellow, int black) {
+ content.append((float)(cyan & 0xFF) / 0xFF);
+ content.append(' ');
+ content.append((float)(magenta & 0xFF) / 0xFF);
+ content.append(' ');
+ content.append((float)(yellow & 0xFF) / 0xFF);
+ content.append(' ');
+ content.append((float)(black & 0xFF) / 0xFF);
+ content.append(" K").append_i(separator);
+ }
+
+ /**
+ * Changes the current color for filling paths (device dependent colors!).
+ * <P>
+ * Sets the color space to <B>DeviceRGB</B> (or the <B>DefaultRGB</B> color space),
+ * and sets the color to use for filling paths.</P>
+ * <P>
+ * This method is described in the 'Portable Document Format Reference Manual version 1.3'
+ * section 8.5.2.1 (page 331).</P>
+ * <P>
+ * Following the PDF manual, each operand must be a number between 0 (miniumum intensity) and
+ * 1 (maximum intensity). This method however accepts only integers between 0x00 and 0xFF.</P>
+ *
+ * @param red the intensity of red
+ * @param green the intensity of green
+ * @param blue the intensity of blue
+ */
+
+ public void setRGBColorFill(int red, int green, int blue) {
+ HelperRGB((float)(red & 0xFF) / 0xFF, (float)(green & 0xFF) / 0xFF, (float)(blue & 0xFF) / 0xFF);
+ content.append(" rg").append_i(separator);
+ }
+
+ /**
+ * Changes the current color for stroking paths (device dependent colors!).
+ * <P>
+ * Sets the color space to <B>DeviceRGB</B> (or the <B>DefaultRGB</B> color space),
+ * and sets the color to use for stroking paths.</P>
+ * <P>
+ * This method is described in the 'Portable Document Format Reference Manual version 1.3'
+ * section 8.5.2.1 (page 331).</P>
+ * Following the PDF manual, each operand must be a number between 0 (miniumum intensity) and
+ * 1 (maximum intensity). This method however accepts only integers between 0x00 and 0xFF.
+ *
+ * @param red the intensity of red
+ * @param green the intensity of green
+ * @param blue the intensity of blue
+ */
+
+ public void setRGBColorStroke(int red, int green, int blue) {
+ HelperRGB((float)(red & 0xFF) / 0xFF, (float)(green & 0xFF) / 0xFF, (float)(blue & 0xFF) / 0xFF);
+ content.append(" RG").append_i(separator);
+ }
+
+ /** Sets the stroke color. <CODE>color</CODE> can be an
+ * <CODE>ExtendedColor</CODE>.
+ * @param color the color
+ */
+ public void setColorStroke(Color color) {
+ PdfWriter.checkPDFXConformance(writer, PdfWriter.PDFXKEY_COLOR, color);
+ int type = ExtendedColor.getType(color);
+ switch (type) {
+ case ExtendedColor.TYPE_GRAY: {
+ setGrayStroke(((GrayColor)color).getGray());
+ break;
+ }
+ case ExtendedColor.TYPE_CMYK: {
+ CMYKColor cmyk = (CMYKColor)color;
+ setCMYKColorStrokeF(cmyk.getCyan(), cmyk.getMagenta(), cmyk.getYellow(), cmyk.getBlack());
+ break;
+ }
+ case ExtendedColor.TYPE_SEPARATION: {
+ SpotColor spot = (SpotColor)color;
+ setColorStroke(spot.getPdfSpotColor(), spot.getTint());
+ break;
+ }
+ case ExtendedColor.TYPE_PATTERN: {
+ PatternColor pat = (PatternColor) color;
+ setPatternStroke(pat.getPainter());
+ break;
+ }
+ case ExtendedColor.TYPE_SHADING: {
+ ShadingColor shading = (ShadingColor) color;
+ setShadingStroke(shading.getPdfShadingPattern());
+ break;
+ }
+ default:
+ setRGBColorStroke(color.getRed(), color.getGreen(), color.getBlue());
+ }
+ }
+
+ /** Sets the fill color. <CODE>color</CODE> can be an
+ * <CODE>ExtendedColor</CODE>.
+ * @param color the color
+ */
+ public void setColorFill(Color color) {
+ PdfWriter.checkPDFXConformance(writer, PdfWriter.PDFXKEY_COLOR, color);
+ int type = ExtendedColor.getType(color);
+ switch (type) {
+ case ExtendedColor.TYPE_GRAY: {
+ setGrayFill(((GrayColor)color).getGray());
+ break;
+ }
+ case ExtendedColor.TYPE_CMYK: {
+ CMYKColor cmyk = (CMYKColor)color;
+ setCMYKColorFillF(cmyk.getCyan(), cmyk.getMagenta(), cmyk.getYellow(), cmyk.getBlack());
+ break;
+ }
+ case ExtendedColor.TYPE_SEPARATION: {
+ SpotColor spot = (SpotColor)color;
+ setColorFill(spot.getPdfSpotColor(), spot.getTint());
+ break;
+ }
+ case ExtendedColor.TYPE_PATTERN: {
+ PatternColor pat = (PatternColor) color;
+ setPatternFill(pat.getPainter());
+ break;
+ }
+ case ExtendedColor.TYPE_SHADING: {
+ ShadingColor shading = (ShadingColor) color;
+ setShadingFill(shading.getPdfShadingPattern());
+ break;
+ }
+ default:
+ setRGBColorFill(color.getRed(), color.getGreen(), color.getBlue());
+ }
+ }
+
+ /** Sets the fill color to a spot color.
+ * @param sp the spot color
+ * @param tint the tint for the spot color. 0 is no color and 1
+ * is 100% color
+ */
+ public void setColorFill(PdfSpotColor sp, float tint) {
+ checkWriter();
+ state.colorDetails = writer.addSimple(sp);
+ PageResources prs = getPageResources();
+ PdfName name = state.colorDetails.getColorName();
+ name = prs.addColor(name, state.colorDetails.getIndirectReference());
+ content.append(name.getBytes()).append(" cs ").append(tint).append(" scn").append_i(separator);
+ }
+
+ /** Sets the stroke color to a spot color.
+ * @param sp the spot color
+ * @param tint the tint for the spot color. 0 is no color and 1
+ * is 100% color
+ */
+ public void setColorStroke(PdfSpotColor sp, float tint) {
+ checkWriter();
+ state.colorDetails = writer.addSimple(sp);
+ PageResources prs = getPageResources();
+ PdfName name = state.colorDetails.getColorName();
+ name = prs.addColor(name, state.colorDetails.getIndirectReference());
+ content.append(name.getBytes()).append(" CS ").append(tint).append(" SCN").append_i(separator);
+ }
+
+ /** Sets the fill color to a pattern. The pattern can be
+ * colored or uncolored.
+ * @param p the pattern
+ */
+ public void setPatternFill(PdfPatternPainter p) {
+ if (p.isStencil()) {
+ setPatternFill(p, p.getDefaultColor());
+ return;
+ }
+ checkWriter();
+ PageResources prs = getPageResources();
+ PdfName name = writer.addSimplePattern(p);
+ name = prs.addPattern(name, p.getIndirectReference());
+ content.append(PdfName.PATTERN.getBytes()).append(" cs ").append(name.getBytes()).append(" scn").append_i(separator);
+ }
+
+ /** Outputs the color values to the content.
+ * @param color The color
+ * @param tint the tint if it is a spot color, ignored otherwise
+ */
+ void outputColorNumbers(Color color, float tint) {
+ PdfWriter.checkPDFXConformance(writer, PdfWriter.PDFXKEY_COLOR, color);
+ int type = ExtendedColor.getType(color);
+ switch (type) {
+ case ExtendedColor.TYPE_RGB:
+ content.append((float)(color.getRed()) / 0xFF);
+ content.append(' ');
+ content.append((float)(color.getGreen()) / 0xFF);
+ content.append(' ');
+ content.append((float)(color.getBlue()) / 0xFF);
+ break;
+ case ExtendedColor.TYPE_GRAY:
+ content.append(((GrayColor)color).getGray());
+ break;
+ case ExtendedColor.TYPE_CMYK: {
+ CMYKColor cmyk = (CMYKColor)color;
+ content.append(cmyk.getCyan()).append(' ').append(cmyk.getMagenta());
+ content.append(' ').append(cmyk.getYellow()).append(' ').append(cmyk.getBlack());
+ break;
+ }
+ case ExtendedColor.TYPE_SEPARATION:
+ content.append(tint);
+ break;
+ default:
+ throw new RuntimeException("Invalid color type.");
+ }
+ }
+
+ /** Sets the fill color to an uncolored pattern.
+ * @param p the pattern
+ * @param color the color of the pattern
+ */
+ public void setPatternFill(PdfPatternPainter p, Color color) {
+ if (ExtendedColor.getType(color) == ExtendedColor.TYPE_SEPARATION)
+ setPatternFill(p, color, ((SpotColor)color).getTint());
+ else
+ setPatternFill(p, color, 0);
+ }
+
+ /** Sets the fill color to an uncolored pattern.
+ * @param p the pattern
+ * @param color the color of the pattern
+ * @param tint the tint if the color is a spot color, ignored otherwise
+ */
+ public void setPatternFill(PdfPatternPainter p, Color color, float tint) {
+ checkWriter();
+ if (!p.isStencil())
+ throw new RuntimeException("An uncolored pattern was expected.");
+ PageResources prs = getPageResources();
+ PdfName name = writer.addSimplePattern(p);
+ name = prs.addPattern(name, p.getIndirectReference());
+ ColorDetails csDetail = writer.addSimplePatternColorspace(color);
+ PdfName cName = prs.addColor(csDetail.getColorName(), csDetail.getIndirectReference());
+ content.append(cName.getBytes()).append(" cs").append_i(separator);
+ outputColorNumbers(color, tint);
+ content.append(' ').append(name.getBytes()).append(" scn").append_i(separator);
+ }
+
+ /** Sets the stroke color to an uncolored pattern.
+ * @param p the pattern
+ * @param color the color of the pattern
+ */
+ public void setPatternStroke(PdfPatternPainter p, Color color) {
+ if (ExtendedColor.getType(color) == ExtendedColor.TYPE_SEPARATION)
+ setPatternStroke(p, color, ((SpotColor)color).getTint());
+ else
+ setPatternStroke(p, color, 0);
+ }
+
+ /** Sets the stroke color to an uncolored pattern.
+ * @param p the pattern
+ * @param color the color of the pattern
+ * @param tint the tint if the color is a spot color, ignored otherwise
+ */
+ public void setPatternStroke(PdfPatternPainter p, Color color, float tint) {
+ checkWriter();
+ if (!p.isStencil())
+ throw new RuntimeException("An uncolored pattern was expected.");
+ PageResources prs = getPageResources();
+ PdfName name = writer.addSimplePattern(p);
+ name = prs.addPattern(name, p.getIndirectReference());
+ ColorDetails csDetail = writer.addSimplePatternColorspace(color);
+ PdfName cName = prs.addColor(csDetail.getColorName(), csDetail.getIndirectReference());
+ content.append(cName.getBytes()).append(" CS").append_i(separator);
+ outputColorNumbers(color, tint);
+ content.append(' ').append(name.getBytes()).append(" SCN").append_i(separator);
+ }
+
+ /** Sets the stroke color to a pattern. The pattern can be
+ * colored or uncolored.
+ * @param p the pattern
+ */
+ public void setPatternStroke(PdfPatternPainter p) {
+ if (p.isStencil()) {
+ setPatternStroke(p, p.getDefaultColor());
+ return;
+ }
+ checkWriter();
+ PageResources prs = getPageResources();
+ PdfName name = writer.addSimplePattern(p);
+ name = prs.addPattern(name, p.getIndirectReference());
+ content.append(PdfName.PATTERN.getBytes()).append(" CS ").append(name.getBytes()).append(" SCN").append_i(separator);
+ }
+
+ /**
+ * Paints using a shading object.
+ * @param shading the shading object
+ */
+ public void paintShading(PdfShading shading) {
+ writer.addSimpleShading(shading);
+ PageResources prs = getPageResources();
+ PdfName name = prs.addShading(shading.getShadingName(), shading.getShadingReference());
+ content.append(name.getBytes()).append(" sh").append_i(separator);
+ ColorDetails details = shading.getColorDetails();
+ if (details != null)
+ prs.addColor(details.getColorName(), details.getIndirectReference());
+ }
+
+ /**
+ * Paints using a shading pattern.
+ * @param shading the shading pattern
+ */
+ public void paintShading(PdfShadingPattern shading) {
+ paintShading(shading.getShading());
+ }
+
+ /**
+ * Sets the shading fill pattern.
+ * @param shading the shading pattern
+ */
+ public void setShadingFill(PdfShadingPattern shading) {
+ writer.addSimpleShadingPattern(shading);
+ PageResources prs = getPageResources();
+ PdfName name = prs.addPattern(shading.getPatternName(), shading.getPatternReference());
+ content.append(PdfName.PATTERN.getBytes()).append(" cs ").append(name.getBytes()).append(" scn").append_i(separator);
+ ColorDetails details = shading.getColorDetails();
+ if (details != null)
+ prs.addColor(details.getColorName(), details.getIndirectReference());
+ }
+
+ /**
+ * Sets the shading stroke pattern
+ * @param shading the shading pattern
+ */
+ public void setShadingStroke(PdfShadingPattern shading) {
+ writer.addSimpleShadingPattern(shading);
+ PageResources prs = getPageResources();
+ PdfName name = prs.addPattern(shading.getPatternName(), shading.getPatternReference());
+ content.append(PdfName.PATTERN.getBytes()).append(" CS ").append(name.getBytes()).append(" SCN").append_i(separator);
+ ColorDetails details = shading.getColorDetails();
+ if (details != null)
+ prs.addColor(details.getColorName(), details.getIndirectReference());
+ }
+
+ /** Check if we have a valid PdfWriter.
+ *
+ */
+ protected void checkWriter() {
+ if (writer == null)
+ throw new NullPointerException("The writer in PdfContentByte is null.");
+ }
+
+ /**
+ * Show an array of text.
+ * @param text array of text
+ */
+ public void showText(PdfTextArray text) {
+ if (state.fontDetails == null)
+ throw new NullPointerException("Font and size must be set before writing any text");
+ content.append("[");
+ ArrayList arrayList = text.getArrayList();
+ boolean lastWasNumber = false;
+ for (int k = 0; k < arrayList.size(); ++k) {
+ Object obj = arrayList.get(k);
+ if (obj instanceof String) {
+ showText2((String)obj);
+ lastWasNumber = false;
+ }
+ else {
+ if (lastWasNumber)
+ content.append(' ');
+ else
+ lastWasNumber = true;
+ content.append(((Float)obj).floatValue());
+ }
+ }
+ content.append("]TJ").append_i(separator);
+ }
+
+ /**
+ * Gets the <CODE>PdfWriter</CODE> in use by this object.
+ * @return the <CODE>PdfWriter</CODE> in use by this object
+ */
+ public PdfWriter getPdfWriter() {
+ return writer;
+ }
+
+ /**
+ * Gets the <CODE>PdfDocument</CODE> in use by this object.
+ * @return the <CODE>PdfDocument</CODE> in use by this object
+ */
+ public PdfDocument getPdfDocument() {
+ return pdf;
+ }
+
+ /**
+ * Implements a link to other part of the document. The jump will
+ * be made to a local destination with the same name, that must exist.
+ * @param name the name for this link
+ * @param llx the lower left x corner of the activation area
+ * @param lly the lower left y corner of the activation area
+ * @param urx the upper right x corner of the activation area
+ * @param ury the upper right y corner of the activation area
+ */
+ public void localGoto(String name, float llx, float lly, float urx, float ury) {
+ pdf.localGoto(name, llx, lly, urx, ury);
+ }
+
+ /**
+ * The local destination to where a local goto with the same
+ * name will jump.
+ * @param name the name of this local destination
+ * @param destination the <CODE>PdfDestination</CODE> with the jump coordinates
+ * @return <CODE>true</CODE> if the local destination was added,
+ * <CODE>false</CODE> if a local destination with the same name
+ * already exists
+ */
+ public boolean localDestination(String name, PdfDestination destination) {
+ return pdf.localDestination(name, destination);
+ }
+
+ /**
+ * Gets a duplicate of this <CODE>PdfContentByte</CODE>. All
+ * the members are copied by reference but the buffer stays different.
+ *
+ * @return a copy of this <CODE>PdfContentByte</CODE>
+ */
+ public PdfContentByte getDuplicate() {
+ return new PdfContentByte(writer);
+ }
+
+ /**
+ * Implements a link to another document.
+ * @param filename the filename for the remote document
+ * @param name the name to jump to
+ * @param llx the lower left x corner of the activation area
+ * @param lly the lower left y corner of the activation area
+ * @param urx the upper right x corner of the activation area
+ * @param ury the upper right y corner of the activation area
+ */
+ public void remoteGoto(String filename, String name, float llx, float lly, float urx, float ury) {
+ pdf.remoteGoto(filename, name, llx, lly, urx, ury);
+ }
+
+ /**
+ * Implements a link to another document.
+ * @param filename the filename for the remote document
+ * @param page the page to jump to
+ * @param llx the lower left x corner of the activation area
+ * @param lly the lower left y corner of the activation area
+ * @param urx the upper right x corner of the activation area
+ * @param ury the upper right y corner of the activation area
+ */
+ public void remoteGoto(String filename, int page, float llx, float lly, float urx, float ury) {
+ pdf.remoteGoto(filename, page, llx, lly, urx, ury);
+ }
+ /**
+ * Adds a round rectangle to the current path.
+ *
+ * @param x x-coordinate of the starting point
+ * @param y y-coordinate of the starting point
+ * @param w width
+ * @param h height
+ * @param r radius of the arc corner
+ */
+ public void roundRectangle(float x, float y, float w, float h, float r) {
+ if (w < 0) {
+ x += w;
+ w = -w;
+ }
+ if (h < 0) {
+ y += h;
+ h = -h;
+ }
+ if (r < 0)
+ r = -r;
+ float b = 0.4477f;
+ moveTo(x + r, y);
+ lineTo(x + w - r, y);
+ curveTo(x + w - r * b, y, x + w, y + r * b, x + w, y + r);
+ lineTo(x + w, y + h - r);
+ curveTo(x + w, y + h - r * b, x + w - r * b, y + h, x + w - r, y + h);
+ lineTo(x + r, y + h);
+ curveTo(x + r * b, y + h, x, y + h - r * b, x, y + h - r);
+ lineTo(x, y + r);
+ curveTo(x, y + r * b, x + r * b, y, x + r, y);
+ }
+
+ /** Implements an action in an area.
+ * @param action the <CODE>PdfAction</CODE>
+ * @param llx the lower left x corner of the activation area
+ * @param lly the lower left y corner of the activation area
+ * @param urx the upper right x corner of the activation area
+ * @param ury the upper right y corner of the activation area
+ */
+ public void setAction(PdfAction action, float llx, float lly, float urx, float ury) {
+ pdf.setAction(action, llx, lly, urx, ury);
+ }
+
+ /** Outputs a <CODE>String</CODE> directly to the content.
+ * @param s the <CODE>String</CODE>
+ */
+ public void setLiteral(String s) {
+ content.append(s);
+ }
+
+ /** Outputs a <CODE>char</CODE> directly to the content.
+ * @param c the <CODE>char</CODE>
+ */
+ public void setLiteral(char c) {
+ content.append(c);
+ }
+
+ /** Outputs a <CODE>float</CODE> directly to the content.
+ * @param n the <CODE>float</CODE>
+ */
+ public void setLiteral(float n) {
+ content.append(n);
+ }
+
+ /** Throws an error if it is a pattern.
+ * @param t the object to check
+ */
+ void checkNoPattern(PdfTemplate t) {
+ if (t.getType() == PdfTemplate.TYPE_PATTERN)
+ throw new RuntimeException("Invalid use of a pattern. A template was expected.");
+ }
+
+ /**
+ * Draws a TextField.
+ * @param llx
+ * @param lly
+ * @param urx
+ * @param ury
+ * @param on
+ */
+ public void drawRadioField(float llx, float lly, float urx, float ury, boolean on) {
+ if (llx > urx) { float x = llx; llx = urx; urx = x; }
+ if (lly > ury) { float y = lly; lly = ury; ury = y; }
+ // silver circle
+ setLineWidth(1);
+ setLineCap(1);
+ setColorStroke(new Color(0xC0, 0xC0, 0xC0));
+ arc(llx + 1f, lly + 1f, urx - 1f, ury - 1f, 0f, 360f);
+ stroke();
+ // gray circle-segment
+ setLineWidth(1);
+ setLineCap(1);
+ setColorStroke(new Color(0xA0, 0xA0, 0xA0));
+ arc(llx + 0.5f, lly + 0.5f, urx - 0.5f, ury - 0.5f, 45, 180);
+ stroke();
+ // black circle-segment
+ setLineWidth(1);
+ setLineCap(1);
+ setColorStroke(new Color(0x00, 0x00, 0x00));
+ arc(llx + 1.5f, lly + 1.5f, urx - 1.5f, ury - 1.5f, 45, 180);
+ stroke();
+ if (on) {
+ // gray circle
+ setLineWidth(1);
+ setLineCap(1);
+ setColorFill(new Color(0x00, 0x00, 0x00));
+ arc(llx + 4f, lly + 4f, urx - 4f, ury - 4f, 0, 360);
+ fill();
+ }
+ }
+
+ /**
+ * Draws a TextField.
+ * @param llx
+ * @param lly
+ * @param urx
+ * @param ury
+ */
+ public void drawTextField(float llx, float lly, float urx, float ury) {
+ if (llx > urx) { float x = llx; llx = urx; urx = x; }
+ if (lly > ury) { float y = lly; lly = ury; ury = y; }
+ // silver rectangle not filled
+ setColorStroke(new Color(0xC0, 0xC0, 0xC0));
+ setLineWidth(1);
+ setLineCap(0);
+ rectangle(llx, lly, urx - llx, ury - lly);
+ stroke();
+ // white rectangle filled
+ setLineWidth(1);
+ setLineCap(0);
+ setColorFill(new Color(0xFF, 0xFF, 0xFF));
+ rectangle(llx + 0.5f, lly + 0.5f, urx - llx - 1f, ury -lly - 1f);
+ fill();
+ // silver lines
+ setColorStroke(new Color(0xC0, 0xC0, 0xC0));
+ setLineWidth(1);
+ setLineCap(0);
+ moveTo(llx + 1f, lly + 1.5f);
+ lineTo(urx - 1.5f, lly + 1.5f);
+ lineTo(urx - 1.5f, ury - 1f);
+ stroke();
+ // gray lines
+ setColorStroke(new Color(0xA0, 0xA0, 0xA0));
+ setLineWidth(1);
+ setLineCap(0);
+ moveTo(llx + 1f, lly + 1);
+ lineTo(llx + 1f, ury - 1f);
+ lineTo(urx - 1f, ury - 1f);
+ stroke();
+ // black lines
+ setColorStroke(new Color(0x00, 0x00, 0x00));
+ setLineWidth(1);
+ setLineCap(0);
+ moveTo(llx + 2f, lly + 2f);
+ lineTo(llx + 2f, ury - 2f);
+ lineTo(urx - 2f, ury - 2f);
+ stroke();
+ }
+
+ /**
+ * Draws a button.
+ * @param llx
+ * @param lly
+ * @param urx
+ * @param ury
+ * @param text
+ * @param bf
+ * @param size
+ */
+ public void drawButton(float llx, float lly, float urx, float ury, String text, BaseFont bf, float size) {
+ if (llx > urx) { float x = llx; llx = urx; urx = x; }
+ if (lly > ury) { float y = lly; lly = ury; ury = y; }
+ // black rectangle not filled
+ setColorStroke(new Color(0x00, 0x00, 0x00));
+ setLineWidth(1);
+ setLineCap(0);
+ rectangle(llx, lly, urx - llx, ury - lly);
+ stroke();
+ // silver rectangle filled
+ setLineWidth(1);
+ setLineCap(0);
+ setColorFill(new Color(0xC0, 0xC0, 0xC0));
+ rectangle(llx + 0.5f, lly + 0.5f, urx - llx - 1f, ury -lly - 1f);
+ fill();
+ // white lines
+ setColorStroke(new Color(0xFF, 0xFF, 0xFF));
+ setLineWidth(1);
+ setLineCap(0);
+ moveTo(llx + 1f, lly + 1f);
+ lineTo(llx + 1f, ury - 1f);
+ lineTo(urx - 1f, ury - 1f);
+ stroke();
+ // dark grey lines
+ setColorStroke(new Color(0xA0, 0xA0, 0xA0));
+ setLineWidth(1);
+ setLineCap(0);
+ moveTo(llx + 1f, lly + 1f);
+ lineTo(urx - 1f, lly + 1f);
+ lineTo(urx - 1f, ury - 1f);
+ stroke();
+ // text
+ resetRGBColorFill();
+ beginText();
+ setFontAndSize(bf, size);
+ showTextAligned(PdfContentByte.ALIGN_CENTER, text, llx + (urx - llx) / 2, lly + (ury - lly - size) / 2, 0);
+ endText();
+ }
+
+ /** Gets a <CODE>Graphics2D</CODE> to write on. The graphics
+ * are translated to PDF commands as shapes. No PDF fonts will appear.
+ * @param width the width of the panel
+ * @param height the height of the panel
+ * @return a <CODE>Graphics2D</CODE>
+ */
+ public java.awt.Graphics2D createGraphicsShapes(float width, float height) {
+ return new PdfGraphics2D(this, width, height, null, true, false, 0);
+ }
+
+ /** Gets a <CODE>Graphics2D</CODE> to print on. The graphics
+ * are translated to PDF commands as shapes. No PDF fonts will appear.
+ * @param width the width of the panel
+ * @param height the height of the panel
+ * @param printerJob a printer job
+ * @return a <CODE>Graphics2D</CODE>
+ */
+ public java.awt.Graphics2D createPrinterGraphicsShapes(float width, float height, PrinterJob printerJob) {
+ return new PdfPrinterGraphics2D(this, width, height, null, true, false, 0, printerJob);
+ }
+
+ /** Gets a <CODE>Graphics2D</CODE> to write on. The graphics
+ * are translated to PDF commands.
+ * @param width the width of the panel
+ * @param height the height of the panel
+ * @return a <CODE>Graphics2D</CODE>
+ */
+ public java.awt.Graphics2D createGraphics(float width, float height) {
+ return new PdfGraphics2D(this, width, height, null, false, false, 0);
+ }
+
+ /** Gets a <CODE>Graphics2D</CODE> to print on. The graphics
+ * are translated to PDF commands.
+ * @param width the width of the panel
+ * @param height the height of the panel
+ * @param printerJob
+ * @return a <CODE>Graphics2D</CODE>
+ */
+ public java.awt.Graphics2D createPrinterGraphics(float width, float height, PrinterJob printerJob) {
+ return new PdfPrinterGraphics2D(this, width, height, null, false, false, 0, printerJob);
+ }
+
+ /** Gets a <CODE>Graphics2D</CODE> to write on. The graphics
+ * are translated to PDF commands.
+ * @param width the width of the panel
+ * @param height the height of the panel
+ * @param convertImagesToJPEG
+ * @param quality
+ * @return a <CODE>Graphics2D</CODE>
+ */
+ public java.awt.Graphics2D createGraphics(float width, float height, boolean convertImagesToJPEG, float quality) {
+ return new PdfGraphics2D(this, width, height, null, false, convertImagesToJPEG, quality);
+ }
+
+ /** Gets a <CODE>Graphics2D</CODE> to print on. The graphics
+ * are translated to PDF commands.
+ * @param width the width of the panel
+ * @param height the height of the panel
+ * @param convertImagesToJPEG
+ * @param quality
+ * @param printerJob
+ * @return a <CODE>Graphics2D</CODE>
+ */
+ public java.awt.Graphics2D createPrinterGraphics(float width, float height, boolean convertImagesToJPEG, float quality, PrinterJob printerJob) {
+ return new PdfPrinterGraphics2D(this, width, height, null, false, convertImagesToJPEG, quality, printerJob);
+ }
+
+ /** Gets a <CODE>Graphics2D</CODE> to print on. The graphics
+ * are translated to PDF commands.
+ * @param width
+ * @param height
+ * @param convertImagesToJPEG
+ * @param quality
+ * @return A Graphics2D object
+ */
+ public java.awt.Graphics2D createGraphicsShapes(float width, float height, boolean convertImagesToJPEG, float quality) {
+ return new PdfGraphics2D(this, width, height, null, true, convertImagesToJPEG, quality);
+ }
+
+ /** Gets a <CODE>Graphics2D</CODE> to print on. The graphics
+ * are translated to PDF commands.
+ * @param width
+ * @param height
+ * @param convertImagesToJPEG
+ * @param quality
+ * @param printerJob
+ * @return a Graphics2D object
+ */
+ public java.awt.Graphics2D createPrinterGraphicsShapes(float width, float height, boolean convertImagesToJPEG, float quality, PrinterJob printerJob) {
+ return new PdfPrinterGraphics2D(this, width, height, null, true, convertImagesToJPEG, quality, printerJob);
+ }
+
+ /** Gets a <CODE>Graphics2D</CODE> to write on. The graphics
+ * are translated to PDF commands.
+ * @param width the width of the panel
+ * @param height the height of the panel
+ * @param fontMapper the mapping from awt fonts to <CODE>BaseFont</CODE>
+ * @return a <CODE>Graphics2D</CODE>
+ */
+ public java.awt.Graphics2D createGraphics(float width, float height, FontMapper fontMapper) {
+ return new PdfGraphics2D(this, width, height, fontMapper, false, false, 0);
+ }
+
+ /** Gets a <CODE>Graphics2D</CODE> to print on. The graphics
+ * are translated to PDF commands.
+ * @param width the width of the panel
+ * @param height the height of the panel
+ * @param fontMapper the mapping from awt fonts to <CODE>BaseFont</CODE>
+ * @param printerJob a printer job
+ * @return a <CODE>Graphics2D</CODE>
+ */
+ public java.awt.Graphics2D createPrinterGraphics(float width, float height, FontMapper fontMapper, PrinterJob printerJob) {
+ return new PdfPrinterGraphics2D(this, width, height, fontMapper, false, false, 0, printerJob);
+ }
+
+ /** Gets a <CODE>Graphics2D</CODE> to write on. The graphics
+ * are translated to PDF commands.
+ * @param width the width of the panel
+ * @param height the height of the panel
+ * @param fontMapper the mapping from awt fonts to <CODE>BaseFont</CODE>
+ * @param convertImagesToJPEG converts awt images to jpeg before inserting in pdf
+ * @param quality the quality of the jpeg
+ * @return a <CODE>Graphics2D</CODE>
+ */
+ public java.awt.Graphics2D createGraphics(float width, float height, FontMapper fontMapper, boolean convertImagesToJPEG, float quality) {
+ return new PdfGraphics2D(this, width, height, fontMapper, false, convertImagesToJPEG, quality);
+ }
+
+ /** Gets a <CODE>Graphics2D</CODE> to print on. The graphics
+ * are translated to PDF commands.
+ * @param width the width of the panel
+ * @param height the height of the panel
+ * @param fontMapper the mapping from awt fonts to <CODE>BaseFont</CODE>
+ * @param convertImagesToJPEG converts awt images to jpeg before inserting in pdf
+ * @param quality the quality of the jpeg
+ * @param printerJob a printer job
+ * @return a <CODE>Graphics2D</CODE>
+ */
+ public java.awt.Graphics2D createPrinterGraphics(float width, float height, FontMapper fontMapper, boolean convertImagesToJPEG, float quality, PrinterJob printerJob) {
+ return new PdfPrinterGraphics2D(this, width, height, fontMapper, false, convertImagesToJPEG, quality, printerJob);
+ }
+
+ PageResources getPageResources() {
+ return pdf.getPageResources();
+ }
+
+ /** Sets the graphic state
+ * @param gstate the graphic state
+ */
+ public void setGState(PdfGState gstate) {
+ PdfObject obj[] = writer.addSimpleExtGState(gstate);
+ PageResources prs = getPageResources();
+ PdfName name = prs.addExtGState((PdfName)obj[0], (PdfIndirectReference)obj[1]);
+ content.append(name.getBytes()).append(" gs").append_i(separator);
+ }
+
+ /**
+ * Begins a graphic block whose visibility is controled by the <CODE>layer</CODE>.
+ * Blocks can be nested. Each block must be terminated by an {@link #endLayer()}.<p>
+ * Note that nested layers with {@link PdfLayer#addChild(PdfLayer)} only require a single
+ * call to this method and a single call to {@link #endLayer()}; all the nesting control
+ * is built in.
+ * @param layer the layer
+ */
+ public void beginLayer(PdfOCG layer) {
+ if ((layer instanceof PdfLayer) && ((PdfLayer)layer).getTitle() != null)
+ throw new IllegalArgumentException("A title is not a layer");
+ if (layerDepth == null)
+ layerDepth = new ArrayList();
+ if (layer instanceof PdfLayerMembership) {
+ layerDepth.add(new Integer(1));
+ beginLayer2(layer);
+ return;
+ }
+ int n = 0;
+ PdfLayer la = (PdfLayer)layer;
+ while (la != null) {
+ if (la.getTitle() == null) {
+ beginLayer2(la);
+ ++n;
+ }
+ la = la.getParent();
+ }
+ layerDepth.add(new Integer(n));
+ }
+
+ private void beginLayer2(PdfOCG layer) {
+ PdfName name = (PdfName)writer.addSimpleProperty(layer, layer.getRef())[0];
+ PageResources prs = getPageResources();
+ name = prs.addProperty(name, layer.getRef());
+ content.append("/OC ").append(name.getBytes()).append(" BDC").append_i(separator);
+ }
+
+ /**
+ * Ends a layer controled graphic block. It will end the most recent open block.
+ */
+ public void endLayer() {
+ int n = 1;
+ if (layerDepth != null && layerDepth.size() > 0) {
+ n = ((Integer)layerDepth.get(layerDepth.size() - 1)).intValue();
+ layerDepth.remove(layerDepth.size() - 1);
+ }
+ while (n-- > 0)
+ content.append("EMC").append_i(separator);
+ }
+
+ /** Concatenates a transformation to the current transformation
+ * matrix.
+ * @param af the transformation
+ */
+ public void transform(AffineTransform af) {
+ double arr[] = new double[6];
+ af.getMatrix(arr);
+ content.append(arr[0]).append(' ').append(arr[1]).append(' ').append(arr[2]).append(' ');
+ content.append(arr[3]).append(' ').append(arr[4]).append(' ').append(arr[5]).append(" cm").append_i(separator);
+ }
+
+ void addAnnotation(PdfAnnotation annot) {
+ writer.addAnnotation(annot);
+ }
+
+ /**
+ * Sets the default colorspace.
+ * @param name the name of the colorspace. It can be <CODE>PdfName.DEFAULTGRAY</CODE>, <CODE>PdfName.DEFAULTRGB</CODE>
+ * or <CODE>PdfName.DEFAULTCMYK</CODE>
+ * @param obj the colorspace. A <CODE>null</CODE> or <CODE>PdfNull</CODE> removes any colorspace with the same name
+ */
+ public void setDefaultColorspace(PdfName name, PdfObject obj) {
+ PageResources prs = getPageResources();
+ prs.addDefaultColor(name, obj);
+ }
+
+ /**
+ * Begins a marked content sequence. This sequence will be tagged with the structure <CODE>struc</CODE>.
+ * The same structure can be used several times to connect text that belongs to the same logical segment
+ * but is in a different location, like the same paragraph crossing to another page, for example.
+ * @param struc the tagging structure
+ */
+ public void beginMarkedContentSequence(PdfStructureElement struc) {
+ PdfObject obj = struc.get(PdfName.K);
+ int mark = pdf.getMarkPoint();
+ if (obj != null) {
+ PdfArray ar = null;
+ if (obj.isNumber()) {
+ ar = new PdfArray();
+ ar.add(obj);
+ struc.put(PdfName.K, ar);
+ }
+ else if (obj.isArray()) {
+ ar = (PdfArray)obj;
+ if (!((PdfObject)ar.getArrayList().get(0)).isNumber())
+ throw new IllegalArgumentException("The structure has kids.");
+ }
+ else
+ throw new IllegalArgumentException("Unknown object at /K " + obj.getClass().toString());
+ PdfDictionary dic = new PdfDictionary(PdfName.MCR);
+ dic.put(PdfName.PG, writer.getCurrentPage());
+ dic.put(PdfName.MCID, new PdfNumber(mark));
+ ar.add(dic);
+ struc.setPageMark(writer.getPageNumber() - 1, -1);
+ }
+ else {
+ struc.setPageMark(writer.getPageNumber() - 1, mark);
+ struc.put(PdfName.PG, writer.getCurrentPage());
+ }
+ pdf.incMarkPoint();
+ content.append(struc.get(PdfName.S).getBytes()).append(" <</MCID ").append(mark).append(">> BDC").append_i(separator);
+ }
+
+ /**
+ * Ends a marked content sequence
+ */
+ public void endMarkedContentSequence() {
+ content.append("EMC").append_i(separator);
+ }
+
+ /**
+ * Begins a marked content sequence. If property is <CODE>null</CODE> the mark will be of the type
+ * <CODE>BMC</CODE> otherwise it will be <CODE>BDC</CODE>.
+ * @param tag the tag
+ * @param property the property
+ * @param inline <CODE>true</CODE> to include the property in the content or <CODE>false</CODE>
+ * to include the property in the resource dictionary with the possibility of reusing
+ */
+ public void beginMarkedContentSequence(PdfName tag, PdfDictionary property, boolean inline) {
+ if (property == null) {
+ content.append(tag.getBytes()).append(" BMC").append_i(separator);
+ return;
+ }
+ content.append(tag.getBytes()).append(' ');
+ if (inline)
+ try {
+ property.toPdf(writer, content);
+ }
+ catch (Exception e) {
+ throw new ExceptionConverter(e);
+ }
+ else {
+ PdfObject[] objs;
+ if (writer.propertyExists(property))
+ objs = writer.addSimpleProperty(property, null);
+ else
+ objs = writer.addSimpleProperty(property, writer.getPdfIndirectReference());
+ PdfName name = (PdfName)objs[0];
+ PageResources prs = getPageResources();
+ name = prs.addProperty(name, (PdfIndirectReference)objs[1]);
+ content.append(name.getBytes());
+ }
+ content.append(" BDC").append_i(separator);
+ }
+
+ /**
+ * This is just a shorthand to <CODE>beginMarkedContentSequence(tag, null, false)</CODE>.
+ * @param tag the tag
+ */
+ public void beginMarkedContentSequence(PdfName tag) {
+ beginMarkedContentSequence(tag, null, false);
+ }
+}
diff --git a/src/main/java/com/lowagie/text/pdf/PdfContentParser.java b/src/main/java/com/lowagie/text/pdf/PdfContentParser.java
new file mode 100644
index 0000000..af731bc
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/PdfContentParser.java
@@ -0,0 +1,204 @@
+/*
+ * $Id: PdfContentParser.java,v 1.4 2006/05/27 11:11:54 psoares33 Exp $
+ *
+ * Copyright 2005 by Paulo Soares.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf;
+
+import java.io.IOException;
+import java.util.ArrayList;
+/**
+ * Parses the page or template content.
+ * @author Paulo Soares (psoares@consiste.pt)
+ */
+public class PdfContentParser {
+
+ /**
+ * Commands have this type.
+ */
+ public static final int COMMAND_TYPE = 200;
+ /**
+ * Holds value of property tokeniser.
+ */
+ private PRTokeniser tokeniser;
+
+ /**
+ * Creates a new instance of PdfContentParser
+ * @param tokeniser the tokeniser with the content
+ */
+ public PdfContentParser(PRTokeniser tokeniser) {
+ this.tokeniser = tokeniser;
+ }
+
+ /**
+ * Parses a single command from the content. Each command is output as an array of arguments
+ * having the command itself as the last element. The returned array will be empty if the
+ * end of content was reached.
+ * @param ls an <CODE>ArrayList</CODE> to use. It will be cleared before using. If it's
+ * <CODE>null</CODE> will create a new <CODE>ArrayList</CODE>
+ * @return the same <CODE>ArrayList</CODE> given as argument or a new one
+ * @throws IOException on error
+ */
+ public ArrayList parse(ArrayList ls) throws IOException {
+ if (ls == null)
+ ls = new ArrayList();
+ else
+ ls.clear();
+ PdfObject ob = null;
+ while ((ob = readPRObject()) != null) {
+ ls.add(ob);
+ if (ob.type() == COMMAND_TYPE)
+ break;
+ }
+ return ls;
+ }
+
+ /**
+ * Gets the tokeniser.
+ * @return the tokeniser.
+ */
+ public PRTokeniser getTokeniser() {
+ return this.tokeniser;
+ }
+
+ /**
+ * Sets the tokeniser.
+ * @param tokeniser the tokeniser
+ */
+ public void setTokeniser(PRTokeniser tokeniser) {
+ this.tokeniser = tokeniser;
+ }
+
+ /**
+ * Reads a dictionary. The tokeniser must be positioned past the "&lt;&lt;" token.
+ * @return the dictionary
+ * @throws IOException on error
+ */
+ public PdfDictionary readDictionary() throws IOException {
+ PdfDictionary dic = new PdfDictionary();
+ while (true) {
+ if (!nextValidToken())
+ throw new IOException("Unexpected end of file.");;
+ if (tokeniser.getTokenType() == PRTokeniser.TK_END_DIC)
+ break;
+ if (tokeniser.getTokenType() != PRTokeniser.TK_NAME)
+ throw new IOException("Dictionary key is not a name.");
+ PdfName name = new PdfName(tokeniser.getStringValue(), false);
+ PdfObject obj = readPRObject();
+ int type = obj.type();
+ if (-type == PRTokeniser.TK_END_DIC)
+ throw new IOException("Unexpected '>>'");
+ if (-type == PRTokeniser.TK_END_ARRAY)
+ throw new IOException("Unexpected ']'");
+ dic.put(name, obj);
+ }
+ return dic;
+ }
+
+ /**
+ * Reads an array. The tokeniser must be positioned past the "[" token.
+ * @return an array
+ * @throws IOException on error
+ */
+ public PdfArray readArray() throws IOException {
+ PdfArray array = new PdfArray();
+ while (true) {
+ PdfObject obj = readPRObject();
+ int type = obj.type();
+ if (-type == PRTokeniser.TK_END_ARRAY)
+ break;
+ if (-type == PRTokeniser.TK_END_DIC)
+ throw new IOException("Unexpected '>>'");
+ array.add(obj);
+ }
+ return array;
+ }
+
+ /**
+ * Reads a pdf object.
+ * @return the pdf object
+ * @throws IOException on error
+ */
+ public PdfObject readPRObject() throws IOException {
+ if (!nextValidToken())
+ return null;
+ int type = tokeniser.getTokenType();
+ switch (type) {
+ case PRTokeniser.TK_START_DIC: {
+ PdfDictionary dic = readDictionary();
+ return dic;
+ }
+ case PRTokeniser.TK_START_ARRAY:
+ return readArray();
+ case PRTokeniser.TK_STRING:
+ PdfString str = new PdfString(tokeniser.getStringValue(), null).setHexWriting(tokeniser.isHexString());
+ return str;
+ case PRTokeniser.TK_NAME:
+ return new PdfName(tokeniser.getStringValue(), false);
+ case PRTokeniser.TK_NUMBER:
+ return new PdfNumber(tokeniser.getStringValue());
+ case PRTokeniser.TK_OTHER:
+ return new PdfLiteral(COMMAND_TYPE, tokeniser.getStringValue());
+ default:
+ return new PdfLiteral(-type, tokeniser.getStringValue());
+ }
+ }
+
+ /**
+ * Reads the next token skipping over the comments.
+ * @return <CODE>true</CODE> if a token was read, <CODE>false</CODE> if the end of content was reached
+ * @throws IOException on error
+ */
+ public boolean nextValidToken() throws IOException {
+ while (tokeniser.nextToken()) {
+ if (tokeniser.getTokenType() == PRTokeniser.TK_COMMENT)
+ continue;
+ return true;
+ }
+ return false;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/pdf/PdfContents.java b/src/main/java/com/lowagie/text/pdf/PdfContents.java
new file mode 100644
index 0000000..786da2f
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/PdfContents.java
@@ -0,0 +1,147 @@
+/*
+ * $Id: PdfContents.java,v 1.58 2005/05/04 14:31:50 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 1999, 2000, 2001, 2002 Bruno Lowagie
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf;
+
+import com.lowagie.text.DocWriter;
+import com.lowagie.text.Document;
+import com.lowagie.text.Rectangle;
+import java.io.ByteArrayOutputStream;
+import java.io.OutputStream;
+import java.util.zip.DeflaterOutputStream;
+
+/**
+ * <CODE>PdfContents</CODE> is a <CODE>PdfStream</CODE> containing the contents (text + graphics) of a <CODE>PdfPage</CODE>.
+ */
+
+class PdfContents extends PdfStream {
+
+ static final byte SAVESTATE[] = DocWriter.getISOBytes("q\n");
+ static final byte RESTORESTATE[] = DocWriter.getISOBytes("Q\n");
+ static final byte ROTATE90[] = DocWriter.getISOBytes("0 1 -1 0 ");
+ static final byte ROTATE180[] = DocWriter.getISOBytes("-1 0 0 -1 ");
+ static final byte ROTATE270[] = DocWriter.getISOBytes("0 -1 1 0 ");
+ static final byte ROTATEFINAL[] = DocWriter.getISOBytes(" cm\n");
+ // constructor
+
+/**
+ * Constructs a <CODE>PdfContents</CODE>-object, containing text and general graphics.
+ *
+ * @param under the direct content that is under all others
+ * @param content the graphics in a page
+ * @param text the text in a page
+ * @param secondContent the direct content that is over all others
+ * @throws BadPdfFormatException on error
+ */
+
+ PdfContents(PdfContentByte under, PdfContentByte content, PdfContentByte text, PdfContentByte secondContent, Rectangle page) throws BadPdfFormatException {
+ super();
+ try {
+ OutputStream out = null;
+ streamBytes = new ByteArrayOutputStream();
+ if (Document.compress)
+ {
+ compressed = true;
+ out = new DeflaterOutputStream(streamBytes);
+ }
+ else
+ out = streamBytes;
+ int rotation = page.getRotation();
+ switch (rotation) {
+ case 90:
+ out.write(ROTATE90);
+ out.write(DocWriter.getISOBytes(ByteBuffer.formatDouble(page.top())));
+ out.write(' ');
+ out.write('0');
+ out.write(ROTATEFINAL);
+ break;
+ case 180:
+ out.write(ROTATE180);
+ out.write(DocWriter.getISOBytes(ByteBuffer.formatDouble(page.right())));
+ out.write(' ');
+ out.write(DocWriter.getISOBytes(ByteBuffer.formatDouble(page.top())));
+ out.write(ROTATEFINAL);
+ break;
+ case 270:
+ out.write(ROTATE270);
+ out.write('0');
+ out.write(' ');
+ out.write(DocWriter.getISOBytes(ByteBuffer.formatDouble(page.right())));
+ out.write(ROTATEFINAL);
+ break;
+ }
+ if (under.size() > 0) {
+ out.write(SAVESTATE);
+ under.getInternalBuffer().writeTo(out);
+ out.write(RESTORESTATE);
+ }
+ if (content.size() > 0) {
+ out.write(SAVESTATE);
+ content.getInternalBuffer().writeTo(out);
+ out.write(RESTORESTATE);
+ }
+ if (text != null) {
+ out.write(SAVESTATE);
+ text.getInternalBuffer().writeTo(out);
+ out.write(RESTORESTATE);
+ }
+ if (secondContent.size() > 0) {
+ secondContent.getInternalBuffer().writeTo(out);
+ }
+ out.close();
+ }
+ catch (Exception e) {
+ throw new BadPdfFormatException(e.getMessage());
+ }
+ put(PdfName.LENGTH, new PdfNumber(streamBytes.size()));
+ if (compressed)
+ put(PdfName.FILTER, PdfName.FLATEDECODE);
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/pdf/PdfCopy.java b/src/main/java/com/lowagie/text/pdf/PdfCopy.java
new file mode 100644
index 0000000..0dcdc70
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/PdfCopy.java
@@ -0,0 +1,474 @@
+/*
+ * $Id: PdfCopy.java,v 1.42 2006/05/06 14:19:51 psoares33 Exp $
+ * $Name: $
+ *
+ * Copyright 1999, 2000, 2001, 2002 Bruno Lowagie
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * This module by Mark Thompson. Copyright (C) 2002 Mark Thompson
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+package com.lowagie.text.pdf;
+
+import java.util.HashMap;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Iterator;
+import java.io.*;
+import com.lowagie.text.ExceptionConverter;
+import com.lowagie.text.Document;
+import com.lowagie.text.DocumentException;
+
+/**
+ * Make copies of PDF documents. Documents can be edited after reading and
+ * before writing them out.
+ * @author Mark Thompson
+ */
+
+public class PdfCopy extends PdfWriter {
+ /**
+ * This class holds information about indirect references, since they are
+ * renumbered by iText.
+ */
+ static class IndirectReferences {
+ PdfIndirectReference theRef;
+ boolean hasCopied;
+ IndirectReferences(PdfIndirectReference ref) {
+ theRef = ref;
+ hasCopied = false;
+ }
+ void setCopied() { hasCopied = true; }
+ boolean getCopied() { return hasCopied; }
+ PdfIndirectReference getRef() { return theRef; }
+ };
+ protected HashMap indirects;
+ protected HashMap indirectMap;
+ protected int currentObjectNum = 1;
+ protected PdfReader reader;
+ protected PdfIndirectReference acroForm;
+ protected PdfIndirectReference topPageParent;
+ protected ArrayList pageNumbersToRefs = new ArrayList();
+ protected List newBookmarks;
+
+ /**
+ * A key to allow us to hash indirect references
+ */
+ protected static class RefKey {
+ int num;
+ int gen;
+ RefKey(int num, int gen) {
+ this.num = num;
+ this.gen = gen;
+ }
+ RefKey(PdfIndirectReference ref) {
+ num = ref.getNumber();
+ gen = ref.getGeneration();
+ }
+ RefKey(PRIndirectReference ref) {
+ num = ref.getNumber();
+ gen = ref.getGeneration();
+ }
+ public int hashCode() {
+ return (gen<<16)+num;
+ }
+ public boolean equals(Object o) {
+ RefKey other = (RefKey)o;
+ return this.gen == other.gen && this.num == other.num;
+ }
+ public String toString() {
+ return "" + num + " " + gen;
+ }
+ }
+
+ /**
+ * Constructor
+ * @param document
+ * @param os outputstream
+ */
+ public PdfCopy(Document document, OutputStream os) throws DocumentException {
+ super(new PdfDocument(), os);
+ document.addDocListener(pdf);
+ pdf.addWriter(this);
+ indirectMap = new HashMap();
+ }
+ public void open() {
+ super.open();
+ topPageParent = getPdfIndirectReference();
+ root.setLinearMode(topPageParent);
+ }
+
+ /**
+ * Grabs a page from the input document
+ * @param reader the reader of the document
+ * @param pageNumber which page to get
+ * @return the page
+ */
+ public PdfImportedPage getImportedPage(PdfReader reader, int pageNumber) {
+ if (currentPdfReaderInstance != null) {
+ if (currentPdfReaderInstance.getReader() != reader) {
+ try {
+ currentPdfReaderInstance.getReader().close();
+ currentPdfReaderInstance.getReaderFile().close();
+ }
+ catch (IOException ioe) {
+ // empty on purpose
+ }
+ currentPdfReaderInstance = reader.getPdfReaderInstance(this);
+ }
+ }
+ else {
+ currentPdfReaderInstance = reader.getPdfReaderInstance(this);
+ }
+ return currentPdfReaderInstance.getImportedPage(pageNumber);
+ }
+
+
+ /**
+ * Translate a PRIndirectReference to a PdfIndirectReference
+ * In addition, translates the object numbers, and copies the
+ * referenced object to the output file.
+ * NB: PRIndirectReferences (and PRIndirectObjects) really need to know what
+ * file they came from, because each file has its own namespace. The translation
+ * we do from their namespace to ours is *at best* heuristic, and guaranteed to
+ * fail under some circumstances.
+ */
+ protected PdfIndirectReference copyIndirect(PRIndirectReference in) throws IOException, BadPdfFormatException {
+ PdfIndirectReference theRef;
+ RefKey key = new RefKey(in);
+ IndirectReferences iRef = (IndirectReferences)indirects.get(key);
+ if (iRef != null) {
+ theRef = iRef.getRef();
+ if (iRef.getCopied()) {
+ // System.out.println(">>> Value is " + theRef.toString());
+ return theRef;
+ }
+ // System.out.println(">>> Fill in " + theRef.toString());
+ }
+ else {
+ theRef = body.getPdfIndirectReference();
+ iRef = new IndirectReferences(theRef);
+ indirects.put(key, iRef);
+ }
+ iRef.setCopied();
+ PdfObject obj = copyObject(PdfReader.getPdfObjectRelease(in));
+ addToBody(obj, theRef);
+ return theRef;
+ }
+
+ /**
+ * Translate a PRDictionary to a PdfDictionary. Also translate all of the
+ * objects contained in it.
+ */
+ protected PdfDictionary copyDictionary(PdfDictionary in)
+ throws IOException, BadPdfFormatException {
+ PdfDictionary out = new PdfDictionary();
+ PdfName type = (PdfName)in.get(PdfName.TYPE);
+
+ for (Iterator it = in.getKeys().iterator(); it.hasNext();) {
+ PdfName key = (PdfName)it.next();
+ PdfObject value = in.get(key);
+ // System.out.println("Copy " + key);
+ if (type != null && PdfName.PAGE.equals(type)) {
+ if (key.equals(PdfName.PARENT))
+ out.put(PdfName.PARENT, topPageParent);
+ else if (!key.equals(PdfName.B))
+ out.put(key, copyObject(value));
+ }
+ else
+ out.put(key, copyObject(value));
+ }
+ return out;
+ }
+
+ /**
+ * Translate a PRStream to a PdfStream. The data part copies itself.
+ */
+ protected PdfStream copyStream(PRStream in) throws IOException, BadPdfFormatException {
+ PRStream out = new PRStream(in, null);
+
+ for (Iterator it = in.getKeys().iterator(); it.hasNext();) {
+ PdfName key = (PdfName) it.next();
+ PdfObject value = in.get(key);
+ out.put(key, copyObject(value));
+ }
+
+ return out;
+ }
+
+
+ /**
+ * Translate a PRArray to a PdfArray. Also translate all of the objects contained
+ * in it
+ */
+ protected PdfArray copyArray(PdfArray in) throws IOException, BadPdfFormatException {
+ PdfArray out = new PdfArray();
+
+ for (Iterator i = in.getArrayList().iterator(); i.hasNext();) {
+ PdfObject value = (PdfObject)i.next();
+ out.add(copyObject(value));
+ }
+ return out;
+ }
+
+ /**
+ * Translate a PR-object to a Pdf-object
+ */
+ protected PdfObject copyObject(PdfObject in) throws IOException,BadPdfFormatException {
+ switch (in.type) {
+ case PdfObject.DICTIONARY:
+ // System.out.println("Dictionary: " + in.toString());
+ return copyDictionary((PdfDictionary)in);
+ case PdfObject.INDIRECT:
+ return copyIndirect((PRIndirectReference)in);
+ case PdfObject.ARRAY:
+ return copyArray((PdfArray)in);
+ case PdfObject.NUMBER:
+ case PdfObject.NAME:
+ case PdfObject.STRING:
+ case PdfObject.NULL:
+ case PdfObject.BOOLEAN:
+ return in;
+ case PdfObject.STREAM:
+ return copyStream((PRStream)in);
+ // return in;
+ default:
+ if (in.type < 0) {
+ String lit = ((PdfLiteral)in).toString();
+ if (lit.equals("true") || lit.equals("false")) {
+ return new PdfBoolean(lit);
+ }
+ return new PdfLiteral(lit);
+ }
+ System.out.println("CANNOT COPY type " + in.type);
+ return null;
+ }
+ }
+
+ /**
+ * convenience method. Given an importedpage, set our "globals"
+ */
+ protected int setFromIPage(PdfImportedPage iPage) {
+ int pageNum = iPage.getPageNumber();
+ PdfReaderInstance inst = currentPdfReaderInstance = iPage.getPdfReaderInstance();
+ reader = inst.getReader();
+ setFromReader(reader);
+ return pageNum;
+ }
+
+ /**
+ * convenience method. Given a reader, set our "globals"
+ */
+ protected void setFromReader(PdfReader reader) {
+ this.reader = reader;
+ indirects = (HashMap)indirectMap.get(reader);
+ if (indirects == null) {
+ indirects = new HashMap();
+ indirectMap.put(reader,indirects);
+ PdfDictionary catalog = reader.getCatalog();
+ PRIndirectReference ref = (PRIndirectReference)catalog.get(PdfName.PAGES);
+ indirects.put(new RefKey(ref), new IndirectReferences(topPageParent));
+ ref = null;
+ PdfObject o = catalog.get(PdfName.ACROFORM);
+ if (o == null || o.type() != PdfObject.INDIRECT)
+ return;
+ ref = (PRIndirectReference)o;
+ if (acroForm == null) acroForm = body.getPdfIndirectReference();
+ indirects.put(new RefKey(ref), new IndirectReferences(acroForm));
+ }
+ }
+ /**
+ * Add an imported page to our output
+ * @param iPage an imported page
+ * @throws IOException, BadPdfFormatException
+ */
+ public void addPage(PdfImportedPage iPage) throws IOException, BadPdfFormatException {
+ int pageNum = setFromIPage(iPage);
+
+ PdfDictionary thePage = reader.getPageN(pageNum);
+ PRIndirectReference origRef = reader.getPageOrigRef(pageNum);
+ reader.releasePage(pageNum);
+ RefKey key = new RefKey(origRef);
+ PdfIndirectReference pageRef;
+ IndirectReferences iRef = (IndirectReferences)indirects.get(key);
+ // if we already have an iref for the page (we got here by another link)
+ if (iRef != null) {
+ pageRef = iRef.getRef();
+ }
+ else {
+ pageRef = body.getPdfIndirectReference();
+ iRef = new IndirectReferences(pageRef);
+ indirects.put(key, iRef);
+ }
+ pageReferences.add(pageRef);
+ ++currentPageNumber;
+ if (! iRef.getCopied()) {
+ iRef.setCopied();
+ PdfDictionary newPage = copyDictionary(thePage);
+ newPage.put(PdfName.PARENT, topPageParent);
+ addToBody(newPage, pageRef);
+ }
+ root.addPage(pageRef);
+ pageNumbersToRefs.add(pageRef);
+ }
+
+ public PdfIndirectReference getPageReference(int page) {
+ if (page < 0 || page > pageNumbersToRefs.size())
+ throw new IllegalArgumentException("Invalid page number " + page);
+ return (PdfIndirectReference)pageNumbersToRefs.get(page - 1);
+ }
+
+ /**
+ * Copy the acroform for an input document. Note that you can only have one,
+ * we make no effort to merge them.
+ * @param reader The reader of the input file that is being copied
+ * @throws IOException, BadPdfFormatException
+ */
+ public void copyAcroForm(PdfReader reader) throws IOException, BadPdfFormatException {
+ setFromReader(reader);
+
+ PdfDictionary catalog = reader.getCatalog();
+ PRIndirectReference hisRef = null;
+ PdfObject o = catalog.get(PdfName.ACROFORM);
+ if (o != null && o.type() == PdfObject.INDIRECT)
+ hisRef = (PRIndirectReference)o;
+ if (hisRef == null) return; // bugfix by John Englar
+ RefKey key = new RefKey(hisRef);
+ PdfIndirectReference myRef;
+ IndirectReferences iRef = (IndirectReferences)indirects.get(key);
+ if (iRef != null) {
+ acroForm = myRef = iRef.getRef();
+ }
+ else {
+ acroForm = myRef = body.getPdfIndirectReference();
+ iRef = new IndirectReferences(myRef);
+ indirects.put(key, iRef);
+ }
+ if (! iRef.getCopied()) {
+ iRef.setCopied();
+ PdfDictionary theForm = copyDictionary((PdfDictionary)PdfReader.getPdfObject(hisRef));
+ addToBody(theForm, myRef);
+ }
+ }
+
+ /*
+ * the getCatalog method is part of PdfWriter.
+ * we wrap this so that we can extend it
+ */
+ protected PdfDictionary getCatalog(PdfIndirectReference rootObj) {
+ try {
+ PdfDictionary theCat = ((PdfDocument)document).getCatalog(rootObj);
+ if (acroForm != null) theCat.put(PdfName.ACROFORM, acroForm);
+ if (newBookmarks == null || newBookmarks.size() == 0)
+ return theCat;
+ PdfDictionary top = new PdfDictionary();
+ PdfIndirectReference topRef = getPdfIndirectReference();
+ Object kids[] = SimpleBookmark.iterateOutlines(this, topRef, newBookmarks, false);
+ top.put(PdfName.FIRST, (PdfIndirectReference)kids[0]);
+ top.put(PdfName.LAST, (PdfIndirectReference)kids[1]);
+ top.put(PdfName.COUNT, new PdfNumber(((Integer)kids[2]).intValue()));
+ addToBody(top, topRef);
+ theCat.put(PdfName.OUTLINES, topRef);
+ return theCat;
+ }
+ catch (IOException e) {
+ throw new ExceptionConverter(e);
+ }
+ }
+
+ /**
+ * Sets the bookmarks. The list structure is defined in
+ * <CODE>SimpleBookmark#</CODE>.
+ * @param outlines the bookmarks or <CODE>null</CODE> to remove any
+ */
+ public void setOutlines(List outlines) {
+ newBookmarks = outlines;
+ }
+
+ /**
+ * Signals that the <CODE>Document</CODE> was closed and that no other
+ * <CODE>Elements</CODE> will be added.
+ * <P>
+ * The pages-tree is built and written to the outputstream.
+ * A Catalog is constructed, as well as an Info-object,
+ * the referencetable is composed and everything is written
+ * to the outputstream embedded in a Trailer.
+ */
+
+ public synchronized void close() {
+ if (open) {
+ PdfReaderInstance ri = currentPdfReaderInstance;
+ pdf.close();
+ super.close();
+ if (ri != null) {
+ try {
+ ri.getReader().close();
+ ri.getReaderFile().close();
+ }
+ catch (IOException ioe) {
+ // empty on purpose
+ }
+ }
+ }
+ }
+ PdfIndirectReference add(PdfImage pdfImage, PdfIndirectReference fixedRef) throws PdfException { return null; }
+ public PdfIndirectReference add(PdfOutline outline) { return null; }
+ public void addAnnotation(PdfAnnotation annot) { }
+ PdfIndirectReference add(PdfPage page, PdfContents contents) throws PdfException { return null; }
+
+ public void freeReader(PdfReader reader) throws IOException {
+ indirectMap.remove(reader);
+ if (currentPdfReaderInstance != null) {
+ if (currentPdfReaderInstance.getReader() == reader) {
+ try {
+ currentPdfReaderInstance.getReader().close();
+ currentPdfReaderInstance.getReaderFile().close();
+ }
+ catch (IOException ioe) {
+ // empty on purpose
+ }
+ currentPdfReaderInstance = null;
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/pdf/PdfCopyFields.java b/src/main/java/com/lowagie/text/pdf/PdfCopyFields.java
new file mode 100644
index 0000000..ec08329
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/PdfCopyFields.java
@@ -0,0 +1,208 @@
+/*
+ * Copyright 2004 by Paulo Soares.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+package com.lowagie.text.pdf;
+
+import com.lowagie.text.DocumentException;
+import com.lowagie.text.DocWriter;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.List;
+
+/**
+ * Concatenates PDF documents including form fields. The rules for the form field
+ * concatenation are the same as in Acrobat. All the documents are kept in memory unlike
+ * PdfCopy.
+ * @author Paulo Soares (psoares@consiste.pt)
+ */
+public class PdfCopyFields {
+
+ private PdfCopyFieldsImp fc;
+
+ /**
+ * Creates a new instance.
+ * @param os the output stream
+ * @throws DocumentException on error
+ * @throws IOException on error
+ */
+ public PdfCopyFields(OutputStream os) throws DocumentException, IOException {
+ fc = new PdfCopyFieldsImp(os);
+ }
+
+ /**
+ * Creates a new instance.
+ * @param os the output stream
+ * @param pdfVersion the pdf version the output will have
+ * @throws DocumentException on error
+ * @throws IOException on error
+ */
+ public PdfCopyFields(OutputStream os, char pdfVersion) throws DocumentException, IOException {
+ fc = new PdfCopyFieldsImp(os, pdfVersion);
+ }
+
+ /**
+ * Concatenates a PDF document.
+ * @param reader the PDF document
+ * @throws DocumentException on error
+ */
+ public void addDocument(PdfReader reader) throws DocumentException {
+ fc.addDocument(reader);
+ }
+
+ /**
+ * Concatenates a PDF document selecting the pages to keep. The pages are described as a
+ * <CODE>List</CODE> of <CODE>Integer</CODE>. The page ordering can be changed but
+ * no page repetitions are allowed.
+ * @param reader the PDF document
+ * @param pagesToKeep the pages to keep
+ * @throws DocumentException on error
+ */
+ public void addDocument(PdfReader reader, List pagesToKeep) throws DocumentException {
+ fc.addDocument(reader, pagesToKeep);
+ }
+
+ /**
+ * Concatenates a PDF document selecting the pages to keep. The pages are described as
+ * ranges. The page ordering can be changed but
+ * no page repetitions are allowed.
+ * @param reader the PDF document
+ * @param ranges the comma separated ranges as described in {@link SequenceList}
+ * @throws DocumentException on error
+ */
+ public void addDocument(PdfReader reader, String ranges) throws DocumentException {
+ fc.addDocument(reader, SequenceList.expand(ranges, reader.getNumberOfPages()));
+ }
+
+ /** Sets the encryption options for this document. The userPassword and the
+ * ownerPassword can be null or have zero length. In this case the ownerPassword
+ * is replaced by a random string. The open permissions for the document can be
+ * AllowPrinting, AllowModifyContents, AllowCopy, AllowModifyAnnotations,
+ * AllowFillIn, AllowScreenReaders, AllowAssembly and AllowDegradedPrinting.
+ * The permissions can be combined by ORing them.
+ * @param userPassword the user password. Can be null or empty
+ * @param ownerPassword the owner password. Can be null or empty
+ * @param permissions the user permissions
+ * @param strength128Bits <code>true</code> for 128 bit key length, <code>false</code> for 40 bit key length
+ * @throws DocumentException if the document is already open
+ */
+ public void setEncryption(byte userPassword[], byte ownerPassword[], int permissions, boolean strength128Bits) throws DocumentException {
+ fc.setEncryption(userPassword, ownerPassword, permissions, strength128Bits);
+ }
+
+ /**
+ * Sets the encryption options for this document. The userPassword and the
+ * ownerPassword can be null or have zero length. In this case the ownerPassword
+ * is replaced by a random string. The open permissions for the document can be
+ * AllowPrinting, AllowModifyContents, AllowCopy, AllowModifyAnnotations,
+ * AllowFillIn, AllowScreenReaders, AllowAssembly and AllowDegradedPrinting.
+ * The permissions can be combined by ORing them.
+ * @param strength true for 128 bit key length. false for 40 bit key length
+ * @param userPassword the user password. Can be null or empty
+ * @param ownerPassword the owner password. Can be null or empty
+ * @param permissions the user permissions
+ * @throws DocumentException if the document is already open
+ */
+ public void setEncryption(boolean strength, String userPassword, String ownerPassword, int permissions) throws DocumentException {
+ setEncryption(DocWriter.getISOBytes(userPassword), DocWriter.getISOBytes(ownerPassword), permissions, strength);
+ }
+
+ /**
+ * Closes the output document.
+ */
+ public void close() {
+ fc.close();
+ }
+
+ /**
+ * Opens the document. This is usually not needed as addDocument() will do it
+ * automatically.
+ */
+ public void open() {
+ fc.openDoc();
+ }
+
+ /**
+ * Adds JavaScript to the global document
+ * @param js the JavaScript
+ */
+ public void addJavaScript(String js) {
+ fc.addJavaScript(js, !PdfEncodings.isPdfDocEncoding(js));
+ }
+
+ /**
+ * Sets the bookmarks. The list structure is defined in
+ * <CODE>SimpleBookmark#</CODE>.
+ * @param outlines the bookmarks or <CODE>null</CODE> to remove any
+ */
+ public void setOutlines(List outlines) {
+ fc.setOutlines(outlines);
+ }
+
+ /** Gets the underlying PdfWriter.
+ * @return the underlying PdfWriter
+ */
+ public PdfWriter getWriter() {
+ return fc;
+ }
+
+ /**
+ * Gets the 1.5 compression status.
+ * @return <code>true</code> if the 1.5 compression is on
+ */
+ public boolean isFullCompression() {
+ return fc.isFullCompression();
+ }
+
+ /**
+ * Sets the document's compression to the new 1.5 mode with object streams and xref
+ * streams. It can be set at any time but once set it can't be unset.
+ * <p>
+ * If set before opening the document it will also set the pdf version to 1.5.
+ */
+ public void setFullCompression() {
+ fc.setFullCompression();
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/pdf/PdfCopyFieldsImp.java b/src/main/java/com/lowagie/text/pdf/PdfCopyFieldsImp.java
new file mode 100644
index 0000000..ac9b3d5
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/PdfCopyFieldsImp.java
@@ -0,0 +1,639 @@
+/*
+ * $Id: PdfCopyFieldsImp.java,v 1.13 2006/02/11 09:44:10 psoares33 Exp $
+ * $Name: $
+ * Copyright 2004 by Paulo Soares.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+package com.lowagie.text.pdf;
+
+import com.lowagie.text.ExceptionConverter;
+import com.lowagie.text.DocumentException;
+import com.lowagie.text.Document;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.HashMap;
+import java.util.List;
+import java.util.StringTokenizer;
+
+/**
+ *
+ * @author psoares
+ */
+class PdfCopyFieldsImp extends PdfWriter {
+
+ private static final PdfName iTextTag = new PdfName("_iTextTag_");
+ private static final Integer zero = new Integer(0);
+ ArrayList readers = new ArrayList();
+ HashMap readers2intrefs = new HashMap();
+ HashMap pages2intrefs = new HashMap();
+ HashMap visited = new HashMap();
+ ArrayList fields = new ArrayList();
+ RandomAccessFileOrArray file;
+ HashMap fieldTree = new HashMap();
+ ArrayList pageRefs = new ArrayList();
+ ArrayList pageDics = new ArrayList();
+ PdfDictionary resources = new PdfDictionary();
+ PdfDictionary form;
+ protected List newBookmarks;
+ boolean closing = false;
+ Document nd;
+ private HashMap tabOrder;
+ private ArrayList calculationOrder = new ArrayList();
+ private ArrayList calculationOrderRefs;
+
+ PdfCopyFieldsImp(OutputStream os) throws DocumentException, IOException {
+ this(os, '\0');
+ }
+
+ PdfCopyFieldsImp(OutputStream os, char pdfVersion) throws DocumentException, IOException {
+ super(new PdfDocument(), os);
+ pdf.addWriter(this);
+ if (pdfVersion != 0)
+ super.setPdfVersion(pdfVersion);
+ nd = new Document();
+ nd.addDocListener(pdf);
+ }
+
+ void addDocument(PdfReader reader, List pagesToKeep) throws DocumentException {
+ if (!readers2intrefs.containsKey(reader) && reader.isTampered())
+ throw new DocumentException("The document was reused.");
+ reader = new PdfReader(reader);
+ reader.selectPages(pagesToKeep);
+ if (reader.getNumberOfPages() == 0)
+ return;
+ reader.setTampered(false);
+ addDocument(reader);
+ }
+
+ void addDocument(PdfReader reader) throws DocumentException {
+ openDoc();
+ if (readers2intrefs.containsKey(reader)) {
+ reader = new PdfReader(reader);
+ }
+ else {
+ if (reader.isTampered())
+ throw new DocumentException("The document was reused.");
+ reader.consolidateNamedDestinations();
+ reader.setTampered(true);
+ }
+ reader.shuffleSubsetNames();
+ readers2intrefs.put(reader, new IntHashtable());
+ readers.add(reader);
+ int len = reader.getNumberOfPages();
+ IntHashtable refs = new IntHashtable();
+ for (int p = 1; p <= len; ++p) {
+ refs.put(reader.getPageOrigRef(p).getNumber(), 1);
+ reader.releasePage(p);
+ }
+ pages2intrefs.put(reader, refs);
+ visited.put(reader, new IntHashtable());
+ fields.add(reader.getAcroFields());
+ updateCalculationOrder(reader);
+ }
+
+ private static String getCOName(PdfReader reader, PRIndirectReference ref) {
+ String name = "";
+ while (ref != null) {
+ PdfObject obj = PdfReader.getPdfObject(ref);
+ if (obj == null || obj.type() != PdfObject.DICTIONARY)
+ break;
+ PdfDictionary dic = (PdfDictionary)obj;
+ PdfString t = (PdfString)PdfReader.getPdfObject(dic.get(PdfName.T));
+ if (t != null) {
+ name = t.toUnicodeString()+ "." + name;
+ }
+ ref = (PRIndirectReference)dic.get(PdfName.PARENT);
+ }
+ if (name.endsWith("."))
+ name = name.substring(0, name.length() - 1);
+ return name;
+ }
+
+ private void updateCalculationOrder(PdfReader reader) {
+ PdfDictionary catalog = reader.getCatalog();
+ PdfDictionary acro = (PdfDictionary)PdfReader.getPdfObject(catalog.get(PdfName.ACROFORM));
+ if (acro == null)
+ return;
+ PdfArray co = (PdfArray)PdfReader.getPdfObject(acro.get(PdfName.CO));
+ if (co == null || co.size() == 0)
+ return;
+ AcroFields af = reader.getAcroFields();
+ ArrayList coa = co.getArrayList();
+ for (int k = 0; k < coa.size(); ++k) {
+ PdfObject obj = (PdfObject)coa.get(k);
+ if (obj == null || !obj.isIndirect())
+ continue;
+ String name = getCOName(reader, (PRIndirectReference)obj);
+ if (af.getFieldItem(name) == null)
+ continue;
+ name = "." + name;
+ if (calculationOrder.contains(name))
+ continue;
+ calculationOrder.add(name);
+ }
+ }
+
+ void propagate(PdfObject obj, PdfIndirectReference refo, boolean restricted) throws IOException {
+ if (obj == null)
+ return;
+// if (refo != null)
+// addToBody(obj, refo);
+ if (obj instanceof PdfIndirectReference)
+ return;
+ switch (obj.type()) {
+ case PdfObject.DICTIONARY:
+ case PdfObject.STREAM: {
+ PdfDictionary dic = (PdfDictionary)obj;
+ for (Iterator it = dic.getKeys().iterator(); it.hasNext();) {
+ PdfName key = (PdfName)it.next();
+ if (restricted && (key.equals(PdfName.PARENT) || key.equals(PdfName.KIDS)))
+ continue;
+ PdfObject ob = dic.get(key);
+ if (ob != null && ob.isIndirect()) {
+ PRIndirectReference ind = (PRIndirectReference)ob;
+ if (!setVisited(ind) && !isPage(ind)) {
+ PdfIndirectReference ref = getNewReference(ind);
+ propagate(PdfReader.getPdfObjectRelease(ind), ref, restricted);
+ }
+ }
+ else
+ propagate(ob, null, restricted);
+ }
+ break;
+ }
+ case PdfObject.ARRAY: {
+ ArrayList list = ((PdfArray)obj).getArrayList();
+ //PdfArray arr = new PdfArray();
+ for (Iterator it = list.iterator(); it.hasNext();) {
+ PdfObject ob = (PdfObject)it.next();
+ if (ob != null && ob.isIndirect()) {
+ PRIndirectReference ind = (PRIndirectReference)ob;
+ if (!isVisited(ind) && !isPage(ind)) {
+ PdfIndirectReference ref = getNewReference(ind);
+ propagate(PdfReader.getPdfObjectRelease(ind), ref, restricted);
+ }
+ }
+ else
+ propagate(ob, null, restricted);
+ }
+ break;
+ }
+ case PdfObject.INDIRECT: {
+ throw new RuntimeException("Reference pointing to reference.");
+ }
+ }
+ }
+
+ private void adjustTabOrder(PdfArray annots, PdfIndirectReference ind, PdfNumber nn) {
+ int v = nn.intValue();
+ ArrayList t = (ArrayList)tabOrder.get(annots);
+ if (t == null) {
+ t = new ArrayList();
+ int size = annots.size() - 1;
+ for (int k = 0; k < size; ++k) {
+ t.add(zero);
+ }
+ t.add(new Integer(v));
+ tabOrder.put(annots, t);
+ annots.add(ind);
+ }
+ else {
+ int size = t.size() - 1;
+ for (int k = size; k >= 0; --k) {
+ if (((Integer)t.get(k)).intValue() <= v) {
+ t.add(k + 1, new Integer(v));
+ annots.getArrayList().add(k + 1, ind);
+ size = -2;
+ break;
+ }
+ }
+ if (size != -2) {
+ t.add(0, new Integer(v));
+ annots.getArrayList().add(0, ind);
+ }
+ }
+ }
+
+ protected PdfArray branchForm(HashMap level, PdfIndirectReference parent, String fname) throws IOException {
+ PdfArray arr = new PdfArray();
+ for (Iterator it = level.keySet().iterator(); it.hasNext();) {
+ String name = (String)it.next();
+ Object obj = level.get(name);
+ PdfIndirectReference ind = getPdfIndirectReference();
+ PdfDictionary dic = new PdfDictionary();
+ if (parent != null)
+ dic.put(PdfName.PARENT, parent);
+ dic.put(PdfName.T, new PdfString(name, PdfObject.TEXT_UNICODE));
+ String fname2 = fname + "." + name;
+ int coidx = calculationOrder.indexOf(fname2);
+ if (coidx >= 0)
+ calculationOrderRefs.set(coidx, ind);
+ if (obj instanceof HashMap) {
+ dic.put(PdfName.KIDS, branchForm((HashMap)obj, ind, fname2));
+ arr.add(ind);
+ addToBody(dic, ind);
+ }
+ else {
+ ArrayList list = (ArrayList)obj;
+ dic.mergeDifferent((PdfDictionary)list.get(0));
+ if (list.size() == 3) {
+ dic.mergeDifferent((PdfDictionary)list.get(2));
+ int page = ((Integer)list.get(1)).intValue();
+ PdfDictionary pageDic = (PdfDictionary)pageDics.get(page - 1);
+ PdfArray annots = (PdfArray)PdfReader.getPdfObject(pageDic.get(PdfName.ANNOTS));
+ if (annots == null) {
+ annots = new PdfArray();
+ pageDic.put(PdfName.ANNOTS, annots);
+ }
+ PdfNumber nn = (PdfNumber)dic.get(iTextTag);
+ dic.remove(iTextTag);
+ adjustTabOrder(annots, ind, nn);
+ }
+ else {
+ PdfArray kids = new PdfArray();
+ for (int k = 1; k < list.size(); k += 2) {
+ int page = ((Integer)list.get(k)).intValue();
+ PdfDictionary pageDic = (PdfDictionary)pageDics.get(page - 1);
+ PdfArray annots = (PdfArray)PdfReader.getPdfObject(pageDic.get(PdfName.ANNOTS));
+ if (annots == null) {
+ annots = new PdfArray();
+ pageDic.put(PdfName.ANNOTS, annots);
+ }
+ PdfDictionary widget = new PdfDictionary();
+ widget.merge((PdfDictionary)list.get(k + 1));
+ widget.put(PdfName.PARENT, ind);
+ PdfNumber nn = (PdfNumber)widget.get(iTextTag);
+ widget.remove(iTextTag);
+ PdfIndirectReference wref = addToBody(widget).getIndirectReference();
+ adjustTabOrder(annots, wref, nn);
+ kids.add(wref);
+ propagate(widget, null, false);
+ }
+ dic.put(PdfName.KIDS, kids);
+ }
+ arr.add(ind);
+ addToBody(dic, ind);
+ propagate(dic, null, false);
+ }
+ }
+ return arr;
+ }
+
+ protected void createAcroForms() throws IOException {
+ if (fieldTree.size() == 0)
+ return;
+ form = new PdfDictionary();
+ form.put(PdfName.DR, resources);
+ propagate(resources, null, false);
+ form.put(PdfName.DA, new PdfString("/Helv 0 Tf 0 g "));
+ tabOrder = new HashMap();
+ calculationOrderRefs = new ArrayList(calculationOrder);
+ form.put(PdfName.FIELDS, branchForm(fieldTree, null, ""));
+ PdfArray co = new PdfArray();
+ for (int k = 0; k < calculationOrderRefs.size(); ++k) {
+ Object obj = calculationOrderRefs.get(k);
+ if (obj instanceof PdfIndirectReference)
+ co.add((PdfIndirectReference)obj);
+ }
+ if (co.size() > 0)
+ form.put(PdfName.CO, co);
+ }
+
+ public void close() {
+ if (closing) {
+ super.close();
+ return;
+ }
+ closing = true;
+ try {
+ closeIt();
+ }
+ catch (Exception e) {
+ throw new ExceptionConverter(e);
+ }
+ }
+
+ protected void closeIt() throws DocumentException, IOException {
+ for (int k = 0; k < readers.size(); ++k) {
+ ((PdfReader)readers.get(k)).removeFields();
+ }
+ for (int r = 0; r < readers.size(); ++r) {
+ PdfReader reader = (PdfReader)readers.get(r);
+ for (int page = 1; page <= reader.getNumberOfPages(); ++page) {
+ pageRefs.add(getNewReference(reader.getPageOrigRef(page)));
+ pageDics.add(reader.getPageN(page));
+ }
+ }
+ mergeFields();
+ createAcroForms();
+ for (int r = 0; r < readers.size(); ++r) {
+ PdfReader reader = (PdfReader)readers.get(r);
+ for (int page = 1; page <= reader.getNumberOfPages(); ++page) {
+ PdfDictionary dic = reader.getPageN(page);
+ PdfIndirectReference pageRef = getNewReference(reader.getPageOrigRef(page));
+ PdfIndirectReference parent = root.addPageRef(pageRef);
+ dic.put(PdfName.PARENT, parent);
+ propagate(dic, pageRef, false);
+ }
+ }
+ for (Iterator it = readers2intrefs.keySet().iterator(); it.hasNext();) {
+ PdfReader reader = (PdfReader)it.next();
+ try {
+ file = reader.getSafeFile();
+ file.reOpen();
+ IntHashtable t = (IntHashtable)readers2intrefs.get(reader);
+ int keys[] = t.toOrderedKeys();
+ for (int k = 0; k < keys.length; ++k) {
+ PRIndirectReference ref = new PRIndirectReference(reader, keys[k]);
+ addToBody(PdfReader.getPdfObjectRelease(ref), t.get(keys[k]));
+ }
+ }
+ finally {
+ try {
+ file.close();
+ reader.close();
+ }
+ catch (Exception e) {
+ // empty on purpose
+ }
+ }
+ }
+ pdf.close();
+ }
+
+ void addPageOffsetToField(HashMap fd, int pageOffset) {
+ if (pageOffset == 0)
+ return;
+ for (Iterator it = fd.values().iterator(); it.hasNext();) {
+ ArrayList page = ((AcroFields.Item)it.next()).page;
+ for (int k = 0; k < page.size(); ++k)
+ page.set(k, new Integer(((Integer)page.get(k)).intValue() + pageOffset));
+ }
+ }
+
+ void createWidgets(ArrayList list, AcroFields.Item item) {
+ for (int k = 0; k < item.merged.size(); ++k) {
+ list.add(item.page.get(k));
+ PdfDictionary merged = (PdfDictionary)item.merged.get(k);
+ PdfObject dr = merged.get(PdfName.DR);
+ if (dr != null)
+ PdfFormField.mergeResources(resources, (PdfDictionary)PdfReader.getPdfObject(dr));
+ PdfDictionary widget = new PdfDictionary();
+ for (Iterator it = merged.getKeys().iterator(); it.hasNext();) {
+ PdfName key = (PdfName)it.next();
+ if (widgetKeys.containsKey(key))
+ widget.put(key, merged.get(key));
+ }
+ widget.put(iTextTag, new PdfNumber(((Integer)item.tabOrder.get(k)).intValue() + 1));
+ list.add(widget);
+ }
+ }
+
+ void mergeField(String name, AcroFields.Item item) {
+ HashMap map = fieldTree;
+ StringTokenizer tk = new StringTokenizer(name, ".");
+ if (!tk.hasMoreTokens())
+ return;
+ while (true) {
+ String s = tk.nextToken();
+ Object obj = map.get(s);
+ if (tk.hasMoreTokens()) {
+ if (obj == null) {
+ obj = new HashMap();
+ map.put(s, obj);
+ map = (HashMap)obj;
+ continue;
+ }
+ else if (obj instanceof HashMap)
+ map = (HashMap)obj;
+ else
+ return;
+ }
+ else {
+ if (obj instanceof HashMap)
+ return;
+ PdfDictionary merged = (PdfDictionary)item.merged.get(0);
+ if (obj == null) {
+ PdfDictionary field = new PdfDictionary();
+ for (Iterator it = merged.getKeys().iterator(); it.hasNext();) {
+ PdfName key = (PdfName)it.next();
+ if (fieldKeys.containsKey(key))
+ field.put(key, merged.get(key));
+ }
+ ArrayList list = new ArrayList();
+ list.add(field);
+ createWidgets(list, item);
+ map.put(s, list);
+ }
+ else {
+ ArrayList list = (ArrayList)obj;
+ PdfDictionary field = (PdfDictionary)list.get(0);
+ PdfName type1 = (PdfName)field.get(PdfName.FT);
+ PdfName type2 = (PdfName)merged.get(PdfName.FT);
+ if (type1 == null || !type1.equals(type2))
+ return;
+ int flag1 = 0;
+ PdfObject f1 = field.get(PdfName.FF);
+ if (f1 != null && f1.isNumber())
+ flag1 = ((PdfNumber)f1).intValue();
+ int flag2 = 0;
+ PdfObject f2 = merged.get(PdfName.FF);
+ if (f2 != null && f2.isNumber())
+ flag2 = ((PdfNumber)f2).intValue();
+ if (type1.equals(PdfName.BTN)) {
+ if (((flag1 ^ flag2) & PdfFormField.FF_PUSHBUTTON) != 0)
+ return;
+ if ((flag1 & PdfFormField.FF_PUSHBUTTON) == 0 && ((flag1 ^ flag2) & PdfFormField.FF_RADIO) != 0)
+ return;
+ }
+ else if (type1.equals(PdfName.CH)) {
+ if (((flag1 ^ flag2) & PdfFormField.FF_COMBO) != 0)
+ return;
+ }
+ createWidgets(list, item);
+ }
+ return;
+ }
+ }
+ }
+
+ void mergeWithMaster(HashMap fd) {
+ for (Iterator it = fd.keySet().iterator(); it.hasNext();) {
+ String name = (String)it.next();
+ mergeField(name, (AcroFields.Item)fd.get(name));
+ }
+ }
+
+ void mergeFields() {
+ int pageOffset = 0;
+ for (int k = 0; k < fields.size(); ++k) {
+ HashMap fd = ((AcroFields)fields.get(k)).getFields();
+ addPageOffsetToField(fd, pageOffset);
+ mergeWithMaster(fd);
+ pageOffset += ((PdfReader)readers.get(k)).getNumberOfPages();
+ }
+ }
+
+ public PdfIndirectReference getPageReference(int page) {
+ return (PdfIndirectReference)pageRefs.get(page - 1);
+ }
+
+ protected PdfDictionary getCatalog(PdfIndirectReference rootObj) {
+ try {
+ PdfDictionary cat = ((PdfDocument)document).getCatalog(rootObj);
+ if (form != null) {
+ PdfIndirectReference ref = addToBody(form).getIndirectReference();
+ cat.put(PdfName.ACROFORM, ref);
+ }
+ if (newBookmarks == null || newBookmarks.size() == 0)
+ return cat;
+ PdfDictionary top = new PdfDictionary();
+ PdfIndirectReference topRef = getPdfIndirectReference();
+ Object kids[] = SimpleBookmark.iterateOutlines(this, topRef, newBookmarks, false);
+ top.put(PdfName.FIRST, (PdfIndirectReference)kids[0]);
+ top.put(PdfName.LAST, (PdfIndirectReference)kids[1]);
+ top.put(PdfName.COUNT, new PdfNumber(((Integer)kids[2]).intValue()));
+ addToBody(top, topRef);
+ cat.put(PdfName.OUTLINES, topRef);
+ return cat;
+ }
+ catch (IOException e) {
+ throw new ExceptionConverter(e);
+ }
+ }
+
+ protected PdfIndirectReference getNewReference(PRIndirectReference ref) {
+ return new PdfIndirectReference(0, getNewObjectNumber(ref.getReader(), ref.getNumber(), 0));
+ }
+
+ protected int getNewObjectNumber(PdfReader reader, int number, int generation) {
+ IntHashtable refs = (IntHashtable)readers2intrefs.get(reader);
+ int n = refs.get(number);
+ if (n == 0) {
+ n = getIndirectReferenceNumber();
+ refs.put(number, n);
+ }
+ return n;
+ }
+
+ protected boolean isVisited(PdfReader reader, int number, int generation) {
+ IntHashtable refs = (IntHashtable)readers2intrefs.get(reader);
+ return refs.containsKey(number);
+ }
+
+ protected boolean isVisited(PRIndirectReference ref) {
+ IntHashtable refs = (IntHashtable)visited.get(ref.getReader());
+ return refs.containsKey(ref.getNumber());
+ }
+
+ protected boolean setVisited(PRIndirectReference ref) {
+ IntHashtable refs = (IntHashtable)visited.get(ref.getReader());
+ return (refs.put(ref.getNumber(), 1) != 0);
+ }
+
+ protected boolean isPage(PRIndirectReference ref) {
+ IntHashtable refs = (IntHashtable)pages2intrefs.get(ref.getReader());
+ return refs.containsKey(ref.getNumber());
+ }
+
+ RandomAccessFileOrArray getReaderFile(PdfReader reader) {
+ return file;
+ }
+
+ /**
+ * Sets the bookmarks. The list structure is defined in
+ * <CODE>SimpleBookmark#</CODE>.
+ * @param outlines the bookmarks or <CODE>null</CODE> to remove any
+ */
+ public void setOutlines(List outlines) {
+ newBookmarks = outlines;
+ }
+
+ public void openDoc() {
+ if (!nd.isOpen())
+ nd.open();
+ }
+
+ protected static final HashMap widgetKeys = new HashMap();
+ protected static final HashMap fieldKeys = new HashMap();
+ static {
+ Integer one = new Integer(1);
+ widgetKeys.put(PdfName.SUBTYPE, one);
+ widgetKeys.put(PdfName.CONTENTS, one);
+ widgetKeys.put(PdfName.RECT, one);
+ widgetKeys.put(PdfName.NM, one);
+ widgetKeys.put(PdfName.M, one);
+ widgetKeys.put(PdfName.F, one);
+ widgetKeys.put(PdfName.BS, one);
+ widgetKeys.put(PdfName.BORDER, one);
+ widgetKeys.put(PdfName.AP, one);
+ widgetKeys.put(PdfName.AS, one);
+ widgetKeys.put(PdfName.C, one);
+ widgetKeys.put(PdfName.A, one);
+ widgetKeys.put(PdfName.STRUCTPARENT, one);
+ widgetKeys.put(PdfName.OC, one);
+ widgetKeys.put(PdfName.H, one);
+ widgetKeys.put(PdfName.MK, one);
+ widgetKeys.put(PdfName.DA, one);
+ widgetKeys.put(PdfName.Q, one);
+ fieldKeys.put(PdfName.AA, one);
+ fieldKeys.put(PdfName.FT, one);
+ fieldKeys.put(PdfName.TU, one);
+ fieldKeys.put(PdfName.TM, one);
+ fieldKeys.put(PdfName.FF, one);
+ fieldKeys.put(PdfName.V, one);
+ fieldKeys.put(PdfName.DV, one);
+ fieldKeys.put(PdfName.DS, one);
+ fieldKeys.put(PdfName.RV, one);
+ fieldKeys.put(PdfName.OPT, one);
+ fieldKeys.put(PdfName.MAXLEN, one);
+ fieldKeys.put(PdfName.TI, one);
+ fieldKeys.put(PdfName.I, one);
+ fieldKeys.put(PdfName.LOCK, one);
+ fieldKeys.put(PdfName.SV, one);
+ }
+}
diff --git a/src/main/java/com/lowagie/text/pdf/PdfDashPattern.java b/src/main/java/com/lowagie/text/pdf/PdfDashPattern.java
new file mode 100644
index 0000000..f5f00f9
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/PdfDashPattern.java
@@ -0,0 +1,144 @@
+/*
+ * $Id: PdfDashPattern.java,v 1.57 2005/05/04 14:33:09 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 1999, 2000, 2001, 2002 Bruno Lowagie
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf;
+
+import java.io.IOException;
+import java.io.OutputStream;
+
+/**
+ * A <CODE>PdfDashPattern</CODE> defines a dash pattern as described in
+ * the PDF Reference Manual version 1.3 p 325 (section 8.4.3).
+ *
+ * @see PdfArray
+ */
+
+public class PdfDashPattern extends PdfArray {
+
+ // membervariables
+
+/** This is the length of a dash. */
+ private float dash = -1;
+
+/** This is the length of a gap. */
+ private float gap = -1;
+
+/** This is the phase. */
+ private float phase = -1;
+
+ // constructors
+
+/**
+ * Constructs a new <CODE>PdfDashPattern</CODE>.
+ */
+
+ public PdfDashPattern() {
+ super();
+ }
+
+/**
+ * Constructs a new <CODE>PdfDashPattern</CODE>.
+ */
+
+ public PdfDashPattern(float dash) {
+ super(new PdfNumber(dash));
+ this.dash = dash;
+ }
+
+/**
+ * Constructs a new <CODE>PdfDashPattern</CODE>.
+ */
+
+ public PdfDashPattern(float dash, float gap) {
+ super(new PdfNumber(dash));
+ add(new PdfNumber(gap));
+ this.dash = dash;
+ this.gap = gap;
+ }
+
+/**
+ * Constructs a new <CODE>PdfDashPattern</CODE>.
+ */
+
+ public PdfDashPattern(float dash, float gap, float phase) {
+ super(new PdfNumber(dash));
+ add(new PdfNumber(gap));
+ this.dash = dash;
+ this.gap = gap;
+ this.phase = phase;
+ }
+
+ public void add(float n) {
+ add(new PdfNumber(n));
+ }
+
+/**
+ * Returns the PDF representation of this <CODE>PdfArray</CODE>.
+ *
+ * @return an array of <CODE>byte</CODE>s
+ */
+
+ public void toPdf(PdfWriter writer, OutputStream os) throws IOException {
+ os.write('[');
+
+ if (dash >= 0) {
+ new PdfNumber(dash).toPdf(writer, os);
+ if (gap >= 0) {
+ os.write(' ');
+ new PdfNumber(gap).toPdf(writer, os);
+ }
+ }
+ os.write(']');
+ if (phase >=0) {
+ os.write(' ');
+ new PdfNumber(phase).toPdf(writer, os);
+ }
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/pdf/PdfDate.java b/src/main/java/com/lowagie/text/pdf/PdfDate.java
new file mode 100644
index 0000000..5c26880
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/PdfDate.java
@@ -0,0 +1,210 @@
+/*
+ * $Id: PdfDate.java,v 1.63 2005/09/04 16:20:01 psoares33 Exp $
+ * $Name: $
+ *
+ * Copyright 1999, 2000, 2001, 2002 Bruno Lowagie
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf;
+
+import java.text.SimpleDateFormat;
+import java.util.GregorianCalendar;
+import java.util.Calendar;
+import java.util.SimpleTimeZone;
+
+/**
+ * <CODE>PdfDate</CODE> is the PDF date object.
+ * <P>
+ * PDF defines a standard date format. The PDF date format closely follows the format
+ * defined by the international standard ASN.1 (Abstract Syntax Notation One, defined
+ * in CCITT X.208 or ISO/IEC 8824). A date is a <CODE>PdfString</CODE> of the form:
+ * <P><BLOCKQUOTE>
+ * (D: YYYYMMDDHHmmSSOHH'mm')
+ * </BLOCKQUOTE><P>
+ * This object is described in the 'Portable Document Format Reference Manual version 1.3'
+ * section 7.2 (page 183-184)
+ *
+ * @see PdfString
+ * @see java.util.GregorianCalendar
+ */
+
+public class PdfDate extends PdfString {
+
+ private static final int dateSpace[] = {Calendar.YEAR, 4, 0, Calendar.MONTH, 2, -1, Calendar.DAY_OF_MONTH, 2, 0,
+ Calendar.HOUR_OF_DAY, 2, 0, Calendar.MINUTE, 2, 0, Calendar.SECOND, 2, 0};
+
+ // constructors
+
+/**
+ * Constructs a <CODE>PdfDate</CODE>-object.
+ *
+ * @param d the date that has to be turned into a <CODE>PdfDate</CODE>-object
+ */
+
+ public PdfDate(Calendar d) {
+ super();
+ StringBuffer date = new StringBuffer("D:");
+ date.append(setLength(d.get(Calendar.YEAR), 4));
+ date.append(setLength(d.get(Calendar.MONTH) + 1, 2));
+ date.append(setLength(d.get(Calendar.DATE), 2));
+ date.append(setLength(d.get(Calendar.HOUR_OF_DAY), 2));
+ date.append(setLength(d.get(Calendar.MINUTE), 2));
+ date.append(setLength(d.get(Calendar.SECOND), 2));
+ int timezone = (d.get(Calendar.ZONE_OFFSET) + d.get(Calendar.DST_OFFSET)) / (60 * 60 * 1000);
+ if (timezone == 0) {
+ date.append("Z");
+ }
+ else if (timezone < 0) {
+ date.append("-");
+ timezone = -timezone;
+ }
+ else {
+ date.append("+");
+ }
+ if (timezone != 0) {
+ date.append(setLength(timezone, 2)).append("'");
+ int zone = Math.abs((d.get(Calendar.ZONE_OFFSET) + d.get(Calendar.DST_OFFSET)) / (60 * 1000)) - (timezone * 60);
+ date.append(setLength(zone, 2)).append("'");
+ }
+ value = date.toString();
+ }
+
+/**
+ * Constructs a <CODE>PdfDate</CODE>-object, representing the current day and time.
+ */
+
+ public PdfDate() {
+ this(new GregorianCalendar());
+ }
+
+/**
+ * Adds a number of leading zeros to a given <CODE>String</CODE> in order to get a <CODE>String</CODE>
+ * of a certain length.
+ *
+ * @param i a given number
+ * @param length the length of the resulting <CODE>String</CODE>
+ * @return the resulting <CODE>String</CODE>
+ */
+
+ private String setLength(int i, int length) { // 1.3-1.4 problem fixed by Finn Bock
+ StringBuffer tmp = new StringBuffer();
+ tmp.append(i);
+ while (tmp.length() < length) {
+ tmp.insert(0, "0");
+ }
+ tmp.setLength(length);
+ return tmp.toString();
+ }
+
+ /**
+ * Gives the W3C format of the PdfDate.
+ * @return a formatted date
+ */
+ public String getW3CDate() {
+ return getW3CDate(value);
+ }
+
+ /**
+ * Gives the W3C format of the PdfDate.
+ * @param d
+ * @return a formatted date
+ */
+ public static String getW3CDate(String d) {
+ SimpleDateFormat w3c = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
+ Calendar c = decode(d);
+ return w3c.format(c.getTime());
+ }
+
+ /**
+ * Converts a PDF string representing a date into a Calendar.
+ * @param s the PDF string representing a date
+ * @return a <CODE>Calendar</CODE> representing the date or <CODE>null</CODE> if the string
+ * was not a date
+ */
+ public static Calendar decode(String s) {
+ try {
+ if (s.startsWith("D:"))
+ s = s.substring(2);
+ GregorianCalendar calendar;
+ int slen = s.length();
+ int idx = s.indexOf('Z');
+ if (idx >= 0) {
+ slen = idx;
+ calendar = new GregorianCalendar(new SimpleTimeZone(0, "ZPDF"));
+ }
+ else {
+ int sign = 1;
+ idx = s.indexOf('+');
+ if (idx < 0) {
+ idx = s.indexOf('-');
+ if (idx >= 0)
+ sign = -1;
+ }
+ if (idx < 0)
+ calendar = new GregorianCalendar();
+ else {
+ int offset = Integer.parseInt(s.substring(idx + 1, idx + 3)) * 60;
+ if (idx + 5 < s.length())
+ offset += Integer.parseInt(s.substring(idx + 4, idx + 6));
+ calendar = new GregorianCalendar(new SimpleTimeZone(offset * sign * 60000, "ZPDF"));
+ slen = idx;
+ }
+ }
+ calendar.clear();
+ idx = 0;
+ for (int k = 0; k < dateSpace.length; k += 3) {
+ if (idx >= slen)
+ break;
+ calendar.set(dateSpace[k], Integer.parseInt(s.substring(idx, idx + dateSpace[k + 1])) + dateSpace[k + 2]);
+ idx += dateSpace[k + 1];
+ }
+ return calendar;
+ }
+ catch (Exception e) {
+ return null;
+ }
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/pdf/PdfDestination.java b/src/main/java/com/lowagie/text/pdf/PdfDestination.java
new file mode 100644
index 0000000..6ab6598
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/PdfDestination.java
@@ -0,0 +1,221 @@
+/*
+ * $Id: PdfDestination.java,v 1.54 2005/05/04 14:33:11 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 1999, 2000, 2001, 2002 Bruno Lowagie
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf;
+
+/**
+ * A <CODE>PdfColor</CODE> defines a Color (it's a <CODE>PdfArray</CODE> containing 3 values).
+ *
+ * @see PdfDictionary
+ */
+
+public class PdfDestination extends PdfArray {
+
+ // public static final member-variables
+
+/** This is a possible destination type */
+ public static final int XYZ = 0;
+
+/** This is a possible destination type */
+ public static final int FIT = 1;
+
+/** This is a possible destination type */
+ public static final int FITH = 2;
+
+/** This is a possible destination type */
+ public static final int FITV = 3;
+
+/** This is a possible destination type */
+ public static final int FITR = 4;
+
+/** This is a possible destination type */
+ public static final int FITB = 5;
+
+/** This is a possible destination type */
+ public static final int FITBH = 6;
+
+/** This is a possible destination type */
+ public static final int FITBV = 7;
+
+ // member variables
+
+/** Is the indirect reference to a page already added? */
+ private boolean status = false;
+
+ // constructors
+
+/**
+ * Constructs a new <CODE>PdfDestination</CODE>.
+ * <P>
+ * If <VAR>type</VAR> equals <VAR>FITB</VAR>, the bounding box of a page
+ * will fit the window of the Reader. Otherwise the type will be set to
+ * <VAR>FIT</VAR> so that the entire page will fit to the window.
+ *
+ * @param type The destination type
+ */
+
+ public PdfDestination(int type) {
+ super();
+ if (type == FITB) {
+ add(PdfName.FITB);
+ }
+ else {
+ add(PdfName.FIT);
+ }
+ }
+
+/**
+ * Constructs a new <CODE>PdfDestination</CODE>.
+ * <P>
+ * If <VAR>type</VAR> equals <VAR>FITBH</VAR> / <VAR>FITBV</VAR>,
+ * the width / height of the bounding box of a page will fit the window
+ * of the Reader. The parameter will specify the y / x coordinate of the
+ * top / left edge of the window. If the <VAR>type</VAR> equals <VAR>FITH</VAR>
+ * or <VAR>FITV</VAR> the width / height of the entire page will fit
+ * the window and the parameter will specify the y / x coordinate of the
+ * top / left edge. In all other cases the type will be set to <VAR>FITH</VAR>.
+ *
+ * @param type the destination type
+ * @param parameter a parameter to combined with the destination type
+ */
+
+ public PdfDestination(int type, float parameter) {
+ super(new PdfNumber(parameter));
+ switch(type) {
+ default:
+ addFirst(PdfName.FITH);
+ break;
+ case FITV:
+ addFirst(PdfName.FITV);
+ break;
+ case FITBH:
+ addFirst(PdfName.FITBH);
+ break;
+ case FITBV:
+ addFirst(PdfName.FITBV);
+ }
+ }
+
+/** Constructs a new <CODE>PdfDestination</CODE>.
+ * <P>
+ * Display the page, with the coordinates (left, top) positioned
+ * at the top-left corner of the window and the contents of the page magnified
+ * by the factor zoom. A negative value for any of the parameters left or top, or a
+ * zoom value of 0 specifies that the current value of that parameter is to be retained unchanged.
+ * @param type must be a <VAR>PdfDestination.XYZ</VAR>
+ * @param left the left value. Negative to place a null
+ * @param top the top value. Negative to place a null
+ * @param zoom The zoom factor. A value of 0 keeps the current value
+ */
+
+ public PdfDestination(int type, float left, float top, float zoom) {
+ super(PdfName.XYZ);
+ if (left < 0)
+ add(PdfNull.PDFNULL);
+ else
+ add(new PdfNumber(left));
+ if (top < 0)
+ add(PdfNull.PDFNULL);
+ else
+ add(new PdfNumber(top));
+ add(new PdfNumber(zoom));
+ }
+
+/** Constructs a new <CODE>PdfDestination</CODE>.
+ * <P>
+ * Display the page, with its contents magnified just enough
+ * to fit the rectangle specified by the coordinates left, bottom, right, and top
+ * entirely within the window both horizontally and vertically. If the required
+ * horizontal and vertical magnification factors are different, use the smaller of
+ * the two, centering the rectangle within the window in the other dimension.
+ *
+ * @param type must be PdfDestination.FITR
+ * @param left a parameter
+ * @param bottom a parameter
+ * @param right a parameter
+ * @param top a parameter
+ * @since iText0.38
+ */
+
+ public PdfDestination(int type, float left, float bottom, float right, float top) {
+ super(PdfName.FITR);
+ add(new PdfNumber(left));
+ add(new PdfNumber(bottom));
+ add(new PdfNumber(right));
+ add(new PdfNumber(top));
+ }
+
+ // methods
+
+/**
+ * Checks if an indirect reference to a page has been added.
+ *
+ * @return <CODE>true</CODE> or <CODE>false</CODE>
+ */
+
+ public boolean hasPage() {
+ return status;
+ }
+
+/** Adds the indirect reference of the destination page.
+ *
+ * @param page an indirect reference
+ * @return true if the page reference was added
+ */
+
+ public boolean addPage(PdfIndirectReference page) {
+ if (!status) {
+ addFirst(page);
+ status = true;
+ return true;
+ }
+ return false;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/pdf/PdfDictionary.java b/src/main/java/com/lowagie/text/pdf/PdfDictionary.java
new file mode 100644
index 0000000..f7310e4
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/PdfDictionary.java
@@ -0,0 +1,339 @@
+/*
+ * $Id: PdfDictionary.java,v 1.62 2005/11/29 21:05:02 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 1999, 2000, 2001, 2002 Bruno Lowagie
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * <CODE>PdfDictionary</CODE> is the Pdf dictionary object.
+ * <P>
+ * A dictionary is an associative table containing pairs of objects. The first element
+ * of each pair is called the <I>key</I> and the second element is called the <I>value</I>.
+ * Unlike dictionaries in the PostScript language, a key must be a <CODE>PdfName</CODE>.
+ * A value can be any kind of <CODE>PdfObject</CODE>, including a dictionary. A dictionary is
+ * generally used to collect and tie together the attributes of a complex object, with each
+ * key-value pair specifying the name and value of an attribute.<BR>
+ * A dictionary is represented by two left angle brackets (<<), followed by a sequence of
+ * key-value pairs, followed by two right angle brackets (>>).<BR>
+ * This object is described in the 'Portable Document Format Reference Manual version 1.3'
+ * section 4.7 (page 40-41).
+ * <P>
+ *
+ * @see PdfObject
+ * @see PdfName
+ * @see BadPdfFormatException
+ */
+
+public class PdfDictionary extends PdfObject {
+
+ // static membervariables (types of dictionary's)
+
+/** This is a possible type of dictionary */
+ public static final PdfName FONT = PdfName.FONT;
+
+/** This is a possible type of dictionary */
+ public static final PdfName OUTLINES = PdfName.OUTLINES;
+
+/** This is a possible type of dictionary */
+ public static final PdfName PAGE = PdfName.PAGE;
+
+/** This is a possible type of dictionary */
+ public static final PdfName PAGES = PdfName.PAGES;
+
+/** This is a possible type of dictionary */
+ public static final PdfName CATALOG = PdfName.CATALOG;
+
+ // membervariables
+
+/** This is the type of this dictionary */
+ private PdfName dictionaryType = null;
+
+/** This is the hashmap that contains all the values and keys of the dictionary */
+ protected HashMap hashMap;
+
+ /**
+ * This list preserves the order of the elements.
+ */
+ protected List list;
+
+ // constructors
+
+/**
+ * Constructs an empty <CODE>PdfDictionary</CODE>-object.
+ */
+
+ public PdfDictionary() {
+ super(DICTIONARY);
+ hashMap = new HashMap();
+ list = new ArrayList();
+ }
+
+/**
+ * Constructs a <CODE>PdfDictionary</CODE>-object of a certain type.
+ *
+ * @param type a <CODE>PdfName</CODE>
+ */
+
+ public PdfDictionary(PdfName type) {
+ this();
+ dictionaryType = type;
+ put(PdfName.TYPE, dictionaryType);
+ }
+
+ // methods overriding some methods in PdfObject
+
+/**
+ * Returns the PDF representation of this <CODE>PdfDictionary</CODE>.
+ *
+ * @return an array of <CODE>byte</CODE>
+ */
+
+ public void toPdf(PdfWriter writer, OutputStream os) throws IOException {
+ os.write('<');
+ os.write('<');
+
+ // loop over all the object-pairs in the HashMap
+ PdfName key;
+ PdfObject value;
+ int type = 0;
+ for (Iterator i = list.iterator(); //hashMap.keySet().iterator();
+ i.hasNext(); ) {
+ key = (PdfName) i.next();
+ value = (PdfObject) hashMap.get(key);
+ key.toPdf(writer, os);
+ type = value.type();
+ if (type != PdfObject.ARRAY && type != PdfObject.DICTIONARY && type != PdfObject.NAME && type != PdfObject.STRING)
+ os.write(' ');
+ value.toPdf(writer, os);
+ }
+ os.write('>');
+ os.write('>');
+ }
+
+ // methods concerning the HashMap member value
+
+/**
+ * Adds a <CODE>PdfObject</CODE> and its key to the <CODE>PdfDictionary</CODE>.
+ *
+ * @param key key of the entry (a <CODE>PdfName</CODE>)
+ * @param value value of the entry (a <CODE>PdfObject</CODE>)
+ * @return the previous </CODE>PdfObject</CODE> corresponding with the <VAR>key</VAR>
+ */
+
+ public void put(PdfName key, PdfObject value) {
+ hashMap.put(key, value);
+ list.add(key);
+ }
+
+/**
+ * Adds a <CODE>PdfObject</CODE> and its key to the <CODE>PdfDictionary</CODE>.
+ * If the value is null it does nothing.
+ *
+ * @param key key of the entry (a <CODE>PdfName</CODE>)
+ * @param value value of the entry (a <CODE>PdfObject</CODE>)
+ * @return the previous </CODE>PdfObject</CODE> corresponding with the <VAR>key</VAR>
+ */
+ public void putEx(PdfName key, PdfObject value) {
+ if (value == null)
+ return;
+ hashMap.put(key, value);
+ list.add(key);
+ }
+
+/**
+ * Adds a <CODE>PdfObject</CODE> and its key to the <CODE>PdfDictionary</CODE>.
+ * If the value is null the key is deleted.
+ *
+ * @param key key of the entry (a <CODE>PdfName</CODE>)
+ * @param value value of the entry (a <CODE>PdfObject</CODE>)
+ * @return the previous </CODE>PdfObject</CODE> corresponding with the <VAR>key</VAR>
+ */
+ public void putDel(PdfName key, PdfObject value) {
+ if (value == null) {
+ hashMap.remove(key);
+ list.remove(key);
+ return;
+ }
+ hashMap.put(key, value);
+ list.add(key);
+ }
+
+/**
+ * Removes a <CODE>PdfObject</CODE> and its key from the <CODE>PdfDictionary</CODE>.
+ *
+ * @param key key of the entry (a <CODE>PdfName</CODE>)
+ * @return the previous </CODE>PdfObject</CODE> corresponding with the <VAR>key</VAR>
+ */
+
+ public void remove(PdfName key) {
+ hashMap.remove(key);
+ list.remove(key);
+ }
+
+/**
+ * Gets a <CODE>PdfObject</CODE> with a certain key from the <CODE>PdfDictionary</CODE>.
+ *
+ * @param key key of the entry (a <CODE>PdfName</CODE>)
+ * @return the previous </CODE>PdfObject</CODE> corresponding with the <VAR>key</VAR>
+ */
+
+ public PdfObject get(PdfName key) {
+ return (PdfObject) hashMap.get(key);
+ }
+
+ // methods concerning the type of Dictionary
+
+/**
+ * Checks if a <CODE>PdfDictionary</CODE> is of a certain type.
+ *
+ * @param type a type of dictionary
+ * @return <CODE>true</CODE> of <CODE>false</CODE>
+ *
+ * @deprecated
+ */
+
+ public boolean isDictionaryType(PdfName type) {
+ return dictionaryType.compareTo(type) == 0;
+ }
+
+/**
+ * Checks if a <CODE>Dictionary</CODE> is of the type FONT.
+ *
+ * @return <CODE>true</CODE> if it is, <CODE>false</CODE> if it isn't.
+ */
+
+ public boolean isFont() {
+ return dictionaryType.compareTo(FONT) == 0;
+ }
+
+/**
+ * Checks if a <CODE>Dictionary</CODE> is of the type PAGE.
+ *
+ * @return <CODE>true</CODE> if it is, <CODE>false</CODE> if it isn't.
+ */
+
+ public boolean isPage() {
+ return dictionaryType.compareTo(PAGE) == 0;
+ }
+
+/**
+ * Checks if a <CODE>Dictionary</CODE> is of the type PAGES.
+ *
+ * @return <CODE>true</CODE> if it is, <CODE>false</CODE> if it isn't.
+ */
+
+ public boolean isPages() {
+ return dictionaryType.compareTo(PAGES) == 0;
+ }
+
+/**
+ * Checks if a <CODE>Dictionary</CODE> is of the type CATALOG.
+ *
+ * @return <CODE>true</CODE> if it is, <CODE>false</CODE> if it isn't.
+ */
+
+ public boolean isCatalog() {
+ return dictionaryType.compareTo(CATALOG) == 0;
+ }
+
+/**
+ * Checks if a <CODE>Dictionary</CODE> is of the type OUTLINES.
+ *
+ * @return <CODE>true</CODE> if it is, <CODE>false</CODE> if it isn't.
+ */
+
+ public boolean isOutlineTree() {
+ return dictionaryType.compareTo(OUTLINES) == 0;
+ }
+
+ public void merge(PdfDictionary other) {
+ hashMap.putAll(other.hashMap);
+ list.addAll(other.list);
+ }
+
+ public void mergeDifferent(PdfDictionary other) {
+ for (Iterator i = other.list.iterator(); //other.hashMap.keySet().iterator();
+ i.hasNext();) {
+ Object key = i.next();
+ if (!hashMap.containsKey(key)) {
+ hashMap.put(key, other.hashMap.get(key));
+ list.add(key);
+ }
+ }
+ }
+
+ public Set getKeys() {
+ return hashMap.keySet();
+ }
+
+ public void putAll(PdfDictionary dic) {
+ hashMap.putAll(dic.hashMap);
+ list.addAll(dic.list);
+ }
+
+ public int size() {
+ return hashMap.size();
+ }
+
+ public boolean contains(PdfName key) {
+ return hashMap.containsKey(key);
+ }
+
+ public String toString() {
+ return "Dictionary of type: " + get(PdfName.TYPE);
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/pdf/PdfDocument.java b/src/main/java/com/lowagie/text/pdf/PdfDocument.java
new file mode 100644
index 0000000..cafc637
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/PdfDocument.java
@@ -0,0 +1,3279 @@
+/*
+ * $Name: $
+ * $Id: PdfDocument.java,v 1.229 2006/06/04 22:23:34 psoares33 Exp $
+ *
+ * Copyright 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf;
+
+import java.awt.Color;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeMap;
+
+import com.lowagie.text.Anchor;
+import com.lowagie.text.Annotation;
+import com.lowagie.text.BadElementException;
+import com.lowagie.text.Cell;
+import com.lowagie.text.Chunk;
+import com.lowagie.text.DocListener;
+import com.lowagie.text.Document;
+import com.lowagie.text.DocumentException;
+import com.lowagie.text.Element;
+import com.lowagie.text.ExceptionConverter;
+import com.lowagie.text.Graphic;
+import com.lowagie.text.HeaderFooter;
+import com.lowagie.text.Image;
+import com.lowagie.text.List;
+import com.lowagie.text.ListItem;
+import com.lowagie.text.Meta;
+import com.lowagie.text.Paragraph;
+import com.lowagie.text.Phrase;
+import com.lowagie.text.Rectangle;
+import com.lowagie.text.Section;
+import com.lowagie.text.SimpleTable;
+import com.lowagie.text.StringCompare;
+import com.lowagie.text.Table;
+import com.lowagie.text.Watermark;
+import com.lowagie.text.xml.xmp.XmpWriter;
+
+/**
+ * <CODE>PdfDocument</CODE> is the class that is used by <CODE>PdfWriter</CODE>
+ * to translate a <CODE>Document</CODE> into a PDF with different pages.
+ * <P>
+ * A <CODE>PdfDocument</CODE> always listens to a <CODE>Document</CODE>
+ * and adds the Pdf representation of every <CODE>Element</CODE> that is
+ * added to the <CODE>Document</CODE>.
+ *
+ * @see com.lowagie.text.Document
+ * @see com.lowagie.text.DocListener
+ * @see PdfWriter
+ */
+
+class PdfDocument extends Document implements DocListener {
+
+ /**
+ * <CODE>PdfInfo</CODE> is the PDF InfoDictionary.
+ * <P>
+ * A document's trailer may contain a reference to an Info dictionary that provides information
+ * about the document. This optional dictionary may contain one or more keys, whose values
+ * should be strings.<BR>
+ * This object is described in the 'Portable Document Format Reference Manual version 1.3'
+ * section 6.10 (page 120-121)
+ */
+
+ public static class PdfInfo extends PdfDictionary {
+
+ // constructors
+
+ /**
+ * Construct a <CODE>PdfInfo</CODE>-object.
+ */
+
+ PdfInfo() {
+ super();
+ addProducer();
+ addCreationDate();
+ }
+
+ /**
+ * Constructs a <CODE>PdfInfo</CODE>-object.
+ *
+ * @param author name of the author of the document
+ * @param title title of the document
+ * @param subject subject of the document
+ */
+
+ PdfInfo(String author, String title, String subject) {
+ this();
+ addTitle(title);
+ addSubject(subject);
+ addAuthor(author);
+ }
+
+ /**
+ * Adds the title of the document.
+ *
+ * @param title the title of the document
+ */
+
+ void addTitle(String title) {
+ put(PdfName.TITLE, new PdfString(title, PdfObject.TEXT_UNICODE));
+ }
+
+ /**
+ * Adds the subject to the document.
+ *
+ * @param subject the subject of the document
+ */
+
+ void addSubject(String subject) {
+ put(PdfName.SUBJECT, new PdfString(subject, PdfObject.TEXT_UNICODE));
+ }
+
+ /**
+ * Adds some keywords to the document.
+ *
+ * @param keywords the keywords of the document
+ */
+
+ void addKeywords(String keywords) {
+ put(PdfName.KEYWORDS, new PdfString(keywords, PdfObject.TEXT_UNICODE));
+ }
+
+ /**
+ * Adds the name of the author to the document.
+ *
+ * @param author the name of the author
+ */
+
+ void addAuthor(String author) {
+ put(PdfName.AUTHOR, new PdfString(author, PdfObject.TEXT_UNICODE));
+ }
+
+ /**
+ * Adds the name of the creator to the document.
+ *
+ * @param creator the name of the creator
+ */
+
+ void addCreator(String creator) {
+ put(PdfName.CREATOR, new PdfString(creator, PdfObject.TEXT_UNICODE));
+ }
+
+ /**
+ * Adds the name of the producer to the document.
+ */
+
+ void addProducer() {
+ // This line may only be changed by Bruno Lowagie or Paulo Soares
+ put(PdfName.PRODUCER, new PdfString(getVersion()));
+ // Do not edit the line above!
+ }
+
+ /**
+ * Adds the date of creation to the document.
+ */
+
+ void addCreationDate() {
+ PdfString date = new PdfDate();
+ put(PdfName.CREATIONDATE, date);
+ put(PdfName.MODDATE, date);
+ }
+
+ void addkey(String key, String value) {
+ if (key.equals("Producer") || key.equals("CreationDate"))
+ return;
+ put(new PdfName(key), new PdfString(value, PdfObject.TEXT_UNICODE));
+ }
+ }
+
+ /**
+ * <CODE>PdfCatalog</CODE> is the PDF Catalog-object.
+ * <P>
+ * The Catalog is a dictionary that is the root node of the document. It contains a reference
+ * to the tree of pages contained in the document, a reference to the tree of objects representing
+ * the document's outline, a reference to the document's article threads, and the list of named
+ * destinations. In addition, the Catalog indicates whether the document's outline or thumbnail
+ * page images should be displayed automatically when the document is viewed and wether some location
+ * other than the first page should be shown when the document is opened.<BR>
+ * In this class however, only the reference to the tree of pages is implemented.<BR>
+ * This object is described in the 'Portable Document Format Reference Manual version 1.3'
+ * section 6.2 (page 67-71)
+ */
+
+ static class PdfCatalog extends PdfDictionary {
+
+ PdfWriter writer;
+ // constructors
+
+ /**
+ * Constructs a <CODE>PdfCatalog</CODE>.
+ *
+ * @param pages an indirect reference to the root of the document's Pages tree.
+ * @param writer the writer the catalog applies to
+ */
+
+ PdfCatalog(PdfIndirectReference pages, PdfWriter writer) {
+ super(CATALOG);
+ this.writer = writer;
+ put(PdfName.PAGES, pages);
+ }
+
+ /**
+ * Constructs a <CODE>PdfCatalog</CODE>.
+ *
+ * @param pages an indirect reference to the root of the document's Pages tree.
+ * @param outlines an indirect reference to the outline tree.
+ * @param writer the writer the catalog applies to
+ */
+
+ PdfCatalog(PdfIndirectReference pages, PdfIndirectReference outlines, PdfWriter writer) {
+ super(CATALOG);
+ this.writer = writer;
+ put(PdfName.PAGES, pages);
+ put(PdfName.PAGEMODE, PdfName.USEOUTLINES);
+ put(PdfName.OUTLINES, outlines);
+ }
+
+ /**
+ * Adds the names of the named destinations to the catalog.
+ * @param localDestinations the local destinations
+ * @param documentJavaScript the javascript used in the document
+ * @param writer the writer the catalog applies to
+ */
+ void addNames(TreeMap localDestinations, ArrayList documentJavaScript, HashMap documentFileAttachment, PdfWriter writer) {
+ if (localDestinations.size() == 0 && documentJavaScript.size() == 0 && documentFileAttachment.size() == 0)
+ return;
+ try {
+ PdfDictionary names = new PdfDictionary();
+ if (localDestinations.size() > 0) {
+ PdfArray ar = new PdfArray();
+ for (Iterator i = localDestinations.keySet().iterator(); i.hasNext();) {
+ String name = (String)i.next();
+ Object obj[] = (Object[])localDestinations.get(name);
+ PdfIndirectReference ref = (PdfIndirectReference)obj[1];
+ ar.add(new PdfString(name));
+ ar.add(ref);
+ }
+ PdfDictionary dests = new PdfDictionary();
+ dests.put(PdfName.NAMES, ar);
+ names.put(PdfName.DESTS, writer.addToBody(dests).getIndirectReference());
+ }
+ if (documentJavaScript.size() > 0) {
+ String s[] = new String[documentJavaScript.size()];
+ for (int k = 0; k < s.length; ++k)
+ s[k] = Integer.toHexString(k);
+ Arrays.sort(s, new StringCompare());
+ PdfArray ar = new PdfArray();
+ for (int k = 0; k < s.length; ++k) {
+ ar.add(new PdfString(s[k]));
+ ar.add((PdfIndirectReference)documentJavaScript.get(k));
+ }
+ PdfDictionary js = new PdfDictionary();
+ js.put(PdfName.NAMES, ar);
+ names.put(PdfName.JAVASCRIPT, writer.addToBody(js).getIndirectReference());
+ }
+ if (documentFileAttachment.size() > 0) {
+ names.put(PdfName.EMBEDDEDFILES, writer.addToBody(PdfNameTree.writeTree(documentFileAttachment, writer)).getIndirectReference());
+ }
+ put(PdfName.NAMES, writer.addToBody(names).getIndirectReference());
+ }
+ catch (IOException e) {
+ throw new ExceptionConverter(e);
+ }
+ }
+
+ /** Sets the viewer preferences as the sum of several constants.
+ * @param preferences the viewer preferences
+ * @see PdfWriter#setViewerPreferences
+ */
+
+ void setViewerPreferences(int preferences) {
+ PdfReader.setViewerPreferences(preferences, this);
+ }
+
+ void setOpenAction(PdfAction action) {
+ put(PdfName.OPENACTION, action);
+ }
+
+
+ /** Sets the document level additional actions.
+ * @param actions dictionary of actions
+ */
+ void setAdditionalActions(PdfDictionary actions) {
+ try {
+ put(PdfName.AA, writer.addToBody(actions).getIndirectReference());
+ } catch (Exception e) {
+ new ExceptionConverter(e);
+ }
+ }
+
+
+ void setPageLabels(PdfPageLabels pageLabels) {
+ put(PdfName.PAGELABELS, pageLabels.getDictionary());
+ }
+
+ void setAcroForm(PdfObject fields) {
+ put(PdfName.ACROFORM, fields);
+ }
+ }
+
+ // membervariables
+ private PdfIndirectReference thumb;
+
+ /** The characters to be applied the hanging ponctuation. */
+ static final String hangingPunctuation = ".,;:'";
+
+ /** The <CODE>PdfWriter</CODE>. */
+ private PdfWriter writer;
+
+ /** some meta information about the Document. */
+ private PdfInfo info = new PdfInfo();
+
+ /** Signals that OnOpenDocument should be called. */
+ private boolean firstPageEvent = true;
+
+ /** Signals that onParagraph is valid. */
+ private boolean isParagraph = true;
+
+ // Horizontal line
+
+ /** The line that is currently being written. */
+ private PdfLine line = null;
+
+ /** This represents the current indentation of the PDF Elements on the left side. */
+ private float indentLeft = 0;
+
+ /** This represents the current indentation of the PDF Elements on the right side. */
+ private float indentRight = 0;
+
+ /** This represents the current indentation of the PDF Elements on the left side. */
+ private float listIndentLeft = 0;
+
+ /** This represents the current alignment of the PDF Elements. */
+ private int alignment = Element.ALIGN_LEFT;
+
+ // Vertical lines
+
+ /** This is the PdfContentByte object, containing the text. */
+ private PdfContentByte text;
+
+ /** This is the PdfContentByte object, containing the borders and other Graphics. */
+ private PdfContentByte graphics;
+
+ /** The lines that are written until now. */
+ private ArrayList lines = new ArrayList();
+
+ /** This represents the leading of the lines. */
+ private float leading = 0;
+
+ /** This is the current height of the document. */
+ private float currentHeight = 0;
+
+ /** This represents the current indentation of the PDF Elements on the top side. */
+ private float indentTop = 0;
+
+ /** This represents the current indentation of the PDF Elements on the bottom side. */
+ private float indentBottom = 0;
+
+ /** This checks if the page is empty. */
+ private boolean pageEmpty = true;
+
+ private int textEmptySize;
+ // resources
+
+ /** This is the size of the next page. */
+ protected Rectangle nextPageSize = null;
+
+ /** This is the size of the several boxes of the current Page. */
+ protected HashMap thisBoxSize = new HashMap();
+
+ /** This is the size of the several boxes that will be used in
+ * the next page. */
+ protected HashMap boxSize = new HashMap();
+
+ /** This are the page resources of the current Page. */
+ protected PageResources pageResources;
+
+ // images
+
+ /** This is the image that could not be shown on a previous page. */
+ private Image imageWait = null;
+
+ /** This is the position where the image ends. */
+ private float imageEnd = -1;
+
+ /** This is the indentation caused by an image on the left. */
+ private float imageIndentLeft = 0;
+
+ /** This is the indentation caused by an image on the right. */
+ private float imageIndentRight = 0;
+
+ // annotations and outlines
+
+ /** This is the array containing the references to the annotations. */
+ private ArrayList annotations;
+
+ /** This is an array containg references to some delayed annotations. */
+ private ArrayList delayedAnnotations = new ArrayList();
+
+ /** This is the AcroForm object. */
+ PdfAcroForm acroForm;
+
+ /** This is the root outline of the document. */
+ private PdfOutline rootOutline;
+
+ /** This is the current <CODE>PdfOutline</CODE> in the hierarchy of outlines. */
+ private PdfOutline currentOutline;
+
+ /** The current active <CODE>PdfAction</CODE> when processing an <CODE>Anchor</CODE>. */
+ private PdfAction currentAction = null;
+
+ /**
+ * Stores the destinations keyed by name. Value is
+ * <CODE>Object[]{PdfAction,PdfIndirectReference,PdfDestintion}</CODE>.
+ */
+ private TreeMap localDestinations = new TreeMap(new StringCompare());
+
+ private ArrayList documentJavaScript = new ArrayList();
+
+ private HashMap documentFileAttachment = new HashMap();
+
+ /** these are the viewerpreferences of the document */
+ private int viewerPreferences = 0;
+
+ private String openActionName;
+ private PdfAction openActionAction;
+ private PdfDictionary additionalActions;
+ private PdfPageLabels pageLabels;
+
+ //add by Jin-Hsia Yang
+ private boolean isNewpage = false;
+
+ private float paraIndent = 0;
+ //end add by Jin-Hsia Yang
+
+ /** margin in x direction starting from the left. Will be valid in the next page */
+ protected float nextMarginLeft;
+
+ /** margin in x direction starting from the right. Will be valid in the next page */
+ protected float nextMarginRight;
+
+ /** margin in y direction starting from the top. Will be valid in the next page */
+ protected float nextMarginTop;
+
+ /** margin in y direction starting from the bottom. Will be valid in the next page */
+ protected float nextMarginBottom;
+
+/** The duration of the page */
+ protected int duration=-1; // negative values will indicate no duration
+
+/** The page transition */
+ protected PdfTransition transition=null;
+
+ protected PdfDictionary pageAA = null;
+
+ /** Holds value of property strictImageSequence. */
+ private boolean strictImageSequence = false;
+
+ /** Holds the type of the last element, that has been added to the document. */
+ private int lastElementType = -1;
+
+ private boolean isNewPagePending;
+
+ protected int markPoint;
+
+ // constructors
+
+ /**
+ * Constructs a new PDF document.
+ * @throws DocumentException on error
+ */
+
+ public PdfDocument() throws DocumentException {
+ super();
+ addProducer();
+ addCreationDate();
+ }
+
+ // listener methods
+
+ /**
+ * Adds a <CODE>PdfWriter</CODE> to the <CODE>PdfDocument</CODE>.
+ *
+ * @param writer the <CODE>PdfWriter</CODE> that writes everything
+ * what is added to this document to an outputstream.
+ * @throws DocumentException on error
+ */
+
+ public void addWriter(PdfWriter writer) throws DocumentException {
+ if (this.writer == null) {
+ this.writer = writer;
+ acroForm = new PdfAcroForm(writer);
+ return;
+ }
+ throw new DocumentException("You can only add a writer to a PdfDocument once.");
+ }
+
+ /**
+ * Sets the pagesize.
+ *
+ * @param pageSize the new pagesize
+ * @return <CODE>true</CODE> if the page size was set
+ */
+
+ public boolean setPageSize(Rectangle pageSize) {
+ if (writer != null && writer.isPaused()) {
+ return false;
+ }
+ nextPageSize = new Rectangle(pageSize);
+ return true;
+ }
+
+ /**
+ * Changes the header of this document.
+ *
+ * @param header the new header
+ */
+
+ public void setHeader(HeaderFooter header) {
+ if (writer != null && writer.isPaused()) {
+ return;
+ }
+ super.setHeader(header);
+ }
+
+ /**
+ * Resets the header of this document.
+ */
+
+ public void resetHeader() {
+ if (writer != null && writer.isPaused()) {
+ return;
+ }
+ super.resetHeader();
+ }
+
+ /**
+ * Changes the footer of this document.
+ *
+ * @param footer the new footer
+ */
+
+ public void setFooter(HeaderFooter footer) {
+ if (writer != null && writer.isPaused()) {
+ return;
+ }
+ super.setFooter(footer);
+ }
+
+ /**
+ * Resets the footer of this document.
+ */
+
+ public void resetFooter() {
+ if (writer != null && writer.isPaused()) {
+ return;
+ }
+ super.resetFooter();
+ }
+
+ /**
+ * Sets the page number to 0.
+ */
+
+ public void resetPageCount() {
+ if (writer != null && writer.isPaused()) {
+ return;
+ }
+ super.resetPageCount();
+ }
+
+ /**
+ * Sets the page number.
+ *
+ * @param pageN the new page number
+ */
+
+ public void setPageCount(int pageN) {
+ if (writer != null && writer.isPaused()) {
+ return;
+ }
+ super.setPageCount(pageN);
+ }
+
+ /**
+ * Sets the <CODE>Watermark</CODE>.
+ *
+ * @param watermark the watermark to add
+ * @return <CODE>true</CODE> if the element was added, <CODE>false</CODE> if not.
+ */
+
+ public boolean add(Watermark watermark) {
+ if (writer != null && writer.isPaused()) {
+ return false;
+ }
+ this.watermark = watermark;
+ return true;
+ }
+
+ /**
+ * Removes the <CODE>Watermark</CODE>.
+ */
+
+ public void removeWatermark() {
+ if (writer != null && writer.isPaused()) {
+ return;
+ }
+ this.watermark = null;
+ }
+
+ /**
+ * Sets the margins.
+ *
+ * @param marginLeft the margin on the left
+ * @param marginRight the margin on the right
+ * @param marginTop the margin on the top
+ * @param marginBottom the margin on the bottom
+ * @return a <CODE>boolean</CODE>
+ */
+
+ public boolean setMargins(float marginLeft, float marginRight, float marginTop, float marginBottom) {
+ if (writer != null && writer.isPaused()) {
+ return false;
+ }
+ nextMarginLeft = marginLeft;
+ nextMarginRight = marginRight;
+ nextMarginTop = marginTop;
+ nextMarginBottom = marginBottom;
+ return true;
+ }
+
+ protected PdfArray rotateAnnotations() {
+ PdfArray array = new PdfArray();
+ int rotation = pageSize.getRotation() % 360;
+ int currentPage = writer.getCurrentPageNumber();
+ for (int k = 0; k < annotations.size(); ++k) {
+ PdfAnnotation dic = (PdfAnnotation)annotations.get(k);
+ int page = dic.getPlaceInPage();
+ if (page > currentPage) {
+ delayedAnnotations.add(dic);
+ continue;
+ }
+ if (dic.isForm()) {
+ if (!dic.isUsed()) {
+ HashMap templates = dic.getTemplates();
+ if (templates != null)
+ acroForm.addFieldTemplates(templates);
+ }
+ PdfFormField field = (PdfFormField)dic;
+ if (field.getParent() == null)
+ acroForm.addDocumentField(field.getIndirectReference());
+ }
+ if (dic.isAnnotation()) {
+ array.add(dic.getIndirectReference());
+ if (!dic.isUsed()) {
+ PdfRectangle rect = (PdfRectangle)dic.get(PdfName.RECT);
+ if (rect != null) {
+ switch (rotation) {
+ case 90:
+ dic.put(PdfName.RECT, new PdfRectangle(
+ pageSize.top() - rect.bottom(),
+ rect.left(),
+ pageSize.top() - rect.top(),
+ rect.right()));
+ break;
+ case 180:
+ dic.put(PdfName.RECT, new PdfRectangle(
+ pageSize.right() - rect.left(),
+ pageSize.top() - rect.bottom(),
+ pageSize.right() - rect.right(),
+ pageSize.top() - rect.top()));
+ break;
+ case 270:
+ dic.put(PdfName.RECT, new PdfRectangle(
+ rect.bottom(),
+ pageSize.right() - rect.left(),
+ rect.top(),
+ pageSize.right() - rect.right()));
+ break;
+ }
+ }
+ }
+ }
+ if (!dic.isUsed()) {
+ dic.setUsed();
+ try {
+ writer.addToBody(dic, dic.getIndirectReference());
+ }
+ catch (IOException e) {
+ throw new ExceptionConverter(e);
+ }
+ }
+ }
+ return array;
+ }
+
+ /**
+ * Makes a new page and sends it to the <CODE>PdfWriter</CODE>.
+ *
+ * @return a <CODE>boolean</CODE>
+ * @throws DocumentException on error
+ */
+
+ public boolean newPage() throws DocumentException {
+ lastElementType = -1;
+ //add by Jin-Hsia Yang
+ isNewpage = true;
+ //end add by Jin-Hsia Yang
+ if (writer.getDirectContent().size() == 0 && writer.getDirectContentUnder().size() == 0 && (pageEmpty || (writer != null && writer.isPaused()))) {
+ return false;
+ }
+ PdfPageEvent pageEvent = writer.getPageEvent();
+ if (pageEvent != null)
+ pageEvent.onEndPage(writer, this);
+
+ //Added to inform any listeners that we are moving to a new page (added by David Freels)
+ super.newPage();
+
+ // the following 2 lines were added by Pelikan Stephan
+ imageIndentLeft = 0;
+ imageIndentRight = 0;
+
+ // we flush the arraylist with recently written lines
+ flushLines();
+ // we assemble the resources of this pages
+ pageResources.addDefaultColorDiff(writer.getDefaultColorspace());
+ PdfDictionary resources = pageResources.getResources();
+ // we make a new page and add it to the document
+ if (writer.getPDFXConformance() != PdfWriter.PDFXNONE) {
+ if (thisBoxSize.containsKey("art") && thisBoxSize.containsKey("trim"))
+ throw new PdfXConformanceException("Only one of ArtBox or TrimBox can exist in the page.");
+ if (!thisBoxSize.containsKey("art") && !thisBoxSize.containsKey("trim")) {
+ if (thisBoxSize.containsKey("crop"))
+ thisBoxSize.put("trim", thisBoxSize.get("crop"));
+ else
+ thisBoxSize.put("trim", new PdfRectangle(pageSize, pageSize.getRotation()));
+ }
+ }
+ PdfPage page;
+ int rotation = pageSize.getRotation();
+ page = new PdfPage(new PdfRectangle(pageSize, rotation), thisBoxSize, resources, rotation);
+ // we add tag info
+ if (writer.isTagged())
+ page.put(PdfName.STRUCTPARENTS, new PdfNumber(writer.getCurrentPageNumber() - 1));
+// we add the transitions
+ if (this.transition!=null) {
+ page.put(PdfName.TRANS, this.transition.getTransitionDictionary());
+ transition = null;
+ }
+ if (this.duration>0) {
+ page.put(PdfName.DUR,new PdfNumber(this.duration));
+ duration = 0;
+ }
+ // we add the page object additional actions
+ if (pageAA != null) {
+ try {
+ page.put(PdfName.AA, writer.addToBody(pageAA).getIndirectReference());
+ }
+ catch (IOException ioe) {
+ throw new ExceptionConverter(ioe);
+ }
+ pageAA = null;
+ }
+ // we check if the userunit is defined
+ if (writer.getUserunit() > 0f) {
+ page.put(PdfName.USERUNIT, new PdfNumber(writer.getUserunit()));
+ }
+ // we add the annotations
+ if (annotations.size() > 0) {
+ PdfArray array = rotateAnnotations();
+ if (array.size() != 0)
+ page.put(PdfName.ANNOTS, array);
+ }
+ // we add the thumbs
+ if (thumb != null) {
+ page.put(PdfName.THUMB, thumb);
+ thumb = null;
+ }
+ if (!open || close) {
+ throw new PdfException("The document isn't open.");
+ }
+ if (text.size() > textEmptySize)
+ text.endText();
+ else
+ text = null;
+ writer.add(page, new PdfContents(writer.getDirectContentUnder(), graphics, text, writer.getDirectContent(), pageSize));
+ // we initialize the new page
+ initPage();
+
+ //add by Jin-Hsia Yang
+ isNewpage = false;
+ //end add by Jin-Hsia Yang
+
+ return true;
+ }
+
+ // methods to open and close a document
+
+ /**
+ * Opens the document.
+ * <P>
+ * You have to open the document before you can begin to add content
+ * to the body of the document.
+ */
+
+ public void open() {
+ if (!open) {
+ super.open();
+ writer.open();
+ rootOutline = new PdfOutline(writer);
+ currentOutline = rootOutline;
+ }
+ try {
+ initPage();
+ }
+ catch(DocumentException de) {
+ throw new ExceptionConverter(de);
+ }
+ }
+
+ void outlineTree(PdfOutline outline) throws IOException {
+ outline.setIndirectReference(writer.getPdfIndirectReference());
+ if (outline.parent() != null)
+ outline.put(PdfName.PARENT, outline.parent().indirectReference());
+ ArrayList kids = outline.getKids();
+ int size = kids.size();
+ for (int k = 0; k < size; ++k)
+ outlineTree((PdfOutline)kids.get(k));
+ for (int k = 0; k < size; ++k) {
+ if (k > 0)
+ ((PdfOutline)kids.get(k)).put(PdfName.PREV, ((PdfOutline)kids.get(k - 1)).indirectReference());
+ if (k < size - 1)
+ ((PdfOutline)kids.get(k)).put(PdfName.NEXT, ((PdfOutline)kids.get(k + 1)).indirectReference());
+ }
+ if (size > 0) {
+ outline.put(PdfName.FIRST, ((PdfOutline)kids.get(0)).indirectReference());
+ outline.put(PdfName.LAST, ((PdfOutline)kids.get(size - 1)).indirectReference());
+ }
+ for (int k = 0; k < size; ++k) {
+ PdfOutline kid = (PdfOutline)kids.get(k);
+ writer.addToBody(kid, kid.indirectReference());
+ }
+ }
+
+ void writeOutlines() throws IOException {
+ if (rootOutline.getKids().size() == 0)
+ return;
+ outlineTree(rootOutline);
+ writer.addToBody(rootOutline, rootOutline.indirectReference());
+ }
+
+ void traverseOutlineCount(PdfOutline outline) {
+ ArrayList kids = outline.getKids();
+ PdfOutline parent = outline.parent();
+ if (kids.size() == 0) {
+ if (parent != null) {
+ parent.setCount(parent.getCount() + 1);
+ }
+ }
+ else {
+ for (int k = 0; k < kids.size(); ++k) {
+ traverseOutlineCount((PdfOutline)kids.get(k));
+ }
+ if (parent != null) {
+ if (outline.isOpen()) {
+ parent.setCount(outline.getCount() + parent.getCount() + 1);
+ }
+ else {
+ parent.setCount(parent.getCount() + 1);
+ outline.setCount(-outline.getCount());
+ }
+ }
+ }
+ }
+
+ void calculateOutlineCount() {
+ if (rootOutline.getKids().size() == 0)
+ return;
+ traverseOutlineCount(rootOutline);
+ }
+ /**
+ * Closes the document.
+ * <B>
+ * Once all the content has been written in the body, you have to close
+ * the body. After that nothing can be written to the body anymore.
+ */
+
+ public void close() {
+ if (close) {
+ return;
+ }
+ try {
+ boolean wasImage = (imageWait != null);
+ newPage();
+ if (imageWait != null || wasImage) newPage();
+ if (annotations.size() > 0)
+ throw new RuntimeException(annotations.size() + " annotations had invalid placement pages.");
+ PdfPageEvent pageEvent = writer.getPageEvent();
+ if (pageEvent != null)
+ pageEvent.onCloseDocument(writer, this);
+ super.close();
+
+ writer.addLocalDestinations(localDestinations);
+ calculateOutlineCount();
+ writeOutlines();
+ }
+ catch(Exception e) {
+ throw new ExceptionConverter(e);
+ }
+
+ writer.close();
+ }
+
+ PageResources getPageResources() {
+ return pageResources;
+ }
+
+ /** Adds a <CODE>PdfPTable</CODE> to the document.
+ * @param ptable the <CODE>PdfPTable</CODE> to be added to the document.
+ * @throws DocumentException on error
+ */
+ void addPTable(PdfPTable ptable) throws DocumentException {
+ ColumnText ct = new ColumnText(writer.getDirectContent());
+ if (currentHeight > 0) {
+ Paragraph p = new Paragraph();
+ p.setLeading(0);
+ ct.addElement(p);
+ // if the table prefers to be on a single page, and it wouldn't
+ //fit on the current page, start a new page.
+ if (ptable.getKeepTogether() && !fitsPage(ptable, 0f))
+ newPage();
+ }
+ ct.addElement(ptable);
+ boolean he = ptable.isHeadersInEvent();
+ ptable.setHeadersInEvent(true);
+ int loop = 0;
+ while (true) {
+ ct.setSimpleColumn(indentLeft(), indentBottom(), indentRight(), indentTop() - currentHeight);
+ int status = ct.go();
+ if ((status & ColumnText.NO_MORE_TEXT) != 0) {
+ text.moveText(0, ct.getYLine() - indentTop() + currentHeight);
+ currentHeight = indentTop() - ct.getYLine();
+ break;
+ }
+ if (indentTop() - currentHeight == ct.getYLine())
+ ++loop;
+ else
+ loop = 0;
+ if (loop == 3) {
+ add(new Paragraph("ERROR: Infinite table loop"));
+ break;
+ }
+ newPage();
+ }
+ ptable.setHeadersInEvent(he);
+ }
+
+ /**
+ * Gets a PdfTable object
+ * (contributed by dperezcar@fcc.es)
+ * @param table a high level table object
+ * @param supportRowAdditions
+ * @return returns a PdfTable object
+ * @see PdfWriter#getPdfTable(Table)
+ */
+
+ PdfTable getPdfTable(Table table, boolean supportRowAdditions) {
+ return new PdfTable(table, indentLeft(), indentRight(), indentTop() - currentHeight, supportRowAdditions);
+ }
+
+ /**
+ * @see PdfWriter#breakTableIfDoesntFit(PdfTable)
+ * (contributed by dperezcar@fcc.es)
+ * @param table Table to add
+ * @return true if the table will be broken
+ * @throws DocumentException
+ */
+
+ boolean breakTableIfDoesntFit(PdfTable table) throws DocumentException {
+ table.updateRowAdditions();
+ // Do we have any full page available?
+ if (!table.hasToFitPageTable() && table.bottom() <= indentBottom) {
+ // Then output that page
+ add(table, true);
+ return true;
+ }
+ return false;
+ }
+
+ private static class RenderingContext {
+ int countPageBreaks = 0;
+ float pagetop = -1;
+ float oldHeight = -1;
+
+ PdfContentByte cellGraphics = null;
+
+ float lostTableBottom;
+
+ float maxCellBottom;
+ float maxCellHeight;
+
+ Map rowspanMap;
+ Map pageMap = new HashMap();
+ /**
+ * A PdfPTable
+ */
+ public PdfTable table;
+
+ /**
+ * Consumes the rowspan
+ * @param c
+ * @return a rowspan.
+ */
+ public int consumeRowspan(PdfCell c) {
+ if (c.rowspan() == 1) {
+ return 1;
+ }
+
+ Integer i = (Integer) rowspanMap.get(c);
+ if (i == null) {
+ i = new Integer(c.rowspan());
+ }
+
+ i = new Integer(i.intValue() - 1);
+ rowspanMap.put(c, i);
+
+ if (i.intValue() < 1) {
+ return 1;
+ }
+ return i.intValue();
+ }
+
+ /**
+ * Looks at the current rowspan.
+ * @param c
+ * @return the current rowspan
+ */
+ public int currentRowspan(PdfCell c) {
+ Integer i = (Integer) rowspanMap.get(c);
+ if (i == null) {
+ return c.rowspan();
+ } else {
+ return i.intValue();
+ }
+ }
+
+ public int cellRendered(PdfCell cell, int pageNumber) {
+ Integer i = (Integer) pageMap.get(cell);
+ if (i == null) {
+ i = new Integer(1);
+ } else {
+ i = new Integer(i.intValue() + 1);
+ }
+ pageMap.put(cell, i);
+
+ Integer pageInteger = new Integer(pageNumber);
+ Set set = (Set) pageMap.get(pageInteger);
+
+ if (set == null) {
+ set = new HashSet();
+ pageMap.put(pageInteger, set);
+ }
+
+ set.add(cell);
+
+ return i.intValue();
+ }
+
+ public int numCellRendered(PdfCell cell) {
+ Integer i = (Integer) pageMap.get(cell);
+ if (i == null) {
+ i = new Integer(0);
+ }
+ return i.intValue();
+ }
+
+ public boolean isCellRenderedOnPage(PdfCell cell, int pageNumber) {
+ Integer pageInteger = new Integer(pageNumber);
+ Set set = (Set) pageMap.get(pageInteger);
+
+ if (set != null) {
+ return set.contains(cell);
+ }
+
+ return false;
+ }
+ };
+
+ private void analyzeRow(ArrayList rows, RenderingContext ctx) {
+ ctx.maxCellBottom = indentBottom();
+
+ // determine whether row(index) is in a rowspan
+ int rowIndex = 0;
+
+ ArrayList row = (ArrayList) rows.get(rowIndex);
+ int maxRowspan = 1;
+ Iterator iterator = row.iterator();
+ while (iterator.hasNext()) {
+ PdfCell cell = (PdfCell) iterator.next();
+ maxRowspan = Math.max(ctx.currentRowspan(cell), maxRowspan);
+ }
+ rowIndex += maxRowspan;
+
+ boolean useTop = true;
+ if (rowIndex == rows.size()) {
+ rowIndex = rows.size() - 1;
+ useTop = false;
+ }
+
+ if (rowIndex < 0 || rowIndex >= rows.size()) return;
+
+ row = (ArrayList) rows.get(rowIndex);
+ iterator = row.iterator();
+ while (iterator.hasNext()) {
+ PdfCell cell = (PdfCell) iterator.next();
+ Rectangle cellRect = cell.rectangle(ctx.pagetop, indentBottom());
+ if (useTop) {
+ ctx.maxCellBottom = Math.max(ctx.maxCellBottom, cellRect.top());
+ } else {
+ if (ctx.currentRowspan(cell) == 1) {
+ ctx.maxCellBottom = Math.max(ctx.maxCellBottom, cellRect.bottom());
+ }
+ }
+ }
+ }
+
+ /**
+ * Adds a new table to
+ * @param table Table to add. Rendered rows will be deleted after processing.
+ * @param onlyFirstPage Render only the first full page
+ * @throws DocumentException
+ */
+ private void add(PdfTable table, boolean onlyFirstPage) throws DocumentException {
+ // before every table, we flush all lines
+ flushLines();
+
+ RenderingContext ctx = new RenderingContext();
+ ctx.pagetop = indentTop();
+ ctx.oldHeight = currentHeight;
+ ctx.cellGraphics = new PdfContentByte(writer);
+ ctx.rowspanMap = new HashMap();
+ ctx.table = table;
+
+ // initialisation of parameters
+ PdfCell cell;
+
+ boolean tableHasToFit =
+ table.hasToFitPageTable() ? (table.bottom() < indentBottom() && table.height() < (top() - bottom())) : false;
+ if (pageEmpty)
+ tableHasToFit = false;
+ boolean cellsHaveToFit = table.hasToFitPageCells();
+
+ // drawing the table
+ ArrayList dataCells = table.getCells();
+
+ ArrayList headercells = table.getHeaderCells();
+ // Check if we have removed header cells in a previous call
+ if (headercells.size() > 0 && (dataCells.size() == 0 || dataCells.get(0) != headercells.get(0))) {
+ ArrayList allCells = new ArrayList(dataCells.size()+headercells.size());
+ allCells.addAll(headercells);
+ allCells.addAll(dataCells);
+ dataCells = allCells;
+ }
+
+ ArrayList cells = dataCells;
+ ArrayList rows = extractRows(cells, ctx);
+ boolean isContinue = false;
+ while (!cells.isEmpty()) {
+ // initialisation of some extra parameters;
+ ctx.lostTableBottom = 0;
+
+ // loop over the cells
+ boolean cellsShown = false;
+ int currentGroupNumber = 0;
+ boolean headerChecked = false;
+
+ float headerHeight = 0;
+
+ // draw the cells (line by line)
+ Iterator iterator = rows.iterator();
+
+ boolean atLeastOneFits = false;
+ while (iterator.hasNext()) {
+ ArrayList row = (ArrayList) iterator.next();
+ analyzeRow(rows, ctx);
+ renderCells(ctx, row, table.hasToFitPageCells() & atLeastOneFits);
+
+ if (!mayBeRemoved(row)) {
+ break;
+ }
+ consumeRowspan(row, ctx);
+ iterator.remove();
+ atLeastOneFits = true;
+ }
+
+// compose cells array list for subsequent code
+ cells.clear();
+ Set opt = new HashSet();
+ iterator = rows.iterator();
+ while (iterator.hasNext()) {
+ ArrayList row = (ArrayList) iterator.next();
+
+ Iterator cellIterator = row.iterator();
+ while (cellIterator.hasNext()) {
+ cell = (PdfCell) cellIterator.next();
+
+ if (!opt.contains(cell)) {
+ cells.add(cell);
+ opt.add(cell);
+ }
+ }
+ }
+
+ tableHasToFit = false;
+
+ // we paint the graphics of the table after looping through all the cells
+ Rectangle tablerec = new Rectangle(table);
+ tablerec.setBorder(table.border());
+ tablerec.setBorderWidth(table.borderWidth());
+ tablerec.setBorderColor(table.borderColor());
+ tablerec.setBackgroundColor(table.backgroundColor());
+ PdfContentByte under = writer.getDirectContentUnder();
+ under.rectangle(tablerec.rectangle(top(), indentBottom()));
+ under.add(ctx.cellGraphics);
+ // bugfix by Gerald Fehringer: now again add the border for the table
+ // since it might have been covered by cell backgrounds
+ tablerec.setBackgroundColor(null);
+ tablerec = tablerec.rectangle(top(), indentBottom());
+ tablerec.setBorder(table.border());
+ under.rectangle(tablerec);
+ // end bugfix
+
+ ctx.cellGraphics = new PdfContentByte(null);
+ // if the table continues on the next page
+
+ if (!rows.isEmpty()) {
+ isContinue = true;
+ graphics.setLineWidth(table.borderWidth());
+ if (cellsShown && (table.border() & Rectangle.BOTTOM) == Rectangle.BOTTOM) {
+ // Draw the bottom line
+
+ // the color is set to the color of the element
+ Color tColor = table.borderColor();
+ if (tColor != null) {
+ graphics.setColorStroke(tColor);
+ }
+ graphics.moveTo(table.left(), Math.max(table.bottom(), indentBottom()));
+ graphics.lineTo(table.right(), Math.max(table.bottom(), indentBottom()));
+ graphics.stroke();
+ if (tColor != null) {
+ graphics.resetRGBColorStroke();
+ }
+ }
+
+ // old page
+ pageEmpty = false;
+ float difference = ctx.lostTableBottom;
+
+ // new page
+ newPage();
+
+ ctx.countPageBreaks++;
+
+ // G.F.: if something added in page event i.e. currentHeight > 0
+ float heightCorrection = 0;
+ boolean somethingAdded = false;
+ if (currentHeight > 0) {
+ heightCorrection = 6;
+ currentHeight += heightCorrection;
+ somethingAdded = true;
+ newLine();
+ flushLines();
+ indentTop = currentHeight - leading;
+ currentHeight = 0;
+ }
+ else {
+ flushLines();
+ }
+
+ // this part repeats the table headers (if any)
+ int size = headercells.size();
+ if (size > 0) {
+ // this is the top of the headersection
+ cell = (PdfCell) headercells.get(0);
+ float oldTop = cell.top(0);
+ // loop over all the cells of the table header
+ for (int i = 0; i < size; i++) {
+ cell = (PdfCell) headercells.get(i);
+ // calculation of the new cellpositions
+ cell.setTop(indentTop() - oldTop + cell.top(0));
+ cell.setBottom(indentTop() - oldTop + cell.bottom(0));
+ ctx.pagetop = cell.bottom();
+ // we paint the borders of the cell
+ ctx.cellGraphics.rectangle(cell.rectangle(indentTop(), indentBottom()));
+ // we write the text of the cell
+ ArrayList images = cell.getImages(indentTop(), indentBottom());
+ for (Iterator im = images.iterator(); im.hasNext();) {
+ cellsShown = true;
+ Image image = (Image) im.next();
+ graphics.addImage(image);
+ }
+ lines = cell.getLines(indentTop(), indentBottom());
+ float cellTop = cell.top(indentTop());
+ text.moveText(0, cellTop-heightCorrection);
+ float cellDisplacement = flushLines() - cellTop+heightCorrection;
+ text.moveText(0, cellDisplacement);
+ }
+
+ currentHeight = indentTop() - ctx.pagetop + table.cellspacing();
+ text.moveText(0, ctx.pagetop - indentTop() - currentHeight);
+ }
+ else {
+ if (somethingAdded) {
+ ctx.pagetop = indentTop();
+ text.moveText(0, -table.cellspacing());
+ }
+ }
+ ctx.oldHeight = currentHeight - heightCorrection;
+
+ // calculating the new positions of the table and the cells
+ size = Math.min(cells.size(), table.columns());
+ int i = 0;
+ while (i < size) {
+ cell = (PdfCell) cells.get(i);
+ if (cell.top(-table.cellspacing()) > ctx.lostTableBottom) {
+ float newBottom = ctx.pagetop - difference + cell.bottom();
+ float neededHeight = cell.remainingHeight();
+ if (newBottom > ctx.pagetop - neededHeight) {
+ difference += newBottom - (ctx.pagetop - neededHeight);
+ }
+ }
+ i++;
+ }
+ size = cells.size();
+ table.setTop(indentTop());
+ table.setBottom(ctx.pagetop - difference + table.bottom(table.cellspacing()));
+ for (i = 0; i < size; i++) {
+ cell = (PdfCell) cells.get(i);
+ float newBottom = ctx.pagetop - difference + cell.bottom();
+ float newTop = ctx.pagetop - difference + cell.top(-table.cellspacing());
+ if (newTop > indentTop() - currentHeight) {
+ newTop = indentTop() - currentHeight;
+ }
+
+ cell.setTop(newTop );
+ cell.setBottom(newBottom );
+ }
+ if (onlyFirstPage) {
+ break;
+ }
+ }
+ }
+
+ float tableHeight = table.top() - table.bottom();
+ // bugfix by Adauto Martins when have more than two tables and more than one page
+ // If continuation of table in other page (bug report #1460051)
+ if (isContinue) {
+ currentHeight = tableHeight;
+ text.moveText(0, -(tableHeight - (ctx.oldHeight * 2)));
+ } else {
+ currentHeight = ctx.oldHeight + tableHeight;
+ text.moveText(0, -tableHeight);
+ }
+ // end bugfix
+ pageEmpty = false;
+
+ if (ctx.countPageBreaks > 0) {
+ // in case of tables covering more that one page have to have
+ // a newPage followed to reset some internal state. Otherwise
+ // subsequent tables are rendered incorrectly.
+ isNewPagePending = true;
+ }
+ }
+
+ private boolean mayBeRemoved(ArrayList row) {
+ Iterator iterator = row.iterator();
+ boolean mayBeRemoved = true;
+ while (iterator.hasNext()) {
+ PdfCell cell = (PdfCell) iterator.next();
+
+ mayBeRemoved &= cell.mayBeRemoved();
+ }
+ return mayBeRemoved;
+ }
+
+ private void consumeRowspan(ArrayList row, RenderingContext ctx) {
+ Iterator iterator = row.iterator();
+ while (iterator.hasNext()) {
+ PdfCell c = (PdfCell) iterator.next();
+ ctx.consumeRowspan(c);
+ }
+ }
+
+ private ArrayList extractRows(ArrayList cells, RenderingContext ctx) {
+ PdfCell cell;
+ PdfCell previousCell = null;
+ ArrayList rows = new ArrayList();
+ java.util.List rowCells = new ArrayList();
+
+ Iterator iterator = cells.iterator();
+ while (iterator.hasNext()) {
+ cell = (PdfCell) iterator.next();
+
+ boolean isAdded = false;
+
+ boolean isEndOfRow = !iterator.hasNext();
+ boolean isCurrentCellPartOfRow = !iterator.hasNext();
+
+ if (previousCell != null) {
+ if (cell.left() <= previousCell.left()) {
+ isEndOfRow = true;
+ isCurrentCellPartOfRow = false;
+ }
+ }
+
+ if (isCurrentCellPartOfRow) {
+ rowCells.add(cell);
+ isAdded = true;
+ }
+
+ if (isEndOfRow) {
+ if (!rowCells.isEmpty()) {
+ // add to rowlist
+ rows.add(rowCells);
+ }
+
+ // start a new list for next line
+ rowCells = new ArrayList();
+ }
+
+ if (!isAdded) {
+ rowCells.add(cell);
+ }
+
+ previousCell = cell;
+ }
+
+ if (!rowCells.isEmpty()) {
+ rows.add(rowCells);
+ }
+
+ // fill row information with rowspan cells to get complete "scan lines"
+ for (int i = rows.size() - 1; i >= 0; i--) {
+ ArrayList row = (ArrayList) rows.get(i);
+ // iterator through row
+ for (int j = 0; j < row.size(); j++) {
+ PdfCell c = (PdfCell) row.get(j);
+ int rowspan = c.rowspan();
+ // fill in missing rowspan cells to complete "scan line"
+ for (int k = 1; k < rowspan; k++) {
+ ArrayList spannedRow = ((ArrayList) rows.get(i + k));
+ if (spannedRow.size() > j)
+ spannedRow.add(j, c);
+ }
+ }
+ }
+
+ return rows;
+ }
+
+ private void renderCells(RenderingContext ctx, java.util.List cells, boolean hasToFit) throws DocumentException {
+ PdfCell cell;
+ Iterator iterator;
+ if (hasToFit) {
+ iterator = cells.iterator();
+ while (iterator.hasNext()) {
+ cell = (PdfCell) iterator.next();
+ if (!cell.isHeader()) {
+ if (cell.bottom() < indentBottom()) return;
+ }
+ }
+ }
+ iterator = cells.iterator();
+
+ while (iterator.hasNext()) {
+ cell = (PdfCell) iterator.next();
+ if (!ctx.isCellRenderedOnPage(cell, getPageNumber())) {
+
+ float correction = 0;
+ if (ctx.numCellRendered(cell) >= 1) {
+ correction = 1.0f;
+ }
+
+ lines = cell.getLines(ctx.pagetop, indentBottom() - correction);
+
+ // if there is still text to render we render it
+ if (lines != null && lines.size() > 0) {
+
+ // we write the text
+ float cellTop = cell.top(ctx.pagetop - ctx.oldHeight);
+ text.moveText(0, cellTop);
+ float cellDisplacement = flushLines() - cellTop;
+
+ text.moveText(0, cellDisplacement);
+ if (ctx.oldHeight + cellDisplacement > currentHeight) {
+ currentHeight = ctx.oldHeight + cellDisplacement;
+ }
+
+ ctx.cellRendered(cell, getPageNumber());
+ }
+ float indentBottom = Math.max(cell.bottom(), indentBottom());
+ Rectangle tableRect = ctx.table.rectangle(ctx.pagetop, indentBottom());
+ indentBottom = Math.max(tableRect.bottom(), indentBottom);
+
+ // we paint the borders of the cells
+ Rectangle cellRect = cell.rectangle(tableRect.top(), indentBottom);
+ //cellRect.setBottom(cellRect.bottom());
+ if (cellRect.height() > 0) {
+ ctx.lostTableBottom = indentBottom;
+ ctx.cellGraphics.rectangle(cellRect);
+ }
+
+ // and additional graphics
+ ArrayList images = cell.getImages(ctx.pagetop, indentBottom());
+ for (Iterator i = images.iterator(); i.hasNext();) {
+ Image image = (Image) i.next();
+ graphics.addImage(image);
+ }
+
+ }
+ }
+
+ }
+
+
+ /**
+ * Signals that an <CODE>Element</CODE> was added to the <CODE>Document</CODE>.
+ *
+ * @param element the element to add
+ * @return <CODE>true</CODE> if the element was added, <CODE>false</CODE> if not.
+ * @throws DocumentException when a document isn't open yet, or has been closed
+ */
+
+ public boolean add(Element element) throws DocumentException {
+ if (writer != null && writer.isPaused()) {
+ return false;
+ }
+ try {
+// resolves problem described in add(PdfTable)
+ if (isNewPagePending) {
+ isNewPagePending = false;
+ newPage();
+ }
+ switch(element.type()) {
+
+ // Information (headers)
+ case Element.HEADER:
+ info.addkey(((Meta)element).name(), ((Meta)element).content());
+ break;
+ case Element.TITLE:
+ info.addTitle(((Meta)element).content());
+ break;
+ case Element.SUBJECT:
+ info.addSubject(((Meta)element).content());
+ break;
+ case Element.KEYWORDS:
+ info.addKeywords(((Meta)element).content());
+ break;
+ case Element.AUTHOR:
+ info.addAuthor(((Meta)element).content());
+ break;
+ case Element.CREATOR:
+ info.addCreator(((Meta)element).content());
+ break;
+ case Element.PRODUCER:
+ // you can not change the name of the producer
+ info.addProducer();
+ break;
+ case Element.CREATIONDATE:
+ // you can not set the creation date, only reset it
+ info.addCreationDate();
+ break;
+
+ // content (text)
+ case Element.CHUNK: {
+ // if there isn't a current line available, we make one
+ if (line == null) {
+ carriageReturn();
+ }
+
+ // we cast the element to a chunk
+ PdfChunk chunk = new PdfChunk((Chunk) element, currentAction);
+ // we try to add the chunk to the line, until we succeed
+ {
+ PdfChunk overflow;
+ while ((overflow = line.add(chunk)) != null) {
+ carriageReturn();
+ chunk = overflow;
+ }
+ }
+ pageEmpty = false;
+ if (chunk.isAttribute(Chunk.NEWPAGE)) {
+ newPage();
+ }
+ break;
+ }
+ case Element.ANCHOR: {
+ Anchor anchor = (Anchor) element;
+ String url = anchor.reference();
+ leading = anchor.leading();
+ if (url != null) {
+ currentAction = new PdfAction(url);
+ }
+
+ // we process the element
+ element.process(this);
+ currentAction = null;
+ break;
+ }
+ case Element.ANNOTATION: {
+ if (line == null) {
+ carriageReturn();
+ }
+ Annotation annot = (Annotation) element;
+ PdfAnnotation an = convertAnnotation(writer, annot);
+ annotations.add(an);
+ pageEmpty = false;
+ break;
+ }
+ case Element.PHRASE: {
+ // we cast the element to a phrase and set the leading of the document
+ leading = ((Phrase) element).leading();
+ // we process the element
+ element.process(this);
+ break;
+ }
+ case Element.PARAGRAPH: {
+ // we cast the element to a paragraph
+ Paragraph paragraph = (Paragraph) element;
+
+ float spacingBefore = paragraph.spacingBefore();
+ if (spacingBefore != 0) {
+ leading = spacingBefore;
+ carriageReturn();
+ if (!pageEmpty) {
+ /*
+ * Don't add spacing before a paragraph if it's the first
+ * on the page
+ */
+ Chunk space = new Chunk(" ");
+ space.process(this);
+ carriageReturn();
+ }
+ }
+
+ // we adjust the parameters of the document
+ alignment = paragraph.alignment();
+ leading = paragraph.leading();
+
+ carriageReturn();
+ // we don't want to make orphans/widows
+ if (currentHeight + line.height() + leading > indentTop() - indentBottom()) {
+ newPage();
+ }
+
+ // Begin added: Bonf (Marc Schneider) 2003-07-29
+ //carriageReturn();
+ // End added: Bonf (Marc Schneider) 2003-07-29
+
+ indentLeft += paragraph.indentationLeft();
+ indentRight += paragraph.indentationRight();
+
+ // Begin removed: Bonf (Marc Schneider) 2003-07-29
+ carriageReturn();
+ // End removed: Bonf (Marc Schneider) 2003-07-29
+
+
+ //add by Jin-Hsia Yang
+
+ paraIndent += paragraph.indentationLeft();
+ //end add by Jin-Hsia Yang
+
+ PdfPageEvent pageEvent = writer.getPageEvent();
+ if (pageEvent != null && isParagraph)
+ pageEvent.onParagraph(writer, this, indentTop() - currentHeight);
+
+ // if a paragraph has to be kept together, we wrap it in a table object
+ if (paragraph.getKeepTogether()) {
+ Table table = new Table(1, 1);
+ table.setOffset(0f);
+ table.setBorder(Table.NO_BORDER);
+ table.setWidth(100f);
+ table.setTableFitsPage(true);
+ Cell cell = new Cell(paragraph);
+ cell.setBorder(Table.NO_BORDER);
+ //patch by Matt Benson 11/01/2002 - 14:32:00
+ cell.setHorizontalAlignment(paragraph.alignment());
+ //end patch by Matt Benson
+ table.addCell(cell);
+ this.add(table);
+ break;
+ }
+ else
+ // we process the paragraph
+ element.process(this);
+
+ //add by Jin-Hsia Yang and blowagie
+ paraIndent -= paragraph.indentationLeft();
+ //end add by Jin-Hsia Yang and blowagie
+
+ // Begin removed: Bonf (Marc Schneider) 2003-07-29
+ // carriageReturn();
+ // End removed: Bonf (Marc Schneider) 2003-07-29
+
+ float spacingAfter = paragraph.spacingAfter();
+ if (spacingAfter != 0) {
+ leading = spacingAfter;
+ carriageReturn();
+ if (currentHeight + line.height() + leading < indentTop() - indentBottom()) {
+ /*
+ * Only add spacing after a paragraph if the extra
+ * spacing fits on the page.
+ */
+ Chunk space = new Chunk(" ");
+ space.process(this);
+ carriageReturn();
+ }
+ leading = paragraph.leading(); // restore original leading
+ }
+
+ if (pageEvent != null && isParagraph)
+ pageEvent.onParagraphEnd(writer, this, indentTop() - currentHeight);
+
+ alignment = Element.ALIGN_LEFT;
+ indentLeft -= paragraph.indentationLeft();
+ indentRight -= paragraph.indentationRight();
+
+ // Begin added: Bonf (Marc Schneider) 2003-07-29
+ carriageReturn();
+ // End added: Bonf (Marc Schneider) 2003-07-29
+
+ //add by Jin-Hsia Yang
+
+ //end add by Jin-Hsia Yang
+
+ break;
+ }
+ case Element.SECTION:
+ case Element.CHAPTER: {
+ // Chapters and Sections only differ in their constructor
+ // so we cast both to a Section
+ Section section = (Section) element;
+
+ boolean hasTitle = section.title() != null;
+
+ // if the section is a chapter, we begin a new page
+ if (section.isChapter()) {
+ newPage();
+ }
+ // otherwise, we begin a new line
+ else {
+ newLine();
+ }
+
+ if (hasTitle) {
+ float fith = indentTop() - currentHeight;
+ int rotation = pageSize.getRotation();
+ if (rotation == 90 || rotation == 180)
+ fith = pageSize.height() - fith;
+ PdfDestination destination = new PdfDestination(PdfDestination.FITH, fith);
+ while (currentOutline.level() >= section.depth()) {
+ currentOutline = currentOutline.parent();
+ }
+ PdfOutline outline = new PdfOutline(currentOutline, destination, section.getBookmarkTitle(), section.isBookmarkOpen());
+ currentOutline = outline;
+ }
+
+ // some values are set
+ carriageReturn();
+ indentLeft += section.indentationLeft();
+ indentRight += section.indentationRight();
+
+ PdfPageEvent pageEvent = writer.getPageEvent();
+ if (pageEvent != null)
+ if (element.type() == Element.CHAPTER)
+ pageEvent.onChapter(writer, this, indentTop() - currentHeight, section.title());
+ else
+ pageEvent.onSection(writer, this, indentTop() - currentHeight, section.depth(), section.title());
+
+ // the title of the section (if any has to be printed)
+ if (hasTitle) {
+ isParagraph = false;
+ add(section.title());
+ isParagraph = true;
+ }
+ indentLeft += section.indentation();
+ // we process the section
+ element.process(this);
+ // some parameters are set back to normal again
+ indentLeft -= section.indentationLeft() + section.indentation();
+ indentRight -= section.indentationRight();
+
+ if (pageEvent != null)
+ if (element.type() == Element.CHAPTER)
+ pageEvent.onChapterEnd(writer, this, indentTop() - currentHeight);
+ else
+ pageEvent.onSectionEnd(writer, this, indentTop() - currentHeight);
+
+ break;
+ }
+ case Element.LIST: {
+ // we cast the element to a List
+ List list = (List) element;
+ // we adjust the document
+ listIndentLeft += list.indentationLeft();
+ indentRight += list.indentationRight();
+ // we process the items in the list
+ element.process(this);
+ // some parameters are set back to normal again
+ listIndentLeft -= list.indentationLeft();
+ indentRight -= list.indentationRight();
+ break;
+ }
+ case Element.LISTITEM: {
+ // we cast the element to a ListItem
+ ListItem listItem = (ListItem) element;
+
+ float spacingBefore = listItem.spacingBefore();
+ if (spacingBefore != 0) {
+ leading = spacingBefore;
+ carriageReturn();
+ if (!pageEmpty) {
+ /*
+ * Don't add spacing before a paragraph if it's the first
+ * on the page
+ */
+ Chunk space = new Chunk(" ");
+ space.process(this);
+ carriageReturn();
+ }
+ }
+
+ // we adjust the document
+ alignment = listItem.alignment();
+ listIndentLeft += listItem.indentationLeft();
+ indentRight += listItem.indentationRight();
+ leading = listItem.leading();
+ carriageReturn();
+ // we prepare the current line to be able to show us the listsymbol
+ line.setListItem(listItem);
+ // we process the item
+ element.process(this);
+
+ float spacingAfter = listItem.spacingAfter();
+ if (spacingAfter != 0) {
+ leading = spacingAfter;
+ carriageReturn();
+ if (currentHeight + line.height() + leading < indentTop() - indentBottom()) {
+ /*
+ * Only add spacing after a paragraph if the extra
+ * spacing fits on the page.
+ */
+ Chunk space = new Chunk(" ");
+ space.process(this);
+ carriageReturn();
+ }
+ leading = listItem.leading(); // restore original leading
+ }
+
+ // if the last line is justified, it should be aligned to the left
+ // if (line.hasToBeJustified()) {
+ // line.resetAlignment();
+ // }
+ // some parameters are set back to normal again
+ carriageReturn();
+ listIndentLeft -= listItem.indentationLeft();
+ indentRight -= listItem.indentationRight();
+ break;
+ }
+ case Element.RECTANGLE: {
+ Rectangle rectangle = (Rectangle) element;
+ graphics.rectangle(rectangle);
+ pageEmpty = false;
+ break;
+ }
+ case Element.PTABLE: {
+ PdfPTable ptable = (PdfPTable)element;
+ if (ptable.size() <= ptable.getHeaderRows())
+ break; //nothing to do
+
+ // before every table, we add a new line and flush all lines
+ ensureNewLine();
+ flushLines();
+ addPTable(ptable);
+ pageEmpty = false;
+ break;
+ }
+ case Element.MULTI_COLUMN_TEXT: {
+ ensureNewLine();
+ flushLines();
+ MultiColumnText multiText = (MultiColumnText) element;
+ float height = multiText.write(writer.getDirectContent(), this, indentTop() - currentHeight);
+ currentHeight += height;
+ text.moveText(0, -1f* height);
+ pageEmpty = false;
+ break;
+ }
+ case Element.TABLE : {
+
+ /**
+ * This is a list of people who worked on the Table functionality.
+ * To see who did what, please check the CVS repository:
+ *
+ * Leslie Baski
+ * Matt Benson
+ * Francesco De Milato
+ * David Freels
+ * Bruno Lowagie
+ * Veerendra Namineni
+ * Geert Poels
+ * Tom Ring
+ * Paulo Soares
+ * Gerald Fehringer
+ * Steve Appling
+ * Karsten Klein
+ */
+
+ PdfTable table;
+ if (element instanceof PdfTable) {
+ // Already pre-rendered
+ table = (PdfTable)element;
+ table.updateRowAdditions();
+ } else if (element instanceof SimpleTable) {
+ PdfPTable ptable = ((SimpleTable)element).createPdfPTable();
+ if (ptable.size() <= ptable.getHeaderRows())
+ break; //nothing to do
+
+ // before every table, we add a new line and flush all lines
+ ensureNewLine();
+ flushLines();
+ addPTable(ptable);
+ pageEmpty = false;
+ break;
+ } else if (element instanceof Table) {
+ try {
+ PdfPTable ptable = ((Table)element).createPdfPTable();
+ if (ptable.size() <= ptable.getHeaderRows())
+ break; //nothing to do
+
+ // before every table, we add a new line and flush all lines
+ ensureNewLine();
+ flushLines();
+ addPTable(ptable);
+ pageEmpty = false;
+ break;
+ }
+ catch(BadElementException bee) {
+ // constructing the PdfTable
+ // Before the table, add a blank line using offset or default leading
+ float offset = ((Table)element).getOffset();
+ if (Float.isNaN(offset))
+ offset = leading;
+ carriageReturn();
+ lines.add(new PdfLine(indentLeft(), indentRight(), alignment, offset));
+ currentHeight += offset;
+ table = getPdfTable((Table)element, false);
+ }
+ } else {
+ return false;
+ }
+ add(table, false);
+ break;
+ }
+ case Element.JPEG:
+ case Element.IMGRAW:
+ case Element.IMGTEMPLATE: {
+ //carriageReturn(); suggestion by Marc Campforts
+ add((Image) element);
+ break;
+ }
+ case Element.GRAPHIC: {
+ Graphic graphic = (Graphic) element;
+ graphic.processAttributes(indentLeft(), indentBottom(), indentRight(), indentTop(), indentTop() - currentHeight);
+ graphics.add(graphic);
+ pageEmpty = false;
+ break;
+ }
+ default:
+ return false;
+ }
+ lastElementType = element.type();
+ return true;
+ }
+ catch(Exception e) {
+ throw new DocumentException(e);
+ }
+ }
+
+ // methods to add Content
+
+ /**
+ * Adds an image to the document.
+ * @param image the <CODE>Image</CODE> to add
+ * @throws PdfException on error
+ * @throws DocumentException on error
+ */
+
+ private void add(Image image) throws PdfException, DocumentException {
+
+ if (image.hasAbsolutePosition()) {
+ graphics.addImage(image);
+ pageEmpty = false;
+ return;
+ }
+
+ // if there isn't enough room for the image on this page, save it for the next page
+ if (currentHeight != 0 && indentTop() - currentHeight - image.scaledHeight() < indentBottom()) {
+ if (!strictImageSequence && imageWait == null) {
+ imageWait = image;
+ return;
+ }
+ newPage();
+ if (currentHeight != 0 && indentTop() - currentHeight - image.scaledHeight() < indentBottom()) {
+ imageWait = image;
+ return;
+ }
+ }
+ pageEmpty = false;
+ // avoid endless loops
+ if (image == imageWait)
+ imageWait = null;
+ boolean textwrap = (image.alignment() & Image.TEXTWRAP) == Image.TEXTWRAP
+ && !((image.alignment() & Image.MIDDLE) == Image.MIDDLE);
+ boolean underlying = (image.alignment() & Image.UNDERLYING) == Image.UNDERLYING;
+ float diff = leading / 2;
+ if (textwrap) {
+ diff += leading;
+ }
+ float lowerleft = indentTop() - currentHeight - image.scaledHeight() -diff;
+ float mt[] = image.matrix();
+ float startPosition = indentLeft() - mt[4];
+ if ((image.alignment() & Image.RIGHT) == Image.RIGHT) startPosition = indentRight() - image.scaledWidth() - mt[4];
+ if ((image.alignment() & Image.MIDDLE) == Image.MIDDLE) startPosition = indentLeft() + ((indentRight() - indentLeft() - image.scaledWidth()) / 2) - mt[4];
+ if (image.hasAbsoluteX()) startPosition = image.absoluteX();
+ if (textwrap) {
+ if (imageEnd < 0 || imageEnd < currentHeight + image.scaledHeight() + diff) {
+ imageEnd = currentHeight + image.scaledHeight() + diff;
+ }
+ if ((image.alignment() & Image.RIGHT) == Image.RIGHT) {
+ // indentation suggested by Pelikan Stephan
+ imageIndentRight += image.scaledWidth() + image.indentationLeft();
+ }
+ else {
+ // indentation suggested by Pelikan Stephan
+ imageIndentLeft += image.scaledWidth() + image.indentationRight();
+ }
+ }
+ else {
+ if ((image.alignment() & Image.RIGHT) == Image.RIGHT) startPosition -= image.indentationRight();
+ else if ((image.alignment() & Image.LEFT) == Image.LEFT) startPosition += image.indentationLeft();
+ else if ((image.alignment() & Image.MIDDLE) == Image.MIDDLE) startPosition += image.indentationLeft() - image.indentationRight();
+ }
+ graphics.addImage(image, mt[0], mt[1], mt[2], mt[3], startPosition, lowerleft - mt[5]);
+ if (!(textwrap || underlying)) {
+ currentHeight += image.scaledHeight() + diff;
+ flushLines();
+ text.moveText(0, - (image.scaledHeight() + diff));
+ newLine();
+ }
+ }
+
+ /**
+ * Initializes a page.
+ * <P>
+ * If the footer/header is set, it is printed.
+ * @throws DocumentException on error
+ */
+
+ private void initPage() throws DocumentException {
+
+ // initialisation of some page objects
+ markPoint = 0;
+ annotations = delayedAnnotations;
+ delayedAnnotations = new ArrayList();
+ pageResources = new PageResources();
+ writer.resetContent();
+
+ // the pagenumber is incremented
+ pageN++;
+
+ // graphics and text are initialized
+ float oldleading = leading;
+ int oldAlignment = alignment;
+
+ if (marginMirroring && (getPageNumber() & 1) == 0) {
+ marginRight = nextMarginLeft;
+ marginLeft = nextMarginRight;
+ }
+ else {
+ marginLeft = nextMarginLeft;
+ marginRight = nextMarginRight;
+ }
+ marginTop = nextMarginTop;
+ marginBottom = nextMarginBottom;
+ imageEnd = -1;
+ imageIndentRight = 0;
+ imageIndentLeft = 0;
+ graphics = new PdfContentByte(writer);
+ text = new PdfContentByte(writer);
+ text.beginText();
+ text.moveText(left(), top());
+ textEmptySize = text.size();
+ text.reset();
+ text.beginText();
+ leading = 16;
+ indentBottom = 0;
+ indentTop = 0;
+ currentHeight = 0;
+
+ // backgroundcolors, etc...
+ pageSize = nextPageSize;
+ thisBoxSize = new HashMap(boxSize);
+ if (pageSize.backgroundColor() != null
+ || pageSize.hasBorders()
+ || pageSize.borderColor() != null) {
+ add(pageSize);
+ }
+
+ // if there is a watermark, the watermark is added
+ if (watermark != null) {
+ float mt[] = watermark.matrix();
+ graphics.addImage(watermark, mt[0], mt[1], mt[2], mt[3], watermark.offsetX() - mt[4], watermark.offsetY() - mt[5]);
+ }
+
+ // if there is a footer, the footer is added
+ if (footer != null) {
+ /*
+ Added by Edgar Leonardo Prieto Perilla
+ */
+ // Avoid footer identation
+ float tmpIndentLeft = indentLeft;
+ float tmpIndentRight = indentRight;
+ // Begin added: Bonf (Marc Schneider) 2003-07-29
+ float tmpListIndentLeft = listIndentLeft;
+ float tmpImageIndentLeft = imageIndentLeft;
+ float tmpImageIndentRight = imageIndentRight;
+ // End added: Bonf (Marc Schneider) 2003-07-29
+
+ indentLeft = indentRight = 0;
+ // Begin added: Bonf (Marc Schneider) 2003-07-29
+ listIndentLeft = 0;
+ imageIndentLeft = 0;
+ imageIndentRight = 0;
+ // End added: Bonf (Marc Schneider) 2003-07-29
+ /*
+ End Added by Edgar Leonardo Prieto Perilla
+ */
+
+ footer.setPageNumber(pageN);
+ leading = footer.paragraph().leading();
+ add(footer.paragraph());
+ // adding the footer limits the height
+ indentBottom = currentHeight;
+ text.moveText(left(), indentBottom());
+ flushLines();
+ text.moveText(-left(), -bottom());
+ footer.setTop(bottom(currentHeight));
+ footer.setBottom(bottom() - (0.75f * leading));
+ footer.setLeft(left());
+ footer.setRight(right());
+ graphics.rectangle(footer);
+ indentBottom = currentHeight + leading * 2;
+ currentHeight = 0;
+
+ /*
+ Added by Edgar Leonardo Prieto Perilla
+ */
+ indentLeft = tmpIndentLeft;
+ indentRight = tmpIndentRight;
+ // Begin added: Bonf (Marc Schneider) 2003-07-29
+ listIndentLeft = tmpListIndentLeft;
+ imageIndentLeft = tmpImageIndentLeft;
+ imageIndentRight = tmpImageIndentRight;
+ // End added: Bonf (Marc Schneider) 2003-07-29
+ /*
+ End Added by Edgar Leonardo Prieto Perilla
+ */
+ }
+
+ // we move to the left/top position of the page
+ text.moveText(left(), top());
+
+ // if there is a header, the header = added
+ if (header != null) {
+ /*
+ Added by Edgar Leonardo Prieto Perilla
+ */
+ // Avoid header identation
+ float tmpIndentLeft = indentLeft;
+ float tmpIndentRight = indentRight;
+ // Begin added: Bonf (Marc Schneider) 2003-07-29
+ float tmpListIndentLeft = listIndentLeft;
+ float tmpImageIndentLeft = imageIndentLeft;
+ float tmpImageIndentRight = imageIndentRight;
+ // End added: Bonf (Marc Schneider) 2003-07-29
+
+ indentLeft = indentRight = 0;
+ // Added: Bonf
+ listIndentLeft = 0;
+ imageIndentLeft = 0;
+ imageIndentRight = 0;
+ // End added: Bonf
+ /*
+ End Added by Edgar Leonardo Prieto Perilla
+ */
+
+ header.setPageNumber(pageN);
+ leading = header.paragraph().leading();
+ text.moveText(0, leading);
+ add(header.paragraph());
+ newLine();
+ indentTop = currentHeight - leading;
+ header.setTop(top() + leading);
+ header.setBottom(indentTop() + leading * 2 / 3);
+ header.setLeft(left());
+ header.setRight(right());
+ graphics.rectangle(header);
+ flushLines();
+ currentHeight = 0;
+
+ /*
+ Added by Edgar Leonardo Prieto Perilla
+ */
+ // Restore identation
+ indentLeft = tmpIndentLeft;
+ indentRight = tmpIndentRight;
+ // Begin added: Bonf (Marc Schneider) 2003-07-29
+ listIndentLeft = tmpListIndentLeft;
+ imageIndentLeft = tmpImageIndentLeft;
+ imageIndentRight = tmpImageIndentRight;
+ // End added: Bonf (Marc Schneider) 2003-07-29
+ /*
+ End Added by Edgar Leonardo Prieto Perilla
+ */
+ }
+
+ pageEmpty = true;
+
+ // if there is an image waiting to be drawn, draw it
+ try {
+ if (imageWait != null) {
+ add(imageWait);
+ imageWait = null;
+ }
+ }
+ catch(Exception e) {
+ throw new ExceptionConverter(e);
+ }
+
+ leading = oldleading;
+ alignment = oldAlignment;
+ carriageReturn();
+ PdfPageEvent pageEvent = writer.getPageEvent();
+ if (pageEvent != null) {
+ if (firstPageEvent) {
+ pageEvent.onOpenDocument(writer, this);
+ }
+ pageEvent.onStartPage(writer, this);
+ }
+ firstPageEvent = false;
+ }
+
+ /**
+ * If the current line is not empty or null, it is added to the arraylist
+ * of lines and a new empty line is added.
+ * @throws DocumentException on error
+ */
+
+ private void carriageReturn() throws DocumentException {
+ // the arraylist with lines may not be null
+ if (lines == null) {
+ lines = new ArrayList();
+ }
+ // If the current line is not null
+ if (line != null) {
+ // we check if the end of the page is reached (bugfix by Francois Gravel)
+ if (currentHeight + line.height() + leading < indentTop() - indentBottom()) {
+ // if so nonempty lines are added and the heigt is augmented
+ if (line.size() > 0) {
+ currentHeight += line.height();
+ lines.add(line);
+ pageEmpty = false;
+ }
+ }
+ // if the end of the line is reached, we start a new page
+ else {
+ newPage();
+ }
+ }
+ if (imageEnd > -1 && currentHeight > imageEnd) {
+ imageEnd = -1;
+ imageIndentRight = 0;
+ imageIndentLeft = 0;
+ }
+ // a new current line is constructed
+ line = new PdfLine(indentLeft(), indentRight(), alignment, leading);
+ }
+
+ /**
+ * Adds the current line to the list of lines and also adds an empty line.
+ * @throws DocumentException on error
+ */
+
+ private void newLine() throws DocumentException {
+ lastElementType = -1;
+ carriageReturn();
+ if (lines != null && lines.size() > 0) {
+ lines.add(line);
+ currentHeight += line.height();
+ }
+ line = new PdfLine(indentLeft(), indentRight(), alignment, leading);
+ }
+
+ /**
+ * Writes all the lines to the text-object.
+ *
+ * @return the displacement that was caused
+ * @throws DocumentException on error
+ */
+
+ private float flushLines() throws DocumentException {
+
+ // checks if the ArrayList with the lines is not null
+ if (lines == null) {
+ return 0;
+ }
+
+ //add by Jin-Hsia Yang
+ boolean newline=false;
+ //end add by Jin-Hsia Yang
+
+ // checks if a new Line has to be made.
+ if (line != null && line.size() > 0) {
+ lines.add(line);
+ line = new PdfLine(indentLeft(), indentRight(), alignment, leading);
+
+ //add by Jin-Hsia Yang
+ newline=true;
+ //end add by Jin-Hsia Yang
+
+ }
+
+ // checks if the ArrayList with the lines is empty
+ if (lines.size() == 0) {
+ return 0;
+ }
+
+ // initialisation of some parameters
+ Object currentValues[] = new Object[2];
+ PdfFont currentFont = null;
+ float displacement = 0;
+ PdfLine l;
+ Float lastBaseFactor = new Float(0);
+ currentValues[1] = lastBaseFactor;
+ // looping over all the lines
+ for (Iterator i = lines.iterator(); i.hasNext(); ) {
+
+ // this is a line in the loop
+ l = (PdfLine) i.next();
+
+ if(isNewpage && newline) { // fix Ken@PDI
+ newline=false;
+ text.moveText(l.indentLeft() - indentLeft() + listIndentLeft + paraIndent,-l.height());
+ }
+ else {
+ text.moveText(l.indentLeft() - indentLeft() + listIndentLeft, -l.height());
+ }
+
+ // is the line preceeded by a symbol?
+ if (l.listSymbol() != null) {
+ ColumnText.showTextAligned(graphics, Element.ALIGN_LEFT, new Phrase(l.listSymbol()), text.getXTLM() - l.listIndent(), text.getYTLM(), 0);
+ }
+
+ currentValues[0] = currentFont;
+
+ writeLineToContent(l, text, graphics, currentValues, writer.getSpaceCharRatio());
+
+ currentFont = (PdfFont)currentValues[0];
+
+ displacement += l.height();
+ if (indentLeft() - listIndentLeft != l.indentLeft()) {
+ text.moveText(indentLeft() - l.indentLeft() - listIndentLeft, 0);
+ }
+
+ }
+ lines = new ArrayList();
+ return displacement;
+ }
+
+ // methods to retrieve information
+
+ /**
+ * Gets the <CODE>PdfInfo</CODE>-object.
+ *
+ * @return <CODE>PdfInfo</COPE>
+ */
+
+ PdfInfo getInfo() {
+ return info;
+ }
+
+ /**
+ * Gets the <CODE>PdfCatalog</CODE>-object.
+ *
+ * @param pages an indirect reference to this document pages
+ * @return <CODE>PdfCatalog</CODE>
+ */
+
+ PdfCatalog getCatalog(PdfIndirectReference pages) {
+ PdfCatalog catalog;
+ if (rootOutline.getKids().size() > 0) {
+ catalog = new PdfCatalog(pages, rootOutline.indirectReference(), writer);
+ }
+ else
+ catalog = new PdfCatalog(pages, writer);
+ if (openActionName != null) {
+ PdfAction action = getLocalGotoAction(openActionName);
+ catalog.setOpenAction(action);
+ }
+ else if (openActionAction != null)
+ catalog.setOpenAction(openActionAction);
+
+ if (additionalActions != null) {
+ catalog.setAdditionalActions(additionalActions);
+ }
+
+ if (pageLabels != null)
+ catalog.setPageLabels(pageLabels);
+ catalog.addNames(localDestinations, documentJavaScript, documentFileAttachment, writer);
+ catalog.setViewerPreferences(viewerPreferences);
+ if (acroForm.isValid()) {
+ try {
+ catalog.setAcroForm(writer.addToBody(acroForm).getIndirectReference());
+ }
+ catch (IOException e) {
+ throw new ExceptionConverter(e);
+ }
+ }
+ return catalog;
+ }
+
+ // methods concerning the layout
+
+ /**
+ * Returns the bottomvalue of a <CODE>Table</CODE> if it were added to this document.
+ *
+ * @param table the table that may or may not be added to this document
+ * @return a bottom value
+ */
+
+ float bottom(Table table) {
+// where will the table begin?
+ float h = (currentHeight > 0) ? indentTop() - currentHeight - 2f * leading : indentTop();
+ // constructing a PdfTable
+ PdfTable tmp = getPdfTable(table, false);
+ return tmp.bottom();
+ }
+
+ /**
+ * Checks if a <CODE>PdfPTable</CODE> fits the current page of the <CODE>PdfDocument</CODE>.
+ *
+ * @param table the table that has to be checked
+ * @param margin a certain margin
+ * @return <CODE>true</CODE> if the <CODE>PdfPTable</CODE> fits the page, <CODE>false</CODE> otherwise.
+ */
+
+ boolean fitsPage(PdfPTable table, float margin) {
+ if (!table.isLockedWidth()) {
+ float totalWidth = (indentRight() - indentLeft()) * table.getWidthPercentage() / 100;
+ table.setTotalWidth(totalWidth);
+ }
+ // ensuring that a new line has been started.
+ ensureNewLine();
+ return table.getTotalHeight() <= indentTop() - currentHeight - indentBottom() - margin;
+ }
+
+
+ /**
+ * Gets the current vertical page position.
+ * @param ensureNewLine Tells whether a new line shall be enforced. This may cause side effects
+ * for elements that do not terminate the lines they've started because those lines will get
+ * terminated.
+ * @return The current vertical page position.
+ */
+ public float getVerticalPosition(boolean ensureNewLine) {
+ // ensuring that a new line has been started.
+ if (ensureNewLine) {
+ ensureNewLine();
+ }
+ return top() - currentHeight - indentTop;
+ }
+
+ /**
+ * Ensures that a new line has been started.
+ */
+ private void ensureNewLine() {
+ try {
+ if ((lastElementType == Element.PHRASE) ||
+ (lastElementType == Element.CHUNK)) {
+ newLine();
+ flushLines();
+ }
+ } catch (DocumentException ex) {
+ throw new ExceptionConverter(ex);
+ }
+ }
+
+ /**
+ * Gets the indentation on the left side.
+ *
+ * @return a margin
+ */
+
+ private float indentLeft() {
+ return left(indentLeft + listIndentLeft + imageIndentLeft);
+ }
+
+ /**
+ * Gets the indentation on the right side.
+ *
+ * @return a margin
+ */
+
+ private float indentRight() {
+ return right(indentRight + imageIndentRight);
+ }
+
+ /**
+ * Gets the indentation on the top side.
+ *
+ * @return a margin
+ */
+
+ private float indentTop() {
+ return top(indentTop);
+ }
+
+ /**
+ * Gets the indentation on the bottom side.
+ *
+ * @return a margin
+ */
+
+ float indentBottom() {
+ return bottom(indentBottom);
+ }
+
+ /**
+ * Adds a named outline to the document .
+ * @param outline the outline to be added
+ * @param name the name of this local destination
+ */
+ void addOutline(PdfOutline outline, String name) {
+ localDestination(name, outline.getPdfDestination());
+ }
+
+ /**
+ * Gets the AcroForm object.
+ * @return the PdfAcroform object of the PdfDocument
+ */
+
+ public PdfAcroForm getAcroForm() {
+ return acroForm;
+ }
+
+ /**
+ * Gets the root outline. All the outlines must be created with a parent.
+ * The first level is created with this outline.
+ * @return the root outline
+ */
+ public PdfOutline getRootOutline() {
+ return rootOutline;
+ }
+
+ /**
+ * Writes a text line to the document. It takes care of all the attributes.
+ * <P>
+ * Before entering the line position must have been established and the
+ * <CODE>text</CODE> argument must be in text object scope (<CODE>beginText()</CODE>).
+ * @param line the line to be written
+ * @param text the <CODE>PdfContentByte</CODE> where the text will be written to
+ * @param graphics the <CODE>PdfContentByte</CODE> where the graphics will be written to
+ * @param currentValues the current font and extra spacing values
+ * @param ratio
+ * @throws DocumentException on error
+ */
+ void writeLineToContent(PdfLine line, PdfContentByte text, PdfContentByte graphics, Object currentValues[], float ratio) throws DocumentException {
+ PdfFont currentFont = (PdfFont)(currentValues[0]);
+ float lastBaseFactor = ((Float)(currentValues[1])).floatValue();
+ PdfChunk chunk;
+ int numberOfSpaces;
+ int lineLen;
+ boolean isJustified;
+ float hangingCorrection = 0;
+ float hScale = 1;
+ float lastHScale = Float.NaN;
+ float baseWordSpacing = 0;
+ float baseCharacterSpacing = 0;
+
+ numberOfSpaces = line.numberOfSpaces();
+ lineLen = line.toString().length();
+ // does the line need to be justified?
+ isJustified = line.hasToBeJustified() && (numberOfSpaces != 0 || lineLen > 1);
+ if (isJustified) {
+ if (line.isNewlineSplit() && line.widthLeft() >= (lastBaseFactor * (ratio * numberOfSpaces + lineLen - 1))) {
+ if (line.isRTL()) {
+ text.moveText(line.widthLeft() - lastBaseFactor * (ratio * numberOfSpaces + lineLen - 1), 0);
+ }
+ baseWordSpacing = ratio * lastBaseFactor;
+ baseCharacterSpacing = lastBaseFactor;
+ }
+ else {
+ float width = line.widthLeft();
+ PdfChunk last = line.getChunk(line.size() - 1);
+ if (last != null) {
+ String s = last.toString();
+ char c;
+ if (s.length() > 0 && hangingPunctuation.indexOf((c = s.charAt(s.length() - 1))) >= 0) {
+ float oldWidth = width;
+ width += last.font().width(c) * 0.4f;
+ hangingCorrection = width - oldWidth;
+ }
+ }
+ float baseFactor = width / (ratio * numberOfSpaces + lineLen - 1);
+ baseWordSpacing = ratio * baseFactor;
+ baseCharacterSpacing = baseFactor;
+ lastBaseFactor = baseFactor;
+ }
+ }
+
+ int lastChunkStroke = line.getLastStrokeChunk();
+ int chunkStrokeIdx = 0;
+ float xMarker = text.getXTLM();
+ float baseXMarker = xMarker;
+ float yMarker = text.getYTLM();
+ boolean adjustMatrix = false;
+
+ // looping over all the chunks in 1 line
+ for (Iterator j = line.iterator(); j.hasNext(); ) {
+ chunk = (PdfChunk) j.next();
+ Color color = chunk.color();
+ hScale = 1;
+
+ if (chunkStrokeIdx <= lastChunkStroke) {
+ float width;
+ if (isJustified) {
+ width = chunk.getWidthCorrected(baseCharacterSpacing, baseWordSpacing);
+ }
+ else
+ width = chunk.width();
+ if (chunk.isStroked()) {
+ PdfChunk nextChunk = line.getChunk(chunkStrokeIdx + 1);
+ if (chunk.isAttribute(Chunk.BACKGROUND)) {
+ float subtract = lastBaseFactor;
+ if (nextChunk != null && nextChunk.isAttribute(Chunk.BACKGROUND))
+ subtract = 0;
+ if (nextChunk == null)
+ subtract += hangingCorrection;
+ float fontSize = chunk.font().size();
+ float ascender = chunk.font().getFont().getFontDescriptor(BaseFont.ASCENT, fontSize);
+ float descender = chunk.font().getFont().getFontDescriptor(BaseFont.DESCENT, fontSize);
+ Object bgr[] = (Object[])chunk.getAttribute(Chunk.BACKGROUND);
+ graphics.setColorFill((Color)bgr[0]);
+ float extra[] = (float[])bgr[1];
+ graphics.rectangle(xMarker - extra[0],
+ yMarker + descender - extra[1] + chunk.getTextRise(),
+ width - subtract + extra[0] + extra[2],
+ ascender - descender + extra[1] + extra[3]);
+ graphics.fill();
+ graphics.setGrayFill(0);
+ }
+ if (chunk.isAttribute(Chunk.UNDERLINE)) {
+ float subtract = lastBaseFactor;
+ if (nextChunk != null && nextChunk.isAttribute(Chunk.UNDERLINE))
+ subtract = 0;
+ if (nextChunk == null)
+ subtract += hangingCorrection;
+ Object unders[][] = (Object[][])chunk.getAttribute(Chunk.UNDERLINE);
+ Color scolor = null;
+ for (int k = 0; k < unders.length; ++k) {
+ Object obj[] = unders[k];
+ scolor = (Color)obj[0];
+ float ps[] = (float[])obj[1];
+ if (scolor == null)
+ scolor = color;
+ if (scolor != null)
+ graphics.setColorStroke(scolor);
+ float fsize = chunk.font().size();
+ graphics.setLineWidth(ps[0] + fsize * ps[1]);
+ float shift = ps[2] + fsize * ps[3];
+ int cap2 = (int)ps[4];
+ if (cap2 != 0)
+ graphics.setLineCap(cap2);
+ graphics.moveTo(xMarker, yMarker + shift);
+ graphics.lineTo(xMarker + width - subtract, yMarker + shift);
+ graphics.stroke();
+ if (scolor != null)
+ graphics.resetGrayStroke();
+ if (cap2 != 0)
+ graphics.setLineCap(0);
+ }
+ graphics.setLineWidth(1);
+ }
+ if (chunk.isAttribute(Chunk.ACTION)) {
+ float subtract = lastBaseFactor;
+ if (nextChunk != null && nextChunk.isAttribute(Chunk.ACTION))
+ subtract = 0;
+ if (nextChunk == null)
+ subtract += hangingCorrection;
+ text.addAnnotation(new PdfAnnotation(writer, xMarker, yMarker, xMarker + width - subtract, yMarker + chunk.font().size(), (PdfAction)chunk.getAttribute(Chunk.ACTION)));
+ }
+ if (chunk.isAttribute(Chunk.REMOTEGOTO)) {
+ float subtract = lastBaseFactor;
+ if (nextChunk != null && nextChunk.isAttribute(Chunk.REMOTEGOTO))
+ subtract = 0;
+ if (nextChunk == null)
+ subtract += hangingCorrection;
+ Object obj[] = (Object[])chunk.getAttribute(Chunk.REMOTEGOTO);
+ String filename = (String)obj[0];
+ if (obj[1] instanceof String)
+ remoteGoto(filename, (String)obj[1], xMarker, yMarker, xMarker + width - subtract, yMarker + chunk.font().size());
+ else
+ remoteGoto(filename, ((Integer)obj[1]).intValue(), xMarker, yMarker, xMarker + width - subtract, yMarker + chunk.font().size());
+ }
+ if (chunk.isAttribute(Chunk.LOCALGOTO)) {
+ float subtract = lastBaseFactor;
+ if (nextChunk != null && nextChunk.isAttribute(Chunk.LOCALGOTO))
+ subtract = 0;
+ if (nextChunk == null)
+ subtract += hangingCorrection;
+ localGoto((String)chunk.getAttribute(Chunk.LOCALGOTO), xMarker, yMarker, xMarker + width - subtract, yMarker + chunk.font().size());
+ }
+ if (chunk.isAttribute(Chunk.LOCALDESTINATION)) {
+ float subtract = lastBaseFactor;
+ if (nextChunk != null && nextChunk.isAttribute(Chunk.LOCALDESTINATION))
+ subtract = 0;
+ if (nextChunk == null)
+ subtract += hangingCorrection;
+ localDestination((String)chunk.getAttribute(Chunk.LOCALDESTINATION), new PdfDestination(PdfDestination.XYZ, xMarker, yMarker + chunk.font().size(), 0));
+ }
+ if (chunk.isAttribute(Chunk.GENERICTAG)) {
+ float subtract = lastBaseFactor;
+ if (nextChunk != null && nextChunk.isAttribute(Chunk.GENERICTAG))
+ subtract = 0;
+ if (nextChunk == null)
+ subtract += hangingCorrection;
+ Rectangle rect = new Rectangle(xMarker, yMarker, xMarker + width - subtract, yMarker + chunk.font().size());
+ PdfPageEvent pev = writer.getPageEvent();
+ if (pev != null)
+ pev.onGenericTag(writer, this, rect, (String)chunk.getAttribute(Chunk.GENERICTAG));
+ }
+ if (chunk.isAttribute(Chunk.PDFANNOTATION)) {
+ float subtract = lastBaseFactor;
+ if (nextChunk != null && nextChunk.isAttribute(Chunk.PDFANNOTATION))
+ subtract = 0;
+ if (nextChunk == null)
+ subtract += hangingCorrection;
+ float fontSize = chunk.font().size();
+ float ascender = chunk.font().getFont().getFontDescriptor(BaseFont.ASCENT, fontSize);
+ float descender = chunk.font().getFont().getFontDescriptor(BaseFont.DESCENT, fontSize);
+ PdfAnnotation annot = PdfFormField.shallowDuplicate((PdfAnnotation)chunk.getAttribute(Chunk.PDFANNOTATION));
+ annot.put(PdfName.RECT, new PdfRectangle(xMarker, yMarker + descender, xMarker + width - subtract, yMarker + ascender));
+ text.addAnnotation(annot);
+ }
+ float params[] = (float[])chunk.getAttribute(Chunk.SKEW);
+ Float hs = (Float)chunk.getAttribute(Chunk.HSCALE);
+ if (params != null || hs != null) {
+ float b = 0, c = 0;
+ if (params != null) {
+ b = params[0];
+ c = params[1];
+ }
+ if (hs != null)
+ hScale = hs.floatValue();
+ text.setTextMatrix(hScale, b, c, 1, xMarker, yMarker);
+ }
+ if (chunk.isImage()) {
+ Image image = chunk.getImage();
+ float matrix[] = image.matrix();
+ matrix[Image.CX] = xMarker + chunk.getImageOffsetX() - matrix[Image.CX];
+ matrix[Image.CY] = yMarker + chunk.getImageOffsetY() - matrix[Image.CY];
+ graphics.addImage(image, matrix[0], matrix[1], matrix[2], matrix[3], matrix[4], matrix[5]);
+ text.moveText(xMarker + lastBaseFactor + image.scaledWidth() - text.getXTLM(), 0);
+ }
+ }
+ xMarker += width;
+ ++chunkStrokeIdx;
+ }
+
+ if (chunk.font().compareTo(currentFont) != 0) {
+ currentFont = chunk.font();
+ text.setFontAndSize(currentFont.getFont(), currentFont.size());
+ }
+ float rise = 0;
+ Object textRender[] = (Object[])chunk.getAttribute(Chunk.TEXTRENDERMODE);
+ int tr = 0;
+ float strokeWidth = 1;
+ Color strokeColor = null;
+ Float fr = (Float)chunk.getAttribute(Chunk.SUBSUPSCRIPT);
+ if (textRender != null) {
+ tr = ((Integer)textRender[0]).intValue() & 3;
+ if (tr != PdfContentByte.TEXT_RENDER_MODE_FILL)
+ text.setTextRenderingMode(tr);
+ if (tr == PdfContentByte.TEXT_RENDER_MODE_STROKE || tr == PdfContentByte.TEXT_RENDER_MODE_FILL_STROKE) {
+ strokeWidth = ((Float)textRender[1]).floatValue();
+ if (strokeWidth != 1)
+ text.setLineWidth(strokeWidth);
+ strokeColor = (Color)textRender[2];
+ if (strokeColor == null)
+ strokeColor = color;
+ if (strokeColor != null)
+ text.setColorStroke(strokeColor);
+ }
+ }
+ if (fr != null)
+ rise = fr.floatValue();
+ if (color != null)
+ text.setColorFill(color);
+ if (rise != 0)
+ text.setTextRise(rise);
+ if (chunk.isImage()) {
+ adjustMatrix = true;
+ }
+ // If it is a CJK chunk or Unicode TTF we will have to simulate the
+ // space adjustment.
+ else if (isJustified && numberOfSpaces > 0 && chunk.isSpecialEncoding()) {
+ if (hScale != lastHScale) {
+ lastHScale = hScale;
+ text.setWordSpacing(baseWordSpacing / hScale);
+ text.setCharacterSpacing(baseCharacterSpacing / hScale);
+ }
+ String s = chunk.toString();
+ int idx = s.indexOf(' ');
+ if (idx < 0)
+ text.showText(chunk.toString());
+ else {
+ float spaceCorrection = - baseWordSpacing * 1000f / chunk.font.size() / hScale;
+ PdfTextArray textArray = new PdfTextArray(s.substring(0, idx));
+ int lastIdx = idx;
+ while ((idx = s.indexOf(' ', lastIdx + 1)) >= 0) {
+ textArray.add(spaceCorrection);
+ textArray.add(s.substring(lastIdx, idx));
+ lastIdx = idx;
+ }
+ textArray.add(spaceCorrection);
+ textArray.add(s.substring(lastIdx));
+ text.showText(textArray);
+ }
+ }
+ else {
+ if (isJustified && hScale != lastHScale) {
+ lastHScale = hScale;
+ text.setWordSpacing(baseWordSpacing / hScale);
+ text.setCharacterSpacing(baseCharacterSpacing / hScale);
+ }
+ text.showText(chunk.toString());
+ }
+
+ if (rise != 0)
+ text.setTextRise(0);
+ if (color != null)
+ text.resetRGBColorFill();
+ if (tr != PdfContentByte.TEXT_RENDER_MODE_FILL)
+ text.setTextRenderingMode(PdfContentByte.TEXT_RENDER_MODE_FILL);
+ if (strokeColor != null)
+ text.resetRGBColorStroke();
+ if (strokeWidth != 1)
+ text.setLineWidth(1);
+ if (chunk.isAttribute(Chunk.SKEW) || chunk.isAttribute(Chunk.HSCALE)) {
+ adjustMatrix = true;
+ text.setTextMatrix(xMarker, yMarker);
+ }
+ }
+ if (isJustified) {
+ text.setWordSpacing(0);
+ text.setCharacterSpacing(0);
+ if (line.isNewlineSplit())
+ lastBaseFactor = 0;
+ }
+ if (adjustMatrix)
+ text.moveText(baseXMarker - text.getXTLM(), 0);
+ currentValues[0] = currentFont;
+ currentValues[1] = new Float(lastBaseFactor);
+ }
+
+ /**
+ * Implements a link to other part of the document. The jump will
+ * be made to a local destination with the same name, that must exist.
+ * @param name the name for this link
+ * @param llx the lower left x corner of the activation area
+ * @param lly the lower left y corner of the activation area
+ * @param urx the upper right x corner of the activation area
+ * @param ury the upper right y corner of the activation area
+ */
+ void localGoto(String name, float llx, float lly, float urx, float ury) {
+ PdfAction action = getLocalGotoAction(name);
+ annotations.add(new PdfAnnotation(writer, llx, lly, urx, ury, action));
+ }
+
+ PdfAction getLocalGotoAction(String name) {
+ PdfAction action;
+ Object obj[] = (Object[])localDestinations.get(name);
+ if (obj == null)
+ obj = new Object[3];
+ if (obj[0] == null) {
+ if (obj[1] == null) {
+ obj[1] = writer.getPdfIndirectReference();
+ }
+ action = new PdfAction((PdfIndirectReference)obj[1]);
+ obj[0] = action;
+ localDestinations.put(name, obj);
+ }
+ else {
+ action = (PdfAction)obj[0];
+ }
+ return action;
+ }
+
+ /**
+ * The local destination to where a local goto with the same
+ * name will jump to.
+ * @param name the name of this local destination
+ * @param destination the <CODE>PdfDestination</CODE> with the jump coordinates
+ * @return <CODE>true</CODE> if the local destination was added,
+ * <CODE>false</CODE> if a local destination with the same name
+ * already existed
+ */
+ boolean localDestination(String name, PdfDestination destination) {
+ Object obj[] = (Object[])localDestinations.get(name);
+ if (obj == null)
+ obj = new Object[3];
+ if (obj[2] != null)
+ return false;
+ obj[2] = destination;
+ localDestinations.put(name, obj);
+ destination.addPage(writer.getCurrentPage());
+ return true;
+ }
+
+ /**
+ * Implements a link to another document.
+ * @param filename the filename for the remote document
+ * @param name the name to jump to
+ * @param llx the lower left x corner of the activation area
+ * @param lly the lower left y corner of the activation area
+ * @param urx the upper right x corner of the activation area
+ * @param ury the upper right y corner of the activation area
+ */
+ void remoteGoto(String filename, String name, float llx, float lly, float urx, float ury) {
+ annotations.add(new PdfAnnotation(writer, llx, lly, urx, ury, new PdfAction(filename, name)));
+ }
+
+ /**
+ * Implements a link to another document.
+ * @param filename the filename for the remote document
+ * @param page the page to jump to
+ * @param llx the lower left x corner of the activation area
+ * @param lly the lower left y corner of the activation area
+ * @param urx the upper right x corner of the activation area
+ * @param ury the upper right y corner of the activation area
+ */
+ void remoteGoto(String filename, int page, float llx, float lly, float urx, float ury) {
+ writer.addAnnotation(new PdfAnnotation(writer, llx, lly, urx, ury, new PdfAction(filename, page)));
+ }
+
+ /** Sets the viewer preferences as the sum of several constants.
+ * @param preferences the viewer preferences
+ * @see PdfWriter#setViewerPreferences
+ */
+
+ public void setViewerPreferences(int preferences) {
+ viewerPreferences |= preferences;
+ }
+
+ /** Implements an action in an area.
+ * @param action the <CODE>PdfAction</CODE>
+ * @param llx the lower left x corner of the activation area
+ * @param lly the lower left y corner of the activation area
+ * @param urx the upper right x corner of the activation area
+ * @param ury the upper right y corner of the activation area
+ */
+ void setAction(PdfAction action, float llx, float lly, float urx, float ury) {
+ writer.addAnnotation(new PdfAnnotation(writer, llx, lly, urx, ury, action));
+ }
+
+ void setOpenAction(String name) {
+ openActionName = name;
+ openActionAction = null;
+ }
+
+ void setOpenAction(PdfAction action) {
+ openActionAction = action;
+ openActionName = null;
+ }
+
+ void addAdditionalAction(PdfName actionType, PdfAction action) {
+ if (additionalActions == null) {
+ additionalActions = new PdfDictionary();
+ }
+ if (action == null)
+ additionalActions.remove(actionType);
+ else
+ additionalActions.put(actionType, action);
+ if (additionalActions.size() == 0)
+ additionalActions = null;
+ }
+
+ void setPageLabels(PdfPageLabels pageLabels) {
+ this.pageLabels = pageLabels;
+ }
+
+ void addJavaScript(PdfAction js) {
+ if (js.get(PdfName.JS) == null)
+ throw new RuntimeException("Only JavaScript actions are allowed.");
+ try {
+ documentJavaScript.add(writer.addToBody(js).getIndirectReference());
+ }
+ catch (IOException e) {
+ throw new ExceptionConverter(e);
+ }
+ }
+
+ void setCropBoxSize(Rectangle crop) {
+ setBoxSize("crop", crop);
+ }
+
+ void setBoxSize(String boxName, Rectangle size) {
+ if (size == null)
+ boxSize.remove(boxName);
+ else
+ boxSize.put(boxName, new PdfRectangle(size));
+ }
+
+ void addCalculationOrder(PdfFormField formField) {
+ acroForm.addCalculationOrder(formField);
+ }
+
+ /**
+ * Gives the size of a trim, art, crop or bleed box, or null if not defined.
+ * @param boxName crop, trim, art or bleed
+ */
+ Rectangle getBoxSize(String boxName) {
+ PdfRectangle r = (PdfRectangle)thisBoxSize.get(boxName);
+ if (r != null) return r.getRectangle();
+ return null;
+ }
+
+ void setSigFlags(int f) {
+ acroForm.setSigFlags(f);
+ }
+
+ void addFormFieldRaw(PdfFormField field) {
+ annotations.add(field);
+ ArrayList kids = field.getKids();
+ if (kids != null) {
+ for (int k = 0; k < kids.size(); ++k)
+ addFormFieldRaw((PdfFormField)kids.get(k));
+ }
+ }
+
+ void addAnnotation(PdfAnnotation annot) {
+ pageEmpty = false;
+ if (annot.isForm()) {
+ PdfFormField field = (PdfFormField)annot;
+ if (field.getParent() == null)
+ addFormFieldRaw(field);
+ }
+ else
+ annotations.add(annot);
+ }
+
+ /**
+ * Sets the display duration for the page (for presentations)
+ * @param seconds the number of seconds to display the page
+ */
+ void setDuration(int seconds) {
+ if (seconds > 0)
+ this.duration=seconds;
+ else
+ this.duration=-1;
+ }
+
+ /**
+ * Sets the transition for the page
+ * @param transition the PdfTransition object
+ */
+ void setTransition(PdfTransition transition) {
+ this.transition=transition;
+ }
+
+ void setPageAction(PdfName actionType, PdfAction action) {
+ if (pageAA == null) {
+ pageAA = new PdfDictionary();
+ }
+ pageAA.put(actionType, action);
+ }
+
+ /** Getter for property strictImageSequence.
+ * @return Value of property strictImageSequence.
+ *
+ */
+ boolean isStrictImageSequence() {
+ return this.strictImageSequence;
+ }
+
+ /** Setter for property strictImageSequence.
+ * @param strictImageSequence New value of property strictImageSequence.
+ *
+ */
+ void setStrictImageSequence(boolean strictImageSequence) {
+ this.strictImageSequence = strictImageSequence;
+ }
+
+ void setPageEmpty(boolean pageEmpty) {
+ this.pageEmpty = pageEmpty;
+ }
+ /**
+ * Method added by Pelikan Stephan
+ * @see com.lowagie.text.DocListener#clearTextWrap()
+ */
+ public void clearTextWrap() throws DocumentException {
+ super.clearTextWrap();
+ float tmpHeight = imageEnd - currentHeight;
+ if (line != null) {
+ tmpHeight += line.height();
+ }
+ if ((imageEnd > -1) && (tmpHeight > 0)) {
+ carriageReturn();
+ currentHeight += tmpHeight;
+ }
+ }
+
+ ArrayList getDocumentJavaScript() {
+ return documentJavaScript;
+ }
+
+ /**
+ * @see com.lowagie.text.DocListener#setMarginMirroring(boolean)
+ */
+ public boolean setMarginMirroring(boolean MarginMirroring) {
+ if (writer != null && writer.isPaused()) {
+ return false;
+ }
+ return super.setMarginMirroring(MarginMirroring);
+ }
+
+ void setThumbnail(Image image) throws PdfException, DocumentException {
+ thumb = writer.getImageReference(writer.addDirectImageSimple(image));
+ }
+
+ void addFileAttachment(String description, PdfFileSpecification fs) throws IOException {
+ if (description == null)
+ description = "";
+ fs.put(PdfName.DESC, new PdfString(description, PdfObject.TEXT_UNICODE));
+ if (description.length() == 0)
+ description = "Unnamed";
+ String fn = PdfEncodings.convertToString(new PdfString(description, PdfObject.TEXT_UNICODE).getBytes(), null);
+ int k = 0;
+ while (documentFileAttachment.containsKey(fn)) {
+ ++k;
+ fn = PdfEncodings.convertToString(new PdfString(description + " " + k, PdfObject.TEXT_UNICODE).getBytes(), null);
+ }
+ documentFileAttachment.put(fn, fs.getReference());
+ }
+
+ HashMap getDocumentFileAttachment() {
+ return documentFileAttachment;
+ }
+
+ static PdfAnnotation convertAnnotation(PdfWriter writer, Annotation annot) throws IOException {
+ switch(annot.annotationType()) {
+ case Annotation.URL_NET:
+ return new PdfAnnotation(writer, annot.llx(), annot.lly(), annot.urx(), annot.ury(), new PdfAction((URL) annot.attributes().get(Annotation.URL)));
+ case Annotation.URL_AS_STRING:
+ return new PdfAnnotation(writer, annot.llx(), annot.lly(), annot.urx(), annot.ury(), new PdfAction((String) annot.attributes().get(Annotation.FILE)));
+ case Annotation.FILE_DEST:
+ return new PdfAnnotation(writer, annot.llx(), annot.lly(), annot.urx(), annot.ury(), new PdfAction((String) annot.attributes().get(Annotation.FILE), (String) annot.attributes().get(Annotation.DESTINATION)));
+ case Annotation.SCREEN:
+ boolean sparams[] = (boolean[])annot.attributes().get(Annotation.PARAMETERS);
+ String fname = (String) annot.attributes().get(Annotation.FILE);
+ String mimetype = (String) annot.attributes().get(Annotation.MIMETYPE);
+ PdfFileSpecification fs;
+ if (sparams[0])
+ fs = PdfFileSpecification.fileEmbedded(writer, fname, fname, null);
+ else
+ fs = PdfFileSpecification.fileExtern(writer, fname);
+ PdfAnnotation ann = PdfAnnotation.createScreen(writer, new Rectangle(annot.llx(), annot.lly(), annot.urx(), annot.ury()),
+ fname, fs, mimetype, sparams[1]);
+ return ann;
+ case Annotation.FILE_PAGE:
+ return new PdfAnnotation(writer, annot.llx(), annot.lly(), annot.urx(), annot.ury(), new PdfAction((String) annot.attributes().get(Annotation.FILE), ((Integer) annot.attributes().get(Annotation.PAGE)).intValue()));
+ case Annotation.NAMED_DEST:
+ return new PdfAnnotation(writer, annot.llx(), annot.lly(), annot.urx(), annot.ury(), new PdfAction(((Integer) annot.attributes().get(Annotation.NAMED)).intValue()));
+ case Annotation.LAUNCH:
+ return new PdfAnnotation(writer, annot.llx(), annot.lly(), annot.urx(), annot.ury(), new PdfAction((String) annot.attributes().get(Annotation.APPLICATION),(String) annot.attributes().get(Annotation.PARAMETERS),(String) annot.attributes().get(Annotation.OPERATION),(String) annot.attributes().get(Annotation.DEFAULTDIR)));
+ default:
+ PdfDocument doc = writer.getPdfDocument();
+ if (doc.line == null)
+ return null;
+ PdfAnnotation an = new PdfAnnotation(writer, annot.llx(doc.indentRight() - doc.line.widthLeft()), annot.lly(doc.indentTop() - doc.currentHeight), annot.urx(doc.indentRight() - doc.line.widthLeft() + 20), annot.ury(doc.indentTop() - doc.currentHeight - 20), new PdfString(annot.title()), new PdfString(annot.content()));
+ return an;
+ }
+ }
+ /**
+ * @return an XmpMetadata byte array
+ */
+ public byte[] createXmpMetadata() {
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ try {
+ XmpWriter xmp = new XmpWriter(baos, getInfo());
+ xmp.close();
+ }
+ catch(IOException ioe) {
+ ioe.printStackTrace();
+ }
+ return baos.toByteArray();
+ }
+
+ int getMarkPoint() {
+ return markPoint;
+ }
+
+ void incMarkPoint() {
+ ++markPoint;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/pdf/PdfEncodings.java b/src/main/java/com/lowagie/text/pdf/PdfEncodings.java
new file mode 100644
index 0000000..ab9c468
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/PdfEncodings.java
@@ -0,0 +1,716 @@
+/*
+ * Copyright 2002 Paulo Soares
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf;
+import com.lowagie.text.ExceptionConverter;
+import java.io.UnsupportedEncodingException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.BufferedReader;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.StringTokenizer;
+/** Supports fast encodings for winansi and PDFDocEncoding.
+ * Supports conversions from CJK encodings to CID.
+ * Supports custom encodings.
+ * @author Paulo Soares (psoares@consiste.pt)
+ */
+public class PdfEncodings {
+ protected static final int CIDNONE = 0;
+ protected static final int CIDRANGE = 1;
+ protected static final int CIDCHAR = 2;
+
+ static final char winansiByteToChar[] = {
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
+ 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
+ 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
+ 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
+ 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
+ 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,
+ 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
+ 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127,
+ 8364, 65533, 8218, 402, 8222, 8230, 8224, 8225, 710, 8240, 352, 8249, 338, 65533, 381, 65533,
+ 65533, 8216, 8217, 8220, 8221, 8226, 8211, 8212, 732, 8482, 353, 8250, 339, 65533, 382, 376,
+ 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175,
+ 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191,
+ 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207,
+ 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223,
+ 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239,
+ 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255};
+
+ static final char pdfEncodingByteToChar[] = {
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
+ 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
+ 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
+ 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
+ 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
+ 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,
+ 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
+ 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127,
+ 0x2022, 0x2020, 0x2021, 0x2026, 0x2014, 0x2013, 0x0192, 0x2044, 0x2039, 0x203a, 0x2212, 0x2030, 0x201e, 0x201c, 0x201d, 0x2018,
+ 0x2019, 0x201a, 0x2122, 0xfb01, 0xfb02, 0x0141, 0x0152, 0x0160, 0x0178, 0x017d, 0x0131, 0x0142, 0x0153, 0x0161, 0x017e, 65533,
+ 0x20ac, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175,
+ 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191,
+ 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207,
+ 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223,
+ 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239,
+ 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255};
+
+ static final IntHashtable winansi = new IntHashtable();
+
+ static final IntHashtable pdfEncoding = new IntHashtable();
+
+ static final HashMap extraEncodings = new HashMap();
+
+ static {
+ for (int k = 128; k < 160; ++k) {
+ char c = winansiByteToChar[k];
+ if (c != 65533)
+ winansi.put(c, k);
+ }
+
+ for (int k = 128; k < 161; ++k) {
+ char c = pdfEncodingByteToChar[k];
+ if (c != 65533)
+ pdfEncoding.put(c, k);
+ }
+
+ addExtraEncoding("Wingdings", new WingdingsConversion());
+ addExtraEncoding("Symbol", new SymbolConversion(true));
+ addExtraEncoding("ZapfDingbats", new SymbolConversion(false));
+ addExtraEncoding("SymbolTT", new SymbolTTConversion());
+ addExtraEncoding("Cp437", new Cp437Conversion());
+ }
+
+ /** Converts a <CODE>String</CODE> to a </CODE>byte</CODE> array according
+ * to the font's encoding.
+ * @return an array of <CODE>byte</CODE> representing the conversion according to the font's encoding
+ * @param encoding the encoding
+ * @param text the <CODE>String</CODE> to be converted
+ */
+ public static final byte[] convertToBytes(String text, String encoding) {
+ if (text == null)
+ return new byte[0];
+ if (encoding == null || encoding.length() == 0) {
+ int len = text.length();
+ byte b[] = new byte[len];
+ for (int k = 0; k < len; ++k)
+ b[k] = (byte)text.charAt(k);
+ return b;
+ }
+ ExtraEncoding extra = null;
+ synchronized (extraEncodings) {
+ extra = (ExtraEncoding)extraEncodings.get(encoding.toLowerCase());
+ }
+ if (extra != null) {
+ byte b[] = extra.charToByte(text, encoding);
+ if (b != null)
+ return b;
+ }
+ IntHashtable hash = null;
+ if (encoding.equals(BaseFont.WINANSI))
+ hash = winansi;
+ else if (encoding.equals(PdfObject.TEXT_PDFDOCENCODING))
+ hash = pdfEncoding;
+ if (hash != null) {
+ char cc[] = text.toCharArray();
+ int len = cc.length;
+ int ptr = 0;
+ byte b[] = new byte[len];
+ int c = 0;
+ for (int k = 0; k < len; ++k) {
+ char char1 = cc[k];
+ if (char1 < 128 || (char1 >= 160 && char1 <= 255))
+ c = char1;
+ else
+ c = hash.get(char1);
+ if (c != 0)
+ b[ptr++] = (byte)c;
+ }
+ if (ptr == len)
+ return b;
+ byte b2[] = new byte[ptr];
+ System.arraycopy(b, 0, b2, 0, ptr);
+ return b2;
+ }
+ if (encoding.equals(PdfObject.TEXT_UNICODE)) {
+ // workaround for jdk 1.2.2 bug
+ char cc[] = text.toCharArray();
+ int len = cc.length;
+ byte b[] = new byte[cc.length * 2 + 2];
+ b[0] = -2;
+ b[1] = -1;
+ int bptr = 2;
+ for (int k = 0; k < len; ++k) {
+ char c = cc[k];
+ b[bptr++] = (byte)(c >> 8);
+ b[bptr++] = (byte)(c & 0xff);
+ }
+ return b;
+ }
+ try {
+ return text.getBytes(encoding);
+ }
+ catch (UnsupportedEncodingException e) {
+ throw new ExceptionConverter(e);
+ }
+ }
+
+ /** Converts a </CODE>byte</CODE> array to a <CODE>String</CODE> according
+ * to the some encoding.
+ * @param bytes the bytes to convert
+ * @param encoding the encoding
+ * @return the converted <CODE>String</CODE>
+ */
+ public static final String convertToString(byte bytes[], String encoding) {
+ if (bytes == null)
+ return PdfObject.NOTHING;
+ if (encoding == null || encoding.length() == 0) {
+ char c[] = new char[bytes.length];
+ for (int k = 0; k < bytes.length; ++k)
+ c[k] = (char)(bytes[k] & 0xff);
+ return new String(c);
+ }
+ ExtraEncoding extra = null;
+ synchronized (extraEncodings) {
+ extra = (ExtraEncoding)extraEncodings.get(encoding.toLowerCase());
+ }
+ if (extra != null) {
+ String text = extra.byteToChar(bytes, encoding);
+ if (text != null)
+ return text;
+ }
+ char ch[] = null;
+ if (encoding.equals(BaseFont.WINANSI))
+ ch = winansiByteToChar;
+ else if (encoding.equals(PdfObject.TEXT_PDFDOCENCODING))
+ ch = pdfEncodingByteToChar;
+ if (ch != null) {
+ int len = bytes.length;
+ char c[] = new char[len];
+ for (int k = 0; k < len; ++k) {
+ c[k] = ch[bytes[k] & 0xff];
+ }
+ return new String(c);
+ }
+ try {
+ return new String(bytes, encoding);
+ }
+ catch (UnsupportedEncodingException e) {
+ throw new ExceptionConverter(e);
+ }
+ }
+
+ /** Checks is <CODE>text</CODE> only has PdfDocEncoding characters.
+ * @param text the <CODE>String</CODE> to test
+ * @return <CODE>true</CODE> if only PdfDocEncoding characters are present
+ */
+ public static boolean isPdfDocEncoding(String text) {
+ if (text == null)
+ return true;
+ int len = text.length();
+ for (int k = 0; k < len; ++k) {
+ char char1 = text.charAt(k);
+ if (char1 < 128 || (char1 >= 160 && char1 <= 255))
+ continue;
+ if (!pdfEncoding.containsKey(char1))
+ return false;
+ }
+ return true;
+ }
+
+ static final HashMap cmaps = new HashMap();
+ /** Assumes that '\\n' and '\\r\\n' are the newline sequences. It may not work for
+ * all CJK encodings. To be used with loadCmap().
+ */
+ public static final byte CRLF_CID_NEWLINE[][] = new byte[][]{{(byte)'\n'}, {(byte)'\r', (byte)'\n'}};
+
+ /** Clears the CJK cmaps from the cache. If <CODE>name</CODE> is the
+ * empty string then all the cache is cleared. Calling this method
+ * has no consequences other than the need to reload the cmap
+ * if needed.
+ * @param name the name of the cmap to clear or all the cmaps if the empty string
+ */
+ public static void clearCmap(String name) {
+ synchronized (cmaps) {
+ if (name.length() == 0)
+ cmaps.clear();
+ else
+ cmaps.remove(name);
+ }
+ }
+
+ /** Loads a CJK cmap to the cache with the option of associating
+ * sequences to the newline.
+ * @param name the CJK cmap name
+ * @param newline the sequences to be replaced bi a newline in the resulting CID. See <CODE>CRLF_CID_NEWLINE</CODE>
+ */
+ public static void loadCmap(String name, byte newline[][]) {
+ try {
+ char planes[][] = null;
+ synchronized (cmaps) {
+ planes = (char[][])cmaps.get(name);
+ }
+ if (planes == null) {
+ planes = readCmap(name, newline);
+ synchronized (cmaps) {
+ cmaps.put(name, planes);
+ }
+ }
+ }
+ catch (IOException e) {
+ throw new ExceptionConverter(e);
+ }
+ }
+
+ /** Converts a <CODE>byte</CODE> array encoded as <CODE>name</CODE>
+ * to a CID string. This is needed to reach some CJK characters
+ * that don't exist in 16 bit Unicode.</p>
+ * The font to use this result must use the encoding "Identity-H"
+ * or "Identity-V".</p>
+ * See ftp://ftp.oreilly.com/pub/examples/nutshell/cjkv/adobe/.
+ * @param name the CJK encoding name
+ * @param seq the <CODE>byte</CODE> array to be decoded
+ * @return the CID string
+ */
+ public static String convertCmap(String name, byte seq[]) {
+ return convertCmap(name, seq, 0, seq.length);
+ }
+
+ /** Converts a <CODE>byte</CODE> array encoded as <CODE>name</CODE>
+ * to a CID string. This is needed to reach some CJK characters
+ * that don't exist in 16 bit Unicode.</p>
+ * The font to use this result must use the encoding "Identity-H"
+ * or "Identity-V".</p>
+ * See ftp://ftp.oreilly.com/pub/examples/nutshell/cjkv/adobe/.
+ * @param name the CJK encoding name
+ * @param start the start offset in the data
+ * @param length the number of bytes to convert
+ * @param seq the <CODE>byte</CODE> array to be decoded
+ * @return the CID string
+ */
+ public static String convertCmap(String name, byte seq[], int start, int length) {
+ try {
+ char planes[][] = null;
+ synchronized (cmaps) {
+ planes = (char[][])cmaps.get(name);
+ }
+ if (planes == null) {
+ planes = readCmap(name, (byte[][])null);
+ synchronized (cmaps) {
+ cmaps.put(name, planes);
+ }
+ }
+ return decodeSequence(seq, start, length, planes);
+ }
+ catch (IOException e) {
+ throw new ExceptionConverter(e);
+ }
+ }
+
+ static String decodeSequence(byte seq[], int start, int length, char planes[][]) {
+ StringBuffer buf = new StringBuffer();
+ int end = start + length;
+ int currentPlane = 0;
+ for (int k = start; k < end; ++k) {
+ int one = (int)seq[k] & 0xff;
+ char plane[] = planes[currentPlane];
+ int cid = plane[one];
+ if ((cid & 0x8000) == 0) {
+ buf.append((char)cid);
+ currentPlane = 0;
+ }
+ else
+ currentPlane = cid & 0x7fff;
+ }
+ return buf.toString();
+ }
+
+ static char[][] readCmap(String name, byte newline[][]) throws IOException {
+ ArrayList planes = new ArrayList();
+ planes.add(new char[256]);
+ readCmap(name, planes);
+ if (newline != null) {
+ for (int k = 0; k < newline.length; ++k)
+ encodeSequence(newline[k].length, newline[k], BaseFont.CID_NEWLINE, planes);
+ }
+ char ret[][] = new char[planes.size()][];
+ return (char[][])planes.toArray(ret);
+ }
+
+ static void readCmap(String name, ArrayList planes) throws IOException {
+ String fullName = BaseFont.RESOURCE_PATH + "cmaps/" + name;
+ InputStream in = BaseFont.getResourceStream(fullName);
+ if (in == null)
+ throw new IOException("The Cmap " + name + " was not found.");
+ encodeStream(in, planes);
+ in.close();
+ }
+
+ static void encodeStream(InputStream in, ArrayList planes) throws IOException {
+ BufferedReader rd = new BufferedReader(new InputStreamReader(in, "iso-8859-1"));
+ String line = null;
+ int state = CIDNONE;
+ byte seqs[] = new byte[7];
+ while ((line = rd.readLine()) != null) {
+ if (line.length() < 6)
+ continue;
+ switch (state) {
+ case CIDNONE: {
+ if (line.indexOf("begincidrange") >= 0)
+ state = CIDRANGE;
+ else if (line.indexOf("begincidchar") >= 0)
+ state = CIDCHAR;
+ else if (line.indexOf("usecmap") >= 0) {
+ StringTokenizer tk = new StringTokenizer(line);
+ String t = tk.nextToken();
+ readCmap(t.substring(1), planes);
+ }
+ break;
+ }
+ case CIDRANGE: {
+ if (line.indexOf("endcidrange") >= 0) {
+ state = CIDNONE;
+ break;
+ }
+ StringTokenizer tk = new StringTokenizer(line);
+ String t = tk.nextToken();
+ int size = t.length() / 2 - 1;
+ long start = Long.parseLong(t.substring(1, t.length() - 1), 16);
+ t = tk.nextToken();
+ long end = Long.parseLong(t.substring(1, t.length() - 1), 16);
+ t = tk.nextToken();
+ int cid = Integer.parseInt(t);
+ for (long k = start; k <= end; ++k) {
+ breakLong(k, size, seqs);
+ encodeSequence(size, seqs, (char)cid, planes);
+ ++cid;
+ }
+ break;
+ }
+ case CIDCHAR: {
+ if (line.indexOf("endcidchar") >= 0) {
+ state = CIDNONE;
+ break;
+ }
+ StringTokenizer tk = new StringTokenizer(line);
+ String t = tk.nextToken();
+ int size = t.length() / 2 - 1;
+ long start = Long.parseLong(t.substring(1, t.length() - 1), 16);
+ t = tk.nextToken();
+ int cid = Integer.parseInt(t);
+ breakLong(start, size, seqs);
+ encodeSequence(size, seqs, (char)cid, planes);
+ break;
+ }
+ }
+ }
+ }
+
+ static void breakLong(long n, int size, byte seqs[]) {
+ for (int k = 0; k < size; ++k) {
+ seqs[k] = (byte)(n >> ((size - 1 - k) * 8));
+ }
+ }
+
+ static void encodeSequence(int size, byte seqs[], char cid, ArrayList planes) {
+ --size;
+ int nextPlane = 0;
+ for (int idx = 0; idx < size; ++idx) {
+ char plane[] = (char[])planes.get(nextPlane);
+ int one = (int)seqs[idx] & 0xff;
+ char c = plane[one];
+ if (c != 0 && (c & 0x8000) == 0)
+ throw new RuntimeException("Inconsistent mapping.");
+ if (c == 0) {
+ planes.add(new char[256]);
+ c = (char)((planes.size() - 1) | 0x8000);
+ plane[one] = c;
+ }
+ nextPlane = c & 0x7fff;
+ }
+ char plane[] = (char[])planes.get(nextPlane);
+ int one = (int)seqs[size] & 0xff;
+ char c = plane[one];
+ if ((c & 0x8000) != 0)
+ throw new RuntimeException("Inconsistent mapping.");
+ plane[one] = cid;
+ }
+
+ /** Adds an extra encoding.
+ * @param name the name of the encoding. The encoding recognition is case insensitive
+ * @param enc the conversion class
+ */
+ public static void addExtraEncoding(String name, ExtraEncoding enc) {
+ synchronized (extraEncodings) {
+ extraEncodings.put(name.toLowerCase(), enc);
+ }
+ }
+
+ private static class WingdingsConversion implements ExtraEncoding {
+
+ public byte[] charToByte(String text, String encoding) {
+ char cc[] = text.toCharArray();
+ byte b[] = new byte[cc.length];
+ int ptr = 0;
+ int len = cc.length;
+ for (int k = 0; k < len; ++k) {
+ char c = cc[k];
+ if (c == ' ')
+ b[ptr++] = (byte)c;
+ else if (c >= '\u2701' && c <= '\u27BE') {
+ byte v = table[c - 0x2700];
+ if (v != 0)
+ b[ptr++] = v;
+ }
+ }
+ if (ptr == len)
+ return b;
+ byte b2[] = new byte[ptr];
+ System.arraycopy(b, 0, b2, 0, ptr);
+ return b2;
+ }
+
+ public String byteToChar(byte[] b, String encoding) {
+ return null;
+ }
+
+ private final static byte table[] = {
+ 0, 35, 34, 0, 0, 0, 41, 62, 81, 42,
+ 0, 0, 65, 63, 0, 0, 0, 0, 0, -4,
+ 0, 0, 0, -5, 0, 0, 0, 0, 0, 0,
+ 86, 0, 88, 89, 0, 0, 0, 0, 0, 0,
+ 0, 0, -75, 0, 0, 0, 0, 0, -74, 0,
+ 0, 0, -83, -81, -84, 0, 0, 0, 0, 0,
+ 0, 0, 0, 124, 123, 0, 0, 0, 84, 0,
+ 0, 0, 0, 0, 0, 0, 0, -90, 0, 0,
+ 0, 113, 114, 0, 0, 0, 117, 0, 0, 0,
+ 0, 0, 0, 125, 126, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, -116, -115,
+ -114, -113, -112, -111, -110, -109, -108, -107, -127, -126,
+ -125, -124, -123, -122, -121, -120, -119, -118, -116, -115,
+ -114, -113, -112, -111, -110, -109, -108, -107, -24, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, -24, -40, 0, 0, -60, -58, 0, 0, -16,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, -36,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0
+ };
+ }
+
+ private static class Cp437Conversion implements ExtraEncoding {
+ private static IntHashtable c2b = new IntHashtable();
+
+ public byte[] charToByte(String text, String encoding) {
+ char cc[] = text.toCharArray();
+ byte b[] = new byte[cc.length];
+ int ptr = 0;
+ int len = cc.length;
+ for (int k = 0; k < len; ++k) {
+ char c = cc[k];
+ if (c < ' ')
+ continue;
+ if (c < 128)
+ b[ptr++] = (byte)c;
+ else {
+ byte v = (byte)c2b.get(c);
+ if (v != 0)
+ b[ptr++] = v;
+ }
+ }
+ if (ptr == len)
+ return b;
+ byte b2[] = new byte[ptr];
+ System.arraycopy(b, 0, b2, 0, ptr);
+ return b2;
+ }
+
+ public String byteToChar(byte[] b, String encoding) {
+ int len = b.length;
+ char cc[] = new char[len];
+ int ptr = 0;
+ for (int k = 0; k < len; ++k) {
+ int c = b[k] & 0xff;
+ if (c < ' ')
+ continue;
+ if (c < 128)
+ cc[ptr++] = (char)c;
+ else {
+ char v = table[c - 128];
+ cc[ptr++] = v;
+ }
+ }
+ return new String(cc, 0, ptr);
+ }
+
+ private final static char table[] = {
+ '\u00C7', '\u00FC', '\u00E9', '\u00E2', '\u00E4', '\u00E0', '\u00E5', '\u00E7', '\u00EA', '\u00EB', '\u00E8', '\u00EF', '\u00EE', '\u00EC', '\u00C4', '\u00C5',
+ '\u00C9', '\u00E6', '\u00C6', '\u00F4', '\u00F6', '\u00F2', '\u00FB', '\u00F9', '\u00FF', '\u00D6', '\u00DC', '\u00A2', '\u00A3', '\u00A5', '\u20A7', '\u0192',
+ '\u00E1', '\u00ED', '\u00F3', '\u00FA', '\u00F1', '\u00D1', '\u00AA', '\u00BA', '\u00BF', '\u2310', '\u00AC', '\u00BD', '\u00BC', '\u00A1', '\u00AB', '\u00BB',
+ '\u2591', '\u2592', '\u2593', '\u2502', '\u2524', '\u2561', '\u2562', '\u2556', '\u2555', '\u2563', '\u2551', '\u2557', '\u255D', '\u255C', '\u255B', '\u2510',
+ '\u2514', '\u2534', '\u252C', '\u251C', '\u2500', '\u253C', '\u255E', '\u255F', '\u255A', '\u2554', '\u2569', '\u2566', '\u2560', '\u2550', '\u256C', '\u2567',
+ '\u2568', '\u2564', '\u2565', '\u2559', '\u2558', '\u2552', '\u2553', '\u256B', '\u256A', '\u2518', '\u250C', '\u2588', '\u2584', '\u258C', '\u2590', '\u2580',
+ '\u03B1', '\u00DF', '\u0393', '\u03C0', '\u03A3', '\u03C3', '\u00B5', '\u03C4', '\u03A6', '\u0398', '\u03A9', '\u03B4', '\u221E', '\u03C6', '\u03B5', '\u2229',
+ '\u2261', '\u00B1', '\u2265', '\u2264', '\u2320', '\u2321', '\u00F7', '\u2248', '\u00B0', '\u2219', '\u00B7', '\u221A', '\u207F', '\u00B2', '\u25A0', '\u00A0'
+ };
+
+ static {
+ for (int k = 0; k < table.length; ++k)
+ c2b.put(table[k], k + 128);
+ }
+ }
+
+ private static class SymbolConversion implements ExtraEncoding {
+
+ private static final IntHashtable t1 = new IntHashtable();
+ private static final IntHashtable t2 = new IntHashtable();
+ private IntHashtable translation;
+
+ SymbolConversion(boolean symbol) {
+ if (symbol)
+ translation = t1;
+ else
+ translation = t2;
+ }
+
+ public byte[] charToByte(String text, String encoding) {
+ char cc[] = text.toCharArray();
+ byte b[] = new byte[cc.length];
+ int ptr = 0;
+ int len = cc.length;
+ for (int k = 0; k < len; ++k) {
+ char c = cc[k];
+ byte v = (byte)translation.get((int)c);
+ if (v != 0)
+ b[ptr++] = v;
+ }
+ if (ptr == len)
+ return b;
+ byte b2[] = new byte[ptr];
+ System.arraycopy(b, 0, b2, 0, ptr);
+ return b2;
+ }
+
+ public String byteToChar(byte[] b, String encoding) {
+ return null;
+ }
+
+ private final static char table1[] = {
+ ' ','!','\u2200','#','\u2203','%','&','\u220b','(',')','*','+',',','-','.','/',
+ '0','1','2','3','4','5','6','7','8','9',':',';','<','=','>','?',
+ '\u2245','\u0391','\u0392','\u03a7','\u0394','\u0395','\u03a6','\u0393','\u0397','\u0399','\u03d1','\u039a','\u039b','\u039c','\u039d','\u039f',
+ '\u03a0','\u0398','\u03a1','\u03a3','\u03a4','\u03a5','\u03c2','\u03a9','\u039e','\u03a8','\u0396','[','\u2234',']','\u22a5','_',
+ '\u0305','\u03b1','\u03b2','\u03c7','\u03b4','\u03b5','\u03d5','\u03b3','\u03b7','\u03b9','\u03c6','\u03ba','\u03bb','\u03bc','\u03bd','\u03bf',
+ '\u03c0','\u03b8','\u03c1','\u03c3','\u03c4','\u03c5','\u03d6','\u03c9','\u03be','\u03c8','\u03b6','{','|','}','~','\0',
+ '\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0',
+ '\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0',
+ '\u20ac','\u03d2','\u2032','\u2264','\u2044','\u221e','\u0192','\u2663','\u2666','\u2665','\u2660','\u2194','\u2190','\u2191','\u2192','\u2193',
+ '\u00b0','\u00b1','\u2033','\u2265','\u00d7','\u221d','\u2202','\u2022','\u00f7','\u2260','\u2261','\u2248','\u2026','\u2502','\u2500','\u21b5',
+ '\u2135','\u2111','\u211c','\u2118','\u2297','\u2295','\u2205','\u2229','\u222a','\u2283','\u2287','\u2284','\u2282','\u2286','\u2208','\u2209',
+ '\u2220','\u2207','\u00ae','\u00a9','\u2122','\u220f','\u221a','\u2022','\u00ac','\u2227','\u2228','\u21d4','\u21d0','\u21d1','\u21d2','\u21d3',
+ '\u25ca','\u2329','\0','\0','\0','\u2211','\u239b','\u239c','\u239d','\u23a1','\u23a2','\u23a3','\u23a7','\u23a8','\u23a9','\u23aa',
+ '\0','\u232a','\u222b','\u2320','\u23ae','\u2321','\u239e','\u239f','\u23a0','\u23a4','\u23a5','\u23a6','\u23ab','\u23ac','\u23ad','\0'
+ };
+
+ private final static char table2[] = {
+ '\u0020','\u2701','\u2702','\u2703','\u2704','\u260e','\u2706','\u2707','\u2708','\u2709','\u261b','\u261e','\u270C','\u270D','\u270E','\u270F',
+ '\u2710','\u2711','\u2712','\u2713','\u2714','\u2715','\u2716','\u2717','\u2718','\u2719','\u271A','\u271B','\u271C','\u271D','\u271E','\u271F',
+ '\u2720','\u2721','\u2722','\u2723','\u2724','\u2725','\u2726','\u2727','\u2605','\u2729','\u272A','\u272B','\u272C','\u272D','\u272E','\u272F',
+ '\u2730','\u2731','\u2732','\u2733','\u2734','\u2735','\u2736','\u2737','\u2738','\u2739','\u273A','\u273B','\u273C','\u273D','\u273E','\u273F',
+ '\u2740','\u2741','\u2742','\u2743','\u2744','\u2745','\u2746','\u2747','\u2748','\u2749','\u274A','\u274B','\u25cf','\u274D','\u25a0','\u274F',
+ '\u2750','\u2751','\u2752','\u25b2','\u25bc','\u25c6','\u2756','\u25d7','\u2758','\u2759','\u275A','\u275B','\u275C','\u275D','\u275E','\u0000',
+ '\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0',
+ '\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0',
+ '\u0000','\u2761','\u2762','\u2763','\u2764','\u2765','\u2766','\u2767','\u2663','\u2666','\u2665','\u2660','\u2460','\u2461','\u2462','\u2463',
+ '\u2464','\u2465','\u2466','\u2467','\u2468','\u2469','\u2776','\u2777','\u2778','\u2779','\u277A','\u277B','\u277C','\u277D','\u277E','\u277F',
+ '\u2780','\u2781','\u2782','\u2783','\u2784','\u2785','\u2786','\u2787','\u2788','\u2789','\u278A','\u278B','\u278C','\u278D','\u278E','\u278F',
+ '\u2790','\u2791','\u2792','\u2793','\u2794','\u2192','\u2194','\u2195','\u2798','\u2799','\u279A','\u279B','\u279C','\u279D','\u279E','\u279F',
+ '\u27A0','\u27A1','\u27A2','\u27A3','\u27A4','\u27A5','\u27A6','\u27A7','\u27A8','\u27A9','\u27AA','\u27AB','\u27AC','\u27AD','\u27AE','\u27AF',
+ '\u0000','\u27B1','\u27B2','\u27B3','\u27B4','\u27B5','\u27B6','\u27B7','\u27B8','\u27B9','\u27BA','\u27BB','\u27BC','\u27BD','\u27BE','\u0000'
+ };
+
+ static {
+ for (int k = 0; k < table1.length; ++k) {
+ int v = (int)table1[k];
+ if (v != 0)
+ t1.put(v, k + 32);
+ }
+ for (int k = 0; k < table2.length; ++k) {
+ int v = (int)table2[k];
+ if (v != 0)
+ t2.put(v, k + 32);
+ }
+ }
+ }
+
+ private static class SymbolTTConversion implements ExtraEncoding {
+
+ public byte[] charToByte(String text, String encoding) {
+ char ch[] = text.toCharArray();
+ byte b[] = new byte[ch.length];
+ int ptr = 0;
+ int len = ch.length;
+ for (int k = 0; k < len; ++k) {
+ char c = ch[k];
+ if ((c & 0xff00) == 0 || (c & 0xff00) == 0xf000)
+ b[ptr++] = (byte)c;
+ }
+ if (ptr == len)
+ return b;
+ byte b2[] = new byte[ptr];
+ System.arraycopy(b, 0, b2, 0, ptr);
+ return b2;
+ }
+
+ public String byteToChar(byte[] b, String encoding) {
+ return null;
+ }
+
+ }
+}
diff --git a/src/main/java/com/lowagie/text/pdf/PdfEncryption.java b/src/main/java/com/lowagie/text/pdf/PdfEncryption.java
new file mode 100644
index 0000000..18046a8
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/PdfEncryption.java
@@ -0,0 +1,390 @@
+/*
+ * $Id: PdfEncryption.java,v 1.54 2006/05/03 11:35:12 psoares33 Exp $
+ * $Name: $
+ *
+ * Copyright 2001, 2002 Paulo Soares
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf;
+
+import java.security.MessageDigest;
+import com.lowagie.text.ExceptionConverter;
+
+/**
+ *
+ * @author Paulo Soares (psoares@consiste.pt)
+ * @author Kazuya Ujihara
+ */
+public class PdfEncryption {
+
+ static final byte pad[] = {
+ (byte)0x28, (byte)0xBF, (byte)0x4E, (byte)0x5E, (byte)0x4E, (byte)0x75,
+ (byte)0x8A, (byte)0x41, (byte)0x64, (byte)0x00, (byte)0x4E, (byte)0x56,
+ (byte)0xFF, (byte)0xFA, (byte)0x01, (byte)0x08, (byte)0x2E, (byte)0x2E,
+ (byte)0x00, (byte)0xB6, (byte)0xD0, (byte)0x68, (byte)0x3E, (byte)0x80,
+ (byte)0x2F, (byte)0x0C, (byte)0xA9, (byte)0xFE, (byte)0x64, (byte)0x53,
+ (byte)0x69, (byte)0x7A};
+
+ byte state[] = new byte[256];
+ int x;
+ int y;
+ /** The encryption key for a particular object/generation */
+ byte key[];
+ /** The encryption key length for a particular object/generation */
+ int keySize;
+ /** The global encryption key */
+ byte mkey[];
+ /** Work area to prepare the object/generation bytes */
+ byte extra[] = new byte[5];
+ /** The message digest algorithm MD5 */
+ MessageDigest md5;
+ /** The encryption key for the owner */
+ byte ownerKey[] = new byte[32];
+ /** The encryption key for the user */
+ byte userKey[] = new byte[32];
+ int permissions;
+ byte documentID[];
+ static long seq = System.currentTimeMillis();
+
+ public PdfEncryption() {
+ try {
+ md5 = MessageDigest.getInstance("MD5");
+ }
+ catch (Exception e) {
+ throw new ExceptionConverter(e);
+ }
+ }
+
+ public PdfEncryption(PdfEncryption enc) {
+ this();
+ mkey = (byte[])enc.mkey.clone();
+ ownerKey = (byte[])enc.ownerKey.clone();
+ userKey = (byte[])enc.userKey.clone();
+ permissions = enc.permissions;
+ if (enc.documentID != null)
+ documentID = (byte[])enc.documentID.clone();
+ }
+
+ /**
+ */
+ private byte[] padPassword(byte userPassword[]) {
+ byte userPad[] = new byte[32];
+ if (userPassword == null) {
+ System.arraycopy(pad, 0, userPad, 0, 32);
+ }
+ else {
+ System.arraycopy(userPassword, 0, userPad, 0, Math.min(userPassword.length, 32));
+ if (userPassword.length < 32)
+ System.arraycopy(pad, 0, userPad, userPassword.length, 32 - userPassword.length);
+ }
+
+ return userPad;
+ }
+
+ /**
+ */
+ private byte[] computeOwnerKey(byte userPad[], byte ownerPad[], int keylength, int revision) {
+ byte ownerKey[] = new byte[32];
+
+ byte digest[] = md5.digest(ownerPad);
+ if (revision == 3) {
+ byte mkey[] = new byte[keylength/8];
+ // only use for the input as many bit as the key consists of
+ for (int k = 0; k < 50; ++k)
+ System.arraycopy(md5.digest(), 0, digest, 0, mkey.length);
+ System.arraycopy(userPad, 0, ownerKey, 0, 32);
+ for (int i = 0; i < 20; ++i) {
+ for (int j = 0; j < mkey.length ; ++j)
+ mkey[j] = (byte)(digest[j] ^ i);
+ prepareRC4Key(mkey);
+ encryptRC4(ownerKey);
+ }
+ }
+ else {
+ prepareRC4Key(digest, 0, 5);
+ encryptRC4(userPad, ownerKey);
+ }
+
+ return ownerKey;
+ }
+
+ /**
+ *
+ * ownerKey, documentID must be setuped
+ */
+ private void setupGlobalEncryptionKey(byte[] documentID, byte userPad[], byte ownerKey[], int permissions, int keylength, int revision) {
+ this.documentID = documentID;
+ this.ownerKey = ownerKey;
+ this.permissions = permissions;
+ // use variable keylength
+ mkey = new byte[keylength/8];
+
+ //fixed by ujihara in order to follow PDF refrence
+ md5.reset();
+ md5.update(userPad);
+ md5.update(ownerKey);
+
+ byte ext[] = new byte[4];
+ ext[0] = (byte)permissions;
+ ext[1] = (byte)(permissions >> 8);
+ ext[2] = (byte)(permissions >> 16);
+ ext[3] = (byte)(permissions >> 24);
+ md5.update(ext, 0, 4);
+ if (documentID != null) md5.update(documentID);
+
+ byte digest[] = new byte[mkey.length];
+ System.arraycopy(md5.digest(), 0, digest, 0, mkey.length);
+
+ // only use the really needed bits as input for the hash
+ if (revision == 3){
+ for (int k = 0; k < 50; ++k)
+ System.arraycopy(md5.digest(digest), 0, digest, 0, mkey.length);
+ }
+
+
+ System.arraycopy(digest, 0, mkey, 0, mkey.length);
+ }
+
+ /**
+ *
+ * mkey must be setuped
+ */
+ // use the revision to choose the setup method
+ private void setupUserKey(int revision) {
+ if (revision == 3) {
+ md5.update(pad);
+ byte digest[] = md5.digest(documentID);
+ System.arraycopy(digest, 0, userKey, 0, 16);
+ for (int k = 16; k < 32; ++k)
+ userKey[k] = 0;
+ for (int i = 0; i < 20; ++i) {
+ for (int j = 0; j < mkey.length; ++j)
+ digest[j] = (byte)(mkey[j] ^ i);
+ prepareRC4Key(digest, 0, mkey.length);
+ encryptRC4(userKey, 0, 16);
+ }
+ }
+ else {
+ prepareRC4Key(mkey);
+ encryptRC4(pad, userKey);
+ }
+ }
+
+ // gets keylength and revision and uses revison to choose the initial values for permissions
+ public void setupAllKeys(byte userPassword[], byte ownerPassword[], int permissions, int keylength, int revision) {
+ if (ownerPassword == null || ownerPassword.length == 0)
+ ownerPassword = md5.digest(createDocumentId());
+ permissions |= revision==3 ? 0xfffff0c0 : 0xffffffc0;
+ permissions &= 0xfffffffc;
+ //PDF refrence 3.5.2 Standard Security Handler, Algorithum 3.3-1
+ //If there is no owner password, use the user password instead.
+ byte userPad[] = padPassword(userPassword);
+ byte ownerPad[] = padPassword(ownerPassword);
+
+ this.ownerKey = computeOwnerKey(userPad, ownerPad, keylength, revision);
+ documentID = createDocumentId();
+ setupByUserPad(this.documentID, userPad, this.ownerKey, permissions, keylength, revision);
+ }
+
+ // calls the setupAllKeys function with default values to keep the old behavior and signature
+ public void setupAllKeys(byte userPassword[], byte ownerPassword[], int permissions, boolean strength128Bits) {
+ setupAllKeys(userPassword, ownerPassword, permissions, strength128Bits?128:40, strength128Bits?3:2);
+ }
+
+ public static byte[] createDocumentId() {
+ MessageDigest md5;
+ try {
+ md5 = MessageDigest.getInstance("MD5");
+ }
+ catch (Exception e) {
+ throw new ExceptionConverter(e);
+ }
+ long time = System.currentTimeMillis();
+ long mem = Runtime.getRuntime().freeMemory();
+ String s = time + "+" + mem + "+" + (seq++);
+ return md5.digest(s.getBytes());
+ }
+
+ /**
+ */
+ // the following functions use the new parameters for the call of the functions
+ // resp. they map the call of the old functions to the changed in order to keep the
+ // old behaviour and signatures
+ public void setupByUserPassword(byte[] documentID, byte userPassword[], byte ownerKey[], int permissions, boolean strength128Bits) {
+ setupByUserPassword(documentID, userPassword, ownerKey, permissions, strength128Bits?128:40, strength128Bits?3:2);
+ }
+
+ /**
+ */
+ public void setupByUserPassword(byte[] documentID, byte userPassword[], byte ownerKey[], int permissions, int keylength, int revision) {
+ setupByUserPad(documentID, padPassword(userPassword), ownerKey, permissions, keylength, revision);
+ }
+
+ /**
+ */
+ private void setupByUserPad(byte[] documentID, byte userPad[], byte ownerKey[], int permissions, int keylength, int revision) {
+ setupGlobalEncryptionKey(documentID, userPad, ownerKey, permissions, keylength, revision);
+ setupUserKey(revision);
+ }
+
+ /**
+ */
+ public void setupByOwnerPassword(byte[] documentID, byte ownerPassword[], byte userKey[], byte ownerKey[], int permissions, boolean strength128Bits) {
+ setupByOwnerPassword(documentID, ownerPassword, userKey, ownerKey, permissions, strength128Bits?128:40, strength128Bits?3:2);
+ }
+
+ /**
+ */
+ public void setupByOwnerPassword(byte[] documentID, byte ownerPassword[], byte userKey[], byte ownerKey[], int permissions, int keylength, int revision) {
+ setupByOwnerPad(documentID, padPassword(ownerPassword), userKey, ownerKey, permissions, keylength, revision);
+ }
+
+ private void setupByOwnerPad(byte[] documentID, byte ownerPad[], byte userKey[], byte ownerKey[], int permissions, int keylength, int revision) {
+ byte userPad[] = computeOwnerKey(ownerKey, ownerPad, keylength, revision); //userPad will be set in this.ownerKey
+ setupGlobalEncryptionKey(documentID, userPad, ownerKey, permissions, keylength, revision); //step 3
+ setupUserKey(revision);
+ }
+
+ public void prepareKey() {
+ prepareRC4Key(key, 0, keySize);
+ }
+
+ public void setHashKey(int number, int generation) {
+ md5.reset(); //added by ujihara
+ extra[0] = (byte)number;
+ extra[1] = (byte)(number >> 8);
+ extra[2] = (byte)(number >> 16);
+ extra[3] = (byte)generation;
+ extra[4] = (byte)(generation >> 8);
+ md5.update(mkey);
+ key = md5.digest(extra);
+ keySize = mkey.length + 5;
+ if (keySize > 16)
+ keySize = 16;
+ }
+
+ public static PdfObject createInfoId(byte id[]) {
+ ByteBuffer buf = new ByteBuffer(90);
+ buf.append('[').append('<');
+ for (int k = 0; k < 16; ++k)
+ buf.appendHex(id[k]);
+ buf.append('>').append('<');
+ id = createDocumentId();
+ for (int k = 0; k < 16; ++k)
+ buf.appendHex(id[k]);
+ buf.append('>').append(']');
+ return new PdfLiteral(buf.toByteArray());
+ }
+
+ public PdfDictionary getEncryptionDictionary() {
+ PdfDictionary dic = new PdfDictionary();
+ dic.put(PdfName.FILTER, PdfName.STANDARD);
+ dic.put(PdfName.O, new PdfLiteral(PdfContentByte.escapeString(ownerKey)));
+ dic.put(PdfName.U, new PdfLiteral(PdfContentByte.escapeString(userKey)));
+ dic.put(PdfName.P, new PdfNumber(permissions));
+ if (mkey.length > 5) {
+ dic.put(PdfName.V, new PdfNumber(2));
+ dic.put(PdfName.R, new PdfNumber(3));
+ dic.put(PdfName.LENGTH, new PdfNumber(128));
+ }
+ else {
+ dic.put(PdfName.V, new PdfNumber(1));
+ dic.put(PdfName.R, new PdfNumber(2));
+ }
+ return dic;
+ }
+
+ public void prepareRC4Key(byte key[]) {
+ prepareRC4Key(key, 0, key.length);
+ }
+
+ public void prepareRC4Key(byte key[], int off, int len) {
+ int index1 = 0;
+ int index2 = 0;
+ for (int k = 0; k < 256; ++k)
+ state[k] = (byte)k;
+ x = 0;
+ y = 0;
+ byte tmp;
+ for (int k = 0; k < 256; ++k) {
+ index2 = (key[index1 + off] + state[k] + index2) & 255;
+ tmp = state[k];
+ state[k] = state[index2];
+ state[index2] = tmp;
+ index1 = (index1 + 1) % len;
+ }
+ }
+
+ public void encryptRC4(byte dataIn[], int off, int len, byte dataOut[]) {
+ int length = len + off;
+ byte tmp;
+ for (int k = off; k < length; ++k) {
+ x = (x + 1) & 255;
+ y = (state[x] + y) & 255;
+ tmp = state[x];
+ state[x] = state[y];
+ state[y] = tmp;
+ dataOut[k] = (byte)(dataIn[k] ^ state[(state[x] + state[y]) & 255]);
+ }
+ }
+
+ public void encryptRC4(byte data[], int off, int len) {
+ encryptRC4(data, off, len, data);
+ }
+
+ public void encryptRC4(byte dataIn[], byte dataOut[]) {
+ encryptRC4(dataIn, 0, dataIn.length, dataOut);
+ }
+
+ public void encryptRC4(byte data[]) {
+ encryptRC4(data, 0, data.length, data);
+ }
+
+ public PdfObject getFileID() {
+ return createInfoId(documentID);
+ }
+
+}
diff --git a/src/main/java/com/lowagie/text/pdf/PdfEncryptionStream.java b/src/main/java/com/lowagie/text/pdf/PdfEncryptionStream.java
new file mode 100644
index 0000000..99170ca
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/PdfEncryptionStream.java
@@ -0,0 +1,85 @@
+/*
+ * $Id: PdfEncryptionStream.java,v 1.3 2005/02/17 09:20:54 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2004 Paulo Soares
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999-2005 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000-2005 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf;
+
+import java.io.FilterOutputStream;
+import java.io.OutputStream;
+import java.io.IOException;
+
+public class PdfEncryptionStream extends FilterOutputStream {
+
+ protected PdfEncryption enc;
+ private byte buf[] = new byte[1];
+
+ public PdfEncryptionStream(OutputStream out, PdfEncryption enc) {
+ super(out);
+ this.enc = enc;
+ }
+
+ public void write(byte[] b, int off, int len) throws IOException {
+ if ((off | len | (b.length - (len + off)) | (off + len)) < 0)
+ throw new IndexOutOfBoundsException();
+ enc.encryptRC4(b, off, len);
+ out.write(b, off, len);
+ }
+
+ public void close() throws IOException {
+ }
+
+ public void write(int b) throws IOException {
+ buf[0] = (byte)b;
+ write(buf);
+ }
+
+ public void flush() throws IOException {
+ }
+
+}
diff --git a/src/main/java/com/lowagie/text/pdf/PdfEncryptor.java b/src/main/java/com/lowagie/text/pdf/PdfEncryptor.java
new file mode 100644
index 0000000..7bea4d5
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/PdfEncryptor.java
@@ -0,0 +1,176 @@
+/*
+/*
+ * Copyright 2002 Paulo Soares
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf;
+
+import java.io.OutputStream;
+import java.io.IOException;
+import com.lowagie.text.DocumentException;
+import java.util.HashMap;
+
+/** This class takes any PDF and returns exactly the same but
+ * encrypted. All the content, links, outlines, etc, are kept.
+ * It is also possible to change the info dictionary.
+ */
+public class PdfEncryptor {
+
+ private PdfEncryptor(){
+ }
+
+ /** Entry point to encrypt a PDF document. The encryption parameters are the same as in
+ * <code>PdfWriter</code>. The userPassword and the
+ * ownerPassword can be null or have zero length. In this case the ownerPassword
+ * is replaced by a random string. The open permissions for the document can be
+ * AllowPrinting, AllowModifyContents, AllowCopy, AllowModifyAnnotations,
+ * AllowFillIn, AllowScreenReaders, AllowAssembly and AllowDegradedPrinting.
+ * The permissions can be combined by ORing them.
+ * @param reader the read PDF
+ * @param os the output destination
+ * @param userPassword the user password. Can be null or empty
+ * @param ownerPassword the owner password. Can be null or empty
+ * @param permissions the user permissions
+ * @param strength128Bits <code>true</code> for 128 bit key length, <code>false</code> for 40 bit key length
+ * @throws DocumentException on error
+ * @throws IOException on error */
+ public static void encrypt(PdfReader reader, OutputStream os, byte userPassword[], byte ownerPassword[], int permissions, boolean strength128Bits) throws DocumentException, IOException {
+ PdfStamper stamper = new PdfStamper(reader, os);
+ stamper.setEncryption(userPassword, ownerPassword, permissions, strength128Bits);
+ stamper.close();
+ }
+
+ /** Entry point to encrypt a PDF document. The encryption parameters are the same as in
+ * <code>PdfWriter</code>. The userPassword and the
+ * ownerPassword can be null or have zero length. In this case the ownerPassword
+ * is replaced by a random string. The open permissions for the document can be
+ * AllowPrinting, AllowModifyContents, AllowCopy, AllowModifyAnnotations,
+ * AllowFillIn, AllowScreenReaders, AllowAssembly and AllowDegradedPrinting.
+ * The permissions can be combined by ORing them.
+ * @param reader the read PDF
+ * @param os the output destination
+ * @param userPassword the user password. Can be null or empty
+ * @param ownerPassword the owner password. Can be null or empty
+ * @param permissions the user permissions
+ * @param strength128Bits <code>true</code> for 128 bit key length, <code>false</code> for 40 bit key length
+ * @param newInfo an optional <CODE>String</CODE> map to add or change
+ * the info dictionary. Entries with <CODE>null</CODE>
+ * values delete the key in the original info dictionary
+ * @throws DocumentException on error
+ * @throws IOException on error
+ */
+ public static void encrypt(PdfReader reader, OutputStream os, byte userPassword[], byte ownerPassword[], int permissions, boolean strength128Bits, HashMap newInfo) throws DocumentException, IOException {
+ PdfStamper stamper = new PdfStamper(reader, os);
+ stamper.setEncryption(userPassword, ownerPassword, permissions, strength128Bits);
+ stamper.setMoreInfo(newInfo);
+ stamper.close();
+ }
+
+ /** Entry point to encrypt a PDF document. The encryption parameters are the same as in
+ * <code>PdfWriter</code>. The userPassword and the
+ * ownerPassword can be null or have zero length. In this case the ownerPassword
+ * is replaced by a random string. The open permissions for the document can be
+ * AllowPrinting, AllowModifyContents, AllowCopy, AllowModifyAnnotations,
+ * AllowFillIn, AllowScreenReaders, AllowAssembly and AllowDegradedPrinting.
+ * The permissions can be combined by ORing them.
+ * @param reader the read PDF
+ * @param os the output destination
+ * @param strength <code>true</code> for 128 bit key length, <code>false</code> for 40 bit key length
+ * @param userPassword the user password. Can be null or empty
+ * @param ownerPassword the owner password. Can be null or empty
+ * @param permissions the user permissions
+ * @throws DocumentException on error
+ * @throws IOException on error */
+ public static void encrypt(PdfReader reader, OutputStream os, boolean strength, String userPassword, String ownerPassword, int permissions) throws DocumentException, IOException {
+ PdfStamper stamper = new PdfStamper(reader, os);
+ stamper.setEncryption(strength, userPassword, ownerPassword, permissions);
+ stamper.close();
+ }
+
+ /** Entry point to encrypt a PDF document. The encryption parameters are the same as in
+ * <code>PdfWriter</code>. The userPassword and the
+ * ownerPassword can be null or have zero length. In this case the ownerPassword
+ * is replaced by a random string. The open permissions for the document can be
+ * AllowPrinting, AllowModifyContents, AllowCopy, AllowModifyAnnotations,
+ * AllowFillIn, AllowScreenReaders, AllowAssembly and AllowDegradedPrinting.
+ * The permissions can be combined by ORing them.
+ * @param reader the read PDF
+ * @param os the output destination
+ * @param strength <code>true</code> for 128 bit key length, <code>false</code> for 40 bit key length
+ * @param userPassword the user password. Can be null or empty
+ * @param ownerPassword the owner password. Can be null or empty
+ * @param permissions the user permissions
+ * @param newInfo an optional <CODE>String</CODE> map to add or change
+ * the info dictionary. Entries with <CODE>null</CODE>
+ * values delete the key in the original info dictionary
+ * @throws DocumentException on error
+ * @throws IOException on error
+ */
+ public static void encrypt(PdfReader reader, OutputStream os, boolean strength, String userPassword, String ownerPassword, int permissions, HashMap newInfo) throws DocumentException, IOException {
+ PdfStamper stamper = new PdfStamper(reader, os);
+ stamper.setEncryption(strength, userPassword, ownerPassword, permissions);
+ stamper.setMoreInfo(newInfo);
+ stamper.close();
+ }
+
+ /**
+ * Give you a verbose analysis of the permissions.
+ * @param permissions the permissions value of a PDF file
+ * @return a String that explains the meaning of the permissions value
+ */
+ public static String getPermissionsVerbose(int permissions) {
+ StringBuffer buf = new StringBuffer("Allowed:");
+ if ((PdfWriter.AllowPrinting & permissions) == PdfWriter.AllowPrinting) buf.append(" Printing");
+ if ((PdfWriter.AllowModifyContents & permissions) == PdfWriter.AllowModifyContents) buf.append(" Modify contents");
+ if ((PdfWriter.AllowCopy & permissions) == PdfWriter.AllowCopy) buf.append(" Copy");
+ if ((PdfWriter.AllowModifyAnnotations & permissions) == PdfWriter.AllowModifyAnnotations) buf.append(" Modify annotations");
+ if ((PdfWriter.AllowFillIn & permissions) == PdfWriter.AllowFillIn) buf.append(" Fill in");
+ if ((PdfWriter.AllowScreenReaders & permissions) == PdfWriter.AllowScreenReaders) buf.append(" Screen readers");
+ if ((PdfWriter.AllowAssembly & permissions) == PdfWriter.AllowAssembly) buf.append(" Assembly");
+ if ((PdfWriter.AllowDegradedPrinting & permissions) == PdfWriter.AllowDegradedPrinting) buf.append(" Degraded printing");
+ return buf.toString();
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/pdf/PdfException.java b/src/main/java/com/lowagie/text/pdf/PdfException.java
new file mode 100644
index 0000000..486ece0
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/PdfException.java
@@ -0,0 +1,86 @@
+/*
+ * $Id: PdfException.java,v 1.54 2005/05/04 14:31:43 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 1999, 2000, 2001, 2002 Bruno Lowagie
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf;
+
+import com.lowagie.text.DocumentException;
+
+/**
+ * Signals that an unspecified problem while constructing a PDF document.
+ *
+ * @see BadPdfFormatException
+ */
+
+public class PdfException extends DocumentException {
+
+ // constructors
+
+ public PdfException(Exception ex) {
+ super(ex);
+ }
+
+ /**
+ * Constructs a <CODE>PdfException</CODE> whithout a message.
+ */
+
+ PdfException() {
+ super();
+ }
+
+/**
+ * Constructs a <code>PdfException</code> with a message.
+ *
+ * @param message a message describing the exception
+ */
+
+ PdfException(String message) {
+ super(message);
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/pdf/PdfFileSpecification.java b/src/main/java/com/lowagie/text/pdf/PdfFileSpecification.java
new file mode 100644
index 0000000..cec2b20
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/PdfFileSpecification.java
@@ -0,0 +1,194 @@
+/*
+ * Copyright 2003 Paulo Soares
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf;
+
+import java.io.*;
+import java.net.URL;
+/** Specifies a file or an URL. The file can be extern or embedded.
+ *
+ * @author Paulo Soares (psoares@consiste.pt)
+ */
+public class PdfFileSpecification extends PdfDictionary {
+ protected PdfWriter writer;
+ protected PdfIndirectReference ref;
+
+ /** Creates a new instance of PdfFileSpecification. The static methods are preferred. */
+ public PdfFileSpecification() {
+ super(PdfName.FILESPEC);
+ }
+
+ /**
+ * Creates a file specification of type URL.
+ * @param writer the <CODE>PdfWriter</CODE>
+ * @param url the URL
+ * @return the file specification
+ */
+ public static PdfFileSpecification url(PdfWriter writer, String url) {
+ PdfFileSpecification fs = new PdfFileSpecification();
+ fs.writer = writer;
+ fs.put(PdfName.FS, PdfName.URL);
+ fs.put(PdfName.F, new PdfString(url));
+ return fs;
+ }
+
+ /**
+ * Creates a file specification with the file embedded. The file may
+ * come from the file system or from a byte array. The data is flate compressed.
+ * @param writer the <CODE>PdfWriter</CODE>
+ * @param filePath the file path
+ * @param fileDisplay the file information that is presented to the user
+ * @param fileStore the byte array with the file. If it is not <CODE>null</CODE>
+ * it takes precedence over <CODE>filePath</CODE>
+ * @throws IOException on error
+ * @return the file specification
+ */
+ public static PdfFileSpecification fileEmbedded(PdfWriter writer, String filePath, String fileDisplay, byte fileStore[]) throws IOException {
+ return fileEmbedded(writer, filePath, fileDisplay, fileStore, true);
+ }
+
+
+ /**
+ * Creates a file specification with the file embedded. The file may
+ * come from the file system or from a byte array.
+ * @param writer the <CODE>PdfWriter</CODE>
+ * @param filePath the file path
+ * @param fileDisplay the file information that is presented to the user
+ * @param fileStore the byte array with the file. If it is not <CODE>null</CODE>
+ * it takes precedence over <CODE>filePath</CODE>
+ * @param compress sets the compression on the data. Multimedia content will benefit little
+ * from compression
+ * @throws IOException on error
+ * @return the file specification
+ */
+ public static PdfFileSpecification fileEmbedded(PdfWriter writer, String filePath, String fileDisplay, byte fileStore[], boolean compress) throws IOException {
+ PdfFileSpecification fs = new PdfFileSpecification();
+ fs.writer = writer;
+ fs.put(PdfName.F, new PdfString(fileDisplay));
+ PdfStream stream;
+ InputStream in = null;
+ PdfIndirectReference ref;
+ PdfIndirectReference refFileLength;
+ try {
+ refFileLength = writer.getPdfIndirectReference();
+ if (fileStore == null) {
+ File file = new File(filePath);
+ if (file.canRead()) {
+ in = new FileInputStream(filePath);
+ }
+ else {
+ if (filePath.startsWith("file:/") || filePath.startsWith("http://") || filePath.startsWith("https://") || filePath.startsWith("jar:")) {
+ in = new URL(filePath).openStream();
+ }
+ else {
+ in = BaseFont.getResourceStream(filePath);
+ if (in == null)
+ throw new IOException(filePath + " not found as file or resource.");
+ }
+ }
+ stream = new PdfStream(in, writer);
+ }
+ else
+ stream = new PdfStream(fileStore);
+ stream.put(PdfName.TYPE, PdfName.EMBEDDEDFILE);
+ if (compress)
+ stream.flateCompress();
+ stream.put(PdfName.PARAMS, refFileLength);
+ ref = writer.addToBody(stream).getIndirectReference();
+ if (fileStore == null) {
+ stream.writeLength();
+ }
+ PdfDictionary params = new PdfDictionary();
+ params.put(PdfName.SIZE, new PdfNumber(stream.getRawLength()));
+ writer.addToBody(params, refFileLength);
+ }
+ finally {
+ if (in != null)
+ try{in.close();}catch(Exception e){}
+ }
+ PdfDictionary f = new PdfDictionary();
+ f.put(PdfName.F, ref);
+ fs.put(PdfName.EF, f);
+ return fs;
+ }
+
+ /**
+ * Creates a file specification for an external file.
+ * @param writer the <CODE>PdfWriter</CODE>
+ * @param filePath the file path
+ * @return the file specification
+ */
+ public static PdfFileSpecification fileExtern(PdfWriter writer, String filePath) {
+ PdfFileSpecification fs = new PdfFileSpecification();
+ fs.writer = writer;
+ fs.put(PdfName.F, new PdfString(filePath));
+ return fs;
+ }
+
+ /**
+ * Gets the indirect reference to this file specification.
+ * Multiple invocations will retrieve the same value.
+ * @throws IOException on error
+ * @return the indirect reference
+ */
+ public PdfIndirectReference getReference() throws IOException {
+ if (ref != null)
+ return ref;
+ ref = writer.addToBody(this).getIndirectReference();
+ return ref;
+ }
+
+ /**
+ * Sets the file name (the key /F) string as an hex representation
+ * to support multi byte file names. The name must heve th slash and
+ * backslash escaped according to the file specification rules
+ * @param fileName the file name as a byte array
+ */
+ public void setMultiByteFileName(byte fileName[]) {
+ put(PdfName.F, new PdfString(fileName).setHexWriting(true));
+ }
+}
diff --git a/src/main/java/com/lowagie/text/pdf/PdfFont.java b/src/main/java/com/lowagie/text/pdf/PdfFont.java
new file mode 100644
index 0000000..0f8e3c8
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/PdfFont.java
@@ -0,0 +1,188 @@
+/*
+ * $Id: PdfFont.java,v 1.64 2005/05/04 14:32:21 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 1999, 2000, 2001, 2002 Bruno Lowagie
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf;
+
+import com.lowagie.text.Image;
+import com.lowagie.text.ExceptionConverter;
+
+/**
+ * <CODE>PdfFont</CODE> is the Pdf Font object.
+ * <P>
+ * Limitation: in this class only base 14 Type 1 fonts (courier, courier bold, courier oblique,
+ * courier boldoblique, helvetica, helvetica bold, helvetica oblique, helvetica boldoblique,
+ * symbol, times roman, times bold, times italic, times bolditalic, zapfdingbats) and their
+ * standard encoding (standard, MacRoman, (MacExpert,) WinAnsi) are supported.<BR>
+ * This object is described in the 'Portable Document Format Reference Manual version 1.3'
+ * section 7.7 (page 198-203).
+ *
+ * @see PdfName
+ * @see PdfDictionary
+ * @see BadPdfFormatException
+ */
+
+class PdfFont implements Comparable {
+
+
+ /** the font metrics. */
+ private BaseFont font;
+
+ /** the size. */
+ private float size;
+
+ /** an image. */
+ protected Image image;
+
+ protected float hScale = 1;
+
+ // constructors
+
+ PdfFont(BaseFont bf, float size) {
+ this.size = size;
+ font = bf;
+ }
+
+ // methods
+
+ /**
+ * Compares this <CODE>PdfFont</CODE> with another
+ *
+ * @param object the other <CODE>PdfFont</CODE>
+ * @return a value
+ */
+
+ public int compareTo(Object object) {
+ if (image != null)
+ return 0;
+ if (object == null) {
+ return -1;
+ }
+ PdfFont pdfFont;
+ try {
+ pdfFont = (PdfFont) object;
+ if (font != pdfFont.font) {
+ return 1;
+ }
+ if (this.size() != pdfFont.size()) {
+ return 2;
+ }
+ return 0;
+ }
+ catch(ClassCastException cce) {
+ return -2;
+ }
+ }
+
+ /**
+ * Returns the size of this font.
+ *
+ * @return a size
+ */
+
+ float size() {
+ if (image == null)
+ return size;
+ else {
+ return image.scaledHeight();
+ }
+ }
+
+ /**
+ * Returns the approximative width of 1 character of this font.
+ *
+ * @return a width in Text Space
+ */
+
+ float width() {
+ return width(' ');
+ }
+
+ /**
+ * Returns the width of a certain character of this font.
+ *
+ * @param character a certain character
+ * @return a width in Text Space
+ */
+
+ float width(char character) {
+ if (image == null)
+ return font.getWidthPoint(character, size) * hScale;
+ else
+ return image.scaledWidth();
+ }
+
+ float width(String s) {
+ if (image == null)
+ return font.getWidthPoint(s, size) * hScale;
+ else
+ return image.scaledWidth();
+ }
+
+ BaseFont getFont() {
+ return font;
+ }
+
+ void setImage(Image image) {
+ this.image = image;
+ }
+
+ static PdfFont getDefaultFont() {
+ try {
+ BaseFont bf = BaseFont.createFont(BaseFont.HELVETICA, BaseFont.WINANSI, false);
+ return new PdfFont(bf, 12);
+ }
+ catch (Exception ee) {
+ throw new ExceptionConverter(ee);
+ }
+ }
+ void setHorizontalScaling(float hScale) {
+ this.hScale = hScale;
+ }
+}
diff --git a/src/main/java/com/lowagie/text/pdf/PdfFormField.java b/src/main/java/com/lowagie/text/pdf/PdfFormField.java
new file mode 100644
index 0000000..bd13ddc
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/PdfFormField.java
@@ -0,0 +1,347 @@
+/*
+ * Copyright 2002 by Paulo Soares.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf;
+import com.lowagie.text.Rectangle;
+import java.util.ArrayList;
+import java.util.Iterator;
+
+/** Implements form fields.
+ *
+ * @author Paulo Soares (psoares@consiste.pt)
+ */
+public class PdfFormField extends PdfAnnotation {
+
+ public static final int FF_READ_ONLY = 1;
+ public static final int FF_REQUIRED = 2;
+ public static final int FF_NO_EXPORT = 4;
+ public static final int FF_NO_TOGGLE_TO_OFF = 16384;
+ public static final int FF_RADIO = 32768;
+ public static final int FF_PUSHBUTTON = 65536;
+ public static final int FF_MULTILINE = 4096;
+ public static final int FF_PASSWORD = 8192;
+ public static final int FF_COMBO = 131072;
+ public static final int FF_EDIT = 262144;
+ public static final int FF_FILESELECT = 1048576;
+ public static final int FF_MULTISELECT = 2097152;
+ public static final int FF_DONOTSPELLCHECK = 4194304;
+ public static final int FF_DONOTSCROLL = 8388608;
+ public static final int FF_COMB = 16777216;
+ public static final int FF_RADIOSINUNISON = 1 << 25;
+ public static final int Q_LEFT = 0;
+ public static final int Q_CENTER = 1;
+ public static final int Q_RIGHT = 2;
+ public static final int MK_NO_ICON = 0;
+ public static final int MK_NO_CAPTION = 1;
+ public static final int MK_CAPTION_BELOW = 2;
+ public static final int MK_CAPTION_ABOVE = 3;
+ public static final int MK_CAPTION_RIGHT = 4;
+ public static final int MK_CAPTION_LEFT = 5;
+ public static final int MK_CAPTION_OVERLAID = 6;
+ public static final PdfName IF_SCALE_ALWAYS = PdfName.A;
+ public static final PdfName IF_SCALE_BIGGER = PdfName.B;
+ public static final PdfName IF_SCALE_SMALLER = PdfName.S;
+ public static final PdfName IF_SCALE_NEVER = PdfName.N;
+ public static final PdfName IF_SCALE_ANAMORPHIC = PdfName.A;
+ public static final PdfName IF_SCALE_PROPORTIONAL = PdfName.P;
+ public static final boolean MULTILINE = true;
+ public static final boolean SINGLELINE = false;
+ public static final boolean PLAINTEXT = false;
+ public static final boolean PASSWORD = true;
+ static PdfName mergeTarget[] = {PdfName.FONT, PdfName.XOBJECT, PdfName.COLORSPACE, PdfName.PATTERN};
+
+ /** Holds value of property parent. */
+ protected PdfFormField parent;
+
+ protected ArrayList kids;
+
+/**
+ * Constructs a new <CODE>PdfAnnotation</CODE> of subtype link (Action).
+ */
+
+ public PdfFormField(PdfWriter writer, float llx, float lly, float urx, float ury, PdfAction action) {
+ super(writer, llx, lly, urx, ury, action);
+ put(PdfName.TYPE, PdfName.ANNOT);
+ put(PdfName.SUBTYPE, PdfName.WIDGET);
+ annotation = true;
+ }
+
+ /** Creates new PdfFormField */
+ protected PdfFormField(PdfWriter writer) {
+ super(writer, null);
+ form = true;
+ annotation = false;
+ }
+
+ public void setWidget(Rectangle rect, PdfName highlight) {
+ put(PdfName.TYPE, PdfName.ANNOT);
+ put(PdfName.SUBTYPE, PdfName.WIDGET);
+ put(PdfName.RECT, new PdfRectangle(rect));
+ annotation = true;
+ if (highlight != null && !highlight.equals(HIGHLIGHT_INVERT))
+ put(PdfName.H, highlight);
+ }
+
+ public static PdfFormField createEmpty(PdfWriter writer) {
+ PdfFormField field = new PdfFormField(writer);
+ return field;
+ }
+
+ public void setButton(int flags) {
+ put(PdfName.FT, PdfName.BTN);
+ if (flags != 0)
+ put(PdfName.FF, new PdfNumber(flags));
+ }
+
+ protected static PdfFormField createButton(PdfWriter writer, int flags) {
+ PdfFormField field = new PdfFormField(writer);
+ field.setButton(flags);
+ return field;
+ }
+
+ public static PdfFormField createPushButton(PdfWriter writer) {
+ return createButton(writer, FF_PUSHBUTTON);
+ }
+
+ public static PdfFormField createCheckBox(PdfWriter writer) {
+ return createButton(writer, 0);
+ }
+
+ public static PdfFormField createRadioButton(PdfWriter writer, boolean noToggleToOff) {
+ return createButton(writer, FF_RADIO + (noToggleToOff ? FF_NO_TOGGLE_TO_OFF : 0));
+ }
+
+ public static PdfFormField createTextField(PdfWriter writer, boolean multiline, boolean password, int maxLen) {
+ PdfFormField field = new PdfFormField(writer);
+ field.put(PdfName.FT, PdfName.TX);
+ int flags = (multiline ? FF_MULTILINE : 0);
+ flags += (password ? FF_PASSWORD : 0);
+ field.put(PdfName.FF, new PdfNumber(flags));
+ if (maxLen > 0)
+ field.put(PdfName.MAXLEN, new PdfNumber(maxLen));
+ return field;
+ }
+
+ protected static PdfFormField createChoice(PdfWriter writer, int flags, PdfArray options, int topIndex) {
+ PdfFormField field = new PdfFormField(writer);
+ field.put(PdfName.FT, PdfName.CH);
+ field.put(PdfName.FF, new PdfNumber(flags));
+ field.put(PdfName.OPT, options);
+ if (topIndex > 0)
+ field.put(PdfName.TI, new PdfNumber(topIndex));
+ return field;
+ }
+
+ public static PdfFormField createList(PdfWriter writer, String options[], int topIndex) {
+ return createChoice(writer, 0, processOptions(options), topIndex);
+ }
+
+ public static PdfFormField createList(PdfWriter writer, String options[][], int topIndex) {
+ return createChoice(writer, 0, processOptions(options), topIndex);
+ }
+
+ public static PdfFormField createCombo(PdfWriter writer, boolean edit, String options[], int topIndex) {
+ return createChoice(writer, FF_COMBO + (edit ? FF_EDIT : 0), processOptions(options), topIndex);
+ }
+
+ public static PdfFormField createCombo(PdfWriter writer, boolean edit, String options[][], int topIndex) {
+ return createChoice(writer, FF_COMBO + (edit ? FF_EDIT : 0), processOptions(options), topIndex);
+ }
+
+ protected static PdfArray processOptions(String options[]) {
+ PdfArray array = new PdfArray();
+ for (int k = 0; k < options.length; ++k) {
+ array.add(new PdfString(options[k], PdfObject.TEXT_UNICODE));
+ }
+ return array;
+ }
+
+ protected static PdfArray processOptions(String options[][]) {
+ PdfArray array = new PdfArray();
+ for (int k = 0; k < options.length; ++k) {
+ String subOption[] = options[k];
+ PdfArray ar2 = new PdfArray(new PdfString(subOption[0], PdfObject.TEXT_UNICODE));
+ ar2.add(new PdfString(subOption[1], PdfObject.TEXT_UNICODE));
+ array.add(ar2);
+ }
+ return array;
+ }
+
+ public static PdfFormField createSignature(PdfWriter writer) {
+ PdfFormField field = new PdfFormField(writer);
+ field.put(PdfName.FT, PdfName.SIG);
+ return field;
+ }
+
+ /** Getter for property parent.
+ * @return Value of property parent.
+ */
+ public PdfFormField getParent() {
+ return parent;
+ }
+
+ public void addKid(PdfFormField field) {
+ field.parent = this;
+ if (kids == null)
+ kids = new ArrayList();
+ kids.add(field);
+ }
+
+ ArrayList getKids() {
+ return kids;
+ }
+
+ public int setFieldFlags(int flags) {
+ PdfNumber obj = (PdfNumber)get(PdfName.FF);
+ int old;
+ if (obj == null)
+ old = 0;
+ else
+ old = obj.intValue();
+ int v = old | flags;
+ put(PdfName.FF, new PdfNumber(v));
+ return old;
+ }
+
+ public void setValueAsString(String s) {
+ put(PdfName.V, new PdfString(s, PdfObject.TEXT_UNICODE));
+ }
+
+ public void setValueAsName(String s) {
+ put(PdfName.V, new PdfName(s));
+ }
+
+ public void setValue(PdfSignature sig) {
+ put(PdfName.V, sig);
+ }
+
+ public void setDefaultValueAsString(String s) {
+ put(PdfName.DV, new PdfString(s, PdfObject.TEXT_UNICODE));
+ }
+
+ public void setDefaultValueAsName(String s) {
+ put(PdfName.DV, new PdfName(s));
+ }
+
+ public void setFieldName(String s) {
+ if (s != null)
+ put(PdfName.T, new PdfString(s, PdfObject.TEXT_UNICODE));
+ }
+
+ public void setUserName(String s) {
+ put(PdfName.TU, new PdfString(s, PdfObject.TEXT_UNICODE));
+ }
+
+ public void setMappingName(String s) {
+ put(PdfName.TM, new PdfString(s, PdfObject.TEXT_UNICODE));
+ }
+
+ public void setQuadding(int v) {
+ put(PdfName.Q, new PdfNumber(v));
+ }
+
+ static void mergeResources(PdfDictionary result, PdfDictionary source, PdfStamperImp writer) {
+ PdfDictionary dic = null;
+ PdfDictionary res = null;
+ PdfName target = null;
+ for (int k = 0; k < mergeTarget.length; ++k) {
+ target = mergeTarget[k];
+ PdfDictionary pdfDict = (PdfDictionary)PdfReader.getPdfObject(source.get(target));
+ if ((dic = pdfDict) != null) {
+ if ((res = (PdfDictionary)PdfReader.getPdfObject(result.get(target), result)) == null) {
+ res = new PdfDictionary();
+ }
+ res.mergeDifferent(dic);
+ result.put(target, res);
+ if (writer != null)
+ writer.markUsed(res);
+ }
+ }
+ }
+
+ static void mergeResources(PdfDictionary result, PdfDictionary source) {
+ mergeResources(result, source, null);
+ }
+
+ void setUsed() {
+ used = true;
+ if (parent != null)
+ put(PdfName.PARENT, parent.getIndirectReference());
+ if (kids != null) {
+ PdfArray array = new PdfArray();
+ for (int k = 0; k < kids.size(); ++k)
+ array.add(((PdfFormField)kids.get(k)).getIndirectReference());
+ put(PdfName.KIDS, array);
+ }
+ if (templates == null)
+ return;
+ PdfDictionary dic = new PdfDictionary();
+ for (Iterator it = templates.keySet().iterator(); it.hasNext();) {
+ PdfTemplate template = (PdfTemplate)it.next();
+ mergeResources(dic, (PdfDictionary)template.getResources());
+ }
+ put(PdfName.DR, dic);
+ }
+
+ public static PdfAnnotation shallowDuplicate(PdfAnnotation annot) {
+ PdfAnnotation dup;
+ if (annot.isForm()) {
+ dup = new PdfFormField(annot.writer);
+ PdfFormField dupField = (PdfFormField)dup;
+ PdfFormField srcField = (PdfFormField)annot;
+ dupField.parent = srcField.parent;
+ dupField.kids = srcField.kids;
+ }
+ else
+ dup = new PdfAnnotation(annot.writer, null);
+ dup.merge(annot);
+ dup.form = annot.form;
+ dup.annotation = annot.annotation;
+ dup.templates = annot.templates;
+ return dup;
+ }
+}
diff --git a/src/main/java/com/lowagie/text/pdf/PdfFormXObject.java b/src/main/java/com/lowagie/text/pdf/PdfFormXObject.java
new file mode 100644
index 0000000..15f0041
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/PdfFormXObject.java
@@ -0,0 +1,103 @@
+/*
+ * $Id: PdfFormXObject.java,v 1.58 2005/07/16 16:49:22 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 1999, 2000, 2001, 2002 Bruno Lowagie
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf;
+
+/**
+ * <CODE>PdfFormObject</CODE> is a type of XObject containing a template-object.
+ */
+
+public class PdfFormXObject extends PdfStream {
+
+ // public static final variables
+
+/** This is a PdfNumber representing 0. */
+ public static final PdfNumber ZERO = new PdfNumber(0);
+
+/** This is a PdfNumber representing 1. */
+ public static final PdfNumber ONE = new PdfNumber(1);
+
+/** This is the 1 - matrix. */
+ public static final PdfLiteral MATRIX = new PdfLiteral("[1 0 0 1 0 0]");
+
+ // membervariables
+
+
+ // constructor
+
+/**
+ * Constructs a <CODE>PdfFormXObject</CODE>-object.
+ *
+ * @param template the template
+ */
+
+ PdfFormXObject(PdfTemplate template) // throws BadPdfFormatException
+ {
+ super();
+ put(PdfName.TYPE, PdfName.XOBJECT);
+ put(PdfName.SUBTYPE, PdfName.FORM);
+ put(PdfName.RESOURCES, template.getResources());
+ put(PdfName.BBOX, new PdfRectangle(template.getBoundingBox()));
+ put(PdfName.FORMTYPE, ONE);
+ if (template.getLayer() != null)
+ put(PdfName.OC, template.getLayer().getRef());
+ if (template.getGroup() != null)
+ put(PdfName.GROUP, template.getGroup());
+ PdfArray matrix = template.getMatrix();
+ if (matrix == null)
+ put(PdfName.MATRIX, MATRIX);
+ else
+ put(PdfName.MATRIX, matrix);
+ bytes = template.toPdf(null);
+ put(PdfName.LENGTH, new PdfNumber(bytes.length));
+ flateCompress();
+ }
+
+}
diff --git a/src/main/java/com/lowagie/text/pdf/PdfFunction.java b/src/main/java/com/lowagie/text/pdf/PdfFunction.java
new file mode 100644
index 0000000..1460ba8
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/PdfFunction.java
@@ -0,0 +1,142 @@
+/*
+ * Copyright 2002 Paulo Soares
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+package com.lowagie.text.pdf;
+
+import com.lowagie.text.ExceptionConverter;
+import java.io.IOException;
+/** Implements PDF functions.
+ *
+ * @author Paulo Soares (psoares@consiste.pt)
+ */
+public class PdfFunction {
+
+ protected PdfWriter writer;
+
+ protected PdfIndirectReference reference;
+
+ protected PdfDictionary dictionary;
+
+ /** Creates new PdfFunction */
+ protected PdfFunction(PdfWriter writer) {
+ this.writer = writer;
+ }
+
+ PdfIndirectReference getReference() {
+ try {
+ if (reference == null) {
+ reference = writer.addToBody(dictionary).getIndirectReference();
+ }
+ }
+ catch (IOException ioe) {
+ throw new ExceptionConverter(ioe);
+ }
+ return reference;
+ }
+
+ public static PdfFunction type0(PdfWriter writer, float domain[], float range[], int size[],
+ int bitsPerSample, int order, float encode[], float decode[], byte stream[]) {
+ PdfFunction func = new PdfFunction(writer);
+ func.dictionary = new PdfStream(stream);
+ ((PdfStream)func.dictionary).flateCompress();
+ func.dictionary.put(PdfName.FUNCTIONTYPE, new PdfNumber(0));
+ func.dictionary.put(PdfName.DOMAIN, new PdfArray(domain));
+ func.dictionary.put(PdfName.RANGE, new PdfArray(range));
+ func.dictionary.put(PdfName.SIZE, new PdfArray(size));
+ func.dictionary.put(PdfName.BITSPERSAMPLE, new PdfNumber(bitsPerSample));
+ if (order != 1)
+ func.dictionary.put(PdfName.ORDER, new PdfNumber(order));
+ if (encode != null)
+ func.dictionary.put(PdfName.ENCODE, new PdfArray(encode));
+ if (decode != null)
+ func.dictionary.put(PdfName.DECODE, new PdfArray(decode));
+ return func;
+ }
+
+ public static PdfFunction type2(PdfWriter writer, float domain[], float range[], float c0[], float c1[], float n) {
+ PdfFunction func = new PdfFunction(writer);
+ func.dictionary = new PdfDictionary();
+ func.dictionary.put(PdfName.FUNCTIONTYPE, new PdfNumber(2));
+ func.dictionary.put(PdfName.DOMAIN, new PdfArray(domain));
+ if (range != null)
+ func.dictionary.put(PdfName.RANGE, new PdfArray(range));
+ if (c0 != null)
+ func.dictionary.put(PdfName.C0, new PdfArray(c0));
+ if (c1 != null)
+ func.dictionary.put(PdfName.C1, new PdfArray(c1));
+ func.dictionary.put(PdfName.N, new PdfNumber(n));
+ return func;
+ }
+
+ public static PdfFunction type3(PdfWriter writer, float domain[], float range[], PdfFunction functions[], float bounds[], float encode[]) {
+ PdfFunction func = new PdfFunction(writer);
+ func.dictionary = new PdfDictionary();
+ func.dictionary.put(PdfName.FUNCTIONTYPE, new PdfNumber(3));
+ func.dictionary.put(PdfName.DOMAIN, new PdfArray(domain));
+ if (range != null)
+ func.dictionary.put(PdfName.RANGE, new PdfArray(range));
+ PdfArray array = new PdfArray();
+ for (int k = 0; k < functions.length; ++k)
+ array.add(functions[k].getReference());
+ func.dictionary.put(PdfName.FUNCTIONS, array);
+ func.dictionary.put(PdfName.BOUNDS, new PdfArray(bounds));
+ func.dictionary.put(PdfName.ENCODE, new PdfArray(encode));
+ return func;
+ }
+
+ public static PdfFunction type4(PdfWriter writer, float domain[], float range[], String postscript) {
+ byte b[] = new byte[postscript.length()];
+ for (int k = 0; k < b.length; ++k)
+ b[k] = (byte)postscript.charAt(k);
+ PdfFunction func = new PdfFunction(writer);
+ func.dictionary = new PdfStream(b);
+ ((PdfStream)func.dictionary).flateCompress();
+ func.dictionary.put(PdfName.FUNCTIONTYPE, new PdfNumber(4));
+ func.dictionary.put(PdfName.DOMAIN, new PdfArray(domain));
+ func.dictionary.put(PdfName.RANGE, new PdfArray(range));
+ return func;
+ }
+}
diff --git a/src/main/java/com/lowagie/text/pdf/PdfGState.java b/src/main/java/com/lowagie/text/pdf/PdfGState.java
new file mode 100644
index 0000000..6ea1ebc
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/PdfGState.java
@@ -0,0 +1,144 @@
+/*
+ * Copyright 2003 Paulo Soares
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+package com.lowagie.text.pdf;
+
+/** The graphic state dictionary.
+ *
+ * @author Paulo Soares (psoares@consiste.pt)
+ */
+public class PdfGState extends PdfDictionary {
+ /** A possible blend mode */
+ public static final PdfName BM_NORMAL = new PdfName("Normal");
+ /** A possible blend mode */
+ public static final PdfName BM_COMPATIBLE = new PdfName("Compatible");
+ /** A possible blend mode */
+ public static final PdfName BM_MULTIPLY = new PdfName("Multiply");
+ /** A possible blend mode */
+ public static final PdfName BM_SCREEN = new PdfName("Screen");
+ /** A possible blend mode */
+ public static final PdfName BM_OVERLAY = new PdfName("Overlay");
+ /** A possible blend mode */
+ public static final PdfName BM_DARKEN = new PdfName("Darken");
+ /** A possible blend mode */
+ public static final PdfName BM_LIGHTEN = new PdfName("Lighten");
+ /** A possible blend mode */
+ public static final PdfName BM_COLORDODGE = new PdfName("ColorDodge");
+ /** A possible blend mode */
+ public static final PdfName BM_COLORBURN = new PdfName("ColorBurn");
+ /** A possible blend mode */
+ public static final PdfName BM_HARDLIGHT = new PdfName("HardLight");
+ /** A possible blend mode */
+ public static final PdfName BM_SOFTLIGHT = new PdfName("SoftLight");
+ /** A possible blend mode */
+ public static final PdfName BM_DIFFERENCE = new PdfName("Difference");
+ /** A possible blend mode */
+ public static final PdfName BM_EXCLUSION = new PdfName("Exclusion");
+
+ /**
+ * Sets the flag whether to apply overprint for stroking.
+ * @param ov
+ */
+ public void setOverPrintStroking(boolean ov) {
+ put(PdfName.OP, ov ? PdfBoolean.PDFTRUE : PdfBoolean.PDFFALSE);
+ }
+
+ /**
+ * Sets the flag whether to apply overprint for non stroking painting operations.
+ * @param ov
+ */
+ public void setOverPrintNonStroking(boolean ov) {
+ put(PdfName.op, ov ? PdfBoolean.PDFTRUE : PdfBoolean.PDFFALSE);
+ }
+
+ /**
+ * Sets the current stroking alpha constant, specifying the constant shape or
+ * constant opacity value to be used for stroking operations in the transparent
+ * imaging model.
+ * @param n
+ */
+ public void setStrokeOpacity(float n) {
+ put(PdfName.CA, new PdfNumber(n));
+ }
+
+ /**
+ * Sets the current stroking alpha constant, specifying the constant shape or
+ * constant opacity value to be used for nonstroking operations in the transparent
+ * imaging model.
+ * @param n
+ */
+ public void setFillOpacity(float n) {
+ put(PdfName.ca, new PdfNumber(n));
+ }
+
+ /**
+ * The alpha source flag specifying whether the current soft mask
+ * and alpha constant are to be interpreted as shape values (true)
+ * or opacity values (false).
+ * @param v
+ */
+ public void setAlphaIsShape(boolean v) {
+ put(PdfName.AIS, v ? PdfBoolean.PDFTRUE : PdfBoolean.PDFFALSE);
+ }
+
+ /**
+ * Determines the behaviour of overlapping glyphs within a text object
+ * in the transparent imaging model.
+ * @param v
+ */
+ public void setTextKnockout(boolean v) {
+ put(PdfName.TK, v ? PdfBoolean.PDFTRUE : PdfBoolean.PDFFALSE);
+ }
+
+ /**
+ * The current blend mode to be used in the transparent imaging model.
+ * @param bm
+ */
+ public void setBlendMode(PdfName bm) {
+ put(PdfName.BM, bm);
+ }
+
+}
diff --git a/src/main/java/com/lowagie/text/pdf/PdfGraphics2D.java b/src/main/java/com/lowagie/text/pdf/PdfGraphics2D.java
new file mode 100644
index 0000000..962b502
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/PdfGraphics2D.java
@@ -0,0 +1,1450 @@
+/*
+ * Copyright 2002 by Jim Moore <jim@scolamoore.com>.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf;
+
+import java.awt.BasicStroke;
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.Composite;
+import java.awt.Font;
+import java.awt.FontMetrics;
+import java.awt.Graphics;
+import java.awt.Graphics2D;
+import java.awt.GraphicsConfiguration;
+import java.awt.Image;
+import java.awt.Paint;
+import java.awt.GradientPaint;
+import java.awt.TexturePaint;
+import java.awt.MediaTracker;
+import java.awt.Polygon;
+import java.awt.Rectangle;
+import java.awt.RenderingHints;
+import java.awt.Shape;
+import java.awt.Stroke;
+import java.awt.Transparency;
+import java.awt.font.FontRenderContext;
+import java.awt.font.GlyphVector;
+import java.awt.font.TextLayout;
+import java.awt.geom.AffineTransform;
+import java.awt.geom.Arc2D;
+import java.awt.geom.Area;
+import java.awt.geom.Ellipse2D;
+import java.awt.geom.Line2D;
+import java.awt.geom.PathIterator;
+import java.awt.geom.Rectangle2D;
+import java.awt.geom.RoundRectangle2D;
+import java.awt.image.BufferedImage;
+import java.awt.image.BufferedImageOp;
+import java.awt.image.ColorModel;
+import java.awt.image.ImageObserver;
+import java.awt.image.RenderedImage;
+import java.awt.image.WritableRaster;
+import java.awt.image.renderable.RenderableImage;
+import java.awt.RenderingHints.Key;
+import java.awt.geom.NoninvertibleTransformException;
+import java.awt.geom.Point2D;
+import java.text.AttributedCharacterIterator;
+import java.util.Map;
+import java.util.HashMap;
+import java.util.Hashtable;
+import java.util.ArrayList;
+import java.io.ByteArrayOutputStream;
+//
+import java.util.Set;
+import java.util.Iterator;
+import java.awt.font.TextAttribute;
+
+public class PdfGraphics2D extends Graphics2D {
+
+ private static final int FILL = 1;
+ private static final int STROKE = 2;
+ private static final int CLIP = 3;
+ private BasicStroke strokeOne = new BasicStroke(1);
+
+ private static AffineTransform IDENTITY = new AffineTransform();
+
+ private Font font;
+ private BaseFont baseFont;
+ private float fontSize;
+ private AffineTransform transform;
+ private Paint paint;
+ private Color background;
+ private float width;
+ private float height;
+
+ private Area clip;
+
+ private RenderingHints rhints = new RenderingHints(null);
+
+ private Stroke stroke;
+ private Stroke originalStroke;
+
+ private PdfContentByte cb;
+
+ /** Storage for BaseFont objects created. */
+ private HashMap baseFonts;
+
+ private boolean disposeCalled = false;
+
+ private FontMapper fontMapper;
+
+ private ArrayList kids;
+
+ private boolean kid = false;
+
+ private Graphics2D dg2 = new BufferedImage(2, 2, BufferedImage.TYPE_INT_RGB).createGraphics();
+
+ private boolean onlyShapes = false;
+
+ private Stroke oldStroke;
+ private Paint paintFill;
+ private Paint paintStroke;
+
+ private MediaTracker mediaTracker;
+
+ // Added by Jurij Bilas
+ protected boolean underline; // indicates if the font style is underlined
+
+ protected PdfGState fillGState[] = new PdfGState[256];
+ protected PdfGState strokeGState[] = new PdfGState[256];
+ protected int currentFillGState = 255;
+ protected int currentStrokeGState = 255;
+
+ public static int AFM_DIVISOR = 1000; // used to calculate coordinates
+
+ private boolean convertImagesToJPEG = false;
+ private float jpegQuality = .95f;
+
+ private PdfGraphics2D() {
+ dg2.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON);
+ setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON);
+ }
+
+ /**
+ * Constructor for PDFGraphics2D.
+ *
+ */
+ PdfGraphics2D(PdfContentByte cb, float width, float height, FontMapper fontMapper, boolean onlyShapes, boolean convertImagesToJPEG, float quality) {
+ super();
+ dg2.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON);
+ setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON);
+ try {
+ Class.forName("com.sun.image.codec.jpeg.JPEGCodec");
+ }
+ catch (Throwable t) {
+ convertImagesToJPEG = false;
+ }
+ this.convertImagesToJPEG = convertImagesToJPEG;
+ this.jpegQuality = quality;
+ this.onlyShapes = onlyShapes;
+ this.transform = new AffineTransform();
+ this.baseFonts = new HashMap();
+ if (!onlyShapes) {
+ this.fontMapper = fontMapper;
+ if (this.fontMapper == null)
+ this.fontMapper = new DefaultFontMapper();
+ }
+ this.kids = new ArrayList();
+ paint = Color.black;
+ background = Color.white;
+ setFont(new Font("sanserif", Font.PLAIN, 12));
+ this.cb = cb;
+ cb.saveState();
+ this.width = width;
+ this.height = height;
+ clip = new Area(new Rectangle2D.Float(0, 0, width, height));
+ clip(clip);
+ originalStroke = stroke = oldStroke = strokeOne;
+ setStrokeDiff(stroke, null);
+ cb.saveState();
+ }
+
+ /**
+ * @see Graphics2D#draw(Shape)
+ */
+ public void draw(Shape s) {
+ followPath(s, STROKE);
+ }
+
+ /**
+ * @see Graphics2D#drawImage(Image, AffineTransform, ImageObserver)
+ */
+ public boolean drawImage(Image img, AffineTransform xform, ImageObserver obs) {
+ return drawImage(img, null, xform, null, obs);
+ }
+
+ /**
+ * @see Graphics2D#drawImage(BufferedImage, BufferedImageOp, int, int)
+ */
+ public void drawImage(BufferedImage img, BufferedImageOp op, int x, int y) {
+ BufferedImage result = img;
+ if (op != null) {
+ result = op.createCompatibleDestImage(img, img.getColorModel());
+ result = op.filter(img, result);
+ }
+ drawImage(result, x, y, null);
+ }
+
+ /**
+ * @see Graphics2D#drawRenderedImage(RenderedImage, AffineTransform)
+ */
+ public void drawRenderedImage(RenderedImage img, AffineTransform xform) {
+ BufferedImage image = null;
+ if (img instanceof BufferedImage) {
+ image = (BufferedImage)img;
+ } else {
+ ColorModel cm = img.getColorModel();
+ int width = img.getWidth();
+ int height = img.getHeight();
+ WritableRaster raster = cm.createCompatibleWritableRaster(width, height);
+ boolean isAlphaPremultiplied = cm.isAlphaPremultiplied();
+ Hashtable properties = new Hashtable();
+ String[] keys = img.getPropertyNames();
+ if (keys!=null) {
+ for (int i = 0; i < keys.length; i++) {
+ properties.put(keys[i], img.getProperty(keys[i]));
+ }
+ }
+ BufferedImage result = new BufferedImage(cm, raster, isAlphaPremultiplied, properties);
+ img.copyData(raster);
+ image=result;
+ }
+ drawImage(image, xform, null);
+ }
+
+ /**
+ * @see Graphics2D#drawRenderableImage(RenderableImage, AffineTransform)
+ */
+ public void drawRenderableImage(RenderableImage img, AffineTransform xform) {
+ drawRenderedImage(img.createDefaultRendering(), xform);
+ }
+
+ /**
+ * @see Graphics#drawString(String, int, int)
+ */
+ public void drawString(String s, int x, int y) {
+ drawString(s, (float)x, (float)y);
+ }
+
+ /**
+ * Calculates position and/or stroke thickness depending on the font size
+ * @param d value to be converted
+ * @param i font size
+ * @return position and/or stroke thickness depending on the font size
+ */
+ public static double asPoints(double d, int i) {
+ return (d * (double)i) / (double)AFM_DIVISOR;
+ }
+ /**
+ * This routine goes through the attributes and sets the font
+ * before calling the actual string drawing routine
+ * @param iter
+ */
+ protected void doAttributes(AttributedCharacterIterator iter) {
+ underline = false;
+ Set set = iter.getAttributes().keySet();
+ for(Iterator iterator = set.iterator(); iterator.hasNext();) {
+ AttributedCharacterIterator.Attribute attribute = (AttributedCharacterIterator.Attribute)iterator.next();
+ if (!(attribute instanceof TextAttribute))
+ continue;
+ TextAttribute textattribute = (TextAttribute)attribute;
+ if(textattribute.equals(TextAttribute.FONT)) {
+ Font font = (Font)iter.getAttributes().get(textattribute);
+ setFont(font);
+ }
+ else if(textattribute.equals(TextAttribute.UNDERLINE)) {
+ if(iter.getAttributes().get(textattribute) == TextAttribute.UNDERLINE_ON)
+ underline = true;
+ }
+ else if(textattribute.equals(TextAttribute.SUPERSCRIPT)) {
+ throw new RuntimeException("TextAttribute.SUPERSCRIPT not supported");
+ /*
+ iter.getAttributes().get(textattribute);
+ Integer _tmp = TextAttribute.SUPERSCRIPT_SUPER;
+ subscript = true;
+ */
+ }
+ else if(textattribute.equals(TextAttribute.SIZE)) {
+ Object obj = iter.getAttributes().get(textattribute);
+ Font font1 = null;
+ if(obj instanceof Integer) {
+ int i = ((Integer)obj).intValue();
+ font1 = getFont().deriveFont(getFont().getStyle(), i);
+ }
+ else if(obj instanceof Float) {
+ float f = ((Float)obj).floatValue();
+ font1 = getFont().deriveFont(getFont().getStyle(), f);
+ }
+ else {
+ throw new RuntimeException("Unknown type " + obj.getClass() + " for attribute SIZE");
+ }
+ setFont(font1);
+ }
+ else if(textattribute.equals(TextAttribute.FOREGROUND)) {
+ setColor((Color) iter.getAttributes().get(textattribute));
+ }
+ else if(textattribute.equals(TextAttribute.BACKGROUND)) {
+ throw new RuntimeException("Background color not supported");
+ }
+ else {
+ throw new RuntimeException("Unknown TextAttribute: " + textattribute);
+ }
+ }
+ }
+
+ /**
+ * @see Graphics2D#drawString(String, float, float)
+ */
+ public void drawString(String s, float x, float y) {
+ if (s.length() == 0)
+ return;
+ setFillPaint();
+ if (onlyShapes) {
+// TextLayout tl = new TextLayout(s, this.font, new FontRenderContext(new AffineTransform(), false, true));
+// tl.draw(this, x, y);
+ drawGlyphVector(this.font.layoutGlyphVector(new FontRenderContext(new AffineTransform(), true, false), s.toCharArray(), 0, s.length(), java.awt.Font.LAYOUT_LEFT_TO_RIGHT), x, y);
+// Use the following line to compile in JDK 1.3
+// drawGlyphVector(this.font.createGlyphVector(new FontRenderContext(new AffineTransform(), true, false), s), x, y);
+ }
+ else {
+ AffineTransform at = getTransform();
+ AffineTransform at2 = getTransform();
+ at2.translate(x, y);
+ at2.concatenate(font.getTransform());
+ setTransform(at2);
+ AffineTransform inverse = this.normalizeMatrix();
+ AffineTransform flipper = AffineTransform.getScaleInstance(1,-1);
+ inverse.concatenate(flipper);
+ double[] mx = new double[6];
+ inverse.getMatrix(mx);
+ cb.beginText();
+ cb.setFontAndSize(baseFont, fontSize);
+ cb.setTextMatrix((float)mx[0], (float)mx[1], (float)mx[2], (float)mx[3], (float)mx[4], (float)mx[5]);
+ double width = 0;
+ if (font.getSize2D() > 0) {
+ float scale = 1000 / font.getSize2D();
+ width = font.deriveFont(AffineTransform.getScaleInstance(scale, scale)).getStringBounds(s, getFontRenderContext()).getWidth() / scale;
+ }
+ if (s.length() > 1) {
+ float adv = ((float)width - baseFont.getWidthPoint(s, fontSize)) / (s.length() - 1);
+ cb.setCharacterSpacing(adv);
+ }
+ cb.showText(s);
+ if (s.length() > 1) {
+ cb.setCharacterSpacing(0);
+ }
+ cb.endText();
+ setTransform(at);
+ if(underline)
+ {
+ // These two are supposed to be taken from the .AFM file
+ //int UnderlinePosition = -100;
+ int UnderlineThickness = 50;
+ //
+ double d = asPoints((double)UnderlineThickness, (int)fontSize);
+ setStroke(new BasicStroke((float)d));
+ y = (float)((double)(y) + asPoints((double)(UnderlineThickness), (int)fontSize));
+ Line2D line = new Line2D.Double((double)x, (double)y, (double)(width+x), (double)y);
+ draw(line);
+ }
+ }
+ }
+
+ /**
+ * @see Graphics#drawString(AttributedCharacterIterator, int, int)
+ */
+ public void drawString(AttributedCharacterIterator iterator, int x, int y) {
+ drawString(iterator, (float)x, (float)y);
+ }
+
+ /**
+ * @see Graphics2D#drawString(AttributedCharacterIterator, float, float)
+ */
+ public void drawString(AttributedCharacterIterator iter, float x, float y) {
+/*
+ StringBuffer sb = new StringBuffer();
+ for(char c = iter.first(); c != AttributedCharacterIterator.DONE; c = iter.next()) {
+ sb.append(c);
+ }
+ drawString(sb.toString(),x,y);
+*/
+ StringBuffer stringbuffer = new StringBuffer(iter.getEndIndex());
+ for(char c = iter.first(); c != '\uFFFF'; c = iter.next())
+ {
+ if(iter.getIndex() == iter.getRunStart())
+ {
+ if(stringbuffer.length() > 0)
+ {
+ drawString(stringbuffer.toString(), x, y);
+ FontMetrics fontmetrics = getFontMetrics();
+ x = (float)((double)x + fontmetrics.getStringBounds(stringbuffer.toString(), this).getWidth());
+ stringbuffer.delete(0, stringbuffer.length());
+ }
+ doAttributes(iter);
+ }
+ stringbuffer.append(c);
+ }
+
+ drawString(stringbuffer.toString(), x, y);
+ underline = false;
+ }
+
+ /**
+ * @see Graphics2D#drawGlyphVector(GlyphVector, float, float)
+ */
+ public void drawGlyphVector(GlyphVector g, float x, float y) {
+ Shape s = g.getOutline(x, y);
+ fill(s);
+ }
+
+ /**
+ * @see Graphics2D#fill(Shape)
+ */
+ public void fill(Shape s) {
+ followPath(s, FILL);
+ }
+
+ /**
+ * @see Graphics2D#hit(Rectangle, Shape, boolean)
+ */
+ public boolean hit(Rectangle rect, Shape s, boolean onStroke) {
+ if (onStroke) {
+ s = stroke.createStrokedShape(s);
+ }
+ s = transform.createTransformedShape(s);
+ Area area = new Area(s);
+ if (clip != null)
+ area.intersect(clip);
+ return area.intersects(rect.x, rect.y, rect.width, rect.height);
+ }
+
+ /**
+ * @see Graphics2D#getDeviceConfiguration()
+ */
+ public GraphicsConfiguration getDeviceConfiguration() {
+ return dg2.getDeviceConfiguration();
+ }
+
+ /**
+ * @see Graphics2D#setComposite(Composite)
+ */
+ public void setComposite(Composite comp) {
+
+ }
+
+ /**
+ * @see Graphics2D#setPaint(Paint)
+ */
+ public void setPaint(Paint paint) {
+ if (paint == null)
+ return;
+ this.paint = paint;
+// setPaint(paint, false, 0, 0);
+ }
+
+ private Stroke transformStroke(Stroke stroke) {
+ if (!(stroke instanceof BasicStroke))
+ return stroke;
+ BasicStroke st = (BasicStroke)stroke;
+ float scale = (float)Math.sqrt(Math.abs(transform.getDeterminant()));
+ float dash[] = st.getDashArray();
+ if (dash != null) {
+ for (int k = 0; k < dash.length; ++k)
+ dash[k] *= scale;
+ }
+ return new BasicStroke(st.getLineWidth() * scale, st.getEndCap(), st.getLineJoin(), st.getMiterLimit(), dash, st.getDashPhase() * scale);
+ }
+
+ private void setStrokeDiff(Stroke newStroke, Stroke oldStroke) {
+ if (newStroke == oldStroke)
+ return;
+ if (!(newStroke instanceof BasicStroke))
+ return;
+ BasicStroke nStroke = (BasicStroke)newStroke;
+ boolean oldOk = (oldStroke instanceof BasicStroke);
+ BasicStroke oStroke = null;
+ if (oldOk)
+ oStroke = (BasicStroke)oldStroke;
+ if (!oldOk || nStroke.getLineWidth() != oStroke.getLineWidth())
+ cb.setLineWidth(nStroke.getLineWidth());
+ if (!oldOk || nStroke.getEndCap() != oStroke.getEndCap()) {
+ switch (nStroke.getEndCap()) {
+ case BasicStroke.CAP_BUTT:
+ cb.setLineCap(0);
+ break;
+ case BasicStroke.CAP_SQUARE:
+ cb.setLineCap(2);
+ break;
+ default:
+ cb.setLineCap(1);
+ }
+ }
+ if (!oldOk || nStroke.getLineJoin() != oStroke.getLineJoin()) {
+ switch (nStroke.getLineJoin()) {
+ case BasicStroke.JOIN_MITER:
+ cb.setLineJoin(0);
+ break;
+ case BasicStroke.JOIN_BEVEL:
+ cb.setLineJoin(2);
+ break;
+ default:
+ cb.setLineJoin(1);
+ }
+ }
+ if (!oldOk || nStroke.getMiterLimit() != oStroke.getMiterLimit())
+ cb.setMiterLimit(nStroke.getMiterLimit());
+ boolean makeDash;
+ if (oldOk) {
+ if (nStroke.getDashArray() != null) {
+ if (nStroke.getDashPhase() != oStroke.getDashPhase()) {
+ makeDash = true;
+ }
+ else if (!java.util.Arrays.equals(nStroke.getDashArray(), oStroke.getDashArray())) {
+ makeDash = true;
+ }
+ else
+ makeDash = false;
+ }
+ else if (oStroke.getDashArray() != null) {
+ makeDash = true;
+ }
+ else
+ makeDash = false;
+ }
+ else {
+ makeDash = true;
+ }
+ if (makeDash) {
+ float dash[] = nStroke.getDashArray();
+ if (dash == null)
+ cb.setLiteral("[]0 d\n");
+ else {
+ cb.setLiteral('[');
+ int lim = dash.length;
+ for (int k = 0; k < lim; ++k) {
+ cb.setLiteral(dash[k]);
+ cb.setLiteral(' ');
+ }
+ cb.setLiteral(']');
+ cb.setLiteral(nStroke.getDashPhase());
+ cb.setLiteral(" d\n");
+ }
+ }
+ }
+
+ /**
+ * @see Graphics2D#setStroke(Stroke)
+ */
+ public void setStroke(Stroke s) {
+ originalStroke = s;
+ this.stroke = transformStroke(s);
+ }
+
+
+ /**
+ * Sets a rendering hint
+ * @param arg0
+ * @param arg1
+ */
+ public void setRenderingHint(Key arg0, Object arg1) {
+ rhints.put(arg0, arg1);
+ }
+
+ /**
+ * @param arg0 a key
+ * @return the rendering hint
+ */
+ public Object getRenderingHint(Key arg0) {
+ return rhints.get(arg0);
+ }
+
+ /**
+ * @see Graphics2D#setRenderingHints(Map)
+ */
+ public void setRenderingHints(Map hints) {
+ rhints.clear();
+ rhints.putAll(hints);
+ }
+
+ /**
+ * @see Graphics2D#addRenderingHints(Map)
+ */
+ public void addRenderingHints(Map hints) {
+ rhints.putAll(hints);
+ }
+
+ /**
+ * @see Graphics2D#getRenderingHints()
+ */
+ public RenderingHints getRenderingHints() {
+ return rhints;
+ }
+
+ /**
+ * @see Graphics#translate(int, int)
+ */
+ public void translate(int x, int y) {
+ translate((double)x, (double)y);
+ }
+
+ /**
+ * @see Graphics2D#translate(double, double)
+ */
+ public void translate(double tx, double ty) {
+ transform.translate(tx,ty);
+ }
+
+ /**
+ * @see Graphics2D#rotate(double)
+ */
+ public void rotate(double theta) {
+ transform.rotate(theta);
+ }
+
+ /**
+ * @see Graphics2D#rotate(double, double, double)
+ */
+ public void rotate(double theta, double x, double y) {
+ transform.rotate(theta, x, y);
+ }
+
+ /**
+ * @see Graphics2D#scale(double, double)
+ */
+ public void scale(double sx, double sy) {
+ transform.scale(sx, sy);
+ this.stroke = transformStroke(originalStroke);
+ }
+
+ /**
+ * @see Graphics2D#shear(double, double)
+ */
+ public void shear(double shx, double shy) {
+ transform.shear(shx, shy);
+ }
+
+ /**
+ * @see Graphics2D#transform(AffineTransform)
+ */
+ public void transform(AffineTransform tx) {
+ transform.concatenate(tx);
+ this.stroke = transformStroke(originalStroke);
+ }
+
+ /**
+ * @see Graphics2D#setTransform(AffineTransform)
+ */
+ public void setTransform(AffineTransform t) {
+ transform = new AffineTransform(t);
+ this.stroke = transformStroke(originalStroke);
+ }
+
+ /**
+ * @see Graphics2D#getTransform()
+ */
+ public AffineTransform getTransform() {
+ return new AffineTransform(transform);
+ }
+
+ /**
+ * @see Graphics2D#getPaint()
+ */
+ public Paint getPaint() {
+ return paint;
+ }
+
+ /**
+ * @see Graphics2D#getComposite()
+ */
+ public Composite getComposite() {
+ return null;
+ }
+
+ /**
+ * @see Graphics2D#setBackground(Color)
+ */
+ public void setBackground(Color color) {
+ background = color;
+ }
+
+ /**
+ * @see Graphics2D#getBackground()
+ */
+ public Color getBackground() {
+ return background;
+ }
+
+ /**
+ * @see Graphics2D#getStroke()
+ */
+ public Stroke getStroke() {
+ return originalStroke;
+ }
+
+
+ /**
+ * @see Graphics2D#getFontRenderContext()
+ */
+ public FontRenderContext getFontRenderContext() {
+ return new FontRenderContext(null, true, true);
+ }
+
+ /**
+ * @see Graphics#create()
+ */
+ public Graphics create() {
+ PdfGraphics2D g2 = new PdfGraphics2D();
+ g2.onlyShapes = this.onlyShapes;
+ g2.transform = new AffineTransform(this.transform);
+ g2.baseFonts = this.baseFonts;
+ g2.fontMapper = this.fontMapper;
+ g2.kids = this.kids;
+ g2.paint = this.paint;
+ g2.fillGState = this.fillGState;
+ g2.strokeGState = this.strokeGState;
+ g2.background = this.background;
+ g2.mediaTracker = this.mediaTracker;
+ g2.convertImagesToJPEG = this.convertImagesToJPEG;
+ g2.jpegQuality = this.jpegQuality;
+ g2.setFont(this.font);
+ g2.cb = this.cb.getDuplicate();
+ g2.cb.saveState();
+ g2.width = this.width;
+ g2.height = this.height;
+ g2.followPath(new Area(new Rectangle2D.Float(0, 0, width, height)), CLIP);
+ if (this.clip != null)
+ g2.clip = new Area(this.clip);
+ g2.stroke = stroke;
+ g2.originalStroke = originalStroke;
+ g2.strokeOne = (BasicStroke)g2.transformStroke(g2.strokeOne);
+ g2.oldStroke = g2.strokeOne;
+ g2.setStrokeDiff(g2.oldStroke, null);
+ g2.cb.saveState();
+ if (g2.clip != null)
+ g2.followPath(g2.clip, CLIP);
+ g2.kid = true;
+ synchronized (kids) {
+ kids.add(g2);
+ }
+ return g2;
+ }
+
+ public PdfContentByte getContent() {
+ return this.cb;
+ }
+ /**
+ * @see Graphics#getColor()
+ */
+ public Color getColor() {
+ if (paint instanceof Color) {
+ return (Color)paint;
+ } else {
+ return Color.black;
+ }
+ }
+
+ /**
+ * @see Graphics#setColor(Color)
+ */
+ public void setColor(Color color) {
+ setPaint(color);
+ }
+
+ /**
+ * @see Graphics#setPaintMode()
+ */
+ public void setPaintMode() {}
+
+ /**
+ * @see Graphics#setXORMode(Color)
+ */
+ public void setXORMode(Color c1) {
+
+ }
+
+ /**
+ * @see Graphics#getFont()
+ */
+ public Font getFont() {
+ return font;
+ }
+
+ /**
+ * @see Graphics#setFont(Font)
+ */
+ /**
+ * Sets the current font.
+ */
+ public void setFont(Font f) {
+ if (f == null)
+ return;
+ if (onlyShapes) {
+ font = f;
+ return;
+ }
+ if (f == font)
+ return;
+ font = f;
+ fontSize = f.getSize2D();
+ baseFont = getCachedBaseFont(f);
+ }
+
+ private BaseFont getCachedBaseFont(Font f) {
+ synchronized (baseFonts) {
+ BaseFont bf = (BaseFont)baseFonts.get(f.getFontName());
+ if (bf == null) {
+ bf = fontMapper.awtToPdf(f);
+ baseFonts.put(f.getFontName(), bf);
+ }
+ return bf;
+ }
+ }
+
+ /**
+ * @see Graphics#getFontMetrics(Font)
+ */
+ public FontMetrics getFontMetrics(Font f) {
+ return dg2.getFontMetrics(f);
+ }
+
+ /**
+ * @see Graphics#getClipBounds()
+ */
+ public Rectangle getClipBounds() {
+ if (clip == null)
+ return null;
+ return getClip().getBounds();
+ }
+
+ /**
+ * @see Graphics#clipRect(int, int, int, int)
+ */
+ public void clipRect(int x, int y, int width, int height) {
+ Rectangle2D rect = new Rectangle2D.Double(x,y,width,height);
+ clip(rect);
+ }
+
+ /**
+ * @see Graphics#setClip(int, int, int, int)
+ */
+ public void setClip(int x, int y, int width, int height) {
+ Rectangle2D rect = new Rectangle2D.Double(x,y,width,height);
+ setClip(rect);
+ }
+
+ /**
+ * @see Graphics2D#clip(Shape)
+ */
+ public void clip(Shape s) {
+ if (s != null)
+ s = transform.createTransformedShape(s);
+ if (clip == null)
+ clip = new Area(s);
+ else
+ clip.intersect(new Area(s));
+ followPath(s, CLIP);
+ }
+
+ /**
+ * @see Graphics#getClip()
+ */
+ public Shape getClip() {
+ try {
+ return transform.createInverse().createTransformedShape(clip);
+ }
+ catch (NoninvertibleTransformException e) {
+ return null;
+ }
+ }
+
+ /**
+ * @see Graphics#setClip(Shape)
+ */
+ public void setClip(Shape s) {
+ cb.restoreState();
+ cb.saveState();
+ if (s != null)
+ s = transform.createTransformedShape(s);
+ if (s == null) {
+ clip = null;
+ }
+ else {
+ clip = new Area(s);
+ followPath(s, CLIP);
+ }
+ paintFill = paintStroke = null;
+ currentFillGState = currentStrokeGState = 255;
+ oldStroke = strokeOne;
+ }
+
+ /**
+ * @see Graphics#copyArea(int, int, int, int, int, int)
+ */
+ public void copyArea(int x, int y, int width, int height, int dx, int dy) {
+
+ }
+
+ /**
+ * @see Graphics#drawLine(int, int, int, int)
+ */
+ public void drawLine(int x1, int y1, int x2, int y2) {
+ Line2D line = new Line2D.Double((double)x1, (double)y1, (double)x2, (double)y2);
+ draw(line);
+ }
+
+ /**
+ * @see Graphics#fillRect(int, int, int, int)
+ */
+ public void drawRect(int x, int y, int width, int height) {
+ draw(new Rectangle(x, y, width, height));
+ }
+
+ /**
+ * @see Graphics#fillRect(int, int, int, int)
+ */
+ public void fillRect(int x, int y, int width, int height) {
+ fill(new Rectangle(x,y,width,height));
+ }
+
+ /**
+ * @see Graphics#clearRect(int, int, int, int)
+ */
+ public void clearRect(int x, int y, int width, int height) {
+ Paint temp = paint;
+ setPaint(background);
+ fillRect(x,y,width,height);
+ setPaint(temp);
+ }
+
+ /**
+ * @see Graphics#drawRoundRect(int, int, int, int, int, int)
+ */
+ public void drawRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight) {
+ RoundRectangle2D rect = new RoundRectangle2D.Double(x,y,width,height,arcWidth, arcHeight);
+ draw(rect);
+ }
+
+ /**
+ * @see Graphics#fillRoundRect(int, int, int, int, int, int)
+ */
+ public void fillRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight) {
+ RoundRectangle2D rect = new RoundRectangle2D.Double(x,y,width,height,arcWidth, arcHeight);
+ fill(rect);
+ }
+
+ /**
+ * @see Graphics#drawOval(int, int, int, int)
+ */
+ public void drawOval(int x, int y, int width, int height) {
+ Ellipse2D oval = new Ellipse2D.Float((float)x, (float)y, (float)width, (float)height);
+ draw(oval);
+ }
+
+ /**
+ * @see Graphics#fillOval(int, int, int, int)
+ */
+ public void fillOval(int x, int y, int width, int height) {
+ Ellipse2D oval = new Ellipse2D.Float((float)x, (float)y, (float)width, (float)height);
+ fill(oval);
+ }
+
+ /**
+ * @see Graphics#drawArc(int, int, int, int, int, int)
+ */
+ public void drawArc(int x, int y, int width, int height, int startAngle, int arcAngle) {
+ Arc2D arc = new Arc2D.Double(x,y,width,height,startAngle, arcAngle, Arc2D.OPEN);
+ draw(arc);
+
+ }
+
+ /**
+ * @see Graphics#fillArc(int, int, int, int, int, int)
+ */
+ public void fillArc(int x, int y, int width, int height, int startAngle, int arcAngle) {
+ Arc2D arc = new Arc2D.Double(x,y,width,height,startAngle, arcAngle, Arc2D.PIE);
+ fill(arc);
+ }
+
+ /**
+ * @see Graphics#drawPolyline(int[], int[], int)
+ */
+ public void drawPolyline(int[] x, int[] y, int nPoints) {
+ Line2D line = new Line2D.Double(x[0],y[0],x[0],y[0]);
+ for (int i = 1; i < nPoints; i++) {
+ line.setLine(line.getX2(), line.getY2(), x[i], y[i]);
+ draw(line);
+ }
+ }
+
+ /**
+ * @see Graphics#drawPolygon(int[], int[], int)
+ */
+ public void drawPolygon(int[] xPoints, int[] yPoints, int nPoints) {
+ Polygon poly = new Polygon();
+ for (int i = 0; i < nPoints; i++) {
+ poly.addPoint(xPoints[i], yPoints[i]);
+ }
+ draw(poly);
+ }
+
+ /**
+ * @see Graphics#fillPolygon(int[], int[], int)
+ */
+ public void fillPolygon(int[] xPoints, int[] yPoints, int nPoints) {
+ Polygon poly = new Polygon();
+ for (int i = 0; i < nPoints; i++) {
+ poly.addPoint(xPoints[i], yPoints[i]);
+ }
+ fill(poly);
+ }
+
+ /**
+ * @see Graphics#drawImage(Image, int, int, ImageObserver)
+ */
+ public boolean drawImage(Image img, int x, int y, ImageObserver observer) {
+ return drawImage(img, x, y, null, observer);
+ }
+
+ /**
+ * @see Graphics#drawImage(Image, int, int, int, int, ImageObserver)
+ */
+ public boolean drawImage(Image img, int x, int y, int width, int height, ImageObserver observer) {
+ return drawImage(img, x, y, width, height, null, observer);
+ }
+
+ /**
+ * @see Graphics#drawImage(Image, int, int, Color, ImageObserver)
+ */
+ public boolean drawImage(Image img, int x, int y, Color bgcolor, ImageObserver observer) {
+ waitForImage(img);
+ return drawImage(img, x, y, img.getWidth(observer), img.getHeight(observer), bgcolor, observer);
+ }
+
+ /**
+ * @see Graphics#drawImage(Image, int, int, int, int, Color, ImageObserver)
+ */
+ public boolean drawImage(Image img, int x, int y, int width, int height, Color bgcolor, ImageObserver observer) {
+ waitForImage(img);
+ double scalex = width/(double)img.getWidth(observer);
+ double scaley = height/(double)img.getHeight(observer);
+ AffineTransform tx = AffineTransform.getTranslateInstance(x,y);
+ tx.scale(scalex,scaley);
+ return drawImage(img, null, tx, bgcolor, observer);
+ }
+
+ /**
+ * @see Graphics#drawImage(Image, int, int, int, int, int, int, int, int, ImageObserver)
+ */
+ public boolean drawImage(Image img, int dx1, int dy1, int dx2, int dy2, int sx1, int sy1, int sx2, int sy2, ImageObserver observer) {
+ return drawImage(img, dx1, dy1, dx2, dy2, sx1, sy1, sx2, sy2, null, observer);
+ }
+
+ /**
+ * @see Graphics#drawImage(Image, int, int, int, int, int, int, int, int, Color, ImageObserver)
+ */
+ public boolean drawImage(Image img, int dx1, int dy1, int dx2, int dy2, int sx1, int sy1, int sx2, int sy2, Color bgcolor, ImageObserver observer) {
+ waitForImage(img);
+ double dwidth = (double)dx2-dx1;
+ double dheight = (double)dy2-dy1;
+ double swidth = (double)sx2-sx1;
+ double sheight = (double)sy2-sy1;
+
+ //if either width or height is 0, then there is nothing to draw
+ if (dwidth == 0 || dheight == 0 || swidth == 0 || sheight == 0) return true;
+
+ double scalex = dwidth/swidth;
+ double scaley = dheight/sheight;
+
+ double transx = sx1*scalex;
+ double transy = sy1*scaley;
+ AffineTransform tx = AffineTransform.getTranslateInstance(dx1-transx,dy1-transy);
+ tx.scale(scalex,scaley);
+
+ BufferedImage mask = new BufferedImage(img.getWidth(observer), img.getHeight(observer), BufferedImage.TYPE_BYTE_BINARY);
+ Graphics g = mask.getGraphics();
+ g.fillRect(sx1,sy1, (int)swidth, (int)sheight);
+ drawImage(img, mask, tx, null, observer);
+ g.dispose();
+ return true;
+ }
+
+ /**
+ * @see Graphics#dispose()
+ */
+ public void dispose() {
+ if (kid)
+ return;
+ if (!disposeCalled) {
+ disposeCalled = true;
+ cb.restoreState();
+ cb.restoreState();
+ for (int k = 0; k < kids.size(); ++k) {
+ PdfGraphics2D g2 = (PdfGraphics2D)kids.get(k);
+ g2.cb.restoreState();
+ g2.cb.restoreState();
+ cb.add(g2.cb);
+ g2.dg2.dispose();
+ g2.dg2 = null;
+ }
+ dg2.dispose();
+ dg2 = null;
+ }
+ }
+
+ ///////////////////////////////////////////////
+ //
+ //
+ // implementation specific methods
+ //
+ //
+
+
+ private void followPath(Shape s, int drawType) {
+ if (s==null) return;
+ if (drawType==STROKE) {
+ if (!(stroke instanceof BasicStroke)) {
+ s = stroke.createStrokedShape(s);
+ followPath(s, FILL);
+ return;
+ }
+ }
+ if (drawType==STROKE) {
+ setStrokeDiff(stroke, oldStroke);
+ oldStroke = stroke;
+ setStrokePaint();
+ }
+ else if (drawType==FILL)
+ setFillPaint();
+ PathIterator points;
+ int traces = 0;
+ if (drawType == CLIP)
+ points = s.getPathIterator(IDENTITY);
+ else
+ points = s.getPathIterator(transform);
+ float[] coords = new float[6];
+ while(!points.isDone()) {
+ ++traces;
+ int segtype = points.currentSegment(coords);
+ normalizeY(coords);
+ switch(segtype) {
+ case PathIterator.SEG_CLOSE:
+ cb.closePath();
+ break;
+
+ case PathIterator.SEG_CUBICTO:
+ cb.curveTo(coords[0], coords[1], coords[2], coords[3], coords[4], coords[5]);
+ break;
+
+ case PathIterator.SEG_LINETO:
+ cb.lineTo(coords[0], coords[1]);
+ break;
+
+ case PathIterator.SEG_MOVETO:
+ cb.moveTo(coords[0], coords[1]);
+ break;
+
+ case PathIterator.SEG_QUADTO:
+ cb.curveTo(coords[0], coords[1], coords[2], coords[3]);
+ break;
+ }
+ points.next();
+ }
+ switch (drawType) {
+ case FILL:
+ if (traces > 0) {
+ if (points.getWindingRule() == PathIterator.WIND_EVEN_ODD)
+ cb.eoFill();
+ else
+ cb.fill();
+ }
+ break;
+ case STROKE:
+ if (traces > 0)
+ cb.stroke();
+ break;
+ default: //drawType==CLIP
+ if (traces == 0)
+ cb.rectangle(0, 0, 0, 0);
+ if (points.getWindingRule() == PathIterator.WIND_EVEN_ODD)
+ cb.eoClip();
+ else
+ cb.clip();
+ cb.newPath();
+ }
+ }
+
+ private float normalizeY(float y) {
+ return this.height - y;
+ }
+
+ private void normalizeY(float[] coords) {
+ coords[1] = normalizeY(coords[1]);
+ coords[3] = normalizeY(coords[3]);
+ coords[5] = normalizeY(coords[5]);
+ }
+
+ private AffineTransform normalizeMatrix() {
+ double[] mx = new double[6];
+ AffineTransform result = AffineTransform.getTranslateInstance(0,0);
+ result.getMatrix(mx);
+ mx[3]=-1;
+ mx[5]=height;
+ result = new AffineTransform(mx);
+ result.concatenate(transform);
+ return result;
+ }
+
+ private boolean drawImage(Image img, Image mask, AffineTransform xform, Color bgColor, ImageObserver obs) {
+ if (xform==null) return true;
+
+ xform.translate(0, img.getHeight(obs));
+ xform.scale(img.getWidth(obs), img.getHeight(obs));
+
+ AffineTransform inverse = this.normalizeMatrix();
+ AffineTransform flipper = AffineTransform.getScaleInstance(1,-1);
+ inverse.concatenate(xform);
+ inverse.concatenate(flipper);
+
+ double[] mx = new double[6];
+ inverse.getMatrix(mx);
+ if (currentFillGState != 255) {
+ PdfGState gs = fillGState[255];
+ if (gs == null) {
+ gs = new PdfGState();
+ gs.setFillOpacity(1);
+ fillGState[255] = gs;
+ }
+ cb.setGState(gs);
+ }
+
+ try {
+ com.lowagie.text.Image image = null;
+ if(!convertImagesToJPEG){
+ image = com.lowagie.text.Image.getInstance(img, bgColor);
+ }
+ else{
+ BufferedImage scaled = new BufferedImage(img.getWidth(null), img.getHeight(null), BufferedImage.TYPE_INT_RGB);
+ Graphics2D g3 = scaled.createGraphics();
+ g3.drawImage(img, 0, 0, img.getWidth(null), img.getHeight(null), null);
+ g3.dispose();
+
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ com.sun.image.codec.jpeg.JPEGImageEncoder encoder = com.sun.image.codec.jpeg.JPEGCodec.createJPEGEncoder(baos);
+ com.sun.image.codec.jpeg.JPEGEncodeParam param = com.sun.image.codec.jpeg.JPEGCodec.getDefaultJPEGEncodeParam(scaled);
+ param.setQuality(jpegQuality, true);
+ encoder.encode(scaled, param);
+ scaled.flush();
+ scaled = null;
+ image = com.lowagie.text.Image.getInstance(baos.toByteArray());
+
+ }
+ if (mask!=null) {
+ com.lowagie.text.Image msk = com.lowagie.text.Image.getInstance(mask, null, true);
+ msk.makeMask();
+ msk.setInvertMask(true);
+ image.setImageMask(msk);
+ }
+ cb.addImage(image, (float)mx[0], (float)mx[1], (float)mx[2], (float)mx[3], (float)mx[4], (float)mx[5]);
+ } catch (Exception ex) {
+ throw new IllegalArgumentException();
+ }
+ if (currentFillGState != 255) {
+ PdfGState gs = fillGState[currentFillGState];
+ cb.setGState(gs);
+ }
+ return true;
+ }
+
+ private boolean checkNewPaint(Paint oldPaint) {
+ if (paint == oldPaint)
+ return false;
+ return !((paint instanceof Color) && paint.equals(oldPaint));
+ }
+
+ private void setFillPaint() {
+ if (checkNewPaint(paintFill)) {
+ paintFill = paint;
+ setPaint(false, 0, 0, true);
+ }
+ }
+
+ private void setStrokePaint() {
+ if (checkNewPaint(paintStroke)) {
+ paintStroke = paint;
+ setPaint(false, 0, 0, false);
+ }
+ }
+
+ private void setPaint(boolean invert, double xoffset, double yoffset, boolean fill) {
+ if (paint instanceof Color) {
+ Color color = (Color)paint;
+ int alpha = color.getAlpha();
+ if (fill) {
+ if (alpha != currentFillGState) {
+ currentFillGState = alpha;
+ PdfGState gs = fillGState[alpha];
+ if (gs == null) {
+ gs = new PdfGState();
+ gs.setFillOpacity((float)alpha / 255f);
+ fillGState[alpha] = gs;
+ }
+ cb.setGState(gs);
+ }
+ cb.setColorFill(color);
+ }
+ else {
+ if (alpha != currentStrokeGState) {
+ currentStrokeGState = alpha;
+ PdfGState gs = strokeGState[alpha];
+ if (gs == null) {
+ gs = new PdfGState();
+ gs.setStrokeOpacity((float)alpha / 255f);
+ strokeGState[alpha] = gs;
+ }
+ cb.setGState(gs);
+ }
+ cb.setColorStroke(color);
+ }
+ }
+ else if (paint instanceof GradientPaint) {
+ GradientPaint gp = (GradientPaint)paint;
+ Point2D p1 = gp.getPoint1();
+ transform.transform(p1, p1);
+ Point2D p2 = gp.getPoint2();
+ transform.transform(p2, p2);
+ Color c1 = gp.getColor1();
+ Color c2 = gp.getColor2();
+ PdfShading shading = PdfShading.simpleAxial(cb.getPdfWriter(), (float)p1.getX(), normalizeY((float)p1.getY()), (float)p2.getX(), normalizeY((float)p2.getY()), c1, c2);
+ PdfShadingPattern pat = new PdfShadingPattern(shading);
+ if (fill)
+ cb.setShadingFill(pat);
+ else
+ cb.setShadingStroke(pat);
+ }
+ else if (paint instanceof TexturePaint) {
+ try {
+ TexturePaint tp = (TexturePaint)paint;
+ BufferedImage img = tp.getImage();
+ Rectangle2D rect = tp.getAnchorRect();
+ com.lowagie.text.Image image = com.lowagie.text.Image.getInstance(img, null);
+ PdfPatternPainter pattern = cb.createPattern(image.width(), image.height());
+ AffineTransform inverse = this.normalizeMatrix();
+ inverse.translate(rect.getX(), rect.getY());
+ inverse.scale(rect.getWidth() / image.width(), -rect.getHeight() / image.height());
+ double[] mx = new double[6];
+ inverse.getMatrix(mx);
+ pattern.setPatternMatrix((float)mx[0], (float)mx[1], (float)mx[2], (float)mx[3], (float)mx[4], (float)mx[5]) ;
+ image.setAbsolutePosition(0,0);
+ pattern.addImage(image);
+ if (fill)
+ cb.setPatternFill(pattern);
+ else
+ cb.setPatternStroke(pattern);
+ } catch (Exception ex) {
+ if (fill)
+ cb.setColorFill(Color.gray);
+ else
+ cb.setColorStroke(Color.gray);
+ }
+ }
+ else {
+ try {
+ BufferedImage img = null;
+ int type = BufferedImage.TYPE_4BYTE_ABGR;
+ if (paint.getTransparency() == Transparency.OPAQUE) {
+ type = BufferedImage.TYPE_3BYTE_BGR;
+ }
+ img = new BufferedImage((int)width, (int)height, type);
+ Graphics2D g = (Graphics2D)img.getGraphics();
+ g.transform(transform);
+ AffineTransform inv = transform.createInverse();
+ Shape fillRect = new Rectangle2D.Double(0,0,img.getWidth(),img.getHeight());
+ fillRect = inv.createTransformedShape(fillRect);
+ g.setPaint(paint);
+ g.fill(fillRect);
+ if (invert) {
+ AffineTransform tx = new AffineTransform();
+ tx.scale(1,-1);
+ tx.translate(-xoffset,-yoffset);
+ g.drawImage(img,tx,null);
+ }
+ g.dispose();
+ g = null;
+ com.lowagie.text.Image image = com.lowagie.text.Image.getInstance(img, null);
+ PdfPatternPainter pattern = cb.createPattern(width, height);
+ image.setAbsolutePosition(0,0);
+ pattern.addImage(image);
+ if (fill)
+ cb.setPatternFill(pattern);
+ else
+ cb.setPatternStroke(pattern);
+ } catch (Exception ex) {
+ if (fill)
+ cb.setColorFill(Color.gray);
+ else
+ cb.setColorStroke(Color.gray);
+ }
+ }
+ }
+
+ private synchronized void waitForImage(java.awt.Image image) {
+ if (mediaTracker == null)
+ mediaTracker = new MediaTracker(new PdfGraphics2D.fakeComponent());
+ mediaTracker.addImage(image, 0);
+ try {
+ mediaTracker.waitForID(0);
+ }
+ catch (InterruptedException e) {
+ // empty on purpose
+ }
+ mediaTracker.removeImage(image);
+ }
+
+ static private class fakeComponent extends Component {
+ }
+}
diff --git a/src/main/java/com/lowagie/text/pdf/PdfICCBased.java b/src/main/java/com/lowagie/text/pdf/PdfICCBased.java
new file mode 100644
index 0000000..d5afe92
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/PdfICCBased.java
@@ -0,0 +1,86 @@
+/*
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+package com.lowagie.text.pdf;
+
+import java.awt.color.ICC_Profile;
+
+import com.lowagie.text.ExceptionConverter;
+
+/**
+ * A <CODE>PdfICCBased</CODE> defines a ColorSpace
+ *
+ * @see PdfStream
+ */
+
+class PdfICCBased extends PdfStream {
+
+ protected int NumberOfComponents;
+
+ PdfICCBased(ICC_Profile profile) {
+ super();
+ try {
+ NumberOfComponents = profile.getNumComponents();
+ switch (NumberOfComponents) {
+ case 1:
+ put(PdfName.ALTERNATE, PdfName.DEVICEGRAY);
+ break;
+ case 3:
+ put(PdfName.ALTERNATE, PdfName.DEVICERGB);
+ break;
+ case 4:
+ put(PdfName.ALTERNATE, PdfName.DEVICECMYK);
+ break;
+ default:
+ throw new PdfException(NumberOfComponents + " component(s) is not supported in PDF1.4");
+ }
+ put(PdfName.N, new PdfNumber(NumberOfComponents));
+ bytes = profile.getData();
+ flateCompress();
+ } catch (Exception e) {
+ throw new ExceptionConverter(e);
+ }
+ }
+}
diff --git a/src/main/java/com/lowagie/text/pdf/PdfImage.java b/src/main/java/com/lowagie/text/pdf/PdfImage.java
new file mode 100644
index 0000000..46d737f
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/PdfImage.java
@@ -0,0 +1,279 @@
+/*
+ * $Id: PdfImage.java,v 1.66 2005/11/01 12:27:05 psoares33 Exp $
+ * $Name: $
+ *
+ * Copyright 1999, 2000, 2001, 2002 Bruno Lowagie
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ *
+ * REMARK:
+ * LZW/GIF is covered by a software patent which is owned by Unisys Corporation.
+ * Unisys refuses to license this patent for PDF-related use in software
+ * even when this software is released for free and may be freely distributed.
+ * HOWEVER:
+ * This library doesn't compress or decompress data using the LZW
+ * algorithm, nor does it create or visualize GIF-images in any way;
+ * it only copies parts of an existing GIF file into a PDF file.
+ *
+ * More information about the GIF format can be found in the following documents:
+ * * GRAPHICS INTERCHANGE FORMAT(sm) Version 89a
+ * (c)1987,1988,1989,1990 Copyright CompuServe Incorporated. Columbus, Ohio
+ * * LZW and GIF explained
+ * Steve Blackstock
+ * * http://mistress.informatik.unibw-muenchen.de/
+ * very special thanks to klee@informatik.unibw-muenchen.de for the algorithm
+ * to extract the LZW data from a GIF.
+ */
+
+package com.lowagie.text.pdf;
+
+import com.lowagie.text.Image;
+
+import java.io.ByteArrayOutputStream;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.IOException;
+
+/**
+ * <CODE>PdfImage</CODE> is a <CODE>PdfStream</CODE> containing an image-<CODE>Dictionary</CODE> and -stream.
+ */
+
+class PdfImage extends PdfStream {
+
+ static final int TRANSFERSIZE = 4096;
+ // membervariables
+
+ /** This is the <CODE>PdfName</CODE> of the image. */
+ protected PdfName name = null;
+
+ // constructor
+
+ /**
+ * Constructs a <CODE>PdfImage</CODE>-object.
+ *
+ * @param image the <CODE>Image</CODE>-object
+ * @param name the <CODE>PdfName</CODE> for this image
+ * @throws BadPdfFormatException on error
+ */
+
+ public PdfImage(Image image, String name, PdfIndirectReference maskRef) throws BadPdfFormatException {
+ super();
+ this.name = new PdfName(name);
+ put(PdfName.TYPE, PdfName.XOBJECT);
+ put(PdfName.SUBTYPE, PdfName.IMAGE);
+ put(PdfName.WIDTH, new PdfNumber(image.width()));
+ put(PdfName.HEIGHT, new PdfNumber(image.height()));
+ if (image.getLayer() != null)
+ put(PdfName.OC, image.getLayer().getRef());
+ if (image.isMask() && (image.bpc() == 1 || image.bpc() > 0xff))
+ put(PdfName.IMAGEMASK, PdfBoolean.PDFTRUE);
+ if (maskRef != null) {
+ if (image.isSmask())
+ put(PdfName.SMASK, maskRef);
+ else
+ put(PdfName.MASK, maskRef);
+ }
+ if (image.isMask() && image.isInvertMask())
+ put(PdfName.DECODE, new PdfLiteral("[1 0]"));
+ if (image.isInterpolation())
+ put(PdfName.INTERPOLATE, PdfBoolean.PDFTRUE);
+ InputStream is = null;
+ try {
+
+ // Raw Image data
+ if (image.isImgRaw()) {
+ // will also have the CCITT parameters
+ int colorspace = image.colorspace();
+ int transparency[] = image.getTransparency();
+ if (transparency != null && !image.isMask() && maskRef == null) {
+ String s = "[";
+ for (int k = 0; k < transparency.length; ++k)
+ s += transparency[k] + " ";
+ s += "]";
+ put(PdfName.MASK, new PdfLiteral(s));
+ }
+ bytes = image.rawData();
+ put(PdfName.LENGTH, new PdfNumber(bytes.length));
+ int bpc = image.bpc();
+ if (bpc > 0xff) {
+ if (!image.isMask())
+ put(PdfName.COLORSPACE, PdfName.DEVICEGRAY);
+ put(PdfName.BITSPERCOMPONENT, new PdfNumber(1));
+ put(PdfName.FILTER, PdfName.CCITTFAXDECODE);
+ int k = bpc - Image.CCITTG3_1D;
+ PdfDictionary decodeparms = new PdfDictionary();
+ if (k != 0)
+ decodeparms.put(PdfName.K, new PdfNumber(k));
+ if ((colorspace & Image.CCITT_BLACKIS1) != 0)
+ decodeparms.put(PdfName.BLACKIS1, PdfBoolean.PDFTRUE);
+ if ((colorspace & Image.CCITT_ENCODEDBYTEALIGN) != 0)
+ decodeparms.put(PdfName.ENCODEDBYTEALIGN, PdfBoolean.PDFTRUE);
+ if ((colorspace & Image.CCITT_ENDOFLINE) != 0)
+ decodeparms.put(PdfName.ENDOFLINE, PdfBoolean.PDFTRUE);
+ if ((colorspace & Image.CCITT_ENDOFBLOCK) != 0)
+ decodeparms.put(PdfName.ENDOFBLOCK, PdfBoolean.PDFFALSE);
+ decodeparms.put(PdfName.COLUMNS, new PdfNumber(image.width()));
+ decodeparms.put(PdfName.ROWS, new PdfNumber(image.height()));
+ put(PdfName.DECODEPARMS, decodeparms);
+ }
+ else {
+ switch(colorspace) {
+ case 1:
+ put(PdfName.COLORSPACE, PdfName.DEVICEGRAY);
+ if (image.isInverted())
+ put(PdfName.DECODE, new PdfLiteral("[1 0]"));
+ break;
+ case 3:
+ put(PdfName.COLORSPACE, PdfName.DEVICERGB);
+ if (image.isInverted())
+ put(PdfName.DECODE, new PdfLiteral("[1 0 1 0 1 0]"));
+ break;
+ case 4:
+ default:
+ put(PdfName.COLORSPACE, PdfName.DEVICECMYK);
+ if (image.isInverted())
+ put(PdfName.DECODE, new PdfLiteral("[1 0 1 0 1 0 1 0]"));
+ }
+ PdfDictionary additional = image.getAdditional();
+ if (additional != null)
+ putAll(additional);
+ if (image.isMask() && (image.bpc() == 1 || image.bpc() > 8))
+ remove(PdfName.COLORSPACE);
+ put(PdfName.BITSPERCOMPONENT, new PdfNumber(image.bpc()));
+ if (image.isDeflated())
+ put(PdfName.FILTER, PdfName.FLATEDECODE);
+ else {
+ flateCompress();
+ }
+ }
+ return;
+ }
+
+ // GIF, JPEG or PNG
+ String errorID;
+ if (image.rawData() == null){
+ is = image.url().openStream();
+ errorID = image.url().toString();
+ }
+ else{
+ is = new java.io.ByteArrayInputStream(image.rawData());
+ errorID = "Byte array";
+ }
+ switch(image.type()) {
+ case Image.JPEG:
+ put(PdfName.FILTER, PdfName.DCTDECODE);
+ switch(image.colorspace()) {
+ case 1:
+ put(PdfName.COLORSPACE, PdfName.DEVICEGRAY);
+ break;
+ case 3:
+ put(PdfName.COLORSPACE, PdfName.DEVICERGB);
+ break;
+ default:
+ put(PdfName.COLORSPACE, PdfName.DEVICECMYK);
+ if (image.isInverted()) {
+ put(PdfName.DECODE, new PdfLiteral("[1 0 1 0 1 0 1 0]"));
+ }
+ }
+ put(PdfName.BITSPERCOMPONENT, new PdfNumber(8));
+ if (image.rawData() != null){
+ bytes = image.rawData();
+ put(PdfName.LENGTH, new PdfNumber(bytes.length));
+ return;
+ }
+ streamBytes = new ByteArrayOutputStream();
+ transferBytes(is, streamBytes, -1);
+ break;
+ default:
+ throw new BadPdfFormatException(errorID + " is an unknown Image format.");
+ }
+ put(PdfName.LENGTH, new PdfNumber(streamBytes.size()));
+ }
+ catch(IOException ioe) {
+ throw new BadPdfFormatException(ioe.getMessage());
+ }
+ finally {
+ if (is != null) {
+ try{
+ is.close();
+ }
+ catch (Exception ee) {
+ // empty on purpose
+ }
+ }
+ }
+ }
+
+ /**
+ * Returns the <CODE>PdfName</CODE> of the image.
+ *
+ * @return the name
+ */
+
+ public PdfName name() {
+ return name;
+ }
+
+ static void transferBytes(InputStream in, OutputStream out, int len) throws IOException {
+ byte buffer[] = new byte[TRANSFERSIZE];
+ if (len < 0)
+ len = 0x7ffffff;
+ int size;
+ while (len != 0) {
+ size = in.read(buffer, 0, Math.min(len, TRANSFERSIZE));
+ if (size < 0)
+ return;
+ out.write(buffer, 0, size);
+ len -= size;
+ }
+ }
+
+ protected void importAll(PdfImage dup) {
+ name = dup.name;
+ compressed = dup.compressed;
+ streamBytes = dup.streamBytes;
+ bytes = dup.bytes;
+ hashMap = dup.hashMap;
+ }
+}
diff --git a/src/main/java/com/lowagie/text/pdf/PdfImportedPage.java b/src/main/java/com/lowagie/text/pdf/PdfImportedPage.java
new file mode 100644
index 0000000..7e6566e
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/PdfImportedPage.java
@@ -0,0 +1,149 @@
+/*
+ * $Id: PdfImportedPage.java,v 1.48 2005/05/04 14:32:39 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2001, 2002 Paulo Soares
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf;
+import com.lowagie.text.DocumentException;
+import com.lowagie.text.Image;
+import java.io.IOException;
+
+/** Represents an imported page.
+ *
+ * @author Paulo Soares (psoares@consiste.pt)
+ */
+public class PdfImportedPage extends com.lowagie.text.pdf.PdfTemplate {
+
+ PdfReaderInstance readerInstance;
+ int pageNumber;
+
+ PdfImportedPage(PdfReaderInstance readerInstance, PdfWriter writer, int pageNumber) {
+ this.readerInstance = readerInstance;
+ this.pageNumber = pageNumber;
+ thisReference = writer.getPdfIndirectReference();
+ bBox = readerInstance.getReader().getPageSize(pageNumber);
+ type = TYPE_IMPORTED;
+ }
+
+ /** Reads the content from this <CODE>PdfImportedPage</CODE>-object from a reader.
+ *
+ * @return self
+ *
+ */
+ public PdfImportedPage getFromReader() {
+ return this;
+ }
+
+ public int getPageNumber() {
+ return pageNumber;
+ }
+
+
+ /** Always throws an error. This operation is not allowed.
+ * @param image dummy
+ * @param a dummy
+ * @param b dummy
+ * @param c dummy
+ * @param d dummy
+ * @param e dummy
+ * @param f dummy
+ * @throws DocumentException dummy */
+ public void addImage(Image image, float a, float b, float c, float d, float e, float f) throws DocumentException {
+ throwError();
+ }
+
+ /** Always throws an error. This operation is not allowed.
+ * @param template dummy
+ * @param a dummy
+ * @param b dummy
+ * @param c dummy
+ * @param d dummy
+ * @param e dummy
+ * @param f dummy */
+ public void addTemplate(PdfTemplate template, float a, float b, float c, float d, float e, float f) {
+ throwError();
+ }
+
+ /** Always throws an error. This operation is not allowed.
+ * @return dummy */
+ public PdfContentByte getDuplicate() {
+ throwError();
+ return null;
+ }
+
+ PdfStream getFormXObject() throws IOException {
+ return readerInstance.getFormXObject(pageNumber);
+ }
+
+ public void setColorFill(PdfSpotColor sp, float tint) {
+ throwError();
+ }
+
+ public void setColorStroke(PdfSpotColor sp, float tint) {
+ throwError();
+ }
+
+ PdfObject getResources() {
+ return readerInstance.getResources(pageNumber);
+ }
+
+ /** Always throws an error. This operation is not allowed.
+ * @param bf dummy
+ * @param size dummy */
+ public void setFontAndSize(BaseFont bf, float size) {
+ throwError();
+ }
+
+ void throwError() {
+ throw new RuntimeException("Content can not be added to a PdfImportedPage.");
+ }
+
+ PdfReaderInstance getPdfReaderInstance() {
+ return readerInstance;
+ }
+}
diff --git a/src/main/java/com/lowagie/text/pdf/PdfIndirectObject.java b/src/main/java/com/lowagie/text/pdf/PdfIndirectObject.java
new file mode 100644
index 0000000..81ef485
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/PdfIndirectObject.java
@@ -0,0 +1,170 @@
+/*
+ * $Id: PdfIndirectObject.java,v 1.60 2005/05/04 14:31:40 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 1999, 2000, 2001, 2002 Bruno Lowagie
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf;
+
+import java.io.IOException;
+import java.io.OutputStream;
+
+import com.lowagie.text.DocWriter;
+
+/**
+ * <CODE>PdfIndirectObject</CODE> is the Pdf indirect object.
+ * <P>
+ * An <I>indirect object</I> is an object that has been labeled so that it can be referenced by
+ * other objects. Any type of <CODE>PdfObject</CODE> may be labeled as an indirect object.<BR>
+ * An indirect object consists of an object identifier, a direct object, and the <B>endobj</B>
+ * keyword. The <I>object identifier</I> consists of an integer <I>object number</I>, an integer
+ * <I>generation number</I>, and the <B>obj</B> keyword.<BR>
+ * This object is described in the 'Portable Document Format Reference Manual version 1.3'
+ * section 4.10 (page 53).
+ *
+ * @see PdfObject
+ * @see PdfIndirectReference
+ */
+
+public class PdfIndirectObject {
+
+ // membervariables
+
+/** The object number */
+ protected int number;
+
+/** the generation number */
+ protected int generation = 0;
+
+ static final byte STARTOBJ[] = DocWriter.getISOBytes(" obj");
+ static final byte ENDOBJ[] = DocWriter.getISOBytes("\nendobj\n");
+ static final int SIZEOBJ = STARTOBJ.length + ENDOBJ.length;
+ PdfObject object;
+ PdfWriter writer;
+
+ // constructors
+
+/**
+ * Constructs a <CODE>PdfIndirectObject</CODE>.
+ *
+ * @param number the object number
+ * @param object the direct object
+ */
+
+ PdfIndirectObject(int number, PdfObject object, PdfWriter writer) {
+ this(number, 0, object, writer);
+ }
+
+ PdfIndirectObject(PdfIndirectReference ref, PdfObject object, PdfWriter writer) {
+ this(ref.getNumber(),ref.getGeneration(),object,writer);
+ }
+/**
+ * Constructs a <CODE>PdfIndirectObject</CODE>.
+ *
+ * @param number the object number
+ * @param generation the generation number
+ * @param object the direct object
+ */
+
+ PdfIndirectObject(int number, int generation, PdfObject object, PdfWriter writer) {
+ this.writer = writer;
+ this.number = number;
+ this.generation = generation;
+ this.object = object;
+ PdfEncryption crypto = null;
+ if (writer != null)
+ crypto = writer.getEncryption();
+ if (crypto != null) {
+ crypto.setHashKey(number, generation);
+ }
+ }
+
+ // methods
+
+/**
+ * Return the length of this <CODE>PdfIndirectObject</CODE>.
+ *
+ * @return the length of the PDF-representation of this indirect object.
+ */
+
+// public int length() {
+// if (isStream)
+// return bytes.size() + SIZEOBJ + stream.getStreamLength(writer);
+// else
+// return bytes.size();
+// }
+
+
+/**
+ * Returns a <CODE>PdfIndirectReference</CODE> to this <CODE>PdfIndirectObject</CODE>.
+ *
+ * @return a <CODE>PdfIndirectReference</CODE>
+ */
+
+ public PdfIndirectReference getIndirectReference() {
+ return new PdfIndirectReference(object.type(), number, generation);
+ }
+
+/**
+ * Writes eficiently to a stream
+ *
+ * @param os the stream to write to
+ * @throws IOException on write error
+ */
+ void writeTo(OutputStream os) throws IOException
+ {
+ os.write(DocWriter.getISOBytes(String.valueOf(number)));
+ os.write(' ');
+ os.write(DocWriter.getISOBytes(String.valueOf(generation)));
+ os.write(STARTOBJ);
+ int type = object.type();
+ if (type != PdfObject.ARRAY && type != PdfObject.DICTIONARY && type != PdfObject.NAME && type != PdfObject.STRING)
+ os.write(' ');
+ object.toPdf(writer, os);
+ os.write(ENDOBJ);
+ }
+}
diff --git a/src/main/java/com/lowagie/text/pdf/PdfIndirectReference.java b/src/main/java/com/lowagie/text/pdf/PdfIndirectReference.java
new file mode 100644
index 0000000..3b0e89c
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/PdfIndirectReference.java
@@ -0,0 +1,133 @@
+/*
+ * $Id: PdfIndirectReference.java,v 1.55 2005/11/29 21:05:02 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 1999, 2000, 2001, 2002 Bruno Lowagie
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf;
+
+/**
+ * <CODE>PdfIndirectReference</CODE> contains a reference to a <CODE>PdfIndirectObject</CODE>.
+ * <P>
+ * Any object used as an element of an array or as a value in a dictionary may be specified
+ * by either a direct object of an indirect reference. An <I>indirect reference</I> is a reference
+ * to an indirect object, and consists of the indirect object's object number, generation number
+ * and the <B>R</B> keyword.<BR>
+ * This object is described in the 'Portable Document Format Reference Manual version 1.3'
+ * section 4.11 (page 54).
+ *
+ * @see PdfObject
+ * @see PdfIndirectObject
+ */
+
+public class PdfIndirectReference extends PdfObject {
+
+ // membervariables
+
+/** the object number */
+ protected int number;
+
+/** the generation number */
+ protected int generation = 0;
+
+ // constructors
+
+ protected PdfIndirectReference() {
+ super(0);
+ }
+
+/**
+ * Constructs a <CODE>PdfIndirectReference</CODE>.
+ *
+ * @param type the type of the <CODE>PdfObject</CODE> that is referenced to
+ * @param number the object number.
+ * @param generation the generation number.
+ */
+
+ PdfIndirectReference(int type, int number, int generation) {
+ super(0, new StringBuffer().append(number).append(" ").append(generation).append(" R").toString());
+ this.number = number;
+ this.generation = generation;
+ }
+
+/**
+ * Constructs a <CODE>PdfIndirectReference</CODE>.
+ *
+ * @param type the type of the <CODE>PdfObject</CODE> that is referenced to
+ * @param number the object number.
+ */
+
+ PdfIndirectReference(int type, int number) {
+ this(type, number, 0);
+ }
+
+ // methods
+
+/**
+ * Returns the number of the object.
+ *
+ * @return a number.
+ */
+
+ public int getNumber() {
+ return number;
+ }
+
+/**
+ * Returns the generation of the object.
+ *
+ * @return a number.
+ */
+
+ public int getGeneration() {
+ return generation;
+ }
+
+ public String toString() {
+ return new StringBuffer().append(number).append(" ").append(generation).append(" R").toString();
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/pdf/PdfLayer.java b/src/main/java/com/lowagie/text/pdf/PdfLayer.java
new file mode 100644
index 0000000..bf53904
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/PdfLayer.java
@@ -0,0 +1,302 @@
+/*
+ * Copyright 2004 by Paulo Soares.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf;
+
+import java.util.ArrayList;
+/**
+ * An optional content group is a dictionary representing a collection of graphics
+ * that can be made visible or invisible dynamically by users of viewer applications.
+ * In iText they are referenced as layers.
+ *
+ * @author Paulo Soares (psoares@consiste.pt)
+ */
+public class PdfLayer extends PdfDictionary implements PdfOCG {
+ protected PdfIndirectReference ref;
+ protected ArrayList children;
+ protected PdfLayer parent;
+ protected String title;
+
+ /**
+ * Holds value of property on.
+ */
+ private boolean on = true;
+
+ /**
+ * Holds value of property onPanel.
+ */
+ private boolean onPanel = true;
+
+ PdfLayer(String title) {
+ this.title = title;
+ }
+
+ /**
+ * Creates a title layer. A title layer is not really a layer but a collection of layers
+ * under the same title heading.
+ * @param title the title text
+ * @param writer the <CODE>PdfWriter</CODE>
+ * @return the title layer
+ */
+ public static PdfLayer createTitle(String title, PdfWriter writer) {
+ if (title == null)
+ throw new NullPointerException("Title cannot be null.");
+ PdfLayer layer = new PdfLayer(title);
+ writer.registerLayer(layer);
+ return layer;
+ }
+ /**
+ * Creates a new layer.
+ * @param name the name of the layer
+ * @param writer the writer
+ */
+ public PdfLayer(String name, PdfWriter writer) {
+ super(PdfName.OCG);
+ setName(name);
+ ref = writer.getPdfIndirectReference();
+ writer.registerLayer(this);
+ }
+
+ String getTitle() {
+ return title;
+ }
+
+ /**
+ * Adds a child layer. Nested layers can only have one parent.
+ * @param child the child layer
+ */
+ public void addChild(PdfLayer child) {
+ if (child.parent != null)
+ throw new IllegalArgumentException("The layer '" + ((PdfString)child.get(PdfName.NAME)).toUnicodeString() + "' already has a parent.");
+ child.parent = this;
+ if (children == null)
+ children = new ArrayList();
+ children.add(child);
+ }
+
+
+ /**
+ * Gets the parent layer.
+ * @return the parent layer or <CODE>null</CODE> if the layer has no parent
+ */
+ public PdfLayer getParent() {
+ return parent;
+ }
+
+ /**
+ * Gets the children layers.
+ * @return the children layers or <CODE>null</CODE> if the layer has no children
+ */
+ public ArrayList getChildren() {
+ return children;
+ }
+
+ /**
+ * Gets the <CODE>PdfIndirectReference</CODE> that represents this layer.
+ * @return the <CODE>PdfIndirectReference</CODE> that represents this layer
+ */
+ public PdfIndirectReference getRef() {
+ return ref;
+ }
+
+ /**
+ * Sets the name of this layer.
+ * @param name the name of this layer
+ */
+ public void setName(String name) {
+ put(PdfName.NAME, new PdfString(name, PdfObject.TEXT_UNICODE));
+ }
+
+ /**
+ * Gets the dictionary representing the layer. It just returns <CODE>this</CODE>.
+ * @return the dictionary representing the layer
+ */
+ public PdfObject getPdfObject() {
+ return this;
+ }
+
+ /**
+ * Gets the initial visibility of the layer.
+ * @return the initial visibility of the layer
+ */
+ public boolean isOn() {
+ return this.on;
+ }
+
+ /**
+ * Sets the initial visibility of the layer.
+ * @param on the initial visibility of the layer
+ */
+ public void setOn(boolean on) {
+ this.on = on;
+ }
+
+ private PdfDictionary getUsage() {
+ PdfDictionary usage = (PdfDictionary)get(PdfName.USAGE);
+ if (usage == null) {
+ usage = new PdfDictionary();
+ put(PdfName.USAGE, usage);
+ }
+ return usage;
+ }
+
+ /**
+ * Used by the creating application to store application-specific
+ * data associated with this optional content group.
+ * @param creator a text string specifying the application that created the group
+ * @param subtype a string defining the type of content controlled by the group. Suggested
+ * values include but are not limited to <B>Artwork</B>, for graphic-design or publishing
+ * applications, and <B>Technical</B>, for technical designs such as building plans or
+ * schematics
+ */
+ public void setCreatorInfo(String creator, String subtype) {
+ PdfDictionary usage = getUsage();
+ PdfDictionary dic = new PdfDictionary();
+ dic.put(PdfName.CREATOR, new PdfString(creator, PdfObject.TEXT_UNICODE));
+ dic.put(PdfName.SUBTYPE, new PdfName(subtype));
+ usage.put(PdfName.CREATORINFO, dic);
+ }
+
+ /**
+ * Specifies the language of the content controlled by this
+ * optional content group
+ * @param lang a language string which specifies a language and possibly a locale
+ * (for example, <B>es-MX</B> represents Mexican Spanish)
+ * @param preferred used by viewer applications when there is a partial match but no exact
+ * match between the system language and the language strings in all usage dictionaries
+ */
+ public void setLanguage(String lang, boolean preferred) {
+ PdfDictionary usage = getUsage();
+ PdfDictionary dic = new PdfDictionary();
+ dic.put(PdfName.LANG, new PdfString(lang, PdfObject.TEXT_UNICODE));
+ if (preferred)
+ dic.put(PdfName.PREFERRED, PdfName.ON);
+ usage.put(PdfName.LANGUAGE, dic);
+ }
+
+ /**
+ * Specifies the recommended state for content in this
+ * group when the document (or part of it) is saved by a viewer application to a format
+ * that does not support optional content (for example, an earlier version of
+ * PDF or a raster image format).
+ * @param export the export state
+ */
+ public void setExport(boolean export) {
+ PdfDictionary usage = getUsage();
+ PdfDictionary dic = new PdfDictionary();
+ dic.put(PdfName.EXPORTSTATE, export ? PdfName.ON : PdfName.OFF);
+ usage.put(PdfName.EXPORT, dic);
+ }
+
+ /**
+ * Specifies a range of magnifications at which the content
+ * in this optional content group is best viewed.
+ * @param min the minimum recommended magnification factors at which the group
+ * should be ON. A negative value will set the default to 0
+ * @param max the maximum recommended magnification factor at which the group
+ * should be ON. A negative value will set the largest possible magnification supported by the
+ * viewer application
+ */
+ public void setZoom(float min, float max) {
+ if (min <= 0 && max < 0)
+ return;
+ PdfDictionary usage = getUsage();
+ PdfDictionary dic = new PdfDictionary();
+ if (min > 0)
+ dic.put(PdfName.MIN, new PdfNumber(min));
+ if (max >= 0)
+ dic.put(PdfName.MAX, new PdfNumber(max));
+ usage.put(PdfName.ZOOM, dic);
+ }
+
+ /**
+ * Specifies that the content in this group is intended for
+ * use in printing
+ * @param subtype a name specifying the kind of content controlled by the group;
+ * for example, <B>Trapping</B>, <B>PrintersMarks</B> and <B>Watermark</B>
+ * @param printstate indicates that the group should be
+ * set to that state when the document is printed from a viewer application
+ */
+ public void setPrint(String subtype, boolean printstate) {
+ PdfDictionary usage = getUsage();
+ PdfDictionary dic = new PdfDictionary();
+ dic.put(PdfName.SUBTYPE, new PdfName(subtype));
+ dic.put(PdfName.PRINTSTATE, printstate ? PdfName.ON : PdfName.OFF);
+ usage.put(PdfName.PRINT, dic);
+ }
+
+ /**
+ * Indicates that the group should be set to that state when the
+ * document is opened in a viewer application.
+ * @param view the view state
+ */
+ public void setView(boolean view) {
+ PdfDictionary usage = getUsage();
+ PdfDictionary dic = new PdfDictionary();
+ dic.put(PdfName.VIEWSTATE, view ? PdfName.ON : PdfName.OFF);
+ usage.put(PdfName.VIEW, dic);
+ }
+
+ /**
+ * Gets the layer visibility in Acrobat's layer panel
+ * @return the layer visibility in Acrobat's layer panel
+ */
+ public boolean isOnPanel() {
+ return this.onPanel;
+ }
+
+ /**
+ * Sets the visibility of the layer in Acrobat's layer panel. If <CODE>false</CODE>
+ * the layer cannot be directly manipulated by the user. Note that any children layers will
+ * also be absent from the panel.
+ * @param onPanel the visibility of the layer in Acrobat's layer panel
+ */
+ public void setOnPanel(boolean onPanel) {
+ this.onPanel = onPanel;
+ }
+
+}
diff --git a/src/main/java/com/lowagie/text/pdf/PdfLayerMembership.java b/src/main/java/com/lowagie/text/pdf/PdfLayerMembership.java
new file mode 100644
index 0000000..3a5be50
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/PdfLayerMembership.java
@@ -0,0 +1,139 @@
+/*
+ * Copyright 2004 by Paulo Soares.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf;
+
+import java.util.HashSet;
+import java.util.Collection;
+
+/**
+ * Content typically belongs to a single optional content group,
+ * and is visible when the group is <B>ON</B> and invisible when it is <B>OFF</B>. To express more
+ * complex visibility policies, content should not declare itself to belong to an optional
+ * content group directly, but rather to an optional content membership dictionary
+ * represented by this class.
+ *
+ * @author Paulo Soares (psoares@consiste.pt)
+ */
+public class PdfLayerMembership extends PdfDictionary implements PdfOCG {
+
+ /**
+ * Visible only if all of the entries are <B>ON</B>.
+ */
+ public static PdfName ALLON = new PdfName("AllOn");
+ /**
+ * Visible if any of the entries are <B>ON</B>.
+ */
+ public static PdfName ANYON = new PdfName("AnyOn");
+ /**
+ * Visible if any of the entries are <B>OFF</B>.
+ */
+ public static PdfName ANYOFF = new PdfName("AnyOff");
+ /**
+ * Visible only if all of the entries are <B>OFF</B>.
+ */
+ public static PdfName ALLOFF = new PdfName("AllOff");
+
+ PdfIndirectReference ref;
+ PdfArray members = new PdfArray();
+ HashSet layers = new HashSet();
+
+ /**
+ * Creates a new, empty, membership layer.
+ * @param writer the writer
+ */
+ public PdfLayerMembership(PdfWriter writer) {
+ super(PdfName.OCMD);
+ put(PdfName.OCGS, members);
+ ref = writer.getPdfIndirectReference();
+ }
+
+ /**
+ * Gets the <CODE>PdfIndirectReference</CODE> that represents this membership layer.
+ * @return the <CODE>PdfIndirectReference</CODE> that represents this layer
+ */
+ public PdfIndirectReference getRef() {
+ return ref;
+ }
+
+ /**
+ * Adds a new member to the layer.
+ * @param layer the new member to the layer
+ */
+ public void addMember(PdfLayer layer) {
+ if (!layers.contains(layer)) {
+ members.add(layer.getRef());
+ layers.add(layer);
+ }
+ }
+
+ /**
+ * Gets the member layers.
+ * @return the member layers
+ */
+ public Collection getLayers() {
+ return layers;
+ }
+
+ /**
+ * Sets the visibility policy for content belonging to this
+ * membership dictionary. Possible values are ALLON, ANYON, ANYOFF and ALLOFF.
+ * The default value is ANYON.
+ * @param type the visibility policy
+ */
+ public void setVisibilityPolicy(PdfName type) {
+ put(PdfName.P, type);
+ }
+
+ /**
+ * Gets the dictionary representing the membership layer. It just returns <CODE>this</CODE>.
+ * @return the dictionary representing the layer
+ */
+ public PdfObject getPdfObject() {
+ return this;
+ }
+}
diff --git a/src/main/java/com/lowagie/text/pdf/PdfLine.java b/src/main/java/com/lowagie/text/pdf/PdfLine.java
new file mode 100644
index 0000000..8ccd84a
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/PdfLine.java
@@ -0,0 +1,477 @@
+/*
+ * $Id: PdfLine.java,v 1.66 2006/01/18 20:35:48 psoares33 Exp $
+ * $Name: $
+ *
+ * Copyright 1999, 2000, 2001, 2002 Bruno Lowagie
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+
+import com.lowagie.text.Element;
+import com.lowagie.text.ListItem;
+import com.lowagie.text.Chunk;
+
+/**
+ * <CODE>PdfLine</CODE> defines an array with <CODE>PdfChunk</CODE>-objects
+ * that fit into 1 line.
+ */
+
+public class PdfLine {
+
+ // membervariables
+
+ /** The arraylist containing the chunks. */
+ protected ArrayList line;
+
+ /** The left indentation of the line. */
+ protected float left;
+
+ /** The width of the line. */
+ protected float width;
+
+ /** The alignment of the line. */
+ protected int alignment;
+
+ /** The heigth of the line. */
+ protected float height;
+
+ /** The listsymbol (if necessary). */
+ protected Chunk listSymbol = null;
+
+ /** The listsymbol (if necessary). */
+ protected float symbolIndent;
+
+ /** <CODE>true</CODE> if the chunk splitting was caused by a newline. */
+ protected boolean newlineSplit = false;
+
+ /** The original width. */
+ protected float originalWidth;
+
+ protected boolean isRTL = false;
+
+ // constructors
+
+ /**
+ * Constructs a new <CODE>PdfLine</CODE>-object.
+ *
+ * @param left the limit of the line at the left
+ * @param right the limit of the line at the right
+ * @param alignment the alignment of the line
+ * @param height the height of the line
+ */
+
+ PdfLine(float left, float right, int alignment, float height) {
+ this.left = left;
+ this.width = right - left;
+ this.originalWidth = this.width;
+ this.alignment = alignment;
+ this.height = height;
+ this.line = new ArrayList();
+ }
+
+ PdfLine(float left, float remainingWidth, int alignment, boolean newlineSplit, ArrayList line, boolean isRTL) {
+ this.left = left;
+ this.width = remainingWidth;
+ this.alignment = alignment;
+ this.line = line;
+ this.newlineSplit = newlineSplit;
+ this.isRTL = isRTL;
+ }
+
+ // methods
+
+ /**
+ * Adds a <CODE>PdfChunk</CODE> to the <CODE>PdfLine</CODE>.
+ *
+ * @param chunk the <CODE>PdfChunk</CODE> to add
+ * @return <CODE>null</CODE> if the chunk could be added completely; if not
+ * a <CODE>PdfChunk</CODE> containing the part of the chunk that could
+ * not be added is returned
+ */
+
+ PdfChunk add(PdfChunk chunk) {
+ // nothing happens if the chunk is null.
+ if (chunk == null || chunk.toString().equals("")) {
+ return null;
+ }
+
+ // we split the chunk to be added
+ PdfChunk overflow = chunk.split(width);
+ newlineSplit = (chunk.isNewlineSplit() || overflow == null);
+ // if (chunk.isNewlineSplit() && alignment == Element.ALIGN_JUSTIFIED)
+ // alignment = Element.ALIGN_LEFT;
+
+
+ // if the length of the chunk > 0 we add it to the line
+ if (chunk.length() > 0) {
+ if (overflow != null)
+ chunk.trimLastSpace();
+ width -= chunk.width();
+ line.add(chunk);
+ }
+
+ // if the length == 0 and there were no other chunks added to the line yet,
+ // we risk to end up in an endless loop trying endlessly to add the same chunk
+ else if (line.size() < 1) {
+ chunk = overflow;
+ overflow = chunk.truncate(width);
+ width -= chunk.width();
+ if (chunk.length() > 0) {
+ line.add(chunk);
+ return overflow;
+ }
+ // if the chunck couldn't even be truncated, we add everything, so be it
+ else {
+ if (overflow != null)
+ line.add(overflow);
+ return null;
+ }
+ }
+ else {
+ width += ((PdfChunk)(line.get(line.size() - 1))).trimLastSpace();
+ }
+ return overflow;
+ }
+
+ // methods to retrieve information
+
+ /**
+ * Returns the number of chunks in the line.
+ *
+ * @return a value
+ */
+
+ public int size() {
+ return line.size();
+ }
+
+ /**
+ * Returns an iterator of <CODE>PdfChunk</CODE>s.
+ *
+ * @return an <CODE>Iterator</CODE>
+ */
+
+ public Iterator iterator() {
+ return line.iterator();
+ }
+
+ /**
+ * Returns the height of the line.
+ *
+ * @return a value
+ */
+
+ float height() {
+ return height;
+ }
+
+ /**
+ * Returns the left indentation of the line taking the alignment of the line into account.
+ *
+ * @return a value
+ */
+
+ float indentLeft() {
+ if (isRTL) {
+ switch (alignment) {
+ case Element.ALIGN_LEFT:
+ return left + width;
+ case Element.ALIGN_CENTER:
+ return left + (width / 2f);
+ default:
+ return left;
+ }
+ }
+ else {
+ switch (alignment) {
+ case Element.ALIGN_RIGHT:
+ return left + width;
+ case Element.ALIGN_CENTER:
+ return left + (width / 2f);
+ default:
+ return left;
+ }
+ }
+ }
+
+ /**
+ * Checks if this line has to be justified.
+ *
+ * @return <CODE>true</CODE> if the alignment equals <VAR>ALIGN_JUSTIFIED</VAR> and there is some width left.
+ */
+
+ public boolean hasToBeJustified() {
+ return ((alignment == Element.ALIGN_JUSTIFIED || alignment == Element.ALIGN_JUSTIFIED_ALL) && width != 0);
+ }
+
+ /**
+ * Resets the alignment of this line.
+ * <P>
+ * The alignment of the last line of for instance a <CODE>Paragraph</CODE>
+ * that has to be justified, has to be reset to <VAR>ALIGN_LEFT</VAR>.
+ */
+
+ public void resetAlignment() {
+ if (alignment == Element.ALIGN_JUSTIFIED) {
+ alignment = Element.ALIGN_LEFT;
+ }
+ }
+
+ /**
+ * Returns the width that is left, after a maximum of characters is added to the line.
+ *
+ * @return a value
+ */
+
+ float widthLeft() {
+ return width;
+ }
+
+ /**
+ * Returns the number of space-characters in this line.
+ *
+ * @return a value
+ */
+
+ int numberOfSpaces() {
+ String string = toString();
+ int length = string.length();
+ int numberOfSpaces = 0;
+ for (int i = 0; i < length; i++) {
+ if (string.charAt(i) == ' ') {
+ numberOfSpaces++;
+ }
+ }
+ return numberOfSpaces;
+ }
+
+ /**
+ * Sets the listsymbol of this line.
+ * <P>
+ * This is only necessary for the first line of a <CODE>ListItem</CODE>.
+ *
+ * @param listItem the list symbol
+ */
+
+ public void setListItem(ListItem listItem) {
+ this.listSymbol = listItem.listSymbol();
+ this.symbolIndent = listItem.indentationLeft();
+ }
+
+ /**
+ * Returns the listsymbol of this line.
+ *
+ * @return a <CODE>PdfChunk</CODE> if the line has a listsymbol; <CODE>null</CODE> otherwise
+ */
+
+ public Chunk listSymbol() {
+ return listSymbol;
+ }
+
+ /**
+ * Return the indentation needed to show the listsymbol.
+ *
+ * @return a value
+ */
+
+ public float listIndent() {
+ return symbolIndent;
+ }
+
+ /**
+ * Get the string representation of what is in this line.
+ *
+ * @return a <CODE>String</CODE>
+ */
+
+ public String toString() {
+ StringBuffer tmp = new StringBuffer();
+ for (Iterator i = line.iterator(); i.hasNext(); ) {
+ tmp.append(((PdfChunk) i.next()).toString());
+ }
+ return tmp.toString();
+ }
+
+ /**
+ * Checks if a newline caused the line split.
+ * @return <CODE>true</CODE> if a newline caused the line split
+ */
+ public boolean isNewlineSplit() {
+ return newlineSplit && (alignment != Element.ALIGN_JUSTIFIED_ALL);
+ }
+
+ /**
+ * Gets the index of the last <CODE>PdfChunk</CODE> with metric attributes
+ * @return the last <CODE>PdfChunk</CODE> with metric attributes
+ */
+ public int getLastStrokeChunk() {
+ int lastIdx = line.size() - 1;
+ for (; lastIdx >= 0; --lastIdx) {
+ PdfChunk chunk = (PdfChunk)line.get(lastIdx);
+ if (chunk.isStroked())
+ break;
+ }
+ return lastIdx;
+ }
+
+ /**
+ * Gets a <CODE>PdfChunk</CODE> by index.
+ * @param idx the index
+ * @return the <CODE>PdfChunk</CODE> or null if beyond the array
+ */
+ public PdfChunk getChunk(int idx) {
+ if (idx < 0 || idx >= line.size())
+ return null;
+ return (PdfChunk)line.get(idx);
+ }
+
+ /**
+ * Gets the original width of the line.
+ * @return the original width of the line
+ */
+ public float getOriginalWidth() {
+ return originalWidth;
+ }
+
+ /**
+ * Gets the maximum size of all the fonts used in this line
+ * including images (if there are images in the line and if
+ * the leading has to be changed).
+ * @return maximum size of all the fonts used in this line
+ */
+ float getMaxSize() {
+ float maxSize = 0;
+ for (int k = 0; k < line.size(); ++k) {
+ PdfChunk chunk = (PdfChunk)line.get(k);
+ if (!chunk.isImage() || !chunk.changeLeading()) {
+ maxSize = Math.max(chunk.font().size(), maxSize);
+ }
+ else {
+ maxSize = Math.max(chunk.getImage().scaledHeight() + chunk.getImageOffsetY() , maxSize);
+ }
+ }
+ return maxSize;
+ }
+
+ /**
+ * Gets the maximum size of all the fonts used in this line
+ * including images.
+ * @return maximum size of all the fonts used in this line
+ */
+ float getMaxSizeSimple() {
+ float maxSize = 0;
+ for (int k = 0; k < line.size(); ++k) {
+ PdfChunk chunk = (PdfChunk)line.get(k);
+ if (!chunk.isImage()) {
+ maxSize = Math.max(chunk.font().size(), maxSize);
+ }
+ else {
+ maxSize = Math.max(chunk.getImage().scaledHeight() + chunk.getImageOffsetY() , maxSize);
+ }
+ }
+ return maxSize;
+ }
+
+ boolean isRTL() {
+ return isRTL;
+ }
+
+ /**
+ * Gets a width corrected with a charSpacing and wordSpacing.
+ * @param charSpacing
+ * @param wordSpacing
+ * @return a corrected width
+ */
+ public float getWidthCorrected(float charSpacing, float wordSpacing) {
+ float total = 0;
+ for (int k = 0; k < line.size(); ++k) {
+ PdfChunk ck = (PdfChunk)line.get(k);
+ total += ck.getWidthCorrected(charSpacing, wordSpacing);
+ }
+ return total;
+ }
+
+/**
+ * Gets the maximum size of the ascender for all the fonts used
+ * in this line.
+ * @return maximum size of all the ascenders used in this line
+ */
+ public float getAscender() {
+ float ascender = 0;
+ for (int k = 0; k < line.size(); ++k) {
+ PdfChunk ck = (PdfChunk)line.get(k);
+ if (ck.isImage())
+ ascender = Math.max(ascender, ck.getImage().scaledHeight() + ck.getImageOffsetY());
+ else {
+ PdfFont font = ck.font();
+ ascender = Math.max(ascender, font.getFont().getFontDescriptor(BaseFont.ASCENT, font.size()));
+ }
+ }
+ return ascender;
+ }
+
+/**
+ * Gets the biggest descender for all the fonts used
+ * in this line. Note that this is a negative number.
+ * @return maximum size of all the ascenders used in this line
+ */
+ public float getDescender() {
+ float descender = 0;
+ for (int k = 0; k < line.size(); ++k) {
+ PdfChunk ck = (PdfChunk)line.get(k);
+ if (ck.isImage())
+ descender = Math.min(descender, ck.getImageOffsetY());
+ else {
+ PdfFont font = ck.font();
+ descender = Math.min(descender, font.getFont().getFontDescriptor(BaseFont.DESCENT, font.size()));
+ }
+ }
+ return descender;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/pdf/PdfLister.java b/src/main/java/com/lowagie/text/pdf/PdfLister.java
new file mode 100644
index 0000000..c3ecf63
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/PdfLister.java
@@ -0,0 +1,187 @@
+/*
+ * $Id: PdfLister.java,v 1.34 2005/11/01 12:27:05 psoares33 Exp $
+ * $Name: $
+ *
+ * Copyright 1999, 2000, 2001, 2002 Bruno Lowagie
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * This class by Mark Thompson. Copyright (C) 2002 Mark Thompson
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+ package com.lowagie.text.pdf;
+
+import java.io.*;
+import java.util.Iterator;
+/**
+ * List a PDF file in human-readable form (for debugging reasons mostly)
+ * @author Mark Thompson
+ */
+
+public class PdfLister {
+
+ /** the printStream you want to write the output to. */
+ PrintStream out;
+
+ /**
+ * Create a new lister object.
+ * @param out
+ */
+ public PdfLister(PrintStream out) {
+ this.out = out;
+ }
+
+ /**
+ * Visualizes a PDF object.
+ * @param object a com.lowagie.text.pdf object
+ */
+ public void listAnyObject(PdfObject object)
+ {
+ switch (object.type()) {
+ case PdfObject.ARRAY:
+ listArray((PdfArray)object);
+ break;
+ case PdfObject.DICTIONARY:
+ listDict((PdfDictionary) object);
+ break;
+ case PdfObject.STRING:
+ out.println("(" + object.toString() + ")");
+ break;
+ default:
+ out.println(object.toString());
+ break;
+ }
+ }
+ /**
+ * Visualizes a PdfDictionary object.
+ * @param dictionary a com.lowagie.text.pdf.PdfDictionary object
+ */
+ public void listDict(PdfDictionary dictionary)
+ {
+ out.println("<<");
+ PdfName key;
+ PdfObject value;
+ for (Iterator i = dictionary.getKeys().iterator(); i.hasNext(); ) {
+ key = (PdfName) i.next();
+ value = dictionary.get(key);
+ out.print(key.toString());
+ out.print(' ');
+ listAnyObject(value);
+ }
+ out.println(">>");
+ }
+
+ /**
+ * Visualizes a PdfArray object.
+ * @param array a com.lowagie.text.pdf.PdfArray object
+ */
+ public void listArray(PdfArray array)
+ {
+ out.println('[');
+ for (Iterator i = array.getArrayList().iterator(); i.hasNext(); ) {
+ PdfObject item = (PdfObject)i.next();
+ listAnyObject(item);
+ }
+ out.println(']');
+ }
+ /**
+ * Visualizes a Stream.
+ * @param stream
+ * @param reader
+ */
+ public void listStream(PRStream stream, PdfReaderInstance reader)
+ {
+ try {
+ listDict(stream);
+ out.println("startstream");
+ byte[] b = PdfReader.getStreamBytes(stream);
+// byte buf[] = new byte[Math.min(stream.getLength(), 4096)];
+// int r = 0;
+// stream.openStream(reader);
+// for (;;) {
+// r = stream.readStream(buf, 0, buf.length);
+// if (r == 0) break;
+// out.write(buf, 0, r);
+// }
+// stream.closeStream();
+ int len = b.length - 1;
+ for (int k = 0; k < len; ++k) {
+ if (b[k] == '\r' && b[k + 1] != '\n')
+ b[k] = (byte)'\n';
+ }
+ out.println(new String(b));
+ out.println("endstream");
+ } catch (IOException e) {
+ System.err.println("I/O exception: " + e);
+// } catch (java.util.zip.DataFormatException e) {
+// System.err.println("Data Format Exception: " + e);
+ }
+ }
+ /**
+ * Visualizes an imported page
+ * @param iPage
+ */
+ public void listPage(PdfImportedPage iPage)
+ {
+ int pageNum = iPage.getPageNumber();
+ PdfReaderInstance readerInst = iPage.getPdfReaderInstance();
+ PdfReader reader = readerInst.getReader();
+
+ PdfDictionary page = reader.getPageN(pageNum);
+ listDict(page);
+ PdfObject obj = PdfReader.getPdfObject(page.get(PdfName.CONTENTS));
+ switch (obj.type) {
+ case PdfObject.STREAM:
+ listStream((PRStream)obj, readerInst);
+ break;
+ case PdfObject.ARRAY:
+ for (Iterator i = ((PdfArray)obj).getArrayList().iterator(); i.hasNext();) {
+ PdfObject o = PdfReader.getPdfObject((PdfObject)i.next());
+ listStream((PRStream)o, readerInst);
+ out.println("-----------");
+ }
+ break;
+ }
+ }
+}
diff --git a/src/main/java/com/lowagie/text/pdf/PdfLiteral.java b/src/main/java/com/lowagie/text/pdf/PdfLiteral.java
new file mode 100644
index 0000000..bf71bc6
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/PdfLiteral.java
@@ -0,0 +1,111 @@
+/*
+ * $Id: PdfLiteral.java,v 1.53 2005/05/04 14:31:48 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2001, 2002 Paulo Soares
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf;
+
+/**
+ * a Literal
+ */
+
+public class PdfLiteral extends PdfObject {
+
+ /**
+ * Holds value of property position.
+ */
+ private int position;
+
+ public PdfLiteral(String text) {
+ super(0, text);
+ }
+
+ public PdfLiteral(byte b[]) {
+ super(0, b);
+ }
+
+ public PdfLiteral(int size) {
+ super(0, (byte[])null);
+ bytes = new byte[size];
+ java.util.Arrays.fill(bytes, (byte)32);
+ }
+
+ public PdfLiteral(int type, String text) {
+ super(type, text);
+ }
+
+ public PdfLiteral(int type, byte b[]) {
+ super(type, b);
+ }
+
+ public void toPdf(PdfWriter writer, java.io.OutputStream os) throws java.io.IOException {
+ if (os instanceof OutputStreamCounter)
+ position = ((OutputStreamCounter)os).getCounter();
+ super.toPdf(writer, os);
+ }
+
+ /**
+ * Getter for property position.
+ * @return Value of property position.
+ */
+ public int getPosition() {
+ return this.position;
+ }
+
+ /**
+ * Getter for property posLength.
+ * @return Value of property posLength.
+ */
+ public int getPosLength() {
+ if (bytes != null)
+ return bytes.length;
+ else
+ return 0;
+ }
+
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/pdf/PdfMediaClipData.java b/src/main/java/com/lowagie/text/pdf/PdfMediaClipData.java
new file mode 100644
index 0000000..de17355
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/PdfMediaClipData.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright 2003 Galo Gimenez
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+package com.lowagie.text.pdf;
+
+import java.io.IOException;
+
+public class PdfMediaClipData extends PdfDictionary {
+
+ PdfMediaClipData(String file, PdfFileSpecification fs, String mimeType) throws IOException {
+ put(PdfName.TYPE,new PdfName("MediaClip"));
+ put(PdfName.S, new PdfName("MCD"));
+ put(PdfName.N, new PdfString("Media clip for "+file));
+ put(new PdfName("CT"), new PdfString(mimeType));
+ PdfDictionary dic = new PdfDictionary();
+ dic.put(new PdfName("TF"), new PdfString("TEMPACCESS"));
+ put(new PdfName("P"), dic);
+ put(PdfName.D, fs.getReference());
+ }
+}
diff --git a/src/main/java/com/lowagie/text/pdf/PdfName.java b/src/main/java/com/lowagie/text/pdf/PdfName.java
new file mode 100644
index 0000000..ccfbd01
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/PdfName.java
@@ -0,0 +1,1141 @@
+/*
+ * $Id: PdfName.java,v 1.83 2006/06/04 22:23:38 psoares33 Exp $
+ * $Name: $
+ *
+ * Copyright 1999-2006 Bruno Lowagie
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf;
+
+/**
+ * <CODE>PdfName</CODE> is an object that can be used as a name in a PDF-file.
+ * <P>
+ * A name, like a string, is a sequence of characters. It must begin with a slash
+ * followed by a sequence of ASCII characters in the range 32 through 136 except
+ * %, (, ), [, ], &lt;, &gt;, {, }, / and #. Any character except 0x00 may be included
+ * in a name by writing its twocharacter hex code, preceded by #. The maximum number
+ * of characters in a name is 127.<BR>
+ * This object is described in the 'Portable Document Format Reference Manual version 1.3'
+ * section 4.5 (page 39-40).
+ * <P>
+ *
+ * @see PdfObject
+ * @see PdfDictionary
+ * @see BadPdfFormatException
+ */
+
+public class PdfName extends PdfObject implements Comparable{
+
+ // static membervariables (a variety of standard names used in PDF)
+
+ /** A name */
+ public static final PdfName A = new PdfName("A");
+ /** A name */
+ public static final PdfName AA = new PdfName("AA");
+ /** A name */
+ public static final PdfName ABSOLUTECALORIMETRIC = new PdfName("AbsoluteColorimetric");
+ /** A name */
+ public static final PdfName AC = new PdfName("AC");
+ /** A name */
+ public static final PdfName ACROFORM = new PdfName("AcroForm");
+ /** A name */
+ public static final PdfName ACTION = new PdfName("Action");
+ /** A name */
+ public static final PdfName ADBE_PKCS7_DETACHED = new PdfName("adbe.pkcs7.detached");
+ /** A name */
+ public static final PdfName ADBE_PKCS7_SHA1 = new PdfName("adbe.pkcs7.sha1");
+ /** A name */
+ public static final PdfName ADBE_X509_RSA_SHA1 = new PdfName("adbe.x509.rsa_sha1");
+ /** A name */
+ public static final PdfName ADOBE_PPKLITE = new PdfName("Adobe.PPKLite");
+ /** A name */
+ public static final PdfName ADOBE_PPKMS = new PdfName("Adobe.PPKMS");
+ /** A name */
+ public static final PdfName AIS = new PdfName("AIS");
+ /** A name */
+ public static final PdfName ALLPAGES = new PdfName("AllPages");
+ /** A name */
+ public static final PdfName ALTERNATE = new PdfName("Alternate");
+ /** A name */
+ public static final PdfName ANNOT = new PdfName("Annot");
+ /** A name */
+ public static final PdfName ANTIALIAS = new PdfName("AntiAlias");
+ /** A name */
+ public static final PdfName ANNOTS = new PdfName("Annots");
+ /** A name */
+ public static final PdfName AP = new PdfName("AP");
+ /** A name */
+ public static final PdfName ARTBOX = new PdfName("ArtBox");
+ /** A name */
+ public static final PdfName ASCENT = new PdfName("Ascent");
+ /** A name */
+ public static final PdfName AS = new PdfName("AS");
+ /** A name */
+ public static final PdfName ASCII85DECODE = new PdfName("ASCII85Decode");
+ /** A name */
+ public static final PdfName ASCIIHEXDECODE = new PdfName("ASCIIHexDecode");
+ /** A name */
+ public static final PdfName AUTHOR = new PdfName("Author");
+ /** A name */
+ public static final PdfName B = new PdfName("B");
+ /** A name */
+ public static final PdfName BASEENCODING = new PdfName("BaseEncoding");
+ /** A name */
+ public static final PdfName BASEFONT = new PdfName("BaseFont");
+ /** A name */
+ public static final PdfName BBOX = new PdfName("BBox");
+ /** A name */
+ public static final PdfName BC = new PdfName("BC");
+ /** A name */
+ public static final PdfName BG = new PdfName("BG");
+ /** A name */
+ public static final PdfName BIGFIVE = new PdfName("BigFive");
+ /** A name */
+ public static final PdfName BITSPERCOMPONENT = new PdfName("BitsPerComponent");
+ /** A name */
+ public static final PdfName BITSPERSAMPLE = new PdfName("BitsPerSample");
+ /** A name */
+ public static final PdfName BL = new PdfName("Bl");
+ /** A name */
+ public static final PdfName BLACKIS1 = new PdfName("BlackIs1");
+ /** A name */
+ public static final PdfName BLACKPOINT = new PdfName("BlackPoint");
+ /** A name */
+ public static final PdfName BLEEDBOX = new PdfName("BleedBox");
+ /** A name */
+ public static final PdfName BLINDS = new PdfName("Blinds");
+ /** A name */
+ public static final PdfName BM = new PdfName("BM");
+ /** A name */
+ public static final PdfName BORDER = new PdfName("Border");
+ /** A name */
+ public static final PdfName BOUNDS = new PdfName("Bounds");
+ /** A name */
+ public static final PdfName BOX = new PdfName("Box");
+ /** A name */
+ public static final PdfName BS = new PdfName("BS");
+ /** A name */
+ public static final PdfName BTN = new PdfName("Btn");
+ /** A name */
+ public static final PdfName BYTERANGE = new PdfName("ByteRange");
+ /** A name */
+ public static final PdfName C = new PdfName("C");
+ /** A name */
+ public static final PdfName C0 = new PdfName("C0");
+ /** A name */
+ public static final PdfName C1 = new PdfName("C1");
+ /** A name */
+ public static final PdfName CA = new PdfName("CA");
+ /** A name */
+ public static final PdfName ca = new PdfName("ca");
+ /** A name */
+ public static final PdfName CALGRAY = new PdfName("CalGray");
+ /** A name */
+ public static final PdfName CALRGB = new PdfName("CalRGB");
+ /** A name */
+ public static final PdfName CAPHEIGHT = new PdfName("CapHeight");
+ /** A name */
+ public static final PdfName CATALOG = new PdfName("Catalog");
+ /** A name */
+ public static final PdfName CATEGORY = new PdfName("Category");
+ /** A name */
+ public static final PdfName CCITTFAXDECODE = new PdfName("CCITTFaxDecode");
+ /** A name */
+ public static final PdfName CENTERWINDOW = new PdfName("CenterWindow");
+ /** A name */
+ public static final PdfName CERT = new PdfName("Cert");
+ /** A name */
+ public static final PdfName CH = new PdfName("Ch");
+ /** A name */
+ public static final PdfName CHARPROCS = new PdfName("CharProcs");
+ /** A name */
+ public static final PdfName CIDFONTTYPE0 = new PdfName("CIDFontType0");
+ /** A name */
+ public static final PdfName CIDFONTTYPE2 = new PdfName("CIDFontType2");
+ /** A name */
+ public static final PdfName CIDSYSTEMINFO = new PdfName("CIDSystemInfo");
+ /** A name */
+ public static final PdfName CIDTOGIDMAP = new PdfName("CIDToGIDMap");
+ /** A name */
+ public static final PdfName CIRCLE = new PdfName("Circle");
+ /** A name */
+ public static final PdfName CO = new PdfName("CO");
+ /** A name */
+ public static final PdfName COLORS = new PdfName("Colors");
+ /** A name */
+ public static final PdfName COLORSPACE = new PdfName("ColorSpace");
+ /** A name */
+ public static final PdfName COLUMNS = new PdfName("Columns");
+ /** A name */
+ public static final PdfName CONTACTINFO = new PdfName("ContactInfo");
+ /** A name */
+ public static final PdfName CONTENT = new PdfName("Content");
+ /** A name */
+ public static final PdfName CONTENTS = new PdfName("Contents");
+ /** A name */
+ public static final PdfName COORDS = new PdfName("Coords");
+ /** A name */
+ public static final PdfName COUNT = new PdfName("Count");
+ /** A name of a base 14 type 1 font */
+ public static final PdfName COURIER = new PdfName("Courier");
+ /** A name of a base 14 type 1 font */
+ public static final PdfName COURIER_BOLD = new PdfName("Courier-Bold");
+ /** A name of a base 14 type 1 font */
+ public static final PdfName COURIER_OBLIQUE = new PdfName("Courier-Oblique");
+ /** A name of a base 14 type 1 font */
+ public static final PdfName COURIER_BOLDOBLIQUE = new PdfName("Courier-BoldOblique");
+ /** A name */
+ public static final PdfName CREATIONDATE = new PdfName("CreationDate");
+ /** A name */
+ public static final PdfName CREATOR = new PdfName("Creator");
+ /** A name */
+ public static final PdfName CREATORINFO = new PdfName("CreatorInfo");
+ /** A name */
+ public static final PdfName CROPBOX = new PdfName("CropBox");
+ /** A name */
+ public static final PdfName CS = new PdfName("CS");
+ /** A name */
+ public static final PdfName D = new PdfName("D");
+ /** A name */
+ public static final PdfName DA = new PdfName("DA");
+ /** A name */
+ public static final PdfName DC = new PdfName("DC");
+ /** A name */
+ public static final PdfName DCTDECODE = new PdfName("DCTDecode");
+ /** A name */
+ public static final PdfName DECODE = new PdfName("Decode");
+ /** A name */
+ public static final PdfName DECODEPARMS = new PdfName("DecodeParms");
+ /** A name */
+ public static final PdfName DEFAULTCMYK = new PdfName("DefaultCMYK");
+ /** A name */
+ public static final PdfName DEFAULTGRAY = new PdfName("DefaultGray");
+ /** A name */
+ public static final PdfName DEFAULTRGB = new PdfName("DefaultRGB");
+ /** A name */
+ public static final PdfName DESC = new PdfName("Desc");
+ /** A name */
+ public static final PdfName DESCENDANTFONTS = new PdfName("DescendantFonts");
+ /** A name */
+ public static final PdfName DESCENT = new PdfName("Descent");
+ /** A name */
+ public static final PdfName DEST = new PdfName("Dest");
+ /** A name */
+ public static final PdfName DESTOUTPUTPROFILE = new PdfName("DestOutputProfile");
+ /** A name */
+ public static final PdfName DESTS = new PdfName("Dests");
+ /** A name */
+ public static final PdfName DEVICEGRAY = new PdfName("DeviceGray");
+ /** A name */
+ public static final PdfName DEVICERGB = new PdfName("DeviceRGB");
+ /** A name */
+ public static final PdfName DEVICECMYK = new PdfName("DeviceCMYK");
+ /** A name */
+ public static final PdfName DI = new PdfName("Di");
+ /** A name */
+ public static final PdfName DIFFERENCES = new PdfName("Differences");
+ /** A name */
+ public static final PdfName DISSOLVE = new PdfName("Dissolve");
+ /** A name */
+ public static final PdfName DIRECTION = new PdfName("Direction");
+ /** A name */
+ public static final PdfName DISPLAYDOCTITLE = new PdfName("DisplayDocTitle");
+ /** A name */
+ public static final PdfName DM = new PdfName("Dm");
+ /** A name */
+ public static final PdfName DOMAIN = new PdfName("Domain");
+ /** A name */
+ public static final PdfName DP = new PdfName("DP");
+ /** A name */
+ public static final PdfName DR = new PdfName("DR");
+ /** A name */
+ public static final PdfName DS = new PdfName("DS");
+ /** A name */
+ public static final PdfName DUR = new PdfName("Dur");
+ /** A name */
+ public static final PdfName DV = new PdfName("DV");
+ /** A name */
+ public static final PdfName DW = new PdfName("DW");
+ /** A name */
+ public static final PdfName E = new PdfName("E");
+ /** A name */
+ public static final PdfName EARLYCHANGE = new PdfName("EarlyChange");
+ /** A name */
+ public static final PdfName EF = new PdfName("EF");
+ /** A name */
+ public static final PdfName EMBEDDEDFILE = new PdfName("EmbeddedFile");
+ /** A name */
+ public static final PdfName EMBEDDEDFILES = new PdfName("EmbeddedFiles");
+ /** A name */
+ public static final PdfName ENCODE = new PdfName("Encode");
+ /** A name */
+ public static final PdfName ENCODEDBYTEALIGN = new PdfName("EncodedByteAlign");
+ /** A name */
+ public static final PdfName ENCODING = new PdfName("Encoding");
+ /** A name */
+ public static final PdfName ENCRYPT = new PdfName("Encrypt");
+ /** A name */
+ public static final PdfName ENDOFBLOCK = new PdfName("EndOfBlock");
+ /** A name */
+ public static final PdfName ENDOFLINE = new PdfName("EndOfLine");
+ /** A name */
+ public static final PdfName EXTEND = new PdfName("Extend");
+ /** A name */
+ public static final PdfName EXTGSTATE = new PdfName("ExtGState");
+ /** A name */
+ public static final PdfName EXPORT = new PdfName("Export");
+ /** A name */
+ public static final PdfName EXPORTSTATE = new PdfName("ExportState");
+ /** A name */
+ public static final PdfName EVENT = new PdfName("Event");
+ /** A name */
+ public static final PdfName F = new PdfName("F");
+ /** A name */
+ public static final PdfName FB = new PdfName("FB");
+ /** A name */
+ public static final PdfName FDECODEPARMS = new PdfName("FDecodeParms");
+ /** A name */
+ public static final PdfName FDF = new PdfName("FDF");
+ /** A name */
+ public static final PdfName FF = new PdfName("Ff");
+ /** A name */
+ public static final PdfName FFILTER = new PdfName("FFilter");
+ /** A name */
+ public static final PdfName FIELDS = new PdfName("Fields");
+ /** A name */
+ public static final PdfName FILEATTACHMENT = new PdfName("FileAttachment");
+ /** A name */
+ public static final PdfName FILESPEC = new PdfName("Filespec");
+ /** A name */
+ public static final PdfName FILTER = new PdfName("Filter");
+ /** A name */
+ public static final PdfName FIRST = new PdfName("First");
+ /** A name */
+ public static final PdfName FIRSTCHAR = new PdfName("FirstChar");
+ /** A name */
+ public static final PdfName FIRSTPAGE = new PdfName("FirstPage");
+ /** A name */
+ public static final PdfName FIT = new PdfName("Fit");
+ /** A name */
+ public static final PdfName FITH = new PdfName("FitH");
+ /** A name */
+ public static final PdfName FITV = new PdfName("FitV");
+ /** A name */
+ public static final PdfName FITR = new PdfName("FitR");
+ /** A name */
+ public static final PdfName FITB = new PdfName("FitB");
+ /** A name */
+ public static final PdfName FITBH = new PdfName("FitBH");
+ /** A name */
+ public static final PdfName FITBV = new PdfName("FitBV");
+ /** A name */
+ public static final PdfName FITWINDOW = new PdfName("FitWindow");
+ /** A name */
+ public static final PdfName FLAGS = new PdfName("Flags");
+ /** A name */
+ public static final PdfName FLATEDECODE = new PdfName("FlateDecode");
+ /** A name */
+ public static final PdfName FO = new PdfName("Fo");
+ /** A name */
+ public static final PdfName FONT = new PdfName("Font");
+ /** A name */
+ public static final PdfName FONTBBOX = new PdfName("FontBBox");
+ /** A name */
+ public static final PdfName FONTDESCRIPTOR = new PdfName("FontDescriptor");
+ /** A name */
+ public static final PdfName FONTFILE = new PdfName("FontFile");
+ /** A name */
+ public static final PdfName FONTFILE2 = new PdfName("FontFile2");
+ /** A name */
+ public static final PdfName FONTFILE3 = new PdfName("FontFile3");
+ /** A name */
+ public static final PdfName FONTMATRIX = new PdfName("FontMatrix");
+ /** A name */
+ public static final PdfName FONTNAME = new PdfName("FontName");
+ /** A name */
+ public static final PdfName FORM = new PdfName("Form");
+ /** A name */
+ public static final PdfName FORMTYPE = new PdfName("FormType");
+ /** A name */
+ public static final PdfName FREETEXT = new PdfName("FreeText");
+ /** A name */
+ public static final PdfName FRM = new PdfName("FRM");
+ /** A name */
+ public static final PdfName FS = new PdfName("FS");
+ /** A name */
+ public static final PdfName FT = new PdfName("FT");
+ /** A name */
+ public static final PdfName FULLSCREEN = new PdfName("FullScreen");
+ /** A name */
+ public static final PdfName FUNCTION = new PdfName("Function");
+ /** A name */
+ public static final PdfName FUNCTIONS = new PdfName("Functions");
+ /** A name */
+ public static final PdfName FUNCTIONTYPE = new PdfName("FunctionType");
+ /** A name of an attribute. */
+ public static final PdfName GAMMA = new PdfName("Gamma");
+ /** A name of an attribute. */
+ public static final PdfName GBK = new PdfName("GBK");
+ /** A name of an attribute. */
+ public static final PdfName GLITTER = new PdfName("Glitter");
+ /** A name of an attribute. */
+ public static final PdfName GOTO = new PdfName("GoTo");
+ /** A name of an attribute. */
+ public static final PdfName GOTOR = new PdfName("GoToR");
+ /** A name of an attribute. */
+ public static final PdfName GROUP = new PdfName("Group");
+ /** A name of an attribute. */
+ public static final PdfName GTS_PDFX = new PdfName("GTS_PDFX");
+ /** A name of an attribute. */
+ public static final PdfName GTS_PDFXVERSION = new PdfName("GTS_PDFXVersion");
+ /** A name of an attribute. */
+ public static final PdfName H = new PdfName("H");
+ /** A name of an attribute. */
+ public static final PdfName HEIGHT = new PdfName("Height");
+ /** A name of a base 14 type 1 font */
+ public static final PdfName HELVETICA = new PdfName("Helvetica");
+ /** A name of a base 14 type 1 font */
+ public static final PdfName HELVETICA_BOLD = new PdfName("Helvetica-Bold");
+ /** This is a static PdfName PdfName of a base 14 type 1 font */
+ public static final PdfName HELVETICA_OBLIQUE = new PdfName("Helvetica-Oblique");
+ /** This is a static PdfName PdfName of a base 14 type 1 font */
+ public static final PdfName HELVETICA_BOLDOBLIQUE = new PdfName("Helvetica-BoldOblique");
+ /** A name */
+ public static final PdfName HID = new PdfName("Hid");
+ /** A name */
+ public static final PdfName HIDE = new PdfName("Hide");
+ /** A name */
+ public static final PdfName HIDEMENUBAR = new PdfName("HideMenubar");
+ /** A name */
+ public static final PdfName HIDETOOLBAR = new PdfName("HideToolbar");
+ /** A name */
+ public static final PdfName HIDEWINDOWUI = new PdfName("HideWindowUI");
+ /** A name */
+ public static final PdfName HIGHLIGHT = new PdfName("Highlight");
+ /** A name */
+ public static final PdfName I = new PdfName("I");
+ /** A name */
+ public static final PdfName ICCBASED = new PdfName("ICCBased");
+ /** A name */
+ public static final PdfName ID = new PdfName("ID");
+ /** A name */
+ public static final PdfName IDENTITY = new PdfName("Identity");
+ /** A name */
+ public static final PdfName IF = new PdfName("IF");
+ /** A name */
+ public static final PdfName IMAGE = new PdfName("Image");
+ /** A name */
+ public static final PdfName IMAGEB = new PdfName("ImageB");
+ /** A name */
+ public static final PdfName IMAGEC = new PdfName("ImageC");
+ /** A name */
+ public static final PdfName IMAGEI = new PdfName("ImageI");
+ /** A name */
+ public static final PdfName IMAGEMASK = new PdfName("ImageMask");
+ /** A name */
+ public static final PdfName INDEX = new PdfName("Index");
+ /** A name */
+ public static final PdfName INDEXED = new PdfName("Indexed");
+ /** A name */
+ public static final PdfName INFO = new PdfName("Info");
+ /** A name */
+ public static final PdfName INK = new PdfName("Ink");
+ /** A name */
+ public static final PdfName INKLIST = new PdfName("InkList");
+ /** A name */
+ public static final PdfName IMPORTDATA = new PdfName("ImportData");
+ /** A name */
+ public static final PdfName INTENT = new PdfName("Intent");
+ /** A name */
+ public static final PdfName INTERPOLATE = new PdfName("Interpolate");
+ /** A name */
+ public static final PdfName ISMAP = new PdfName("IsMap");
+ /** A name */
+ public static final PdfName IRT = new PdfName("IRT");
+ /** A name */
+ public static final PdfName ITALICANGLE = new PdfName("ItalicAngle");
+ /** A name */
+ public static final PdfName IX = new PdfName("IX");
+ /** A name */
+ public static final PdfName JAVASCRIPT = new PdfName("JavaScript");
+ /** A name */
+ public static final PdfName JS = new PdfName("JS");
+ /** A name */
+ public static final PdfName K = new PdfName("K");
+ /** A name */
+ public static final PdfName KEYWORDS = new PdfName("Keywords");
+ /** A name */
+ public static final PdfName KIDS = new PdfName("Kids");
+ /** A name */
+ public static final PdfName L = new PdfName("L");
+ /** A name */
+ public static final PdfName L2R = new PdfName("L2R");
+ /** A name */
+ public static final PdfName LANG = new PdfName("Lang");
+ /** A name */
+ public static final PdfName LANGUAGE = new PdfName("Language");
+ /** A name */
+ public static final PdfName LAST = new PdfName("Last");
+ /** A name */
+ public static final PdfName LASTCHAR = new PdfName("LastChar");
+ /** A name */
+ public static final PdfName LASTPAGE = new PdfName("LastPage");
+ /** A name */
+ public static final PdfName LAUNCH = new PdfName("Launch");
+ /** A name */
+ public static final PdfName LENGTH = new PdfName("Length");
+ /** A name */
+ public static final PdfName LENGTH1 = new PdfName("Length1");
+ /** A name */
+ public static final PdfName LIMITS = new PdfName("Limits");
+ /** A name */
+ public static final PdfName LINE = new PdfName("Line");
+ /** A name */
+ public static final PdfName LINK = new PdfName("Link");
+ /** A name */
+ public static final PdfName LISTMODE = new PdfName("ListMode");
+ /** A name */
+ public static final PdfName LOCATION = new PdfName("Location");
+ /** A name */
+ public static final PdfName LOCK = new PdfName("Lock");
+ /** A name */
+ public static final PdfName LZWDECODE = new PdfName("LZWDecode");
+ /** A name */
+ public static final PdfName M = new PdfName("M");
+ /** A name */
+ public static final PdfName MATRIX = new PdfName("Matrix");
+ /** A name of an encoding */
+ public static final PdfName MAC_EXPERT_ENCODING = new PdfName("MacExpertEncoding");
+ /** A name of an encoding */
+ public static final PdfName MAC_ROMAN_ENCODING = new PdfName("MacRomanEncoding");
+ /** A name */
+ public static final PdfName MARKED = new PdfName("Marked");
+ /** A name */
+ public static final PdfName MARKINFO = new PdfName("MarkInfo");
+ /** A name */
+ public static final PdfName MASK = new PdfName("Mask");
+ /** A name */
+ public static final PdfName MAX = new PdfName("max");
+ /** A name */
+ public static final PdfName MAXLEN = new PdfName("MaxLen");
+ /** A name */
+ public static final PdfName MEDIABOX = new PdfName("MediaBox");
+ /** A name */
+ public static final PdfName MCID = new PdfName("MCID");
+ /** A name */
+ public static final PdfName MCR = new PdfName("MCR");
+ /** A name */
+ public static final PdfName METADATA = new PdfName("Metadata");
+ /** A name */
+ public static final PdfName MIN = new PdfName("min");
+ /** A name */
+ public static final PdfName MK = new PdfName("MK");
+ /** A name */
+ public static final PdfName MMTYPE1 = new PdfName("MMType1");
+ /** A name */
+ public static final PdfName MODDATE = new PdfName("ModDate");
+ /** A name */
+ public static final PdfName N = new PdfName("N");
+ /** A name */
+ public static final PdfName N0 = new PdfName("n0");
+ /** A name */
+ public static final PdfName N1 = new PdfName("n1");
+ /** A name */
+ public static final PdfName N2 = new PdfName("n2");
+ /** A name */
+ public static final PdfName N3 = new PdfName("n3");
+ /** A name */
+ public static final PdfName N4 = new PdfName("n4");
+ /** A name */
+ public static final PdfName NAME = new PdfName("Name");
+ /** A name */
+ public static final PdfName NAMED = new PdfName("Named");
+ /** A name */
+ public static final PdfName NAMES = new PdfName("Names");
+ /** A name */
+ public static final PdfName NEEDAPPEARANCES = new PdfName("NeedAppearances");
+ /** A name */
+ public static final PdfName NEWWINDOW = new PdfName("NewWindow");
+ /** A name */
+ public static final PdfName NEXT = new PdfName("Next");
+ /** A name */
+ public static final PdfName NEXTPAGE = new PdfName("NextPage");
+ /** A name */
+ public static final PdfName NM = new PdfName("NM");
+ /** A name */
+ public static final PdfName NONE = new PdfName("None");
+ /** A name */
+ public static final PdfName NONFULLSCREENPAGEMODE = new PdfName("NonFullScreenPageMode");
+ /** A name */
+ public static final PdfName NUMS = new PdfName("Nums");
+ /** A name */
+ public static final PdfName O = new PdfName("O");
+ /** A name */
+ public static final PdfName OBJSTM = new PdfName("ObjStm");
+ /** A name */
+ public static final PdfName OC = new PdfName("OC");
+ /** A name */
+ public static final PdfName OCG = new PdfName("OCG");
+ /** A name */
+ public static final PdfName OCGS = new PdfName("OCGs");
+ /** A name */
+ public static final PdfName OCMD = new PdfName("OCMD");
+ /** A name */
+ public static final PdfName OCPROPERTIES = new PdfName("OCProperties");
+ /** A name */
+ public static final PdfName Off = new PdfName("Off");
+ /** A name */
+ public static final PdfName OFF = new PdfName("OFF");
+ /** A name */
+ public static final PdfName ON = new PdfName("ON");
+ /** A name */
+ public static final PdfName ONECOLUMN = new PdfName("OneColumn");
+ /** A name */
+ public static final PdfName OPEN = new PdfName("Open");
+ /** A name */
+ public static final PdfName OPENACTION = new PdfName("OpenAction");
+ /** A name */
+ public static final PdfName OP = new PdfName("OP");
+ /** A name */
+ public static final PdfName op = new PdfName("op");
+ /** A name */
+ public static final PdfName OPM = new PdfName("OPM");
+ /** A name */
+ public static final PdfName OPT = new PdfName("Opt");
+ /** A name */
+ public static final PdfName ORDER = new PdfName("Order");
+ /** A name */
+ public static final PdfName ORDERING = new PdfName("Ordering");
+ /** A name */
+ public static final PdfName OUTLINES = new PdfName("Outlines");
+ /** A name */
+ public static final PdfName OUTPUTCONDITION = new PdfName("OutputCondition");
+ /** A name */
+ public static final PdfName OUTPUTCONDITIONIDENTIFIER = new PdfName("OutputConditionIdentifier");
+ /** A name */
+ public static final PdfName OUTPUTINTENT = new PdfName("OutputIntent");
+ /** A name */
+ public static final PdfName OUTPUTINTENTS = new PdfName("OutputIntents");
+ /** A name */
+ public static final PdfName P = new PdfName("P");
+ /** A name */
+ public static final PdfName PAGE = new PdfName("Page");
+ /** A name */
+ public static final PdfName PAGELABELS = new PdfName("PageLabels");
+ /** A name */
+ public static final PdfName PAGELAYOUT = new PdfName("PageLayout");
+ /** A name */
+ public static final PdfName PAGEMODE = new PdfName("PageMode");
+ /** A name */
+ public static final PdfName PAGES = new PdfName("Pages");
+ /** A name */
+ public static final PdfName PAINTTYPE = new PdfName("PaintType");
+ /** A name */
+ public static final PdfName PANOSE = new PdfName("Panose");
+ /** A name */
+ public static final PdfName PARAMS = new PdfName("Params");
+ /** A name */
+ public static final PdfName PARENT = new PdfName("Parent");
+ /** A name */
+ public static final PdfName PARENTTREE = new PdfName("ParentTree");
+ /** A name */
+ public static final PdfName PATTERN = new PdfName("Pattern");
+ /** A name */
+ public static final PdfName PATTERNTYPE = new PdfName("PatternType");
+ /** A name */
+ public static final PdfName PDF = new PdfName("PDF");
+ /** A name */
+ public static final PdfName PERCEPTUAL = new PdfName("Perceptual");
+ /** A name */
+ public static final PdfName PG = new PdfName("Pg");
+ /** A name */
+ public static final PdfName POPUP = new PdfName("Popup");
+ /** A name */
+ public static final PdfName PREDICTOR = new PdfName("Predictor");
+ /** A name */
+ public static final PdfName PREFERRED = new PdfName("Preferred");
+ /** A name */
+ public static final PdfName PRESERVERB = new PdfName("PreserveRB");
+ /** A name */
+ public static final PdfName PREV = new PdfName("Prev");
+ /** A name */
+ public static final PdfName PREVPAGE = new PdfName("PrevPage");
+ /** A name */
+ public static final PdfName PRINT = new PdfName("Print");
+ /** A name */
+ public static final PdfName PRINTSCALING = new PdfName("PrintScaling");
+ /** A name */
+ public static final PdfName PRINTSTATE = new PdfName("PrintState");
+ /** A name */
+ public static final PdfName PROCSET = new PdfName("ProcSet");
+ /** A name */
+ public static final PdfName PRODUCER = new PdfName("Producer");
+ /** A name */
+ public static final PdfName PROPERTIES = new PdfName("Properties");
+ /** A name */
+ public static final PdfName PS = new PdfName("PS");
+ /** A name */
+ public static final PdfName Q = new PdfName("Q");
+ /** A name */
+ public static final PdfName QUADPOINTS = new PdfName("QuadPoints");
+ /** A name */
+ public static final PdfName R = new PdfName("R");
+ /** A name */
+ public static final PdfName R2L = new PdfName("R2L");
+ /** A name */
+ public static final PdfName RANGE = new PdfName("Range");
+ /** A name */
+ public static final PdfName RC = new PdfName("RC");
+ /** A name */
+ public static final PdfName RBGROUPS = new PdfName("RBGroups");
+ /** A name */
+ public static final PdfName REASON = new PdfName("Reason");
+ /** A name */
+ public static final PdfName RECT = new PdfName("Rect");
+ /** A name */
+ public static final PdfName REGISTRY = new PdfName("Registry");
+ /** A name */
+ public static final PdfName REGISTRYNAME = new PdfName("RegistryName");
+ /** A name */
+ public static final PdfName RELATIVECALORIMETRIC = new PdfName("RelativeColorimetric");
+ /** A name */
+ public static final PdfName RENDITION = new PdfName("Rendition");
+ /** A name */
+ public static final PdfName RESETFORM = new PdfName("ResetForm");
+ /** A name */
+ public static final PdfName RESOURCES = new PdfName("Resources");
+ /** A name */
+ public static final PdfName RI = new PdfName("RI");
+ /** A name */
+ public static final PdfName ROLEMAP = new PdfName("RoleMap");
+ /** A name */
+ public static final PdfName ROOT = new PdfName("Root");
+ /** A name */
+ public static final PdfName ROTATE = new PdfName("Rotate");
+ /** A name */
+ public static final PdfName ROWS = new PdfName("Rows");
+ /** A name */
+ public static final PdfName RUNLENGTHDECODE = new PdfName("RunLengthDecode");
+ /** A name */
+ public static final PdfName RV = new PdfName("RV");
+ /** A name */
+ public static final PdfName S = new PdfName("S");
+ /** A name */
+ public static final PdfName SATURATION = new PdfName("Saturation");
+ /** A name */
+ public static final PdfName SCREEN = new PdfName("Screen");
+ /** A name */
+ public static final PdfName SEPARATION = new PdfName("Separation");
+ /** A name */
+ public static final PdfName SETOCGSTATE = new PdfName("SetOCGState");
+ /** A name */
+ public static final PdfName SHADING = new PdfName("Shading");
+ /** A name */
+ public static final PdfName SHADINGTYPE = new PdfName("ShadingType");
+ /** A name */
+ public static final PdfName SHIFT_JIS = new PdfName("Shift-JIS");
+ /** A name */
+ public static final PdfName SIG = new PdfName("Sig");
+ /** A name */
+ public static final PdfName SIGFLAGS = new PdfName("SigFlags");
+ /** A name */
+ public static final PdfName SINGLEPAGE = new PdfName("SinglePage");
+ /** A name */
+ public static final PdfName SIZE = new PdfName("Size");
+ /** A name */
+ public static final PdfName SMASK = new PdfName("SMask");
+ /** A name */
+ public static final PdfName SPLIT = new PdfName("Split");
+ /** A name */
+ public static final PdfName SQUARE = new PdfName("Square");
+ /** A name */
+ public static final PdfName ST = new PdfName("St");
+ /** A name */
+ public static final PdfName STAMP = new PdfName("Stamp");
+ /** A name */
+ public static final PdfName STANDARD = new PdfName("Standard");
+ /** A name */
+ public static final PdfName STATE = new PdfName("State");
+ /** A name */
+ public static final PdfName STRIKEOUT = new PdfName("StrikeOut");
+ /** A name */
+ public static final PdfName STRUCTPARENT = new PdfName("StructParent");
+ /** A name */
+ public static final PdfName STRUCTPARENTS = new PdfName("StructParents");
+ /** A name */
+ public static final PdfName STRUCTTREEROOT = new PdfName("StructTreeRoot");
+ /** A name */
+ public static final PdfName STYLE = new PdfName("Style");
+ /** A name */
+ public static final PdfName STEMV = new PdfName("StemV");
+ /** A name */
+ public static final PdfName SUBFILTER = new PdfName("SubFilter");
+ /** A name */
+ public static final PdfName SUBJECT = new PdfName("Subject");
+ /** A name */
+ public static final PdfName SUBMITFORM = new PdfName("SubmitForm");
+ /** A name */
+ public static final PdfName SUBTYPE = new PdfName("Subtype");
+ /** A name */
+ public static final PdfName SUPPLEMENT = new PdfName("Supplement");
+ /** A name */
+ public static final PdfName SV = new PdfName("SV");
+ /** A name */
+ public static final PdfName SW = new PdfName("SW");
+ /** A name of a base 14 type 1 font */
+ public static final PdfName SYMBOL = new PdfName("Symbol");
+ /** A name */
+ public static final PdfName T = new PdfName("T");
+ /** A name */
+ public static final PdfName TEXT = new PdfName("Text");
+ /** A name */
+ public static final PdfName THUMB = new PdfName("Thumb");
+ /** A name */
+ public static final PdfName THREADS = new PdfName("Threads");
+ /** A name */
+ public static final PdfName TI = new PdfName("TI");
+ /** A name */
+ public static final PdfName TILINGTYPE = new PdfName("TilingType");
+ /** A name of a base 14 type 1 font */
+ public static final PdfName TIMES_ROMAN = new PdfName("Times-Roman");
+ /** A name of a base 14 type 1 font */
+ public static final PdfName TIMES_BOLD = new PdfName("Times-Bold");
+ /** A name of a base 14 type 1 font */
+ public static final PdfName TIMES_ITALIC = new PdfName("Times-Italic");
+ /** A name of a base 14 type 1 font */
+ public static final PdfName TIMES_BOLDITALIC = new PdfName("Times-BoldItalic");
+ /** A name */
+ public static final PdfName TITLE = new PdfName("Title");
+ /** A name */
+ public static final PdfName TK = new PdfName("TK");
+ /** A name */
+ public static final PdfName TM = new PdfName("TM");
+ /** A name */
+ public static final PdfName TOGGLE = new PdfName("Toggle");
+ /** A name */
+ public static final PdfName TOUNICODE = new PdfName("ToUnicode");
+ /** A name */
+ public static final PdfName TP = new PdfName("TP");
+ /** A name */
+ public static final PdfName TRANS = new PdfName("Trans");
+ /** A name */
+ public static final PdfName TRANSPARENCY = new PdfName("Transparency");
+ /** A name */
+ public static final PdfName TRAPPED = new PdfName("Trapped");
+ /** A name */
+ public static final PdfName TRIMBOX = new PdfName("TrimBox");
+ /** A name */
+ public static final PdfName TRUETYPE = new PdfName("TrueType");
+ /** A name */
+ public static final PdfName TU = new PdfName("TU");
+ /** A name */
+ public static final PdfName TWOCOLUMNLEFT = new PdfName("TwoColumnLeft");
+ /** A name */
+ public static final PdfName TWOCOLUMNRIGHT = new PdfName("TwoColumnRight");
+ /** A name */
+ public static final PdfName TWOPAGELEFT = new PdfName("TwoPageLeft");
+ /** A name */
+ public static final PdfName TWOPAGERIGHT = new PdfName("TwoPageRight");
+ /** A name */
+ public static final PdfName TX = new PdfName("Tx");
+ /** A name */
+ public static final PdfName TYPE = new PdfName("Type");
+ /** A name */
+ public static final PdfName TYPE0 = new PdfName("Type0");
+ /** A name */
+ public static final PdfName TYPE1 = new PdfName("Type1");
+ /** A name of an attribute. */
+ public static final PdfName TYPE3 = new PdfName("Type3");
+ /** A name of an attribute. */
+ public static final PdfName U = new PdfName("U");
+ /** A name of an attribute. */
+ public static final PdfName UHC = new PdfName("UHC");
+ /** A name of an attribute. */
+ public static final PdfName UNDERLINE = new PdfName("Underline");
+ /** A name */
+ public static final PdfName URI = new PdfName("URI");
+ /** A name */
+ public static final PdfName URL = new PdfName("URL");
+ /** A name */
+ public static final PdfName USAGE = new PdfName("Usage");
+ /** A name */
+ public static final PdfName USEATTACHMENTS = new PdfName("UseAttachments");
+ /** A name */
+ public static final PdfName USENONE = new PdfName("UseNone");
+ /** A name */
+ public static final PdfName USEOC = new PdfName("UseOC");
+ /** A name */
+ public static final PdfName USEOUTLINES = new PdfName("UseOutlines");
+ /** A name */
+ public static final PdfName USER = new PdfName("User");
+ /** A name */
+ public static final PdfName USERUNIT = new PdfName("UserUnit");
+ /** A name */
+ public static final PdfName USETHUMBS = new PdfName("UseThumbs");
+ /** A name */
+ public static final PdfName V = new PdfName("V");
+ /** A name */
+ public static final PdfName VERISIGN_PPKVS = new PdfName("VeriSign.PPKVS");
+ /** A name */
+ public static final PdfName VIEW = new PdfName("View");
+ /** A name */
+ public static final PdfName VIEWERPREFERENCES = new PdfName("ViewerPreferences");
+ /** A name */
+ public static final PdfName VIEWSTATE = new PdfName("ViewState");
+ /** A name */
+ public static final PdfName VISIBLEPAGES = new PdfName("VisiblePages");
+ /** A name of an attribute. */
+ public static final PdfName W = new PdfName("W");
+ /** A name of an attribute. */
+ public static final PdfName W2 = new PdfName("W2");
+ /** A name of an attribute. */
+ public static final PdfName WC = new PdfName("WC");
+ /** A name of an attribute. */
+ public static final PdfName WIDGET = new PdfName("Widget");
+ /** A name of an attribute. */
+ public static final PdfName WIDTH = new PdfName("Width");
+ /** A name */
+ public static final PdfName WIDTHS = new PdfName("Widths");
+ /** A name of an encoding */
+ public static final PdfName WIN = new PdfName("Win");
+ /** A name of an encoding */
+ public static final PdfName WIN_ANSI_ENCODING = new PdfName("WinAnsiEncoding");
+ /** A name of an encoding */
+ public static final PdfName WIPE = new PdfName("Wipe");
+ /** A name */
+ public static final PdfName WHITEPOINT = new PdfName("WhitePoint");
+ /** A name */
+ public static final PdfName WP = new PdfName("WP");
+ /** A name of an encoding */
+ public static final PdfName WS = new PdfName("WS");
+ /** A name */
+ public static final PdfName X = new PdfName("X");
+ /** A name */
+ public static final PdfName XFA = new PdfName("XFA");
+ /** A name */
+ public static final PdfName XML = new PdfName("XML");
+ /** A name */
+ public static final PdfName XOBJECT = new PdfName("XObject");
+ /** A name */
+ public static final PdfName XSTEP = new PdfName("XStep");
+ /** A name */
+ public static final PdfName XREF = new PdfName("XRef");
+ /** A name */
+ public static final PdfName XREFSTM = new PdfName("XRefStm");
+ /** A name */
+ public static final PdfName XYZ = new PdfName("XYZ");
+ /** A name */
+ public static final PdfName YSTEP = new PdfName("YStep");
+ /** A name of a base 14 type 1 font */
+ public static final PdfName ZAPFDINGBATS = new PdfName("ZapfDingbats");
+ /** A name */
+ public static final PdfName ZOOM = new PdfName("Zoom");
+
+ private int hash = 0;
+
+ // constructors
+
+
+ /**
+ * Constructs a new <CODE>PdfName</CODE>. The name length will be checked.
+ * @param name the new name
+ */
+ public PdfName(String name) {
+ this(name, true);
+ }
+
+ /**
+ * Constructs a new <CODE>PdfName</CODE>.
+ * @param name the new name
+ * @param lengthCheck if <CODE>true</CODE> check the lenght validity, if <CODE>false</CODE> the name can
+ * have any length
+ */
+
+ public PdfName(String name, boolean lengthCheck) {
+ super(PdfObject.NAME);
+ // The minimum number of characters in a name is 0, the maximum is 127 (the '/' not included)
+ int length = name.length();
+ if (lengthCheck && length > 127) {
+ throw new IllegalArgumentException("The name '" + name + "' is too long (" + length + " characters).");
+ }
+ // The name has to be checked for illegal characters
+ // every special character has to be substituted
+ ByteBuffer pdfName = new ByteBuffer(length + 20);
+ pdfName.append('/');
+ char character;
+ char chars[] = name.toCharArray();
+ // loop over all the characters
+ for (int index = 0; index < length; index++) {
+ character = (char)(chars[index] & 0xff);
+ // special characters are escaped (reference manual p.39)
+ switch (character) {
+ case ' ':
+ case '%':
+ case '(':
+ case ')':
+ case '<':
+ case '>':
+ case '[':
+ case ']':
+ case '{':
+ case '}':
+ case '/':
+ case '#':
+ pdfName.append('#');
+ pdfName.append(Integer.toString((int) character, 16));
+ break;
+ default:
+ if (character > 126 || character < 32) {
+ pdfName.append('#');
+ if (character < 16)
+ pdfName.append('0');
+ pdfName.append(Integer.toString((int) character, 16));
+ }
+ else
+ pdfName.append(character);
+ break;
+ }
+ }
+ bytes = pdfName.toByteArray();
+ }
+
+ /**
+ * Constructs a PdfName.
+ * @param bytes the byte representation of the name
+ */
+ public PdfName(byte bytes[]) {
+ super(PdfObject.NAME, bytes);
+ }
+ // methods
+
+ /**
+ * Compares this object with the specified object for order. Returns a
+ * negative integer, zero, or a positive integer as this object is less
+ * than, equal to, or greater than the specified object.<p>
+ * @param object the Object to be compared.
+ * @return a negative integer, zero, or a positive integer as this object
+ * is less than, equal to, or greater than the specified object.
+ * @throws ClassCastException if the specified object's type prevents it
+ * from being compared to this Object.
+ */
+ public int compareTo(Object object) {
+ PdfName name = (PdfName) object;
+
+ byte myBytes[] = bytes;
+ byte objBytes[] = name.bytes;
+ int len = Math.min(myBytes.length, objBytes.length);
+ for(int i=0; i<len; i++) {
+ if(myBytes[i] > objBytes[i])
+ return 1;
+
+ if(myBytes[i] < objBytes[i])
+ return -1;
+ }
+ if (myBytes.length < objBytes.length)
+ return -1;
+ if (myBytes.length > objBytes.length)
+ return 1;
+ return 0;
+ }
+
+ /**
+ * Indicates whether some other object is "equal to" this one.
+ *
+ * @param obj the reference object with which to compare.
+ * @return <code>true</code> if this object is the same as the obj
+ * argument; <code>false</code> otherwise.
+ */
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj instanceof PdfName)
+ return compareTo(obj) == 0;
+ return false;
+ }
+
+ /**
+ * Returns a hash code value for the object. This method is
+ * supported for the benefit of hashtables such as those provided by
+ * <code>java.util.Hashtable</code>.
+ *
+ * @return a hash code value for this object.
+ */
+ public int hashCode() {
+ int h = hash;
+ if (h == 0) {
+ int ptr = 0;
+ int len = bytes.length;
+
+ for (int i = 0; i < len; i++)
+ h = 31*h + (bytes[ptr++] & 0xff);
+ hash = h;
+ }
+ return h;
+ }
+
+ /** Decodes an escaped name in the form "/AB#20CD" into "AB CD".
+ * @param name the name to decode
+ * @return the decoded name
+ */
+ public static String decodeName(String name) {
+ StringBuffer buf = new StringBuffer();
+ try {
+ int len = name.length();
+ for (int k = 1; k < len; ++k) {
+ char c = name.charAt(k);
+ if (c == '#') {
+ c = (char)((PRTokeniser.getHex(name.charAt(k + 1)) << 4) + PRTokeniser.getHex(name.charAt(k + 2)));
+ k += 2;
+ }
+ buf.append(c);
+ }
+ }
+ catch (IndexOutOfBoundsException e) {
+ // empty on purpose
+ }
+ return buf.toString();
+ }
+}
diff --git a/src/main/java/com/lowagie/text/pdf/PdfNameTree.java b/src/main/java/com/lowagie/text/pdf/PdfNameTree.java
new file mode 100644
index 0000000..999fca8
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/PdfNameTree.java
@@ -0,0 +1,165 @@
+/*
+ * Copyright 2004 by Paulo Soares.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+package com.lowagie.text.pdf;
+
+import java.util.HashMap;
+import java.util.Arrays;
+import java.util.ArrayList;
+import java.io.IOException;
+import com.lowagie.text.StringCompare;
+
+/**
+ * Creates a name tree.
+ * @author Paulo Soares (psoares@consiste.pt)
+ */
+public class PdfNameTree {
+
+ private static final int leafSize = 64;
+ private static final StringCompare stringCompare = new StringCompare();
+
+ /**
+ * Creates a name tree.
+ * @param items the item of the name tree. The key is a <CODE>String</CODE>
+ * and the value is a <CODE>PdfObject</CODE>. Note that although the
+ * keys are strings only the lower byte is used and no check is made for chars
+ * with the same lower byte and different upper byte. This will generate a wrong
+ * tree name.
+ * @param writer the writer
+ * @throws IOException on error
+ * @return the dictionary with the name tree. This dictionary is the one
+ * generally pointed to by the key /Dests, for example
+ */
+ public static PdfDictionary writeTree(HashMap items, PdfWriter writer) throws IOException {
+ if (items.size() == 0)
+ return null;
+ String names[] = new String[items.size()];
+ names = (String[])items.keySet().toArray(names);
+ Arrays.sort(names, stringCompare);
+ if (names.length <= leafSize) {
+ PdfDictionary dic = new PdfDictionary();
+ PdfArray ar = new PdfArray();
+ for (int k = 0; k < names.length; ++k) {
+ ar.add(new PdfString(names[k], null));
+ ar.add((PdfObject)items.get(names[k]));
+ }
+ dic.put(PdfName.NAMES, ar);
+ return dic;
+ }
+ int skip = leafSize;
+ PdfIndirectReference kids[] = new PdfIndirectReference[(names.length + leafSize - 1) / leafSize];
+ for (int k = 0; k < kids.length; ++k) {
+ int offset = k * leafSize;
+ int end = Math.min(offset + leafSize, names.length);
+ PdfDictionary dic = new PdfDictionary();
+ PdfArray arr = new PdfArray();
+ arr.add(new PdfString(names[offset], null));
+ arr.add(new PdfString(names[end - 1], null));
+ dic.put(PdfName.LIMITS, arr);
+ arr = new PdfArray();
+ for (; offset < end; ++offset) {
+ arr.add(new PdfString(names[offset], null));
+ arr.add((PdfObject)items.get(names[offset]));
+ }
+ dic.put(PdfName.NAMES, arr);
+ kids[k] = writer.addToBody(dic).getIndirectReference();
+ }
+ int top = kids.length;
+ while (true) {
+ if (top <= leafSize) {
+ PdfArray arr = new PdfArray();
+ for (int k = 0; k < top; ++k)
+ arr.add(kids[k]);
+ PdfDictionary dic = new PdfDictionary();
+ dic.put(PdfName.KIDS, arr);
+ return dic;
+ }
+ skip *= leafSize;
+ int tt = (names.length + skip - 1 )/ skip;
+ for (int k = 0; k < tt; ++k) {
+ int offset = k * leafSize;
+ int end = Math.min(offset + leafSize, top);
+ PdfDictionary dic = new PdfDictionary();
+ PdfArray arr = new PdfArray();
+ arr.add(new PdfString(names[k * skip], null));
+ arr.add(new PdfString(names[Math.min((k + 1) * skip, names.length) - 1], null));
+ dic.put(PdfName.LIMITS, arr);
+ arr = new PdfArray();
+ for (; offset < end; ++offset) {
+ arr.add(kids[offset]);
+ }
+ dic.put(PdfName.KIDS, arr);
+ kids[k] = writer.addToBody(dic).getIndirectReference();
+ }
+ top = tt;
+ }
+ }
+
+ private static void iterateItems(PdfDictionary dic, HashMap items) {
+ PdfArray nn = (PdfArray)PdfReader.getPdfObjectRelease(dic.get(PdfName.NAMES));
+ if (nn != null) {
+ ArrayList arr = nn.getArrayList();
+ for (int k = 0; k < arr.size(); ++k) {
+ PdfString s = (PdfString)PdfReader.getPdfObjectRelease((PdfObject)arr.get(k++));
+ items.put(PdfEncodings.convertToString(s.getBytes(), null), arr.get(k));
+ }
+ }
+ else if ((nn = (PdfArray)PdfReader.getPdfObjectRelease(dic.get(PdfName.KIDS))) != null) {
+ ArrayList arr = nn.getArrayList();
+ for (int k = 0; k < arr.size(); ++k) {
+ PdfDictionary kid = (PdfDictionary)PdfReader.getPdfObjectRelease((PdfObject)arr.get(k));
+ iterateItems(kid, items);
+ }
+ }
+ }
+
+ public static HashMap readTree(PdfDictionary dic) {
+ HashMap items = new HashMap();
+ if (dic != null)
+ iterateItems(dic, items);
+ return items;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/pdf/PdfNull.java b/src/main/java/com/lowagie/text/pdf/PdfNull.java
new file mode 100644
index 0000000..ab40b32
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/PdfNull.java
@@ -0,0 +1,87 @@
+/*
+ * $Id: PdfNull.java,v 1.55 2005/11/29 21:05:02 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 1999, 2000, 2001, 2002 Bruno Lowagie
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf;
+
+/**
+ * <CODE>PdfNull</CODE> is the Null object represented by the keyword <VAR>null</VAR>.
+ * <P>
+ * This object is described in the 'Portable Document Format Reference Manual version 1.3'
+ * section 4.9 (page 53).
+ *
+ * @see PdfObject
+ */
+
+public class PdfNull extends PdfObject {
+
+ // static membervariables
+
+/** This is an instance of the <CODE>PdfNull</CODE>-object. */
+ public static final PdfNull PDFNULL = new PdfNull();
+
+/** This is the content of a <CODE>PdfNull</CODE>-object. */
+ private static final String CONTENT = "null";
+
+ // constructors
+
+/**
+ * Constructs a <CODE>PdfNull</CODE>-object.
+ * <P>
+ * You never need to do this yourself, you can always use the static final object <VAR>PDFNULL</VAR>.
+ */
+
+ public PdfNull() {
+ super(NULL, CONTENT);
+ }
+
+ public String toString() {
+ return "null";
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/pdf/PdfNumber.java b/src/main/java/com/lowagie/text/pdf/PdfNumber.java
new file mode 100644
index 0000000..07faf07
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/PdfNumber.java
@@ -0,0 +1,159 @@
+/*
+ * $Id: PdfNumber.java,v 1.56 2005/05/04 14:32:42 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 1999, 2000, 2001, 2002 Bruno Lowagie
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf;
+
+/**
+ * <CODE>PdfNumber</CODE> provides two types of numbers, integer and real.
+ * <P>
+ * Integers may be specified by signed or unsigned constants. Reals may only be
+ * in decimal format.<BR>
+ * This object is described in the 'Portable Document Format Reference Manual version 1.3'
+ * section 4.3 (page 37).
+ *
+ * @see PdfObject
+ * @see BadPdfFormatException
+ */
+
+public class PdfNumber extends PdfObject {
+
+/** actual value of this <CODE>PdfNumber</CODE>, represented as a <CODE>double</CODE> */
+ private double value;
+
+ // constructors
+
+/**
+ * Constructs a <CODE>PdfNumber</CODE>-object.
+ *
+ * @param content value of the new <CODE>PdfNumber</CODE>-object
+ */
+
+ public PdfNumber(String content) {
+ super(NUMBER);
+ try {
+ value = Double.valueOf(content.trim()).doubleValue();
+ setContent(content);
+ }
+ catch (NumberFormatException nfe){
+ throw new RuntimeException(content + " is not a valid number - " + nfe.toString());
+ }
+ }
+
+/**
+ * Constructs a new INTEGER <CODE>PdfNumber</CODE>-object.
+ *
+ * @param value value of the new <CODE>PdfNumber</CODE>-object
+ */
+
+ public PdfNumber(int value) {
+ super(NUMBER);
+ this.value = value;
+ setContent(String.valueOf(value));
+ }
+
+/**
+ * Constructs a new REAL <CODE>PdfNumber</CODE>-object.
+ *
+ * @param value value of the new <CODE>PdfNumber</CODE>-object
+ */
+
+ public PdfNumber(double value) {
+ super(NUMBER);
+ this.value = value;
+ setContent(ByteBuffer.formatDouble(value));
+ }
+
+/**
+ * Constructs a new REAL <CODE>PdfNumber</CODE>-object.
+ *
+ * @param value value of the new <CODE>PdfNumber</CODE>-object
+ */
+
+ public PdfNumber(float value) {
+ this((double)value);
+ }
+
+ // methods returning the value of this object
+
+/**
+ * Returns the primitive <CODE>int</CODE> value of this object.
+ *
+ * @return a value
+ */
+
+ public int intValue() {
+ return (int) value;
+ }
+
+/**
+ * Returns the primitive <CODE>double</CODE> value of this object.
+ *
+ * @return a value
+ */
+
+ public double doubleValue() {
+ return value;
+ }
+
+ public float floatValue() {
+ return (float)value;
+ }
+
+ // other methods
+
+/**
+ * Increments the value of the <CODE>PdfNumber</CODE>-object with 1.
+ */
+
+ public void increment() {
+ value += 1.0;
+ setContent(ByteBuffer.formatDouble(value));
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/pdf/PdfNumberTree.java b/src/main/java/com/lowagie/text/pdf/PdfNumberTree.java
new file mode 100644
index 0000000..8e39c1d
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/PdfNumberTree.java
@@ -0,0 +1,159 @@
+/*
+ * Copyright 2005 by Paulo Soares.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+package com.lowagie.text.pdf;
+
+import java.util.HashMap;
+import java.util.Arrays;
+import java.util.ArrayList;
+import java.io.IOException;
+
+/**
+ * Creates a number tree.
+ * @author Paulo Soares (psoares@consiste.pt)
+ */
+public class PdfNumberTree {
+
+ private static final int leafSize = 64;
+
+ /**
+ * Creates a number tree.
+ * @param items the item of the number tree. The key is an <CODE>Integer</CODE>
+ * and the value is a <CODE>PdfObject</CODE>.
+ * @param writer the writer
+ * @throws IOException on error
+ * @return the dictionary with the number tree.
+ */
+ public static PdfDictionary writeTree(HashMap items, PdfWriter writer) throws IOException {
+ if (items.size() == 0)
+ return null;
+ Integer numbers[] = new Integer[items.size()];
+ numbers = (Integer[])items.keySet().toArray(numbers);
+ Arrays.sort(numbers);
+ if (numbers.length <= leafSize) {
+ PdfDictionary dic = new PdfDictionary();
+ PdfArray ar = new PdfArray();
+ for (int k = 0; k < numbers.length; ++k) {
+ ar.add(new PdfNumber(numbers[k].intValue()));
+ ar.add((PdfObject)items.get(numbers[k]));
+ }
+ dic.put(PdfName.NUMS, ar);
+ return dic;
+ }
+ int skip = leafSize;
+ PdfIndirectReference kids[] = new PdfIndirectReference[(numbers.length + leafSize - 1) / leafSize];
+ for (int k = 0; k < kids.length; ++k) {
+ int offset = k * leafSize;
+ int end = Math.min(offset + leafSize, numbers.length);
+ PdfDictionary dic = new PdfDictionary();
+ PdfArray arr = new PdfArray();
+ arr.add(new PdfNumber(numbers[offset].intValue()));
+ arr.add(new PdfNumber(numbers[end - 1].intValue()));
+ dic.put(PdfName.LIMITS, arr);
+ arr = new PdfArray();
+ for (; offset < end; ++offset) {
+ arr.add(new PdfNumber(numbers[offset].intValue()));
+ arr.add((PdfObject)items.get(numbers[offset]));
+ }
+ dic.put(PdfName.NUMS, arr);
+ kids[k] = writer.addToBody(dic).getIndirectReference();
+ }
+ int top = kids.length;
+ while (true) {
+ if (top <= leafSize) {
+ PdfArray arr = new PdfArray();
+ for (int k = 0; k < top; ++k)
+ arr.add(kids[k]);
+ PdfDictionary dic = new PdfDictionary();
+ dic.put(PdfName.KIDS, arr);
+ return dic;
+ }
+ skip *= leafSize;
+ int tt = (numbers.length + skip - 1 )/ skip;
+ for (int k = 0; k < tt; ++k) {
+ int offset = k * leafSize;
+ int end = Math.min(offset + leafSize, top);
+ PdfDictionary dic = new PdfDictionary();
+ PdfArray arr = new PdfArray();
+ arr.add(new PdfNumber(numbers[k * skip].intValue()));
+ arr.add(new PdfNumber(numbers[Math.min((k + 1) * skip, numbers.length) - 1].intValue()));
+ dic.put(PdfName.LIMITS, arr);
+ arr = new PdfArray();
+ for (; offset < end; ++offset) {
+ arr.add(kids[offset]);
+ }
+ dic.put(PdfName.KIDS, arr);
+ kids[k] = writer.addToBody(dic).getIndirectReference();
+ }
+ top = tt;
+ }
+ }
+
+ private static void iterateItems(PdfDictionary dic, HashMap items) {
+ PdfArray nn = (PdfArray)PdfReader.getPdfObjectRelease(dic.get(PdfName.NUMS));
+ if (nn != null) {
+ ArrayList arr = nn.getArrayList();
+ for (int k = 0; k < arr.size(); ++k) {
+ PdfNumber s = (PdfNumber)PdfReader.getPdfObjectRelease((PdfObject)arr.get(k++));
+ items.put(new Integer(s.intValue()), arr.get(k));
+ }
+ }
+ else if ((nn = (PdfArray)PdfReader.getPdfObjectRelease(dic.get(PdfName.KIDS))) != null) {
+ ArrayList arr = nn.getArrayList();
+ for (int k = 0; k < arr.size(); ++k) {
+ PdfDictionary kid = (PdfDictionary)PdfReader.getPdfObjectRelease((PdfObject)arr.get(k));
+ iterateItems(kid, items);
+ }
+ }
+ }
+
+ public static HashMap readTree(PdfDictionary dic) {
+ HashMap items = new HashMap();
+ if (dic != null)
+ iterateItems(dic, items);
+ return items;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/pdf/PdfOCG.java b/src/main/java/com/lowagie/text/pdf/PdfOCG.java
new file mode 100644
index 0000000..18809f8
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/PdfOCG.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2004 by Paulo Soares.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+package com.lowagie.text.pdf;
+
+/**
+ * The interface common to all layer types.
+ *
+ * @author Paulo Soares (psoares@consiste.pt)
+ */
+public interface PdfOCG {
+
+ /**
+ * Gets the <CODE>PdfIndirectReference</CODE> that represents this layer.
+ * @return the <CODE>PdfIndirectReference</CODE> that represents this layer
+ */
+ public PdfIndirectReference getRef();
+
+ /**
+ * Gets the object representing the layer.
+ * @return the object representing the layer
+ */
+ public PdfObject getPdfObject();
+}
diff --git a/src/main/java/com/lowagie/text/pdf/PdfOCProperties.java b/src/main/java/com/lowagie/text/pdf/PdfOCProperties.java
new file mode 100644
index 0000000..a4d0caa
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/PdfOCProperties.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright 2004 by Paulo Soares.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+package com.lowagie.text.pdf;
+
+/**
+ * This class represents the /OCProperties entry in the document catalog
+ * and holds the optional content properties dictionary, which contains
+ * a list of all the optional content groups in the document, as well as information
+ * about the default and alternate configurations for optional content.
+ *
+ * @author Paulo Soares (psoares@consiste.pt)
+ */
+public class PdfOCProperties extends PdfDictionary {
+
+}
diff --git a/src/main/java/com/lowagie/text/pdf/PdfObject.java b/src/main/java/com/lowagie/text/pdf/PdfObject.java
new file mode 100644
index 0000000..5b92bb4
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/PdfObject.java
@@ -0,0 +1,369 @@
+/*
+ * $Id: PdfObject.java,v 1.60 2005/11/29 21:05:02 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 1999, 2000, 2001, 2002 Bruno Lowagie
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf;
+import java.io.OutputStream;
+import java.io.IOException;
+
+/**
+ * <CODE>PdfObject</CODE> is the abstract superclass of all PDF objects.
+ * <P>
+ * PDF supports seven basic types of objects: Booleans, numbers, strings, names,
+ * arrays, dictionaries and streams. In addition, PDF provides a null object.
+ * Objects may be labeled so that they can be referred to by other objects.<BR>
+ * All these basic PDF objects are described in the 'Portable Document Format
+ * Reference Manual version 1.3' Chapter 4 (pages 37-54).
+ *
+ * @see PdfNull
+ * @see PdfBoolean
+ * @see PdfNumber
+ * @see PdfString
+ * @see PdfName
+ * @see PdfArray
+ * @see PdfDictionary
+ * @see PdfStream
+ * @see PdfIndirectReference
+ */
+
+public abstract class PdfObject {
+
+ // static membervariables (all the possible types of a PdfObject)
+
+/** a possible type of <CODE>PdfObject</CODE> */
+ public static final int BOOLEAN = 1;
+
+/** a possible type of <CODE>PdfObject</CODE> */
+ public static final int NUMBER = 2;
+
+/** a possible type of <CODE>PdfObject</CODE> */
+ public static final int STRING = 3;
+
+/** a possible type of <CODE>PdfObject</CODE> */
+ public static final int NAME = 4;
+
+/** a possible type of <CODE>PdfObject</CODE> */
+ public static final int ARRAY = 5;
+
+/** a possible type of <CODE>PdfObject</CODE> */
+ public static final int DICTIONARY = 6;
+
+/** a possible type of <CODE>PdfObject</CODE> */
+ public static final int STREAM = 7;
+
+/** a possible type of <CODE>PdfObject</CODE> */
+ public static final int NULL = 8;
+
+ /** a possible type of <CODE>PdfObject</CODE> */
+ public static final int INDIRECT = 10;
+
+/** This is an empty string used for the <CODE>PdfNull</CODE>-object and for an empty <CODE>PdfString</CODE>-object. */
+ public static final String NOTHING = "";
+
+/** This is the default encoding to be used for converting Strings into bytes and vice versa.
+ * The default encoding is PdfDocEncoding.
+ */
+ public static final String TEXT_PDFDOCENCODING = "PDF";
+
+/** This is the encoding to be used to output text in Unicode. */
+ public static final String TEXT_UNICODE = "UnicodeBig";
+
+ // membervariables
+
+/** the content of this <CODE>PdfObject</CODE> */
+ protected byte[] bytes;
+
+/** the type of this <CODE>PdfObject</CODE> */
+ protected int type;
+
+ /**
+ * Holds value of property indRef.
+ */
+ protected PRIndirectReference indRef;
+
+ // constructors
+
+/**
+ * Constructs a <CODE>PdfObject</CODE> of a certain <VAR>type</VAR> without any <VAR>content</VAR>.
+ *
+ * @param type type of the new <CODE>PdfObject</CODE>
+ */
+
+ protected PdfObject(int type) {
+ this.type = type;
+ }
+
+/**
+ * Constructs a <CODE>PdfObject</CODE> of a certain <VAR>type</VAR> with a certain <VAR>content</VAR>.
+ *
+ * @param type type of the new <CODE>PdfObject</CODE>
+ * @param content content of the new <CODE>PdfObject</CODE> as a <CODE>String</CODE>.
+ */
+
+ protected PdfObject(int type, String content) {
+ this.type = type;
+ bytes = PdfEncodings.convertToBytes(content, null);
+ }
+
+/**
+ * Constructs a <CODE>PdfObject</CODE> of a certain <VAR>type</VAR> with a certain <VAR>content</VAR>.
+ *
+ * @param type type of the new <CODE>PdfObject</CODE>
+ * @param bytes content of the new <CODE>PdfObject</CODE> as an array of <CODE>byte</CODE>.
+ */
+
+ protected PdfObject(int type, byte[] bytes) {
+ this.bytes = bytes;
+ this.type = type;
+ }
+
+ // methods dealing with the content of this object
+
+/**
+ * Writes the PDF representation of this <CODE>PdfObject</CODE> as an array of <CODE>byte</CODE>s to the writer.
+ * @param writer for backwards compatibility
+ * @param os the outputstream to write the bytes to.
+ * @throws IOException
+ */
+
+ public void toPdf(PdfWriter writer, OutputStream os) throws IOException {
+ if (bytes != null)
+ os.write(bytes);
+ }
+
+ /**
+ * Gets the presentation of this object in a byte array
+ * @return a byte array
+ */
+ public byte[] getBytes() {
+ return bytes;
+ }
+
+ /**
+ * Can this object be in an object stream?
+ * @return true if this object can be in an object stream.
+ */
+ public boolean canBeInObjStm() {
+ return (type >= 1 && type <= 6) || type == 8;
+ }
+
+/**
+ * Returns the length of the PDF representation of the <CODE>PdfObject</CODE>.
+ * <P>
+ * In some cases, namely for <CODE>PdfString</CODE> and <CODE>PdfStream</CODE>,
+ * this method differs from the method <CODE>length</CODE> because <CODE>length</CODE>
+ * returns the length of the actual content of the <CODE>PdfObject</CODE>.</P>
+ * <P>
+ * Remark: the actual content of an object is in most cases identical to its representation.
+ * The following statement is always true: length() &gt;= pdfLength().</P>
+ *
+ * @return a length
+ */
+
+// public int pdfLength() {
+// return toPdf(null).length;
+// }
+
+/**
+ * Returns the <CODE>String</CODE>-representation of this <CODE>PdfObject</CODE>.
+ *
+ * @return a <CODE>String</CODE>
+ */
+
+ public String toString() {
+ if (bytes == null)
+ return super.toString();
+ else
+ return PdfEncodings.convertToString(bytes, null);
+ }
+
+/**
+ * Returns the length of the actual content of the <CODE>PdfObject</CODE>.
+ * <P>
+ * In some cases, namely for <CODE>PdfString</CODE> and <CODE>PdfStream</CODE>,
+ * this method differs from the method <CODE>pdfLength</CODE> because <CODE>pdfLength</CODE>
+ * returns the length of the PDF representation of the object, not of the actual content
+ * as does the method <CODE>length</CODE>.</P>
+ * <P>
+ * Remark: the actual content of an object is in some cases identical to its representation.
+ * The following statement is always true: length() &gt;= pdfLength().</P>
+ *
+ * @return a length
+ */
+
+ public int length() {
+ return toString().length();
+ }
+
+/**
+ * Changes the content of this <CODE>PdfObject</CODE>.
+ *
+ * @param content the new content of this <CODE>PdfObject</CODE>
+ */
+
+ protected void setContent(String content) {
+ bytes = PdfEncodings.convertToBytes(content, null);
+ }
+
+ // methods dealing with the type of this object
+
+/**
+ * Returns the type of this <CODE>PdfObject</CODE>.
+ *
+ * @return a type
+ */
+
+ public int type() {
+ return type;
+ }
+
+/**
+ * Checks if this <CODE>PdfObject</CODE> is of the type <CODE>PdfNull</CODE>.
+ *
+ * @return <CODE>true</CODE> or <CODE>false</CODE>
+ */
+
+ public boolean isNull() {
+ return (this.type == NULL);
+ }
+
+/**
+ * Checks if this <CODE>PdfObject</CODE> is of the type <CODE>PdfBoolean</CODE>.
+ *
+ * @return <CODE>true</CODE> or <CODE>false</CODE>
+ */
+
+ public boolean isBoolean() {
+ return (this.type == BOOLEAN);
+ }
+
+/**
+ * Checks if this <CODE>PdfObject</CODE> is of the type <CODE>PdfNumber</CODE>.
+ *
+ * @return <CODE>true</CODE> or <CODE>false</CODE>
+ */
+
+ public boolean isNumber() {
+ return (this.type == NUMBER);
+ }
+
+/**
+ * Checks if this <CODE>PdfObject</CODE> is of the type <CODE>PdfString</CODE>.
+ *
+ * @return <CODE>true</CODE> or <CODE>false</CODE>
+ */
+
+ public boolean isString() {
+ return (this.type == STRING);
+ }
+
+/**
+ * Checks if this <CODE>PdfObject</CODE> is of the type <CODE>PdfName</CODE>.
+ *
+ * @return <CODE>true</CODE> or <CODE>false</CODE>
+ */
+
+ public boolean isName() {
+ return (this.type == NAME);
+ }
+
+/**
+ * Checks if this <CODE>PdfObject</CODE> is of the type <CODE>PdfArray</CODE>.
+ *
+ * @return <CODE>true</CODE> or <CODE>false</CODE>
+ */
+
+ public boolean isArray() {
+ return (this.type == ARRAY);
+ }
+
+/**
+ * Checks if this <CODE>PdfObject</CODE> is of the type <CODE>PdfDictionary</CODE>.
+ *
+ * @return <CODE>true</CODE> or <CODE>false</CODE>
+ */
+
+ public boolean isDictionary() {
+ return (this.type == DICTIONARY);
+ }
+
+/**
+ * Checks if this <CODE>PdfObject</CODE> is of the type <CODE>PdfStream</CODE>.
+ *
+ * @return <CODE>true</CODE> or <CODE>false</CODE>
+ */
+
+ public boolean isStream() {
+ return (this.type == STREAM);
+ }
+
+ /**
+ * Checks if this is an indirect object.
+ * @return true if this is an indirect object
+ */
+ public boolean isIndirect() {
+ return (this.type == INDIRECT);
+ }
+
+ /**
+ * Getter for property indRef.
+ * @return Value of property indRef.
+ */
+ public PRIndirectReference getIndRef() {
+ return this.indRef;
+ }
+
+ /**
+ * Setter for property indRef.
+ * @param indRef New value of property indRef.
+ */
+ public void setIndRef(PRIndirectReference indRef) {
+ this.indRef = indRef;
+ }
+}
diff --git a/src/main/java/com/lowagie/text/pdf/PdfOutline.java b/src/main/java/com/lowagie/text/pdf/PdfOutline.java
new file mode 100644
index 0000000..687006c
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/PdfOutline.java
@@ -0,0 +1,542 @@
+/*
+ * $Id: PdfOutline.java,v 1.52 2005/11/29 17:31:34 psoares33 Exp $
+ * $Name: $
+ *
+ * Copyright 1999, 2000, 2001, 2002 Bruno Lowagie
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf;
+
+import java.util.Iterator;
+
+import com.lowagie.text.Chunk;
+import com.lowagie.text.Paragraph;
+import java.util.ArrayList;
+import java.awt.Color;
+import com.lowagie.text.Font;
+import java.io.OutputStream;
+import java.io.IOException;
+
+/**
+ * <CODE>PdfOutline</CODE> is an object that represents a PDF outline entry.
+ * <P>
+ * An outline allows a user to access views of a document by name.<BR>
+ * This object is described in the 'Portable Document Format Reference Manual version 1.3'
+ * section 6.7 (page 104-106)
+ *
+ * @see PdfDictionary
+ */
+
+public class PdfOutline extends PdfDictionary {
+
+ // membervariables
+
+ /** the <CODE>PdfIndirectReference</CODE> of this object */
+ private PdfIndirectReference reference;
+
+ /** value of the <B>Count</B>-key */
+ private int count = 0;
+
+ /** value of the <B>Parent</B>-key */
+ private PdfOutline parent;
+
+ /** value of the <B>Destination</B>-key */
+ private PdfDestination destination;
+
+ /** The <CODE>PdfAction</CODE> for this outline.
+ */
+ private PdfAction action;
+
+ protected ArrayList kids = new ArrayList();
+
+ protected PdfWriter writer;
+
+ /** Holds value of property tag. */
+ private String tag;
+
+ /** Holds value of property open. */
+ private boolean open;
+
+ /** Holds value of property color. */
+ private Color color;
+
+ /** Holds value of property style. */
+ private int style = 0;
+
+ // constructors
+
+ /**
+ * Constructs a <CODE>PdfOutline</CODE>.
+ * <P>
+ * This is the constructor for the <CODE>outlines object</CODE>.
+ *
+ * @param writer The PdfWriter you are adding the outline to
+ */
+
+ PdfOutline(PdfWriter writer) {
+ super(OUTLINES);
+ open = true;
+ parent = null;
+ this.writer = writer;
+ }
+
+ /**
+ * Constructs a <CODE>PdfOutline</CODE>.
+ * <P>
+ * This is the constructor for an <CODE>outline entry</CODE>. The open mode is
+ * <CODE>true</CODE>.
+ *
+ * @param parent the parent of this outline item
+ * @param action the <CODE>PdfAction</CODE> for this outline item
+ * @param title the title of this outline item
+ */
+
+ public PdfOutline(PdfOutline parent, PdfAction action, String title) {
+ this(parent, action, title, true);
+ }
+
+ /**
+ * Constructs a <CODE>PdfOutline</CODE>.
+ * <P>
+ * This is the constructor for an <CODE>outline entry</CODE>.
+ *
+ * @param parent the parent of this outline item
+ * @param action the <CODE>PdfAction</CODE> for this outline item
+ * @param title the title of this outline item
+ * @param open <CODE>true</CODE> if the children are visible
+ */
+ public PdfOutline(PdfOutline parent, PdfAction action, String title, boolean open) {
+ super();
+ this.action = action;
+ initOutline(parent, title, open);
+ }
+
+ /**
+ * Constructs a <CODE>PdfOutline</CODE>.
+ * <P>
+ * This is the constructor for an <CODE>outline entry</CODE>. The open mode is
+ * <CODE>true</CODE>.
+ *
+ * @param parent the parent of this outline item
+ * @param destination the destination for this outline item
+ * @param title the title of this outline item
+ */
+
+ public PdfOutline(PdfOutline parent, PdfDestination destination, String title) {
+ this(parent, destination, title, true);
+ }
+
+ /**
+ * Constructs a <CODE>PdfOutline</CODE>.
+ * <P>
+ * This is the constructor for an <CODE>outline entry</CODE>.
+ *
+ * @param parent the parent of this outline item
+ * @param destination the destination for this outline item
+ * @param title the title of this outline item
+ * @param open <CODE>true</CODE> if the children are visible
+ */
+ public PdfOutline(PdfOutline parent, PdfDestination destination, String title, boolean open) {
+ super();
+ this.destination = destination;
+ initOutline(parent, title, open);
+ }
+
+ /**
+ * Constructs a <CODE>PdfOutline</CODE>.
+ * <P>
+ * This is the constructor for an <CODE>outline entry</CODE>. The open mode is
+ * <CODE>true</CODE>.
+ *
+ * @param parent the parent of this outline item
+ * @param action the <CODE>PdfAction</CODE> for this outline item
+ * @param title the title of this outline item
+ */
+ public PdfOutline(PdfOutline parent, PdfAction action, PdfString title) {
+ this(parent, action, title, true);
+ }
+
+ /**
+ * Constructs a <CODE>PdfOutline</CODE>.
+ * <P>
+ * This is the constructor for an <CODE>outline entry</CODE>.
+ *
+ * @param parent the parent of this outline item
+ * @param action the <CODE>PdfAction</CODE> for this outline item
+ * @param title the title of this outline item
+ * @param open <CODE>true</CODE> if the children are visible
+ */
+ public PdfOutline(PdfOutline parent, PdfAction action, PdfString title, boolean open) {
+ this(parent, action, title.toString(), open);
+ }
+
+ /**
+ * Constructs a <CODE>PdfOutline</CODE>.
+ * <P>
+ * This is the constructor for an <CODE>outline entry</CODE>. The open mode is
+ * <CODE>true</CODE>.
+ *
+ * @param parent the parent of this outline item
+ * @param destination the destination for this outline item
+ * @param title the title of this outline item
+ */
+
+ public PdfOutline(PdfOutline parent, PdfDestination destination, PdfString title) {
+ this(parent, destination, title, true);
+ }
+
+ /**
+ * Constructs a <CODE>PdfOutline</CODE>.
+ * <P>
+ * This is the constructor for an <CODE>outline entry</CODE>.
+ *
+ * @param parent the parent of this outline item
+ * @param destination the destination for this outline item
+ * @param title the title of this outline item
+ * @param open <CODE>true</CODE> if the children are visible
+ */
+ public PdfOutline(PdfOutline parent, PdfDestination destination, PdfString title, boolean open) {
+ this(parent, destination, title.toString(), true);
+ }
+
+ /**
+ * Constructs a <CODE>PdfOutline</CODE>.
+ * <P>
+ * This is the constructor for an <CODE>outline entry</CODE>. The open mode is
+ * <CODE>true</CODE>.
+ *
+ * @param parent the parent of this outline item
+ * @param action the <CODE>PdfAction</CODE> for this outline item
+ * @param title the title of this outline item
+ */
+
+ public PdfOutline(PdfOutline parent, PdfAction action, Paragraph title) {
+ this(parent, action, title, true);
+ }
+
+ /**
+ * Constructs a <CODE>PdfOutline</CODE>.
+ * <P>
+ * This is the constructor for an <CODE>outline entry</CODE>.
+ *
+ * @param parent the parent of this outline item
+ * @param action the <CODE>PdfAction</CODE> for this outline item
+ * @param title the title of this outline item
+ * @param open <CODE>true</CODE> if the children are visible
+ */
+ public PdfOutline(PdfOutline parent, PdfAction action, Paragraph title, boolean open) {
+ super();
+ StringBuffer buf = new StringBuffer();
+ for (Iterator i = title.getChunks().iterator(); i.hasNext(); ) {
+ Chunk chunk = (Chunk) i.next();
+ buf.append(chunk.content());
+ }
+ this.action = action;
+ initOutline(parent, buf.toString(), open);
+ }
+
+ /**
+ * Constructs a <CODE>PdfOutline</CODE>.
+ * <P>
+ * This is the constructor for an <CODE>outline entry</CODE>. The open mode is
+ * <CODE>true</CODE>.
+ *
+ * @param parent the parent of this outline item
+ * @param destination the destination for this outline item
+ * @param title the title of this outline item
+ */
+
+ public PdfOutline(PdfOutline parent, PdfDestination destination, Paragraph title) {
+ this(parent, destination, title, true);
+ }
+
+ /**
+ * Constructs a <CODE>PdfOutline</CODE>.
+ * <P>
+ * This is the constructor for an <CODE>outline entry</CODE>.
+ *
+ * @param parent the parent of this outline item
+ * @param destination the destination for this outline item
+ * @param title the title of this outline item
+ * @param open <CODE>true</CODE> if the children are visible
+ */
+ public PdfOutline(PdfOutline parent, PdfDestination destination, Paragraph title, boolean open) {
+ super();
+ StringBuffer buf = new StringBuffer();
+ for (Iterator i = title.getChunks().iterator(); i.hasNext(); ) {
+ Chunk chunk = (Chunk) i.next();
+ buf.append(chunk.content());
+ }
+ this.destination = destination;
+ initOutline(parent, buf.toString(), open);
+ }
+
+
+ // methods
+
+ /** Helper for the constructors.
+ * @param parent the parent outline
+ * @param title the title for this outline
+ * @param open <CODE>true</CODE> if the children are visible
+ */
+ void initOutline(PdfOutline parent, String title, boolean open) {
+ this.open = open;
+ this.parent = parent;
+ writer = parent.writer;
+ put(PdfName.TITLE, new PdfString(title, PdfObject.TEXT_UNICODE));
+ parent.addKid(this);
+ if (destination != null && !destination.hasPage()) // bugfix Finn Bock
+ setDestinationPage(writer.getCurrentPage());
+ }
+
+ /**
+ * Sets the indirect reference of this <CODE>PdfOutline</CODE>.
+ *
+ * @param reference the <CODE>PdfIndirectReference</CODE> to this outline.
+ */
+
+ public void setIndirectReference(PdfIndirectReference reference) {
+ this.reference = reference;
+ }
+
+ /**
+ * Gets the indirect reference of this <CODE>PdfOutline</CODE>.
+ *
+ * @return the <CODE>PdfIndirectReference</CODE> to this outline.
+ */
+
+ public PdfIndirectReference indirectReference() {
+ return reference;
+ }
+
+ /**
+ * Gets the parent of this <CODE>PdfOutline</CODE>.
+ *
+ * @return the <CODE>PdfOutline</CODE> that is the parent of this outline.
+ */
+
+ public PdfOutline parent() {
+ return parent;
+ }
+
+ /**
+ * Set the page of the <CODE>PdfDestination</CODE>-object.
+ *
+ * @param pageReference indirect reference to the page
+ * @return <CODE>true</CODE> if this page was set as the <CODE>PdfDestination</CODE>-page.
+ */
+
+ public boolean setDestinationPage(PdfIndirectReference pageReference) {
+ if (destination == null) {
+ return false;
+ }
+ return destination.addPage(pageReference);
+ }
+
+ /**
+ * Gets the destination for this outline.
+ * @return the destination
+ */
+ public PdfDestination getPdfDestination() {
+ return destination;
+ }
+
+ int getCount() {
+ return count;
+ }
+
+ void setCount(int count) {
+ this.count = count;
+ }
+
+ /**
+ * returns the level of this outline.
+ *
+ * @return a level
+ */
+
+ public int level() {
+ if (parent == null) {
+ return 0;
+ }
+ return (parent.level() + 1);
+ }
+
+ /**
+ * Returns the PDF representation of this <CODE>PdfOutline</CODE>.
+ *
+ * @param writer the encryption information
+ * @param os
+ * @throws IOException
+ */
+
+ public void toPdf(PdfWriter writer, OutputStream os) throws IOException {
+ if (color != null && !color.equals(Color.black)) {
+ put(PdfName.C, new PdfArray(new float[]{color.getRed()/255f,color.getGreen()/255f,color.getBlue()/255f}));
+ }
+ int flag = 0;
+ if ((style & Font.BOLD) != 0)
+ flag |= 2;
+ if ((style & Font.ITALIC) != 0)
+ flag |= 1;
+ if (flag != 0)
+ put(PdfName.F, new PdfNumber(flag));
+ if (parent != null) {
+ put(PdfName.PARENT, parent.indirectReference());
+ }
+ if (destination != null && destination.hasPage()) {
+ put(PdfName.DEST, destination);
+ }
+ if (action != null)
+ put(PdfName.A, action);
+ if (count != 0) {
+ put(PdfName.COUNT, new PdfNumber(count));
+ }
+ super.toPdf(writer, os);
+ }
+
+ /**
+ * Adds a kid to the outline
+ * @param outline
+ */
+ public void addKid(PdfOutline outline) {
+ kids.add(outline);
+ }
+
+ /**
+ * Returns the kids of this outline
+ * @return an ArrayList with PdfOutlines
+ */
+ public ArrayList getKids() {
+ return kids;
+ }
+
+ /**
+ * Sets the kids of this outline
+ * @param kids
+ */
+ public void setKids(ArrayList kids) {
+ this.kids = kids;
+ }
+
+ /** Getter for property tag.
+ * @return Value of property tag.
+ */
+ public String getTag() {
+ return tag;
+ }
+
+ /** Setter for property tag.
+ * @param tag New value of property tag.
+ */
+ public void setTag(String tag) {
+ this.tag = tag;
+ }
+
+ /**
+ * Gets the title of this outline
+ * @return the title as a String
+ */
+ public String getTitle() {
+ PdfString title = (PdfString)get(PdfName.TITLE);
+ return title.toString();
+ }
+
+ /**
+ * Sets the title of this outline
+ * @param title
+ */
+ public void setTitle(String title) {
+ put(PdfName.TITLE, new PdfString(title, PdfObject.TEXT_UNICODE));
+ }
+
+ /** Getter for property open.
+ * @return Value of property open.
+ */
+ public boolean isOpen() {
+ return open;
+ }
+
+ /** Setter for property open.
+ * @param open New value of property open.
+ */
+ public void setOpen(boolean open) {
+ this.open = open;
+ }
+
+ /** Getter for property color.
+ * @return Value of property color.
+ *
+ */
+ public Color getColor() {
+ return this.color;
+ }
+
+ /** Setter for property color.
+ * @param color New value of property color.
+ *
+ */
+ public void setColor(Color color) {
+ this.color = color;
+ }
+
+ /** Getter for property style.
+ * @return Value of property style.
+ *
+ */
+ public int getStyle() {
+ return this.style;
+ }
+
+ /** Setter for property style.
+ * @param style New value of property style.
+ *
+ */
+ public void setStyle(int style) {
+ this.style = style;
+ }
+
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/pdf/PdfPCell.java b/src/main/java/com/lowagie/text/pdf/PdfPCell.java
new file mode 100644
index 0000000..79d1f83
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/PdfPCell.java
@@ -0,0 +1,735 @@
+/*
+ * $Id: PdfPCell.java,v 1.59 2006/02/16 16:17:49 psoares33 Exp $
+ * $Name: $
+ *
+ * Copyright 2001, 2002 Paulo Soares
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf;
+
+import com.lowagie.text.Element;
+import com.lowagie.text.Phrase;
+import com.lowagie.text.Rectangle;
+import com.lowagie.text.Image;
+import com.lowagie.text.Chunk;
+import com.lowagie.text.pdf.events.PdfPCellEventForwarder;
+
+/** A cell in a PdfPTable.
+ */
+
+public class PdfPCell extends Rectangle{
+
+ private ColumnText column = new ColumnText(null);
+
+ /** Holds value of property verticalAlignment. */
+ private int verticalAlignment = Element.ALIGN_TOP;
+
+ /** Holds value of property paddingLeft. */
+ private float paddingLeft = 2;
+
+ /** Holds value of property paddingLeft. */
+ private float paddingRight = 2;
+
+ /** Holds value of property paddingTop. */
+ private float paddingTop = 2;
+
+ /** Holds value of property paddingBottom. */
+ private float paddingBottom = 2;
+
+ /** Holds value of property fixedHeight. */
+ private float fixedHeight = 0;
+
+ /** Holds value of property noWrap. */
+ private boolean noWrap = false;
+
+ /** Holds value of property table. */
+ private PdfPTable table;
+
+ /** Holds value of property minimumHeight. */
+ private float minimumHeight;
+
+ /** Holds value of property colspan. */
+ private int colspan = 1;
+
+ /** Holds value of property image. */
+ private Image image;
+
+ /** Holds value of property cellEvent. */
+ private PdfPCellEvent cellEvent;
+
+ /** Holds value of property useDescender. */
+ private boolean useDescender;
+
+ /** Increases padding to include border if true */
+ private boolean useBorderPadding = false;
+
+
+ /** The text in the cell. */
+ protected Phrase phrase;
+
+ /** Constructs an empty <CODE>PdfPCell</CODE>.
+ * The default padding is 2.
+ */
+ public PdfPCell() {
+ super(0, 0, 0, 0);
+ borderWidth = 0.5f;
+ border = BOX;
+ column.setLeading(0, 1);
+ }
+
+ /** Constructs a <CODE>PdfPCell</CODE> with a <CODE>Phrase</CODE>.
+ * The default padding is 2.
+ * @param phrase the text
+ */
+ public PdfPCell(Phrase phrase) {
+ super(0, 0, 0, 0);
+ borderWidth = 0.5f;
+ border = BOX;
+ column.addText(this.phrase = phrase);
+ column.setLeading(0, 1);
+ }
+
+ /** Constructs a <CODE>PdfPCell</CODE> with an <CODE>Image</CODE>.
+ * The default padding is 0.
+ * @param image the <CODE>Image</CODE>
+ */
+ public PdfPCell(Image image) {
+ super(0, 0, 0, 0);
+ borderWidth = 0.5f;
+ border = BOX;
+ column.addText(this.phrase = new Phrase(new Chunk(image, 0, 0)));
+ column.setLeading(0, 1);
+ setPadding(0);
+ }
+
+ /** Constructs a <CODE>PdfPCell</CODE> with an <CODE>Image</CODE>.
+ * The default padding is 0.25 for a border width of 0.5.
+ * @param image the <CODE>Image</CODE>
+ * @param fit <CODE>true</CODE> to fit the image to the cell
+ */
+ public PdfPCell(Image image, boolean fit) {
+ super(0, 0, 0, 0);
+ if (fit) {
+ borderWidth = 0.5f;
+ border = BOX;
+ this.image = image;
+ column.setLeading(0, 1);
+ setPadding(borderWidth / 2);
+ }
+ else {
+ borderWidth = 0.5f;
+ border = BOX;
+ column.addText(this.phrase = new Phrase(new Chunk(image, 0, 0)));
+ column.setLeading(0, 1);
+ setPadding(0);
+ }
+ }
+
+ /** Constructs a <CODE>PdfPCell</CODE> with a <CODE>PdfPtable</CODE>.
+ * This constructor allows nested tables.
+ * The default padding is 0.
+ * @param table The <CODE>PdfPTable</CODE>
+ */
+ public PdfPCell(PdfPTable table) {
+ super(0, 0, 0, 0);
+ borderWidth = 0.5f;
+ border = BOX;
+ column.setLeading(0, 1);
+ setPadding(0);
+ this.table = table;
+ table.setWidthPercentage(100);
+ table.setExtendLastRow(true);
+ column.addElement(table);
+ }
+
+ /** Constructs a deep copy of a <CODE>PdfPCell</CODE>.
+ * @param cell the <CODE>PdfPCell</CODE> to duplicate
+ */
+ public PdfPCell(PdfPCell cell) {
+ super(cell.llx, cell.lly, cell.urx, cell.ury);
+ cloneNonPositionParameters(cell);
+ verticalAlignment = cell.verticalAlignment;
+ paddingLeft = cell.paddingLeft;
+ paddingRight = cell.paddingRight;
+ paddingTop = cell.paddingTop;
+ paddingBottom = cell.paddingBottom;
+ phrase = cell.phrase;
+ fixedHeight = cell.fixedHeight;
+ minimumHeight = cell.minimumHeight;
+ noWrap = cell.noWrap;
+ colspan = cell.colspan;
+ if (cell.table != null)
+ table = new PdfPTable(cell.table);
+ image = Image.getInstance(cell.image);
+ cellEvent = cell.cellEvent;
+ useDescender = cell.useDescender;
+ column = ColumnText.duplicate(cell.column);
+ useBorderPadding = cell.useBorderPadding;
+ rotation = cell.rotation;
+ }
+
+ /**
+ * Adds an iText element to the cell.
+ * @param element
+ */
+ public void addElement(Element element) {
+ if (table != null) {
+ table = null;
+ column.setText(null);
+ }
+ column.addElement(element);
+ }
+
+ /** Gets the <CODE>Phrase</CODE> from this cell.
+ * @return the <CODE>Phrase</CODE>
+ */
+ public Phrase getPhrase() {
+ return phrase;
+ }
+
+ /** Sets the <CODE>Phrase</CODE> for this cell.
+ * @param phrase the <CODE>Phrase</CODE>
+ */
+ public void setPhrase(Phrase phrase) {
+ table = null;
+ image = null;
+ column.setText(this.phrase = phrase);
+ }
+
+ /** Gets the horizontal alignment for the cell.
+ * @return the horizontal alignment for the cell
+ */
+ public int getHorizontalAlignment() {
+ return column.getAlignment();
+ }
+
+ /** Sets the horizontal alignment for the cell. It could be
+ * <CODE>Element.ALIGN_CENTER</CODE> for example.
+ * @param horizontalAlignment The horizontal alignment
+ */
+ public void setHorizontalAlignment(int horizontalAlignment) {
+ column.setAlignment(horizontalAlignment);
+ }
+
+ /** Gets the vertical alignment for the cell.
+ * @return the vertical alignment for the cell
+ */
+ public int getVerticalAlignment() {
+ return verticalAlignment;
+ }
+
+ /** Sets the vertical alignment for the cell. It could be
+ * <CODE>Element.ALIGN_MIDDLE</CODE> for example.
+ * @param verticalAlignment The vertical alignment
+ */
+ public void setVerticalAlignment(int verticalAlignment) {
+ if (table != null)
+ table.setExtendLastRow(verticalAlignment == Element.ALIGN_TOP);
+ this.verticalAlignment = verticalAlignment;
+ }
+
+ /** Gets the effective left padding. This will include
+ * the left border width if {@link #isUseBorderPadding()} is true.
+ * @return effective value of property paddingLeft.
+ */
+ public float getEffectivePaddingLeft() {
+ return paddingLeft + (isUseBorderPadding() ? (getBorderWidthLeft()/(isUseVariableBorders()?1f:2f)) : 0);
+ }
+
+ /**
+ * @return Value of property paddingLeft.
+ */
+ public float getPaddingLeft() {
+ return paddingLeft;
+ }
+
+ /**
+ * Setter for property paddingLeft.
+ * @param paddingLeft New value of property paddingLeft.
+ */
+ public void setPaddingLeft(float paddingLeft) {
+ this.paddingLeft = paddingLeft;
+ }
+
+ /** Gets the effective right padding. This will include
+ * the right border width if {@link #isUseBorderPadding()} is true.
+ * @return effective value of property paddingRight.
+ */
+ public float getEffectivePaddingRight() {
+ return paddingRight + (isUseBorderPadding() ? (getBorderWidthRight()/(isUseVariableBorders()?1f:2f)) : 0);
+ }
+
+ /**
+ * Getter for property paddingRight.
+ * @return Value of property paddingRight.
+ */
+ public float getPaddingRight() {
+ return paddingRight;
+ }
+
+ /**
+ * Setter for property paddingRight.
+ * @param paddingRight New value of property paddingRight.
+ */
+ public void setPaddingRight(float paddingRight) {
+ this.paddingRight = paddingRight;
+ }
+
+ /** Gets the effective top padding. This will include
+ * the top border width if {@link #isUseBorderPadding()} is true.
+ * @return effective value of property paddingTop.
+ */
+ public float getEffectivePaddingTop() {
+ return paddingTop + (isUseBorderPadding() ? (getBorderWidthTop()/(isUseVariableBorders()?1f:2f)) : 0);
+ }
+
+ /**
+ * Getter for property paddingTop.
+ * @return Value of property paddingTop.
+ */
+ public float getPaddingTop() {
+ return paddingTop;
+ }
+
+ /**
+ * Setter for property paddingTop.
+ * @param paddingTop New value of property paddingTop.
+ */
+ public void setPaddingTop(float paddingTop) {
+ this.paddingTop = paddingTop;
+ }
+
+ /** Gets the effective bottom padding. This will include
+ * the bottom border width if {@link #isUseBorderPadding()} is true.
+ * @return effective value of property paddingBottom.
+ */
+ public float getEffectivePaddingBottom() {
+ return paddingBottom + (isUseBorderPadding() ? (getBorderWidthBottom()/(isUseVariableBorders()?1f:2f)) : 0);
+ }
+
+ /**
+ * Getter for property paddingBottom.
+ * @return Value of property paddingBottom.
+ */
+ public float getPaddingBottom() {
+ return paddingBottom;
+ }
+
+ /**
+ * Setter for property paddingBottom.
+ * @param paddingBottom New value of property paddingBottom.
+ */
+ public void setPaddingBottom(float paddingBottom) {
+ this.paddingBottom = paddingBottom;
+ }
+
+ /**
+ * Sets the padding of the contents in the cell (space between content and border).
+ * @param padding
+ */
+ public void setPadding(float padding) {
+ paddingBottom = padding;
+ paddingTop = padding;
+ paddingLeft = padding;
+ paddingRight = padding;
+ }
+
+ /**
+ * If true, then effective padding will include border widths
+ * @return true if effective padding includes border widths
+ */
+ public boolean isUseBorderPadding() {
+ return useBorderPadding;
+ }
+
+ /**
+ * Adjusts effective padding to include border widths.
+ * @param use adjust effective padding if true
+ */
+ public void setUseBorderPadding(boolean use) {
+ useBorderPadding = use;
+ }
+
+ /**
+ * Sets the leading fixed and variable. The resultant leading will be
+ * fixedLeading+multipliedLeading*maxFontSize where maxFontSize is the
+ * size of the bigest font in the line.
+ * @param fixedLeading the fixed leading
+ * @param multipliedLeading the variable leading
+ */
+ public void setLeading(float fixedLeading, float multipliedLeading) {
+ column.setLeading(fixedLeading, multipliedLeading);
+ }
+
+ /**
+ * Gets the fixed leading
+ * @return the leading
+ */
+ public float getLeading() {
+ return column.getLeading();
+ }
+
+ /**
+ * Gets the variable leading
+ * @return the leading
+ */
+ public float getMultipliedLeading() {
+ return column.getMultipliedLeading();
+ }
+
+ /**
+ * Sets the first paragraph line indent.
+ * @param indent the indent
+ */
+ public void setIndent(float indent) {
+ column.setIndent(indent);
+ }
+
+ /**
+ * Gets the first paragraph line indent.
+ * @return the indent
+ */
+ public float getIndent() {
+ return column.getIndent();
+ }
+
+ /**
+ * Gets the extra space between paragraphs.
+ * @return the extra space between paragraphs
+ */
+ public float getExtraParagraphSpace() {
+ return column.getExtraParagraphSpace();
+ }
+
+ /**
+ * Sets the extra space between paragraphs.
+ * @param extraParagraphSpace the extra space between paragraphs
+ */
+ public void setExtraParagraphSpace(float extraParagraphSpace) {
+ column.setExtraParagraphSpace(extraParagraphSpace);
+ }
+
+ /**
+ * Getter for property fixedHeight.
+ * @return Value of property fixedHeight.
+ */
+ public float getFixedHeight() {
+ return fixedHeight;
+ }
+
+ /**
+ * Setter for property fixedHeight.
+ * @param fixedHeight New value of property fixedHeight.
+ */
+ public void setFixedHeight(float fixedHeight) {
+ this.fixedHeight = fixedHeight;
+ minimumHeight = 0;
+ }
+
+ /**
+ * Getter for property noWrap.
+ * @return Value of property noWrap.
+ */
+ public boolean isNoWrap() {
+ return noWrap;
+ }
+
+ /**
+ * Setter for property noWrap.
+ * @param noWrap New value of property noWrap.
+ */
+ public void setNoWrap(boolean noWrap) {
+ this.noWrap = noWrap;
+ }
+
+ /**
+ * Getter for property table.
+ * @return Value of property table.
+ */
+ PdfPTable getTable() {
+ return table;
+ }
+
+ void setTable(PdfPTable table) {
+ this.table = table;
+ column.setText(null);
+ image = null;
+ if (table != null) {
+ table.setExtendLastRow(verticalAlignment == Element.ALIGN_TOP);
+ column.addElement(table);
+ table.setWidthPercentage(100);
+ }
+ }
+
+ /** Getter for property minimumHeight.
+ * @return Value of property minimumHeight.
+ */
+ public float getMinimumHeight() {
+ return minimumHeight;
+ }
+
+ /** Setter for property minimumHeight.
+ * @param minimumHeight New value of property minimumHeight.
+ */
+ public void setMinimumHeight(float minimumHeight) {
+ this.minimumHeight = minimumHeight;
+ fixedHeight = 0;
+ }
+
+ /** Getter for property colspan.
+ * @return Value of property colspan.
+ */
+ public int getColspan() {
+ return colspan;
+ }
+
+ /** Setter for property colspan.
+ * @param colspan New value of property colspan.
+ */
+ public void setColspan(int colspan) {
+ this.colspan = colspan;
+ }
+
+ /**
+ * Sets the following paragraph lines indent.
+ * @param indent the indent
+ */
+ public void setFollowingIndent(float indent) {
+ column.setFollowingIndent(indent);
+ }
+
+ /**
+ * Gets the following paragraph lines indent.
+ * @return the indent
+ */
+ public float getFollowingIndent() {
+ return column.getFollowingIndent();
+ }
+
+ /**
+ * Sets the right paragraph lines indent.
+ * @param indent the indent
+ */
+ public void setRightIndent(float indent) {
+ column.setRightIndent(indent);
+ }
+
+ /**
+ * Gets the right paragraph lines indent.
+ * @return the indent
+ */
+ public float getRightIndent() {
+ return column.getRightIndent();
+ }
+
+ /** Gets the space/character extra spacing ratio for
+ * fully justified text.
+ * @return the space/character extra spacing ratio
+ */
+ public float getSpaceCharRatio() {
+ return column.getSpaceCharRatio();
+ }
+
+ /** Sets the ratio between the extra word spacing and the extra character spacing
+ * when the text is fully justified.
+ * Extra word spacing will grow <CODE>spaceCharRatio</CODE> times more than extra character spacing.
+ * If the ratio is <CODE>PdfWriter.NO_SPACE_CHAR_RATIO</CODE> then the extra character spacing
+ * will be zero.
+ * @param spaceCharRatio the ratio between the extra word spacing and the extra character spacing
+ */
+ public void setSpaceCharRatio(float spaceCharRatio) {
+ column.setSpaceCharRatio(spaceCharRatio);
+ }
+
+ /**
+ * Sets the run direction of the text content in the cell (PdfWriter.RUN_DIRECTION_DEFAULT, PdfWriter.RUN_DIRECTION_NO_BIDI, PdfWriter.RUN_DIRECTION_LTR or PdfWriter.RUN_DIRECTION_RTL).
+ * @param runDirection
+ */
+ public void setRunDirection(int runDirection) {
+ column.setRunDirection(runDirection);
+ }
+
+ /**
+ * Gets the run direction of the text content in the cell
+ * @return One of the following values: PdfWriter.RUN_DIRECTION_DEFAULT, PdfWriter.RUN_DIRECTION_NO_BIDI, PdfWriter.RUN_DIRECTION_LTR or PdfWriter.RUN_DIRECTION_RTL.
+ */
+ public int getRunDirection() {
+ return column.getRunDirection();
+ }
+
+ /** Getter for property image.
+ * @return Value of property image.
+ *
+ */
+ public Image getImage() {
+ return this.image;
+ }
+
+ /** Setter for property image.
+ * @param image New value of property image.
+ *
+ */
+ public void setImage(Image image) {
+ column.setText(null);
+ table = null;
+ this.image = image;
+ }
+
+ /** Gets the cell event for this cell.
+ * @return the cell event
+ *
+ */
+ public PdfPCellEvent getCellEvent() {
+ return this.cellEvent;
+ }
+
+ /** Sets the cell event for this cell.
+ * @param event the cell event
+ *
+ */
+ public void setCellEvent(PdfPCellEvent event) {
+ if (event == null) this.cellEvent = null;
+ else if (this.cellEvent == null) this.cellEvent = event;
+ else if (this.cellEvent instanceof PdfPCellEventForwarder) ((PdfPCellEventForwarder)this.cellEvent).addCellEvent(event);
+ else {
+ PdfPCellEventForwarder forward = new PdfPCellEventForwarder();
+ forward.addCellEvent(this.cellEvent);
+ forward.addCellEvent(event);
+ this.cellEvent = forward;
+ }
+ }
+
+ /** Gets the arabic shaping options.
+ * @return the arabic shaping options
+ */
+ public int getArabicOptions() {
+ return column.getArabicOptions();
+ }
+
+ /** Sets the arabic shaping options. The option can be AR_NOVOWEL,
+ * AR_COMPOSEDTASHKEEL and AR_LIG.
+ * @param arabicOptions the arabic shaping options
+ */
+ public void setArabicOptions(int arabicOptions) {
+ column.setArabicOptions(arabicOptions);
+ }
+
+ /** Gets state of first line height based on max ascender
+ * @return true if an ascender is to be used.
+ */
+ public boolean isUseAscender() {
+ return column.isUseAscender();
+ }
+
+ /** Enables/ Disables adjustment of first line height based on max ascender.
+ *
+ * @param use adjust height if true
+ */
+ public void setUseAscender(boolean use) {
+ column.setUseAscender(use);
+ }
+
+
+ /** Getter for property useDescender.
+ * @return Value of property useDescender.
+ *
+ */
+ public boolean isUseDescender() {
+ return this.useDescender;
+ }
+
+ /** Setter for property useDescender.
+ * @param useDescender New value of property useDescender.
+ *
+ */
+ public void setUseDescender(boolean useDescender) {
+ this.useDescender = useDescender;
+ }
+
+ /**
+ * Gets the ColumnText with the content of the cell.
+ * @return a columntext object
+ */
+ public ColumnText getColumn() {
+ return column;
+ }
+
+ /**
+ * Sets the columntext in the cell.
+ * @param column
+ */
+ public void setColumn(ColumnText column) {
+ this.column = column;
+ }
+
+ /**
+ * The rotation of the cell. Possible values are
+ * 0, 90, 180 and 270.
+ */
+ private int rotation;
+
+ /**
+ * Gets the rotation of the cell.
+ * @return the rotation of the cell.
+ */
+ public int getRotation() {
+ return this.rotation;
+ }
+
+ /**
+ * Sets the rotation of the cell. Possible values are
+ * 0, 90, 180 and 270.
+ * @param rotation the rotation of the cell
+ */
+ public void setRotation(int rotation) {
+ rotation %= 360;
+ if (rotation < 0)
+ rotation += 360;
+ if ((rotation % 90) != 0)
+ throw new IllegalArgumentException("Rotation must be a multiple of 90.");
+ this.rotation = rotation;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/pdf/PdfPCellEvent.java b/src/main/java/com/lowagie/text/pdf/PdfPCellEvent.java
new file mode 100644
index 0000000..94b7573
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/PdfPCellEvent.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright 2003 Paulo Soares
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+package com.lowagie.text.pdf;
+
+import com.lowagie.text.Rectangle;
+
+/** An event called for a single cell.
+ * @author Paulo Soares (psoares@consiste.pt)
+ */
+public interface PdfPCellEvent {
+ /** This method is called at the end of the cell rendering. The text or graphics are added to
+ * one of the 4 <CODE>PdfContentByte</CODE> contained in
+ * <CODE>canvases</CODE>.<br>
+ * The indexes to <CODE>canvases</CODE> are:<p>
+ * <ul>
+ * <li><CODE>PdfPTable.BASECANVAS</CODE> - the original <CODE>PdfContentByte</CODE>. Anything placed here
+ * will be under the cell.
+ * <li><CODE>PdfPTable.BACKGROUNDCANVAS</CODE> - the layer where the background goes to.
+ * <li><CODE>PdfPTable.LINECANVAS</CODE> - the layer where the lines go to.
+ * <li><CODE>PdfPTable.TEXTCANVAS</CODE> - the layer where the text go to. Anything placed here
+ * will be over the cell.
+ * </ul>
+ * The layers are placed in sequence on top of each other.
+ * <p>
+ * @param cell the cell
+ * @param position the coordinates of the cell
+ * @param canvases an array of <CODE>PdfContentByte</CODE>
+ */
+ public void cellLayout(PdfPCell cell, Rectangle position, PdfContentByte[] canvases);
+}
diff --git a/src/main/java/com/lowagie/text/pdf/PdfPKCS7.java b/src/main/java/com/lowagie/text/pdf/PdfPKCS7.java
new file mode 100644
index 0000000..d9f3473
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/PdfPKCS7.java
@@ -0,0 +1,1276 @@
+/*
+ * Copyright 2004 by Paulo Soares.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+package com.lowagie.text.pdf;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.FileInputStream;
+import java.math.BigInteger;
+import java.security.InvalidKeyException;
+import java.security.NoSuchAlgorithmException;
+import java.security.NoSuchProviderException;
+import java.security.PrivateKey;
+import java.security.Signature;
+import java.security.MessageDigest;
+import java.security.SignatureException;
+import java.security.cert.CRL;
+import java.security.cert.CRLException;
+import java.security.cert.Certificate;
+import java.security.cert.CertificateException;
+import java.security.cert.CertificateFactory;
+import java.security.cert.X509CRL;
+import java.security.cert.X509Certificate;
+import java.security.KeyStore;
+import java.io.File;
+import java.util.Arrays;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Collection;
+import java.util.Enumeration;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
+import java.util.Calendar;
+import java.util.GregorianCalendar;
+import com.lowagie.text.ExceptionConverter;
+
+import com.lowagie.bc.asn1.ASN1InputStream;
+import com.lowagie.bc.asn1.DERObject;
+import com.lowagie.bc.asn1.ASN1Sequence;
+import com.lowagie.bc.asn1.ASN1Set;
+import com.lowagie.bc.asn1.DERObjectIdentifier;
+import com.lowagie.bc.asn1.DEROctetString;
+import com.lowagie.bc.asn1.DERTaggedObject;
+import com.lowagie.bc.asn1.DERInteger;
+import com.lowagie.bc.asn1.ASN1TaggedObject;
+import com.lowagie.bc.asn1.DERConstructedSet;
+import com.lowagie.bc.asn1.DERSequence;
+import com.lowagie.bc.asn1.DERNull;
+import com.lowagie.bc.asn1.ASN1EncodableVector;
+import com.lowagie.bc.asn1.DERSet;
+import com.lowagie.bc.asn1.DERString;
+import com.lowagie.bc.asn1.DERUTCTime;
+import com.lowagie.bc.asn1.ASN1OutputStream;
+
+/**
+ * This class does all the processing related to signing and verifying a PKCS#7
+ * signature.
+ * <p>
+ * It's based in code found at org.bouncycastle.
+ */
+public class PdfPKCS7 {
+
+ private byte sigAttr[];
+ private byte digestAttr[];
+ private int version, signerversion;
+ private Set digestalgos;
+ private Collection certs, crls;
+ private X509Certificate signCert;
+ private byte[] digest;
+ private MessageDigest messageDigest;
+ private String digestAlgorithm, digestEncryptionAlgorithm;
+ private Signature sig;
+ private transient PrivateKey privKey;
+ private byte RSAdata[];
+ private boolean verified;
+ private boolean verifyResult;
+ private byte externalDigest[];
+ private byte externalRSAdata[];
+
+ private static final String ID_PKCS7_DATA = "1.2.840.113549.1.7.1";
+ private static final String ID_PKCS7_SIGNED_DATA = "1.2.840.113549.1.7.2";
+ private static final String ID_MD5 = "1.2.840.113549.2.5";
+ private static final String ID_MD2 = "1.2.840.113549.2.2";
+ private static final String ID_SHA1 = "1.3.14.3.2.26";
+ private static final String ID_RSA = "1.2.840.113549.1.1.1";
+ private static final String ID_DSA = "1.2.840.10040.4.1";
+ private static final String ID_CONTENT_TYPE = "1.2.840.113549.1.9.3";
+ private static final String ID_MESSAGE_DIGEST = "1.2.840.113549.1.9.4";
+ private static final String ID_SIGNING_TIME = "1.2.840.113549.1.9.5";
+ private static final String ID_MD2RSA = "1.2.840.113549.1.1.2";
+ private static final String ID_MD5RSA = "1.2.840.113549.1.1.4";
+ private static final String ID_SHA1RSA = "1.2.840.113549.1.1.5";
+ /**
+ * Holds value of property reason.
+ */
+ private String reason;
+
+ /**
+ * Holds value of property location.
+ */
+ private String location;
+
+ /**
+ * Holds value of property signDate.
+ */
+ private Calendar signDate;
+
+ /**
+ * Holds value of property signName.
+ */
+ private String signName;
+
+ /**
+ * Verifies a signature using the sub-filter adbe.x509.rsa_sha1.
+ * @param contentsKey the /Contents key
+ * @param certsKey the /Cert key
+ * @param provider the provider or <code>null</code> for the default provider
+ * @throws SecurityException on error
+ * @throws CRLException on error
+ * @throws InvalidKeyException on error
+ * @throws CertificateException on error
+ * @throws NoSuchProviderException on error
+ * @throws NoSuchAlgorithmException on error
+ * @throws IOException on error
+ */
+ public PdfPKCS7(byte[] contentsKey, byte[] certsKey, String provider) throws SecurityException, CRLException, InvalidKeyException, CertificateException, NoSuchProviderException, NoSuchAlgorithmException, IOException {
+ CertificateFactory cf;
+ if (provider == null)
+ cf = CertificateFactory.getInstance("X.509");
+ else
+ cf = CertificateFactory.getInstance("X.509", provider);
+ if (provider == null)
+ certs = cf.generateCertificates(new ByteArrayInputStream(certsKey));
+ signCert = (X509Certificate)certs.iterator().next();
+ crls = new ArrayList();
+ ASN1InputStream in = new ASN1InputStream(new ByteArrayInputStream(contentsKey));
+ digest = ((DEROctetString)in.readObject()).getOctets();
+ if (provider == null)
+ sig = Signature.getInstance("SHA1withRSA");
+ else
+ sig = Signature.getInstance("SHA1withRSA", provider);
+ sig.initVerify(signCert.getPublicKey());
+ }
+
+ /**
+ * Verifies a signature using the sub-filter adbe.pkcs7.detached or
+ * adbe.pkcs7.sha1.
+ * @param contentsKey the /Contents key
+ * @param provider the provider or <code>null</code> for the default provider
+ * @throws SecurityException on error
+ * @throws CRLException on error
+ * @throws InvalidKeyException on error
+ * @throws CertificateException on error
+ * @throws NoSuchProviderException on error
+ * @throws NoSuchAlgorithmException on error
+ */
+ public PdfPKCS7(byte[] contentsKey, String provider) throws SecurityException, CRLException, InvalidKeyException, CertificateException, NoSuchProviderException, NoSuchAlgorithmException {
+ ASN1InputStream din = new ASN1InputStream(new ByteArrayInputStream(contentsKey));
+
+ //
+ // Basic checks to make sure it's a PKCS#7 SignedData Object
+ //
+ DERObject pkcs;
+
+ try {
+ pkcs = din.readObject();
+ }
+ catch (IOException e) {
+ throw new SecurityException("can't decode PKCS7SignedData object");
+ }
+ if (!(pkcs instanceof ASN1Sequence)) {
+ throw new SecurityException("Not a valid PKCS#7 object - not a sequence");
+ }
+ ASN1Sequence signedData = (ASN1Sequence)pkcs;
+ DERObjectIdentifier objId = (DERObjectIdentifier)signedData.getObjectAt(0);
+ if (!objId.getId().equals(ID_PKCS7_SIGNED_DATA))
+ throw new SecurityException("Not a valid PKCS#7 object - not signed data");
+ ASN1Sequence content = (ASN1Sequence)((DERTaggedObject)signedData.getObjectAt(1)).getObject();
+ // the positions that we care are:
+ // 0 - version
+ // 1 - digestAlgorithms
+ // 2 - possible ID_PKCS7_DATA
+ // (the certificates and crls are taken out by other means)
+ // last - signerInfos
+
+ // the version
+ version = ((DERInteger)content.getObjectAt(0)).getValue().intValue();
+
+ // the digestAlgorithms
+ digestalgos = new HashSet();
+ Enumeration e = ((ASN1Set)content.getObjectAt(1)).getObjects();
+ while (e.hasMoreElements())
+ {
+ ASN1Sequence s = (ASN1Sequence)e.nextElement();
+ DERObjectIdentifier o = (DERObjectIdentifier)s.getObjectAt(0);
+ digestalgos.add(o.getId());
+ }
+
+ // the certificates and crls
+ CertificateFactory cf;
+ if (provider == null)
+ cf = CertificateFactory.getInstance("X.509");
+ else
+ cf = CertificateFactory.getInstance("X.509", provider);
+ certs = cf.generateCertificates(new ByteArrayInputStream(contentsKey));
+ crls = cf.generateCRLs(new ByteArrayInputStream(contentsKey));
+
+ // the possible ID_PKCS7_DATA
+ ASN1Sequence rsaData = (ASN1Sequence)content.getObjectAt(2);
+ if (rsaData.size() > 1) {
+ DEROctetString rsaDataContent = (DEROctetString)((DERTaggedObject)rsaData.getObjectAt(1)).getObject();
+ RSAdata = rsaDataContent.getOctets();
+ }
+
+ // the signerInfos
+ int next = 3;
+ while (content.getObjectAt(next) instanceof DERTaggedObject)
+ ++next;
+ ASN1Set signerInfos = (ASN1Set)content.getObjectAt(next);
+ if (signerInfos.size() != 1)
+ throw new SecurityException("This PKCS#7 object has multiple SignerInfos - only one is supported at this time");
+ ASN1Sequence signerInfo = (ASN1Sequence)signerInfos.getObjectAt(0);
+ // the positions that we care are
+ // 0 - version
+ // 1 - the signing certificate serial number
+ // 2 - the digest algorithm
+ // 3 or 4 - digestEncryptionAlgorithm
+ // 4 or 5 - encryptedDigest
+ signerversion = ((DERInteger)signerInfo.getObjectAt(0)).getValue().intValue();
+ // Get the signing certificate
+ ASN1Sequence issuerAndSerialNumber = (ASN1Sequence)signerInfo.getObjectAt(1);
+ BigInteger serialNumber = ((DERInteger)issuerAndSerialNumber.getObjectAt(1)).getValue();
+ for (Iterator i = certs.iterator(); i.hasNext();) {
+ X509Certificate cert = (X509Certificate)i.next();
+ if (serialNumber.equals(cert.getSerialNumber())) {
+ signCert = cert;
+ break;
+ }
+ }
+ if (signCert == null) {
+ throw new SecurityException("Can't find signing certificate with serial " + serialNumber.toString(16));
+ }
+ digestAlgorithm = ((DERObjectIdentifier)((ASN1Sequence)signerInfo.getObjectAt(2)).getObjectAt(0)).getId();
+ next = 3;
+ if (signerInfo.getObjectAt(next) instanceof ASN1TaggedObject) {
+ ASN1TaggedObject tagsig = (ASN1TaggedObject)signerInfo.getObjectAt(next);
+ ASN1Sequence sseq = (ASN1Sequence)tagsig.getObject();
+ ByteArrayOutputStream bOut = new ByteArrayOutputStream();
+ ASN1OutputStream dout = new ASN1OutputStream(bOut);
+ try {
+ ASN1EncodableVector attribute = new ASN1EncodableVector();
+ for (int k = 0; k < sseq.size(); ++k) {
+ attribute.add(sseq.getObjectAt(k));
+ }
+ dout.writeObject(new DERSet(attribute));
+ dout.close();
+ }
+ catch (IOException ioe){}
+ sigAttr = bOut.toByteArray();
+
+ for (int k = 0; k < sseq.size(); ++k) {
+ ASN1Sequence seq2 = (ASN1Sequence)sseq.getObjectAt(k);
+ if (((DERObjectIdentifier)seq2.getObjectAt(0)).getId().equals(ID_MESSAGE_DIGEST)) {
+ ASN1Set set = (ASN1Set)seq2.getObjectAt(1);
+ digestAttr = ((DEROctetString)set.getObjectAt(0)).getOctets();
+ break;
+ }
+ }
+ if (digestAttr == null)
+ throw new SecurityException("Authenticated attribute is missing the digest.");
+ ++next;
+ }
+ digestEncryptionAlgorithm = ((DERObjectIdentifier)((ASN1Sequence)signerInfo.getObjectAt(next++)).getObjectAt(0)).getId();
+ digest = ((DEROctetString)signerInfo.getObjectAt(next)).getOctets();
+ if (RSAdata != null || digestAttr != null) {
+ if (provider == null || provider.startsWith("SunPKCS11"))
+ messageDigest = MessageDigest.getInstance(getHashAlgorithm());
+ else
+ messageDigest = MessageDigest.getInstance(getHashAlgorithm(), provider);
+ }
+ if (provider == null)
+ sig = Signature.getInstance(getDigestAlgorithm());
+ else
+ sig = Signature.getInstance(getDigestAlgorithm(), provider);
+ sig.initVerify(signCert.getPublicKey());
+ }
+
+ /**
+ * Generates a signature.
+ * @param privKey the private key
+ * @param certChain the certificate chain
+ * @param crlList the certificate revocation list
+ * @param hashAlgorithm the hash algorithm
+ * @param provider the provider or <code>null</code> for the default provider
+ * @param hasRSAdata <CODE>true</CODE> if the sub-filter is adbe.pkcs7.sha1
+ * @throws SecurityException on error
+ * @throws InvalidKeyException on error
+ * @throws NoSuchProviderException on error
+ * @throws NoSuchAlgorithmException on error
+ */
+ public PdfPKCS7(PrivateKey privKey, Certificate[] certChain, CRL[] crlList,
+ String hashAlgorithm, String provider, boolean hasRSAdata)
+ throws SecurityException, InvalidKeyException, NoSuchProviderException,
+ NoSuchAlgorithmException
+ {
+ this.privKey = privKey;
+
+ if (hashAlgorithm.equals("MD5")) {
+ digestAlgorithm = ID_MD5;
+ }
+ else if (hashAlgorithm.equals("MD2")) {
+ digestAlgorithm = ID_MD2;
+ }
+ else if (hashAlgorithm.equals("SHA")) {
+ digestAlgorithm = ID_SHA1;
+ }
+ else if (hashAlgorithm.equals("SHA1")) {
+ digestAlgorithm = ID_SHA1;
+ }
+ else {
+ throw new NoSuchAlgorithmException("Unknown Hash Algorithm "+hashAlgorithm);
+ }
+
+ version = signerversion = 1;
+ certs = new ArrayList();
+ crls = new ArrayList();
+ digestalgos = new HashSet();
+ digestalgos.add(digestAlgorithm);
+
+ //
+ // Copy in the certificates and crls used to sign the private key.
+ //
+ signCert = (X509Certificate)certChain[0];
+ for (int i = 0;i < certChain.length;i++) {
+ certs.add(certChain[i]);
+ }
+
+ if (crlList != null) {
+ for (int i = 0;i < crlList.length;i++) {
+ crls.add(crlList[i]);
+ }
+ }
+
+ if (privKey != null) {
+ //
+ // Now we have private key, find out what the digestEncryptionAlgorithm is.
+ //
+ digestEncryptionAlgorithm = privKey.getAlgorithm();
+ if (digestEncryptionAlgorithm.equals("RSA")) {
+ digestEncryptionAlgorithm = ID_RSA;
+ }
+ else if (digestEncryptionAlgorithm.equals("DSA")) {
+ digestEncryptionAlgorithm = ID_DSA;
+ }
+ else {
+ throw new NoSuchAlgorithmException("Unknown Key Algorithm "+digestEncryptionAlgorithm);
+ }
+ }
+ if (hasRSAdata) {
+ RSAdata = new byte[0];
+ if (provider == null || provider.startsWith("SunPKCS11"))
+ messageDigest = MessageDigest.getInstance(getHashAlgorithm());
+ else
+ messageDigest = MessageDigest.getInstance(getHashAlgorithm(), provider);
+ }
+
+ if (privKey != null) {
+ if (provider == null)
+ sig = Signature.getInstance(getDigestAlgorithm());
+ else
+ sig = Signature.getInstance(getDigestAlgorithm(), provider);
+
+ sig.initSign(privKey);
+ }
+ }
+
+ /**
+ * Update the digest with the specified bytes. This method is used both for signing and verifying
+ * @param buf the data buffer
+ * @param off the offset in the data buffer
+ * @param len the data length
+ * @throws SignatureException on error
+ */
+ public void update(byte[] buf, int off, int len) throws SignatureException {
+ if (RSAdata != null || digestAttr != null)
+ messageDigest.update(buf, off, len);
+ else
+ sig.update(buf, off, len);
+ }
+
+ /**
+ * Verify the digest.
+ * @throws SignatureException on error
+ * @return <CODE>true</CODE> if the signature checks out, <CODE>false</CODE> otherwise
+ */
+ public boolean verify() throws SignatureException {
+ if (verified)
+ return verifyResult;
+ if (sigAttr != null) {
+ sig.update(sigAttr);
+ if (RSAdata != null) {
+ byte msd[] = messageDigest.digest();
+ messageDigest.update(msd);
+ }
+ verifyResult = (Arrays.equals(messageDigest.digest(), digestAttr) && sig.verify(digest));
+ }
+ else {
+ if (RSAdata != null)
+ sig.update(messageDigest.digest());
+ verifyResult = sig.verify(digest);
+ }
+ verified = true;
+ return verifyResult;
+ }
+
+ /**
+ * Get the X.509 certificates associated with this PKCS#7 object
+ * @return the X.509 certificates associated with this PKCS#7 object
+ */
+ public Certificate[] getCertificates() {
+ return (X509Certificate[])certs.toArray(new X509Certificate[0]);
+ }
+
+ /**
+ * Get the X.509 certificate revocation lists associated with this PKCS#7 object
+ * @return the X.509 certificate revocation lists associated with this PKCS#7 object
+ */
+ public Collection getCRLs() {
+ return crls;
+ }
+
+ /**
+ * Get the X.509 certificate actually used to sign the digest.
+ * @return the X.509 certificate actually used to sign the digest
+ */
+ public X509Certificate getSigningCertificate() {
+ return signCert;
+ }
+
+ /**
+ * Get the version of the PKCS#7 object. Always 1
+ * @return the version of the PKCS#7 object. Always 1
+ */
+ public int getVersion() {
+ return version;
+ }
+
+ /**
+ * Get the version of the PKCS#7 "SignerInfo" object. Always 1
+ * @return the version of the PKCS#7 "SignerInfo" object. Always 1
+ */
+ public int getSigningInfoVersion() {
+ return signerversion;
+ }
+
+ /**
+ * Get the algorithm used to calculate the message digest
+ * @return the algorithm used to calculate the message digest
+ */
+ public String getDigestAlgorithm() {
+ String dea = digestEncryptionAlgorithm;
+
+ if (digestEncryptionAlgorithm.equals(ID_RSA)) {
+ dea = "RSA";
+ }
+ else if (digestEncryptionAlgorithm.equals(ID_DSA)) {
+ dea = "DSA";
+ }
+
+ return getHashAlgorithm() + "with" + dea;
+ }
+
+ /**
+ * Returns the algorithm.
+ * @return the digest algorithm
+ */
+ public String getHashAlgorithm() {
+ String da = digestAlgorithm;
+
+ if (digestAlgorithm.equals(ID_MD5) || digestAlgorithm.equals(ID_MD5RSA)) {
+ da = "MD5";
+ }
+ else if (digestAlgorithm.equals(ID_MD2) || digestAlgorithm.equals(ID_MD2RSA)) {
+ da = "MD2";
+ }
+ else if (digestAlgorithm.equals(ID_SHA1) || digestAlgorithm.equals(ID_SHA1RSA)) {
+ da = "SHA1";
+ }
+ return da;
+ }
+
+ /**
+ * Loads the default root certificates at &lt;java.home&gt;/lib/security/cacerts
+ * with the default provider.
+ * @return a <CODE>KeyStore</CODE>
+ */
+ public static KeyStore loadCacertsKeyStore() {
+ return loadCacertsKeyStore(null);
+ }
+
+ /**
+ * Loads the default root certificates at &lt;java.home&gt;/lib/security/cacerts.
+ * @param provider the provider or <code>null</code> for the default provider
+ * @return a <CODE>KeyStore</CODE>
+ */
+ public static KeyStore loadCacertsKeyStore(String provider) {
+ File file = new File(System.getProperty("java.home"), "lib");
+ file = new File(file, "security");
+ file = new File(file, "cacerts");
+ FileInputStream fin = null;
+ try {
+ fin = new FileInputStream(file);
+ KeyStore k;
+ if (provider == null)
+ k = KeyStore.getInstance("JKS");
+ else
+ k = KeyStore.getInstance("JKS", provider);
+ k.load(fin, null);
+ return k;
+ }
+ catch (Exception e) {
+ throw new ExceptionConverter(e);
+ }
+ finally {
+ try{fin.close();}catch(Exception ex){}
+ }
+ }
+
+ /**
+ * Verifies a single certificate.
+ * @param cert the certificate to verify
+ * @param crls the certificate revocation list or <CODE>null</CODE>
+ * @param calendar the date or <CODE>null</CODE> for the current date
+ * @return a <CODE>String</CODE> with the error description or <CODE>null</CODE>
+ * if no error
+ */
+ public static String verifyCertificate(X509Certificate cert, Collection crls, Calendar calendar) {
+ if (calendar == null)
+ calendar = new GregorianCalendar();
+ if (cert.hasUnsupportedCriticalExtension())
+ return "Has unsupported critical extension";
+ try {
+ cert.checkValidity(calendar.getTime());
+ }
+ catch (Exception e) {
+ return e.getMessage();
+ }
+ if (crls != null) {
+ for (Iterator it = crls.iterator(); it.hasNext();) {
+ if (((CRL)it.next()).isRevoked(cert))
+ return "Certificate revoked";
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Verifies a certificate chain against a KeyStore.
+ * @param certs the certificate chain
+ * @param keystore the <CODE>KeyStore</CODE>
+ * @param crls the certificate revocation list or <CODE>null</CODE>
+ * @param calendar the date or <CODE>null</CODE> for the current date
+ * @return <CODE>null</CODE> if the certificate chain could be validade or a
+ * <CODE>Object[]{cert,error}</CODE> where <CODE>cert</CODE> is the
+ * failed certificate and <CODE>error</CODE> is the error message
+ */
+ public static Object[] verifyCertificates(Certificate certs[], KeyStore keystore, Collection crls, Calendar calendar) {
+ if (calendar == null)
+ calendar = new GregorianCalendar();
+ for (int k = 0; k < certs.length; ++k) {
+ X509Certificate cert = (X509Certificate)certs[k];
+ String err = verifyCertificate(cert, crls, calendar);
+ if (err != null)
+ return new Object[]{cert, err};
+ try {
+ for (Enumeration aliases = keystore.aliases(); aliases.hasMoreElements();) {
+ try {
+ String alias = (String)aliases.nextElement();
+ if (!keystore.isCertificateEntry(alias))
+ continue;
+ X509Certificate certStoreX509 = (X509Certificate)keystore.getCertificate(alias);
+ if (verifyCertificate(certStoreX509, crls, calendar) != null)
+ continue;
+ try {
+ cert.verify(certStoreX509.getPublicKey());
+ return null;
+ }
+ catch (Exception e) {
+ continue;
+ }
+ }
+ catch (Exception ex) {
+ }
+ }
+ }
+ catch (Exception e) {
+ }
+ int j;
+ for (j = 0; j < certs.length; ++j) {
+ if (j == k)
+ continue;
+ X509Certificate certNext = (X509Certificate)certs[j];
+ try {
+ cert.verify(certNext.getPublicKey());
+ break;
+ }
+ catch (Exception e) {
+ }
+ }
+ if (j == certs.length)
+ return new Object[]{cert, "Cannot be verified against the KeyStore or the certificate chain"};
+ }
+ return new Object[]{null, "Invalid state. Possible circular certificate chain"};
+ }
+
+ /**
+ * Get the "issuer" from the TBSCertificate bytes that are passed in
+ * @param enc a TBSCertificate in a byte array
+ * @return a DERObject
+ */
+ private static DERObject getIssuer(byte[] enc) {
+ try {
+ ASN1InputStream in = new ASN1InputStream(new ByteArrayInputStream(enc));
+ ASN1Sequence seq = (ASN1Sequence)in.readObject();
+ return (DERObject)seq.getObjectAt(seq.getObjectAt(0) instanceof DERTaggedObject ? 3 : 2);
+ }
+ catch (IOException e) {
+ throw new ExceptionConverter(e);
+ }
+ }
+
+ /**
+ * Get the "subject" from the TBSCertificate bytes that are passed in
+ * @param enc A TBSCertificate in a byte array
+ * @return a DERObject
+ */
+ private static DERObject getSubject(byte[] enc) {
+ try {
+ ASN1InputStream in = new ASN1InputStream(new ByteArrayInputStream(enc));
+ ASN1Sequence seq = (ASN1Sequence)in.readObject();
+ return (DERObject)seq.getObjectAt(seq.getObjectAt(0) instanceof DERTaggedObject ? 5 : 4);
+ }
+ catch (IOException e) {
+ throw new ExceptionConverter(e);
+ }
+ }
+
+ /**
+ * Get the issuer fields from an X509 Certificate
+ * @param cert an X509Certificate
+ * @return an X509Name
+ */
+ public static X509Name getIssuerFields(X509Certificate cert) {
+ try {
+ return new X509Name((ASN1Sequence)getIssuer(cert.getTBSCertificate()));
+ }
+ catch (Exception e) {
+ throw new ExceptionConverter(e);
+ }
+ }
+
+ /**
+ * Get the subject fields from an X509 Certificate
+ * @param cert an X509Certificate
+ * @return an X509Name
+ */
+ public static X509Name getSubjectFields(X509Certificate cert) {
+ try {
+ return new X509Name((ASN1Sequence)getSubject(cert.getTBSCertificate()));
+ }
+ catch (Exception e) {
+ throw new ExceptionConverter(e);
+ }
+ }
+
+ /**
+ * Gets the bytes for the PKCS#1 object.
+ * @return a byte array
+ */
+ public byte[] getEncodedPKCS1() {
+ try {
+ if (externalDigest != null)
+ digest = externalDigest;
+ else
+ digest = sig.sign();
+ ByteArrayOutputStream bOut = new ByteArrayOutputStream();
+
+ ASN1OutputStream dout = new ASN1OutputStream(bOut);
+ dout.writeObject(new DEROctetString(digest));
+ dout.close();
+
+ return bOut.toByteArray();
+ }
+ catch (Exception e) {
+ throw new ExceptionConverter(e);
+ }
+ }
+
+ /**
+ * Sets the digest/signature to an external calculated value.
+ * @param digest the digest. This is the actual signature
+ * @param RSAdata the extra data that goes into the data tag in PKCS#7
+ * @param digestEncryptionAlgorithm the encryption algorithm. It may must be <CODE>null</CODE> if the <CODE>digest</CODE>
+ * is also <CODE>null</CODE>. If the <CODE>digest</CODE> is not <CODE>null</CODE>
+ * then it may be "RSA" or "DSA"
+ */
+ public void setExternalDigest(byte digest[], byte RSAdata[], String digestEncryptionAlgorithm) {
+ externalDigest = digest;
+ externalRSAdata = RSAdata;
+ if (digestEncryptionAlgorithm != null) {
+ if (digestEncryptionAlgorithm.equals("RSA")) {
+ this.digestEncryptionAlgorithm = ID_RSA;
+ }
+ else if (digestEncryptionAlgorithm.equals("DSA")) {
+ this.digestEncryptionAlgorithm = ID_DSA;
+ }
+ else
+ throw new ExceptionConverter(new NoSuchAlgorithmException("Unknown Key Algorithm "+digestEncryptionAlgorithm));
+ }
+ }
+
+ /**
+ * Gets the bytes for the PKCS7SignedData object.
+ * @return the bytes for the PKCS7SignedData object
+ */
+ public byte[] getEncodedPKCS7() {
+ return getEncodedPKCS7(null, null);
+ }
+
+ /**
+ * Gets the bytes for the PKCS7SignedData object. Optionally the authenticatedAttributes
+ * in the signerInfo can also be set. If either of the parameters is <CODE>null</CODE>, none will be used.
+ * @param secondDigest the digest in the authenticatedAttributes
+ * @param signingTime the signing time in the authenticatedAttributes
+ * @return the bytes for the PKCS7SignedData object
+ */
+ public byte[] getEncodedPKCS7(byte secondDigest[], Calendar signingTime) {
+ try {
+ if (externalDigest != null) {
+ digest = externalDigest;
+ if (RSAdata != null)
+ RSAdata = externalRSAdata;
+ }
+ else if (externalRSAdata != null && RSAdata != null) {
+ RSAdata = externalRSAdata;
+ sig.update(RSAdata);
+ digest = sig.sign();
+ }
+ else {
+ if (RSAdata != null) {
+ RSAdata = messageDigest.digest();
+ sig.update(RSAdata);
+ }
+ digest = sig.sign();
+ }
+
+ // Create the set of Hash algorithms
+ DERConstructedSet digestAlgorithms = new DERConstructedSet();
+ for(Iterator it = digestalgos.iterator(); it.hasNext();) {
+ ASN1EncodableVector algos = new ASN1EncodableVector();
+ algos.add(new DERObjectIdentifier((String)it.next()));
+ algos.add(new DERNull());
+ digestAlgorithms.addObject(new DERSequence(algos));
+ }
+
+ // Create the contentInfo.
+ ASN1EncodableVector v = new ASN1EncodableVector();
+ v.add(new DERObjectIdentifier(ID_PKCS7_DATA));
+ if (RSAdata != null)
+ v.add(new DERTaggedObject(0, new DEROctetString(RSAdata)));
+ DERSequence contentinfo = new DERSequence(v);
+
+ // Get all the certificates
+ //
+ v = new ASN1EncodableVector();
+ for (Iterator i = certs.iterator(); i.hasNext();) {
+ ASN1InputStream tempstream = new ASN1InputStream(new ByteArrayInputStream(((X509Certificate)i.next()).getEncoded()));
+ v.add(tempstream.readObject());
+ }
+
+ DERSet dercertificates = new DERSet(v);
+
+ // Create signerinfo structure.
+ //
+ ASN1EncodableVector signerinfo = new ASN1EncodableVector();
+
+ // Add the signerInfo version
+ //
+ signerinfo.add(new DERInteger(signerversion));
+
+ v = new ASN1EncodableVector();
+ v.add(getIssuer(signCert.getTBSCertificate()));
+ v.add(new DERInteger(signCert.getSerialNumber()));
+ signerinfo.add(new DERSequence(v));
+
+ // Add the digestAlgorithm
+ v = new ASN1EncodableVector();
+ v.add(new DERObjectIdentifier(digestAlgorithm));
+ v.add(new DERNull());
+ signerinfo.add(new DERSequence(v));
+
+ // add the authenticated attribute if present
+ if (secondDigest != null && signingTime != null) {
+ ASN1EncodableVector attribute = new ASN1EncodableVector();
+ v = new ASN1EncodableVector();
+ v.add(new DERObjectIdentifier(ID_CONTENT_TYPE));
+ v.add(new DERSet(new DERObjectIdentifier(ID_PKCS7_DATA)));
+ attribute.add(new DERSequence(v));
+ v = new ASN1EncodableVector();
+ v.add(new DERObjectIdentifier(ID_SIGNING_TIME));
+ v.add(new DERSet(new DERUTCTime(signingTime.getTime())));
+ attribute.add(new DERSequence(v));
+ v = new ASN1EncodableVector();
+ v.add(new DERObjectIdentifier(ID_MESSAGE_DIGEST));
+ v.add(new DERSet(new DEROctetString(secondDigest)));
+ attribute.add(new DERSequence(v));
+ signerinfo.add(new DERTaggedObject(false, 0, new DERSet(attribute)));
+ }
+ // Add the digestEncryptionAlgorithm
+ v = new ASN1EncodableVector();
+ v.add(new DERObjectIdentifier(digestEncryptionAlgorithm));
+ v.add(new DERNull());
+ signerinfo.add(new DERSequence(v));
+
+ // Add the digest
+ signerinfo.add(new DEROctetString(digest));
+
+
+ // Finally build the body out of all the components above
+ ASN1EncodableVector body = new ASN1EncodableVector();
+ body.add(new DERInteger(version));
+ body.add(digestAlgorithms);
+ body.add(contentinfo);
+ body.add(new DERTaggedObject(false, 0, dercertificates));
+
+ if (crls.size() > 0) {
+ v = new ASN1EncodableVector();
+ for (Iterator i = crls.iterator();i.hasNext();) {
+ ASN1InputStream t = new ASN1InputStream(new ByteArrayInputStream((((X509CRL)i.next()).getEncoded())));
+ v.add(t.readObject());
+ }
+ DERSet dercrls = new DERSet(v);
+ body.add(new DERTaggedObject(false, 1, dercrls));
+ }
+
+ // Only allow one signerInfo
+ body.add(new DERSet(new DERSequence(signerinfo)));
+
+ // Now we have the body, wrap it in it's PKCS7Signed shell
+ // and return it
+ //
+ ASN1EncodableVector whole = new ASN1EncodableVector();
+ whole.add(new DERObjectIdentifier(ID_PKCS7_SIGNED_DATA));
+ whole.add(new DERTaggedObject(0, new DERSequence(body)));
+
+ ByteArrayOutputStream bOut = new ByteArrayOutputStream();
+
+ ASN1OutputStream dout = new ASN1OutputStream(bOut);
+ dout.writeObject(new DERSequence(whole));
+ dout.close();
+
+ return bOut.toByteArray();
+ }
+ catch (Exception e) {
+ throw new ExceptionConverter(e);
+ }
+ }
+
+
+ /**
+ * When using authenticatedAttributes the authentication process is different.
+ * The document digest is generated and put inside the attribute. The signing is done over the DER encoded
+ * authenticatedAttributes. This method provides that encoding and the parameters must be
+ * exactly the same as in {@link #getEncodedPKCS7(byte[],Calendar)}.
+ * <p>
+ * A simple example:
+ * <p>
+ * <pre>
+ * Calendar cal = Calendar.getInstance();
+ * PdfPKCS7 pk7 = new PdfPKCS7(key, chain, null, "SHA1", null, false);
+ * MessageDigest messageDigest = MessageDigest.getInstance("SHA1");
+ * byte buf[] = new byte[8192];
+ * int n;
+ * InputStream inp = sap.getRangeStream();
+ * while ((n = inp.read(buf)) &gt; 0) {
+ * messageDigest.update(buf, 0, n);
+ * }
+ * byte hash[] = messageDigest.digest();
+ * byte sh[] = pk7.getAuthenticatedAttributeBytes(hash, cal);
+ * pk7.update(sh, 0, sh.length);
+ * byte sg[] = pk7.getEncodedPKCS7(hash, cal);
+ * </pre>
+ * @param secondDigest the content digest
+ * @param signingTime the signing time
+ * @return the byte array representation of the authenticatedAttributes ready to be signed
+ */
+ public byte[] getAuthenticatedAttributeBytes(byte secondDigest[], Calendar signingTime) {
+ try {
+ ASN1EncodableVector attribute = new ASN1EncodableVector();
+ ASN1EncodableVector v = new ASN1EncodableVector();
+ v.add(new DERObjectIdentifier(ID_CONTENT_TYPE));
+ v.add(new DERSet(new DERObjectIdentifier(ID_PKCS7_DATA)));
+ attribute.add(new DERSequence(v));
+ v = new ASN1EncodableVector();
+ v.add(new DERObjectIdentifier(ID_SIGNING_TIME));
+ v.add(new DERSet(new DERUTCTime(signingTime.getTime())));
+ attribute.add(new DERSequence(v));
+ v = new ASN1EncodableVector();
+ v.add(new DERObjectIdentifier(ID_MESSAGE_DIGEST));
+ v.add(new DERSet(new DEROctetString(secondDigest)));
+ attribute.add(new DERSequence(v));
+ ByteArrayOutputStream bOut = new ByteArrayOutputStream();
+
+ ASN1OutputStream dout = new ASN1OutputStream(bOut);
+ dout.writeObject(new DERSet(attribute));
+ dout.close();
+
+ return bOut.toByteArray();
+ }
+ catch (Exception e) {
+ throw new ExceptionConverter(e);
+ }
+ }
+ /**
+ * Getter for property reason.
+ * @return Value of property reason.
+ */
+ public String getReason() {
+ return this.reason;
+ }
+
+ /**
+ * Setter for property reason.
+ * @param reason New value of property reason.
+ */
+ public void setReason(String reason) {
+ this.reason = reason;
+ }
+
+ /**
+ * Getter for property location.
+ * @return Value of property location.
+ */
+ public String getLocation() {
+ return this.location;
+ }
+
+ /**
+ * Setter for property location.
+ * @param location New value of property location.
+ */
+ public void setLocation(String location) {
+ this.location = location;
+ }
+
+ /**
+ * Getter for property signDate.
+ * @return Value of property signDate.
+ */
+ public Calendar getSignDate() {
+ return this.signDate;
+ }
+
+ /**
+ * Setter for property signDate.
+ * @param signDate New value of property signDate.
+ */
+ public void setSignDate(Calendar signDate) {
+ this.signDate = signDate;
+ }
+
+ /**
+ * Getter for property sigName.
+ * @return Value of property sigName.
+ */
+ public String getSignName() {
+ return this.signName;
+ }
+
+ /**
+ * Setter for property sigName.
+ * @param signName New value of property sigName.
+ */
+ public void setSignName(String signName) {
+ this.signName = signName;
+ }
+
+ /**
+ * a class that holds an X509 name
+ */
+ public static class X509Name {
+ /**
+ * country code - StringType(SIZE(2))
+ */
+ public static final DERObjectIdentifier C = new DERObjectIdentifier("2.5.4.6");
+
+ /**
+ * organization - StringType(SIZE(1..64))
+ */
+ public static final DERObjectIdentifier O = new DERObjectIdentifier("2.5.4.10");
+
+ /**
+ * organizational unit name - StringType(SIZE(1..64))
+ */
+ public static final DERObjectIdentifier OU = new DERObjectIdentifier("2.5.4.11");
+
+ /**
+ * Title
+ */
+ public static final DERObjectIdentifier T = new DERObjectIdentifier("2.5.4.12");
+
+ /**
+ * common name - StringType(SIZE(1..64))
+ */
+ public static final DERObjectIdentifier CN = new DERObjectIdentifier("2.5.4.3");
+
+ /**
+ * device serial number name - StringType(SIZE(1..64))
+ */
+ public static final DERObjectIdentifier SN = new DERObjectIdentifier("2.5.4.5");
+
+ /**
+ * locality name - StringType(SIZE(1..64))
+ */
+ public static final DERObjectIdentifier L = new DERObjectIdentifier("2.5.4.7");
+
+ /**
+ * state, or province name - StringType(SIZE(1..64))
+ */
+ public static final DERObjectIdentifier ST = new DERObjectIdentifier("2.5.4.8");
+
+ /** Naming attribute of type X520name */
+ public static final DERObjectIdentifier SURNAME = new DERObjectIdentifier("2.5.4.4");
+ /** Naming attribute of type X520name */
+ public static final DERObjectIdentifier GIVENNAME = new DERObjectIdentifier("2.5.4.42");
+ /** Naming attribute of type X520name */
+ public static final DERObjectIdentifier INITIALS = new DERObjectIdentifier("2.5.4.43");
+ /** Naming attribute of type X520name */
+ public static final DERObjectIdentifier GENERATION = new DERObjectIdentifier("2.5.4.44");
+ /** Naming attribute of type X520name */
+ public static final DERObjectIdentifier UNIQUE_IDENTIFIER = new DERObjectIdentifier("2.5.4.45");
+
+ /**
+ * Email address (RSA PKCS#9 extension) - IA5String.
+ * <p>Note: if you're trying to be ultra orthodox, don't use this! It shouldn't be in here.
+ */
+ public static final DERObjectIdentifier EmailAddress = new DERObjectIdentifier("1.2.840.113549.1.9.1");
+
+ /**
+ * email address in Verisign certificates
+ */
+ public static final DERObjectIdentifier E = EmailAddress;
+
+ /** object identifier */
+ public static final DERObjectIdentifier DC = new DERObjectIdentifier("0.9.2342.19200300.100.1.25");
+
+ /** LDAP User id. */
+ public static final DERObjectIdentifier UID = new DERObjectIdentifier("0.9.2342.19200300.100.1.1");
+
+ /** A HashMap with default symbols */
+ public static HashMap DefaultSymbols = new HashMap();
+
+ static {
+ DefaultSymbols.put(C, "C");
+ DefaultSymbols.put(O, "O");
+ DefaultSymbols.put(T, "T");
+ DefaultSymbols.put(OU, "OU");
+ DefaultSymbols.put(CN, "CN");
+ DefaultSymbols.put(L, "L");
+ DefaultSymbols.put(ST, "ST");
+ DefaultSymbols.put(SN, "SN");
+ DefaultSymbols.put(EmailAddress, "E");
+ DefaultSymbols.put(DC, "DC");
+ DefaultSymbols.put(UID, "UID");
+ DefaultSymbols.put(SURNAME, "SURNAME");
+ DefaultSymbols.put(GIVENNAME, "GIVENNAME");
+ DefaultSymbols.put(INITIALS, "INITIALS");
+ DefaultSymbols.put(GENERATION, "GENERATION");
+ }
+ /** A HashMap with values */
+ public HashMap values = new HashMap();
+
+ /**
+ * Constructs an X509 name
+ * @param seq an ASN1 Sequence
+ */
+ public X509Name(ASN1Sequence seq) {
+ Enumeration e = seq.getObjects();
+
+ while (e.hasMoreElements()) {
+ ASN1Set set = (ASN1Set)e.nextElement();
+
+ for (int i = 0; i < set.size(); i++) {
+ ASN1Sequence s = (ASN1Sequence)set.getObjectAt(i);
+ String id = (String)DefaultSymbols.get(s.getObjectAt(0));
+ if (id == null)
+ continue;
+ ArrayList vs = (ArrayList)values.get(id);
+ if (vs == null) {
+ vs = new ArrayList();
+ values.put(id, vs);
+ }
+ vs.add(((DERString)s.getObjectAt(1)).getString());
+ }
+ }
+ }
+ /**
+ * Constructs an X509 name
+ * @param dirName a directory name
+ */
+ public X509Name(String dirName) {
+ X509NameTokenizer nTok = new X509NameTokenizer(dirName);
+
+ while (nTok.hasMoreTokens()) {
+ String token = nTok.nextToken();
+ int index = token.indexOf('=');
+
+ if (index == -1) {
+ throw new IllegalArgumentException("badly formated directory string");
+ }
+
+ String id = token.substring(0, index).toUpperCase();
+ String value = token.substring(index + 1);
+ ArrayList vs = (ArrayList)values.get(id);
+ if (vs == null) {
+ vs = new ArrayList();
+ values.put(id, vs);
+ }
+ vs.add(value);
+ }
+
+ }
+
+ public String getField(String name) {
+ ArrayList vs = (ArrayList)values.get(name);
+ return vs == null ? null : (String)vs.get(0);
+ }
+
+ /**
+ * gets a field array from the values Hashmap
+ * @param name
+ * @return an ArrayList
+ */
+ public ArrayList getFieldArray(String name) {
+ ArrayList vs = (ArrayList)values.get(name);
+ return vs == null ? null : vs;
+ }
+
+ /**
+ * getter for values
+ * @return a HashMap with the fields of the X509 name
+ */
+ public HashMap getFields() {
+ return values;
+ }
+
+ /**
+ * @see java.lang.Object#toString()
+ */
+ public String toString() {
+ return values.toString();
+ }
+ }
+
+ /**
+ * class for breaking up an X500 Name into it's component tokens, ala
+ * java.util.StringTokenizer. We need this class as some of the
+ * lightweight Java environment don't support classes like
+ * StringTokenizer.
+ */
+ public static class X509NameTokenizer {
+ private String oid;
+ private int index;
+ private StringBuffer buf = new StringBuffer();
+
+ public X509NameTokenizer(
+ String oid) {
+ this.oid = oid;
+ this.index = -1;
+ }
+
+ public boolean hasMoreTokens() {
+ return (index != oid.length());
+ }
+
+ public String nextToken() {
+ if (index == oid.length()) {
+ return null;
+ }
+
+ int end = index + 1;
+ boolean quoted = false;
+ boolean escaped = false;
+
+ buf.setLength(0);
+
+ while (end != oid.length()) {
+ char c = oid.charAt(end);
+
+ if (c == '"') {
+ if (!escaped) {
+ quoted = !quoted;
+ }
+ else {
+ buf.append(c);
+ }
+ escaped = false;
+ }
+ else {
+ if (escaped || quoted) {
+ buf.append(c);
+ escaped = false;
+ }
+ else if (c == '\\') {
+ escaped = true;
+ }
+ else if (c == ',') {
+ break;
+ }
+ else {
+ buf.append(c);
+ }
+ }
+ end++;
+ }
+
+ index = end;
+ return buf.toString().trim();
+ }
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/pdf/PdfPRow.java b/src/main/java/com/lowagie/text/pdf/PdfPRow.java
new file mode 100644
index 0000000..31f7cd9
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/PdfPRow.java
@@ -0,0 +1,659 @@
+/*
+ * $Id: PdfPRow.java,v 1.72 2006/02/12 18:23:29 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2001, 2002 Paulo Soares
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf;
+
+import com.lowagie.text.ExceptionConverter;
+import com.lowagie.text.DocumentException;
+import com.lowagie.text.Element;
+import com.lowagie.text.Image;
+import com.lowagie.text.Rectangle;
+import java.awt.Color;
+
+/**
+ * A row in a PdfPTable.
+ *
+ * @author Paulo Soares (psoares@consiste.pt)
+ */
+
+public class PdfPRow {
+
+ /** the bottom limit (bottom right y) */
+ public static final float BOTTOM_LIMIT = -(1 << 30);
+
+ protected PdfPCell cells[];
+
+ protected float widths[];
+
+ protected float maxHeight = 0;
+
+ protected boolean calculated = false;
+
+ private int[] canvasesPos;
+
+ /**
+ * Constructs a new PdfPRow with the cells in the array that was passed as a parameter.
+ * @param cells
+ */
+ public PdfPRow(PdfPCell cells[]) {
+ this.cells = cells;
+ widths = new float[cells.length];
+ }
+
+ /**
+ * Makes a copy of an existing row.
+ * @param row
+ */
+ public PdfPRow(PdfPRow row) {
+ maxHeight = row.maxHeight;
+ calculated = row.calculated;
+ cells = new PdfPCell[row.cells.length];
+ for (int k = 0; k < cells.length; ++k) {
+ if (row.cells[k] != null)
+ cells[k] = new PdfPCell(row.cells[k]);
+ }
+ widths = new float[cells.length];
+ System.arraycopy(row.widths, 0, widths, 0, cells.length);
+ }
+
+ /**
+ * Sets the widths of the columns in the row.
+ * @param widths
+ * @return true if everything went right
+ */
+ public boolean setWidths(float widths[]) {
+ if (widths.length != cells.length)
+ return false;
+ System.arraycopy(widths, 0, this.widths, 0, cells.length);
+ float total = 0;
+ calculated = false;
+ for (int k = 0; k < widths.length; ++k) {
+ PdfPCell cell = cells[k];
+ cell.setLeft(total);
+ int last = k + cell.getColspan();
+ for (; k < last; ++k)
+ total += widths[k];
+ --k;
+ cell.setRight(total);
+ cell.setTop(0);
+ }
+ return true;
+ }
+
+ /**
+ * Calculates the heights of each cell in the row.
+ * @return the maximum height of the row.
+ */
+ public float calculateHeights() {
+ maxHeight = 0;
+ for (int k = 0; k < cells.length; ++k) {
+ PdfPCell cell = cells[k];
+ if (cell == null)
+ continue;
+ Image img = cell.getImage();
+ if (img != null) {
+ img.scalePercent(100);
+ float refWidth = img.scaledWidth();
+ if (cell.getRotation() == 90 || cell.getRotation() == 270) {
+ refWidth = img.scaledHeight();
+ }
+ float scale = (cell.right() - cell.getEffectivePaddingRight()
+ - cell.getEffectivePaddingLeft() - cell.left())
+ / refWidth;
+ img.scalePercent(scale * 100);
+ float refHeight = img.scaledHeight();
+ if (cell.getRotation() == 90 || cell.getRotation() == 270) {
+ refHeight = img.scaledWidth();
+ }
+ cell.setBottom(cell.top() - cell.getEffectivePaddingTop()
+ - cell.getEffectivePaddingBottom()
+ - refHeight);
+ } else {
+ if (cell.getRotation() == 0 || cell.getRotation() == 180) {
+ float rightLimit = cell.isNoWrap() ? 20000 : cell.right()
+ - cell.getEffectivePaddingRight();
+ float bry = (cell.getFixedHeight() > 0) ? cell.top()
+ - cell.getEffectivePaddingTop()
+ + cell.getEffectivePaddingBottom()
+ - cell.getFixedHeight() : BOTTOM_LIMIT;
+ ColumnText ct = ColumnText.duplicate(cell.getColumn());
+ ct.setSimpleColumn(
+ cell.left() + cell.getEffectivePaddingLeft(), bry,
+ rightLimit, cell.top() - cell.getEffectivePaddingTop());
+ try {
+ ct.go(true);
+ } catch (DocumentException e) {
+ throw new ExceptionConverter(e);
+ }
+ float yLine = ct.getYLine();
+ if (cell.isUseDescender())
+ yLine += ct.getDescender();
+ cell.setBottom(yLine - cell.getEffectivePaddingBottom());
+ }
+ else {
+ if (cell.getFixedHeight() > 0) {
+ cell.setBottom(cell.top() - cell.getFixedHeight());
+ }
+ else {
+ ColumnText ct = ColumnText.duplicate(cell.getColumn());
+ ct.setSimpleColumn(0, cell.left() + cell.getEffectivePaddingLeft(),
+ 20000, cell.right() - cell.getEffectivePaddingRight());
+ try {
+ ct.go(true);
+ } catch (DocumentException e) {
+ throw new ExceptionConverter(e);
+ }
+ cell.setBottom(cell.top() - cell.getEffectivePaddingTop()
+ - cell.getEffectivePaddingBottom() - ct.getFilledWidth());
+ }
+ }
+ }
+ float height = cell.getFixedHeight();
+ if (height <= 0)
+ height = cell.height();
+ if (height < cell.getFixedHeight())
+ height = cell.getFixedHeight();
+ else if (height < cell.getMinimumHeight())
+ height = cell.getMinimumHeight();
+ if (height > maxHeight)
+ maxHeight = height;
+ }
+ calculated = true;
+ return maxHeight;
+ }
+
+ /**
+ * Writes the border and background of one cell in the row.
+ * @param xPos
+ * @param yPos
+ * @param cell
+ * @param canvases
+ */
+ public void writeBorderAndBackground(float xPos, float yPos, PdfPCell cell,
+ PdfContentByte[] canvases) {
+ PdfContentByte lines = canvases[PdfPTable.LINECANVAS];
+ PdfContentByte backgr = canvases[PdfPTable.BACKGROUNDCANVAS];
+ // the coordinates of the border are retrieved
+ float x1 = cell.left() + xPos;
+ float y2 = cell.top() + yPos;
+ float x2 = cell.right() + xPos;
+ float y1 = y2 - maxHeight;
+
+ // the backgroundcolor is set
+ Color background = cell.backgroundColor();
+ if (background != null) {
+ backgr.setColorFill(background);
+ backgr.rectangle(x1, y1, x2 - x1, y2 - y1);
+ backgr.fill();
+ }
+ // if the element hasn't got any borders, nothing is added
+ if (cell.hasBorders()) {
+ if (cell.isUseVariableBorders()) {
+ Rectangle borderRect = new Rectangle(cell.left() + xPos, cell
+ .top()
+ - maxHeight + yPos, cell.right() + xPos, cell.top()
+ + yPos);
+ borderRect.cloneNonPositionParameters(cell);
+ borderRect.setBackgroundColor(null);
+ lines.rectangle(borderRect);
+ } else {
+ // the width is set to the width of the element
+ if (cell.borderWidth() != Rectangle.UNDEFINED) {
+ lines.setLineWidth(cell.borderWidth());
+ }
+ // the color is set to the color of the element
+ Color color = cell.borderColor();
+ if (color != null) {
+ lines.setColorStroke(color);
+ }
+
+ // if the box is a rectangle, it is added as a rectangle
+ if (cell.hasBorder(Rectangle.BOX)) {
+ lines.rectangle(x1, y1, x2 - x1, y2 - y1);
+ }
+ // if the border isn't a rectangle, the different sides are
+ // added apart
+ else {
+ if (cell.hasBorder(Rectangle.RIGHT)) {
+ lines.moveTo(x2, y1);
+ lines.lineTo(x2, y2);
+ }
+ if (cell.hasBorder(Rectangle.LEFT)) {
+ lines.moveTo(x1, y1);
+ lines.lineTo(x1, y2);
+ }
+ if (cell.hasBorder(Rectangle.BOTTOM)) {
+ lines.moveTo(x1, y1);
+ lines.lineTo(x2, y1);
+ }
+ if (cell.hasBorder(Rectangle.TOP)) {
+ lines.moveTo(x1, y2);
+ lines.lineTo(x2, y2);
+ }
+ }
+ lines.stroke();
+ if (color != null) {
+ lines.resetRGBColorStroke();
+ }
+ }
+ }
+ }
+
+ private void saveAndRotateCanvases(PdfContentByte[] canvases, float a, float b, float c, float d, float e, float f) {
+ int last = PdfPTable.TEXTCANVAS + 1;
+ if (canvasesPos == null) {
+ canvasesPos = new int[last * 2];
+ }
+ for (int k = 0; k < last; ++k) {
+ ByteBuffer bb = canvases[k].getInternalBuffer();
+ canvasesPos[k * 2] = bb.size();
+ canvases[k].saveState();
+ canvases[k].concatCTM(a, b, c, d, e, f);
+ canvasesPos[k * 2 + 1] = bb.size();
+ }
+ }
+
+ private void restoreCanvases(PdfContentByte[] canvases) {
+ int last = PdfPTable.TEXTCANVAS + 1;
+ for (int k = 0; k < last; ++k) {
+ ByteBuffer bb = canvases[k].getInternalBuffer();
+ int p1 = bb.size();
+ canvases[k].restoreState();
+ if (p1 == canvasesPos[k * 2 + 1])
+ bb.setSize(canvasesPos[k * 2]);
+ }
+ }
+
+ /**
+ * Writes a number of cells (not necessarily all cells).
+ * @param colStart
+ * @param colEnd
+ * @param xPos
+ * @param yPos
+ * @param canvases
+ */
+ public void writeCells(int colStart, int colEnd, float xPos, float yPos,
+ PdfContentByte[] canvases) {
+ if (!calculated)
+ calculateHeights();
+ if (colEnd < 0)
+ colEnd = cells.length;
+ colEnd = Math.min(colEnd, cells.length);
+ if (colStart < 0)
+ colStart = 0;
+ if (colStart >= colEnd)
+ return;
+ int newStart;
+ for (newStart = colStart; newStart >= 0; --newStart) {
+ if (cells[newStart] != null)
+ break;
+ xPos -= widths[newStart - 1];
+ }
+ xPos -= cells[newStart].left();
+ for (int k = newStart; k < colEnd; ++k) {
+ PdfPCell cell = cells[k];
+ if (cell == null)
+ continue;
+ writeBorderAndBackground(xPos, yPos, cell, canvases);
+ Image img = cell.getImage();
+ float tly = 0;
+ switch (cell.getVerticalAlignment()) {
+ case Element.ALIGN_BOTTOM:
+ tly = cell.top() + yPos - maxHeight + cell.height()
+ - cell.getEffectivePaddingTop();
+ break;
+ case Element.ALIGN_MIDDLE:
+ tly = cell.top() + yPos + (cell.height() - maxHeight) / 2
+ - cell.getEffectivePaddingTop();
+ break;
+ default:
+ tly = cell.top() + yPos - cell.getEffectivePaddingTop();
+ break;
+ }
+ if (img != null) {
+ if (cell.getRotation() != 0) {
+ img = Image.getInstance(img);
+ img.setRotation(img.getImageRotation() + (float)(cell.getRotation() * Math.PI / 180.0));
+ }
+ boolean vf = false;
+ if (cell.height() > maxHeight) {
+ img.scalePercent(100);
+ float scale = (maxHeight - cell.getEffectivePaddingTop() - cell
+ .getEffectivePaddingBottom())
+ / img.scaledHeight();
+ img.scalePercent(scale * 100);
+ vf = true;
+ }
+ float left = cell.left() + xPos
+ + cell.getEffectivePaddingLeft();
+ if (vf) {
+ switch (cell.getHorizontalAlignment()) {
+ case Element.ALIGN_CENTER:
+ left = xPos
+ + (cell.left() + cell.getEffectivePaddingLeft()
+ + cell.right()
+ - cell.getEffectivePaddingRight() - img
+ .scaledWidth()) / 2;
+ break;
+ case Element.ALIGN_RIGHT:
+ left = xPos + cell.right()
+ - cell.getEffectivePaddingRight()
+ - img.scaledWidth();
+ break;
+ default:
+ break;
+ }
+ tly = cell.top() + yPos - cell.getEffectivePaddingTop();
+ }
+ img.setAbsolutePosition(left, tly - img.scaledHeight());
+ try {
+ canvases[PdfPTable.TEXTCANVAS].addImage(img);
+ } catch (DocumentException e) {
+ throw new ExceptionConverter(e);
+ }
+ } else {
+ // rotation sponsored by Connection GmbH
+ if (cell.getRotation() == 90 || cell.getRotation() == 270) {
+ float netWidth = maxHeight - cell.getEffectivePaddingTop() - cell.getEffectivePaddingBottom();
+ float netHeight = cell.width() - cell.getEffectivePaddingLeft() - cell.getEffectivePaddingRight();
+ ColumnText ct = ColumnText.duplicate(cell.getColumn());
+ ct.setCanvases(canvases);
+ ct.setSimpleColumn(0, 0, netWidth + 0.001f, -netHeight);
+ try {
+ ct.go(true);
+ } catch (DocumentException e) {
+ throw new ExceptionConverter(e);
+ }
+ float calcHeight = -ct.getYLine();
+ if (calcHeight > 0) {
+ if (cell.isUseDescender())
+ calcHeight -= ct.getDescender();
+ ct = ColumnText.duplicate(cell.getColumn());
+ ct.setCanvases(canvases);
+ ct.setSimpleColumn(0, -0.001f, netWidth + 0.001f, calcHeight);
+ float pivotX;
+ float pivotY;
+ if (cell.getRotation() == 90) {
+ pivotY = cell.top() + yPos - maxHeight + cell.getEffectivePaddingBottom();
+ switch (cell.getVerticalAlignment()) {
+ case Element.ALIGN_BOTTOM:
+ pivotX = cell.left() + xPos + cell.width() - cell.getEffectivePaddingRight();
+ break;
+ case Element.ALIGN_MIDDLE:
+ pivotX = cell.left() + xPos + (cell.width() + cell.getEffectivePaddingLeft() - cell.getEffectivePaddingRight() + calcHeight) / 2;
+ break;
+ default: //top
+ pivotX = cell.left() + xPos + cell.getEffectivePaddingLeft() + calcHeight;
+ break;
+ }
+ saveAndRotateCanvases(canvases, 0,1,-1,0,pivotX,pivotY);
+ }
+ else {
+ pivotY = cell.top() + yPos - cell.getEffectivePaddingTop();
+ switch (cell.getVerticalAlignment()) {
+ case Element.ALIGN_BOTTOM:
+ pivotX = cell.left() + xPos + cell.getEffectivePaddingLeft();
+ break;
+ case Element.ALIGN_MIDDLE:
+ pivotX = cell.left() + xPos + (cell.width() + cell.getEffectivePaddingLeft() - cell.getEffectivePaddingRight() - calcHeight) / 2;
+ break;
+ default: //top
+ pivotX = cell.left() + xPos + cell.width() - cell.getEffectivePaddingRight() - calcHeight;
+ break;
+ }
+ saveAndRotateCanvases(canvases, 0,-1,1,0,pivotX,pivotY);
+ }
+ try {
+ ct.go();
+ } catch (DocumentException e) {
+ throw new ExceptionConverter(e);
+ } finally {
+ restoreCanvases(canvases);
+ }
+ }
+ }
+ else {
+ float fixedHeight = cell.getFixedHeight();
+ float rightLimit = cell.right() + xPos
+ - cell.getEffectivePaddingRight();
+ float leftLimit = cell.left() + xPos
+ + cell.getEffectivePaddingLeft();
+ if (cell.isNoWrap()) {
+ switch (cell.getHorizontalAlignment()) {
+ case Element.ALIGN_CENTER:
+ rightLimit += 10000;
+ leftLimit -= 10000;
+ break;
+ case Element.ALIGN_RIGHT:
+ leftLimit -= 20000;
+ break;
+ default:
+ rightLimit += 20000;
+ break;
+ }
+ }
+ ColumnText ct = ColumnText.duplicate(cell.getColumn());
+ ct.setCanvases(canvases);
+ float bry = tly
+ - (maxHeight /* cell.height() */
+ - cell.getEffectivePaddingTop() - cell.getEffectivePaddingBottom());
+ if (fixedHeight > 0) {
+ if (cell.height() > maxHeight) {
+ tly = cell.top() + yPos - cell.getEffectivePaddingTop();
+ bry = cell.top() + yPos - maxHeight + cell.getEffectivePaddingBottom();
+ }
+ }
+ if ((tly > bry || ct.zeroHeightElement()) && leftLimit < rightLimit) {
+ ct.setSimpleColumn(leftLimit, bry - 0.001f, rightLimit, tly);
+ if (cell.getRotation() == 180) {
+ float shx = leftLimit + rightLimit;
+ float shy = bry - 0.001f + tly;
+ saveAndRotateCanvases(canvases, -1,0,0,-1,shx,shy);
+ }
+ try {
+ ct.go();
+ } catch (DocumentException e) {
+ throw new ExceptionConverter(e);
+ } finally {
+ if (cell.getRotation() == 180) {
+ restoreCanvases(canvases);
+ }
+ }
+ }
+ }
+ }
+ PdfPCellEvent evt = cell.getCellEvent();
+ if (evt != null) {
+ Rectangle rect = new Rectangle(cell.left() + xPos, cell.top()
+ + yPos - maxHeight, cell.right() + xPos, cell.top()
+ + yPos);
+ evt.cellLayout(cell, rect, canvases);
+ }
+ }
+ }
+
+ /**
+ * Checks if the dimensions of the columns were calculated.
+ * @return true if the dimensions of the columns were calculated
+ */
+ public boolean isCalculated() {
+ return calculated;
+ }
+
+ /**
+ * Gets the maximum height of the row (i.e. of the 'highest' cell).
+ * @return the maximum height of the row
+ */
+ public float getMaxHeights() {
+ if (calculated)
+ return maxHeight;
+ else
+ return calculateHeights();
+ }
+
+ /**
+ * Changes the maximum height of the row (to make it higher).
+ * (added by Jin-Hsia Yang)
+ * @param maxHeight the new maximum height
+ */
+ public void setMaxHeights(float maxHeight) {
+ this.maxHeight = maxHeight;
+ }
+
+ //end add
+
+ float[] getEventWidth(float xPos) {
+ int n = 0;
+ for (int k = 0; k < cells.length; ++k) {
+ if (cells[k] != null)
+ ++n;
+ }
+ float width[] = new float[n + 1];
+ n = 0;
+ width[n++] = xPos;
+ for (int k = 0; k < cells.length; ++k) {
+ if (cells[k] != null) {
+ width[n] = width[n - 1] + cells[k].width();
+ ++n;
+ }
+ }
+ return width;
+ }
+
+ /**
+ * Splits a row to newHeight. The returned row is the remainder. It will
+ * return null if the newHeight was so small that only an empty row would
+ * result.
+ *
+ * @param newHeight
+ * the new height
+ * @return the remainder row or null if the newHeight was so small that only
+ * an empty row would result
+ */
+ public PdfPRow splitRow(float newHeight) {
+ PdfPCell newCells[] = new PdfPCell[cells.length];
+ float fh[] = new float[cells.length * 2];
+ boolean allEmpty = true;
+ for (int k = 0; k < cells.length; ++k) {
+ PdfPCell cell = cells[k];
+ if (cell == null)
+ continue;
+ fh[k * 2] = cell.getFixedHeight();
+ fh[k * 2 + 1] = cell.getMinimumHeight();
+ Image img = cell.getImage();
+ PdfPCell c2 = new PdfPCell(cell);
+ if (img != null) {
+ if (newHeight > cell.getEffectivePaddingBottom()
+ + cell.getEffectivePaddingTop() + 2) {
+ c2.setPhrase(null);
+ allEmpty = false;
+ }
+ } else {
+ int status;
+ float y;
+ ColumnText ct = ColumnText.duplicate(cell.getColumn());
+ if (cell.getRotation() == 90 || cell.getRotation() == 270) {
+ ct.setSimpleColumn(
+ cell.top() - newHeight + cell.getEffectivePaddingBottom(),
+ cell.left() + cell.getEffectivePaddingLeft(),
+ cell.top() - cell.getEffectivePaddingTop(),
+ y = cell.right() - cell.getEffectivePaddingRight());
+ }
+ else {
+ float rightLimit = cell.isNoWrap() ? 20000 : cell.right()
+ - cell.getEffectivePaddingRight();
+ float y1 = cell.top() - newHeight
+ + cell.getEffectivePaddingBottom();
+ float y2 = cell.top() - cell.getEffectivePaddingTop();
+ y = Math.max(y1, y2);
+ ct.setSimpleColumn(
+ cell.left() + cell.getEffectivePaddingLeft(), y1,
+ rightLimit, y2);
+ }
+ try {
+ status = ct.go(true);
+ } catch (DocumentException e) {
+ throw new ExceptionConverter(e);
+ }
+ boolean thisEmpty = (ct.getYLine() == y);
+ if (thisEmpty)
+ ct = ColumnText.duplicate(cell.getColumn());
+ allEmpty = (allEmpty && thisEmpty);
+ if ((status & ColumnText.NO_MORE_TEXT) == 0 || thisEmpty) {
+ c2.setColumn(ct);
+ ct.setFilledWidth(0);
+ } else {
+ c2.setPhrase(null);
+ }
+ }
+ newCells[k] = c2;
+ cell.setFixedHeight(newHeight);
+ }
+ if (allEmpty) {
+ for (int k = 0; k < cells.length; ++k) {
+ PdfPCell cell = cells[k];
+ if (cell == null)
+ continue;
+ float f = fh[k * 2];
+ float m = fh[k * 2 + 1];
+ if (f <= 0)
+ cell.setMinimumHeight(m);
+ else
+ cell.setFixedHeight(f);
+ }
+ return null;
+ }
+ calculateHeights();
+ PdfPRow split = new PdfPRow(newCells);
+ split.widths = (float[]) widths.clone();
+ split.calculateHeights();
+ return split;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/pdf/PdfPSXObject.java b/src/main/java/com/lowagie/text/pdf/PdfPSXObject.java
new file mode 100644
index 0000000..434a848
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/PdfPSXObject.java
@@ -0,0 +1,99 @@
+/*
+ * Copyright 2005 Paulo Soares
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+package com.lowagie.text.pdf;
+
+import java.io.IOException;
+
+/**
+ * Implements the PostScript XObject.
+ */
+public class PdfPSXObject extends PdfTemplate {
+
+ /** Creates a new instance of PdfPSXObject */
+ protected PdfPSXObject() {
+ super();
+ }
+
+ /**
+ * Constructs a PSXObject
+ * @param wr
+ */
+ public PdfPSXObject(PdfWriter wr) {
+ super(wr);
+ }
+
+ /**
+ * Gets the stream representing this object.
+ *
+ * @return the stream representing this object
+ * @throws IOException
+ */
+
+ PdfStream getFormXObject() throws IOException {
+ PdfStream s = new PdfStream(content.toByteArray());
+ s.put(PdfName.TYPE, PdfName.XOBJECT);
+ s.put(PdfName.SUBTYPE, PdfName.PS);
+ s.flateCompress();
+ return s;
+ }
+
+ /**
+ * Gets a duplicate of this <CODE>PdfPSXObject</CODE>. All
+ * the members are copied by reference but the buffer stays different.
+ * @return a copy of this <CODE>PdfPSXObject</CODE>
+ */
+
+ public PdfContentByte getDuplicate() {
+ PdfPSXObject tpl = new PdfPSXObject();
+ tpl.writer = writer;
+ tpl.pdf = pdf;
+ tpl.thisReference = thisReference;
+ tpl.pageResources = pageResources;
+ tpl.separator = separator;
+ return tpl;
+ }
+}
diff --git a/src/main/java/com/lowagie/text/pdf/PdfPTable.java b/src/main/java/com/lowagie/text/pdf/PdfPTable.java
new file mode 100644
index 0000000..280bcf0
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/PdfPTable.java
@@ -0,0 +1,1081 @@
+/*
+ * $Id: PdfPTable.java,v 1.66 2005/11/19 18:17:51 psoares33 Exp $
+ * $Name: $
+ *
+ * Copyright 2001, 2002 Paulo Soares
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf;
+
+import java.util.ArrayList;
+import com.lowagie.text.Phrase;
+import com.lowagie.text.Element;
+import com.lowagie.text.Image;
+import com.lowagie.text.Rectangle;
+import com.lowagie.text.ElementListener;
+import com.lowagie.text.DocumentException;
+import com.lowagie.text.pdf.events.PdfPTableEventForwarder;
+
+/** This is a table that can be put at an absolute position but can also
+ * be added to the document as the class <CODE>Table</CODE>.
+ * In the last case when crossing pages the table always break at full rows; if a
+ * row is bigger than the page it is dropped silently to avoid infinite loops.
+ * <P>
+ * A PdfPTableEvent can be associated to the table to do custom drawing
+ * when the table is rendered.
+ * @author Paulo Soares (psoares@consiste.pt)
+ */
+
+public class PdfPTable implements Element{
+
+ /** The index of the original <CODE>PdfcontentByte</CODE>.
+ */
+ public static final int BASECANVAS = 0;
+ /** The index of the duplicate <CODE>PdfContentByte</CODE> where the background will be drawn.
+ */
+ public static final int BACKGROUNDCANVAS = 1;
+ /** The index of the duplicate <CODE>PdfContentByte</CODE> where the border lines will be drawn.
+ */
+ public static final int LINECANVAS = 2;
+ /** The index of the duplicate <CODE>PdfContentByte</CODE> where the text will be drawn.
+ */
+ public static final int TEXTCANVAS = 3;
+
+ protected ArrayList rows = new ArrayList();
+ protected float totalHeight = 0;
+ protected PdfPCell currentRow[];
+ protected int currentRowIdx = 0;
+ protected PdfPCell defaultCell = new PdfPCell((Phrase)null);
+ protected float totalWidth = 0;
+ protected float relativeWidths[];
+ protected float absoluteWidths[];
+ protected PdfPTableEvent tableEvent;
+
+/** Holds value of property headerRows. */
+ protected int headerRows;
+
+/** Holds value of property widthPercentage. */
+ protected float widthPercentage = 80;
+
+/** Holds value of property horizontalAlignment. */
+ private int horizontalAlignment = Element.ALIGN_CENTER;
+
+/** Holds value of property skipFirstHeader. */
+ private boolean skipFirstHeader = false;
+
+ protected boolean isColspan = false;
+
+ protected int runDirection = PdfWriter.RUN_DIRECTION_DEFAULT;
+
+ /**
+ * Holds value of property lockedWidth.
+ */
+ private boolean lockedWidth = false;
+
+ /**
+ * Holds value of property splitRows.
+ */
+ private boolean splitRows = true;
+
+/** The spacing before the table. */
+ protected float spacingBefore;
+
+/** The spacing after the table. */
+ protected float spacingAfter;
+
+ /**
+ * Holds value of property extendLastRow.
+ */
+ private boolean extendLastRow;
+
+ /**
+ * Holds value of property headersInEvent.
+ */
+ private boolean headersInEvent;
+
+ /**
+ * Holds value of property splitLate.
+ */
+ private boolean splitLate = true;
+
+ /**
+ * Defines if the table should be kept
+ * on one page if possible
+ */
+ private boolean keepTogether;
+
+ /**
+ * Holds value of property footerRows.
+ */
+ private int footerRows;
+
+ protected PdfPTable() {
+ }
+
+ /** Constructs a <CODE>PdfPTable</CODE> with the relative column widths.
+ * @param relativeWidths the relative column widths
+ */
+ public PdfPTable(float relativeWidths[]) {
+ if (relativeWidths == null)
+ throw new NullPointerException("The widths array in PdfPTable constructor can not be null.");
+ if (relativeWidths.length == 0)
+ throw new IllegalArgumentException("The widths array in PdfPTable constructor can not have zero length.");
+ this.relativeWidths = new float[relativeWidths.length];
+ System.arraycopy(relativeWidths, 0, this.relativeWidths, 0, relativeWidths.length);
+ absoluteWidths = new float[relativeWidths.length];
+ calculateWidths();
+ currentRow = new PdfPCell[absoluteWidths.length];
+ keepTogether = false;
+ }
+
+ /** Constructs a <CODE>PdfPTable</CODE> with <CODE>numColumns</CODE> columns.
+ * @param numColumns the number of columns
+ */
+ public PdfPTable(int numColumns) {
+ if (numColumns <= 0)
+ throw new IllegalArgumentException("The number of columns in PdfPTable constructor must be greater than zero.");
+ relativeWidths = new float[numColumns];
+ for (int k = 0; k < numColumns; ++k)
+ relativeWidths[k] = 1;
+ absoluteWidths = new float[relativeWidths.length];
+ calculateWidths();
+ currentRow = new PdfPCell[absoluteWidths.length];
+ keepTogether = false;
+ }
+
+ /** Constructs a copy of a <CODE>PdfPTable</CODE>.
+ * @param table the <CODE>PdfPTable</CODE> to be copied
+ */
+ public PdfPTable(PdfPTable table) {
+ copyFormat(table);
+ for (int k = 0; k < currentRow.length; ++k) {
+ if (table.currentRow[k] == null)
+ break;
+ currentRow[k] = new PdfPCell(table.currentRow[k]);
+ }
+ for (int k = 0; k < table.rows.size(); ++k) {
+ PdfPRow row = (PdfPRow)(table.rows.get(k));
+ if (row != null)
+ row = new PdfPRow(row);
+ rows.add(row);
+ }
+ }
+
+ /**
+ * Makes a shallow copy of a table (format without content).
+ * @param table
+ * @return a shallow copy of the table
+ */
+ public static PdfPTable shallowCopy(PdfPTable table) {
+ PdfPTable nt = new PdfPTable();
+ nt.copyFormat(table);
+ return nt;
+ }
+
+ /**
+ * Copies the format of the sourceTable without copying the content.
+ * @param sourceTable
+ */
+ private void copyFormat(PdfPTable sourceTable) {
+ relativeWidths = new float[sourceTable.relativeWidths.length];
+ absoluteWidths = new float[sourceTable.relativeWidths.length];
+ System.arraycopy(sourceTable.relativeWidths, 0, relativeWidths, 0, relativeWidths.length);
+ System.arraycopy(sourceTable.absoluteWidths, 0, absoluteWidths, 0, relativeWidths.length);
+ totalWidth = sourceTable.totalWidth;
+ totalHeight = sourceTable.totalHeight;
+ currentRowIdx = 0;
+ tableEvent = sourceTable.tableEvent;
+ runDirection = sourceTable.runDirection;
+ defaultCell = new PdfPCell(sourceTable.defaultCell);
+ currentRow = new PdfPCell[sourceTable.currentRow.length];
+ isColspan = sourceTable.isColspan;
+ splitRows = sourceTable.splitRows;
+ spacingAfter = sourceTable.spacingAfter;
+ spacingBefore = sourceTable.spacingBefore;
+ headerRows = sourceTable.headerRows;
+ footerRows = sourceTable.footerRows;
+ lockedWidth = sourceTable.lockedWidth;
+ extendLastRow = sourceTable.extendLastRow;
+ headersInEvent = sourceTable.headersInEvent;
+ widthPercentage = sourceTable.widthPercentage;
+ splitLate = sourceTable.splitLate;
+ skipFirstHeader = sourceTable.skipFirstHeader;
+ horizontalAlignment = sourceTable.horizontalAlignment;
+ keepTogether = sourceTable.keepTogether;
+ }
+
+ /** Sets the relative widths of the table.
+ * @param relativeWidths the relative widths of the table.
+ * @throws DocumentException if the number of widths is different than the number
+ * of columns
+ */
+ public void setWidths(float relativeWidths[]) throws DocumentException {
+ if (relativeWidths.length != this.relativeWidths.length)
+ throw new DocumentException("Wrong number of columns.");
+ this.relativeWidths = new float[relativeWidths.length];
+ System.arraycopy(relativeWidths, 0, this.relativeWidths, 0, relativeWidths.length);
+ absoluteWidths = new float[relativeWidths.length];
+ totalHeight = 0;
+ calculateWidths();
+ calculateHeights();
+ }
+
+ /** Sets the relative widths of the table.
+ * @param relativeWidths the relative widths of the table.
+ * @throws DocumentException if the number of widths is different than the number
+ * of columns
+ */
+ public void setWidths(int relativeWidths[]) throws DocumentException {
+ float tb[] = new float[relativeWidths.length];
+ for (int k = 0; k < relativeWidths.length; ++k)
+ tb[k] = relativeWidths[k];
+ setWidths(tb);
+ }
+
+ private void calculateWidths() {
+ if (totalWidth <= 0)
+ return;
+ float total = 0;
+ for (int k = 0; k < absoluteWidths.length; ++k) {
+ total += relativeWidths[k];
+ }
+ for (int k = 0; k < absoluteWidths.length; ++k) {
+ absoluteWidths[k] = totalWidth * relativeWidths[k] / total;
+ }
+ }
+
+ /** Sets the full width of the table.
+ * @param totalWidth the full width of the table.
+ */
+ public void setTotalWidth(float totalWidth) {
+ if (this.totalWidth == totalWidth)
+ return;
+ this.totalWidth = totalWidth;
+ totalHeight = 0;
+ calculateWidths();
+ calculateHeights();
+ }
+
+ /** Sets the full width of the table from the absolute column width.
+ * @param columnWidth the absolute width of each column
+ * @throws DocumentException if the number of widths is different than the number
+ * of columns
+ */
+ public void setTotalWidth(float columnWidth[]) throws DocumentException {
+ if (columnWidth.length != this.relativeWidths.length)
+ throw new DocumentException("Wrong number of columns.");
+ totalWidth = 0;
+ for (int k = 0; k < columnWidth.length; ++k)
+ totalWidth += columnWidth[k];
+ setWidths(columnWidth);
+ }
+
+ /** Sets the percentage width of the table from the absolute column width.
+ * @param columnWidth the absolute width of each column
+ * @param pageSize the page size
+ * @throws DocumentException
+ */
+ public void setWidthPercentage(float columnWidth[], Rectangle pageSize) throws DocumentException {
+ if (columnWidth.length != this.relativeWidths.length)
+ throw new IllegalArgumentException("Wrong number of columns.");
+ float totalWidth = 0;
+ for (int k = 0; k < columnWidth.length; ++k)
+ totalWidth += columnWidth[k];
+ widthPercentage = totalWidth / (pageSize.right() - pageSize.left()) * 100f;
+ setWidths(columnWidth);
+ }
+
+ /** Gets the full width of the table.
+ * @return the full width of the table
+ */
+ public float getTotalWidth() {
+ return totalWidth;
+ }
+
+ void calculateHeights() {
+ if (totalWidth <= 0)
+ return;
+ totalHeight = 0;
+ for (int k = 0; k < rows.size(); ++k) {
+ PdfPRow row = (PdfPRow)rows.get(k);
+ if (row != null) {
+ row.setWidths(absoluteWidths);
+ totalHeight += row.getMaxHeights();
+ }
+ }
+ }
+
+ /**
+ * Calculates the heights of the table.
+ */
+ public void calculateHeightsFast() {
+ if (totalWidth <= 0)
+ return;
+ totalHeight = 0;
+ for (int k = 0; k < rows.size(); ++k) {
+ PdfPRow row = (PdfPRow)rows.get(k);
+ if (row != null)
+ totalHeight += row.getMaxHeights();
+ }
+ }
+
+ /** Gets the default <CODE>PdfPCell</CODE> that will be used as
+ * reference for all the <CODE>addCell</CODE> methods except
+ * <CODE>addCell(PdfPCell)</CODE>.
+ * @return default <CODE>PdfPCell</CODE>
+ */
+ public PdfPCell getDefaultCell() {
+ return defaultCell;
+ }
+
+ /** Adds a cell element.
+ * @param cell the cell element
+ */
+ public void addCell(PdfPCell cell) {
+ PdfPCell ncell = new PdfPCell(cell);
+ int colspan = ncell.getColspan();
+ colspan = Math.max(colspan, 1);
+ colspan = Math.min(colspan, currentRow.length - currentRowIdx);
+ ncell.setColspan(colspan);
+ if (colspan != 1)
+ isColspan = true;
+ int rdir = ncell.getRunDirection();
+ if (rdir == PdfWriter.RUN_DIRECTION_DEFAULT)
+ ncell.setRunDirection(runDirection);
+ currentRow[currentRowIdx] = ncell;
+ currentRowIdx += colspan;
+ if (currentRowIdx >= currentRow.length) {
+ if (runDirection == PdfWriter.RUN_DIRECTION_RTL) {
+ PdfPCell rtlRow[] = new PdfPCell[absoluteWidths.length];
+ int rev = currentRow.length;
+ for (int k = 0; k < currentRow.length; ++k) {
+ PdfPCell rcell = currentRow[k];
+ int cspan = rcell.getColspan();
+ rev -= cspan;
+ rtlRow[rev] = rcell;
+ k += cspan - 1;
+ }
+ currentRow = rtlRow;
+ }
+ PdfPRow row = new PdfPRow(currentRow);
+ if (totalWidth > 0) {
+ row.setWidths(absoluteWidths);
+ totalHeight += row.getMaxHeights();
+ }
+ rows.add(row);
+ currentRow = new PdfPCell[absoluteWidths.length];
+ currentRowIdx = 0;
+ }
+ }
+
+ /** Adds a cell element.
+ * @param text the text for the cell
+ */
+ public void addCell(String text) {
+ addCell(new Phrase(text));
+ }
+
+ /**
+ * Adds a nested table.
+ * @param table the table to be added to the cell
+ */
+ public void addCell(PdfPTable table) {
+ defaultCell.setTable(table);
+ addCell(defaultCell);
+ defaultCell.setTable(null);
+ }
+
+ /**
+ * Adds an Image as Cell.
+ * @param image the <CODE>Image</CODE> to add to the table. This image will fit in the cell
+ */
+ public void addCell(Image image) {
+ defaultCell.setImage(image);
+ addCell(defaultCell);
+ defaultCell.setImage(null);
+ }
+
+ /**
+ * Adds a cell element.
+ * @param phrase the <CODE>Phrase</CODE> to be added to the cell
+ */
+ public void addCell(Phrase phrase) {
+ defaultCell.setPhrase(phrase);
+ addCell(defaultCell);
+ defaultCell.setPhrase(null);
+ }
+
+ /**
+ * Writes the selected rows to the document.
+ * <P>
+ * <CODE>canvases</CODE> is obtained from <CODE>beginWritingRows()</CODE>.
+ * @param rowStart the first row to be written, zero index
+ * @param rowEnd the last row to be written + 1. If it is -1 all the
+ * rows to the end are written
+ * @param xPos the x write coodinate
+ * @param yPos the y write coodinate
+ * @param canvases an array of 4 <CODE>PdfContentByte</CODE> obtained from
+ * <CODE>beginWrittingRows()</CODE>
+ * @return the y coordinate position of the bottom of the last row
+ * @see #beginWritingRows(com.lowagie.text.pdf.PdfContentByte)
+ */
+ public float writeSelectedRows(int rowStart, int rowEnd, float xPos, float yPos, PdfContentByte[] canvases) {
+ return writeSelectedRows(0, -1, rowStart, rowEnd, xPos, yPos, canvases);
+ }
+
+ /** Writes the selected rows and columns to the document.
+ * This method does not clip the columns; this is only important
+ * if there are columns with colspan at boundaries.
+ * <P>
+ * <CODE>canvases</CODE> is obtained from <CODE>beginWritingRows()</CODE>.
+ * <P>
+ * The table event is only fired for complete rows.
+ * @param colStart the first column to be written, zero index
+ * @param colEnd the last column to be written + 1. If it is -1 all the
+ * columns to the end are written
+ * @param rowStart the first row to be written, zero index
+ * @param rowEnd the last row to be written + 1. If it is -1 all the
+ * rows to the end are written
+ * @param xPos the x write coodinate
+ * @param yPos the y write coodinate
+ * @param canvases an array of 4 <CODE>PdfContentByte</CODE> obtained from
+ * <CODE>beginWrittingRows()</CODE>
+ * @return the y coordinate position of the bottom of the last row
+ * @see #beginWritingRows(com.lowagie.text.pdf.PdfContentByte)
+ */
+ public float writeSelectedRows(int colStart, int colEnd, int rowStart, int rowEnd, float xPos, float yPos, PdfContentByte[] canvases) {
+ if (totalWidth <= 0)
+ throw new RuntimeException("The table width must be greater than zero.");
+ int size = rows.size();
+ if (rowEnd < 0)
+ rowEnd = size;
+ rowEnd = Math.min(rowEnd, size);
+ if (rowStart < 0)
+ rowStart = 0;
+ if (rowStart >= rowEnd)
+ return yPos;
+ if (colEnd < 0)
+ colEnd = absoluteWidths.length;
+ colEnd = Math.min(colEnd, absoluteWidths.length);
+ if (colStart < 0)
+ colStart = 0;
+ colStart = Math.min(colStart, absoluteWidths.length);
+ float yPosStart = yPos;
+ for (int k = rowStart; k < rowEnd; ++k) {
+ PdfPRow row = (PdfPRow)rows.get(k);
+ if (row != null) {
+ row.writeCells(colStart, colEnd, xPos, yPos, canvases);
+ yPos -= row.getMaxHeights();
+ }
+ }
+ if (tableEvent != null && colStart == 0 && colEnd == absoluteWidths.length) {
+ float heights[] = new float[rowEnd - rowStart + 1];
+ heights[0] = yPosStart;
+ for (int k = rowStart; k < rowEnd; ++k) {
+ PdfPRow row = (PdfPRow)rows.get(k);
+ float hr = 0;
+ if (row != null)
+ hr = row.getMaxHeights();
+ heights[k - rowStart + 1] = heights[k - rowStart] - hr;
+ }
+ tableEvent.tableLayout(this, getEventWidths(xPos, rowStart, rowEnd, headersInEvent), heights, headersInEvent ? headerRows : 0, rowStart, canvases);
+ }
+ return yPos;
+ }
+
+ /**
+ * Writes the selected rows to the document.
+ *
+ * @param rowStart the first row to be written, zero index
+ * @param rowEnd the last row to be written + 1. If it is -1 all the
+ * rows to the end are written
+ * @param xPos the x write coodinate
+ * @param yPos the y write coodinate
+ * @param canvas the <CODE>PdfContentByte</CODE> where the rows will
+ * be written to
+ * @return the y coordinate position of the bottom of the last row
+ */
+ public float writeSelectedRows(int rowStart, int rowEnd, float xPos, float yPos, PdfContentByte canvas) {
+ return writeSelectedRows(0, -1, rowStart, rowEnd, xPos, yPos, canvas);
+ }
+
+ /**
+ * Writes the selected rows to the document.
+ * This method clips the columns; this is only important
+ * if there are columns with colspan at boundaries.
+ * <P>
+ * The table event is only fired for complete rows.
+ *
+ * @param colStart the first column to be written, zero index
+ * @param colEnd the last column to be written + 1. If it is -1 all the
+ * @param rowStart the first row to be written, zero index
+ * @param rowEnd the last row to be written + 1. If it is -1 all the
+ * rows to the end are written
+ * @param xPos the x write coodinate
+ * @param yPos the y write coodinate
+ * @param canvas the <CODE>PdfContentByte</CODE> where the rows will
+ * be written to
+ * @return the y coordinate position of the bottom of the last row
+ */
+ public float writeSelectedRows(int colStart, int colEnd, int rowStart, int rowEnd, float xPos, float yPos, PdfContentByte canvas) {
+ if (colEnd < 0)
+ colEnd = absoluteWidths.length;
+ colEnd = Math.min(colEnd, absoluteWidths.length);
+ if (colStart < 0)
+ colStart = 0;
+ colStart = Math.min(colStart, absoluteWidths.length);
+ if (colStart != 0 || colEnd != absoluteWidths.length) {
+ float w = 0;
+ for (int k = colStart; k < colEnd; ++k)
+ w += absoluteWidths[k];
+ canvas.saveState();
+ float lx = 0;
+ float rx = 0;
+ if (colStart == 0)
+ lx = 10000;
+ if (colEnd == absoluteWidths.length)
+ rx = 10000;
+ canvas.rectangle(xPos - lx, -10000, w + lx + rx, 20000);
+ canvas.clip();
+ canvas.newPath();
+ }
+ PdfContentByte[] canvases = beginWritingRows(canvas);
+ float y = writeSelectedRows(colStart, colEnd, rowStart, rowEnd, xPos, yPos, canvases);
+ endWritingRows(canvases);
+ if (colStart != 0 || colEnd != absoluteWidths.length)
+ canvas.restoreState();
+ return y;
+ }
+
+ /** Gets and initializes the 4 layers where the table is written to. The text or graphics are added to
+ * one of the 4 <CODE>PdfContentByte</CODE> returned with the following order:<p>
+ * <ul>
+ * <li><CODE>PdfPtable.BASECANVAS</CODE> - the original <CODE>PdfContentByte</CODE>. Anything placed here
+ * will be under the table.
+ * <li><CODE>PdfPtable.BACKGROUNDCANVAS</CODE> - the layer where the background goes to.
+ * <li><CODE>PdfPtable.LINECANVAS</CODE> - the layer where the lines go to.
+ * <li><CODE>PdfPtable.TEXTCANVAS</CODE> - the layer where the text go to. Anything placed here
+ * will be over the table.
+ * </ul><p>
+ * The layers are placed in sequence on top of each other.
+ * @param canvas the <CODE>PdfContentByte</CODE> where the rows will
+ * be written to
+ * @return an array of 4 <CODE>PdfContentByte</CODE>
+ * @see #writeSelectedRows(int, int, float, float, PdfContentByte[])
+ */
+ public static PdfContentByte[] beginWritingRows(PdfContentByte canvas) {
+ return new PdfContentByte[]{
+ canvas,
+ canvas.getDuplicate(),
+ canvas.getDuplicate(),
+ canvas.getDuplicate(),
+ };
+ }
+
+ /** Finishes writing the table.
+ * @param canvases the array returned by <CODE>beginWritingRows()</CODE>
+ */
+ public static void endWritingRows(PdfContentByte[] canvases) {
+ PdfContentByte canvas = canvases[BASECANVAS];
+ canvas.saveState();
+ canvas.add(canvases[BACKGROUNDCANVAS]);
+ canvas.restoreState();
+ canvas.saveState();
+ canvas.setLineCap(2);
+ canvas.resetRGBColorStroke();
+ canvas.add(canvases[LINECANVAS]);
+ canvas.restoreState();
+ canvas.add(canvases[TEXTCANVAS]);
+ }
+
+ /** Gets the number of rows in this table.
+ * @return the number of rows in this table
+ */
+ public int size() {
+ return rows.size();
+ }
+
+ /** Gets the total height of the table.
+ * @return the total height of the table
+ */
+ public float getTotalHeight() {
+ return totalHeight;
+ }
+
+ /** Gets the height of a particular row.
+ * @param idx the row index (starts at 0)
+ * @return the height of a particular row
+ */
+ public float getRowHeight(int idx) {
+ if (totalWidth <= 0 || idx < 0 || idx >= rows.size())
+ return 0;
+ PdfPRow row = (PdfPRow)rows.get(idx);
+ if (row == null)
+ return 0;
+ return row.getMaxHeights();
+ }
+
+ /** Gets the height of the rows that constitute the header as defined by
+ * <CODE>setHeaderRows()</CODE>.
+ * @return the height of the rows that constitute the header
+ */
+ public float getHeaderHeight() {
+ float total = 0;
+ int size = Math.min(rows.size(), headerRows);
+ for (int k = 0; k < size; ++k) {
+ PdfPRow row = (PdfPRow)rows.get(k);
+ if (row != null)
+ total += row.getMaxHeights();
+ }
+ return total;
+ }
+
+ /** Deletes a row from the table.
+ * @param rowNumber the row to be deleted
+ * @return <CODE>true</CODE> if the row was deleted
+ */
+ public boolean deleteRow(int rowNumber) {
+ if (rowNumber < 0 || rowNumber >= rows.size()) {
+ return false;
+ }
+ if (totalWidth > 0) {
+ PdfPRow row = (PdfPRow)rows.get(rowNumber);
+ if (row != null)
+ totalHeight -= row.getMaxHeights();
+ }
+ rows.remove(rowNumber);
+ return true;
+ }
+
+ /** Deletes the last row in the table.
+ * @return <CODE>true</CODE> if the last row was deleted
+ */
+ public boolean deleteLastRow() {
+ return deleteRow(rows.size() - 1);
+ }
+
+ /**
+ * Removes all of the rows except headers
+ */
+ public void deleteBodyRows() {
+ ArrayList rows2 = new ArrayList();
+ for (int k = 0; k < headerRows; ++k)
+ rows2.add(rows.get(k));
+ rows = rows2;
+ totalHeight = 0;
+ if (totalWidth > 0)
+ totalHeight = getHeaderHeight();
+ }
+
+ /** Gets the number of the rows that constitute the header.
+ * @return the number of the rows that constitute the header
+ */
+ public int getHeaderRows() {
+ return headerRows;
+ }
+
+ /** Sets the number of the top rows that constitute the header.
+ * This header has only meaning if the table is added to <CODE>Document</CODE>
+ * and the table crosses pages.
+ * @param headerRows the number of the top rows that constitute the header
+ */
+ public void setHeaderRows(int headerRows) {
+ if (headerRows < 0)
+ headerRows = 0;
+ this.headerRows = headerRows;
+ }
+
+ /**
+ * Gets all the chunks in this element.
+ *
+ * @return an <CODE>ArrayList</CODE>
+ */
+ public ArrayList getChunks() {
+ return new ArrayList();
+ }
+
+ /**
+ * Gets the type of the text element.
+ *
+ * @return a type
+ */
+ public int type() {
+ return Element.PTABLE;
+ }
+
+ /**
+ * Processes the element by adding it (or the different parts) to an
+ * <CODE>ElementListener</CODE>.
+ *
+ * @param listener an <CODE>ElementListener</CODE>
+ * @return <CODE>true</CODE> if the element was processed successfully
+ */
+ public boolean process(ElementListener listener) {
+ try {
+ return listener.add(this);
+ }
+ catch(DocumentException de) {
+ return false;
+ }
+ }
+
+ /** Gets the width percentage that the table will occupy in the page.
+ * @return the width percentage that the table will occupy in the page
+ */
+ public float getWidthPercentage() {
+ return widthPercentage;
+ }
+
+ /** Sets the width percentage that the table will occupy in the page.
+ * @param widthPercentage the width percentage that the table will occupy in the page
+ */
+ public void setWidthPercentage(float widthPercentage) {
+ this.widthPercentage = widthPercentage;
+ }
+
+ /** Gets the horizontal alignment of the table relative to the page.
+ * @return the horizontal alignment of the table relative to the page
+ */
+ public int getHorizontalAlignment() {
+ return horizontalAlignment;
+ }
+
+ /** Sets the horizontal alignment of the table relative to the page.
+ * It only has meaning if the width percentage is less than
+ * 100%.
+ * @param horizontalAlignment the horizontal alignment of the table relative to the page
+ */
+ public void setHorizontalAlignment(int horizontalAlignment) {
+ this.horizontalAlignment = horizontalAlignment;
+ }
+
+ /**
+ * Gets a row with a given index
+ * (added by Jin-Hsia Yang).
+ * @param idx
+ * @return the row at position idx
+ */
+ public PdfPRow getRow(int idx) {
+ return (PdfPRow)rows.get(idx);
+ }
+
+ /**
+ * Gets an arraylist with all the rows in the table.
+ * @return an arraylist
+ */
+ public ArrayList getRows() {
+ return rows;
+ }
+
+ /** Sets the table event for this table.
+ * @param event the table event for this table
+ */
+ public void setTableEvent(PdfPTableEvent event) {
+ if (event == null) this.tableEvent = null;
+ else if (this.tableEvent == null) this.tableEvent = event;
+ else if (this.tableEvent instanceof PdfPTableEventForwarder) ((PdfPTableEventForwarder)this.tableEvent).addTableEvent(event);
+ else {
+ PdfPTableEventForwarder forward = new PdfPTableEventForwarder();
+ forward.addTableEvent(this.tableEvent);
+ forward.addTableEvent(event);
+ this.tableEvent = forward;
+ }
+ }
+
+ /** Gets the table event for this page.
+ * @return the table event for this page
+ */
+ public PdfPTableEvent getTableEvent() {
+ return tableEvent;
+ }
+
+ /** Gets the absolute sizes of each column width.
+ * @return he absolute sizes of each column width
+ */
+ public float[] getAbsoluteWidths() {
+ return absoluteWidths;
+ }
+
+ float [][] getEventWidths(float xPos, int firstRow, int lastRow, boolean includeHeaders) {
+ if (includeHeaders) {
+ firstRow = Math.max(firstRow, headerRows);
+ lastRow = Math.max(lastRow, headerRows);
+ }
+ float widths[][] = new float[(includeHeaders ? headerRows : 0) + lastRow - firstRow][];
+ if (isColspan) {
+ int n = 0;
+ if (includeHeaders) {
+ for (int k = 0; k < headerRows; ++k) {
+ PdfPRow row = (PdfPRow)rows.get(k);
+ if (row == null)
+ ++n;
+ else
+ widths[n++] = row.getEventWidth(xPos);
+ }
+ }
+ for (; firstRow < lastRow; ++firstRow) {
+ PdfPRow row = (PdfPRow)rows.get(firstRow);
+ if (row == null)
+ ++n;
+ else
+ widths[n++] = row.getEventWidth(xPos);
+ }
+ }
+ else {
+ float width[] = new float[absoluteWidths.length + 1];
+ width[0] = xPos;
+ for (int k = 0; k < absoluteWidths.length; ++k)
+ width[k + 1] = width[k] + absoluteWidths[k];
+ for (int k = 0; k < widths.length; ++k)
+ widths[k] = width;
+ }
+ return widths;
+ }
+
+
+ /** Getter for property skipFirstHeader.
+ * @return Value of property skipFirstHeader.
+ */
+ public boolean isSkipFirstHeader() {
+ return skipFirstHeader;
+ }
+
+ /** Skips the printing of the first header. Used when printing
+ * tables in succession belonging to the same printed table aspect.
+ * @param skipFirstHeader New value of property skipFirstHeader.
+ */
+ public void setSkipFirstHeader(boolean skipFirstHeader) {
+ this.skipFirstHeader = skipFirstHeader;
+ }
+
+ /**
+ * Sets the run direction of the contents of the table.
+ * @param runDirection
+ */
+ public void setRunDirection(int runDirection) {
+ if (runDirection < PdfWriter.RUN_DIRECTION_DEFAULT || runDirection > PdfWriter.RUN_DIRECTION_RTL)
+ throw new RuntimeException("Invalid run direction: " + runDirection);
+ this.runDirection = runDirection;
+ }
+
+ /**
+ * Returns the run direction of the contents in the table.
+ * @return One of the following values: PdfWriter.RUN_DIRECTION_DEFAULT, PdfWriter.RUN_DIRECTION_NO_BIDI, PdfWriter.RUN_DIRECTION_LTR or PdfWriter.RUN_DIRECTION_RTL.
+ */
+ public int getRunDirection() {
+ return runDirection;
+ }
+
+ /**
+ * Getter for property lockedWidth.
+ * @return Value of property lockedWidth.
+ */
+ public boolean isLockedWidth() {
+ return this.lockedWidth;
+ }
+
+ /**
+ * Uses the value in <CODE>setTotalWidth()</CODE> in <CODE>Document.add()</CODE>.
+ * @param lockedWidth <CODE>true</CODE> to use the value in <CODE>setTotalWidth()</CODE> in <CODE>Document.add()</CODE>
+ */
+ public void setLockedWidth(boolean lockedWidth) {
+ this.lockedWidth = lockedWidth;
+ }
+
+ /**
+ * Gets the split value.
+ * @return true to split; false otherwise
+ */
+ public boolean isSplitRows() {
+ return this.splitRows;
+ }
+
+ /**
+ * When set the rows that won't fit in the page will be split.
+ * Note that it takes at least twice the memory to handle a split table row
+ * than a normal table. <CODE>true</CODE> by default.
+ * @param splitRows true to split; false otherwise
+ */
+ public void setSplitRows(boolean splitRows) {
+ this.splitRows = splitRows;
+ }
+
+/**
+ * Sets the spacing before this table.
+ *
+ * @param spacing the new spacing
+ */
+
+ public void setSpacingBefore(float spacing) {
+ this.spacingBefore = spacing;
+ }
+
+/**
+ * Sets the spacing after this table.
+ *
+ * @param spacing the new spacing
+ */
+
+ public void setSpacingAfter(float spacing) {
+ this.spacingAfter = spacing;
+ }
+
+/**
+ * Gets the spacing before this table.
+ *
+ * @return the spacing
+ */
+
+ public float spacingBefore() {
+ return spacingBefore;
+ }
+
+/**
+ * Gets the spacing before this table.
+ *
+ * @return the spacing
+ */
+
+ public float spacingAfter() {
+ return spacingAfter;
+ }
+
+ /**
+ * Gets the value of the last row extension.
+ * @return true if the last row will extend; false otherwise
+ */
+ public boolean isExtendLastRow() {
+ return this.extendLastRow;
+ }
+
+ /**
+ * When set the last row will be extended to fill all the remaining space to the
+ * bottom boundary.
+ * @param extendLastRow true to extend the last row; false otherwise
+ */
+ public void setExtendLastRow(boolean extendLastRow) {
+ this.extendLastRow = extendLastRow;
+ }
+
+ /**
+ * Gets the header status inclusion in PdfPTableEvent.
+ * @return true if the headers are included; false otherwise
+ */
+ public boolean isHeadersInEvent() {
+ return this.headersInEvent;
+ }
+
+ /**
+ * When set the PdfPTableEvent will include the headers.
+ * @param headersInEvent true to include the headers; false otherwise
+ */
+ public void setHeadersInEvent(boolean headersInEvent) {
+ this.headersInEvent = headersInEvent;
+ }
+
+ /**
+ * Gets the property splitLate.
+ * @return the property splitLate
+ */
+ public boolean isSplitLate() {
+ return this.splitLate;
+ }
+
+ /**
+ * If true the row will only split if it's the first one in an empty page.
+ * It's true by default.
+ *<p>
+ * It's only meaningful if setSplitRows(true).
+ * @param splitLate the property value
+ */
+ public void setSplitLate(boolean splitLate) {
+ this.splitLate = splitLate;
+ }
+
+ /**
+ * If true the table will be kept on one page if it fits, by forcing a
+ * new page if it doesn't fit on the current page. The default is to
+ * split the table over multiple pages.
+ *
+ * @param p_KeepTogether whether to try to keep the table on one page
+ */
+ public void setKeepTogether(boolean p_KeepTogether) {
+ keepTogether = p_KeepTogether;
+ }
+
+ public boolean getKeepTogether() {
+ return keepTogether;
+ }
+
+ /**
+ * Gets the number of rows in the footer.
+ * @return the number of rows in the footer
+ */
+ public int getFooterRows() {
+ return this.footerRows;
+ }
+
+ /**
+ * Sets the number of rows to be used for the footer. The number
+ * of footer rows are subtracted from the header rows. For
+ * example, for a table with two header rows and one footer row the
+ * code would be:
+ * <p>
+ * <PRE>
+ * table.setHeaderRows(3);
+ * table.setFooterRows(1);
+ * </PRE>
+ * <p>
+ * Row 0 and 1 will be the header rows and row 2 will be the footer row.
+ * @param footerRows the number of rows to be used for the footer
+ */
+ public void setFooterRows(int footerRows) {
+ if (footerRows < 0)
+ footerRows = 0;
+ this.footerRows = footerRows;
+ }
+
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/pdf/PdfPTableEvent.java b/src/main/java/com/lowagie/text/pdf/PdfPTableEvent.java
new file mode 100644
index 0000000..9ae90ff
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/PdfPTableEvent.java
@@ -0,0 +1,94 @@
+/*
+ * $Id: PdfPTableEvent.java,v 1.45 2005/05/04 14:32:42 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2001, 2002 Paulo Soares
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf;
+
+/** An interface that can be used to retrieve the position of cells in <CODE>PdfPTable</CODE>.
+ *
+ * @author Paulo Soares (psoares@consiste.pt)
+ */
+public interface PdfPTableEvent {
+
+ /** This method is called at the end of the table rendering. The text or graphics are added to
+ * one of the 4 <CODE>PdfContentByte</CODE> contained in
+ * <CODE>canvases</CODE>.<br>
+ * The indexes to <CODE>canvases</CODE> are:<p>
+ * <ul>
+ * <li><CODE>PdfPTable.BASECANVAS</CODE> - the original <CODE>PdfContentByte</CODE>. Anything placed here
+ * will be under the table.
+ * <li><CODE>PdfPTable.BACKGROUNDCANVAS</CODE> - the layer where the background goes to.
+ * <li><CODE>PdfPTable.LINECANVAS</CODE> - the layer where the lines go to.
+ * <li><CODE>PdfPTable.TEXTCANVAS</CODE> - the layer where the text go to. Anything placed here
+ * will be over the table.
+ * </ul>
+ * The layers are placed in sequence on top of each other.
+ * <p>
+ * The <CODE>widths</CODE> and <CODE>heights</CODE> have the coordinates of the cells.<br>
+ * The size of the <CODE>widths</CODE> array is the number of rows.
+ * Each sub-array in <CODE>widths</CODE> corresponds to the x column border positions where
+ * the first element is the x coordinate of the left table border and the last
+ * element is the x coordinate of the right table border.
+ * If colspan is not used all the sub-arrays in <CODE>widths</CODE>
+ * are the same.<br>
+ * For the <CODE>heights</CODE> the first element is the y coordinate of the top table border and the last
+ * element is the y coordinate of the bottom table border.
+ * @param table the <CODE>PdfPTable</CODE> in use
+ * @param widths an array of arrays with the cells' x positions. It has the length of the number
+ * of rows
+ * @param heights an array with the cells' y positions. It has a length of the number
+ * of rows + 1
+ * @param headerRows the number of rows defined for the header.
+ * @param rowStart the first row number after the header
+ * @param canvases an array of <CODE>PdfContentByte</CODE>
+ */
+ public void tableLayout(PdfPTable table, float widths[][], float heights[], int headerRows, int rowStart, PdfContentByte[] canvases);
+
+}
+
diff --git a/src/main/java/com/lowagie/text/pdf/PdfPage.java b/src/main/java/com/lowagie/text/pdf/PdfPage.java
new file mode 100644
index 0000000..80e5472
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/PdfPage.java
@@ -0,0 +1,197 @@
+/*
+ * $Id: PdfPage.java,v 1.48 2006/02/16 16:17:52 psoares33 Exp $
+ * $Name: $
+ *
+ * Copyright 1999, 2000, 2001, 2002 Bruno Lowagie
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf;
+import java.util.HashMap;
+/**
+ * <CODE>PdfPage</CODE> is the PDF Page-object.
+ * <P>
+ * A Page object is a dictionary whose keys describe a single page containing text,
+ * graphics, and images. A Page onjects is a leaf of the Pages tree.<BR>
+ * This object is described in the 'Portable Document Format Reference Manual version 1.3'
+ * section 6.4 (page 73-81)
+ *
+ * @see PdfPages
+ */
+
+public class PdfPage extends PdfDictionary {
+
+ private static final String boxStrings[] = {"crop", "trim", "art", "bleed"};
+ private static final PdfName boxNames[] = {PdfName.CROPBOX, PdfName.TRIMBOX, PdfName.ARTBOX, PdfName.BLEEDBOX};
+ // membervariables
+
+/** value of the <B>Rotate</B> key for a page in PORTRAIT */
+ public static final PdfNumber PORTRAIT = new PdfNumber(0);
+
+/** value of the <B>Rotate</B> key for a page in LANDSCAPE */
+ public static final PdfNumber LANDSCAPE = new PdfNumber(90);
+
+/** value of the <B>Rotate</B> key for a page in INVERTEDPORTRAIT */
+ public static final PdfNumber INVERTEDPORTRAIT = new PdfNumber(180);
+
+/** value of the <B>Rotate</B> key for a page in SEASCAPE */
+ public static final PdfNumber SEASCAPE = new PdfNumber(270);
+
+/** value of the <B>MediaBox</B> key */
+ PdfRectangle mediaBox;
+
+ // constructors
+
+/**
+ * Constructs a <CODE>PdfPage</CODE>.
+ *
+ * @param mediaBox a value for the <B>MediaBox</B> key
+ * @param resources an indirect reference to a <CODE>PdfResources</CODE>-object
+ * @param rotate a value for the <B>Rotate</B> key
+ */
+
+// PdfPage(PdfRectangle mediaBox, Rectangle cropBox, PdfIndirectReference resources, PdfNumber rotate) {
+// super(PAGE);
+// this.mediaBox = mediaBox;
+// put(PdfName.MEDIABOX, mediaBox);
+// put(PdfName.RESOURCES, resources);
+// if (rotate != null) {
+// put(PdfName.ROTATE, rotate);
+// }
+// if (cropBox != null)
+// put(PdfName.CROPBOX, new PdfRectangle(cropBox));
+// }
+
+/**
+ * Constructs a <CODE>PdfPage</CODE>.
+ *
+ * @param mediaBox a value for the <B>MediaBox</B> key
+ * @param resources an indirect reference to a <CODE>PdfResources</CODE>-object
+ * @param rotate a value for the <B>Rotate</B> key
+ */
+
+ PdfPage(PdfRectangle mediaBox, HashMap boxSize, PdfDictionary resources, int rotate) {
+ super(PAGE);
+ this.mediaBox = mediaBox;
+ put(PdfName.MEDIABOX, mediaBox);
+ put(PdfName.RESOURCES, resources);
+ if (rotate != 0) {
+ put(PdfName.ROTATE, new PdfNumber(rotate));
+ }
+ for (int k = 0; k < boxStrings.length; ++k) {
+ PdfObject rect = (PdfObject)boxSize.get(boxStrings[k]);
+ if (rect != null)
+ put(boxNames[k], rect);
+ }
+ }
+
+/**
+ * Constructs a <CODE>PdfPage</CODE>.
+ *
+ * @param mediaBox a value for the <B>MediaBox</B> key
+ * @param resources an indirect reference to a <CODE>PdfResources</CODE>-object
+ */
+
+// PdfPage(PdfRectangle mediaBox, Rectangle cropBox, PdfIndirectReference resources) {
+// this(mediaBox, cropBox, resources, null);
+// }
+
+/**
+ * Constructs a <CODE>PdfPage</CODE>.
+ *
+ * @param mediaBox a value for the <B>MediaBox</B> key
+ * @param resources an indirect reference to a <CODE>PdfResources</CODE>-object
+ */
+
+ PdfPage(PdfRectangle mediaBox, HashMap boxSize, PdfDictionary resources) {
+ this(mediaBox, boxSize, resources, 0);
+ }
+
+/**
+ * Checks if this page element is a tree of pages.
+ * <P>
+ * This method allways returns <CODE>false</CODE>.
+ *
+ * @return <CODE>false</CODE> because this is a single page
+ */
+
+ public boolean isParent() {
+ return false;
+ }
+
+ // methods
+
+/**
+ * Adds an indirect reference pointing to a <CODE>PdfContents</CODE>-object.
+ *
+ * @param contents an indirect reference to a <CODE>PdfContents</CODE>-object
+ */
+
+ void add(PdfIndirectReference contents) {
+ put(PdfName.CONTENTS, contents);
+ }
+
+/**
+ * Rotates the mediabox, but not the text in it.
+ *
+ * @return a <CODE>PdfRectangle</CODE>
+ */
+
+ PdfRectangle rotateMediaBox() {
+ this.mediaBox = mediaBox.rotate();
+ put(PdfName.MEDIABOX, this.mediaBox);
+ return this.mediaBox;
+ }
+
+/**
+ * Returns the MediaBox of this Page.
+ *
+ * @return a <CODE>PdfRectangle</CODE>
+ */
+
+ PdfRectangle getMediaBox() {
+ return mediaBox;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/pdf/PdfPageElement.java b/src/main/java/com/lowagie/text/pdf/PdfPageElement.java
new file mode 100644
index 0000000..86edcae
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/PdfPageElement.java
@@ -0,0 +1,78 @@
+/*
+ * $Id: PdfPageElement.java,v 1.56 2005/05/04 14:33:11 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 1999, 2000, 2001, 2002 Bruno Lowagie
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf;
+
+/**
+ * The <CODE>PdfPageElement</CODE> interface has to be implemented by <CODE>PdfPage</CODE> and <CODE>PdfPages</CODE>.
+ *
+ * @see PdfPage
+ * @see PdfPages
+ */
+
+interface PdfPageElement {
+
+/**
+ * Set the value for the <B>Parent</B> key in the Page or Pages Dictionary.
+ *
+ * @param reference an indirect reference to a <CODE>PdfPages</CODE>-object
+ */
+
+ public void setParent(PdfIndirectReference reference);
+
+/**
+ * Checks if this page element is a tree of pages.
+ *
+ * @return <CODE>true</CODE> if it's a tree of pages;
+ * <CODE>false</CODE> if it's a single page
+ */
+
+ public boolean isParent();
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/pdf/PdfPageEvent.java b/src/main/java/com/lowagie/text/pdf/PdfPageEvent.java
new file mode 100644
index 0000000..5ac89c8
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/PdfPageEvent.java
@@ -0,0 +1,190 @@
+/*
+ * $Id: PdfPageEvent.java,v 1.56 2005/05/04 14:31:45 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2001, 2002 Paulo Soares
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf;
+import com.lowagie.text.Document;
+import com.lowagie.text.Rectangle;
+import com.lowagie.text.Paragraph;
+
+/**
+ * Allows a class to catch several document events.
+ *<p>
+ * Note: do not use Document.add() inside a page event.
+ *
+ * @author Paulo Soares (psoares@consiste.pt)
+ */
+
+public interface PdfPageEvent {
+
+/**
+ * Called when the document is opened.
+ *
+ * @param writer the <CODE>PdfWriter</CODE> for this document
+ * @param document the document
+ */
+ public void onOpenDocument(PdfWriter writer, Document document);
+
+/**
+ * Called when a page is initialized.
+ * <P>
+ * Note that if even if a page is not written this method is still
+ * called. It is preferable to use <CODE>onEndPage</CODE> to avoid
+ * infinite loops.
+ *
+ * @param writer the <CODE>PdfWriter</CODE> for this document
+ * @param document the document
+ */
+ public void onStartPage(PdfWriter writer, Document document);
+
+/**
+ * Called when a page is finished, just before being written to the document.
+ *
+ * @param writer the <CODE>PdfWriter</CODE> for this document
+ * @param document the document
+ */
+ public void onEndPage(PdfWriter writer, Document document);
+
+/**
+ * Called when the document is closed.
+ * <P>
+ * Note that this method is called with the page number equal
+ * to the last page plus one.
+ *
+ * @param writer the <CODE>PdfWriter</CODE> for this document
+ * @param document the document
+ */
+ public void onCloseDocument(PdfWriter writer, Document document);
+
+/**
+ * Called when a Paragraph is written.
+ * <P>
+ * <CODE>paragraphPosition</CODE> will hold the height at which the
+ * paragraph will be written to. This is useful to insert bookmarks with
+ * more control.
+ *
+ * @param writer the <CODE>PdfWriter</CODE> for this document
+ * @param document the document
+ * @param paragraphPosition the position the paragraph will be written to
+ */
+ public void onParagraph(PdfWriter writer, Document document, float paragraphPosition);
+
+/**
+ * Called when a Paragraph is written.
+ * <P>
+ * <CODE>paragraphPosition</CODE> will hold the height of the end of the paragraph.
+ *
+ * @param writer the <CODE>PdfWriter</CODE> for this document
+ * @param document the document
+ * @param paragraphPosition the position of the end of the paragraph
+ */
+ public void onParagraphEnd(PdfWriter writer,Document document,float paragraphPosition);
+
+/**
+ * Called when a Chapter is written.
+ * <P>
+ * <CODE>position</CODE> will hold the height at which the
+ * chapter will be written to.
+ *
+ * @param writer the <CODE>PdfWriter</CODE> for this document
+ * @param document the document
+ * @param paragraphPosition the position the chapter will be written to
+ * @param title the title of the Chapter
+ */
+ public void onChapter(PdfWriter writer,Document document,float paragraphPosition, Paragraph title);
+
+/**
+ * Called when the end of a Chapter is reached.
+ * <P>
+ * <CODE>position</CODE> will hold the height of the end of the chapter.
+ *
+ * @param writer the <CODE>PdfWriter</CODE> for this document
+ * @param document the document
+ * @param paragraphPosition the position the chapter will be written to
+ */
+ public void onChapterEnd(PdfWriter writer,Document document,float paragraphPosition);
+
+/**
+ * Called when a Section is written.
+ * <P>
+ * <CODE>position</CODE> will hold the height at which the
+ * section will be written to.
+ *
+ * @param writer the <CODE>PdfWriter</CODE> for this document
+ * @param document the document
+ * @param paragraphPosition the position the section will be written to
+ * @param depth the number depth of the section
+ * @param title the title of the section
+ */
+ public void onSection(PdfWriter writer,Document document,float paragraphPosition, int depth, Paragraph title);
+
+/**
+ * Called when the end of a Section is reached.
+ * <P>
+ * <CODE>position</CODE> will hold the height of the section end.
+ *
+ * @param writer the <CODE>PdfWriter</CODE> for this document
+ * @param document the document
+ * @param paragraphPosition the position the section will be written to
+ */
+ public void onSectionEnd(PdfWriter writer,Document document,float paragraphPosition);
+
+/**
+ * Called when a <CODE>Chunk</CODE> with a generic tag is written.
+ * <P>
+ * It is usefull to pinpoint the <CODE>Chunk</CODE> location to generate
+ * bookmarks, for example.
+ *
+ * @param writer the <CODE>PdfWriter</CODE> for this document
+ * @param document the document
+ * @param rect the <CODE>Rectangle</CODE> containing the <CODE>Chunk</CODE>
+ * @param text the text of the tag
+ */
+ public void onGenericTag(PdfWriter writer, Document document, Rectangle rect, String text);
+}
diff --git a/src/main/java/com/lowagie/text/pdf/PdfPageEventHelper.java b/src/main/java/com/lowagie/text/pdf/PdfPageEventHelper.java
new file mode 100644
index 0000000..e1921ed
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/PdfPageEventHelper.java
@@ -0,0 +1,202 @@
+/*
+ * $Id: PdfPageEventHelper.java,v 1.56 2005/05/04 14:31:45 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2001, 2002 Paulo Soares
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf;
+import com.lowagie.text.Document;
+import com.lowagie.text.Rectangle;
+import com.lowagie.text.Paragraph;
+
+/**
+ * Helps the use of <CODE>PdfPageEvent</CODE> by implementing all the interface methods.
+ * A class can extend <CODE>PdfPageEventHelper</CODE> and only implement the
+ * needed methods.
+ *<p>
+ * Note: do not use Document.add() inside a page event.
+ * @author Paulo Soares (psoares@consiste.pt)
+ */
+
+public class PdfPageEventHelper implements PdfPageEvent {
+
+/**
+ * Called when the document is opened.
+ *
+ * @param writer the <CODE>PdfWriter</CODE> for this document
+ * @param document the document
+ */
+ public void onOpenDocument(PdfWriter writer,Document document) {
+ }
+
+/**
+ * Called when a page is initialized.
+ * <P>
+ * Note that if even if a page is not written this method is still
+ * called. It is preferable to use <CODE>onEndPage</CODE> to avoid
+ * infinite loops.
+ *
+ * @param writer the <CODE>PdfWriter</CODE> for this document
+ * @param document the document
+ */
+ public void onStartPage(PdfWriter writer,Document document) {
+ }
+
+/**
+ * Called when a page is finished, just before being written to the document.
+ *
+ * @param writer the <CODE>PdfWriter</CODE> for this document
+ * @param document the document
+ */
+ public void onEndPage(PdfWriter writer,Document document) {
+ }
+
+/**
+ * Called when the document is closed.
+ * <P>
+ * Note that this method is called with the page number equal
+ * to the last page plus one.
+ *
+ * @param writer the <CODE>PdfWriter</CODE> for this document
+ * @param document the document
+ */
+ public void onCloseDocument(PdfWriter writer,Document document) {
+ }
+
+/**
+ * Called when a Paragraph is written.
+ * <P>
+ * <CODE>paragraphPosition</CODE> will hold the height at which the
+ * paragraph will be written to. This is useful to insert bookmarks with
+ * more control.
+ *
+ * @param writer the <CODE>PdfWriter</CODE> for this document
+ * @param document the document
+ * @param paragraphPosition the position the paragraph will be written to
+ */
+ public void onParagraph(PdfWriter writer,Document document,float paragraphPosition) {
+ }
+
+/**
+ * Called when a Paragraph is written.
+ * <P>
+ * <CODE>paragraphPosition</CODE> will hold the height of the end of the paragraph.
+ *
+ * @param writer the <CODE>PdfWriter</CODE> for this document
+ * @param document the document
+ * @param paragraphPosition the position of the end of the paragraph
+ */
+ public void onParagraphEnd(PdfWriter writer,Document document,float paragraphPosition) {
+ }
+
+/**
+ * Called when a Chapter is written.
+ * <P>
+ * <CODE>position</CODE> will hold the height at which the
+ * chapter will be written to.
+ *
+ * @param writer the <CODE>PdfWriter</CODE> for this document
+ * @param document the document
+ * @param paragraphPosition the position the chapter will be written to
+ * @param title the title of the Chapter
+ */
+ public void onChapter(PdfWriter writer,Document document,float paragraphPosition,Paragraph title) {
+ }
+
+/**
+ * Called when the end of a Chapter is reached.
+ * <P>
+ * <CODE>position</CODE> will hold the height of the end of the chapter.
+ *
+ * @param writer the <CODE>PdfWriter</CODE> for this document
+ * @param document the document
+ * @param position the position of the end of the chapter.
+ */
+ public void onChapterEnd(PdfWriter writer,Document document,float position) {
+ }
+
+/**
+ * Called when a Section is written.
+ * <P>
+ * <CODE>position</CODE> will hold the height at which the
+ * section will be written to.
+ *
+ * @param writer the <CODE>PdfWriter</CODE> for this document
+ * @param document the document
+ * @param paragraphPosition the position the section will be written to
+ * @param depth the number depth of the Section
+ * @param title the title of the section
+ */
+ public void onSection(PdfWriter writer,Document document,float paragraphPosition,int depth,Paragraph title) {
+ }
+
+/**
+ * Called when the end of a Section is reached.
+ * <P>
+ * <CODE>position</CODE> will hold the height of the section end.
+ *
+ * @param writer the <CODE>PdfWriter</CODE> for this document
+ * @param document the document
+ * @param position the position of the end of the section
+ */
+ public void onSectionEnd(PdfWriter writer,Document document,float position) {
+ }
+
+/**
+ * Called when a <CODE>Chunk</CODE> with a generic tag is written.
+ * <P>
+ * It is usefull to pinpoint the <CODE>Chunk</CODE> location to generate
+ * bookmarks, for example.
+ *
+ * @param writer the <CODE>PdfWriter</CODE> for this document
+ * @param document the document
+ * @param rect the <CODE>Rectangle</CODE> containing the <CODE>Chunk</CODE>
+ * @param text the text of the tag
+ */
+ public void onGenericTag(PdfWriter writer,Document document,Rectangle rect,String text) {
+ }
+}
diff --git a/src/main/java/com/lowagie/text/pdf/PdfPageLabels.java b/src/main/java/com/lowagie/text/pdf/PdfPageLabels.java
new file mode 100644
index 0000000..2c3bf28
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/PdfPageLabels.java
@@ -0,0 +1,191 @@
+/*
+ * $Id: PdfPageLabels.java,v 1.46 2005/05/04 14:32:31 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2001, 2002 Paulo Soares
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf;
+
+import java.util.Comparator;
+import java.util.TreeMap;
+import java.util.Iterator;
+
+/** Page labels are used to identify each
+ * page visually on the screen or in print.
+ * @author Paulo Soares (psoares@consiste.pt)
+ */
+public class PdfPageLabels implements Comparator {
+
+ /** Logical pages will have the form 1,2,3,...
+ */
+ public static int DECIMAL_ARABIC_NUMERALS = 0;
+ /** Logical pages will have the form I,II,III,IV,...
+ */
+ public static int UPPERCASE_ROMAN_NUMERALS = 1;
+ /** Logical pages will have the form i,ii,iii,iv,...
+ */
+ public static int LOWERCASE_ROMAN_NUMERALS = 2;
+ /** Logical pages will have the form of uppercase letters
+ * (A to Z for the first 26 pages, AA to ZZ for the next 26, and so on)
+ */
+ public static int UPPERCASE_LETTERS = 3;
+ /** Logical pages will have the form of uppercase letters
+ * (a to z for the first 26 pages, aa to zz for the next 26, and so on)
+ */
+ public static int LOWERCASE_LETTERS = 4;
+ /** No logical page numbers are generated but fixed text may
+ * still exist
+ */
+ public static int EMPTY = 5;
+ /** Dictionary values to set the logical page styles
+ */
+ static PdfName numberingStyle[] = new PdfName[]{PdfName.D, PdfName.R,
+ new PdfName("r"), PdfName.A, new PdfName("a")};
+ /** The sequence of logical pages. Will contain at least a value for page 1
+ */
+ TreeMap map;
+
+ /** Creates a new PdfPageLabel with a default logical page 1
+ */
+ public PdfPageLabels() {
+ map = new TreeMap(this);
+ addPageLabel(1, DECIMAL_ARABIC_NUMERALS, null, 1);
+ }
+
+ /** Compares two <CODE>Integer</CODE>.
+ * @param obj the first <CODE>Integer</CODE>
+ * @param obj1 the second <CODE>Integer</CODE>
+ * @return a negative integer, zero, or a positive integer as the first argument is less than, equal to, or greater than the second
+ */
+ public int compare(Object obj, Object obj1) {
+ int v1 = ((Integer)obj).intValue();
+ int v2 = ((Integer)obj1).intValue();
+ if (v1 < v2)
+ return -1;
+ if (v1 == v2)
+ return 0;
+ return 1;
+ }
+
+ /** Not used
+ * @param obj not used
+ * @return always <CODE>true</CODE>
+ */
+ public boolean equals(Object obj) {
+ return true;
+ }
+
+ /** Adds or replaces a page label.
+ * @param page the real page to start the numbering. First page is 1
+ * @param numberStyle the numbering style such as LOWERCASE_ROMAN_NUMERALS
+ * @param text the text to prefix the number. Can be <CODE>null</CODE> or empty
+ * @param firstPage the first logical page number
+ */
+ public void addPageLabel(int page, int numberStyle, String text, int firstPage) {
+ if (page < 1 || firstPage < 1)
+ throw new IllegalArgumentException("In a page label the page numbers must be greater or equal to 1.");
+ PdfName pdfName = null;
+ if (numberStyle >= 0 && numberStyle < numberingStyle.length)
+ pdfName = numberingStyle[numberStyle];
+ Integer iPage = new Integer(page);
+ Object obj = new Object[]{iPage, pdfName, text, new Integer(firstPage)};
+ map.put(iPage, obj);
+ }
+
+ /** Adds or replaces a page label. The first logical page has the default
+ * of 1.
+ * @param page the real page to start the numbering. First page is 1
+ * @param numberStyle the numbering style such as LOWERCASE_ROMAN_NUMERALS
+ * @param text the text to prefix the number. Can be <CODE>null</CODE> or empty
+ */
+ public void addPageLabel(int page, int numberStyle, String text) {
+ addPageLabel(page, numberStyle, text, 1);
+ }
+
+ /** Adds or replaces a page label. There is no text prefix and the first
+ * logical page has the default of 1.
+ * @param page the real page to start the numbering. First page is 1
+ * @param numberStyle the numbering style such as LOWERCASE_ROMAN_NUMERALS
+ */
+ public void addPageLabel(int page, int numberStyle) {
+ addPageLabel(page, numberStyle, null, 1);
+ }
+
+ /** Removes a page label. The first page label can not be removed, only changed.
+ * @param page the real page to remove
+ */
+ public void removePageLabel(int page) {
+ if (page <= 1)
+ return;
+ map.remove(new Integer(page));
+ }
+
+ /** Gets the page label dictionary to insert into the document.
+ * @return the page label dictionary
+ */
+ PdfDictionary getDictionary() {
+ PdfDictionary dic = new PdfDictionary();
+ PdfArray array = new PdfArray();
+ for (Iterator it = map.values().iterator(); it.hasNext();) {
+ Object obj[] = (Object[])it.next();
+ PdfDictionary subDic = new PdfDictionary();
+ PdfName pName = (PdfName)obj[1];
+ if (pName != null)
+ subDic.put(PdfName.S, pName);
+ String text = (String)obj[2];
+ if (text != null)
+ subDic.put(PdfName.P, new PdfString(text, PdfObject.TEXT_UNICODE));
+ int st = ((Integer)obj[3]).intValue();
+ if (st != 1)
+ subDic.put(PdfName.ST, new PdfNumber(st));
+ array.add(new PdfNumber(((Integer)obj[0]).intValue() - 1));
+ array.add(subDic);
+ }
+ dic.put(PdfName.NUMS, array);
+ return dic;
+ }
+}
diff --git a/src/main/java/com/lowagie/text/pdf/PdfPages.java b/src/main/java/com/lowagie/text/pdf/PdfPages.java
new file mode 100644
index 0000000..cdc85a3
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/PdfPages.java
@@ -0,0 +1,205 @@
+/*
+ * $Id: PdfPages.java,v 1.58 2006/02/16 16:17:52 psoares33 Exp $
+ * $Name: $
+ *
+ * Copyright 1999, 2000, 2001, 2002 Bruno Lowagie
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf;
+
+import java.io.IOException;
+import java.util.ArrayList;
+
+import com.lowagie.text.DocumentException;
+import com.lowagie.text.ExceptionConverter;
+
+/**
+ * <CODE>PdfPages</CODE> is the PDF Pages-object.
+ * <P>
+ * The Pages of a document are accessible through a tree of nodes known as the Pages tree.
+ * This tree defines the ordering of the pages in the document.<BR>
+ * This object is described in the 'Portable Document Format Reference Manual version 1.3'
+ * section 6.3 (page 71-73)
+ *
+ * @see PdfPage
+ */
+
+public class PdfPages {
+
+ private ArrayList pages = new ArrayList();
+ private ArrayList parents = new ArrayList();
+ private int leafSize = 10;
+ private PdfWriter writer;
+ private PdfIndirectReference topParent;
+
+ // constructors
+
+/**
+ * Constructs a <CODE>PdfPages</CODE>-object.
+ */
+
+ PdfPages(PdfWriter writer) {
+ this.writer = writer;
+ }
+
+ void addPage(PdfDictionary page) {
+ try {
+ if ((pages.size() % leafSize) == 0)
+ parents.add(writer.getPdfIndirectReference());
+ PdfIndirectReference parent = (PdfIndirectReference)parents.get(parents.size() - 1);
+ page.put(PdfName.PARENT, parent);
+ PdfIndirectReference current = writer.getCurrentPage();
+ writer.addToBody(page, current);
+ pages.add(current);
+ }
+ catch (Exception e) {
+ throw new ExceptionConverter(e);
+ }
+ }
+
+ PdfIndirectReference addPageRef(PdfIndirectReference pageRef) {
+ try {
+ if ((pages.size() % leafSize) == 0)
+ parents.add(writer.getPdfIndirectReference());
+ pages.add(pageRef);
+ return (PdfIndirectReference)parents.get(parents.size() - 1);
+ }
+ catch (Exception e) {
+ throw new ExceptionConverter(e);
+ }
+ }
+
+ // returns the top parent to include in the catalog
+ PdfIndirectReference writePageTree() throws IOException {
+ if (pages.size() == 0)
+ throw new IOException("The document has no pages.");
+ int leaf = 1;
+ ArrayList tParents = parents;
+ ArrayList tPages = pages;
+ ArrayList nextParents = new ArrayList();
+ while (true) {
+ leaf *= leafSize;
+ int stdCount = leafSize;
+ int rightCount = tPages.size() % leafSize;
+ if (rightCount == 0)
+ rightCount = leafSize;
+ for (int p = 0; p < tParents.size(); ++p) {
+ int count;
+ int thisLeaf = leaf;
+ if (p == tParents.size() - 1) {
+ count = rightCount;
+ thisLeaf = pages.size() % leaf;
+ if (thisLeaf == 0)
+ thisLeaf = leaf;
+ }
+ else
+ count = stdCount;
+ PdfDictionary top = new PdfDictionary(PdfName.PAGES);
+ top.put(PdfName.COUNT, new PdfNumber(thisLeaf));
+ PdfArray kids = new PdfArray();
+ ArrayList internal = kids.getArrayList();
+ internal.addAll(tPages.subList(p * stdCount, p * stdCount + count));
+ top.put(PdfName.KIDS, kids);
+ if (tParents.size() > 1) {
+ if ((p % leafSize) == 0)
+ nextParents.add(writer.getPdfIndirectReference());
+ top.put(PdfName.PARENT, (PdfIndirectReference)nextParents.get(p / leafSize));
+ }
+ writer.addToBody(top, (PdfIndirectReference)tParents.get(p));
+ }
+ if (tParents.size() == 1) {
+ topParent = (PdfIndirectReference)tParents.get(0);
+ return topParent;
+ }
+ tPages = tParents;
+ tParents = nextParents;
+ nextParents = new ArrayList();
+ }
+ }
+
+ PdfIndirectReference getTopParent() {
+ return topParent;
+ }
+
+ void setLinearMode(PdfIndirectReference topParent) {
+ if (parents.size() > 1)
+ throw new RuntimeException("Linear page mode can only be called with a single parent.");
+ if (topParent != null) {
+ this.topParent = topParent;
+ parents.clear();
+ parents.add(topParent);
+ }
+ leafSize = 10000000;
+ }
+
+ void addPage(PdfIndirectReference page) {
+ pages.add(page);
+ }
+
+ int reorderPages(int order[]) throws DocumentException {
+ if (order == null)
+ return pages.size();
+ if (parents.size() > 1)
+ throw new DocumentException("Page reordering requires a single parent in the page tree. Call PdfWriter.setLinearMode() after open.");
+ if (order.length != pages.size())
+ throw new DocumentException("Page reordering requires an array with the same size as the number of pages.");
+ int max = pages.size();
+ boolean temp[] = new boolean[max];
+ for (int k = 0; k < max; ++k) {
+ int p = order[k];
+ if (p < 1 || p > max)
+ throw new DocumentException("Page reordering requires pages between 1 and " + max + ". Found " + p + ".");
+ if (temp[p - 1])
+ throw new DocumentException("Page reordering requires no page repetition. Page " + p + " is repeated.");
+ temp[p - 1] = true;
+ }
+ Object copy[] = pages.toArray();
+ for (int k = 0; k < max; ++k) {
+ pages.set(k, copy[order[k] - 1]);
+ }
+ return max;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/pdf/PdfPattern.java b/src/main/java/com/lowagie/text/pdf/PdfPattern.java
new file mode 100644
index 0000000..f2aab31
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/PdfPattern.java
@@ -0,0 +1,83 @@
+/*
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+package com.lowagie.text.pdf;
+
+import com.lowagie.text.ExceptionConverter;
+
+/**
+ * A <CODE>PdfPattern</CODE> defines a ColorSpace
+ *
+ * @see PdfStream
+ */
+
+public class PdfPattern extends PdfStream {
+
+ PdfPattern(PdfPatternPainter painter) {
+ super();
+ PdfNumber one = new PdfNumber(1);
+ PdfArray matrix = painter.getMatrix();
+ if ( matrix != null ) {
+ put(PdfName.MATRIX, matrix);
+ }
+ put(PdfName.TYPE, PdfName.PATTERN);
+ put(PdfName.BBOX, new PdfRectangle(painter.getBoundingBox()));
+ put(PdfName.RESOURCES, painter.getResources());
+ put(PdfName.TILINGTYPE, one);
+ put(PdfName.PATTERNTYPE, one);
+ if (painter.isStencil())
+ put(PdfName.PAINTTYPE, new PdfNumber(2));
+ else
+ put(PdfName.PAINTTYPE, one);
+ put(PdfName.XSTEP, new PdfNumber(painter.getXStep()));
+ put(PdfName.YSTEP, new PdfNumber(painter.getYStep()));
+ bytes = painter.toPdf(null);
+ put(PdfName.LENGTH, new PdfNumber(bytes.length));
+ try {
+ flateCompress();
+ } catch (Exception e) {
+ throw new ExceptionConverter(e);
+ }
+ }
+}
diff --git a/src/main/java/com/lowagie/text/pdf/PdfPatternPainter.java b/src/main/java/com/lowagie/text/pdf/PdfPatternPainter.java
new file mode 100644
index 0000000..7c5a094
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/PdfPatternPainter.java
@@ -0,0 +1,391 @@
+/*
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+package com.lowagie.text.pdf;
+
+import com.lowagie.text.DocumentException;
+import com.lowagie.text.Image;
+import com.lowagie.text.Rectangle;
+import java.awt.Color;
+
+/**
+ * Implements the pattern.
+ */
+
+public class PdfPatternPainter extends PdfTemplate {
+
+ protected float xstep, ystep;
+ protected boolean stencil = false;
+ protected Color defaultColor;
+
+ /**
+ *Creates a <CODE>PdfPattern</CODE>.
+ */
+
+ private PdfPatternPainter() {
+ super(null);
+ type = TYPE_PATTERN;
+ }
+
+ /**
+ * Creates new PdfPattern
+ *
+ * @param wr the <CODE>PdfWriter</CODE>
+ */
+
+ PdfPatternPainter(PdfWriter wr) {
+ super(wr);
+ type = TYPE_PATTERN;
+ }
+
+ PdfPatternPainter(PdfWriter wr, Color defaultColor) {
+ this(wr);
+ stencil = true;
+ if (defaultColor == null)
+ this.defaultColor = Color.gray;
+ else
+ this.defaultColor = defaultColor;
+ }
+
+ /**
+ * Sets the horizontal interval of this pattern.
+ *
+ * @param xstep the xstep in horizontal painting
+ */
+
+ public void setXStep(float xstep) {
+ this.xstep = xstep;
+ }
+
+ /**
+ * Sets the vertical interval of this pattern.
+ *
+ * @param ystep in vertical painting
+ */
+
+ public void setYStep(float ystep) {
+ this.ystep = ystep;
+ }
+
+ /**
+ * Returns the horizontal interval when repeating the pattern.
+ * @return a value
+ */
+ public float getXStep() {
+ return this.xstep;
+ }
+
+ /**
+ * Returns the vertical interval when repeating the pattern.
+ * @return a value
+ */
+ public float getYStep() {
+ return this.ystep;
+ }
+
+ /**
+ * Tells you if this pattern is colored/uncolored (stencil = uncolored, you need to set a default color).
+ * @return true if the pattern is an uncolored tiling pattern (stencil).
+ */
+ public boolean isStencil() {
+ return stencil;
+ }
+
+ /**
+ * Sets the transformation matrix for the pattern.
+ * @param a
+ * @param b
+ * @param c
+ * @param d
+ * @param e
+ * @param f
+ */
+ public void setPatternMatrix(float a, float b, float c, float d, float e, float f) {
+ setMatrix(a, b, c, d, e, f);
+ }
+ /**
+ * Gets the stream representing this pattern
+ *
+ * @return the stream representing this pattern
+ */
+
+ PdfPattern getPattern() {
+ return new PdfPattern(this);
+ }
+
+ /**
+ * Gets a duplicate of this <CODE>PdfPatternPainter</CODE>. All
+ * the members are copied by reference but the buffer stays different.
+ * @return a copy of this <CODE>PdfPatternPainter</CODE>
+ */
+
+ public PdfContentByte getDuplicate() {
+ PdfPatternPainter tpl = new PdfPatternPainter();
+ tpl.writer = writer;
+ tpl.pdf = pdf;
+ tpl.thisReference = thisReference;
+ tpl.pageResources = pageResources;
+ tpl.bBox = new Rectangle(bBox);
+ tpl.xstep = xstep;
+ tpl.ystep = ystep;
+ tpl.matrix = matrix;
+ tpl.stencil = stencil;
+ tpl.defaultColor = defaultColor;
+ return tpl;
+ }
+
+ /**
+ * Returns the default color of the pattern.
+ * @return a Color
+ */
+ public Color getDefaultColor() {
+ return defaultColor;
+ }
+
+ /**
+ * @see com.lowagie.text.pdf.PdfContentByte#setGrayFill(float)
+ */
+ public void setGrayFill(float gray) {
+ checkNoColor();
+ super.setGrayFill(gray);
+ }
+
+ /**
+ * @see com.lowagie.text.pdf.PdfContentByte#resetGrayFill()
+ */
+ public void resetGrayFill() {
+ checkNoColor();
+ super.resetGrayFill();
+ }
+
+ /**
+ * @see com.lowagie.text.pdf.PdfContentByte#setGrayStroke(float)
+ */
+ public void setGrayStroke(float gray) {
+ checkNoColor();
+ super.setGrayStroke(gray);
+ }
+
+ /**
+ * @see com.lowagie.text.pdf.PdfContentByte#resetGrayStroke()
+ */
+ public void resetGrayStroke() {
+ checkNoColor();
+ super.resetGrayStroke();
+ }
+
+ /**
+ * @see com.lowagie.text.pdf.PdfContentByte#setRGBColorFillF(float, float, float)
+ */
+ public void setRGBColorFillF(float red, float green, float blue) {
+ checkNoColor();
+ super.setRGBColorFillF(red, green, blue);
+ }
+
+ /**
+ * @see com.lowagie.text.pdf.PdfContentByte#resetRGBColorFill()
+ */
+ public void resetRGBColorFill() {
+ checkNoColor();
+ super.resetRGBColorFill();
+ }
+
+ /**
+ * @see com.lowagie.text.pdf.PdfContentByte#setRGBColorStrokeF(float, float, float)
+ */
+ public void setRGBColorStrokeF(float red, float green, float blue) {
+ checkNoColor();
+ super.setRGBColorStrokeF(red, green, blue);
+ }
+
+ /**
+ * @see com.lowagie.text.pdf.PdfContentByte#resetRGBColorStroke()
+ */
+ public void resetRGBColorStroke() {
+ checkNoColor();
+ super.resetRGBColorStroke();
+ }
+
+ /**
+ * @see com.lowagie.text.pdf.PdfContentByte#setCMYKColorFillF(float, float, float, float)
+ */
+ public void setCMYKColorFillF(float cyan, float magenta, float yellow, float black) {
+ checkNoColor();
+ super.setCMYKColorFillF(cyan, magenta, yellow, black);
+ }
+
+ /**
+ * @see com.lowagie.text.pdf.PdfContentByte#resetCMYKColorFill()
+ */
+ public void resetCMYKColorFill() {
+ checkNoColor();
+ super.resetCMYKColorFill();
+ }
+
+ /**
+ * @see com.lowagie.text.pdf.PdfContentByte#setCMYKColorStrokeF(float, float, float, float)
+ */
+ public void setCMYKColorStrokeF(float cyan, float magenta, float yellow, float black) {
+ checkNoColor();
+ super.setCMYKColorStrokeF(cyan, magenta, yellow, black);
+ }
+
+ /**
+ * @see com.lowagie.text.pdf.PdfContentByte#resetCMYKColorStroke()
+ */
+ public void resetCMYKColorStroke() {
+ checkNoColor();
+ super.resetCMYKColorStroke();
+ }
+
+ /**
+ * @see com.lowagie.text.pdf.PdfContentByte#addImage(com.lowagie.text.Image, float, float, float, float, float, float)
+ */
+ public void addImage(Image image, float a, float b, float c, float d, float e, float f) throws DocumentException {
+ if (stencil && !image.isMask())
+ checkNoColor();
+ super.addImage(image, a, b, c, d, e, f);
+ }
+
+ /**
+ * @see com.lowagie.text.pdf.PdfContentByte#setCMYKColorFill(int, int, int, int)
+ */
+ public void setCMYKColorFill(int cyan, int magenta, int yellow, int black) {
+ checkNoColor();
+ super.setCMYKColorFill(cyan, magenta, yellow, black);
+ }
+
+ /**
+ * @see com.lowagie.text.pdf.PdfContentByte#setCMYKColorStroke(int, int, int, int)
+ */
+ public void setCMYKColorStroke(int cyan, int magenta, int yellow, int black) {
+ checkNoColor();
+ super.setCMYKColorStroke(cyan, magenta, yellow, black);
+ }
+
+ /**
+ * @see com.lowagie.text.pdf.PdfContentByte#setRGBColorFill(int, int, int)
+ */
+ public void setRGBColorFill(int red, int green, int blue) {
+ checkNoColor();
+ super.setRGBColorFill(red, green, blue);
+ }
+
+ /**
+ * @see com.lowagie.text.pdf.PdfContentByte#setRGBColorStroke(int, int, int)
+ */
+ public void setRGBColorStroke(int red, int green, int blue) {
+ checkNoColor();
+ super.setRGBColorStroke(red, green, blue);
+ }
+
+ /**
+ * @see com.lowagie.text.pdf.PdfContentByte#setColorStroke(java.awt.Color)
+ */
+ public void setColorStroke(Color color) {
+ checkNoColor();
+ super.setColorStroke(color);
+ }
+
+ /**
+ * @see com.lowagie.text.pdf.PdfContentByte#setColorFill(java.awt.Color)
+ */
+ public void setColorFill(Color color) {
+ checkNoColor();
+ super.setColorFill(color);
+ }
+
+ /**
+ * @see com.lowagie.text.pdf.PdfContentByte#setColorFill(com.lowagie.text.pdf.PdfSpotColor, float)
+ */
+ public void setColorFill(PdfSpotColor sp, float tint) {
+ checkNoColor();
+ super.setColorFill(sp, tint);
+ }
+
+ /**
+ * @see com.lowagie.text.pdf.PdfContentByte#setColorStroke(com.lowagie.text.pdf.PdfSpotColor, float)
+ */
+ public void setColorStroke(PdfSpotColor sp, float tint) {
+ checkNoColor();
+ super.setColorStroke(sp, tint);
+ }
+
+ /**
+ * @see com.lowagie.text.pdf.PdfContentByte#setPatternFill(com.lowagie.text.pdf.PdfPatternPainter)
+ */
+ public void setPatternFill(PdfPatternPainter p) {
+ checkNoColor();
+ super.setPatternFill(p);
+ }
+
+ /**
+ * @see com.lowagie.text.pdf.PdfContentByte#setPatternFill(com.lowagie.text.pdf.PdfPatternPainter, java.awt.Color, float)
+ */
+ public void setPatternFill(PdfPatternPainter p, Color color, float tint) {
+ checkNoColor();
+ super.setPatternFill(p, color, tint);
+ }
+
+ /**
+ * @see com.lowagie.text.pdf.PdfContentByte#setPatternStroke(com.lowagie.text.pdf.PdfPatternPainter, java.awt.Color, float)
+ */
+ public void setPatternStroke(PdfPatternPainter p, Color color, float tint) {
+ checkNoColor();
+ super.setPatternStroke(p, color, tint);
+ }
+
+ /**
+ * @see com.lowagie.text.pdf.PdfContentByte#setPatternStroke(com.lowagie.text.pdf.PdfPatternPainter)
+ */
+ public void setPatternStroke(PdfPatternPainter p) {
+ checkNoColor();
+ super.setPatternStroke(p);
+ }
+
+ void checkNoColor() {
+ if (stencil)
+ throw new RuntimeException("Colors are not allowed in uncolored tile patterns.");
+ }
+}
diff --git a/src/main/java/com/lowagie/text/pdf/PdfPrinterGraphics2D.java b/src/main/java/com/lowagie/text/pdf/PdfPrinterGraphics2D.java
new file mode 100644
index 0000000..06a0aa3
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/PdfPrinterGraphics2D.java
@@ -0,0 +1,73 @@
+/*
+ * $Id: PdfPrinterGraphics2D.java,v 1.3 2005/02/17 09:20:53 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2004 Paulo Soares and Alexandru Carstoiu
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999-2005 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000-2005 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf;
+
+import java.awt.print.PrinterGraphics;
+import java.awt.print.PrinterJob;
+
+/**
+ * This is an extension class for the sole purpose of implementing the
+ * {@link java.awt.print.PrinterGraphics PrinterGraphics} interface.
+ */
+public class PdfPrinterGraphics2D extends PdfGraphics2D implements PrinterGraphics
+{
+ private PrinterJob printerJob;
+
+ public PdfPrinterGraphics2D(PdfContentByte cb, float width, float height, FontMapper fontMapper,
+ boolean onlyShapes, boolean convertImagesToJPEG, float quality, PrinterJob printerJob) {
+ super(cb, width, height, fontMapper, onlyShapes, convertImagesToJPEG, quality);
+ this.printerJob = printerJob;
+ }
+
+ public PrinterJob getPrinterJob() {
+ return printerJob;
+ }
+}
diff --git a/src/main/java/com/lowagie/text/pdf/PdfReader.java b/src/main/java/com/lowagie/text/pdf/PdfReader.java
new file mode 100644
index 0000000..da46174
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/PdfReader.java
@@ -0,0 +1,3172 @@
+/*
+ * $Id: PdfReader.java,v 1.76 2006/05/31 16:23:26 psoares33 Exp $
+ * $Name: $
+ *
+ * Copyright 2001, 2002 Paulo Soares
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.DataInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.util.List;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+import java.util.Iterator;
+import java.util.zip.InflaterInputStream;
+import java.util.Arrays;
+import java.util.Collections;
+
+import com.lowagie.text.Rectangle;
+import com.lowagie.text.PageSize;
+import com.lowagie.text.StringCompare;
+import com.lowagie.text.ExceptionConverter;
+
+/** Reads a PDF document.
+ * @author Paulo Soares (psoares@consiste.pt)
+ * @author Kazuya Ujihara
+ */
+public class PdfReader {
+
+ static final PdfName pageInhCandidates[] = {
+ PdfName.MEDIABOX, PdfName.ROTATE, PdfName.RESOURCES, PdfName.CROPBOX
+ };
+
+ static final PdfName vpnames[] = {PdfName.HIDETOOLBAR, PdfName.HIDEMENUBAR,
+ PdfName.HIDEWINDOWUI, PdfName.FITWINDOW, PdfName.CENTERWINDOW, PdfName.DISPLAYDOCTITLE};
+ static final int vpints[] = {PdfWriter.HideToolbar, PdfWriter.HideMenubar,
+ PdfWriter.HideWindowUI, PdfWriter.FitWindow, PdfWriter.CenterWindow, PdfWriter.DisplayDocTitle};
+
+ static final byte endstream[] = PdfEncodings.convertToBytes("endstream", null);
+ static final byte endobj[] = PdfEncodings.convertToBytes("endobj", null);
+ protected PRTokeniser tokens;
+ // Each xref pair is a position
+ // type 0 -> -1, 0
+ // type 1 -> offset, 0
+ // type 2 -> index, obj num
+ protected int xref[];
+ protected HashMap objStmMark;
+ protected IntHashtable objStmToOffset;
+ protected boolean newXrefType;
+ private ArrayList xrefObj;
+ PdfDictionary rootPages;
+ protected PdfDictionary trailer;
+ //protected ArrayList pages;
+ protected PdfDictionary catalog;
+ protected PageRefs pageRefs;
+ protected PRAcroForm acroForm = null;
+ protected boolean acroFormParsed = false;
+ protected ArrayList pageInh;
+ protected boolean encrypted = false;
+ protected boolean rebuilt = false;
+ protected int freeXref;
+ protected boolean tampered = false;
+ protected int lastXref;
+ protected int eofPos;
+ protected char pdfVersion;
+ protected PdfEncryption decrypt;
+ protected byte password[] = null; //added by ujihara for decryption
+ protected ArrayList strings = new ArrayList();
+ protected boolean sharedStreams = true;
+ protected boolean consolidateNamedDestinations = false;
+ protected int rValue;
+ protected int pValue;
+ private int objNum;
+ private int objGen;
+ private boolean visited[];
+ private IntHashtable newHits;
+ private int fileLength;
+ private boolean hybridXref;
+ private int lastXrefPartial = -1;
+ private boolean partial;
+ private PRIndirectReference cryptoRef;
+
+ /**
+ * Holds value of property appendable.
+ */
+ private boolean appendable;
+
+ protected PdfReader() {
+ }
+
+ /** Reads and parses a PDF document.
+ * @param filename the file name of the document
+ * @throws IOException on error
+ */
+ public PdfReader(String filename) throws IOException {
+ this(filename, null);
+ }
+
+ /** Reads and parses a PDF document.
+ * @param filename the file name of the document
+ * @param ownerPassword the password to read the document
+ * @throws IOException on error
+ */
+ public PdfReader(String filename, byte ownerPassword[]) throws IOException {
+ password = ownerPassword;
+ tokens = new PRTokeniser(filename);
+ readPdf();
+ }
+
+ /** Reads and parses a PDF document.
+ * @param pdfIn the byte array with the document
+ * @throws IOException on error
+ */
+ public PdfReader(byte pdfIn[]) throws IOException {
+ this(pdfIn, null);
+ }
+
+ /** Reads and parses a PDF document.
+ * @param pdfIn the byte array with the document
+ * @param ownerPassword the password to read the document
+ * @throws IOException on error
+ */
+ public PdfReader(byte pdfIn[], byte ownerPassword[]) throws IOException {
+ password = ownerPassword;
+ tokens = new PRTokeniser(pdfIn);
+ readPdf();
+ }
+
+ /** Reads and parses a PDF document.
+ * @param url the URL of the document
+ * @throws IOException on error
+ */
+ public PdfReader(URL url) throws IOException {
+ this(url, null);
+ }
+
+ /** Reads and parses a PDF document.
+ * @param url the URL of the document
+ * @param ownerPassword the password to read the document
+ * @throws IOException on error
+ */
+ public PdfReader(URL url, byte ownerPassword[]) throws IOException {
+ password = ownerPassword;
+ tokens = new PRTokeniser(new RandomAccessFileOrArray(url));
+ readPdf();
+ }
+
+ /**
+ * Reads and parses a PDF document.
+ * @param is the <CODE>InputStream</CODE> containing the document. The stream is read to the
+ * end but is not closed
+ * @param ownerPassword the password to read the document
+ * @throws IOException on error
+ */
+ public PdfReader(InputStream is, byte ownerPassword[]) throws IOException {
+ password = ownerPassword;
+ tokens = new PRTokeniser(new RandomAccessFileOrArray(is));
+ readPdf();
+ }
+
+ /**
+ * Reads and parses a PDF document.
+ * @param is the <CODE>InputStream</CODE> containing the document. The stream is read to the
+ * end but is not closed
+ * @throws IOException on error
+ */
+ public PdfReader(InputStream is) throws IOException {
+ this(is, null);
+ }
+
+ /**
+ * Reads and parses a pdf document. Contrary to the other constructors only the xref is read
+ * into memory. The reader is said to be working in "partial" mode as only parts of the pdf
+ * are read as needed. The pdf is left open but may be closed at any time with
+ * <CODE>PdfReader.close()</CODE>, reopen is automatic.
+ * @param raf the document location
+ * @param ownerPassword the password or <CODE>null</CODE> for no password
+ * @throws IOException on error
+ */
+ public PdfReader(RandomAccessFileOrArray raf, byte ownerPassword[]) throws IOException {
+ password = ownerPassword;
+ partial = true;
+ tokens = new PRTokeniser(raf);
+ readPdfPartial();
+ }
+
+ /** Creates an independent duplicate.
+ * @param reader the <CODE>PdfReader</CODE> to duplicate
+ */
+ public PdfReader(PdfReader reader) {
+ this.appendable = reader.appendable;
+ this.consolidateNamedDestinations = reader.consolidateNamedDestinations;
+ this.encrypted = reader.encrypted;
+ this.rebuilt = reader.rebuilt;
+ this.sharedStreams = reader.sharedStreams;
+ this.tampered = reader.tampered;
+ this.password = reader.password;
+ this.pdfVersion = reader.pdfVersion;
+ this.eofPos = reader.eofPos;
+ this.freeXref = reader.freeXref;
+ this.lastXref = reader.lastXref;
+ this.tokens = new PRTokeniser(reader.tokens.getSafeFile());
+ if (reader.decrypt != null)
+ this.decrypt = new PdfEncryption(reader.decrypt);
+ this.pValue = reader.pValue;
+ this.rValue = reader.rValue;
+ this.xrefObj = new ArrayList(reader.xrefObj);
+ for (int k = 0; k < reader.xrefObj.size(); ++k) {
+ this.xrefObj.set(k, duplicatePdfObject((PdfObject)reader.xrefObj.get(k), this));
+ }
+ this.pageRefs = new PageRefs(reader.pageRefs, this);
+ this.trailer = (PdfDictionary)duplicatePdfObject(reader.trailer, this);
+ this.catalog = (PdfDictionary)getPdfObject(trailer.get(PdfName.ROOT));
+ this.rootPages = (PdfDictionary)getPdfObject(catalog.get(PdfName.PAGES));
+ this.fileLength = reader.fileLength;
+ this.partial = reader.partial;
+ this.hybridXref = reader.hybridXref;
+ this.objStmToOffset = reader.objStmToOffset;
+ this.xref = reader.xref;
+ this.cryptoRef = (PRIndirectReference)duplicatePdfObject(reader.cryptoRef, this);
+ }
+
+ /** Gets a new file instance of the original PDF
+ * document.
+ * @return a new file instance of the original PDF document
+ */
+ public RandomAccessFileOrArray getSafeFile() {
+ return tokens.getSafeFile();
+ }
+
+ protected PdfReaderInstance getPdfReaderInstance(PdfWriter writer) {
+ return new PdfReaderInstance(this, writer);
+ }
+
+ /** Gets the number of pages in the document.
+ * @return the number of pages in the document
+ */
+ public int getNumberOfPages() {
+ return pageRefs.size();
+ }
+
+ /** Returns the document's catalog. This dictionary is not a copy,
+ * any changes will be reflected in the catalog.
+ * @return the document's catalog
+ */
+ public PdfDictionary getCatalog() {
+ return catalog;
+ }
+
+ /** Returns the document's acroform, if it has one.
+ * @return the document's acroform
+ */
+ public PRAcroForm getAcroForm() {
+ if (!acroFormParsed) {
+ acroFormParsed = true;
+ PdfObject form = catalog.get(PdfName.ACROFORM);
+ if (form != null) {
+ try {
+ acroForm = new PRAcroForm(this);
+ acroForm.readAcroForm((PdfDictionary)getPdfObject(form));
+ }
+ catch (Exception e) {
+ acroForm = null;
+ }
+ }
+ }
+ return acroForm;
+ }
+ /**
+ * Gets the page rotation. This value can be 0, 90, 180 or 270.
+ * @param index the page number. The first page is 1
+ * @return the page rotation
+ */
+ public int getPageRotation(int index) {
+ return getPageRotation(pageRefs.getPageNRelease(index));
+ }
+
+ int getPageRotation(PdfDictionary page) {
+ PdfNumber rotate = (PdfNumber)getPdfObject(page.get(PdfName.ROTATE));
+ if (rotate == null)
+ return 0;
+ else {
+ int n = rotate.intValue();
+ n %= 360;
+ return n < 0 ? n + 360 : n;
+ }
+ }
+ /** Gets the page size, taking rotation into account. This
+ * is a <CODE>Rectangle</CODE> with the value of the /MediaBox and the /Rotate key.
+ * @param index the page number. The first page is 1
+ * @return a <CODE>Rectangle</CODE>
+ */
+ public Rectangle getPageSizeWithRotation(int index) {
+ return getPageSizeWithRotation(pageRefs.getPageNRelease(index));
+ }
+
+ /**
+ * Gets the rotated page from a page dictionary.
+ * @param page the page dictionary
+ * @return the rotated page
+ */
+ public Rectangle getPageSizeWithRotation(PdfDictionary page) {
+ Rectangle rect = getPageSize(page);
+ int rotation = getPageRotation(page);
+ while (rotation > 0) {
+ rect = rect.rotate();
+ rotation -= 90;
+ }
+ return rect;
+ }
+
+ /** Gets the page size without taking rotation into account. This
+ * is the value of the /MediaBox key.
+ * @param index the page number. The first page is 1
+ * @return the page size
+ */
+ public Rectangle getPageSize(int index) {
+ return getPageSize(pageRefs.getPageNRelease(index));
+ }
+
+ /**
+ * Gets the page from a page dictionary
+ * @param page the page dictionary
+ * @return the page
+ */
+ public Rectangle getPageSize(PdfDictionary page) {
+ PdfArray mediaBox = (PdfArray)getPdfObject(page.get(PdfName.MEDIABOX));
+ return getNormalizedRectangle(mediaBox);
+ }
+
+ /** Gets the crop box without taking rotation into account. This
+ * is the value of the /CropBox key. The crop box is the part
+ * of the document to be displayed or printed. It usually is the same
+ * as the media box but may be smaller. If the page doesn't have a crop
+ * box the page size will be returned.
+ * @param index the page number. The first page is 1
+ * @return the crop box
+ */
+ public Rectangle getCropBox(int index) {
+ PdfDictionary page = pageRefs.getPageNRelease(index);
+ PdfArray cropBox = (PdfArray)getPdfObjectRelease(page.get(PdfName.CROPBOX));
+ if (cropBox == null)
+ return getPageSize(page);
+ return getNormalizedRectangle(cropBox);
+ }
+
+ /** Gets the box size. Allowed names are: "crop", "trim", "art", "bleed" and "media".
+ * @param index the page number. The first page is 1
+ * @param boxName the box name
+ * @return the box rectangle or null
+ */
+ public Rectangle getBoxSize(int index, String boxName) {
+ PdfDictionary page = pageRefs.getPageNRelease(index);
+ PdfArray box = null;
+ if (boxName.equals("trim"))
+ box = (PdfArray)getPdfObjectRelease(page.get(PdfName.TRIMBOX));
+ else if (boxName.equals("art"))
+ box = (PdfArray)getPdfObjectRelease(page.get(PdfName.ARTBOX));
+ else if (boxName.equals("bleed"))
+ box = (PdfArray)getPdfObjectRelease(page.get(PdfName.BLEEDBOX));
+ else if (boxName.equals("crop"))
+ box = (PdfArray)getPdfObjectRelease(page.get(PdfName.CROPBOX));
+ else if (boxName.equals("media"))
+ box = (PdfArray)getPdfObjectRelease(page.get(PdfName.MEDIABOX));
+ if (box == null)
+ return null;
+ return getNormalizedRectangle(box);
+ }
+
+ /** Returns the content of the document information dictionary as a <CODE>HashMap</CODE>
+ * of <CODE>String</CODE>.
+ * @return content of the document information dictionary
+ */
+ public HashMap getInfo() {
+ HashMap map = new HashMap();
+ PdfDictionary info = (PdfDictionary)getPdfObject(trailer.get(PdfName.INFO));
+ if (info == null)
+ return map;
+ for (Iterator it = info.getKeys().iterator(); it.hasNext();) {
+ PdfName key = (PdfName)it.next();
+ PdfObject obj = getPdfObject(info.get(key));
+ if (obj == null)
+ continue;
+ String value = obj.toString();
+ switch (obj.type()) {
+ case PdfObject.STRING: {
+ value = ((PdfString)obj).toUnicodeString();
+ break;
+ }
+ case PdfObject.NAME: {
+ value = PdfName.decodeName(value);
+ break;
+ }
+ }
+ map.put(PdfName.decodeName(key.toString()), value);
+ }
+ return map;
+ }
+
+ /** Normalizes a <CODE>Rectangle</CODE> so that llx and lly are smaller than urx and ury.
+ * @param box the original rectangle
+ * @return a normalized <CODE>Rectangle</CODE>
+ */
+ public static Rectangle getNormalizedRectangle(PdfArray box) {
+ ArrayList rect = box.getArrayList();
+ float llx = ((PdfNumber)rect.get(0)).floatValue();
+ float lly = ((PdfNumber)rect.get(1)).floatValue();
+ float urx = ((PdfNumber)rect.get(2)).floatValue();
+ float ury = ((PdfNumber)rect.get(3)).floatValue();
+ return new Rectangle(Math.min(llx, urx), Math.min(lly, ury),
+ Math.max(llx, urx), Math.max(lly, ury));
+ }
+
+ protected void readPdf() throws IOException {
+ try {
+ fileLength = tokens.getFile().length();
+ pdfVersion = tokens.checkPdfHeader();
+ try {
+ readXref();
+ }
+ catch (Exception e) {
+ try {
+ rebuilt = true;
+ rebuildXref();
+ lastXref = -1;
+ }
+ catch (Exception ne) {
+ throw new IOException("Rebuild failed: " + ne.getMessage() + "; Original message: " + e.getMessage());
+ }
+ }
+ try {
+ readDocObj();
+ }
+ catch (IOException ne) {
+ if (rebuilt)
+ throw ne;
+ rebuilt = true;
+ encrypted = false;
+ rebuildXref();
+ lastXref = -1;
+ readDocObj();
+ }
+
+ strings.clear();
+ readPages();
+ eliminateSharedStreams();
+ removeUnusedObjects();
+ }
+ finally {
+ try {
+ tokens.close();
+ }
+ catch (Exception e) {
+ // empty on purpose
+ }
+ }
+ }
+
+ protected void readPdfPartial() throws IOException {
+ try {
+ fileLength = tokens.getFile().length();
+ pdfVersion = tokens.checkPdfHeader();
+ try {
+ readXref();
+ }
+ catch (Exception e) {
+ try {
+ rebuilt = true;
+ rebuildXref();
+ lastXref = -1;
+ }
+ catch (Exception ne) {
+ throw new IOException("Rebuild failed: " + ne.getMessage() + "; Original message: " + e.getMessage());
+ }
+ }
+ readDocObjPartial();
+ readPages();
+ }
+ catch (IOException e) {
+ try{tokens.close();}catch(Exception ee){}
+ throw e;
+ }
+ }
+
+ private boolean equalsArray(byte ar1[], byte ar2[], int size) {
+ for (int k = 0; k < size; ++k) {
+ if (ar1[k] != ar2[k])
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * @throws IOException
+ */
+ private void readDecryptedDocObj() throws IOException {
+ if (encrypted)
+ return;
+ PdfObject encDic = trailer.get(PdfName.ENCRYPT);
+ if (encDic == null || encDic.toString().equals("null"))
+ return;
+ encrypted = true;
+ PdfDictionary enc = (PdfDictionary)getPdfObject(encDic);
+
+ String s;
+ PdfObject o;
+
+ PdfArray documentIDs = (PdfArray)getPdfObject(trailer.get(PdfName.ID));
+ byte documentID[] = null;
+ if (documentIDs != null) {
+ o = (PdfObject)documentIDs.getArrayList().get(0);
+ s = o.toString();
+ documentID = com.lowagie.text.DocWriter.getISOBytes(s);
+ }
+
+ s = enc.get(PdfName.U).toString();
+ byte uValue[] = com.lowagie.text.DocWriter.getISOBytes(s);
+ s = enc.get(PdfName.O).toString();
+ byte oValue[] = com.lowagie.text.DocWriter.getISOBytes(s);
+
+ o = enc.get(PdfName.R);
+ if (!o.isNumber()) throw new IOException("Illegal R value.");
+ rValue = ((PdfNumber)o).intValue();
+ if (rValue != 2 && rValue != 3) throw new IOException("Unknown encryption type (" + rValue + ")");
+
+ o = enc.get(PdfName.P);
+ if (!o.isNumber()) throw new IOException("Illegal P value.");
+ pValue = ((PdfNumber)o).intValue();
+
+ // get the Keylength if Revision is 3
+ int lengthValue;
+ if ( rValue == 3 ){
+ o = enc.get(PdfName.LENGTH);
+ if (!o.isNumber())
+ throw new IOException("Illegal Length value.");
+ lengthValue = ( (PdfNumber) o).intValue();
+ if (lengthValue > 128 || lengthValue < 40 || lengthValue % 8 != 0)
+ throw new IOException("Illegal Length value.");
+ } else {
+ // Keylength is 40 bit in revision 2
+ lengthValue=40;
+ }
+
+
+
+ decrypt = new PdfEncryption();
+
+ //check by user password
+ decrypt.setupByUserPassword(documentID, password, oValue, pValue, lengthValue, rValue);
+ if (!equalsArray(uValue, decrypt.userKey, rValue == 3 ? 16 : 32)) {
+ //check by owner password
+ decrypt.setupByOwnerPassword(documentID, password, uValue, oValue, pValue, lengthValue, rValue);
+ if (!equalsArray(uValue, decrypt.userKey, rValue == 3 ? 16 : 32)) {
+ throw new IOException("Bad user password");
+ }
+ }
+ for (int k = 0; k < strings.size(); ++k) {
+ PdfString str = (PdfString)strings.get(k);
+ str.decrypt(this);
+ }
+ if (encDic.isIndirect()) {
+ cryptoRef = (PRIndirectReference)encDic;
+ xrefObj.set(cryptoRef.getNumber(), null);
+ }
+ }
+
+ /**
+ * @param obj
+ * @return a PdfObject
+ */
+ public static PdfObject getPdfObjectRelease(PdfObject obj) {
+ PdfObject obj2 = getPdfObject(obj);
+ releaseLastXrefPartial(obj);
+ return obj2;
+ }
+
+
+ /**
+ * Reads a <CODE>PdfObject</CODE> resolving an indirect reference
+ * if needed.
+ * @param obj the <CODE>PdfObject</CODE> to read
+ * @return the resolved <CODE>PdfObject</CODE>
+ */
+ public static PdfObject getPdfObject(PdfObject obj) {
+ if (obj == null)
+ return null;
+ if (!obj.isIndirect())
+ return obj;
+ try {
+ PRIndirectReference ref = (PRIndirectReference)obj;
+ int idx = ref.getNumber();
+ boolean appendable = ref.getReader().appendable;
+ obj = ref.getReader().getPdfObject(idx);
+ if (obj == null) {
+ if (appendable) {
+ obj = new PdfNull();
+ obj.setIndRef(ref);
+ return obj;
+ }
+ else
+ return PdfNull.PDFNULL;
+ }
+ else {
+ if (appendable) {
+ switch (obj.type()) {
+ case PdfObject.NULL:
+ obj = new PdfNull();
+ break;
+ case PdfObject.BOOLEAN:
+ obj = new PdfBoolean(((PdfBoolean)obj).booleanValue());
+ break;
+ case PdfObject.NAME:
+ obj = new PdfName(obj.getBytes());
+ break;
+ }
+ obj.setIndRef(ref);
+ }
+ return obj;
+ }
+ }
+ catch (Exception e) {
+ throw new ExceptionConverter(e);
+ }
+ }
+
+ /**
+ * Reads a <CODE>PdfObject</CODE> resolving an indirect reference
+ * if needed. If the reader was opened in partial mode the object will be released
+ * to save memory.
+ * @param obj the <CODE>PdfObject</CODE> to read
+ * @param parent
+ * @return a PdfObject
+ */
+ public static PdfObject getPdfObjectRelease(PdfObject obj, PdfObject parent) {
+ PdfObject obj2 = getPdfObject(obj, parent);
+ releaseLastXrefPartial(obj);
+ return obj2;
+ }
+
+ /**
+ * @param obj
+ * @param parent
+ * @return a PdfObject
+ */
+ public static PdfObject getPdfObject(PdfObject obj, PdfObject parent) {
+ if (obj == null)
+ return null;
+ if (!obj.isIndirect()) {
+ PRIndirectReference ref = null;
+ if (parent != null && (ref = parent.getIndRef()) != null && ref.getReader().isAppendable()) {
+ switch (obj.type()) {
+ case PdfObject.NULL:
+ obj = new PdfNull();
+ break;
+ case PdfObject.BOOLEAN:
+ obj = new PdfBoolean(((PdfBoolean)obj).booleanValue());
+ break;
+ case PdfObject.NAME:
+ obj = new PdfName(obj.getBytes());
+ break;
+ }
+ obj.setIndRef(ref);
+ }
+ return obj;
+ }
+ return getPdfObject(obj);
+ }
+
+ /**
+ * @param idx
+ * @return a PdfObject
+ */
+ public PdfObject getPdfObjectRelease(int idx) {
+ PdfObject obj = getPdfObject(idx);
+ releaseLastXrefPartial();
+ return obj;
+ }
+
+ /**
+ * @param idx
+ * @return aPdfObject
+ */
+ public PdfObject getPdfObject(int idx) {
+ try {
+ lastXrefPartial = -1;
+ if (idx < 0 || idx >= xrefObj.size())
+ return null;
+ PdfObject obj = (PdfObject)xrefObj.get(idx);
+ if (!partial || obj != null)
+ return obj;
+ if (idx * 2 >= xref.length)
+ return null;
+ obj = readSingleObject(idx);
+ lastXrefPartial = -1;
+ if (obj != null)
+ lastXrefPartial = idx;
+ return obj;
+ }
+ catch (Exception e) {
+ throw new ExceptionConverter(e);
+ }
+ }
+
+ /**
+ *
+ */
+ public void resetLastXrefPartial() {
+ lastXrefPartial = -1;
+ }
+
+ /**
+ *
+ */
+ public void releaseLastXrefPartial() {
+ if (partial && lastXrefPartial != -1) {
+ xrefObj.set(lastXrefPartial, null);
+ lastXrefPartial = -1;
+ }
+ }
+
+ /**
+ * @param obj
+ */
+ public static void releaseLastXrefPartial(PdfObject obj) {
+ if (obj == null)
+ return;
+ if (!obj.isIndirect())
+ return;
+ PRIndirectReference ref = (PRIndirectReference)obj;
+ PdfReader reader = ref.getReader();
+ if (reader.partial && reader.lastXrefPartial != -1 && reader.lastXrefPartial == ref.getNumber()) {
+ reader.xrefObj.set(reader.lastXrefPartial, null);
+ }
+ reader.lastXrefPartial = -1;
+ }
+
+ private void setXrefPartialObject(int idx, PdfObject obj) {
+ if (!partial || idx < 0)
+ return;
+ xrefObj.set(idx, obj);
+ }
+
+ /**
+ * @param obj
+ * @return an indirect reference
+ */
+ public PRIndirectReference addPdfObject(PdfObject obj) {
+ xrefObj.add(obj);
+ return new PRIndirectReference(this, xrefObj.size() - 1);
+ }
+
+ protected void readPages() throws IOException {
+ pageInh = new ArrayList();
+ catalog = (PdfDictionary)getPdfObject(trailer.get(PdfName.ROOT));
+ rootPages = (PdfDictionary)getPdfObject(catalog.get(PdfName.PAGES));
+ pageRefs = new PageRefs(this);
+ }
+
+ protected void readDocObjPartial() throws IOException {
+ xrefObj = new ArrayList(xref.length / 2);
+ xrefObj.addAll(Collections.nCopies(xref.length / 2, null));
+ readDecryptedDocObj();
+ if (objStmToOffset != null) {
+ int keys[] = objStmToOffset.getKeys();
+ for (int k = 0; k < keys.length; ++k) {
+ int n = keys[k];
+ objStmToOffset.put(n, xref[n * 2]);
+ xref[n * 2] = -1;
+ }
+ }
+ }
+
+ protected PdfObject readSingleObject(int k) throws IOException {
+ strings.clear();
+ int k2 = k * 2;
+ int pos = xref[k2];
+ if (pos < 0)
+ return null;
+ if (xref[k2 + 1] > 0)
+ pos = objStmToOffset.get(xref[k2 + 1]);
+ tokens.seek(pos);
+ tokens.nextValidToken();
+ if (tokens.getTokenType() != PRTokeniser.TK_NUMBER)
+ tokens.throwError("Invalid object number.");
+ objNum = tokens.intValue();
+ tokens.nextValidToken();
+ if (tokens.getTokenType() != PRTokeniser.TK_NUMBER)
+ tokens.throwError("Invalid generation number.");
+ objGen = tokens.intValue();
+ tokens.nextValidToken();
+ if (!tokens.getStringValue().equals("obj"))
+ tokens.throwError("Token 'obj' expected.");
+ PdfObject obj;
+ try {
+ obj = readPRObject();
+ for (int j = 0; j < strings.size(); ++j) {
+ PdfString str = (PdfString)strings.get(j);
+ str.decrypt(this);
+ }
+ if (obj.isStream()) {
+ checkPRStreamLength((PRStream)obj);
+ }
+ }
+ catch (Exception e) {
+ obj = null;
+ }
+ if (xref[k2 + 1] > 0) {
+ obj = readOneObjStm((PRStream)obj, xref[k2]);
+ }
+ xrefObj.set(k, obj);
+ return obj;
+ }
+
+ protected PdfObject readOneObjStm(PRStream stream, int idx) throws IOException {
+ int first = ((PdfNumber)getPdfObject(stream.get(PdfName.FIRST))).intValue();
+ byte b[] = getStreamBytes(stream, tokens.getFile());
+ PRTokeniser saveTokens = tokens;
+ tokens = new PRTokeniser(b);
+ try {
+ int address = 0;
+ boolean ok = true;
+ ++idx;
+ for (int k = 0; k < idx; ++k) {
+ ok = tokens.nextToken();
+ if (!ok)
+ break;
+ if (tokens.getTokenType() != PRTokeniser.TK_NUMBER) {
+ ok = false;
+ break;
+ }
+ ok = tokens.nextToken();
+ if (!ok)
+ break;
+ if (tokens.getTokenType() != PRTokeniser.TK_NUMBER) {
+ ok = false;
+ break;
+ }
+ address = tokens.intValue() + first;
+ }
+ if (!ok)
+ throw new IOException("Error reading ObjStm");
+ tokens.seek(address);
+ return readPRObject();
+ }
+ finally {
+ tokens = saveTokens;
+ }
+ }
+
+ /**
+ * @return the percentage of the cross reference table that has been read
+ */
+ public double dumpPerc() {
+ int total = 0;
+ for (int k = 0; k < xrefObj.size(); ++k) {
+ if (xrefObj.get(k) != null)
+ ++total;
+ }
+ return (total * 100.0 / xrefObj.size());
+ }
+
+ protected void readDocObj() throws IOException {
+ ArrayList streams = new ArrayList();
+ xrefObj = new ArrayList(xref.length / 2);
+ xrefObj.addAll(Collections.nCopies(xref.length / 2, null));
+ for (int k = 2; k < xref.length; k += 2) {
+ int pos = xref[k];
+ if (pos <= 0 || xref[k + 1] > 0)
+ continue;
+ tokens.seek(pos);
+ tokens.nextValidToken();
+ if (tokens.getTokenType() != PRTokeniser.TK_NUMBER)
+ tokens.throwError("Invalid object number.");
+ objNum = tokens.intValue();
+ tokens.nextValidToken();
+ if (tokens.getTokenType() != PRTokeniser.TK_NUMBER)
+ tokens.throwError("Invalid generation number.");
+ objGen = tokens.intValue();
+ tokens.nextValidToken();
+ if (!tokens.getStringValue().equals("obj"))
+ tokens.throwError("Token 'obj' expected.");
+ PdfObject obj;
+ try {
+ obj = readPRObject();
+ if (obj.isStream()) {
+ streams.add(obj);
+ }
+ }
+ catch (Exception e) {
+ obj = null;
+ }
+ xrefObj.set(k / 2, obj);
+ }
+ for (int k = 0; k < streams.size(); ++k) {
+ checkPRStreamLength((PRStream)streams.get(k));
+ }
+ readDecryptedDocObj();
+ if (objStmMark != null) {
+ for (Iterator i = objStmMark.entrySet().iterator(); i.hasNext();) {
+ Map.Entry entry = (Map.Entry)i.next();
+ int n = ((Integer)entry.getKey()).intValue();
+ IntHashtable h = (IntHashtable)entry.getValue();
+ readObjStm((PRStream)xrefObj.get(n), h);
+ xrefObj.set(n, null);
+ }
+ objStmMark = null;
+ }
+ xref = null;
+ }
+
+ private void checkPRStreamLength(PRStream stream) throws IOException {
+ int fileLength = tokens.length();
+ int start = stream.getOffset();
+ boolean calc = false;
+ int streamLength = 0;
+ PdfObject obj = getPdfObjectRelease(stream.get(PdfName.LENGTH));
+ if (obj != null && obj.type() == PdfObject.NUMBER) {
+ streamLength = ((PdfNumber)obj).intValue();
+ if (streamLength + start > fileLength - 20)
+ calc = true;
+ else {
+ tokens.seek(start + streamLength);
+ String line = tokens.readString(20);
+ if (!line.startsWith("\nendstream") &&
+ !line.startsWith("\r\nendstream") &&
+ !line.startsWith("\rendstream") &&
+ !line.startsWith("endstream"))
+ calc = true;
+ }
+ }
+ else
+ calc = true;
+ if (calc) {
+ byte tline[] = new byte[16];
+ tokens.seek(start);
+ while (true) {
+ int pos = tokens.getFilePointer();
+ if (!tokens.readLineSegment(tline))
+ break;
+ if (equalsn(tline, endstream)) {
+ streamLength = pos - start;
+ break;
+ }
+ if (equalsn(tline, endobj)) {
+ tokens.seek(pos - 16);
+ String s = tokens.readString(16);
+ int index = s.indexOf("endstream");
+ if (index >= 0)
+ pos = pos - 16 + index;
+ streamLength = pos - start;
+ break;
+ }
+ }
+ }
+ stream.setLength(streamLength);
+ }
+
+ protected void readObjStm(PRStream stream, IntHashtable map) throws IOException {
+ int first = ((PdfNumber)getPdfObject(stream.get(PdfName.FIRST))).intValue();
+ int n = ((PdfNumber)getPdfObject(stream.get(PdfName.N))).intValue();
+ byte b[] = getStreamBytes(stream, tokens.getFile());
+ PRTokeniser saveTokens = tokens;
+ tokens = new PRTokeniser(b);
+ try {
+ int address[] = new int[n];
+ int objNumber[] = new int[n];
+ boolean ok = true;
+ for (int k = 0; k < n; ++k) {
+ ok = tokens.nextToken();
+ if (!ok)
+ break;
+ if (tokens.getTokenType() != PRTokeniser.TK_NUMBER) {
+ ok = false;
+ break;
+ }
+ objNumber[k] = tokens.intValue();
+ ok = tokens.nextToken();
+ if (!ok)
+ break;
+ if (tokens.getTokenType() != PRTokeniser.TK_NUMBER) {
+ ok = false;
+ break;
+ }
+ address[k] = tokens.intValue() + first;
+ }
+ if (!ok)
+ throw new IOException("Error reading ObjStm");
+ for (int k = 0; k < n; ++k) {
+ if (map.containsKey(k)) {
+ tokens.seek(address[k]);
+ PdfObject obj = readPRObject();
+ xrefObj.set(objNumber[k], obj);
+ }
+ }
+ }
+ finally {
+ tokens = saveTokens;
+ }
+ }
+
+ /**
+ * Eliminates the reference to the object freeing the memory used by it and clearing
+ * the xref entry.
+ * @param obj the object. If it's an indirect reference it will be eliminated
+ * @return the object or the already erased dereferenced object
+ */
+ public static PdfObject killIndirect(PdfObject obj) {
+ if (obj == null || obj.isNull())
+ return null;
+ PdfObject ret = getPdfObjectRelease(obj);
+ if (obj.isIndirect()) {
+ PRIndirectReference ref = (PRIndirectReference)obj;
+ PdfReader reader = ref.getReader();
+ int n = ref.getNumber();
+ reader.xrefObj.set(n, null);
+ if (reader.partial)
+ reader.xref[n * 2] = -1;
+ }
+ return ret;
+ }
+
+ private void ensureXrefSize(int size) {
+ if (size == 0)
+ return;
+ if (xref == null)
+ xref = new int[size];
+ else {
+ if (xref.length < size) {
+ int xref2[] = new int[size];
+ System.arraycopy(xref, 0, xref2, 0, xref.length);
+ xref = xref2;
+ }
+ }
+ }
+
+ protected void readXref() throws IOException {
+ hybridXref = false;
+ newXrefType = false;
+ tokens.seek(tokens.getStartxref());
+ tokens.nextToken();
+ if (!tokens.getStringValue().equals("startxref"))
+ throw new IOException("startxref not found.");
+ tokens.nextToken();
+ if (tokens.getTokenType() != PRTokeniser.TK_NUMBER)
+ throw new IOException("startxref is not followed by a number.");
+ int startxref = tokens.intValue();
+ lastXref = startxref;
+ eofPos = tokens.getFilePointer();
+ try {
+ if (readXRefStream(startxref)) {
+ newXrefType = true;
+ return;
+ }
+ }
+ catch (Exception e) {}
+ xref = null;
+ tokens.seek(startxref);
+ trailer = readXrefSection();
+ PdfDictionary trailer2 = trailer;
+ while (true) {
+ PdfNumber prev = (PdfNumber)trailer2.get(PdfName.PREV);
+ if (prev == null)
+ break;
+ tokens.seek(prev.intValue());
+ trailer2 = readXrefSection();
+ }
+ }
+
+ protected PdfDictionary readXrefSection() throws IOException {
+ tokens.nextValidToken();
+ if (!tokens.getStringValue().equals("xref"))
+ tokens.throwError("xref subsection not found");
+ int start = 0;
+ int end = 0;
+ int pos = 0;
+ int gen = 0;
+ while (true) {
+ tokens.nextValidToken();
+ if (tokens.getStringValue().equals("trailer"))
+ break;
+ if (tokens.getTokenType() != PRTokeniser.TK_NUMBER)
+ tokens.throwError("Object number of the first object in this xref subsection not found");
+ start = tokens.intValue();
+ tokens.nextValidToken();
+ if (tokens.getTokenType() != PRTokeniser.TK_NUMBER)
+ tokens.throwError("Number of entries in this xref subsection not found");
+ end = tokens.intValue() + start;
+ if (start == 1) { // fix incorrect start number
+ int back = tokens.getFilePointer();
+ tokens.nextValidToken();
+ pos = tokens.intValue();
+ tokens.nextValidToken();
+ gen = tokens.intValue();
+ if (pos == 0 && gen == 65535) {
+ --start;
+ --end;
+ }
+ tokens.seek(back);
+ }
+ ensureXrefSize(end * 2);
+ for (int k = start; k < end; ++k) {
+ tokens.nextValidToken();
+ pos = tokens.intValue();
+ tokens.nextValidToken();
+ gen = tokens.intValue();
+ tokens.nextValidToken();
+ int p = k * 2;
+ if (tokens.getStringValue().equals("n")) {
+ if (xref[p] == 0 && xref[p + 1] == 0) {
+// if (pos == 0)
+// tokens.throwError("File position 0 cross-reference entry in this xref subsection");
+ xref[p] = pos;
+ }
+ }
+ else if (tokens.getStringValue().equals("f")) {
+ if (xref[p] == 0 && xref[p + 1] == 0)
+ xref[p] = -1;
+ }
+ else
+ tokens.throwError("Invalid cross-reference entry in this xref subsection");
+ }
+ }
+ PdfDictionary trailer = (PdfDictionary)readPRObject();
+ PdfNumber xrefSize = (PdfNumber)trailer.get(PdfName.SIZE);
+ ensureXrefSize(xrefSize.intValue() * 2);
+ PdfObject xrs = trailer.get(PdfName.XREFSTM);
+ if (xrs != null && xrs.isNumber()) {
+ int loc = ((PdfNumber)xrs).intValue();
+ try {
+ readXRefStream(loc);
+ newXrefType = true;
+ hybridXref = true;
+ }
+ catch (IOException e) {
+ xref = null;
+ throw e;
+ }
+ }
+ return trailer;
+ }
+
+ protected boolean readXRefStream(int ptr) throws IOException {
+ tokens.seek(ptr);
+ int thisStream = 0;
+ if (!tokens.nextToken())
+ return false;
+ if (tokens.getTokenType() != PRTokeniser.TK_NUMBER)
+ return false;
+ thisStream = tokens.intValue();
+ if (!tokens.nextToken() || tokens.getTokenType() != PRTokeniser.TK_NUMBER)
+ return false;
+ if (!tokens.nextToken() || !tokens.getStringValue().equals("obj"))
+ return false;
+ PdfObject object = readPRObject();
+ PRStream stm = null;
+ if (object.isStream()) {
+ stm = (PRStream)object;
+ if (!PdfName.XREF.equals(stm.get(PdfName.TYPE)))
+ return false;
+ }
+ if (trailer == null) {
+ trailer = new PdfDictionary();
+ trailer.putAll(stm);
+ }
+ stm.setLength(((PdfNumber)stm.get(PdfName.LENGTH)).intValue());
+ int size = ((PdfNumber)stm.get(PdfName.SIZE)).intValue();
+ PdfArray index;
+ PdfObject obj = stm.get(PdfName.INDEX);
+ if (obj == null) {
+ index = new PdfArray();
+ index.add(new int[]{0, size});
+ }
+ else
+ index = (PdfArray)obj;
+ PdfArray w = (PdfArray)stm.get(PdfName.W);
+ int prev = -1;
+ obj = stm.get(PdfName.PREV);
+ if (obj != null)
+ prev = ((PdfNumber)obj).intValue();
+ // Each xref pair is a position
+ // type 0 -> -1, 0
+ // type 1 -> offset, 0
+ // type 2 -> index, obj num
+ ensureXrefSize(size * 2);
+ if (objStmMark == null && !partial)
+ objStmMark = new HashMap();
+ if (objStmToOffset == null && partial)
+ objStmToOffset = new IntHashtable();
+ byte b[] = getStreamBytes(stm, tokens.getFile());
+ int bptr = 0;
+ ArrayList wa = w.getArrayList();
+ int wc[] = new int[3];
+ for (int k = 0; k < 3; ++k)
+ wc[k] = ((PdfNumber)wa.get(k)).intValue();
+ ArrayList sections = index.getArrayList();
+ for (int idx = 0; idx < sections.size(); idx += 2) {
+ int start = ((PdfNumber)sections.get(idx)).intValue();
+ int length = ((PdfNumber)sections.get(idx + 1)).intValue();
+ ensureXrefSize((start + length) * 2);
+ while (length-- > 0) {
+ int type = 1;
+ if (wc[0] > 0) {
+ type = 0;
+ for (int k = 0; k < wc[0]; ++k)
+ type = (type << 8) + (b[bptr++] & 0xff);
+ }
+ int field2 = 0;
+ for (int k = 0; k < wc[1]; ++k)
+ field2 = (field2 << 8) + (b[bptr++] & 0xff);
+ int field3 = 0;
+ for (int k = 0; k < wc[2]; ++k)
+ field3 = (field3 << 8) + (b[bptr++] & 0xff);
+ int base = start * 2;
+ if (xref[base] == 0 && xref[base + 1] == 0) {
+ switch (type) {
+ case 0:
+ xref[base] = -1;
+ break;
+ case 1:
+ xref[base] = field2;
+ break;
+ case 2:
+ xref[base] = field3;
+ xref[base + 1] = field2;
+ if (partial) {
+ objStmToOffset.put(field2, 0);
+ }
+ else {
+ Integer on = new Integer(field2);
+ IntHashtable seq = (IntHashtable)objStmMark.get(on);
+ if (seq == null) {
+ seq = new IntHashtable();
+ seq.put(field3, 1);
+ objStmMark.put(on, seq);
+ }
+ else
+ seq.put(field3, 1);
+ }
+ break;
+ }
+ }
+ ++start;
+ }
+ }
+ thisStream *= 2;
+ if (thisStream < xref.length)
+ xref[thisStream] = -1;
+
+ if (prev == -1)
+ return true;
+ return readXRefStream(prev);
+ }
+
+ protected void rebuildXref() throws IOException {
+ hybridXref = false;
+ newXrefType = false;
+ tokens.seek(0);
+ int xr[][] = new int[1024][];
+ int top = 0;
+ trailer = null;
+ byte line[] = new byte[64];
+ for (;;) {
+ int pos = tokens.getFilePointer();
+ if (!tokens.readLineSegment(line))
+ break;
+ if (line[0] == 't') {
+ if (!PdfEncodings.convertToString(line, null).startsWith("trailer"))
+ continue;
+ tokens.seek(pos);
+ tokens.nextToken();
+ pos = tokens.getFilePointer();
+ try {
+ PdfDictionary dic = (PdfDictionary)readPRObject();
+ if (dic.get(PdfName.ROOT) != null)
+ trailer = dic;
+ else
+ tokens.seek(pos);
+ }
+ catch (Exception e) {
+ tokens.seek(pos);
+ }
+ }
+ else if (line[0] >= '0' && line[0] <= '9') {
+ int obj[] = PRTokeniser.checkObjectStart(line);
+ if (obj == null)
+ continue;
+ int num = obj[0];
+ int gen = obj[1];
+ if (num >= xr.length) {
+ int newLength = num * 2;
+ int xr2[][] = new int[newLength][];
+ System.arraycopy(xr, 0, xr2, 0, top);
+ xr = xr2;
+ }
+ if (num >= top)
+ top = num + 1;
+ if (xr[num] == null || gen >= xr[num][1]) {
+ obj[0] = pos;
+ xr[num] = obj;
+ }
+ }
+ }
+ if (trailer == null)
+ throw new IOException("trailer not found.");
+ xref = new int[top * 2];
+ for (int k = 0; k < top; ++k) {
+ int obj[] = xr[k];
+ if (obj != null)
+ xref[k * 2] = obj[0];
+ }
+ }
+
+ protected PdfDictionary readDictionary() throws IOException {
+ PdfDictionary dic = new PdfDictionary();
+ while (true) {
+ tokens.nextValidToken();
+ if (tokens.getTokenType() == PRTokeniser.TK_END_DIC)
+ break;
+ if (tokens.getTokenType() != PRTokeniser.TK_NAME)
+ tokens.throwError("Dictionary key is not a name.");
+ PdfName name = new PdfName(tokens.getStringValue(), false);
+ PdfObject obj = readPRObject();
+ int type = obj.type();
+ if (-type == PRTokeniser.TK_END_DIC)
+ tokens.throwError("Unexpected '>>'");
+ if (-type == PRTokeniser.TK_END_ARRAY)
+ tokens.throwError("Unexpected ']'");
+ dic.put(name, obj);
+ }
+ return dic;
+ }
+
+ protected PdfArray readArray() throws IOException {
+ PdfArray array = new PdfArray();
+ while (true) {
+ PdfObject obj = readPRObject();
+ int type = obj.type();
+ if (-type == PRTokeniser.TK_END_ARRAY)
+ break;
+ if (-type == PRTokeniser.TK_END_DIC)
+ tokens.throwError("Unexpected '>>'");
+ array.add(obj);
+ }
+ return array;
+ }
+
+ protected PdfObject readPRObject() throws IOException {
+ tokens.nextValidToken();
+ int type = tokens.getTokenType();
+ switch (type) {
+ case PRTokeniser.TK_START_DIC: {
+ PdfDictionary dic = readDictionary();
+ int pos = tokens.getFilePointer();
+ // be careful in the trailer. May not be a "next" token.
+ if (tokens.nextToken() && tokens.getStringValue().equals("stream")) {
+ int ch = tokens.read();
+ if (ch != '\n')
+ ch = tokens.read();
+ if (ch != '\n')
+ tokens.backOnePosition(ch);
+ PRStream stream = new PRStream(this, tokens.getFilePointer());
+ stream.putAll(dic);
+ stream.setObjNum(objNum, objGen);
+ return stream;
+ }
+ else {
+ tokens.seek(pos);
+ return dic;
+ }
+ }
+ case PRTokeniser.TK_START_ARRAY:
+ return readArray();
+ case PRTokeniser.TK_NUMBER:
+ return new PdfNumber(tokens.getStringValue());
+ case PRTokeniser.TK_STRING:
+ PdfString str = new PdfString(tokens.getStringValue(), null).setHexWriting(tokens.isHexString());
+ str.setObjNum(objNum, objGen);
+ if (strings != null)
+ strings.add(str);
+ return str;
+ case PRTokeniser.TK_NAME:
+ return new PdfName(tokens.getStringValue(), false);
+ case PRTokeniser.TK_REF:
+ int num = tokens.getReference();
+ PRIndirectReference ref = new PRIndirectReference(this, num, tokens.getGeneration());
+ if (visited != null && !visited[num]) {
+ visited[num] = true;
+ newHits.put(num, 1);
+ }
+ return ref;
+ default:
+ return new PdfLiteral(-type, tokens.getStringValue());
+ }
+ }
+
+ /** Decodes a stream that has the FlateDecode filter.
+ * @param in the input data
+ * @return the decoded data
+ */
+ public static byte[] FlateDecode(byte in[]) {
+ byte b[] = FlateDecode(in, true);
+ if (b == null)
+ return FlateDecode(in, false);
+ return b;
+ }
+
+ /**
+ * @param in
+ * @param dicPar
+ * @return a byte array
+ */
+ public static byte[] decodePredictor(byte in[], PdfObject dicPar) {
+ if (dicPar == null || !dicPar.isDictionary())
+ return in;
+ PdfDictionary dic = (PdfDictionary)dicPar;
+ PdfObject obj = getPdfObject(dic.get(PdfName.PREDICTOR));
+ if (obj == null || !obj.isNumber())
+ return in;
+ int predictor = ((PdfNumber)obj).intValue();
+ if (predictor < 10)
+ return in;
+ int width = 1;
+ obj = getPdfObject(dic.get(PdfName.COLUMNS));
+ if (obj != null && obj.isNumber())
+ width = ((PdfNumber)obj).intValue();
+ int colors = 1;
+ obj = getPdfObject(dic.get(PdfName.COLORS));
+ if (obj != null && obj.isNumber())
+ colors = ((PdfNumber)obj).intValue();
+ int bpc = 8;
+ obj = getPdfObject(dic.get(PdfName.BITSPERCOMPONENT));
+ if (obj != null && obj.isNumber())
+ bpc = ((PdfNumber)obj).intValue();
+ DataInputStream dataStream = new DataInputStream(new ByteArrayInputStream(in));
+ ByteArrayOutputStream fout = new ByteArrayOutputStream(in.length);
+ int bytesPerPixel = colors * bpc / 8;
+ int bytesPerRow = (colors*width*bpc + 7)/8;
+ byte[] curr = new byte[bytesPerRow];
+ byte[] prior = new byte[bytesPerRow];
+
+ // Decode the (sub)image row-by-row
+ while (true) {
+ // Read the filter type byte and a row of data
+ int filter = 0;
+ try {
+ filter = dataStream.read();
+ if (filter < 0) {
+ return fout.toByteArray();
+ }
+ dataStream.readFully(curr, 0, bytesPerRow);
+ } catch (Exception e) {
+ return fout.toByteArray();
+ }
+
+ switch (filter) {
+ case 0: //PNG_FILTER_NONE
+ break;
+ case 1: //PNG_FILTER_SUB
+ for (int i = bytesPerPixel; i < bytesPerRow; i++) {
+ curr[i] += curr[i - bytesPerPixel];
+ }
+ break;
+ case 2: //PNG_FILTER_UP
+ for (int i = 0; i < bytesPerRow; i++) {
+ curr[i] += prior[i];
+ }
+ break;
+ case 3: //PNG_FILTER_AVERAGE
+ for (int i = 0; i < bytesPerPixel; i++) {
+ curr[i] += prior[i] / 2;
+ }
+ for (int i = bytesPerPixel; i < bytesPerRow; i++) {
+ curr[i] += ((curr[i - bytesPerPixel] & 0xff) + (prior[i] & 0xff))/2;
+ }
+ break;
+ case 4: //PNG_FILTER_PAETH
+ for (int i = 0; i < bytesPerPixel; i++) {
+ curr[i] += prior[i];
+ }
+
+ for (int i = bytesPerPixel; i < bytesPerRow; i++) {
+ int a = curr[i - bytesPerPixel] & 0xff;
+ int b = prior[i] & 0xff;
+ int c = prior[i - bytesPerPixel] & 0xff;
+
+ int p = a + b - c;
+ int pa = Math.abs(p - a);
+ int pb = Math.abs(p - b);
+ int pc = Math.abs(p - c);
+
+ int ret;
+
+ if ((pa <= pb) && (pa <= pc)) {
+ ret = a;
+ } else if (pb <= pc) {
+ ret = b;
+ } else {
+ ret = c;
+ }
+ curr[i] += (byte)(ret);
+ }
+ break;
+ default:
+ // Error -- uknown filter type
+ throw new RuntimeException("PNG filter unknown.");
+ }
+ try {
+ fout.write(curr);
+ }
+ catch (IOException ioe) {
+ // Never happens
+ }
+
+ // Swap curr and prior
+ byte[] tmp = prior;
+ prior = curr;
+ curr = tmp;
+ }
+ }
+
+ /** A helper to FlateDecode.
+ * @param in the input data
+ * @param strict <CODE>true</CODE> to read a correct stream. <CODE>false</CODE>
+ * to try to read a corrupted stream
+ * @return the decoded data
+ */
+ public static byte[] FlateDecode(byte in[], boolean strict) {
+ ByteArrayInputStream stream = new ByteArrayInputStream(in);
+ InflaterInputStream zip = new InflaterInputStream(stream);
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ byte b[] = new byte[strict ? 4092 : 1];
+ try {
+ int n;
+ while ((n = zip.read(b)) >= 0) {
+ out.write(b, 0, n);
+ }
+ zip.close();
+ out.close();
+ return out.toByteArray();
+ }
+ catch (Exception e) {
+ if (strict)
+ return null;
+ return out.toByteArray();
+ }
+ }
+
+ /** Decodes a stream that has the ASCIIHexDecode filter.
+ * @param in the input data
+ * @return the decoded data
+ */
+ public static byte[] ASCIIHexDecode(byte in[]) {
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ boolean first = true;
+ int n1 = 0;
+ for (int k = 0; k < in.length; ++k) {
+ int ch = in[k] & 0xff;
+ if (ch == '>')
+ break;
+ if (PRTokeniser.isWhitespace(ch))
+ continue;
+ int n = PRTokeniser.getHex(ch);
+ if (n == -1)
+ throw new RuntimeException("Illegal character in ASCIIHexDecode.");
+ if (first)
+ n1 = n;
+ else
+ out.write((byte)((n1 << 4) + n));
+ first = !first;
+ }
+ if (!first)
+ out.write((byte)(n1 << 4));
+ return out.toByteArray();
+ }
+
+ /** Decodes a stream that has the ASCII85Decode filter.
+ * @param in the input data
+ * @return the decoded data
+ */
+ public static byte[] ASCII85Decode(byte in[]) {
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ int state = 0;
+ int chn[] = new int[5];
+ for (int k = 0; k < in.length; ++k) {
+ int ch = in[k] & 0xff;
+ if (ch == '~')
+ break;
+ if (PRTokeniser.isWhitespace(ch))
+ continue;
+ if (ch == 'z' && state == 0) {
+ out.write(0);
+ out.write(0);
+ out.write(0);
+ out.write(0);
+ continue;
+ }
+ if (ch < '!' || ch > 'u')
+ throw new RuntimeException("Illegal character in ASCII85Decode.");
+ chn[state] = ch - '!';
+ ++state;
+ if (state == 5) {
+ state = 0;
+ int r = 0;
+ for (int j = 0; j < 5; ++j)
+ r = r * 85 + chn[j];
+ out.write((byte)(r >> 24));
+ out.write((byte)(r >> 16));
+ out.write((byte)(r >> 8));
+ out.write((byte)r);
+ }
+ }
+ int r = 0;
+ if (state == 1)
+ throw new RuntimeException("Illegal length in ASCII85Decode.");
+ if (state == 2) {
+ r = chn[0] * 85 * 85 * 85 * 85 + chn[1] * 85 * 85 * 85;
+ out.write((byte)(r >> 24));
+ }
+ else if (state == 3) {
+ r = chn[0] * 85 * 85 * 85 * 85 + chn[1] * 85 * 85 * 85 + chn[2] * 85 * 85;
+ out.write((byte)(r >> 24));
+ out.write((byte)(r >> 16));
+ }
+ else if (state == 4) {
+ r = chn[0] * 85 * 85 * 85 * 85 + chn[1] * 85 * 85 * 85 + chn[2] * 85 * 85 + chn[3] * 85 ;
+ out.write((byte)(r >> 24));
+ out.write((byte)(r >> 16));
+ out.write((byte)(r >> 8));
+ }
+ return out.toByteArray();
+ }
+
+ /** Decodes a stream that has the LZWDecode filter.
+ * @param in the input data
+ * @return the decoded data
+ */
+ public static byte[] LZWDecode(byte in[]) {
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ LZWDecoder lzw = new LZWDecoder();
+ lzw.decode(in, out);
+ return out.toByteArray();
+ }
+
+ /** Checks if the document had errors and was rebuilt.
+ * @return true if rebuilt.
+ *
+ */
+ public boolean isRebuilt() {
+ return this.rebuilt;
+ }
+
+ /** Gets the dictionary that represents a page.
+ * @param pageNum the page number. 1 is the first
+ * @return the page dictionary
+ */
+ public PdfDictionary getPageN(int pageNum) {
+ PdfDictionary dic = pageRefs.getPageN(pageNum);
+ if (dic == null)
+ return null;
+ if (appendable)
+ dic.setIndRef(pageRefs.getPageOrigRef(pageNum));
+ return dic;
+ }
+
+ /**
+ * @param pageNum
+ * @return a Dictionary object
+ */
+ public PdfDictionary getPageNRelease(int pageNum) {
+ PdfDictionary dic = getPageN(pageNum);
+ pageRefs.releasePage(pageNum);
+ return dic;
+ }
+
+ /**
+ * @param pageNum
+ */
+ public void releasePage(int pageNum) {
+ pageRefs.releasePage(pageNum);
+ }
+
+ /**
+ *
+ */
+ public void resetReleasePage() {
+ pageRefs.resetReleasePage();
+ }
+
+ /** Gets the page reference to this page.
+ * @param pageNum the page number. 1 is the first
+ * @return the page reference
+ */
+ public PRIndirectReference getPageOrigRef(int pageNum) {
+ return pageRefs.getPageOrigRef(pageNum);
+ }
+
+ /** Gets the contents of the page.
+ * @param pageNum the page number. 1 is the first
+ * @param file the location of the PDF document
+ * @throws IOException on error
+ * @return the content
+ */
+ public byte[] getPageContent(int pageNum, RandomAccessFileOrArray file) throws IOException{
+ PdfDictionary page = getPageNRelease(pageNum);
+ if (page == null)
+ return null;
+ PdfObject contents = getPdfObjectRelease(page.get(PdfName.CONTENTS));
+ if (contents == null)
+ return new byte[0];
+ ByteArrayOutputStream bout = null;
+ if (contents.isStream()) {
+ return getStreamBytes((PRStream)contents, file);
+ }
+ else if (contents.isArray()) {
+ PdfArray array = (PdfArray)contents;
+ ArrayList list = array.getArrayList();
+ bout = new ByteArrayOutputStream();
+ for (int k = 0; k < list.size(); ++k) {
+ PdfObject item = getPdfObjectRelease((PdfObject)list.get(k));
+ if (item == null || !item.isStream())
+ continue;
+ byte[] b = getStreamBytes((PRStream)item, file);
+ bout.write(b);
+ if (k != list.size() - 1)
+ bout.write('\n');
+ }
+ return bout.toByteArray();
+ }
+ else
+ return new byte[0];
+ }
+
+ /** Gets the contents of the page.
+ * @param pageNum the page number. 1 is the first
+ * @throws IOException on error
+ * @return the content
+ */
+ public byte[] getPageContent(int pageNum) throws IOException{
+ RandomAccessFileOrArray rf = getSafeFile();
+ try {
+ rf.reOpen();
+ return getPageContent(pageNum, rf);
+ }
+ finally {
+ try{rf.close();}catch(Exception e){}
+ }
+ }
+
+ protected void killXref(PdfObject obj) {
+ if (obj == null)
+ return;
+ if ((obj instanceof PdfIndirectReference) && !obj.isIndirect())
+ return;
+ switch (obj.type()) {
+ case PdfObject.INDIRECT: {
+ int xr = ((PRIndirectReference)obj).getNumber();
+ obj = (PdfObject)xrefObj.get(xr);
+ xrefObj.set(xr, null);
+ freeXref = xr;
+ killXref(obj);
+ break;
+ }
+ case PdfObject.ARRAY: {
+ ArrayList t = ((PdfArray)obj).getArrayList();
+ for (int i = 0; i < t.size(); ++i)
+ killXref((PdfObject)t.get(i));
+ break;
+ }
+ case PdfObject.STREAM:
+ case PdfObject.DICTIONARY: {
+ PdfDictionary dic = (PdfDictionary)obj;
+ for (Iterator i = dic.getKeys().iterator(); i.hasNext();){
+ killXref(dic.get((PdfName)i.next()));
+ }
+ break;
+ }
+ }
+ }
+
+ /** Sets the contents of the page.
+ * @param content the new page content
+ * @param pageNum the page number. 1 is the first
+ * @throws IOException on error
+ */
+ public void setPageContent(int pageNum, byte content[]) throws IOException{
+ PdfDictionary page = getPageN(pageNum);
+ if (page == null)
+ return;
+ PdfObject contents = page.get(PdfName.CONTENTS);
+ freeXref = -1;
+ killXref(contents);
+ if (freeXref == -1) {
+ xrefObj.add(null);
+ freeXref = xrefObj.size() - 1;
+ }
+ page.put(PdfName.CONTENTS, new PRIndirectReference(this, freeXref));
+ xrefObj.set(freeXref, new PRStream(this, content));
+ }
+
+ /** Get the content from a stream applying the required filters.
+ * @param stream the stream
+ * @param file the location where the stream is
+ * @throws IOException on error
+ * @return the stream content
+ */
+ public static byte[] getStreamBytes(PRStream stream, RandomAccessFileOrArray file) throws IOException {
+ PdfObject filter = getPdfObjectRelease(stream.get(PdfName.FILTER));
+ byte[] b = getStreamBytesRaw(stream, file);
+ ArrayList filters = new ArrayList();
+ if (filter != null) {
+ if (filter.isName())
+ filters.add(filter);
+ else if (filter.isArray())
+ filters = ((PdfArray)filter).getArrayList();
+ }
+ ArrayList dp = new ArrayList();
+ PdfObject dpo = getPdfObjectRelease(stream.get(PdfName.DECODEPARMS));
+ if (dpo == null || (!dpo.isDictionary() && !dpo.isArray()))
+ dpo = getPdfObjectRelease(stream.get(PdfName.DP));
+ if (dpo != null) {
+ if (dpo.isDictionary())
+ dp.add(dpo);
+ else if (dpo.isArray())
+ dp = ((PdfArray)dpo).getArrayList();
+ }
+ String name;
+ for (int j = 0; j < filters.size(); ++j) {
+ name = ((PdfName)PdfReader.getPdfObjectRelease((PdfObject)filters.get(j))).toString();
+ if (name.equals("/FlateDecode") || name.equals("/Fl")) {
+ b = PdfReader.FlateDecode(b);
+ PdfObject dicParam = null;
+ if (j < dp.size()) {
+ dicParam = (PdfObject)dp.get(j);
+ b = decodePredictor(b, dicParam);
+ }
+ }
+ else if (name.equals("/ASCIIHexDecode") || name.equals("/AHx"))
+ b = PdfReader.ASCIIHexDecode(b);
+ else if (name.equals("/ASCII85Decode") || name.equals("/A85"))
+ b = PdfReader.ASCII85Decode(b);
+ else if (name.equals("/LZWDecode")) {
+ b = PdfReader.LZWDecode(b);
+ PdfObject dicParam = null;
+ if (j < dp.size()) {
+ dicParam = (PdfObject)dp.get(j);
+ b = decodePredictor(b, dicParam);
+ }
+ }
+ else
+ throw new IOException("The filter " + name + " is not supported.");
+ }
+ return b;
+ }
+
+ /** Get the content from a stream applying the required filters.
+ * @param stream the stream
+ * @throws IOException on error
+ * @return the stream content
+ */
+ public static byte[] getStreamBytes(PRStream stream) throws IOException {
+ RandomAccessFileOrArray rf = stream.getReader().getSafeFile();
+ try {
+ rf.reOpen();
+ return PdfReader.getStreamBytes(stream, rf);
+ }
+ finally {
+ try{rf.close();}catch(Exception e){}
+ }
+ }
+
+ /** Get the content from a stream as it is without applying any filter.
+ * @param stream the stream
+ * @param file the location where the stream is
+ * @throws IOException on error
+ * @return the stream content
+ */
+ public static byte[] getStreamBytesRaw(PRStream stream, RandomAccessFileOrArray file) throws IOException {
+ PdfReader reader = stream.getReader();
+ byte b[];
+ if (stream.getOffset() < 0)
+ b = stream.getBytes();
+ else {
+ b = new byte[stream.getLength()];
+ file.seek(stream.getOffset());
+ file.readFully(b);
+ PdfEncryption decrypt = reader.getDecrypt();
+ if (decrypt != null) {
+ decrypt.setHashKey(stream.getObjNum(), stream.getObjGen());
+ decrypt.prepareKey();
+ decrypt.encryptRC4(b);
+ }
+ }
+ return b;
+ }
+
+ /** Get the content from a stream as it is without applying any filter.
+ * @param stream the stream
+ * @throws IOException on error
+ * @return the stream content
+ */
+ public static byte[] getStreamBytesRaw(PRStream stream) throws IOException {
+ RandomAccessFileOrArray rf = stream.getReader().getSafeFile();
+ try {
+ rf.reOpen();
+ return PdfReader.getStreamBytesRaw(stream, rf);
+ }
+ finally {
+ try{rf.close();}catch(Exception e){}
+ }
+ }
+
+ /** Eliminates shared streams if they exist. */
+ public void eliminateSharedStreams() {
+ if (!sharedStreams)
+ return;
+ sharedStreams = false;
+ if (pageRefs.size() == 1)
+ return;
+ ArrayList newRefs = new ArrayList();
+ ArrayList newStreams = new ArrayList();
+ IntHashtable visited = new IntHashtable();
+ for (int k = 1; k <= pageRefs.size(); ++k) {
+ PdfDictionary page = pageRefs.getPageN(k);
+ if (page == null)
+ continue;
+ PdfObject contents = getPdfObject(page.get(PdfName.CONTENTS));
+ if (contents == null)
+ continue;
+ if (contents.isStream()) {
+ PRIndirectReference ref = (PRIndirectReference)page.get(PdfName.CONTENTS);
+ if (visited.containsKey(ref.getNumber())) {
+ // need to duplicate
+ newRefs.add(ref);
+ newStreams.add(new PRStream((PRStream)contents, null));
+ }
+ else
+ visited.put(ref.getNumber(), 1);
+ }
+ else if (contents.isArray()) {
+ PdfArray array = (PdfArray)contents;
+ ArrayList list = array.getArrayList();
+ for (int j = 0; j < list.size(); ++j) {
+ PRIndirectReference ref = (PRIndirectReference)list.get(j);
+ if (visited.containsKey(ref.getNumber())) {
+ // need to duplicate
+ newRefs.add(ref);
+ newStreams.add(new PRStream((PRStream)getPdfObject(ref), null));
+ }
+ else
+ visited.put(ref.getNumber(), 1);
+ }
+ }
+ }
+ if (newStreams.size() == 0)
+ return;
+ for (int k = 0; k < newStreams.size(); ++k) {
+ xrefObj.add(newStreams.get(k));
+ PRIndirectReference ref = (PRIndirectReference)newRefs.get(k);
+ ref.setNumber(xrefObj.size() - 1, 0);
+ }
+ }
+
+ /** Checks if the document was changed.
+ * @return <CODE>true</CODE> if the document was changed,
+ * <CODE>false</CODE> otherwise
+ */
+ public boolean isTampered() {
+ return tampered;
+ }
+
+ /**
+ * Sets the tampered state. A tampered PdfReader cannot be reused in PdfStamper.
+ * @param tampered the tampered state
+ */
+ public void setTampered(boolean tampered) {
+ this.tampered = tampered;
+ }
+
+ /** Gets the XML metadata.
+ * @throws IOException on error
+ * @return the XML metadata
+ */
+ public byte[] getMetadata() throws IOException {
+ PdfObject obj = getPdfObject(catalog.get(PdfName.METADATA));
+ if (!(obj instanceof PRStream))
+ return null;
+ RandomAccessFileOrArray rf = getSafeFile();
+ byte b[] = null;
+ try {
+ rf.reOpen();
+ b = getStreamBytes((PRStream)obj, rf);
+ }
+ finally {
+ try {
+ rf.close();
+ }
+ catch (Exception e) {
+ // empty on purpose
+ }
+ }
+ return b;
+ }
+
+ /**
+ * Gets the byte address of the last xref table.
+ * @return the byte address of the last xref table
+ */
+ public int getLastXref() {
+ return lastXref;
+ }
+
+ /**
+ * Gets the number of xref objects.
+ * @return the number of xref objects
+ */
+ public int getXrefSize() {
+ return xrefObj.size();
+ }
+
+ /**
+ * Gets the byte address of the %%EOF marker.
+ * @return the byte address of the %%EOF marker
+ */
+ public int getEofPos() {
+ return eofPos;
+ }
+
+ /**
+ * Gets the PDF version. Only the last version char is returned. For example
+ * version 1.4 is returned as '4'.
+ * @return the PDF version
+ */
+ public char getPdfVersion() {
+ return pdfVersion;
+ }
+
+ /**
+ * Returns <CODE>true</CODE> if the PDF is encrypted.
+ * @return <CODE>true</CODE> if the PDF is encrypted
+ */
+ public boolean isEncrypted() {
+ return encrypted;
+ }
+
+ /**
+ * Gets the encryption permissions. It can be used directly in
+ * <CODE>PdfWriter.setEncryption()</CODE>.
+ * @return the encryption permissions
+ */
+ public int getPermissions() {
+ return pValue;
+ }
+
+ /**
+ * Returns <CODE>true</CODE> if the PDF has a 128 bit key encryption.
+ * @return <CODE>true</CODE> if the PDF has a 128 bit key encryption
+ */
+ public boolean is128Key() {
+ return rValue == 3;
+ }
+
+ /**
+ * Gets the trailer dictionary
+ * @return the trailer dictionary
+ */
+ public PdfDictionary getTrailer() {
+ return trailer;
+ }
+
+ PdfEncryption getDecrypt() {
+ return decrypt;
+ }
+
+ static boolean equalsn(byte a1[], byte a2[]) {
+ int length = a2.length;
+ for (int k = 0; k < length; ++k) {
+ if (a1[k] != a2[k])
+ return false;
+ }
+ return true;
+ }
+
+ static boolean existsName(PdfDictionary dic, PdfName key, PdfName value) {
+ PdfObject type = getPdfObjectRelease(dic.get(key));
+ if (type == null || !type.isName())
+ return false;
+ PdfName name = (PdfName)type;
+ return name.equals(value);
+ }
+
+ static String getFontName(PdfDictionary dic) {
+ PdfObject type = getPdfObjectRelease(dic.get(PdfName.BASEFONT));
+ if (type == null || !type.isName())
+ return null;
+ return PdfName.decodeName(type.toString());
+ }
+
+ static String getSubsetPrefix(PdfDictionary dic) {
+ String s = getFontName(dic);
+ if (s == null)
+ return null;
+ if (s.length() < 8 || s.charAt(6) != '+')
+ return null;
+ for (int k = 0; k < 6; ++k) {
+ char c = s.charAt(k);
+ if (c < 'A' || c > 'Z')
+ return null;
+ }
+ return s;
+ }
+
+ /** Finds all the font subsets and changes the prefixes to some
+ * random values.
+ * @return the number of font subsets altered
+ */
+ public int shuffleSubsetNames() {
+ int total = 0;
+ for (int k = 1; k < xrefObj.size(); ++k) {
+ PdfObject obj = getPdfObjectRelease(k);
+ if (obj == null || !obj.isDictionary())
+ continue;
+ PdfDictionary dic = (PdfDictionary)obj;
+ if (!existsName(dic, PdfName.TYPE, PdfName.FONT))
+ continue;
+ if (existsName(dic, PdfName.SUBTYPE, PdfName.TYPE1)
+ || existsName(dic, PdfName.SUBTYPE, PdfName.MMTYPE1)
+ || existsName(dic, PdfName.SUBTYPE, PdfName.TRUETYPE)) {
+ String s = getSubsetPrefix(dic);
+ if (s == null)
+ continue;
+ String ns = BaseFont.createSubsetPrefix() + s.substring(7);
+ PdfName newName = new PdfName(ns);
+ dic.put(PdfName.BASEFONT, newName);
+ setXrefPartialObject(k, dic);
+ ++total;
+ PdfDictionary fd = (PdfDictionary)getPdfObject(dic.get(PdfName.FONTDESCRIPTOR));
+ if (fd == null)
+ continue;
+ fd.put(PdfName.FONTNAME, newName);
+ }
+ else if (existsName(dic, PdfName.SUBTYPE, PdfName.TYPE0)) {
+ String s = getSubsetPrefix(dic);
+ PdfArray arr = (PdfArray)getPdfObject(dic.get(PdfName.DESCENDANTFONTS));
+ if (arr == null)
+ continue;
+ ArrayList list = arr.getArrayList();
+ if (list.size() == 0)
+ continue;
+ PdfDictionary desc = (PdfDictionary)getPdfObject((PdfObject)list.get(0));
+ String sde = getSubsetPrefix(desc);
+ if (sde == null)
+ continue;
+ String ns = BaseFont.createSubsetPrefix();
+ if (s != null)
+ dic.put(PdfName.BASEFONT, new PdfName(ns + s.substring(7)));
+ setXrefPartialObject(k, dic);
+ PdfName newName = new PdfName(ns + sde.substring(7));
+ desc.put(PdfName.BASEFONT, newName);
+ ++total;
+ PdfDictionary fd = (PdfDictionary)getPdfObject(desc.get(PdfName.FONTDESCRIPTOR));
+ if (fd == null)
+ continue;
+ fd.put(PdfName.FONTNAME, newName);
+ }
+ }
+ return total;
+ }
+
+ /** Finds all the fonts not subset but embedded and marks them as subset.
+ * @return the number of fonts altered
+ */
+ public int createFakeFontSubsets() {
+ int total = 0;
+ for (int k = 1; k < xrefObj.size(); ++k) {
+ PdfObject obj = getPdfObjectRelease(k);
+ if (obj == null || !obj.isDictionary())
+ continue;
+ PdfDictionary dic = (PdfDictionary)obj;
+ if (!existsName(dic, PdfName.TYPE, PdfName.FONT))
+ continue;
+ if (existsName(dic, PdfName.SUBTYPE, PdfName.TYPE1)
+ || existsName(dic, PdfName.SUBTYPE, PdfName.MMTYPE1)
+ || existsName(dic, PdfName.SUBTYPE, PdfName.TRUETYPE)) {
+ String s = getSubsetPrefix(dic);
+ if (s != null)
+ continue;
+ s = getFontName(dic);
+ if (s == null)
+ continue;
+ String ns = BaseFont.createSubsetPrefix() + s;
+ PdfDictionary fd = (PdfDictionary)getPdfObjectRelease(dic.get(PdfName.FONTDESCRIPTOR));
+ if (fd == null)
+ continue;
+ if (fd.get(PdfName.FONTFILE) == null && fd.get(PdfName.FONTFILE2) == null
+ && fd.get(PdfName.FONTFILE3) == null)
+ continue;
+ fd = (PdfDictionary)getPdfObject(dic.get(PdfName.FONTDESCRIPTOR));
+ PdfName newName = new PdfName(ns);
+ dic.put(PdfName.BASEFONT, newName);
+ fd.put(PdfName.FONTNAME, newName);
+ setXrefPartialObject(k, dic);
+ ++total;
+ }
+ }
+ return total;
+ }
+
+ private static PdfArray getNameArray(PdfObject obj) {
+ if (obj == null)
+ return null;
+ obj = getPdfObjectRelease(obj);
+ if (obj.isArray())
+ return (PdfArray)obj;
+ else if (obj.isDictionary()) {
+ PdfObject arr2 = getPdfObjectRelease(((PdfDictionary)obj).get(PdfName.D));
+ if (arr2 != null && arr2.isArray())
+ return (PdfArray)arr2;
+ }
+ return null;
+ }
+
+ /**
+ * Gets all the named destinations as an <CODE>HashMap</CODE>. The key is the name
+ * and the value is the destinations array.
+ * @return gets all the named destinations
+ */
+ public HashMap getNamedDestination() {
+ HashMap names = getNamedDestinationFromNames();
+ names.putAll(getNamedDestinationFromStrings());
+ return names;
+ }
+
+ /**
+ * Gets the named destinations from the /Dests key in the catalog as an <CODE>HashMap</CODE>. The key is the name
+ * and the value is the destinations array.
+ * @return gets the named destinations
+ */
+ public HashMap getNamedDestinationFromNames() {
+ HashMap names = new HashMap();
+ if (catalog.get(PdfName.DESTS) != null) {
+ PdfDictionary dic = (PdfDictionary)getPdfObjectRelease(catalog.get(PdfName.DESTS));
+ Set keys = dic.getKeys();
+ for (Iterator it = keys.iterator(); it.hasNext();) {
+ PdfName key = (PdfName)it.next();
+ String name = PdfName.decodeName(key.toString());
+ PdfArray arr = getNameArray(dic.get(key));
+ if (arr != null)
+ names.put(name, arr);
+ }
+ }
+ return names;
+ }
+
+ /**
+ * Gets the named destinations from the /Names key in the catalog as an <CODE>HashMap</CODE>. The key is the name
+ * and the value is the destinations array.
+ * @return gets the named destinations
+ */
+ public HashMap getNamedDestinationFromStrings() {
+ if (catalog.get(PdfName.NAMES) != null) {
+ PdfDictionary dic = (PdfDictionary)getPdfObjectRelease(catalog.get(PdfName.NAMES));
+ dic = (PdfDictionary)getPdfObjectRelease(dic.get(PdfName.DESTS));
+ if (dic != null) {
+ HashMap names = PdfNameTree.readTree(dic);
+ for (Iterator it = names.entrySet().iterator(); it.hasNext();) {
+ Map.Entry entry = (Map.Entry)it.next();
+ PdfArray arr = getNameArray((PdfObject)entry.getValue());
+ if (arr != null)
+ entry.setValue(arr);
+ else
+ it.remove();
+ }
+ return names;
+ }
+ }
+ return new HashMap();
+ }
+
+ private boolean replaceNamedDestination(PdfObject obj, HashMap names) {
+ obj = getPdfObject(obj);
+ int objIdx = lastXrefPartial;
+ releaseLastXrefPartial();
+ if (obj != null && obj.isDictionary()) {
+ PdfObject ob2 = getPdfObjectRelease(((PdfDictionary)obj).get(PdfName.DEST));
+ String name = null;
+ if (ob2 != null) {
+ if (ob2.isName())
+ name = PdfName.decodeName(ob2.toString());
+ else if (ob2.isString())
+ name = ob2.toString();
+ PdfArray dest = (PdfArray)names.get(name);
+ if (dest != null) {
+ ((PdfDictionary)obj).put(PdfName.DEST, dest);
+ setXrefPartialObject(objIdx, obj);
+ return true;
+ }
+ }
+ else if ((ob2 = getPdfObject(((PdfDictionary)obj).get(PdfName.A))) != null) {
+ int obj2Idx = lastXrefPartial;
+ releaseLastXrefPartial();
+ PdfDictionary dic = (PdfDictionary)ob2;
+ PdfName type = (PdfName)getPdfObjectRelease(dic.get(PdfName.S));
+ if (PdfName.GOTO.equals(type)) {
+ PdfObject ob3 = getPdfObjectRelease(dic.get(PdfName.D));
+ if (ob3.isName())
+ name = PdfName.decodeName(ob3.toString());
+ else if (ob3.isString())
+ name = ob3.toString();
+ PdfArray dest = (PdfArray)names.get(name);
+ if (dest != null) {
+ dic.put(PdfName.D, dest);
+ setXrefPartialObject(obj2Idx, ob2);
+ setXrefPartialObject(objIdx, obj);
+ return true;
+ }
+ }
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Removes all the fields from the document.
+ */
+ public void removeFields() {
+ pageRefs.resetReleasePage();
+ for (int k = 1; k <= pageRefs.size(); ++k) {
+ PdfDictionary page = pageRefs.getPageN(k);
+ PdfArray annots = (PdfArray)getPdfObject(page.get(PdfName.ANNOTS));
+ if (annots == null) {
+ pageRefs.releasePage(k);
+ continue;
+ }
+ ArrayList arr = annots.getArrayList();
+ for (int j = 0; j < arr.size(); ++j) {
+ PdfDictionary annot = (PdfDictionary)getPdfObjectRelease((PdfObject)arr.get(j));
+ if (PdfName.WIDGET.equals(annot.get(PdfName.SUBTYPE)))
+ arr.remove(j--);
+ }
+ if (arr.isEmpty())
+ page.remove(PdfName.ANNOTS);
+ else
+ pageRefs.releasePage(k);
+ }
+ catalog.remove(PdfName.ACROFORM);
+ pageRefs.resetReleasePage();
+ }
+
+ /**
+ * Removes all the annotations and fields from the document.
+ */
+ public void removeAnnotations() {
+ pageRefs.resetReleasePage();
+ for (int k = 1; k <= pageRefs.size(); ++k) {
+ PdfDictionary page = pageRefs.getPageN(k);
+ if (page.get(PdfName.ANNOTS) == null)
+ pageRefs.releasePage(k);
+ else
+ page.remove(PdfName.ANNOTS);
+ }
+ catalog.remove(PdfName.ACROFORM);
+ pageRefs.resetReleasePage();
+ }
+
+ private void iterateBookmarks(PdfObject outlineRef, HashMap names) {
+ while (outlineRef != null) {
+ replaceNamedDestination(outlineRef, names);
+ PdfDictionary outline = (PdfDictionary)getPdfObjectRelease(outlineRef);
+ PdfObject first = outline.get(PdfName.FIRST);
+ if (first != null) {
+ iterateBookmarks(first, names);
+ }
+ outlineRef = outline.get(PdfName.NEXT);
+ }
+ }
+
+ /** Replaces all the local named links with the actual destinations. */
+ public void consolidateNamedDestinations() {
+ if (consolidateNamedDestinations)
+ return;
+ consolidateNamedDestinations = true;
+ HashMap names = getNamedDestination();
+ if (names.size() == 0)
+ return;
+ for (int k = 1; k <= pageRefs.size(); ++k) {
+ PdfDictionary page = pageRefs.getPageN(k);
+ PdfObject annotsRef;
+ PdfArray annots = (PdfArray)getPdfObject(annotsRef = page.get(PdfName.ANNOTS));
+ int annotIdx = lastXrefPartial;
+ releaseLastXrefPartial();
+ if (annots == null) {
+ pageRefs.releasePage(k);
+ continue;
+ }
+ ArrayList list = annots.getArrayList();
+ boolean commitAnnots = false;
+ for (int an = 0; an < list.size(); ++an) {
+ PdfObject objRef = (PdfObject)list.get(an);
+ if (replaceNamedDestination(objRef, names) && !objRef.isIndirect())
+ commitAnnots = true;
+ }
+ if (commitAnnots)
+ setXrefPartialObject(annotIdx, annots);
+ if (!commitAnnots || annotsRef.isIndirect())
+ pageRefs.releasePage(k);
+ }
+ PdfDictionary outlines = (PdfDictionary)getPdfObjectRelease(catalog.get(PdfName.OUTLINES));
+ if (outlines == null)
+ return;
+ iterateBookmarks(outlines.get(PdfName.FIRST), names);
+ }
+
+ protected static PdfDictionary duplicatePdfDictionary(PdfDictionary original, PdfDictionary copy, PdfReader newReader) {
+ if (copy == null)
+ copy = new PdfDictionary();
+ for (Iterator it = original.getKeys().iterator(); it.hasNext();) {
+ PdfName key = (PdfName)it.next();
+ copy.put(key, duplicatePdfObject(original.get(key), newReader));
+ }
+ return copy;
+ }
+
+ protected static PdfObject duplicatePdfObject(PdfObject original, PdfReader newReader) {
+ if (original == null)
+ return null;
+ switch (original.type()) {
+ case PdfObject.DICTIONARY: {
+ return duplicatePdfDictionary((PdfDictionary)original, null, newReader);
+ }
+ case PdfObject.STREAM: {
+ PRStream org = (PRStream)original;
+ PRStream stream = new PRStream(org, null, newReader);
+ duplicatePdfDictionary(org, stream, newReader);
+ return stream;
+ }
+ case PdfObject.ARRAY: {
+ ArrayList list = ((PdfArray)original).getArrayList();
+ PdfArray arr = new PdfArray();
+ for (Iterator it = list.iterator(); it.hasNext();) {
+ arr.add(duplicatePdfObject((PdfObject)it.next(), newReader));
+ }
+ return arr;
+ }
+ case PdfObject.INDIRECT: {
+ PRIndirectReference org = (PRIndirectReference)original;
+ return new PRIndirectReference(newReader, org.getNumber(), org.getGeneration());
+ }
+ default:
+ return original;
+ }
+ }
+
+ /**
+ * Closes the reader
+ */
+ public void close() {
+ if (!partial)
+ return;
+ try {
+ tokens.close();
+ }
+ catch (IOException e) {
+ throw new ExceptionConverter(e);
+ }
+ }
+
+ protected void removeUnusedNode(PdfObject obj, boolean hits[]) {
+ if (obj == null)
+ return;
+ switch (obj.type()) {
+ case PdfObject.DICTIONARY:
+ case PdfObject.STREAM: {
+ PdfDictionary dic = (PdfDictionary)obj;
+ for (Iterator it = dic.getKeys().iterator(); it.hasNext();) {
+ PdfName key = (PdfName)it.next();
+ PdfObject v = dic.get(key);
+ if (v.isIndirect()) {
+ int num = ((PRIndirectReference)v).getNumber();
+ if (num >= xrefObj.size() || (!partial && xrefObj.get(num) == null)) {
+ dic.put(key, PdfNull.PDFNULL);
+ continue;
+ }
+ }
+ removeUnusedNode(v, hits);
+ }
+ break;
+ }
+ case PdfObject.ARRAY: {
+ ArrayList list = ((PdfArray)obj).getArrayList();
+ for (int k = 0; k < list.size(); ++k) {
+ PdfObject v = (PdfObject)list.get(k);
+ if (v.isIndirect()) {
+ int num = ((PRIndirectReference)v).getNumber();
+ if (num >= xrefObj.size() || (!partial && xrefObj.get(num) == null)) {
+ list.set(k, PdfNull.PDFNULL);
+ continue;
+ }
+ }
+ removeUnusedNode(v, hits);
+ }
+ break;
+ }
+ case PdfObject.INDIRECT: {
+ PRIndirectReference ref = (PRIndirectReference)obj;
+ int num = ref.getNumber();
+ if (!hits[num]) {
+ hits[num] = true;
+ removeUnusedNode(getPdfObjectRelease(ref), hits);
+ }
+ }
+ }
+ }
+
+ /** Removes all the unreachable objects.
+ * @return the number of indirect objects removed
+ */
+ public int removeUnusedObjects() {
+ boolean hits[] = new boolean[xrefObj.size()];
+ removeUnusedNode(trailer, hits);
+ int total = 0;
+ if (partial) {
+ for (int k = 1; k < hits.length; ++k) {
+ if (!hits[k]) {
+ xref[k * 2] = -1;
+ xref[k * 2 + 1] = 0;
+ xrefObj.set(k, null);
+ ++total;
+ }
+ }
+ }
+ else {
+ for (int k = 1; k < hits.length; ++k) {
+ if (!hits[k]) {
+ xrefObj.set(k, null);
+ ++total;
+ }
+ }
+ }
+ return total;
+ }
+
+ /** Gets a read-only version of <CODE>AcroFields</CODE>.
+ * @return a read-only version of <CODE>AcroFields</CODE>
+ */
+ public AcroFields getAcroFields() {
+ return new AcroFields(this, null);
+ }
+
+ /**
+ * Gets the global document JavaScript.
+ * @param file the document file
+ * @throws IOException on error
+ * @return the global document JavaScript
+ */
+ public String getJavaScript(RandomAccessFileOrArray file) throws IOException {
+ PdfDictionary names = (PdfDictionary)getPdfObjectRelease(catalog.get(PdfName.NAMES));
+ if (names == null)
+ return null;
+ PdfDictionary js = (PdfDictionary)getPdfObjectRelease(names.get(PdfName.JAVASCRIPT));
+ if (js == null)
+ return null;
+ HashMap jscript = PdfNameTree.readTree(js);
+ String sortedNames[] = new String[jscript.size()];
+ sortedNames = (String[])jscript.keySet().toArray(sortedNames);
+ Arrays.sort(sortedNames, new StringCompare());
+ StringBuffer buf = new StringBuffer();
+ for (int k = 0; k < sortedNames.length; ++k) {
+ PdfDictionary j = (PdfDictionary)getPdfObjectRelease((PdfIndirectReference)jscript.get(sortedNames[k]));
+ if (j == null)
+ continue;
+ PdfObject obj = getPdfObjectRelease(j.get(PdfName.JS));
+ if (obj.isString())
+ buf.append(((PdfString)obj).toUnicodeString()).append('\n');
+ else if (obj.isStream()) {
+ byte bytes[] = getStreamBytes((PRStream)obj, file);
+ if (bytes.length >= 2 && bytes[0] == (byte)254 && bytes[1] == (byte)255)
+ buf.append(PdfEncodings.convertToString(bytes, PdfObject.TEXT_UNICODE));
+ else
+ buf.append(PdfEncodings.convertToString(bytes, PdfObject.TEXT_PDFDOCENCODING));
+ buf.append('\n');
+ }
+ }
+ return buf.toString();
+ }
+
+ /**
+ * Gets the global document JavaScript.
+ * @throws IOException on error
+ * @return the global document JavaScript
+ */
+ public String getJavaScript() throws IOException {
+ RandomAccessFileOrArray rf = getSafeFile();
+ try {
+ rf.reOpen();
+ return getJavaScript(rf);
+ }
+ finally {
+ try{rf.close();}catch(Exception e){}
+ }
+ }
+
+ /**
+ * Selects the pages to keep in the document. The pages are described as
+ * ranges. The page ordering can be changed but
+ * no page repetitions are allowed. Note that it may be very slow in partial mode.
+ * @param ranges the comma separated ranges as described in {@link SequenceList}
+ */
+ public void selectPages(String ranges) {
+ selectPages(SequenceList.expand(ranges, getNumberOfPages()));
+ }
+
+ /**
+ * Selects the pages to keep in the document. The pages are described as a
+ * <CODE>List</CODE> of <CODE>Integer</CODE>. The page ordering can be changed but
+ * no page repetitions are allowed. Note that it may be very slow in partial mode.
+ * @param pagesToKeep the pages to keep in the document
+ */
+ public void selectPages(List pagesToKeep) {
+ pageRefs.selectPages(pagesToKeep);
+ removeUnusedObjects();
+ }
+
+ /**
+ * @param preferences
+ * @param catalog
+ */
+ public static void setViewerPreferences(int preferences, PdfDictionary catalog) {
+ catalog.remove(PdfName.PAGELAYOUT);
+ catalog.remove(PdfName.PAGEMODE);
+ catalog.remove(PdfName.VIEWERPREFERENCES);
+ if ((preferences & PdfWriter.PageLayoutSinglePage) != 0)
+ catalog.put(PdfName.PAGELAYOUT, PdfName.SINGLEPAGE);
+ else if ((preferences & PdfWriter.PageLayoutOneColumn) != 0)
+ catalog.put(PdfName.PAGELAYOUT, PdfName.ONECOLUMN);
+ else if ((preferences & PdfWriter.PageLayoutTwoColumnLeft) != 0)
+ catalog.put(PdfName.PAGELAYOUT, PdfName.TWOCOLUMNLEFT);
+ else if ((preferences & PdfWriter.PageLayoutTwoColumnRight) != 0)
+ catalog.put(PdfName.PAGELAYOUT, PdfName.TWOCOLUMNRIGHT);
+ else if ((preferences & PdfWriter.PageLayoutTwoPageLeft) != 0)
+ catalog.put(PdfName.PAGELAYOUT, PdfName.TWOPAGELEFT);
+ else if ((preferences & PdfWriter.PageLayoutTwoPageRight) != 0)
+ catalog.put(PdfName.PAGELAYOUT, PdfName.TWOPAGERIGHT);
+ if ((preferences & PdfWriter.PageModeUseNone) != 0)
+ catalog.put(PdfName.PAGEMODE, PdfName.USENONE);
+ else if ((preferences & PdfWriter.PageModeUseOutlines) != 0)
+ catalog.put(PdfName.PAGEMODE, PdfName.USEOUTLINES);
+ else if ((preferences & PdfWriter.PageModeUseThumbs) != 0)
+ catalog.put(PdfName.PAGEMODE, PdfName.USETHUMBS);
+ else if ((preferences & PdfWriter.PageModeFullScreen) != 0)
+ catalog.put(PdfName.PAGEMODE, PdfName.FULLSCREEN);
+ else if ((preferences & PdfWriter.PageModeUseOC) != 0)
+ catalog.put(PdfName.PAGEMODE, PdfName.USEOC);
+ else if ((preferences & PdfWriter.PageModeUseAttachments) != 0)
+ catalog.put(PdfName.PAGEMODE, PdfName.USEATTACHMENTS);
+ if ((preferences & PdfWriter.ViewerPreferencesMask) == 0)
+ return;
+ PdfDictionary vp = new PdfDictionary();
+ if ((preferences & PdfWriter.HideToolbar) != 0)
+ vp.put(PdfName.HIDETOOLBAR, PdfBoolean.PDFTRUE);
+ if ((preferences & PdfWriter.HideMenubar) != 0)
+ vp.put(PdfName.HIDEMENUBAR, PdfBoolean.PDFTRUE);
+ if ((preferences & PdfWriter.HideWindowUI) != 0)
+ vp.put(PdfName.HIDEWINDOWUI, PdfBoolean.PDFTRUE);
+ if ((preferences & PdfWriter.FitWindow) != 0)
+ vp.put(PdfName.FITWINDOW, PdfBoolean.PDFTRUE);
+ if ((preferences & PdfWriter.CenterWindow) != 0)
+ vp.put(PdfName.CENTERWINDOW, PdfBoolean.PDFTRUE);
+ if ((preferences & PdfWriter.DisplayDocTitle) != 0)
+ vp.put(PdfName.DISPLAYDOCTITLE, PdfBoolean.PDFTRUE);
+ if ((preferences & PdfWriter.NonFullScreenPageModeUseNone) != 0)
+ vp.put(PdfName.NONFULLSCREENPAGEMODE, PdfName.USENONE);
+ else if ((preferences & PdfWriter.NonFullScreenPageModeUseOutlines) != 0)
+ vp.put(PdfName.NONFULLSCREENPAGEMODE, PdfName.USEOUTLINES);
+ else if ((preferences & PdfWriter.NonFullScreenPageModeUseThumbs) != 0)
+ vp.put(PdfName.NONFULLSCREENPAGEMODE, PdfName.USETHUMBS);
+ else if ((preferences & PdfWriter.NonFullScreenPageModeUseOC) != 0)
+ vp.put(PdfName.NONFULLSCREENPAGEMODE, PdfName.USEOC);
+ if ((preferences & PdfWriter.DirectionL2R) != 0)
+ vp.put(PdfName.DIRECTION, PdfName.L2R);
+ else if ((preferences & PdfWriter.DirectionR2L) != 0)
+ vp.put(PdfName.DIRECTION, PdfName.R2L);
+ if ((preferences & PdfWriter.PrintScalingNone) != 0)
+ vp.put(PdfName.PRINTSCALING, PdfName.NONE);
+ catalog.put(PdfName.VIEWERPREFERENCES, vp);
+ }
+
+ /**
+ * @param preferences
+ */
+ public void setViewerPreferences(int preferences) {
+ setViewerPreferences(preferences, catalog);
+ }
+
+ /**
+ * @return an int that contains the Viewer Preferences.
+ */
+ public int getViewerPreferences() {
+ int prefs = 0;
+ PdfName name = null;
+ PdfObject obj = getPdfObjectRelease(catalog.get(PdfName.PAGELAYOUT));
+ if (obj != null && obj.isName()) {
+ name = (PdfName)obj;
+ if (name.equals(PdfName.SINGLEPAGE))
+ prefs |= PdfWriter.PageLayoutSinglePage;
+ else if (name.equals(PdfName.ONECOLUMN))
+ prefs |= PdfWriter.PageLayoutOneColumn;
+ else if (name.equals(PdfName.TWOCOLUMNLEFT))
+ prefs |= PdfWriter.PageLayoutTwoColumnLeft;
+ else if (name.equals(PdfName.TWOCOLUMNRIGHT))
+ prefs |= PdfWriter.PageLayoutTwoColumnRight;
+ else if (name.equals(PdfName.TWOPAGELEFT))
+ prefs |= PdfWriter.PageLayoutTwoPageLeft;
+ else if (name.equals(PdfName.TWOPAGERIGHT))
+ prefs |= PdfWriter.PageLayoutTwoPageRight;
+ }
+ obj = getPdfObjectRelease(catalog.get(PdfName.PAGEMODE));
+ if (obj != null && obj.isName()) {
+ name = (PdfName)obj;
+ if (name.equals(PdfName.USENONE))
+ prefs |= PdfWriter.PageModeUseNone;
+ else if (name.equals(PdfName.USEOUTLINES))
+ prefs |= PdfWriter.PageModeUseOutlines;
+ else if (name.equals(PdfName.USETHUMBS))
+ prefs |= PdfWriter.PageModeUseThumbs;
+ else if (name.equals(PdfName.USEOC))
+ prefs |= PdfWriter.PageModeUseOC;
+ else if (name.equals(PdfName.USEATTACHMENTS))
+ prefs |= PdfWriter.PageModeUseAttachments;
+ }
+ obj = getPdfObjectRelease(catalog.get(PdfName.VIEWERPREFERENCES));
+ if (obj == null || !obj.isDictionary())
+ return prefs;
+ PdfDictionary vp = (PdfDictionary)obj;
+ for (int k = 0; k < vpnames.length; ++k) {
+ obj = getPdfObject(vp.get(vpnames[k]));
+ if (obj != null && "true".equals(obj.toString()))
+ prefs |= vpints[k];
+ }
+ obj = getPdfObjectRelease(vp.get(PdfName.PRINTSCALING));
+ if (PdfName.NONE.equals(obj))
+ prefs |= PdfWriter.PrintScalingNone;
+ obj = getPdfObjectRelease(vp.get(PdfName.NONFULLSCREENPAGEMODE));
+ if (obj != null && obj.isName()) {
+ name = (PdfName)obj;
+ if (name.equals(PdfName.USENONE))
+ prefs |= PdfWriter.NonFullScreenPageModeUseNone;
+ else if (name.equals(PdfName.USEOUTLINES))
+ prefs |= PdfWriter.NonFullScreenPageModeUseOutlines;
+ else if (name.equals(PdfName.USETHUMBS))
+ prefs |= PdfWriter.NonFullScreenPageModeUseThumbs;
+ else if (name.equals(PdfName.USEOC))
+ prefs |= PdfWriter.NonFullScreenPageModeUseOC;
+ }
+ obj = getPdfObjectRelease(vp.get(PdfName.DIRECTION));
+ if (obj != null && obj.isName()) {
+ name = (PdfName)obj;
+ if (name.equals(PdfName.L2R))
+ prefs |= PdfWriter.DirectionL2R;
+ else if (name.equals(PdfName.R2L))
+ prefs |= PdfWriter.DirectionR2L;
+ }
+ return prefs;
+ }
+
+ /**
+ * Getter for property appendable.
+ * @return Value of property appendable.
+ */
+ public boolean isAppendable() {
+ return this.appendable;
+ }
+
+ /**
+ * Setter for property appendable.
+ * @param appendable New value of property appendable.
+ */
+ public void setAppendable(boolean appendable) {
+ this.appendable = appendable;
+ if (appendable)
+ getPdfObject(trailer.get(PdfName.ROOT));
+ }
+
+ /**
+ * Getter for property newXrefType.
+ * @return Value of property newXrefType.
+ */
+ public boolean isNewXrefType() {
+ return newXrefType;
+ }
+
+ /**
+ * Getter for property fileLength.
+ * @return Value of property fileLength.
+ */
+ public int getFileLength() {
+ return fileLength;
+ }
+
+ /**
+ * Getter for property hybridXref.
+ * @return Value of property hybridXref.
+ */
+ public boolean isHybridXref() {
+ return hybridXref;
+ }
+
+ static class PageRefs {
+ private PdfReader reader;
+ private IntHashtable refsp;
+ private ArrayList refsn;
+ private ArrayList pageInh;
+ private int lastPageRead = -1;
+ private int sizep;
+
+ private PageRefs(PdfReader reader) throws IOException {
+ this.reader = reader;
+ if (reader.partial) {
+ refsp = new IntHashtable();
+ PdfNumber npages = (PdfNumber)PdfReader.getPdfObjectRelease(reader.rootPages.get(PdfName.COUNT));
+ sizep = npages.intValue();
+ }
+ else {
+ readPages();
+ }
+ }
+
+ PageRefs(PageRefs other, PdfReader reader) {
+ this.reader = reader;
+ this.sizep = other.sizep;
+ if (other.refsn != null) {
+ refsn = new ArrayList(other.refsn);
+ for (int k = 0; k < refsn.size(); ++k) {
+ refsn.set(k, duplicatePdfObject((PdfObject)refsn.get(k), reader));
+ }
+ }
+ else
+ this.refsp = (IntHashtable)other.refsp.clone();
+ }
+
+ int size() {
+ if (refsn != null)
+ return refsn.size();
+ else
+ return sizep;
+ }
+
+ void readPages() throws IOException {
+ if (refsn != null)
+ return;
+ refsp = null;
+ refsn = new ArrayList();
+ pageInh = new ArrayList();
+ iteratePages((PRIndirectReference)reader.catalog.get(PdfName.PAGES));
+ pageInh = null;
+ reader.rootPages.put(PdfName.COUNT, new PdfNumber(refsn.size()));
+ }
+
+ void reReadPages() throws IOException {
+ refsn = null;
+ readPages();
+ }
+
+ /** Gets the dictionary that represents a page.
+ * @param pageNum the page number. 1 is the first
+ * @return the page dictionary
+ */
+ public PdfDictionary getPageN(int pageNum) {
+ PRIndirectReference ref = getPageOrigRef(pageNum);
+ return (PdfDictionary)PdfReader.getPdfObject(ref);
+ }
+
+ /**
+ * @param pageNum
+ * @return a dictionary object
+ */
+ public PdfDictionary getPageNRelease(int pageNum) {
+ PdfDictionary page = getPageN(pageNum);
+ releasePage(pageNum);
+ return page;
+ }
+
+ /**
+ * @param pageNum
+ * @return an indirect reference
+ */
+ public PRIndirectReference getPageOrigRefRelease(int pageNum) {
+ PRIndirectReference ref = getPageOrigRef(pageNum);
+ releasePage(pageNum);
+ return ref;
+ }
+
+ /** Gets the page reference to this page.
+ * @param pageNum the page number. 1 is the first
+ * @return the page reference
+ */
+ public PRIndirectReference getPageOrigRef(int pageNum) {
+ try {
+ --pageNum;
+ if (pageNum < 0 || pageNum >= size())
+ return null;
+ if (refsn != null)
+ return (PRIndirectReference)refsn.get(pageNum);
+ else {
+ int n = refsp.get(pageNum);
+ if (n == 0) {
+ PRIndirectReference ref = getSinglePage(pageNum);
+ if (reader.lastXrefPartial == -1)
+ lastPageRead = -1;
+ else
+ lastPageRead = pageNum;
+ reader.lastXrefPartial = -1;
+ refsp.put(pageNum, ref.getNumber());
+ return ref;
+ }
+ else {
+ if (lastPageRead != pageNum)
+ lastPageRead = -1;
+ return new PRIndirectReference(reader, n);
+ }
+ }
+ }
+ catch (Exception e) {
+ throw new ExceptionConverter(e);
+ }
+ }
+
+ /**
+ * @param pageNum
+ */
+ public void releasePage(int pageNum) {
+ if (refsp == null)
+ return;
+ --pageNum;
+ if (pageNum < 0 || pageNum >= size())
+ return;
+ if (pageNum != lastPageRead)
+ return;
+ lastPageRead = -1;
+ reader.lastXrefPartial = refsp.get(pageNum);
+ reader.releaseLastXrefPartial();
+ refsp.remove(pageNum);
+ }
+
+ /**
+ *
+ */
+ public void resetReleasePage() {
+ if (refsp == null)
+ return;
+ lastPageRead = -1;
+ }
+
+ void insertPage(int pageNum, PRIndirectReference ref) {
+ --pageNum;
+ if (refsn != null) {
+ if (pageNum >= refsn.size())
+ refsn.add(ref);
+ else
+ refsn.add(pageNum, ref);
+ }
+ else {
+ ++sizep;
+ lastPageRead = -1;
+ if (pageNum >= size()) {
+ refsp.put(size(), ref.getNumber());
+ }
+ else {
+ IntHashtable refs2 = new IntHashtable((refsp.size() + 1) * 2);
+ for (Iterator it = refsp.getEntryIterator(); it.hasNext();) {
+ IntHashtable.IntHashtableEntry entry = (IntHashtable.IntHashtableEntry)it.next();
+ int p = entry.getKey();
+ refs2.put(p >= pageNum ? p + 1 : p, entry.getValue());
+ }
+ refs2.put(pageNum, ref.getNumber());
+ refsp = refs2;
+ }
+ }
+ }
+
+ private void pushPageAttributes(PdfDictionary nodePages) {
+ PdfDictionary dic = new PdfDictionary();
+ if (pageInh.size() != 0) {
+ dic.putAll((PdfDictionary)pageInh.get(pageInh.size() - 1));
+ }
+ for (int k = 0; k < pageInhCandidates.length; ++k) {
+ PdfObject obj = nodePages.get(pageInhCandidates[k]);
+ if (obj != null)
+ dic.put(pageInhCandidates[k], obj);
+ }
+ pageInh.add(dic);
+ }
+
+ private void popPageAttributes() {
+ pageInh.remove(pageInh.size() - 1);
+ }
+
+ private void iteratePages(PRIndirectReference rpage) throws IOException {
+ PdfDictionary page = (PdfDictionary)getPdfObject(rpage);
+ PdfArray kidsPR = (PdfArray)getPdfObject(page.get(PdfName.KIDS));
+ if (kidsPR == null) {
+ page.put(PdfName.TYPE, PdfName.PAGE);
+ PdfDictionary dic = (PdfDictionary)pageInh.get(pageInh.size() - 1);
+ PdfName key;
+ for (Iterator i = dic.getKeys().iterator(); i.hasNext();) {
+ key = (PdfName)i.next();
+ if (page.get(key) == null)
+ page.put(key, dic.get(key));
+ }
+ if (page.get(PdfName.MEDIABOX) == null) {
+ PdfArray arr = new PdfArray(new float[]{0,0,PageSize.LETTER.right(),PageSize.LETTER.top()});
+ page.put(PdfName.MEDIABOX, arr);
+ }
+ refsn.add(rpage);
+ }
+ else {
+ page.put(PdfName.TYPE, PdfName.PAGES);
+ pushPageAttributes(page);
+ ArrayList kids = kidsPR.getArrayList();
+ for (int k = 0; k < kids.size(); ++k){
+ PdfObject obj = (PdfObject)kids.get(k);
+ if (!obj.isIndirect()) {
+ while (k < kids.size())
+ kids.remove(k);
+ break;
+ }
+ iteratePages((PRIndirectReference)obj);
+ }
+ popPageAttributes();
+ }
+ }
+
+ protected PRIndirectReference getSinglePage(int n) throws IOException {
+ PdfDictionary acc = new PdfDictionary();
+ PdfDictionary top = reader.rootPages;
+ int base = 0;
+ while (true) {
+ for (int k = 0; k < pageInhCandidates.length; ++k) {
+ PdfObject obj = top.get(pageInhCandidates[k]);
+ if (obj != null)
+ acc.put(pageInhCandidates[k], obj);
+ }
+ PdfArray kids = (PdfArray)PdfReader.getPdfObjectRelease(top.get(PdfName.KIDS));
+ for (Iterator it = kids.listIterator(); it.hasNext();) {
+ PRIndirectReference ref = (PRIndirectReference)it.next();
+ PdfDictionary dic = (PdfDictionary)getPdfObject(ref);
+ int last = reader.lastXrefPartial;
+ PdfObject count = getPdfObjectRelease(dic.get(PdfName.COUNT));
+ reader.lastXrefPartial = last;
+ int acn = 1;
+ if (count != null && count.type() == PdfObject.NUMBER)
+ acn = ((PdfNumber)count).intValue();
+ if (n < base + acn) {
+ if (count == null) {
+ dic.mergeDifferent(acc);
+ return ref;
+ }
+ reader.releaseLastXrefPartial();
+ top = dic;
+ break;
+ }
+ reader.releaseLastXrefPartial();
+ base += acn;
+ }
+ }
+ }
+
+ private void selectPages(List pagesToKeep) {
+ IntHashtable pg = new IntHashtable();
+ ArrayList finalPages = new ArrayList();
+ int psize = size();
+ for (Iterator it = pagesToKeep.iterator(); it.hasNext();) {
+ Integer pi = (Integer)it.next();
+ int p = pi.intValue();
+ if (p >= 1 && p <= psize && pg.put(p, 1) == 0)
+ finalPages.add(pi);
+ }
+ if (reader.partial) {
+ for (int k = 1; k <= psize; ++k) {
+ getPageOrigRef(k);
+ resetReleasePage();
+ }
+ }
+ PRIndirectReference parent = (PRIndirectReference)reader.catalog.get(PdfName.PAGES);
+ PdfDictionary topPages = (PdfDictionary)PdfReader.getPdfObject(parent);
+ ArrayList newPageRefs = new ArrayList(finalPages.size());
+ PdfArray kids = new PdfArray();
+ for (int k = 0; k < finalPages.size(); ++k) {
+ int p = ((Integer)finalPages.get(k)).intValue();
+ PRIndirectReference pref = getPageOrigRef(p);
+ resetReleasePage();
+ kids.add(pref);
+ newPageRefs.add(pref);
+ getPageN(p).put(PdfName.PARENT, parent);
+ }
+ AcroFields af = reader.getAcroFields();
+ boolean removeFields = (af.getFields().size() > 0);
+ for (int k = 1; k <= psize; ++k) {
+ if (!pg.containsKey(k)) {
+ if (removeFields)
+ af.removeFieldsFromPage(k);
+ PRIndirectReference pref = getPageOrigRef(k);
+ int nref = pref.getNumber();
+ reader.xrefObj.set(nref, null);
+ if (reader.partial) {
+ reader.xref[nref * 2] = -1;
+ reader.xref[nref * 2 + 1] = 0;
+ }
+ }
+ }
+ topPages.put(PdfName.COUNT, new PdfNumber(finalPages.size()));
+ topPages.put(PdfName.KIDS, kids);
+ refsp = null;
+ refsn = newPageRefs;
+ }
+ }
+
+ PdfIndirectReference getCryptoRef() {
+ if (cryptoRef == null)
+ return null;
+ return new PdfIndirectReference(0, cryptoRef.getNumber(), cryptoRef.getGeneration());
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/pdf/PdfReaderInstance.java b/src/main/java/com/lowagie/text/pdf/PdfReaderInstance.java
new file mode 100644
index 0000000..294e52d
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/PdfReaderInstance.java
@@ -0,0 +1,182 @@
+/*
+ * $Id: PdfReaderInstance.java,v 1.52 2005/11/01 12:27:05 psoares33 Exp $
+ * $Name: $
+ *
+ * Copyright 2001, 2002 Paulo Soares
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.io.*;
+/**
+ * Instance of PdfReader in each output document.
+ *
+ * @author Paulo Soares (psoares@consiste.pt)
+ */
+class PdfReaderInstance {
+ static final PdfLiteral IDENTITYMATRIX = new PdfLiteral("[1 0 0 1 0 0]");
+ static final PdfNumber ONE = new PdfNumber(1);
+ int myXref[];
+ PdfReader reader;
+ RandomAccessFileOrArray file;
+ HashMap importedPages = new HashMap();
+ PdfWriter writer;
+ HashMap visited = new HashMap();
+ ArrayList nextRound = new ArrayList();
+
+ PdfReaderInstance(PdfReader reader, PdfWriter writer) {
+ this.reader = reader;
+ this.writer = writer;
+ file = reader.getSafeFile();
+ myXref = new int[reader.getXrefSize()];
+ }
+
+ PdfReader getReader() {
+ return reader;
+ }
+
+ PdfImportedPage getImportedPage(int pageNumber) {
+ if (pageNumber < 1 || pageNumber > reader.getNumberOfPages())
+ throw new IllegalArgumentException("Invalid page number");
+ Integer i = new Integer(pageNumber);
+ PdfImportedPage pageT = (PdfImportedPage)importedPages.get(i);
+ if (pageT == null) {
+ pageT = new PdfImportedPage(this, writer, pageNumber);
+ importedPages.put(i, pageT);
+ }
+ return pageT;
+ }
+
+ int getNewObjectNumber(int number, int generation) {
+ if (myXref[number] == 0) {
+ myXref[number] = writer.getIndirectReferenceNumber();
+ nextRound.add(new Integer(number));
+ }
+ return myXref[number];
+ }
+
+ RandomAccessFileOrArray getReaderFile() {
+ return file;
+ }
+
+ PdfObject getResources(int pageNumber) {
+ PdfObject obj = PdfReader.getPdfObjectRelease(reader.getPageNRelease(pageNumber).get(PdfName.RESOURCES));
+ return obj;
+ }
+
+
+ PdfStream getFormXObject(int pageNumber) throws IOException {
+ PdfDictionary page = reader.getPageNRelease(pageNumber);
+ PdfObject contents = PdfReader.getPdfObjectRelease(page.get(PdfName.CONTENTS));
+ PdfDictionary dic = new PdfDictionary();
+ byte bout[] = null;
+ if (contents != null) {
+ if (contents.isStream())
+ dic.putAll((PRStream)contents);
+ else
+ bout = reader.getPageContent(pageNumber, file);
+ }
+ else
+ bout = new byte[0];
+ dic.put(PdfName.RESOURCES, PdfReader.getPdfObjectRelease(page.get(PdfName.RESOURCES)));
+ dic.put(PdfName.TYPE, PdfName.XOBJECT);
+ dic.put(PdfName.SUBTYPE, PdfName.FORM);
+ PdfImportedPage impPage = (PdfImportedPage)importedPages.get(new Integer(pageNumber));
+ dic.put(PdfName.BBOX, new PdfRectangle(impPage.getBoundingBox()));
+ PdfArray matrix = impPage.getMatrix();
+ if (matrix == null)
+ dic.put(PdfName.MATRIX, IDENTITYMATRIX);
+ else
+ dic.put(PdfName.MATRIX, matrix);
+ dic.put(PdfName.FORMTYPE, ONE);
+ PRStream stream;
+ if (bout == null) {
+ stream = new PRStream((PRStream)contents, dic);
+ }
+ else {
+ stream = new PRStream(reader, bout);
+ stream.putAll(dic);
+ }
+ return stream;
+ }
+
+ void writeAllVisited() throws IOException {
+ while (nextRound.size() > 0) {
+ ArrayList vec = nextRound;
+ nextRound = new ArrayList();
+ for (int k = 0; k < vec.size(); ++k) {
+ Integer i = (Integer)vec.get(k);
+ if (!visited.containsKey(i)) {
+ visited.put(i, null);
+ int n = i.intValue();
+ writer.addToBody(reader.getPdfObjectRelease(n), myXref[n]);
+ }
+ }
+ }
+ }
+
+ void writeAllPages() throws IOException {
+ try {
+ file.reOpen();
+ for (Iterator it = importedPages.values().iterator(); it.hasNext();) {
+ PdfImportedPage ip = (PdfImportedPage)it.next();
+ writer.addToBody(ip.getFormXObject(), ip.getIndirectReference());
+ }
+ writeAllVisited();
+ }
+ finally {
+ try {
+ reader.close();
+ file.close();
+ }
+ catch (Exception e) {
+ //Empty on purpose
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/pdf/PdfRectangle.java b/src/main/java/com/lowagie/text/pdf/PdfRectangle.java
new file mode 100644
index 0000000..c1d5f0d
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/PdfRectangle.java
@@ -0,0 +1,284 @@
+/*
+ * $Id: PdfRectangle.java,v 1.59 2006/01/16 13:46:20 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 1999, 2000, 2001, 2002 Bruno Lowagie
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf;
+
+import com.lowagie.text.Rectangle;
+
+/**
+ * <CODE>PdfRectangle</CODE> is the PDF Rectangle object.
+ * <P>
+ * Rectangles are used to describe locations on the page and bounding boxes for several
+ * objects in PDF, such as fonts. A rectangle is represented as an <CODE>array</CODE> of
+ * four numbers, specifying the lower lef <I>x</I>, lower left <I>y</I>, upper right <I>x</I>,
+ * and upper right <I>y</I> coordinates of the rectangle, in that order.<BR>
+ * This object is described in the 'Portable Document Format Reference Manual version 1.3'
+ * section 7.1 (page 183).
+ *
+ * @see com.lowagie.text.Rectangle
+ * @see PdfArray
+ */
+
+public class PdfRectangle extends PdfArray {
+
+ // membervariables
+
+/** lower left x */
+ private float llx = 0;
+
+/** lower left y */
+ private float lly = 0;
+
+/** upper right x */
+ private float urx = 0;
+
+/** upper right y */
+ private float ury = 0;
+
+ // constructors
+
+/**
+ * Constructs a <CODE>PdfRectangle</CODE>-object.
+ *
+ * @param llx lower left x
+ * @param lly lower left y
+ * @param urx upper right x
+ * @param ury upper right y
+ *
+ * @since rugPdf0.10
+ */
+
+ public PdfRectangle(float llx, float lly, float urx, float ury, int rotation) {
+ super();
+ if (rotation == 90 || rotation == 270) {
+ this.llx = lly;
+ this.lly = llx;
+ this.urx = ury;
+ this.ury = urx;
+ }
+ else {
+ this.llx = llx;
+ this.lly = lly;
+ this.urx = urx;
+ this.ury = ury;
+ }
+ super.add(new PdfNumber(this.llx));
+ super.add(new PdfNumber(this.lly));
+ super.add(new PdfNumber(this.urx));
+ super.add(new PdfNumber(this.ury));
+ }
+
+ public PdfRectangle(float llx, float lly, float urx, float ury) {
+ this(llx, lly, urx, ury, 0);
+ }
+
+/**
+ * Constructs a <CODE>PdfRectangle</CODE>-object starting from the origin (0, 0).
+ *
+ * @param urx upper right x
+ * @param ury upper right y
+ */
+
+ public PdfRectangle(float urx, float ury, int rotation) {
+ this(0, 0, urx, ury, rotation);
+ }
+
+ public PdfRectangle(float urx, float ury) {
+ this(0, 0, urx, ury, 0);
+ }
+
+/**
+ * Constructs a <CODE>PdfRectangle</CODE>-object with a <CODE>Rectangle</CODE>-object.
+ *
+ * @param rectangle a <CODE>Rectangle</CODE>
+ */
+
+ public PdfRectangle(Rectangle rectangle, int rotation) {
+ this(rectangle.left(), rectangle.bottom(), rectangle.right(), rectangle.top(), rotation);
+ }
+
+ public PdfRectangle(Rectangle rectangle) {
+ this(rectangle.left(), rectangle.bottom(), rectangle.right(), rectangle.top(), 0);
+ }
+
+ // methods
+ /**
+ * Returns the high level version of this PdfRectangle
+ * @return this PdfRectangle translated to class Rectangle
+ */
+ public Rectangle getRectangle() {
+ return new Rectangle(left(), bottom(), right(), top());
+ }
+
+/**
+ * Overrides the <CODE>add</CODE>-method in <CODE>PdfArray</CODE> in order to prevent the adding of extra object to the array.
+ *
+ * @param object <CODE>PdfObject</CODE> to add (will not be added here)
+ * @return <CODE>false</CODE>
+ */
+
+ public boolean add(PdfObject object) {
+ return false;
+ }
+
+/**
+ * Returns the lower left x-coordinate.
+ *
+ * @return the lower left x-coordinaat
+ */
+
+ public float left() {
+ return llx;
+ }
+
+/**
+ * Returns the upper right x-coordinate.
+ *
+ * @return the upper right x-coordinate
+ */
+
+ public float right() {
+ return urx;
+ }
+
+/**
+ * Returns the upper right y-coordinate.
+ *
+ * @return the upper right y-coordinate
+ */
+
+ public float top() {
+ return ury;
+ }
+
+/**
+ * Returns the lower left y-coordinate.
+ *
+ * @return the lower left y-coordinate
+ */
+
+ public float bottom() {
+ return lly;
+ }
+
+/**
+ * Returns the lower left x-coordinate, considering a given margin.
+ *
+ * @param margin a margin
+ * @return the lower left x-coordinate
+ */
+
+ public float left(int margin) {
+ return llx + margin;
+ }
+
+/**
+ * Returns the upper right x-coordinate, considering a given margin.
+ *
+ * @param margin a margin
+ * @return the upper right x-coordinate
+ */
+
+ public float right(int margin) {
+ return urx - margin;
+ }
+
+/**
+ * Returns the upper right y-coordinate, considering a given margin.
+ *
+ * @param margin a margin
+ * @return the upper right y-coordinate
+ */
+
+ public float top(int margin) {
+ return ury - margin;
+ }
+
+/**
+ * Returns the lower left y-coordinate, considering a given margin.
+ *
+ * @param margin a margin
+ * @return the lower left y-coordinate
+ */
+
+ public float bottom(int margin) {
+ return lly + margin;
+ }
+
+/**
+ * Returns the width of the rectangle.
+ *
+ * @return a width
+ */
+
+ public float width() {
+ return urx - llx;
+ }
+
+/**
+ * Returns the height of the rectangle.
+ *
+ * @return a height
+ */
+
+ public float height() {
+ return ury - lly;
+ }
+
+/**
+ * Swaps the values of urx and ury and of lly and llx in order to rotate the rectangle.
+ *
+ * @return a <CODE>PdfRectangle</CODE>
+ */
+
+ public PdfRectangle rotate() {
+ return new PdfRectangle(lly, llx, ury, urx, 0);
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/pdf/PdfRendition.java b/src/main/java/com/lowagie/text/pdf/PdfRendition.java
new file mode 100644
index 0000000..bcbd114
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/PdfRendition.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2003 Galo Gimenez
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+package com.lowagie.text.pdf;
+
+import java.io.IOException;
+
+/**
+ * A Rendition dictionary (pdf spec 1.5)
+ */
+public class PdfRendition extends PdfDictionary {
+ PdfRendition(String file, PdfFileSpecification fs, String mimeType) throws IOException{
+ put(PdfName.S, new PdfName("MR"));
+ put(PdfName.N, new PdfString("Rendition for "+file));
+ put(PdfName.C, new PdfMediaClipData(file, fs, mimeType));
+ }
+
+}
diff --git a/src/main/java/com/lowagie/text/pdf/PdfResources.java b/src/main/java/com/lowagie/text/pdf/PdfResources.java
new file mode 100644
index 0000000..3480a19
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/PdfResources.java
@@ -0,0 +1,91 @@
+/*
+ * $Id: PdfResources.java,v 1.56 2005/05/04 14:31:53 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 1999, 2000, 2001, 2002 Bruno Lowagie
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf;
+
+/**
+ * <CODE>PdfResources</CODE> is the PDF Resources-object.
+ * <P>
+ * The marking operations for drawing a page are stored in a stream that is the value of the
+ * <B>Contents</B> key in the Page object's dictionary. Each marking context includes a list
+ * of the named resources it uses. This resource list is stored as a dictionary that is the
+ * value of the context's <B>Resources</B> key, and it serves two functions: it enumerates
+ * the named resources in the contents stream, and it established the mapping from the names
+ * to the objects used by the marking operations.<BR>
+ * This object is described in the 'Portable Document Format Reference Manual version 1.3'
+ * section 7.5 (page 195-197).
+ *
+ * @see PdfPage
+ */
+
+class PdfResources extends PdfDictionary {
+
+ // constructor
+
+/**
+ * Constructs a PDF ResourcesDictionary.
+ */
+
+ PdfResources() {
+ super();
+ }
+
+ // methods
+
+ void add(PdfName key, PdfDictionary resource) {
+ if (resource.size() == 0)
+ return;
+ PdfDictionary dic = (PdfDictionary)PdfReader.getPdfObject(get(key));
+ if (dic == null)
+ put(key, resource);
+ else
+ dic.putAll(resource);
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/pdf/PdfShading.java b/src/main/java/com/lowagie/text/pdf/PdfShading.java
new file mode 100644
index 0000000..54e2067
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/PdfShading.java
@@ -0,0 +1,261 @@
+/*
+ * Copyright 2002 Paulo Soares
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+package com.lowagie.text.pdf;
+
+import java.awt.Color;
+import java.io.IOException;
+/** Implements the shading dictionary (or stream).
+ *
+ * @author Paulo Soares (psoares@consiste.pt)
+ */
+public class PdfShading {
+
+ protected PdfDictionary shading;
+
+ protected PdfWriter writer;
+
+ protected int shadingType;
+
+ protected ColorDetails colorDetails;
+
+ protected PdfName shadingName;
+
+ protected PdfIndirectReference shadingReference;
+
+ private Color cspace;
+
+ /** Holds value of property bBox. */
+ protected float[] bBox;
+
+ /** Holds value of property antiAlias. */
+ protected boolean antiAlias = false;
+
+ /** Creates new PdfShading */
+ protected PdfShading(PdfWriter writer) {
+ this.writer = writer;
+ }
+
+ protected void setColorSpace(Color color) {
+ cspace = color;
+ int type = ExtendedColor.getType(color);
+ PdfObject colorSpace = null;
+ switch (type) {
+ case ExtendedColor.TYPE_GRAY: {
+ colorSpace = PdfName.DEVICEGRAY;
+ break;
+ }
+ case ExtendedColor.TYPE_CMYK: {
+ colorSpace = PdfName.DEVICECMYK;
+ break;
+ }
+ case ExtendedColor.TYPE_SEPARATION: {
+ SpotColor spot = (SpotColor)color;
+ colorDetails = writer.addSimple(spot.getPdfSpotColor());
+ colorSpace = colorDetails.getIndirectReference();
+ break;
+ }
+ case ExtendedColor.TYPE_PATTERN:
+ case ExtendedColor.TYPE_SHADING: {
+ throwColorSpaceError();
+ }
+ default:
+ colorSpace = PdfName.DEVICERGB;
+ break;
+ }
+ shading.put(PdfName.COLORSPACE, colorSpace);
+ }
+
+ Color getColorSpace() {
+ return cspace;
+ }
+
+ public static void throwColorSpaceError() {
+ throw new IllegalArgumentException("A tiling or shading pattern cannot be used as a color space in a shading pattern");
+ }
+
+ public static void checkCompatibleColors(Color c1, Color c2) {
+ int type1 = ExtendedColor.getType(c1);
+ int type2 = ExtendedColor.getType(c2);
+ if (type1 != type2)
+ throw new IllegalArgumentException("Both colors must be of the same type.");
+ if (type1 == ExtendedColor.TYPE_SEPARATION && ((SpotColor)c1).getPdfSpotColor() != ((SpotColor)c2).getPdfSpotColor())
+ throw new IllegalArgumentException("The spot color must be the same, only the tint can vary.");
+ if (type1 == ExtendedColor.TYPE_PATTERN || type1 == ExtendedColor.TYPE_SHADING)
+ throwColorSpaceError();
+ }
+
+ public static float[] getColorArray(Color color) {
+ int type = ExtendedColor.getType(color);
+ switch (type) {
+ case ExtendedColor.TYPE_GRAY: {
+ return new float[]{((GrayColor)color).getGray()};
+ }
+ case ExtendedColor.TYPE_CMYK: {
+ CMYKColor cmyk = (CMYKColor)color;
+ return new float[]{cmyk.getCyan(), cmyk.getMagenta(), cmyk.getYellow(), cmyk.getBlack()};
+ }
+ case ExtendedColor.TYPE_SEPARATION: {
+ return new float[]{((SpotColor)color).getTint()};
+ }
+ case ExtendedColor.TYPE_RGB: {
+ return new float[]{color.getRed() / 255f, color.getGreen() / 255f, color.getBlue() / 255f};
+ }
+ }
+ throwColorSpaceError();
+ return null;
+ }
+
+ public static PdfShading type1(PdfWriter writer, Color colorSpace, float domain[], float tMatrix[], PdfFunction function) {
+ PdfShading sp = new PdfShading(writer);
+ sp.shading = new PdfDictionary();
+ sp.shadingType = 1;
+ sp.shading.put(PdfName.SHADINGTYPE, new PdfNumber(sp.shadingType));
+ sp.setColorSpace(colorSpace);
+ if (domain != null)
+ sp.shading.put(PdfName.DOMAIN, new PdfArray(domain));
+ if (tMatrix != null)
+ sp.shading.put(PdfName.MATRIX, new PdfArray(tMatrix));
+ sp.shading.put(PdfName.FUNCTION, function.getReference());
+ return sp;
+ }
+
+ public static PdfShading type2(PdfWriter writer, Color colorSpace, float coords[], float domain[], PdfFunction function, boolean extend[]) {
+ PdfShading sp = new PdfShading(writer);
+ sp.shading = new PdfDictionary();
+ sp.shadingType = 2;
+ sp.shading.put(PdfName.SHADINGTYPE, new PdfNumber(sp.shadingType));
+ sp.setColorSpace(colorSpace);
+ sp.shading.put(PdfName.COORDS, new PdfArray(coords));
+ if (domain != null)
+ sp.shading.put(PdfName.DOMAIN, new PdfArray(domain));
+ sp.shading.put(PdfName.FUNCTION, function.getReference());
+ if (extend != null && (extend[0] || extend[1])) {
+ PdfArray array = new PdfArray(extend[0] ? PdfBoolean.PDFTRUE : PdfBoolean.PDFFALSE);
+ array.add(extend[1] ? PdfBoolean.PDFTRUE : PdfBoolean.PDFFALSE);
+ sp.shading.put(PdfName.EXTEND, array);
+ }
+ return sp;
+ }
+
+ public static PdfShading type3(PdfWriter writer, Color colorSpace, float coords[], float domain[], PdfFunction function, boolean extend[]) {
+ PdfShading sp = type2(writer, colorSpace, coords, domain, function, extend);
+ sp.shadingType = 3;
+ sp.shading.put(PdfName.SHADINGTYPE, new PdfNumber(sp.shadingType));
+ return sp;
+ }
+
+ public static PdfShading simpleAxial(PdfWriter writer, float x0, float y0, float x1, float y1, Color startColor, Color endColor, boolean extendStart, boolean extendEnd) {
+ checkCompatibleColors(startColor, endColor);
+ PdfFunction function = PdfFunction.type2(writer, new float[]{0, 1}, null, getColorArray(startColor),
+ getColorArray(endColor), 1);
+ return type2(writer, startColor, new float[]{x0, y0, x1, y1}, null, function, new boolean[]{extendStart, extendEnd});
+ }
+
+ public static PdfShading simpleAxial(PdfWriter writer, float x0, float y0, float x1, float y1, Color startColor, Color endColor) {
+ return simpleAxial(writer, x0, y0, x1, y1, startColor, endColor, true, true);
+ }
+
+ public static PdfShading simpleRadial(PdfWriter writer, float x0, float y0, float r0, float x1, float y1, float r1, Color startColor, Color endColor, boolean extendStart, boolean extendEnd) {
+ checkCompatibleColors(startColor, endColor);
+ PdfFunction function = PdfFunction.type2(writer, new float[]{0, 1}, null, getColorArray(startColor),
+ getColorArray(endColor), 1);
+ return type3(writer, startColor, new float[]{x0, y0, r0, x1, y1, r1}, null, function, new boolean[]{extendStart, extendEnd});
+ }
+
+ public static PdfShading simpleRadial(PdfWriter writer, float x0, float y0, float r0, float x1, float y1, float r1, Color startColor, Color endColor) {
+ return simpleRadial(writer, x0, y0, r0, x1, y1, r1, startColor, endColor, true, true);
+ }
+
+ PdfName getShadingName() {
+ return shadingName;
+ }
+
+ PdfIndirectReference getShadingReference() {
+ if (shadingReference == null)
+ shadingReference = writer.getPdfIndirectReference();
+ return shadingReference;
+ }
+
+ void setName(int number) {
+ shadingName = new PdfName("Sh" + number);
+ }
+
+ void addToBody() throws IOException {
+ if (bBox != null)
+ shading.put(PdfName.BBOX, new PdfArray(bBox));
+ if (antiAlias)
+ shading.put(PdfName.ANTIALIAS, PdfBoolean.PDFTRUE);
+ writer.addToBody(shading, getShadingReference());
+ }
+
+ PdfWriter getWriter() {
+ return writer;
+ }
+
+ ColorDetails getColorDetails() {
+ return colorDetails;
+ }
+
+ public float[] getBBox() {
+ return bBox;
+ }
+
+ public void setBBox(float[] bBox) {
+ if (bBox.length != 4)
+ throw new IllegalArgumentException("BBox must be a 4 element array.");
+ this.bBox = bBox;
+ }
+
+ public boolean isAntiAlias() {
+ return antiAlias;
+ }
+
+ public void setAntiAlias(boolean antiAlias) {
+ this.antiAlias = antiAlias;
+ }
+
+}
diff --git a/src/main/java/com/lowagie/text/pdf/PdfShadingPattern.java b/src/main/java/com/lowagie/text/pdf/PdfShadingPattern.java
new file mode 100644
index 0000000..c90e97c
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/PdfShadingPattern.java
@@ -0,0 +1,119 @@
+/*
+ * Copyright 2002 Paulo Soares
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+package com.lowagie.text.pdf;
+
+import java.io.IOException;
+/** Implements the shading pattern dictionary.
+ *
+ * @author Paulo Soares (psoares@consiste.pt)
+ */
+public class PdfShadingPattern extends PdfDictionary {
+
+ protected PdfShading shading;
+
+ protected PdfWriter writer;
+
+ protected float matrix[] = {1, 0, 0, 1, 0, 0};
+
+ protected PdfName patternName;
+
+ protected PdfIndirectReference patternReference;
+
+ /** Creates new PdfShadingPattern */
+ public PdfShadingPattern(PdfShading shading) {
+ writer = shading.getWriter();
+ put(PdfName.PATTERNTYPE, new PdfNumber(2));
+ this.shading = shading;
+ }
+
+ PdfName getPatternName() {
+ return patternName;
+ }
+
+ PdfName getShadingName() {
+ return shading.getShadingName();
+ }
+
+ PdfIndirectReference getPatternReference() {
+ if (patternReference == null)
+ patternReference = writer.getPdfIndirectReference();
+ return patternReference;
+ }
+
+ PdfIndirectReference getShadingReference() {
+ return shading.getShadingReference();
+ }
+
+ void setName(int number) {
+ patternName = new PdfName("P" + number);
+ }
+
+ void addToBody() throws IOException {
+ put(PdfName.SHADING, getShadingReference());
+ put(PdfName.MATRIX, new PdfArray(matrix));
+ writer.addToBody(this, getPatternReference());
+ }
+
+ public void setMatrix(float matrix[]) {
+ if (matrix.length != 6)
+ throw new RuntimeException("The matrix size must be 6.");
+ this.matrix = matrix;
+ }
+
+ public float[] getMatrix() {
+ return matrix;
+ }
+
+ PdfShading getShading() {
+ return shading;
+ }
+
+ ColorDetails getColorDetails() {
+ return shading.getColorDetails();
+ }
+
+}
diff --git a/src/main/java/com/lowagie/text/pdf/PdfSigGenericPKCS.java b/src/main/java/com/lowagie/text/pdf/PdfSigGenericPKCS.java
new file mode 100644
index 0000000..2cbee88
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/PdfSigGenericPKCS.java
@@ -0,0 +1,230 @@
+/*
+ * Copyright 2004 by Paulo Soares.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+package com.lowagie.text.pdf;
+
+import java.security.cert.Certificate;
+import java.security.cert.CRL;
+import java.security.PrivateKey;
+import com.lowagie.text.ExceptionConverter;
+import java.io.ByteArrayOutputStream;
+
+/**
+ * A signature dictionary representation for the standard filters.
+ */
+public abstract class PdfSigGenericPKCS extends PdfSignature {
+ /**
+ * The hash algorith, for example "SHA1"
+ */
+ protected String hashAlgorithm;
+ /**
+ * The crypto provider
+ */
+ protected String provider = null;
+ /**
+ * The class instance that calculates the PKCS#1 and PKCS#7
+ */
+ protected PdfPKCS7 pkcs;
+ /**
+ * The subject name in the signing certificate (the element "CN")
+ */
+ protected String name;
+
+ private byte externalDigest[];
+ private byte externalRSAdata[];
+ private String digestEncryptionAlgorithm;
+
+ /**
+ * Creates a generic standard filter.
+ * @param filter the filter name
+ * @param subFilter the sub-filter name
+ */
+ public PdfSigGenericPKCS(PdfName filter, PdfName subFilter) {
+ super(filter, subFilter);
+ }
+
+ /**
+ * Sets the crypto information to sign.
+ * @param privKey the private key
+ * @param certChain the certificate chain
+ * @param crlList the certificate revocation list. It can be <CODE>null</CODE>
+ */
+ public void setSignInfo(PrivateKey privKey, Certificate[] certChain, CRL[] crlList) {
+ try {
+ pkcs = new PdfPKCS7(privKey, certChain, crlList, hashAlgorithm, provider, PdfName.ADBE_PKCS7_SHA1.equals(get(PdfName.SUBFILTER)));
+ pkcs.setExternalDigest(externalDigest, externalRSAdata, digestEncryptionAlgorithm);
+ if (PdfName.ADBE_X509_RSA_SHA1.equals(get(PdfName.SUBFILTER))) {
+ ByteArrayOutputStream bout = new ByteArrayOutputStream();
+ for (int k = 0; k < certChain.length; ++k) {
+ bout.write(certChain[k].getEncoded());
+ }
+ bout.close();
+ setCert(bout.toByteArray());
+ setContents(pkcs.getEncodedPKCS1());
+ }
+ else
+ setContents(pkcs.getEncodedPKCS7());
+ name = PdfPKCS7.getSubjectFields(pkcs.getSigningCertificate()).getField("CN");
+ if (name != null)
+ put(PdfName.NAME, new PdfString(name, PdfObject.TEXT_UNICODE));
+ pkcs = new PdfPKCS7(privKey, certChain, crlList, hashAlgorithm, provider, PdfName.ADBE_PKCS7_SHA1.equals(get(PdfName.SUBFILTER)));
+ pkcs.setExternalDigest(externalDigest, externalRSAdata, digestEncryptionAlgorithm);
+ }
+ catch (Exception e) {
+ throw new ExceptionConverter(e);
+ }
+ }
+
+ /**
+ * Sets the digest/signature to an external calculated value.
+ * @param digest the digest. This is the actual signature
+ * @param RSAdata the extra data that goes into the data tag in PKCS#7
+ * @param digestEncryptionAlgorithm the encryption algorithm. It may must be <CODE>null</CODE> if the <CODE>digest</CODE>
+ * is also <CODE>null</CODE>. If the <CODE>digest</CODE> is not <CODE>null</CODE>
+ * then it may be "RSA" or "DSA"
+ */
+ public void setExternalDigest(byte digest[], byte RSAdata[], String digestEncryptionAlgorithm) {
+ externalDigest = digest;
+ externalRSAdata = RSAdata;
+ this.digestEncryptionAlgorithm = digestEncryptionAlgorithm;
+ }
+
+ /**
+ * Gets the subject name in the signing certificate (the element "CN")
+ * @return the subject name in the signing certificate (the element "CN")
+ */
+ public String getName() {
+ return name;
+ }
+
+ /**
+ * Gets the class instance that does the actual signing.
+ * @return the class instance that does the actual signing
+ */
+ public PdfPKCS7 getSigner() {
+ return pkcs;
+ }
+
+ /**
+ * Gets the signature content. This can be a PKCS#1 or a PKCS#7. It corresponds to
+ * the /Contents key.
+ * @return the signature content
+ */
+ public byte[] getSignerContents() {
+ if (PdfName.ADBE_X509_RSA_SHA1.equals(get(PdfName.SUBFILTER)))
+ return pkcs.getEncodedPKCS1();
+ else
+ return pkcs.getEncodedPKCS7();
+ }
+
+ /**
+ * Creates a standard filter of the type VeriSign.
+ */
+ public static class VeriSign extends PdfSigGenericPKCS {
+ /**
+ * The constructor for the default provider.
+ */
+ public VeriSign() {
+ super(PdfName.VERISIGN_PPKVS, PdfName.ADBE_PKCS7_DETACHED);
+ hashAlgorithm = "MD5";
+ put(PdfName.R, new PdfNumber(65537));
+ }
+
+ /**
+ * The constructor for an explicit provider.
+ * @param provider the crypto provider
+ */
+ public VeriSign(String provider) {
+ this();
+ this.provider = provider;
+ }
+ }
+
+ /**
+ * Creates a standard filter of the type self signed.
+ */
+ public static class PPKLite extends PdfSigGenericPKCS {
+ /**
+ * The constructor for the default provider.
+ */
+ public PPKLite() {
+ super(PdfName.ADOBE_PPKLITE, PdfName.ADBE_X509_RSA_SHA1);
+ hashAlgorithm = "SHA1";
+ put(PdfName.R, new PdfNumber(65541));
+ }
+
+ /**
+ * The constructor for an explicit provider.
+ * @param provider the crypto provider
+ */
+ public PPKLite(String provider) {
+ this();
+ this.provider = provider;
+ }
+ }
+
+ /**
+ * Creates a standard filter of the type Windows Certificate.
+ */
+ public static class PPKMS extends PdfSigGenericPKCS {
+ /**
+ * The constructor for the default provider.
+ */
+ public PPKMS() {
+ super(PdfName.ADOBE_PPKMS, PdfName.ADBE_PKCS7_SHA1);
+ hashAlgorithm = "SHA1";
+ }
+
+ /**
+ * The constructor for an explicit provider.
+ * @param provider the crypto provider
+ */
+ public PPKMS(String provider) {
+ this();
+ this.provider = provider;
+ }
+ }
+}
diff --git a/src/main/java/com/lowagie/text/pdf/PdfSignature.java b/src/main/java/com/lowagie/text/pdf/PdfSignature.java
new file mode 100644
index 0000000..759a7ae
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/PdfSignature.java
@@ -0,0 +1,97 @@
+/*
+ * Copyright 2002 by Paulo Soares.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf;
+
+/** Implements the signature dictionary.
+ *
+ * @author Paulo Soares (psoares@consiste.pt)
+ */
+public class PdfSignature extends PdfDictionary {
+
+ /** Creates new PdfSignature */
+ public PdfSignature(PdfName filter, PdfName subFilter) {
+ super(PdfName.SIG);
+ put(PdfName.FILTER, filter);
+ put(PdfName.SUBFILTER, subFilter);
+ }
+
+ public void setByteRange(int range[]) {
+ PdfArray array = new PdfArray();
+ for (int k = 0; k < range.length; ++k)
+ array.add(new PdfNumber(range[k]));
+ put(PdfName.BYTERANGE, array);
+ }
+
+ public void setContents(byte contents[]) {
+ put(PdfName.CONTENTS, new PdfString(contents).setHexWriting(true));
+ }
+
+ public void setCert(byte cert[]) {
+ put(PdfName.CERT, new PdfString(cert));
+ }
+
+ public void setName(String name) {
+ put(PdfName.NAME, new PdfString(name, PdfObject.TEXT_UNICODE));
+ }
+
+ public void setDate(PdfDate date) {
+ put(PdfName.M, date);
+ }
+
+ public void setLocation(String name) {
+ put(PdfName.LOCATION, new PdfString(name, PdfObject.TEXT_UNICODE));
+ }
+
+ public void setReason(String name) {
+ put(PdfName.REASON, new PdfString(name, PdfObject.TEXT_UNICODE));
+ }
+
+ public void setContact(String name) {
+ put(PdfName.CONTACTINFO, new PdfString(name, PdfObject.TEXT_UNICODE));
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/pdf/PdfSignatureAppearance.java b/src/main/java/com/lowagie/text/pdf/PdfSignatureAppearance.java
new file mode 100644
index 0000000..52b186c
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/PdfSignatureAppearance.java
@@ -0,0 +1,1349 @@
+/*
+ * Copyright 2004 by Paulo Soares.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+package com.lowagie.text.pdf;
+
+import com.lowagie.text.Rectangle;
+import com.lowagie.text.ExceptionConverter;
+import com.lowagie.text.Phrase;
+import com.lowagie.text.Font;
+import com.lowagie.text.Element;
+import com.lowagie.text.Image;
+import com.lowagie.text.DocumentException;
+import java.util.Calendar;
+import java.util.GregorianCalendar;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Iterator;
+import java.text.SimpleDateFormat;
+import java.security.cert.Certificate;
+import java.security.cert.X509Certificate;
+import java.security.cert.CRL;
+import java.security.PrivateKey;
+import java.io.OutputStream;
+import java.io.IOException;
+import java.io.EOFException;
+import java.io.RandomAccessFile;
+import java.io.File;
+import java.io.InputStream;
+
+/**
+ * This class takes care of the cryptographic options and appearances that form a signature.
+ */
+public class PdfSignatureAppearance {
+
+ /**
+ * The self signed filter.
+ */
+ public static final PdfName SELF_SIGNED = PdfName.ADOBE_PPKLITE;
+ /**
+ * The VeriSign filter.
+ */
+ public static final PdfName VERISIGN_SIGNED = PdfName.VERISIGN_PPKVS;
+ /**
+ * The Windows Certificate Security.
+ */
+ public static final PdfName WINCER_SIGNED = PdfName.ADOBE_PPKMS;
+
+ private static final float topSection = 0.3f;
+ private static final float margin = 2;
+ private Rectangle rect;
+ private Rectangle pageRect;
+ private PdfTemplate app[] = new PdfTemplate[5];
+ private PdfTemplate frm;
+ private PdfStamperImp writer;
+ private String layer2Text;
+ private String reason;
+ private String location;
+ private Calendar signDate;
+ private String provider;
+ private int page = 1;
+ private String fieldName;
+ private PrivateKey privKey;
+ private Certificate[] certChain;
+ private CRL[] crlList;
+ private PdfName filter;
+ private boolean newField;
+ private ByteBuffer sigout;
+ private OutputStream originalout;
+ private File tempFile;
+ private PdfDictionary cryptoDictionary;
+ private PdfStamper stamper;
+ private boolean preClosed = false;
+ private PdfSigGenericPKCS sigStandard;
+ private int range[];
+ private RandomAccessFile raf;
+ private int rangePosition = 0;
+ private byte bout[];
+ private int boutLen;
+ private byte externalDigest[];
+ private byte externalRSAdata[];
+ private String digestEncryptionAlgorithm;
+ private HashMap exclusionLocations;
+
+ PdfSignatureAppearance(PdfStamperImp writer) {
+ this.writer = writer;
+ signDate = new GregorianCalendar();
+ fieldName = getNewSigName();
+ }
+
+ /**
+ * Sets the signature text identifying the signer.
+ * @param text the signature text identifying the signer. If <CODE>null</CODE> or not set
+ * a standard description will be used
+ */
+ public void setLayer2Text(String text) {
+ layer2Text = text;
+ }
+
+ /**
+ * Gets the signature text identifying the signer if set by setLayer2Text().
+ * @return the signature text identifying the signer
+ */
+ public String getLayer2Text() {
+ return layer2Text;
+ }
+
+ /**
+ * Sets the text identifying the signature status.
+ * @param text the text identifying the signature status. If <CODE>null</CODE> or not set
+ * the description "Signature Not Verified" will be used
+ */
+ public void setLayer4Text(String text) {
+ layer4Text = text;
+ }
+
+ /**
+ * Gets the text identifying the signature status if set by setLayer4Text().
+ * @return the text identifying the signature status
+ */
+ public String getLayer4Text() {
+ return layer4Text;
+ }
+
+ /**
+ * Gets the rectangle representing the signature dimensions.
+ * @return the rectangle representing the signature dimensions. It may be <CODE>null</CODE>
+ * or have zero width or height for invisible signatures
+ */
+ public Rectangle getRect() {
+ return rect;
+ }
+
+ /**
+ * Gets the visibility status of the signature.
+ * @return the visibility status of the signature
+ */
+ public boolean isInvisible() {
+ return (rect == null || rect.width() == 0 || rect.height() == 0);
+ }
+
+ /**
+ * Sets the cryptographic parameters.
+ * @param privKey the private key
+ * @param certChain the certificate chain
+ * @param crlList the certificate revocation list. It may be <CODE>null</CODE>
+ * @param filter the crytographic filter type. It can be SELF_SIGNED, VERISIGN_SIGNED or WINCER_SIGNED
+ */
+ public void setCrypto(PrivateKey privKey, Certificate[] certChain, CRL[] crlList, PdfName filter) {
+ this.privKey = privKey;
+ this.certChain = certChain;
+ this.crlList = crlList;
+ this.filter = filter;
+ }
+
+ /**
+ * Sets the signature to be visible. It creates a new visible signature field.
+ * @param pageRect the position and dimension of the field in the page
+ * @param page the page to place the field. The fist page is 1
+ * @param fieldName the field name or <CODE>null</CODE> to generate automatically a new field name
+ */
+ public void setVisibleSignature(Rectangle pageRect, int page, String fieldName) {
+ if (fieldName != null) {
+ if (fieldName.indexOf('.') >= 0)
+ throw new IllegalArgumentException("Field names cannot contain a dot.");
+ AcroFields af = writer.getAcroFields();
+ AcroFields.Item item = af.getFieldItem(fieldName);
+ if (item != null)
+ throw new IllegalArgumentException("The field " + fieldName + " already exists.");
+ this.fieldName = fieldName;
+ }
+ if (page < 1 || page > writer.reader.getNumberOfPages())
+ throw new IllegalArgumentException("Invalid page number: " + page);
+ this.pageRect = new Rectangle(pageRect);
+ this.pageRect.normalize();
+ rect = new Rectangle(this.pageRect.width(), this.pageRect.height());
+ this.page = page;
+ newField = true;
+ }
+
+ /**
+ * Sets the signature to be visible. An empty signature field with the same name must already exist.
+ * @param fieldName the existing empty signature field name
+ */
+ public void setVisibleSignature(String fieldName) {
+ AcroFields af = writer.getAcroFields();
+ AcroFields.Item item = af.getFieldItem(fieldName);
+ if (item == null)
+ throw new IllegalArgumentException("The field " + fieldName + " does not exist.");
+ PdfDictionary merged = (PdfDictionary)item.merged.get(0);
+ if (!PdfName.SIG.equals(PdfReader.getPdfObject(merged.get(PdfName.FT))))
+ throw new IllegalArgumentException("The field " + fieldName + " is not a signature field.");
+ this.fieldName = fieldName;
+ PdfArray r = (PdfArray)PdfReader.getPdfObject(merged.get(PdfName.RECT));
+ ArrayList ar = r.getArrayList();
+ float llx = ((PdfNumber)PdfReader.getPdfObject((PdfObject)ar.get(0))).floatValue();
+ float lly = ((PdfNumber)PdfReader.getPdfObject((PdfObject)ar.get(1))).floatValue();
+ float urx = ((PdfNumber)PdfReader.getPdfObject((PdfObject)ar.get(2))).floatValue();
+ float ury = ((PdfNumber)PdfReader.getPdfObject((PdfObject)ar.get(3))).floatValue();
+ pageRect = new Rectangle(llx, lly, urx, ury);
+ pageRect.normalize();
+ page = ((Integer)item.page.get(0)).intValue();
+ int rotation = writer.reader.getPageRotation(page);
+ Rectangle pageSize = writer.reader.getPageSizeWithRotation(page);
+ switch (rotation) {
+ case 90:
+ pageRect = new Rectangle(
+ pageRect.bottom(),
+ pageSize.top() - pageRect.left(),
+ pageRect.top(),
+ pageSize.top() - pageRect.right());
+ break;
+ case 180:
+ pageRect = new Rectangle(
+ pageSize.right() - pageRect.left(),
+ pageSize.top() - pageRect.bottom(),
+ pageSize.right() - pageRect.right(),
+ pageSize.top() - pageRect.top());
+ break;
+ case 270:
+ pageRect = new Rectangle(
+ pageSize.right() - pageRect.bottom(),
+ pageRect.left(),
+ pageSize.right() - pageRect.top(),
+ pageRect.right());
+ break;
+ }
+ if (rotation != 0)
+ pageRect.normalize();
+ rect = new Rectangle(this.pageRect.width(), this.pageRect.height());
+ }
+
+ /**
+ * Gets a template layer to create a signature appearance. The layers can go from 0 to 4.
+ * <p>
+ * Consult <A HREF="http://partners.adobe.com/asn/developer/pdfs/tn/PPKAppearances.pdf">PPKAppearances.pdf</A>
+ * for further details.
+ * @param layer the layer
+ * @return a template
+ */
+ public PdfTemplate getLayer(int layer) {
+ if (layer < 0 || layer >= app.length)
+ return null;
+ PdfTemplate t = app[layer];
+ if (t == null) {
+ t = app[layer] = new PdfTemplate(writer);
+ t.setBoundingBox(rect);
+ writer.addDirectTemplateSimple(t, new PdfName("n" + layer));
+ }
+ return t;
+ }
+
+ /**
+ * Gets the template that aggregates all appearance layers. This corresponds to the /FRM resource.
+ * <p>
+ * Consult <A HREF="http://partners.adobe.com/asn/developer/pdfs/tn/PPKAppearances.pdf">PPKAppearances.pdf</A>
+ * for further details.
+ * @return the template that aggregates all appearance layers
+ */
+ public PdfTemplate getTopLayer() {
+ if (frm == null) {
+ frm = new PdfTemplate(writer);
+ frm.setBoundingBox(rect);
+ writer.addDirectTemplateSimple(frm, new PdfName("FRM"));
+ }
+ return frm;
+ }
+
+ /**
+ * Gets the main appearance layer.
+ * <p>
+ * Consult <A HREF="http://partners.adobe.com/asn/developer/pdfs/tn/PPKAppearances.pdf">PPKAppearances.pdf</A>
+ * for further details.
+ * @return the main appearance layer
+ * @throws DocumentException on error
+ * @throws IOException on error
+ */
+ public PdfTemplate getAppearance() throws DocumentException, IOException {
+ if (app[0] == null) {
+ PdfTemplate t = app[0] = new PdfTemplate(writer);
+ t.setBoundingBox(new Rectangle(100, 100));
+ writer.addDirectTemplateSimple(t, new PdfName("n0"));
+ t.setLiteral("% DSBlank\n");
+ }
+ if (app[1] == null && !acro6Layers) {
+ PdfTemplate t = app[1] = new PdfTemplate(writer);
+ t.setBoundingBox(new Rectangle(100, 100));
+ writer.addDirectTemplateSimple(t, new PdfName("n1"));
+ t.setLiteral(questionMark);
+ }
+ if (app[2] == null) {
+ String text;
+ if (layer2Text == null) {
+ StringBuffer buf = new StringBuffer();
+ buf.append("Digitally signed by ").append(PdfPKCS7.getSubjectFields((X509Certificate)certChain[0]).getField("CN")).append("\n");
+ SimpleDateFormat sd = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss z");
+ buf.append("Date: ").append(sd.format(signDate.getTime()));
+ if (reason != null)
+ buf.append("\n").append("Reason: ").append(reason);
+ if (location != null)
+ buf.append("\n").append("Location: ").append(location);
+ text = buf.toString();
+ }
+ else
+ text = layer2Text;
+ PdfTemplate t = app[2] = new PdfTemplate(writer);
+ t.setBoundingBox(rect);
+ writer.addDirectTemplateSimple(t, new PdfName("n2"));
+ if (image != null) {
+ if (imageScale == 0) {
+ t.addImage(image, rect.width(), 0, 0, rect.height(), 0, 0);
+ }
+ else {
+ float usableScale = imageScale;
+ if (imageScale < 0)
+ usableScale = Math.min(rect.width() / image.width(), rect.height() / image.height());
+ float w = image.width() * usableScale;
+ float h = image.height() * usableScale;
+ float x = (rect.width() - w) / 2;
+ float y = (rect.height() - h) / 2;
+ t.addImage(image, w, 0, 0, h, x, y);
+ }
+ }
+ Font font;
+ if (layer2Font == null)
+ font = new Font();
+ else
+ font = new Font(layer2Font);
+ float size = font.size();
+ if (size <= 0) {
+ Rectangle sr = new Rectangle(rect.width() - 2 * margin, rect.height() * (1 - topSection) - 2 * margin);
+ size = fitText(font, text, sr, 12, runDirection);
+ }
+ ColumnText ct = new ColumnText(t);
+ ct.setRunDirection(runDirection);
+ ct.setSimpleColumn(new Phrase(text, font), margin, 0, rect.width() - margin, rect.height() * (1 - topSection) - margin, size, Element.ALIGN_LEFT);
+ ct.go();
+ }
+ if (app[3] == null && !acro6Layers) {
+ PdfTemplate t = app[3] = new PdfTemplate(writer);
+ t.setBoundingBox(new Rectangle(100, 100));
+ writer.addDirectTemplateSimple(t, new PdfName("n3"));
+ t.setLiteral("% DSBlank\n");
+ }
+ if (app[4] == null && !acro6Layers) {
+ PdfTemplate t = app[4] = new PdfTemplate(writer);
+ t.setBoundingBox(new Rectangle(0, rect.height() * (1 - topSection), rect.right(), rect.top()));
+ writer.addDirectTemplateSimple(t, new PdfName("n4"));
+ Font font;
+ if (layer2Font == null)
+ font = new Font();
+ else
+ font = new Font(layer2Font);
+ float size = font.size();
+ String text = "Signature Not Verified";
+ if (layer4Text != null)
+ text = layer4Text;
+ Rectangle sr = new Rectangle(rect.width() - 2 * margin, rect.height() * topSection - 2 * margin);
+ size = fitText(font, text, sr, 15, runDirection);
+ ColumnText ct = new ColumnText(t);
+ ct.setRunDirection(runDirection);
+ ct.setSimpleColumn(new Phrase(text, font), margin, 0, rect.width() - margin, rect.height() - margin, size, Element.ALIGN_LEFT);
+ ct.go();
+ }
+ int rotation = writer.reader.getPageRotation(page);
+ Rectangle rotated = new Rectangle(rect);
+ int n = rotation;
+ while (n > 0) {
+ rotated = rotated.rotate();
+ n -= 90;
+ }
+ if (frm == null) {
+ frm = new PdfTemplate(writer);
+ frm.setBoundingBox(rotated);
+ writer.addDirectTemplateSimple(frm, new PdfName("FRM"));
+ float scale = Math.min(rect.width(), rect.height()) * 0.9f;
+ float x = (rect.width() - scale) / 2;
+ float y = (rect.height() - scale) / 2;
+ scale /= 100;
+ if (rotation == 90)
+ frm.concatCTM(0, 1, -1, 0, rect.height(), 0);
+ else if (rotation == 180)
+ frm.concatCTM(-1, 0, 0, -1, rect.width(), rect.height());
+ else if (rotation == 270)
+ frm.concatCTM(0, -1, 1, 0, 0, rect.width());
+ frm.addTemplate(app[0], 0, 0);
+ if (!acro6Layers)
+ frm.addTemplate(app[1], scale, 0, 0, scale, x, y);
+ frm.addTemplate(app[2], 0, 0);
+ if (!acro6Layers) {
+ frm.addTemplate(app[3], scale, 0, 0, scale, x, y);
+ frm.addTemplate(app[4], 0, 0);
+ }
+ }
+ PdfTemplate napp = new PdfTemplate(writer);
+ napp.setBoundingBox(rotated);
+ writer.addDirectTemplateSimple(napp, null);
+ napp.addTemplate(frm, 0, 0);
+ return napp;
+ }
+
+ /**
+ * Fits the text to some rectangle adjusting the font size as needed.
+ * @param font the font to use
+ * @param text the text
+ * @param rect the rectangle where the text must fit
+ * @param maxFontSize the maximum font size
+ * @param runDirection the run direction
+ * @return the calculated font size that makes the text fit
+ */
+ public static float fitText(Font font, String text, Rectangle rect, float maxFontSize, int runDirection) {
+ try {
+ ColumnText ct = null;
+ int status = 0;
+ if (maxFontSize <= 0) {
+ int cr = 0;
+ int lf = 0;
+ char t[] = text.toCharArray();
+ for (int k = 0; k < t.length; ++k) {
+ if (t[k] == '\n')
+ ++lf;
+ else if (t[k] == '\r')
+ ++cr;
+ }
+ int minLines = Math.max(cr, lf) + 1;
+ maxFontSize = Math.abs(rect.height()) / minLines - 0.001f;
+ }
+ font.setSize(maxFontSize);
+ Phrase ph = new Phrase(text, font);
+ ct = new ColumnText(null);
+ ct.setSimpleColumn(ph, rect.left(), rect.bottom(), rect.right(), rect.top(), maxFontSize, Element.ALIGN_LEFT);
+ ct.setRunDirection(runDirection);
+ status = ct.go(true);
+ if ((status & ColumnText.NO_MORE_TEXT) != 0)
+ return maxFontSize;
+ float precision = 0.1f;
+ float min = 0;
+ float max = maxFontSize;
+ float size = maxFontSize;
+ for (int k = 0; k < 50; ++k) { //just in case it doesn't converge
+ size = (min + max) / 2;
+ ct = new ColumnText(null);
+ font.setSize(size);
+ ct.setSimpleColumn(new Phrase(text, font), rect.left(), rect.bottom(), rect.right(), rect.top(), size, Element.ALIGN_LEFT);
+ ct.setRunDirection(runDirection);
+ status = ct.go(true);
+ if ((status & ColumnText.NO_MORE_TEXT) != 0) {
+ if (max - min < size * precision)
+ return size;
+ min = size;
+ }
+ else
+ max = size;
+ }
+ return size;
+ }
+ catch (Exception e) {
+ throw new ExceptionConverter(e);
+ }
+ }
+
+ /**
+ * Sets the digest/signature to an external calculated value.
+ * @param digest the digest. This is the actual signature
+ * @param RSAdata the extra data that goes into the data tag in PKCS#7
+ * @param digestEncryptionAlgorithm the encryption algorithm. It may must be <CODE>null</CODE> if the <CODE>digest</CODE>
+ * is also <CODE>null</CODE>. If the <CODE>digest</CODE> is not <CODE>null</CODE>
+ * then it may be "RSA" or "DSA"
+ */
+ public void setExternalDigest(byte digest[], byte RSAdata[], String digestEncryptionAlgorithm) {
+ externalDigest = digest;
+ externalRSAdata = RSAdata;
+ this.digestEncryptionAlgorithm = digestEncryptionAlgorithm;
+ }
+
+ /**
+ * Gets the signing reason.
+ * @return the signing reason
+ */
+ public String getReason() {
+ return this.reason;
+ }
+
+ /**
+ * Sets the signing reason.
+ * @param reason the signing reason
+ */
+ public void setReason(String reason) {
+ this.reason = reason;
+ }
+
+ /**
+ * Gets the signing location.
+ * @return the signing location
+ */
+ public String getLocation() {
+ return this.location;
+ }
+
+ /**
+ * Sets the signing location.
+ * @param location the signing location
+ */
+ public void setLocation(String location) {
+ this.location = location;
+ }
+
+ /**
+ * Returns the Cryptographic Service Provider that will sign the document.
+ * @return provider the name of the provider, for example "SUN",
+ * or <code>null</code> to use the default provider.
+ */
+ public String getProvider() {
+ return this.provider;
+ }
+
+ /**
+ * Sets the Cryptographic Service Provider that will sign the document.
+ *
+ * @param provider the name of the provider, for example "SUN", or
+ * <code>null</code> to use the default provider.
+ */
+ public void setProvider(String provider) {
+ this.provider = provider;
+ }
+
+ /**
+ * Gets the private key.
+ * @return the private key
+ */
+ public java.security.PrivateKey getPrivKey() {
+ return privKey;
+ }
+
+ /**
+ * Gets the certificate chain.
+ * @return the certificate chain
+ */
+ public java.security.cert.Certificate[] getCertChain() {
+ return this.certChain;
+ }
+
+ /**
+ * Gets the certificate revocation list.
+ * @return the certificate revocation list
+ */
+ public java.security.cert.CRL[] getCrlList() {
+ return this.crlList;
+ }
+
+ /**
+ * Gets the filter used to sign the document.
+ * @return the filter used to sign the document
+ */
+ public com.lowagie.text.pdf.PdfName getFilter() {
+ return filter;
+ }
+
+ /**
+ * Checks if a new field was created.
+ * @return <CODE>true</CODE> if a new field was created, <CODE>false</CODE> if signing
+ * an existing field or if the signature is invisible
+ */
+ public boolean isNewField() {
+ return this.newField;
+ }
+
+ /**
+ * Gets the page number of the field.
+ * @return the page number of the field
+ */
+ public int getPage() {
+ return page;
+ }
+
+ /**
+ * Gets the field name.
+ * @return the field name
+ */
+ public java.lang.String getFieldName() {
+ return fieldName;
+ }
+
+ /**
+ * Gets the rectangle that represent the position and dimension of the signature in the page.
+ * @return the rectangle that represent the position and dimension of the signature in the page
+ */
+ public com.lowagie.text.Rectangle getPageRect() {
+ return pageRect;
+ }
+
+ /**
+ * Gets the signature date.
+ * @return the signature date
+ */
+ public java.util.Calendar getSignDate() {
+ return signDate;
+ }
+
+ /**
+ * Sets the signature date.
+ * @param signDate the signature date
+ */
+ public void setSignDate(java.util.Calendar signDate) {
+ this.signDate = signDate;
+ }
+
+ com.lowagie.text.pdf.ByteBuffer getSigout() {
+ return sigout;
+ }
+
+ void setSigout(com.lowagie.text.pdf.ByteBuffer sigout) {
+ this.sigout = sigout;
+ }
+
+ java.io.OutputStream getOriginalout() {
+ return originalout;
+ }
+
+ void setOriginalout(java.io.OutputStream originalout) {
+ this.originalout = originalout;
+ }
+
+ /**
+ * Gets the temporary file.
+ * @return the temporary file or <CODE>null</CODE> is the document is created in memory
+ */
+ public java.io.File getTempFile() {
+ return tempFile;
+ }
+
+ void setTempFile(java.io.File tempFile) {
+ this.tempFile = tempFile;
+ }
+
+ /**
+ * Gets a new signature fied name that doesn't clash with any existing name.
+ * @return a new signature fied name
+ */
+ public String getNewSigName() {
+ AcroFields af = writer.getAcroFields();
+ String name = "Signature";
+ int step = 0;
+ boolean found = false;
+ while (!found) {
+ ++step;
+ String n1 = name + step;
+ if (af.getFieldItem(n1) != null)
+ continue;
+ n1 += ".";
+ found = true;
+ for (Iterator it = af.getFields().keySet().iterator(); it.hasNext();) {
+ String fn = (String)it.next();
+ if (fn.startsWith(n1)) {
+ found = false;
+ break;
+ }
+ }
+ }
+ name += step;
+ return name;
+ }
+
+ /**
+ * This is the first method to be called when using external signatures. The general sequence is:
+ * preClose(), getDocumentBytes() and close().
+ * <p>
+ * If calling preClose() <B>dont't</B> call PdfStamper.close().
+ * <p>
+ * No external signatures are allowed if this methos is called.
+ * @throws IOException on error
+ * @throws DocumentException on error
+ */
+ public void preClose() throws IOException, DocumentException {
+ preClose(null);
+ }
+ /**
+ * This is the first method to be called when using external signatures. The general sequence is:
+ * preClose(), getDocumentBytes() and close().
+ * <p>
+ * If calling preClose() <B>dont't</B> call PdfStamper.close().
+ * <p>
+ * If using an external signature <CODE>exclusionSizes</CODE> must contain at least
+ * the <CODE>PdfName.CONTENTS</CODE> key with the size that it will take in the
+ * document. Note that due to the hex string coding this size should be
+ * byte_size*2+2.
+ * @param exclusionSizes a <CODE>HashMap</CODE> with names and sizes to be excluded in the signature
+ * calculation. The key is a <CODE>PdfName</CODE> and the value an
+ * <CODE>Integer</CODE>. At least the <CODE>PdfName.CONTENTS</CODE> must be present
+ * @throws IOException on error
+ * @throws DocumentException on error
+ */
+ public void preClose(HashMap exclusionSizes) throws IOException, DocumentException {
+ if (preClosed)
+ throw new DocumentException("Document already pre closed.");
+ preClosed = true;
+ AcroFields af = writer.getAcroFields();
+ String name = getFieldName();
+ boolean fieldExists = !(isInvisible() || isNewField());
+ int flags = 132;
+ PdfIndirectReference refSig = writer.getPdfIndirectReference();
+ if (fieldExists && name.indexOf('.') >= 0) {
+ ArrayList widgets = af.getFieldItem(name).widgets;
+ PdfDictionary widget = (PdfDictionary)widgets.get(0);
+ writer.markUsed(widget);
+ widget.put(PdfName.P, writer.getPageReference(getPage()));
+ widget.put(PdfName.V, refSig);
+ PdfDictionary ap = new PdfDictionary();
+ ap.put(PdfName.N, getAppearance().getIndirectReference());
+ widget.put(PdfName.AP, ap);
+ }
+ else {
+ if (fieldExists) {
+ flags = 0;
+ ArrayList merged = af.getFieldItem(name).merged;
+ PdfObject obj = PdfReader.getPdfObjectRelease(((PdfDictionary)merged.get(0)).get(PdfName.F));
+ if (obj != null && obj.isNumber())
+ flags = ((PdfNumber)obj).intValue();
+ af.removeField(name);
+ }
+ writer.setSigFlags(3);
+ PdfFormField sigField = PdfFormField.createSignature(writer);
+ sigField.setFieldName(name);
+ sigField.put(PdfName.V, refSig);
+ sigField.setFlags(flags);
+
+ int pagen = getPage();
+ if (!isInvisible()) {
+ sigField.setWidget(getPageRect(), null);
+ sigField.setAppearance(PdfAnnotation.APPEARANCE_NORMAL, getAppearance());
+ }
+ else
+ sigField.setWidget(new Rectangle(0, 0), null);
+ sigField.setPage(pagen);
+ writer.addAnnotation(sigField, pagen);
+ }
+
+ exclusionLocations = new HashMap();
+ if (cryptoDictionary == null) {
+ if (PdfName.ADOBE_PPKLITE.equals(getFilter()))
+ sigStandard = new PdfSigGenericPKCS.PPKLite(getProvider());
+ else if (PdfName.ADOBE_PPKMS.equals(getFilter()))
+ sigStandard = new PdfSigGenericPKCS.PPKMS(getProvider());
+ else if (PdfName.VERISIGN_PPKVS.equals(getFilter()))
+ sigStandard = new PdfSigGenericPKCS.VeriSign(getProvider());
+ else
+ throw new IllegalArgumentException("Unknown filter: " + getFilter());
+ sigStandard.setExternalDigest(externalDigest, externalRSAdata, digestEncryptionAlgorithm);
+ if (getReason() != null)
+ sigStandard.setReason(getReason());
+ if (getLocation() != null)
+ sigStandard.setLocation(getLocation());
+ if (getContact() != null)
+ sigStandard.setContact(getContact());
+ sigStandard.put(PdfName.M, new PdfDate(getSignDate()));
+ sigStandard.setSignInfo(getPrivKey(), getCertChain(), getCrlList());
+ PdfString contents = (PdfString)sigStandard.get(PdfName.CONTENTS);
+ PdfLiteral lit = new PdfLiteral((contents.toString().length() + (PdfName.ADOBE_PPKLITE.equals(getFilter())?0:64)) * 2 + 2);
+ exclusionLocations.put(PdfName.CONTENTS, lit);
+ sigStandard.put(PdfName.CONTENTS, lit);
+ lit = new PdfLiteral(80);
+ exclusionLocations.put(PdfName.BYTERANGE, lit);
+ sigStandard.put(PdfName.BYTERANGE, lit);
+ if (certified)
+ addDocMDP(sigStandard);
+ if (signatureEvent != null)
+ signatureEvent.getSignatureDictionary(sigStandard);
+ writer.addToBody(sigStandard, refSig, false);
+ }
+ else {
+ PdfLiteral lit = new PdfLiteral(80);
+ exclusionLocations.put(PdfName.BYTERANGE, lit);
+ cryptoDictionary.put(PdfName.BYTERANGE, lit);
+ for (Iterator it = exclusionSizes.entrySet().iterator(); it.hasNext();) {
+ Map.Entry entry = (Map.Entry)it.next();
+ PdfName key = (PdfName)entry.getKey();
+ Integer v = (Integer)entry.getValue();
+ lit = new PdfLiteral(v.intValue());
+ exclusionLocations.put(key, lit);
+ cryptoDictionary.put(key, lit);
+ }
+ if (certified)
+ addDocMDP(cryptoDictionary);
+ if (signatureEvent != null)
+ signatureEvent.getSignatureDictionary(cryptoDictionary);
+ writer.addToBody(cryptoDictionary, refSig, false);
+ }
+ if (certified) {
+ // add DocMDP entry to root
+ PdfDictionary docmdp = new PdfDictionary();
+ docmdp.put(new PdfName("DocMDP"), refSig);
+ writer.reader.getCatalog().put(new PdfName("Perms"), docmdp);
+ }
+ writer.close(stamper.getMoreInfo());
+
+ range = new int[exclusionLocations.size() * 2];
+ int byteRangePosition = ((PdfLiteral)exclusionLocations.get(PdfName.BYTERANGE)).getPosition();
+ exclusionLocations.remove(PdfName.BYTERANGE);
+ int idx = 1;
+ for (Iterator it = exclusionLocations.values().iterator(); it.hasNext();) {
+ PdfLiteral lit = (PdfLiteral)it.next();
+ int n = lit.getPosition();
+ range[idx++] = n;
+ range[idx++] = lit.getPosLength() + n;
+ }
+ Arrays.sort(range, 1, range.length - 1);
+ for (int k = 3; k < range.length - 2; k += 2)
+ range[k] -= range[k - 1];
+
+ if (tempFile == null) {
+ bout = sigout.getBuffer();
+ boutLen = sigout.size();
+ range[range.length - 1] = boutLen - range[range.length - 2];
+ ByteBuffer bf = new ByteBuffer();
+ bf.append('[');
+ for (int k = 0; k < range.length; ++k)
+ bf.append(range[k]).append(' ');
+ bf.append(']');
+ System.arraycopy(bf.getBuffer(), 0, bout, byteRangePosition, bf.size());
+ }
+ else {
+ try {
+ raf = new RandomAccessFile(tempFile, "rw");
+ int boutLen = (int)raf.length();
+ range[range.length - 1] = boutLen - range[range.length - 2];
+ ByteBuffer bf = new ByteBuffer();
+ bf.append('[');
+ for (int k = 0; k < range.length; ++k)
+ bf.append(range[k]).append(' ');
+ bf.append(']');
+ raf.seek(byteRangePosition);
+ raf.write(bf.getBuffer(), 0, bf.size());
+ }
+ catch (IOException e) {
+ try{raf.close();}catch(Exception ee){}
+ try{tempFile.delete();}catch(Exception ee){}
+ throw e;
+ }
+ }
+ }
+
+ /**
+ * This is the last method to be called when using external signatures. The general sequence is:
+ * preClose(), getDocumentBytes() and close().
+ * <p>
+ * <CODE>update</CODE> is a <CODE>PdfDictionary</CODE> that must have exactly the
+ * same keys as the ones provided in {@link #preClose(HashMap)}.
+ * @param update a <CODE>PdfDictionary</CODE> with the key/value that will fill the holes defined
+ * in {@link #preClose(HashMap)}
+ * @throws DocumentException on error
+ * @throws IOException on error
+ */
+ public void close(PdfDictionary update) throws IOException, DocumentException {
+ try {
+ if (!preClosed)
+ throw new DocumentException("preClose() must be called first.");
+ ByteBuffer bf = new ByteBuffer();
+ for (Iterator it = update.getKeys().iterator(); it.hasNext();) {
+ PdfName key = (PdfName)it.next();
+ PdfObject obj = update.get(key);
+ PdfLiteral lit = (PdfLiteral)exclusionLocations.get(key);
+ if (lit == null)
+ throw new IllegalArgumentException("The key " + key.toString() + " didn't reserve space in preClose().");
+ bf.reset();
+ obj.toPdf(null, bf);
+ if (bf.size() > lit.getPosLength())
+ throw new IllegalArgumentException("The key " + key.toString() + " is too big. Is " + bf.size() + ", reserved " + lit.getPosLength());
+ if (tempFile == null)
+ System.arraycopy(bf.getBuffer(), 0, bout, lit.getPosition(), bf.size());
+ else {
+ raf.seek(lit.getPosition());
+ raf.write(bf.getBuffer(), 0, bf.size());
+ }
+ }
+ if (update.size() != exclusionLocations.size())
+ throw new IllegalArgumentException("The update dictionary has less keys than required.");
+ if (tempFile == null) {
+ originalout.write(bout, 0, boutLen);
+ }
+ else {
+ if (originalout != null) {
+ raf.seek(0);
+ int length = (int)raf.length();
+ byte buf[] = new byte[8192];
+ while (length > 0) {
+ int r = raf.read(buf, 0, Math.min(buf.length, length));
+ if (r < 0)
+ throw new EOFException("Unexpected EOF");
+ originalout.write(buf, 0, r);
+ length -= r;
+ }
+ }
+ }
+ }
+ finally {
+ if (tempFile != null) {
+ try{raf.close();}catch(Exception ee){}
+ if (originalout != null)
+ try{tempFile.delete();}catch(Exception ee){}
+ }
+ if (originalout != null)
+ try{originalout.close();}catch(Exception e){}
+ }
+ }
+
+ private void addDocMDP(PdfDictionary crypto) {
+ PdfDictionary reference = new PdfDictionary();
+ PdfDictionary transformParams = new PdfDictionary();
+ transformParams.put(PdfName.P, new PdfNumber(1));
+ transformParams.put(PdfName.V, new PdfName("1.2"));
+ transformParams.put(PdfName.TYPE, new PdfName("TransformParams"));
+ reference.put(new PdfName("TransformMethod"), new PdfName("DocMDP"));
+ reference.put(PdfName.TYPE, new PdfName("SigRef"));
+ reference.put(new PdfName("TransformParams"), transformParams);
+ PdfArray types = new PdfArray();
+ types.add(reference);
+ crypto.put(new PdfName("Reference"), types);
+ }
+
+ private static int indexArray(byte bout[], int position, String search) {
+ byte ss[] = PdfEncodings.convertToBytes(search, null);
+ while (true) {
+ int k;
+ for (k = 0; k < ss.length; ++k) {
+ if (ss[k] != bout[position + k])
+ break;
+ }
+ if (k == ss.length)
+ return position;
+ ++position;
+ }
+ }
+
+ private static int indexFile(RandomAccessFile raf, int position, String search) throws IOException {
+ byte ss[] = PdfEncodings.convertToBytes(search, null);
+ while (true) {
+ raf.seek(position);
+ int k;
+ for (k = 0; k < ss.length; ++k) {
+ int b = raf.read();
+ if (b < 0)
+ throw new EOFException("Unexpected EOF");
+ if (ss[k] != (byte)b)
+ break;
+ }
+ if (k == ss.length)
+ return position;
+ ++position;
+ }
+ }
+
+ /**
+ * Gets the document bytes that are hashable when using external signatures. The general sequence is:
+ * preClose(), getRangeStream() and close().
+ * <p>
+ * @return the document bytes that are hashable
+ */
+ public InputStream getRangeStream() {
+ return new PdfSignatureAppearance.RangeStream(raf, bout, range);
+ }
+
+ /**
+ * Gets the user made signature dictionary. This is the dictionary at the /V key.
+ * @return the user made signature dictionary
+ */
+ public com.lowagie.text.pdf.PdfDictionary getCryptoDictionary() {
+ return cryptoDictionary;
+ }
+
+ /**
+ * Sets a user made signature dictionary. This is the dictionary at the /V key.
+ * @param cryptoDictionary a user made signature dictionary
+ */
+ public void setCryptoDictionary(com.lowagie.text.pdf.PdfDictionary cryptoDictionary) {
+ this.cryptoDictionary = cryptoDictionary;
+ }
+
+ /**
+ * Gets the <CODE>PdfStamper</CODE> associated with this instance.
+ * @return the <CODE>PdfStamper</CODE> associated with this instance
+ */
+ public com.lowagie.text.pdf.PdfStamper getStamper() {
+ return stamper;
+ }
+
+ void setStamper(com.lowagie.text.pdf.PdfStamper stamper) {
+ this.stamper = stamper;
+ }
+
+ /**
+ * Checks if the document is in the process of closing.
+ * @return <CODE>true</CODE> if the document is in the process of closing,
+ * <CODE>false</CODE> otherwise
+ */
+ public boolean isPreClosed() {
+ return preClosed;
+ }
+
+ /**
+ * Gets the instance of the standard signature dictionary. This instance
+ * is only available after pre close.
+ * <p>
+ * The main use is to insert external signatures.
+ * @return the instance of the standard signature dictionary
+ */
+ public com.lowagie.text.pdf.PdfSigGenericPKCS getSigStandard() {
+ return sigStandard;
+ }
+
+ /**
+ * Gets the signing contact.
+ * @return the signing contact
+ */
+ public String getContact() {
+ return this.contact;
+ }
+
+ /**
+ * Sets the signing contact.
+ * @param contact the signing contact
+ */
+ public void setContact(String contact) {
+ this.contact = contact;
+ }
+
+ /**
+ * Gets the n2 and n4 layer font.
+ * @return the n2 and n4 layer font
+ */
+ public Font getLayer2Font() {
+ return this.layer2Font;
+ }
+
+ /**
+ * Sets the n2 and n4 layer font. If the font size is zero, auto-fit will be used.
+ * @param layer2Font the n2 and n4 font
+ */
+ public void setLayer2Font(Font layer2Font) {
+ this.layer2Font = layer2Font;
+ }
+
+ /**
+ * Gets the Acrobat 6.0 layer mode.
+ * @return the Acrobat 6.0 layer mode
+ */
+ public boolean isAcro6Layers() {
+ return this.acro6Layers;
+ }
+
+ /**
+ * Acrobat 6.0 and higher recomends that only layer n2 and n4 be present. This method sets that mode.
+ * @param acro6Layers if <code>true</code> only the layers n2 and n4 will be present
+ */
+ public void setAcro6Layers(boolean acro6Layers) {
+ this.acro6Layers = acro6Layers;
+ }
+
+ /** Sets the run direction in the n2 and n4 layer.
+ * @param runDirection the run direction
+ */
+ public void setRunDirection(int runDirection) {
+ if (runDirection < PdfWriter.RUN_DIRECTION_DEFAULT || runDirection > PdfWriter.RUN_DIRECTION_RTL)
+ throw new RuntimeException("Invalid run direction: " + runDirection);
+ this.runDirection = runDirection;
+ }
+
+ /** Gets the run direction.
+ * @return the run direction
+ */
+ public int getRunDirection() {
+ return runDirection;
+ }
+
+ /**
+ * Getter for property signatureEvent.
+ * @return Value of property signatureEvent.
+ */
+ public SignatureEvent getSignatureEvent() {
+ return this.signatureEvent;
+ }
+
+ /**
+ * Sets the signature event to allow modification of the signature dictionary.
+ * @param signatureEvent the signature event
+ */
+ public void setSignatureEvent(SignatureEvent signatureEvent) {
+ this.signatureEvent = signatureEvent;
+ }
+
+ /**
+ * Gets the background image for the layer 2.
+ * @return the background image for the layer 2
+ */
+ public Image getImage() {
+ return this.image;
+ }
+
+ /**
+ * Sets the background image for the layer 2.
+ * @param image the background image for the layer 2
+ */
+ public void setImage(Image image) {
+ this.image = image;
+ }
+
+ /**
+ * Gets the scaling to be applied to the background image.
+ * @return the scaling to be applied to the background image
+ */
+ public float getImageScale() {
+ return this.imageScale;
+ }
+
+ /**
+ * Sets the scaling to be applied to the background image. If it's zero the image
+ * will fully fill the rectangle. If it's less than zero the image will fill the rectangle but
+ * will keep the proportions. If it's greater than zero that scaling will be applied.
+ * In any of the cases the image will always be centered. It's zero by default.
+ * @param imageScale the scaling to be applied to the background image
+ */
+ public void setImageScale(float imageScale) {
+ this.imageScale = imageScale;
+ }
+
+ /**
+ * Commands to draw a yellow question mark in a stream content
+ */
+ public static final String questionMark =
+ "% DSUnknown\n" +
+ "q\n" +
+ "1 G\n" +
+ "1 g\n" +
+ "0.1 0 0 0.1 9 0 cm\n" +
+ "0 J 0 j 4 M []0 d\n" +
+ "1 i \n" +
+ "0 g\n" +
+ "313 292 m\n" +
+ "313 404 325 453 432 529 c\n" +
+ "478 561 504 597 504 645 c\n" +
+ "504 736 440 760 391 760 c\n" +
+ "286 760 271 681 265 626 c\n" +
+ "265 625 l\n" +
+ "100 625 l\n" +
+ "100 828 253 898 381 898 c\n" +
+ "451 898 679 878 679 650 c\n" +
+ "679 555 628 499 538 435 c\n" +
+ "488 399 467 376 467 292 c\n" +
+ "313 292 l\n" +
+ "h\n" +
+ "308 214 170 -164 re\n" +
+ "f\n" +
+ "0.44 G\n" +
+ "1.2 w\n" +
+ "1 1 0.4 rg\n" +
+ "287 318 m\n" +
+ "287 430 299 479 406 555 c\n" +
+ "451 587 478 623 478 671 c\n" +
+ "478 762 414 786 365 786 c\n" +
+ "260 786 245 707 239 652 c\n" +
+ "239 651 l\n" +
+ "74 651 l\n" +
+ "74 854 227 924 355 924 c\n" +
+ "425 924 653 904 653 676 c\n" +
+ "653 581 602 525 512 461 c\n" +
+ "462 425 441 402 441 318 c\n" +
+ "287 318 l\n" +
+ "h\n" +
+ "282 240 170 -164 re\n" +
+ "B\n" +
+ "Q\n";
+
+ /**
+ * Holds value of property contact.
+ */
+ private String contact;
+
+ /**
+ * Holds value of property layer2Font.
+ */
+ private Font layer2Font;
+
+ /**
+ * Holds value of property layer4Text.
+ */
+ private String layer4Text;
+
+ /**
+ * Holds value of property acro6Layers.
+ */
+ private boolean acro6Layers;
+
+ /**
+ * Holds value of property runDirection.
+ */
+ private int runDirection = PdfWriter.RUN_DIRECTION_NO_BIDI;
+
+ /**
+ * Holds value of property signatureEvent.
+ */
+ private SignatureEvent signatureEvent;
+
+ /**
+ * Holds value of property image.
+ */
+ private Image image;
+
+ /**
+ * Holds value of property imageScale.
+ */
+ private float imageScale;
+
+ /**
+ *
+ */
+ private static class RangeStream extends InputStream {
+ private byte b[] = new byte[1];
+ private RandomAccessFile raf;
+ private byte bout[];
+ private int range[];
+ private int rangePosition = 0;
+
+ private RangeStream(RandomAccessFile raf, byte bout[], int range[]) {
+ this.raf = raf;
+ this.bout = bout;
+ this.range = range;
+ }
+
+ /**
+ * @see java.io.InputStream#read()
+ */
+ public int read() throws IOException {
+ int n = read(b);
+ if (n != 1)
+ return -1;
+ return b[0] & 0xff;
+ }
+
+ /**
+ * @see java.io.InputStream#read(byte[], int, int)
+ */
+ public int read(byte[] b, int off, int len) throws IOException {
+ if (b == null) {
+ throw new NullPointerException();
+ } else if ((off < 0) || (off > b.length) || (len < 0) ||
+ ((off + len) > b.length) || ((off + len) < 0)) {
+ throw new IndexOutOfBoundsException();
+ } else if (len == 0) {
+ return 0;
+ }
+ if (rangePosition >= range[range.length - 2] + range[range.length - 1]) {
+ return -1;
+ }
+ for (int k = 0; k < range.length; k += 2) {
+ int start = range[k];
+ int end = start + range[k + 1];
+ if (rangePosition < start)
+ rangePosition = start;
+ if (rangePosition >= start && rangePosition < end) {
+ int lenf = Math.min(len, end - rangePosition);
+ if (raf == null)
+ System.arraycopy(bout, rangePosition, b, off, lenf);
+ else {
+ raf.seek(rangePosition);
+ raf.readFully(b, off, lenf);
+ }
+ rangePosition += lenf;
+ return lenf;
+ }
+ }
+ return -1;
+ }
+ }
+
+ /**
+ * An interface to retrieve the signature dictionary for modification.
+ */
+ public interface SignatureEvent {
+ /**
+ * Allows modification of the signature dictionary.
+ * @param sig the signature dictionary
+ */
+ public void getSignatureDictionary(PdfDictionary sig);
+ }
+
+ /**
+ * Holds value of property certified.
+ */
+ private boolean certified;
+
+ /**
+ * Gets the certified status of this document.
+ * @return the certified status
+ */
+ public boolean isCertified() {
+ return this.certified;
+ }
+
+ /**
+ * Sets the document type to certified instead of simply signed. The certified document doesn't allow any changes.
+ * @param certified <code>true</code> to certify the document, <code>false</code> to just apply a simple signature
+ */
+ public void setCertified(boolean certified) {
+ this.certified = certified;
+ }
+}
diff --git a/src/main/java/com/lowagie/text/pdf/PdfSpotColor.java b/src/main/java/com/lowagie/text/pdf/PdfSpotColor.java
new file mode 100644
index 0000000..4bb2de6
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/PdfSpotColor.java
@@ -0,0 +1,132 @@
+/*
+ * $Id: PdfSpotColor.java,v 1.46 2005/06/08 11:09:28 psoares33 Exp $
+ * $Name: $
+ *
+ * Copyright 2001, 2002 Paulo Soares
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf;
+
+import java.awt.Color;
+import java.io.IOException;
+/**
+ * A <CODE>PdfSpotColor</CODE> defines a ColorSpace
+ *
+ * @see PdfDictionary
+ */
+
+public class PdfSpotColor{
+
+/* The tint value */
+ protected float tint;
+
+/** The color name */
+ public PdfName name;
+
+/** The alternative color space */
+ public Color altcs;
+ // constructors
+
+ /**
+ * Constructs a new <CODE>PdfSpotColor</CODE>.
+ *
+ * @param name a String value
+ * @param tint a tint value between 0 and 1
+ * @param altcs a altnative colorspace value
+ */
+
+ public PdfSpotColor(String name, float tint, Color altcs) {
+ this.name = new PdfName(name);
+ this.tint = tint;
+ this.altcs = altcs;
+ }
+
+ /**
+ * Gets the tint of the SpotColor.
+ * @return a float
+ */
+ public float getTint() {
+ return tint;
+ }
+
+ /**
+ * Gets the alternative ColorSpace.
+ * @return a Colot
+ */
+ public Color getAlternativeCS() {
+ return altcs;
+ }
+
+ protected PdfObject getSpotObject(PdfWriter writer) throws IOException {
+ PdfArray array = new PdfArray(PdfName.SEPARATION);
+ array.add(name);
+ PdfFunction func = null;
+ if (altcs instanceof ExtendedColor) {
+ int type = ((ExtendedColor)altcs).type;
+ switch (type) {
+ case ExtendedColor.TYPE_GRAY:
+ array.add(PdfName.DEVICEGRAY);
+ func = PdfFunction.type2(writer, new float[]{0, 1}, null, new float[]{0}, new float[]{((GrayColor)altcs).getGray()}, 1);
+ break;
+ case ExtendedColor.TYPE_CMYK:
+ array.add(PdfName.DEVICECMYK);
+ CMYKColor cmyk = (CMYKColor)altcs;
+ func = PdfFunction.type2(writer, new float[]{0, 1}, null, new float[]{0, 0, 0, 0},
+ new float[]{cmyk.getCyan(), cmyk.getMagenta(), cmyk.getYellow(), cmyk.getBlack()}, 1);
+ break;
+ default:
+ throw new RuntimeException("Only RGB, Gray and CMYK are supported as alternative color spaces.");
+ }
+ }
+ else {
+ array.add(PdfName.DEVICERGB);
+ func = PdfFunction.type2(writer, new float[]{0, 1}, null, new float[]{1, 1, 1},
+ new float[]{(float)altcs.getRed() / 255, (float)altcs.getGreen() / 255, (float)altcs.getBlue() / 255}, 1);
+ }
+ array.add(func.getReference());
+ return array;
+ }
+}
diff --git a/src/main/java/com/lowagie/text/pdf/PdfStamper.java b/src/main/java/com/lowagie/text/pdf/PdfStamper.java
new file mode 100644
index 0000000..f0d6eea
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/PdfStamper.java
@@ -0,0 +1,667 @@
+/*
+ * Copyright 2003, 2004 by Paulo Soares.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+package com.lowagie.text.pdf;
+
+import java.security.SignatureException;
+import java.io.OutputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.EOFException;
+import java.io.RandomAccessFile;
+import java.io.File;
+import java.io.InputStream;
+import com.lowagie.text.DocumentException;
+import com.lowagie.text.ExceptionConverter;
+import com.lowagie.text.DocWriter;
+import com.lowagie.text.Rectangle;
+import com.lowagie.text.Image;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Iterator;
+
+/** Applies extra content to the pages of a PDF document.
+ * This extra content can be all the objects allowed in PdfContentByte
+ * including pages from other Pdfs. The original PDF will keep
+ * all the interactive elements including bookmarks, links and form fields.
+ * <p>
+ * It is also possible to change the field values and to
+ * flatten them. New fields can be added but not flattened.
+ * @author Paulo Soares (psoares@consiste.pt)
+ */
+public class PdfStamper {
+ /**
+ * The writer
+ */
+ protected PdfStamperImp stamper;
+ private HashMap moreInfo;
+ private boolean hasSignature;
+ private PdfSignatureAppearance sigApp;
+
+ /** Starts the process of adding extra content to an existing PDF
+ * document.
+ * @param reader the original document. It cannot be reused
+ * @param os the output stream
+ * @throws DocumentException on error
+ * @throws IOException on error
+ */
+ public PdfStamper(PdfReader reader, OutputStream os) throws DocumentException, IOException {
+ stamper = new PdfStamperImp(reader, os, '\0', false);
+ }
+
+ /**
+ * Starts the process of adding extra content to an existing PDF
+ * document.
+ * @param reader the original document. It cannot be reused
+ * @param os the output stream
+ * @param pdfVersion the new pdf version or '\0' to keep the same version as the original
+ * document
+ * @throws DocumentException on error
+ * @throws IOException on error
+ */
+ public PdfStamper(PdfReader reader, OutputStream os, char pdfVersion) throws DocumentException, IOException {
+ stamper = new PdfStamperImp(reader, os, pdfVersion, false);
+ }
+
+ /**
+ * Starts the process of adding extra content to an existing PDF
+ * document, possibly as a new revision.
+ * @param reader the original document. It cannot be reused
+ * @param os the output stream
+ * @param pdfVersion the new pdf version or '\0' to keep the same version as the original
+ * document
+ * @param append if <CODE>true</CODE> appends the document changes as a new revision. This is
+ * only useful for multiple signatures as nothing is gained in speed or memory
+ * @throws DocumentException on error
+ * @throws IOException on error
+ */
+ public PdfStamper(PdfReader reader, OutputStream os, char pdfVersion, boolean append) throws DocumentException, IOException {
+ stamper = new PdfStamperImp(reader, os, pdfVersion, append);
+ }
+
+ /** Gets the optional <CODE>String</CODE> map to add or change values in
+ * the info dictionary.
+ * @return the map or <CODE>null</CODE>
+ *
+ */
+ public HashMap getMoreInfo() {
+ return this.moreInfo;
+ }
+
+ /** An optional <CODE>String</CODE> map to add or change values in
+ * the info dictionary. Entries with <CODE>null</CODE>
+ * values delete the key in the original info dictionary
+ * @param moreInfo additional entries to the info dictionary
+ *
+ */
+ public void setMoreInfo(HashMap moreInfo) {
+ this.moreInfo = moreInfo;
+ }
+
+ /**
+ * Inserts a blank page. All the pages above and including <CODE>pageNumber</CODE> will
+ * be shifted up. If <CODE>pageNumber</CODE> is bigger than the total number of pages
+ * the new page will be the last one.
+ * @param pageNumber the page number position where the new page will be inserted
+ * @param mediabox the size of the new page
+ */
+ public void insertPage(int pageNumber, Rectangle mediabox) {
+ stamper.insertPage(pageNumber, mediabox);
+ }
+
+ /**
+ * Gets the signing instance. The appearances and other parameters can the be set.
+ * @return the signing instance
+ */
+ public PdfSignatureAppearance getSignatureAppearance() {
+ return sigApp;
+ }
+
+ private String getNewSigName() {
+ AcroFields af = getAcroFields();
+ String name = "Signature";
+ int step = 0;
+ boolean found = false;
+ while (!found) {
+ ++step;
+ String n1 = name + step;
+ if (af.getFieldItem(n1) != null)
+ continue;
+ n1 += ".";
+ found = true;
+ for (Iterator it = af.getFields().keySet().iterator(); it.hasNext();) {
+ String fn = (String)it.next();
+ if (fn.startsWith(n1)) {
+ found = false;
+ break;
+ }
+ }
+ }
+ name += step;
+ return name;
+ }
+ /**
+ * Closes the document. No more content can be written after the
+ * document is closed.
+ * <p>
+ * If closing a signed document with an external signature the closing must be done
+ * in the <CODE>PdfSignatureAppearance</CODE> instance.
+ * @throws DocumentException on error
+ * @throws IOException on error
+ */
+ public void close() throws DocumentException, IOException {
+ if (!hasSignature) {
+ stamper.close(moreInfo);
+ return;
+ }
+ sigApp.preClose();
+ PdfSigGenericPKCS sig = sigApp.getSigStandard();
+ PdfLiteral lit = (PdfLiteral)sig.get(PdfName.CONTENTS);
+ int totalBuf = (lit.getPosLength() - 2) / 2;
+ byte buf[] = new byte[8192];
+ int n;
+ InputStream inp = sigApp.getRangeStream();
+ try {
+ while ((n = inp.read(buf)) > 0) {
+ sig.getSigner().update(buf, 0, n);
+ }
+ }
+ catch (SignatureException se) {
+ throw new ExceptionConverter(se);
+ }
+ buf = new byte[totalBuf];
+ byte[] bsig = sig.getSignerContents();
+ System.arraycopy(bsig, 0, buf, 0, bsig.length);
+ PdfString str = new PdfString(buf);
+ str.setHexWriting(true);
+ PdfDictionary dic = new PdfDictionary();
+ dic.put(PdfName.CONTENTS, str);
+ sigApp.close(dic);
+ stamper.reader.close();
+ }
+
+ private static int indexArray(byte bout[], int position, String search) {
+ byte ss[] = PdfEncodings.convertToBytes(search, null);
+ while (true) {
+ int k;
+ for (k = 0; k < ss.length; ++k) {
+ if (ss[k] != bout[position + k])
+ break;
+ }
+ if (k == ss.length)
+ return position;
+ ++position;
+ }
+ }
+
+ private static int indexFile(RandomAccessFile raf, int position, String search) throws IOException {
+ byte ss[] = PdfEncodings.convertToBytes(search, null);
+ while (true) {
+ raf.seek(position);
+ int k;
+ for (k = 0; k < ss.length; ++k) {
+ int b = raf.read();
+ if (b < 0)
+ throw new EOFException("Unexpected EOF");
+ if (ss[k] != (byte)b)
+ break;
+ }
+ if (k == ss.length)
+ return position;
+ ++position;
+ }
+ }
+
+ /** Gets a <CODE>PdfContentByte</CODE> to write under the page of
+ * the original document.
+ * @param pageNum the page number where the extra content is written
+ * @return a <CODE>PdfContentByte</CODE> to write under the page of
+ * the original document
+ */
+ public PdfContentByte getUnderContent(int pageNum) {
+ return stamper.getUnderContent(pageNum);
+ }
+
+ /** Gets a <CODE>PdfContentByte</CODE> to write over the page of
+ * the original document.
+ * @param pageNum the page number where the extra content is written
+ * @return a <CODE>PdfContentByte</CODE> to write over the page of
+ * the original document
+ */
+ public PdfContentByte getOverContent(int pageNum) {
+ return stamper.getOverContent(pageNum);
+ }
+
+ /** Checks if the content is automatically adjusted to compensate
+ * the original page rotation.
+ * @return the auto-rotation status
+ */
+ public boolean isRotateContents() {
+ return stamper.isRotateContents();
+ }
+
+ /** Flags the content to be automatically adjusted to compensate
+ * the original page rotation. The default is <CODE>true</CODE>.
+ * @param rotateContents <CODE>true</CODE> to set auto-rotation, <CODE>false</CODE>
+ * otherwise
+ */
+ public void setRotateContents(boolean rotateContents) {
+ stamper.setRotateContents(rotateContents);
+ }
+
+ /** Sets the encryption options for this document. The userPassword and the
+ * ownerPassword can be null or have zero length. In this case the ownerPassword
+ * is replaced by a random string. The open permissions for the document can be
+ * AllowPrinting, AllowModifyContents, AllowCopy, AllowModifyAnnotations,
+ * AllowFillIn, AllowScreenReaders, AllowAssembly and AllowDegradedPrinting.
+ * The permissions can be combined by ORing them.
+ * @param userPassword the user password. Can be null or empty
+ * @param ownerPassword the owner password. Can be null or empty
+ * @param permissions the user permissions
+ * @param strength128Bits <code>true</code> for 128 bit key length, <code>false</code> for 40 bit key length
+ * @throws DocumentException if anything was already written to the output
+ */
+ public void setEncryption(byte userPassword[], byte ownerPassword[], int permissions, boolean strength128Bits) throws DocumentException {
+ if (stamper.isAppend())
+ throw new DocumentException("Append mode does not support changing the encryption status.");
+ if (stamper.isContentWritten())
+ throw new DocumentException("Content was already written to the output.");
+ stamper.setEncryption(userPassword, ownerPassword, permissions, strength128Bits);
+ }
+
+ /**
+ * Sets the encryption options for this document. The userPassword and the
+ * ownerPassword can be null or have zero length. In this case the ownerPassword
+ * is replaced by a random string. The open permissions for the document can be
+ * AllowPrinting, AllowModifyContents, AllowCopy, AllowModifyAnnotations,
+ * AllowFillIn, AllowScreenReaders, AllowAssembly and AllowDegradedPrinting.
+ * The permissions can be combined by ORing them.
+ * @param strength <code>true</code> for 128 bit key length, <code>false</code> for 40 bit key length
+ * @param userPassword the user password. Can be null or empty
+ * @param ownerPassword the owner password. Can be null or empty
+ * @param permissions the user permissions
+ * @throws DocumentException if anything was already written to the output
+ */
+ public void setEncryption(boolean strength, String userPassword, String ownerPassword, int permissions) throws DocumentException {
+ setEncryption(DocWriter.getISOBytes(userPassword), DocWriter.getISOBytes(ownerPassword), permissions, strength);
+ }
+
+ /** Gets a page from other PDF document. Note that calling this method more than
+ * once with the same parameters will retrieve the same object.
+ * @param reader the PDF document where the page is
+ * @param pageNumber the page number. The first page is 1
+ * @return the template representing the imported page
+ */
+ public PdfImportedPage getImportedPage(PdfReader reader, int pageNumber) {
+ return stamper.getImportedPage(reader, pageNumber);
+ }
+
+ /** Gets the underlying PdfWriter.
+ * @return the underlying PdfWriter
+ */
+ public PdfWriter getWriter() {
+ return stamper;
+ }
+
+ /** Gets the underlying PdfReader.
+ * @return the underlying PdfReader
+ */
+ public PdfReader getReader() {
+ return stamper.reader;
+ }
+
+ /** Gets the <CODE>AcroFields</CODE> object that allows to get and set field values
+ * and to merge FDF forms.
+ * @return the <CODE>AcroFields</CODE> object
+ */
+ public AcroFields getAcroFields() {
+ return stamper.getAcroFields();
+ }
+
+ /** Determines if the fields are flattened on close. The fields added with
+ * {@link #addAnnotation(PdfAnnotation,int)} will never be flattened.
+ * @param flat <CODE>true</CODE> to flatten the fields, <CODE>false</CODE>
+ * to keep the fields
+ */
+ public void setFormFlattening(boolean flat) {
+ stamper.setFormFlattening(flat);
+ }
+
+ /** Determines if the FreeText annotations are flattened on close.
+ * @param flat <CODE>true</CODE> to flatten the FreeText annotations, <CODE>false</CODE>
+ * (the default) to keep the FreeText annotations as active content.
+ */
+ public void setFreeTextFlattening(boolean flat) {
+ stamper.setFreeTextFlattening(flat);
+ }
+
+ /**
+ * Adds an annotation of form field in a specific page. This page number
+ * can be overridden with {@link PdfAnnotation#setPlaceInPage(int)}.
+ * @param annot the annotation
+ * @param page the page
+ */
+ public void addAnnotation(PdfAnnotation annot, int page) {
+ stamper.addAnnotation(annot, page);
+ }
+
+ /**
+ * Adds the comments present in an FDF file.
+ * @param fdf the FDF file
+ * @throws IOException on error
+ */
+ public void addComments(FdfReader fdf) throws IOException {
+ stamper.addComments(fdf);
+ }
+
+ /**
+ * Sets the bookmarks. The list structure is defined in
+ * {@link SimpleBookmark}.
+ * @param outlines the bookmarks or <CODE>null</CODE> to remove any
+ * @throws IOException on error
+ */
+ public void setOutlines(List outlines) throws IOException {
+ stamper.setOutlines(outlines);
+ }
+
+ /**
+ * Sets the thumbnail image for a page.
+ * @param image the image
+ * @param page the page
+ * @throws PdfException on error
+ * @throws DocumentException on error
+ */
+ public void setThumbnail(Image image, int page) throws PdfException, DocumentException {
+ stamper.setThumbnail(image, page);
+ }
+
+ /**
+ * Adds <CODE>name</CODE> to the list of fields that will be flattened on close,
+ * all the other fields will remain. If this method is never called or is called
+ * with invalid field names, all the fields will be flattened.
+ * <p>
+ * Calling <CODE>setFormFlattening(true)</CODE> is needed to have any kind of
+ * flattening.
+ * @param name the field name
+ * @return <CODE>true</CODE> if the field exists, <CODE>false</CODE> otherwise
+ */
+ public boolean partialFormFlattening(String name) {
+ return stamper.partialFormFlattening(name);
+ }
+
+ /** Adds a JavaScript action at the document level. When the document
+ * opens all this JavaScript runs. The existing JavaScript will be replaced.
+ * @param js the JavaScript code
+ */
+ public void addJavaScript(String js) {
+ stamper.addJavaScript(js, !PdfEncodings.isPdfDocEncoding(js));
+ }
+
+ /** Adds a file attachment at the document level. Existing attachments will be kept.
+ * @param description the file description
+ * @param fileStore an array with the file. If it's <CODE>null</CODE>
+ * the file will be read from the disk
+ * @param file the path to the file. It will only be used if
+ * <CODE>fileStore</CODE> is not <CODE>null</CODE>
+ * @param fileDisplay the actual file name stored in the pdf
+ * @throws IOException on error
+ */
+ public void addFileAttachment(String description, byte fileStore[], String file, String fileDisplay) throws IOException {
+ addFileAttachment(description, PdfFileSpecification.fileEmbedded(stamper, file, fileDisplay, fileStore));
+ }
+
+ /** Adds a file attachment at the document level. Existing attachments will be kept.
+ * @param description the file description
+ * @param fs the file specification
+ */
+ public void addFileAttachment(String description, PdfFileSpecification fs) throws IOException {
+ stamper.addFileAttachment(description, fs);
+ }
+
+ /**
+ * Sets the viewer preferences.
+ * @param preferences the viewer preferences
+ * @see PdfWriter#setViewerPreferences(int)
+ */
+ public void setViewerPreferences(int preferences) {
+ stamper.setViewerPreferences(preferences);
+ }
+
+ /**
+ * Sets the XMP metadata.
+ * @param xmp
+ * @see PdfWriter#setXmpMetadata(byte[])
+ */
+ public void setXmpMetadata(byte[] xmp) {
+ stamper.setXmpMetadata(xmp);
+ }
+
+ /**
+ * Gets the 1.5 compression status.
+ * @return <code>true</code> if the 1.5 compression is on
+ */
+ public boolean isFullCompression() {
+ return stamper.isFullCompression();
+ }
+
+ /**
+ * Sets the document's compression to the new 1.5 mode with object streams and xref
+ * streams. It can be set at any time but once set it can't be unset.
+ */
+ public void setFullCompression() {
+ if (stamper.isAppend())
+ return;
+ stamper.setFullCompression();
+ }
+
+ /**
+ * Sets the open and close page additional action.
+ * @param actionType the action type. It can be <CODE>PdfWriter.PAGE_OPEN</CODE>
+ * or <CODE>PdfWriter.PAGE_CLOSE</CODE>
+ * @param action the action to perform
+ * @param page the page where the action will be applied. The first page is 1
+ * @throws PdfException if the action type is invalid
+ */
+ public void setPageAction(PdfName actionType, PdfAction action, int page) throws PdfException {
+ stamper.setPageAction(actionType, action, page);
+ }
+
+ /**
+ * Sets the display duration for the page (for presentations)
+ * @param seconds the number of seconds to display the page. A negative value removes the entry
+ * @param page the page where the duration will be applied. The first page is 1
+ */
+ public void setDuration(int seconds, int page) {
+ stamper.setDuration(seconds, page);
+ }
+
+ /**
+ * Sets the transition for the page
+ * @param transition the transition object. A <code>null</code> removes the transition
+ * @param page the page where the transition will be applied. The first page is 1
+ */
+ public void setTransition(PdfTransition transition, int page) {
+ stamper.setTransition(transition, page);
+ }
+
+ /**
+ * Applies a digital signature to a document, possibly as a new revision, making
+ * possible multiple signatures. The returned PdfStamper
+ * can be used normally as the signature is only applied when closing.
+ * <p>
+ * A possible use for adding a signature without invalidating an existing one is:
+ * <p>
+ * <pre>
+ * KeyStore ks = KeyStore.getInstance("pkcs12");
+ * ks.load(new FileInputStream("my_private_key.pfx"), "my_password".toCharArray());
+ * String alias = (String)ks.aliases().nextElement();
+ * PrivateKey key = (PrivateKey)ks.getKey(alias, "my_password".toCharArray());
+ * Certificate[] chain = ks.getCertificateChain(alias);
+ * PdfReader reader = new PdfReader("original.pdf");
+ * FileOutputStream fout = new FileOutputStream("signed.pdf");
+ * PdfStamper stp = PdfStamper.createSignature(reader, fout, '\0', new
+ * File("/temp"), true);
+ * PdfSignatureAppearance sap = stp.getSignatureAppearance();
+ * sap.setCrypto(key, chain, null, PdfSignatureAppearance.WINCER_SIGNED);
+ * sap.setReason("I'm the author");
+ * sap.setLocation("Lisbon");
+ * // comment next line to have an invisible signature
+ * sap.setVisibleSignature(new Rectangle(100, 100, 200, 200), 1, null);
+ * stp.close();
+ * </pre>
+ * @param reader the original document
+ * @param os the output stream or <CODE>null</CODE> to keep the document in the temporary file
+ * @param pdfVersion the new pdf version or '\0' to keep the same version as the original
+ * document
+ * @param tempFile location of the temporary file. If it's a directory a temporary file will be created there.
+ * If it's a file it will be used directly. The file will be deleted on exit unless <CODE>os</CODE> is null.
+ * In that case the document can be retrieved directly from the temporary file. If it's <CODE>null</CODE>
+ * no temporary file will be created and memory will be used
+ * @param append if <CODE>true</CODE> the signature and all the other content will be added as a
+ * new revision thus not invalidating existing signatures
+ * @return a <CODE>PdfStamper</CODE>
+ * @throws DocumentException on error
+ * @throws IOException on error
+ */
+ public static PdfStamper createSignature(PdfReader reader, OutputStream os, char pdfVersion, File tempFile, boolean append) throws DocumentException, IOException {
+ PdfStamper stp;
+ if (tempFile == null) {
+ ByteBuffer bout = new ByteBuffer();
+ stp = new PdfStamper(reader, bout, pdfVersion, append);
+ stp.sigApp = new PdfSignatureAppearance(stp.stamper);
+ stp.sigApp.setSigout(bout);
+ }
+ else {
+ if (tempFile.isDirectory())
+ tempFile = File.createTempFile("pdf", null, tempFile);
+ FileOutputStream fout = new FileOutputStream(tempFile);
+ stp = new PdfStamper(reader, fout, pdfVersion, append);
+ stp.sigApp = new PdfSignatureAppearance(stp.stamper);
+ stp.sigApp.setTempFile(tempFile);
+ }
+ stp.sigApp.setOriginalout(os);
+ stp.sigApp.setStamper(stp);
+ stp.hasSignature = true;
+ return stp;
+ }
+
+ /**
+ * Applies a digital signature to a document. The returned PdfStamper
+ * can be used normally as the signature is only applied when closing.
+ * <p>
+ * Note that the pdf is created in memory.
+ * <p>
+ * A possible use is:
+ * <p>
+ * <pre>
+ * KeyStore ks = KeyStore.getInstance("pkcs12");
+ * ks.load(new FileInputStream("my_private_key.pfx"), "my_password".toCharArray());
+ * String alias = (String)ks.aliases().nextElement();
+ * PrivateKey key = (PrivateKey)ks.getKey(alias, "my_password".toCharArray());
+ * Certificate[] chain = ks.getCertificateChain(alias);
+ * PdfReader reader = new PdfReader("original.pdf");
+ * FileOutputStream fout = new FileOutputStream("signed.pdf");
+ * PdfStamper stp = PdfStamper.createSignature(reader, fout, '\0');
+ * PdfSignatureAppearance sap = stp.getSignatureAppearance();
+ * sap.setCrypto(key, chain, null, PdfSignatureAppearance.WINCER_SIGNED);
+ * sap.setReason("I'm the author");
+ * sap.setLocation("Lisbon");
+ * // comment next line to have an invisible signature
+ * sap.setVisibleSignature(new Rectangle(100, 100, 200, 200), 1, null);
+ * stp.close();
+ * </pre>
+ * @param reader the original document
+ * @param os the output stream
+ * @param pdfVersion the new pdf version or '\0' to keep the same version as the original
+ * document
+ * @throws DocumentException on error
+ * @throws IOException on error
+ * @return a <CODE>PdfStamper</CODE>
+ */
+ public static PdfStamper createSignature(PdfReader reader, OutputStream os, char pdfVersion) throws DocumentException, IOException {
+ return createSignature(reader, os, pdfVersion, null, false);
+ }
+
+ /**
+ * Applies a digital signature to a document. The returned PdfStamper
+ * can be used normally as the signature is only applied when closing.
+ * <p>
+ * A possible use is:
+ * <p>
+ * <pre>
+ * KeyStore ks = KeyStore.getInstance("pkcs12");
+ * ks.load(new FileInputStream("my_private_key.pfx"), "my_password".toCharArray());
+ * String alias = (String)ks.aliases().nextElement();
+ * PrivateKey key = (PrivateKey)ks.getKey(alias, "my_password".toCharArray());
+ * Certificate[] chain = ks.getCertificateChain(alias);
+ * PdfReader reader = new PdfReader("original.pdf");
+ * FileOutputStream fout = new FileOutputStream("signed.pdf");
+ * PdfStamper stp = PdfStamper.createSignature(reader, fout, '\0', new File("/temp"));
+ * PdfSignatureAppearance sap = stp.getSignatureAppearance();
+ * sap.setCrypto(key, chain, null, PdfSignatureAppearance.WINCER_SIGNED);
+ * sap.setReason("I'm the author");
+ * sap.setLocation("Lisbon");
+ * // comment next line to have an invisible signature
+ * sap.setVisibleSignature(new Rectangle(100, 100, 200, 200), 1, null);
+ * stp.close();
+ * </pre>
+ * @param reader the original document
+ * @param os the output stream or <CODE>null</CODE> to keep the document in the temporary file
+ * @param pdfVersion the new pdf version or '\0' to keep the same version as the original
+ * document
+ * @param tempFile location of the temporary file. If it's a directory a temporary file will be created there.
+ * If it's a file it will be used directly. The file will be deleted on exit unless <CODE>os</CODE> is null.
+ * In that case the document can be retrieved directly from the temporary file. If it's <CODE>null</CODE>
+ * no temporary file will be created and memory will be used
+ * @return a <CODE>PdfStamper</CODE>
+ * @throws DocumentException on error
+ * @throws IOException on error
+ */
+ public static PdfStamper createSignature(PdfReader reader, OutputStream os, char pdfVersion, File tempFile) throws DocumentException, IOException
+ {
+ return createSignature(reader, os, pdfVersion, tempFile, false);
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/pdf/PdfStamperImp.java b/src/main/java/com/lowagie/text/pdf/PdfStamperImp.java
new file mode 100644
index 0000000..7a36cf6
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/PdfStamperImp.java
@@ -0,0 +1,1461 @@
+/*
+ * Copyright 2003 by Paulo Soares.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+package com.lowagie.text.pdf;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+
+import com.lowagie.text.DocumentException;
+import com.lowagie.text.Rectangle;
+import com.lowagie.text.Image;
+import com.lowagie.text.ExceptionConverter;
+
+// wprinz: had to change this to public, as we want to explicitely mark something as USED.
+public class PdfStamperImp extends PdfWriter {
+ HashMap readers2intrefs = new HashMap();
+ HashMap readers2file = new HashMap();
+ RandomAccessFileOrArray file;
+ PdfReader reader;
+ IntHashtable myXref = new IntHashtable();
+ /** Integer(page number) -> PageStamp */
+ HashMap pagesToContent = new HashMap();
+ boolean closed = false;
+ /** Holds value of property rotateContents. */
+ private boolean rotateContents = true;
+ protected AcroFields acroFields;
+ protected boolean flat = false;
+ protected boolean flatFreeText = false;
+ protected int namePtr[] = {0};
+ protected boolean namedAsNames;
+ protected List newBookmarks;
+ protected HashSet partialFlattening = new HashSet();
+ protected boolean useVp = false;
+ protected int vp = 0;
+ protected HashMap fieldTemplates = new HashMap();
+ protected boolean fieldsAdded = false;
+ protected int sigFlags = 0;
+ protected boolean append;
+ protected IntHashtable marked;
+ protected int initialXrefSize;
+ protected PdfAction openAction;
+
+ // egiz code:
+ protected PdfName egiz_dict_name = null;
+ protected PdfIndirectReference egiz_dict_ir = null;
+ /**
+ * Sets the key and the contents of the entry to be added to the trailer if an egiz dict is present.
+ * @param name The name of the egiz dict in the trailer.
+ * @param ir The indirect reference of the egiz dict.
+ */
+ public void setEgizDictTrailerInfo(PdfName name, PdfIndirectReference ir)
+ {
+ this.egiz_dict_name = name;
+ this.egiz_dict_ir = ir;
+ }
+ // end egiz code;
+
+
+ /** Creates new PdfStamperImp.
+ * @param reader the read PDF
+ * @param os the output destination
+ * @param pdfVersion the new pdf version or '\0' to keep the same version as the original
+ * document
+ * @param append
+ * @throws DocumentException on error
+ * @throws IOException
+ */
+ PdfStamperImp(PdfReader reader, OutputStream os, char pdfVersion, boolean append) throws DocumentException, IOException {
+ super(new PdfDocument(), os);
+ if (reader.isTampered())
+ throw new DocumentException("The original document was reused. Read it again from file.");
+ reader.setTampered(true);
+ this.reader = reader;
+ file = reader.getSafeFile();
+ this.append = append;
+ if (append) {
+ if (reader.isRebuilt())
+ throw new DocumentException("Append mode requires a document without errors even if recovery was possible.");
+ if (reader.isEncrypted())
+ crypto = new PdfEncryption(reader.getDecrypt());
+ HEADER = getISOBytes("\n");
+ file.reOpen();
+ byte buf[] = new byte[8192];
+ int n;
+ while ((n = file.read(buf)) > 0)
+ this.os.write(buf, 0, n);
+ file.close();
+ prevxref = reader.getLastXref();
+ reader.setAppendable(true);
+ }
+ else {
+ if (pdfVersion == 0)
+ super.setPdfVersion(reader.getPdfVersion());
+ else
+ super.setPdfVersion(pdfVersion);
+ }
+ super.open();
+ pdf.addWriter(this);
+ if (append) {
+ body.setRefnum(reader.getXrefSize());
+ marked = new IntHashtable();
+ if (reader.isNewXrefType())
+ fullCompression = true;
+ if (reader.isHybridXref())
+ fullCompression = false;
+ }
+ initialXrefSize = reader.getXrefSize();
+ }
+
+ void close(HashMap moreInfo) throws DocumentException, IOException {
+ if (closed)
+ return;
+ if (useVp) {
+ reader.setViewerPreferences(vp);
+ markUsed(reader.getTrailer().get(PdfName.ROOT));
+ }
+ if (flat)
+ flatFields();
+ if (flatFreeText)
+ flatFreeTextFields();
+ addFieldResources();
+ if (sigFlags != 0) {
+ PdfDictionary acroForm = (PdfDictionary)PdfReader.getPdfObject(reader.getCatalog().get(PdfName.ACROFORM), reader.getCatalog());
+ if (acroForm != null) {
+ acroForm.put(PdfName.SIGFLAGS, new PdfNumber(sigFlags));
+ markUsed(acroForm);
+ }
+ }
+ closed = true;
+ addSharedObjectsToBody();
+ setOutlines();
+ setJavaScript();
+ addFileAttachments();
+ if (openAction != null) {
+ reader.getCatalog().put(PdfName.OPENACTION, openAction);
+ }
+ // if there is XMP data to add: add it
+ if (xmpMetadata != null) {
+ PdfDictionary catalog = reader.getCatalog();
+ PdfStream xmp = new PdfStream(xmpMetadata);
+ xmp.put(PdfName.TYPE, PdfName.METADATA);
+ xmp.put(PdfName.SUBTYPE, PdfName.XML);
+ catalog.put(PdfName.METADATA, body.add(xmp).getIndirectReference());
+ markUsed(catalog);
+ }
+ PRIndirectReference iInfo = null;
+ try {
+ file.reOpen();
+ alterContents();
+ iInfo = (PRIndirectReference)reader.trailer.get(PdfName.INFO);
+ int skip = -1;
+ if (iInfo != null)
+ skip = iInfo.getNumber();
+ int rootN = ((PRIndirectReference)reader.trailer.get(PdfName.ROOT)).getNumber();
+ if (append) {
+ int keys[] = marked.getKeys();
+ for (int k = 0; k < keys.length; ++k) {
+ int j = keys[k];
+ PdfObject obj = reader.getPdfObjectRelease(j);
+ if (obj != null && skip != j && j < initialXrefSize) {
+ addToBody(obj, j, j != rootN);
+ }
+ }
+ for (int k = initialXrefSize; k < reader.getXrefSize(); ++k) {
+ PdfObject obj = reader.getPdfObject(k);
+ if (obj != null) {
+ addToBody(obj, getNewObjectNumber(reader, k, 0));
+ }
+ }
+ }
+ else {
+ for (int k = 1; k < reader.getXrefSize(); ++k) {
+ PdfObject obj = reader.getPdfObjectRelease(k);
+ if (obj != null && skip != k) {
+ addToBody(obj, getNewObjectNumber(reader, k, 0), k != rootN);
+ }
+ }
+ }
+ }
+ finally {
+ try {
+ file.close();
+ }
+ catch (Exception e) {
+ // empty on purpose
+ }
+ }
+ PdfIndirectReference encryption = null;
+ PdfObject fileID = null;
+ if (crypto != null) {
+ if (append) {
+ encryption = reader.getCryptoRef();
+ }
+ else {
+ PdfIndirectObject encryptionObject = addToBody(crypto.getEncryptionDictionary(), false);
+ encryption = encryptionObject.getIndirectReference();
+ }
+ fileID = crypto.getFileID();
+ }
+ PRIndirectReference iRoot = (PRIndirectReference)reader.trailer.get(PdfName.ROOT);
+ PdfIndirectReference root = new PdfIndirectReference(0, getNewObjectNumber(reader, iRoot.getNumber(), 0));
+ PdfIndirectReference info = null;
+ PdfDictionary oldInfo = (PdfDictionary)PdfReader.getPdfObject(iInfo);
+ PdfDictionary newInfo = new PdfDictionary();
+ if (oldInfo != null) {
+ for (Iterator i = oldInfo.getKeys().iterator(); i.hasNext();) {
+ PdfName key = (PdfName)i.next();
+ PdfObject value = PdfReader.getPdfObject(oldInfo.get(key));
+ newInfo.put(key, value);
+ }
+ }
+ if (moreInfo != null) {
+ for (Iterator i = moreInfo.keySet().iterator(); i.hasNext();) {
+ String key = (String)i.next();
+ PdfName keyName = new PdfName(key);
+ String value = (String)moreInfo.get(key);
+ if (value == null)
+ newInfo.remove(keyName);
+ else
+ newInfo.put(keyName, new PdfString(value, PdfObject.TEXT_UNICODE));
+ }
+ }
+ if (append) {
+ if (iInfo == null)
+ info = addToBody(newInfo, false).getIndirectReference();
+ else
+ info = addToBody(newInfo, iInfo.getNumber(), false).getIndirectReference();
+ }
+ else {
+ if (!newInfo.getKeys().isEmpty())
+ info = addToBody(newInfo, false).getIndirectReference();
+ }
+ // write the cross-reference table of the body
+ body.writeCrossReferenceTable(os, root, info, encryption, fileID, prevxref);
+ if (fullCompression) {
+ os.write(getISOBytes("startxref\n"));
+ os.write(getISOBytes(String.valueOf(body.offset())));
+ os.write(getISOBytes("\n%%EOF\n"));
+ }
+ else {
+ PdfTrailer trailer = new PdfTrailer(body.size(),
+ body.offset(),
+ root,
+ info,
+ encryption,
+ fileID, prevxref);
+ // EGIZ code - add EGIZ dict to trailer)
+ if (this.egiz_dict_name != null)
+ {
+ trailer.put(this.egiz_dict_name, this.egiz_dict_ir);
+ }
+ // endo of egiz code.
+ trailer.toPdf(this, os);
+ }
+ os.flush();
+ if (isCloseStream())
+ os.close();
+ reader.close();
+ }
+
+ void applyRotation(PdfDictionary pageN, ByteBuffer out) {
+ if (!rotateContents)
+ return;
+ Rectangle page = reader.getPageSizeWithRotation(pageN);
+ int rotation = page.getRotation();
+ switch (rotation) {
+ case 90:
+ out.append(PdfContents.ROTATE90);
+ out.append(page.top());
+ out.append(' ').append('0').append(PdfContents.ROTATEFINAL);
+ break;
+ case 180:
+ out.append(PdfContents.ROTATE180);
+ out.append(page.right());
+ out.append(' ');
+ out.append(page.top());
+ out.append(PdfContents.ROTATEFINAL);
+ break;
+ case 270:
+ out.append(PdfContents.ROTATE270);
+ out.append('0').append(' ');
+ out.append(page.right());
+ out.append(PdfContents.ROTATEFINAL);
+ break;
+ }
+ }
+
+ void alterContents() throws IOException {
+ for (Iterator i = pagesToContent.values().iterator(); i.hasNext();) {
+ PageStamp ps = (PageStamp)i.next();
+ PdfDictionary pageN = ps.pageN;
+ markUsed(pageN);
+ PdfArray ar = null;
+ PdfObject content = PdfReader.getPdfObject(pageN.get(PdfName.CONTENTS), pageN);
+ if (content == null) {
+ ar = new PdfArray();
+ pageN.put(PdfName.CONTENTS, ar);
+ }
+ else if (content.isArray()) {
+ ar = (PdfArray)content;
+ markUsed(ar);
+ }
+ else if (content.isStream()) {
+ ar = new PdfArray();
+ ar.add(pageN.get(PdfName.CONTENTS));
+ pageN.put(PdfName.CONTENTS, ar);
+ }
+ else {
+ ar = new PdfArray();
+ pageN.put(PdfName.CONTENTS, ar);
+ }
+ ByteBuffer out = new ByteBuffer();
+ if (ps.under != null) {
+ out.append(PdfContents.SAVESTATE);
+ applyRotation(pageN, out);
+ out.append(ps.under.getInternalBuffer());
+ out.append(PdfContents.RESTORESTATE);
+ }
+ if (ps.over != null)
+ out.append(PdfContents.SAVESTATE);
+ PdfStream stream = new PdfStream(out.toByteArray());
+ try{stream.flateCompress();}catch(Exception e){throw new ExceptionConverter(e);}
+ ar.addFirst(addToBody(stream).getIndirectReference());
+ out.reset();
+ if (ps.over != null) {
+ out.append(' ');
+ out.append(PdfContents.RESTORESTATE);
+ out.append(PdfContents.SAVESTATE);
+ applyRotation(pageN, out);
+ out.append(ps.over.getInternalBuffer());
+ out.append(PdfContents.RESTORESTATE);
+ stream = new PdfStream(out.toByteArray());
+ try{stream.flateCompress();}catch(Exception e){throw new ExceptionConverter(e);}
+ ar.add(addToBody(stream).getIndirectReference());
+ }
+ alterResources(ps);
+ }
+ }
+
+ void alterResources(PageStamp ps) {
+ ps.pageN.put(PdfName.RESOURCES, ps.pageResources.getResources());
+ }
+
+ protected int getNewObjectNumber(PdfReader reader, int number, int generation) {
+ IntHashtable ref = (IntHashtable)readers2intrefs.get(reader);
+ if (ref != null) {
+ int n = ref.get(number);
+ if (n == 0) {
+ n = getIndirectReferenceNumber();
+ ref.put(number, n);
+ }
+ return n;
+ }
+ if (currentPdfReaderInstance == null) {
+ if (append && number < initialXrefSize)
+ return number;
+ int n = myXref.get(number);
+ if (n == 0) {
+ n = getIndirectReferenceNumber();
+ myXref.put(number, n);
+ }
+ return n;
+ }
+ else
+ return currentPdfReaderInstance.getNewObjectNumber(number, generation);
+ }
+
+ RandomAccessFileOrArray getReaderFile(PdfReader reader) {
+ if (readers2intrefs.containsKey(reader)) {
+ RandomAccessFileOrArray raf = (RandomAccessFileOrArray)readers2file.get(reader);
+ if (raf != null)
+ return raf;
+ return reader.getSafeFile();
+ }
+ if (currentPdfReaderInstance == null)
+ return file;
+ else
+ return currentPdfReaderInstance.getReaderFile();
+ }
+
+ /**
+ * @param reader
+ * @param openFile
+ * @throws IOException
+ */
+ public void registerReader(PdfReader reader, boolean openFile) throws IOException {
+ if (readers2intrefs.containsKey(reader))
+ return;
+ readers2intrefs.put(reader, new IntHashtable());
+ if (openFile) {
+ RandomAccessFileOrArray raf = reader.getSafeFile();
+ readers2file.put(reader, raf);
+ raf.reOpen();
+ }
+ }
+
+ /**
+ * @param reader
+ */
+ public void unRegisterReader(PdfReader reader) {
+ if (!readers2intrefs.containsKey(reader))
+ return;
+ readers2intrefs.remove(reader);
+ RandomAccessFileOrArray raf = (RandomAccessFileOrArray)readers2file.get(reader);
+ if (raf == null)
+ return;
+ readers2file.remove(reader);
+ try{raf.close();}catch(Exception e){}
+ }
+
+ static void findAllObjects(PdfReader reader, PdfObject obj, IntHashtable hits) {
+ if (obj == null)
+ return;
+ switch (obj.type()) {
+ case PdfObject.INDIRECT:
+ PRIndirectReference iref = (PRIndirectReference)obj;
+ if (reader != iref.getReader())
+ return;
+ if (hits.containsKey(iref.getNumber()))
+ return;
+ hits.put(iref.getNumber(), 1);
+ findAllObjects(reader, PdfReader.getPdfObject(obj), hits);
+ return;
+ case PdfObject.ARRAY:
+ ArrayList lst = ((PdfArray)obj).getArrayList();
+ for (int k = 0; k < lst.size(); ++k) {
+ findAllObjects(reader, (PdfObject)lst.get(k), hits);
+ }
+ return;
+ case PdfObject.DICTIONARY:
+ case PdfObject.STREAM:
+ PdfDictionary dic = (PdfDictionary)obj;
+ for (Iterator it = dic.getKeys().iterator(); it.hasNext();) {
+ PdfName name = (PdfName)it.next();
+ findAllObjects(reader, dic.get(name), hits);
+ }
+ return;
+ }
+ }
+
+ /**
+ * @param fdf
+ * @throws IOException
+ */
+ public void addComments(FdfReader fdf) throws IOException{
+ if (readers2intrefs.containsKey(fdf))
+ return;
+ PdfDictionary catalog = fdf.getCatalog();
+ catalog = (PdfDictionary)PdfReader.getPdfObject(catalog.get(PdfName.FDF));
+ if (catalog == null)
+ return;
+ PdfArray annots = (PdfArray)PdfReader.getPdfObject(catalog.get(PdfName.ANNOTS));
+ if (annots == null || annots.size() == 0)
+ return;
+ registerReader(fdf, false);
+ IntHashtable hits = new IntHashtable();
+ HashMap irt = new HashMap();
+ ArrayList an = new ArrayList();
+ ArrayList ar = annots.getArrayList();
+ for (int k = 0; k < ar.size(); ++k) {
+ PdfObject obj = (PdfObject)ar.get(k);
+ PdfDictionary annot = (PdfDictionary)PdfReader.getPdfObject(obj);
+ PdfNumber page = (PdfNumber)PdfReader.getPdfObject(annot.get(PdfName.PAGE));
+ if (page == null || page.intValue() >= reader.getNumberOfPages())
+ continue;
+ findAllObjects(fdf, obj, hits);
+ an.add(obj);
+ if (obj.type() == PdfObject.INDIRECT) {
+ PdfObject nm = PdfReader.getPdfObject(annot.get(PdfName.NM));
+ if (nm != null && nm.type() == PdfObject.STRING)
+ irt.put(nm.toString(), obj);
+ }
+ }
+ int arhits[] = hits.getKeys();
+ for (int k = 0; k < arhits.length; ++k) {
+ int n = arhits[k];
+ PdfObject obj = fdf.getPdfObject(n);
+ if (obj.type() == PdfObject.DICTIONARY) {
+ PdfObject str = PdfReader.getPdfObject(((PdfDictionary)obj).get(PdfName.IRT));
+ if (str != null && str.type() == PdfObject.STRING) {
+ PdfObject i = (PdfObject)irt.get(str.toString());
+ if (i != null) {
+ PdfDictionary dic2 = new PdfDictionary();
+ dic2.merge((PdfDictionary)obj);
+ dic2.put(PdfName.IRT, i);
+ obj = dic2;
+ }
+ }
+ }
+ addToBody(obj, getNewObjectNumber(fdf, n, 0));
+ }
+ for (int k = 0; k < an.size(); ++k) {
+ PdfObject obj = (PdfObject)an.get(k);
+ PdfDictionary annot = (PdfDictionary)PdfReader.getPdfObject(obj);
+ PdfNumber page = (PdfNumber)PdfReader.getPdfObject(annot.get(PdfName.PAGE));
+ PdfDictionary dic = reader.getPageN(page.intValue() + 1);
+ PdfArray annotsp = (PdfArray)PdfReader.getPdfObject(dic.get(PdfName.ANNOTS), dic);
+ if (annotsp == null) {
+ annotsp = new PdfArray();
+ dic.put(PdfName.ANNOTS, annotsp);
+ markUsed(dic);
+ }
+ markUsed(annotsp);
+ annotsp.add(obj);
+ }
+ }
+
+ PageStamp getPageStamp(int pageNum) {
+ PdfDictionary pageN = reader.getPageN(pageNum);
+ PageStamp ps = (PageStamp)pagesToContent.get(pageN);
+ if (ps == null) {
+ ps = new PageStamp(this, reader, pageN);
+ pagesToContent.put(pageN, ps);
+ }
+ return ps;
+ }
+
+ PdfContentByte getUnderContent(int pageNum) {
+ if (pageNum < 1 || pageNum > reader.getNumberOfPages())
+ return null;
+ PageStamp ps = getPageStamp(pageNum);
+ if (ps.under == null)
+ ps.under = new StampContent(this, ps);
+ return ps.under;
+ }
+
+ PdfContentByte getOverContent(int pageNum) {
+ if (pageNum < 1 || pageNum > reader.getNumberOfPages())
+ return null;
+ PageStamp ps = getPageStamp(pageNum);
+ if (ps.over == null)
+ ps.over = new StampContent(this, ps);
+ return ps.over;
+ }
+
+ void correctAcroFieldPages(int page) {
+ if (acroFields == null)
+ return;
+ if (page > reader.getNumberOfPages())
+ return;
+ HashMap fields = acroFields.getFields();
+ for (Iterator it = fields.values().iterator(); it.hasNext();) {
+ AcroFields.Item item = (AcroFields.Item)it.next();
+ ArrayList pages = item.page;
+ for (int k = 0; k < pages.size(); ++k) {
+ int p = ((Integer)pages.get(k)).intValue();
+ if (p >= page)
+ pages.set(k, new Integer(p + 1));
+ }
+ }
+ }
+
+ void insertPage(int pageNumber, Rectangle mediabox) {
+ Rectangle media = new Rectangle(mediabox);
+ int rotation = media.getRotation() % 360;
+ PdfDictionary page = new PdfDictionary(PdfName.PAGE);
+ PdfDictionary resources = new PdfDictionary();
+ PdfArray procset = new PdfArray();
+ procset.add(PdfName.PDF);
+ procset.add(PdfName.TEXT);
+ procset.add(PdfName.IMAGEB);
+ procset.add(PdfName.IMAGEC);
+ procset.add(PdfName.IMAGEI);
+ resources.put(PdfName.PROCSET, procset);
+ page.put(PdfName.RESOURCES, resources);
+ page.put(PdfName.ROTATE, new PdfNumber(rotation));
+ page.put(PdfName.MEDIABOX, new PdfRectangle(media, rotation));
+ PRIndirectReference pref = reader.addPdfObject(page);
+ PdfDictionary parent;
+ PRIndirectReference parentRef;
+ if (pageNumber > reader.getNumberOfPages()) {
+ PdfDictionary lastPage = reader.getPageNRelease(reader.getNumberOfPages());
+ parentRef = (PRIndirectReference)lastPage.get(PdfName.PARENT);
+ parentRef = new PRIndirectReference(reader, parentRef.getNumber());
+ parent = (PdfDictionary)PdfReader.getPdfObject(parentRef);
+ PdfArray kids = (PdfArray)PdfReader.getPdfObject(parent.get(PdfName.KIDS), parent);
+ kids.add(pref);
+ markUsed(kids);
+ reader.pageRefs.insertPage(pageNumber, pref);
+ }
+ else {
+ if (pageNumber < 1)
+ pageNumber = 1;
+ PdfDictionary firstPage = reader.getPageN(pageNumber);
+ PRIndirectReference firstPageRef = reader.getPageOrigRef(pageNumber);
+ reader.releasePage(pageNumber);
+ parentRef = (PRIndirectReference)firstPage.get(PdfName.PARENT);
+ parentRef = new PRIndirectReference(reader, parentRef.getNumber());
+ parent = (PdfDictionary)PdfReader.getPdfObject(parentRef);
+ PdfArray kids = (PdfArray)PdfReader.getPdfObject(parent.get(PdfName.KIDS), parent);
+ ArrayList ar = kids.getArrayList();
+ int len = ar.size();
+ int num = firstPageRef.getNumber();
+ for (int k = 0; k < len; ++k) {
+ PRIndirectReference cur = (PRIndirectReference)ar.get(k);
+ if (num == cur.getNumber()) {
+ ar.add(k, pref);
+ break;
+ }
+ }
+ if (len == ar.size())
+ throw new RuntimeException("Internal inconsistence.");
+ markUsed(kids);
+ reader.pageRefs.insertPage(pageNumber, pref);
+ correctAcroFieldPages(pageNumber);
+ }
+ page.put(PdfName.PARENT, parentRef);
+ while (parent != null) {
+ markUsed(parent);
+ PdfNumber count = (PdfNumber)PdfReader.getPdfObjectRelease(parent.get(PdfName.COUNT));
+ parent.put(PdfName.COUNT, new PdfNumber(count.intValue() + 1));
+ parent = (PdfDictionary)PdfReader.getPdfObject(parent.get(PdfName.PARENT));
+ }
+ }
+
+ /** Getter for property rotateContents.
+ * @return Value of property rotateContents.
+ *
+ */
+ boolean isRotateContents() {
+ return this.rotateContents;
+ }
+
+ /** Setter for property rotateContents.
+ * @param rotateContents New value of property rotateContents.
+ *
+ */
+ void setRotateContents(boolean rotateContents) {
+ this.rotateContents = rotateContents;
+ }
+
+ boolean isContentWritten() {
+ return body.size() > 1;
+ }
+
+ AcroFields getAcroFields() {
+ if (acroFields == null) {
+ acroFields = new AcroFields(reader, this);
+ }
+ return acroFields;
+ }
+
+ void setFormFlattening(boolean flat) {
+ this.flat = flat;
+ }
+
+ void setFreeTextFlattening(boolean flat) {
+ this.flatFreeText = flat;
+ }
+
+ boolean partialFormFlattening(String name) {
+ getAcroFields();
+ if (!acroFields.getFields().containsKey(name))
+ return false;
+ partialFlattening.add(name);
+ return true;
+ }
+
+ void flatFields() {
+ if (append)
+ throw new IllegalArgumentException("Field flattening is not supported in append mode.");
+ getAcroFields();
+ HashMap fields = acroFields.getFields();
+ if (fieldsAdded && partialFlattening.isEmpty()) {
+ for (Iterator i = fields.keySet().iterator(); i.hasNext();) {
+ partialFlattening.add(i.next());
+ }
+ }
+ PdfDictionary acroForm = (PdfDictionary)PdfReader.getPdfObject(reader.getCatalog().get(PdfName.ACROFORM));
+ ArrayList acroFds = null;
+ if (acroForm != null) {
+ PdfArray array = (PdfArray)PdfReader.getPdfObject(acroForm.get(PdfName.FIELDS), acroForm);
+ if (array != null)
+ acroFds = array.getArrayList();
+ }
+ for (Iterator i = fields.keySet().iterator(); i.hasNext();) {
+ String name = (String)i.next();
+ if (!partialFlattening.isEmpty() && !partialFlattening.contains(name))
+ continue;
+ AcroFields.Item item = (AcroFields.Item)fields.get(name);
+ for (int k = 0; k < item.merged.size(); ++k) {
+ PdfDictionary merged = (PdfDictionary)item.merged.get(k);
+ PdfNumber ff = (PdfNumber)PdfReader.getPdfObject(merged.get(PdfName.F));
+ int flags = 0;
+ if (ff != null)
+ flags = ff.intValue();
+ int page = ((Integer)item.page.get(k)).intValue();
+ PdfDictionary appDic = (PdfDictionary)PdfReader.getPdfObject(merged.get(PdfName.AP));
+ if (appDic != null && (flags & PdfFormField.FLAGS_PRINT) != 0 && (flags & PdfFormField.FLAGS_HIDDEN) == 0) {
+ PdfObject obj = appDic.get(PdfName.N);
+ PdfAppearance app = null;
+ if (obj != null) {
+ PdfObject objReal = PdfReader.getPdfObject(obj);
+ if (obj instanceof PdfIndirectReference && !obj.isIndirect())
+ app = new PdfAppearance((PdfIndirectReference)obj);
+ else if (objReal instanceof PdfStream) {
+ ((PdfDictionary)objReal).put(PdfName.SUBTYPE, PdfName.FORM);
+ app = new PdfAppearance((PdfIndirectReference)obj);
+ }
+ else {
+ if (objReal.isDictionary()) {
+ PdfName as = (PdfName)PdfReader.getPdfObject(merged.get(PdfName.AS));
+ if (as != null) {
+ PdfIndirectReference iref = (PdfIndirectReference)((PdfDictionary)objReal).get(as);
+ if (iref != null) {
+ app = new PdfAppearance(iref);
+ if (iref.isIndirect()) {
+ objReal = PdfReader.getPdfObject(iref);
+ ((PdfDictionary)objReal).put(PdfName.SUBTYPE, PdfName.FORM);
+ }
+ }
+ }
+ }
+ }
+ }
+ if (app != null) {
+ Rectangle box = PdfReader.getNormalizedRectangle((PdfArray)PdfReader.getPdfObject(merged.get(PdfName.RECT)));
+ PdfContentByte cb = getOverContent(page);
+ cb.setLiteral("Q ");
+ cb.addTemplate(app, box.left(), box.bottom());
+ cb.setLiteral("q ");
+ }
+ }
+ if (partialFlattening.isEmpty())
+ continue;
+ PdfDictionary pageDic = reader.getPageN(page);
+ PdfArray annots = (PdfArray)PdfReader.getPdfObject(pageDic.get(PdfName.ANNOTS));
+ if (annots == null)
+ continue;
+ ArrayList ar = annots.getArrayList();
+ for (int idx = 0; idx < ar.size(); ++idx) {
+ PdfObject ran = (PdfObject)ar.get(idx);
+ if (!ran.isIndirect())
+ continue;
+ PdfObject ran2 = (PdfObject)item.widget_refs.get(k);
+ if (!ran2.isIndirect())
+ continue;
+ if (((PRIndirectReference)ran).getNumber() == ((PRIndirectReference)ran2).getNumber()) {
+ ar.remove(idx--);
+ PRIndirectReference wdref = (PRIndirectReference)ran2;
+ while (true) {
+ PdfDictionary wd = (PdfDictionary)PdfReader.getPdfObject(wdref);
+ PRIndirectReference parentRef = (PRIndirectReference)wd.get(PdfName.PARENT);
+ PdfReader.killIndirect(wdref);
+ if (parentRef == null) { // reached AcroForm
+ for (int fr = 0; fr < acroFds.size(); ++fr) {
+ PdfObject h = (PdfObject)acroFds.get(fr);
+ if (h.isIndirect() && ((PRIndirectReference)h).getNumber() == wdref.getNumber()) {
+ acroFds.remove(fr);
+ --fr;
+ }
+ }
+ break;
+ }
+ PdfDictionary parent = (PdfDictionary)PdfReader.getPdfObject(parentRef);
+ PdfArray kids = (PdfArray)PdfReader.getPdfObject(parent.get(PdfName.KIDS));
+ ArrayList kar = kids.getArrayList();
+ for (int fr = 0; fr < kar.size(); ++fr) {
+ PdfObject h = (PdfObject)kar.get(fr);
+ if (h.isIndirect() && ((PRIndirectReference)h).getNumber() == wdref.getNumber()) {
+ kar.remove(fr);
+ --fr;
+ }
+ }
+ if (!kar.isEmpty())
+ break;
+ wdref = parentRef;
+ }
+ }
+ }
+ if (ar.size() == 0) {
+ PdfReader.killIndirect(pageDic.get(PdfName.ANNOTS));
+ pageDic.remove(PdfName.ANNOTS);
+ }
+ }
+ }
+ if (!fieldsAdded && partialFlattening.isEmpty()) {
+ for (int page = 1; page <= reader.getNumberOfPages(); ++page) {
+ PdfDictionary pageDic = reader.getPageN(page);
+ PdfArray annots = (PdfArray)PdfReader.getPdfObject(pageDic.get(PdfName.ANNOTS));
+ if (annots == null)
+ continue;
+ ArrayList ar = annots.getArrayList();
+ for (int idx = 0; idx < ar.size(); ++idx) {
+ PdfObject annoto = PdfReader.getPdfObject((PdfObject)ar.get(idx));
+ if ((annoto instanceof PdfIndirectReference) && !annoto.isIndirect())
+ continue;
+ PdfDictionary annot = (PdfDictionary)annoto;
+ if (PdfName.WIDGET.equals(annot.get(PdfName.SUBTYPE))) {
+ ar.remove(idx);
+ --idx;
+ }
+ }
+ if (ar.size() == 0) {
+ PdfReader.killIndirect(pageDic.get(PdfName.ANNOTS));
+ pageDic.remove(PdfName.ANNOTS);
+ }
+ }
+ eliminateAcroformObjects();
+ }
+ }
+
+ void eliminateAcroformObjects() {
+ PdfObject acro = reader.getCatalog().get(PdfName.ACROFORM);
+ if (acro == null)
+ return;
+ PdfDictionary acrodic = (PdfDictionary)PdfReader.getPdfObject(acro);
+ PdfObject iFields = acrodic.get(PdfName.FIELDS);
+ if (iFields != null) {
+ PdfDictionary kids = new PdfDictionary();
+ kids.put(PdfName.KIDS, iFields);
+ sweepKids(kids);
+ PdfReader.killIndirect(iFields);
+ acrodic.put(PdfName.FIELDS, new PdfArray());
+ }
+// PdfReader.killIndirect(acro);
+// reader.getCatalog().remove(PdfName.ACROFORM);
+ }
+
+ void sweepKids(PdfObject obj) {
+ PdfObject oo = PdfReader.killIndirect(obj);
+ if (oo == null || !oo.isDictionary())
+ return;
+ PdfDictionary dic = (PdfDictionary)oo;
+ PdfArray kids = (PdfArray)PdfReader.killIndirect(dic.get(PdfName.KIDS));
+ if (kids == null)
+ return;
+ ArrayList ar = kids.getArrayList();
+ for (int k = 0; k < ar.size(); ++k) {
+ sweepKids((PdfObject)ar.get(k));
+ }
+ }
+
+ private void flatFreeTextFields()
+ {
+ if (append)
+ throw new IllegalArgumentException("FreeText flattening is not supported in append mode.");
+
+ for (int page = 1; page <= reader.getNumberOfPages(); ++page)
+ {
+ PdfDictionary pageDic = reader.getPageN(page);
+ PdfArray annots = (PdfArray)PdfReader.getPdfObject(pageDic.get(PdfName.ANNOTS));
+ if (annots == null)
+ continue;
+ ArrayList ar = annots.getArrayList();
+ for (int idx = 0; idx < ar.size(); ++idx)
+ {
+ PdfObject annoto = PdfReader.getPdfObject((PdfObject)ar.get(idx));
+ if ((annoto instanceof PdfIndirectReference) && !annoto.isIndirect())
+ continue;
+
+ PdfDictionary annDic = (PdfDictionary)annoto;
+ if (!((PdfName)annDic.get(PdfName.SUBTYPE)).equals(PdfName.FREETEXT))
+ continue;
+ PdfNumber ff = (PdfNumber)PdfReader.getPdfObject(annDic.get(PdfName.F));
+ int flags = (ff != null) ? ff.intValue() : 0;
+
+ if ( (flags & PdfFormField.FLAGS_PRINT) != 0 && (flags & PdfFormField.FLAGS_HIDDEN) == 0)
+ {
+ PdfObject obj1 = annDic.get(PdfName.AP);
+ if (obj1 == null)
+ continue;
+ PdfDictionary appDic = (obj1 instanceof PdfIndirectReference) ?
+ (PdfDictionary) PdfReader.getPdfObject(obj1) : (PdfDictionary) obj1;
+ PdfObject obj = appDic.get(PdfName.N);
+ PdfAppearance app = null;
+ PdfObject objReal = PdfReader.getPdfObject(obj);
+
+ if (obj instanceof PdfIndirectReference && !obj.isIndirect())
+ app = new PdfAppearance((PdfIndirectReference)obj);
+ else if (objReal instanceof PdfStream)
+ {
+ ((PdfDictionary)objReal).put(PdfName.SUBTYPE, PdfName.FORM);
+ app = new PdfAppearance((PdfIndirectReference)obj);
+ }
+ else
+ {
+ if (objReal.isDictionary())
+ {
+ PdfName as_p = (PdfName)PdfReader.getPdfObject(appDic.get(PdfName.AS));
+ if (as_p != null)
+ {
+ PdfIndirectReference iref = (PdfIndirectReference)((PdfDictionary)objReal).get(as_p);
+ if (iref != null)
+ {
+ app = new PdfAppearance(iref);
+ if (iref.isIndirect())
+ {
+ objReal = PdfReader.getPdfObject(iref);
+ ((PdfDictionary)objReal).put(PdfName.SUBTYPE, PdfName.FORM);
+ }
+ }
+ }
+ }
+ }
+ if (app != null)
+ {
+ Rectangle box = PdfReader.getNormalizedRectangle((PdfArray)PdfReader.getPdfObject(annDic.get(PdfName.RECT)));
+ PdfContentByte cb = getOverContent(page);
+ cb.setLiteral("Q ");
+ cb.addTemplate(app, box.left(), box.bottom());
+ cb.setLiteral("q ");
+ }
+ }
+ if (partialFlattening.size() == 0)
+ continue;
+ }
+ for (int idx = 0; idx < ar.size(); ++idx)
+ {
+ PdfObject annoto = PdfReader.getPdfObject((PdfObject)ar.get(idx));
+ if ((annoto instanceof PdfIndirectReference) && annoto.isIndirect())
+ {
+ PdfDictionary annot = (PdfDictionary)annoto;
+ if (PdfName.FREETEXT.equals(annot.get(PdfName.SUBTYPE)))
+ {
+ ar.remove(idx);
+ --idx;
+ }
+ }
+ }
+ if (ar.size() == 0)
+ {
+ PdfReader.killIndirect(pageDic.get(PdfName.ANNOTS));
+ pageDic.remove(PdfName.ANNOTS);
+ }
+ }
+ }
+
+ /**
+ * @see com.lowagie.text.pdf.PdfWriter#getPageReference(int)
+ */
+ public PdfIndirectReference getPageReference(int page) {
+ PdfIndirectReference ref = reader.getPageOrigRef(page);
+ if (ref == null)
+ throw new IllegalArgumentException("Invalid page number " + page);
+ return ref;
+ }
+
+ /**
+ * @see com.lowagie.text.pdf.PdfWriter#addAnnotation(com.lowagie.text.pdf.PdfAnnotation)
+ */
+ public void addAnnotation(PdfAnnotation annot) {
+ throw new RuntimeException("Unsupported in this context. Use PdfStamper.addAnnotation()");
+ }
+
+ void addDocumentField(PdfIndirectReference ref) {
+ PdfDictionary catalog = reader.getCatalog();
+ PdfDictionary acroForm = (PdfDictionary)PdfReader.getPdfObject(catalog.get(PdfName.ACROFORM), catalog);
+ if (acroForm == null) {
+ acroForm = new PdfDictionary();
+ catalog.put(PdfName.ACROFORM, acroForm);
+ markUsed(catalog);
+ }
+ PdfArray fields = (PdfArray)PdfReader.getPdfObject(acroForm.get(PdfName.FIELDS), acroForm);
+ if (fields == null) {
+ fields = new PdfArray();
+ acroForm.put(PdfName.FIELDS, fields);
+ markUsed(acroForm);
+ }
+ fields.add(ref);
+ markUsed(fields);
+ }
+
+ void addFieldResources() {
+ if (fieldTemplates.size() == 0)
+ return;
+ PdfDictionary catalog = reader.getCatalog();
+ PdfDictionary acroForm = (PdfDictionary)PdfReader.getPdfObject(catalog.get(PdfName.ACROFORM), catalog);
+ if (acroForm == null) {
+ acroForm = new PdfDictionary();
+ catalog.put(PdfName.ACROFORM, acroForm);
+ markUsed(catalog);
+ }
+ PdfDictionary dr = (PdfDictionary)PdfReader.getPdfObject(acroForm.get(PdfName.DR), acroForm);
+ if (dr == null) {
+ dr = new PdfDictionary();
+ acroForm.put(PdfName.DR, dr);
+ markUsed(acroForm);
+ }
+ markUsed(dr);
+ for (Iterator it = fieldTemplates.keySet().iterator(); it.hasNext();) {
+ PdfTemplate template = (PdfTemplate)it.next();
+ PdfFormField.mergeResources(dr, (PdfDictionary)template.getResources(), this);
+ }
+ PdfDictionary fonts = (PdfDictionary)PdfReader.getPdfObject(dr.get(PdfName.FONT));
+ if (fonts != null && acroForm.get(PdfName.DA) == null) {
+ acroForm.put(PdfName.DA, new PdfString("/Helv 0 Tf 0 g "));
+ markUsed(acroForm);
+ }
+ }
+
+ void expandFields(PdfFormField field, ArrayList allAnnots) {
+ allAnnots.add(field);
+ ArrayList kids = field.getKids();
+ if (kids != null) {
+ for (int k = 0; k < kids.size(); ++k)
+ expandFields((PdfFormField)kids.get(k), allAnnots);
+ }
+ }
+
+ void addAnnotation(PdfAnnotation annot, PdfDictionary pageN) {
+ try {
+ ArrayList allAnnots = new ArrayList();
+ if (annot.isForm()) {
+ fieldsAdded = true;
+ getAcroFields();
+ PdfFormField field = (PdfFormField)annot;
+ if (field.getParent() != null)
+ return;
+ expandFields(field, allAnnots);
+ }
+ else
+ allAnnots.add(annot);
+ for (int k = 0; k < allAnnots.size(); ++k) {
+ annot = (PdfAnnotation)allAnnots.get(k);
+ if (annot.getPlaceInPage() > 0)
+ pageN = reader.getPageN(annot.getPlaceInPage());
+ if (annot.isForm()) {
+ if (!annot.isUsed()) {
+ HashMap templates = annot.getTemplates();
+ if (templates != null)
+ fieldTemplates.putAll(templates);
+ }
+ PdfFormField field = (PdfFormField)annot;
+ if (field.getParent() == null)
+ addDocumentField(field.getIndirectReference());
+ }
+ if (annot.isAnnotation()) {
+ PdfArray annots = (PdfArray)PdfReader.getPdfObject(pageN.get(PdfName.ANNOTS), pageN);
+ if (annots == null) {
+ annots = new PdfArray();
+ pageN.put(PdfName.ANNOTS, annots);
+ markUsed(pageN);
+ }
+ annots.add(annot.getIndirectReference());
+ markUsed(annots);
+ if (!annot.isUsed()) {
+ PdfRectangle rect = (PdfRectangle)annot.get(PdfName.RECT);
+ if (rect != null && (rect.left() != 0 || rect.right() != 0 || rect.top() != 0 || rect.bottom() != 0)) {
+ int rotation = reader.getPageRotation(pageN);
+ Rectangle pageSize = reader.getPageSizeWithRotation(pageN);
+ switch (rotation) {
+ case 90:
+ annot.put(PdfName.RECT, new PdfRectangle(
+ pageSize.top() - rect.bottom(),
+ rect.left(),
+ pageSize.top() - rect.top(),
+ rect.right()));
+ break;
+ case 180:
+ annot.put(PdfName.RECT, new PdfRectangle(
+ pageSize.right() - rect.left(),
+ pageSize.top() - rect.bottom(),
+ pageSize.right() - rect.right(),
+ pageSize.top() - rect.top()));
+ break;
+ case 270:
+ annot.put(PdfName.RECT, new PdfRectangle(
+ rect.bottom(),
+ pageSize.right() - rect.left(),
+ rect.top(),
+ pageSize.right() - rect.right()));
+ break;
+ }
+ }
+ }
+ }
+ if (!annot.isUsed()) {
+ annot.setUsed();
+ addToBody(annot, annot.getIndirectReference());
+ }
+ }
+ }
+ catch (IOException e) {
+ throw new ExceptionConverter(e);
+ }
+ }
+
+ void addAnnotation(PdfAnnotation annot, int page) {
+ addAnnotation(annot, reader.getPageN(page));
+ }
+
+ private void outlineTravel(PRIndirectReference outline) {
+ while (outline != null) {
+ PdfDictionary outlineR = (PdfDictionary)PdfReader.getPdfObjectRelease(outline);
+ PRIndirectReference first = (PRIndirectReference)outlineR.get(PdfName.FIRST);
+ if (first != null) {
+ outlineTravel(first);
+ }
+ PdfReader.killIndirect(outlineR.get(PdfName.DEST));
+ PdfReader.killIndirect(outlineR.get(PdfName.A));
+ PdfReader.killIndirect(outline);
+ outline = (PRIndirectReference)outlineR.get(PdfName.NEXT);
+ }
+ }
+
+ void deleteOutlines() {
+ PdfDictionary catalog = reader.getCatalog();
+ PRIndirectReference outlines = (PRIndirectReference)catalog.get(PdfName.OUTLINES);
+ if (outlines == null)
+ return;
+ outlineTravel(outlines);
+ PdfReader.killIndirect(outlines);
+ catalog.remove(PdfName.OUTLINES);
+ markUsed(catalog);
+ }
+
+ void setJavaScript() throws IOException {
+ ArrayList djs = pdf.getDocumentJavaScript();
+ if (djs.size() == 0)
+ return;
+ PdfDictionary catalog = reader.getCatalog();
+ PdfDictionary names = (PdfDictionary)PdfReader.getPdfObject(catalog.get(PdfName.NAMES), catalog);
+ if (names == null) {
+ names = new PdfDictionary();
+ catalog.put(PdfName.NAMES, names);
+ markUsed(catalog);
+ }
+ markUsed(names);
+ String s = String.valueOf(djs.size() - 1);
+ int n = s.length();
+ String pad = "000000000000000";
+ HashMap maptree = new HashMap();
+ for (int k = 0; k < djs.size(); ++k) {
+ s = String.valueOf(k);
+ s = pad.substring(0, n - s.length()) + s;
+ maptree.put(s, djs.get(k));
+ }
+ PdfDictionary tree = PdfNameTree.writeTree(maptree, this);
+ names.put(PdfName.JAVASCRIPT, addToBody(tree).getIndirectReference());
+ }
+
+ void addFileAttachments() throws IOException {
+ HashMap fs = pdf.getDocumentFileAttachment();
+ if (fs.size() == 0)
+ return;
+ PdfDictionary catalog = reader.getCatalog();
+ PdfDictionary names = (PdfDictionary)PdfReader.getPdfObject(catalog.get(PdfName.NAMES), catalog);
+ if (names == null) {
+ names = new PdfDictionary();
+ catalog.put(PdfName.NAMES, names);
+ markUsed(catalog);
+ }
+ markUsed(names);
+ HashMap old = PdfNameTree.readTree((PdfDictionary)PdfReader.getPdfObjectRelease(names.get(PdfName.EMBEDDEDFILES)));
+ for (Iterator it = fs.keySet().iterator(); it.hasNext();) {
+ String name = (String)it.next();
+ int k = 0;
+ String nn = name;
+ while (old.containsKey(nn)) {
+ ++k;
+ nn += " " + k;
+ }
+ old.put(nn, fs.get(name));
+ }
+ PdfDictionary tree = PdfNameTree.writeTree(old, this);
+ names.put(PdfName.EMBEDDEDFILES, addToBody(tree).getIndirectReference());
+ }
+
+ void setOutlines() throws IOException {
+ if (newBookmarks == null)
+ return;
+ deleteOutlines();
+ if (newBookmarks.size() == 0)
+ return;
+ namedAsNames = (reader.getCatalog().get(PdfName.DESTS) != null);
+ PdfDictionary top = new PdfDictionary();
+ PdfIndirectReference topRef = getPdfIndirectReference();
+ Object kids[] = SimpleBookmark.iterateOutlines(this, topRef, newBookmarks, namedAsNames);
+ top.put(PdfName.FIRST, (PdfIndirectReference)kids[0]);
+ top.put(PdfName.LAST, (PdfIndirectReference)kids[1]);
+ top.put(PdfName.COUNT, new PdfNumber(((Integer)kids[2]).intValue()));
+ addToBody(top, topRef);
+ reader.getCatalog().put(PdfName.OUTLINES, topRef);
+ markUsed(reader.getCatalog());
+ }
+
+ void setOutlines(List outlines) {
+ newBookmarks = outlines;
+ }
+
+ /**
+ * Sets the viewer preferences.
+ * @param preferences the viewer preferences
+ * @see PdfWriter#setViewerPreferences(int)
+ */
+ public void setViewerPreferences(int preferences) {
+ useVp = true;
+ vp |= preferences;
+ }
+
+ /**
+ * Set the signature flags.
+ * @param f the flags. This flags are ORed with current ones
+ */
+ public void setSigFlags(int f) {
+ sigFlags |= f;
+ }
+
+ /** Always throws an <code>UnsupportedOperationException</code>.
+ * @param actionType ignore
+ * @param action ignore
+ * @throws PdfException ignore
+ * @see PdfStamper#setPageAction(PdfName, PdfAction, int)
+ */
+ public void setPageAction(PdfName actionType, PdfAction action) throws PdfException {
+ throw new UnsupportedOperationException("Use setPageAction(PdfName actionType, PdfAction action, int page)");
+ }
+
+ /**
+ * Sets the open and close page additional action.
+ * @param actionType the action type. It can be <CODE>PdfWriter.PAGE_OPEN</CODE>
+ * or <CODE>PdfWriter.PAGE_CLOSE</CODE>
+ * @param action the action to perform
+ * @param page the page where the action will be applied. The first page is 1
+ * @throws PdfException if the action type is invalid
+ */
+ void setPageAction(PdfName actionType, PdfAction action, int page) throws PdfException {
+ if (!actionType.equals(PAGE_OPEN) && !actionType.equals(PAGE_CLOSE))
+ throw new PdfException("Invalid page additional action type: " + actionType.toString());
+ PdfDictionary pg = reader.getPageN(page);
+ PdfDictionary aa = (PdfDictionary)PdfReader.getPdfObject(pg.get(PdfName.AA), pg);
+ if (aa == null) {
+ aa = new PdfDictionary();
+ pg.put(PdfName.AA, aa);
+ markUsed(pg);
+ }
+ aa.put(actionType, action);
+ markUsed(aa);
+ }
+
+ /**
+ * Always throws an <code>UnsupportedOperationException</code>.
+ * @param seconds ignore
+ */
+ public void setDuration(int seconds) {
+ throw new UnsupportedOperationException("Use setPageAction(PdfName actionType, PdfAction action, int page)");
+ }
+
+ /**
+ * Always throws an <code>UnsupportedOperationException</code>.
+ * @param transition ignore
+ */
+ public void setTransition(PdfTransition transition) {
+ throw new UnsupportedOperationException("Use setPageAction(PdfName actionType, PdfAction action, int page)");
+ }
+
+ /**
+ * Sets the display duration for the page (for presentations)
+ * @param seconds the number of seconds to display the page. A negative value removes the entry
+ * @param page the page where the duration will be applied. The first page is 1
+ */
+ void setDuration(int seconds, int page) {
+ PdfDictionary pg = reader.getPageN(page);
+ if (seconds < 0)
+ pg.remove(PdfName.DUR);
+ else
+ pg.put(PdfName.DUR, new PdfNumber(seconds));
+ markUsed(pg);
+ }
+
+ /**
+ * Sets the transition for the page
+ * @param transition the transition object. A <code>null</code> removes the transition
+ * @param page the page where the transition will be applied. The first page is 1
+ */
+ void setTransition(PdfTransition transition, int page) {
+ PdfDictionary pg = reader.getPageN(page);
+ if (transition == null)
+ pg.remove(PdfName.TRANS);
+ else
+ pg.put(PdfName.TRANS, transition.getTransitionDictionary());
+ markUsed(pg);
+ }
+
+ // wprinz: had to make this public as we want to explicitely mark something as USED.
+ public void markUsed(PdfObject obj) {
+ if (append && obj != null) {
+ PRIndirectReference ref = null;
+ if (obj.type() == PdfObject.INDIRECT)
+ ref = (PRIndirectReference)obj;
+ else
+ ref = obj.getIndRef();
+ if (ref != null)
+ marked.put(ref.getNumber(), 1);
+ }
+ }
+
+ protected void markUsed(int num) {
+ if (append)
+ marked.put(num, 1);
+ }
+
+ /**
+ * Getter for property append.
+ * @return Value of property append.
+ */
+ boolean isAppend() {
+ return append;
+ }
+
+ /** Additional-actions defining the actions to be taken in
+ * response to various trigger events affecting the document
+ * as a whole. The actions types allowed are: <CODE>DOCUMENT_CLOSE</CODE>,
+ * <CODE>WILL_SAVE</CODE>, <CODE>DID_SAVE</CODE>, <CODE>WILL_PRINT</CODE>
+ * and <CODE>DID_PRINT</CODE>.
+ *
+ * @param actionType the action type
+ * @param action the action to execute in response to the trigger
+ * @throws PdfException on invalid action type
+ */
+ public void setAdditionalAction(PdfName actionType, PdfAction action) throws PdfException {
+ if (!(actionType.equals(DOCUMENT_CLOSE) ||
+ actionType.equals(WILL_SAVE) ||
+ actionType.equals(DID_SAVE) ||
+ actionType.equals(WILL_PRINT) ||
+ actionType.equals(DID_PRINT))) {
+ throw new PdfException("Invalid additional action type: " + actionType.toString());
+ }
+ PdfDictionary aa = (PdfDictionary)PdfReader.getPdfObject(reader.getCatalog().get(PdfName.AA));
+ if (aa == null) {
+ if (action == null)
+ return;
+ aa = new PdfDictionary();
+ reader.getCatalog().put(PdfName.AA, aa);
+ }
+ markUsed(aa);
+ if (action == null)
+ aa.remove(actionType);
+ else
+ aa.put(actionType, action);
+ }
+
+ /**
+ * @see com.lowagie.text.pdf.PdfWriter#setOpenAction(com.lowagie.text.pdf.PdfAction)
+ */
+ public void setOpenAction(PdfAction action) {
+ openAction = action;
+ }
+
+ /**
+ * @see com.lowagie.text.pdf.PdfWriter#setOpenAction(java.lang.String)
+ */
+ public void setOpenAction(String name) {
+ throw new UnsupportedOperationException("Open actions by name are not supported.");
+ }
+
+ /**
+ * @see com.lowagie.text.pdf.PdfWriter#setThumbnail(com.lowagie.text.Image)
+ */
+ public void setThumbnail(com.lowagie.text.Image image) {
+ throw new UnsupportedOperationException("Use PdfStamper.setThumbnail().");
+ }
+
+ void setThumbnail(Image image, int page) throws PdfException, DocumentException {
+ PdfIndirectReference thumb = getImageReference(addDirectImageSimple(image));
+ reader.resetReleasePage();
+ PdfDictionary dic = reader.getPageN(page);
+ dic.put(PdfName.THUMB, thumb);
+ reader.resetReleasePage();
+ }
+
+ public PdfContentByte getDirectContentUnder() {
+ throw new UnsupportedOperationException("Use PdfStamper.getUnderContent() or PdfStamper.getOverContent()");
+ }
+
+ public PdfContentByte getDirectContent() {
+ throw new UnsupportedOperationException("Use PdfStamper.getUnderContent() or PdfStamper.getOverContent()");
+ }
+
+ static class PageStamp {
+
+ PdfDictionary pageN;
+ StampContent under;
+ StampContent over;
+ PageResources pageResources;
+
+ PageStamp(PdfStamperImp stamper, PdfReader reader, PdfDictionary pageN) {
+ this.pageN = pageN;
+ pageResources = new PageResources();
+ PdfDictionary resources = (PdfDictionary)PdfReader.getPdfObject(pageN.get(PdfName.RESOURCES));
+
+
+ // wprinz: flatten out the /Resource dictionary so that, when incrementally written, all new Resources are written correctly.
+ // alternatively, indirect resource dictionary for /Font and /XObject could be marked as used
+ // when they are modified. - e.g. in PageResources - but that would be far more effort than flattening the dict.
+ // (actually the objects that were flattened out could be deleted in the IncrementalUpdate xref)
+ //System.out.println("pageN = " + pageN.getIndRef());
+ //System.out.println("pageN.get(/Resources) = " + pageN.get(PdfName.RESOURCES));
+ //System.out.println("new resources = " + resources);
+ //System.out.println("flattening out new resources:");
+ for (Iterator it = resources.getKeys().iterator(); it.hasNext(); )
+ {
+ PdfName key = (PdfName)it.next();
+ PdfObject value = resources.get(key);
+ //System.out.println(" " + key + " = " + value);
+
+ if (value.isIndirect() && (key.compareTo(PdfName.FONT) == 0 || key.compareTo(PdfName.XOBJECT) == 0))
+ {
+ PRIndirectReference ref = (PRIndirectReference)value;
+ PdfObject direct_object = PdfReader.getPdfObject(ref);
+
+ resources.put(key, direct_object);
+ //System.out.println(" flattended " + key + " to " + direct_object);
+ }
+ }
+ // wprinz: end
+
+
+ pageResources.setOriginalResources(resources, stamper.namePtr);
+ }
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/pdf/PdfStream.java b/src/main/java/com/lowagie/text/pdf/PdfStream.java
new file mode 100644
index 0000000..3d3b9dd
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/PdfStream.java
@@ -0,0 +1,313 @@
+/*
+ * $Id: PdfStream.java,v 1.57 2005/11/01 12:27:05 psoares33 Exp $
+ * $Name: $
+ *
+ * Copyright 1999, 2000, 2001, 2002 Bruno Lowagie
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf;
+
+import java.io.ByteArrayOutputStream;
+import java.io.OutputStream;
+import java.io.InputStream;
+import java.io.IOException;
+import java.util.zip.DeflaterOutputStream;
+import java.util.zip.Deflater;
+import com.lowagie.text.Document;
+import com.lowagie.text.DocWriter;
+import com.lowagie.text.ExceptionConverter;
+
+/**
+ * <CODE>PdfStream</CODE> is the Pdf stream object.
+ * <P>
+ * A stream, like a string, is a sequence of characters. However, an application can
+ * read a small portion of a stream at a time, while a string must be read in its entirety.
+ * For this reason, objects with potentially large amounts of data, such as images and
+ * page descriptions, are represented as streams.<BR>
+ * A stream consists of a dictionary that describes a sequence of characters, followed by
+ * the keyword <B>stream</B>, followed by zero or more lines of characters, followed by
+ * the keyword <B>endstream</B>.<BR>
+ * All streams must be <CODE>PdfIndirectObject</CODE>s. The stream dictionary must be a direct
+ * object. The keyword <B>stream</B> that follows the stream dictionary should be followed by
+ * a carriage return and linefeed or just a linefeed.<BR>
+ * Remark: In this version only the FLATEDECODE-filter is supported.<BR>
+ * This object is described in the 'Portable Document Format Reference Manual version 1.3'
+ * section 4.8 (page 41-53).<BR>
+ *
+ * @see PdfObject
+ * @see PdfDictionary
+ */
+
+public class PdfStream extends PdfDictionary {
+
+ // membervariables
+
+/** is the stream compressed? */
+ protected boolean compressed = false;
+
+ protected ByteArrayOutputStream streamBytes = null;
+ protected InputStream inputStream;
+ protected PdfIndirectReference ref;
+ protected int inputStreamLength = -1;
+ protected PdfWriter writer;
+ protected int rawLength;
+
+ static final byte STARTSTREAM[] = DocWriter.getISOBytes("stream\n");
+ static final byte ENDSTREAM[] = DocWriter.getISOBytes("\nendstream");
+ static final int SIZESTREAM = STARTSTREAM.length + ENDSTREAM.length;
+
+ // constructors
+
+/**
+ * Constructs a <CODE>PdfStream</CODE>-object.
+ *
+ * @param bytes content of the new <CODE>PdfObject</CODE> as an array of <CODE>byte</CODE>.
+ */
+
+ public PdfStream(byte[] bytes) {
+ super();
+ type = STREAM;
+ this.bytes = bytes;
+ rawLength = bytes.length;
+ put(PdfName.LENGTH, new PdfNumber(bytes.length));
+ }
+
+ /**
+ * Creates an efficient stream. No temporary array is ever created. The <CODE>InputStream</CODE>
+ * is totally consumed but is not closed. The general usage is:
+ * <p>
+ * <pre>
+ * InputStream in = ...;
+ * PdfStream stream = new PdfStream(in, writer);
+ * stream.flateCompress();
+ * writer.addToBody(stream);
+ * stream.writeLength();
+ * in.close();
+ * </pre>
+ * @param inputStream the data to write to this stream
+ * @param writer the <CODE>PdfWriter</CODE> for this stream
+ */
+ public PdfStream(InputStream inputStream, PdfWriter writer) {
+ super();
+ type = STREAM;
+ this.inputStream = inputStream;
+ this.writer = writer;
+ ref = writer.getPdfIndirectReference();
+ put(PdfName.LENGTH, ref);
+ }
+
+/**
+ * Constructs a <CODE>PdfStream</CODE>-object.
+ */
+
+ protected PdfStream() {
+ super();
+ type = STREAM;
+ }
+
+ /**
+ * Writes the stream length to the <CODE>PdfWriter</CODE>.
+ * <p>
+ * This method must be called and can only be called if the contructor {@link #PdfStream(InputStream,PdfWriter)}
+ * is used to create the stream.
+ * @throws IOException on error
+ * @see #PdfStream(InputStream,PdfWriter)
+ */
+ public void writeLength() throws IOException {
+ if (inputStream == null)
+ throw new UnsupportedOperationException("writeLength() can only be called in a contructed PdfStream(InputStream,PdfWriter).");
+ if (inputStreamLength == -1)
+ throw new IOException("writeLength() can only be called after output of the stream body.");
+ writer.addToBody(new PdfNumber(inputStreamLength), ref, false);
+ }
+
+ /**
+ * Gets the raw length of the stream.
+ * @return the raw length of the stream
+ */
+ public int getRawLength() {
+ return rawLength;
+ }
+
+ /**
+ * Compresses the stream.
+ */
+
+ public void flateCompress() {
+ if (!Document.compress)
+ return;
+ // check if the flateCompress-method has already been
+ if (compressed) {
+ return;
+ }
+ if (inputStream != null) {
+ compressed = true;
+ return;
+ }
+ // check if a filter already exists
+ PdfObject filter = get(PdfName.FILTER);
+ if (filter != null) {
+ if (filter.isName() && ((PdfName) filter).compareTo(PdfName.FLATEDECODE) == 0) {
+ return;
+ }
+ else if (filter.isArray() && ((PdfArray) filter).contains(PdfName.FLATEDECODE)) {
+ return;
+ }
+ else {
+ throw new RuntimeException("Stream could not be compressed: filter is not a name or array.");
+ }
+ }
+ try {
+ // compress
+ ByteArrayOutputStream stream = new ByteArrayOutputStream();
+ DeflaterOutputStream zip = new DeflaterOutputStream(stream);
+ if (streamBytes != null)
+ streamBytes.writeTo(zip);
+ else
+ zip.write(bytes);
+ zip.close();
+ // update the object
+ streamBytes = stream;
+ bytes = null;
+ put(PdfName.LENGTH, new PdfNumber(streamBytes.size()));
+ if (filter == null) {
+ put(PdfName.FILTER, PdfName.FLATEDECODE);
+ }
+ else {
+ PdfArray filters = new PdfArray(filter);
+ filters.add(PdfName.FLATEDECODE);
+ put(PdfName.FILTER, filters);
+ }
+ compressed = true;
+ }
+ catch(IOException ioe) {
+ throw new ExceptionConverter(ioe);
+ }
+ }
+
+// public int getStreamLength(PdfWriter writer) {
+// if (dicBytes == null)
+// toPdf(writer);
+// if (streamBytes != null)
+// return streamBytes.size() + dicBytes.length + SIZESTREAM;
+// else
+// return bytes.length + dicBytes.length + SIZESTREAM;
+// }
+
+ protected void superToPdf(PdfWriter writer, OutputStream os) throws IOException {
+ super.toPdf(writer, os);
+ }
+
+ /**
+ * @see com.lowagie.text.pdf.PdfDictionary#toPdf(com.lowagie.text.pdf.PdfWriter, java.io.OutputStream)
+ */
+ public void toPdf(PdfWriter writer, OutputStream os) throws IOException {
+ if (inputStream != null && compressed)
+ put(PdfName.FILTER, PdfName.FLATEDECODE);
+ superToPdf(writer, os);
+ os.write(STARTSTREAM);
+ PdfEncryption crypto = null;
+ if (writer != null)
+ crypto = writer.getEncryption();
+ if (crypto != null)
+ crypto.prepareKey();
+ if (inputStream != null) {
+ rawLength = 0;
+ DeflaterOutputStream def = null;
+ OutputStreamCounter osc = new OutputStreamCounter(os);
+ OutputStream fout = osc;
+ if (crypto != null)
+ fout = new PdfEncryptionStream(fout, crypto);
+ if (compressed)
+ fout = def = new DeflaterOutputStream(fout, new Deflater(Deflater.BEST_COMPRESSION), 0x8000);
+
+ byte buf[] = new byte[0x10000];
+ while (true) {
+ int n = inputStream.read(buf);
+ if (n <= 0)
+ break;
+ fout.write(buf, 0, n);
+ rawLength += n;
+ }
+ if (def != null)
+ def.finish();
+ inputStreamLength = osc.getCounter();
+ }
+ else {
+ if (crypto == null) {
+ if (streamBytes != null)
+ streamBytes.writeTo(os);
+ else
+ os.write(bytes);
+ }
+ else {
+ byte b[];
+ if (streamBytes != null) {
+ b = streamBytes.toByteArray();
+ crypto.encryptRC4(b);
+ }
+ else {
+ b = new byte[bytes.length];
+ crypto.encryptRC4(bytes, b);
+ }
+ os.write(b);
+ }
+ }
+ os.write(ENDSTREAM);
+ }
+
+ /**
+ * Writes the data content to an <CODE>OutputStream</CODE>.
+ * @param os the destination to write to
+ * @throws IOException on error
+ */
+ public void writeContent(OutputStream os) throws IOException {
+ if (streamBytes != null)
+ streamBytes.writeTo(os);
+ else if (bytes != null)
+ os.write(bytes);
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/pdf/PdfString.java b/src/main/java/com/lowagie/text/pdf/PdfString.java
new file mode 100644
index 0000000..dac4035
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/PdfString.java
@@ -0,0 +1,236 @@
+/*
+ * $Id: PdfString.java,v 1.58 2005/05/04 14:32:24 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 1999, 2000, 2001, 2002 Bruno Lowagie
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf;
+import java.io.OutputStream;
+import java.io.IOException;
+
+/**
+ * A <CODE>PdfString</CODE>-class is the PDF-equivalent of a JAVA-<CODE>String</CODE>-object.
+ * <P>
+ * A string is a sequence of characters delimited by parenthesis. If a string is too long
+ * to be conveniently placed on a single line, it may be split across multiple lines by using
+ * the backslash character (\) at the end of a line to indicate that the string continues
+ * on the following line. Within a string, the backslash character is used as an escape to
+ * specify unbalanced parenthesis, non-printing ASCII characters, and the backslash character
+ * itself. Use of the \<I>ddd</I> escape sequence is the preferred way to represent characters
+ * outside the printable ASCII character set.<BR>
+ * This object is described in the 'Portable Document Format Reference Manual version 1.3'
+ * section 4.4 (page 37-39).
+ *
+ * @see PdfObject
+ * @see BadPdfFormatException
+ */
+
+public class PdfString extends PdfObject {
+
+ // membervariables
+
+ /** The value of this object. */
+ protected String value = NOTHING;
+ protected String originalValue = null;
+
+ /** The encoding. */
+ protected String encoding = TEXT_PDFDOCENCODING;
+ protected int objNum = 0;
+ protected int objGen = 0;
+ protected boolean hexWriting = false;
+
+ // constructors
+
+ /**
+ * Constructs an empty <CODE>PdfString</CODE>-object.
+ */
+
+ public PdfString() {
+ super(STRING);
+ }
+
+ /**
+ * Constructs a <CODE>PdfString</CODE>-object.
+ *
+ * @param value the content of the string
+ */
+
+ public PdfString(String value) {
+ super(STRING);
+ this.value = value;
+ }
+
+ /**
+ * Constructs a <CODE>PdfString</CODE>-object.
+ *
+ * @param value the content of the string
+ * @param encoding an encoding
+ */
+
+ public PdfString(String value, String encoding) {
+ super(STRING);
+ this.value = value;
+ this.encoding = encoding;
+ }
+
+ /**
+ * Constructs a <CODE>PdfString</CODE>-object.
+ *
+ * @param bytes an array of <CODE>byte</CODE>
+ */
+
+ public PdfString(byte[] bytes) {
+ super(STRING);
+ value = PdfEncodings.convertToString(bytes, null);
+ encoding = NOTHING;
+ }
+
+ // methods overriding some methods in PdfObject
+
+ /**
+ * Returns the PDF representation of this <CODE>PdfString</CODE>.
+ *
+ * @return an array of <CODE>byte</CODE>s
+ */
+
+ public void toPdf(PdfWriter writer, OutputStream os) throws IOException {
+ byte b[] = getBytes();
+ PdfEncryption crypto = null;
+ if (writer != null)
+ crypto = writer.getEncryption();
+ if (crypto != null) {
+ b = (byte[])bytes.clone();
+ crypto.prepareKey();
+ crypto.encryptRC4(b);
+ }
+ if (hexWriting) {
+ ByteBuffer buf = new ByteBuffer();
+ buf.append('<');
+ int len = b.length;
+ for (int k = 0; k < len; ++k)
+ buf.appendHex(b[k]);
+ buf.append('>');
+ os.write(buf.toByteArray());
+ }
+ else
+ os.write(PdfContentByte.escapeString(b));
+ }
+
+ /**
+ * Returns the <CODE>String</CODE> value of the <CODE>PdfString</CODE>-object.
+ *
+ * @return a <CODE>String</CODE>
+ */
+
+ public String toString() {
+ return value;
+ }
+
+ // other methods
+
+ /**
+ * Gets the encoding of this string.
+ *
+ * @return a <CODE>String</CODE>
+ */
+
+ public String getEncoding() {
+ return encoding;
+ }
+
+ public String toUnicodeString() {
+ if (encoding != null && encoding.length() != 0)
+ return value;
+ getBytes();
+ if (bytes.length >= 2 && bytes[0] == (byte)254 && bytes[1] == (byte)255)
+ return PdfEncodings.convertToString(bytes, PdfObject.TEXT_UNICODE);
+ else
+ return PdfEncodings.convertToString(bytes, PdfObject.TEXT_PDFDOCENCODING);
+ }
+
+ void setObjNum(int objNum, int objGen) {
+ this.objNum = objNum;
+ this.objGen = objGen;
+ }
+
+ void decrypt(PdfReader reader) {
+ PdfEncryption decrypt = reader.getDecrypt();
+ if (decrypt != null) {
+ originalValue = value;
+ decrypt.setHashKey(objNum, objGen);
+ decrypt.prepareKey();
+ bytes = PdfEncodings.convertToBytes(value, null);
+ decrypt.encryptRC4(bytes);
+ value = PdfEncodings.convertToString(bytes, null);
+ }
+ }
+
+ public byte[] getBytes() {
+ if (bytes == null) {
+ if (encoding != null && encoding.equals(TEXT_UNICODE) && PdfEncodings.isPdfDocEncoding(value))
+ bytes = PdfEncodings.convertToBytes(value, TEXT_PDFDOCENCODING);
+ else
+ bytes = PdfEncodings.convertToBytes(value, encoding);
+ }
+ return bytes;
+ }
+
+ public byte[] getOriginalBytes() {
+ if (originalValue == null)
+ return getBytes();
+ return PdfEncodings.convertToBytes(originalValue, null);
+ }
+
+ public PdfString setHexWriting(boolean hexWriting) {
+ this.hexWriting = hexWriting;
+ return this;
+ }
+
+ public boolean isHexWriting() {
+ return hexWriting;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/pdf/PdfStructureElement.java b/src/main/java/com/lowagie/text/pdf/PdfStructureElement.java
new file mode 100644
index 0000000..57e8654
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/PdfStructureElement.java
@@ -0,0 +1,130 @@
+/*
+ * $Id: PdfStructureElement.java,v 1.3 2005/11/01 12:27:05 psoares33 Exp $
+ *
+ * Copyright 2005 by Paulo Soares.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf;
+
+/**
+ * This is a node in a document logical structure. It may contain a mark point or it may contain
+ * other nodes.
+ * @author Paulo Soares (psoares@consiste.pt)
+ */
+public class PdfStructureElement extends PdfDictionary {
+
+ /**
+ * Holds value of property kids.
+ */
+ private PdfStructureElement parent;
+ private PdfStructureTreeRoot top;
+
+ /**
+ * Holds value of property reference.
+ */
+ private PdfIndirectReference reference;
+
+ /**
+ * Creates a new instance of PdfStructureElement.
+ * @param parent the parent of this node
+ * @param structureType the type of structure. It may be a standard type or a user type mapped by the role map
+ */
+ public PdfStructureElement(PdfStructureElement parent, PdfName structureType) {
+ top = parent.top;
+ init(parent, structureType);
+ this.parent = parent;
+ put(PdfName.P, parent.reference);
+ }
+
+ /**
+ * Creates a new instance of PdfStructureElement.
+ * @param parent the parent of this node
+ * @param structureType the type of structure. It may be a standard type or a user type mapped by the role map
+ */
+ public PdfStructureElement(PdfStructureTreeRoot parent, PdfName structureType) {
+ top = parent;
+ init(parent, structureType);
+ put(PdfName.P, parent.getReference());
+ }
+
+ private void init(PdfDictionary parent, PdfName structureType) {
+ PdfObject kido = parent.get(PdfName.K);
+ PdfArray kids = null;
+ if (kido != null && !kido.isArray())
+ throw new IllegalArgumentException("The parent has already another function.");
+ if (kido == null) {
+ kids = new PdfArray();
+ parent.put(PdfName.K, kids);
+ }
+ else
+ kids = (PdfArray)kido;
+ kids.add(this);
+ put(PdfName.S, structureType);
+ reference = top.getWriter().getPdfIndirectReference();
+ }
+
+ /**
+ * Gets the parent of this node.
+ * @return the parent of this node
+ */
+ public PdfDictionary getParent() {
+ return parent;
+ }
+
+ void setPageMark(int page, int mark) {
+ if (mark >= 0)
+ put(PdfName.K, new PdfNumber(mark));
+ top.setPageMark(page, reference);
+ }
+
+ /**
+ * Gets the reference this object will be written to.
+ * @return the reference this object will be written to
+ */
+ public PdfIndirectReference getReference() {
+ return this.reference;
+ }
+}
diff --git a/src/main/java/com/lowagie/text/pdf/PdfStructureTreeRoot.java b/src/main/java/com/lowagie/text/pdf/PdfStructureTreeRoot.java
new file mode 100644
index 0000000..e6e8c2c
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/PdfStructureTreeRoot.java
@@ -0,0 +1,146 @@
+/*
+ * $Id: PdfStructureTreeRoot.java,v 1.2 2005/10/18 15:30:42 psoares33 Exp $
+ *
+ * Copyright 2005 by Paulo Soares.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+package com.lowagie.text.pdf;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.io.IOException;
+
+/**
+ * The structure tree root corresponds to the highest hierarchy level in a tagged PDF.
+ * @author Paulo Soares (psoares@consiste.pt)
+ */
+public class PdfStructureTreeRoot extends PdfDictionary {
+
+ private HashMap parentTree = new HashMap();
+ private PdfIndirectReference reference;
+
+ /**
+ * Holds value of property writer.
+ */
+ private PdfWriter writer;
+
+ /** Creates a new instance of PdfStructureTreeRoot */
+ PdfStructureTreeRoot(PdfWriter writer) {
+ super(PdfName.STRUCTTREEROOT);
+ this.writer = writer;
+ reference = writer.getPdfIndirectReference();
+ }
+
+ /**
+ * Maps the user tags to the standard tags. The mapping will allow a standard application to make some sense of the tagged
+ * document whatever the user tags may be.
+ * @param used the user tag
+ * @param standard the standard tag
+ */
+ public void mapRole(PdfName used, PdfName standard) {
+ PdfDictionary rm = (PdfDictionary)get(PdfName.ROLEMAP);
+ if (rm == null) {
+ rm = new PdfDictionary();
+ put(PdfName.ROLEMAP, rm);
+ }
+ rm.put(used, standard);
+ }
+
+ /**
+ * Gets the writer.
+ * @return the writer
+ */
+ public PdfWriter getWriter() {
+ return this.writer;
+ }
+
+ /**
+ * Gets the reference this object will be written to.
+ * @return the reference this object will be written to
+ */
+ public PdfIndirectReference getReference() {
+ return this.reference;
+ }
+
+ void setPageMark(int page, PdfIndirectReference struc) {
+ Integer i = new Integer(page);
+ PdfArray ar = (PdfArray)parentTree.get(i);
+ if (ar == null) {
+ ar = new PdfArray();
+ parentTree.put(i, ar);
+ }
+ ar.add(struc);
+ }
+
+ private void nodeProcess(PdfDictionary struc, PdfIndirectReference reference) throws IOException {
+ PdfObject obj = struc.get(PdfName.K);
+ if (obj != null && obj.isArray() && !((PdfObject)((PdfArray)obj).getArrayList().get(0)).isNumber()) {
+ PdfArray ar = (PdfArray)obj;
+ ArrayList a = ar.getArrayList();
+ for (int k = 0; k < a.size(); ++k) {
+ PdfStructureElement e = (PdfStructureElement)a.get(k);
+ a.set(k, e.getReference());
+ nodeProcess(e, e.getReference());
+ }
+ }
+ if (reference != null)
+ writer.addToBody(struc, reference);
+ }
+
+ void buildTree() throws IOException {
+ HashMap numTree = new HashMap();
+ for (Iterator it = parentTree.keySet().iterator(); it.hasNext();) {
+ Integer i = (Integer)it.next();
+ PdfArray ar = (PdfArray)parentTree.get(i);
+ numTree.put(i, writer.addToBody(ar).getIndirectReference());
+ }
+ PdfDictionary dicTree = PdfNumberTree.writeTree(numTree, writer);
+ if (dicTree != null)
+ put(PdfName.PARENTTREE, writer.addToBody(dicTree).getIndirectReference());
+
+ nodeProcess(this, reference);
+ }
+}
diff --git a/src/main/java/com/lowagie/text/pdf/PdfTable.java b/src/main/java/com/lowagie/text/pdf/PdfTable.java
new file mode 100644
index 0000000..0fa6009
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/PdfTable.java
@@ -0,0 +1,316 @@
+/*
+ * $Id: PdfTable.java,v 1.68 2005/05/04 14:31:53 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 1999, 2000, 2001, 2002 Bruno Lowagie
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+
+import com.lowagie.text.Element;
+import com.lowagie.text.Rectangle;
+import com.lowagie.text.Cell;
+import com.lowagie.text.Row;
+import com.lowagie.text.Table;
+
+/**
+ * <CODE>PdfTable</CODE> is an object that contains the graphics and text of a table.
+ *
+ * @see com.lowagie.text.Table
+ * @see com.lowagie.text.Row
+ * @see com.lowagie.text.Cell
+ * @see PdfCell
+ */
+
+public class PdfTable extends Rectangle {
+
+ // membervariables
+
+ /** this is the number of columns in the table. */
+ private int columns;
+
+ /** this is the ArrayList with all the cell of the table header. */
+ private ArrayList headercells;
+
+ /** this is the ArrayList with all the cells in the table. */
+ private ArrayList cells;
+
+ /** Original table used to build this object*/
+ protected Table table;
+
+ /** Cached column widths. */
+ protected float[] positions;
+
+ // constructors
+
+ /**
+ * Constructs a <CODE>PdfTable</CODE>-object.
+ *
+ * @param table a <CODE>Table</CODE>
+ * @param left the left border on the page
+ * @param right the right border on the page
+ * @param top the start position of the top of the table
+ * @param supportUpdateRowAdditions
+ * if true, table rows will be deleted after building the PdfTable table,
+ * in order to preserve memory and detect future row additions
+ */
+
+ PdfTable(Table table, float left, float right, float top, boolean supportUpdateRowAdditions) {
+ // constructs a Rectangle (the bottomvalue will be changed afterwards)
+ super(left, top, right, top);
+ this.table = table;
+ table.complete();
+
+ // copying the attributes from class Table
+ cloneNonPositionParameters(table);
+
+ this.columns = table.columns();
+ positions = table.getWidths(left, right - left);
+
+ // initialisation of some parameters
+ setLeft(positions[0]);
+ setRight(positions[positions.length - 1]);
+
+ headercells = new ArrayList();
+ cells = new ArrayList();
+
+ updateRowAdditionsInternal();
+ if (supportUpdateRowAdditions) {
+ table.deleteAllRows();
+ }
+ }
+
+ // methods
+
+ /**
+ * Updates the table row additions in the underlying table object and deletes all table rows,
+ * in order to preserve memory and detect future row additions.
+ * <p><b>Pre-requisite</b>: the object must have been built with the parameter <code>supportUpdateRowAdditions</code> equals to true.
+ */
+
+ void updateRowAdditions() {
+ table.complete();
+ updateRowAdditionsInternal();
+ table.deleteAllRows();
+ }
+
+ /**
+ * Updates the table row additions in the underlying table object
+ */
+
+ private void updateRowAdditionsInternal() {
+ // correct table : fill empty cells/ parse table in table
+ Row row;
+ int prevRows = rows();
+ int rowNumber = 0;
+ int groupNumber = 0;
+ boolean groupChange;
+ int firstDataRow = table.firstDataRow();
+ Cell cell;
+ PdfCell currentCell;
+ ArrayList newCells = new ArrayList();
+ int rows = table.size() + 1;
+ float[] offsets = new float[rows];
+ for (int i = 0; i < rows; i++) {
+ offsets[i] = bottom();
+ }
+
+ // loop over all the rows
+ for (Iterator rowIterator = table.iterator(); rowIterator.hasNext(); ) {
+ groupChange = false;
+ row = (Row) rowIterator.next();
+ if (row.isEmpty()) {
+ if (rowNumber < rows - 1 && offsets[rowNumber + 1] > offsets[rowNumber]) offsets[rowNumber + 1] = offsets[rowNumber];
+ }
+ else {
+ for(int i = 0; i < row.columns(); i++) {
+ cell = (Cell) row.getCell(i);
+ if (cell != null) {
+ currentCell = new PdfCell(cell, rowNumber+prevRows, positions[i], positions[i + cell.colspan()], offsets[rowNumber], cellspacing(), cellpadding());
+ try {
+ if (offsets[rowNumber] - currentCell.height() - cellpadding() < offsets[rowNumber + currentCell.rowspan()]) {
+ offsets[rowNumber + currentCell.rowspan()] = offsets[rowNumber] - currentCell.height() - cellpadding();
+ }
+ }
+ catch(ArrayIndexOutOfBoundsException aioobe) {
+ if (offsets[rowNumber] - currentCell.height() < offsets[rows - 1]) {
+ offsets[rows - 1] = offsets[rowNumber] - currentCell.height();
+ }
+ }
+ if (rowNumber < firstDataRow) {
+ currentCell.setHeader();
+ headercells.add(currentCell);
+ }
+ currentCell.setGroupNumber(groupNumber);
+ groupChange |= cell.getGroupChange();
+ newCells.add(currentCell);
+ }
+ }
+ }
+ rowNumber++;
+ if( groupChange ) groupNumber++;
+ }
+
+ // loop over all the cells
+ int n = newCells.size();
+ for (int i = 0; i < n; i++) {
+ currentCell = (PdfCell) newCells.get(i);
+ try {
+ currentCell.setBottom(offsets[currentCell.rownumber()-prevRows + currentCell.rowspan()]);
+ }
+ catch(ArrayIndexOutOfBoundsException aioobe) {
+ currentCell.setBottom(offsets[rows - 1]);
+ }
+ }
+ cells.addAll(newCells);
+ setBottom(offsets[rows - 1]);
+ }
+
+ /**
+ * Get the number of rows
+ */
+
+ int rows() {
+ return cells.size() == 0 ? 0 : ((PdfCell)cells.get(cells.size()-1)).rownumber()+1;
+ }
+
+ /** @see com.lowagie.text.Element#type() */
+ public int type() {
+ return Element.TABLE;
+ }
+
+ /**
+ * Returns the arraylist with the cells of the table header.
+ *
+ * @return an <CODE>ArrayList</CODE>
+ */
+
+ ArrayList getHeaderCells() {
+ return headercells;
+ }
+
+ /**
+ * Checks if there is a table header.
+ *
+ * @return an <CODE>ArrayList</CODE>
+ */
+
+ boolean hasHeader() {
+ return headercells.size() > 0;
+ }
+
+ /**
+ * Returns the arraylist with the cells of the table.
+ *
+ * @return an <CODE>ArrayList</CODE>
+ */
+
+ ArrayList getCells() {
+ return cells;
+ }
+
+ /**
+ * Returns the number of columns of the table.
+ *
+ * @return the number of columns
+ */
+
+ int columns() {
+ return columns;
+ }
+
+ /**
+ * Returns the cellpadding of the table.
+ *
+ * @return the cellpadding
+ */
+
+ final float cellpadding() {
+ return table.cellpadding();
+ }
+
+ /**
+ * Returns the cellspacing of the table.
+ *
+ * @return the cellspacing
+ */
+
+ final float cellspacing() {
+ return table.cellspacing();
+ }
+
+ /**
+ * Checks if this <CODE>Table</CODE> has to fit a page.
+ *
+ * @return true if the table may not be split
+ */
+
+ public final boolean hasToFitPageTable() {
+ return table.hasToFitPageTable();
+ }
+
+ /**
+ * Checks if the cells of this <CODE>Table</CODE> have to fit a page.
+ *
+ * @return true if the cells may not be split
+ */
+
+ public final boolean hasToFitPageCells() {
+ return table.hasToFitPageCells();
+ }
+
+ /**
+ * Gets the offset of this table.
+ *
+ * @return the space between this table and the previous element.
+ */
+ public float getOffset() {
+ return table.getOffset();
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/pdf/PdfTemplate.java b/src/main/java/com/lowagie/text/pdf/PdfTemplate.java
new file mode 100644
index 0000000..e7ba7ba
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/PdfTemplate.java
@@ -0,0 +1,267 @@
+/*
+ * $Id: PdfTemplate.java,v 1.61 2006/03/02 17:56:30 psoares33 Exp $
+ * $Name: $
+ *
+ * Copyright 2001, 2002 Paulo Soares
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf;
+import java.io.IOException;
+
+import com.lowagie.text.Rectangle;
+
+/**
+ * Implements the form XObject.
+ */
+
+public class PdfTemplate extends PdfContentByte {
+ public static final int TYPE_TEMPLATE = 1;
+ public static final int TYPE_IMPORTED = 2;
+ public static final int TYPE_PATTERN = 3;
+ protected int type;
+ /** The indirect reference to this template */
+ protected PdfIndirectReference thisReference;
+
+ /** The resources used by this template */
+ protected PageResources pageResources;
+
+
+ /** The bounding box of this template */
+ protected Rectangle bBox = new Rectangle(0, 0);
+
+ protected PdfArray matrix;
+
+ protected PdfTransparencyGroup group;
+
+ protected PdfOCG layer;
+
+ /**
+ *Creates a <CODE>PdfTemplate</CODE>.
+ */
+
+ protected PdfTemplate() {
+ super(null);
+ type = TYPE_TEMPLATE;
+ }
+
+ /**
+ * Creates new PdfTemplate
+ *
+ * @param wr the <CODE>PdfWriter</CODE>
+ */
+
+ PdfTemplate(PdfWriter wr) {
+ super(wr);
+ type = TYPE_TEMPLATE;
+ pageResources = new PageResources();
+ pageResources.addDefaultColor(wr.getDefaultColorspace());
+ thisReference = writer.getPdfIndirectReference();
+ }
+
+ /**
+ * Sets the bounding width of this template.
+ *
+ * @param width the bounding width
+ */
+
+ public void setWidth(float width) {
+ bBox.setLeft(0);
+ bBox.setRight(width);
+ }
+
+ /**
+ * Sets the bounding heigth of this template.
+ *
+ * @param height the bounding height
+ */
+
+ public void setHeight(float height) {
+ bBox.setBottom(0);
+ bBox.setTop(height);
+ }
+
+ /**
+ * Gets the bounding width of this template.
+ *
+ * @return width the bounding width
+ */
+ public float getWidth() {
+ return bBox.width();
+ }
+
+ /**
+ * Gets the bounding heigth of this template.
+ *
+ * @return heigth the bounding height
+ */
+
+ public float getHeight() {
+ return bBox.height();
+ }
+
+ public Rectangle getBoundingBox() {
+ return bBox;
+ }
+
+ public void setBoundingBox(Rectangle bBox) {
+ this.bBox = bBox;
+ }
+
+ /**
+ * Sets the layer this template belongs to.
+ * @param layer the layer this template belongs to
+ */
+ public void setLayer(PdfOCG layer) {
+ this.layer = layer;
+ }
+
+ /**
+ * Gets the layer this template belongs to.
+ * @return the layer this template belongs to or <code>null</code> for no layer defined
+ */
+ public PdfOCG getLayer() {
+ return layer;
+ }
+
+ public void setMatrix(float a, float b, float c, float d, float e, float f) {
+ matrix = new PdfArray();
+ matrix.add(new PdfNumber(a));
+ matrix.add(new PdfNumber(b));
+ matrix.add(new PdfNumber(c));
+ matrix.add(new PdfNumber(d));
+ matrix.add(new PdfNumber(e));
+ matrix.add(new PdfNumber(f));
+ }
+
+ PdfArray getMatrix() {
+ return matrix;
+ }
+
+ /**
+ * Gets the indirect reference to this template.
+ *
+ * @return the indirect reference to this template
+ */
+
+ public PdfIndirectReference getIndirectReference() {
+ return thisReference;
+ }
+
+ public void beginVariableText() {
+ content.append("/Tx BMC ");
+ }
+
+ public void endVariableText() {
+ content.append("EMC ");
+ }
+
+ /**
+ * Constructs the resources used by this template.
+ *
+ * @return the resources used by this template
+ */
+
+ PdfObject getResources() {
+ return getPageResources().getResources();
+ }
+
+ /**
+ * Gets the stream representing this template.
+ *
+ * @return the stream representing this template
+ */
+
+ PdfStream getFormXObject() throws IOException {
+ return new PdfFormXObject(this);
+ }
+
+ /**
+ * Gets a duplicate of this <CODE>PdfTemplate</CODE>. All
+ * the members are copied by reference but the buffer stays different.
+ * @return a copy of this <CODE>PdfTemplate</CODE>
+ */
+
+ public PdfContentByte getDuplicate() {
+ PdfTemplate tpl = new PdfTemplate();
+ tpl.writer = writer;
+ tpl.pdf = pdf;
+ tpl.thisReference = thisReference;
+ tpl.pageResources = pageResources;
+ tpl.bBox = new Rectangle(bBox);
+ tpl.group = group;
+ tpl.layer = layer;
+ if (matrix != null) {
+ tpl.matrix = new PdfArray(matrix);
+ }
+ tpl.separator = separator;
+ return tpl;
+ }
+
+ public int getType() {
+ return type;
+ }
+
+ PageResources getPageResources() {
+ return pageResources;
+ }
+
+ /** Getter for property group.
+ * @return Value of property group.
+ *
+ */
+ public PdfTransparencyGroup getGroup() {
+ return this.group;
+ }
+
+ /** Setter for property group.
+ * @param group New value of property group.
+ *
+ */
+ public void setGroup(PdfTransparencyGroup group) {
+ this.group = group;
+ }
+
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/pdf/PdfTextArray.java b/src/main/java/com/lowagie/text/pdf/PdfTextArray.java
new file mode 100644
index 0000000..16901bb
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/PdfTextArray.java
@@ -0,0 +1,99 @@
+/*
+ * $Id: PdfTextArray.java,v 1.58 2005/05/04 14:32:21 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 1999, 2000, 2001, 2002 Bruno Lowagie
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf;
+
+import java.util.ArrayList;
+
+/**
+ * <CODE>PdfTextArray</CODE> defines an array with displacements and <CODE>PdfString</CODE>-objects.
+ * <P>
+ * A <CODE>TextArray</CODE> is used with the operator <VAR>TJ</VAR> in <CODE>PdfText</CODE>.
+ * The first object in this array has to be a <CODE>PdfString</CODE>;
+ * see reference manual version 1.3 section 8.7.5, pages 346-347.
+ */
+
+public class PdfTextArray{
+ ArrayList arrayList = new ArrayList();
+ // constructors
+
+
+ public PdfTextArray(String str) {
+ arrayList.add(str);
+ }
+
+ public PdfTextArray() {
+ }
+
+/**
+ * Adds a <CODE>PdfNumber</CODE> to the <CODE>PdfArray</CODE>.
+ *
+ * @param number displacement of the string
+ */
+
+ public void add(PdfNumber number)
+ {
+ arrayList.add(new Float(number.doubleValue()));
+ }
+
+ public void add(float number)
+ {
+ arrayList.add(new Float(number));
+ }
+
+ public void add(String str)
+ {
+ arrayList.add(str);
+ }
+
+ ArrayList getArrayList() {
+ return arrayList;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/pdf/PdfTransition.java b/src/main/java/com/lowagie/text/pdf/PdfTransition.java
new file mode 100644
index 0000000..038d4fb
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/PdfTransition.java
@@ -0,0 +1,253 @@
+/*
+ * Copyright 2002 by Josselin PUJO.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf;
+
+public class PdfTransition {
+ /**
+ * Out Vertical Split
+ */
+ public static final int SPLITVOUT = 1;
+ /**
+ * Out Horizontal Split
+ */
+ public static final int SPLITHOUT = 2;
+ /**
+ * In Vertical Split
+ */
+ public static final int SPLITVIN = 3;
+ /**
+ * IN Horizontal Split
+ */
+ public static final int SPLITHIN = 4;
+ /**
+ * Vertical Blinds
+ */
+ public static final int BLINDV = 5;
+ /**
+ * Vertical Blinds
+ */
+ public static final int BLINDH = 6;
+ /**
+ * Inward Box
+ */
+ public static final int INBOX = 7;
+ /**
+ * Outward Box
+ */
+ public static final int OUTBOX = 8;
+ /**
+ * Left-Right Wipe
+ */
+ public static final int LRWIPE = 9;
+ /**
+ * Right-Left Wipe
+ */
+ public static final int RLWIPE = 10;
+ /**
+ * Bottom-Top Wipe
+ */
+ public static final int BTWIPE = 11;
+ /**
+ * Top-Bottom Wipe
+ */
+ public static final int TBWIPE = 12;
+ /**
+ * Dissolve
+ */
+ public static final int DISSOLVE = 13;
+ /**
+ * Left-Right Glitter
+ */
+ public static final int LRGLITTER = 14;
+ /**
+ * Top-Bottom Glitter
+ */
+ public static final int TBGLITTER = 15;
+ /**
+ * Diagonal Glitter
+ */
+ public static final int DGLITTER = 16;
+
+ /**
+ * duration of the transition effect
+ */
+ protected int duration;
+ /**
+ * type of the transition effect
+ */
+ protected int type;
+
+ /**
+ * Constructs a <CODE>Transition</CODE>.
+ *
+ */
+ public PdfTransition() {
+ this(BLINDH);
+ }
+
+ /**
+ * Constructs a <CODE>Transition</CODE>.
+ *
+ *@param type type of the transition effect
+ */
+ public PdfTransition(int type) {
+ this(type,1);
+ }
+
+ /**
+ * Constructs a <CODE>Transition</CODE>.
+ *
+ *@param type type of the transition effect
+ *@param duration duration of the transition effect
+ */
+ public PdfTransition(int type, int duration) {
+ this.duration = duration;
+ this.type = type;
+ }
+
+
+ public int getDuration() {
+ return duration;
+ }
+
+
+ public int getType() {
+ return type;
+ }
+
+ public PdfDictionary getTransitionDictionary() {
+ PdfDictionary trans = new PdfDictionary(PdfName.TRANS);
+ switch (type) {
+ case SPLITVOUT:
+ trans.put(PdfName.S,PdfName.SPLIT);
+ trans.put(PdfName.D,new PdfNumber(duration));
+ trans.put(PdfName.DM,PdfName.V);
+ trans.put(PdfName.M,PdfName.O);
+ break;
+ case SPLITHOUT:
+ trans.put(PdfName.S,PdfName.SPLIT);
+ trans.put(PdfName.D,new PdfNumber(duration));
+ trans.put(PdfName.DM,PdfName.H);
+ trans.put(PdfName.M,PdfName.O);
+ break;
+ case SPLITVIN:
+ trans.put(PdfName.S,PdfName.SPLIT);
+ trans.put(PdfName.D,new PdfNumber(duration));
+ trans.put(PdfName.DM,PdfName.V);
+ trans.put(PdfName.M,PdfName.I);
+ break;
+ case SPLITHIN:
+ trans.put(PdfName.S,PdfName.SPLIT);
+ trans.put(PdfName.D,new PdfNumber(duration));
+ trans.put(PdfName.DM,PdfName.H);
+ trans.put(PdfName.M,PdfName.I);
+ break;
+ case BLINDV:
+ trans.put(PdfName.S,PdfName.BLINDS);
+ trans.put(PdfName.D,new PdfNumber(duration));
+ trans.put(PdfName.DM,PdfName.V);
+ break;
+ case BLINDH:
+ trans.put(PdfName.S,PdfName.BLINDS);
+ trans.put(PdfName.D,new PdfNumber(duration));
+ trans.put(PdfName.DM,PdfName.H);
+ break;
+ case INBOX:
+ trans.put(PdfName.S,PdfName.BOX);
+ trans.put(PdfName.D,new PdfNumber(duration));
+ trans.put(PdfName.M,PdfName.I);
+ break;
+ case OUTBOX:
+ trans.put(PdfName.S,PdfName.BOX);
+ trans.put(PdfName.D,new PdfNumber(duration));
+ trans.put(PdfName.M,PdfName.O);
+ break;
+ case LRWIPE:
+ trans.put(PdfName.S,PdfName.WIPE);
+ trans.put(PdfName.D,new PdfNumber(duration));
+ trans.put(PdfName.DI,new PdfNumber(0));
+ break;
+ case RLWIPE:
+ trans.put(PdfName.S,PdfName.WIPE);
+ trans.put(PdfName.D,new PdfNumber(duration));
+ trans.put(PdfName.DI,new PdfNumber(180));
+ break;
+ case BTWIPE:
+ trans.put(PdfName.S,PdfName.WIPE);
+ trans.put(PdfName.D,new PdfNumber(duration));
+ trans.put(PdfName.DI,new PdfNumber(90));
+ break;
+ case TBWIPE:
+ trans.put(PdfName.S,PdfName.WIPE);
+ trans.put(PdfName.D,new PdfNumber(duration));
+ trans.put(PdfName.DI,new PdfNumber(270));
+ break;
+ case DISSOLVE:
+ trans.put(PdfName.S,PdfName.DISSOLVE);
+ trans.put(PdfName.D,new PdfNumber(duration));
+ break;
+ case LRGLITTER:
+ trans.put(PdfName.S,PdfName.GLITTER);
+ trans.put(PdfName.D,new PdfNumber(duration));
+ trans.put(PdfName.DI,new PdfNumber(0));
+ break;
+ case TBGLITTER:
+ trans.put(PdfName.S,PdfName.GLITTER);
+ trans.put(PdfName.D,new PdfNumber(duration));
+ trans.put(PdfName.DI,new PdfNumber(270));
+ break;
+ case DGLITTER:
+ trans.put(PdfName.S,PdfName.GLITTER);
+ trans.put(PdfName.D,new PdfNumber(duration));
+ trans.put(PdfName.DI,new PdfNumber(315));
+ break;
+ }
+ return trans;
+ }
+}
+
diff --git a/src/main/java/com/lowagie/text/pdf/PdfTransparencyGroup.java b/src/main/java/com/lowagie/text/pdf/PdfTransparencyGroup.java
new file mode 100644
index 0000000..873b065
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/PdfTransparencyGroup.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright 2003 Paulo Soares
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+package com.lowagie.text.pdf;
+
+/** The transparency group dictionary.
+ *
+ * @author Paulo Soares (psoares@consiste.pt)
+ */
+public class PdfTransparencyGroup extends PdfDictionary {
+
+ /**
+ * Constructs a transparencyGroup.
+ */
+ public PdfTransparencyGroup() {
+ super();
+ put(PdfName.S, PdfName.TRANSPARENCY);
+ }
+
+ /**
+ * Determining the initial backdrop against which its stack is composited.
+ * @param isolated
+ */
+ public void setIsolated(boolean isolated) {
+ if (isolated)
+ put(PdfName.I, PdfBoolean.PDFTRUE);
+ else
+ remove(PdfName.I);
+ }
+
+ /**
+ * Determining whether the objects within the stack are composited with one another or only with the group's backdrop.
+ * @param knockout
+ */
+ public void setKnockout(boolean knockout) {
+ if (knockout)
+ put(PdfName.K, PdfBoolean.PDFTRUE);
+ else
+ remove(PdfName.K);
+ }
+
+}
diff --git a/src/main/java/com/lowagie/text/pdf/PdfWriter.java b/src/main/java/com/lowagie/text/pdf/PdfWriter.java
new file mode 100644
index 0000000..ed93b71
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/PdfWriter.java
@@ -0,0 +1,2752 @@
+/*
+ * $Id: PdfWriter.java,v 1.114 2006/06/04 22:23:33 psoares33 Exp $
+ * $Name: $
+ *
+ * Copyright 1999, 2000, 2001, 2002 Bruno Lowagie
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf;
+
+import java.awt.Color;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.TreeMap;
+import java.util.TreeSet;
+import java.util.HashSet;
+
+import com.lowagie.text.DocListener;
+import com.lowagie.text.DocWriter;
+import com.lowagie.text.Document;
+import com.lowagie.text.DocumentException;
+import com.lowagie.text.ExceptionConverter;
+import com.lowagie.text.Image;
+import com.lowagie.text.ImgWMF;
+import com.lowagie.text.Rectangle;
+import com.lowagie.text.Table;
+import com.lowagie.text.ImgPostscript;
+import com.lowagie.text.pdf.events.PdfPageEventForwarder;
+
+/**
+ * A <CODE>DocWriter</CODE> class for PDF.
+ * <P>
+ * When this <CODE>PdfWriter</CODE> is added
+ * to a certain <CODE>PdfDocument</CODE>, the PDF representation of every Element
+ * added to this Document will be written to the outputstream.</P>
+ */
+
+public class PdfWriter extends DocWriter {
+
+ // inner classes
+
+ /**
+ * This class generates the structure of a PDF document.
+ * <P>
+ * This class covers the third section of Chapter 5 in the 'Portable Document Format
+ * Reference Manual version 1.3' (page 55-60). It contains the body of a PDF document
+ * (section 5.14) and it can also generate a Cross-reference Table (section 5.15).
+ *
+ * @see PdfWriter
+ * @see PdfObject
+ * @see PdfIndirectObject
+ */
+
+ public static class PdfBody {
+
+ // inner classes
+
+ /**
+ * <CODE>PdfCrossReference</CODE> is an entry in the PDF Cross-Reference table.
+ */
+
+ static class PdfCrossReference implements Comparable {
+
+ // membervariables
+ private int type;
+
+ /** Byte offset in the PDF file. */
+ private int offset;
+
+ private int refnum;
+ /** generation of the object. */
+ private int generation;
+
+ // constructors
+ /**
+ * Constructs a cross-reference element for a PdfIndirectObject.
+ * @param refnum
+ * @param offset byte offset of the object
+ * @param generation generationnumber of the object
+ */
+
+ PdfCrossReference(int refnum, int offset, int generation) {
+ type = 0;
+ this.offset = offset;
+ this.refnum = refnum;
+ this.generation = generation;
+ }
+
+ /**
+ * Constructs a cross-reference element for a PdfIndirectObject.
+ * @param refnum
+ * @param offset byte offset of the object
+ */
+
+ PdfCrossReference(int refnum, int offset) {
+ type = 1;
+ this.offset = offset;
+ this.refnum = refnum;
+ this.generation = 0;
+ }
+
+ PdfCrossReference(int type, int refnum, int offset, int generation) {
+ this.type = type;
+ this.offset = offset;
+ this.refnum = refnum;
+ this.generation = generation;
+ }
+
+ int getRefnum() {
+ return refnum;
+ }
+
+ /**
+ * Returns the PDF representation of this <CODE>PdfObject</CODE>.
+ * @param os
+ * @throws IOException
+ */
+
+ public void toPdf(OutputStream os) throws IOException {
+ // This code makes it more difficult to port the lib to JDK1.1.x:
+ // StringBuffer off = new StringBuffer("0000000000").append(offset);
+ // off.delete(0, off.length() - 10);
+ // StringBuffer gen = new StringBuffer("00000").append(generation);
+ // gen.delete(0, gen.length() - 5);
+ // so it was changed into this:
+ String s = "0000000000" + offset;
+ StringBuffer off = new StringBuffer(s.substring(s.length() - 10));
+ s = "00000" + generation;
+ String gen = s.substring(s.length() - 5);
+ if (generation == 65535) {
+ os.write(getISOBytes(off.append(' ').append(gen).append(" f \n").toString()));
+ }
+ else
+ os.write(getISOBytes(off.append(' ').append(gen).append(" n \n").toString()));
+ }
+
+ /**
+ * Writes PDF syntax to the OutputStream
+ * @param midSize
+ * @param os
+ * @throws IOException
+ */
+ public void toPdf(int midSize, OutputStream os) throws IOException {
+ os.write((byte)type);
+ while (--midSize >= 0)
+ os.write((byte)((offset >>> (8 * midSize)) & 0xff));
+ os.write((byte)((generation >>> 8) & 0xff));
+ os.write((byte)(generation & 0xff));
+ }
+
+ /**
+ * @see java.lang.Comparable#compareTo(java.lang.Object)
+ */
+ public int compareTo(Object o) {
+ PdfCrossReference other = (PdfCrossReference)o;
+ return (refnum < other.refnum ? -1 : (refnum==other.refnum ? 0 : 1));
+ }
+
+ /**
+ * @see java.lang.Object#equals(java.lang.Object)
+ */
+ public boolean equals(Object obj) {
+ if (obj instanceof PdfCrossReference) {
+ PdfCrossReference other = (PdfCrossReference)obj;
+ return (refnum == other.refnum);
+ }
+ else
+ return false;
+ }
+
+ }
+
+ // membervariables
+
+ /** array containing the cross-reference table of the normal objects. */
+ private TreeSet xrefs;
+ private int refnum;
+ /** the current byteposition in the body. */
+ private int position;
+ private PdfWriter writer;
+ // constructors
+
+ /**
+ * Constructs a new <CODE>PdfBody</CODE>.
+ * @param writer
+ */
+ PdfBody(PdfWriter writer) {
+ xrefs = new TreeSet();
+ xrefs.add(new PdfCrossReference(0, 0, 65535));
+ position = writer.getOs().getCounter();
+ refnum = 1;
+ this.writer = writer;
+ }
+
+ void setRefnum(int refnum) {
+ this.refnum = refnum;
+ }
+
+ // methods
+
+ private static final int OBJSINSTREAM = 200;
+
+ private ByteBuffer index;
+ private ByteBuffer streamObjects;
+ private int currentObjNum;
+ private int numObj = 0;
+
+ private PdfWriter.PdfBody.PdfCrossReference addToObjStm(PdfObject obj, int nObj) throws IOException {
+ if (numObj >= OBJSINSTREAM)
+ flushObjStm();
+ if (index == null) {
+ index = new ByteBuffer();
+ streamObjects = new ByteBuffer();
+ currentObjNum = getIndirectReferenceNumber();
+ numObj = 0;
+ }
+ int p = streamObjects.size();
+ int idx = numObj++;
+ PdfEncryption enc = writer.crypto;
+ writer.crypto = null;
+ obj.toPdf(writer, streamObjects);
+ writer.crypto = enc;
+ streamObjects.append(' ');
+ index.append(nObj).append(' ').append(p).append(' ');
+ return new PdfWriter.PdfBody.PdfCrossReference(2, nObj, currentObjNum, idx);
+ }
+
+ private void flushObjStm() throws IOException {
+ if (numObj == 0)
+ return;
+ int first = index.size();
+ index.append(streamObjects);
+ PdfStream stream = new PdfStream(index.toByteArray());
+ stream.flateCompress();
+ stream.put(PdfName.TYPE, PdfName.OBJSTM);
+ stream.put(PdfName.N, new PdfNumber(numObj));
+ stream.put(PdfName.FIRST, new PdfNumber(first));
+ add(stream, currentObjNum);
+ index = null;
+ streamObjects = null;
+ numObj = 0;
+ }
+
+ /**
+ * Adds a <CODE>PdfObject</CODE> to the body.
+ * <P>
+ * This methods creates a <CODE>PdfIndirectObject</CODE> with a
+ * certain number, containing the given <CODE>PdfObject</CODE>.
+ * It also adds a <CODE>PdfCrossReference</CODE> for this object
+ * to an <CODE>ArrayList</CODE> that will be used to build the
+ * Cross-reference Table.
+ *
+ * @param object a <CODE>PdfObject</CODE>
+ * @return a <CODE>PdfIndirectObject</CODE>
+ * @throws IOException
+ */
+
+ PdfIndirectObject add(PdfObject object) throws IOException {
+ return add(object, getIndirectReferenceNumber());
+ }
+
+ PdfIndirectObject add(PdfObject object, boolean inObjStm) throws IOException {
+ return add(object, getIndirectReferenceNumber(), inObjStm);
+ }
+
+ /**
+ * Gets a PdfIndirectReference for an object that will be created in the future.
+ * @return a PdfIndirectReference
+ */
+
+ PdfIndirectReference getPdfIndirectReference() {
+ return new PdfIndirectReference(0, getIndirectReferenceNumber());
+ }
+
+ int getIndirectReferenceNumber() {
+ int n = refnum++;
+ xrefs.add(new PdfCrossReference(n, 0, 65536));
+ return n;
+ }
+
+ /**
+ * Adds a <CODE>PdfObject</CODE> to the body given an already existing
+ * PdfIndirectReference.
+ * <P>
+ * This methods creates a <CODE>PdfIndirectObject</CODE> with the number given by
+ * <CODE>ref</CODE>, containing the given <CODE>PdfObject</CODE>.
+ * It also adds a <CODE>PdfCrossReference</CODE> for this object
+ * to an <CODE>ArrayList</CODE> that will be used to build the
+ * Cross-reference Table.
+ *
+ * @param object a <CODE>PdfObject</CODE>
+ * @param ref a <CODE>PdfIndirectReference</CODE>
+ * @return a <CODE>PdfIndirectObject</CODE>
+ * @throws IOException
+ */
+
+ PdfIndirectObject add(PdfObject object, PdfIndirectReference ref) throws IOException {
+ return add(object, ref.getNumber());
+ }
+
+ PdfIndirectObject add(PdfObject object, PdfIndirectReference ref, boolean inObjStm) throws IOException {
+ return add(object, ref.getNumber(), inObjStm);
+ }
+
+ PdfIndirectObject add(PdfObject object, int refNumber) throws IOException {
+ return add(object, refNumber, true); // to false
+ }
+
+ PdfIndirectObject add(PdfObject object, int refNumber, boolean inObjStm) throws IOException {
+ if (inObjStm && object.canBeInObjStm() && writer.isFullCompression()) {
+ PdfCrossReference pxref = addToObjStm(object, refNumber);
+ PdfIndirectObject indirect = new PdfIndirectObject(refNumber, object, writer);
+ if (!xrefs.add(pxref)) {
+ xrefs.remove(pxref);
+ xrefs.add(pxref);
+ }
+ return indirect;
+ }
+ else {
+ PdfIndirectObject indirect = new PdfIndirectObject(refNumber, object, writer);
+ PdfCrossReference pxref = new PdfCrossReference(refNumber, position);
+ if (!xrefs.add(pxref)) {
+ xrefs.remove(pxref);
+ xrefs.add(pxref);
+ }
+ indirect.writeTo(writer.getOs());
+ position = writer.getOs().getCounter();
+ return indirect;
+ }
+ }
+
+ /**
+ * Adds a <CODE>PdfResources</CODE> object to the body.
+ *
+ * @param object the <CODE>PdfResources</CODE>
+ * @return a <CODE>PdfIndirectObject</CODE>
+ */
+
+// PdfIndirectObject add(PdfResources object) {
+// return add(object);
+// }
+
+ /**
+ * Adds a <CODE>PdfPages</CODE> object to the body.
+ *
+ * @param object the root of the document
+ * @return a <CODE>PdfIndirectObject</CODE>
+ */
+
+// PdfIndirectObject add(PdfPages object) throws IOException {
+// PdfIndirectObject indirect = new PdfIndirectObject(PdfWriter.ROOT, object, writer);
+// rootOffset = position;
+// indirect.writeTo(writer.getOs());
+// position = writer.getOs().getCounter();
+// return indirect;
+// }
+
+ /**
+ * Returns the offset of the Cross-Reference table.
+ *
+ * @return an offset
+ */
+
+ int offset() {
+ return position;
+ }
+
+ /**
+ * Returns the total number of objects contained in the CrossReferenceTable of this <CODE>Body</CODE>.
+ *
+ * @return a number of objects
+ */
+
+ int size() {
+ return Math.max(((PdfCrossReference)xrefs.last()).getRefnum() + 1, refnum);
+ }
+
+ /**
+ * Returns the CrossReferenceTable of the <CODE>Body</CODE>.
+ * @param os
+ * @param root
+ * @param info
+ * @param encryption
+ * @param fileID
+ * @param prevxref
+ * @throws IOException
+ */
+
+ void writeCrossReferenceTable(OutputStream os, PdfIndirectReference root, PdfIndirectReference info, PdfIndirectReference encryption, PdfObject fileID, int prevxref) throws IOException {
+ int refNumber = 0;
+ if (writer.isFullCompression()) {
+ flushObjStm();
+ refNumber = getIndirectReferenceNumber();
+ xrefs.add(new PdfCrossReference(refNumber, position));
+ }
+ PdfCrossReference entry = (PdfCrossReference)xrefs.first();
+ int first = entry.getRefnum();
+ int len = 0;
+ ArrayList sections = new ArrayList();
+ for (Iterator i = xrefs.iterator(); i.hasNext(); ) {
+ entry = (PdfCrossReference)i.next();
+ if (first + len == entry.getRefnum())
+ ++len;
+ else {
+ sections.add(new Integer(first));
+ sections.add(new Integer(len));
+ first = entry.getRefnum();
+ len = 1;
+ }
+ }
+ sections.add(new Integer(first));
+ sections.add(new Integer(len));
+ if (writer.isFullCompression()) {
+ int mid = 4;
+ int mask = 0xff000000;
+ for (; mid > 1; --mid) {
+ if ((mask & position) != 0)
+ break;
+ mask >>>= 8;
+ }
+ ByteBuffer buf = new ByteBuffer();
+
+ for (Iterator i = xrefs.iterator(); i.hasNext(); ) {
+ entry = (PdfCrossReference) i.next();
+ entry.toPdf(mid, buf);
+ }
+ PdfStream xr = new PdfStream(buf.toByteArray());
+ buf = null;
+ xr.flateCompress();
+ xr.put(PdfName.SIZE, new PdfNumber(size()));
+ xr.put(PdfName.ROOT, root);
+ if (info != null) {
+ xr.put(PdfName.INFO, info);
+ }
+ if (encryption != null)
+ xr.put(PdfName.ENCRYPT, encryption);
+ if (fileID != null)
+ xr.put(PdfName.ID, fileID);
+ xr.put(PdfName.W, new PdfArray(new int[]{1, mid, 2}));
+ xr.put(PdfName.TYPE, PdfName.XREF);
+ PdfArray idx = new PdfArray();
+ for (int k = 0; k < sections.size(); ++k)
+ idx.add(new PdfNumber(((Integer)sections.get(k)).intValue()));
+ xr.put(PdfName.INDEX, idx);
+ if (prevxref > 0)
+ xr.put(PdfName.PREV, new PdfNumber(prevxref));
+ PdfEncryption enc = writer.crypto;
+ writer.crypto = null;
+ PdfIndirectObject indirect = new PdfIndirectObject(refNumber, xr, writer);
+ indirect.writeTo(writer.getOs());
+ writer.crypto = enc;
+ }
+ else {
+ os.write(getISOBytes("xref\n"));
+ Iterator i = xrefs.iterator();
+ for (int k = 0; k < sections.size(); k += 2) {
+ first = ((Integer)sections.get(k)).intValue();
+ len = ((Integer)sections.get(k + 1)).intValue();
+ os.write(getISOBytes(String.valueOf(first)));
+ os.write(getISOBytes(" "));
+ os.write(getISOBytes(String.valueOf(len)));
+ os.write('\n');
+ while (len-- > 0) {
+ entry = (PdfCrossReference) i.next();
+ entry.toPdf(os);
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * <CODE>PdfTrailer</CODE> is the PDF Trailer object.
+ * <P>
+ * This object is described in the 'Portable Document Format Reference Manual version 1.3'
+ * section 5.16 (page 59-60).
+ */
+
+ static class PdfTrailer extends PdfDictionary {
+
+ // membervariables
+
+ int offset;
+
+ // constructors
+
+ /**
+ * Constructs a PDF-Trailer.
+ *
+ * @param size the number of entries in the <CODE>PdfCrossReferenceTable</CODE>
+ * @param offset offset of the <CODE>PdfCrossReferenceTable</CODE>
+ * @param root an indirect reference to the root of the PDF document
+ * @param info an indirect reference to the info object of the PDF document
+ * @param encryption
+ * @param fileID
+ * @param prevxref
+ */
+
+ PdfTrailer(int size, int offset, PdfIndirectReference root, PdfIndirectReference info, PdfIndirectReference encryption, PdfObject fileID, int prevxref) {
+ this.offset = offset;
+ put(PdfName.SIZE, new PdfNumber(size));
+ put(PdfName.ROOT, root);
+ if (info != null) {
+ put(PdfName.INFO, info);
+ }
+ if (encryption != null)
+ put(PdfName.ENCRYPT, encryption);
+ if (fileID != null)
+ put(PdfName.ID, fileID);
+ if (prevxref > 0)
+ put(PdfName.PREV, new PdfNumber(prevxref));
+ }
+
+ /**
+ * Returns the PDF representation of this <CODE>PdfObject</CODE>.
+ * @param writer
+ * @param os
+ * @throws IOException
+ */
+ public void toPdf(PdfWriter writer, OutputStream os) throws IOException {
+ os.write(getISOBytes("trailer\n"));
+ super.toPdf(null, os);
+ os.write(getISOBytes("\nstartxref\n"));
+ os.write(getISOBytes(String.valueOf(offset)));
+ os.write(getISOBytes("\n%%EOF\n"));
+ }
+ }
+ // static membervariables
+
+ /** A viewer preference */
+ public static final int PageLayoutSinglePage = 1;
+ /** A viewer preference */
+ public static final int PageLayoutOneColumn = 2;
+ /** A viewer preference */
+ public static final int PageLayoutTwoColumnLeft = 4;
+ /** A viewer preference */
+ public static final int PageLayoutTwoColumnRight = 8;
+ /** A viewer preference */
+ public static final int PageLayoutTwoPageLeft = 1 << 22;
+ /** A viewer preference */
+ public static final int PageLayoutTwoPageRight = 1 << 23;
+
+ /** A viewer preference */
+ public static final int PageModeUseNone = 16;
+ /** A viewer preference */
+ public static final int PageModeUseOutlines = 32;
+ /** A viewer preference */
+ public static final int PageModeUseThumbs = 64;
+ /** A viewer preference */
+ public static final int PageModeFullScreen = 128;
+ /** A viewer preference */
+ public static final int PageModeUseOC = 1 << 20;
+ /** A viewer preference */
+ public static final int PageModeUseAttachments = 1 << 24;
+
+ /** A viewer preference */
+ public static final int HideToolbar = 256;
+ /** A viewer preference */
+ public static final int HideMenubar = 512;
+ /** A viewer preference */
+ public static final int HideWindowUI = 1024;
+ /** A viewer preference */
+ public static final int FitWindow = 2048;
+ /** A viewer preference */
+ public static final int CenterWindow = 4096;
+
+ /** A viewer preference */
+ public static final int NonFullScreenPageModeUseNone = 8192;
+ /** A viewer preference */
+ public static final int NonFullScreenPageModeUseOutlines = 16384;
+ /** A viewer preference */
+ public static final int NonFullScreenPageModeUseThumbs = 32768;
+ /** A viewer preference */
+ public static final int NonFullScreenPageModeUseOC = 1 << 19;
+
+ /** A viewer preference */
+ public static final int DirectionL2R = 1 << 16;
+ /** A viewer preference */
+ public static final int DirectionR2L = 1 << 17;
+ /** A viewer preference */
+ public static final int DisplayDocTitle = 1 << 18;
+ /** A viewer preference */
+ public static final int PrintScalingNone = 1 << 21;
+ /** The mask to decide if a ViewerPreferences dictionary is needed */
+ static final int ViewerPreferencesMask = 0xffff00;
+ /** The operation permitted when the document is opened with the user password */
+ public static final int AllowPrinting = 4 + 2048;
+ /** The operation permitted when the document is opened with the user password */
+ public static final int AllowModifyContents = 8;
+ /** The operation permitted when the document is opened with the user password */
+ public static final int AllowCopy = 16;
+ /** The operation permitted when the document is opened with the user password */
+ public static final int AllowModifyAnnotations = 32;
+ /** The operation permitted when the document is opened with the user password */
+ public static final int AllowFillIn = 256;
+ /** The operation permitted when the document is opened with the user password */
+ public static final int AllowScreenReaders = 512;
+ /** The operation permitted when the document is opened with the user password */
+ public static final int AllowAssembly = 1024;
+ /** The operation permitted when the document is opened with the user password */
+ public static final int AllowDegradedPrinting = 4;
+ /** Type of encryption */
+ public static final boolean STRENGTH40BITS = false;
+ /** Type of encryption */
+ public static final boolean STRENGTH128BITS = true;
+ /** action value */
+ public static final PdfName DOCUMENT_CLOSE = PdfName.WC;
+ /** action value */
+ public static final PdfName WILL_SAVE = PdfName.WS;
+ /** action value */
+ public static final PdfName DID_SAVE = PdfName.DS;
+ /** action value */
+ public static final PdfName WILL_PRINT = PdfName.WP;
+ /** action value */
+ public static final PdfName DID_PRINT = PdfName.DP;
+ /** action value */
+ public static final PdfName PAGE_OPEN = PdfName.O;
+ /** action value */
+ public static final PdfName PAGE_CLOSE = PdfName.C;
+
+ /** signature value */
+ public static final int SIGNATURE_EXISTS = 1;
+ /** signature value */
+ public static final int SIGNATURE_APPEND_ONLY = 2;
+
+ /** possible PDF version */
+ public static final char VERSION_1_2 = '2';
+ /** possible PDF version */
+ public static final char VERSION_1_3 = '3';
+ /** possible PDF version */
+ public static final char VERSION_1_4 = '4';
+ /** possible PDF version */
+ public static final char VERSION_1_5 = '5';
+ /** possible PDF version */
+ public static final char VERSION_1_6 = '6';
+
+ private static final int VPOINT = 7;
+ /** this is the header of a PDF document */
+ protected byte[] HEADER = getISOBytes("%PDF-1.4\n%\u00e2\u00e3\u00cf\u00d3\n");
+
+ protected int prevxref = 0;
+
+ protected PdfPages root = new PdfPages(this);
+
+ /** Dictionary, containing all the images of the PDF document */
+ protected PdfDictionary imageDictionary = new PdfDictionary();
+
+ /** This is the list with all the images in the document. */
+ private HashMap images = new HashMap();
+
+ /** The form XObjects in this document. The key is the xref and the value
+ is Object[]{PdfName, template}.*/
+ protected HashMap formXObjects = new HashMap();
+
+ /** The name counter for the form XObjects name. */
+ protected int formXObjectsCounter = 1;
+
+ /** The font number counter for the fonts in the document. */
+ protected int fontNumber = 1;
+
+ /** The color number counter for the colors in the document. */
+ protected int colorNumber = 1;
+
+ /** The patten number counter for the colors in the document. */
+ protected int patternNumber = 1;
+
+ /** The direct content in this document. */
+ protected PdfContentByte directContent;
+
+ /** The direct content under in this document. */
+ protected PdfContentByte directContentUnder;
+
+ /** The fonts of this document */
+ protected HashMap documentFonts = new HashMap();
+
+ /** The colors of this document */
+ protected HashMap documentColors = new HashMap();
+
+ /** The patterns of this document */
+ protected HashMap documentPatterns = new HashMap();
+
+ protected HashMap documentShadings = new HashMap();
+
+ protected HashMap documentShadingPatterns = new HashMap();
+
+ protected ColorDetails patternColorspaceRGB;
+ protected ColorDetails patternColorspaceGRAY;
+ protected ColorDetails patternColorspaceCMYK;
+ protected HashMap documentSpotPatterns = new HashMap();
+
+ protected HashMap documentExtGState = new HashMap();
+
+ protected HashMap documentProperties = new HashMap();
+ protected HashSet documentOCG = new HashSet();
+ protected ArrayList documentOCGorder = new ArrayList();
+ protected PdfOCProperties OCProperties;
+ protected PdfArray OCGRadioGroup = new PdfArray();
+
+ protected PdfDictionary defaultColorspace = new PdfDictionary();
+ protected float userunit = 0f;
+
+ /** PDF/X value */
+ public static final int PDFXNONE = 0;
+ /** PDF/X value */
+ public static final int PDFX1A2001 = 1;
+ /** PDF/X value */
+ public static final int PDFX32002 = 2;
+
+ private int pdfxConformance = PDFXNONE;
+
+ static final int PDFXKEY_COLOR = 1;
+ static final int PDFXKEY_CMYK = 2;
+ static final int PDFXKEY_RGB = 3;
+ static final int PDFXKEY_FONT = 4;
+ static final int PDFXKEY_IMAGE = 5;
+ static final int PDFXKEY_GSTATE = 6;
+ static final int PDFXKEY_LAYER = 7;
+
+ // membervariables
+
+ /** body of the PDF document */
+ protected PdfBody body;
+
+ /** the pdfdocument object. */
+ protected PdfDocument pdf;
+
+ /** The <CODE>PdfPageEvent</CODE> for this document. */
+ private PdfPageEvent pageEvent;
+
+ protected PdfEncryption crypto;
+
+ protected HashMap importedPages = new HashMap();
+
+ protected PdfReaderInstance currentPdfReaderInstance;
+
+ /** The PdfIndirectReference to the pages. */
+ protected ArrayList pageReferences = new ArrayList();
+
+ protected int currentPageNumber = 1;
+
+ protected PdfDictionary group;
+
+ /** The default space-char ratio. */
+ public static final float SPACE_CHAR_RATIO_DEFAULT = 2.5f;
+ /** Disable the inter-character spacing. */
+ public static final float NO_SPACE_CHAR_RATIO = 10000000f;
+
+ /** Use the default run direction. */
+ public static final int RUN_DIRECTION_DEFAULT = 0;
+ /** Do not use bidirectional reordering. */
+ public static final int RUN_DIRECTION_NO_BIDI = 1;
+ /** Use bidirectional reordering with left-to-right
+ * preferential run direction.
+ */
+ public static final int RUN_DIRECTION_LTR = 2;
+ /** Use bidirectional reordering with right-to-left
+ * preferential run direction.
+ */
+ public static final int RUN_DIRECTION_RTL = 3;
+ protected int runDirection = RUN_DIRECTION_NO_BIDI;
+ /**
+ * The ratio between the extra word spacing and the extra character spacing.
+ * Extra word spacing will grow <CODE>ratio</CODE> times more than extra character spacing.
+ */
+ private float spaceCharRatio = SPACE_CHAR_RATIO_DEFAULT;
+
+ /** Holds value of property extraCatalog. */
+ private PdfDictionary extraCatalog;
+
+ /** XMP Metadata for the document. */
+ protected byte[] xmpMetadata = null;
+ /**
+ * Holds value of property fullCompression.
+ */
+ protected boolean fullCompression = false;
+
+ protected boolean tagged = false;
+
+ protected PdfStructureTreeRoot structureTreeRoot;
+
+ // constructor
+
+ protected PdfWriter() {
+ }
+
+ /**
+ * Constructs a <CODE>PdfWriter</CODE>.
+ * <P>
+ * Remark: a PdfWriter can only be constructed by calling the method
+ * <CODE>getInstance(Document document, OutputStream os)</CODE>.
+ *
+ * @param document The <CODE>PdfDocument</CODE> that has to be written
+ * @param os The <CODE>OutputStream</CODE> the writer has to write to.
+ */
+
+ protected PdfWriter(PdfDocument document, OutputStream os) {
+ super(document, os);
+ pdf = document;
+ directContent = new PdfContentByte(this);
+ directContentUnder = new PdfContentByte(this);
+ }
+
+ // get an instance of the PdfWriter
+
+ /**
+ * Gets an instance of the <CODE>PdfWriter</CODE>.
+ *
+ * @param document The <CODE>Document</CODE> that has to be written
+ * @param os The <CODE>OutputStream</CODE> the writer has to write to.
+ * @return a new <CODE>PdfWriter</CODE>
+ *
+ * @throws DocumentException on error
+ */
+
+ public static PdfWriter getInstance(Document document, OutputStream os)
+ throws DocumentException {
+ PdfDocument pdf = new PdfDocument();
+ document.addDocListener(pdf);
+ PdfWriter writer = new PdfWriter(pdf, os);
+ pdf.addWriter(writer);
+ return writer;
+ }
+
+ /** Gets an instance of the <CODE>PdfWriter</CODE>.
+ *
+ * @return a new <CODE>PdfWriter</CODE>
+ * @param document The <CODE>Document</CODE> that has to be written
+ * @param os The <CODE>OutputStream</CODE> the writer has to write to.
+ * @param listener A <CODE>DocListener</CODE> to pass to the PdfDocument.
+ * @throws DocumentException on error
+ */
+
+ public static PdfWriter getInstance(Document document, OutputStream os, DocListener listener)
+ throws DocumentException {
+ PdfDocument pdf = new PdfDocument();
+ pdf.addDocListener(listener);
+ document.addDocListener(pdf);
+ PdfWriter writer = new PdfWriter(pdf, os);
+ pdf.addWriter(writer);
+ return writer;
+ }
+
+ // methods to write objects to the outputstream
+
+ /**
+ * Adds some <CODE>PdfContents</CODE> to this Writer.
+ * <P>
+ * The document has to be open before you can begin to add content
+ * to the body of the document.
+ *
+ * @return a <CODE>PdfIndirectReference</CODE>
+ * @param page the <CODE>PdfPage</CODE> to add
+ * @param contents the <CODE>PdfContents</CODE> of the page
+ * @throws PdfException on error
+ */
+
+ PdfIndirectReference add(PdfPage page, PdfContents contents) throws PdfException {
+ if (!open) {
+ throw new PdfException("The document isn't open.");
+ }
+ PdfIndirectObject object;
+ try {
+ object = addToBody(contents);
+ }
+ catch(IOException ioe) {
+ throw new ExceptionConverter(ioe);
+ }
+ page.add(object.getIndirectReference());
+ if (group != null) {
+ page.put(PdfName.GROUP, group);
+ group = null;
+ }
+ root.addPage(page);
+ currentPageNumber++;
+ return null;
+ }
+
+ /**
+ * Adds an image to the document but not to the page resources. It is used with
+ * templates and <CODE>Document.add(Image)</CODE>.
+ * @param image the <CODE>Image</CODE> to add
+ * @return the name of the image added
+ * @throws PdfException on error
+ * @throws DocumentException on error
+ */
+ public PdfName addDirectImageSimple(Image image) throws PdfException, DocumentException {
+ return addDirectImageSimple(image, null);
+ }
+
+ /**
+ * Adds an image to the document but not to the page resources. It is used with
+ * templates and <CODE>Document.add(Image)</CODE>.
+ * @param image the <CODE>Image</CODE> to add
+ * @param fixedRef the reference to used. It may be <CODE>null</CODE>,
+ * a <CODE>PdfIndirectReference</CODE> or a <CODE>PRIndirectReference</CODE>.
+ * @return the name of the image added
+ * @throws PdfException on error
+ * @throws DocumentException on error
+ */
+ public PdfName addDirectImageSimple(Image image, PdfIndirectReference fixedRef) throws PdfException, DocumentException {
+ PdfName name;
+ // if the images is already added, just retrieve the name
+ if (images.containsKey(image.getMySerialId())) {
+ name = (PdfName) images.get(image.getMySerialId());
+ }
+ // if it's a new image, add it to the document
+ else {
+ if (image.isImgTemplate()) {
+ name = new PdfName("img" + images.size());
+ if (image.templateData() == null) {
+ if(image instanceof ImgWMF){
+ try {
+ ImgWMF wmf = (ImgWMF)image;
+ wmf.readWMF(getDirectContent().createTemplate(0, 0));
+ }
+ catch (Exception e) {
+ throw new DocumentException(e);
+ }
+ }else{
+ try {
+ ((ImgPostscript)image).readPostscript(getDirectContent().createTemplate(0, 0));
+ }
+ catch (Exception e) {
+ throw new DocumentException(e);
+ }
+
+ }
+ }
+ }
+ else {
+ PdfIndirectReference dref = image.getDirectReference();
+ if (dref != null) {
+ PdfName rname = new PdfName("img" + images.size());
+ images.put(image.getMySerialId(), rname);
+ imageDictionary.put(rname, dref);
+ return rname;
+ }
+ Image maskImage = image.getImageMask();
+ PdfIndirectReference maskRef = null;
+ if (maskImage != null) {
+ PdfName mname = (PdfName)images.get(maskImage.getMySerialId());
+ maskRef = getImageReference(mname);
+ }
+ PdfImage i = new PdfImage(image, "img" + images.size(), maskRef);
+ if (image.hasICCProfile()) {
+ PdfICCBased icc = new PdfICCBased(image.getICCProfile());
+ PdfIndirectReference iccRef = add(icc);
+ PdfArray iccArray = new PdfArray();
+ iccArray.add(PdfName.ICCBASED);
+ iccArray.add(iccRef);
+ PdfObject colorspace = i.get(PdfName.COLORSPACE);
+ if (colorspace != null && colorspace.isArray()) {
+ ArrayList ar = ((PdfArray)colorspace).getArrayList();
+ if (ar.size() > 1 && PdfName.INDEXED.equals(ar.get(0)))
+ ar.set(1, iccArray);
+ else
+ i.put(PdfName.COLORSPACE, iccArray);
+ }
+ else
+ i.put(PdfName.COLORSPACE, iccArray);
+ }
+ add(i, fixedRef);
+ name = i.name();
+ }
+ images.put(image.getMySerialId(), name);
+ }
+ return name;
+ }
+
+ /**
+ * Writes a <CODE>PdfImage</CODE> to the outputstream.
+ *
+ * @param pdfImage the image to be added
+ * @return a <CODE>PdfIndirectReference</CODE> to the encapsulated image
+ * @throws PdfException when a document isn't open yet, or has been closed
+ */
+
+ PdfIndirectReference add(PdfImage pdfImage, PdfIndirectReference fixedRef) throws PdfException {
+ if (! imageDictionary.contains(pdfImage.name())) {
+ checkPDFXConformance(this, PDFXKEY_IMAGE, pdfImage);
+ if (fixedRef != null && fixedRef instanceof PRIndirectReference) {
+ PRIndirectReference r2 = (PRIndirectReference)fixedRef;
+ fixedRef = new PdfIndirectReference(0, getNewObjectNumber(r2.getReader(), r2.getNumber(), r2.getGeneration()));
+ }
+ try {
+ if (fixedRef == null)
+ fixedRef = addToBody(pdfImage).getIndirectReference();
+ else
+ addToBody(pdfImage, fixedRef);
+ }
+ catch(IOException ioe) {
+ throw new ExceptionConverter(ioe);
+ }
+ imageDictionary.put(pdfImage.name(), fixedRef);
+ return fixedRef;
+ }
+ return (PdfIndirectReference) imageDictionary.get(pdfImage.name());
+ }
+
+ protected PdfIndirectReference add(PdfICCBased icc) throws PdfException {
+ PdfIndirectObject object;
+ try {
+ object = addToBody(icc);
+ }
+ catch(IOException ioe) {
+ throw new ExceptionConverter(ioe);
+ }
+ return object.getIndirectReference();
+ }
+
+ /**
+ * return the <CODE>PdfIndirectReference</CODE> to the image with a given name.
+ *
+ * @param name the name of the image
+ * @return a <CODE>PdfIndirectReference</CODE>
+ */
+
+ PdfIndirectReference getImageReference(PdfName name) {
+ return (PdfIndirectReference) imageDictionary.get(name);
+ }
+
+ // methods to open and close the writer
+
+ /**
+ * Signals that the <CODE>Document</CODE> has been opened and that
+ * <CODE>Elements</CODE> can be added.
+ * <P>
+ * When this method is called, the PDF-document header is
+ * written to the outputstream.
+ */
+
+ public void open() {
+ super.open();
+ try {
+ os.write(HEADER);
+ body = new PdfBody(this);
+ if (pdfxConformance == PDFX32002) {
+ PdfDictionary sec = new PdfDictionary();
+ sec.put(PdfName.GAMMA, new PdfArray(new float[]{2.2f,2.2f,2.2f}));
+ sec.put(PdfName.MATRIX, new PdfArray(new float[]{0.4124f,0.2126f,0.0193f,0.3576f,0.7152f,0.1192f,0.1805f,0.0722f,0.9505f}));
+ sec.put(PdfName.WHITEPOINT, new PdfArray(new float[]{0.9505f,1f,1.089f}));
+ PdfArray arr = new PdfArray(PdfName.CALRGB);
+ arr.add(sec);
+ setDefaultColorspace(PdfName.DEFAULTRGB, addToBody(arr).getIndirectReference());
+ }
+ }
+ catch(IOException ioe) {
+ throw new ExceptionConverter(ioe);
+ }
+ }
+
+ private static void getOCGOrder(PdfArray order, PdfLayer layer) {
+ if (!layer.isOnPanel())
+ return;
+ if (layer.getTitle() == null)
+ order.add(layer.getRef());
+ ArrayList children = layer.getChildren();
+ if (children == null)
+ return;
+ PdfArray kids = new PdfArray();
+ if (layer.getTitle() != null)
+ kids.add(new PdfString(layer.getTitle(), PdfObject.TEXT_UNICODE));
+ for (int k = 0; k < children.size(); ++k) {
+ getOCGOrder(kids, (PdfLayer)children.get(k));
+ }
+ if (kids.size() > 0)
+ order.add(kids);
+ }
+
+ private void addASEvent(PdfName event, PdfName category) {
+ PdfArray arr = new PdfArray();
+ for (Iterator it = documentOCG.iterator(); it.hasNext();) {
+ PdfLayer layer = (PdfLayer)it.next();
+ PdfDictionary usage = (PdfDictionary)layer.get(PdfName.USAGE);
+ if (usage != null && usage.get(category) != null)
+ arr.add(layer.getRef());
+ }
+ if (arr.size() == 0)
+ return;
+ PdfDictionary d = (PdfDictionary)OCProperties.get(PdfName.D);
+ PdfArray arras = (PdfArray)d.get(PdfName.AS);
+ if (arras == null) {
+ arras = new PdfArray();
+ d.put(PdfName.AS, arras);
+ }
+ PdfDictionary as = new PdfDictionary();
+ as.put(PdfName.EVENT, event);
+ as.put(PdfName.CATEGORY, new PdfArray(category));
+ as.put(PdfName.OCGS, arr);
+ arras.add(as);
+ }
+
+ private void fillOCProperties(boolean erase) {
+ if (OCProperties == null)
+ OCProperties = new PdfOCProperties();
+ if (erase) {
+ OCProperties.remove(PdfName.OCGS);
+ OCProperties.remove(PdfName.D);
+ }
+ if (OCProperties.get(PdfName.OCGS) == null) {
+ PdfArray gr = new PdfArray();
+ for (Iterator it = documentOCG.iterator(); it.hasNext();) {
+ PdfLayer layer = (PdfLayer)it.next();
+ gr.add(layer.getRef());
+ }
+ OCProperties.put(PdfName.OCGS, gr);
+ }
+ if (OCProperties.get(PdfName.D) != null)
+ return;
+ ArrayList docOrder = new ArrayList(documentOCGorder);
+ for (Iterator it = docOrder.iterator(); it.hasNext();) {
+ PdfLayer layer = (PdfLayer)it.next();
+ if (layer.getParent() != null)
+ it.remove();
+ }
+ PdfArray order = new PdfArray();
+ for (Iterator it = docOrder.iterator(); it.hasNext();) {
+ PdfLayer layer = (PdfLayer)it.next();
+ getOCGOrder(order, layer);
+ }
+ PdfDictionary d = new PdfDictionary();
+ OCProperties.put(PdfName.D, d);
+ d.put(PdfName.ORDER, order);
+ PdfArray gr = new PdfArray();
+ for (Iterator it = documentOCG.iterator(); it.hasNext();) {
+ PdfLayer layer = (PdfLayer)it.next();
+ if (!layer.isOn())
+ gr.add(layer.getRef());
+ }
+ if (gr.size() > 0)
+ d.put(PdfName.OFF, gr);
+ if (OCGRadioGroup.size() > 0)
+ d.put(PdfName.RBGROUPS, OCGRadioGroup);
+ addASEvent(PdfName.VIEW, PdfName.ZOOM);
+ addASEvent(PdfName.VIEW, PdfName.VIEW);
+ addASEvent(PdfName.PRINT, PdfName.PRINT);
+ addASEvent(PdfName.EXPORT, PdfName.EXPORT);
+ d.put(PdfName.LISTMODE, PdfName.VISIBLEPAGES);
+ }
+
+ protected PdfDictionary getCatalog(PdfIndirectReference rootObj)
+ {
+ PdfDictionary catalog = ((PdfDocument)document).getCatalog(rootObj);
+ if (tagged) {
+ try {
+ getStructureTreeRoot().buildTree();
+ }
+ catch (Exception e) {
+ throw new ExceptionConverter(e);
+ }
+ catalog.put(PdfName.STRUCTTREEROOT, structureTreeRoot.getReference());
+ PdfDictionary mi = new PdfDictionary();
+ mi.put(PdfName.MARKED, PdfBoolean.PDFTRUE);
+ catalog.put(PdfName.MARKINFO, mi);
+ }
+ if (documentOCG.size() == 0)
+ return catalog;
+ fillOCProperties(false);
+ catalog.put(PdfName.OCPROPERTIES, OCProperties);
+ return catalog;
+ }
+
+ protected void addSharedObjectsToBody() throws IOException {
+ // add the fonts
+ for (Iterator it = documentFonts.values().iterator(); it.hasNext();) {
+ FontDetails details = (FontDetails)it.next();
+ details.writeFont(this);
+ }
+ // add the form XObjects
+ for (Iterator it = formXObjects.values().iterator(); it.hasNext();) {
+ Object objs[] = (Object[])it.next();
+ PdfTemplate template = (PdfTemplate)objs[1];
+ if (template != null && template.getIndirectReference() instanceof PRIndirectReference)
+ continue;
+ if (template != null && template.getType() == PdfTemplate.TYPE_TEMPLATE) {
+ addToBody(template.getFormXObject(), template.getIndirectReference());
+ }
+ }
+ // add all the dependencies in the imported pages
+ for (Iterator it = importedPages.values().iterator(); it.hasNext();) {
+ currentPdfReaderInstance = (PdfReaderInstance)it.next();
+ currentPdfReaderInstance.writeAllPages();
+ }
+ currentPdfReaderInstance = null;
+ // add the color
+ for (Iterator it = documentColors.values().iterator(); it.hasNext();) {
+ ColorDetails color = (ColorDetails)it.next();
+ addToBody(color.getSpotColor(this), color.getIndirectReference());
+ }
+ // add the pattern
+ for (Iterator it = documentPatterns.keySet().iterator(); it.hasNext();) {
+ PdfPatternPainter pat = (PdfPatternPainter)it.next();
+ addToBody(pat.getPattern(), pat.getIndirectReference());
+ }
+ // add the shading patterns
+ for (Iterator it = documentShadingPatterns.keySet().iterator(); it.hasNext();) {
+ PdfShadingPattern shadingPattern = (PdfShadingPattern)it.next();
+ shadingPattern.addToBody();
+ }
+ // add the shadings
+ for (Iterator it = documentShadings.keySet().iterator(); it.hasNext();) {
+ PdfShading shading = (PdfShading)it.next();
+ shading.addToBody();
+ }
+ // add the extgstate
+ for (Iterator it = documentExtGState.keySet().iterator(); it.hasNext();) {
+ PdfDictionary gstate = (PdfDictionary)it.next();
+ PdfObject obj[] = (PdfObject[])documentExtGState.get(gstate);
+ addToBody(gstate, (PdfIndirectReference)obj[1]);
+ }
+ // add the properties
+ for (Iterator it = documentProperties.keySet().iterator(); it.hasNext();) {
+ Object prop = it.next();
+ PdfObject[] obj = (PdfObject[])documentProperties.get(prop);
+ if (prop instanceof PdfLayerMembership){
+ PdfLayerMembership layer = (PdfLayerMembership)prop;
+ addToBody(layer.getPdfObject(), layer.getRef());
+ }
+ else if ((prop instanceof PdfDictionary) && !(prop instanceof PdfLayer)){
+ addToBody((PdfDictionary)prop, (PdfIndirectReference)obj[1]);
+ }
+ }
+ for (Iterator it = documentOCG.iterator(); it.hasNext();) {
+ PdfOCG layer = (PdfOCG)it.next();
+ addToBody(layer.getPdfObject(), layer.getRef());
+ }
+ }
+
+ /**
+ * Signals that the <CODE>Document</CODE> was closed and that no other
+ * <CODE>Elements</CODE> will be added.
+ * <P>
+ * The pages-tree is built and written to the outputstream.
+ * A Catalog is constructed, as well as an Info-object,
+ * the referencetable is composed and everything is written
+ * to the outputstream embedded in a Trailer.
+ */
+
+ public synchronized void close() {
+ if (open) {
+ if ((currentPageNumber - 1) != pageReferences.size())
+ throw new RuntimeException("The page " + pageReferences.size() +
+ " was requested but the document has only " + (currentPageNumber - 1) + " pages.");
+ pdf.close();
+ try {
+ addSharedObjectsToBody();
+ // add the root to the body
+ PdfIndirectReference rootRef = root.writePageTree();
+ // make the catalog-object and add it to the body
+ PdfDictionary catalog = getCatalog(rootRef);
+ // if there is XMP data to add: add it
+ if (xmpMetadata != null) {
+ PdfStream xmp = new PdfStream(xmpMetadata);
+ xmp.put(PdfName.TYPE, PdfName.METADATA);
+ xmp.put(PdfName.SUBTYPE, PdfName.XML);
+ catalog.put(PdfName.METADATA, body.add(xmp).getIndirectReference());
+ }
+ // make pdfx conformant
+ PdfDictionary info = getInfo();
+ if (pdfxConformance != PDFXNONE) {
+ if (info.get(PdfName.GTS_PDFXVERSION) == null) {
+ if (pdfxConformance == PDFX1A2001) {
+ info.put(PdfName.GTS_PDFXVERSION, new PdfString("PDF/X-1:2001"));
+ info.put(new PdfName("GTS_PDFXConformance"), new PdfString("PDF/X-1a:2001"));
+ }
+ else if (pdfxConformance == PDFX32002)
+ info.put(PdfName.GTS_PDFXVERSION, new PdfString("PDF/X-3:2002"));
+ }
+ if (info.get(PdfName.TITLE) == null) {
+ info.put(PdfName.TITLE, new PdfString("Pdf document"));
+ }
+ if (info.get(PdfName.CREATOR) == null) {
+ info.put(PdfName.CREATOR, new PdfString("Unknown"));
+ }
+ if (info.get(PdfName.TRAPPED) == null) {
+ info.put(PdfName.TRAPPED, new PdfName("False"));
+ }
+ getExtraCatalog();
+ if (extraCatalog.get(PdfName.OUTPUTINTENTS) == null) {
+ PdfDictionary out = new PdfDictionary(PdfName.OUTPUTINTENT);
+ out.put(PdfName.OUTPUTCONDITION, new PdfString("SWOP CGATS TR 001-1995"));
+ out.put(PdfName.OUTPUTCONDITIONIDENTIFIER, new PdfString("CGATS TR 001"));
+ out.put(PdfName.REGISTRYNAME, new PdfString("http://www.color.org"));
+ out.put(PdfName.INFO, new PdfString(""));
+ out.put(PdfName.S, PdfName.GTS_PDFX);
+ extraCatalog.put(PdfName.OUTPUTINTENTS, new PdfArray(out));
+ }
+ }
+ if (extraCatalog != null) {
+ catalog.mergeDifferent(extraCatalog);
+ }
+ PdfIndirectObject indirectCatalog = addToBody(catalog, false);
+ // add the info-object to the body
+ PdfIndirectObject infoObj = addToBody(info, false);
+ PdfIndirectReference encryption = null;
+ PdfObject fileID = null;
+ body.flushObjStm();
+ if (crypto != null) {
+ PdfIndirectObject encryptionObject = addToBody(crypto.getEncryptionDictionary(), false);
+ encryption = encryptionObject.getIndirectReference();
+ fileID = crypto.getFileID();
+ }
+ else
+ fileID = PdfEncryption.createInfoId(PdfEncryption.createDocumentId());
+
+ // write the cross-reference table of the body
+ body.writeCrossReferenceTable(os, indirectCatalog.getIndirectReference(),
+ infoObj.getIndirectReference(), encryption, fileID, prevxref);
+
+ // make the trailer
+ if (fullCompression) {
+ os.write(getISOBytes("startxref\n"));
+ os.write(getISOBytes(String.valueOf(body.offset())));
+ os.write(getISOBytes("\n%%EOF\n"));
+ }
+ else {
+ PdfTrailer trailer = new PdfTrailer(body.size(),
+ body.offset(),
+ indirectCatalog.getIndirectReference(),
+ infoObj.getIndirectReference(),
+ encryption,
+ fileID, prevxref);
+ trailer.toPdf(this, os);
+ }
+ super.close();
+ }
+ catch(IOException ioe) {
+ throw new ExceptionConverter(ioe);
+ }
+ }
+ }
+
+ // methods
+
+ /**
+ * Sometimes it is necessary to know where the just added <CODE>Table</CODE> ends.
+ *
+ * For instance to avoid to add another table in a page that is ending up, because
+ * the new table will be probably splitted just after the header (it is an
+ * unpleasant effect, isn't it?).
+ *
+ * Added on September 8th, 2001
+ * by Francesco De Milato
+ * francesco.demilato@tiscalinet.it
+ * @param table the <CODE>Table</CODE>
+ * @return the bottom height of the just added table
+ */
+
+ public float getTableBottom(Table table) {
+ return pdf.bottom(table) - pdf.indentBottom();
+ }
+
+ /**
+ * Gets a pre-rendered table.
+ * (Contributed by dperezcar@fcc.es)
+ * @param table Contains the table definition. Its contents are deleted, after being pre-rendered.
+ * @return a PdfTable
+ */
+
+ public PdfTable getPdfTable(Table table) {
+ return pdf.getPdfTable(table, true);
+ }
+
+ /**
+ * Row additions to the original {@link Table} used to build the {@link PdfTable} are processed and pre-rendered,
+ * and then the contents are deleted.
+ * If the pre-rendered table doesn't fit, then it is fully rendered and its data discarded.
+ * There shouldn't be any column change in the underlying {@link Table} object.
+ * (Contributed by dperezcar@fcc.es)
+ *
+ * @param table The pre-rendered table obtained from {@link #getPdfTable(Table)}
+ * @return true if the table is rendered and emptied.
+ * @throws DocumentException
+ * @see #getPdfTable(Table)
+ */
+
+ public boolean breakTableIfDoesntFit(PdfTable table) throws DocumentException {
+ return pdf.breakTableIfDoesntFit(table);
+ }
+
+ /**
+ * Checks if a <CODE>Table</CODE> fits the current page of the <CODE>PdfDocument</CODE>.
+ *
+ * @param table the table that has to be checked
+ * @param margin a certain margin
+ * @return <CODE>true</CODE> if the <CODE>Table</CODE> fits the page, <CODE>false</CODE> otherwise.
+ */
+
+ public boolean fitsPage(Table table, float margin) {
+ return pdf.bottom(table) > pdf.indentBottom() + margin;
+ }
+
+ /**
+ * Checks if a <CODE>Table</CODE> fits the current page of the <CODE>PdfDocument</CODE>.
+ *
+ * @param table the table that has to be checked
+ * @return <CODE>true</CODE> if the <CODE>Table</CODE> fits the page, <CODE>false</CODE> otherwise.
+ */
+
+ public boolean fitsPage(Table table) {
+ return fitsPage(table, 0);
+ }
+
+ /**
+ * Checks if a <CODE>PdfPTable</CODE> fits the current page of the <CODE>PdfDocument</CODE>.
+ *
+ * @param table the table that has to be checked
+ * @param margin a certain margin
+ * @return <CODE>true</CODE> if the <CODE>PdfPTable</CODE> fits the page, <CODE>false</CODE> otherwise.
+ */
+ public boolean fitsPage(PdfPTable table, float margin) {
+ return pdf.fitsPage(table, margin);
+ }
+
+ /**
+ * Checks if a <CODE>PdfPTable</CODE> fits the current page of the <CODE>PdfDocument</CODE>.
+ *
+ * @param table the table that has to be checked
+ * @return <CODE>true</CODE> if the <CODE>PdfPTable</CODE> fits the page, <CODE>false</CODE> otherwise.
+ */
+ public boolean fitsPage(PdfPTable table) {
+ return pdf.fitsPage(table, 0);
+ }
+
+ /**
+ * Gets the current vertical page position.
+ * @param ensureNewLine Tells whether a new line shall be enforced. This may cause side effects
+ * for elements that do not terminate the lines they've started because those lines will get
+ * terminated.
+ * @return The current vertical page position.
+ */
+ public float getVerticalPosition(boolean ensureNewLine) {
+ return pdf.getVerticalPosition(ensureNewLine);
+ }
+
+ /**
+ * Checks if writing is paused.
+ *
+ * @return <CODE>true</CODE> if writing temporarely has to be paused, <CODE>false</CODE> otherwise.
+ */
+
+ boolean isPaused() {
+ return pause;
+ }
+
+ /**
+ * Gets the direct content for this document. There is only one direct content,
+ * multiple calls to this method will allways retrieve the same.
+ * @return the direct content
+ */
+
+ public PdfContentByte getDirectContent() {
+ if (!open)
+ throw new RuntimeException("The document is not open.");
+ return directContent;
+ }
+
+ /**
+ * Gets the direct content under for this document. There is only one direct content,
+ * multiple calls to this method will allways retrieve the same.
+ * @return the direct content
+ */
+
+ public PdfContentByte getDirectContentUnder() {
+ if (!open)
+ throw new RuntimeException("The document is not open.");
+ return directContentUnder;
+ }
+
+ /**
+ * Resets all the direct contents to empty. This happens when a new page is started.
+ */
+
+ void resetContent() {
+ directContent.reset();
+ directContentUnder.reset();
+ }
+
+ /** Gets the AcroForm object.
+ * @return the <CODE>PdfAcroForm</CODE>
+ */
+
+ public PdfAcroForm getAcroForm() {
+ return pdf.getAcroForm();
+ }
+
+ /** Gets the root outline.
+ * @return the root outline
+ */
+
+ public PdfOutline getRootOutline() {
+ return directContent.getRootOutline();
+ }
+
+ /**
+ * Returns the outputStreamCounter.
+ * @return the outputStreamCounter
+ */
+ public OutputStreamCounter getOs() {
+ return os;
+ }
+
+ /**
+ * Adds a <CODE>BaseFont</CODE> to the document but not to the page resources.
+ * It is used for templates.
+ * @param bf the <CODE>BaseFont</CODE> to add
+ * @return an <CODE>Object[]</CODE> where position 0 is a <CODE>PdfName</CODE>
+ * and position 1 is an <CODE>PdfIndirectReference</CODE>
+ */
+
+ FontDetails addSimple(BaseFont bf) {
+ if (bf.getFontType() == BaseFont.FONT_TYPE_DOCUMENT) {
+ return new FontDetails(new PdfName("F" + (fontNumber++)), ((DocumentFont)bf).getIndirectReference(), bf);
+ }
+ FontDetails ret = (FontDetails)documentFonts.get(bf);
+ if (ret == null) {
+ checkPDFXConformance(this, PDFXKEY_FONT, bf);
+ ret = new FontDetails(new PdfName("F" + (fontNumber++)), body.getPdfIndirectReference(), bf);
+ documentFonts.put(bf, ret);
+ }
+ return ret;
+ }
+
+ void eliminateFontSubset(PdfDictionary fonts) {
+ for (Iterator it = documentFonts.values().iterator(); it.hasNext();) {
+ FontDetails ft = (FontDetails)it.next();
+ if (fonts.get(ft.getFontName()) != null)
+ ft.setSubset(false);
+ }
+ }
+
+ PdfName getColorspaceName() {
+ return new PdfName("CS" + (colorNumber++));
+ }
+
+ /**
+ * Adds a <CODE>SpotColor</CODE> to the document but not to the page resources.
+ * @param spc the <CODE>SpotColor</CODE> to add
+ * @return an <CODE>Object[]</CODE> where position 0 is a <CODE>PdfName</CODE>
+ * and position 1 is an <CODE>PdfIndirectReference</CODE>
+ */
+
+ ColorDetails addSimple(PdfSpotColor spc) {
+ ColorDetails ret = (ColorDetails)documentColors.get(spc);
+ if (ret == null) {
+ ret = new ColorDetails(getColorspaceName(), body.getPdfIndirectReference(), spc);
+ documentColors.put(spc, ret);
+ }
+ return ret;
+ }
+
+ ColorDetails addSimplePatternColorspace(Color color) {
+ int type = ExtendedColor.getType(color);
+ if (type == ExtendedColor.TYPE_PATTERN || type == ExtendedColor.TYPE_SHADING)
+ throw new RuntimeException("An uncolored tile pattern can not have another pattern or shading as color.");
+ try {
+ switch (type) {
+ case ExtendedColor.TYPE_RGB:
+ if (patternColorspaceRGB == null) {
+ patternColorspaceRGB = new ColorDetails(getColorspaceName(), body.getPdfIndirectReference(), null);
+ PdfArray array = new PdfArray(PdfName.PATTERN);
+ array.add(PdfName.DEVICERGB);
+ addToBody(array, patternColorspaceRGB.getIndirectReference());
+ }
+ return patternColorspaceRGB;
+ case ExtendedColor.TYPE_CMYK:
+ if (patternColorspaceCMYK == null) {
+ patternColorspaceCMYK = new ColorDetails(getColorspaceName(), body.getPdfIndirectReference(), null);
+ PdfArray array = new PdfArray(PdfName.PATTERN);
+ array.add(PdfName.DEVICECMYK);
+ addToBody(array, patternColorspaceCMYK.getIndirectReference());
+ }
+ return patternColorspaceCMYK;
+ case ExtendedColor.TYPE_GRAY:
+ if (patternColorspaceGRAY == null) {
+ patternColorspaceGRAY = new ColorDetails(getColorspaceName(), body.getPdfIndirectReference(), null);
+ PdfArray array = new PdfArray(PdfName.PATTERN);
+ array.add(PdfName.DEVICEGRAY);
+ addToBody(array, patternColorspaceGRAY.getIndirectReference());
+ }
+ return patternColorspaceGRAY;
+ case ExtendedColor.TYPE_SEPARATION: {
+ ColorDetails details = addSimple(((SpotColor)color).getPdfSpotColor());
+ ColorDetails patternDetails = (ColorDetails)documentSpotPatterns.get(details);
+ if (patternDetails == null) {
+ patternDetails = new ColorDetails(getColorspaceName(), body.getPdfIndirectReference(), null);
+ PdfArray array = new PdfArray(PdfName.PATTERN);
+ array.add(details.getIndirectReference());
+ addToBody(array, patternDetails.getIndirectReference());
+ documentSpotPatterns.put(details, patternDetails);
+ }
+ return patternDetails;
+ }
+ default:
+ throw new RuntimeException("Invalid color type in PdfWriter.addSimplePatternColorspace().");
+ }
+ }
+ catch (Exception e) {
+ throw new RuntimeException(e.getMessage());
+ }
+ }
+
+ void addSimpleShadingPattern(PdfShadingPattern shading) {
+ if (!documentShadingPatterns.containsKey(shading)) {
+ shading.setName(patternNumber);
+ ++patternNumber;
+ documentShadingPatterns.put(shading, null);
+ addSimpleShading(shading.getShading());
+ }
+ }
+
+ void addSimpleShading(PdfShading shading) {
+ if (!documentShadings.containsKey(shading)) {
+ documentShadings.put(shading, null);
+ shading.setName(documentShadings.size());
+ }
+ }
+
+ PdfObject[] addSimpleExtGState(PdfDictionary gstate) {
+ if (!documentExtGState.containsKey(gstate)) {
+ checkPDFXConformance(this, PDFXKEY_GSTATE, gstate);
+ documentExtGState.put(gstate, new PdfObject[]{new PdfName("GS" + (documentExtGState.size() + 1)), getPdfIndirectReference()});
+ }
+ return (PdfObject[])documentExtGState.get(gstate);
+ }
+
+ void registerLayer(PdfOCG layer) {
+ checkPDFXConformance(this, PDFXKEY_LAYER, null);
+ if (layer instanceof PdfLayer) {
+ PdfLayer la = (PdfLayer)layer;
+ if (la.getTitle() == null) {
+ if (!documentOCG.contains(layer)) {
+ documentOCG.add(layer);
+ documentOCGorder.add(layer);
+ }
+ }
+ else {
+ documentOCGorder.add(layer);
+ }
+ }
+ else
+ throw new IllegalArgumentException("Only PdfLayer is accepted.");
+ }
+
+ PdfObject[] addSimpleProperty(Object prop, PdfIndirectReference refi) {
+ if (!documentProperties.containsKey(prop)) {
+ if (prop instanceof PdfOCG)
+ checkPDFXConformance(this, PDFXKEY_LAYER, null);
+ documentProperties.put(prop, new PdfObject[]{new PdfName("Pr" + (documentProperties.size() + 1)), refi});
+ }
+ return (PdfObject[])documentProperties.get(prop);
+ }
+
+ boolean propertyExists(Object prop) {
+ return documentProperties.containsKey(prop);
+ }
+ /**
+ * Gets the <CODE>PdfDocument</CODE> associated with this writer.
+ * @return the <CODE>PdfDocument</CODE>
+ */
+
+ PdfDocument getPdfDocument() {
+ return pdf;
+ }
+
+ /**
+ * Gets a <CODE>PdfIndirectReference</CODE> for an object that
+ * will be created in the future.
+ * @return the <CODE>PdfIndirectReference</CODE>
+ */
+
+ public PdfIndirectReference getPdfIndirectReference() {
+ return body.getPdfIndirectReference();
+ }
+
+ int getIndirectReferenceNumber() {
+ return body.getIndirectReferenceNumber();
+ }
+
+ PdfName addSimplePattern(PdfPatternPainter painter) {
+ PdfName name = (PdfName)documentPatterns.get(painter);
+ try {
+ if ( name == null ) {
+ name = new PdfName("P" + patternNumber);
+ ++patternNumber;
+ documentPatterns.put(painter, name);
+ }
+ } catch (Exception e) {
+ throw new ExceptionConverter(e);
+ }
+ return name;
+ }
+
+ /**
+ * Adds a template to the document but not to the page resources.
+ * @param template the template to add
+ * @param forcedName the template name, rather than a generated one. Can be null
+ * @return the <CODE>PdfName</CODE> for this template
+ */
+
+ PdfName addDirectTemplateSimple(PdfTemplate template, PdfName forcedName) {
+ PdfIndirectReference ref = template.getIndirectReference();
+ Object obj[] = (Object[])formXObjects.get(ref);
+ PdfName name = null;
+ try {
+ if (obj == null) {
+ if (forcedName == null) {
+ name = new PdfName("Xf" + formXObjectsCounter);
+ ++formXObjectsCounter;
+ }
+ else
+ name = forcedName;
+ if (template.getType() == PdfTemplate.TYPE_IMPORTED)
+ template = null;
+ formXObjects.put(ref, new Object[]{name, template});
+ }
+ else
+ name = (PdfName)obj[0];
+ }
+ catch (Exception e) {
+ throw new ExceptionConverter(e);
+ }
+ return name;
+ }
+
+ /**
+ * Sets the <CODE>PdfPageEvent</CODE> for this document.
+ * @param event the <CODE>PdfPageEvent</CODE> for this document
+ */
+
+ public void setPageEvent(PdfPageEvent event) {
+ if (event == null) this.pageEvent = null;
+ else if (this.pageEvent == null) this.pageEvent = event;
+ else if (this.pageEvent instanceof PdfPageEventForwarder) ((PdfPageEventForwarder)this.pageEvent).addPageEvent(event);
+ else {
+ PdfPageEventForwarder forward = new PdfPageEventForwarder();
+ forward.addPageEvent(this.pageEvent);
+ forward.addPageEvent(event);
+ this.pageEvent = forward;
+ }
+ }
+
+ /**
+ * Gets the <CODE>PdfPageEvent</CODE> for this document or <CODE>null</CODE>
+ * if none is set.
+ * @return the <CODE>PdfPageEvent</CODE> for this document or <CODE>null</CODE>
+ * if none is set
+ */
+
+ public PdfPageEvent getPageEvent() {
+ return pageEvent;
+ }
+
+ /**
+ * Adds the local destinations to the body of the document.
+ * @param dest the <CODE>HashMap</CODE> containing the destinations
+ * @throws IOException on error
+ */
+
+ void addLocalDestinations(TreeMap dest) throws IOException {
+ for (Iterator i = dest.keySet().iterator(); i.hasNext();) {
+ String name = (String)i.next();
+ Object obj[] = (Object[])dest.get(name);
+ PdfDestination destination = (PdfDestination)obj[2];
+ if (destination == null)
+ throw new RuntimeException("The name '" + name + "' has no local destination.");
+ if (obj[1] == null)
+ obj[1] = getPdfIndirectReference();
+ addToBody(destination, (PdfIndirectReference)obj[1]);
+ }
+ }
+
+ /**
+ * Gets the current pagenumber of this document.
+ *
+ * @return a page number
+ */
+
+ public int getPageNumber() {
+ return pdf.getPageNumber();
+ }
+
+ /**
+ * Sets the viewer preferences by ORing some constants.
+ * <p>
+ * <ul>
+ * <li>The page layout to be used when the document is opened (choose one).
+ * <ul>
+ * <li><b>PageLayoutSinglePage</b> - Display one page at a time. (default)
+ * <li><b>PageLayoutOneColumn</b> - Display the pages in one column.
+ * <li><b>PageLayoutTwoColumnLeft</b> - Display the pages in two columns, with
+ * oddnumbered pages on the left.
+ * <li><b>PageLayoutTwoColumnRight</b> - Display the pages in two columns, with
+ * oddnumbered pages on the right.
+ * <li><b>PageLayoutTwoPageLeft</b> - Display the pages two at a time, with
+ * oddnumbered pages on the left.
+ * <li><b>PageLayoutTwoPageRight</b> - Display the pages two at a time, with
+ * oddnumbered pages on the right.
+ * </ul>
+ * <li>The page mode how the document should be displayed
+ * when opened (choose one).
+ * <ul>
+ * <li><b>PageModeUseNone</b> - Neither document outline nor thumbnail images visible. (default)
+ * <li><b>PageModeUseOutlines</b> - Document outline visible.
+ * <li><b>PageModeUseThumbs</b> - Thumbnail images visible.
+ * <li><b>PageModeFullScreen</b> - Full-screen mode, with no menu bar, window
+ * controls, or any other window visible.
+ * <li><b>PageModeUseOC</b> - Optional content group panel visible
+ * <li><b>PageModeUseAttachments</b> - Attachments panel visible
+ * </ul>
+ * <li><b>HideToolbar</b> - A flag specifying whether to hide the viewer application's tool
+ * bars when the document is active.
+ * <li><b>HideMenubar</b> - A flag specifying whether to hide the viewer application's
+ * menu bar when the document is active.
+ * <li><b>HideWindowUI</b> - A flag specifying whether to hide user interface elements in
+ * the document's window (such as scroll bars and navigation controls),
+ * leaving only the document's contents displayed.
+ * <li><b>FitWindow</b> - A flag specifying whether to resize the document's window to
+ * fit the size of the first displayed page.
+ * <li><b>CenterWindow</b> - A flag specifying whether to position the document's window
+ * in the center of the screen.
+ * <li><b>DisplayDocTitle</b> - A flag specifying whether to display the document's title
+ * in the top bar.
+ * <li>The predominant reading order for text. This entry has no direct effect on the
+ * document's contents or page numbering, but can be used to determine the relative
+ * positioning of pages when displayed side by side or printed <i>n-up</i> (choose one).
+ * <ul>
+ * <li><b>DirectionL2R</b> - Left to right
+ * <li><b>DirectionR2L</b> - Right to left (including vertical writing systems such as
+ * Chinese, Japanese, and Korean)
+ * </ul>
+ * <li>The document's page mode, specifying how to display the
+ * document on exiting full-screen mode. It is meaningful only
+ * if the page mode is <b>PageModeFullScreen</b> (choose one).
+ * <ul>
+ * <li><b>NonFullScreenPageModeUseNone</b> - Neither document outline nor thumbnail images
+ * visible
+ * <li><b>NonFullScreenPageModeUseOutlines</b> - Document outline visible
+ * <li><b>NonFullScreenPageModeUseThumbs</b> - Thumbnail images visible
+ * <li><b>NonFullScreenPageModeUseOC</b> - Optional content group panel visible
+ * </ul>
+ * <li><b>PrintScalingNone</b> - Indicates that the print dialog should reflect no page scaling.
+ * </ul>
+ * @param preferences the viewer preferences
+ */
+
+ public void setViewerPreferences(int preferences) {
+ pdf.setViewerPreferences(preferences);
+ }
+
+ /** Sets the encryption options for this document. The userPassword and the
+ * ownerPassword can be null or have zero length. In this case the ownerPassword
+ * is replaced by a random string. The open permissions for the document can be
+ * AllowPrinting, AllowModifyContents, AllowCopy, AllowModifyAnnotations,
+ * AllowFillIn, AllowScreenReaders, AllowAssembly and AllowDegradedPrinting.
+ * The permissions can be combined by ORing them.
+ * @param userPassword the user password. Can be null or empty
+ * @param ownerPassword the owner password. Can be null or empty
+ * @param permissions the user permissions
+ * @param strength128Bits <code>true</code> for 128 bit key length, <code>false</code> for 40 bit key length
+ * @throws DocumentException if the document is already open
+ */
+ public void setEncryption(byte userPassword[], byte ownerPassword[], int permissions, boolean strength128Bits) throws DocumentException {
+ if (pdf.isOpen())
+ throw new DocumentException("Encryption can only be added before opening the document.");
+ crypto = new PdfEncryption();
+ crypto.setupAllKeys(userPassword, ownerPassword, permissions, strength128Bits);
+ }
+
+ /**
+ * Sets the encryption options for this document. The userPassword and the
+ * ownerPassword can be null or have zero length. In this case the ownerPassword
+ * is replaced by a random string. The open permissions for the document can be
+ * AllowPrinting, AllowModifyContents, AllowCopy, AllowModifyAnnotations,
+ * AllowFillIn, AllowScreenReaders, AllowAssembly and AllowDegradedPrinting.
+ * The permissions can be combined by ORing them.
+ * @param strength <code>true</code> for 128 bit key length, <code>false</code> for 40 bit key length
+ * @param userPassword the user password. Can be null or empty
+ * @param ownerPassword the owner password. Can be null or empty
+ * @param permissions the user permissions
+ * @throws DocumentException if the document is already open
+ */
+ public void setEncryption(boolean strength, String userPassword, String ownerPassword, int permissions) throws DocumentException {
+ setEncryption(getISOBytes(userPassword), getISOBytes(ownerPassword), permissions, strength);
+ }
+
+ /**
+ * Adds an object to the PDF body.
+ * @param object
+ * @return a PdfIndirectObject
+ * @throws IOException
+ */
+ public PdfIndirectObject addToBody(PdfObject object) throws IOException {
+ PdfIndirectObject iobj = body.add(object);
+ return iobj;
+ }
+
+ /**
+ * Adds an object to the PDF body.
+ * @param object
+ * @param inObjStm
+ * @return a PdfIndirectObject
+ * @throws IOException
+ */
+ public PdfIndirectObject addToBody(PdfObject object, boolean inObjStm) throws IOException {
+ PdfIndirectObject iobj = body.add(object, inObjStm);
+ return iobj;
+ }
+
+ /**
+ * Adds an object to the PDF body.
+ * @param object
+ * @param ref
+ * @return a PdfIndirectObject
+ * @throws IOException
+ */
+ public PdfIndirectObject addToBody(PdfObject object, PdfIndirectReference ref) throws IOException {
+ PdfIndirectObject iobj = body.add(object, ref);
+ return iobj;
+ }
+
+ /**
+ * Adds an object to the PDF body.
+ * @param object
+ * @param ref
+ * @param inObjStm
+ * @return a PdfIndirectObject
+ * @throws IOException
+ */
+ public PdfIndirectObject addToBody(PdfObject object, PdfIndirectReference ref, boolean inObjStm) throws IOException {
+ PdfIndirectObject iobj = body.add(object, ref, inObjStm);
+ return iobj;
+ }
+
+ /**
+ * Adds an object to the PDF body.
+ * @param object
+ * @param refNumber
+ * @return a PdfIndirectObject
+ * @throws IOException
+ */
+ public PdfIndirectObject addToBody(PdfObject object, int refNumber) throws IOException {
+ PdfIndirectObject iobj = body.add(object, refNumber);
+ return iobj;
+ }
+
+ /**
+ * Adds an object to the PDF body.
+ * @param object
+ * @param refNumber
+ * @param inObjStm
+ * @return a PdfIndirectObject
+ * @throws IOException
+ */
+ public PdfIndirectObject addToBody(PdfObject object, int refNumber, boolean inObjStm) throws IOException {
+ PdfIndirectObject iobj = body.add(object, refNumber, inObjStm);
+ return iobj;
+ }
+
+ /** When the document opens it will jump to the destination with
+ * this name.
+ * @param name the name of the destination to jump to
+ */
+ public void setOpenAction(String name) {
+ pdf.setOpenAction(name);
+ }
+
+ /** Additional-actions defining the actions to be taken in
+ * response to various trigger events affecting the document
+ * as a whole. The actions types allowed are: <CODE>DOCUMENT_CLOSE</CODE>,
+ * <CODE>WILL_SAVE</CODE>, <CODE>DID_SAVE</CODE>, <CODE>WILL_PRINT</CODE>
+ * and <CODE>DID_PRINT</CODE>.
+ *
+ * @param actionType the action type
+ * @param action the action to execute in response to the trigger
+ * @throws PdfException on invalid action type
+ */
+ public void setAdditionalAction(PdfName actionType, PdfAction action) throws PdfException {
+ if (!(actionType.equals(DOCUMENT_CLOSE) ||
+ actionType.equals(WILL_SAVE) ||
+ actionType.equals(DID_SAVE) ||
+ actionType.equals(WILL_PRINT) ||
+ actionType.equals(DID_PRINT))) {
+ throw new PdfException("Invalid additional action type: " + actionType.toString());
+ }
+ pdf.addAdditionalAction(actionType, action);
+ }
+
+ /** When the document opens this <CODE>action</CODE> will be
+ * invoked.
+ * @param action the action to be invoked
+ */
+ public void setOpenAction(PdfAction action) {
+ pdf.setOpenAction(action);
+ }
+
+ /** Sets the page labels
+ * @param pageLabels the page labels
+ */
+ public void setPageLabels(PdfPageLabels pageLabels) {
+ pdf.setPageLabels(pageLabels);
+ }
+
+ PdfEncryption getEncryption() {
+ return crypto;
+ }
+
+ RandomAccessFileOrArray getReaderFile(PdfReader reader) {
+ return currentPdfReaderInstance.getReaderFile();
+ }
+
+ protected int getNewObjectNumber(PdfReader reader, int number, int generation) {
+ return currentPdfReaderInstance.getNewObjectNumber(number, generation);
+ }
+
+ /** Gets a page from other PDF document. The page can be used as
+ * any other PdfTemplate. Note that calling this method more than
+ * once with the same parameters will retrieve the same object.
+ * @param reader the PDF document where the page is
+ * @param pageNumber the page number. The first page is 1
+ * @return the template representing the imported page
+ */
+ public PdfImportedPage getImportedPage(PdfReader reader, int pageNumber) {
+ PdfReaderInstance inst = (PdfReaderInstance)importedPages.get(reader);
+ if (inst == null) {
+ inst = reader.getPdfReaderInstance(this);
+ importedPages.put(reader, inst);
+ }
+ return inst.getImportedPage(pageNumber);
+ }
+
+ /** Adds a JavaScript action at the document level. When the document
+ * opens all this JavaScript runs.
+ * @param js The JavaScrip action
+ */
+ public void addJavaScript(PdfAction js) {
+ pdf.addJavaScript(js);
+ }
+
+ /** Adds a JavaScript action at the document level. When the document
+ * opens all this JavaScript runs.
+ * @param code the JavaScript code
+ * @param unicode select JavaScript unicode. Note that the internal
+ * Acrobat JavaScript engine does not support unicode,
+ * so this may or may not work for you
+ */
+ public void addJavaScript(String code, boolean unicode) {
+ addJavaScript(PdfAction.javaScript(code, this, unicode));
+ }
+
+ /** Adds a JavaScript action at the document level. When the document
+ * opens all this JavaScript runs.
+ * @param code the JavaScript code
+ */
+ public void addJavaScript(String code) {
+ addJavaScript(code, false);
+ }
+
+ /** Adds a file attachment at the document level.
+ * @param description the file description
+ * @param fileStore an array with the file. If it's <CODE>null</CODE>
+ * the file will be read from the disk
+ * @param file the path to the file. It will only be used if
+ * <CODE>fileStore</CODE> is not <CODE>null</CODE>
+ * @param fileDisplay the actual file name stored in the pdf
+ * @throws IOException on error
+ */
+ public void addFileAttachment(String description, byte fileStore[], String file, String fileDisplay) throws IOException {
+ addFileAttachment(description, PdfFileSpecification.fileEmbedded(this, file, fileDisplay, fileStore));
+ }
+
+ /** Adds a file attachment at the document level.
+ * @param description the file description
+ * @param fs the file specification
+ */
+ public void addFileAttachment(String description, PdfFileSpecification fs) throws IOException {
+ pdf.addFileAttachment(description, fs);
+ }
+
+ /** Sets the crop box. The crop box should not be rotated even if the
+ * page is rotated. This change only takes effect in the next
+ * page.
+ * @param crop the crop box
+ */
+ public void setCropBoxSize(Rectangle crop) {
+ pdf.setCropBoxSize(crop);
+ }
+
+ /** Gets a reference to a page existing or not. If the page does not exist
+ * yet the reference will be created in advance. If on closing the document, a
+ * page number greater than the total number of pages was requested, an
+ * exception is thrown.
+ * @param page the page number. The first page is 1
+ * @return the reference to the page
+ */
+ public PdfIndirectReference getPageReference(int page) {
+ --page;
+ if (page < 0)
+ throw new IndexOutOfBoundsException("The page numbers start at 1.");
+ PdfIndirectReference ref;
+ if (page < pageReferences.size()) {
+ ref = (PdfIndirectReference)pageReferences.get(page);
+ if (ref == null) {
+ ref = body.getPdfIndirectReference();
+ pageReferences.set(page, ref);
+ }
+ }
+ else {
+ int empty = page - pageReferences.size();
+ for (int k = 0; k < empty; ++k)
+ pageReferences.add(null);
+ ref = body.getPdfIndirectReference();
+ pageReferences.add(ref);
+ }
+ return ref;
+ }
+
+ PdfIndirectReference getCurrentPage() {
+ return getPageReference(currentPageNumber);
+ }
+
+ int getCurrentPageNumber() {
+ return currentPageNumber;
+ }
+
+ /** Adds the <CODE>PdfAnnotation</CODE> to the calculation order
+ * array.
+ * @param annot the <CODE>PdfAnnotation</CODE> to be added
+ */
+ public void addCalculationOrder(PdfFormField annot) {
+ pdf.addCalculationOrder(annot);
+ }
+
+ /** Set the signature flags.
+ * @param f the flags. This flags are ORed with current ones
+ */
+ public void setSigFlags(int f) {
+ pdf.setSigFlags(f);
+ }
+
+ /** Adds a <CODE>PdfAnnotation</CODE> or a <CODE>PdfFormField</CODE>
+ * to the document. Only the top parent of a <CODE>PdfFormField</CODE>
+ * needs to be added.
+ * @param annot the <CODE>PdfAnnotation</CODE> or the <CODE>PdfFormField</CODE> to add
+ */
+ public void addAnnotation(PdfAnnotation annot) {
+ pdf.addAnnotation(annot);
+ }
+
+ void addAnnotation(PdfAnnotation annot, int page) {
+ addAnnotation(annot);
+ }
+
+ /** Sets the PDF version. Must be used right before the document
+ * is opened. Valid options are VERSION_1_2, VERSION_1_3,
+ * VERSION_1_4, VERSION_1_5 and VERSION_1_6. VERSION_1_4 is the default.
+ * @param version the version number
+ */
+ public void setPdfVersion(char version) {
+ if (HEADER.length > VPOINT)
+ HEADER[VPOINT] = (byte)version;
+ }
+
+ /** Reorder the pages in the document. A <CODE>null</CODE> argument value
+ * only returns the number of pages to process. It is
+ * advisable to issue a <CODE>Document.newPage()</CODE>
+ * before using this method.
+ * @return the total number of pages
+ * @param order an array with the new page sequence. It must have the
+ * same size as the number of pages.
+ * @throws DocumentException if all the pages are not present in the array
+ */
+ public int reorderPages(int order[]) throws DocumentException {
+ return root.reorderPages(order);
+ }
+
+ /** Gets the space/character extra spacing ratio for
+ * fully justified text.
+ * @return the space/character extra spacing ratio
+ */
+ public float getSpaceCharRatio() {
+ return spaceCharRatio;
+ }
+
+ /** Sets the ratio between the extra word spacing and the extra character spacing
+ * when the text is fully justified.
+ * Extra word spacing will grow <CODE>spaceCharRatio</CODE> times more than extra character spacing.
+ * If the ratio is <CODE>PdfWriter.NO_SPACE_CHAR_RATIO</CODE> then the extra character spacing
+ * will be zero.
+ * @param spaceCharRatio the ratio between the extra word spacing and the extra character spacing
+ */
+ public void setSpaceCharRatio(float spaceCharRatio) {
+ if (spaceCharRatio < 0.001f)
+ this.spaceCharRatio = 0.001f;
+ else
+ this.spaceCharRatio = spaceCharRatio;
+ }
+
+ /** Sets the run direction. This is only used as a placeholder
+ * as it does not affect anything.
+ * @param runDirection the run direction
+ */
+ public void setRunDirection(int runDirection) {
+ if (runDirection < RUN_DIRECTION_NO_BIDI || runDirection > RUN_DIRECTION_RTL)
+ throw new RuntimeException("Invalid run direction: " + runDirection);
+ this.runDirection = runDirection;
+ }
+
+ /** Gets the run direction.
+ * @return the run direction
+ */
+ public int getRunDirection() {
+ return runDirection;
+ }
+
+ /**
+ * Sets the display duration for the page (for presentations)
+ * @param seconds the number of seconds to display the page
+ */
+ public void setDuration(int seconds) {
+ pdf.setDuration(seconds);
+ }
+
+ /**
+ * Sets the transition for the page
+ * @param transition the Transition object
+ */
+ public void setTransition(PdfTransition transition) {
+ pdf.setTransition(transition);
+ }
+
+ /** Writes the reader to the document and frees the memory used by it.
+ * The main use is when concatenating multiple documents to keep the
+ * memory usage restricted to the current appending document.
+ * @param reader the <CODE>PdfReader</CODE> to free
+ * @throws IOException on error
+ */
+ public void freeReader(PdfReader reader) throws IOException {
+ currentPdfReaderInstance = (PdfReaderInstance)importedPages.get(reader);
+ if (currentPdfReaderInstance == null)
+ return;
+ currentPdfReaderInstance.writeAllPages();
+ currentPdfReaderInstance = null;
+ importedPages.remove(reader);
+ }
+
+ /** Sets the open and close page additional action.
+ * @param actionType the action type. It can be <CODE>PdfWriter.PAGE_OPEN</CODE>
+ * or <CODE>PdfWriter.PAGE_CLOSE</CODE>
+ * @param action the action to perform
+ * @throws PdfException if the action type is invalid
+ */
+ public void setPageAction(PdfName actionType, PdfAction action) throws PdfException {
+ if (!actionType.equals(PAGE_OPEN) && !actionType.equals(PAGE_CLOSE))
+ throw new PdfException("Invalid page additional action type: " + actionType.toString());
+ pdf.setPageAction(actionType, action);
+ }
+
+ /** Gets the current document size. This size only includes
+ * the data already writen to the output stream, it does not
+ * include templates or fonts. It is usefull if used with
+ * <CODE>freeReader()</CODE> when concatenating many documents
+ * and an idea of the current size is needed.
+ * @return the approximate size without fonts or templates
+ */
+ public int getCurrentDocumentSize() {
+ return body.offset() + body.size() * 20 + 0x48;
+ }
+
+ /** Getter for property strictImageSequence.
+ * @return value of property strictImageSequence
+ *
+ */
+ public boolean isStrictImageSequence() {
+ return pdf.isStrictImageSequence();
+ }
+
+ /** Sets the image sequence to follow the text in strict order.
+ * @param strictImageSequence new value of property strictImageSequence
+ *
+ */
+ public void setStrictImageSequence(boolean strictImageSequence) {
+ pdf.setStrictImageSequence(strictImageSequence);
+ }
+
+ /**
+ * If you use setPageEmpty(false), invoking newPage() after a blank page will add a newPage.
+ * @param pageEmpty the state
+ */
+ public void setPageEmpty(boolean pageEmpty) {
+ pdf.setPageEmpty(pageEmpty);
+ }
+
+ /** Gets the info dictionary for changing.
+ * @return the info dictionary
+ */
+ public PdfDictionary getInfo() {
+ return ((PdfDocument)document).getInfo();
+ }
+
+ /**
+ * Sets extra keys to the catalog.
+ * @return the catalog to change
+ */
+ public PdfDictionary getExtraCatalog() {
+ if (extraCatalog == null)
+ extraCatalog = new PdfDictionary();
+ return this.extraCatalog;
+ }
+
+ /**
+ * Sets the document in a suitable way to do page reordering.
+ */
+ public void setLinearPageMode() {
+ root.setLinearMode(null);
+ }
+
+ /** Getter for property group.
+ * @return Value of property group.
+ *
+ */
+ public PdfDictionary getGroup() {
+ return this.group;
+ }
+
+ /** Setter for property group.
+ * @param group New value of property group.
+ *
+ */
+ public void setGroup(PdfDictionary group) {
+ this.group = group;
+ }
+
+ /**
+ * Sets the PDFX conformance level. Allowed values are PDFX1A2001 and PDFX32002. It
+ * must be called before opening the document.
+ * @param pdfxConformance the conformance level
+ */
+ public void setPDFXConformance(int pdfxConformance) {
+ if (this.pdfxConformance == pdfxConformance)
+ return;
+ if (pdf.isOpen())
+ throw new PdfXConformanceException("PDFX conformance can only be set before opening the document.");
+ if (crypto != null)
+ throw new PdfXConformanceException("A PDFX conforming document cannot be encrypted.");
+ if (pdfxConformance != PDFXNONE)
+ setPdfVersion(VERSION_1_3);
+ this.pdfxConformance = pdfxConformance;
+ }
+
+ /**
+ * Gets the PDFX conformance level.
+ * @return the PDFX conformance level
+ */
+ public int getPDFXConformance() {
+ return pdfxConformance;
+ }
+
+ static void checkPDFXConformance(PdfWriter writer, int key, Object obj1) {
+ if (writer == null || writer.pdfxConformance == PDFXNONE)
+ return;
+ int conf = writer.pdfxConformance;
+ switch (key) {
+ case PDFXKEY_COLOR:
+ switch (conf) {
+ case PDFX1A2001:
+ if (obj1 instanceof ExtendedColor) {
+ ExtendedColor ec = (ExtendedColor)obj1;
+ switch (ec.getType()) {
+ case ExtendedColor.TYPE_CMYK:
+ case ExtendedColor.TYPE_GRAY:
+ return;
+ case ExtendedColor.TYPE_RGB:
+ throw new PdfXConformanceException("Colorspace RGB is not allowed.");
+ case ExtendedColor.TYPE_SEPARATION:
+ SpotColor sc = (SpotColor)ec;
+ checkPDFXConformance(writer, PDFXKEY_COLOR, sc.getPdfSpotColor().getAlternativeCS());
+ break;
+ case ExtendedColor.TYPE_SHADING:
+ ShadingColor xc = (ShadingColor)ec;
+ checkPDFXConformance(writer, PDFXKEY_COLOR, xc.getPdfShadingPattern().getShading().getColorSpace());
+ break;
+ case ExtendedColor.TYPE_PATTERN:
+ PatternColor pc = (PatternColor)ec;
+ checkPDFXConformance(writer, PDFXKEY_COLOR, pc.getPainter().getDefaultColor());
+ break;
+ }
+ }
+ else if (obj1 instanceof Color)
+ throw new PdfXConformanceException("Colorspace RGB is not allowed.");
+ break;
+ }
+ break;
+ case PDFXKEY_CMYK:
+ break;
+ case PDFXKEY_RGB:
+ if (conf == PDFX1A2001)
+ throw new PdfXConformanceException("Colorspace RGB is not allowed.");
+ break;
+ case PDFXKEY_FONT:
+ if (!((BaseFont)obj1).isEmbedded())
+ throw new PdfXConformanceException("All the fonts must be embedded.");
+ break;
+ case PDFXKEY_IMAGE:
+ PdfImage image = (PdfImage)obj1;
+ if (image.get(PdfName.SMASK) != null)
+ throw new PdfXConformanceException("The /SMask key is not allowed in images.");
+ switch (conf) {
+ case PDFX1A2001:
+ PdfObject cs = image.get(PdfName.COLORSPACE);
+ if (cs == null)
+ return;
+ if (cs.isName()) {
+ if (PdfName.DEVICERGB.equals(cs))
+ throw new PdfXConformanceException("Colorspace RGB is not allowed.");
+ }
+ else if (cs.isArray()) {
+ if (PdfName.CALRGB.equals(((PdfArray)cs).getArrayList().get(0)))
+ throw new PdfXConformanceException("Colorspace CalRGB is not allowed.");
+ }
+ break;
+ }
+ break;
+ case PDFXKEY_GSTATE:
+ PdfDictionary gs = (PdfDictionary)obj1;
+ PdfObject obj = gs.get(PdfName.BM);
+ if (obj != null && !PdfGState.BM_NORMAL.equals(obj) && !PdfGState.BM_COMPATIBLE.equals(obj))
+ throw new PdfXConformanceException("Blend mode " + obj.toString() + " not allowed.");
+ obj = gs.get(PdfName.CA);
+ double v = 0.0;
+ if (obj != null && (v = ((PdfNumber)obj).doubleValue()) != 1.0)
+ throw new PdfXConformanceException("Transparency is not allowed: /CA = " + v);
+ obj = gs.get(PdfName.ca);
+ v = 0.0;
+ if (obj != null && (v = ((PdfNumber)obj).doubleValue()) != 1.0)
+ throw new PdfXConformanceException("Transparency is not allowed: /ca = " + v);
+ break;
+ case PDFXKEY_LAYER:
+ throw new PdfXConformanceException("Layers are not allowed.");
+ }
+ }
+
+ /**
+ * Sets the values of the output intent dictionary. Null values are allowed to
+ * suppress any key.
+ * @param outputConditionIdentifier a value
+ * @param outputCondition a value
+ * @param registryName a value
+ * @param info a value
+ * @param destOutputProfile a value
+ * @throws IOException on error
+ */
+ public void setOutputIntents(String outputConditionIdentifier, String outputCondition, String registryName, String info, byte destOutputProfile[]) throws IOException {
+ getExtraCatalog();
+ PdfDictionary out = new PdfDictionary(PdfName.OUTPUTINTENT);
+ if (outputCondition != null)
+ out.put(PdfName.OUTPUTCONDITION, new PdfString(outputCondition, PdfObject.TEXT_UNICODE));
+ if (outputConditionIdentifier != null)
+ out.put(PdfName.OUTPUTCONDITIONIDENTIFIER, new PdfString(outputConditionIdentifier, PdfObject.TEXT_UNICODE));
+ if (registryName != null)
+ out.put(PdfName.REGISTRYNAME, new PdfString(registryName, PdfObject.TEXT_UNICODE));
+ if (info != null)
+ out.put(PdfName.INFO, new PdfString(registryName, PdfObject.TEXT_UNICODE));
+ if (destOutputProfile != null) {
+ PdfStream stream = new PdfStream(destOutputProfile);
+ stream.flateCompress();
+ out.put(PdfName.DESTOUTPUTPROFILE, addToBody(stream).getIndirectReference());
+ }
+ out.put(PdfName.S, PdfName.GTS_PDFX);
+ extraCatalog.put(PdfName.OUTPUTINTENTS, new PdfArray(out));
+ }
+
+ private static String getNameString(PdfDictionary dic, PdfName key) {
+ PdfObject obj = PdfReader.getPdfObject(dic.get(key));
+ if (obj == null || !obj.isString())
+ return null;
+ return ((PdfString)obj).toUnicodeString();
+ }
+
+ /**
+ * Copies the output intent dictionary from other document to this one.
+ * @param reader the other document
+ * @param checkExistence <CODE>true</CODE> to just check for the existence of a valid output intent
+ * dictionary, <CODE>false</CODE> to insert the dictionary if it exists
+ * @throws IOException on error
+ * @return <CODE>true</CODE> if the output intent dictionary exists, <CODE>false</CODE>
+ * otherwise
+ */
+ public boolean setOutputIntents(PdfReader reader, boolean checkExistence) throws IOException {
+ PdfDictionary catalog = reader.getCatalog();
+ PdfArray outs = (PdfArray)PdfReader.getPdfObject(catalog.get(PdfName.OUTPUTINTENTS));
+ if (outs == null)
+ return false;
+ ArrayList arr = outs.getArrayList();
+ if (arr.size() == 0)
+ return false;
+ PdfDictionary out = (PdfDictionary)PdfReader.getPdfObject((PdfObject)arr.get(0));
+ PdfObject obj = PdfReader.getPdfObject(out.get(PdfName.S));
+ if (obj == null || !PdfName.GTS_PDFX.equals(obj))
+ return false;
+ if (checkExistence)
+ return true;
+ PRStream stream = (PRStream)PdfReader.getPdfObject(out.get(PdfName.DESTOUTPUTPROFILE));
+ byte destProfile[] = null;
+ if (stream != null) {
+ destProfile = PdfReader.getStreamBytes(stream);
+ }
+ setOutputIntents(getNameString(out, PdfName.OUTPUTCONDITIONIDENTIFIER), getNameString(out, PdfName.OUTPUTCONDITION),
+ getNameString(out, PdfName.REGISTRYNAME), getNameString(out, PdfName.INFO), destProfile);
+ return true;
+ }
+
+ /**
+ * Sets the page box sizes. Allowed names are: "crop", "trim", "art" and "bleed".
+ * @param boxName the box size
+ * @param size the size
+ */
+ public void setBoxSize(String boxName, Rectangle size) {
+ pdf.setBoxSize(boxName, size);
+ }
+
+ /**
+ * Gives the size of a trim, art, crop or bleed box, or null if not defined.
+ * @param boxName crop, trim, art or bleed
+ */
+ public Rectangle getBoxSize(String boxName) {
+ return pdf.getBoxSize(boxName);
+ }
+
+ /**
+ * Gives the size of the media box.
+ * @return a Rectangle
+ */
+ public Rectangle getPageSize() {
+ return pdf.getPageSize();
+ }
+ /**
+ * Gets the default colorspaces.
+ * @return the default colorspaces
+ */
+ public PdfDictionary getDefaultColorspace() {
+ return defaultColorspace;
+ }
+
+ /**
+ * Sets the default colorspace that will be applied to all the document.
+ * The colorspace is only applied if another colorspace with the same name
+ * is not present in the content.
+ * <p>
+ * The colorspace is applied immediately when creating templates and at the page
+ * end for the main document content.
+ * @param key the name of the colorspace. It can be <CODE>PdfName.DEFAULTGRAY</CODE>, <CODE>PdfName.DEFAULTRGB</CODE>
+ * or <CODE>PdfName.DEFAULTCMYK</CODE>
+ * @param cs the colorspace. A <CODE>null</CODE> or <CODE>PdfNull</CODE> removes any colorspace with the same name
+ */
+ public void setDefaultColorspace(PdfName key, PdfObject cs) {
+ if (cs == null || cs.isNull())
+ defaultColorspace.remove(key);
+ defaultColorspace.put(key, cs);
+ }
+
+ /**
+ * Gets the 1.5 compression status.
+ * @return <code>true</code> if the 1.5 compression is on
+ */
+ public boolean isFullCompression() {
+ return this.fullCompression;
+ }
+
+ /**
+ * Sets the document's compression to the new 1.5 mode with object streams and xref
+ * streams. It can be set at any time but once set it can't be unset.
+ * <p>
+ * If set before opening the document it will also set the pdf version to 1.5.
+ */
+ public void setFullCompression() {
+ this.fullCompression = true;
+ setPdfVersion(VERSION_1_5);
+ }
+
+ /**
+ * Gets the <B>Optional Content Properties Dictionary</B>. Each call fills the dictionary with the current layer
+ * state. It's advisable to only call this method right before close and do any modifications
+ * at that time.
+ * @return the Optional Content Properties Dictionary
+ */
+ public PdfOCProperties getOCProperties() {
+ fillOCProperties(true);
+ return OCProperties;
+ }
+
+ /**
+ * Sets a collection of optional content groups whose states are intended to follow
+ * a "radio button" paradigm. That is, the state of at most one optional
+ * content group in the array should be ON at a time: if one group is turned
+ * ON, all others must be turned OFF.
+ * @param group the radio group
+ */
+ public void addOCGRadioGroup(ArrayList group) {
+ PdfArray ar = new PdfArray();
+ for (int k = 0; k < group.size(); ++k) {
+ PdfLayer layer = (PdfLayer)group.get(k);
+ if (layer.getTitle() == null)
+ ar.add(layer.getRef());
+ }
+ if (ar.size() == 0)
+ return;
+ OCGRadioGroup.add(ar);
+ }
+
+ /**
+ * Sets the the thumbnail image for the current page.
+ * @param image the image
+ * @throws PdfException on error
+ * @throws DocumentException or error
+ */
+ public void setThumbnail(Image image) throws PdfException, DocumentException {
+ pdf.setThumbnail(image);
+ }
+
+ /**
+ * A UserUnit is a value that defines the default user space unit.
+ * The minimum UserUnit is 1 (1 unit = 1/72 inch).
+ * The maximum UserUnit is 75,000.
+ * Remark that this userunit only works starting with PDF1.6!
+ * @return Returns the userunit.
+ */
+ public float getUserunit() {
+ return userunit;
+ }
+ /**
+ * A UserUnit is a value that defines the default user space unit.
+ * The minimum UserUnit is 1 (1 unit = 1/72 inch).
+ * The maximum UserUnit is 75,000.
+ * Remark that this userunit only works starting with PDF1.6!
+ * @param userunit The userunit to set.
+ * @throws DocumentException
+ */
+ public void setUserunit(float userunit) throws DocumentException {
+ if (userunit < 1f || userunit > 75000f) throw new DocumentException("UserUnit should be a value between 1 and 75000.");
+ this.userunit = userunit;
+ setPdfVersion(VERSION_1_6);
+ }
+
+ /**
+ * Sets XMP Metadata.
+ * @param xmpMetadata The xmpMetadata to set.
+ */
+ public void setXmpMetadata(byte[] xmpMetadata) {
+ this.xmpMetadata = xmpMetadata;
+ }
+
+ /**
+ * Creates XMP Metadata based on the metadata in the PdfDocument.
+ */
+ public void createXmpMetadata() {
+ setXmpMetadata(pdf.createXmpMetadata());
+ }
+
+ /**
+ * Releases the memory used by a template by writing it to the output. The template
+ * can still be added to any content but changes to the template itself won't have
+ * any effect.
+ * @param tp the template to release
+ * @throws IOException on error
+ */
+ public void releaseTemplate(PdfTemplate tp) throws IOException {
+ PdfIndirectReference ref = tp.getIndirectReference();
+ Object[] objs = (Object[])formXObjects.get(ref);
+ if (objs == null || objs[1] == null)
+ return;
+ PdfTemplate template = (PdfTemplate)objs[1];
+ if (template.getIndirectReference() instanceof PRIndirectReference)
+ return;
+ if (template.getType() == PdfTemplate.TYPE_TEMPLATE) {
+ addToBody(template.getFormXObject(), template.getIndirectReference());
+ objs[1] = null;
+ }
+ }
+
+ /**
+ * Mark this document for tagging. It must be called before open.
+ */
+ public void setTagged() {
+ if (open)
+ throw new IllegalArgumentException("Tagging must be set before opening the document.");
+ tagged = true;
+ }
+
+ /**
+ * Check if the document is marked for tagging.
+ * @return <CODE>true</CODE> if the document is marked for tagging
+ */
+ public boolean isTagged() {
+ return tagged;
+ }
+
+ /**
+ * Gets the structure tree root. If the document is not marked for tagging it will return <CODE>null</CODE>.
+ * @return the structure tree root
+ */
+ public PdfStructureTreeRoot getStructureTreeRoot() {
+ if (tagged && structureTreeRoot == null)
+ structureTreeRoot = new PdfStructureTreeRoot(this);
+ return structureTreeRoot;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/pdf/PdfXConformanceException.java b/src/main/java/com/lowagie/text/pdf/PdfXConformanceException.java
new file mode 100644
index 0000000..fd9607c
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/PdfXConformanceException.java
@@ -0,0 +1,70 @@
+/*
+ * $Id: PdfXConformanceException.java,v 1.2 2005/02/17 09:20:54 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2004 Paulo Soares
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999-2005 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000-2005 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf;
+
+/**
+ *
+ * @author psoares
+ */
+public class PdfXConformanceException extends RuntimeException {
+
+ /** Creates a new instance of PdfXConformanceException. */
+ public PdfXConformanceException() {
+ }
+
+ /**
+ * Creates a new instance of PdfXConformanceException.
+ * @param s
+ */
+ public PdfXConformanceException(String s) {
+ super(s);
+ }
+}
diff --git a/src/main/java/com/lowagie/text/pdf/Pfm2afm.java b/src/main/java/com/lowagie/text/pdf/Pfm2afm.java
new file mode 100644
index 0000000..1428f53
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/Pfm2afm.java
@@ -0,0 +1,773 @@
+/*
+ * Copyright 2005 by Paulo Soares.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+/********************************************************************
+ * *
+ * Title: pfm2afm - Convert Windows .pfm files to .afm files *
+ * *
+ * Author: Ken Borgendale 10/9/91 Version 1.0 *
+ * *
+ * Function: *
+ * Convert a Windows .pfm (Printer Font Metrics) file to a *
+ * .afm (Adobe Font Metrics) file. The purpose of this is *
+ * to allow fonts put out for Windows to be used with OS/2. *
+ * *
+ * Syntax: *
+ * pfm2afm infile [outfile] -a *
+ * *
+ * Copyright: *
+ * pfm2afm - Copyright (C) IBM Corp., 1991 *
+ * *
+ * This code is released for public use as long as the *
+ * copyright remains intact. This code is provided asis *
+ * without any warrenties, express or implied. *
+ * *
+ * Notes: *
+ * 1. Much of the information in the original .afm file is *
+ * lost when the .pfm file is created, and thus cannot be *
+ * reconstructed by this utility. This is especially true *
+ * of data for characters not in the Windows character set. *
+ * *
+ * 2. This module is coded to be compiled by the MSC 6.0. *
+ * For other compilers, be careful of the packing of the *
+ * PFM structure. *
+ * *
+ ********************************************************************/
+
+/********************************************************************
+ * *
+ * Modifications by Rod Smith, 5/22/96 *
+ * *
+ * These changes look for the strings "italic", "bold", "black", *
+ * and "light" in the font's name and set the weight accordingly *
+ * and adds an ItalicAngle line with a value of "0" or "-12.00". *
+ * This allows OS/2 programs such as DeScribe to handle the bold *
+ * and italic attributes appropriately, which was not the case *
+ * when I used the original version on fonts from the KeyFonts *
+ * Pro 2002 font CD. *
+ * *
+ * I've also increased the size of the buffer used to load the *
+ * .PFM file; the old size was inadequate for most of the fonts *
+ * from the SoftKey collection. *
+ * *
+ * Compiled with Watcom C 10.6 *
+ * *
+ ********************************************************************/
+
+/********************************************************************
+ * *
+ * Further modifications, 4/21/98, by Rod Smith *
+ * *
+ * Minor changes to get the program to compile with gcc under *
+ * Linux (Red Hat 5.0, to be precise). I had to add an itoa *
+ * function from the net (the function was buggy, so I had to fix *
+ * it, too!). I also made the program more friendly towards *
+ * files with mixed-case filenames. *
+ * *
+ ********************************************************************/
+package com.lowagie.text.pdf;
+
+import java.io.*;
+
+/**
+ * Converts a PFM file into an AFM file.
+ */
+public class Pfm2afm {
+ private RandomAccessFileOrArray in;
+ private PrintWriter out;
+
+ /** Creates a new instance of Pfm2afm */
+ private Pfm2afm(RandomAccessFileOrArray in, OutputStream out) throws IOException {
+ this.in = in;
+ this.out = new PrintWriter(new OutputStreamWriter(out, "ISO-8859-1"));
+ }
+
+ /**
+ * Converts a PFM file into an AFM file.
+ * @param in the PFM file
+ * @param out the AFM file
+ * @throws IOException on error
+ */
+ public static void convert(RandomAccessFileOrArray in, OutputStream out) throws IOException {
+ Pfm2afm p = new Pfm2afm(in, out);
+ p.openpfm();
+ p.putheader();
+ p.putchartab();
+ p.putkerntab();
+ p.puttrailer();
+ p.out.flush();
+ }
+
+ public static void main(String[] args) {
+ try {
+ RandomAccessFileOrArray in = new RandomAccessFileOrArray(args[0]);
+ OutputStream out = new FileOutputStream(args[1]);
+ convert(in, out);
+ in.close();
+ out.close();
+ }
+ catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ private String readString(int n) throws IOException {
+ byte b[] = new byte[n];
+ in.readFully(b);
+ int k;
+ for (k = 0; k < b.length; ++k) {
+ if (b[k] == 0)
+ break;
+ }
+ return new String(b, 0, k, "ISO-8859-1");
+ }
+
+ private String readString() throws IOException {
+ StringBuffer buf = new StringBuffer();
+ while (true) {
+ int c = in.read();
+ if (c <= 0)
+ break;
+ buf.append((char)c);
+ }
+ return buf.toString();
+ }
+
+ private void outval(int n) {
+ out.print(' ');
+ out.print(n);
+ }
+
+ /*
+ * Output a character entry
+ */
+ private void outchar(int code, int width, String name) {
+ out.print("C ");
+ outval(code);
+ out.print(" ; WX ");
+ outval(width);
+ if (name != null) {
+ out.print(" ; N ");
+ out.print(name);
+ }
+ out.print(" ;\n");
+ }
+
+ private void openpfm() throws IOException {
+ in.seek(0);
+ vers = in.readShortLE();
+ h_len = in.readIntLE();
+ copyright = readString(60);
+ type = in.readShortLE();
+ points = in.readShortLE();
+ verres = in.readShortLE();
+ horres = in.readShortLE();
+ ascent = in.readShortLE();
+ intleading = in.readShortLE();
+ extleading = in.readShortLE();
+ italic = (byte)in.read();
+ uline = (byte)in.read();
+ overs = (byte)in.read();
+ weight = in.readShortLE();
+ charset = (byte)in.read();
+ pixwidth = in.readShortLE();
+ pixheight = in.readShortLE();
+ kind = (byte)in.read();
+ avgwidth = in.readShortLE();
+ maxwidth = in.readShortLE();
+ firstchar = in.read();
+ lastchar = in.read();
+ defchar = (byte)in.read();
+ brkchar = (byte)in.read();
+ widthby = in.readShortLE();
+ device = in.readIntLE();
+ face = in.readIntLE();
+ bits = in.readIntLE();
+ bitoff = in.readIntLE();
+ extlen = in.readShortLE();
+ psext = in.readIntLE();
+ chartab = in.readIntLE();
+ res1 = in.readIntLE();
+ kernpairs = in.readIntLE();
+ res2 = in.readIntLE();
+ fontname = in.readIntLE();
+ if (h_len != in.length() || extlen != 30 || fontname < 75 || fontname > 512)
+ throw new IOException("Not a valid PFM file.");
+ in.seek(psext + 14);
+ capheight = in.readShortLE();
+ xheight = in.readShortLE();
+ ascender = in.readShortLE();
+ descender = in.readShortLE();
+ }
+
+ private void putheader() throws IOException {
+ out.print("StartFontMetrics 2.0\n");
+ if (copyright.length() > 0)
+ out.print("Comment " + copyright + '\n');
+ out.print("FontName ");
+ in.seek(fontname);
+ String fname = readString();
+ out.print(fname);
+ out.print("\nEncodingScheme ");
+ if (charset != 0)
+ out.print("FontSpecific\n");
+ else
+ out.print("AdobeStandardEncoding\n");
+ /*
+ * The .pfm is missing full name, so construct from font name by
+ * changing the hyphen to a space. This actually works in a lot
+ * of cases.
+ */
+ out.print("FullName " + fname.replace('-', ' '));
+ if (face != 0) {
+ in.seek(face);
+ out.print("\nFamilyName " + readString());
+ }
+
+ out.print("\nWeight ");
+ if (weight > 475 || fname.toLowerCase().indexOf("bold") >= 0)
+ out.print("Bold");
+ else if ((weight < 325 && weight != 0) || fname.toLowerCase().indexOf("light") >= 0)
+ out.print("Light");
+ else if (fname.toLowerCase().indexOf("black") >= 0)
+ out.print("Black");
+ else
+ out.print("Medium");
+
+ out.print("\nItalicAngle ");
+ if (italic != 0 || fname.toLowerCase().indexOf("italic") >= 0)
+ out.print("-12.00");
+ /* this is a typical value; something else may work better for a
+ specific font */
+ else
+ out.print("0");
+
+ /*
+ * The mono flag in the pfm actually indicates whether there is a
+ * table of font widths, not if they are all the same.
+ */
+ out.print("\nIsFixedPitch ");
+ if ((kind & 1) == 0 || /* Flag for mono */
+ avgwidth == maxwidth ) { /* Avg width = max width */
+ out.print("true");
+ isMono = true;
+ }
+ else {
+ out.print("false");
+ isMono = false;
+ }
+
+ /*
+ * The font bounding box is lost, but try to reconstruct it.
+ * Much of this is just guess work. The bounding box is required in
+ * the .afm, but is not used by the PM font installer.
+ */
+ out.print("\nFontBBox");
+ if (isMono)
+ outval(-20); /* Just guess at left bounds */
+ else
+ outval(-100);
+ outval(-(descender+5)); /* Descender is given as positive value */
+ outval(maxwidth+10);
+ outval(ascent+5);
+
+ /*
+ * Give other metrics that were kept
+ */
+ out.print("\nCapHeight");
+ outval(capheight);
+ out.print("\nXHeight");
+ outval(xheight);
+ out.print("\nDescender");
+ outval(descender);
+ out.print("\nAscender");
+ outval(ascender);
+ out.print('\n');
+ }
+
+ private void putchartab() throws IOException {
+ int count = lastchar - firstchar + 1;
+ int ctabs[] = new int[count];
+ in.seek(chartab);
+ for (int k = 0; k < count; ++k)
+ ctabs[k] = in.readUnsignedShortLE();
+ int back[] = new int[256];
+ if (charset == 0) {
+ for (int i = firstchar; i <= lastchar; ++i) {
+ if (Win2PSStd[i] != 0)
+ back[Win2PSStd[i]] = i;
+ }
+ }
+ /* Put out the header */
+ out.print("StartCharMetrics");
+ outval(count);
+ out.print('\n');
+
+ /* Put out all encoded chars */
+ if (charset != 0) {
+ /*
+ * If the charset is not the Windows standard, just put out
+ * unnamed entries.
+ */
+ for (int i = firstchar; i <= lastchar; i++) {
+ if (ctabs[i - firstchar] != 0) {
+ outchar(i, ctabs[i - firstchar], null);
+ }
+ }
+ }
+ else {
+ for (int i = 0; i < 256; i++) {
+ int j = back[i];
+ if (j != 0) {
+ outchar(i, ctabs[j - firstchar], WinChars[j]);
+ ctabs[j - firstchar] = 0;
+ }
+ }
+ /* Put out all non-encoded chars */
+ for (int i = firstchar; i <= lastchar; i++) {
+ if (ctabs[i - firstchar] != 0) {
+ outchar(-1, ctabs[i - firstchar], WinChars[i]);
+ }
+ }
+ }
+ /* Put out the trailer */
+ out.print("EndCharMetrics\n");
+
+ }
+
+ private void putkerntab() throws IOException {
+ if (kernpairs == 0)
+ return;
+ in.seek(kernpairs);
+ int count = in.readUnsignedShortLE();
+ int nzero = 0;
+ int kerns[] = new int[count * 3];
+ for (int k = 0; k < kerns.length;) {
+ kerns[k++] = in.read();
+ kerns[k++] = in.read();
+ if ((kerns[k++] = in.readShortLE()) != 0)
+ ++nzero;
+ }
+ if (nzero == 0)
+ return;
+ out.print("StartKernData\nStartKernPairs");
+ outval(nzero);
+ out.print('\n');
+ for (int k = 0; k < kerns.length; k += 3) {
+ if (kerns[k + 2] != 0) {
+ out.print("KPX ");
+ out.print(WinChars[kerns[k]]);
+ out.print(' ');
+ out.print(WinChars[kerns[k + 1]]);
+ outval(kerns[k + 2]);
+ out.print('\n');
+ }
+ }
+ /* Put out trailer */
+ out.print("EndKernPairs\nEndKernData\n");
+ }
+
+
+ private void puttrailer() {
+ out.print("EndFontMetrics\n");
+ }
+
+ private short vers;
+ private int h_len; /* Total length of .pfm file */
+ private String copyright; /* Copyright string [60]*/
+ private short type;
+ private short points;
+ private short verres;
+ private short horres;
+ private short ascent;
+ private short intleading;
+ private short extleading;
+ private byte italic;
+ private byte uline;
+ private byte overs;
+ private short weight;
+ private byte charset; /* 0=windows, otherwise nomap */
+ private short pixwidth; /* Width for mono fonts */
+ private short pixheight;
+ private byte kind; /* Lower bit off in mono */
+ private short avgwidth; /* Mono if avg=max width */
+ private short maxwidth; /* Use to compute bounding box */
+ private int firstchar; /* First char in table */
+ private int lastchar; /* Last char in table */
+ private byte defchar;
+ private byte brkchar;
+ private short widthby;
+ private int device;
+ private int face; /* Face name */
+ private int bits;
+ private int bitoff;
+ private short extlen;
+ private int psext; /* PostScript extension */
+ private int chartab; /* Character width tables */
+ private int res1;
+ private int kernpairs; /* Kerning pairs */
+ private int res2;
+ private int fontname; /* Font name */
+
+/*
+ * Some metrics from the PostScript extension
+ */
+ private short capheight; /* Cap height */
+ private short xheight; /* X height */
+ private short ascender; /* Ascender */
+ private short descender; /* Descender (positive) */
+
+
+ private boolean isMono;
+/*
+ * Translate table from 1004 to psstd. 1004 is an extension of the
+ * Windows translate table used in PM.
+ */
+ private int Win2PSStd[] = {
+ 0, 0, 0, 0, 197, 198, 199, 0, 202, 0, 205, 206, 207, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 32, 33, 34, 35, 36, 37, 38, 169, 40, 41, 42, 43, 44, 45, 46, 47,
+ 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
+ 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
+ 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,
+ 193, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
+ 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127,
+ 0, 0, 184, 0, 185, 188, 178, 179, 94, 189, 0, 172, 234, 0, 0, 0,
+ 0, 96, 0, 170, 186, 0, 177, 208, 126, 0, 0, 173, 250, 0, 0, 0,
+ 0, 161, 162, 163, 168, 165, 0, 167, 200, 0, 227, 171, 0, 0, 0, 0,
+ 0, 0, 0, 0, 194, 0, 182, 180, 203, 0, 235, 187, 0, 0, 0, 191,
+ 0, 0, 0, 0, 0, 0, 225, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 233, 0, 0, 0, 0, 0, 0, 251,
+ 0, 0, 0, 0, 0, 0, 241, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 249, 0, 0, 0, 0, 0, 0, 0
+ };
+
+/*
+ * Character class. This is a minor attempt to overcome the problem that
+ * in the pfm file, all unused characters are given the width of space.
+ */
+ private int WinClass[] = {
+ 0, 0, 0, 0, 2, 2, 2, 0, 2, 0, 2, 2, 2, 0, 0, 0, /* 00 */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 10 */
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 20 */
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 30 */
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 40 */
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 50 */
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 60 */
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, /* 70 */
+ 0, 0, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, /* 80 */
+ 0, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 2, /* 90 */
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* a0 */
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* b0 */
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* c0 */
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* d0 */
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* e0 */
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 /* f0 */
+ };
+
+/*
+ * Windows chararacter names. Give a name to the usused locations
+ * for when the all flag is specified.
+ */
+ private String WinChars[] = {
+ "W00", /* 00 */
+ "W01", /* 01 */
+ "W02", /* 02 */
+ "W03", /* 03 */
+ "macron", /* 04 */
+ "breve", /* 05 */
+ "dotaccent", /* 06 */
+ "W07", /* 07 */
+ "ring", /* 08 */
+ "W09", /* 09 */
+ "W0a", /* 0a */
+ "W0b", /* 0b */
+ "W0c", /* 0c */
+ "W0d", /* 0d */
+ "W0e", /* 0e */
+ "W0f", /* 0f */
+ "hungarumlaut", /* 10 */
+ "ogonek", /* 11 */
+ "caron", /* 12 */
+ "W13", /* 13 */
+ "W14", /* 14 */
+ "W15", /* 15 */
+ "W16", /* 16 */
+ "W17", /* 17 */
+ "W18", /* 18 */
+ "W19", /* 19 */
+ "W1a", /* 1a */
+ "W1b", /* 1b */
+ "W1c", /* 1c */
+ "W1d", /* 1d */
+ "W1e", /* 1e */
+ "W1f", /* 1f */
+ "space", /* 20 */
+ "exclam", /* 21 */
+ "quotedbl", /* 22 */
+ "numbersign", /* 23 */
+ "dollar", /* 24 */
+ "percent", /* 25 */
+ "ampersand", /* 26 */
+ "quotesingle", /* 27 */
+ "parenleft", /* 28 */
+ "parenright", /* 29 */
+ "asterisk", /* 2A */
+ "plus", /* 2B */
+ "comma", /* 2C */
+ "hyphen", /* 2D */
+ "period", /* 2E */
+ "slash", /* 2F */
+ "zero", /* 30 */
+ "one", /* 31 */
+ "two", /* 32 */
+ "three", /* 33 */
+ "four", /* 34 */
+ "five", /* 35 */
+ "six", /* 36 */
+ "seven", /* 37 */
+ "eight", /* 38 */
+ "nine", /* 39 */
+ "colon", /* 3A */
+ "semicolon", /* 3B */
+ "less", /* 3C */
+ "equal", /* 3D */
+ "greater", /* 3E */
+ "question", /* 3F */
+ "at", /* 40 */
+ "A", /* 41 */
+ "B", /* 42 */
+ "C", /* 43 */
+ "D", /* 44 */
+ "E", /* 45 */
+ "F", /* 46 */
+ "G", /* 47 */
+ "H", /* 48 */
+ "I", /* 49 */
+ "J", /* 4A */
+ "K", /* 4B */
+ "L", /* 4C */
+ "M", /* 4D */
+ "N", /* 4E */
+ "O", /* 4F */
+ "P", /* 50 */
+ "Q", /* 51 */
+ "R", /* 52 */
+ "S", /* 53 */
+ "T", /* 54 */
+ "U", /* 55 */
+ "V", /* 56 */
+ "W", /* 57 */
+ "X", /* 58 */
+ "Y", /* 59 */
+ "Z", /* 5A */
+ "bracketleft", /* 5B */
+ "backslash", /* 5C */
+ "bracketright", /* 5D */
+ "asciicircum", /* 5E */
+ "underscore", /* 5F */
+ "grave", /* 60 */
+ "a", /* 61 */
+ "b", /* 62 */
+ "c", /* 63 */
+ "d", /* 64 */
+ "e", /* 65 */
+ "f", /* 66 */
+ "g", /* 67 */
+ "h", /* 68 */
+ "i", /* 69 */
+ "j", /* 6A */
+ "k", /* 6B */
+ "l", /* 6C */
+ "m", /* 6D */
+ "n", /* 6E */
+ "o", /* 6F */
+ "p", /* 70 */
+ "q", /* 71 */
+ "r", /* 72 */
+ "s", /* 73 */
+ "t", /* 74 */
+ "u", /* 75 */
+ "v", /* 76 */
+ "w", /* 77 */
+ "x", /* 78 */
+ "y", /* 79 */
+ "z", /* 7A */
+ "braceleft", /* 7B */
+ "bar", /* 7C */
+ "braceright", /* 7D */
+ "asciitilde", /* 7E */
+ "W7f", /* 7F */
+ "W80", /* 80 */
+ "W81", /* 81 */
+ "quotesinglbase", /* 82 */
+ "W83", /* 83 */
+ "quotedblbase", /* 84 */
+ "ellipsis", /* 85 */
+ "dagger", /* 86 */
+ "daggerdbl", /* 87 */
+ "asciicircum", /* 88 */
+ "perthousand", /* 89 */
+ "Scaron", /* 8A */
+ "guilsinglleft", /* 8B */
+ "OE", /* 8C */
+ "W8d", /* 8D */
+ "W8e", /* 8E */
+ "W8f", /* 8F */
+ "W90", /* 90 */
+ "quoteleft", /* 91 */
+ "quoteright", /* 92 */
+ "quotedblleft", /* 93 */
+ "quotedblright", /* 94 */
+ "bullet1", /* 95 */
+ "endash", /* 96 */
+ "emdash", /* 97 */
+ "asciitilde", /* 98 */
+ "trademark", /* 99 */
+ "scaron", /* 9A */
+ "guilsinglright", /* 9B */
+ "oe", /* 9C */
+ "W9d", /* 9D */
+ "W9e", /* 9E */
+ "Ydieresis", /* 9F */
+ "reqspace", /* A0 */
+ "exclamdown", /* A1 */
+ "cent", /* A2 */
+ "sterling", /* A3 */
+ "currency", /* A4 */
+ "yen", /* A5 */
+ "brokenbar", /* A6 */
+ "section", /* A7 */
+ "dieresis", /* A8 */
+ "copyright", /* A9 */
+ "ordfeminine", /* AA */
+ "guillemotleft", /* AB */
+ "logicalnot", /* AC */
+ "syllable", /* AD */
+ "registered", /* AE */
+ "overbar", /* AF */
+ "degree", /* B0 */
+ "plusminus", /* B1 */
+ "twosuperior", /* B2 */
+ "threesuperior", /* B3 */
+ "acute", /* B4 */
+ "mu", /* B5 */
+ "paragraph", /* B6 */
+ "periodcentered", /* B7 */
+ "cedilla", /* B8 */
+ "onesuperior", /* B9 */
+ "ordmasculine", /* BA */
+ "guillemotright", /* BB */
+ "onequarter", /* BC */
+ "onehalf", /* BD */
+ "threequarters", /* BE */
+ "questiondown", /* BF */
+ "Agrave", /* C0 */
+ "Aacute", /* C1 */
+ "Acircumflex", /* C2 */
+ "Atilde", /* C3 */
+ "Adieresis", /* C4 */
+ "Aring", /* C5 */
+ "AE", /* C6 */
+ "Ccedilla", /* C7 */
+ "Egrave", /* C8 */
+ "Eacute", /* C9 */
+ "Ecircumflex", /* CA */
+ "Edieresis", /* CB */
+ "Igrave", /* CC */
+ "Iacute", /* CD */
+ "Icircumflex", /* CE */
+ "Idieresis", /* CF */
+ "Eth", /* D0 */
+ "Ntilde", /* D1 */
+ "Ograve", /* D2 */
+ "Oacute", /* D3 */
+ "Ocircumflex", /* D4 */
+ "Otilde", /* D5 */
+ "Odieresis", /* D6 */
+ "multiply", /* D7 */
+ "Oslash", /* D8 */
+ "Ugrave", /* D9 */
+ "Uacute", /* DA */
+ "Ucircumflex", /* DB */
+ "Udieresis", /* DC */
+ "Yacute", /* DD */
+ "Thorn", /* DE */
+ "germandbls", /* DF */
+ "agrave", /* E0 */
+ "aacute", /* E1 */
+ "acircumflex", /* E2 */
+ "atilde", /* E3 */
+ "adieresis", /* E4 */
+ "aring", /* E5 */
+ "ae", /* E6 */
+ "ccedilla", /* E7 */
+ "egrave", /* E8 */
+ "eacute", /* E9 */
+ "ecircumflex", /* EA */
+ "edieresis", /* EB */
+ "igrave", /* EC */
+ "iacute", /* ED */
+ "icircumflex", /* EE */
+ "idieresis", /* EF */
+ "eth", /* F0 */
+ "ntilde", /* F1 */
+ "ograve", /* F2 */
+ "oacute", /* F3 */
+ "ocircumflex", /* F4 */
+ "otilde", /* F5 */
+ "odieresis", /* F6 */
+ "divide", /* F7 */
+ "oslash", /* F8 */
+ "ugrave", /* F9 */
+ "uacute", /* FA */
+ "ucircumflex", /* FB */
+ "udieresis", /* FC */
+ "yacute", /* FD */
+ "thorn", /* FE */
+ "ydieresis" /* FF */
+ };
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/pdf/PushbuttonField.java b/src/main/java/com/lowagie/text/pdf/PushbuttonField.java
new file mode 100644
index 0000000..ff1769c
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/PushbuttonField.java
@@ -0,0 +1,601 @@
+/*
+ * Copyright 2005 by Paulo Soares.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+package com.lowagie.text.pdf;
+
+import com.lowagie.text.Rectangle;
+import com.lowagie.text.Image;
+import com.lowagie.text.DocumentException;
+import java.io.IOException;
+/**
+ * Creates a pushbutton field. It supports all the text and icon alignments.
+ * The icon may be an image or a template.
+ * <p>
+ * Example usage:
+ * <p>
+ * <PRE>
+ * Document document = new Document(PageSize.A4, 50, 50, 50, 50);
+ * PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("output.pdf"));
+ * document.open();
+ * PdfContentByte cb = writer.getDirectContent();
+ * Image img = Image.getInstance("image.png");
+ * PushbuttonField bt = new PushbuttonField(writer, new Rectangle(100, 100, 200, 200), "Button1");
+ * bt.setText("My Caption");
+ * bt.setFontSize(0);
+ * bt.setImage(img);
+ * bt.setLayout(PushbuttonField.LAYOUT_ICON_TOP_LABEL_BOTTOM);
+ * bt.setBackgroundColor(Color.cyan);
+ * bt.setBorderStyle(PdfBorderDictionary.STYLE_SOLID);
+ * bt.setBorderColor(Color.red);
+ * bt.setBorderWidth(3);
+ * PdfFormField ff = bt.getField();
+ * PdfAction ac = PdfAction.createSubmitForm("http://www.submit-site.com", null, 0);
+ * ff.setAction(ac);
+ * writer.addAnnotation(ff);
+ * document.close();
+ * </PRE>
+ * @author Paulo Soares (psoares@consiste.pt)
+ */
+public class PushbuttonField extends BaseField {
+
+ /** A layout option */
+ public static final int LAYOUT_LABEL_ONLY = 1;
+ /** A layout option */
+ public static final int LAYOUT_ICON_ONLY = 2;
+ /** A layout option */
+ public static final int LAYOUT_ICON_TOP_LABEL_BOTTOM = 3;
+ /** A layout option */
+ public static final int LAYOUT_LABEL_TOP_ICON_BOTTOM = 4;
+ /** A layout option */
+ public static final int LAYOUT_ICON_LEFT_LABEL_RIGHT = 5;
+ /** A layout option */
+ public static final int LAYOUT_LABEL_LEFT_ICON_RIGHT = 6;
+ /** A layout option */
+ public static final int LAYOUT_LABEL_OVER_ICON = 7;
+ /** An icon scaling option */
+ public static final int SCALE_ICON_ALWAYS = 1;
+ /** An icon scaling option */
+ public static final int SCALE_ICON_NEVER = 2;
+ /** An icon scaling option */
+ public static final int SCALE_ICON_IS_TOO_BIG = 3;
+ /** An icon scaling option */
+ public static final int SCALE_ICON_IS_TOO_SMALL = 4;
+
+ /**
+ * Holds value of property layout.
+ */
+ private int layout = LAYOUT_LABEL_ONLY;
+
+ /**
+ * Holds value of property image.
+ */
+ private Image image;
+
+ /**
+ * Holds value of property template.
+ */
+ private PdfTemplate template;
+
+ /**
+ * Holds value of property scaleIcon.
+ */
+ private int scaleIcon = SCALE_ICON_ALWAYS;
+
+ /**
+ * Holds value of property proportionalIcon.
+ */
+ private boolean proportionalIcon = true;
+
+ /**
+ * Holds value of property iconVerticalAdjustment.
+ */
+ private float iconVerticalAdjustment = 0.5f;
+
+ /**
+ * Holds value of property iconHorizontalAdjustment.
+ */
+ private float iconHorizontalAdjustment = 0.5f;
+
+ /**
+ * Holds value of property iconFitToBounds.
+ */
+ private boolean iconFitToBounds;
+
+ private PdfTemplate tp;
+
+ /**
+ * Creates a new instance of PushbuttonField
+ * @param writer the document <CODE>PdfWriter</CODE>
+ * @param box the field location and dimensions
+ * @param fieldName the field name. If <CODE>null</CODE> only the widget keys
+ * will be included in the field allowing it to be used as a kid field.
+ */
+ public PushbuttonField(PdfWriter writer, Rectangle box, String fieldName) {
+ super(writer, box, fieldName);
+ }
+
+ /**
+ * Getter for property layout.
+ * @return Value of property layout.
+ */
+ public int getLayout() {
+ return this.layout;
+ }
+
+ /**
+ * Sets the icon and label layout. Possible values are <CODE>LAYOUT_LABEL_ONLY</CODE>,
+ * <CODE>LAYOUT_ICON_ONLY</CODE>, <CODE>LAYOUT_ICON_TOP_LABEL_BOTTOM</CODE>,
+ * <CODE>LAYOUT_LABEL_TOP_ICON_BOTTOM</CODE>, <CODE>LAYOUT_ICON_LEFT_LABEL_RIGHT</CODE>,
+ * <CODE>LAYOUT_LABEL_LEFT_ICON_RIGHT</CODE> and <CODE>LAYOUT_LABEL_OVER_ICON</CODE>.
+ * The default is <CODE>LAYOUT_LABEL_ONLY</CODE>.
+ * @param layout New value of property layout.
+ */
+ public void setLayout(int layout) {
+ if (layout < LAYOUT_LABEL_ONLY || layout > LAYOUT_LABEL_OVER_ICON)
+ throw new IllegalArgumentException("Layout out of bounds.");
+ this.layout = layout;
+ }
+
+ /**
+ * Getter for property image.
+ * @return Value of property image.
+ */
+ public Image getImage() {
+ return this.image;
+ }
+
+ /**
+ * Sets the icon as an image.
+ * @param image the image
+ */
+ public void setImage(Image image) {
+ this.image = image;
+ template = null;
+ }
+
+ /**
+ * Getter for property template.
+ * @return Value of property template.
+ */
+ public PdfTemplate getTemplate() {
+ return this.template;
+ }
+
+ /**
+ * Sets the icon as a template.
+ * @param template the template
+ */
+ public void setTemplate(PdfTemplate template) {
+ this.template = template;
+ image = null;
+ }
+
+ /**
+ * Getter for property scaleIcon.
+ * @return Value of property scaleIcon.
+ */
+ public int getScaleIcon() {
+ return this.scaleIcon;
+ }
+
+ /**
+ * Sets the way the icon will be scaled. Possible values are
+ * <CODE>SCALE_ICON_ALWAYS</CODE>, <CODE>SCALE_ICON_NEVER</CODE>,
+ * <CODE>SCALE_ICON_IS_TOO_BIG</CODE> and <CODE>SCALE_ICON_IS_TOO_SMALL</CODE>.
+ * The default is <CODE>SCALE_ICON_ALWAYS</CODE>.
+ * @param scaleIcon the way the icon will be scaled
+ */
+ public void setScaleIcon(int scaleIcon) {
+ if (scaleIcon < SCALE_ICON_ALWAYS || scaleIcon > SCALE_ICON_IS_TOO_SMALL)
+ scaleIcon = SCALE_ICON_ALWAYS;
+ this.scaleIcon = scaleIcon;
+ }
+
+ /**
+ * Getter for property proportionalIcon.
+ * @return Value of property proportionalIcon.
+ */
+ public boolean isProportionalIcon() {
+ return this.proportionalIcon;
+ }
+
+ /**
+ * Sets the way the icon is scaled. If <CODE>true</CODE> the icon is scaled proportionally,
+ * if <CODE>false</CODE> the scaling is done anamorphicaly.
+ * @param proportionalIcon the way the icon is scaled
+ */
+ public void setProportionalIcon(boolean proportionalIcon) {
+ this.proportionalIcon = proportionalIcon;
+ }
+
+ /**
+ * Getter for property iconVerticalAdjustment.
+ * @return Value of property iconVerticalAdjustment.
+ */
+ public float getIconVerticalAdjustment() {
+ return this.iconVerticalAdjustment;
+ }
+
+ /**
+ * A number between 0 and 1 indicating the fraction of leftover space to allocate at the bottom of the icon.
+ * A value of 0 positions the icon at the bottom of the annotation rectangle.
+ * A value of 0.5 centers it within the rectangle. The default is 0.5.
+ * @param iconVerticalAdjustment a number between 0 and 1 indicating the fraction of leftover space to allocate at the bottom of the icon
+ */
+ public void setIconVerticalAdjustment(float iconVerticalAdjustment) {
+ if (iconVerticalAdjustment < 0)
+ iconVerticalAdjustment = 0;
+ else if (iconVerticalAdjustment > 1)
+ iconVerticalAdjustment = 1;
+ this.iconVerticalAdjustment = iconVerticalAdjustment;
+ }
+
+ /**
+ * Getter for property iconHorizontalAdjustment.
+ * @return Value of property iconHorizontalAdjustment.
+ */
+ public float getIconHorizontalAdjustment() {
+ return this.iconHorizontalAdjustment;
+ }
+
+ /**
+ * A number between 0 and 1 indicating the fraction of leftover space to allocate at the left of the icon.
+ * A value of 0 positions the icon at the left of the annotation rectangle.
+ * A value of 0.5 centers it within the rectangle. The default is 0.5.
+ * @param iconHorizontalAdjustment a number between 0 and 1 indicating the fraction of leftover space to allocate at the left of the icon
+ */
+ public void setIconHorizontalAdjustment(float iconHorizontalAdjustment) {
+ if (iconHorizontalAdjustment < 0)
+ iconHorizontalAdjustment = 0;
+ else if (iconHorizontalAdjustment > 1)
+ iconHorizontalAdjustment = 1;
+ this.iconHorizontalAdjustment = iconHorizontalAdjustment;
+ }
+
+ private float calculateFontSize(float w, float h) throws IOException, DocumentException {
+ BaseFont ufont = getRealFont();
+ float fsize = fontSize;
+ if (fsize == 0) {
+ float bw = ufont.getWidthPoint(text, 1);
+ if (bw == 0)
+ fsize = 12;
+ else
+ fsize = w / bw;
+ float nfsize = h / (1 - ufont.getFontDescriptor(BaseFont.DESCENT, 1));
+ fsize = Math.min(fsize, nfsize);
+ if (fsize < 4)
+ fsize = 4;
+ }
+ return fsize;
+ }
+
+ /**
+ * Gets the button appearance.
+ * @throws IOException on error
+ * @throws DocumentException on error
+ * @return the button appearance
+ */
+ public PdfAppearance getAppearance() throws IOException, DocumentException {
+ PdfAppearance app = getBorderAppearance();
+ Rectangle box = new Rectangle(app.getBoundingBox());
+ if ((text == null || text.length() == 0) && (layout == LAYOUT_LABEL_ONLY || (image == null && template == null))) {
+ return app;
+ }
+ if (layout == LAYOUT_ICON_ONLY && image == null && template == null)
+ return app;
+ BaseFont ufont = getRealFont();
+ boolean borderExtra = borderStyle == PdfBorderDictionary.STYLE_BEVELED || borderStyle == PdfBorderDictionary.STYLE_INSET;
+ float h = box.height() - borderWidth * 2;
+ float bw2 = borderWidth;
+ if (borderExtra) {
+ h -= borderWidth * 2;
+ bw2 *= 2;
+ }
+ float offsetX = (borderExtra ? 2 * borderWidth : borderWidth);
+ offsetX = Math.max(offsetX, 1);
+ float offX = Math.min(bw2, offsetX);
+ tp = null;
+ float textX = Float.NaN;
+ float textY = 0;
+ float fsize = fontSize;
+ float wt = box.width() - 2 * offX - 2;
+ float ht = box.height() - 2 * offX;
+ float adj = (iconFitToBounds ? 0 : offX + 1);
+ int nlayout = layout;
+ if (image == null && template == null)
+ nlayout = LAYOUT_LABEL_ONLY;
+ Rectangle iconBox = null;
+ while (true) {
+ switch (nlayout) {
+ case LAYOUT_LABEL_ONLY:
+ case LAYOUT_LABEL_OVER_ICON:
+ if (text != null && text.length() > 0 && wt > 0 && ht > 0) {
+ fsize = calculateFontSize(wt, ht);
+ textX = (box.width() - ufont.getWidthPoint(text, fsize)) / 2;
+ textY = (box.height() - ufont.getFontDescriptor(BaseFont.ASCENT, fsize)) / 2;
+ }
+ case LAYOUT_ICON_ONLY:
+ if (nlayout == LAYOUT_LABEL_OVER_ICON || nlayout == LAYOUT_ICON_ONLY)
+ iconBox = new Rectangle(box.left() + adj, box.bottom() + adj, box.right() - adj, box.top() - adj);
+ break;
+ case LAYOUT_ICON_TOP_LABEL_BOTTOM:
+ if (text == null || text.length() == 0 || wt <= 0 || ht <= 0) {
+ nlayout = LAYOUT_ICON_ONLY;
+ continue;
+ }
+ float nht = box.height() * 0.35f - offX;
+ if (nht > 0)
+ fsize = calculateFontSize(wt, nht);
+ else
+ fsize = 4;
+ textX = (box.width() - ufont.getWidthPoint(text, fsize)) / 2;
+ textY = offX - ufont.getFontDescriptor(BaseFont.DESCENT, fsize);
+ iconBox = new Rectangle(box.left() + adj, textY + fsize, box.right() - adj, box.top() - adj);
+ break;
+ case LAYOUT_LABEL_TOP_ICON_BOTTOM:
+ if (text == null || text.length() == 0 || wt <= 0 || ht <= 0) {
+ nlayout = LAYOUT_ICON_ONLY;
+ continue;
+ }
+ nht = box.height() * 0.35f - offX;
+ if (nht > 0)
+ fsize = calculateFontSize(wt, nht);
+ else
+ fsize = 4;
+ textX = (box.width() - ufont.getWidthPoint(text, fsize)) / 2;
+ textY = box.height() - offX - fsize;
+ if (textY < offX)
+ textY = offX;
+ iconBox = new Rectangle(box.left() + adj, box.bottom() + adj, box.right() - adj, textY + ufont.getFontDescriptor(BaseFont.DESCENT, fsize));
+ break;
+ case LAYOUT_LABEL_LEFT_ICON_RIGHT:
+ if (text == null || text.length() == 0 || wt <= 0 || ht <= 0) {
+ nlayout = LAYOUT_ICON_ONLY;
+ continue;
+ }
+ float nw = box.width() * 0.35f - offX;
+ if (nw > 0)
+ fsize = calculateFontSize(wt, nw);
+ else
+ fsize = 4;
+ if (ufont.getWidthPoint(text, fsize) >= wt) {
+ nlayout = LAYOUT_LABEL_ONLY;
+ fsize = fontSize;
+ continue;
+ }
+ textX = offX + 1;
+ textY = (box.height() - ufont.getFontDescriptor(BaseFont.ASCENT, fsize)) / 2;
+ iconBox = new Rectangle(textX + ufont.getWidthPoint(text, fsize), box.bottom() + adj, box.right() - adj, box.top() - adj);
+ break;
+ case LAYOUT_ICON_LEFT_LABEL_RIGHT:
+ if (text == null || text.length() == 0 || wt <= 0 || ht <= 0) {
+ nlayout = LAYOUT_ICON_ONLY;
+ continue;
+ }
+ nw = box.width() * 0.35f - offX;
+ if (nw > 0)
+ fsize = calculateFontSize(wt, nw);
+ else
+ fsize = 4;
+ if (ufont.getWidthPoint(text, fsize) >= wt) {
+ nlayout = LAYOUT_LABEL_ONLY;
+ fsize = fontSize;
+ continue;
+ }
+ textX = box.width() - ufont.getWidthPoint(text, fsize) - offX - 1;
+ textY = (box.height() - ufont.getFontDescriptor(BaseFont.ASCENT, fsize)) / 2;
+ iconBox = new Rectangle(box.left() + adj, box.bottom() + adj, textX - 1, box.top() - adj);
+ break;
+ }
+ break;
+ }
+ if (textY < box.bottom() + offX)
+ textY = box.bottom() + offX;
+ if (iconBox != null && (iconBox.width() <= 0 || iconBox.height() <= 0))
+ iconBox = null;
+ if (iconBox != null) {
+ if (image != null) {
+ tp = new PdfTemplate(writer);
+ tp.setBoundingBox(new Rectangle(image));
+ writer.addDirectTemplateSimple(tp, new PdfName("FRM"));
+ tp.addImage(image, image.width(), 0, 0, image.height(), 0, 0);
+ }
+ else if (template != null) {
+ tp = new PdfTemplate(writer);
+ tp.setBoundingBox(new Rectangle(template.getWidth(), template.getHeight()));
+ writer.addDirectTemplateSimple(tp, new PdfName("FRM"));
+ tp.addTemplate(template, template.getBoundingBox().left(), template.getBoundingBox().bottom());
+ }
+ }
+ if (tp != null) {
+ float icx = iconBox.width() / tp.getBoundingBox().width();
+ float icy = iconBox.height() / tp.getBoundingBox().height();
+ if (proportionalIcon) {
+ switch (scaleIcon) {
+ case SCALE_ICON_IS_TOO_BIG:
+ icx = Math.min(icx, icy);
+ icx = Math.min(icx, 1);
+ break;
+ case SCALE_ICON_IS_TOO_SMALL:
+ icx = Math.min(icx, icy);
+ icx = Math.max(icx, 1);
+ break;
+ case SCALE_ICON_NEVER:
+ icx = 1;
+ break;
+ default:
+ icx = Math.min(icx, icy);
+ break;
+ }
+ icy = icx;
+ }
+ else {
+ switch (scaleIcon) {
+ case SCALE_ICON_IS_TOO_BIG:
+ icx = Math.min(icx, 1);
+ icy = Math.min(icy, 1);
+ break;
+ case SCALE_ICON_IS_TOO_SMALL:
+ icx = Math.max(icx, 1);
+ icy = Math.max(icy, 1);
+ break;
+ case SCALE_ICON_NEVER:
+ icx = icy = 1;
+ break;
+ default:
+ break;
+ }
+ }
+ float xpos = iconBox.left() + (iconBox.width() - (tp.getBoundingBox().width() * icx)) * iconHorizontalAdjustment;
+ float ypos = iconBox.bottom() + (iconBox.height() - (tp.getBoundingBox().height() * icy)) * iconVerticalAdjustment;
+ app.saveState();
+ app.rectangle(iconBox.left(), iconBox.bottom(), iconBox.width(), iconBox.height());
+ app.clip();
+ app.newPath();
+ app.addTemplate(tp, icx, 0, 0, icy, xpos, ypos);
+ app.restoreState();
+ }
+ if (!Float.isNaN(textX)) {
+ app.saveState();
+ app.rectangle(offX, offX, box.width() - 2 * offX, box.height() - 2 * offX);
+ app.clip();
+ app.newPath();
+ if (textColor == null)
+ app.resetGrayFill();
+ else
+ app.setColorFill(textColor);
+ app.beginText();
+ app.setFontAndSize(ufont, fsize);
+ app.setTextMatrix(textX, textY);
+ app.showText(text);
+ app.endText();
+ app.restoreState();
+ }
+ return app;
+ }
+
+ /**
+ * Gets the pushbutton field.
+ * @throws IOException on error
+ * @throws DocumentException on error
+ * @return the pushbutton field
+ */
+ public PdfFormField getField() throws IOException, DocumentException {
+ PdfFormField field = PdfFormField.createPushButton(writer);
+ field.setWidget(box, PdfAnnotation.HIGHLIGHT_INVERT);
+ if (fieldName != null) {
+ field.setFieldName(fieldName);
+ if ((options & READ_ONLY) != 0)
+ field.setFieldFlags(PdfFormField.FF_READ_ONLY);
+ if ((options & REQUIRED) != 0)
+ field.setFieldFlags(PdfFormField.FF_REQUIRED);
+ }
+ if (text != null)
+ field.setMKNormalCaption(text);
+ if (rotation != 0)
+ field.setMKRotation(rotation);
+ field.setBorderStyle(new PdfBorderDictionary(borderWidth, borderStyle, new PdfDashPattern(3)));
+ PdfAppearance tpa = getAppearance();
+ field.setAppearance(PdfAnnotation.APPEARANCE_NORMAL, tpa);
+ PdfAppearance da = (PdfAppearance)tpa.getDuplicate();
+ da.setFontAndSize(getRealFont(), fontSize);
+ if (textColor == null)
+ da.setGrayFill(0);
+ else
+ da.setColorFill(textColor);
+ field.setDefaultAppearanceString(da);
+ if (borderColor != null)
+ field.setMKBorderColor(borderColor);
+ if (backgroundColor != null)
+ field.setMKBackgroundColor(backgroundColor);
+ switch (visibility) {
+ case HIDDEN:
+ field.setFlags(PdfAnnotation.FLAGS_PRINT | PdfAnnotation.FLAGS_HIDDEN);
+ break;
+ case VISIBLE_BUT_DOES_NOT_PRINT:
+ break;
+ case HIDDEN_BUT_PRINTABLE:
+ field.setFlags(PdfAnnotation.FLAGS_PRINT | PdfAnnotation.FLAGS_NOVIEW);
+ break;
+ default:
+ field.setFlags(PdfAnnotation.FLAGS_PRINT);
+ break;
+ }
+ if (tp != null)
+ field.setMKNormalIcon(tp);
+ field.setMKTextPosition(layout - 1);
+ PdfName scale = PdfName.A;
+ if (scaleIcon == SCALE_ICON_IS_TOO_BIG)
+ scale = PdfName.B;
+ else if (scaleIcon == SCALE_ICON_IS_TOO_SMALL)
+ scale = PdfName.S;
+ else if (scaleIcon == SCALE_ICON_NEVER)
+ scale = PdfName.N;
+ field.setMKIconFit(scale, proportionalIcon ? PdfName.P : PdfName.A, iconHorizontalAdjustment,
+ iconVerticalAdjustment, iconFitToBounds);
+ return field;
+ }
+
+ /**
+ * Getter for property iconFitToBounds.
+ * @return Value of property iconFitToBounds.
+ */
+ public boolean isIconFitToBounds() {
+ return this.iconFitToBounds;
+ }
+
+ /**
+ * If <CODE>true</CODE> the icon will be scaled to fit fully within the bounds of the annotation,
+ * if <CODE>false</CODE> the border width will be taken into account. The default
+ * is <CODE>false</CODE>.
+ * @param iconFitToBounds if <CODE>true</CODE> the icon will be scaled to fit fully within the bounds of the annotation,
+ * if <CODE>false</CODE> the border width will be taken into account
+ */
+ public void setIconFitToBounds(boolean iconFitToBounds) {
+ this.iconFitToBounds = iconFitToBounds;
+ }
+
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/pdf/RadioCheckField.java b/src/main/java/com/lowagie/text/pdf/RadioCheckField.java
new file mode 100644
index 0000000..e6a254e
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/RadioCheckField.java
@@ -0,0 +1,416 @@
+/*
+ * Copyright 2005 by Paulo Soares.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+package com.lowagie.text.pdf;
+
+import com.lowagie.text.Rectangle;
+import com.lowagie.text.ExceptionConverter;
+import com.lowagie.text.DocumentException;
+import java.io.IOException;
+
+/**
+ * Creates a radio or a check field.
+ * <p>
+ * Example usage:
+ * <p>
+ * <PRE>
+ * Document document = new Document(PageSize.A4, 50, 50, 50, 50);
+ * PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("output.pdf"));
+ * document.open();
+ * PdfContentByte cb = writer.getDirectContent();
+ * RadioCheckField bt = new RadioCheckField(writer, new Rectangle(100, 100, 200, 200), "radio", "v1");
+ * bt.setCheckType(RadioCheckField.TYPE_CIRCLE);
+ * bt.setBackgroundColor(Color.cyan);
+ * bt.setBorderStyle(PdfBorderDictionary.STYLE_SOLID);
+ * bt.setBorderColor(Color.red);
+ * bt.setTextColor(Color.yellow);
+ * bt.setBorderWidth(BaseField.BORDER_WIDTH_THICK);
+ * bt.setChecked(false);
+ * PdfFormField f1 = bt.getRadioField();
+ * bt.setOnValue("v2");
+ * bt.setChecked(true);
+ * bt.setBox(new Rectangle(100, 300, 200, 400));
+ * PdfFormField f2 = bt.getRadioField();
+ * bt.setChecked(false);
+ * PdfFormField top = bt.getRadioGroup(true, false);
+ * bt.setOnValue("v3");
+ * bt.setBox(new Rectangle(100, 500, 200, 600));
+ * PdfFormField f3 = bt.getRadioField();
+ * top.addKid(f1);
+ * top.addKid(f2);
+ * top.addKid(f3);
+ * writer.addAnnotation(top);
+ * bt = new RadioCheckField(writer, new Rectangle(300, 300, 400, 400), "check1", "Yes");
+ * bt.setCheckType(RadioCheckField.TYPE_CHECK);
+ * bt.setBorderWidth(BaseField.BORDER_WIDTH_THIN);
+ * bt.setBorderColor(Color.black);
+ * bt.setBackgroundColor(Color.white);
+ * PdfFormField ck = bt.getCheckField();
+ * writer.addAnnotation(ck);
+ * document.close();
+ * </PRE>
+ * @author Paulo Soares (psoares@consiste.pt)
+ */
+public class RadioCheckField extends BaseField {
+
+ /** A field with the symbol check */
+ public static final int TYPE_CHECK = 1;
+ /** A field with the symbol circle */
+ public static final int TYPE_CIRCLE = 2;
+ /** A field with the symbol cross */
+ public static final int TYPE_CROSS = 3;
+ /** A field with the symbol diamond */
+ public static final int TYPE_DIAMOND = 4;
+ /** A field with the symbol square */
+ public static final int TYPE_SQUARE = 5;
+ /** A field with the symbol star */
+ public static final int TYPE_STAR = 6;
+
+ private static String typeChars[] = {"4", "l", "8", "u", "n", "H"};
+
+ /**
+ * Holds value of property checkType.
+ */
+ private int checkType;
+
+ /**
+ * Holds value of property onValue.
+ */
+ private String onValue;
+
+ /**
+ * Holds value of property checked.
+ */
+ private boolean checked;
+
+ /**
+ * Creates a new instance of RadioCheckField
+ * @param writer the document <CODE>PdfWriter</CODE>
+ * @param box the field location and dimensions
+ * @param fieldName the field name. It must not be <CODE>null</CODE>
+ * @param onValue the value when the field is checked
+ */
+ public RadioCheckField(PdfWriter writer, Rectangle box, String fieldName, String onValue) {
+ super(writer, box, fieldName);
+ setOnValue(onValue);
+ setCheckType(TYPE_CIRCLE);
+ }
+
+ /**
+ * Getter for property checkType.
+ * @return Value of property checkType.
+ */
+ public int getCheckType() {
+ return this.checkType;
+ }
+
+ /**
+ * Sets the checked symbol. It can be
+ * <CODE>TYPE_CHECK</CODE>,
+ * <CODE>TYPE_CIRCLE</CODE>,
+ * <CODE>TYPE_CROSS</CODE>,
+ * <CODE>TYPE_DIAMOND</CODE>,
+ * <CODE>TYPE_SQUARE</CODE> and
+ * <CODE>TYPE_STAR</CODE>.
+ * @param checkType the checked symbol
+ */
+ public void setCheckType(int checkType) {
+ if (checkType < TYPE_CHECK || checkType > TYPE_STAR)
+ checkType = TYPE_CIRCLE;
+ this.checkType = checkType;
+ setText(typeChars[checkType - 1]);
+ try {
+ setFont(BaseFont.createFont(BaseFont.ZAPFDINGBATS, BaseFont.WINANSI, false));
+ }
+ catch (Exception e) {
+ throw new ExceptionConverter(e);
+ }
+ }
+
+ /**
+ * Getter for property onValue.
+ * @return Value of property onValue.
+ */
+ public String getOnValue() {
+ return this.onValue;
+ }
+
+ /**
+ * Sets the value when the field is checked.
+ * @param onValue the value when the field is checked
+ */
+ public void setOnValue(String onValue) {
+ this.onValue = onValue;
+ }
+
+ /**
+ * Getter for property checked.
+ * @return Value of property checked.
+ */
+ public boolean isChecked() {
+ return this.checked;
+ }
+
+ /**
+ * Sets the state of the field to checked or unchecked.
+ * @param checked the state of the field, <CODE>true</CODE> for checked
+ * and <CODE>false</CODE> for unchecked
+ */
+ public void setChecked(boolean checked) {
+ this.checked = checked;
+ }
+
+ /**
+ * Gets the field appearance.
+ * @param isRadio <CODE>true</CODE> for a radio field and <CODE>false</CODE>
+ * for a check field
+ * @param on <CODE>true</CODE> for the checked state, <CODE>false</CODE>
+ * otherwise
+ * @throws IOException on error
+ * @throws DocumentException on error
+ * @return the appearance
+ */
+ public PdfAppearance getAppearance(boolean isRadio, boolean on) throws IOException, DocumentException {
+ if (isRadio && checkType == TYPE_CIRCLE)
+ return getAppearanceRadioCircle(on);
+ PdfAppearance app = getBorderAppearance();
+ if (!on)
+ return app;
+ BaseFont ufont = getRealFont();
+ boolean borderExtra = borderStyle == PdfBorderDictionary.STYLE_BEVELED || borderStyle == PdfBorderDictionary.STYLE_INSET;
+ float h = box.height() - borderWidth * 2;
+ float bw2 = borderWidth;
+ if (borderExtra) {
+ h -= borderWidth * 2;
+ bw2 *= 2;
+ }
+ float offsetX = (borderExtra ? 2 * borderWidth : borderWidth);
+ offsetX = Math.max(offsetX, 1);
+ float offX = Math.min(bw2, offsetX);
+ float wt = box.width() - 2 * offX;
+ float ht = box.height() - 2 * offX;
+ float fsize = fontSize;
+ if (fsize == 0) {
+ float bw = ufont.getWidthPoint(text, 1);
+ if (bw == 0)
+ fsize = 12;
+ else
+ fsize = wt / bw;
+ float nfsize = h / (ufont.getFontDescriptor(BaseFont.ASCENT, 1));
+ fsize = Math.min(fsize, nfsize);
+ }
+ app.saveState();
+ app.rectangle(offX, offX, box.width() - 2 * offX, box.height() - 2 * offX);
+ app.clip();
+ app.newPath();
+ if (textColor == null)
+ app.resetGrayFill();
+ else
+ app.setColorFill(textColor);
+ app.beginText();
+ app.setFontAndSize(ufont, fsize);
+ app.setTextMatrix((box.width() - ufont.getWidthPoint(text, fsize)) / 2,
+ (box.height() - ufont.getAscentPoint(text, fsize)) / 2);
+ app.showText(text);
+ app.endText();
+ app.restoreState();
+ return app;
+ }
+
+ /**
+ * Gets the special field appearance for the radio circle.
+ * @param on <CODE>true</CODE> for the checked state, <CODE>false</CODE>
+ * otherwise
+ * @return the appearance
+ */
+ public PdfAppearance getAppearanceRadioCircle(boolean on) {
+ PdfAppearance app = new PdfContentByte(writer).createAppearance(box.width(), box.height());
+ switch (rotation) {
+ case 90:
+ app.setMatrix(0, 1, -1, 0, box.height(), 0);
+ break;
+ case 180:
+ app.setMatrix(-1, 0, 0, -1, box.width(), box.height());
+ break;
+ case 270:
+ app.setMatrix(0, -1, 1, 0, 0, box.width());
+ break;
+ }
+ Rectangle box = new Rectangle(app.getBoundingBox());
+ float cx = box.width() / 2;
+ float cy = box.height() / 2;
+ float r = (Math.min(box.width(), box.height()) - borderWidth) / 2;
+ if (r <= 0)
+ return app;
+ if (backgroundColor != null) {
+ app.setColorFill(backgroundColor);
+ app.circle(cx, cy, r + borderWidth / 2);
+ app.fill();
+ }
+ if (borderWidth > 0 && borderColor != null) {
+ app.setLineWidth(borderWidth);
+ app.setColorStroke(borderColor);
+ app.circle(cx, cy, r);
+ app.stroke();
+ }
+ if (on) {
+ if (textColor == null)
+ app.resetGrayFill();
+ else
+ app.setColorFill(textColor);
+ app.circle(cx, cy, r / 2);
+ app.fill();
+ }
+ return app;
+ }
+
+ /**
+ * Gets a radio group. It's composed of the field specific keys, without the widget
+ * ones. This field is to be used as a field aggregator with {@link PdfFormField#addKid(PdfFormField) addKid()}.
+ * @param noToggleToOff if <CODE>true</CODE>, exactly one radio button must be selected at all
+ * times; clicking the currently selected button has no effect.
+ * If <CODE>false</CODE>, clicking
+ * the selected button deselects it, leaving no button selected.
+ * @param radiosInUnison if <CODE>true</CODE>, a group of radio buttons within a radio button field that
+ * use the same value for the on state will turn on and off in unison; that is if
+ * one is checked, they are all checked. If <CODE>false</CODE>, the buttons are mutually exclusive
+ * (the same behavior as HTML radio buttons)
+ * @return the radio group
+ */
+ public PdfFormField getRadioGroup(boolean noToggleToOff, boolean radiosInUnison) {
+ PdfFormField field = PdfFormField.createRadioButton(writer, noToggleToOff);
+ if (radiosInUnison)
+ field.setFieldFlags(PdfFormField.FF_RADIOSINUNISON);
+ field.setFieldName(fieldName);
+ if ((options & READ_ONLY) != 0)
+ field.setFieldFlags(PdfFormField.FF_READ_ONLY);
+ if ((options & REQUIRED) != 0)
+ field.setFieldFlags(PdfFormField.FF_REQUIRED);
+ field.setValueAsName(checked ? onValue : "Off");
+ return field;
+ }
+
+ /**
+ * Gets the radio field. It's only composed of the widget keys and must be used
+ * with {@link #getRadioGroup(boolean,boolean)}.
+ * @return the radio field
+ * @throws IOException on error
+ * @throws DocumentException on error
+ */
+ public PdfFormField getRadioField() throws IOException, DocumentException {
+ return getField(true);
+ }
+
+ /**
+ * Gets the check field.
+ * @return the check field
+ * @throws IOException on error
+ * @throws DocumentException on error
+ */
+ public PdfFormField getCheckField() throws IOException, DocumentException {
+ return getField(false);
+ }
+
+ /**
+ * Gets a radio or check field.
+ * @param isRadio <CODE>true</CODE> to get a radio field, <CODE>false</CODE> to get
+ * a check field
+ * @throws IOException on error
+ * @throws DocumentException on error
+ * @return the field
+ */
+ protected PdfFormField getField(boolean isRadio) throws IOException, DocumentException {
+ PdfFormField field = null;
+ if (isRadio)
+ field = PdfFormField.createEmpty(writer);
+ else
+ field = PdfFormField.createCheckBox(writer);
+ field.setWidget(box, PdfAnnotation.HIGHLIGHT_INVERT);
+ if (!isRadio) {
+ field.setFieldName(fieldName);
+ if ((options & READ_ONLY) != 0)
+ field.setFieldFlags(PdfFormField.FF_READ_ONLY);
+ if ((options & REQUIRED) != 0)
+ field.setFieldFlags(PdfFormField.FF_REQUIRED);
+ field.setValueAsName(checked ? onValue : "Off");
+ }
+ if (text != null)
+ field.setMKNormalCaption(text);
+ if (rotation != 0)
+ field.setMKRotation(rotation);
+ field.setBorderStyle(new PdfBorderDictionary(borderWidth, borderStyle, new PdfDashPattern(3)));
+ PdfAppearance tpon = getAppearance(isRadio, true);
+ PdfAppearance tpoff = getAppearance(isRadio, false);
+ field.setAppearance(PdfAnnotation.APPEARANCE_NORMAL, onValue, tpon);
+ field.setAppearance(PdfAnnotation.APPEARANCE_NORMAL, "Off", tpoff);
+ field.setAppearanceState(checked ? onValue : "Off");
+ PdfAppearance da = (PdfAppearance)tpon.getDuplicate();
+ da.setFontAndSize(getRealFont(), fontSize);
+ if (textColor == null)
+ da.setGrayFill(0);
+ else
+ da.setColorFill(textColor);
+ field.setDefaultAppearanceString(da);
+ if (borderColor != null)
+ field.setMKBorderColor(borderColor);
+ if (backgroundColor != null)
+ field.setMKBackgroundColor(backgroundColor);
+ switch (visibility) {
+ case HIDDEN:
+ field.setFlags(PdfAnnotation.FLAGS_PRINT | PdfAnnotation.FLAGS_HIDDEN);
+ break;
+ case VISIBLE_BUT_DOES_NOT_PRINT:
+ break;
+ case HIDDEN_BUT_PRINTABLE:
+ field.setFlags(PdfAnnotation.FLAGS_PRINT | PdfAnnotation.FLAGS_NOVIEW);
+ break;
+ default:
+ field.setFlags(PdfAnnotation.FLAGS_PRINT);
+ break;
+ }
+ return field;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/pdf/RandomAccessFileOrArray.java b/src/main/java/com/lowagie/text/pdf/RandomAccessFileOrArray.java
new file mode 100644
index 0000000..212a6c8
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/RandomAccessFileOrArray.java
@@ -0,0 +1,609 @@
+/*
+ * $Id: RandomAccessFileOrArray.java,v 1.49 2005/09/12 16:15:23 psoares33 Exp $
+ * $Name: $
+ *
+ * Copyright 2001, 2002 Paulo Soares
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf;
+
+import java.io.DataInputStream;
+import java.io.DataInput;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.EOFException;
+import java.io.RandomAccessFile;
+import java.io.File;
+import java.io.InputStream;
+import java.io.ByteArrayOutputStream;
+import java.net.URL;
+/** An implementation of a RandomAccessFile for input only
+ * that accepts a file or a byte array as data source.
+ *
+ * @author Paulo Soares (psoares@consiste.pt)
+ */
+public class RandomAccessFileOrArray implements DataInput {
+
+ RandomAccessFile rf;
+ String filename;
+ byte arrayIn[];
+ int arrayInPtr;
+ byte back;
+ boolean isBack = false;
+
+ /** Holds value of property startOffset. */
+ private int startOffset = 0;
+
+ public RandomAccessFileOrArray(String filename) throws IOException {
+ this(filename, false);
+ }
+
+ public RandomAccessFileOrArray(String filename, boolean forceRead) throws IOException {
+ File file = new File(filename);
+ if (!file.canRead()) {
+ if (filename.startsWith("file:/") || filename.startsWith("http://") || filename.startsWith("https://") || filename.startsWith("jar:")) {
+ InputStream is = new URL(filename).openStream();
+ try {
+ this.arrayIn = InputStreamToArray(is);
+ return;
+ }
+ finally {
+ try {is.close();}catch(IOException ioe){}
+ }
+ }
+ else {
+ InputStream is = BaseFont.getResourceStream(filename);
+ if (is == null)
+ throw new IOException(filename + " not found as file or resource.");
+ try {
+ this.arrayIn = InputStreamToArray(is);
+ return;
+ }
+ finally {
+ try {is.close();}catch(IOException ioe){}
+ }
+ }
+ }
+ else if (forceRead) {
+ InputStream s = null;
+ try {
+ s = new FileInputStream(file);
+ this.arrayIn = InputStreamToArray(s);
+ }
+ finally {
+ try {s.close();}catch(Exception e){}
+ }
+ return;
+ }
+ this.filename = filename;
+ rf = new RandomAccessFile(filename, "r");
+ }
+
+ public RandomAccessFileOrArray(URL url) throws IOException {
+ InputStream is = url.openStream();
+ try {
+ this.arrayIn = InputStreamToArray(is);
+ }
+ finally {
+ try {is.close();}catch(IOException ioe){}
+ }
+ }
+
+ public RandomAccessFileOrArray(InputStream is) throws IOException {
+ this.arrayIn = InputStreamToArray(is);
+ }
+
+ public static byte[] InputStreamToArray(InputStream is) throws IOException {
+ byte b[] = new byte[8192];
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ while (true) {
+ int read = is.read(b);
+ if (read < 1)
+ break;
+ out.write(b, 0, read);
+ }
+ return out.toByteArray();
+ }
+
+ public RandomAccessFileOrArray(byte arrayIn[]) {
+ this.arrayIn = arrayIn;
+ }
+
+ public RandomAccessFileOrArray(RandomAccessFileOrArray file) {
+ filename = file.filename;
+ arrayIn = file.arrayIn;
+ startOffset = file.startOffset;
+ }
+
+ public void pushBack(byte b) {
+ back = b;
+ isBack = true;
+ }
+
+ public int read() throws IOException {
+ if(isBack) {
+ isBack = false;
+ return back & 0xff;
+ }
+ if (arrayIn == null)
+ return rf.read();
+ else {
+ if (arrayInPtr >= arrayIn.length)
+ return -1;
+ return arrayIn[arrayInPtr++] & 0xff;
+ }
+ }
+
+ public int read(byte[] b, int off, int len) throws IOException {
+ if (len == 0)
+ return 0;
+ int n = 0;
+ if (isBack) {
+ isBack = false;
+ if (len == 1) {
+ b[off] = back;
+ return 1;
+ }
+ else {
+ n = 1;
+ b[off++] = back;
+ --len;
+ }
+ }
+ if (arrayIn == null) {
+ return rf.read(b, off, len) + n;
+ }
+ else {
+ if (arrayInPtr >= arrayIn.length)
+ return -1;
+ if (arrayInPtr + len > arrayIn.length)
+ len = arrayIn.length - arrayInPtr;
+ System.arraycopy(arrayIn, arrayInPtr, b, off, len);
+ arrayInPtr += len;
+ return len + n;
+ }
+ }
+
+ public int read(byte b[]) throws IOException {
+ return read(b, 0, b.length);
+ }
+
+ public void readFully(byte b[]) throws IOException {
+ readFully(b, 0, b.length);
+ }
+
+ public void readFully(byte b[], int off, int len) throws IOException {
+ int n = 0;
+ do {
+ int count = read(b, off + n, len - n);
+ if (count < 0)
+ throw new EOFException();
+ n += count;
+ } while (n < len);
+ }
+
+ public long skip(long n) throws IOException {
+ return skipBytes((int)n);
+ }
+
+ public int skipBytes(int n) throws IOException {
+ if (n <= 0) {
+ return 0;
+ }
+ int adj = 0;
+ if (isBack) {
+ isBack = false;
+ if (n == 1) {
+ return 1;
+ }
+ else {
+ --n;
+ adj = 1;
+ }
+ }
+ int pos;
+ int len;
+ int newpos;
+
+ pos = getFilePointer();
+ len = length();
+ newpos = pos + n;
+ if (newpos > len) {
+ newpos = len;
+ }
+ seek(newpos);
+
+ /* return the actual number of bytes skipped */
+ return newpos - pos + adj;
+ }
+
+ public void reOpen() throws IOException {
+ if (filename != null && rf == null)
+ rf = new RandomAccessFile(filename, "r");
+ seek(0);
+ }
+
+ protected void insureOpen() throws IOException {
+ if (filename != null && rf == null) {
+ reOpen();
+ }
+ }
+
+ public boolean isOpen() {
+ return (filename == null || rf != null);
+ }
+
+ public void close() throws IOException {
+ isBack = false;
+ if (rf != null) {
+ rf.close();
+ rf = null;
+ }
+ }
+
+ public int length() throws IOException {
+ if (arrayIn == null) {
+ insureOpen();
+ return (int)rf.length() - startOffset;
+ }
+ else
+ return arrayIn.length - startOffset;
+ }
+
+ public void seek(int pos) throws IOException {
+ pos += startOffset;
+ isBack = false;
+ if (arrayIn == null) {
+ insureOpen();
+ rf.seek(pos);
+ }
+ else
+ arrayInPtr = pos;
+ }
+
+ public void seek(long pos) throws IOException {
+ seek((int)pos);
+ }
+
+ public int getFilePointer() throws IOException {
+ insureOpen();
+ int n = isBack ? 1 : 0;
+ if (arrayIn == null) {
+ return (int)rf.getFilePointer() - n - startOffset;
+ }
+ else
+ return arrayInPtr - n - startOffset;
+ }
+
+ public boolean readBoolean() throws IOException {
+ int ch = this.read();
+ if (ch < 0)
+ throw new EOFException();
+ return (ch != 0);
+ }
+
+ public byte readByte() throws IOException {
+ int ch = this.read();
+ if (ch < 0)
+ throw new EOFException();
+ return (byte)(ch);
+ }
+
+ public int readUnsignedByte() throws IOException {
+ int ch = this.read();
+ if (ch < 0)
+ throw new EOFException();
+ return ch;
+ }
+
+ public short readShort() throws IOException {
+ int ch1 = this.read();
+ int ch2 = this.read();
+ if ((ch1 | ch2) < 0)
+ throw new EOFException();
+ return (short)((ch1 << 8) + ch2);
+ }
+
+ /**
+ * Reads a signed 16-bit number from this stream in little-endian order.
+ * The method reads two
+ * bytes from this stream, starting at the current stream pointer.
+ * If the two bytes read, in order, are
+ * <code>b1</code> and <code>b2</code>, where each of the two values is
+ * between <code>0</code> and <code>255</code>, inclusive, then the
+ * result is equal to:
+ * <blockquote><pre>
+ * (short)((b2 &lt;&lt; 8) | b1)
+ * </pre></blockquote>
+ * <p>
+ * This method blocks until the two bytes are read, the end of the
+ * stream is detected, or an exception is thrown.
+ *
+ * @return the next two bytes of this stream, interpreted as a signed
+ * 16-bit number.
+ * @exception EOFException if this stream reaches the end before reading
+ * two bytes.
+ * @exception IOException if an I/O error occurs.
+ */
+ public final short readShortLE() throws IOException {
+ int ch1 = this.read();
+ int ch2 = this.read();
+ if ((ch1 | ch2) < 0)
+ throw new EOFException();
+ return (short)((ch2 << 8) + (ch1 << 0));
+ }
+
+ public int readUnsignedShort() throws IOException {
+ int ch1 = this.read();
+ int ch2 = this.read();
+ if ((ch1 | ch2) < 0)
+ throw new EOFException();
+ return (ch1 << 8) + ch2;
+ }
+
+ /**
+ * Reads an unsigned 16-bit number from this stream in little-endian order.
+ * This method reads
+ * two bytes from the stream, starting at the current stream pointer.
+ * If the bytes read, in order, are
+ * <code>b1</code> and <code>b2</code>, where
+ * <code>0&nbsp;&lt;=&nbsp;b1, b2&nbsp;&lt;=&nbsp;255</code>,
+ * then the result is equal to:
+ * <blockquote><pre>
+ * (b2 &lt;&lt; 8) | b1
+ * </pre></blockquote>
+ * <p>
+ * This method blocks until the two bytes are read, the end of the
+ * stream is detected, or an exception is thrown.
+ *
+ * @return the next two bytes of this stream, interpreted as an
+ * unsigned 16-bit integer.
+ * @exception EOFException if this stream reaches the end before reading
+ * two bytes.
+ * @exception IOException if an I/O error occurs.
+ */
+ public final int readUnsignedShortLE() throws IOException {
+ int ch1 = this.read();
+ int ch2 = this.read();
+ if ((ch1 | ch2) < 0)
+ throw new EOFException();
+ return (ch2 << 8) + (ch1 << 0);
+ }
+
+ public char readChar() throws IOException {
+ int ch1 = this.read();
+ int ch2 = this.read();
+ if ((ch1 | ch2) < 0)
+ throw new EOFException();
+ return (char)((ch1 << 8) + ch2);
+ }
+
+ /**
+ * Reads a Unicode character from this stream in little-endian order.
+ * This method reads two
+ * bytes from the stream, starting at the current stream pointer.
+ * If the bytes read, in order, are
+ * <code>b1</code> and <code>b2</code>, where
+ * <code>0&nbsp;&lt;=&nbsp;b1,&nbsp;b2&nbsp;&lt;=&nbsp;255</code>,
+ * then the result is equal to:
+ * <blockquote><pre>
+ * (char)((b2 &lt;&lt; 8) | b1)
+ * </pre></blockquote>
+ * <p>
+ * This method blocks until the two bytes are read, the end of the
+ * stream is detected, or an exception is thrown.
+ *
+ * @return the next two bytes of this stream as a Unicode character.
+ * @exception EOFException if this stream reaches the end before reading
+ * two bytes.
+ * @exception IOException if an I/O error occurs.
+ */
+ public final char readCharLE() throws IOException {
+ int ch1 = this.read();
+ int ch2 = this.read();
+ if ((ch1 | ch2) < 0)
+ throw new EOFException();
+ return (char)((ch2 << 8) + (ch1 << 0));
+ }
+
+ public int readInt() throws IOException {
+ int ch1 = this.read();
+ int ch2 = this.read();
+ int ch3 = this.read();
+ int ch4 = this.read();
+ if ((ch1 | ch2 | ch3 | ch4) < 0)
+ throw new EOFException();
+ return ((ch1 << 24) + (ch2 << 16) + (ch3 << 8) + ch4);
+ }
+
+ /**
+ * Reads a signed 32-bit integer from this stream in little-endian order.
+ * This method reads 4
+ * bytes from the stream, starting at the current stream pointer.
+ * If the bytes read, in order, are <code>b1</code>,
+ * <code>b2</code>, <code>b3</code>, and <code>b4</code>, where
+ * <code>0&nbsp;&lt;=&nbsp;b1, b2, b3, b4&nbsp;&lt;=&nbsp;255</code>,
+ * then the result is equal to:
+ * <blockquote><pre>
+ * (b4 &lt;&lt; 24) | (b3 &lt;&lt; 16) + (b2 &lt;&lt; 8) + b1
+ * </pre></blockquote>
+ * <p>
+ * This method blocks until the four bytes are read, the end of the
+ * stream is detected, or an exception is thrown.
+ *
+ * @return the next four bytes of this stream, interpreted as an
+ * <code>int</code>.
+ * @exception EOFException if this stream reaches the end before reading
+ * four bytes.
+ * @exception IOException if an I/O error occurs.
+ */
+ public final int readIntLE() throws IOException {
+ int ch1 = this.read();
+ int ch2 = this.read();
+ int ch3 = this.read();
+ int ch4 = this.read();
+ if ((ch1 | ch2 | ch3 | ch4) < 0)
+ throw new EOFException();
+ return ((ch4 << 24) + (ch3 << 16) + (ch2 << 8) + (ch1 << 0));
+ }
+
+ /**
+ * Reads an unsigned 32-bit integer from this stream. This method reads 4
+ * bytes from the stream, starting at the current stream pointer.
+ * If the bytes read, in order, are <code>b1</code>,
+ * <code>b2</code>, <code>b3</code>, and <code>b4</code>, where
+ * <code>0&nbsp;&lt;=&nbsp;b1, b2, b3, b4&nbsp;&lt;=&nbsp;255</code>,
+ * then the result is equal to:
+ * <blockquote><pre>
+ * (b1 &lt;&lt; 24) | (b2 &lt;&lt; 16) + (b3 &lt;&lt; 8) + b4
+ * </pre></blockquote>
+ * <p>
+ * This method blocks until the four bytes are read, the end of the
+ * stream is detected, or an exception is thrown.
+ *
+ * @return the next four bytes of this stream, interpreted as a
+ * <code>long</code>.
+ * @exception EOFException if this stream reaches the end before reading
+ * four bytes.
+ * @exception IOException if an I/O error occurs.
+ */
+ public final long readUnsignedInt() throws IOException {
+ long ch1 = this.read();
+ long ch2 = this.read();
+ long ch3 = this.read();
+ long ch4 = this.read();
+ if ((ch1 | ch2 | ch3 | ch4) < 0)
+ throw new EOFException();
+ return ((ch1 << 24) + (ch2 << 16) + (ch3 << 8) + (ch4 << 0));
+ }
+
+ public final long readUnsignedIntLE() throws IOException {
+ long ch1 = this.read();
+ long ch2 = this.read();
+ long ch3 = this.read();
+ long ch4 = this.read();
+ if ((ch1 | ch2 | ch3 | ch4) < 0)
+ throw new EOFException();
+ return ((ch4 << 24) + (ch3 << 16) + (ch2 << 8) + (ch1 << 0));
+ }
+
+ public long readLong() throws IOException {
+ return ((long)(readInt()) << 32) + (readInt() & 0xFFFFFFFFL);
+ }
+
+ public final long readLongLE() throws IOException {
+ int i1 = readIntLE();
+ int i2 = readIntLE();
+ return ((long)i2 << 32) + (i1 & 0xFFFFFFFFL);
+ }
+
+ public float readFloat() throws IOException {
+ return Float.intBitsToFloat(readInt());
+ }
+
+ public final float readFloatLE() throws IOException {
+ return Float.intBitsToFloat(readIntLE());
+ }
+
+ public double readDouble() throws IOException {
+ return Double.longBitsToDouble(readLong());
+ }
+
+ public final double readDoubleLE() throws IOException {
+ return Double.longBitsToDouble(readLongLE());
+ }
+
+ public String readLine() throws IOException {
+ StringBuffer input = new StringBuffer();
+ int c = -1;
+ boolean eol = false;
+
+ while (!eol) {
+ switch (c = read()) {
+ case -1:
+ case '\n':
+ eol = true;
+ break;
+ case '\r':
+ eol = true;
+ int cur = getFilePointer();
+ if ((read()) != '\n') {
+ seek(cur);
+ }
+ break;
+ default:
+ input.append((char)c);
+ break;
+ }
+ }
+
+ if ((c == -1) && (input.length() == 0)) {
+ return null;
+ }
+ return input.toString();
+ }
+
+ public String readUTF() throws IOException {
+ return DataInputStream.readUTF(this);
+ }
+
+ /** Getter for property startOffset.
+ * @return Value of property startOffset.
+ *
+ */
+ public int getStartOffset() {
+ return this.startOffset;
+ }
+
+ /** Setter for property startOffset.
+ * @param startOffset New value of property startOffset.
+ *
+ */
+ public void setStartOffset(int startOffset) {
+ this.startOffset = startOffset;
+ }
+
+}
diff --git a/src/main/java/com/lowagie/text/pdf/SequenceList.java b/src/main/java/com/lowagie/text/pdf/SequenceList.java
new file mode 100644
index 0000000..e00d1d4
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/SequenceList.java
@@ -0,0 +1,317 @@
+/*
+ * Copyright 2004 by Paulo Soares.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+package com.lowagie.text.pdf;
+
+import java.util.List;
+import java.util.LinkedList;
+import java.util.ListIterator;
+
+/**
+ * This class expands a string into a list of numbers. The main use is to select a
+ * range of pages.
+ * <p>
+ * The general systax is:<br>
+ * [!][o][odd][e][even]start-end
+ * <p>
+ * You can have multiple ranges separated by commas ','. The '!' modifier removes the
+ * range from what is already selected. The range changes are incremental, that is,
+ * numbers are added or deleted as the range appears. The start or the end, but not both, can be ommited.
+ */
+public class SequenceList {
+ protected static final int COMMA = 1;
+ protected static final int MINUS = 2;
+ protected static final int NOT = 3;
+ protected static final int TEXT = 4;
+ protected static final int NUMBER = 5;
+ protected static final int END = 6;
+ protected static final char EOT = '\uffff';
+
+ private static final int FIRST = 0;
+ private static final int DIGIT = 1;
+ private static final int OTHER = 2;
+ private static final int DIGIT2 = 3;
+ private static final String NOT_OTHER = "-,!0123456789";
+
+ protected char text[];
+ protected int ptr;
+ protected int number;
+ protected String other;
+
+ protected int low;
+ protected int high;
+ protected boolean odd;
+ protected boolean even;
+ protected boolean inverse;
+
+ protected SequenceList(String range) {
+ ptr = 0;
+ text = range.toCharArray();
+ }
+
+ protected char nextChar() {
+ while (true) {
+ if (ptr >= text.length)
+ return EOT;
+ char c = text[ptr++];
+ if (c > ' ')
+ return c;
+ }
+ }
+
+ protected void putBack() {
+ --ptr;
+ if (ptr < 0)
+ ptr = 0;
+ }
+
+ protected int getType() {
+ StringBuffer buf = new StringBuffer();
+ int state = FIRST;
+ while (true) {
+ char c = nextChar();
+ if (c == EOT) {
+ if (state == DIGIT) {
+ number = Integer.parseInt(other = buf.toString());
+ return NUMBER;
+ }
+ else if (state == OTHER) {
+ other = buf.toString().toLowerCase();
+ return TEXT;
+ }
+ return END;
+ }
+ switch (state) {
+ case FIRST:
+ switch (c) {
+ case '!':
+ return NOT;
+ case '-':
+ return MINUS;
+ case ',':
+ return COMMA;
+ }
+ buf.append(c);
+ if (c >= '0' && c <= '9')
+ state = DIGIT;
+ else
+ state = OTHER;
+ break;
+ case DIGIT:
+ if (c >= '0' && c <= '9')
+ buf.append(c);
+ else {
+ putBack();
+ number = Integer.parseInt(other = buf.toString());
+ return NUMBER;
+ }
+ break;
+ case OTHER:
+ if (NOT_OTHER.indexOf(c) < 0)
+ buf.append(c);
+ else {
+ putBack();
+ other = buf.toString().toLowerCase();
+ return TEXT;
+ }
+ break;
+ }
+ }
+ }
+
+ private void otherProc() {
+ if (other.equals("odd") || other.equals("o")) {
+ odd = true;
+ even = false;
+ }
+ else if (other.equals("even") || other.equals("e")) {
+ odd = false;
+ even = true;
+ }
+ }
+
+ protected boolean getAttributes() {
+ low = -1;
+ high = -1;
+ odd = even = inverse = false;
+ int state = OTHER;
+ while (true) {
+ int type = getType();
+ if (type == END || type == COMMA) {
+ if (state == DIGIT)
+ high = low;
+ return (type == END);
+ }
+ switch (state) {
+ case OTHER:
+ switch (type) {
+ case NOT:
+ inverse = true;
+ break;
+ case MINUS:
+ state = DIGIT2;
+ break;
+ default:
+ if (type == NUMBER) {
+ low = number;
+ state = DIGIT;
+ }
+ else
+ otherProc();
+ break;
+ }
+ break;
+ case DIGIT:
+ switch (type) {
+ case NOT:
+ inverse = true;
+ state = OTHER;
+ high = low;
+ break;
+ case MINUS:
+ state = DIGIT2;
+ break;
+ default:
+ high = low;
+ state = OTHER;
+ otherProc();
+ break;
+ }
+ break;
+ case DIGIT2:
+ switch (type) {
+ case NOT:
+ inverse = true;
+ state = OTHER;
+ break;
+ case MINUS:
+ break;
+ case NUMBER:
+ high = number;
+ state = OTHER;
+ break;
+ default:
+ state = OTHER;
+ otherProc();
+ break;
+ }
+ break;
+ }
+ }
+ }
+
+ /**
+ * Generates a list of numbers from a string.
+ * @param ranges the comma separated ranges
+ * @param maxNumber the maximum number in the range
+ * @return a list with the numbers as <CODE>Integer</CODE>
+ */
+ public static List expand(String ranges, int maxNumber) {
+ SequenceList parse = new SequenceList(ranges);
+ LinkedList list = new LinkedList();
+ boolean sair = false;
+ while (!sair) {
+ sair = parse.getAttributes();
+ if (parse.low == -1 && parse.high == -1 && !parse.even && !parse.odd)
+ continue;
+ if (parse.low < 1)
+ parse.low = 1;
+ if (parse.high < 1 || parse.high > maxNumber)
+ parse.high = maxNumber;
+ if (parse.low > maxNumber)
+ parse.low = maxNumber;
+
+ //System.out.println("low="+parse.low+",high="+parse.high+",odd="+parse.odd+",even="+parse.even+",inverse="+parse.inverse);
+ int inc = 1;
+ if (parse.inverse) {
+ if (parse.low > parse.high) {
+ int t = parse.low;
+ parse.low = parse.high;
+ parse.high = t;
+ }
+ for (ListIterator it = list.listIterator(); it.hasNext();) {
+ int n = ((Integer)it.next()).intValue();
+ if (parse.even && (n & 1) == 1)
+ continue;
+ if (parse.odd && (n & 1) == 0)
+ continue;
+ if (n >= parse.low && n <= parse.high)
+ it.remove();
+ }
+ }
+ else {
+ if (parse.low > parse.high) {
+ inc = -1;
+ if (parse.odd || parse.even) {
+ --inc;
+ if (parse.even)
+ parse.low &= ~1;
+ else
+ parse.low -= ((parse.low & 1) == 1 ? 0 : 1);
+ }
+ for (int k = parse.low; k >= parse.high; k += inc)
+ list.add(new Integer(k));
+ }
+ else {
+ if (parse.odd || parse.even) {
+ ++inc;
+ if (parse.odd)
+ parse.low |= 1;
+ else
+ parse.low += ((parse.low & 1) == 1 ? 1 : 0);
+ }
+ for (int k = parse.low; k <= parse.high; k += inc) {
+ list.add(new Integer(k));
+ }
+ }
+ }
+// for (int k = 0; k < list.size(); ++k)
+// System.out.print(((Integer)list.get(k)).intValue() + ",");
+// System.out.println();
+ }
+ return list;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/pdf/ShadingColor.java b/src/main/java/com/lowagie/text/pdf/ShadingColor.java
new file mode 100644
index 0000000..8d38277
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/ShadingColor.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright 2002 Paulo Soares
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf;
+
+/** Implements a shading pattern as a <code>Color</code>.
+ *
+ * @author Paulo Soares (psoares@consiste.pt)
+ */
+public class ShadingColor extends ExtendedColor {
+
+ PdfShadingPattern shadingPattern;
+
+ /**
+ * Creates a shading color.
+ * @param shadingPattern
+ */
+ public ShadingColor(PdfShadingPattern shadingPattern) {
+ super(TYPE_SHADING, .5f, .5f, .5f);
+ this.shadingPattern = shadingPattern;
+ }
+
+ /**
+ * Gets the shading pattern.
+ * @return a shading pattern.
+ */
+ public PdfShadingPattern getPdfShadingPattern() {
+ return shadingPattern;
+ }
+
+ public boolean equals(Object obj) {
+ return this == obj;
+ }
+
+ public int hashCode() {
+ return shadingPattern.hashCode();
+ }
+
+}
diff --git a/src/main/java/com/lowagie/text/pdf/SimpleBookmark.java b/src/main/java/com/lowagie/text/pdf/SimpleBookmark.java
new file mode 100644
index 0000000..f7bb5a8
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/SimpleBookmark.java
@@ -0,0 +1,745 @@
+/*
+ * Copyright 2003 by Paulo Soares.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf;
+
+import java.util.List;
+import java.util.Iterator;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.StringTokenizer;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.InputStream;
+import java.io.Writer;
+import java.io.Reader;
+import java.io.BufferedWriter;
+import java.io.OutputStreamWriter;
+import java.util.Stack;
+/**
+ * Bookmark processing in a simple way. It has some limitations, mainly the only
+ * action types supported are GoTo, GoToR, URI and Launch.
+ * <p>
+ * The list structure is composed by a number of HashMap, keyed by strings, one HashMap
+ * for each bookmark.
+ * The element values are all strings with the exception of the key "Kids" that has
+ * another list for the child bookmarks.
+ * <p>
+ * All the bookmarks have a "Title" with the
+ * bookmark title and optionally a "Style" that can be "bold", "italic" or a
+ * combination of both. They can also have a "Color" key with a value of three
+ * floats separated by spaces. The key "Open" can have the values "true" or "false" and
+ * signals the open status of the children. It's "true" by default.
+ * <p>
+ * The actions and the parameters can be:
+ * <ul>
+ * <li>"Action" = "GoTo" - "Page" | "Named"
+ * <ul>
+ * <li>"Page" = "3 XYZ 70 400 null" - page number followed by a destination (/XYZ is also accepted)
+ * <li>"Named" = "named_destination"
+ * </ul>
+ * <li>"Action" = "GoToR" - "Page" | "Named" | "NamedN", "File", ["NewWindow"]
+ * <ul>
+ * <li>"Page" = "3 XYZ 70 400 null" - page number followed by a destination (/XYZ is also accepted)
+ * <li>"Named" = "named_destination_as_a_string"
+ * <li>"NamedN" = "named_destination_as_a_name"
+ * <li>"File" - "the_file_to_open"
+ * <li>"NewWindow" - "true" or "false"
+ * </ul>
+ * <li>"Action" = "URI" - "URI"
+ * <ul>
+ * <li>"URI" = "http://sf.net" - URI to jump to
+ * </ul>
+ * <li>"Action" = "Launch" - "File"
+ * <ul>
+ * <li>"File" - "the_file_to_open_or_execute"
+ * </ul>
+ * @author Paulo Soares (psoares@consiste.pt)
+ */
+public class SimpleBookmark implements SimpleXMLDocHandler {
+
+ private ArrayList topList;
+ private Stack attr = new Stack();
+
+ /** Creates a new instance of SimpleBookmark */
+ private SimpleBookmark() {
+ }
+
+ private static List bookmarkDepth(PdfReader reader, PdfDictionary outline, IntHashtable pages) {
+ ArrayList list = new ArrayList();
+ while (outline != null) {
+ HashMap map = new HashMap();
+ PdfString title = (PdfString)PdfReader.getPdfObjectRelease(outline.get(PdfName.TITLE));
+ map.put("Title", title.toUnicodeString());
+ PdfArray color = (PdfArray)PdfReader.getPdfObjectRelease(outline.get(PdfName.C));
+ if (color != null && color.getArrayList().size() == 3) {
+ ByteBuffer out = new ByteBuffer();
+ ArrayList arr = color.getArrayList();
+ out.append(((PdfNumber)arr.get(0)).floatValue()).append(' ');
+ out.append(((PdfNumber)arr.get(1)).floatValue()).append(' ');
+ out.append(((PdfNumber)arr.get(2)).floatValue());
+ map.put("Color", PdfEncodings.convertToString(out.toByteArray(), null));
+ }
+ PdfNumber style = (PdfNumber)PdfReader.getPdfObjectRelease(outline.get(PdfName.F));
+ if (style != null) {
+ int f = style.intValue();
+ String s = "";
+ if ((f & 1) != 0)
+ s += "italic ";
+ if ((f & 2) != 0)
+ s += "bold ";
+ s = s.trim();
+ if (s.length() != 0)
+ map.put("Style", s);
+ }
+ PdfNumber count = (PdfNumber)PdfReader.getPdfObjectRelease(outline.get(PdfName.COUNT));
+ if (count != null && count.intValue() < 0)
+ map.put("Open", "false");
+ try {
+ PdfObject dest = PdfReader.getPdfObjectRelease(outline.get(PdfName.DEST));
+ if (dest != null) {
+ mapGotoBookmark(map, dest, pages); //changed by ujihara 2004-06-13
+ }
+ else {
+ PdfDictionary action = (PdfDictionary)PdfReader.getPdfObjectRelease(outline.get(PdfName.A));
+ if (action != null) {
+ if (PdfName.GOTO.equals(PdfReader.getPdfObjectRelease(action.get(PdfName.S)))) {
+ dest = PdfReader.getPdfObjectRelease(action.get(PdfName.D));
+ if (dest != null) {
+ mapGotoBookmark(map, dest, pages);
+ }
+ }
+ else if (PdfName.URI.equals(PdfReader.getPdfObjectRelease(action.get(PdfName.S)))) {
+ map.put("Action", "URI");
+ map.put("URI", ((PdfString)PdfReader.getPdfObjectRelease(action.get(PdfName.URI))).toUnicodeString());
+ }
+ else if (PdfName.GOTOR.equals(PdfReader.getPdfObjectRelease(action.get(PdfName.S)))) {
+ dest = PdfReader.getPdfObjectRelease(action.get(PdfName.D));
+ if (dest != null) {
+ if (dest.isString())
+ map.put("Named", dest.toString());
+ else if (dest.isName())
+ map.put("NamedN", PdfName.decodeName(dest.toString()));
+ else if (dest.isArray()) {
+ ArrayList arr = ((PdfArray)dest).getArrayList();
+ StringBuffer s = new StringBuffer();
+ s.append(arr.get(0).toString());
+ s.append(' ').append(arr.get(1).toString());
+ for (int k = 2; k < arr.size(); ++k)
+ s.append(' ').append(arr.get(k).toString());
+ map.put("Page", s.toString());
+ }
+ }
+ map.put("Action", "GoToR");
+ PdfObject file = PdfReader.getPdfObjectRelease(action.get(PdfName.F));
+ if (file != null) {
+ if (file.isString())
+ map.put("File", ((PdfString)file).toUnicodeString());
+ else if (file.isDictionary()) {
+ file = PdfReader.getPdfObject(((PdfDictionary)file).get(PdfName.F));
+ if (file.isString())
+ map.put("File", ((PdfString)file).toUnicodeString());
+ }
+ }
+ PdfObject newWindow = PdfReader.getPdfObjectRelease(action.get(PdfName.NEWWINDOW));
+ if (newWindow != null)
+ map.put("NewWindow", newWindow.toString());
+ }
+ else if (PdfName.LAUNCH.equals(PdfReader.getPdfObjectRelease(action.get(PdfName.S)))) {
+ map.put("Action", "Launch");
+ PdfObject file = PdfReader.getPdfObjectRelease(action.get(PdfName.F));
+ if (file == null)
+ file = PdfReader.getPdfObjectRelease(action.get(PdfName.WIN));
+ if (file != null) {
+ if (file.isString())
+ map.put("File", ((PdfString)file).toUnicodeString());
+ else if (file.isDictionary()) {
+ file = PdfReader.getPdfObjectRelease(((PdfDictionary)file).get(PdfName.F));
+ if (file.isString())
+ map.put("File", ((PdfString)file).toUnicodeString());
+ }
+ }
+ }
+ }
+ }
+ }
+ catch (Exception e) {
+ //empty on purpose
+ }
+ PdfDictionary first = (PdfDictionary)PdfReader.getPdfObjectRelease(outline.get(PdfName.FIRST));
+ if (first != null) {
+ map.put("Kids", bookmarkDepth(reader, first, pages));
+ }
+ list.add(map);
+ outline = (PdfDictionary)PdfReader.getPdfObjectRelease(outline.get(PdfName.NEXT));
+ }
+ return list;
+ }
+
+ private static void mapGotoBookmark(HashMap map, PdfObject dest, IntHashtable pages)
+ {
+ if (dest.isString())
+ map.put("Named", dest.toString());
+ else if (dest.isName())
+ map.put("Named", PdfName.decodeName(dest.toString()));
+ else if (dest.isArray())
+ map.put("Page", makeBookmarkParam((PdfArray)dest, pages)); //changed by ujihara 2004-06-13
+ map.put("Action", "GoTo");
+ }
+
+ private static String makeBookmarkParam(PdfArray dest, IntHashtable pages)
+ {
+ ArrayList arr = dest.getArrayList();
+ StringBuffer s = new StringBuffer();
+ s.append(pages.get(getNumber((PdfIndirectReference)arr.get(0)))); //changed by ujihara 2004-06-13
+ s.append(' ').append(arr.get(1).toString().substring(1));
+ for (int k = 2; k < arr.size(); ++k)
+ s.append(' ').append(arr.get(k).toString());
+ return s.toString();
+ }
+
+ /**
+ * Gets number of indirect. If type of directed indirect is PAGES, it refers PAGE object through KIDS.
+ * (Contributed by Kazuya Ujihara)
+ * @param indirect
+ * 2004-06-13
+ */
+ private static int getNumber(PdfIndirectReference indirect)
+ {
+ PdfDictionary pdfObj = (PdfDictionary)PdfReader.getPdfObjectRelease(indirect);
+ if (pdfObj.contains(PdfName.TYPE) && pdfObj.get(PdfName.TYPE).equals(PdfName.PAGES) && pdfObj.contains(PdfName.KIDS))
+ {
+ PdfArray kids = (PdfArray)pdfObj.get(PdfName.KIDS);
+ indirect = (PdfIndirectReference)kids.arrayList.get(0);
+ }
+ return indirect.getNumber();
+ }
+
+ /**
+ * Gets a <CODE>List</CODE> with the bookmarks. It returns <CODE>null</CODE> if
+ * the document doesn't have any bookmarks.
+ * @param reader the document
+ * @return a <CODE>List</CODE> with the bookmarks or <CODE>null</CODE> if the
+ * document doesn't have any
+ */
+ public static List getBookmark(PdfReader reader) {
+ PdfDictionary catalog = reader.getCatalog();
+ PdfObject obj = PdfReader.getPdfObjectRelease(catalog.get(PdfName.OUTLINES));
+ if (obj == null || !obj.isDictionary())
+ return null;
+ PdfDictionary outlines = (PdfDictionary)obj;
+ IntHashtable pages = new IntHashtable();
+ int numPages = reader.getNumberOfPages();
+ for (int k = 1; k <= numPages; ++k) {
+ pages.put(reader.getPageOrigRef(k).getNumber(), k);
+ reader.releasePage(k);
+ }
+ return bookmarkDepth(reader, (PdfDictionary)PdfReader.getPdfObjectRelease(outlines.get(PdfName.FIRST)), pages);
+ }
+
+ /**
+ * Removes the bookmark entries for a number of page ranges. The page ranges
+ * consists of a number of pairs with the start/end page range. The page numbers
+ * are inclusive.
+ * @param list the bookmarks
+ * @param pageRange the page ranges, always in pairs.
+ */
+ public static void eliminatePages(List list, int pageRange[]) {
+ if (list == null)
+ return;
+ for (Iterator it = list.listIterator(); it.hasNext();) {
+ HashMap map = (HashMap)it.next();
+ boolean hit = false;
+ if ("GoTo".equals(map.get("Action"))) {
+ String page = (String)map.get("Page");
+ if (page != null) {
+ page = page.trim();
+ int idx = page.indexOf(' ');
+ int pageNum;
+ if (idx < 0)
+ pageNum = Integer.parseInt(page);
+ else
+ pageNum = Integer.parseInt(page.substring(0, idx));
+ int len = pageRange.length & 0xfffffffe;
+ for (int k = 0; k < len; k += 2) {
+ if (pageNum >= pageRange[k] && pageNum <= pageRange[k + 1]) {
+ hit = true;
+ break;
+ }
+ }
+ }
+ }
+ List kids = (List)map.get("Kids");
+ if (kids != null) {
+ eliminatePages(kids, pageRange);
+ if (kids.size() == 0) {
+ map.remove("Kids");
+ kids = null;
+ }
+ }
+ if (hit) {
+ if (kids == null)
+ it.remove();
+ else {
+ map.remove("Action");
+ map.remove("Page");
+ map.remove("Named");
+ }
+ }
+ }
+ }
+
+ /**
+ * For the pages in range add the <CODE>pageShift</CODE> to the page number.
+ * The page ranges
+ * consists of a number of pairs with the start/end page range. The page numbers
+ * are inclusive.
+ * @param list the bookmarks
+ * @param pageShift the number to add to the pages in range
+ * @param pageRange the page ranges, always in pairs. It can be <CODE>null</CODE>
+ * to include all the pages
+ */
+ public static void shiftPageNumbers(List list, int pageShift, int pageRange[]) {
+ if (list == null)
+ return;
+ for (Iterator it = list.listIterator(); it.hasNext();) {
+ HashMap map = (HashMap)it.next();
+ if ("GoTo".equals(map.get("Action"))) {
+ String page = (String)map.get("Page");
+ if (page != null) {
+ page = page.trim();
+ int idx = page.indexOf(' ');
+ int pageNum;
+ if (idx < 0)
+ pageNum = Integer.parseInt(page);
+ else
+ pageNum = Integer.parseInt(page.substring(0, idx));
+ boolean hit = false;
+ if (pageRange == null)
+ hit = true;
+ else {
+ int len = pageRange.length & 0xfffffffe;
+ for (int k = 0; k < len; k += 2) {
+ if (pageNum >= pageRange[k] && pageNum <= pageRange[k + 1]) {
+ hit = true;
+ break;
+ }
+ }
+ }
+ if (hit) {
+ if (idx < 0)
+ page = (pageNum + pageShift) + "";
+ else
+ page = (pageNum + pageShift) + page.substring(idx);
+ }
+ map.put("Page", page);
+ }
+ }
+ List kids = (List)map.get("Kids");
+ if (kids != null)
+ shiftPageNumbers(kids, pageShift, pageRange);
+ }
+ }
+
+ static void createOutlineAction(PdfDictionary outline, HashMap map, PdfWriter writer, boolean namedAsNames) throws IOException {
+ try {
+ String action = (String)map.get("Action");
+ if ("GoTo".equals(action)) {
+ String p;
+ if ((p = (String)map.get("Named")) != null) {
+ if (namedAsNames)
+ outline.put(PdfName.DEST, new PdfName(p));
+ else
+ outline.put(PdfName.DEST, new PdfString(p, null));
+ }
+ else if ((p = (String)map.get("Page")) != null) {
+ PdfArray ar = new PdfArray();
+ StringTokenizer tk = new StringTokenizer(p);
+ int n = Integer.parseInt(tk.nextToken());
+ ar.add(writer.getPageReference(n));
+ if (!tk.hasMoreTokens()) {
+ ar.add(PdfName.XYZ);
+ ar.add(new float[]{0, 10000, 0});
+ }
+ else {
+ String fn = tk.nextToken();
+ if (fn.startsWith("/"))
+ fn = fn.substring(1);
+ ar.add(new PdfName(fn));
+ for (int k = 0; k < 4 && tk.hasMoreTokens(); ++k) {
+ fn = tk.nextToken();
+ if (fn.equals("null"))
+ ar.add(PdfNull.PDFNULL);
+ else
+ ar.add(new PdfNumber(fn));
+ }
+ }
+ outline.put(PdfName.DEST, ar);
+ }
+ }
+ else if ("GoToR".equals(action)) {
+ String p;
+ PdfDictionary dic = new PdfDictionary();
+ if ((p = (String)map.get("Named")) != null)
+ dic.put(PdfName.D, new PdfString(p, null));
+ else if ((p = (String)map.get("NamedN")) != null)
+ dic.put(PdfName.D, new PdfName(p));
+ else if ((p = (String)map.get("Page")) != null){
+ PdfArray ar = new PdfArray();
+ StringTokenizer tk = new StringTokenizer(p);
+ ar.add(new PdfNumber(tk.nextToken()));
+ if (!tk.hasMoreTokens()) {
+ ar.add(PdfName.XYZ);
+ ar.add(new float[]{0, 10000, 0});
+ }
+ else {
+ String fn = tk.nextToken();
+ if (fn.startsWith("/"))
+ fn = fn.substring(1);
+ ar.add(new PdfName(fn));
+ for (int k = 0; k < 4 && tk.hasMoreTokens(); ++k) {
+ fn = tk.nextToken();
+ if (fn.equals("null"))
+ ar.add(PdfNull.PDFNULL);
+ else
+ ar.add(new PdfNumber(fn));
+ }
+ }
+ dic.put(PdfName.D, ar);
+ }
+ String file = (String)map.get("File");
+ if (dic.size() > 0 && file != null) {
+ dic.put(PdfName.S, PdfName.GOTOR);
+ dic.put(PdfName.F, new PdfString(file));
+ String nw = (String)map.get("NewWindow");
+ if (nw != null) {
+ if (nw.equals("true"))
+ dic.put(PdfName.NEWWINDOW, PdfBoolean.PDFTRUE);
+ else if (nw.equals("false"))
+ dic.put(PdfName.NEWWINDOW, PdfBoolean.PDFFALSE);
+ }
+ outline.put(PdfName.A, dic);
+ }
+ }
+ else if ("URI".equals(action)) {
+ String uri = (String)map.get("URI");
+ if (uri != null) {
+ PdfDictionary dic = new PdfDictionary();
+ dic.put(PdfName.S, PdfName.URI);
+ dic.put(PdfName.URI, new PdfString(uri));
+ outline.put(PdfName.A, dic);
+ }
+ }
+ else if ("Launch".equals(action)) {
+ String file = (String)map.get("File");
+ if (file != null) {
+ PdfDictionary dic = new PdfDictionary();
+ dic.put(PdfName.S, PdfName.LAUNCH);
+ dic.put(PdfName.F, new PdfString(file));
+ outline.put(PdfName.A, dic);
+ }
+ }
+ }
+ catch (Exception e) {
+ // empty on purpose
+ }
+ }
+
+ public static Object[] iterateOutlines(PdfWriter writer, PdfIndirectReference parent, List kids, boolean namedAsNames) throws IOException {
+ PdfIndirectReference refs[] = new PdfIndirectReference[kids.size()];
+ for (int k = 0; k < refs.length; ++k)
+ refs[k] = writer.getPdfIndirectReference();
+ int ptr = 0;
+ int count = 0;
+ for (Iterator it = kids.listIterator(); it.hasNext(); ++ptr) {
+ HashMap map = (HashMap)it.next();
+ Object lower[] = null;
+ List subKid = (List)map.get("Kids");
+ if (subKid != null && subKid.size() > 0)
+ lower = iterateOutlines(writer, refs[ptr], subKid, namedAsNames);
+ PdfDictionary outline = new PdfDictionary();
+ ++count;
+ if (lower != null) {
+ outline.put(PdfName.FIRST, (PdfIndirectReference)lower[0]);
+ outline.put(PdfName.LAST, (PdfIndirectReference)lower[1]);
+ int n = ((Integer)lower[2]).intValue();
+ if ("false".equals(map.get("Open"))) {
+ outline.put(PdfName.COUNT, new PdfNumber(-n));
+ }
+ else {
+ outline.put(PdfName.COUNT, new PdfNumber(n));
+ count += n;
+ }
+ }
+ outline.put(PdfName.PARENT, parent);
+ if (ptr > 0)
+ outline.put(PdfName.PREV, refs[ptr - 1]);
+ if (ptr < refs.length - 1)
+ outline.put(PdfName.NEXT, refs[ptr + 1]);
+ outline.put(PdfName.TITLE, new PdfString((String)map.get("Title"), PdfObject.TEXT_UNICODE));
+ String color = (String)map.get("Color");
+ if (color != null) {
+ try {
+ PdfArray arr = new PdfArray();
+ StringTokenizer tk = new StringTokenizer(color);
+ for (int k = 0; k < 3; ++k) {
+ float f = Float.valueOf(tk.nextToken()).intValue();
+ if (f < 0) f = 0;
+ if (f > 1) f = 1;
+ arr.add(new PdfNumber(f));
+ }
+ outline.put(PdfName.C, arr);
+ } catch(Exception e){} //in case it's malformed
+ }
+ String style = (String)map.get("Style");
+ if (style != null) {
+ style = style.toLowerCase();
+ int bits = 0;
+ if (style.indexOf("italic") >= 0)
+ bits |= 1;
+ if (style.indexOf("bold") >= 0)
+ bits |= 2;
+ if (bits != 0)
+ outline.put(PdfName.F, new PdfNumber(bits));
+ }
+ createOutlineAction(outline, map, writer, namedAsNames);
+ writer.addToBody(outline, refs[ptr]);
+ }
+ return new Object[]{refs[0], refs[refs.length - 1], new Integer(count)};
+ }
+
+ /**
+ * Exports the bookmarks to XML. Only of use if the generation is to be include in
+ * some other XML document.
+ * @param list the bookmarks
+ * @param out the export destination. The writer is not closed
+ * @param indent the indentation level. Pretty printing significant only
+ * @param onlyASCII codes above 127 will always be escaped with &amp;#nn; if <CODE>true</CODE>,
+ * whatever the encoding
+ * @throws IOException on error
+ */
+ public static void exportToXMLNode(List list, Writer out, int indent, boolean onlyASCII) throws IOException {
+ String dep = "";
+ for (int k = 0; k < indent; ++k)
+ dep += " ";
+ for (Iterator it = list.iterator(); it.hasNext();) {
+ HashMap map = (HashMap)it.next();
+ String title = null;
+ out.write(dep);
+ out.write("<Title ");
+ List kids = null;
+ for (Iterator e = map.keySet().iterator(); e.hasNext();) {
+ String key = (String)e.next();
+ if (key.equals("Title")) {
+ title = (String)map.get(key);
+ continue;
+ }
+ else if (key.equals("Kids")) {
+ kids = (List)map.get(key);
+ continue;
+ }
+ else {
+ out.write(key);
+ out.write("=\"");
+ String value = (String)map.get(key);
+ if (key.equals("Named") || key.equals("NamedN"))
+ value = SimpleNamedDestination.escapeBinaryString(value);
+ out.write(SimpleXMLParser.escapeXML(value, onlyASCII));
+ out.write("\" ");
+ }
+ }
+ out.write(">");
+ if (title == null)
+ title = "";
+ out.write(SimpleXMLParser.escapeXML(title, onlyASCII));
+ if (kids != null) {
+ out.write("\n");
+ exportToXMLNode(kids, out, indent + 1, onlyASCII);
+ out.write(dep);
+ }
+ out.write("</Title>\n");
+ }
+ }
+
+ /**
+ * Exports the bookmarks to XML. The DTD for this XML is:
+ * <p>
+ * <pre>
+ * &lt;?xml version='1.0' encoding='UTF-8'?&gt;
+ * &lt;!ELEMENT Title (#PCDATA|Title)*&gt;
+ * &lt;!ATTLIST Title
+ * Action CDATA #IMPLIED
+ * Open CDATA #IMPLIED
+ * Page CDATA #IMPLIED
+ * URI CDATA #IMPLIED
+ * File CDATA #IMPLIED
+ * Named CDATA #IMPLIED
+ * NamedN CDATA #IMPLIED
+ * NewWindow CDATA #IMPLIED
+ * Style CDATA #IMPLIED
+ * Color CDATA #IMPLIED
+ * &gt;
+ * &lt;!ELEMENT Bookmark (Title)*&gt;
+ * </pre>
+ * @param list the bookmarks
+ * @param out the export destination. The stream is not closed
+ * @param encoding the encoding according to IANA conventions
+ * @param onlyASCII codes above 127 will always be escaped with &amp;#nn; if <CODE>true</CODE>,
+ * whatever the encoding
+ * @throws IOException on error
+ */
+ public static void exportToXML(List list, OutputStream out, String encoding, boolean onlyASCII) throws IOException {
+ String jenc = SimpleXMLParser.getJavaEncoding(encoding);
+ Writer wrt = new BufferedWriter(new OutputStreamWriter(out, jenc));
+ exportToXML(list, wrt, encoding, onlyASCII);
+ }
+
+ /**
+ * Exports the bookmarks to XML.
+ * @param list the bookmarks
+ * @param wrt the export destination. The writer is not closed
+ * @param encoding the encoding according to IANA conventions
+ * @param onlyASCII codes above 127 will always be escaped with &amp;#nn; if <CODE>true</CODE>,
+ * whatever the encoding
+ * @throws IOException on error
+ */
+ public static void exportToXML(List list, Writer wrt, String encoding, boolean onlyASCII) throws IOException {
+ wrt.write("<?xml version=\"1.0\" encoding=\"");
+ wrt.write(SimpleXMLParser.escapeXML(encoding, onlyASCII));
+ wrt.write("\"?>\n<Bookmark>\n");
+ exportToXMLNode(list, wrt, 1, onlyASCII);
+ wrt.write("</Bookmark>\n");
+ wrt.flush();
+ }
+
+ /**
+ * Import the bookmarks from XML.
+ * @param in the XML source. The stream is not closed
+ * @throws IOException on error
+ * @return the bookmarks
+ */
+ public static List importFromXML(InputStream in) throws IOException {
+ SimpleBookmark book = new SimpleBookmark();
+ SimpleXMLParser.parse(book, in);
+ return book.topList;
+ }
+
+ /**
+ * Import the bookmarks from XML.
+ * @param in the XML source. The reader is not closed
+ * @throws IOException on error
+ * @return the bookmarks
+ */
+ public static List importFromXML(Reader in) throws IOException {
+ SimpleBookmark book = new SimpleBookmark();
+ SimpleXMLParser.parse(book, in);
+ return book.topList;
+ }
+
+ public void endDocument() {
+ }
+
+ public void endElement(String tag) {
+ if (tag.equals("Bookmark")) {
+ if (attr.isEmpty())
+ return;
+ else
+ throw new RuntimeException("Bookmark end tag out of place.");
+ }
+ if (!tag.equals("Title"))
+ throw new RuntimeException("Invalid end tag - " + tag);
+ HashMap attributes = (HashMap)attr.pop();
+ String title = (String)attributes.get("Title");
+ attributes.put("Title", title.trim());
+ String named = (String)attributes.get("Named");
+ if (named != null)
+ attributes.put("Named", SimpleNamedDestination.unEscapeBinaryString(named));
+ named = (String)attributes.get("NamedN");
+ if (named != null)
+ attributes.put("NamedN", SimpleNamedDestination.unEscapeBinaryString(named));
+ if (attr.isEmpty())
+ topList.add(attributes);
+ else {
+ HashMap parent = (HashMap)attr.peek();
+ List kids = (List)parent.get("Kids");
+ if (kids == null) {
+ kids = new ArrayList();
+ parent.put("Kids", kids);
+ }
+ kids.add(attributes);
+ }
+ }
+
+ public void startDocument() {
+ }
+
+ public void startElement(String tag, HashMap h) {
+ if (topList == null) {
+ if (tag.equals("Bookmark")) {
+ topList = new ArrayList();
+ return;
+ }
+ else
+ throw new RuntimeException("Root element is not Bookmark.");
+ }
+ if (!tag.equals("Title"))
+ throw new RuntimeException("Tag " + tag + " not allowed.");
+ HashMap attributes = new HashMap(h);
+ attributes.put("Title", "");
+ attributes.remove("Kids");
+ attr.push(attributes);
+ }
+
+ public void text(String str) {
+ if (attr.isEmpty())
+ return;
+ HashMap attributes = (HashMap)attr.peek();
+ String title = (String)attributes.get("Title");
+ title += str;
+ attributes.put("Title", title);
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/pdf/SimpleNamedDestination.java b/src/main/java/com/lowagie/text/pdf/SimpleNamedDestination.java
new file mode 100644
index 0000000..1d6410c
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/SimpleNamedDestination.java
@@ -0,0 +1,335 @@
+/*
+ * Copyright 2004 by Paulo Soares.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+package com.lowagie.text.pdf;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Iterator;
+import java.util.ArrayList;
+import java.util.StringTokenizer;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.io.Writer;
+import java.io.BufferedWriter;
+import java.io.InputStream;
+import java.io.Reader;
+
+/**
+ *
+ * @author Paulo Soares (psoares@consiste.pt)
+ */
+public class SimpleNamedDestination implements SimpleXMLDocHandler {
+
+ private HashMap xmlNames;
+ private HashMap xmlLast;
+
+ private SimpleNamedDestination() {
+ }
+
+ public static HashMap getNamedDestination(PdfReader reader, boolean fromNames) {
+ IntHashtable pages = new IntHashtable();
+ int numPages = reader.getNumberOfPages();
+ for (int k = 1; k <= numPages; ++k)
+ pages.put(reader.getPageOrigRef(k).getNumber(), k);
+ HashMap names = fromNames ? reader.getNamedDestinationFromNames() : reader.getNamedDestinationFromStrings();
+ for (Iterator it = names.entrySet().iterator(); it.hasNext();) {
+ Map.Entry entry = (Map.Entry)it.next();
+ ArrayList arr = ((PdfArray)entry.getValue()).getArrayList();
+ StringBuffer s = new StringBuffer();
+ try {
+ s.append(pages.get(((PdfIndirectReference)arr.get(0)).getNumber()));
+ s.append(' ').append(arr.get(1).toString().substring(1));
+ for (int k = 2; k < arr.size(); ++k)
+ s.append(' ').append(arr.get(k).toString());
+ entry.setValue(s.toString());
+ }
+ catch (Exception e) {
+ it.remove();
+ }
+ }
+ return names;
+ }
+
+ /**
+ * Exports the bookmarks to XML. The DTD for this XML is:
+ * <p>
+ * <pre>
+ * &lt;?xml version='1.0' encoding='UTF-8'?&gt;
+ * &lt;!ELEMENT Name (#PCDATA)&gt;
+ * &lt;!ATTLIST Name
+ * Page CDATA #IMPLIED
+ * &gt;
+ * &lt;!ELEMENT Destination (Name)*&gt;
+ * </pre>
+ * @param names the names
+ * @param out the export destination. The stream is not closed
+ * @param encoding the encoding according to IANA conventions
+ * @param onlyASCII codes above 127 will always be escaped with &amp;#nn; if <CODE>true</CODE>,
+ * whatever the encoding
+ * @throws IOException on error
+ */
+ public static void exportToXML(HashMap names, OutputStream out, String encoding, boolean onlyASCII) throws IOException {
+ String jenc = SimpleXMLParser.getJavaEncoding(encoding);
+ Writer wrt = new BufferedWriter(new OutputStreamWriter(out, jenc));
+ exportToXML(names, wrt, encoding, onlyASCII);
+ }
+
+ /**
+ * Exports the bookmarks to XML.
+ * @param names the names
+ * @param wrt the export destination. The writer is not closed
+ * @param encoding the encoding according to IANA conventions
+ * @param onlyASCII codes above 127 will always be escaped with &amp;#nn; if <CODE>true</CODE>,
+ * whatever the encoding
+ * @throws IOException on error
+ */
+ public static void exportToXML(HashMap names, Writer wrt, String encoding, boolean onlyASCII) throws IOException {
+ wrt.write("<?xml version=\"1.0\" encoding=\"");
+ wrt.write(SimpleXMLParser.escapeXML(encoding, onlyASCII));
+ wrt.write("\"?>\n<Destination>\n");
+ for (Iterator it = names.entrySet().iterator(); it.hasNext();) {
+ Map.Entry entry = (Map.Entry)it.next();
+ String key = (String)entry.getKey();
+ String value = (String)entry.getValue();
+ wrt.write(" <Name Page=\"");
+ wrt.write(SimpleXMLParser.escapeXML(value, onlyASCII));
+ wrt.write("\">");
+ wrt.write(SimpleXMLParser.escapeXML(escapeBinaryString(key), onlyASCII));
+ wrt.write("</Name>\n");
+ }
+ wrt.write("</Destination>\n");
+ wrt.flush();
+ }
+
+ /**
+ * Import the names from XML.
+ * @param in the XML source. The stream is not closed
+ * @throws IOException on error
+ * @return the names
+ */
+ public static HashMap importFromXML(InputStream in) throws IOException {
+ SimpleNamedDestination names = new SimpleNamedDestination();
+ SimpleXMLParser.parse(names, in);
+ return names.xmlNames;
+ }
+
+ /**
+ * Import the names from XML.
+ * @param in the XML source. The reader is not closed
+ * @throws IOException on error
+ * @return the names
+ */
+ public static HashMap importFromXML(Reader in) throws IOException {
+ SimpleNamedDestination names = new SimpleNamedDestination();
+ SimpleXMLParser.parse(names, in);
+ return names.xmlNames;
+ }
+
+ static PdfArray createDestinationArray(String value, PdfWriter writer) throws IOException {
+ PdfArray ar = new PdfArray();
+ StringTokenizer tk = new StringTokenizer(value);
+ int n = Integer.parseInt(tk.nextToken());
+ ar.add(writer.getPageReference(n));
+ if (!tk.hasMoreTokens()) {
+ ar.add(PdfName.XYZ);
+ ar.add(new float[]{0, 10000, 0});
+ }
+ else {
+ String fn = tk.nextToken();
+ if (fn.startsWith("/"))
+ fn = fn.substring(1);
+ ar.add(new PdfName(fn));
+ for (int k = 0; k < 4 && tk.hasMoreTokens(); ++k) {
+ fn = tk.nextToken();
+ if (fn.equals("null"))
+ ar.add(PdfNull.PDFNULL);
+ else
+ ar.add(new PdfNumber(fn));
+ }
+ }
+ return ar;
+ }
+
+ public static PdfDictionary outputNamedDestinationAsNames(HashMap names, PdfWriter writer) throws IOException {
+ PdfDictionary dic = new PdfDictionary();
+ for (Iterator it = names.entrySet().iterator(); it.hasNext();) {
+ Map.Entry entry = (Map.Entry)it.next();
+ try {
+ String key = (String)entry.getKey();
+ String value = (String)entry.getValue();
+ PdfArray ar = createDestinationArray(value, writer);
+ PdfName kn = new PdfName(key);
+ dic.put(kn, ar);
+ }
+ catch (Exception e) {
+ // empty on purpose
+ }
+ }
+ return dic;
+ }
+
+ public static PdfDictionary outputNamedDestinationAsStrings(HashMap names, PdfWriter writer) throws IOException {
+ HashMap n2 = new HashMap(names);
+ for (Iterator it = n2.entrySet().iterator(); it.hasNext();) {
+ Map.Entry entry = (Map.Entry)it.next();
+ try {
+ String value = (String)entry.getValue();
+ PdfArray ar = createDestinationArray(value, writer);
+ entry.setValue(writer.addToBody(ar).getIndirectReference());
+ }
+ catch (Exception e) {
+ it.remove();
+ }
+ }
+ return PdfNameTree.writeTree(n2, writer);
+ }
+
+ public static String escapeBinaryString(String s) {
+ StringBuffer buf = new StringBuffer();
+ char cc[] = s.toCharArray();
+ int len = cc.length;
+ for (int k = 0; k < len; ++k) {
+ char c = cc[k];
+ if (c < ' ') {
+ buf.append('\\');
+ String octal = "00" + Integer.toOctalString((int)c);
+ buf.append(octal.substring(octal.length() - 3));
+ }
+ else if (c == '\\')
+ buf.append("\\\\");
+ else
+ buf.append(c);
+ }
+ return buf.toString();
+ }
+
+ public static String unEscapeBinaryString(String s) {
+ StringBuffer buf = new StringBuffer();
+ char cc[] = s.toCharArray();
+ int len = cc.length;
+ for (int k = 0; k < len; ++k) {
+ char c = cc[k];
+ if (c == '\\') {
+ if (++k >= len) {
+ buf.append('\\');
+ break;
+ }
+ c = cc[k];
+ if (c >= '0' && c <= '7') {
+ int n = c - '0';
+ ++k;
+ for (int j = 0; j < 2 && k < len; ++j) {
+ c = cc[k];
+ if (c >= '0' && c <= '7') {
+ ++k;
+ n = n * 8 + c - '0';
+ }
+ else {
+ break;
+ }
+ }
+ --k;
+ buf.append((char)n);
+ }
+ else
+ buf.append(c);
+ }
+ else
+ buf.append(c);
+ }
+ return buf.toString();
+ }
+
+ public void endDocument() {
+ }
+
+ public void endElement(String tag) {
+ if (tag.equals("Destination")) {
+ if (xmlLast == null && xmlNames != null)
+ return;
+ else
+ throw new RuntimeException("Destination end tag out of place.");
+ }
+ if (!tag.equals("Name"))
+ throw new RuntimeException("Invalid end tag - " + tag);
+ if (xmlLast == null || xmlNames == null)
+ throw new RuntimeException("Name end tag out of place.");
+ if (!xmlLast.containsKey("Page"))
+ throw new RuntimeException("Page attribute missing.");
+ xmlNames.put(unEscapeBinaryString((String)xmlLast.get("Name")), xmlLast.get("Page"));
+ xmlLast = null;
+ }
+
+ public void startDocument() {
+ }
+
+ public void startElement(String tag, HashMap h) {
+ if (xmlNames == null) {
+ if (tag.equals("Destination")) {
+ xmlNames = new HashMap();
+ return;
+ }
+ else
+ throw new RuntimeException("Root element is not Destination.");
+ }
+ if (!tag.equals("Name"))
+ throw new RuntimeException("Tag " + tag + " not allowed.");
+ if (xmlLast != null)
+ throw new RuntimeException("Nested tags are not allowed.");
+ xmlLast = new HashMap(h);
+ xmlLast.put("Name", "");
+ }
+
+ public void text(String str) {
+ if (xmlLast == null)
+ return;
+ String name = (String)xmlLast.get("Name");
+ name += str;
+ xmlLast.put("Name", name);
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/pdf/SimpleXMLDocHandler.java b/src/main/java/com/lowagie/text/pdf/SimpleXMLDocHandler.java
new file mode 100644
index 0000000..152b894
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/SimpleXMLDocHandler.java
@@ -0,0 +1,80 @@
+/*
+ * Copyright 2003 Paulo Soares
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+package com.lowagie.text.pdf;
+
+import java.util.HashMap;
+
+/**
+ * The handler for the events fired by <CODE>SimpleXMLParser</CODE>.
+ * @author Paulo Soares (psoares@consiste.pt)
+ */
+public interface SimpleXMLDocHandler {
+ /**
+ * Called when a start tag is found.
+ * @param tag the tag name
+ * @param h the tag's attributes
+ */
+ public void startElement(String tag, HashMap h);
+ /**
+ * Called when an end tag is found.
+ * @param tag the tag name
+ */
+ public void endElement(String tag);
+ /**
+ * Called when the document starts to be parsed.
+ */
+ public void startDocument();
+ /**
+ * Called after the document is parsed.
+ */
+ public void endDocument();
+ /**
+ * Called when a text element is found.
+ * @param str the text element, probably a fragment.
+ */
+ public void text(String str);
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/pdf/SimpleXMLDocHandlerComment.java b/src/main/java/com/lowagie/text/pdf/SimpleXMLDocHandlerComment.java
new file mode 100644
index 0000000..4d2ceb9
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/SimpleXMLDocHandlerComment.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright 2003 Paulo Soares
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+package com.lowagie.text.pdf;
+
+/**
+ * The handler for the events fired by <CODE>SimpleXMLParser</CODE>.
+ * @author Paulo Soares (psoares@consiste.pt)
+ */
+public interface SimpleXMLDocHandlerComment {
+ /**
+ * Called when a comment is found.
+ * @param text the comment text
+ */
+ public void comment(String text);
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/pdf/SimpleXMLParser.java b/src/main/java/com/lowagie/text/pdf/SimpleXMLParser.java
new file mode 100644
index 0000000..b00c2d7
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/SimpleXMLParser.java
@@ -0,0 +1,1177 @@
+/*
+ * Copyright 2003 Paulo Soares
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+package com.lowagie.text.pdf;
+
+import java.io.*;
+import java.util.Stack;
+import java.util.HashMap;
+
+/**
+ * A simple XML and HTML parser. This parser is, like the SAX parser,
+ * an event based parser, but with much less functionality.
+ * <p>
+ * The parser can:
+ * <p>
+ * <ul>
+ * <li>It recognizes the encoding used
+ * <li>It recognizes all the elements' start tags and end tags
+ * <li>It lists attributes, where attribute values can be enclosed in single or double quotes
+ * <li>It recognizes the <code>&lt;[CDATA[ ... ]]&gt;</code> construct
+ * <li>It recognizes the standard entities: &amp;amp;, &amp;lt;, &amp;gt;, &amp;quot;, and &amp;apos;, as well as numeric entities
+ * <li>It maps lines ending in <code>\r\n</code> and <code>\r</code> to <code>\n</code> on input, in accordance with the XML Specification, Section 2.11
+ * </ul>
+ * <p>
+ * The code is based on <A HREF="http://www.javaworld.com/javaworld/javatips/javatip128/">
+ * http://www.javaworld.com/javaworld/javatips/javatip128/</A> with some extra
+ * code from XERCES to recognize the encoding.
+ */
+public class SimpleXMLParser {
+ private static final HashMap fIANA2JavaMap = new HashMap();
+ private static final HashMap entityMap = new HashMap();
+
+ private static int popMode(Stack st) {
+ if(!st.empty())
+ return ((Integer)st.pop()).intValue();
+ else
+ return PRE;
+ }
+
+ private final static int
+ TEXT = 1,
+ ENTITY = 2,
+ OPEN_TAG = 3,
+ CLOSE_TAG = 4,
+ START_TAG = 5,
+ ATTRIBUTE_LVALUE = 6,
+ ATTRIBUTE_EQUAL = 9,
+ ATTRIBUTE_RVALUE = 10,
+ QUOTE = 7,
+ IN_TAG = 8,
+ SINGLE_TAG = 12,
+ COMMENT = 13,
+ DONE = 11,
+ DOCTYPE = 14,
+ PRE = 15,
+ CDATA = 16;
+
+ private SimpleXMLParser() {
+ }
+
+ /**
+ * Parses the XML document firing the events to the handler.
+ * @param doc the document handler
+ * @param in the document. The encoding is deduced from the stream. The stream is not closed
+ * @throws IOException on error
+ */
+ public static void parse(SimpleXMLDocHandler doc, InputStream in) throws IOException {
+ byte b4[] = new byte[4];
+ int count = in.read(b4);
+ if (count != 4)
+ throw new IOException("Insufficient length.");
+ String encoding = getEncodingName(b4);
+ String decl = null;
+ if (encoding.equals("UTF-8")) {
+ StringBuffer sb = new StringBuffer();
+ int c;
+ while ((c = in.read()) != -1) {
+ if (c == '>')
+ break;
+ sb.append((char)c);
+ }
+ decl = sb.toString();
+ }
+ else if (encoding.equals("CP037")) {
+ ByteArrayOutputStream bi = new ByteArrayOutputStream();
+ int c;
+ while ((c = in.read()) != -1) {
+ if (c == 0x6e) // that's '>' in ebcdic
+ break;
+ bi.write(c);
+ }
+ decl = new String(bi.toByteArray(), "CP037");
+ }
+ if (decl != null) {
+ decl = getDeclaredEncoding(decl);
+ if (decl != null)
+ encoding = decl;
+ }
+ parse(doc, new InputStreamReader(in, getJavaEncoding(encoding)));
+ }
+
+ private static String getDeclaredEncoding(String decl) {
+ if (decl == null)
+ return null;
+ int idx = decl.indexOf("encoding");
+ if (idx < 0)
+ return null;
+ int idx1 = decl.indexOf('"', idx);
+ int idx2 = decl.indexOf('\'', idx);
+ if (idx1 == idx2)
+ return null;
+ if ((idx1 < 0 && idx2 > 0) || (idx2 > 0 && idx2 < idx1)) {
+ int idx3 = decl.indexOf('\'', idx2 + 1);
+ if (idx3 < 0)
+ return null;
+ return decl.substring(idx2 + 1, idx3);
+ }
+ if ((idx2 < 0 && idx1 > 0) || (idx1 > 0 && idx1 < idx2)) {
+ int idx3 = decl.indexOf('"', idx1 + 1);
+ if (idx3 < 0)
+ return null;
+ return decl.substring(idx1 + 1, idx3);
+ }
+ return null;
+ }
+
+ /**
+ * Gets the java encoding from the IANA encoding. If the encoding cannot be found
+ * it returns the input.
+ * @param iana the IANA encoding
+ * @return the java encoding
+ */
+ public static String getJavaEncoding(String iana) {
+ String IANA = iana.toUpperCase();
+ String jdec = (String)fIANA2JavaMap.get(IANA);
+ if (jdec == null)
+ jdec = iana;
+ return jdec;
+ }
+
+ public static void parse(SimpleXMLDocHandler doc,Reader r) throws IOException {
+ parse(doc, null, r, false);
+ }
+
+ /**
+ * Parses the XML document firing the events to the handler.
+ * @param doc the document handler
+ * @param r the document. The encoding is already resolved. The reader is not closed
+ * @throws IOException on error
+ */
+ public static void parse(SimpleXMLDocHandler doc, SimpleXMLDocHandlerComment comment, Reader r, boolean html) throws IOException {
+ BufferedReader reader;
+ if (r instanceof BufferedReader)
+ reader = (BufferedReader)r;
+ else
+ reader = new BufferedReader(r);
+ Stack st = new Stack();
+ int depth = 0;
+ int mode = PRE;
+ int c = 0;
+ int quotec = '"';
+ depth = 0;
+ StringBuffer sb = new StringBuffer();
+ StringBuffer etag = new StringBuffer();
+ String tagName = null;
+ String lvalue = null;
+ String rvalue = null;
+ HashMap attrs = null;
+ st = new Stack();
+ doc.startDocument();
+ int line=1, col=0;
+ boolean eol = false;
+ if (html)
+ mode = TEXT;
+ int pushBack = -1;
+ while(true) {
+ if (pushBack != -1) {
+ c = pushBack;
+ pushBack = -1;
+ }
+ else
+ c = reader.read();
+ if (c == -1)
+ break;
+
+ // We need to map \r, \r\n, and \n to \n
+ // See XML spec section 2.11
+ if(c == '\n' && eol) {
+ eol = false;
+ continue;
+ } else if(eol) {
+ eol = false;
+ } else if(c == '\n') {
+ line++;
+ col=0;
+ } else if(c == '\r') {
+ eol = true;
+ c = '\n';
+ line++;
+ col=0;
+ } else {
+ col++;
+ }
+
+ if(mode == DONE) {
+ doc.endDocument();
+ return;
+
+ // We are between tags collecting text.
+ } else if(mode == TEXT) {
+ if(c == '<') {
+ st.push(new Integer(mode));
+ mode = START_TAG;
+ if(sb.length() > 0) {
+ doc.text(sb.toString());
+ sb.setLength(0);
+ }
+ } else if(c == '&') {
+ st.push(new Integer(mode));
+ mode = ENTITY;
+ etag.setLength(0);
+ } else
+ sb.append((char)c);
+
+ // we are processing a closing tag: e.g. </foo>
+ } else if(mode == CLOSE_TAG) {
+ if(c == '>') {
+ mode = popMode(st);
+ tagName = sb.toString();
+ if (html)
+ tagName = tagName.toLowerCase();
+ sb.setLength(0);
+ depth--;
+ if(!html && depth==0)
+ mode = DONE;
+ doc.endElement(tagName);
+ } else {
+ if (!Character.isWhitespace((char)c))
+ sb.append((char)c);
+ }
+
+ // we are processing CDATA
+ } else if(mode == CDATA) {
+ if(c == '>'
+ && sb.toString().endsWith("]]")) {
+ sb.setLength(sb.length()-2);
+ doc.text(sb.toString());
+ sb.setLength(0);
+ mode = popMode(st);
+ } else
+ sb.append((char)c);
+
+ // we are processing a comment. We are inside
+ // the <!-- .... --> looking for the -->.
+ } else if(mode == COMMENT) {
+ if(c == '>'
+ && sb.toString().endsWith("--")) {
+ if (comment != null) {
+ sb.setLength(sb.length() - 2);
+ comment.comment(sb.toString());
+ }
+ sb.setLength(0);
+ mode = popMode(st);
+ } else
+ sb.append((char)c);
+
+ // We are outside the root tag element
+ } else if(mode == PRE) {
+ if(c == '<') {
+ mode = TEXT;
+ st.push(new Integer(mode));
+ mode = START_TAG;
+ }
+
+ // We are inside one of these <? ... ?>
+ // or one of these <!DOCTYPE ... >
+ } else if(mode == DOCTYPE) {
+ if(c == '>') {
+ mode = popMode(st);
+ if(mode == TEXT) mode = PRE;
+ }
+
+ // we have just seen a < and
+ // are wondering what we are looking at
+ // <foo>, </foo>, <!-- ... --->, etc.
+ } else if(mode == START_TAG) {
+ mode = popMode(st);
+ if(c == '/') {
+ st.push(new Integer(mode));
+ mode = CLOSE_TAG;
+ } else if (c == '?') {
+ mode = DOCTYPE;
+ } else {
+ st.push(new Integer(mode));
+ mode = OPEN_TAG;
+ tagName = null;
+ attrs = new HashMap();
+ sb.append((char)c);
+ }
+
+ // we are processing an entity, e.g. &lt;, &#187;, etc.
+ } else if(mode == ENTITY) {
+ if(c == ';') {
+ mode = popMode(st);
+ String cent = etag.toString();
+ etag.setLength(0);
+ if(cent.startsWith("#x")) {
+ try {
+ char ci = (char)Integer.parseInt(cent.substring(2),16);
+ sb.append(ci);
+ }
+ catch (Exception es) {
+ sb.append('&').append(cent).append(';');
+ }
+ }
+ else if(cent.startsWith("#")) {
+ try {
+ char ci = (char)Integer.parseInt(cent.substring(1));
+ sb.append(ci);
+ }
+ catch (Exception es) {
+ sb.append('&').append(cent).append(';');
+ }
+ }
+ else {
+ char ce = decodeEntity(cent);
+ if (ce == '\0')
+ sb.append('&').append(cent).append(';');
+ else
+ sb.append(ce);
+ }
+ } else if ((c != '#' && (c < '0' || c > '9') && (c < 'a' || c > 'z')
+ && (c < 'A' || c > 'Z')) || etag.length() >= 7) {
+ mode = popMode(st);
+ pushBack = c;
+ sb.append('&').append(etag.toString());
+ etag.setLength(0);
+ }
+ else {
+ etag.append((char)c);
+ }
+
+ // we have just seen something like this:
+ // <foo a="b"/
+ // and are looking for the final >.
+ } else if(mode == SINGLE_TAG) {
+ if(tagName == null)
+ tagName = sb.toString();
+ if (html)
+ tagName = tagName.toLowerCase();
+ if(c != '>')
+ exc("Expected > for tag: <"+tagName+"/>",line,col);
+ doc.startElement(tagName,attrs);
+ doc.endElement(tagName);
+ if(!html && depth==0) {
+ doc.endDocument();
+ return;
+ }
+ sb.setLength(0);
+ attrs = new HashMap();
+ tagName = null;
+ mode = popMode(st);
+
+ // we are processing something
+ // like this <foo ... >. It could
+ // still be a <!-- ... --> or something.
+ } else if(mode == OPEN_TAG) {
+ if(c == '>') {
+ if(tagName == null)
+ tagName = sb.toString();
+ if (html)
+ tagName = tagName.toLowerCase();
+ sb.setLength(0);
+ depth++;
+ doc.startElement(tagName,attrs);
+ tagName = null;
+ attrs = new HashMap();
+ mode = popMode(st);
+ } else if(c == '/') {
+ mode = SINGLE_TAG;
+ } else if(c == '-' && sb.toString().equals("!-")) {
+ mode = COMMENT;
+ sb.setLength(0);
+ } else if(c == '[' && sb.toString().equals("![CDATA")) {
+ mode = CDATA;
+ sb.setLength(0);
+ } else if(c == 'E' && sb.toString().equals("!DOCTYP")) {
+ sb.setLength(0);
+ mode = DOCTYPE;
+ } else if(Character.isWhitespace((char)c)) {
+ tagName = sb.toString();
+ if (html)
+ tagName = tagName.toLowerCase();
+ sb.setLength(0);
+ mode = IN_TAG;
+ } else {
+ sb.append((char)c);
+ }
+
+ // We are processing the quoted right-hand side
+ // of an element's attribute.
+ } else if(mode == QUOTE) {
+ if (html && quotec == ' ' && c == '>') {
+ rvalue = sb.toString();
+ sb.setLength(0);
+ attrs.put(lvalue,rvalue);
+ mode = popMode(st);
+ doc.startElement(tagName,attrs);
+ depth++;
+ tagName = null;
+ attrs = new HashMap();
+ }
+ else if (html && quotec == ' ' && Character.isWhitespace((char)c)) {
+ rvalue = sb.toString();
+ sb.setLength(0);
+ attrs.put(lvalue,rvalue);
+ mode = IN_TAG;
+ }
+ else if (html && quotec == ' ') {
+ sb.append((char)c);
+ }
+ else if(c == quotec) {
+ rvalue = sb.toString();
+ sb.setLength(0);
+ attrs.put(lvalue,rvalue);
+ mode = IN_TAG;
+ // See section the XML spec, section 3.3.3
+ // on normalization processing.
+ } else if(" \r\n\u0009".indexOf(c)>=0) {
+ sb.append(' ');
+ } else if(c == '&') {
+ st.push(new Integer(mode));
+ mode = ENTITY;
+ etag.setLength(0);
+ } else {
+ sb.append((char)c);
+ }
+
+ } else if(mode == ATTRIBUTE_RVALUE) {
+ if(c == '"' || c == '\'') {
+ quotec = c;
+ mode = QUOTE;
+ } else if(Character.isWhitespace((char)c)) {
+ ;
+ } else if (html && c == '>') {
+ attrs.put(lvalue,sb.toString());
+ sb.setLength(0);
+ mode = popMode(st);
+ doc.startElement(tagName,attrs);
+ depth++;
+ tagName = null;
+ attrs = new HashMap();
+ } else if (html) {
+ sb.append((char)c);
+ quotec = ' ';
+ mode = QUOTE;
+ } else {
+ exc("Error in attribute processing",line,col);
+ }
+
+ } else if(mode == ATTRIBUTE_LVALUE) {
+ if(Character.isWhitespace((char)c)) {
+ lvalue = sb.toString();
+ if (html)
+ lvalue = lvalue.toLowerCase();
+ sb.setLength(0);
+ mode = ATTRIBUTE_EQUAL;
+ } else if(c == '=') {
+ lvalue = sb.toString();
+ if (html)
+ lvalue = lvalue.toLowerCase();
+ sb.setLength(0);
+ mode = ATTRIBUTE_RVALUE;
+ } else if (html && c == '>') {
+ sb.setLength(0);
+ mode = popMode(st);
+ doc.startElement(tagName,attrs);
+ depth++;
+ tagName = null;
+ attrs = new HashMap();
+ } else {
+ sb.append((char)c);
+ }
+
+ } else if(mode == ATTRIBUTE_EQUAL) {
+ if(c == '=') {
+ mode = ATTRIBUTE_RVALUE;
+ } else if(Character.isWhitespace((char)c)) {
+ ;
+ } else if (html && c == '>') {
+ sb.setLength(0);
+ mode = popMode(st);
+ doc.startElement(tagName,attrs);
+ depth++;
+ tagName = null;
+ attrs = new HashMap();
+ } else if (html && c == '/') {
+ sb.setLength(0);
+ mode = SINGLE_TAG;
+ } else if (html) {
+ sb.setLength(0);
+ sb.append((char)c);
+ mode = ATTRIBUTE_LVALUE;
+ } else {
+ exc("Error in attribute processing.",line,col);
+ }
+
+ } else if(mode == IN_TAG) {
+ if(c == '>') {
+ mode = popMode(st);
+ doc.startElement(tagName,attrs);
+ depth++;
+ tagName = null;
+ attrs = new HashMap();
+ } else if(c == '/') {
+ mode = SINGLE_TAG;
+ } else if(Character.isWhitespace((char)c)) {
+ ;
+ } else {
+ mode = ATTRIBUTE_LVALUE;
+ sb.append((char)c);
+ }
+ }
+ }
+ if(html || mode == DONE) {
+ if (html && mode == TEXT)
+ doc.text(sb.toString());
+ doc.endDocument();
+ }
+ else
+ exc("missing end tag",line,col);
+ }
+ private static void exc(String s,int line,int col) throws IOException {
+ throw new IOException(s+" near line "+line+", column "+col);
+ }
+
+ /**
+ * Escapes a string with the appropriated XML codes.
+ * @param s the string to be escaped
+ * @param onlyASCII codes above 127 will always be escaped with &amp;#nn; if <CODE>true</CODE>
+ * @return the escaped string
+ */
+ public static String escapeXML(String s, boolean onlyASCII) {
+ char cc[] = s.toCharArray();
+ int len = cc.length;
+ StringBuffer sb = new StringBuffer();
+ for (int k = 0; k < len; ++k) {
+ int c = cc[k];
+ switch (c) {
+ case '<':
+ sb.append("&lt;");
+ break;
+ case '>':
+ sb.append("&gt;");
+ break;
+ case '&':
+ sb.append("&amp;");
+ break;
+ case '"':
+ sb.append("&quot;");
+ break;
+ case '\'':
+ sb.append("&apos;");
+ break;
+ default:
+ if (onlyASCII && c > 127)
+ sb.append("&#").append(c).append(";");
+ else
+ sb.append((char)c);
+ }
+ }
+ return sb.toString();
+ }
+
+ public static char decodeEntity(String s) {
+ Character c = (Character)entityMap.get(s);
+ if (c == null)
+ return '\0';
+ else
+ return c.charValue();
+ }
+
+ private static String getEncodingName(byte[] b4) {
+
+ // UTF-16, with BOM
+ int b0 = b4[0] & 0xFF;
+ int b1 = b4[1] & 0xFF;
+ if (b0 == 0xFE && b1 == 0xFF) {
+ // UTF-16, big-endian
+ return "UTF-16BE";
+ }
+ if (b0 == 0xFF && b1 == 0xFE) {
+ // UTF-16, little-endian
+ return "UTF-16LE";
+ }
+
+ // UTF-8 with a BOM
+ int b2 = b4[2] & 0xFF;
+ if (b0 == 0xEF && b1 == 0xBB && b2 == 0xBF) {
+ return "UTF-8";
+ }
+
+ // other encodings
+ int b3 = b4[3] & 0xFF;
+ if (b0 == 0x00 && b1 == 0x00 && b2 == 0x00 && b3 == 0x3C) {
+ // UCS-4, big endian (1234)
+ return "ISO-10646-UCS-4";
+ }
+ if (b0 == 0x3C && b1 == 0x00 && b2 == 0x00 && b3 == 0x00) {
+ // UCS-4, little endian (4321)
+ return "ISO-10646-UCS-4";
+ }
+ if (b0 == 0x00 && b1 == 0x00 && b2 == 0x3C && b3 == 0x00) {
+ // UCS-4, unusual octet order (2143)
+ // REVISIT: What should this be?
+ return "ISO-10646-UCS-4";
+ }
+ if (b0 == 0x00 && b1 == 0x3C && b2 == 0x00 && b3 == 0x00) {
+ // UCS-4, unusual octect order (3412)
+ // REVISIT: What should this be?
+ return "ISO-10646-UCS-4";
+ }
+ if (b0 == 0x00 && b1 == 0x3C && b2 == 0x00 && b3 == 0x3F) {
+ // UTF-16, big-endian, no BOM
+ // (or could turn out to be UCS-2...
+ // REVISIT: What should this be?
+ return "UTF-16BE";
+ }
+ if (b0 == 0x3C && b1 == 0x00 && b2 == 0x3F && b3 == 0x00) {
+ // UTF-16, little-endian, no BOM
+ // (or could turn out to be UCS-2...
+ return "UTF-16LE";
+ }
+ if (b0 == 0x4C && b1 == 0x6F && b2 == 0xA7 && b3 == 0x94) {
+ // EBCDIC
+ // a la xerces1, return CP037 instead of EBCDIC here
+ return "CP037";
+ }
+
+ // default encoding
+ return "UTF-8";
+ }
+
+ static {
+ // add IANA to Java encoding mappings.
+ fIANA2JavaMap.put("BIG5", "Big5");
+ fIANA2JavaMap.put("CSBIG5", "Big5");
+ fIANA2JavaMap.put("CP037", "CP037");
+ fIANA2JavaMap.put("IBM037", "CP037");
+ fIANA2JavaMap.put("CSIBM037", "CP037");
+ fIANA2JavaMap.put("EBCDIC-CP-US", "CP037");
+ fIANA2JavaMap.put("EBCDIC-CP-CA", "CP037");
+ fIANA2JavaMap.put("EBCDIC-CP-NL", "CP037");
+ fIANA2JavaMap.put("EBCDIC-CP-WT", "CP037");
+ fIANA2JavaMap.put("IBM277", "CP277");
+ fIANA2JavaMap.put("CP277", "CP277");
+ fIANA2JavaMap.put("CSIBM277", "CP277");
+ fIANA2JavaMap.put("EBCDIC-CP-DK", "CP277");
+ fIANA2JavaMap.put("EBCDIC-CP-NO", "CP277");
+ fIANA2JavaMap.put("IBM278", "CP278");
+ fIANA2JavaMap.put("CP278", "CP278");
+ fIANA2JavaMap.put("CSIBM278", "CP278");
+ fIANA2JavaMap.put("EBCDIC-CP-FI", "CP278");
+ fIANA2JavaMap.put("EBCDIC-CP-SE", "CP278");
+ fIANA2JavaMap.put("IBM280", "CP280");
+ fIANA2JavaMap.put("CP280", "CP280");
+ fIANA2JavaMap.put("CSIBM280", "CP280");
+ fIANA2JavaMap.put("EBCDIC-CP-IT", "CP280");
+ fIANA2JavaMap.put("IBM284", "CP284");
+ fIANA2JavaMap.put("CP284", "CP284");
+ fIANA2JavaMap.put("CSIBM284", "CP284");
+ fIANA2JavaMap.put("EBCDIC-CP-ES", "CP284");
+ fIANA2JavaMap.put("EBCDIC-CP-GB", "CP285");
+ fIANA2JavaMap.put("IBM285", "CP285");
+ fIANA2JavaMap.put("CP285", "CP285");
+ fIANA2JavaMap.put("CSIBM285", "CP285");
+ fIANA2JavaMap.put("EBCDIC-CP-FR", "CP297");
+ fIANA2JavaMap.put("IBM297", "CP297");
+ fIANA2JavaMap.put("CP297", "CP297");
+ fIANA2JavaMap.put("CSIBM297", "CP297");
+ fIANA2JavaMap.put("EBCDIC-CP-AR1", "CP420");
+ fIANA2JavaMap.put("IBM420", "CP420");
+ fIANA2JavaMap.put("CP420", "CP420");
+ fIANA2JavaMap.put("CSIBM420", "CP420");
+ fIANA2JavaMap.put("EBCDIC-CP-HE", "CP424");
+ fIANA2JavaMap.put("IBM424", "CP424");
+ fIANA2JavaMap.put("CP424", "CP424");
+ fIANA2JavaMap.put("CSIBM424", "CP424");
+ fIANA2JavaMap.put("EBCDIC-CP-CH", "CP500");
+ fIANA2JavaMap.put("IBM500", "CP500");
+ fIANA2JavaMap.put("CP500", "CP500");
+ fIANA2JavaMap.put("CSIBM500", "CP500");
+ fIANA2JavaMap.put("EBCDIC-CP-CH", "CP500");
+ fIANA2JavaMap.put("EBCDIC-CP-BE", "CP500");
+ fIANA2JavaMap.put("IBM868", "CP868");
+ fIANA2JavaMap.put("CP868", "CP868");
+ fIANA2JavaMap.put("CSIBM868", "CP868");
+ fIANA2JavaMap.put("CP-AR", "CP868");
+ fIANA2JavaMap.put("IBM869", "CP869");
+ fIANA2JavaMap.put("CP869", "CP869");
+ fIANA2JavaMap.put("CSIBM869", "CP869");
+ fIANA2JavaMap.put("CP-GR", "CP869");
+ fIANA2JavaMap.put("IBM870", "CP870");
+ fIANA2JavaMap.put("CP870", "CP870");
+ fIANA2JavaMap.put("CSIBM870", "CP870");
+ fIANA2JavaMap.put("EBCDIC-CP-ROECE", "CP870");
+ fIANA2JavaMap.put("EBCDIC-CP-YU", "CP870");
+ fIANA2JavaMap.put("IBM871", "CP871");
+ fIANA2JavaMap.put("CP871", "CP871");
+ fIANA2JavaMap.put("CSIBM871", "CP871");
+ fIANA2JavaMap.put("EBCDIC-CP-IS", "CP871");
+ fIANA2JavaMap.put("IBM918", "CP918");
+ fIANA2JavaMap.put("CP918", "CP918");
+ fIANA2JavaMap.put("CSIBM918", "CP918");
+ fIANA2JavaMap.put("EBCDIC-CP-AR2", "CP918");
+ fIANA2JavaMap.put("EUC-JP", "EUCJIS");
+ fIANA2JavaMap.put("CSEUCPkdFmtJapanese", "EUCJIS");
+ fIANA2JavaMap.put("EUC-KR", "KSC5601");
+ fIANA2JavaMap.put("GB2312", "GB2312");
+ fIANA2JavaMap.put("CSGB2312", "GB2312");
+ fIANA2JavaMap.put("ISO-2022-JP", "JIS");
+ fIANA2JavaMap.put("CSISO2022JP", "JIS");
+ fIANA2JavaMap.put("ISO-2022-KR", "ISO2022KR");
+ fIANA2JavaMap.put("CSISO2022KR", "ISO2022KR");
+ fIANA2JavaMap.put("ISO-2022-CN", "ISO2022CN");
+
+ fIANA2JavaMap.put("X0201", "JIS0201");
+ fIANA2JavaMap.put("CSISO13JISC6220JP", "JIS0201");
+ fIANA2JavaMap.put("X0208", "JIS0208");
+ fIANA2JavaMap.put("ISO-IR-87", "JIS0208");
+ fIANA2JavaMap.put("X0208dbiJIS_X0208-1983", "JIS0208");
+ fIANA2JavaMap.put("CSISO87JISX0208", "JIS0208");
+ fIANA2JavaMap.put("X0212", "JIS0212");
+ fIANA2JavaMap.put("ISO-IR-159", "JIS0212");
+ fIANA2JavaMap.put("CSISO159JISX02121990", "JIS0212");
+ fIANA2JavaMap.put("SHIFT_JIS", "SJIS");
+ fIANA2JavaMap.put("CSSHIFT_JIS", "SJIS");
+ fIANA2JavaMap.put("MS_Kanji", "SJIS");
+
+ // Add support for Cp1252 and its friends
+ fIANA2JavaMap.put("WINDOWS-1250", "Cp1250");
+ fIANA2JavaMap.put("WINDOWS-1251", "Cp1251");
+ fIANA2JavaMap.put("WINDOWS-1252", "Cp1252");
+ fIANA2JavaMap.put("WINDOWS-1253", "Cp1253");
+ fIANA2JavaMap.put("WINDOWS-1254", "Cp1254");
+ fIANA2JavaMap.put("WINDOWS-1255", "Cp1255");
+ fIANA2JavaMap.put("WINDOWS-1256", "Cp1256");
+ fIANA2JavaMap.put("WINDOWS-1257", "Cp1257");
+ fIANA2JavaMap.put("WINDOWS-1258", "Cp1258");
+ fIANA2JavaMap.put("TIS-620", "TIS620");
+
+ fIANA2JavaMap.put("ISO-8859-1", "ISO8859_1");
+ fIANA2JavaMap.put("ISO-IR-100", "ISO8859_1");
+ fIANA2JavaMap.put("ISO_8859-1", "ISO8859_1");
+ fIANA2JavaMap.put("LATIN1", "ISO8859_1");
+ fIANA2JavaMap.put("CSISOLATIN1", "ISO8859_1");
+ fIANA2JavaMap.put("L1", "ISO8859_1");
+ fIANA2JavaMap.put("IBM819", "ISO8859_1");
+ fIANA2JavaMap.put("CP819", "ISO8859_1");
+
+ fIANA2JavaMap.put("ISO-8859-2", "ISO8859_2");
+ fIANA2JavaMap.put("ISO-IR-101", "ISO8859_2");
+ fIANA2JavaMap.put("ISO_8859-2", "ISO8859_2");
+ fIANA2JavaMap.put("LATIN2", "ISO8859_2");
+ fIANA2JavaMap.put("CSISOLATIN2", "ISO8859_2");
+ fIANA2JavaMap.put("L2", "ISO8859_2");
+
+ fIANA2JavaMap.put("ISO-8859-3", "ISO8859_3");
+ fIANA2JavaMap.put("ISO-IR-109", "ISO8859_3");
+ fIANA2JavaMap.put("ISO_8859-3", "ISO8859_3");
+ fIANA2JavaMap.put("LATIN3", "ISO8859_3");
+ fIANA2JavaMap.put("CSISOLATIN3", "ISO8859_3");
+ fIANA2JavaMap.put("L3", "ISO8859_3");
+
+ fIANA2JavaMap.put("ISO-8859-4", "ISO8859_4");
+ fIANA2JavaMap.put("ISO-IR-110", "ISO8859_4");
+ fIANA2JavaMap.put("ISO_8859-4", "ISO8859_4");
+ fIANA2JavaMap.put("LATIN4", "ISO8859_4");
+ fIANA2JavaMap.put("CSISOLATIN4", "ISO8859_4");
+ fIANA2JavaMap.put("L4", "ISO8859_4");
+
+ fIANA2JavaMap.put("ISO-8859-5", "ISO8859_5");
+ fIANA2JavaMap.put("ISO-IR-144", "ISO8859_5");
+ fIANA2JavaMap.put("ISO_8859-5", "ISO8859_5");
+ fIANA2JavaMap.put("CYRILLIC", "ISO8859_5");
+ fIANA2JavaMap.put("CSISOLATINCYRILLIC", "ISO8859_5");
+
+ fIANA2JavaMap.put("ISO-8859-6", "ISO8859_6");
+ fIANA2JavaMap.put("ISO-IR-127", "ISO8859_6");
+ fIANA2JavaMap.put("ISO_8859-6", "ISO8859_6");
+ fIANA2JavaMap.put("ECMA-114", "ISO8859_6");
+ fIANA2JavaMap.put("ASMO-708", "ISO8859_6");
+ fIANA2JavaMap.put("ARABIC", "ISO8859_6");
+ fIANA2JavaMap.put("CSISOLATINARABIC", "ISO8859_6");
+
+ fIANA2JavaMap.put("ISO-8859-7", "ISO8859_7");
+ fIANA2JavaMap.put("ISO-IR-126", "ISO8859_7");
+ fIANA2JavaMap.put("ISO_8859-7", "ISO8859_7");
+ fIANA2JavaMap.put("ELOT_928", "ISO8859_7");
+ fIANA2JavaMap.put("ECMA-118", "ISO8859_7");
+ fIANA2JavaMap.put("GREEK", "ISO8859_7");
+ fIANA2JavaMap.put("CSISOLATINGREEK", "ISO8859_7");
+ fIANA2JavaMap.put("GREEK8", "ISO8859_7");
+
+ fIANA2JavaMap.put("ISO-8859-8", "ISO8859_8");
+ fIANA2JavaMap.put("ISO-8859-8-I", "ISO8859_8"); // added since this encoding only differs w.r.t. presentation
+ fIANA2JavaMap.put("ISO-IR-138", "ISO8859_8");
+ fIANA2JavaMap.put("ISO_8859-8", "ISO8859_8");
+ fIANA2JavaMap.put("HEBREW", "ISO8859_8");
+ fIANA2JavaMap.put("CSISOLATINHEBREW", "ISO8859_8");
+
+ fIANA2JavaMap.put("ISO-8859-9", "ISO8859_9");
+ fIANA2JavaMap.put("ISO-IR-148", "ISO8859_9");
+ fIANA2JavaMap.put("ISO_8859-9", "ISO8859_9");
+ fIANA2JavaMap.put("LATIN5", "ISO8859_9");
+ fIANA2JavaMap.put("CSISOLATIN5", "ISO8859_9");
+ fIANA2JavaMap.put("L5", "ISO8859_9");
+
+ fIANA2JavaMap.put("KOI8-R", "KOI8_R");
+ fIANA2JavaMap.put("CSKOI8-R", "KOI8_R");
+ fIANA2JavaMap.put("US-ASCII", "ASCII");
+ fIANA2JavaMap.put("ISO-IR-6", "ASCII");
+ fIANA2JavaMap.put("ANSI_X3.4-1986", "ASCII");
+ fIANA2JavaMap.put("ISO_646.IRV:1991", "ASCII");
+ fIANA2JavaMap.put("ASCII", "ASCII");
+ fIANA2JavaMap.put("CSASCII", "ASCII");
+ fIANA2JavaMap.put("ISO646-US", "ASCII");
+ fIANA2JavaMap.put("US", "ASCII");
+ fIANA2JavaMap.put("IBM367", "ASCII");
+ fIANA2JavaMap.put("CP367", "ASCII");
+ fIANA2JavaMap.put("UTF-8", "UTF8");
+ fIANA2JavaMap.put("UTF-16", "Unicode");
+ fIANA2JavaMap.put("UTF-16BE", "UnicodeBig");
+ fIANA2JavaMap.put("UTF-16LE", "UnicodeLittle");
+
+ entityMap.put("nbsp", new Character('\u00a0')); // no-break space = non-breaking space, U+00A0 ISOnum
+ entityMap.put("iexcl", new Character('\u00a1')); // inverted exclamation mark, U+00A1 ISOnum
+ entityMap.put("cent", new Character('\u00a2')); // cent sign, U+00A2 ISOnum
+ entityMap.put("pound", new Character('\u00a3')); // pound sign, U+00A3 ISOnum
+ entityMap.put("curren", new Character('\u00a4')); // currency sign, U+00A4 ISOnum
+ entityMap.put("yen", new Character('\u00a5')); // yen sign = yuan sign, U+00A5 ISOnum
+ entityMap.put("brvbar", new Character('\u00a6')); // broken bar = broken vertical bar, U+00A6 ISOnum
+ entityMap.put("sect", new Character('\u00a7')); // section sign, U+00A7 ISOnum
+ entityMap.put("uml", new Character('\u00a8')); // diaeresis = spacing diaeresis, U+00A8 ISOdia
+ entityMap.put("copy", new Character('\u00a9')); // copyright sign, U+00A9 ISOnum
+ entityMap.put("ordf", new Character('\u00aa')); // feminine ordinal indicator, U+00AA ISOnum
+ entityMap.put("laquo", new Character('\u00ab')); // left-pointing double angle quotation mark = left pointing guillemet, U+00AB ISOnum
+ entityMap.put("not", new Character('\u00ac')); // not sign, U+00AC ISOnum
+ entityMap.put("shy", new Character('\u00ad')); // soft hyphen = discretionary hyphen, U+00AD ISOnum
+ entityMap.put("reg", new Character('\u00ae')); // registered sign = registered trade mark sign, U+00AE ISOnum
+ entityMap.put("macr", new Character('\u00af')); // macron = spacing macron = overline = APL overbar, U+00AF ISOdia
+ entityMap.put("deg", new Character('\u00b0')); // degree sign, U+00B0 ISOnum
+ entityMap.put("plusmn", new Character('\u00b1')); // plus-minus sign = plus-or-minus sign, U+00B1 ISOnum
+ entityMap.put("sup2", new Character('\u00b2')); // superscript two = superscript digit two = squared, U+00B2 ISOnum
+ entityMap.put("sup3", new Character('\u00b3')); // superscript three = superscript digit three = cubed, U+00B3 ISOnum
+ entityMap.put("acute", new Character('\u00b4')); // acute accent = spacing acute, U+00B4 ISOdia
+ entityMap.put("micro", new Character('\u00b5')); // micro sign, U+00B5 ISOnum
+ entityMap.put("para", new Character('\u00b6')); // pilcrow sign = paragraph sign, U+00B6 ISOnum
+ entityMap.put("middot", new Character('\u00b7')); // middle dot = Georgian comma = Greek middle dot, U+00B7 ISOnum
+ entityMap.put("cedil", new Character('\u00b8')); // cedilla = spacing cedilla, U+00B8 ISOdia
+ entityMap.put("sup1", new Character('\u00b9')); // superscript one = superscript digit one, U+00B9 ISOnum
+ entityMap.put("ordm", new Character('\u00ba')); // masculine ordinal indicator, U+00BA ISOnum
+ entityMap.put("raquo", new Character('\u00bb')); // right-pointing double angle quotation mark = right pointing guillemet, U+00BB ISOnum
+ entityMap.put("frac14", new Character('\u00bc')); // vulgar fraction one quarter = fraction one quarter, U+00BC ISOnum
+ entityMap.put("frac12", new Character('\u00bd')); // vulgar fraction one half = fraction one half, U+00BD ISOnum
+ entityMap.put("frac34", new Character('\u00be')); // vulgar fraction three quarters = fraction three quarters, U+00BE ISOnum
+ entityMap.put("iquest", new Character('\u00bf')); // inverted question mark = turned question mark, U+00BF ISOnum
+ entityMap.put("Agrave", new Character('\u00c0')); // latin capital letter A with grave = latin capital letter A grave, U+00C0 ISOlat1
+ entityMap.put("Aacute", new Character('\u00c1')); // latin capital letter A with acute, U+00C1 ISOlat1
+ entityMap.put("Acirc", new Character('\u00c2')); // latin capital letter A with circumflex, U+00C2 ISOlat1
+ entityMap.put("Atilde", new Character('\u00c3')); // latin capital letter A with tilde, U+00C3 ISOlat1
+ entityMap.put("Auml", new Character('\u00c4')); // latin capital letter A with diaeresis, U+00C4 ISOlat1
+ entityMap.put("Aring", new Character('\u00c5')); // latin capital letter A with ring above = latin capital letter A ring, U+00C5 ISOlat1
+ entityMap.put("AElig", new Character('\u00c6')); // latin capital letter AE = latin capital ligature AE, U+00C6 ISOlat1
+ entityMap.put("Ccedil", new Character('\u00c7')); // latin capital letter C with cedilla, U+00C7 ISOlat1
+ entityMap.put("Egrave", new Character('\u00c8')); // latin capital letter E with grave, U+00C8 ISOlat1
+ entityMap.put("Eacute", new Character('\u00c9')); // latin capital letter E with acute, U+00C9 ISOlat1
+ entityMap.put("Ecirc", new Character('\u00ca')); // latin capital letter E with circumflex, U+00CA ISOlat1
+ entityMap.put("Euml", new Character('\u00cb')); // latin capital letter E with diaeresis, U+00CB ISOlat1
+ entityMap.put("Igrave", new Character('\u00cc')); // latin capital letter I with grave, U+00CC ISOlat1
+ entityMap.put("Iacute", new Character('\u00cd')); // latin capital letter I with acute, U+00CD ISOlat1
+ entityMap.put("Icirc", new Character('\u00ce')); // latin capital letter I with circumflex, U+00CE ISOlat1
+ entityMap.put("Iuml", new Character('\u00cf')); // latin capital letter I with diaeresis, U+00CF ISOlat1
+ entityMap.put("ETH", new Character('\u00d0')); // latin capital letter ETH, U+00D0 ISOlat1
+ entityMap.put("Ntilde", new Character('\u00d1')); // latin capital letter N with tilde, U+00D1 ISOlat1
+ entityMap.put("Ograve", new Character('\u00d2')); // latin capital letter O with grave, U+00D2 ISOlat1
+ entityMap.put("Oacute", new Character('\u00d3')); // latin capital letter O with acute, U+00D3 ISOlat1
+ entityMap.put("Ocirc", new Character('\u00d4')); // latin capital letter O with circumflex, U+00D4 ISOlat1
+ entityMap.put("Otilde", new Character('\u00d5')); // latin capital letter O with tilde, U+00D5 ISOlat1
+ entityMap.put("Ouml", new Character('\u00d6')); // latin capital letter O with diaeresis, U+00D6 ISOlat1
+ entityMap.put("times", new Character('\u00d7')); // multiplication sign, U+00D7 ISOnum
+ entityMap.put("Oslash", new Character('\u00d8')); // latin capital letter O with stroke = latin capital letter O slash, U+00D8 ISOlat1
+ entityMap.put("Ugrave", new Character('\u00d9')); // latin capital letter U with grave, U+00D9 ISOlat1
+ entityMap.put("Uacute", new Character('\u00da')); // latin capital letter U with acute, U+00DA ISOlat1
+ entityMap.put("Ucirc", new Character('\u00db')); // latin capital letter U with circumflex, U+00DB ISOlat1
+ entityMap.put("Uuml", new Character('\u00dc')); // latin capital letter U with diaeresis, U+00DC ISOlat1
+ entityMap.put("Yacute", new Character('\u00dd')); // latin capital letter Y with acute, U+00DD ISOlat1
+ entityMap.put("THORN", new Character('\u00de')); // latin capital letter THORN, U+00DE ISOlat1
+ entityMap.put("szlig", new Character('\u00df')); // latin small letter sharp s = ess-zed, U+00DF ISOlat1
+ entityMap.put("agrave", new Character('\u00e0')); // latin small letter a with grave = latin small letter a grave, U+00E0 ISOlat1
+ entityMap.put("aacute", new Character('\u00e1')); // latin small letter a with acute, U+00E1 ISOlat1
+ entityMap.put("acirc", new Character('\u00e2')); // latin small letter a with circumflex, U+00E2 ISOlat1
+ entityMap.put("atilde", new Character('\u00e3')); // latin small letter a with tilde, U+00E3 ISOlat1
+ entityMap.put("auml", new Character('\u00e4')); // latin small letter a with diaeresis, U+00E4 ISOlat1
+ entityMap.put("aring", new Character('\u00e5')); // latin small letter a with ring above = latin small letter a ring, U+00E5 ISOlat1
+ entityMap.put("aelig", new Character('\u00e6')); // latin small letter ae = latin small ligature ae, U+00E6 ISOlat1
+ entityMap.put("ccedil", new Character('\u00e7')); // latin small letter c with cedilla, U+00E7 ISOlat1
+ entityMap.put("egrave", new Character('\u00e8')); // latin small letter e with grave, U+00E8 ISOlat1
+ entityMap.put("eacute", new Character('\u00e9')); // latin small letter e with acute, U+00E9 ISOlat1
+ entityMap.put("ecirc", new Character('\u00ea')); // latin small letter e with circumflex, U+00EA ISOlat1
+ entityMap.put("euml", new Character('\u00eb')); // latin small letter e with diaeresis, U+00EB ISOlat1
+ entityMap.put("igrave", new Character('\u00ec')); // latin small letter i with grave, U+00EC ISOlat1
+ entityMap.put("iacute", new Character('\u00ed')); // latin small letter i with acute, U+00ED ISOlat1
+ entityMap.put("icirc", new Character('\u00ee')); // latin small letter i with circumflex, U+00EE ISOlat1
+ entityMap.put("iuml", new Character('\u00ef')); // latin small letter i with diaeresis, U+00EF ISOlat1
+ entityMap.put("eth", new Character('\u00f0')); // latin small letter eth, U+00F0 ISOlat1
+ entityMap.put("ntilde", new Character('\u00f1')); // latin small letter n with tilde, U+00F1 ISOlat1
+ entityMap.put("ograve", new Character('\u00f2')); // latin small letter o with grave, U+00F2 ISOlat1
+ entityMap.put("oacute", new Character('\u00f3')); // latin small letter o with acute, U+00F3 ISOlat1
+ entityMap.put("ocirc", new Character('\u00f4')); // latin small letter o with circumflex, U+00F4 ISOlat1
+ entityMap.put("otilde", new Character('\u00f5')); // latin small letter o with tilde, U+00F5 ISOlat1
+ entityMap.put("ouml", new Character('\u00f6')); // latin small letter o with diaeresis, U+00F6 ISOlat1
+ entityMap.put("divide", new Character('\u00f7')); // division sign, U+00F7 ISOnum
+ entityMap.put("oslash", new Character('\u00f8')); // latin small letter o with stroke, = latin small letter o slash, U+00F8 ISOlat1
+ entityMap.put("ugrave", new Character('\u00f9')); // latin small letter u with grave, U+00F9 ISOlat1
+ entityMap.put("uacute", new Character('\u00fa')); // latin small letter u with acute, U+00FA ISOlat1
+ entityMap.put("ucirc", new Character('\u00fb')); // latin small letter u with circumflex, U+00FB ISOlat1
+ entityMap.put("uuml", new Character('\u00fc')); // latin small letter u with diaeresis, U+00FC ISOlat1
+ entityMap.put("yacute", new Character('\u00fd')); // latin small letter y with acute, U+00FD ISOlat1
+ entityMap.put("thorn", new Character('\u00fe')); // latin small letter thorn, U+00FE ISOlat1
+ entityMap.put("yuml", new Character('\u00ff')); // latin small letter y with diaeresis, U+00FF ISOlat1
+ // Latin Extended-B
+ entityMap.put("fnof", new Character('\u0192')); // latin small f with hook = function = florin, U+0192 ISOtech
+ // Greek
+ entityMap.put("Alpha", new Character('\u0391')); // greek capital letter alpha, U+0391
+ entityMap.put("Beta", new Character('\u0392')); // greek capital letter beta, U+0392
+ entityMap.put("Gamma", new Character('\u0393')); // greek capital letter gamma, U+0393 ISOgrk3
+ entityMap.put("Delta", new Character('\u0394')); // greek capital letter delta, U+0394 ISOgrk3
+ entityMap.put("Epsilon", new Character('\u0395')); // greek capital letter epsilon, U+0395
+ entityMap.put("Zeta", new Character('\u0396')); // greek capital letter zeta, U+0396
+ entityMap.put("Eta", new Character('\u0397')); // greek capital letter eta, U+0397
+ entityMap.put("Theta", new Character('\u0398')); // greek capital letter theta, U+0398 ISOgrk3
+ entityMap.put("Iota", new Character('\u0399')); // greek capital letter iota, U+0399
+ entityMap.put("Kappa", new Character('\u039a')); // greek capital letter kappa, U+039A
+ entityMap.put("Lambda", new Character('\u039b')); // greek capital letter lambda, U+039B ISOgrk3
+ entityMap.put("Mu", new Character('\u039c')); // greek capital letter mu, U+039C
+ entityMap.put("Nu", new Character('\u039d')); // greek capital letter nu, U+039D
+ entityMap.put("Xi", new Character('\u039e')); // greek capital letter xi, U+039E ISOgrk3
+ entityMap.put("Omicron", new Character('\u039f')); // greek capital letter omicron, U+039F
+ entityMap.put("Pi", new Character('\u03a0')); // greek capital letter pi, U+03A0 ISOgrk3
+ entityMap.put("Rho", new Character('\u03a1')); // greek capital letter rho, U+03A1
+ // there is no Sigmaf, and no U+03A2 character either
+ entityMap.put("Sigma", new Character('\u03a3')); // greek capital letter sigma, U+03A3 ISOgrk3
+ entityMap.put("Tau", new Character('\u03a4')); // greek capital letter tau, U+03A4
+ entityMap.put("Upsilon", new Character('\u03a5')); // greek capital letter upsilon, U+03A5 ISOgrk3
+ entityMap.put("Phi", new Character('\u03a6')); // greek capital letter phi, U+03A6 ISOgrk3
+ entityMap.put("Chi", new Character('\u03a7')); // greek capital letter chi, U+03A7
+ entityMap.put("Psi", new Character('\u03a8')); // greek capital letter psi, U+03A8 ISOgrk3
+ entityMap.put("Omega", new Character('\u03a9')); // greek capital letter omega, U+03A9 ISOgrk3
+ entityMap.put("alpha", new Character('\u03b1')); // greek small letter alpha, U+03B1 ISOgrk3
+ entityMap.put("beta", new Character('\u03b2')); // greek small letter beta, U+03B2 ISOgrk3
+ entityMap.put("gamma", new Character('\u03b3')); // greek small letter gamma, U+03B3 ISOgrk3
+ entityMap.put("delta", new Character('\u03b4')); // greek small letter delta, U+03B4 ISOgrk3
+ entityMap.put("epsilon", new Character('\u03b5')); // greek small letter epsilon, U+03B5 ISOgrk3
+ entityMap.put("zeta", new Character('\u03b6')); // greek small letter zeta, U+03B6 ISOgrk3
+ entityMap.put("eta", new Character('\u03b7')); // greek small letter eta, U+03B7 ISOgrk3
+ entityMap.put("theta", new Character('\u03b8')); // greek small letter theta, U+03B8 ISOgrk3
+ entityMap.put("iota", new Character('\u03b9')); // greek small letter iota, U+03B9 ISOgrk3
+ entityMap.put("kappa", new Character('\u03ba')); // greek small letter kappa, U+03BA ISOgrk3
+ entityMap.put("lambda", new Character('\u03bb')); // greek small letter lambda, U+03BB ISOgrk3
+ entityMap.put("mu", new Character('\u03bc')); // greek small letter mu, U+03BC ISOgrk3
+ entityMap.put("nu", new Character('\u03bd')); // greek small letter nu, U+03BD ISOgrk3
+ entityMap.put("xi", new Character('\u03be')); // greek small letter xi, U+03BE ISOgrk3
+ entityMap.put("omicron", new Character('\u03bf')); // greek small letter omicron, U+03BF NEW
+ entityMap.put("pi", new Character('\u03c0')); // greek small letter pi, U+03C0 ISOgrk3
+ entityMap.put("rho", new Character('\u03c1')); // greek small letter rho, U+03C1 ISOgrk3
+ entityMap.put("sigmaf", new Character('\u03c2')); // greek small letter final sigma, U+03C2 ISOgrk3
+ entityMap.put("sigma", new Character('\u03c3')); // greek small letter sigma, U+03C3 ISOgrk3
+ entityMap.put("tau", new Character('\u03c4')); // greek small letter tau, U+03C4 ISOgrk3
+ entityMap.put("upsilon", new Character('\u03c5')); // greek small letter upsilon, U+03C5 ISOgrk3
+ entityMap.put("phi", new Character('\u03c6')); // greek small letter phi, U+03C6 ISOgrk3
+ entityMap.put("chi", new Character('\u03c7')); // greek small letter chi, U+03C7 ISOgrk3
+ entityMap.put("psi", new Character('\u03c8')); // greek small letter psi, U+03C8 ISOgrk3
+ entityMap.put("omega", new Character('\u03c9')); // greek small letter omega, U+03C9 ISOgrk3
+ entityMap.put("thetasym", new Character('\u03d1')); // greek small letter theta symbol, U+03D1 NEW
+ entityMap.put("upsih", new Character('\u03d2')); // greek upsilon with hook symbol, U+03D2 NEW
+ entityMap.put("piv", new Character('\u03d6')); // greek pi symbol, U+03D6 ISOgrk3
+ // General Punctuation
+ entityMap.put("bull", new Character('\u2022')); // bullet = black small circle, U+2022 ISOpub
+ // bullet is NOT the same as bullet operator, U+2219
+ entityMap.put("hellip", new Character('\u2026')); // horizontal ellipsis = three dot leader, U+2026 ISOpub
+ entityMap.put("prime", new Character('\u2032')); // prime = minutes = feet, U+2032 ISOtech
+ entityMap.put("Prime", new Character('\u2033')); // double prime = seconds = inches, U+2033 ISOtech
+ entityMap.put("oline", new Character('\u203e')); // overline = spacing overscore, U+203E NEW
+ entityMap.put("frasl", new Character('\u2044')); // fraction slash, U+2044 NEW
+ // Letterlike Symbols
+ entityMap.put("weierp", new Character('\u2118')); // script capital P = power set = Weierstrass p, U+2118 ISOamso
+ entityMap.put("image", new Character('\u2111')); // blackletter capital I = imaginary part, U+2111 ISOamso
+ entityMap.put("real", new Character('\u211c')); // blackletter capital R = real part symbol, U+211C ISOamso
+ entityMap.put("trade", new Character('\u2122')); // trade mark sign, U+2122 ISOnum
+ entityMap.put("alefsym", new Character('\u2135')); // alef symbol = first transfinite cardinal, U+2135 NEW
+ // alef symbol is NOT the same as hebrew letter alef,
+ // U+05D0 although the same glyph could be used to depict both characters
+ // Arrows
+ entityMap.put("larr", new Character('\u2190')); // leftwards arrow, U+2190 ISOnum
+ entityMap.put("uarr", new Character('\u2191')); // upwards arrow, U+2191 ISOnum
+ entityMap.put("rarr", new Character('\u2192')); // rightwards arrow, U+2192 ISOnum
+ entityMap.put("darr", new Character('\u2193')); // downwards arrow, U+2193 ISOnum
+ entityMap.put("harr", new Character('\u2194')); // left right arrow, U+2194 ISOamsa
+ entityMap.put("crarr", new Character('\u21b5')); // downwards arrow with corner leftwards = carriage return, U+21B5 NEW
+ entityMap.put("lArr", new Character('\u21d0')); // leftwards double arrow, U+21D0 ISOtech
+ // ISO 10646 does not say that lArr is the same as the 'is implied by' arrow
+ // but also does not have any other character for that function. So ? lArr can
+ // be used for 'is implied by' as ISOtech suggests
+ entityMap.put("uArr", new Character('\u21d1')); // upwards double arrow, U+21D1 ISOamsa
+ entityMap.put("rArr", new Character('\u21d2')); // rightwards double arrow, U+21D2 ISOtech
+ // ISO 10646 does not say this is the 'implies' character but does not have
+ // another character with this function so ?
+ // rArr can be used for 'implies' as ISOtech suggests
+ entityMap.put("dArr", new Character('\u21d3')); // downwards double arrow, U+21D3 ISOamsa
+ entityMap.put("hArr", new Character('\u21d4')); // left right double arrow, U+21D4 ISOamsa
+ // Mathematical Operators
+ entityMap.put("forall", new Character('\u2200')); // for all, U+2200 ISOtech
+ entityMap.put("part", new Character('\u2202')); // partial differential, U+2202 ISOtech
+ entityMap.put("exist", new Character('\u2203')); // there exists, U+2203 ISOtech
+ entityMap.put("empty", new Character('\u2205')); // empty set = null set = diameter, U+2205 ISOamso
+ entityMap.put("nabla", new Character('\u2207')); // nabla = backward difference, U+2207 ISOtech
+ entityMap.put("isin", new Character('\u2208')); // element of, U+2208 ISOtech
+ entityMap.put("notin", new Character('\u2209')); // not an element of, U+2209 ISOtech
+ entityMap.put("ni", new Character('\u220b')); // contains as member, U+220B ISOtech
+ // should there be a more memorable name than 'ni'?
+ entityMap.put("prod", new Character('\u220f')); // n-ary product = product sign, U+220F ISOamsb
+ // prod is NOT the same character as U+03A0 'greek capital letter pi' though
+ // the same glyph might be used for both
+ entityMap.put("sum", new Character('\u2211')); // n-ary sumation, U+2211 ISOamsb
+ // sum is NOT the same character as U+03A3 'greek capital letter sigma'
+ // though the same glyph might be used for both
+ entityMap.put("minus", new Character('\u2212')); // minus sign, U+2212 ISOtech
+ entityMap.put("lowast", new Character('\u2217')); // asterisk operator, U+2217 ISOtech
+ entityMap.put("radic", new Character('\u221a')); // square root = radical sign, U+221A ISOtech
+ entityMap.put("prop", new Character('\u221d')); // proportional to, U+221D ISOtech
+ entityMap.put("infin", new Character('\u221e')); // infinity, U+221E ISOtech
+ entityMap.put("ang", new Character('\u2220')); // angle, U+2220 ISOamso
+ entityMap.put("and", new Character('\u2227')); // logical and = wedge, U+2227 ISOtech
+ entityMap.put("or", new Character('\u2228')); // logical or = vee, U+2228 ISOtech
+ entityMap.put("cap", new Character('\u2229')); // intersection = cap, U+2229 ISOtech
+ entityMap.put("cup", new Character('\u222a')); // union = cup, U+222A ISOtech
+ entityMap.put("int", new Character('\u222b')); // integral, U+222B ISOtech
+ entityMap.put("there4", new Character('\u2234')); // therefore, U+2234 ISOtech
+ entityMap.put("sim", new Character('\u223c')); // tilde operator = varies with = similar to, U+223C ISOtech
+ // tilde operator is NOT the same character as the tilde, U+007E,
+ // although the same glyph might be used to represent both
+ entityMap.put("cong", new Character('\u2245')); // approximately equal to, U+2245 ISOtech
+ entityMap.put("asymp", new Character('\u2248')); // almost equal to = asymptotic to, U+2248 ISOamsr
+ entityMap.put("ne", new Character('\u2260')); // not equal to, U+2260 ISOtech
+ entityMap.put("equiv", new Character('\u2261')); // identical to, U+2261 ISOtech
+ entityMap.put("le", new Character('\u2264')); // less-than or equal to, U+2264 ISOtech
+ entityMap.put("ge", new Character('\u2265')); // greater-than or equal to, U+2265 ISOtech
+ entityMap.put("sub", new Character('\u2282')); // subset of, U+2282 ISOtech
+ entityMap.put("sup", new Character('\u2283')); // superset of, U+2283 ISOtech
+ // note that nsup, 'not a superset of, U+2283' is not covered by the Symbol
+ // font encoding and is not included. Should it be, for symmetry?
+ // It is in ISOamsn
+ entityMap.put("nsub", new Character('\u2284')); // not a subset of, U+2284 ISOamsn
+ entityMap.put("sube", new Character('\u2286')); // subset of or equal to, U+2286 ISOtech
+ entityMap.put("supe", new Character('\u2287')); // superset of or equal to, U+2287 ISOtech
+ entityMap.put("oplus", new Character('\u2295')); // circled plus = direct sum, U+2295 ISOamsb
+ entityMap.put("otimes", new Character('\u2297')); // circled times = vector product, U+2297 ISOamsb
+ entityMap.put("perp", new Character('\u22a5')); // up tack = orthogonal to = perpendicular, U+22A5 ISOtech
+ entityMap.put("sdot", new Character('\u22c5')); // dot operator, U+22C5 ISOamsb
+ // dot operator is NOT the same character as U+00B7 middle dot
+ // Miscellaneous Technical
+ entityMap.put("lceil", new Character('\u2308')); // left ceiling = apl upstile, U+2308 ISOamsc
+ entityMap.put("rceil", new Character('\u2309')); // right ceiling, U+2309 ISOamsc
+ entityMap.put("lfloor", new Character('\u230a')); // left floor = apl downstile, U+230A ISOamsc
+ entityMap.put("rfloor", new Character('\u230b')); // right floor, U+230B ISOamsc
+ entityMap.put("lang", new Character('\u2329')); // left-pointing angle bracket = bra, U+2329 ISOtech
+ // lang is NOT the same character as U+003C 'less than'
+ // or U+2039 'single left-pointing angle quotation mark'
+ entityMap.put("rang", new Character('\u232a')); // right-pointing angle bracket = ket, U+232A ISOtech
+ // rang is NOT the same character as U+003E 'greater than'
+ // or U+203A 'single right-pointing angle quotation mark'
+ // Geometric Shapes
+ entityMap.put("loz", new Character('\u25ca')); // lozenge, U+25CA ISOpub
+ // Miscellaneous Symbols
+ entityMap.put("spades", new Character('\u2660')); // black spade suit, U+2660 ISOpub
+ // black here seems to mean filled as opposed to hollow
+ entityMap.put("clubs", new Character('\u2663')); // black club suit = shamrock, U+2663 ISOpub
+ entityMap.put("hearts", new Character('\u2665')); // black heart suit = valentine, U+2665 ISOpub
+ entityMap.put("diams", new Character('\u2666')); // black diamond suit, U+2666 ISOpub
+ // C0 Controls and Basic Latin
+ entityMap.put("quot", new Character('\u0022')); // quotation mark = APL quote, U+0022 ISOnum
+ entityMap.put("amp", new Character('\u0026')); // ampersand, U+0026 ISOnum
+ entityMap.put("apos", new Character('\''));
+ entityMap.put("lt", new Character('\u003c')); // less-than sign, U+003C ISOnum
+ entityMap.put("gt", new Character('\u003e')); // greater-than sign, U+003E ISOnum
+ // Latin Extended-A
+ entityMap.put("OElig", new Character('\u0152')); // latin capital ligature OE, U+0152 ISOlat2
+ entityMap.put("oelig", new Character('\u0153')); // latin small ligature oe, U+0153 ISOlat2
+ // ligature is a misnomer, this is a separate character in some languages
+ entityMap.put("Scaron", new Character('\u0160')); // latin capital letter S with caron, U+0160 ISOlat2
+ entityMap.put("scaron", new Character('\u0161')); // latin small letter s with caron, U+0161 ISOlat2
+ entityMap.put("Yuml", new Character('\u0178')); // latin capital letter Y with diaeresis, U+0178 ISOlat2
+ // Spacing Modifier Letters
+ entityMap.put("circ", new Character('\u02c6')); // modifier letter circumflex accent, U+02C6 ISOpub
+ entityMap.put("tilde", new Character('\u02dc')); // small tilde, U+02DC ISOdia
+ // General Punctuation
+ entityMap.put("ensp", new Character('\u2002')); // en space, U+2002 ISOpub
+ entityMap.put("emsp", new Character('\u2003')); // em space, U+2003 ISOpub
+ entityMap.put("thinsp", new Character('\u2009')); // thin space, U+2009 ISOpub
+ entityMap.put("zwnj", new Character('\u200c')); // zero width non-joiner, U+200C NEW RFC 2070
+ entityMap.put("zwj", new Character('\u200d')); // zero width joiner, U+200D NEW RFC 2070
+ entityMap.put("lrm", new Character('\u200e')); // left-to-right mark, U+200E NEW RFC 2070
+ entityMap.put("rlm", new Character('\u200f')); // right-to-left mark, U+200F NEW RFC 2070
+ entityMap.put("ndash", new Character('\u2013')); // en dash, U+2013 ISOpub
+ entityMap.put("mdash", new Character('\u2014')); // em dash, U+2014 ISOpub
+ entityMap.put("lsquo", new Character('\u2018')); // left single quotation mark, U+2018 ISOnum
+ entityMap.put("rsquo", new Character('\u2019')); // right single quotation mark, U+2019 ISOnum
+ entityMap.put("sbquo", new Character('\u201a')); // single low-9 quotation mark, U+201A NEW
+ entityMap.put("ldquo", new Character('\u201c')); // left double quotation mark, U+201C ISOnum
+ entityMap.put("rdquo", new Character('\u201d')); // right double quotation mark, U+201D ISOnum
+ entityMap.put("bdquo", new Character('\u201e')); // double low-9 quotation mark, U+201E NEW
+ entityMap.put("dagger", new Character('\u2020')); // dagger, U+2020 ISOpub
+ entityMap.put("Dagger", new Character('\u2021')); // double dagger, U+2021 ISOpub
+ entityMap.put("permil", new Character('\u2030')); // per mille sign, U+2030 ISOtech
+ entityMap.put("lsaquo", new Character('\u2039')); // single left-pointing angle quotation mark, U+2039 ISO proposed
+ // lsaquo is proposed but not yet ISO standardized
+ entityMap.put("rsaquo", new Character('\u203a')); // single right-pointing angle quotation mark, U+203A ISO proposed
+ // rsaquo is proposed but not yet ISO standardized
+ entityMap.put("euro", new Character('\u20ac')); // euro sign, U+20AC NEW
+
+
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/pdf/SpotColor.java b/src/main/java/com/lowagie/text/pdf/SpotColor.java
new file mode 100644
index 0000000..a9da97c
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/SpotColor.java
@@ -0,0 +1,90 @@
+/*
+ * $Id: SpotColor.java,v 1.48 2005/12/11 15:31:04 psoares33 Exp $
+ * $Name: $
+ *
+ * Copyright 2001, 2002 Paulo Soares
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf;
+
+/**
+ *
+ * @author psoares
+ */
+public class SpotColor extends ExtendedColor {
+
+ PdfSpotColor spot;
+ float tint;
+
+ public SpotColor(PdfSpotColor spot, float tint) {
+ super(TYPE_SEPARATION,
+ ((float)spot.getAlternativeCS().getRed() / 255f - 1f) * tint + 1,
+ ((float)spot.getAlternativeCS().getGreen() / 255f - 1f) * tint + 1,
+ ((float)spot.getAlternativeCS().getBlue() / 255f - 1f) * tint + 1);
+ this.spot = spot;
+ this.tint = tint;
+ }
+
+ public SpotColor(PdfSpotColor spot) {
+ this(spot, spot.getTint());
+ }
+
+ public PdfSpotColor getPdfSpotColor() {
+ return spot;
+ }
+
+ public float getTint() {
+ return tint;
+ }
+
+ public boolean equals(Object obj) {
+ return this == obj;
+ }
+
+ public int hashCode() {
+ return spot.hashCode() ^ Float.floatToIntBits(tint);
+ }
+}
diff --git a/src/main/java/com/lowagie/text/pdf/StampContent.java b/src/main/java/com/lowagie/text/pdf/StampContent.java
new file mode 100644
index 0000000..57b85c7
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/StampContent.java
@@ -0,0 +1,81 @@
+/*
+ * Copyright 2003 by Paulo Soares.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+package com.lowagie.text.pdf;
+
+public class StampContent extends PdfContentByte {
+ PdfStamperImp.PageStamp ps;
+ PageResources pageResources;
+
+ /** Creates a new instance of StampContent */
+ StampContent(PdfStamperImp stamper, PdfStamperImp.PageStamp ps) {
+ super(stamper);
+ this.ps = ps;
+ pageResources = ps.pageResources;
+ }
+
+ public void setAction(PdfAction action, float llx, float lly, float urx, float ury) {
+ ((PdfStamperImp)writer).addAnnotation(new PdfAnnotation(writer, llx, lly, urx, ury, action), ps.pageN);
+ }
+
+ /**
+ * Gets a duplicate of this <CODE>PdfContentByte</CODE>. All
+ * the members are copied by reference but the buffer stays different.
+ *
+ * @return a copy of this <CODE>PdfContentByte</CODE>
+ */
+ public PdfContentByte getDuplicate() {
+ return new StampContent((PdfStamperImp)writer, ps);
+ }
+
+ PageResources getPageResources() {
+ return pageResources;
+ }
+
+ void addAnnotation(PdfAnnotation annot) {
+ ((PdfStamperImp)writer).addAnnotation(annot, ps.pageN);
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/pdf/TextField.java b/src/main/java/com/lowagie/text/pdf/TextField.java
new file mode 100644
index 0000000..1535069
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/TextField.java
@@ -0,0 +1,661 @@
+/*
+ * Copyright 2003-2005 by Paulo Soares.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf;
+
+import java.awt.Color;
+import com.lowagie.text.Element;
+import com.lowagie.text.DocumentException;
+import com.lowagie.text.Rectangle;
+import com.lowagie.text.Phrase;
+import com.lowagie.text.Font;
+import com.lowagie.text.Chunk;
+import java.io.IOException;
+import java.util.ArrayList;
+
+/** Supports text, combo and list fields generating the correct appearances.
+ * All the option in the Acrobat GUI are supported in an easy to use API.
+ * @author Paulo Soares (psoares@consiste.pt)
+ */
+public class TextField extends BaseField {
+
+ /** Holds value of property defaultText. */
+ private String defaultText;
+
+ /** Holds value of property choices. */
+ private String[] choices;
+
+ /** Holds value of property choiceExports. */
+ private String[] choiceExports;
+
+ /** Holds value of property choiceSelection. */
+ private int choiceSelection;
+
+ private int topFirst;
+
+ private float extraMarginLeft;
+ private float extraMarginTop;
+
+ /** Creates a new <CODE>TextField</CODE>.
+ * @param writer the document <CODE>PdfWriter</CODE>
+ * @param box the field location and dimensions
+ * @param fieldName the field name. If <CODE>null</CODE> only the widget keys
+ * will be included in the field allowing it to be used as a kid field.
+ */
+ public TextField(PdfWriter writer, Rectangle box, String fieldName) {
+ super(writer, box, fieldName);
+ }
+
+ private static boolean checkRTL(String text) {
+ if (text == null || text.length() == 0)
+ return false;
+ char[] cc = text.toCharArray();
+ for (int k = 0; k < cc.length; ++k) {
+ int c = (int)cc[k];
+ if (c >= 0x590 && c < 0x0780)
+ return true;
+ }
+ return false;
+ }
+
+ private static void changeFontSize(Phrase p, float size) {
+ for (int k = 0; k < p.size(); ++k) {
+ ((Chunk)p.get(k)).font().setSize(size);
+ }
+ }
+
+ private Phrase composePhrase(String text, BaseFont ufont, Color color, float fontSize) {
+ Phrase phrase = null;
+ if (extensionFont == null && (substitutionFonts == null || substitutionFonts.size() == 0))
+ phrase = new Phrase(new Chunk(text, new Font(ufont, fontSize, 0, color)));
+ else {
+ FontSelector fs = new FontSelector();
+ fs.addFont(new Font(ufont, fontSize, 0, color));
+ if (extensionFont != null)
+ fs.addFont(new Font(extensionFont, fontSize, 0, color));
+ if (substitutionFonts != null) {
+ for (int k = 0; k < substitutionFonts.size(); ++k) {
+ fs.addFont(new Font((BaseFont)substitutionFonts.get(k), fontSize, 0, color));
+ }
+ }
+ phrase = fs.process(text);
+ }
+ return phrase;
+ }
+
+ private static String removeCRLF(String text) {
+ if (text.indexOf('\n') >= 0 || text.indexOf('\r') >= 0) {
+ char[] p = text.toCharArray();
+ StringBuffer sb = new StringBuffer(p.length);
+ for (int k = 0; k < p.length; ++k) {
+ char c = p[k];
+ if (c == '\n')
+ sb.append(' ');
+ else if (c == '\r') {
+ sb.append(' ');
+ if (k < p.length - 1 && p[k + 1] == '\n')
+ ++k;
+ }
+ else
+ sb.append(c);
+ }
+ return sb.toString();
+ }
+ return text;
+ }
+
+ public PdfAppearance getAppearance() throws IOException, DocumentException {
+ PdfAppearance app = getBorderAppearance();
+ app.beginVariableText();
+ if (text == null || text.length() == 0) {
+ app.endVariableText();
+ return app;
+ }
+ BaseFont ufont = getRealFont();
+ boolean borderExtra = borderStyle == PdfBorderDictionary.STYLE_BEVELED || borderStyle == PdfBorderDictionary.STYLE_INSET;
+ float h = box.height() - borderWidth * 2;
+ float bw2 = borderWidth;
+ if (borderExtra) {
+ h -= borderWidth * 2;
+ bw2 *= 2;
+ }
+ h -= extraMarginTop;
+ float offsetX = (borderExtra ? 2 * borderWidth : borderWidth);
+ offsetX = Math.max(offsetX, 1);
+ float offX = Math.min(bw2, offsetX);
+ app.saveState();
+ app.rectangle(offX, offX, box.width() - 2 * offX, box.height() - 2 * offX);
+ app.clip();
+ app.newPath();
+ Color fcolor = (textColor == null) ? GrayColor.GRAYBLACK : textColor;
+ String ptext = text; //fixed by Kazuya Ujihara (ujihara.jp)
+ if ((options & PASSWORD) != 0) {
+ char[] pchar = new char[text.length()];
+ for (int i = 0; i < text.length(); i++)
+ pchar[i] = '*';
+ ptext = new String(pchar);
+ }
+ int rtl = checkRTL(ptext) ? PdfWriter.RUN_DIRECTION_LTR : PdfWriter.RUN_DIRECTION_NO_BIDI;
+ if ((options & MULTILINE) == 0) {
+ ptext = removeCRLF(text);
+ }
+ Phrase phrase = composePhrase(ptext, ufont, fcolor, fontSize);
+ if ((options & MULTILINE) != 0) {
+ float usize = fontSize;
+ float width = box.width() - 4 * offsetX - extraMarginLeft;
+ float factor = ufont.getFontDescriptor(BaseFont.BBOXURY, 1) - ufont.getFontDescriptor(BaseFont.BBOXLLY, 1);
+ ColumnText ct = new ColumnText(null);
+ if (usize == 0) {
+ usize = h / factor;
+ if (usize > 4) {
+ if (usize > 12)
+ usize = 12;
+ float step = Math.max((usize - 4) / 10, 0.2f);
+ ct.setSimpleColumn(0, -h, width, 0);
+ ct.setAlignment(alignment);
+ ct.setRunDirection(rtl);
+ for (; usize > 4; usize -= step) {
+ ct.setYLine(0);
+ changeFontSize(phrase, usize);
+ ct.setText(phrase);
+ ct.setLeading(factor * usize);
+ int status = ct.go(true);
+ if ((status & ColumnText.NO_MORE_COLUMN) == 0)
+ break;
+ }
+ }
+ if (usize < 4) {
+ usize = 4;
+ }
+ }
+ changeFontSize(phrase, usize);
+ ct.setCanvas(app);
+ float leading = usize * factor;
+ float offsetY = offsetX + h - ufont.getFontDescriptor(BaseFont.BBOXURY, usize);
+ ct.setSimpleColumn(extraMarginLeft + 2 * offsetX, -20000, box.width() - 2 * offsetX, offsetY + leading);
+ ct.setLeading(leading);
+ ct.setAlignment(alignment);
+ ct.setRunDirection(rtl);
+ ct.setText(phrase);
+ ct.go();
+ }
+ else {
+ float usize = fontSize;
+ if (usize == 0) {
+ float maxCalculatedSize = h / (ufont.getFontDescriptor(BaseFont.BBOXURX, 1) - ufont.getFontDescriptor(BaseFont.BBOXLLY, 1));
+ changeFontSize(phrase, 1);
+ float wd = ColumnText.getWidth(phrase, rtl, 0);
+ if (wd == 0)
+ usize = maxCalculatedSize;
+ else
+ usize = (box.width() - extraMarginLeft - 4 * offsetX) / wd;
+ if (usize > maxCalculatedSize)
+ usize = maxCalculatedSize;
+ if (usize < 4)
+ usize = 4;
+ }
+ changeFontSize(phrase, usize);
+ float offsetY = offX + ((box.height() - 2*offX) - ufont.getFontDescriptor(BaseFont.ASCENT, usize)) / 2;
+ if (offsetY < offX)
+ offsetY = offX;
+ if (offsetY - offX < -ufont.getFontDescriptor(BaseFont.DESCENT, usize)) {
+ float ny = -ufont.getFontDescriptor(BaseFont.DESCENT, usize) + offX;
+ float dy = box.height() - offX - ufont.getFontDescriptor(BaseFont.ASCENT, usize);
+ offsetY = Math.min(ny, Math.max(offsetY, dy));
+ }
+ if ((options & COMB) != 0 && maxCharacterLength > 0) {
+ int textLen = Math.min(maxCharacterLength, ptext.length());
+ int position = 0;
+ if (alignment == Element.ALIGN_RIGHT) {
+ position = maxCharacterLength - textLen;
+ }
+ else if (alignment == Element.ALIGN_CENTER) {
+ position = (maxCharacterLength - textLen) / 2;
+ }
+ float step = (box.width() - extraMarginLeft) / maxCharacterLength;
+ float start = step / 2 + position * step;
+ if (textColor == null)
+ app.setGrayFill(0);
+ else
+ app.setColorFill(textColor);
+ app.beginText();
+ for (int k = 0; k < phrase.size(); ++k) {
+ Chunk ck = (Chunk)phrase.get(k);
+ BaseFont bf = ck.font().getBaseFont();
+ app.setFontAndSize(bf, usize);
+ StringBuffer sb = ck.append("");
+ for (int j = 0; j < sb.length(); ++j) {
+ String c = sb.substring(j, j + 1);
+ float wd = bf.getWidthPoint(c, usize);
+ app.setTextMatrix(extraMarginLeft + start - wd / 2, offsetY - extraMarginTop);
+ app.showText(c);
+ start += step;
+ }
+ }
+ app.endText();
+ }
+ else {
+ if (alignment == Element.ALIGN_RIGHT) {
+ ColumnText.showTextAligned(app, Element.ALIGN_RIGHT, phrase, extraMarginLeft + box.width() - 2 * offsetX, offsetY - extraMarginTop, 0, rtl, 0);
+ }
+ else if (alignment == Element.ALIGN_CENTER) {
+ ColumnText.showTextAligned(app, Element.ALIGN_CENTER, phrase, extraMarginLeft + box.width() / 2, offsetY - extraMarginTop, 0, rtl, 0);
+ }
+ else
+ ColumnText.showTextAligned(app, Element.ALIGN_LEFT, phrase, extraMarginLeft + 2 * offsetX, offsetY - extraMarginTop, 0, rtl, 0);
+ }
+ }
+ app.restoreState();
+ app.endVariableText();
+ return app;
+ }
+
+ PdfAppearance getListAppearance() throws IOException, DocumentException {
+ PdfAppearance app = getBorderAppearance();
+ app.beginVariableText();
+ if (choices == null || choices.length == 0) {
+ app.endVariableText();
+ return app;
+ }
+ int topChoice = choiceSelection;
+ if (topChoice >= choices.length) {
+ topChoice = choices.length - 1;
+ }
+ if (topChoice < 0)
+ topChoice = 0;
+ BaseFont ufont = getRealFont();
+ float usize = fontSize;
+ if (usize == 0)
+ usize = 12;
+ boolean borderExtra = borderStyle == PdfBorderDictionary.STYLE_BEVELED || borderStyle == PdfBorderDictionary.STYLE_INSET;
+ float h = box.height() - borderWidth * 2;
+ if (borderExtra)
+ h -= borderWidth * 2;
+ float offsetX = (borderExtra ? 2 * borderWidth : borderWidth);
+ float leading = ufont.getFontDescriptor(BaseFont.BBOXURY, usize) - ufont.getFontDescriptor(BaseFont.BBOXLLY, usize);
+ int maxFit = (int)(h / leading) + 1;
+ int first = 0;
+ int last = 0;
+ last = topChoice + maxFit / 2 + 1;
+ first = last - maxFit;
+ if (first < 0) {
+ last += first;
+ first = 0;
+ }
+// first = topChoice;
+ last = first + maxFit;
+ if (last > choices.length)
+ last = choices.length;
+ topFirst = first;
+ app.saveState();
+ app.rectangle(offsetX, offsetX, box.width() - 2 * offsetX, box.height() - 2 * offsetX);
+ app.clip();
+ app.newPath();
+ Color fcolor = (textColor == null) ? GrayColor.GRAYBLACK : textColor;
+ app.setColorFill(new Color(10, 36, 106));
+ app.rectangle(offsetX, offsetX + h - (topChoice - first + 1) * leading, box.width() - 2 * offsetX, leading);
+ app.fill();
+ float xp = offsetX * 2;
+ float yp = offsetX + h - ufont.getFontDescriptor(BaseFont.BBOXURY, usize);
+ for (int idx = first; idx < last; ++idx, yp -= leading) {
+ String ptext = choices[idx];
+ int rtl = checkRTL(ptext) ? PdfWriter.RUN_DIRECTION_LTR : PdfWriter.RUN_DIRECTION_NO_BIDI;
+ ptext = removeCRLF(ptext);
+ Phrase phrase = composePhrase(ptext, ufont, (idx == topChoice) ? GrayColor.GRAYWHITE : fcolor, usize);
+ ColumnText.showTextAligned(app, Element.ALIGN_LEFT, phrase, xp, yp, 0, rtl, 0);
+ }
+ app.restoreState();
+ app.endVariableText();
+ return app;
+ }
+
+ /** Gets a new text field.
+ * @throws IOException on error
+ * @throws DocumentException on error
+ * @return a new text field
+ */
+ public PdfFormField getTextField() throws IOException, DocumentException {
+ if (maxCharacterLength <= 0)
+ options &= ~COMB;
+ if ((options & COMB) != 0)
+ options &= ~MULTILINE;
+ PdfFormField field = PdfFormField.createTextField(writer, false, false, maxCharacterLength);
+ field.setWidget(box, PdfAnnotation.HIGHLIGHT_INVERT);
+ switch (alignment) {
+ case Element.ALIGN_CENTER:
+ field.setQuadding(PdfFormField.Q_CENTER);
+ break;
+ case Element.ALIGN_RIGHT:
+ field.setQuadding(PdfFormField.Q_RIGHT);
+ break;
+ }
+ if (rotation != 0)
+ field.setMKRotation(rotation);
+ if (fieldName != null) {
+ field.setFieldName(fieldName);
+ field.setValueAsString(text);
+ if (defaultText != null)
+ field.setDefaultValueAsString(defaultText);
+ if ((options & READ_ONLY) != 0)
+ field.setFieldFlags(PdfFormField.FF_READ_ONLY);
+ if ((options & REQUIRED) != 0)
+ field.setFieldFlags(PdfFormField.FF_REQUIRED);
+ if ((options & MULTILINE) != 0)
+ field.setFieldFlags(PdfFormField.FF_MULTILINE);
+ if ((options & DO_NOT_SCROLL) != 0)
+ field.setFieldFlags(PdfFormField.FF_DONOTSCROLL);
+ if ((options & PASSWORD) != 0)
+ field.setFieldFlags(PdfFormField.FF_PASSWORD);
+ if ((options & FILE_SELECTION) != 0)
+ field.setFieldFlags(PdfFormField.FF_FILESELECT);
+ if ((options & DO_NOT_SPELL_CHECK) != 0)
+ field.setFieldFlags(PdfFormField.FF_DONOTSPELLCHECK);
+ if ((options & COMB) != 0)
+ field.setFieldFlags(PdfFormField.FF_COMB);
+ }
+ field.setBorderStyle(new PdfBorderDictionary(borderWidth, borderStyle, new PdfDashPattern(3)));
+ PdfAppearance tp = getAppearance();
+ field.setAppearance(PdfAnnotation.APPEARANCE_NORMAL, tp);
+ PdfAppearance da = (PdfAppearance)tp.getDuplicate();
+ da.setFontAndSize(getRealFont(), fontSize);
+ if (textColor == null)
+ da.setGrayFill(0);
+ else
+ da.setColorFill(textColor);
+ field.setDefaultAppearanceString(da);
+ if (borderColor != null)
+ field.setMKBorderColor(borderColor);
+ if (backgroundColor != null)
+ field.setMKBackgroundColor(backgroundColor);
+ switch (visibility) {
+ case HIDDEN:
+ field.setFlags(PdfAnnotation.FLAGS_PRINT | PdfAnnotation.FLAGS_HIDDEN);
+ break;
+ case VISIBLE_BUT_DOES_NOT_PRINT:
+ break;
+ case HIDDEN_BUT_PRINTABLE:
+ field.setFlags(PdfAnnotation.FLAGS_PRINT | PdfAnnotation.FLAGS_NOVIEW);
+ break;
+ default:
+ field.setFlags(PdfAnnotation.FLAGS_PRINT);
+ break;
+ }
+ return field;
+ }
+
+ /** Gets a new combo field.
+ * @throws IOException on error
+ * @throws DocumentException on error
+ * @return a new combo field
+ */
+ public PdfFormField getComboField() throws IOException, DocumentException {
+ return getChoiceField(false);
+ }
+
+ /** Gets a new list field.
+ * @throws IOException on error
+ * @throws DocumentException on error
+ * @return a new list field
+ */
+ public PdfFormField getListField() throws IOException, DocumentException {
+ return getChoiceField(true);
+ }
+
+ protected PdfFormField getChoiceField(boolean isList) throws IOException, DocumentException {
+ options &= (~MULTILINE) & (~COMB);
+ String uchoices[] = choices;
+ if (uchoices == null)
+ uchoices = new String[0];
+ int topChoice = choiceSelection;
+ if (topChoice >= uchoices.length)
+ topChoice = uchoices.length - 1;
+ if (text == null) text = ""; //fixed by Kazuya Ujihara (ujihara.jp)
+ if (topChoice >= 0)
+ text = uchoices[topChoice];
+ if (topChoice < 0)
+ topChoice = 0;
+ PdfFormField field = null;
+ String mix[][] = null;
+ if (choiceExports == null) {
+ if (isList)
+ field = PdfFormField.createList(writer, uchoices, topChoice);
+ else
+ field = PdfFormField.createCombo(writer, (options & EDIT) != 0, uchoices, topChoice);
+ }
+ else {
+ mix = new String[uchoices.length][2];
+ for (int k = 0; k < mix.length; ++k)
+ mix[k][0] = mix[k][1] = uchoices[k];
+ int top = Math.min(uchoices.length, choiceExports.length);
+ for (int k = 0; k < top; ++k) {
+ if (choiceExports[k] != null)
+ mix[k][0] = choiceExports[k];
+ }
+ if (isList)
+ field = PdfFormField.createList(writer, mix, topChoice);
+ else
+ field = PdfFormField.createCombo(writer, (options & EDIT) != 0, mix, topChoice);
+ }
+ field.setWidget(box, PdfAnnotation.HIGHLIGHT_INVERT);
+ if (rotation != 0)
+ field.setMKRotation(rotation);
+ if (fieldName != null) {
+ field.setFieldName(fieldName);
+ if (uchoices.length > 0) {
+ if (mix != null) {
+ field.setValueAsString(mix[topChoice][0]);
+ field.setDefaultValueAsString(mix[topChoice][0]);
+ }
+ else {
+ field.setValueAsString(text);
+ field.setDefaultValueAsString(text);
+ }
+ }
+ if ((options & READ_ONLY) != 0)
+ field.setFieldFlags(PdfFormField.FF_READ_ONLY);
+ if ((options & REQUIRED) != 0)
+ field.setFieldFlags(PdfFormField.FF_REQUIRED);
+ if ((options & DO_NOT_SPELL_CHECK) != 0)
+ field.setFieldFlags(PdfFormField.FF_DONOTSPELLCHECK);
+ }
+ field.setBorderStyle(new PdfBorderDictionary(borderWidth, borderStyle, new PdfDashPattern(3)));
+ PdfAppearance tp;
+ if (isList) {
+ tp = getListAppearance();
+ if (topFirst > 0)
+ field.put(PdfName.TI, new PdfNumber(topFirst));
+ }
+ else
+ tp = getAppearance();
+ field.setAppearance(PdfAnnotation.APPEARANCE_NORMAL, tp);
+ PdfAppearance da = (PdfAppearance)tp.getDuplicate();
+ da.setFontAndSize(getRealFont(), fontSize);
+ if (textColor == null)
+ da.setGrayFill(0);
+ else
+ da.setColorFill(textColor);
+ field.setDefaultAppearanceString(da);
+ if (borderColor != null)
+ field.setMKBorderColor(borderColor);
+ if (backgroundColor != null)
+ field.setMKBackgroundColor(backgroundColor);
+ switch (visibility) {
+ case HIDDEN:
+ field.setFlags(PdfAnnotation.FLAGS_PRINT | PdfAnnotation.FLAGS_HIDDEN);
+ break;
+ case VISIBLE_BUT_DOES_NOT_PRINT:
+ break;
+ case HIDDEN_BUT_PRINTABLE:
+ field.setFlags(PdfAnnotation.FLAGS_PRINT | PdfAnnotation.FLAGS_NOVIEW);
+ break;
+ default:
+ field.setFlags(PdfAnnotation.FLAGS_PRINT);
+ break;
+ }
+ return field;
+ }
+
+ /** Gets the default text.
+ * @return the default text
+ */
+ public String getDefaultText() {
+ return this.defaultText;
+ }
+
+ /** Sets the default text. It is only meaningful for text fields.
+ * @param defaultText the default text
+ */
+ public void setDefaultText(String defaultText) {
+ this.defaultText = defaultText;
+ }
+
+ /** Gets the choices to be presented to the user in list/combo
+ * fields.
+ * @return the choices to be presented to the user
+ */
+ public String[] getChoices() {
+ return this.choices;
+ }
+
+ /** Sets the choices to be presented to the user in list/combo
+ * fields.
+ * @param choices the choices to be presented to the user
+ */
+ public void setChoices(String[] choices) {
+ this.choices = choices;
+ }
+
+ /** Gets the export values in list/combo fields.
+ * @return the export values in list/combo fields
+ */
+ public String[] getChoiceExports() {
+ return this.choiceExports;
+ }
+
+ /** Sets the export values in list/combo fields. If this array
+ * is <CODE>null</CODE> then the choice values will also be used
+ * as the export values.
+ * @param choiceExports the export values in list/combo fields
+ */
+ public void setChoiceExports(String[] choiceExports) {
+ this.choiceExports = choiceExports;
+ }
+
+ /** Gets the zero based index of the selected item.
+ * @return the zero based index of the selected item
+ */
+ public int getChoiceSelection() {
+ return this.choiceSelection;
+ }
+
+ /** Sets the zero based index of the selected item.
+ * @param choiceSelection the zero based index of the selected item
+ */
+ public void setChoiceSelection(int choiceSelection) {
+ this.choiceSelection = choiceSelection;
+ }
+
+ int getTopFirst() {
+ return topFirst;
+ }
+
+ /**
+ * Sets extra margins in text fields to better mimic the Acrobat layout.
+ * @param extraMarginLeft the extra marging left
+ * @param extraMarginTop the extra margin top
+ */
+ public void setExtraMargin(float extraMarginLeft, float extraMarginTop) {
+ this.extraMarginLeft = extraMarginLeft;
+ this.extraMarginTop = extraMarginTop;
+ }
+
+ /**
+ * Holds value of property substitutionFonts.
+ */
+ private ArrayList substitutionFonts;
+
+ /**
+ * Gets the list of substitution fonts. The list is composed of <CODE>BaseFont</CODE> and can be <CODE>null</CODE>. The fonts in this list will be used if the original
+ * font doesn't contain the needed glyphs.
+ * @return the list
+ */
+ public ArrayList getSubstitutionFonts() {
+ return this.substitutionFonts;
+ }
+
+ /**
+ * Sets a list of substitution fonts. The list is composed of <CODE>BaseFont</CODE> and can also be <CODE>null</CODE>. The fonts in this list will be used if the original
+ * font doesn't contain the needed glyphs.
+ * @param substitutionFonts the list
+ */
+ public void setSubstitutionFonts(ArrayList substitutionFonts) {
+ this.substitutionFonts = substitutionFonts;
+ }
+
+ /**
+ * Holds value of property extensionFont.
+ */
+ private BaseFont extensionFont;
+
+ /**
+ * Gets the extensionFont. This font will be searched before the
+ * substitution fonts. It may be <code>null</code>.
+ * @return the extensionFont
+ */
+ public BaseFont getExtensionFont() {
+ return this.extensionFont;
+ }
+
+ /**
+ * Sets the extensionFont. This font will be searched before the
+ * substitution fonts. It may be <code>null</code>.
+ * @param extensionFont New value of property extensionFont.
+ */
+ public void setExtensionFont(BaseFont extensionFont) {
+ this.extensionFont = extensionFont;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/pdf/TrueTypeFont.java b/src/main/java/com/lowagie/text/pdf/TrueTypeFont.java
new file mode 100644
index 0000000..8551cfc
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/TrueTypeFont.java
@@ -0,0 +1,1377 @@
+/*
+ * $Id: TrueTypeFont.java,v 1.58 2006/02/23 16:45:48 psoares33 Exp $
+ * $Name: $
+ *
+ * Copyright 2001, 2002 Paulo Soares
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf;
+
+import java.io.*;
+import java.util.HashMap;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.Map;
+import com.lowagie.text.DocumentException;
+import com.lowagie.text.ExceptionConverter;
+/** Reads a Truetype font
+ *
+ * @author Paulo Soares (psoares@consiste.pt)
+ */
+class TrueTypeFont extends BaseFont {
+
+ /** The code pages possible for a True Type font.
+ */
+ static final String codePages[] = {
+ "1252 Latin 1",
+ "1250 Latin 2: Eastern Europe",
+ "1251 Cyrillic",
+ "1253 Greek",
+ "1254 Turkish",
+ "1255 Hebrew",
+ "1256 Arabic",
+ "1257 Windows Baltic",
+ "1258 Vietnamese",
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ "874 Thai",
+ "932 JIS/Japan",
+ "936 Chinese: Simplified chars--PRC and Singapore",
+ "949 Korean Wansung",
+ "950 Chinese: Traditional chars--Taiwan and Hong Kong",
+ "1361 Korean Johab",
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ "Macintosh Character Set (US Roman)",
+ "OEM Character Set",
+ "Symbol Character Set",
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ "869 IBM Greek",
+ "866 MS-DOS Russian",
+ "865 MS-DOS Nordic",
+ "864 Arabic",
+ "863 MS-DOS Canadian French",
+ "862 Hebrew",
+ "861 MS-DOS Icelandic",
+ "860 MS-DOS Portuguese",
+ "857 IBM Turkish",
+ "855 IBM Cyrillic; primarily Russian",
+ "852 Latin 2",
+ "775 MS-DOS Baltic",
+ "737 Greek; former 437 G",
+ "708 Arabic; ASMO 708",
+ "850 WE/Latin 1",
+ "437 US"};
+
+ protected boolean justNames = false;
+ /** Contains the location of the several tables. The key is the name of
+ * the table and the value is an <CODE>int[2]</CODE> where position 0
+ * is the offset from the start of the file and position 1 is the length
+ * of the table.
+ */
+ protected HashMap tables;
+ /** The file in use.
+ */
+ protected RandomAccessFileOrArray rf;
+ /** The file name.
+ */
+ protected String fileName;
+
+ protected boolean cff = false;
+
+ protected int cffOffset;
+
+ protected int cffLength;
+
+ /** The offset from the start of the file to the table directory.
+ * It is 0 for TTF and may vary for TTC depending on the chosen font.
+ */
+ protected int directoryOffset;
+ /** The index for the TTC font. It is an empty <CODE>String</CODE> for a
+ * TTF file.
+ */
+ protected String ttcIndex;
+ /** The style modifier */
+ protected String style = "";
+ /** The content of table 'head'.
+ */
+ protected FontHeader head = new FontHeader();
+ /** The content of table 'hhea'.
+ */
+ protected HorizontalHeader hhea = new HorizontalHeader();
+ /** The content of table 'OS/2'.
+ */
+ protected WindowsMetrics os_2 = new WindowsMetrics();
+ /** The width of the glyphs. This is essentially the content of table
+ * 'hmtx' normalized to 1000 units.
+ */
+ protected int GlyphWidths[];
+
+ protected int bboxes[][];
+ /** The map containing the code information for the table 'cmap', encoding 1.0.
+ * The key is the code and the value is an <CODE>int[2]</CODE> where position 0
+ * is the glyph number and position 1 is the glyph width normalized to 1000
+ * units.
+ */
+ protected HashMap cmap10;
+ /** The map containing the code information for the table 'cmap', encoding 3.1
+ * in Unicode.
+ * <P>
+ * The key is the code and the value is an <CODE>int</CODE>[2] where position 0
+ * is the glyph number and position 1 is the glyph width normalized to 1000
+ * units.
+ */
+ protected HashMap cmap31;
+ /** The map containing the kerning information. It represents the content of
+ * table 'kern'. The key is an <CODE>Integer</CODE> where the top 16 bits
+ * are the glyph number for the first character and the lower 16 bits are the
+ * glyph number for the second character. The value is the amount of kerning in
+ * normalized 1000 units as an <CODE>Integer</CODE>. This value is usually negative.
+ */
+ protected IntHashtable kerning = new IntHashtable();
+ /**
+ * The font name.
+ * This name is usually extracted from the table 'name' with
+ * the 'Name ID' 6.
+ */
+ protected String fontName;
+
+ /** The full name of the font
+ */
+ protected String fullName[][];
+
+ /** The family name of the font
+ */
+ protected String familyName[][];
+ /** The italic angle. It is usually extracted from the 'post' table or in it's
+ * absence with the code:
+ * <P>
+ * <PRE>
+ * -Math.atan2(hhea.caretSlopeRun, hhea.caretSlopeRise) * 180 / Math.PI
+ * </PRE>
+ */
+ protected double italicAngle;
+ /** <CODE>true</CODE> if all the glyphs have the same width.
+ */
+ protected boolean isFixedPitch = false;
+
+ /** The components of table 'head'.
+ */
+ protected static class FontHeader {
+ /** A variable. */
+ int flags;
+ /** A variable. */
+ int unitsPerEm;
+ /** A variable. */
+ short xMin;
+ /** A variable. */
+ short yMin;
+ /** A variable. */
+ short xMax;
+ /** A variable. */
+ short yMax;
+ /** A variable. */
+ int macStyle;
+ }
+
+ /** The components of table 'hhea'.
+ */
+ protected static class HorizontalHeader {
+ /** A variable. */
+ short Ascender;
+ /** A variable. */
+ short Descender;
+ /** A variable. */
+ short LineGap;
+ /** A variable. */
+ int advanceWidthMax;
+ /** A variable. */
+ short minLeftSideBearing;
+ /** A variable. */
+ short minRightSideBearing;
+ /** A variable. */
+ short xMaxExtent;
+ /** A variable. */
+ short caretSlopeRise;
+ /** A variable. */
+ short caretSlopeRun;
+ /** A variable. */
+ int numberOfHMetrics;
+ }
+
+ /** The components of table 'OS/2'.
+ */
+ protected static class WindowsMetrics {
+ /** A variable. */
+ short xAvgCharWidth;
+ /** A variable. */
+ int usWeightClass;
+ /** A variable. */
+ int usWidthClass;
+ /** A variable. */
+ short fsType;
+ /** A variable. */
+ short ySubscriptXSize;
+ /** A variable. */
+ short ySubscriptYSize;
+ /** A variable. */
+ short ySubscriptXOffset;
+ /** A variable. */
+ short ySubscriptYOffset;
+ /** A variable. */
+ short ySuperscriptXSize;
+ /** A variable. */
+ short ySuperscriptYSize;
+ /** A variable. */
+ short ySuperscriptXOffset;
+ /** A variable. */
+ short ySuperscriptYOffset;
+ /** A variable. */
+ short yStrikeoutSize;
+ /** A variable. */
+ short yStrikeoutPosition;
+ /** A variable. */
+ short sFamilyClass;
+ /** A variable. */
+ byte panose[] = new byte[10];
+ /** A variable. */
+ byte achVendID[] = new byte[4];
+ /** A variable. */
+ int fsSelection;
+ /** A variable. */
+ int usFirstCharIndex;
+ /** A variable. */
+ int usLastCharIndex;
+ /** A variable. */
+ short sTypoAscender;
+ /** A variable. */
+ short sTypoDescender;
+ /** A variable. */
+ short sTypoLineGap;
+ /** A variable. */
+ int usWinAscent;
+ /** A variable. */
+ int usWinDescent;
+ /** A variable. */
+ int ulCodePageRange1;
+ /** A variable. */
+ int ulCodePageRange2;
+ /** A variable. */
+ int sCapHeight;
+ }
+
+ /** This constructor is present to allow extending the class.
+ */
+ protected TrueTypeFont() {
+ }
+
+ TrueTypeFont(String ttFile, String enc, boolean emb, byte ttfAfm[]) throws DocumentException, IOException {
+ this(ttFile, enc, emb, ttfAfm, false);
+ }
+
+ /** Creates a new TrueType font.
+ * @param ttFile the location of the font on file. The file must end in '.ttf' or
+ * '.ttc' but can have modifiers after the name
+ * @param enc the encoding to be applied to this font
+ * @param emb true if the font is to be embedded in the PDF
+ * @param ttfAfm the font as a <CODE>byte</CODE> array
+ * @throws DocumentException the font is invalid
+ * @throws IOException the font file could not be read
+ */
+ TrueTypeFont(String ttFile, String enc, boolean emb, byte ttfAfm[], boolean justNames) throws DocumentException, IOException {
+ this.justNames = justNames;
+ String nameBase = getBaseName(ttFile);
+ String ttcName = getTTCName(nameBase);
+ if (nameBase.length() < ttFile.length()) {
+ style = ttFile.substring(nameBase.length());
+ }
+ encoding = enc;
+ embedded = emb;
+ fileName = ttcName;
+ fontType = FONT_TYPE_TT;
+ ttcIndex = "";
+ if (ttcName.length() < nameBase.length())
+ ttcIndex = nameBase.substring(ttcName.length() + 1);
+ if (fileName.toLowerCase().endsWith(".ttf") || fileName.toLowerCase().endsWith(".otf") || fileName.toLowerCase().endsWith(".ttc")) {
+ process(ttfAfm);
+ if (!justNames && embedded && os_2.fsType == 2)
+ throw new DocumentException(fileName + style + " cannot be embedded due to licensing restrictions.");
+ }
+ else
+ throw new DocumentException(fileName + style + " is not a TTF, OTF or TTC font file.");
+ PdfEncodings.convertToBytes(" ", enc); // check if the encoding exists
+ createEncoding();
+ }
+
+ /** Gets the name from a composed TTC file name.
+ * If I have for input "myfont.ttc,2" the return will
+ * be "myfont.ttc".
+ * @param name the full name
+ * @return the simple file name
+ */
+ protected static String getTTCName(String name) {
+ int idx = name.toLowerCase().indexOf(".ttc,");
+ if (idx < 0)
+ return name;
+ else
+ return name.substring(0, idx + 4);
+ }
+
+
+ /**
+ * Reads the tables 'head', 'hhea', 'OS/2' and 'post' filling several variables.
+ * @throws DocumentException the font is invalid
+ * @throws IOException the font file could not be read
+ */
+ void fillTables() throws DocumentException, IOException {
+ int table_location[];
+ table_location = (int[])tables.get("head");
+ if (table_location == null)
+ throw new DocumentException("Table 'head' does not exist in " + fileName + style);
+ rf.seek(table_location[0] + 16);
+ head.flags = rf.readUnsignedShort();
+ head.unitsPerEm = rf.readUnsignedShort();
+ rf.skipBytes(16);
+ head.xMin = rf.readShort();
+ head.yMin = rf.readShort();
+ head.xMax = rf.readShort();
+ head.yMax = rf.readShort();
+ head.macStyle = rf.readUnsignedShort();
+
+ table_location = (int[])tables.get("hhea");
+ if (table_location == null)
+ throw new DocumentException("Table 'hhea' does not exist " + fileName + style);
+ rf.seek(table_location[0] + 4);
+ hhea.Ascender = rf.readShort();
+ hhea.Descender = rf.readShort();
+ hhea.LineGap = rf.readShort();
+ hhea.advanceWidthMax = rf.readUnsignedShort();
+ hhea.minLeftSideBearing = rf.readShort();
+ hhea.minRightSideBearing = rf.readShort();
+ hhea.xMaxExtent = rf.readShort();
+ hhea.caretSlopeRise = rf.readShort();
+ hhea.caretSlopeRun = rf.readShort();
+ rf.skipBytes(12);
+ hhea.numberOfHMetrics = rf.readUnsignedShort();
+
+ table_location = (int[])tables.get("OS/2");
+ if (table_location == null)
+ throw new DocumentException("Table 'OS/2' does not exist in " + fileName + style);
+ rf.seek(table_location[0]);
+ int version = rf.readUnsignedShort();
+ os_2.xAvgCharWidth = rf.readShort();
+ os_2.usWeightClass = rf.readUnsignedShort();
+ os_2.usWidthClass = rf.readUnsignedShort();
+ os_2.fsType = rf.readShort();
+ os_2.ySubscriptXSize = rf.readShort();
+ os_2.ySubscriptYSize = rf.readShort();
+ os_2.ySubscriptXOffset = rf.readShort();
+ os_2.ySubscriptYOffset = rf.readShort();
+ os_2.ySuperscriptXSize = rf.readShort();
+ os_2.ySuperscriptYSize = rf.readShort();
+ os_2.ySuperscriptXOffset = rf.readShort();
+ os_2.ySuperscriptYOffset = rf.readShort();
+ os_2.yStrikeoutSize = rf.readShort();
+ os_2.yStrikeoutPosition = rf.readShort();
+ os_2.sFamilyClass = rf.readShort();
+ rf.readFully(os_2.panose);
+ rf.skipBytes(16);
+ rf.readFully(os_2.achVendID);
+ os_2.fsSelection = rf.readUnsignedShort();
+ os_2.usFirstCharIndex = rf.readUnsignedShort();
+ os_2.usLastCharIndex = rf.readUnsignedShort();
+ os_2.sTypoAscender = rf.readShort();
+ os_2.sTypoDescender = rf.readShort();
+ if (os_2.sTypoDescender > 0)
+ os_2.sTypoDescender = (short)(-os_2.sTypoDescender);
+ os_2.sTypoLineGap = rf.readShort();
+ os_2.usWinAscent = rf.readUnsignedShort();
+ os_2.usWinDescent = rf.readUnsignedShort();
+ os_2.ulCodePageRange1 = 0;
+ os_2.ulCodePageRange2 = 0;
+ if (version > 0) {
+ os_2.ulCodePageRange1 = rf.readInt();
+ os_2.ulCodePageRange2 = rf.readInt();
+ }
+ if (version > 1) {
+ rf.skipBytes(2);
+ os_2.sCapHeight = rf.readShort();
+ }
+ else
+ os_2.sCapHeight = (int)(0.7 * head.unitsPerEm);
+
+ table_location = (int[])tables.get("post");
+ if (table_location == null) {
+ italicAngle = -Math.atan2(hhea.caretSlopeRun, hhea.caretSlopeRise) * 180 / Math.PI;
+ return;
+ }
+ rf.seek(table_location[0] + 4);
+ short mantissa = rf.readShort();
+ int fraction = rf.readUnsignedShort();
+ italicAngle = (double)mantissa + (double)fraction / 16384.0;
+ rf.skipBytes(4);
+ isFixedPitch = rf.readInt() != 0;
+ }
+
+ /**
+ * Gets the Postscript font name.
+ * @throws DocumentException the font is invalid
+ * @throws IOException the font file could not be read
+ * @return the Postscript font name
+ */
+ String getBaseFont() throws DocumentException, IOException {
+ int table_location[];
+ table_location = (int[])tables.get("name");
+ if (table_location == null)
+ throw new DocumentException("Table 'name' does not exist in " + fileName + style);
+ rf.seek(table_location[0] + 2);
+ int numRecords = rf.readUnsignedShort();
+ int startOfStorage = rf.readUnsignedShort();
+ for (int k = 0; k < numRecords; ++k) {
+ int platformID = rf.readUnsignedShort();
+ int platformEncodingID = rf.readUnsignedShort();
+ int languageID = rf.readUnsignedShort();
+ int nameID = rf.readUnsignedShort();
+ int length = rf.readUnsignedShort();
+ int offset = rf.readUnsignedShort();
+ if (nameID == 6) {
+ rf.seek(table_location[0] + startOfStorage + offset);
+ if (platformID == 0 || platformID == 3)
+ return readUnicodeString(length);
+ else
+ return readStandardString(length);
+ }
+ }
+ File file = new File(fileName);
+ return file.getName().replace(' ', '-');
+ }
+
+ /** Extracts the names of the font in all the languages available.
+ * @param id the name id to retrieve
+ * @throws DocumentException on error
+ * @throws IOException on error
+ */
+ String[][] getNames(int id) throws DocumentException, IOException {
+ int table_location[];
+ table_location = (int[])tables.get("name");
+ if (table_location == null)
+ throw new DocumentException("Table 'name' does not exist in " + fileName + style);
+ rf.seek(table_location[0] + 2);
+ int numRecords = rf.readUnsignedShort();
+ int startOfStorage = rf.readUnsignedShort();
+ ArrayList names = new ArrayList();
+ for (int k = 0; k < numRecords; ++k) {
+ int platformID = rf.readUnsignedShort();
+ int platformEncodingID = rf.readUnsignedShort();
+ int languageID = rf.readUnsignedShort();
+ int nameID = rf.readUnsignedShort();
+ int length = rf.readUnsignedShort();
+ int offset = rf.readUnsignedShort();
+ if (nameID == id) {
+ int pos = rf.getFilePointer();
+ rf.seek(table_location[0] + startOfStorage + offset);
+ String name;
+ if (platformID == 0 || platformID == 3 || (platformID == 2 && platformEncodingID == 1)){
+ name = readUnicodeString(length);
+ }
+ else {
+ name = readStandardString(length);
+ }
+ names.add(new String[]{String.valueOf(platformID),
+ String.valueOf(platformEncodingID), String.valueOf(languageID), name});
+ rf.seek(pos);
+ }
+ }
+ String thisName[][] = new String[names.size()][];
+ for (int k = 0; k < names.size(); ++k)
+ thisName[k] = (String[])names.get(k);
+ return thisName;
+ }
+
+ void checkCff() throws DocumentException, IOException {
+ int table_location[];
+ table_location = (int[])tables.get("CFF ");
+ if (table_location != null) {
+ cff = true;
+ cffOffset = table_location[0];
+ cffLength = table_location[1];
+ }
+ }
+
+ /** Reads the font data.
+ * @param ttfAfm the font as a <CODE>byte</CODE> array, possibly <CODE>null</CODE>
+ * @throws DocumentException the font is invalid
+ * @throws IOException the font file could not be read
+ */
+ void process(byte ttfAfm[]) throws DocumentException, IOException {
+ tables = new HashMap();
+
+ try {
+ if (ttfAfm == null)
+ rf = new RandomAccessFileOrArray(fileName);
+ else
+ rf = new RandomAccessFileOrArray(ttfAfm);
+ if (ttcIndex.length() > 0) {
+ int dirIdx = Integer.parseInt(ttcIndex);
+ if (dirIdx < 0)
+ throw new DocumentException("The font index for " + fileName + " must be positive.");
+ String mainTag = readStandardString(4);
+ if (!mainTag.equals("ttcf"))
+ throw new DocumentException(fileName + " is not a valid TTC file.");
+ rf.skipBytes(4);
+ int dirCount = rf.readInt();
+ if (dirIdx >= dirCount)
+ throw new DocumentException("The font index for " + fileName + " must be between 0 and " + (dirCount - 1) + ". It was " + dirIdx + ".");
+ rf.skipBytes(dirIdx * 4);
+ directoryOffset = rf.readInt();
+ }
+ rf.seek(directoryOffset);
+ int ttId = rf.readInt();
+ if (ttId != 0x00010000 && ttId != 0x4F54544F)
+ throw new DocumentException(fileName + " is not a valid TTF or OTF file.");
+ int num_tables = rf.readUnsignedShort();
+ rf.skipBytes(6);
+ for (int k = 0; k < num_tables; ++k) {
+ String tag = readStandardString(4);
+ rf.skipBytes(4);
+ int table_location[] = new int[2];
+ table_location[0] = rf.readInt();
+ table_location[1] = rf.readInt();
+ tables.put(tag, table_location);
+ }
+ checkCff();
+ fontName = getBaseFont();
+ fullName = getNames(4); //full name
+ familyName = getNames(1); //family name
+ if (!justNames) {
+ fillTables();
+ readGlyphWidths();
+ readCMaps();
+ readKerning();
+ readBbox();
+ GlyphWidths = null;
+ }
+ }
+ finally {
+ if (rf != null) {
+ rf.close();
+ if (!embedded)
+ rf = null;
+ }
+ }
+ }
+
+ /** Reads a <CODE>String</CODE> from the font file as bytes using the Cp1252
+ * encoding.
+ * @param length the length of bytes to read
+ * @return the <CODE>String</CODE> read
+ * @throws IOException the font file could not be read
+ */
+ protected String readStandardString(int length) throws IOException {
+ byte buf[] = new byte[length];
+ rf.readFully(buf);
+ try {
+ return new String(buf, WINANSI);
+ }
+ catch (Exception e) {
+ throw new ExceptionConverter(e);
+ }
+ }
+
+ /** Reads a Unicode <CODE>String</CODE> from the font file. Each character is
+ * represented by two bytes.
+ * @param length the length of bytes to read. The <CODE>String</CODE> will have <CODE>length</CODE>/2
+ * characters
+ * @return the <CODE>String</CODE> read
+ * @throws IOException the font file could not be read
+ */
+ protected String readUnicodeString(int length) throws IOException {
+ StringBuffer buf = new StringBuffer();
+ length /= 2;
+ for (int k = 0; k < length; ++k) {
+ buf.append(rf.readChar());
+ }
+ return buf.toString();
+ }
+
+ /** Reads the glyphs widths. The widths are extracted from the table 'hmtx'.
+ * The glyphs are normalized to 1000 units.
+ * @throws DocumentException the font is invalid
+ * @throws IOException the font file could not be read
+ */
+ protected void readGlyphWidths() throws DocumentException, IOException {
+ int table_location[];
+ table_location = (int[])tables.get("hmtx");
+ if (table_location == null)
+ throw new DocumentException("Table 'hmtx' does not exist in " + fileName + style);
+ rf.seek(table_location[0]);
+ GlyphWidths = new int[hhea.numberOfHMetrics];
+ for (int k = 0; k < hhea.numberOfHMetrics; ++k) {
+ GlyphWidths[k] = (rf.readUnsignedShort() * 1000) / head.unitsPerEm;
+ rf.readUnsignedShort();
+ }
+ }
+
+ /** Gets a glyph width.
+ * @param glyph the glyph to get the width of
+ * @return the width of the glyph in normalized 1000 units
+ */
+ protected int getGlyphWidth(int glyph) {
+ if (glyph >= GlyphWidths.length)
+ glyph = GlyphWidths.length - 1;
+ return GlyphWidths[glyph];
+ }
+
+ private void readBbox() throws DocumentException, IOException {
+ int tableLocation[];
+ tableLocation = (int[])tables.get("head");
+ if (tableLocation == null)
+ throw new DocumentException("Table 'head' does not exist in " + fileName + style);
+ rf.seek(tableLocation[0] + TrueTypeFontSubSet.HEAD_LOCA_FORMAT_OFFSET);
+ boolean locaShortTable = (rf.readUnsignedShort() == 0);
+ tableLocation = (int[])tables.get("loca");
+ if (tableLocation == null)
+ return;
+ rf.seek(tableLocation[0]);
+ int locaTable[];
+ if (locaShortTable) {
+ int entries = tableLocation[1] / 2;
+ locaTable = new int[entries];
+ for (int k = 0; k < entries; ++k)
+ locaTable[k] = rf.readUnsignedShort() * 2;
+ }
+ else {
+ int entries = tableLocation[1] / 4;
+ locaTable = new int[entries];
+ for (int k = 0; k < entries; ++k)
+ locaTable[k] = rf.readInt();
+ }
+ tableLocation = (int[])tables.get("glyf");
+ if (tableLocation == null)
+ throw new DocumentException("Table 'glyf' does not exist in " + fileName + style);
+ int tableGlyphOffset = tableLocation[0];
+ bboxes = new int[locaTable.length - 1][];
+ for (int glyph = 0; glyph < locaTable.length - 1; ++glyph) {
+ int start = locaTable[glyph];
+ if (start != locaTable[glyph + 1]) {
+ rf.seek(tableGlyphOffset + start + 2);
+ bboxes[glyph] = new int[]{
+ (rf.readShort() * 1000) / head.unitsPerEm,
+ (rf.readShort() * 1000) / head.unitsPerEm,
+ (rf.readShort() * 1000) / head.unitsPerEm,
+ (rf.readShort() * 1000) / head.unitsPerEm};
+ }
+ }
+ }
+
+ /** Reads the several maps from the table 'cmap'. The maps of interest are 1.0 for symbolic
+ * fonts and 3.1 for all others. A symbolic font is defined as having the map 3.0.
+ * @throws DocumentException the font is invalid
+ * @throws IOException the font file could not be read
+ */
+ void readCMaps() throws DocumentException, IOException {
+ int table_location[];
+ table_location = (int[])tables.get("cmap");
+ if (table_location == null)
+ throw new DocumentException("Table 'cmap' does not exist in " + fileName + style);
+ rf.seek(table_location[0]);
+ rf.skipBytes(2);
+ int num_tables = rf.readUnsignedShort();
+ fontSpecific = false;
+ int map10 = 0;
+ int map31 = 0;
+ int map30 = 0;
+ for (int k = 0; k < num_tables; ++k) {
+ int platId = rf.readUnsignedShort();
+ int platSpecId = rf.readUnsignedShort();
+ int offset = rf.readInt();
+ if (platId == 3 && platSpecId == 0) {
+ fontSpecific = true;
+ map30 = offset;
+ }
+ else if (platId == 3 && platSpecId == 1) {
+ map31 = offset;
+ }
+ if (platId == 1 && platSpecId == 0) {
+ map10 = offset;
+ }
+ }
+ if (map10 > 0) {
+ rf.seek(table_location[0] + map10);
+ int format = rf.readUnsignedShort();
+ switch (format) {
+ case 0:
+ cmap10 = readFormat0();
+ break;
+ case 4:
+ cmap10 = readFormat4();
+ break;
+ case 6:
+ cmap10 = readFormat6();
+ break;
+ }
+ }
+ if (map31 > 0) {
+ rf.seek(table_location[0] + map31);
+ int format = rf.readUnsignedShort();
+ if (format == 4) {
+ cmap31 = readFormat4();
+ }
+ }
+ if (map30 > 0) {
+ rf.seek(table_location[0] + map30);
+ int format = rf.readUnsignedShort();
+ if (format == 4) {
+ cmap10 = readFormat4();
+ }
+ }
+ }
+
+ /** The information in the maps of the table 'cmap' is coded in several formats.
+ * Format 0 is the Apple standard character to glyph index mapping table.
+ * @return a <CODE>HashMap</CODE> representing this map
+ * @throws IOException the font file could not be read
+ */
+ HashMap readFormat0() throws IOException {
+ HashMap h = new HashMap();
+ rf.skipBytes(4);
+ for (int k = 0; k < 256; ++k) {
+ int r[] = new int[2];
+ r[0] = rf.readUnsignedByte();
+ r[1] = getGlyphWidth(r[0]);
+ h.put(new Integer(k), r);
+ }
+ return h;
+ }
+
+ /** The information in the maps of the table 'cmap' is coded in several formats.
+ * Format 4 is the Microsoft standard character to glyph index mapping table.
+ * @return a <CODE>HashMap</CODE> representing this map
+ * @throws IOException the font file could not be read
+ */
+ HashMap readFormat4() throws IOException {
+ HashMap h = new HashMap();
+ int table_lenght = rf.readUnsignedShort();
+ rf.skipBytes(2);
+ int segCount = rf.readUnsignedShort() / 2;
+ rf.skipBytes(6);
+ int endCount[] = new int[segCount];
+ for (int k = 0; k < segCount; ++k) {
+ endCount[k] = rf.readUnsignedShort();
+ }
+ rf.skipBytes(2);
+ int startCount[] = new int[segCount];
+ for (int k = 0; k < segCount; ++k) {
+ startCount[k] = rf.readUnsignedShort();
+ }
+ int idDelta[] = new int[segCount];
+ for (int k = 0; k < segCount; ++k) {
+ idDelta[k] = rf.readUnsignedShort();
+ }
+ int idRO[] = new int[segCount];
+ for (int k = 0; k < segCount; ++k) {
+ idRO[k] = rf.readUnsignedShort();
+ }
+ int glyphId[] = new int[table_lenght / 2 - 8 - segCount * 4];
+ for (int k = 0; k < glyphId.length; ++k) {
+ glyphId[k] = rf.readUnsignedShort();
+ }
+ for (int k = 0; k < segCount; ++k) {
+ int glyph;
+ for (int j = startCount[k]; j <= endCount[k] && j != 0xFFFF; ++j) {
+ if (idRO[k] == 0) {
+ glyph = (j + idDelta[k]) & 0xFFFF;
+ }
+ else {
+ int idx = k + idRO[k] / 2 - segCount + j - startCount[k];
+ if (idx >= glyphId.length)
+ continue;
+ glyph = (glyphId[idx] + idDelta[k]) & 0xFFFF;
+ }
+ int r[] = new int[2];
+ r[0] = glyph;
+ r[1] = getGlyphWidth(r[0]);
+ h.put(new Integer(fontSpecific ? ((j & 0xff00) == 0xf000 ? j & 0xff : j) : j), r);
+ }
+ }
+ return h;
+ }
+
+ /** The information in the maps of the table 'cmap' is coded in several formats.
+ * Format 6 is a trimmed table mapping. It is similar to format 0 but can have
+ * less than 256 entries.
+ * @return a <CODE>HashMap</CODE> representing this map
+ * @throws IOException the font file could not be read
+ */
+ HashMap readFormat6() throws IOException {
+ HashMap h = new HashMap();
+ rf.skipBytes(4);
+ int start_code = rf.readUnsignedShort();
+ int code_count = rf.readUnsignedShort();
+ for (int k = 0; k < code_count; ++k) {
+ int r[] = new int[2];
+ r[0] = rf.readUnsignedShort();
+ r[1] = getGlyphWidth(r[0]);
+ h.put(new Integer(k + start_code), r);
+ }
+ return h;
+ }
+
+ /** Reads the kerning information from the 'kern' table.
+ * @throws IOException the font file could not be read
+ */
+ void readKerning() throws IOException {
+ int table_location[];
+ table_location = (int[])tables.get("kern");
+ if (table_location == null)
+ return;
+ rf.seek(table_location[0] + 2);
+ int nTables = rf.readUnsignedShort();
+ int checkpoint = table_location[0] + 4;
+ int length = 0;
+ for (int k = 0; k < nTables; ++k) {
+ checkpoint += length;
+ rf.seek(checkpoint);
+ rf.skipBytes(2);
+ length = rf.readUnsignedShort();
+ int coverage = rf.readUnsignedShort();
+ if ((coverage & 0xfff7) == 0x0001) {
+ int nPairs = rf.readUnsignedShort();
+ rf.skipBytes(6);
+ for (int j = 0; j < nPairs; ++j) {
+ int pair = rf.readInt();
+ int value = ((int)rf.readShort() * 1000) / head.unitsPerEm;
+ kerning.put(pair, value);
+ }
+ }
+ }
+ }
+
+ /** Gets the kerning between two Unicode chars.
+ * @param char1 the first char
+ * @param char2 the second char
+ * @return the kerning to be applied
+ */
+ public int getKerning(char char1, char char2) {
+ int metrics[] = getMetricsTT(char1);
+ if (metrics == null)
+ return 0;
+ int c1 = metrics[0];
+ metrics = getMetricsTT(char2);
+ if (metrics == null)
+ return 0;
+ int c2 = metrics[0];
+ return kerning.get((c1 << 16) + c2);
+ }
+
+ /** Gets the width from the font according to the unicode char <CODE>c</CODE>.
+ * If the <CODE>name</CODE> is null it's a symbolic font.
+ * @param c the unicode char
+ * @param name the glyph name
+ * @return the width of the char
+ */
+ int getRawWidth(int c, String name) {
+ HashMap map = null;
+ if (name == null || cmap31 == null)
+ map = cmap10;
+ else
+ map = cmap31;
+ if (map == null)
+ return 0;
+ int metric[] = (int[])map.get(new Integer(c));
+ if (metric == null)
+ return 0;
+ return metric[1];
+ }
+
+ /** Generates the font descriptor for this font.
+ * @return the PdfDictionary containing the font descriptor or <CODE>null</CODE>
+ * @param subsetPrefix the subset prefix
+ * @param fontStream the indirect reference to a PdfStream containing the font or <CODE>null</CODE>
+ * @throws DocumentException if there is an error
+ */
+ protected PdfDictionary getFontDescriptor(PdfIndirectReference fontStream, String subsetPrefix) throws DocumentException {
+ PdfDictionary dic = new PdfDictionary(PdfName.FONTDESCRIPTOR);
+ dic.put(PdfName.ASCENT, new PdfNumber((int)os_2.sTypoAscender * 1000 / head.unitsPerEm));
+ dic.put(PdfName.CAPHEIGHT, new PdfNumber((int)os_2.sCapHeight * 1000 / head.unitsPerEm));
+ dic.put(PdfName.DESCENT, new PdfNumber((int)os_2.sTypoDescender * 1000 / head.unitsPerEm));
+ dic.put(PdfName.FONTBBOX, new PdfRectangle(
+ (int)head.xMin * 1000 / head.unitsPerEm,
+ (int)head.yMin * 1000 / head.unitsPerEm,
+ (int)head.xMax * 1000 / head.unitsPerEm,
+ (int)head.yMax * 1000 / head.unitsPerEm));
+ if (cff) {
+ if (encoding.startsWith("Identity-"))
+ dic.put(PdfName.FONTNAME, new PdfName(subsetPrefix + fontName+"-"+encoding));
+ else
+ dic.put(PdfName.FONTNAME, new PdfName(subsetPrefix + fontName + style));
+ }
+ else
+ dic.put(PdfName.FONTNAME, new PdfName(subsetPrefix + fontName + style));
+ dic.put(PdfName.ITALICANGLE, new PdfNumber(italicAngle));
+ dic.put(PdfName.STEMV, new PdfNumber(80));
+ if (fontStream != null) {
+ if (cff)
+ dic.put(PdfName.FONTFILE3, fontStream);
+ else
+ dic.put(PdfName.FONTFILE2, fontStream);
+ }
+ int flags = 0;
+ if (isFixedPitch)
+ flags |= 1;
+ flags |= fontSpecific ? 4 : 32;
+ if ((head.macStyle & 2) != 0)
+ flags |= 64;
+ if ((head.macStyle & 1) != 0)
+ flags |= 262144;
+ dic.put(PdfName.FLAGS, new PdfNumber(flags));
+
+ return dic;
+ }
+
+ /** Generates the font dictionary for this font.
+ * @return the PdfDictionary containing the font dictionary
+ * @param subsetPrefix the subset prefx
+ * @param firstChar the first valid character
+ * @param lastChar the last valid character
+ * @param shortTag a 256 bytes long <CODE>byte</CODE> array where each unused byte is represented by 0
+ * @param fontDescriptor the indirect reference to a PdfDictionary containing the font descriptor or <CODE>null</CODE>
+ * @throws DocumentException if there is an error
+ */
+ protected PdfDictionary getFontBaseType(PdfIndirectReference fontDescriptor, String subsetPrefix, int firstChar, int lastChar, byte shortTag[]) throws DocumentException {
+ PdfDictionary dic = new PdfDictionary(PdfName.FONT);
+ if (cff) {
+ dic.put(PdfName.SUBTYPE, PdfName.TYPE1);
+ dic.put(PdfName.BASEFONT, new PdfName(fontName + style));
+ }
+ else {
+ dic.put(PdfName.SUBTYPE, PdfName.TRUETYPE);
+ dic.put(PdfName.BASEFONT, new PdfName(subsetPrefix + fontName + style));
+ }
+ dic.put(PdfName.BASEFONT, new PdfName(subsetPrefix + fontName + style));
+ if (!fontSpecific) {
+ for (int k = firstChar; k <= lastChar; ++k) {
+ if (!differences[k].equals(notdef)) {
+ firstChar = k;
+ break;
+ }
+ }
+ if (encoding.equals("Cp1252") || encoding.equals("MacRoman"))
+ dic.put(PdfName.ENCODING, encoding.equals("Cp1252") ? PdfName.WIN_ANSI_ENCODING : PdfName.MAC_ROMAN_ENCODING);
+ else {
+ PdfDictionary enc = new PdfDictionary(PdfName.ENCODING);
+ PdfArray dif = new PdfArray();
+ boolean gap = true;
+ for (int k = firstChar; k <= lastChar; ++k) {
+ if (shortTag[k] != 0) {
+ if (gap) {
+ dif.add(new PdfNumber(k));
+ gap = false;
+ }
+ dif.add(new PdfName(differences[k]));
+ }
+ else
+ gap = true;
+ }
+ enc.put(PdfName.DIFFERENCES, dif);
+ dic.put(PdfName.ENCODING, enc);
+ }
+ }
+ dic.put(PdfName.FIRSTCHAR, new PdfNumber(firstChar));
+ dic.put(PdfName.LASTCHAR, new PdfNumber(lastChar));
+ PdfArray wd = new PdfArray();
+ for (int k = firstChar; k <= lastChar; ++k) {
+ if (shortTag[k] == 0)
+ wd.add(new PdfNumber(0));
+ else
+ wd.add(new PdfNumber(widths[k]));
+ }
+ dic.put(PdfName.WIDTHS, wd);
+ if (fontDescriptor != null)
+ dic.put(PdfName.FONTDESCRIPTOR, fontDescriptor);
+ return dic;
+ }
+
+ protected byte[] getFullFont() throws IOException {
+ RandomAccessFileOrArray rf2 = null;
+ try {
+ rf2 = new RandomAccessFileOrArray(rf);
+ rf2.reOpen();
+ byte b[] = new byte[rf2.length()];
+ rf2.readFully(b);
+ return b;
+ }
+ finally {
+ try {rf2.close();} catch (Exception e) {}
+ }
+ }
+
+ protected static int[] compactRanges(ArrayList ranges) {
+ ArrayList simp = new ArrayList();
+ for (int k = 0; k < ranges.size(); ++k) {
+ int[] r = (int[])ranges.get(k);
+ for (int j = 0; j < r.length; j += 2) {
+ simp.add(new int[]{Math.max(0, Math.min(r[j], r[j + 1])), Math.min(0xffff, Math.max(r[j], r[j + 1]))});
+ }
+ }
+ for (int k1 = 0; k1 < simp.size() - 1; ++k1) {
+ for (int k2 = k1 + 1; k2 < simp.size(); ++k2) {
+ int[] r1 = (int[])simp.get(k1);
+ int[] r2 = (int[])simp.get(k2);
+ if ((r1[0] >= r2[0] && r1[0] <= r2[1]) || (r1[1] >= r2[0] && r1[0] <= r2[1])) {
+ r1[0] = Math.min(r1[0], r2[0]);
+ r1[1] = Math.max(r1[1], r2[1]);
+ simp.remove(k2);
+ --k2;
+ }
+ }
+ }
+ int[] s = new int[simp.size() * 2];
+ for (int k = 0; k < simp.size(); ++k) {
+ int[] r = (int[])simp.get(k);
+ s[k * 2] = r[0];
+ s[k * 2 + 1] = r[1];
+ }
+ return s;
+ }
+
+ protected void addRangeUni(HashMap longTag, boolean includeMetrics, boolean subsetp) {
+ if (!subsetp && (subsetRanges != null || directoryOffset > 0)) {
+ int[] rg = (subsetRanges == null && directoryOffset > 0) ? new int[]{0, 0xffff} : compactRanges(subsetRanges);
+ HashMap usemap;
+ if (!fontSpecific && cmap31 != null)
+ usemap = cmap31;
+ else if (fontSpecific && cmap10 != null)
+ usemap = cmap10;
+ else if (cmap31 != null)
+ usemap = cmap31;
+ else
+ usemap = cmap10;
+ for (Iterator it = usemap.entrySet().iterator(); it.hasNext();) {
+ Map.Entry e = (Map.Entry)it.next();
+ int[] v = (int[])e.getValue();
+ Integer gi = new Integer(v[0]);
+ if (longTag.containsKey(gi))
+ continue;
+ int c = ((Integer)e.getKey()).intValue();
+ boolean skip = true;
+ for (int k = 0; k < rg.length; k += 2) {
+ if (c >= rg[k] && c <= rg[k + 1]) {
+ skip = false;
+ break;
+ }
+ }
+ if (!skip)
+ longTag.put(gi, includeMetrics ? new int[]{v[0], v[1], c} : null);
+ }
+ }
+ }
+
+ /** Outputs to the writer the font dictionaries and streams.
+ * @param writer the writer for this document
+ * @param ref the font indirect reference
+ * @param params several parameters that depend on the font type
+ * @throws IOException on error
+ * @throws DocumentException error in generating the object
+ */
+ void writeFont(PdfWriter writer, PdfIndirectReference ref, Object params[]) throws DocumentException, IOException {
+ int firstChar = ((Integer)params[0]).intValue();
+ int lastChar = ((Integer)params[1]).intValue();
+ byte shortTag[] = (byte[])params[2];
+ boolean subsetp = ((Boolean)params[3]).booleanValue() && subset;
+
+ if (!subsetp) {
+ firstChar = 0;
+ lastChar = shortTag.length - 1;
+ for (int k = 0; k < shortTag.length; ++k)
+ shortTag[k] = 1;
+ }
+ PdfIndirectReference ind_font = null;
+ PdfObject pobj = null;
+ PdfIndirectObject obj = null;
+ String subsetPrefix = "";
+ if (embedded) {
+ if (cff) {
+ RandomAccessFileOrArray rf2 = new RandomAccessFileOrArray(rf);
+ byte b[] = new byte[cffLength];
+ try {
+ rf2.reOpen();
+ rf2.seek(cffOffset);
+ rf2.readFully(b);
+ }
+ finally {
+ try {
+ rf2.close();
+ }
+ catch (Exception e) {
+ // empty on purpose
+ }
+ }
+ pobj = new StreamFont(b, "Type1C");
+ obj = writer.addToBody(pobj);
+ ind_font = obj.getIndirectReference();
+ }
+ else {
+ if (subsetp)
+ subsetPrefix = createSubsetPrefix();
+ HashMap glyphs = new HashMap();
+ for (int k = firstChar; k <= lastChar; ++k) {
+ if (shortTag[k] != 0) {
+ int metrics[];
+ if (fontSpecific)
+ metrics = getMetricsTT(k);
+ else
+ metrics = getMetricsTT(unicodeDifferences[k]);
+ if (metrics != null)
+ glyphs.put(new Integer(metrics[0]), null);
+ }
+ }
+ addRangeUni(glyphs, false, subsetp);
+ byte[] b = null;
+ if (subsetp || directoryOffset != 0 || subsetRanges != null) {
+ TrueTypeFontSubSet sb = new TrueTypeFontSubSet(fileName, new RandomAccessFileOrArray(rf), glyphs, directoryOffset, true, !subsetp);
+ b = sb.process();
+ }
+ else {
+ b = getFullFont();
+ }
+ int lengths[] = new int[]{b.length};
+ pobj = new StreamFont(b, lengths);
+ obj = writer.addToBody(pobj);
+ ind_font = obj.getIndirectReference();
+ }
+ }
+ pobj = getFontDescriptor(ind_font, subsetPrefix);
+ if (pobj != null){
+ obj = writer.addToBody(pobj);
+ ind_font = obj.getIndirectReference();
+ }
+ pobj = getFontBaseType(ind_font, subsetPrefix, firstChar, lastChar, shortTag);
+ writer.addToBody(pobj, ref);
+ }
+
+ /** Gets the font parameter identified by <CODE>key</CODE>. Valid values
+ * for <CODE>key</CODE> are <CODE>ASCENT</CODE>, <CODE>CAPHEIGHT</CODE>, <CODE>DESCENT</CODE>
+ * and <CODE>ITALICANGLE</CODE>.
+ * @param key the parameter to be extracted
+ * @param fontSize the font size in points
+ * @return the parameter in points
+ */
+ public float getFontDescriptor(int key, float fontSize) {
+ switch (key) {
+ case ASCENT:
+ return (float)os_2.sTypoAscender * fontSize / (float)head.unitsPerEm;
+ case CAPHEIGHT:
+ return (float)os_2.sCapHeight * fontSize / (float)head.unitsPerEm;
+ case DESCENT:
+ return (float)os_2.sTypoDescender * fontSize / (float)head.unitsPerEm;
+ case ITALICANGLE:
+ return (float)italicAngle;
+ case BBOXLLX:
+ return fontSize * (int)head.xMin / head.unitsPerEm;
+ case BBOXLLY:
+ return fontSize * (int)head.yMin / head.unitsPerEm;
+ case BBOXURX:
+ return fontSize * (int)head.xMax / head.unitsPerEm;
+ case BBOXURY:
+ return fontSize * (int)head.yMax / head.unitsPerEm;
+ case AWT_ASCENT:
+ return fontSize * (int)hhea.Ascender / head.unitsPerEm;
+ case AWT_DESCENT:
+ return fontSize * (int)hhea.Descender / head.unitsPerEm;
+ case AWT_LEADING:
+ return fontSize * (int)hhea.LineGap / head.unitsPerEm;
+ case AWT_MAXADVANCE:
+ return fontSize * (int)hhea.advanceWidthMax / head.unitsPerEm;
+ }
+ return 0;
+ }
+
+ /** Gets the glyph index and metrics for a character.
+ * @param c the character
+ * @return an <CODE>int</CODE> array with {glyph index, width}
+ */
+ public int[] getMetricsTT(int c) {
+ if (!fontSpecific && cmap31 != null)
+ return (int[])cmap31.get(new Integer(c));
+ if (fontSpecific && cmap10 != null)
+ return (int[])cmap10.get(new Integer(c));
+ if (cmap31 != null)
+ return (int[])cmap31.get(new Integer(c));
+ if (cmap10 != null)
+ return (int[])cmap10.get(new Integer(c));
+ return null;
+ }
+
+ /** Gets the postscript font name.
+ * @return the postscript font name
+ */
+ public String getPostscriptFontName() {
+ return fontName;
+ }
+
+ /** Gets the code pages supported by the font.
+ * @return the code pages supported by the font
+ */
+ public String[] getCodePagesSupported() {
+ long cp = (((long)os_2.ulCodePageRange2) << 32) + ((long)os_2.ulCodePageRange1 & 0xffffffffL);
+ int count = 0;
+ long bit = 1;
+ for (int k = 0; k < 64; ++k) {
+ if ((cp & bit) != 0 && codePages[k] != null)
+ ++count;
+ bit <<= 1;
+ }
+ String ret[] = new String[count];
+ count = 0;
+ bit = 1;
+ for (int k = 0; k < 64; ++k) {
+ if ((cp & bit) != 0 && codePages[k] != null)
+ ret[count++] = codePages[k];
+ bit <<= 1;
+ }
+ return ret;
+ }
+
+ /** Gets the full name of the font. If it is a True Type font
+ * each array element will have {Platform ID, Platform Encoding ID,
+ * Language ID, font name}. The interpretation of this values can be
+ * found in the Open Type specification, chapter 2, in the 'name' table.<br>
+ * For the other fonts the array has a single element with {"", "", "",
+ * font name}.
+ * @return the full name of the font
+ */
+ public String[][] getFullFontName() {
+ return fullName;
+ }
+
+ /** Gets the family name of the font. If it is a True Type font
+ * each array element will have {Platform ID, Platform Encoding ID,
+ * Language ID, font name}. The interpretation of this values can be
+ * found in the Open Type specification, chapter 2, in the 'name' table.<br>
+ * For the other fonts the array has a single element with {"", "", "",
+ * font name}.
+ * @return the family name of the font
+ */
+ public String[][] getFamilyFontName() {
+ return familyName;
+ }
+
+ /** Checks if the font has any kerning pairs.
+ * @return <CODE>true</CODE> if the font has any kerning pairs
+ */
+ public boolean hasKernPairs() {
+ return kerning.size() > 0;
+ }
+
+ /**
+ * Sets the font name that will appear in the pdf font dictionary.
+ * Use with care as it can easily make a font unreadable if not embedded.
+ * @param name the new font name
+ */
+ public void setPostscriptFontName(String name) {
+ fontName = name;
+ }
+
+ /**
+ * Sets the kerning between two Unicode chars.
+ * @param char1 the first char
+ * @param char2 the second char
+ * @param kern the kerning to apply in normalized 1000 units
+ * @return <code>true</code> if the kerning was applied, <code>false</code> otherwise
+ */
+ public boolean setKerning(char char1, char char2, int kern) {
+ int metrics[] = getMetricsTT(char1);
+ if (metrics == null)
+ return false;
+ int c1 = metrics[0];
+ metrics = getMetricsTT(char2);
+ if (metrics == null)
+ return false;
+ int c2 = metrics[0];
+ kerning.put((c1 << 16) + c2, kern);
+ return true;
+ }
+
+ protected int[] getRawCharBBox(int c, String name) {
+ HashMap map = null;
+ if (name == null || cmap31 == null)
+ map = cmap10;
+ else
+ map = cmap31;
+ if (map == null)
+ return null;
+ int metric[] = (int[])map.get(new Integer(c));
+ if (metric == null || bboxes == null)
+ return null;
+ return bboxes[metric[0]];
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/pdf/TrueTypeFontSubSet.java b/src/main/java/com/lowagie/text/pdf/TrueTypeFontSubSet.java
new file mode 100644
index 0000000..5107b75
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/TrueTypeFontSubSet.java
@@ -0,0 +1,428 @@
+/*
+ * $Id: TrueTypeFontSubSet.java,v 1.48 2006/02/23 16:45:49 psoares33 Exp $
+ * $Name: $
+ *
+ * Copyright 2001, 2002 Paulo Soares
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf;
+
+import java.io.*;
+import java.util.HashMap;
+import java.util.ArrayList;
+import java.util.Arrays;
+import com.lowagie.text.DocumentException;
+import com.lowagie.text.ExceptionConverter;
+
+/** Subsets a True Type font by removing the unneeded glyphs from
+ * the font.
+ *
+ * @author Paulo Soares (psoares@consiste.pt)
+ */
+class TrueTypeFontSubSet {
+ static final String tableNamesSimple[] = {"cvt ", "fpgm", "glyf", "head",
+ "hhea", "hmtx", "loca", "maxp", "prep"};
+ static final String tableNamesCmap[] = {"cmap", "cvt ", "fpgm", "glyf", "head",
+ "hhea", "hmtx", "loca", "maxp", "prep"};
+ static final String tableNamesExtra[] = {"OS/2", "cmap", "cvt ", "fpgm", "glyf", "head",
+ "hhea", "hmtx", "loca", "maxp", "name, prep"};
+ static final int entrySelectors[] = {0,0,1,1,2,2,2,2,3,3,3,3,3,3,3,3,4,4,4,4,4};
+ static final int TABLE_CHECKSUM = 0;
+ static final int TABLE_OFFSET = 1;
+ static final int TABLE_LENGTH = 2;
+ static final int HEAD_LOCA_FORMAT_OFFSET = 51;
+
+ static final int ARG_1_AND_2_ARE_WORDS = 1;
+ static final int WE_HAVE_A_SCALE = 8;
+ static final int MORE_COMPONENTS = 32;
+ static final int WE_HAVE_AN_X_AND_Y_SCALE = 64;
+ static final int WE_HAVE_A_TWO_BY_TWO = 128;
+
+
+ /** Contains the location of the several tables. The key is the name of
+ * the table and the value is an <CODE>int[3]</CODE> where position 0
+ * is the checksum, position 1 is the offset from the start of the file
+ * and position 2 is the length of the table.
+ */
+ protected HashMap tableDirectory;
+ /** The file in use.
+ */
+ protected RandomAccessFileOrArray rf;
+ /** The file name.
+ */
+ protected String fileName;
+ protected boolean includeCmap;
+ protected boolean includeExtras;
+ protected boolean locaShortTable;
+ protected int locaTable[];
+ protected HashMap glyphsUsed;
+ protected ArrayList glyphsInList;
+ protected int tableGlyphOffset;
+ protected int newLocaTable[];
+ protected byte newLocaTableOut[];
+ protected byte newGlyfTable[];
+ protected int glyfTableRealSize;
+ protected int locaTableRealSize;
+ protected byte outFont[];
+ protected int fontPtr;
+ protected int directoryOffset;
+
+ /** Creates a new TrueTypeFontSubSet
+ * @param directoryOffset The offset from the start of the file to the table directory
+ * @param fileName the file name of the font
+ * @param glyphsUsed the glyphs used
+ * @param includeCmap <CODE>true</CODE> if the table cmap is to be included in the generated font
+ */
+ TrueTypeFontSubSet(String fileName, RandomAccessFileOrArray rf, HashMap glyphsUsed, int directoryOffset, boolean includeCmap, boolean includeExtras) {
+ this.fileName = fileName;
+ this.rf = rf;
+ this.glyphsUsed = glyphsUsed;
+ this.includeCmap = includeCmap;
+ this.includeExtras = includeExtras;
+ this.directoryOffset = directoryOffset;
+ glyphsInList = new ArrayList(glyphsUsed.keySet());
+ }
+
+ /** Does the actual work of subsetting the font.
+ * @throws IOException on error
+ * @throws DocumentException on error
+ * @return the subset font
+ */
+ byte[] process() throws IOException, DocumentException {
+ try {
+ rf.reOpen();
+ createTableDirectory();
+ readLoca();
+ flatGlyphs();
+ createNewGlyphTables();
+ locaTobytes();
+ assembleFont();
+ return outFont;
+ }
+ finally {
+ try {
+ rf.close();
+ }
+ catch (Exception e) {
+ // empty on purpose
+ }
+ }
+ }
+
+ protected void assembleFont() throws IOException, DocumentException {
+ int tableLocation[];
+ int fullFontSize = 0;
+ String tableNames[];
+ if (includeExtras)
+ tableNames = tableNamesExtra;
+ else {
+ if (includeCmap)
+ tableNames = tableNamesCmap;
+ else
+ tableNames = tableNamesSimple;
+ }
+ int tablesUsed = 2;
+ int len = 0;
+ for (int k = 0; k < tableNames.length; ++k) {
+ String name = tableNames[k];
+ if (name.equals("glyf") || name.equals("loca"))
+ continue;
+ tableLocation = (int[])tableDirectory.get(name);
+ if (tableLocation == null)
+ continue;
+ ++tablesUsed;
+ fullFontSize += (tableLocation[TABLE_LENGTH] + 3) & (~3);
+ }
+ fullFontSize += newLocaTableOut.length;
+ fullFontSize += newGlyfTable.length;
+ int ref = 16 * tablesUsed + 12;
+ fullFontSize += ref;
+ outFont = new byte[fullFontSize];
+ fontPtr = 0;
+ writeFontInt(0x00010000);
+ writeFontShort(tablesUsed);
+ int selector = entrySelectors[tablesUsed];
+ writeFontShort((1 << selector) * 16);
+ writeFontShort(selector);
+ writeFontShort((tablesUsed - (1 << selector)) * 16);
+ for (int k = 0; k < tableNames.length; ++k) {
+ String name = tableNames[k];
+ tableLocation = (int[])tableDirectory.get(name);
+ if (tableLocation == null)
+ continue;
+ writeFontString(name);
+ if (name.equals("glyf")) {
+ writeFontInt(calculateChecksum(newGlyfTable));
+ len = glyfTableRealSize;
+ }
+ else if (name.equals("loca")) {
+ writeFontInt(calculateChecksum(newLocaTableOut));
+ len = locaTableRealSize;
+ }
+ else {
+ writeFontInt(tableLocation[TABLE_CHECKSUM]);
+ len = tableLocation[TABLE_LENGTH];
+ }
+ writeFontInt(ref);
+ writeFontInt(len);
+ ref += (len + 3) & (~3);
+ }
+ for (int k = 0; k < tableNames.length; ++k) {
+ String name = tableNames[k];
+ tableLocation = (int[])tableDirectory.get(name);
+ if (tableLocation == null)
+ continue;
+ if (name.equals("glyf")) {
+ System.arraycopy(newGlyfTable, 0, outFont, fontPtr, newGlyfTable.length);
+ fontPtr += newGlyfTable.length;
+ newGlyfTable = null;
+ }
+ else if (name.equals("loca")) {
+ System.arraycopy(newLocaTableOut, 0, outFont, fontPtr, newLocaTableOut.length);
+ fontPtr += newLocaTableOut.length;
+ newLocaTableOut = null;
+ }
+ else {
+ rf.seek(tableLocation[TABLE_OFFSET]);
+ rf.readFully(outFont, fontPtr, tableLocation[TABLE_LENGTH]);
+ fontPtr += (tableLocation[TABLE_LENGTH] + 3) & (~3);
+ }
+ }
+ }
+
+ protected void createTableDirectory() throws IOException, DocumentException {
+ tableDirectory = new HashMap();
+ rf.seek(directoryOffset);
+ int id = rf.readInt();
+ if (id != 0x00010000)
+ throw new DocumentException(fileName + " is not a true type file.");
+ int num_tables = rf.readUnsignedShort();
+ rf.skipBytes(6);
+ for (int k = 0; k < num_tables; ++k) {
+ String tag = readStandardString(4);
+ int tableLocation[] = new int[3];
+ tableLocation[TABLE_CHECKSUM] = rf.readInt();
+ tableLocation[TABLE_OFFSET] = rf.readInt();
+ tableLocation[TABLE_LENGTH] = rf.readInt();
+ tableDirectory.put(tag, tableLocation);
+ }
+ }
+
+ protected void readLoca() throws IOException, DocumentException {
+ int tableLocation[];
+ tableLocation = (int[])tableDirectory.get("head");
+ if (tableLocation == null)
+ throw new DocumentException("Table 'head' does not exist in " + fileName);
+ rf.seek(tableLocation[TABLE_OFFSET] + HEAD_LOCA_FORMAT_OFFSET);
+ locaShortTable = (rf.readUnsignedShort() == 0);
+ tableLocation = (int[])tableDirectory.get("loca");
+ if (tableLocation == null)
+ throw new DocumentException("Table 'loca' does not exist in " + fileName);
+ rf.seek(tableLocation[TABLE_OFFSET]);
+ if (locaShortTable) {
+ int entries = tableLocation[TABLE_LENGTH] / 2;
+ locaTable = new int[entries];
+ for (int k = 0; k < entries; ++k)
+ locaTable[k] = rf.readUnsignedShort() * 2;
+ }
+ else {
+ int entries = tableLocation[TABLE_LENGTH] / 4;
+ locaTable = new int[entries];
+ for (int k = 0; k < entries; ++k)
+ locaTable[k] = rf.readInt();
+ }
+ }
+
+ protected void createNewGlyphTables() throws IOException {
+ newLocaTable = new int[locaTable.length];
+ int activeGlyphs[] = new int[glyphsInList.size()];
+ for (int k = 0; k < activeGlyphs.length; ++k)
+ activeGlyphs[k] = ((Integer)glyphsInList.get(k)).intValue();
+ Arrays.sort(activeGlyphs);
+ int glyfSize = 0;
+ for (int k = 0; k < activeGlyphs.length; ++k) {
+ int glyph = activeGlyphs[k];
+ glyfSize += locaTable[glyph + 1] - locaTable[glyph];
+ }
+ glyfTableRealSize = glyfSize;
+ glyfSize = (glyfSize + 3) & (~3);
+ newGlyfTable = new byte[glyfSize];
+ int glyfPtr = 0;
+ int listGlyf = 0;
+ for (int k = 0; k < newLocaTable.length; ++k) {
+ newLocaTable[k] = glyfPtr;
+ if (listGlyf < activeGlyphs.length && activeGlyphs[listGlyf] == k) {
+ ++listGlyf;
+ newLocaTable[k] = glyfPtr;
+ int start = locaTable[k];
+ int len = locaTable[k + 1] - start;
+ if (len > 0) {
+ rf.seek(tableGlyphOffset + start);
+ rf.readFully(newGlyfTable, glyfPtr, len);
+ glyfPtr += len;
+ }
+ }
+ }
+ }
+
+ protected void locaTobytes() {
+ if (locaShortTable)
+ locaTableRealSize = newLocaTable.length * 2;
+ else
+ locaTableRealSize = newLocaTable.length * 4;
+ newLocaTableOut = new byte[(locaTableRealSize + 3) & (~3)];
+ outFont = newLocaTableOut;
+ fontPtr = 0;
+ for (int k = 0; k < newLocaTable.length; ++k) {
+ if (locaShortTable)
+ writeFontShort(newLocaTable[k] / 2);
+ else
+ writeFontInt(newLocaTable[k]);
+ }
+
+ }
+
+ protected void flatGlyphs() throws IOException, DocumentException {
+ int tableLocation[];
+ tableLocation = (int[])tableDirectory.get("glyf");
+ if (tableLocation == null)
+ throw new DocumentException("Table 'glyf' does not exist in " + fileName);
+ Integer glyph0 = new Integer(0);
+ if (!glyphsUsed.containsKey(glyph0)) {
+ glyphsUsed.put(glyph0, null);
+ glyphsInList.add(glyph0);
+ }
+ tableGlyphOffset = tableLocation[TABLE_OFFSET];
+ for (int k = 0; k < glyphsInList.size(); ++k) {
+ int glyph = ((Integer)glyphsInList.get(k)).intValue();
+ checkGlyphComposite(glyph);
+ }
+ }
+
+ protected void checkGlyphComposite(int glyph) throws IOException {
+ int start = locaTable[glyph];
+ if (start == locaTable[glyph + 1]) // no contour
+ return;
+ rf.seek(tableGlyphOffset + start);
+ int numContours = rf.readShort();
+ if (numContours >= 0)
+ return;
+ rf.skipBytes(8);
+ for(;;) {
+ int flags = rf.readUnsignedShort();
+ Integer cGlyph = new Integer(rf.readUnsignedShort());
+ if (!glyphsUsed.containsKey(cGlyph)) {
+ glyphsUsed.put(cGlyph, null);
+ glyphsInList.add(cGlyph);
+ }
+ if ((flags & MORE_COMPONENTS) == 0)
+ return;
+ int skip;
+ if ((flags & ARG_1_AND_2_ARE_WORDS) != 0)
+ skip = 4;
+ else
+ skip = 2;
+ if ((flags & WE_HAVE_A_SCALE) != 0)
+ skip += 2;
+ else if ((flags & WE_HAVE_AN_X_AND_Y_SCALE) != 0)
+ skip += 4;
+ if ((flags & WE_HAVE_A_TWO_BY_TWO) != 0)
+ skip += 8;
+ rf.skipBytes(skip);
+ }
+ }
+
+ /** Reads a <CODE>String</CODE> from the font file as bytes using the Cp1252
+ * encoding.
+ * @param length the length of bytes to read
+ * @return the <CODE>String</CODE> read
+ * @throws IOException the font file could not be read
+ */
+ protected String readStandardString(int length) throws IOException {
+ byte buf[] = new byte[length];
+ rf.readFully(buf);
+ try {
+ return new String(buf, BaseFont.WINANSI);
+ }
+ catch (Exception e) {
+ throw new ExceptionConverter(e);
+ }
+ }
+
+ protected void writeFontShort(int n) {
+ outFont[fontPtr++] = (byte)(n >> 8);
+ outFont[fontPtr++] = (byte)(n);
+ }
+
+ protected void writeFontInt(int n) {
+ outFont[fontPtr++] = (byte)(n >> 24);
+ outFont[fontPtr++] = (byte)(n >> 16);
+ outFont[fontPtr++] = (byte)(n >> 8);
+ outFont[fontPtr++] = (byte)(n);
+ }
+
+ protected void writeFontString(String s) {
+ byte b[] = PdfEncodings.convertToBytes(s, BaseFont.WINANSI);
+ System.arraycopy(b, 0, outFont, fontPtr, b.length);
+ fontPtr += b.length;
+ }
+
+ protected int calculateChecksum(byte b[]) {
+ int len = b.length / 4;
+ int v0 = 0;
+ int v1 = 0;
+ int v2 = 0;
+ int v3 = 0;
+ int ptr = 0;
+ for (int k = 0; k < len; ++k) {
+ v3 += (int)b[ptr++] & 0xff;
+ v2 += (int)b[ptr++] & 0xff;
+ v1 += (int)b[ptr++] & 0xff;
+ v0 += (int)b[ptr++] & 0xff;
+ }
+ return v0 + (v1 << 8) + (v2 << 16) + (v3 << 24);
+ }
+}
diff --git a/src/main/java/com/lowagie/text/pdf/TrueTypeFontUnicode.java b/src/main/java/com/lowagie/text/pdf/TrueTypeFontUnicode.java
new file mode 100644
index 0000000..a05f744
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/TrueTypeFontUnicode.java
@@ -0,0 +1,456 @@
+/*
+ * $Id: TrueTypeFontUnicode.java,v 1.53 2006/02/23 16:45:48 psoares33 Exp $
+ * $Name: $
+ *
+ * Copyright 2001, 2002 Paulo Soares
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf;
+
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.ArrayList;
+
+import com.lowagie.text.DocumentException;
+/** Represents a True Type font with Unicode encoding. All the character
+ * in the font can be used directly by using the encoding Identity-H or
+ * Identity-V. This is the only way to represent some character sets such
+ * as Thai.
+ * @author Paulo Soares (psoares@consiste.pt)
+ */
+class TrueTypeFontUnicode extends TrueTypeFont implements Comparator{
+
+ /** <CODE>true</CODE> if the encoding is vertical.
+ */
+ boolean vertical = false;
+
+ /** Creates a new TrueType font addressed by Unicode characters. The font
+ * will always be embedded.
+ * @param ttFile the location of the font on file. The file must end in '.ttf'.
+ * The modifiers after the name are ignored.
+ * @param enc the encoding to be applied to this font
+ * @param emb true if the font is to be embedded in the PDF
+ * @param ttfAfm the font as a <CODE>byte</CODE> array
+ * @throws DocumentException the font is invalid
+ * @throws IOException the font file could not be read
+ */
+ TrueTypeFontUnicode(String ttFile, String enc, boolean emb, byte ttfAfm[]) throws DocumentException, IOException {
+ String nameBase = getBaseName(ttFile);
+ String ttcName = getTTCName(nameBase);
+ if (nameBase.length() < ttFile.length()) {
+ style = ttFile.substring(nameBase.length());
+ }
+ encoding = enc;
+ embedded = emb;
+ fileName = ttcName;
+ ttcIndex = "";
+ if (ttcName.length() < nameBase.length())
+ ttcIndex = nameBase.substring(ttcName.length() + 1);
+ fontType = FONT_TYPE_TTUNI;
+ if ((fileName.toLowerCase().endsWith(".ttf") || fileName.toLowerCase().endsWith(".otf") || fileName.toLowerCase().endsWith(".ttc")) && ((enc.equals(IDENTITY_H) || enc.equals(IDENTITY_V)) && emb)) {
+ process(ttfAfm);
+ if (os_2.fsType == 2)
+ throw new DocumentException(fileName + style + " cannot be embedded due to licensing restrictions.");
+ // Sivan
+ if ((cmap31 == null && !fontSpecific) || (cmap10 == null && fontSpecific))
+ directTextToByte=true;
+ //throw new DocumentException(fileName + " " + style + " does not contain an usable cmap.");
+ if (fontSpecific) {
+ fontSpecific = false;
+ String tempEncoding = encoding;
+ encoding = "";
+ createEncoding();
+ encoding = tempEncoding;
+ fontSpecific = true;
+ }
+ }
+ else
+ throw new DocumentException(fileName + " " + style + " is not a TTF font file.");
+ vertical = enc.endsWith("V");
+ }
+
+/**
+ * Gets the width of a <CODE>String</CODE> in normalized 1000 units.
+ * @param text the <CODE>String</CODE> to get the witdth of
+ * @return the width in normalized 1000 units
+ */
+ public int getWidth(String text)
+ {
+ if (vertical)
+ return text.length() * 1000;
+ int total = 0;
+ if (fontSpecific) {
+ char cc[] = text.toCharArray();
+ int len = cc.length;
+ for (int k = 0; k < len; ++k) {
+ char c = cc[k];
+ if ((c & 0xff00) == 0 || (c & 0xff00) == 0xf000)
+ total += getRawWidth(c & 0xff, null);
+ }
+ }
+ else {
+ int len = text.length();
+ for (int k = 0; k < len; ++k)
+ total += getRawWidth(text.charAt(k), encoding);
+ }
+ return total;
+ }
+
+ /** Creates a ToUnicode CMap to allow copy and paste from Acrobat.
+ * @param metrics metrics[0] contains the glyph index and metrics[2]
+ * contains the Unicode code
+ * @throws DocumentException on error
+ * @return the stream representing this CMap or <CODE>null</CODE>
+ */
+ private PdfStream getToUnicode(Object metrics[]) throws DocumentException {
+ if (metrics.length == 0)
+ return null;
+ StringBuffer buf = new StringBuffer(
+ "/CIDInit /ProcSet findresource begin\n" +
+ "12 dict begin\n" +
+ "begincmap\n" +
+ "/CIDSystemInfo\n" +
+ "<< /Registry (Adobe)\n" +
+ "/Ordering (UCS)\n" +
+ "/Supplement 0\n" +
+ ">> def\n" +
+ "/CMapName /Adobe-Identity-UCS def\n" +
+ "/CMapType 2 def\n" +
+ "1 begincodespacerange\n" +
+ "<0000><FFFF>\n" +
+ "endcodespacerange\n");
+ int size = 0;
+ for (int k = 0; k < metrics.length; ++k) {
+ if (size == 0) {
+ if (k != 0) {
+ buf.append("endbfrange\n");
+ }
+ size = Math.min(100, metrics.length - k);
+ buf.append(size).append(" beginbfrange\n");
+ }
+ --size;
+ int metric[] = (int[])metrics[k];
+ String fromTo = toHex(metric[0]);
+ buf.append(fromTo).append(fromTo).append(toHex(metric[2])).append("\n");
+ }
+ buf.append(
+ "endbfrange\n" +
+ "endcmap\n" +
+ "CMapName currentdict /CMap defineresource pop\n" +
+ "end end\n");
+ String s = buf.toString();
+ PdfStream stream = new PdfStream(PdfEncodings.convertToBytes(s, null));
+ stream.flateCompress();
+ return stream;
+ }
+
+ /** Gets an hex string in the format "&lt;HHHH&gt;".
+ * @param n the number
+ * @return the hex string
+ */
+ static String toHex(int n) {
+ String s = Integer.toHexString(n);
+ return "<0000".substring(0, 5 - s.length()) + s + ">";
+ }
+
+ /** Generates the CIDFontTyte2 dictionary.
+ * @param fontDescriptor the indirect reference to the font descriptor
+ * @param subsetPrefix the subset prefix
+ * @param metrics the horizontal width metrics
+ * @return a stream
+ */
+ private PdfDictionary getCIDFontType2(PdfIndirectReference fontDescriptor, String subsetPrefix, Object metrics[]) {
+ PdfDictionary dic = new PdfDictionary(PdfName.FONT);
+ // sivan; cff
+ if (cff) {
+ dic.put(PdfName.SUBTYPE, PdfName.CIDFONTTYPE0);
+ dic.put(PdfName.BASEFONT, new PdfName(subsetPrefix+fontName+"-"+encoding));
+ }
+ else {
+ dic.put(PdfName.SUBTYPE, PdfName.CIDFONTTYPE2);
+ dic.put(PdfName.BASEFONT, new PdfName(subsetPrefix + fontName));
+ }
+ dic.put(PdfName.FONTDESCRIPTOR, fontDescriptor);
+ if (!cff)
+ dic.put(PdfName.CIDTOGIDMAP,PdfName.IDENTITY);
+ PdfDictionary cdic = new PdfDictionary();
+ cdic.put(PdfName.REGISTRY, new PdfString("Adobe"));
+ cdic.put(PdfName.ORDERING, new PdfString("Identity"));
+ cdic.put(PdfName.SUPPLEMENT, new PdfNumber(0));
+ dic.put(PdfName.CIDSYSTEMINFO, cdic);
+ if (!vertical) {
+ dic.put(PdfName.DW, new PdfNumber(1000));
+ StringBuffer buf = new StringBuffer("[");
+ int lastNumber = -10;
+ boolean firstTime = true;
+ for (int k = 0; k < metrics.length; ++k) {
+ int metric[] = (int[])metrics[k];
+ if (metric[1] == 1000)
+ continue;
+ int m = metric[0];
+ if (m == lastNumber + 1) {
+ buf.append(" ").append(metric[1]);
+ }
+ else {
+ if (!firstTime) {
+ buf.append("]");
+ }
+ firstTime = false;
+ buf.append(m).append("[").append(metric[1]);
+ }
+ lastNumber = m;
+ }
+ if (buf.length() > 1) {
+ buf.append("]]");
+ dic.put(PdfName.W, new PdfLiteral(buf.toString()));
+ }
+ }
+ return dic;
+ }
+
+ /** Generates the font dictionary.
+ * @param descendant the descendant dictionary
+ * @param subsetPrefix the subset prefix
+ * @param toUnicode the ToUnicode stream
+ * @return the stream
+ */
+ private PdfDictionary getFontBaseType(PdfIndirectReference descendant, String subsetPrefix, PdfIndirectReference toUnicode) {
+ PdfDictionary dic = new PdfDictionary(PdfName.FONT);
+
+ dic.put(PdfName.SUBTYPE, PdfName.TYPE0);
+ // The PDF Reference manual advises to add -encoding to CID font names
+ if (cff)
+ dic.put(PdfName.BASEFONT, new PdfName(subsetPrefix+fontName+"-"+encoding));
+ //dic.put(PdfName.BASEFONT, new PdfName(subsetPrefix+fontName));
+ else
+ dic.put(PdfName.BASEFONT, new PdfName(subsetPrefix + fontName));
+ //dic.put(PdfName.BASEFONT, new PdfName(fontName));
+ dic.put(PdfName.ENCODING, new PdfName(encoding));
+ dic.put(PdfName.DESCENDANTFONTS, new PdfArray(descendant));
+ if (toUnicode != null)
+ dic.put(PdfName.TOUNICODE, toUnicode);
+ return dic;
+ }
+
+ /** The method used to sort the metrics array.
+ * @param o1 the first element
+ * @param o2 the second element
+ * @return the comparisation
+ */
+ public int compare(Object o1, Object o2) {
+ int m1 = ((int[])o1)[0];
+ int m2 = ((int[])o2)[0];
+ if (m1 < m2)
+ return -1;
+ if (m1 == m2)
+ return 0;
+ return 1;
+ }
+
+ /** Outputs to the writer the font dictionaries and streams.
+ * @param writer the writer for this document
+ * @param ref the font indirect reference
+ * @param params several parameters that depend on the font type
+ * @throws IOException on error
+ * @throws DocumentException error in generating the object
+ */
+ void writeFont(PdfWriter writer, PdfIndirectReference ref, Object params[]) throws DocumentException, IOException {
+ HashMap longTag = (HashMap)params[0];
+ addRangeUni(longTag, true, subset);
+ Object metrics[] = longTag.values().toArray();
+ Arrays.sort(metrics, this);
+ PdfIndirectReference ind_font = null;
+ PdfObject pobj = null;
+ PdfIndirectObject obj = null;
+ // sivan: cff
+ if (cff) {
+ RandomAccessFileOrArray rf2 = new RandomAccessFileOrArray(rf);
+ byte b[] = new byte[cffLength];
+ try {
+ rf2.reOpen();
+ rf2.seek(cffOffset);
+ rf2.readFully(b);
+ } finally {
+ try {
+ rf2.close();
+ } catch (Exception e) {
+ // empty on purpose
+ }
+ }
+ if (subset || subsetRanges != null) {
+ CFFFontSubset cff = new CFFFontSubset(new RandomAccessFileOrArray(b),longTag);
+ b = cff.Process( (cff.getNames())[0] );
+ }
+ pobj = new StreamFont(b, "CIDFontType0C");
+ obj = writer.addToBody(pobj);
+ ind_font = obj.getIndirectReference();
+ } else {
+ byte[] b;
+ if (subset || directoryOffset != 0) {
+ TrueTypeFontSubSet sb = new TrueTypeFontSubSet(fileName, new RandomAccessFileOrArray(rf), longTag, directoryOffset, false, false);
+ b = sb.process();
+ }
+ else {
+ b = getFullFont();
+ }
+ int lengths[] = new int[]{b.length};
+ pobj = new StreamFont(b, lengths);
+ obj = writer.addToBody(pobj);
+ ind_font = obj.getIndirectReference();
+ }
+ String subsetPrefix = "";
+ if (subset)
+ subsetPrefix = createSubsetPrefix();
+ PdfDictionary dic = getFontDescriptor(ind_font, subsetPrefix);
+ obj = writer.addToBody(dic);
+ ind_font = obj.getIndirectReference();
+
+ pobj = getCIDFontType2(ind_font, subsetPrefix, metrics);
+ obj = writer.addToBody(pobj);
+ ind_font = obj.getIndirectReference();
+
+ pobj = getToUnicode(metrics);
+ PdfIndirectReference toUnicodeRef = null;
+
+ if (pobj != null) {
+ obj = writer.addToBody(pobj);
+ toUnicodeRef = obj.getIndirectReference();
+ }
+
+ pobj = getFontBaseType(ind_font, subsetPrefix, toUnicodeRef);
+ writer.addToBody(pobj, ref);
+ }
+
+ /** A forbidden operation. Will throw a null pointer exception.
+ * @param text the text
+ * @return always <CODE>null</CODE>
+ */
+ byte[] convertToBytes(String text)
+ {
+ return null;
+ }
+
+ /**
+ * Checks if a character exists in this font.
+ * @param c the character to check
+ * @return <CODE>true</CODE> if the character has a glyph,
+ * <CODE>false</CODE> otherwise
+ */
+ public boolean charExists(char c) {
+ HashMap map = null;
+ if (fontSpecific)
+ map = cmap10;
+ else
+ map = cmap31;
+ if (map == null)
+ return false;
+ if (fontSpecific) {
+ if ((c & 0xff00) == 0 || (c & 0xff00) == 0xf000)
+ return map.get(new Integer(c & 0xff)) != null;
+ else
+ return false;
+ }
+ else
+ return map.get(new Integer(c)) != null;
+ }
+
+ /**
+ * Sets the character advance.
+ * @param c the character
+ * @param advance the character advance normalized to 1000 units
+ * @return <CODE>true</CODE> if the advance was set,
+ * <CODE>false</CODE> otherwise
+ */
+ public boolean setCharAdvance(char c, int advance) {
+ HashMap map = null;
+ if (fontSpecific)
+ map = cmap10;
+ else
+ map = cmap31;
+ if (map == null)
+ return false;
+ int m[] = null;
+ if (fontSpecific) {
+ if ((c & 0xff00) == 0 || (c & 0xff00) == 0xf000)
+ m = (int[])map.get(new Integer(c & 0xff));
+ else
+ return false;
+ }
+ else
+ m = (int[])map.get(new Integer(c));
+ if (m == null)
+ return false;
+ else
+ m[1] = advance;
+ return true;
+ }
+
+ public int[] getCharBBox(char c) {
+ if (bboxes == null)
+ return null;
+ HashMap map = null;
+ if (fontSpecific)
+ map = cmap10;
+ else
+ map = cmap31;
+ if (map == null)
+ return null;
+ int m[] = null;
+ if (fontSpecific) {
+ if ((c & 0xff00) == 0 || (c & 0xff00) == 0xf000)
+ m = (int[])map.get(new Integer(c & 0xff));
+ else
+ return null;
+ }
+ else
+ m = (int[])map.get(new Integer(c));
+ if (m == null)
+ return null;
+ return bboxes[m[0]];
+ }
+}
diff --git a/src/main/java/com/lowagie/text/pdf/Type1Font.java b/src/main/java/com/lowagie/text/pdf/Type1Font.java
new file mode 100644
index 0000000..d73ce61
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/Type1Font.java
@@ -0,0 +1,807 @@
+/*
+ * $Id: Type1Font.java,v 1.65 2006/02/23 16:45:49 psoares33 Exp $
+ * $Name: $
+ *
+ * Copyright 2001, 2002 Paulo Soares
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf;
+
+import com.lowagie.text.DocumentException;
+import java.util.HashMap;
+import java.util.StringTokenizer;
+import com.lowagie.text.pdf.fonts.FontsResourceAnchor;
+import java.io.*;
+
+/** Reads a Type1 font
+ *
+ * @author Paulo Soares (psoares@consiste.pt)
+ */
+class Type1Font extends BaseFont
+{
+ private static FontsResourceAnchor resourceAnchor;
+
+ /** The PFB file if the input was made with a <CODE>byte</CODE> array.
+ */
+ protected byte pfb[];
+/** The Postscript font name.
+ */
+ private String FontName;
+/** The full name of the font.
+ */
+ private String FullName;
+/** The family name of the font.
+ */
+ private String FamilyName;
+/** The weight of the font: normal, bold, etc.
+ */
+ private String Weight = "";
+/** The italic angle of the font, usually 0.0 or negative.
+ */
+ private float ItalicAngle = 0.0f;
+/** <CODE>true</CODE> if all the characters have the same
+ * width.
+ */
+ private boolean IsFixedPitch = false;
+/** The character set of the font.
+ */
+ private String CharacterSet;
+/** The llx of the FontBox.
+ */
+ private int llx = -50;
+/** The lly of the FontBox.
+ */
+ private int lly = -200;
+/** The lurx of the FontBox.
+ */
+ private int urx = 1000;
+/** The ury of the FontBox.
+ */
+ private int ury = 900;
+/** The underline position.
+ */
+ private int UnderlinePosition = -100;
+/** The underline thickness.
+ */
+ private int UnderlineThickness = 50;
+/** The font's encoding name. This encoding is 'StandardEncoding' or
+ * 'AdobeStandardEncoding' for a font that can be totally encoded
+ * according to the characters names. For all other names the
+ * font is treated as symbolic.
+ */
+ private String EncodingScheme = "FontSpecific";
+/** A variable.
+ */
+ private int CapHeight = 700;
+/** A variable.
+ */
+ private int XHeight = 480;
+/** A variable.
+ */
+ private int Ascender = 800;
+/** A variable.
+ */
+ private int Descender = -200;
+/** A variable.
+ */
+ private int StdHW;
+/** A variable.
+ */
+ private int StdVW = 80;
+
+/** Represents the section CharMetrics in the AFM file. Each
+ * value of this array contains a <CODE>Object[4]</CODE> with an
+ * Integer, Integer, String and int[]. This is the code, width, name and char bbox.
+ * The key is the name of the char and also an Integer with the char number.
+ */
+ private HashMap CharMetrics = new HashMap();
+/** Represents the section KernPairs in the AFM file. The key is
+ * the name of the first character and the value is a <CODE>Object[]</CODE>
+ * with 2 elements for each kern pair. Position 0 is the name of
+ * the second character and position 1 is the kerning distance. This is
+ * repeated for all the pairs.
+ */
+ private HashMap KernPairs = new HashMap();
+/** The file in use.
+ */
+ private String fileName;
+/** <CODE>true</CODE> if this font is one of the 14 built in fonts.
+ */
+ private boolean builtinFont = false;
+/** Types of records in a PFB file. ASCII is 1 and BINARY is 2.
+ * They have to appear in the PFB file in this sequence.
+ */
+ private static final int pfbTypes[] = {1, 2, 1};
+
+ /** Creates a new Type1 font.
+ * @param ttfAfm the AFM file if the input is made with a <CODE>byte</CODE> array
+ * @param pfb the PFB file if the input is made with a <CODE>byte</CODE> array
+ * @param afmFile the name of one of the 14 built-in fonts or the location of an AFM file. The file must end in '.afm'
+ * @param enc the encoding to be applied to this font
+ * @param emb true if the font is to be embedded in the PDF
+ * @throws DocumentException the AFM file is invalid
+ * @throws IOException the AFM file could not be read
+ */
+ Type1Font(String afmFile, String enc, boolean emb, byte ttfAfm[], byte pfb[]) throws DocumentException, IOException
+ {
+ if (emb && ttfAfm != null && pfb == null)
+ throw new DocumentException("Two byte arrays are needed if the Type1 font is embedded.");
+ if (emb && ttfAfm != null)
+ this.pfb = pfb;
+ encoding = enc;
+ embedded = emb;
+ fileName = afmFile;
+ fontType = FONT_TYPE_T1;
+ RandomAccessFileOrArray rf = null;
+ InputStream is = null;
+ if (BuiltinFonts14.containsKey(afmFile)) {
+ embedded = false;
+ builtinFont = true;
+ byte buf[] = new byte[1024];
+ try {
+ if (resourceAnchor == null)
+ resourceAnchor = new FontsResourceAnchor();
+ is = getResourceStream(RESOURCE_PATH + afmFile + ".afm", resourceAnchor.getClass().getClassLoader());
+ if (is == null) {
+ String msg = afmFile + " not found as resource. (The *.afm files must exist as resources in the package com.lowagie.text.pdf.fonts)";
+ System.err.println(msg);
+ throw new DocumentException(msg);
+ }
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ while (true) {
+ int size = is.read(buf);
+ if (size < 0)
+ break;
+ out.write(buf, 0, size);
+ }
+ buf = out.toByteArray();
+ }
+ finally {
+ if (is != null) {
+ try {
+ is.close();
+ }
+ catch (Exception e) {
+ // empty on purpose
+ }
+ }
+ }
+ try {
+ rf = new RandomAccessFileOrArray(buf);
+ process(rf);
+ }
+ finally {
+ if (rf != null) {
+ try {
+ rf.close();
+ }
+ catch (Exception e) {
+ // empty on purpose
+ }
+ }
+ }
+ }
+ else if (afmFile.toLowerCase().endsWith(".afm")) {
+ try {
+ if (ttfAfm == null)
+ rf = new RandomAccessFileOrArray(afmFile);
+ else
+ rf = new RandomAccessFileOrArray(ttfAfm);
+ process(rf);
+ }
+ finally {
+ if (rf != null) {
+ try {
+ rf.close();
+ }
+ catch (Exception e) {
+ // empty on purpose
+ }
+ }
+ }
+ }
+ else if (afmFile.toLowerCase().endsWith(".pfm")) {
+ try {
+ ByteArrayOutputStream ba = new ByteArrayOutputStream();
+ if (ttfAfm == null)
+ rf = new RandomAccessFileOrArray(afmFile);
+ else
+ rf = new RandomAccessFileOrArray(ttfAfm);
+ Pfm2afm.convert(rf, ba);
+ rf.close();
+ rf = new RandomAccessFileOrArray(ba.toByteArray());
+ process(rf);
+ }
+ finally {
+ if (rf != null) {
+ try {
+ rf.close();
+ }
+ catch (Exception e) {
+ // empty on purpose
+ }
+ }
+ }
+ }
+ else
+ throw new DocumentException(afmFile + " is not an AFM or PFM font file.");
+ try {
+ EncodingScheme = EncodingScheme.trim();
+ if (EncodingScheme.equals("AdobeStandardEncoding") || EncodingScheme.equals("StandardEncoding")) {
+ fontSpecific = false;
+ }
+ PdfEncodings.convertToBytes(" ", enc); // check if the encoding exists
+ createEncoding();
+ }
+ catch (RuntimeException re) {
+ throw re;
+ }
+ catch (Exception e) {
+ throw new DocumentException(e);
+ }
+ }
+
+/** Gets the width from the font according to the <CODE>name</CODE> or,
+ * if the <CODE>name</CODE> is null, meaning it is a symbolic font,
+ * the char <CODE>c</CODE>.
+ * @param c the char if the font is symbolic
+ * @param name the glyph name
+ * @return the width of the char
+ */
+ int getRawWidth(int c, String name) {
+ Object metrics[];
+ if (name == null) { // font specific
+ metrics = (Object[])CharMetrics.get(new Integer(c));
+ }
+ else {
+ if (name.equals(".notdef"))
+ return 0;
+ metrics = (Object[])CharMetrics.get(name);
+ }
+ if (metrics != null)
+ return ((Integer)(metrics[1])).intValue();
+ return 0;
+ }
+
+/** Gets the kerning between two Unicode characters. The characters
+ * are converted to names and this names are used to find the kerning
+ * pairs in the <CODE>HashMap</CODE> <CODE>KernPairs</CODE>.
+ * @param char1 the first char
+ * @param char2 the second char
+ * @return the kerning to be applied
+ */
+ public int getKerning(char char1, char char2)
+ {
+ String first = GlyphList.unicodeToName((int)char1);
+ if (first == null)
+ return 0;
+ String second = GlyphList.unicodeToName((int)char2);
+ if (second == null)
+ return 0;
+ Object obj[] = (Object[])KernPairs.get(first);
+ if (obj == null)
+ return 0;
+ for (int k = 0; k < obj.length; k += 2) {
+ if (second.equals(obj[k]))
+ return ((Integer)obj[k + 1]).intValue();
+ }
+ return 0;
+ }
+
+
+ /** Reads the font metrics
+ * @param rf the AFM file
+ * @throws DocumentException the AFM file is invalid
+ * @throws IOException the AFM file could not be read
+ */
+ public void process(RandomAccessFileOrArray rf) throws DocumentException, IOException
+ {
+ String line;
+ boolean isMetrics = false;
+ while ((line = rf.readLine()) != null)
+ {
+ StringTokenizer tok = new StringTokenizer(line);
+ if (!tok.hasMoreTokens())
+ continue;
+ String ident = tok.nextToken();
+ if (ident.equals("FontName"))
+ FontName = tok.nextToken("\u00ff").substring(1);
+ else if (ident.equals("FullName"))
+ FullName = tok.nextToken("\u00ff").substring(1);
+ else if (ident.equals("FamilyName"))
+ FamilyName = tok.nextToken("\u00ff").substring(1);
+ else if (ident.equals("Weight"))
+ Weight = tok.nextToken("\u00ff").substring(1);
+ else if (ident.equals("ItalicAngle"))
+ ItalicAngle = Float.valueOf(tok.nextToken()).floatValue();
+ else if (ident.equals("IsFixedPitch"))
+ IsFixedPitch = tok.nextToken().equals("true");
+ else if (ident.equals("CharacterSet"))
+ CharacterSet = tok.nextToken("\u00ff").substring(1);
+ else if (ident.equals("FontBBox"))
+ {
+ llx = (int)Float.valueOf(tok.nextToken()).floatValue();
+ lly = (int)Float.valueOf(tok.nextToken()).floatValue();
+ urx = (int)Float.valueOf(tok.nextToken()).floatValue();
+ ury = (int)Float.valueOf(tok.nextToken()).floatValue();
+ }
+ else if (ident.equals("UnderlinePosition"))
+ UnderlinePosition = (int)Float.valueOf(tok.nextToken()).floatValue();
+ else if (ident.equals("UnderlineThickness"))
+ UnderlineThickness = (int)Float.valueOf(tok.nextToken()).floatValue();
+ else if (ident.equals("EncodingScheme"))
+ EncodingScheme = tok.nextToken("\u00ff").substring(1);
+ else if (ident.equals("CapHeight"))
+ CapHeight = (int)Float.valueOf(tok.nextToken()).floatValue();
+ else if (ident.equals("XHeight"))
+ XHeight = (int)Float.valueOf(tok.nextToken()).floatValue();
+ else if (ident.equals("Ascender"))
+ Ascender = (int)Float.valueOf(tok.nextToken()).floatValue();
+ else if (ident.equals("Descender"))
+ Descender = (int)Float.valueOf(tok.nextToken()).floatValue();
+ else if (ident.equals("StdHW"))
+ StdHW = (int)Float.valueOf(tok.nextToken()).floatValue();
+ else if (ident.equals("StdVW"))
+ StdVW = (int)Float.valueOf(tok.nextToken()).floatValue();
+ else if (ident.equals("StartCharMetrics"))
+ {
+ isMetrics = true;
+ break;
+ }
+ }
+ if (!isMetrics)
+ throw new DocumentException("Missing StartCharMetrics in " + fileName);
+ while ((line = rf.readLine()) != null)
+ {
+ StringTokenizer tok = new StringTokenizer(line);
+ if (!tok.hasMoreTokens())
+ continue;
+ String ident = tok.nextToken();
+ if (ident.equals("EndCharMetrics"))
+ {
+ isMetrics = false;
+ break;
+ }
+ Integer C = new Integer(-1);
+ Integer WX = new Integer(250);
+ String N = "";
+ int B[] = null;
+
+ tok = new StringTokenizer(line, ";");
+ while (tok.hasMoreTokens())
+ {
+ StringTokenizer tokc = new StringTokenizer(tok.nextToken());
+ if (!tokc.hasMoreTokens())
+ continue;
+ ident = tokc.nextToken();
+ if (ident.equals("C"))
+ C = Integer.valueOf(tokc.nextToken());
+ else if (ident.equals("WX"))
+ WX = new Integer(Float.valueOf(tokc.nextToken()).intValue());
+ else if (ident.equals("N"))
+ N = tokc.nextToken();
+ else if (ident.equals("B")) {
+ B = new int[]{Integer.parseInt(tokc.nextToken()),
+ Integer.parseInt(tokc.nextToken()),
+ Integer.parseInt(tokc.nextToken()),
+ Integer.parseInt(tokc.nextToken())};
+ }
+ }
+ Object metrics[] = new Object[]{C, WX, N, B};
+ if (C.intValue() >= 0)
+ CharMetrics.put(C, metrics);
+ CharMetrics.put(N, metrics);
+ }
+ if (isMetrics)
+ throw new DocumentException("Missing EndCharMetrics in " + fileName);
+ while ((line = rf.readLine()) != null)
+ {
+ StringTokenizer tok = new StringTokenizer(line);
+ if (!tok.hasMoreTokens())
+ continue;
+ String ident = tok.nextToken();
+ if (ident.equals("EndFontMetrics"))
+ return;
+ if (ident.equals("StartKernPairs"))
+ {
+ isMetrics = true;
+ break;
+ }
+ }
+ if (!isMetrics)
+ throw new DocumentException("Missing EndFontMetrics in " + fileName);
+ while ((line = rf.readLine()) != null)
+ {
+ StringTokenizer tok = new StringTokenizer(line);
+ if (!tok.hasMoreTokens())
+ continue;
+ String ident = tok.nextToken();
+ if (ident.equals("KPX"))
+ {
+ String first = tok.nextToken();
+ String second = tok.nextToken();
+ Integer width = new Integer(Float.valueOf(tok.nextToken()).intValue());
+ Object relates[] = (Object[])KernPairs.get(first);
+ if (relates == null)
+ KernPairs.put(first, new Object[]{second, width});
+ else
+ {
+ int n = relates.length;
+ Object relates2[] = new Object[n + 2];
+ System.arraycopy(relates, 0, relates2, 0, n);
+ relates2[n] = second;
+ relates2[n + 1] = width;
+ KernPairs.put(first, relates2);
+ }
+ }
+ else if (ident.equals("EndKernPairs"))
+ {
+ isMetrics = false;
+ break;
+ }
+ }
+ if (isMetrics)
+ throw new DocumentException("Missing EndKernPairs in " + fileName);
+ rf.close();
+ }
+
+/** If the embedded flag is <CODE>false</CODE> or if the font is
+ * one of the 14 built in types, it returns <CODE>null</CODE>,
+ * otherwise the font is read and output in a PdfStream object.
+ * @return the PdfStream containing the font or <CODE>null</CODE>
+ * @throws DocumentException if there is an error reading the font
+ */
+ private PdfStream getFontStream() throws DocumentException
+ {
+ if (builtinFont || !embedded)
+ return null;
+ RandomAccessFileOrArray rf = null;
+ try {
+ String filePfb = fileName.substring(0, fileName.length() - 3) + "pfb";
+ if (pfb == null)
+ rf = new RandomAccessFileOrArray(filePfb);
+ else
+ rf = new RandomAccessFileOrArray(pfb);
+ int fileLength = rf.length();
+ byte st[] = new byte[fileLength - 18];
+ int lengths[] = new int[3];
+ int bytePtr = 0;
+ for (int k = 0; k < 3; ++k) {
+ if (rf.read() != 0x80)
+ throw new DocumentException("Start marker missing in " + filePfb);
+ if (rf.read() != pfbTypes[k])
+ throw new DocumentException("Incorrect segment type in " + filePfb);
+ int size = rf.read();
+ size += rf.read() << 8;
+ size += rf.read() << 16;
+ size += rf.read() << 24;
+ lengths[k] = size;
+ while (size != 0) {
+ int got = rf.read(st, bytePtr, size);
+ if (got < 0)
+ throw new DocumentException("Premature end in " + filePfb);
+ bytePtr += got;
+ size -= got;
+ }
+ }
+ return new StreamFont(st, lengths);
+ }
+ catch (Exception e) {
+ throw new DocumentException(e);
+ }
+ finally {
+ if (rf != null) {
+ try {
+ rf.close();
+ }
+ catch (Exception e) {
+ // empty on purpose
+ }
+ }
+ }
+ }
+
+/** Generates the font descriptor for this font or <CODE>null</CODE> if it is
+ * one of the 14 built in fonts.
+ * @param fontStream the indirect reference to a PdfStream containing the font or <CODE>null</CODE>
+ * @return the PdfDictionary containing the font descriptor or <CODE>null</CODE>
+ */
+ private PdfDictionary getFontDescriptor(PdfIndirectReference fontStream)
+ {
+ if (builtinFont)
+ return null;
+ PdfDictionary dic = new PdfDictionary(PdfName.FONTDESCRIPTOR);
+ dic.put(PdfName.ASCENT, new PdfNumber(Ascender));
+ dic.put(PdfName.CAPHEIGHT, new PdfNumber(CapHeight));
+ dic.put(PdfName.DESCENT, new PdfNumber(Descender));
+ dic.put(PdfName.FONTBBOX, new PdfRectangle(llx, lly, urx, ury));
+ dic.put(PdfName.FONTNAME, new PdfName(FontName));
+ dic.put(PdfName.ITALICANGLE, new PdfNumber(ItalicAngle));
+ dic.put(PdfName.STEMV, new PdfNumber(StdVW));
+ if (fontStream != null)
+ dic.put(PdfName.FONTFILE, fontStream);
+ int flags = 0;
+ if (IsFixedPitch)
+ flags |= 1;
+ flags |= fontSpecific ? 4 : 32;
+ if (ItalicAngle < 0)
+ flags |= 64;
+ if (FontName.indexOf("Caps") >= 0 || FontName.endsWith("SC"))
+ flags |= 131072;
+ if (Weight.equals("Bold"))
+ flags |= 262144;
+ dic.put(PdfName.FLAGS, new PdfNumber(flags));
+
+ return dic;
+ }
+
+ /** Generates the font dictionary for this font.
+ * @return the PdfDictionary containing the font dictionary
+ * @param firstChar the first valid character
+ * @param lastChar the last valid character
+ * @param shortTag a 256 bytes long <CODE>byte</CODE> array where each unused byte is represented by 0
+ * @param fontDescriptor the indirect reference to a PdfDictionary containing the font descriptor or <CODE>null</CODE>
+ */
+ private PdfDictionary getFontBaseType(PdfIndirectReference fontDescriptor, int firstChar, int lastChar, byte shortTag[])
+ {
+ PdfDictionary dic = new PdfDictionary(PdfName.FONT);
+ dic.put(PdfName.SUBTYPE, PdfName.TYPE1);
+ dic.put(PdfName.BASEFONT, new PdfName(FontName));
+ boolean stdEncoding = encoding.equals("Cp1252") || encoding.equals("MacRoman");
+ if (!fontSpecific) {
+ for (int k = firstChar; k <= lastChar; ++k) {
+ if (!differences[k].equals(notdef)) {
+ firstChar = k;
+ break;
+ }
+ }
+ if (stdEncoding)
+ dic.put(PdfName.ENCODING, encoding.equals("Cp1252") ? PdfName.WIN_ANSI_ENCODING : PdfName.MAC_ROMAN_ENCODING);
+ else {
+ PdfDictionary enc = new PdfDictionary(PdfName.ENCODING);
+ PdfArray dif = new PdfArray();
+ boolean gap = true;
+ for (int k = firstChar; k <= lastChar; ++k) {
+ if (shortTag[k] != 0) {
+ if (gap) {
+ dif.add(new PdfNumber(k));
+ gap = false;
+ }
+ dif.add(new PdfName(differences[k]));
+ }
+ else
+ gap = true;
+ }
+ enc.put(PdfName.DIFFERENCES, dif);
+ dic.put(PdfName.ENCODING, enc);
+ }
+ }
+ if (forceWidthsOutput || !(builtinFont && (fontSpecific || stdEncoding))) {
+ dic.put(PdfName.FIRSTCHAR, new PdfNumber(firstChar));
+ dic.put(PdfName.LASTCHAR, new PdfNumber(lastChar));
+ PdfArray wd = new PdfArray();
+ for (int k = firstChar; k <= lastChar; ++k) {
+ if (shortTag[k] == 0)
+ wd.add(new PdfNumber(0));
+ else
+ wd.add(new PdfNumber(widths[k]));
+ }
+ dic.put(PdfName.WIDTHS, wd);
+ }
+ if (!builtinFont && fontDescriptor != null)
+ dic.put(PdfName.FONTDESCRIPTOR, fontDescriptor);
+ return dic;
+ }
+
+ /** Outputs to the writer the font dictionaries and streams.
+ * @param writer the writer for this document
+ * @param ref the font indirect reference
+ * @param params several parameters that depend on the font type
+ * @throws IOException on error
+ * @throws DocumentException error in generating the object
+ */
+ void writeFont(PdfWriter writer, PdfIndirectReference ref, Object params[]) throws DocumentException, IOException {
+ int firstChar = ((Integer)params[0]).intValue();
+ int lastChar = ((Integer)params[1]).intValue();
+ byte shortTag[] = (byte[])params[2];
+ boolean subsetp = ((Boolean)params[3]).booleanValue() && subset;
+ if (!subsetp) {
+ firstChar = 0;
+ lastChar = shortTag.length - 1;
+ for (int k = 0; k < shortTag.length; ++k)
+ shortTag[k] = 1;
+ }
+ PdfIndirectReference ind_font = null;
+ PdfObject pobj = null;
+ PdfIndirectObject obj = null;
+ pobj = getFontStream();
+ if (pobj != null){
+ obj = writer.addToBody(pobj);
+ ind_font = obj.getIndirectReference();
+ }
+ pobj = getFontDescriptor(ind_font);
+ if (pobj != null){
+ obj = writer.addToBody(pobj);
+ ind_font = obj.getIndirectReference();
+ }
+ pobj = getFontBaseType(ind_font, firstChar, lastChar, shortTag);
+ writer.addToBody(pobj, ref);
+ }
+
+ /** Gets the font parameter identified by <CODE>key</CODE>. Valid values
+ * for <CODE>key</CODE> are <CODE>ASCENT</CODE>, <CODE>CAPHEIGHT</CODE>, <CODE>DESCENT</CODE>,
+ * <CODE>ITALICANGLE</CODE>, <CODE>BBOXLLX</CODE>, <CODE>BBOXLLY</CODE>, <CODE>BBOXURX</CODE>
+ * and <CODE>BBOXURY</CODE>.
+ * @param key the parameter to be extracted
+ * @param fontSize the font size in points
+ * @return the parameter in points
+ */
+ public float getFontDescriptor(int key, float fontSize) {
+ switch (key) {
+ case AWT_ASCENT:
+ case ASCENT:
+ return Ascender * fontSize / 1000;
+ case CAPHEIGHT:
+ return CapHeight * fontSize / 1000;
+ case AWT_DESCENT:
+ case DESCENT:
+ return Descender * fontSize / 1000;
+ case ITALICANGLE:
+ return ItalicAngle;
+ case BBOXLLX:
+ return llx * fontSize / 1000;
+ case BBOXLLY:
+ return lly * fontSize / 1000;
+ case BBOXURX:
+ return urx * fontSize / 1000;
+ case BBOXURY:
+ return ury * fontSize / 1000;
+ case AWT_LEADING:
+ return 0;
+ case AWT_MAXADVANCE:
+ return (urx - llx) * fontSize / 1000;
+ }
+ return 0;
+ }
+
+ /** Gets the postscript font name.
+ * @return the postscript font name
+ */
+ public String getPostscriptFontName() {
+ return FontName;
+ }
+
+ /** Gets the full name of the font. If it is a True Type font
+ * each array element will have {Platform ID, Platform Encoding ID,
+ * Language ID, font name}. The interpretation of this values can be
+ * found in the Open Type specification, chapter 2, in the 'name' table.<br>
+ * For the other fonts the array has a single element with {"", "", "",
+ * font name}.
+ * @return the full name of the font
+ */
+ public String[][] getFullFontName() {
+ return new String[][]{{"", "", "", FullName}};
+ }
+
+ /** Gets the family name of the font. If it is a True Type font
+ * each array element will have {Platform ID, Platform Encoding ID,
+ * Language ID, font name}. The interpretation of this values can be
+ * found in the Open Type specification, chapter 2, in the 'name' table.<br>
+ * For the other fonts the array has a single element with {"", "", "",
+ * font name}.
+ * @return the family name of the font
+ */
+ public String[][] getFamilyFontName() {
+ return new String[][]{{"", "", "", FamilyName}};
+ }
+
+ /** Checks if the font has any kerning pairs.
+ * @return <CODE>true</CODE> if the font has any kerning pairs
+ */
+ public boolean hasKernPairs() {
+ return KernPairs.size() > 0;
+ }
+
+ /**
+ * Sets the font name that will appear in the pdf font dictionary.
+ * Use with care as it can easily make a font unreadable if not embedded.
+ * @param name the new font name
+ */
+ public void setPostscriptFontName(String name) {
+ FontName = name;
+ }
+
+ /**
+ * Sets the kerning between two Unicode chars.
+ * @param char1 the first char
+ * @param char2 the second char
+ * @param kern the kerning to apply in normalized 1000 units
+ * @return <code>true</code> if the kerning was applied, <code>false</code> otherwise
+ */
+ public boolean setKerning(char char1, char char2, int kern) {
+ String first = GlyphList.unicodeToName((int)char1);
+ if (first == null)
+ return false;
+ String second = GlyphList.unicodeToName((int)char2);
+ if (second == null)
+ return false;
+ Object obj[] = (Object[])KernPairs.get(first);
+ if (obj == null) {
+ obj = new Object[]{second, new Integer(kern)};
+ KernPairs.put(first, obj);
+ return true;
+ }
+ for (int k = 0; k < obj.length; k += 2) {
+ if (second.equals(obj[k])) {
+ obj[k + 1] = new Integer(kern);
+ return true;
+ }
+ }
+ int size = obj.length;
+ Object obj2[] = new Object[size + 2];
+ System.arraycopy(obj, 0, obj2, 0, size);
+ obj2[size] = second;
+ obj2[size + 1] = new Integer(kern);
+ KernPairs.put(first, obj2);
+ return true;
+ }
+
+ protected int[] getRawCharBBox(int c, String name) {
+ Object metrics[];
+ if (name == null) { // font specific
+ metrics = (Object[])CharMetrics.get(new Integer(c));
+ }
+ else {
+ if (name.equals(".notdef"))
+ return null;
+ metrics = (Object[])CharMetrics.get(name);
+ }
+ if (metrics != null)
+ return ((int[])(metrics[3]));
+ return null;
+ }
+
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/pdf/Type3Font.java b/src/main/java/com/lowagie/text/pdf/Type3Font.java
new file mode 100644
index 0000000..f1d4e51
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/Type3Font.java
@@ -0,0 +1,306 @@
+/*
+ * Copyright 2005 by Paulo Soares.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf;
+
+import com.lowagie.text.DocumentException;
+import java.util.HashMap;
+import java.util.Iterator;
+
+/**
+ * A class to support Type3 fonts.
+ */
+public class Type3Font extends BaseFont {
+
+ private IntHashtable char2byte = new IntHashtable();
+ private IntHashtable widths3 = new IntHashtable();
+ private HashMap char2glyph = new HashMap();
+ private PdfWriter writer;
+ private float llx = Float.NaN, lly, urx, ury;
+ private PageResources pageResources = new PageResources();
+ private boolean colorized;
+
+ /**
+ * Creates a Type3 font. This implementation assumes that the /FontMatrix is
+ * [0.001 0 0 0.001 0 0] or a 1000-unit glyph coordinate system.
+ * <p>
+ * An example:
+ * <p>
+ * <pre>
+ * Document document = new Document(PageSize.A4);
+ * PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("type3.pdf"));
+ * document.open();
+ * Type3Font t3 = new Type3Font(writer, new char[]{'a', 'b'}, false);
+ * PdfContentByte g = t3.defineGlyph('a', 1000, 0, 0, 750, 750);
+ * g.rectangle(0, 0, 750, 750);
+ * g.fill();
+ * g = t3.defineGlyph('b', 1000, 0, 0, 750, 750);
+ * g.moveTo(0, 0);
+ * g.lineTo(375, 750);
+ * g.lineTo(750, 0);
+ * g.fill();
+ * Font f = new Font(t3, 12);
+ * document.add(new Paragraph("ababab", f));
+ * document.close();
+ * </pre>
+ * @param writer the writer
+ * @param chars an array of chars corresponding to the glyphs used
+ * @param colorized if <CODE>true</CODE> the font may specify color, if <CODE>false</CODE> no color commands are allowed
+ * and only images as masks can be used
+ */
+ public Type3Font(PdfWriter writer, char[] chars, boolean colorized) {
+ this.writer = writer;
+ this.colorized = colorized;
+ fontType = FONT_TYPE_T3;
+ if (chars.length == 0 || chars.length > 256)
+ throw new IllegalArgumentException("char array size must be > 0 and <= 256");
+ int count = 255;
+ boolean[] hits = new boolean[chars.length];
+ for (int k = 0; k < chars.length; ++k) {
+ char c = chars[k];
+ if (c >= 32 && c < 256) {
+ if (char2byte.containsKey(c))
+ throw new IllegalArgumentException("duplicated char - " + (int)c + ", index " + k);
+ char2byte.put(c, c);
+ hits[k] = true;
+ }
+ }
+ for (int k = 0; k < hits.length; ++k) {
+ if (hits[k])
+ continue;
+ while (char2byte.containsKey(count)) {
+ --count;
+ }
+ char c = chars[k];
+ if (char2byte.containsKey(c))
+ throw new IllegalArgumentException("duplicated char - " + (int)c + ", index " + k);
+ char2byte.put(c, count--);
+ }
+ }
+
+ /**
+ * Defines a glyph.
+ * @param c the character to match this glyph. It must be one of those defined in the constructor
+ * @param wx the advance this character will have
+ * @param llx the X lower left corner of the glyph bounding box. If the <CODE>colorize</CODE> option is
+ * <CODE>true</CODE> the value is ignored
+ * @param lly the Y lower left corner of the glyph bounding box. If the <CODE>colorize</CODE> option is
+ * <CODE>true</CODE> the value is ignored
+ * @param urx the X upper right corner of the glyph bounding box. If the <CODE>colorize</CODE> option is
+ * <CODE>true</CODE> the value is ignored
+ * @param ury the Y upper right corner of the glyph bounding box. If the <CODE>colorize</CODE> option is
+ * <CODE>true</CODE> the value is ignored
+ * @return a content where the glyph can be defined
+ */
+ public PdfContentByte defineGlyph(char c, float wx, float llx, float lly, float urx, float ury) {
+ if (!char2byte.containsKey(c))
+ throw new IllegalArgumentException("The char " + (int)c + " doesn't belong in this Type3 font");
+ Integer ck = new Integer((int)c);
+ Type3Glyph glyph = (Type3Glyph)char2glyph.get(ck);
+ if (glyph != null)
+ return glyph;
+ widths3.put(c, (int)wx);
+ if (!colorized) {
+ if (Float.isNaN(this.llx)) {
+ this.llx = llx;
+ this.lly = lly;
+ this.urx = urx;
+ this.ury = ury;
+ }
+ else {
+ this.llx = Math.min(this.llx, llx);
+ this.lly = Math.min(this.lly, lly);
+ this.urx = Math.max(this.urx, urx);
+ this.ury = Math.max(this.ury, ury);
+ }
+ }
+ glyph = new Type3Glyph(writer, pageResources, wx, llx, lly, urx, ury, colorized);
+ char2glyph.put(ck, glyph);
+ return glyph;
+ }
+
+ public String[][] getFamilyFontName() {
+ return new String[0][];
+ }
+
+ public float getFontDescriptor(int key, float fontSize) {
+ return 0;
+ }
+
+ public String[][] getFullFontName() {
+ return new String[0][];
+ }
+
+ public int getKerning(char char1, char char2) {
+ return 0;
+ }
+
+ public String getPostscriptFontName() {
+ return "";
+ }
+
+ protected int[] getRawCharBBox(int c, String name) {
+ return null;
+ }
+
+ int getRawWidth(int c, String name) {
+ return 0;
+ }
+
+ public boolean hasKernPairs() {
+ return false;
+ }
+
+ public boolean setKerning(char char1, char char2, int kern) {
+ return false;
+ }
+
+ public void setPostscriptFontName(String name) {
+ }
+
+ void writeFont(PdfWriter writer, PdfIndirectReference ref, Object[] params) throws com.lowagie.text.DocumentException, java.io.IOException {
+ if (this.writer != writer)
+ throw new IllegalArgumentException("Type3 font used with the wrong PdfWriter");
+ if (char2byte.size() != widths3.size())
+ throw new DocumentException("Not all the glyphs in the Type3 font are defined");
+ IntHashtable inv = new IntHashtable();
+ for (Iterator it = char2byte.getEntryIterator(); it.hasNext();) {
+ IntHashtable.IntHashtableEntry entry = (IntHashtable.IntHashtableEntry)it.next();
+ inv.put(entry.getValue(), entry.getKey());
+ }
+ int[] invOrd = inv.toOrderedKeys();
+ int firstChar = invOrd[0];
+ int lastChar = invOrd[invOrd.length - 1];
+ int[] widths = new int[lastChar - firstChar + 1];
+ for (int k = 0; k < widths.length; ++k) {
+ if (inv.containsKey(k + firstChar))
+ widths[k] = widths3.get(inv.get(k + firstChar));
+ }
+ PdfArray diffs = new PdfArray();
+ PdfDictionary charprocs = new PdfDictionary();
+ int last = -1;
+ for (int k = 0; k < invOrd.length; ++k) {
+ int c = invOrd[k];
+ if (c > last) {
+ last = c;
+ diffs.add(new PdfNumber(last));
+ }
+ ++last;
+ int c2 = inv.get(c);
+ String s = GlyphList.unicodeToName(c2);
+ if (s == null)
+ s = "a" + c2;
+ PdfName n = new PdfName(s);
+ diffs.add(n);
+ Type3Glyph glyph = (Type3Glyph)char2glyph.get(new Integer(c2));
+ PdfStream stream = new PdfStream(glyph.toPdf(null));
+ stream.flateCompress();
+ PdfIndirectReference refp = writer.addToBody(stream).getIndirectReference();
+ charprocs.put(n, refp);
+ }
+ PdfDictionary font = new PdfDictionary(PdfName.FONT);
+ font.put(PdfName.SUBTYPE, PdfName.TYPE3);
+ if (colorized)
+ font.put(PdfName.FONTBBOX, new PdfRectangle(0, 0, 0, 0));
+ else
+ font.put(PdfName.FONTBBOX, new PdfRectangle(llx, lly, urx, ury));
+ font.put(PdfName.FONTMATRIX, new PdfArray(new float[]{0.001f, 0, 0, 0.001f, 0, 0}));
+ font.put(PdfName.CHARPROCS, writer.addToBody(charprocs).getIndirectReference());
+ PdfDictionary encoding = new PdfDictionary();
+ encoding.put(PdfName.DIFFERENCES, diffs);
+ font.put(PdfName.ENCODING, writer.addToBody(encoding).getIndirectReference());
+ font.put(PdfName.FIRSTCHAR, new PdfNumber(firstChar));
+ font.put(PdfName.LASTCHAR, new PdfNumber(lastChar));
+ font.put(PdfName.WIDTHS, writer.addToBody(new PdfArray(widths)).getIndirectReference());
+ if (pageResources.hasResources())
+ font.put(PdfName.RESOURCES, writer.addToBody(pageResources.getResources()).getIndirectReference());
+ writer.addToBody(font, ref);
+ }
+
+ byte[] convertToBytes(String text) {
+ char[] cc = text.toCharArray();
+ byte[] b = new byte[cc.length];
+ int p = 0;
+ for (int k = 0; k < cc.length; ++k) {
+ char c = cc[k];
+ if (char2byte.containsKey(c))
+ b[p++] = (byte)char2byte.get(c);
+ }
+ if (b.length == p)
+ return b;
+ byte[] b2 = new byte[p];
+ System.arraycopy(b, 0, b2, 0, p);
+ return b2;
+ }
+
+ public int getWidth(char char1) {
+ if (!widths3.containsKey(char1))
+ throw new IllegalArgumentException("The char " + (int)char1 + " is not defined in a Type3 font");
+ return widths3.get(char1);
+ }
+
+ public int getWidth(String text) {
+ char[] c = text.toCharArray();
+ int total = 0;
+ for (int k = 0; k < c.length; ++k)
+ total += getWidth(c[k]);
+ return total;
+ }
+
+ public int[] getCharBBox(char c) {
+ return null;
+ }
+
+ public boolean charExists(char c) {
+ return char2byte.containsKey(c);
+ }
+
+ public boolean setCharAdvance(char c, int advance) {
+ return false;
+ }
+
+}
diff --git a/src/main/java/com/lowagie/text/pdf/Type3Glyph.java b/src/main/java/com/lowagie/text/pdf/Type3Glyph.java
new file mode 100644
index 0000000..4c03a5e
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/Type3Glyph.java
@@ -0,0 +1,94 @@
+/*
+ * Copyright 2005 by Paulo Soares.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf;
+import com.lowagie.text.DocumentException;
+import com.lowagie.text.Image;
+/**
+ * The content where Type3 glyphs are written to.
+ */
+public class Type3Glyph extends PdfContentByte {
+
+ private PageResources pageResources;
+ private boolean colorized;
+
+ private Type3Glyph() {
+ super(null);
+ }
+
+ Type3Glyph(PdfWriter writer, PageResources pageResources, float wx, float llx, float lly, float urx, float ury, boolean colorized) {
+ super(writer);
+ this.pageResources = pageResources;
+ this.colorized = colorized;
+ if (colorized) {
+ content.append(wx).append(" 0 d0\n");
+ }
+ else {
+ content.append(wx).append(" 0 ").append(llx).append(' ').append(lly).append(' ').append(urx).append(' ').append(ury).append(" d1\n");
+ }
+ }
+
+ PageResources getPageResources() {
+ return pageResources;
+ }
+
+ public void addImage(Image image, float a, float b, float c, float d, float e, float f, boolean inlineImage) throws DocumentException {
+ if (!colorized && (!image.isMask() || !(image.bpc() == 1 || image.bpc() > 0xff)))
+ throw new DocumentException("Not colorized Typed3 fonts only accept mask images.");
+ super.addImage(image, a, b, c, d, e, f, inlineImage);
+ }
+
+ public PdfContentByte getDuplicate() {
+ Type3Glyph dup = new Type3Glyph();
+ dup.writer = writer;
+ dup.pdf = pdf;
+ dup.pageResources = pageResources;
+ dup.colorized = colorized;
+ return dup;
+ }
+
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/pdf/VerticalText.java b/src/main/java/com/lowagie/text/pdf/VerticalText.java
new file mode 100644
index 0000000..8ebc359
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/VerticalText.java
@@ -0,0 +1,349 @@
+/*
+ *
+ * Copyright 2002 by Paulo Soares.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+package com.lowagie.text.pdf;
+import java.util.ArrayList;
+import java.util.Iterator;
+import com.lowagie.text.Phrase;
+import com.lowagie.text.Chunk;
+import com.lowagie.text.Element;
+import com.lowagie.text.DocumentException;
+import java.awt.Color;
+
+/** Writes text vertically. Note that the naming is done according
+ * to horizontal text although it referrs to vertical text.
+ * A line with the alignment Element.LEFT_ALIGN will actually
+ * be top aligned.
+ */
+public class VerticalText {
+
+/** Signals that there are no more text available. */
+ public static final int NO_MORE_TEXT = 1;
+
+/** Signals that there is no more column. */
+ public static final int NO_MORE_COLUMN = 2;
+
+/** The chunks that form the text. */
+ protected ArrayList chunks = new ArrayList();
+
+ /** The <CODE>PdfContent</CODE> where the text will be written to. */
+ protected PdfContentByte text;
+
+ /** The column alignment. Default is left alignment. */
+ protected int alignment = Element.ALIGN_LEFT;
+
+ /** Marks the chunks to be eliminated when the line is written. */
+ protected int currentChunkMarker = -1;
+
+ /** The chunk created by the splitting. */
+ protected PdfChunk currentStandbyChunk;
+
+ /** The chunk created by the splitting. */
+ protected String splittedChunkText;
+
+ /** The leading
+ */
+ protected float leading;
+
+ /** The X coordinate.
+ */
+ protected float startX;
+
+ /** The Y coordinate.
+ */
+ protected float startY;
+
+ /** The maximum number of vertical lines.
+ */
+ protected int maxLines;
+
+ /** The height of the text.
+ */
+ protected float height;
+
+ /** Creates new VerticalText
+ * @param text the place where the text will be written to. Can
+ * be a template.
+ */
+ public VerticalText(PdfContentByte text) {
+ this.text = text;
+ }
+
+ /**
+ * Adds a <CODE>Phrase</CODE> to the current text array.
+ * @param phrase the text
+ */
+ public void addText(Phrase phrase) {
+ for (Iterator j = phrase.getChunks().iterator(); j.hasNext();) {
+ chunks.add(new PdfChunk((Chunk)j.next(), null));
+ }
+ }
+
+ /**
+ * Adds a <CODE>Chunk</CODE> to the current text array.
+ * @param chunk the text
+ */
+ public void addText(Chunk chunk) {
+ chunks.add(new PdfChunk(chunk, null));
+ }
+
+ /** Sets the layout.
+ * @param startX the top right X line position
+ * @param startY the top right Y line position
+ * @param height the height of the lines
+ * @param maxLines the maximum number of lines
+ * @param leading the separation between the lines
+ */
+ public void setVerticalLayout(float startX, float startY, float height, int maxLines, float leading) {
+ this.startX = startX;
+ this.startY = startY;
+ this.height = height;
+ this.maxLines = maxLines;
+ setLeading(leading);
+ }
+
+ /** Sets the separation between the vertical lines.
+ * @param leading the vertical line separation
+ */
+ public void setLeading(float leading) {
+ this.leading = leading;
+ }
+
+ /** Gets the separation between the vertical lines.
+ * @return the vertical line separation
+ */
+ public float getLeading() {
+ return leading;
+ }
+
+ /**
+ * Creates a line from the chunk array.
+ * @param width the width of the line
+ * @return the line or null if no more chunks
+ */
+ protected PdfLine createLine(float width) {
+ if (chunks.size() == 0)
+ return null;
+ splittedChunkText = null;
+ currentStandbyChunk = null;
+ PdfLine line = new PdfLine(0, width, alignment, 0);
+ String total;
+ for (currentChunkMarker = 0; currentChunkMarker < chunks.size(); ++currentChunkMarker) {
+ PdfChunk original = (PdfChunk)(chunks.get(currentChunkMarker));
+ total = original.toString();
+ currentStandbyChunk = line.add(original);
+ if (currentStandbyChunk != null) {
+ splittedChunkText = original.toString();
+ original.setValue(total);
+ return line;
+ }
+ }
+ return line;
+ }
+
+ /**
+ * Normalizes the list of chunks when the line is accepted.
+ */
+ protected void shortenChunkArray() {
+ if (currentChunkMarker < 0)
+ return;
+ if (currentChunkMarker >= chunks.size()) {
+ chunks.clear();
+ return;
+ }
+ PdfChunk split = (PdfChunk)(chunks.get(currentChunkMarker));
+ split.setValue(splittedChunkText);
+ chunks.set(currentChunkMarker, currentStandbyChunk);
+ for (int j = currentChunkMarker - 1; j >= 0; --j)
+ chunks.remove(j);
+ }
+
+ /**
+ * Outputs the lines to the document. It is equivalent to <CODE>go(false)</CODE>.
+ * @return returns the result of the operation. It can be <CODE>NO_MORE_TEXT</CODE>
+ * and/or <CODE>NO_MORE_COLUMN</CODE>
+ * @throws DocumentException on error
+ */
+ public int go() throws DocumentException {
+ return go(false);
+ }
+
+ /**
+ * Outputs the lines to the document. The output can be simulated.
+ * @param simulate <CODE>true</CODE> to simulate the writting to the document
+ * @return returns the result of the operation. It can be <CODE>NO_MORE_TEXT</CODE>
+ * and/or <CODE>NO_MORE_COLUMN</CODE>
+ * @throws DocumentException on error
+ */
+ public int go(boolean simulate) throws DocumentException {
+ boolean dirty = false;
+ PdfContentByte graphics = null;
+ if (text != null) {
+ graphics = text.getDuplicate();
+ }
+ else if (simulate == false)
+ throw new NullPointerException("VerticalText.go with simulate==false and text==null.");
+ int status = 0;
+ for (;;) {
+ if (maxLines <= 0) {
+ status = NO_MORE_COLUMN;
+ if (chunks.size() == 0)
+ status |= NO_MORE_TEXT;
+ break;
+ }
+ if (chunks.size() == 0) {
+ status = NO_MORE_TEXT;
+ break;
+ }
+ PdfLine line = createLine(height);
+ if (!simulate && !dirty) {
+ text.beginText();
+ dirty = true;
+ }
+ shortenChunkArray();
+ if (!simulate) {
+ text.setTextMatrix(startX, startY - line.indentLeft());
+ writeLine(line, text, graphics);
+ }
+ --maxLines;
+ startX -= leading;
+ }
+ if (dirty) {
+ text.endText();
+ text.add(graphics);
+ }
+ return status;
+ }
+
+ void writeLine(PdfLine line, PdfContentByte text, PdfContentByte graphics) throws DocumentException {
+ PdfFont currentFont = null;
+ PdfChunk chunk;
+ for (Iterator j = line.iterator(); j.hasNext(); ) {
+ chunk = (PdfChunk) j.next();
+
+ if (chunk.font().compareTo(currentFont) != 0) {
+ currentFont = chunk.font();
+ text.setFontAndSize(currentFont.getFont(), currentFont.size());
+ }
+ Color color = chunk.color();
+ if (color != null)
+ text.setColorFill(color);
+ text.showText(chunk.toString());
+ if (color != null)
+ text.resetRGBColorFill();
+ }
+ }
+
+ /** Sets the new text origin.
+ * @param startX the X coordinate
+ * @param startY the Y coordinate
+ */
+ public void setOrigin(float startX, float startY) {
+ this.startX = startX;
+ this.startY = startY;
+ }
+
+ /** Gets the X coordinate where the next line will be writen. This value will change
+ * after each call to <code>go()</code>.
+ * @return the X coordinate
+ */
+ public float getOriginX() {
+ return startX;
+ }
+
+ /** Gets the Y coordinate where the next line will be writen.
+ * @return the Y coordinate
+ */
+ public float getOriginY() {
+ return startY;
+ }
+
+ /** Gets the maximum number of available lines. This value will change
+ * after each call to <code>go()</code>.
+ * @return Value of property maxLines.
+ */
+ public int getMaxLines() {
+ return maxLines;
+ }
+
+ /** Sets the maximum number of lines.
+ * @param maxLines the maximum number of lines
+ */
+ public void setMaxLines(int maxLines) {
+ this.maxLines = maxLines;
+ }
+
+ /** Gets the height of the line
+ * @return the height
+ */
+ public float getHeight() {
+ return height;
+ }
+
+ /** Sets the height of the line
+ * @param height the new height
+ */
+ public void setHeight(float height) {
+ this.height = height;
+ }
+
+ /**
+ * Sets the alignment.
+ * @param alignment the alignment
+ */
+ public void setAlignment(int alignment) {
+ this.alignment = alignment;
+ }
+
+ /**
+ * Gets the alignment.
+ * @return the alignment
+ */
+ public int getAlignment() {
+ return alignment;
+ }
+}
diff --git a/src/main/java/com/lowagie/text/pdf/XfdfReader.java b/src/main/java/com/lowagie/text/pdf/XfdfReader.java
new file mode 100644
index 0000000..e3a7067
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/XfdfReader.java
@@ -0,0 +1,208 @@
+/*
+ *
+ * Copyright 2004 by Leonard Rosenthol.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.FileInputStream;
+import java.util.HashMap;
+import java.util.Stack;
+
+/**
+ * Reads a XFDF.
+ * @author Leonard Rosenthol (leonardr@pdfsages.com)
+ */
+public class XfdfReader implements SimpleXMLDocHandler {
+ // stuff used during parsing to handle state
+ private boolean foundRoot = false;
+ private Stack fieldNames = new Stack();
+ private Stack fieldValues = new Stack();
+
+ // storage for the field list and their values
+ HashMap fields;
+
+ // storage for the path to referenced PDF, if any
+ String fileSpec;
+
+ /** Reads an XFDF form.
+ * @param filename the file name of the form
+ * @throws IOException on error
+ */
+ public XfdfReader(String filename) throws IOException {
+ FileInputStream fin = null;
+ try {
+ fin = new FileInputStream(filename);
+ SimpleXMLParser.parse(this, fin);
+ }
+ finally {
+ try{fin.close();}catch(Exception e){}
+ }
+ }
+
+ /** Reads an XFDF form.
+ * @param xfdfIn the byte array with the form
+ * @throws IOException on error
+ */
+ public XfdfReader(byte xfdfIn[]) throws IOException {
+ SimpleXMLParser.parse( this, new ByteArrayInputStream(xfdfIn));
+ }
+
+ /** Gets all the fields. The map is keyed by the fully qualified
+ * field name and the value is a merged <CODE>PdfDictionary</CODE>
+ * with the field content.
+ * @return all the fields
+ */
+ public HashMap getFields() {
+ return fields;
+ }
+
+ /** Gets the field value.
+ * @param name the fully qualified field name
+ * @return the field's value
+ */
+ public String getField(String name) {
+ return (String)fields.get(name);
+ }
+
+ /** Gets the field value or <CODE>null</CODE> if the field does not
+ * exist or has no value defined.
+ * @param name the fully qualified field name
+ * @return the field value or <CODE>null</CODE>
+ */
+ public String getFieldValue(String name) {
+ String field = (String)fields.get(name);
+ if (field == null)
+ return null;
+ else
+ return field;
+ }
+
+ /** Gets the PDF file specification contained in the FDF.
+ * @return the PDF file specification contained in the FDF
+ */
+ public String getFileSpec() {
+ return fileSpec;
+ }
+
+ /**
+ * Called when a start tag is found.
+ * @param tag the tag name
+ * @param h the tag's attributes
+ */
+ public void startElement(String tag, HashMap h)
+ {
+ if ( !foundRoot ) {
+ if (!tag.equals("xfdf"))
+ throw new RuntimeException("Root element is not Bookmark.");
+ else
+ foundRoot = true;
+ }
+
+ if ( tag.equals("xfdf") ){
+
+ } else if ( tag.equals("f") ) {
+ fileSpec = (String)h.get( "href" );
+ } else if ( tag.equals("fields") ) {
+ fields = new HashMap(); // init it!
+ } else if ( tag.equals("field") ) {
+ String fName = (String) h.get( "name" );
+ fieldNames.push( fName );
+ } else if ( tag.equals("value") ) {
+ fieldValues.push( "" );
+ }
+ }
+ /**
+ * Called when an end tag is found.
+ * @param tag the tag name
+ */
+ public void endElement(String tag) {
+ if ( tag.equals("value") ) {
+ String fName = "";
+ for (int k = 0; k < fieldNames.size(); ++k) {
+ fName += "." + (String)fieldNames.elementAt(k);
+ }
+ if (fName.startsWith("."))
+ fName = fName.substring(1);
+ String fVal = (String) fieldValues.pop();
+ fields.put( fName, fVal );
+ }
+ else if (tag.equals("field") ) {
+ if (!fieldNames.isEmpty())
+ fieldNames.pop();
+ }
+ }
+
+ /**
+ * Called when the document starts to be parsed.
+ */
+ public void startDocument()
+ {
+ fileSpec = new String(""); // and this too...
+ }
+ /**
+ * Called after the document is parsed.
+ */
+ public void endDocument()
+ {
+
+ }
+ /**
+ * Called when a text element is found.
+ * @param str the text element, probably a fragment.
+ */
+ public void text(String str)
+ {
+ if (fieldNames.isEmpty() || fieldValues.isEmpty())
+ return;
+
+ String val = (String)fieldValues.pop();
+ val += str;
+ fieldValues.push(val);
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/pdf/codec/BmpImage.java b/src/main/java/com/lowagie/text/pdf/codec/BmpImage.java
new file mode 100644
index 0000000..f9f80be
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/codec/BmpImage.java
@@ -0,0 +1,1282 @@
+/*
+ * Copyright 2003 by Paulo Soares.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ *
+ *
+ * The original JAI codecs have the following license
+ *
+ * Copyright (c) 2001 Sun Microsystems, Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * -Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * -Redistribution in binary form must reproduct the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of contributors may
+ * be used to endorse or promote products derived from this software without
+ * specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any kind. ALL
+ * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING ANY
+ * IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ * NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN AND ITS LICENSORS SHALL NOT BE
+ * LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
+ * OR DISTRIBUTING THE SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR ITS
+ * LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT,
+ * INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER
+ * CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF
+ * OR INABILITY TO USE SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that Software is not designed,licensed or intended for use in
+ * the design, construction, operation or maintenance of any nuclear facility.
+ */
+package com.lowagie.text.pdf.codec;
+
+import com.lowagie.text.pdf.*;
+import com.lowagie.text.*;
+import java.io.*;
+import java.util.HashMap;
+import java.net.URL;
+
+/** Reads a BMP image. All types of BMP can be read.
+ * <p>
+ * It is based in the JAI codec.
+ *
+ * @author Paulo Soares (psoares@consiste.pt)
+ */
+public class BmpImage {
+
+ // BMP variables
+ private InputStream inputStream;
+ private long bitmapFileSize;
+ private long bitmapOffset;
+ private long compression;
+ private long imageSize;
+ private byte palette[];
+ private int imageType;
+ private int numBands;
+ private boolean isBottomUp;
+ private int bitsPerPixel;
+ private int redMask, greenMask, blueMask, alphaMask;
+ public HashMap properties = new HashMap();
+ private long xPelsPerMeter;
+ private long yPelsPerMeter;
+ // BMP Image types
+ private static final int VERSION_2_1_BIT = 0;
+ private static final int VERSION_2_4_BIT = 1;
+ private static final int VERSION_2_8_BIT = 2;
+ private static final int VERSION_2_24_BIT = 3;
+
+ private static final int VERSION_3_1_BIT = 4;
+ private static final int VERSION_3_4_BIT = 5;
+ private static final int VERSION_3_8_BIT = 6;
+ private static final int VERSION_3_24_BIT = 7;
+
+ private static final int VERSION_3_NT_16_BIT = 8;
+ private static final int VERSION_3_NT_32_BIT = 9;
+
+ private static final int VERSION_4_1_BIT = 10;
+ private static final int VERSION_4_4_BIT = 11;
+ private static final int VERSION_4_8_BIT = 12;
+ private static final int VERSION_4_16_BIT = 13;
+ private static final int VERSION_4_24_BIT = 14;
+ private static final int VERSION_4_32_BIT = 15;
+
+ // Color space types
+ private static final int LCS_CALIBRATED_RGB = 0;
+ private static final int LCS_sRGB = 1;
+ private static final int LCS_CMYK = 2;
+
+ // Compression Types
+ private static final int BI_RGB = 0;
+ private static final int BI_RLE8 = 1;
+ private static final int BI_RLE4 = 2;
+ private static final int BI_BITFIELDS = 3;
+
+ int width;
+ int height;
+
+ BmpImage(InputStream is, boolean noHeader, int size) throws IOException {
+ bitmapFileSize = size;
+ bitmapOffset = 0;
+ process(is, noHeader);
+ }
+
+ /** Reads a BMP from an url.
+ * @param url the url
+ * @throws IOException on error
+ * @return the image
+ */
+ public static Image getImage(URL url) throws IOException {
+ InputStream is = null;
+ try {
+ is = url.openStream();
+ Image img = getImage(is);
+ img.setUrl(url);
+ return img;
+ }
+ finally {
+ if (is != null) {
+ is.close();
+ }
+ }
+ }
+
+ /** Reads a BMP from a stream. The stream is not closed.
+ * @param is the stream
+ * @throws IOException on error
+ * @return the image
+ */
+ public static Image getImage(InputStream is) throws IOException {
+ return getImage(is, false, 0);
+ }
+
+ /** Reads a BMP from a stream. The stream is not closed.
+ * The BMP may not have a header and be considered as a plain DIB.
+ * @param is the stream
+ * @param noHeader true to process a plain DIB
+ * @param size the size of the DIB. Not used for a BMP
+ * @throws IOException on error
+ * @return the image
+ */
+ public static Image getImage(InputStream is, boolean noHeader, int size) throws IOException {
+ BmpImage bmp = new BmpImage(is, noHeader, size);
+ try {
+ Image img = bmp.getImage();
+ img.setDpi((int)((double)bmp.xPelsPerMeter * 0.0254), (int)((double)bmp.yPelsPerMeter * 0.0254));
+ img.setOriginalType(Image.ORIGINAL_BMP);
+ return img;
+ }
+ catch (BadElementException be) {
+ throw new ExceptionConverter(be);
+ }
+ }
+
+ /** Reads a BMP from a file.
+ * @param file the file
+ * @throws IOException on error
+ * @return the image
+ */
+ public static Image getImage(String file) throws IOException {
+ return getImage(Image.toURL(file));
+ }
+
+ /** Reads a BMP from a byte array.
+ * @param data the byte array
+ * @throws IOException on error
+ * @return the image
+ */
+ public static Image getImage(byte data[]) throws IOException {
+ InputStream is = null;
+ try {
+ is = new ByteArrayInputStream(data);
+ Image img = getImage(is);
+ img.setOriginalData(data);
+ return img;
+ }
+ finally {
+ if (is != null) {
+ is.close();
+ }
+ }
+ }
+
+
+ protected void process(InputStream stream, boolean noHeader) throws IOException {
+ if (noHeader || stream instanceof BufferedInputStream) {
+ inputStream = stream;
+ } else {
+ inputStream = new BufferedInputStream(stream);
+ }
+ if (!noHeader) {
+ // Start File Header
+ if (!(readUnsignedByte(inputStream) == 'B' &&
+ readUnsignedByte(inputStream) == 'M')) {
+ throw new
+ RuntimeException("Invalid magic value for BMP file.");
+ }
+
+ // Read file size
+ bitmapFileSize = readDWord(inputStream);
+
+ // Read the two reserved fields
+ readWord(inputStream);
+ readWord(inputStream);
+
+ // Offset to the bitmap from the beginning
+ bitmapOffset = readDWord(inputStream);
+
+ // End File Header
+ }
+ // Start BitmapCoreHeader
+ long size = readDWord(inputStream);
+
+ if (size == 12) {
+ width = readWord(inputStream);
+ height = readWord(inputStream);
+ } else {
+ width = readLong(inputStream);
+ height = readLong(inputStream);
+ }
+
+ int planes = readWord(inputStream);
+ bitsPerPixel = readWord(inputStream);
+
+ properties.put("color_planes", new Integer(planes));
+ properties.put("bits_per_pixel", new Integer(bitsPerPixel));
+
+ // As BMP always has 3 rgb bands, except for Version 5,
+ // which is bgra
+ numBands = 3;
+ if (bitmapOffset == 0)
+ bitmapOffset = size;
+ if (size == 12) {
+ // Windows 2.x and OS/2 1.x
+ properties.put("bmp_version", "BMP v. 2.x");
+
+ // Classify the image type
+ if (bitsPerPixel == 1) {
+ imageType = VERSION_2_1_BIT;
+ } else if (bitsPerPixel == 4) {
+ imageType = VERSION_2_4_BIT;
+ } else if (bitsPerPixel == 8) {
+ imageType = VERSION_2_8_BIT;
+ } else if (bitsPerPixel == 24) {
+ imageType = VERSION_2_24_BIT;
+ }
+
+ // Read in the palette
+ int numberOfEntries = (int)((bitmapOffset-14-size) / 3);
+ int sizeOfPalette = numberOfEntries*3;
+ if (bitmapOffset == size) {
+ switch (imageType) {
+ case VERSION_2_1_BIT:
+ sizeOfPalette = 2 * 3;
+ break;
+ case VERSION_2_4_BIT:
+ sizeOfPalette = 16 * 3;
+ break;
+ case VERSION_2_8_BIT:
+ sizeOfPalette = 256 * 3;
+ break;
+ case VERSION_2_24_BIT:
+ sizeOfPalette = 0;
+ break;
+ }
+ bitmapOffset = size + sizeOfPalette;
+ }
+ palette = new byte[sizeOfPalette];
+ inputStream.read(palette, 0, sizeOfPalette);
+ properties.put("palette", palette);
+ } else {
+
+ compression = readDWord(inputStream);
+ imageSize = readDWord(inputStream);
+ xPelsPerMeter = readLong(inputStream);
+ yPelsPerMeter = readLong(inputStream);
+ long colorsUsed = readDWord(inputStream);
+ long colorsImportant = readDWord(inputStream);
+
+ switch((int)compression) {
+ case BI_RGB:
+ properties.put("compression", "BI_RGB");
+ break;
+
+ case BI_RLE8:
+ properties.put("compression", "BI_RLE8");
+ break;
+
+ case BI_RLE4:
+ properties.put("compression", "BI_RLE4");
+ break;
+
+ case BI_BITFIELDS:
+ properties.put("compression", "BI_BITFIELDS");
+ break;
+ }
+
+ properties.put("x_pixels_per_meter", new Long(xPelsPerMeter));
+ properties.put("y_pixels_per_meter", new Long(yPelsPerMeter));
+ properties.put("colors_used", new Long(colorsUsed));
+ properties.put("colors_important", new Long(colorsImportant));
+
+ if (size == 40) {
+ // Windows 3.x and Windows NT
+ switch((int)compression) {
+
+ case BI_RGB: // No compression
+ case BI_RLE8: // 8-bit RLE compression
+ case BI_RLE4: // 4-bit RLE compression
+
+ if (bitsPerPixel == 1) {
+ imageType = VERSION_3_1_BIT;
+ } else if (bitsPerPixel == 4) {
+ imageType = VERSION_3_4_BIT;
+ } else if (bitsPerPixel == 8) {
+ imageType = VERSION_3_8_BIT;
+ } else if (bitsPerPixel == 24) {
+ imageType = VERSION_3_24_BIT;
+ } else if (bitsPerPixel == 16) {
+ imageType = VERSION_3_NT_16_BIT;
+ redMask = 0x7C00;
+ greenMask = 0x3E0;
+ blueMask = 0x1F;
+ properties.put("red_mask", new Integer(redMask));
+ properties.put("green_mask", new Integer(greenMask));
+ properties.put("blue_mask", new Integer(blueMask));
+ } else if (bitsPerPixel == 32) {
+ imageType = VERSION_3_NT_32_BIT;
+ redMask = 0x00FF0000;
+ greenMask = 0x0000FF00;
+ blueMask = 0x000000FF;
+ properties.put("red_mask", new Integer(redMask));
+ properties.put("green_mask", new Integer(greenMask));
+ properties.put("blue_mask", new Integer(blueMask));
+ }
+
+ // Read in the palette
+ int numberOfEntries = (int)((bitmapOffset-14-size) / 4);
+ int sizeOfPalette = numberOfEntries*4;
+ if (bitmapOffset == size) {
+ switch (imageType) {
+ case VERSION_3_1_BIT:
+ sizeOfPalette = (int)(colorsUsed == 0 ? 2 : colorsUsed) * 4;
+ break;
+ case VERSION_3_4_BIT:
+ sizeOfPalette = (int)(colorsUsed == 0 ? 16 : colorsUsed) * 4;
+ break;
+ case VERSION_3_8_BIT:
+ sizeOfPalette = (int)(colorsUsed == 0 ? 256 : colorsUsed) * 4;
+ break;
+ default:
+ sizeOfPalette = 0;
+ break;
+ }
+ bitmapOffset = size + sizeOfPalette;
+ }
+ palette = new byte[sizeOfPalette];
+ inputStream.read(palette, 0, sizeOfPalette);
+ properties.put("palette", palette);
+
+ properties.put("bmp_version", "BMP v. 3.x");
+ break;
+
+ case BI_BITFIELDS:
+
+ if (bitsPerPixel == 16) {
+ imageType = VERSION_3_NT_16_BIT;
+ } else if (bitsPerPixel == 32) {
+ imageType = VERSION_3_NT_32_BIT;
+ }
+
+ // BitsField encoding
+ redMask = (int)readDWord(inputStream);
+ greenMask = (int)readDWord(inputStream);
+ blueMask = (int)readDWord(inputStream);
+
+ properties.put("red_mask", new Integer(redMask));
+ properties.put("green_mask", new Integer(greenMask));
+ properties.put("blue_mask", new Integer(blueMask));
+
+ if (colorsUsed != 0) {
+ // there is a palette
+ sizeOfPalette = (int)colorsUsed*4;
+ palette = new byte[sizeOfPalette];
+ inputStream.read(palette, 0, sizeOfPalette);
+ properties.put("palette", palette);
+ }
+
+ properties.put("bmp_version", "BMP v. 3.x NT");
+ break;
+
+ default:
+ throw new
+ RuntimeException("Invalid compression specified in BMP file.");
+ }
+ } else if (size == 108) {
+ // Windows 4.x BMP
+
+ properties.put("bmp_version", "BMP v. 4.x");
+
+ // rgb masks, valid only if comp is BI_BITFIELDS
+ redMask = (int)readDWord(inputStream);
+ greenMask = (int)readDWord(inputStream);
+ blueMask = (int)readDWord(inputStream);
+ // Only supported for 32bpp BI_RGB argb
+ alphaMask = (int)readDWord(inputStream);
+ long csType = readDWord(inputStream);
+ int redX = readLong(inputStream);
+ int redY = readLong(inputStream);
+ int redZ = readLong(inputStream);
+ int greenX = readLong(inputStream);
+ int greenY = readLong(inputStream);
+ int greenZ = readLong(inputStream);
+ int blueX = readLong(inputStream);
+ int blueY = readLong(inputStream);
+ int blueZ = readLong(inputStream);
+ long gammaRed = readDWord(inputStream);
+ long gammaGreen = readDWord(inputStream);
+ long gammaBlue = readDWord(inputStream);
+
+ if (bitsPerPixel == 1) {
+ imageType = VERSION_4_1_BIT;
+ } else if (bitsPerPixel == 4) {
+ imageType = VERSION_4_4_BIT;
+ } else if (bitsPerPixel == 8) {
+ imageType = VERSION_4_8_BIT;
+ } else if (bitsPerPixel == 16) {
+ imageType = VERSION_4_16_BIT;
+ if ((int)compression == BI_RGB) {
+ redMask = 0x7C00;
+ greenMask = 0x3E0;
+ blueMask = 0x1F;
+ }
+ } else if (bitsPerPixel == 24) {
+ imageType = VERSION_4_24_BIT;
+ } else if (bitsPerPixel == 32) {
+ imageType = VERSION_4_32_BIT;
+ if ((int)compression == BI_RGB) {
+ redMask = 0x00FF0000;
+ greenMask = 0x0000FF00;
+ blueMask = 0x000000FF;
+ }
+ }
+
+ properties.put("red_mask", new Integer(redMask));
+ properties.put("green_mask", new Integer(greenMask));
+ properties.put("blue_mask", new Integer(blueMask));
+ properties.put("alpha_mask", new Integer(alphaMask));
+
+ // Read in the palette
+ int numberOfEntries = (int)((bitmapOffset-14-size) / 4);
+ int sizeOfPalette = numberOfEntries*4;
+ if (bitmapOffset == size) {
+ switch (imageType) {
+ case VERSION_4_1_BIT:
+ sizeOfPalette = (int)(colorsUsed == 0 ? 2 : colorsUsed) * 4;
+ break;
+ case VERSION_4_4_BIT:
+ sizeOfPalette = (int)(colorsUsed == 0 ? 16 : colorsUsed) * 4;
+ break;
+ case VERSION_4_8_BIT:
+ sizeOfPalette = (int)(colorsUsed == 0 ? 256 : colorsUsed) * 4;
+ break;
+ default:
+ sizeOfPalette = 0;
+ break;
+ }
+ bitmapOffset = size + sizeOfPalette;
+ }
+ palette = new byte[sizeOfPalette];
+ inputStream.read(palette, 0, sizeOfPalette);
+
+ if (palette != null || palette.length != 0) {
+ properties.put("palette", palette);
+ }
+
+ switch((int)csType) {
+ case LCS_CALIBRATED_RGB:
+ // All the new fields are valid only for this case
+ properties.put("color_space", "LCS_CALIBRATED_RGB");
+ properties.put("redX", new Integer(redX));
+ properties.put("redY", new Integer(redY));
+ properties.put("redZ", new Integer(redZ));
+ properties.put("greenX", new Integer(greenX));
+ properties.put("greenY", new Integer(greenY));
+ properties.put("greenZ", new Integer(greenZ));
+ properties.put("blueX", new Integer(blueX));
+ properties.put("blueY", new Integer(blueY));
+ properties.put("blueZ", new Integer(blueZ));
+ properties.put("gamma_red", new Long(gammaRed));
+ properties.put("gamma_green", new Long(gammaGreen));
+ properties.put("gamma_blue", new Long(gammaBlue));
+
+ // break;
+ throw new
+ RuntimeException("Not implemented yet.");
+
+ case LCS_sRGB:
+ // Default Windows color space
+ properties.put("color_space", "LCS_sRGB");
+ break;
+
+ case LCS_CMYK:
+ properties.put("color_space", "LCS_CMYK");
+ // break;
+ throw new
+ RuntimeException("Not implemented yet.");
+ }
+
+ } else {
+ properties.put("bmp_version", "BMP v. 5.x");
+ throw new
+ RuntimeException("BMP version 5 not implemented yet.");
+ }
+ }
+
+ if (height > 0) {
+ // bottom up image
+ isBottomUp = true;
+ } else {
+ // top down image
+ isBottomUp = false;
+ height = Math.abs(height);
+ }
+ // When number of bitsPerPixel is <= 8, we use IndexColorModel.
+ if (bitsPerPixel == 1 || bitsPerPixel == 4 || bitsPerPixel == 8) {
+
+ numBands = 1;
+
+
+ // Create IndexColorModel from the palette.
+ byte r[], g[], b[];
+ int sizep;
+ if (imageType == VERSION_2_1_BIT ||
+ imageType == VERSION_2_4_BIT ||
+ imageType == VERSION_2_8_BIT) {
+
+ sizep = palette.length/3;
+
+ if (sizep > 256) {
+ sizep = 256;
+ }
+
+ int off;
+ r = new byte[sizep];
+ g = new byte[sizep];
+ b = new byte[sizep];
+ for (int i=0; i<sizep; i++) {
+ off = 3 * i;
+ b[i] = palette[off];
+ g[i] = palette[off+1];
+ r[i] = palette[off+2];
+ }
+ } else {
+ sizep = palette.length/4;
+
+ if (sizep > 256) {
+ sizep = 256;
+ }
+
+ int off;
+ r = new byte[sizep];
+ g = new byte[sizep];
+ b = new byte[sizep];
+ for (int i=0; i<sizep; i++) {
+ off = 4 * i;
+ b[i] = palette[off];
+ g[i] = palette[off+1];
+ r[i] = palette[off+2];
+ }
+ }
+
+ } else if (bitsPerPixel == 16) {
+ numBands = 3;
+ } else if (bitsPerPixel == 32) {
+ numBands = alphaMask == 0 ? 3 : 4;
+
+ // The number of bands in the SampleModel is determined by
+ // the length of the mask array passed in.
+ } else {
+ numBands = 3;
+ }
+ }
+
+ private byte[] getPalette(int group) {
+ if (palette == null)
+ return null;
+ byte np[] = new byte[palette.length / group * 3];
+ int e = palette.length / group;
+ for (int k = 0; k < e; ++k) {
+ int src = k * group;
+ int dest = k * 3;
+ np[dest + 2] = palette[src++];
+ np[dest + 1] = palette[src++];
+ np[dest] = palette[src];
+ }
+ return np;
+ }
+
+ private Image getImage() throws IOException, BadElementException {
+ byte bdata[] = null; // buffer for byte data
+
+ // if (sampleModel.getDataType() == DataBuffer.TYPE_BYTE)
+ // bdata = (byte[])((DataBufferByte)tile.getDataBuffer()).getData();
+ // else if (sampleModel.getDataType() == DataBuffer.TYPE_USHORT)
+ // sdata = (short[])((DataBufferUShort)tile.getDataBuffer()).getData();
+ // else if (sampleModel.getDataType() == DataBuffer.TYPE_INT)
+ // idata = (int[])((DataBufferInt)tile.getDataBuffer()).getData();
+
+ // There should only be one tile.
+ switch(imageType) {
+
+ case VERSION_2_1_BIT:
+ // no compression
+ return read1Bit(3);
+
+ case VERSION_2_4_BIT:
+ // no compression
+ return read4Bit(3);
+
+ case VERSION_2_8_BIT:
+ // no compression
+ return read8Bit(3);
+
+ case VERSION_2_24_BIT:
+ // no compression
+ bdata = new byte[width * height * 3];
+ read24Bit(bdata);
+ return new ImgRaw(width, height, 3, 8, bdata);
+
+ case VERSION_3_1_BIT:
+ // 1-bit images cannot be compressed.
+ return read1Bit(4);
+
+ case VERSION_3_4_BIT:
+ switch((int)compression) {
+ case BI_RGB:
+ return read4Bit(4);
+
+ case BI_RLE4:
+ return readRLE4();
+
+ default:
+ throw new
+ RuntimeException("Invalid compression specified for BMP file.");
+ }
+
+ case VERSION_3_8_BIT:
+ switch((int)compression) {
+ case BI_RGB:
+ return read8Bit(4);
+
+ case BI_RLE8:
+ return readRLE8();
+
+ default:
+ throw new
+ RuntimeException("Invalid compression specified for BMP file.");
+ }
+
+ case VERSION_3_24_BIT:
+ // 24-bit images are not compressed
+ bdata = new byte[width * height * 3];
+ read24Bit(bdata);
+ return new ImgRaw(width, height, 3, 8, bdata);
+
+ case VERSION_3_NT_16_BIT:
+ return read1632Bit(false);
+
+ case VERSION_3_NT_32_BIT:
+ return read1632Bit(true);
+
+ case VERSION_4_1_BIT:
+ return read1Bit(4);
+
+ case VERSION_4_4_BIT:
+ switch((int)compression) {
+
+ case BI_RGB:
+ return read4Bit(4);
+
+ case BI_RLE4:
+ return readRLE4();
+
+ default:
+ throw new
+ RuntimeException("Invalid compression specified for BMP file.");
+ }
+
+ case VERSION_4_8_BIT:
+ switch((int)compression) {
+
+ case BI_RGB:
+ return read8Bit(4);
+
+ case BI_RLE8:
+ return readRLE8();
+
+ default:
+ throw new
+ RuntimeException("Invalid compression specified for BMP file.");
+ }
+
+ case VERSION_4_16_BIT:
+ return read1632Bit(false);
+
+ case VERSION_4_24_BIT:
+ bdata = new byte[width * height * 3];
+ read24Bit(bdata);
+ return new ImgRaw(width, height, 3, 8, bdata);
+
+ case VERSION_4_32_BIT:
+ return read1632Bit(true);
+ }
+ return null;
+ }
+
+ private Image indexedModel(byte bdata[], int bpc, int paletteEntries) throws BadElementException {
+ Image img = new ImgRaw(width, height, 1, bpc, bdata);
+ PdfArray colorspace = new PdfArray();
+ colorspace.add(PdfName.INDEXED);
+ colorspace.add(PdfName.DEVICERGB);
+ byte np[] = getPalette(paletteEntries);
+ int len = np.length;
+ colorspace.add(new PdfNumber(len / 3 - 1));
+ colorspace.add(new PdfString(np));
+ PdfDictionary ad = new PdfDictionary();
+ ad.put(PdfName.COLORSPACE, colorspace);
+ img.setAdditional(ad);
+ return img;
+ }
+
+ // Deal with 1 Bit images using IndexColorModels
+ private Image read1Bit(int paletteEntries) throws IOException, BadElementException {
+ byte bdata[] = new byte[((width + 7) / 8) * height];
+ int padding = 0;
+ int bytesPerScanline = (int)Math.ceil((double)width/8.0);
+
+ int remainder = bytesPerScanline % 4;
+ if (remainder != 0) {
+ padding = 4 - remainder;
+ }
+
+ int imSize = (bytesPerScanline + padding) * height;
+
+ // Read till we have the whole image
+ byte values[] = new byte[imSize];
+ int bytesRead = 0;
+ while (bytesRead < imSize) {
+ bytesRead += inputStream.read(values, bytesRead,
+ imSize - bytesRead);
+ }
+
+ if (isBottomUp) {
+
+ // Convert the bottom up image to a top down format by copying
+ // one scanline from the bottom to the top at a time.
+
+ for (int i=0; i<height; i++) {
+ System.arraycopy(values,
+ imSize - (i+1)*(bytesPerScanline + padding),
+ bdata,
+ i*bytesPerScanline, bytesPerScanline);
+ }
+ } else {
+
+ for (int i=0; i<height; i++) {
+ System.arraycopy(values,
+ i * (bytesPerScanline + padding),
+ bdata,
+ i * bytesPerScanline,
+ bytesPerScanline);
+ }
+ }
+ return indexedModel(bdata, 1, paletteEntries);
+ }
+
+ // Method to read a 4 bit BMP image data
+ private Image read4Bit(int paletteEntries) throws IOException, BadElementException {
+ byte bdata[] = new byte[((width + 1) / 2) * height];
+
+ // Padding bytes at the end of each scanline
+ int padding = 0;
+
+ int bytesPerScanline = (int)Math.ceil((double)width/2.0);
+ int remainder = bytesPerScanline % 4;
+ if (remainder != 0) {
+ padding = 4 - remainder;
+ }
+
+ int imSize = (bytesPerScanline + padding) * height;
+
+ // Read till we have the whole image
+ byte values[] = new byte[imSize];
+ int bytesRead = 0;
+ while (bytesRead < imSize) {
+ bytesRead += inputStream.read(values, bytesRead,
+ imSize - bytesRead);
+ }
+
+ if (isBottomUp) {
+
+ // Convert the bottom up image to a top down format by copying
+ // one scanline from the bottom to the top at a time.
+ for (int i=0; i<height; i++) {
+ System.arraycopy(values,
+ imSize - (i+1)*(bytesPerScanline + padding),
+ bdata,
+ i*bytesPerScanline,
+ bytesPerScanline);
+ }
+ } else {
+ for (int i=0; i<height; i++) {
+ System.arraycopy(values,
+ i * (bytesPerScanline + padding),
+ bdata,
+ i * bytesPerScanline,
+ bytesPerScanline);
+ }
+ }
+ return indexedModel(bdata, 4, paletteEntries);
+ }
+
+ // Method to read 8 bit BMP image data
+ private Image read8Bit(int paletteEntries) throws IOException, BadElementException {
+ byte bdata[] = new byte[width * height];
+ // Padding bytes at the end of each scanline
+ int padding = 0;
+
+ // width * bitsPerPixel should be divisible by 32
+ int bitsPerScanline = width * 8;
+ if ( bitsPerScanline%32 != 0) {
+ padding = (bitsPerScanline/32 + 1)*32 - bitsPerScanline;
+ padding = (int)Math.ceil(padding/8.0);
+ }
+
+ int imSize = (width + padding) * height;
+
+ // Read till we have the whole image
+ byte values[] = new byte[imSize];
+ int bytesRead = 0;
+ while (bytesRead < imSize) {
+ bytesRead += inputStream.read(values, bytesRead, imSize - bytesRead);
+ }
+
+ if (isBottomUp) {
+
+ // Convert the bottom up image to a top down format by copying
+ // one scanline from the bottom to the top at a time.
+ for (int i=0; i<height; i++) {
+ System.arraycopy(values,
+ imSize - (i+1) * (width + padding),
+ bdata,
+ i * width,
+ width);
+ }
+ } else {
+ for (int i=0; i<height; i++) {
+ System.arraycopy(values,
+ i * (width + padding),
+ bdata,
+ i * width,
+ width);
+ }
+ }
+ return indexedModel(bdata, 8, paletteEntries);
+ }
+
+ // Method to read 24 bit BMP image data
+ private void read24Bit(byte[] bdata) {
+ // Padding bytes at the end of each scanline
+ int padding = 0;
+
+ // width * bitsPerPixel should be divisible by 32
+ int bitsPerScanline = width * 24;
+ if ( bitsPerScanline%32 != 0) {
+ padding = (bitsPerScanline/32 + 1)*32 - bitsPerScanline;
+ padding = (int)Math.ceil(padding/8.0);
+ }
+
+
+ int imSize = ((width * 3 + 3) / 4 * 4) * height;
+ // Read till we have the whole image
+ byte values[] = new byte[imSize];
+ try {
+ int bytesRead = 0;
+ while (bytesRead < imSize) {
+ int r = inputStream.read(values, bytesRead,
+ imSize - bytesRead);
+ if (r < 0)
+ break;
+ bytesRead += r;
+ }
+ } catch (IOException ioe) {
+ throw new ExceptionConverter(ioe);
+ }
+
+ int l=0, count;
+
+ if (isBottomUp) {
+ int max = width*height*3-1;
+
+ count = -padding;
+ for (int i=0; i<height; i++) {
+ l = max - (i+1)*width*3 + 1;
+ count += padding;
+ for (int j=0; j<width; j++) {
+ bdata[l + 2] = values[count++];
+ bdata[l + 1] = values[count++];
+ bdata[l] = values[count++];
+ l += 3;
+ }
+ }
+ } else {
+ count = -padding;
+ for (int i=0; i<height; i++) {
+ count += padding;
+ for (int j=0; j<width; j++) {
+ bdata[l + 2] = values[count++];
+ bdata[l + 1] = values[count++];
+ bdata[l] = values[count++];
+ l += 3;
+ }
+ }
+ }
+ }
+
+ private int findMask(int mask) {
+ int k = 0;
+ for (; k < 32; ++k) {
+ if ((mask & 1) == 1)
+ break;
+ mask >>>= 1;
+ }
+ return mask;
+ }
+
+ private int findShift(int mask) {
+ int k = 0;
+ for (; k < 32; ++k) {
+ if ((mask & 1) == 1)
+ break;
+ mask >>>= 1;
+ }
+ return k;
+ }
+
+ private Image read1632Bit(boolean is32) throws IOException, BadElementException {
+
+ int red_mask = findMask(redMask);
+ int red_shift = findShift(redMask);
+ int red_factor = red_mask + 1;
+ int green_mask = findMask(greenMask);
+ int green_shift = findShift(greenMask);
+ int green_factor = green_mask + 1;
+ int blue_mask = findMask(blueMask);
+ int blue_shift = findShift(blueMask);
+ int blue_factor = blue_mask + 1;
+ byte bdata[] = new byte[width * height * 3];
+ // Padding bytes at the end of each scanline
+ int padding = 0;
+
+ if (!is32) {
+ // width * bitsPerPixel should be divisible by 32
+ int bitsPerScanline = width * 16;
+ if ( bitsPerScanline%32 != 0) {
+ padding = (bitsPerScanline/32 + 1)*32 - bitsPerScanline;
+ padding = (int)Math.ceil(padding/8.0);
+ }
+ }
+
+ int imSize = (int)imageSize;
+ if (imSize == 0) {
+ imSize = (int)(bitmapFileSize - bitmapOffset);
+ }
+
+ int l=0;
+ int v;
+ if (isBottomUp) {
+ for (int i=height - 1; i >= 0; --i) {
+ l = width * 3 * i;
+ for (int j=0; j<width; j++) {
+ if (is32)
+ v = (int)readDWord(inputStream);
+ else
+ v = readWord(inputStream);
+ bdata[l++] = (byte)(((v >>> red_shift) & red_mask) * 256 / red_factor);
+ bdata[l++] = (byte)(((v >>> green_shift) & green_mask) * 256 / green_factor);
+ bdata[l++] = (byte)(((v >>> blue_shift) & blue_mask) * 256 / blue_factor);
+ }
+ for (int m=0; m<padding; m++) {
+ inputStream.read();
+ }
+ }
+ } else {
+ for (int i=0; i<height; i++) {
+ for (int j=0; j<width; j++) {
+ if (is32)
+ v = (int)readDWord(inputStream);
+ else
+ v = readWord(inputStream);
+ bdata[l++] = (byte)(((v >>> red_shift) & red_mask) * 256 / red_factor);
+ bdata[l++] = (byte)(((v >>> green_shift) & green_mask) * 256 / green_factor);
+ bdata[l++] = (byte)(((v >>> blue_shift) & blue_mask) * 256 / blue_factor);
+ }
+ for (int m=0; m<padding; m++) {
+ inputStream.read();
+ }
+ }
+ }
+ return new ImgRaw(width, height, 3, 8, bdata);
+ }
+
+ private Image readRLE8() throws IOException, BadElementException {
+
+ // If imageSize field is not provided, calculate it.
+ int imSize = (int)imageSize;
+ if (imSize == 0) {
+ imSize = (int)(bitmapFileSize - bitmapOffset);
+ }
+
+ // Read till we have the whole image
+ byte values[] = new byte[imSize];
+ int bytesRead = 0;
+ while (bytesRead < imSize) {
+ bytesRead += inputStream.read(values, bytesRead,
+ imSize - bytesRead);
+ }
+
+ // Since data is compressed, decompress it
+ byte val[] = decodeRLE(true, values);
+
+ // Uncompressed data does not have any padding
+ imSize = width * height;
+
+ if (isBottomUp) {
+
+ // Convert the bottom up image to a top down format by copying
+ // one scanline from the bottom to the top at a time.
+ // int bytesPerScanline = (int)Math.ceil((double)width/8.0);
+ byte temp[] = new byte[val.length];
+ int bytesPerScanline = width;
+ for (int i=0; i<height; i++) {
+ System.arraycopy(val,
+ imSize - (i+1)*(bytesPerScanline),
+ temp,
+ i*bytesPerScanline, bytesPerScanline);
+ }
+ val = temp;
+ }
+ return indexedModel(val, 8, 4);
+ }
+
+ private Image readRLE4() throws IOException, BadElementException {
+
+ // If imageSize field is not specified, calculate it.
+ int imSize = (int)imageSize;
+ if (imSize == 0) {
+ imSize = (int)(bitmapFileSize - bitmapOffset);
+ }
+
+ // Read till we have the whole image
+ byte values[] = new byte[imSize];
+ int bytesRead = 0;
+ while (bytesRead < imSize) {
+ bytesRead += inputStream.read(values, bytesRead,
+ imSize - bytesRead);
+ }
+
+ // Decompress the RLE4 compressed data.
+ byte val[] = decodeRLE(false, values);
+
+ // Invert it as it is bottom up format.
+ if (isBottomUp) {
+
+ byte inverted[] = val;
+ val = new byte[width * height];
+ int l = 0, index, lineEnd;
+
+ for (int i = height-1; i >= 0; i--) {
+ index = i * width;
+ lineEnd = l + width;
+ while(l != lineEnd) {
+ val[l++] = inverted[index++];
+ }
+ }
+ }
+ int stride = ((width + 1) / 2);
+ byte bdata[] = new byte[stride * height];
+ int ptr = 0;
+ int sh = 0;
+ for (int h = 0; h < height; ++h) {
+ for (int w = 0; w < width; ++w) {
+ if ((w & 1) == 0)
+ bdata[sh + w / 2] = (byte)(val[ptr++] << 4);
+ else
+ bdata[sh + w / 2] |= (byte)(val[ptr++] & 0x0f);
+ }
+ sh += stride;
+ }
+ return indexedModel(bdata, 4, 4);
+ }
+
+ private byte[] decodeRLE(boolean is8, byte values[]) {
+ byte val[] = new byte[width * height];
+ try {
+ int ptr = 0;
+ int x = 0;
+ int q = 0;
+ for (int y = 0; y < height && ptr < values.length;) {
+ int count = values[ptr++] & 0xff;
+ if (count != 0) {
+ // encoded mode
+ int bt = values[ptr++] & 0xff;
+ if (is8) {
+ for (int i = count; i != 0; --i) {
+ val[q++] = (byte)bt;
+ }
+ }
+ else {
+ for (int i = 0; i < count; ++i) {
+ val[q++] = (byte)((i & 1) == 1 ? (bt & 0x0f) : ((bt >>> 4) & 0x0f));
+ }
+ }
+ x += count;
+ }
+ else {
+ // escape mode
+ count = values[ptr++] & 0xff;
+ if (count == 1)
+ break;
+ switch (count) {
+ case 0:
+ x = 0;
+ ++y;
+ q = y * width;
+ break;
+ case 2:
+ // delta mode
+ x += values[ptr++] & 0xff;
+ y += values[ptr++] & 0xff;
+ q = y * width + x;
+ break;
+ default:
+ // absolute mode
+ if (is8) {
+ for (int i = count; i != 0; --i)
+ val[q++] = (byte)(values[ptr++] & 0xff);
+ }
+ else {
+ int bt = 0;
+ for (int i = 0; i < count; ++i) {
+ if ((i & 1) == 0)
+ bt = values[ptr++] & 0xff;
+ val[q++] = (byte)((i & 1) == 1 ? (bt & 0x0f) : ((bt >>> 4) & 0x0f));
+ }
+ }
+ x += count;
+ // read pad byte
+ if (is8) {
+ if ((count & 1) == 1)
+ ++ptr;
+ }
+ else {
+ if ((count & 3) == 1 || (count & 3) == 2)
+ ++ptr;
+ }
+ break;
+ }
+ }
+ }
+ }
+ catch (Exception e) {
+ //empty on purpose
+ }
+
+ return val;
+ }
+
+ // Windows defined data type reading methods - everything is little endian
+
+ // Unsigned 8 bits
+ private int readUnsignedByte(InputStream stream) throws IOException {
+ return (stream.read() & 0xff);
+ }
+
+ // Unsigned 2 bytes
+ private int readUnsignedShort(InputStream stream) throws IOException {
+ int b1 = readUnsignedByte(stream);
+ int b2 = readUnsignedByte(stream);
+ return ((b2 << 8) | b1) & 0xffff;
+ }
+
+ // Signed 16 bits
+ private int readShort(InputStream stream) throws IOException {
+ int b1 = readUnsignedByte(stream);
+ int b2 = readUnsignedByte(stream);
+ return (b2 << 8) | b1;
+ }
+
+ // Unsigned 16 bits
+ private int readWord(InputStream stream) throws IOException {
+ return readUnsignedShort(stream);
+ }
+
+ // Unsigned 4 bytes
+ private long readUnsignedInt(InputStream stream) throws IOException {
+ int b1 = readUnsignedByte(stream);
+ int b2 = readUnsignedByte(stream);
+ int b3 = readUnsignedByte(stream);
+ int b4 = readUnsignedByte(stream);
+ long l = (long)((b4 << 24) | (b3 << 16) | (b2 << 8) | b1);
+ return l & 0xffffffff;
+ }
+
+ // Signed 4 bytes
+ private int readInt(InputStream stream) throws IOException {
+ int b1 = readUnsignedByte(stream);
+ int b2 = readUnsignedByte(stream);
+ int b3 = readUnsignedByte(stream);
+ int b4 = readUnsignedByte(stream);
+ return (b4 << 24) | (b3 << 16) | (b2 << 8) | b1;
+ }
+
+ // Unsigned 4 bytes
+ private long readDWord(InputStream stream) throws IOException {
+ return readUnsignedInt(stream);
+ }
+
+ // 32 bit signed value
+ private int readLong(InputStream stream) throws IOException {
+ return readInt(stream);
+ }
+}
diff --git a/src/main/java/com/lowagie/text/pdf/codec/CCITTG4Encoder.java b/src/main/java/com/lowagie/text/pdf/codec/CCITTG4Encoder.java
new file mode 100644
index 0000000..ae67be1
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/codec/CCITTG4Encoder.java
@@ -0,0 +1,600 @@
+/*
+ * Copyright 2005 by Paulo Soares.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ *
+ * This code is base in the libtiff encoder
+ */
+package com.lowagie.text.pdf.codec;
+
+import com.lowagie.text.pdf.ByteBuffer;
+
+/**
+ * Encodes data in the CCITT G4 FAX format.
+ */
+public class CCITTG4Encoder {
+ private int rowbytes;
+ private int rowpixels;
+ private int bit = 8;
+ private int data;
+ private byte[] refline;
+ private ByteBuffer outBuf = new ByteBuffer(1024);
+ private byte[] dataBp;
+ private int offsetData;
+ private int sizeData;
+
+ /**
+ * Creates a new encoder.
+ * @param width the line width
+ */
+ public CCITTG4Encoder(int width) {
+ rowpixels = width;
+ rowbytes = (rowpixels + 7) / 8;
+ refline = new byte[rowbytes];
+ }
+
+ /**
+ * Encodes a number of lines.
+ * @param data the data to be encoded
+ * @param offset the offset into the data
+ * @param size the size of the data to be encoded
+ */
+ public void fax4Encode(byte[] data, int offset, int size) {
+ dataBp = data;
+ offsetData = offset;
+ sizeData = size;
+ while (sizeData > 0) {
+ Fax3Encode2DRow();
+ System.arraycopy(dataBp, offsetData, refline, 0, rowbytes);
+ offsetData += rowbytes;
+ sizeData -= rowbytes;
+ }
+ }
+
+
+ /**
+ * Encodes a full image.
+ * @param data the data to encode
+ * @param width the image width
+ * @param height the image height
+ * @return the encoded image
+ */
+ public static byte[] compress(byte[] data, int width, int height) {
+ CCITTG4Encoder g4 = new CCITTG4Encoder(width);
+ g4.fax4Encode(data, 0, g4.rowbytes * height);
+ return g4.close();
+ }
+
+ /**
+ * Encodes a number of lines.
+ * @param data the data to be encoded
+ * @param height the number of lines to encode
+ */
+ public void fax4Encode(byte[] data, int height) {
+ fax4Encode(data, 0, rowbytes * height);
+ }
+
+ private void putcode(int[] table) {
+ putBits(table[CODE], table[LENGTH]);
+ }
+
+ private void putspan(int span, int[][] tab) {
+ int code, length;
+
+ while (span >= 2624) {
+ int[] te = tab[63 + (2560>>6)];
+ code = te[CODE];
+ length = te[LENGTH];
+ putBits(code, length);
+ span -= te[RUNLEN];
+ }
+ if (span >= 64) {
+ int[] te = tab[63 + (span>>6)];
+ code = te[CODE];
+ length = te[LENGTH];
+ putBits(code, length);
+ span -= te[RUNLEN];
+ }
+ code = tab[span][CODE];
+ length = tab[span][LENGTH];
+ putBits(code, length);
+ }
+
+ private void putBits(int bits, int length) {
+ while (length > bit) {
+ data |= bits >> (length - bit);
+ length -= bit;
+ outBuf.append((byte)data);
+ data = 0;
+ bit = 8;
+ }
+ data |= (bits & msbmask[length]) << (bit - length);
+ bit -= length;
+ if (bit == 0) {
+ outBuf.append((byte)data);
+ data = 0;
+ bit = 8;
+ }
+ }
+
+ private void Fax3Encode2DRow() {
+ int a0 = 0;
+ int a1 = (pixel(dataBp, offsetData, 0) != 0 ? 0 : finddiff(dataBp, offsetData, 0, rowpixels, 0));
+ int b1 = (pixel(refline, 0, 0) != 0 ? 0 : finddiff(refline, 0, 0, rowpixels, 0));
+ int a2, b2;
+
+ for (;;) {
+ b2 = finddiff2(refline, 0, b1, rowpixels, pixel(refline, 0,b1));
+ if (b2 >= a1) {
+ int d = b1 - a1;
+ if (!(-3 <= d && d <= 3)) { /* horizontal mode */
+ a2 = finddiff2(dataBp, offsetData, a1, rowpixels, pixel(dataBp, offsetData,a1));
+ putcode(horizcode);
+ if (a0+a1 == 0 || pixel(dataBp, offsetData, a0) == 0) {
+ putspan(a1-a0, TIFFFaxWhiteCodes);
+ putspan(a2-a1, TIFFFaxBlackCodes);
+ } else {
+ putspan(a1-a0, TIFFFaxBlackCodes);
+ putspan(a2-a1, TIFFFaxWhiteCodes);
+ }
+ a0 = a2;
+ } else { /* vertical mode */
+ putcode(vcodes[d+3]);
+ a0 = a1;
+ }
+ } else { /* pass mode */
+ putcode(passcode);
+ a0 = b2;
+ }
+ if (a0 >= rowpixels)
+ break;
+ a1 = finddiff(dataBp, offsetData, a0, rowpixels, pixel(dataBp, offsetData,a0));
+ b1 = finddiff(refline, 0, a0, rowpixels, pixel(dataBp, offsetData,a0) ^ 1);
+ b1 = finddiff(refline, 0, b1, rowpixels, pixel(dataBp, offsetData,a0));
+ }
+ }
+
+ private void Fax4PostEncode() {
+ putBits(EOL, 12);
+ putBits(EOL, 12);
+ if (bit != 8) {
+ outBuf.append((byte)data);
+ data = 0;
+ bit = 8;
+ }
+ }
+
+ /**
+ * Closes the encoder and returns the encoded data.
+ * @return the encoded data
+ */
+ public byte[] close() {
+ Fax4PostEncode();
+ return outBuf.toByteArray();
+ }
+
+ private int pixel(byte[] data, int offset, int bit) {
+ if (bit >= rowpixels)
+ return 0;
+ return ((data[offset + (bit >> 3)] & 0xff) >> (7-((bit)&7))) & 1;
+ }
+
+ private static int find1span(byte[] bp, int offset, int bs, int be) {
+ int bits = be - bs;
+ int n, span;
+
+ int pos = offset + (bs >> 3);
+ /*
+ * Check partial byte on lhs.
+ */
+ if (bits > 0 && (n = (bs & 7)) != 0) {
+ span = oneruns[((int)bp[pos] << n) & 0xff];
+ if (span > 8-n) /* table value too generous */
+ span = 8-n;
+ if (span > bits) /* constrain span to bit range */
+ span = bits;
+ if (n+span < 8) /* doesn't extend to edge of byte */
+ return (span);
+ bits -= span;
+ pos++;
+ } else
+ span = 0;
+ /*
+ * Scan full bytes for all 1's.
+ */
+ while (bits >= 8) {
+ if (bp[pos] != -1) /* end of run */
+ return (span + oneruns[bp[pos] & 0xff]);
+ span += 8;
+ bits -= 8;
+ pos++;
+ }
+ /*
+ * Check partial byte on rhs.
+ */
+ if (bits > 0) {
+ n = oneruns[bp[pos] & 0xff];
+ span += (n > bits ? bits : n);
+ }
+ return (span);
+ }
+
+ private static int find0span(byte[] bp, int offset, int bs, int be) {
+ int bits = be - bs;
+ int n, span;
+
+ int pos = offset + (bs >> 3);
+ /*
+ * Check partial byte on lhs.
+ */
+ if (bits > 0 && (n = (bs & 7)) != 0) {
+ span = zeroruns[((int)bp[pos] << n) & 0xff];
+ if (span > 8-n) /* table value too generous */
+ span = 8-n;
+ if (span > bits) /* constrain span to bit range */
+ span = bits;
+ if (n+span < 8) /* doesn't extend to edge of byte */
+ return (span);
+ bits -= span;
+ pos++;
+ } else
+ span = 0;
+ /*
+ * Scan full bytes for all 1's.
+ */
+ while (bits >= 8) {
+ if (bp[pos] != 0) /* end of run */
+ return (span + zeroruns[bp[pos] & 0xff]);
+ span += 8;
+ bits -= 8;
+ pos++;
+ }
+ /*
+ * Check partial byte on rhs.
+ */
+ if (bits > 0) {
+ n = zeroruns[bp[pos] & 0xff];
+ span += (n > bits ? bits : n);
+ }
+ return (span);
+ }
+
+ private static int finddiff(byte[] bp, int offset, int bs, int be, int color) {
+ return bs + (color != 0 ? find1span(bp, offset, bs, be) : find0span(bp, offset, bs, be));
+ }
+
+ private static int finddiff2(byte[] bp, int offset, int bs, int be, int color) {
+ return bs < be ? finddiff(bp, offset, bs, be, color) : be;
+ }
+
+ private static byte zeroruns[] = {
+ 8, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, /* 0x00 - 0x0f */
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, /* 0x10 - 0x1f */
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, /* 0x20 - 0x2f */
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, /* 0x30 - 0x3f */
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0x40 - 0x4f */
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0x50 - 0x5f */
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0x60 - 0x6f */
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0x70 - 0x7f */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 - 0x8f */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 - 0x9f */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xa0 - 0xaf */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xb0 - 0xbf */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xc0 - 0xcf */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xd0 - 0xdf */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xe0 - 0xef */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 /* 0xf0 - 0xff */
+ };
+
+ private static byte oneruns[] = {
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x00 - 0x0f */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 - 0x1f */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 - 0x2f */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 - 0x3f */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 - 0x4f */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 - 0x5f */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 - 0x6f */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 - 0x7f */
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0x80 - 0x8f */
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0x90 - 0x9f */
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0xa0 - 0xaf */
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0xb0 - 0xbf */
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, /* 0xc0 - 0xcf */
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, /* 0xd0 - 0xdf */
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, /* 0xe0 - 0xef */
+ 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 7, 8 /* 0xf0 - 0xff */
+ };
+
+ private static final int LENGTH = 0; /* bit length of g3 code */
+ private static final int CODE = 1; /* g3 code */
+ private static final int RUNLEN = 2; /* run length in bits */
+
+ private static final int EOL = 0x001; /* EOL code value - 0000 0000 0000 1 */
+
+ /* status values returned instead of a run length */
+ private static final int G3CODE_EOL = -1; /* NB: ACT_EOL - ACT_WRUNT */
+ private static final int G3CODE_INVALID = -2; /* NB: ACT_INVALID - ACT_WRUNT */
+ private static final int G3CODE_EOF = -3; /* end of input data */
+ private static final int G3CODE_INCOMP = -4; /* incomplete run code */
+
+ private int[][] TIFFFaxWhiteCodes = {
+ { 8, 0x35, 0 }, /* 0011 0101 */
+ { 6, 0x7, 1 }, /* 0001 11 */
+ { 4, 0x7, 2 }, /* 0111 */
+ { 4, 0x8, 3 }, /* 1000 */
+ { 4, 0xB, 4 }, /* 1011 */
+ { 4, 0xC, 5 }, /* 1100 */
+ { 4, 0xE, 6 }, /* 1110 */
+ { 4, 0xF, 7 }, /* 1111 */
+ { 5, 0x13, 8 }, /* 1001 1 */
+ { 5, 0x14, 9 }, /* 1010 0 */
+ { 5, 0x7, 10 }, /* 0011 1 */
+ { 5, 0x8, 11 }, /* 0100 0 */
+ { 6, 0x8, 12 }, /* 0010 00 */
+ { 6, 0x3, 13 }, /* 0000 11 */
+ { 6, 0x34, 14 }, /* 1101 00 */
+ { 6, 0x35, 15 }, /* 1101 01 */
+ { 6, 0x2A, 16 }, /* 1010 10 */
+ { 6, 0x2B, 17 }, /* 1010 11 */
+ { 7, 0x27, 18 }, /* 0100 111 */
+ { 7, 0xC, 19 }, /* 0001 100 */
+ { 7, 0x8, 20 }, /* 0001 000 */
+ { 7, 0x17, 21 }, /* 0010 111 */
+ { 7, 0x3, 22 }, /* 0000 011 */
+ { 7, 0x4, 23 }, /* 0000 100 */
+ { 7, 0x28, 24 }, /* 0101 000 */
+ { 7, 0x2B, 25 }, /* 0101 011 */
+ { 7, 0x13, 26 }, /* 0010 011 */
+ { 7, 0x24, 27 }, /* 0100 100 */
+ { 7, 0x18, 28 }, /* 0011 000 */
+ { 8, 0x2, 29 }, /* 0000 0010 */
+ { 8, 0x3, 30 }, /* 0000 0011 */
+ { 8, 0x1A, 31 }, /* 0001 1010 */
+ { 8, 0x1B, 32 }, /* 0001 1011 */
+ { 8, 0x12, 33 }, /* 0001 0010 */
+ { 8, 0x13, 34 }, /* 0001 0011 */
+ { 8, 0x14, 35 }, /* 0001 0100 */
+ { 8, 0x15, 36 }, /* 0001 0101 */
+ { 8, 0x16, 37 }, /* 0001 0110 */
+ { 8, 0x17, 38 }, /* 0001 0111 */
+ { 8, 0x28, 39 }, /* 0010 1000 */
+ { 8, 0x29, 40 }, /* 0010 1001 */
+ { 8, 0x2A, 41 }, /* 0010 1010 */
+ { 8, 0x2B, 42 }, /* 0010 1011 */
+ { 8, 0x2C, 43 }, /* 0010 1100 */
+ { 8, 0x2D, 44 }, /* 0010 1101 */
+ { 8, 0x4, 45 }, /* 0000 0100 */
+ { 8, 0x5, 46 }, /* 0000 0101 */
+ { 8, 0xA, 47 }, /* 0000 1010 */
+ { 8, 0xB, 48 }, /* 0000 1011 */
+ { 8, 0x52, 49 }, /* 0101 0010 */
+ { 8, 0x53, 50 }, /* 0101 0011 */
+ { 8, 0x54, 51 }, /* 0101 0100 */
+ { 8, 0x55, 52 }, /* 0101 0101 */
+ { 8, 0x24, 53 }, /* 0010 0100 */
+ { 8, 0x25, 54 }, /* 0010 0101 */
+ { 8, 0x58, 55 }, /* 0101 1000 */
+ { 8, 0x59, 56 }, /* 0101 1001 */
+ { 8, 0x5A, 57 }, /* 0101 1010 */
+ { 8, 0x5B, 58 }, /* 0101 1011 */
+ { 8, 0x4A, 59 }, /* 0100 1010 */
+ { 8, 0x4B, 60 }, /* 0100 1011 */
+ { 8, 0x32, 61 }, /* 0011 0010 */
+ { 8, 0x33, 62 }, /* 0011 0011 */
+ { 8, 0x34, 63 }, /* 0011 0100 */
+ { 5, 0x1B, 64 }, /* 1101 1 */
+ { 5, 0x12, 128 }, /* 1001 0 */
+ { 6, 0x17, 192 }, /* 0101 11 */
+ { 7, 0x37, 256 }, /* 0110 111 */
+ { 8, 0x36, 320 }, /* 0011 0110 */
+ { 8, 0x37, 384 }, /* 0011 0111 */
+ { 8, 0x64, 448 }, /* 0110 0100 */
+ { 8, 0x65, 512 }, /* 0110 0101 */
+ { 8, 0x68, 576 }, /* 0110 1000 */
+ { 8, 0x67, 640 }, /* 0110 0111 */
+ { 9, 0xCC, 704 }, /* 0110 0110 0 */
+ { 9, 0xCD, 768 }, /* 0110 0110 1 */
+ { 9, 0xD2, 832 }, /* 0110 1001 0 */
+ { 9, 0xD3, 896 }, /* 0110 1001 1 */
+ { 9, 0xD4, 960 }, /* 0110 1010 0 */
+ { 9, 0xD5, 1024 }, /* 0110 1010 1 */
+ { 9, 0xD6, 1088 }, /* 0110 1011 0 */
+ { 9, 0xD7, 1152 }, /* 0110 1011 1 */
+ { 9, 0xD8, 1216 }, /* 0110 1100 0 */
+ { 9, 0xD9, 1280 }, /* 0110 1100 1 */
+ { 9, 0xDA, 1344 }, /* 0110 1101 0 */
+ { 9, 0xDB, 1408 }, /* 0110 1101 1 */
+ { 9, 0x98, 1472 }, /* 0100 1100 0 */
+ { 9, 0x99, 1536 }, /* 0100 1100 1 */
+ { 9, 0x9A, 1600 }, /* 0100 1101 0 */
+ { 6, 0x18, 1664 }, /* 0110 00 */
+ { 9, 0x9B, 1728 }, /* 0100 1101 1 */
+ { 11, 0x8, 1792 }, /* 0000 0001 000 */
+ { 11, 0xC, 1856 }, /* 0000 0001 100 */
+ { 11, 0xD, 1920 }, /* 0000 0001 101 */
+ { 12, 0x12, 1984 }, /* 0000 0001 0010 */
+ { 12, 0x13, 2048 }, /* 0000 0001 0011 */
+ { 12, 0x14, 2112 }, /* 0000 0001 0100 */
+ { 12, 0x15, 2176 }, /* 0000 0001 0101 */
+ { 12, 0x16, 2240 }, /* 0000 0001 0110 */
+ { 12, 0x17, 2304 }, /* 0000 0001 0111 */
+ { 12, 0x1C, 2368 }, /* 0000 0001 1100 */
+ { 12, 0x1D, 2432 }, /* 0000 0001 1101 */
+ { 12, 0x1E, 2496 }, /* 0000 0001 1110 */
+ { 12, 0x1F, 2560 }, /* 0000 0001 1111 */
+ { 12, 0x1, G3CODE_EOL }, /* 0000 0000 0001 */
+ { 9, 0x1, G3CODE_INVALID }, /* 0000 0000 1 */
+ { 10, 0x1, G3CODE_INVALID }, /* 0000 0000 01 */
+ { 11, 0x1, G3CODE_INVALID }, /* 0000 0000 001 */
+ { 12, 0x0, G3CODE_INVALID } /* 0000 0000 0000 */
+ };
+
+ private int[][] TIFFFaxBlackCodes = {
+ { 10, 0x37, 0 }, /* 0000 1101 11 */
+ { 3, 0x2, 1 }, /* 010 */
+ { 2, 0x3, 2 }, /* 11 */
+ { 2, 0x2, 3 }, /* 10 */
+ { 3, 0x3, 4 }, /* 011 */
+ { 4, 0x3, 5 }, /* 0011 */
+ { 4, 0x2, 6 }, /* 0010 */
+ { 5, 0x3, 7 }, /* 0001 1 */
+ { 6, 0x5, 8 }, /* 0001 01 */
+ { 6, 0x4, 9 }, /* 0001 00 */
+ { 7, 0x4, 10 }, /* 0000 100 */
+ { 7, 0x5, 11 }, /* 0000 101 */
+ { 7, 0x7, 12 }, /* 0000 111 */
+ { 8, 0x4, 13 }, /* 0000 0100 */
+ { 8, 0x7, 14 }, /* 0000 0111 */
+ { 9, 0x18, 15 }, /* 0000 1100 0 */
+ { 10, 0x17, 16 }, /* 0000 0101 11 */
+ { 10, 0x18, 17 }, /* 0000 0110 00 */
+ { 10, 0x8, 18 }, /* 0000 0010 00 */
+ { 11, 0x67, 19 }, /* 0000 1100 111 */
+ { 11, 0x68, 20 }, /* 0000 1101 000 */
+ { 11, 0x6C, 21 }, /* 0000 1101 100 */
+ { 11, 0x37, 22 }, /* 0000 0110 111 */
+ { 11, 0x28, 23 }, /* 0000 0101 000 */
+ { 11, 0x17, 24 }, /* 0000 0010 111 */
+ { 11, 0x18, 25 }, /* 0000 0011 000 */
+ { 12, 0xCA, 26 }, /* 0000 1100 1010 */
+ { 12, 0xCB, 27 }, /* 0000 1100 1011 */
+ { 12, 0xCC, 28 }, /* 0000 1100 1100 */
+ { 12, 0xCD, 29 }, /* 0000 1100 1101 */
+ { 12, 0x68, 30 }, /* 0000 0110 1000 */
+ { 12, 0x69, 31 }, /* 0000 0110 1001 */
+ { 12, 0x6A, 32 }, /* 0000 0110 1010 */
+ { 12, 0x6B, 33 }, /* 0000 0110 1011 */
+ { 12, 0xD2, 34 }, /* 0000 1101 0010 */
+ { 12, 0xD3, 35 }, /* 0000 1101 0011 */
+ { 12, 0xD4, 36 }, /* 0000 1101 0100 */
+ { 12, 0xD5, 37 }, /* 0000 1101 0101 */
+ { 12, 0xD6, 38 }, /* 0000 1101 0110 */
+ { 12, 0xD7, 39 }, /* 0000 1101 0111 */
+ { 12, 0x6C, 40 }, /* 0000 0110 1100 */
+ { 12, 0x6D, 41 }, /* 0000 0110 1101 */
+ { 12, 0xDA, 42 }, /* 0000 1101 1010 */
+ { 12, 0xDB, 43 }, /* 0000 1101 1011 */
+ { 12, 0x54, 44 }, /* 0000 0101 0100 */
+ { 12, 0x55, 45 }, /* 0000 0101 0101 */
+ { 12, 0x56, 46 }, /* 0000 0101 0110 */
+ { 12, 0x57, 47 }, /* 0000 0101 0111 */
+ { 12, 0x64, 48 }, /* 0000 0110 0100 */
+ { 12, 0x65, 49 }, /* 0000 0110 0101 */
+ { 12, 0x52, 50 }, /* 0000 0101 0010 */
+ { 12, 0x53, 51 }, /* 0000 0101 0011 */
+ { 12, 0x24, 52 }, /* 0000 0010 0100 */
+ { 12, 0x37, 53 }, /* 0000 0011 0111 */
+ { 12, 0x38, 54 }, /* 0000 0011 1000 */
+ { 12, 0x27, 55 }, /* 0000 0010 0111 */
+ { 12, 0x28, 56 }, /* 0000 0010 1000 */
+ { 12, 0x58, 57 }, /* 0000 0101 1000 */
+ { 12, 0x59, 58 }, /* 0000 0101 1001 */
+ { 12, 0x2B, 59 }, /* 0000 0010 1011 */
+ { 12, 0x2C, 60 }, /* 0000 0010 1100 */
+ { 12, 0x5A, 61 }, /* 0000 0101 1010 */
+ { 12, 0x66, 62 }, /* 0000 0110 0110 */
+ { 12, 0x67, 63 }, /* 0000 0110 0111 */
+ { 10, 0xF, 64 }, /* 0000 0011 11 */
+ { 12, 0xC8, 128 }, /* 0000 1100 1000 */
+ { 12, 0xC9, 192 }, /* 0000 1100 1001 */
+ { 12, 0x5B, 256 }, /* 0000 0101 1011 */
+ { 12, 0x33, 320 }, /* 0000 0011 0011 */
+ { 12, 0x34, 384 }, /* 0000 0011 0100 */
+ { 12, 0x35, 448 }, /* 0000 0011 0101 */
+ { 13, 0x6C, 512 }, /* 0000 0011 0110 0 */
+ { 13, 0x6D, 576 }, /* 0000 0011 0110 1 */
+ { 13, 0x4A, 640 }, /* 0000 0010 0101 0 */
+ { 13, 0x4B, 704 }, /* 0000 0010 0101 1 */
+ { 13, 0x4C, 768 }, /* 0000 0010 0110 0 */
+ { 13, 0x4D, 832 }, /* 0000 0010 0110 1 */
+ { 13, 0x72, 896 }, /* 0000 0011 1001 0 */
+ { 13, 0x73, 960 }, /* 0000 0011 1001 1 */
+ { 13, 0x74, 1024 }, /* 0000 0011 1010 0 */
+ { 13, 0x75, 1088 }, /* 0000 0011 1010 1 */
+ { 13, 0x76, 1152 }, /* 0000 0011 1011 0 */
+ { 13, 0x77, 1216 }, /* 0000 0011 1011 1 */
+ { 13, 0x52, 1280 }, /* 0000 0010 1001 0 */
+ { 13, 0x53, 1344 }, /* 0000 0010 1001 1 */
+ { 13, 0x54, 1408 }, /* 0000 0010 1010 0 */
+ { 13, 0x55, 1472 }, /* 0000 0010 1010 1 */
+ { 13, 0x5A, 1536 }, /* 0000 0010 1101 0 */
+ { 13, 0x5B, 1600 }, /* 0000 0010 1101 1 */
+ { 13, 0x64, 1664 }, /* 0000 0011 0010 0 */
+ { 13, 0x65, 1728 }, /* 0000 0011 0010 1 */
+ { 11, 0x8, 1792 }, /* 0000 0001 000 */
+ { 11, 0xC, 1856 }, /* 0000 0001 100 */
+ { 11, 0xD, 1920 }, /* 0000 0001 101 */
+ { 12, 0x12, 1984 }, /* 0000 0001 0010 */
+ { 12, 0x13, 2048 }, /* 0000 0001 0011 */
+ { 12, 0x14, 2112 }, /* 0000 0001 0100 */
+ { 12, 0x15, 2176 }, /* 0000 0001 0101 */
+ { 12, 0x16, 2240 }, /* 0000 0001 0110 */
+ { 12, 0x17, 2304 }, /* 0000 0001 0111 */
+ { 12, 0x1C, 2368 }, /* 0000 0001 1100 */
+ { 12, 0x1D, 2432 }, /* 0000 0001 1101 */
+ { 12, 0x1E, 2496 }, /* 0000 0001 1110 */
+ { 12, 0x1F, 2560 }, /* 0000 0001 1111 */
+ { 12, 0x1, G3CODE_EOL }, /* 0000 0000 0001 */
+ { 9, 0x1, G3CODE_INVALID }, /* 0000 0000 1 */
+ { 10, 0x1, G3CODE_INVALID }, /* 0000 0000 01 */
+ { 11, 0x1, G3CODE_INVALID }, /* 0000 0000 001 */
+ { 12, 0x0, G3CODE_INVALID } /* 0000 0000 0000 */
+ };
+
+ private int[] horizcode =
+ { 3, 0x1, 0 }; /* 001 */
+ private int[] passcode =
+ { 4, 0x1, 0 }; /* 0001 */
+ private int[][] vcodes = {
+ { 7, 0x03, 0 }, /* 0000 011 */
+ { 6, 0x03, 0 }, /* 0000 11 */
+ { 3, 0x03, 0 }, /* 011 */
+ { 1, 0x1, 0 }, /* 1 */
+ { 3, 0x2, 0 }, /* 010 */
+ { 6, 0x02, 0 }, /* 0000 10 */
+ { 7, 0x02, 0 } /* 0000 010 */
+ };
+ private int[] msbmask =
+ { 0x00, 0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f, 0x7f, 0xff };
+}
diff --git a/src/main/java/com/lowagie/text/pdf/codec/GifImage.java b/src/main/java/com/lowagie/text/pdf/codec/GifImage.java
new file mode 100644
index 0000000..f6858ac
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/codec/GifImage.java
@@ -0,0 +1,593 @@
+/*
+ * Copyright 2003 by Paulo Soares.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+package com.lowagie.text.pdf.codec;
+
+import com.lowagie.text.pdf.*;
+import com.lowagie.text.*;
+import java.io.*;
+import java.net.URL;
+import java.util.ArrayList;
+
+/** Reads gif images of all types. All the images in a gif are read in the constructors
+ * and can be retrieved with other methods.
+ * @author Paulo Soares (psoares@consiste.pt)
+ */
+public class GifImage {
+
+ protected DataInputStream in;
+ protected int width; // full image width
+ protected int height; // full image height
+ protected boolean gctFlag; // global color table used
+
+ protected int bgIndex; // background color index
+ protected int bgColor; // background color
+ protected int pixelAspect; // pixel aspect ratio
+
+ protected boolean lctFlag; // local color table flag
+ protected boolean interlace; // interlace flag
+ protected int lctSize; // local color table size
+
+ protected int ix, iy, iw, ih; // current image rectangle
+
+ protected byte[] block = new byte[256]; // current data block
+ protected int blockSize = 0; // block size
+
+ // last graphic control extension info
+ protected int dispose = 0; // 0=no action; 1=leave in place; 2=restore to bg; 3=restore to prev
+ protected boolean transparency = false; // use transparent color
+ protected int delay = 0; // delay in milliseconds
+ protected int transIndex; // transparent color index
+
+ protected static final int MaxStackSize = 4096; // max decoder pixel stack size
+
+ // LZW decoder working arrays
+ protected short[] prefix;
+ protected byte[] suffix;
+ protected byte[] pixelStack;
+ protected byte[] pixels;
+
+ protected byte m_out[];
+ protected int m_bpc;
+ protected int m_gbpc;
+ protected byte m_global_table[];
+ protected byte m_local_table[];
+ protected byte m_curr_table[];
+ protected int m_line_stride;
+ protected byte fromData[];
+ protected URL fromUrl;
+
+
+ protected ArrayList frames = new ArrayList(); // frames read from current file
+
+ /** Reads gif images from an URL.
+ * @param url the URL
+ * @throws IOException on error
+ */
+ public GifImage(URL url) throws IOException {
+ fromUrl = url;
+ InputStream is = null;
+ try {
+ is = url.openStream();
+ process(is);
+ }
+ finally {
+ if (is != null) {
+ is.close();
+ }
+ }
+ }
+
+ /** Reads gif images from a file.
+ * @param file the file
+ * @throws IOException on error
+ */
+ public GifImage(String file) throws IOException {
+ this(Image.toURL(file));
+ }
+
+ /** Reads gif images from a byte array.
+ * @param data the byte array
+ * @throws IOException on error
+ */
+ public GifImage(byte data[]) throws IOException {
+ fromData = data;
+ InputStream is = null;
+ try {
+ is = new ByteArrayInputStream(data);
+ process(is);
+ }
+ finally {
+ if (is != null) {
+ is.close();
+ }
+ }
+ }
+
+ /** Reads gif images from a stream. The stream is not closed.
+ * @param is the stream
+ * @throws IOException on error
+ */
+ public GifImage(InputStream is) throws IOException {
+ process(is);
+ }
+
+ /** Gets the number of frames the gif has.
+ * @return the number of frames the gif has
+ */
+ public int getFrameCount() {
+ return frames.size();
+ }
+
+ /** Gets the image from a frame. The first frame is 1.
+ * @param frame the frame to get the image from
+ * @return the image
+ */
+ public Image getImage(int frame) {
+ GifFrame gf = (GifFrame)frames.get(frame - 1);
+ return gf.image;
+ }
+
+ /** Gets the [x,y] position of the frame in reference to the
+ * logical screen.
+ * @param frame the frame
+ * @return the [x,y] position of the frame
+ */
+ public int[] getFramePosition(int frame) {
+ GifFrame gf = (GifFrame)frames.get(frame - 1);
+ return new int[]{gf.ix, gf.iy};
+
+ }
+
+ /** Gets the logical screen. The images may be smaller and placed
+ * in some position in this screen to playback some animation.
+ * No image will be be bigger that this.
+ * @return the logical screen dimensions as [x,y]
+ */
+ public int[] getLogicalScreen() {
+ return new int[]{width, height};
+ }
+
+ void process(InputStream is) throws IOException {
+ in = new DataInputStream(new BufferedInputStream(is));
+ readHeader();
+ readContents();
+ if (frames.size() == 0)
+ throw new IOException("The file does not contain any valid image.");
+ }
+
+ /**
+ * Reads GIF file header information.
+ */
+ protected void readHeader() throws IOException {
+ String id = "";
+ for (int i = 0; i < 6; i++)
+ id += (char)in.read();
+ if (!id.startsWith("GIF8")) {
+ throw new IOException("Gif signature nor found.");
+ }
+
+ readLSD();
+ if (gctFlag) {
+ m_global_table = readColorTable(m_gbpc);
+ }
+ }
+
+ /**
+ * Reads Logical Screen Descriptor
+ */
+ protected void readLSD() throws IOException {
+
+ // logical screen size
+ width = readShort();
+ height = readShort();
+
+ // packed fields
+ int packed = in.read();
+ gctFlag = (packed & 0x80) != 0; // 1 : global color table flag
+ m_gbpc = (packed & 7) + 1;
+ bgIndex = in.read(); // background color index
+ pixelAspect = in.read(); // pixel aspect ratio
+ }
+
+ /**
+ * Reads next 16-bit value, LSB first
+ */
+ protected int readShort() throws IOException {
+ // read 16-bit value, LSB first
+ return in.read() | (in.read() << 8);
+ }
+
+ /**
+ * Reads next variable length block from input.
+ *
+ * @return number of bytes stored in "buffer"
+ */
+ protected int readBlock() throws IOException {
+ blockSize = in.read();
+ if (blockSize <= 0)
+ return blockSize = 0;
+ for (int k = 0; k < blockSize; ++k) {
+ int v = in.read();
+ if (v < 0) {
+ return blockSize = k;
+ }
+ block[k] = (byte)v;
+ }
+ return blockSize;
+ }
+
+ protected byte[] readColorTable(int bpc) throws IOException {
+ int ncolors = 1 << bpc;
+ int nbytes = 3*ncolors;
+ bpc = newBpc(bpc);
+ byte table[] = new byte[(1 << bpc) * 3];
+ in.readFully(table, 0, nbytes);
+ return table;
+ }
+
+
+ static protected int newBpc(int bpc) {
+ switch (bpc) {
+ case 1:
+ case 2:
+ case 4:
+ break;
+ case 3:
+ return 4;
+ default:
+ return 8;
+ }
+ return bpc;
+ }
+
+ protected void readContents() throws IOException {
+ // read GIF file content blocks
+ boolean done = false;
+ while (!done) {
+ int code = in.read();
+ switch (code) {
+
+ case 0x2C: // image separator
+ readImage();
+ break;
+
+ case 0x21: // extension
+ code = in.read();
+ switch (code) {
+
+ case 0xf9: // graphics control extension
+ readGraphicControlExt();
+ break;
+
+ case 0xff: // application extension
+ readBlock();
+ skip(); // don't care
+ break;
+
+ default: // uninteresting extension
+ skip();
+ }
+ break;
+
+ default:
+ done = true;
+ break;
+ }
+ }
+ }
+
+ /**
+ * Reads next frame image
+ */
+ protected void readImage() throws IOException {
+ ix = readShort(); // (sub)image position & size
+ iy = readShort();
+ iw = readShort();
+ ih = readShort();
+
+ int packed = in.read();
+ lctFlag = (packed & 0x80) != 0; // 1 - local color table flag
+ interlace = (packed & 0x40) != 0; // 2 - interlace flag
+ // 3 - sort flag
+ // 4-5 - reserved
+ lctSize = 2 << (packed & 7); // 6-8 - local color table size
+ m_bpc = newBpc(m_gbpc);
+ if (lctFlag) {
+ m_curr_table = readColorTable((packed & 7) + 1); // read table
+ m_bpc = newBpc((packed & 7) + 1);
+ }
+ else {
+ m_curr_table = m_global_table;
+ }
+ if (transparency && transIndex >= m_curr_table.length / 3)
+ transparency = false;
+ if (transparency && m_bpc == 1) { // Acrobat 5.05 doesn't like this combination
+ byte tp[] = new byte[12];
+ System.arraycopy(m_curr_table, 0, tp, 0, 6);
+ m_curr_table = tp;
+ m_bpc = 2;
+ }
+ boolean skipZero = decodeImageData(); // decode pixel data
+ if (!skipZero)
+ skip();
+
+ Image img = null;
+ try {
+ img = new ImgRaw(iw, ih, 1, m_bpc, m_out);
+ PdfArray colorspace = new PdfArray();
+ colorspace.add(PdfName.INDEXED);
+ colorspace.add(PdfName.DEVICERGB);
+ int len = m_curr_table.length;
+ colorspace.add(new PdfNumber(len / 3 - 1));
+ colorspace.add(new PdfString(m_curr_table));
+ PdfDictionary ad = new PdfDictionary();
+ ad.put(PdfName.COLORSPACE, colorspace);
+ img.setAdditional(ad);
+ if (transparency) {
+ img.setTransparency(new int[]{transIndex, transIndex});
+ }
+ }
+ catch (Exception e) {
+ throw new ExceptionConverter(e);
+ }
+ img.setOriginalType(Image.ORIGINAL_GIF);
+ img.setOriginalData(fromData);
+ img.setUrl(fromUrl);
+ GifFrame gf = new GifFrame();
+ gf.image = img;
+ gf.ix = ix;
+ gf.iy = iy;
+ frames.add(gf); // add image to frame list
+
+ //resetFrame();
+
+ }
+
+ protected boolean decodeImageData() throws IOException {
+ int NullCode = -1;
+ int npix = iw * ih;
+ int available, clear, code_mask, code_size, end_of_information, in_code, old_code,
+ bits, code, count, i, datum, data_size, first, top, bi;
+ boolean skipZero = false;
+
+ if (prefix == null)
+ prefix = new short[MaxStackSize];
+ if (suffix == null)
+ suffix = new byte[MaxStackSize];
+ if (pixelStack == null)
+ pixelStack = new byte[MaxStackSize+1];
+
+ m_line_stride = (iw * m_bpc + 7) / 8;
+ m_out = new byte[m_line_stride * ih];
+ int pass = 1;
+ int inc = interlace ? 8 : 1;
+ int line = 0;
+ int xpos = 0;
+
+ // Initialize GIF data stream decoder.
+
+ data_size = in.read();
+ clear = 1 << data_size;
+ end_of_information = clear + 1;
+ available = clear + 2;
+ old_code = NullCode;
+ code_size = data_size + 1;
+ code_mask = (1 << code_size) - 1;
+ for (code = 0; code < clear; code++) {
+ prefix[code] = 0;
+ suffix[code] = (byte) code;
+ }
+
+ // Decode GIF pixel stream.
+
+ datum = bits = count = first = top = bi = 0;
+
+ for (i = 0; i < npix; ) {
+ if (top == 0) {
+ if (bits < code_size) {
+ // Load bytes until there are enough bits for a code.
+ if (count == 0) {
+ // Read a new data block.
+ count = readBlock();
+ if (count <= 0) {
+ skipZero = true;
+ break;
+ }
+ bi = 0;
+ }
+ datum += (((int) block[bi]) & 0xff) << bits;
+ bits += 8;
+ bi++;
+ count--;
+ continue;
+ }
+
+ // Get the next code.
+
+ code = datum & code_mask;
+ datum >>= code_size;
+ bits -= code_size;
+
+ // Interpret the code
+
+ if ((code > available) || (code == end_of_information))
+ break;
+ if (code == clear) {
+ // Reset decoder.
+ code_size = data_size + 1;
+ code_mask = (1 << code_size) - 1;
+ available = clear + 2;
+ old_code = NullCode;
+ continue;
+ }
+ if (old_code == NullCode) {
+ pixelStack[top++] = suffix[code];
+ old_code = code;
+ first = code;
+ continue;
+ }
+ in_code = code;
+ if (code == available) {
+ pixelStack[top++] = (byte) first;
+ code = old_code;
+ }
+ while (code > clear) {
+ pixelStack[top++] = suffix[code];
+ code = prefix[code];
+ }
+ first = ((int) suffix[code]) & 0xff;
+
+ // Add a new string to the string table,
+
+ if (available >= MaxStackSize)
+ break;
+ pixelStack[top++] = (byte) first;
+ prefix[available] = (short) old_code;
+ suffix[available] = (byte) first;
+ available++;
+ if (((available & code_mask) == 0) && (available < MaxStackSize)) {
+ code_size++;
+ code_mask += available;
+ }
+ old_code = in_code;
+ }
+
+ // Pop a pixel off the pixel stack.
+
+ top--;
+ i++;
+
+ setPixel(xpos, line, pixelStack[top]);
+ ++xpos;
+ if (xpos >= iw) {
+ xpos = 0;
+ line += inc;
+ if (line >= ih) {
+ if (interlace) {
+ do {
+ pass++;
+ switch (pass) {
+ case 2:
+ line = 4;
+ break;
+ case 3:
+ line = 2;
+ inc = 4;
+ break;
+ case 4:
+ line = 1;
+ inc = 2;
+ break;
+ default: // this shouldn't happen
+ line = ih - 1;
+ inc = 0;
+ }
+ } while (line >= ih);
+ }
+ else {
+ line = ih - 1; // this shouldn't happen
+ inc = 0;
+ }
+ }
+ }
+ }
+ return skipZero;
+ }
+
+
+ protected void setPixel(int x, int y, int v) {
+ if (m_bpc == 8) {
+ int pos = x + iw * y;
+ m_out[pos] = (byte)v;
+ }
+ else {
+ int pos = m_line_stride * y + x / (8 / m_bpc);
+ int vout = v << (8 - m_bpc * (x % (8 / m_bpc))- m_bpc);
+ m_out[pos] |= vout;
+ }
+ }
+
+ /**
+ * Resets frame state for reading next image.
+ */
+ protected void resetFrame() {
+ // it does nothing in the pdf context
+ //boolean transparency = false;
+ //int delay = 0;
+ }
+
+ /**
+ * Reads Graphics Control Extension values
+ */
+ protected void readGraphicControlExt() throws IOException {
+ in.read(); // block size
+ int packed = in.read(); // packed fields
+ dispose = (packed & 0x1c) >> 2; // disposal method
+ if (dispose == 0)
+ dispose = 1; // elect to keep old image if discretionary
+ transparency = (packed & 1) != 0;
+ delay = readShort() * 10; // delay in milliseconds
+ transIndex = in.read(); // transparent color index
+ in.read(); // block terminator
+ }
+
+ /**
+ * Skips variable length blocks up to and including
+ * next zero length block.
+ */
+ protected void skip() throws IOException {
+ do {
+ readBlock();
+ } while (blockSize > 0);
+ }
+
+ static class GifFrame {
+ Image image;
+ int ix;
+ int iy;
+ }
+}
diff --git a/src/main/java/com/lowagie/text/pdf/codec/PngImage.java b/src/main/java/com/lowagie/text/pdf/codec/PngImage.java
new file mode 100644
index 0000000..b82e17b
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/codec/PngImage.java
@@ -0,0 +1,987 @@
+/*
+ * Copyright 2003 by Paulo Soares.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ *
+ *
+ * The original JAI codecs have the following license
+ *
+ * Copyright (c) 2001 Sun Microsystems, Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * -Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * -Redistribution in binary form must reproduct the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of contributors may
+ * be used to endorse or promote products derived from this software without
+ * specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any kind. ALL
+ * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING ANY
+ * IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ * NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN AND ITS LICENSORS SHALL NOT BE
+ * LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
+ * OR DISTRIBUTING THE SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR ITS
+ * LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT,
+ * INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER
+ * CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF
+ * OR INABILITY TO USE SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that Software is not designed,licensed or intended for use in
+ * the design, construction, operation or maintenance of any nuclear facility.
+ */
+
+package com.lowagie.text.pdf.codec;
+
+import java.awt.color.ICC_Profile;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.DataInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.util.zip.Inflater;
+import java.util.zip.InflaterInputStream;
+
+import com.lowagie.text.ExceptionConverter;
+import com.lowagie.text.Image;
+import com.lowagie.text.ImgRaw;
+import com.lowagie.text.pdf.ByteBuffer;
+import com.lowagie.text.pdf.PdfArray;
+import com.lowagie.text.pdf.PdfDictionary;
+import com.lowagie.text.pdf.PdfLiteral;
+import com.lowagie.text.pdf.PdfName;
+import com.lowagie.text.pdf.PdfNumber;
+import com.lowagie.text.pdf.PdfObject;
+import com.lowagie.text.pdf.PdfReader;
+import com.lowagie.text.pdf.PdfString;
+
+/** Reads a PNG image. All types of PNG can be read.
+ * <p>
+ * It is based in part in the JAI codec.
+ *
+ * @author Paulo Soares (psoares@consiste.pt)
+ */
+public class PngImage {
+/** Some PNG specific values. */
+ public static final int[] PNGID = {137, 80, 78, 71, 13, 10, 26, 10};
+
+/** A PNG marker. */
+ public static final String IHDR = "IHDR";
+
+/** A PNG marker. */
+ public static final String PLTE = "PLTE";
+
+/** A PNG marker. */
+ public static final String IDAT = "IDAT";
+
+/** A PNG marker. */
+ public static final String IEND = "IEND";
+
+/** A PNG marker. */
+ public static final String tRNS = "tRNS";
+
+/** A PNG marker. */
+ public static final String pHYs = "pHYs";
+
+/** A PNG marker. */
+ public static final String gAMA = "gAMA";
+
+/** A PNG marker. */
+ public static final String cHRM = "cHRM";
+
+/** A PNG marker. */
+ public static final String sRGB = "sRGB";
+
+/** A PNG marker. */
+ public static final String iCCP = "iCCP";
+
+ private static final int TRANSFERSIZE = 4096;
+ private static final int PNG_FILTER_NONE = 0;
+ private static final int PNG_FILTER_SUB = 1;
+ private static final int PNG_FILTER_UP = 2;
+ private static final int PNG_FILTER_AVERAGE = 3;
+ private static final int PNG_FILTER_PAETH = 4;
+ private static final PdfName intents[] = {PdfName.PERCEPTUAL,
+ PdfName.RELATIVECALORIMETRIC,PdfName.SATURATION,PdfName.ABSOLUTECALORIMETRIC};
+
+ InputStream is;
+ DataInputStream dataStream;
+ int width;
+ int height;
+ int bitDepth;
+ int colorType;
+ int compressionMethod;
+ int filterMethod;
+ int interlaceMethod;
+ PdfDictionary additional = new PdfDictionary();
+ byte image[];
+ byte smask[];
+ byte trans[];
+ NewByteArrayOutputStream idat = new NewByteArrayOutputStream();
+ int dpiX;
+ int dpiY;
+ float XYRatio;
+ boolean genBWMask;
+ boolean palShades;
+ int transRedGray = -1;
+ int transGreen = -1;
+ int transBlue = -1;
+ int inputBands;
+ int bytesPerPixel; // number of bytes per input pixel
+ byte colorTable[];
+ float gamma = 1f;
+ boolean hasCHRM = false;
+ float xW, yW, xR, yR, xG, yG, xB, yB;
+ PdfName intent;
+ ICC_Profile icc_profile;
+
+
+
+ /** Creates a new instance of PngImage */
+ PngImage(InputStream is) {
+ this.is = is;
+ }
+
+ /** Reads a PNG from an url.
+ * @param url the url
+ * @throws IOException on error
+ * @return the image
+ */
+ public static Image getImage(URL url) throws IOException {
+ InputStream is = null;
+ try {
+ is = url.openStream();
+ Image img = getImage(is);
+ img.setUrl(url);
+ return img;
+ }
+ finally {
+ if (is != null) {
+ is.close();
+ }
+ }
+ }
+
+ /** Reads a PNG from a stream.
+ * @param is the stream
+ * @throws IOException on error
+ * @return the image
+ */
+ public static Image getImage(InputStream is) throws IOException {
+ PngImage png = new PngImage(is);
+ return png.getImage();
+ }
+
+ /** Reads a PNG from a file.
+ * @param file the file
+ * @throws IOException on error
+ * @return the image
+ */
+ public static Image getImage(String file) throws IOException {
+ return getImage(Image.toURL(file));
+ }
+
+ /** Reads a PNG from a byte array.
+ * @param data the byte array
+ * @throws IOException on error
+ * @return the image
+ */
+ public static Image getImage(byte data[]) throws IOException {
+ InputStream is = null;
+ try {
+ is = new ByteArrayInputStream(data);
+ Image img = getImage(is);
+ img.setOriginalData(data);
+ return img;
+ }
+ finally {
+ if (is != null) {
+ is.close();
+ }
+ }
+ }
+
+ boolean checkMarker(String s) {
+ if (s.length() != 4)
+ return false;
+ for (int k = 0; k < 4; ++k) {
+ char c = s.charAt(k);
+ if ((c < 'a' || c > 'z') && (c < 'A' || c > 'Z'))
+ return false;
+ }
+ return true;
+ }
+
+ void readPng() throws IOException {
+ for (int i = 0; i < PNGID.length; i++) {
+ if (PNGID[i] != is.read()) {
+ throw new IOException("File is not a valid PNG.");
+ }
+ }
+ byte buffer[] = new byte[TRANSFERSIZE];
+ while (true) {
+ int len = getInt(is);
+ String marker = getString(is);
+ if (len < 0 || !checkMarker(marker))
+ throw new IOException("Corrupted PNG file.");
+ if (IDAT.equals(marker)) {
+ int size;
+ while (len != 0) {
+ size = is.read(buffer, 0, Math.min(len, TRANSFERSIZE));
+ if (size < 0)
+ return;
+ idat.write(buffer, 0, size);
+ len -= size;
+ }
+ }
+ else if (tRNS.equals(marker)) {
+ switch (colorType) {
+ case 0:
+ if (len >= 2) {
+ len -= 2;
+ int gray = getWord(is);
+ if (bitDepth == 16)
+ transRedGray = gray;
+ else
+ additional.put(PdfName.MASK, new PdfLiteral("["+gray+" "+gray+"]"));
+ }
+ break;
+ case 2:
+ if (len >= 6) {
+ len -= 6;
+ int red = getWord(is);
+ int green = getWord(is);
+ int blue = getWord(is);
+ if (bitDepth == 16) {
+ transRedGray = red;
+ transGreen = green;
+ transBlue = blue;
+ }
+ else
+ additional.put(PdfName.MASK, new PdfLiteral("["+red+" "+red+" "+green+" "+green+" "+blue+" "+blue+"]"));
+ }
+ break;
+ case 3:
+ if (len > 0) {
+ trans = new byte[len];
+ for (int k = 0; k < len; ++k)
+ trans[k] = (byte)is.read();
+ len = 0;
+ }
+ break;
+ }
+ Image.skip(is, len);
+ }
+ else if (IHDR.equals(marker)) {
+ width = getInt(is);
+ height = getInt(is);
+
+ bitDepth = is.read();
+ colorType = is.read();
+ compressionMethod = is.read();
+ filterMethod = is.read();
+ interlaceMethod = is.read();
+ }
+ else if (PLTE.equals(marker)) {
+ if (colorType == 3) {
+ PdfArray colorspace = new PdfArray();
+ colorspace.add(PdfName.INDEXED);
+ colorspace.add(getColorspace());
+ colorspace.add(new PdfNumber(len / 3 - 1));
+ ByteBuffer colortable = new ByteBuffer();
+ while ((len--) > 0) {
+ colortable.append_i(is.read());
+ }
+ colorspace.add(new PdfString(colorTable = colortable.toByteArray()));
+ additional.put(PdfName.COLORSPACE, colorspace);
+ }
+ else {
+ Image.skip(is, len);
+ }
+ }
+ else if (pHYs.equals(marker)) {
+ int dx = getInt(is);
+ int dy = getInt(is);
+ int unit = is.read();
+ if (unit == 1) {
+ dpiX = (int)((float)dx * 0.0254f);
+ dpiY = (int)((float)dy * 0.0254f);
+ }
+ else {
+ if (dy != 0)
+ XYRatio = (float)dx / (float)dy;
+ }
+ }
+ else if (cHRM.equals(marker)) {
+ xW = (float)getInt(is) / 100000f;
+ yW = (float)getInt(is) / 100000f;
+ xR = (float)getInt(is) / 100000f;
+ yR = (float)getInt(is) / 100000f;
+ xG = (float)getInt(is) / 100000f;
+ yG = (float)getInt(is) / 100000f;
+ xB = (float)getInt(is) / 100000f;
+ yB = (float)getInt(is) / 100000f;
+ hasCHRM = !(Math.abs(xW)<0.0001f||Math.abs(yW)<0.0001f||Math.abs(xR)<0.0001f||Math.abs(yR)<0.0001f||Math.abs(xG)<0.0001f||Math.abs(yG)<0.0001f||Math.abs(xB)<0.0001f||Math.abs(yB)<0.0001f);
+ }
+ else if (sRGB.equals(marker)) {
+ int ri = is.read();
+ intent = intents[ri];
+ gamma = 2.2f;
+ xW = 0.3127f;
+ yW = 0.329f;
+ xR = 0.64f;
+ yR = 0.33f;
+ xG = 0.3f;
+ yG = 0.6f;
+ xB = 0.15f;
+ yB = 0.06f;
+ hasCHRM = true;
+ }
+ else if (gAMA.equals(marker)) {
+ int gm = getInt(is);
+ if (gm != 0) {
+ gamma = 100000f / (float)gm;
+ if (!hasCHRM) {
+ xW = 0.3127f;
+ yW = 0.329f;
+ xR = 0.64f;
+ yR = 0.33f;
+ xG = 0.3f;
+ yG = 0.6f;
+ xB = 0.15f;
+ yB = 0.06f;
+ hasCHRM = true;
+ }
+ }
+ }
+ else if (iCCP.equals(marker)) {
+ do {
+ --len;
+ } while (is.read() != 0);
+ is.read();
+ --len;
+ byte icccom[] = new byte[len];
+ int p = 0;
+ while (len > 0) {
+ int r = is.read(icccom, p, len);
+ if (r < 0)
+ throw new IOException("Premature end of file.");
+ p += r;
+ len -= r;
+ }
+ byte iccp[] = PdfReader.FlateDecode(icccom, true);
+ icccom = null;
+ try {
+ icc_profile = ICC_Profile.getInstance(iccp);
+ }
+ catch (Exception e) {
+ icc_profile = null;
+ }
+ }
+ else if (IEND.equals(marker)) {
+ break;
+ }
+ else {
+ Image.skip(is, len);
+ }
+ Image.skip(is, 4);
+ }
+ }
+
+ PdfObject getColorspace() {
+ if (icc_profile != null) {
+ if ((colorType & 2) == 0)
+ return PdfName.DEVICEGRAY;
+ else
+ return PdfName.DEVICERGB;
+ }
+ if (gamma == 1f && !hasCHRM) {
+ if ((colorType & 2) == 0)
+ return PdfName.DEVICEGRAY;
+ else
+ return PdfName.DEVICERGB;
+ }
+ else {
+ PdfArray array = new PdfArray();
+ PdfDictionary dic = new PdfDictionary();
+ if ((colorType & 2) == 0) {
+ if (gamma == 1f)
+ return PdfName.DEVICEGRAY;
+ array.add(PdfName.CALGRAY);
+ dic.put(PdfName.GAMMA, new PdfNumber(gamma));
+ dic.put(PdfName.WHITEPOINT, new PdfLiteral("[1 1 1]"));
+ array.add(dic);
+ }
+ else {
+ PdfObject wp = new PdfLiteral("[1 1 1]");
+ array.add(PdfName.CALRGB);
+ if (gamma != 1f) {
+ PdfArray gm = new PdfArray();
+ PdfNumber n = new PdfNumber(gamma);
+ gm.add(n);
+ gm.add(n);
+ gm.add(n);
+ dic.put(PdfName.GAMMA, gm);
+ }
+ if (hasCHRM) {
+ float z = yW*((xG-xB)*yR-(xR-xB)*yG+(xR-xG)*yB);
+ float YA = yR*((xG-xB)*yW-(xW-xB)*yG+(xW-xG)*yB)/z;
+ float XA = YA*xR/yR;
+ float ZA = YA*((1-xR)/yR-1);
+ float YB = -yG*((xR-xB)*yW-(xW-xB)*yR+(xW-xR)*yB)/z;
+ float XB = YB*xG/yG;
+ float ZB = YB*((1-xG)/yG-1);
+ float YC = yB*((xR-xG)*yW-(xW-xG)*yW+(xW-xR)*yG)/z;
+ float XC = YC*xB/yB;
+ float ZC = YC*((1-xB)/yB-1);
+ float XW = XA+XB+XC;
+ float YW = 1;//YA+YB+YC;
+ float ZW = ZA+ZB+ZC;
+ PdfArray wpa = new PdfArray();
+ wpa.add(new PdfNumber(XW));
+ wpa.add(new PdfNumber(YW));
+ wpa.add(new PdfNumber(ZW));
+ wp = wpa;
+ PdfArray matrix = new PdfArray();
+ matrix.add(new PdfNumber(XA));
+ matrix.add(new PdfNumber(YA));
+ matrix.add(new PdfNumber(ZA));
+ matrix.add(new PdfNumber(XB));
+ matrix.add(new PdfNumber(YB));
+ matrix.add(new PdfNumber(ZB));
+ matrix.add(new PdfNumber(XC));
+ matrix.add(new PdfNumber(YC));
+ matrix.add(new PdfNumber(ZC));
+ dic.put(PdfName.MATRIX, matrix);
+ }
+ dic.put(PdfName.WHITEPOINT, wp);
+ array.add(dic);
+ }
+ return array;
+ }
+ }
+
+ Image getImage() throws IOException {
+ readPng();
+ try {
+ int pal0 = 0;
+ int palIdx = 0;
+ palShades = false;
+ if (trans != null) {
+ for (int k = 0; k < trans.length; ++k) {
+ int n = trans[k] & 0xff;
+ if (n == 0) {
+ ++pal0;
+ palIdx = k;
+ }
+ if (n != 0 && n != 255) {
+ palShades = true;
+ break;
+ }
+ }
+ }
+ if ((colorType & 4) != 0)
+ palShades = true;
+ genBWMask = (!palShades && (pal0 > 1 || transRedGray >= 0));
+ if (!palShades && !genBWMask && pal0 == 1) {
+ additional.put(PdfName.MASK, new PdfLiteral("["+palIdx+" "+palIdx+"]"));
+ }
+ boolean needDecode = (interlaceMethod == 1) || (bitDepth == 16) || ((colorType & 4) != 0) || palShades || genBWMask;
+ switch (colorType) {
+ case 0:
+ inputBands = 1;
+ break;
+ case 2:
+ inputBands = 3;
+ break;
+ case 3:
+ inputBands = 1;
+ break;
+ case 4:
+ inputBands = 2;
+ break;
+ case 6:
+ inputBands = 4;
+ break;
+ }
+ if (needDecode)
+ decodeIdat();
+ int components = inputBands;
+ if ((colorType & 4) != 0)
+ --components;
+ int bpc = bitDepth;
+ if (bpc == 16)
+ bpc = 8;
+ Image img;
+ if (image != null)
+ img = Image.getInstance(width, height, components, bpc, image);
+ else {
+ img = new ImgRaw(width, height, components, bpc, idat.toByteArray());
+ img.setDeflated(true);
+ PdfDictionary decodeparms = new PdfDictionary();
+ decodeparms.put(PdfName.BITSPERCOMPONENT, new PdfNumber(bitDepth));
+ decodeparms.put(PdfName.PREDICTOR, new PdfNumber(15));
+ decodeparms.put(PdfName.COLUMNS, new PdfNumber(width));
+ decodeparms.put(PdfName.COLORS, new PdfNumber((colorType == 3 || (colorType & 2) == 0) ? 1 : 3));
+ additional.put(PdfName.DECODEPARMS, decodeparms);
+ }
+ if (additional.get(PdfName.COLORSPACE) == null)
+ additional.put(PdfName.COLORSPACE, getColorspace());
+ if (intent != null)
+ additional.put(PdfName.INTENT, intent);
+ if (additional.size() > 0)
+ img.setAdditional(additional);
+ if (icc_profile != null)
+ img.tagICC(icc_profile);
+ if (palShades) {
+ Image im2 = Image.getInstance(width, height, 1, 8, smask);
+ im2.makeMask();
+ img.setImageMask(im2);
+ }
+ if (genBWMask) {
+ Image im2 = Image.getInstance(width, height, 1, 1, smask);
+ im2.makeMask();
+ img.setImageMask(im2);
+ }
+ img.setDpi(dpiX, dpiY);
+ img.setXYRatio(XYRatio);
+ img.setOriginalType(Image.ORIGINAL_PNG);
+ return img;
+ }
+ catch (Exception e) {
+ throw new ExceptionConverter(e);
+ }
+ }
+
+ void decodeIdat() {
+ int nbitDepth = bitDepth;
+ if (nbitDepth == 16)
+ nbitDepth = 8;
+ int size = -1;
+ bytesPerPixel = (bitDepth == 16) ? 2 : 1;
+ switch (colorType) {
+ case 0:
+ size = (nbitDepth * width + 7) / 8 * height;
+ break;
+ case 2:
+ size = width * 3 * height;
+ bytesPerPixel *= 3;
+ break;
+ case 3:
+ if (interlaceMethod == 1)
+ size = (nbitDepth * width + 7) / 8 * height;
+ bytesPerPixel = 1;
+ break;
+ case 4:
+ size = width * height;
+ bytesPerPixel *= 2;
+ break;
+ case 6:
+ size = width * 3 * height;
+ bytesPerPixel *= 4;
+ break;
+ }
+ if (size >= 0)
+ image = new byte[size];
+ if (palShades)
+ smask = new byte[width * height];
+ else if (genBWMask)
+ smask = new byte[(width + 7) / 8 * height];
+ ByteArrayInputStream bai = new ByteArrayInputStream(idat.getBuf(), 0, idat.size());
+ InputStream infStream = new InflaterInputStream(bai, new Inflater());
+ dataStream = new DataInputStream(infStream);
+
+ if (interlaceMethod != 1) {
+ decodePass(0, 0, 1, 1, width, height);
+ }
+ else {
+ decodePass(0, 0, 8, 8, (width + 7)/8, (height + 7)/8);
+ decodePass(4, 0, 8, 8, (width + 3)/8, (height + 7)/8);
+ decodePass(0, 4, 4, 8, (width + 3)/4, (height + 3)/8);
+ decodePass(2, 0, 4, 4, (width + 1)/4, (height + 3)/4);
+ decodePass(0, 2, 2, 4, (width + 1)/2, (height + 1)/4);
+ decodePass(1, 0, 2, 2, width/2, (height + 1)/2);
+ decodePass(0, 1, 1, 2, width, height/2);
+ }
+
+ }
+
+ void decodePass( int xOffset, int yOffset,
+ int xStep, int yStep,
+ int passWidth, int passHeight) {
+ if ((passWidth == 0) || (passHeight == 0)) {
+ return;
+ }
+
+ int bytesPerRow = (inputBands*passWidth*bitDepth + 7)/8;
+ byte[] curr = new byte[bytesPerRow];
+ byte[] prior = new byte[bytesPerRow];
+
+ // Decode the (sub)image row-by-row
+ int srcY, dstY;
+ for (srcY = 0, dstY = yOffset;
+ srcY < passHeight;
+ srcY++, dstY += yStep) {
+ // Read the filter type byte and a row of data
+ int filter = 0;
+ try {
+ filter = dataStream.read();
+ dataStream.readFully(curr, 0, bytesPerRow);
+ } catch (Exception e) {
+ // empty on purpose
+ }
+
+ switch (filter) {
+ case PNG_FILTER_NONE:
+ break;
+ case PNG_FILTER_SUB:
+ decodeSubFilter(curr, bytesPerRow, bytesPerPixel);
+ break;
+ case PNG_FILTER_UP:
+ decodeUpFilter(curr, prior, bytesPerRow);
+ break;
+ case PNG_FILTER_AVERAGE:
+ decodeAverageFilter(curr, prior, bytesPerRow, bytesPerPixel);
+ break;
+ case PNG_FILTER_PAETH:
+ decodePaethFilter(curr, prior, bytesPerRow, bytesPerPixel);
+ break;
+ default:
+ // Error -- uknown filter type
+ throw new RuntimeException("PNG filter unknown.");
+ }
+
+ processPixels(curr, xOffset, xStep, dstY, passWidth);
+
+ // Swap curr and prior
+ byte[] tmp = prior;
+ prior = curr;
+ curr = tmp;
+ }
+ }
+
+ void processPixels(byte curr[], int xOffset, int step, int y, int width) {
+ int srcX, dstX;
+
+ int out[] = getPixel(curr);
+ int sizes = 0;
+ switch (colorType) {
+ case 0:
+ case 3:
+ case 4:
+ sizes = 1;
+ break;
+ case 2:
+ case 6:
+ sizes = 3;
+ break;
+ }
+ if (image != null) {
+ dstX = xOffset;
+ int yStride = (sizes*this.width*(bitDepth == 16 ? 8 : bitDepth)+ 7)/8;
+ for (srcX = 0; srcX < width; srcX++) {
+ setPixel(image, out, inputBands * srcX, sizes, dstX, y, bitDepth, yStride);
+ dstX += step;
+ }
+ }
+ if (palShades) {
+ if ((colorType & 4) != 0) {
+ if (bitDepth == 16) {
+ for (int k = 0; k < width; ++k)
+ out[k * inputBands + sizes] >>>= 8;
+ }
+ int yStride = this.width;
+ dstX = xOffset;
+ for (srcX = 0; srcX < width; srcX++) {
+ setPixel(smask, out, inputBands * srcX + sizes, 1, dstX, y, 8, yStride);
+ dstX += step;
+ }
+ }
+ else { //colorType 3
+ int yStride = this.width;
+ int v[] = new int[1];
+ dstX = xOffset;
+ for (srcX = 0; srcX < width; srcX++) {
+ int idx = out[srcX];
+ if (idx < trans.length)
+ v[0] = trans[idx];
+ setPixel(smask, v, 0, 1, dstX, y, 8, yStride);
+ dstX += step;
+ }
+ }
+ }
+ else if (genBWMask) {
+ switch (colorType) {
+ case 3: {
+ int yStride = (this.width + 7) / 8;
+ int v[] = new int[1];
+ dstX = xOffset;
+ for (srcX = 0; srcX < width; srcX++) {
+ int idx = out[srcX];
+ if (idx < trans.length)
+ v[0] = (trans[idx] == 0 ? 1 : 0);
+ setPixel(smask, v, 0, 1, dstX, y, 1, yStride);
+ dstX += step;
+ }
+ break;
+ }
+ case 0: {
+ int yStride = (this.width + 7) / 8;
+ int v[] = new int[1];
+ dstX = xOffset;
+ for (srcX = 0; srcX < width; srcX++) {
+ int g = out[srcX];
+ v[0] = (g == transRedGray ? 1 : 0);
+ setPixel(smask, v, 0, 1, dstX, y, 1, yStride);
+ dstX += step;
+ }
+ break;
+ }
+ case 2: {
+ int yStride = (this.width + 7) / 8;
+ int v[] = new int[1];
+ dstX = xOffset;
+ for (srcX = 0; srcX < width; srcX++) {
+ int markRed = inputBands * srcX;
+ v[0] = (out[markRed] == transRedGray && out[markRed + 1] == transGreen
+ && out[markRed + 2] == transBlue ? 1 : 0);
+ setPixel(smask, v, 0, 1, dstX, y, 1, yStride);
+ dstX += step;
+ }
+ break;
+ }
+ }
+ }
+ }
+
+ static int getPixel(byte image[], int x, int y, int bitDepth, int bytesPerRow) {
+ if (bitDepth == 8) {
+ int pos = bytesPerRow * y + x;
+ return image[pos] & 0xff;
+ }
+ else {
+ int pos = bytesPerRow * y + x / (8 / bitDepth);
+ int v = image[pos] >> (8 - bitDepth * (x % (8 / bitDepth))- bitDepth);
+ return v & ((1 << bitDepth) - 1);
+ }
+ }
+
+ static void setPixel(byte image[], int data[], int offset, int size, int x, int y, int bitDepth, int bytesPerRow) {
+ if (bitDepth == 8) {
+ int pos = bytesPerRow * y + size * x;
+ for (int k = 0; k < size; ++k)
+ image[pos + k] = (byte)data[k + offset];
+ }
+ else if (bitDepth == 16) {
+ int pos = bytesPerRow * y + size * x;
+ for (int k = 0; k < size; ++k)
+ image[pos + k] = (byte)(data[k + offset] >>> 8);
+ }
+ else {
+ int pos = bytesPerRow * y + x / (8 / bitDepth);
+ int v = data[offset] << (8 - bitDepth * (x % (8 / bitDepth))- bitDepth);
+ image[pos] |= v;
+ }
+ }
+
+ int[] getPixel(byte curr[]) {
+ switch (bitDepth) {
+ case 8: {
+ int out[] = new int[curr.length];
+ for (int k = 0; k < out.length; ++k)
+ out[k] = curr[k] & 0xff;
+ return out;
+ }
+ case 16: {
+ int out[] = new int[curr.length / 2];
+ for (int k = 0; k < out.length; ++k)
+ out[k] = ((curr[k * 2] & 0xff) << 8) + (curr[k * 2 + 1] & 0xff);
+ return out;
+ }
+ default: {
+ int out[] = new int[curr.length * 8 / bitDepth];
+ int idx = 0;
+ int passes = 8 / bitDepth;
+ int mask = (1 << bitDepth) - 1;
+ for (int k = 0; k < curr.length; ++k) {
+ for (int j = passes - 1; j >= 0; --j) {
+ out[idx++] = (curr[k] >>> (bitDepth * j)) & mask;
+ }
+ }
+ return out;
+ }
+ }
+ }
+
+ private static void decodeSubFilter(byte[] curr, int count, int bpp) {
+ for (int i = bpp; i < count; i++) {
+ int val;
+
+ val = curr[i] & 0xff;
+ val += curr[i - bpp] & 0xff;
+
+ curr[i] = (byte)val;
+ }
+ }
+
+ private static void decodeUpFilter(byte[] curr, byte[] prev,
+ int count) {
+ for (int i = 0; i < count; i++) {
+ int raw = curr[i] & 0xff;
+ int prior = prev[i] & 0xff;
+
+ curr[i] = (byte)(raw + prior);
+ }
+ }
+
+ private static void decodeAverageFilter(byte[] curr, byte[] prev,
+ int count, int bpp) {
+ int raw, priorPixel, priorRow;
+
+ for (int i = 0; i < bpp; i++) {
+ raw = curr[i] & 0xff;
+ priorRow = prev[i] & 0xff;
+
+ curr[i] = (byte)(raw + priorRow/2);
+ }
+
+ for (int i = bpp; i < count; i++) {
+ raw = curr[i] & 0xff;
+ priorPixel = curr[i - bpp] & 0xff;
+ priorRow = prev[i] & 0xff;
+
+ curr[i] = (byte)(raw + (priorPixel + priorRow)/2);
+ }
+ }
+
+ private static int paethPredictor(int a, int b, int c) {
+ int p = a + b - c;
+ int pa = Math.abs(p - a);
+ int pb = Math.abs(p - b);
+ int pc = Math.abs(p - c);
+
+ if ((pa <= pb) && (pa <= pc)) {
+ return a;
+ } else if (pb <= pc) {
+ return b;
+ } else {
+ return c;
+ }
+ }
+
+ private static void decodePaethFilter(byte[] curr, byte[] prev,
+ int count, int bpp) {
+ int raw, priorPixel, priorRow, priorRowPixel;
+
+ for (int i = 0; i < bpp; i++) {
+ raw = curr[i] & 0xff;
+ priorRow = prev[i] & 0xff;
+
+ curr[i] = (byte)(raw + priorRow);
+ }
+
+ for (int i = bpp; i < count; i++) {
+ raw = curr[i] & 0xff;
+ priorPixel = curr[i - bpp] & 0xff;
+ priorRow = prev[i] & 0xff;
+ priorRowPixel = prev[i - bpp] & 0xff;
+
+ curr[i] = (byte)(raw + paethPredictor(priorPixel,
+ priorRow,
+ priorRowPixel));
+ }
+ }
+
+ static class NewByteArrayOutputStream extends ByteArrayOutputStream {
+ public byte[] getBuf() {
+ return buf;
+ }
+ }
+
+/**
+ * Gets an <CODE>int</CODE> from an <CODE>InputStream</CODE>.
+ *
+ * @param is an <CODE>InputStream</CODE>
+ * @return the value of an <CODE>int</CODE>
+ */
+
+ public static final int getInt(InputStream is) throws IOException {
+ return (is.read() << 24) + (is.read() << 16) + (is.read() << 8) + is.read();
+ }
+
+/**
+ * Gets a <CODE>word</CODE> from an <CODE>InputStream</CODE>.
+ *
+ * @param is an <CODE>InputStream</CODE>
+ * @return the value of an <CODE>int</CODE>
+ */
+
+ public static final int getWord(InputStream is) throws IOException {
+ return (is.read() << 8) + is.read();
+ }
+
+/**
+ * Gets a <CODE>String</CODE> from an <CODE>InputStream</CODE>.
+ *
+ * @param is an <CODE>InputStream</CODE>
+ * @return the value of an <CODE>int</CODE>
+ */
+
+ public static final String getString(InputStream is) throws IOException {
+ StringBuffer buf = new StringBuffer();
+ for (int i = 0; i < 4; i++) {
+ buf.append((char)is.read());
+ }
+ return buf.toString();
+ }
+
+}
diff --git a/src/main/java/com/lowagie/text/pdf/codec/TIFFConstants.java b/src/main/java/com/lowagie/text/pdf/codec/TIFFConstants.java
new file mode 100644
index 0000000..a4ba5d5
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/codec/TIFFConstants.java
@@ -0,0 +1,296 @@
+/*
+ * Copyright (c) 2001 Sun Microsystems, Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * -Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * -Redistribution in binary form must reproduct the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of contributors may
+ * be used to endorse or promote products derived from this software without
+ * specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any kind. ALL
+ * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING ANY
+ * IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ * NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN AND ITS LICENSORS SHALL NOT BE
+ * LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
+ * OR DISTRIBUTING THE SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR ITS
+ * LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT,
+ * INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER
+ * CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF
+ * OR INABILITY TO USE SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that Software is not designed,licensed or intended for use in
+ * the design, construction, operation or maintenance of any nuclear facility.
+ */
+package com.lowagie.text.pdf.codec;
+
+/**
+ * A baseline TIFF reader. The reader has some functionality in addition to
+ * the baseline specifications for Bilevel images, for which the group 3 and
+ * group 4 decompression schemes have been implemented. Support for LZW
+ * decompression has also been added. Support for Horizontal differencing
+ * predictor decoding is also included, when used with LZW compression.
+ * However, this support is limited to data with bitsPerSample value of 8.
+ * When reading in RGB images, support for alpha and extraSamples being
+ * present has been added. Support for reading in images with 16 bit samples
+ * has been added. Support for the SampleFormat tag (signed samples as well
+ * as floating-point samples) has also been added. In all other cases, support
+ * is limited to Baseline specifications.
+ *
+ *
+ */
+public class TIFFConstants {
+
+/*
+ * TIFF Tag Definitions (from tifflib).
+ */
+ public static final int TIFFTAG_SUBFILETYPE = 254; /* subfile data descriptor */
+ public static final int FILETYPE_REDUCEDIMAGE = 0x1; /* reduced resolution version */
+ public static final int FILETYPE_PAGE = 0x2; /* one page of many */
+ public static final int FILETYPE_MASK = 0x4; /* transparency mask */
+ public static final int TIFFTAG_OSUBFILETYPE = 255; /* +kind of data in subfile */
+ public static final int OFILETYPE_IMAGE = 1; /* full resolution image data */
+ public static final int OFILETYPE_REDUCEDIMAGE = 2; /* reduced size image data */
+ public static final int OFILETYPE_PAGE = 3; /* one page of many */
+ public static final int TIFFTAG_IMAGEWIDTH = 256; /* image width in pixels */
+ public static final int TIFFTAG_IMAGELENGTH = 257; /* image height in pixels */
+ public static final int TIFFTAG_BITSPERSAMPLE = 258; /* bits per channel (sample) */
+ public static final int TIFFTAG_COMPRESSION = 259; /* data compression technique */
+ public static final int COMPRESSION_NONE = 1; /* dump mode */
+ public static final int COMPRESSION_CCITTRLE = 2; /* CCITT modified Huffman RLE */
+ public static final int COMPRESSION_CCITTFAX3 = 3; /* CCITT Group 3 fax encoding */
+ public static final int COMPRESSION_CCITTFAX4 = 4; /* CCITT Group 4 fax encoding */
+ public static final int COMPRESSION_LZW = 5; /* Lempel-Ziv & Welch */
+ public static final int COMPRESSION_OJPEG = 6; /* !6.0 JPEG */
+ public static final int COMPRESSION_JPEG = 7; /* %JPEG DCT compression */
+ public static final int COMPRESSION_NEXT = 32766; /* NeXT 2-bit RLE */
+ public static final int COMPRESSION_CCITTRLEW = 32771; /* #1 w/ word alignment */
+ public static final int COMPRESSION_PACKBITS = 32773; /* Macintosh RLE */
+ public static final int COMPRESSION_THUNDERSCAN = 32809; /* ThunderScan RLE */
+ /* codes 32895-32898 are reserved for ANSI IT8 TIFF/IT <dkelly@etsinc.com) */
+ public static final int COMPRESSION_IT8CTPAD = 32895; /* IT8 CT w/padding */
+ public static final int COMPRESSION_IT8LW = 32896; /* IT8 Linework RLE */
+ public static final int COMPRESSION_IT8MP = 32897; /* IT8 Monochrome picture */
+ public static final int COMPRESSION_IT8BL = 32898; /* IT8 Binary line art */
+ /* compression codes 32908-32911 are reserved for Pixar */
+ public static final int COMPRESSION_PIXARFILM = 32908; /* Pixar companded 10bit LZW */
+ public static final int COMPRESSION_PIXARLOG = 32909; /* Pixar companded 11bit ZIP */
+ public static final int COMPRESSION_DEFLATE = 32946; /* Deflate compression */
+ public static final int COMPRESSION_ADOBE_DEFLATE = 8; /* Deflate compression, as recognized by Adobe */
+ /* compression code 32947 is reserved for Oceana Matrix <dev@oceana.com> */
+ public static final int COMPRESSION_DCS = 32947; /* Kodak DCS encoding */
+ public static final int COMPRESSION_JBIG = 34661; /* ISO JBIG */
+ public static final int COMPRESSION_SGILOG = 34676; /* SGI Log Luminance RLE */
+ public static final int COMPRESSION_SGILOG24 = 34677; /* SGI Log 24-bit packed */
+ public static final int TIFFTAG_PHOTOMETRIC = 262; /* photometric interpretation */
+ public static final int PHOTOMETRIC_MINISWHITE = 0; /* min value is white */
+ public static final int PHOTOMETRIC_MINISBLACK = 1; /* min value is black */
+ public static final int PHOTOMETRIC_RGB = 2; /* RGB color model */
+ public static final int PHOTOMETRIC_PALETTE = 3; /* color map indexed */
+ public static final int PHOTOMETRIC_MASK = 4; /* $holdout mask */
+ public static final int PHOTOMETRIC_SEPARATED = 5; /* !color separations */
+ public static final int PHOTOMETRIC_YCBCR = 6; /* !CCIR 601 */
+ public static final int PHOTOMETRIC_CIELAB = 8; /* !1976 CIE L*a*b* */
+ public static final int PHOTOMETRIC_LOGL = 32844; /* CIE Log2(L) */
+ public static final int PHOTOMETRIC_LOGLUV = 32845; /* CIE Log2(L) (u',v') */
+ public static final int TIFFTAG_THRESHHOLDING = 263; /* +thresholding used on data */
+ public static final int THRESHHOLD_BILEVEL = 1; /* b&w art scan */
+ public static final int THRESHHOLD_HALFTONE = 2; /* or dithered scan */
+ public static final int THRESHHOLD_ERRORDIFFUSE = 3; /* usually floyd-steinberg */
+ public static final int TIFFTAG_CELLWIDTH = 264; /* +dithering matrix width */
+ public static final int TIFFTAG_CELLLENGTH = 265; /* +dithering matrix height */
+ public static final int TIFFTAG_FILLORDER = 266; /* data order within a byte */
+ public static final int FILLORDER_MSB2LSB = 1; /* most significant -> least */
+ public static final int FILLORDER_LSB2MSB = 2; /* least significant -> most */
+ public static final int TIFFTAG_DOCUMENTNAME = 269; /* name of doc. image is from */
+ public static final int TIFFTAG_IMAGEDESCRIPTION = 270; /* info about image */
+ public static final int TIFFTAG_MAKE = 271; /* scanner manufacturer name */
+ public static final int TIFFTAG_MODEL = 272; /* scanner model name/number */
+ public static final int TIFFTAG_STRIPOFFSETS = 273; /* offsets to data strips */
+ public static final int TIFFTAG_ORIENTATION = 274; /* +image orientation */
+ public static final int ORIENTATION_TOPLEFT = 1; /* row 0 top, col 0 lhs */
+ public static final int ORIENTATION_TOPRIGHT = 2; /* row 0 top, col 0 rhs */
+ public static final int ORIENTATION_BOTRIGHT = 3; /* row 0 bottom, col 0 rhs */
+ public static final int ORIENTATION_BOTLEFT = 4; /* row 0 bottom, col 0 lhs */
+ public static final int ORIENTATION_LEFTTOP = 5; /* row 0 lhs, col 0 top */
+ public static final int ORIENTATION_RIGHTTOP = 6; /* row 0 rhs, col 0 top */
+ public static final int ORIENTATION_RIGHTBOT = 7; /* row 0 rhs, col 0 bottom */
+ public static final int ORIENTATION_LEFTBOT = 8; /* row 0 lhs, col 0 bottom */
+ public static final int TIFFTAG_SAMPLESPERPIXEL = 277; /* samples per pixel */
+ public static final int TIFFTAG_ROWSPERSTRIP = 278; /* rows per strip of data */
+ public static final int TIFFTAG_STRIPBYTECOUNTS = 279; /* bytes counts for strips */
+ public static final int TIFFTAG_MINSAMPLEVALUE = 280; /* +minimum sample value */
+ public static final int TIFFTAG_MAXSAMPLEVALUE = 281; /* +maximum sample value */
+ public static final int TIFFTAG_XRESOLUTION = 282; /* pixels/resolution in x */
+ public static final int TIFFTAG_YRESOLUTION = 283; /* pixels/resolution in y */
+ public static final int TIFFTAG_PLANARCONFIG = 284; /* storage organization */
+ public static final int PLANARCONFIG_CONTIG = 1; /* single image plane */
+ public static final int PLANARCONFIG_SEPARATE = 2; /* separate planes of data */
+ public static final int TIFFTAG_PAGENAME = 285; /* page name image is from */
+ public static final int TIFFTAG_XPOSITION = 286; /* x page offset of image lhs */
+ public static final int TIFFTAG_YPOSITION = 287; /* y page offset of image lhs */
+ public static final int TIFFTAG_FREEOFFSETS = 288; /* +byte offset to free block */
+ public static final int TIFFTAG_FREEBYTECOUNTS = 289; /* +sizes of free blocks */
+ public static final int TIFFTAG_GRAYRESPONSEUNIT = 290; /* $gray scale curve accuracy */
+ public static final int GRAYRESPONSEUNIT_10S = 1; /* tenths of a unit */
+ public static final int GRAYRESPONSEUNIT_100S = 2; /* hundredths of a unit */
+ public static final int GRAYRESPONSEUNIT_1000S = 3; /* thousandths of a unit */
+ public static final int GRAYRESPONSEUNIT_10000S = 4; /* ten-thousandths of a unit */
+ public static final int GRAYRESPONSEUNIT_100000S = 5; /* hundred-thousandths */
+ public static final int TIFFTAG_GRAYRESPONSECURVE = 291; /* $gray scale response curve */
+ public static final int TIFFTAG_GROUP3OPTIONS = 292; /* 32 flag bits */
+ public static final int GROUP3OPT_2DENCODING = 0x1; /* 2-dimensional coding */
+ public static final int GROUP3OPT_UNCOMPRESSED = 0x2; /* data not compressed */
+ public static final int GROUP3OPT_FILLBITS = 0x4; /* fill to byte boundary */
+ public static final int TIFFTAG_GROUP4OPTIONS = 293; /* 32 flag bits */
+ public static final int GROUP4OPT_UNCOMPRESSED = 0x2; /* data not compressed */
+ public static final int TIFFTAG_RESOLUTIONUNIT = 296; /* units of resolutions */
+ public static final int RESUNIT_NONE = 1; /* no meaningful units */
+ public static final int RESUNIT_INCH = 2; /* english */
+ public static final int RESUNIT_CENTIMETER = 3; /* metric */
+ public static final int TIFFTAG_PAGENUMBER = 297; /* page numbers of multi-page */
+ public static final int TIFFTAG_COLORRESPONSEUNIT = 300; /* $color curve accuracy */
+ public static final int COLORRESPONSEUNIT_10S = 1; /* tenths of a unit */
+ public static final int COLORRESPONSEUNIT_100S = 2; /* hundredths of a unit */
+ public static final int COLORRESPONSEUNIT_1000S = 3; /* thousandths of a unit */
+ public static final int COLORRESPONSEUNIT_10000S = 4; /* ten-thousandths of a unit */
+ public static final int COLORRESPONSEUNIT_100000S = 5; /* hundred-thousandths */
+ public static final int TIFFTAG_TRANSFERFUNCTION = 301; /* !colorimetry info */
+ public static final int TIFFTAG_SOFTWARE = 305; /* name & release */
+ public static final int TIFFTAG_DATETIME = 306; /* creation date and time */
+ public static final int TIFFTAG_ARTIST = 315; /* creator of image */
+ public static final int TIFFTAG_HOSTCOMPUTER = 316; /* machine where created */
+ public static final int TIFFTAG_PREDICTOR = 317; /* prediction scheme w/ LZW */
+ public static final int TIFFTAG_WHITEPOINT = 318; /* image white point */
+ public static final int TIFFTAG_PRIMARYCHROMATICITIES = 319; /* !primary chromaticities */
+ public static final int TIFFTAG_COLORMAP = 320; /* RGB map for pallette image */
+ public static final int TIFFTAG_HALFTONEHINTS = 321; /* !highlight+shadow info */
+ public static final int TIFFTAG_TILEWIDTH = 322; /* !rows/data tile */
+ public static final int TIFFTAG_TILELENGTH = 323; /* !cols/data tile */
+ public static final int TIFFTAG_TILEOFFSETS = 324; /* !offsets to data tiles */
+ public static final int TIFFTAG_TILEBYTECOUNTS = 325; /* !byte counts for tiles */
+ public static final int TIFFTAG_BADFAXLINES = 326; /* lines w/ wrong pixel count */
+ public static final int TIFFTAG_CLEANFAXDATA = 327; /* regenerated line info */
+ public static final int CLEANFAXDATA_CLEAN = 0; /* no errors detected */
+ public static final int CLEANFAXDATA_REGENERATED = 1; /* receiver regenerated lines */
+ public static final int CLEANFAXDATA_UNCLEAN = 2; /* uncorrected errors exist */
+ public static final int TIFFTAG_CONSECUTIVEBADFAXLINES = 328; /* max consecutive bad lines */
+ public static final int TIFFTAG_SUBIFD = 330; /* subimage descriptors */
+ public static final int TIFFTAG_INKSET = 332; /* !inks in separated image */
+ public static final int INKSET_CMYK = 1; /* !cyan-magenta-yellow-black */
+ public static final int TIFFTAG_INKNAMES = 333; /* !ascii names of inks */
+ public static final int TIFFTAG_NUMBEROFINKS = 334; /* !number of inks */
+ public static final int TIFFTAG_DOTRANGE = 336; /* !0% and 100% dot codes */
+ public static final int TIFFTAG_TARGETPRINTER = 337; /* !separation target */
+ public static final int TIFFTAG_EXTRASAMPLES = 338; /* !info about extra samples */
+ public static final int EXTRASAMPLE_UNSPECIFIED = 0; /* !unspecified data */
+ public static final int EXTRASAMPLE_ASSOCALPHA = 1; /* !associated alpha data */
+ public static final int EXTRASAMPLE_UNASSALPHA = 2; /* !unassociated alpha data */
+ public static final int TIFFTAG_SAMPLEFORMAT = 339; /* !data sample format */
+ public static final int SAMPLEFORMAT_UINT = 1; /* !unsigned integer data */
+ public static final int SAMPLEFORMAT_INT = 2; /* !signed integer data */
+ public static final int SAMPLEFORMAT_IEEEFP = 3; /* !IEEE floating point data */
+ public static final int SAMPLEFORMAT_VOID = 4; /* !untyped data */
+ public static final int SAMPLEFORMAT_COMPLEXINT = 5; /* !complex signed int */
+ public static final int SAMPLEFORMAT_COMPLEXIEEEFP = 6; /* !complex ieee floating */
+ public static final int TIFFTAG_SMINSAMPLEVALUE = 340; /* !variable MinSampleValue */
+ public static final int TIFFTAG_SMAXSAMPLEVALUE = 341; /* !variable MaxSampleValue */
+ public static final int TIFFTAG_JPEGTABLES = 347; /* %JPEG table stream */
+/*
+ * Tags 512-521 are obsoleted by Technical Note #2
+ * which specifies a revised JPEG-in-TIFF scheme.
+ */
+ public static final int TIFFTAG_JPEGPROC = 512; /* !JPEG processing algorithm */
+ public static final int JPEGPROC_BASELINE = 1; /* !baseline sequential */
+ public static final int JPEGPROC_LOSSLESS = 14; /* !Huffman coded lossless */
+ public static final int TIFFTAG_JPEGIFOFFSET = 513; /* !pointer to SOI marker */
+ public static final int TIFFTAG_JPEGIFBYTECOUNT = 514; /* !JFIF stream length */
+ public static final int TIFFTAG_JPEGRESTARTINTERVAL = 515; /* !restart interval length */
+ public static final int TIFFTAG_JPEGLOSSLESSPREDICTORS = 517; /* !lossless proc predictor */
+ public static final int TIFFTAG_JPEGPOINTTRANSFORM = 518; /* !lossless point transform */
+ public static final int TIFFTAG_JPEGQTABLES = 519; /* !Q matrice offsets */
+ public static final int TIFFTAG_JPEGDCTABLES = 520; /* !DCT table offsets */
+ public static final int TIFFTAG_JPEGACTABLES = 521; /* !AC coefficient offsets */
+ public static final int TIFFTAG_YCBCRCOEFFICIENTS = 529; /* !RGB -> YCbCr transform */
+ public static final int TIFFTAG_YCBCRSUBSAMPLING = 530; /* !YCbCr subsampling factors */
+ public static final int TIFFTAG_YCBCRPOSITIONING = 531; /* !subsample positioning */
+ public static final int YCBCRPOSITION_CENTERED = 1; /* !as in PostScript Level 2 */
+ public static final int YCBCRPOSITION_COSITED = 2; /* !as in CCIR 601-1 */
+ public static final int TIFFTAG_REFERENCEBLACKWHITE = 532; /* !colorimetry info */
+ /* tags 32952-32956 are private tags registered to Island Graphics */
+ public static final int TIFFTAG_REFPTS = 32953; /* image reference points */
+ public static final int TIFFTAG_REGIONTACKPOINT = 32954; /* region-xform tack point */
+ public static final int TIFFTAG_REGIONWARPCORNERS = 32955; /* warp quadrilateral */
+ public static final int TIFFTAG_REGIONAFFINE = 32956; /* affine transformation mat */
+ /* tags 32995-32999 are private tags registered to SGI */
+ public static final int TIFFTAG_MATTEING = 32995; /* $use ExtraSamples */
+ public static final int TIFFTAG_DATATYPE = 32996; /* $use SampleFormat */
+ public static final int TIFFTAG_IMAGEDEPTH = 32997; /* z depth of image */
+ public static final int TIFFTAG_TILEDEPTH = 32998; /* z depth/data tile */
+ /* tags 33300-33309 are private tags registered to Pixar */
+/*
+ * TIFFTAG_PIXAR_IMAGEFULLWIDTH and TIFFTAG_PIXAR_IMAGEFULLLENGTH
+ * are set when an image has been cropped out of a larger image.
+ * They reflect the size of the original uncropped image.
+ * The TIFFTAG_XPOSITION and TIFFTAG_YPOSITION can be used
+ * to determine the position of the smaller image in the larger one.
+ */
+ public static final int TIFFTAG_PIXAR_IMAGEFULLWIDTH = 33300; /* full image size in x */
+ public static final int TIFFTAG_PIXAR_IMAGEFULLLENGTH = 33301; /* full image size in y */
+ /* Tags 33302-33306 are used to identify special image modes and data
+ * used by Pixar's texture formats.
+ */
+ public static final int TIFFTAG_PIXAR_TEXTUREFORMAT = 33302; /* texture map format */
+ public static final int TIFFTAG_PIXAR_WRAPMODES = 33303; /* s & t wrap modes */
+ public static final int TIFFTAG_PIXAR_FOVCOT = 33304; /* cotan(fov) for env. maps */
+ public static final int TIFFTAG_PIXAR_MATRIX_WORLDTOSCREEN = 33305;
+ public static final int TIFFTAG_PIXAR_MATRIX_WORLDTOCAMERA = 33306;
+ /* tag 33405 is a private tag registered to Eastman Kodak */
+ public static final int TIFFTAG_WRITERSERIALNUMBER = 33405; /* device serial number */
+ /* tag 33432 is listed in the 6.0 spec w/ unknown ownership */
+ public static final int TIFFTAG_COPYRIGHT = 33432; /* copyright string */
+ /* IPTC TAG from RichTIFF specifications */
+ public static final int TIFFTAG_RICHTIFFIPTC = 33723;
+ /* 34016-34029 are reserved for ANSI IT8 TIFF/IT <dkelly@etsinc.com) */
+ public static final int TIFFTAG_IT8SITE = 34016; /* site name */
+ public static final int TIFFTAG_IT8COLORSEQUENCE = 34017; /* color seq. [RGB,CMYK,etc] */
+ public static final int TIFFTAG_IT8HEADER = 34018; /* DDES Header */
+ public static final int TIFFTAG_IT8RASTERPADDING = 34019; /* raster scanline padding */
+ public static final int TIFFTAG_IT8BITSPERRUNLENGTH = 34020; /* # of bits in short run */
+ public static final int TIFFTAG_IT8BITSPEREXTENDEDRUNLENGTH = 34021;/* # of bits in long run */
+ public static final int TIFFTAG_IT8COLORTABLE = 34022; /* LW colortable */
+ public static final int TIFFTAG_IT8IMAGECOLORINDICATOR = 34023; /* BP/BL image color switch */
+ public static final int TIFFTAG_IT8BKGCOLORINDICATOR = 34024; /* BP/BL bg color switch */
+ public static final int TIFFTAG_IT8IMAGECOLORVALUE = 34025; /* BP/BL image color value */
+ public static final int TIFFTAG_IT8BKGCOLORVALUE = 34026; /* BP/BL bg color value */
+ public static final int TIFFTAG_IT8PIXELINTENSITYRANGE = 34027; /* MP pixel intensity value */
+ public static final int TIFFTAG_IT8TRANSPARENCYINDICATOR = 34028; /* HC transparency switch */
+ public static final int TIFFTAG_IT8COLORCHARACTERIZATION = 34029; /* color character. table */
+ /* tags 34232-34236 are private tags registered to Texas Instruments */
+ public static final int TIFFTAG_FRAMECOUNT = 34232; /* Sequence Frame Count */
+ /* tag 34750 is a private tag registered to Adobe? */
+ public static final int TIFFTAG_ICCPROFILE = 34675; /* ICC profile data */
+ /* tag 34377 is private tag registered to Adobe for PhotoShop */
+ public static final int TIFFTAG_PHOTOSHOP = 34377;
+ /* tag 34750 is a private tag registered to Pixel Magic */
+ public static final int TIFFTAG_JBIGOPTIONS = 34750; /* JBIG options */
+ /* tags 34908-34914 are private tags registered to SGI */
+ public static final int TIFFTAG_FAXRECVPARAMS = 34908; /* encoded Class 2 ses. parms */
+ public static final int TIFFTAG_FAXSUBADDRESS = 34909; /* received SubAddr string */
+ public static final int TIFFTAG_FAXRECVTIME = 34910; /* receive time (secs) */
+ /* tags 37439-37443 are registered to SGI <gregl@sgi.com> */
+ public static final int TIFFTAG_STONITS = 37439; /* Sample value to Nits */
+ /* tag 34929 is a private tag registered to FedEx */
+ public static final int TIFFTAG_FEDEX_EDR = 34929; /* unknown use */
+ /* tag 65535 is an undefined tag used by Eastman Kodak */
+ public static final int TIFFTAG_DCSHUESHIFTVALUES = 65535; /* hue shift correction data */
+
+}
diff --git a/src/main/java/com/lowagie/text/pdf/codec/TIFFDirectory.java b/src/main/java/com/lowagie/text/pdf/codec/TIFFDirectory.java
new file mode 100644
index 0000000..abcc0dd
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/codec/TIFFDirectory.java
@@ -0,0 +1,656 @@
+/*
+ * Copyright (c) 2001 Sun Microsystems, Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * -Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * -Redistribution in binary form must reproduct the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of contributors may
+ * be used to endorse or promote products derived from this software without
+ * specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any kind. ALL
+ * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING ANY
+ * IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ * NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN AND ITS LICENSORS SHALL NOT BE
+ * LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
+ * OR DISTRIBUTING THE SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR ITS
+ * LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT,
+ * INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER
+ * CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF
+ * OR INABILITY TO USE SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that Software is not designed,licensed or intended for use in
+ * the design, construction, operation or maintenance of any nuclear facility.
+ */
+package com.lowagie.text.pdf.codec;
+import java.io.IOException;
+import java.io.EOFException;
+import java.io.Serializable;
+import java.util.Enumeration;
+import java.util.Hashtable;
+import java.util.ArrayList;
+import com.lowagie.text.pdf.RandomAccessFileOrArray;
+
+/**
+ * A class representing an Image File Directory (IFD) from a TIFF 6.0
+ * stream. The TIFF file format is described in more detail in the
+ * comments for the TIFFDescriptor class.
+ *
+ * <p> A TIFF IFD consists of a set of TIFFField tags. Methods are
+ * provided to query the set of tags and to obtain the raw field
+ * array. In addition, convenience methods are provided for acquiring
+ * the values of tags that contain a single value that fits into a
+ * byte, int, long, float, or double.
+ *
+ * <p> Every TIFF file is made up of one or more public IFDs that are
+ * joined in a linked list, rooted in the file header. A file may
+ * also contain so-called private IFDs that are referenced from
+ * tag data and do not appear in the main list.
+ *
+ * <p><b> This class is not a committed part of the JAI API. It may
+ * be removed or changed in future releases of JAI.</b>
+ *
+ * @see TIFFField
+ */
+public class TIFFDirectory extends Object implements Serializable {
+
+ /** A boolean storing the endianness of the stream. */
+ boolean isBigEndian;
+
+ /** The number of entries in the IFD. */
+ int numEntries;
+
+ /** An array of TIFFFields. */
+ TIFFField[] fields;
+
+ /** A Hashtable indexing the fields by tag number. */
+ Hashtable fieldIndex = new Hashtable();
+
+ /** The offset of this IFD. */
+ long IFDOffset = 8;
+
+ /** The offset of the next IFD. */
+ long nextIFDOffset = 0;
+
+ /** The default constructor. */
+ TIFFDirectory() {}
+
+ private static boolean isValidEndianTag(int endian) {
+ return ((endian == 0x4949) || (endian == 0x4d4d));
+ }
+
+ /**
+ * Constructs a TIFFDirectory from a SeekableStream.
+ * The directory parameter specifies which directory to read from
+ * the linked list present in the stream; directory 0 is normally
+ * read but it is possible to store multiple images in a single
+ * TIFF file by maintaing multiple directories.
+ *
+ * @param stream a SeekableStream to read from.
+ * @param directory the index of the directory to read.
+ */
+ public TIFFDirectory(RandomAccessFileOrArray stream, int directory)
+ throws IOException {
+
+ long global_save_offset = stream.getFilePointer();
+ long ifd_offset;
+
+ // Read the TIFF header
+ stream.seek(0L);
+ int endian = stream.readUnsignedShort();
+ if (!isValidEndianTag(endian)) {
+ throw new
+ IllegalArgumentException("Bad endianness tag (not 0x4949 or 0x4d4d).");
+ }
+ isBigEndian = (endian == 0x4d4d);
+
+ int magic = readUnsignedShort(stream);
+ if (magic != 42) {
+ throw new
+ IllegalArgumentException("Bad magic number, should be 42.");
+ }
+
+ // Get the initial ifd offset as an unsigned int (using a long)
+ ifd_offset = readUnsignedInt(stream);
+
+ for (int i = 0; i < directory; i++) {
+ if (ifd_offset == 0L) {
+ throw new
+ IllegalArgumentException("Directory number too large.");
+ }
+
+ stream.seek(ifd_offset);
+ int entries = readUnsignedShort(stream);
+ stream.skip(12*entries);
+
+ ifd_offset = readUnsignedInt(stream);
+ }
+
+ stream.seek(ifd_offset);
+ initialize(stream);
+ stream.seek(global_save_offset);
+ }
+
+ /**
+ * Constructs a TIFFDirectory by reading a SeekableStream.
+ * The ifd_offset parameter specifies the stream offset from which
+ * to begin reading; this mechanism is sometimes used to store
+ * private IFDs within a TIFF file that are not part of the normal
+ * sequence of IFDs.
+ *
+ * @param stream a SeekableStream to read from.
+ * @param ifd_offset the long byte offset of the directory.
+ * @param directory the index of the directory to read beyond the
+ * one at the current stream offset; zero indicates the IFD
+ * at the current offset.
+ */
+ public TIFFDirectory(RandomAccessFileOrArray stream, long ifd_offset, int directory)
+ throws IOException {
+
+ long global_save_offset = stream.getFilePointer();
+ stream.seek(0L);
+ int endian = stream.readUnsignedShort();
+ if (!isValidEndianTag(endian)) {
+ throw new
+ IllegalArgumentException("Bad endianness tag (not 0x4949 or 0x4d4d).");
+ }
+ isBigEndian = (endian == 0x4d4d);
+
+ // Seek to the first IFD.
+ stream.seek(ifd_offset);
+
+ // Seek to desired IFD if necessary.
+ int dirNum = 0;
+ while(dirNum < directory) {
+ // Get the number of fields in the current IFD.
+ int numEntries = readUnsignedShort(stream);
+
+ // Skip to the next IFD offset value field.
+ stream.seek(ifd_offset + 12*numEntries);
+
+ // Read the offset to the next IFD beyond this one.
+ ifd_offset = readUnsignedInt(stream);
+
+ // Seek to the next IFD.
+ stream.seek(ifd_offset);
+
+ // Increment the directory.
+ dirNum++;
+ }
+
+ initialize(stream);
+ stream.seek(global_save_offset);
+ }
+
+ private static final int[] sizeOfType = {
+ 0, // 0 = n/a
+ 1, // 1 = byte
+ 1, // 2 = ascii
+ 2, // 3 = short
+ 4, // 4 = long
+ 8, // 5 = rational
+ 1, // 6 = sbyte
+ 1, // 7 = undefined
+ 2, // 8 = sshort
+ 4, // 9 = slong
+ 8, // 10 = srational
+ 4, // 11 = float
+ 8 // 12 = double
+ };
+
+ private void initialize(RandomAccessFileOrArray stream) throws IOException {
+ long nextTagOffset = 0L;
+ long maxOffset = stream.length();
+ int i, j;
+
+ IFDOffset = stream.getFilePointer();
+
+ numEntries = readUnsignedShort(stream);
+ fields = new TIFFField[numEntries];
+
+ for (i = 0; (i < numEntries) && (nextTagOffset < maxOffset); i++) {
+ int tag = readUnsignedShort(stream);
+ int type = readUnsignedShort(stream);
+ int count = (int)(readUnsignedInt(stream));
+ boolean processTag = true;
+
+ // The place to return to to read the next tag
+ nextTagOffset = stream.getFilePointer() + 4;
+
+ try {
+ // If the tag data can't fit in 4 bytes, the next 4 bytes
+ // contain the starting offset of the data
+ if (count*sizeOfType[type] > 4) {
+ long valueOffset = readUnsignedInt(stream);
+
+ // bounds check offset for EOF
+ if (valueOffset < maxOffset) {
+ stream.seek(valueOffset);
+ }
+ else {
+ // bad offset pointer .. skip tag
+ processTag = false;
+ }
+ }
+ } catch (ArrayIndexOutOfBoundsException ae) {
+ // if the data type is unknown we should skip this TIFF Field
+ processTag = false;
+ }
+
+ if (processTag) {
+ fieldIndex.put(new Integer(tag), new Integer(i));
+ Object obj = null;
+
+ switch (type) {
+ case TIFFField.TIFF_BYTE:
+ case TIFFField.TIFF_SBYTE:
+ case TIFFField.TIFF_UNDEFINED:
+ case TIFFField.TIFF_ASCII:
+ byte[] bvalues = new byte[count];
+ stream.readFully(bvalues, 0, count);
+
+ if (type == TIFFField.TIFF_ASCII) {
+
+ // Can be multiple strings
+ int index = 0, prevIndex = 0;
+ ArrayList v = new ArrayList();
+
+ while (index < count) {
+
+ while ((index < count) && (bvalues[index++] != 0));
+
+ // When we encountered zero, means one string has ended
+ v.add(new String(bvalues, prevIndex,
+ (index - prevIndex)) );
+ prevIndex = index;
+ }
+
+ count = v.size();
+ String strings[] = new String[count];
+ for (int c = 0 ; c < count; c++) {
+ strings[c] = (String)v.get(c);
+ }
+
+ obj = strings;
+ } else {
+ obj = bvalues;
+ }
+
+ break;
+
+ case TIFFField.TIFF_SHORT:
+ char[] cvalues = new char[count];
+ for (j = 0; j < count; j++) {
+ cvalues[j] = (char)(readUnsignedShort(stream));
+ }
+ obj = cvalues;
+ break;
+
+ case TIFFField.TIFF_LONG:
+ long[] lvalues = new long[count];
+ for (j = 0; j < count; j++) {
+ lvalues[j] = readUnsignedInt(stream);
+ }
+ obj = lvalues;
+ break;
+
+ case TIFFField.TIFF_RATIONAL:
+ long[][] llvalues = new long[count][2];
+ for (j = 0; j < count; j++) {
+ llvalues[j][0] = readUnsignedInt(stream);
+ llvalues[j][1] = readUnsignedInt(stream);
+ }
+ obj = llvalues;
+ break;
+
+ case TIFFField.TIFF_SSHORT:
+ short[] svalues = new short[count];
+ for (j = 0; j < count; j++) {
+ svalues[j] = readShort(stream);
+ }
+ obj = svalues;
+ break;
+
+ case TIFFField.TIFF_SLONG:
+ int[] ivalues = new int[count];
+ for (j = 0; j < count; j++) {
+ ivalues[j] = readInt(stream);
+ }
+ obj = ivalues;
+ break;
+
+ case TIFFField.TIFF_SRATIONAL:
+ int[][] iivalues = new int[count][2];
+ for (j = 0; j < count; j++) {
+ iivalues[j][0] = readInt(stream);
+ iivalues[j][1] = readInt(stream);
+ }
+ obj = iivalues;
+ break;
+
+ case TIFFField.TIFF_FLOAT:
+ float[] fvalues = new float[count];
+ for (j = 0; j < count; j++) {
+ fvalues[j] = readFloat(stream);
+ }
+ obj = fvalues;
+ break;
+
+ case TIFFField.TIFF_DOUBLE:
+ double[] dvalues = new double[count];
+ for (j = 0; j < count; j++) {
+ dvalues[j] = readDouble(stream);
+ }
+ obj = dvalues;
+ break;
+
+ default:
+ break;
+ }
+
+ fields[i] = new TIFFField(tag, type, count, obj);
+ }
+
+ stream.seek(nextTagOffset);
+ }
+
+ // Read the offset of the next IFD.
+ nextIFDOffset = readUnsignedInt(stream);
+ }
+
+ /** Returns the number of directory entries. */
+ public int getNumEntries() {
+ return numEntries;
+ }
+
+ /**
+ * Returns the value of a given tag as a TIFFField,
+ * or null if the tag is not present.
+ */
+ public TIFFField getField(int tag) {
+ Integer i = (Integer)fieldIndex.get(new Integer(tag));
+ if (i == null) {
+ return null;
+ } else {
+ return fields[i.intValue()];
+ }
+ }
+
+ /**
+ * Returns true if a tag appears in the directory.
+ */
+ public boolean isTagPresent(int tag) {
+ return fieldIndex.containsKey(new Integer(tag));
+ }
+
+ /**
+ * Returns an ordered array of ints indicating the tag
+ * values.
+ */
+ public int[] getTags() {
+ int[] tags = new int[fieldIndex.size()];
+ Enumeration e = fieldIndex.keys();
+ int i = 0;
+
+ while (e.hasMoreElements()) {
+ tags[i++] = ((Integer)e.nextElement()).intValue();
+ }
+
+ return tags;
+ }
+
+ /**
+ * Returns an array of TIFFFields containing all the fields
+ * in this directory.
+ */
+ public TIFFField[] getFields() {
+ return fields;
+ }
+
+ /**
+ * Returns the value of a particular index of a given tag as a
+ * byte. The caller is responsible for ensuring that the tag is
+ * present and has type TIFFField.TIFF_SBYTE, TIFF_BYTE, or
+ * TIFF_UNDEFINED.
+ */
+ public byte getFieldAsByte(int tag, int index) {
+ Integer i = (Integer)fieldIndex.get(new Integer(tag));
+ byte [] b = (fields[i.intValue()]).getAsBytes();
+ return b[index];
+ }
+
+ /**
+ * Returns the value of index 0 of a given tag as a
+ * byte. The caller is responsible for ensuring that the tag is
+ * present and has type TIFFField.TIFF_SBYTE, TIFF_BYTE, or
+ * TIFF_UNDEFINED.
+ */
+ public byte getFieldAsByte(int tag) {
+ return getFieldAsByte(tag, 0);
+ }
+
+ /**
+ * Returns the value of a particular index of a given tag as a
+ * long. The caller is responsible for ensuring that the tag is
+ * present and has type TIFF_BYTE, TIFF_SBYTE, TIFF_UNDEFINED,
+ * TIFF_SHORT, TIFF_SSHORT, TIFF_SLONG or TIFF_LONG.
+ */
+ public long getFieldAsLong(int tag, int index) {
+ Integer i = (Integer)fieldIndex.get(new Integer(tag));
+ return (fields[i.intValue()]).getAsLong(index);
+ }
+
+ /**
+ * Returns the value of index 0 of a given tag as a
+ * long. The caller is responsible for ensuring that the tag is
+ * present and has type TIFF_BYTE, TIFF_SBYTE, TIFF_UNDEFINED,
+ * TIFF_SHORT, TIFF_SSHORT, TIFF_SLONG or TIFF_LONG.
+ */
+ public long getFieldAsLong(int tag) {
+ return getFieldAsLong(tag, 0);
+ }
+
+ /**
+ * Returns the value of a particular index of a given tag as a
+ * float. The caller is responsible for ensuring that the tag is
+ * present and has numeric type (all but TIFF_UNDEFINED and
+ * TIFF_ASCII).
+ */
+ public float getFieldAsFloat(int tag, int index) {
+ Integer i = (Integer)fieldIndex.get(new Integer(tag));
+ return fields[i.intValue()].getAsFloat(index);
+ }
+
+ /**
+ * Returns the value of index 0 of a given tag as a float. The
+ * caller is responsible for ensuring that the tag is present and
+ * has numeric type (all but TIFF_UNDEFINED and TIFF_ASCII).
+ */
+ public float getFieldAsFloat(int tag) {
+ return getFieldAsFloat(tag, 0);
+ }
+
+ /**
+ * Returns the value of a particular index of a given tag as a
+ * double. The caller is responsible for ensuring that the tag is
+ * present and has numeric type (all but TIFF_UNDEFINED and
+ * TIFF_ASCII).
+ */
+ public double getFieldAsDouble(int tag, int index) {
+ Integer i = (Integer)fieldIndex.get(new Integer(tag));
+ return fields[i.intValue()].getAsDouble(index);
+ }
+
+ /**
+ * Returns the value of index 0 of a given tag as a double. The
+ * caller is responsible for ensuring that the tag is present and
+ * has numeric type (all but TIFF_UNDEFINED and TIFF_ASCII).
+ */
+ public double getFieldAsDouble(int tag) {
+ return getFieldAsDouble(tag, 0);
+ }
+
+ // Methods to read primitive data types from the stream
+
+ private short readShort(RandomAccessFileOrArray stream)
+ throws IOException {
+ if (isBigEndian) {
+ return stream.readShort();
+ } else {
+ return stream.readShortLE();
+ }
+ }
+
+ private int readUnsignedShort(RandomAccessFileOrArray stream)
+ throws IOException {
+ if (isBigEndian) {
+ return stream.readUnsignedShort();
+ } else {
+ return stream.readUnsignedShortLE();
+ }
+ }
+
+ private int readInt(RandomAccessFileOrArray stream)
+ throws IOException {
+ if (isBigEndian) {
+ return stream.readInt();
+ } else {
+ return stream.readIntLE();
+ }
+ }
+
+ private long readUnsignedInt(RandomAccessFileOrArray stream)
+ throws IOException {
+ if (isBigEndian) {
+ return stream.readUnsignedInt();
+ } else {
+ return stream.readUnsignedIntLE();
+ }
+ }
+
+ private long readLong(RandomAccessFileOrArray stream)
+ throws IOException {
+ if (isBigEndian) {
+ return stream.readLong();
+ } else {
+ return stream.readLongLE();
+ }
+ }
+
+ private float readFloat(RandomAccessFileOrArray stream)
+ throws IOException {
+ if (isBigEndian) {
+ return stream.readFloat();
+ } else {
+ return stream.readFloatLE();
+ }
+ }
+
+ private double readDouble(RandomAccessFileOrArray stream)
+ throws IOException {
+ if (isBigEndian) {
+ return stream.readDouble();
+ } else {
+ return stream.readDoubleLE();
+ }
+ }
+
+ private static int readUnsignedShort(RandomAccessFileOrArray stream,
+ boolean isBigEndian)
+ throws IOException {
+ if (isBigEndian) {
+ return stream.readUnsignedShort();
+ } else {
+ return stream.readUnsignedShortLE();
+ }
+ }
+
+ private static long readUnsignedInt(RandomAccessFileOrArray stream,
+ boolean isBigEndian)
+ throws IOException {
+ if (isBigEndian) {
+ return stream.readUnsignedInt();
+ } else {
+ return stream.readUnsignedIntLE();
+ }
+ }
+
+ // Utilities
+
+ /**
+ * Returns the number of image directories (subimages) stored in a
+ * given TIFF file, represented by a <code>SeekableStream</code>.
+ */
+ public static int getNumDirectories(RandomAccessFileOrArray stream)
+ throws IOException{
+ long pointer = stream.getFilePointer(); // Save stream pointer
+
+ stream.seek(0L);
+ int endian = stream.readUnsignedShort();
+ if (!isValidEndianTag(endian)) {
+ throw new
+ IllegalArgumentException("Bad endianness tag (not 0x4949 or 0x4d4d).");
+ }
+ boolean isBigEndian = (endian == 0x4d4d);
+ int magic = readUnsignedShort(stream, isBigEndian);
+ if (magic != 42) {
+ throw new
+ IllegalArgumentException("Bad magic number, should be 42.");
+ }
+
+ stream.seek(4L);
+ long offset = readUnsignedInt(stream, isBigEndian);
+
+ int numDirectories = 0;
+ while (offset != 0L) {
+ ++numDirectories;
+
+ // EOFException means IFD was probably not properly terminated.
+ try {
+ stream.seek(offset);
+ int entries = readUnsignedShort(stream, isBigEndian);
+ stream.skip(12*entries);
+ offset = readUnsignedInt(stream, isBigEndian);
+ } catch(EOFException eof) {
+ numDirectories--;
+ break;
+ }
+ }
+
+ stream.seek(pointer); // Reset stream pointer
+ return numDirectories;
+ }
+
+ /**
+ * Returns a boolean indicating whether the byte order used in the
+ * the TIFF file is big-endian (i.e. whether the byte order is from
+ * the most significant to the least significant)
+ */
+ public boolean isBigEndian() {
+ return isBigEndian;
+ }
+
+ /**
+ * Returns the offset of the IFD corresponding to this
+ * <code>TIFFDirectory</code>.
+ */
+ public long getIFDOffset() {
+ return IFDOffset;
+ }
+
+ /**
+ * Returns the offset of the next IFD after the IFD corresponding to this
+ * <code>TIFFDirectory</code>.
+ */
+ public long getNextIFDOffset() {
+ return nextIFDOffset;
+ }
+}
diff --git a/src/main/java/com/lowagie/text/pdf/codec/TIFFFaxDecoder.java b/src/main/java/com/lowagie/text/pdf/codec/TIFFFaxDecoder.java
new file mode 100644
index 0000000..7a7b61c
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/codec/TIFFFaxDecoder.java
@@ -0,0 +1,1477 @@
+/*
+ * Copyright (c) 2001 Sun Microsystems, Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * -Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * -Redistribution in binary form must reproduct the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of contributors may
+ * be used to endorse or promote products derived from this software without
+ * specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any kind. ALL
+ * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING ANY
+ * IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ * NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN AND ITS LICENSORS SHALL NOT BE
+ * LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
+ * OR DISTRIBUTING THE SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR ITS
+ * LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT,
+ * INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER
+ * CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF
+ * OR INABILITY TO USE SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that Software is not designed,licensed or intended for use in
+ * the design, construction, operation or maintenance of any nuclear facility.
+ */
+package com.lowagie.text.pdf.codec;
+
+public class TIFFFaxDecoder {
+
+ private int bitPointer, bytePointer;
+ private byte[] data;
+ private int w, h;
+ private int fillOrder;
+
+ // Data structures needed to store changing elements for the previous
+ // and the current scanline
+ private int changingElemSize = 0;
+ private int prevChangingElems[];
+ private int currChangingElems[];
+
+ // Element at which to start search in getNextChangingElement
+ private int lastChangingElement = 0;
+
+ private int compression = 2;
+
+ // Variables set by T4Options
+ private int uncompressedMode = 0;
+ private int fillBits = 0;
+ private int oneD;
+
+ static int table1[] = {
+ 0x00, // 0 bits are left in first byte - SHOULD NOT HAPPEN
+ 0x01, // 1 bits are left in first byte
+ 0x03, // 2 bits are left in first byte
+ 0x07, // 3 bits are left in first byte
+ 0x0f, // 4 bits are left in first byte
+ 0x1f, // 5 bits are left in first byte
+ 0x3f, // 6 bits are left in first byte
+ 0x7f, // 7 bits are left in first byte
+ 0xff // 8 bits are left in first byte
+ };
+
+ static int table2[] = {
+ 0x00, // 0
+ 0x80, // 1
+ 0xc0, // 2
+ 0xe0, // 3
+ 0xf0, // 4
+ 0xf8, // 5
+ 0xfc, // 6
+ 0xfe, // 7
+ 0xff // 8
+ };
+
+ // Table to be used when fillOrder = 2, for flipping bytes.
+ static byte flipTable[] = {
+ 0, -128, 64, -64, 32, -96, 96, -32,
+ 16, -112, 80, -48, 48, -80, 112, -16,
+ 8, -120, 72, -56, 40, -88, 104, -24,
+ 24, -104, 88, -40, 56, -72, 120, -8,
+ 4, -124, 68, -60, 36, -92, 100, -28,
+ 20, -108, 84, -44, 52, -76, 116, -12,
+ 12, -116, 76, -52, 44, -84, 108, -20,
+ 28, -100, 92, -36, 60, -68, 124, -4,
+ 2, -126, 66, -62, 34, -94, 98, -30,
+ 18, -110, 82, -46, 50, -78, 114, -14,
+ 10, -118, 74, -54, 42, -86, 106, -22,
+ 26, -102, 90, -38, 58, -70, 122, -6,
+ 6, -122, 70, -58, 38, -90, 102, -26,
+ 22, -106, 86, -42, 54, -74, 118, -10,
+ 14, -114, 78, -50, 46, -82, 110, -18,
+ 30, -98, 94, -34, 62, -66, 126, -2,
+ 1, -127, 65, -63, 33, -95, 97, -31,
+ 17, -111, 81, -47, 49, -79, 113, -15,
+ 9, -119, 73, -55, 41, -87, 105, -23,
+ 25, -103, 89, -39, 57, -71, 121, -7,
+ 5, -123, 69, -59, 37, -91, 101, -27,
+ 21, -107, 85, -43, 53, -75, 117, -11,
+ 13, -115, 77, -51, 45, -83, 109, -19,
+ 29, -99, 93, -35, 61, -67, 125, -3,
+ 3, -125, 67, -61, 35, -93, 99, -29,
+ 19, -109, 83, -45, 51, -77, 115, -13,
+ 11, -117, 75, -53, 43, -85, 107, -21,
+ 27, -101, 91, -37, 59, -69, 123, -5,
+ 7, -121, 71, -57, 39, -89, 103, -25,
+ 23, -105, 87, -41, 55, -73, 119, -9,
+ 15, -113, 79, -49, 47, -81, 111, -17,
+ 31, -97, 95, -33, 63, -65, 127, -1,
+ };
+
+ // The main 10 bit white runs lookup table
+ static short white[] = {
+ // 0 - 7
+ 6430, 6400, 6400, 6400, 3225, 3225, 3225, 3225,
+ // 8 - 15
+ 944, 944, 944, 944, 976, 976, 976, 976,
+ // 16 - 23
+ 1456, 1456, 1456, 1456, 1488, 1488, 1488, 1488,
+ // 24 - 31
+ 718, 718, 718, 718, 718, 718, 718, 718,
+ // 32 - 39
+ 750, 750, 750, 750, 750, 750, 750, 750,
+ // 40 - 47
+ 1520, 1520, 1520, 1520, 1552, 1552, 1552, 1552,
+ // 48 - 55
+ 428, 428, 428, 428, 428, 428, 428, 428,
+ // 56 - 63
+ 428, 428, 428, 428, 428, 428, 428, 428,
+ // 64 - 71
+ 654, 654, 654, 654, 654, 654, 654, 654,
+ // 72 - 79
+ 1072, 1072, 1072, 1072, 1104, 1104, 1104, 1104,
+ // 80 - 87
+ 1136, 1136, 1136, 1136, 1168, 1168, 1168, 1168,
+ // 88 - 95
+ 1200, 1200, 1200, 1200, 1232, 1232, 1232, 1232,
+ // 96 - 103
+ 622, 622, 622, 622, 622, 622, 622, 622,
+ // 104 - 111
+ 1008, 1008, 1008, 1008, 1040, 1040, 1040, 1040,
+ // 112 - 119
+ 44, 44, 44, 44, 44, 44, 44, 44,
+ // 120 - 127
+ 44, 44, 44, 44, 44, 44, 44, 44,
+ // 128 - 135
+ 396, 396, 396, 396, 396, 396, 396, 396,
+ // 136 - 143
+ 396, 396, 396, 396, 396, 396, 396, 396,
+ // 144 - 151
+ 1712, 1712, 1712, 1712, 1744, 1744, 1744, 1744,
+ // 152 - 159
+ 846, 846, 846, 846, 846, 846, 846, 846,
+ // 160 - 167
+ 1264, 1264, 1264, 1264, 1296, 1296, 1296, 1296,
+ // 168 - 175
+ 1328, 1328, 1328, 1328, 1360, 1360, 1360, 1360,
+ // 176 - 183
+ 1392, 1392, 1392, 1392, 1424, 1424, 1424, 1424,
+ // 184 - 191
+ 686, 686, 686, 686, 686, 686, 686, 686,
+ // 192 - 199
+ 910, 910, 910, 910, 910, 910, 910, 910,
+ // 200 - 207
+ 1968, 1968, 1968, 1968, 2000, 2000, 2000, 2000,
+ // 208 - 215
+ 2032, 2032, 2032, 2032, 16, 16, 16, 16,
+ // 216 - 223
+ 10257, 10257, 10257, 10257, 12305, 12305, 12305, 12305,
+ // 224 - 231
+ 330, 330, 330, 330, 330, 330, 330, 330,
+ // 232 - 239
+ 330, 330, 330, 330, 330, 330, 330, 330,
+ // 240 - 247
+ 330, 330, 330, 330, 330, 330, 330, 330,
+ // 248 - 255
+ 330, 330, 330, 330, 330, 330, 330, 330,
+ // 256 - 263
+ 362, 362, 362, 362, 362, 362, 362, 362,
+ // 264 - 271
+ 362, 362, 362, 362, 362, 362, 362, 362,
+ // 272 - 279
+ 362, 362, 362, 362, 362, 362, 362, 362,
+ // 280 - 287
+ 362, 362, 362, 362, 362, 362, 362, 362,
+ // 288 - 295
+ 878, 878, 878, 878, 878, 878, 878, 878,
+ // 296 - 303
+ 1904, 1904, 1904, 1904, 1936, 1936, 1936, 1936,
+ // 304 - 311
+ -18413, -18413, -16365, -16365, -14317, -14317, -10221, -10221,
+ // 312 - 319
+ 590, 590, 590, 590, 590, 590, 590, 590,
+ // 320 - 327
+ 782, 782, 782, 782, 782, 782, 782, 782,
+ // 328 - 335
+ 1584, 1584, 1584, 1584, 1616, 1616, 1616, 1616,
+ // 336 - 343
+ 1648, 1648, 1648, 1648, 1680, 1680, 1680, 1680,
+ // 344 - 351
+ 814, 814, 814, 814, 814, 814, 814, 814,
+ // 352 - 359
+ 1776, 1776, 1776, 1776, 1808, 1808, 1808, 1808,
+ // 360 - 367
+ 1840, 1840, 1840, 1840, 1872, 1872, 1872, 1872,
+ // 368 - 375
+ 6157, 6157, 6157, 6157, 6157, 6157, 6157, 6157,
+ // 376 - 383
+ 6157, 6157, 6157, 6157, 6157, 6157, 6157, 6157,
+ // 384 - 391
+ -12275, -12275, -12275, -12275, -12275, -12275, -12275, -12275,
+ // 392 - 399
+ -12275, -12275, -12275, -12275, -12275, -12275, -12275, -12275,
+ // 400 - 407
+ 14353, 14353, 14353, 14353, 16401, 16401, 16401, 16401,
+ // 408 - 415
+ 22547, 22547, 24595, 24595, 20497, 20497, 20497, 20497,
+ // 416 - 423
+ 18449, 18449, 18449, 18449, 26643, 26643, 28691, 28691,
+ // 424 - 431
+ 30739, 30739, -32749, -32749, -30701, -30701, -28653, -28653,
+ // 432 - 439
+ -26605, -26605, -24557, -24557, -22509, -22509, -20461, -20461,
+ // 440 - 447
+ 8207, 8207, 8207, 8207, 8207, 8207, 8207, 8207,
+ // 448 - 455
+ 72, 72, 72, 72, 72, 72, 72, 72,
+ // 456 - 463
+ 72, 72, 72, 72, 72, 72, 72, 72,
+ // 464 - 471
+ 72, 72, 72, 72, 72, 72, 72, 72,
+ // 472 - 479
+ 72, 72, 72, 72, 72, 72, 72, 72,
+ // 480 - 487
+ 72, 72, 72, 72, 72, 72, 72, 72,
+ // 488 - 495
+ 72, 72, 72, 72, 72, 72, 72, 72,
+ // 496 - 503
+ 72, 72, 72, 72, 72, 72, 72, 72,
+ // 504 - 511
+ 72, 72, 72, 72, 72, 72, 72, 72,
+ // 512 - 519
+ 104, 104, 104, 104, 104, 104, 104, 104,
+ // 520 - 527
+ 104, 104, 104, 104, 104, 104, 104, 104,
+ // 528 - 535
+ 104, 104, 104, 104, 104, 104, 104, 104,
+ // 536 - 543
+ 104, 104, 104, 104, 104, 104, 104, 104,
+ // 544 - 551
+ 104, 104, 104, 104, 104, 104, 104, 104,
+ // 552 - 559
+ 104, 104, 104, 104, 104, 104, 104, 104,
+ // 560 - 567
+ 104, 104, 104, 104, 104, 104, 104, 104,
+ // 568 - 575
+ 104, 104, 104, 104, 104, 104, 104, 104,
+ // 576 - 583
+ 4107, 4107, 4107, 4107, 4107, 4107, 4107, 4107,
+ // 584 - 591
+ 4107, 4107, 4107, 4107, 4107, 4107, 4107, 4107,
+ // 592 - 599
+ 4107, 4107, 4107, 4107, 4107, 4107, 4107, 4107,
+ // 600 - 607
+ 4107, 4107, 4107, 4107, 4107, 4107, 4107, 4107,
+ // 608 - 615
+ 266, 266, 266, 266, 266, 266, 266, 266,
+ // 616 - 623
+ 266, 266, 266, 266, 266, 266, 266, 266,
+ // 624 - 631
+ 266, 266, 266, 266, 266, 266, 266, 266,
+ // 632 - 639
+ 266, 266, 266, 266, 266, 266, 266, 266,
+ // 640 - 647
+ 298, 298, 298, 298, 298, 298, 298, 298,
+ // 648 - 655
+ 298, 298, 298, 298, 298, 298, 298, 298,
+ // 656 - 663
+ 298, 298, 298, 298, 298, 298, 298, 298,
+ // 664 - 671
+ 298, 298, 298, 298, 298, 298, 298, 298,
+ // 672 - 679
+ 524, 524, 524, 524, 524, 524, 524, 524,
+ // 680 - 687
+ 524, 524, 524, 524, 524, 524, 524, 524,
+ // 688 - 695
+ 556, 556, 556, 556, 556, 556, 556, 556,
+ // 696 - 703
+ 556, 556, 556, 556, 556, 556, 556, 556,
+ // 704 - 711
+ 136, 136, 136, 136, 136, 136, 136, 136,
+ // 712 - 719
+ 136, 136, 136, 136, 136, 136, 136, 136,
+ // 720 - 727
+ 136, 136, 136, 136, 136, 136, 136, 136,
+ // 728 - 735
+ 136, 136, 136, 136, 136, 136, 136, 136,
+ // 736 - 743
+ 136, 136, 136, 136, 136, 136, 136, 136,
+ // 744 - 751
+ 136, 136, 136, 136, 136, 136, 136, 136,
+ // 752 - 759
+ 136, 136, 136, 136, 136, 136, 136, 136,
+ // 760 - 767
+ 136, 136, 136, 136, 136, 136, 136, 136,
+ // 768 - 775
+ 168, 168, 168, 168, 168, 168, 168, 168,
+ // 776 - 783
+ 168, 168, 168, 168, 168, 168, 168, 168,
+ // 784 - 791
+ 168, 168, 168, 168, 168, 168, 168, 168,
+ // 792 - 799
+ 168, 168, 168, 168, 168, 168, 168, 168,
+ // 800 - 807
+ 168, 168, 168, 168, 168, 168, 168, 168,
+ // 808 - 815
+ 168, 168, 168, 168, 168, 168, 168, 168,
+ // 816 - 823
+ 168, 168, 168, 168, 168, 168, 168, 168,
+ // 824 - 831
+ 168, 168, 168, 168, 168, 168, 168, 168,
+ // 832 - 839
+ 460, 460, 460, 460, 460, 460, 460, 460,
+ // 840 - 847
+ 460, 460, 460, 460, 460, 460, 460, 460,
+ // 848 - 855
+ 492, 492, 492, 492, 492, 492, 492, 492,
+ // 856 - 863
+ 492, 492, 492, 492, 492, 492, 492, 492,
+ // 864 - 871
+ 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059,
+ // 872 - 879
+ 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059,
+ // 880 - 887
+ 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059,
+ // 888 - 895
+ 2059, 2059, 2059, 2059, 2059, 2059, 2059, 2059,
+ // 896 - 903
+ 200, 200, 200, 200, 200, 200, 200, 200,
+ // 904 - 911
+ 200, 200, 200, 200, 200, 200, 200, 200,
+ // 912 - 919
+ 200, 200, 200, 200, 200, 200, 200, 200,
+ // 920 - 927
+ 200, 200, 200, 200, 200, 200, 200, 200,
+ // 928 - 935
+ 200, 200, 200, 200, 200, 200, 200, 200,
+ // 936 - 943
+ 200, 200, 200, 200, 200, 200, 200, 200,
+ // 944 - 951
+ 200, 200, 200, 200, 200, 200, 200, 200,
+ // 952 - 959
+ 200, 200, 200, 200, 200, 200, 200, 200,
+ // 960 - 967
+ 232, 232, 232, 232, 232, 232, 232, 232,
+ // 968 - 975
+ 232, 232, 232, 232, 232, 232, 232, 232,
+ // 976 - 983
+ 232, 232, 232, 232, 232, 232, 232, 232,
+ // 984 - 991
+ 232, 232, 232, 232, 232, 232, 232, 232,
+ // 992 - 999
+ 232, 232, 232, 232, 232, 232, 232, 232,
+ // 1000 - 1007
+ 232, 232, 232, 232, 232, 232, 232, 232,
+ // 1008 - 1015
+ 232, 232, 232, 232, 232, 232, 232, 232,
+ // 1016 - 1023
+ 232, 232, 232, 232, 232, 232, 232, 232,
+ };
+
+ // Additional make up codes for both White and Black runs
+ static short additionalMakeup[] = {
+ 28679, 28679, 31752, (short)32777,
+ (short)33801, (short)34825, (short)35849, (short)36873,
+ (short)29703, (short)29703, (short)30727, (short)30727,
+ (short)37897, (short)38921, (short)39945, (short)40969
+ };
+
+ // Initial black run look up table, uses the first 4 bits of a code
+ static short initBlack[] = {
+ // 0 - 7
+ 3226, 6412, 200, 168, 38, 38, 134, 134,
+ // 8 - 15
+ 100, 100, 100, 100, 68, 68, 68, 68
+ };
+
+ //
+ static short twoBitBlack[] = {292, 260, 226, 226}; // 0 - 3
+
+ // Main black run table, using the last 9 bits of possible 13 bit code
+ static short black[] = {
+ // 0 - 7
+ 62, 62, 30, 30, 0, 0, 0, 0,
+ // 8 - 15
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ // 16 - 23
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ // 24 - 31
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ // 32 - 39
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ // 40 - 47
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ // 48 - 55
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ // 56 - 63
+ 3225, 3225, 3225, 3225, 3225, 3225, 3225, 3225,
+ // 64 - 71
+ 588, 588, 588, 588, 588, 588, 588, 588,
+ // 72 - 79
+ 1680, 1680, 20499, 22547, 24595, 26643, 1776, 1776,
+ // 80 - 87
+ 1808, 1808, -24557, -22509, -20461, -18413, 1904, 1904,
+ // 88 - 95
+ 1936, 1936, -16365, -14317, 782, 782, 782, 782,
+ // 96 - 103
+ 814, 814, 814, 814, -12269, -10221, 10257, 10257,
+ // 104 - 111
+ 12305, 12305, 14353, 14353, 16403, 18451, 1712, 1712,
+ // 112 - 119
+ 1744, 1744, 28691, 30739, -32749, -30701, -28653, -26605,
+ // 120 - 127
+ 2061, 2061, 2061, 2061, 2061, 2061, 2061, 2061,
+ // 128 - 135
+ 424, 424, 424, 424, 424, 424, 424, 424,
+ // 136 - 143
+ 424, 424, 424, 424, 424, 424, 424, 424,
+ // 144 - 151
+ 424, 424, 424, 424, 424, 424, 424, 424,
+ // 152 - 159
+ 424, 424, 424, 424, 424, 424, 424, 424,
+ // 160 - 167
+ 750, 750, 750, 750, 1616, 1616, 1648, 1648,
+ // 168 - 175
+ 1424, 1424, 1456, 1456, 1488, 1488, 1520, 1520,
+ // 176 - 183
+ 1840, 1840, 1872, 1872, 1968, 1968, 8209, 8209,
+ // 184 - 191
+ 524, 524, 524, 524, 524, 524, 524, 524,
+ // 192 - 199
+ 556, 556, 556, 556, 556, 556, 556, 556,
+ // 200 - 207
+ 1552, 1552, 1584, 1584, 2000, 2000, 2032, 2032,
+ // 208 - 215
+ 976, 976, 1008, 1008, 1040, 1040, 1072, 1072,
+ // 216 - 223
+ 1296, 1296, 1328, 1328, 718, 718, 718, 718,
+ // 224 - 231
+ 456, 456, 456, 456, 456, 456, 456, 456,
+ // 232 - 239
+ 456, 456, 456, 456, 456, 456, 456, 456,
+ // 240 - 247
+ 456, 456, 456, 456, 456, 456, 456, 456,
+ // 248 - 255
+ 456, 456, 456, 456, 456, 456, 456, 456,
+ // 256 - 263
+ 326, 326, 326, 326, 326, 326, 326, 326,
+ // 264 - 271
+ 326, 326, 326, 326, 326, 326, 326, 326,
+ // 272 - 279
+ 326, 326, 326, 326, 326, 326, 326, 326,
+ // 280 - 287
+ 326, 326, 326, 326, 326, 326, 326, 326,
+ // 288 - 295
+ 326, 326, 326, 326, 326, 326, 326, 326,
+ // 296 - 303
+ 326, 326, 326, 326, 326, 326, 326, 326,
+ // 304 - 311
+ 326, 326, 326, 326, 326, 326, 326, 326,
+ // 312 - 319
+ 326, 326, 326, 326, 326, 326, 326, 326,
+ // 320 - 327
+ 358, 358, 358, 358, 358, 358, 358, 358,
+ // 328 - 335
+ 358, 358, 358, 358, 358, 358, 358, 358,
+ // 336 - 343
+ 358, 358, 358, 358, 358, 358, 358, 358,
+ // 344 - 351
+ 358, 358, 358, 358, 358, 358, 358, 358,
+ // 352 - 359
+ 358, 358, 358, 358, 358, 358, 358, 358,
+ // 360 - 367
+ 358, 358, 358, 358, 358, 358, 358, 358,
+ // 368 - 375
+ 358, 358, 358, 358, 358, 358, 358, 358,
+ // 376 - 383
+ 358, 358, 358, 358, 358, 358, 358, 358,
+ // 384 - 391
+ 490, 490, 490, 490, 490, 490, 490, 490,
+ // 392 - 399
+ 490, 490, 490, 490, 490, 490, 490, 490,
+ // 400 - 407
+ 4113, 4113, 6161, 6161, 848, 848, 880, 880,
+ // 408 - 415
+ 912, 912, 944, 944, 622, 622, 622, 622,
+ // 416 - 423
+ 654, 654, 654, 654, 1104, 1104, 1136, 1136,
+ // 424 - 431
+ 1168, 1168, 1200, 1200, 1232, 1232, 1264, 1264,
+ // 432 - 439
+ 686, 686, 686, 686, 1360, 1360, 1392, 1392,
+ // 440 - 447
+ 12, 12, 12, 12, 12, 12, 12, 12,
+ // 448 - 455
+ 390, 390, 390, 390, 390, 390, 390, 390,
+ // 456 - 463
+ 390, 390, 390, 390, 390, 390, 390, 390,
+ // 464 - 471
+ 390, 390, 390, 390, 390, 390, 390, 390,
+ // 472 - 479
+ 390, 390, 390, 390, 390, 390, 390, 390,
+ // 480 - 487
+ 390, 390, 390, 390, 390, 390, 390, 390,
+ // 488 - 495
+ 390, 390, 390, 390, 390, 390, 390, 390,
+ // 496 - 503
+ 390, 390, 390, 390, 390, 390, 390, 390,
+ // 504 - 511
+ 390, 390, 390, 390, 390, 390, 390, 390,
+ };
+
+ static byte twoDCodes[] = {
+ // 0 - 7
+ 80, 88, 23, 71, 30, 30, 62, 62,
+ // 8 - 15
+ 4, 4, 4, 4, 4, 4, 4, 4,
+ // 16 - 23
+ 11, 11, 11, 11, 11, 11, 11, 11,
+ // 24 - 31
+ 11, 11, 11, 11, 11, 11, 11, 11,
+ // 32 - 39
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ // 40 - 47
+ 35, 35, 35, 35, 35, 35, 35, 35,
+ // 48 - 55
+ 51, 51, 51, 51, 51, 51, 51, 51,
+ // 56 - 63
+ 51, 51, 51, 51, 51, 51, 51, 51,
+ // 64 - 71
+ 41, 41, 41, 41, 41, 41, 41, 41,
+ // 72 - 79
+ 41, 41, 41, 41, 41, 41, 41, 41,
+ // 80 - 87
+ 41, 41, 41, 41, 41, 41, 41, 41,
+ // 88 - 95
+ 41, 41, 41, 41, 41, 41, 41, 41,
+ // 96 - 103
+ 41, 41, 41, 41, 41, 41, 41, 41,
+ // 104 - 111
+ 41, 41, 41, 41, 41, 41, 41, 41,
+ // 112 - 119
+ 41, 41, 41, 41, 41, 41, 41, 41,
+ // 120 - 127
+ 41, 41, 41, 41, 41, 41, 41, 41,
+ };
+
+ /**
+ * @param fillOrder The fill order of the compressed data bytes.
+ * @param w
+ * @param h
+ */
+ public TIFFFaxDecoder(int fillOrder, int w, int h) {
+ this.fillOrder = fillOrder;
+ this.w = w;
+ this.h = h;
+
+ this.bitPointer = 0;
+ this.bytePointer = 0;
+ this.prevChangingElems = new int[w];
+ this.currChangingElems = new int[w];
+ }
+
+ // One-dimensional decoding methods
+
+ public void decode1D(byte[] buffer, byte[] compData,
+ int startX, int height) {
+ this.data = compData;
+
+ int lineOffset = 0;
+ int scanlineStride = (w + 7)/8;
+
+ bitPointer = 0;
+ bytePointer = 0;
+
+ for (int i = 0; i < height; i++) {
+ decodeNextScanline(buffer, lineOffset, startX);
+ lineOffset += scanlineStride;
+ }
+ }
+
+ public void decodeNextScanline(byte[] buffer,
+ int lineOffset, int bitOffset) {
+ int bits = 0, code = 0, isT = 0;
+ int current, entry, twoBits;
+ boolean isWhite = true;
+
+ // Initialize starting of the changing elements array
+ changingElemSize = 0;
+
+ // While scanline not complete
+ while (bitOffset < w) {
+ while (isWhite) {
+ // White run
+ current = nextNBits(10);
+ entry = white[current];
+
+ // Get the 3 fields from the entry
+ isT = entry & 0x0001;
+ bits = (entry >>> 1) & 0x0f;
+
+ if (bits == 12) { // Additional Make up code
+ // Get the next 2 bits
+ twoBits = nextLesserThan8Bits(2);
+ // Consolidate the 2 new bits and last 2 bits into 4 bits
+ current = ((current << 2) & 0x000c) | twoBits;
+ entry = additionalMakeup[current];
+ bits = (entry >>> 1) & 0x07; // 3 bits 0000 0111
+ code = (entry >>> 4) & 0x0fff; // 12 bits
+ bitOffset += code; // Skip white run
+
+ updatePointer(4 - bits);
+ } else if (bits == 0) { // ERROR
+ throw new RuntimeException("Invalid code encountered.");
+ } else if (bits == 15) { // EOL
+ throw new RuntimeException("EOL code word encountered in White run.");
+ } else {
+ // 11 bits - 0000 0111 1111 1111 = 0x07ff
+ code = (entry >>> 5) & 0x07ff;
+ bitOffset += code;
+
+ updatePointer(10 - bits);
+ if (isT == 0) {
+ isWhite = false;
+ currChangingElems[changingElemSize++] = bitOffset;
+ }
+ }
+ }
+
+ // Check whether this run completed one width, if so
+ // advance to next byte boundary for compression = 2.
+ if (bitOffset == w) {
+ if (compression == 2) {
+ advancePointer();
+ }
+ break;
+ }
+
+ while (isWhite == false) {
+ // Black run
+ current = nextLesserThan8Bits(4);
+ entry = initBlack[current];
+
+ // Get the 3 fields from the entry
+ isT = entry & 0x0001;
+ bits = (entry >>> 1) & 0x000f;
+ code = (entry >>> 5) & 0x07ff;
+
+ if (code == 100) {
+ current = nextNBits(9);
+ entry = black[current];
+
+ // Get the 3 fields from the entry
+ isT = entry & 0x0001;
+ bits = (entry >>> 1) & 0x000f;
+ code = (entry >>> 5) & 0x07ff;
+
+ if (bits == 12) {
+ // Additional makeup codes
+ updatePointer(5);
+ current = nextLesserThan8Bits(4);
+ entry = additionalMakeup[current];
+ bits = (entry >>> 1) & 0x07; // 3 bits 0000 0111
+ code = (entry >>> 4) & 0x0fff; // 12 bits
+
+ setToBlack(buffer, lineOffset, bitOffset, code);
+ bitOffset += code;
+
+ updatePointer(4 - bits);
+ } else if (bits == 15) {
+ // EOL code
+ throw new RuntimeException("EOL code word encountered in Black run.");
+ } else {
+ setToBlack(buffer, lineOffset, bitOffset, code);
+ bitOffset += code;
+
+ updatePointer(9 - bits);
+ if (isT == 0) {
+ isWhite = true;
+ currChangingElems[changingElemSize++] = bitOffset;
+ }
+ }
+ } else if (code == 200) {
+ // Is a Terminating code
+ current = nextLesserThan8Bits(2);
+ entry = twoBitBlack[current];
+ code = (entry >>> 5) & 0x07ff;
+ bits = (entry >>> 1) & 0x0f;
+
+ setToBlack(buffer, lineOffset, bitOffset, code);
+ bitOffset += code;
+
+ updatePointer(2 - bits);
+ isWhite = true;
+ currChangingElems[changingElemSize++] = bitOffset;
+ } else {
+ // Is a Terminating code
+ setToBlack(buffer, lineOffset, bitOffset, code);
+ bitOffset += code;
+
+ updatePointer(4 - bits);
+ isWhite = true;
+ currChangingElems[changingElemSize++] = bitOffset;
+ }
+ }
+
+ // Check whether this run completed one width
+ if (bitOffset == w) {
+ if (compression == 2) {
+ advancePointer();
+ }
+ break;
+ }
+ }
+
+ currChangingElems[changingElemSize++] = bitOffset;
+ }
+
+ // Two-dimensional decoding methods
+
+ public void decode2D(byte[] buffer,
+ byte compData[],
+ int startX,
+ int height,
+ long tiffT4Options) {
+ this.data = compData;
+ compression = 3;
+
+ bitPointer = 0;
+ bytePointer = 0;
+
+ int scanlineStride = (w + 7)/8;
+
+ int a0, a1, b1, b2;
+ int[] b = new int[2];
+ int entry, code, bits;
+ boolean isWhite;
+ int currIndex = 0;
+ int temp[];
+
+ // fillBits - dealt with this in readEOL
+ // 1D/2D encoding - dealt with this in readEOL
+
+ // uncompressedMode - haven't dealt with this yet.
+
+
+ oneD = (int)(tiffT4Options & 0x01);
+ uncompressedMode = (int)((tiffT4Options & 0x02) >> 1);
+ fillBits = (int)((tiffT4Options & 0x04) >> 2);
+
+ // The data must start with an EOL code
+ if (readEOL(true) != 1) {
+ throw new RuntimeException("First scanline must be 1D encoded.");
+ }
+
+ int lineOffset = 0;
+ int bitOffset;
+
+ // Then the 1D encoded scanline data will occur, changing elements
+ // array gets set.
+ decodeNextScanline(buffer, lineOffset, startX);
+ lineOffset += scanlineStride;
+
+ for (int lines = 1; lines < height; lines++) {
+
+ // Every line must begin with an EOL followed by a bit which
+ // indicates whether the following scanline is 1D or 2D encoded.
+ if (readEOL(false) == 0) {
+ // 2D encoded scanline follows
+
+ // Initialize previous scanlines changing elements, and
+ // initialize current scanline's changing elements array
+ temp = prevChangingElems;
+ prevChangingElems = currChangingElems;
+ currChangingElems = temp;
+ currIndex = 0;
+
+ // a0 has to be set just before the start of this scanline.
+ a0 = -1;
+ isWhite = true;
+ bitOffset = startX;
+
+ lastChangingElement = 0;
+
+ while (bitOffset < w) {
+ // Get the next changing element
+ getNextChangingElement(a0, isWhite, b);
+
+ b1 = b[0];
+ b2 = b[1];
+
+ // Get the next seven bits
+ entry = nextLesserThan8Bits(7);
+
+ // Run these through the 2DCodes table
+ entry = (int)(twoDCodes[entry] & 0xff);
+
+ // Get the code and the number of bits used up
+ code = (entry & 0x78) >>> 3;
+ bits = entry & 0x07;
+
+ if (code == 0) {
+ if (!isWhite) {
+ setToBlack(buffer, lineOffset, bitOffset,
+ b2 - bitOffset);
+ }
+ bitOffset = a0 = b2;
+
+ // Set pointer to consume the correct number of bits.
+ updatePointer(7 - bits);
+ } else if (code == 1) {
+ // Horizontal
+ updatePointer(7 - bits);
+
+ // identify the next 2 codes.
+ int number;
+ if (isWhite) {
+ number = decodeWhiteCodeWord();
+ bitOffset += number;
+ currChangingElems[currIndex++] = bitOffset;
+
+ number = decodeBlackCodeWord();
+ setToBlack(buffer, lineOffset, bitOffset, number);
+ bitOffset += number;
+ currChangingElems[currIndex++] = bitOffset;
+ } else {
+ number = decodeBlackCodeWord();
+ setToBlack(buffer, lineOffset, bitOffset, number);
+ bitOffset += number;
+ currChangingElems[currIndex++] = bitOffset;
+
+ number = decodeWhiteCodeWord();
+ bitOffset += number;
+ currChangingElems[currIndex++] = bitOffset;
+ }
+
+ a0 = bitOffset;
+ } else if (code <= 8) {
+ // Vertical
+ a1 = b1 + (code - 5);
+
+ currChangingElems[currIndex++] = a1;
+
+ // We write the current color till a1 - 1 pos,
+ // since a1 is where the next color starts
+ if (!isWhite) {
+ setToBlack(buffer, lineOffset, bitOffset,
+ a1 - bitOffset);
+ }
+ bitOffset = a0 = a1;
+ isWhite = !isWhite;
+
+ updatePointer(7 - bits);
+ } else {
+ throw new RuntimeException("Invalid code encountered while decoding 2D group 3 compressed data.");
+ }
+ }
+
+ // Add the changing element beyond the current scanline for the
+ // other color too
+ currChangingElems[currIndex++] = bitOffset;
+ changingElemSize = currIndex;
+ } else {
+ // 1D encoded scanline follows
+ decodeNextScanline(buffer, lineOffset, startX);
+ }
+
+ lineOffset += scanlineStride;
+ }
+ }
+
+ public synchronized void decodeT6(byte[] buffer,
+ byte[] compData,
+ int startX,
+ int height,
+ long tiffT6Options) {
+ this.data = compData;
+ compression = 4;
+
+ bitPointer = 0;
+ bytePointer = 0;
+
+ int scanlineStride = (w + 7)/8;
+
+ int a0, a1, b1, b2;
+ int entry, code, bits;
+ boolean isWhite;
+ int currIndex;
+ int temp[];
+
+ // Return values from getNextChangingElement
+ int[] b = new int[2];
+
+ // uncompressedMode - have written some code for this, but this
+ // has not been tested due to lack of test images using this optional
+
+ uncompressedMode = (int)((tiffT6Options & 0x02) >> 1);
+
+ // Local cached reference
+ int[] cce = currChangingElems;
+
+ // Assume invisible preceding row of all white pixels and insert
+ // both black and white changing elements beyond the end of this
+ // imaginary scanline.
+ changingElemSize = 0;
+ cce[changingElemSize++] = w;
+ cce[changingElemSize++] = w;
+
+ int lineOffset = 0;
+ int bitOffset;
+
+ for (int lines = 0; lines < height; lines++) {
+ // a0 has to be set just before the start of the scanline.
+ a0 = -1;
+ isWhite = true;
+
+ // Assign the changing elements of the previous scanline to
+ // prevChangingElems and start putting this new scanline's
+ // changing elements into the currChangingElems.
+ temp = prevChangingElems;
+ prevChangingElems = currChangingElems;
+ cce = currChangingElems = temp;
+ currIndex = 0;
+
+ // Start decoding the scanline at startX in the raster
+ bitOffset = startX;
+
+ // Reset search start position for getNextChangingElement
+ lastChangingElement = 0;
+
+ // Till one whole scanline is decoded
+ while (bitOffset < w) {
+ // Get the next changing element
+ getNextChangingElement(a0, isWhite, b);
+ b1 = b[0];
+ b2 = b[1];
+
+ // Get the next seven bits
+ entry = nextLesserThan8Bits(7);
+ // Run these through the 2DCodes table
+ entry = (int)(twoDCodes[entry] & 0xff);
+
+ // Get the code and the number of bits used up
+ code = (entry & 0x78) >>> 3;
+ bits = entry & 0x07;
+
+ if (code == 0) { // Pass
+ // We always assume WhiteIsZero format for fax.
+ if (!isWhite) {
+ setToBlack(buffer, lineOffset, bitOffset,
+ b2 - bitOffset);
+ }
+ bitOffset = a0 = b2;
+
+ // Set pointer to only consume the correct number of bits.
+ updatePointer(7 - bits);
+ } else if (code == 1) { // Horizontal
+ // Set pointer to only consume the correct number of bits.
+ updatePointer(7 - bits);
+
+ // identify the next 2 alternating color codes.
+ int number;
+ if (isWhite) {
+ // Following are white and black runs
+ number = decodeWhiteCodeWord();
+ bitOffset += number;
+ cce[currIndex++] = bitOffset;
+
+ number = decodeBlackCodeWord();
+ setToBlack(buffer, lineOffset, bitOffset, number);
+ bitOffset += number;
+ cce[currIndex++] = bitOffset;
+ } else {
+ // First a black run and then a white run follows
+ number = decodeBlackCodeWord();
+ setToBlack(buffer, lineOffset, bitOffset, number);
+ bitOffset += number;
+ cce[currIndex++] = bitOffset;
+
+ number = decodeWhiteCodeWord();
+ bitOffset += number;
+ cce[currIndex++] = bitOffset;
+ }
+
+ a0 = bitOffset;
+ } else if (code <= 8) { // Vertical
+ a1 = b1 + (code - 5);
+ cce[currIndex++] = a1;
+
+ // We write the current color till a1 - 1 pos,
+ // since a1 is where the next color starts
+ if (!isWhite) {
+ setToBlack(buffer, lineOffset, bitOffset,
+ a1 - bitOffset);
+ }
+ bitOffset = a0 = a1;
+ isWhite = !isWhite;
+
+ updatePointer(7 - bits);
+ } else if (code == 11) {
+ if (nextLesserThan8Bits(3) != 7) {
+ throw new RuntimeException("Invalid code encountered while decoding 2D group 4 compressed data.");
+ }
+
+ int zeros = 0;
+ boolean exit = false;
+
+ while (!exit) {
+ while (nextLesserThan8Bits(1) != 1) {
+ zeros++;
+ }
+
+ if (zeros > 5) {
+ // Exit code
+
+ // Zeros before exit code
+ zeros = zeros - 6;
+
+ if (!isWhite && (zeros > 0)) {
+ cce[currIndex++] = bitOffset;
+ }
+
+ // Zeros before the exit code
+ bitOffset += zeros;
+ if (zeros > 0) {
+ // Some zeros have been written
+ isWhite = true;
+ }
+
+ // Read in the bit which specifies the color of
+ // the following run
+ if (nextLesserThan8Bits(1) == 0) {
+ if (!isWhite) {
+ cce[currIndex++] = bitOffset;
+ }
+ isWhite = true;
+ } else {
+ if (isWhite) {
+ cce[currIndex++] = bitOffset;
+ }
+ isWhite = false;
+ }
+
+ exit = true;
+ }
+
+ if (zeros == 5) {
+ if (!isWhite) {
+ cce[currIndex++] = bitOffset;
+ }
+ bitOffset += zeros;
+
+ // Last thing written was white
+ isWhite = true;
+ } else {
+ bitOffset += zeros;
+
+ cce[currIndex++] = bitOffset;
+ setToBlack(buffer, lineOffset, bitOffset, 1);
+ ++bitOffset;
+
+ // Last thing written was black
+ isWhite = false;
+ }
+
+ }
+ } else {
+ throw new RuntimeException("Invalid code encountered while decoding 2D group 4 compressed data.");
+ }
+ }
+
+ // Add the changing element beyond the current scanline for the
+ // other color too
+ //make sure that the index does not exceed the bounds of the array
+ if(currIndex < cce.length)
+ cce[currIndex++] = bitOffset;
+
+ // Number of changing elements in this scanline.
+ changingElemSize = currIndex;
+
+ lineOffset += scanlineStride;
+ }
+ }
+
+ private void setToBlack(byte[] buffer,
+ int lineOffset, int bitOffset,
+ int numBits) {
+ int bitNum = 8*lineOffset + bitOffset;
+ int lastBit = bitNum + numBits;
+
+ int byteNum = bitNum >> 3;
+
+ // Handle bits in first byte
+ int shift = bitNum & 0x7;
+ if (shift > 0) {
+ int maskVal = 1 << (7 - shift);
+ byte val = buffer[byteNum];
+ while (maskVal > 0 && bitNum < lastBit) {
+ val |= maskVal;
+ maskVal >>= 1;
+ ++bitNum;
+ }
+ buffer[byteNum] = val;
+ }
+
+ // Fill in 8 bits at a time
+ byteNum = bitNum >> 3;
+ while (bitNum < lastBit - 7) {
+ buffer[byteNum++] = (byte)255;
+ bitNum += 8;
+ }
+
+ // Fill in remaining bits
+ while (bitNum < lastBit) {
+ byteNum = bitNum >> 3;
+ buffer[byteNum] |= 1 << (7 - (bitNum & 0x7));
+ ++bitNum;
+ }
+ }
+
+ // Returns run length
+ private int decodeWhiteCodeWord() {
+ int current, entry, bits, isT, twoBits, code = -1;
+ int runLength = 0;
+ boolean isWhite = true;
+
+ while (isWhite) {
+ current = nextNBits(10);
+ entry = white[current];
+
+ // Get the 3 fields from the entry
+ isT = entry & 0x0001;
+ bits = (entry >>> 1) & 0x0f;
+
+ if (bits == 12) { // Additional Make up code
+ // Get the next 2 bits
+ twoBits = nextLesserThan8Bits(2);
+ // Consolidate the 2 new bits and last 2 bits into 4 bits
+ current = ((current << 2) & 0x000c) | twoBits;
+ entry = additionalMakeup[current];
+ bits = (entry >>> 1) & 0x07; // 3 bits 0000 0111
+ code = (entry >>> 4) & 0x0fff; // 12 bits
+ runLength += code;
+ updatePointer(4 - bits);
+ } else if (bits == 0) { // ERROR
+ throw new RuntimeException("Invalid code encountered.");
+ } else if (bits == 15) { // EOL
+ throw new RuntimeException("EOL code word encountered in White run.");
+ } else {
+ // 11 bits - 0000 0111 1111 1111 = 0x07ff
+ code = (entry >>> 5) & 0x07ff;
+ runLength += code;
+ updatePointer(10 - bits);
+ if (isT == 0) {
+ isWhite = false;
+ }
+ }
+ }
+
+ return runLength;
+ }
+
+ // Returns run length
+ private int decodeBlackCodeWord() {
+ int current, entry, bits, isT, code = -1;
+ int runLength = 0;
+ boolean isWhite = false;
+
+ while (!isWhite) {
+ current = nextLesserThan8Bits(4);
+ entry = initBlack[current];
+
+ // Get the 3 fields from the entry
+ isT = entry & 0x0001;
+ bits = (entry >>> 1) & 0x000f;
+ code = (entry >>> 5) & 0x07ff;
+
+ if (code == 100) {
+ current = nextNBits(9);
+ entry = black[current];
+
+ // Get the 3 fields from the entry
+ isT = entry & 0x0001;
+ bits = (entry >>> 1) & 0x000f;
+ code = (entry >>> 5) & 0x07ff;
+
+ if (bits == 12) {
+ // Additional makeup codes
+ updatePointer(5);
+ current = nextLesserThan8Bits(4);
+ entry = additionalMakeup[current];
+ bits = (entry >>> 1) & 0x07; // 3 bits 0000 0111
+ code = (entry >>> 4) & 0x0fff; // 12 bits
+ runLength += code;
+
+ updatePointer(4 - bits);
+ } else if (bits == 15) {
+ // EOL code
+ throw new RuntimeException("EOL code word encountered in Black run.");
+ } else {
+ runLength += code;
+ updatePointer(9 - bits);
+ if (isT == 0) {
+ isWhite = true;
+ }
+ }
+ } else if (code == 200) {
+ // Is a Terminating code
+ current = nextLesserThan8Bits(2);
+ entry = twoBitBlack[current];
+ code = (entry >>> 5) & 0x07ff;
+ runLength += code;
+ bits = (entry >>> 1) & 0x0f;
+ updatePointer(2 - bits);
+ isWhite = true;
+ } else {
+ // Is a Terminating code
+ runLength += code;
+ updatePointer(4 - bits);
+ isWhite = true;
+ }
+ }
+
+ return runLength;
+ }
+
+ private int readEOL(boolean isFirstEOL) {
+ if (fillBits == 0) {
+ int next12Bits = nextNBits(12);
+ if (isFirstEOL && next12Bits == 0) {
+
+ // Might have the case of EOL padding being used even
+ // though it was not flagged in the T4Options field.
+ // This was observed to be the case in TIFFs produced
+ // by a well known vendor who shall remain nameless.
+
+ if(nextNBits(4) == 1) {
+
+ // EOL must be padded: reset the fillBits flag.
+
+ fillBits = 1;
+ return 1;
+ }
+ }
+ if(next12Bits != 1) {
+ throw new RuntimeException("Scanline must begin with EOL code word.");
+ }
+ } else if (fillBits == 1) {
+
+ // First EOL code word xxxx 0000 0000 0001 will occur
+ // As many fill bits will be present as required to make
+ // the EOL code of 12 bits end on a byte boundary.
+
+ int bitsLeft = 8 - bitPointer;
+
+ if (nextNBits(bitsLeft) != 0) {
+ throw new RuntimeException("All fill bits preceding EOL code must be 0.");
+ }
+
+ // If the number of bitsLeft is less than 8, then to have a 12
+ // bit EOL sequence, two more bytes are certainly going to be
+ // required. The first of them has to be all zeros, so ensure
+ // that.
+ if (bitsLeft < 4) {
+ if (nextNBits(8) != 0) {
+ throw new RuntimeException("All fill bits preceding EOL code must be 0.");
+ }
+ }
+
+ // There might be a random number of fill bytes with 0s, so
+ // loop till the EOL of 0000 0001 is found, as long as all
+ // the bytes preceding it are 0's.
+ int n;
+ while ((n = nextNBits(8)) != 1) {
+
+ // If not all zeros
+ if (n != 0) {
+ throw new RuntimeException("All fill bits preceding EOL code must be 0.");
+ }
+ }
+ }
+
+ // If one dimensional encoding mode, then always return 1
+ if (oneD == 0) {
+ return 1;
+ } else {
+ // Otherwise for 2D encoding mode,
+ // The next one bit signifies 1D/2D encoding of next line.
+ return nextLesserThan8Bits(1);
+ }
+ }
+
+ private void getNextChangingElement(int a0, boolean isWhite, int[] ret) {
+ // Local copies of instance variables
+ int[] pce = this.prevChangingElems;
+ int ces = this.changingElemSize;
+
+ // If the previous match was at an odd element, we still
+ // have to search the preceeding element.
+ // int start = lastChangingElement & ~0x1;
+ int start = lastChangingElement > 0 ? lastChangingElement - 1 : 0;
+ if (isWhite) {
+ start &= ~0x1; // Search even numbered elements
+ } else {
+ start |= 0x1; // Search odd numbered elements
+ }
+
+ int i = start;
+ for (; i < ces; i += 2) {
+ int temp = pce[i];
+ if (temp > a0) {
+ lastChangingElement = i;
+ ret[0] = temp;
+ break;
+ }
+ }
+
+ if (i + 1 < ces) {
+ ret[1] = pce[i + 1];
+ }
+ }
+
+ private int nextNBits(int bitsToGet) {
+ byte b, next, next2next;
+ int l = data.length - 1;
+ int bp = this.bytePointer;
+
+ if (fillOrder == 1) {
+ b = data[bp];
+
+ if (bp == l) {
+ next = 0x00;
+ next2next = 0x00;
+ } else if ((bp + 1) == l) {
+ next = data[bp + 1];
+ next2next = 0x00;
+ } else {
+ next = data[bp + 1];
+ next2next = data[bp + 2];
+ }
+ } else if (fillOrder == 2) {
+ b = flipTable[data[bp] & 0xff];
+
+ if (bp == l) {
+ next = 0x00;
+ next2next = 0x00;
+ } else if ((bp + 1) == l) {
+ next = flipTable[data[bp + 1] & 0xff];
+ next2next = 0x00;
+ } else {
+ next = flipTable[data[bp + 1] & 0xff];
+ next2next = flipTable[data[bp + 2] & 0xff];
+ }
+ } else {
+ throw new RuntimeException("TIFF_FILL_ORDER tag must be either 1 or 2.");
+ }
+
+ int bitsLeft = 8 - bitPointer;
+ int bitsFromNextByte = bitsToGet - bitsLeft;
+ int bitsFromNext2NextByte = 0;
+ if (bitsFromNextByte > 8) {
+ bitsFromNext2NextByte = bitsFromNextByte - 8;
+ bitsFromNextByte = 8;
+ }
+
+ bytePointer++;
+
+ int i1 = (b & table1[bitsLeft]) << (bitsToGet - bitsLeft);
+ int i2 = (next & table2[bitsFromNextByte]) >>> (8 - bitsFromNextByte);
+
+ int i3 = 0;
+ if (bitsFromNext2NextByte != 0) {
+ i2 <<= bitsFromNext2NextByte;
+ i3 = (next2next & table2[bitsFromNext2NextByte]) >>>
+ (8 - bitsFromNext2NextByte);
+ i2 |= i3;
+ bytePointer++;
+ bitPointer = bitsFromNext2NextByte;
+ } else {
+ if (bitsFromNextByte == 8) {
+ bitPointer = 0;
+ bytePointer++;
+ } else {
+ bitPointer = bitsFromNextByte;
+ }
+ }
+
+ int i = i1 | i2;
+ return i;
+ }
+
+ private int nextLesserThan8Bits(int bitsToGet) {
+ byte b, next;
+ int l = data.length - 1;
+ int bp = this.bytePointer;
+
+ if (fillOrder == 1) {
+ b = data[bp];
+ if (bp == l) {
+ next = 0x00;
+ } else {
+ next = data[bp + 1];
+ }
+ } else if (fillOrder == 2) {
+ b = flipTable[data[bp] & 0xff];
+ if (bp == l) {
+ next = 0x00;
+ } else {
+ next = flipTable[data[bp + 1] & 0xff];
+ }
+ } else {
+ throw new RuntimeException("TIFF_FILL_ORDER tag must be either 1 or 2.");
+ }
+
+ int bitsLeft = 8 - bitPointer;
+ int bitsFromNextByte = bitsToGet - bitsLeft;
+
+ int shift = bitsLeft - bitsToGet;
+ int i1, i2;
+ if (shift >= 0) {
+ i1 = (b & table1[bitsLeft]) >>> shift;
+ bitPointer += bitsToGet;
+ if (bitPointer == 8) {
+ bitPointer = 0;
+ bytePointer++;
+ }
+ } else {
+ i1 = (b & table1[bitsLeft]) << (-shift);
+ i2 = (next & table2[bitsFromNextByte]) >>> (8 - bitsFromNextByte);
+
+ i1 |= i2;
+ bytePointer++;
+ bitPointer = bitsFromNextByte;
+ }
+
+ return i1;
+ }
+
+ // Move pointer backwards by given amount of bits
+ private void updatePointer(int bitsToMoveBack) {
+ int i = bitPointer - bitsToMoveBack;
+
+ if (i < 0) {
+ bytePointer--;
+ bitPointer = 8 + i;
+ } else {
+ bitPointer = i;
+ }
+ }
+
+ // Move to the next byte boundary
+ private boolean advancePointer() {
+ if (bitPointer != 0) {
+ bytePointer++;
+ bitPointer = 0;
+ }
+
+ return true;
+ }
+}
+
diff --git a/src/main/java/com/lowagie/text/pdf/codec/TIFFField.java b/src/main/java/com/lowagie/text/pdf/codec/TIFFField.java
new file mode 100644
index 0000000..ac3b068
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/codec/TIFFField.java
@@ -0,0 +1,472 @@
+/*
+ * Copyright (c) 2001 Sun Microsystems, Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * -Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * -Redistribution in binary form must reproduct the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of contributors may
+ * be used to endorse or promote products derived from this software without
+ * specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any kind. ALL
+ * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING ANY
+ * IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ * NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN AND ITS LICENSORS SHALL NOT BE
+ * LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
+ * OR DISTRIBUTING THE SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR ITS
+ * LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT,
+ * INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER
+ * CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF
+ * OR INABILITY TO USE SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that Software is not designed,licensed or intended for use in
+ * the design, construction, operation or maintenance of any nuclear facility.
+ */
+package com.lowagie.text.pdf.codec;
+
+import java.io.Serializable;
+
+/**
+ * A class representing a field in a TIFF 6.0 Image File Directory.
+ *
+ * <p> The TIFF file format is described in more detail in the
+ * comments for the TIFFDescriptor class.
+ *
+ * <p> A field in a TIFF Image File Directory (IFD). A field is defined
+ * as a sequence of values of identical data type. TIFF 6.0 defines
+ * 12 data types, which are mapped internally onto the Java datatypes
+ * byte, int, long, float, and double.
+ *
+ * <p><b> This class is not a committed part of the JAI API. It may
+ * be removed or changed in future releases of JAI.</b>
+ *
+ * @see TIFFDirectory
+ */
+public class TIFFField extends Object implements Comparable, Serializable {
+
+ /** Flag for 8 bit unsigned integers. */
+ public static final int TIFF_BYTE = 1;
+
+ /** Flag for null-terminated ASCII strings. */
+ public static final int TIFF_ASCII = 2;
+
+ /** Flag for 16 bit unsigned integers. */
+ public static final int TIFF_SHORT = 3;
+
+ /** Flag for 32 bit unsigned integers. */
+ public static final int TIFF_LONG = 4;
+
+ /** Flag for pairs of 32 bit unsigned integers. */
+ public static final int TIFF_RATIONAL = 5;
+
+ /** Flag for 8 bit signed integers. */
+ public static final int TIFF_SBYTE = 6;
+
+ /** Flag for 8 bit uninterpreted bytes. */
+ public static final int TIFF_UNDEFINED = 7;
+
+ /** Flag for 16 bit signed integers. */
+ public static final int TIFF_SSHORT = 8;
+
+ /** Flag for 32 bit signed integers. */
+ public static final int TIFF_SLONG = 9;
+
+ /** Flag for pairs of 32 bit signed integers. */
+ public static final int TIFF_SRATIONAL = 10;
+
+ /** Flag for 32 bit IEEE floats. */
+ public static final int TIFF_FLOAT = 11;
+
+ /** Flag for 64 bit IEEE doubles. */
+ public static final int TIFF_DOUBLE = 12;
+
+ /** The tag number. */
+ int tag;
+
+ /** The tag type. */
+ int type;
+
+ /** The number of data items present in the field. */
+ int count;
+
+ /** The field data. */
+ Object data;
+
+ /** The default constructor. */
+ TIFFField() {}
+
+ /**
+ * Constructs a TIFFField with arbitrary data. The data
+ * parameter must be an array of a Java type appropriate for the
+ * type of the TIFF field. Since there is no available 32-bit
+ * unsigned datatype, long is used. The mapping between types is
+ * as follows:
+ *
+ * <table border=1>
+ * <tr>
+ * <th> TIFF type </th> <th> Java type </th>
+ * <tr>
+ * <td><tt>TIFF_BYTE</tt></td> <td><tt>byte</tt></td>
+ * <tr>
+ * <td><tt>TIFF_ASCII</tt></td> <td><tt>String</tt></td>
+ * <tr>
+ * <td><tt>TIFF_SHORT</tt></td> <td><tt>char</tt></td>
+ * <tr>
+ * <td><tt>TIFF_LONG</tt></td> <td><tt>long</tt></td>
+ * <tr>
+ * <td><tt>TIFF_RATIONAL</tt></td> <td><tt>long[2]</tt></td>
+ * <tr>
+ * <td><tt>TIFF_SBYTE</tt></td> <td><tt>byte</tt></td>
+ * <tr>
+ * <td><tt>TIFF_UNDEFINED</tt></td> <td><tt>byte</tt></td>
+ * <tr>
+ * <td><tt>TIFF_SSHORT</tt></td> <td><tt>short</tt></td>
+ * <tr>
+ * <td><tt>TIFF_SLONG</tt></td> <td><tt>int</tt></td>
+ * <tr>
+ * <td><tt>TIFF_SRATIONAL</tt></td> <td><tt>int[2]</tt></td>
+ * <tr>
+ * <td><tt>TIFF_FLOAT</tt></td> <td><tt>float</tt></td>
+ * <tr>
+ * <td><tt>TIFF_DOUBLE</tt></td> <td><tt>double</tt></td>
+ * </table>
+ */
+ public TIFFField(int tag, int type, int count, Object data) {
+ this.tag = tag;
+ this.type = type;
+ this.count = count;
+ this.data = data;
+ }
+
+ /**
+ * Returns the tag number, between 0 and 65535.
+ */
+ public int getTag() {
+ return tag;
+ }
+
+ /**
+ * Returns the type of the data stored in the IFD.
+ * For a TIFF6.0 file, the value will equal one of the
+ * TIFF_ constants defined in this class. For future
+ * revisions of TIFF, higher values are possible.
+ *
+ */
+ public int getType() {
+ return type;
+ }
+
+ /**
+ * Returns the number of elements in the IFD.
+ */
+ public int getCount() {
+ return count;
+ }
+
+ /**
+ * Returns the data as an uninterpreted array of bytes.
+ * The type of the field must be one of TIFF_BYTE, TIFF_SBYTE,
+ * or TIFF_UNDEFINED;
+ *
+ * <p> For data in TIFF_BYTE format, the application must take
+ * care when promoting the data to longer integral types
+ * to avoid sign extension.
+ *
+ * <p> A ClassCastException will be thrown if the field is not
+ * of type TIFF_BYTE, TIFF_SBYTE, or TIFF_UNDEFINED.
+ */
+ public byte[] getAsBytes() {
+ return (byte[])data;
+ }
+
+ /**
+ * Returns TIFF_SHORT data as an array of chars (unsigned 16-bit
+ * integers).
+ *
+ * <p> A ClassCastException will be thrown if the field is not
+ * of type TIFF_SHORT.
+ */
+ public char[] getAsChars() {
+ return (char[])data;
+ }
+
+ /**
+ * Returns TIFF_SSHORT data as an array of shorts (signed 16-bit
+ * integers).
+ *
+ * <p> A ClassCastException will be thrown if the field is not
+ * of type TIFF_SSHORT.
+ */
+ public short[] getAsShorts() {
+ return (short[])data;
+ }
+
+ /**
+ * Returns TIFF_SLONG data as an array of ints (signed 32-bit
+ * integers).
+ *
+ * <p> A ClassCastException will be thrown if the field is not
+ * of type TIFF_SLONG.
+ */
+ public int[] getAsInts() {
+ return (int[])data;
+ }
+
+ /**
+ * Returns TIFF_LONG data as an array of longs (signed 64-bit
+ * integers).
+ *
+ * <p> A ClassCastException will be thrown if the field is not
+ * of type TIFF_LONG.
+ */
+ public long[] getAsLongs() {
+ return (long[])data;
+ }
+
+ /**
+ * Returns TIFF_FLOAT data as an array of floats.
+ *
+ * <p> A ClassCastException will be thrown if the field is not
+ * of type TIFF_FLOAT.
+ */
+ public float[] getAsFloats() {
+ return (float[])data;
+ }
+
+ /**
+ * Returns TIFF_DOUBLE data as an array of doubles.
+ *
+ * <p> A ClassCastException will be thrown if the field is not
+ * of type TIFF_DOUBLE.
+ */
+ public double[] getAsDoubles() {
+ return (double[])data;
+ }
+
+ /**
+ * Returns TIFF_SRATIONAL data as an array of 2-element arrays of ints.
+ *
+ * <p> A ClassCastException will be thrown if the field is not
+ * of type TIFF_SRATIONAL.
+ */
+ public int[][] getAsSRationals() {
+ return (int[][])data;
+ }
+
+ /**
+ * Returns TIFF_RATIONAL data as an array of 2-element arrays of longs.
+ *
+ * <p> A ClassCastException will be thrown if the field is not
+ * of type TIFF_RATTIONAL.
+ */
+ public long[][] getAsRationals() {
+ return (long[][])data;
+ }
+
+ /**
+ * Returns data in TIFF_BYTE, TIFF_SBYTE, TIFF_UNDEFINED, TIFF_SHORT,
+ * TIFF_SSHORT, or TIFF_SLONG format as an int.
+ *
+ * <p> TIFF_BYTE and TIFF_UNDEFINED data are treated as unsigned;
+ * that is, no sign extension will take place and the returned
+ * value will be in the range [0, 255]. TIFF_SBYTE data will
+ * be returned in the range [-128, 127].
+ *
+ * <p> A ClassCastException will be thrown if the field is not of
+ * type TIFF_BYTE, TIFF_SBYTE, TIFF_UNDEFINED, TIFF_SHORT,
+ * TIFF_SSHORT, or TIFF_SLONG.
+ */
+ public int getAsInt(int index) {
+ switch (type) {
+ case TIFF_BYTE: case TIFF_UNDEFINED:
+ return ((byte[])data)[index] & 0xff;
+ case TIFF_SBYTE:
+ return ((byte[])data)[index];
+ case TIFF_SHORT:
+ return ((char[])data)[index] & 0xffff;
+ case TIFF_SSHORT:
+ return ((short[])data)[index];
+ case TIFF_SLONG:
+ return ((int[])data)[index];
+ default:
+ throw new ClassCastException();
+ }
+ }
+
+ /**
+ * Returns data in TIFF_BYTE, TIFF_SBYTE, TIFF_UNDEFINED, TIFF_SHORT,
+ * TIFF_SSHORT, TIFF_SLONG, or TIFF_LONG format as a long.
+ *
+ * <p> TIFF_BYTE and TIFF_UNDEFINED data are treated as unsigned;
+ * that is, no sign extension will take place and the returned
+ * value will be in the range [0, 255]. TIFF_SBYTE data will
+ * be returned in the range [-128, 127].
+ *
+ * <p> A ClassCastException will be thrown if the field is not of
+ * type TIFF_BYTE, TIFF_SBYTE, TIFF_UNDEFINED, TIFF_SHORT,
+ * TIFF_SSHORT, TIFF_SLONG, or TIFF_LONG.
+ */
+ public long getAsLong(int index) {
+ switch (type) {
+ case TIFF_BYTE: case TIFF_UNDEFINED:
+ return ((byte[])data)[index] & 0xff;
+ case TIFF_SBYTE:
+ return ((byte[])data)[index];
+ case TIFF_SHORT:
+ return ((char[])data)[index] & 0xffff;
+ case TIFF_SSHORT:
+ return ((short[])data)[index];
+ case TIFF_SLONG:
+ return ((int[])data)[index];
+ case TIFF_LONG:
+ return ((long[])data)[index];
+ default:
+ throw new ClassCastException();
+ }
+ }
+
+ /**
+ * Returns data in any numerical format as a float. Data in
+ * TIFF_SRATIONAL or TIFF_RATIONAL format are evaluated by
+ * dividing the numerator into the denominator using
+ * double-precision arithmetic and then truncating to single
+ * precision. Data in TIFF_SLONG, TIFF_LONG, or TIFF_DOUBLE
+ * format may suffer from truncation.
+ *
+ * <p> A ClassCastException will be thrown if the field is
+ * of type TIFF_UNDEFINED or TIFF_ASCII.
+ */
+ public float getAsFloat(int index) {
+ switch (type) {
+ case TIFF_BYTE:
+ return ((byte[])data)[index] & 0xff;
+ case TIFF_SBYTE:
+ return ((byte[])data)[index];
+ case TIFF_SHORT:
+ return ((char[])data)[index] & 0xffff;
+ case TIFF_SSHORT:
+ return ((short[])data)[index];
+ case TIFF_SLONG:
+ return ((int[])data)[index];
+ case TIFF_LONG:
+ return ((long[])data)[index];
+ case TIFF_FLOAT:
+ return ((float[])data)[index];
+ case TIFF_DOUBLE:
+ return (float)((double[])data)[index];
+ case TIFF_SRATIONAL:
+ int[] ivalue = getAsSRational(index);
+ return (float)((double)ivalue[0]/ivalue[1]);
+ case TIFF_RATIONAL:
+ long[] lvalue = getAsRational(index);
+ return (float)((double)lvalue[0]/lvalue[1]);
+ default:
+ throw new ClassCastException();
+ }
+ }
+
+ /**
+ * Returns data in any numerical format as a float. Data in
+ * TIFF_SRATIONAL or TIFF_RATIONAL format are evaluated by
+ * dividing the numerator into the denominator using
+ * double-precision arithmetic.
+ *
+ * <p> A ClassCastException will be thrown if the field is of
+ * type TIFF_UNDEFINED or TIFF_ASCII.
+ */
+ public double getAsDouble(int index) {
+ switch (type) {
+ case TIFF_BYTE:
+ return ((byte[])data)[index] & 0xff;
+ case TIFF_SBYTE:
+ return ((byte[])data)[index];
+ case TIFF_SHORT:
+ return ((char[])data)[index] & 0xffff;
+ case TIFF_SSHORT:
+ return ((short[])data)[index];
+ case TIFF_SLONG:
+ return ((int[])data)[index];
+ case TIFF_LONG:
+ return ((long[])data)[index];
+ case TIFF_FLOAT:
+ return ((float[])data)[index];
+ case TIFF_DOUBLE:
+ return ((double[])data)[index];
+ case TIFF_SRATIONAL:
+ int[] ivalue = getAsSRational(index);
+ return (double)ivalue[0]/ivalue[1];
+ case TIFF_RATIONAL:
+ long[] lvalue = getAsRational(index);
+ return (double)lvalue[0]/lvalue[1];
+ default:
+ throw new ClassCastException();
+ }
+ }
+
+ /**
+ * Returns a TIFF_ASCII data item as a String.
+ *
+ * <p> A ClassCastException will be thrown if the field is not
+ * of type TIFF_ASCII.
+ */
+ public String getAsString(int index) {
+ return ((String[])data)[index];
+ }
+
+ /**
+ * Returns a TIFF_SRATIONAL data item as a two-element array
+ * of ints.
+ *
+ * <p> A ClassCastException will be thrown if the field is not
+ * of type TIFF_SRATIONAL.
+ */
+ public int[] getAsSRational(int index) {
+ return ((int[][])data)[index];
+ }
+
+ /**
+ * Returns a TIFF_RATIONAL data item as a two-element array
+ * of ints.
+ *
+ * <p> A ClassCastException will be thrown if the field is not
+ * of type TIFF_RATIONAL.
+ */
+ public long[] getAsRational(int index) {
+ return ((long[][])data)[index];
+ }
+
+ /**
+ * Compares this <code>TIFFField</code> with another
+ * <code>TIFFField</code> by comparing the tags.
+ *
+ * <p><b>Note: this class has a natural ordering that is inconsistent
+ * with <code>equals()</code>.</b>
+ *
+ * @throws IllegalArgumentException if the parameter is <code>null</code>.
+ * @throws ClassCastException if the parameter is not a
+ * <code>TIFFField</code>.
+ */
+ public int compareTo(Object o) {
+ if(o == null) {
+ throw new IllegalArgumentException();
+ }
+
+ int oTag = ((TIFFField)o).getTag();
+
+ if(tag < oTag) {
+ return -1;
+ } else if(tag > oTag) {
+ return 1;
+ } else {
+ return 0;
+ }
+ }
+}
diff --git a/src/main/java/com/lowagie/text/pdf/codec/TIFFLZWDecoder.java b/src/main/java/com/lowagie/text/pdf/codec/TIFFLZWDecoder.java
new file mode 100644
index 0000000..ca0f91a
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/codec/TIFFLZWDecoder.java
@@ -0,0 +1,255 @@
+/*
+ * Copyright (c) 2001 Sun Microsystems, Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * -Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * -Redistribution in binary form must reproduct the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of contributors may
+ * be used to endorse or promote products derived from this software without
+ * specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any kind. ALL
+ * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING ANY
+ * IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ * NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN AND ITS LICENSORS SHALL NOT BE
+ * LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
+ * OR DISTRIBUTING THE SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR ITS
+ * LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT,
+ * INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER
+ * CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF
+ * OR INABILITY TO USE SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that Software is not designed,licensed or intended for use in
+ * the design, construction, operation or maintenance of any nuclear facility.
+ */
+package com.lowagie.text.pdf.codec;
+
+/**
+ * A class for performing LZW decoding.
+ *
+ *
+ */
+public class TIFFLZWDecoder {
+
+ byte stringTable[][];
+ byte data[] = null, uncompData[];
+ int tableIndex, bitsToGet = 9;
+ int bytePointer, bitPointer;
+ int dstIndex;
+ int w, h;
+ int predictor, samplesPerPixel;
+ int nextData = 0;
+ int nextBits = 0;
+
+ int andTable[] = {
+ 511,
+ 1023,
+ 2047,
+ 4095
+ };
+
+ public TIFFLZWDecoder(int w, int predictor, int samplesPerPixel) {
+ this.w = w;
+ this.predictor = predictor;
+ this.samplesPerPixel = samplesPerPixel;
+ }
+
+ /**
+ * Method to decode LZW compressed data.
+ *
+ * @param data The compressed data.
+ * @param uncompData Array to return the uncompressed data in.
+ * @param h The number of rows the compressed data contains.
+ */
+ public byte[] decode(byte data[], byte uncompData[], int h) {
+
+ if(data[0] == (byte)0x00 && data[1] == (byte)0x01) {
+ throw new UnsupportedOperationException("TIFF 5.0-style LZW codes are not supported.");
+ }
+
+ initializeStringTable();
+
+ this.data = data;
+ this.h = h;
+ this.uncompData = uncompData;
+
+ // Initialize pointers
+ bytePointer = 0;
+ bitPointer = 0;
+ dstIndex = 0;
+
+
+ nextData = 0;
+ nextBits = 0;
+
+ int code, oldCode = 0;
+ byte string[];
+
+ while ( ((code = getNextCode()) != 257) &&
+ dstIndex < uncompData.length) {
+
+ if (code == 256) {
+
+ initializeStringTable();
+ code = getNextCode();
+
+ if (code == 257) {
+ break;
+ }
+
+ writeString(stringTable[code]);
+ oldCode = code;
+
+ } else {
+
+ if (code < tableIndex) {
+
+ string = stringTable[code];
+
+ writeString(string);
+ addStringToTable(stringTable[oldCode], string[0]);
+ oldCode = code;
+
+ } else {
+
+ string = stringTable[oldCode];
+ string = composeString(string, string[0]);
+ writeString(string);
+ addStringToTable(string);
+ oldCode = code;
+ }
+
+ }
+
+ }
+
+ // Horizontal Differencing Predictor
+ if (predictor == 2) {
+
+ int count;
+ for (int j = 0; j < h; j++) {
+
+ count = samplesPerPixel * (j * w + 1);
+
+ for (int i = samplesPerPixel; i < w * samplesPerPixel; i++) {
+
+ uncompData[count] += uncompData[count - samplesPerPixel];
+ count++;
+ }
+ }
+ }
+
+ return uncompData;
+ }
+
+
+ /**
+ * Initialize the string table.
+ */
+ public void initializeStringTable() {
+
+ stringTable = new byte[4096][];
+
+ for (int i=0; i<256; i++) {
+ stringTable[i] = new byte[1];
+ stringTable[i][0] = (byte)i;
+ }
+
+ tableIndex = 258;
+ bitsToGet = 9;
+ }
+
+ /**
+ * Write out the string just uncompressed.
+ */
+ public void writeString(byte string[]) {
+
+ for (int i=0; i<string.length; i++) {
+ uncompData[dstIndex++] = string[i];
+ }
+ }
+
+ /**
+ * Add a new string to the string table.
+ */
+ public void addStringToTable(byte oldString[], byte newString) {
+ int length = oldString.length;
+ byte string[] = new byte[length + 1];
+ System.arraycopy(oldString, 0, string, 0, length);
+ string[length] = newString;
+
+ // Add this new String to the table
+ stringTable[tableIndex++] = string;
+
+ if (tableIndex == 511) {
+ bitsToGet = 10;
+ } else if (tableIndex == 1023) {
+ bitsToGet = 11;
+ } else if (tableIndex == 2047) {
+ bitsToGet = 12;
+ }
+ }
+
+ /**
+ * Add a new string to the string table.
+ */
+ public void addStringToTable(byte string[]) {
+
+ // Add this new String to the table
+ stringTable[tableIndex++] = string;
+
+ if (tableIndex == 511) {
+ bitsToGet = 10;
+ } else if (tableIndex == 1023) {
+ bitsToGet = 11;
+ } else if (tableIndex == 2047) {
+ bitsToGet = 12;
+ }
+ }
+
+ /**
+ * Append <code>newString</code> to the end of <code>oldString</code>.
+ */
+ public byte[] composeString(byte oldString[], byte newString) {
+ int length = oldString.length;
+ byte string[] = new byte[length + 1];
+ System.arraycopy(oldString, 0, string, 0, length);
+ string[length] = newString;
+
+ return string;
+ }
+
+ // Returns the next 9, 10, 11 or 12 bits
+ public int getNextCode() {
+ // Attempt to get the next code. The exception is caught to make
+ // this robust to cases wherein the EndOfInformation code has been
+ // omitted from a strip. Examples of such cases have been observed
+ // in practice.
+ try {
+ nextData = (nextData << 8) | (data[bytePointer++] & 0xff);
+ nextBits += 8;
+
+ if (nextBits < bitsToGet) {
+ nextData = (nextData << 8) | (data[bytePointer++] & 0xff);
+ nextBits += 8;
+ }
+
+ int code =
+ (nextData >> (nextBits - bitsToGet)) & andTable[bitsToGet-9];
+ nextBits -= bitsToGet;
+
+ return code;
+ } catch(ArrayIndexOutOfBoundsException e) {
+ // Strip not terminated as expected: return EndOfInformation code.
+ return 257;
+ }
+ }
+}
diff --git a/src/main/java/com/lowagie/text/pdf/codec/TiffImage.java b/src/main/java/com/lowagie/text/pdf/codec/TiffImage.java
new file mode 100644
index 0000000..cc812d7
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/codec/TiffImage.java
@@ -0,0 +1,522 @@
+/*
+ * Copyright 2003-2005 by Paulo Soares.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+package com.lowagie.text.pdf.codec;
+import com.lowagie.text.pdf.*;
+import com.lowagie.text.Image;
+import com.lowagie.text.Jpeg;
+import com.lowagie.text.ExceptionConverter;
+import java.io.*;
+import java.util.zip.*;
+import java.awt.color.ICC_Profile;
+
+/** Reads TIFF images
+ * @author Paulo Soares (psoares@consiste.pt)
+ */
+public class TiffImage {
+
+ /** Gets the number of pages the TIFF document has.
+ * @param s the file source
+ * @return the number of pages
+ */
+ public static int getNumberOfPages(RandomAccessFileOrArray s) {
+ try {
+ return TIFFDirectory.getNumDirectories(s);
+ }
+ catch (Exception e) {
+ throw new ExceptionConverter(e);
+ }
+ }
+
+ static int getDpi(TIFFField fd, int resolutionUnit) {
+ if (fd == null)
+ return 0;
+ long res[] = fd.getAsRational(0);
+ float frac = (float)res[0] / (float)res[1];
+ int dpi = 0;
+ switch (resolutionUnit) {
+ case TIFFConstants.RESUNIT_INCH:
+ case TIFFConstants.RESUNIT_NONE:
+ dpi = (int)frac;
+ break;
+ case TIFFConstants.RESUNIT_CENTIMETER:
+ dpi = (int)(frac * 2.54);
+ break;
+ }
+ return dpi;
+ }
+
+ /** Reads a page from a TIFF image. Direct mode is not used.
+ * @param s the file source
+ * @param page the page to get. The first page is 1
+ * @return the <CODE>Image</CODE>
+ */
+ public static Image getTiffImage(RandomAccessFileOrArray s, int page) {
+ return getTiffImage(s, page, false);
+ }
+
+ /** Reads a page from a TIFF image.
+ * @param s the file source
+ * @param page the page to get. The first page is 1
+ * @param direct for single strip, CCITT images, generate the image
+ * by direct byte copying. It's faster but may not work
+ * every time
+ * @return the <CODE>Image</CODE>
+ */
+ public static Image getTiffImage(RandomAccessFileOrArray s, int page, boolean direct) {
+ if (page < 1)
+ throw new IllegalArgumentException("The page number must be >= 1.");
+ try {
+ TIFFDirectory dir = new TIFFDirectory(s, page - 1);
+ if (dir.isTagPresent(TIFFConstants.TIFFTAG_TILEWIDTH))
+ throw new IllegalArgumentException("Tiles are not supported.");
+ int compression = (int)dir.getFieldAsLong(TIFFConstants.TIFFTAG_COMPRESSION);
+ switch (compression) {
+ case TIFFConstants.COMPRESSION_CCITTRLEW:
+ case TIFFConstants.COMPRESSION_CCITTRLE:
+ case TIFFConstants.COMPRESSION_CCITTFAX3:
+ case TIFFConstants.COMPRESSION_CCITTFAX4:
+ break;
+ default:
+ return getTiffImageColor(dir, s);
+ }
+ float rotation = 0;
+ if (dir.isTagPresent(TIFFConstants.TIFFTAG_ORIENTATION)) {
+ int rot = (int)dir.getFieldAsLong(TIFFConstants.TIFFTAG_ORIENTATION);
+ if (rot == TIFFConstants.ORIENTATION_BOTRIGHT || rot == TIFFConstants.ORIENTATION_BOTLEFT)
+ rotation = (float)Math.PI;
+ else if (rot == TIFFConstants.ORIENTATION_LEFTTOP || rot == TIFFConstants.ORIENTATION_LEFTBOT)
+ rotation = (float)(Math.PI / 2.0);
+ else if (rot == TIFFConstants.ORIENTATION_RIGHTTOP || rot == TIFFConstants.ORIENTATION_RIGHTBOT)
+ rotation = -(float)(Math.PI / 2.0);
+ }
+
+ Image img = null;
+ long tiffT4Options = 0;
+ long tiffT6Options = 0;
+ int fillOrder = 1;
+ int h = (int)dir.getFieldAsLong(TIFFConstants.TIFFTAG_IMAGELENGTH);
+ int w = (int)dir.getFieldAsLong(TIFFConstants.TIFFTAG_IMAGEWIDTH);
+ int dpiX = 0;
+ int dpiY = 0;
+ float XYRatio = 0;
+ int resolutionUnit = TIFFConstants.RESUNIT_INCH;
+ if (dir.isTagPresent(TIFFConstants.TIFFTAG_RESOLUTIONUNIT))
+ resolutionUnit = (int)dir.getFieldAsLong(TIFFConstants.TIFFTAG_RESOLUTIONUNIT);
+ dpiX = getDpi(dir.getField(TIFFConstants.TIFFTAG_XRESOLUTION), resolutionUnit);
+ dpiY = getDpi(dir.getField(TIFFConstants.TIFFTAG_YRESOLUTION), resolutionUnit);
+ if (resolutionUnit == TIFFConstants.RESUNIT_NONE) {
+ if (dpiY != 0)
+ XYRatio = (float)dpiX / (float)dpiY;
+ dpiX = 0;
+ dpiY = 0;
+ }
+ long tstrip = 0xFFFFFFFFL;
+ if (dir.isTagPresent(TIFFConstants.TIFFTAG_ROWSPERSTRIP))
+ tstrip = dir.getFieldAsLong(TIFFConstants.TIFFTAG_ROWSPERSTRIP);
+ int rowsStrip = (int)Math.min(h, tstrip);
+ long offset[] = getArrayLongShort(dir, TIFFConstants.TIFFTAG_STRIPOFFSETS);
+ long size[] = getArrayLongShort(dir, TIFFConstants.TIFFTAG_STRIPBYTECOUNTS);
+ if (size == null && h == rowsStrip) { // some TIFF producers are really lousy, so...
+ size = new long[]{s.length() - (int)offset[0]};
+ }
+ boolean reverse = false;
+ TIFFField fillOrderField = dir.getField(TIFFConstants.TIFFTAG_FILLORDER);
+ if (fillOrderField != null)
+ fillOrder = fillOrderField.getAsInt(0);
+ reverse = (fillOrder == TIFFConstants.FILLORDER_LSB2MSB);
+ int params = 0;
+ if (dir.isTagPresent(TIFFConstants.TIFFTAG_PHOTOMETRIC)) {
+ long photo = dir.getFieldAsLong(TIFFConstants.TIFFTAG_PHOTOMETRIC);
+ if (photo == TIFFConstants.PHOTOMETRIC_MINISBLACK)
+ params |= Image.CCITT_BLACKIS1;
+ }
+ int imagecomp = 0;
+ switch (compression) {
+ case TIFFConstants.COMPRESSION_CCITTRLEW:
+ case TIFFConstants.COMPRESSION_CCITTRLE:
+ imagecomp = Image.CCITTG3_1D;
+ params |= Image.CCITT_ENCODEDBYTEALIGN | Image.CCITT_ENDOFBLOCK;
+ break;
+ case TIFFConstants.COMPRESSION_CCITTFAX3:
+ imagecomp = Image.CCITTG3_1D;
+ params |= Image.CCITT_ENDOFLINE | Image.CCITT_ENDOFBLOCK;
+ TIFFField t4OptionsField = dir.getField(TIFFConstants.TIFFTAG_GROUP3OPTIONS);
+ if (t4OptionsField != null) {
+ tiffT4Options = t4OptionsField.getAsLong(0);
+ if ((tiffT4Options & TIFFConstants.GROUP3OPT_2DENCODING) != 0)
+ imagecomp = Image.CCITTG3_2D;
+ if ((tiffT4Options & TIFFConstants.GROUP3OPT_FILLBITS) != 0)
+ params |= Image.CCITT_ENCODEDBYTEALIGN;
+ }
+ break;
+ case TIFFConstants.COMPRESSION_CCITTFAX4:
+ imagecomp = Image.CCITTG4;
+ TIFFField t6OptionsField = dir.getField(TIFFConstants.TIFFTAG_GROUP4OPTIONS);
+ if (t6OptionsField != null)
+ tiffT6Options = t6OptionsField.getAsLong(0);
+ break;
+ }
+ if (direct && rowsStrip == h) { //single strip, direct
+ byte im[] = new byte[(int)size[0]];
+ s.seek(offset[0]);
+ s.readFully(im);
+ img = Image.getInstance(w, h, reverse, imagecomp, params, im);
+ img.setInverted(true);
+ }
+ else {
+ int rowsLeft = h;
+ CCITTG4Encoder g4 = new CCITTG4Encoder(w);
+ for (int k = 0; k < offset.length; ++k) {
+ byte im[] = new byte[(int)size[k]];
+ s.seek(offset[k]);
+ s.readFully(im);
+ int height = Math.min(rowsStrip, rowsLeft);
+ TIFFFaxDecoder decoder = new TIFFFaxDecoder(fillOrder, w, height);
+ byte outBuf[] = new byte[(w + 7) / 8 * height];
+ switch (compression) {
+ case TIFFConstants.COMPRESSION_CCITTRLEW:
+ case TIFFConstants.COMPRESSION_CCITTRLE:
+ decoder.decode1D(outBuf, im, 0, height);
+ g4.fax4Encode(outBuf,height);
+ break;
+ case TIFFConstants.COMPRESSION_CCITTFAX3:
+ try {
+ decoder.decode2D(outBuf, im, 0, height, tiffT4Options);
+ }
+ catch (Exception e) {
+ // let's flip the fill bits and try again...
+ tiffT4Options ^= TIFFConstants.GROUP3OPT_FILLBITS;
+ try {
+ decoder.decode2D(outBuf, im, 0, height, tiffT4Options);
+ }
+ catch (Exception e2) {
+ throw e;
+ }
+ }
+ g4.fax4Encode(outBuf, height);
+ break;
+ case TIFFConstants.COMPRESSION_CCITTFAX4:
+ decoder.decodeT6(outBuf, im, 0, height, tiffT6Options);
+ g4.fax4Encode(outBuf, height);
+ break;
+ }
+ rowsLeft -= rowsStrip;
+ }
+ byte g4pic[] = g4.close();
+ img = Image.getInstance(w, h, false, Image.CCITTG4, params & Image.CCITT_BLACKIS1, g4pic);
+ }
+ img.setDpi(dpiX, dpiY);
+ img.setXYRatio(XYRatio);
+ if (dir.isTagPresent(TIFFConstants.TIFFTAG_ICCPROFILE)) {
+ try {
+ TIFFField fd = dir.getField(TIFFConstants.TIFFTAG_ICCPROFILE);
+ ICC_Profile icc_prof = ICC_Profile.getInstance(fd.getAsBytes());
+ if (icc_prof.getNumComponents() == 1)
+ img.tagICC(icc_prof);
+ }
+ catch (Exception e) {
+ //empty
+ }
+ }
+ img.setOriginalType(Image.ORIGINAL_TIFF);
+ if (rotation != 0)
+ img.setInitialRotation(rotation);
+ return img;
+ }
+ catch (Exception e) {
+ throw new ExceptionConverter(e);
+ }
+ }
+
+ protected static Image getTiffImageColor(TIFFDirectory dir, RandomAccessFileOrArray s) {
+ try {
+ int compression = (int)dir.getFieldAsLong(TIFFConstants.TIFFTAG_COMPRESSION);
+ int predictor = 1;
+ TIFFLZWDecoder lzwDecoder = null;
+ switch (compression) {
+ case TIFFConstants.COMPRESSION_NONE:
+ case TIFFConstants.COMPRESSION_LZW:
+ case TIFFConstants.COMPRESSION_PACKBITS:
+ case TIFFConstants.COMPRESSION_DEFLATE:
+ case TIFFConstants.COMPRESSION_OJPEG:
+ break;
+ default:
+ throw new IllegalArgumentException("The compression " + compression + " is not supported.");
+ }
+ int photometric = (int)dir.getFieldAsLong(TIFFConstants.TIFFTAG_PHOTOMETRIC);
+ switch (photometric) {
+ case TIFFConstants.PHOTOMETRIC_MINISWHITE:
+ case TIFFConstants.PHOTOMETRIC_MINISBLACK:
+ case TIFFConstants.PHOTOMETRIC_RGB:
+ case TIFFConstants.PHOTOMETRIC_SEPARATED:
+ case TIFFConstants.PHOTOMETRIC_PALETTE:
+ break;
+ default:
+ throw new IllegalArgumentException("The photometric " + photometric + " is not supported.");
+ }
+ float rotation = 0;
+ if (dir.isTagPresent(TIFFConstants.TIFFTAG_ORIENTATION)) {
+ int rot = (int)dir.getFieldAsLong(TIFFConstants.TIFFTAG_ORIENTATION);
+ if (rot == TIFFConstants.ORIENTATION_BOTRIGHT || rot == TIFFConstants.ORIENTATION_BOTLEFT)
+ rotation = (float)Math.PI;
+ else if (rot == TIFFConstants.ORIENTATION_LEFTTOP || rot == TIFFConstants.ORIENTATION_LEFTBOT)
+ rotation = (float)(Math.PI / 2.0);
+ else if (rot == TIFFConstants.ORIENTATION_RIGHTTOP || rot == TIFFConstants.ORIENTATION_RIGHTBOT)
+ rotation = -(float)(Math.PI / 2.0);
+ }
+ if (dir.isTagPresent(TIFFConstants.TIFFTAG_PLANARCONFIG)
+ && dir.getFieldAsLong(TIFFConstants.TIFFTAG_PLANARCONFIG) == TIFFConstants.PLANARCONFIG_SEPARATE)
+ throw new IllegalArgumentException("Planar images are not supported.");
+ if (dir.isTagPresent(TIFFConstants.TIFFTAG_EXTRASAMPLES))
+ throw new IllegalArgumentException("Extra samples are not supported.");
+ int samplePerPixel = 1;
+ if (dir.isTagPresent(TIFFConstants.TIFFTAG_SAMPLESPERPIXEL)) // 1,3,4
+ samplePerPixel = (int)dir.getFieldAsLong(TIFFConstants.TIFFTAG_SAMPLESPERPIXEL);
+ int bitsPerSample = 1;
+ if (dir.isTagPresent(TIFFConstants.TIFFTAG_BITSPERSAMPLE))
+ bitsPerSample = (int)dir.getFieldAsLong(TIFFConstants.TIFFTAG_BITSPERSAMPLE);
+ switch (bitsPerSample) {
+ case 1:
+ case 2:
+ case 4:
+ case 8:
+ break;
+ default:
+ throw new IllegalArgumentException("Bits per sample " + bitsPerSample + " is not supported.");
+ }
+ Image img = null;
+
+ int h = (int)dir.getFieldAsLong(TIFFConstants.TIFFTAG_IMAGELENGTH);
+ int w = (int)dir.getFieldAsLong(TIFFConstants.TIFFTAG_IMAGEWIDTH);
+ int dpiX = 0;
+ int dpiY = 0;
+ int resolutionUnit = TIFFConstants.RESUNIT_INCH;
+ if (dir.isTagPresent(TIFFConstants.TIFFTAG_RESOLUTIONUNIT))
+ resolutionUnit = (int)dir.getFieldAsLong(TIFFConstants.TIFFTAG_RESOLUTIONUNIT);
+ dpiX = getDpi(dir.getField(TIFFConstants.TIFFTAG_XRESOLUTION), resolutionUnit);
+ dpiY = getDpi(dir.getField(TIFFConstants.TIFFTAG_YRESOLUTION), resolutionUnit);
+ int rowsStrip = h;
+ if (dir.isTagPresent(TIFFConstants.TIFFTAG_ROWSPERSTRIP)) //another hack for broken tiffs
+ rowsStrip = (int)dir.getFieldAsLong(TIFFConstants.TIFFTAG_ROWSPERSTRIP);
+ long offset[] = getArrayLongShort(dir, TIFFConstants.TIFFTAG_STRIPOFFSETS);
+ long size[] = getArrayLongShort(dir, TIFFConstants.TIFFTAG_STRIPBYTECOUNTS);
+ if (size == null && h == rowsStrip) { // some TIFF producers are really lousy, so...
+ size = new long[]{s.length() - (int)offset[0]};
+ }
+ if (compression == TIFFConstants.COMPRESSION_LZW) {
+ TIFFField predictorField = dir.getField(TIFFConstants.TIFFTAG_PREDICTOR);
+ if (predictorField != null) {
+ predictor = predictorField.getAsInt(0);
+ if (predictor != 1 && predictor != 2) {
+ throw new RuntimeException("Illegal value for Predictor in TIFF file.");
+ }
+ if (predictor == 2 && bitsPerSample != 8) {
+ throw new RuntimeException(bitsPerSample + "-bit samples are not supported for Horizontal differencing Predictor.");
+ }
+ }
+ lzwDecoder = new TIFFLZWDecoder(w, predictor,
+ samplePerPixel);
+ }
+ int rowsLeft = h;
+ ByteArrayOutputStream stream = null;
+ DeflaterOutputStream zip = null;
+ CCITTG4Encoder g4 = null;
+ if (bitsPerSample == 1 && samplePerPixel == 1) {
+ g4 = new CCITTG4Encoder(w);
+ }
+ else {
+ stream = new ByteArrayOutputStream();
+ if (compression != TIFFConstants.COMPRESSION_OJPEG)
+ zip = new DeflaterOutputStream(stream);
+ }
+ for (int k = 0; k < offset.length; ++k) {
+ byte im[] = new byte[(int)size[k]];
+ s.seek(offset[k]);
+ s.readFully(im);
+ int height = Math.min(rowsStrip, rowsLeft);
+ byte outBuf[] = null;
+ if (compression != TIFFConstants.COMPRESSION_NONE)
+ outBuf = new byte[(w * bitsPerSample * samplePerPixel + 7) / 8 * height];
+ switch (compression) {
+ case TIFFConstants.COMPRESSION_DEFLATE:
+ inflate(im, outBuf);
+ break;
+ case TIFFConstants.COMPRESSION_NONE:
+ outBuf = im;
+ break;
+ case TIFFConstants.COMPRESSION_PACKBITS:
+ decodePackbits(im, outBuf);
+ break;
+ case TIFFConstants.COMPRESSION_LZW:
+ lzwDecoder.decode(im, outBuf, height);
+ break;
+ case TIFFConstants.COMPRESSION_OJPEG:
+ stream.write(im);
+ break;
+ }
+ if (bitsPerSample == 1 && samplePerPixel == 1) {
+ g4.fax4Encode(outBuf, height);
+ }
+ else if (compression != TIFFConstants.COMPRESSION_OJPEG) {
+ zip.write(outBuf);
+ }
+ rowsLeft -= rowsStrip;
+ }
+ if (bitsPerSample == 1 && samplePerPixel == 1) {
+ img = Image.getInstance(w, h, false, Image.CCITTG4,
+ photometric == TIFFConstants.PHOTOMETRIC_MINISBLACK ? Image.CCITT_BLACKIS1 : 0, g4.close());
+ }
+ else {
+ if (compression == TIFFConstants.COMPRESSION_OJPEG) {
+ img = new Jpeg(stream.toByteArray());
+ }
+ else {
+ zip.close();
+ img = Image.getInstance(w, h, samplePerPixel, bitsPerSample, stream.toByteArray());
+ img.setDeflated(true);
+ }
+ }
+ img.setDpi(dpiX, dpiY);
+ if (compression != TIFFConstants.COMPRESSION_OJPEG) {
+ if (dir.isTagPresent(TIFFConstants.TIFFTAG_ICCPROFILE)) {
+ try {
+ TIFFField fd = dir.getField(TIFFConstants.TIFFTAG_ICCPROFILE);
+ ICC_Profile icc_prof = ICC_Profile.getInstance(fd.getAsBytes());
+ if (samplePerPixel == icc_prof.getNumComponents())
+ img.tagICC(icc_prof);
+ }
+ catch (Exception e) {
+ //empty
+ }
+ }
+ if (dir.isTagPresent(TIFFConstants.TIFFTAG_COLORMAP)) {
+ TIFFField fd = dir.getField(TIFFConstants.TIFFTAG_COLORMAP);
+ char rgb[] = fd.getAsChars();
+ byte palette[] = new byte[rgb.length];
+ int gColor = rgb.length / 3;
+ int bColor = gColor * 2;
+ for (int k = 0; k < gColor; ++k) {
+ palette[k * 3] = (byte)(rgb[k] >>> 8);
+ palette[k * 3 + 1] = (byte)(rgb[k + gColor] >>> 8);
+ palette[k * 3 + 2] = (byte)(rgb[k + bColor] >>> 8);
+ }
+ PdfArray indexed = new PdfArray();
+ indexed.add(PdfName.INDEXED);
+ indexed.add(PdfName.DEVICERGB);
+ indexed.add(new PdfNumber(gColor - 1));
+ indexed.add(new PdfString(palette));
+ PdfDictionary additional = new PdfDictionary();
+ additional.put(PdfName.COLORSPACE, indexed);
+ img.setAdditional(additional);
+ }
+ img.setOriginalType(Image.ORIGINAL_TIFF);
+ }
+ if (photometric == TIFFConstants.PHOTOMETRIC_MINISWHITE)
+ img.setInverted(true);
+ if (rotation != 0)
+ img.setInitialRotation(rotation);
+ return img;
+ }
+ catch (Exception e) {
+ throw new ExceptionConverter(e);
+ }
+ }
+
+ static long[] getArrayLongShort(TIFFDirectory dir, int tag) {
+ TIFFField field = dir.getField(tag);
+ if (field == null)
+ return null;
+ long offset[];
+ if (field.getType() == TIFFField.TIFF_LONG)
+ offset = field.getAsLongs();
+ else { // must be short
+ char temp[] = field.getAsChars();
+ offset = new long[temp.length];
+ for (int k = 0; k < temp.length; ++k)
+ offset[k] = temp[k];
+ }
+ return offset;
+ }
+
+ // Uncompress packbits compressed image data.
+ public static void decodePackbits(byte data[], byte[] dst) {
+ int srcCount = 0, dstCount = 0;
+ byte repeat, b;
+
+ while (dstCount < dst.length) {
+ b = data[srcCount++];
+ if (b >= 0 && b <= 127) {
+ // literal run packet
+ for (int i=0; i<(b + 1); i++) {
+ dst[dstCount++] = data[srcCount++];
+ }
+
+ } else if (b <= -1 && b >= -127) {
+ // 2 byte encoded run packet
+ repeat = data[srcCount++];
+ for (int i=0; i<(-b + 1); i++) {
+ dst[dstCount++] = repeat;
+ }
+ } else {
+ // no-op packet. Do nothing
+ srcCount++;
+ }
+ }
+ }
+
+ public static void inflate(byte[] deflated, byte[] inflated) {
+ Inflater inflater = new Inflater();
+ inflater.setInput(deflated);
+ try {
+ inflater.inflate(inflated);
+ }
+ catch(DataFormatException dfe) {
+ throw new ExceptionConverter(dfe);
+ }
+ }
+
+}
diff --git a/src/main/java/com/lowagie/text/pdf/codec/postscript/JavaCharStream.java b/src/main/java/com/lowagie/text/pdf/codec/postscript/JavaCharStream.java
new file mode 100644
index 0000000..da52458
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/codec/postscript/JavaCharStream.java
@@ -0,0 +1,547 @@
+/* Generated By:JavaCC: Do not edit this line. JavaCharStream.java Version 2.1 */
+package com.lowagie.text.pdf.codec.postscript;
+
+/**
+ * An implementation of interface CharStream, where the stream is assumed to
+ * contain only ASCII characters (with java-like unicode escape processing).
+ */
+
+public final class JavaCharStream
+{
+ public static final boolean staticFlag = false;
+ static final int hexval(char c) throws java.io.IOException {
+ switch(c)
+ {
+ case '0' :
+ return 0;
+ case '1' :
+ return 1;
+ case '2' :
+ return 2;
+ case '3' :
+ return 3;
+ case '4' :
+ return 4;
+ case '5' :
+ return 5;
+ case '6' :
+ return 6;
+ case '7' :
+ return 7;
+ case '8' :
+ return 8;
+ case '9' :
+ return 9;
+
+ case 'a' :
+ case 'A' :
+ return 10;
+ case 'b' :
+ case 'B' :
+ return 11;
+ case 'c' :
+ case 'C' :
+ return 12;
+ case 'd' :
+ case 'D' :
+ return 13;
+ case 'e' :
+ case 'E' :
+ return 14;
+ case 'f' :
+ case 'F' :
+ return 15;
+ }
+
+ throw new java.io.IOException(); // Should never come here
+ }
+
+ public int bufpos = -1;
+ int bufsize;
+ int available;
+ int tokenBegin;
+ private int bufline[];
+ private int bufcolumn[];
+
+ private int column = 0;
+ private int line = 1;
+
+ private boolean prevCharIsCR = false;
+ private boolean prevCharIsLF = false;
+
+ private java.io.Reader inputStream;
+
+ private char[] nextCharBuf;
+ private char[] buffer;
+ private int maxNextCharInd = 0;
+ private int nextCharInd = -1;
+ private int inBuf = 0;
+
+ private final void ExpandBuff(boolean wrapAround)
+ {
+ char[] newbuffer = new char[bufsize + 2048];
+ int newbufline[] = new int[bufsize + 2048];
+ int newbufcolumn[] = new int[bufsize + 2048];
+
+ try
+ {
+ if (wrapAround)
+ {
+ System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin);
+ System.arraycopy(buffer, 0, newbuffer,
+ bufsize - tokenBegin, bufpos);
+ buffer = newbuffer;
+
+ System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin);
+ System.arraycopy(bufline, 0, newbufline, bufsize - tokenBegin, bufpos);
+ bufline = newbufline;
+
+ System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin);
+ System.arraycopy(bufcolumn, 0, newbufcolumn, bufsize - tokenBegin, bufpos);
+ bufcolumn = newbufcolumn;
+
+ bufpos += (bufsize - tokenBegin);
+ }
+ else
+ {
+ System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin);
+ buffer = newbuffer;
+
+ System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin);
+ bufline = newbufline;
+
+ System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin);
+ bufcolumn = newbufcolumn;
+
+ bufpos -= tokenBegin;
+ }
+ }
+ catch (Throwable t)
+ {
+ throw new Error(t.getMessage());
+ }
+
+ available = (bufsize += 2048);
+ tokenBegin = 0;
+ }
+
+ private final void FillBuff() throws java.io.IOException
+ {
+ int i;
+ if (maxNextCharInd == 4096)
+ maxNextCharInd = nextCharInd = 0;
+
+ try {
+ if ((i = inputStream.read(nextCharBuf, maxNextCharInd,
+ 4096 - maxNextCharInd)) == -1)
+ {
+ inputStream.close();
+ throw new java.io.IOException();
+ }
+ else
+ maxNextCharInd += i;
+ return;
+ }
+ catch(java.io.IOException e) {
+ if (bufpos != 0)
+ {
+ --bufpos;
+ backup(0);
+ }
+ else
+ {
+ bufline[bufpos] = line;
+ bufcolumn[bufpos] = column;
+ }
+ throw e;
+ }
+ }
+
+ private final char ReadByte() throws java.io.IOException
+ {
+ if (++nextCharInd >= maxNextCharInd)
+ FillBuff();
+
+ return nextCharBuf[nextCharInd];
+ }
+
+ public final char BeginToken() throws java.io.IOException
+ {
+ if (inBuf > 0)
+ {
+ --inBuf;
+
+ if (++bufpos == bufsize)
+ bufpos = 0;
+
+ tokenBegin = bufpos;
+ return buffer[bufpos];
+ }
+
+ tokenBegin = 0;
+ bufpos = -1;
+
+ return readChar();
+ }
+
+ private final void AdjustBuffSize()
+ {
+ if (available == bufsize)
+ {
+ if (tokenBegin > 2048)
+ {
+ bufpos = 0;
+ available = tokenBegin;
+ }
+ else
+ ExpandBuff(false);
+ }
+ else if (available > tokenBegin)
+ available = bufsize;
+ else if ((tokenBegin - available) < 2048)
+ ExpandBuff(true);
+ else
+ available = tokenBegin;
+ }
+
+ private final void UpdateLineColumn(char c)
+ {
+ column++;
+
+ if (prevCharIsLF)
+ {
+ prevCharIsLF = false;
+ line += (column = 1);
+ }
+ else if (prevCharIsCR)
+ {
+ prevCharIsCR = false;
+ if (c == '\n')
+ {
+ prevCharIsLF = true;
+ }
+ else
+ line += (column = 1);
+ }
+
+ switch (c)
+ {
+ case '\r' :
+ prevCharIsCR = true;
+ break;
+ case '\n' :
+ prevCharIsLF = true;
+ break;
+ case '\t' :
+ column--;
+ column += (8 - (column & 07));
+ break;
+ default :
+ break;
+ }
+
+ bufline[bufpos] = line;
+ bufcolumn[bufpos] = column;
+ }
+
+ public final char readChar() throws java.io.IOException
+ {
+ if (inBuf > 0)
+ {
+ --inBuf;
+
+ if (++bufpos == bufsize)
+ bufpos = 0;
+
+ return buffer[bufpos];
+ }
+
+ char c;
+
+ if (++bufpos == available)
+ AdjustBuffSize();
+
+ if ((buffer[bufpos] = c = ReadByte()) == '\\')
+ {
+ UpdateLineColumn(c);
+
+ int backSlashCnt = 1;
+
+ for (;;) // Read all the backslashes
+ {
+ if (++bufpos == available)
+ AdjustBuffSize();
+
+ try
+ {
+ if ((buffer[bufpos] = c = ReadByte()) != '\\')
+ {
+ UpdateLineColumn(c);
+ // found a non-backslash char.
+ if ((c == 'u') && ((backSlashCnt & 1) == 1))
+ {
+ if (--bufpos < 0)
+ bufpos = bufsize - 1;
+
+ break;
+ }
+
+ backup(backSlashCnt);
+ return '\\';
+ }
+ }
+ catch(java.io.IOException e)
+ {
+ if (backSlashCnt > 1)
+ backup(backSlashCnt);
+
+ return '\\';
+ }
+
+ UpdateLineColumn(c);
+ backSlashCnt++;
+ }
+
+ // Here, we have seen an odd number of backslash's followed by a 'u'
+ try
+ {
+ while ((c = ReadByte()) == 'u')
+ ++column;
+
+ buffer[bufpos] = c = (char)(hexval(c) << 12 |
+ hexval(ReadByte()) << 8 |
+ hexval(ReadByte()) << 4 |
+ hexval(ReadByte()));
+
+ column += 4;
+ }
+ catch(java.io.IOException e)
+ {
+ throw new Error("Invalid escape character at line " + line +
+ " column " + column + ".");
+ }
+
+ if (backSlashCnt == 1)
+ return c;
+ else
+ {
+ backup(backSlashCnt - 1);
+ return '\\';
+ }
+ }
+ else
+ {
+ UpdateLineColumn(c);
+ return (c);
+ }
+ }
+
+ /**
+ * @deprecated
+ * @see #getEndColumn
+ */
+
+ public final int getColumn() {
+ return bufcolumn[bufpos];
+ }
+
+ /**
+ * @deprecated
+ * @see #getEndLine
+ */
+
+ public final int getLine() {
+ return bufline[bufpos];
+ }
+
+ public final int getEndColumn() {
+ return bufcolumn[bufpos];
+ }
+
+ public final int getEndLine() {
+ return bufline[bufpos];
+ }
+
+ public final int getBeginColumn() {
+ return bufcolumn[tokenBegin];
+ }
+
+ public final int getBeginLine() {
+ return bufline[tokenBegin];
+ }
+
+ public final void backup(int amount) {
+
+ inBuf += amount;
+ if ((bufpos -= amount) < 0)
+ bufpos += bufsize;
+ }
+
+ public JavaCharStream(java.io.Reader dstream,
+ int startline, int startcolumn, int buffersize)
+ {
+ inputStream = dstream;
+ line = startline;
+ column = startcolumn - 1;
+
+ available = bufsize = buffersize;
+ buffer = new char[buffersize];
+ bufline = new int[buffersize];
+ bufcolumn = new int[buffersize];
+ nextCharBuf = new char[4096];
+ }
+
+ public JavaCharStream(java.io.Reader dstream,
+ int startline, int startcolumn)
+ {
+ this(dstream, startline, startcolumn, 4096);
+ }
+
+ public JavaCharStream(java.io.Reader dstream)
+ {
+ this(dstream, 1, 1, 4096);
+ }
+ public void ReInit(java.io.Reader dstream,
+ int startline, int startcolumn, int buffersize)
+ {
+ inputStream = dstream;
+ line = startline;
+ column = startcolumn - 1;
+
+ if (buffer == null || buffersize != buffer.length)
+ {
+ available = bufsize = buffersize;
+ buffer = new char[buffersize];
+ bufline = new int[buffersize];
+ bufcolumn = new int[buffersize];
+ nextCharBuf = new char[4096];
+ }
+ prevCharIsLF = prevCharIsCR = false;
+ tokenBegin = inBuf = maxNextCharInd = 0;
+ nextCharInd = bufpos = -1;
+ }
+
+ public void ReInit(java.io.Reader dstream,
+ int startline, int startcolumn)
+ {
+ ReInit(dstream, startline, startcolumn, 4096);
+ }
+
+ public void ReInit(java.io.Reader dstream)
+ {
+ ReInit(dstream, 1, 1, 4096);
+ }
+ public JavaCharStream(java.io.InputStream dstream, int startline,
+ int startcolumn, int buffersize)
+ {
+ this(new java.io.InputStreamReader(dstream), startline, startcolumn, 4096);
+ }
+
+ public JavaCharStream(java.io.InputStream dstream, int startline,
+ int startcolumn)
+ {
+ this(dstream, startline, startcolumn, 4096);
+ }
+
+ public JavaCharStream(java.io.InputStream dstream)
+ {
+ this(dstream, 1, 1, 4096);
+ }
+
+ public void ReInit(java.io.InputStream dstream, int startline,
+ int startcolumn, int buffersize)
+ {
+ ReInit(new java.io.InputStreamReader(dstream), startline, startcolumn, 4096);
+ }
+ public void ReInit(java.io.InputStream dstream, int startline,
+ int startcolumn)
+ {
+ ReInit(dstream, startline, startcolumn, 4096);
+ }
+ public void ReInit(java.io.InputStream dstream)
+ {
+ ReInit(dstream, 1, 1, 4096);
+ }
+
+ public final String GetImage()
+ {
+ if (bufpos >= tokenBegin)
+ return new String(buffer, tokenBegin, bufpos - tokenBegin + 1);
+ else
+ return new String(buffer, tokenBegin, bufsize - tokenBegin) +
+ new String(buffer, 0, bufpos + 1);
+ }
+
+ public final char[] GetSuffix(int len)
+ {
+ char[] ret = new char[len];
+
+ if ((bufpos + 1) >= len)
+ System.arraycopy(buffer, bufpos - len + 1, ret, 0, len);
+ else
+ {
+ System.arraycopy(buffer, bufsize - (len - bufpos - 1), ret, 0,
+ len - bufpos - 1);
+ System.arraycopy(buffer, 0, ret, len - bufpos - 1, bufpos + 1);
+ }
+
+ return ret;
+ }
+
+ public void Done()
+ {
+ nextCharBuf = null;
+ buffer = null;
+ bufline = null;
+ bufcolumn = null;
+ }
+
+ /**
+ * Method to adjust line and column numbers for the start of a token.<BR>
+ */
+ public void adjustBeginLineColumn(int newLine, int newCol)
+ {
+ int start = tokenBegin;
+ int len;
+
+ if (bufpos >= tokenBegin)
+ {
+ len = bufpos - tokenBegin + inBuf + 1;
+ }
+ else
+ {
+ len = bufsize - tokenBegin + bufpos + 1 + inBuf;
+ }
+
+ int i = 0, j = 0, k = 0;
+ int nextColDiff = 0, columnDiff = 0;
+
+ while (i < len &&
+ bufline[j = start % bufsize] == bufline[k = ++start % bufsize])
+ {
+ bufline[j] = newLine;
+ nextColDiff = columnDiff + bufcolumn[k] - bufcolumn[j];
+ bufcolumn[j] = newCol + columnDiff;
+ columnDiff = nextColDiff;
+ i++;
+ }
+
+ if (i < len)
+ {
+ bufline[j] = newLine++;
+ bufcolumn[j] = newCol + columnDiff;
+
+ while (i++ < len)
+ {
+ if (bufline[j = start % bufsize] != bufline[++start % bufsize])
+ bufline[j] = newLine++;
+ else
+ bufline[j] = newLine;
+ }
+ }
+
+ line = bufline[j];
+ column = bufcolumn[j];
+ }
+
+}
diff --git a/src/main/java/com/lowagie/text/pdf/codec/postscript/MetaDoPS.java b/src/main/java/com/lowagie/text/pdf/codec/postscript/MetaDoPS.java
new file mode 100644
index 0000000..a160e6b
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/codec/postscript/MetaDoPS.java
@@ -0,0 +1,98 @@
+/*
+ * $Id: MetaDoPS.java,v 1.4 2006/04/22 16:56:39 psoares33 Exp $
+ * $Name: $
+ *
+ * Copyright 2001, 2002 Paulo Soares
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf.codec.postscript;
+
+import java.io.*;
+import java.awt.*;
+import com.lowagie.text.*;
+import com.lowagie.text.pdf.*;
+
+public class MetaDoPS {
+
+ public PdfContentByte cb;
+ InputStream in;
+ int left;
+ int top;
+ int right;
+ int bottom;
+ int inch;
+
+ public MetaDoPS(InputStream in, PdfContentByte cb) {
+ this.cb = cb;
+ this.in = in;
+ }
+
+ public void readAll() throws IOException, DocumentException {
+
+ cb.saveState();
+ java.awt.Graphics2D g2 = cb.createGraphicsShapes(PageSize.A4.
+ width(), PageSize.A4.height());
+ try {
+ PAContext context = new PAContext( (Graphics2D) g2,
+ new Dimension( (int) PageSize.A4.width(),
+ (int) PageSize.A4.height()));
+ context.draw(in);
+// context.draw(new BufferedInputStream(in));
+ // ( (Graphics2D) backBuffer.getGraphics()).dispose();
+ in.close();
+ }
+ catch (IOException ex) {
+ ex.printStackTrace();
+ }
+ catch (PainterException ex) {
+ ex.printStackTrace();
+ }
+ g2.dispose();
+ cb.restoreState();
+
+ }
+
+}
diff --git a/src/main/java/com/lowagie/text/pdf/codec/postscript/PACommand.java b/src/main/java/com/lowagie/text/pdf/codec/postscript/PACommand.java
new file mode 100644
index 0000000..91b2e18
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/codec/postscript/PACommand.java
@@ -0,0 +1,19 @@
+/*
+ * Copyright 1998 by Sun Microsystems, Inc.,
+ * 901 San Antonio Road, Palo Alto, California, 94303, U.S.A.
+ * All rights reserved.
+ *
+ * This software is the confidential and proprietary information
+ * of Sun Microsystems, Inc. ("Confidential Information"). You
+ * shall not disclose such Confidential Information and shall use
+ * it only in accordance with the terms of the license agreement
+ * you entered into with Sun.
+ */
+
+package com.lowagie.text.pdf.codec.postscript;
+
+public interface PACommand {
+
+ public void execute(PAContext context) throws PainterException;
+
+}
diff --git a/src/main/java/com/lowagie/text/pdf/codec/postscript/PAContext.java b/src/main/java/com/lowagie/text/pdf/codec/postscript/PAContext.java
new file mode 100644
index 0000000..863d82a
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/codec/postscript/PAContext.java
@@ -0,0 +1,2772 @@
+/*
+ * Copyright 1998 by Sun Microsystems, Inc.,
+ * 901 San Antonio Road, Palo Alto, California, 94303, U.S.A.
+ * All rights reserved.
+ *
+ * This software is the confidential and proprietary information
+ * of Sun Microsystems, Inc. ("Confidential Information"). You
+ * shall not disclose such Confidential Information and shall use
+ * it only in accordance with the terms of the license agreement
+ * you entered into with Sun.
+ */
+
+package com.lowagie.text.pdf.codec.postscript;
+
+import java.util.*;
+import java.io.*;
+import java.awt.*;
+import java.awt.geom.*;
+import com.lowagie.text.pdf.PdfGraphics2D;
+import com.lowagie.text.pdf.PdfContentByte;
+import com.lowagie.text.pdf.PdfName;
+import com.lowagie.text.*;
+import com.lowagie.text.pdf.RandomAccessFileOrArray;
+
+public class PAContext {
+
+ public PAPencil pencil;
+ public Stack dictionaries;
+ public Stack operands;
+ public PAEngine engine;
+ PAParser poorscript = null;
+ protected Random randomNumberGenerator;
+ InputStream is=null;
+
+ protected Object lastUnknownIdentifier;
+ public static boolean IgnoreUnknownCommands = false;
+ public static boolean DebugExecution = false;
+
+ public PAContext(Component component) {
+ this(new PAPencil(component));
+ }
+
+ public PAContext(Graphics2D g, Dimension size) {
+ this(new PAPencil(g, size));
+ }
+
+ public PAContext(PAPencil pencil) {
+ super();
+ this.pencil = pencil;
+ this.dictionaries = new Stack();
+ this.operands = new Stack();
+ this.engine = new PAEngine(this);
+ HashMap systemDict = this.constructSystemDict();
+ this.dictionaries.push(systemDict);
+ HashMap globalDict = this.constructGlobalDict();
+ this.dictionaries.push(globalDict);
+ HashMap userDict = this.constructUserDict();
+ systemDict.put("userdict", userDict);
+ this.dictionaries.push(userDict);
+ this.randomNumberGenerator = new Random();
+ this.lastUnknownIdentifier = null;
+ }
+
+ /**
+ * draw
+ *
+ * @param inputStream InputStream
+ * @throws PainterException
+ */
+ public void draw(InputStream inputStream) throws PainterException {
+ try {
+ String filename="init.ps";
+// poorscript = new PAParser(new NamedInputStream(PAContext.class.getResourceAsStream(filename),filename));
+ InputStream inpstr=PAContext.class.getResourceAsStream(filename);
+ poorscript = new PAParser(inpstr);
+ poorscript.parse(this);
+ try {
+ inpstr.close();
+ }
+ catch (IOException ex) {
+ ex.printStackTrace();
+ }
+// poorscript.enable_tracing();
+// poorscript.token_source.setDebugStream(System.err);
+// byte[] b=null;
+// try {
+// b = RandomAccessFileOrArray.InputStreamToArray(inputStream);
+// }
+// catch (IOException ex) {
+// ex.printStackTrace();
+// }
+// ByteArrayInputStream bar=new ByteArrayInputStream(b);
+// is = bar;
+ poorscript.ReInit(inputStream);
+ poorscript.parse(this);
+ // pencil.graphics.dispose();
+ }
+ catch (ParseException e) {
+ e.printStackTrace();
+ throw new PainterException(e.toString());
+ }
+ }
+
+
+
+ public Object getLastUnknownIdentifier() {
+ return this.lastUnknownIdentifier;
+ }
+
+ public double[] popNumberOperands(int n) throws PainterException {
+ double[] result = new double[n];
+ Object objectValue;
+ double doubleValue;
+
+ for (int i = n - 1; i >= 0; i--) {
+ try {
+ objectValue = this.operands.pop();
+ }
+ catch (EmptyStackException e) {
+ throw new PainterException("Operand stack is empty poping " + n +
+ " number operands");
+ }
+ if (objectValue instanceof Number) {
+ doubleValue = ( (Number) objectValue).doubleValue();
+ }
+ else {
+ throw new PainterException("Number expected on operand stack poping " +
+ n + " number operands, found " +
+ objectValue.getClass().getName());
+ }
+ result[i] = doubleValue;
+ }
+ return result;
+ }
+
+ public Object[] popOperands(int n) throws PainterException {
+ Object[] result = new Object[n];
+ Object objectValue;
+
+ for (int i = n - 1; i >= 0; i--) {
+ try {
+ objectValue = this.operands.pop();
+ }
+ catch (EmptyStackException e) {
+ throw new PainterException("Operand stack is empty poping " + n +
+ " operands");
+ }
+ result[i] = objectValue;
+ }
+ return result;
+ }
+
+ public Object peekOperand() throws PainterException {
+ Object objectValue;
+
+ try {
+ objectValue = this.operands.peek();
+ }
+ catch (EmptyStackException e) {
+ throw new PainterException("Operand stack is empty peeking operand");
+ }
+ return objectValue;
+ }
+
+ public Object findIdentifier(Object identifier) {
+ Object result = null;
+ int i, n;
+
+ n = this.dictionaries.size();
+ i = n - 1;
+ while (i >= 0 && result == null) {
+ HashMap dictionary = (HashMap)this.dictionaries.elementAt(i);
+ result = dictionary.get(identifier);
+ i--;
+ }
+ if (result == null) {
+ this.lastUnknownIdentifier = identifier;
+ }
+ return result;
+ }
+
+ public Object findDictionary(Object identifier) {
+ Object result = null;
+ HashMap dictionary = null;
+ int i, n;
+
+ n = this.dictionaries.size();
+ i = n - 1;
+ while (i >= 0 && result == null) {
+ dictionary = (HashMap)this.dictionaries.elementAt(i);
+ result = dictionary.get(identifier);
+ i--;
+ }
+ if (result == null) {
+ return result;
+ }
+ else {
+ return dictionary;
+ }
+ }
+
+ public void collectArray() throws PainterException {
+ ArrayList result;
+ Object objectValue;
+ int i, n;
+ boolean found = false;
+
+ n = this.operands.size();
+ for (i = n - 1; i >= 0; i--) {
+ objectValue = this.operands.elementAt(i);
+ if (objectValue instanceof PAToken &&
+ ( (PAToken) objectValue).type == PAToken.START_ARRAY) {
+ found = true;
+ break;
+ }
+ }
+ if (!found) {
+ throw new PainterException("No array was started");
+ }
+ result = new ArrayList(n - i - 1);
+ for (int j = 0; j < n - i - 1; j++) {
+ result.add(null);
+ }
+ for (int j = n - 1; j > i; j--) {
+ try {
+ objectValue = this.operands.pop();
+ }
+ catch (EmptyStackException e) {
+ throw new PainterException(
+ "Operand stack is empty collecting array elements");
+ }
+ result.set(j - i - 1, objectValue);
+ }
+ try {
+ this.operands.pop(); // the start array mark itself
+ }
+ catch (EmptyStackException e) {
+ throw new PainterException(
+ "Operand stack is empty removing begin array mark");
+ }
+ this.operands.push(result);
+ }
+
+ public void collectDict() throws PainterException {
+ HashMap result; // = new HashMap();
+ Object objectValue;
+ int i, n;
+ boolean found = false;
+
+ n = this.operands.size();
+ for (i = n - 1; i >= 0; i--) {
+ objectValue = this.operands.elementAt(i);
+ if (objectValue instanceof PAToken &&
+ ( (PAToken) objectValue).type == PAToken.START_DICT) {
+ found = true;
+ break;
+ }
+ }
+ if (!found) {
+ throw new PainterException("No dict was started");
+ }
+// result = new ArrayList(n - i - 1);
+ result = new HashMap();
+// for (int j = 0; j < n - i - 1; j++) {
+// result.add(null);
+// }
+ for (int j = n - 1; j > i; j -= 2) {
+ Object targetValue;
+ try {
+ targetValue = this.operands.pop();
+ objectValue = this.operands.pop();
+ }
+ catch (EmptyStackException e) {
+ throw new PainterException(
+ "Operand stack is empty collecting hashmap elements");
+ }
+ result.put(objectValue, targetValue);
+ }
+ try {
+ this.operands.pop(); // the start array mark itself
+ }
+ catch (EmptyStackException e) {
+ throw new PainterException(
+ "Operand stack is empty removing begin array mark");
+ }
+ this.operands.push(result);
+ }
+
+ protected HashMap constructGlobalDict() {
+ HashMap globalDict = new HashMap();
+ return globalDict;
+ }
+
+ protected HashMap constructUserDict() {
+ HashMap userDict = new HashMap();
+
+ return userDict;
+ }
+
+ public static void main(String[] args) {
+ javax.swing.JFrame jf = new javax.swing.JFrame();
+ jf.setVisible(true);
+ jf.setDefaultCloseOperation(jf.DISPOSE_ON_CLOSE);
+ PAContext pac = new PAContext(new PAPencil(jf));
+ HashMap hm = (HashMap) pac.findDictionary("systemdict");
+ Iterator it = new TreeSet(hm.keySet()).iterator();
+ while (it.hasNext()) {
+
+ String obname = it.next().toString();
+ Object ob = hm.get(obname);
+ String typname = ob.getClass().getName();
+ System.out.println(obname + ":" + typname);
+ }
+ System.exit(0);
+ }
+
+ protected HashMap constructSystemDict() {
+ HashMap systemDict = new HashMap();
+
+ // newpath
+ systemDict.put("newpath", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ context.pencil.newpath();
+ }
+ });
+
+ // moveto
+ systemDict.put("moveto", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ double data[];
+ data = context.popNumberOperands(2);
+ context.pencil.moveto(data[0], data[1]);
+ }
+ });
+
+ // rmoveto
+ systemDict.put("rmoveto", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ double data[];
+
+ data = context.popNumberOperands(2);
+ context.pencil.rmoveto(data[0], data[1]);
+ }
+ });
+
+ // lineto
+ systemDict.put("lineto", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ double data[];
+
+ data = context.popNumberOperands(2);
+ context.pencil.lineto(data[0], data[1]);
+ }
+ });
+
+ // rlineto
+ systemDict.put("rlineto", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ double data[];
+
+ data = context.popNumberOperands(2);
+ context.pencil.rlineto(data[0], data[1]);
+ }
+ });
+
+ // arc
+ systemDict.put("arc", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ double data[];
+
+ data = context.popNumberOperands(5);
+ context.pencil.arc(data[0], data[1], data[2], data[3], data[4]);
+ }
+ });
+
+ // arcn
+ systemDict.put("arcn", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ double data[];
+
+ data = context.popNumberOperands(5);
+ context.pencil.arcn(data[0], data[1], data[2], data[3], data[4]);
+ }
+ });
+
+ // curveto
+ systemDict.put("curveto", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ double data[];
+
+ data = context.popNumberOperands(6);
+ context.pencil.curveto(data[0], data[1], data[2], data[3], data[4],
+ data[5]);
+ }
+ });
+
+ // rcurveto
+ systemDict.put("rcurveto", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ double data[];
+
+ data = context.popNumberOperands(6);
+ context.pencil.rcurveto(data[0], data[1], data[2], data[3], data[4],
+ data[5]);
+ }
+ });
+
+ // closepath
+ systemDict.put("closepath", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ context.pencil.closepath();
+ }
+ });
+
+ // gsave
+ systemDict.put("gsave", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ context.pencil.gsave();
+ }
+ });
+
+ // grestore
+ systemDict.put("grestore", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ context.pencil.grestore();
+ }
+ });
+
+ // translate
+ systemDict.put("translate", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ if (context.peekOperand() instanceof Number) {
+ double data[];
+ AffineTransform at = new AffineTransform();
+ AffineTransform ctm = context.pencil.graphics.getTransform();
+
+ data = context.popNumberOperands(2);
+ at.translate(data[0], data[1]);
+ ctm.concatenate(at);
+ context.pencil.graphics.setTransform(ctm);
+ }
+ else {
+ Object data[];
+
+ data = context.popOperands(3);
+ if (! (data[0] instanceof Number)) {
+ throw new PainterException("translate: wrong arguments");
+ }
+ if (! (data[1] instanceof Number)) {
+ throw new PainterException("translate: wrong arguments");
+ }
+ if (! (data[2] instanceof ArrayList)) {
+ throw new PainterException("translate: wrong arguments");
+ }
+
+ ArrayList array = (ArrayList) data[2];
+
+ if (! (array.size() == 6)) {
+ throw new PainterException("translate: wrong arguments");
+ }
+
+ AffineTransform at = new AffineTransform();
+
+ at.translate( ( (Number) data[0]).doubleValue(),
+ ( (Number) data[1]).doubleValue());
+
+ double[] entries = new double[6];
+
+ at.getMatrix(entries);
+
+ for (int i = 0; i < 6; i++) {
+ array.set(i, new Double(entries[i]));
+ }
+ context.operands.push(array);
+ }
+ }
+ });
+
+ // rotate
+ systemDict.put("rotate", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ if (context.peekOperand() instanceof Number) {
+ double data[];
+ AffineTransform at = new AffineTransform();
+ AffineTransform ctm = context.pencil.graphics.getTransform();
+
+ data = context.popNumberOperands(1);
+ at.rotate(data[0] * Math.PI / 180.0d);
+ ctm.concatenate(at);
+ context.pencil.graphics.setTransform(ctm);
+ }
+ else {
+ Object data[];
+ AffineTransform at = new AffineTransform();
+
+ data = context.popOperands(2);
+ if (! (data[0] instanceof Number)) {
+ throw new PainterException("rotate: wrong arguments");
+ }
+ if (! (data[1] instanceof ArrayList)) {
+ throw new PainterException("rotate: wrong arguments");
+ }
+
+ ArrayList array = (ArrayList) data[1];
+
+ if (! (array.size() == 6)) {
+ throw new PainterException("rotate: wrong arguments");
+ }
+
+ at.rotate( ( (Number) data[0]).doubleValue());
+
+ double[] entries = new double[6];
+
+ at.getMatrix(entries);
+
+ for (int i = 0; i < 6; i++) {
+ array.set(i, new Double(entries[i]));
+ }
+ context.operands.push(array);
+ }
+ }
+ });
+
+ // scale
+ systemDict.put("scale", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ if (context.peekOperand() instanceof Number) {
+ double data[];
+ AffineTransform at = new AffineTransform();
+ AffineTransform ctm = context.pencil.graphics.getTransform();
+
+ data = context.popNumberOperands(2);
+ at.scale(data[0], data[1]);
+ ctm.concatenate(at);
+ context.pencil.graphics.setTransform(ctm);
+ }
+ else {
+ Object data[];
+
+ data = context.popOperands(3);
+ if (! (data[0] instanceof Number)) {
+ throw new PainterException("scale: wrong arguments");
+ }
+ if (! (data[1] instanceof Number)) {
+ throw new PainterException("scale: wrong arguments");
+ }
+ if (! (data[2] instanceof ArrayList)) {
+ throw new PainterException("scale: wrong arguments");
+ }
+
+ ArrayList array = (ArrayList) data[2];
+
+ double[] entries = new double[6];
+
+ if (! (array.size() == 6)) {
+ throw new PainterException("scale: wrong arguments");
+ }
+
+ entries[0] = ( (Number) data[0]).doubleValue();
+ entries[1] = 0.0d;
+ entries[2] = 0.0d;
+ entries[3] = ( (Number) data[1]).doubleValue();
+ entries[4] = 0.0d;
+ entries[5] = 0.0d;
+
+ for (int i = 0; i < 6; i++) {
+ array.set(i, new Double(entries[i]));
+ }
+ context.operands.push(array);
+ }
+ }
+ });
+ // currentmatrix
+ systemDict.put("currentmatrix", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ Object data[];
+ data = context.popOperands(1);
+ if (! (data[0] instanceof ArrayList)) {
+ throw new PainterException("currentmatrix: wrong argument");
+ }
+ ArrayList array = (ArrayList) data[0];
+
+ double[] entries = new double[6];
+
+ if (! (array.size() == 6)) {
+ throw new PainterException("currentmatrix: wrong arguments");
+ }
+
+
+ AffineTransform ctm = context.pencil.graphics.getTransform();
+ ctm.getMatrix(entries);
+
+ for (int i = 0; i < 6; i++) {
+ array.set(i, new Double(entries[i]));
+ }
+ context.operands.push(array);
+ }
+ });
+
+ // setmatrix
+ systemDict.put("setmatrix", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ Object data[];
+ data = context.popOperands(1);
+ if (! (data[0] instanceof ArrayList)) {
+ throw new PainterException("setmatrix: wrong argument");
+ }
+ ArrayList array = (ArrayList) data[0];
+
+ double[] entries = new double[6];
+
+ if (! (array.size() == 6)) {
+ throw new PainterException("setmatrix: wrong arguments");
+ }
+ entries[0] = ((Number)array.get(0)).doubleValue();
+ entries[1] = ((Number)array.get(1)).doubleValue();
+ entries[2] = ((Number)array.get(2)).doubleValue();
+ entries[3] = ((Number)array.get(3)).doubleValue();
+ entries[4] = ((Number)array.get(4)).doubleValue();
+ entries[5] = ((Number)array.get(5)).doubleValue();
+
+ AffineTransform at = new AffineTransform(entries);
+ context.pencil.graphics.setTransform(at);
+ }
+ });
+
+ // stroke
+ systemDict.put("stroke", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ context.pencil.stroke();
+ }
+ });
+
+ // fill
+ systemDict.put("fill", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ context.pencil.fill();
+ }
+ });
+
+ // eofill
+ systemDict.put("eofill", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ context.pencil.eofill();
+ }
+ });
+
+ // show
+ systemDict.put("show", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ Object data[];
+
+ data = context.popOperands(1);
+ if (! (data[0] instanceof String)) {
+ throw new PainterException("show: wrong arguments");
+ }
+ context.pencil.show( (String) data[0]);
+ }
+ });
+
+ // stringwidth
+ systemDict.put("stringwidth", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ Object data[];
+ float[] result;
+ java.awt.Font font;
+
+ data = context.popOperands(1);
+ if (! (data[0] instanceof String)) {
+ throw new PainterException("stringwidth: wrong arguments");
+ }
+ font = context.pencil.graphics.getFont();
+ Rectangle2D rect = font.getStringBounds( (String) data[0],
+ context.pencil.graphics.
+ getFontRenderContext());
+ context.operands.push(new Float(rect.getWidth()));
+ context.operands.push(new Float(rect.getHeight()));
+ }
+ });
+
+ // showpage
+ systemDict.put("showpage", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ context.pencil.showpage();
+ }
+ });
+
+ // findfont
+ systemDict.put("findfont", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ Object data[];
+ PAToken patoken;
+ data = context.popOperands(1);
+ if (! (data[0] instanceof PAToken)) {
+ throw new PainterException("findfont: wrong arguments");
+ }
+ patoken = (PAToken) data[0];
+ if (! (patoken.type == PAToken.KEY)) {
+ throw new PainterException("findfont: wrong arguments");
+ }
+ context.operands.push(context.pencil.findFont( (String) patoken.value));
+ }
+ });
+
+ // makefont
+ systemDict.put("makefont", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ Object data[];
+ data = context.popOperands(2);
+ if (! (data[0] instanceof java.awt.Font)) {
+ throw new PainterException("makefont: wrong arguments");
+ }
+ if (! (data[1] instanceof ArrayList)) {
+ throw new PainterException("makefont: wrong arguments");
+ }
+ // @TODO implement!!!
+ context.operands.push(data[0]);
+ }
+ });
+
+ // scalefont
+ systemDict.put("scalefont", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ Object data[];
+ data = context.popOperands(2);
+ if (! (data[0] instanceof java.awt.Font)) {
+ throw new PainterException("scalefont: wrong arguments");
+ }
+ if (! (data[1] instanceof Number)) {
+ throw new PainterException("scalefont: wrong arguments");
+ }
+ java.awt.Font fn=( (java.awt.Font) data[0]).deriveFont( ( (Number)
+ data[1]).
+ floatValue());
+ System.out.println("Fonthoehe:"+fn.getSize2D());
+ context.operands.push(fn );
+ }
+ });
+
+ // setfont
+ systemDict.put("setfont", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ Object data[];
+ data = context.popOperands(1);
+ if (! (data[0] instanceof java.awt.Font)) {
+ throw new PainterException("setfont: wrong arguments");
+ }
+ java.awt.Font fn=(java.awt.Font)data[0];
+ System.out.println("Fonthoehe:"+fn.getSize2D());
+ /**
+ * @todo two times the same?
+ */
+ context.pencil.graphics.setFont( fn);
+ context.pencil.state.font=fn;
+ }
+ });
+
+ // def
+ systemDict.put("def", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ Object data[];
+ PAToken patoken;
+ data = context.popOperands(2);
+ if (! (data[0] instanceof PAToken)) {
+ throw new PainterException("def: wrong arguments");
+ }
+ patoken = (PAToken) data[0];
+ if (! (patoken.type == PAToken.KEY)) {
+ throw new PainterException("def: wrong arguments");
+ }
+ try {
+ ( (HashMap) context.dictionaries.peek()).put(patoken.value, data[1]);
+ }
+ catch (EmptyStackException e) {
+ throw new PainterException(e.toString());
+ }
+ }
+ });
+
+ // bind
+ systemDict.put("bind", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ Object data[];
+ PAToken patoken;
+ data = context.popOperands(1);
+ if (! (data[0] instanceof PAToken)) {
+ throw new PainterException("bind: wrong arguments, not PAToken");
+ }
+ patoken = (PAToken) data[0];
+ if (! (patoken.type == PAToken.PROCEDURE)) {
+ throw new PainterException("bind: wrong arguments, not Procedure " +
+ patoken.value);
+ }
+ context.engine.bindProcedure(patoken);
+ context.operands.push(patoken);
+ }
+ });
+
+ // mul
+ systemDict.put("mul", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ double data[];
+
+ data = context.popNumberOperands(2);
+ context.operands.push(new Double(data[0] * data[1]));
+ }
+ });
+
+ // div
+ systemDict.put("div", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ double data[];
+
+ data = context.popNumberOperands(2);
+ context.operands.push(new Double(data[0] / data[1]));
+ }
+ });
+
+ // mod
+ systemDict.put("mod", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ double data[];
+
+ data = context.popNumberOperands(2);
+ int a, b, m;
+ a = (int) data[0];
+ b = (int) data[1];
+ m = a % b;
+ context.operands.push(new Integer(m));
+ }
+ });
+
+ // add
+ systemDict.put("add", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ double data[];
+
+ data = context.popNumberOperands(2);
+ context.operands.push(new Double(data[0] + data[1]));
+ }
+ });
+
+ // neg
+ systemDict.put("neg", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ double data[];
+ data = context.popNumberOperands(1);
+ context.operands.push(new Double( -data[0]));
+ }
+ });
+ // ceiling
+ systemDict.put("ceiling", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ double data[];
+ data = context.popNumberOperands(1);
+ context.operands.push(new Double(Math.ceil(data[0])));
+ }
+ });
+ // sub
+ systemDict.put("sub", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ double data[];
+ data = context.popNumberOperands(2);
+ context.operands.push(new Double(data[0] - data[1]));
+ }
+ });
+
+ // atan
+ systemDict.put("atan", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ double data[];
+
+ data = context.popNumberOperands(2);
+ context.operands.push(new Double(Math.atan2(data[0], data[1])));
+ }
+ });
+
+ // sin
+ systemDict.put("sin", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ double data[];
+
+ data = context.popNumberOperands(1);
+ context.operands.push(new Double(Math.sin(data[0] * Math.PI / 180.0)));
+ }
+ });
+
+ // cos
+ systemDict.put("cos", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ double data[];
+
+ data = context.popNumberOperands(1);
+ context.operands.push(new Double(Math.cos(data[0] * Math.PI / 180.0)));
+ }
+ });
+
+ // sqrt
+ systemDict.put("sqrt", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ double data[];
+ data = context.popNumberOperands(1);
+ context.operands.push(new Double(Math.sqrt(data[0])));
+ }
+ });
+ // ln
+ systemDict.put("log", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ double data[];
+ data = context.popNumberOperands(1);
+ context.operands.push(new Double(Math.log(data[0])));
+ }
+ });
+ // exp
+ systemDict.put("exp", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ double data[];
+ data = context.popNumberOperands(2);
+ context.operands.push(new Double(Math.pow(data[0], data[1])));
+ }
+ });
+
+ // exch
+ systemDict.put("exch", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ Object data[];
+
+ data = context.popOperands(2);
+ context.operands.push(data[1]);
+ context.operands.push(data[0]);
+ }
+ });
+
+ // dup
+ systemDict.put("dup", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ Object data[];
+
+ data = context.popOperands(1);
+ context.operands.push(data[0]);
+ context.operands.push(data[0]);
+ }
+ });
+
+ // roll
+ systemDict.put("roll", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ Object data[];
+ Object rollData[];
+
+ data = context.popOperands(2);
+ if (! (data[0] instanceof Number)) {
+ throw new PainterException("roll: wrong arguments");
+ }
+ if (! (data[1] instanceof Number)) {
+ throw new PainterException("roll: wrong arguments");
+ }
+ int numberOfElements, numberOfPositions, i;
+
+ numberOfElements = ( (Number) data[0]).intValue();
+ numberOfPositions = ( (Number) data[1]).intValue();
+
+ if (numberOfPositions == 0 || numberOfElements <= 0) {
+ return;
+ }
+
+ rollData = context.popOperands(numberOfElements);
+
+ if (numberOfPositions < 0) {
+ numberOfPositions = -numberOfPositions;
+ numberOfPositions = numberOfPositions % numberOfElements;
+
+ // downward roll
+ for (i = numberOfPositions; i < numberOfElements; i++) {
+ context.operands.push(rollData[i]);
+ }
+ for (i = 0; i < numberOfPositions; i++) {
+ context.operands.push(rollData[i]);
+ }
+ }
+ else {
+ numberOfPositions = numberOfPositions % numberOfElements;
+
+ // upward roll
+ for (i = numberOfElements - numberOfPositions; i < numberOfElements;
+ i++) {
+ context.operands.push(rollData[i]);
+ }
+ for (i = 0; i < numberOfElements - numberOfPositions; i++) {
+ context.operands.push(rollData[i]);
+ }
+ }
+ }
+ });
+
+ // pop
+ systemDict.put("pop", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ context.popOperands(1);
+ }
+ });
+
+ // index
+ systemDict.put("index", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ Object data[];
+ data = context.popOperands(1);
+ if (! (data[0] instanceof Number)) {
+ throw new PainterException("index: wrong arguments");
+ }
+ int index = ( (Number) data[0]).intValue();
+ try {
+ context.operands.push(context.operands.elementAt(index));
+ }
+ catch (ArrayIndexOutOfBoundsException e) {
+ throw new PainterException(e.toString());
+ }
+ }
+ });
+
+ // mark
+ systemDict.put("mark", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ context.operands.push(new PAToken(null, PAToken.MARK));
+ }
+ });
+
+ // cvx
+ systemDict.put("cvx", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ Object data;
+ data = context.operands.pop();
+ ArrayList ar = (ArrayList) data;
+ Stack stack = new Stack();
+ for (int i = ar.size() - 1; i >= 0; i--) {
+ stack.add(ar.get(i));
+ }
+ PAToken patoken = new PAToken(stack, PAToken.PROCEDURE);
+// patoken.type=PAToken.PROCEDURE;
+ context.operands.push(patoken);
+ }
+ });
+ // cleartomark
+ systemDict.put("cleartomark", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ Object data;
+ boolean finished = false;
+
+ while (!finished) {
+ try {
+ data = context.operands.pop();
+ if (data instanceof PAToken) {
+ if ( ( (PAToken) data).type == PAToken.MARK) {
+ finished = true;
+ }
+ }
+ }
+ catch (EmptyStackException e) {
+ throw new PainterException(e.toString());
+ }
+ }
+ }
+ });
+
+ // copy
+ systemDict.put("copy", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ Object data[];
+ data = context.popOperands(2);
+
+ // decide if it's a simple copy or a composite object copy
+ if ( (data[0] instanceof PAToken) && (data[1] instanceof PAToken)) {
+ // composite object copy
+ if ( ( (PAToken) data[0]).type == ( (PAToken) data[1]).type) {
+ // our tokens are immutable so a copy is easy
+ context.operands.push(data[0]);
+ context.operands.push(data[0]);
+ }
+ else {
+ throw new PainterException(
+ "copy operation failed because composite objects on stack are not of same type");
+ }
+ }
+ else {
+ // restore first arg, we're not interested in it in this simple case
+ context.operands.push(data[0]);
+
+ if (data[1] instanceof Number) {
+ int index = ( (Number) data[1]).intValue();
+ int i, n;
+ n = context.operands.size();
+ Object[] copyData = new Object[index];
+ for (i = n - index; i < n; i++) {
+ try {
+ copyData[i - n + index] = context.operands.elementAt(i);
+ }
+ catch (ArrayIndexOutOfBoundsException e) {
+ throw new PainterException(e.toString());
+ }
+ }
+ for (i = 0; i < index; i++) {
+ context.operands.push(copyData[i]);
+ }
+ }
+ else {
+ throw new PainterException("I expect a number on stack, dude");
+ }
+ }
+ }
+ });
+
+ // setgray
+ systemDict.put("setgray", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ double data[];
+
+ data = context.popNumberOperands(1);
+ context.pencil.graphics.setPaint(new Color( (float) data[0],
+ (float) data[0], (float) data[0]));
+ }
+ });
+
+ // setrgbcolor
+ systemDict.put("setrgbcolor", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ double data[];
+
+ data = context.popNumberOperands(3);
+ float[] fv = new float[3];
+ fv[0] = (float) Math.max(Math.min(data[0], 1.0d), 0.0d);
+ fv[1] = (float) Math.max(Math.min(data[1], 1.0d), 0.0d);
+ fv[2] = (float) Math.max(Math.min(data[2], 1.0d), 0.0d);
+ context.pencil.graphics.setPaint(new Color(fv[0], fv[1], fv[2]));
+ }
+ });
+
+ // currentrgbcolor
+systemDict.put("currentrgbcolor", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ Color cl=context.pencil.graphics.getColor();
+ float[] fv = cl.getRGBComponents(null);
+ context.operands.push(new Float(fv[0]));
+ context.operands.push(new Float(fv[1]));
+ context.operands.push(new Float(fv[2]));
+ }
+});
+
+
+ // PENDING(uweh): color stuff still shaky
+ // sethsbcolor
+ systemDict.put("sethsbcolor", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ double data[];
+ data = context.popNumberOperands(3);
+ float[] fv = new float[3];
+ fv[0] = (float) Math.max(Math.min(data[0], 1.0d), 0.0d);
+ fv[1] = (float) Math.max(Math.min(data[1], 1.0d), 0.0d);
+ fv[2] = (float) Math.max(Math.min(data[2], 1.0d), 0.0d);
+ context.pencil.graphics.setPaint(new Color(fv[0], fv[1], fv[2]));
+ }
+ });
+
+ // PENDING(uweh): I have to convert these puppies myself to rgb ?
+ // setcmykcolor
+ systemDict.put("setcmykcolor", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ double data[];
+ int rd, gr, bl;
+
+ data = context.popNumberOperands(4);
+ float[] fv = new float[4];
+ fv[0] = (float) data[0];
+ fv[1] = (float) data[1];
+ fv[2] = (float) data[2];
+ fv[3] = (float) data[3];
+ rd = (int) (255 * Math.max(0, 1 - fv[0] - fv[3]));
+ gr = (int) (255 * Math.max(0, 1 - fv[1] - fv[3]));
+ bl = (int) (255 * Math.max(0, 1 - fv[2] - fv[3]));
+ context.pencil.graphics.setPaint(new Color(rd, gr, bl));
+ }
+ });
+
+ // setlinewidth
+ systemDict.put("setlinewidth", new PACommand() {
+ private double minLineWidth(double w, AffineTransform at) {
+ double matrix[] = new double[4];
+ at.getMatrix(matrix);
+ double scale = matrix[0] * matrix[3] - matrix[1] * matrix[2];
+ double minlw = .25 / Math.sqrt(Math.abs(scale));
+ if (w < minlw) {
+ w = minlw;
+ }
+ return w;
+ }
+
+ public void execute(PAContext context) throws PainterException {
+ double data[];
+ BasicStroke newStroke;
+ Stroke oldStroke = context.pencil.graphics.getStroke();
+ data = context.popNumberOperands(1);
+ data[0] = this.minLineWidth(data[0],
+ context.pencil.graphics.getTransform());
+ if (oldStroke instanceof BasicStroke) {
+ newStroke = new BasicStroke( (float) data[0],
+ ( (BasicStroke) oldStroke).getEndCap(),
+ ( (BasicStroke) oldStroke).getLineJoin(),
+ ( (BasicStroke) oldStroke).getMiterLimit(),
+ ( (BasicStroke) oldStroke).getDashArray(),
+ ( (BasicStroke) oldStroke).getDashPhase());
+ }
+ else {
+ newStroke = new BasicStroke( (float) data[0], BasicStroke.CAP_ROUND,
+ BasicStroke.JOIN_ROUND);
+ }
+ /**
+ * @todo two times the same?
+ */
+ context.pencil.graphics.setStroke(newStroke);
+// context.pencil.state.stroke=newStroke;
+ }
+ });
+
+ // setlinecap
+ systemDict.put("setlinecap", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ double data[];
+ BasicStroke newStroke;
+ Stroke oldStroke = context.pencil.graphics.getStroke();
+ data = context.popNumberOperands(1);
+ if (oldStroke instanceof BasicStroke) {
+ newStroke = new BasicStroke( ( (BasicStroke) oldStroke).getLineWidth(),
+ (int) data[0],
+ ( (BasicStroke) oldStroke).getLineJoin(),
+ ( (BasicStroke) oldStroke).getMiterLimit(),
+ ( (BasicStroke) oldStroke).getDashArray(),
+ ( (BasicStroke) oldStroke).getDashPhase());
+ }
+ else {
+ newStroke = new BasicStroke(1.0f, (int) data[0],
+ BasicStroke.JOIN_ROUND);
+ }
+ context.pencil.graphics.setStroke(newStroke);
+ }
+ });
+
+ // setmiterlimit
+ systemDict.put("setmiterlimit", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ double data[];
+ BasicStroke newStroke;
+ Stroke oldStroke = context.pencil.graphics.getStroke();
+ data = context.popNumberOperands(1);
+ if (oldStroke instanceof BasicStroke) {
+ newStroke = new BasicStroke( ( (BasicStroke) oldStroke).getLineWidth(),
+ ( (BasicStroke) oldStroke).getEndCap(),
+ ( (BasicStroke) oldStroke).getLineJoin(),
+ (float) data[0],
+ ( (BasicStroke) oldStroke).getDashArray(),
+ ( (BasicStroke) oldStroke).getDashPhase());
+ }
+ else {
+ newStroke = new BasicStroke(1.0f, BasicStroke.CAP_ROUND,
+ BasicStroke.JOIN_ROUND, (float) data[0]);
+ }
+ context.pencil.graphics.setStroke(newStroke);
+ }
+ });
+
+ // setdash
+ systemDict.put("setdash", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ Object data[];
+ BasicStroke newStroke;
+ Stroke oldStroke = context.pencil.graphics.getStroke();
+ data = context.popOperands(2);
+ if (! (data[0] instanceof ArrayList)) {
+ throw new PainterException("setdash: wrong arguments");
+ }
+ if (! (data[1] instanceof Number)) {
+ throw new PainterException("setdash: wrong arguments");
+ }
+
+ ArrayList list = (ArrayList) data[0];
+
+ if (list.size() == 0) {
+ return;
+ }
+ float[] dashpattern = new float[list.size()];
+ for (int i = 0; i < dashpattern.length; i++) {
+ dashpattern[i] = ( (Number) list.get(i)).floatValue();
+ }
+ float dashoffset = ( (Number) data[1]).floatValue();
+ if (oldStroke instanceof BasicStroke) {
+ newStroke = new BasicStroke( ( (BasicStroke) oldStroke).getLineWidth(),
+ ( (BasicStroke) oldStroke).getEndCap(),
+ ( (BasicStroke) oldStroke).getLineJoin(),
+ ( (BasicStroke) oldStroke).getMiterLimit(),
+ dashpattern,
+ dashoffset);
+ }
+ else {
+ newStroke = new BasicStroke(1.0f, BasicStroke.CAP_ROUND,
+ BasicStroke.JOIN_ROUND, 1.0f, dashpattern,
+ dashoffset);
+ }
+ context.pencil.graphics.setStroke(newStroke);
+ }
+ });
+
+ // setlinejoin
+ systemDict.put("setlinejoin", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ double data[];
+ BasicStroke newStroke;
+ Stroke oldStroke = context.pencil.graphics.getStroke();
+ data = context.popNumberOperands(1);
+ if (oldStroke instanceof BasicStroke) {
+ newStroke = new BasicStroke( ( (BasicStroke) oldStroke).getLineWidth(),
+ ( (BasicStroke) oldStroke).getEndCap(),
+ (int) data[0],
+ ( (BasicStroke) oldStroke).getMiterLimit(),
+ ( (BasicStroke) oldStroke).getDashArray(),
+ ( (BasicStroke) oldStroke).getDashPhase());
+ }
+ else {
+ newStroke = new BasicStroke(1.0f, BasicStroke.CAP_ROUND, (int) data[0]);
+ }
+ context.pencil.graphics.setStroke(newStroke);
+ }
+ });
+
+ // dumpstack
+ systemDict.put("dumpstack", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ Enumeration enumx = context.operands.elements();
+ System.out.println("-------------Stack--------------");
+ while (enumx.hasMoreElements()) {
+ System.out.println(enumx.nextElement());
+ }
+ System.out.println("--------------------------------");
+ }
+ });
+
+ // for
+ systemDict.put("for", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ Object data[];
+ PAToken patoken;
+
+ data = context.popOperands(4);
+ if (! (data[3] instanceof PAToken)) {
+ throw new PainterException("for: wrong arguments");
+ }
+ if (! (data[0] instanceof Number)) {
+ throw new PainterException("for: wrong arguments");
+ }
+ if (! (data[1] instanceof Number)) {
+ throw new PainterException("for: wrong arguments");
+ }
+ if (! (data[2] instanceof Number)) {
+ throw new PainterException("for: wrong arguments");
+ }
+ patoken = (PAToken) data[3];
+ if (! (patoken.type == PAToken.PROCEDURE)) {
+ throw new PainterException("for: wrong arguments");
+ }
+ int i0, i1, i2;
+ i0 = ( (Number) data[0]).intValue();
+ i1 = ( (Number) data[1]).intValue();
+ i2 = ( (Number) data[2]).intValue();
+
+ if (i1 > 0) {
+ for (int i = i0; i <= i2; i += i1) {
+ context.operands.push(new Integer(i));
+ context.engine.process(patoken);
+ }
+ }
+ else {
+ for (int i = i0; i >= i2; i -= i1) {
+ context.operands.push(new Integer(i));
+ context.engine.process(patoken);
+ }
+ }
+ }
+ });
+
+ // repeat
+ systemDict.put("repeat", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ Object data[];
+ PAToken patoken;
+ data = context.popOperands(2);
+ if (! (data[1] instanceof PAToken)) {
+ throw new PainterException("repeat: wrong arguments");
+ }
+ if (! (data[0] instanceof Number)) {
+ throw new PainterException("repeat: wrong arguments");
+ }
+ patoken = (PAToken) data[1];
+ if (! (patoken.type == PAToken.PROCEDURE)) {
+ throw new PainterException("repeat: wrong arguments");
+ }
+ int n = ( (Number) data[0]).intValue();
+ for (int i = 0; i < n; i++) {
+ context.engine.process(patoken);
+ }
+ }
+ });
+
+ // true
+ systemDict.put("true", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ context.operands.push(new Boolean(true));
+ }
+ });
+
+ // false
+ systemDict.put("false", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ context.operands.push(new Boolean(false));
+ }
+ });
+
+ // lt
+ systemDict.put("lt", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ Object data[];
+
+ data = context.popOperands(2);
+ if (! (data[0] instanceof Number) && ! (data[0] instanceof String)) {
+ throw new PainterException("lt: wrong arguments");
+ }
+ if (data[0] instanceof Number) {
+ if (! (data[1] instanceof Number)) {
+ throw new PainterException("lt: wrong arguments");
+ }
+ double d0, d1;
+ d0 = ( (Number) data[0]).doubleValue();
+ d1 = ( (Number) data[1]).doubleValue();
+ if (d0 < d1) {
+ context.operands.push(new Boolean(true));
+ }
+ else {
+ context.operands.push(new Boolean(false));
+ }
+ }
+ else {
+ if (! (data[1] instanceof String)) {
+ throw new PainterException("lt: wrong arguments");
+ }
+ String s0, s1;
+ s0 = (String) data[0];
+ s1 = (String) data[1];
+ if (s0.compareTo(s1) < 0) {
+ context.operands.push(new Boolean(true));
+ }
+ else {
+ context.operands.push(new Boolean(false));
+ }
+ }
+ }
+ });
+
+ // gt
+ systemDict.put("gt", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ Object data[];
+
+ data = context.popOperands(2);
+ if (! (data[0] instanceof Number) && ! (data[0] instanceof String)) {
+ throw new PainterException("gt: wrong arguments");
+ }
+ if (data[0] instanceof Number) {
+ if (! (data[1] instanceof Number)) {
+ throw new PainterException("gt: wrong arguments");
+ }
+ double d0, d1;
+ d0 = ( (Number) data[0]).doubleValue();
+ d1 = ( (Number) data[1]).doubleValue();
+ if (d0 > d1) {
+ context.operands.push(new Boolean(true));
+ }
+ else {
+ context.operands.push(new Boolean(false));
+ }
+ }
+ else {
+ if (! (data[1] instanceof String)) {
+ throw new PainterException("gt: wrong arguments");
+ }
+ String s0, s1;
+ s0 = (String) data[0];
+ s1 = (String) data[1];
+ if (s0.compareTo(s1) > 0) {
+ context.operands.push(new Boolean(true));
+ }
+ else {
+ context.operands.push(new Boolean(false));
+ }
+ }
+ }
+ });
+ // ge
+ systemDict.put("ge", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ Object data[];
+
+ data = context.popOperands(2);
+ if (! (data[0] instanceof Number) && ! (data[0] instanceof String)) {
+ throw new PainterException("ge: wrong arguments");
+ }
+ if (data[0] instanceof Number) {
+ if (! (data[1] instanceof Number)) {
+ throw new PainterException("ge: wrong arguments");
+ }
+ double d0, d1;
+ d0 = ( (Number) data[0]).doubleValue();
+ d1 = ( (Number) data[1]).doubleValue();
+ if (d0 >= d1) {
+ context.operands.push(new Boolean(true));
+ }
+ else {
+ context.operands.push(new Boolean(false));
+ }
+ }
+ else {
+ if (! (data[1] instanceof String)) {
+ throw new PainterException("ge: wrong arguments");
+ }
+ String s0, s1;
+ s0 = (String) data[0];
+ s1 = (String) data[1];
+ if (s0.compareTo(s1) >= 0) {
+ context.operands.push(new Boolean(true));
+ }
+ else {
+ context.operands.push(new Boolean(false));
+ }
+ }
+ }
+ });
+ // ne
+ systemDict.put("ne", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ Object data[];
+
+ data = context.popOperands(2);
+ if (! (data[0] instanceof Number) && ! (data[0] instanceof String)) {
+ throw new PainterException("ne: wrong arguments");
+ }
+ if (data[0] instanceof Number) {
+ if (! (data[1] instanceof Number)) {
+ throw new PainterException("ne: wrong arguments");
+ }
+ double d0, d1;
+ d0 = ( (Number) data[0]).doubleValue();
+ d1 = ( (Number) data[1]).doubleValue();
+ if (d0 != d1) {
+ context.operands.push(new Boolean(true));
+ }
+ else {
+ context.operands.push(new Boolean(false));
+ }
+ }
+ else {
+ if (! (data[1] instanceof String)) {
+ throw new PainterException("ne: wrong arguments");
+ }
+ String s0, s1;
+ s0 = (String) data[0];
+ s1 = (String) data[1];
+ if (s0.equals(s1)) {
+ context.operands.push(new Boolean(false));
+ }
+ else {
+ context.operands.push(new Boolean(true));
+ }
+ }
+ }
+ });
+
+ // eq
+ systemDict.put("eq", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ Object data[];
+
+ data = context.popOperands(2);
+ if (! (data[0] instanceof Number) && ! (data[0] instanceof String)) {
+ throw new PainterException("eq: wrong arguments");
+ }
+ if (data[0] instanceof Number) {
+ if (! (data[1] instanceof Number)) {
+ throw new PainterException("eq: wrong arguments");
+ }
+ double d0, d1;
+ d0 = ( (Number) data[0]).doubleValue();
+ d1 = ( (Number) data[1]).doubleValue();
+ if (d0 == d1) {
+ context.operands.push(new Boolean(true));
+ }
+ else {
+ context.operands.push(new Boolean(false));
+ }
+ }
+ else {
+ if (! (data[1] instanceof String)) {
+ throw new PainterException("eq: wrong arguments");
+ }
+ String s0, s1;
+ s0 = (String) data[0];
+ s1 = (String) data[1];
+ if (s0.compareTo(s1) == 0) {
+ context.operands.push(new Boolean(true));
+ }
+ else {
+ context.operands.push(new Boolean(false));
+ }
+ }
+ }
+ });
+
+ // if
+ systemDict.put("if", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ Object data[];
+ PAToken patoken;
+ data = context.popOperands(2);
+ if (! (data[0] instanceof Boolean)) {
+ throw new PainterException("if: wrong arguments");
+ }
+ if (! (data[1] instanceof PAToken)) {
+ throw new PainterException("if: wrong arguments");
+ }
+ patoken = (PAToken) data[1];
+ if (! (patoken.type == PAToken.PROCEDURE)) {
+ throw new PainterException("if: wrong arguments");
+ }
+ if ( ( (Boolean) data[0]).booleanValue()) {
+ context.engine.process(patoken);
+ }
+ }
+ });
+
+ // ifelse
+ systemDict.put("ifelse", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ Object data[];
+ PAToken patoken1, patoken2;
+ data = context.popOperands(3);
+ if (! (data[0] instanceof Boolean)) {
+ throw new PainterException("ifelse: wrong arguments");
+ }
+ if (! (data[1] instanceof PAToken)) {
+ throw new PainterException("ifelse: wrong arguments");
+ }
+ if (! (data[2] instanceof PAToken)) {
+ throw new PainterException("ifelse: wrong arguments");
+ }
+ patoken1 = (PAToken) data[1];
+ patoken2 = (PAToken) data[2];
+ if (! (patoken1.type == PAToken.PROCEDURE)) {
+ throw new PainterException("ifelse: wrong arguments");
+ }
+ if (! (patoken2.type == PAToken.PROCEDURE)) {
+ throw new PainterException("ifelse: wrong arguments");
+ }
+ if ( ( (Boolean) data[0]).booleanValue()) {
+ context.engine.process(patoken1);
+ }
+ else {
+ context.engine.process(patoken2);
+ }
+ }
+ });
+
+ // dict
+ systemDict.put("dict", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ double data[];
+ data = context.popNumberOperands(1);
+ context.operands.push(new HashMap( (int) data[0]));
+ }
+ });
+
+ // put
+ systemDict.put("put", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ Object data[];
+ PAToken patoken;
+ data = context.popOperands(3);
+ if ( (data[0] instanceof HashMap) && (data[1] instanceof PAToken)) {
+ patoken = (PAToken) data[1];
+ if (! (patoken.type == PAToken.KEY)) {
+ throw new PainterException("put: wrong arguments");
+ }
+ ( (HashMap) data[0]).put(patoken.value, data[2]);
+ }
+ else
+ if ( (data[0] instanceof ArrayList) && (data[1] instanceof Number)) {
+ ArrayList ar = (ArrayList) data[0];
+ Number nr = (Number) data[1];
+ ar.set(nr.intValue(), data[2]);
+ }
+ else
+ if ( (data[0] instanceof StringBuffer) && (data[1] instanceof Number) &&
+ (data[2] instanceof Number)) {
+ StringBuffer text = (StringBuffer) data[0];
+ Number nr = (Number) data[1];
+ Number ch = (Number) data[2];
+ text.setCharAt(nr.intValue(), (char) (ch.intValue()));
+ }
+ else {
+ throw new PainterException("put: wrong arguments");
+ }
+ }
+ });
+
+ // get
+ systemDict.put("get", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ Object data[];
+ PAToken patoken;
+ data = context.popOperands(2);
+ if (! (data[0] instanceof HashMap) && ! (data[0] instanceof ArrayList)) {
+ throw new PainterException("get: wrong arguments");
+ }
+ if (data[0] instanceof HashMap) {
+ if (! (data[1] instanceof PAToken)) {
+ throw new PainterException("get: wrong arguments");
+ }
+ patoken = (PAToken) data[1];
+ if (! (patoken.type == PAToken.KEY)) {
+ throw new PainterException("get: wrong arguments");
+ }
+ context.operands.push( ( (HashMap) data[0]).get(patoken.value));
+ }
+ else if (data[0] instanceof ArrayList) {
+ if (! (data[1] instanceof Number)) {
+ throw new PainterException("get: wrong arguments");
+ }
+ context.operands.push( ( (ArrayList) data[0]).get( ( (Number) data[1]).
+ intValue()));
+ }
+ }
+ });
+ // getinterval
+ systemDict.put("getinterval", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ Object data[];
+ PAToken patoken;
+ data = context.popOperands(3);
+ if (! (data[0] instanceof HashMap) && ! (data[0] instanceof ArrayList)) {
+ throw new PainterException("getinterval: wrong arguments");
+ }
+ if (data[0] instanceof HashMap) {
+ if (! (data[1] instanceof PAToken)) {
+ throw new PainterException("getinterval: wrong arguments");
+ }
+ patoken = (PAToken) data[1];
+ if (! (patoken.type == PAToken.KEY)) {
+ throw new PainterException("getinterval: wrong arguments");
+ }
+ if (! (data[2] instanceof Number)) {
+ throw new PainterException("getinterval: wrong arguments");
+ }
+ HashMap target = new HashMap();
+ context.operands.push( ( (HashMap) data[0]).get(patoken.value));
+ }
+ else if (data[0] instanceof ArrayList) {
+ if (! (data[1] instanceof Number)) {
+ throw new PainterException("getinterval: wrong arguments");
+ }
+ if (! (data[2] instanceof Number)) {
+ throw new PainterException("getinterval: wrong arguments");
+ }
+ ArrayList source = ( (ArrayList) data[0]);
+ int from = ( (Number) data[1]).intValue();
+ int to = from + ( (Number) data[2]).intValue();
+ ArrayList target = new ArrayList(source.subList(from, to));
+ context.operands.push(target);
+ }
+ }
+ });
+ // load
+ systemDict.put("load", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ Object data[];
+ PAToken patoken;
+ data = context.popOperands(1);
+ if (! (data[0] instanceof PAToken)) {
+ throw new PainterException("load: wrong arguments");
+ }
+ patoken = (PAToken) data[0];
+ if (! (patoken.type == PAToken.KEY)) {
+ throw new PainterException("load: wrong arguments");
+ }
+ context.operands.push(context.findIdentifier(patoken.value));
+ }
+ });
+
+ // length
+ systemDict.put("length", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ Object data[];
+ PAToken patoken;
+ int size = 0;
+ data = context.popOperands(1);
+ if (data[0] instanceof PAToken) {
+ patoken = (PAToken) data[0];
+ if (! (patoken.type == PAToken.KEY)) {
+ throw new PainterException("length: wrong arguments");
+ }
+ size = ( (String) patoken.value).length();
+ }
+ else if (data[0] instanceof HashMap) {
+ size = ( (HashMap) data[0]).size();
+ }
+ else if (data[0] instanceof ArrayList) {
+ size = ( (ArrayList) data[0]).size();
+ }
+ else if (data[0] instanceof String) {
+ size = ( (String) data[0]).length();
+ }
+ else {
+ throw new PainterException("length: wrong arguments");
+ }
+
+ context.operands.push(new Integer(size));
+ }
+ });
+
+ // begin
+ systemDict.put("begin", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ Object data[];
+ data = context.popOperands(1);
+ if (! (data[0] instanceof HashMap)) {
+ throw new PainterException("begin: wrong arguments");
+ }
+ context.dictionaries.push(data[0]);
+ }
+ });
+
+ // end
+ systemDict.put("end", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ try {
+ context.dictionaries.pop();
+ }
+ catch (EmptyStackException e) {
+ throw new PainterException("Dictionary stack is empty");
+ }
+ }
+ });
+
+ // undef
+ systemDict.put("undef", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ Object data[];
+ PAToken patoken;
+ data = context.popOperands(2);
+ if (! (data[0] instanceof HashMap)) {
+ throw new PainterException("undef: wrong arguments");
+ }
+ if (! (data[1] instanceof PAToken)) {
+ throw new PainterException("undef: wrong arguments");
+ }
+ patoken = (PAToken) data[1];
+ if (! (patoken.type == PAToken.KEY)) {
+ throw new PainterException("undef: wrong arguments");
+ }
+ // we don't do an actual undef because we don't care
+ }
+ });
+
+ // known
+ systemDict.put("known", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ Object data[], foundObject;
+ PAToken patoken;
+ data = context.popOperands(1);
+ if (! (data[0] instanceof PAToken)) {
+ throw new PainterException("known: wrong arguments");
+ }
+ patoken = (PAToken) data[0];
+ if (! (patoken.type == PAToken.KEY)) {
+ throw new PainterException("known: wrong arguments");
+ }
+ foundObject = context.findIdentifier(patoken.value);
+ if (foundObject != null) {
+ context.operands.push(new Boolean(true));
+ }
+ else {
+ context.operands.push(new Boolean(false));
+ }
+ }
+ });
+
+ // where
+ systemDict.put("where", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ Object data[], foundObject;
+ PAToken patoken;
+ data = context.popOperands(1);
+ if (! (data[0] instanceof PAToken)) {
+ throw new PainterException("where: wrong arguments");
+ }
+ patoken = (PAToken) data[0];
+ if (! (patoken.type == PAToken.KEY)) {
+ throw new PainterException("where: wrong arguments");
+ }
+ foundObject = context.findDictionary(patoken.value);
+ if (foundObject != null) {
+ context.operands.push(foundObject);
+ context.operands.push(new Boolean(true));
+ }
+ else {
+ context.operands.push(new Boolean(false));
+ }
+ }
+ });
+
+ // aload
+ systemDict.put("aload", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ Object[] data;
+ java.util.AbstractList list;
+ data = context.popOperands(1);
+ if (data[0] instanceof PAToken) {
+ data[0] = ( (PAToken) data[0]).value;
+ }
+ if (! (data[0] instanceof java.util.AbstractList)) {
+ throw new PainterException("aload: wrong arguments");
+ }
+
+ list = (java.util.AbstractList) data[0];
+ Iterator iterator = list.iterator();
+ while (iterator.hasNext()) {
+ context.operands.push(iterator.next());
+ }
+ context.operands.push(data[0]);
+ }
+ });
+
+ // forall
+ systemDict.put("forall", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ Object data[];
+ ArrayList list;
+ PAToken patoken;
+
+ data = context.popOperands(2);
+ if (! (data[0] instanceof ArrayList)) {
+ throw new PainterException("forall: wrong arguments");
+ }
+ if (! (data[1] instanceof PAToken)) {
+ throw new PainterException("forall: wrong arguments");
+ }
+
+ patoken = (PAToken) data[1];
+ if (! (patoken.type == PAToken.PROCEDURE)) {
+ throw new PainterException("forall: wrong arguments");
+ }
+
+ list = (ArrayList) data[0];
+ Iterator iterator = list.iterator();
+ while (iterator.hasNext()) {
+ context.operands.push(iterator.next());
+ context.engine.process(patoken);
+ }
+
+ }
+ });
+
+ // currentflat PENDING(uweh):placeholder for now
+ systemDict.put("currentflat", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ PdfGraphics2D pdfg2d = (PdfGraphics2D) context.pencil.graphics;
+ PdfContentByte cb = pdfg2d.getContent();
+ context.operands.push(new Double(1.0f));
+ }
+ });
+
+ // setflat PENDING(uweh):placeholder for now
+ systemDict.put("setflat", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ double[] data;
+ data = context.popNumberOperands(1);
+ PdfGraphics2D pdfg2d = (PdfGraphics2D) context.pencil.graphics;
+ PdfContentByte cb = pdfg2d.getContent();
+ cb.setFlatness( ( (float) data[0]));
+ }
+ });
+
+ // round
+ systemDict.put("round", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ double data[];
+ data = context.popNumberOperands(1);
+ context.operands.push(new Long(Math.round(data[0])));
+ }
+ });
+
+ // abs
+ systemDict.put("abs", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ double data[];
+ data = context.popNumberOperands(1);
+ context.operands.push(new Double(Math.abs(data[0])));
+ }
+ });
+
+ // transform
+ systemDict.put("transform", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ if (context.peekOperand() instanceof Number) {
+ double data[];
+ double[] transformedData = new double[2];
+ data = context.popNumberOperands(2);
+ AffineTransform at = context.pencil.graphics.getTransform();
+ at.transform(data, 0, transformedData, 0, 1);
+ context.operands.push(new Double(transformedData[0]));
+ context.operands.push(new Double(transformedData[1]));
+ }
+ else {
+ Object data[];
+
+ data = context.popOperands(3);
+ if (! (data[0] instanceof Number)) {
+ throw new PainterException("transform: wrong arguments");
+ }
+ if (! (data[1] instanceof Number)) {
+ throw new PainterException("transform: wrong arguments");
+ }
+ if (! (data[2] instanceof ArrayList)) {
+ throw new PainterException("transform: wrong arguments");
+ }
+
+ ArrayList array = (ArrayList) data[2];
+
+ double[] entries = new double[6];
+
+ if (! (array.size() == 6)) {
+ throw new PainterException("transform: wrong arguments");
+ }
+
+ for (int i = 0; i < 6; i++) {
+ entries[i] = ( (Number) array.get(i)).doubleValue();
+ }
+
+ AffineTransform at = new AffineTransform(entries);
+
+ double numberdata[] = new double[2];
+ numberdata[0] = ( (Number) data[0]).doubleValue();
+ numberdata[1] = ( (Number) data[1]).doubleValue();
+
+ double[] transformedData = new double[2];
+
+ at.transform(numberdata, 0, transformedData, 0, 1);
+ context.operands.push(new Double(transformedData[0]));
+ context.operands.push(new Double(transformedData[1]));
+ }
+ }
+ });
+
+ // itransform
+ systemDict.put("itransform", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ if (context.peekOperand() instanceof Number) {
+ double data[];
+ double[] transformedData = new double[2];
+ data = context.popNumberOperands(2);
+ AffineTransform at = context.pencil.graphics.getTransform();
+ try {
+ at.inverseTransform(data, 0, transformedData, 0, 1);
+ }
+ catch (NoninvertibleTransformException e) {
+ throw new PainterException(e.toString());
+ }
+ context.operands.push(new Double(transformedData[0]));
+ context.operands.push(new Double(transformedData[1]));
+ }
+ else {
+ Object data[];
+
+ data = context.popOperands(3);
+ if (! (data[0] instanceof Number)) {
+ throw new PainterException("itransform: wrong arguments");
+ }
+ if (! (data[1] instanceof Number)) {
+ throw new PainterException("itransform: wrong arguments");
+ }
+ if (! (data[2] instanceof ArrayList)) {
+ throw new PainterException("itransform: wrong arguments");
+ }
+
+ ArrayList array = (ArrayList) data[2];
+
+ double[] entries = new double[6];
+
+ if (! (array.size() == 6)) {
+ throw new PainterException("itransform: wrong arguments");
+ }
+
+ for (int i = 0; i < 6; i++) {
+ entries[i] = ( (Number) array.get(i)).doubleValue();
+ }
+
+ AffineTransform at = new AffineTransform(entries);
+
+ double numberdata[] = new double[2];
+ numberdata[0] = ( (Number) data[0]).doubleValue();
+ numberdata[1] = ( (Number) data[0]).doubleValue();
+
+ double[] transformedData = new double[2];
+
+ try {
+ at.inverseTransform(numberdata, 0, transformedData, 0, 1);
+ }
+ catch (NoninvertibleTransformException e) {
+ throw new PainterException(e.toString());
+ }
+ context.operands.push(new Double(transformedData[0]));
+ context.operands.push(new Double(transformedData[1]));
+ }
+ }
+ });
+
+ // currentpoint
+ // PENDING(uweh): what about CTM, same thing when you construct path
+ // this is different than ps, might not work in a few instances
+ systemDict.put("currentpoint", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ Point2D currentPoint = context.pencil.state.path.getCurrentPoint();
+ context.operands.push(new Double(currentPoint.getX()));
+ context.operands.push(new Double(currentPoint.getY()));
+ }
+ });
+
+ // clippath
+ systemDict.put("clippath", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ context.pencil.clippath();
+ }
+ });
+
+ // matrix
+ systemDict.put("matrix", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ ArrayList identityMatrix = new ArrayList(6);
+
+ identityMatrix.add(new Double(1.0d));
+ identityMatrix.add(new Double(0.0d));
+ identityMatrix.add(new Double(0.0d));
+ identityMatrix.add(new Double(1.0d));
+ identityMatrix.add(new Double(0.0d));
+ identityMatrix.add(new Double(0.0d));
+ context.operands.push(identityMatrix);
+ }
+ });
+
+ // concatmatrix
+ systemDict.put("concatmatrix", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ Object data[];
+ data = context.popOperands(3);
+ if (! (data[0] instanceof ArrayList)) {
+ throw new PainterException("concatmatrix: wrong arguments");
+ }
+ if (! (data[1] instanceof ArrayList)) {
+ throw new PainterException("concatmatrix: wrong arguments");
+ }
+ if (! (data[2] instanceof ArrayList)) {
+ throw new PainterException("concatmatrix: wrong arguments");
+ }
+ ArrayList arrayOne, arrayTwo, arrayThree;
+ AffineTransform atOne, atTwo;
+
+ arrayOne = (ArrayList) data[0];
+ arrayTwo = (ArrayList) data[1];
+ arrayThree = (ArrayList) data[2];
+
+ double[] entries = new double[6];
+
+ if (! (arrayOne.size() == 6)) {
+ throw new PainterException("concatmatrix: wrong arguments");
+ }
+ if (! (arrayTwo.size() == 6)) {
+ throw new PainterException("concatmatrix: wrong arguments");
+ }
+ if (! (arrayThree.size() == 6)) {
+ throw new PainterException("concatmatrix: wrong arguments");
+ }
+
+ for (int i = 0; i < 6; i++) {
+ entries[i] = ( (Number) arrayOne.get(i)).doubleValue();
+ }
+ atOne = new AffineTransform(entries);
+ for (int i = 0; i < 6; i++) {
+ entries[i] = ( (Number) arrayTwo.get(i)).doubleValue();
+ }
+ atTwo = new AffineTransform(entries);
+
+ atOne.concatenate(atTwo);
+
+ atOne.getMatrix(entries);
+ for (int i = 0; i < 6; i++) {
+ arrayThree.set(i, new Double(entries[i]));
+ }
+ context.operands.push(arrayThree);
+ }
+ });
+
+ // pathbbox
+ systemDict.put("pathbbox", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ Rectangle2D pathBounds = context.pencil.state.path.getBounds2D();
+
+ context.operands.push(new Double(pathBounds.getMinX()));
+ context.operands.push(new Double(pathBounds.getMinY()));
+ context.operands.push(new Double(pathBounds.getMaxX()));
+ context.operands.push(new Double(pathBounds.getMaxY()));
+ }
+ });
+
+ // initmatrix
+ systemDict.put("initmatrix", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ PdfGraphics2D pdfg2d = (PdfGraphics2D) context.pencil.graphics;
+ PdfContentByte cb = pdfg2d.getContent();
+// cb.transform(Affine);
+ }
+ });
+ // initclip
+ systemDict.put("initclip", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ PdfGraphics2D pdfg2d = (PdfGraphics2D) context.pencil.graphics;
+ PdfContentByte cb = pdfg2d.getContent();
+ context.pencil.clippath();
+// pdfg2d.setClip(context.);
+// if(!PAContext.IgnoreUnknownCommands)
+// throw new UnsupportedOperationException("initclip");
+ }
+ });
+
+ // truncate
+ systemDict.put("truncate", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ double data[];
+ double truncated;
+
+ data = context.popNumberOperands(1);
+ if (data[0] < 0) {
+ truncated = Math.ceil(data[0]);
+ }
+ else {
+ truncated = Math.floor(data[0]);
+ }
+ context.operands.push(new Double(truncated));
+ }
+ });
+
+ // rand
+ systemDict.put("rand", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ context.operands.push(new Integer(Math.abs(randomNumberGenerator.
+ nextInt( (1 << 31) - 1))));
+ }
+ });
+
+ // srand
+ systemDict.put("srand", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ double data[];
+
+ data = context.popNumberOperands(1);
+ randomNumberGenerator = new Random(Math.round(data[0]));
+ }
+ });
+ // version
+ systemDict.put("version", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ context.operands.push("2016");
+ }
+ });
+ // cvi
+ systemDict.put("cvi", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ Object data[];
+
+ data = context.popOperands(1);
+ if (! (data[0] instanceof Number) && ! (data[0] instanceof String)) {
+ throw new PainterException("cvi: wrong arguments");
+ }
+ if (data[0] instanceof Number) {
+ int d;
+
+ d = ( (Number) data[0]).intValue();
+ context.operands.push(new Integer(d));
+ }
+ else {
+ String s;
+ s = (String) data[0];
+
+ context.operands.push(new Integer(s));
+ }
+ }
+ });
+ // cvr
+ systemDict.put("cvr", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ Object data[];
+
+ data = context.popOperands(1);
+ if (! (data[0] instanceof Number) && ! (data[0] instanceof String)) {
+ throw new PainterException("cvr: wrong arguments");
+ }
+ if (data[0] instanceof Number) {
+ int d;
+
+ d = ( (Number) data[0]).intValue();
+ context.operands.push(new Double(d));
+ }
+ else {
+ String s;
+ s = (String) data[0];
+
+ context.operands.push(new Double(s));
+ }
+ }
+ });
+ // usertime
+ systemDict.put("usertime", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ context.operands.push(new Long(System.currentTimeMillis()));
+ }
+ });
+// save
+ systemDict.put("save", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ PdfGraphics2D pdfg2d = (PdfGraphics2D) context.pencil.graphics;
+ PdfContentByte cb = pdfg2d.getContent();
+ cb.saveState();
+ context.operands.push(new Long(0));
+ }
+ });
+// restore
+ systemDict.put("restore", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ PdfGraphics2D pdfg2d = (PdfGraphics2D) context.pencil.graphics;
+ PdfContentByte cb = pdfg2d.getContent();
+ cb.restoreState();
+ Object data[];
+ data = context.popOperands(1);
+ }
+ });
+// clear
+ systemDict.put("clear", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ context.operands.clear();
+ }
+ });
+ // readonly
+ systemDict.put("readonly", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ }
+ });
+
+// currentfile
+ systemDict.put("currentfile", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ final JavaCharStream jcs=context.poorscript.jj_input_stream;
+ InputStream ins=new InputStream(){
+ /**
+ * Reads the next byte of data from the input stream.
+ *
+ * @return the next byte of data, or <code>-1</code> if the end of the stream is reached.
+ * @throws IOException if an I/O error occurs.
+ * @todo Implement this java.io.InputStream method
+ */
+ public int read() throws IOException {
+ return jcs.readChar();
+ }
+
+ };
+ context.operands.push(ins);
+ }
+ });
+ // flushfile
+ systemDict.put("flushfile", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ Object data[];
+ data = context.popOperands(1);
+ if (! (data[0] instanceof InputStream)) {
+ throw new PainterException("flushfile: wrong arguments");
+ }
+
+ InputStream is = (InputStream) data[0];
+ try {
+ while (is.read() != -1) {
+ }
+ }
+ catch (IOException ex) {
+ }
+ }
+ });
+
+ // closefile
+ systemDict.put("closefile", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ Object data[];
+ data = context.popOperands(1);
+ if (! (data[0] instanceof InputStream)) {
+ throw new PainterException("closefile: wrong arguments");
+ }
+
+ InputStream is = (InputStream) data[0];
+ try {
+ is.close();
+ }
+ catch (IOException ex) {
+ }
+ }
+ });
+
+ // string
+ systemDict.put("string", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ Object data[];
+ data = context.popOperands(1);
+ if (! (data[0] instanceof Number)) {
+ throw new PainterException("string: wrong arguments");
+ }
+ int d;
+ d = ( (Number) data[0]).intValue();
+ StringBuffer sb = new StringBuffer(d);
+ sb.setLength(d);
+ context.operands.push(sb);
+ }
+ });
+ // null
+ systemDict.put("null", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ context.operands.push(null);
+ }
+ });
+ // currentscreen
+ systemDict.put("currentscreen", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ if (!PAContext.IgnoreUnknownCommands) {
+ throw new UnsupportedOperationException("currentscreen");
+ }
+ else {
+ context.operands.push(new Double(60));
+ context.operands.push(new Double(0));
+ context.operands.push(new Double(0));
+ }
+ }
+ });
+ // setscreen
+ systemDict.put("setscreen", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ Object data[];
+ data = context.popOperands(3);
+
+// if (!PAContext.IgnoreUnknownCommands)
+// throw new UnsupportedOperationException("setscreen");
+// else {
+//
+// }
+ }
+ });
+
+ // flattenpath
+ systemDict.put("flattenpath", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+
+ }
+ });
+ // filter
+ systemDict.put("filter", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ String filtername;
+ filtername = (String) ( (PAToken) context.popOperands(1)[0]).value;
+ Object obj;
+ while (! ( (obj = context.peekOperand()) instanceof InputStream)) {
+ Object param = context.popOperands(1);
+ }
+
+ InputStream datasrc;
+ datasrc = (InputStream) (context.popOperands(1)[0]);
+
+ InputStream dis;
+ if (filtername.equals("ASCIIHexDecode")) {
+ // dis = new ASCIIHexInputStream(datasrc);
+ final InputStream is=datasrc;
+ dis=new InputStream(){
+
+ /**
+ * Reads the next byte of data from the input stream.
+ *
+ * @return the next byte of data, or <code>-1</code> if the end of the stream is reached.
+ * @throws IOException if an I/O error occurs.
+ * @todo Implement this java.io.InputStream method
+ */
+ public int read() throws IOException {
+ int firstchar,secondchar;
+ for(;;){
+ firstchar=is.read();
+ if(firstchar==-1)return -1;
+ if(firstchar=='>')return -1;
+ if(firstchar=='\n')continue;
+ if(firstchar=='\r')continue;
+ break;
+ }
+ for(;;){
+ secondchar=is.read();
+ if(secondchar=='>')return -1;
+ if(secondchar==-1)return -1;
+ if(secondchar=='\n')continue;
+ if(secondchar=='\r')continue;
+ break;
+ }
+ int highbyte=0;
+ if(firstchar>=48&&firstchar<=57)highbyte=firstchar-48;
+ if(firstchar>=65&&firstchar<=70)highbyte=firstchar-55;
+ int lowbyte=0;
+ if(secondchar>=48&&secondchar<=57)lowbyte=secondchar-48;
+ if(secondchar>=65&&secondchar<=70)lowbyte=secondchar-55;
+
+ return(highbyte*16+lowbyte);
+ }
+ };
+ }
+// else
+// if (filtername.equals("DCTDecode")) {
+// dis = new DCTInputStream(datasrc);
+// }
+ else {
+ dis = datasrc;
+ }
+
+ context.operands.push(dis);
+ }
+ });
+ // clip
+ systemDict.put("clip", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ context.pencil.clip();
+ }
+ });
+ // setcolorspace
+ systemDict.put("setcolorspace", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ PdfGraphics2D pdfg2d = (PdfGraphics2D) context.pencil.graphics;
+ PdfContentByte cb = pdfg2d.getContent();
+ Object data[];
+ data = context.popOperands(1);
+ if (data[0] instanceof PAToken) {
+ String colorspace = ( (String) ( (PAToken) data[0]).value);
+ cb.setDefaultColorspace(PdfName.COLORSPACE, PdfName.DEVICERGB);
+
+ }
+ }
+ });
+ // image
+ systemDict.put("image", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ PdfGraphics2D pdfg2d = (PdfGraphics2D) context.pencil.graphics;
+ PdfContentByte cb = pdfg2d.getContent();
+ Object data[];
+ data = context.popOperands(1);
+ if (data[0] instanceof Number) {
+ /**
+ * Level1 image
+ */
+ int width = ( (Number) data[0]).intValue();
+ data = context.popOperands(4);
+ int height = ( (Number) data[0]).intValue();
+ int bits = ( (Number) data[1]).intValue();
+
+ }else if (data[0] instanceof PAToken) {
+ PAToken proc = (PAToken) data[0];
+
+ data = context.popOperands(4);
+ int width = ( (Number) data[0]).intValue();
+ int height = ( (Number) data[1]).intValue();
+ int bitspercomponent = ( (Number) data[2]).intValue();
+ ArrayList ar = (ArrayList) data[3];
+ System.out.println("I " + width + "*" + height + " " +
+ bitspercomponent + " " + ar);
+
+// context.engine.process(proc);
+ }
+ else if (data[0] instanceof HashMap){
+ HashMap hsm = (HashMap) data[0];
+ Iterator it = hsm.keySet().iterator();
+ int width = 0, height = 0, bitspercomponent = 0;
+ int imagetype = 0;
+ InputStream datasrc = null;
+ Object decode = null;
+ Object imagematrix = null;
+ while (it.hasNext()) {
+ PAToken token = (PAToken) it.next();
+ if (token.value.toString().equals("ImageType")) {
+ imagetype = ( (Number) hsm.get(token)).intValue();
+ }
+ if (token.value.toString().equals("DataSource")) {
+ datasrc = (InputStream) hsm.get(token);
+ }
+
+ if (token.value.toString().equals("BitsPerComponent")) {
+ bitspercomponent = ( (Number) hsm.get(token)).intValue();
+ }
+ if (token.value.toString().equals("Width")) {
+ width = ( (Number) hsm.get(token)).intValue();
+ }
+ if (token.value.toString().equals("Height")) {
+ height = ( (Number) hsm.get(token)).intValue();
+ }
+ if (token.value.toString().equals("Decode")) {
+ decode = ( (Object) hsm.get(token));
+ }
+ if (token.value.toString().equals("ImageMatrix")) {
+ imagematrix = ( (Object) hsm.get(token));
+ }
+ }
+
+ try {
+ byte[] barr = {};
+ ByteArrayOutputStream bout = new ByteArrayOutputStream();
+ int aByte;
+ while ( (aByte = datasrc.read()) >= 0) {
+ bout.write(aByte);
+// System.out.print((char)aByte);
+ }
+ System.out.println("I " + width + "*" + height + " " +
+ bitspercomponent + " " + imagetype + " " +
+ decode + " " + imagematrix + " " + datasrc);
+ barr = bout.toByteArray();
+// com.lowagie.text.Image img = new ImgRaw(width, height, 1,
+// bitspercomponent, barr);
+ com.lowagie.text.Image img = new Jpeg(barr);
+ try {
+ cb.addImage(img,width,0,0,height,0,0);
+ }
+ catch (DocumentException ex1) {
+ ex1.printStackTrace();
+ }
+ }
+ catch (IOException ex) {
+ ex.printStackTrace();
+ }
+ catch (BadElementException ex) {
+ ex.printStackTrace();
+ }
+
+ }
+ }
+ });
+
+ // imagemask
+ systemDict.put("imagemask", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ Object data[];
+ data = context.popOperands(5);
+// if (data[0] instanceof PAToken) {
+// PAToken token = (PAToken) data[0];
+// context.engine.process(token);
+// }
+ }
+ });
+
+
+ // exec
+ systemDict.put("exec", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ Object data[];
+ data = context.popOperands(1);
+ if (data[0] instanceof PAToken) {
+ PAToken token = (PAToken) data[0];
+ context.engine.process(token);
+ }
+ }
+ });
+ // currentdict
+ systemDict.put("currentdict", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ context.operands.push(context.dictionaries.peek());
+ }
+ });
+
+// cleardictstack
+ systemDict.put("cleardictstack", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ context.dictionaries.clear();
+ HashMap systemDict = context.constructSystemDict();
+ context.dictionaries.push(systemDict);
+ HashMap globalDict = context.constructGlobalDict();
+ context.dictionaries.push(globalDict);
+ HashMap userDict = context.constructUserDict();
+ systemDict.put("userdict", userDict);
+ systemDict.put("globaldict", globalDict);
+ context.dictionaries.push(userDict);
+ }
+ });
+
+ // charpath
+ systemDict.put("charpath", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ Object data[];
+
+ data = context.popOperands(2);
+ if (! (data[0] instanceof String)) {
+ throw new PainterException("charpath: wrong arguments");
+ }
+ if (! (data[1] instanceof Boolean)) {
+ throw new PainterException("charpath: wrong arguments");
+ }
+
+ context.pencil.charpath( (String) data[0],
+ ( (Boolean) data[1]).booleanValue());
+ }
+ });
+
+ // PENDING(uweh): we only support procedure right now and always push false on the stack
+ // stopped
+ systemDict.put("stopped", new PACommand() {
+ public void execute(PAContext context) throws PainterException {
+ Object data[];
+ PAToken patoken;
+ data = context.popOperands(1);
+ if (! (data[0] instanceof PAToken)) {
+ throw new PainterException("stopped: wrong arguments");
+ }
+
+ patoken = (PAToken) data[0];
+ if (! (patoken.type == PAToken.PROCEDURE)) {
+ throw new PainterException("stopped: wrong arguments");
+ }
+ context.engine.process(patoken);
+ context.operands.push(new Boolean(false));
+ }
+ });
+ systemDict.put("systemdict", systemDict);
+ return systemDict;
+ }
+
+ /**
+ * <p>Title: </p>
+ *
+ * <p>Description: </p>
+ *
+ * <p>Copyright: Copyright (c) 2006</p>
+ *
+ * <p>Company: </p>
+ * @author not attributable
+ * @version 1.0
+ */
+ private class NamedInputStream extends InputStream{
+ public String filename;
+ InputStream in;
+ NamedInputStream(InputStream in,String filename) {
+ super();
+ this.filename=filename;
+ this.in=in;
+ }
+ public int read() throws IOException {
+ return in.read();
+ }
+ }
+}
diff --git a/src/main/java/com/lowagie/text/pdf/codec/postscript/PAEngine.java b/src/main/java/com/lowagie/text/pdf/codec/postscript/PAEngine.java
new file mode 100644
index 0000000..e905402
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/codec/postscript/PAEngine.java
@@ -0,0 +1,155 @@
+/*
+ * Copyright 1998 by Sun Microsystems, Inc.,
+ * 901 San Antonio Road, Palo Alto, California, 94303, U.S.A.
+ * All rights reserved.
+ *
+ * This software is the confidential and proprietary information
+ * of Sun Microsystems, Inc. ("Confidential Information"). You
+ * shall not disclose such Confidential Information and shall use
+ * it only in accordance with the terms of the license agreement
+ * you entered into with Sun.
+ */
+
+package com.lowagie.text.pdf.codec.postscript;
+
+import java.util.*;
+
+
+public class PAEngine extends Object {
+
+ static public final int MODE_STACK = 0;
+ static public final int MODE_PROCEDURE = 1;
+ static public final int MODE_ARRAY = 2;
+
+ protected PAContext context;
+ protected int mode;
+ protected Stack procedure;
+ protected int innerProcedures;
+
+ public PAEngine(PAContext context){
+ super();
+ this.context = context;
+ this.mode = PAEngine.MODE_STACK;
+ }
+
+ public void startProcedure() throws PainterException {
+ this.procedure = new Stack();
+ this.mode = PAEngine.MODE_PROCEDURE;
+ this.innerProcedures = 0;
+ }
+
+ public void endProcedure() throws PainterException {
+ this.context.operands.push(new PAToken(this.procedure, PAToken.PROCEDURE));
+ this.mode = PAEngine.MODE_STACK;
+ }
+
+ public void bindProcedure(PAToken patoken){
+ Stack oldStack = (Stack) patoken.value;
+ Stack newStack = new Stack();
+ int i,n;
+ n = oldStack.size();
+ for(i = 0; i < n; i++){
+ Object token = oldStack.elementAt(i);
+ if((token instanceof PAToken) && ((PAToken) token).type == PAToken.IDENTIFIER){
+ Object foundToken = this.context.findIdentifier(((PAToken) token).value);
+ if(foundToken == null){
+ newStack.push(token);
+ } else {
+ newStack.push(foundToken);
+ }
+ } else {
+ newStack.push(token);
+ }
+ }
+ patoken.value = newStack;
+ }
+
+ public void process(Object token) throws PainterException {
+ if(token == null){
+ throw new IllegalStateException("Null token encountered; last unknown identifier was " + this.context.getLastUnknownIdentifier()+" at line "+this.context.poorscript.token.beginLine);
+ }
+ if(PAContext.DebugExecution){
+ System.out.print("==>" + token.toString());
+// System.out.flush();
+ }
+ if(token instanceof PAToken && ((PAToken) token).type == PAToken.IMMEDIATE){
+ Object foundValue = this.context.findIdentifier(((PAToken) token).value);
+ this.process(foundValue);
+ return;
+ }
+ if(this.mode == MODE_STACK){
+ if(token instanceof PACommand){
+ ((PACommand) token).execute(this.context);
+ } else if(token instanceof PAToken){
+ PAToken patoken = (PAToken) token;
+
+ switch(patoken.type){
+ case PAToken.IDENTIFIER:
+ this.process(this.context.findIdentifier(patoken.value));
+ break;
+ case PAToken.KEY:
+ case PAToken.MARK:
+ case PAToken.START_ARRAY:
+ this.context.operands.push(token);
+ break;
+ case PAToken.PROCEDURE:
+ Enumeration enumx = ((Vector) patoken.value).elements();
+ while(enumx.hasMoreElements()){
+ this.process(enumx.nextElement());
+ }
+ break;
+ case PAToken.START_PROCEDURE:
+ this.startProcedure();
+ break;
+ case PAToken.END_ARRAY:
+ this.context.collectArray();
+ break;
+ case PAToken.START_DICT:
+ this.context.operands.push(token);
+ break;
+ case PAToken.END_DICT:
+ this.context.collectDict();
+ break;
+ default:
+ throw new IllegalStateException("Unknown token encountered" + token);
+ }
+ } else {
+ this.context.operands.push(token);
+ }
+ } else if(this.mode == MODE_PROCEDURE){
+ if(token instanceof PAToken){
+ PAToken patoken = (PAToken) token;
+
+ switch(patoken.type){
+ case PAToken.START_PROCEDURE:
+ this.innerProcedures++;
+ this.procedure.push(token);
+ break;
+ case PAToken.END_PROCEDURE:
+ if(this.innerProcedures > 0){
+ this.innerProcedures--;
+ this.procedure.push(token);
+ } else {
+ this.endProcedure();
+ }
+ break;
+ default:
+ this.procedure.push(token);
+ }
+ } else {
+ this.procedure.push(token);
+ }
+ }
+ }
+
+ public String litMode(){
+ switch(this.mode){
+ case MODE_ARRAY: return "Array";
+ case MODE_PROCEDURE: return "Proc"+innerProcedures;
+ case MODE_STACK: return "Stack";
+ default: return "Unknown";
+ }
+ }
+
+}
+
diff --git a/src/main/java/com/lowagie/text/pdf/codec/postscript/PAParser.java b/src/main/java/com/lowagie/text/pdf/codec/postscript/PAParser.java
new file mode 100644
index 0000000..3c2c64a
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/codec/postscript/PAParser.java
@@ -0,0 +1,351 @@
+/* Generated By:JavaCC: Do not edit this line. PAParser.java */
+package com.lowagie.text.pdf.codec.postscript;
+
+import java.lang.*;
+import java.lang.reflect.*;
+import java.util.*;
+import java.awt.*;
+import java.awt.geom.*;
+import java.awt.color.*;
+import java.awt.font.*;
+import java.io.*;
+import java.net.URL;
+
+public class PAParser extends Object implements PAParserConstants {
+
+ void error_skipto(int kind) throws ParseException {
+ParseException e=generateParseException();
+Token t;
+String dump="";
+do{
+if(getToken(1).kind==kind)break;
+t=getNextToken();
+dump+=t.image;
+}while(t.kind!=kind);
+System.out.println("Ignoriere >"+dump+"<");
+ }
+
+ String ExceptionString(String hint,JavaCharStream jj_input_stream,PAContext context,Token t,Exception e) throws ParseException {
+ return "\nparser "+hint+" ["+jj_input_stream.bufpos+"]"+context.engine.litMode()+":\""+t.image+"\" in line "+t.beginLine+" column "+t.beginColumn+"\n"+e.toString();
+ }
+
+ final public void parse(PAContext context) throws ParseException {
+ Token x = null;
+ try {
+ label_1:
+ while (true) {
+ switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ case INTEGER_LITERAL:
+ case FLOATING_POINT_LITERAL:
+ case STRING_LITERAL:
+ case IDENTIFIER:
+ case KEY_IDENTIFIER:
+ case IMMEDIATE_IDENTIFIER:
+ case LBRACE:
+ case RBRACE:
+ case LBRACKET:
+ case RBRACKET:
+ case LDICT:
+ case RDICT:
+ case Instring:
+ ;
+ break;
+ default:
+ jj_la1[0] = jj_gen;
+ break label_1;
+ }
+ switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ case INTEGER_LITERAL:
+ case FLOATING_POINT_LITERAL:
+ case STRING_LITERAL:
+ case IDENTIFIER:
+ case KEY_IDENTIFIER:
+ case IMMEDIATE_IDENTIFIER:
+ case Instring:
+ switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
+ case INTEGER_LITERAL:
+ x = jj_consume_token(INTEGER_LITERAL);
+ try {
+ {if(PAContext.DebugExecution){System.out.print("\nparser ["+jj_input_stream.getBeginLine()+","+jj_input_stream.getBeginColumn()+"]"+context.engine.litMode()+":\""+x.image+"\"");System.out.flush();System.err.flush();}}
+ context.engine.process(new Integer(x.image));
+ } catch(NumberFormatException e) {
+ {if (true) throw new ParseException(ExceptionString("int_literal",jj_input_stream,context,token,e));}
+ } catch(PainterException e) {
+ {if (true) throw new ParseException(ExceptionString("int_literal",jj_input_stream,context,token,e));}
+ }
+ break;
+ case FLOATING_POINT_LITERAL:
+ x = jj_consume_token(FLOATING_POINT_LITERAL);
+ try {
+ {if(PAContext.DebugExecution){System.out.print("\nparser ["+jj_input_stream.getBeginLine()+","+jj_input_stream.getBeginColumn()+"]"+context.engine.litMode()+":\""+x.image+"\"");System.out.flush();System.err.flush();}}
+ context.engine.process(new Double(x.image));
+ } catch(NumberFormatException e) {
+ {if (true) throw new ParseException(ExceptionString("float_literal",jj_input_stream,context,token,e));}
+ } catch(PainterException e) {
+ {if (true) throw new ParseException(ExceptionString("float_literal",jj_input_stream,context,token,e));}
+ }
+ break;
+ case Instring:
+ jj_consume_token(Instring);
+ x = jj_consume_token(HEX_STRING_LITERAL);
+ try {
+ {if(PAContext.DebugExecution){System.out.print("\nparser ["+jj_input_stream.getBeginLine()+","+jj_input_stream.getBeginColumn()+"]"+context.engine.litMode()+":\""+x.image+"\"");System.out.flush();System.err.flush();}}
+ context.engine.process((x.image.substring(1, x.image.length() -1)));
+ } catch(PainterException e) {
+ {if (true) throw new ParseException(ExceptionString("hex_string_literal",jj_input_stream,context,token,e));}
+ }
+ break;
+ case STRING_LITERAL:
+ x = jj_consume_token(STRING_LITERAL);
+ try {
+ {if(PAContext.DebugExecution){System.out.print("\nparser ["+jj_input_stream.getBeginLine()+","+jj_input_stream.getBeginColumn()+"]"+context.engine.litMode()+":\""+x.image+"\"");System.out.flush();System.err.flush();}}
+ context.engine.process(x.image.substring(1, x.image.length() -1));
+ } catch(PainterException e) {
+ {if (true) throw new ParseException(ExceptionString("string_literal",jj_input_stream,context,token,e));}
+ }
+ break;
+ case IDENTIFIER:
+ x = jj_consume_token(IDENTIFIER);
+ try {
+ {if(PAContext.DebugExecution){System.out.print("\nparser ["+jj_input_stream.getBeginLine()+","+jj_input_stream.getBeginColumn()+"]"+context.engine.litMode()+":\""+x.image+"\"");System.out.flush();System.err.flush();}}
+ context.engine.process(new PAToken(x.image, PAToken.IDENTIFIER));
+ } catch(PainterException e) {
+ {if (true) throw new ParseException(ExceptionString("identifier",jj_input_stream,context,token,e));}
+ }
+ break;
+ case KEY_IDENTIFIER:
+ x = jj_consume_token(KEY_IDENTIFIER);
+ try {
+ {if(PAContext.DebugExecution){System.out.print("\nparser ["+jj_input_stream.getBeginLine()+","+jj_input_stream.getBeginColumn()+"]"+context.engine.litMode()+":\""+x.image+"\"");System.out.flush();System.err.flush();}}
+ context.engine.process(new PAToken(x.image.substring(1, x.image.length()), PAToken.KEY));
+ } catch(PainterException e) {
+ {if (true) throw new ParseException(ExceptionString("key_identifier",jj_input_stream,context,token,e));}
+ }
+ break;
+ case IMMEDIATE_IDENTIFIER:
+ x = jj_consume_token(IMMEDIATE_IDENTIFIER);
+ try {
+ {if(PAContext.DebugExecution){System.out.print("\nparser ["+jj_input_stream.getBeginLine()+","+jj_input_stream.getBeginColumn()+"]"+context.engine.litMode()+":\""+x.image+"\"");System.out.flush();System.err.flush();}}
+ context.engine.process(new PAToken(x.image.substring(2, x.image.length()), PAToken.IMMEDIATE));
+ } catch(PainterException e) {
+ {if (true) throw new ParseException(ExceptionString("immediate_identifier",jj_input_stream,context,token,e));}
+ }
+ break;
+ default:
+ jj_la1[1] = jj_gen;
+ jj_consume_token(-1);
+ throw new ParseException();
+ }
+ break;
+ case LBRACE:
+ jj_consume_token(LBRACE);
+ try {
+ {if(PAContext.DebugExecution){System.out.print("\nparser ["+jj_input_stream.getBeginLine()+","+jj_input_stream.getBeginColumn()+"]"+context.engine.litMode()+":\""+token.image+"\"");System.out.flush();System.err.flush();}}
+ context.engine.process(new PAToken(null, PAToken.START_PROCEDURE));
+ } catch(PainterException e) {
+ {if (true) throw new ParseException(ExceptionString("lbrace",jj_input_stream,context,token,e));}
+ }
+ break;
+ case RBRACE:
+ jj_consume_token(RBRACE);
+ try {
+ {if(PAContext.DebugExecution){System.out.print("\nparser ["+jj_input_stream.getBeginLine()+","+jj_input_stream.getBeginColumn()+"]"+context.engine.litMode()+":\""+token.image+"\"");System.out.flush();System.err.flush();}}
+ context.engine.process(new PAToken(null, PAToken.END_PROCEDURE));
+ } catch(PainterException e) {
+ {if (true) throw new ParseException(ExceptionString("rbrace",jj_input_stream,context,token,e));}
+ }
+ break;
+ case LBRACKET:
+ jj_consume_token(LBRACKET);
+ try {
+ {if(PAContext.DebugExecution){System.out.print("\nparser ["+jj_input_stream.getBeginLine()+","+jj_input_stream.getBeginColumn()+"]"+context.engine.litMode()+":\""+token.image+"\"");System.out.flush();System.err.flush();}}
+ context.engine.process(new PAToken(null, PAToken.START_ARRAY));
+ } catch(PainterException e) {
+ {if (true) throw new ParseException(ExceptionString("lbracket",jj_input_stream,context,token,e));}
+ }
+ break;
+ case RBRACKET:
+ jj_consume_token(RBRACKET);
+ try {
+ {if(PAContext.DebugExecution){System.out.print("\nparser ["+jj_input_stream.getBeginLine()+","+jj_input_stream.getBeginColumn()+"]"+context.engine.litMode()+":\""+token.image+"\"");System.out.flush();System.err.flush();}}
+ context.engine.process(new PAToken(null, PAToken.END_ARRAY));
+ } catch(PainterException e) {
+ {if (true) throw new ParseException(ExceptionString("rbracket",jj_input_stream,context,token,e));}
+ }
+ break;
+ case LDICT:
+ jj_consume_token(LDICT);
+ try {
+ {if(PAContext.DebugExecution){System.out.print("\nparser ["+jj_input_stream.getBeginLine()+","+jj_input_stream.getBeginColumn()+"]"+context.engine.litMode()+":\""+token.image+"\"");System.out.flush();System.err.flush();}}
+ context.engine.process(new PAToken(null, PAToken.START_DICT));
+ } catch(PainterException e) {
+ {if (true) throw new ParseException(ExceptionString("ldict",jj_input_stream,context,token,e));}
+ }
+ break;
+ case RDICT:
+ jj_consume_token(RDICT);
+ try {
+ {if(PAContext.DebugExecution){System.out.print("\nparser ["+jj_input_stream.getBeginLine()+","+jj_input_stream.getBeginColumn()+"]"+context.engine.litMode()+":\""+token.image+"\"");System.out.flush();System.err.flush();}}
+ context.engine.process(new PAToken(null, PAToken.END_DICT));
+ } catch(PainterException e) {
+ {if (true) throw new ParseException(ExceptionString("rdict",jj_input_stream,context,token,e));}
+ }
+ break;
+ default:
+ jj_la1[2] = jj_gen;
+ jj_consume_token(-1);
+ throw new ParseException();
+ }
+ }
+ } catch (ParseException e) {
+ System.out.flush();System.err.flush();
+ //System.out.println("Fehlerhaftes Element in Spalte "+e.currentToken.beginColumn+" in Eingabedatei in Zeile="+e.currentToken.next.beginLine+" in Zeichen Nr. "+e.currentToken.next.beginColumn+". >"+e.currentToken.next.image+"< wurde hier nicht erwartet.");
+ //System.err.println("Fehler:"+e);
+ e.printStackTrace();
+ error_skipto(WHITESPACE);
+ System.exit(0);
+ }
+ }
+
+ public PAParserTokenManager token_source;
+ JavaCharStream jj_input_stream;
+ public Token token, jj_nt;
+ private int jj_ntk;
+ private int jj_gen;
+ final private int[] jj_la1 = new int[3];
+ final private int[] jj_la1_0 = {0x13f3d20,0x1003d20,0x13f3d20,};
+
+ public PAParser(java.io.InputStream stream) {
+ jj_input_stream = new JavaCharStream(stream, 1, 1);
+ token_source = new PAParserTokenManager(jj_input_stream);
+ token = new Token();
+ jj_ntk = -1;
+ jj_gen = 0;
+ for (int i = 0; i < 3; i++) jj_la1[i] = -1;
+ }
+
+ public void ReInit(java.io.InputStream stream) {
+ jj_input_stream.ReInit(stream, 1, 1);
+ token_source.ReInit(jj_input_stream);
+ token = new Token();
+ jj_ntk = -1;
+ jj_gen = 0;
+ for (int i = 0; i < 3; i++) jj_la1[i] = -1;
+ }
+
+ public PAParser(java.io.Reader stream) {
+ jj_input_stream = new JavaCharStream(stream, 1, 1);
+ token_source = new PAParserTokenManager(jj_input_stream);
+ token = new Token();
+ jj_ntk = -1;
+ jj_gen = 0;
+ for (int i = 0; i < 3; i++) jj_la1[i] = -1;
+ }
+
+ public void ReInit(java.io.Reader stream) {
+ jj_input_stream.ReInit(stream, 1, 1);
+ token_source.ReInit(jj_input_stream);
+ token = new Token();
+ jj_ntk = -1;
+ jj_gen = 0;
+ for (int i = 0; i < 3; i++) jj_la1[i] = -1;
+ }
+
+ public PAParser(PAParserTokenManager tm) {
+ token_source = tm;
+ token = new Token();
+ jj_ntk = -1;
+ jj_gen = 0;
+ for (int i = 0; i < 3; i++) jj_la1[i] = -1;
+ }
+
+ public void ReInit(PAParserTokenManager tm) {
+ token_source = tm;
+ token = new Token();
+ jj_ntk = -1;
+ jj_gen = 0;
+ for (int i = 0; i < 3; i++) jj_la1[i] = -1;
+ }
+
+ final private Token jj_consume_token(int kind) throws ParseException {
+ Token oldToken;
+ if ((oldToken = token).next != null) token = token.next;
+ else token = token.next = token_source.getNextToken();
+ jj_ntk = -1;
+ if (token.kind == kind) {
+ jj_gen++;
+ return token;
+ }
+ token = oldToken;
+ jj_kind = kind;
+ throw generateParseException();
+ }
+
+ final public Token getNextToken() {
+ if (token.next != null) token = token.next;
+ else token = token.next = token_source.getNextToken();
+ jj_ntk = -1;
+ jj_gen++;
+ return token;
+ }
+
+ final public Token getToken(int index) {
+ Token t = token;
+ for (int i = 0; i < index; i++) {
+ if (t.next != null) t = t.next;
+ else t = t.next = token_source.getNextToken();
+ }
+ return t;
+ }
+
+ final private int jj_ntk() {
+ if ((jj_nt=token.next) == null)
+ return (jj_ntk = (token.next=token_source.getNextToken()).kind);
+ else
+ return (jj_ntk = jj_nt.kind);
+ }
+
+ private java.util.Vector jj_expentries = new java.util.Vector();
+ private int[] jj_expentry;
+ private int jj_kind = -1;
+
+ final public ParseException generateParseException() {
+ jj_expentries.removeAllElements();
+ boolean[] la1tokens = new boolean[25];
+ for (int i = 0; i < 25; i++) {
+ la1tokens[i] = false;
+ }
+ if (jj_kind >= 0) {
+ la1tokens[jj_kind] = true;
+ jj_kind = -1;
+ }
+ for (int i = 0; i < 3; i++) {
+ if (jj_la1[i] == jj_gen) {
+ for (int j = 0; j < 32; j++) {
+ if ((jj_la1_0[i] & (1<<j)) != 0) {
+ la1tokens[j] = true;
+ }
+ }
+ }
+ }
+ for (int i = 0; i < 25; i++) {
+ if (la1tokens[i]) {
+ jj_expentry = new int[1];
+ jj_expentry[0] = i;
+ jj_expentries.addElement(jj_expentry);
+ }
+ }
+ int[][] exptokseq = new int[jj_expentries.size()][];
+ for (int i = 0; i < jj_expentries.size(); i++) {
+ exptokseq[i] = (int[])jj_expentries.elementAt(i);
+ }
+ return new ParseException(token, exptokseq, tokenImage);
+ }
+
+ final public void enable_tracing() {
+ }
+
+ final public void disable_tracing() {
+ }
+
+}
diff --git a/src/main/java/com/lowagie/text/pdf/codec/postscript/PAParserConstants.java b/src/main/java/com/lowagie/text/pdf/codec/postscript/PAParserConstants.java
new file mode 100644
index 0000000..828ccfe
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/codec/postscript/PAParserConstants.java
@@ -0,0 +1,60 @@
+/* Generated By:JavaCC: Do not edit this line. PAParserConstants.java */
+package com.lowagie.text.pdf.codec.postscript;
+
+public interface PAParserConstants {
+
+ int EOF = 0;
+ int WHITESPACE = 1;
+ int INTEGER_LITERAL = 5;
+ int DECIMAL_LITERAL = 6;
+ int HEX_LITERAL = 7;
+ int FLOATING_POINT_LITERAL = 8;
+ int EXPONENT = 9;
+ int STRING_LITERAL = 10;
+ int IDENTIFIER = 11;
+ int KEY_IDENTIFIER = 12;
+ int IMMEDIATE_IDENTIFIER = 13;
+ int LETTER = 14;
+ int DIGIT = 15;
+ int LBRACE = 16;
+ int RBRACE = 17;
+ int LBRACKET = 18;
+ int RBRACKET = 19;
+ int LDICT = 20;
+ int RDICT = 21;
+ int Nextchar = 22;
+ int HEX_STRING_LITERAL = 23;
+ int Instring = 24;
+
+ int DEFAULT = 0;
+ int WITHINSTRING = 1;
+
+ String[] tokenImage = {
+ "<EOF>",
+ "<WHITESPACE>",
+ "<token of kind 2>",
+ "<token of kind 3>",
+ "<token of kind 4>",
+ "<INTEGER_LITERAL>",
+ "<DECIMAL_LITERAL>",
+ "<HEX_LITERAL>",
+ "<FLOATING_POINT_LITERAL>",
+ "<EXPONENT>",
+ "<STRING_LITERAL>",
+ "<IDENTIFIER>",
+ "<KEY_IDENTIFIER>",
+ "<IMMEDIATE_IDENTIFIER>",
+ "<LETTER>",
+ "<DIGIT>",
+ "\"{\"",
+ "\"}\"",
+ "\"[\"",
+ "\"]\"",
+ "\"<<\"",
+ "\">>\"",
+ "<Nextchar>",
+ "\">\"",
+ "\"<\"",
+ };
+
+}
diff --git a/src/main/java/com/lowagie/text/pdf/codec/postscript/PAParserTokenManager.java b/src/main/java/com/lowagie/text/pdf/codec/postscript/PAParserTokenManager.java
new file mode 100644
index 0000000..9b908ba
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/codec/postscript/PAParserTokenManager.java
@@ -0,0 +1,1011 @@
+/* Generated By:JavaCC: Do not edit this line. PAParserTokenManager.java */
+package com.lowagie.text.pdf.codec.postscript;
+import java.lang.*;
+import java.lang.reflect.*;
+import java.util.*;
+import java.awt.*;
+import java.awt.geom.*;
+import java.awt.color.*;
+import java.awt.font.*;
+import java.io.*;
+import java.net.URL;
+
+public class PAParserTokenManager implements PAParserConstants
+{
+ public java.io.PrintStream debugStream = System.out;
+ public void setDebugStream(java.io.PrintStream ds) { debugStream = ds; }
+private final int jjStopStringLiteralDfa_0(int pos, long active0)
+{
+ switch (pos)
+ {
+ default :
+ return -1;
+ }
+}
+private final int jjStartNfa_0(int pos, long active0)
+{
+ return jjMoveNfa_0(jjStopStringLiteralDfa_0(pos, active0), pos + 1);
+}
+private final int jjStopAtPos(int pos, int kind)
+{
+ jjmatchedKind = kind;
+ jjmatchedPos = pos;
+ return pos + 1;
+}
+private final int jjStartNfaWithStates_0(int pos, int kind, int state)
+{
+ jjmatchedKind = kind;
+ jjmatchedPos = pos;
+ try { curChar = input_stream.readChar(); }
+ catch(java.io.IOException e) { return pos + 1; }
+ return jjMoveNfa_0(state, pos + 1);
+}
+private final int jjMoveStringLiteralDfa0_0()
+{
+ switch(curChar)
+ {
+ case 60:
+ jjmatchedKind = 24;
+ return jjMoveStringLiteralDfa1_0(0x100000L);
+ case 62:
+ return jjMoveStringLiteralDfa1_0(0x200000L);
+ case 91:
+ return jjStopAtPos(0, 18);
+ case 93:
+ return jjStopAtPos(0, 19);
+ case 123:
+ return jjStopAtPos(0, 16);
+ case 125:
+ return jjStopAtPos(0, 17);
+ default :
+ return jjMoveNfa_0(0, 0);
+ }
+}
+private final int jjMoveStringLiteralDfa1_0(long active0)
+{
+ try { curChar = input_stream.readChar(); }
+ catch(java.io.IOException e) {
+ jjStopStringLiteralDfa_0(0, active0);
+ return 1;
+ }
+ switch(curChar)
+ {
+ case 60:
+ if ((active0 & 0x100000L) != 0L)
+ return jjStopAtPos(1, 20);
+ break;
+ case 62:
+ if ((active0 & 0x200000L) != 0L)
+ return jjStopAtPos(1, 21);
+ break;
+ default :
+ break;
+ }
+ return jjStartNfa_0(0, active0);
+}
+private final void jjCheckNAdd(int state)
+{
+ if (jjrounds[state] != jjround)
+ {
+ jjstateSet[jjnewStateCnt++] = state;
+ jjrounds[state] = jjround;
+ }
+}
+private final void jjAddStates(int start, int end)
+{
+ do {
+ jjstateSet[jjnewStateCnt++] = jjnextStates[start];
+ } while (start++ != end);
+}
+private final void jjCheckNAddTwoStates(int state1, int state2)
+{
+ jjCheckNAdd(state1);
+ jjCheckNAdd(state2);
+}
+private final void jjCheckNAddStates(int start, int end)
+{
+ do {
+ jjCheckNAdd(jjnextStates[start]);
+ } while (start++ != end);
+}
+private final void jjCheckNAddStates(int start)
+{
+ jjCheckNAdd(jjnextStates[start]);
+ jjCheckNAdd(jjnextStates[start + 1]);
+}
+static final long[] jjbitVec0 = {
+ 0xfffffffffffffffeL, 0xffffffffffffffffL, 0xffffffffffffffffL, 0xffffffffffffffffL
+};
+static final long[] jjbitVec2 = {
+ 0x0L, 0x0L, 0xffffffffffffffffL, 0xffffffffffffffffL
+};
+static final long[] jjbitVec3 = {
+ 0x1ff00000fffffffeL, 0xffffffffffffc000L, 0xffffffffL, 0x600000000000000L
+};
+static final long[] jjbitVec4 = {
+ 0x0L, 0x0L, 0x0L, 0xff7fffffff7fffffL
+};
+static final long[] jjbitVec5 = {
+ 0x0L, 0xffffffffffffffffL, 0xffffffffffffffffL, 0xffffffffffffffffL
+};
+static final long[] jjbitVec6 = {
+ 0xffffffffffffffffL, 0xffffffffffffffffL, 0xffffL, 0x0L
+};
+static final long[] jjbitVec7 = {
+ 0xffffffffffffffffL, 0xffffffffffffffffL, 0x0L, 0x0L
+};
+static final long[] jjbitVec8 = {
+ 0x3fffffffffffL, 0x0L, 0x0L, 0x0L
+};
+private final int jjMoveNfa_0(int startState, int curPos)
+{
+ int[] nextStates;
+ int startsAt = 0;
+ jjnewStateCnt = 74;
+ int i = 1;
+ jjstateSet[0] = startState;
+ int j, kind = 0x7fffffff;
+ for (;;)
+ {
+ if (++jjround == 0x7fffffff)
+ ReInitRounds();
+ if (curChar < 64)
+ {
+ long l = 1L << curChar;
+ MatchLoop: do
+ {
+ switch(jjstateSet[--i])
+ {
+ case 0:
+ if ((0x3ff000000000000L & l) != 0L)
+ {
+ if (kind > 5)
+ kind = 5;
+ jjCheckNAddStates(0, 8);
+ }
+ else if ((0x100003610L & l) != 0L)
+ {
+ if (kind > 1)
+ kind = 1;
+ }
+ else if ((0x8000281000000000L & l) != 0L)
+ {
+ if (kind > 11)
+ kind = 11;
+ jjCheckNAdd(21);
+ }
+ else if (curChar == 37)
+ jjCheckNAddStates(9, 14);
+ else if (curChar == 47)
+ jjstateSet[jjnewStateCnt++] = 26;
+ else if (curChar == 40)
+ jjCheckNAddStates(15, 17);
+ else if (curChar == 46)
+ jjCheckNAdd(6);
+ if (curChar == 45)
+ jjCheckNAddStates(18, 23);
+ else if (curChar == 47)
+ jjCheckNAddTwoStates(23, 24);
+ else if (curChar == 48)
+ jjstateSet[jjnewStateCnt++] = 2;
+ break;
+ case 1:
+ if (curChar == 48)
+ jjstateSet[jjnewStateCnt++] = 2;
+ break;
+ case 3:
+ if ((0x3ff000000000000L & l) == 0L)
+ break;
+ if (kind > 5)
+ kind = 5;
+ jjCheckNAddTwoStates(3, 4);
+ break;
+ case 5:
+ if (curChar == 46)
+ jjCheckNAdd(6);
+ break;
+ case 6:
+ if ((0x3ff000000000000L & l) == 0L)
+ break;
+ if (kind > 8)
+ kind = 8;
+ jjCheckNAddStates(24, 26);
+ break;
+ case 8:
+ if ((0x280000000000L & l) != 0L)
+ jjCheckNAdd(9);
+ break;
+ case 9:
+ if ((0x3ff000000000000L & l) == 0L)
+ break;
+ if (kind > 8)
+ kind = 8;
+ jjCheckNAddTwoStates(9, 10);
+ break;
+ case 11:
+ if (curChar == 40)
+ jjCheckNAddStates(15, 17);
+ break;
+ case 12:
+ if ((0xfffffdffffffffffL & l) != 0L)
+ jjCheckNAddStates(15, 17);
+ break;
+ case 14:
+ if ((0x38000000400L & l) != 0L)
+ jjCheckNAddStates(15, 17);
+ break;
+ case 15:
+ if (curChar == 41 && kind > 10)
+ kind = 10;
+ break;
+ case 16:
+ if ((0xff000000000000L & l) != 0L)
+ jjCheckNAddStates(27, 30);
+ break;
+ case 17:
+ if ((0xff000000000000L & l) != 0L)
+ jjCheckNAddStates(15, 17);
+ break;
+ case 18:
+ if ((0xf000000000000L & l) != 0L)
+ jjstateSet[jjnewStateCnt++] = 19;
+ break;
+ case 19:
+ if ((0xff000000000000L & l) != 0L)
+ jjCheckNAdd(17);
+ break;
+ case 20:
+ if ((0x8000281000000000L & l) == 0L)
+ break;
+ if (kind > 11)
+ kind = 11;
+ jjCheckNAdd(21);
+ break;
+ case 21:
+ if ((0x83ff681000000000L & l) == 0L)
+ break;
+ if (kind > 11)
+ kind = 11;
+ jjCheckNAdd(21);
+ break;
+ case 22:
+ if (curChar == 47)
+ jjCheckNAddTwoStates(23, 24);
+ break;
+ case 23:
+ if ((0x400800000000L & l) != 0L)
+ jjCheckNAdd(24);
+ break;
+ case 24:
+ if ((0x8000281000000000L & l) == 0L)
+ break;
+ if (kind > 12)
+ kind = 12;
+ jjCheckNAdd(25);
+ break;
+ case 25:
+ if ((0x83ff681000000000L & l) == 0L)
+ break;
+ if (kind > 12)
+ kind = 12;
+ jjCheckNAdd(25);
+ break;
+ case 26:
+ if (curChar == 47)
+ jjstateSet[jjnewStateCnt++] = 27;
+ break;
+ case 27:
+ if ((0x8000281000000000L & l) == 0L)
+ break;
+ if (kind > 13)
+ kind = 13;
+ jjCheckNAdd(28);
+ break;
+ case 28:
+ if ((0x83ff681000000000L & l) == 0L)
+ break;
+ if (kind > 13)
+ kind = 13;
+ jjCheckNAdd(28);
+ break;
+ case 29:
+ if (curChar == 47)
+ jjstateSet[jjnewStateCnt++] = 26;
+ break;
+ case 30:
+ if (curChar == 37)
+ jjCheckNAddStates(9, 14);
+ break;
+ case 31:
+ if ((0xfffffffffffffbffL & l) != 0L)
+ jjCheckNAddTwoStates(31, 32);
+ break;
+ case 32:
+ if (curChar == 10 && kind > 2)
+ kind = 2;
+ break;
+ case 33:
+ if ((0xffffffffffffdfffL & l) != 0L)
+ jjCheckNAddTwoStates(33, 34);
+ break;
+ case 34:
+ if (curChar == 13 && kind > 3)
+ kind = 3;
+ break;
+ case 35:
+ if ((0xffffffffffffdfffL & l) != 0L)
+ jjCheckNAddTwoStates(35, 37);
+ break;
+ case 36:
+ if (curChar == 10 && kind > 4)
+ kind = 4;
+ break;
+ case 37:
+ if (curChar == 13)
+ jjstateSet[jjnewStateCnt++] = 36;
+ break;
+ case 38:
+ if (curChar == 45)
+ jjCheckNAddStates(18, 23);
+ break;
+ case 39:
+ if ((0x3ff000000000000L & l) == 0L)
+ break;
+ if (kind > 5)
+ kind = 5;
+ jjCheckNAddTwoStates(39, 4);
+ break;
+ case 40:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddTwoStates(40, 41);
+ break;
+ case 41:
+ if (curChar != 46)
+ break;
+ if (kind > 8)
+ kind = 8;
+ jjCheckNAddStates(31, 33);
+ break;
+ case 42:
+ if ((0x3ff000000000000L & l) == 0L)
+ break;
+ if (kind > 8)
+ kind = 8;
+ jjCheckNAddStates(31, 33);
+ break;
+ case 44:
+ if ((0x280000000000L & l) != 0L)
+ jjCheckNAdd(45);
+ break;
+ case 45:
+ if ((0x3ff000000000000L & l) == 0L)
+ break;
+ if (kind > 8)
+ kind = 8;
+ jjCheckNAddTwoStates(45, 10);
+ break;
+ case 46:
+ if (curChar == 46)
+ jjCheckNAdd(47);
+ break;
+ case 47:
+ if ((0x3ff000000000000L & l) == 0L)
+ break;
+ if (kind > 8)
+ kind = 8;
+ jjCheckNAddStates(34, 36);
+ break;
+ case 49:
+ if ((0x280000000000L & l) != 0L)
+ jjCheckNAdd(50);
+ break;
+ case 50:
+ if ((0x3ff000000000000L & l) == 0L)
+ break;
+ if (kind > 8)
+ kind = 8;
+ jjCheckNAddTwoStates(50, 10);
+ break;
+ case 51:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddTwoStates(51, 52);
+ break;
+ case 53:
+ if ((0x280000000000L & l) != 0L)
+ jjCheckNAdd(54);
+ break;
+ case 54:
+ if ((0x3ff000000000000L & l) == 0L)
+ break;
+ if (kind > 8)
+ kind = 8;
+ jjCheckNAddTwoStates(54, 10);
+ break;
+ case 55:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddStates(37, 39);
+ break;
+ case 57:
+ if ((0x280000000000L & l) != 0L)
+ jjCheckNAdd(58);
+ break;
+ case 58:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddTwoStates(58, 10);
+ break;
+ case 59:
+ if ((0x3ff000000000000L & l) == 0L)
+ break;
+ if (kind > 5)
+ kind = 5;
+ jjCheckNAddStates(0, 8);
+ break;
+ case 60:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddTwoStates(60, 61);
+ break;
+ case 61:
+ if (curChar != 46)
+ break;
+ if (kind > 8)
+ kind = 8;
+ jjCheckNAddStates(40, 42);
+ break;
+ case 62:
+ if ((0x3ff000000000000L & l) == 0L)
+ break;
+ if (kind > 8)
+ kind = 8;
+ jjCheckNAddStates(40, 42);
+ break;
+ case 64:
+ if ((0x280000000000L & l) != 0L)
+ jjCheckNAdd(65);
+ break;
+ case 65:
+ if ((0x3ff000000000000L & l) == 0L)
+ break;
+ if (kind > 8)
+ kind = 8;
+ jjCheckNAddTwoStates(65, 10);
+ break;
+ case 66:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddTwoStates(66, 67);
+ break;
+ case 68:
+ if ((0x280000000000L & l) != 0L)
+ jjCheckNAdd(69);
+ break;
+ case 69:
+ if ((0x3ff000000000000L & l) == 0L)
+ break;
+ if (kind > 8)
+ kind = 8;
+ jjCheckNAddTwoStates(69, 10);
+ break;
+ case 70:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddStates(43, 45);
+ break;
+ case 72:
+ if ((0x280000000000L & l) != 0L)
+ jjCheckNAdd(73);
+ break;
+ case 73:
+ if ((0x3ff000000000000L & l) != 0L)
+ jjCheckNAddTwoStates(73, 10);
+ break;
+ default : break;
+ }
+ } while(i != startsAt);
+ }
+ else if (curChar < 128)
+ {
+ long l = 1L << (curChar & 077);
+ MatchLoop: do
+ {
+ switch(jjstateSet[--i])
+ {
+ case 0:
+ case 21:
+ if ((0x7fffffe87fffffeL & l) == 0L)
+ break;
+ if (kind > 11)
+ kind = 11;
+ jjCheckNAdd(21);
+ break;
+ case 2:
+ if ((0x100000001000000L & l) != 0L)
+ jjCheckNAdd(3);
+ break;
+ case 3:
+ if ((0x7e0000007eL & l) == 0L)
+ break;
+ if (kind > 5)
+ kind = 5;
+ jjCheckNAddTwoStates(3, 4);
+ break;
+ case 4:
+ if ((0x100000001000L & l) != 0L && kind > 5)
+ kind = 5;
+ break;
+ case 7:
+ if ((0x2000000020L & l) != 0L)
+ jjAddStates(46, 47);
+ break;
+ case 10:
+ if ((0x5000000050L & l) != 0L && kind > 8)
+ kind = 8;
+ break;
+ case 12:
+ if ((0xffffffffefffffffL & l) != 0L)
+ jjCheckNAddStates(15, 17);
+ break;
+ case 13:
+ if (curChar == 92)
+ jjAddStates(48, 50);
+ break;
+ case 14:
+ if ((0x14404410000000L & l) != 0L)
+ jjCheckNAddStates(15, 17);
+ break;
+ case 24:
+ case 25:
+ if ((0x7fffffe87fffffeL & l) == 0L)
+ break;
+ if (kind > 12)
+ kind = 12;
+ jjCheckNAdd(25);
+ break;
+ case 27:
+ case 28:
+ if ((0x7fffffe87fffffeL & l) == 0L)
+ break;
+ if (kind > 13)
+ kind = 13;
+ jjCheckNAdd(28);
+ break;
+ case 31:
+ jjAddStates(51, 52);
+ break;
+ case 33:
+ jjAddStates(53, 54);
+ break;
+ case 35:
+ jjAddStates(55, 56);
+ break;
+ case 43:
+ if ((0x2000000020L & l) != 0L)
+ jjAddStates(57, 58);
+ break;
+ case 48:
+ if ((0x2000000020L & l) != 0L)
+ jjAddStates(59, 60);
+ break;
+ case 52:
+ if ((0x2000000020L & l) != 0L)
+ jjAddStates(61, 62);
+ break;
+ case 56:
+ if ((0x2000000020L & l) != 0L)
+ jjAddStates(63, 64);
+ break;
+ case 63:
+ if ((0x2000000020L & l) != 0L)
+ jjAddStates(65, 66);
+ break;
+ case 67:
+ if ((0x2000000020L & l) != 0L)
+ jjAddStates(67, 68);
+ break;
+ case 71:
+ if ((0x2000000020L & l) != 0L)
+ jjAddStates(69, 70);
+ break;
+ default : break;
+ }
+ } while(i != startsAt);
+ }
+ else
+ {
+ int hiByte = (int)(curChar >> 8);
+ int i1 = hiByte >> 6;
+ long l1 = 1L << (hiByte & 077);
+ int i2 = (curChar & 0xff) >> 6;
+ long l2 = 1L << (curChar & 077);
+ MatchLoop: do
+ {
+ switch(jjstateSet[--i])
+ {
+ case 0:
+ case 21:
+ if (!jjCanMove_1(hiByte, i1, i2, l1, l2))
+ break;
+ if (kind > 11)
+ kind = 11;
+ jjCheckNAdd(21);
+ break;
+ case 12:
+ if (jjCanMove_0(hiByte, i1, i2, l1, l2))
+ jjAddStates(15, 17);
+ break;
+ case 24:
+ case 25:
+ if (!jjCanMove_1(hiByte, i1, i2, l1, l2))
+ break;
+ if (kind > 12)
+ kind = 12;
+ jjCheckNAdd(25);
+ break;
+ case 27:
+ case 28:
+ if (!jjCanMove_1(hiByte, i1, i2, l1, l2))
+ break;
+ if (kind > 13)
+ kind = 13;
+ jjCheckNAdd(28);
+ break;
+ case 31:
+ if (jjCanMove_0(hiByte, i1, i2, l1, l2))
+ jjAddStates(51, 52);
+ break;
+ case 33:
+ if (jjCanMove_0(hiByte, i1, i2, l1, l2))
+ jjAddStates(53, 54);
+ break;
+ case 35:
+ if (jjCanMove_0(hiByte, i1, i2, l1, l2))
+ jjAddStates(55, 56);
+ break;
+ default : break;
+ }
+ } while(i != startsAt);
+ }
+ if (kind != 0x7fffffff)
+ {
+ jjmatchedKind = kind;
+ jjmatchedPos = curPos;
+ kind = 0x7fffffff;
+ }
+ ++curPos;
+ if ((i = jjnewStateCnt) == (startsAt = 74 - (jjnewStateCnt = startsAt)))
+ return curPos;
+ try { curChar = input_stream.readChar(); }
+ catch(java.io.IOException e) { return curPos; }
+ }
+}
+private final int jjStopStringLiteralDfa_1(int pos, long active0)
+{
+ switch (pos)
+ {
+ default :
+ return -1;
+ }
+}
+private final int jjStartNfa_1(int pos, long active0)
+{
+ return jjMoveNfa_1(jjStopStringLiteralDfa_1(pos, active0), pos + 1);
+}
+private final int jjStartNfaWithStates_1(int pos, int kind, int state)
+{
+ jjmatchedKind = kind;
+ jjmatchedPos = pos;
+ try { curChar = input_stream.readChar(); }
+ catch(java.io.IOException e) { return pos + 1; }
+ return jjMoveNfa_1(state, pos + 1);
+}
+private final int jjMoveStringLiteralDfa0_1()
+{
+ switch(curChar)
+ {
+ case 62:
+ return jjStopAtPos(0, 23);
+ default :
+ return jjMoveNfa_1(0, 0);
+ }
+}
+private final int jjMoveNfa_1(int startState, int curPos)
+{
+ int[] nextStates;
+ int startsAt = 0;
+ jjnewStateCnt = 1;
+ int i = 1;
+ jjstateSet[0] = startState;
+ int j, kind = 0x7fffffff;
+ for (;;)
+ {
+ if (++jjround == 0x7fffffff)
+ ReInitRounds();
+ if (curChar < 64)
+ {
+ long l = 1L << curChar;
+ MatchLoop: do
+ {
+ switch(jjstateSet[--i])
+ {
+ case 0:
+ if ((0xbfffffffffffffffL & l) != 0L)
+ kind = 22;
+ break;
+ default : break;
+ }
+ } while(i != startsAt);
+ }
+ else if (curChar < 128)
+ {
+ long l = 1L << (curChar & 077);
+ MatchLoop: do
+ {
+ switch(jjstateSet[--i])
+ {
+ case 0:
+ kind = 22;
+ break;
+ default : break;
+ }
+ } while(i != startsAt);
+ }
+ else
+ {
+ int hiByte = (int)(curChar >> 8);
+ int i1 = hiByte >> 6;
+ long l1 = 1L << (hiByte & 077);
+ int i2 = (curChar & 0xff) >> 6;
+ long l2 = 1L << (curChar & 077);
+ MatchLoop: do
+ {
+ switch(jjstateSet[--i])
+ {
+ case 0:
+ if (jjCanMove_0(hiByte, i1, i2, l1, l2) && kind > 22)
+ kind = 22;
+ break;
+ default : break;
+ }
+ } while(i != startsAt);
+ }
+ if (kind != 0x7fffffff)
+ {
+ jjmatchedKind = kind;
+ jjmatchedPos = curPos;
+ kind = 0x7fffffff;
+ }
+ ++curPos;
+ if ((i = jjnewStateCnt) == (startsAt = 1 - (jjnewStateCnt = startsAt)))
+ return curPos;
+ try { curChar = input_stream.readChar(); }
+ catch(java.io.IOException e) { return curPos; }
+ }
+}
+static final int[] jjnextStates = {
+ 39, 4, 60, 61, 66, 67, 70, 71, 10, 31, 32, 33, 34, 35, 37, 12,
+ 13, 15, 39, 1, 40, 46, 51, 55, 6, 7, 10, 12, 13, 17, 15, 42,
+ 43, 10, 47, 48, 10, 55, 56, 10, 62, 63, 10, 70, 71, 10, 8, 9,
+ 14, 16, 18, 31, 32, 33, 34, 35, 37, 44, 45, 49, 50, 53, 54, 57,
+ 58, 64, 65, 68, 69, 72, 73,
+};
+private static final boolean jjCanMove_0(int hiByte, int i1, int i2, long l1, long l2)
+{
+ switch(hiByte)
+ {
+ case 0:
+ return ((jjbitVec2[i2] & l2) != 0L);
+ default :
+ if ((jjbitVec0[i1] & l1) != 0L)
+ return true;
+ return false;
+ }
+}
+private static final boolean jjCanMove_1(int hiByte, int i1, int i2, long l1, long l2)
+{
+ switch(hiByte)
+ {
+ case 0:
+ return ((jjbitVec4[i2] & l2) != 0L);
+ case 48:
+ return ((jjbitVec5[i2] & l2) != 0L);
+ case 49:
+ return ((jjbitVec6[i2] & l2) != 0L);
+ case 51:
+ return ((jjbitVec7[i2] & l2) != 0L);
+ case 61:
+ return ((jjbitVec8[i2] & l2) != 0L);
+ default :
+ if ((jjbitVec3[i1] & l1) != 0L)
+ return true;
+ return false;
+ }
+}
+public static final String[] jjstrLiteralImages = {
+"", null, null, null, null, null, null, null, null, null, null, null, null,
+null, null, null, "\173", "\175", "\133", "\135", "\74\74", "\76\76", null, null,
+"\74", };
+public static final String[] lexStateNames = {
+ "DEFAULT",
+ "WITHINSTRING",
+};
+public static final int[] jjnewLexState = {
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1,
+};
+static final long[] jjtoToken = {
+ 0x1bf3d21L,
+};
+static final long[] jjtoSkip = {
+ 0x1eL,
+};
+static final long[] jjtoMore = {
+ 0x400000L,
+};
+private JavaCharStream input_stream;
+private final int[] jjrounds = new int[74];
+private final int[] jjstateSet = new int[148];
+StringBuffer image;
+int jjimageLen;
+int lengthOfMatch;
+protected char curChar;
+public PAParserTokenManager(JavaCharStream stream)
+{
+ if (JavaCharStream.staticFlag)
+ throw new Error("ERROR: Cannot use a static CharStream class with a non-static lexical analyzer.");
+ input_stream = stream;
+}
+public PAParserTokenManager(JavaCharStream stream, int lexState)
+{
+ this(stream);
+ SwitchTo(lexState);
+}
+public void ReInit(JavaCharStream stream)
+{
+ jjmatchedPos = jjnewStateCnt = 0;
+ curLexState = defaultLexState;
+ input_stream = stream;
+ ReInitRounds();
+}
+private final void ReInitRounds()
+{
+ int i;
+ jjround = 0x80000001;
+ for (i = 74; i-- > 0;)
+ jjrounds[i] = 0x80000000;
+}
+public void ReInit(JavaCharStream stream, int lexState)
+{
+ ReInit(stream);
+ SwitchTo(lexState);
+}
+public void SwitchTo(int lexState)
+{
+ if (lexState >= 2 || lexState < 0)
+ throw new TokenMgrError("Error: Ignoring invalid lexical state : " + lexState + ". State unchanged.", TokenMgrError.INVALID_LEXICAL_STATE);
+ else
+ curLexState = lexState;
+}
+
+private final Token jjFillToken()
+{
+ Token t = Token.newToken(jjmatchedKind);
+ t.kind = jjmatchedKind;
+ String im = jjstrLiteralImages[jjmatchedKind];
+ t.image = (im == null) ? input_stream.GetImage() : im;
+ t.beginLine = input_stream.getBeginLine();
+ t.beginColumn = input_stream.getBeginColumn();
+ t.endLine = input_stream.getEndLine();
+ t.endColumn = input_stream.getEndColumn();
+ return t;
+}
+
+int curLexState = 0;
+int defaultLexState = 0;
+int jjnewStateCnt;
+int jjround;
+int jjmatchedPos;
+int jjmatchedKind;
+
+public final Token getNextToken()
+{
+ int kind;
+ Token specialToken = null;
+ Token matchedToken;
+ int curPos = 0;
+
+ EOFLoop :
+ for (;;)
+ {
+ try
+ {
+ curChar = input_stream.BeginToken();
+ }
+ catch(java.io.IOException e)
+ {
+ jjmatchedKind = 0;
+ matchedToken = jjFillToken();
+ return matchedToken;
+ }
+ image = null;
+ jjimageLen = 0;
+
+ for (;;)
+ {
+ switch(curLexState)
+ {
+ case 0:
+ jjmatchedKind = 0x7fffffff;
+ jjmatchedPos = 0;
+ curPos = jjMoveStringLiteralDfa0_0();
+ break;
+ case 1:
+ jjmatchedKind = 0x7fffffff;
+ jjmatchedPos = 0;
+ curPos = jjMoveStringLiteralDfa0_1();
+ break;
+ }
+ if (jjmatchedKind != 0x7fffffff)
+ {
+ if (jjmatchedPos + 1 < curPos)
+ input_stream.backup(curPos - jjmatchedPos - 1);
+ if ((jjtoToken[jjmatchedKind >> 6] & (1L << (jjmatchedKind & 077))) != 0L)
+ {
+ matchedToken = jjFillToken();
+ TokenLexicalActions(matchedToken);
+ if (jjnewLexState[jjmatchedKind] != -1)
+ curLexState = jjnewLexState[jjmatchedKind];
+ return matchedToken;
+ }
+ else if ((jjtoSkip[jjmatchedKind >> 6] & (1L << (jjmatchedKind & 077))) != 0L)
+ {
+ if (jjnewLexState[jjmatchedKind] != -1)
+ curLexState = jjnewLexState[jjmatchedKind];
+ continue EOFLoop;
+ }
+ jjimageLen += jjmatchedPos + 1;
+ if (jjnewLexState[jjmatchedKind] != -1)
+ curLexState = jjnewLexState[jjmatchedKind];
+ curPos = 0;
+ jjmatchedKind = 0x7fffffff;
+ try {
+ curChar = input_stream.readChar();
+ continue;
+ }
+ catch (java.io.IOException e1) { }
+ }
+ int error_line = input_stream.getEndLine();
+ int error_column = input_stream.getEndColumn();
+ String error_after = null;
+ boolean EOFSeen = false;
+ try { input_stream.readChar(); input_stream.backup(1); }
+ catch (java.io.IOException e1) {
+ EOFSeen = true;
+ error_after = curPos <= 1 ? "" : input_stream.GetImage();
+ if (curChar == '\n' || curChar == '\r') {
+ error_line++;
+ error_column = 0;
+ }
+ else
+ error_column++;
+ }
+ if (!EOFSeen) {
+ input_stream.backup(1);
+ error_after = curPos <= 1 ? "" : input_stream.GetImage();
+ }
+ throw new TokenMgrError(EOFSeen, curLexState, error_line, error_column, error_after, curChar, TokenMgrError.LEXICAL_ERROR);
+ }
+ }
+}
+
+final void TokenLexicalActions(Token matchedToken)
+{
+ switch(jjmatchedKind)
+ {
+ case 23 :
+ if (image == null)
+ image = new StringBuffer(new String(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1))));
+ else
+ image.append(input_stream.GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1)));
+ matchedToken.image=image.toString().substring(0,image.toString().length()-1);
+ break;
+ default :
+ break;
+ }
+}
+}
diff --git a/src/main/java/com/lowagie/text/pdf/codec/postscript/PAPencil.java b/src/main/java/com/lowagie/text/pdf/codec/postscript/PAPencil.java
new file mode 100644
index 0000000..5612603
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/codec/postscript/PAPencil.java
@@ -0,0 +1,431 @@
+/*
+ * Copyright 1998 by Sun Microsystems, Inc.,
+ * 901 San Antonio Road, Palo Alto, California, 94303, U.S.A.
+ * All rights reserved.
+ *
+ * This software is the confidential and proprietary information
+ * of Sun Microsystems, Inc. ("Confidential Information"). You
+ * shall not disclose such Confidential Information and shall use
+ * it only in accordance with the terms of the license agreement
+ * you entered into with Sun.
+ */
+
+package com.lowagie.text.pdf.codec.postscript;
+
+import java.util.*;
+import java.awt.*;
+import java.awt.font.*;
+import java.awt.geom.*;
+import com.lowagie.text.pdf.PdfContentByte;
+import com.lowagie.text.pdf.PdfGraphics2D;
+
+
+public class PAPencil {
+
+ static protected class State implements Cloneable {
+ public Stroke stroke;
+ public Paint paint;
+ public AffineTransform at;
+ public Shape clipShape;
+ public Font font;
+ public Composite composite;
+ public GeneralPath path;
+
+ public State(){
+ this(null);
+ }
+
+ public State(Graphics2D g){
+ if(g == null){
+ this.stroke = new BasicStroke();
+ this.paint = Color.black;
+ this.at = new AffineTransform();
+ this.font = new Font("SansSerif", Font.PLAIN, 12);
+ this.composite = AlphaComposite.getInstance(AlphaComposite.DST_OVER, 1.0f);
+ this.clipShape = null;
+ } else {
+ this.recordState(g);
+ }
+ this.path = new GeneralPath();
+ }
+
+ public void recordState(Graphics2D g){
+ this.stroke = g.getStroke();
+ this.paint = g.getPaint();
+ this.at = g.getTransform();
+ this.font = g.getFont();
+ this.composite = g.getComposite();
+ this.clipShape = g.getClip();
+ }
+
+ public void stampState(Graphics2D g, Dimension size){
+ g.setTransform(new AffineTransform());
+ g.setClip(new Rectangle(0, 0, size.width, size.height));
+ g.setStroke(this.stroke);
+ g.setPaint(this.paint);
+ g.setTransform(this.at);
+ g.setFont(this.font);
+ g.setComposite(this.composite);
+ if(this.clipShape != null){
+ g.clip(this.clipShape);
+ }
+ }
+
+ public Object clone(){
+ try {
+ State n = (State)super.clone();
+
+ n.at = (AffineTransform) this.at.clone();
+ n.path = new GeneralPath();
+ n.path.append(this.path, false);
+ return n;
+ } catch(CloneNotSupportedException e){
+ throw new InternalError();
+ }
+ }
+
+ }
+
+ //
+ // Class Variables
+ //
+
+ //
+ // Instance Variables
+ //
+
+ /**
+ * The canvas size.
+ */
+ protected Dimension size;
+
+ /**
+ * The current graphics state.
+ */
+ protected State state;
+
+ /**
+ * The stack of graphic states.
+ */
+ protected Stack gStack;
+
+ /**
+ * The font hashtable with postscript names as keys
+ */
+ protected HashMap fonts;
+
+ /**
+ * The current graphics device
+ */
+ public Graphics2D graphics;
+
+ //
+ // Constructors
+ //
+
+ public PAPencil(Component component){
+ this.graphics = (Graphics2D) component.getGraphics();
+ this.size = component.getSize();
+ this.initgraphics();
+ }
+
+ public PAPencil(Graphics graphics, Dimension size){
+ this.graphics = (Graphics2D) graphics;
+ this.size = size;
+ this.initgraphics();
+ }
+
+ //
+ // Graphics state management
+ //
+
+ public void gsave(){
+ this.state.recordState(this.graphics);
+ State next = (State) this.state.clone();
+
+ this.gStack.push(this.state);
+ this.state = next;
+ }
+
+ public void grestore(){
+ if(this.gStack.empty()){
+ this.initgraphics();
+ } else {
+ this.state = (State) this.gStack.pop();
+ this.state.stampState(this.graphics, this.size);
+ }
+ }
+
+ public void grestoreall(){
+ this.initgraphics();
+ }
+
+ public void initgraphics(){
+ AffineTransform at = new AffineTransform();
+ // turn anti-aliasing and high-quality rendering on
+ this.graphics.setRenderingHints(new RenderingHints(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON));
+ this.graphics.setRenderingHints(new RenderingHints(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY));
+
+ // initialize to a postscript coordinate system
+ at.translate(0, this.size.getHeight());
+ at.scale(1, -1);
+ this.graphics.setTransform(at);
+ // this.graphics.translate(0, this.size.getHeight());
+ // this.graphics.scale(1, -1);
+
+ // state, stack and page
+ this.state = new State(this.graphics);
+ this.gStack = new Stack();
+ this.erasepage();
+ }
+
+ //
+ // Path definition
+ //
+
+ public void newpath(){
+ this.state.path.reset();
+ }
+
+ public void moveto(double x, double y){
+ this.state.path.moveTo((float) x, (float) y);
+ }
+
+ public void moveto(Point2D p) {
+ this.moveto(p.getX(), p.getY());
+ }
+
+ public void rmoveto(double dx, double dy) throws PainterException {
+ Point2D currentPoint = this.state.path.getCurrentPoint();
+
+ if(currentPoint == null){
+ throw new PainterException("no current point");
+ }
+ this.state.path.moveTo((float) (currentPoint.getX() + dx) , (float) (currentPoint.getY() + dy));
+ }
+
+ public void lineto(double x, double y) throws PainterException {
+ Point2D currentPoint = this.state.path.getCurrentPoint();
+
+ if(currentPoint == null){
+ throw new PainterException("no current point");
+ }
+ this.state.path.lineTo((float) x, (float) y);
+ }
+
+ public void lineto(Point2D p) throws PainterException {
+ this.lineto(p.getX(), p.getY());
+ }
+
+ public void rlineto(double dx, double dy) throws PainterException {
+ Point2D currentPoint = this.state.path.getCurrentPoint();
+
+ if(currentPoint == null){
+ throw new PainterException("no current point");
+ }
+ this.state.path.lineTo((float) (currentPoint.getX() + dx) , (float) (currentPoint.getY() + dy));
+ }
+
+ /**
+ *
+ * @param cx double Centerpoint x
+ * @param cy double Centerpoint y
+ * @param r double Radius r
+ * @param ang1 double first angle
+ * @param ang2 double second angle
+ */
+ public void arc(double cx, double cy, double r, double ang1, double ang2){
+ Arc2D.Float arc = new Arc2D.Float((float) ( cx - r ), (float) ( cy
+ - r ), (float) r * 2f, (float) r * 2f,- (float) ang1,- (float) ( ang2 -
+ ang1 ), Arc2D.OPEN );
+ Point2D currentPoint = this.state.path.getCurrentPoint();
+ if(currentPoint == null){
+ this.state.path.append(arc, false);
+ } else {
+ this.state.path.append(arc, true);
+ }
+ }
+
+ public void arcn(double cx, double cy, double r, double ang1, double ang2) {
+ Arc2D.Float arc = new Arc2D.Float((float) ( cx - r ), (float)
+ ( cy - r ), (float) r * 2f, (float) r * 2f,- (float) ang1, -(float) (
+ ang2 - ang1 ), Arc2D.OPEN );
+ Point2D currentPoint = this.state.path.getCurrentPoint();
+ if(currentPoint == null){
+ this.state.path.append(arc, false);
+ } else {
+ this.state.path.append(arc, true);
+ }
+ }
+
+ public void curveto(double x1, double y1, double x2, double y2,
+ double x3, double y3) throws PainterException {
+ Point2D currentPoint = this.state.path.getCurrentPoint();
+
+ if(currentPoint == null){
+ throw new PainterException("no current point");
+ }
+ this.state.path.curveTo((float) x1, (float) y1, (float) x2, (float) y2,
+ (float) x3, (float) y3);
+ }
+
+ public void rcurveto(double dx1, double dy1, double dx2, double dy2,
+ double dx3, double dy3) throws PainterException {
+ Point2D currentPoint = this.state.path.getCurrentPoint();
+
+ if(currentPoint == null){
+ throw new PainterException("no current point");
+ }
+ double x0 = currentPoint.getX();
+ double y0 = currentPoint.getY();
+ this.curveto(x0 + dx1, y0 + dy1, x0 + dx2, y0 + dy2, x0 + dx3,y0 + dy3);
+ }
+
+ public void closepath(){
+ this.state.path.closePath();
+ }
+
+ // PENDING(uweh): just a placeholder for now
+ public void clippath(){
+ this.rectpath(0.0d, 0.0d, size.width, size.height);
+ }
+ public void clip(){
+ PdfGraphics2D pdfg2d = (PdfGraphics2D) this.graphics;
+ pdfg2d.clip(this.state.path);
+ this.newpath();
+// Area currentclip=new Area(this.state.clipShape);
+// Area addclip=new Area(this.state.path.createTransformedShape(AffineTransform.getTranslateInstance(0,0)));
+// currentclip.intersect(addclip);
+// this.graphics.clip(currentclip );
+ }
+ public void erasepage(){
+ this.graphics.clearRect(0, 0, size.width, size.height);
+ }
+
+ public void charpath(String aString, boolean adjustForStroking)throws PainterException{
+ FontRenderContext frc=this.graphics.getFontRenderContext();
+ Font fn=this.state.font;
+// System.out.println("Fonthoehe:"+fn.getSize2D());
+ GlyphVector glyphVector = fn.createGlyphVector(frc, aString);
+ Point2D currentPoint = this.state.path.getCurrentPoint();
+ Shape glyphShape = glyphVector.getOutline();
+ AffineTransform currentTransform = AffineTransform.getScaleInstance(1,-1);
+ glyphShape=currentTransform.createTransformedShape(glyphShape);
+ AffineTransform currentTransform2 = AffineTransform.getTranslateInstance((float)currentPoint.getX(),(float)currentPoint.getY());
+ glyphShape=currentTransform2.createTransformedShape(glyphShape);
+ this.state.path.append(glyphShape, false);
+ }
+
+ public void showpage(){
+ PdfGraphics2D pdfg2d = (PdfGraphics2D) this.graphics;
+ PdfContentByte cb = pdfg2d.getContent();
+ try {
+ cb.getPdfWriter().newPage();
+ }
+ catch (com.lowagie.text.DocumentException ex) {
+ ex.printStackTrace();
+ }
+ }
+
+ public void show(String string) throws PainterException {
+ Point2D currentPoint = this.state.path.getCurrentPoint();
+ AffineTransform currentTransform = this.graphics.getTransform();
+ Point2D tranformedPoint = currentTransform.transform(currentPoint, null);
+
+ if(currentPoint == null){
+ throw new PainterException("no current point");
+ }
+ this.graphics.setTransform(new AffineTransform());
+ this.graphics.drawString(string, (float) tranformedPoint.getX(), (float) tranformedPoint.getY());
+ this.graphics.setTransform(currentTransform);
+ }
+
+ public void fill(){
+ this.graphics.fill(this.state.path);
+ this.newpath();
+ }
+
+ public void eofill(){
+ this.state.path.setWindingRule(GeneralPath.WIND_EVEN_ODD);
+ this.graphics.fill(this.state.path);
+ this.state.path.setWindingRule(GeneralPath.WIND_NON_ZERO);
+ this.newpath();
+ }
+
+ public void stroke()throws PainterException{
+ this.graphics.draw(this.state.path);
+ this.newpath();
+
+ }
+
+ public void rectfill(double x, double y, double width, double height){
+ this.gsave();
+ this.rectpath(x, y, width, height);
+ this.fill();
+ this.grestore();
+ }
+
+ public void rectfill(Rectangle2D rect){
+ this.rectfill(rect.getX(), rect.getY(), rect.getWidth(), rect.getHeight());
+ }
+
+ public void rectstroke(double x, double y, double width, double height)throws PainterException{
+ this.gsave();
+ this.rectpath(x, y, width, height);
+ this.stroke();
+ this.grestore();
+ }
+
+ public void rectstroke(Rectangle2D rect)throws PainterException{
+ this.rectstroke(rect.getX(), rect.getY(), rect.getWidth(), rect.getHeight());
+ }
+
+ public void rectpath(double x, double y, double width, double height){
+ this.newpath();
+ this.moveto(x, y);
+ try {
+ this.rlineto(width, 0);
+ this.rlineto(0, height);
+ this.rlineto(-width, 0);
+ } catch(PainterException e){
+ }
+ this.closepath();
+ }
+
+ // convenience
+
+ // this guy tries to find an appropiate font
+ // if he fails returns whatever font he wants
+ public Font findFont(String fontname){
+ Font result;
+ StringBuffer buffer = new StringBuffer(fontname);
+ int i, n;
+ n = buffer.length();
+
+ for(i = 0; i < n; i++){
+ if(buffer.charAt(i) == '-'){
+ buffer.setCharAt(i,' ');
+ }
+ }
+
+ fontname = buffer.toString();
+
+ if(this.fonts == null){
+ // construct the fonts dictionary
+ GraphicsEnvironment genv = GraphicsEnvironment.getLocalGraphicsEnvironment();
+ Font[] fontArray = genv.getAllFonts();
+ this.fonts = new HashMap();
+ for(i = 0; i < fontArray.length; i++){
+ String postscriptName = fontArray[i].getPSName();
+ this.fonts.put(postscriptName, fontArray[i]);
+ }
+ }
+ result = (Font) this.fonts.get(fontname);
+ if(result == null){
+// result = new Font("SansSerif", Font.PLAIN, 12);
+ result = new Font("Arial", Font.PLAIN, 12);
+ }
+ return result;
+ }
+}
+
diff --git a/src/main/java/com/lowagie/text/pdf/codec/postscript/PAToken.java b/src/main/java/com/lowagie/text/pdf/codec/postscript/PAToken.java
new file mode 100644
index 0000000..52f347e
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/codec/postscript/PAToken.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright 1998 by Sun Microsystems, Inc.,
+ * 901 San Antonio Road, Palo Alto, California, 94303, U.S.A.
+ * All rights reserved.
+ *
+ * This software is the confidential and proprietary information
+ * of Sun Microsystems, Inc. ("Confidential Information"). You
+ * shall not disclose such Confidential Information and shall use
+ * it only in accordance with the terms of the license agreement
+ * you entered into with Sun.
+ */
+
+package com.lowagie.text.pdf.codec.postscript;
+
+public class PAToken {
+
+ static public final int IDENTIFIER = 0;
+ static public final int KEY = 1;
+ static public final int PROCEDURE = 2;
+ static public final int MARK = 3;
+ static public final int START_PROCEDURE = 4;
+ static public final int END_PROCEDURE = 5;
+ static public final int IMMEDIATE = 6;
+ static public final int START_ARRAY = 7;
+ static public final int END_ARRAY = 8;
+ static public final int START_DICT = 9;
+ static public final int END_DICT = 10;
+
+ public Object value;
+ public int type;
+
+ public PAToken(Object value, int type) {
+ super();
+ this.value = value;
+ this.type = type;
+ }
+
+ public String toString() {
+ switch (this.type) {
+ case IDENTIFIER:
+ return "IDENTIFIER " + this.value.toString();
+ case KEY:
+ return "KEY " + this.value.toString();
+ case PROCEDURE:
+ return "PROCEDURE " + this.value.toString();
+ case MARK:
+ return "MARK";
+ case START_PROCEDURE:
+ return "START_PROCEDURE";
+ case END_PROCEDURE:
+ return "END_PROCEDURE";
+ case IMMEDIATE:
+ return "IMMEDIATE " + this.value.toString();
+ case START_ARRAY:
+ return "START_ARRAY";
+ case END_ARRAY:
+ return "END_ARRAY";
+ case START_DICT:
+ return "START_DICT";
+ case END_DICT:
+ return "END_DICT";
+ }
+ return this.value.toString();
+ }
+
+}
diff --git a/src/main/java/com/lowagie/text/pdf/codec/postscript/PainterException.java b/src/main/java/com/lowagie/text/pdf/codec/postscript/PainterException.java
new file mode 100644
index 0000000..236eece
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/codec/postscript/PainterException.java
@@ -0,0 +1,20 @@
+/*
+ * Copyright 1998 by Sun Microsystems, Inc.,
+ * 901 San Antonio Road, Palo Alto, California, 94303, U.S.A.
+ * All rights reserved.
+ *
+ * This software is the confidential and proprietary information
+ * of Sun Microsystems, Inc. ("Confidential Information"). You
+ * shall not disclose such Confidential Information and shall use
+ * it only in accordance with the terms of the license agreement
+ * you entered into with Sun.
+ */
+
+package com.lowagie.text.pdf.codec.postscript;
+
+public class PainterException extends Exception {
+
+ public PainterException(String msg){
+ super(msg);
+ }
+}
diff --git a/src/main/java/com/lowagie/text/pdf/codec/postscript/ParseException.java b/src/main/java/com/lowagie/text/pdf/codec/postscript/ParseException.java
new file mode 100644
index 0000000..4bf572e
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/codec/postscript/ParseException.java
@@ -0,0 +1,192 @@
+/* Generated By:JavaCC: Do not edit this line. ParseException.java Version 2.1 */
+package com.lowagie.text.pdf.codec.postscript;
+
+/**
+ * This exception is thrown when parse errors are encountered.
+ * You can explicitly create objects of this exception type by
+ * calling the method generateParseException in the generated
+ * parser.
+ *
+ * You can modify this class to customize your error reporting
+ * mechanisms so long as you retain the public fields.
+ */
+public class ParseException extends Exception {
+
+ /**
+ * This constructor is used by the method "generateParseException"
+ * in the generated parser. Calling this constructor generates
+ * a new object of this type with the fields "currentToken",
+ * "expectedTokenSequences", and "tokenImage" set. The boolean
+ * flag "specialConstructor" is also set to true to indicate that
+ * this constructor was used to create this object.
+ * This constructor calls its super class with the empty string
+ * to force the "toString" method of parent class "Throwable" to
+ * print the error message in the form:
+ * ParseException: <result of getMessage>
+ */
+ public ParseException(Token currentTokenVal,
+ int[][] expectedTokenSequencesVal,
+ String[] tokenImageVal
+ )
+ {
+ super("");
+ specialConstructor = true;
+ currentToken = currentTokenVal;
+ expectedTokenSequences = expectedTokenSequencesVal;
+ tokenImage = tokenImageVal;
+ }
+
+ /**
+ * The following constructors are for use by you for whatever
+ * purpose you can think of. Constructing the exception in this
+ * manner makes the exception behave in the normal way - i.e., as
+ * documented in the class "Throwable". The fields "errorToken",
+ * "expectedTokenSequences", and "tokenImage" do not contain
+ * relevant information. The JavaCC generated code does not use
+ * these constructors.
+ */
+
+ public ParseException() {
+ super();
+ specialConstructor = false;
+ }
+
+ public ParseException(String message) {
+ super(message);
+ specialConstructor = false;
+ }
+
+ /**
+ * This variable determines which constructor was used to create
+ * this object and thereby affects the semantics of the
+ * "getMessage" method (see below).
+ */
+ protected boolean specialConstructor;
+
+ /**
+ * This is the last token that has been consumed successfully. If
+ * this object has been created due to a parse error, the token
+ * followng this token will (therefore) be the first error token.
+ */
+ public Token currentToken;
+
+ /**
+ * Each entry in this array is an array of integers. Each array
+ * of integers represents a sequence of tokens (by their ordinal
+ * values) that is expected at this point of the parse.
+ */
+ public int[][] expectedTokenSequences;
+
+ /**
+ * This is a reference to the "tokenImage" array of the generated
+ * parser within which the parse error occurred. This array is
+ * defined in the generated ...Constants interface.
+ */
+ public String[] tokenImage;
+
+ /**
+ * This method has the standard behavior when this object has been
+ * created using the standard constructors. Otherwise, it uses
+ * "currentToken" and "expectedTokenSequences" to generate a parse
+ * error message and returns it. If this object has been created
+ * due to a parse error, and you do not catch it (it gets thrown
+ * from the parser), then this method is called during the printing
+ * of the final stack trace, and hence the correct error message
+ * gets displayed.
+ */
+ public String getMessage() {
+ if (!specialConstructor) {
+ return super.getMessage();
+ }
+ String expected = "";
+ int maxSize = 0;
+ for (int i = 0; i < expectedTokenSequences.length; i++) {
+ if (maxSize < expectedTokenSequences[i].length) {
+ maxSize = expectedTokenSequences[i].length;
+ }
+ for (int j = 0; j < expectedTokenSequences[i].length; j++) {
+ expected += tokenImage[expectedTokenSequences[i][j]] + " ";
+ }
+ if (expectedTokenSequences[i][expectedTokenSequences[i].length - 1] != 0) {
+ expected += "...";
+ }
+ expected += eol + " ";
+ }
+ String retval = "Encountered \"";
+ Token tok = currentToken.next;
+ for (int i = 0; i < maxSize; i++) {
+ if (i != 0) retval += " ";
+ if (tok.kind == 0) {
+ retval += tokenImage[0];
+ break;
+ }
+ retval += add_escapes(tok.image);
+ tok = tok.next;
+ }
+ retval += "\" at line " + currentToken.next.beginLine + ", column " + currentToken.next.beginColumn;
+ retval += "." + eol;
+ if (expectedTokenSequences.length == 1) {
+ retval += "Was expecting:" + eol + " ";
+ } else {
+ retval += "Was expecting one of:" + eol + " ";
+ }
+ retval += expected;
+ return retval;
+ }
+
+ /**
+ * The end of line string for this machine.
+ */
+ protected String eol = System.getProperty("line.separator", "\n");
+
+ /**
+ * Used to convert raw characters to their escaped version
+ * when these raw version cannot be used as part of an ASCII
+ * string literal.
+ */
+ protected String add_escapes(String str) {
+ StringBuffer retval = new StringBuffer();
+ char ch;
+ for (int i = 0; i < str.length(); i++) {
+ switch (str.charAt(i))
+ {
+ case 0 :
+ continue;
+ case '\b':
+ retval.append("\\b");
+ continue;
+ case '\t':
+ retval.append("\\t");
+ continue;
+ case '\n':
+ retval.append("\\n");
+ continue;
+ case '\f':
+ retval.append("\\f");
+ continue;
+ case '\r':
+ retval.append("\\r");
+ continue;
+ case '\"':
+ retval.append("\\\"");
+ continue;
+ case '\'':
+ retval.append("\\\'");
+ continue;
+ case '\\':
+ retval.append("\\\\");
+ continue;
+ default:
+ if ((ch = str.charAt(i)) < 0x20 || ch > 0x7e) {
+ String s = "0000" + Integer.toString(ch, 16);
+ retval.append("\\u" + s.substring(s.length() - 4, s.length()));
+ } else {
+ retval.append(ch);
+ }
+ continue;
+ }
+ }
+ return retval.toString();
+ }
+
+}
diff --git a/src/main/java/com/lowagie/text/pdf/codec/postscript/Token.java b/src/main/java/com/lowagie/text/pdf/codec/postscript/Token.java
new file mode 100644
index 0000000..530e4de
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/codec/postscript/Token.java
@@ -0,0 +1,81 @@
+/* Generated By:JavaCC: Do not edit this line. Token.java Version 2.1 */
+package com.lowagie.text.pdf.codec.postscript;
+
+/**
+ * Describes the input token stream.
+ */
+
+public class Token {
+
+ /**
+ * An integer that describes the kind of this token. This numbering
+ * system is determined by JavaCCParser, and a table of these numbers is
+ * stored in the file ...Constants.java.
+ */
+ public int kind;
+
+ /**
+ * beginLine and beginColumn describe the position of the first character
+ * of this token; endLine and endColumn describe the position of the
+ * last character of this token.
+ */
+ public int beginLine, beginColumn, endLine, endColumn;
+
+ /**
+ * The string image of the token.
+ */
+ public String image;
+
+ /**
+ * A reference to the next regular (non-special) token from the input
+ * stream. If this is the last token from the input stream, or if the
+ * token manager has not read tokens beyond this one, this field is
+ * set to null. This is true only if this token is also a regular
+ * token. Otherwise, see below for a description of the contents of
+ * this field.
+ */
+ public Token next;
+
+ /**
+ * This field is used to access special tokens that occur prior to this
+ * token, but after the immediately preceding regular (non-special) token.
+ * If there are no such special tokens, this field is set to null.
+ * When there are more than one such special token, this field refers
+ * to the last of these special tokens, which in turn refers to the next
+ * previous special token through its specialToken field, and so on
+ * until the first special token (whose specialToken field is null).
+ * The next fields of special tokens refer to other special tokens that
+ * immediately follow it (without an intervening regular token). If there
+ * is no such token, this field is null.
+ */
+ public Token specialToken;
+
+ /**
+ * Returns the image.
+ */
+ public final String toString()
+ {
+ return image;
+ }
+
+ /**
+ * Returns a new Token object, by default. However, if you want, you
+ * can create and return subclass objects based on the value of ofKind.
+ * Simply add the cases to the switch for all those special cases.
+ * For example, if you have a subclass of Token called IDToken that
+ * you want to create if ofKind is ID, simlpy add something like :
+ *
+ * case MyParserConstants.ID : return new IDToken();
+ *
+ * to the following switch statement. Then you can cast matchedToken
+ * variable to the appropriate type and use it in your lexical actions.
+ */
+ public static final Token newToken(int ofKind)
+ {
+ switch(ofKind)
+ {
+ default : return new Token();
+ }
+ }
+
+}
diff --git a/src/main/java/com/lowagie/text/pdf/codec/postscript/TokenMgrError.java b/src/main/java/com/lowagie/text/pdf/codec/postscript/TokenMgrError.java
new file mode 100644
index 0000000..6b54bfa
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/codec/postscript/TokenMgrError.java
@@ -0,0 +1,133 @@
+/* Generated By:JavaCC: Do not edit this line. TokenMgrError.java Version 2.1 */
+package com.lowagie.text.pdf.codec.postscript;
+
+public class TokenMgrError extends Error
+{
+ /*
+ * Ordinals for various reasons why an Error of this type can be thrown.
+ */
+
+ /**
+ * Lexical error occured.
+ */
+ static final int LEXICAL_ERROR = 0;
+
+ /**
+ * An attempt wass made to create a second instance of a static token manager.
+ */
+ static final int STATIC_LEXER_ERROR = 1;
+
+ /**
+ * Tried to change to an invalid lexical state.
+ */
+ static final int INVALID_LEXICAL_STATE = 2;
+
+ /**
+ * Detected (and bailed out of) an infinite loop in the token manager.
+ */
+ static final int LOOP_DETECTED = 3;
+
+ /**
+ * Indicates the reason why the exception is thrown. It will have
+ * one of the above 4 values.
+ */
+ int errorCode;
+
+ /**
+ * Replaces unprintable characters by their espaced (or unicode escaped)
+ * equivalents in the given string
+ */
+ protected static final String addEscapes(String str) {
+ StringBuffer retval = new StringBuffer();
+ char ch;
+ for (int i = 0; i < str.length(); i++) {
+ switch (str.charAt(i))
+ {
+ case 0 :
+ continue;
+ case '\b':
+ retval.append("\\b");
+ continue;
+ case '\t':
+ retval.append("\\t");
+ continue;
+ case '\n':
+ retval.append("\\n");
+ continue;
+ case '\f':
+ retval.append("\\f");
+ continue;
+ case '\r':
+ retval.append("\\r");
+ continue;
+ case '\"':
+ retval.append("\\\"");
+ continue;
+ case '\'':
+ retval.append("\\\'");
+ continue;
+ case '\\':
+ retval.append("\\\\");
+ continue;
+ default:
+ if ((ch = str.charAt(i)) < 0x20 || ch > 0x7e) {
+ String s = "0000" + Integer.toString(ch, 16);
+ retval.append("\\u" + s.substring(s.length() - 4, s.length()));
+ } else {
+ retval.append(ch);
+ }
+ continue;
+ }
+ }
+ return retval.toString();
+ }
+
+ /**
+ * Returns a detailed message for the Error when it is thrown by the
+ * token manager to indicate a lexical error.
+ * Parameters :
+ * EOFSeen : indicates if EOF caused the lexicl error
+ * curLexState : lexical state in which this error occured
+ * errorLine : line number when the error occured
+ * errorColumn : column number when the error occured
+ * errorAfter : prefix that was seen before this error occured
+ * curchar : the offending character
+ * Note: You can customize the lexical error message by modifying this method.
+ */
+ private static final String LexicalError(boolean EOFSeen, int lexState, int errorLine, int errorColumn, String errorAfter, char curChar) {
+ return("Lexical error at line " +
+ errorLine + ", column " +
+ errorColumn + ". Encountered: " +
+ (EOFSeen ? "<EOF> " : ("\"" + addEscapes(String.valueOf(curChar)) + "\"") + " (" + (int)curChar + "), ") +
+ "after : \"" + addEscapes(errorAfter) + "\"");
+ }
+
+ /**
+ * You can also modify the body of this method to customize your error messages.
+ * For example, cases like LOOP_DETECTED and INVALID_LEXICAL_STATE are not
+ * of end-users concern, so you can return something like :
+ *
+ * "Internal Error : Please file a bug report .... "
+ *
+ * from this method for such cases in the release version of your parser.
+ */
+ public String getMessage() {
+ return super.getMessage();
+ }
+
+ /*
+ * Constructors of various flavors follow.
+ */
+
+ public TokenMgrError() {
+ }
+
+ public TokenMgrError(String message, int reason) {
+ super(message);
+ errorCode = reason;
+ }
+
+ public TokenMgrError(boolean EOFSeen, int lexState, int errorLine, int errorColumn, String errorAfter, char curChar, int reason) {
+ this(LexicalError(EOFSeen, lexState, errorLine, errorColumn, errorAfter, curChar), reason);
+ }
+}
diff --git a/src/main/java/com/lowagie/text/pdf/codec/wmf/InputMeta.java b/src/main/java/com/lowagie/text/pdf/codec/wmf/InputMeta.java
new file mode 100644
index 0000000..084761f
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/codec/wmf/InputMeta.java
@@ -0,0 +1,112 @@
+/*
+ * $Id: InputMeta.java,v 1.3 2005/10/06 10:32:47 psoares33 Exp $
+ * $Name: $
+ *
+ * Copyright 2001, 2002 Paulo Soares
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf.codec.wmf;
+
+import java.io.*;
+import java.awt.Color;
+import com.lowagie.text.Image;
+
+public class InputMeta {
+
+ InputStream in;
+ int length;
+
+ public InputMeta(InputStream in) {
+ this.in = in;
+ }
+
+ public int readWord() throws IOException{
+ length += 2;
+ int k1 = in.read();
+ if (k1 < 0)
+ return 0;
+ return (k1 + (in.read() << 8)) & 0xffff;
+ }
+
+ public int readShort() throws IOException{
+ int k = readWord();
+ if (k > 0x7fff)
+ k -= 0x10000;
+ return k;
+ }
+
+ public int readInt() throws IOException{
+ length += 4;
+ int k1 = in.read();
+ if (k1 < 0)
+ return 0;
+ int k2 = in.read() << 8;
+ int k3 = in.read() << 16;
+ return k1 + k2 + k3 + (in.read() << 24);
+ }
+
+ public int readByte() throws IOException{
+ ++length;
+ return in.read() & 0xff;
+ }
+
+ public void skip(int len) throws IOException{
+ length += len;
+ Image.skip(in, len);
+ }
+
+ public int getLength() {
+ return length;
+ }
+
+ public Color readColor() throws IOException{
+ int red = readByte();
+ int green = readByte();
+ int blue = readByte();
+ readByte();
+ return new Color(red, green, blue);
+ }
+}
diff --git a/src/main/java/com/lowagie/text/pdf/codec/wmf/MetaBrush.java b/src/main/java/com/lowagie/text/pdf/codec/wmf/MetaBrush.java
new file mode 100644
index 0000000..430e177
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/codec/wmf/MetaBrush.java
@@ -0,0 +1,94 @@
+/*
+ * $Id: MetaBrush.java,v 1.2 2005/05/04 14:33:19 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2001, 2002 Paulo Soares
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf.codec.wmf;
+import java.io.IOException;
+import java.awt.Color;
+
+public class MetaBrush extends MetaObject {
+
+ public static final int BS_SOLID = 0;
+ public static final int BS_NULL = 1;
+ public static final int BS_HATCHED = 2;
+ public static final int BS_PATTERN = 3;
+ public static final int BS_DIBPATTERN = 5;
+ public static final int HS_HORIZONTAL = 0;
+ public static final int HS_VERTICAL = 1;
+ public static final int HS_FDIAGONAL = 2;
+ public static final int HS_BDIAGONAL = 3;
+ public static final int HS_CROSS = 4;
+ public static final int HS_DIAGCROSS = 5;
+
+ int style = BS_SOLID;
+ int hatch;
+ Color color = Color.white;
+
+ public MetaBrush() {
+ type = META_BRUSH;
+ }
+
+ public void init(InputMeta in) throws IOException {
+ style = in.readWord();
+ color = in.readColor();
+ hatch = in.readWord();
+ }
+
+ public int getStyle() {
+ return style;
+ }
+
+ public int getHatch() {
+ return hatch;
+ }
+
+ public Color getColor() {
+ return color;
+ }
+}
diff --git a/src/main/java/com/lowagie/text/pdf/codec/wmf/MetaDo.java b/src/main/java/com/lowagie/text/pdf/codec/wmf/MetaDo.java
new file mode 100644
index 0000000..ca77294
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/codec/wmf/MetaDo.java
@@ -0,0 +1,760 @@
+/*
+ * $Id: MetaDo.java,v 1.3 2005/12/01 16:57:15 psoares33 Exp $
+ * $Name: $
+ *
+ * Copyright 2001, 2002 Paulo Soares
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf.codec.wmf;
+import java.io.*;
+import com.lowagie.text.pdf.*;
+import com.lowagie.text.pdf.codec.BmpImage;
+import com.lowagie.text.*;
+import java.awt.Point;
+import java.awt.Color;
+import java.util.ArrayList;
+
+public class MetaDo {
+
+ public static final int META_SETBKCOLOR = 0x0201;
+ public static final int META_SETBKMODE = 0x0102;
+ public static final int META_SETMAPMODE = 0x0103;
+ public static final int META_SETROP2 = 0x0104;
+ public static final int META_SETRELABS = 0x0105;
+ public static final int META_SETPOLYFILLMODE = 0x0106;
+ public static final int META_SETSTRETCHBLTMODE = 0x0107;
+ public static final int META_SETTEXTCHAREXTRA = 0x0108;
+ public static final int META_SETTEXTCOLOR = 0x0209;
+ public static final int META_SETTEXTJUSTIFICATION = 0x020A;
+ public static final int META_SETWINDOWORG = 0x020B;
+ public static final int META_SETWINDOWEXT = 0x020C;
+ public static final int META_SETVIEWPORTORG = 0x020D;
+ public static final int META_SETVIEWPORTEXT = 0x020E;
+ public static final int META_OFFSETWINDOWORG = 0x020F;
+ public static final int META_SCALEWINDOWEXT = 0x0410;
+ public static final int META_OFFSETVIEWPORTORG = 0x0211;
+ public static final int META_SCALEVIEWPORTEXT = 0x0412;
+ public static final int META_LINETO = 0x0213;
+ public static final int META_MOVETO = 0x0214;
+ public static final int META_EXCLUDECLIPRECT = 0x0415;
+ public static final int META_INTERSECTCLIPRECT = 0x0416;
+ public static final int META_ARC = 0x0817;
+ public static final int META_ELLIPSE = 0x0418;
+ public static final int META_FLOODFILL = 0x0419;
+ public static final int META_PIE = 0x081A;
+ public static final int META_RECTANGLE = 0x041B;
+ public static final int META_ROUNDRECT = 0x061C;
+ public static final int META_PATBLT = 0x061D;
+ public static final int META_SAVEDC = 0x001E;
+ public static final int META_SETPIXEL = 0x041F;
+ public static final int META_OFFSETCLIPRGN = 0x0220;
+ public static final int META_TEXTOUT = 0x0521;
+ public static final int META_BITBLT = 0x0922;
+ public static final int META_STRETCHBLT = 0x0B23;
+ public static final int META_POLYGON = 0x0324;
+ public static final int META_POLYLINE = 0x0325;
+ public static final int META_ESCAPE = 0x0626;
+ public static final int META_RESTOREDC = 0x0127;
+ public static final int META_FILLREGION = 0x0228;
+ public static final int META_FRAMEREGION = 0x0429;
+ public static final int META_INVERTREGION = 0x012A;
+ public static final int META_PAINTREGION = 0x012B;
+ public static final int META_SELECTCLIPREGION = 0x012C;
+ public static final int META_SELECTOBJECT = 0x012D;
+ public static final int META_SETTEXTALIGN = 0x012E;
+ public static final int META_CHORD = 0x0830;
+ public static final int META_SETMAPPERFLAGS = 0x0231;
+ public static final int META_EXTTEXTOUT = 0x0a32;
+ public static final int META_SETDIBTODEV = 0x0d33;
+ public static final int META_SELECTPALETTE = 0x0234;
+ public static final int META_REALIZEPALETTE = 0x0035;
+ public static final int META_ANIMATEPALETTE = 0x0436;
+ public static final int META_SETPALENTRIES = 0x0037;
+ public static final int META_POLYPOLYGON = 0x0538;
+ public static final int META_RESIZEPALETTE = 0x0139;
+ public static final int META_DIBBITBLT = 0x0940;
+ public static final int META_DIBSTRETCHBLT = 0x0b41;
+ public static final int META_DIBCREATEPATTERNBRUSH = 0x0142;
+ public static final int META_STRETCHDIB = 0x0f43;
+ public static final int META_EXTFLOODFILL = 0x0548;
+ public static final int META_DELETEOBJECT = 0x01f0;
+ public static final int META_CREATEPALETTE = 0x00f7;
+ public static final int META_CREATEPATTERNBRUSH = 0x01F9;
+ public static final int META_CREATEPENINDIRECT = 0x02FA;
+ public static final int META_CREATEFONTINDIRECT = 0x02FB;
+ public static final int META_CREATEBRUSHINDIRECT = 0x02FC;
+ public static final int META_CREATEREGION = 0x06FF;
+
+ public PdfContentByte cb;
+ public InputMeta in;
+ int left;
+ int top;
+ int right;
+ int bottom;
+ int inch;
+ MetaState state = new MetaState();
+
+ public MetaDo(InputStream in, PdfContentByte cb) {
+ this.cb = cb;
+ this.in = new InputMeta(in);
+ }
+
+ public void readAll() throws IOException, DocumentException{
+ if (in.readInt() != 0x9AC6CDD7) {
+ throw new DocumentException("Not a placeable windows metafile");
+ }
+ in.readWord();
+ left = in.readShort();
+ top = in.readShort();
+ right = in.readShort();
+ bottom = in.readShort();
+ inch = in.readWord();
+ state.setScalingX((float)(right - left) / (float)inch * 72f);
+ state.setScalingY((float)(bottom - top) / (float)inch * 72f);
+ state.setOffsetWx(left);
+ state.setOffsetWy(top);
+ state.setExtentWx(right - left);
+ state.setExtentWy(bottom - top);
+ in.readInt();
+ in.readWord();
+ in.skip(18);
+
+ int tsize;
+ int function;
+ cb.setLineCap(1);
+ cb.setLineJoin(1);
+ for (;;) {
+ int lenMarker = in.getLength();
+ tsize = in.readInt();
+ if (tsize < 3)
+ break;
+ function = in.readWord();
+ switch (function) {
+ case 0:
+ break;
+ case META_CREATEPALETTE:
+ case META_CREATEREGION:
+ case META_DIBCREATEPATTERNBRUSH:
+ state.addMetaObject(new MetaObject());
+ break;
+ case META_CREATEPENINDIRECT:
+ {
+ MetaPen pen = new MetaPen();
+ pen.init(in);
+ state.addMetaObject(pen);
+ break;
+ }
+ case META_CREATEBRUSHINDIRECT:
+ {
+ MetaBrush brush = new MetaBrush();
+ brush.init(in);
+ state.addMetaObject(brush);
+ break;
+ }
+ case META_CREATEFONTINDIRECT:
+ {
+ MetaFont font = new MetaFont();
+ font.init(in);
+ state.addMetaObject(font);
+ break;
+ }
+ case META_SELECTOBJECT:
+ {
+ int idx = in.readWord();
+ state.selectMetaObject(idx, cb);
+ break;
+ }
+ case META_DELETEOBJECT:
+ {
+ int idx = in.readWord();
+ state.deleteMetaObject(idx);
+ break;
+ }
+ case META_SAVEDC:
+ state.saveState(cb);
+ break;
+ case META_RESTOREDC:
+ {
+ int idx = in.readShort();
+ state.restoreState(idx, cb);
+ break;
+ }
+ case META_SETWINDOWORG:
+ state.setOffsetWy(in.readShort());
+ state.setOffsetWx(in.readShort());
+ break;
+ case META_SETWINDOWEXT:
+ state.setExtentWy(in.readShort());
+ state.setExtentWx(in.readShort());
+ break;
+ case META_MOVETO:
+ {
+ int y = in.readShort();
+ Point p = new Point(in.readShort(), y);
+ state.setCurrentPoint(p);
+ break;
+ }
+ case META_LINETO:
+ {
+ int y = in.readShort();
+ int x = in.readShort();
+ Point p = state.getCurrentPoint();
+ cb.moveTo(state.transformX(p.x), state.transformY(p.y));
+ cb.lineTo(state.transformX(x), state.transformY(y));
+ cb.stroke();
+ state.setCurrentPoint(new Point(x, y));
+ break;
+ }
+ case META_POLYLINE:
+ {
+ state.setLineJoinPolygon(cb);
+ int len = in.readWord();
+ int x = in.readShort();
+ int y = in.readShort();
+ cb.moveTo(state.transformX(x), state.transformY(y));
+ for (int k = 1; k < len; ++k) {
+ x = in.readShort();
+ y = in.readShort();
+ cb.lineTo(state.transformX(x), state.transformY(y));
+ }
+ cb.stroke();
+ break;
+ }
+ case META_POLYGON:
+ {
+ if (isNullStrokeFill(false))
+ break;
+ int len = in.readWord();
+ int sx = in.readShort();
+ int sy = in.readShort();
+ cb.moveTo(state.transformX(sx), state.transformY(sy));
+ for (int k = 1; k < len; ++k) {
+ int x = in.readShort();
+ int y = in.readShort();
+ cb.lineTo(state.transformX(x), state.transformY(y));
+ }
+ cb.lineTo(state.transformX(sx), state.transformY(sy));
+ strokeAndFill();
+ break;
+ }
+ case META_POLYPOLYGON:
+ {
+ if (isNullStrokeFill(false))
+ break;
+ int numPoly = in.readWord();
+ int lens[] = new int[numPoly];
+ for (int k = 0; k < lens.length; ++k)
+ lens[k] = in.readWord();
+ for (int j = 0; j < lens.length; ++j) {
+ int len = lens[j];
+ int sx = in.readShort();
+ int sy = in.readShort();
+ cb.moveTo(state.transformX(sx), state.transformY(sy));
+ for (int k = 1; k < len; ++k) {
+ int x = in.readShort();
+ int y = in.readShort();
+ cb.lineTo(state.transformX(x), state.transformY(y));
+ }
+ cb.lineTo(state.transformX(sx), state.transformY(sy));
+ }
+ strokeAndFill();
+ break;
+ }
+ case META_ELLIPSE:
+ {
+ if (isNullStrokeFill(state.getLineNeutral()))
+ break;
+ int b = in.readShort();
+ int r = in.readShort();
+ int t = in.readShort();
+ int l = in.readShort();
+ cb.arc(state.transformX(l), state.transformY(b), state.transformX(r), state.transformY(t), 0, 360);
+ strokeAndFill();
+ break;
+ }
+ case META_ARC:
+ {
+ if (isNullStrokeFill(state.getLineNeutral()))
+ break;
+ float yend = state.transformY(in.readShort());
+ float xend = state.transformX(in.readShort());
+ float ystart = state.transformY(in.readShort());
+ float xstart = state.transformX(in.readShort());
+ float b = state.transformY(in.readShort());
+ float r = state.transformX(in.readShort());
+ float t = state.transformY(in.readShort());
+ float l = state.transformX(in.readShort());
+ float cx = (r + l) / 2;
+ float cy = (t + b) / 2;
+ float arc1 = getArc(cx, cy, xstart, ystart);
+ float arc2 = getArc(cx, cy, xend, yend);
+ arc2 -= arc1;
+ if (arc2 <= 0)
+ arc2 += 360;
+ cb.arc(l, b, r, t, arc1, arc2);
+ cb.stroke();
+ break;
+ }
+ case META_PIE:
+ {
+ if (isNullStrokeFill(state.getLineNeutral()))
+ break;
+ float yend = state.transformY(in.readShort());
+ float xend = state.transformX(in.readShort());
+ float ystart = state.transformY(in.readShort());
+ float xstart = state.transformX(in.readShort());
+ float b = state.transformY(in.readShort());
+ float r = state.transformX(in.readShort());
+ float t = state.transformY(in.readShort());
+ float l = state.transformX(in.readShort());
+ float cx = (r + l) / 2;
+ float cy = (t + b) / 2;
+ float arc1 = getArc(cx, cy, xstart, ystart);
+ float arc2 = getArc(cx, cy, xend, yend);
+ arc2 -= arc1;
+ if (arc2 <= 0)
+ arc2 += 360;
+ ArrayList ar = PdfContentByte.bezierArc(l, b, r, t, arc1, arc2);
+ if (ar.size() == 0)
+ break;
+ float pt[] = (float [])ar.get(0);
+ cb.moveTo(cx, cy);
+ cb.lineTo(pt[0], pt[1]);
+ for (int k = 0; k < ar.size(); ++k) {
+ pt = (float [])ar.get(k);
+ cb.curveTo(pt[2], pt[3], pt[4], pt[5], pt[6], pt[7]);
+ }
+ cb.lineTo(cx, cy);
+ strokeAndFill();
+ break;
+ }
+ case META_CHORD:
+ {
+ if (isNullStrokeFill(state.getLineNeutral()))
+ break;
+ float yend = state.transformY(in.readShort());
+ float xend = state.transformX(in.readShort());
+ float ystart = state.transformY(in.readShort());
+ float xstart = state.transformX(in.readShort());
+ float b = state.transformY(in.readShort());
+ float r = state.transformX(in.readShort());
+ float t = state.transformY(in.readShort());
+ float l = state.transformX(in.readShort());
+ float cx = (r + l) / 2;
+ float cy = (t + b) / 2;
+ float arc1 = getArc(cx, cy, xstart, ystart);
+ float arc2 = getArc(cx, cy, xend, yend);
+ arc2 -= arc1;
+ if (arc2 <= 0)
+ arc2 += 360;
+ ArrayList ar = PdfContentByte.bezierArc(l, b, r, t, arc1, arc2);
+ if (ar.size() == 0)
+ break;
+ float pt[] = (float [])ar.get(0);
+ cx = pt[0];
+ cy = pt[1];
+ cb.moveTo(cx, cy);
+ for (int k = 0; k < ar.size(); ++k) {
+ pt = (float [])ar.get(k);
+ cb.curveTo(pt[2], pt[3], pt[4], pt[5], pt[6], pt[7]);
+ }
+ cb.lineTo(cx, cy);
+ strokeAndFill();
+ break;
+ }
+ case META_RECTANGLE:
+ {
+ if (isNullStrokeFill(true))
+ break;
+ float b = state.transformY(in.readShort());
+ float r = state.transformX(in.readShort());
+ float t = state.transformY(in.readShort());
+ float l = state.transformX(in.readShort());
+ cb.rectangle(l, b, r - l, t - b);
+ strokeAndFill();
+ break;
+ }
+ case META_ROUNDRECT:
+ {
+ if (isNullStrokeFill(true))
+ break;
+ float h = state.transformY(0) - state.transformY(in.readShort());
+ float w = state.transformX(in.readShort()) - state.transformX(0);
+ float b = state.transformY(in.readShort());
+ float r = state.transformX(in.readShort());
+ float t = state.transformY(in.readShort());
+ float l = state.transformX(in.readShort());
+ cb.roundRectangle(l, b, r - l, t - b, (h + w) / 4);
+ strokeAndFill();
+ break;
+ }
+ case META_INTERSECTCLIPRECT:
+ {
+ float b = state.transformY(in.readShort());
+ float r = state.transformX(in.readShort());
+ float t = state.transformY(in.readShort());
+ float l = state.transformX(in.readShort());
+ cb.rectangle(l, b, r - l, t - b);
+ cb.eoClip();
+ cb.newPath();
+ break;
+ }
+ case META_EXTTEXTOUT:
+ {
+ int y = in.readShort();
+ int x = in.readShort();
+ int count = in.readWord();
+ int flag = in.readWord();
+ int x1 = 0;
+ int y1 = 0;
+ int x2 = 0;
+ int y2 = 0;
+ if ((flag & (MetaFont.ETO_CLIPPED | MetaFont.ETO_OPAQUE)) != 0) {
+ x1 = in.readShort();
+ y1 = in.readShort();
+ x2 = in.readShort();
+ y2 = in.readShort();
+ }
+ byte text[] = new byte[count];
+ int k;
+ for (k = 0; k < count; ++k) {
+ byte c = (byte)in.readByte();
+ if (c == 0)
+ break;
+ text[k] = c;
+ }
+ String s;
+ try {
+ s = new String(text, 0, k, "Cp1252");
+ }
+ catch (UnsupportedEncodingException e) {
+ s = new String(text, 0, k);
+ }
+ outputText(x, y, flag, x1, y1, x2, y2, s);
+ break;
+ }
+ case META_TEXTOUT:
+ {
+ int count = in.readWord();
+ byte text[] = new byte[count];
+ int k;
+ for (k = 0; k < count; ++k) {
+ byte c = (byte)in.readByte();
+ if (c == 0)
+ break;
+ text[k] = c;
+ }
+ String s;
+ try {
+ s = new String(text, 0, k, "Cp1252");
+ }
+ catch (UnsupportedEncodingException e) {
+ s = new String(text, 0, k);
+ }
+ count = (count + 1) & 0xfffe;
+ in.skip(count - k);
+ int y = in.readShort();
+ int x = in.readShort();
+ outputText(x, y, 0, 0, 0, 0, 0, s);
+ break;
+ }
+ case META_SETBKCOLOR:
+ state.setCurrentBackgroundColor(in.readColor());
+ break;
+ case META_SETTEXTCOLOR:
+ state.setCurrentTextColor(in.readColor());
+ break;
+ case META_SETTEXTALIGN:
+ state.setTextAlign(in.readWord());
+ break;
+ case META_SETBKMODE:
+ state.setBackgroundMode(in.readWord());
+ break;
+ case META_SETPOLYFILLMODE:
+ state.setPolyFillMode(in.readWord());
+ break;
+ case META_SETPIXEL:
+ {
+ Color color = in.readColor();
+ int y = in.readShort();
+ int x = in.readShort();
+ cb.saveState();
+ cb.setColorFill(color);
+ cb.rectangle(state.transformX(x), state.transformY(y), .2f, .2f);
+ cb.fill();
+ cb.restoreState();
+ break;
+ }
+ case META_DIBSTRETCHBLT:
+ case META_STRETCHDIB: {
+ int rop = in.readInt();
+ if (function == META_STRETCHDIB) {
+ /*int usage = */ in.readWord();
+ }
+ int srcHeight = in.readShort();
+ int srcWidth = in.readShort();
+ int ySrc = in.readShort();
+ int xSrc = in.readShort();
+ float destHeight = state.transformY(in.readShort()) - state.transformY(0);
+ float destWidth = state.transformX(in.readShort()) - state.transformX(0);
+ float yDest = state.transformY(in.readShort());
+ float xDest = state.transformX(in.readShort());
+ byte b[] = new byte[(tsize * 2) - (in.getLength() - lenMarker)];
+ for (int k = 0; k < b.length; ++k)
+ b[k] = (byte)in.readByte();
+ try {
+ ByteArrayInputStream inb = new ByteArrayInputStream(b);
+ Image bmp = BmpImage.getImage(inb, true, b.length);
+ cb.saveState();
+ cb.rectangle(xDest, yDest, destWidth, destHeight);
+ cb.clip();
+ cb.newPath();
+ bmp.scaleAbsolute(destWidth * bmp.width() / srcWidth, -destHeight * bmp.height() / srcHeight);
+ bmp.setAbsolutePosition(xDest - destWidth * xSrc / srcWidth, yDest + destHeight * ySrc / srcHeight - bmp.scaledHeight());
+ cb.addImage(bmp);
+ cb.restoreState();
+ }
+ catch (Exception e) {
+ // empty on purpose
+ }
+ break;
+ }
+ }
+ in.skip((tsize * 2) - (in.getLength() - lenMarker));
+ }
+ state.cleanup(cb);
+ }
+
+ public void outputText(int x, int y, int flag, int x1, int y1, int x2, int y2, String text) throws IOException {
+ MetaFont font = state.getCurrentFont();
+ float refX = state.transformX(x);
+ float refY = state.transformY(y);
+ float angle = state.transformAngle(font.getAngle());
+ float sin = (float)Math.sin(angle);
+ float cos = (float)Math.cos(angle);
+ float fontSize = font.getFontSize(state);
+ BaseFont bf = font.getFont();
+ int align = state.getTextAlign();
+ float textWidth = bf.getWidthPoint(text, fontSize);
+ float tx = 0;
+ float ty = 0;
+ float descender = bf.getFontDescriptor(BaseFont.DESCENT, fontSize);
+ float ury = bf.getFontDescriptor(BaseFont.BBOXURY, fontSize);
+ cb.saveState();
+ cb.concatCTM(cos, sin, -sin, cos, refX, refY);
+ if ((align & MetaState.TA_CENTER) == MetaState.TA_CENTER)
+ tx = -textWidth / 2;
+ else if ((align & MetaState.TA_RIGHT) == MetaState.TA_RIGHT)
+ tx = -textWidth;
+ if ((align & MetaState.TA_BASELINE) == MetaState.TA_BASELINE)
+ ty = 0;
+ else if ((align & MetaState.TA_BOTTOM) == MetaState.TA_BOTTOM)
+ ty = -descender;
+ else
+ ty = -ury;
+ Color textColor;
+ if (state.getBackgroundMode() == MetaState.OPAQUE) {
+ textColor = state.getCurrentBackgroundColor();
+ cb.setColorFill(textColor);
+ cb.rectangle(tx, ty + descender, textWidth, ury - descender);
+ cb.fill();
+ }
+ textColor = state.getCurrentTextColor();
+ cb.setColorFill(textColor);
+ cb.beginText();
+ cb.setFontAndSize(bf, fontSize);
+ cb.setTextMatrix(tx, ty);
+ cb.showText(text);
+ cb.endText();
+ if (font.isUnderline()) {
+ cb.rectangle(tx, ty - fontSize / 4, textWidth, fontSize / 15);
+ cb.fill();
+ }
+ if (font.isStrikeout()) {
+ cb.rectangle(tx, ty + fontSize / 3, textWidth, fontSize / 15);
+ cb.fill();
+ }
+ cb.restoreState();
+ }
+
+ public boolean isNullStrokeFill(boolean isRectangle) {
+ MetaPen pen = state.getCurrentPen();
+ MetaBrush brush = state.getCurrentBrush();
+ boolean noPen = (pen.getStyle() == MetaPen.PS_NULL);
+ int style = brush.getStyle();
+ boolean isBrush = (style == MetaBrush.BS_SOLID || (style == MetaBrush.BS_HATCHED && state.getBackgroundMode() == MetaState.OPAQUE));
+ boolean result = noPen && !isBrush;
+ if (!noPen) {
+ if (isRectangle)
+ state.setLineJoinRectangle(cb);
+ else
+ state.setLineJoinPolygon(cb);
+ }
+ return result;
+ }
+
+ public void strokeAndFill(){
+ MetaPen pen = state.getCurrentPen();
+ MetaBrush brush = state.getCurrentBrush();
+ int penStyle = pen.getStyle();
+ int brushStyle = brush.getStyle();
+ if (penStyle == MetaPen.PS_NULL) {
+ cb.closePath();
+ if (state.getPolyFillMode() == MetaState.ALTERNATE) {
+ cb.eoFill();
+ }
+ else {
+ cb.fill();
+ }
+ }
+ else {
+ boolean isBrush = (brushStyle == MetaBrush.BS_SOLID || (brushStyle == MetaBrush.BS_HATCHED && state.getBackgroundMode() == MetaState.OPAQUE));
+ if (isBrush) {
+ if (state.getPolyFillMode() == MetaState.ALTERNATE)
+ cb.closePathEoFillStroke();
+ else
+ cb.closePathFillStroke();
+ }
+ else {
+ cb.closePathStroke();
+ }
+ }
+ }
+
+ static float getArc(float xCenter, float yCenter, float xDot, float yDot) {
+ double s = Math.atan2(yDot - yCenter, xDot - xCenter);
+ if (s < 0)
+ s += Math.PI * 2;
+ return (float)(s / Math.PI * 180);
+ }
+
+ public static byte[] wrapBMP(Image image) throws IOException {
+ if (image.getOriginalType() != Image.ORIGINAL_BMP)
+ throw new IOException("Only BMP can be wrapped in WMF.");
+ InputStream imgIn;
+ byte data[] = null;
+ if (image.getOriginalData() == null) {
+ imgIn = image.url().openStream();
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ int b = 0;
+ while ((b = imgIn.read()) != -1)
+ out.write(b);
+ imgIn.close();
+ data = out.toByteArray();
+ }
+ else
+ data = image.getOriginalData();
+ int sizeBmpWords = (data.length - 14 + 1) >>> 1;
+ ByteArrayOutputStream os = new ByteArrayOutputStream();
+ // write metafile header
+ writeWord(os, 1);
+ writeWord(os, 9);
+ writeWord(os, 0x0300);
+ writeDWord(os, 9 + 4 + 5 + 5 + (13 + sizeBmpWords) + 3); // total metafile size
+ writeWord(os, 1);
+ writeDWord(os, 14 + sizeBmpWords); // max record size
+ writeWord(os, 0);
+ // write records
+ writeDWord(os, 4);
+ writeWord(os, META_SETMAPMODE);
+ writeWord(os, 8);
+
+ writeDWord(os, 5);
+ writeWord(os, META_SETWINDOWORG);
+ writeWord(os, 0);
+ writeWord(os, 0);
+
+ writeDWord(os, 5);
+ writeWord(os, META_SETWINDOWEXT);
+ writeWord(os, (int)image.height());
+ writeWord(os, (int)image.width());
+
+ writeDWord(os, 13 + sizeBmpWords);
+ writeWord(os, META_DIBSTRETCHBLT);
+ writeDWord(os, 0x00cc0020);
+ writeWord(os, (int)image.height());
+ writeWord(os, (int)image.width());
+ writeWord(os, 0);
+ writeWord(os, 0);
+ writeWord(os, (int)image.height());
+ writeWord(os, (int)image.width());
+ writeWord(os, 0);
+ writeWord(os, 0);
+ os.write(data, 14, data.length - 14);
+ if ((data.length & 1) == 1)
+ os.write(0);
+// writeDWord(os, 14 + sizeBmpWords);
+// writeWord(os, META_STRETCHDIB);
+// writeDWord(os, 0x00cc0020);
+// writeWord(os, 0);
+// writeWord(os, (int)image.height());
+// writeWord(os, (int)image.width());
+// writeWord(os, 0);
+// writeWord(os, 0);
+// writeWord(os, (int)image.height());
+// writeWord(os, (int)image.width());
+// writeWord(os, 0);
+// writeWord(os, 0);
+// os.write(data, 14, data.length - 14);
+// if ((data.length & 1) == 1)
+// os.write(0);
+
+ writeDWord(os, 3);
+ writeWord(os, 0);
+ os.close();
+ return os.toByteArray();
+ }
+
+ public static void writeWord(OutputStream os, int v) throws IOException {
+ os.write(v & 0xff);
+ os.write((v >>> 8) & 0xff);
+ }
+
+ public static void writeDWord(OutputStream os, int v) throws IOException {
+ writeWord(os, v & 0xffff);
+ writeWord(os, (v >>> 16) & 0xffff);
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/pdf/codec/wmf/MetaFont.java b/src/main/java/com/lowagie/text/pdf/codec/wmf/MetaFont.java
new file mode 100644
index 0000000..70da31d
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/codec/wmf/MetaFont.java
@@ -0,0 +1,211 @@
+/*
+ * $Id: MetaFont.java,v 1.3 2005/11/02 18:03:45 psoares33 Exp $
+ * $Name: $
+ *
+ * Copyright 2001, 2002 Paulo Soares
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf.codec.wmf;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import com.lowagie.text.pdf.*;
+import com.lowagie.text.Font;
+import com.lowagie.text.FontFactory;
+import com.lowagie.text.ExceptionConverter;
+
+public class MetaFont extends MetaObject {
+ static final String fontNames[] = {
+ "Courier", "Courier-Bold", "Courier-Oblique", "Courier-BoldOblique",
+ "Helvetica", "Helvetica-Bold", "Helvetica-Oblique", "Helvetica-BoldOblique",
+ "Times-Roman", "Times-Bold", "Times-Italic", "Times-BoldItalic",
+ "Symbol", "ZapfDingbats"};
+
+ static final int MARKER_BOLD = 1;
+ static final int MARKER_ITALIC = 2;
+ static final int MARKER_COURIER = 0;
+ static final int MARKER_HELVETICA = 4;
+ static final int MARKER_TIMES = 8;
+ static final int MARKER_SYMBOL = 12;
+
+ static final int DEFAULT_PITCH = 0;
+ static final int FIXED_PITCH = 1;
+ static final int VARIABLE_PITCH = 2;
+ static final int FF_DONTCARE = 0;
+ static final int FF_ROMAN = 1;
+ static final int FF_SWISS = 2;
+ static final int FF_MODERN = 3;
+ static final int FF_SCRIPT = 4;
+ static final int FF_DECORATIVE = 5;
+ static final int BOLDTHRESHOLD = 600;
+ static final int nameSize = 32;
+ static final int ETO_OPAQUE = 2;
+ static final int ETO_CLIPPED = 4;
+
+ int height;
+ float angle;
+ int bold;
+ int italic;
+ boolean underline;
+ boolean strikeout;
+ int charset;
+ int pitchAndFamily;
+ String faceName = "arial";
+ BaseFont font = null;
+
+ public MetaFont() {
+ type = META_FONT;
+ }
+
+ public void init(InputMeta in) throws IOException {
+ height = Math.abs(in.readShort());
+ in.skip(2);
+ angle = (float)(in.readShort() / 1800.0 * Math.PI);
+ in.skip(2);
+ bold = (in.readShort() >= BOLDTHRESHOLD ? MARKER_BOLD : 0);
+ italic = (in.readByte() != 0 ? MARKER_ITALIC : 0);
+ underline = (in.readByte() != 0);
+ strikeout = (in.readByte() != 0);
+ charset = in.readByte();
+ in.skip(3);
+ pitchAndFamily = in.readByte();
+ byte name[] = new byte[nameSize];
+ int k;
+ for (k = 0; k < nameSize; ++k) {
+ int c = in.readByte();
+ if (c == 0) {
+ break;
+ }
+ name[k] = (byte)c;
+ }
+ try {
+ faceName = new String(name, 0, k, "Cp1252");
+ }
+ catch (UnsupportedEncodingException e) {
+ faceName = new String(name, 0, k);
+ }
+ faceName = faceName.toLowerCase();
+ }
+
+ public BaseFont getFont() {
+ if (font != null)
+ return font;
+ Font ff2 = FontFactory.getFont(faceName, BaseFont.CP1252, true, 10, ((italic != 0) ? Font.ITALIC : 0) | ((bold != 0) ? Font.BOLD : 0));
+ font = ff2.getBaseFont();
+ if (font != null)
+ return font;
+ String fontName;
+ if (faceName.indexOf("courier") != -1 || faceName.indexOf("terminal") != -1
+ || faceName.indexOf("fixedsys") != -1) {
+ fontName = fontNames[MARKER_COURIER + italic + bold];
+ }
+ else if (faceName.indexOf("ms sans serif") != -1 || faceName.indexOf("arial") != -1
+ || faceName.indexOf("system") != -1) {
+ fontName = fontNames[MARKER_HELVETICA + italic + bold];
+ }
+ else if (faceName.indexOf("arial black") != -1) {
+ fontName = fontNames[MARKER_HELVETICA + italic + MARKER_BOLD];
+ }
+ else if (faceName.indexOf("times") != -1 || faceName.indexOf("ms serif") != -1
+ || faceName.indexOf("roman") != -1) {
+ fontName = fontNames[MARKER_TIMES + italic + bold];
+ }
+ else if (faceName.indexOf("symbol") != -1) {
+ fontName = fontNames[MARKER_SYMBOL];
+ }
+ else {
+ int pitch = pitchAndFamily & 3;
+ int family = (pitchAndFamily >> 4) & 7;
+ switch (family) {
+ case FF_MODERN:
+ fontName = fontNames[MARKER_COURIER + italic + bold];
+ break;
+ case FF_ROMAN:
+ fontName = fontNames[MARKER_TIMES + italic + bold];
+ break;
+ case FF_SWISS:
+ case FF_SCRIPT:
+ case FF_DECORATIVE:
+ fontName = fontNames[MARKER_HELVETICA + italic + bold];
+ break;
+ default:
+ {
+ switch (pitch) {
+ case FIXED_PITCH:
+ fontName = fontNames[MARKER_COURIER + italic + bold];
+ break;
+ default:
+ fontName = fontNames[MARKER_HELVETICA + italic + bold];
+ break;
+ }
+ }
+ }
+ }
+ try {
+ font = BaseFont.createFont(fontName, "Cp1252", false);
+ }
+ catch (Exception e) {
+ throw new ExceptionConverter(e);
+ }
+
+ return font;
+ }
+
+ public float getAngle() {
+ return angle;
+ }
+
+ public boolean isUnderline() {
+ return underline;
+ }
+
+ public boolean isStrikeout() {
+ return strikeout;
+ }
+
+ public float getFontSize(MetaState state) {
+ return Math.abs(state.transformY(height) - state.transformY(0)) * 0.86f;
+ }
+}
diff --git a/src/main/java/com/lowagie/text/pdf/codec/wmf/MetaObject.java b/src/main/java/com/lowagie/text/pdf/codec/wmf/MetaObject.java
new file mode 100644
index 0000000..d31fb02
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/codec/wmf/MetaObject.java
@@ -0,0 +1,71 @@
+/*
+ * $Id: MetaObject.java,v 1.2 2005/05/04 14:33:18 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2001, 2002 Paulo Soares
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf.codec.wmf;
+
+public class MetaObject {
+ public static final int META_NOT_SUPPORTED = 0;
+ public static final int META_PEN = 1;
+ public static final int META_BRUSH = 2;
+ public static final int META_FONT = 3;
+ public int type = META_NOT_SUPPORTED;
+
+ public MetaObject() {
+ }
+
+ public MetaObject(int type) {
+ this.type = type;
+ }
+
+ public int getType() {
+ return type;
+ }
+
+}
diff --git a/src/main/java/com/lowagie/text/pdf/codec/wmf/MetaPen.java b/src/main/java/com/lowagie/text/pdf/codec/wmf/MetaPen.java
new file mode 100644
index 0000000..29b85ca
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/codec/wmf/MetaPen.java
@@ -0,0 +1,91 @@
+/*
+ * $Id: MetaPen.java,v 1.2 2005/05/04 14:33:19 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2001, 2002 Paulo Soares
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf.codec.wmf;
+import java.io.IOException;
+import java.awt.Color;
+
+public class MetaPen extends MetaObject {
+
+ public static final int PS_SOLID = 0;
+ public static final int PS_DASH = 1;
+ public static final int PS_DOT = 2;
+ public static final int PS_DASHDOT = 3;
+ public static final int PS_DASHDOTDOT = 4;
+ public static final int PS_NULL = 5;
+ public static final int PS_INSIDEFRAME = 6;
+
+ int style = PS_SOLID;
+ int penWidth = 1;
+ Color color = Color.black;
+
+ public MetaPen() {
+ type = META_PEN;
+ }
+
+ public void init(InputMeta in) throws IOException {
+ style = in.readWord();
+ penWidth = in.readShort();
+ in.readWord();
+ color = in.readColor();
+ }
+
+ public int getStyle() {
+ return style;
+ }
+
+ public int getPenWidth() {
+ return penWidth;
+ }
+
+ public Color getColor() {
+ return color;
+ }
+}
diff --git a/src/main/java/com/lowagie/text/pdf/codec/wmf/MetaState.java b/src/main/java/com/lowagie/text/pdf/codec/wmf/MetaState.java
new file mode 100644
index 0000000..97f18f4
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/codec/wmf/MetaState.java
@@ -0,0 +1,372 @@
+/*
+ * $Id: MetaState.java,v 1.5 2005/12/01 16:57:15 psoares33 Exp $
+ * $Name: $
+ *
+ * Copyright 2001, 2002 Paulo Soares
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf.codec.wmf;
+
+import java.util.ArrayList;
+import java.util.Stack;
+import java.awt.Point;
+import java.awt.Color;
+import com.lowagie.text.pdf.*;
+
+public class MetaState {
+
+ public static final int TA_NOUPDATECP = 0;
+ public static final int TA_UPDATECP = 1;
+ public static final int TA_LEFT = 0;
+ public static final int TA_RIGHT = 2;
+ public static final int TA_CENTER = 6;
+ public static final int TA_TOP = 0;
+ public static final int TA_BOTTOM = 8;
+ public static final int TA_BASELINE = 24;
+
+ public static final int TRANSPARENT = 1;
+ public static final int OPAQUE = 2;
+
+ public static final int ALTERNATE = 1;
+ public static final int WINDING = 2;
+
+ public Stack savedStates;
+ public ArrayList MetaObjects;
+ public Point currentPoint;
+ public MetaPen currentPen;
+ public MetaBrush currentBrush;
+ public MetaFont currentFont;
+ public Color currentBackgroundColor = Color.white;
+ public Color currentTextColor = Color.black;
+ public int backgroundMode = OPAQUE;
+ public int polyFillMode = ALTERNATE;
+ public int lineJoin = 1;
+ public int textAlign;
+ public int offsetWx;
+ public int offsetWy;
+ public int extentWx;
+ public int extentWy;
+ public float scalingX;
+ public float scalingY;
+
+
+ /** Creates new MetaState */
+ public MetaState() {
+ savedStates = new Stack();
+ MetaObjects = new ArrayList();
+ currentPoint = new Point(0, 0);
+ currentPen = new MetaPen();
+ currentBrush = new MetaBrush();
+ currentFont = new MetaFont();
+ }
+
+ public MetaState(MetaState state) {
+ setMetaState(state);
+ }
+
+ public void setMetaState(MetaState state) {
+ savedStates = state.savedStates;
+ MetaObjects = state.MetaObjects;
+ currentPoint = state.currentPoint;
+ currentPen = state.currentPen;
+ currentBrush = state.currentBrush;
+ currentFont = state.currentFont;
+ currentBackgroundColor = state.currentBackgroundColor;
+ currentTextColor = state.currentTextColor;
+ backgroundMode = state.backgroundMode;
+ polyFillMode = state.polyFillMode;
+ textAlign = state.textAlign;
+ lineJoin = state.lineJoin;
+ offsetWx = state.offsetWx;
+ offsetWy = state.offsetWy;
+ extentWx = state.extentWx;
+ extentWy = state.extentWy;
+ scalingX = state.scalingX;
+ scalingY = state.scalingY;
+ }
+
+ public void addMetaObject(MetaObject object) {
+ for (int k = 0; k < MetaObjects.size(); ++k) {
+ if (MetaObjects.get(k) == null) {
+ MetaObjects.set(k, object);
+ return;
+ }
+ }
+ MetaObjects.add(object);
+ }
+
+ public void selectMetaObject(int index, PdfContentByte cb) {
+ MetaObject obj = (MetaObject)MetaObjects.get(index);
+ if (obj == null)
+ return;
+ int style;
+ switch (obj.getType()) {
+ case MetaObject.META_BRUSH:
+ currentBrush = (MetaBrush)obj;
+ style = currentBrush.getStyle();
+ if (style == MetaBrush.BS_SOLID) {
+ Color color = currentBrush.getColor();
+ cb.setColorFill(color);
+ }
+ else if (style == MetaBrush.BS_HATCHED) {
+ Color color = currentBackgroundColor;
+ cb.setColorFill(color);
+ }
+ break;
+ case MetaObject.META_PEN:
+ {
+ currentPen = (MetaPen)obj;
+ style = currentPen.getStyle();
+ if (style != MetaPen.PS_NULL) {
+ Color color = currentPen.getColor();
+ cb.setColorStroke(color);
+ cb.setLineWidth(Math.abs((float)currentPen.getPenWidth() * scalingX / extentWx));
+ switch (style) {
+ case MetaPen.PS_DASH:
+ cb.setLineDash(18, 6, 0);
+ break;
+ case MetaPen.PS_DASHDOT:
+ cb.setLiteral("[9 6 3 6]0 d\n");
+ break;
+ case MetaPen.PS_DASHDOTDOT:
+ cb.setLiteral("[9 3 3 3 3 3]0 d\n");
+ break;
+ case MetaPen.PS_DOT:
+ cb.setLineDash(3, 0);
+ break;
+ default:
+ cb.setLineDash(0);
+ break;
+ }
+ }
+ break;
+ }
+ case MetaObject.META_FONT:
+ {
+ currentFont = (MetaFont)obj;
+ break;
+ }
+ }
+ }
+
+ public void deleteMetaObject(int index) {
+ MetaObjects.set(index, null);
+ }
+
+ public void saveState(PdfContentByte cb) {
+ cb.saveState();
+ MetaState state = new MetaState(this);
+ savedStates.push(state);
+ }
+
+ public void restoreState(int index, PdfContentByte cb) {
+ int pops;
+ if (index < 0)
+ pops = Math.min(-index, savedStates.size());
+ else
+ pops = Math.max(savedStates.size() - index, 0);
+ if (pops == 0)
+ return;
+ MetaState state = null;
+ while (pops-- != 0) {
+ cb.restoreState();
+ state = (MetaState)savedStates.pop();
+ }
+ setMetaState(state);
+ }
+
+ public void cleanup(PdfContentByte cb) {
+ int k = savedStates.size();
+ while (k-- > 0)
+ cb.restoreState();
+ }
+
+ public float transformX(int x) {
+ return ((float)x - offsetWx) * scalingX / extentWx;
+ }
+
+ public float transformY(int y) {
+ return (1f - ((float)y - offsetWy) / extentWy) * scalingY;
+ }
+
+ public void setScalingX(float scalingX) {
+ this.scalingX = scalingX;
+ }
+
+ public void setScalingY(float scalingY) {
+ this.scalingY = scalingY;
+ }
+
+ public void setOffsetWx(int offsetWx) {
+ this.offsetWx = offsetWx;
+ }
+
+ public void setOffsetWy(int offsetWy) {
+ this.offsetWy = offsetWy;
+ }
+
+ public void setExtentWx(int extentWx) {
+ this.extentWx = extentWx;
+ }
+
+ public void setExtentWy(int extentWy) {
+ this.extentWy = extentWy;
+ }
+
+ public float transformAngle(float angle) {
+ float ta = scalingY < 0 ? -angle : angle;
+ return (float)(scalingX < 0 ? Math.PI - ta : ta);
+ }
+
+ public void setCurrentPoint(Point p) {
+ currentPoint = p;
+ }
+
+ public Point getCurrentPoint() {
+ return currentPoint;
+ }
+
+ public MetaBrush getCurrentBrush() {
+ return currentBrush;
+ }
+
+ public MetaPen getCurrentPen() {
+ return currentPen;
+ }
+
+ public MetaFont getCurrentFont() {
+ return currentFont;
+ }
+
+ /** Getter for property currentBackgroundColor.
+ * @return Value of property currentBackgroundColor.
+ */
+ public Color getCurrentBackgroundColor() {
+ return currentBackgroundColor;
+ }
+
+ /** Setter for property currentBackgroundColor.
+ * @param currentBackgroundColor New value of property currentBackgroundColor.
+ */
+ public void setCurrentBackgroundColor(Color currentBackgroundColor) {
+ this.currentBackgroundColor = currentBackgroundColor;
+ }
+
+ /** Getter for property currentTextColor.
+ * @return Value of property currentTextColor.
+ */
+ public Color getCurrentTextColor() {
+ return currentTextColor;
+ }
+
+ /** Setter for property currentTextColor.
+ * @param currentTextColor New value of property currentTextColor.
+ */
+ public void setCurrentTextColor(Color currentTextColor) {
+ this.currentTextColor = currentTextColor;
+ }
+
+ /** Getter for property backgroundMode.
+ * @return Value of property backgroundMode.
+ */
+ public int getBackgroundMode() {
+ return backgroundMode;
+ }
+
+ /** Setter for property backgroundMode.
+ * @param backgroundMode New value of property backgroundMode.
+ */
+ public void setBackgroundMode(int backgroundMode) {
+ this.backgroundMode = backgroundMode;
+ }
+
+ /** Getter for property textAlign.
+ * @return Value of property textAlign.
+ */
+ public int getTextAlign() {
+ return textAlign;
+ }
+
+ /** Setter for property textAlign.
+ * @param textAlign New value of property textAlign.
+ */
+ public void setTextAlign(int textAlign) {
+ this.textAlign = textAlign;
+ }
+
+ /** Getter for property polyFillMode.
+ * @return Value of property polyFillMode.
+ */
+ public int getPolyFillMode() {
+ return polyFillMode;
+ }
+
+ /** Setter for property polyFillMode.
+ * @param polyFillMode New value of property polyFillMode.
+ */
+ public void setPolyFillMode(int polyFillMode) {
+ this.polyFillMode = polyFillMode;
+ }
+
+ public void setLineJoinRectangle(PdfContentByte cb) {
+ if (lineJoin != 0) {
+ lineJoin = 0;
+ cb.setLineJoin(0);
+ }
+ }
+
+ public void setLineJoinPolygon(PdfContentByte cb) {
+ if (lineJoin == 0) {
+ lineJoin = 1;
+ cb.setLineJoin(1);
+ }
+ }
+
+ public boolean getLineNeutral() {
+ return (lineJoin == 0);
+ }
+
+}
diff --git a/src/main/java/com/lowagie/text/pdf/events/FieldPositioningEvents.java b/src/main/java/com/lowagie/text/pdf/events/FieldPositioningEvents.java
new file mode 100644
index 0000000..144ebcc
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/events/FieldPositioningEvents.java
@@ -0,0 +1,186 @@
+/*
+ * Copyright 2005 by Bruno Lowagie
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999-2005 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000-2005 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+package com.lowagie.text.pdf.events;
+
+import java.io.IOException;
+import java.util.HashMap;
+
+import com.lowagie.text.Document;
+import com.lowagie.text.DocumentException;
+import com.lowagie.text.ExceptionConverter;
+import com.lowagie.text.Rectangle;
+import com.lowagie.text.pdf.PdfContentByte;
+import com.lowagie.text.pdf.PdfFormField;
+import com.lowagie.text.pdf.PdfName;
+import com.lowagie.text.pdf.PdfPCell;
+import com.lowagie.text.pdf.PdfPCellEvent;
+import com.lowagie.text.pdf.PdfPageEventHelper;
+import com.lowagie.text.pdf.PdfRectangle;
+import com.lowagie.text.pdf.PdfWriter;
+import com.lowagie.text.pdf.TextField;
+
+/**
+ * Class for an index.
+ *
+ * @author Michael Niedermair
+ */
+public class FieldPositioningEvents extends PdfPageEventHelper implements PdfPCellEvent {
+
+ /**
+ * Keeps a map with fields that are to be positioned in inGenericTag.
+ */
+ protected HashMap genericChunkFields = new HashMap();
+
+ /**
+ * Keeps the form field that is to be positioned in a cellLayout event.
+ */
+ protected PdfFormField cellField = null;
+
+ /**
+ * The PdfWriter to use when a field has to added in a cell event.
+ */
+ protected PdfWriter fieldWriter = null;
+ /**
+ * The PdfFormField that is the parent of the field added in a cell event.
+ */
+ protected PdfFormField parent = null;
+
+ /** Creates a new event. This constructor will be used if you need to position fields with Chunk objects. */
+ public FieldPositioningEvents() {}
+
+ /** Some extra padding that will be taken into account when defining the widget. */
+ public float padding;
+
+ /**
+ * Add a PdfFormField that has to be tied to a generic Chunk.
+ */
+ public void addField(String text, PdfFormField field) {
+ genericChunkFields.put(text, field);
+ }
+
+ /** Creates a new event. This constructor will be used if you need to position fields with a Cell Event. */
+ public FieldPositioningEvents(PdfWriter writer, PdfFormField field) {
+ this.cellField = field;
+ this.fieldWriter = writer;
+ }
+
+ /** Creates a new event. This constructor will be used if you need to position fields with a Cell Event. */
+ public FieldPositioningEvents(PdfFormField parent, PdfFormField field) {
+ this.cellField = field;
+ this.parent = parent;
+ }
+
+ /** Creates a new event. This constructor will be used if you need to position fields with a Cell Event.
+ * @throws DocumentException
+ * @throws IOException*/
+ public FieldPositioningEvents(PdfWriter writer, String text) throws IOException, DocumentException {
+ this.fieldWriter = writer;
+ TextField tf = new TextField(writer, new Rectangle(0, 0), text);
+ tf.setFontSize(14);
+ cellField = tf.getTextField();
+ }
+
+ /** Creates a new event. This constructor will be used if you need to position fields with a Cell Event.
+ * @throws DocumentException
+ * @throws IOException*/
+ public FieldPositioningEvents(PdfWriter writer, PdfFormField parent, String text) throws IOException, DocumentException {
+ this.parent = parent;
+ TextField tf = new TextField(writer, new Rectangle(0, 0), text);
+ tf.setFontSize(14);
+ cellField = tf.getTextField();
+ }
+
+ /**
+ * @param padding The padding to set.
+ */
+ public void setPadding(float padding) {
+ this.padding = padding;
+ }
+
+ /**
+ * @param parent The parent to set.
+ */
+ public void setParent(PdfFormField parent) {
+ this.parent = parent;
+ }
+ /**
+ * @see com.lowagie.text.pdf.PdfPageEvent#onGenericTag(com.lowagie.text.pdf.PdfWriter, com.lowagie.text.Document, com.lowagie.text.Rectangle, java.lang.String)
+ */
+ public void onGenericTag(PdfWriter writer, Document document,
+ Rectangle rect, String text) {
+ rect.setBottom(rect.bottom() - 3);
+ PdfFormField field = (PdfFormField) genericChunkFields.get(text);
+ if (field == null) {
+ TextField tf = new TextField(writer, new Rectangle(rect.left(padding), rect.bottom(padding), rect.right(padding), rect.top(padding)), text);
+ tf.setFontSize(14);
+ try {
+ field = tf.getTextField();
+ } catch (Exception e) {
+ throw new ExceptionConverter(e);
+ }
+ }
+ else {
+ field.put(PdfName.RECT, new PdfRectangle(rect.left(padding), rect.bottom(padding), rect.right(padding), rect.top(padding)));
+ }
+ if (parent == null)
+ writer.addAnnotation(field);
+ else
+ parent.addKid(field);
+ }
+
+ /**
+ * @see com.lowagie.text.pdf.PdfPCellEvent#cellLayout(com.lowagie.text.pdf.PdfPCell, com.lowagie.text.Rectangle, com.lowagie.text.pdf.PdfContentByte[])
+ */
+ public void cellLayout(PdfPCell cell, Rectangle rect, PdfContentByte[] canvases) {
+ if (cellField == null || (fieldWriter == null && parent == null)) throw new ExceptionConverter(new IllegalArgumentException("You have used the wrong constructor for this FieldPositioningEvents class."));
+ cellField.put(PdfName.RECT, new PdfRectangle(rect.left(padding), rect.bottom(padding), rect.right(padding), rect.top(padding)));
+ if (parent == null)
+ fieldWriter.addAnnotation(cellField);
+ else
+ parent.addKid(cellField);
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/pdf/events/IndexEvents.java b/src/main/java/com/lowagie/text/pdf/events/IndexEvents.java
new file mode 100644
index 0000000..13925a5
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/events/IndexEvents.java
@@ -0,0 +1,401 @@
+/*
+ * Copyright 2005 by Michael Niedermair.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999-2005 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000-2005 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+package com.lowagie.text.pdf.events;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.TreeMap;
+
+import com.lowagie.text.Chunk;
+import com.lowagie.text.Document;
+import com.lowagie.text.Rectangle;
+import com.lowagie.text.pdf.PdfPageEventHelper;
+import com.lowagie.text.pdf.PdfWriter;
+
+/**
+ * Class for an index.
+ *
+ * @author Michael Niedermair
+ */
+public class IndexEvents extends PdfPageEventHelper {
+
+ /**
+ * keeps the indextag with the pagenumber
+ */
+ private Map indextag = new TreeMap();
+
+ /**
+ * All the text that is passed to this event, gets registered in the indexentry.
+ *
+ * @see com.lowagie.text.pdf.PdfPageEventHelper#onGenericTag(
+ * com.lowagie.text.pdf.PdfWriter, com.lowagie.text.Document,
+ * com.lowagie.text.Rectangle, java.lang.String)
+ */
+ public void onGenericTag(PdfWriter writer, Document document,
+ Rectangle rect, String text) {
+ indextag.put(text, new Integer(writer.getPageNumber()));
+ }
+
+ // --------------------------------------------------------------------
+ /**
+ * indexcounter
+ */
+ private long indexcounter = 0;
+
+ /**
+ * the list for the index entry
+ */
+ private List indexentry = new ArrayList();
+
+ /**
+ * Create an index entry.
+ *
+ * @param text The text for the Chunk.
+ * @param in1 The first level.
+ * @param in2 The second level.
+ * @param in3 The third level.
+ * @return Returns the Chunk.
+ */
+ public Chunk create(final String text, final String in1, final String in2,
+ final String in3) {
+
+ Chunk chunk = new Chunk(text);
+ String tag = "idx_" + String.valueOf(indexcounter++);
+ chunk.setGenericTag(tag);
+ chunk.setLocalDestination(tag);
+ Entry entry = new Entry(in1, in2, in3, tag);
+ indexentry.add(entry);
+ return chunk;
+ }
+
+ /**
+ * Create an index entry.
+ *
+ * @param text The text for the Chunk.
+ * @param in1 The first level.
+ * @return Returns the Chunk.
+ */
+ public Chunk create(final String text, final String in1) {
+ return create(text, in1, "", "");
+ }
+
+ /**
+ * Create an index entry.
+ *
+ * @param text The text for the Chunk.
+ * @param in1 The first level.
+ * @param in2 The second level.
+ * @return Returns the Chunk.
+ */
+ public Chunk create(final String text, final String in1, final String in2) {
+ return create(text, in1, in2, "");
+ }
+
+ /**
+ * Create an index entry.
+ *
+ * @param text The text.
+ * @param in1 The first level.
+ * @param in2 The second level.
+ * @param in3 The third level.
+ */
+ public void create(final Chunk text, final String in1, final String in2,
+ final String in3) {
+
+ String tag = "idx_" + String.valueOf(indexcounter++);
+ text.setGenericTag(tag);
+ text.setLocalDestination(tag);
+ Entry entry = new Entry(in1, in2, in3, tag);
+ indexentry.add(entry);
+ }
+
+ /**
+ * Create an index entry.
+ *
+ * @param text The text.
+ * @param in1 The first level.
+ */
+ public void create(final Chunk text, final String in1) {
+ create(text, in1, "", "");
+ }
+
+ /**
+ * Create an index entry.
+ *
+ * @param text The text.
+ * @param in1 The first level.
+ * @param in2 The second level.
+ */
+ public void create(final Chunk text, final String in1, final String in2) {
+ create(text, in1, in2, "");
+ }
+
+ /**
+ * Comparator for sorting the index
+ */
+ private Comparator comparator = new Comparator() {
+
+ public int compare(Object arg0, Object arg1) {
+ Entry en1 = (Entry) arg0;
+ Entry en2 = (Entry) arg1;
+
+ int rt = 0;
+ if (en1.getIn1() != null && en2.getIn1() != null) {
+ if ((rt = en1.getIn1().compareToIgnoreCase(en2.getIn1())) == 0) {
+ // in1 equals
+ if (en1.getIn2() != null && en2.getIn2() != null) {
+ if ((rt = en1.getIn2()
+ .compareToIgnoreCase(en2.getIn2())) == 0) {
+ // in2 equals
+ if (en1.getIn3() != null && en2.getIn3() != null) {
+ rt = en1.getIn3().compareToIgnoreCase(
+ en2.getIn3());
+ }
+ }
+ }
+ }
+ }
+ return rt;
+ }
+ };
+
+ /**
+ * Set the comparator.
+ * @param aComparator The comparator to set.
+ */
+ public void setComparator(Comparator aComparator) {
+ comparator = aComparator;
+ }
+
+ /**
+ * Returns the sorted list with the entries and the collected page numbers.
+ * @return Returns the sorted list with the entries and teh collected page numbers.
+ */
+ public List getSortedEntries() {
+
+ Map grouped = new HashMap();
+
+ for (int i = 0; i < indexentry.size(); i++) {
+ Entry e = (Entry) indexentry.get(i);
+ String key = e.getKey();
+
+ Entry master = (Entry) grouped.get(key);
+ if (master != null) {
+ master.addPageNumberAndTag(e.getPageNumber(), e.getTag());
+ } else {
+ e.addPageNumberAndTag(e.getPageNumber(), e.getTag());
+ grouped.put(key, e);
+ }
+ }
+
+ // copy to a list and sort it
+ List sorted = new ArrayList(grouped.size());
+ Iterator it = grouped.keySet().iterator();
+ while (it.hasNext()) {
+ String key = (String) it.next();
+ Entry e = (Entry) grouped.get(key);
+ sorted.add(e);
+ }
+ Collections.sort(sorted, comparator);
+ return sorted;
+ }
+
+ // --------------------------------------------------------------------
+ /**
+ * Class for an index entry.
+ * <p>
+ * In the first step, only in1, in2,in3 and tag are used.
+ * After the collections of the index entries, pagenumbers are used.
+ * </p>
+ */
+ public class Entry {
+
+ /**
+ * first level
+ */
+ private String in1;
+
+ /**
+ * second level
+ */
+ private String in2;
+
+ /**
+ * third level
+ */
+ private String in3;
+
+ /**
+ * the tag
+ */
+ private String tag;
+
+ /**
+ * the lsit of all page numbers.
+ */
+ private List pagenumbers = new ArrayList();
+
+ /**
+ * the lsit of all tags.
+ */
+ private List tags = new ArrayList();
+
+ /**
+ * Create a new object.
+ * @param aIn1 The first level.
+ * @param aIn2 The second level.
+ * @param aIn3 The third level.
+ * @param aTag The tag.
+ */
+ public Entry(final String aIn1, final String aIn2, final String aIn3,
+ final String aTag) {
+ in1 = aIn1;
+ in2 = aIn2;
+ in3 = aIn3;
+ tag = aTag;
+ }
+
+ /**
+ * Returns the in1.
+ * @return Returns the in1.
+ */
+ public String getIn1() {
+ return in1;
+ }
+
+ /**
+ * Returns the in2.
+ * @return Returns the in2.
+ */
+ public String getIn2() {
+ return in2;
+ }
+
+ /**
+ * Returns the in3.
+ * @return Returns the in3.
+ */
+ public String getIn3() {
+ return in3;
+ }
+
+ /**
+ * Returns the tag.
+ * @return Returns the tag.
+ */
+ public String getTag() {
+ return tag;
+ }
+
+ /**
+ * Returns the pagenumer for this entry.
+ * @return Returns the pagenumer for this entry.
+ */
+ public int getPageNumber() {
+ int rt = -1;
+ Integer i = (Integer) indextag.get(tag);
+ if (i != null) {
+ rt = i.intValue();
+ }
+ return rt;
+ }
+
+ /**
+ * Add a pagenumber.
+ * @param number The page number.
+ * @param tag
+ */
+ public void addPageNumberAndTag(final int number, final String tag) {
+ pagenumbers.add(new Integer(number));
+ tags.add(tag);
+ }
+
+ /**
+ * Returns the key for the map-entry.
+ * @return Returns the key for the map-entry.
+ */
+ public String getKey() {
+ return in1 + "!" + in2 + "!" + in3;
+ }
+
+ /**
+ * Returns the pagenumbers.
+ * @return Returns the pagenumbers.
+ */
+ public List getPagenumbers() {
+ return pagenumbers;
+ }
+
+ /**
+ * Returns the tags.
+ * @return Returns the tags.
+ */
+ public List getTags() {
+ return tags;
+ }
+
+ /**
+ * print the entry (only for test)
+ * @return the toString implementation of the entry
+ */
+ public String toString() {
+ StringBuffer buf = new StringBuffer();
+ buf.append(in1).append(" ");
+ buf.append(in2).append(" ");
+ buf.append(in3).append(" ");
+ for (int i = 0; i < pagenumbers.size(); i++) {
+ buf.append(pagenumbers.get(i)).append(" ");
+ }
+ return buf.toString();
+ }
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/pdf/events/PdfPCellEventForwarder.java b/src/main/java/com/lowagie/text/pdf/events/PdfPCellEventForwarder.java
new file mode 100644
index 0000000..080f380
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/events/PdfPCellEventForwarder.java
@@ -0,0 +1,91 @@
+/*
+ * $Id: PdfPCellEventForwarder.java,v 1.1 2005/10/27 15:57:53 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2005 Bruno Lowagie
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf.events;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+
+import com.lowagie.text.Rectangle;
+import com.lowagie.text.pdf.PdfContentByte;
+import com.lowagie.text.pdf.PdfPCell;
+import com.lowagie.text.pdf.PdfPCellEvent;
+
+/**
+ * If you want to add more than one event to a cell,
+ * you have to construct a PdfPCellEventForwarder, add the
+ * different events to this object and add the forwarder to
+ * the PdfPCell.
+ */
+
+public class PdfPCellEventForwarder implements PdfPCellEvent {
+
+ /** ArrayList containing all the PageEvents that have to be executed. */
+ protected ArrayList events = new ArrayList();
+
+ /**
+ * Add a page event to the forwarder.
+ * @param event an event that has to be added to the forwarder.
+ */
+ public void addCellEvent(PdfPCellEvent event) {
+ events.add(event);
+ }
+
+ /**
+ * @see com.lowagie.text.pdf.PdfPCellEvent#cellLayout(com.lowagie.text.pdf.PdfPCell, com.lowagie.text.Rectangle, com.lowagie.text.pdf.PdfContentByte[])
+ */
+ public void cellLayout(PdfPCell cell, Rectangle position, PdfContentByte[] canvases) {
+ PdfPCellEvent event;
+ for (Iterator i = events.iterator(); i.hasNext(); ) {
+ event = (PdfPCellEvent)i.next();
+ event.cellLayout(cell, position, canvases);
+ }
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/pdf/events/PdfPTableEventForwarder.java b/src/main/java/com/lowagie/text/pdf/events/PdfPTableEventForwarder.java
new file mode 100644
index 0000000..8645385
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/events/PdfPTableEventForwarder.java
@@ -0,0 +1,90 @@
+/*
+ * $Id: PdfPTableEventForwarder.java,v 1.1 2005/10/27 15:57:52 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2005 Bruno Lowagie
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf.events;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+
+import com.lowagie.text.pdf.PdfContentByte;
+import com.lowagie.text.pdf.PdfPTable;
+import com.lowagie.text.pdf.PdfPTableEvent;
+
+/**
+ * If you want to add more than one page event to a PdfPTable,
+ * you have to construct a PdfPTableEventForwarder, add the
+ * different events to this object and add the forwarder to
+ * the PdfWriter.
+ */
+
+public class PdfPTableEventForwarder implements PdfPTableEvent {
+
+ /** ArrayList containing all the PageEvents that have to be executed. */
+ protected ArrayList events = new ArrayList();
+
+ /**
+ * Add a page event to the forwarder.
+ * @param event an event that has to be added to the forwarder.
+ */
+ public void addTableEvent(PdfPTableEvent event) {
+ events.add(event);
+ }
+
+ /**
+ * @see com.lowagie.text.pdf.PdfPTableEvent#tableLayout(com.lowagie.text.pdf.PdfPTable, float[][], float[], int, int, com.lowagie.text.pdf.PdfContentByte[])
+ */
+ public void tableLayout(PdfPTable table, float[][] widths, float[] heights, int headerRows, int rowStart, PdfContentByte[] canvases) {
+ PdfPTableEvent event;
+ for (Iterator i = events.iterator(); i.hasNext(); ) {
+ event = (PdfPTableEvent)i.next();
+ event.tableLayout(table, widths, heights, headerRows, rowStart, canvases);
+ }
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/pdf/events/PdfPageEventForwarder.java b/src/main/java/com/lowagie/text/pdf/events/PdfPageEventForwarder.java
new file mode 100644
index 0000000..58bf3c2
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/events/PdfPageEventForwarder.java
@@ -0,0 +1,312 @@
+/*
+ * $Id: PdfPageEventForwarder.java,v 1.1 2005/10/07 07:14:18 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2005 Bruno Lowagie
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf.events;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+
+import com.lowagie.text.Document;
+import com.lowagie.text.Rectangle;
+import com.lowagie.text.Paragraph;
+import com.lowagie.text.pdf.PdfPageEvent;
+import com.lowagie.text.pdf.PdfWriter;
+
+/**
+ * If you want to add more than one page event to a PdfWriter,
+ * you have to construct a PdfPageEventForwarder, add the
+ * different events to this object and add the forwarder to
+ * the PdfWriter.
+ */
+
+public class PdfPageEventForwarder implements PdfPageEvent {
+
+ /** ArrayList containing all the PageEvents that have to be executed. */
+ protected ArrayList events = new ArrayList();
+
+ /**
+ * Add a page event to the forwarder.
+ * @param event an event that has to be added to the forwarder.
+ */
+ public void addPageEvent(PdfPageEvent event) {
+ events.add(event);
+ }
+
+ /**
+ * Called when the document is opened.
+ *
+ * @param writer
+ * the <CODE>PdfWriter</CODE> for this document
+ * @param document
+ * the document
+ */
+ public void onOpenDocument(PdfWriter writer, Document document) {
+ PdfPageEvent event;
+ for (Iterator i = events.iterator(); i.hasNext(); ) {
+ event = (PdfPageEvent)i.next();
+ event.onOpenDocument(writer, document);
+ }
+ }
+
+ /**
+ * Called when a page is initialized.
+ * <P>
+ * Note that if even if a page is not written this method is still called.
+ * It is preferable to use <CODE>onEndPage</CODE> to avoid infinite loops.
+ *
+ * @param writer
+ * the <CODE>PdfWriter</CODE> for this document
+ * @param document
+ * the document
+ */
+ public void onStartPage(PdfWriter writer, Document document) {
+ PdfPageEvent event;
+ for (Iterator i = events.iterator(); i.hasNext(); ) {
+ event = (PdfPageEvent)i.next();
+ event.onStartPage(writer, document);
+ }
+ }
+
+ /**
+ * Called when a page is finished, just before being written to the
+ * document.
+ *
+ * @param writer
+ * the <CODE>PdfWriter</CODE> for this document
+ * @param document
+ * the document
+ */
+ public void onEndPage(PdfWriter writer, Document document) {
+ PdfPageEvent event;
+ for (Iterator i = events.iterator(); i.hasNext(); ) {
+ event = (PdfPageEvent)i.next();
+ event.onEndPage(writer, document);
+ }
+ }
+
+ /**
+ * Called when the document is closed.
+ * <P>
+ * Note that this method is called with the page number equal to the last
+ * page plus one.
+ *
+ * @param writer
+ * the <CODE>PdfWriter</CODE> for this document
+ * @param document
+ * the document
+ */
+ public void onCloseDocument(PdfWriter writer, Document document) {
+ PdfPageEvent event;
+ for (Iterator i = events.iterator(); i.hasNext(); ) {
+ event = (PdfPageEvent)i.next();
+ event.onCloseDocument(writer, document);
+ }
+ }
+
+ /**
+ * Called when a Paragraph is written.
+ * <P>
+ * <CODE>paragraphPosition</CODE> will hold the height at which the
+ * paragraph will be written to. This is useful to insert bookmarks with
+ * more control.
+ *
+ * @param writer
+ * the <CODE>PdfWriter</CODE> for this document
+ * @param document
+ * the document
+ * @param paragraphPosition
+ * the position the paragraph will be written to
+ */
+ public void onParagraph(PdfWriter writer, Document document,
+ float paragraphPosition) {
+ PdfPageEvent event;
+ for (Iterator i = events.iterator(); i.hasNext(); ) {
+ event = (PdfPageEvent)i.next();
+ event.onParagraph(writer, document, paragraphPosition);
+ }
+ }
+
+ /**
+ * Called when a Paragraph is written.
+ * <P>
+ * <CODE>paragraphPosition</CODE> will hold the height of the end of the
+ * paragraph.
+ *
+ * @param writer
+ * the <CODE>PdfWriter</CODE> for this document
+ * @param document
+ * the document
+ * @param paragraphPosition
+ * the position of the end of the paragraph
+ */
+ public void onParagraphEnd(PdfWriter writer, Document document,
+ float paragraphPosition) {
+ PdfPageEvent event;
+ for (Iterator i = events.iterator(); i.hasNext(); ) {
+ event = (PdfPageEvent)i.next();
+ event.onParagraphEnd(writer, document, paragraphPosition);
+ }
+ }
+
+ /**
+ * Called when a Chapter is written.
+ * <P>
+ * <CODE>position</CODE> will hold the height at which the chapter will be
+ * written to.
+ *
+ * @param writer
+ * the <CODE>PdfWriter</CODE> for this document
+ * @param document
+ * the document
+ * @param paragraphPosition
+ * the position the chapter will be written to
+ * @param title
+ * the title of the Chapter
+ */
+ public void onChapter(PdfWriter writer, Document document,
+ float paragraphPosition, Paragraph title) {
+ PdfPageEvent event;
+ for (Iterator i = events.iterator(); i.hasNext(); ) {
+ event = (PdfPageEvent)i.next();
+ event.onChapter(writer, document, paragraphPosition, title);
+ }
+ }
+
+ /**
+ * Called when the end of a Chapter is reached.
+ * <P>
+ * <CODE>position</CODE> will hold the height of the end of the chapter.
+ *
+ * @param writer
+ * the <CODE>PdfWriter</CODE> for this document
+ * @param document
+ * the document
+ * @param position
+ * the position of the end of the chapter.
+ */
+ public void onChapterEnd(PdfWriter writer, Document document, float position) {
+ PdfPageEvent event;
+ for (Iterator i = events.iterator(); i.hasNext(); ) {
+ event = (PdfPageEvent)i.next();
+ event.onChapterEnd(writer, document, position);
+ }
+ }
+
+ /**
+ * Called when a Section is written.
+ * <P>
+ * <CODE>position</CODE> will hold the height at which the section will be
+ * written to.
+ *
+ * @param writer
+ * the <CODE>PdfWriter</CODE> for this document
+ * @param document
+ * the document
+ * @param paragraphPosition
+ * the position the section will be written to
+ * @param depth
+ * the number depth of the Section
+ * @param title
+ * the title of the section
+ */
+ public void onSection(PdfWriter writer, Document document,
+ float paragraphPosition, int depth, Paragraph title) {
+ PdfPageEvent event;
+ for (Iterator i = events.iterator(); i.hasNext(); ) {
+ event = (PdfPageEvent)i.next();
+ event.onSection(writer, document, paragraphPosition, depth, title);
+ }
+ }
+
+ /**
+ * Called when the end of a Section is reached.
+ * <P>
+ * <CODE>position</CODE> will hold the height of the section end.
+ *
+ * @param writer
+ * the <CODE>PdfWriter</CODE> for this document
+ * @param document
+ * the document
+ * @param position
+ * the position of the end of the section
+ */
+ public void onSectionEnd(PdfWriter writer, Document document, float position) {
+ PdfPageEvent event;
+ for (Iterator i = events.iterator(); i.hasNext(); ) {
+ event = (PdfPageEvent)i.next();
+ event.onSectionEnd(writer, document, position);
+ }
+ }
+
+ /**
+ * Called when a <CODE>Chunk</CODE> with a generic tag is written.
+ * <P>
+ * It is usefull to pinpoint the <CODE>Chunk</CODE> location to generate
+ * bookmarks, for example.
+ *
+ * @param writer
+ * the <CODE>PdfWriter</CODE> for this document
+ * @param document
+ * the document
+ * @param rect
+ * the <CODE>Rectangle</CODE> containing the <CODE>Chunk
+ * </CODE>
+ * @param text
+ * the text of the tag
+ */
+ public void onGenericTag(PdfWriter writer, Document document,
+ Rectangle rect, String text) {
+ PdfPageEvent event;
+ for (Iterator i = events.iterator(); i.hasNext(); ) {
+ event = (PdfPageEvent)i.next();
+ event.onGenericTag(writer, document, rect, text);
+ }
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/pdf/fonts/FontsResourceAnchor.java b/src/main/java/com/lowagie/text/pdf/fonts/FontsResourceAnchor.java
new file mode 100644
index 0000000..57cb502
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/fonts/FontsResourceAnchor.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright 2004 by Paulo Soares.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+package com.lowagie.text.pdf.fonts;
+
+/**
+ * A class to facilitate the loading of resources
+ *
+ * @author Paulo Soares (psoares@consiste.pt)
+ */
+public class FontsResourceAnchor {
+
+ /**
+ * Creates a FontsResourceAnchor
+ */
+ public FontsResourceAnchor() {
+ }
+
+}
diff --git a/src/main/java/com/lowagie/text/pdf/hyphenation/ByteVector.java b/src/main/java/com/lowagie/text/pdf/hyphenation/ByteVector.java
new file mode 100644
index 0000000..f3a83ec
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/hyphenation/ByteVector.java
@@ -0,0 +1,124 @@
+/*
+ * Copyright 1999-2004 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.lowagie.text.pdf.hyphenation;
+
+import java.io.Serializable;
+
+/**
+ * This class implements a simple byte vector with access to the
+ * underlying array.
+ *
+ * @author Carlos Villegas <cav@uniscope.co.jp>
+ */
+public class ByteVector implements Serializable {
+
+ /**
+ * Capacity increment size
+ */
+ private static final int DEFAULT_BLOCK_SIZE = 2048;
+ private int blockSize;
+
+ /**
+ * The encapsulated array
+ */
+ private byte[] array;
+
+ /**
+ * Points to next free item
+ */
+ private int n;
+
+ public ByteVector() {
+ this(DEFAULT_BLOCK_SIZE);
+ }
+
+ public ByteVector(int capacity) {
+ if (capacity > 0) {
+ blockSize = capacity;
+ } else {
+ blockSize = DEFAULT_BLOCK_SIZE;
+ }
+ array = new byte[blockSize];
+ n = 0;
+ }
+
+ public ByteVector(byte[] a) {
+ blockSize = DEFAULT_BLOCK_SIZE;
+ array = a;
+ n = 0;
+ }
+
+ public ByteVector(byte[] a, int capacity) {
+ if (capacity > 0) {
+ blockSize = capacity;
+ } else {
+ blockSize = DEFAULT_BLOCK_SIZE;
+ }
+ array = a;
+ n = 0;
+ }
+
+ public byte[] getArray() {
+ return array;
+ }
+
+ /**
+ * return number of items in array
+ */
+ public int length() {
+ return n;
+ }
+
+ /**
+ * returns current capacity of array
+ */
+ public int capacity() {
+ return array.length;
+ }
+
+ public void put(int index, byte val) {
+ array[index] = val;
+ }
+
+ public byte get(int index) {
+ return array[index];
+ }
+
+ /**
+ * This is to implement memory allocation in the array. Like malloc().
+ */
+ public int alloc(int size) {
+ int index = n;
+ int len = array.length;
+ if (n + size >= len) {
+ byte[] aux = new byte[len + blockSize];
+ System.arraycopy(array, 0, aux, 0, len);
+ array = aux;
+ }
+ n += size;
+ return index;
+ }
+
+ public void trimToSize() {
+ if (n < array.length) {
+ byte[] aux = new byte[n];
+ System.arraycopy(array, 0, aux, 0, n);
+ array = aux;
+ }
+ }
+
+}
diff --git a/src/main/java/com/lowagie/text/pdf/hyphenation/CharVector.java b/src/main/java/com/lowagie/text/pdf/hyphenation/CharVector.java
new file mode 100644
index 0000000..777cc7a
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/hyphenation/CharVector.java
@@ -0,0 +1,134 @@
+/*
+ * Copyright 1999-2004 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.lowagie.text.pdf.hyphenation;
+
+import java.io.Serializable;
+
+/**
+ * This class implements a simple char vector with access to the
+ * underlying array.
+ *
+ * @author Carlos Villegas <cav@uniscope.co.jp>
+ */
+public class CharVector implements Cloneable, Serializable {
+
+ /**
+ * Capacity increment size
+ */
+ private static final int DEFAULT_BLOCK_SIZE = 2048;
+ private int blockSize;
+
+ /**
+ * The encapsulated array
+ */
+ private char[] array;
+
+ /**
+ * Points to next free item
+ */
+ private int n;
+
+ public CharVector() {
+ this(DEFAULT_BLOCK_SIZE);
+ }
+
+ public CharVector(int capacity) {
+ if (capacity > 0) {
+ blockSize = capacity;
+ } else {
+ blockSize = DEFAULT_BLOCK_SIZE;
+ }
+ array = new char[blockSize];
+ n = 0;
+ }
+
+ public CharVector(char[] a) {
+ blockSize = DEFAULT_BLOCK_SIZE;
+ array = a;
+ n = a.length;
+ }
+
+ public CharVector(char[] a, int capacity) {
+ if (capacity > 0) {
+ blockSize = capacity;
+ } else {
+ blockSize = DEFAULT_BLOCK_SIZE;
+ }
+ array = a;
+ n = a.length;
+ }
+
+ /**
+ * Reset Vector but don't resize or clear elements
+ */
+ public void clear() {
+ n = 0;
+ }
+
+ public Object clone() {
+ CharVector cv = new CharVector((char[])array.clone(), blockSize);
+ cv.n = this.n;
+ return cv;
+ }
+
+ public char[] getArray() {
+ return array;
+ }
+
+ /**
+ * return number of items in array
+ */
+ public int length() {
+ return n;
+ }
+
+ /**
+ * returns current capacity of array
+ */
+ public int capacity() {
+ return array.length;
+ }
+
+ public void put(int index, char val) {
+ array[index] = val;
+ }
+
+ public char get(int index) {
+ return array[index];
+ }
+
+ public int alloc(int size) {
+ int index = n;
+ int len = array.length;
+ if (n + size >= len) {
+ char[] aux = new char[len + blockSize];
+ System.arraycopy(array, 0, aux, 0, len);
+ array = aux;
+ }
+ n += size;
+ return index;
+ }
+
+ public void trimToSize() {
+ if (n < array.length) {
+ char[] aux = new char[n];
+ System.arraycopy(array, 0, aux, 0, n);
+ array = aux;
+ }
+ }
+
+}
diff --git a/src/main/java/com/lowagie/text/pdf/hyphenation/Hyphen.java b/src/main/java/com/lowagie/text/pdf/hyphenation/Hyphen.java
new file mode 100644
index 0000000..7e2522c
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/hyphenation/Hyphen.java
@@ -0,0 +1,68 @@
+/*
+ * Copyright 1999-2004 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.lowagie.text.pdf.hyphenation;
+
+import java.io.Serializable;
+
+/**
+ * This class represents a hyphen. A 'full' hyphen is made of 3 parts:
+ * the pre-break text, post-break text and no-break. If no line-break
+ * is generated at this position, the no-break text is used, otherwise,
+ * pre-break and post-break are used. Typically, pre-break is equal to
+ * the hyphen character and the others are empty. However, this general
+ * scheme allows support for cases in some languages where words change
+ * spelling if they're split across lines, like german's 'backen' which
+ * hyphenates 'bak-ken'. BTW, this comes from TeX.
+ *
+ * @author Carlos Villegas <cav@uniscope.co.jp>
+ */
+
+public class Hyphen implements Serializable {
+ public String preBreak;
+ public String noBreak;
+ public String postBreak;
+
+ Hyphen(String pre, String no, String post) {
+ preBreak = pre;
+ noBreak = no;
+ postBreak = post;
+ }
+
+ Hyphen(String pre) {
+ preBreak = pre;
+ noBreak = null;
+ postBreak = null;
+ }
+
+ public String toString() {
+ if (noBreak == null
+ && postBreak == null
+ && preBreak != null
+ && preBreak.equals("-")) {
+ return "-";
+ }
+ StringBuffer res = new StringBuffer("{");
+ res.append(preBreak);
+ res.append("}{");
+ res.append(postBreak);
+ res.append("}{");
+ res.append(noBreak);
+ res.append('}');
+ return res.toString();
+ }
+
+}
diff --git a/src/main/java/com/lowagie/text/pdf/hyphenation/Hyphenation.java b/src/main/java/com/lowagie/text/pdf/hyphenation/Hyphenation.java
new file mode 100644
index 0000000..c86ab87
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/hyphenation/Hyphenation.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright 1999-2004 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.lowagie.text.pdf.hyphenation;
+
+/**
+ * This class represents a hyphenated word.
+ *
+ * @author Carlos Villegas <cav@uniscope.co.jp>
+ */
+public class Hyphenation {
+
+ private int[] hyphenPoints;
+ private String word;
+
+ /**
+ * number of hyphenation points in word
+ */
+ private int len;
+
+ /**
+ * rawWord as made of alternating strings and {@link Hyphen Hyphen}
+ * instances
+ */
+ Hyphenation(String word, int[] points) {
+ this.word = word;
+ hyphenPoints = points;
+ len = points.length;
+ }
+
+ /**
+ * @return the number of hyphenation points in the word
+ */
+ public int length() {
+ return len;
+ }
+
+ /**
+ * @return the pre-break text, not including the hyphen character
+ */
+ public String getPreHyphenText(int index) {
+ return word.substring(0, hyphenPoints[index]);
+ }
+
+ /**
+ * @return the post-break text
+ */
+ public String getPostHyphenText(int index) {
+ return word.substring(hyphenPoints[index]);
+ }
+
+ /**
+ * @return the hyphenation points
+ */
+ public int[] getHyphenationPoints() {
+ return hyphenPoints;
+ }
+
+ public String toString() {
+ StringBuffer str = new StringBuffer();
+ int start = 0;
+ for (int i = 0; i < len; i++) {
+ str.append(word.substring(start, hyphenPoints[i]) + "-");
+ start = hyphenPoints[i];
+ }
+ str.append(word.substring(start));
+ return str.toString();
+ }
+
+}
diff --git a/src/main/java/com/lowagie/text/pdf/hyphenation/HyphenationException.java b/src/main/java/com/lowagie/text/pdf/hyphenation/HyphenationException.java
new file mode 100644
index 0000000..575e18d
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/hyphenation/HyphenationException.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright 1999-2004 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.lowagie.text.pdf.hyphenation;
+
+/**
+ * @author Carlos Villegas <cav@uniscope.co.jp>
+ */
+public class HyphenationException extends Exception {
+
+ public HyphenationException(String msg) {
+ super(msg);
+ }
+
+}
diff --git a/src/main/java/com/lowagie/text/pdf/hyphenation/HyphenationTree.java b/src/main/java/com/lowagie/text/pdf/hyphenation/HyphenationTree.java
new file mode 100644
index 0000000..b0d4c0b
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/hyphenation/HyphenationTree.java
@@ -0,0 +1,454 @@
+/*
+ * Copyright 1999-2004 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* $Id: HyphenationTree.java,v 1.40 2005/07/16 16:49:34 blowagie Exp $ */
+
+package com.lowagie.text.pdf.hyphenation;
+
+import java.io.InputStream;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.HashMap;
+
+/**
+ * This tree structure stores the hyphenation patterns in an efficient
+ * way for fast lookup. It provides the provides the method to
+ * hyphenate a word.
+ *
+ * @author Carlos Villegas <cav@uniscope.co.jp>
+ */
+public class HyphenationTree extends TernaryTree
+ implements PatternConsumer, Serializable {
+
+ /**
+ * value space: stores the inteletter values
+ */
+ protected ByteVector vspace;
+
+ /**
+ * This map stores hyphenation exceptions
+ */
+ protected HashMap stoplist;
+
+ /**
+ * This map stores the character classes
+ */
+ protected TernaryTree classmap;
+
+ /**
+ * Temporary map to store interletter values on pattern loading.
+ */
+ private transient TernaryTree ivalues;
+
+ public HyphenationTree() {
+ stoplist = new HashMap(23); // usually a small table
+ classmap = new TernaryTree();
+ vspace = new ByteVector();
+ vspace.alloc(1); // this reserves index 0, which we don't use
+ }
+
+ /**
+ * Packs the values by storing them in 4 bits, two values into a byte
+ * Values range is from 0 to 9. We use zero as terminator,
+ * so we'll add 1 to the value.
+ * @param values a string of digits from '0' to '9' representing the
+ * interletter values.
+ * @return the index into the vspace array where the packed values
+ * are stored.
+ */
+ protected int packValues(String values) {
+ int i, n = values.length();
+ int m = (n & 1) == 1 ? (n >> 1) + 2 : (n >> 1) + 1;
+ int offset = vspace.alloc(m);
+ byte[] va = vspace.getArray();
+ for (i = 0; i < n; i++) {
+ int j = i >> 1;
+ byte v = (byte)((values.charAt(i) - '0' + 1) & 0x0f);
+ if ((i & 1) == 1) {
+ va[j + offset] = (byte)(va[j + offset] | v);
+ } else {
+ va[j + offset] = (byte)(v << 4); // big endian
+ }
+ }
+ va[m - 1 + offset] = 0; // terminator
+ return offset;
+ }
+
+ protected String unpackValues(int k) {
+ StringBuffer buf = new StringBuffer();
+ byte v = vspace.get(k++);
+ while (v != 0) {
+ char c = (char)((v >>> 4) - 1 + '0');
+ buf.append(c);
+ c = (char)(v & 0x0f);
+ if (c == 0) {
+ break;
+ }
+ c = (char)(c - 1 + '0');
+ buf.append(c);
+ v = vspace.get(k++);
+ }
+ return buf.toString();
+ }
+
+ public void loadSimplePatterns(InputStream stream) throws HyphenationException {
+ SimplePatternParser pp = new SimplePatternParser();
+ ivalues = new TernaryTree();
+
+ pp.parse(stream, this);
+
+ // patterns/values should be now in the tree
+ // let's optimize a bit
+ trimToSize();
+ vspace.trimToSize();
+ classmap.trimToSize();
+
+ // get rid of the auxiliary map
+ ivalues = null;
+ }
+
+
+ public String findPattern(String pat) {
+ int k = super.find(pat);
+ if (k >= 0) {
+ return unpackValues(k);
+ }
+ return "";
+ }
+
+ /**
+ * String compare, returns 0 if equal or
+ * t is a substring of s
+ */
+ protected int hstrcmp(char[] s, int si, char[] t, int ti) {
+ for (; s[si] == t[ti]; si++, ti++) {
+ if (s[si] == 0) {
+ return 0;
+ }
+ }
+ if (t[ti] == 0) {
+ return 0;
+ }
+ return s[si] - t[ti];
+ }
+
+ protected byte[] getValues(int k) {
+ StringBuffer buf = new StringBuffer();
+ byte v = vspace.get(k++);
+ while (v != 0) {
+ char c = (char)((v >>> 4) - 1);
+ buf.append(c);
+ c = (char)(v & 0x0f);
+ if (c == 0) {
+ break;
+ }
+ c = (char)(c - 1);
+ buf.append(c);
+ v = vspace.get(k++);
+ }
+ byte[] res = new byte[buf.length()];
+ for (int i = 0; i < res.length; i++) {
+ res[i] = (byte)buf.charAt(i);
+ }
+ return res;
+ }
+
+ /**
+ * <p>Search for all possible partial matches of word starting
+ * at index an update interletter values. In other words, it
+ * does something like:</p>
+ * <code>
+ * for(i=0; i<patterns.length; i++) {
+ * if ( word.substring(index).startsWidth(patterns[i]) )
+ * update_interletter_values(patterns[i]);
+ * }
+ * </code>
+ * <p>But it is done in an efficient way since the patterns are
+ * stored in a ternary tree. In fact, this is the whole purpose
+ * of having the tree: doing this search without having to test
+ * every single pattern. The number of patterns for languages
+ * such as English range from 4000 to 10000. Thus, doing thousands
+ * of string comparisons for each word to hyphenate would be
+ * really slow without the tree. The tradeoff is memory, but
+ * using a ternary tree instead of a trie, almost halves the
+ * the memory used by Lout or TeX. It's also faster than using
+ * a hash table</p>
+ * @param word null terminated word to match
+ * @param index start index from word
+ * @param il interletter values array to update
+ */
+ protected void searchPatterns(char[] word, int index, byte[] il) {
+ byte[] values;
+ int i = index;
+ char p, q;
+ char sp = word[i];
+ p = root;
+
+ while (p > 0 && p < sc.length) {
+ if (sc[p] == 0xFFFF) {
+ if (hstrcmp(word, i, kv.getArray(), lo[p]) == 0) {
+ values = getValues(eq[p]); // data pointer is in eq[]
+ int j = index;
+ for (int k = 0; k < values.length; k++) {
+ if (j < il.length && values[k] > il[j]) {
+ il[j] = values[k];
+ }
+ j++;
+ }
+ }
+ return;
+ }
+ int d = sp - sc[p];
+ if (d == 0) {
+ if (sp == 0) {
+ break;
+ }
+ sp = word[++i];
+ p = eq[p];
+ q = p;
+
+ // look for a pattern ending at this position by searching for
+ // the null char ( splitchar == 0 )
+ while (q > 0 && q < sc.length) {
+ if (sc[q] == 0xFFFF) { // stop at compressed branch
+ break;
+ }
+ if (sc[q] == 0) {
+ values = getValues(eq[q]);
+ int j = index;
+ for (int k = 0; k < values.length; k++) {
+ if (j < il.length && values[k] > il[j]) {
+ il[j] = values[k];
+ }
+ j++;
+ }
+ break;
+ } else {
+ q = lo[q];
+
+ /**
+ * actually the code should be:
+ * q = sc[q] < 0 ? hi[q] : lo[q];
+ * but java chars are unsigned
+ */
+ }
+ }
+ } else {
+ p = d < 0 ? lo[p] : hi[p];
+ }
+ }
+ }
+
+ /**
+ * Hyphenate word and return a Hyphenation object.
+ * @param word the word to be hyphenated
+ * @param remainCharCount Minimum number of characters allowed
+ * before the hyphenation point.
+ * @param pushCharCount Minimum number of characters allowed after
+ * the hyphenation point.
+ * @return a {@link Hyphenation Hyphenation} object representing
+ * the hyphenated word or null if word is not hyphenated.
+ */
+ public Hyphenation hyphenate(String word, int remainCharCount,
+ int pushCharCount) {
+ char[] w = word.toCharArray();
+ return hyphenate(w, 0, w.length, remainCharCount, pushCharCount);
+ }
+
+ /**
+ * w = "****nnllllllnnn*****",
+ * where n is a non-letter, l is a letter,
+ * all n may be absent, the first n is at offset,
+ * the first l is at offset + iIgnoreAtBeginning;
+ * word = ".llllll.'\0'***",
+ * where all l in w are copied into word.
+ * In the first part of the routine len = w.length,
+ * in the second part of the routine len = word.length.
+ * Three indices are used:
+ * index(w), the index in w,
+ * index(word), the index in word,
+ * letterindex(word), the index in the letter part of word.
+ * The following relations exist:
+ * index(w) = offset + i - 1
+ * index(word) = i - iIgnoreAtBeginning
+ * letterindex(word) = index(word) - 1
+ * (see first loop).
+ * It follows that:
+ * index(w) - index(word) = offset - 1 + iIgnoreAtBeginning
+ * index(w) = letterindex(word) + offset + iIgnoreAtBeginning
+ */
+
+ /**
+ * Hyphenate word and return an array of hyphenation points.
+ * @param w char array that contains the word
+ * @param offset Offset to first character in word
+ * @param len Length of word
+ * @param remainCharCount Minimum number of characters allowed
+ * before the hyphenation point.
+ * @param pushCharCount Minimum number of characters allowed after
+ * the hyphenation point.
+ * @return a {@link Hyphenation Hyphenation} object representing
+ * the hyphenated word or null if word is not hyphenated.
+ */
+ public Hyphenation hyphenate(char[] w, int offset, int len,
+ int remainCharCount, int pushCharCount) {
+ int i;
+ char[] word = new char[len + 3];
+
+ // normalize word
+ char[] c = new char[2];
+ int iIgnoreAtBeginning = 0;
+ int iLength = len;
+ boolean bEndOfLetters = false;
+ for (i = 1; i <= len; i++) {
+ c[0] = w[offset + i - 1];
+ int nc = classmap.find(c, 0);
+ if (nc < 0) { // found a non-letter character ...
+ if (i == (1 + iIgnoreAtBeginning)) {
+ // ... before any letter character
+ iIgnoreAtBeginning ++;
+ } else {
+ // ... after a letter character
+ bEndOfLetters = true;
+ }
+ iLength --;
+ } else {
+ if (!bEndOfLetters) {
+ word[i - iIgnoreAtBeginning] = (char)nc;
+ } else {
+ return null;
+ }
+ }
+ }
+ len = iLength;
+ if (len < (remainCharCount + pushCharCount)) {
+ // word is too short to be hyphenated
+ return null;
+ }
+ int[] result = new int[len + 1];
+ int k = 0;
+
+ // check exception list first
+ String sw = new String(word, 1, len);
+ if (stoplist.containsKey(sw)) {
+ // assume only simple hyphens (Hyphen.pre="-", Hyphen.post = Hyphen.no = null)
+ ArrayList hw = (ArrayList)stoplist.get(sw);
+ int j = 0;
+ for (i = 0; i < hw.size(); i++) {
+ Object o = hw.get(i);
+ // j = index(sw) = letterindex(word)?
+ // result[k] = corresponding index(w)
+ if (o instanceof String) {
+ j += ((String)o).length();
+ if (j >= remainCharCount && j < (len - pushCharCount)) {
+ result[k++] = j + iIgnoreAtBeginning;
+ }
+ }
+ }
+ } else {
+ // use algorithm to get hyphenation points
+ word[0] = '.'; // word start marker
+ word[len + 1] = '.'; // word end marker
+ word[len + 2] = 0; // null terminated
+ byte[] il = new byte[len + 3]; // initialized to zero
+ for (i = 0; i < len + 1; i++) {
+ searchPatterns(word, i, il);
+ }
+
+ // hyphenation points are located where interletter value is odd
+ // i is letterindex(word),
+ // i + 1 is index(word),
+ // result[k] = corresponding index(w)
+ for (i = 0; i < len; i++) {
+ if (((il[i + 1] & 1) == 1) && i >= remainCharCount
+ && i <= (len - pushCharCount)) {
+ result[k++] = i + iIgnoreAtBeginning;
+ }
+ }
+ }
+
+
+ if (k > 0) {
+ // trim result array
+ int[] res = new int[k];
+ System.arraycopy(result, 0, res, 0, k);
+ return new Hyphenation(new String(w, offset, len), res);
+ } else {
+ return null;
+ }
+ }
+
+ /**
+ * Add a character class to the tree. It is used by
+ * {@link SimplePatternParser SimplePatternParser} as callback to
+ * add character classes. Character classes define the
+ * valid word characters for hyphenation. If a word contains
+ * a character not defined in any of the classes, it is not hyphenated.
+ * It also defines a way to normalize the characters in order
+ * to compare them with the stored patterns. Usually pattern
+ * files use only lower case characters, in this case a class
+ * for letter 'a', for example, should be defined as "aA", the first
+ * character being the normalization char.
+ */
+ public void addClass(String chargroup) {
+ if (chargroup.length() > 0) {
+ char equivChar = chargroup.charAt(0);
+ char[] key = new char[2];
+ key[1] = 0;
+ for (int i = 0; i < chargroup.length(); i++) {
+ key[0] = chargroup.charAt(i);
+ classmap.insert(key, 0, equivChar);
+ }
+ }
+ }
+
+ /**
+ * Add an exception to the tree. It is used by
+ * {@link SimplePatternParser SimplePatternParser} class as callback to
+ * store the hyphenation exceptions.
+ * @param word normalized word
+ * @param hyphenatedword a vector of alternating strings and
+ * {@link Hyphen hyphen} objects.
+ */
+ public void addException(String word, ArrayList hyphenatedword) {
+ stoplist.put(word, hyphenatedword);
+ }
+
+ /**
+ * Add a pattern to the tree. Mainly, to be used by
+ * {@link SimplePatternParser SimplePatternParser} class as callback to
+ * add a pattern to the tree.
+ * @param pattern the hyphenation pattern
+ * @param ivalue interletter weight values indicating the
+ * desirability and priority of hyphenating at a given point
+ * within the pattern. It should contain only digit characters.
+ * (i.e. '0' to '9').
+ */
+ public void addPattern(String pattern, String ivalue) {
+ int k = ivalues.find(ivalue);
+ if (k <= 0) {
+ k = packValues(ivalue);
+ ivalues.insert(ivalue, (char)k);
+ }
+ insert(pattern, (char)k);
+ }
+
+ public void printStats() {
+ System.out.println("Value space size = "
+ + Integer.toString(vspace.length()));
+ super.printStats();
+ }
+}
diff --git a/src/main/java/com/lowagie/text/pdf/hyphenation/Hyphenator.java b/src/main/java/com/lowagie/text/pdf/hyphenation/Hyphenator.java
new file mode 100644
index 0000000..bdd34b9
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/hyphenation/Hyphenator.java
@@ -0,0 +1,240 @@
+/*
+ * Copyright 1999-2004 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.lowagie.text.pdf.hyphenation;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStream;
+import java.util.Hashtable;
+
+import com.lowagie.text.pdf.BaseFont;
+
+/**
+ * This class is the main entry point to the hyphenation package.
+ * You can use only the static methods or create an instance.
+ *
+ * @author Carlos Villegas <cav@uniscope.co.jp>
+ */
+public class Hyphenator {
+
+ /** TODO: Don't use statics */
+ private static Hashtable hyphenTrees = new Hashtable();
+
+ private HyphenationTree hyphenTree = null;
+ private int remainCharCount = 2;
+ private int pushCharCount = 2;
+ private static boolean errorDump = false;
+ private static final String defaultHyphLocation = "com/lowagie/text/pdf/hyphenation/hyph/";
+
+ /** Holds value of property hyphenDir. */
+ private static String hyphenDir = "";
+
+ /**
+ * @param lang
+ * @param country
+ * @param leftMin
+ * @param rightMin
+ */
+ public Hyphenator(String lang, String country, int leftMin,
+ int rightMin) {
+ hyphenTree = getHyphenationTree(lang, country);
+ remainCharCount = leftMin;
+ pushCharCount = rightMin;
+ }
+
+ /**
+ * @param lang
+ * @param country
+ * @return the hyphenation tree
+ */
+ public static HyphenationTree getHyphenationTree(String lang,
+ String country) {
+ String key = lang;
+ // check whether the country code has been used
+ if (country != null && !country.equals("none")) {
+ key += "_" + country;
+ }
+ // first try to find it in the cache
+ if (hyphenTrees.containsKey(key)) {
+ return (HyphenationTree)hyphenTrees.get(key);
+ }
+ if (hyphenTrees.containsKey(lang)) {
+ return (HyphenationTree)hyphenTrees.get(lang);
+ }
+
+ HyphenationTree hTree = getResourceHyphenationTree(key);
+ if (hTree == null)
+ hTree = getFileHyphenationTree(key);
+ // put it into the pattern cache
+ if (hTree != null) {
+ hyphenTrees.put(key, hTree);
+ }
+ return hTree;
+ }
+
+ /**
+ * @param key
+ * @return a hyphenation tree
+ */
+ public static HyphenationTree getResourceHyphenationTree(String key) {
+ try {
+ InputStream stream = BaseFont.getResourceStream(defaultHyphLocation + key + ".xml");
+ if (stream == null && key.length() > 2)
+ stream = BaseFont.getResourceStream(defaultHyphLocation + key.substring(0, 2) + ".xml");
+ if (stream == null)
+ return null;
+ HyphenationTree hTree = new HyphenationTree();
+ hTree.loadSimplePatterns(stream);
+ return hTree;
+ }
+ catch (Exception e) {
+ return null;
+ }
+ }
+
+ /**
+ * @param key
+ * @return a hyphenation tree
+ */
+ public static HyphenationTree getFileHyphenationTree(String key) {
+ try {
+ if (hyphenDir == null)
+ return null;
+ InputStream stream = null;
+ File hyphenFile = new File(hyphenDir, key + ".xml");
+ if (hyphenFile.canRead())
+ stream = new FileInputStream(hyphenFile);
+ if (stream == null && key.length() > 2) {
+ hyphenFile = new File(hyphenDir, key.substring(0, 2) + ".xml");
+ if (hyphenFile.canRead())
+ stream = new FileInputStream(hyphenFile);
+ }
+ if (stream == null)
+ return null;
+ HyphenationTree hTree = new HyphenationTree();
+ hTree.loadSimplePatterns(stream);
+ return hTree;
+ }
+ catch (Exception e) {
+ return null;
+ }
+ }
+
+ /**
+ * @param lang
+ * @param country
+ * @param word
+ * @param leftMin
+ * @param rightMin
+ * @return a hyphenation object
+ */
+ public static Hyphenation hyphenate(String lang, String country,
+ String word, int leftMin,
+ int rightMin) {
+ HyphenationTree hTree = getHyphenationTree(lang, country);
+ if (hTree == null) {
+ //log.error("Error building hyphenation tree for language "
+ // + lang);
+ return null;
+ }
+ return hTree.hyphenate(word, leftMin, rightMin);
+ }
+
+ /**
+ * @param lang
+ * @param country
+ * @param word
+ * @param offset
+ * @param len
+ * @param leftMin
+ * @param rightMin
+ * @return a hyphenation object
+ */
+ public static Hyphenation hyphenate(String lang, String country,
+ char[] word, int offset, int len,
+ int leftMin, int rightMin) {
+ HyphenationTree hTree = getHyphenationTree(lang, country);
+ if (hTree == null) {
+ //log.error("Error building hyphenation tree for language "
+ // + lang);
+ return null;
+ }
+ return hTree.hyphenate(word, offset, len, leftMin, rightMin);
+ }
+
+ /**
+ * @param min
+ */
+ public void setMinRemainCharCount(int min) {
+ remainCharCount = min;
+ }
+
+ /**
+ * @param min
+ */
+ public void setMinPushCharCount(int min) {
+ pushCharCount = min;
+ }
+
+ /**
+ * @param lang
+ * @param country
+ */
+ public void setLanguage(String lang, String country) {
+ hyphenTree = getHyphenationTree(lang, country);
+ }
+
+ /**
+ * @param word
+ * @param offset
+ * @param len
+ * @return a hyphenation object
+ */
+ public Hyphenation hyphenate(char[] word, int offset, int len) {
+ if (hyphenTree == null) {
+ return null;
+ }
+ return hyphenTree.hyphenate(word, offset, len, remainCharCount,
+ pushCharCount);
+ }
+
+ /**
+ * @param word
+ * @return a hyphenation object
+ */
+ public Hyphenation hyphenate(String word) {
+ if (hyphenTree == null) {
+ return null;
+ }
+ return hyphenTree.hyphenate(word, remainCharCount, pushCharCount);
+ }
+
+ /** Getter for property hyphenDir.
+ * @return Value of property hyphenDir.
+ */
+ public static String getHyphenDir() {
+ return hyphenDir;
+ }
+
+ /** Setter for property hyphenDir.
+ * @param _hyphenDir New value of property hyphenDir.
+ */
+ public static void setHyphenDir(String _hyphenDir) {
+ hyphenDir = _hyphenDir;
+ }
+
+}
diff --git a/src/main/java/com/lowagie/text/pdf/hyphenation/PatternConsumer.java b/src/main/java/com/lowagie/text/pdf/hyphenation/PatternConsumer.java
new file mode 100644
index 0000000..d7c6b63
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/hyphenation/PatternConsumer.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright 1999-2004 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.lowagie.text.pdf.hyphenation;
+
+import java.util.ArrayList;
+
+/**
+ * This interface is used to connect the XML pattern file parser to
+ * the hyphenation tree.
+ *
+ * @author Carlos Villegas <cav@uniscope.co.jp>
+ */
+public interface PatternConsumer {
+
+ /**
+ * Add a character class.
+ * A character class defines characters that are considered
+ * equivalent for the purpose of hyphenation (e.g. "aA"). It
+ * usually means to ignore case.
+ * @param chargroup character group
+ */
+ void addClass(String chargroup);
+
+ /**
+ * Add a hyphenation exception. An exception replaces the
+ * result obtained by the algorithm for cases for which this
+ * fails or the user wants to provide his own hyphenation.
+ * A hyphenatedword is a vector of alternating String's and
+ * {@link Hyphen Hyphen} instances
+ */
+ void addException(String word, ArrayList hyphenatedword);
+
+ /**
+ * Add hyphenation patterns.
+ * @param pattern the pattern
+ * @param values interletter values expressed as a string of
+ * digit characters.
+ */
+ void addPattern(String pattern, String values);
+
+}
diff --git a/src/main/java/com/lowagie/text/pdf/hyphenation/SimplePatternParser.java b/src/main/java/com/lowagie/text/pdf/hyphenation/SimplePatternParser.java
new file mode 100644
index 0000000..ade8885
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/hyphenation/SimplePatternParser.java
@@ -0,0 +1,278 @@
+/*
+ * Copyright 2005 by Paulo Soares.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.pdf.hyphenation;
+
+import com.lowagie.text.pdf.*;
+import com.lowagie.text.ExceptionConverter;
+import java.util.ArrayList;
+import java.util.StringTokenizer;
+import java.io.InputStream;
+import java.io.IOException;
+import java.io.FileInputStream;
+
+/** Parses the xml hyphenation pattern.
+ *
+ * @author Paulo Soares (psoares@consiste.pt)
+ */
+public class SimplePatternParser implements SimpleXMLDocHandler, PatternConsumer {
+ int currElement;
+ PatternConsumer consumer;
+ StringBuffer token;
+ ArrayList exception;
+ char hyphenChar;
+ SimpleXMLParser parser;
+
+ static final int ELEM_CLASSES = 1;
+ static final int ELEM_EXCEPTIONS = 2;
+ static final int ELEM_PATTERNS = 3;
+ static final int ELEM_HYPHEN = 4;
+
+ /** Creates a new instance of PatternParser2 */
+ public SimplePatternParser() {
+ token = new StringBuffer();
+ hyphenChar = '-'; // default
+ }
+
+ public void parse(InputStream stream, PatternConsumer consumer) {
+ this.consumer = consumer;
+ try {
+ SimpleXMLParser.parse(this, stream);
+ }
+ catch (IOException e) {
+ throw new ExceptionConverter(e);
+ }
+ finally {
+ try{stream.close();}catch(Exception e){}
+ }
+ }
+
+ protected static String getPattern(String word) {
+ StringBuffer pat = new StringBuffer();
+ int len = word.length();
+ for (int i = 0; i < len; i++) {
+ if (!Character.isDigit(word.charAt(i))) {
+ pat.append(word.charAt(i));
+ }
+ }
+ return pat.toString();
+ }
+
+ protected ArrayList normalizeException(ArrayList ex) {
+ ArrayList res = new ArrayList();
+ for (int i = 0; i < ex.size(); i++) {
+ Object item = ex.get(i);
+ if (item instanceof String) {
+ String str = (String)item;
+ StringBuffer buf = new StringBuffer();
+ for (int j = 0; j < str.length(); j++) {
+ char c = str.charAt(j);
+ if (c != hyphenChar) {
+ buf.append(c);
+ } else {
+ res.add(buf.toString());
+ buf.setLength(0);
+ char[] h = new char[1];
+ h[0] = hyphenChar;
+ // we use here hyphenChar which is not necessarily
+ // the one to be printed
+ res.add(new Hyphen(new String(h), null, null));
+ }
+ }
+ if (buf.length() > 0) {
+ res.add(buf.toString());
+ }
+ } else {
+ res.add(item);
+ }
+ }
+ return res;
+ }
+
+ protected String getExceptionWord(ArrayList ex) {
+ StringBuffer res = new StringBuffer();
+ for (int i = 0; i < ex.size(); i++) {
+ Object item = ex.get(i);
+ if (item instanceof String) {
+ res.append((String)item);
+ } else {
+ if (((Hyphen)item).noBreak != null) {
+ res.append(((Hyphen)item).noBreak);
+ }
+ }
+ }
+ return res.toString();
+ }
+
+ protected static String getInterletterValues(String pat) {
+ StringBuffer il = new StringBuffer();
+ String word = pat + "a"; // add dummy letter to serve as sentinel
+ int len = word.length();
+ for (int i = 0; i < len; i++) {
+ char c = word.charAt(i);
+ if (Character.isDigit(c)) {
+ il.append(c);
+ i++;
+ } else {
+ il.append('0');
+ }
+ }
+ return il.toString();
+ }
+
+ public void endDocument() {
+ }
+
+ public void endElement(String tag) {
+ if (token.length() > 0) {
+ String word = token.toString();
+ switch (currElement) {
+ case ELEM_CLASSES:
+ consumer.addClass(word);
+ break;
+ case ELEM_EXCEPTIONS:
+ exception.add(word);
+ exception = normalizeException(exception);
+ consumer.addException(getExceptionWord(exception),
+ (ArrayList)exception.clone());
+ break;
+ case ELEM_PATTERNS:
+ consumer.addPattern(getPattern(word),
+ getInterletterValues(word));
+ break;
+ case ELEM_HYPHEN:
+ // nothing to do
+ break;
+ }
+ if (currElement != ELEM_HYPHEN) {
+ token.setLength(0);
+ }
+ }
+ if (currElement == ELEM_HYPHEN) {
+ currElement = ELEM_EXCEPTIONS;
+ } else {
+ currElement = 0;
+ }
+ }
+
+ public void startDocument() {
+ }
+
+ public void startElement(String tag, java.util.HashMap h) {
+ if (tag.equals("hyphen-char")) {
+ String hh = (String)h.get("value");
+ if (hh != null && hh.length() == 1) {
+ hyphenChar = hh.charAt(0);
+ }
+ } else if (tag.equals("classes")) {
+ currElement = ELEM_CLASSES;
+ } else if (tag.equals("patterns")) {
+ currElement = ELEM_PATTERNS;
+ } else if (tag.equals("exceptions")) {
+ currElement = ELEM_EXCEPTIONS;
+ exception = new ArrayList();
+ } else if (tag.equals("hyphen")) {
+ if (token.length() > 0) {
+ exception.add(token.toString());
+ }
+ exception.add(new Hyphen((String)h.get("pre"),
+ (String)h.get("no"),
+ (String)h.get("post")));
+ currElement = ELEM_HYPHEN;
+ }
+ token.setLength(0);
+ }
+
+ public void text(String str) {
+ StringTokenizer tk = new StringTokenizer(str);
+ while (tk.hasMoreTokens()) {
+ String word = tk.nextToken();
+ // System.out.println("\"" + word + "\"");
+ switch (currElement) {
+ case ELEM_CLASSES:
+ consumer.addClass(word);
+ break;
+ case ELEM_EXCEPTIONS:
+ exception.add(word);
+ exception = normalizeException(exception);
+ consumer.addException(getExceptionWord(exception),
+ (ArrayList)exception.clone());
+ exception.clear();
+ break;
+ case ELEM_PATTERNS:
+ consumer.addPattern(getPattern(word),
+ getInterletterValues(word));
+ break;
+ }
+ }
+ }
+
+ // PatternConsumer implementation for testing purposes
+ public void addClass(String c) {
+ System.out.println("class: " + c);
+ }
+
+ public void addException(String w, ArrayList e) {
+ System.out.println("exception: " + w + " : " + e.toString());
+ }
+
+ public void addPattern(String p, String v) {
+ System.out.println("pattern: " + p + " : " + v);
+ }
+
+ public static void main(String[] args) throws Exception {
+ try {
+ if (args.length > 0) {
+ SimplePatternParser pp = new SimplePatternParser();
+ pp.parse(new FileInputStream(args[0]), pp);
+ }
+ }
+ catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+}
diff --git a/src/main/java/com/lowagie/text/pdf/hyphenation/TernaryTree.java b/src/main/java/com/lowagie/text/pdf/hyphenation/TernaryTree.java
new file mode 100644
index 0000000..0dc16e5
--- /dev/null
+++ b/src/main/java/com/lowagie/text/pdf/hyphenation/TernaryTree.java
@@ -0,0 +1,667 @@
+/*
+ * Copyright 1999-2004 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.lowagie.text.pdf.hyphenation;
+
+import java.util.Enumeration;
+import java.util.Stack;
+import java.io.Serializable;
+
+/**
+ * <h2>Ternary Search Tree.</h2>
+ *
+ * <p>A ternary search tree is a hibrid between a binary tree and
+ * a digital search tree (trie). Keys are limited to strings.
+ * A data value of type char is stored in each leaf node.
+ * It can be used as an index (or pointer) to the data.
+ * Branches that only contain one key are compressed to one node
+ * by storing a pointer to the trailer substring of the key.
+ * This class is intended to serve as base class or helper class
+ * to implement Dictionary collections or the like. Ternary trees
+ * have some nice properties as the following: the tree can be
+ * traversed in sorted order, partial matches (wildcard) can be
+ * implemented, retrieval of all keys within a given distance
+ * from the target, etc. The storage requirements are higher than
+ * a binary tree but a lot less than a trie. Performance is
+ * comparable with a hash table, sometimes it outperforms a hash
+ * function (most of the time can determine a miss faster than a hash).</p>
+ *
+ * <p>The main purpose of this java port is to serve as a base for
+ * implementing TeX's hyphenation algorithm (see The TeXBook,
+ * appendix H). Each language requires from 5000 to 15000 hyphenation
+ * patterns which will be keys in this tree. The strings patterns
+ * are usually small (from 2 to 5 characters), but each char in the
+ * tree is stored in a node. Thus memory usage is the main concern.
+ * We will sacrify 'elegance' to keep memory requirenments to the
+ * minimum. Using java's char type as pointer (yes, I know pointer
+ * it is a forbidden word in java) we can keep the size of the node
+ * to be just 8 bytes (3 pointers and the data char). This gives
+ * room for about 65000 nodes. In my tests the english patterns
+ * took 7694 nodes and the german patterns 10055 nodes,
+ * so I think we are safe.</p>
+ *
+ * <p>All said, this is a map with strings as keys and char as value.
+ * Pretty limited!. It can be extended to a general map by
+ * using the string representation of an object and using the
+ * char value as an index to an array that contains the object
+ * values.</p>
+ *
+ * @author cav@uniscope.co.jp
+ */
+
+public class TernaryTree implements Cloneable, Serializable {
+
+ /**
+ * We use 4 arrays to represent a node. I guess I should have created
+ * a proper node class, but somehow Knuth's pascal code made me forget
+ * we now have a portable language with virtual memory management and
+ * automatic garbage collection! And now is kind of late, furthermore,
+ * if it ain't broken, don't fix it.
+ */
+
+ /**
+ * Pointer to low branch and to rest of the key when it is
+ * stored directly in this node, we don't have unions in java!
+ */
+ protected char[] lo;
+
+ /**
+ * Pointer to high branch.
+ */
+ protected char[] hi;
+
+ /**
+ * Pointer to equal branch and to data when this node is a string terminator.
+ */
+ protected char[] eq;
+
+ /**
+ * <P>The character stored in this node: splitchar.
+ * Two special values are reserved:</P>
+ * <ul><li>0x0000 as string terminator</li>
+ * <li>0xFFFF to indicate that the branch starting at
+ * this node is compressed</li></ul>
+ * <p>This shouldn't be a problem if we give the usual semantics to
+ * strings since 0xFFFF is garanteed not to be an Unicode character.</p>
+ */
+ protected char[] sc;
+
+ /**
+ * This vector holds the trailing of the keys when the branch is compressed.
+ */
+ protected CharVector kv;
+
+ protected char root;
+ protected char freenode;
+ protected int length; // number of items in tree
+
+ protected static final int BLOCK_SIZE = 2048; // allocation size for arrays
+
+ TernaryTree() {
+ init();
+ }
+
+ protected void init() {
+ root = 0;
+ freenode = 1;
+ length = 0;
+ lo = new char[BLOCK_SIZE];
+ hi = new char[BLOCK_SIZE];
+ eq = new char[BLOCK_SIZE];
+ sc = new char[BLOCK_SIZE];
+ kv = new CharVector();
+ }
+
+ /**
+ * Branches are initially compressed, needing
+ * one node per key plus the size of the string
+ * key. They are decompressed as needed when
+ * another key with same prefix
+ * is inserted. This saves a lot of space,
+ * specially for long keys.
+ */
+ public void insert(String key, char val) {
+ // make sure we have enough room in the arrays
+ int len = key.length()
+ + 1; // maximum number of nodes that may be generated
+ if (freenode + len > eq.length) {
+ redimNodeArrays(eq.length + BLOCK_SIZE);
+ }
+ char strkey[] = new char[len--];
+ key.getChars(0, len, strkey, 0);
+ strkey[len] = 0;
+ root = insert(root, strkey, 0, val);
+ }
+
+ public void insert(char[] key, int start, char val) {
+ int len = strlen(key) + 1;
+ if (freenode + len > eq.length) {
+ redimNodeArrays(eq.length + BLOCK_SIZE);
+ }
+ root = insert(root, key, start, val);
+ }
+
+ /**
+ * The actual insertion function, recursive version.
+ */
+ private char insert(char p, char[] key, int start, char val) {
+ int len = strlen(key, start);
+ if (p == 0) {
+ // this means there is no branch, this node will start a new branch.
+ // Instead of doing that, we store the key somewhere else and create
+ // only one node with a pointer to the key
+ p = freenode++;
+ eq[p] = val; // holds data
+ length++;
+ hi[p] = 0;
+ if (len > 0) {
+ sc[p] = 0xFFFF; // indicates branch is compressed
+ lo[p] = (char)kv.alloc(len
+ + 1); // use 'lo' to hold pointer to key
+ strcpy(kv.getArray(), lo[p], key, start);
+ } else {
+ sc[p] = 0;
+ lo[p] = 0;
+ }
+ return p;
+ }
+
+ if (sc[p] == 0xFFFF) {
+ // branch is compressed: need to decompress
+ // this will generate garbage in the external key array
+ // but we can do some garbage collection later
+ char pp = freenode++;
+ lo[pp] = lo[p]; // previous pointer to key
+ eq[pp] = eq[p]; // previous pointer to data
+ lo[p] = 0;
+ if (len > 0) {
+ sc[p] = kv.get(lo[pp]);
+ eq[p] = pp;
+ lo[pp]++;
+ if (kv.get(lo[pp]) == 0) {
+ // key completly decompressed leaving garbage in key array
+ lo[pp] = 0;
+ sc[pp] = 0;
+ hi[pp] = 0;
+ } else {
+ // we only got first char of key, rest is still there
+ sc[pp] = 0xFFFF;
+ }
+ } else {
+ // In this case we can save a node by swapping the new node
+ // with the compressed node
+ sc[pp] = 0xFFFF;
+ hi[p] = pp;
+ sc[p] = 0;
+ eq[p] = val;
+ length++;
+ return p;
+ }
+ }
+ char s = key[start];
+ if (s < sc[p]) {
+ lo[p] = insert(lo[p], key, start, val);
+ } else if (s == sc[p]) {
+ if (s != 0) {
+ eq[p] = insert(eq[p], key, start + 1, val);
+ } else {
+ // key already in tree, overwrite data
+ eq[p] = val;
+ }
+ } else {
+ hi[p] = insert(hi[p], key, start, val);
+ }
+ return p;
+ }
+
+ /**
+ * Compares 2 null terminated char arrays
+ */
+ public static int strcmp(char[] a, int startA, char[] b, int startB) {
+ for (; a[startA] == b[startB]; startA++, startB++) {
+ if (a[startA] == 0) {
+ return 0;
+ }
+ }
+ return a[startA] - b[startB];
+ }
+
+ /**
+ * Compares a string with null terminated char array
+ */
+ public static int strcmp(String str, char[] a, int start) {
+ int i, d, len = str.length();
+ for (i = 0; i < len; i++) {
+ d = (int)str.charAt(i) - a[start + i];
+ if (d != 0) {
+ return d;
+ }
+ if (a[start + i] == 0) {
+ return d;
+ }
+ }
+ if (a[start + i] != 0) {
+ return (int)-a[start + i];
+ }
+ return 0;
+
+ }
+
+ public static void strcpy(char[] dst, int di, char[] src, int si) {
+ while (src[si] != 0) {
+ dst[di++] = src[si++];
+ }
+ dst[di] = 0;
+ }
+
+ public static int strlen(char[] a, int start) {
+ int len = 0;
+ for (int i = start; i < a.length && a[i] != 0; i++) {
+ len++;
+ }
+ return len;
+ }
+
+ public static int strlen(char[] a) {
+ return strlen(a, 0);
+ }
+
+ public int find(String key) {
+ int len = key.length();
+ char strkey[] = new char[len + 1];
+ key.getChars(0, len, strkey, 0);
+ strkey[len] = 0;
+
+ return find(strkey, 0);
+ }
+
+ public int find(char[] key, int start) {
+ int d;
+ char p = root;
+ int i = start;
+ char c;
+
+ while (p != 0) {
+ if (sc[p] == 0xFFFF) {
+ if (strcmp(key, i, kv.getArray(), lo[p]) == 0) {
+ return eq[p];
+ } else {
+ return -1;
+ }
+ }
+ c = key[i];
+ d = c - sc[p];
+ if (d == 0) {
+ if (c == 0) {
+ return eq[p];
+ }
+ i++;
+ p = eq[p];
+ } else if (d < 0) {
+ p = lo[p];
+ } else {
+ p = hi[p];
+ }
+ }
+ return -1;
+ }
+
+ public boolean knows(String key) {
+ return (find(key) >= 0);
+ }
+
+ // redimension the arrays
+ private void redimNodeArrays(int newsize) {
+ int len = newsize < lo.length ? newsize : lo.length;
+ char[] na = new char[newsize];
+ System.arraycopy(lo, 0, na, 0, len);
+ lo = na;
+ na = new char[newsize];
+ System.arraycopy(hi, 0, na, 0, len);
+ hi = na;
+ na = new char[newsize];
+ System.arraycopy(eq, 0, na, 0, len);
+ eq = na;
+ na = new char[newsize];
+ System.arraycopy(sc, 0, na, 0, len);
+ sc = na;
+ }
+
+ public int size() {
+ return length;
+ }
+
+ public Object clone() {
+ TernaryTree t = new TernaryTree();
+ t.lo = (char[])this.lo.clone();
+ t.hi = (char[])this.hi.clone();
+ t.eq = (char[])this.eq.clone();
+ t.sc = (char[])this.sc.clone();
+ t.kv = (CharVector)this.kv.clone();
+ t.root = this.root;
+ t.freenode = this.freenode;
+ t.length = this.length;
+
+ return t;
+ }
+
+ /**
+ * Recursively insert the median first and then the median of the
+ * lower and upper halves, and so on in order to get a balanced
+ * tree. The array of keys is assumed to be sorted in ascending
+ * order.
+ */
+ protected void insertBalanced(String[] k, char[] v, int offset, int n) {
+ int m;
+ if (n < 1) {
+ return;
+ }
+ m = n >> 1;
+
+ insert(k[m + offset], v[m + offset]);
+ insertBalanced(k, v, offset, m);
+
+ insertBalanced(k, v, offset + m + 1, n - m - 1);
+ }
+
+
+ /**
+ * Balance the tree for best search performance
+ */
+ public void balance() {
+ // System.out.print("Before root splitchar = "); System.out.println(sc[root]);
+
+ int i = 0, n = length;
+ String[] k = new String[n];
+ char[] v = new char[n];
+ Iterator iter = new Iterator();
+ while (iter.hasMoreElements()) {
+ v[i] = iter.getValue();
+ k[i++] = (String)iter.nextElement();
+ }
+ init();
+ insertBalanced(k, v, 0, n);
+
+ // With uniform letter distribution sc[root] should be around 'm'
+ // System.out.print("After root splitchar = "); System.out.println(sc[root]);
+ }
+
+ /**
+ * Each node stores a character (splitchar) which is part of
+ * some key(s). In a compressed branch (one that only contain
+ * a single string key) the trailer of the key which is not
+ * already in nodes is stored externally in the kv array.
+ * As items are inserted, key substrings decrease.
+ * Some substrings may completely disappear when the whole
+ * branch is totally decompressed.
+ * The tree is traversed to find the key substrings actually
+ * used. In addition, duplicate substrings are removed using
+ * a map (implemented with a TernaryTree!).
+ *
+ */
+ public void trimToSize() {
+ // first balance the tree for best performance
+ balance();
+
+ // redimension the node arrays
+ redimNodeArrays(freenode);
+
+ // ok, compact kv array
+ CharVector kx = new CharVector();
+ kx.alloc(1);
+ TernaryTree map = new TernaryTree();
+ compact(kx, map, root);
+ kv = kx;
+ kv.trimToSize();
+ }
+
+ private void compact(CharVector kx, TernaryTree map, char p) {
+ int k;
+ if (p == 0) {
+ return;
+ }
+ if (sc[p] == 0xFFFF) {
+ k = map.find(kv.getArray(), lo[p]);
+ if (k < 0) {
+ k = kx.alloc(strlen(kv.getArray(), lo[p]) + 1);
+ strcpy(kx.getArray(), k, kv.getArray(), lo[p]);
+ map.insert(kx.getArray(), k, (char)k);
+ }
+ lo[p] = (char)k;
+ } else {
+ compact(kx, map, lo[p]);
+ if (sc[p] != 0) {
+ compact(kx, map, eq[p]);
+ }
+ compact(kx, map, hi[p]);
+ }
+ }
+
+
+ public Enumeration keys() {
+ return new Iterator();
+ }
+
+ public class Iterator implements Enumeration {
+
+ /**
+ * current node index
+ */
+ int cur;
+
+ /**
+ * current key
+ */
+ String curkey;
+
+ private class Item implements Cloneable {
+ char parent;
+ char child;
+
+ public Item() {
+ parent = 0;
+ child = 0;
+ }
+
+ public Item(char p, char c) {
+ parent = p;
+ child = c;
+ }
+
+ public Object clone() {
+ return new Item(parent, child);
+ }
+
+ }
+
+ /**
+ * Node stack
+ */
+ Stack ns;
+
+ /**
+ * key stack implemented with a StringBuffer
+ */
+ StringBuffer ks;
+
+ public Iterator() {
+ cur = -1;
+ ns = new Stack();
+ ks = new StringBuffer();
+ rewind();
+ }
+
+ public void rewind() {
+ ns.removeAllElements();
+ ks.setLength(0);
+ cur = root;
+ run();
+ }
+
+ public Object nextElement() {
+ String res = new String(curkey);
+ cur = up();
+ run();
+ return res;
+ }
+
+ public char getValue() {
+ if (cur >= 0) {
+ return eq[cur];
+ }
+ return 0;
+ }
+
+ public boolean hasMoreElements() {
+ return (cur != -1);
+ }
+
+ /**
+ * traverse upwards
+ */
+ private int up() {
+ Item i = new Item();
+ int res = 0;
+
+ if (ns.empty()) {
+ return -1;
+ }
+
+ if (cur != 0 && sc[cur] == 0) {
+ return lo[cur];
+ }
+
+ boolean climb = true;
+
+ while (climb) {
+ i = (Item)ns.pop();
+ i.child++;
+ switch (i.child) {
+ case 1:
+ if (sc[i.parent] != 0) {
+ res = eq[i.parent];
+ ns.push(i.clone());
+ ks.append(sc[i.parent]);
+ } else {
+ i.child++;
+ ns.push(i.clone());
+ res = hi[i.parent];
+ }
+ climb = false;
+ break;
+
+ case 2:
+ res = hi[i.parent];
+ ns.push(i.clone());
+ if (ks.length() > 0) {
+ ks.setLength(ks.length() - 1); // pop
+ }
+ climb = false;
+ break;
+
+ default:
+ if (ns.empty()) {
+ return -1;
+ }
+ climb = true;
+ break;
+ }
+ }
+ return res;
+ }
+
+ /**
+ * traverse the tree to find next key
+ */
+ private int run() {
+ if (cur == -1) {
+ return -1;
+ }
+
+ boolean leaf = false;
+ while (true) {
+ // first go down on low branch until leaf or compressed branch
+ while (cur != 0) {
+ if (sc[cur] == 0xFFFF) {
+ leaf = true;
+ break;
+ }
+ ns.push(new Item((char)cur, '\u0000'));
+ if (sc[cur] == 0) {
+ leaf = true;
+ break;
+ }
+ cur = lo[cur];
+ }
+ if (leaf) {
+ break;
+ }
+ // nothing found, go up one node and try again
+ cur = up();
+ if (cur == -1) {
+ return -1;
+ }
+ }
+ // The current node should be a data node and
+ // the key should be in the key stack (at least partially)
+ StringBuffer buf = new StringBuffer(ks.toString());
+ if (sc[cur] == 0xFFFF) {
+ int p = lo[cur];
+ while (kv.get(p) != 0) {
+ buf.append(kv.get(p++));
+ }
+ }
+ curkey = buf.toString();
+ return 0;
+ }
+
+ }
+
+ public void printStats() {
+ System.out.println("Number of keys = " + Integer.toString(length));
+ System.out.println("Node count = " + Integer.toString(freenode));
+ // System.out.println("Array length = " + Integer.toString(eq.length));
+ System.out.println("Key Array length = "
+ + Integer.toString(kv.length()));
+
+ /*
+ * for(int i=0; i<kv.length(); i++)
+ * if ( kv.get(i) != 0 )
+ * System.out.print(kv.get(i));
+ * else
+ * System.out.println("");
+ * System.out.println("Keys:");
+ * for(Enumeration enum = keys(); enum.hasMoreElements(); )
+ * System.out.println(enum.nextElement());
+ */
+
+ }
+
+/* public static void main(String[] args) throws Exception {
+ TernaryTree tt = new TernaryTree();
+ tt.insert("Carlos", 'C');
+ tt.insert("Car", 'r');
+ tt.insert("palos", 'l');
+ tt.insert("pa", 'p');
+ tt.trimToSize();
+ System.out.println((char)tt.find("Car"));
+ System.out.println((char)tt.find("Carlos"));
+ System.out.println((char)tt.find("alto"));
+ tt.printStats();
+ }*/
+
+}
+
diff --git a/src/main/java/com/lowagie/text/rtf/AbstractRtfField.java b/src/main/java/com/lowagie/text/rtf/AbstractRtfField.java
new file mode 100644
index 0000000..347784d
--- /dev/null
+++ b/src/main/java/com/lowagie/text/rtf/AbstractRtfField.java
@@ -0,0 +1,358 @@
+/**
+ * $Id: AbstractRtfField.java,v 1.17 2006/02/09 17:25:26 hallm Exp $
+ *
+ * Copyright 2002 by
+ * <a href="http://www.smb-tec.com">SMB</a>
+ * <a href="mailto:Dirk.Weigenand@smb-tec.com">Dirk.Weigenand@smb-tec.com</a>
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the “GNU LIBRARY GENERAL PUBLIC LICENSE”), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.rtf;
+
+import com.lowagie.text.Chunk;
+import com.lowagie.text.Font;
+import com.lowagie.text.rtf.RtfWriter;
+
+import java.io.OutputStream;
+import java.io.IOException;
+
+
+/**
+ * This class implements an abstract RtfField.
+ *
+ * This class is based on the RtfWriter-package from Mark Hall.
+ *
+ * ONLY FOR USE WITH THE RtfWriter NOT with the RtfWriter2.
+ *
+ * @author <a href="mailto:Dirk.Weigenand@smb-tec.com">Dirk Weigenand</a>
+ * @version $Id: AbstractRtfField.java,v 1.17 2006/02/09 17:25:26 hallm Exp $
+ * @since Mon Aug 19 14:50:39 2002
+ * @deprecated Please move to the RtfWriter2 and associated classes.
+ */
+abstract class AbstractRtfField extends Chunk implements RtfField {
+ private static final byte[] fldDirty = "\\flddirty".getBytes();
+ private static final byte[] fldPriv = "\\fldpriv".getBytes();
+ private static final byte[] fldLock = "\\fldlock".getBytes();
+ private static final byte[] fldEdit = "\\fldedit".getBytes();
+ private static final byte[] fldAlt = "\\fldalt".getBytes();
+
+ /**
+ * public constructor
+ * @param content the content of the field
+ * @param font the font of the field
+ */
+ public AbstractRtfField(String content, Font font) {
+ super(content, font);
+ }
+
+ /**
+ * Determines whether this RtfField is locked, i.e. it cannot be
+ * updated. Defaults to <tt>false</tt>.
+ */
+ private boolean rtfFieldIsLocked = false;
+
+ /**
+ * Determines whether a formatting change has been made since the
+ * field was last updated. Defaults to <tt>false</tt>.
+ */
+ private boolean rtfFieldIsDirty = false;
+
+ /**
+ * Determines whether text has been added, removed from thre field
+ * result since the field was last updated. Defaults to
+ * <tt>false</tt>.
+ */
+ private boolean rtfFieldWasEdited = false;
+
+ /**
+ * Determines whether the field is in suitable form for
+ * display. Defaults to <tt>false</tt>.
+ */
+ private boolean rtfFieldIsPrivate = false;
+
+ /**
+ * Determines whether this RtfField shall refer to an end note.
+ */
+ private boolean rtfFieldIsAlt = false;
+
+ /**
+ * Determines whtether the field is locked, i.e. it cannot be
+ * updated.
+ *
+ * @return <tt>true</tt> iff the field cannot be updated,
+ * <tt>false</tt> otherwise.
+ */
+ public final boolean isLocked() {
+ return this.rtfFieldIsLocked;
+ }
+
+ /**
+ * Set whether the field can be updated.
+ *
+ * @param rtfFieldIsLocked <tt>true</tt> if the field cannot be
+ * updated, <tt>false</tt> otherwise.
+ */
+ public final void setLocked(final boolean rtfFieldIsLocked) {
+ this.rtfFieldIsLocked = rtfFieldIsLocked;
+ }
+
+ /**
+ * Set whether a formatting change has been made since the field
+ * was last updated
+ * @param rtfFieldIsDirty <tt>true</tt> if the field was
+ * changed since the field was last updated, <tt>false</tt>
+ * otherwise.
+ */
+ public final void setDirty(final boolean rtfFieldIsDirty) {
+ this.rtfFieldIsDirty = rtfFieldIsDirty;
+ }
+
+ /**
+ * Determines whether the field was changed since the field was
+ * last updated
+ * @return <tt>true</tt> if the field was changed since the field
+ * was last updated, <tt>false</tt> otherwise.
+ */
+ public final boolean isDirty() {
+ return this.rtfFieldIsDirty;
+ }
+
+ /**
+ * Set whether text has been added, removed from thre field result
+ * since the field was last updated.
+ * @param rtfFieldWasEdited Determines whether text has been
+ * added, removed from the field result since the field was last
+ * updated (<tt>true</tt>, <tt>false</tt> otherwise..
+ */
+ public final void setEdited(final boolean rtfFieldWasEdited) {
+ this.rtfFieldWasEdited = rtfFieldWasEdited;
+ }
+
+ /**
+ * Determines whether text has been added, removed from the field
+ * result since the field was last updated.
+ * @return rtfFieldWasEdited <tt>true</tt> if text has been added,
+ * removed from the field result since the field was last updated,
+ * <tt>false</tt> otherwise.
+ */
+ public final boolean wasEdited() {
+ return this.rtfFieldWasEdited;
+ }
+
+ /**
+ * Set whether the field is in suitable form for
+ * display. I.e. it's not a field with a picture as field result
+ * @param rtfFieldIsPrivate Determines whether the field is in
+ * suitable form for display: <tt>true</tt> it can be displayed,
+ * <tt>false</tt> it cannot be displayed.
+ */
+ public final void setPrivate(final boolean rtfFieldIsPrivate) {
+ this.rtfFieldIsPrivate = rtfFieldIsPrivate;
+ }
+
+ /**
+ * Determines whether the field is in suitable form for display.
+ * @return whether the field is in suitable form for display:
+ * <tt>true</tt> yes, <tt>false</tt> no it cannot be displayed.
+ */
+ public final boolean isPrivate() {
+ return this.rtfFieldIsPrivate;
+ }
+
+ /**
+ * Abstract method for writing custom stuff to the Field
+ * Initialization Stuff part of an RtfField.
+ * @param out
+ * @throws IOException
+ */
+ public abstract void writeRtfFieldInitializationStuff(OutputStream out) throws IOException;
+
+ /**
+ * Abstract method for writing custom stuff to the Field Result
+ * part of an RtfField.
+ * @param out
+ * @throws IOException
+ */
+ public abstract void writeRtfFieldResultStuff(OutputStream out) throws IOException;
+
+ /**
+ * Determines whether this RtfField shall refer to an end note.
+ * @param rtfFieldIsAlt <tt>true</tt> if this RtfField shall refer
+ * to an end note, <tt>false</tt> otherwise
+ */
+ public final void setAlt(final boolean rtfFieldIsAlt) {
+ this.rtfFieldIsAlt = rtfFieldIsAlt;
+ }
+
+ /**
+ * Determines whether this RtfField shall refer to an end
+ * note.
+ * @return <tt>true</tt> if this RtfField shall refer to an end
+ * note, <tt>false</tt> otherwise.
+ */
+ public final boolean isAlt() {
+ return this.rtfFieldIsAlt;
+ }
+
+ /**
+ * empty implementation for Chunk.
+ * @return an empty string
+ */
+ public final String content() {
+ return "";
+ }
+
+ /**
+ * For Interface RtfField.
+ * @param writer
+ * @param out
+ * @throws IOException
+ */
+ public void write( RtfWriter writer, OutputStream out ) throws IOException {
+ writeRtfFieldBegin(out);
+ writeRtfFieldModifiers(out);
+ writeRtfFieldInstBegin(out);
+ writer.writeInitialFontSignature( out, this );
+ writeRtfFieldInitializationStuff(out);
+ writeRtfFieldInstEnd(out);
+ writeRtfFieldResultBegin(out);
+ writer.writeInitialFontSignature( out, this );
+ writeRtfFieldResultStuff(out);
+ writeRtfFieldResultEnd(out);
+ writeRtfFieldEnd(out);
+ }
+
+ /**
+ * Write the beginning of an RtfField to the OutputStream.
+ * @param out
+ * @throws IOException
+ */
+ protected final void writeRtfFieldBegin(OutputStream out) throws IOException {
+ out.write(RtfWriter.openGroup);
+ out.write(RtfWriter.escape);
+ out.write(RtfWriter.field);
+ }
+
+ /**
+ * Write the modifiers defined for a RtfField to the OutputStream.
+ * @param out
+ * @throws IOException
+ */
+ protected final void writeRtfFieldModifiers(OutputStream out) throws IOException {
+ if (isDirty()) {
+ out.write(fldDirty);
+ }
+
+ if (wasEdited()) {
+ out.write(fldEdit);
+ }
+
+ if (isLocked()) {
+ out.write(fldLock);
+ }
+
+ if (isPrivate()) {
+ out.write(fldPriv);
+ }
+ }
+
+ /**
+ * Write RtfField Initialization Stuff to OutputStream.
+ * @param out
+ * @throws IOException
+ */
+ protected final void writeRtfFieldInstBegin(OutputStream out) throws IOException {
+ out.write( RtfWriter.openGroup );
+ out.write( RtfWriter.escape );
+ out.write( RtfWriter.fieldContent );
+ out.write( RtfWriter.delimiter );
+ }
+
+ /**
+ * Write end of RtfField Initialization Stuff to OutputStream.
+ * @param out
+ * @throws IOException
+ */
+ protected final void writeRtfFieldInstEnd(OutputStream out) throws IOException {
+ if (isAlt()) {
+ out.write( fldAlt );
+ out.write( RtfWriter.delimiter );
+ }
+
+ out.write( RtfWriter.closeGroup );
+ }
+
+ /**
+ * Write beginning of RtfField Result to OutputStream.
+ * @param out
+ * @throws IOException
+ */
+ protected final void writeRtfFieldResultBegin(OutputStream out) throws IOException {
+ out.write( RtfWriter.openGroup );
+ out.write( RtfWriter.escape );
+ out.write( RtfWriter.fieldDisplay );
+ out.write( RtfWriter.delimiter );
+ }
+
+ /**
+ * Write end of RtfField Result to OutputStream.
+ * @param out
+ * @throws IOException
+ */
+ protected final void writeRtfFieldResultEnd(OutputStream out) throws IOException {
+ out.write( RtfWriter.delimiter );
+ out.write( RtfWriter.closeGroup );
+ }
+
+ /**
+ * Close the RtfField.
+ * @param out
+ * @throws IOException
+ */
+ protected final void writeRtfFieldEnd(OutputStream out) throws IOException {
+ out.write( RtfWriter.closeGroup );
+ }
+}
diff --git a/src/main/java/com/lowagie/text/rtf/GenericRtfField.java b/src/main/java/com/lowagie/text/rtf/GenericRtfField.java
new file mode 100644
index 0000000..23401e4
--- /dev/null
+++ b/src/main/java/com/lowagie/text/rtf/GenericRtfField.java
@@ -0,0 +1,139 @@
+/**
+ * $Id: GenericRtfField.java,v 1.18 2006/02/09 17:25:25 hallm Exp $
+ *
+ * Copyright 2002 by
+ * <a href="http://www.smb-tec.com">SMB</a>
+ * <a href="mailto:Dirk.Weigenand@smb-tec.com">Dirk.Weigenand@smb-tec.com</a>
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the “GNU LIBRARY GENERAL PUBLIC LICENSE”), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.rtf;
+
+import java.io.IOException;
+import java.io.OutputStream;
+
+import com.lowagie.text.Font;
+
+
+/**
+ * This class implements a generic RtfField.
+ *
+ * This class is based on the RtfWriter-package from Mark Hall.
+ *
+ * ONLY FOR USE WITH THE RtfWriter NOT with the RtfWriter2.
+ *
+ * @author <a href="mailto:Dirk.Weigenand@smb-tec.com">Dirk Weigenand</a>
+ * @version $Id: GenericRtfField.java,v 1.18 2006/02/09 17:25:25 hallm Exp $
+ * @since Mon Aug 19 14:50:39 2002
+ * @deprecated Please move to the RtfWriter2 and associated classes.
+ */
+public class GenericRtfField extends AbstractRtfField implements RtfField {
+ /**
+ * Field Initialization Stuff.
+ */
+ protected String fieldInst;
+
+ /**
+ * Field Result Stuff.
+ */
+ protected String fieldResult;
+
+ /**
+ * public constructor, set the data that is to be written into the
+ * Field Initialization Stuff and Field Result parts of the
+ * RtfField.
+ *
+ * @param fieldInst data to be written into the Field
+ * Initialization Stuff part of the RtfField.
+ * @param fieldResult data to be written into the Field Result
+ * part of the RtfField.
+ */
+ public GenericRtfField(final String fieldInst, final String fieldResult) {
+ super("x", new Font());
+ this.fieldInst = fieldInst;
+ this.fieldResult = fieldResult;
+ }
+
+ /**
+ * public constructor, set the data that is to be written into the
+ * Field Initialization Stuff and Field Result parts of the
+ * RtfField.
+ *
+ * @param fieldInst data to be written into the Field
+ * Initialization Stuff part of the RtfField.
+ * @param fieldResult data to be written into the Field Result
+ * part of the RtfField.
+ * @param font
+ */
+ public GenericRtfField(final String fieldInst, final String fieldResult, Font font) {
+ super("x", font);
+ this.fieldInst = fieldInst;
+ this.fieldResult = fieldResult;
+ }
+
+ /**
+ * method for writing custom stuff to the Field Initialization
+ * Stuff part of an RtfField.
+ * @param out
+ * @throws IOException
+ */
+ public void writeRtfFieldInitializationStuff(OutputStream out) throws IOException {
+ out.write(fieldInst.trim().getBytes());
+ out.write(RtfWriter.delimiter);
+ }
+
+ /**
+ * method for writing custom stuff to the Field Result part of an
+ * RtfField.
+ * @param out
+ * @throws IOException
+ */
+ public void writeRtfFieldResultStuff(OutputStream out) throws IOException {
+ if (null != fieldResult) {
+ out.write(fieldResult.trim().getBytes());
+ }
+ }
+}
diff --git a/src/main/java/com/lowagie/text/rtf/RtfAddableElement.java b/src/main/java/com/lowagie/text/rtf/RtfAddableElement.java
new file mode 100644
index 0000000..539b647
--- /dev/null
+++ b/src/main/java/com/lowagie/text/rtf/RtfAddableElement.java
@@ -0,0 +1,127 @@
+/*
+ * $Id: RtfAddableElement.java,v 1.1 2006/06/17 10:02:31 hallm Exp $
+ * $Name: $
+ *
+ * Copyright 2001, 2002, 2003, 2004 by Mark Hall
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ * Co-Developer of the code is Mark Hall. Portions created by the Co-Developer are
+ * Copyright (C) 2006 by Mark Hall. All Rights Reserved
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the ?GNU LIBRARY GENERAL PUBLIC LICENSE?), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.rtf;
+
+import com.lowagie.text.Chunk;
+import com.lowagie.text.Font;
+import com.lowagie.text.rtf.document.RtfDocument;
+
+/**
+ * The RtfAddableElement is the superclass for all rtf specific elements
+ * that need to be added to an iText document. It is an extension of Chunk
+ * and it also implements RtfBasicElement. It is an abstract class thus it
+ * cannot be instantiated itself and has to be subclassed to be used.
+ *
+ * @version $Revision: 1.1 $
+ * @author Mark Hall (mhall@edu.uni-klu.ac.at)
+ */
+public abstract class RtfAddableElement extends Chunk implements RtfBasicElement {
+
+ /**
+ * The RtfDocument this RtfAddableElement belongs to.
+ */
+ protected RtfDocument doc = null;
+ /**
+ * Whether this RtfAddableElement is contained in a table.
+ */
+ protected boolean inTable = false;
+ /**
+ * Whether this RtfAddableElement is contained in a header.
+ */
+ protected boolean inHeader = false;
+
+ /**
+ * Constructs a new RtfAddableElement. The Chunk content is
+ * set to an empty string and the font to the default Font().
+ */
+ public RtfAddableElement() {
+ super("", new Font());
+ }
+
+ /**
+ * Subclasses have to implement this method.
+ */
+ public abstract byte[] write();
+
+ /**
+ * Sets the RtfDocument this RtfAddableElement belongs to
+ */
+ public void setRtfDocument(RtfDocument doc) {
+ this.doc = doc;
+ }
+
+ /**
+ * Sets whether this RtfAddableElement is contained in a table.
+ */
+ public void setInTable(boolean inTable) {
+ this.inTable = inTable;
+ }
+
+ /**
+ * Sets whether this RtfAddableElement is contained in a header/footer.
+ */
+ public void setInHeader(boolean inHeader) {
+ this.inHeader = inHeader;
+ }
+
+ /**
+ * Transforms an integer into its String representation and then returns the bytes
+ * of that string.
+ *
+ * @param i The integer to convert
+ * @return A byte array representing the integer
+ */
+ public byte[] intToByteArray(int i) {
+ return Integer.toString(i).getBytes();
+ }
+}
diff --git a/src/main/java/com/lowagie/text/rtf/RtfBasicElement.java b/src/main/java/com/lowagie/text/rtf/RtfBasicElement.java
new file mode 100644
index 0000000..8b315ec
--- /dev/null
+++ b/src/main/java/com/lowagie/text/rtf/RtfBasicElement.java
@@ -0,0 +1,110 @@
+/*
+ * $Id: RtfBasicElement.java,v 1.16 2005/05/04 14:33:37 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2001, 2002, 2003, 2004 by Mark Hall
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the ?GNU LIBRARY GENERAL PUBLIC LICENSE?), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.rtf;
+
+import com.lowagie.text.rtf.document.RtfDocument;
+
+/**
+ * The RtfBasicElement interface defines the interface for elements that can
+ * be added to the RtfWriter.
+ *
+ * Version: $Id: RtfBasicElement.java,v 1.16 2005/05/04 14:33:37 blowagie Exp $
+ * @author Mark Hall (mhall@edu.uni-klu.ac.at)
+ */
+public interface RtfBasicElement {
+ /**
+ * Constant for the beginning of a rtf group
+ */
+ public static final byte[] OPEN_GROUP = "{".getBytes();
+ /**
+ * Constant for the end of an rtf group
+ */
+ public static final byte[] CLOSE_GROUP = "}".getBytes();
+ /**
+ * Constant for a delimiter in rtf
+ */
+ public static final byte[] DELIMITER = " ".getBytes();
+ /**
+ * Constant for a comma delimiter in rtf
+ */
+ public static final byte[] COMMA_DELIMITER = ";".getBytes();
+ /**
+ * The factor to use for translating from iText to rtf measurments
+ */
+ public static final double TWIPS_FACTOR = 20;
+
+ /**
+ * Return the content of the Element in a byte array
+ * @return The byte array containing the data
+ */
+ public byte[] write();
+
+ /**
+ * Sets the RtfDocument this RtfElement belongs to
+ *
+ * @param doc The RtfDocument to use
+ */
+ public void setRtfDocument(RtfDocument doc);
+
+ /**
+ * Sets whether this RtfBasicElement is in a table
+ *
+ * @param inTable Whether this RtfBasicElement is in a table
+ */
+ public void setInTable(boolean inTable);
+
+ /**
+ * Sets whether this RtfBasicElement is in a header
+ *
+ * @param inHeader Whether this RtfBasicElement is in a header
+ */
+ public void setInHeader(boolean inHeader);
+}
diff --git a/src/main/java/com/lowagie/text/rtf/RtfCell.java b/src/main/java/com/lowagie/text/rtf/RtfCell.java
new file mode 100644
index 0000000..841c25b
--- /dev/null
+++ b/src/main/java/com/lowagie/text/rtf/RtfCell.java
@@ -0,0 +1,549 @@
+/**
+ * $Id: RtfCell.java,v 1.37 2006/02/09 17:25:26 hallm Exp $
+ * $Name: $
+ *
+ * Copyright 2001, 2002 by Mark Hall
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the ?GNU LIBRARY GENERAL PUBLIC LICENSE?), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.rtf;
+
+import com.lowagie.text.*;
+
+import java.util.Iterator;
+import java.io.*;
+import java.awt.Color;
+
+/**
+ * A Helper Class for the <CODE>RtfWriter</CODE>.
+ * <P>
+ * Do not use it directly
+ *
+ * ONLY FOR USE WITH THE RtfWriter NOT with the RtfWriter2.
+ *
+ * Parts of this Class were contributed by Steffen Stundzig. Many thanks for the
+ * improvements.
+ * Updates by Benoit WIART <b.wiart@proxiad.com>
+ * @deprecated Please move to the RtfWriter2 and associated classes.
+ */
+public class RtfCell {
+ /** Constants for merging Cells */
+
+ /** A possible value for merging */
+ private static final int MERGE_HORIZ_FIRST = 1;
+ /** A possible value for merging */
+ private static final int MERGE_VERT_FIRST = 2;
+ /** A possible value for merging */
+ private static final int MERGE_BOTH_FIRST = 3;
+ /** A possible value for merging */
+ private static final int MERGE_HORIZ_PREV = 4;
+ /** A possible value for merging */
+ private static final int MERGE_VERT_PREV = 5;
+ /** A possible value for merging */
+ private static final int MERGE_BOTH_PREV = 6;
+
+ /**
+ * RTF Tags
+ */
+
+ /** First cell to merge with - Horizontal */
+ private static final byte[] cellMergeFirst = "clmgf".getBytes();
+ /** First cell to merge with - Vertical */
+ private static final byte[] cellVMergeFirst = "clvmgf".getBytes();
+ /** Merge cell with previous horizontal cell */
+ private static final byte[] cellMergePrev = "clmrg".getBytes();
+ /** Merge cell with previous vertical cell */
+ private static final byte[] cellVMergePrev = "clvmrg".getBytes();
+ /** Cell content vertical alignment bottom */
+ private static final byte[] cellVerticalAlignBottom = "clvertalb".getBytes();
+ /** Cell content vertical alignment center */
+ private static final byte[] cellVerticalAlignCenter = "clvertalc".getBytes();
+ /** Cell content vertical alignment top */
+ private static final byte[] cellVerticalAlignTop = "clvertalt".getBytes();
+ /** Cell border left */
+ private static final byte[] cellBorderLeft = "clbrdrl".getBytes();
+ /** Cell border right */
+ private static final byte[] cellBorderRight = "clbrdrr".getBytes();
+ /** Cell border top */
+ private static final byte[] cellBorderTop = "clbrdrt".getBytes();
+ /** Cell border bottom */
+ private static final byte[] cellBorderBottom = "clbrdrb".getBytes();
+ /** Cell background color */
+ private static final byte[] cellBackgroundColor = "clcbpat".getBytes();
+ /** Cell width format */
+ private static final byte[] cellWidthStyle = "clftsWidth3".getBytes();
+ /** Cell width */
+ private static final byte[] cellWidthTag = "clwWidth".getBytes();
+ /** Cell right border position */
+ private static final byte[] cellRightBorder = "cellx".getBytes();
+ /** Cell is part of table */
+ protected static final byte[] cellInTable = "intbl".getBytes();
+ /** End of cell */
+ private static final byte[] cellEnd = "cell".getBytes();
+
+ /** padding top */
+ private static final byte[] cellPaddingTop = "clpadt".getBytes();
+ /** padding top unit */
+ private static final byte[] cellPaddingTopUnit = "clpadft3".getBytes();
+ /** padding bottom */
+ private static final byte[] cellPaddingBottom = "clpadb".getBytes();
+ /** padding bottom unit */
+ private static final byte[] cellPaddingBottomUnit = "clpadfb3".getBytes();
+ /** padding left */
+ private static final byte[] cellPaddingLeft = "clpadl".getBytes();
+ /** padding left unit */
+ private static final byte[] cellPaddingLeftUnit = "clpadfl3".getBytes();
+ /** padding right */
+ private static final byte[] cellPaddingRight = "clpadr".getBytes();
+ /** padding right unit */
+ private static final byte[] cellPaddingRightUnit = "clpadfr3".getBytes();
+
+ /** The <code>RtfWriter</code> to which this <code>RtfCell</code> belongs. */
+ private RtfWriter writer = null;
+ /** The <code>RtfTable</code> to which this <code>RtfCell</code> belongs. */
+ private RtfTable mainTable = null;
+
+ /** Cell width */
+ private int cellWidth = 0;
+ /** Cell right border position */
+ private int cellRight = 0;
+ /** <code>Cell</code> containing the actual data */
+ private Cell store = null;
+ /** Is this an empty cell */
+ private boolean emptyCell = true;
+ /** Type of merging to do */
+ private int mergeType = 0;
+ /** cell padding, because the table only renders the left and right cell padding
+ * and not the top and bottom one
+ */
+ private int cellpadding = 0;
+
+ /**
+ * Create a new <code>RtfCell</code>.
+ *
+ * @param writer The <code>RtfWriter</code> that this <code>RtfCell</code> belongs to
+ * @param mainTable The <code>RtfTable</code> that created the
+ * <code>RtfRow</code> that created the <code>RtfCell</code> :-)
+ */
+ public RtfCell(RtfWriter writer, RtfTable mainTable) {
+ super();
+ this.writer = writer;
+ this.mainTable = mainTable;
+ }
+
+ /**
+ * Import a <code>Cell</code>.
+ * <P>
+ * @param cell The <code>Cell</code> containing the data for this
+ * <code>RtfCell</code>
+ * @param cellLeft The position of the left border
+ * @param cellWidth The default width of a cell
+ * @param x The column index of this <code>RtfCell</code>
+ * @param y The row index of this <code>RtfCell</code>
+ * @param cellpadding the cellpadding
+ * @return the position of the right side of the cell
+ */
+ public int importCell(Cell cell, int cellLeft, int cellWidth, int x, int y, int cellpadding) {
+ this.cellpadding = cellpadding;
+
+ // set this value in any case
+ this.cellWidth = cellWidth;
+ if (cell == null) {
+ cellRight = cellLeft + cellWidth;
+ return cellRight;
+ }
+ if (cell.cellWidth() != null && !cell.cellWidth().equals("")) {
+
+ this.cellWidth = (int) (Integer.parseInt(cell.cellWidth()) * RtfWriter.TWIPSFACTOR);
+ }
+ cellRight = cellLeft + this.cellWidth;
+ store = cell;
+ emptyCell = false;
+ if (cell.colspan() > 1) {
+ if (cell.rowspan() > 1) {
+ mergeType = MERGE_BOTH_FIRST;
+ for (int i = y; i < y + cell.rowspan(); i++) {
+ if (i > y) mainTable.setMerge(x, i, MERGE_VERT_PREV, this);
+ for (int j = x + 1; j < x + cell.colspan(); j++) {
+ mainTable.setMerge(j, i, MERGE_BOTH_PREV, this);
+ }
+ }
+ } else {
+ mergeType = MERGE_HORIZ_FIRST;
+ for (int i = x + 1; i < x + cell.colspan(); i++) {
+ mainTable.setMerge(i, y, MERGE_HORIZ_PREV, this);
+ }
+ }
+ } else if (cell.rowspan() > 1) {
+ mergeType = MERGE_VERT_FIRST;
+ for (int i = y + 1; i < y + cell.rowspan(); i++) {
+ mainTable.setMerge(x, i, MERGE_VERT_PREV, this);
+ }
+ }
+ return cellRight;
+ }
+
+ /**
+ * Write the properties of the <code>RtfCell</code>.
+ *
+ * @param os The <code>OutputStream</code> to which to write the properties
+ * of the <code>RtfCell</code> to.
+ * @return true if writing the cell settings succeeded
+ * @throws DocumentException
+ */
+ public boolean writeCellSettings(ByteArrayOutputStream os) throws DocumentException {
+ try {
+ float lWidth, tWidth, rWidth, bWidth;
+ byte[] lStyle, tStyle, rStyle, bStyle;
+
+ if (store instanceof RtfTableCell) {
+ RtfTableCell c = (RtfTableCell) store;
+ lWidth = c.leftBorderWidth();
+ tWidth = c.topBorderWidth();
+ rWidth = c.rightBorderWidth();
+ bWidth = c.bottomBorderWidth();
+ lStyle = RtfTableCell.getStyleControlWord(c.leftBorderStyle());
+ tStyle = RtfTableCell.getStyleControlWord(c.topBorderStyle());
+ rStyle = RtfTableCell.getStyleControlWord(c.rightBorderStyle());
+ bStyle = RtfTableCell.getStyleControlWord(c.bottomBorderStyle());
+ } else {
+ lWidth = tWidth = rWidth = bWidth = store.borderWidth();
+ lStyle = tStyle = rStyle = bStyle = RtfRow.tableBorder;
+ }
+
+ if (mergeType == MERGE_HORIZ_PREV || mergeType == MERGE_BOTH_PREV) {
+ return true;
+ }
+ switch (mergeType) {
+ case MERGE_VERT_FIRST:
+ os.write(RtfWriter.escape);
+ os.write(cellVMergeFirst);
+ break;
+ case MERGE_BOTH_FIRST:
+ os.write(RtfWriter.escape);
+ os.write(cellVMergeFirst);
+ break;
+ case MERGE_HORIZ_PREV:
+ os.write(RtfWriter.escape);
+ os.write(cellMergePrev);
+ break;
+ case MERGE_VERT_PREV:
+ os.write(RtfWriter.escape);
+ os.write(cellVMergePrev);
+ break;
+ case MERGE_BOTH_PREV:
+ os.write(RtfWriter.escape);
+ os.write(cellMergeFirst);
+ break;
+ }
+ switch (store.verticalAlignment()) {
+ case Element.ALIGN_BOTTOM:
+ os.write(RtfWriter.escape);
+ os.write(cellVerticalAlignBottom);
+ break;
+ case Element.ALIGN_CENTER:
+ case Element.ALIGN_MIDDLE:
+ os.write(RtfWriter.escape);
+ os.write(cellVerticalAlignCenter);
+ break;
+ case Element.ALIGN_TOP:
+ os.write(RtfWriter.escape);
+ os.write(cellVerticalAlignTop);
+ break;
+ }
+
+ if (((store.border() & Rectangle.LEFT) == Rectangle.LEFT) &&
+ (lWidth > 0)) {
+ os.write(RtfWriter.escape);
+ os.write(cellBorderLeft);
+ os.write(RtfWriter.escape);
+ os.write(lStyle);
+ os.write(RtfWriter.escape);
+ os.write(RtfRow.tableBorderWidth);
+ writeInt(os, (int) (lWidth * RtfWriter.TWIPSFACTOR));
+ os.write(RtfWriter.escape);
+ os.write(RtfRow.tableBorderColor);
+ if (store.borderColor() == null)
+ writeInt(os, writer.addColor(new
+ Color(0, 0, 0)));
+ else
+ writeInt(os, writer.addColor(store.borderColor()));
+ os.write((byte) '\n');
+ }
+ if (((store.border() & Rectangle.TOP) == Rectangle.TOP) && (tWidth > 0)) {
+ os.write(RtfWriter.escape);
+ os.write(cellBorderTop);
+ os.write(RtfWriter.escape);
+ os.write(tStyle);
+ os.write(RtfWriter.escape);
+ os.write(RtfRow.tableBorderWidth);
+ writeInt(os, (int) (tWidth * RtfWriter.TWIPSFACTOR));
+ os.write(RtfWriter.escape);
+ os.write(RtfRow.tableBorderColor);
+ if (store.borderColor() == null)
+ writeInt(os, writer.addColor(new
+ Color(0, 0, 0)));
+ else
+ writeInt(os, writer.addColor(store.borderColor()));
+ os.write((byte) '\n');
+ }
+ if (((store.border() & Rectangle.BOTTOM) == Rectangle.BOTTOM) &&
+ (bWidth > 0)) {
+ os.write(RtfWriter.escape);
+ os.write(cellBorderBottom);
+ os.write(RtfWriter.escape);
+ os.write(bStyle);
+ os.write(RtfWriter.escape);
+ os.write(RtfRow.tableBorderWidth);
+ writeInt(os, (int) (bWidth * RtfWriter.TWIPSFACTOR));
+ os.write(RtfWriter.escape);
+ os.write(RtfRow.tableBorderColor);
+ if (store.borderColor() == null)
+ writeInt(os, writer.addColor(new
+ Color(0, 0, 0)));
+ else
+ writeInt(os, writer.addColor(store.borderColor()));
+ os.write((byte) '\n');
+ }
+ if (((store.border() & Rectangle.RIGHT) == Rectangle.RIGHT) &&
+ (rWidth > 0)) {
+ os.write(RtfWriter.escape);
+ os.write(cellBorderRight);
+ os.write(RtfWriter.escape);
+ os.write(rStyle);
+ os.write(RtfWriter.escape);
+ os.write(RtfRow.tableBorderWidth);
+ writeInt(os, (int) (rWidth * RtfWriter.TWIPSFACTOR));
+ os.write(RtfWriter.escape);
+ os.write(RtfRow.tableBorderColor);
+ if (store.borderColor() == null)
+ writeInt(os, writer.addColor(new
+ Color(0, 0, 0)));
+ else
+ writeInt(os, writer.addColor(store.borderColor()));
+ os.write((byte) '\n');
+ }
+ os.write(RtfWriter.escape);
+ os.write(cellBackgroundColor);
+ if (store.backgroundColor() == null) {
+ writeInt(os, writer.addColor(new Color(255, 255, 255)));
+ } else {
+ writeInt(os, writer.addColor(store.backgroundColor()));
+ }
+ os.write((byte) '\n');
+ os.write(RtfWriter.escape);
+ os.write(cellWidthStyle);
+ os.write((byte) '\n');
+ os.write(RtfWriter.escape);
+ os.write(cellWidthTag);
+ writeInt(os, cellWidth);
+ os.write((byte) '\n');
+ if (cellpadding > 0) {
+ // values
+ os.write(RtfWriter.escape);
+ os.write(cellPaddingLeft);
+ writeInt(os, cellpadding / 2);
+ os.write(RtfWriter.escape);
+ os.write(cellPaddingTop);
+ writeInt(os, cellpadding / 2);
+ os.write(RtfWriter.escape);
+ os.write(cellPaddingRight);
+ writeInt(os, cellpadding / 2);
+ os.write(RtfWriter.escape);
+ os.write(cellPaddingBottom);
+ writeInt(os, cellpadding / 2);
+ // unit
+ os.write(RtfWriter.escape);
+ os.write(cellPaddingLeftUnit);
+ os.write(RtfWriter.escape);
+ os.write(cellPaddingTopUnit);
+ os.write(RtfWriter.escape);
+ os.write(cellPaddingRightUnit);
+ os.write(RtfWriter.escape);
+ os.write(cellPaddingBottomUnit);
+ }
+ os.write(RtfWriter.escape);
+ os.write(cellRightBorder);
+ writeInt(os, cellRight);
+ } catch (IOException e) {
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Write the content of the <code>RtfCell</code>.
+ *
+ * @param os The <code>OutputStream</code> to which to write the content of
+ * the <code>RtfCell</code> to.
+ * @return true if writing the cell content succeeded
+ * @throws DocumentException
+ */
+ public boolean writeCellContent(ByteArrayOutputStream os) throws DocumentException {
+ try {
+ if (mergeType == MERGE_HORIZ_PREV || mergeType == MERGE_BOTH_PREV) {
+ return true;
+ }
+
+ if (!emptyCell) {
+ Iterator cellIterator = store.getElements();
+ Paragraph container = null;
+ while (cellIterator.hasNext()) {
+ Element element = (Element) cellIterator.next();
+ // should we wrap it in a paragraph
+ if(!(element instanceof Paragraph)) {
+ if(container != null) {
+ container.add(element);
+ } else {
+ container = new Paragraph();
+ container.setAlignment(store.horizontalAlignment());
+ container.add(element);
+ }
+ } else {
+ if(container != null) {
+ writer.addElement(container, os);
+ container =null;
+ container =null;
+ }
+
+
+ // if horizontal alignment is undefined overwrite
+ // with that of enclosing cell
+ if (element instanceof Paragraph && ((Paragraph) element).alignment() == Element.ALIGN_UNDEFINED) {
+ ((Paragraph) element).setAlignment(store.horizontalAlignment());
+ }
+ writer.addElement(element, os);
+ if (element.type() == Element.PARAGRAPH && cellIterator.hasNext()) {
+ os.write(RtfWriter.escape);
+ os.write(RtfWriter.paragraph);
+ }
+ }
+ }
+ if(container != null) {
+ writer.addElement(container, os);
+ container =null;
+ }
+ } else {
+ os.write(RtfWriter.escape);
+ os.write(RtfWriter.paragraphDefaults);
+ os.write(RtfWriter.escape);
+ os.write(cellInTable);
+ }
+ os.write(RtfWriter.escape);
+ os.write(cellEnd);
+ } catch (IOException e) {
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Sets the merge type and the <code>RtfCell</code> with which this
+ * <code>RtfCell</code> is to be merged.
+ *
+ * @param mergeType The merge type specifies the kind of merge to be applied
+ * (MERGE_HORIZ_PREV, MERGE_VERT_PREV, MERGE_BOTH_PREV)
+ * @param mergeCell The <code>RtfCell</code> that the cell at x and y is to
+ * be merged with
+ */
+ public void setMerge(int mergeType, RtfCell mergeCell) {
+ this.mergeType = mergeType;
+ store = mergeCell.getStore();
+ }
+
+ /**
+ * Get the <code>Cell</code> with the actual content.
+ *
+ * @return <code>Cell</code> which is contained in the <code>RtfCell</code>
+ */
+ public Cell getStore() {
+ return store;
+ }
+
+ /**
+ * Get the with of this <code>RtfCell</code>
+ *
+ * @return Width of the current <code>RtfCell</code>
+ */
+ public int getCellWidth() {
+ return cellWidth;
+ }
+
+ /**
+ * sets the width of the cell
+ * @param value a width
+ */
+ public void setCellWidth(int value) {
+ cellWidth = value;
+ }
+
+ /**
+ * Get the position of the right border of this <code>RtfCell</code>.
+ * @return position of the right border
+ */
+ public int getCellRight() {
+ return cellRight;
+ }
+
+
+ /**
+ * Sets the right position of the cell
+ * @param value a cell position
+ */
+ public void setCellRight(int value) {
+ cellRight = value;
+ }
+
+ /**
+ * Write an Integer to the Outputstream.
+ *
+ * @param out The <code>OutputStream</code> to be written to.
+ * @param i The int to be written.
+ * @throws IOException
+ */
+ private void writeInt(ByteArrayOutputStream out, int i) throws IOException {
+ out.write(Integer.toString(i).getBytes());
+ }
+}
diff --git a/src/main/java/com/lowagie/text/rtf/RtfElement.java b/src/main/java/com/lowagie/text/rtf/RtfElement.java
new file mode 100644
index 0000000..03d05c0
--- /dev/null
+++ b/src/main/java/com/lowagie/text/rtf/RtfElement.java
@@ -0,0 +1,149 @@
+/*
+ * $Id: RtfElement.java,v 1.8 2004/12/14 15:14:44 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2001, 2002, 2003, 2004 by Mark Hall
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the ?GNU LIBRARY GENERAL PUBLIC LICENSE?), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.rtf;
+
+import com.lowagie.text.rtf.document.RtfDocument;
+
+/**
+ * RtfElement is the base class for all RTF Element classes
+ *
+ * Version: $Id: RtfElement.java,v 1.8 2004/12/14 15:14:44 blowagie Exp $
+ * @author Mark Hall (mhall@edu.uni-klu.ac.at)
+ */
+public class RtfElement implements RtfBasicElement {
+ /**
+ * Constant for a rtf escape
+ */
+ //public static final byte[] ESCAPE = "\\".getBytes();
+ /**
+ * Constant for a rtf extended escape
+ */
+ //public static final byte[] EXTENDED_ESCAPE = "\\*\\".getBytes();
+
+ /**
+ * The RtfDocument this RtfElement belongs to
+ */
+ protected RtfDocument document = null;
+ /**
+ * Whether this RtfElement is in a table
+ */
+ protected boolean inTable = false;
+ /**
+ * Whether this RtfElement is in a header
+ */
+ protected boolean inHeader = false;
+
+ /**
+ * Constructs a RtfElement belonging to the specified RtfDocument.
+ *
+ * @param doc The RtfDocument this RtfElement belongs to
+ */
+ public RtfElement(RtfDocument doc) {
+ super();
+ this.document = doc;
+ }
+
+ /**
+ * Transforms an integer into its String representation and then returns the bytes
+ * of that string.
+ *
+ * @param i The integer to convert
+ * @return A byte array representing the integer
+ */
+ public byte[] intToByteArray(int i) {
+ return Integer.toString(i).getBytes();
+ }
+
+ /**
+ * Returns the content of the RtfElement in a byte array.
+ *
+ * @return An empty byte array
+ */
+ public byte[] write() {
+ return new byte[0];
+ }
+
+ /**
+ * Sets the RtfDocument this RtfElement belongs to
+ *
+ * @param doc The RtfDocument to use
+ */
+ public void setRtfDocument(RtfDocument doc) {
+ this.document = doc;
+ }
+
+ /**
+ * Gets whether this RtfElement is in a table
+ *
+ * @return Whether this RtfElement is in a table
+ */
+ public boolean isInTable() {
+ return inTable;
+ }
+
+ /**
+ * Sets whether this RtfElement is in a table
+ *
+ * @param inTable <code>True</code> if this RtfElement is in a table, <code>false</code> otherwise
+ */
+ public void setInTable(boolean inTable) {
+ this.inTable = inTable;
+ }
+
+ /**
+ * Sets whether this RtfElement is in a header
+ *
+ * @param inHeader <code>True</code> if this RtfElement is in a header, <code>false</code> otherwise
+ */
+ public void setInHeader(boolean inHeader) {
+ this.inHeader = inHeader;
+ }
+}
diff --git a/src/main/java/com/lowagie/text/rtf/RtfExtendedElement.java b/src/main/java/com/lowagie/text/rtf/RtfExtendedElement.java
new file mode 100644
index 0000000..39a6efa
--- /dev/null
+++ b/src/main/java/com/lowagie/text/rtf/RtfExtendedElement.java
@@ -0,0 +1,65 @@
+/*
+ * $Id: RtfExtendedElement.java,v 1.16 2005/05/04 14:33:37 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2001, 2002, 2003, 2004 by Mark Hall
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the ?GNU LIBRARY GENERAL PUBLIC LICENSE?), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.rtf;
+
+/**
+ * The RtfExtendedElement interface is to be used for elements that also
+ * write data into the definition part of the rtf document
+ * Version: $Id: RtfExtendedElement.java,v 1.16 2005/05/04 14:33:37 blowagie Exp $
+ * @author Mark Hall (mhall@edu.uni-klu.ac.at)
+ */
+public interface RtfExtendedElement extends RtfBasicElement {
+ /**
+ * Return the definition part of the element in a byte array
+ * @return A byte array containing the definition data of the Element
+ */
+ public byte[] writeDefinition();
+}
diff --git a/src/main/java/com/lowagie/text/rtf/RtfField.java b/src/main/java/com/lowagie/text/rtf/RtfField.java
new file mode 100644
index 0000000..a98fb31
--- /dev/null
+++ b/src/main/java/com/lowagie/text/rtf/RtfField.java
@@ -0,0 +1,84 @@
+/**
+ * $Id: RtfField.java,v 1.18 2006/02/09 17:25:25 hallm Exp $
+ *
+ * Copyright 2002 by
+ * <a href="http://www.smb-tec.com">SMB</a>
+ * <a href="mailto:Steffen.Stundzig@smb-tec.com">Steffen.Stundzig@smb-tec.com</a>
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the “GNU LIBRARY GENERAL PUBLIC LICENSE”), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.rtf;
+
+import com.lowagie.text.rtf.RtfWriter;
+
+import java.io.OutputStream;
+import java.io.IOException;
+
+
+/**
+ * This interface should mark classes, that can be represented
+ * as RTF fields, such as pagenumber, toc entries and so on.
+ *
+ * ONLY FOR USE WITH THE RtfWriter NOT with the RtfWriter2.
+ *
+ * This class is based on the RtfWriter-package from Mark Hall.
+ * @author <a href="mailto:Steffen.Stundzig@smb-tec.com">Steffen.Stundzig@smb-tec.com</a>
+ * @version $Revision: 1.18 $Date: 2006/02/09 17:25:25 $
+ * @deprecated Please move to the RtfWriter2 and associated classes.
+ */
+public interface RtfField {
+
+
+ /**
+ * Writes an RTF field.
+ * @param writer
+ * @param out
+ * @throws IOException
+ */
+ public void write( RtfWriter writer, OutputStream out ) throws IOException;
+}
+
+
diff --git a/src/main/java/com/lowagie/text/rtf/RtfFont.java b/src/main/java/com/lowagie/text/rtf/RtfFont.java
new file mode 100644
index 0000000..3fd4651
--- /dev/null
+++ b/src/main/java/com/lowagie/text/rtf/RtfFont.java
@@ -0,0 +1,162 @@
+/*
+ * $Id: RtfFont.java,v 1.25 2006/02/09 17:25:26 hallm Exp $
+ * $Name: $
+ *
+ * Copyright 2001, 2002 by Mark Hall
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the ?GNU LIBRARY GENERAL PUBLIC LICENSE?), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.rtf;
+
+import com.lowagie.text.Font;
+
+import java.awt.*;
+
+/**
+ * The RtfFont class enables you to add arbitrary Fonts to a rtf document by specifying
+ * the font name you want to have. The font has to be installed on the client for this to
+ * work.
+ *
+ * ONLY FOR USE WITH THE RtfWriter NOT with the RtfWriter2.
+ *
+ * @author <a href="mhall@myrealbox.com">mhall@myrealbox.com</a>
+ * @deprecated Please move to the RtfWriter2 and associated classes. com.lowagie.text.rtf.style.RtfFont replaces the functionality of this class.
+ */
+public class RtfFont extends Font {
+ /**
+ * The font family name of this RtfFont
+ */
+ private String familyName = "";
+
+ /**
+ * Constructs a RtfFont
+ *
+ * @param familyName The family name of this RtfFont
+ */
+ public RtfFont(String familyName) {
+ super(Font.UNDEFINED);
+ this.familyName = familyName;
+ }
+
+ /**
+ * Constructs a RtfFont
+ *
+ * @param familyName The font family name of this RtfFont
+ * @param size The font size of this RtfFont
+ */
+ public RtfFont(String familyName, float size) {
+ super(Font.UNDEFINED, size);
+ this.familyName = familyName;
+ }
+
+ /**
+ * Constructs a RtfFont
+ *
+ * @param familyName The font family name of this RtfFont
+ * @param size The font size of this RtfFont
+ * @param style The font style of this RtfFont
+ */
+ public RtfFont(String familyName, float size, int style) {
+ super(Font.UNDEFINED, size, style);
+ this.familyName = familyName;
+ }
+
+ /**
+ * Constructs a RtfFont
+ *
+ * @param familyName The font family name of this RtfFont
+ * @param size The font size of this RtfFont
+ * @param style The font style of this RtfFont
+ * @param color The font color of this RtfFont
+ */
+ public RtfFont(String familyName, float size, int style, Color color) {
+ super(Font.UNDEFINED, size, style, color);
+ this.familyName = familyName;
+ }
+
+ /**
+ * Gets the familyname as a String.
+ *
+ * @return the familyname
+ */
+ public String getFamilyname() {
+ return this.familyName;
+ }
+
+ /**
+ * Replaces the attributes that are equal to <VAR>null</VAR> with
+ * the attributes of a given font.
+ *
+ * @param font the font of a bigger element class
+ * @return a <CODE>Font</CODE>
+ */
+ public Font difference(Font font) {
+ String dFamilyname = font.getFamilyname();
+ if(dFamilyname == null || dFamilyname.trim().equals("")) {
+ dFamilyname = this.familyName;
+ }
+
+ float dSize = font.size();
+ if(dSize == Font.UNDEFINED) {
+ dSize = this.size();
+ }
+
+ int dStyle = Font.UNDEFINED;
+ if(this.style() != Font.UNDEFINED && font.style() != Font.UNDEFINED) {
+ dStyle = this.style() | font.style();
+ } else if(this.style() != Font.UNDEFINED) {
+ dStyle = this.style();
+ } else if(font.style() != Font.UNDEFINED) {
+ dStyle = font.style();
+ }
+
+ Color dColor = font.color();
+ if(dColor == null) {
+ dColor = this.color();
+ }
+
+ return new RtfFont(dFamilyname, dSize, dStyle, dColor);
+ }
+}
diff --git a/src/main/java/com/lowagie/text/rtf/RtfHeaderFooter.java b/src/main/java/com/lowagie/text/rtf/RtfHeaderFooter.java
new file mode 100644
index 0000000..d1f59f5
--- /dev/null
+++ b/src/main/java/com/lowagie/text/rtf/RtfHeaderFooter.java
@@ -0,0 +1,114 @@
+/**
+ * $Id: RtfHeaderFooter.java,v 1.20 2006/02/09 17:25:25 hallm Exp $
+ *
+ * Copyright 2002 by
+ * <a href="http://www.smb-tec.com">SMB</a>
+ * <a href="mailto:Steffen.Stundzig@smb-tec.com">Steffen.Stundzig@smb-tec.com</a>
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the ?GNU LIBRARY GENERAL PUBLIC LICENSE?), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without right the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+package com.lowagie.text.rtf;
+
+import com.lowagie.text.Element;
+import com.lowagie.text.HeaderFooter;
+import com.lowagie.text.Phrase;
+
+
+/**
+ * This HeaderFooter specialization extends the normal HeaderFooter impl.
+ * by the new ctor with 'Element' param.
+ * So we have the ability to add a table or some moe sophisticated stuff
+ * as header or footer content.
+ *
+ * ONLY FOR USE WITH THE RtfWriter NOT with the RtfWriter2.
+ *
+ * This class is based on the RtfWriter-package from Mark Hall.
+ * @author <a href="mailto:Steffen.Stundzig@smb-tec.com">Steffen.Stundzig@smb-tec.com</a>
+ * @author <a href="mailto:mhall@myrealbox.com">Mark.Hall@myrealbox.com</a>
+ * @version $Revision: 1.20 $Date: 2006/02/09 17:25:25 $
+ * @deprecated Please move to the RtfWriter2 and associated classes. com.lowagie.text.rtf.headerfooter.RtfHeaderFooter replaces the functionality of this class.
+ */
+public class RtfHeaderFooter extends HeaderFooter {
+
+
+ private Element content = null;
+
+
+ /**
+ * Constructs a new header
+ * @param before
+ * @param after
+ */
+ public RtfHeaderFooter( Phrase before, Phrase after ) {
+ super( before, after );
+ }
+
+
+ /**
+ * Constructs a new header
+ * @param before
+ * @param numbered
+ */
+ public RtfHeaderFooter( Phrase before, boolean numbered ) {
+ super( before, numbered );
+ }
+
+
+ /**
+ * Constructs a new header
+ * @param content
+ */
+ public RtfHeaderFooter( Element content ) {
+ super(new Phrase(content.toString()), false);
+ this.content = content;
+ }
+
+
+ /**
+ * @return the element specified in the ctor or null;
+ */
+ public Element content() {
+ return content;
+ }
+}
diff --git a/src/main/java/com/lowagie/text/rtf/RtfHeaderFooters.java b/src/main/java/com/lowagie/text/rtf/RtfHeaderFooters.java
new file mode 100644
index 0000000..70d0c83
--- /dev/null
+++ b/src/main/java/com/lowagie/text/rtf/RtfHeaderFooters.java
@@ -0,0 +1,160 @@
+/**
+ * $Id: RtfHeaderFooters.java,v 1.21 2006/02/09 17:25:25 hallm Exp $
+ *
+ * Copyright 2002 by
+ * <a href="http://www.smb-tec.com">SMB</a>
+ * <a href="mailto:Steffen.Stundzig@smb-tec.com">Steffen.Stundzig@smb-tec.com</a>
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the ?GNU LIBRARY GENERAL PUBLIC LICENSE?), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without right the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.rtf;
+
+import com.lowagie.text.HeaderFooter;
+import com.lowagie.text.Phrase;
+
+
+/**
+ * This HeaderFooter specialization contains some headers or footers for several
+ * pages. Is a list of headerFooters but also a sub class of header footer, to change
+ * as less as possible of the current API.
+ *
+ * ONLY FOR USE WITH THE RtfWriter NOT with the RtfWriter2.
+ *
+ * This class is based on the RtfWriter-package from Mark Hall.
+ * @author <a href="mailto:Steffen.Stundzig@smb-tec.com">Steffen.Stundzig@smb-tec.com</a>
+ * @author <a href="mailto:mhall@myrealbox.com">Mark.Hall@myrealbox.com</a>
+ * @version $Revision: 1.21 $Date: 2006/02/09 17:25:25 $
+ * @deprecated Please move to the RtfWriter2 and associated classes. com.lowagie.text.rtf.headerfooter.RtfHeaderFooterGroup replaces the functionality of this class.
+ */
+public class RtfHeaderFooters extends HeaderFooter {
+ /** an attribute value */
+ public final static int ALL_PAGES = 0;
+ /** an attribute value */
+ public final static int LEFT_PAGES = 1;
+ /** an attribute value */
+ public final static int RIGHT_PAGES = 2;
+ /** an attribute value */
+ public final static int FIRST_PAGE = 3;
+
+// public int defaultHeader = ALL_PAGES;
+
+ /** header or footer placeholder */
+ private HeaderFooter allPages = null;
+ /** header or footer placeholder */
+ private HeaderFooter leftPages = null;
+ /** header or footer placeholder */
+ private HeaderFooter rightPages = null;
+ /** header or footer placeholder */
+ private HeaderFooter firstPage = null;
+
+ /**
+ * Contructs a HeaderFooters object
+ */
+ public RtfHeaderFooters() {
+ super( new Phrase(""), false );
+ }
+
+ /**
+ * Contructs a HeaderFooters object
+ * @param before
+ * @param after
+ */
+ public RtfHeaderFooters( Phrase before, Phrase after ) {
+ super( before, after );
+ }
+
+ /**
+ * Contructs a HeaderFooters object
+ * @param before
+ * @param numbered
+ */
+ public RtfHeaderFooters( Phrase before, boolean numbered ) {
+ super( before, numbered );
+ }
+
+ /**
+ * Adds a HeaderFooter to this HeaderFooters object
+ * @param type
+ * @param hf
+ */
+ public void set( int type, HeaderFooter hf ) {
+ switch (type) {
+ case ALL_PAGES:
+ allPages = hf;
+ break;
+ case LEFT_PAGES:
+ leftPages = hf;
+ break;
+ case RIGHT_PAGES:
+ rightPages = hf;
+ break;
+ case FIRST_PAGE:
+ firstPage = hf;
+ break;
+ default:
+ throw new IllegalStateException( "unknown type " + type );
+ }
+ }
+
+ /**
+ * Returns a type of HeaderFooter object registered in this HeaderFooters object.
+ * @param type type of the HeaderFooter object
+ * @return a HeaderFooter object
+ */
+ public HeaderFooter get( int type ) {
+ switch (type) {
+ case ALL_PAGES:
+ return allPages;
+ case LEFT_PAGES:
+ return leftPages;
+ case RIGHT_PAGES:
+ return rightPages;
+ case FIRST_PAGE:
+ return firstPage;
+ default:
+ throw new IllegalStateException( "unknown type " + type );
+ }
+ }
+}
diff --git a/src/main/java/com/lowagie/text/rtf/RtfMapper.java b/src/main/java/com/lowagie/text/rtf/RtfMapper.java
new file mode 100644
index 0000000..1464c81
--- /dev/null
+++ b/src/main/java/com/lowagie/text/rtf/RtfMapper.java
@@ -0,0 +1,182 @@
+/*
+ * $Id: RtfMapper.java,v 1.10 2005/05/04 14:41:15 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2003, 2004 by Mark Hall
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the ?GNU LIBRARY GENERAL PUBLIC LICENSE?), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.rtf;
+
+import com.lowagie.text.Anchor;
+import com.lowagie.text.Annotation;
+import com.lowagie.text.Chapter;
+import com.lowagie.text.Chunk;
+import com.lowagie.text.DocumentException;
+import com.lowagie.text.Element;
+import com.lowagie.text.Image;
+import com.lowagie.text.List;
+import com.lowagie.text.ListItem;
+import com.lowagie.text.Meta;
+import com.lowagie.text.Paragraph;
+import com.lowagie.text.Phrase;
+import com.lowagie.text.Section;
+import com.lowagie.text.SimpleTable;
+import com.lowagie.text.Table;
+import com.lowagie.text.rtf.document.RtfDocument;
+import com.lowagie.text.rtf.document.RtfInfoElement;
+import com.lowagie.text.rtf.field.RtfAnchor;
+import com.lowagie.text.rtf.graphic.RtfImage;
+import com.lowagie.text.rtf.list.RtfList;
+import com.lowagie.text.rtf.list.RtfListItem;
+import com.lowagie.text.rtf.table.RtfTable;
+import com.lowagie.text.rtf.text.RtfAnnotation;
+import com.lowagie.text.rtf.text.RtfChapter;
+import com.lowagie.text.rtf.text.RtfChunk;
+import com.lowagie.text.rtf.text.RtfNewPage;
+import com.lowagie.text.rtf.text.RtfParagraph;
+import com.lowagie.text.rtf.text.RtfPhrase;
+import com.lowagie.text.rtf.text.RtfSection;
+
+
+/**
+ * The RtfMapper provides mappings between com.lowagie.text.* classes
+ * and the corresponding com.lowagie.text.rtf.** classes.
+ *
+ * @version $Version:$
+ * @author Mark Hall (mhall@edu.uni-klu.ac.at)
+ */
+public class RtfMapper {
+
+ /**
+ * The RtfDocument this RtfMapper belongs to
+ */
+ RtfDocument rtfDoc;
+
+ /**
+ * Constructs a RtfMapper for a RtfDocument
+ *
+ * @param doc The RtfDocument this RtfMapper belongs to
+ */
+ public RtfMapper(RtfDocument doc) {
+ this.rtfDoc = doc;
+ }
+
+ /**
+ * Takes an Element subclass and returns the correct RtfBasicElement
+ * subclass, that wraps the Element subclass.
+ *
+ * @param element The Element to wrap
+ * @return A RtfBasicElement wrapping the Element
+ * @throws DocumentException
+ */
+ public RtfBasicElement mapElement(Element element) throws DocumentException {
+ RtfBasicElement rtfElement = null;
+
+ if(element instanceof RtfBasicElement) {
+ rtfElement = (RtfBasicElement) element;
+ rtfElement.setRtfDocument(this.rtfDoc);
+ return rtfElement;
+ }
+ switch(element.type()) {
+ case Element.CHUNK:
+ if(((Chunk) element).getImage() != null) {
+ rtfElement = new RtfImage(rtfDoc, ((Chunk) element).getImage());
+ } else if(((Chunk) element).hasAttributes() && ((Chunk) element).getAttributes().containsKey(Chunk.NEWPAGE)) {
+ rtfElement = new RtfNewPage(rtfDoc);
+ } else {
+ rtfElement = new RtfChunk(rtfDoc, (Chunk) element);
+ }
+ break;
+ case Element.PHRASE:
+ rtfElement = new RtfPhrase(rtfDoc, (Phrase) element);
+ break;
+ case Element.PARAGRAPH:
+ rtfElement = new RtfParagraph(rtfDoc, (Paragraph) element);
+ break;
+ case Element.ANCHOR:
+ rtfElement = new RtfAnchor(rtfDoc, (Anchor) element);
+ break;
+ case Element.ANNOTATION:
+ rtfElement = new RtfAnnotation(rtfDoc, (Annotation) element);
+ break;
+ case Element.IMGRAW:
+ case Element.IMGTEMPLATE:
+ case Element.JPEG:
+ rtfElement = new RtfImage(rtfDoc, (Image) element);
+ break;
+ case Element.AUTHOR:
+ case Element.SUBJECT:
+ case Element.KEYWORDS:
+ case Element.TITLE:
+ case Element.PRODUCER:
+ case Element.CREATIONDATE:
+ rtfElement = new RtfInfoElement(rtfDoc, (Meta) element);
+ break;
+ case Element.LIST:
+ rtfElement = new RtfList(rtfDoc, (List) element);
+ break;
+ case Element.LISTITEM:
+ rtfElement = new RtfListItem(rtfDoc, (ListItem) element);
+ break;
+ case Element.SECTION:
+ rtfElement = new RtfSection(rtfDoc, (Section) element);
+ break;
+ case Element.CHAPTER:
+ rtfElement = new RtfChapter(rtfDoc, (Chapter) element);
+ break;
+ case Element.TABLE:
+ try {
+ rtfElement = new RtfTable(rtfDoc, (Table) element);
+ }
+ catch(ClassCastException e) {
+ rtfElement = new RtfTable(rtfDoc, ((SimpleTable) element).createTable());
+ }
+ break;
+ }
+
+ return rtfElement;
+ }
+}
diff --git a/src/main/java/com/lowagie/text/rtf/RtfPageNumber.java b/src/main/java/com/lowagie/text/rtf/RtfPageNumber.java
new file mode 100644
index 0000000..1e966a2
--- /dev/null
+++ b/src/main/java/com/lowagie/text/rtf/RtfPageNumber.java
@@ -0,0 +1,105 @@
+/**
+ * $Id: RtfPageNumber.java,v 1.26 2006/02/09 17:25:25 hallm Exp $
+ *
+ * Copyright 2002 by
+ * <a href="http://www.smb-tec.com">SMB</a>
+ * <a href="mailto:Steffen.Stundzig@smb-tec.com">Steffen.Stundzig@smb-tec.com</a>
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the ?GNU LIBRARY GENERAL PUBLIC LICENSE?), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.rtf;
+
+import java.io.IOException;
+import java.io.OutputStream;
+
+import com.lowagie.text.Font;
+
+/**
+ * A rtf page number field.
+ *
+ * ONLY FOR USE WITH THE RtfWriter NOT with the RtfWriter2.
+ *
+ * This class is based on the RtfWriter-package from Mark Hall.
+ * @author <a href="mailto:Steffen.Stundzig@smb-tec.com">Steffen.Stundzig@smb-tec.com</a>
+ * @author <a href="mailto:mhall@myrealbox.com">mhall@myrealbox.com</a>
+ * @version $Revision: 1.26 $Date: 2006/02/09 17:25:25 $
+ * @deprecated Please move to the RtfWriter2 and associated classes. com.lowagie.text.rtf.field.RtfPageNumber replaces the functionality of this class.
+ */
+public class RtfPageNumber extends GenericRtfField implements RtfField {
+ private String content;
+
+ /**
+ * construct a RtfPageNumber. The parameter content will be
+ * displayed in front of the page number using the font given as
+ * second argument.
+ * @param content the String that will be displayed in front of the page number
+ * @param contentFont the font to use to display this page number
+ */
+ public RtfPageNumber( String content, Font contentFont ) {
+ super("PAGE", "", contentFont);
+ this.content = content;
+ }
+
+ /**
+ * write this RtfField into a stream using the writer given as
+ * first argument.
+ * @param writer the RtfWriter to use to write this RtfField
+ * @param out the Stream to write this RtfField into.
+ * @throws IOException
+ */
+ public void write( RtfWriter writer, OutputStream out ) throws IOException {
+ writer.writeInitialFontSignature( out, this );
+ out.write(content.getBytes());
+ writer.writeFinishingFontSignature( out, this );
+ super.write(writer, out);
+ }
+
+ /**
+ * @see com.lowagie.text.Element#toString()
+ */
+ public String toString() {
+ return content;
+ }
+}
diff --git a/src/main/java/com/lowagie/text/rtf/RtfRow.java b/src/main/java/com/lowagie/text/rtf/RtfRow.java
new file mode 100644
index 0000000..4a68987
--- /dev/null
+++ b/src/main/java/com/lowagie/text/rtf/RtfRow.java
@@ -0,0 +1,443 @@
+/**
+ * $Id: RtfRow.java,v 1.38 2006/02/09 17:25:25 hallm Exp $
+ * $Name: $
+ *
+ * Copyright 2001, 2002 by Mark Hall
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the ?GNU LIBRARY GENERAL PUBLIC LICENSE?), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.rtf;
+
+import com.lowagie.text.*;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.io.*;
+import java.awt.Color;
+
+/**
+ * A Helper Class for the <CODE>RtfWriter</CODE>.
+ * <P>
+ * Do not use it directly
+ *
+ * ONLY FOR USE WITH THE RtfWriter NOT with the RtfWriter2.
+ *
+ * Parts of this Class were contributed by Steffen Stundzig. Many thanks for the
+ * improvements.
+ * Code added by c
+ * @deprecated Please move to the RtfWriter2 and associated classes.
+ */
+public class RtfRow {
+ /** Table border solid */
+ public static final byte[] tableBorder = "brdrs".getBytes();
+ /** Table border width */
+ public static final byte[] tableBorderWidth = "brdrw".getBytes();
+ /** Table border color */
+ public static final byte[] tableBorderColor = "brdrcf".getBytes();
+
+ /** Table row defaults */
+ private static final byte[] rowBegin = "trowd".getBytes();
+ /** End of table row */
+ private static final byte[] rowEnd = "row".getBytes();
+ /** Table row autofit */
+ private static final byte[] rowAutofit = "trautofit1".getBytes();
+ private static final byte[] graphLeft = "trgaph".getBytes();
+ /** Row border left */
+ private static final byte[] rowBorderLeft = "trbrdrl".getBytes();
+ /** Row border right */
+ private static final byte[] rowBorderRight = "trbrdrr".getBytes();
+ /** Row border top */
+ private static final byte[] rowBorderTop = "trbrdrt".getBytes();
+ /** Row border bottom */
+ private static final byte[] rowBorderBottom = "trbrdrb".getBytes();
+ /** Row border horiz inline */
+ private static final byte[] rowBorderInlineHorizontal = "trbrdrh".getBytes();
+ /** Row border bottom */
+ private static final byte[] rowBorderInlineVertical = "trbrdrv".getBytes();
+ /** Default cell spacing left */
+ private static final byte[] rowSpacingLeft = "trspdl".getBytes();
+ /** Default cell spacing right */
+ private static final byte[] rowSpacingRight = "trspdr".getBytes();
+ /** Default cell spacing top */
+ private static final byte[] rowSpacingTop = "trspdt".getBytes();
+ /** Default cell spacing bottom */
+ private static final byte[] rowSpacingBottom = "trspdb".getBytes();
+ /** Default cell spacing format left */
+ private static final byte[] rowSpacingLeftStyle = "trspdfl3".getBytes();
+ /** Default cell spacing format right */
+ private static final byte[] rowSpacingRightStyle = "trspdfr3".getBytes();
+ /** Default cell spacing format top */
+ private static final byte[] rowSpacingTopStyle = "trspdft3".getBytes();
+ /** Default cell spacing format bottom */
+ private static final byte[] rowSpacingBottomStyle = "trspdfb3".getBytes();
+ /** Default cell padding left */
+ private static final byte[] rowPaddingLeft = "trpaddl".getBytes();
+ /** Default cell padding right */
+ private static final byte[] rowPaddingRight = "trpaddr".getBytes();
+ /** Default cell padding format left */
+ private static final byte[] rowPaddingLeftStyle = "trpaddfl3".getBytes();
+ /** Default cell padding format right */
+ private static final byte[] rowPaddingRightStyle = "trpaddfr3".getBytes();
+ /** Row width format */
+ private static final byte[] rowWidthStyle = "trftsWidth3".getBytes();
+ /** Row width */
+ private static final byte[] rowWidth = "trwWidth".getBytes();
+ /**
+ * Table row header. This row should appear at the top of every
+ * page the current table appears on.
+ */
+ private static final byte[] rowHeader = "trhdr".getBytes();
+ /**
+ * Table row keep together. This row cannot be split by a page break.
+ * This property is assumed to be off unless the control word is
+ * present.
+ */
+ private static final byte[] rowKeep = "trkeep".getBytes();
+ /** Table alignment left */
+ private static final byte[] rowAlignLeft = "trql".getBytes();
+ /** Table alignment center */
+ private static final byte[] rowAlignCenter = "trqc".getBytes();
+ /** Table alignment right */
+ private static final byte[] rowAlignRight = "trqr".getBytes();
+
+ /** List of <code>RtfCell</code>s in this <code>RtfRow</code> */
+ private ArrayList cells = new ArrayList();
+ /** The <code>RtfWriter</code> to which this <code>RtfRow</code> belongs */
+ private RtfWriter writer = null;
+ /** The <coce>RtfTable</code> to which this <code>RtfRow</code> belongs */
+ private RtfTable mainTable = null;
+
+ /** The width of this <code>RtfRow</code> (in percent) */
+ private int width = 100;
+ /** The default cellpadding of <code>RtfCells</code> in this
+ * <code>RtfRow</code> */
+ private int cellpadding = 115;
+ /** The default cellspacing of <code>RtfCells</code> in this
+ * <code>RtfRow</code> */
+ private int cellspacing = 14;
+ /** The borders of this <code>RtfRow</code> */
+ private int borders = 0;
+ /** The border color of this <code>RtfRow</code> */
+ private java.awt.Color borderColor = null;
+ /** The border width of this <code>RtfRow</code> */
+ private float borderWidth = 0;
+
+ /** Original Row */
+ private Row origRow = null;
+
+ /**
+ * Create a new <code>RtfRow</code>.
+ *
+ * @param writer The <code>RtfWriter</code> that this <code>RtfRow</code> belongs to
+ * @param mainTable The <code>RtfTable</code> that created this
+ * <code>RtfRow</code>
+ */
+ public RtfRow(RtfWriter writer, RtfTable mainTable) {
+ super();
+ this.writer = writer;
+ this.mainTable = mainTable;
+ }
+
+ /**
+ * Pregenerate the <code>RtfCell</code>s in this <code>RtfRow</code>.
+ *
+ * @param columns The number of <code>RtfCell</code>s to be generated.
+ */
+ public void pregenerateRows(int columns) {
+ for (int i = 0; i < columns; i++) {
+ RtfCell rtfCell = new RtfCell(writer, mainTable);
+ cells.add(rtfCell);
+ }
+ }
+
+ /**
+ * Import a <code>Row</code>.
+ * <P>
+ * All the parameters are taken from the <code>RtfTable</code> which contains
+ * this <code>RtfRow</code> and they do exactely what they say
+ * @param row
+ * @param propWidths in percent
+ * @param tableWidth in percent
+ * @param pageWidth
+ * @param cellpadding
+ * @param cellspacing
+ * @param borders
+ * @param borderColor
+ * @param borderWidth
+ * @param y
+ * @return true if importing the row succeeded
+ */
+ public boolean importRow(Row row, float[] propWidths, int tableWidth, int pageWidth, int cellpadding,
+ int cellspacing, int borders, java.awt.Color borderColor, float borderWidth,
+ int y) {
+ // the width of this row is the absolute witdh, calculated from the
+ // proportional with of the table and the total width of the page
+ this.origRow = row;
+ this.width = pageWidth / 100 * tableWidth;
+ this.cellpadding = cellpadding;
+ this.cellspacing = cellspacing;
+ this.borders = borders;
+ this.borderColor = borderColor;
+ this.borderWidth = borderWidth;
+
+ if (this.borderWidth > 2) this.borderWidth = 2;
+
+ int cellLeft = 0;
+ for (int i = 0; i < row.columns(); i++) {
+ Element cell = (Element) row.getCell(i);
+
+ // cellWidth is an absolute argument
+ // it's based on the absolute of this row and the proportional
+ // width of this column
+ int cellWidth = (int) (width / 100 * propWidths[i]);
+ if (cell != null) {
+ if (cell.type() == Element.CELL) {
+ RtfCell rtfCell = (RtfCell) cells.get(i);
+ cellLeft = rtfCell.importCell((Cell) cell, cellLeft, cellWidth, i, y, cellpadding);
+ }
+ } else {
+ RtfCell rtfCell = (RtfCell) cells.get(i);
+ cellLeft = rtfCell.importCell(null, cellLeft, cellWidth, i, y, cellpadding);
+ }
+ }
+
+ // recalculate the cell right border and the cumulative width
+ // on col spanning cells.
+ // col + row spanning cells are also handled by this loop, because the real cell of
+ // the upper left corner in such an col, row matrix is copied as first cell
+ // in each row in this matrix
+ int columns = row.columns();
+ for (int i = 0; i < columns; i++) {
+ RtfCell firstCell = (RtfCell) cells.get(i);
+ Cell cell = firstCell.getStore();
+ int cols = 0;
+ if(cell != null) {
+ cols = cell.colspan();
+ }
+ if (cols > 1) {
+ RtfCell lastCell = (RtfCell) cells.get(i + cols - 1);
+ firstCell.setCellRight(lastCell.getCellRight());
+ int width = firstCell.getCellWidth();
+ for (int j = i + 1; j < i + cols; j++) {
+ RtfCell cCell = (RtfCell) cells.get(j);
+ width += cCell.getCellWidth();
+ }
+ firstCell.setCellWidth(width);
+ i += cols - 1;
+ }
+ }
+ return true;
+ }
+
+ /**
+ * Write the <code>RtfRow</code> to the specified <code>OutputStream</code>.
+ *
+ * @param os The <code>OutputStream</code> to which this <code>RtfRow</code>
+ * should be written to.
+ * @param rowNum The <code>index</code> of this row in the containing table.
+ * @param table The <code>Table</code> which contains the original <code>Row</code>.
+ * @return true if writing the row succeeded
+ * @throws DocumentException
+ * @throws IOException
+ */
+ public boolean writeRow(ByteArrayOutputStream os, int rowNum, Table table) throws DocumentException,
+ IOException {
+ os.write(RtfWriter.escape);
+ os.write(rowBegin);
+ os.write((byte) '\n');
+ os.write(RtfWriter.escape);
+ os.write(rowWidthStyle);
+ os.write(RtfWriter.escape);
+ os.write(rowWidth);
+ writeInt(os, width);
+// os.write(RtfWriter.escape);
+// os.write(rowAutofit);
+ if (mainTable.getOriginalTable().hasToFitPageCells()) {
+ os.write(RtfWriter.escape);
+ os.write(rowKeep);
+ }
+ // check if this row is a header row
+ if (rowNum < table.firstDataRow()) {
+ os.write(RtfWriter.escape);
+ os.write(rowHeader);
+ }
+ os.write(RtfWriter.escape);
+ switch (this.origRow.horizontalAlignment()) {
+ case Element.ALIGN_LEFT:
+ os.write(rowAlignLeft);
+ break;
+ case Element.ALIGN_CENTER:
+ os.write(rowAlignCenter);
+ break;
+ case Element.ALIGN_RIGHT:
+ os.write(rowAlignRight);
+ break;
+ default :
+ os.write(rowAlignLeft);
+ break;
+ }
+ os.write(RtfWriter.escape);
+ os.write(graphLeft);
+ writeInt(os, 10);
+ if (((borders & Rectangle.LEFT) == Rectangle.LEFT) && (borderWidth > 0)) {
+ writeBorder(os, rowBorderLeft);
+ }
+ if (((borders & Rectangle.TOP) == Rectangle.TOP) && (borderWidth > 0)) {
+ writeBorder(os, rowBorderTop);
+ }
+ if (((borders & Rectangle.BOTTOM) == Rectangle.BOTTOM) && (borderWidth > 0)) {
+ writeBorder(os, rowBorderBottom);
+ }
+ if (((borders & Rectangle.RIGHT) == Rectangle.RIGHT) && (borderWidth > 0)) {
+ writeBorder(os, rowBorderRight);
+ }
+ if (((borders & Rectangle.BOX) == Rectangle.BOX) && (borderWidth > 0)) {
+ writeBorder(os, rowBorderInlineHorizontal);
+ writeBorder(os, rowBorderInlineVertical);
+ }
+
+ if (cellspacing > 0) {
+ os.write(RtfWriter.escape);
+ os.write(rowSpacingLeft);
+ writeInt(os, cellspacing / 2);
+ os.write(RtfWriter.escape);
+ os.write(rowSpacingLeftStyle);
+ os.write(RtfWriter.escape);
+ os.write(rowSpacingTop);
+ writeInt(os, cellspacing / 2);
+ os.write(RtfWriter.escape);
+ os.write(rowSpacingTopStyle);
+ os.write(RtfWriter.escape);
+ os.write(rowSpacingBottom);
+ writeInt(os, cellspacing / 2);
+ os.write(RtfWriter.escape);
+ os.write(rowSpacingBottomStyle);
+ os.write(RtfWriter.escape);
+ os.write(rowSpacingRight);
+ writeInt(os, cellspacing / 2);
+ os.write(RtfWriter.escape);
+ os.write(rowSpacingRightStyle);
+ }
+ os.write(RtfWriter.escape);
+ os.write(rowPaddingLeft);
+ writeInt(os, cellpadding / 2);
+ os.write(RtfWriter.escape);
+ os.write(rowPaddingRight);
+ writeInt(os, cellpadding / 2);
+ os.write(RtfWriter.escape);
+ os.write(rowPaddingLeftStyle);
+ os.write(RtfWriter.escape);
+ os.write(rowPaddingRightStyle);
+ os.write((byte) '\n');
+
+ Iterator cellIterator = cells.iterator();
+ while (cellIterator.hasNext()) {
+ RtfCell cell = (RtfCell) cellIterator.next();
+ cell.writeCellSettings(os);
+ }
+
+ os.write(RtfWriter.escape);
+ os.write("intbl".getBytes());
+
+ cellIterator = cells.iterator();
+ while (cellIterator.hasNext()) {
+ RtfCell cell = (RtfCell) cellIterator.next();
+ cell.writeCellContent(os);
+ }
+ os.write(RtfWriter.delimiter);
+ os.write(RtfWriter.escape);
+ os.write(rowEnd);
+ return true;
+ }
+
+
+ private void writeBorder(ByteArrayOutputStream os, byte[] borderType) throws IOException {
+ // horizontal and vertical, top, left, bottom, right
+ os.write(RtfWriter.escape);
+ os.write(borderType);
+ // line style
+ os.write(RtfWriter.escape);
+ os.write(RtfRow.tableBorder);
+ // borderwidth
+ os.write(RtfWriter.escape);
+ os.write(RtfRow.tableBorderWidth);
+ writeInt(os, (int) (borderWidth * RtfWriter.TWIPSFACTOR));
+ // border color
+ os.write(RtfWriter.escape);
+ os.write(RtfRow.tableBorderColor);
+ if (borderColor == null) {
+ writeInt(os, writer.addColor(new Color(0, 0, 0)));
+ } else {
+ writeInt(os, writer.addColor(borderColor));
+ }
+ os.write((byte) '\n');
+ }
+
+
+ /**
+ * <code>RtfTable</code>s call this method from their own setMerge() to
+ * specify that a certain other cell is to be merged with it.
+ *
+ * @param x The column position of the cell to be merged
+ * @param mergeType The merge type specifies the kind of merge to be applied
+ * (MERGE_HORIZ_PREV, MERGE_VERT_PREV, MERGE_BOTH_PREV)
+ * @param mergeCell The <code>RtfCell</code> that the cell at x and y is to
+ * be merged with
+ */
+ public void setMerge(int x, int mergeType, RtfCell mergeCell) {
+ RtfCell cell = (RtfCell) cells.get(x);
+ cell.setMerge(mergeType, mergeCell);
+ }
+
+ /*
+ * Write an Integer to the Outputstream.
+ *
+ * @param out The <code>OutputStream</code> to be written to.
+ * @param i The int to be written.
+ */
+ private void writeInt(ByteArrayOutputStream out, int i) throws IOException {
+ out.write(Integer.toString(i).getBytes());
+ }
+}
diff --git a/src/main/java/com/lowagie/text/rtf/RtfTOC.java b/src/main/java/com/lowagie/text/rtf/RtfTOC.java
new file mode 100644
index 0000000..044a871
--- /dev/null
+++ b/src/main/java/com/lowagie/text/rtf/RtfTOC.java
@@ -0,0 +1,187 @@
+/**
+ * $Id: RtfTOC.java,v 1.23 2006/02/09 17:25:25 hallm Exp $
+ *
+ * Copyright 2002 by
+ * <a href="http://www.smb-tec.com">SMB</a>
+ * <a href="mailto:Steffen.Stundzig@smb-tec.com">Steffen.Stundzig@smb-tec.com</a>
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the “GNU LIBRARY GENERAL PUBLIC LICENSE”), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.rtf;
+
+import java.io.IOException;
+import java.io.OutputStream;
+
+import com.lowagie.text.Chunk;
+import com.lowagie.text.DocumentException;
+import com.lowagie.text.Font;
+import com.lowagie.text.ExceptionConverter;
+
+/**
+ * This class can be used to insert a table of contents into
+ * the RTF document.
+ * Therefore the field TOC is used. It works great in Word 2000.
+ * StarOffice doesn't support such fields. Other word version
+ * are not tested yet.
+ *
+ * ONLY FOR USE WITH THE RtfWriter NOT with the RtfWriter2.
+ *
+ * This class is based on the RtfWriter-package from Mark Hall.
+ * @author <a href="mailto:Steffen.Stundzig@smb-tec.com">Steffen.Stundzig@smb-tec.com</a>
+ * @version $Revision: 1.23 $Date: 2006/02/09 17:25:25 $
+ * @deprecated Please move to the RtfWriter2 and associated classes. com.lowagie.text.rtf.field.RtfTableOfContents replaces the functionality of this class.
+ */
+public class RtfTOC extends Chunk implements RtfField {
+
+
+ private String defaultText = "Klicken Sie mit der rechten Maustaste auf diesen Text, um das Inhaltsverzeichnis zu aktualisieren!";
+
+ private boolean addTOCAsTOCEntry = false;
+
+ private Font entryFont = null;
+ private String entryName = null;
+
+
+ /**
+ * @param tocName the headline of the table of contents
+ * @param tocFont the font for the headline
+ */
+ public RtfTOC( String tocName, Font tocFont ) {
+ super( tocName, tocFont );
+ }
+
+ /**
+ * @see com.lowagie.text.rtf.RtfField#write(com.lowagie.text.rtf.RtfWriter, java.io.OutputStream)
+ */
+ public void write( RtfWriter writer, OutputStream out ) throws IOException {
+
+ writer.writeInitialFontSignature( out, this );
+ out.write( RtfWriter.filterSpecialChar( content(), true ).getBytes() );
+ writer.writeFinishingFontSignature( out, this );
+
+ if (addTOCAsTOCEntry) {
+ RtfTOCEntry entry = new RtfTOCEntry( entryName, entryFont );
+ entry.hideText();
+ try {
+ writer.add( entry );
+ } catch ( DocumentException de ) {
+ throw new ExceptionConverter(de);
+ }
+ }
+
+ // line break after headline
+ out.write( RtfWriter.escape );
+ out.write( RtfWriter.paragraph );
+ out.write( RtfWriter.delimiter );
+
+ // toc field entry
+ out.write( RtfWriter.openGroup );
+ out.write( RtfWriter.escape );
+ out.write( RtfWriter.field );
+ // field initialization stuff
+ out.write( RtfWriter.openGroup );
+ out.write( RtfWriter.escape );
+ out.write( RtfWriter.fieldContent );
+ out.write( RtfWriter.delimiter );
+ out.write( "TOC".getBytes() );
+ // create the TOC based on the 'toc entries'
+ out.write( RtfWriter.delimiter );
+ out.write( RtfWriter.escape );
+ out.write( RtfWriter.escape );
+ out.write( "f".getBytes() );
+ out.write( RtfWriter.delimiter );
+ // create Hyperlink TOC Entrie
+ out.write( RtfWriter.escape );
+ out.write( RtfWriter.escape );
+ out.write( "h".getBytes() );
+ out.write( RtfWriter.delimiter );
+ // create the TOC based on the paragraph level
+ out.write( RtfWriter.delimiter );
+ out.write( RtfWriter.escape );
+ out.write( RtfWriter.escape );
+ out.write( "u".getBytes() );
+ out.write( RtfWriter.delimiter );
+ // create the TOC based on the paragraph headlines 1-5
+ out.write( RtfWriter.delimiter );
+ out.write( RtfWriter.escape );
+ out.write( RtfWriter.escape );
+ out.write( "o".getBytes() );
+ out.write( RtfWriter.delimiter );
+ out.write( "\"1-5\"".getBytes() );
+ out.write( RtfWriter.delimiter );
+ out.write( RtfWriter.closeGroup );
+
+ // field default result stuff
+ out.write( RtfWriter.openGroup );
+ out.write( RtfWriter.escape );
+ out.write( RtfWriter.fieldDisplay );
+ out.write( RtfWriter.delimiter );
+ out.write( defaultText.getBytes() );
+ out.write( RtfWriter.delimiter );
+ out.write( RtfWriter.closeGroup );
+ out.write( RtfWriter.closeGroup );
+ }
+
+
+ /**
+ * Add a toc entry
+ * @param entryName the name of the entry
+ * @param entryFont the font to be used for the entry
+ */
+ public void addTOCAsTOCEntry( String entryName, Font entryFont ) {
+ this.addTOCAsTOCEntry = true;
+ this.entryFont = entryFont;
+ this.entryName = entryName;
+ }
+
+
+ /**
+ * Sets the default text of the Table of Contents
+ * @param text the default text
+ */
+ public void setDefaultText( String text ) {
+ this.defaultText = text;
+ }
+}
diff --git a/src/main/java/com/lowagie/text/rtf/RtfTOCEntry.java b/src/main/java/com/lowagie/text/rtf/RtfTOCEntry.java
new file mode 100644
index 0000000..c3ceab1
--- /dev/null
+++ b/src/main/java/com/lowagie/text/rtf/RtfTOCEntry.java
@@ -0,0 +1,174 @@
+/**
+ * $Id: RtfTOCEntry.java,v 1.23 2006/02/09 17:25:26 hallm Exp $
+ *
+ * Copyright 2002 by
+ * <a href="http://www.smb-tec.com">SMB</a>
+ * <a href="mailto:Steffen.Stundzig@smb-tec.com">Steffen.Stundzig@smb-tec.com</a>
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the “GNU LIBRARY GENERAL PUBLIC LICENSE”), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.rtf;
+
+import java.io.IOException;
+import java.io.OutputStream;
+
+import com.lowagie.text.Chunk;
+import com.lowagie.text.Font;
+
+/**
+ * This class can be used to insert entries for a table of contents into
+ * the RTF document.
+ *
+ * ONLY FOR USE WITH THE RtfWriter NOT with the RtfWriter2.
+ *
+ * This class is based on the RtfWriter-package from Mark Hall.
+ * @author <a href="mailto:Steffen.Stundzig@smb-tec.com">Steffen.Stundzig@smb-tec.com</a>
+ * @version $Revision: 1.23 $Date: 2006/02/09 17:25:26 $
+ * @deprecated Please move to the RtfWriter2 and associated classes. com.lowagie.text.rtf.field.RtfTOCEntry replaces the functionality of this class.
+ */
+public class RtfTOCEntry extends Chunk implements RtfField {
+
+
+ private boolean hideText = false;
+
+ private boolean hidePageNumber = false;
+
+ private String entryName;
+
+ private Font entryFont;
+
+ private Font contentFont;
+
+
+ /**
+ * Constructs an entry for the Table of Contents
+ * @param content the content of the entry
+ * @param contentFont the font
+ */
+ public RtfTOCEntry( String content, Font contentFont ) {
+ this( content, contentFont, content, contentFont );
+// super( content, font );
+// this.entryName = content;
+// printEntryNameAsText = true;
+ }
+
+
+ /**
+ * Constructs an entry for the Table of Contents
+ * @param content the content of the entry
+ * @param contentFont the font
+ * @param entryName name of the entry
+ * @param entryFont font of the entryname
+ */
+ public RtfTOCEntry( String content, Font contentFont, String entryName, Font entryFont ) {
+ super( content, contentFont );
+ // hide the text of the entry, because it is printed
+ this.entryName = entryName;
+ this.entryFont = entryFont;
+ this.contentFont = contentFont;
+ }
+
+ /**
+ * @see com.lowagie.text.rtf.RtfField#write(com.lowagie.text.rtf.RtfWriter, java.io.OutputStream)
+ */
+ public void write( RtfWriter writer, OutputStream out ) throws IOException {
+
+ if (!hideText) {
+ writer.writeInitialFontSignature( out, new Chunk("", contentFont) );
+ out.write( RtfWriter.filterSpecialChar( content(), true ).getBytes() );
+ writer.writeFinishingFontSignature( out, new Chunk("", contentFont) );
+ }
+
+ if (!entryFont.equals( contentFont )) {
+ writer.writeInitialFontSignature(out, new Chunk("", entryFont) );
+ writeField( out );
+ writer.writeFinishingFontSignature(out, new Chunk("", entryFont) );
+ } else {
+ writer.writeInitialFontSignature(out, new Chunk("", contentFont) );
+ writeField( out );
+ writer.writeFinishingFontSignature(out, new Chunk("", contentFont) );
+ }
+ }
+
+
+ private void writeField( OutputStream out ) throws IOException {
+
+ // always hide the toc entry
+ out.write( RtfWriter.openGroup );
+ out.write( RtfWriter.escape );
+ out.write( "v".getBytes() );
+
+ // tc field entry
+ out.write( RtfWriter.openGroup );
+ out.write( RtfWriter.escape );
+ if (!hidePageNumber) {
+ out.write( "tc".getBytes() );
+ } else {
+ out.write( "tcn".getBytes() );
+ }
+ out.write( RtfWriter.delimiter );
+ out.write( RtfWriter.filterSpecialChar( entryName, true ).getBytes() );
+ out.write( RtfWriter.delimiter );
+ out.write( RtfWriter.closeGroup );
+
+ out.write( RtfWriter.closeGroup );
+ }
+
+ /**
+ * sets the hideText value to true
+ */
+ public void hideText() {
+ hideText = true;
+ }
+
+ /**
+ * sets the hidePageNumber value to true
+ */
+ public void hidePageNumber() {
+ hidePageNumber = true;
+ }
+}
+
+
diff --git a/src/main/java/com/lowagie/text/rtf/RtfTable.java b/src/main/java/com/lowagie/text/rtf/RtfTable.java
new file mode 100644
index 0000000..70c403e
--- /dev/null
+++ b/src/main/java/com/lowagie/text/rtf/RtfTable.java
@@ -0,0 +1,201 @@
+/**
+ * $Id: RtfTable.java,v 1.31 2006/02/09 17:25:25 hallm Exp $
+ * $Name: $
+ *
+ * Copyright 2001, 2002 by Mark Hall
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the ?GNU LIBRARY GENERAL PUBLIC LICENSE?), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.rtf;
+
+import com.lowagie.text.*;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.io.*;
+
+/**
+ * A Helper Class for the <CODE>RtfWriter</CODE>.
+ * <P>
+ * Do not use it directly, except if you want to write a <CODE>DocumentListener</CODE> for Rtf
+ *
+ * ONLY FOR USE WITH THE RtfWriter NOT with the RtfWriter2.
+ *
+ * Parts of this Class were contributed by Steffen Stundzig. Many thanks for the
+ * improvements.
+ * Updates Benoit WIART <b.wiart@proxiad.com>
+ * @deprecated Please move to the RtfWriter2 and associated classes.
+ */
+public class RtfTable {
+ /** Stores the different rows. */
+ private ArrayList rowsList = new ArrayList();
+ /** Stores the RtfWriter, which created this RtfTable. */
+ private RtfWriter writer = null;
+ /** Stores the Table, which this RtfTable is based on. */
+ private Table origTable = null;
+
+
+
+ /**
+ * Create a new <code>RtfTable</code>.
+ *
+ * @param writer The <code>RtfWriter</code> that created this Table
+ */
+ public RtfTable(RtfWriter writer) {
+ super();
+ this.writer = writer;
+ }
+
+ /**
+ * Import a <CODE>Table</CODE> into the <CODE>RtfTable</CODE>.
+ * <P>
+ * @param table A <code>Table</code> specifying the <code>Table</code> to be imported
+ * @param pageWidth An <code>int</code> specifying the page width
+ * @return true if importing the table succeeded
+ */
+ public boolean importTable(Table table, int pageWidth) {
+ origTable = table;
+ // All Cells are pregenerated first, so that cell and rowspanning work
+ Iterator rows = table.iterator();
+ Row row = null;
+
+ int tableWidth = (int) table.widthPercentage();
+ int cellpadding = (int) (table.cellpadding() * RtfWriter.TWIPSFACTOR);
+ int cellspacing = (int) (table.cellspacing() * RtfWriter.TWIPSFACTOR);
+ float[] propWidths = table.getProportionalWidths();
+
+ int borders = table.border();
+ java.awt.Color borderColor = table.borderColor();
+ float borderWidth = table.borderWidth();
+
+ for (int i = 0; i < table.size(); i++) {
+ RtfRow rtfRow = new RtfRow(writer, this);
+ rtfRow.pregenerateRows(table.columns());
+ rowsList.add(rtfRow);
+ }
+ int i = 0;
+ while (rows.hasNext()) {
+ row = (Row) rows.next();
+ row.setHorizontalAlignment(table.alignment());
+ RtfRow rtfRow = (RtfRow) rowsList.get(i);
+ rtfRow.importRow(row, propWidths, tableWidth, pageWidth, cellpadding, cellspacing, borders, borderColor, borderWidth, i);
+ i++;
+ }
+ return true;
+ }
+
+ /**
+ * Output the content of the <CODE>RtfTable</CODE> to an OutputStream.
+ *
+ * @param os The <code>OutputStream</code> that the content of the <code>RtfTable</code> is to be written to
+ * @return true if writing the table succeeded
+ * @throws DocumentException
+ * @throws IOException
+ */
+ public boolean writeTable(ByteArrayOutputStream os) throws DocumentException, IOException {
+
+ if(!this.writer.writingHeaderFooter()) {
+ // Added by Benoit WIART <b.wiart@proxiad.com>
+ // Add a new line before each table
+ os.write(RtfWriter.escape);
+ os.write(RtfWriter.paragraph);
+ }
+
+ int size = rowsList.size();
+ for (int i = 0; i < size; i++) {
+ RtfRow row = (RtfRow) rowsList.get(i);
+ row.writeRow(os, i, origTable);
+ os.write((byte) '\n');
+ }
+ if (!writer.writingHeaderFooter()) {
+ os.write(RtfWriter.escape);
+ os.write(RtfWriter.paragraphDefaults);
+ os.write(RtfWriter.escape);
+ os.write(RtfWriter.paragraph);
+ switch (origTable.alignment()) {
+ case Element.ALIGN_LEFT:
+ os.write(RtfWriter.escape);
+ os.write(RtfWriter.alignLeft);
+ break;
+ case Element.ALIGN_RIGHT:
+ os.write(RtfWriter.escape);
+ os.write(RtfWriter.alignRight);
+ break;
+ case Element.ALIGN_CENTER:
+ os.write(RtfWriter.escape);
+ os.write(RtfWriter.alignCenter);
+ break;
+ case Element.ALIGN_JUSTIFIED:
+ case Element.ALIGN_JUSTIFIED_ALL:
+ os.write(RtfWriter.escape);
+ os.write(RtfWriter.alignJustify);
+ break;
+ }
+ }
+ return true;
+ }
+
+ /**
+ * <code>RtfCell</code>s call this method to specify that a certain other cell is to be merged with it.
+ *
+ * @param x The column position of the cell to be merged
+ * @param y The row position of the cell to be merged
+ * @param mergeType The merge type specifies the kind of merge to be applied (MERGE_HORIZ_PREV, MERGE_VERT_PREV, MERGE_BOTH_PREV)
+ * @param mergeCell The <code>RtfCell</code> that the cell at x and y is to be merged with
+ */
+ public void setMerge(int x, int y, int mergeType, RtfCell mergeCell) {
+ RtfRow row = (RtfRow) rowsList.get(y);
+ row.setMerge(x, mergeType, mergeCell);
+ }
+
+ /**
+ * This method allows access to the original Table that led to this RtfTable.
+ *
+ * @return The Table object that is the basis of this RtfTable.
+ */
+ protected Table getOriginalTable() {
+ return origTable;
+ }
+}
diff --git a/src/main/java/com/lowagie/text/rtf/RtfTableCell.java b/src/main/java/com/lowagie/text/rtf/RtfTableCell.java
new file mode 100644
index 0000000..1d9b220
--- /dev/null
+++ b/src/main/java/com/lowagie/text/rtf/RtfTableCell.java
@@ -0,0 +1,392 @@
+/*
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.rtf;
+
+import com.lowagie.text.Cell;
+import com.lowagie.text.Element;
+import com.lowagie.text.BadElementException;
+
+import java.util.Properties;
+
+/**
+ * A <code>Cell</code> with extended style attributes
+ *
+ * ONLY FOR USE WITH THE RtfWriter NOT with the RtfWriter2.
+ * @deprecated Please move to the RtfWriter2 and associated classes. com.lowagie.text.rtf.table.RtfCell replaces the functionality of this class.
+ */
+public class RtfTableCell extends Cell
+{
+ /* Table border styles */
+
+ /** Table border solid */
+ public static final int BORDER_UNDEFINED = 0;
+
+ /** Table border solid */
+ public static final int BORDER_SINGLE = 1;
+
+ /** Table border double thickness */
+ public static final int BORDER_DOUBLE_THICK = 2;
+
+ /** Table border shadowed */
+ public static final int BORDER_SHADOWED = 3;
+
+ /** Table border dotted */
+ public static final int BORDER_DOTTED = 4;
+
+ /** Table border dashed */
+ public static final int BORDER_DASHED = 5;
+
+ /** Table border hairline */
+ public static final int BORDER_HAIRLINE = 6;
+
+ /** Table border double line */
+ public static final int BORDER_DOUBLE = 7;
+
+ /** Table border dot dash line */
+ public static final int BORDER_DOT_DASH = 8;
+
+ /** Table border dot dot dash line */
+ public static final int BORDER_DOT_DOT_DASH = 9;
+
+ /** Table border triple line */
+ public static final int BORDER_TRIPLE = 10;
+
+ /** Table border line */
+ public static final int BORDER_THICK_THIN = 11;
+
+ /** Table border line */
+ public static final int BORDER_THIN_THICK = 12;
+
+ /** Table border line */
+ public static final int BORDER_THIN_THICK_THIN = 13;
+
+ /** Table border line */
+ public static final int BORDER_THICK_THIN_MED = 14;
+
+ /** Table border line */
+ public static final int BORDER_THIN_THICK_MED = 15;
+
+ /** Table border line */
+ public static final int BORDER_THIN_THICK_THIN_MED = 16;
+
+ /** Table border line */
+ public static final int BORDER_THICK_THIN_LARGE = 17;
+
+ /** Table border line */
+ public static final int BORDER_THIN_THICK_LARGE = 18;
+
+ /** Table border line */
+ public static final int BORDER_THIN_THICK_THIN_LARGE = 19;
+
+ /** Table border line */
+ public static final int BORDER_WAVY = 20;
+
+ /** Table border line */
+ public static final int BORDER_DOUBLE_WAVY = 21;
+
+ /** Table border line */
+ public static final int BORDER_STRIPED = 22;
+
+ /** Table border line */
+ public static final int BORDER_EMBOSS = 23;
+
+ /** Table border line */
+ public static final int BORDER_ENGRAVE = 24;
+
+ /* Instance variables */
+ private float topBorderWidth;
+ private float leftBorderWidth;
+ private float rightBorderWidth;
+ private float bottomBorderWidth;
+ private int topBorderStyle = 1;
+ private int leftBorderStyle = 1;
+ private int rightBorderStyle = 1;
+ private int bottomBorderStyle = 1;
+
+/**
+ * Constructs an empty <CODE>Cell</CODE> (for internal use only).
+ *
+ * @param dummy a dummy value
+ */
+
+ public RtfTableCell(boolean dummy) {
+ super(dummy);
+ }
+
+/**
+ * Constructs a <CODE>Cell</CODE> with a certain <CODE>Element</CODE>.
+ * <P>
+ * if the element is a <CODE>ListItem</CODE>, <CODE>Row</CODE> or
+ * <CODE>Cell</CODE>, an exception will be thrown.
+ *
+ * @param element the element
+ * @throws BadElementException when the creator was called with a <CODE>ListItem</CODE>, <CODE>Row</CODE> or <CODE>Cell</CODE>
+ */
+ public RtfTableCell(Element element) throws BadElementException {
+ super(element);
+ }
+
+/**
+ * Constructs a <CODE>Cell</CODE> with a certain content.
+ * <P>
+ * The <CODE>String</CODE> will be converted into a <CODE>Paragraph</CODE>.
+ *
+ * @param content a <CODE>String</CODE>
+ */
+ public RtfTableCell(String content) {
+ super(content);
+ }
+
+/**
+ * Returns a <CODE>Cell</CODE> that has been constructed taking in account
+ * the value of some <VAR>attributes</VAR>.
+ *
+ * @param attributes Some attributes
+ */
+
+ public RtfTableCell(Properties attributes) {
+ super(attributes);
+ }
+
+ /**
+ * Set all four borders to <code>f</code> width
+ *
+ * @param f the desired width
+ */
+ public void setBorderWidth(float f) {
+ super.setBorderWidth(f);
+ topBorderWidth = f;
+ leftBorderWidth = f;
+ rightBorderWidth = f;
+ bottomBorderWidth = f;
+ }
+
+ /**
+ * Set the top border to <code>f</code> width
+ *
+ * @param f the desired width
+ */
+ public void setTopBorderWidth(float f) {
+ topBorderWidth = f;
+ }
+
+ /**
+ * Get the top border width
+ * @return a width
+ */
+ public float topBorderWidth() {
+ return topBorderWidth;
+ }
+
+ /**
+ * Set the left border to <code>f</code> width
+ *
+ * @param f the desired width
+ */
+ public void setLeftBorderWidth(float f) {
+ leftBorderWidth = f;
+ }
+
+ /**
+ * Get the left border width
+ * @return a width
+ */
+ public float leftBorderWidth() {
+ return leftBorderWidth;
+ }
+
+ /**
+ * Set the right border to <code>f</code> width
+ *
+ * @param f the desired width
+ */
+ public void setRightBorderWidth(float f) {
+ rightBorderWidth = f;
+ }
+
+ /**
+ * Get the right border width
+ * @return a width
+ */
+ public float rightBorderWidth() {
+ return rightBorderWidth;
+ }
+
+ /**
+ * Set the bottom border to <code>f</code> width
+ *
+ * @param f the desired width
+ */
+ public void setBottomBorderWidth(float f) {
+ bottomBorderWidth = f;
+ }
+
+ /**
+ * Get the bottom border width
+ * @return a width
+ */
+ public float bottomBorderWidth() {
+ return bottomBorderWidth;
+ }
+
+ /**
+ * Set all four borders to style defined by <code>style</code>
+ *
+ * @param style the desired style
+ */
+ public void setBorderStyle(int style) {
+ topBorderStyle = style;
+ leftBorderStyle = style;
+ rightBorderStyle = style;
+ bottomBorderStyle = style;
+ }
+
+ /**
+ * Set the top border to style defined by <code>style</code>
+ *
+ * @param style the desired style
+ */
+ public void setTopBorderStyle(int style) {
+ topBorderStyle = style;
+ }
+
+ /**
+ * Get the top border style
+ * @return a style value
+ */
+ public int topBorderStyle() {
+ return topBorderStyle;
+ }
+
+ /**
+ * Set the left border to style defined by <code>style</code>
+ *
+ * @param style the desired style
+ */
+ public void setLeftBorderStyle(int style) {
+ leftBorderStyle = style;
+ }
+
+ /**
+ * Get the left border style
+ * @return a style value
+ */
+ public int leftBorderStyle() {
+ return leftBorderStyle;
+ }
+
+ /**
+ * Set the right border to style defined by <code>style</code>
+ *
+ * @param style the desired style
+ */
+ public void setRightBorderStyle(int style) {
+ rightBorderStyle = style;
+ }
+
+ /**
+ * Get the right border style
+ * @return a style value
+ */
+ public int rightBorderStyle() {
+ return rightBorderStyle;
+ }
+
+ /**
+ * Set the bottom border to style defined by <code>style</code>
+ *
+ * @param style the desired style
+ */
+ public void setBottomBorderStyle(int style) {
+ bottomBorderStyle = style;
+ }
+
+ /**
+ * Get the bottom border style
+ * @return a style value
+ */
+ public int bottomBorderStyle() {
+ return bottomBorderStyle;
+ }
+
+ /**
+ * Get the RTF control word for <code>style</code>
+ * @param style a style value
+ * @return a byte array corresponding with a style control word
+ */
+ protected static byte[] getStyleControlWord(int style) {
+ switch(style)
+ {
+ case BORDER_UNDEFINED : return "brdrs".getBytes();
+ case BORDER_SINGLE : return "brdrs".getBytes();
+ case BORDER_DOUBLE_THICK : return "brdrth".getBytes();
+ case BORDER_SHADOWED : return "brdrsh".getBytes();
+ case BORDER_DOTTED : return "brdrdot".getBytes();
+ case BORDER_DASHED : return "brdrdash".getBytes();
+ case BORDER_HAIRLINE : return "brdrhair".getBytes();
+ case BORDER_DOUBLE : return "brdrdb".getBytes();
+ case BORDER_DOT_DASH : return "brdrdashd".getBytes();
+ case BORDER_DOT_DOT_DASH : return "brdrdashdd".getBytes();
+ case BORDER_TRIPLE : return "brdrtriple".getBytes();
+ case BORDER_THICK_THIN : return "brdrtnthsg".getBytes();
+ case BORDER_THIN_THICK : return "brdrthtnsg".getBytes();
+ case BORDER_THIN_THICK_THIN : return "brdrtnthtnsg".getBytes();
+ case BORDER_THICK_THIN_MED : return "brdrtnthmg".getBytes();
+ case BORDER_THIN_THICK_MED : return "brdrthtnmg".getBytes();
+ case BORDER_THIN_THICK_THIN_MED : return "brdrtnthtnmg".getBytes();
+ case BORDER_THICK_THIN_LARGE : return "brdrtnthlg".getBytes();
+ case BORDER_THIN_THICK_LARGE : return "brdrthtnlg".getBytes();
+ case BORDER_THIN_THICK_THIN_LARGE : return "brdrtnthtnlg".getBytes();
+ case BORDER_WAVY : return "brdrwavy".getBytes();
+ case BORDER_DOUBLE_WAVY : return "brdrwavydb".getBytes();
+ case BORDER_STRIPED : return "brdrdashdotstr".getBytes();
+ case BORDER_EMBOSS : return "brdremboss".getBytes();
+ case BORDER_ENGRAVE : return "brdrengrave".getBytes();
+ }
+
+ return "brdrs".getBytes();
+ }
+}
diff --git a/src/main/java/com/lowagie/text/rtf/RtfWriter.java b/src/main/java/com/lowagie/text/rtf/RtfWriter.java
new file mode 100644
index 0000000..43b47da
--- /dev/null
+++ b/src/main/java/com/lowagie/text/rtf/RtfWriter.java
@@ -0,0 +1,2299 @@
+/*
+ * $Id: RtfWriter.java,v 1.70 2006/02/09 17:25:25 hallm Exp $
+ * $Name: $
+ *
+ * Copyright 2001, 2002 by Mark Hall
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the ?GNU LIBRARY GENERAL PUBLIC LICENSE?), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.rtf;
+
+import com.lowagie.text.*;
+
+import java.io.*;
+import java.util.ArrayList;
+import java.util.ListIterator;
+import java.util.Iterator;
+import java.util.Calendar;
+import java.util.Date;
+import java.awt.Color;
+import java.text.SimpleDateFormat;
+import java.text.ParsePosition;
+import com.lowagie.text.pdf.codec.wmf.MetaDo;
+
+/**
+ * If you are creating a new project using the rtf part of iText, please
+ * consider using the new RtfWriter2. The RtfWriter is in bug-fix-only mode,
+ * will be deprecated end of 2005 and removed end of 2007.
+ *
+ * A <CODE>DocWriter</CODE> class for Rich Text Files (RTF).
+ * <P>
+ * A <CODE>RtfWriter</CODE> can be added as a <CODE>DocListener</CODE>
+ * to a certain <CODE>Document</CODE> by getting an instance.
+ * Every <CODE>Element</CODE> added to the original <CODE>Document</CODE>
+ * will be written to the <CODE>OutputStream</CODE> of this <CODE>RtfWriter</CODE>.
+ * <P>
+ * Example:
+ * <BLOCKQUOTE><PRE>
+ * // creation of the document with a certain size and certain margins
+ * Document document = new Document(PageSize.A4, 50, 50, 50, 50);
+ * try {
+ * // this will write RTF to the Standard OutputStream
+ * <STRONG>RtfWriter.getInstance(document, System.out);</STRONG>
+ * // this will write Rtf to a file called text.rtf
+ * <STRONG>RtfWriter.getInstance(document, new FileOutputStream("text.rtf"));</STRONG>
+ * // this will write Rtf to for instance the OutputStream of a HttpServletResponse-object
+ * <STRONG>RtfWriter.getInstance(document, response.getOutputStream());</STRONG>
+ * }
+ * catch(DocumentException de) {
+ * System.err.println(de.getMessage());
+ * }
+ * // this will close the document and all the OutputStreams listening to it
+ * <STRONG>document.close();</CODE>
+ * </PRE></BLOCKQUOTE>
+ * <P>
+ * <STRONG>LIMITATIONS</STRONG><BR>
+ * There are currently still a few limitations on what the RTF Writer can do:
+ * <ul>
+ * <li>Watermarks</li>
+ * <li>Viewer preferences</li>
+ * <li>Encryption</li>
+ * <li>Embedded fonts</li>
+ * <li>Phrases with a leading</li>
+ * <li>Lists with non-bullet symbols</li>
+ * <li>Nested tables</li>
+ * <li>Images other than JPEG and PNG</li>
+ * <li>Rotated images</li>
+ * </ul>
+ * <br />
+ *
+ * @author <a href="mailto:mhall@myrealbox.com">Mark.Hall@myrealbox.com</a>
+ * @author Steffen Stundzig
+ * @author <a href="ericmattes@yahoo.com">Eric Mattes</a>
+ * @author <a href="raul.wegmann@uam.es">Raul Wegmann</a>
+ * @deprecated The RtfWriter is deprecated and will be removed from the iText library end of 2007
+ */
+public class RtfWriter extends DocWriter implements DocListener {
+ /**
+ * Static Constants
+ */
+
+ /**
+ * General
+ */
+
+ /** This is the escape character which introduces RTF tags. */
+ public static final byte escape = (byte) '\\';
+
+ /** This is another escape character which introduces RTF tags. */
+ private static final byte[] extendedEscape = "\\*\\".getBytes();
+
+ /** This is the delimiter between RTF tags and normal text. */
+ protected static final byte delimiter = (byte) ' ';
+
+ /** This is another delimiter between RTF tags and normal text. */
+ private static final byte commaDelimiter = (byte) ';';
+
+ /** This is the character for beginning a new group. */
+ public static final byte openGroup = (byte) '{';
+
+ /** This is the character for closing a group. */
+ public static final byte closeGroup = (byte) '}';
+
+ /**
+ * RTF Information
+ */
+
+ /** RTF begin and version. */
+ private static final byte[] docBegin = "rtf1".getBytes();
+
+ /** RTF encoding. */
+ private static final byte[] ansi = "ansi".getBytes();
+
+ /** RTF encoding codepage. */
+ private static final byte[] ansiCodepage = "ansicpg".getBytes();
+
+ /**
+ *Font Data
+ */
+
+ /** Begin the font table tag. */
+ private static final byte[] fontTable = "fonttbl".getBytes();
+
+ /** Font number tag. */
+ protected static final byte fontNumber = (byte) 'f';
+
+ /** Font size tag. */
+ protected static final byte[] fontSize = "fs".getBytes();
+
+ /** Font color tag. */
+ protected static final byte[] fontColor = "cf".getBytes();
+
+ /** Modern font tag. */
+ private static final byte[] fontModern = "fmodern".getBytes();
+
+ /** Swiss font tag. */
+ private static final byte[] fontSwiss = "fswiss".getBytes();
+
+ /** Roman font tag. */
+ private static final byte[] fontRoman = "froman".getBytes();
+
+ /** Tech font tag. */
+ private static final byte[] fontTech = "ftech".getBytes();
+
+ /** Font charset tag. */
+ private static final byte[] fontCharset = "fcharset".getBytes();
+
+ /** Font Courier tag. */
+ private static final byte[] fontCourier = "Courier".getBytes();
+
+ /** Font Arial tag. */
+ private static final byte[] fontArial = "Arial".getBytes();
+
+ /** Font Symbol tag. */
+ private static final byte[] fontSymbol = "Symbol".getBytes();
+
+ /** Font Times New Roman tag. */
+ private static final byte[] fontTimesNewRoman = "Times New Roman".getBytes();
+
+ /** Font Windings tag. */
+ private static final byte[] fontWindings = "Windings".getBytes();
+
+ /** Default Font. */
+ private static final byte[] defaultFont = "deff".getBytes();
+
+ /** First indent tag. */
+ private static final byte[] firstIndent = "fi".getBytes();
+
+ /** Left indent tag. */
+ private static final byte[] listIndent = "li".getBytes();
+
+ /** Right indent tag. */
+ private static final byte[] rightIndent = "ri".getBytes();
+
+ /**
+ * Sections / Paragraphs
+ */
+
+ /** Reset section defaults tag. */
+ private static final byte[] sectionDefaults = "sectd".getBytes();
+
+ /** Begin new section tag. */
+ private static final byte[] section = "sect".getBytes();
+
+ /** Reset paragraph defaults tag. */
+ public static final byte[] paragraphDefaults = "pard".getBytes();
+
+ /** Begin new paragraph tag. */
+ public static final byte[] paragraph = "par".getBytes();
+
+ /** Page width of a section. */
+ public static final byte[] sectionPageWidth = "pgwsxn".getBytes();
+
+ /** Page height of a section. */
+ public static final byte[] sectionPageHeight = "pghsxn".getBytes();
+
+ /**
+ * Lists
+ */
+
+ /** Begin the List Table */
+ private static final byte[] listtableGroup = "listtable".getBytes();
+
+ /** Begin the List Override Table */
+ private static final byte[] listoverridetableGroup = "listoverridetable".getBytes();
+
+ /** Begin a List definition */
+ private static final byte[] listDefinition = "list".getBytes();
+
+ /** List Template ID */
+ private static final byte[] listTemplateID = "listtemplateid".getBytes();
+
+ /** RTF Writer outputs hybrid lists */
+ private static final byte[] hybridList = "hybrid".getBytes();
+
+ /** Current List level */
+ private static final byte[] listLevelDefinition = "listlevel".getBytes();
+
+ /** Level numbering (old) */
+ private static final byte[] listLevelTypeOld = "levelnfc".getBytes();
+
+ /** Level numbering (new) */
+ private static final byte[] listLevelTypeNew = "levelnfcn".getBytes();
+
+ /** Level alignment (old) */
+ private static final byte[] listLevelAlignOld = "leveljc".getBytes();
+
+ /** Level alignment (new) */
+ private static final byte[] listLevelAlignNew = "leveljcn".getBytes();
+
+ /** Level starting number */
+ private static final byte[] listLevelStartAt = "levelstartat".getBytes();
+
+ /** Level text group */
+ private static final byte[] listLevelTextDefinition = "leveltext".getBytes();
+
+ /** Filler for Level Text Length */
+ private static final byte[] listLevelTextLength = "\'0".getBytes();
+
+ /** Level Text Numbering Style */
+ private static final byte[] listLevelTextStyleNumbers = "\'00.".getBytes();
+
+ /** Level Text Bullet Style */
+ private static final byte[] listLevelTextStyleBullet = "u-3913 ?".getBytes();
+
+ /** Level Numbers Definition */
+ private static final byte[] listLevelNumbersDefinition = "levelnumbers".getBytes();
+
+ /** Filler for Level Numbers */
+ private static final byte[] listLevelNumbers = "\\'0".getBytes();
+
+ /** Tab Stop */
+ private static final byte[] tabStop = "tx".getBytes();
+
+ /** Actual list begin */
+ private static final byte[] listBegin = "ls".getBytes();
+
+ /** Current list level */
+ private static final byte[] listCurrentLevel = "ilvl".getBytes();
+
+ /** List text group for older browsers */
+ private static final byte[] listTextOld = "listtext".getBytes();
+
+ /** Tab */
+ private static final byte[] tab = "tab".getBytes();
+
+ /** Old Bullet Style */
+ private static final byte[] listBulletOld = "\'b7".getBytes();
+
+ /** Current List ID */
+ private static final byte[] listID = "listid".getBytes();
+
+ /** List override */
+ private static final byte[] listOverride = "listoverride".getBytes();
+
+ /** Number of overrides */
+ private static final byte[] listOverrideCount = "listoverridecount".getBytes();
+
+ /**
+ * Text Style
+ */
+
+ /** Bold tag. */
+ protected static final byte bold = (byte) 'b';
+
+ /** Italic tag. */
+ protected static final byte italic = (byte) 'i';
+
+ /** Underline tag. */
+ protected static final byte[] underline = "ul".getBytes();
+
+ /** Strikethrough tag. */
+ protected static final byte[] strikethrough = "strike".getBytes();
+
+ /** Text alignment left tag. */
+ public static final byte[] alignLeft = "ql".getBytes();
+
+ /** Text alignment center tag. */
+ public static final byte[] alignCenter = "qc".getBytes();
+
+ /** Text alignment right tag. */
+ public static final byte[] alignRight = "qr".getBytes();
+
+ /** Text alignment justify tag. */
+ public static final byte[] alignJustify = "qj".getBytes();
+
+ /**
+ * Colors
+ */
+
+ /** Begin colour table tag. */
+ private static final byte[] colorTable = "colortbl".getBytes();
+
+ /** Red value tag. */
+ private static final byte[] colorRed = "red".getBytes();
+
+ /** Green value tag. */
+ private static final byte[] colorGreen = "green".getBytes();
+
+ /** Blue value tag. */
+ private static final byte[] colorBlue = "blue".getBytes();
+
+ /**
+ * Information Group
+ */
+
+ /** Begin the info group tag.*/
+ private static final byte[] infoBegin = "info".getBytes();
+
+ /** Author tag. */
+ private static final byte[] metaAuthor = "author".getBytes();
+
+ /** Subject tag. */
+ private static final byte[] metaSubject = "subject".getBytes();
+
+ /** Keywords tag. */
+ private static final byte[] metaKeywords = "keywords".getBytes();
+
+ /** Title tag. */
+ private static final byte[] metaTitle = "title".getBytes();
+
+ /** Producer tag. */
+ private static final byte[] metaProducer = "operator".getBytes();
+
+ /** Creation Date tag. */
+ private static final byte[] metaCreationDate = "creationdate".getBytes();
+
+ /** Year tag. */
+ private static final byte[] year = "yr".getBytes();
+
+ /** Month tag. */
+ private static final byte[] month = "mo".getBytes();
+
+ /** Day tag. */
+ private static final byte[] day = "dy".getBytes();
+
+ /** Hour tag. */
+ private static final byte[] hour = "hr".getBytes();
+
+ /** Minute tag. */
+ private static final byte[] minute = "min".getBytes();
+
+ /** Second tag. */
+ private static final byte[] second = "sec".getBytes();
+
+ /** Start superscript. */
+ private static final byte[] startSuper = "super".getBytes();
+
+ /** Start subscript. */
+ private static final byte[] startSub = "sub".getBytes();
+
+ /** End super/sub script. */
+ private static final byte[] endSuperSub = "nosupersub".getBytes();
+
+ /**
+ * Header / Footer
+ */
+
+ /** Title Page tag */
+ private static final byte[] titlePage = "titlepg".getBytes();
+
+ /** Facing pages tag */
+ private static final byte[] facingPages = "facingp".getBytes();
+
+ /** Begin header group tag. */
+ private static final byte[] headerBegin = "header".getBytes();
+
+ /** Begin footer group tag. */
+ private static final byte[] footerBegin = "footer".getBytes();
+
+ // header footer 'left', 'right', 'first'
+ private static final byte[] headerlBegin = "headerl".getBytes();
+
+ private static final byte[] footerlBegin = "footerl".getBytes();
+
+ private static final byte[] headerrBegin = "headerr".getBytes();
+
+ private static final byte[] footerrBegin = "footerr".getBytes();
+
+ private static final byte[] headerfBegin = "headerf".getBytes();
+
+ private static final byte[] footerfBegin = "footerf".getBytes();
+
+ /**
+ * Paper Properties
+ */
+
+ /** Paper width tag. */
+ private static final byte[] rtfPaperWidth = "paperw".getBytes();
+
+ /** Paper height tag. */
+ private static final byte[] rtfPaperHeight = "paperh".getBytes();
+
+ /** Margin left tag. */
+ private static final byte[] rtfMarginLeft = "margl".getBytes();
+
+ /** Margin right tag. */
+ private static final byte[] rtfMarginRight = "margr".getBytes();
+
+ /** Margin top tag. */
+ private static final byte[] rtfMarginTop = "margt".getBytes();
+
+ /** Margin bottom tag. */
+ private static final byte[] rtfMarginBottom = "margb".getBytes();
+
+ /** New Page tag. */
+ private static final byte[] newPage = "page".getBytes();
+
+ /** Document Landscape tag 1. */
+ private static final byte[] landscapeTag1 = "landscape".getBytes();
+
+ /** Document Landscape tag 2. */
+ private static final byte[] landscapeTag2 = "lndscpsxn".getBytes();
+
+ /**
+ * Annotations
+ */
+
+ /** Annotation ID tag. */
+ private static final byte[] annotationID = "atnid".getBytes();
+
+ /** Annotation Author tag. */
+ private static final byte[] annotationAuthor = "atnauthor".getBytes();
+
+ /** Annotation text tag. */
+ private static final byte[] annotation = "annotation".getBytes();
+
+ /**
+ * Images
+ */
+
+ /** Begin the main Picture group tag */
+ private static final byte[] pictureGroup = "shppict".getBytes();
+
+ /** Begin the picture tag */
+ private static final byte[] picture = "pict".getBytes();
+
+ /** PNG Image */
+ private static final byte[] picturePNG = "pngblip".getBytes();
+
+ /** JPEG Image */
+ private static final byte[] pictureJPEG = "jpegblip".getBytes();
+
+ /** BMP Image */
+ private static final byte[] pictureBMP = "dibitmap0".getBytes();
+
+ /** WMF Image */
+ private static final byte[] pictureWMF = "wmetafile8".getBytes();
+
+ /** Picture width */
+ private static final byte[] pictureWidth = "picw".getBytes();
+
+ /** Picture height */
+ private static final byte[] pictureHeight = "pich".getBytes();
+
+ /** Picture scale horizontal percent */
+ private static final byte[] pictureScaleX = "picscalex".getBytes();
+
+ /** Picture scale vertical percent */
+ private static final byte[] pictureScaleY = "picscaley".getBytes();
+
+ /**
+ * Fields (for page numbering)
+ */
+
+ /** Begin field tag */
+ protected static final byte[] field = "field".getBytes();
+
+ /** Content fo the field */
+ protected static final byte[] fieldContent = "fldinst".getBytes();
+
+ /** PAGE numbers */
+ protected static final byte[] fieldPage = "PAGE".getBytes();
+
+ /** HYPERLINK field */
+ protected static final byte[] fieldHyperlink = "HYPERLINK".getBytes();
+
+ /** Last page number (not used) */
+ protected static final byte[] fieldDisplay = "fldrslt".getBytes();
+
+
+ /** Class variables */
+
+ /**
+ * Because of the way RTF works and the way itext works, the text has to be
+ * stored and is only written to the actual OutputStream at the end.
+ */
+
+ /** This <code>ArrayList</code> contains all fonts used in the document. */
+ private ArrayList fontList = new ArrayList();
+
+ /** This <code>ArrayList</code> contains all colours used in the document. */
+ private ArrayList colorList = new ArrayList();
+
+ /** This <code>ByteArrayOutputStream</code> contains the main body of the document. */
+ private ByteArrayOutputStream content = null;
+
+ /** This <code>ByteArrayOutputStream</code> contains the information group. */
+ private ByteArrayOutputStream info = null;
+
+ /** This <code>ByteArrayOutputStream</code> contains the list table. */
+ private ByteArrayOutputStream listtable = null;
+
+ /** This <code>ByteArrayOutputStream</code> contains the list override table. */
+ private ByteArrayOutputStream listoverride = null;
+
+ /** Document header. */
+ private HeaderFooter header = null;
+
+ /** Document footer. */
+ private HeaderFooter footer = null;
+
+ /** Left margin. */
+ private int marginLeft = 1800;
+
+ /** Right margin. */
+ private int marginRight = 1800;
+
+ /** Top margin. */
+ private int marginTop = 1440;
+
+ /** Bottom margin. */
+ private int marginBottom = 1440;
+
+ /** Page width. */
+ private int pageWidth = 11906;
+
+ /** Page height. */
+ private int pageHeight = 16838;
+
+ /** Factor to use when converting. */
+ public final static double TWIPSFACTOR = 20;//20.57140;
+
+ /** Current list ID. */
+ private int currentListID = 1;
+
+ /** List of current Lists. */
+ private ArrayList listIds = null;
+
+ /** Current List Level. */
+ private int listLevel = 0;
+
+ /** Current maximum List Level. */
+ private int maxListLevel = 0;
+
+ /** Write a TOC */
+ private boolean writeTOC = false;
+
+ /** Special title page */
+ private boolean hasTitlePage = false;
+
+ /** Currently writing either Header or Footer */
+ private boolean inHeaderFooter = false;
+
+ /** Currently writing a Table */
+ private boolean inTable = false;
+
+ /** Landscape or Portrait Document */
+ private boolean landscape = false;
+
+ /** Protected Constructor */
+
+ /**
+ * Constructs a <CODE>RtfWriter</CODE>.
+ *
+ * @param doc The <CODE>Document</CODE> that is to be written as RTF
+ * @param os The <CODE>OutputStream</CODE> the writer has to write to.
+ */
+
+ protected RtfWriter(Document doc, OutputStream os) {
+ super(doc, os);
+ document.addDocListener(this);
+ initDefaults();
+ }
+
+ /** Public functions special to the RtfWriter */
+
+ /**
+ * This method controls whether TOC entries are automatically generated
+ *
+ * @param writeTOC boolean value indicating whether a TOC is to be generated
+ */
+ public void setGenerateTOCEntries(boolean writeTOC) {
+ this.writeTOC = writeTOC;
+ }
+
+ /**
+ * Gets the current setting of writeTOC
+ *
+ * @return boolean value indicating whether a TOC is being generated
+ */
+ public boolean getGeneratingTOCEntries() {
+ return writeTOC;
+ }
+
+ /**
+ * This method controls whether the first page is a title page
+ *
+ * @param hasTitlePage boolean value indicating whether the first page is a title page
+ */
+ public void setHasTitlePage(boolean hasTitlePage) {
+ this.hasTitlePage = hasTitlePage;
+ }
+
+ /**
+ * Gets the current setting of hasTitlePage
+ *
+ * @return boolean value indicating whether the first page is a title page
+ */
+ public boolean getHasTitlePage() {
+ return hasTitlePage;
+ }
+
+ /**
+ * Explicitly sets the page format to use.
+ * Otherwise the RtfWriter will try to guess the format by comparing pagewidth and pageheight
+ *
+ * @param landscape boolean value indicating whether we are using landscape format or not
+ */
+ public void setLandscape(boolean landscape) {
+ this.landscape = landscape;
+ }
+
+ /**
+ * Returns the current landscape setting
+ *
+ * @return boolean value indicating the current page format
+ */
+ public boolean getLandscape() {
+ return landscape;
+ }
+
+ /** Public functions from the DocWriter Interface */
+
+ /**
+ * Gets an instance of the <CODE>RtfWriter</CODE>.
+ *
+ * @param document The <CODE>Document</CODE> that has to be written
+ * @param os The <CODE>OutputStream</CODE> the writer has to write to.
+ * @return a new <CODE>RtfWriter</CODE>
+ */
+ public static RtfWriter getInstance(Document document, OutputStream os) {
+ return (new RtfWriter(document, os));
+ }
+
+ /**
+ * Signals that the <CODE>Document</CODE> has been opened and that
+ * <CODE>Elements</CODE> can be added.
+ */
+ public void open() {
+ super.open();
+ }
+
+ /**
+ * Signals that the <CODE>Document</CODE> was closed and that no other
+ * <CODE>Elements</CODE> will be added.
+ * <p>
+ * The content of the font table, color table, information group, content, header, footer are merged into the final
+ * <code>OutputStream</code>
+ */
+ public void close() {
+ writeDocument();
+ super.close();
+ }
+
+ /**
+ * Adds the footer to the bottom of the <CODE>Document</CODE>.
+ * @param footer
+ */
+ public void setFooter(HeaderFooter footer) {
+ this.footer = footer;
+ processHeaderFooter(this.footer);
+ }
+
+ /**
+ * Adds the header to the top of the <CODE>Document</CODE>.
+ * @param header
+ */
+ public void setHeader(HeaderFooter header) {
+ this.header = header;
+ processHeaderFooter(this.header);
+ }
+
+ /**
+ * Resets the footer.
+ */
+ public void resetFooter() {
+ setFooter(null);
+ }
+
+ /**
+ * Resets the header.
+ */
+ public void resetHeader() {
+ setHeader(null);
+ }
+
+ /**
+ * Tells the <code>RtfWriter</code> that a new page is to be begun.
+ *
+ * @return <code>true</code> if a new Page was begun.
+ * @throws DocumentException if the Document was not open or had been closed.
+ */
+ public boolean newPage() throws DocumentException {
+ try {
+ content.write(escape);
+ content.write(newPage);
+ content.write(escape);
+ content.write(paragraph);
+ } catch (IOException e) {
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Sets the page margins
+ *
+ * @param marginLeft The left margin
+ * @param marginRight The right margin
+ * @param marginTop The top margin
+ * @param marginBottom The bottom margin
+ *
+ * @return <code>true</code> if the page margins were set.
+ */
+ public boolean setMargins(float marginLeft, float marginRight, float marginTop, float marginBottom) {
+ this.marginLeft = (int) (marginLeft * TWIPSFACTOR);
+ this.marginRight = (int) (marginRight * TWIPSFACTOR);
+ this.marginTop = (int) (marginTop * TWIPSFACTOR);
+ this.marginBottom = (int) (marginBottom * TWIPSFACTOR);
+ return true;
+ }
+
+ /**
+ * Sets the page size
+ *
+ * @param pageSize A <code>Rectangle</code> specifying the page size
+ *
+ * @return <code>true</code> if the page size was set
+ */
+ public boolean setPageSize(Rectangle pageSize) {
+ if (!parseFormat(pageSize, false)) {
+ pageWidth = (int) (pageSize.width() * TWIPSFACTOR);
+ pageHeight = (int) (pageSize.height() * TWIPSFACTOR);
+ landscape = pageWidth > pageHeight;
+ }
+ return true;
+ }
+
+ /**
+ * Write the table of contents.
+ *
+ * @param tocTitle The title that will be displayed above the TOC
+ * @param titleFont The <code>Font</code> that will be used for the tocTitle
+ * @param showTOCasEntry Set this to true if you want the TOC to appear as an entry in the TOC
+ * @param showTOCEntryFont Use this <code>Font</code> to specify what Font to use when showTOCasEntry is true
+ *
+ * @return <code>true</code> if the TOC was added.
+ */
+ public boolean writeTOC(String tocTitle, Font titleFont, boolean showTOCasEntry, Font showTOCEntryFont) {
+ try {
+ RtfTOC toc = new RtfTOC(tocTitle, titleFont);
+ if (showTOCasEntry) {
+ toc.addTOCAsTOCEntry(tocTitle, showTOCEntryFont);
+ }
+ add(new Paragraph(toc));
+ } catch (DocumentException de) {
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Signals that an <CODE>Element</CODE> was added to the <CODE>Document</CODE>.
+ *
+ * @param element A high level object to add
+ * @return <CODE>true</CODE> if the element was added, <CODE>false</CODE> if not.
+ * @throws DocumentException if a document isn't open yet, or has been closed
+ */
+ public boolean add(Element element) throws DocumentException {
+ if (pause) {
+ return false;
+ }
+ return addElement(element, content);
+ }
+
+
+ /** Private functions */
+
+ /**
+ * Adds an <CODE>Element</CODE> to the <CODE>Document</CODE>.
+ * @param element the high level element to add
+ * @param out the outputstream to which the RTF data is sent
+ * @return <CODE>true</CODE> if the element was added, <CODE>false</CODE> if not.
+ * @throws DocumentException if a document isn't open yet, or has been closed
+ */
+ protected boolean addElement(Element element, ByteArrayOutputStream out) throws DocumentException {
+ try {
+ switch (element.type()) {
+ case Element.CHUNK:
+ writeChunk((Chunk) element, out);
+ break;
+ case Element.PARAGRAPH:
+ writeParagraph((Paragraph) element, out);
+ break;
+ case Element.ANCHOR:
+ writeAnchor((Anchor) element, out);
+ break;
+ case Element.PHRASE:
+ writePhrase((Phrase) element, out);
+ break;
+ case Element.CHAPTER:
+ case Element.SECTION:
+ writeSection((Section) element, out);
+ break;
+ case Element.LIST:
+ writeList((com.lowagie.text.List) element, out);
+ break;
+ case Element.TABLE:
+ try {
+ writeTable((Table) element, out);
+ }
+ catch(ClassCastException cce) {
+ writeTable(((SimpleTable)element).createTable(), out);
+ }
+ break;
+ case Element.ANNOTATION:
+ writeAnnotation((Annotation) element, out);
+ break;
+ case Element.IMGRAW:
+ case Element.IMGTEMPLATE:
+ case Element.JPEG:
+ Image img = (Image)element;
+ writeImage(img, out);
+ break;
+
+ case Element.AUTHOR:
+ writeMeta(metaAuthor, (Meta) element);
+ break;
+ case Element.SUBJECT:
+ writeMeta(metaSubject, (Meta) element);
+ break;
+ case Element.KEYWORDS:
+ writeMeta(metaKeywords, (Meta) element);
+ break;
+ case Element.TITLE:
+ writeMeta(metaTitle, (Meta) element);
+ break;
+ case Element.PRODUCER:
+ writeMeta(metaProducer, (Meta) element);
+ break;
+ case Element.CREATIONDATE:
+ writeMeta(metaCreationDate, (Meta) element);
+ break;
+ }
+ } catch (IOException e) {
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Write the beginning of a new <code>Section</code>
+ *
+ * @param sectionElement The <code>Section</code> be written
+ * @param out The <code>ByteArrayOutputStream</code> to write to
+ *
+ * @throws IOException
+ * @throws DocumentException
+ */
+ private void writeSection(Section sectionElement, ByteArrayOutputStream out) throws IOException, DocumentException {
+ if (sectionElement.type() == Element.CHAPTER) {
+ out.write(escape);
+ out.write(sectionDefaults);
+ writeSectionDefaults(out);
+ }
+ if (sectionElement.title() != null) {
+ if (writeTOC) {
+ StringBuffer title = new StringBuffer("");
+ for (ListIterator li = sectionElement.title().getChunks().listIterator(); li.hasNext();) {
+ title.append(((Chunk) li.next()).content());
+ }
+ add(new RtfTOCEntry(title.toString(), sectionElement.title().font()));
+ } else {
+ add(sectionElement.title());
+ }
+ out.write(escape);
+ out.write(paragraph);
+ }
+ sectionElement.process(this);
+ if (sectionElement.type() == Element.CHAPTER) {
+ out.write(escape);
+ out.write(section);
+ }
+ if (sectionElement.type() == Element.SECTION) {
+ out.write(escape);
+ out.write(paragraph);
+ }
+ }
+
+ /**
+ * Write the beginning of a new <code>Paragraph</code>
+ *
+ * @param paragraphElement The <code>Paragraph</code> to be written
+ * @param out The <code>ByteArrayOutputStream</code> to write to
+ *
+ * @throws IOException
+ */
+ private void writeParagraph(Paragraph paragraphElement, ByteArrayOutputStream out) throws IOException {
+ out.write(escape);
+ out.write(paragraphDefaults);
+ if (inTable) {
+ out.write(escape);
+ out.write(RtfCell.cellInTable);
+ }
+ switch (paragraphElement.alignment()) {
+ case Element.ALIGN_LEFT:
+ out.write(escape);
+ out.write(alignLeft);
+ break;
+ case Element.ALIGN_RIGHT:
+ out.write(escape);
+ out.write(alignRight);
+ break;
+ case Element.ALIGN_CENTER:
+ out.write(escape);
+ out.write(alignCenter);
+ break;
+ case Element.ALIGN_JUSTIFIED:
+ case Element.ALIGN_JUSTIFIED_ALL:
+ out.write(escape);
+ out.write(alignJustify);
+ break;
+ }
+ out.write(escape);
+ out.write(listIndent);
+ writeInt(out, (int) (paragraphElement.indentationLeft() * TWIPSFACTOR));
+ out.write(escape);
+ out.write(rightIndent);
+ writeInt(out, (int) (paragraphElement.indentationRight() * TWIPSFACTOR));
+ Iterator chunks = paragraphElement.getChunks().iterator();
+ while (chunks.hasNext()) {
+ Chunk ch = (Chunk) chunks.next();
+ ch.setFont(paragraphElement.font().difference(ch.font()));
+ }
+ ByteArrayOutputStream save = content;
+ content = out;
+ paragraphElement.process(this);
+ content = save;
+ if (!inTable) {
+ out.write(escape);
+ out.write(paragraph);
+ }
+ }
+
+ /**
+ * Write a <code>Phrase</code>.
+ *
+ * @param phrase The <code>Phrase</code> item to be written
+ * @param out The <code>ByteArrayOutputStream</code> to write to
+ *
+ * @throws IOException
+ */
+ private void writePhrase(Phrase phrase, ByteArrayOutputStream out) throws IOException {
+ out.write(escape);
+ out.write(paragraphDefaults);
+ if (inTable) {
+ out.write(escape);
+ out.write(RtfCell.cellInTable);
+ }
+ Iterator chunks = phrase.getChunks().iterator();
+ while (chunks.hasNext()) {
+ Chunk ch = (Chunk) chunks.next();
+ ch.setFont(phrase.font().difference(ch.font()));
+ }
+ ByteArrayOutputStream save = content;
+ content = out;
+ phrase.process(this);
+ content = save;
+ }
+
+ /**
+ * Write an <code>Anchor</code>. Anchors are treated like Phrases.
+ *
+ * @param anchor The <code>Chunk</code> item to be written
+ * @param out The <code>ByteArrayOutputStream</code> to write to
+ *
+ * @throws IOException
+ */
+ private void writeAnchor(Anchor anchor, ByteArrayOutputStream out) throws IOException {
+ if (anchor.url() != null) {
+ out.write(openGroup);
+ out.write(escape);
+ out.write(field);
+ out.write(openGroup);
+ out.write(extendedEscape);
+ out.write(fieldContent);
+ out.write(openGroup);
+ out.write(fieldHyperlink);
+ out.write(delimiter);
+ out.write(anchor.url().toString().getBytes());
+ out.write(closeGroup);
+ out.write(closeGroup);
+ out.write(openGroup);
+ out.write(escape);
+ out.write(fieldDisplay);
+ out.write(delimiter);
+ writePhrase(anchor, out);
+ out.write(closeGroup);
+ out.write(closeGroup);
+ } else {
+ writePhrase(anchor, out);
+ }
+ }
+
+ /**
+ * Write a <code>Chunk</code> and all its font properties.
+ *
+ * @param chunk The <code>Chunk</code> item to be written
+ * @param out The <code>ByteArrayOutputStream</code> to write to
+ *
+ * @throws IOException
+ * @throws DocumentException
+ */
+ private void writeChunk(Chunk chunk, ByteArrayOutputStream out) throws IOException, DocumentException {
+ if (chunk instanceof RtfField) {
+ ((RtfField) chunk).write(this, out);
+ } else {
+ if (chunk.getImage() != null) {
+ writeImage(chunk.getImage(), out);
+ } else {
+ writeInitialFontSignature(out, chunk);
+ out.write(filterSpecialChar(chunk.content(), false).getBytes());
+ writeFinishingFontSignature(out, chunk);
+ }
+ }
+ }
+
+
+ protected void writeInitialFontSignature(OutputStream out, Chunk chunk) throws IOException {
+ Font font = chunk.font();
+
+ out.write(escape);
+ out.write(fontNumber);
+ if (!font.getFamilyname().equalsIgnoreCase("unknown")) {
+ writeInt(out, addFont(font));
+ } else {
+ writeInt(out, 0);
+ }
+ out.write(escape);
+ out.write(fontSize);
+ if (font.size() > 0) {
+ writeInt(out, (int) (font.size() * 2));
+ } else {
+ writeInt(out, 20);
+ }
+ out.write(escape);
+ out.write(fontColor);
+ writeInt(out, addColor(font.color()));
+ if (font.isBold()) {
+ out.write(escape);
+ out.write(bold);
+ }
+ if (font.isItalic()) {
+ out.write(escape);
+ out.write(italic);
+ }
+ if (font.isUnderlined()) {
+ out.write(escape);
+ out.write(underline);
+ }
+ if (font.isStrikethru()) {
+ out.write(escape);
+ out.write(strikethrough);
+ }
+
+ /*
+ * Superscript / Subscript added by Scott Dietrich (sdietrich@emlab.com)
+ */
+ if (chunk.getAttributes() != null) {
+ Float f = (Float) chunk.getAttributes().get(Chunk.SUBSUPSCRIPT);
+ if (f != null)
+ if (f.floatValue() > 0) {
+ out.write(escape);
+ out.write(startSuper);
+ } else if (f.floatValue() < 0) {
+ out.write(escape);
+ out.write(startSub);
+ }
+ }
+
+ out.write(delimiter);
+ }
+
+
+ protected void writeFinishingFontSignature(OutputStream out, Chunk chunk) throws IOException {
+ Font font = chunk.font();
+
+ if (font.isBold()) {
+ out.write(escape);
+ out.write(bold);
+ writeInt(out, 0);
+ }
+ if (font.isItalic()) {
+ out.write(escape);
+ out.write(italic);
+ writeInt(out, 0);
+ }
+ if (font.isUnderlined()) {
+ out.write(escape);
+ out.write(underline);
+ writeInt(out, 0);
+ }
+ if (font.isStrikethru()) {
+ out.write(escape);
+ out.write(strikethrough);
+ writeInt(out, 0);
+ }
+
+ /*
+ * Superscript / Subscript added by Scott Dietrich (sdietrich@emlab.com)
+ */
+ if (chunk.getAttributes() != null) {
+ Float f = (Float) chunk.getAttributes().get(Chunk.SUBSUPSCRIPT);
+ if (f != null)
+ if (f.floatValue() != 0) {
+ out.write(escape);
+ out.write(endSuperSub);
+ }
+ }
+ }
+
+ /**
+ * Write a <code>ListItem</code>
+ *
+ * @param listItem The <code>ListItem</code> to be written
+ * @param out The <code>ByteArrayOutputStream</code> to write to
+ *
+ * @throws IOException
+ * @throws DocumentException
+ */
+ private void writeListElement(ListItem listItem, ByteArrayOutputStream out) throws IOException, DocumentException {
+ Iterator chunks = listItem.getChunks().iterator();
+ while (chunks.hasNext()) {
+ Chunk ch = (Chunk) chunks.next();
+ addElement(ch, out);
+ }
+ out.write(escape);
+ out.write(paragraph);
+ }
+
+ /**
+ * Write a <code>List</code>
+ *
+ * @param list The <code>List</code> to be written
+ * @param out The <code>ByteArrayOutputStream</code> to write to
+ *
+ * @throws IOException
+ * @throws DocumentException
+ */
+ private void writeList(com.lowagie.text.List list, ByteArrayOutputStream out) throws IOException, DocumentException {
+ int type = 0;
+ int align = 0;
+ int fontNr = addFont(new Font(Font.SYMBOL, 10, Font.NORMAL, new Color(0, 0, 0)));
+ if (!list.isNumbered()) type = 23;
+ if (listLevel == 0) {
+ maxListLevel = 0;
+ listtable.write(openGroup);
+ listtable.write(escape);
+ listtable.write(listDefinition);
+ int i = getRandomInt();
+ listtable.write(escape);
+ listtable.write(listTemplateID);
+ writeInt(listtable, i);
+ listtable.write(escape);
+ listtable.write(hybridList);
+ listtable.write((byte) '\n');
+ }
+ if (listLevel >= maxListLevel) {
+ maxListLevel++;
+ listtable.write(openGroup);
+ listtable.write(escape);
+ listtable.write(listLevelDefinition);
+ listtable.write(escape);
+ listtable.write(listLevelTypeOld);
+ writeInt(listtable, type);
+ listtable.write(escape);
+ listtable.write(listLevelTypeNew);
+ writeInt(listtable, type);
+ listtable.write(escape);
+ listtable.write(listLevelAlignOld);
+ writeInt(listtable, align);
+ listtable.write(escape);
+ listtable.write(listLevelAlignNew);
+ writeInt(listtable, align);
+ listtable.write(escape);
+ listtable.write(listLevelStartAt);
+ writeInt(listtable, 1);
+ listtable.write(openGroup);
+ listtable.write(escape);
+ listtable.write(listLevelTextDefinition);
+ listtable.write(escape);
+ listtable.write(listLevelTextLength);
+ if (list.isNumbered()) {
+ writeInt(listtable, 2);
+ } else {
+ writeInt(listtable, 1);
+ }
+ listtable.write(escape);
+ if (list.isNumbered()) {
+ listtable.write(listLevelTextStyleNumbers);
+ } else {
+ listtable.write(listLevelTextStyleBullet);
+ }
+ listtable.write(commaDelimiter);
+ listtable.write(closeGroup);
+ listtable.write(openGroup);
+ listtable.write(escape);
+ listtable.write(listLevelNumbersDefinition);
+ if (list.isNumbered()) {
+ listtable.write(delimiter);
+ listtable.write(listLevelNumbers);
+ writeInt(listtable, listLevel + 1);
+ }
+ listtable.write(commaDelimiter);
+ listtable.write(closeGroup);
+ if (!list.isNumbered()) {
+ listtable.write(escape);
+ listtable.write(fontNumber);
+ writeInt(listtable, fontNr);
+ }
+ listtable.write(escape);
+ listtable.write(firstIndent);
+ writeInt(listtable, (int) (list.indentationLeft() * TWIPSFACTOR * -1));
+ listtable.write(escape);
+ listtable.write(listIndent);
+ writeInt(listtable, (int) ((list.indentationLeft() + list.symbolIndent()) * TWIPSFACTOR));
+ listtable.write(escape);
+ listtable.write(rightIndent);
+ writeInt(listtable, (int) (list.indentationRight() * TWIPSFACTOR));
+ listtable.write(escape);
+ listtable.write(tabStop);
+ writeInt(listtable, (int) (list.symbolIndent() * TWIPSFACTOR));
+ listtable.write(closeGroup);
+ listtable.write((byte) '\n');
+ }
+ // Actual List Begin in Content
+ out.write(escape);
+ out.write(paragraphDefaults);
+ out.write(escape);
+ out.write(alignLeft);
+ out.write(escape);
+ out.write(firstIndent);
+ writeInt(out, (int) (list.indentationLeft() * TWIPSFACTOR * -1));
+ out.write(escape);
+ out.write(listIndent);
+ writeInt(out, (int) ((list.indentationLeft() + list.symbolIndent()) * TWIPSFACTOR));
+ out.write(escape);
+ out.write(rightIndent);
+ writeInt(out, (int) (list.indentationRight() * TWIPSFACTOR));
+ out.write(escape);
+ out.write(fontSize);
+ writeInt(out, 20);
+ out.write(escape);
+ out.write(listBegin);
+ writeInt(out, currentListID);
+ if (listLevel > 0) {
+ out.write(escape);
+ out.write(listCurrentLevel);
+ writeInt(out, listLevel);
+ }
+ out.write(openGroup);
+ ListIterator listItems = list.getItems().listIterator();
+ Element listElem;
+ int count = 1;
+ while (listItems.hasNext()) {
+ listElem = (Element) listItems.next();
+ if (listElem.type() == Element.CHUNK) {
+ listElem = new ListItem((Chunk) listElem);
+ }
+ if (listElem.type() == Element.LISTITEM) {
+ out.write(openGroup);
+ out.write(escape);
+ out.write(listTextOld);
+ out.write(escape);
+ out.write(paragraphDefaults);
+ out.write(escape);
+ out.write(fontNumber);
+ if (list.isNumbered()) {
+ writeInt(out, addFont(new Font(Font.TIMES_ROMAN, Font.NORMAL, 10, new Color(0, 0, 0))));
+ } else {
+ writeInt(out, fontNr);
+ }
+ out.write(escape);
+ out.write(firstIndent);
+ writeInt(out, (int) (list.indentationLeft() * TWIPSFACTOR * -1));
+ out.write(escape);
+ out.write(listIndent);
+ writeInt(out, (int) ((list.indentationLeft() + list.symbolIndent()) * TWIPSFACTOR));
+ out.write(escape);
+ out.write(rightIndent);
+ writeInt(out, (int) (list.indentationRight() * TWIPSFACTOR));
+ out.write(delimiter);
+ if (list.isNumbered()) {
+ writeInt(out, count);
+ out.write(".".getBytes());
+ } else {
+ out.write(escape);
+ out.write(listBulletOld);
+ }
+ out.write(escape);
+ out.write(tab);
+ out.write(closeGroup);
+ writeListElement((ListItem) listElem, out);
+ count++;
+ } else if (listElem.type() == Element.LIST) {
+ listLevel++;
+ writeList((com.lowagie.text.List) listElem, out);
+ listLevel--;
+ out.write(escape);
+ out.write(paragraphDefaults);
+ out.write(escape);
+ out.write(alignLeft);
+ out.write(escape);
+ out.write(firstIndent);
+ writeInt(out, (int) (list.indentationLeft() * TWIPSFACTOR * -1));
+ out.write(escape);
+ out.write(listIndent);
+ writeInt(out, (int) ((list.indentationLeft() + list.symbolIndent()) * TWIPSFACTOR));
+ out.write(escape);
+ out.write(rightIndent);
+ writeInt(out, (int) (list.indentationRight() * TWIPSFACTOR));
+ out.write(escape);
+ out.write(fontSize);
+ writeInt(out, 20);
+ out.write(escape);
+ out.write(listBegin);
+ writeInt(out, currentListID);
+ if (listLevel > 0) {
+ out.write(escape);
+ out.write(listCurrentLevel);
+ writeInt(out, listLevel);
+ }
+ }
+ out.write((byte) '\n');
+ }
+ out.write(closeGroup);
+ if (listLevel == 0) {
+ int i = getRandomInt();
+ listtable.write(escape);
+ listtable.write(listID);
+ writeInt(listtable, i);
+ listtable.write(closeGroup);
+ listtable.write((byte) '\n');
+ listoverride.write(openGroup);
+ listoverride.write(escape);
+ listoverride.write(listOverride);
+ listoverride.write(escape);
+ listoverride.write(listID);
+ writeInt(listoverride, i);
+ listoverride.write(escape);
+ listoverride.write(listOverrideCount);
+ writeInt(listoverride, 0);
+ listoverride.write(escape);
+ listoverride.write(listBegin);
+ writeInt(listoverride, currentListID);
+ currentListID++;
+ listoverride.write(closeGroup);
+ listoverride.write((byte) '\n');
+ }
+ out.write(escape);
+ out.write(paragraphDefaults);
+ }
+
+ /**
+ * Write a <code>Table</code>.
+ *
+ * @param table The <code>table</code> to be written
+ * @param out The <code>ByteArrayOutputStream</code> to write to
+ *
+ * Currently no nesting of tables is supported. If a cell contains anything but a Cell Object it is ignored.
+ *
+ * @throws IOException
+ * @throws DocumentException
+ */
+ private void writeTable(Table table, ByteArrayOutputStream out) throws IOException, DocumentException {
+ inTable = true;
+ table.complete();
+ RtfTable rtfTable = new RtfTable(this);
+ rtfTable.importTable(table, pageWidth - marginLeft - marginRight);
+ rtfTable.writeTable(out);
+ inTable = false;
+ }
+
+
+ /**
+ * Write an <code>Image</code>.
+ *
+ * @param image The <code>image</code> to be written
+ * @param out The <code>ByteArrayOutputStream</code> to write to
+ *
+ * At the moment only PNG and JPEG Images are supported.
+ *
+ * @throws IOException
+ * @throws DocumentException
+ */
+ private void writeImage(Image image, ByteArrayOutputStream out) throws IOException, DocumentException {
+ int type = image.getOriginalType();
+ if (!(type == Image.ORIGINAL_JPEG || type == Image.ORIGINAL_BMP
+ || type == Image.ORIGINAL_PNG || type == Image.ORIGINAL_WMF))
+ throw new DocumentException("Only BMP, PNG, WMF and JPEG images are supported by the RTF Writer");
+ switch (image.alignment()) {
+ case Element.ALIGN_LEFT:
+ out.write(escape);
+ out.write(alignLeft);
+ break;
+ case Element.ALIGN_RIGHT:
+ out.write(escape);
+ out.write(alignRight);
+ break;
+ case Element.ALIGN_CENTER:
+ out.write(escape);
+ out.write(alignCenter);
+ break;
+ case Element.ALIGN_JUSTIFIED:
+ out.write(escape);
+ out.write(alignJustify);
+ break;
+ }
+ out.write(openGroup);
+ out.write(extendedEscape);
+ out.write(pictureGroup);
+ out.write(openGroup);
+ out.write(escape);
+ out.write(picture);
+ out.write(escape);
+ switch (type) {
+ case Image.ORIGINAL_JPEG:
+ out.write(pictureJPEG);
+ break;
+ case Image.ORIGINAL_PNG:
+ out.write(picturePNG);
+ break;
+ case Image.ORIGINAL_WMF:
+ case Image.ORIGINAL_BMP:
+ out.write(pictureWMF);
+ break;
+ }
+ out.write(escape);
+ out.write(pictureWidth);
+ writeInt(out, (int) (image.plainWidth() * TWIPSFACTOR));
+ out.write(escape);
+ out.write(pictureHeight);
+ writeInt(out, (int) (image.plainHeight() * TWIPSFACTOR));
+
+
+// For some reason this messes up the intended image size. It makes it too big. Weird
+//
+// out.write(escape);
+// out.write(pictureIntendedWidth);
+// writeInt(out, (int) (image.plainWidth() * twipsFactor));
+// out.write(escape);
+// out.write(pictureIntendedHeight);
+// writeInt(out, (int) (image.plainHeight() * twipsFactor));
+
+
+ if (image.width() > 0) {
+ out.write(escape);
+ out.write(pictureScaleX);
+ writeInt(out, (int) (100 / image.width() * image.plainWidth()));
+ }
+ if (image.height() > 0) {
+ out.write(escape);
+ out.write(pictureScaleY);
+ writeInt(out, (int) (100 / image.height() * image.plainHeight()));
+ }
+ out.write(delimiter);
+ InputStream imgIn;
+ if (type == Image.ORIGINAL_BMP) {
+ imgIn = new ByteArrayInputStream(MetaDo.wrapBMP(image));
+ }
+ else {
+ if (image.getOriginalData() == null) {
+ imgIn = image.url().openStream();
+ } else {
+ imgIn = new ByteArrayInputStream(image.getOriginalData());
+ }
+ if (type == Image.ORIGINAL_WMF) { //remove the placeable header
+ long skipLength = 22;
+ while(skipLength > 0) {
+ skipLength = skipLength - imgIn.skip(skipLength);
+ }
+ }
+ }
+ int buffer = -1;
+ int count = 0;
+ out.write((byte) '\n');
+ while ((buffer = imgIn.read()) != -1) {
+ String helperStr = Integer.toHexString(buffer);
+ if (helperStr.length() < 2) helperStr = "0" + helperStr;
+ out.write(helperStr.getBytes());
+ count++;
+ if (count == 64) {
+ out.write((byte) '\n');
+ count = 0;
+ }
+ }
+ imgIn.close();
+ out.write(closeGroup);
+ out.write(closeGroup);
+ out.write((byte) '\n');
+ }
+
+ /**
+ * Write an <code>Annotation</code>
+ *
+ * @param annotationElement The <code>Annotation</code> to be written
+ * @param out The <code>ByteArrayOutputStream</code> to write to
+ *
+ * @throws IOException
+ */
+ private void writeAnnotation(Annotation annotationElement, ByteArrayOutputStream out) throws IOException {
+ int id = getRandomInt();
+ out.write(openGroup);
+ out.write(extendedEscape);
+ out.write(annotationID);
+ out.write(delimiter);
+ writeInt(out, id);
+ out.write(closeGroup);
+ out.write(openGroup);
+ out.write(extendedEscape);
+ out.write(annotationAuthor);
+ out.write(delimiter);
+ out.write(annotationElement.title().getBytes());
+ out.write(closeGroup);
+ out.write(openGroup);
+ out.write(extendedEscape);
+ out.write(annotation);
+ out.write(escape);
+ out.write(paragraphDefaults);
+ out.write(delimiter);
+ out.write(annotationElement.content().getBytes());
+ out.write(closeGroup);
+ }
+
+ /**
+ * Add a <code>Meta</code> element. It is written to the Inforamtion Group
+ * and merged with the main <code>ByteArrayOutputStream</code> when the
+ * Document is closed.
+ *
+ * @param metaName The type of <code>Meta</code> element to be added
+ * @param meta The <code>Meta</code> element to be added
+ *
+ * Currently only the Meta Elements Author, Subject, Keywords, Title, Producer and CreationDate are supported.
+ *
+ * @throws IOException
+ */
+ private void writeMeta(byte[] metaName, Meta meta) throws IOException {
+ info.write(openGroup);
+ try {
+ info.write(escape);
+ info.write(metaName);
+ info.write(delimiter);
+ if (meta.type() == Meta.CREATIONDATE) {
+ writeFormatedDateTime(meta.content());
+ } else {
+ info.write(meta.content().getBytes());
+ }
+ } finally {
+ info.write(closeGroup);
+ }
+ }
+
+ /**
+ * Writes a date. The date is formated <strong>Year, Month, Day, Hour, Minute, Second</strong>
+ *
+ * @param date The date to be written
+ *
+ * @throws IOException
+ */
+ private void writeFormatedDateTime(String date) throws IOException {
+ Calendar cal = Calendar.getInstance();
+ SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy");
+ ParsePosition pp = new ParsePosition(0);
+ Date d = sdf.parse(date, pp);
+ if (d == null) {
+ d = new Date();
+ }
+ cal.setTime(d);
+ info.write(escape);
+ info.write(year);
+ writeInt(info, cal.get(Calendar.YEAR));
+ info.write(escape);
+ info.write(month);
+ writeInt(info, cal.get(Calendar.MONTH));
+ info.write(escape);
+ info.write(day);
+ writeInt(info, cal.get(Calendar.DAY_OF_MONTH));
+ info.write(escape);
+ info.write(hour);
+ writeInt(info, cal.get(Calendar.HOUR_OF_DAY));
+ info.write(escape);
+ info.write(minute);
+ writeInt(info, cal.get(Calendar.MINUTE));
+ info.write(escape);
+ info.write(second);
+ writeInt(info, cal.get(Calendar.SECOND));
+ }
+
+ /**
+ * Add a new <code>Font</code> to the list of fonts. If the <code>Font</code>
+ * already exists in the list of fonts, then it is not added again.
+ *
+ * @param newFont The <code>Font</code> to be added
+ *
+ * @return The index of the <code>Font</code> in the font list
+ */
+ protected int addFont(Font newFont) {
+ int fn = -1;
+
+ for (int i = 0; i < fontList.size(); i++) {
+ if (newFont.getFamilyname().equals(((Font) fontList.get(i)).getFamilyname())) {
+ fn = i;
+ }
+ }
+ if (fn == -1) {
+ fontList.add(newFont);
+ return fontList.size() - 1;
+ }
+ return fn;
+ }
+
+ /**
+ * Add a new <code>Color</code> to the list of colours. If the <code>Color</code>
+ * already exists in the list of colours, then it is not added again.
+ *
+ * @param newColor The <code>Color</code> to be added
+ *
+ * @return The index of the <code>color</code> in the colour list
+ */
+ protected int addColor(Color newColor) {
+ int cn = 0;
+ if (newColor == null) {
+ return cn;
+ }
+ cn = colorList.indexOf(newColor);
+ if (cn == -1) {
+ colorList.add(newColor);
+ return colorList.size() - 1;
+ }
+ return cn;
+ }
+
+ /**
+ * Merge all the different <code>ArrayList</code>s and <code>ByteArrayOutputStream</code>s
+ * to the final <code>ByteArrayOutputStream</code>
+ *
+ * @return <code>true</code> if all information was sucessfully written to the <code>ByteArrayOutputStream</code>
+ */
+ private boolean writeDocument() {
+ try {
+ writeDocumentIntro();
+ writeFontList();
+ os.write((byte) '\n');
+ writeColorList();
+ os.write((byte) '\n');
+ writeList();
+ os.write((byte) '\n');
+ writeInfoGroup();
+ os.write((byte) '\n');
+ writeDocumentFormat();
+ os.write((byte) '\n');
+ ByteArrayOutputStream hf = new ByteArrayOutputStream();
+ writeSectionDefaults(hf);
+ hf.writeTo(os);
+ content.writeTo(os);
+ os.write(closeGroup);
+ return true;
+ } catch (IOException e) {
+ System.err.println(e.getMessage());
+ return false;
+ }
+
+ }
+
+ /** Write the Rich Text file settings
+ * @throws IOException
+ */
+ private void writeDocumentIntro() throws IOException {
+ os.write(openGroup);
+ os.write(escape);
+ os.write(docBegin);
+ os.write(escape);
+ os.write(ansi);
+ os.write(escape);
+ os.write(ansiCodepage);
+ writeInt(os, 1252);
+ os.write((byte)'\n');
+ os.write(escape);
+ os.write(defaultFont);
+ writeInt(os, 0);
+ }
+
+ /**
+ * Write the font list to the final <code>ByteArrayOutputStream</code>
+ * @throws IOException
+ */
+ private void writeFontList() throws IOException {
+ Font fnt;
+
+ os.write(openGroup);
+ os.write(escape);
+ os.write(fontTable);
+ for (int i = 0; i < fontList.size(); i++) {
+ fnt = (Font) fontList.get(i);
+ os.write(openGroup);
+ os.write(escape);
+ os.write(fontNumber);
+ writeInt(os, i);
+ os.write(escape);
+ switch (Font.getFamilyIndex(fnt.getFamilyname())) {
+ case Font.COURIER:
+ os.write(fontModern);
+ os.write(escape);
+ os.write(fontCharset);
+ writeInt(os, 0);
+ os.write(delimiter);
+ os.write(fontCourier);
+ break;
+ case Font.HELVETICA:
+ os.write(fontSwiss);
+ os.write(escape);
+ os.write(fontCharset);
+ writeInt(os, 0);
+ os.write(delimiter);
+ os.write(fontArial);
+ break;
+ case Font.SYMBOL:
+ os.write(fontRoman);
+ os.write(escape);
+ os.write(fontCharset);
+ writeInt(os, 2);
+ os.write(delimiter);
+ os.write(fontSymbol);
+ break;
+ case Font.TIMES_ROMAN:
+ os.write(fontRoman);
+ os.write(escape);
+ os.write(fontCharset);
+ writeInt(os, 0);
+ os.write(delimiter);
+ os.write(fontTimesNewRoman);
+ break;
+ case Font.ZAPFDINGBATS:
+ os.write(fontTech);
+ os.write(escape);
+ os.write(fontCharset);
+ writeInt(os, 0);
+ os.write(delimiter);
+ os.write(fontWindings);
+ break;
+ default:
+ os.write(fontRoman);
+ os.write(escape);
+ os.write(fontCharset);
+ writeInt(os, 0);
+ os.write(delimiter);
+ os.write(filterSpecialChar(fnt.getFamilyname(), true).getBytes());
+ }
+ os.write(commaDelimiter);
+ os.write(closeGroup);
+ }
+ os.write(closeGroup);
+ }
+
+ /**
+ * Write the colour list to the final <code>ByteArrayOutputStream</code>
+ * @throws IOException
+ */
+ private void writeColorList() throws IOException {
+ Color color = null;
+
+ os.write(openGroup);
+ os.write(escape);
+ os.write(colorTable);
+ for (int i = 0; i < colorList.size(); i++) {
+ color = (Color) colorList.get(i);
+ os.write(escape);
+ os.write(colorRed);
+ writeInt(os, color.getRed());
+ os.write(escape);
+ os.write(colorGreen);
+ writeInt(os, color.getGreen());
+ os.write(escape);
+ os.write(colorBlue);
+ writeInt(os, color.getBlue());
+ os.write(commaDelimiter);
+ }
+ os.write(closeGroup);
+ }
+
+ /**
+ * Write the Information Group to the final <code>ByteArrayOutputStream</code>
+ * @throws IOException
+ */
+ private void writeInfoGroup() throws IOException {
+ os.write(openGroup);
+ os.write(escape);
+ os.write(infoBegin);
+ info.writeTo(os);
+ os.write(closeGroup);
+ }
+
+ /**
+ * Write the listtable and listoverridetable to the final <code>ByteArrayOutputStream</code>
+ * @throws IOException
+ */
+ private void writeList() throws IOException {
+ listtable.write(closeGroup);
+ listoverride.write(closeGroup);
+ listtable.writeTo(os);
+ os.write((byte) '\n');
+ listoverride.writeTo(os);
+ }
+
+ /**
+ * Write an integer
+ *
+ * @param out The <code>OuputStream</code> to which the <code>int</code> value is to be written
+ * @param i The <code>int</code> value to be written
+ * @throws IOException
+ */
+ public final static void writeInt(OutputStream out, int i) throws IOException {
+ out.write(Integer.toString(i).getBytes());
+ }
+
+ /**
+ * Get a random integer.
+ * This returns a <b>unique</b> random integer to be used with listids.
+ *
+ * @return Random <code>int</code> value.
+ */
+ private int getRandomInt() {
+ boolean ok = false;
+ Integer newInt = null;
+ Integer oldInt = null;
+ while (!ok) {
+ newInt = new Integer((int) (Math.random() * Integer.MAX_VALUE));
+ ok = true;
+ for (int i = 0; i < listIds.size(); i++) {
+ oldInt = (Integer) listIds.get(i);
+ if (oldInt.equals(newInt)) {
+ ok = true;
+ }
+ }
+ }
+ listIds.add(newInt);
+ return newInt.intValue();
+ }
+
+ /**
+ * Write the current header and footer to a <code>ByteArrayOutputStream</code>
+ *
+ * @param os The <code>ByteArrayOutputStream</code> to which the header and footer will be written.
+ * @throws IOException
+ */
+ public void writeHeadersFooters(ByteArrayOutputStream os) throws IOException {
+ if (this.footer instanceof RtfHeaderFooters) {
+ RtfHeaderFooters rtfHf = (RtfHeaderFooters) this.footer;
+ HeaderFooter hf = rtfHf.get(RtfHeaderFooters.ALL_PAGES);
+ if (hf != null) {
+ writeHeaderFooter(hf, footerBegin, os);
+ }
+ hf = rtfHf.get(RtfHeaderFooters.LEFT_PAGES);
+ if (hf != null) {
+ writeHeaderFooter(hf, footerlBegin, os);
+ }
+ hf = rtfHf.get(RtfHeaderFooters.RIGHT_PAGES);
+ if (hf != null) {
+ writeHeaderFooter(hf, footerrBegin, os);
+ }
+ hf = rtfHf.get(RtfHeaderFooters.FIRST_PAGE);
+ if (hf != null) {
+ writeHeaderFooter(hf, footerfBegin, os);
+ }
+ } else {
+ writeHeaderFooter(this.footer, footerBegin, os);
+ }
+ if (this.header instanceof RtfHeaderFooters) {
+ RtfHeaderFooters rtfHf = (RtfHeaderFooters) this.header;
+ HeaderFooter hf = rtfHf.get(RtfHeaderFooters.ALL_PAGES);
+ if (hf != null) {
+ writeHeaderFooter(hf, headerBegin, os);
+ }
+ hf = rtfHf.get(RtfHeaderFooters.LEFT_PAGES);
+ if (hf != null) {
+ writeHeaderFooter(hf, headerlBegin, os);
+ }
+ hf = rtfHf.get(RtfHeaderFooters.RIGHT_PAGES);
+ if (hf != null) {
+ writeHeaderFooter(hf, headerrBegin, os);
+ }
+ hf = rtfHf.get(RtfHeaderFooters.FIRST_PAGE);
+ if (hf != null) {
+ writeHeaderFooter(hf, headerfBegin, os);
+ }
+ } else {
+ writeHeaderFooter(this.header, headerBegin, os);
+ }
+ }
+
+ /**
+ * Write a <code>HeaderFooter</code> to a <code>ByteArrayOutputStream</code>
+ *
+ * @param headerFooter The <code>HeaderFooter</code> object to be written.
+ * @param hfType The type of header or footer to be added.
+ * @param target The <code>ByteArrayOutputStream</code> to which the <code>HeaderFooter</code> will be written.
+ * @throws IOException
+ */
+ private void writeHeaderFooter(HeaderFooter headerFooter, byte[] hfType, ByteArrayOutputStream target) throws IOException {
+ inHeaderFooter = true;
+ try {
+ target.write(openGroup);
+ target.write(escape);
+ target.write(hfType);
+ target.write(delimiter);
+ if (headerFooter != null) {
+ if (headerFooter instanceof RtfHeaderFooter && ((RtfHeaderFooter) headerFooter).content() != null) {
+ this.addElement(((RtfHeaderFooter) headerFooter).content(), target);
+ } else {
+ Paragraph par = new Paragraph();
+ par.setAlignment(headerFooter.alignment());
+ if (headerFooter.getBefore() != null) {
+ par.add(headerFooter.getBefore());
+ }
+ if (headerFooter.isNumbered()) {
+ par.add(new RtfPageNumber("", headerFooter.getBefore().font()));
+ }
+ if (headerFooter.getAfter() != null) {
+ par.add(headerFooter.getAfter());
+ }
+ this.addElement(par, target);
+ }
+ }
+ target.write(closeGroup);
+ } catch (DocumentException e) {
+ throw new IOException("DocumentException - " + e.getMessage());
+ }
+ inHeaderFooter = false;
+ }
+
+ /**
+ * Write the <code>Document</code>'s Paper and Margin Size
+ * to the final <code>ByteArrayOutputStream</code>
+ * @throws IOException
+ */
+ private void writeDocumentFormat() throws IOException {
+// os.write(openGroup);
+ os.write(escape);
+ os.write(rtfPaperWidth);
+ writeInt(os, pageWidth);
+ os.write(escape);
+ os.write(rtfPaperHeight);
+ writeInt(os, pageHeight);
+ os.write(escape);
+ os.write(rtfMarginLeft);
+ writeInt(os, marginLeft);
+ os.write(escape);
+ os.write(rtfMarginRight);
+ writeInt(os, marginRight);
+ os.write(escape);
+ os.write(rtfMarginTop);
+ writeInt(os, marginTop);
+ os.write(escape);
+ os.write(rtfMarginBottom);
+ writeInt(os, marginBottom);
+// os.write(closeGroup);
+ }
+
+ /**
+ * Initialise all helper classes.
+ * Clears alls lists, creates new <code>ByteArrayOutputStream</code>'s
+ */
+ private void initDefaults() {
+ fontList.clear();
+ colorList.clear();
+ info = new ByteArrayOutputStream();
+ content = new ByteArrayOutputStream();
+ listtable = new ByteArrayOutputStream();
+ listoverride = new ByteArrayOutputStream();
+ document.addProducer();
+ document.addCreationDate();
+ addFont(new Font(Font.TIMES_ROMAN, 10, Font.NORMAL));
+ addColor(new Color(0, 0, 0));
+ addColor(new Color(255, 255, 255));
+ listIds = new ArrayList();
+ try {
+ listtable.write(openGroup);
+ listtable.write(extendedEscape);
+ listtable.write(listtableGroup);
+ listtable.write((byte) '\n');
+ listoverride.write(openGroup);
+ listoverride.write(extendedEscape);
+ listoverride.write(listoverridetableGroup);
+ listoverride.write((byte) '\n');
+ } catch (IOException e) {
+ System.err.println("InitDefaultsError" + e);
+ }
+ }
+
+ /**
+ * Writes the default values for the current Section
+ *
+ * @param out The <code>ByteArrayOutputStream</code> to be written to
+ * @throws IOException
+ */
+ private void writeSectionDefaults(ByteArrayOutputStream out) throws IOException {
+ if (header instanceof RtfHeaderFooters || footer instanceof RtfHeaderFooters) {
+ RtfHeaderFooters rtfHeader = (RtfHeaderFooters) header;
+ RtfHeaderFooters rtfFooter = (RtfHeaderFooters) footer;
+ if ((rtfHeader != null && (rtfHeader.get(RtfHeaderFooters.LEFT_PAGES) != null || rtfHeader.get(RtfHeaderFooters.RIGHT_PAGES) != null)) || (rtfFooter != null && (rtfFooter.get(RtfHeaderFooters.LEFT_PAGES) != null || rtfFooter.get(RtfHeaderFooters.RIGHT_PAGES) != null))) {
+ out.write(escape);
+ out.write(facingPages);
+ }
+ }
+ if (hasTitlePage) {
+ out.write(escape);
+ out.write(titlePage);
+ }
+ writeHeadersFooters(out);
+ if (landscape) {
+ //out.write(escape);
+ //out.write(landscapeTag1);
+ out.write(escape);
+ out.write(landscapeTag2);
+ out.write(escape);
+ out.write(sectionPageWidth);
+ writeInt(out, pageWidth);
+ out.write(escape);
+ out.write(sectionPageHeight);
+ writeInt(out, pageHeight);
+ } else {
+ out.write(escape);
+ out.write(sectionPageWidth);
+ writeInt(out, pageWidth);
+ out.write(escape);
+ out.write(sectionPageHeight);
+ writeInt(out, pageHeight);
+ }
+ }
+
+ /**
+ * This method tries to fit the <code>Rectangle pageSize</code> to one of the predefined PageSize rectangles.
+ * If a match is found the pageWidth and pageHeight will be set according to values determined from files
+ * generated by MS Word2000 and OpenOffice 641. If no match is found the method will try to match the rotated
+ * Rectangle by calling itself with the parameter rotate set to true.
+ * @param pageSize a rectangle defining the size of the page
+ * @param rotate portrait or lanscape?
+ * @return true if the format parsing succeeded
+ */
+ private boolean parseFormat(Rectangle pageSize, boolean rotate) {
+ if (rotate) {
+ pageSize = pageSize.rotate();
+ }
+ if (rectEquals(pageSize, PageSize.A3)) {
+ pageWidth = 16837;
+ pageHeight = 23811;
+ landscape = rotate;
+ return true;
+ }
+ if (rectEquals(pageSize, PageSize.A4)) {
+ pageWidth = 11907;
+ pageHeight = 16840;
+ landscape = rotate;
+ return true;
+ }
+ if (rectEquals(pageSize, PageSize.A5)) {
+ pageWidth = 8391;
+ pageHeight = 11907;
+ landscape = rotate;
+ return true;
+ }
+ if (rectEquals(pageSize, PageSize.A6)) {
+ pageWidth = 5959;
+ pageHeight = 8420;
+ landscape = rotate;
+ return true;
+ }
+ if (rectEquals(pageSize, PageSize.B4)) {
+ pageWidth = 14570;
+ pageHeight = 20636;
+ landscape = rotate;
+ return true;
+ }
+ if (rectEquals(pageSize, PageSize.B5)) {
+ pageWidth = 10319;
+ pageHeight = 14572;
+ landscape = rotate;
+ return true;
+ }
+ if (rectEquals(pageSize, PageSize.HALFLETTER)) {
+ pageWidth = 7927;
+ pageHeight = 12247;
+ landscape = rotate;
+ return true;
+ }
+ if (rectEquals(pageSize, PageSize.LETTER)) {
+ pageWidth = 12242;
+ pageHeight = 15842;
+ landscape = rotate;
+ return true;
+ }
+ if (rectEquals(pageSize, PageSize.LEGAL)) {
+ pageWidth = 12252;
+ pageHeight = 20163;
+ landscape = rotate;
+ return true;
+ }
+ if (!rotate && parseFormat(pageSize, true)) {
+ int x = pageWidth;
+ pageWidth = pageHeight;
+ pageHeight = x;
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * This method compares to Rectangles. They are considered equal if width and height are the same
+ * @param rect1
+ * @param rect2
+ * @return true if rect1 and rect2 represent the same rectangle
+ */
+ private boolean rectEquals(Rectangle rect1, Rectangle rect2) {
+ return (rect1.width() == rect2.width()) && (rect1.height() == rect2.height());
+ }
+
+ /**
+ * Returns whether we are currently writing a header or footer
+ *
+ * @return the value of inHeaderFooter
+ */
+ public boolean writingHeaderFooter() {
+ return inHeaderFooter;
+ }
+
+ /**
+ * Replaces special characters with their unicode values
+ *
+ * @param str The original <code>String</code>
+ * @param useHex
+ * @return The converted String
+ */
+ public final static String filterSpecialChar(String str, boolean useHex) {
+ int length = str.length();
+ int z = (int) 'z';
+ StringBuffer ret = new StringBuffer(length);
+ for (int i = 0; i < length; i++) {
+ char ch = str.charAt(i);
+
+ if (ch == '\\') {
+ ret.append("\\\\");
+ } else if (ch == '\n') {
+ ret.append("\\par ");
+ } else if (((int) ch) > z) {
+ if(useHex) {
+ ret.append("\\\'").append(Long.toHexString((long) ch));
+ } else {
+ ret.append("\\u").append((long) ch).append('?');
+ }
+ } else {
+ ret.append(ch);
+ }
+ }
+ String s = ret.toString();
+ if(s.indexOf("$newpage$") >= 0) {
+ String before = s.substring(0, s.indexOf("$newpage$"));
+ String after = s.substring(s.indexOf("$newpage$") + 9);
+ ret = new StringBuffer(before);
+ ret.append("\\page\\par ");
+ ret.append(after);
+ return ret.toString();
+ }
+ return s;
+ }
+
+ private void addHeaderFooterFontColor(HeaderFooter hf) {
+ if(hf instanceof RtfHeaderFooter) {
+ RtfHeaderFooter rhf = (RtfHeaderFooter) hf;
+ if(rhf.content() instanceof Chunk) {
+ addFont(((Chunk) rhf.content()).font());
+ addColor(((Chunk) rhf.content()).font().color());
+ } else if(rhf.content() instanceof Phrase) {
+ addFont(((Phrase) rhf.content()).font());
+ addColor(((Phrase) rhf.content()).font().color());
+ }
+ }
+ if(hf.getBefore() != null) {
+ addFont(hf.getBefore().font());
+ addColor(hf.getBefore().font().color());
+ }
+ if(hf.getAfter() != null) {
+ addFont(hf.getAfter().font());
+ addColor(hf.getAfter().font().color());
+ }
+ }
+
+ private void processHeaderFooter(HeaderFooter hf) {
+ if(hf != null) {
+ if(hf instanceof RtfHeaderFooters) {
+ RtfHeaderFooters rhf = (RtfHeaderFooters) hf;
+ if(rhf.get(RtfHeaderFooters.ALL_PAGES) != null) {
+ addHeaderFooterFontColor(rhf.get(RtfHeaderFooters.ALL_PAGES));
+ }
+ if(rhf.get(RtfHeaderFooters.LEFT_PAGES) != null) {
+ addHeaderFooterFontColor(rhf.get(RtfHeaderFooters.LEFT_PAGES));
+ }
+ if(rhf.get(RtfHeaderFooters.RIGHT_PAGES) != null) {
+ addHeaderFooterFontColor(rhf.get(RtfHeaderFooters.RIGHT_PAGES));
+ }
+ if(rhf.get(RtfHeaderFooters.FIRST_PAGE) != null) {
+ addHeaderFooterFontColor(rhf.get(RtfHeaderFooters.FIRST_PAGE));
+ }
+ } else {
+ addHeaderFooterFontColor(hf);
+ }
+ }
+ }
+
+ /**
+ * @see com.lowagie.text.DocListener#setMarginMirroring(boolean)
+ */
+ public boolean setMarginMirroring(boolean MarginMirroring) {
+ return false;
+ }
+
+}
+
diff --git a/src/main/java/com/lowagie/text/rtf/RtfWriter2.java b/src/main/java/com/lowagie/text/rtf/RtfWriter2.java
new file mode 100644
index 0000000..40040df
--- /dev/null
+++ b/src/main/java/com/lowagie/text/rtf/RtfWriter2.java
@@ -0,0 +1,268 @@
+/*
+ * $Id: RtfWriter2.java,v 1.11 2005/09/11 19:09:57 hallm Exp $
+ * $Name: $
+ *
+ * Copyright 2001, 2002, 2003, 2004 by Mark Hall
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the ?GNU LIBRARY GENERAL PUBLIC LICENSE?), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.rtf;
+
+import com.lowagie.text.*;
+import com.lowagie.text.rtf.document.RtfDocument;
+import com.lowagie.text.rtf.document.RtfDocumentSettings;
+import com.lowagie.text.rtf.text.RtfNewPage;
+
+import java.io.IOException;
+import java.io.OutputStream;
+
+/**
+ * The RtfWriter allows the creation of rtf documents via the iText system
+ *
+ * Version: $Id: RtfWriter2.java,v 1.11 2005/09/11 19:09:57 hallm Exp $
+ * @author Mark Hall (mhall@edu.uni-klu.ac.at)
+ */
+public class RtfWriter2 extends DocWriter implements DocListener {
+ /**
+ * The RtfDocument this RtfWriter is creating
+ */
+ RtfDocument rtfDoc = null;
+
+ /**
+ * Constructs a new RtfWriter that listens to the specified Document and
+ * writes its output to the OutputStream.
+ *
+ * @param doc The Document that this RtfWriter listens to
+ * @param os The OutputStream to write to
+ */
+ protected RtfWriter2(Document doc, OutputStream os) {
+ super(doc, os);
+ doc.addDocListener(this);
+ rtfDoc = new RtfDocument();
+ }
+
+ /**
+ * Static method to generate RtfWriters
+ *
+ * @param doc The Document that this RtfWriter listens to
+ * @param os The OutputStream to write to
+ * @return The new RtfWriter
+ */
+ public static RtfWriter2 getInstance(Document doc, OutputStream os) {
+ return new RtfWriter2(doc, os);
+ }
+
+ /**
+ * Sets the header to use
+ *
+ * @param hf The HeaderFooter to use
+ */
+ public void setHeader(HeaderFooter hf) {
+ this.rtfDoc.getDocumentHeader().setHeader(hf);
+ }
+
+ /**
+ * Resets the header
+ */
+ public void resetHeader() {
+ this.rtfDoc.getDocumentHeader().setHeader(null);
+ }
+
+ /**
+ * Sets the footer to use
+ *
+ * @param hf The HeaderFooter to use
+ */
+ public void setFooter(HeaderFooter hf) {
+ this.rtfDoc.getDocumentHeader().setFooter(hf);
+ }
+
+ /**
+ * Resets the footer
+ */
+ public void resetFooter() {
+ this.rtfDoc.getDocumentHeader().setFooter(null);
+ }
+
+ /**
+ * This method is not supported in the RtfWriter
+ * @param i Unused
+ */
+ public void setPageCount(int i) {}
+
+ /**
+ * This method is not supported in the RtfWriter
+ */
+ public void resetPageCount() {}
+
+ /**
+ * This method is not supported in the RtfWriter
+ *
+ * @param wm Unused
+ * @return <code>false</code>
+ */
+ public boolean add(Watermark wm) { return false; }
+
+ /**
+ * This method is not supported in the RtfWriter
+ */
+ public void removeWatermark() {}
+
+ /**
+ * This method is not supported in the RtfWriter
+ */
+ public void clearTextWrap() {}
+
+ /**
+ * Opens the RtfDocument
+ */
+ public void open() {
+ }
+
+ /**
+ * Closes the RtfDocument. This causes the document to be written
+ * to the specified OutputStream
+ */
+ public void close() {
+ try {
+ os.write(rtfDoc.writeDocument());
+ if(this.closeStream) {
+ os.close();
+ }
+ } catch(IOException ioe) {
+ ioe.printStackTrace();
+ }
+ this.rtfDoc = new RtfDocument();
+ }
+
+ /**
+ * Adds an Element to the Document
+ *
+ * @param element The element to be added
+ * @return <code>false</code>
+ * @throws DocumentException
+ */
+ public boolean add(Element element) throws DocumentException {
+ if (pause) {
+ return false;
+ }
+ RtfBasicElement rtfElement = rtfDoc.getMapper().mapElement(element);
+ if(rtfElement != null) {
+ rtfDoc.add(rtfElement);
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ /**
+ * Adds a page break
+ *
+ * @return <code>false</code>
+ */
+ public boolean newPage() {
+ rtfDoc.add(new RtfNewPage(rtfDoc));
+ return true;
+ }
+
+ /**
+ * Sets the page margins
+ *
+ * @param left The left margin
+ * @param right The right margin
+ * @param top The top margin
+ * @param bottom The bottom margin
+ * @return <code>false</code>
+ */
+ public boolean setMargins(float left, float right, float top, float bottom) {
+ rtfDoc.getDocumentHeader().getPageSetting().setMarginLeft((int) (left * RtfElement.TWIPS_FACTOR));
+ rtfDoc.getDocumentHeader().getPageSetting().setMarginRight((int) (right * RtfElement.TWIPS_FACTOR));
+ rtfDoc.getDocumentHeader().getPageSetting().setMarginTop((int) (top * RtfElement.TWIPS_FACTOR));
+ rtfDoc.getDocumentHeader().getPageSetting().setMarginBottom((int) (bottom * RtfElement.TWIPS_FACTOR));
+ return true;
+ }
+
+ /**
+ * Sets the size of the page
+ *
+ * @param rect A Rectangle representing the page
+ * @return <code>false</code>
+ */
+ public boolean setPageSize(Rectangle rect) {
+ rtfDoc.getDocumentHeader().getPageSetting().setPageSize(rect);
+ return true;
+ }
+
+ /**
+ * Whether to automagically generate table of contents entries when
+ * adding Chapters or Sections.
+ *
+ * @param autogenerate Whether to automatically generate TOC entries
+ */
+ public void setAutogenerateTOCEntries(boolean autogenerate) {
+ this.rtfDoc.setAutogenerateTOCEntries(autogenerate);
+ }
+
+ /**
+ * Sets the rtf data cache style to use. Valid values are given in the
+ * RtfDataCache class.
+ *
+ * @param dataCacheStyle The style to use.
+ * @throws DocumentException If data has already been written into the data cache.
+ * @throws IOException If the disk cache could not be initialised.
+ */
+ public void setDataCacheStyle(int dataCacheStyle) throws DocumentException, IOException {
+ this.rtfDoc.setDataCacheStyle(dataCacheStyle);
+ }
+
+ /**
+ * Gets the RtfDocumentSettings that specify how the rtf document is generated.
+ *
+ * @return The current RtfDocumentSettings.
+ */
+ public RtfDocumentSettings getDocumentSettings() {
+ return this.rtfDoc.getDocumentSettings();
+ }
+}
diff --git a/src/main/java/com/lowagie/text/rtf/document/RtfCodePage.java b/src/main/java/com/lowagie/text/rtf/document/RtfCodePage.java
new file mode 100644
index 0000000..e88a942
--- /dev/null
+++ b/src/main/java/com/lowagie/text/rtf/document/RtfCodePage.java
@@ -0,0 +1,102 @@
+/*
+ * $Id: RtfCodePage.java,v 1.16 2005/05/04 14:33:53 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2003, 2004 by Mark Hall
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the ?GNU LIBRARY GENERAL PUBLIC LICENSE?), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.rtf.document;
+
+import com.lowagie.text.rtf.RtfElement;
+import com.lowagie.text.rtf.RtfExtendedElement;
+
+import java.io.IOException;
+import java.io.ByteArrayOutputStream;
+
+/**
+ * The RtfCodePage class allows different code pages to be used in the rtf document.
+ * Currently always ansi / ansicpg1252
+ *
+ * Version: $Id: RtfCodePage.java,v 1.16 2005/05/04 14:33:53 blowagie Exp $
+ * @author Mark Hall (mhall@edu.uni-klu.ac.at)
+ */
+public class RtfCodePage extends RtfElement implements RtfExtendedElement {
+ /**
+ * Constant for ansi encoded rtf documents
+ */
+ private static final byte[] ANSI = "\\ansi".getBytes();
+ /**
+ * Constant for the ansi codepage
+ */
+ private static final byte[] ANSI_CODEPAGE = "\\ansicpg".getBytes();
+
+ /**
+ * Construct an RtfCodePage
+ *
+ * @param doc The RtfDocument this RtfCodePage belongs to
+ */
+ public RtfCodePage(RtfDocument doc) {
+ super(doc);
+ }
+
+ /**
+ * Writes the selected codepage to a byte array
+ *
+ * @return Byte array with the current codepage
+ */
+ public byte[] writeDefinition() {
+ ByteArrayOutputStream result = new ByteArrayOutputStream();
+ try {
+ result.write(ANSI);
+ result.write(ANSI_CODEPAGE);
+ result.write(intToByteArray(1252));
+ result.write((byte)'\n');
+ } catch(IOException ioe) {
+ ioe.printStackTrace();
+ }
+ return result.toByteArray();
+ }
+}
diff --git a/src/main/java/com/lowagie/text/rtf/document/RtfDocument.java b/src/main/java/com/lowagie/text/rtf/document/RtfDocument.java
new file mode 100644
index 0000000..63f0321
--- /dev/null
+++ b/src/main/java/com/lowagie/text/rtf/document/RtfDocument.java
@@ -0,0 +1,301 @@
+/*
+ * $Id: RtfDocument.java,v 1.16 2005/12/24 13:14:59 hallm Exp $
+ * $Name: $
+ *
+ * Copyright 2003, 2004, 2005 by Mark Hall
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the ?GNU LIBRARY GENERAL PUBLIC LICENSE?), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.rtf.document;
+
+import com.lowagie.text.DocumentException;
+import com.lowagie.text.rtf.RtfBasicElement;
+import com.lowagie.text.rtf.RtfElement;
+import com.lowagie.text.rtf.RtfMapper;
+import com.lowagie.text.rtf.document.output.RtfDataCache;
+import com.lowagie.text.rtf.document.output.RtfDiskCache;
+import com.lowagie.text.rtf.document.output.RtfMemoryCache;
+import com.lowagie.text.rtf.graphic.RtfImage;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.util.ArrayList;
+
+/**
+ * The RtfDocument stores all document related data and also the main data stream.
+ * INTERNAL CLASS - NOT TO BE USED DIRECTLY
+ *
+ * Version: $Id: RtfDocument.java,v 1.16 2005/12/24 13:14:59 hallm Exp $
+ * @author Mark Hall (mhall@edu.uni-klu.ac.at)
+ * @author Todd Bush (Todd.Bush@canopysystems.com) [Tab support]
+ */
+public class RtfDocument extends RtfElement {
+ /**
+ * Stores the actual document data
+ */
+ private RtfDataCache data = null;
+ /**
+ * The RtfMapper to use in this RtfDocument
+ */
+ private RtfMapper mapper = null;
+ /**
+ * The RtfDocumentHeader that handles all document header methods
+ */
+ private RtfDocumentHeader documentHeader = null;
+ /**
+ * Stores integers that have been generated as unique random numbers
+ */
+ private ArrayList previousRandomInts = null;
+ /**
+ * Whether to automatically generate TOC entries for Chapters and Sections. Defaults to false
+ */
+ private boolean autogenerateTOCEntries = false;
+ /**
+ * Whether data has been written to the RtfDataCache.
+ */
+ private boolean dataWritten = false;
+ /**
+ * The RtfDocumentSettings for this RtfDocument.
+ */
+ private RtfDocumentSettings documentSettings = null;
+ /**
+ * The last RtfBasicElement that was added directly to the RtfDocument.
+ */
+ private RtfBasicElement lastElementWritten = null;
+
+ /**
+ * Constant for the Rtf document start
+ */
+ private static final byte[] RTF_DOCUMENT = "\\rtf1".getBytes();
+
+ /**
+ * The default constructor for a RtfDocument
+ */
+ public RtfDocument() {
+ super(null);
+ data = new RtfMemoryCache();
+ mapper = new RtfMapper(this);
+ documentHeader = new RtfDocumentHeader(this);
+ documentHeader.init();
+ previousRandomInts = new ArrayList();
+ this.documentSettings = new RtfDocumentSettings(this);
+ }
+
+ /**
+ * Writes the document
+ *
+ * @return A byte array containing the complete rtf document
+ */
+ public byte[] writeDocument() {
+ ByteArrayOutputStream docStream = new ByteArrayOutputStream();
+ try {
+ docStream.write(OPEN_GROUP);
+ docStream.write(RtfDocument.RTF_DOCUMENT);
+ docStream.write(documentHeader.write());
+ data.writeTo(docStream);
+ docStream.write(CLOSE_GROUP);
+ } catch(IOException ioe) {
+ ioe.printStackTrace();
+ }
+ return docStream.toByteArray();
+ }
+
+ /**
+ * Adds an element to the rtf document
+ *
+ * @param element The element to add
+ */
+ public void add(RtfBasicElement element) {
+ try {
+ if(element instanceof RtfInfoElement) {
+ this.documentHeader.addInfoElement((RtfInfoElement) element);
+ } else {
+ this.dataWritten = true;
+ if(element instanceof RtfImage) {
+ ((RtfImage) element).setTopLevelElement(true);
+ }
+ data.getOutputStream().write(element.write());
+ this.lastElementWritten = element;
+ }
+ } catch(IOException ioe) {
+ ioe.printStackTrace();
+ }
+ }
+
+ /**
+ * Gets the RtfMapper object of this RtfDocument
+ *
+ * @return The RtfMapper
+ */
+ public RtfMapper getMapper() {
+ return mapper;
+ }
+
+ /**
+ * Generates a random integer that is unique with respect to the document.
+ *
+ * @return A random int
+ */
+ public int getRandomInt() {
+ Integer newInt = null;
+ do {
+ newInt = new Integer((int) (Math.random() * Integer.MAX_VALUE));
+ } while(previousRandomInts.contains(newInt));
+ previousRandomInts.add(newInt);
+ return newInt.intValue();
+ }
+
+ /**
+ * Gets the RtfDocumentHeader of this RtfDocument
+ *
+ * @return The RtfDocumentHeader of this RtfDocument
+ */
+ public RtfDocumentHeader getDocumentHeader() {
+ return this.documentHeader;
+ }
+
+ /**
+ * Replaces special characters with their unicode values
+ * @param str The original <code>String</code>
+ * @param useHex indicated if the hexadecimal value has to be used
+ * @param softLineBreaks whether to use soft line breaks instead of default hard ones.
+ *
+ * @return The converted String
+ */
+ public String filterSpecialChar(String str, boolean useHex, boolean softLineBreaks) {
+ int length = str.length();
+ int z = (int) 'z';
+ StringBuffer ret = new StringBuffer(length);
+ for (int i = 0; i < length; i++) {
+ char ch = str.charAt(i);
+
+ if (ch == '\\') {
+ ret.append("\\\\");
+ } else if (ch == '\n') {
+ if(softLineBreaks) {
+ ret.append("\\line ");
+ } else {
+ ret.append("\\par ");
+ }
+ } else if (ch == '\t') {
+ ret.append("\\tab ");
+ } else if (((int) ch) > z && this.documentSettings.isAlwaysUseUnicode()) {
+ if(useHex) {
+ ret.append("\\\'").append(Long.toHexString((long) ch));
+ } else {
+ ret.append("\\u").append((long) ch).append('?');
+ }
+ } else {
+ ret.append(ch);
+ }
+ }
+ String s = ret.toString();
+ if(s.indexOf("$newpage$") >= 0) {
+ String before = s.substring(0, s.indexOf("$newpage$"));
+ String after = s.substring(s.indexOf("$newpage$") + 9);
+ ret = new StringBuffer(before);
+ ret.append("\\page\\par ");
+ ret.append(after);
+ return ret.toString();
+ }
+ return s;
+ }
+
+ /**
+ * Whether to automagically generate table of contents entries when
+ * adding Chapters or Sections.
+ *
+ * @param autogenerate Whether to automatically generate TOC entries
+ */
+ public void setAutogenerateTOCEntries(boolean autogenerate) {
+ this.autogenerateTOCEntries = autogenerate;
+ }
+
+ /**
+ * Get whether to autmatically generate table of contents entries
+ *
+ * @return Wheter to automatically generate TOC entries
+ */
+ public boolean getAutogenerateTOCEntries() {
+ return this.autogenerateTOCEntries;
+ }
+
+ /**
+ * Sets the rtf data cache style to use. Valid values are given in the
+ * RtfDataCache class.
+ *
+ * @param dataCacheStyle The style to use.
+ * @throws DocumentException If data has already been written into the data cache.
+ * @throws IOException If the disk cache could not be initialised.
+ */
+ public void setDataCacheStyle(int dataCacheStyle) throws DocumentException, IOException {
+ if(dataWritten) {
+ throw new DocumentException("Data has already been written into the data cache. You can not change the cache style anymore.");
+ }
+ switch(dataCacheStyle) {
+ case RtfDataCache.CACHE_MEMORY : this.data = new RtfMemoryCache(); break;
+ case RtfDataCache.CACHE_DISK : this.data = new RtfDiskCache(); break;
+ default : this.data = new RtfMemoryCache(); break;
+ }
+ }
+
+ /**
+ * Gets the RtfDocumentSettings that specify how the rtf document is generated.
+ *
+ * @return The current RtfDocumentSettings.
+ */
+ public RtfDocumentSettings getDocumentSettings() {
+ return this.documentSettings;
+ }
+
+ /**
+ * Gets the last RtfBasicElement that was directly added to the RtfDocument.
+ *
+ * @return The last RtfBasicElement that was directly added to the RtfDocument.
+ */
+ public RtfBasicElement getLastElementWritten() {
+ return this.lastElementWritten;
+ }
+}
diff --git a/src/main/java/com/lowagie/text/rtf/document/RtfDocumentHeader.java b/src/main/java/com/lowagie/text/rtf/document/RtfDocumentHeader.java
new file mode 100644
index 0000000..1ae8027
--- /dev/null
+++ b/src/main/java/com/lowagie/text/rtf/document/RtfDocumentHeader.java
@@ -0,0 +1,310 @@
+/*
+ * $Id: RtfDocumentHeader.java,v 1.16 2005/12/24 13:14:59 hallm Exp $
+ * $Name: $
+ *
+ * Copyright 2003, 2004 by Mark Hall
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the ?GNU LIBRARY GENERAL PUBLIC LICENSE?), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.rtf.document;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+
+import com.lowagie.text.HeaderFooter;
+import com.lowagie.text.rtf.RtfElement;
+import com.lowagie.text.rtf.headerfooter.RtfHeaderFooter;
+import com.lowagie.text.rtf.headerfooter.RtfHeaderFooterGroup;
+import com.lowagie.text.rtf.list.RtfList;
+import com.lowagie.text.rtf.list.RtfListTable;
+import com.lowagie.text.rtf.style.RtfColor;
+import com.lowagie.text.rtf.style.RtfColorList;
+import com.lowagie.text.rtf.style.RtfFont;
+import com.lowagie.text.rtf.style.RtfFontList;
+import com.lowagie.text.rtf.style.RtfParagraphStyle;
+import com.lowagie.text.rtf.style.RtfStylesheetList;
+
+
+/**
+ * The RtfDocumentHeader contains all classes required for the generation of
+ * the document header area.
+ *
+ * @version $Version:$
+ * @author Mark Hall (mhall@edu.uni-klu.ac.at)
+ */
+public class RtfDocumentHeader extends RtfElement {
+ /**
+ * Constant for the title page
+ */
+ private static final byte[] TITLE_PAGE = "\\titlepg".getBytes();
+ /**
+ * Constant for facing pages
+ */
+ private static final byte[] FACING_PAGES = "\\facingp".getBytes();
+
+ /**
+ * The code page to use
+ */
+ private RtfCodePage codePage = null;
+ /**
+ * Stores all the colors used in the document
+ */
+ private RtfColorList colorList = null;
+ /**
+ * Stores all the fonts used in the document
+ */
+ private RtfFontList fontList = null;
+ /**
+ * Manages List tables
+ */
+ private RtfListTable listTable = null;
+ /**
+ * Stores all paragraph styles used in the document.
+ */
+ private RtfStylesheetList stylesheetList = null;
+ /**
+ * The information group with author/subject/keywords/title/producer/creationdate data
+ */
+ private RtfInfoGroup infoGroup = null;
+ /**
+ * The page settings
+ */
+ private RtfPageSetting pageSetting = null;
+ /**
+ * The current RtfHeaderFooterGroup for the header
+ */
+ private RtfHeaderFooterGroup header = null;
+ /**
+ * The current RtfHeaderFooterGroup for the footer
+ */
+ private RtfHeaderFooterGroup footer = null;
+
+ /**
+ * Constructs a RtfDocumentHeader for a RtfDocument
+ *
+ * @param doc The RtfDocument this RtfDocumentHeader belongs to
+ */
+ protected RtfDocumentHeader(RtfDocument doc) {
+ super(doc);
+ }
+
+ /**
+ * Initialises the RtfDocumentHeader.
+ */
+ protected void init() {
+ this.codePage = new RtfCodePage(this.document);
+ this.colorList = new RtfColorList(this.document);
+ this.fontList = new RtfFontList(this.document);
+ this.listTable = new RtfListTable(this.document);
+ this.stylesheetList = new RtfStylesheetList(this.document);
+ this.infoGroup = new RtfInfoGroup(this.document);
+ this.pageSetting = new RtfPageSetting(this.document);
+ this.header = new RtfHeaderFooterGroup(this.document, RtfHeaderFooter.TYPE_HEADER);
+ this.footer = new RtfHeaderFooterGroup(this.document, RtfHeaderFooter.TYPE_FOOTER);
+ }
+
+ /**
+ * Write the contents of the document header area.
+ *
+ * @return A byte array with the contents of the document header area
+ */
+ public byte[] write() {
+ ByteArrayOutputStream result = new ByteArrayOutputStream();
+ try {
+ result.write(this.codePage.writeDefinition());
+ result.write(this.fontList.writeDefinition());
+ result.write(this.colorList.writeDefinition());
+ result.write(this.stylesheetList.writeDefinition());
+ result.write(this.listTable.writeDefinition());
+ result.write(this.infoGroup.write());
+ result.write(this.pageSetting.writeDefinition());
+ result.write(writeSectionDefinition());
+ } catch(IOException ioe) {
+ ioe.printStackTrace();
+ }
+ return result.toByteArray();
+ }
+
+ /**
+ * Writes the section definition data
+ *
+ * @return A byte array with the section definition data
+ */
+ public byte[] writeSectionDefinition() {
+ ByteArrayOutputStream result = new ByteArrayOutputStream();
+ try {
+ if(header.hasTitlePage() || footer.hasTitlePage()) {
+ result.write(TITLE_PAGE);
+ header.setHasTitlePage();
+ footer.setHasTitlePage();
+ }
+ if(header.hasFacingPages() || footer.hasFacingPages()) {
+ result.write(FACING_PAGES);
+ header.setHasFacingPages();
+ footer.setHasFacingPages();
+ }
+ result.write(footer.write());
+ result.write(header.write());
+ result.write(pageSetting.writeSectionDefinition());
+ } catch(IOException ioe) {
+ ioe.printStackTrace();
+ }
+ return result.toByteArray();
+ }
+
+ /**
+ * Gets the number of the specified RtfFont
+ *
+ * @param font The RtfFont for which to get the number
+ * @return The number of the font
+ */
+ public int getFontNumber(RtfFont font) {
+ return this.fontList.getFontNumber(font);
+ }
+
+ /**
+ * Gets the number of the specified RtfColor
+ *
+ * @param color The RtfColor for which to get the number
+ * @return The number of the color
+ */
+ public int getColorNumber(RtfColor color) {
+ return this.colorList.getColorNumber(color);
+ }
+
+ /**
+ * Gets the number of the specified RtfList
+ *
+ * @param list The RtfList for which to get the number
+ * @return The number of the list
+ */
+ public int getListNumber(RtfList list) {
+ return this.listTable.getListNumber(list);
+ }
+
+ /**
+ * Gets the RtfParagraphStyle with the given style name.
+ *
+ * @param styleName The style name of the RtfParagraphStyle to get.
+ * @return The RtfParagraphStyle with the given style name or null.
+ */
+ public RtfParagraphStyle getRtfParagraphStyle(String styleName) {
+ return this.stylesheetList.getRtfParagraphStyle(styleName);
+ }
+
+ /**
+ * Removes a RtfList from the list table
+ *
+ * @param list The RtfList to remove
+ */
+ public void freeListNumber(RtfList list) {
+ this.listTable.freeListNumber(list);
+ }
+
+ /**
+ * Gets the RtfPageSetting object of this RtfDocument
+ *
+ * @return The RtfPageSetting object
+ */
+ public RtfPageSetting getPageSetting() {
+ return this.pageSetting;
+ }
+
+ /**
+ * Adds an RtfInfoElement to the list of RtfInfoElements
+ *
+ * @param rtfInfoElement The RtfInfoElement to add
+ */
+ public void addInfoElement(RtfInfoElement rtfInfoElement) {
+ this.infoGroup.add(rtfInfoElement);
+ }
+
+ /**
+ * Sets the current header to use
+ *
+ * @param header The HeaderFooter to use as header
+ */
+ public void setHeader(HeaderFooter header) {
+ if(header != null) {
+ if(header instanceof RtfHeaderFooterGroup) {
+ this.header = new RtfHeaderFooterGroup(this.document, (RtfHeaderFooterGroup) header, RtfHeaderFooter.TYPE_HEADER);
+ } else if(header instanceof RtfHeaderFooter) {
+ this.header = new RtfHeaderFooterGroup(this.document, (RtfHeaderFooter) header, RtfHeaderFooter.TYPE_HEADER);
+ } else {
+ this.header = new RtfHeaderFooterGroup(this.document, header, RtfHeaderFooter.TYPE_HEADER);
+ }
+ } else {
+ this.header = new RtfHeaderFooterGroup(this.document, RtfHeaderFooter.TYPE_HEADER);
+ }
+ }
+
+ /**
+ * Sets the current footer to use
+ *
+ * @param footer The HeaderFooter to use as footer
+ */
+ public void setFooter(HeaderFooter footer) {
+ if(footer != null) {
+ if(footer instanceof RtfHeaderFooterGroup) {
+ this.footer = new RtfHeaderFooterGroup(this.document, (RtfHeaderFooterGroup) footer, RtfHeaderFooter.TYPE_FOOTER);
+ } else if(footer instanceof RtfHeaderFooter) {
+ this.footer = new RtfHeaderFooterGroup(this.document, (RtfHeaderFooter) footer, RtfHeaderFooter.TYPE_FOOTER);
+ } else {
+ this.footer = new RtfHeaderFooterGroup(this.document, footer, RtfHeaderFooter.TYPE_FOOTER);
+ }
+ } else {
+ this.footer = new RtfHeaderFooterGroup(this.document, RtfHeaderFooter.TYPE_FOOTER);
+ }
+ }
+
+ /**
+ * Registers the RtfParagraphStyle for further use in the document.
+ *
+ * @param rtfParagraphStyle The RtfParagraphStyle to register.
+ */
+ public void registerParagraphStyle(RtfParagraphStyle rtfParagraphStyle) {
+ this.stylesheetList.registerParagraphStyle(rtfParagraphStyle);
+ }
+}
diff --git a/src/main/java/com/lowagie/text/rtf/document/RtfDocumentSettings.java b/src/main/java/com/lowagie/text/rtf/document/RtfDocumentSettings.java
new file mode 100644
index 0000000..15b5b92
--- /dev/null
+++ b/src/main/java/com/lowagie/text/rtf/document/RtfDocumentSettings.java
@@ -0,0 +1,182 @@
+/*
+ * $Id: RtfDocumentSettings.java,v 1.4 2005/12/24 13:14:59 hallm Exp $
+ * $Name: $
+ *
+ * Copyright 2003, 2004, 2005 by Mark Hall
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the ?GNU LIBRARY GENERAL PUBLIC LICENSE?), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.rtf.document;
+
+import com.lowagie.text.rtf.style.RtfParagraphStyle;
+
+
+/**
+ * The RtfDocumentSettings contains output specific settings. These settings modify
+ * how the actual document is then generated and some settings may mean that some
+ * RTF readers can't read the document or render it wrongly.
+ *
+ * @version $Revision: 1.4 $
+ * @author Mark Hall (mhall@edu.uni-klu.ac.at)
+ */
+public class RtfDocumentSettings {
+
+ /**
+ * The RtfDocument this RtfDocumentSettings belongs to.
+ */
+ private RtfDocument document = null;
+ /**
+ * Whether to also output the table row definition after the cell content.
+ */
+ private boolean outputTableRowDefinitionAfter = true;
+ /**
+ * Whether to output the line breaks that make the rtf document source more readable.
+ */
+ private boolean outputDebugLineBreaks = true;
+ /**
+ * Whether to always generate soft linebreaks for \n in Chunks.
+ */
+ private boolean alwaysGenerateSoftLinebreaks = false;
+ /**
+ * Whether to always translate characters past 'z' into unicode representations.
+ */
+ private boolean alwaysUseUnicode = true;
+
+
+ /**
+ * Constructs a new RtfDocumentSettings object.
+ *
+ * @param document The RtfDocument this RtfDocumentSettings belong to.
+ */
+ public RtfDocumentSettings(RtfDocument document) {
+ this.document = document;
+ }
+
+ /**
+ * Gets whether to output the line breaks for increased rtf document readability.
+ *
+ * @return Whether to output line breaks.
+ */
+ public boolean isOutputDebugLineBreaks() {
+ return outputDebugLineBreaks;
+ }
+
+ /**
+ * Sets whether to output the line breaks for increased rtf document readability.
+ * Some line breaks may be added where the rtf specification demands it.
+ *
+ * @param outputDebugLineBreaks The outputDebugLineBreaks to set.
+ */
+ public void setOutputDebugLineBreaks(boolean outputDebugLineBreaks) {
+ this.outputDebugLineBreaks = outputDebugLineBreaks;
+ }
+
+ /**
+ * Gets whether the table row definition should also be written after the cell content.
+ *
+ * @return Returns the outputTableRowDefinitionAfter.
+ */
+ public boolean isOutputTableRowDefinitionAfter() {
+ return outputTableRowDefinitionAfter;
+ }
+
+ /**
+ * Sets whether the table row definition should also be written after the cell content.
+ * This is recommended to be set to <code>true</code> if you need Word2000 compatiblity and
+ * <code>false</code> if the document should be opened in OpenOffice.org Writer.
+ *
+ * @param outputTableRowDefinitionAfter The outputTableRowDefinitionAfter to set.
+ */
+ public void setOutputTableRowDefinitionAfter(
+ boolean outputTableRowDefinitionAfter) {
+ this.outputTableRowDefinitionAfter = outputTableRowDefinitionAfter;
+ }
+
+ /**
+ * Gets whether all linebreaks inside Chunks are generated as soft linebreaks.
+ *
+ * @return <code>True</code> if soft linebreaks are generated, <code>false</code> for hard linebreaks.
+ */
+ public boolean isAlwaysGenerateSoftLinebreaks() {
+ return this.alwaysGenerateSoftLinebreaks;
+ }
+
+ /**
+ * Sets whether to always generate soft linebreaks.
+ *
+ * @param alwaysGenerateSoftLinebreaks Whether to always generate soft linebreaks.
+ */
+ public void setAlwaysGenerateSoftLinebreaks(boolean alwaysGenerateSoftLinebreaks) {
+ this.alwaysGenerateSoftLinebreaks = alwaysGenerateSoftLinebreaks;
+ }
+
+ /**
+ * Gets whether all characters bigger than 'z' are represented as unicode.
+ *
+ * @return <code>True</code> if unicode representation is used, <code>false</code> otherwise.
+ */
+ public boolean isAlwaysUseUnicode() {
+ return this.alwaysUseUnicode;
+ }
+
+ /**
+ * Sets whether to represent all characters bigger than 'z' as unicode.
+ *
+ * @param alwaysUseUnicode <code>True</code> to use unicode representation, <code>false</code> otherwise.
+ */
+ public void setAlwaysUseUnicode(boolean alwaysUseUnicode) {
+ this.alwaysUseUnicode = alwaysUseUnicode;
+ }
+
+ /**
+ * Registers the RtfParagraphStyle for further use in the document. This does not need to be
+ * done for the default styles in the RtfParagraphStyle object. Those are added automatically.
+ *
+ * @param rtfParagraphStyle The RtfParagraphStyle to register.
+ */
+ public void registerParagraphStyle(RtfParagraphStyle rtfParagraphStyle) {
+ this.document.getDocumentHeader().registerParagraphStyle(rtfParagraphStyle);
+ }
+}
diff --git a/src/main/java/com/lowagie/text/rtf/document/RtfInfoElement.java b/src/main/java/com/lowagie/text/rtf/document/RtfInfoElement.java
new file mode 100644
index 0000000..5549684
--- /dev/null
+++ b/src/main/java/com/lowagie/text/rtf/document/RtfInfoElement.java
@@ -0,0 +1,181 @@
+/*
+ * $Id: RtfInfoElement.java,v 1.16 2005/05/04 14:33:53 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2003, 2004 by Mark Hall
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the ?GNU LIBRARY GENERAL PUBLIC LICENSE?), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.rtf.document;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+import com.lowagie.text.Meta;
+import com.lowagie.text.rtf.RtfElement;
+
+
+/**
+ * Stores one information group element. Valid elements are
+ * author, title, subject, keywords, producer and creationdate.
+ *
+ * @version $Version:$
+ * @author Mark Hall (mhall@edu.uni-klu.ac.at)
+ */
+public class RtfInfoElement extends RtfElement {
+
+ /**
+ * Constant for the author element
+ */
+ private static final byte[] INFO_AUTHOR = "\\author".getBytes();
+ /**
+ * Constant for the subject element
+ */
+ private static final byte[] INFO_SUBJECT = "\\subject".getBytes();
+ /**
+ * Constant for the keywords element
+ */
+ private static final byte[] INFO_KEYWORDS = "\\keywords".getBytes();
+ /**
+ * Constant for the title element
+ */
+ private static final byte[] INFO_TITLE = "\\title".getBytes();
+ /**
+ * Constant for the producer element
+ */
+ private static final byte[] INFO_PRODUCER = "\\operator".getBytes();
+ /**
+ * Constant for the creationdate element
+ */
+ private static final byte[] INFO_CREATION_DATE = "\\creationdate".getBytes();
+
+ /**
+ * The type of this RtfInfoElement. The values from Element.INFO_ELEMENT_NAME are used.
+ */
+ private int infoType = -1;
+ /**
+ * The content of this RtfInfoElement
+ */
+ private String content = "";
+
+ /**
+ * Constructs a RtfInfoElement based on the given Meta object
+ *
+ * @param doc The RtfDocument this RtfInfoElement belongs to
+ * @param meta The Meta object this RtfInfoElement is based on
+ */
+ public RtfInfoElement(RtfDocument doc, Meta meta) {
+ super(doc);
+ infoType = meta.type();
+ content = meta.content();
+ }
+
+ /**
+ * Writes this RtfInfoElement
+ *
+ * @return A byte array containing the RtfInfoElement data
+ */
+ public byte[] write() {
+ ByteArrayOutputStream result = new ByteArrayOutputStream();
+ try {
+ result.write(OPEN_GROUP);
+ switch(infoType) {
+ case Meta.AUTHOR:
+ result.write(INFO_AUTHOR);
+ break;
+ case Meta.SUBJECT:
+ result.write(INFO_SUBJECT);
+ break;
+ case Meta.KEYWORDS:
+ result.write(INFO_KEYWORDS);
+ break;
+ case Meta.TITLE:
+ result.write(INFO_TITLE);
+ break;
+ case Meta.PRODUCER:
+ result.write(INFO_PRODUCER);
+ break;
+ case Meta.CREATIONDATE:
+ result.write(INFO_CREATION_DATE);
+ break;
+ default:
+ result.write(INFO_AUTHOR);
+ break;
+ }
+ result.write(DELIMITER);
+ if(infoType == Meta.CREATIONDATE) {
+ result.write(convertDate(content).getBytes());
+ } else {
+ result.write(content.getBytes());
+ }
+ result.write(CLOSE_GROUP);
+ } catch(IOException ioe) {
+ ioe.printStackTrace();
+ }
+ return result.toByteArray();
+ }
+
+ /**
+ * Converts a date from the format used by iText to the format required by
+ * rtf.<br>iText: EEE MMM dd HH:mm:ss zzz yyyy - rtf: \\'yr'yyyy\\'mo'MM\\'dy'dd\\'hr'HH\\'min'mm\\'sec'ss
+ *
+ * @param date The date formated by iText
+ * @return The date formated for rtf
+ */
+ private String convertDate(String date) {
+ SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy");
+ try {
+ Date creationDate = sdf.parse(date);
+ sdf = new SimpleDateFormat("\\'yr'yyyy\\'mo'MM\\'dy'dd\\'hr'HH\\'min'mm\\'sec'ss");
+ return sdf.format(creationDate);
+ } catch(ParseException pe) {
+ pe.printStackTrace();
+ return "";
+ }
+ }
+}
diff --git a/src/main/java/com/lowagie/text/rtf/document/RtfInfoGroup.java b/src/main/java/com/lowagie/text/rtf/document/RtfInfoGroup.java
new file mode 100644
index 0000000..fc6c46a
--- /dev/null
+++ b/src/main/java/com/lowagie/text/rtf/document/RtfInfoGroup.java
@@ -0,0 +1,117 @@
+/*
+ * $Id: RtfInfoGroup.java,v 1.16 2005/05/04 14:33:52 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2003, 2004 by Mark Hall
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the ?GNU LIBRARY GENERAL PUBLIC LICENSE?), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.rtf.document;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.util.ArrayList;
+
+import com.lowagie.text.rtf.RtfElement;
+
+
+/**
+ * The RtfInfoGroup stores information group elements.
+ *
+ * @version $Version:$
+ * @author Mark Hall (mhall@edu.uni-klu.ac.at)
+ */
+public class RtfInfoGroup extends RtfElement {
+ /**
+ * Information group starting tag
+ */
+ private static final byte[] INFO_GROUP = "\\info".getBytes();
+
+ /**
+ * The RtfInfoElements that belong to this RtfInfoGroup
+ */
+ ArrayList infoElements = null;
+
+ /**
+ * Constructs a RtfInfoGroup belonging to a RtfDocument
+ *
+ * @param doc The RtfDocument this RtfInfoGroup belongs to
+ */
+ public RtfInfoGroup(RtfDocument doc) {
+ super(doc);
+ infoElements = new ArrayList();
+ }
+
+ /**
+ * Adds an RtfInfoElement to the RtfInfoGroup
+ *
+ * @param infoElement The RtfInfoElement to add
+ */
+ public void add(RtfInfoElement infoElement) {
+ this.infoElements.add(infoElement);
+ }
+
+ /**
+ * Writes the RtfInfoGroup and its RtfInfoElement elements.
+ *
+ * @return A byte array containing the group and its elements
+ */
+ public byte[] write() {
+ ByteArrayOutputStream result = new ByteArrayOutputStream();
+ try {
+ result.write(OPEN_GROUP);
+ result.write(INFO_GROUP);
+ for(int i = 0; i < infoElements.size(); i++) {
+ RtfInfoElement infoElement = (RtfInfoElement) infoElements.get(i);
+ result.write(infoElement.write());
+ }
+ result.write(CLOSE_GROUP);
+ result.write((byte)'\n');
+ } catch(IOException ioe) {
+ ioe.printStackTrace();
+ }
+ return result.toByteArray();
+ }
+}
diff --git a/src/main/java/com/lowagie/text/rtf/document/RtfPageSetting.java b/src/main/java/com/lowagie/text/rtf/document/RtfPageSetting.java
new file mode 100644
index 0000000..fd456e4
--- /dev/null
+++ b/src/main/java/com/lowagie/text/rtf/document/RtfPageSetting.java
@@ -0,0 +1,435 @@
+/*
+ * $Id: RtfPageSetting.java,v 1.15 2005/02/23 16:57:45 hallm Exp $
+ * $Name: $
+ *
+ * Copyright 2003, 2004 by Mark Hall
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the ?GNU LIBRARY GENERAL PUBLIC LICENSE?), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.rtf.document;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+
+import com.lowagie.text.PageSize;
+import com.lowagie.text.Rectangle;
+import com.lowagie.text.rtf.RtfElement;
+import com.lowagie.text.rtf.RtfExtendedElement;
+
+
+/**
+ * The RtfPageSetting stores the page size / page margins for a RtfDocument.
+ * INTERNAL CLASS - NOT TO BE USED DIRECTLY
+ *
+ * @version $Version:$
+ * @author Mark Hall (mhall@edu.uni-klu.ac.at)
+ */
+public class RtfPageSetting extends RtfElement implements RtfExtendedElement {
+
+ /**
+ * Constant for the page height
+ */
+ private static final byte[] PAGE_WIDTH = "\\paperw".getBytes();
+ /**
+ * Constant for the page width
+ */
+ private static final byte[] PAGE_HEIGHT = "\\paperh".getBytes();
+ /**
+ * Constant for the left margin
+ */
+ private static final byte[] MARGIN_LEFT = "\\margl".getBytes();
+ /**
+ * Constant for the right margin
+ */
+ private static final byte[] MARGIN_RIGHT = "\\margr".getBytes();
+ /**
+ * Constant for the top margin
+ */
+ private static final byte[] MARGIN_TOP = "\\margt".getBytes();
+ /**
+ * Constant for the bottom margin
+ */
+ private static final byte[] MARGIN_BOTTOM = "\\margb".getBytes();
+ /**
+ * Constant for landscape
+ */
+ private static final byte[] LANDSCAPE = "\\lndscpsxn".getBytes();
+ /**
+ * Constant for the section page width
+ */
+ private static final byte[] SECTION_PAGE_WIDTH = "\\pgwsxn".getBytes();
+ /**
+ * Constant for the section page height
+ */
+ private static final byte[] SECTION_PAGE_HEIGHT = "\\pghsxn".getBytes();
+ /**
+ * Constant for the section left margin
+ */
+ private static final byte[] SECTION_MARGIN_LEFT = "\\marglsxn".getBytes();
+ /**
+ * Constant for the section right margin
+ */
+ private static final byte[] SECTION_MARGIN_RIGHT = "\\margrsxn".getBytes();
+ /**
+ * Constant for the section top margin
+ */
+ private static final byte[] SECTION_MARGIN_TOP = "\\margtsxn".getBytes();
+ /**
+ * Constant for the section bottom margin
+ */
+ private static final byte[] SECTION_MARGIN_BOTTOM = "\\margbsxn".getBytes();
+
+ /**
+ * The page width to use
+ */
+ private int pageWidth = 11906;
+ /**
+ * The page height to use
+ */
+ private int pageHeight = 16840;
+ /**
+ * The left margin to use
+ */
+ private int marginLeft = 1800;
+ /**
+ * The right margin to use
+ */
+ private int marginRight = 1800;
+ /**
+ * The top margin to use
+ */
+ private int marginTop = 1440;
+ /**
+ * The bottom margin to use
+ */
+ private int marginBottom = 1440;
+ /**
+ * Whether the page is portrait or landscape
+ */
+ private boolean landscape = false;
+
+ /**
+ * Constructs a new RtfPageSetting object belonging to a RtfDocument.
+ *
+ * @param doc The RtfDocument this RtfPageSetting belongs to
+ */
+ public RtfPageSetting(RtfDocument doc) {
+ super(doc);
+ }
+
+ /**
+ * Writes the page size / page margin definition
+ *
+ * @return A byte array with the page size / page margin definition
+ */
+ public byte[] writeDefinition() {
+ ByteArrayOutputStream result = new ByteArrayOutputStream();
+ try {
+ result.write(PAGE_WIDTH);
+ result.write(intToByteArray(pageWidth));
+ result.write(PAGE_HEIGHT);
+ result.write(intToByteArray(pageHeight));
+ result.write(MARGIN_LEFT);
+ result.write(intToByteArray(marginLeft));
+ result.write(MARGIN_RIGHT);
+ result.write(intToByteArray(marginRight));
+ result.write(MARGIN_TOP);
+ result.write(intToByteArray(marginTop));
+ result.write(MARGIN_BOTTOM);
+ result.write(intToByteArray(marginBottom));
+ result.write((byte)'\n');
+ } catch(IOException ioe) {
+ ioe.printStackTrace();
+ }
+ return result.toByteArray();
+ }
+
+ /**
+ * Writes the definition part for a new section
+ *
+ * @return A byte array containing the definition for a new section
+ */
+ public byte[] writeSectionDefinition() {
+ ByteArrayOutputStream result = new ByteArrayOutputStream();
+ try {
+ if(landscape) {
+ result.write(LANDSCAPE);
+ result.write(SECTION_PAGE_WIDTH);
+ result.write(intToByteArray(pageWidth));
+ result.write(SECTION_PAGE_HEIGHT);
+ result.write(intToByteArray(pageHeight));
+ result.write((byte)'\n');
+ } else {
+ result.write(SECTION_PAGE_WIDTH);
+ result.write(intToByteArray(pageWidth));
+ result.write(SECTION_PAGE_HEIGHT);
+ result.write(intToByteArray(pageHeight));
+ result.write((byte)'\n');
+ }
+ result.write(SECTION_MARGIN_LEFT);
+ result.write(intToByteArray(marginLeft));
+ result.write(SECTION_MARGIN_RIGHT);
+ result.write(intToByteArray(marginRight));
+ result.write(SECTION_MARGIN_TOP);
+ result.write(intToByteArray(marginTop));
+ result.write(SECTION_MARGIN_BOTTOM);
+ result.write(intToByteArray(marginBottom));
+ } catch(IOException ioe) {
+ ioe.printStackTrace();
+ }
+ return result.toByteArray();
+ }
+
+ /**
+ * Gets the bottom margin
+ *
+ * @return Returns the bottom margin
+ */
+ public int getMarginBottom() {
+ return marginBottom;
+ }
+
+ /**
+ * Sets the bottom margin
+ *
+ * @param marginBottom The bottom margin to use
+ */
+ public void setMarginBottom(int marginBottom) {
+ this.marginBottom = marginBottom;
+ }
+
+ /**
+ * Gets the left margin
+ *
+ * @return Returns the left margin
+ */
+ public int getMarginLeft() {
+ return marginLeft;
+ }
+
+ /**
+ * Sets the left margin to use
+ *
+ * @param marginLeft The left margin to use
+ */
+ public void setMarginLeft(int marginLeft) {
+ this.marginLeft = marginLeft;
+ }
+
+ /**
+ * Gets the right margin
+ *
+ * @return Returns the right margin
+ */
+ public int getMarginRight() {
+ return marginRight;
+ }
+
+ /**
+ * Sets the right margin to use
+ *
+ * @param marginRight The right margin to use
+ */
+ public void setMarginRight(int marginRight) {
+ this.marginRight = marginRight;
+ }
+
+ /**
+ * Gets the top margin
+ *
+ * @return Returns the top margin
+ */
+ public int getMarginTop() {
+ return marginTop;
+ }
+
+ /**
+ * Sets the top margin to use
+ *
+ * @param marginTop The top margin to use
+ */
+ public void setMarginTop(int marginTop) {
+ this.marginTop = marginTop;
+ }
+
+ /**
+ * Gets the page height
+ *
+ * @return Returns the page height
+ */
+ public int getPageHeight() {
+ return pageHeight;
+ }
+
+ /**
+ * Sets the page height to use
+ *
+ * @param pageHeight The page height to use
+ */
+ public void setPageHeight(int pageHeight) {
+ this.pageHeight = pageHeight;
+ }
+
+ /**
+ * Gets the page width
+ *
+ * @return Returns the page width
+ */
+ public int getPageWidth() {
+ return pageWidth;
+ }
+
+ /**
+ * Sets the page width to use
+ *
+ * @param pageWidth The page width to use
+ */
+ public void setPageWidth(int pageWidth) {
+ this.pageWidth = pageWidth;
+ }
+
+ /**
+ * Set the page size to use. This method will use guessFormat to try to guess the correct
+ * page format. If no format could be guessed, the sizes from the pageSize are used and
+ * the landscape setting is determined by comparing width and height;
+ *
+ * @param pageSize The pageSize to use
+ */
+ public void setPageSize(Rectangle pageSize) {
+ if(!guessFormat(pageSize, false)) {
+ this.pageWidth = (int) (pageSize.width() * RtfElement.TWIPS_FACTOR);
+ this.pageHeight = (int) (pageSize.height() * RtfElement.TWIPS_FACTOR);
+ this.landscape = pageWidth > pageHeight;
+ }
+ }
+
+ /**
+ * This method tries to fit the <code>Rectangle pageSize</code> to one of the predefined PageSize rectangles.
+ * If a match is found the pageWidth and pageHeight will be set according to values determined from files
+ * generated by MS Word2000 and OpenOffice 641. If no match is found the method will try to match the rotated
+ * Rectangle by calling itself with the parameter rotate set to true.
+ *
+ * @param pageSize the page size for which to guess the correct format
+ * @param rotate Whether we should try to rotate the size befor guessing the format
+ * @return <code>True</code> if the format was guessed, <code>false/<code> otherwise
+ */
+ private boolean guessFormat(Rectangle pageSize, boolean rotate) {
+ if (rotate) {
+ pageSize = pageSize.rotate();
+ }
+ if (rectEquals(pageSize, PageSize.A3)) {
+ pageWidth = 16837;
+ pageHeight = 23811;
+ landscape = rotate;
+ return true;
+ }
+ if (rectEquals(pageSize, PageSize.A4)) {
+ pageWidth = 11907;
+ pageHeight = 16840;
+ landscape = rotate;
+ return true;
+ }
+ if (rectEquals(pageSize, PageSize.A5)) {
+ pageWidth = 8391;
+ pageHeight = 11907;
+ landscape = rotate;
+ return true;
+ }
+ if (rectEquals(pageSize, PageSize.A6)) {
+ pageWidth = 5959;
+ pageHeight = 8420;
+ landscape = rotate;
+ return true;
+ }
+ if (rectEquals(pageSize, PageSize.B4)) {
+ pageWidth = 14570;
+ pageHeight = 20636;
+ landscape = rotate;
+ return true;
+ }
+ if (rectEquals(pageSize, PageSize.B5)) {
+ pageWidth = 10319;
+ pageHeight = 14572;
+ landscape = rotate;
+ return true;
+ }
+ if (rectEquals(pageSize, PageSize.HALFLETTER)) {
+ pageWidth = 7927;
+ pageHeight = 12247;
+ landscape = rotate;
+ return true;
+ }
+ if (rectEquals(pageSize, PageSize.LETTER)) {
+ pageWidth = 12242;
+ pageHeight = 15842;
+ landscape = rotate;
+ return true;
+ }
+ if (rectEquals(pageSize, PageSize.LEGAL)) {
+ pageWidth = 12252;
+ pageHeight = 20163;
+ landscape = rotate;
+ return true;
+ }
+ if (!rotate && guessFormat(pageSize, true)) {
+ int x = pageWidth;
+ pageWidth = pageHeight;
+ pageHeight = x;
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * This method compares to Rectangles. They are considered equal if width and height are the same
+ *
+ * @param rect1 The first Rectangle to compare
+ * @param rect2 The second Rectangle to compare
+ * @return <code>True</code> if the Rectangles equal, <code>false</code> otherwise
+ */
+ private boolean rectEquals(Rectangle rect1, Rectangle rect2) {
+ return (rect1.width() == rect2.width()) && (rect1.height() == rect2.height());
+ }
+}
diff --git a/src/main/java/com/lowagie/text/rtf/document/output/RtfDataCache.java b/src/main/java/com/lowagie/text/rtf/document/output/RtfDataCache.java
new file mode 100644
index 0000000..f9b3e9d
--- /dev/null
+++ b/src/main/java/com/lowagie/text/rtf/document/output/RtfDataCache.java
@@ -0,0 +1,86 @@
+/*
+ * $Id: RtfDataCache.java,v 1.1 2005/02/02 18:09:32 hallm Exp $
+ * $Name: $
+ *
+ * Copyright 2005 by Mark Hall
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the ?GNU LIBRARY GENERAL PUBLIC LICENSE?), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.rtf.document.output;
+
+import java.io.IOException;
+import java.io.OutputStream;
+
+
+/**
+ * The RtfDataCache interface must be implemented by classes wishing to
+ * act as caches for the rtf document data.
+ *
+ * @version $Revision: 1.1 $
+ * @author Mark Hall (mhall@edu.uni-klu.ac.at)
+ */
+public interface RtfDataCache {
+ /**
+ * Constant for caching into memory.
+ */
+ public static final int CACHE_MEMORY = 2;
+ /**
+ * Constant for caching to the disk.
+ */
+ public static final int CACHE_DISK = 1;
+ /**
+ * Get the OutputStream that the RtfDocument can write to.
+ *
+ * @return The OutputStream the RtfDocument can use.
+ */
+ public OutputStream getOutputStream();
+ /**
+ * Write the content of the cache into the OutputStream.
+ *
+ * @param target The OutputStream to write the content into.
+ * @throws IOException If an error occurs reading/writing.
+ */
+ public void writeTo(OutputStream target) throws IOException;
+}
diff --git a/src/main/java/com/lowagie/text/rtf/document/output/RtfDiskCache.java b/src/main/java/com/lowagie/text/rtf/document/output/RtfDiskCache.java
new file mode 100644
index 0000000..77053ac
--- /dev/null
+++ b/src/main/java/com/lowagie/text/rtf/document/output/RtfDiskCache.java
@@ -0,0 +1,113 @@
+/*
+ * $Id: RtfDiskCache.java,v 1.1 2005/02/02 18:09:32 hallm Exp $
+ * $Name: $
+ *
+ * Copyright 2005 by Mark Hall
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the ?GNU LIBRARY GENERAL PUBLIC LICENSE?), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.rtf.document.output;
+
+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+
+
+/**
+ * The RtfFileCache is a RtfDataCache that uses a temporary file
+ * to store the rtf document data. Not so fast, but doesn't use any
+ * memory (just disk space).
+ *
+ * @version $Revision: 1.1 $
+ * @author Mark Hall (mhall@edu.uni-klu.ac.at)
+ */
+public class RtfDiskCache implements RtfDataCache {
+
+ /**
+ * The BufferedOutputStream that stores the cache data.
+ */
+ private BufferedOutputStream data = null;
+ /**
+ * The temporary file to store the data in.
+ */
+ private File tempFile = null;
+
+ /**
+ * Constructs a RtfFileCache. Creates the temp file.
+ *
+ * @throws IOException If the temporary file could not be created.
+ */
+ public RtfDiskCache() throws IOException {
+ this.tempFile = File.createTempFile("iText", null);
+ this.data = new BufferedOutputStream(new FileOutputStream(tempFile));
+ }
+
+ /**
+ * Gets the BufferedOutputStream to write to.
+ */
+ public OutputStream getOutputStream() {
+ return this.data;
+ }
+
+ /**
+ * Writes the content of the temporary file into the OutputStream.
+ */
+ public void writeTo(OutputStream target) throws IOException {
+ this.data.close();
+ BufferedInputStream tempIn = new BufferedInputStream(new FileInputStream(this.tempFile));
+ byte[] buffer = new byte[8192];
+ int bytesRead = -1;
+ while((bytesRead = tempIn.read(buffer)) >= 0) {
+ target.write(buffer, 0, bytesRead);
+ }
+ tempIn.close();
+ this.tempFile.delete();
+ }
+
+}
diff --git a/src/main/java/com/lowagie/text/rtf/document/output/RtfMemoryCache.java b/src/main/java/com/lowagie/text/rtf/document/output/RtfMemoryCache.java
new file mode 100644
index 0000000..002355f
--- /dev/null
+++ b/src/main/java/com/lowagie/text/rtf/document/output/RtfMemoryCache.java
@@ -0,0 +1,93 @@
+/*
+ * $Id: RtfMemoryCache.java,v 1.1 2005/02/02 18:09:31 hallm Exp $
+ * $Name: $
+ *
+ * Copyright 2005 by Mark Hall
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the ?GNU LIBRARY GENERAL PUBLIC LICENSE?), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.rtf.document.output;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+
+
+/**
+ * The RtfMemoryCache is an RtfDataCache that keeps the whole rtf document
+ * data in memory. Fast but memory intensive.
+ *
+ * @version $Revision: 1.1 $
+ * @author Mark Hall (mhall@edu.uni-klu.ac.at)
+ */
+public class RtfMemoryCache implements RtfDataCache {
+
+ /**
+ * The buffer for the rtf document data.
+ */
+ private ByteArrayOutputStream data = null;
+
+ /**
+ * Constructs a RtfMemoryCache.
+ */
+ public RtfMemoryCache() {
+ this.data = new ByteArrayOutputStream();
+ }
+
+ /**
+ * Gets the ByteArrayOutputStream.
+ */
+ public OutputStream getOutputStream() {
+ return this.data;
+ }
+
+ /**
+ * Writes the content of the ByteArrayOutputStream into the OutputStream.
+ */
+ public void writeTo(OutputStream target) throws IOException {
+ this.data.writeTo(target);
+ }
+
+}
diff --git a/src/main/java/com/lowagie/text/rtf/field/RtfAnchor.java b/src/main/java/com/lowagie/text/rtf/field/RtfAnchor.java
new file mode 100644
index 0000000..3823c3d
--- /dev/null
+++ b/src/main/java/com/lowagie/text/rtf/field/RtfAnchor.java
@@ -0,0 +1,122 @@
+/*
+ * $Id: RtfAnchor.java,v 1.9 2005/07/07 14:44:47 hallm Exp $
+ * $Name: $
+ *
+ * Copyright 2004 by Mark Hall
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the ?GNU LIBRARY GENERAL PUBLIC LICENSE?), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.rtf.field;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+
+import com.lowagie.text.Anchor;
+import com.lowagie.text.rtf.document.RtfDocument;
+import com.lowagie.text.rtf.text.RtfPhrase;
+
+
+/**
+ *
+ * @version $Version:$
+ * @author Mark Hall (mhall@edu.uni-klu.ac.at)
+ * @author Werner Daehn (Werner.Daehn@BusinessObjects.com)
+ */
+public class RtfAnchor extends RtfField {
+
+ /**
+ * Constant for a hyperlink
+ */
+ private static final byte[] HYPERLINK = "HYPERLINK".getBytes();
+
+ /**
+ * The url of this RtfAnchor
+ */
+ private String url = "";
+ /**
+ * The RtfPhrase to display for the url
+ */
+ private RtfPhrase content = null;
+
+ /**
+ * Constructs a RtfAnchor based on a RtfField
+ *
+ * @param doc The RtfDocument this RtfAnchor belongs to
+ * @param anchor The Anchor this RtfAnchor is based on
+ */
+ public RtfAnchor(RtfDocument doc, Anchor anchor) {
+ super(doc);
+ this.url = anchor.reference();
+ this.content = new RtfPhrase(doc, anchor);
+ }
+
+ /**
+ * Write the field instructions for this RtfAnchor. Sets the field
+ * type to HYPERLINK and then writes the url.
+ *
+ * @return The field instructions for this RtfAnchor
+ * @throws IOException
+ */
+ protected byte[] writeFieldInstContent() throws IOException {
+ ByteArrayOutputStream result = new ByteArrayOutputStream();
+
+ result.write(HYPERLINK);
+ result.write(DELIMITER);
+ result.write(url.getBytes());
+
+ return result.toByteArray();
+ }
+
+ /**
+ * Write the field result for this RtfAnchor. Writes the content
+ * of the RtfPhrase.
+ *
+ * @return The field result for this RtfAnchor
+ * @throws IOException
+ */
+ protected byte[] writeFieldResultContent() throws IOException {
+ return content.write();
+ }
+}
diff --git a/src/main/java/com/lowagie/text/rtf/field/RtfField.java b/src/main/java/com/lowagie/text/rtf/field/RtfField.java
new file mode 100644
index 0000000..6eaa525
--- /dev/null
+++ b/src/main/java/com/lowagie/text/rtf/field/RtfField.java
@@ -0,0 +1,445 @@
+/*
+ * $Id: RtfField.java,v 1.11 2005/09/05 16:02:40 hallm Exp $
+ * $Name: $
+ *
+ * Copyright 2004 by Mark Hall
+ * Uses code Copyright 2002
+ * <a href="http://www.smb-tec.com">SMB</a>
+ * <a href="mailto:Dirk.Weigenand@smb-tec.com">Dirk.Weigenand@smb-tec.com</a>
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the ?GNU LIBRARY GENERAL PUBLIC LICENSE?), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.rtf.field;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+
+import com.lowagie.text.Chunk;
+import com.lowagie.text.Font;
+import com.lowagie.text.rtf.RtfBasicElement;
+import com.lowagie.text.rtf.document.RtfDocument;
+import com.lowagie.text.rtf.style.RtfFont;
+
+
+/**
+ * The RtfField class is an abstract base class for all rtf field functionality.
+ * Subclasses only need to implement the two abstract methods writeFieldInstContent
+ * and writeFieldResultContent. All other field functionality is handled by the
+ * RtfField class.
+ *
+ * @version $Version:$
+ * @author Mark Hall (mhall@edu.uni-klu.ac.at)
+ * @author <a href="mailto:Dirk.Weigenand@smb-tec.com">Dirk Weigenand</a>
+ */
+public abstract class RtfField extends Chunk implements RtfBasicElement {
+
+ /**
+ * Constant for a rtf field
+ */
+ private static final byte[] FIELD = "\\field".getBytes();
+ /**
+ * Constant for a dirty field
+ */
+ private static final byte[] FIELD_DIRTY = "\\flddirty".getBytes();
+ /**
+ * Constant for a private field
+ */
+ private static final byte[] FIELD_PRIVATE = "\\fldpriv".getBytes();
+ /**
+ * Constant for a locked field
+ */
+ private static final byte[] FIELD_LOCKED = "\\fldlock".getBytes();
+ /**
+ * Constant for a edited field
+ */
+ private static final byte[] FIELD_EDIT = "\\fldedit".getBytes();
+ /**
+ * Constant for an alt field
+ */
+ private static final byte[] FIELD_ALT = "\\fldalt".getBytes();
+ /**
+ * Constant for the field instructions
+ */
+ private static final byte[] FIELD_INSTRUCTIONS = "\\*\\fldinst".getBytes();
+ /**
+ * Constant for the field result
+ */
+ private static final byte[] FIELD_RESULT = "\\fldrslt".getBytes();
+
+ /**
+ * Is the field dirty
+ */
+ private boolean fieldDirty = false;
+ /**
+ * Is the field edited
+ */
+ private boolean fieldEdit = false;
+ /**
+ * Is the field locked
+ */
+ private boolean fieldLocked = false;
+ /**
+ * Is the field private
+ */
+ private boolean fieldPrivate = false;
+ /**
+ * Is it an alt field
+ */
+ private boolean fieldAlt = false;
+ /**
+ * Whether this RtfField is in a table
+ */
+ private boolean inTable = false;
+ /**
+ * Whether this RtfElement is in a header
+ */
+ private boolean inHeader = false;
+ /**
+ * The RtfDocument this RtfField belongs to
+ */
+ protected RtfDocument document = null;
+ /**
+ * The RtfFont of this RtfField
+ */
+ private RtfFont font = null;
+
+ /**
+ * Constructs a RtfField for a RtfDocument. This is not very usefull,
+ * since the RtfField by itself does not do anything. Use one of the
+ * subclasses instead.
+ *
+ * @param doc The RtfDocument this RtfField belongs to.
+ */
+ protected RtfField(RtfDocument doc) {
+ this(doc, new Font());
+ }
+
+ /**
+ * Constructs a RtfField for a RtfDocument. This is not very usefull,
+ * since the RtfField by itself does not do anything. Use one of the
+ * subclasses instead.
+ *
+ * @param doc The RtfDocument this RtfField belongs to.
+ * @param font The Font this RtfField should use
+ */
+ protected RtfField(RtfDocument doc, Font font) {
+ super("", font);
+ this.document = doc;
+ this.font = new RtfFont(this.document, font);
+ }
+
+ /**
+ * Sets the RtfDocument this RtfElement belongs to
+ *
+ * @param doc The RtfDocument to use
+ */
+ public void setRtfDocument(RtfDocument doc) {
+ this.document = doc;
+ this.font.setRtfDocument(this.document);
+ }
+
+ /**
+ * Writes the field beginning. Also writes field properties.
+ *
+ * @return A byte array with the field beginning.
+ * @throws IOException
+ */
+ private byte[] writeFieldBegin() throws IOException {
+ ByteArrayOutputStream result = new ByteArrayOutputStream();
+
+ result.write(OPEN_GROUP);
+ result.write(FIELD);
+
+ if (fieldDirty) {
+ result.write(FIELD_DIRTY);
+ }
+ if (fieldEdit) {
+ result.write(FIELD_EDIT);
+ }
+ if (fieldLocked) {
+ result.write(FIELD_LOCKED);
+ }
+ if (fieldPrivate) {
+ result.write(FIELD_PRIVATE);
+ }
+
+ return result.toByteArray();
+ }
+
+ /**
+ * Writes the beginning of the field instruction area.
+ *
+ * @return The beginning of the field instruction area
+ * @throws IOException
+ */
+ private byte[] writeFieldInstBegin() throws IOException {
+ ByteArrayOutputStream result = new ByteArrayOutputStream();
+
+ result.write(OPEN_GROUP);
+ result.write(FIELD_INSTRUCTIONS);
+ result.write(DELIMITER);
+
+ return result.toByteArray();
+ }
+
+ /**
+ * Writes the content of the field instruction area. Override this
+ * method in your subclasses.
+ *
+ * @return The content of the field instruction area
+ * @throws IOException If an error occurs.
+ */
+ protected abstract byte[] writeFieldInstContent() throws IOException;
+
+ /**
+ * Writes the end of the field instruction area.
+ *
+ * @return A byte array containing the end of the field instruction area
+ * @throws IOException
+ */
+ private byte[] writeFieldInstEnd() throws IOException {
+ ByteArrayOutputStream result = new ByteArrayOutputStream();
+
+ if (fieldAlt) {
+ result.write(DELIMITER);
+ result.write(FIELD_ALT);
+ }
+ result.write(CLOSE_GROUP);
+
+ return result.toByteArray();
+ }
+
+ /**
+ * Writes the beginning of the field result area
+ *
+ * @return A byte array containing the beginning of the field result area
+ * @throws IOException
+ */
+ private byte[] writeFieldResultBegin() throws IOException {
+ ByteArrayOutputStream result = new ByteArrayOutputStream();
+
+ result.write(OPEN_GROUP);
+ result.write(FIELD_RESULT);
+ result.write(DELIMITER);
+
+ return result.toByteArray();
+ }
+
+ /**
+ * Writes the content of the pre-calculated field result. Override this
+ * method in your subclasses.
+ *
+ * @return A byte array containing the field result
+ * @throws IOException If an error occurs
+ */
+ protected abstract byte[] writeFieldResultContent() throws IOException;
+
+ /**
+ * Writes the end of the field result area
+ *
+ * @return A byte array containing the end of the field result area
+ * @throws IOException
+ */
+ private byte[] writeFieldResultEnd() throws IOException {
+ ByteArrayOutputStream result = new ByteArrayOutputStream();
+
+ result.write(DELIMITER);
+ result.write(CLOSE_GROUP);
+
+ return result.toByteArray();
+ }
+
+ /**
+ * Writes the end of the field
+ *
+ * @return A byte array containing the end of the field
+ * @throws IOException
+ */
+ private byte[] writeFieldEnd() throws IOException {
+ ByteArrayOutputStream result = new ByteArrayOutputStream();
+
+ result.write(CLOSE_GROUP);
+
+ return result.toByteArray();
+ }
+
+ /**
+ * Write the content of this RtfField.
+ *
+ * @return A byte array containing the content of this RtfField
+ */
+ public byte[] write() {
+ ByteArrayOutputStream result = new ByteArrayOutputStream();
+ try {
+ result.write(this.font.writeBegin());
+ result.write(writeFieldBegin());
+ result.write(writeFieldInstBegin());
+ result.write(writeFieldInstContent());
+ result.write(writeFieldInstEnd());
+ result.write(writeFieldResultBegin());
+ result.write(writeFieldResultContent());
+ result.write(writeFieldResultEnd());
+ result.write(writeFieldEnd());
+ result.write(this.font.writeEnd());
+ } catch(IOException ioe) {
+ ioe.printStackTrace();
+ }
+ return result.toByteArray();
+ }
+
+ /**
+ * Get whether this field is an alt field
+ *
+ * @return Returns whether this field is an alt field
+ */
+ public boolean isFieldAlt() {
+ return fieldAlt;
+ }
+
+ /**
+ * Set whether this field is an alt field
+ *
+ * @param fieldAlt The value to use
+ */
+ public void setFieldAlt(boolean fieldAlt) {
+ this.fieldAlt = fieldAlt;
+ }
+
+ /**
+ * Get whether this field is dirty
+ *
+ * @return Returns whether this field is dirty
+ */
+ public boolean isFieldDirty() {
+ return fieldDirty;
+ }
+
+ /**
+ * Set whether this field is dirty
+ *
+ * @param fieldDirty The value to use
+ */
+ public void setFieldDirty(boolean fieldDirty) {
+ this.fieldDirty = fieldDirty;
+ }
+
+ /**
+ * Get whether this field is edited
+ *
+ * @return Returns whether this field is edited
+ */
+ public boolean isFieldEdit() {
+ return fieldEdit;
+ }
+
+ /**
+ * Set whether this field is edited.
+ *
+ * @param fieldEdit The value to use
+ */
+ public void setFieldEdit(boolean fieldEdit) {
+ this.fieldEdit = fieldEdit;
+ }
+
+ /**
+ * Get whether this field is locked
+ *
+ * @return Returns the fieldLocked.
+ */
+ public boolean isFieldLocked() {
+ return fieldLocked;
+ }
+
+ /**
+ * Set whether this field is locked
+ * @param fieldLocked The value to use
+ */
+ public void setFieldLocked(boolean fieldLocked) {
+ this.fieldLocked = fieldLocked;
+ }
+
+ /**
+ * Get whether this field is private
+ *
+ * @return Returns the fieldPrivate.
+ */
+ public boolean isFieldPrivate() {
+ return fieldPrivate;
+ }
+
+ /**
+ * Set whether this field is private
+ *
+ * @param fieldPrivate The value to use
+ */
+ public void setFieldPrivate(boolean fieldPrivate) {
+ this.fieldPrivate = fieldPrivate;
+ }
+
+ /**
+ * Sets whether this RtfField is in a table
+ *
+ * @param inTable <code>True</code> if this RtfField is in a table, <code>false</code> otherwise
+ */
+ public void setInTable(boolean inTable) {
+ this.inTable = inTable;
+ }
+
+ /**
+ * Sets whether this RtfField is in a header
+ *
+ * @param inHeader <code>True</code> if this RtfField is in a header, <code>false</code> otherwise
+ */
+ public void setInHeader(boolean inHeader) {
+ this.inHeader = inHeader;
+ }
+
+ /**
+ * An RtfField is never empty.
+ */
+ public boolean isEmpty() {
+ return false;
+ }
+}
diff --git a/src/main/java/com/lowagie/text/rtf/field/RtfPageNumber.java b/src/main/java/com/lowagie/text/rtf/field/RtfPageNumber.java
new file mode 100644
index 0000000..3b69295
--- /dev/null
+++ b/src/main/java/com/lowagie/text/rtf/field/RtfPageNumber.java
@@ -0,0 +1,83 @@
+/*
+ * Created on Aug 10, 2004
+ *
+ * To change the template for this generated file go to
+ * Window - Preferences - Java - Code Generation - Code and Comments
+ */
+package com.lowagie.text.rtf.field;
+
+import java.io.IOException;
+
+import com.lowagie.text.Font;
+import com.lowagie.text.rtf.document.RtfDocument;
+
+
+/**
+ * The RtfPageNumber provides the page number field in rtf documents.
+ *
+ * @version $Revision: 1.7 $
+ * @author Mark Hall (mhall@edu.uni-klu.ac.at)
+ * @author <a href="mailto:Steffen.Stundzig@smb-tec.com">Steffen.Stundzig@smb-tec.com</a>
+ */
+public class RtfPageNumber extends RtfField {
+
+ /**
+ * Constant for the page number
+ */
+ private static final byte[] PAGE_NUMBER = "PAGE".getBytes();
+
+ /**
+ * Constructs a RtfPageNumber. This can be added anywhere to add a page number field.
+ */
+ public RtfPageNumber() {
+ super(null);
+ }
+
+ /**
+ * Constructs a RtfPageNumber with a specified Font. This can be added anywhere to
+ * add a page number field.
+ * @param font
+ */
+ public RtfPageNumber(Font font) {
+ super(null, font);
+ }
+
+ /**
+ * Constructs a RtfPageNumber object.
+ *
+ * @param doc The RtfDocument this RtfPageNumber belongs to
+ */
+ public RtfPageNumber(RtfDocument doc) {
+ super(doc);
+ }
+
+ /**
+ * Constructs a RtfPageNumber object with a specific font.
+ *
+ * @param doc The RtfDocument this RtfPageNumber belongs to
+ * @param font The Font to use
+ */
+ public RtfPageNumber(RtfDocument doc, Font font) {
+ super(doc, font);
+ }
+
+ /**
+ * Writes the field instruction content
+ *
+ * @return A byte array containing "PAGE"
+ * @throws IOException
+ */
+ protected byte[] writeFieldInstContent() throws IOException {
+ return PAGE_NUMBER;
+ }
+
+ /**
+ * Writes the field result content
+ *
+ * @return An empty byte array
+ * @throws IOException
+ */
+ protected byte[] writeFieldResultContent() throws IOException {
+ return new byte[0];
+ }
+}
diff --git a/src/main/java/com/lowagie/text/rtf/field/RtfTOCEntry.java b/src/main/java/com/lowagie/text/rtf/field/RtfTOCEntry.java
new file mode 100644
index 0000000..f65e424
--- /dev/null
+++ b/src/main/java/com/lowagie/text/rtf/field/RtfTOCEntry.java
@@ -0,0 +1,163 @@
+/*
+ * $Id: RtfTOCEntry.java,v 1.9 2004/12/25 10:18:11 hallm Exp $
+ * $Name: $
+ *
+ * Copyright 2004 by Mark Hall
+ * Uses code Copyright 2002
+ * <a href="mailto:Steffen.Stundzig@smb-tec.com">Steffen.Stundzig@smb-tec.com</a>
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the ?GNU LIBRARY GENERAL PUBLIC LICENSE?), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.rtf.field;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+
+import com.lowagie.text.Font;
+
+
+/**
+ * The RtfTOCEntry is used together with the RtfTableOfContents to generate a table of
+ * contents. Add the RtfTOCEntry in those locations in the document where table of
+ * contents entries should link to
+ *
+ * @version $Version:$
+ * @author Mark Hall (mhall@edu.uni-klu.ac.at)
+ * @author <a href="mailto:Steffen.Stundzig@smb-tec.com">Steffen.Stundzig@smb-tec.com</a>
+ */
+public class RtfTOCEntry extends RtfField {
+
+ /**
+ * Constant for the beginning of hidden text
+ */
+ private static final byte[] TEXT_HIDDEN_ON = "\\v".getBytes();
+ /**
+ * Constant for the end of hidden text
+ */
+ private static final byte[] TEXT_HIDDEN_OFF = "\\v0".getBytes();
+ /**
+ * Constant for a TOC entry with page numbers
+ */
+ private static final byte[] TOC_ENTRY_PAGE_NUMBER = "\\tc".getBytes();
+ /**
+ * Constant for a TOC entry without page numbers
+ */
+ private static final byte[] TOC_ENTRY_NO_PAGE_NUMBER = "\\tcn".getBytes();
+
+ /**
+ * The entry text of this RtfTOCEntry
+ */
+ private String entry = "";
+ /**
+ * Whether to show page numbers in the table of contents
+ */
+ private boolean showPageNumber = true;
+
+ /**
+ * Constructs a RtfTOCEntry with a certain entry text.
+ *
+ * @param entry The entry text to display
+ * @param font The Font to use
+ */
+ public RtfTOCEntry(String entry, Font font) {
+ super(null, font);
+ if(entry != null) {
+ this.entry = entry;
+ }
+ }
+
+ /**
+ * Writes the content of the RtfTOCEntry
+ *
+ * @return A byte array with the contents of the RtfTOCEntry
+ */
+ public byte[] write() {
+ ByteArrayOutputStream result = new ByteArrayOutputStream();
+ try {
+ result.write(TEXT_HIDDEN_ON);
+ result.write(OPEN_GROUP);
+ if(this.showPageNumber) {
+ result.write(TOC_ENTRY_PAGE_NUMBER);
+ } else {
+ result.write(TOC_ENTRY_NO_PAGE_NUMBER);
+ }
+ result.write(DELIMITER);
+ result.write(this.document.filterSpecialChar(this.entry, true, false).getBytes());
+ result.write(CLOSE_GROUP);
+ result.write(TEXT_HIDDEN_OFF);
+ } catch(IOException ioe) {
+ ioe.printStackTrace();
+ }
+ return result.toByteArray();
+ }
+
+ /**
+ * Sets whether to display a page number in the table of contents, or not
+ *
+ * @param showPageNumber Whether to display a page number or not
+ */
+ public void setShowPageNumber(boolean showPageNumber) {
+ this.showPageNumber = showPageNumber;
+ }
+
+ /**
+ * UNUSED
+ * @return null
+ * @throws IOException never thrown
+ */
+ protected byte[] writeFieldInstContent() throws IOException {
+ return null;
+ }
+
+ /**
+ * UNUSED
+ * @return null
+ * @throws IOException never thrown
+ */
+ protected byte[] writeFieldResultContent() throws IOException {
+ return null;
+ }
+
+}
diff --git a/src/main/java/com/lowagie/text/rtf/field/RtfTableOfContents.java b/src/main/java/com/lowagie/text/rtf/field/RtfTableOfContents.java
new file mode 100644
index 0000000..b6738c1
--- /dev/null
+++ b/src/main/java/com/lowagie/text/rtf/field/RtfTableOfContents.java
@@ -0,0 +1,109 @@
+/*
+ * $Id: RtfTableOfContents.java,v 1.8 2004/12/14 12:51:54 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2004 by Mark Hall
+ * Uses code Copyright 2002
+ * <a href="mailto:Steffen.Stundzig@smb-tec.com">Steffen.Stundzig@smb-tec.com</a>
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the ?GNU LIBRARY GENERAL PUBLIC LICENSE?), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.rtf.field;
+
+import java.io.IOException;
+
+import com.lowagie.text.Font;
+
+
+
+/**
+ * The RtfTableOfContents together with multiple RtfTOCEntry objects generates a table
+ * of contents. The table of contents will display no entries in the viewing program
+ * and the user will have to update it first. A text to inform the user of this is
+ * displayed instead.
+ *
+ * @version $Version:$
+ * @author Mark Hall (mhall@edu.uni-klu.ac.at)
+ * @author <a href="mailto:Steffen.Stundzig@smb-tec.com">Steffen.Stundzig@smb-tec.com</a>
+ */
+public class RtfTableOfContents extends RtfField {
+
+ /**
+ * The default text to display
+ */
+ private String defaultText = "Table of Contents - Click to update";
+
+ /**
+ * Constructs a RtfTableOfContents. The default text is the text that is displayed
+ * before the user updates the table of contents
+ *
+ * @param defaultText The default text to display
+ * @param font The Font to use
+ */
+ public RtfTableOfContents(String defaultText, Font font) {
+ super(null, font);
+ this.defaultText = defaultText;
+ }
+
+ /**
+ * Writes the field instruction content
+ *
+ * @return A byte array containing with the field instructions
+ * @throws IOException
+ */
+ protected byte[] writeFieldInstContent() throws IOException {
+ return "TOC \\\\f \\\\h \\\\u \\\\o \"1-5\" ".getBytes();
+ }
+
+ /**
+ * Writes the field result content
+ *
+ * @return An byte array containing the default text
+ * @throws IOException
+ */
+ protected byte[] writeFieldResultContent() throws IOException {
+ return defaultText.getBytes();
+ }
+}
diff --git a/src/main/java/com/lowagie/text/rtf/field/RtfTotalPageNumber.java b/src/main/java/com/lowagie/text/rtf/field/RtfTotalPageNumber.java
new file mode 100644
index 0000000..a776fd6
--- /dev/null
+++ b/src/main/java/com/lowagie/text/rtf/field/RtfTotalPageNumber.java
@@ -0,0 +1,128 @@
+/*
+ * $Id: RtfTotalPageNumber.java,v 1.3 2005/05/13 12:09:14 hallm Exp $
+ * $Name: $
+ *
+ * Copyright 2005 Jose Hurtado <a href="mailto:jose.hurtado@gft.com">jose.hurtado@gft.com</a>
+ * Parts Copyright 2005 Mark Hall
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the ?GNU LIBRARY GENERAL PUBLIC LICENSE?), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.rtf.field;
+
+import java.io.IOException;
+
+import com.lowagie.text.Font;
+import com.lowagie.text.rtf.document.RtfDocument;
+import com.lowagie.text.rtf.field.RtfField;
+
+/**
+ * The RtfTotalPageNumber provides the total number of pages field in rtf documents.
+ *
+ * @version $Version:$
+ * @author Jose Hurtado (jose.hurtado@gft.com)
+ * @author Mark Hall (mhall@edu.uni-klu.ac.at)
+ */
+public class RtfTotalPageNumber extends RtfField {
+
+ /**
+ * Constant for arabic total page numbers.
+ */
+ private static final byte[] ARABIC_TOTAL_PAGES = "NUMPAGES \\\\* Arabic".getBytes();
+
+ /**
+ * Constructs a RtfTotalPageNumber. This can be added anywhere to add a total number of pages field.
+ */
+ public RtfTotalPageNumber() {
+ super(null);
+ }
+
+ /**
+ * Constructs a RtfTotalPageNumber with a specified Font. This can be added anywhere
+ * to add a total number of pages field.
+ * @param font
+ */
+ public RtfTotalPageNumber(Font font) {
+ super(null, font);
+ }
+
+ /**
+ * Constructs a RtfTotalPageNumber object.
+ *
+ * @param doc The RtfDocument this RtfTotalPageNumber belongs to
+ */
+ public RtfTotalPageNumber(RtfDocument doc) {
+ super(doc);
+ }
+
+ /**
+ * Constructs a RtfTotalPageNumber object with a specific font.
+ *
+ * @param doc The RtfDocument this RtfTotalPageNumber belongs to
+ * @param font The Font to use
+ */
+ public RtfTotalPageNumber(RtfDocument doc, Font font) {
+ super(doc, font);
+ }
+
+ /**
+ * Writes the field NUMPAGES instruction with Arabic format
+ *
+ * @return A byte array containing "NUMPAGES \\\\* Arabic".
+ * @throws IOException
+ */
+ protected byte[] writeFieldInstContent() throws IOException {
+ return ARABIC_TOTAL_PAGES;
+ }
+
+ /**
+ * Writes the field result content
+ *
+ * @return An byte array containing "1".
+ * @throws IOException
+ */
+ protected byte[] writeFieldResultContent() throws IOException {
+ return "1".getBytes();
+ }
+}
diff --git a/src/main/java/com/lowagie/text/rtf/graphic/RtfImage.java b/src/main/java/com/lowagie/text/rtf/graphic/RtfImage.java
new file mode 100644
index 0000000..c0446f8
--- /dev/null
+++ b/src/main/java/com/lowagie/text/rtf/graphic/RtfImage.java
@@ -0,0 +1,306 @@
+/*
+ * $Id: RtfImage.java,v 1.23 2005/12/24 13:14:28 hallm Exp $
+ * $Name: $
+ *
+ * Copyright 2001, 2002, 2003, 2004 by Mark Hall
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the ?GNU LIBRARY GENERAL PUBLIC LICENSE?), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.rtf.graphic;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+import com.lowagie.text.DocumentException;
+import com.lowagie.text.Element;
+import com.lowagie.text.Image;
+import com.lowagie.text.pdf.codec.wmf.MetaDo;
+import com.lowagie.text.rtf.RtfElement;
+import com.lowagie.text.rtf.document.RtfDocument;
+import com.lowagie.text.rtf.style.RtfParagraphStyle;
+import com.lowagie.text.rtf.text.RtfParagraph;
+
+
+/**
+ * The RtfImage contains one image. Supported image types are jpeg, png, wmf, bmp.
+ *
+ * @version $Revision: 1.23 $
+ * @author Mark Hall (mhall@edu.uni-klu.ac.at)
+ * @author Paulo Soares
+ */
+public class RtfImage extends RtfElement {
+
+ /**
+ * Constant for the shape/picture group
+ */
+ private static final byte[] PICTURE_GROUP = "\\*\\shppict".getBytes();
+ /**
+ * Constant for a picture
+ */
+ private static final byte[] PICTURE = "\\pict".getBytes();
+ /**
+ * Constant for a jpeg image
+ */
+ private static final byte[] PICTURE_JPEG = "\\jpegblip".getBytes();
+ /**
+ * Constant for a png image
+ */
+ private static final byte[] PICTURE_PNG = "\\pngblip".getBytes();
+ /**
+ * Constant for a bmp image
+ */
+ private static final byte[] PICTURE_BMP = "\\dibitmap0".getBytes();
+ /**
+ * Constant for a wmf image
+ */
+ private static final byte[] PICTURE_WMF = "\\wmetafile8".getBytes();
+ /**
+ * Constant for the picture width
+ */
+ private static final byte[] PICTURE_WIDTH = "\\picw".getBytes();
+ /**
+ * Constant for the picture height
+ */
+ private static final byte[] PICTURE_HEIGHT = "\\pich".getBytes();
+ /**
+ * Constant for the picture width scale
+ */
+ private static final byte[] PICTURE_SCALED_WIDTH = "\\picwgoal".getBytes();
+ /**
+ * Constant for the picture height scale
+ */
+ private static final byte[] PICTURE_SCALED_HEIGHT = "\\pichgoal".getBytes();
+
+ /**
+ * The type of image this is.
+ */
+ private int imageType = Image.ORIGINAL_NONE;
+ /**
+ * The actual image. Already formated for direct inclusion in the rtf document
+ */
+ private byte[] image = new byte[0];
+ /**
+ * The alignment of this picture
+ */
+ private int alignment = Element.ALIGN_LEFT;
+ /**
+ * The width of this picture
+ */
+ private float width = 0;
+ /**
+ * The height of this picutre
+ */
+ private float height = 0;
+ /**
+ * The intended display width of this picture
+ */
+ private float plainWidth = 0;
+ /**
+ * The intended display height of this picture
+ */
+ private float plainHeight = 0;
+ /**
+ * Whether this RtfImage is a top level element and should
+ * be an extra paragraph.
+ */
+ private boolean topLevelElement = false;
+
+ /**
+ * Constructs a RtfImage for an Image.
+ *
+ * @param doc The RtfDocument this RtfImage belongs to
+ * @param image The Image that this RtfImage wraps
+ * @throws DocumentException If an error occured accessing the image content
+ */
+ public RtfImage(RtfDocument doc, Image image) throws DocumentException {
+ super(doc);
+ imageType = image.getOriginalType();
+ if (!(imageType == Image.ORIGINAL_JPEG || imageType == Image.ORIGINAL_BMP
+ || imageType == Image.ORIGINAL_PNG || imageType == Image.ORIGINAL_WMF)) {
+ throw new DocumentException("Only BMP, PNG, WMF and JPEG images are supported by the RTF Writer");
+ }
+ alignment = image.alignment();
+ width = image.width();
+ height = image.height();
+ plainWidth = image.plainWidth();
+ plainHeight = image.plainHeight();
+ this.image = getImage(image);
+ }
+
+ /**
+ * Extracts the image data from the Image. The data is formated for direct inclusion
+ * in a rtf document
+ *
+ * @param image The Image for which to extract the content
+ * @return The image data formated for the rtf document
+ * @throws DocumentException If an error occurs accessing the image content
+ */
+ private byte[] getImage(Image image) throws DocumentException {
+ ByteArrayOutputStream imageTemp = new ByteArrayOutputStream();
+ try {
+ InputStream imageIn;
+ if (imageType == Image.ORIGINAL_BMP) {
+ imageIn = new ByteArrayInputStream(MetaDo.wrapBMP(image));
+ } else {
+ if (image.getOriginalData() == null) {
+ imageIn = image.url().openStream();
+ } else {
+ imageIn = new ByteArrayInputStream(image.getOriginalData());
+ }
+ if (imageType == Image.ORIGINAL_WMF) { //remove the placeable header
+ long skipLength = 22;
+ while(skipLength > 0) {
+ skipLength = skipLength - imageIn.skip(skipLength);
+ }
+ }
+ }
+ int buffer = 0;
+ int count = 0;
+ while((buffer = imageIn.read()) != -1) {
+ String helperStr = Integer.toHexString(buffer);
+ if (helperStr.length() < 2) helperStr = "0" + helperStr;
+ imageTemp.write(helperStr.getBytes());
+ count++;
+ if (count == 64) {
+ imageTemp.write((byte) '\n');
+ count = 0;
+ }
+ }
+ } catch(IOException ioe) {
+ throw new DocumentException(ioe.getMessage());
+ }
+ return imageTemp.toByteArray();
+ }
+
+ /**
+ * Writes the RtfImage content
+ *
+ * @return the RtfImage content
+ */
+ public byte[] write() {
+ ByteArrayOutputStream result = new ByteArrayOutputStream();
+ try {
+ if(this.topLevelElement) {
+ result.write(RtfParagraph.PARAGRAPH_DEFAULTS);
+ }
+ switch(alignment) {
+ case Element.ALIGN_LEFT:
+ result.write(RtfParagraphStyle.ALIGN_LEFT);
+ break;
+ case Element.ALIGN_RIGHT:
+ result.write(RtfParagraphStyle.ALIGN_RIGHT);
+ break;
+ case Element.ALIGN_CENTER:
+ result.write(RtfParagraphStyle.ALIGN_CENTER);
+ break;
+ case Element.ALIGN_JUSTIFIED:
+ result.write(RtfParagraphStyle.ALIGN_JUSTIFY);
+ break;
+ }
+ result.write(OPEN_GROUP);
+ result.write(PICTURE_GROUP);
+ result.write(OPEN_GROUP);
+ result.write(PICTURE);
+ switch(imageType) {
+ case Image.ORIGINAL_JPEG:
+ result.write(PICTURE_JPEG);
+ break;
+ case Image.ORIGINAL_PNG:
+ result.write(PICTURE_PNG);
+ break;
+ case Image.ORIGINAL_WMF:
+ case Image.ORIGINAL_BMP:
+ result.write(PICTURE_WMF);
+ break;
+ }
+ result.write(PICTURE_WIDTH);
+ result.write(intToByteArray((int) width));
+ result.write(PICTURE_HEIGHT);
+ result.write(intToByteArray((int) height));
+ if(width != plainWidth || this.imageType == Image.ORIGINAL_BMP) {
+ result.write(PICTURE_SCALED_WIDTH);
+ result.write(intToByteArray((int) (plainWidth * RtfElement.TWIPS_FACTOR)));
+ }
+ if(height != plainHeight || this.imageType == Image.ORIGINAL_BMP) {
+ result.write(PICTURE_SCALED_HEIGHT);
+ result.write(intToByteArray((int) (plainHeight * RtfElement.TWIPS_FACTOR)));
+ }
+ result.write(DELIMITER);
+ result.write((byte) '\n');
+ result.write(image);
+ result.write(CLOSE_GROUP);
+ result.write(CLOSE_GROUP);
+ if(this.topLevelElement) {
+ result.write(RtfParagraph.PARAGRAPH);
+ result.write(RtfParagraph.PARAGRAPH);
+ }
+ result.write((byte) '\n');
+ } catch(IOException ioe) {
+ ioe.printStackTrace();
+ }
+ return result.toByteArray();
+ }
+
+ /**
+ * Sets the alignment of this RtfImage. Uses the alignments from com.lowagie.text.Element.
+ *
+ * @param alignment The alignment to use.
+ */
+ public void setAlignment(int alignment) {
+ this.alignment = alignment;
+ }
+
+ /**
+ * Set whether this RtfImage should behave like a top level element
+ * and enclose itself in a paragraph.
+ *
+ * @param topLevelElement Whether to behave like a top level element.
+ */
+ public void setTopLevelElement(boolean topLevelElement) {
+ this.topLevelElement = topLevelElement;
+ }
+}
diff --git a/src/main/java/com/lowagie/text/rtf/headerfooter/RtfHeaderFooter.java b/src/main/java/com/lowagie/text/rtf/headerfooter/RtfHeaderFooter.java
new file mode 100644
index 0000000..d338f71
--- /dev/null
+++ b/src/main/java/com/lowagie/text/rtf/headerfooter/RtfHeaderFooter.java
@@ -0,0 +1,326 @@
+/*
+ * Created on Aug 10, 2004
+ *
+ * To change the template for this generated file go to
+ * Window - Preferences - Java - Code Generation - Code and Comments
+ */
+package com.lowagie.text.rtf.headerfooter;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+
+import com.lowagie.text.DocumentException;
+import com.lowagie.text.Element;
+import com.lowagie.text.HeaderFooter;
+import com.lowagie.text.Image;
+import com.lowagie.text.Paragraph;
+import com.lowagie.text.Phrase;
+import com.lowagie.text.Table;
+import com.lowagie.text.rtf.RtfBasicElement;
+import com.lowagie.text.rtf.document.RtfDocument;
+import com.lowagie.text.rtf.field.RtfPageNumber;
+
+
+/**
+ * The RtfHeaderFooter represents one header or footer. This class can be used
+ * directly.
+ *
+ * @version $Id: RtfHeaderFooter.java,v 1.9 2005/09/21 15:26:01 hallm Exp $
+ * @author Mark Hall (mhall@edu.uni-klu.ac.at)
+ */
+public class RtfHeaderFooter extends HeaderFooter implements RtfBasicElement {
+
+ /**
+ * Constant for the header type
+ */
+ public static final int TYPE_HEADER = 1;
+ /**
+ * Constant for the footer type
+ */
+ public static final int TYPE_FOOTER = 2;
+ /**
+ * Constant for displaying the header/footer on the first page
+ */
+ public static final int DISPLAY_FIRST_PAGE = 0;
+ /**
+ * Constant for displaying the header/footer on all pages
+ */
+ public static final int DISPLAY_ALL_PAGES = 1;
+ /**
+ * Constant for displaying the header/footer on all left hand pages
+ */
+ public static final int DISPLAY_LEFT_PAGES = 2;
+ /**
+ * Constant for displaying the header/footer on all right hand pages
+ */
+ public static final int DISPLAY_RIGHT_PAGES = 4;
+
+ /**
+ * Constant for a header on all pages
+ */
+ private static final byte[] HEADER_ALL = "\\header".getBytes();
+ /**
+ * Constant for a header on the first page
+ */
+ private static final byte[] HEADER_FIRST = "\\headerf".getBytes();
+ /**
+ * Constant for a header on all left hand pages
+ */
+ private static final byte[] HEADER_LEFT = "\\headerl".getBytes();
+ /**
+ * Constant for a header on all right hand pages
+ */
+ private static final byte[] HEADER_RIGHT = "\\headerr".getBytes();
+ /**
+ * Constant for a footer on all pages
+ */
+ private static final byte[] FOOTER_ALL = "\\footer".getBytes();
+ /**
+ * Constant for a footer on the first page
+ */
+ private static final byte[] FOOTER_FIRST = "\\footerf".getBytes();
+ /**
+ * Constnat for a footer on the left hand pages
+ */
+ private static final byte[] FOOTER_LEFT = "\\footerl".getBytes();
+ /**
+ * Constant for a footer on the right hand pages
+ */
+ private static final byte[] FOOTER_RIGHT = "\\footerr".getBytes();
+
+ /**
+ * The RtfDocument this RtfHeaderFooter belongs to
+ */
+ private RtfDocument document = null;
+ /**
+ * The content of this RtfHeaderFooter
+ */
+ private Object content = null;
+ /**
+ * The display type of this RtfHeaderFooter. TYPE_HEADER or TYPE_FOOTER
+ */
+ private int type = TYPE_HEADER;
+ /**
+ * The display location of this RtfHeaderFooter. DISPLAY_FIRST_PAGE,
+ * DISPLAY_LEFT_PAGES, DISPLAY_RIGHT_PAGES or DISPLAY_ALL_PAGES
+ */
+ private int displayAt = DISPLAY_ALL_PAGES;
+
+ /**
+ * Constructs a RtfHeaderFooter based on a HeaderFooter with a certain type and displayAt
+ * location. For internal use only.
+ *
+ * @param doc The RtfDocument this RtfHeaderFooter belongs to
+ * @param headerFooter The HeaderFooter to base this RtfHeaderFooter on
+ * @param type The type of RtfHeaderFooter
+ * @param displayAt The display location of this RtfHeaderFooter
+ */
+ protected RtfHeaderFooter(RtfDocument doc, HeaderFooter headerFooter, int type, int displayAt) {
+ super(new Phrase(""), false);
+ this.document = doc;
+ this.type = type;
+ this.displayAt = displayAt;
+ Paragraph par = new Paragraph();
+ par.setAlignment(headerFooter.alignment());
+ if (headerFooter.getBefore() != null) {
+ par.add(headerFooter.getBefore());
+ }
+ if (headerFooter.isNumbered()) {
+ par.add(new RtfPageNumber(this.document));
+ }
+ if (headerFooter.getAfter() != null) {
+ par.add(headerFooter.getAfter());
+ }
+ try {
+ if(this.document != null) {
+ content = this.document.getMapper().mapElement(par);
+ ((RtfBasicElement) this.content).setInHeader(true);
+ } else {
+ content = par;
+ }
+ } catch(DocumentException de) {
+ de.printStackTrace();
+ }
+ }
+
+ /**
+ * Constructs a RtfHeaderFooter as a copy of an existing RtfHeaderFooter.
+ * For internal use only.
+ *
+ * @param doc The RtfDocument this RtfHeaderFooter belongs to
+ * @param headerFooter The RtfHeaderFooter to copy
+ * @param displayAt The display location of this RtfHeaderFooter
+ */
+ protected RtfHeaderFooter(RtfDocument doc, RtfHeaderFooter headerFooter, int displayAt) {
+ super(new Phrase(""), false);
+ this.document = doc;
+ this.content = headerFooter.getContent();
+ this.displayAt = displayAt;
+ if(this.content instanceof Element) {
+ try {
+ this.content = this.document.getMapper().mapElement((Element) this.content);
+ } catch(DocumentException de) {
+ de.printStackTrace();
+ }
+ }
+ ((RtfBasicElement) this.content).setInHeader(true);
+ }
+
+ /**
+ * Constructs a RtfHeaderFooter for a HeaderFooter.
+ *
+ * @param doc The RtfDocument this RtfHeaderFooter belongs to
+ * @param headerFooter The HeaderFooter to base this RtfHeaderFooter on
+ */
+ protected RtfHeaderFooter(RtfDocument doc, HeaderFooter headerFooter) {
+ super(new Phrase(""), false);
+ this.document = doc;
+ Paragraph par = new Paragraph();
+ par.setAlignment(headerFooter.alignment());
+ if (headerFooter.getBefore() != null) {
+ par.add(headerFooter.getBefore());
+ }
+ if (headerFooter.isNumbered()) {
+ par.add(new RtfPageNumber(this.document));
+ }
+ if (headerFooter.getAfter() != null) {
+ par.add(headerFooter.getAfter());
+ }
+ try {
+ content = doc.getMapper().mapElement(par);
+ ((RtfBasicElement) this.content).setInHeader(true);
+ } catch(DocumentException de) {
+ de.printStackTrace();
+ }
+ }
+
+ /**
+ * Constructs a RtfHeaderFooter for any Element.
+ *
+ * @param element The Element to display as content of this RtfHeaderFooter
+ */
+ public RtfHeaderFooter(Element element) {
+ super(new Phrase(""), false);
+ this.content = element;
+ }
+
+ /**
+ * Sets the RtfDocument this RtfElement belongs to
+ *
+ * @param doc The RtfDocument to use
+ */
+ public void setRtfDocument(RtfDocument doc) {
+ this.document = doc;
+ if(this.document != null) {
+ try {
+ if(this.content instanceof Element) {
+ this.content = this.document.getMapper().mapElement((Element) this.content);
+ ((RtfBasicElement) this.content).setInHeader(true);
+ } else if(this.content instanceof RtfBasicElement){
+ ((RtfBasicElement) this.content).setRtfDocument(this.document);
+ ((RtfBasicElement) this.content).setInHeader(true);
+ }
+ } catch(DocumentException de) {
+ de.printStackTrace();
+ }
+ }
+ }
+
+ /**
+ * Writes the content of this RtfHeaderFooter
+ *
+ * @return A byte array with the content of this RtfHeaderFooter
+ */
+ public byte[] write() {
+ ByteArrayOutputStream result = new ByteArrayOutputStream();
+ try {
+ result.write(OPEN_GROUP);
+ if(this.type == TYPE_HEADER) {
+ if(this.displayAt == DISPLAY_ALL_PAGES) {
+ result.write(HEADER_ALL);
+ } else if(this.displayAt == DISPLAY_FIRST_PAGE) {
+ result.write(HEADER_FIRST);
+ } else if(this.displayAt == DISPLAY_LEFT_PAGES) {
+ result.write(HEADER_LEFT);
+ } else if(this.displayAt == DISPLAY_RIGHT_PAGES) {
+ result.write(HEADER_RIGHT);
+ }
+ } else {
+ if(this.displayAt == DISPLAY_ALL_PAGES) {
+ result.write(FOOTER_ALL);
+ } else if(this.displayAt == DISPLAY_FIRST_PAGE) {
+ result.write(FOOTER_FIRST);
+ } else if(this.displayAt == DISPLAY_LEFT_PAGES) {
+ result.write(FOOTER_LEFT);
+ } else if(this.displayAt == DISPLAY_RIGHT_PAGES) {
+ result.write(FOOTER_RIGHT);
+ }
+ }
+ result.write(DELIMITER);
+ if(content instanceof RtfBasicElement) {
+ result.write(((RtfBasicElement) this.content).write());
+ }
+ result.write(CLOSE_GROUP);
+ } catch(IOException ioe) {
+ ioe.printStackTrace();
+ }
+ return result.toByteArray();
+ }
+
+
+ /**
+ * Sets the display location of this RtfHeaderFooter
+ *
+ * @param displayAt The display location to use.
+ */
+ public void setDisplayAt(int displayAt) {
+ this.displayAt = displayAt;
+ }
+
+ /**
+ * Sets the type of this RtfHeaderFooter
+ *
+ * @param type The type to use.
+ */
+ public void setType(int type) {
+ this.type = type;
+ }
+
+ /**
+ * Gets the content of this RtfHeaderFooter
+ *
+ * @return The content of this RtfHeaderFooter
+ */
+ private Object getContent() {
+ return this.content;
+ }
+
+ /**
+ * Unused
+ * @param inTable
+ */
+ public void setInTable(boolean inTable) {
+ }
+
+ /**
+ * Unused
+ * @param inHeader
+ */
+ public void setInHeader(boolean inHeader) {
+ }
+
+ /**
+ * Set the alignment of this RtfHeaderFooter. Passes the setting
+ * on to the contained element.
+ */
+ public void setAlignment(int alignment) {
+ super.setAlignment(alignment);
+ if(this.content instanceof Paragraph) {
+ ((Paragraph) this.content).setAlignment(alignment);
+ } else if(this.content instanceof Table) {
+ ((Table) this.content).setAlignment(alignment);
+ } else if(this.content instanceof Image) {
+ ((Image) this.content).setAlignment(alignment);
+ }
+ }
+}
diff --git a/src/main/java/com/lowagie/text/rtf/headerfooter/RtfHeaderFooterGroup.java b/src/main/java/com/lowagie/text/rtf/headerfooter/RtfHeaderFooterGroup.java
new file mode 100644
index 0000000..e0934bf
--- /dev/null
+++ b/src/main/java/com/lowagie/text/rtf/headerfooter/RtfHeaderFooterGroup.java
@@ -0,0 +1,393 @@
+/*
+ * Created on Aug 6, 2004
+ *
+ * To change the template for this generated file go to
+ * Window - Preferences - Java - Code Generation - Code and Comments
+ */
+package com.lowagie.text.rtf.headerfooter;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+
+import com.lowagie.text.HeaderFooter;
+import com.lowagie.text.Phrase;
+import com.lowagie.text.rtf.RtfBasicElement;
+import com.lowagie.text.rtf.document.RtfDocument;
+
+
+/**
+ * The RtfHeaderFooterGroup holds 0 - 3 RtfHeaderFooters that create a group
+ * of headers or footers.
+ *
+ * @version $Version:$
+ * @author Mark Hall (mhall@edu.uni-klu.ac.at)
+ */
+public class RtfHeaderFooterGroup extends HeaderFooter implements RtfBasicElement {
+
+ /**
+ * This RtfHeaderFooterGroup contains no RtfHeaderFooter objects
+ */
+ private static final int MODE_NONE = 0;
+ /**
+ * This RtfHeaderFooterGroup contains one RtfHeaderFooter object
+ */
+ private static final int MODE_SINGLE = 1;
+ /**
+ * This RtfHeaderFooterGroup contains two or three RtfHeaderFooter objects
+ */
+ private static final int MODE_MULTIPLE = 2;
+
+ /**
+ * The current mode of this RtfHeaderFooterGroup. Defaults to MODE_NONE
+ */
+ private int mode = MODE_NONE;
+ /**
+ * The current type of this RtfHeaderFooterGroup. Defaults to RtfHeaderFooter.TYPE_HEADER
+ */
+ private int type = RtfHeaderFooter.TYPE_HEADER;
+
+ /**
+ * The RtfHeaderFooter for all pages
+ */
+ private RtfHeaderFooter headerAll = null;
+ /**
+ * The RtfHeaderFooter for the first page
+ */
+ private RtfHeaderFooter headerFirst = null;
+ /**
+ * The RtfHeaderFooter for the left hand pages
+ */
+ private RtfHeaderFooter headerLeft = null;
+ /**
+ * The RtfHeaderFooter for the right hand pages
+ */
+ private RtfHeaderFooter headerRight = null;
+ /**
+ * The RtfDocument this RtfHeaderFooterGroup belongs to
+ */
+ private RtfDocument document = null;
+
+ /**
+ * Constructs a RtfHeaderGroup to which you add headers/footers using
+ * via the setHeaderFooter method.
+ *
+ */
+ public RtfHeaderFooterGroup() {
+ super(new Phrase(""), false);
+ this.mode = MODE_NONE;
+ }
+
+ /**
+ * Constructs a certain type of RtfHeaderFooterGroup. RtfHeaderFooter.TYPE_HEADER
+ * and RtfHeaderFooter.TYPE_FOOTER are valid values for type.
+ *
+ * @param doc The RtfDocument this RtfHeaderFooter belongs to
+ * @param type The type of RtfHeaderFooterGroup to create
+ */
+ public RtfHeaderFooterGroup(RtfDocument doc, int type) {
+ super(new Phrase(""), false);
+ this.document = doc;
+ this.type = type;
+ }
+
+ /**
+ * Constructs a RtfHeaderFooterGroup by copying the content of the original
+ * RtfHeaderFooterGroup
+ *
+ * @param doc The RtfDocument this RtfHeaderFooter belongs to
+ * @param headerFooter The RtfHeaderFooterGroup to copy
+ * @param type The type of RtfHeaderFooterGroup to create
+ */
+ public RtfHeaderFooterGroup(RtfDocument doc, RtfHeaderFooterGroup headerFooter, int type) {
+ super(new Phrase(""), false);
+ this.document = doc;
+ this.mode = headerFooter.getMode();
+ this.type = type;
+ if(headerFooter.getHeaderAll() != null) {
+ this.headerAll = new RtfHeaderFooter(this.document, headerFooter.getHeaderAll(), RtfHeaderFooter.DISPLAY_ALL_PAGES);
+ }
+ if(headerFooter.getHeaderFirst() != null) {
+ this.headerFirst = new RtfHeaderFooter(this.document, headerFooter.getHeaderFirst(), RtfHeaderFooter.DISPLAY_FIRST_PAGE);
+ }
+ if(headerFooter.getHeaderLeft() != null) {
+ this.headerLeft = new RtfHeaderFooter(this.document, headerFooter.getHeaderLeft(), RtfHeaderFooter.DISPLAY_LEFT_PAGES);
+ }
+ if(headerFooter.getHeaderRight() != null) {
+ this.headerRight = new RtfHeaderFooter(this.document, headerFooter.getHeaderRight(), RtfHeaderFooter.DISPLAY_RIGHT_PAGES);
+ }
+ setType(this.type);
+ }
+
+ /**
+ * Constructs a RtfHeaderFooterGroup for a certain RtfHeaderFooter.
+ *
+ * @param doc The RtfDocument this RtfHeaderFooter belongs to
+ * @param headerFooter The RtfHeaderFooter to display
+ * @param type The typ of RtfHeaderFooterGroup to create
+ */
+ public RtfHeaderFooterGroup(RtfDocument doc, RtfHeaderFooter headerFooter, int type) {
+ super(new Phrase(""), false);
+ this.document = doc;
+ this.type = type;
+ this.mode = MODE_SINGLE;
+ headerAll = new RtfHeaderFooter(doc, headerFooter, RtfHeaderFooter.DISPLAY_ALL_PAGES);
+ headerAll.setType(this.type);
+ }
+
+ /**
+ * Constructs a RtfHeaderGroup for a certain HeaderFooter
+ *
+ * @param doc The RtfDocument this RtfHeaderFooter belongs to
+ * @param headerFooter The HeaderFooter to display
+ * @param type The typ of RtfHeaderFooterGroup to create
+ */
+ public RtfHeaderFooterGroup(RtfDocument doc, HeaderFooter headerFooter, int type) {
+ super(new Phrase(""), false);
+ this.document = doc;
+ this.type = type;
+ this.mode = MODE_SINGLE;
+ headerAll = new RtfHeaderFooter(doc, headerFooter, type, RtfHeaderFooter.DISPLAY_ALL_PAGES);
+ headerAll.setType(this.type);
+ }
+
+ /**
+ * Sets the RtfDocument this RtfElement belongs to
+ *
+ * @param doc The RtfDocument to use
+ */
+ public void setRtfDocument(RtfDocument doc) {
+ this.document = doc;
+ if(headerAll != null) {
+ headerAll.setRtfDocument(this.document);
+ }
+ if(headerFirst != null) {
+ headerFirst.setRtfDocument(this.document);
+ }
+ if(headerLeft != null) {
+ headerLeft.setRtfDocument(this.document);
+ }
+ if(headerRight != null) {
+ headerRight.setRtfDocument(this.document);
+ }
+ }
+
+ /**
+ * Write the content of this RtfHeaderFooterGroup.
+ *
+ * @return A byte array with the content of this RtfHeaderFooterGroup
+ */
+ public byte[] write() {
+ ByteArrayOutputStream result = new ByteArrayOutputStream();
+ try {
+ if(this.mode == MODE_SINGLE) {
+ result.write(headerAll.write());
+ } else if(this.mode == MODE_MULTIPLE) {
+ if(headerFirst != null) {
+ result.write(headerFirst.write());
+ }
+ if(headerLeft != null) {
+ result.write(headerLeft.write());
+ }
+ if(headerRight != null) {
+ result.write(headerRight.write());
+ }
+ if(headerAll != null) {
+ result.write(headerAll.write());
+ }
+ }
+ } catch(IOException ioe) {
+ ioe.printStackTrace();
+ }
+ return result.toByteArray();
+ }
+
+ /**
+ * Set a RtfHeaderFooter to be displayed at a certain position
+ *
+ * @param headerFooter The RtfHeaderFooter to display
+ * @param displayAt The display location to use
+ */
+ public void setHeaderFooter(RtfHeaderFooter headerFooter, int displayAt) {
+ this.mode = MODE_MULTIPLE;
+ headerFooter.setRtfDocument(this.document);
+ headerFooter.setType(this.type);
+ headerFooter.setDisplayAt(displayAt);
+ switch(displayAt) {
+ case RtfHeaderFooter.DISPLAY_ALL_PAGES:
+ headerAll = headerFooter;
+ break;
+ case RtfHeaderFooter.DISPLAY_FIRST_PAGE:
+ headerFirst = headerFooter;
+ break;
+ case RtfHeaderFooter.DISPLAY_LEFT_PAGES:
+ headerLeft = headerFooter;
+ break;
+ case RtfHeaderFooter.DISPLAY_RIGHT_PAGES:
+ headerRight = headerFooter;
+ break;
+ }
+ }
+
+ /**
+ * Set a HeaderFooter to be displayed at a certain position
+ *
+ * @param headerFooter The HeaderFooter to set
+ * @param displayAt The display location to use
+ */
+ public void setHeaderFooter(HeaderFooter headerFooter, int displayAt) {
+ this.mode = MODE_MULTIPLE;
+ switch(displayAt) {
+ case RtfHeaderFooter.DISPLAY_ALL_PAGES:
+ headerAll = new RtfHeaderFooter(this.document, headerFooter, this.type, displayAt);
+ break;
+ case RtfHeaderFooter.DISPLAY_FIRST_PAGE:
+ headerFirst = new RtfHeaderFooter(this.document, headerFooter, this.type, displayAt);
+ break;
+ case RtfHeaderFooter.DISPLAY_LEFT_PAGES:
+ headerLeft = new RtfHeaderFooter(this.document, headerFooter, this.type, displayAt);
+ break;
+ case RtfHeaderFooter.DISPLAY_RIGHT_PAGES:
+ headerRight = new RtfHeaderFooter(this.document, headerFooter, this.type, displayAt);
+ break;
+ }
+ }
+
+ /**
+ * Set that this RtfHeaderFooterGroup should have a title page. If only
+ * a header / footer for all pages exists, then it will be copied to the
+ * first page aswell.
+ */
+ public void setHasTitlePage() {
+ if(this.mode == MODE_SINGLE) {
+ this.mode = MODE_MULTIPLE;
+ headerFirst = new RtfHeaderFooter(this.document, headerAll, RtfHeaderFooter.DISPLAY_FIRST_PAGE);
+ headerFirst.setType(this.type);
+ }
+ }
+
+ /**
+ * Set that this RtfHeaderFooterGroup should have facing pages. If only
+ * a header / footer for all pages exists, then it will be copied to the left
+ * and right pages aswell.
+ */
+ public void setHasFacingPages() {
+ if(this.mode == MODE_SINGLE) {
+ this.mode = MODE_MULTIPLE;
+ this.headerLeft = new RtfHeaderFooter(this.document, this.headerAll, RtfHeaderFooter.DISPLAY_LEFT_PAGES);
+ this.headerLeft.setType(this.type);
+ this.headerRight = new RtfHeaderFooter(this.document, this.headerAll, RtfHeaderFooter.DISPLAY_RIGHT_PAGES);
+ this.headerRight.setType(this.type);
+ this.headerAll = null;
+ } else if(this.mode == MODE_MULTIPLE) {
+ if(this.headerLeft == null && this.headerAll != null) {
+ this.headerLeft = new RtfHeaderFooter(this.document, this.headerAll, RtfHeaderFooter.DISPLAY_LEFT_PAGES);
+ this.headerLeft.setType(this.type);
+ }
+ if(this.headerRight == null && this.headerAll != null) {
+ this.headerRight = new RtfHeaderFooter(this.document, this.headerAll, RtfHeaderFooter.DISPLAY_RIGHT_PAGES);
+ this.headerRight.setType(this.type);
+ }
+ this.headerAll = null;
+ }
+ }
+
+ /**
+ * Get whether this RtfHeaderFooterGroup has a titlepage
+ *
+ * @return Whether this RtfHeaderFooterGroup has a titlepage
+ */
+ public boolean hasTitlePage() {
+ return (headerFirst != null);
+ }
+
+ /**
+ * Get whether this RtfHeaderFooterGroup has facing pages
+ *
+ * @return Whether this RtfHeaderFooterGroup has facing pages
+ */
+ public boolean hasFacingPages() {
+ return (headerLeft != null || headerRight != null);
+ }
+
+ /**
+ * Unused
+ * @param inTable
+ */
+ public void setInTable(boolean inTable) {
+ }
+
+ /**
+ * Unused
+ * @param inHeader
+ */
+ public void setInHeader(boolean inHeader) {
+ }
+
+ /**
+ * Set the type of this RtfHeaderFooterGroup. RtfHeaderFooter.TYPE_HEADER
+ * or RtfHeaderFooter.TYPE_FOOTER. Also sets the type for all RtfHeaderFooters
+ * of this RtfHeaderFooterGroup.
+ *
+ * @param type The type to use
+ */
+ public void setType(int type) {
+ this.type = type;
+ if(headerAll != null) {
+ headerAll.setType(this.type);
+ }
+ if(headerFirst != null) {
+ headerFirst.setType(this.type);
+ }
+ if(headerLeft != null) {
+ headerLeft.setType(this.type);
+ }
+ if(headerRight != null) {
+ headerRight.setType(this.type);
+ }
+ }
+
+ /**
+ * Gets the mode of this RtfHeaderFooterGroup
+ *
+ * @return The mode of this RtfHeaderFooterGroup
+ */
+ protected int getMode() {
+ return this.mode;
+ }
+
+ /**
+ * Gets the RtfHeaderFooter for all pages
+ *
+ * @return The RtfHeaderFooter for all pages
+ */
+ protected RtfHeaderFooter getHeaderAll() {
+ return headerAll;
+ }
+
+ /**
+ * Gets the RtfHeaderFooter for the title page
+ *
+ * @return The RtfHeaderFooter for the title page
+ */
+ protected RtfHeaderFooter getHeaderFirst() {
+ return headerFirst;
+ }
+
+ /**
+ * Gets the RtfHeaderFooter for all left hand pages
+ *
+ * @return The RtfHeaderFooter for all left hand pages
+ */
+ protected RtfHeaderFooter getHeaderLeft() {
+ return headerLeft;
+ }
+
+ /**
+ * Gets the RtfHeaderFooter for all right hand pages
+ *
+ * @return The RtfHeaderFooter for all right hand pages
+ */
+ protected RtfHeaderFooter getHeaderRight() {
+ return headerRight;
+ }
+}
diff --git a/src/main/java/com/lowagie/text/rtf/list/RtfList.java b/src/main/java/com/lowagie/text/rtf/list/RtfList.java
new file mode 100644
index 0000000..cfa5c33
--- /dev/null
+++ b/src/main/java/com/lowagie/text/rtf/list/RtfList.java
@@ -0,0 +1,605 @@
+/*
+ * $Id: RtfList.java,v 1.19 2006/04/05 09:30:47 hallm Exp $
+ * $Name: $
+ *
+ * Copyright 2001, 2002, 2003, 2004, 2005 by Mark Hall
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the ?GNU LIBRARY GENERAL PUBLIC LICENSE?), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.rtf.list;
+
+import java.awt.Color;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.util.ArrayList;
+
+import com.lowagie.text.Chunk;
+import com.lowagie.text.DocumentException;
+import com.lowagie.text.Element;
+import com.lowagie.text.Font;
+import com.lowagie.text.List;
+import com.lowagie.text.ListItem;
+import com.lowagie.text.rtf.RtfBasicElement;
+import com.lowagie.text.rtf.RtfElement;
+import com.lowagie.text.rtf.RtfExtendedElement;
+import com.lowagie.text.rtf.style.RtfFont;
+import com.lowagie.text.rtf.style.RtfFontList;
+import com.lowagie.text.rtf.style.RtfParagraphStyle;
+import com.lowagie.text.rtf.text.RtfParagraph;
+import com.lowagie.text.rtf.document.RtfDocument;
+
+
+/**
+ * The RtfList stores one List. It also provides the methods to write the
+ * list declaration and the list data.
+ *
+ * @version $Version:$
+ * @author Mark Hall (mhall@edu.uni-klu.ac.at)
+ */
+public class RtfList extends RtfElement implements RtfExtendedElement {
+
+ /**
+ * Constant for list level
+ */
+ private static final byte[] LIST_LEVEL = "\\listlevel".getBytes();
+ /**
+ * Constant for list level style old
+ */
+ private static final byte[] LIST_LEVEL_TYPE = "\\levelnfc".getBytes();
+ /**
+ * Constant for list level style new
+ */
+ private static final byte[] LIST_LEVEL_TYPE_NEW = "\\levelnfcn".getBytes();
+ /**
+ * Constant for list level alignment old
+ */
+ private static final byte[] LIST_LEVEL_ALIGNMENT = "\\leveljc".getBytes();
+ /**
+ * Constant for list level alignment new
+ */
+ private static final byte[] LIST_LEVEL_ALIGNMENT_NEW = "\\leveljcn".getBytes();
+ /**
+ * Constant for list level start at
+ */
+ private static final byte[] LIST_LEVEL_START_AT = "\\levelstartat".getBytes();
+ /**
+ * Constant for list level text
+ */
+ private static final byte[] LIST_LEVEL_TEXT = "\\leveltext".getBytes();
+ /**
+ * Constant for the beginning of the list level numbered style
+ */
+ private static final byte[] LIST_LEVEL_STYLE_NUMBERED_BEGIN = "\\\'02\\\'".getBytes();
+ /**
+ * Constant for the end of the list level numbered style
+ */
+ private static final byte[] LIST_LEVEL_STYLE_NUMBERED_END = ".;".getBytes();
+ /**
+ * Constant for the list level bulleted style
+ */
+ private static final byte[] LIST_LEVEL_STYLE_BULLETED = "\\\'01\\u-3913 ?;".getBytes();
+ /**
+ * Constant for the beginning of the list level numbers
+ */
+ private static final byte[] LIST_LEVEL_NUMBERS_BEGIN = "\\levelnumbers".getBytes();
+ /**
+ * Constant for the list level numbers
+ */
+ private static final byte[] LIST_LEVEL_NUMBERS_NUMBERED = "\\\'01".getBytes();
+ /**
+ * Constant for the end of the list level numbers
+ */
+ private static final byte[] LIST_LEVEL_NUMBERS_END = ";".getBytes();
+ /**
+ * Constant for the first indentation
+ */
+ private static final byte[] LIST_LEVEL_FIRST_INDENT = "\\fi".getBytes();
+ /**
+ * Constant for the symbol indentation
+ */
+ private static final byte[] LIST_LEVEL_SYMBOL_INDENT = "\\tx".getBytes();
+ /**
+ * Constant for the list level value
+ */
+ private static final byte[] LIST_LEVEL_NUMBER = "\\ilvl".getBytes();
+ /**
+ * Constant for a tab character
+ */
+ private static final byte[] TAB = "\\tab".getBytes();
+ /**
+ * Constant for the old list text
+ */
+ private static final byte[] LIST_TEXT = "\\listtext".getBytes();
+ /**
+ * Constant for the old list number end
+ */
+ private static final byte[] LIST_NUMBER_END = ".".getBytes();
+ /**
+ * Constant for the old bulleted list
+ */
+ private static final byte[] LIST_BULLET = "\\\'b7".getBytes();
+
+ /**
+ * The subitems of this RtfList
+ */
+ private ArrayList items;
+ /**
+ * The level of this RtfList
+ */
+ private int listLevel = 0;
+ /**
+ * The first indentation of this RtfList
+ */
+ private int firstIndent = 0;
+ /**
+ * The left indentation of this RtfList
+ */
+ private int leftIndent = 0;
+ /**
+ * The right indentation of this RtfList
+ */
+ private int rightIndent = 0;
+ /**
+ * The symbol indentation of this RtfList
+ */
+ private int symbolIndent = 0;
+ /**
+ * The list number of this RtfList
+ */
+ private int listNumber = 1;
+ /**
+ * Whether this RtfList is numbered
+ */
+ private boolean numbered = true;
+ /**
+ * The RtfFont for numbered lists
+ */
+ private RtfFont fontNumber;
+ /**
+ * The RtfFont for bulleted lists
+ */
+ private RtfFont fontBullet;
+ /**
+ * The alignment of this RtfList
+ */
+ private int alignment = Element.ALIGN_LEFT;
+ /**
+ * The parent List in multi-level lists.
+ */
+ private RtfList parentList = null;
+
+ /**
+ * Constructs a new RtfList for the specified List.
+ *
+ * @param doc The RtfDocument this RtfList belongs to
+ * @param list The List this RtfList is based on
+ */
+ public RtfList(RtfDocument doc, List list) {
+ super(doc);
+
+ this.listNumber = document.getDocumentHeader().getListNumber(this);
+
+ this.items = new ArrayList();
+ if(list.symbolIndent() > 0 && list.indentationLeft() > 0) {
+ this.firstIndent = (int) (list.symbolIndent() * RtfElement.TWIPS_FACTOR * -1);
+ this.leftIndent = (int) ((list.indentationLeft() + list.symbolIndent()) * RtfElement.TWIPS_FACTOR);
+ } else if(list.symbolIndent() > 0) {
+ this.firstIndent = (int) (list.symbolIndent() * RtfElement.TWIPS_FACTOR * -1);
+ this.leftIndent = (int) (list.symbolIndent() * RtfElement.TWIPS_FACTOR);
+ } else if(list.indentationLeft() > 0) {
+ this.firstIndent = 0;
+ this.leftIndent = (int) (list.indentationLeft() * RtfElement.TWIPS_FACTOR);
+ } else {
+ this.firstIndent = 0;
+ this.leftIndent = 0;
+ }
+ this.rightIndent = (int) (list.indentationRight() * RtfElement.TWIPS_FACTOR);
+ this.symbolIndent = (int) ((list.symbolIndent() + list.indentationLeft()) * RtfElement.TWIPS_FACTOR);
+ this.numbered = list.isNumbered();
+
+ for(int i = 0; i < list.getItems().size(); i++) {
+ try {
+ Element element = (Element) list.getItems().get(i);
+ if(element.type() == Element.CHUNK) {
+ element = new ListItem((Chunk) element);
+ }
+ if(element instanceof ListItem) {
+ this.alignment = ((ListItem) element).alignment();
+ }
+ RtfBasicElement rtfElement = doc.getMapper().mapElement(element);
+ if(rtfElement instanceof RtfList) {
+ ((RtfList) rtfElement).setListNumber(listNumber);
+ ((RtfList) rtfElement).setListLevel(listLevel + 1);
+ ((RtfList) rtfElement).setParent(this);
+ } else if(rtfElement instanceof RtfListItem) {
+ ((RtfListItem) rtfElement).setParent(this);
+ ((RtfListItem) rtfElement).inheritListSettings(listNumber, listLevel + 1);
+ }
+ items.add(rtfElement);
+ } catch(DocumentException de) {
+ de.printStackTrace();
+ }
+ }
+
+ if(this.listLevel == 0) {
+ correctIndentation();
+ }
+
+ fontNumber = new RtfFont(document, new Font(Font.TIMES_ROMAN, 10, Font.NORMAL, new Color(0, 0, 0)));
+ fontBullet = new RtfFont(document, new Font(Font.SYMBOL, 10, Font.NORMAL, new Color(0, 0, 0)));
+ }
+
+ private byte[] writeIndentations() {
+ ByteArrayOutputStream result = new ByteArrayOutputStream();
+ try {
+ result.write(LIST_LEVEL_FIRST_INDENT);
+ result.write(intToByteArray(firstIndent));
+ result.write(RtfParagraphStyle.INDENT_LEFT);
+ result.write(intToByteArray(leftIndent));
+ result.write(RtfParagraphStyle.INDENT_RIGHT);
+ result.write(intToByteArray(rightIndent));
+ } catch(IOException ioe) {
+ ioe.printStackTrace();
+ }
+ return result.toByteArray();
+ }
+
+ /**
+ * Writes the definition part of this list level
+ *
+ * @return A byte array containing the definition of this list level
+ */
+ public byte[] writeDefinition() {
+ ByteArrayOutputStream result = new ByteArrayOutputStream();
+ try {
+ result.write(OPEN_GROUP);
+ result.write(LIST_LEVEL);
+ result.write(LIST_LEVEL_TYPE);
+ if(numbered) {
+ result.write(intToByteArray(0));
+ } else {
+ result.write(intToByteArray(23));
+ }
+ result.write(LIST_LEVEL_TYPE_NEW);
+ if(numbered) {
+ result.write(intToByteArray(0));
+ } else {
+ result.write(intToByteArray(23));
+ }
+ result.write(LIST_LEVEL_ALIGNMENT);
+ result.write(intToByteArray(0));
+ result.write(LIST_LEVEL_ALIGNMENT_NEW);
+ result.write(intToByteArray(0));
+ result.write(LIST_LEVEL_START_AT);
+ result.write(intToByteArray(1));
+ result.write(OPEN_GROUP);
+ result.write(LIST_LEVEL_TEXT);
+ if(numbered) {
+ result.write(LIST_LEVEL_STYLE_NUMBERED_BEGIN);
+ if(listLevel < 10) {
+ result.write(intToByteArray(0));
+ }
+ result.write(intToByteArray(listLevel));
+ result.write(LIST_LEVEL_STYLE_NUMBERED_END);
+ } else {
+ result.write(LIST_LEVEL_STYLE_BULLETED);
+ }
+ result.write(CLOSE_GROUP);
+ result.write(OPEN_GROUP);
+ result.write(LIST_LEVEL_NUMBERS_BEGIN);
+ if(numbered) {
+ result.write(LIST_LEVEL_NUMBERS_NUMBERED);
+ }
+ result.write(LIST_LEVEL_NUMBERS_END);
+ result.write(CLOSE_GROUP);
+ result.write(RtfFontList.FONT_NUMBER);
+ if(numbered) {
+ result.write(intToByteArray(fontNumber.getFontNumber()));
+ } else {
+ result.write(intToByteArray(fontBullet.getFontNumber()));
+ }
+ result.write(writeIndentations());
+ result.write(LIST_LEVEL_SYMBOL_INDENT);
+ result.write(intToByteArray(this.leftIndent));
+ result.write(CLOSE_GROUP);
+ result.write("\n".getBytes());
+ for(int i = 0; i < items.size(); i++) {
+ RtfElement rtfElement = (RtfElement) items.get(i);
+ if(rtfElement instanceof RtfList) {
+ result.write(((RtfList) rtfElement).writeDefinition());
+ break;
+ } else if(rtfElement instanceof RtfListItem) {
+ byte[] data = ((RtfListItem) rtfElement).writeDefinition();
+ if(data.length > 0) {
+ result.write(data);
+ break;
+ }
+ }
+ }
+ } catch(IOException ioe) {
+ ioe.printStackTrace();
+ }
+ return result.toByteArray();
+ }
+
+ /**
+ * Writes the initialisation part of the RtfList
+ *
+ * @return A byte array containing the initialisation part
+ */
+ protected byte[] writeListBeginning() {
+ ByteArrayOutputStream result = new ByteArrayOutputStream();
+ try {
+ result.write(RtfParagraph.PARAGRAPH_DEFAULTS);
+ if(this.inTable) {
+ result.write(RtfParagraph.IN_TABLE);
+ }
+ switch (this.alignment) {
+ case Element.ALIGN_LEFT:
+ result.write(RtfParagraphStyle.ALIGN_LEFT);
+ break;
+ case Element.ALIGN_RIGHT:
+ result.write(RtfParagraphStyle.ALIGN_RIGHT);
+ break;
+ case Element.ALIGN_CENTER:
+ result.write(RtfParagraphStyle.ALIGN_CENTER);
+ break;
+ case Element.ALIGN_JUSTIFIED:
+ case Element.ALIGN_JUSTIFIED_ALL:
+ result.write(RtfParagraphStyle.ALIGN_JUSTIFY);
+ break;
+ }
+ result.write(writeIndentations());
+ result.write(RtfFont.FONT_SIZE);
+ result.write(intToByteArray(fontNumber.getFontSize() * 2));
+ if(this.symbolIndent > 0) { // TODO This is a slight hack. Replace with a call to tab support when implemented.
+ result.write("\\tx".getBytes());
+ result.write(intToByteArray(this.leftIndent));
+ }
+ } catch(IOException ioe) {
+ ioe.printStackTrace();
+ }
+ return result.toByteArray();
+ }
+
+ /**
+ * Writes only the list number and list level number.
+ *
+ * @return The list number and list level number of this RtfList.
+ */
+ protected byte[] writeListNumbers() {
+ ByteArrayOutputStream result = new ByteArrayOutputStream();
+ try {
+ result.write(RtfListTable.LIST_NUMBER);
+ result.write(intToByteArray(listNumber));
+ if(listLevel > 0) {
+ result.write(LIST_LEVEL_NUMBER);
+ result.write(intToByteArray(listLevel));
+ }
+ } catch(IOException ioe) {
+ ioe.printStackTrace();
+ }
+ return result.toByteArray();
+ }
+
+ /**
+ * Writes the content of the RtfList
+ *
+ * @return A byte array containing the actual content of the RtfList
+ */
+ public byte[] write() {
+ ByteArrayOutputStream result = new ByteArrayOutputStream();
+ try {
+ result.write(writeListBeginning());
+ result.write(writeListNumbers());
+ result.write(OPEN_GROUP);
+ int itemNr = 0;
+ for(int i = 0; i < items.size(); i++) {
+ RtfElement rtfElement = (RtfElement) items.get(i);
+ if(rtfElement instanceof RtfListItem) {
+ itemNr++;
+ result.write(OPEN_GROUP);
+ result.write(LIST_TEXT);
+ result.write(RtfParagraph.PARAGRAPH_DEFAULTS);
+ if(this.inTable) {
+ result.write(RtfParagraph.IN_TABLE);
+ }
+ result.write(RtfFontList.FONT_NUMBER);
+ if(numbered) {
+ result.write(intToByteArray(fontNumber.getFontNumber()));
+ } else {
+ result.write(intToByteArray(fontBullet.getFontNumber()));
+ }
+ result.write(writeIndentations());
+ result.write(DELIMITER);
+ if(numbered) {
+ result.write(this.intToByteArray(itemNr));
+ result.write(LIST_NUMBER_END);
+ } else {
+ result.write(LIST_BULLET);
+ }
+ result.write(TAB);
+ result.write(CLOSE_GROUP);
+ result.write(rtfElement.write());
+ result.write(RtfParagraph.PARAGRAPH);
+ if(((RtfListItem) rtfElement).isContainsInnerList()) {
+ result.write(writeListNumbers());
+ }
+ result.write("\n".getBytes());
+ } else if(rtfElement instanceof RtfList) {
+ result.write(rtfElement.write());
+ result.write(writeListBeginning());
+ result.write("\n".getBytes());
+ }
+ }
+ result.write(CLOSE_GROUP);
+ if(!this.inTable) {
+ result.write(RtfParagraph.PARAGRAPH_DEFAULTS);
+ }
+ } catch(IOException ioe) {
+ ioe.printStackTrace();
+ }
+ return result.toByteArray();
+ }
+
+
+ /**
+ * Gets the list level of this RtfList
+ *
+ * @return Returns the list level.
+ */
+ public int getListLevel() {
+ return listLevel;
+ }
+
+ /**
+ * Sets the list level of this RtfList. A list level > 0 will
+ * unregister this RtfList from the RtfListTable
+ *
+ * @param listLevel The list level to set.
+ */
+ public void setListLevel(int listLevel) {
+ this.listLevel = listLevel;
+ if(this.listLevel != 0) {
+ document.getDocumentHeader().freeListNumber(this);
+ for(int i = 0; i < this.items.size(); i++) {
+ if(this.items.get(i) instanceof RtfList) {
+ ((RtfList) this.items.get(i)).setListNumber(this.listNumber);
+ ((RtfList) this.items.get(i)).setListLevel(this.listLevel + 1);
+ }
+ }
+ } else {
+ this.listNumber = document.getDocumentHeader().getListNumber(this);
+ }
+ }
+
+ /**
+ * Sets the parent RtfList of this RtfList
+ *
+ * @param parent The parent RtfList to use.
+ */
+ protected void setParent(RtfList parent) {
+ this.parentList = parent;
+ }
+
+ /**
+ * Gets the id of this list
+ *
+ * @return Returns the list number.
+ */
+ public int getListNumber() {
+ return listNumber;
+ }
+
+ /**
+ * Sets the id of this list
+ *
+ * @param listNumber The list number to set.
+ */
+ public void setListNumber(int listNumber) {
+ this.listNumber = listNumber;
+ }
+
+ /**
+ * Sets whether this RtfList is in a table. Sets the correct inTable setting for all
+ * child elements.
+ *
+ * @param inTable <code>True</code> if this RtfList is in a table, <code>false</code> otherwise
+ */
+ public void setInTable(boolean inTable) {
+ super.setInTable(inTable);
+ for(int i = 0; i < this.items.size(); i++) {
+ ((RtfBasicElement) this.items.get(i)).setInTable(inTable);
+ }
+ }
+
+ /**
+ * Sets whether this RtfList is in a header. Sets the correct inTable setting for all
+ * child elements.
+ *
+ * @param inHeader <code>True</code> if this RtfList is in a header, <code>false</code> otherwise
+ */
+ public void setInHeader(boolean inHeader) {
+ super.setInHeader(inHeader);
+ for(int i = 0; i < this.items.size(); i++) {
+ ((RtfBasicElement) this.items.get(i)).setInHeader(inHeader);
+ }
+ }
+
+ /**
+ * Correct the indentation of this RtfList by adding left/first line indentation
+ * from the parent RtfList. Also calls correctIndentation on all child RtfLists.
+ */
+ protected void correctIndentation() {
+ if(this.parentList != null) {
+ this.leftIndent = this.leftIndent + this.parentList.getLeftIndent() + this.parentList.getFirstIndent();
+ }
+ for(int i = 0; i < this.items.size(); i++) {
+ if(this.items.get(i) instanceof RtfList) {
+ ((RtfList) this.items.get(i)).correctIndentation();
+ } else if(this.items.get(i) instanceof RtfListItem) {
+ ((RtfListItem) this.items.get(i)).correctIndentation();
+ }
+ }
+ }
+
+ /**
+ * Get the left indentation of this RtfList.
+ *
+ * @return The left indentation.
+ */
+ private int getLeftIndent() {
+ return this.leftIndent;
+ }
+
+ /**
+ * Get the first line indentation of this RtfList.
+ *
+ * @return The first line indentation.
+ */
+ private int getFirstIndent() {
+ return this.firstIndent;
+ }
+}
diff --git a/src/main/java/com/lowagie/text/rtf/list/RtfListItem.java b/src/main/java/com/lowagie/text/rtf/list/RtfListItem.java
new file mode 100644
index 0000000..9e5b184
--- /dev/null
+++ b/src/main/java/com/lowagie/text/rtf/list/RtfListItem.java
@@ -0,0 +1,182 @@
+/*
+ * $Id: RtfListItem.java,v 1.11 2006/04/05 09:30:47 hallm Exp $
+ * $Name: $
+ *
+ * Copyright 2001, 2002, 2003, 2004, 2005 by Mark Hall
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the ?GNU LIBRARY GENERAL PUBLIC LICENSE?), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.rtf.list;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+
+import com.lowagie.text.ListItem;
+import com.lowagie.text.rtf.RtfBasicElement;
+import com.lowagie.text.rtf.document.RtfDocument;
+import com.lowagie.text.rtf.text.RtfChunk;
+import com.lowagie.text.rtf.text.RtfParagraph;
+
+
+/**
+ * The RtfListItem acts as a wrapper for a ListItem.
+ *
+ * @version $Version:$
+ * @author Mark Hall (mhall@edu.uni-klu.ac.at)
+ */
+public class RtfListItem extends RtfParagraph {
+
+ /**
+ * The RtfList this RtfListItem belongs to.
+ */
+ private RtfList parentList = null;
+ /**
+ * Whether this RtfListItem contains further RtfLists.
+ */
+ private boolean containsInnerList = false;
+
+ /**
+ * Constructs a RtfListItem for a ListItem belonging to a RtfDocument.
+ *
+ * @param doc The RtfDocument this RtfListItem belongs to.
+ * @param listItem The ListItem this RtfListItem is based on.
+ */
+ public RtfListItem(RtfDocument doc, ListItem listItem) {
+ super(doc, listItem);
+ }
+
+ /**
+ * Writes the content of this RtfListItem.
+ *
+ * @return A byte array with the content of this RtfListItem.
+ */
+ public byte[] write() {
+ ByteArrayOutputStream result = new ByteArrayOutputStream();
+ try {
+ for(int i = 0; i < chunks.size(); i++) {
+ RtfBasicElement rtfElement = (RtfBasicElement) chunks.get(i);
+ if(rtfElement instanceof RtfChunk) {
+ ((RtfChunk) rtfElement).setSoftLineBreaks(true);
+ } else if(rtfElement instanceof RtfList) {
+ result.write(RtfParagraph.PARAGRAPH);
+ this.containsInnerList = true;
+ }
+ result.write(rtfElement.write());
+ if(rtfElement instanceof RtfList) {
+ result.write(this.parentList.writeListBeginning());
+ result.write("\\tab".getBytes());
+ }
+ }
+ } catch(IOException ioe) {
+ ioe.printStackTrace();
+ }
+ return result.toByteArray();
+ }
+
+ /**
+ * Returns the definition of the first list contained in this RtfListItem or
+ * an empty byte array if no inner RtfLists exist.
+ *
+ * @return The definition of the first inner RtfList or an empty byte array.
+ */
+ public byte[] writeDefinition() {
+ for(int i = 0; i < chunks.size(); i++) {
+ RtfBasicElement rtfElement = (RtfBasicElement) chunks.get(i);
+ if(rtfElement instanceof RtfList) {
+ return ((RtfList) rtfElement).writeDefinition();
+ }
+ }
+ return new byte[0];
+ }
+
+ /**
+ * Inherit the list settings from the parent list to RtfLists that
+ * are contained in this RtfListItem.
+ *
+ * @param listNumber The list number to inherit.
+ * @param listLevel The list level to inherit.
+ */
+ public void inheritListSettings(int listNumber, int listLevel) {
+ for(int i = 0; i < chunks.size(); i++) {
+ RtfBasicElement rtfElement = (RtfBasicElement) chunks.get(i);
+ if(rtfElement instanceof RtfList) {
+ ((RtfList) rtfElement).setListNumber(listNumber);
+ ((RtfList) rtfElement).setListLevel(listLevel);
+ ((RtfList) rtfElement).setParent(this.parentList);
+ }
+ }
+ }
+
+ /**
+ * Correct the indentation of RtfLists in this RtfListItem by adding left/first line indentation
+ * from the parent RtfList. Also calls correctIndentation on all child RtfLists.
+ */
+ protected void correctIndentation() {
+ for(int i = 0; i < chunks.size(); i++) {
+ RtfBasicElement rtfElement = (RtfBasicElement) chunks.get(i);
+ if(rtfElement instanceof RtfList) {
+ ((RtfList) rtfElement).correctIndentation();
+ }
+ }
+ }
+
+ /**
+ * Set the parent RtfList.
+ *
+ * @param parentList The parent RtfList to use.
+ */
+ public void setParent(RtfList parentList) {
+ this.parentList = parentList;
+ }
+
+ /**
+ * Gets whether this RtfListItem contains further RtfLists.
+ *
+ * @return Whether this RtfListItem contains further RtfLists.
+ */
+ public boolean isContainsInnerList() {
+ return this.containsInnerList;
+ }
+}
diff --git a/src/main/java/com/lowagie/text/rtf/list/RtfListTable.java b/src/main/java/com/lowagie/text/rtf/list/RtfListTable.java
new file mode 100644
index 0000000..ee10c94
--- /dev/null
+++ b/src/main/java/com/lowagie/text/rtf/list/RtfListTable.java
@@ -0,0 +1,202 @@
+/*
+ * $Id: RtfListTable.java,v 1.16 2005/05/04 14:33:45 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2001, 2002, 2003, 2004 by Mark Hall
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the ?GNU LIBRARY GENERAL PUBLIC LICENSE?), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.rtf.list;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.util.ArrayList;
+
+import com.lowagie.text.rtf.RtfElement;
+import com.lowagie.text.rtf.RtfExtendedElement;
+import com.lowagie.text.rtf.document.RtfDocument;
+
+
+/**
+ * The RtfListTable manages all RtfLists in one RtfDocument. It also generates
+ * the list and list override tables in the document header.
+ *
+ * @version $Version:$
+ * @author Mark Hall (mhall@edu.uni-klu.ac.at)
+ */
+public class RtfListTable extends RtfElement implements RtfExtendedElement {
+
+ /**
+ * Constant for the list number
+ */
+ protected static final byte[] LIST_NUMBER = "\\ls".getBytes();
+ /**
+ * Constant for the list table
+ */
+ private static final byte[] LIST_TABLE = "\\*\\listtable".getBytes();
+ /**
+ * Constant for the list
+ */
+ private static final byte[] LIST = "\\list".getBytes();
+ /**
+ * Constant for the list template id
+ */
+ private static final byte[] LIST_TEMPLATE_ID = "\\listtemplateid".getBytes();
+ /**
+ * Constant for the hybrid list
+ */
+ private static final byte[] LIST_HYBRID = "\\hybrid".getBytes();
+ /**
+ * Constant for the list id
+ */
+ private static final byte[] LIST_ID = "\\listid".getBytes();
+ /**
+ * Constant for the list override table
+ */
+ private static final byte[] LIST_OVERRIDE_TABLE = "\\*\\listoverridetable".getBytes();
+ /**
+ * Constant for the list override
+ */
+ private static final byte[] LIST_OVERRIDE = "\\listoverride".getBytes();
+ /**
+ * Constant for the list override count
+ */
+ private static final byte[] LIST_OVERRIDE_COUNT = "\\listoverridecount".getBytes();
+
+ /**
+ * The RtfLists managed by this RtfListTable
+ */
+ private ArrayList lists;
+
+ /**
+ * Constructs a RtfListTable for a RtfDocument
+ *
+ * @param doc The RtfDocument this RtfListTable belongs to
+ */
+ public RtfListTable(RtfDocument doc) {
+ super(doc);
+
+ this.lists = new ArrayList();
+ }
+
+ /**
+ * Writes the list and list override tables.
+ *
+ * @return A byte array with the list and list override tables.
+ */
+ public byte[] writeDefinition() {
+ ByteArrayOutputStream result = new ByteArrayOutputStream();
+ int[] listIds = new int[lists.size()];
+ try {
+ result.write(OPEN_GROUP);
+ result.write(LIST_TABLE);
+ result.write("\n".getBytes());
+ for(int i = 0; i < lists.size(); i++) {
+ result.write(OPEN_GROUP);
+ result.write(LIST);
+ result.write(LIST_TEMPLATE_ID);
+ result.write(intToByteArray(document.getRandomInt()));
+ result.write(LIST_HYBRID);
+ result.write("\n".getBytes());
+ result.write(((RtfList) lists.get(i)).writeDefinition());
+ result.write(LIST_ID);
+ listIds[i] = document.getRandomInt();
+ result.write(intToByteArray(listIds[i]));
+ result.write(CLOSE_GROUP);
+ result.write("\n".getBytes());
+ }
+ result.write(CLOSE_GROUP);
+ result.write("\n".getBytes());
+ result.write(OPEN_GROUP);
+ result.write(LIST_OVERRIDE_TABLE);
+ result.write("\n".getBytes());
+ for(int i = 0; i < lists.size(); i++) {
+ result.write(OPEN_GROUP);
+ result.write(LIST_OVERRIDE);
+ result.write(LIST_ID);
+ result.write(intToByteArray(listIds[i]));
+ result.write(LIST_OVERRIDE_COUNT);
+ result.write(intToByteArray(0));
+ result.write(LIST_NUMBER);
+ result.write(intToByteArray(((RtfList) lists.get(i)).getListNumber()));
+ result.write(CLOSE_GROUP);
+ result.write("\n".getBytes());
+ }
+ result.write(CLOSE_GROUP);
+ result.write("\n".getBytes());
+ } catch(IOException ioe) {
+ ioe.printStackTrace();
+ }
+ return result.toByteArray();
+ }
+
+ /**
+ * Gets the id of the specified RtfList. If the RtfList is not yet in the
+ * list of RtfLists, then it is added.
+ *
+ * @param list The RtfList for which to get the id.
+ * @return The id of the RtfList.
+ */
+ public int getListNumber(RtfList list) {
+ if(lists.contains(list)) {
+ return lists.indexOf(list);
+ } else {
+ lists.add(list);
+ return lists.size();
+ }
+ }
+
+ /**
+ * Remove a RtfList from the list of RtfLists
+ *
+ * @param list The RtfList to remove.
+ */
+ public void freeListNumber(RtfList list) {
+ int i = lists.indexOf(list);
+ if(i >= 0) {
+ lists.remove(i);
+ }
+ }
+}
diff --git a/src/main/java/com/lowagie/text/rtf/style/RtfColor.java b/src/main/java/com/lowagie/text/rtf/style/RtfColor.java
new file mode 100644
index 0000000..aca4ea2
--- /dev/null
+++ b/src/main/java/com/lowagie/text/rtf/style/RtfColor.java
@@ -0,0 +1,302 @@
+/*
+ * $Id: RtfColor.java,v 1.7 2004/12/14 12:51:59 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2001, 2002, 2003, 2004 by Mark Hall
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the ?GNU LIBRARY GENERAL PUBLIC LICENSE?), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.rtf.style;
+
+import java.awt.Color;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+
+import com.lowagie.text.rtf.RtfElement;
+import com.lowagie.text.rtf.RtfExtendedElement;
+import com.lowagie.text.rtf.document.RtfDocument;
+
+
+/**
+ * The RtfColor stores one rtf color value for a rtf document
+ *
+ * @version $Version:$
+ * @author Mark Hall (mhall@edu.uni-klu.ac.at)
+ */
+public class RtfColor extends RtfElement implements RtfExtendedElement {
+
+ /**
+ * Constant for RED value
+ */
+ private static final byte[] COLOR_RED = "\\red".getBytes();
+ /**
+ * Constant for GREEN value
+ */
+ private static final byte[] COLOR_GREEN = "\\green".getBytes();
+ /**
+ * Constant for BLUE value
+ */
+ private static final byte[] COLOR_BLUE = "\\blue".getBytes();
+ /**
+ * Constant for the end of one color entry
+ */
+ private static final byte COLON = (byte) ';';
+ /**
+ * Constant for the number of the colour in the list of colours
+ */
+ private static final byte[] COLOR_NUMBER = "\\cf".getBytes();
+
+ /**
+ * The number of the colour in the list of colours
+ */
+ private int colorNumber = 0;
+ /**
+ * The red value
+ */
+ private int red = 0;
+ /**
+ * The green value
+ */
+ private int green = 0;
+ /**
+ * The blue value
+ */
+ private int blue = 0;
+
+ /**
+ * Constructor only for use when initializing the RtfColorList
+ *
+ * @param doc The RtfDocument this RtfColor belongs to
+ * @param red The red value to use
+ * @param green The green value to use
+ * @param blue The blue value to use
+ * @param colorNumber The number of the colour in the colour list
+ */
+ protected RtfColor(RtfDocument doc, int red, int green, int blue, int colorNumber) {
+ super(doc);
+ this.red = red;
+ this.blue = blue;
+ this.green = green;
+ this.colorNumber = colorNumber;
+ }
+
+ /**
+ * Constructs a RtfColor as a clone of an existing RtfColor
+ *
+ * @param doc The RtfDocument this RtfColor belongs to
+ * @param col The RtfColor to use as a base
+ */
+ public RtfColor(RtfDocument doc, RtfColor col) {
+ super(doc);
+ if(col != null) {
+ this.red = col.getRed();
+ this.green = col.getGreen();
+ this.blue = col.getBlue();
+ }
+ if(this.document != null) {
+ this.colorNumber = this.document.getDocumentHeader().getColorNumber(this);
+ }
+ }
+
+ /**
+ * Constructs a RtfColor based on the Color
+ *
+ * @param doc The RtfDocument this RtfColor belongs to
+ * @param col The Color to base this RtfColor on
+ */
+ public RtfColor(RtfDocument doc, Color col) {
+ super(doc);
+ if(col != null) {
+ this.red = col.getRed();
+ this.blue = col.getBlue();
+ this.green = col.getGreen();
+ }
+ if(this.document != null) {
+ this.colorNumber = this.document.getDocumentHeader().getColorNumber(this);
+ }
+ }
+
+ /**
+ * Constructs a RtfColor based on the red/green/blue values
+ *
+ * @param doc The RtfDocument this RtfColor belongs to
+ * @param red The red value to use
+ * @param green The green value to use
+ * @param blue The blue value to use
+ */
+ public RtfColor(RtfDocument doc, int red, int green, int blue) {
+ super(doc);
+ this.red = red;
+ this.blue = blue;
+ this.green = green;
+ if(this.document != null) {
+ this.colorNumber = this.document.getDocumentHeader().getColorNumber(this);
+ }
+ }
+
+ /**
+ * Write the definition part of this RtfColor.
+ *
+ * @return A byte array with the definition of this colour
+ */
+ public byte[] writeDefinition() {
+ ByteArrayOutputStream result = new ByteArrayOutputStream();
+ try {
+ result.write(COLOR_RED);
+ result.write(intToByteArray(red));
+ result.write(COLOR_GREEN);
+ result.write(intToByteArray(green));
+ result.write(COLOR_BLUE);
+ result.write(intToByteArray(blue));
+ result.write(COLON);
+ } catch(IOException ioe) {
+ ioe.printStackTrace();
+ }
+ return result.toByteArray();
+ }
+
+ /**
+ * Writes the beginning of this RtfColor
+ *
+ * @return A byte array with the colour start data
+ */
+ public byte[] writeBegin() {
+ ByteArrayOutputStream result = new ByteArrayOutputStream();
+ try {
+ result.write(COLOR_NUMBER);
+ result.write(intToByteArray(colorNumber));
+ } catch(IOException ioe) {
+ ioe.printStackTrace();
+ }
+ return result.toByteArray();
+ }
+
+ /**
+ * Unused
+ *
+ * @return An empty (<code>byte[0]</code>) byte array
+ */
+ public byte[] writeEnd() {
+ return new byte[0];
+ }
+
+ /**
+ * Tests if this RtfColor is equal to another RtfColor.
+ *
+ * @param obj another RtfColor
+ * @return <code>True</code> if red, green and blue values of the two colours match,
+ * <code>false</code> otherwise.
+ */
+ public boolean equals(Object obj) {
+ if(!(obj instanceof RtfColor)) {
+ return false;
+ }
+ RtfColor color = (RtfColor) obj;
+ if(this.red == color.getRed() && this.green == color.getGreen() && this.blue == color.getBlue()) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ /**
+ * Returns the hash code of this RtfColor. The hash code is
+ * an integer with the lowest three bytes containing the values
+ * of red, green and blue.
+ *
+ * @return The hash code of this RtfColor
+ */
+ public int hashCode() {
+ return (this.red << 16) | (this.green << 8) | this.blue;
+ }
+
+ /**
+ * Get the blue value of this RtfColor
+ *
+ * @return The blue value
+ */
+ public int getBlue() {
+ return blue;
+ }
+
+ /**
+ * Get the green value of this RtfColor
+ *
+ * @return The green value
+ */
+ public int getGreen() {
+ return green;
+ }
+
+ /**
+ * Get the red value of this RtfColor
+ *
+ * @return The red value
+ */
+ public int getRed() {
+ return red;
+ }
+
+ /**
+ * Gets the number of this RtfColor in the list of colours
+ *
+ * @return Returns the colorNumber.
+ */
+ public int getColorNumber() {
+ return colorNumber;
+ }
+
+ /**
+ * Sets the RtfDocument this RtfColor belongs to
+ *
+ * @param doc The RtfDocument to use
+ */
+ public void setRtfDocument(RtfDocument doc) {
+ super.setRtfDocument(doc);
+ if(document != null) {
+ this.colorNumber = document.getDocumentHeader().getColorNumber(this);
+ }
+ }
+}
diff --git a/src/main/java/com/lowagie/text/rtf/style/RtfColorList.java b/src/main/java/com/lowagie/text/rtf/style/RtfColorList.java
new file mode 100644
index 0000000..ddb71d1
--- /dev/null
+++ b/src/main/java/com/lowagie/text/rtf/style/RtfColorList.java
@@ -0,0 +1,137 @@
+/*
+ * $Id: RtfColorList.java,v 1.16 2005/05/04 14:33:52 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2001, 2002, 2003, 2004 by Mark Hall
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the ?GNU LIBRARY GENERAL PUBLIC LICENSE?), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.rtf.style;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.util.ArrayList;
+
+import com.lowagie.text.rtf.RtfElement;
+import com.lowagie.text.rtf.RtfExtendedElement;
+import com.lowagie.text.rtf.document.RtfDocument;
+
+
+/**
+ * The RtfColorList stores all colours that appear in the document. Black
+ * and White are always added
+ *
+ * @version $Version:$
+ * @author Mark Hall (mhall@edu.uni-klu.ac.at)
+ */
+public class RtfColorList extends RtfElement implements RtfExtendedElement {
+
+ /**
+ * Constant for the beginning of the colour table
+ */
+ private static final byte[] COLOR_TABLE = "\\colortbl".getBytes();
+
+ /**
+ * ArrayList containing all colours of this RtfColorList
+ */
+ ArrayList colorList = new ArrayList();
+
+ /**
+ * Constructs a new RtfColorList for the RtfDocument. Will add the default
+ * black and white colours.
+ *
+ * @param doc The RtfDocument this RtfColorList belongs to
+ */
+ public RtfColorList(RtfDocument doc) {
+ super(doc);
+ colorList.add(new RtfColor(doc, 0, 0, 0, 0));
+ colorList.add(new RtfColor(doc, 255, 255, 255, 1));
+ }
+
+ /**
+ * Returns the index of the given RtfColor in the colour list. If the RtfColor
+ * is not in the list of colours, then it is added.
+ *
+ * @param color The RtfColor for which to get the index
+ * @return The index of the RtfColor
+ */
+ public int getColorNumber(RtfColor color) {
+ int colorIndex = -1;
+ for(int i = 0; i < colorList.size(); i++) {
+ if(colorList.get(i).equals(color)) {
+ colorIndex = i;
+ }
+ }
+ if(colorIndex == -1) {
+ colorIndex = colorList.size();
+ colorList.add(color);
+ }
+ return colorIndex;
+ }
+
+ /**
+ * Write the definition part of the colour list. Calls the writeDefinition
+ * methods of the RtfColors in the colour list.
+ *
+ * @return A byte array with the definition colour list
+ */
+ public byte[] writeDefinition() {
+ ByteArrayOutputStream result = new ByteArrayOutputStream();
+ try {
+ result.write(OPEN_GROUP);
+ result.write(COLOR_TABLE);
+ for(int i = 0; i < colorList.size(); i++) {
+ RtfColor color = (RtfColor) colorList.get(i);
+ result.write(color.writeDefinition());
+ }
+ result.write(CLOSE_GROUP);
+ result.write((byte)'\n');
+ } catch(IOException ioe) {
+ ioe.printStackTrace();
+ }
+ return result.toByteArray();
+ }
+
+}
diff --git a/src/main/java/com/lowagie/text/rtf/style/RtfFont.java b/src/main/java/com/lowagie/text/rtf/style/RtfFont.java
new file mode 100644
index 0000000..150b0b2
--- /dev/null
+++ b/src/main/java/com/lowagie/text/rtf/style/RtfFont.java
@@ -0,0 +1,681 @@
+/*
+ * $Id: RtfFont.java,v 1.23 2006/02/09 17:11:31 hallm Exp $
+ * $Name: $
+ *
+ * Copyright 2001, 2002, 2003, 2004 by Mark Hall
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the ?GNU LIBRARY GENERAL PUBLIC LICENSE?), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.rtf.style;
+
+import com.lowagie.text.rtf.RtfExtendedElement;
+import com.lowagie.text.rtf.document.RtfDocument;
+import com.lowagie.text.Font;
+
+import java.awt.Color;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+
+/**
+ * The RtfFont class stores one font for an rtf document. It extends Font,
+ * so can be set as a font, to allow adding of fonts with arbitrary names.
+ * BaseFont fontname handling contributed by Craig Fleming. Various fixes
+ * Renaud Michel, Werner Daehn.
+ *
+ * Version: $Id: RtfFont.java,v 1.23 2006/02/09 17:11:31 hallm Exp $
+ * @author Mark Hall (mhall@edu.uni-klu.ac.at)
+ * @author Craig Fleming (rythos@rhana.dhs.org)
+ * @author Renaud Michel (r.michel@immedia.be)
+ * @author Werner Daehn (Werner.Daehn@BusinessObjects.com)
+ */
+public class RtfFont extends Font implements RtfExtendedElement {
+ /**
+ * Constant for the font family to use ("froman")
+ */
+ private static final byte[] FONT_FAMILY = "\\froman".getBytes();
+ /**
+ * Constant for the charset
+ */
+ private static final byte[] FONT_CHARSET = "\\fcharset".getBytes();
+ /**
+ * Constant for the font size
+ */
+ public static final byte[] FONT_SIZE = "\\fs".getBytes();
+ /**
+ * Constant for the bold flag
+ */
+ private static final byte[] FONT_BOLD = "\\b".getBytes();
+ /**
+ * Constant for the italic flag
+ */
+ private static final byte[] FONT_ITALIC = "\\i".getBytes();
+ /**
+ * Constant for the underline flag
+ */
+ private static final byte[] FONT_UNDERLINE = "\\ul".getBytes();
+ /**
+ * Constant for the strikethrough flag
+ */
+ private static final byte[] FONT_STRIKETHROUGH = "\\strike".getBytes();
+ /**
+ * Constant for the double strikethrough flag
+ */
+ private static final byte[] FONT_DOUBLE_STRIKETHROUGH = "\\striked".getBytes();
+ /**
+ * Constant for the shadow flag
+ */
+ private static final byte[] FONT_SHADOW = "\\shad".getBytes();
+ /**
+ * Constant for the outline flag
+ */
+ private static final byte[] FONT_OUTLINE = "\\outl".getBytes();
+ /**
+ * Constant for the embossed flag
+ */
+ private static final byte[] FONT_EMBOSSED = "\\embo".getBytes();
+ /**
+ * Constant for the engraved flag
+ */
+ private static final byte[] FONT_ENGRAVED = "\\impr".getBytes();
+ /**
+ * Constant for hidden text flag
+ */
+ private static final byte[] FONT_HIDDEN = "\\v".getBytes();
+
+ /**
+ * Constant for a plain font
+ */
+ public static final int STYLE_NONE = 0;
+ /**
+ * Constant for a bold font
+ */
+ public static final int STYLE_BOLD = 1;
+ /**
+ * Constant for an italic font
+ */
+ public static final int STYLE_ITALIC = 2;
+ /**
+ * Constant for an underlined font
+ */
+ public static final int STYLE_UNDERLINE = 4;
+ /**
+ * Constant for a strikethrough font
+ */
+ public static final int STYLE_STRIKETHROUGH = 8;
+ /**
+ * Constant for a double strikethrough font
+ */
+ public static final int STYLE_DOUBLE_STRIKETHROUGH = 16;
+ /**
+ * Constant for a shadowed font
+ */
+ public static final int STYLE_SHADOW = 32;
+ /**
+ * Constant for an outlined font
+ */
+ public static final int STYLE_OUTLINE = 64;
+ /**
+ * Constant for an embossed font
+ */
+ public static final int STYLE_EMBOSSED = 128;
+ /**
+ * Constant for an engraved font
+ */
+ public static final int STYLE_ENGRAVED = 256;
+ /**
+ * Constant for a font that hides the actual text.
+ */
+ public static final int STYLE_HIDDEN = 512;
+
+ /**
+ * The font name. Defaults to "Times New Roman"
+ */
+ private String fontName = "Times New Roman";
+ /**
+ * The font size. Defaults to 10
+ */
+ private int fontSize = 10;
+ /**
+ * The font style. Defaults to STYLE_NONE
+ */
+ private int fontStyle = STYLE_NONE;
+ /**
+ * The number of this font
+ */
+ private int fontNumber = 0;
+ /**
+ * The colour of this font
+ */
+ private RtfColor color = null;
+ /**
+ * The character set to use for this font
+ */
+ private int charset = 0;
+ /**
+ * The RtfDocument this RtfFont belongs to.
+ */
+ protected RtfDocument document = null;
+
+ /**
+ * Constructs a RtfFont with the given font name and all other properties
+ * at their default values.
+ *
+ * @param fontName The font name to use
+ */
+ public RtfFont(String fontName) {
+ super(Font.UNDEFINED, Font.UNDEFINED, Font.UNDEFINED, null);
+ this.fontName = fontName;
+ }
+
+ /**
+ * Constructs a RtfFont with the given font name and font size and all other
+ * properties at their default values.
+ *
+ * @param fontName The font name to use
+ * @param size The font size to use
+ */
+ public RtfFont(String fontName, float size) {
+ super(Font.UNDEFINED, size, Font.UNDEFINED, null);
+ this.fontName = fontName;
+ }
+
+ /**
+ * Constructs a RtfFont with the given font name, font size and font style and the
+ * default color.
+ *
+ * @param fontName The font name to use
+ * @param size The font size to use
+ * @param style The font style to use
+ */
+ public RtfFont(String fontName, float size, int style) {
+ super(Font.UNDEFINED, size, style, null);
+ this.fontName = fontName;
+ }
+
+ /**
+ * Constructs a RtfFont with the given font name, font size, font style and
+ * color.
+ *
+ * @param fontName The font name to use
+ * @param size the font size to use
+ * @param style The font style to use
+ * @param color The font color to use
+ */
+ public RtfFont(String fontName, float size, int style, Color color) {
+ super(Font.UNDEFINED, size, style, color);
+ this.fontName = fontName;
+ }
+
+ /**
+ * Special constructor for the default font
+ *
+ * @param doc The RtfDocument this font appears in
+ * @param fontNumber The id of this font
+ */
+ protected RtfFont(RtfDocument doc, int fontNumber) {
+ this.document = doc;
+ this.fontNumber = fontNumber;
+ color = new RtfColor(doc, 0, 0, 0);
+ }
+
+ /**
+ * Constructs a RtfFont from a com.lowagie.text.Font
+ * @param doc The RtfDocument this font appears in
+ * @param font The Font to use as a base
+ */
+ public RtfFont(RtfDocument doc, Font font) {
+ this.document = doc;
+ if(font != null) {
+ if(font instanceof RtfFont) {
+ this.fontName = ((RtfFont) font).getFontName();
+ } else {
+ setToDefaultFamily(font.getFamilyname());
+ }
+ if(font.getBaseFont() != null) {
+ String[][] fontNames = font.getBaseFont().getFullFontName();
+ for(int i = 0; i < fontNames.length; i++) {
+ if(fontNames[i][2].equals("0")) {
+ this.fontName = fontNames[i][3];
+ break;
+ } else if(fontNames[i][2].equals("1033") || fontNames[i][2].equals("")) {
+ this.fontName = fontNames[i][3];
+ }
+ }
+ }
+
+ setSize(font.size());
+ setStyle(font.style());
+ setColor(font.color());
+ }
+
+ if(this.fontName.equalsIgnoreCase("unknown")) {
+ return;
+ }
+
+ if(document != null) {
+ setRtfDocument(document);
+ }
+ }
+
+ /**
+ * Writes the font definition
+ *
+ * @return A byte array with the font definition
+ */
+ public byte[] writeDefinition() {
+ ByteArrayOutputStream result = new ByteArrayOutputStream();
+ try {
+ result.write(FONT_FAMILY);
+ result.write(FONT_CHARSET);
+ result.write(intToByteArray(charset));
+ result.write(DELIMITER);
+ result.write(document.filterSpecialChar(fontName, true, false).getBytes());
+ } catch(IOException ioe) {
+ ioe.printStackTrace();
+ }
+ return result.toByteArray();
+ }
+
+ /**
+ * Writes the font beginning
+ *
+ * @return A byte array with the font start data
+ */
+ public byte[] writeBegin() {
+ ByteArrayOutputStream result = new ByteArrayOutputStream();
+ try {
+ if(this.fontNumber != Font.UNDEFINED) {
+ result.write(RtfFontList.FONT_NUMBER);
+ result.write(intToByteArray(fontNumber));
+ }
+ if(this.fontSize != Font.UNDEFINED) {
+ result.write(FONT_SIZE);
+ result.write(intToByteArray(fontSize * 2));
+ }
+ if(this.fontStyle != UNDEFINED) {
+ if((fontStyle & STYLE_BOLD) == STYLE_BOLD) {
+ result.write(FONT_BOLD);
+ }
+ if((fontStyle & STYLE_ITALIC) == STYLE_ITALIC) {
+ result.write(FONT_ITALIC);
+ }
+ if((fontStyle & STYLE_UNDERLINE) == STYLE_UNDERLINE) {
+ result.write(FONT_UNDERLINE);
+ }
+ if((fontStyle & STYLE_STRIKETHROUGH) == STYLE_STRIKETHROUGH) {
+ result.write(FONT_STRIKETHROUGH);
+ }
+ if((fontStyle & STYLE_HIDDEN) == STYLE_HIDDEN) {
+ result.write(FONT_HIDDEN);
+ }
+ if((fontStyle & STYLE_DOUBLE_STRIKETHROUGH) == STYLE_DOUBLE_STRIKETHROUGH) {
+ result.write(FONT_DOUBLE_STRIKETHROUGH);
+ result.write(intToByteArray(1));
+ }
+ if((fontStyle & STYLE_SHADOW) == STYLE_SHADOW) {
+ result.write(FONT_SHADOW);
+ }
+ if((fontStyle & STYLE_OUTLINE) == STYLE_OUTLINE) {
+ result.write(FONT_OUTLINE);
+ }
+ if((fontStyle & STYLE_EMBOSSED) == STYLE_EMBOSSED) {
+ result.write(FONT_EMBOSSED);
+ }
+ if((fontStyle & STYLE_ENGRAVED) == STYLE_ENGRAVED) {
+ result.write(FONT_ENGRAVED);
+ }
+ }
+ if(color != null) {
+ result.write(color.writeBegin());
+ }
+ } catch(IOException ioe) {
+ ioe.printStackTrace();
+ }
+ return result.toByteArray();
+ }
+
+ /**
+ * Write the font end
+ *
+ * @return A byte array with the end of font data
+ */
+ public byte[] writeEnd() {
+ ByteArrayOutputStream result = new ByteArrayOutputStream();
+ try {
+ if(this.fontStyle != UNDEFINED) {
+ if((fontStyle & STYLE_BOLD) == STYLE_BOLD) {
+ result.write(FONT_BOLD);
+ result.write(intToByteArray(0));
+ }
+ if((fontStyle & STYLE_ITALIC) == STYLE_ITALIC) {
+ result.write(FONT_ITALIC);
+ result.write(intToByteArray(0));
+ }
+ if((fontStyle & STYLE_UNDERLINE) == STYLE_UNDERLINE) {
+ result.write(FONT_UNDERLINE);
+ result.write(intToByteArray(0));
+ }
+ if((fontStyle & STYLE_STRIKETHROUGH) == STYLE_STRIKETHROUGH) {
+ result.write(FONT_STRIKETHROUGH);
+ result.write(intToByteArray(0));
+ }
+ if((fontStyle & STYLE_HIDDEN) == STYLE_HIDDEN) {
+ result.write(FONT_HIDDEN);
+ result.write(intToByteArray(0));
+ }
+ if((fontStyle & STYLE_DOUBLE_STRIKETHROUGH) == STYLE_DOUBLE_STRIKETHROUGH) {
+ result.write(FONT_DOUBLE_STRIKETHROUGH);
+ result.write(intToByteArray(0));
+ }
+ if((fontStyle & STYLE_SHADOW) == STYLE_SHADOW) {
+ result.write(FONT_SHADOW);
+ result.write(intToByteArray(0));
+ }
+ if((fontStyle & STYLE_OUTLINE) == STYLE_OUTLINE) {
+ result.write(FONT_OUTLINE);
+ result.write(intToByteArray(0));
+ }
+ if((fontStyle & STYLE_EMBOSSED) == STYLE_EMBOSSED) {
+ result.write(FONT_EMBOSSED);
+ result.write(intToByteArray(0));
+ }
+ if((fontStyle & STYLE_ENGRAVED) == STYLE_ENGRAVED) {
+ result.write(FONT_ENGRAVED);
+ result.write(intToByteArray(0));
+ }
+ }
+ } catch(IOException ioe) {
+ ioe.printStackTrace();
+ }
+ return result.toByteArray();
+ }
+
+ /**
+ * Unused
+ * @return an empty byte array
+ */
+ public byte[] write() {
+ return new byte[0];
+ }
+
+ /**
+ * Tests for equality of RtfFonts. RtfFonts are equal if their fontName,
+ * fontSize, fontStyle and fontSuperSubscript are equal
+ *
+ * @param obj The RtfFont to compare with this RtfFont
+ * @return <code>True</code> if the RtfFonts are equal, <code>false</code> otherwise
+ */
+ public boolean equals(Object obj) {
+ if(!(obj instanceof RtfFont)) {
+ return false;
+ }
+ RtfFont font = (RtfFont) obj;
+ boolean result = true;
+ result = result & this.fontName.equals(font.getFontName());
+
+ return result;
+ }
+
+ /**
+ * Returns the hash code of this RtfFont. The hash code is the hash code of the
+ * string containing the font name + font size + "-" + the font style + "-" + the
+ * font super/supscript value.
+ *
+ * @return The hash code of this RtfFont
+ */
+ public int hashCode() {
+ return (this.fontName + this.fontSize + "-" + this.fontStyle).hashCode();
+ }
+
+ /**
+ * Gets the font name of this RtfFont
+ *
+ * @return The font name
+ */
+ public String getFontName() {
+ return this.fontName;
+ }
+
+ /**
+ * Sets the font name of this RtfFont.
+ *
+ * @param fontName The font name to use
+ */
+ protected void setFontName(String fontName) {
+ this.fontName = fontName;
+ if(document != null) {
+ this.fontNumber = document.getDocumentHeader().getFontNumber(this);
+ }
+ }
+
+ /**
+ * @see com.lowagie.text.Font#getFamilyname()
+ */
+ public String getFamilyname() {
+ return this.fontName;
+ }
+
+ /**
+ * @see com.lowagie.text.Font#setFamily(String)
+ */
+ public void setFamily(String family){
+ super.setFamily(family);
+ setToDefaultFamily(family);
+ }
+
+ /**
+ * Sets the correct font name from the family name.
+ *
+ * @param familyname The family name to set the name to.
+ */
+ private void setToDefaultFamily(String familyname){
+ switch (Font.getFamilyIndex(familyname)) {
+ case Font.COURIER:
+ this.fontName = "Courier";
+ break;
+ case Font.HELVETICA:
+ this.fontName = "Arial";
+ break;
+ case Font.SYMBOL:
+ this.fontName = "Symbol";
+ this.charset = 2;
+ break;
+ case Font.TIMES_ROMAN:
+ this.fontName = "Times New Roman";
+ break;
+ case Font.ZAPFDINGBATS:
+ this.fontName = "Windings";
+ break;
+ default:
+ this.fontName = familyname;
+ }
+ }
+
+ /**
+ * Gets the font size of this RtfFont
+ *
+ * @return The font size
+ */
+ public int getFontSize() {
+ return this.fontSize;
+ }
+
+ /**
+ * @see com.lowagie.text.Font#setSize(float)
+ */
+ public void setSize(float size){
+ super.setSize(size);
+ this.fontSize = (int) size();
+ }
+
+ /**
+ * Gets the font style of this RtfFont
+ *
+ * @return The font style
+ */
+ public int getFontStyle() {
+ return this.fontStyle;
+ }
+
+ /**
+ * @see com.lowagie.text.Font#setStyle(int)
+ */
+ public void setStyle(int style){
+ super.setStyle(style);
+ this.fontStyle = style();
+ }
+
+ /**
+ * @see com.lowagie.text.Font#setStyle(String)
+ */
+ public void setStyle(String style) {
+ super.setStyle(style);
+ fontStyle = style();
+ }
+
+ /**
+ * Gets the font number of this RtfFont
+ *
+ * @return The font number
+ */
+ public int getFontNumber() {
+ return fontNumber;
+ }
+
+ /**
+ * Sets the RtfDocument this RtfFont belongs to
+ *
+ * @param doc The RtfDocument to use
+ */
+ public void setRtfDocument(RtfDocument doc) {
+ this.document = doc;
+ if(document != null) {
+ this.fontNumber = document.getDocumentHeader().getFontNumber(this);
+ }
+ if(this.color != null) {
+ this.color.setRtfDocument(this.document);
+ }
+ }
+
+ /**
+ * Unused
+ * @param inTable
+ */
+ public void setInTable(boolean inTable) {
+ }
+
+ /**
+ * Unused
+ * @param inHeader
+ */
+ public void setInHeader(boolean inHeader) {
+ }
+
+ /**
+ * @see com.lowagie.text.Font#setColor(Color)
+ */
+ public void setColor(Color color) {
+ super.setColor(color);
+ if(color != null) {
+ this.color = new RtfColor(document, color);
+ } else {
+ this.color = null;
+ }
+ }
+
+ /**
+ * @see com.lowagie.text.Font#setColor(int, int, int)
+ */
+ public void setColor(int red, int green, int blue) {
+ super.setColor(red,green,blue);
+ this.color = new RtfColor(document, red, green, blue);
+ }
+
+ /**
+ * Transforms an integer into its String representation and then returns the bytes
+ * of that string.
+ *
+ * @param i The integer to convert
+ * @return A byte array representing the integer
+ */
+ protected byte[] intToByteArray(int i) {
+ return Integer.toString(i).getBytes();
+ }
+
+ /**
+ * Replaces the attributes that are equal to <VAR>null</VAR> with
+ * the attributes of a given font.
+ *
+ * @param font The surrounding font
+ * @return A RtfFont
+ */
+ public Font difference(Font font) {
+ String dFamilyname = font.getFamilyname();
+ if(dFamilyname == null || dFamilyname.trim().equals("") || dFamilyname.trim().equalsIgnoreCase("unknown")) {
+ dFamilyname = this.fontName;
+ }
+
+ float dSize = font.size();
+ if(dSize == Font.UNDEFINED) {
+ dSize = this.size();
+ }
+
+ int dStyle = Font.UNDEFINED;
+ if(this.style() != Font.UNDEFINED && font.style() != Font.UNDEFINED) {
+ dStyle = this.style() | font.style();
+ } else if(this.style() != Font.UNDEFINED) {
+ dStyle = this.style();
+ } else if(font.style() != Font.UNDEFINED) {
+ dStyle = font.style();
+ }
+
+ Color dColor = font.color();
+ if(dColor == null) {
+ dColor = this.color();
+ }
+
+ return new RtfFont(dFamilyname, dSize, dStyle, dColor);
+ }
+}
diff --git a/src/main/java/com/lowagie/text/rtf/style/RtfFontList.java b/src/main/java/com/lowagie/text/rtf/style/RtfFontList.java
new file mode 100644
index 0000000..6e90371
--- /dev/null
+++ b/src/main/java/com/lowagie/text/rtf/style/RtfFontList.java
@@ -0,0 +1,149 @@
+/*
+ * $Id: RtfFontList.java,v 1.17 2005/12/24 13:10:37 hallm Exp $
+ * $Name: $
+ *
+ * Copyright 2001, 2002, 2003, 2004 by Mark Hall
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the ?GNU LIBRARY GENERAL PUBLIC LICENSE?), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.rtf.style;
+
+import com.lowagie.text.rtf.RtfElement;
+import com.lowagie.text.rtf.RtfExtendedElement;
+import com.lowagie.text.rtf.document.RtfDocument;
+
+import java.util.ArrayList;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+
+/**
+ * The RtfFontList stores the list of fonts used in the rtf document. It also
+ * has methods for writing this list to the document
+ *
+ * Version: $Id: RtfFontList.java,v 1.17 2005/12/24 13:10:37 hallm Exp $
+ * @author Mark Hall (mhall@edu.uni-klu.ac.at)
+ */
+public class RtfFontList extends RtfElement implements RtfExtendedElement {
+
+ /**
+ * Constant for the default font
+ */
+ private static final byte[] DEFAULT_FONT = "\\deff".getBytes();
+ /**
+ * Constant for the font table
+ */
+ private static final byte[] FONT_TABLE = "\\fonttbl".getBytes();
+ /**
+ * Constant for the font number
+ */
+ public static final byte[] FONT_NUMBER = "\\f".getBytes();
+
+ /**
+ * The list of fonts
+ */
+ private ArrayList fontList = new ArrayList();
+
+ /**
+ * Creates a RtfFontList
+ *
+ * @param doc The RtfDocument this RtfFontList belongs to
+ */
+ public RtfFontList(RtfDocument doc) {
+ super(doc);
+ fontList.add(new RtfFont(document, 0));
+ }
+
+ /**
+ * Gets the index of the font in the list of fonts. If the font does not
+ * exist in the list, it is added.
+ *
+ * @param font The font to get the id for
+ * @return The index of the font
+ */
+ public int getFontNumber(RtfFont font) {
+ if(font instanceof RtfParagraphStyle) {
+ font = new RtfFont(this.document, (RtfParagraphStyle) font);
+ }
+ int fontIndex = -1;
+ for(int i = 0; i < fontList.size(); i++) {
+ if(fontList.get(i).equals(font)) {
+ fontIndex = i;
+ }
+ }
+ if(fontIndex == -1) {
+ fontIndex = fontList.size();
+ fontList.add(font);
+ }
+ return fontIndex;
+ }
+
+ /**
+ * Writes the definition of the font list
+ *
+ * @return A byte array with the definition of the font list
+ */
+ public byte[] writeDefinition() {
+ ByteArrayOutputStream result = new ByteArrayOutputStream();
+ try {
+ result.write(DEFAULT_FONT);
+ result.write(intToByteArray(0));
+ result.write(OPEN_GROUP);
+ result.write(FONT_TABLE);
+ for(int i = 0; i < fontList.size(); i++) {
+ result.write(OPEN_GROUP);
+ result.write(FONT_NUMBER);
+ result.write(intToByteArray(i));
+ result.write(((RtfFont) fontList.get(i)).writeDefinition());
+ result.write(COMMA_DELIMITER);
+ result.write(CLOSE_GROUP);
+ }
+ result.write(CLOSE_GROUP);
+ result.write((byte)'\n');
+ } catch(IOException ioe) {
+ ioe.printStackTrace();
+ }
+ return result.toByteArray();
+ }
+}
diff --git a/src/main/java/com/lowagie/text/rtf/style/RtfParagraphStyle.java b/src/main/java/com/lowagie/text/rtf/style/RtfParagraphStyle.java
new file mode 100644
index 0000000..d8c582c
--- /dev/null
+++ b/src/main/java/com/lowagie/text/rtf/style/RtfParagraphStyle.java
@@ -0,0 +1,665 @@
+package com.lowagie.text.rtf.style;
+
+import java.awt.Color;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+
+import com.lowagie.text.Element;
+import com.lowagie.text.Font;
+import com.lowagie.text.rtf.RtfBasicElement;
+import com.lowagie.text.rtf.document.RtfDocument;
+import com.lowagie.text.rtf.text.RtfParagraph;
+
+/**
+ * The RtfParagraphStyle stores all style/formatting attributes of a RtfParagraph.
+ * Additionally it also supports the style name system available in RTF. The RtfParagraphStyle
+ * is a Font and can thus be used as such. To use the stylesheet functionality
+ * it needs to be set as the font of a Paragraph. Otherwise it will work like a
+ * RtfFont. It also supports inheritance of styles.
+ *
+ * @version $Revision: 1.4 $
+ * @author Mark Hall (mhall@edu.uni-klu.ac.at)
+ */
+public class RtfParagraphStyle extends RtfFont {
+
+ /**
+ * Constant for left alignment
+ */
+ public static final byte[] ALIGN_LEFT = "\\ql".getBytes();
+ /**
+ * Constant for right alignment
+ */
+ public static final byte[] ALIGN_RIGHT = "\\qr".getBytes();
+ /**
+ * Constant for center alignment
+ */
+ public static final byte[] ALIGN_CENTER = "\\qc".getBytes();
+ /**
+ * Constant for justified alignment
+ */
+ public static final byte[] ALIGN_JUSTIFY = "\\qj".getBytes();
+ /**
+ * Constant for left indentation
+ */
+ public static final byte[] INDENT_LEFT = "\\li".getBytes();
+ /**
+ * Constant for right indentation
+ */
+ public static final byte[] INDENT_RIGHT = "\\ri".getBytes();
+ /**
+ * Constant for keeping the paragraph together on one page
+ */
+ public static final byte[] KEEP_TOGETHER = "\\keep".getBytes();
+ /**
+ * Constant for keeping the paragraph toghether with the next one on one page
+ */
+ public static final byte[] KEEP_TOGETHER_WITH_NEXT = "\\keepn".getBytes();
+ /**
+ * Constant for the space after the paragraph.
+ */
+ public static final byte[] SPACING_AFTER = "\\sa".getBytes();
+ /**
+ * Constant for the space before the paragraph.
+ */
+ public static final byte[] SPACING_BEFORE = "\\sb".getBytes();
+
+ /**
+ * The NORMAL/STANDARD style.
+ */
+ public static final RtfParagraphStyle STYLE_NORMAL = new RtfParagraphStyle("Normal", "Arial", 12, Font.NORMAL, Color.black);
+ /**
+ * The style for level 1 headings.
+ */
+ public static final RtfParagraphStyle STYLE_HEADING_1 = new RtfParagraphStyle("heading 1", "Normal");
+ /**
+ * The style for level 2 headings.
+ */
+ public static final RtfParagraphStyle STYLE_HEADING_2 = new RtfParagraphStyle("heading 2", "Normal");
+ /**
+ * The style for level 3 headings.
+ */
+ public static final RtfParagraphStyle STYLE_HEADING_3 = new RtfParagraphStyle("heading 3", "Normal");
+
+ /**
+ * Initialises the properties of the styles.
+ */
+ static {
+ STYLE_HEADING_1.setSize(16);
+ STYLE_HEADING_1.setStyle(Font.BOLD);
+ STYLE_HEADING_2.setSize(14);
+ STYLE_HEADING_2.setStyle(Font.BOLDITALIC);
+ STYLE_HEADING_3.setSize(13);
+ STYLE_HEADING_3.setStyle(Font.BOLD);
+ }
+
+ /**
+ * No modification has taken place when compared to the RtfParagraphStyle this RtfParagraphStyle
+ * is based on. These modification markers are used to determine what needs to be
+ * inherited and what not from the parent RtfParagraphStyle.
+ */
+ private static final int MODIFIED_NONE = 0;
+ /**
+ * The alignment has been modified.
+ */
+ private static final int MODIFIED_ALIGNMENT = 1;
+ /**
+ * The left indentation has been modified.
+ */
+ private static final int MODIFIED_INDENT_LEFT = 2;
+ /**
+ * The right indentation has been modified.
+ */
+ private static final int MODIFIED_INDENT_RIGHT = 4;
+ /**
+ * The spacing before a paragraph has been modified.
+ */
+ private static final int MODIFIED_SPACING_BEFORE = 8;
+ /**
+ * The spacing after a paragraph has been modified.
+ */
+ private static final int MODIFIED_SPACING_AFTER = 16;
+ /**
+ * The font name has been modified.
+ */
+ private static final int MODIFIED_FONT_NAME = 32;
+ /**
+ * The font style has been modified.
+ */
+ private static final int MODIFIED_FONT_SIZE = 64;
+ /**
+ * The font size has been modified.
+ */
+ private static final int MODIFIED_FONT_STYLE = 128;
+ /**
+ * The font colour has been modified.
+ */
+ private static final int MODIFIED_FONT_COLOR = 256;
+ /**
+ * The line leading has been modified.
+ */
+ private static final int MODIFIED_LINE_LEADING = 512;
+ /**
+ * The paragraph keep together setting has been modified.
+ */
+ private static final int MODIFIED_KEEP_TOGETHER = 1024;
+ /**
+ * The paragraph keep together with next setting has been modified.
+ */
+ private static final int MODIFIED_KEEP_TOGETHER_WITH_NEXT = 2048;
+
+ /**
+ * The alignment of the paragraph.
+ */
+ private int alignment = Element.ALIGN_LEFT;
+ /**
+ * The left indentation of the paragraph.
+ */
+ private int indentLeft = 0;
+ /**
+ * The right indentation of the paragraph.
+ */
+ private int indentRight = 0;
+ /**
+ * The spacing before a paragraph.
+ */
+ private int spacingBefore = 0;
+ /**
+ * The spacing after a paragraph.
+ */
+ private int spacingAfter = 0;
+ /**
+ * The line leading of the paragraph.
+ */
+ private int lineLeading = 0;
+ /**
+ * Whether this RtfParagraph must stay on one page.
+ */
+ private boolean keepTogether = false;
+ /**
+ * Whether this RtfParagraph must stay on the same page as the next paragraph.
+ */
+ private boolean keepTogetherWithNext = false;
+ /**
+ * The name of this RtfParagraphStyle.
+ */
+ private String styleName = "";
+ /**
+ * The name of the RtfParagraphStyle this RtfParagraphStyle is based on.
+ */
+ private String basedOnName = null;
+ /**
+ * The RtfParagraphStyle this RtfParagraphStyle is based on.
+ */
+ private RtfParagraphStyle baseStyle = null;
+ /**
+ * Which properties have been modified when compared to the base style.
+ */
+ private int modified = MODIFIED_NONE;
+ /**
+ * The number of this RtfParagraphStyle in the stylesheet list.
+ */
+ private int styleNumber = -1;
+
+ /**
+ * Constructs a new RtfParagraphStyle with the given attributes.
+ *
+ * @param styleName The name of this RtfParagraphStyle.
+ * @param fontName The name of the font to use for this RtfParagraphStyle.
+ * @param fontSize The size of the font to use for this RtfParagraphStyle.
+ * @param fontStyle The style of the font to use for this RtfParagraphStyle.
+ * @param fontColor The colour of the font to use for this RtfParagraphStyle.
+ */
+ public RtfParagraphStyle(String styleName, String fontName, int fontSize, int fontStyle, Color fontColor) {
+ super(null, new RtfFont(fontName, fontSize, fontStyle, fontColor));
+ this.styleName = styleName;
+ }
+
+ /**
+ * Constructs a new RtfParagraphStyle that is based on an existing RtfParagraphStyle.
+ *
+ * @param styleName The name of this RtfParagraphStyle.
+ * @param basedOnName The name of the RtfParagraphStyle this RtfParagraphStyle is based on.
+ */
+ public RtfParagraphStyle(String styleName, String basedOnName) {
+ super(null, new Font());
+ this.styleName = styleName;
+ this.basedOnName = basedOnName;
+ }
+
+ /**
+ * Constructs a RtfParagraphStyle from another RtfParagraphStyle.
+ *
+ * INTERNAL USE ONLY
+ *
+ * @param doc The RtfDocument this RtfParagraphStyle belongs to.
+ * @param style The RtfParagraphStyle to copy settings from.
+ */
+ public RtfParagraphStyle(RtfDocument doc, RtfParagraphStyle style) {
+ super(doc, style);
+ this.document = doc;
+ this.styleName = style.getStyleName();
+ this.alignment = style.getAlignment();
+ this.indentLeft = (int) (style.getIndentLeft() * RtfBasicElement.TWIPS_FACTOR);
+ this.indentRight = (int) (style.getIndentRight() * RtfBasicElement.TWIPS_FACTOR);
+ this.spacingBefore = (int) (style.getSpacingBefore() * RtfBasicElement.TWIPS_FACTOR);
+ this.spacingAfter = (int) (style.getSpacingAfter() * RtfBasicElement.TWIPS_FACTOR);
+ this.lineLeading = (int) (style.getLineLeading() * RtfBasicElement.TWIPS_FACTOR);
+ this.keepTogether = style.getKeepTogether();
+ this.keepTogetherWithNext = style.getKeepTogetherWithNext();
+ this.basedOnName = style.basedOnName;
+ this.modified = style.modified;
+ this.styleNumber = style.getStyleNumber();
+
+ if(this.document != null) {
+ setRtfDocument(this.document);
+ }
+ }
+
+ /**
+ * Gets the name of this RtfParagraphStyle.
+ *
+ * @return The name of this RtfParagraphStyle.
+ */
+ public String getStyleName() {
+ return this.styleName;
+ }
+
+ /**
+ * Gets the name of the RtfParagraphStyle this RtfParagraphStyle is based on.
+ *
+ * @return The name of the base RtfParagraphStyle.
+ */
+ public String getBasedOnName() {
+ return this.basedOnName;
+ }
+
+ /**
+ * Gets the alignment of this RtfParagraphStyle.
+ *
+ * @return The alignment of this RtfParagraphStyle.
+ */
+ public int getAlignment() {
+ return this.alignment;
+ }
+
+ /**
+ * Sets the alignment of this RtfParagraphStyle.
+ *
+ * @param alignment The alignment to use.
+ */
+ public void setAlignment(int alignment) {
+ this.modified = this.modified | MODIFIED_ALIGNMENT;
+ this.alignment = alignment;
+ }
+
+ /**
+ * Gets the left indentation of this RtfParagraphStyle.
+ *
+ * @return The left indentation of this RtfParagraphStyle.
+ */
+ public int getIndentLeft() {
+ return this.indentLeft;
+ }
+
+ /**
+ * Sets the left indentation of this RtfParagraphStyle.
+ *
+ * @param indentLeft The left indentation to use.
+ */
+ public void setIndentLeft(int indentLeft) {
+ this.modified = this.modified | MODIFIED_INDENT_LEFT;
+ this.indentLeft = indentLeft;
+ }
+
+ /**
+ * Gets the right indentation of this RtfParagraphStyle.
+ *
+ * @return The right indentation of this RtfParagraphStyle.
+ */
+ public int getIndentRight() {
+ return this.indentRight;
+ }
+
+ /**
+ * Sets the right indentation of this RtfParagraphStyle.
+ *
+ * @param indentRight The right indentation to use.
+ */
+ public void setIndentRight(int indentRight) {
+ this.modified = this.modified | MODIFIED_INDENT_RIGHT;
+ this.indentRight = indentRight;
+ }
+
+ /**
+ * Gets the space before the paragraph of this RtfParagraphStyle..
+ *
+ * @return The space before the paragraph.
+ */
+ public int getSpacingBefore() {
+ return this.spacingBefore;
+ }
+
+ /**
+ * Sets the space before the paragraph of this RtfParagraphStyle.
+ *
+ * @param spacingBefore The space before to use.
+ */
+ public void setSpacingBefore(int spacingBefore) {
+ this.modified = this.modified | MODIFIED_SPACING_BEFORE;
+ this.spacingBefore = spacingBefore;
+ }
+
+ /**
+ * Gets the space after the paragraph of this RtfParagraphStyle.
+ *
+ * @return The space after the paragraph.
+ */
+ public int getSpacingAfter() {
+ return this.spacingAfter;
+ }
+
+ /**
+ * Sets the space after the paragraph of this RtfParagraphStyle.
+ *
+ * @param spacingAfter The space after to use.
+ */
+ public void setSpacingAfter(int spacingAfter) {
+ this.modified = this.modified | MODIFIED_SPACING_AFTER;
+ this.spacingAfter = spacingAfter;
+ }
+
+ /**
+ * Sets the font name of this RtfParagraphStyle.
+ *
+ * @param fontName The font name to use
+ */
+ public void setFontName(String fontName) {
+ this.modified = this.modified | MODIFIED_FONT_NAME;
+ super.setFontName(fontName);
+ }
+
+ /**
+ * Sets the font size of this RtfParagraphStyle.
+ *
+ * @param fontSize The font size to use.
+ */
+ public void setSize(float fontSize) {
+ this.modified = this.modified | MODIFIED_FONT_SIZE;
+ super.setSize(fontSize);
+ }
+
+ /**
+ * Sets the font style of this RtfParagraphStyle.
+ *
+ * @param fontStyle The font style to use.
+ */
+ public void setStyle(int fontStyle) {
+ this.modified = this.modified | MODIFIED_FONT_STYLE;
+ super.setStyle(fontStyle);
+ }
+
+ /**
+ * Sets the colour of this RtfParagraphStyle.
+ *
+ * @param color The Color to use.
+ */
+ public void setColor(Color color) {
+ this.modified = this.modified | MODIFIED_FONT_COLOR;
+ super.setColor(color);
+ }
+
+ /**
+ * Gets the line leading of this RtfParagraphStyle.
+ *
+ * @return The line leading of this RtfParagraphStyle.
+ */
+ public int getLineLeading() {
+ return this.lineLeading;
+ }
+
+ /**
+ * Sets the line leading of this RtfParagraphStyle.
+ *
+ * @param lineLeading The line leading to use.
+ */
+ public void setLineLeading(int lineLeading) {
+ this.lineLeading = lineLeading;
+ this.modified = this.modified | MODIFIED_LINE_LEADING;
+ }
+
+ /**
+ * Gets whether the lines in the paragraph should be kept together in
+ * this RtfParagraphStyle.
+ *
+ * @return Whether the lines in the paragraph should be kept together.
+ */
+ public boolean getKeepTogether() {
+ return this.keepTogether;
+ }
+
+ /**
+ * Sets whether the lines in the paragraph should be kept together in
+ * this RtfParagraphStyle.
+ *
+ * @param keepTogether Whether the lines in the paragraph should be kept together.
+ */
+ public void setKeepTogether(boolean keepTogether) {
+ this.keepTogether = keepTogether;
+ this.modified = this.modified | MODIFIED_KEEP_TOGETHER;
+ }
+
+ /**
+ * Gets whether the paragraph should be kept toggether with the next in
+ * this RtfParagraphStyle.
+ *
+ * @return Whether the paragraph should be kept together with the next.
+ */
+ public boolean getKeepTogetherWithNext() {
+ return this.keepTogetherWithNext;
+ }
+
+ /**
+ * Sets whether the paragraph should be kept together with the next in
+ * this RtfParagraphStyle.
+ *
+ * @param keepTogetherWithNext Whether the paragraph should be kept together with the next.
+ */
+ public void setKeepTogetherWithNext(boolean keepTogetherWithNext) {
+ this.keepTogetherWithNext = keepTogetherWithNext;
+ this.modified = this.modified | MODIFIED_KEEP_TOGETHER_WITH_NEXT;
+ }
+
+ /**
+ * Handles the inheritance of paragraph style settings. All settings that
+ * have not been modified will be inherited from the base RtfParagraphStyle.
+ * If this RtfParagraphStyle is not based on another one, then nothing happens.
+ */
+ public void handleInheritance() {
+ if(this.basedOnName != null && this.document.getDocumentHeader().getRtfParagraphStyle(this.basedOnName) != null) {
+ this.baseStyle = this.document.getDocumentHeader().getRtfParagraphStyle(this.basedOnName);
+ this.baseStyle.handleInheritance();
+ if(!((this.modified & MODIFIED_ALIGNMENT) == MODIFIED_ALIGNMENT)) {
+ this.alignment = this.baseStyle.getAlignment();
+ }
+ if(!((this.modified & MODIFIED_INDENT_LEFT) == MODIFIED_INDENT_LEFT)) {
+ this.indentLeft = this.baseStyle.getIndentLeft();
+ }
+ if(!((this.modified & MODIFIED_INDENT_RIGHT) == MODIFIED_INDENT_RIGHT)) {
+ this.indentRight = this.baseStyle.getIndentRight();
+ }
+ if(!((this.modified & MODIFIED_SPACING_BEFORE) == MODIFIED_SPACING_BEFORE)) {
+ this.spacingBefore = this.baseStyle.getSpacingBefore();
+ }
+ if(!((this.modified & MODIFIED_SPACING_AFTER) == MODIFIED_SPACING_AFTER)) {
+ this.spacingAfter = this.baseStyle.getSpacingAfter();
+ }
+ if(!((this.modified & MODIFIED_FONT_NAME) == MODIFIED_FONT_NAME)) {
+ setFontName(this.baseStyle.getFontName());
+ }
+ if(!((this.modified & MODIFIED_FONT_SIZE) == MODIFIED_FONT_SIZE)) {
+ setSize(this.baseStyle.getFontSize());
+ }
+ if(!((this.modified & MODIFIED_FONT_STYLE) == MODIFIED_FONT_STYLE)) {
+ setStyle(this.baseStyle.getFontStyle());
+ }
+ if(!((this.modified & MODIFIED_FONT_COLOR) == MODIFIED_FONT_COLOR)) {
+ setColor(this.baseStyle.color());
+ }
+ if(!((this.modified & MODIFIED_LINE_LEADING) == MODIFIED_LINE_LEADING)) {
+ setLineLeading(this.baseStyle.getLineLeading());
+ }
+ if(!((this.modified & MODIFIED_KEEP_TOGETHER) == MODIFIED_KEEP_TOGETHER)) {
+ setKeepTogether(this.baseStyle.getKeepTogether());
+ }
+ if(!((this.modified & MODIFIED_KEEP_TOGETHER_WITH_NEXT) == MODIFIED_KEEP_TOGETHER_WITH_NEXT)) {
+ setKeepTogetherWithNext(this.baseStyle.getKeepTogetherWithNext());
+ }
+ }
+ }
+
+ /**
+ * Writes the settings of this RtfParagraphStyle.
+ *
+ * @return A byte array with the settings of this RtfParagraphStyle.
+ */
+ private byte[] writeParagraphSettings() {
+ ByteArrayOutputStream result = new ByteArrayOutputStream();
+ try {
+ if(this.keepTogether) {
+ result.write(RtfParagraphStyle.KEEP_TOGETHER);
+ }
+ if(this.keepTogetherWithNext) {
+ result.write(RtfParagraphStyle.KEEP_TOGETHER_WITH_NEXT);
+ }
+ switch (alignment) {
+ case Element.ALIGN_LEFT:
+ result.write(RtfParagraphStyle.ALIGN_LEFT);
+ break;
+ case Element.ALIGN_RIGHT:
+ result.write(RtfParagraphStyle.ALIGN_RIGHT);
+ break;
+ case Element.ALIGN_CENTER:
+ result.write(RtfParagraphStyle.ALIGN_CENTER);
+ break;
+ case Element.ALIGN_JUSTIFIED:
+ case Element.ALIGN_JUSTIFIED_ALL:
+ result.write(RtfParagraphStyle.ALIGN_JUSTIFY);
+ break;
+ }
+ result.write(RtfParagraphStyle.INDENT_LEFT);
+ result.write(intToByteArray(indentLeft));
+ result.write(RtfParagraphStyle.INDENT_RIGHT);
+ result.write(intToByteArray(indentRight));
+ if(this.spacingBefore > 0) {
+ result.write(RtfParagraphStyle.SPACING_BEFORE);
+ result.write(intToByteArray(this.spacingBefore));
+ }
+ if(this.spacingAfter > 0) {
+ result.write(RtfParagraphStyle.SPACING_AFTER);
+ result.write(intToByteArray(this.spacingAfter));
+ }
+ if(this.lineLeading > 0) {
+ result.write(RtfParagraph.LINE_SPACING);
+ result.write(intToByteArray(this.lineLeading));
+ }
+ } catch(IOException ioe) {
+ ioe.printStackTrace();
+ }
+ return result.toByteArray();
+ }
+
+ /**
+ * Writes the definition of this RtfParagraphStyle for the stylesheet list.
+ */
+ public byte[] writeDefinition() {
+ ByteArrayOutputStream result = new ByteArrayOutputStream();
+ try {
+ result.write("{".getBytes());
+ result.write("\\style".getBytes());
+ result.write("\\s".getBytes());
+ result.write(intToByteArray(this.styleNumber));
+ result.write(RtfBasicElement.DELIMITER);
+ result.write(writeParagraphSettings());
+ result.write(super.writeBegin());
+ result.write(RtfBasicElement.DELIMITER);
+ result.write(this.styleName.getBytes());
+ result.write(";".getBytes());
+ result.write("}".getBytes());
+ if(this.document.getDocumentSettings().isOutputDebugLineBreaks()) {
+ result.write('\n');
+ }
+ } catch(IOException ioe) {
+ ioe.printStackTrace();
+ }
+ return result.toByteArray();
+ }
+
+ /**
+ * Writes the start information of this RtfParagraphStyle.
+ */
+ public byte[] writeBegin() {
+ ByteArrayOutputStream result = new ByteArrayOutputStream();
+ try {
+ result.write("\\s".getBytes());
+ result.write(intToByteArray(this.styleNumber));
+ result.write(writeParagraphSettings());
+ } catch(IOException ioe) {
+ ioe.printStackTrace();
+ }
+ return result.toByteArray();
+ }
+
+ /**
+ * Unused
+ * @return An empty byte array.
+ */
+ public byte[] writeEnd() {
+ return new byte[0];
+ }
+
+ /**
+ * Unused
+ * @return An empty byte array.
+ */
+ public byte[] write() {
+ return new byte[0];
+ }
+
+ /**
+ * Tests whether two RtfParagraphStyles are equal. Equality
+ * is determined via the name.
+ */
+ public boolean equals(Object o) {
+ if(o == null || !(o instanceof RtfParagraphStyle)) {
+ return false;
+ }
+ RtfParagraphStyle paragraphStyle = (RtfParagraphStyle) o;
+ boolean result = this.getStyleName().equals(paragraphStyle.getStyleName());
+ return result;
+ }
+
+ /**
+ * Gets the hash code of this RtfParagraphStyle.
+ */
+ public int hashCode() {
+ return this.styleName.hashCode();
+ }
+
+ /**
+ * Gets the number of this RtfParagraphStyle in the stylesheet list.
+ *
+ * @return The number of this RtfParagraphStyle in the stylesheet list.
+ */
+ private int getStyleNumber() {
+ return this.styleNumber;
+ }
+
+ /**
+ * Sets the number of this RtfParagraphStyle in the stylesheet list.
+ *
+ * @param styleNumber The number to use.
+ */
+ protected void setStyleNumber(int styleNumber) {
+ this.styleNumber = styleNumber;
+ }
+}
diff --git a/src/main/java/com/lowagie/text/rtf/style/RtfStylesheetList.java b/src/main/java/com/lowagie/text/rtf/style/RtfStylesheetList.java
new file mode 100644
index 0000000..edb04ea
--- /dev/null
+++ b/src/main/java/com/lowagie/text/rtf/style/RtfStylesheetList.java
@@ -0,0 +1,121 @@
+/*
+ * Created on Sep 22, 2005
+ *
+ * To change the template for this generated file go to
+ * Window - Preferences - Java - Code Generation - Code and Comments
+ */
+package com.lowagie.text.rtf.style;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Iterator;
+
+import com.lowagie.text.rtf.RtfBasicElement;
+import com.lowagie.text.rtf.RtfElement;
+import com.lowagie.text.rtf.RtfExtendedElement;
+import com.lowagie.text.rtf.document.RtfDocument;
+
+/**
+ * The RtfStylesheetList stores the RtfParagraphStyles that are used in the document.
+ *
+ * @version $Revision: 1.1 $
+ * @author Mark Hall (mhall@edu.uni-klu.ac.at)
+ */
+public class RtfStylesheetList extends RtfElement implements RtfExtendedElement {
+
+ /**
+ * The HashMap containing the RtfParagraphStyles.
+ */
+ private HashMap styleMap = null;
+ /**
+ * Whether the default settings have been loaded.
+ */
+ private boolean defaultsLoaded = false;
+
+ /**
+ * Constructs a new RtfStylesheetList for the RtfDocument.
+ *
+ * @param doc The RtfDocument this RtfStylesheetList belongs to.
+ */
+ public RtfStylesheetList(RtfDocument doc) {
+ super(doc);
+ this.styleMap = new HashMap();
+ }
+
+ /**
+ * Register a RtfParagraphStyle with this RtfStylesheetList.
+ *
+ * @param rtfParagraphStyle The RtfParagraphStyle to add.
+ */
+ public void registerParagraphStyle(RtfParagraphStyle rtfParagraphStyle) {
+ RtfParagraphStyle tempStyle = new RtfParagraphStyle(this.document, rtfParagraphStyle);
+ tempStyle.setStyleNumber(this.styleMap.size());
+ tempStyle.handleInheritance();
+ this.styleMap.put(tempStyle.getStyleName(), tempStyle);
+ }
+
+ /**
+ * Registers all default styles. If styles with the given name have already been registered,
+ * then they are NOT overwritten.
+ */
+ private void registerDefaultStyles() {
+ defaultsLoaded = true;
+ if(!this.styleMap.containsKey(RtfParagraphStyle.STYLE_NORMAL.getStyleName())) {
+ registerParagraphStyle(RtfParagraphStyle.STYLE_NORMAL);
+ }
+ if(!this.styleMap.containsKey(RtfParagraphStyle.STYLE_HEADING_1.getStyleName())) {
+ registerParagraphStyle(RtfParagraphStyle.STYLE_HEADING_1);
+ }
+ if(!this.styleMap.containsKey(RtfParagraphStyle.STYLE_HEADING_2.getStyleName())) {
+ registerParagraphStyle(RtfParagraphStyle.STYLE_HEADING_2);
+ }
+ if(!this.styleMap.containsKey(RtfParagraphStyle.STYLE_HEADING_3.getStyleName())) {
+ registerParagraphStyle(RtfParagraphStyle.STYLE_HEADING_3);
+ }
+ }
+
+ /**
+ * Gets the RtfParagraphStyle with the given name. Makes sure that the defaults
+ * have been loaded.
+ *
+ * @param styleName The name of the RtfParagraphStyle to get.
+ * @return The RtfParagraphStyle with the given name or null.
+ */
+ public RtfParagraphStyle getRtfParagraphStyle(String styleName) {
+ if(!defaultsLoaded) {
+ registerDefaultStyles();
+ }
+ if(this.styleMap.containsKey(styleName)) {
+ return (RtfParagraphStyle) this.styleMap.get(styleName);
+ } else {
+ return null;
+ }
+ }
+
+ /**
+ * Writes the definition of the stylesheet list.
+ */
+ public byte[] writeDefinition() {
+ ByteArrayOutputStream result = new ByteArrayOutputStream();
+ try {
+ result.write("{".getBytes());
+ result.write("\\stylesheet".getBytes());
+ result.write(RtfBasicElement.DELIMITER);
+ if(this.document.getDocumentSettings().isOutputDebugLineBreaks()) {
+ result.write("\n".getBytes());
+ }
+ Iterator it = this.styleMap.values().iterator();
+ while(it.hasNext()) {
+ result.write(((RtfParagraphStyle) it.next()).writeDefinition());
+ }
+ result.write("}".getBytes());
+ if(this.document.getDocumentSettings().isOutputDebugLineBreaks()) {
+ result.write('\n');
+ }
+ } catch(IOException ioe) {
+ ioe.printStackTrace();
+ }
+ return result.toByteArray();
+ }
+}
diff --git a/src/main/java/com/lowagie/text/rtf/table/RtfBorder.java b/src/main/java/com/lowagie/text/rtf/table/RtfBorder.java
new file mode 100644
index 0000000..8a35867
--- /dev/null
+++ b/src/main/java/com/lowagie/text/rtf/table/RtfBorder.java
@@ -0,0 +1,577 @@
+/*
+ * $Id: RtfBorder.java,v 1.16 2005/05/04 14:33:54 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2001, 2002, 2003, 2004 by Mark Hall
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the ?GNU LIBRARY GENERAL PUBLIC LICENSE?), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.rtf.table;
+
+import java.awt.Color;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+
+import com.lowagie.text.rtf.RtfElement;
+import com.lowagie.text.rtf.document.RtfDocument;
+import com.lowagie.text.rtf.style.RtfColor;
+
+
+/**
+ * The RtfBorder handle one row or cell border.
+ * INTERNAL USE ONLY
+ *
+ * @version $Version:$
+ * @author Mark Hall (mhall@edu.uni-klu.ac.at)
+ * @author Unknown
+ */
+public class RtfBorder extends RtfElement {
+
+ /**
+ * Constant for the left row border
+ */
+ protected static final byte[] ROW_BORDER_LEFT = "\\trbrdrl".getBytes();
+ /**
+ * Constant for the top row border
+ */
+ protected static final byte[] ROW_BORDER_TOP = "\\trbrdrt".getBytes();
+ /**
+ * Constant for the right row border
+ */
+ protected static final byte[] ROW_BORDER_RIGHT = "\\trbrdrr".getBytes();
+ /**
+ * Constant for the bottom row border
+ */
+ protected static final byte[] ROW_BORDER_BOTTOM = "\\trbrdrb".getBytes();
+ /**
+ * Constant for the horizontal line
+ */
+ protected static final byte[] ROW_BORDER_HORIZONTAL = "\\trbrdrh".getBytes();
+ /**
+ * Constant for the vertical line
+ */
+ protected static final byte[] ROW_BORDER_VERTICAL = "\\trbrdrv".getBytes();
+ /**
+ * Constant for the left cell border
+ */
+ protected static final byte[] CELL_BORDER_LEFT = "\\clbrdrl".getBytes();
+ /**
+ * Constant for the top cell border
+ */
+ protected static final byte[] CELL_BORDER_TOP = "\\clbrdrt".getBytes();
+ /**
+ * Constant for the right cell border
+ */
+ protected static final byte[] CELL_BORDER_RIGHT = "\\clbrdrr".getBytes();
+ /**
+ * Constant for the bottom cell border
+ */
+ protected static final byte[] CELL_BORDER_BOTTOM = "\\clbrdrb".getBytes();
+ /**
+ * Constant for the border width
+ */
+ protected static final byte[] BORDER_WIDTH = "\\brdrw".getBytes();
+ /**
+ * Constant for the border colour number
+ */
+ protected static final byte[] BORDER_COLOR_NUMBER = "\\brdrcf".getBytes();
+ /**
+ * Constant for the single border style
+ */
+ protected static final byte[] BORDER_STYLE_SINGLE = "\\brdrs".getBytes();
+ /**
+ * Constant for the double thick border style
+ */
+ protected static final byte[] BORDER_STYLE_DOUBLE_THICK = "\\brdrth".getBytes();
+ /**
+ * Constant for the shadowed border style
+ */
+ protected static final byte[] BORDER_STYLE_SHADOWED = "\\brdrsh".getBytes();
+ /**
+ * Constant for the dotted border style
+ */
+ protected static final byte[] BORDER_STYLE_DOTTED = "\\brdrdot".getBytes();
+ /**
+ * Constant for the dashed border style
+ */
+ protected static final byte[] BORDER_STYLE_DASHED = "\\brdrdash".getBytes();
+ /**
+ * Constant for the hairline border style
+ */
+ protected static final byte[] BORDER_STYLE_HAIRLINE = "\\brdrhair".getBytes();
+ /**
+ * Constant for the double border style
+ */
+ protected static final byte[] BORDER_STYLE_DOUBLE = "\\brdrdb".getBytes();
+ /**
+ * Constant for the dot dash border style
+ */
+ protected static final byte[] BORDER_STYLE_DOT_DASH = "\\brdrdashd".getBytes();
+ /**
+ * Constant for the dot dot dash border style
+ */
+ protected static final byte[] BORDER_STYLE_DOT_DOT_DASH = "\\brdrdashdd".getBytes();
+ /**
+ * Constant for the triple border style
+ */
+ protected static final byte[] BORDER_STYLE_TRIPLE = "\\brdrtriple".getBytes();
+ /**
+ * Constant for the thick thin border style
+ */
+ protected static final byte[] BORDER_STYLE_THICK_THIN = "\\brdrtnthsg".getBytes();
+ /**
+ * Constant for the thin thick border style
+ */
+ protected static final byte[] BORDER_STYLE_THIN_THICK = "\\brdrthtnsg".getBytes();
+ /**
+ * Constant for the thin thick thin border style
+ */
+ protected static final byte[] BORDER_STYLE_THIN_THICK_THIN = "\\brdrtnthtnsg".getBytes();
+ /**
+ * Constant for the thick thin medium border style
+ */
+ protected static final byte[] BORDER_STYLE_THICK_THIN_MED = "\\brdrtnthmg".getBytes();
+ /**
+ * Constant for the thin thick medium border style
+ */
+ protected static final byte[] BORDER_STYLE_THIN_THICK_MED = "\\brdrthtnmg".getBytes();
+ /**
+ * Constant for the thin thick thin medium border style
+ */
+ protected static final byte[] BORDER_STYLE_THIN_THICK_THIN_MED = "\\brdrtnthtnmg".getBytes();
+ /**
+ * Constant for the thick thin large border style
+ */
+ protected static final byte[] BORDER_STYLE_THICK_THIN_LARGE = "\\brdrtnthlg".getBytes();
+ /**
+ * Constant for the thin thick large border style
+ */
+ protected static final byte[] BORDER_STYLE_THIN_THICK_LARGE = "\\brdrthtnlg".getBytes();
+ /**
+ * Constant for the thin thick thin large border style
+ */
+ protected static final byte[] BORDER_STYLE_THIN_THICK_THIN_LARGE = "\\brdrtnthtnlg".getBytes();
+ /**
+ * Constant for the wavy border style
+ */
+ protected static final byte[] BORDER_STYLE_WAVY = "\\brdrwavy".getBytes();
+ /**
+ * Constant for the double wavy border style
+ */
+ protected static final byte[] BORDER_STYLE_DOUBLE_WAVY = "\\brdrwavydb".getBytes();
+ /**
+ * Constant for the striped border style
+ */
+ protected static final byte[] BORDER_STYLE_STRIPED = "\\brdrdashdotstr".getBytes();
+ /**
+ * Constant for the embossed border style
+ */
+ protected static final byte[] BORDER_STYLE_EMBOSS = "\\brdremboss".getBytes();
+ /**
+ * Constant for the engraved border style
+ */
+ protected static final byte[] BORDER_STYLE_ENGRAVE = "\\brdrengrave".getBytes();
+
+ /**
+ * Constant for a row border
+ */
+ protected static final int ROW_BORDER = 1;
+ /**
+ * Constant for a cell border
+ */
+ protected static final int CELL_BORDER = 2;
+
+ /**
+ * This border is no border :-)
+ */
+ protected static final int NO_BORDER = 0;
+ /**
+ * Constant for a left border
+ */
+ protected static final int LEFT_BORDER = 1;
+ /**
+ * Constant for a top border
+ */
+ protected static final int TOP_BORDER = 2;
+ /**
+ * Constant for a right border
+ */
+ protected static final int RIGHT_BORDER = 4;
+ /**
+ * Constant for a bottom border
+ */
+ protected static final int BOTTOM_BORDER = 8;
+ /**
+ * Constant for a box (left, top, right, bottom) border
+ */
+ protected static final int BOX_BORDER = 15;
+ /**
+ * Constant for a vertical line
+ */
+ protected static final int VERTICAL_BORDER = 16;
+ /**
+ * Constant for a horizontal line
+ */
+ protected static final int HORIZONTAL_BORDER = 32;
+
+ /**
+ * Constant for a border with no border
+ */
+ public static final int BORDER_NONE = 0;
+ /**
+ * Constant for a single border
+ */
+ public static final int BORDER_SINGLE = 1;
+ /**
+ * Constant for a double thick border
+ */
+ public static final int BORDER_DOUBLE_THICK = 2;
+ /**
+ * Constant for a shadowed border
+ */
+ public static final int BORDER_SHADOWED = 3;
+ /**
+ * Constant for a dotted border
+ */
+ public static final int BORDER_DOTTED = 4;
+ /**
+ * Constant for a dashed border
+ */
+ public static final int BORDER_DASHED = 5;
+ /**
+ * Constant for a hairline border
+ */
+ public static final int BORDER_HAIRLINE = 6;
+ /**
+ * Constant for a double border
+ */
+ public static final int BORDER_DOUBLE = 7;
+ /**
+ * Constant for a dot dash border
+ */
+ public static final int BORDER_DOT_DASH = 8;
+ /**
+ * Constant for a dot dot dash border
+ */
+ public static final int BORDER_DOT_DOT_DASH = 9;
+ /**
+ * Constant for a triple border
+ */
+ public static final int BORDER_TRIPLE = 10;
+ /**
+ * Constant for a thick thin border
+ */
+ public static final int BORDER_THICK_THIN = 11;
+ /**
+ * Constant for a thin thick border
+ */
+ public static final int BORDER_THIN_THICK = 12;
+ /**
+ * Constant for a thin thick thin border
+ */
+ public static final int BORDER_THIN_THICK_THIN = 13;
+ /**
+ * Constant for a thick thin medium border
+ */
+ public static final int BORDER_THICK_THIN_MED = 14;
+ /**
+ * Constant for a thin thick medium border
+ */
+ public static final int BORDER_THIN_THICK_MED = 15;
+ /**
+ * Constant for a thin thick thin medium border
+ */
+ public static final int BORDER_THIN_THICK_THIN_MED = 16;
+ /**
+ * Constant for a thick thin large border
+ */
+ public static final int BORDER_THICK_THIN_LARGE = 17;
+ /**
+ * Constant for a thin thick large border
+ */
+ public static final int BORDER_THIN_THICK_LARGE = 18;
+ /**
+ * Constant for a thin thick thin large border
+ */
+ public static final int BORDER_THIN_THICK_THIN_LARGE = 19;
+ /**
+ * Constant for a wavy border
+ */
+ public static final int BORDER_WAVY = 20;
+ /**
+ * Constant for a double wavy border
+ */
+ public static final int BORDER_DOUBLE_WAVY = 21;
+ /**
+ * Constant for a striped border
+ */
+ public static final int BORDER_STRIPED = 22;
+ /**
+ * Constant for an embossed border
+ */
+ public static final int BORDER_EMBOSS = 23;
+ /**
+ * Constant for an engraved border
+ */
+ public static final int BORDER_ENGRAVE = 24;
+
+ /**
+ * The type of this RtfBorder
+ */
+ private int borderType = ROW_BORDER;
+ /**
+ * The position of this RtfBorder
+ */
+ private int borderPosition = NO_BORDER;
+ /**
+ * The style of this RtfBorder
+ */
+ private int borderStyle = BORDER_NONE;
+ /**
+ * The width of this RtfBorder
+ */
+ private int borderWidth = 20;
+ /**
+ * The colour of this RtfBorder
+ */
+ private RtfColor borderColor = null;
+
+ /**
+ * Makes a copy of the given RtfBorder
+ *
+ * @param doc The RtfDocument this RtfBorder belongs to
+ * @param borderType The border type of this RtfBorder
+ * @param border The RtfBorder to copy
+ */
+ protected RtfBorder(RtfDocument doc, int borderType, RtfBorder border) {
+ super(doc);
+ this.borderType = borderType;
+ this.borderPosition = border.getBorderPosition();
+ this.borderStyle = border.getBorderStyle();
+ this.borderWidth = border.getBorderWidth();
+ this.borderColor = new RtfColor(this.document, border.getBorderColor());
+ }
+
+ /**
+ * Constructs a RtfBorder
+ *
+ * @param doc The RtfDocument this RtfBorder belongs to
+ * @param borderType The type of border this RtfBorder is
+ * @param borderPosition The position of this RtfBorder
+ * @param borderStyle The style of this RtfBorder
+ * @param borderWidth The width of this RtfBorder
+ * @param borderColor The colour of this RtfBorder
+ */
+ protected RtfBorder(RtfDocument doc, int borderType, int borderPosition, int borderStyle, float borderWidth, Color borderColor) {
+ super(doc);
+ this.borderType = borderType;
+ this.borderPosition = borderPosition;
+ this.borderStyle = borderStyle;
+ if(borderWidth > 2) {
+ borderWidth = 2;
+ }
+ this.borderWidth = (int) (borderWidth * TWIPS_FACTOR);
+ if(this.borderWidth == 0) {
+ this.borderStyle = BORDER_NONE;
+ }
+ if(borderColor == null) {
+ this.borderColor = new RtfColor(this.document, new Color(0, 0, 0));
+ } else {
+ this.borderColor = new RtfColor(this.document, borderColor);
+ }
+ }
+
+ /**
+ * Writes the RtfBorder settings
+ *
+ * @return A byte array with the RtfBorder settings
+ */
+ public byte[] write() {
+ if(this.borderStyle == BORDER_NONE || this.borderPosition == NO_BORDER || this.borderWidth == 0) {
+ return new byte[0];
+ }
+
+ ByteArrayOutputStream result = new ByteArrayOutputStream();
+ try {
+ if(this.borderType == ROW_BORDER) {
+ switch(this.borderPosition) {
+ case LEFT_BORDER:
+ result.write(ROW_BORDER_LEFT);
+ break;
+ case TOP_BORDER:
+ result.write(ROW_BORDER_TOP);
+ break;
+ case RIGHT_BORDER:
+ result.write(ROW_BORDER_RIGHT);
+ break;
+ case BOTTOM_BORDER:
+ result.write(ROW_BORDER_BOTTOM);
+ break;
+ case HORIZONTAL_BORDER:
+ result.write(ROW_BORDER_HORIZONTAL);
+ break;
+ case VERTICAL_BORDER:
+ result.write(ROW_BORDER_VERTICAL);
+ break;
+ default:
+ return new byte[0];
+ }
+ result.write(writeBorderStyle());
+ result.write(BORDER_WIDTH);
+ result.write(intToByteArray(this.borderWidth));
+ result.write(BORDER_COLOR_NUMBER);
+ result.write(intToByteArray(this.borderColor.getColorNumber()));
+ result.write('\n');
+ } else if(this.borderType == CELL_BORDER) {
+ switch(this.borderPosition) {
+ case LEFT_BORDER:
+ result.write(CELL_BORDER_LEFT);
+ break;
+ case TOP_BORDER:
+ result.write(CELL_BORDER_TOP);
+ break;
+ case RIGHT_BORDER:
+ result.write(CELL_BORDER_RIGHT);
+ break;
+ case BOTTOM_BORDER:
+ result.write(CELL_BORDER_BOTTOM);
+ break;
+ default:
+ return new byte[0];
+ }
+ result.write(writeBorderStyle());
+ result.write(BORDER_WIDTH);
+ result.write(intToByteArray(this.borderWidth));
+ result.write(BORDER_COLOR_NUMBER);
+ result.write(intToByteArray(this.borderColor.getColorNumber()));
+ result.write('\n');
+ }
+ } catch(IOException ioe) {
+ ioe.printStackTrace();
+ }
+
+ return result.toByteArray();
+ }
+
+ /**
+ * Writes the style of this RtfBorder
+ *
+ * @return A byte array containing the style of this RtfBorder
+ */
+ private byte[] writeBorderStyle() {
+ switch(this.borderStyle) {
+ case BORDER_NONE : return new byte[0];
+ case BORDER_SINGLE : return BORDER_STYLE_SINGLE;
+ case BORDER_DOUBLE_THICK : return BORDER_STYLE_DOUBLE_THICK;
+ case BORDER_SHADOWED : return BORDER_STYLE_SHADOWED;
+ case BORDER_DOTTED : return BORDER_STYLE_DOTTED;
+ case BORDER_DASHED : return BORDER_STYLE_DASHED;
+ case BORDER_HAIRLINE : return BORDER_STYLE_HAIRLINE;
+ case BORDER_DOUBLE : return BORDER_STYLE_DOUBLE;
+ case BORDER_DOT_DASH : return BORDER_STYLE_DOT_DASH;
+ case BORDER_DOT_DOT_DASH : return BORDER_STYLE_DOT_DOT_DASH;
+ case BORDER_TRIPLE : return BORDER_STYLE_TRIPLE;
+ case BORDER_THICK_THIN : return BORDER_STYLE_THICK_THIN;
+ case BORDER_THIN_THICK : return BORDER_STYLE_THIN_THICK;
+ case BORDER_THIN_THICK_THIN : return BORDER_STYLE_THIN_THICK_THIN;
+ case BORDER_THICK_THIN_MED : return BORDER_STYLE_THICK_THIN_MED;
+ case BORDER_THIN_THICK_MED : return BORDER_STYLE_THIN_THICK_MED;
+ case BORDER_THIN_THICK_THIN_MED : return BORDER_STYLE_THIN_THICK_THIN_MED;
+ case BORDER_THICK_THIN_LARGE : return BORDER_STYLE_THICK_THIN_LARGE;
+ case BORDER_THIN_THICK_LARGE : return BORDER_STYLE_THIN_THICK_LARGE;
+ case BORDER_THIN_THICK_THIN_LARGE : return BORDER_STYLE_THIN_THICK_THIN_LARGE;
+ case BORDER_WAVY : return BORDER_STYLE_WAVY;
+ case BORDER_DOUBLE_WAVY : return BORDER_STYLE_DOUBLE_WAVY;
+ case BORDER_STRIPED : return BORDER_STYLE_STRIPED;
+ case BORDER_EMBOSS : return BORDER_STYLE_EMBOSS;
+ case BORDER_ENGRAVE : return BORDER_STYLE_ENGRAVE;
+ default : return BORDER_STYLE_SINGLE;
+ }
+ }
+
+ /**
+ * Gets the colour of this RtfBorder
+ *
+ * @return Returns RtfColor of this RtfBorder
+ */
+ protected RtfColor getBorderColor() {
+ return borderColor;
+ }
+
+ /**
+ * Gets the position of this RtfBorder
+ * @return Returns the position of this RtfBorder
+ */
+ protected int getBorderPosition() {
+ return borderPosition;
+ }
+
+ /**
+ * Gets the style of this RtfBorder
+ *
+ * @return Returns the style of this RtfBorder
+ */
+ protected int getBorderStyle() {
+ return borderStyle;
+ }
+
+ /**
+ * Gets the type of this RtfBorder
+ *
+ * @return Returns the type of this RtfBorder
+ */
+ protected int getBorderType() {
+ return borderType;
+ }
+
+ /**
+ * Gets the width of this RtfBorder
+ *
+ * @return Returns the width of this RtfBorder
+ */
+ protected int getBorderWidth() {
+ return borderWidth;
+ }
+}
diff --git a/src/main/java/com/lowagie/text/rtf/table/RtfBorderGroup.java b/src/main/java/com/lowagie/text/rtf/table/RtfBorderGroup.java
new file mode 100644
index 0000000..5b8904f
--- /dev/null
+++ b/src/main/java/com/lowagie/text/rtf/table/RtfBorderGroup.java
@@ -0,0 +1,232 @@
+/*
+ * $Id: RtfBorderGroup.java,v 1.8 2004/12/14 12:51:39 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2001, 2002, 2003, 2004 by Mark Hall
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the ?GNU LIBRARY GENERAL PUBLIC LICENSE?), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.rtf.table;
+
+import java.awt.Color;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.util.Enumeration;
+import java.util.Hashtable;
+
+import com.lowagie.text.Rectangle;
+import com.lowagie.text.rtf.RtfElement;
+import com.lowagie.text.rtf.document.RtfDocument;
+
+
+/**
+ * The RtfBorderGroup represents a collection of RtfBorders to use in a RtfCell
+ * or RtfTable.
+ *
+ * @version $Version:$
+ * @author Mark Hall (mhall@edu.uni-klu.ac.at)
+ */
+public class RtfBorderGroup extends RtfElement {
+ /**
+ * The type of borders this RtfBorderGroup contains.
+ * RtfBorder.ROW_BORDER or RtfBorder.CELL_BORDER
+ */
+ private int borderType = RtfBorder.ROW_BORDER;
+ /**
+ * The borders in this RtfBorderGroup
+ */
+ private Hashtable borders = null;
+
+ /**
+ * Constructs an empty RtfBorderGroup.
+ */
+ public RtfBorderGroup() {
+ super(null);
+ this.borders = new Hashtable();
+ }
+
+ /**
+ * Constructs a RtfBorderGroup with on border style for multiple borders.
+ *
+ * @param bordersToAdd The borders to add (Rectangle.LEFT, Rectangle.RIGHT, Rectangle.TOP, Rectangle.BOTTOM, Rectangle.BOX)
+ * @param borderStyle The style of border to add (from RtfBorder)
+ * @param borderWidth The border width to use
+ * @param borderColor The border color to use
+ */
+ public RtfBorderGroup(int bordersToAdd, int borderStyle, float borderWidth, Color borderColor) {
+ super(null);
+ this.borders = new Hashtable();
+ addBorder(bordersToAdd, borderStyle, borderWidth, borderColor);
+ }
+
+ /**
+ * Constructs a RtfBorderGroup based on another RtfBorderGroup.
+ *
+ * @param doc The RtfDocument this RtfBorderGroup belongs to
+ * @param borderType The type of borders this RtfBorderGroup contains
+ * @param borderGroup The RtfBorderGroup to use as a base
+ */
+ protected RtfBorderGroup(RtfDocument doc, int borderType, RtfBorderGroup borderGroup) {
+ super(doc);
+ this.borders = new Hashtable();
+ this.borderType = borderType;
+ if(borderGroup != null) {
+ Enumeration borderEnum = borderGroup.getBorders().keys();
+ while(borderEnum.hasMoreElements()) {
+ Integer borderPos = (Integer) borderEnum.nextElement();
+ RtfBorder border = (RtfBorder) borderGroup.getBorders().get(borderPos);
+ this.borders.put(borderPos, new RtfBorder(this.document, this.borderType, border));
+ }
+ }
+ }
+
+ /**
+ * Constructs a RtfBorderGroup with certain borders
+ *
+ * @param doc The RtfDocument this RtfBorderGroup belongs to
+ * @param borderType The type of borders this RtfBorderGroup contains
+ * @param bordersToUse The borders to add (Rectangle.LEFT, Rectangle.RIGHT, Rectangle.TOP, Rectangle.BOTTOM, Rectangle.BOX)
+ * @param borderWidth The border width to use
+ * @param borderColor The border color to use
+ */
+ protected RtfBorderGroup(RtfDocument doc, int borderType, int bordersToUse, float borderWidth, Color borderColor) {
+ super(doc);
+ this.borderType = borderType;
+ this.borders = new Hashtable();
+ addBorder(bordersToUse, RtfBorder.BORDER_SINGLE, borderWidth, borderColor);
+ }
+
+ /**
+ * Sets a border in the Hashtable of borders
+ *
+ * @param borderPosition The position of this RtfBorder
+ * @param borderStyle The type of borders this RtfBorderGroup contains
+ * @param borderWidth The border width to use
+ * @param borderColor The border color to use
+ */
+ private void setBorder(int borderPosition, int borderStyle, float borderWidth, Color borderColor) {
+ RtfBorder border = new RtfBorder(this.document, this.borderType, borderPosition, borderStyle, borderWidth, borderColor);
+ this.borders.put(new Integer(borderPosition), border);
+ }
+
+ /**
+ * Adds borders to the RtfBorderGroup
+ *
+ * @param bordersToAdd The borders to add (Rectangle.LEFT, Rectangle.RIGHT, Rectangle.TOP, Rectangle.BOTTOM, Rectangle.BOX)
+ * @param borderStyle The style of border to add (from RtfBorder)
+ * @param borderWidth The border width to use
+ * @param borderColor The border color to use
+ */
+ public void addBorder(int bordersToAdd, int borderStyle, float borderWidth, Color borderColor) {
+ if((bordersToAdd & Rectangle.LEFT) == Rectangle.LEFT) {
+ setBorder(RtfBorder.LEFT_BORDER, borderStyle, borderWidth, borderColor);
+ }
+ if((bordersToAdd & Rectangle.TOP) == Rectangle.TOP) {
+ setBorder(RtfBorder.TOP_BORDER, borderStyle, borderWidth, borderColor);
+ }
+ if((bordersToAdd & Rectangle.RIGHT) == Rectangle.RIGHT) {
+ setBorder(RtfBorder.RIGHT_BORDER, borderStyle, borderWidth, borderColor);
+ }
+ if((bordersToAdd & Rectangle.BOTTOM) == Rectangle.BOTTOM) {
+ setBorder(RtfBorder.BOTTOM_BORDER, borderStyle, borderWidth, borderColor);
+ }
+ if((bordersToAdd & Rectangle.BOX) == Rectangle.BOX && this.borderType == RtfBorder.ROW_BORDER) {
+ setBorder(RtfBorder.VERTICAL_BORDER, borderStyle, borderWidth, borderColor);
+ setBorder(RtfBorder.HORIZONTAL_BORDER, borderStyle, borderWidth, borderColor);
+ }
+ }
+
+ /**
+ * Removes borders from the list of borders
+ *
+ * @param bordersToRemove The borders to remove (from Rectangle)
+ */
+ public void removeBorder(int bordersToRemove) {
+ if((bordersToRemove & Rectangle.LEFT) == Rectangle.LEFT) {
+ this.borders.remove(new Integer(RtfBorder.LEFT_BORDER));
+ }
+ if((bordersToRemove & Rectangle.TOP) == Rectangle.TOP) {
+ this.borders.remove(new Integer(RtfBorder.TOP_BORDER));
+ }
+ if((bordersToRemove & Rectangle.RIGHT) == Rectangle.RIGHT) {
+ this.borders.remove(new Integer(RtfBorder.RIGHT_BORDER));
+ }
+ if((bordersToRemove & Rectangle.BOTTOM) == Rectangle.BOTTOM) {
+ this.borders.remove(new Integer(RtfBorder.BOTTOM_BORDER));
+ }
+ if((bordersToRemove & Rectangle.BOX) == Rectangle.BOX && this.borderType == RtfBorder.ROW_BORDER) {
+ this.borders.remove(new Integer(RtfBorder.VERTICAL_BORDER));
+ this.borders.remove(new Integer(RtfBorder.HORIZONTAL_BORDER));
+ }
+ }
+
+ /**
+ * Writes the borders of this RtfBorderGroup
+ *
+ * @return A byte array with the borders of this RtfBorderGroup
+ */
+ public byte[] write() {
+ ByteArrayOutputStream result = new ByteArrayOutputStream();
+ try {
+ Enumeration borderEnum = this.borders.keys();
+ while(borderEnum.hasMoreElements()) {
+ result.write(((RtfBorder) this.borders.get(borderEnum.nextElement())).write());
+ }
+ } catch(IOException ioe) {
+ ioe.printStackTrace();
+ }
+
+ return result.toByteArray();
+ }
+
+ /**
+ * Gets the RtfBorders of this RtfBorderGroup
+ *
+ * @return The RtfBorders of this RtfBorderGroup
+ */
+ protected Hashtable getBorders() {
+ return this.borders;
+ }
+}
diff --git a/src/main/java/com/lowagie/text/rtf/table/RtfCell.java b/src/main/java/com/lowagie/text/rtf/table/RtfCell.java
new file mode 100644
index 0000000..abfee02
--- /dev/null
+++ b/src/main/java/com/lowagie/text/rtf/table/RtfCell.java
@@ -0,0 +1,534 @@
+/*
+ * $Id: RtfCell.java,v 1.15 2006/02/09 17:13:11 hallm Exp $
+ * $Name: $
+ *
+ * Copyright 2001, 2002, 2003, 2004 by Mark Hall
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the ?GNU LIBRARY GENERAL PUBLIC LICENSE?), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.rtf.table;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.util.Iterator;
+import java.util.Properties;
+import java.util.ArrayList;
+
+import com.lowagie.text.BadElementException;
+import com.lowagie.text.Cell;
+import com.lowagie.text.DocumentException;
+import com.lowagie.text.Element;
+import com.lowagie.text.List;
+import com.lowagie.text.Paragraph;
+import com.lowagie.text.rtf.RtfBasicElement;
+import com.lowagie.text.rtf.RtfExtendedElement;
+import com.lowagie.text.rtf.document.RtfDocument;
+import com.lowagie.text.rtf.style.RtfColor;
+import com.lowagie.text.rtf.style.RtfParagraphStyle;
+import com.lowagie.text.rtf.text.RtfParagraph;
+
+
+/**
+ * The RtfCell wraps a Cell, but can also be added directly to a Table.
+ * The RtfCell is an extension of Cell, that supports a multitude of different
+ * borderstyles.
+ *
+ * @version $Id: RtfCell.java,v 1.15 2006/02/09 17:13:11 hallm Exp $
+ * @author Mark Hall (mhall@edu.uni-klu.ac.at)
+ * @author Steffen Stundzig
+ * @author Benoit WIART <b.wiart@proxiad.com>
+ * @see com.lowagie.text.rtf.table.RtfBorder
+ */
+public class RtfCell extends Cell implements RtfExtendedElement {
+
+ /**
+ * This cell is not merged
+ */
+ private static final int MERGE_NONE = 0;
+ /**
+ * This cell is the parent cell of a vertical merge operation
+ */
+ private static final int MERGE_VERT_PARENT = 1;
+ /**
+ * This cell is a child cell of a vertical merge operation
+ */
+ private static final int MERGE_VERT_CHILD = 2;
+
+ /**
+ * The parent RtfRow of this RtfCell
+ */
+ private RtfRow parentRow = null;
+ /**
+ * The content of this RtfCell
+ */
+ private ArrayList content = null;
+ /**
+ * The right margin of this RtfCell
+ */
+ private int cellRight = 0;
+ /**
+ * The width of this RtfCell
+ */
+ private int cellWidth = 0;
+ /**
+ * The borders of this RtfCell
+ */
+ private RtfBorderGroup borders = null;
+ /**
+ * The vertical alignment of this RtfCell
+ */
+ private int verticalAlignment = Cell.ALIGN_MIDDLE;
+ /**
+ * The background color of this RtfCell
+ */
+ private RtfColor backgroundColor = null;
+ /**
+ * The padding of this RtfCell
+ */
+ private int cellPadding = 0;
+ /**
+ * The merge type of this RtfCell
+ */
+ private int mergeType = MERGE_NONE;
+ /**
+ * The number of columns spanned by this RtfCell
+ */
+ private int colspan = 1;
+ /**
+ * The number of rows spanned by this RtfCell
+ */
+ private int rowspan = 1;
+ /**
+ * The RtfDocument this RtfCell belongs to
+ */
+ private RtfDocument document = null;
+ /**
+ * Whether this RtfCell is in a header
+ */
+ private boolean inHeader = false;
+
+ /**
+ * Constructs an empty RtfCell
+ */
+ public RtfCell() {
+ super();
+ this.borders = new RtfBorderGroup();
+ }
+
+ /**
+ * Constructs a RtfCell based upon a String
+ *
+ * @param content The String to base the RtfCell on
+ */
+ public RtfCell(String content) {
+ super(content);
+ this.borders = new RtfBorderGroup();
+ }
+
+ /**
+ * Constructs a RtfCell based upon an Element
+ *
+ * @param element The Element to base the RtfCell on
+ * @throws BadElementException If the Element is not valid
+ */
+ public RtfCell(Element element) throws BadElementException {
+ super(element);
+ this.borders = new RtfBorderGroup();
+ }
+
+ /**
+ * Constructs a RtfCell based upon certain Properties
+ *
+ * @param properties The Properties for this RtfCell
+ */
+ public RtfCell(Properties properties) {
+ super(properties);
+ this.borders = new RtfBorderGroup();
+ }
+
+ /**
+ * Constructs a RtfCell based on a Cell.
+ *
+ * @param doc The RtfDocument this RtfCell belongs to
+ * @param row The RtfRow this RtfCell lies in
+ * @param cell The Cell to base this RtfCell on
+ */
+ protected RtfCell(RtfDocument doc, RtfRow row, Cell cell) {
+ this.document = doc;
+ this.parentRow = row;
+ importCell(cell);
+ }
+
+ /**
+ * Imports the Cell properties into the RtfCell
+ *
+ * @param cell The Cell to import
+ */
+ private void importCell(Cell cell) {
+ this.content = new ArrayList();
+
+ if(cell == null) {
+ this.borders = new RtfBorderGroup(this.document, RtfBorder.CELL_BORDER, this.parentRow.getParentTable().getBorders());
+ return;
+ }
+
+ this.colspan = cell.colspan();
+ this.rowspan = cell.rowspan();
+ if(cell.rowspan() > 1) {
+ this.mergeType = MERGE_VERT_PARENT;
+ }
+ if(cell instanceof RtfCell) {
+ this.borders = new RtfBorderGroup(this.document, RtfBorder.CELL_BORDER, ((RtfCell) cell).getBorders());
+ } else {
+ this.borders = new RtfBorderGroup(this.document, RtfBorder.CELL_BORDER, cell.border(), cell.borderWidth(), cell.borderColor());
+ }
+ this.verticalAlignment = cell.verticalAlignment();
+ if(cell.backgroundColor() == null) {
+ this.backgroundColor = new RtfColor(this.document, 255, 255, 255);
+ } else {
+ this.backgroundColor = new RtfColor(this.document, cell.backgroundColor());
+ }
+
+ this.cellPadding = (int) this.parentRow.getParentTable().getCellPadding();
+
+ if(cell != null) {
+ Iterator cellIterator = cell.getElements();
+ Paragraph container = null;
+ while(cellIterator.hasNext()) {
+ try {
+ Element element = (Element) cellIterator.next();
+ // should we wrap it in a paragraph
+ if(!(element instanceof Paragraph) && !(element instanceof List)) {
+ if(container != null) {
+ container.add(element);
+ } else {
+ container = new Paragraph();
+ container.setAlignment(cell.horizontalAlignment());
+ container.add(element);
+ }
+ } else {
+ if(container != null) {
+ RtfBasicElement rtfElement = this.document.getMapper().mapElement(container);
+ rtfElement.setInTable(true);
+ this.content.add(rtfElement);
+ container = null;
+ }
+ // if horizontal alignment is undefined overwrite
+ // with that of enclosing cell
+ if (element instanceof Paragraph && ((Paragraph) element).alignment() == Element.ALIGN_UNDEFINED) {
+ ((Paragraph) element).setAlignment(cell.horizontalAlignment());
+ }
+
+ RtfBasicElement rtfElement = this.document.getMapper().mapElement(element);
+ rtfElement.setInTable(true);
+ this.content.add(rtfElement);
+ }
+ } catch(DocumentException de) {
+ de.printStackTrace();
+ }
+ }
+ if(container != null) {
+ try {
+ RtfBasicElement rtfElement = this.document.getMapper().mapElement(container);
+ rtfElement.setInTable(true);
+ this.content.add(rtfElement);
+ } catch(DocumentException de) {
+ de.printStackTrace();
+ }
+ }
+ }
+ }
+
+ /**
+ * Write the cell definition part of this RtfCell
+ *
+ * @return A byte array with the cell definition
+ */
+ public byte[] writeDefinition() {
+ ByteArrayOutputStream result = new ByteArrayOutputStream();
+ try {
+ if(this.mergeType == MERGE_VERT_PARENT) {
+ result.write("\\clvmgf".getBytes());
+ } else if(this.mergeType == MERGE_VERT_CHILD) {
+ result.write("\\clvmrg".getBytes());
+ }
+ switch (verticalAlignment) {
+ case Element.ALIGN_BOTTOM:
+ result.write("\\clvertalb".getBytes());
+ break;
+ case Element.ALIGN_CENTER:
+ case Element.ALIGN_MIDDLE:
+ result.write("\\clvertalc".getBytes());
+ break;
+ case Element.ALIGN_TOP:
+ result.write("\\clvertalt".getBytes());
+ break;
+ }
+ result.write(this.borders.write());
+
+ if(this.backgroundColor != null) {
+ result.write("\\clcbpat".getBytes());
+ result.write(intToByteArray(this.backgroundColor.getColorNumber()));
+ }
+ result.write('\n');
+
+ result.write("\\clftsWidth3".getBytes());
+ result.write('\n');
+
+ result.write("\\clwWidth".getBytes());
+ result.write(intToByteArray(this.cellWidth));
+ result.write('\n');
+
+ if(this.cellPadding > 0) {
+ result.write("\\clpadl".getBytes());
+ result.write(intToByteArray(this.cellPadding / 2));
+ result.write("\\clpadt".getBytes());
+ result.write(intToByteArray(this.cellPadding / 2));
+ result.write("\\clpadr".getBytes());
+ result.write(intToByteArray(this.cellPadding / 2));
+ result.write("\\clpadb".getBytes());
+ result.write(intToByteArray(this.cellPadding / 2));
+ result.write("\\clpadfl3".getBytes());
+ result.write("\\clpadft3".getBytes());
+ result.write("\\clpadfr3".getBytes());
+ result.write("\\clpadfb3".getBytes());
+ }
+ result.write("\\cellx".getBytes());
+ result.write(intToByteArray(this.cellRight));
+
+ } catch(IOException ioe) {
+ ioe.printStackTrace();
+ }
+
+ return result.toByteArray();
+ }
+
+ /**
+ * Write the content of this RtfCell
+ *
+ * @return A byte array with the content of this RtfCell
+ */
+ public byte[] write() {
+ ByteArrayOutputStream result = new ByteArrayOutputStream();
+ try {
+ if(this.content.size() == 0) {
+ result.write(RtfParagraph.PARAGRAPH_DEFAULTS);
+ if(this.parentRow.getParentTable().getTableFitToPage()) {
+ result.write(RtfParagraphStyle.KEEP_TOGETHER_WITH_NEXT);
+ }
+ result.write(RtfParagraph.IN_TABLE);
+ } else {
+ for(int i = 0; i < this.content.size(); i++) {
+ RtfBasicElement rtfElement = (RtfBasicElement) this.content.get(i);
+ if(rtfElement instanceof RtfParagraph) {
+ ((RtfParagraph) rtfElement).setKeepTogetherWithNext(this.parentRow.getParentTable().getTableFitToPage());
+ }
+ result.write(rtfElement.write());
+ if(rtfElement instanceof RtfParagraph && i < (this.content.size() - 1)) {
+ result.write(RtfParagraph.PARAGRAPH);
+ }
+ }
+ }
+ result.write("\\cell".getBytes());
+ } catch(IOException ioe) {
+ ioe.printStackTrace();
+ }
+
+ return result.toByteArray();
+ }
+
+ /**
+ * Sets the right margin of this cell. Used in merge operations
+ *
+ * @param cellRight The right margin to use
+ */
+ protected void setCellRight(int cellRight) {
+ this.cellRight = cellRight;
+ }
+
+ /**
+ * Gets the right margin of this RtfCell
+ *
+ * @return The right margin of this RtfCell.
+ */
+ protected int getCellRight() {
+ return this.cellRight;
+ }
+
+ /**
+ * Sets the cell width of this RtfCell. Used in merge operations.
+ *
+ * @param cellWidth The cell width to use
+ */
+ protected void setCellWidth(int cellWidth) {
+ this.cellWidth = cellWidth;
+ }
+
+ /**
+ * Gets the cell width of this RtfCell
+ *
+ * @return The cell width of this RtfCell
+ */
+ protected int getCellWidth() {
+ return this.cellWidth;
+ }
+
+ /**
+ * Gets the number of columns this RtfCell spans
+ *
+ * @return The number of columns this RtfCell spans
+ */
+ protected int getColspan() {
+ return this.colspan;
+ }
+
+ /**
+ * Gets the number of rows this RtfCell spans
+ *
+ * @return The number of rows this RtfCell spans
+ */
+ protected int getRowspan() {
+ return this.rowspan;
+ }
+
+ /**
+ * Gets the cell padding of this RtfCell
+ *
+ * @return The cell padding of this RtfCell
+ */
+ protected int getCellpadding() {
+ return this.cellPadding;
+ }
+
+ /**
+ * Gets the borders of this RtfCell
+ *
+ * @return The borders of this RtfCell
+ */
+ protected RtfBorderGroup getBorders() {
+ return this.borders;
+ }
+
+ /**
+ * Set the borders of this RtfCell
+ *
+ * @param borderGroup The RtfBorderGroup to use as borders
+ */
+ public void setBorders(RtfBorderGroup borderGroup) {
+ this.borders = new RtfBorderGroup(this.document, RtfBorder.CELL_BORDER, borderGroup);
+ }
+
+ /**
+ * Get the vertical alignment of this RtfCell
+ *
+ * @return The vertical alignment of this RtfCell
+ */
+ protected int getVerticalAlignment() {
+ return this.verticalAlignment;
+ }
+
+ /**
+ * Get the background color of this RtfCell
+ *
+ * @return The background color of this RtfCell
+ */
+ protected RtfColor getBackgroundColor() {
+ return this.backgroundColor;
+ }
+
+ /**
+ * Merge this cell into the parent cell.
+ *
+ * @param mergeParent The RtfCell to merge with
+ */
+ protected void setCellMergeChild(RtfCell mergeParent) {
+ this.mergeType = MERGE_VERT_CHILD;
+ this.cellWidth = mergeParent.getCellWidth();
+ this.cellRight = mergeParent.getCellRight();
+ this.cellPadding = mergeParent.getCellpadding();
+ this.borders = mergeParent.getBorders();
+ this.verticalAlignment = mergeParent.getVerticalAlignment();
+ this.backgroundColor = mergeParent.getBackgroundColor();
+ }
+
+ /**
+ * Sets the RtfDocument this RtfCell belongs to
+ *
+ * @param doc The RtfDocument to use
+ */
+ public void setRtfDocument(RtfDocument doc) {
+ this.document = doc;
+ }
+
+ /**
+ * Unused
+ * @param inTable
+ */
+ public void setInTable(boolean inTable) {
+ }
+
+ /**
+ * Sets whether this RtfCell is in a header
+ *
+ * @param inHeader <code>True</code> if this RtfCell is in a header, <code>false</code> otherwise
+ */
+ public void setInHeader(boolean inHeader) {
+ this.inHeader = inHeader;
+ for(int i = 0; i < this.content.size(); i++) {
+ ((RtfBasicElement) this.content.get(i)).setInHeader(inHeader);
+ }
+ }
+
+ /**
+ * Transforms an integer into its String representation and then returns the bytes
+ * of that string.
+ *
+ * @param i The integer to convert
+ * @return A byte array representing the integer
+ */
+ private byte[] intToByteArray(int i) {
+ return Integer.toString(i).getBytes();
+ }
+}
diff --git a/src/main/java/com/lowagie/text/rtf/table/RtfRow.java b/src/main/java/com/lowagie/text/rtf/table/RtfRow.java
new file mode 100644
index 0000000..4075ed2
--- /dev/null
+++ b/src/main/java/com/lowagie/text/rtf/table/RtfRow.java
@@ -0,0 +1,377 @@
+/*
+ * $Id: RtfRow.java,v 1.16 2005/05/24 16:30:53 hallm Exp $
+ * $Name: $
+ *
+ * Copyright 2001, 2002, 2003, 2004, 2005 by Mark Hall
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the ?GNU LIBRARY GENERAL PUBLIC LICENSE?), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.rtf.table;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.util.ArrayList;
+
+import com.lowagie.text.Cell;
+import com.lowagie.text.Element;
+import com.lowagie.text.Row;
+import com.lowagie.text.rtf.RtfElement;
+import com.lowagie.text.rtf.document.RtfDocument;
+
+
+/**
+ * The RtfRow wraps one Row for a RtfTable.
+ * INTERNAL USE ONLY
+ *
+ * @version $Version:$
+ * @author Mark Hall (mhall@edu.uni-klu.ac.at)
+ * @author Steffen Stundzig
+ * @author Lorenz Maierhofer <larry@sbox.tugraz.at>
+ */
+public class RtfRow extends RtfElement {
+
+ /**
+ * Constant for the RtfRow beginning
+ */
+ private static final byte[] ROW_BEGIN = "\\trowd".getBytes();
+ /**
+ * Constant for the RtfRow width style
+ */
+ private static final byte[] ROW_WIDTH_STYLE = "\\trftsWidth3".getBytes();
+ /**
+ * Constant for the RtfRow width
+ */
+ private static final byte[] ROW_WIDTH = "\\trwWidth".getBytes();
+ /**
+ * Constant to specify that this RtfRow are not to be broken across pages
+ */
+ private static final byte[] ROW_KEEP_TOGETHER = "\\trkeep".getBytes();
+ /**
+ * Constant to specify that this is a header RtfRow
+ */
+ private static final byte[] ROW_HEADER_ROW = "\\trhdr".getBytes();
+ /**
+ * Constant for left alignment of this RtfRow
+ */
+ private static final byte[] ROW_ALIGN_LEFT = "\\trql".getBytes();
+ /**
+ * Constant for right alignment of this RtfRow
+ */
+ private static final byte[] ROW_ALIGN_RIGHT = "\\trqr".getBytes();
+ /**
+ * Constant for center alignment of this RtfRow
+ */
+ private static final byte[] ROW_ALIGN_CENTER = "\\trqc".getBytes();
+ /**
+ * Constant for justified alignment of this RtfRow
+ */
+ private static final byte[] ROW_ALIGN_JUSTIFIED = "\\trqj".getBytes();
+ /**
+ * Constant for the graph style of this RtfRow
+ */
+ private static final byte[] ROW_GRAPH = "\\trgaph10".getBytes();
+ /**
+ * Constant for the cell left spacing
+ */
+ private static final byte[] ROW_CELL_SPACING_LEFT = "\\trspdl".getBytes();
+ /**
+ * Constant for the cell top spacing
+ */
+ private static final byte[] ROW_CELL_SPACING_TOP = "\\trspdt".getBytes();
+ /**
+ * Constant for the cell right spacing
+ */
+ private static final byte[] ROW_CELL_SPACING_RIGHT = "\\trspdr".getBytes();
+ /**
+ * Constant for the cell bottom spacing
+ */
+ private static final byte[] ROW_CELL_SPACING_BOTTOM = "\\trspdb".getBytes();
+ /**
+ * Constant for the cell left spacing style
+ */
+ private static final byte[] ROW_CELL_SPACING_LEFT_STYLE = "\\trspdfl3".getBytes();
+ /**
+ * Constant for the cell top spacing style
+ */
+ private static final byte[] ROW_CELL_SPACING_TOP_STYLE = "\\trspdft3".getBytes();
+ /**
+ * Constant for the cell right spacing style
+ */
+ private static final byte[] ROW_CELL_SPACING_RIGHT_STYLE = "\\trspdfr3".getBytes();
+ /**
+ * Constant for the cell bottom spacing style
+ */
+ private static final byte[] ROW_CELL_SPACING_BOTTOM_STYLE = "\\trspdfb3".getBytes();
+ /**
+ * Constant for the cell left padding
+ */
+ private static final byte[] ROW_CELL_PADDING_LEFT = "\\trpaddl".getBytes();
+ /**
+ * Constant for the cell right padding
+ */
+ private static final byte[] ROW_CELL_PADDING_RIGHT = "\\trpaddr".getBytes();
+ /**
+ * Constant for the cell left padding style
+ */
+ private static final byte[] ROW_CELL_PADDING_LEFT_STYLE = "\\trpaddfl3".getBytes();
+ /**
+ * Constant for the cell right padding style
+ */
+ private static final byte[] ROW_CELL_PADDING_RIGHT_STYLE = "\\trpaddfr3".getBytes();
+ /**
+ * Constant for the end of a row
+ */
+ private static final byte[] ROW_END = "\\row".getBytes();
+
+ /**
+ * The RtfTable this RtfRow belongs to
+ */
+ private RtfTable parentTable = null;
+ /**
+ * The cells of this RtfRow
+ */
+ private ArrayList cells = null;
+ /**
+ * The width of this row
+ */
+ private int width = 0;
+ /**
+ * The row number
+ */
+ private int rowNumber = 0;
+
+ /**
+ * Constructs a RtfRow for a Row.
+ *
+ * @param doc The RtfDocument this RtfRow belongs to
+ * @param rtfTable The RtfTable this RtfRow belongs to
+ * @param row The Row this RtfRow is based on
+ * @param rowNumber The number of this row
+ */
+ protected RtfRow(RtfDocument doc, RtfTable rtfTable, Row row, int rowNumber) {
+ super(doc);
+ this.parentTable = rtfTable;
+ this.rowNumber = rowNumber;
+ importRow(row);
+ }
+
+ /**
+ * Imports a Row and copies all settings
+ *
+ * @param row The Row to import
+ */
+ private void importRow(Row row) {
+ this.cells = new ArrayList();
+ this.width = this.document.getDocumentHeader().getPageSetting().getPageWidth() - this.document.getDocumentHeader().getPageSetting().getMarginLeft() - this.document.getDocumentHeader().getPageSetting().getMarginRight();
+ this.width = (int) (this.width / 100 * this.parentTable.getTableWidthPercent());
+
+ int cellRight = 0;
+ int cellWidth = 0;
+ for(int i = 0; i < row.columns(); i++) {
+ cellWidth = (int) (this.width / 100 * this.parentTable.getProportionalWidths()[i]);
+ cellRight = cellRight + cellWidth;
+
+ Cell cell = (Cell) row.getCell(i);
+ RtfCell rtfCell = new RtfCell(this.document, this, cell);
+ rtfCell.setCellRight(cellRight);
+ rtfCell.setCellWidth(cellWidth);
+ this.cells.add(rtfCell);
+ }
+ }
+
+ /**
+ * Performs a second pass over all cells to handle cell row/column spanning.
+ */
+ protected void handleCellSpanning() {
+ int realCellIndex = 0;
+ for(int i = 0; i < this.cells.size(); i++) {
+ RtfCell rtfCell = (RtfCell) this.cells.get(i);
+ if(rtfCell.getColspan() > 1) {
+ int j = rtfCell.getColspan();
+ while(j > 1) {
+ if(i + 1 < this.cells.size()) {
+ RtfCell rtfCellMerge = (RtfCell) this.cells.get(i + 1);
+ rtfCell.setCellRight(rtfCell.getCellRight() + rtfCellMerge.getCellWidth());
+ rtfCell.setCellWidth(rtfCell.getCellWidth() + rtfCellMerge.getCellWidth());
+ this.cells.remove(i + 1);
+ j--;
+ }
+ }
+ }
+ if(rtfCell.getRowspan() > 1) {
+ ArrayList rows = this.parentTable.getRows();
+ for(int j = 1; j < rtfCell.getRowspan(); j++) {
+ RtfRow mergeRow = (RtfRow) rows.get(this.rowNumber + j);
+ if(this.rowNumber + j < rows.size()) {
+ RtfCell rtfCellMerge = (RtfCell) mergeRow.getCells().get(realCellIndex);
+ rtfCellMerge.setCellMergeChild(rtfCell);
+ }
+ if(rtfCell.getColspan() > 1) {
+ int k = rtfCell.getColspan();
+ while(k > 1 && (realCellIndex + 1 < mergeRow.getCells().size())) {
+ mergeRow.getCells().remove(realCellIndex + 1);
+ k--;
+ }
+ }
+ }
+ }
+ realCellIndex = realCellIndex + rtfCell.getColspan();
+ }
+ }
+
+ private byte[] writeRowDefinitions() {
+ ByteArrayOutputStream result = new ByteArrayOutputStream();
+ try {
+ result.write(ROW_BEGIN);
+ result.write('\n');
+ result.write(ROW_WIDTH_STYLE);
+ result.write(ROW_WIDTH);
+ result.write(intToByteArray(this.width));
+ if(this.parentTable.getCellsFitToPage()) {
+ result.write(ROW_KEEP_TOGETHER);
+ }
+ if(this.rowNumber <= this.parentTable.getHeaderRows()) {
+ result.write(ROW_HEADER_ROW);
+ }
+ switch (this.parentTable.getAlignment()) {
+ case Element.ALIGN_LEFT:
+ result.write(ROW_ALIGN_LEFT);
+ break;
+ case Element.ALIGN_RIGHT:
+ result.write(ROW_ALIGN_RIGHT);
+ break;
+ case Element.ALIGN_CENTER:
+ result.write(ROW_ALIGN_CENTER);
+ break;
+ case Element.ALIGN_JUSTIFIED:
+ case Element.ALIGN_JUSTIFIED_ALL:
+ result.write(ROW_ALIGN_JUSTIFIED);
+ break;
+ }
+ result.write(ROW_GRAPH);
+
+ result.write(this.parentTable.getBorders().write());
+
+ if(this.parentTable.getCellSpacing() > 0) {
+ result.write(ROW_CELL_SPACING_LEFT);
+ result.write(intToByteArray((int) (this.parentTable.getCellSpacing() / 2)));
+ result.write(ROW_CELL_SPACING_LEFT_STYLE);
+ result.write(ROW_CELL_SPACING_TOP);
+ result.write(intToByteArray((int) (this.parentTable.getCellSpacing() / 2)));
+ result.write(ROW_CELL_SPACING_TOP_STYLE);
+ result.write(ROW_CELL_SPACING_RIGHT);
+ result.write(intToByteArray((int) (this.parentTable.getCellSpacing() / 2)));
+ result.write(ROW_CELL_SPACING_RIGHT_STYLE);
+ result.write(ROW_CELL_SPACING_BOTTOM);
+ result.write(intToByteArray((int) (this.parentTable.getCellSpacing() / 2)));
+ result.write(ROW_CELL_SPACING_BOTTOM_STYLE);
+ }
+
+ result.write(ROW_CELL_PADDING_LEFT);
+ result.write(intToByteArray((int) (this.parentTable.getCellPadding() / 2)));
+ result.write(ROW_CELL_PADDING_RIGHT);
+ result.write(intToByteArray((int) (this.parentTable.getCellPadding() / 2)));
+ result.write(ROW_CELL_PADDING_LEFT_STYLE);
+ result.write(ROW_CELL_PADDING_RIGHT_STYLE);
+
+ result.write('\n');
+
+ for(int i = 0; i < this.cells.size(); i++) {
+ RtfCell rtfCell = (RtfCell) this.cells.get(i);
+ result.write(rtfCell.writeDefinition());
+ }
+ } catch(IOException ioe) {
+ ioe.printStackTrace();
+ }
+ return result.toByteArray();
+ }
+
+ /**
+ * Writes the content of this RtfRow
+ *
+ * @return A byte array with the content of this RtfRow
+ */
+ public byte[] write() {
+ ByteArrayOutputStream result = new ByteArrayOutputStream();
+ try {
+ result.write(writeRowDefinitions());
+
+ for(int i = 0; i < this.cells.size(); i++) {
+ RtfCell rtfCell = (RtfCell) this.cells.get(i);
+ result.write(rtfCell.write());
+ }
+
+ result.write(DELIMITER);
+
+ if(this.document.getDocumentSettings().isOutputTableRowDefinitionAfter()) {
+ result.write(writeRowDefinitions());
+ }
+
+ result.write(ROW_END);
+ result.write("\n".getBytes());
+ } catch(IOException ioe) {
+ ioe.printStackTrace();
+ }
+ return result.toByteArray();
+ }
+
+ /**
+ * Gets the parent RtfTable of this RtfRow
+ *
+ * @return The parent RtfTable of this RtfRow
+ */
+ protected RtfTable getParentTable() {
+ return this.parentTable;
+ }
+
+ /**
+ * Gets the cells of this RtfRow
+ *
+ * @return The cells of this RtfRow
+ */
+ protected ArrayList getCells() {
+ return this.cells;
+ }
+}
diff --git a/src/main/java/com/lowagie/text/rtf/table/RtfTable.java b/src/main/java/com/lowagie/text/rtf/table/RtfTable.java
new file mode 100644
index 0000000..285d9e0
--- /dev/null
+++ b/src/main/java/com/lowagie/text/rtf/table/RtfTable.java
@@ -0,0 +1,271 @@
+/*
+ * $Id: RtfTable.java,v 1.11 2005/07/16 11:39:30 hallm Exp $
+ * $Name: $
+ *
+ * Copyright 2001, 2002, 2003, 2004 by Mark Hall
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the ?GNU LIBRARY GENERAL PUBLIC LICENSE?), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.rtf.table;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.util.Iterator;
+import java.util.ArrayList;
+
+import com.lowagie.text.Element;
+import com.lowagie.text.Row;
+import com.lowagie.text.Table;
+import com.lowagie.text.rtf.RtfElement;
+import com.lowagie.text.rtf.document.RtfDocument;
+import com.lowagie.text.rtf.text.RtfParagraph;
+
+
+/**
+ * The RtfTable wraps a Table.
+ * INTERNAL USE ONLY
+ *
+ * @version $Version:$
+ * @author Mark Hall (mhall@edu.uni-klu.ac.at)
+ * @author Steffen Stundzig
+ * @author Benoit WIART <b.wiart@proxiad.com>
+ */
+public class RtfTable extends RtfElement {
+
+ /**
+ * The rows of this RtfTable
+ */
+ private ArrayList rows = null;
+ /**
+ * The percentage of the page width that this RtfTable covers
+ */
+ private float tableWidthPercent = 80;
+ /**
+ * An array with the proportional widths of the cells in each row
+ */
+ private float[] proportionalWidths = null;
+ /**
+ * The cell padding
+ */
+ private float cellPadding = 0;
+ /**
+ * The cell spacing
+ */
+ private float cellSpacing = 0;
+ /**
+ * The border style of this RtfTable
+ */
+ private RtfBorderGroup borders = null;
+ /**
+ * The alignment of this RtfTable
+ */
+ private int alignment = Element.ALIGN_CENTER;
+ /**
+ * Whether the cells in this RtfTable must fit in a page
+ */
+ private boolean cellsFitToPage = false;
+ /**
+ * Whether the whole RtfTable must fit in a page
+ */
+ private boolean tableFitToPage = false;
+ /**
+ * The number of header rows in this RtfTable
+ */
+ private int headerRows = 0;
+
+ /**
+ * Constructs a RtfTable based on a Table for a RtfDocument.
+ *
+ * @param doc The RtfDocument this RtfTable belongs to
+ * @param table The Table that this RtfTable wraps
+ */
+ public RtfTable(RtfDocument doc, Table table) {
+ super(doc);
+ table.complete();
+ importTable(table);
+ }
+
+ /**
+ * Imports the rows and settings from the Table into this
+ * RtfTable.
+ *
+ * @param table The source Table
+ */
+ private void importTable(Table table) {
+ this.rows = new ArrayList();
+ this.tableWidthPercent = table.widthPercentage();
+ this.proportionalWidths = table.getProportionalWidths();
+ this.cellPadding = (float) (table.cellpadding() * TWIPS_FACTOR);
+ this.cellSpacing = (float) (table.cellspacing() * TWIPS_FACTOR);
+ this.borders = new RtfBorderGroup(this.document, RtfBorder.ROW_BORDER, table.border(), table.borderWidth(), table.borderColor());
+ this.alignment = table.alignment();
+
+ int i = 0;
+ Iterator rowIterator = table.iterator();
+ while(rowIterator.hasNext()) {
+ this.rows.add(new RtfRow(this.document, this, (Row) rowIterator.next(), i));
+ i++;
+ }
+ for(i = 0; i < this.rows.size(); i++) {
+ ((RtfRow) this.rows.get(i)).handleCellSpanning();
+ }
+ this.headerRows = table.lastHeaderRow();
+ this.cellsFitToPage = table.hasToFitPageCells();
+ this.tableFitToPage = table.hasToFitPageTable();
+ }
+
+ /**
+ * Writes the content of this RtfTable
+ *
+ * @return A byte array with the content of this RtfTable
+ */
+ public byte[] write() {
+ ByteArrayOutputStream result = new ByteArrayOutputStream();
+ try {
+ if(!inHeader) {
+ result.write(RtfParagraph.PARAGRAPH);
+ }
+
+ for(int i = 0; i < this.rows.size(); i++) {
+ result.write(((RtfElement) this.rows.get(i)).write());
+ }
+
+ result.write(RtfParagraph.PARAGRAPH_DEFAULTS);
+ } catch(IOException ioe) {
+ ioe.printStackTrace();
+ }
+ return result.toByteArray();
+ }
+
+ /**
+ * Gets the alignment of this RtfTable
+ *
+ * @return The alignment of this RtfTable.
+ */
+ protected int getAlignment() {
+ return alignment;
+ }
+
+ /**
+ * Gets the borders of this RtfTable
+ *
+ * @return The borders of this RtfTable.
+ */
+ protected RtfBorderGroup getBorders() {
+ return this.borders;
+ }
+
+ /**
+ * Gets the cell padding of this RtfTable
+ *
+ * @return The cell padding of this RtfTable.
+ */
+ protected float getCellPadding() {
+ return cellPadding;
+ }
+
+ /**
+ * Gets the cell spacing of this RtfTable
+ *
+ * @return The cell spacing of this RtfTable.
+ */
+ protected float getCellSpacing() {
+ return cellSpacing;
+ }
+
+ /**
+ * Gets the proportional cell widths of this RtfTable
+ *
+ * @return The proportional widths of this RtfTable.
+ */
+ protected float[] getProportionalWidths() {
+ return (float[]) proportionalWidths.clone();
+ }
+
+ /**
+ * Gets the percentage of the page width this RtfTable covers
+ *
+ * @return The percentage of the page width.
+ */
+ protected float getTableWidthPercent() {
+ return tableWidthPercent;
+ }
+
+ /**
+ * Gets the rows of this RtfTable
+ *
+ * @return The rows of this RtfTable
+ */
+ protected ArrayList getRows() {
+ return this.rows;
+ }
+
+ /**
+ * Gets the cellsFitToPage setting of this RtfTable.
+ *
+ * @return The cellsFitToPage setting of this RtfTable.
+ */
+ protected boolean getCellsFitToPage() {
+ return this.cellsFitToPage;
+ }
+
+ /**
+ * Gets the tableFitToPage setting of this RtfTable.
+ *
+ * @return The tableFitToPage setting of this RtfTable.
+ */
+ protected boolean getTableFitToPage() {
+ return this.tableFitToPage;
+ }
+
+ /**
+ * Gets the number of header rows of this RtfTable
+ *
+ * @return The number of header rows
+ */
+ protected int getHeaderRows() {
+ return this.headerRows;
+ }
+}
diff --git a/src/main/java/com/lowagie/text/rtf/text/RtfAnnotation.java b/src/main/java/com/lowagie/text/rtf/text/RtfAnnotation.java
new file mode 100644
index 0000000..f7c02c2
--- /dev/null
+++ b/src/main/java/com/lowagie/text/rtf/text/RtfAnnotation.java
@@ -0,0 +1,133 @@
+/*
+ * $Id: RtfAnnotation.java,v 1.16 2005/05/04 14:33:46 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2001, 2002, 2003, 2004 by Mark Hall
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the ?GNU LIBRARY GENERAL PUBLIC LICENSE?), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.rtf.text;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+
+import com.lowagie.text.Annotation;
+import com.lowagie.text.rtf.RtfElement;
+import com.lowagie.text.rtf.document.RtfDocument;
+
+
+/**
+ * The RtfAnnotation provides support for adding Annotations to the rtf document.
+ * Only simple Annotations with Title / Content are supported.
+ *
+ * @version $Version:$
+ * @author Mark Hall (mhall@edu.uni-klu.ac.at)
+ */
+public class RtfAnnotation extends RtfElement {
+
+ /**
+ * Constant for the id of the annotation
+ */
+ private static final byte[] ANNOTATION_ID = "\\*\\atnid".getBytes();
+ /**
+ * Constant for the author of the annotation
+ */
+ private static final byte[] ANNOTATION_AUTHOR = "\\*\\atnauthor".getBytes();
+ /**
+ * Constant for the actual annotation
+ */
+ private static final byte[] ANNOTATION = "\\*\\annotation".getBytes();
+
+ /**
+ * The title of this RtfAnnotation
+ */
+ private String title = "";
+ /**
+ * The content of this RtfAnnotation
+ */
+ private String content = "";
+
+ /**
+ * Constructs a RtfAnnotation based on an Annotation.
+ *
+ * @param doc The RtfDocument this RtfAnnotation belongs to
+ * @param annotation The Annotation this RtfAnnotation is based off
+ */
+ public RtfAnnotation(RtfDocument doc, Annotation annotation) {
+ super(doc);
+ title = annotation.title();
+ content = annotation.content();
+ }
+
+ /**
+ * Writes the content of the RtfAnnotation
+ *
+ * @return The content of this RtfAnnotation
+ */
+ public byte[] write() {
+ ByteArrayOutputStream result = new ByteArrayOutputStream();
+ try {
+ result.write(OPEN_GROUP);
+ result.write(ANNOTATION_ID);
+ result.write(DELIMITER);
+ result.write(intToByteArray(document.getRandomInt()));
+ result.write(CLOSE_GROUP);
+ result.write(OPEN_GROUP);
+ result.write(ANNOTATION_AUTHOR);
+ result.write(DELIMITER);
+ result.write(title.getBytes());
+ result.write(CLOSE_GROUP);
+ result.write(OPEN_GROUP);
+ result.write(ANNOTATION);
+ result.write(RtfParagraph.PARAGRAPH_DEFAULTS);
+ result.write(DELIMITER);
+ result.write(content.getBytes());
+ result.write(CLOSE_GROUP);
+ } catch(IOException ioe) {
+ ioe.printStackTrace();
+ }
+ return result.toByteArray();
+ }
+}
diff --git a/src/main/java/com/lowagie/text/rtf/text/RtfChapter.java b/src/main/java/com/lowagie/text/rtf/text/RtfChapter.java
new file mode 100644
index 0000000..df176ca
--- /dev/null
+++ b/src/main/java/com/lowagie/text/rtf/text/RtfChapter.java
@@ -0,0 +1,105 @@
+/*
+ * $Id: RtfChapter.java,v 1.18 2005/09/11 20:17:41 hallm Exp $
+ * $Name: $
+ *
+ * Copyright 2001, 2002 by Mark Hall
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the ?GNU LIBRARY GENERAL PUBLIC LICENSE?), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.rtf.text;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+
+import com.lowagie.text.Chapter;
+import com.lowagie.text.rtf.RtfBasicElement;
+import com.lowagie.text.rtf.document.RtfDocument;
+
+
+/**
+ * The RtfChapter wraps a Chapter element.
+ * INTERNAL CLASS
+ *
+ * @version $Revision: 1.18 $
+ * @author Mark Hall (mhall@edu.uni-klu.ac.at)
+ */
+public class RtfChapter extends RtfSection {
+
+ /**
+ * Constructs a RtfChapter for a given Chapter
+ *
+ * @param doc The RtfDocument this RtfChapter belongs to
+ * @param chapter The Chapter this RtfChapter is based on
+ */
+ public RtfChapter(RtfDocument doc, Chapter chapter) {
+ super(doc, chapter);
+ }
+
+ /**
+ * Writes the RtfChapter and its contents
+ *
+ * @return A byte array containing the RtfChapter and its contents
+ */
+ public byte[] write() {
+ ByteArrayOutputStream result = new ByteArrayOutputStream();
+ try {
+ if(this.document.getLastElementWritten() != null && !(this.document.getLastElementWritten() instanceof RtfChapter)) {
+ result.write("\\page".getBytes());
+ }
+ result.write("\\sectd".getBytes());
+ result.write(document.getDocumentHeader().writeSectionDefinition());
+ if(this.title != null) {
+ result.write(this.title.write());
+ }
+ for(int i = 0; i < items.size(); i++) {
+ result.write(((RtfBasicElement) items.get(i)).write());
+ }
+ result.write("\\sect".getBytes());
+ } catch(IOException ioe) {
+ ioe.printStackTrace();
+ }
+ return result.toByteArray();
+ }
+}
diff --git a/src/main/java/com/lowagie/text/rtf/text/RtfChunk.java b/src/main/java/com/lowagie/text/rtf/text/RtfChunk.java
new file mode 100644
index 0000000..7368c48
--- /dev/null
+++ b/src/main/java/com/lowagie/text/rtf/text/RtfChunk.java
@@ -0,0 +1,202 @@
+/*
+ * $Id: RtfChunk.java,v 1.12 2005/07/23 10:57:32 hallm Exp $
+ * $Name: $
+ *
+ * Copyright 2001, 2002, 2003, 2004 by Mark Hall
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the ?GNU LIBRARY GENERAL PUBLIC LICENSE?), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.rtf.text;
+
+import java.awt.Color;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+
+import com.lowagie.text.Chunk;
+import com.lowagie.text.rtf.RtfElement;
+import com.lowagie.text.rtf.document.RtfDocument;
+import com.lowagie.text.rtf.style.RtfColor;
+import com.lowagie.text.rtf.style.RtfFont;
+
+
+/**
+ * The RtfChunk contains one piece of text. The smallest text element available
+ * in iText.
+ *
+ * @version $Version:$
+ * @author Mark Hall (mhall@edu.uni-klu.ac.at)
+ */
+public class RtfChunk extends RtfElement {
+
+ /**
+ * Constant for the subscript flag
+ */
+ private static final byte[] FONT_SUBSCRIPT = "\\sub".getBytes();
+ /**
+ * Constant for the superscript flag
+ */
+ private static final byte[] FONT_SUPERSCRIPT = "\\super".getBytes();
+ /**
+ * Constant for the end of sub / superscript flag
+ */
+ private static final byte[] FONT_END_SUPER_SUBSCRIPT = "\\nosupersub".getBytes();
+ /**
+ * Constant for background colour.
+ */
+ private static final byte[] HIGHLIGHT = "\\highlight".getBytes();
+
+ /**
+ * The font of this RtfChunk
+ */
+ private RtfFont font = null;
+ /**
+ * The actual content of this RtfChunk
+ */
+ private String content = "";
+ /**
+ * Whether to use soft line breaks instead of hard ones.
+ */
+ private boolean softLineBreaks = false;
+ /**
+ * The super / subscript of this RtfChunk
+ */
+ private float superSubScript = 0;
+ /**
+ * An optional background colour.
+ */
+ private RtfColor background = null;
+
+ /**
+ * Constructs a RtfChunk based on the content of a Chunk
+ *
+ * @param doc The RtfDocument that this Chunk belongs to
+ * @param chunk The Chunk that this RtfChunk is based on
+ */
+ public RtfChunk(RtfDocument doc, Chunk chunk) {
+ super(doc);
+
+ if(chunk == null) {
+ return;
+ }
+
+ if(chunk.getAttributes() != null && chunk.getAttributes().get(Chunk.SUBSUPSCRIPT) != null) {
+ this.superSubScript = ((Float)chunk.getAttributes().get(Chunk.SUBSUPSCRIPT)).floatValue();
+ }
+ if(chunk.getAttributes() != null && chunk.getAttributes().get(Chunk.BACKGROUND) != null) {
+ this.background = new RtfColor(this.document, (Color) ((Object[]) chunk.getAttributes().get(Chunk.BACKGROUND))[0]);
+ }
+ font = new RtfFont(doc, chunk.font());
+ content = chunk.content();
+ }
+
+ /**
+ * Writes the content of this RtfChunk. First the font information
+ * is written, then the content, and then more font information
+ *
+ * @return A byte array with the content of this RtfChunk
+ */
+ public byte[] write() {
+ ByteArrayOutputStream result = new ByteArrayOutputStream();
+ try {
+ if(this.background != null) {
+ result.write(OPEN_GROUP);
+ }
+
+ result.write(font.writeBegin());
+ if(superSubScript < 0) {
+ result.write(FONT_SUBSCRIPT);
+ } else if(superSubScript > 0) {
+ result.write(FONT_SUPERSCRIPT);
+ }
+ if(this.background != null) {
+ result.write(HIGHLIGHT);
+ result.write(intToByteArray(this.background.getColorNumber()));
+ }
+ result.write(DELIMITER);
+
+ result.write(document.filterSpecialChar(content, false, softLineBreaks || this.document.getDocumentSettings().isAlwaysGenerateSoftLinebreaks()).getBytes());
+
+ if(superSubScript != 0) {
+ result.write(FONT_END_SUPER_SUBSCRIPT);
+ }
+ result.write(font.writeEnd());
+
+ if(this.background != null) {
+ result.write(CLOSE_GROUP);
+ }
+ } catch(IOException ioe) {
+ ioe.printStackTrace();
+ }
+ return result.toByteArray();
+ }
+
+ /**
+ * Sets the RtfDocument this RtfChunk belongs to.
+ *
+ * @param doc The RtfDocument to use
+ */
+ public void setRtfDocument(RtfDocument doc) {
+ super.setRtfDocument(doc);
+ this.font.setRtfDocument(this.document);
+ }
+
+ /**
+ * Sets whether to use soft line breaks instead of default hard ones.
+ *
+ * @param softLineBreaks whether to use soft line breaks instead of default hard ones.
+ */
+ public void setSoftLineBreaks(boolean softLineBreaks) {
+ this.softLineBreaks = softLineBreaks;
+ }
+
+ /**
+ * Gets whether to use soft line breaks instead of default hard ones.
+ *
+ * @return whether to use soft line breaks instead of default hard ones.
+ */
+ public boolean getSoftLineBreaks() {
+ return this.softLineBreaks;
+ }
+}
diff --git a/src/main/java/com/lowagie/text/rtf/text/RtfNewPage.java b/src/main/java/com/lowagie/text/rtf/text/RtfNewPage.java
new file mode 100644
index 0000000..3bb7a88
--- /dev/null
+++ b/src/main/java/com/lowagie/text/rtf/text/RtfNewPage.java
@@ -0,0 +1,53 @@
+/*
+ * Created on Aug 12, 2004
+ *
+ * To change the template for this generated file go to
+ * Window - Preferences - Java - Code Generation - Code and Comments
+ */
+package com.lowagie.text.rtf.text;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+
+import com.lowagie.text.rtf.RtfElement;
+import com.lowagie.text.rtf.document.RtfDocument;
+
+
+/**
+ * The RtfNewPage creates a new page. INTERNAL CLASS
+ *
+ * @version $Version:$
+ * @author Mark Hall (mhall@edu.uni-klu.ac.at)
+ */
+public class RtfNewPage extends RtfElement {
+
+ /**
+ * Constant for a new page
+ */
+ private static final byte[] NEW_PAGE = "\\page".getBytes();
+
+ /**
+ * Constructs a RtfNewPage
+ *
+ * @param doc The RtfDocument this RtfNewPage belongs to
+ */
+ public RtfNewPage(RtfDocument doc) {
+ super(doc);
+ }
+
+ /**
+ * Writes a new page
+ *
+ * @return A byte array with the new page set
+ */
+ public byte[] write() {
+ ByteArrayOutputStream result = new ByteArrayOutputStream();
+ try {
+ result.write(NEW_PAGE);
+ result.write(RtfParagraph.PARAGRAPH_DEFAULTS);
+ } catch(IOException ioe) {
+ ioe.printStackTrace();
+ }
+ return result.toByteArray();
+ }
+}
diff --git a/src/main/java/com/lowagie/text/rtf/text/RtfParagraph.java b/src/main/java/com/lowagie/text/rtf/text/RtfParagraph.java
new file mode 100644
index 0000000..c600069
--- /dev/null
+++ b/src/main/java/com/lowagie/text/rtf/text/RtfParagraph.java
@@ -0,0 +1,211 @@
+/*
+ * $Id: RtfParagraph.java,v 1.20 2005/12/24 13:12:43 hallm Exp $
+ * $Name: $
+ *
+ * Copyright 2001, 2002, 2003, 2004 by Mark Hall
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the ?GNU LIBRARY GENERAL PUBLIC LICENSE?), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.rtf.text;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+
+import com.lowagie.text.Chunk;
+import com.lowagie.text.DocumentException;
+import com.lowagie.text.Element;
+import com.lowagie.text.Paragraph;
+import com.lowagie.text.rtf.RtfBasicElement;
+import com.lowagie.text.rtf.RtfElement;
+import com.lowagie.text.rtf.document.RtfDocument;
+import com.lowagie.text.rtf.graphic.RtfImage;
+import com.lowagie.text.rtf.style.RtfFont;
+import com.lowagie.text.rtf.style.RtfParagraphStyle;
+
+
+/**
+ * The RtfParagraph is an extension of the RtfPhrase that adds alignment and
+ * indentation properties. It wraps a Paragraph.
+ *
+ * @version $Revision: 1.20 $
+ * @author Mark Hall (mhall@edu.uni-klu.ac.at)
+ */
+public class RtfParagraph extends RtfPhrase {
+
+ /**
+ * Constant for the end of a paragraph
+ */
+ public static final byte[] PARAGRAPH = "\\par".getBytes();
+
+ /**
+ * An optional RtfParagraphStyle to use for styling.
+ */
+ private RtfParagraphStyle paragraphStyle = null;
+
+ /**
+ * Constructs a RtfParagraph belonging to a RtfDocument based on a Paragraph.
+ *
+ * @param doc The RtfDocument this RtfParagraph belongs to
+ * @param paragraph The Paragraph that this RtfParagraph is based on
+ */
+ public RtfParagraph(RtfDocument doc, Paragraph paragraph) {
+ super(doc);
+
+ RtfFont baseFont = null;
+ if(paragraph.font() instanceof RtfParagraphStyle) {
+ this.paragraphStyle = this.document.getDocumentHeader().getRtfParagraphStyle(((RtfParagraphStyle) paragraph.font()).getStyleName());
+ baseFont = this.paragraphStyle;
+ } else {
+ baseFont = new RtfFont(this.document, paragraph.font());
+ this.paragraphStyle = new RtfParagraphStyle(this.document, this.document.getDocumentHeader().getRtfParagraphStyle("Normal"));
+ this.paragraphStyle.setAlignment(paragraph.alignment());
+ this.paragraphStyle.setIndentLeft((int) (paragraph.indentationLeft() * RtfElement.TWIPS_FACTOR));
+ this.paragraphStyle.setIndentRight((int) (paragraph.indentationRight() * RtfElement.TWIPS_FACTOR));
+ this.paragraphStyle.setSpacingBefore((int) (paragraph.spacingBefore() * RtfElement.TWIPS_FACTOR));
+ this.paragraphStyle.setSpacingAfter((int) (paragraph.spacingAfter() * RtfElement.TWIPS_FACTOR));
+ if(paragraph.leadingDefined()) {
+ this.paragraphStyle.setLineLeading((int) (paragraph.leading() * RtfElement.TWIPS_FACTOR));
+ }
+ this.paragraphStyle.setKeepTogether(paragraph.getKeepTogether());
+ }
+
+ for(int i = 0; i < paragraph.size(); i++) {
+ Element chunk = (Element) paragraph.get(i);
+ if(chunk instanceof Chunk) {
+ ((Chunk) chunk).setFont(baseFont.difference(((Chunk) chunk).font()));
+ } else if(chunk instanceof RtfImage) {
+ ((RtfImage) chunks.get(i)).setAlignment(this.paragraphStyle.getAlignment());
+ }
+ try {
+ chunks.add(doc.getMapper().mapElement(chunk));
+ } catch(DocumentException de) {
+ }
+ }
+ }
+
+ /**
+ * Set whether this RtfParagraph must stay on the same page as the next one.
+ *
+ * @param keepTogetherWithNext Whether this RtfParagraph must keep together with the next.
+ */
+ public void setKeepTogetherWithNext(boolean keepTogetherWithNext) {
+ this.paragraphStyle.setKeepTogetherWithNext(keepTogetherWithNext);
+ }
+
+ /**
+ * Writes the content of this RtfParagraph. First paragraph specific data is written
+ * and then the RtfChunks of this RtfParagraph are added.
+ *
+ * @return The content of this RtfParagraph
+ */
+ public byte[] write() {
+ ByteArrayOutputStream result = new ByteArrayOutputStream();
+ try {
+ result.write(PARAGRAPH_DEFAULTS);
+
+ if(inTable) {
+ result.write(IN_TABLE);
+ }
+
+ if(this.paragraphStyle != null) {
+ result.write(this.paragraphStyle.writeBegin());
+ }
+
+ for(int i = 0; i < chunks.size(); i++) {
+ result.write(((RtfBasicElement) chunks.get(i)).write());
+ }
+
+ if(this.paragraphStyle != null) {
+ result.write(this.paragraphStyle.writeEnd());
+ }
+
+ if(!inTable) {
+ result.write(PARAGRAPH);
+ }
+ if(this.document.getDocumentSettings().isOutputDebugLineBreaks()) {
+ result.write('\n');
+ }
+ } catch(IOException ioe) {
+ ioe.printStackTrace();
+ }
+ return result.toByteArray();
+ }
+
+ /**
+ * Gets the left indentation of this RtfParagraph.
+ *
+ * @return The left indentation.
+ */
+ public int getIndentLeft() {
+ return this.paragraphStyle.getIndentLeft();
+ }
+
+ /**
+ * Sets the left indentation of this RtfParagraph.
+ *
+ * @param indentLeft The left indentation to use.
+ */
+ public void setIndentLeft(int indentLeft) {
+ this.paragraphStyle.setIndentLeft(indentLeft);
+ }
+
+ /**
+ * Gets the right indentation of this RtfParagraph.
+ *
+ * @return The right indentation.
+ */
+ public int getIndentRight() {
+ return this.paragraphStyle.getIndentRight();
+ }
+
+ /**
+ * Sets the right indentation of this RtfParagraph.
+ *
+ * @param indentRight The right indentation to use.
+ */
+ public void setIndentRight(int indentRight) {
+ this.paragraphStyle.setIndentRight(indentRight);
+ }
+}
diff --git a/src/main/java/com/lowagie/text/rtf/text/RtfPhrase.java b/src/main/java/com/lowagie/text/rtf/text/RtfPhrase.java
new file mode 100644
index 0000000..f5d79a9
--- /dev/null
+++ b/src/main/java/com/lowagie/text/rtf/text/RtfPhrase.java
@@ -0,0 +1,203 @@
+/*
+ * $Id: RtfPhrase.java,v 1.14 2006/02/09 17:13:35 hallm Exp $
+ * $Name: $
+ *
+ * Copyright 2001, 2002, 2003, 2004 by Mark Hall
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the ?GNU LIBRARY GENERAL PUBLIC LICENSE?), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.rtf.text;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.util.ArrayList;
+
+import com.lowagie.text.Chunk;
+import com.lowagie.text.DocumentException;
+import com.lowagie.text.Element;
+import com.lowagie.text.Phrase;
+import com.lowagie.text.rtf.RtfBasicElement;
+import com.lowagie.text.rtf.RtfElement;
+import com.lowagie.text.rtf.document.RtfDocument;
+import com.lowagie.text.rtf.style.RtfFont;
+
+
+/**
+ * The RtfPhrase contains multiple RtfChunks
+ *
+ * @version $Id: RtfPhrase.java,v 1.14 2006/02/09 17:13:35 hallm Exp $
+ * @author Mark Hall (mhall@edu.uni-klu.ac.at)
+ */
+public class RtfPhrase extends RtfElement {
+
+ /**
+ * Constant for the resetting of the paragraph defaults
+ */
+ public static final byte[] PARAGRAPH_DEFAULTS = "\\pard".getBytes();
+ /**
+ * Constant for phrase in a table indication
+ */
+ public static final byte[] IN_TABLE = "\\intbl".getBytes();
+ /**
+ * Constant for the line spacing.
+ */
+ public static final byte[] LINE_SPACING = "\\sl".getBytes();
+
+ /**
+ * ArrayList containing the RtfChunks of this RtfPhrase
+ */
+ protected ArrayList chunks = new ArrayList();
+ /**
+ * The height of each line.
+ */
+ private int lineLeading = 0;
+
+ /**
+ * A basically empty constructor that is used by the RtfParagraph.
+ *
+ * @param doc The RtfDocument this RtfPhrase belongs to.
+ */
+ protected RtfPhrase(RtfDocument doc) {
+ super(doc);
+ }
+
+ /**
+ * Constructs a new RtfPhrase for the RtfDocument with the given Phrase
+ *
+ * @param doc The RtfDocument this RtfPhrase belongs to
+ * @param phrase The Phrase this RtfPhrase is based on
+ */
+ public RtfPhrase(RtfDocument doc, Phrase phrase) {
+ super(doc);
+
+ if(phrase == null) {
+ return;
+ }
+
+ if(phrase.leadingDefined()) {
+ this.lineLeading = (int) (phrase.leading() * RtfElement.TWIPS_FACTOR);
+ } else {
+ this.lineLeading = 0;
+ }
+
+ RtfFont phraseFont = new RtfFont(null, phrase.font());
+ for(int i = 0; i < phrase.size(); i++) {
+ Element chunk = (Element) phrase.get(i);
+ if(chunk instanceof Chunk) {
+ ((Chunk) chunk).setFont(phraseFont.difference(((Chunk) chunk).font()));
+ }
+ try {
+ chunks.add(doc.getMapper().mapElement(chunk));
+ } catch(DocumentException de) {
+ }
+ }
+ }
+
+ /**
+ * Write the content of this RtfPhrase. First resets to the paragraph defaults
+ * then if the RtfPhrase is in a RtfCell a marker for this is written and finally
+ * the RtfChunks of this RtfPhrase are written.
+ *
+ * @return The content of this RtfPhrase
+ */
+ public byte[] write() {
+ ByteArrayOutputStream result = new ByteArrayOutputStream();
+ try {
+ result.write(PARAGRAPH_DEFAULTS);
+ if(inTable) {
+ result.write(IN_TABLE);
+ }
+ if(this.lineLeading > 0) {
+ result.write(LINE_SPACING);
+ result.write(intToByteArray(this.lineLeading));
+ }
+ for(int i = 0; i < chunks.size(); i++) {
+ result.write(((RtfBasicElement) chunks.get(i)).write());
+ }
+ } catch(IOException ioe) {
+ ioe.printStackTrace();
+ }
+ return result.toByteArray();
+ }
+
+ /**
+ * Sets whether this RtfPhrase is in a table. Sets the correct inTable setting for all
+ * child elements.
+ *
+ * @param inTable <code>True</code> if this RtfPhrase is in a table, <code>false</code> otherwise
+ */
+ public void setInTable(boolean inTable) {
+ super.setInTable(inTable);
+ for(int i = 0; i < this.chunks.size(); i++) {
+ ((RtfBasicElement) this.chunks.get(i)).setInTable(inTable);
+ }
+ }
+
+ /**
+ * Sets whether this RtfPhrase is in a header. Sets the correct inTable setting for all
+ * child elements.
+ *
+ * @param inHeader <code>True</code> if this RtfPhrase is in a header, <code>false</code> otherwise
+ */
+ public void setInHeader(boolean inHeader) {
+ super.setInHeader(inHeader);
+ for(int i = 0; i < this.chunks.size(); i++) {
+ ((RtfBasicElement) this.chunks.get(i)).setInHeader(inHeader);
+ }
+ }
+
+ /**
+ * Sets the RtfDocument this RtfPhrase belongs to. Also sets the RtfDocument for all child
+ * elements.
+ *
+ * @param doc The RtfDocument to use
+ */
+ public void setRtfDocument(RtfDocument doc) {
+ super.setRtfDocument(doc);
+ for(int i = 0; i < this.chunks.size(); i++) {
+ ((RtfBasicElement) this.chunks.get(i)).setRtfDocument(this.document);
+ }
+ }
+}
diff --git a/src/main/java/com/lowagie/text/rtf/text/RtfSection.java b/src/main/java/com/lowagie/text/rtf/text/RtfSection.java
new file mode 100644
index 0000000..2b5ad86
--- /dev/null
+++ b/src/main/java/com/lowagie/text/rtf/text/RtfSection.java
@@ -0,0 +1,201 @@
+/*
+ * $Id: RtfSection.java,v 1.11 2005/08/19 21:17:04 hallm Exp $
+ * $Name: $
+ *
+ * Copyright 2001, 2002, 2003, 2004 by Mark Hall
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the ?GNU LIBRARY GENERAL PUBLIC LICENSE?), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.rtf.text;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.util.Iterator;
+import java.util.ArrayList;
+
+import com.lowagie.text.Chunk;
+import com.lowagie.text.DocumentException;
+import com.lowagie.text.Element;
+import com.lowagie.text.Section;
+import com.lowagie.text.rtf.RtfBasicElement;
+import com.lowagie.text.rtf.RtfElement;
+import com.lowagie.text.rtf.document.RtfDocument;
+import com.lowagie.text.rtf.field.RtfTOCEntry;
+
+
+/**
+ * The RtfSection wraps a Section element.
+ * INTERNAL CLASS
+ *
+ * @version $Revision: 1.11 $
+ * @author Mark Hall (mhall@edu.uni-klu.ac.at)
+ */
+public class RtfSection extends RtfElement {
+
+ /**
+ * The title paragraph of this RtfSection
+ */
+ protected RtfParagraph title = null;
+ /**
+ * The sub-items of this RtfSection
+ */
+ protected ArrayList items = null;
+
+ /**
+ * Constructs a RtfSection for a given Section. If the autogenerateTOCEntries
+ * property of the RtfDocument is set and the title is not empty then a TOC entry
+ * is generated for the title.
+ *
+ * @param doc The RtfDocument this RtfSection belongs to
+ * @param section The Section this RtfSection is based on
+ */
+ public RtfSection(RtfDocument doc, Section section) {
+ super(doc);
+ items = new ArrayList();
+ try {
+ if(section.title() != null) {
+ this.title = (RtfParagraph) doc.getMapper().mapElement(section.title());
+ }
+ if(document.getAutogenerateTOCEntries()) {
+ StringBuffer titleText = new StringBuffer();
+ Iterator it = section.title().iterator();
+ while(it.hasNext()) {
+ Element element = (Element) it.next();
+ if(element.type() == Element.CHUNK) {
+ titleText.append(((Chunk) element).content());
+ }
+ }
+ if(titleText.toString().trim().length() > 0) {
+ RtfTOCEntry tocEntry = new RtfTOCEntry(titleText.toString(), section.title().font());
+ tocEntry.setRtfDocument(this.document);
+ this.items.add(tocEntry);
+ }
+ }
+ Iterator iterator = section.iterator();
+ while(iterator.hasNext()) {
+ Element element = (Element) iterator.next();
+ RtfBasicElement rtfElement = doc.getMapper().mapElement(element);
+ if(rtfElement != null) {
+ items.add(rtfElement);
+ }
+ }
+
+ updateIndentation(section.indentationLeft(), section.indentationRight(), section.indentation());
+ } catch(DocumentException de) {
+ de.printStackTrace();
+ }
+ }
+
+ /**
+ * Write this RtfSection and its contents
+ *
+ * @return A byte array with the RtfSection and its contents
+ */
+ public byte[] write() {
+ ByteArrayOutputStream result = new ByteArrayOutputStream();
+ try {
+ result.write(RtfParagraph.PARAGRAPH);
+ if(this.title != null) {
+ result.write(this.title.write());
+ }
+ for(int i = 0; i < items.size(); i++) {
+ result.write(((RtfBasicElement) items.get(i)).write());
+ }
+ } catch(IOException ioe) {
+ ioe.printStackTrace();
+ }
+ return result.toByteArray();
+ }
+
+ /**
+ * Sets whether this RtfSection is in a table. Sets the correct inTable setting for all
+ * child elements.
+ *
+ * @param inTable <code>True</code> if this RtfSection is in a table, <code>false</code> otherwise
+ */
+ public void setInTable(boolean inTable) {
+ super.setInTable(inTable);
+ for(int i = 0; i < this.items.size(); i++) {
+ ((RtfBasicElement) this.items.get(i)).setInTable(inTable);
+ }
+ }
+
+ /**
+ * Sets whether this RtfSection is in a header. Sets the correct inTable setting for all
+ * child elements.
+ *
+ * @param inHeader <code>True</code> if this RtfSection is in a header, <code>false</code> otherwise
+ */
+ public void setInHeader(boolean inHeader) {
+ super.setInHeader(inHeader);
+ for(int i = 0; i < this.items.size(); i++) {
+ ((RtfBasicElement) this.items.get(i)).setInHeader(inHeader);
+ }
+ }
+
+ /**
+ * Updates the left, right and content indentation of all RtfParagraph and RtfSection
+ * elements that this RtfSection contains.
+ *
+ * @param indentLeft The left indentation to add.
+ * @param indentRight The right indentation to add.
+ * @param indentContent The content indentation to add.
+ */
+ private void updateIndentation(float indentLeft, float indentRight, float indentContent) {
+ if(this.title != null) {
+ this.title.setIndentLeft((int) (this.title.getIndentLeft() + indentLeft * RtfElement.TWIPS_FACTOR));
+ this.title.setIndentRight((int) (this.title.getIndentRight() + indentRight * RtfElement.TWIPS_FACTOR));
+ }
+ for(int i = 0; i < this.items.size(); i++) {
+ RtfBasicElement rtfElement = (RtfBasicElement) this.items.get(i);
+ if(rtfElement instanceof RtfSection) {
+ ((RtfSection) rtfElement).updateIndentation(indentLeft + indentContent, indentRight, 0);
+ } else if(rtfElement instanceof RtfParagraph) {
+ ((RtfParagraph) rtfElement).setIndentLeft((int) (((RtfParagraph) rtfElement).getIndentLeft() + (indentLeft + indentContent) * RtfElement.TWIPS_FACTOR));
+ ((RtfParagraph) rtfElement).setIndentRight((int) (((RtfParagraph) rtfElement).getIndentRight() + indentRight * RtfElement.TWIPS_FACTOR));
+ }
+ }
+ }
+}
diff --git a/src/main/java/com/lowagie/text/rtf/text/RtfTab.java b/src/main/java/com/lowagie/text/rtf/text/RtfTab.java
new file mode 100644
index 0000000..1041ae6
--- /dev/null
+++ b/src/main/java/com/lowagie/text/rtf/text/RtfTab.java
@@ -0,0 +1,140 @@
+/*
+ * $Id: RtfTab.java,v 1.1 2006/06/17 09:51:30 hallm Exp $
+ * $Name: $
+ *
+ * Copyright 2001, 2002, 2003, 2004 by Mark Hall
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ * Co-Developer of the code is Mark Hall. Portions created by the Co-Developer are
+ * Copyright (C) 2006 by Mark Hall. All Rights Reserved
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the ?GNU LIBRARY GENERAL PUBLIC LICENSE?), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.rtf.text;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+
+import com.lowagie.text.rtf.RtfAddableElement;
+
+/**
+ * The RtfTab encapsulates a tab position and tab type in a paragraph.
+ * To add tabs to a paragraph construct new RtfTab objects with the desired
+ * tab position and alignment and then add them to the paragraph. In the actual
+ * text the tabs are then defined as standard \t characters.<br /><br />
+ *
+ * <code>RtfTab tab = new RtfTab(300, RtfTab.TAB_LEFT_ALIGN);<br />
+ * Paragraph para = new Paragraph();<br />
+ * para.add(tab);<br />
+ * para.add("This paragraph has a\ttab defined.");</code>
+ *
+ * @version $Revision: 1.1 $
+ * @author Mark Hall (mhall@edu.uni-klu.ac.at)
+ */
+public class RtfTab extends RtfAddableElement {
+
+ /**
+ * A tab where the text is left aligned.
+ */
+ public static final int TAB_LEFT_ALIGN = 0;
+ /**
+ * A tab where the text is centre aligned.
+ */
+ public static final int TAB_CENTER_ALIGN = 1;
+ /**
+ * A tab where the text is right aligned.
+ */
+ public static final int TAB_RIGHT_ALIGN = 2;
+ /**
+ * A tab where the text is aligned on the decimal character. Which
+ * character that is depends on the language settings of the viewer.
+ */
+ public static final int TAB_DECIMAL_ALIGN = 3;
+
+ /**
+ * The tab position in twips.
+ */
+ private int position = 0;
+ /**
+ * The tab alignment.
+ */
+ private int type = TAB_LEFT_ALIGN;
+
+ /**
+ * Constructs a new RtfTab with the given position and type. The position
+ * is in standard iText points. The type is one of the tab alignment
+ * constants defined in the RtfTab.
+ *
+ * @param position The position of the tab in points.
+ * @param type The tab type constant.
+ */
+ public RtfTab(float position, int type) {
+ this.position = (int) Math.round(position * TWIPS_FACTOR);
+ switch(type) {
+ case TAB_LEFT_ALIGN: this.type = TAB_LEFT_ALIGN; break;
+ case TAB_CENTER_ALIGN: this.type = TAB_CENTER_ALIGN; break;
+ case TAB_RIGHT_ALIGN: this.type = TAB_RIGHT_ALIGN; break;
+ case TAB_DECIMAL_ALIGN: this.type = TAB_DECIMAL_ALIGN; break;
+ default: this.type = TAB_LEFT_ALIGN; break;
+ }
+ }
+
+ /**
+ * Writes the tab settings.
+ */
+ public byte[] write() {
+ ByteArrayOutputStream result = new ByteArrayOutputStream();
+ try {
+ switch(this.type) {
+ case TAB_CENTER_ALIGN: result.write("\\tqc".getBytes()); break;
+ case TAB_RIGHT_ALIGN: result.write("\\tqr".getBytes()); break;
+ case TAB_DECIMAL_ALIGN: result.write("\\tqdec".getBytes()); break;
+ }
+ result.write("\\tx".getBytes());
+ result.write(intToByteArray(this.position));
+ } catch(IOException ioe) {
+ ioe.printStackTrace();
+ }
+ return result.toByteArray();
+ }
+}
diff --git a/src/main/java/com/lowagie/text/rtf/text/RtfTabGroup.java b/src/main/java/com/lowagie/text/rtf/text/RtfTabGroup.java
new file mode 100644
index 0000000..e298221
--- /dev/null
+++ b/src/main/java/com/lowagie/text/rtf/text/RtfTabGroup.java
@@ -0,0 +1,127 @@
+/*
+ * $Id: RtfTabGroup.java,v 1.1 2006/06/17 09:51:30 hallm Exp $
+ * $Name: $
+ *
+ * Copyright 2001, 2002, 2003, 2004 by Mark Hall
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ * Co-Developer of the code is Mark Hall. Portions created by the Co-Developer are
+ * Copyright (C) 2006 by Mark Hall. All Rights Reserved
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the ?GNU LIBRARY GENERAL PUBLIC LICENSE?), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.rtf.text;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.util.ArrayList;
+
+import com.lowagie.text.rtf.RtfAddableElement;
+
+/**
+ * The RtfTabGroup is a convenience class if the same tabs are to be added
+ * to multiple paragraphs.<br /><br />
+ *
+ * <code>RtfTabGroup tabs = new RtfTabGroup();<br />
+ * tabs.add(new RtfTab(70, RtfTab.TAB_LEFT_ALIGN));<br />
+ * tabs.add(new RtfTab(160, RtfTab.TAB_CENTER_ALIGN));<br />
+ * tabs.add(new RtfTab(250, RtfTab.TAB_DECIMAL_ALIGN));<br />
+ * tabs.add(new RtfTab(500, RtfTab.TAB_RIGHT_ALIGN));<br />
+ * Paragraph para = new Paragraph();<br />
+ * para.add(tabs);<br />
+ * para.add("\tLeft aligned\tCentre aligned\t12,45\tRight aligned");</code>
+ *
+ * @version $Revision: 1.1 $
+ * @author Mark Hall (mhall@edu.uni-klu.ac.at)
+ */
+public class RtfTabGroup extends RtfAddableElement {
+ /**
+ * The tabs to add.
+ */
+ private ArrayList tabs = null;
+
+ /**
+ * Constructs an empty RtfTabGroup.
+ */
+ public RtfTabGroup() {
+ this.tabs = new ArrayList();
+ }
+
+ /**
+ * Constructs a RtfTabGroup with a set of tabs.
+ *
+ * @param tabs An ArrayList with the RtfTabs to group in this RtfTabGroup.
+ */
+ public RtfTabGroup(ArrayList tabs) {
+ this.tabs = new ArrayList();
+ for(int i = 0; i < tabs.size(); i++) {
+ if(tabs.get(i) instanceof RtfTab) {
+ this.tabs.add(tabs.get(i));
+ }
+ }
+ }
+
+ /**
+ * Adds a RtfTab to the list of grouped tabs.
+ *
+ * @param tab The RtfTab to add.
+ */
+ public void add(RtfTab tab) {
+ this.tabs.add(tab);
+ }
+
+ /**
+ * Combines the tab output form all grouped tabs.
+ */
+ public byte[] write() {
+ ByteArrayOutputStream result = new ByteArrayOutputStream();
+ try {
+ for(int i = 0; i < this.tabs.size(); i++) {
+ result.write(((RtfTab) this.tabs.get(i)).write());
+ }
+ } catch(IOException ioe) {
+ ioe.printStackTrace();
+ }
+ return result.toByteArray();
+ }
+}
diff --git a/src/main/java/com/lowagie/text/xml/SAXiTextHandler.java b/src/main/java/com/lowagie/text/xml/SAXiTextHandler.java
new file mode 100644
index 0000000..00fb5bf
--- /dev/null
+++ b/src/main/java/com/lowagie/text/xml/SAXiTextHandler.java
@@ -0,0 +1,921 @@
+/*
+ * $Id: SAXiTextHandler.java,v 1.52 2006/04/20 11:49:41 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2001, 2002 by Bruno Lowagie.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.xml;
+
+import java.io.IOException;
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.EmptyStackException;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Properties;
+import java.util.Stack;
+
+import org.xml.sax.Attributes;
+import org.xml.sax.helpers.DefaultHandler;
+
+import com.lowagie.text.Anchor;
+import com.lowagie.text.Annotation;
+import com.lowagie.text.BadElementException;
+import com.lowagie.text.Cell;
+import com.lowagie.text.Chapter;
+import com.lowagie.text.Chunk;
+import com.lowagie.text.DocListener;
+import com.lowagie.text.DocumentException;
+import com.lowagie.text.Element;
+import com.lowagie.text.ElementTags;
+import com.lowagie.text.Entities;
+import com.lowagie.text.ExceptionConverter;
+import com.lowagie.text.Font;
+import com.lowagie.text.Graphic;
+import com.lowagie.text.Image;
+import com.lowagie.text.List;
+import com.lowagie.text.ListItem;
+import com.lowagie.text.Meta;
+import com.lowagie.text.PageSize;
+import com.lowagie.text.Paragraph;
+import com.lowagie.text.Phrase;
+import com.lowagie.text.Rectangle;
+import com.lowagie.text.Row;
+import com.lowagie.text.Section;
+import com.lowagie.text.Table;
+import com.lowagie.text.TextElementArray;
+import com.lowagie.text.html.HtmlTagMap;
+import com.lowagie.text.pdf.BaseFont;
+
+/**
+ * This class is a Handler that controls the iText XML to PDF conversion.
+ * Subclass it, if you want to change the way iText translates XML to PDF.
+ */
+
+public class SAXiTextHandler extends DefaultHandler {
+
+ /** This is the resulting document. */
+ protected DocListener document;
+
+ /**
+ * This is a <CODE>Stack</CODE> of objects, waiting to be added to the
+ * document.
+ */
+ protected Stack stack;
+
+ /** Counts the number of chapters in this document. */
+ protected int chapters = 0;
+
+ /** This is the current chunk to which characters can be added. */
+ protected Chunk currentChunk = null;
+
+ /** This is the current chunk to which characters can be added. */
+ protected boolean ignore = false;
+
+ /**
+ * This is a flag that can be set, if you want to open and close the
+ * Document-object yourself.
+ */
+ protected boolean controlOpenClose = true;
+
+ /** current margin of a page. */
+ float topMargin = 36;
+
+ /** current margin of a page. */
+ float rightMargin = 36;
+
+ /** current margin of a page. */
+ float leftMargin = 36;
+
+ /** current margin of a page. */
+ float bottomMargin = 36;
+
+ /**
+ * @param document
+ * @throws IOException
+ */
+ public SAXiTextHandler(DocListener document)
+ throws IOException {
+ super();
+ this.document = document;
+ stack = new Stack();
+ }
+
+ protected HashMap myTags;
+
+ /**
+ * @param document
+ * @param myTags
+ * @throws IOException
+ */
+ public SAXiTextHandler(DocListener document, HtmlTagMap myTags)
+ throws IOException {
+ this(document);
+ this.myTags = myTags;
+ }
+
+ /**
+ * @param document
+ * @param myTags
+ * @param bf
+ * @throws IOException
+ */
+ public SAXiTextHandler(DocListener document, HtmlTagMap myTags,
+ BaseFont bf) throws IOException {
+ this(document, myTags);
+ this.bf = bf;
+ }
+
+ /**
+ * @param document
+ * @param myTags
+ * @throws IOException
+ */
+ public SAXiTextHandler(DocListener document, HashMap myTags)
+ throws IOException {
+ this(document);
+ this.myTags = myTags;
+ }
+
+ /**
+ * Sets the parameter that allows you to enable/disable the control over the
+ * Document.open() and Document.close() method.
+ * <P>
+ * If you set this parameter to true (= default), the parser will open the
+ * Document object when the start-root-tag is encounterd and close it when
+ * the end-root-tag is met. If you set it to false, you have to open and
+ * close the Document object yourself.
+ *
+ * @param controlOpenClose
+ * set this to false if you plan to open/close the Document
+ * yourself
+ */
+
+ public void setControlOpenClose(boolean controlOpenClose) {
+ this.controlOpenClose = controlOpenClose;
+ }
+
+ /**
+ * This method gets called when a start tag is encountered.
+ *
+ * @param uri
+ * the Uniform Resource Identifier
+ * @param lname
+ * the local name (without prefix), or the empty string if
+ * Namespace processing is not being performed.
+ * @param name
+ * the name of the tag that is encountered
+ * @param attrs
+ * the list of attributes
+ */
+
+ public void startElement(String uri, String lname, String name,
+ Attributes attrs) {
+
+ Properties attributes = new Properties();
+ if (attrs != null) {
+ for (int i = 0; i < attrs.getLength(); i++) {
+ String attribute = attrs.getQName(i);
+ attributes.setProperty(attribute, attrs.getValue(i));
+ }
+ }
+ handleStartingTags(name, attributes);
+ }
+
+ /**
+ * This method deals with the starting tags.
+ *
+ * @param name
+ * the name of the tag
+ * @param attributes
+ * the list of attributes
+ */
+
+ public void handleStartingTags(String name, Properties attributes) {
+ // System.err.println("Start: " + name);
+ if (ignore || ElementTags.IGNORE.equals(name)) {
+ ignore = true;
+ return;
+ }
+
+ // maybe there is some meaningful data that wasn't between tags
+ if (currentChunk != null) {
+ TextElementArray current;
+ try {
+ current = (TextElementArray) stack.pop();
+ } catch (EmptyStackException ese) {
+ if (bf == null) {
+ current = new Paragraph("", new Font());
+ }
+ else {
+ current = new Paragraph("", new Font(this.bf));
+ }
+ }
+ current.add(currentChunk);
+ stack.push(current);
+ currentChunk = null;
+ }
+
+ // chunks
+ if (Chunk.isTag(name)) {
+ currentChunk = new Chunk(attributes);
+ if (bf != null) {
+ currentChunk.setFont(new Font(this.bf));
+ }
+ return;
+ }
+
+ // symbols
+ if (Entities.isTag(name)) {
+ Font f = new Font();
+ if (currentChunk != null) {
+ handleEndingTags(ElementTags.CHUNK);
+ f = currentChunk.font();
+ }
+ currentChunk = Entities.get(attributes.getProperty(ElementTags.ID),
+ f);
+ return;
+ }
+
+ // phrases
+ if (Phrase.isTag(name)) {
+ stack.push(new Phrase(attributes));
+ return;
+ }
+
+ // anchors
+ if (Anchor.isTag(name)) {
+ stack.push(new Anchor(attributes));
+ return;
+ }
+
+ // paragraphs and titles
+ if (Paragraph.isTag(name) || Section.isTitle(name)) {
+ stack.push(new Paragraph(attributes));
+ return;
+ }
+
+ // lists
+ if (List.isTag(name)) {
+ stack.push(new List(attributes));
+ return;
+ }
+
+ // listitems
+ if (ListItem.isTag(name)) {
+ stack.push(new ListItem(attributes));
+ return;
+ }
+
+ // cells
+ if (Cell.isTag(name)) {
+ stack.push(new Cell(attributes));
+ return;
+ }
+
+ // tables
+ if (Table.isTag(name)) {
+ Table table = new Table(attributes);
+ float widths[] = table.getProportionalWidths();
+ for (int i = 0; i < widths.length; i++) {
+ if (widths[i] == 0) {
+ widths[i] = 100.0f / (float) widths.length;
+ }
+ }
+ try {
+ table.setWidths(widths);
+ } catch (BadElementException bee) {
+ // this shouldn't happen
+ throw new ExceptionConverter(bee);
+ }
+ stack.push(table);
+ return;
+ }
+
+ // sections
+ if (Section.isTag(name)) {
+ Element previous = (Element) stack.pop();
+ Section section;
+ try {
+ section = ((Section) previous).addSection(attributes);
+ } catch (ClassCastException cce) {
+ throw new ExceptionConverter(cce);
+ }
+ stack.push(previous);
+ stack.push(section);
+ return;
+ }
+
+ // chapters
+ if (Chapter.isTag(name)) {
+ String value; // changed after a suggestion by Serge S. Vasiljev
+ if ((value = (String) attributes.remove(ElementTags.NUMBER)) != null) {
+ chapters = Integer.parseInt(value);
+ } else {
+ chapters++;
+ }
+ Chapter chapter = new Chapter(attributes, chapters);
+ stack.push(chapter);
+ return;
+ }
+
+ // images
+ if (Image.isTag(name)) {
+ try {
+ Image img = Image.getInstance(attributes);
+ Object current;
+ try {
+ // if there is an element on the stack...
+ current = stack.pop();
+ // ...and it's a Chapter or a Section, the Image can be
+ // added directly
+ if (current instanceof Chapter
+ || current instanceof Section
+ || current instanceof Cell) {
+ ((TextElementArray) current).add(img);
+ stack.push(current);
+ return;
+ }
+ // ...if not, the Image is wrapped in a Chunk before it's
+ // added
+ else {
+ Stack newStack = new Stack();
+ try {
+ while (!(current instanceof Chapter
+ || current instanceof Section || current instanceof Cell)) {
+ newStack.push(current);
+ if (current instanceof Anchor) {
+ img.setAnnotation(new Annotation(0, 0, 0,
+ 0, ((Anchor) current).reference()));
+ }
+ current = stack.pop();
+ }
+ ((TextElementArray) current).add(img);
+ stack.push(current);
+ } catch (EmptyStackException ese) {
+ document.add(img);
+ }
+ while (!newStack.empty()) {
+ stack.push(newStack.pop());
+ }
+ return;
+ }
+ } catch (EmptyStackException ese) {
+ // if there is no element on the stack, the Image is added
+ // to the document
+ try {
+ document.add(img);
+ } catch (DocumentException de) {
+ throw new ExceptionConverter(de);
+ }
+ return;
+ }
+ } catch (Exception e) {
+ throw new ExceptionConverter(e);
+ }
+ }
+
+ // annotations
+ if (Annotation.isTag(name)) {
+ Annotation annotation = new Annotation(attributes);
+ TextElementArray current;
+ try {
+ try {
+ current = (TextElementArray) stack.pop();
+ try {
+ current.add(annotation);
+ } catch (Exception e) {
+ document.add(annotation);
+ }
+ stack.push(current);
+ } catch (EmptyStackException ese) {
+ document.add(annotation);
+ }
+ return;
+ } catch (DocumentException de) {
+ throw new ExceptionConverter(de);
+ }
+ }
+
+ // newlines
+ if (isNewline(name)) {
+ TextElementArray current;
+ try {
+ current = (TextElementArray) stack.pop();
+ current.add(Chunk.NEWLINE);
+ stack.push(current);
+ } catch (EmptyStackException ese) {
+ if (currentChunk == null) {
+ try {
+ document.add(Chunk.NEWLINE);
+ } catch (DocumentException de) {
+ throw new ExceptionConverter(de);
+ }
+ } else {
+ currentChunk.append("\n");
+ }
+ }
+ return;
+ }
+
+ // newpage
+ if (isNewpage(name)) {
+ TextElementArray current;
+ try {
+ current = (TextElementArray) stack.pop();
+ Chunk newPage = new Chunk("");
+ newPage.setNewPage();
+ if (bf != null) {
+ newPage.setFont(new Font(this.bf));
+ }
+ current.add(newPage);
+ stack.push(current);
+ } catch (EmptyStackException ese) {
+ try {
+ document.newPage();
+ } catch (DocumentException de) {
+ throw new ExceptionConverter(de);
+ }
+ }
+ return;
+ }
+
+ // newpage
+ if (ElementTags.HORIZONTALRULE.equals(name)) {
+ TextElementArray current;
+ Graphic hr = new Graphic();
+ hr.setHorizontalLine(1.0f, 100.0f);
+ try {
+ current = (TextElementArray) stack.pop();
+ current.add(hr);
+ stack.push(current);
+ } catch (EmptyStackException ese) {
+ try {
+ document.add(hr);
+ } catch (DocumentException de) {
+ throw new ExceptionConverter(de);
+ }
+ }
+ return;
+ }
+
+ // documentroot
+ if (isDocumentRoot(name)) {
+ String key;
+ String value;
+ // pagesize and orientation specific code suggested by Samuel Gabriel
+ // Updated by Ricardo Coutinho. Only use if set in html!
+ Rectangle pageSize = null;
+ String orientation = null;
+ for (Iterator i = attributes.keySet().iterator(); i.hasNext();) {
+ key = (String) i.next();
+ value = attributes.getProperty(key);
+ try {
+ // margin specific code suggested by Reza Nasiri
+ if (ElementTags.LEFT.equalsIgnoreCase(key))
+ leftMargin = Float.valueOf(value + "f").floatValue();
+ if (ElementTags.RIGHT.equalsIgnoreCase(key))
+ rightMargin = Float.valueOf(value + "f").floatValue();
+ if (ElementTags.TOP.equalsIgnoreCase(key))
+ topMargin = Float.valueOf(value + "f").floatValue();
+ if (ElementTags.BOTTOM.equalsIgnoreCase(key))
+ bottomMargin = Float.valueOf(value + "f").floatValue();
+ } catch (Exception ex) {
+ throw new ExceptionConverter(ex);
+ }
+ if (ElementTags.PAGE_SIZE.equals(key)) {
+ try {
+ String pageSizeName = value;
+ Field pageSizeField = PageSize.class
+ .getField(pageSizeName);
+ pageSize = (Rectangle) pageSizeField.get(null);
+ } catch (Exception ex) {
+ throw new ExceptionConverter(ex);
+ }
+ } else if (ElementTags.ORIENTATION.equals(key)) {
+ try {
+ String pageSizeName = value;
+ if ("landscape".equals(value)) {
+ orientation = "landscape";
+ }
+ } catch (Exception ex) {
+ throw new ExceptionConverter(ex);
+ }
+ } else {
+ try {
+ document.add(new Meta(key, value));
+ } catch (DocumentException de) {
+ throw new ExceptionConverter(de);
+ }
+ }
+ }
+ if(pageSize != null) {
+ if ("landscape".equals(orientation)) {
+ pageSize = pageSize.rotate();
+ }
+ document.setPageSize(pageSize);
+ }
+ document.setMargins(leftMargin, rightMargin, topMargin,
+ bottomMargin);
+
+ if (controlOpenClose)
+ document.open();
+ }
+
+ }
+
+ /**
+ * This method gets called when ignorable white space encountered.
+ *
+ * @param ch
+ * an array of characters
+ * @param start
+ * the start position in the array
+ * @param length
+ * the number of characters to read from the array
+ */
+
+ public void ignorableWhitespace(char[] ch, int start, int length) {
+ // do nothing: we handle white space ourselves in the characters method
+ }
+
+ /**
+ * This method gets called when characters are encountered.
+ *
+ * @param ch
+ * an array of characters
+ * @param start
+ * the start position in the array
+ * @param length
+ * the number of characters to read from the array
+ */
+
+ public void characters(char[] ch, int start, int length) {
+
+ if (ignore)
+ return;
+
+ String content = new String(ch, start, length);
+ // System.err.println("'" + content + "'");
+
+ if (content.trim().length() == 0) {
+ return;
+ }
+
+ StringBuffer buf = new StringBuffer();
+ int len = content.length();
+ char character;
+ boolean newline = false;
+ for (int i = 0; i < len; i++) {
+ switch (character = content.charAt(i)) {
+ case ' ':
+ if (!newline) {
+ buf.append(character);
+ }
+ break;
+ case '\n':
+ if (i > 0) {
+ newline = true;
+ buf.append(' ');
+ }
+ break;
+ case '\r':
+ break;
+ case '\t':
+ break;
+ default:
+ newline = false;
+ buf.append(character);
+ }
+ }
+ if (currentChunk == null) {
+ if (bf == null) {
+ currentChunk = new Chunk(buf.toString());
+ }
+ else {
+ currentChunk = new Chunk(buf.toString(), new Font(this.bf));
+ }
+ } else {
+ currentChunk.append(buf.toString());
+ }
+ }
+
+ private BaseFont bf = null;
+
+ /**
+ * Sets the font that has to be used.
+ * @param bf
+ */
+ public void setBaseFont(BaseFont bf) {
+ this.bf = bf;
+ }
+
+ /**
+ * This method gets called when an end tag is encountered.
+ *
+ * @param uri
+ * the Uniform Resource Identifier
+ * @param lname
+ * the local name (without prefix), or the empty string if
+ * Namespace processing is not being performed.
+ * @param name
+ * the name of the tag that ends
+ */
+
+ public void endElement(String uri, String lname, String name) {
+ handleEndingTags(name);
+ }
+
+ /**
+ * This method deals with the starting tags.
+ *
+ * @param name
+ * the name of the tag
+ */
+
+ public void handleEndingTags(String name) {
+
+ // System.err.println("Stop: " + name);
+
+ if (ElementTags.IGNORE.equals(name)) {
+ ignore = false;
+ return;
+ }
+ if (ignore)
+ return;
+ // tags that don't have any content
+ if (isNewpage(name) || Annotation.isTag(name) || Image.isTag(name)
+ || isNewline(name)) {
+ return;
+ }
+
+ try {
+ // titles of sections and chapters
+ if (Section.isTitle(name)) {
+ Paragraph current = (Paragraph) stack.pop();
+ if (currentChunk != null) {
+ current.add(currentChunk);
+ currentChunk = null;
+ }
+ Section previous = (Section) stack.pop();
+ previous.setTitle(current);
+ stack.push(previous);
+ return;
+ }
+
+ // all other endtags
+ if (currentChunk != null) {
+ TextElementArray current;
+ try {
+ current = (TextElementArray) stack.pop();
+ } catch (EmptyStackException ese) {
+ current = new Paragraph();
+ }
+ current.add(currentChunk);
+ stack.push(current);
+ currentChunk = null;
+ }
+
+ // chunks
+ if (Chunk.isTag(name)) {
+ return;
+ }
+
+ // phrases, anchors, lists, tables
+ if (Phrase.isTag(name) || Anchor.isTag(name) || List.isTag(name)
+ || Paragraph.isTag(name)) {
+ Element current = (Element) stack.pop();
+ try {
+ TextElementArray previous = (TextElementArray) stack.pop();
+ previous.add(current);
+ stack.push(previous);
+ } catch (EmptyStackException ese) {
+ document.add(current);
+ }
+ return;
+ }
+
+ // listitems
+ if (ListItem.isTag(name)) {
+ ListItem listItem = (ListItem) stack.pop();
+ List list = (List) stack.pop();
+ list.add(listItem);
+ stack.push(list);
+ }
+
+ // tables
+ if (Table.isTag(name)) {
+ Table table = (Table) stack.pop();
+ try {
+ TextElementArray previous = (TextElementArray) stack.pop();
+ previous.add(table);
+ stack.push(previous);
+ } catch (EmptyStackException ese) {
+ document.add(table);
+ }
+ return;
+ }
+
+ // rows
+ if (Row.isTag(name)) {
+ ArrayList cells = new ArrayList();
+ int columns = 0;
+ Table table;
+ Cell cell;
+ while (true) {
+ Element element = (Element) stack.pop();
+ if (element.type() == Element.CELL) {
+ cell = (Cell) element;
+ columns += cell.colspan();
+ cells.add(cell);
+ } else {
+ table = (Table) element;
+ break;
+ }
+ }
+ if (table.columns() < columns) {
+ table.addColumns(columns - table.columns());
+ }
+ Collections.reverse(cells);
+ String width;
+ float[] cellWidths = new float[columns];
+ boolean[] cellNulls = new boolean[columns];
+ for (int i = 0; i < columns; i++) {
+ cellWidths[i] = 0;
+ cellNulls[i] = true;
+ }
+ float total = 0;
+ int j = 0;
+ for (Iterator i = cells.iterator(); i.hasNext();) {
+ cell = (Cell) i.next();
+ if ((width = cell.cellWidth()) == null) {
+ if (cell.colspan() == 1 && cellWidths[j] == 0) {
+ try {
+ cellWidths[j] = 100f / columns;
+ total += cellWidths[j];
+ } catch (Exception e) {
+ // empty on purpose
+ }
+ } else if (cell.colspan() == 1) {
+ cellNulls[j] = false;
+ }
+ } else if (cell.colspan() == 1 && width.endsWith("%")) {
+ try {
+ cellWidths[j] = Float.valueOf(
+ width.substring(0, width.length() - 1)
+ + "f").floatValue();
+ total += cellWidths[j];
+ } catch (Exception e) {
+ // empty on purpose
+ }
+ }
+ j += cell.colspan();
+ table.addCell(cell);
+ }
+ float widths[] = table.getProportionalWidths();
+ if (widths.length == columns) {
+ float left = 0.0f;
+ for (int i = 0; i < columns; i++) {
+ if (cellNulls[i] && widths[i] != 0) {
+ left += widths[i];
+ cellWidths[i] = widths[i];
+ }
+ }
+ if (100.0 >= total) {
+ for (int i = 0; i < widths.length; i++) {
+ if (cellWidths[i] == 0 && widths[i] != 0) {
+ cellWidths[i] = (widths[i] / left)
+ * (100.0f - total);
+ }
+ }
+ }
+ table.setWidths(cellWidths);
+ }
+ stack.push(table);
+ }
+
+ // cells
+ if (Cell.isTag(name)) {
+ return;
+ }
+
+ // sections
+ if (Section.isTag(name)) {
+ stack.pop();
+ return;
+ }
+
+ // chapters
+ if (Chapter.isTag(name)) {
+ document.add((Element) stack.pop());
+ return;
+ }
+
+ // the documentroot
+ if (isDocumentRoot(name)) {
+ try {
+ while (true) {
+ Element element = (Element) stack.pop();
+ try {
+ TextElementArray previous = (TextElementArray) stack
+ .pop();
+ previous.add(element);
+ stack.push(previous);
+ } catch (EmptyStackException es) {
+ document.add(element);
+ }
+ }
+ } catch (EmptyStackException ese) {
+ // empty on purpose
+ }
+ if (controlOpenClose)
+ document.close();
+ return;
+ }
+ } catch (DocumentException de) {
+ throw new ExceptionConverter(de);
+ }
+ }
+
+ /**
+ * Checks if a certain tag corresponds with the newpage-tag.
+ *
+ * @param tag
+ * a presumed tagname
+ * @return <CODE>true</CODE> or <CODE>false</CODE>
+ */
+
+ private boolean isNewpage(String tag) {
+ return ElementTags.NEWPAGE.equals(tag);
+ }
+
+ /**
+ * Checks if a certain tag corresponds with the newpage-tag.
+ *
+ * @param tag
+ * a presumed tagname
+ * @return <CODE>true</CODE> or <CODE>false</CODE>
+ */
+
+ private boolean isNewline(String tag) {
+ return ElementTags.NEWLINE.equals(tag);
+ }
+
+ /**
+ * Checks if a certain tag corresponds with the roottag.
+ *
+ * @param tag
+ * a presumed tagname
+ * @return <CODE>true</CODE> if <VAR>tag </VAR> equals <CODE>itext
+ * </CODE>,<CODE>false</CODE> otherwise.
+ */
+
+ protected boolean isDocumentRoot(String tag) {
+ return ElementTags.ITEXT.equals(tag);
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/xml/SAXmyHandler.java b/src/main/java/com/lowagie/text/xml/SAXmyHandler.java
new file mode 100644
index 0000000..acfaa83
--- /dev/null
+++ b/src/main/java/com/lowagie/text/xml/SAXmyHandler.java
@@ -0,0 +1,128 @@
+/*
+ * $Id: SAXmyHandler.java,v 1.12 2005/11/29 16:00:17 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2001, 2002 by Bruno Lowagie.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.xml;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Properties;
+
+import org.xml.sax.Attributes;
+
+import com.lowagie.text.*;
+
+/**
+ * The <CODE>Tags</CODE>-class maps several XHTML-tags to iText-objects.
+ */
+
+public class SAXmyHandler extends SAXiTextHandler {
+
+/** This hashmap contains all the custom keys and peers. */
+ protected HashMap myTags;
+
+/**
+ * Constructs a new SAXiTextHandler that will translate all the events
+ * triggered by the parser to actions on the <CODE>Document</CODE>-object.
+ *
+ * @param document this is the document on which events must be triggered
+ * @param myTags a userdefined tagmap
+ * @throws IOException
+ * @throws DocumentException
+ */
+
+ public SAXmyHandler(DocListener document, HashMap myTags) throws DocumentException, IOException {
+ super(document);
+ this.myTags = myTags;
+ }
+
+/**
+ * This method gets called when a start tag is encountered.
+ *
+ * @param uri the Uniform Resource Identifier
+ * @param lname the local name (without prefix), or the empty string if Namespace processing is not being performed.
+ * @param name the name of the tag that is encountered
+ * @param attrs the list of attributes
+ */
+
+ public void startElement(String uri, String lname, String name, Attributes attrs) {
+ if (myTags.containsKey(name)) {
+ XmlPeer peer = (XmlPeer) myTags.get(name);
+ handleStartingTags(peer.getTag(), peer.getAttributes(attrs));
+ }
+ else {
+ Properties attributes = new Properties();
+ if (attrs != null) {
+ for (int i = 0; i < attrs.getLength(); i++) {
+ String attribute = attrs.getQName(i);
+ attributes.setProperty(attribute, attrs.getValue(i));
+ }
+ }
+ handleStartingTags(name, attributes);
+ }
+ }
+
+ /**
+ * This method gets called when an end tag is encountered.
+ *
+ * @param uri the Uniform Resource Identifier
+ * @param lname the local name (without prefix), or the empty string if Namespace processing is not being performed.
+ * @param name the name of the tag that ends
+ */
+
+ public void endElement(String uri, String lname, String name) {
+ if (myTags.containsKey(name)) {
+ XmlPeer peer = (XmlPeer) myTags.get(name);
+ handleEndingTags(peer.getTag());
+ }
+ else {
+ handleEndingTags(name);
+ }
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/xml/TagMap.java b/src/main/java/com/lowagie/text/xml/TagMap.java
new file mode 100644
index 0000000..9eb0cb4
--- /dev/null
+++ b/src/main/java/com/lowagie/text/xml/TagMap.java
@@ -0,0 +1,213 @@
+/*
+ * $Id: TagMap.java,v 1.10 2004/12/14 11:25:42 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2001, 2002 by Bruno Lowagie.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.xml;
+
+import java.util.HashMap;
+
+import org.xml.sax.helpers.DefaultHandler;
+import org.xml.sax.Attributes;
+
+import javax.xml.parsers.SAXParser;
+import javax.xml.parsers.SAXParserFactory;
+
+import java.io.InputStream;
+import org.xml.sax.InputSource;
+
+import com.lowagie.text.*;
+
+/**
+ * The <CODE>Tags</CODE>-class maps several XHTML-tags to iText-objects.
+ */
+
+public class TagMap extends HashMap {
+
+ class AttributeHandler extends DefaultHandler {
+
+/** This is a tag */
+ public static final String TAG = "tag";
+
+/** This is a tag */
+ public static final String ATTRIBUTE = "attribute";
+
+/** This is an attribute */
+ public static final String NAME = "name";
+
+/** This is an attribute */
+ public static final String ALIAS = "alias";
+
+/** This is an attribute */
+ public static final String VALUE = "value";
+
+/** This is an attribute */
+ public static final String CONTENT = "content";
+
+/** This is the tagmap using the AttributeHandler */
+ private HashMap tagMap;
+
+/** This is the current peer. */
+ private XmlPeer currentPeer;
+
+/**
+ * Constructs a new SAXiTextHandler that will translate all the events
+ * triggered by the parser to actions on the <CODE>Document</CODE>-object.
+ *
+ * @param tagMap A Hashmap containing XmlPeer-objects
+ */
+
+ public AttributeHandler(HashMap tagMap) {
+ super();
+ this.tagMap = tagMap;
+ }
+
+/**
+ * This method gets called when a start tag is encountered.
+ *
+ * @param uri the Uniform Resource Identifier
+ * @param lname the local name (without prefix), or the empty string if Namespace processing is not being performed.
+ * @param tag the name of the tag that is encountered
+ * @param attrs the list of attributes
+ */
+
+ public void startElement(String uri, String lname, String tag, Attributes attrs) {
+ String name = attrs.getValue(NAME);
+ String alias = attrs.getValue(ALIAS);
+ String value = attrs.getValue(VALUE);
+ if (name != null) {
+ if(TAG.equals(tag)) {
+ currentPeer = new XmlPeer(name, alias);
+ }
+ else if (ATTRIBUTE.equals(tag)) {
+ if (alias != null) {
+ currentPeer.addAlias(name, alias);
+ }
+ if (value != null) {
+ currentPeer.addValue(name, value);
+ }
+ }
+ }
+ value = attrs.getValue(CONTENT);
+ if (value != null) {
+ currentPeer.setContent(value);
+ }
+ }
+
+/**
+ * This method gets called when ignorable white space encountered.
+ *
+ * @param ch an array of characters
+ * @param start the start position in the array
+ * @param length the number of characters to read from the array
+ */
+
+ public void ignorableWhitespace(char[] ch, int start, int length) {
+ // do nothing
+ }
+
+/**
+ * This method gets called when characters are encountered.
+ *
+ * @param ch an array of characters
+ * @param start the start position in the array
+ * @param length the number of characters to read from the array
+ */
+
+ public void characters(char[] ch, int start, int length) {
+ // do nothing
+ }
+
+/**
+ * This method gets called when an end tag is encountered.
+ *
+ * @param uri the Uniform Resource Identifier
+ * @param lname the local name (without prefix), or the empty string if Namespace processing is not being performed.
+ * @param tag the name of the tag that ends
+ */
+
+ public void endElement(String uri, String lname, String tag) {
+ if (TAG.equals(tag))
+ tagMap.put(currentPeer.getAlias(), currentPeer);
+ }
+ }
+
+ /**
+ * Constructs a TagMap
+ * @param tagfile the path to an XML file with the tagmap
+ */
+ public TagMap(String tagfile) {
+ super();
+ try {
+ init(TagMap.class.getClassLoader().getResourceAsStream(tagfile));
+ }catch(Exception e) {
+ throw new ExceptionConverter(e);
+ }
+ }
+
+ /**
+ * Constructs a TagMap.
+ * @param in An InputStream with the tagmap xml
+ */
+ public TagMap(InputStream in) {
+ super();
+ init(in);
+ }
+
+ protected void init(InputStream in) {
+ try {
+ SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
+ parser.parse(new InputSource(in), new AttributeHandler(this));
+ }
+ catch(Exception e) {
+ throw new ExceptionConverter(e);
+ }
+ }
+
+
+}
diff --git a/src/main/java/com/lowagie/text/xml/XmlParser.java b/src/main/java/com/lowagie/text/xml/XmlParser.java
new file mode 100644
index 0000000..adc2695
--- /dev/null
+++ b/src/main/java/com/lowagie/text/xml/XmlParser.java
@@ -0,0 +1,379 @@
+/*
+ * $Id: XmlParser.java,v 1.16 2005/12/06 10:23:08 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2001, 2002 by Bruno Lowagie.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.xml;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.Reader;
+import java.util.HashMap;
+
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+
+import javax.xml.parsers.SAXParser;
+import javax.xml.parsers.SAXParserFactory;
+import javax.xml.parsers.ParserConfigurationException;
+
+import com.lowagie.text.DocListener;
+import com.lowagie.text.DocumentException;
+import com.lowagie.text.ExceptionConverter;
+
+/**
+ * This class can be used to parse an XML file.
+ */
+
+public class XmlParser {
+
+/** This is the instance of the parser. */
+ protected SAXParser parser;
+
+/**
+ * Constructs an XmlParser.
+ */
+
+ public XmlParser() {
+ try {
+ parser = SAXParserFactory.newInstance().newSAXParser();
+ }
+ catch(ParserConfigurationException pce) {
+ throw new ExceptionConverter(pce);
+ }
+ catch(SAXException se) {
+ throw new ExceptionConverter(se);
+ }
+ }
+
+/**
+ * Parses a given file.
+ * @param document The document that will listen to the parser
+ * @param is The InputStream with the contents
+ */
+
+ public void go(DocListener document, InputSource is) {
+ try {
+ parser.parse(is, new SAXiTextHandler(document));
+ }
+ catch(SAXException se) {
+ throw new ExceptionConverter(se);
+ }
+ catch(IOException ioe) {
+ throw new ExceptionConverter(ioe);
+ }
+ }
+
+/**
+ * Parses a given file.
+ * @param document The document that will listen to the parser
+ * @param is The inputsource with the content
+ * @param tagmap A userdefined tagmap
+ */
+
+ public void go(DocListener document, InputSource is, String tagmap) {
+ try {
+ parser.parse(is, new SAXmyHandler(document, new TagMap(tagmap)));
+ }
+ catch(SAXException se) {
+ throw new ExceptionConverter(se);
+ }
+ catch(IOException ioe) {
+ throw new ExceptionConverter(ioe);
+ }
+ catch(DocumentException de) {
+ throw new ExceptionConverter(de);
+ }
+ }
+
+ /**
+ * Parses a given file.
+ * @param document The document that will listen to the parser
+ * @param is the inputsource with the content
+ * @param tagmap an inputstream to a userdefined tagmap
+ */
+
+ public void go(DocListener document, InputSource is, InputStream tagmap) {
+ try {
+ parser.parse(is, new SAXmyHandler(document, new TagMap(tagmap)));
+ }
+ catch(SAXException se) {
+ throw new ExceptionConverter(se);
+ }
+ catch(IOException ioe) {
+ throw new ExceptionConverter(ioe);
+ }
+ catch(DocumentException de) {
+ throw new ExceptionConverter(de);
+ }
+ }
+
+/**
+ * Parses a given file.
+ * @param document The document that will listen to the parser
+ * @param is the inputsource with the content
+ * @param tagmap a userdefined tagmap
+ */
+
+ public void go(DocListener document, InputSource is, HashMap tagmap) {
+ try {
+ parser.parse(is, new SAXmyHandler(document, tagmap));
+ }
+ catch(SAXException se) {
+ throw new ExceptionConverter(se);
+ }
+ catch(IOException ioe) {
+ throw new ExceptionConverter(ioe);
+ }
+ catch(DocumentException de) {
+ throw new ExceptionConverter(de);
+ }
+ }
+
+/**
+ * Parses a given file.
+ * @param document The document that will listen to the parser
+ * @param file The path to a file with the content
+ */
+
+ public void go(DocListener document, String file) {
+ try {
+ parser.parse(file, new SAXiTextHandler(document));
+ }
+ catch(SAXException se) {
+ throw new ExceptionConverter(se);
+ }
+ catch(IOException ioe) {
+ throw new ExceptionConverter(ioe);
+ }
+ }
+
+/**
+ * Parses a given file.
+ * @param document the document that will listen to the parser
+ * @param file the path to a file with the content
+ * @param tagmap a userdefined tagmap
+ */
+
+ public void go(DocListener document, String file, String tagmap) {
+ try {
+ parser.parse(file, new SAXmyHandler(document, new TagMap(tagmap)));
+ }
+ catch(SAXException se) {
+ throw new ExceptionConverter(se);
+ }
+ catch(IOException ioe) {
+ throw new ExceptionConverter(ioe);
+ }
+ catch(DocumentException de) {
+ throw new ExceptionConverter(de);
+ }
+ }
+
+/**
+ * Parses a given file.
+ * @param document The document that will listen to the parser
+ * @param file the path to a file with the content
+ * @param tagmap a userdefined tagmap
+ */
+
+ public void go(DocListener document, String file, HashMap tagmap) {
+ try {
+ parser.parse(file, new SAXmyHandler(document, tagmap));
+ }
+ catch(SAXException se) {
+ throw new ExceptionConverter(se);
+ }
+ catch(IOException ioe) {
+ throw new ExceptionConverter(ioe);
+ }
+ catch(DocumentException de) {
+ throw new ExceptionConverter(de);
+ }
+ }
+
+/**
+ * Parses a given file that validates with the iText DTD and writes the content to a document.
+ * @param document The document that will listen to the parser
+ * @param is the inputsource with the content
+ */
+
+ public static void parse(DocListener document, InputSource is) {
+ XmlParser p = new XmlParser();
+ p.go(document, is);
+ }
+
+/**
+ * Parses a given file that validates with the iText DTD and writes the content to a document.
+ * @param document The document that will listen to the parser
+ * @param is The inputsource with the content
+ * @param tagmap a userdefined tagmap
+ */
+
+ public static void parse(DocListener document, InputSource is, String tagmap) {
+ XmlParser p = new XmlParser();
+ p.go(document, is, tagmap);
+ }
+
+/**
+ * Parses a given file and writes the content to a document, using a certain tagmap.
+ * @param document The document that will listen to the parser
+ * @param is The inputsource with the content
+ * @param tagmap a userdefined tagmap
+ */
+
+ public static void parse(DocListener document, InputSource is, HashMap tagmap) {
+ XmlParser p = new XmlParser();
+ p.go(document, is, tagmap);
+ }
+
+/**
+ * Parses a given file that validates with the iText DTD and writes the content to a document.
+ * @param document The document that will listen to the parser
+ * @param file The path to a file with the content
+ */
+
+ public static void parse(DocListener document, String file) {
+ XmlParser p = new XmlParser();
+ p.go(document, file);
+ }
+
+/**
+ * Parses a given file that validates with the iText DTD and writes the content to a document.
+ * @param document The document that will listen to the parser
+ * @param file The path to a file with the content
+ * @param tagmap A userdefined tagmap
+ */
+
+ public static void parse(DocListener document, String file, String tagmap) {
+ XmlParser p = new XmlParser();
+ p.go(document, file, tagmap);
+ }
+
+/**
+ * Parses a given file and writes the content to a document, using a certain tagmap.
+ * @param document The document that will listen to the parser
+ * @param file The path to a file with the content
+ * @param tagmap A userdefined tagmap
+ */
+
+ public static void parse(DocListener document, String file, HashMap tagmap) {
+ XmlParser p = new XmlParser();
+ p.go(document, file, tagmap);
+ }
+
+/**
+ * Parses a given file that validates with the iText DTD and writes the content to a document.
+ * @param document The document that will listen to the parser
+ * @param is The inputsource with the content
+ */
+
+ public static void parse(DocListener document, InputStream is) {
+ XmlParser p = new XmlParser();
+ p.go(document, new InputSource(is));
+ }
+
+/**
+ * Parses a given file that validates with the iText DTD and writes the content to a document.
+ * @param document The document that will listen to the parser
+ * @param is The inputstream with the content
+ * @param tagmap A userdefined tagmap
+ */
+
+ public static void parse(DocListener document, InputStream is, String tagmap) {
+ XmlParser p = new XmlParser();
+ p.go(document, new InputSource(is), tagmap);
+ }
+
+/**
+ * Parses a given file and writes the content to a document, using a certain tagmap.
+ * @param document The document that will listen to the parser
+ * @param is The InputStream with the content
+ * @param tagmap A userdefined tagmap
+ */
+
+ public static void parse(DocListener document, InputStream is, HashMap tagmap) {
+ XmlParser p = new XmlParser();
+ p.go(document, new InputSource(is), tagmap);
+ }
+
+/**
+ * Parses a given file that validates with the iText DTD and writes the content to a document.
+ * @param document The document that will listen to the parser
+ * @param is The reader that reads the content
+ */
+
+ public static void parse(DocListener document, Reader is) {
+ XmlParser p = new XmlParser();
+ p.go(document, new InputSource(is));
+ }
+
+/**
+ * Parses a given file that validates with the iText DTD and writes the content to a document.
+ * @param document The document that will listen to the parser
+ * @param is The reader that reads the content
+ * @param tagmap A userdefined tagmap
+ */
+
+ public static void parse(DocListener document, Reader is, String tagmap) {
+ XmlParser p = new XmlParser();
+ p.go(document, new InputSource(is), tagmap);
+ }
+
+/**
+ * Parses a given file and writes the content to a document, using a certain tagmap.
+ * @param document The document that will listen to the parser
+ * @param is The reader that reads the content
+ * @param tagmap A userdefined tagmap
+ */
+
+ public static void parse(DocListener document, Reader is, HashMap tagmap) {
+ XmlParser p = new XmlParser();
+ p.go(document, new InputSource(is), tagmap);
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/xml/XmlPeer.java b/src/main/java/com/lowagie/text/xml/XmlPeer.java
new file mode 100644
index 0000000..5ca16a5
--- /dev/null
+++ b/src/main/java/com/lowagie/text/xml/XmlPeer.java
@@ -0,0 +1,182 @@
+/*
+ * $Id: XmlPeer.java,v 1.13 2004/12/14 11:25:42 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2001, 2002 by Bruno Lowagie.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.xml;
+
+import java.util.Properties;
+import org.xml.sax.Attributes;
+
+import com.lowagie.text.ElementTags;
+
+/**
+ * This interface is implemented by the peer of all the iText objects.
+ */
+
+public class XmlPeer {
+
+/** This is the name of the alias. */
+ protected String tagname;
+
+/** This is the name of the alias. */
+ protected String customTagname;
+
+/** This is the Map that contains the aliases of the attributes. */
+ protected Properties attributeAliases = new Properties();
+
+/** This is the Map that contains the default values of the attributes. */
+ protected Properties attributeValues = new Properties();
+
+/** This is String that contains the default content of the attributes. */
+ protected String defaultContent = null;
+
+/**
+ * Creates a XmlPeer.
+ * @param name the iText name of a tag
+ * @param alias the userdefined name of a tag
+ */
+
+ public XmlPeer(String name, String alias) {
+ this.tagname = name;
+ this.customTagname = alias;
+ }
+
+/**
+ * Gets the tagname of the peer.
+ * @return the iText name of a tag
+ */
+
+ public String getTag() {
+ return tagname;
+ }
+
+/**
+ * Gets the tagname of the peer.
+ * @return the userdefined tagname
+ */
+
+ public String getAlias() {
+ return customTagname;
+ }
+
+/** Gets the list of attributes of the peer.
+ * @param attrs the userdefined set of attributes
+ * @return the set of attributes translated to iText attributes
+ */
+ public Properties getAttributes(Attributes attrs) {
+ Properties attributes = new Properties();
+ attributes.putAll(attributeValues);
+ if (defaultContent != null) {
+ attributes.put(ElementTags.ITEXT, defaultContent);
+ }
+ if (attrs != null) {
+ for (int i = 0; i < attrs.getLength(); i++) {
+ String attribute = getName(attrs.getQName(i));
+ attributes.setProperty(attribute, attrs.getValue(i));
+ }
+ }
+ return attributes;
+ }
+
+/**
+ * Sets an alias for an attribute.
+ *
+ * @param name the iText tagname
+ * @param alias the custom tagname
+ */
+
+ public void addAlias(String name, String alias) {
+ attributeAliases.put(alias, name);
+ }
+
+/**
+ * Sets a value for an attribute.
+ *
+ * @param name the iText tagname
+ * @param value the default value for this tag
+ */
+
+ public void addValue(String name, String value) {
+ attributeValues.put(name, value);
+ }
+
+/**
+ * Sets the default content.
+ *
+ * @param content the default content
+ */
+
+ public void setContent(String content) {
+ this.defaultContent = content;
+ }
+
+/**
+ * Returns the iText attribute name.
+ *
+ * @param name the custom attribute name
+ * @return iText translated attribute name
+ */
+
+ public String getName(String name) {
+ String value;
+ if ((value = attributeAliases.getProperty(name)) != null) {
+ return value;
+ }
+ return name;
+ }
+
+/**
+ * Returns the default values.
+ * @return A set of default (userdefined) values
+ */
+
+ public Properties getDefaultValues() {
+ return attributeValues;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/xml/XmlToHtml.java b/src/main/java/com/lowagie/text/xml/XmlToHtml.java
new file mode 100644
index 0000000..e145e57
--- /dev/null
+++ b/src/main/java/com/lowagie/text/xml/XmlToHtml.java
@@ -0,0 +1,144 @@
+/*
+ * Copyright 2002 by Matt Benson.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.xml;
+
+
+import java.io.OutputStream;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+
+import com.lowagie.text.Document;
+import com.lowagie.text.DocumentException;
+import com.lowagie.text.html.HtmlWriter;
+
+
+/**
+ * HTML-specific subclass of <code>XmlToXXX</code>.
+ *
+ * @version 1.0
+ * @author <a href="mailto:orangeherbert@users.sourceforge.net">Matt Benson</a>
+ */
+public class XmlToHtml
+ extends XmlToXXX
+{
+
+/**
+ * Construct an <CODE>XmlToHtml</CODE> with the default page size.
+ */
+ public XmlToHtml()
+ {
+ super();
+ }//end default constructor
+
+
+/**
+ * Construct an <CODE>XmlToHtml</CODE> with the specified page size.
+ * @param pageSize <CODE>String</CODE> page size name from
+ * <CODE>com.lowagie.text.PageSize</CODE>.
+ */
+ public XmlToHtml(String pageSize)
+ {
+ super(pageSize);
+ }//end constructor(String)
+
+
+/**
+ * Add a <CODE>DocWriter</CODE> for the specified <CODE>Document</CODE> and
+ * <CODE>OutputStream</CODE>.
+ * @param doc The document to which content will be added
+ * @param out The outputstream where the HTML will be sent to
+ * @throws DocumentException if document errors occur.
+ */
+ protected final void addWriter(Document doc, OutputStream out)
+ throws DocumentException
+ {
+ HtmlWriter.getInstance(doc, out);
+ }//end addWriter
+
+
+/**
+ * Main method of the <CODE>XmlToHtml</CODE> class.
+ * @param args <CODE>String[]</CODE> of command-line arguments.
+ */
+ public static void main(String[] args)
+ {
+ int code = 0;
+
+ if (args.length > 1)
+ {
+ try
+ {
+ XmlToHtml x;
+ if (args.length > 2)
+ {
+ x = new XmlToHtml(args[2]);
+ }//end if at least 3 args
+ else
+ {
+ x = new XmlToHtml();
+ }//end else, only 2 args
+
+ x.parse(new FileInputStream(args[0]), new FileOutputStream(args[1]));
+ }//end try to do everything
+ catch (Exception ex)
+ {
+ code = 2;
+ ex.printStackTrace(System.err);
+ }//end catch Exception
+ }//end if at least 2 args
+ else
+ {
+ code = 1;
+ System.err.println(
+ "Usage: XmlToHtml [XML file in] [PDF file out] [optional page size]");
+ }//end else, not enough arguments
+
+ System.exit(code);
+ }//end main
+
+}//end class XmlToHtml
diff --git a/src/main/java/com/lowagie/text/xml/XmlToPdf.java b/src/main/java/com/lowagie/text/xml/XmlToPdf.java
new file mode 100644
index 0000000..3965831
--- /dev/null
+++ b/src/main/java/com/lowagie/text/xml/XmlToPdf.java
@@ -0,0 +1,144 @@
+/*
+ * Copyright 2002 by Matt Benson.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.xml;
+
+
+import java.io.OutputStream;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+
+import com.lowagie.text.Document;
+import com.lowagie.text.DocumentException;
+import com.lowagie.text.pdf.PdfWriter;
+
+
+/**
+ * PDF-specific subclass of <code>XmlToXXX</code>.
+ *
+ * @version 1.0
+ * @author <a href="mailto:orangeherbert@users.sourceforge.net">Matt Benson</a>
+ */
+public class XmlToPdf
+ extends XmlToXXX
+{
+
+/**
+ * Construct an <CODE>XmlToPdf</CODE> with the default page size.
+ */
+ public XmlToPdf()
+ {
+ super();
+ }//end default constructor
+
+
+/**
+ * Construct an <CODE>XmlToPdf</CODE> with the specified page size.
+ * @param pageSize <CODE>String</CODE> page size name from
+ * <CODE>com.lowagie.text.PageSize</CODE>.
+ */
+ public XmlToPdf(String pageSize)
+ {
+ super(pageSize);
+ }//end constructor(String)
+
+
+/**
+ * Add a <CODE>DocWriter</CODE> for the specified <CODE>Document</CODE> and
+ * <CODE>OutputStream</CODE>.
+ * @param doc The document to which content will be added
+ * @param out The outputstream to which the PDF will be sent
+ * @throws DocumentException if document errors occur.
+ */
+ protected final void addWriter(Document doc, OutputStream out)
+ throws DocumentException
+ {
+ PdfWriter.getInstance(doc, out);
+ }//end addWriter
+
+
+/**
+ * Main method of the <CODE>XmlToPdf</CODE> class.
+ * @param args <CODE>String[]</CODE> of command-line arguments.
+ */
+ public static void main(String[] args)
+ {
+ int code = 0;
+
+ if (args.length > 1)
+ {
+ try
+ {
+ XmlToPdf x;
+ if (args.length > 2)
+ {
+ x = new XmlToPdf(args[2]);
+ }//end if at least 3 args
+ else
+ {
+ x = new XmlToPdf();
+ }//end else, only 2 args
+
+ x.parse(new FileInputStream(args[0]), new FileOutputStream(args[1]));
+ }//end try to do everything
+ catch (Exception ex)
+ {
+ code = 2;
+ ex.printStackTrace(System.err);
+ }//end catch Exception
+ }//end if at least 2 args
+ else
+ {
+ code = 1;
+ System.err.println(
+ "Usage: XmlToPdf [XML file in] [PDF file out] [optional page size]");
+ }//end else, not enough arguments
+
+ System.exit(code);
+ }//end main
+
+}//end class XmlToPdf
diff --git a/src/main/java/com/lowagie/text/xml/XmlToRtf.java b/src/main/java/com/lowagie/text/xml/XmlToRtf.java
new file mode 100644
index 0000000..d83b4b6
--- /dev/null
+++ b/src/main/java/com/lowagie/text/xml/XmlToRtf.java
@@ -0,0 +1,144 @@
+/*
+ * Copyright 2002 by Matt Benson.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.xml;
+
+
+import java.io.OutputStream;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+
+import com.lowagie.text.Document;
+import com.lowagie.text.DocumentException;
+import com.lowagie.text.rtf.RtfWriter;
+
+
+/**
+ * RTF-specific subclass of <code>XmlToXXX</code>.
+ *
+ * @version 1.0
+ * @author <a href="mailto:orangeherbert@users.sourceforge.net">Matt Benson</a>
+ */
+public class XmlToRtf
+ extends XmlToXXX
+{
+
+/**
+ * Construct an <CODE>XmlToRtf</CODE> with the default page size.
+ */
+ public XmlToRtf()
+ {
+ super();
+ }//end default constructor
+
+
+/**
+ * Construct an <CODE>XmlToRtf</CODE> with the specified page size.
+ * @param pageSize <CODE>String</CODE> page size name from
+ * <CODE>com.lowagie.text.PageSize</CODE>.
+ */
+ public XmlToRtf(String pageSize)
+ {
+ super(pageSize);
+ }//end constructor(String)
+
+
+/**
+ * Add a <CODE>DocWriter</CODE> for the specified <CODE>Document</CODE> and
+ * <CODE>OutputStream</CODE>.
+ * @param doc The document to which content will be added
+ * @param out The outputstream to which RTF will be sent
+ * @throws DocumentException if document errors occur.
+ */
+ protected final void addWriter(Document doc, OutputStream out)
+ throws DocumentException
+ {
+ RtfWriter.getInstance(doc, out);
+ }//end addWriter
+
+
+/**
+ * Main method of the <CODE>XmlToRtf</CODE> class.
+ * @param args <CODE>String[]</CODE> of command-line arguments.
+ */
+ public static void main(String[] args)
+ {
+ int code = 0;
+
+ if (args.length > 1)
+ {
+ try
+ {
+ XmlToRtf x;
+ if (args.length > 2)
+ {
+ x = new XmlToRtf(args[2]);
+ }//end if at least 3 args
+ else
+ {
+ x = new XmlToRtf();
+ }//end else, only 2 args
+
+ x.parse(new FileInputStream(args[0]), new FileOutputStream(args[1]));
+ }//end try to do everything
+ catch (Exception ex)
+ {
+ code = 2;
+ ex.printStackTrace(System.err);
+ }//end catch Exception
+ }//end if at least 2 args
+ else
+ {
+ code = 1;
+ System.err.println(
+ "Usage: XmlToRtf [XML file in] [PDF file out] [optional page size]");
+ }//end else, not enough arguments
+
+ System.exit(code);
+ }//end main
+
+}//end class XmlToRtf
diff --git a/src/main/java/com/lowagie/text/xml/XmlToXXX.java b/src/main/java/com/lowagie/text/xml/XmlToXXX.java
new file mode 100644
index 0000000..016efdd
--- /dev/null
+++ b/src/main/java/com/lowagie/text/xml/XmlToXXX.java
@@ -0,0 +1,147 @@
+/*
+ * Copyright 2002 by Matt Benson.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.xml;
+
+
+import java.lang.reflect.Field;
+import java.lang.reflect.Modifier;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+import com.lowagie.text.Document;
+import com.lowagie.text.PageSize;
+import com.lowagie.text.Rectangle;
+import com.lowagie.text.DocumentException;
+
+
+/**
+ * Generates an specific file from an iText XML file.
+ *
+ * @version 1.0
+ * @author <a href="mailto:orangeherbert@users.sourceforge.net">Matt Benson</a>
+ */
+public abstract class XmlToXXX
+{
+
+ protected Rectangle pageSize;
+
+
+/**
+ * Construct an <CODE>XmlToXXX</CODE> with the default page size.
+ */
+ public XmlToXXX()
+ {
+ this(PageSize.LETTER);
+ }//end default constructor
+
+
+/**
+ * Construct an <CODE>XmlToXXX</CODE> with the specified page size.
+ * @param pageSize <CODE>String</CODE> page size name from
+ * <CODE>com.lowagie.text.PageSize</CODE>.
+ */
+ public XmlToXXX(String pageSize)
+ {
+ this(getPageSize(pageSize));
+ }//end constructor(String)
+
+
+ private XmlToXXX(Rectangle pageSize)
+ {
+ this.pageSize = pageSize;
+ }//end constructor(Rectangle)
+
+
+/**
+ * Parse the XML from the specified <CODE>InputStream</CODE>, writing to the
+ * specified <CODE>OutputStream</CODE>.
+ * @param in the <CODE>InputStream</CODE> from which the XML is read.
+ * @param out the <CODE>OutputStream</CODE> to which the result is written.
+ * @throws DocumentException if document errors occur.
+ */
+ public final void parse(InputStream in, OutputStream out)
+ throws DocumentException
+ {
+ Document doc = new Document(pageSize);
+
+ addWriter(doc, out);
+ XmlParser.parse(doc, in);
+ }//end parse
+
+
+ private static Rectangle getPageSize(String pageSize)
+ {
+ Rectangle result = PageSize.LETTER;
+ Field fld = null;
+ try
+ {
+ fld = PageSize.class.getDeclaredField(pageSize.toUpperCase());
+ result = (fld != null
+ && Modifier.isStatic(fld.getModifiers())
+ && fld.getType().equals(Rectangle.class)) ? (Rectangle)(fld.get(null))
+ : result;
+ }//end try to get field
+ catch (Exception ex)
+ {
+ System.err.println(ex.getMessage());
+ }//end catch Exception
+ return result;
+ }//end getPageSize
+
+
+/**
+ * Add a <CODE>DocWriter</CODE> for the specified <CODE>Document</CODE> and
+ * <CODE>OutputStream</CODE>.
+ * @param doc The document to which content will be added
+ * @param out The outputstream to which the document will be sent
+ * @throws DocumentException if document errors occur.
+ */
+ protected abstract void addWriter(Document doc, OutputStream out)
+ throws DocumentException;
+
+}//end class XmlToXXX
diff --git a/src/main/java/com/lowagie/text/xml/XmlWriter.java b/src/main/java/com/lowagie/text/xml/XmlWriter.java
new file mode 100644
index 0000000..ac3f2d8
--- /dev/null
+++ b/src/main/java/com/lowagie/text/xml/XmlWriter.java
@@ -0,0 +1,893 @@
+/*
+ * $Id: XmlWriter.java,v 1.35 2005/12/09 12:33:25 psoares33 Exp $
+ * $Name: $
+ *
+ * Copyright 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU LIBRARY GENERAL PUBLIC LICENSE for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.xml;
+
+import java.io.OutputStream;
+import java.io.IOException;
+import java.util.Date;
+import java.util.Iterator;
+import java.util.TreeMap;
+import java.util.HashMap;
+
+import com.lowagie.text.*;
+import com.lowagie.text.markup.MarkupTags;
+
+/**
+ * A <CODE>DocWriter</CODE> class for XML (Remark: this class is not finished yet!).
+ * <P>
+ * An <CODE>XmlWriter</CODE> can be added as a <CODE>DocListener</CODE>
+ * to a certain <CODE>Document</CODE> by getting an instance.
+ * Every <CODE>Element</CODE> added to the original <CODE>Document</CODE>
+ * will be written to the <CODE>OutputStream</CODE> of this <CODE>XmlWriter</CODE>.
+ * <P>
+ * Example:
+ * <BLOCKQUOTE><PRE>
+ * // creation of the document with a certain size and certain margins
+ * Document document = new Document(PageSize.A4, 50, 50, 50, 50);
+ * try {
+ * // this will write XML to the Standard OutputStream
+ * <STRONG>XmlWriter.getInstance(document, System.out);</STRONG>
+ * // this will write XML to a file called text.html
+ * <STRONG>XmlWriter.getInstance(document, new FileOutputStream("text.xml"));</STRONG>
+ * // this will write XML to for instance the OutputStream of a HttpServletResponse-object
+ * <STRONG>XmlWriter.getInstance(document, response.getOutputStream());</STRONG>
+ * }
+ * catch(DocumentException de) {
+ * System.err.println(de.getMessage());
+ * }
+ * // this will close the document and all the OutputStreams listening to it
+ * <STRONG>document.close();</CODE>
+ * </PRE></BLOCKQUOTE>
+ */
+
+public class XmlWriter extends DocWriter implements DocListener {
+
+ // static membervariables (tags)
+
+/** This is the first line of the XML page. */
+ public static final byte[] PROLOG = getISOBytes("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n");
+
+/** This is the reference to the DTD. */
+ public static final byte[] DOCTYPE = getISOBytes("<!DOCTYPE ITEXT SYSTEM \"");
+
+/** This is the place where the DTD is located. */
+ public final static byte[] DTD = getISOBytes("http://itext.sourceforge.net/itext.dtd");
+
+/** This is an array containing character to XML translations. */
+ private static final String[] xmlCode = new String[256];
+
+ static {
+ for (int i = 0; i < 10; i++) {
+ xmlCode[i] = "&#00" + i + ";";
+ }
+
+ for (int i = 10; i < 32; i++) {
+ xmlCode[i] = "&#0" + i + ";";
+ }
+
+ for (int i = 32; i < 128; i++) {
+ xmlCode[i] = String.valueOf((char)i);
+ }
+
+ // Special characters
+ xmlCode['\n'] = "<" + ElementTags.NEWLINE + " />\n";
+ xmlCode['\"'] = "&quot;"; // double quote
+ xmlCode['\''] = "&apos;"; // single quote
+ xmlCode['&'] = "&amp;"; // ampersand
+ xmlCode['<'] = "&lt;"; // lower than
+ xmlCode['>'] = "&gt;"; // greater than
+
+ for (int i = 128; i < 256; i++) {
+ xmlCode[i] = "&#" + i + ";";
+ }
+ }
+ // membervariables
+
+/** This is the meta information of the document. */
+ private TreeMap itext = new TreeMap(new com.lowagie.text.StringCompare());
+
+ // constructors
+
+/**
+ * Constructs an <CODE>XmlWriter</CODE>.
+ *
+ * @param doc The <CODE>Document</CODE> that has to be written as XML
+ * @param os The <CODE>OutputStream</CODE> the writer has to write to.
+ */
+
+ protected XmlWriter(Document doc, OutputStream os) {
+ super(doc, os);
+
+ document.addDocListener(this);
+ try {
+ os.write(PROLOG);
+ os.write(DOCTYPE);
+ os.write(DTD);
+ os.write(QUOTE);
+ os.write(GT);
+ os.write(NEWLINE);
+ }
+ catch(IOException ioe) {
+ throw new ExceptionConverter(ioe);
+ }
+ }
+
+/**
+ * Constructs an <CODE>XmlWriter</CODE>.
+ *
+ * @param doc The <CODE>Document</CODE> that has to be written as XML
+ * @param os The <CODE>OutputStream</CODE> the writer has to write to.
+ * @param dtd The DTD to use
+ */
+
+ protected XmlWriter(Document doc, OutputStream os, String dtd) {
+ super(doc, os);
+
+ document.addDocListener(this);
+ try {
+ os.write(PROLOG);
+ os.write(DOCTYPE);
+ os.write(getISOBytes(dtd));
+ os.write(QUOTE);
+ os.write(GT);
+ os.write(NEWLINE);
+ }
+ catch(IOException ioe) {
+ throw new ExceptionConverter(ioe);
+ }
+ }
+
+ // get an instance of the XmlWriter
+
+/**
+ * Gets an instance of the <CODE>XmlWriter</CODE>.
+ *
+ * @param document The <CODE>Document</CODE> that has to be written
+ * @param os The <CODE>OutputStream</CODE> the writer has to write to.
+ * @return a new <CODE>XmlWriter</CODE>
+ */
+
+ public static XmlWriter getInstance(Document document, OutputStream os) {
+ return new XmlWriter(document, os);
+ }
+
+/**
+ * Gets an instance of the <CODE>XmlWriter</CODE>.
+ *
+ * @param document The <CODE>Document</CODE> that has to be written
+ * @param os The <CODE>OutputStream</CODE> the writer has to write to.
+ * @param dtd The DTD to use
+ * @return a new <CODE>XmlWriter</CODE>
+ */
+
+ public static XmlWriter getInstance(Document document, OutputStream os, String dtd) {
+ return new XmlWriter(document, os, dtd);
+ }
+
+ // implementation of the DocListener methods
+
+/**
+ * Signals that an <CODE>Element</CODE> was added to the <CODE>Document</CODE>.
+ *
+ * @param element A high level object that will be added to the XML
+ * @return <CODE>true</CODE> if the element was added, <CODE>false</CODE> if not.
+ * @throws DocumentException when a document isn't open yet, or has been closed
+ */
+
+ public boolean add(Element element) throws DocumentException {
+ if (pause) {
+ return false;
+ }
+ try {
+ switch(element.type()) {
+ case Element.TITLE:
+ itext.put(ElementTags.TITLE, ((Meta)element).content());
+ return true;
+ case Element.SUBJECT:
+ itext.put(ElementTags.SUBJECT, ((Meta)element).content());
+ return true;
+ case Element.KEYWORDS:
+ itext.put(ElementTags.KEYWORDS, ((Meta)element).content());
+ return true;
+ case Element.AUTHOR:
+ itext.put(ElementTags.AUTHOR, ((Meta)element).content());
+ return true;
+ default:
+ write(element, 1);
+ return true;
+ }
+ }
+ catch(IOException ioe) {
+ return false;
+ }
+ }
+
+/**
+ * Signals that the <CODE>Document</CODE> has been opened and that
+ * <CODE>Elements</CODE> can be added.
+ */
+
+ public void open() {
+ super.open();
+ try {
+ itext.put(ElementTags.PRODUCER, "iTextXML by lowagie.com");
+ itext.put(ElementTags.CREATIONDATE, new Date().toString());
+ writeStart(ElementTags.ITEXT);
+ String key;
+ for (java.util.Iterator i = itext.keySet().iterator(); i.hasNext(); ) {
+ key = (String) i.next();
+ write(key, (String) itext.get(key));
+ }
+ os.write(GT);
+ }
+ catch(IOException ioe) {
+ throw new ExceptionConverter(ioe);
+ }
+ }
+
+/**
+ * Signals that an new page has to be LTed.
+ *
+ * @return <CODE>true</CODE> if the page was added, <CODE>false</CODE> if not.
+ * @throws DocumentException when a document isn't open yet, or has been closed
+ */
+
+ public boolean newPage() throws DocumentException {
+ if (pause || !open) {
+ return false;
+ }
+ try {
+ writeStart(ElementTags.NEWPAGE);
+ writeEnd();
+ return true;
+ }
+ catch(IOException ioe) {
+ return false;
+ }
+ }
+
+/**
+ * Signals that the <CODE>Document</CODE> was closed and that no other
+ * <CODE>Elements</CODE> will be added.
+ */
+
+ public void close() {
+ try {
+ os.write(NEWLINE);
+ writeEnd(ElementTags.ITEXT);
+ super.close();
+ }
+ catch(IOException ioe) {
+ throw new ExceptionConverter(ioe);
+ }
+ }
+
+ // methods
+
+/**
+ * Writes the XML representation of an element.
+ *
+ * @param element the element
+ * @param indent the indentation
+ * @throws IOException
+ */
+
+ private void write(Element element, int indent) throws IOException {
+ switch(element.type()) {
+ case Element.CHUNK:
+ {
+ Chunk chunk = (Chunk) element;
+
+ // if the chunk contains an image, return the image representation
+ try {
+ Image image = chunk.getImage();
+ write(image, indent);
+ return;
+ }
+ catch(NullPointerException npe) {
+ // empty on purpose
+ }
+
+ addTabs(indent);
+ HashMap attributes = chunk.getAttributes();
+ if (chunk.font().isStandardFont() && attributes == null && !(hasMarkupAttributes(chunk))) {
+ write(encode(chunk.content(), indent));
+ return;
+ }
+ else {
+ if (attributes != null && attributes.get(Chunk.NEWPAGE) != null) {
+ writeStart(ElementTags.NEWPAGE);
+ writeEnd();
+ return;
+ }
+ writeStart(ElementTags.CHUNK);
+ if (! chunk.font().isStandardFont()) {
+ write(chunk.font());
+ }
+ if (attributes != null) {
+ for (Iterator i = attributes.keySet().iterator(); i.hasNext(); ) {
+ String key = (String) i.next();
+ if (key.equals(Chunk.LOCALGOTO)
+ || key.equals(Chunk.LOCALDESTINATION)
+ || key.equals(Chunk.GENERICTAG)) {
+ String value = (String) attributes.get(key);
+ write(key.toLowerCase(), value);
+ }
+ if (key.equals(Chunk.SUBSUPSCRIPT)) {
+ write(key.toLowerCase(), String.valueOf((Float) attributes.get(key)));
+ }
+ }
+ }
+ if (hasMarkupAttributes(chunk)) {
+ writeMarkupAttributes((MarkupAttributes)chunk);
+ }
+ os.write(GT);
+ write(encode(chunk.content(), indent));
+ writeEnd(ElementTags.CHUNK);
+ }
+ return;
+ }
+ case Element.PHRASE:
+ {
+ Phrase phrase = (Phrase) element;
+
+ addTabs(indent);
+ writeStart(ElementTags.PHRASE);
+
+ write(ElementTags.LEADING, String.valueOf(phrase.leading()));
+ write(phrase.font());
+ if (hasMarkupAttributes(phrase)) {
+ writeMarkupAttributes((MarkupAttributes)phrase);
+ }
+ os.write(GT);
+
+ for (Iterator i = phrase.iterator(); i.hasNext(); ) {
+ write((Element) i.next(), indent + 1);
+ }
+
+ addTabs(indent);
+ writeEnd(ElementTags.PHRASE);
+ return;
+ }
+ case Element.ANCHOR:
+ {
+ Anchor anchor = (Anchor) element;
+
+ addTabs(indent);
+ writeStart(ElementTags.ANCHOR);
+
+ write(ElementTags.LEADING, String.valueOf(anchor.leading()));
+ write(anchor.font());
+ if (anchor.name() != null) {
+ write(ElementTags.NAME, anchor.name());
+ }
+ if (anchor.reference() != null) {
+ write(ElementTags.REFERENCE, anchor.reference());
+ }
+ if (hasMarkupAttributes(anchor)) {
+ writeMarkupAttributes((MarkupAttributes)anchor);
+ }
+ os.write(GT);
+ for (Iterator i = anchor.iterator(); i.hasNext(); ) {
+ write((Element) i.next(), indent + 1);
+ }
+ addTabs(indent);
+ writeEnd(ElementTags.ANCHOR);
+ return;
+ }
+ case Element.PARAGRAPH:
+ {
+ Paragraph paragraph = (Paragraph) element;
+
+ addTabs(indent);
+ writeStart(ElementTags.PARAGRAPH);
+
+ write(ElementTags.LEADING, String.valueOf(paragraph.leading()));
+ write(paragraph.font());
+ write(ElementTags.ALIGN, ElementTags.getAlignment(paragraph.alignment()));
+ if (paragraph.indentationLeft() != 0) {
+ write(ElementTags.INDENTATIONLEFT, String.valueOf(paragraph.indentationLeft()));
+ }
+ if (paragraph.indentationRight() != 0) {
+ write(ElementTags.INDENTATIONRIGHT, String.valueOf(paragraph.indentationRight()));
+ }
+ if (hasMarkupAttributes(paragraph)) {
+ writeMarkupAttributes((MarkupAttributes)paragraph);
+ }
+ os.write(GT);
+ for (Iterator i = paragraph.iterator(); i.hasNext(); ) {
+ write((Element) i.next(), indent + 1);
+ }
+ addTabs(indent);
+ writeEnd(ElementTags.PARAGRAPH);
+ return;
+ }
+ case Element.SECTION:
+ {
+ Section section = (Section) element;
+
+ addTabs(indent);
+ writeStart(ElementTags.SECTION);
+ writeSection(section, indent);
+ writeEnd(ElementTags.SECTION);
+ return;
+ }
+ case Element.CHAPTER:
+ {
+ Chapter chapter = (Chapter) element;
+
+ addTabs(indent);
+ writeStart(ElementTags.CHAPTER);
+ if (hasMarkupAttributes(chapter)) {
+ writeMarkupAttributes((MarkupAttributes)chapter);
+ }
+ writeSection(chapter, indent);
+ writeEnd(ElementTags.CHAPTER);
+ return;
+
+ }
+ case Element.LIST:
+ {
+ List list = (List) element;
+
+ addTabs(indent);
+ writeStart(ElementTags.LIST);
+ write(ElementTags.NUMBERED, String.valueOf(list.isNumbered()));
+ write(ElementTags.SYMBOLINDENT, String.valueOf(list.symbolIndent()));
+ if (list.first() != 1) {
+ write(ElementTags.FIRST, String.valueOf(list.first()));
+ }
+ if (list.indentationLeft() != 0) {
+ write(ElementTags.INDENTATIONLEFT, String.valueOf(list.indentationLeft()));
+ }
+ if (list.indentationRight() != 0) {
+ write(ElementTags.INDENTATIONRIGHT, String.valueOf(list.indentationRight()));
+ }
+ if (!list.isNumbered()) {
+ write(ElementTags.LISTSYMBOL, list.symbol().content());
+ }
+ write(list.symbol().font());
+ if (hasMarkupAttributes(list)) {
+ writeMarkupAttributes((MarkupAttributes)list);
+ }
+ os.write(GT);
+ for (Iterator i = list.getItems().iterator(); i.hasNext(); ) {
+ write((Element) i.next(), indent + 1);
+ }
+ addTabs(indent);
+ writeEnd(ElementTags.LIST);
+ return;
+ }
+ case Element.LISTITEM:
+ {
+ ListItem listItem = (ListItem) element;
+
+ addTabs(indent);
+ writeStart(ElementTags.LISTITEM);
+ write(ElementTags.LEADING, String.valueOf(listItem.leading()));
+ write(listItem.font());
+ write(ElementTags.ALIGN, ElementTags.getAlignment(listItem.alignment()));
+ if (listItem.indentationLeft() != 0) {
+ write(ElementTags.INDENTATIONLEFT, String.valueOf(listItem.indentationLeft()));
+ }
+ if (listItem.indentationRight() != 0) {
+ write(ElementTags.INDENTATIONRIGHT, String.valueOf(listItem.indentationRight()));
+ }
+ if (hasMarkupAttributes(listItem)) {
+ writeMarkupAttributes((MarkupAttributes)listItem);
+ }
+ os.write(GT);
+ for (Iterator i = listItem.iterator(); i.hasNext(); ) {
+ write((Element) i.next(), indent + 1);
+ }
+ addTabs(indent);
+ writeEnd(ElementTags.LISTITEM);
+ return;
+ }
+ case Element.CELL:
+ {
+ Cell cell = (Cell) element;
+
+ addTabs(indent);
+ writeStart(ElementTags.CELL);
+ write((Rectangle) cell);
+ write(ElementTags.HORIZONTALALIGN, ElementTags.getAlignment(cell.horizontalAlignment()));
+ write(ElementTags.VERTICALALIGN, ElementTags.getAlignment(cell.verticalAlignment()));
+ if (cell.cellWidth() != null) {
+ write(ElementTags.WIDTH, cell.cellWidth());
+ }
+ if (cell.colspan() != 1) {
+ write(ElementTags.COLSPAN, String.valueOf(cell.colspan()));
+ }
+ if (cell.rowspan() != 1) {
+ write(ElementTags.ROWSPAN, String.valueOf(cell.rowspan()));
+ }
+ if (cell.header()) {
+ write(ElementTags.HEADER, String.valueOf(true));
+ }
+ if (cell.noWrap()) {
+ write(ElementTags.NOWRAP, String.valueOf(true));
+ }
+ if (cell.leading() != -1) {
+ write(ElementTags.LEADING, String.valueOf(cell.leading()));
+ }
+ if (hasMarkupAttributes(cell)) {
+ writeMarkupAttributes((MarkupAttributes)cell);
+ }
+ os.write(GT);
+ for (Iterator i = cell.getElements(); i.hasNext(); ) {
+ write((Element) i.next(), indent + 1);
+ }
+ addTabs(indent);
+ writeEnd(ElementTags.CELL);
+ return;
+ }
+ case Element.ROW:
+ {
+ Row row = (Row) element;
+
+ addTabs(indent);
+ writeStart(ElementTags.ROW);
+ if (hasMarkupAttributes(row)){
+ writeMarkupAttributes((MarkupAttributes)row);
+ }
+ os.write(GT);
+ Element cell;
+ for (int i = 0; i < row.columns(); i++) {
+ if ((cell = (Element)row.getCell(i)) != null) {
+ write(cell, indent + 1);
+ }
+ }
+ addTabs(indent);
+ writeEnd(ElementTags.ROW);
+ return;
+ }
+ case Element.TABLE:
+ {
+ Table table;
+ try {
+ table = (Table) element;
+ }
+ catch(ClassCastException cce) {
+ try {
+ table = ((SimpleTable)element).createTable();
+ } catch (BadElementException e) {
+ throw new ExceptionConverter(e);
+ }
+ }
+ table.complete();
+ addTabs(indent);
+ writeStart(ElementTags.TABLE);
+ write(ElementTags.COLUMNS, String.valueOf(table.columns()));
+ os.write(SPACE);
+ write(ElementTags.WIDTH);
+ os.write(EQUALS);
+ os.write(QUOTE);
+ if (! "".equals(table.absWidth())){
+ write(table.absWidth());
+ }
+ else{
+ write(String.valueOf(table.widthPercentage()));
+ write("%");
+ }
+ os.write(QUOTE);
+ write(ElementTags.ALIGN, ElementTags.getAlignment(table.alignment()));
+ write(ElementTags.CELLPADDING, String.valueOf(table.cellpadding()));
+ write(ElementTags.CELLSPACING, String.valueOf(table.cellspacing()));
+ os.write(SPACE);
+ write(ElementTags.WIDTHS);
+ os.write(EQUALS);
+ os.write(QUOTE);
+ float[] widths = table.getProportionalWidths();
+ write(String.valueOf(widths[0]));
+ for (int i = 1; i < widths.length; i++) {
+ write(";");
+ write(String.valueOf(widths[i]));
+ }
+ os.write(QUOTE);
+ write((Rectangle) table);
+ if (hasMarkupAttributes(table)) {
+ writeMarkupAttributes((MarkupAttributes)table);
+ }
+ os.write(GT);
+ Row row;
+ for (Iterator iterator = table.iterator(); iterator.hasNext(); ) {
+ row = (Row) iterator.next();
+ write(row, indent + 1);
+ }
+ addTabs(indent);
+ writeEnd(ElementTags.TABLE);
+ return;
+ }
+ case Element.ANNOTATION:
+ {
+ Annotation annotation = (Annotation) element;
+
+ addTabs(indent);
+ writeStart(ElementTags.ANNOTATION);
+ if (annotation.title() != null) {
+ write(ElementTags.TITLE, annotation.title());
+ }
+ if (annotation.content() != null) {
+ write(ElementTags.CONTENT, annotation.content());
+ }
+ if (hasMarkupAttributes(annotation)) {
+ writeMarkupAttributes((MarkupAttributes)annotation);
+ }
+ writeEnd();
+ return;
+ }
+ case Element.IMGRAW:
+ case Element.JPEG:
+ case Element.IMGTEMPLATE:
+ {
+ Image image = (Image) element;
+ if (image.url() == null) {
+ return;
+ }
+
+ addTabs(indent);
+ writeStart(ElementTags.IMAGE);
+ write(ElementTags.URL, image.url().toString());
+ if ((image.alignment() & Image.LEFT) > 0) {
+ write(ElementTags.ALIGN, ElementTags.ALIGN_LEFT);
+ }
+ else if ((image.alignment() & Image.RIGHT) > 0) {
+ write(ElementTags.ALIGN, ElementTags.ALIGN_RIGHT);
+ }
+ else if ((image.alignment() & Image.MIDDLE) > 0) {
+ write(ElementTags.ALIGN, ElementTags.ALIGN_MIDDLE);
+ }
+ if ((image.alignment() & Image.UNDERLYING) > 0) {
+ write(ElementTags.UNDERLYING, String.valueOf(true));
+ }
+ if ((image.alignment() & Image.TEXTWRAP) > 0) {
+ write(ElementTags.TEXTWRAP, String.valueOf(true));
+ }
+ if (image.alt() != null) {
+ write(ElementTags.ALT, image.alt());
+ }
+ if (image.hasAbsolutePosition()) {
+ write(ElementTags.ABSOLUTEX, String.valueOf(image.absoluteX()));
+ write(ElementTags.ABSOLUTEY, String.valueOf(image.absoluteY()));
+ }
+ write(ElementTags.PLAINWIDTH, String.valueOf(image.plainWidth()));
+ write(ElementTags.PLAINHEIGHT, String.valueOf(image.plainHeight()));
+ if (hasMarkupAttributes(image)) {
+ writeMarkupAttributes((MarkupAttributes)image);
+ }
+ writeEnd();
+ return;
+ }
+ default:
+ return;
+ }
+ }
+
+/**
+ * Writes the XML representation of a section.
+ *
+ * @param section the section to write
+ * @param indent the indentation
+ * @throws IOException
+ */
+
+ private void writeSection(Section section, int indent) throws IOException {
+ write(ElementTags.NUMBERDEPTH, String.valueOf(section.numberDepth()));
+ write(ElementTags.DEPTH, String.valueOf(section.depth()));
+ write(ElementTags.INDENT, String.valueOf(section.indentation()));
+ if (section.indentationLeft() != 0) {
+ write(ElementTags.INDENTATIONLEFT, String.valueOf(section.indentationLeft()));
+ }
+ if (section.indentationRight() != 0) {
+ write(ElementTags.INDENTATIONRIGHT, String.valueOf(section.indentationRight()));
+ }
+ os.write(GT);
+
+ if (section.title() != null) {
+ addTabs(indent + 1);
+ writeStart(ElementTags.TITLE);
+ write(ElementTags.LEADING, String.valueOf(section.title().leading()));
+ write(ElementTags.ALIGN, ElementTags.getAlignment(section.title().alignment()));
+ if (section.title().indentationLeft() != 0) {
+ write(ElementTags.INDENTATIONLEFT, String.valueOf(section.title().indentationLeft()));
+ }
+ if (section.title().indentationRight() != 0) {
+ write(ElementTags.INDENTATIONRIGHT, String.valueOf(section.title().indentationRight()));
+ }
+ write(section.title().font());
+ os.write(GT);
+ Iterator i = section.title().iterator();
+ if (section.depth() > 0) {
+ i.next();
+ }
+ while (i.hasNext()) {
+ write((Element) i.next(), indent + 2);
+ }
+ addTabs(indent + 1);
+ writeEnd(ElementTags.TITLE);
+ }
+ for (Iterator i = section.iterator(); i.hasNext(); ) {
+ write((Element) i.next(), indent + 1);
+ }
+ addTabs(indent);
+ }
+
+/**
+ * Writes the XML representation of this <CODE>Rectangle</CODE>.
+ *
+ * @param rectangle a <CODE>Rectangle</CODE>
+ * @throws IOException
+ */
+
+ private void write(Rectangle rectangle) throws IOException {
+ if (rectangle.borderWidth() != Rectangle.UNDEFINED) {
+ write(ElementTags.BORDERWIDTH, String.valueOf(rectangle.borderWidth()));
+ if (rectangle.hasBorder(Rectangle.LEFT)) {
+ write(ElementTags.LEFT, String.valueOf(true));
+ }
+ if (rectangle.hasBorder(Rectangle.RIGHT)) {
+ write(ElementTags.RIGHT, String.valueOf(true));
+ }
+ if (rectangle.hasBorder(Rectangle.TOP)) {
+ write(ElementTags.TOP, String.valueOf(true));
+ }
+ if (rectangle.hasBorder(Rectangle.BOTTOM)) {
+ write(ElementTags.BOTTOM, String.valueOf(true));
+ }
+ }
+ if (rectangle.borderColor() != null) {
+ write(ElementTags.RED, String.valueOf(rectangle.borderColor().getRed()));
+ write(ElementTags.GREEN, String.valueOf(rectangle.borderColor().getGreen()));
+ write(ElementTags.BLUE, String.valueOf(rectangle.borderColor().getBlue()));
+ }
+ if (rectangle.backgroundColor() != null) {
+ write(ElementTags.BGRED, String.valueOf(rectangle.backgroundColor().getRed()));
+ write(ElementTags.BGGREEN, String.valueOf(rectangle.backgroundColor().getGreen()));
+ write(ElementTags.BGBLUE, String.valueOf(rectangle.backgroundColor().getBlue()));
+ }
+ }
+
+/**
+ * Encodes a <CODE>String</CODE>.
+ *
+ * @param string the <CODE>String</CODE> to encode
+ * @param indent counter that keeps the number of tabs that has to be added for indentation
+ * @return the encoded <CODE>String</CODE>
+ */
+
+ static final String encode(String string, int indent) {
+ int n = string.length();
+ int pos = 0;
+ char character;
+ StringBuffer buf = new StringBuffer();
+ // loop over all the characters of the String.
+ for (int i = 0; i < n; i++) {
+ character = string.charAt(i);
+ // the Xmlcode of these characters are added to a StringBuffer one by one
+ switch(character) {
+ case ' ':
+ if ((i - pos) > 60) {
+ pos = i;
+ buf.append("\n");
+ addTabs(buf, indent);
+ break;
+ }
+ default:
+ buf.append(xmlCode[(int) character]);
+ }
+ }
+ return buf.toString();
+ }
+
+/**
+ * Adds a number of tabs to a <CODE>StringBuffer</CODE>.
+ *
+ * @param buf the stringbuffer
+ * @param indent the number of tabs to add
+ */
+
+ static final void addTabs(StringBuffer buf, int indent) {
+ for (int i = 0; i < indent; i++) {
+ buf.append("\t");
+ }
+ }
+
+/**
+ * Writes the XML representation of a <CODE>Font</CODE>.
+ *
+ * @param font a <CODE>Font</CODE>
+ * @throws IOException
+ */
+
+ private void write(Font font) throws IOException {
+ write(ElementTags.FONT, font.getFamilyname());
+ if (font.size() != Font.UNDEFINED) {
+ write(ElementTags.SIZE, String.valueOf(font.size()));
+ }
+ if (font.style() != Font.UNDEFINED) {
+ os.write(SPACE);
+ write(ElementTags.STYLE);
+ os.write(EQUALS);
+ os.write(QUOTE);
+ switch(font.style() & Font.BOLDITALIC) {
+ case Font.NORMAL:
+ write(MarkupTags.CSS_VALUE_NORMAL);
+ break;
+ case Font.BOLD:
+ write(MarkupTags.CSS_VALUE_BOLD);
+ break;
+ case Font.ITALIC:
+ write(MarkupTags.CSS_VALUE_ITALIC);
+ break;
+ case Font.BOLDITALIC:
+ write(MarkupTags.CSS_VALUE_BOLD);
+ write(", ");
+ write(MarkupTags.CSS_VALUE_ITALIC);
+ break;
+ }
+ if ((font.style() & Font.UNDERLINE) > 0) {
+ write(", ");
+ write(MarkupTags.CSS_VALUE_UNDERLINE);
+ }
+ if ((font.style() & Font.STRIKETHRU) > 0) {
+ write(", ");
+ write(MarkupTags.CSS_VALUE_LINETHROUGH);
+ }
+ os.write(QUOTE);
+ }
+ if (font.color() != null) {
+ write(ElementTags.RED, String.valueOf(font.color().getRed()));
+ write(ElementTags.GREEN, String.valueOf(font.color().getGreen()));
+ write(ElementTags.BLUE, String.valueOf(font.color().getBlue()));
+ }
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/xml/xmp/DublinCoreSchema.java b/src/main/java/com/lowagie/text/xml/xmp/DublinCoreSchema.java
new file mode 100644
index 0000000..53b1ade
--- /dev/null
+++ b/src/main/java/com/lowagie/text/xml/xmp/DublinCoreSchema.java
@@ -0,0 +1,187 @@
+/*
+ * $Id: DublinCoreSchema.java,v 1.5 2005/09/08 07:50:15 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2005 by Bruno Lowagie.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999-2005 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000-2005 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU LIBRARY GENERAL PUBLIC LICENSE for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.xml.xmp;
+
+import java.io.IOException;
+
+/**
+ * An implementation of an XmpSchema.
+ */
+public class DublinCoreSchema extends XmpSchema {
+
+ /** default namespace identifier*/
+ public static final String DEFAULT_XPATH_ID = "dc";
+ /** default namespace uri*/
+ public static final String DEFAULT_XPATH_URI = "http://purl.org/dc/elements/1.1/";
+
+ /** External Contributors to the resource (other than the authors). */
+ public static final String CONTRIBUTOR = "dc:contributor";
+ /** The extent or scope of the resource. */
+ public static final String COVERAGE = "dc:coverage";
+ /** The authors of the resource (listed in order of precedence, if significant). */
+ public static final String CREATOR = "dc:creator";
+ /** Date(s) that something interesting happened to the resource. */
+ public static final String DATE = "dc:date";
+ /** A textual description of the content of the resource. Multiple values may be present for different languages. */
+ public static final String DESCRIPTION = "dc:description";
+ /** The file format used when saving the resource. Tools and applications should set this property to the save format of the data. It may include appropriate qualifiers. */
+ public static final String FORMAT = "dc:format";
+ /** Unique identifier of the resource. */
+ public static final String IDENTIFIER = "dc:identifier";
+ /** An unordered array specifying the languages used in the resource. */
+ public static final String LANGUAGE = "dc:language";
+ /** Publishers. */
+ public static final String PUBLISHER = "dc:publisher";
+ /** Relationships to other documents. */
+ public static final String RELATION = "dc:relation";
+ /** Informal rights statement, selected by language. */
+ public static final String RIGHTS = "dc:rights";
+ /** Unique identifier of the work from which this resource was derived. */
+ public static final String SOURCE = "dc:source";
+ /** An unordered array of descriptive phrases or keywords that specify the topic of the content of the resource. */
+ public static final String SUBJECT = "dc:subject";
+ /** The title of the document, or the name given to the resource. Typically, it will be a name by which the resource is formally known. */
+ public static final String TITLE = "dc:title";
+ /** A document type; for example, novel, poem, or working paper. */
+ public static final String TYPE = "dc:type";
+
+
+ /**
+ * @throws IOException
+ */
+ public DublinCoreSchema() throws IOException {
+ super("xmlns:" + DEFAULT_XPATH_ID + "=\"" + DEFAULT_XPATH_URI + "\"");
+ setProperty(FORMAT, "application/pdf");
+ }
+
+ /**
+ * Adds a title.
+ * @param title
+ */
+ public void addTitle(String title) {
+ setProperty(TITLE, title);
+ }
+
+ /**
+ * Adds a description.
+ * @param desc
+ */
+ public void addDescription(String desc) {
+ setProperty(DESCRIPTION, desc);
+ }
+
+ /**
+ * Adds a subject.
+ * @param subject
+ */
+ public void addSubject(String subject) {
+ XmpArray array = new XmpArray(XmpArray.UNORDERED);
+ array.add(subject);
+ setProperty(SUBJECT, array);
+ }
+
+
+ /**
+ * Adds a subject.
+ * @param subject array of subjects
+ */
+ public void addSubject(String[] subject) {
+ XmpArray array = new XmpArray(XmpArray.UNORDERED);
+ for (int i = 0; i < subject.length; i++) {
+ array.add(subject[i]);
+ }
+ setProperty(SUBJECT, array);
+ }
+
+ /**
+ * Adds a single author.
+ * @param author
+ */
+ public void addAuthor(String author) {
+ XmpArray array = new XmpArray(XmpArray.ORDERED);
+ array.add(author);
+ setProperty(CREATOR, array);
+ }
+
+ /**
+ * Adds an array of authors.
+ * @param author
+ */
+ public void addAuthor(String[] author) {
+ XmpArray array = new XmpArray(XmpArray.ORDERED);
+ for (int i = 0; i < author.length; i++) {
+ array.add(author[i]);
+ }
+ setProperty(CREATOR, array);
+ }
+
+ /**
+ * Adds a single publisher.
+ * @param publisher
+ */
+ public void addPublisher(String publisher) {
+ XmpArray array = new XmpArray(XmpArray.ORDERED);
+ array.add(publisher);
+ setProperty(PUBLISHER, array);
+ }
+
+ /**
+ * Adds an array of publishers.
+ * @param publisher
+ */
+ public void addPublisher(String[] publisher) {
+ XmpArray array = new XmpArray(XmpArray.ORDERED);
+ for (int i = 0; i < publisher.length; i++) {
+ array.add(publisher[i]);
+ }
+ setProperty(PUBLISHER, array);
+ }
+}
diff --git a/src/main/java/com/lowagie/text/xml/xmp/PdfSchema.java b/src/main/java/com/lowagie/text/xml/xmp/PdfSchema.java
new file mode 100644
index 0000000..2793e57
--- /dev/null
+++ b/src/main/java/com/lowagie/text/xml/xmp/PdfSchema.java
@@ -0,0 +1,105 @@
+/*
+ * $Id: PdfSchema.java,v 1.4 2005/09/08 07:50:15 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2005 by Bruno Lowagie.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999-2005 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000-2005 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU LIBRARY GENERAL PUBLIC LICENSE for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.xml.xmp;
+
+import com.lowagie.text.Document;
+import java.io.IOException;
+
+/**
+ * An implementation of an XmpSchema.
+ */
+public class PdfSchema extends XmpSchema {
+
+ /** default namespace identifier*/
+ public static final String DEFAULT_XPATH_ID = "pdf";
+ /** default namespace uri*/
+ public static final String DEFAULT_XPATH_URI = "http://ns.adobe.com/pdf/1.3/";
+
+ /** Keywords. */
+ public static final String KEYWORDS = "pdf:Keywords";
+ /** The PDF file version (for example: 1.0, 1.3, and so on). */
+ public static final String VERSION = "pdf:PDFVersion";
+ /** The Producer. */
+ public static final String PRODUCER = "pdf:Producer";
+
+
+ /**
+ * @throws IOException
+ */
+ public PdfSchema() throws IOException {
+ super("xmlns:" + DEFAULT_XPATH_ID + "=\"" + DEFAULT_XPATH_URI + "\"");
+ addProducer(Document.getVersion());
+ }
+
+ /**
+ * Adds keywords.
+ * @param keywords
+ */
+ public void addKeywords(String keywords) {
+ setProperty(KEYWORDS, keywords);
+ }
+
+ /**
+ * Adds the producer.
+ * @param producer
+ */
+ public void addProducer(String producer) {
+ setProperty(PRODUCER, producer);
+ }
+
+ /**
+ * Adds the version.
+ * @param version
+ */
+ public void addVersion(String version) {
+ setProperty(VERSION, version);
+ }
+}
diff --git a/src/main/java/com/lowagie/text/xml/xmp/XmpArray.java b/src/main/java/com/lowagie/text/xml/xmp/XmpArray.java
new file mode 100644
index 0000000..39016a7
--- /dev/null
+++ b/src/main/java/com/lowagie/text/xml/xmp/XmpArray.java
@@ -0,0 +1,99 @@
+/*
+ * $Id: XmpArray.java,v 1.3 2005/09/08 07:50:15 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2005 by Bruno Lowagie.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999-2005 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000-2005 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU LIBRARY GENERAL PUBLIC LICENSE for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.xml.xmp;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+
+/**
+ * StringBuffer to construct an XMP array.
+ */
+public class XmpArray extends ArrayList {
+
+ /** An array that is unordered. */
+ public static final String UNORDERED = "rdf:Bag";
+ /** An array that is ordered. */
+ public static final String ORDERED = "rdf:Seq";
+ /** An array with alternatives. */
+ public static final String ALTERNATIVE = "rdf:Alt";
+
+ /** the type of array. */
+ protected String type;
+
+ /**
+ * Creates an XmpArray.
+ * @param type the type of array: UNORDERED, ORDERED or ALTERNATIVE.
+ */
+ public XmpArray(String type) {
+ this.type = type;
+ }
+
+ /**
+ * Returns the String representation of the XmpArray.
+ * @return a String representation
+ */
+ public String toString() {
+ StringBuffer buf = new StringBuffer("<");
+ buf.append(type);
+ buf.append(">");
+ String s;
+ for (Iterator i = iterator(); i.hasNext(); ) {
+ s = (String) i.next();
+ buf.append("<rdf:li>");
+ buf.append(XmpSchema.escape(s));
+ buf.append("</rdf:li>");
+ }
+ buf.append("</");
+ buf.append(type);
+ buf.append(">");
+ return buf.toString();
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/text/xml/xmp/XmpBasicSchema.java b/src/main/java/com/lowagie/text/xml/xmp/XmpBasicSchema.java
new file mode 100644
index 0000000..03e8e54
--- /dev/null
+++ b/src/main/java/com/lowagie/text/xml/xmp/XmpBasicSchema.java
@@ -0,0 +1,141 @@
+/*
+ * $Id: XmpBasicSchema.java,v 1.4 2005/09/08 07:50:15 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2005 by Bruno Lowagie.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999-2005 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000-2005 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU LIBRARY GENERAL PUBLIC LICENSE for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.xml.xmp;
+
+import java.io.IOException;
+
+/**
+ * An implementation of an XmpSchema.
+ */
+public class XmpBasicSchema extends XmpSchema {
+
+ /** default namespace identifier*/
+ public static final String DEFAULT_XPATH_ID = "xmp";
+ /** default namespace uri*/
+ public static final String DEFAULT_XPATH_URI = "http://ns.adobe.com/xap/1.0/";
+
+ /** An unordered array specifying properties that were edited outside the authoring application. Each item should contain a single namespace and XPath separated by one ASCII space (U+0020). */
+ public static final String ADVISORY = "xmp:Advisory";
+ /** The base URL for relative URLs in the document content. If this document contains Internet links, and those links are relative, they are relative to this base URL. This property provides a standard way for embedded relative URLs to be interpreted by tools. Web authoring tools should set the value based on their notion of where URLs will be interpreted. */
+ public static final String BASEURL = "xmp:BaseURL";
+ /** The date and time the resource was originally created. */
+ public static final String CREATEDATE = "xmp:CreateDate";
+ /** The name of the first known tool used to create the resource. If history is present in the metadata, this value should be equivalent to that of xmpMM:History’s softwareAgent property. */
+ public static final String CREATORTOOL = "xmp:CreatorTool";
+ /** An unordered array of text strings that unambiguously identify the resource within a given context. */
+ public static final String IDENTIFIER = "xmp:Identifier";
+ /** The date and time that any metadata for this resource was last changed. */
+ public static final String METADATADATE = "xmp:MetadataDate";
+ /** The date and time the resource was last modified. */
+ public static final String MODIFYDATE = "xmp:ModifyDate";
+ /** A short informal name for the resource. */
+ public static final String NICKNAME = "xmp:Nickname";
+ /** An alternative array of thumbnail images for a file, which can differ in characteristics such as size or image encoding. */
+ public static final String THUMBNAILS = "xmp:Thumbnails";
+
+
+ /**
+ * @throws IOException
+ */
+ public XmpBasicSchema() throws IOException {
+ super("xmlns:" + DEFAULT_XPATH_ID + "=\"" + DEFAULT_XPATH_URI + "\"");
+ }
+
+ /**
+ * Adds the creatortool.
+ * @param creator
+ */
+ public void addCreatorTool(String creator) {
+ setProperty(CREATORTOOL, creator);
+ }
+
+ /**
+ * Adds the creation date.
+ * @param date
+ */
+ public void addCreateDate(String date) {
+ setProperty(CREATEDATE, date);
+ }
+
+ /**
+ * Adds the modification date.
+ * @param date
+ */
+ public void addModDate(String date) {
+ setProperty(MODIFYDATE, date);
+ }
+
+ /**
+ * Adds the meta data date.
+ * @param date
+ */
+ public void addMetaDataDate(String date) {
+ setProperty(METADATADATE, date);
+ }
+
+ /** Adds the identifier.
+ * @param id
+ */
+ public void addIdentifiers(String[] id) {
+ XmpArray array = new XmpArray(XmpArray.UNORDERED);
+ for (int i = 0; i < id.length; i++) {
+ array.add(id[i]);
+ }
+ setProperty(IDENTIFIER, array);
+ }
+
+ /** Adds the nickname.
+ * @param name
+ */
+ public void addNickname(String name) {
+ setProperty(NICKNAME, name);
+ }
+}
diff --git a/src/main/java/com/lowagie/text/xml/xmp/XmpMMSchema.java b/src/main/java/com/lowagie/text/xml/xmp/XmpMMSchema.java
new file mode 100644
index 0000000..f19e7f0
--- /dev/null
+++ b/src/main/java/com/lowagie/text/xml/xmp/XmpMMSchema.java
@@ -0,0 +1,97 @@
+/*
+ * $Id: XmpMMSchema.java,v 1.3 2005/09/08 07:50:15 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2005 by Bruno Lowagie.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999-2005 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000-2005 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU LIBRARY GENERAL PUBLIC LICENSE for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.xml.xmp;
+
+import java.io.IOException;
+
+/**
+ * An implementation of an XmpSchema.
+ */
+public class XmpMMSchema extends XmpSchema {
+
+ /** default namespace identifier*/
+ public static final String DEFAULT_XPATH_ID = "xmpMM";
+ /** default namespace uri*/
+ public static final String DEFAULT_XPATH_URI = "http://ns.adobe.com/xap/1.0/mm/";
+
+
+ /** A reference to the original document from which this one is derived. It is a minimal reference; missing components can be assumed to be unchanged. For example, a new version might only need to specify the instance ID and version number of the previous version, or a rendition might only need to specify the instance ID and rendition class of the original. */
+ public static final String DERIVEDFROM = "xmpMM:DerivedFrom";
+ /** The common identifier for all versions and renditions of a document. */
+ public static final String DOCUMENTID = "xmpMM:DocumentID";
+ /** An ordered array of high-level user actions that resulted in this resource. It is intended to give human readers a general indication of the steps taken to make the changes from the previous version to this one. The list should be at an abstract level; it is not intended to be an exhaustive keystroke or other detailed history. */
+ public static final String HISTORY = "xmpMM:History";
+ /** A reference to the document as it was prior to becoming managed. It is set when a managed document is introduced to an asset management system that does not currently own it. It may or may not include references to different management systems. */
+ public static final String MANAGEDFROM = "xmpMM:ManagedFrom";
+ /** The name of the asset management system that manages this resource. */
+ public static final String MANAGER = "xmpMM:Manager";
+ /** A URI identifying the managed resource to the asset management system; the presence of this property is the formal indication that this resource is managed. The form and content of this URI is private to the asset management system. */
+ public static final String MANAGETO = "xmpMM:ManageTo";
+ /** A URI that can be used to access information about the managed resource through a web browser. It might require a custom browser plugin. */
+ public static final String MANAGEUI = "xmpMM:ManageUI";
+ /** Specifies a particular variant of the asset management system. The format of this property is private to the specific asset management system. */
+ public static final String MANAGERVARIANT = "xmpMM:ManagerVariant";
+ /** The rendition class name for this resource.*/
+ public static final String RENDITIONCLASS = "xmpMM:RenditionClass";
+ /** Can be used to provide additional rendition parameters that are too complex or verbose to encode in xmpMM: RenditionClass. */
+ public static final String RENDITIONPARAMS = "xmpMM:RenditionParams";
+ /** The document version identifier for this resource. */
+ public static final String VERSIONID = "xmpMM:VersionID";
+ /** The version history associated with this resource.*/
+ public static final String VERSIONS = "xmpMM:Versions";
+
+ /**
+ * @throws IOException
+ */
+ public XmpMMSchema() throws IOException {
+ super("xmlns:" + DEFAULT_XPATH_ID + "=\"" + DEFAULT_XPATH_URI + "\"");
+ }
+}
diff --git a/src/main/java/com/lowagie/text/xml/xmp/XmpSchema.java b/src/main/java/com/lowagie/text/xml/xmp/XmpSchema.java
new file mode 100644
index 0000000..1b66cc8
--- /dev/null
+++ b/src/main/java/com/lowagie/text/xml/xmp/XmpSchema.java
@@ -0,0 +1,158 @@
+/*
+ * $Id: XmpSchema.java,v 1.5 2005/09/08 10:27:29 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2005 by Bruno Lowagie.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999-2005 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000-2005 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU LIBRARY GENERAL PUBLIC LICENSE for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.xml.xmp;
+
+import java.util.Enumeration;
+import java.util.Properties;
+
+/**
+ * Abstract superclass of the XmpSchemas supported by iText.
+ */
+public abstract class XmpSchema extends Properties {
+
+ /** the namesspace */
+ protected String xmlns;
+
+ /** Constructs an XMP schema.
+ * @param xmlns
+ */
+ public XmpSchema(String xmlns) {
+ super();
+ this.xmlns = xmlns;
+ }
+ /**
+ * The String representation of the contents.
+ * @return a String representation.
+ */
+ public String toString() {
+ StringBuffer buf = new StringBuffer();
+ for (Enumeration e = this.propertyNames(); e.hasMoreElements(); ) {
+ process(buf, e.nextElement());
+ }
+ return buf.toString();
+ }
+ /**
+ * Processes a property
+ * @param buf
+ * @param p
+ */
+ protected void process(StringBuffer buf, Object p) {
+ buf.append("<");
+ buf.append(p);
+ buf.append(">");
+ buf.append(this.get(p));
+ buf.append("</");
+ buf.append(p);
+ buf.append(">");
+ }
+ /**
+ * @return Returns the xmlns.
+ */
+ public String getXmlns() {
+ return xmlns;
+ }
+
+ /**
+ * @param key
+ * @param value
+ * @return the previous property (null if there wasn't one)
+ */
+ public synchronized Object addProperty(String key, String value) {
+ return this.setProperty(key, value);
+ }
+
+ /**
+ * @see java.util.Properties#setProperty(java.lang.String, java.lang.String)
+ */
+ public synchronized Object setProperty(String key, String value) {
+ return super.setProperty(key, escape(value));
+ }
+
+ /**
+ * @see java.util.Properties#setProperty(java.lang.String, java.lang.String)
+ *
+ * @param key
+ * @param value
+ * @return the previous property (null if there wasn't one)
+ */
+ public synchronized Object setProperty(String key, XmpArray value) {
+ return super.setProperty(key, value.toString());
+ }
+ /**
+ * @param content
+ * @return an escaped string
+ */
+ public static String escape(String content) {
+ StringBuffer buf = new StringBuffer();
+ for (int i = 0; i < content.length(); i++) {
+ switch(content.charAt(i)) {
+ case '<':
+ buf.append("&lt;");
+ break;
+ case '>':
+ buf.append("&gt;");
+ break;
+ case '\'':
+ buf.append("&apos;");
+ break;
+ case '\"':
+ buf.append("&quot;");
+ break;
+ case '&':
+ buf.append("&amp;");
+ break;
+ default:
+ buf.append(content.charAt(i));
+ }
+ }
+ return buf.toString();
+ }
+}
diff --git a/src/main/java/com/lowagie/text/xml/xmp/XmpWriter.java b/src/main/java/com/lowagie/text/xml/xmp/XmpWriter.java
new file mode 100644
index 0000000..8cec5f8
--- /dev/null
+++ b/src/main/java/com/lowagie/text/xml/xmp/XmpWriter.java
@@ -0,0 +1,276 @@
+/*
+ * $Id: XmpWriter.java,v 1.8 2005/11/14 15:21:45 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2005 by Bruno Lowagie.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999-2005 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000-2005 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU LIBRARY GENERAL PUBLIC LICENSE for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.text.xml.xmp;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.util.Map;
+import java.util.Iterator;
+
+import com.lowagie.text.pdf.PdfDate;
+import com.lowagie.text.pdf.PdfDictionary;
+import com.lowagie.text.pdf.PdfName;
+import com.lowagie.text.pdf.PdfObject;
+import com.lowagie.text.pdf.PdfString;
+
+/**
+ * With this class you can create an Xmp Stream that can be used for adding
+ * Metadata to a PDF Dictionary. Remark that this class doesn't cover the
+ * complete XMP specification.
+ */
+public class XmpWriter {
+
+ /** A possible charset for the XMP. */
+ public static final String UTF8 = "UTF-8";
+ /** A possible charset for the XMP. */
+ public static final String UTF16 = "UTF-16";
+ /** A possible charset for the XMP. */
+ public static final String UTF16BE = "UTF-16BE";
+ /** A possible charset for the XMP. */
+ public static final String UTF16LE = "UTF-16LE";
+
+ /** String used to fill the extra space. */
+ public static final String EXTRASPACE = " \n";
+
+ /** You can add some extra space in the XMP packet; 1 unit in this variable represents 100 spaces and a newline. */
+ protected int extraSpace;
+
+ /** The writer to which you can write bytes for the XMP stream. */
+ protected OutputStreamWriter writer;
+
+ /** The about string that goes into the rdf:Description tags. */
+ protected String about;
+
+ /** The end attribute. */
+ protected char end = 'w';
+
+ /**
+ * Creates an XmpWriter.
+ * @param os
+ * @param utfEncoding
+ * @param extraSpace
+ * @throws IOException
+ */
+ public XmpWriter(OutputStream os, String utfEncoding, int extraSpace) throws IOException {
+ this.extraSpace = extraSpace;
+ writer = new OutputStreamWriter(os, utfEncoding);
+ writer.write("<?xpacket begin='\uFEFF' id='W5M0MpCehiHzreSzNTczkc9d' ?>\n");
+ writer.write("<x:xmpmeta xmlns:x='adobe:ns:meta/'>\n");
+ writer.write("<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#'>\n");
+ about = "";
+ }
+
+ /**
+ * Creates an XmpWriter.
+ * @param os
+ * @throws IOException
+ */
+ public XmpWriter(OutputStream os) throws IOException {
+ this(os, UTF8, 20);
+ }
+
+ /** Sets the XMP to read-only */
+ public void setReadOnly() {
+ end = 'r';
+ }
+
+ /**
+ * @param about The about to set.
+ */
+ public void setAbout(String about) {
+ this.about = about;
+ }
+
+ /**
+ * Adds an rdf:Description.
+ * @param xmlns
+ * @param content
+ * @throws IOException
+ */
+ public void addRdfDescription(String xmlns, String content) throws IOException {
+ writer.write("<rdf:Description rdf:about='");
+ writer.write(about);
+ writer.write("' ");
+ writer.write(xmlns);
+ writer.write(">");
+ writer.write(content);
+ writer.write("</rdf:Description>\n");
+ }
+
+ /**
+ * Adds an rdf:Description.
+ * @param s
+ * @throws IOException
+ */
+ public void addRdfDescription(XmpSchema s) throws IOException {
+ writer.write("<rdf:Description rdf:about='");
+ writer.write(about);
+ writer.write("' ");
+ writer.write(s.getXmlns());
+ writer.write(">");
+ writer.write(s.toString());
+ writer.write("</rdf:Description>\n");
+ }
+
+ /**
+ * Flushes and closes the XmpWriter.
+ * @throws IOException
+ */
+ public void close() throws IOException {
+ writer.write("</rdf:RDF>");
+ writer.write("</x:xmpmeta>\n");
+ for (int i = 0; i < extraSpace; i++) {
+ writer.write(EXTRASPACE);
+ }
+ writer.write("<?xpacket ends='" + end + "' ?>");
+ writer.flush();
+ writer.close();
+ }
+
+ /**
+ * @param os
+ * @param info
+ * @throws IOException
+ */
+ public XmpWriter(OutputStream os, PdfDictionary info) throws IOException {
+ this(os);
+ if (info != null) {
+ DublinCoreSchema dc = new DublinCoreSchema();
+ PdfSchema p = new PdfSchema();
+ XmpBasicSchema basic = new XmpBasicSchema();
+ PdfName key;
+ PdfObject obj;
+ for (Iterator it = info.getKeys().iterator(); it.hasNext();) {
+ key = (PdfName)it.next();
+ obj = info.get(key);
+ if (obj == null)
+ continue;
+ if (PdfName.TITLE.equals(key)) {
+ dc.addTitle(((PdfString)obj).toUnicodeString());
+ }
+ if (PdfName.AUTHOR.equals(key)) {
+ dc.addAuthor(((PdfString)obj).toUnicodeString());
+ }
+ if (PdfName.SUBJECT.equals(key)) {
+ dc.addSubject(((PdfString)obj).toUnicodeString());
+ }
+ if (PdfName.KEYWORDS.equals(key)) {
+ p.addKeywords(((PdfString)obj).toUnicodeString());
+ }
+ if (PdfName.CREATOR.equals(key)) {
+ basic.addCreatorTool(((PdfString)obj).toUnicodeString());
+ }
+ if (PdfName.PRODUCER.equals(key)) {
+ p.addProducer(((PdfString)obj).toUnicodeString());
+ }
+ if (PdfName.CREATIONDATE.equals(key)) {
+ basic.addCreateDate(((PdfDate)obj).getW3CDate());
+ }
+ if (PdfName.MODDATE.equals(key)) {
+ basic.addModDate(((PdfDate)obj).getW3CDate());
+ }
+ }
+ if (dc.size() > 0) addRdfDescription(dc);
+ if (p.size() > 0) addRdfDescription(p);
+ if (basic.size() > 0) addRdfDescription(basic);
+ }
+ }
+
+ /**
+ * @param os
+ * @param info
+ * @throws IOException
+ */
+ public XmpWriter(OutputStream os, Map info) throws IOException {
+ this(os);
+ if (info != null) {
+ DublinCoreSchema dc = new DublinCoreSchema();
+ PdfSchema p = new PdfSchema();
+ XmpBasicSchema basic = new XmpBasicSchema();
+ String key;
+ String value;
+ for (Iterator it = info.keySet().iterator(); it.hasNext();) {
+ key = (String)it.next();
+ value = (String)info.get(key);
+ if (value == null)
+ continue;
+ if ("Title".equals(key)) {
+ dc.addTitle(value);
+ }
+ if ("Author".equals(key)) {
+ dc.addAuthor(value);
+ }
+ if ("Subject".equals(key)) {
+ dc.addSubject(value);
+ }
+ if ("Keywords".equals(key)) {
+ p.addKeywords(value);
+ }
+ if ("Creator".equals(key)) {
+ basic.addCreatorTool(value);
+ }
+ if ("Producer".equals(key)) {
+ p.addProducer(value);
+ }
+ if ("CreationDate".equals(key)) {
+ basic.addCreateDate(PdfDate.getW3CDate(value));
+ }
+ if ("ModDate".equals(key)) {
+ basic.addModDate(PdfDate.getW3CDate(value));
+ }
+ }
+ if (dc.size() > 0) addRdfDescription(dc);
+ if (p.size() > 0) addRdfDescription(p);
+ if (basic.size() > 0) addRdfDescription(basic);
+ }
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/tools/BuildTutorial.java b/src/main/java/com/lowagie/tools/BuildTutorial.java
new file mode 100644
index 0000000..8087731
--- /dev/null
+++ b/src/main/java/com/lowagie/tools/BuildTutorial.java
@@ -0,0 +1,156 @@
+/*
+ * $Id: BuildTutorial.java,v 1.8 2004/12/10 14:21:01 blowagie Exp $
+ * $Name: $
+ *
+ * This code is free software. It may only be copied or modified
+ * if you include the following copyright notice:
+ *
+ * This code is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * itext@lowagie.com
+ */
+package com.lowagie.tools;
+
+import java.io.*;
+
+import javax.xml.transform.*;
+import javax.xml.transform.stream.*;
+
+/**
+ * This class can be used to build the iText website.
+ *
+ * @author Bruno Lowagie (based on an example found in the Developer's Almanac)
+ */
+public class BuildTutorial {
+
+ static String root;
+ static FileWriter build;
+
+ //~ Methods
+ // ----------------------------------------------------------------
+
+ /**
+ * Main method so you can call the convert method from the command line.
+ * @param args 4 arguments are expected:
+ * <ul><li>a sourcedirectory (root of the tutorial xml-files),
+ * <li>a destination directory (where the html and build.xml files will be generated),
+ * <li>an xsl to transform the index.xml into a build.xml
+ * <li>an xsl to transform the index.xml into am index.html</ul>
+ */
+
+ public static void main(String[] args) {
+ if (args.length == 4) {
+ File srcdir = new File(args[0]);
+ File destdir = new File(args[1]);
+ File xsl_examples = new File(srcdir, args[2]);
+ File xsl_site = new File(srcdir, args[3]);
+ try {
+ System.out.print("Building tutorial: ");
+ root = new File(args[1], srcdir.getName()).getCanonicalPath();
+ System.out.println(root);
+ build = new FileWriter(new File(root, "build.xml"));
+ build.write("<project name=\"tutorial\" default=\"all\" basedir=\".\">\n");
+ build.write("<target name=\"all\">\n");
+ action(srcdir, destdir, xsl_examples, xsl_site);
+ build.write("</target>\n</project>");
+ build.flush();
+ build.close();
+ }
+ catch(IOException ioe) {
+ ioe.printStackTrace();
+ }
+ } else {
+ System.err
+ .println("Wrong number of parameters.\nUsage: BuildSite srcdr destdir xsl_examples xsl_site");
+ }
+ }
+
+ /**
+ * Inspects a file or directory that is given and performs the necessary actions on it (transformation or recursion).
+ * @param source a sourcedirectory (possibly with a tutorial xml-file)
+ * @param destination a destination directory (where the html and build.xml file will be generated, if necessary)
+ * @param xsl_examples an xsl to transform the index.xml into a build.xml
+ * @param xsl_site an xsl to transform the index.xml into am index.html
+ * @throws IOException when something goes wrong while reading or creating a file or directory
+ */
+ public static void action(File source, File destination, File xsl_examples, File xsl_site) throws IOException {
+ if ("CVS".equals(source.getName())) return;
+ System.out.print(source.getName());
+ if (source.isDirectory()) {
+ System.out.print(" ");
+ System.out.println(source.getCanonicalPath());
+ File dest = new File(destination, source.getName());
+ dest.mkdir();
+ File current;
+ File[] xmlFiles = source.listFiles();
+ for (int i = 0; i < xmlFiles.length; i++) {
+ current = xmlFiles[i];
+ action(current, dest, xsl_examples, xsl_site);
+ }
+ }
+ else if (source.getName().equals("index.xml")) {
+ System.out.println("... transformed");
+ convert(source, xsl_site, new File(destination, "index.html"));
+ File buildfile = new File(destination, "build.xml");
+ String path = buildfile.getCanonicalPath().substring(root.length());
+ path = path.replace(File.separatorChar, '/');
+ if ("/build.xml".equals(path)) return;
+ convert(source, xsl_examples, buildfile);
+ build.write("\t<ant antfile=\"${basedir}");
+ build.write(path);
+ build.write("\" target=\"install\" inheritAll=\"false\" />\n");
+ }
+ else {
+ System.out.println("... skipped");
+ }
+ }
+
+ /**
+ * Converts an <code>infile</code>, using an <code>xslfile</code> to an
+ * <code>outfile</code>.
+ *
+ * @param infile
+ * the path to an XML file
+ * @param xslfile
+ * the path to the XSL file
+ * @param outfile
+ * the path for the output file
+ */
+ public static void convert(File infile, File xslfile, File outfile) {
+ try {
+ // Create transformer factory
+ TransformerFactory factory = TransformerFactory.newInstance();
+
+ // Use the factory to create a template containing the xsl file
+ Templates template = factory.newTemplates(new StreamSource(
+ new FileInputStream(xslfile)));
+
+ // Use the template to create a transformer
+ Transformer xformer = template.newTransformer();
+
+ // passing 2 parameters
+ String branch = outfile.getParentFile().getCanonicalPath().substring(root.length());
+ branch = branch.replace(File.separatorChar, '/');
+ StringBuffer path = new StringBuffer();
+ for (int i = 0; i < branch.length(); i++) {
+ if (branch.charAt(i) == '/') path.append("/..");
+ }
+
+ xformer.setParameter("branch", branch);
+ xformer.setParameter("root", path.toString());
+
+ // Prepare the input and output files
+ Source source = new StreamSource(new FileInputStream(infile));
+ Result result = new StreamResult(new FileOutputStream(outfile));
+
+ // Apply the xsl file to the source file and write the result to the
+ // output file
+ xformer.transform(source, result);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+}
+//The End
diff --git a/src/main/java/com/lowagie/tools/CvsLogParser.java b/src/main/java/com/lowagie/tools/CvsLogParser.java
new file mode 100644
index 0000000..39181f1
--- /dev/null
+++ b/src/main/java/com/lowagie/tools/CvsLogParser.java
@@ -0,0 +1,138 @@
+/*
+ * $Id: CvsLogParser.java,v 1.5 2006/05/22 11:00:30 blowagie Exp $
+ * $Name: $
+ *
+ * This code is free software. It may only be copied or modified
+ * if you include the following copyright notice:
+ *
+ * This code is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * itext@lowagie.com
+ */
+package com.lowagie.tools;
+
+import java.io.BufferedReader;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.StreamTokenizer;
+
+import java.util.Enumeration;
+
+/**
+ * If you get a changelog from CVS, for instance:
+ * cvs -d:ext:blowagie@itext.cvs.sourceforge.net:/cvsroot/itext log -d ">2005-07-29"
+ * you get an overview that contains all the changes.
+ * With this class, you can parse out the important entries.
+ *
+ * @author blowagie
+ */
+public class CvsLogParser implements Enumeration {
+
+ /** the tokenizer object. */
+ protected StreamTokenizer st;
+
+ /** indicates if the current token contains changes. */
+ protected boolean changes = false;
+
+ /** indicates if the tokenizer has more tokens. */
+ protected boolean more = false;
+
+ /**
+ * @param file
+ * @throws FileNotFoundException
+ */
+ public CvsLogParser(String file) throws FileNotFoundException {
+ BufferedReader r = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
+ st = new StreamTokenizer(r);
+ st.eolIsSignificant(true);
+ st.ordinaryChar('/');
+ st.ordinaryChar('\'');
+ more = true;
+ }
+
+ /**
+ * @see java.util.Enumeration#hasMoreElements()
+ */
+ public boolean hasMoreElements() {
+ return more;
+ }
+
+ /**
+ * Returns the next token in the log file.
+ * @see java.util.Enumeration#nextElement()
+ */
+ public Object nextElement(){
+ StringBuffer token = new StringBuffer();
+ StringBuffer line = new StringBuffer();
+ boolean moreToken = true;
+ changes = false;
+ try {
+ while (more && moreToken) {
+ st.nextToken();
+ switch(st.ttype) {
+ case StreamTokenizer.TT_EOF:
+ more = false;
+ case StreamTokenizer.TT_EOL:
+ token.append(line.toString());
+ if (line.toString().endsWith("=============================================================================")) {
+ moreToken = false;
+ }
+ else {
+ line = new StringBuffer("\n");
+ }
+ break;
+ case StreamTokenizer.TT_WORD:
+ line.append(st.sval);
+ line.append(" ");
+ break;
+ case StreamTokenizer.TT_NUMBER:
+ if (st.nval > 0 && line.toString().endsWith("selected revisions :")) {
+ changes = true;
+ }
+ line.append(st.nval);
+ break;
+ default:
+ line.append((char) st.ttype);
+ }
+ }
+ return token.toString();
+ }
+ catch(IOException ioe) {
+ more = false;
+ return "";
+ }
+ }
+
+ /**
+ * Indicates if the current token is one that contains changes.
+ * @return true if the token is relevant
+ */
+ private boolean hasChanged() {
+ return changes;
+ }
+
+
+ /**
+ * Parses a log form CVS.
+ * @param args the path to the logfile
+ */
+ public static void main(String[] args) {
+ try {
+ CvsLogParser p = new CvsLogParser(args[0]);
+ String token;
+ while (p.hasMoreElements()) {
+ token = (String) p.nextElement();
+ if (p.hasChanged()) {
+ System.out.println(token);
+ }
+ }
+ }
+ catch(Exception e) {
+ e.printStackTrace();
+ }
+ }
+}
diff --git a/src/main/java/com/lowagie/tools/Executable.java b/src/main/java/com/lowagie/tools/Executable.java
new file mode 100644
index 0000000..0467b24
--- /dev/null
+++ b/src/main/java/com/lowagie/tools/Executable.java
@@ -0,0 +1,322 @@
+/*
+ * $Id: Executable.java,v 1.6 2005/08/10 14:32:51 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2005 by Bruno Lowagie / Roger Mistelli
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+package com.lowagie.tools;
+
+import java.io.File;
+import java.io.IOException;
+import java.lang.reflect.Method;
+
+/**
+ * This class enables you to call an executable that will show a PDF file.
+ */
+public class Executable {
+
+ /**
+ * The path to Acrobat Reader.
+ */
+ public static String acroread = null;
+
+
+ /**
+ * Performs an action on a PDF document.
+ * @param fileName
+ * @param parameters
+ * @param waitForTermination
+ * @return a process
+ * @throws IOException
+ */
+ private static Process action(final String fileName,
+ String parameters, boolean waitForTermination) throws IOException {
+ Process process = null;
+ if (parameters.trim().length() > 0) {
+ parameters = " " + parameters.trim();
+ }
+ else {
+ parameters = "";
+ }
+ if (acroread != null) {
+ process = Runtime.getRuntime().exec(
+ acroread + parameters + " \"" + fileName + "\"");
+ }
+ else if (isWindows()) {
+ if (isWindows9X()) {
+ process = Runtime.getRuntime().exec(
+ "command.com /C start acrord32" + parameters + " \"" + fileName + "\"");
+ }
+ else {
+ process = Runtime.getRuntime().exec(
+ "cmd /c start acrord32" + parameters + " \"" + fileName + "\"");
+ }
+ }
+ else if (isMac()) {
+ if (parameters.trim().length() == 0) {
+ process = Runtime.getRuntime().exec(
+ new String[] { "/usr/bin/open", fileName });
+ }
+ else {
+ process = Runtime.getRuntime().exec(
+ new String[] { "/usr/bin/open", parameters.trim(), fileName });
+ }
+ }
+ try {
+ if (process != null && waitForTermination)
+ process.waitFor();
+ } catch (InterruptedException ie) {
+ }
+ return process;
+ }
+
+ /**
+ * Opens a PDF document.
+ * @param fileName
+ * @param waitForTermination
+ * @return a process
+ * @throws IOException
+ */
+ public static final Process openDocument(String fileName,
+ boolean waitForTermination) throws IOException {
+ return action(fileName, "", waitForTermination);
+ }
+
+ /**
+ * Opens a PDF document.
+ * @param file
+ * @param waitForTermination
+ * @return a process
+ * @throws IOException
+ */
+ public static final Process openDocument(File file,
+ boolean waitForTermination) throws IOException {
+ return openDocument(file.getAbsolutePath(), waitForTermination);
+ }
+
+ /**
+ * Opens a PDF document.
+ * @param fileName
+ * @return a process
+ * @throws IOException
+ */
+ public static final Process openDocument(String fileName) throws IOException {
+ return openDocument(fileName, false);
+ }
+
+ /**
+ * Opens a PDF document.
+ * @param file
+ * @return a process
+ * @throws IOException
+ */
+ public static final Process openDocument(File file) throws IOException {
+ return openDocument(file, false);
+ }
+
+ /**
+ * Prints a PDF document.
+ * @param fileName
+ * @param waitForTermination
+ * @return a process
+ * @throws IOException
+ */
+ public static final Process printDocument(String fileName,
+ boolean waitForTermination) throws IOException {
+ return action(fileName, "/p", waitForTermination);
+ }
+
+ /**
+ * Prints a PDF document.
+ * @param file
+ * @param waitForTermination
+ * @return a process
+ * @throws IOException
+ */
+ public static final Process printDocument(File file,
+ boolean waitForTermination) throws IOException {
+ return printDocument(file.getAbsolutePath(), waitForTermination);
+ }
+
+ /**
+ * Prints a PDF document.
+ * @param fileName
+ * @return a process
+ * @throws IOException
+ */
+ public static final Process printDocument(String fileName) throws IOException {
+ return printDocument(fileName, false);
+ }
+
+ /**
+ * Prints a PDF document.
+ * @param file
+ * @return a process
+ * @throws IOException
+ */
+ public static final Process printDocument(File file) throws IOException {
+ return printDocument(file, false);
+ }
+
+ /**
+ * Prints a PDF document without opening a Dialog box.
+ * @param fileName
+ * @param waitForTermination
+ * @return a process
+ * @throws IOException
+ */
+ public static final Process printDocumentSilent(String fileName,
+ boolean waitForTermination) throws IOException {
+ return action(fileName, "/p /h", waitForTermination);
+ }
+
+ /**
+ * Prints a PDF document without opening a Dialog box.
+ * @param file
+ * @param waitForTermination
+ * @return a process
+ * @throws IOException
+ */
+ public static final Process printDocumentSilent(File file,
+ boolean waitForTermination) throws IOException {
+ return printDocumentSilent(file.getAbsolutePath(), waitForTermination);
+ }
+
+ /**
+ * Prints a PDF document without opening a Dialog box.
+ * @param fileName
+ * @return a process
+ * @throws IOException
+ */
+ public static final Process printDocumentSilent(String fileName) throws IOException {
+ return printDocumentSilent(fileName, false);
+ }
+
+ /**
+ * Prints a PDF document without opening a Dialog box.
+ * @param file
+ * @return a process
+ * @throws IOException
+ */
+ public static final Process printDocumentSilent(File file) throws IOException {
+ return printDocumentSilent(file, false);
+ }
+
+ /**
+ * Launches a browser opening an URL.
+ * This code was based on the Public Domain class BareBonesBrowserLaunch,
+ * found at <a href="http://www.centerkey.com/java/browser/myapp/BareBonesBrowserLaunch.java">Centerkey</a>.
+ *
+ * @param url the URL you want to open in the browser
+ * @throws IOException
+ */
+ public static final void launchBrowser(String url) throws IOException {
+ try {
+ if (isMac()) {
+ Class macUtils = Class.forName("com.apple.mrj.MRJFileUtils");
+ Method openURL = macUtils.getDeclaredMethod("openURL", new Class[] {String.class});
+ openURL.invoke(null, new Object[] {url});
+ }
+ else if (isWindows())
+ Runtime.getRuntime().exec("rundll32 url.dll,FileProtocolHandler " + url);
+ else { //assume Unix or Linux
+ String[] browsers = {
+ "firefox", "opera", "konqueror", "mozilla", "netscape" };
+ String browser = null;
+ for (int count = 0; count < browsers.length && browser == null; count++)
+ if (Runtime.getRuntime().exec(new String[] {"which", browsers[count]}).waitFor() == 0)
+ browser = browsers[count];
+ if (browser == null)
+ throw new Exception("Could not find web browser.");
+ else
+ Runtime.getRuntime().exec(new String[] {browser, url});
+ }
+ }
+ catch (Exception e) {
+ throw new IOException("Error attempting to launch web browser");
+ }
+ }
+
+ /**
+ * Checks the Operating System.
+ *
+ * @return true if the current os is Windows
+ */
+ public static boolean isWindows() {
+ String os = System.getProperty("os.name").toLowerCase();
+ return os.indexOf("windows") != -1 || os.indexOf("nt") != -1;
+ }
+
+ /**
+ * Checks the Operating System.
+ *
+ * @return true if the current os is Windows
+ */
+ public static boolean isWindows9X() {
+ String os = System.getProperty("os.name").toLowerCase();
+ return os.equals("windows 95") || os.equals("windows 98");
+ }
+
+ /**
+ * Checks the Operating System.
+ *
+ * @return true if the current os is Apple
+ */
+ public static boolean isMac() {
+ String os = System.getProperty("os.name").toLowerCase();
+ return os.indexOf("mac") != -1;
+ }
+
+ /**
+ * Checks the Operating System.
+ *
+ * @return true if the current os is Linux
+ */
+ public static boolean isLinux() {
+ String os = System.getProperty("os.name").toLowerCase();
+ return os.indexOf("linux") != -1;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/tools/LPR.java b/src/main/java/com/lowagie/tools/LPR.java
new file mode 100644
index 0000000..f969f8a
--- /dev/null
+++ b/src/main/java/com/lowagie/tools/LPR.java
@@ -0,0 +1,716 @@
+/*
+ * Class based on freeware by Mario Muller (http://www.hemasoft.de/dev/lprj/ )
+ * posted by Anonymous. */
+package com.lowagie.tools;
+
+import java.io.*;
+import java.net.*;
+import java.util.*;
+
+/**
+ * Modified!
+ *
+ * This class provides methods for the Line Printer Daemon Protocol <BR>
+ * <A HREF="http://www.hemasoft.de/dev/lprj/">more info about LPD/LPR </A>
+ *
+ * @author <A HREF=mailto:supermario@gmx.net>Mario M&uuml;ller </A>
+ * @version 1.0 (12/98)
+ */
+public class LPR {
+ public static final int UNKNOWN = 0;
+
+ private String host;
+
+ private int port = 515;
+
+ private String user = System.getProperty("user.name");
+
+ private Vector jobs = new Vector();
+
+ private String hostname = null;
+
+ private String jobname = "";
+
+ private String cfAlen;
+
+ private String cfA;
+
+ private int copies = 1;
+
+ private int timeout = 60000;
+
+ private boolean cfA_formatted = false; // f
+
+ private boolean cfA_postscript = false; // o
+
+ private boolean cfA_banner = false; // L
+
+ private boolean cfA_pr = false;
+
+ /**
+ * default constructor without parameters, standard port is <B>515 </B>
+ */
+ public LPR() {
+ try {
+ hostname = InetAddress.getLocalHost().getHostName();
+ } catch (Exception e2) {
+ System.out.println("can't resolve hostname");
+ hostname = null;
+ }
+ }
+
+ /**
+ * constuctor with host and username standard port is <B>515 </B>
+ */
+ public LPR(String host, String user) {
+ this();
+ setHost(host);
+ setUser(user);
+ }
+
+ /**
+ * constuctor with host, port and username
+ */
+ public LPR(String host, int port, String user) {
+ this();
+ setHost(host);
+ setUser(user);
+ setPort(port);
+ }
+
+ /**
+ * set LPD host
+ */
+ public void setHost(String value) {
+ host = value;
+ }
+
+ /**
+ * get LPD host
+ */
+ public String getHost() {
+ return host;
+ }
+
+ /**
+ * set LPD port
+ */
+ public void setPort(int value) {
+ port = value;
+ }
+
+ /**
+ * get LPD port
+ */
+ public int getPort() {
+ return port;
+ }
+
+ /**
+ * set username
+ */
+ public void setUser(String value) {
+ user = value;
+ }
+
+ /**
+ * get username
+ */
+ public String getUser() {
+ return user;
+ }
+
+ /**
+ * set the timeout for any commands
+ */
+ public void setTimeout(int timeout) {
+ this.timeout = timeout;
+ }
+
+ /**
+ * get the timeout for any commands
+ */
+ public int getTimeout() {
+ return timeout;
+ }
+
+ /**
+ * get if file printed as postscript file
+ */
+ public boolean getCfA_postscript() {
+ return cfA_postscript;
+ }
+
+ /**
+ * set if file printed as postscript file
+ * <P>
+ * <I>o option in control file </I>
+ * </P>
+ * <P>
+ * This command prints the data file to be printed, treating the data as
+ * standard Postscript input.
+ * </P>
+ */
+ public void setCfA_postscript(boolean value) {
+ cfA_postscript = value;
+
+ if (value) {
+ cfA_formatted = false;
+ }
+ }
+
+ /**
+ * get the job name
+ */
+ public String getCfA_jobname() {
+ return jobname;
+ }
+
+ /**
+ * set the job name
+ * <P>
+ * <I>J option in control file </I>
+ * </P>
+ * <P>
+ * This command sets the job name to be printed on the banner page. The name
+ * of the job must be 99 or fewer octets. It can be omitted. The job name is
+ * conventionally used to display the name of the file or files which were
+ * "printed". It will be ignored unless the print banner command ('L') is
+ * also used.
+ * </P>
+ */
+ public void setCfA_jobname(String value) {
+ jobname = value;
+ cfA_banner = true;
+ }
+
+ /**
+ * get if print file with 'pr' format
+ */
+ public boolean getCfA_pr() {
+ return cfA_pr;
+ }
+
+ /**
+ * <P>
+ * <I>p - Print file with 'pr' format </I>
+ * </P>
+ * <P>
+ * This command causes the data file to be printed with a heading, page
+ * numbers, and pagination. The heading should include the date and time
+ * that printing was started, the title, and a page number identifier
+ * followed by the page number. The title is the name of file as specified
+ * by the 'N' command, unless the 'T' command (title) has been given. After
+ * a page of text has been printed, a new page is started with a new page
+ * number. (There is no way to specify the length of the page.)
+ * </P>
+ */
+ public void setCfA_pr(boolean value) {
+ cfA_pr = value;
+ }
+
+ /**
+ * get if job printed with banner page
+ */
+ public boolean getCfA_banner() {
+ return cfA_banner;
+ }
+
+ /**
+ * set if job printed with banner page
+ * <P>
+ * <I>L option in control file </I>
+ * </P>
+ * <P>
+ * This command causes the banner page to be printed. The user name can be
+ * omitted. The class name for banner page and job name for banner page
+ * commands must precede this command in the control file to be effective.
+ * </P>
+ */
+ public void setCfA_banner(boolean value) {
+ cfA_banner = value;
+ }
+
+ /**
+ * get the host name for this computer
+ */
+ public String getHostname() {
+ return hostname;
+ }
+
+ /**
+ * set the host name for this computer
+ */
+ public void setHostname(String value) {
+ hostname = value;
+ }
+
+ /**
+ * set Copies
+ */
+ public void setCopies(int value) {
+ copies = value;
+ }
+
+ /**
+ * get Copies
+ */
+ public int getCopies() {
+ return copies;
+ }
+
+ /**
+ * Print any waiting jobs
+ * <P>
+ * This command starts the printing process if it not already running.
+ * </P>
+ */
+ public boolean printWaitingJobs(String queue) {
+ Socket printer = connect();
+
+ if (printer != null) {
+ try {
+ BufferedReader in = new BufferedReader(new InputStreamReader(
+ printer.getInputStream()));
+ DataOutputStream out = new DataOutputStream(printer
+ .getOutputStream());
+
+//-------------------------- start -------------------------------
+ out.write(01);
+ out.writeBytes(queue + "\n");
+
+ if (in.read() != 0) {
+ System.err.println("Error while start print jobs on queue " + queue);
+
+ return false;
+ }
+
+ close(printer, in, out);
+
+ return true;
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * Remove job
+ * <P>
+ * This command deletes the print jobs from the specified queue which are
+ * listed as the other operands. If only the agent is given, the command is
+ * to delete the currently active job. Unless the agent is "root", it is not
+ * possible to delete a job which is not owned by the user. This is also the
+ * case for specifying user names instead of numbers. That is, agent "root"
+ * can delete jobs by user name but no other agents can.
+ * </P>
+ */
+ public boolean removeJob(String queue, String user, String jobid) {
+ Socket printer = connect();
+
+ if (printer != null) {
+ try {
+ BufferedReader in = new BufferedReader(new InputStreamReader(
+ printer.getInputStream()));
+ DataOutputStream out = new DataOutputStream(printer
+ .getOutputStream());
+
+//-------------------------- start -------------------------------
+ out.write(05);
+ out.writeBytes(queue + " " + user + " " + jobid + "\n");
+
+ if (in.read() != 0) {
+ System.err.println("Error while remove print job " + jobid + " on queue " + queue);
+ return false;
+ }
+
+ close(printer, in, out);
+
+ return true;
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * gets the state and description of the printer queue in short or long
+ * format
+ */
+ public String getQueueState(String queue, boolean shortstate) {
+ Socket printer = connect();
+
+ if (printer != null) {
+ try {
+ BufferedReader in = new BufferedReader(new InputStreamReader(
+ printer.getInputStream()));
+
+ DataOutputStream out = new DataOutputStream(printer
+ .getOutputStream());
+
+ if (shortstate) {
+ out.write(03);
+ } else {
+ out.write(04);
+ }
+
+ out.writeBytes(queue + " \n");
+
+ LineNumberReader lnr = new LineNumberReader(in);
+ String line = in.readLine();
+ close(printer, in, out);
+
+ return line;
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ return null;
+ }
+
+ /**
+ * print a byte array with the document name as parameter
+ *
+ * @see LPR#print(String queue, String dfA, String document) {
+ */
+ public String print(String queue, byte[] dfA, String document) {
+ PrintJob job = new PrintJob(queue, dfA, document);
+ job.start();
+
+ return job.getJobId();
+ }
+
+ /**
+ * print a String with the document name as parameter
+ *
+ * @see LPR#print(String queue, String dfA, String document) {
+ */
+ public String print(String queue, String dfA, String document) {
+ PrintJob job = new PrintJob(queue, dfA.toCharArray(), document);
+ job.start();
+
+ return job.getJobId();
+ }
+
+ /**
+ * print a char array with the document name as parameter
+ *
+ * @see LPR#print(String queue, String dfA, String document) {
+ */
+ public String print(String queue, char[] dfA, String document) {
+ PrintJob job = new PrintJob(queue, dfA, document);
+ job.start();
+
+ return job.getJobId();
+ }
+
+ /**
+ * print a file with the document name as parameter
+ *
+ * @see LPR#print(String queue, String dfA, String document) {
+ */
+ public String print(String queue, File file, String document) {
+ if (file.exists()) {
+ try {
+ FileInputStream in = new FileInputStream(file);
+ byte[] data = new byte[(int) file.length()];
+ int count = 0;
+ int size = (int) file.length();
+
+ while (count < size) {
+ count += in.read(data, count, size - count);
+ }
+
+ in.close();
+
+ PrintJob job = new PrintJob(queue, data, document);
+ job.start();
+ waitFor(job.getJobId());
+
+ return job.getJobId();
+ } catch (Exception e) {
+ System.out.println("error while printig file " + file.getName()
+ + "\n" + e.getMessage());
+ }
+ } else {
+ System.out.println("file " + file.getName() + " not found");
+ }
+
+ return null;
+ }
+
+ /**
+ * wait until job is printed
+ */
+ public void waitFor(String jobid) {
+ try {
+ while (jobs.contains(jobid)) {
+ Thread.sleep(500);
+ }
+ } catch (Exception e) {
+ }
+ }
+
+ /**
+ * internal funktion for printing
+ */
+ private boolean print(String queue, String document, byte[] dfA1,
+ char[] dfA2, int mode, String jobid) {
+ Socket printer = connect();
+
+ if (printer != null) {
+ boolean rc = true;
+ makecfA(document, jobid);
+
+ String dfAlen = String.valueOf(((mode == 1) ? dfA1.length
+ : dfA2.length));
+
+ try {
+ BufferedReader in = new BufferedReader(new InputStreamReader(
+ printer.getInputStream()));
+ DataOutputStream out = new DataOutputStream(printer
+ .getOutputStream());
+ System.out.println("jobid: " + jobid + " queue: " + queue);
+
+//-------------------------- start -------------------------------
+ out.write(02);
+ out.writeBytes(queue + "\n");
+ out.flush();
+
+ if (in.read() != 0) {
+ rc = false;
+ System.out.println("Error while start printing on queue "
+ + queue);
+ }
+
+//----------------------- write control file ----------------------------
+ out.write(02);
+ out.writeBytes(cfAlen);
+ out.writeBytes(" ");
+ out.writeBytes("cfA" + jobid + user + "\n");
+ out.flush();
+
+ if (in.read() != 0) {
+ rc = false;
+ System.out
+ .println("Error while start sending control file");
+ }
+
+ out.writeBytes(cfA);
+ out.writeByte(0);
+ out.flush();
+
+ if (in.read() != 0) {
+ rc = false;
+ System.out.println("Error while sending control file");
+ }
+
+//----------------------- write data file ----------------------------
+ out.write(03);
+
+ /**
+ * Länge des Datenfiles
+ */
+ out.writeBytes(dfAlen);
+ out.writeBytes(" ");
+ out.writeBytes("dfA" + jobid + user + "\n");
+ out.flush();
+
+ if (in.read() != 0) {
+ rc = false;
+ System.err.println("Error while start sending data file");
+ }
+
+ if (mode == 1) {
+ out.write(dfA1);
+ } else {
+ out.writeBytes(new String(dfA2));
+ }
+
+ out.writeByte(0);
+ out.flush();
+
+ if (in.read() != 0) {
+ rc = false;
+ System.out.println("Error while sending data file");
+ }
+ out.flush();
+ close(printer, in, out);
+ } catch (Exception e) {
+ rc = false;
+ e.printStackTrace();
+ }
+
+ return rc;
+ }
+
+ return false;
+ }
+
+ /**
+ * connect to the LPD Server
+ */
+ private Socket connect() {
+ try {
+ System.out.println("Connect with " + host);
+
+ Socket socket = new Socket(InetAddress.getByName(host), port);
+ socket.setSoTimeout(timeout);
+
+ return socket;
+ } catch (Exception e1) {
+ System.out
+ .println("Error while connecting to " + host + ":" + port);
+ System.out.println(e1.getMessage());
+ }
+
+ return null;
+ }
+
+ /**
+ * closed connection to the LPD
+ */
+ private void close(Socket socket, BufferedReader in, DataOutputStream out) {
+ try {
+ in.close();
+ out.close();
+ socket.close();
+ } catch (Exception e) {
+ System.out.println("Errror while closing printerport");
+ System.out.println(e.getMessage());
+ }
+ }
+
+ /**
+ * internal methode to create the control file
+ */
+ private void makecfA(String document, String jobid) {
+ cfA = "";
+
+ if (hostname != null) {
+ cfA += ("H" + hostname + "\n");
+ }
+
+ cfA += ("P" + user + "\n");
+ cfA += ("J" + document + "\n");
+ cfA += ("L" + user + "\n");
+
+ if (cfA_formatted) {
+ cfA += ("f" + document + "\n");
+ }
+
+ if (cfA_postscript) {
+ cfA += ("o" + document + "\n");
+ }
+
+ if (cfA_banner) {
+ cfA += ("L" + jobname + "\n");
+ }
+
+ cfA += ("UdfA" + jobid + hostname + "\n");
+
+ for (int i = 0; i < copies; i++) {
+ cfA += ("ldfA" + jobid + user + "\n");
+ }
+
+ cfA += ("N" + document + "\n");
+ cfAlen = String.valueOf(cfA.length());
+
+ System.out.println(cfA);
+
+ }
+
+ private String getNewJobId() {
+ return fillLeft(String.valueOf((int) Math.floor(Math.random() * 999)),
+ 3, "0");
+ }
+
+ private String fillLeft(String data, int size, String filler) {
+ while (data.length() < size) {
+ data = filler + data;
+ }
+
+ return data;
+ }
+
+ /** ******************* Job ************************ */
+ private class PrintJob extends Thread {
+ String queue;
+
+ String document;
+
+ String id;
+
+ int mode;
+
+ private byte[] dfA1 = null;
+
+ private char[] dfA2 = null;
+
+ public PrintJob(String queue, byte[] data, String document) {
+ super();
+ this.queue = queue;
+ this.dfA1 = data;
+ this.document = document;
+ this.mode = 1;
+ this.id = getNewJobId();
+ jobs.addElement(id);
+ System.out.println("Printjob (byte) " + id + " queue=" + queue + " document=" + document);
+ }
+
+ public PrintJob(String queue, char[] data, String document) {
+ super();
+ this.queue = queue;
+ this.dfA2 = data;
+ this.document = document;
+ this.mode = 2;
+ this.id = getNewJobId();
+ jobs.addElement(id);
+ System.out.println("Printjob (char) " + id + " queue=" + queue + " document=" + document);
+ }
+
+ public void run() {
+ boolean rc = false;
+ int i = 0;
+ System.out.println("Printjob (char) " + id + " queue=" + queue + " document=" + document);
+
+ while (!rc) {
+ try {
+ i++;
+ rc = print(queue, document, dfA1, dfA2, mode, id);
+ } catch (Exception e) {
+ System.err.println(e.getMessage());
+ }
+
+ if (!rc && (i > 5)) {
+ break;
+ }
+
+ if (!rc) {
+ try {
+ Thread.sleep(1000);
+ } catch (InterruptedException ex) {
+ break;
+ }
+ }
+ }
+
+ jobs.removeElement(id);
+
+ if (rc) {
+ System.out.println("Job " + id + " allready printed and removed from queue (" + i + " trys)");
+ } else {
+ System.out.println("Job " + id + " not printed and removed from queue (" + i + " trys)");
+ }
+ }
+
+ public String getJobId() {
+ return this.id;
+ }
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/tools/SwingWorker.java b/src/main/java/com/lowagie/tools/SwingWorker.java
new file mode 100644
index 0000000..634a61a
--- /dev/null
+++ b/src/main/java/com/lowagie/tools/SwingWorker.java
@@ -0,0 +1,127 @@
+package com.lowagie.tools;
+import javax.swing.SwingUtilities;
+
+/**
+ * This is the 3rd version of SwingWorker (also known as
+ * SwingWorker 3), an abstract class that you subclass to
+ * perform GUI-related work in a dedicated thread. For
+ * instructions on using this class, see:
+ *
+ * http://java.sun.com/docs/books/tutorial/uiswing/misc/threads.html
+ */
+public abstract class SwingWorker {
+ private Object value; // see getValue(), setValue()
+ private Thread thread;
+
+ /**
+ * Class to maintain reference to current worker thread
+ * under separate synchronization control.
+ */
+ private static class ThreadVar {
+ private Thread thread;
+ ThreadVar(Thread t) { thread = t; }
+ synchronized Thread get() { return thread; }
+ synchronized void clear() { thread = null; }
+ }
+
+ private ThreadVar threadVar;
+
+ /**
+ * Get the value produced by the worker thread, or null if it
+ * hasn't been constructed yet.
+ */
+ protected synchronized Object getValueX() {
+ return value;
+ }
+
+ /**
+ * Set the value produced by worker thread
+ */
+ private synchronized void setValueX(Object x) {
+ value = x;
+ }
+
+ /**
+ * Compute the value to be returned by the <code>get</code> method.
+ */
+ public abstract Object construct();
+
+ /**
+ * Called on the event dispatching thread (not on the worker thread)
+ * after the <code>construct</code> method has returned.
+ */
+ public void finished() {
+ }
+
+ /**
+ * A new method that interrupts the worker thread. Call this method
+ * to force the worker to stop what it's doing.
+ */
+ public void interrupt() {
+ Thread t = threadVar.get();
+ if (t != null) {
+ t.interrupt();
+ }
+ threadVar.clear();
+ }
+
+ /**
+ * Return the value created by the <code>construct</code> method.
+ * Returns null if either the constructing thread or the current
+ * thread was interrupted before a value was produced.
+ *
+ * @return the value created by the <code>construct</code> method
+ */
+ public Object get() {
+ while (true) {
+ Thread t = threadVar.get();
+ if (t == null) {
+ return getValueX();
+ }
+ try {
+ t.join();
+ }
+ catch (InterruptedException e) {
+ Thread.currentThread().interrupt(); // propagate
+ return null;
+ }
+ }
+ }
+
+
+ /**
+ * Start a thread that will call the <code>construct</code> method
+ * and then exit.
+ */
+ public SwingWorker() {
+ final Runnable doFinished = new Runnable() {
+ public void run() { finished(); }
+ };
+
+ Runnable doConstruct = new Runnable() {
+ public void run() {
+ try {
+ setValueX(construct());
+ }
+ finally {
+ threadVar.clear();
+ }
+
+ SwingUtilities.invokeLater(doFinished);
+ }
+ };
+
+ Thread t = new Thread(doConstruct);
+ threadVar = new ThreadVar(t);
+ }
+
+ /**
+ * Start the worker thread.
+ */
+ public void start() {
+ Thread t = threadVar.get();
+ if (t != null) {
+ t.start();
+ }
+ }
+}
diff --git a/src/main/java/com/lowagie/tools/ToolMenuItems.java b/src/main/java/com/lowagie/tools/ToolMenuItems.java
new file mode 100644
index 0000000..fdcf916
--- /dev/null
+++ b/src/main/java/com/lowagie/tools/ToolMenuItems.java
@@ -0,0 +1,84 @@
+/*
+ * $Id: ToolMenuItems.java,v 1.4 2005/08/29 08:44:16 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2005 by Bruno Lowagie.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+package com.lowagie.tools;
+
+/**
+ * Keeps all the possible menuitems.
+ */
+public interface ToolMenuItems {
+
+ /** An item in the menubar. */
+ public static final String FILE = "File";
+ /** An item in the menubar. */
+ public static final String CLOSE = "Close";
+ /** An item in the menubar. */
+ public static final String TOOLS = "Tools";
+ /** An item in the menubar. */
+ public static final String HELP = "Help";
+ /** An item in the menubar. */
+ public static final String VERSION = "Version";
+ /** An item in the menubar. */
+ public static final String ABOUT = "About";
+ /** An item in the menubar. */
+ public static final String TOOL = "Tool";
+ /** An item in the menubar. */
+ public static final String USAGE = "Usage";
+ /** An item in the menubar. */
+ public static final String ARGUMENTS = "Arguments";
+ /** An item in the menubar. */
+ public static final String EXECUTE = "Execute";
+ /** An item in the menubar. */
+ public static final String EXECUTESHOW = "Execute+Open";
+ /** An item in the menubar. */
+ public static final String EXECUTEPRINT = "Execute+Printdialog";
+ /** An item in the menubar. */
+ public static final String EXECUTEPRINTSILENT = "Execute+Print";
+
+}
diff --git a/src/main/java/com/lowagie/tools/Toolbox.java b/src/main/java/com/lowagie/tools/Toolbox.java
new file mode 100644
index 0000000..89a0bc3
--- /dev/null
+++ b/src/main/java/com/lowagie/tools/Toolbox.java
@@ -0,0 +1,354 @@
+/*
+ * $Id: Toolbox.java,v 1.16 2006/05/29 10:30:39 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2005 by Bruno Lowagie.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+package com.lowagie.tools;
+
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.KeyEvent;
+import java.beans.PropertyVetoException;
+import java.io.IOException;
+import java.io.PipedInputStream;
+import java.io.PipedOutputStream;
+import java.io.PrintStream;
+import java.util.Iterator;
+import java.util.Properties;
+import java.util.TreeMap;
+
+import javax.swing.Box;
+import javax.swing.JDesktopPane;
+import javax.swing.JFrame;
+import javax.swing.JInternalFrame;
+import javax.swing.JMenu;
+import javax.swing.JMenuBar;
+import javax.swing.JMenuItem;
+import javax.swing.JOptionPane;
+import javax.swing.JScrollPane;
+import javax.swing.JSplitPane;
+import javax.swing.JTextArea;
+
+import com.lowagie.tools.plugins.AbstractTool;
+
+import java.awt.Toolkit;
+import java.awt.Dimension;
+
+/**
+ * This is a utility that allows you to use a number of iText tools.
+ */
+public class Toolbox extends JFrame implements ToolMenuItems, ActionListener {
+
+ /** The DesktopPane of the toolbox. */
+ private JDesktopPane desktop;
+ /** The ConsolePane of the toolbox. */
+ private JScrollPane console;
+
+ /** The list of tools in the toolbox. */
+ private Properties toolmap = new Properties();
+
+ /** x-coordinate of the location of a new internal frame. */
+ private int locationX = 0;
+
+ /** y-coordinate of the location of a new internal frame. */
+ private int locationY = 0;
+
+ /**
+ * Constructs the Toolbox object.
+ */
+ public Toolbox() {
+ super();
+ setSize(600, 500);
+ setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+ setResizable(true);
+ setTitle("iText Toolbox");
+ setJMenuBar(getMenubar());
+ desktop = new JDesktopPane();
+ Console c;
+ try {
+ c = new Console();
+ console = new JScrollPane(c.textArea);
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ JSplitPane splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, desktop, console);
+ splitPane.setContinuousLayout(true);
+ splitPane.setOneTouchExpandable(true);
+ splitPane.setDividerLocation(300);
+ setContentPane(splitPane);
+ centerFrame(this);
+ setVisible(true);
+ }
+
+ /**
+ * Starts the Toolbox utility.
+ *
+ * @param args
+ * no arguments needed
+ */
+ public static void main(String[] args) {
+ Toolbox toolbox = new Toolbox();
+ if(args.length==0){
+
+ }else{
+ try {
+ AbstractTool tool = toolbox.createFrame(args[0]);
+ String[] nargs=new String[args.length-1];
+ System.arraycopy(args,1,nargs,0,args.length-1);
+ tool.setArguments(nargs);
+ tool.execute();
+ }
+ catch (PropertyVetoException ex) {
+ }
+ catch (ClassNotFoundException ex) {
+ }
+ catch (IllegalAccessException ex) {
+ }
+ catch (InstantiationException ex) {
+ }
+ }
+ }
+
+ /**
+ * Gets the menubar.
+ *
+ * @return a menubar
+ */
+ private JMenuBar getMenubar() {
+ Properties p = new Properties();
+ try {
+ p.load(Toolbox.class.getClassLoader().getResourceAsStream(
+ "com/lowagie/tools/plugins/tools.txt"));
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ toolmap = new Properties();
+ TreeMap tmp = new TreeMap();
+ tmp.putAll(p);
+ JMenuBar menubar = new JMenuBar();
+ JMenu file = new JMenu(FILE);
+ JMenuItem close = new JMenuItem(CLOSE);
+ close.setMnemonic(KeyEvent.VK_C);
+ close.addActionListener(this);
+ file.add(close);
+ JMenu tools = new JMenu(TOOLS);
+ file.setMnemonic(KeyEvent.VK_T);
+ String name, tool;
+ JMenu current = null;
+ JMenuItem item;
+ for (Iterator i = tmp.keySet().iterator(); i.hasNext();) {
+ name = (String) i.next();
+ if (current == null || !name.startsWith(current.getText())) {
+ current = new JMenu(name.substring(0, name.indexOf(".")));
+ tools.add(current);
+ }
+ item = new JMenuItem(name.substring(current.getText().length() + 1));
+ item.addActionListener(this);
+ tool = (String) tmp.get(name);
+ try {
+ Class.forName(tool);
+ toolmap.put(item.getText(), tool);
+ current.add(item);
+ } catch (ClassNotFoundException e) {
+ System.err.println("Plugin " + name
+ + " was not found in your CLASSPATH.");
+ }
+ }
+ JMenu help = new JMenu(HELP);
+ JMenuItem about = new JMenuItem(ABOUT);
+ about.setMnemonic(KeyEvent.VK_A);
+ about.addActionListener(this);
+ help.add(about);
+ JMenuItem versions = new JMenuItem(VERSION);
+ versions.addActionListener(this);
+ help.add(versions);
+ menubar.add(file);
+ menubar.add(tools);
+ menubar.add(Box.createGlue());
+ menubar.add(help);
+ return menubar;
+ }
+
+ /**
+ * Creates an Internal Frame.
+ *
+ * @param name
+ * the name of the app
+ * @throws ClassNotFoundException
+ * @throws IllegalAccessException
+ * @throws InstantiationException
+ * @throws PropertyVetoException
+ */
+ public AbstractTool createFrame(String name) throws InstantiationException,
+ IllegalAccessException, ClassNotFoundException,
+ PropertyVetoException {
+ AbstractTool ti = (AbstractTool) Class.forName(
+ (String) toolmap.get(name)).newInstance();
+ JInternalFrame f = ti.getInternalFrame();
+ f.setLocation(locationX, locationY);
+ locationX += 25;
+ if (locationX > this.getWidth() + 50)
+ locationX = 0;
+ locationY += 25;
+ if (locationY > this.getHeight() + 50)
+ locationY = 0;
+ f.setVisible(true);
+ desktop.add(f);
+ f.setSelected(true);
+ return ti;
+ }
+
+ public static void centerFrame(JFrame f) {
+ Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
+ Dimension frameSize = f.getSize();
+ if (frameSize.height > screenSize.height) {
+ frameSize.height = screenSize.height;
+ }
+ if (frameSize.width > screenSize.width) {
+ frameSize.width = screenSize.width;
+ }
+ f.setLocation((screenSize.width - frameSize.width) / 2,
+ (screenSize.height - frameSize.height) / 2);
+ }
+
+ /**
+ * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
+ */
+ public void actionPerformed(ActionEvent evt) {
+ if (CLOSE.equals(evt.getActionCommand())) {
+ System.out.println("The Toolbox is closed.");
+ System.exit(0);
+ } else if (ABOUT.equals(evt.getActionCommand())) {
+ System.out
+ .println("The iText Toolbox is part of iText, a Free Java-PDF Library.\nVisit http://www.lowagie.com/iText/toolbox.html for more info.");
+ try {
+ Executable
+ .launchBrowser("http://www.lowagie.com/iText/toolbox.html");
+ } catch (IOException ioe) {
+ JOptionPane
+ .showMessageDialog(
+ this,
+ "The iText Toolbox is part of iText, a Free Java-PDF Library.\nVisit http://www.lowagie.com/iText/toolbox.html for more info.");
+ }
+ } else if (VERSION.equals(evt.getActionCommand())) {
+ JFrame f = new Versions();
+ centerFrame(f);
+ f.setVisible(true);
+ } else {
+ try {
+ createFrame(evt.getActionCommand());
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ /**
+ * A Class that redirects output to System.out and System.err.
+ */
+ public class Console {
+ PipedInputStream piOut;
+ PipedInputStream piErr;
+ PipedOutputStream poOut;
+ PipedOutputStream poErr;
+ JTextArea textArea = new JTextArea();
+
+ /**
+ * Creates a new Console object.
+ * @param columns
+ * @param rows
+ * @throws IOException
+ */
+ public Console() throws IOException {
+ // Set up System.out
+ piOut = new PipedInputStream();
+ poOut = new PipedOutputStream(piOut);
+ System.setOut(new PrintStream(poOut, true));
+
+ // Set up System.err
+ piErr = new PipedInputStream();
+ poErr = new PipedOutputStream(piErr);
+ System.setErr(new PrintStream(poErr, true));
+
+ // Add a scrolling text area
+ textArea.setEditable(false);
+
+ // Create reader threads
+ new ReaderThread(piOut).start();
+ new ReaderThread(piErr).start();
+ }
+
+ class ReaderThread extends Thread {
+ PipedInputStream pi;
+
+ ReaderThread(PipedInputStream pi) {
+ this.pi = pi;
+ }
+
+ /**
+ * @see java.lang.Thread#run()
+ */
+ public void run() {
+ final byte[] buf = new byte[1024];
+
+ while (true) {
+ try {
+ final int len = pi.read(buf);
+ if (len == -1) {
+ break;
+ }
+ textArea.append(new String(buf, 0, len));
+ textArea.setCaretPosition(textArea.getDocument().getLength());
+
+ } catch (IOException e) {
+ }
+ }
+ }
+ }
+ }
+
+}
diff --git a/src/main/java/com/lowagie/tools/Versions.java b/src/main/java/com/lowagie/tools/Versions.java
new file mode 100644
index 0000000..dd0796f
--- /dev/null
+++ b/src/main/java/com/lowagie/tools/Versions.java
@@ -0,0 +1,143 @@
+/*
+ * $Id: Versions.java,v 1.7 2006/02/17 11:54:42 psoares33 Exp $
+ * $Name: $
+ *
+ * Copyright 2005 by Carsten Hammer.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+package com.lowagie.tools;
+
+import java.awt.*;
+import javax.swing.*;
+import java.awt.BorderLayout;
+import com.lowagie.text.Document;
+import com.lowagie.tools.plugins.*;
+import java.util.Iterator;
+import java.util.TreeSet;
+import java.awt.Dimension;
+import java.util.Properties;
+
+/**
+ * JFrame that shows the versions of all the plugins.
+ */
+public class Versions extends JFrame {
+ /**
+ * Constructs a JFrame.
+ */
+ public Versions() {
+ super("Plugins and their version");
+ try {
+ jbInit();
+ } catch (Exception ex) {
+ ex.printStackTrace();
+ }
+ }
+
+ /**
+ * Main method (test purposes only)
+ *
+ * @param args
+ */
+ public static void main(String[] args) {
+ Versions untitled1 = new Versions();
+ }
+
+ private void jbInit() throws Exception {
+ this.getContentPane().setLayout(borderLayout1);
+ StringBuffer sb = new StringBuffer();
+ sb.append("<html>");
+
+ Iterator it = new TreeSet(AbstractTool.versionsarray).iterator();
+
+ while (it.hasNext()) {
+ sb.append("<p>");
+ sb.append((String) it.next());
+ sb.append("</p>");
+ }
+
+ sb.append("</html>");
+ jLabel1.setText(sb.toString());
+ jScrollPane1.setMinimumSize(new Dimension(160, 140));
+ this.getContentPane().add(jScrollPane1, java.awt.BorderLayout.CENTER);
+ Properties properties = System.getProperties();
+ Runtime runtime = Runtime.getRuntime();
+ sb = new StringBuffer();
+ sb.append("<html>");
+ sb.append("<p>iText version: "
+ + Document.getVersion() + "</p>");
+ sb.append("<p>java.version: "
+ + properties.getProperty("java.version") + "</p>");
+ sb.append("<p>java.vendor: "
+ + properties.getProperty("java.vendor") + "</p>");
+ sb.append("<p>java.home: " + properties.getProperty("java.home")
+ + "</p>");
+ sb.append("<p>java.freeMemory: "
+ + String.valueOf(runtime.freeMemory()) + " bytes" + "</p>");
+ sb.append("<p>java.totalMemory: "
+ + String.valueOf(runtime.totalMemory()) + " bytes" + "</p>");
+ sb.append("<p>user.home: " + properties.getProperty("user.home")
+ + "</p>");
+ sb.append("<p>os.name: " + properties.getProperty("os.name")
+ + "</p>");
+ sb.append("<p>os.arch: " + properties.getProperty("os.arch")
+ + "</p>");
+ sb.append("<p>os.version: " + properties.getProperty("os.version")
+ + "</p>");
+ sb.append("</html>");
+ jLabel2.setText(sb.toString());
+ jScrollPane1.setViewportView(jLabel1);
+ this.getContentPane().add(jLabel2, java.awt.BorderLayout.NORTH);
+ pack();
+ }
+
+ JLabel jLabel1 = new JLabel();
+
+ BorderLayout borderLayout1 = new BorderLayout();
+
+ JLabel jLabel2 = new JLabel();
+
+ JScrollPane jScrollPane1 = new JScrollPane();
+}
+
diff --git a/src/main/java/com/lowagie/tools/arguments/BitsetArgument.java b/src/main/java/com/lowagie/tools/arguments/BitsetArgument.java
new file mode 100644
index 0000000..63d79af
--- /dev/null
+++ b/src/main/java/com/lowagie/tools/arguments/BitsetArgument.java
@@ -0,0 +1,136 @@
+/*
+ * $Id: BitsetArgument.java,v 1.5 2006/05/30 09:13:00 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2005 by Bruno Lowagie.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+package com.lowagie.tools.arguments;
+
+import java.awt.event.ActionEvent;
+
+import javax.swing.JCheckBox;
+import javax.swing.JOptionPane;
+
+import com.lowagie.tools.plugins.AbstractTool;
+
+/**
+ * Argument that results in a set of "1" and "0" values.
+ */
+public class BitsetArgument extends ToolArgument {
+ /** These are the different options that can be true or false. */
+ private JCheckBox[] options;
+
+ /**
+ * Constructs an BitsetArgument.
+ * @param tool the tool that needs this argument
+ * @param name the name of the argument
+ * @param description the description of the argument
+ * @param options the different options that can be true or false
+ */
+ public BitsetArgument(AbstractTool tool, String name, String description, String[] options) {
+ super(tool, name, description, String.class.getName());
+ this.options = new JCheckBox[options.length];
+ for (int i = 0; i < options.length; i++) {
+ this.options[i] = new JCheckBox(options[i]);
+ }
+ }
+
+ /**
+ * Gets the argument as an object.
+ * @return an object
+ * @throws InstantiationException
+ */
+ public Object getArgument() throws InstantiationException {
+ return value;
+ }
+
+ /**
+ * @see com.lowagie.tools.arguments.ToolArgument#getUsage()
+ */
+ public String getUsage() {
+ StringBuffer buf = new StringBuffer(super.getUsage());
+ buf.append(" possible options:\n");
+ for (int i = 0; i < options.length; i++) {
+ buf.append(" - ");
+ buf.append(options[i].getText());
+ buf.append("\n");
+ }
+ return buf.toString();
+ }
+
+ /**
+ * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
+ */
+ public void actionPerformed(ActionEvent evt) {
+ Object[] message = new Object[1 + options.length];
+ message[0] = "Check the options you need:";
+ for(int i = 0; i < options.length; i++ ) {
+ message[i+1] = options[i];
+ }
+ int result = JOptionPane.showOptionDialog(
+ tool.getInternalFrame(),
+ message,
+ description,
+ JOptionPane.OK_CANCEL_OPTION,
+ JOptionPane.QUESTION_MESSAGE,
+ null,
+ null,
+ null
+ );
+ if (result == 0) {
+ StringBuffer buf = new StringBuffer();
+ for (int i = 0; i < options.length; i++) {
+ if (options[i].isSelected()) {
+ buf.append("1");
+ }
+ else {
+ buf.append("0");
+ }
+ }
+ setValue(buf.toString());
+ }
+ }
+}
diff --git a/src/main/java/com/lowagie/tools/arguments/DirFilter.java b/src/main/java/com/lowagie/tools/arguments/DirFilter.java
new file mode 100644
index 0000000..def64a4
--- /dev/null
+++ b/src/main/java/com/lowagie/tools/arguments/DirFilter.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright 2005 by Johannes Schindelin.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+package com.lowagie.tools.arguments;
+
+import java.io.File;
+
+import javax.swing.filechooser.FileFilter;
+
+/**
+ * Filters directories in a JFileChooser.
+ */
+public class DirFilter extends FileFilter {
+
+ /**
+ * @see javax.swing.filechooser.FileFilter#accept(java.io.File)
+ */
+ public boolean accept(File f) {
+ if (f.isDirectory()) return true;
+ return false;
+ }
+
+ /**
+ * @see javax.swing.filechooser.FileFilter#getDescription()
+ */
+ public String getDescription() {
+ return "directories";
+ }
+
+}
diff --git a/src/main/java/com/lowagie/tools/arguments/FileArgument.java b/src/main/java/com/lowagie/tools/arguments/FileArgument.java
new file mode 100644
index 0000000..f110bbe
--- /dev/null
+++ b/src/main/java/com/lowagie/tools/arguments/FileArgument.java
@@ -0,0 +1,165 @@
+/*
+ * $Id: FileArgument.java,v 1.7 2006/05/30 09:13:00 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2005 by Bruno Lowagie.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+package com.lowagie.tools.arguments;
+
+import java.awt.event.ActionEvent;
+import java.io.File;
+
+import javax.swing.JFileChooser;
+import javax.swing.filechooser.FileFilter;
+
+import com.lowagie.tools.plugins.AbstractTool;
+
+/**
+ * ToolArgument class if the argument is a java.io.File.
+ */
+public class FileArgument extends ToolArgument {
+ /** a filter to put on the FileChooser. */
+ private FileFilter filter;
+ /** indicates if the argument has to point to a new or an existing file. */
+ private boolean newFile;
+ /** the label */
+ LabelAccessory label = null;
+// final static String PROPERTYFILENAME="inputfilename";
+ /**
+ * Constructs a FileArgument.
+ * @param tool the tool that needs this argument
+ * @param name the name of the argument
+ * @param description the description of the argument
+ * @param newFile makes the difference between an Open or Save dialog
+ * @param filter
+ */
+ public FileArgument(AbstractTool tool, String name, String description, boolean newFile, FileFilter filter) {
+ super(tool, name, description, File.class.getName());
+ this.newFile = newFile;
+ this.filter = filter;
+ }
+ /**
+ * Constructs a FileArgument.
+ * @param tool the tool that needs this argument
+ * @param name the name of the argument
+ * @param description the description of the argument
+ * @param newFile makes the difference between an Open or Save dialog
+ */
+ public FileArgument(AbstractTool tool, String name, String description, boolean newFile) {
+ this(tool, name, description, newFile, null);
+ }
+
+ /**
+ * Gets the argument as an object.
+ * @return an object
+ * @throws InstantiationException
+ */
+ public Object getArgument() throws InstantiationException {
+ if (value == null) return null;
+ try {
+ return new File(value);
+ } catch (Exception e) {
+ throw new InstantiationException(e.getMessage());
+ }
+ }
+
+ /**
+ * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
+ */
+ public void actionPerformed(ActionEvent e) {
+ JFileChooser fc = new JFileChooser();
+
+ if (filter != null) {
+ fc.setFileFilter(filter);
+ if (filter instanceof DirFilter)
+ fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
+ }
+ if (label != null) {
+ fc.setAccessory(label);
+ fc.addPropertyChangeListener(
+ JFileChooser.SELECTED_FILE_CHANGED_PROPERTY, label);
+ }
+ if (newFile) {
+ fc.showSaveDialog(tool.getInternalFrame());
+ }
+ else {
+ fc.showOpenDialog(tool.getInternalFrame());
+ }
+ try {
+ setValue(fc.getSelectedFile().getAbsolutePath());
+ }
+ catch(NullPointerException npe) {
+ }
+ }
+
+ /**
+ * @return Returns the filter.
+ */
+ public FileFilter getFilter() {
+ return filter;
+ }
+ /**
+ * @param filter The filter to set.
+ */
+ public void setFilter(FileFilter filter) {
+ this.filter = filter;
+ }
+ /**
+ * @return Returns the label.
+ */
+ public LabelAccessory getLabel() {
+ return label;
+ }
+ /**
+ * @param label The label to set.
+ */
+ public void setLabel(LabelAccessory label) {
+ this.label = label;
+ }
+
+
+
+}
diff --git a/src/main/java/com/lowagie/tools/arguments/ImageArgument.java b/src/main/java/com/lowagie/tools/arguments/ImageArgument.java
new file mode 100644
index 0000000..063d347
--- /dev/null
+++ b/src/main/java/com/lowagie/tools/arguments/ImageArgument.java
@@ -0,0 +1,117 @@
+/*
+ * $Id: ImageArgument.java,v 1.4 2006/05/30 09:13:00 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2005 by Bruno Lowagie.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+package com.lowagie.tools.arguments;
+
+import java.awt.event.ActionEvent;
+
+import javax.swing.JFileChooser;
+import javax.swing.filechooser.FileFilter;
+
+import com.lowagie.text.Image;
+import com.lowagie.tools.plugins.AbstractTool;
+
+/**
+ * ToolArgument class if the argument is a com.lowagie.text.Image.
+ */
+public class ImageArgument extends ToolArgument {
+ /** a filter to put on the FileChooser. */
+ private FileFilter filter;
+
+ /**
+ * Constructs a FileArgument.
+ * @param tool the tool that needs this argument
+ * @param name the name of the argument
+ * @param description the description of the argument
+ * @param filter a custom filter
+ */
+ public ImageArgument(AbstractTool tool, String name, String description, FileFilter filter) {
+ super(tool, name, description, Image.class.getName());
+ this.filter = filter;
+ }
+
+ /**
+ * Constructs a FileArgument.
+ * @param tool the tool that needs this argument
+ * @param name the name of the argument
+ * @param description the description of the argument
+ */
+ public ImageArgument(AbstractTool tool, String name, String description) {
+ this(tool, name, description, new ImageFilter());
+ }
+
+ /**
+ * Gets the argument as an object.
+ * @return an object
+ * @throws InstantiationException
+ */
+ public Object getArgument() throws InstantiationException {
+ if (value == null) return null;
+ try {
+ return Image.getInstance(value);
+ } catch (Exception e) {
+ throw new InstantiationException(e.getMessage());
+ }
+ }
+
+ /**
+ * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
+ */
+ public void actionPerformed(ActionEvent e) {
+ JFileChooser fc = new JFileChooser();
+ if (filter != null) fc.setFileFilter(filter);
+ fc.showOpenDialog(tool.getInternalFrame());
+ try {
+ setValue(fc.getSelectedFile().getAbsolutePath());
+ }
+ catch(NullPointerException npe) {
+ }
+ }
+
+}
diff --git a/src/main/java/com/lowagie/tools/arguments/ImageFilter.java b/src/main/java/com/lowagie/tools/arguments/ImageFilter.java
new file mode 100644
index 0000000..24c1d64
--- /dev/null
+++ b/src/main/java/com/lowagie/tools/arguments/ImageFilter.java
@@ -0,0 +1,135 @@
+/*
+ * $Id: ImageFilter.java,v 1.2 2006/02/02 18:50:07 psoares33 Exp $
+ * $Name: $
+ *
+ * Copyright 2005 by Bruno Lowagie.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+package com.lowagie.tools.arguments;
+
+import java.io.File;
+
+import javax.swing.filechooser.FileFilter;
+
+/**
+ * Filters images in a FileChooser.
+ */
+public class ImageFilter extends FileFilter {
+
+ /** Array with all kinds of image extensions. */
+ public static final String[] IMAGES = new String[8];
+ static {
+ IMAGES[0] = ".jpg";
+ IMAGES[1] = ".jpeg";
+ IMAGES[2] = ".png";
+ IMAGES[3] = ".gif";
+ IMAGES[4] = ".bmp";
+ IMAGES[5] = ".wmf";
+ IMAGES[6] = ".tif";
+ IMAGES[7] = ".tiff";
+ }
+
+ /** array that enables you to filter on imagetypes. */
+ public boolean[] filter = new boolean[8];
+
+ /**
+ * Constructs an ImageFilter allowing all images.
+ */
+ public ImageFilter() {
+ for (int i = 0; i < filter.length; i++) {
+ filter[i] = true;
+ }
+ }
+
+ /**
+ * Constructs an ImageFilter allowing some images.
+ * @param jpeg indicates if jpegs are allowed
+ * @param png indicates if pngs are allowed
+ * @param gif indicates if gifs are allowed
+ * @param bmp indicates if bmps are allowed
+ * @param wmf indicates if wmfs are allowed
+ * @param tiff indicates if tiffs are allowed
+ */
+ public ImageFilter(boolean jpeg, boolean png, boolean gif, boolean bmp, boolean wmf, boolean tiff) {
+ if (jpeg) {
+ filter[0] = true;
+ filter[1] = true;
+ }
+ if (png) {
+ filter[2] = true;
+ }
+ if (gif) {
+ filter[3] = true;
+ }
+ if (bmp) {
+ filter[4] = true;
+ }
+ if (wmf) {
+ filter[5] = true;
+ }
+ if (tiff) {
+ filter[6] = true;
+ filter[7] = true;
+ }
+ }
+
+ /**
+ * @see javax.swing.filechooser.FileFilter#accept(java.io.File)
+ */
+ public boolean accept(File f) {
+ if (f.isDirectory()) return true;
+ for (int i = 0; i < IMAGES.length; i++) {
+ if (filter[i] && f.getName().toLowerCase().endsWith(IMAGES[i])) return true;
+ }
+ return false;
+ }
+
+ /**
+ * @see javax.swing.filechooser.FileFilter#getDescription()
+ */
+ public String getDescription() {
+ return "Image files";
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/tools/arguments/LabelAccessory.java b/src/main/java/com/lowagie/tools/arguments/LabelAccessory.java
new file mode 100644
index 0000000..dff5adc
--- /dev/null
+++ b/src/main/java/com/lowagie/tools/arguments/LabelAccessory.java
@@ -0,0 +1,158 @@
+/*
+ * $Id: LabelAccessory.java,v 1.4 2005/12/19 07:51:35 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2005 by Carsten Hammer.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+package com.lowagie.tools.arguments;
+
+import java.beans.*;
+import java.io.*;
+
+import java.awt.*;
+import javax.swing.*;
+
+import com.lowagie.text.pdf.*;
+import java.util.HashMap;
+import java.util.TimeZone;
+import java.util.Calendar;
+import java.util.Locale;
+import java.util.Date;
+
+/**
+ * Label for the FileChooser
+ */
+public class LabelAccessory
+ extends JPanel implements PropertyChangeListener {
+
+ String filename = "";
+
+ BorderLayout borderLayout1 = new BorderLayout();
+
+ JLabel jLabel1 = new JLabel();
+
+ JPanel jPanel2 = new JPanel();
+
+ BorderLayout borderLayout2 = new BorderLayout();
+ JScrollPane jScrollPane1 = new JScrollPane();
+
+ public LabelAccessory() {
+ try {
+ this.setLayout(borderLayout1);
+ jLabel1.setHorizontalAlignment(SwingConstants.CENTER);
+ jPanel2.setLayout(borderLayout2);
+ this.add(jPanel2, java.awt.BorderLayout.CENTER);
+ jScrollPane1.setPreferredSize(new Dimension(200, 200));
+ jPanel2.add(jScrollPane1, java.awt.BorderLayout.CENTER);
+ jScrollPane1.setViewportView(jLabel1);
+ }
+ catch (Exception ex) {
+ ex.printStackTrace();
+ }
+ }
+
+ public void createTextFromPDF(File file) {
+ if (file.exists()) {
+ int page = 1;
+ PdfReader reader = null;
+
+ try {
+ reader = new PdfReader(file.getAbsolutePath());
+ HashMap pdfinfo = reader.getInfo();
+
+ StringBuffer sb = new StringBuffer();
+ sb.append("<html>=== Document Information ===<p>");
+ sb.append(reader.getCropBox(page).height() + "*"
+ + reader.getCropBox(page).width() + "<p>");
+ sb.append("PDF Version: " + reader.getPdfVersion() + "<p>");
+ sb.append("Number of pages: " + reader.getNumberOfPages()
+ + "<p>");
+ sb.append("Number of PDF objects: " + reader.getXrefSize()
+ + "<p>");
+ sb.append("File length: " + reader.getFileLength() + "<p>");
+ sb.append("Encrypted= " + reader.isEncrypted() + "<p>");
+ if (pdfinfo.get("Title") != null) {
+ sb.append("Title= " + pdfinfo.get("Title") + "<p>");
+ }
+ if (pdfinfo.get("Author") != null) {
+ sb.append("Author= " + pdfinfo.get("Author") + "<p>");
+ }
+ if (pdfinfo.get("Subject") != null) {
+ sb.append("Subject= " + pdfinfo.get("Subject") + "<p>");
+ }
+ if (pdfinfo.get("Producer") != null) {
+ sb.append("Producer= " + pdfinfo.get("Producer") + "<p>");
+ }
+ if (pdfinfo.get("ModDate") != null) {
+ sb.append("ModDate= " +
+ PdfDate.decode(pdfinfo.get("ModDate").toString()).getTime() +
+ "<p>");
+ }
+ if (pdfinfo.get("CreationDate") != null) {
+ sb.append("CreationDate= " +
+ PdfDate.decode(pdfinfo.get("CreationDate").toString()).getTime() +
+ "<p>");
+ }
+ sb.append("</html>");
+ jLabel1.setText(sb.toString());
+ }
+ catch (IOException ex) {
+ jLabel1.setText("");
+ }
+ }
+ }
+
+ public void propertyChange(PropertyChangeEvent evt) {
+ filename = evt.getPropertyName();
+ if (filename.equals(JFileChooser.SELECTED_FILE_CHANGED_PROPERTY)) {
+ File file = (File) evt.getNewValue();
+ if (file != null) {
+ this.createTextFromPDF(file);
+ this.repaint();
+ }
+ }
+ }
+}
diff --git a/src/main/java/com/lowagie/tools/arguments/OptionArgument.java b/src/main/java/com/lowagie/tools/arguments/OptionArgument.java
new file mode 100644
index 0000000..28d4eda
--- /dev/null
+++ b/src/main/java/com/lowagie/tools/arguments/OptionArgument.java
@@ -0,0 +1,210 @@
+/*
+ * $Id: OptionArgument.java,v 1.8 2006/05/30 09:13:00 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2005 by Bruno Lowagie.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+package com.lowagie.tools.arguments;
+
+import java.awt.event.ActionEvent;
+import java.util.Iterator;
+import java.util.TreeMap;
+
+import javax.swing.JComboBox;
+import javax.swing.JOptionPane;
+
+import com.lowagie.tools.plugins.AbstractTool;
+
+/**
+ * Argument that can be one of several options.
+ */
+public class OptionArgument extends ToolArgument {
+
+ /**
+ * An Entry that can be chosen as option.
+ */
+ public class Entry {
+ /** Describes the option. */
+ private Object description;
+ /** Holds the actual value of the option. */
+ private Object value;
+ /**
+ * Constructs an entry.
+ * @param value the value of the entry (that wil be identical to the description)
+ */
+ public Entry(Object value) {
+ this.value = value;
+ this.description = value;
+ }
+ /**
+ * Constructs an entry.
+ * @param description the description of the entry
+ * @param value the value of the entry
+ */
+ public Entry(Object description, Object value) {
+ this.description = description;
+ this.value = value;
+ }
+ /**
+ * String representation of the Entry.
+ * @return a description of the entry
+ */
+ public String toString() {
+ return description.toString();
+ }
+ /**
+ * Gets the value of the String.
+ * @return the toString of the value
+ */
+ public String getValueToString() {
+ return value.toString();
+ }
+ /**
+ * @return Returns the description.
+ */
+ public Object getDescription() {
+ return description;
+ }
+ /**
+ * @param description The description to set.
+ */
+ public void setDescription(Object description) {
+ this.description = description;
+ }
+ /**
+ * @return Returns the value.
+ */
+ public Object getValue() {
+ return value;
+ }
+ /**
+ * @param value The value to set.
+ */
+ public void setValue(Object value) {
+ this.value = value;
+ }
+ }
+
+ private TreeMap options = new TreeMap();
+
+ /**
+ * Constructs an OptionArgument.
+ * @param tool the tool that needs this argument
+ * @param name the name of the argument
+ * @param description the description of the argument
+ */
+ public OptionArgument(AbstractTool tool, String name, String description) {
+ super(tool, name, description, Entry.class.getName());
+ }
+
+ /**
+ * Adds an Option.
+ * @param description the description of the option
+ * @param value the value of the option
+ */
+ public void addOption(Object description, Object value) {
+ options.put(value.toString(), new Entry(description, value));
+ }
+
+ /**
+ * Gets the argument as an object.
+ * @return an object
+ * @throws InstantiationException
+ */
+ public Object getArgument() throws InstantiationException {
+ if (value == null) return null;
+ try {
+ return ((Entry)options.get(value)).getValue();
+ } catch (Exception e) {
+ throw new InstantiationException(e.getMessage());
+ }
+ }
+
+ /**
+ * @see com.lowagie.tools.arguments.ToolArgument#getUsage()
+ */
+ public String getUsage() {
+ StringBuffer buf = new StringBuffer(super.getUsage());
+ buf.append(" possible options:\n");
+ Entry entry;
+ for (Iterator i = options.values().iterator(); i.hasNext(); ) {
+ entry = (Entry)i.next();
+ buf.append(" - ");
+ buf.append(entry.getValueToString());
+ buf.append(": ");
+ buf.append(entry.toString());
+ buf.append("\n");
+ }
+ return buf.toString();
+ }
+
+ /**
+ * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
+ */
+ public void actionPerformed(ActionEvent evt) {
+ Object[] message = new Object[2];
+ message[0] = "Choose one of the following options:";
+ JComboBox cb = new JComboBox();
+ for(Iterator i = options.values().iterator(); i.hasNext(); ) {
+ cb.addItem(i.next());
+ }
+ message[1] = cb;
+ int result = JOptionPane.showOptionDialog(
+ tool.getInternalFrame(),
+ message,
+ description,
+ JOptionPane.OK_CANCEL_OPTION,
+ JOptionPane.QUESTION_MESSAGE,
+ null,
+ null,
+ null
+ );
+ if (result == 0) {
+ Entry entry = (Entry)cb.getSelectedItem();
+ setValue(entry.getValueToString());
+ }
+ }
+}
diff --git a/src/main/java/com/lowagie/tools/arguments/PageSelectionTableDialog.java b/src/main/java/com/lowagie/tools/arguments/PageSelectionTableDialog.java
new file mode 100644
index 0000000..cf14442
--- /dev/null
+++ b/src/main/java/com/lowagie/tools/arguments/PageSelectionTableDialog.java
@@ -0,0 +1,243 @@
+package com.lowagie.tools.arguments;
+
+import java.awt.*;
+import javax.swing.*;
+import javax.swing.table.*;
+import java.awt.BorderLayout;
+import javax.swing.event.ListSelectionEvent;
+import javax.swing.event.ListSelectionListener;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+/**
+ * <p>Title: </p>
+ *
+ * <p>Description: </p>
+ *
+ * <p>Copyright: Copyright (c) 2005</p>
+ *
+ * <p>Company: </p>
+ *
+ * @author not attributable
+ * @version 1.0
+ */
+public class PageSelectionTableDialog
+ extends JDialog {
+ JPanel panel1 = new JPanel();
+ BorderLayout borderLayout1 = new BorderLayout();
+ ListSelectionModel listSelectionModel1;
+ JTable jTable1 = new JTable();
+ JScrollPane jScrollPane1 = new JScrollPane();
+ String selectionstring = "";
+ JLabel jLabel1 = new JLabel();
+ BorderLayout borderLayout2 = new BorderLayout();
+ JPanel jPanel1 = new JPanel();
+ JButton alljButton1 = new JButton();
+ JButton oddjButton2 = new JButton();
+ JButton evenjButton3 = new JButton();
+ JToggleButton jToggleButton1 = new JToggleButton();
+ JButton none = new JButton();
+
+ public PageSelectionTableDialog(JInternalFrame owner, String title, boolean modal) {
+ super(new Frame(), title, modal);
+// super( title);
+ try {
+ setDefaultCloseOperation(DISPOSE_ON_CLOSE);
+ jbInit();
+ pack();
+ }
+ catch (Exception exception) {
+ exception.printStackTrace();
+ }
+ }
+
+ public PageSelectionTableDialog(JInternalFrame jinternalframe) {
+ this(jinternalframe, "", false);
+ }
+
+ private void jbInit() throws Exception {
+ panel1.setLayout(borderLayout1);
+ this.getContentPane().setLayout(borderLayout2);
+ alljButton1.setText("all");
+ alljButton1.addActionListener(new
+ PageSelectionTableDialog_jButton1_actionAdapter(this));
+ oddjButton2.setText("odd");
+ oddjButton2.addActionListener(new
+ PageSelectionTableDialog_jButton2_actionAdapter(this));
+ evenjButton3.setText("even");
+ evenjButton3.addActionListener(new
+ PageSelectionTableDialog_jButton3_actionAdapter(this));
+ jToggleButton1.setText("swap");
+ jToggleButton1.addActionListener(new
+ PageSelectionTableDialog_jToggleButton1_actionAdapter(this));
+ none.setText("none");
+ none.addActionListener(new PageSelectionTableDialog_none_actionAdapter(this));
+
+ panel1.add(jScrollPane1, java.awt.BorderLayout.CENTER);
+ panel1.add(jLabel1, java.awt.BorderLayout.SOUTH);
+ this.getContentPane().add(jPanel1, java.awt.BorderLayout.SOUTH);
+ jPanel1.add(none);
+ jPanel1.add(jToggleButton1);
+ jPanel1.add(evenjButton3);
+ jPanel1.add(oddjButton2);
+ jPanel1.add(alljButton1);
+ this.getContentPane().add(panel1, java.awt.BorderLayout.CENTER);
+ jScrollPane1.setViewportView(jTable1);
+ listSelectionModel1 = jTable1.getSelectionModel();
+ listSelectionModel1.addListSelectionListener(new
+ PageSelectionTableDialog_listSelectionModel1_listSelectionAdapter(this));
+ }
+
+ public void setDataModel(TableModel dataModel) {
+ TableSorter sorter = new TableSorter(dataModel);
+ jTable1.setModel(sorter);
+ sorter.addMouseListenerToHeaderInTable(jTable1);
+ this.repaint();
+ }
+
+ public void listSelectionModel1_valueChanged(ListSelectionEvent e) {
+ if (!e.getValueIsAdjusting()) {
+ pulllistselectionmodel();
+ }
+ }
+
+ private void pulllistselectionmodel() {
+ TableSorter mysorter = (TableSorter) jTable1.getModel();
+ int[] values = jTable1.getSelectedRows();
+ int max = jTable1.getSelectedRowCount();
+ int[] swappedvalues = new int[max];
+
+ if (jToggleButton1.getModel().isSelected()) {
+ for (int i = 0; i < max; i+=2) {
+ int second=(i+1)<max?i+1:i;
+ swappedvalues[i] = mysorter.getModelrow(values[second]) + 1;
+ swappedvalues[second] = mysorter.getModelrow(values[i]) + 1;
+ }
+ }
+ else {
+ for (int i = 0; i < max; i++) {
+ swappedvalues[i] = mysorter.getModelrow(values[i]) + 1;
+ }
+
+ }
+ StringBuffer sb = new StringBuffer();
+ for (int i = 0; i < max; i++) {
+ sb.append(swappedvalues[i]);
+ if ( (i + 1) < max) {
+ sb.append(",");
+ }
+ }
+
+ jLabel1.setText(sb.toString());
+ this.firePropertyChange(PageSelectorToolArgument.
+ PROPERTYPAGESELECTIONSTRING, selectionstring,
+ sb.toString());
+ selectionstring = sb.toString();
+ }
+
+ public void jButton1_actionPerformed(ActionEvent e) {
+ listSelectionModel1.addSelectionInterval(0, jTable1.getRowCount() - 1);
+ jTable1.repaint();
+ }
+
+ public void jButton3_actionPerformed(ActionEvent e) {
+ for (int i = 0; i < jTable1.getRowCount(); i += 2) {
+ listSelectionModel1.addSelectionInterval(i, i);
+ }
+ jTable1.repaint();
+ }
+
+ public void jButton2_actionPerformed(ActionEvent e) {
+ for (int i = 1; i < jTable1.getRowCount(); i += 2) {
+ listSelectionModel1.addSelectionInterval(i, i);
+ }
+ jTable1.repaint();
+ }
+
+ public void jToggleButton1_actionPerformed(ActionEvent e) {
+ pulllistselectionmodel();
+ }
+
+ public void none_actionPerformed(ActionEvent e) {
+ listSelectionModel1.clearSelection();
+ jTable1.repaint();
+ }
+}
+
+class PageSelectionTableDialog_none_actionAdapter
+ implements ActionListener {
+ private PageSelectionTableDialog adaptee;
+ PageSelectionTableDialog_none_actionAdapter(PageSelectionTableDialog adaptee) {
+ this.adaptee = adaptee;
+ }
+
+ public void actionPerformed(ActionEvent e) {
+ adaptee.none_actionPerformed(e);
+ }
+}
+
+class PageSelectionTableDialog_jToggleButton1_actionAdapter
+ implements ActionListener {
+ private PageSelectionTableDialog adaptee;
+ PageSelectionTableDialog_jToggleButton1_actionAdapter(
+ PageSelectionTableDialog adaptee) {
+ this.adaptee = adaptee;
+ }
+
+ public void actionPerformed(ActionEvent e) {
+ adaptee.jToggleButton1_actionPerformed(e);
+ }
+}
+
+class PageSelectionTableDialog_jButton2_actionAdapter
+ implements ActionListener {
+ private PageSelectionTableDialog adaptee;
+ PageSelectionTableDialog_jButton2_actionAdapter(PageSelectionTableDialog
+ adaptee) {
+ this.adaptee = adaptee;
+ }
+
+ public void actionPerformed(ActionEvent e) {
+ adaptee.jButton2_actionPerformed(e);
+ }
+}
+
+class PageSelectionTableDialog_jButton3_actionAdapter
+ implements ActionListener {
+ private PageSelectionTableDialog adaptee;
+ PageSelectionTableDialog_jButton3_actionAdapter(PageSelectionTableDialog
+ adaptee) {
+ this.adaptee = adaptee;
+ }
+
+ public void actionPerformed(ActionEvent e) {
+
+ adaptee.jButton3_actionPerformed(e);
+ }
+}
+
+class PageSelectionTableDialog_jButton1_actionAdapter
+ implements ActionListener {
+ private PageSelectionTableDialog adaptee;
+ PageSelectionTableDialog_jButton1_actionAdapter(PageSelectionTableDialog
+ adaptee) {
+ this.adaptee = adaptee;
+ }
+
+ public void actionPerformed(ActionEvent e) {
+ adaptee.jButton1_actionPerformed(e);
+ }
+}
+
+class PageSelectionTableDialog_listSelectionModel1_listSelectionAdapter
+ implements ListSelectionListener {
+ private PageSelectionTableDialog adaptee;
+ PageSelectionTableDialog_listSelectionModel1_listSelectionAdapter(
+ PageSelectionTableDialog adaptee) {
+ this.adaptee = adaptee;
+ }
+
+ public void valueChanged(ListSelectionEvent e) {
+ adaptee.listSelectionModel1_valueChanged(e);
+ }
+}
diff --git a/src/main/java/com/lowagie/tools/arguments/PageSelectorToolArgument.java b/src/main/java/com/lowagie/tools/arguments/PageSelectorToolArgument.java
new file mode 100644
index 0000000..6911468
--- /dev/null
+++ b/src/main/java/com/lowagie/tools/arguments/PageSelectorToolArgument.java
@@ -0,0 +1,112 @@
+/*
+ * $Id: PageSelectorToolArgument.java,v 1.3 2006/05/30 09:13:00 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2005 by Anonymous known by Bruno Lowagie.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+package com.lowagie.tools.arguments;
+
+import java.awt.event.ActionEvent;
+import java.beans.PropertyChangeEvent;
+
+import com.lowagie.tools.plugins.AbstractTool;
+
+/**
+ * Argument that allows you to select a (set of) page(s).
+ */
+public class PageSelectorToolArgument
+ extends ToolArgument {
+// public final static String PROPERTYFILENAME = "inputfilename";
+ public final static String PROPERTYPAGESELECTIONSTRING =
+ "pageselectionstring";
+
+ public PageSelectorToolArgument(AbstractTool tool, String name,
+ String description,
+ String classname) {
+ super(tool, name, description, classname);
+
+ }
+
+ public void actionPerformed(ActionEvent e) {
+ if (jDialog1 != null) {
+ jDialog1.show();
+ }
+ }
+
+ public Object getArgument() throws InstantiationException {
+ if (value == null) {
+ return null;
+ }
+ return value;
+ }
+
+ public void propertyChange(PropertyChangeEvent evt) {
+ String propertyname = evt.getPropertyName();
+ if (jDialog1 == null) {
+ actionPerformed(null);
+ }
+ if (propertyname == null) {
+ return;
+ }
+ else if (propertyname.equals(name)) {
+ String filename = (String) evt.getNewValue();
+ if(jDialog1!=null)jDialog1.hide();
+ jDialog1 = new PageSelectionTableDialog(tool.getInternalFrame());
+ jDialog1.show();
+ jDialog1.addPropertyChangeListener(this);
+ jDialog1.setDataModel(new PageTableModel(filename));
+ jDialog1.setTitle(filename);
+ }
+ else if (propertyname.equals(PROPERTYPAGESELECTIONSTRING)) {
+ String pageselectionstring = (String) evt.getNewValue();
+ System.out.print(" Oldvalue:" + evt.getOldValue());
+ System.out.println(" Newvalue:" + pageselectionstring);
+ setValue(pageselectionstring, PROPERTYPAGESELECTIONSTRING);
+ }
+ }
+
+ PageSelectionTableDialog jDialog1 = null;
+}
diff --git a/src/main/java/com/lowagie/tools/arguments/PageSizeArgument.java b/src/main/java/com/lowagie/tools/arguments/PageSizeArgument.java
new file mode 100644
index 0000000..c8cdb0c
--- /dev/null
+++ b/src/main/java/com/lowagie/tools/arguments/PageSizeArgument.java
@@ -0,0 +1,172 @@
+/*
+ * $Id: PageSizeArgument.java,v 1.3 2006/05/30 09:13:00 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2005 by Bruno Lowagie.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+package com.lowagie.tools.arguments;
+
+import java.awt.event.ActionEvent;
+import java.lang.reflect.Field;
+import java.util.Iterator;
+import java.util.TreeMap;
+
+import javax.swing.JComboBox;
+import javax.swing.JOptionPane;
+
+import com.lowagie.text.PageSize;
+import com.lowagie.text.Rectangle;
+import com.lowagie.tools.plugins.AbstractTool;
+
+/**
+ * Argument that can be one of several options.
+ */
+public class PageSizeArgument extends OptionArgument {
+
+ private TreeMap options = new TreeMap();
+
+ /**
+ * Constructs an OptionArgument.
+ *
+ * @param tool
+ * the tool that needs this argument
+ * @param name
+ * the name of the argument
+ * @param description
+ * the description of the argument
+ */
+ public PageSizeArgument(AbstractTool tool, String name, String description) {
+ super(tool, name, description);
+ Class ps = PageSize.class;
+ Field[] sizes = ps.getDeclaredFields();
+ try {
+ for (int i = 0; i < sizes.length; i++) {
+ addOption(sizes[i].getName(), sizes[i].get(null));
+ }
+ } catch (IllegalArgumentException e) {
+ e.printStackTrace();
+ } catch (IllegalAccessException e) {
+ e.printStackTrace();
+ }
+ }
+
+ /**
+ * Adds an Option.
+ * @param description the description of the option
+ * @param value the value of the option
+ */
+ public void addOption(Object description, Object value) {
+ options.put(description, value);
+ }
+
+ /**
+ * Gets the options.
+ * @return Returns the options.
+ */
+ public TreeMap getOptions() {
+ return options;
+ }
+
+ /**
+ * Gets the argument as an object.
+ * @return an object
+ * @throws InstantiationException
+ */
+ public Object getArgument() throws InstantiationException {
+ if (value == null) return null;
+ try {
+ return ((Rectangle)options.get(value));
+ } catch (Exception e) {
+ throw new InstantiationException(e.getMessage());
+ }
+ }
+
+ /**
+ * @see com.lowagie.tools.arguments.ToolArgument#getUsage()
+ */
+ public String getUsage() {
+ StringBuffer buf = new StringBuffer(" ");
+ buf.append(name);
+ buf.append(" - ");
+ buf.append(description);
+ buf.append("\n");
+ buf.append(" possible options:\n");
+ String s;
+ for (Iterator i = options.keySet().iterator(); i.hasNext(); ) {
+ s = (String)i.next();
+ buf.append(" - ");
+ buf.append(s);
+ buf.append("\n");
+ }
+ return buf.toString();
+ }
+
+ /**
+ * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
+ */
+ public void actionPerformed(ActionEvent evt) {
+ Object[] message = new Object[2];
+ message[0] = "Choose one of the following pagesizes:";
+ JComboBox cb = new JComboBox();
+ for(Iterator i = options.keySet().iterator(); i.hasNext(); ) {
+ cb.addItem(i.next());
+ }
+ message[1] = cb;
+ int result = JOptionPane.showOptionDialog(
+ tool.getInternalFrame(),
+ message,
+ description,
+ JOptionPane.OK_CANCEL_OPTION,
+ JOptionPane.QUESTION_MESSAGE,
+ null,
+ null,
+ null
+ );
+ if (result == 0) {
+ setValue((String)cb.getSelectedItem());
+ }
+ }
+}
diff --git a/src/main/java/com/lowagie/tools/arguments/PageTableModel.java b/src/main/java/com/lowagie/tools/arguments/PageTableModel.java
new file mode 100644
index 0000000..0e44123
--- /dev/null
+++ b/src/main/java/com/lowagie/tools/arguments/PageTableModel.java
@@ -0,0 +1,146 @@
+/*
+ * $Id: PageTableModel.java,v 1.2 2005/10/23 09:35:48 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2005 by anonymous contributor known by Bruno Lowagie.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+package com.lowagie.tools.arguments;
+
+import javax.swing.table.*;
+import com.lowagie.text.pdf.PdfReader;
+import java.io.*;
+import com.lowagie.text.Rectangle;
+import java.util.ArrayList;
+import java.text.DecimalFormat;
+
+/**
+ * A table that shows info about the pages in a PDF document.
+ */
+public class PageTableModel
+ extends AbstractTableModel {
+ int seitenzahl;
+ PdfReader reader;
+ ArrayList auftragarray = new ArrayList();
+ DecimalFormat myFormatter = new DecimalFormat("00000");
+ public PageTableModel(String filename) {
+ super();
+ try {
+ reader = new PdfReader(filename);
+ seitenzahl = reader.getNumberOfPages();
+ }
+ catch (IOException ex) {
+ throw new RuntimeException("Datei " + filename +
+ " lässt sich nicht lesen!");
+ }
+ }
+
+ /**
+ * Returns the number of columns in the model.
+ *
+ * @return the number of columns in the model
+ * @todo Implement this javax.swing.table.TableModel method
+ */
+ public int getColumnCount() {
+ return 4;
+ }
+
+ /**
+ * Returns the number of rows in the model.
+ *
+ * @return the number of rows in the model
+ * @todo Implement this javax.swing.table.TableModel method
+ */
+ public int getRowCount() {
+ return seitenzahl;
+ }
+
+ /**
+ * Returns the value for the cell at <code>columnIndex</code> and <code>rowIndex</code>.
+ *
+ * @param rowIndex the row whose value is to be queried
+ * @param columnIndex the column whose value is to be queried
+ * @return the value Object at the specified cell
+ * @todo Implement this javax.swing.table.TableModel method
+ */
+ public Object getValueAt(int rowIndex, int columnIndex) {
+ Rectangle rec = reader.getPageSizeWithRotation(rowIndex + 1);
+ switch (columnIndex) {
+ case 0:
+ return myFormatter.format(rowIndex + 1);
+ case 1:
+ return new Float(rec.width());
+ case 2:
+ return new Float(rec.height());
+ case 3:
+ return new Float(rec.getRotation());
+ }
+ return null;
+ }
+
+ public String getColumnName(int column) {
+ String name = new Integer(column + 1).toString();
+ switch (column) {
+ case 0:
+ name = "<html>Pagenr<p>" + name + "</html>";
+ break;
+ case 1:
+ name = "<html>Weidth<p>" + name + "</html>";
+ break;
+ case 2:
+ name = "<html>Height<p>" + name + "</html>";
+ break;
+ case 3:
+ name = "<html>Rotation<p>" + name + "</html>";
+ break;
+
+ default:
+ name = "<html>-<p>" + name + "</html>";
+ break;
+ }
+ return name;
+ }
+
+}
diff --git a/src/main/java/com/lowagie/tools/arguments/PdfFilter.java b/src/main/java/com/lowagie/tools/arguments/PdfFilter.java
new file mode 100644
index 0000000..5b0b8b4
--- /dev/null
+++ b/src/main/java/com/lowagie/tools/arguments/PdfFilter.java
@@ -0,0 +1,77 @@
+/*
+ * $Id: PdfFilter.java,v 1.2 2005/10/24 06:33:31 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2005 by Bruno Lowagie.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+package com.lowagie.tools.arguments;
+
+import java.io.File;
+
+import javax.swing.filechooser.FileFilter;
+
+/**
+ * Filters PDF files in a JFileChooser.
+ */
+public class PdfFilter extends FileFilter {
+
+ /**
+ * @see javax.swing.filechooser.FileFilter#accept(java.io.File)
+ */
+ public boolean accept(File f) {
+ if (f.isDirectory()) return true;
+ if (f.getName().toLowerCase().endsWith(".pdf")) return true;
+ return false;
+ }
+
+ /**
+ * @see javax.swing.filechooser.FileFilter#getDescription()
+ */
+ public String getDescription() {
+ return "*.pdf PDF files";
+ }
+
+}
diff --git a/src/main/java/com/lowagie/tools/arguments/TableMap.java b/src/main/java/com/lowagie/tools/arguments/TableMap.java
new file mode 100644
index 0000000..58308ee
--- /dev/null
+++ b/src/main/java/com/lowagie/tools/arguments/TableMap.java
@@ -0,0 +1,89 @@
+package com.lowagie.tools.arguments;
+/*
+ * @(#)TableMap.java 1.4 97/12/17
+ *
+ * Copyright (c) 1997 Sun Microsystems, Inc. All Rights Reserved.
+ *
+ * This software is the confidential and proprietary information of Sun
+ * Microsystems, Inc. ("Confidential Information"). You shall not
+ * disclose such Confidential Information and shall use it only in
+ * accordance with the terms of the license agreement you entered into
+ * with Sun.
+ *
+ * SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF THE
+ * SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
+ * PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR ANY DAMAGES
+ * SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING
+ * THIS SOFTWARE OR ITS DERIVATIVES.
+ *
+ */
+
+/**
+ * In a chain of data manipulators some behaviour is common. TableMap
+ * provides most of this behavour and can be subclassed by filters
+ * that only need to override a handful of specific methods. TableMap
+ * implements TableModel by routing all requests to its model, and
+ * TableModelListener by routing all events to its listeners. Inserting
+ * a TableMap which has not been subclassed into a chain of table filters
+ * should have no effect.
+ *
+ * @version 1.4 12/17/97
+ * @author Philip Milne */
+
+import javax.swing.table.*;
+import javax.swing.event.TableModelListener;
+import javax.swing.event.TableModelEvent;
+
+public class TableMap extends AbstractTableModel implements TableModelListener
+{
+ protected TableModel model;
+
+ public TableModel getModel() {
+ return model;
+ }
+
+ public void setModel(TableModel model) {
+ this.model = model;
+ model.addTableModelListener(this);
+ }
+
+ // By default, Implement TableModel by forwarding all messages
+ // to the model.
+
+ public Object getValueAt(int aRow, int aColumn) {
+ return model.getValueAt(aRow, aColumn);
+ }
+
+ public void setValueAt(Object aValue, int aRow, int aColumn) {
+ model.setValueAt(aValue, aRow, aColumn);
+ }
+
+ public int getRowCount() {
+ return (model == null) ? 0 : model.getRowCount();
+ }
+
+ public int getColumnCount() {
+ return (model == null) ? 0 : model.getColumnCount();
+ }
+
+ public String getColumnName(int aColumn) {
+ return model.getColumnName(aColumn);
+ }
+
+ public Class getColumnClass(int aColumn) {
+ return model.getColumnClass(aColumn);
+ }
+
+ public boolean isCellEditable(int row, int column) {
+ return model.isCellEditable(row, column);
+ }
+//
+// Implementation of the TableModelListener interface,
+//
+
+ // By default forward all events to all the listeners.
+ public void tableChanged(TableModelEvent e) {
+ fireTableChanged(e);
+ }
+}
diff --git a/src/main/java/com/lowagie/tools/arguments/TableSorter.java b/src/main/java/com/lowagie/tools/arguments/TableSorter.java
new file mode 100644
index 0000000..a921516
--- /dev/null
+++ b/src/main/java/com/lowagie/tools/arguments/TableSorter.java
@@ -0,0 +1,367 @@
+/** Code contributed by Anonymous; looks like code that was reused from another application. */
+package com.lowagie.tools.arguments;
+
+import java.awt.event.InputEvent;
+
+// Imports for picking up mouse events from the JTable.
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+
+/*
+ * @(#)TableSorter.java 1.5 97/12/17
+ *
+ * Copyright (c) 1997 Sun Microsystems, Inc. All Rights Reserved.
+ *
+ * This software is the confidential and proprietary information of Sun
+ * Microsystems, Inc. ("Confidential Information"). You shall not
+ * disclose such Confidential Information and shall use it only in
+ * accordance with the terms of the license agreement you entered into
+ * with Sun.
+ *
+ * SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF THE
+ * SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
+ * PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR ANY DAMAGES
+ * SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING
+ * THIS SOFTWARE OR ITS DERIVATIVES.
+ *
+ */
+
+/**
+ * A sorter for TableModels. The sorter has a model (conforming to TableModel)
+ * and itself implements TableModel. TableSorter does not store or copy
+ * the data in the TableModel, instead it maintains an array of
+ * integers which it keeps the same size as the number of rows in its
+ * model. When the model changes it notifies the sorter that something
+ * has changed eg. "rowsAdded" so that its internal array of integers
+ * can be reallocated. As requests are made of the sorter (like
+ * getValueAt(row, col) it redirects them to its model via the mapping
+ * array. That way the TableSorter appears to hold another copy of the table
+ * with the rows in a different order. The sorting algorthm used is stable
+ * which means that it does not move around rows when its comparison
+ * function returns 0 to denote that they are equivalent.
+ *
+ * @version 1.5 12/17/97
+ * @author Philip Milne
+ */
+import java.util.*;
+
+import javax.swing.JTable;
+import javax.swing.event.TableModelEvent;
+import javax.swing.table.JTableHeader;
+import javax.swing.table.TableColumnModel;
+import javax.swing.table.TableModel;
+
+public class TableSorter
+ extends TableMap {
+ int[] indexes;
+ Vector sortingColumns = new Vector();
+ boolean ascending = true;
+ int compares;
+
+ public TableSorter() {
+ indexes = new int[0]; // For consistency.
+ }
+
+ public TableSorter(TableModel model) {
+ setModel(model);
+ }
+
+ public void setModel(TableModel model) {
+ super.setModel(model);
+ reallocateIndexes();
+ }
+
+ public int compareRowsByColumn(int row1, int row2, int column) {
+ Class type = model.getColumnClass(column);
+ TableModel data = model;
+
+ // Check for nulls
+ Object o1 = data.getValueAt(row1, column);
+ Object o2 = data.getValueAt(row2, column);
+
+ // If both values are null return 0
+ if ( (o1 == null) && (o2 == null)) {
+ return 0;
+ }
+ else if (o1 == null) { // Define null less than everything.
+
+ return -1;
+ }
+ else if (o2 == null) {
+ return 1;
+ }
+
+ /* We copy all returned values from the getValue call in case
+ an optimised model is reusing one object to return many values.
+ The Number subclasses in the JDK are immutable and so will not be used in
+ this way but other subclasses of Number might want to do this to save
+ space and avoid unnecessary heap allocation.
+ */
+ if (type.getSuperclass() == java.lang.Number.class) {
+ Number n1 = (Number) data.getValueAt(row1, column);
+ double d1 = n1.doubleValue();
+ Number n2 = (Number) data.getValueAt(row2, column);
+ double d2 = n2.doubleValue();
+
+ if (d1 < d2) {
+ return -1;
+ }
+ else if (d1 > d2) {
+ return 1;
+ }
+ else {
+ return 0;
+ }
+ }
+ else if (type == java.util.Date.class) {
+ Date d1 = (Date) data.getValueAt(row1, column);
+ long n1 = d1.getTime();
+ Date d2 = (Date) data.getValueAt(row2, column);
+ long n2 = d2.getTime();
+
+ if (n1 < n2) {
+ return -1;
+ }
+ else if (n1 > n2) {
+ return 1;
+ }
+ else {
+ return 0;
+ }
+ }
+ else if (type == String.class) {
+ String s1 = (String) data.getValueAt(row1, column);
+ String s2 = (String) data.getValueAt(row2, column);
+ int result = s1.compareTo(s2);
+
+ if (result < 0) {
+ return -1;
+ }
+ else if (result > 0) {
+ return 1;
+ }
+ else {
+ return 0;
+ }
+ }
+ else if (type == Boolean.class) {
+ Boolean bool1 = (Boolean) data.getValueAt(row1, column);
+ boolean b1 = bool1.booleanValue();
+ Boolean bool2 = (Boolean) data.getValueAt(row2, column);
+ boolean b2 = bool2.booleanValue();
+
+ if (b1 == b2) {
+ return 0;
+ }
+ else if (b1) { // Define false < true
+
+ return 1;
+ }
+ else {
+ return -1;
+ }
+ }
+ else {
+ Object v1 = data.getValueAt(row1, column);
+ String s1 = v1.toString();
+ Object v2 = data.getValueAt(row2, column);
+ String s2 = v2.toString();
+ int result = s1.compareTo(s2);
+
+ if (result < 0) {
+ return -1;
+ }
+ else if (result > 0) {
+ return 1;
+ }
+ else {
+ return 0;
+ }
+ }
+ }
+
+ public int compare(int row1, int row2) {
+ compares++;
+
+ for (int level = 0; level < sortingColumns.size(); level++) {
+ Integer column = (Integer) sortingColumns.elementAt(level);
+ int result = compareRowsByColumn(row1, row2, column.intValue());
+
+ if (result != 0) {
+ return ascending ? result : ( -result);
+ }
+ }
+
+ return 0;
+ }
+
+ public void reallocateIndexes() {
+ int rowCount = model.getRowCount();
+
+ // Set up a new array of indexes with the right number of elements
+ // for the new data model.
+ indexes = new int[rowCount];
+
+ // Initialise with the identity mapping.
+ for (int row = 0; row < rowCount; row++) {
+ indexes[row] = row;
+ }
+ }
+
+ public void tableChanged(TableModelEvent e) {
+ //System.out.println("Sorter: tableChanged");
+ reallocateIndexes();
+ super.tableChanged(e);
+ }
+
+ public void checkModel() {
+ if (indexes.length != model.getRowCount()) {
+ System.err.println("Sorter not informed of a change in model.");
+ }
+ }
+
+ public void sort(Object sender) {
+ checkModel();
+ compares = 0;
+
+ // n2sort();
+ // qsort(0, indexes.length-1);
+ shuttlesort( (int[]) indexes.clone(), indexes, 0, indexes.length);
+
+ //System.out.println("Compares: "+compares);
+ }
+
+ public void n2sort() {
+ for (int i = 0; i < getRowCount(); i++) {
+ for (int j = i + 1; j < getRowCount(); j++) {
+ if (compare(indexes[i], indexes[j]) == -1) {
+ swap(i, j);
+ }
+ }
+ }
+ }
+
+ // This is a home-grown implementation which we have not had time
+ // to research - it may perform poorly in some circumstances. It
+ // requires twice the space of an in-place algorithm and makes
+ // NlogN assigments shuttling the values between the two
+ // arrays. The number of compares appears to vary between N-1 and
+ // NlogN depending on the initial order but the main reason for
+ // using it here is that, unlike qsort, it is stable.
+ public void shuttlesort(int[] from, int[] to, int low, int high) {
+ if ( (high - low) < 2) {
+ return;
+ }
+
+ int middle = (low + high) / 2;
+ shuttlesort(to, from, low, middle);
+ shuttlesort(to, from, middle, high);
+
+ int p = low;
+ int q = middle;
+
+ /* This is an optional short-cut; at each recursive call,
+ check to see if the elements in this subset are already
+ ordered. If so, no further comparisons are needed; the
+ sub-array can just be copied. The array must be copied rather
+ than assigned otherwise sister calls in the recursion might
+ get out of sinc. When the number of elements is three they
+ are partitioned so that the first set, [low, mid), has one
+ element and and the second, [mid, high), has two. We skip the
+ optimisation when the number of elements is three or less as
+ the first compare in the normal merge will produce the same
+ sequence of steps. This optimisation seems to be worthwhile
+ for partially ordered lists but some analysis is needed to
+ find out how the performance drops to Nlog(N) as the initial
+ order diminishes - it may drop very quickly. */
+ if ( ( (high - low) >= 4) && (compare(from[middle - 1], from[middle]) <= 0)) {
+ for (int i = low; i < high; i++) {
+ to[i] = from[i];
+ }
+
+ return;
+ }
+
+ // A normal merge.
+ for (int i = low; i < high; i++) {
+ if ( (q >= high) || ( (p < middle) && (compare(from[p], from[q]) <= 0))) {
+ to[i] = from[p++];
+ }
+ else {
+ to[i] = from[q++];
+ }
+ }
+ }
+
+ public void swap(int i, int j) {
+ int tmp = indexes[i];
+ indexes[i] = indexes[j];
+ indexes[j] = tmp;
+ }
+
+ // The mapping only affects the contents of the data rows.
+ // Pass all requests to these rows through the mapping array: "indexes".
+ public Object getValueAt(int aRow, int aColumn) {
+ checkModel();
+
+ return model.getValueAt(indexes[aRow], aColumn);
+ }
+
+ public void setValueAt(Object aValue, int aRow, int aColumn) {
+ checkModel();
+ model.setValueAt(aValue, indexes[aRow], aColumn);
+ }
+
+ public void sortByColumn(int column) {
+ sortByColumn(column, true);
+ }
+
+ public void sortByColumn(int column, boolean ascending) {
+ this.ascending = ascending;
+ sortingColumns.removeAllElements();
+ sortingColumns.addElement(new Integer(column));
+ sort(this);
+ super.tableChanged(new TableModelEvent(this));
+ }
+
+ // There is no-where else to put this.
+ // Add a mouse listener to the Table to trigger a table sort
+ // when a column heading is clicked in the JTable.
+ public void addMouseListenerToHeaderInTable(JTable table) {
+ final TableSorter sorter = this;
+ final JTable tableView = table;
+ tableView.setColumnSelectionAllowed(false);
+
+ MouseAdapter listMouseListener = new MouseAdapter() {
+ public void mouseClicked(MouseEvent e) {
+ TableColumnModel columnModel = tableView.getColumnModel();
+ int viewColumn = columnModel.getColumnIndexAtX(e.getX());
+ int column = tableView.convertColumnIndexToModel(viewColumn);
+
+ if ( (e.getClickCount() == 1) && (column != -1)) {
+ //System.out.println("Sorting ...");
+ int shiftPressed = e.getModifiers() & InputEvent.SHIFT_MASK;
+ boolean ascending = (shiftPressed == 0);
+ sorter.sortByColumn(column, ascending);
+ }
+ }
+ };
+
+ JTableHeader th = tableView.getTableHeader();
+ th.addMouseListener(listMouseListener);
+ }
+
+ public int getModelrow(int viewrow) {
+ return indexes[viewrow];
+ }
+
+ public int getjTablerow(int modelrow) {
+ int i = 0;
+ while (indexes[i] != modelrow) {
+ i++;
+ }
+ return i;
+ }
+
+}
diff --git a/src/main/java/com/lowagie/tools/arguments/ToolArgument.java b/src/main/java/com/lowagie/tools/arguments/ToolArgument.java
new file mode 100644
index 0000000..203c298
--- /dev/null
+++ b/src/main/java/com/lowagie/tools/arguments/ToolArgument.java
@@ -0,0 +1,281 @@
+/*
+ * $Id: ToolArgument.java,v 1.6 2006/05/30 09:13:00 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2005 by Bruno Lowagie.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+package com.lowagie.tools.arguments;
+
+import java.awt.Color;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+import java.io.File;
+import java.util.Vector;
+
+import javax.swing.JColorChooser;
+import javax.swing.JFileChooser;
+import javax.swing.JOptionPane;
+
+import com.lowagie.text.Image;
+import com.lowagie.tools.plugins.AbstractTool;
+
+/**
+ * This is an argument of one of the tools in the toolbox.
+ */
+public class ToolArgument
+ implements ActionListener, PropertyChangeListener {
+ /** reference to the internal frame */
+ protected AbstractTool tool;
+ /** describes the argument. */
+ protected String description;
+ /** short name for the argument. */
+ protected String name;
+ /** type of the argument. */
+ protected String classname;
+ /** value of the argument. */
+ protected String value = null;
+
+ /** Constructs a ToolArgument. */
+ public ToolArgument() {}
+
+ /**
+ * Constructs a ToolArgument.
+ * @param tool the tool that needs this argument
+ * @param name the name of the argument
+ * @param description the description of the argument
+ * @param classname the type of the argument
+ */
+ public ToolArgument(AbstractTool tool, String name, String description,
+ String classname) {
+ this.tool = tool;
+ this.name = name;
+ this.description = description;
+ this.classname = classname;
+ }
+
+ /**
+ * Gets the argument as an object.
+ * @return an object
+ * @throws InstantiationException
+ */
+ public Object getArgument() throws InstantiationException {
+ if (value == null) {
+ return null;
+ }
+ try {
+ if (String.class.getName().equals(classname)) {
+ return value;
+ }
+ if (Image.class.getName().equals(classname)) {
+ return Image.getInstance(value);
+ }
+ if (File.class.getName().equals(classname)) {
+ return new File(value);
+ }
+ if (Color.class.getName().equals(classname)) {
+ return Color.decode(value);
+ }
+ }
+ catch (Exception e) {
+ throw new InstantiationException(e.getMessage());
+ }
+ return value;
+ }
+
+ /**
+ * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
+ */
+ public void actionPerformed(ActionEvent e) {
+ if (String.class.getName().equals(classname)) {
+ setValue(JOptionPane.showInputDialog(tool.getInternalFrame(),
+ "Enter a value for " + name + ":"));
+ }
+ if (Image.class.getName().equals(classname)) {
+ JFileChooser fc = new JFileChooser();
+ fc.showOpenDialog(tool.getInternalFrame());
+ setValue(fc.getSelectedFile().getAbsolutePath());
+ }
+ if (File.class.getName().equals(classname)) {
+ JFileChooser fc = new JFileChooser();
+ fc.showOpenDialog(tool.getInternalFrame());
+ setValue(fc.getSelectedFile().getAbsolutePath());
+ }
+ if (Color.class.getName().equals(classname)) {
+ Color initialColor = new Color(0xFF, 0xFF, 0xFF);
+ if (value != null) {
+ initialColor = Color.decode(value);
+ }
+ Color newColor = JColorChooser.showDialog(tool.getInternalFrame(),
+ "Choose Color", initialColor);
+ setValue("0x" +
+ Integer.toHexString( (newColor.getRed() << 16) |
+ (newColor.getGreen() << 8) |
+ (newColor.getBlue() << 0)).toUpperCase());
+ }
+ }
+
+ /**
+ * Give you a String that can be used in a usage description.
+ * @return a String
+ */
+ public String getUsage() {
+ StringBuffer buf = new StringBuffer(" ");
+ buf.append(name);
+ buf.append(" - ");
+ buf.append(description);
+ buf.append("\n");
+ return buf.toString();
+ }
+
+ /**
+ * @return Returns the classname.
+ */
+ public String getClassname() {
+ return classname;
+ }
+
+ /**
+ * @param classname The classname to set.
+ */
+ public void setClassname(String classname) {
+ this.classname = classname;
+ }
+
+ /**
+ * @return Returns the description.
+ */
+ public String getDescription() {
+ return description;
+ }
+
+ /**
+ * @param description The description to set.
+ */
+ public void setDescription(String description) {
+ this.description = description;
+ }
+
+ /**
+ * @return Returns the name.
+ */
+ public String getName() {
+ return name;
+ }
+
+ /**
+ * @param name The name to set.
+ */
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ /**
+ * @return Returns the value.
+ */
+ public String getValue() {
+ return value;
+ }
+
+ /**
+ * @param value The value to set.
+ */
+ public void setValue(String value) {
+ Object oldvalue = this.value;
+ this.value = value;
+ tool.valueHasChanged(this);
+ this.firePropertyChange(new PropertyChangeEvent(this, name,
+ oldvalue, this.value));
+ }
+ public void setValue(String value, String propertyname) {
+ Object oldvalue = this.value;
+ this.value = value;
+ tool.valueHasChanged(this);
+ this.firePropertyChange(new PropertyChangeEvent(this, propertyname,
+ oldvalue, this.value));
+ }
+ transient Vector propertyChangeListeners;
+ public synchronized void addPropertyChangeListener(PropertyChangeListener l) {
+
+ Vector v = propertyChangeListeners == null ? new Vector(2) :
+ (Vector) propertyChangeListeners.clone();
+ if (!v.contains(l)) {
+ v.addElement(l);
+ propertyChangeListeners = v;
+ }
+ }
+
+ public synchronized void removePropertyChangeListener(PropertyChangeListener
+ l) {
+ if (propertyChangeListeners != null && propertyChangeListeners.contains(l)) {
+ Vector v = (Vector) propertyChangeListeners.clone();
+ v.removeElement(l);
+ propertyChangeListeners = v;
+ }
+
+ }
+
+ protected void firePropertyChange(PropertyChangeEvent evt) {
+ if (propertyChangeListeners != null) {
+ Vector listeners = propertyChangeListeners;
+ int count = listeners.size();
+ for (int i = 0; i < count; i++) {
+ ( (PropertyChangeListener) listeners.elementAt(i)).propertyChange(evt);
+ }
+ }
+ }
+
+ /**
+ * This method gets called when a bound property is changed.
+ *
+ * @param evt A PropertyChangeEvent object describing the event source and the property that has
+ * changed.
+ * @todo Implement this java.beans.PropertyChangeListener method
+ */
+ public void propertyChange(PropertyChangeEvent evt) {
+ }
+}
diff --git a/src/main/java/com/lowagie/tools/concat_pdf.java b/src/main/java/com/lowagie/tools/concat_pdf.java
new file mode 100644
index 0000000..e9929a0
--- /dev/null
+++ b/src/main/java/com/lowagie/tools/concat_pdf.java
@@ -0,0 +1,96 @@
+/*
+ * $Id: concat_pdf.java,v 1.19 2006/04/28 16:26:38 psoares33 Exp $
+ * $Name: $
+ *
+ * This code is free software. It may only be copied or modified
+ * if you include the following copyright notice:
+ *
+ * This class by Mark Thompson. Copyright (c) 2002 Mark Thompson.
+ *
+ * This code is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * itext@lowagie.com
+ */
+
+/**
+ * This class demonstrates copying a PDF file using iText.
+ * @author Mark Thompson
+ */
+package com.lowagie.tools;
+
+import java.io.*;
+
+import com.lowagie.text.Document;
+import com.lowagie.text.pdf.*;
+import java.util.List;
+import java.util.ArrayList;
+
+/**
+ * Tool that can be used to concatenate existing PDF files.
+ */
+public class concat_pdf {
+
+ /**
+ * This class can be used to concatenate existing PDF files.
+ * (This was an example known as PdfCopy.java)
+ * @param args the command line arguments
+ */
+ public static void main(String args[]) {
+ if (args.length < 2) {
+ System.err.println("arguments: file1 [file2 ...] destfile");
+ }
+ else {
+ try {
+ int pageOffset = 0;
+ ArrayList master = new ArrayList();
+ int f = 0;
+ String outFile = args[args.length-1];
+ Document document = null;
+ PdfCopy writer = null;
+ while (f < args.length-1) {
+ // we create a reader for a certain document
+ PdfReader reader = new PdfReader(args[f]);
+ reader.consolidateNamedDestinations();
+ // we retrieve the total number of pages
+ int n = reader.getNumberOfPages();
+ List bookmarks = SimpleBookmark.getBookmark(reader);
+ if (bookmarks != null) {
+ if (pageOffset != 0)
+ SimpleBookmark.shiftPageNumbers(bookmarks, pageOffset, null);
+ master.addAll(bookmarks);
+ }
+ pageOffset += n;
+ System.out.println("There are " + n + " pages in " + args[f]);
+
+ if (f == 0) {
+ // step 1: creation of a document-object
+ document = new Document(reader.getPageSizeWithRotation(1));
+ // step 2: we create a writer that listens to the document
+ writer = new PdfCopy(document, new FileOutputStream(outFile));
+ // step 3: we open the document
+ document.open();
+ }
+ // step 4: we add content
+ PdfImportedPage page;
+ for (int i = 0; i < n; ) {
+ ++i;
+ page = writer.getImportedPage(reader, i);
+ writer.addPage(page);
+ System.out.println("Processed page " + i);
+ }
+ writer.freeReader(reader);
+ f++;
+ }
+ if (master.size() > 0)
+ writer.setOutlines(master);
+ // step 5: we close the document
+ document.close();
+ }
+ catch(Exception e) {
+ e.printStackTrace();
+ }
+ }
+ }
+}
diff --git a/src/main/java/com/lowagie/tools/encrypt_pdf.java b/src/main/java/com/lowagie/tools/encrypt_pdf.java
new file mode 100644
index 0000000..e6a0215
--- /dev/null
+++ b/src/main/java/com/lowagie/tools/encrypt_pdf.java
@@ -0,0 +1,99 @@
+/*
+ * $Id: encrypt_pdf.java,v 1.18 2004/12/14 10:59:06 blowagie Exp $
+ * $Name: $
+ *
+ * This code is free software. It may only be copied or modified
+ * if you include the following copyright notice:
+ *
+ * This class by Paulo Soares. Copyright (c) 2002 Paulo Soares.
+ *
+ * This code is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * itext@lowagie.com
+ */
+
+/**
+ * This class demonstrates how to encrypt a pdf file
+ * @author Paulo Soares
+ */
+package com.lowagie.tools;
+
+import com.lowagie.text.pdf.PdfEncryptor;
+import com.lowagie.text.pdf.PdfReader;
+import com.lowagie.text.pdf.PdfWriter;
+
+import java.io.FileOutputStream;
+import java.util.HashMap;
+
+/**
+ * Encrypts a PDF document. It needs iText (http://www.lowagie.com/iText).
+ * @author Paulo Soares (psoares@consiste.pt)
+ */
+public class encrypt_pdf {
+
+ private final static int INPUT_FILE = 0;
+ private final static int OUTPUT_FILE = 1;
+ private final static int USER_PASSWORD = 2;
+ private final static int OWNER_PASSWORD = 3;
+ private final static int PERMISSIONS = 4;
+ private final static int STRENGTH = 5;
+ private final static int MOREINFO = 6;
+ private final static int permit[] = {
+ PdfWriter.AllowPrinting,
+ PdfWriter.AllowModifyContents,
+ PdfWriter.AllowCopy,
+ PdfWriter.AllowModifyAnnotations,
+ PdfWriter.AllowFillIn,
+ PdfWriter.AllowScreenReaders,
+ PdfWriter.AllowAssembly,
+ PdfWriter.AllowDegradedPrinting};
+
+ private static void usage() {
+ System.out.println("usage: input_file output_file user_password owner_password permissions 128|40 [new info string pairs]");
+ System.out.println("permissions is 8 digit long 0 or 1. Each digit has a particular security function:");
+ System.out.println();
+ System.out.println("AllowPrinting");
+ System.out.println("AllowModifyContents");
+ System.out.println("AllowCopy");
+ System.out.println("AllowModifyAnnotations");
+ System.out.println("AllowFillIn (128 bit only)");
+ System.out.println("AllowScreenReaders (128 bit only)");
+ System.out.println("AllowAssembly (128 bit only)");
+ System.out.println("AllowDegradedPrinting (128 bit only)");
+ System.out.println("Example permissions to copy and print would be: 10100000");
+ }
+
+ /**
+ * Encrypts a PDF document.
+ *
+ * @param args input_file output_file user_password owner_password permissions 128|40 [new info string pairs]
+ */
+ public static void main (String args[]) {
+ System.out.println("PDF document encryptor");
+ if (args.length <= STRENGTH || args[PERMISSIONS].length() != 8) {
+ usage();
+ return;
+ }
+ try {
+ int permissions = 0;
+ String p = args[PERMISSIONS];
+ for (int k = 0; k < p.length(); ++k) {
+ permissions |= (p.charAt(k) == '0' ? 0 : permit[k]);
+ }
+ System.out.println("Reading " + args[INPUT_FILE]);
+ PdfReader reader = new PdfReader(args[INPUT_FILE]);
+ System.out.println("Writing " + args[OUTPUT_FILE]);
+ HashMap moreInfo = new HashMap();
+ for (int k = MOREINFO; k < args.length - 1; k += 2)
+ moreInfo.put(args[k], args[k + 1]);
+ PdfEncryptor.encrypt(reader, new FileOutputStream(args[OUTPUT_FILE]),
+ args[USER_PASSWORD].getBytes(), args[OWNER_PASSWORD].getBytes(), permissions, args[STRENGTH].equals("128"), moreInfo);
+ System.out.println("Done.");
+ }
+ catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/tools/handout_pdf.java b/src/main/java/com/lowagie/tools/handout_pdf.java
new file mode 100644
index 0000000..3ae590f
--- /dev/null
+++ b/src/main/java/com/lowagie/tools/handout_pdf.java
@@ -0,0 +1,122 @@
+/*
+ * $Id: handout_pdf.java,v 1.17 2004/12/14 10:59:06 blowagie Exp $
+ * $Name: $
+ *
+ * This code is free software. It may only be copied or modified
+ * if you include the following copyright notice:
+ *
+ * This class by Bruno Lowagie. Copyright (c) 2002 Bruno Lowagie.
+ *
+ * This code is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * itext@lowagie.com
+ */
+
+/**
+ * This class demonstrates how to splot a PDF file using iText.
+ * @author Bruno Lowagie
+ */
+package com.lowagie.tools;
+
+import java.io.*;
+
+import com.lowagie.text.*;
+import com.lowagie.text.pdf.*;
+
+/**
+ * Takes an existing PDF file and makes handouts.
+ */
+public class handout_pdf extends java.lang.Object {
+
+ /**
+ * Makes handouts based on an existing PDF file.
+ * @param args the command line arguments
+ */
+ public static void main (String args[]) {
+ if (args.length != 3) {
+ System.err.println("arguments: srcfile destfile pages");
+ }
+ else {
+ try {
+ int pages = Integer.parseInt(args[2]);
+ if (pages < 2 || pages > 8) {
+ throw new DocumentException("You can't have " + pages + " pages on one page (minimum 2; maximum 8).");
+ }
+
+ float x1 = 30f;
+ float x2 = 280f;
+ float x3 = 320f;
+ float x4 = 565f;
+
+ float[] y1 = new float[pages];
+ float[] y2 = new float[pages];
+
+ float height = (778f - (20f * (pages - 1))) / pages;
+ y1[0] = 812f;
+ y2[0] = 812f - height;
+
+ for (int i = 1; i < pages; i++) {
+ y1[i] = y2[i - 1] - 20f;
+ y2[i] = y1[i] - height;
+ }
+
+ // we create a reader for a certain document
+ PdfReader reader = new PdfReader(args[0]);
+ // we retrieve the total number of pages
+ int n = reader.getNumberOfPages();
+ System.out.println("There are " + n + " pages in the original file.");
+
+ // step 1: creation of a document-object
+ Document document = new Document(PageSize.A4);
+ // step 2: we create a writer that listens to the document
+ PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(args[1]));
+ // step 3: we open the document
+ document.open();
+ PdfContentByte cb = writer.getDirectContent();
+ PdfImportedPage page;
+ int rotation;
+ int i = 0;
+ int p = 0;
+ // step 4: we add content
+ while (i < n) {
+ i++;
+ Rectangle rect = reader.getPageSizeWithRotation(i);
+ float factorx = (x2 - x1) / rect.width();
+ float factory = (y1[p] - y2[p]) / rect.height();
+ float factor = (factorx < factory ? factorx : factory);
+ float dx = (factorx == factor ? 0f : ((x2 - x1) - rect.width() * factor) / 2f);
+ float dy = (factory == factor ? 0f : ((y1[p] - y2[p]) - rect.height() * factor) / 2f);
+ page = writer.getImportedPage(reader, i);
+ rotation = reader.getPageRotation(i);
+ if (rotation == 90 || rotation == 270) {
+ cb.addTemplate(page, 0, -factor, factor, 0, x1 + dx, y2[p] + dy + rect.height() * factor);
+ }
+ else {
+ cb.addTemplate(page, factor, 0, 0, factor, x1 + dx, y2[p] + dy);
+ }
+ cb.setRGBColorStroke(0xC0, 0xC0, 0xC0);
+ cb.rectangle(x3 - 5f, y2[p] - 5f, x4 - x3 + 10f, y1[p] - y2[p] + 10f);
+ for (float l = y1[p] - 19; l > y2[p]; l -= 16) {
+ cb.moveTo(x3, l);
+ cb.lineTo(x4, l);
+ }
+ cb.rectangle(x1 + dx, y2[p] + dy, rect.width() * factor, rect.height() * factor);
+ cb.stroke();
+ System.out.println("Processed page " + i);
+ p++;
+ if (p == pages) {
+ p = 0;
+ document.newPage();
+ }
+ }
+ // step 5: we close the document
+ document.close();
+ }
+ catch(Exception e) {
+ System.err.println(e.getClass().getName() + ": " + e.getMessage());
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/tools/plugins/AbstractTool.java b/src/main/java/com/lowagie/tools/plugins/AbstractTool.java
new file mode 100644
index 0000000..5e57892
--- /dev/null
+++ b/src/main/java/com/lowagie/tools/plugins/AbstractTool.java
@@ -0,0 +1,341 @@
+/*
+ * $Id: AbstractTool.java,v 1.10 2006/05/30 09:13:19 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2005 by Bruno Lowagie.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+package com.lowagie.tools.plugins;
+
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.KeyEvent;
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Iterator;
+
+import javax.swing.JInternalFrame;
+import javax.swing.JMenu;
+import javax.swing.JMenuBar;
+import javax.swing.JMenuItem;
+import javax.swing.JOptionPane;
+
+import com.lowagie.tools.Executable;
+import com.lowagie.tools.ToolMenuItems;
+import com.lowagie.tools.arguments.ToolArgument;
+
+/**
+ * Every iText tool has to implement this interface.
+ */
+public abstract class AbstractTool implements ToolMenuItems, ActionListener {
+
+ /** An array with the versions of the tool. */
+ public static ArrayList versionsarray = new ArrayList();
+
+ /** The internal frame of the tool. */
+ protected JInternalFrame internalFrame = null;
+ /** The list of arguments needed by the tool. */
+ protected ArrayList arguments = new ArrayList();
+ /** Execute menu options */
+ protected int menuoptions = MENU_EXECUTE;
+ /** a menu option */
+ public static final int MENU_EXECUTE = 1;
+ /** a menu option */
+ public static final int MENU_EXECUTE_SHOW = 2;
+ /** a menu option */
+ public static final int MENU_EXECUTE_PRINT = 4;
+ /** a menu option */
+ public static final int MENU_EXECUTE_PRINT_SILENT = 8;
+
+ /**
+ * Sets the arguments.
+ * @param arguments The arguments to set.
+ */
+ public void setArguments(ArrayList arguments) {
+ this.arguments = arguments;
+ }
+
+ /**
+ * Sets the arguments.
+ * @param args the arguments as String-array.
+ */
+ public void setArguments(String[] args) {
+ int counter = 0;
+ ToolArgument argument;
+ for (Iterator i = arguments.iterator(); i.hasNext(); ) {
+ argument = (ToolArgument) i.next();
+ if (args.length > counter) {
+ argument.setValue(args[counter]);
+ }
+ else {
+ break;
+ }
+ counter++;
+ }
+ }
+
+ /**
+ * Gets the arguments.
+ * @return Returns the arguments.
+ */
+ public ArrayList getArguments() {
+ return arguments;
+ }
+
+ /**
+ * Gets the value of a given argument.
+ * @param name the name of the argument
+ * @return the value of an argument as an Object.
+ * @throws InstantiationException
+ */
+ public Object getValue(String name) throws InstantiationException {
+ ToolArgument argument;
+ for (Iterator i = arguments.iterator(); i.hasNext(); ) {
+ argument = (ToolArgument) i.next();
+ if (name.equals(argument.getName())) {
+ return argument.getArgument();
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Sets the internal frame.
+ * @param internalFrame The internalFrame to set.
+ */
+ public void setInternalFrame(JInternalFrame internalFrame) {
+ this.internalFrame = internalFrame;
+ }
+
+ /**
+ * Returns the internal frame. Creates one if it's null.
+ * @return Returns the internalFrame.
+ */
+ public JInternalFrame getInternalFrame() {
+ if (internalFrame == null) {
+ createFrame();
+ }
+ return internalFrame;
+ }
+
+ /**
+ * Gets the menubar.
+ * @return a menubar for this tool
+ */
+ public JMenuBar getMenubar() {
+ JMenuBar menubar = new JMenuBar();
+ JMenu tool = new JMenu(TOOL);
+ tool.setMnemonic(KeyEvent.VK_F);
+ JMenuItem usage = new JMenuItem(USAGE);
+ usage.setMnemonic(KeyEvent.VK_U);
+ usage.addActionListener(this);
+ tool.add(usage);
+ JMenuItem args = new JMenuItem(ARGUMENTS);
+ args.setMnemonic(KeyEvent.VK_A);
+ args.addActionListener(this);
+ tool.add(args);
+ if ((menuoptions & MENU_EXECUTE) > 0) {
+ JMenuItem execute = new JMenuItem(EXECUTE);
+ execute.setMnemonic(KeyEvent.VK_E);
+ execute.addActionListener(this);
+ tool.add(execute);
+ }
+ if ((menuoptions & MENU_EXECUTE_SHOW) > 0) {
+ JMenuItem execute = new JMenuItem(EXECUTESHOW);
+ execute.addActionListener(this);
+ tool.add(execute);
+ }
+ if ((menuoptions & MENU_EXECUTE_PRINT) > 0) {
+ JMenuItem execute = new JMenuItem(EXECUTEPRINT);
+ execute.addActionListener(this);
+ tool.add(execute);
+ }
+ if ((menuoptions & MENU_EXECUTE_PRINT_SILENT) > 0) {
+ JMenuItem execute = new JMenuItem(EXECUTEPRINTSILENT);
+ execute.addActionListener(this);
+ tool.add(execute);
+ }
+ JMenuItem close = new JMenuItem(CLOSE);
+ close.setMnemonic(KeyEvent.VK_C);
+ close.addActionListener(this);
+ tool.add(close);
+ menubar.add(tool);
+ if (arguments.size() > 0) {
+ JMenu params = new JMenu(ARGUMENTS);
+ tool.setMnemonic(KeyEvent.VK_T);
+ JMenuItem item;
+ ToolArgument argument;
+ for (Iterator i = arguments.iterator(); i.hasNext(); ) {
+ argument = (ToolArgument)i.next();
+ item = new JMenuItem(argument.getName());
+ item.setToolTipText(argument.getDescription());
+ item.addActionListener(argument);
+ params.add(item);
+ }
+ menubar.add(params);
+ }
+ return menubar;
+ }
+
+ /**
+ * Gets the usage of the tool.
+ * @return a String describing how to use the tool.
+ */
+ public String getUsage() {
+ StringBuffer buf = new StringBuffer("java ");
+ buf.append(getClass().getName());
+ ToolArgument argument;
+ for (Iterator i = arguments.iterator(); i.hasNext(); ) {
+ argument = (ToolArgument) i.next();
+ buf.append(" ");
+ buf.append(argument.getName());
+ }
+ buf.append("\n");
+ for (Iterator i = arguments.iterator(); i.hasNext(); ) {
+ argument = (ToolArgument) i.next();
+ buf.append(argument.getUsage());
+ }
+ return buf.toString();
+ }
+
+ /**
+ * Gets the current arguments of the tool.
+ * @return a String with the list of arguments and their values.
+ */
+ public String getArgs() {
+ StringBuffer buf = new StringBuffer("Current arguments:\n");
+ ToolArgument argument;
+ for (Iterator i = arguments.iterator(); i.hasNext(); ) {
+ argument = (ToolArgument) i.next();
+ buf.append(" ");
+ buf.append(argument.getName());
+ if (argument.getValue() == null) {
+ buf.append(" = null\n");
+ }
+ else {
+ buf.append(" = '");
+ buf.append(argument.getValue());
+ buf.append("'\n");
+ }
+ }
+ return buf.toString();
+ }
+
+ /**
+ * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
+ */
+ public void actionPerformed(ActionEvent evt) {
+ if (CLOSE.equals(evt.getActionCommand())) {
+ System.out.println("=== " + getInternalFrame().getTitle() + " CLOSED ===");
+ internalFrame.dispose();
+ }
+ if (USAGE.equals(evt.getActionCommand())) {
+ JOptionPane.showMessageDialog(internalFrame, getUsage());
+ }
+ if (ARGUMENTS.equals(evt.getActionCommand())) {
+ JOptionPane.showMessageDialog(internalFrame, getArgs());
+ }
+ if (EXECUTE.equals(evt.getActionCommand())) {
+ this.execute();
+ }
+ if (EXECUTESHOW.equals(evt.getActionCommand())) {
+ this.execute();
+ try {
+ Executable.openDocument(getDestPathPDF());
+ } catch (Exception e) {
+ System.err.println(e.getMessage());
+ }
+ }
+ if (EXECUTEPRINT.equals(evt.getActionCommand())) {
+ this.execute();
+ try {
+ Executable.printDocument(getDestPathPDF());
+ } catch (Exception e) {
+ System.err.println(e.getMessage());
+ }
+ }
+ if (EXECUTEPRINTSILENT.equals(evt.getActionCommand())) {
+ this.execute();
+ try {
+ Executable.printDocumentSilent(getDestPathPDF());
+ } catch (Exception e) {
+ System.err.println(e.getMessage());
+ }
+ }
+ }
+
+ /**
+ * Gets the PDF file that should be generated (or null if the output isn't a PDF file).
+ * @return the PDF file that should be generated
+ * @throws InstantiationException
+ */
+ protected abstract File getDestPathPDF() throws InstantiationException;
+
+ /**
+ * Creates the internal frame.
+ */
+ protected abstract void createFrame();
+
+ /**
+ * Executes the tool (in most cases this generates a PDF file).
+ */
+ public abstract void execute();
+
+ /**
+ * Indicates that the value of an argument has changed.
+ * @param arg the argument that has changed
+ */
+ public abstract void valueHasChanged(ToolArgument arg);
+
+ /**
+ * Add the version of the plugin to the versions array.
+ * @param version the version to add.
+ */
+ protected static void addVersion(String version) {
+ version = version.substring(5, version.length() - 7);
+ version = version.substring(0, version.lastIndexOf(" "));
+ versionsarray.add(version);
+ }
+}
diff --git a/src/main/java/com/lowagie/tools/plugins/Bookmarks2XML.java b/src/main/java/com/lowagie/tools/plugins/Bookmarks2XML.java
new file mode 100644
index 0000000..444a775
--- /dev/null
+++ b/src/main/java/com/lowagie/tools/plugins/Bookmarks2XML.java
@@ -0,0 +1,148 @@
+/*
+ * $Id: Bookmarks2XML.java,v 1.1 2006/02/02 15:56:53 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2005 by Hans-Werner Hilse.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+package com.lowagie.tools.plugins;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.util.List;
+
+import javax.swing.JInternalFrame;
+import javax.swing.JOptionPane;
+
+import com.lowagie.text.pdf.PdfReader;
+import com.lowagie.text.pdf.SimpleBookmark;
+import com.lowagie.tools.arguments.FileArgument;
+import com.lowagie.tools.arguments.PdfFilter;
+import com.lowagie.tools.arguments.ToolArgument;
+
+/**
+ * Allows you to add bookmarks to an existing PDF file
+ */
+public class Bookmarks2XML extends AbstractTool {
+
+ static {
+ addVersion("$Id: Bookmarks2XML.java,v 1.1 2006/02/02 15:56:53 blowagie Exp $");
+ }
+
+ /**
+ * Constructs an Bookmarks2XML object.
+ */
+ public Bookmarks2XML() {
+ arguments.add(new FileArgument(this, "pdffile", "the PDF from which you want to extract bookmarks", false, new PdfFilter()));
+ arguments.add(new FileArgument(this, "xmlfile", "the resulting bookmarks file in XML", true));
+ }
+
+ /**
+ * @see com.lowagie.tools.plugins.AbstractTool#createFrame()
+ */
+ protected void createFrame() {
+ internalFrame = new JInternalFrame("Bookmarks2XML", true, true, true);
+ internalFrame.setSize(300, 80);
+ internalFrame.setJMenuBar(getMenubar());
+ System.out.println("=== Bookmarks2XML OPENED ===");
+ }
+
+ /**
+ * @see com.lowagie.tools.plugins.AbstractTool#execute()
+ */
+ public void execute() {
+ try {
+ if (getValue("xmlfile") == null) throw new InstantiationException("You need to choose an xml file");
+ if (getValue("pdffile") == null) throw new InstantiationException("You need to choose a source PDF file");
+ PdfReader reader = new PdfReader(((File)getValue("pdffile")).getAbsolutePath());
+ reader.consolidateNamedDestinations();
+ List bookmarks = SimpleBookmark.getBookmark( reader );
+ // save them in XML format
+ FileOutputStream bmWriter = new FileOutputStream( (File)getValue("xmlfile") );
+ SimpleBookmark.exportToXML(bookmarks, bmWriter, "UTF-8", false);
+ bmWriter.close();
+ }
+ catch(Exception e) {
+ e.printStackTrace();
+ JOptionPane.showMessageDialog(internalFrame,
+ e.getMessage(),
+ e.getClass().getName(),
+ JOptionPane.ERROR_MESSAGE);
+ System.err.println(e.getMessage());
+ }
+ }
+
+ /**
+ * @see com.lowagie.tools.plugins.AbstractTool#valueHasChanged(com.lowagie.tools.arguments.ToolArgument)
+ */
+ public void valueHasChanged(ToolArgument arg) {
+ if (internalFrame == null) {
+ // if the internal frame is null, the tool was called from the commandline
+ return;
+ }
+ // represent the changes of the argument in the internal frame
+ }
+
+ /**
+ * Allows you to generate an index file in HTML containing Bookmarks to an existing PDF file.
+ * @param args
+ */
+ public static void main(String[] args) {
+ Bookmarks2XML tool = new Bookmarks2XML();
+ if (args.length < 2) {
+ System.err.println(tool.getUsage());
+ }
+ tool.setArguments(args);
+ tool.execute();
+ }
+
+ /**
+ * @see com.lowagie.tools.plugins.AbstractTool#getDestPathPDF()
+ */
+ protected File getDestPathPDF() throws InstantiationException {
+ throw new InstantiationException("There is no file to show.");
+ }
+
+}
diff --git a/src/main/java/com/lowagie/tools/plugins/Burst.java b/src/main/java/com/lowagie/tools/plugins/Burst.java
new file mode 100644
index 0000000..1aca12a
--- /dev/null
+++ b/src/main/java/com/lowagie/tools/plugins/Burst.java
@@ -0,0 +1,140 @@
+/*
+ * $Id: Burst.java,v 1.8 2005/11/29 21:05:02 blowagie Exp $
+ * $Name: $
+ *
+ * This code is free software. It may only be copied or modified
+ * if you include the following copyright notice:
+ *
+ * This class by Mark Thompson. Copyright (c) 2002 Mark Thompson.
+ *
+ * This code is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * itext-questions@list.sourceforge.net
+ */
+package com.lowagie.tools.plugins;
+
+import java.io.File;
+import java.io.FileOutputStream;
+
+import javax.swing.JInternalFrame;
+
+import com.lowagie.text.Document;
+import com.lowagie.text.pdf.PdfContentByte;
+import com.lowagie.text.pdf.PdfImportedPage;
+import com.lowagie.text.pdf.PdfReader;
+import com.lowagie.text.pdf.PdfWriter;
+import com.lowagie.tools.arguments.FileArgument;
+import com.lowagie.tools.arguments.LabelAccessory;
+import com.lowagie.tools.arguments.PdfFilter;
+import com.lowagie.tools.arguments.ToolArgument;
+
+/**
+ * This tool lets you split a PDF in several separate PDF files (1 per page).
+ */
+public class Burst extends AbstractTool {
+
+ static {
+ addVersion("$Id: Burst.java,v 1.8 2005/11/29 21:05:02 blowagie Exp $");
+ }
+
+ /**
+ * Constructs a Burst object.
+ */
+ public Burst() {
+ FileArgument f = new FileArgument(this, "srcfile", "The file you want to split", false, new PdfFilter());
+ f.setLabel(new LabelAccessory());
+ arguments.add(f);
+ }
+
+ /**
+ * @see com.lowagie.tools.plugins.AbstractTool#createFrame()
+ */
+ protected void createFrame() {
+ internalFrame = new JInternalFrame("Burst", true, false, true);
+ internalFrame.setSize(300, 80);
+ internalFrame.setJMenuBar(getMenubar());
+ System.out.println("=== Burst OPENED ===");
+ }
+
+ /**
+ * @see com.lowagie.tools.plugins.AbstractTool#execute()
+ */
+ public void execute() {
+ try {
+ if (getValue("srcfile") == null) throw new InstantiationException("You need to choose a sourcefile");
+ File src = (File)getValue("srcfile");
+ File directory = src.getParentFile();
+ String name = src.getName();
+ name = name.substring(0, name.lastIndexOf("."));
+ // we create a reader for a certain document
+ PdfReader reader = new PdfReader(src.getAbsolutePath());
+ // we retrieve the total number of pages
+ int n = reader.getNumberOfPages();
+ int digits = 1 + (n / 10);
+ System.out.println("There are " + n + " pages in the original file.");
+ Document document;
+ int pagenumber;
+ String filename;
+ for (int i = 0; i < n; i++) {
+ pagenumber = i + 1;
+ filename = String.valueOf(pagenumber);
+ while (filename.length() < digits) filename = "0" + filename;
+ filename = "_" + filename + ".pdf";
+ // step 1: creation of a document-object
+ document = new Document(reader.getPageSizeWithRotation(pagenumber));
+ // step 2: we create a writer that listens to the document
+ PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(new File(directory, name + filename)));
+ // step 3: we open the document
+ document.open();
+ PdfContentByte cb = writer.getDirectContent();
+ PdfImportedPage page = writer.getImportedPage(reader, pagenumber);
+ int rotation = reader.getPageRotation(pagenumber);
+ if (rotation == 90 || rotation == 270) {
+ cb.addTemplate(page, 0, -1f, 1f, 0, 0, reader.getPageSizeWithRotation(pagenumber).height());
+ }
+ else {
+ cb.addTemplate(page, 1f, 0, 0, 1f, 0, 0);
+ }
+ // step 5: we close the document
+ document.close();
+ }
+ }
+ catch(Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ /**
+ * @see com.lowagie.tools.plugins.AbstractTool#valueHasChanged(com.lowagie.tools.arguments.ToolArgument)
+ */
+ public void valueHasChanged(ToolArgument arg) {
+ if (internalFrame == null) {
+ // if the internal frame is null, the tool was called from the commandline
+ return;
+ }
+ // represent the changes of the argument in the internal frame
+ }
+
+
+ /**
+ * Divide PDF file into pages.
+ * @param args
+ */
+ public static void main(String[] args) {
+ Burst tool = new Burst();
+ if (args.length < 1) {
+ System.err.println(tool.getUsage());
+ }
+ tool.setArguments(args);
+ tool.execute();
+ }
+
+ /**
+ * @see com.lowagie.tools.plugins.AbstractTool#getDestPathPDF()
+ */
+ protected File getDestPathPDF() throws InstantiationException {
+ throw new InstantiationException("There is more than one destfile.");
+ }
+}
diff --git a/src/main/java/com/lowagie/tools/plugins/Concat.java b/src/main/java/com/lowagie/tools/plugins/Concat.java
new file mode 100644
index 0000000..b6eb369
--- /dev/null
+++ b/src/main/java/com/lowagie/tools/plugins/Concat.java
@@ -0,0 +1,185 @@
+/*
+ * $Id: Concat.java,v 1.7 2005/11/29 21:05:02 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2005 by Bruno Lowagie.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+package com.lowagie.tools.plugins;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.swing.JInternalFrame;
+
+import com.lowagie.text.Document;
+import com.lowagie.text.pdf.PdfCopy;
+import com.lowagie.text.pdf.PdfImportedPage;
+import com.lowagie.text.pdf.PdfReader;
+import com.lowagie.text.pdf.SimpleBookmark;
+import com.lowagie.tools.arguments.FileArgument;
+import com.lowagie.tools.arguments.PdfFilter;
+import com.lowagie.tools.arguments.ToolArgument;
+
+/**
+ * Concatenates two PDF files
+ */
+public class Concat extends AbstractTool {
+
+ static {
+ addVersion("$Id: Concat.java,v 1.7 2005/11/29 21:05:02 blowagie Exp $");
+ }
+ /**
+ * Constructs a Concat object.
+ */
+ public Concat() {
+ menuoptions = MENU_EXECUTE | MENU_EXECUTE_SHOW;
+ arguments.add(new FileArgument(this, "srcfile1", "The first PDF file", false, new PdfFilter()));
+ arguments.add(new FileArgument(this, "srcfile2", "The second PDF file", false, new PdfFilter()));
+ arguments.add(new FileArgument(this, "destfile", "The file to which the concatenated PDF has to be written", true, new PdfFilter()));
+ }
+
+ /**
+ * @see com.lowagie.tools.plugins.AbstractTool#createFrame()
+ */
+ protected void createFrame() {
+ internalFrame = new JInternalFrame("Concatenate 2 PDF files", true, false, true);
+ internalFrame.setSize(300, 80);
+ internalFrame.setJMenuBar(getMenubar());
+ System.out.println("=== Concat OPENED ===");
+ }
+
+ /**
+ * @see com.lowagie.tools.plugins.AbstractTool#execute()
+ */
+ public void execute() {
+ try {
+ String[] files = new String[2];
+ if (getValue("srcfile1") == null) throw new InstantiationException("You need to choose a first sourcefile");
+ files[0] = ((File)getValue("srcfile1")).getAbsolutePath();
+ if (getValue("srcfile2") == null) throw new InstantiationException("You need to choose a second sourcefile");
+ files[1] = ((File)getValue("srcfile2")).getAbsolutePath();
+ if (getValue("destfile") == null) throw new InstantiationException("You need to choose a destination file");
+ File pdf_file = (File)getValue("destfile");
+ int pageOffset = 0;
+ ArrayList master = new ArrayList();
+ Document document = null;
+ PdfCopy writer = null;
+ for (int i = 0; i < 2; i++) {
+ // we create a reader for a certain document
+ PdfReader reader = new PdfReader(files[i]);
+ reader.consolidateNamedDestinations();
+ // we retrieve the total number of pages
+ int n = reader.getNumberOfPages();
+ List bookmarks = SimpleBookmark.getBookmark(reader);
+ if (bookmarks != null) {
+ if (pageOffset != 0)
+ SimpleBookmark.shiftPageNumbers(bookmarks, pageOffset, null);
+ master.addAll(bookmarks);
+ }
+ pageOffset += n;
+ System.out.println("There are " + n + " pages in " + files[i]);
+ if (i == 0) {
+ // step 1: creation of a document-object
+ document = new Document(reader.getPageSizeWithRotation(1));
+ // step 2: we create a writer that listens to the document
+ writer = new PdfCopy(document, new FileOutputStream(pdf_file));
+ // step 3: we open the document
+ document.open();
+ }
+ // step 4: we add content
+ PdfImportedPage page;
+ for (int p = 0; p < n; ) {
+ ++p;
+ page = writer.getImportedPage(reader, p);
+ writer.addPage(page);
+ System.out.println("Processed page " + p);
+ }
+ }
+ if (master.size() > 0)
+ writer.setOutlines(master);
+ // step 5: we close the document
+ document.close();
+ }
+ catch(Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ /**
+ * @see com.lowagie.tools.plugins.AbstractTool#valueHasChanged(com.lowagie.tools.arguments.ToolArgument)
+ */
+ public void valueHasChanged(ToolArgument arg) {
+ if (internalFrame == null) {
+ // if the internal frame is null, the tool was called from the commandline
+ return;
+ }
+ // represent the changes of the argument in the internal frame
+ }
+
+
+ /**
+ * Concatenates two PDF files.
+ * @param args
+ */
+ public static void main(String[] args) {
+ Concat tool = new Concat();
+ if (args.length < 2) {
+ System.err.println(tool.getUsage());
+ }
+ tool.setArguments(args);
+ tool.execute();
+ }
+
+ /**
+ * @see com.lowagie.tools.plugins.AbstractTool#getDestPathPDF()
+ */
+ protected File getDestPathPDF() throws InstantiationException {
+ return (File)getValue("destfile");
+ }
+
+}
diff --git a/src/main/java/com/lowagie/tools/plugins/Decrypt.java b/src/main/java/com/lowagie/tools/plugins/Decrypt.java
new file mode 100644
index 0000000..a94b84f
--- /dev/null
+++ b/src/main/java/com/lowagie/tools/plugins/Decrypt.java
@@ -0,0 +1,148 @@
+/*
+ * $Id: Decrypt.java,v 1.4 2005/11/29 21:05:02 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2005 by Bruno Lowagie.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+package com.lowagie.tools.plugins;
+
+import java.io.File;
+import java.io.FileOutputStream;
+
+import javax.swing.JInternalFrame;
+import javax.swing.JOptionPane;
+
+import com.lowagie.text.pdf.PdfReader;
+import com.lowagie.text.pdf.PdfStamper;
+import com.lowagie.tools.arguments.FileArgument;
+import com.lowagie.tools.arguments.PdfFilter;
+import com.lowagie.tools.arguments.ToolArgument;
+
+/**
+ * Allows you to decrypt an existing PDF file.
+ */
+public class Decrypt extends AbstractTool {
+
+ static {
+ addVersion("$Id: Decrypt.java,v 1.4 2005/11/29 21:05:02 blowagie Exp $");
+ }
+
+
+ /**
+ * Constructs an Decrypt object.
+ */
+ public Decrypt() {
+ arguments.add(new FileArgument(this, "srcfile", "The file you want to decrypt", false, new PdfFilter()));
+ arguments.add(new FileArgument(this, "destfile", "The file to which the decrypted PDF has to be written", true, new PdfFilter()));
+ arguments.add(new ToolArgument(this, "ownerpassword", "The ownerpassword you want to add to the PDF file", String.class.getName()));
+ }
+
+ /**
+ * @see com.lowagie.tools.plugins.AbstractTool#createFrame()
+ */
+ protected void createFrame() {
+ internalFrame = new JInternalFrame("Decrypt", true, false, true);
+ internalFrame.setSize(300, 80);
+ internalFrame.setJMenuBar(getMenubar());
+ System.out.println("=== Decrypt OPENED ===");
+ }
+
+ /**
+ * @see com.lowagie.tools.plugins.AbstractTool#execute()
+ */
+ public void execute() {
+ try {
+ if (getValue("srcfile") == null) throw new InstantiationException("You need to choose a sourcefile");
+ if (getValue("destfile") == null) throw new InstantiationException("You need to choose a destination file");
+ byte[] ownerpassword = null;
+ if (getValue("ownerpassword") != null) {
+ ownerpassword = ((String)getValue("ownerpassword")).getBytes();
+ }
+ PdfReader reader = new PdfReader(((File)getValue("srcfile")).getAbsolutePath(), ownerpassword);
+ PdfStamper stamper = new PdfStamper(reader, new FileOutputStream((File)getValue("destfile")));
+ stamper.close();
+ }
+ catch(Exception e) {
+ JOptionPane.showMessageDialog(internalFrame,
+ e.getMessage(),
+ e.getClass().getName(),
+ JOptionPane.ERROR_MESSAGE);
+ System.err.println(e.getMessage());
+ }
+ }
+
+ /**
+ * @see com.lowagie.tools.plugins.AbstractTool#valueHasChanged(com.lowagie.tools.arguments.ToolArgument)
+ */
+ public void valueHasChanged(ToolArgument arg) {
+ if (internalFrame == null) {
+ // if the internal frame is null, the tool was called from the commandline
+ return;
+ }
+ // represent the changes of the argument in the internal frame
+ }
+
+ /**
+ * Decrypts an existing PDF file.
+ * @param args
+ */
+ public static void main(String[] args) {
+ Decrypt tool = new Decrypt();
+ if (args.length < 2) {
+ System.err.println(tool.getUsage());
+ }
+ tool.setArguments(args);
+ tool.execute();
+ }
+
+ /**
+ * @see com.lowagie.tools.plugins.AbstractTool#getDestPathPDF()
+ */
+ protected File getDestPathPDF() throws InstantiationException {
+ return (File)getValue("destfile");
+ }
+
+}
diff --git a/src/main/java/com/lowagie/tools/plugins/DvdCover.java b/src/main/java/com/lowagie/tools/plugins/DvdCover.java
new file mode 100644
index 0000000..718ec6d
--- /dev/null
+++ b/src/main/java/com/lowagie/tools/plugins/DvdCover.java
@@ -0,0 +1,201 @@
+/*
+ * $Id: DvdCover.java,v 1.11 2005/11/29 21:05:02 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2005 by Bruno Lowagie.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+package com.lowagie.tools.plugins;
+
+import java.awt.Color;
+import java.io.File;
+import java.io.FileOutputStream;
+
+import javax.swing.JInternalFrame;
+import javax.swing.JOptionPane;
+
+import com.lowagie.text.Document;
+import com.lowagie.text.DocumentException;
+import com.lowagie.text.Element;
+import com.lowagie.text.Image;
+import com.lowagie.text.Rectangle;
+import com.lowagie.text.pdf.BaseFont;
+import com.lowagie.text.pdf.PdfContentByte;
+import com.lowagie.text.pdf.PdfWriter;
+import com.lowagie.tools.arguments.FileArgument;
+import com.lowagie.tools.arguments.ImageArgument;
+import com.lowagie.tools.arguments.PdfFilter;
+import com.lowagie.tools.arguments.ToolArgument;
+
+/**
+ * This is a simple tool that generates a cover for a DVD.
+ */
+public class DvdCover extends AbstractTool {
+
+ static {
+ addVersion("$Id: DvdCover.java,v 1.11 2005/11/29 21:05:02 blowagie Exp $");
+ }
+
+ /**
+ * Constructs a DvdCover object.
+ */
+ public DvdCover() {
+ menuoptions = MENU_EXECUTE | MENU_EXECUTE_SHOW | MENU_EXECUTE_PRINT;
+ arguments.add(new FileArgument(this, "destfile", "The file to which the PDF has to be written", true, new PdfFilter()));
+ arguments.add(new ToolArgument(this, "title", "The title of the DVD", String.class.getName()));
+ arguments.add(new ToolArgument(this, "backgroundcolor", "The backgroundcolor of the DVD Cover (for instance 0xFFFFFF)", Color.class.getName()));
+ arguments.add(new ImageArgument(this, "front", "The front image of the DVD Cover"));
+ arguments.add(new ImageArgument(this, "back", "The back image of the DVD Cover"));
+ arguments.add(new ImageArgument(this, "side", "The side image of the DVD Cover"));
+ }
+
+ /**
+ * @see com.lowagie.tools.plugins.AbstractTool#createFrame()
+ */
+ protected void createFrame() {
+ internalFrame = new JInternalFrame("Make your own DVD Cover", true, false, true);
+ internalFrame.setSize(300, 80);
+ internalFrame.setJMenuBar(getMenubar());
+ System.out.println("=== DvdCover OPENED ===");
+ }
+
+ /**
+ * @see com.lowagie.tools.plugins.AbstractTool#execute()
+ */
+ public void execute() {
+ try {
+ // step 1: creation of a document-object
+ Rectangle pageSize = new Rectangle(780, 525);
+ if (getValue("backgroundcolor") != null) pageSize.setBackgroundColor((Color)getValue("backgroundcolor"));
+ Document document = new Document(pageSize);
+ // step 2:
+ // we create a writer that listens to the document
+ // and directs a PDF-stream to a file
+ if (getValue("destfile") == null) throw new DocumentException("You must provide a destination file!");
+ PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream((File)getValue("destfile")));
+
+ // step 3: we open the document
+ document.open();
+
+ // step 4:
+ PdfContentByte cb = writer.getDirectContent();
+ if (getValue("title") != null) {
+ cb.setFontAndSize(BaseFont.createFont(BaseFont.HELVETICA, BaseFont.WINANSI, false), 24);
+ cb.beginText();
+ if (getValue("front") == null) {
+ cb.showTextAligned(Element.ALIGN_CENTER, (String)getValue("title"), 595f, 262f, 0f);
+ }
+ if (getValue("side") == null) {
+ cb.showTextAligned(Element.ALIGN_CENTER, (String)getValue("title"), 385f, 262f, 270f);
+ }
+ cb.endText();
+ }
+ cb.moveTo(370, 0);
+ cb.lineTo(370, 525);
+ cb.moveTo(410, 525);
+ cb.lineTo(410, 0);
+ cb.stroke();
+ if (getValue("front") != null) {
+ Image front = (Image)getValue("front");
+ front.scaleToFit(370, 525);
+ front.setAbsolutePosition(410f + (370f - front.scaledWidth()) / 2f, (525f - front.scaledHeight()) / 2f);
+ document.add(front);
+ }
+ if (getValue("back") != null) {
+ Image back = (Image)getValue("back");
+ back.scaleToFit(370, 525);
+ back.setAbsolutePosition((370f - back.scaledWidth()) / 2f, (525f - back.scaledHeight()) / 2f);
+ document.add(back);
+ }
+ if (getValue("side") != null) {
+ Image side = (Image)getValue("side");
+ side.scaleToFit(40, 525);
+ side.setAbsolutePosition(370 + (40f - side.scaledWidth()) / 2f, (525f - side.scaledHeight()) / 2f);
+ document.add(side);
+ }
+
+ // step 5: we close the document
+ document.close();
+ }
+ catch(Exception e) {
+ JOptionPane.showMessageDialog(internalFrame,
+ e.getMessage(),
+ e.getClass().getName(),
+ JOptionPane.ERROR_MESSAGE);
+ System.err.println(e.getMessage());
+ }
+ }
+
+ /**
+ * @see com.lowagie.tools.plugins.AbstractTool#valueHasChanged(com.lowagie.tools.arguments.ToolArgument)
+ */
+ public void valueHasChanged(ToolArgument arg) {
+ if (internalFrame == null) {
+ // if the internal frame is null, the tool was called from the commandline
+ return;
+ }
+ // represent the changes of the argument in the internal frame
+ }
+
+ /**
+ * Generates a DVD Cover in PDF.
+ * @param args an array containing [0] a filename [1] a title [2] a backgroundcolor [3] a front image [4] a back image [5] a side image
+ */
+ public static void main(String[] args) {
+ DvdCover tool = new DvdCover();
+ if (args.length == 0) {
+ System.err.println(tool.getUsage());
+ }
+ tool.setArguments(args);
+ tool.execute();
+ }
+
+ /**
+ * @see com.lowagie.tools.plugins.AbstractTool#getDestPathPDF()
+ */
+ protected File getDestPathPDF() throws InstantiationException {
+ return (File)getValue("destfile");
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/tools/plugins/Encrypt.java b/src/main/java/com/lowagie/tools/plugins/Encrypt.java
new file mode 100644
index 0000000..7821759
--- /dev/null
+++ b/src/main/java/com/lowagie/tools/plugins/Encrypt.java
@@ -0,0 +1,193 @@
+/*
+ * $Id: Encrypt.java,v 1.11 2005/11/29 21:05:02 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2005 by Bruno Lowagie.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+package com.lowagie.tools.plugins;
+
+import java.io.File;
+import java.io.FileOutputStream;
+
+import javax.swing.JInternalFrame;
+import javax.swing.JOptionPane;
+
+import com.lowagie.text.pdf.PdfEncryptor;
+import com.lowagie.text.pdf.PdfReader;
+import com.lowagie.text.pdf.PdfWriter;
+import com.lowagie.tools.arguments.BitsetArgument;
+import com.lowagie.tools.arguments.FileArgument;
+import com.lowagie.tools.arguments.OptionArgument;
+import com.lowagie.tools.arguments.PdfFilter;
+import com.lowagie.tools.arguments.ToolArgument;
+
+/**
+ * Allows you to encrypt an existing PDF file.
+ */
+public class Encrypt extends AbstractTool {
+
+ static {
+ addVersion("$Id: Encrypt.java,v 1.11 2005/11/29 21:05:02 blowagie Exp $");
+ }
+ private final static int PERMISSIONS[] = {
+ PdfWriter.AllowPrinting,
+ PdfWriter.AllowModifyContents,
+ PdfWriter.AllowCopy,
+ PdfWriter.AllowModifyAnnotations,
+ PdfWriter.AllowFillIn,
+ PdfWriter.AllowScreenReaders,
+ PdfWriter.AllowAssembly,
+ PdfWriter.AllowDegradedPrinting};
+ private final static String PERMISSION_OPTIONS[] = {
+ "AllowPrinting",
+ "AllowModifyContents",
+ "AllowCopy",
+ "AllowModifyAnnotations",
+ "AllowFillIn (128 bit only)",
+ "AllowScreenReaders (128 bit only)",
+ "AllowAssembly (128 bit only)",
+ "AllowDegradedPrinting (128 bit only)"
+ };
+
+
+ /**
+ * Constructs an Encrypt object.
+ */
+ public Encrypt() {
+ arguments.add(new FileArgument(this, "srcfile", "The file you want to encrypt", false, new PdfFilter()));
+ arguments.add(new FileArgument(this, "destfile", "The file to which the encrypted PDF has to be written", true, new PdfFilter()));
+ arguments.add(new ToolArgument(this, "ownerpassword", "The ownerpassword you want to add to the PDF file", String.class.getName()));
+ arguments.add(new ToolArgument(this, "userpassword", "The userpassword you want to add to the PDF file", String.class.getName()));
+ arguments.add(new BitsetArgument(this, "permissions", "Permissions on the file", PERMISSION_OPTIONS));
+ OptionArgument oa = new OptionArgument(this, "strength", "Strength of the encryption");
+ oa.addOption("40 bit encryption", "40");
+ oa.addOption("128 bit encryption", "128");
+ arguments.add(oa);
+ }
+
+ /**
+ * @see com.lowagie.tools.plugins.AbstractTool#createFrame()
+ */
+ protected void createFrame() {
+ internalFrame = new JInternalFrame("Encrypt", true, false, true);
+ internalFrame.setSize(300, 80);
+ internalFrame.setJMenuBar(getMenubar());
+ System.out.println("=== Encrypt OPENED ===");
+ }
+
+ /**
+ * @see com.lowagie.tools.plugins.AbstractTool#execute()
+ */
+ public void execute() {
+ try {
+ if (getValue("srcfile") == null) throw new InstantiationException("You need to choose a sourcefile");
+ if (getValue("destfile") == null) throw new InstantiationException("You need to choose a destination file");
+ int permissions = 0;
+ String p = (String)getValue("permissions");
+ if (p != null) {
+ for (int k = 0; k < p.length(); ++k) {
+ permissions |= (p.charAt(k) == '0' ? 0 : PERMISSIONS[k]);
+ }
+ }
+ byte[] userpassword = null;
+ if (getValue("userpassword") != null) {
+ userpassword = ((String)getValue("userpassword")).getBytes();
+ }
+ byte[] ownerpassword = null;
+ if (getValue("ownerpassword") != null) {
+ ownerpassword = ((String)getValue("ownerpassword")).getBytes();
+ }
+ PdfReader reader = new PdfReader(((File)getValue("srcfile")).getAbsolutePath());
+ PdfEncryptor.encrypt(
+ reader,
+ new FileOutputStream((File)getValue("destfile")),
+ userpassword,
+ ownerpassword,
+ permissions,
+ "128".equals(getValue("strength"))
+ );
+ }
+ catch(Exception e) {
+ JOptionPane.showMessageDialog(internalFrame,
+ e.getMessage(),
+ e.getClass().getName(),
+ JOptionPane.ERROR_MESSAGE);
+ System.err.println(e.getMessage());
+ }
+ }
+
+ /**
+ * @see com.lowagie.tools.plugins.AbstractTool#valueHasChanged(com.lowagie.tools.arguments.ToolArgument)
+ */
+ public void valueHasChanged(ToolArgument arg) {
+ if (internalFrame == null) {
+ // if the internal frame is null, the tool was called from the commandline
+ return;
+ }
+ // represent the changes of the argument in the internal frame
+ }
+
+ /**
+ * Encrypts an existing PDF file.
+ * @param args
+ */
+ public static void main(String[] args) {
+ Encrypt tool = new Encrypt();
+ if (args.length < 2) {
+ System.err.println(tool.getUsage());
+ }
+ tool.setArguments(args);
+ tool.execute();
+ }
+
+ /**
+ * @see com.lowagie.tools.plugins.AbstractTool#getDestPathPDF()
+ */
+ protected File getDestPathPDF() throws InstantiationException {
+ return (File)getValue("destfile");
+ }
+
+}
diff --git a/src/main/java/com/lowagie/tools/plugins/ExtractAttachments.java b/src/main/java/com/lowagie/tools/plugins/ExtractAttachments.java
new file mode 100644
index 0000000..455f3a2
--- /dev/null
+++ b/src/main/java/com/lowagie/tools/plugins/ExtractAttachments.java
@@ -0,0 +1,227 @@
+/*
+ * $Id: ExtractAttachments.java,v 1.5 2006/03/01 11:41:16 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2005 by Paulo Soares and Anonymous.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+package com.lowagie.tools.plugins;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Iterator;
+
+import javax.swing.JInternalFrame;
+
+import com.lowagie.text.pdf.*;
+import com.lowagie.tools.arguments.FileArgument;
+import com.lowagie.tools.arguments.LabelAccessory;
+import com.lowagie.tools.arguments.PdfFilter;
+import com.lowagie.tools.arguments.ToolArgument;
+
+/**
+ * This tool lets you extract the attachements of a PDF.
+ */
+public class ExtractAttachments extends AbstractTool {
+
+ static {
+ addVersion("$Id: ExtractAttachments.java,v 1.5 2006/03/01 11:41:16 blowagie Exp $");
+ }
+
+ /**
+ * Constructs a ExtractAttachements object.
+ */
+ public ExtractAttachments() {
+ FileArgument f = new FileArgument(this, "srcfile",
+ "The file you want to operate on", false, new PdfFilter());
+ f.setLabel(new LabelAccessory());
+ arguments.add(f);
+ }
+
+ /**
+ * @see com.lowagie.tools.plugins.AbstractTool#createFrame()
+ */
+ protected void createFrame() {
+ internalFrame = new JInternalFrame("ExtractAttachments", true, false,
+ true);
+ internalFrame.setSize(300, 80);
+ internalFrame.setJMenuBar(getMenubar());
+ System.out.println("=== ExtractAttachments OPENED ===");
+ }
+
+ /**
+ * @see com.lowagie.tools.plugins.AbstractTool#execute()
+ */
+ public void execute() {
+ try {
+ if (getValue("srcfile") == null)
+ throw new InstantiationException(
+ "You need to choose a sourcefile");
+ File src = (File) getValue("srcfile");
+
+ // we create a reader for a certain document
+ PdfReader reader = new PdfReader(src.getAbsolutePath());
+ final File parentFile = src.getParentFile();
+ final String outPath;
+ if (parentFile != null) {
+ outPath = parentFile.getAbsolutePath();
+ } else {
+ outPath = "";
+ }
+ PdfDictionary catalog = reader.getCatalog();
+ PdfDictionary names = (PdfDictionary) PdfReader
+ .getPdfObject(catalog.get(PdfName.NAMES));
+ if (names != null) {
+ PdfDictionary embFiles = (PdfDictionary) PdfReader
+ .getPdfObject(names.get(new PdfName("EmbeddedFiles")));
+ if (embFiles != null) {
+ HashMap embMap = PdfNameTree.readTree(embFiles);
+ for (Iterator i = embMap.values().iterator(); i.hasNext();) {
+ PdfDictionary filespec = (PdfDictionary) PdfReader
+ .getPdfObject((PdfObject) i.next());
+ unpackFile(reader, filespec, outPath);
+ }
+ }
+ }
+ for (int k = 1; k <= reader.getNumberOfPages(); ++k) {
+ PdfArray annots = (PdfArray) PdfReader.getPdfObject(reader
+ .getPageN(k).get(PdfName.ANNOTS));
+ if (annots == null)
+ continue;
+ for (Iterator i = annots.listIterator(); i.hasNext();) {
+ PdfDictionary annot = (PdfDictionary) PdfReader
+ .getPdfObject((PdfObject) i.next());
+ PdfName subType = (PdfName) PdfReader.getPdfObject(annot
+ .get(PdfName.SUBTYPE));
+ if (!PdfName.FILEATTACHMENT.equals(subType))
+ continue;
+ PdfDictionary filespec = (PdfDictionary) PdfReader
+ .getPdfObject(annot.get(PdfName.FS));
+ unpackFile(reader, filespec, outPath);
+ }
+ }
+
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ /**
+ * @see com.lowagie.tools.plugins.AbstractTool#valueHasChanged(com.lowagie.tools.arguments.ToolArgument)
+ */
+ public void valueHasChanged(ToolArgument arg) {
+ if (internalFrame == null) {
+ // if the internal frame is null, the tool was called from the
+ // commandline
+ return;
+ }
+ // represent the changes of the argument in the internal frame
+ }
+
+ /**
+ * Extract the attachements of a PDF.
+ *
+ * @param args
+ */
+ public static void main(String[] args) {
+ ExtractAttachments tool = new ExtractAttachments();
+ if (args.length < 1) {
+ System.err.println(tool.getUsage());
+ }
+ tool.setArguments(args);
+ tool.execute();
+ }
+
+ /**
+ * @see com.lowagie.tools.plugins.AbstractTool#getDestPathPDF()
+ */
+ protected File getDestPathPDF() throws InstantiationException {
+ throw new InstantiationException("There is more than one destfile.");
+ }
+
+ /**
+ * Unpacks a file attachment.
+ *
+ * @param reader
+ * The object that reads the PDF document
+ * @param filespec
+ * The dictonary containing the file specifications
+ * @param outPath
+ * The path where the attachment has to be written
+ * @throws IOException
+ */
+ public static void unpackFile(PdfReader reader, PdfDictionary filespec,
+ String outPath) throws IOException {
+ if (filespec == null)
+ return;
+ PdfName type = (PdfName) PdfReader.getPdfObject(filespec
+ .get(PdfName.TYPE));
+ if (!PdfName.F.equals(type) && !PdfName.FILESPEC.equals(type))
+ return;
+ PdfDictionary ef = (PdfDictionary) PdfReader.getPdfObject(filespec
+ .get(PdfName.EF));
+ if (ef == null)
+ return;
+ PdfString fn = (PdfString) PdfReader.getPdfObject(filespec
+ .get(PdfName.F));
+ System.out.println("Unpacking file '" + fn + "' to " + outPath);
+ if (fn == null)
+ return;
+ File fLast = new File(fn.toUnicodeString());
+ File fullPath = new File(outPath, fLast.getName());
+ if (fullPath.exists())
+ return;
+ PRStream prs = (PRStream) PdfReader.getPdfObject(ef.get(PdfName.F));
+ if (prs == null)
+ return;
+ byte b[] = PdfReader.getStreamBytes(prs);
+ FileOutputStream fout = new FileOutputStream(fullPath);
+ fout.write(b);
+ fout.close();
+ }
+
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/tools/plugins/Handouts.java b/src/main/java/com/lowagie/tools/plugins/Handouts.java
new file mode 100644
index 0000000..fed8788
--- /dev/null
+++ b/src/main/java/com/lowagie/tools/plugins/Handouts.java
@@ -0,0 +1,232 @@
+/*
+ * $Id: Handouts.java,v 1.7 2005/11/29 21:05:02 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2005 by Bruno Lowagie.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+package com.lowagie.tools.plugins;
+
+import java.io.File;
+import java.io.FileOutputStream;
+
+import javax.swing.JInternalFrame;
+import javax.swing.JOptionPane;
+
+import com.lowagie.text.Document;
+import com.lowagie.text.PageSize;
+import com.lowagie.text.Rectangle;
+import com.lowagie.text.pdf.PdfContentByte;
+import com.lowagie.text.pdf.PdfImportedPage;
+import com.lowagie.text.pdf.PdfReader;
+import com.lowagie.text.pdf.PdfWriter;
+import com.lowagie.tools.arguments.FileArgument;
+import com.lowagie.tools.arguments.OptionArgument;
+import com.lowagie.tools.arguments.PdfFilter;
+import com.lowagie.tools.arguments.ToolArgument;
+
+/**
+ * Generates a PDF file that is useable as Handout.
+ */
+public class Handouts extends AbstractTool {
+
+ static {
+ addVersion("$Id: Handouts.java,v 1.7 2005/11/29 21:05:02 blowagie Exp $");
+ }
+
+ /**
+ * Constructs a Handouts object.
+ */
+ public Handouts() {
+ arguments.add(new FileArgument(this, "srcfile", "The file you want to convert", false, new PdfFilter()));
+ arguments.add(new FileArgument(this, "destfile", "The file to which the Handout has to be written", true, new PdfFilter()));
+ OptionArgument oa = new OptionArgument(this, "pages", "The number of pages you want on one handout page");
+ oa.addOption("2 pages on 1", "2");
+ oa.addOption("3 pages on 1", "3");
+ oa.addOption("4 pages on 1", "4");
+ oa.addOption("5 pages on 1", "5");
+ oa.addOption("6 pages on 1", "6");
+ oa.addOption("7 pages on 1", "7");
+ oa.addOption("8 pages on 1", "8");
+ arguments.add(oa);
+ }
+
+ /**
+ * @see com.lowagie.tools.plugins.AbstractTool#createFrame()
+ */
+ protected void createFrame() {
+ internalFrame = new JInternalFrame("Handouts", true, false, true);
+ internalFrame.setSize(300, 80);
+ internalFrame.setJMenuBar(getMenubar());
+ System.out.println("=== Handouts OPENED ===");
+ }
+
+ /**
+ * @see com.lowagie.tools.plugins.AbstractTool#execute()
+ */
+ public void execute() {
+ try {
+ if (getValue("srcfile") == null) throw new InstantiationException("You need to choose a sourcefile");
+ File src = (File)getValue("srcfile");
+ if (getValue("destfile") == null) throw new InstantiationException("You need to choose a destination file");
+ File dest = (File)getValue("destfile");
+ int pages;
+ try {
+ pages = Integer.parseInt((String) getValue("pages"));
+ }
+ catch(Exception e) {
+ pages = 4;
+ }
+
+ float x1 = 30f;
+ float x2 = 280f;
+ float x3 = 320f;
+ float x4 = 565f;
+
+ float[] y1 = new float[pages];
+ float[] y2 = new float[pages];
+
+ float height = (778f - (20f * (pages - 1))) / pages;
+ y1[0] = 812f;
+ y2[0] = 812f - height;
+
+ for (int i = 1; i < pages; i++) {
+ y1[i] = y2[i - 1] - 20f;
+ y2[i] = y1[i] - height;
+ }
+
+ // we create a reader for a certain document
+ PdfReader reader = new PdfReader(src.getAbsolutePath());
+ // we retrieve the total number of pages
+ int n = reader.getNumberOfPages();
+ System.out.println("There are " + n + " pages in the original file.");
+
+ // step 1: creation of a document-object
+ Document document = new Document(PageSize.A4);
+ // step 2: we create a writer that listens to the document
+ PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(dest));
+ // step 3: we open the document
+ document.open();
+ PdfContentByte cb = writer.getDirectContent();
+ PdfImportedPage page;
+ int rotation;
+ int i = 0;
+ int p = 0;
+ // step 4: we add content
+ while (i < n) {
+ i++;
+ Rectangle rect = reader.getPageSizeWithRotation(i);
+ float factorx = (x2 - x1) / rect.width();
+ float factory = (y1[p] - y2[p]) / rect.height();
+ float factor = (factorx < factory ? factorx : factory);
+ float dx = (factorx == factor ? 0f : ((x2 - x1) - rect.width() * factor) / 2f);
+ float dy = (factory == factor ? 0f : ((y1[p] - y2[p]) - rect.height() * factor) / 2f);
+ page = writer.getImportedPage(reader, i);
+ rotation = reader.getPageRotation(i);
+ if (rotation == 90 || rotation == 270) {
+ cb.addTemplate(page, 0, -factor, factor, 0, x1 + dx, y2[p] + dy + rect.height() * factor);
+ }
+ else {
+ cb.addTemplate(page, factor, 0, 0, factor, x1 + dx, y2[p] + dy);
+ }
+ cb.setRGBColorStroke(0xC0, 0xC0, 0xC0);
+ cb.rectangle(x3 - 5f, y2[p] - 5f, x4 - x3 + 10f, y1[p] - y2[p] + 10f);
+ for (float l = y1[p] - 19; l > y2[p]; l -= 16) {
+ cb.moveTo(x3, l);
+ cb.lineTo(x4, l);
+ }
+ cb.rectangle(x1 + dx, y2[p] + dy, rect.width() * factor, rect.height() * factor);
+ cb.stroke();
+ System.out.println("Processed page " + i);
+ p++;
+ if (p == pages) {
+ p = 0;
+ document.newPage();
+ }
+ }
+ // step 5: we close the document
+ document.close();
+ }
+ catch(Exception e) {
+ JOptionPane.showMessageDialog(internalFrame,
+ e.getMessage(),
+ e.getClass().getName(),
+ JOptionPane.ERROR_MESSAGE);
+ System.err.println(e.getMessage());
+ }
+ }
+
+ /**
+ * @see com.lowagie.tools.plugins.AbstractTool#valueHasChanged(com.lowagie.tools.arguments.ToolArgument)
+ */
+ public void valueHasChanged(ToolArgument arg) {
+ if (internalFrame == null) {
+ // if the internal frame is null, the tool was called from the commandline
+ return;
+ }
+ // represent the changes of the argument in the internal frame
+ }
+
+
+ /**
+ * Converts a PDF file to a PDF file useable as Handout.
+ * @param args
+ */
+ public static void main(String[] args) {
+ Handouts tool = new Handouts();
+ if (args.length < 2) {
+ System.err.println(tool.getUsage());
+ }
+ tool.setArguments(args);
+ tool.execute();
+ }
+
+ /**
+ * @see com.lowagie.tools.plugins.AbstractTool#getDestPathPDF()
+ */
+ protected File getDestPathPDF() throws InstantiationException {
+ return (File)getValue("destfile");
+ }
+}
diff --git a/src/main/java/com/lowagie/tools/plugins/HtmlBookmarks.java b/src/main/java/com/lowagie/tools/plugins/HtmlBookmarks.java
new file mode 100644
index 0000000..aa8966f
--- /dev/null
+++ b/src/main/java/com/lowagie/tools/plugins/HtmlBookmarks.java
@@ -0,0 +1,288 @@
+/*
+ * $Id: HtmlBookmarks.java,v 1.12 2005/11/29 21:05:02 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2005 by Bruno Lowagie.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+package com.lowagie.tools.plugins;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.StringTokenizer;
+
+import javax.swing.JInternalFrame;
+import javax.swing.JOptionPane;
+
+import com.lowagie.text.Anchor;
+import com.lowagie.text.Chapter;
+import com.lowagie.text.Chunk;
+import com.lowagie.text.Document;
+import com.lowagie.text.Header;
+import com.lowagie.text.Paragraph;
+import com.lowagie.text.Section;
+import com.lowagie.text.html.HtmlTags;
+import com.lowagie.text.html.HtmlWriter;
+import com.lowagie.text.markup.MarkupTags;
+import com.lowagie.text.pdf.PdfReader;
+import com.lowagie.text.pdf.SimpleBookmark;
+import com.lowagie.tools.Executable;
+import com.lowagie.tools.arguments.FileArgument;
+import com.lowagie.tools.arguments.PdfFilter;
+import com.lowagie.tools.arguments.ToolArgument;
+
+/**
+ * Allows you to generate an index file in HTML containing Bookmarks to an existing PDF file.
+ */
+public class HtmlBookmarks extends AbstractTool {
+
+ static {
+ addVersion("$Id: HtmlBookmarks.java,v 1.12 2005/11/29 21:05:02 blowagie Exp $");
+ }
+
+ /**
+ * Constructs an HtmlBookmarks object.
+ */
+ public HtmlBookmarks() {
+ arguments.add(new FileArgument(this, "srcfile", "The file you want to inspect", false, new PdfFilter()));
+ arguments.add(new ToolArgument(this, "ownerpassword", "The owner password if the file is encrypt", String.class.getName()));
+ arguments.add(new ToolArgument(this, "css", "The path to a CSS file", String.class.getName()));
+ }
+
+ /**
+ * @see com.lowagie.tools.plugins.AbstractTool#createFrame()
+ */
+ protected void createFrame() {
+ internalFrame = new JInternalFrame("Html Bookmarks", true, true, true);
+ internalFrame.setSize(300, 80);
+ internalFrame.setJMenuBar(getMenubar());
+ System.out.println("=== Html Bookmarks OPENED ===");
+ }
+
+ /**
+ * @see com.lowagie.tools.plugins.AbstractTool#execute()
+ */
+ public void execute() {
+ try {
+ if (getValue("srcfile") == null) throw new InstantiationException("You need to choose a sourcefile");
+ File src = (File)getValue("srcfile");
+ PdfReader reader;
+ if (getValue("ownerpassword") == null) {
+ reader = new PdfReader(src.getAbsolutePath());
+ }
+ else {
+ reader = new PdfReader(src.getAbsolutePath(), ((String)getValue("ownerpassword")).getBytes());
+ }
+ File directory = src.getParentFile();
+ String name = src.getName();
+ name = name.substring(0, name.lastIndexOf("."));
+ File html = new File(directory, name + "_index.html");
+ Document document = new Document();
+ HtmlWriter.getInstance(document, new FileOutputStream(html));
+ Object css = getValue("css");
+ if (css != null) {
+ document.add(new Header(HtmlTags.STYLESHEET, css.toString()));
+ }
+ Object title = reader.getInfo().get("Title");
+ if (title == null)
+ document.addTitle("Index for " + src.getName());
+ else
+ document.addKeywords("Index for '" + title + "'");
+ Object keywords = reader.getInfo().get("Keywords");
+ if (keywords != null)
+ document.addKeywords((String)keywords);
+ Object description = reader.getInfo().get("Subject");
+ if (keywords != null)
+ document.addSubject((String)description);
+ document.open();
+ Paragraph t;
+ if (title == null)
+ t = new Paragraph("Index for " + src.getName());
+ else
+ t = new Paragraph("Index for '" + title + "'");
+ t.setMarkupAttribute(MarkupTags.HTML_ATTR_CSS_CLASS, "title");
+ document.add(t);
+ if (description != null) {
+ Paragraph d = new Paragraph((String) description);
+ d.setMarkupAttribute(MarkupTags.HTML_ATTR_CSS_CLASS, "description");
+ document.add(d);
+ }
+ List list = SimpleBookmark.getBookmark(reader);
+ if (list == null) {
+ document.add(new Paragraph("This document has no bookmarks."));
+ }
+ else {
+ HashMap c;
+ for (Iterator i = list.iterator(); i.hasNext(); ) {
+ c = (HashMap) i.next();
+ Chapter chapter = (Chapter)createBookmark(src.getName(), null, c);
+ ArrayList kids = (ArrayList) c.get("Kids");
+ if (kids != null) {
+ for (Iterator k = kids.iterator(); k.hasNext(); ) {
+ addBookmark(src.getName(), chapter, (HashMap)k.next());
+ }
+ }
+ document.add(chapter);
+ }
+ }
+ document.close();
+ Executable.launchBrowser(html.getAbsolutePath());
+ }
+ catch(Exception e) {
+ e.printStackTrace();
+ JOptionPane.showMessageDialog(internalFrame,
+ e.getMessage(),
+ e.getClass().getName(),
+ JOptionPane.ERROR_MESSAGE);
+ System.err.println(e.getMessage());
+ }
+ }
+
+ /**
+ * Recursive method to write Bookmark titles to the System.out.
+ * @param pdf the path to the PDF file
+ * @param section the section to which the bookmarks should be added
+ * @param bookmark a HashMap containing a Bookmark (and possible kids)
+ */
+ private static void addBookmark(String pdf, Section section, HashMap bookmark) {
+ Section s = createBookmark(pdf, section, bookmark);
+ ArrayList kids = (ArrayList) bookmark.get("Kids");
+ if (kids == null) return;
+ for (Iterator i = kids.iterator(); i.hasNext(); ) {
+ addBookmark(pdf, s, (HashMap)i.next());
+ }
+ }
+
+ /**
+ * Adds a line with the title and an anchor.
+ * @param pdf the link to the PDF file
+ * @param section the section that gets the line
+ * @param bookmark the bookmark that has the data for the line
+ * @return a subsection of section
+ */
+ private static Section createBookmark(String pdf, Section section, HashMap bookmark) {
+ Section s;
+ Paragraph title = new Paragraph((String)bookmark.get("Title"));
+ System.out.println((String)bookmark.get("Title"));
+ String action = (String)bookmark.get("Action");
+ if ("GoTo".equals(action)) {
+ if (bookmark.get("Page") != null) {
+ String page = (String)bookmark.get("Page");
+ StringTokenizer tokens = new StringTokenizer(page);
+ String token = tokens.nextToken();
+ Anchor anchor = new Anchor(" page" + token);
+ anchor.setReference(pdf + "#page=" + token);
+ title.add(anchor);
+ }
+ }
+ else if ("URI".equals(action)) {
+ String url = (String)bookmark.get("URI");
+ Anchor anchor = new Anchor(" Goto URL");
+ anchor.setReference(url);
+ title.add(anchor);
+ }
+ else if ("GoToR".equals(action)) {
+ String remote = (String)bookmark.get("File");
+ Anchor anchor = new Anchor(" goto " + remote);
+ if (bookmark.get("Named") != null) {
+ String named = (String)bookmark.get("Named");
+ remote = remote + "#nameddest=" + named;
+ }
+ else if (bookmark.get("Page") != null) {
+ String page = (String)bookmark.get("Page");
+ StringTokenizer tokens = new StringTokenizer(page);
+ String token = tokens.nextToken();
+ anchor.add(new Chunk(" page " + token));
+ remote = remote + "#page=" + token;
+ }
+ anchor.setReference(remote);
+ title.add(anchor);
+ }
+ if (section == null) {
+ s = new Chapter(title, 0);
+ }
+ else {
+ s = section.addSection(title);
+ }
+ s.setNumberDepth(0);
+ return s;
+ }
+
+ /**
+ * @see com.lowagie.tools.plugins.AbstractTool#valueHasChanged(com.lowagie.tools.arguments.ToolArgument)
+ */
+ public void valueHasChanged(ToolArgument arg) {
+ if (internalFrame == null) {
+ // if the internal frame is null, the tool was called from the commandline
+ return;
+ }
+ // represent the changes of the argument in the internal frame
+ }
+
+ /**
+ * Allows you to generate an index file in HTML containing Bookmarks to an existing PDF file.
+ * @param args
+ */
+ public static void main(String[] args) {
+ HtmlBookmarks tool = new HtmlBookmarks();
+ if (args.length < 1) {
+ System.err.println(tool.getUsage());
+ }
+ tool.setArguments(args);
+ tool.execute();
+ }
+
+ /**
+ * @see com.lowagie.tools.plugins.AbstractTool#getDestPathPDF()
+ */
+ protected File getDestPathPDF() throws InstantiationException {
+ throw new InstantiationException("There is no file to show.");
+ }
+
+}
diff --git a/src/main/java/com/lowagie/tools/plugins/ImageXRefViewer.java b/src/main/java/com/lowagie/tools/plugins/ImageXRefViewer.java
new file mode 100644
index 0000000..34bbc50
--- /dev/null
+++ b/src/main/java/com/lowagie/tools/plugins/ImageXRefViewer.java
@@ -0,0 +1,256 @@
+/*
+ * $Id: ImageXRefViewer.java,v 1.3 2006/04/05 07:55:00 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2005 by Carsten Hammer and Bruno Lowagie.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999-2006 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000-2006 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+package com.lowagie.tools.plugins;
+
+import java.awt.BorderLayout;
+import java.awt.CardLayout;
+import java.awt.Toolkit;
+import java.io.File;
+
+import javax.swing.BorderFactory;
+import javax.swing.JInternalFrame;
+import javax.swing.JLabel;
+import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+import javax.swing.JSpinner;
+import javax.swing.SpinnerModel;
+import javax.swing.SwingConstants;
+import javax.swing.event.ChangeEvent;
+
+import com.lowagie.text.pdf.PRStream;
+import com.lowagie.text.pdf.PdfName;
+import com.lowagie.text.pdf.PdfObject;
+import com.lowagie.text.pdf.PdfReader;
+import com.lowagie.text.pdf.PdfStream;
+import com.lowagie.tools.arguments.FileArgument;
+import com.lowagie.tools.arguments.PdfFilter;
+import com.lowagie.tools.arguments.ToolArgument;
+import javax.swing.JScrollPane;
+import com.lowagie.tools.SwingWorker;
+import java.io.*;
+import java.awt.Cursor;
+
+/**
+ * Allows you to inspect the Image XObjects inside a PDF file.
+ */
+public class ImageXRefViewer
+ extends AbstractTool {
+ static {
+ addVersion("$Id: ImageXRefViewer.java,v 1.3 2006/04/05 07:55:00 blowagie Exp $");
+ }
+
+ class ViewXRefImages_jSpinner1_propertyChangeAdapter
+ implements javax.swing.event.ChangeListener {
+ private ImageXRefViewer adaptee;
+ ViewXRefImages_jSpinner1_propertyChangeAdapter(ImageXRefViewer adaptee) {
+ this.adaptee = adaptee;
+ }
+ /**
+ * @see javax.swing.event.ChangeListener#stateChanged(javax.swing.event.ChangeEvent)
+ */
+ public void stateChanged(ChangeEvent e) {
+ adaptee.jSpinner_propertyChange(e);
+ }
+ }
+
+ JPanel jPanel1 = new JPanel();
+ BorderLayout borderLayout1 = new BorderLayout();
+ JLabel jLabel1 = new JLabel();
+ int picturenumber = 0;
+ JPanel jPanel2 = new JPanel();
+ BorderLayout borderLayout2 = new BorderLayout();
+ CardLayout cardLayout1 = new CardLayout();
+ JPanel jPanel3 = new JPanel();
+ JSpinner jSpinner1 = new JSpinner();
+ BorderLayout borderLayout3 = new BorderLayout();
+ SpinnerModel spinnerModel1 = jSpinner1.getModel();
+ JScrollPane jScrollPane1 = new JScrollPane();
+
+
+ /**
+ * Creates a ViewImageXObjects object.
+ */
+ public ImageXRefViewer() {
+ arguments.add(new FileArgument(this, "srcfile", "The file you want to inspect", false, new PdfFilter()));
+ }
+
+ /**
+ * @see com.lowagie.tools.plugins.AbstractTool#getDestPathPDF()
+ */
+ protected File getDestPathPDF() throws InstantiationException {
+ throw new InstantiationException("There is no file to show.");
+ }
+
+ /**
+ * @see com.lowagie.tools.plugins.AbstractTool#createFrame()
+ */
+ protected void createFrame() {
+ internalFrame = new JInternalFrame("View Image XObjects", true, false, true);
+ internalFrame.setSize(500, 300);
+ internalFrame.setJMenuBar(getMenubar());
+ internalFrame.getContentPane().setLayout(borderLayout1);
+ jPanel1.setLayout(borderLayout2);
+ jLabel1.setHorizontalAlignment(SwingConstants.CENTER);
+ jLabel1.setText("images");
+ jPanel2.setLayout(cardLayout1);
+ jPanel3.setLayout(borderLayout3);
+ jSpinner1.addChangeListener(new
+ ViewXRefImages_jSpinner1_propertyChangeAdapter(this));
+ jPanel2.setBorder(BorderFactory.createEtchedBorder());
+ internalFrame.getContentPane().add(jPanel1, java.awt.BorderLayout.CENTER);
+ jPanel3.add(jSpinner1, java.awt.BorderLayout.CENTER);
+ jPanel3.add(jLabel1, java.awt.BorderLayout.NORTH);
+ jPanel1.add(jPanel3, java.awt.BorderLayout.NORTH);
+ jPanel1.add(jScrollPane1, java.awt.BorderLayout.CENTER);
+ jScrollPane1.setViewportView(jPanel2);
+ System.out.println("=== Image XObject Viewer OPENED ===");
+ }
+
+ /**
+ * @see com.lowagie.tools.plugins.AbstractTool#valueHasChanged(com.lowagie.tools.arguments.ToolArgument)
+ */
+ public void valueHasChanged(ToolArgument arg) {
+ // do nothing
+ }
+
+ /**
+ * Reflects the change event in the JSpinner object.
+ * @param evt
+ */
+ public void jSpinner_propertyChange(ChangeEvent evt) {
+ int blatt = Integer.parseInt(jSpinner1.getValue().toString());
+ if (blatt < 0) blatt = 0;
+ if (blatt >= picturenumber) blatt = picturenumber - 1;
+ this.cardLayout1.show(jPanel2, String.valueOf(blatt));
+ jPanel2.repaint();
+ }
+ /**
+ * Shows the images that are added to the PDF as Image XObjects.
+ * @param args
+ */
+ public static void main(String[] args) {
+ InspectPDF tool = new InspectPDF();
+ if (args.length < 1) {
+ System.err.println(tool.getUsage());
+ }
+ tool.setArguments(args);
+ tool.execute();
+ }
+
+ /**
+ * @see com.lowagie.tools.plugins.AbstractTool#execute()
+ */
+ public void execute() {
+ picturenumber = 0;
+ try {
+ if (getValue("srcfile") == null) throw new InstantiationException("You need to choose a sourcefile");
+
+ SwingWorker work= new SwingWorker(){
+
+ public Object construct() {
+ try {
+ PdfReader reader = new PdfReader( ( (File)
+ getValue("srcfile")).getAbsolutePath());
+ for (int i = 0; i < reader.getXrefSize(); i++) {
+ PdfObject pdfobj = reader.getPdfObject(i);
+ if (pdfobj != null) {
+ if (pdfobj.isStream()) {
+ PdfStream pdfdict = (PdfStream) pdfobj;
+ PdfObject pdfsubtype = pdfdict.get(PdfName.
+ SUBTYPE);
+ if (pdfsubtype == null) {
+ continue;
+ }
+ if (!pdfsubtype.toString().equals(PdfName.
+ IMAGE.toString())) {
+ continue;
+ }
+ System.out.println("picturenumber: " +
+ picturenumber);
+ System.out.println("height:" +
+ pdfdict.get(PdfName.HEIGHT));
+ System.out.println("width:" +
+ pdfdict.get(PdfName.WIDTH));
+ System.out.println("bitspercomponent:" +
+ pdfdict.get(PdfName.BITSPERCOMPONENT));
+ byte[] barr = PdfReader.getStreamBytesRaw( (
+ PRStream) pdfdict);
+ java.awt.Image im = Toolkit.
+ getDefaultToolkit().createImage(barr);
+ javax.swing.ImageIcon ii = new javax.swing.
+ ImageIcon(im);
+
+ JLabel jLabel1 = new JLabel();
+ jLabel1.setIcon(ii);
+ jPanel2.add(jLabel1, "" + picturenumber++);
+ }
+ }
+ }
+ }
+ catch (InstantiationException ex) {
+ }
+ catch (IOException ex) {
+ }
+ internalFrame.setCursor(Cursor.getDefaultCursor());
+ return null;
+ }
+ };
+ internalFrame.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
+ work.start();
+ }
+ catch(Exception e) {
+ JOptionPane.showMessageDialog(internalFrame,
+ e.getMessage(),
+ e.getClass().getName(),
+ JOptionPane.ERROR_MESSAGE);
+ System.err.println(e.getMessage());
+ }
+ }
+}
diff --git a/src/main/java/com/lowagie/tools/plugins/InspectPDF.java b/src/main/java/com/lowagie/tools/plugins/InspectPDF.java
new file mode 100644
index 0000000..b017221
--- /dev/null
+++ b/src/main/java/com/lowagie/tools/plugins/InspectPDF.java
@@ -0,0 +1,173 @@
+/*
+ * $Id: InspectPDF.java,v 1.6 2005/11/29 21:05:02 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2005 by Bruno Lowagie.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+package com.lowagie.tools.plugins;
+
+import java.io.File;
+import java.util.HashMap;
+import java.util.Iterator;
+
+import javax.swing.JInternalFrame;
+import javax.swing.JOptionPane;
+
+import com.lowagie.text.pdf.PdfEncryptor;
+import com.lowagie.text.pdf.PdfReader;
+import com.lowagie.tools.arguments.FileArgument;
+import com.lowagie.tools.arguments.PdfFilter;
+import com.lowagie.tools.arguments.ToolArgument;
+
+/**
+ * Allows you to inspect an existing PDF file.
+ */
+public class InspectPDF extends AbstractTool {
+ static {
+ addVersion("$Id: InspectPDF.java,v 1.6 2005/11/29 21:05:02 blowagie Exp $");
+ }
+
+ /**
+ * Constructs an InpectPDF object.
+ */
+ public InspectPDF() {
+ arguments.add(new FileArgument(this, "srcfile", "The file you want to inspect", false, new PdfFilter()));
+ arguments.add(new ToolArgument(this, "ownerpassword", "The owner password if the file is encrypt", String.class.getName()));
+ }
+
+ /**
+ * @see com.lowagie.tools.plugins.AbstractTool#createFrame()
+ */
+ protected void createFrame() {
+ internalFrame = new JInternalFrame("Pdf Information", true, false, true);
+ internalFrame.setSize(300, 80);
+ internalFrame.setJMenuBar(getMenubar());
+ System.out.println("=== Pdf Information OPENED ===");
+ }
+
+ /**
+ * @see com.lowagie.tools.plugins.AbstractTool#execute()
+ */
+ public void execute() {
+ try {
+ if (getValue("srcfile") == null) throw new InstantiationException("You need to choose a sourcefile");
+ PdfReader reader;
+ if (getValue("ownerpassword") == null) {
+ reader = new PdfReader(((File)getValue("srcfile")).getAbsolutePath());
+ }
+ else {
+ reader = new PdfReader(((File)getValue("srcfile")).getAbsolutePath(), ((String)getValue("ownerpassword")).getBytes());
+ }
+ // Some general document information and page size
+ System.out.println("=== Document Information ===");
+ System.out.println("PDF Version: " + reader.getPdfVersion());
+ System.out.println("Number of pages: " + reader.getNumberOfPages());
+ System.out.println("Number of PDF objects: " + reader.getXrefSize());
+ System.out.println("File length: " + reader.getFileLength());
+ System.out.println("Encrypted? " + reader.isEncrypted());
+ if (reader.isEncrypted()) {
+ System.out.println("Permissions: " + PdfEncryptor.getPermissionsVerbose(reader.getPermissions()));
+ System.out.println("128 bit? " + reader.is128Key());
+ }
+ System.out.println("Rebuilt? " + (!reader.isRebuilt()));
+ // Some metadata
+ System.out.println("=== Metadata ===");
+ HashMap info = reader.getInfo();
+ String key;
+ String value;
+ for (Iterator i = info.keySet().iterator(); i.hasNext(); ) {
+ key = (String) i.next();
+ value = (String) info.get(key);
+ System.out.println(key + ": " + value);
+ }
+ if (reader.getMetadata() == null) {
+ System.out.println("There is no XML Metadata in the file");
+ }
+ else {
+ System.out.println("XML Metadata: " + new String(reader.getMetadata()));
+ }
+ }
+ catch(Exception e) {
+ JOptionPane.showMessageDialog(internalFrame,
+ e.getMessage(),
+ e.getClass().getName(),
+ JOptionPane.ERROR_MESSAGE);
+ System.err.println(e.getMessage());
+ }
+ }
+
+ /**
+ * @see com.lowagie.tools.plugins.AbstractTool#valueHasChanged(com.lowagie.tools.arguments.ToolArgument)
+ */
+ public void valueHasChanged(ToolArgument arg) {
+ if (internalFrame == null) {
+ // if the internal frame is null, the tool was called from the commandline
+ return;
+ }
+ // represent the changes of the argument in the internal frame
+ }
+
+ /**
+ * Inspects an existing PDF file.
+ * @param args
+ */
+ public static void main(String[] args) {
+ InspectPDF tool = new InspectPDF();
+ if (args.length < 1) {
+ System.err.println(tool.getUsage());
+ }
+ tool.setArguments(args);
+ tool.execute();
+ }
+
+ /**
+ * @see com.lowagie.tools.plugins.AbstractTool#getDestPathPDF()
+ */
+ protected File getDestPathPDF() throws InstantiationException {
+ throw new InstantiationException("There is no file to show.");
+ }
+
+}
diff --git a/src/main/java/com/lowagie/tools/plugins/KnitTiff.java b/src/main/java/com/lowagie/tools/plugins/KnitTiff.java
new file mode 100644
index 0000000..428bbb7
--- /dev/null
+++ b/src/main/java/com/lowagie/tools/plugins/KnitTiff.java
@@ -0,0 +1,178 @@
+/*
+ * $Id: KnitTiff.java,v 1.7 2005/11/29 21:05:02 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2005 by Bruno Lowagie.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+package com.lowagie.tools.plugins;
+
+import java.io.File;
+import java.io.FileOutputStream;
+
+import javax.swing.JInternalFrame;
+
+import com.lowagie.text.Document;
+import com.lowagie.text.Image;
+import com.lowagie.text.Rectangle;
+import com.lowagie.text.pdf.PdfContentByte;
+import com.lowagie.text.pdf.PdfWriter;
+import com.lowagie.text.pdf.RandomAccessFileOrArray;
+import com.lowagie.text.pdf.codec.TiffImage;
+import com.lowagie.tools.arguments.FileArgument;
+import com.lowagie.tools.arguments.ImageFilter;
+import com.lowagie.tools.arguments.PdfFilter;
+import com.lowagie.tools.arguments.ToolArgument;
+
+/**
+ * Knits two TIFF files, one with the even pages and another with the odd pages, together.
+ */
+public class KnitTiff extends AbstractTool {
+
+ static {
+ addVersion("$Id: KnitTiff.java,v 1.7 2005/11/29 21:05:02 blowagie Exp $");
+ }
+ /**
+ * Constructs a KnitTiff object.
+ */
+ public KnitTiff() {
+ menuoptions = MENU_EXECUTE | MENU_EXECUTE_SHOW;
+ arguments.add(new FileArgument(this, "odd", "The tiff file with the odd pages", false, new ImageFilter(false, false, false, false, false, true)));
+ arguments.add(new FileArgument(this, "even", "The tiff file with the even pages", false, new ImageFilter(false, false, false, false, false, true)));
+ arguments.add(new FileArgument(this, "destfile", "The file to which the converted TIFF has to be written", true, new PdfFilter()));
+ }
+
+ /**
+ * @see com.lowagie.tools.plugins.AbstractTool#createFrame()
+ */
+ protected void createFrame() {
+ internalFrame = new JInternalFrame("KnitTiff", true, false, true);
+ internalFrame.setSize(300, 80);
+ internalFrame.setJMenuBar(getMenubar());
+ System.out.println("=== KnitTiff OPENED ===");
+ }
+
+ /**
+ * @see com.lowagie.tools.plugins.AbstractTool#execute()
+ */
+ public void execute() {
+ try {
+ if (getValue("odd") == null) throw new InstantiationException("You need to choose a sourcefile for the odd pages");
+ File odd_file = (File)getValue("odd");
+ if (getValue("even") == null) throw new InstantiationException("You need to choose a sourcefile for the even pages");
+ File even_file = (File)getValue("even");
+ if (getValue("destfile") == null) throw new InstantiationException("You need to choose a destination file");
+ File pdf_file = (File)getValue("destfile");
+ RandomAccessFileOrArray odd = new RandomAccessFileOrArray(odd_file.getAbsolutePath());
+ RandomAccessFileOrArray even = new RandomAccessFileOrArray(even_file.getAbsolutePath());
+ Image img = TiffImage.getTiffImage(odd, 1);
+ Document document = new Document(new Rectangle(img.scaledWidth(),
+ img.scaledHeight()));
+ PdfWriter writer = PdfWriter.getInstance(document,
+ new FileOutputStream(pdf_file));
+ document.open();
+ PdfContentByte cb = writer.getDirectContent();
+ int count = Math.max(TiffImage.getNumberOfPages(odd), TiffImage
+ .getNumberOfPages(even));
+ for (int c = 0; c < count; ++c) {
+ try {
+ Image imgOdd = TiffImage.getTiffImage(odd, c + 1);
+ Image imgEven = TiffImage.getTiffImage(even, count - c);
+ document.setPageSize(new Rectangle(imgOdd.scaledWidth(),
+ imgOdd.scaledHeight()));
+ document.newPage();
+ imgOdd.setAbsolutePosition(0, 0);
+ cb.addImage(imgOdd);
+ document.setPageSize(new Rectangle(imgEven.scaledWidth(),
+ imgEven.scaledHeight()));
+ document.newPage();
+ imgEven.setAbsolutePosition(0, 0);
+ cb.addImage(imgEven);
+
+ } catch (Exception e) {
+ System.out.println("Exception page " + (c + 1) + " "
+ + e.getMessage());
+ }
+ }
+ odd.close();
+ even.close();
+ document.close();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ /**
+ * @see com.lowagie.tools.plugins.AbstractTool#valueHasChanged(com.lowagie.tools.arguments.ToolArgument)
+ */
+ public void valueHasChanged(ToolArgument arg) {
+ if (internalFrame == null) {
+ // if the internal frame is null, the tool was called from the commandline
+ return;
+ }
+ // represent the changes of the argument in the internal frame
+ }
+
+
+ /**
+ * Converts a tiff file to PDF.
+ * @param args
+ */
+ public static void main(String[] args) {
+ KnitTiff tool = new KnitTiff();
+ if (args.length < 3) {
+ System.err.println(tool.getUsage());
+ }
+ tool.setArguments(args);
+ tool.execute();
+ }
+
+ /**
+ * @see com.lowagie.tools.plugins.AbstractTool#getDestPathPDF()
+ */
+ protected File getDestPathPDF() throws InstantiationException {
+ return (File)getValue("destfile");
+ }
+}
diff --git a/src/main/java/com/lowagie/tools/plugins/LPRClient.java b/src/main/java/com/lowagie/tools/plugins/LPRClient.java
new file mode 100644
index 0000000..3214013
--- /dev/null
+++ b/src/main/java/com/lowagie/tools/plugins/LPRClient.java
@@ -0,0 +1,245 @@
+/*
+ * $Id: LPRClient.java,v 1.4 2005/11/29 21:05:02 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2005 by Anonymous.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+package com.lowagie.tools.plugins;
+
+import java.io.File;
+
+import javax.swing.JInternalFrame;
+import javax.swing.JOptionPane;
+
+import com.lowagie.tools.arguments.FileArgument;
+import com.lowagie.tools.arguments.PdfFilter;
+import com.lowagie.tools.arguments.ToolArgument;
+import com.lowagie.tools.LPR;
+
+/**
+ * Allows you to print an existing PDF file via lpr.
+ */
+public class LPRClient extends AbstractTool {
+ static {
+ addVersion("$Id: LPRClient.java,v 1.4 2005/11/29 21:05:02 blowagie Exp $");
+ }
+
+String fallback="%!PS\n"+
+ "/vpos 720 def\n"+
+ "/newline\n"+
+ " {\n"+
+ "/vpos vpos 15 sub def\n"+
+ "72 vpos moveto\n"+
+ "} def \n"+
+ "/printword\n"+
+ "{\n"+
+ "show\n"+
+ "newline\n"+
+ "vpos 100 le { \n"+
+ "showpage\n"+
+ "100 100 moveto\n"+
+ "/vpos 720 def\n"+
+ "/Helvetica findfont 15 scalefont setfont\n"+
+ "} if\n"+
+ "} def \n"+
+ "/nstr 9 string def\n"+
+ "/prt-n\n"+
+ "{\n"+
+ "nstr cvs printword\n"+
+ "} def\n"+
+ "100 100 moveto\n"+
+ "/Helvetica findfont 15 scalefont setfont\n"+
+ "(---) printword \n"+
+ "(Postscript Engine Testpage) printword\n"+
+ "() printword\n"+
+ "() printword\n"+
+ "(Defaultpagesize) printword\n"+
+ "currentpagedevice /PageSize get\n"+
+ "(Width: ) show \n"+
+ "0 get prt-n\n"+
+ "currentpagedevice /PageSize get\n"+
+ "(Height: ) show \n"+
+ "1 get prt-n\n"+
+ "() printword\n"+
+ "(Printerresolution) printword\n"+
+ "currentpagedevice /HWResolution get\n"+
+ "(X: ) show \n"+
+ "0 get prt-n\n"+
+ "currentpagedevice /HWResolution get\n"+
+ "(Y: ) show \n"+
+ "1 get prt-n\n"+
+ "() printword\n"+
+ "(Information about Postscriptengine) printword\n"+
+ "(Postscriptengine Type: ) show\n"+
+ "product printword\n"+
+ "(Version: ) show\n"+
+ "version printword\n"+
+ "() printword \n"+
+ "mark\n"+
+ "(\n) \n"+
+ "revision 10 mod \n"+
+ "revision 100 mod 10 idiv (.)\n"+
+ "revision 100 idiv \n"+
+ "(Revision: )\n"+
+ "(\n) \n"+
+ "counttomark\n"+
+ "{ 17 string cvs show\n"+
+ "} repeat pop \n"+
+ "() printword \n"+
+ "(Postscript Languagelevel: ) show\n"+
+ "/languagelevel where\n"+
+ "{pop languagelevel}\n"+
+ "{1}\n"+
+ "ifelse\n"+
+ "3 string cvs printword \n"+
+ "usertime \n"+
+ "prt-n \n"+
+ "vmstatus\n"+
+ "(Printerram Max.: ) show\n"+
+ "prt-n\n"+
+ "(Printerram Cur.: ) show\n"+
+ "prt-n\n"+
+ "() printword\n"+
+ "showpage";
+ /**
+ * Constructs an LPRClient object.
+ */
+ public LPRClient() {
+ arguments.add(new FileArgument(this, "srcfile",
+ "The file you want to print", false, new PdfFilter()));
+ arguments.add(new ToolArgument(this, "hostname",
+ "The hostname of the lpr server", String.class.getName()));
+ arguments.add(new ToolArgument(this, "queuename",
+ "The queuename of the lpr server", String.class.getName()));
+ arguments.add(new ToolArgument(this, "copies",
+ "The number of copies to print", String.class.getName()));
+ }
+
+ /**
+ * @see com.lowagie.tools.plugins.AbstractTool#createFrame()
+ */
+ protected void createFrame() {
+ internalFrame = new JInternalFrame("LPR", true, false, true);
+ internalFrame.setSize(500, 300);
+ internalFrame.setJMenuBar(getMenubar());
+ System.out.println("=== LPR OPENED ===");
+ }
+
+ /**
+ * @see com.lowagie.tools.plugins.AbstractTool#execute()
+ */
+ public void execute() {
+ try {
+ String filename=null;
+ File pdffile=null;
+ if (getValue("srcfile") == null){
+ filename=null;
+ }else{
+ filename = getValue("srcfile").toString();
+ pdffile = new File(filename);
+ }
+// throw new InstantiationException(
+// "You need to choose a sourcefile");
+ if (getValue("hostname") == null)
+ throw new InstantiationException(
+ "You need to choose a hostname");
+ if (getValue("queuename") == null)
+ throw new InstantiationException(
+ "You need to choose a queuename");
+ if (getValue("copies") == null)
+ throw new InstantiationException(
+ "You need to choose the number of copies");
+ LPR lpr = new LPR(getValue("hostname").toString(), System
+ .getProperty("user.name"));
+ lpr.setCopies(Integer.parseInt(getValue("copies").toString()));
+ if(filename==null){
+ lpr.print(getValue("queuename").toString(), fallback, "Version");
+ }else{
+ lpr.print(getValue("queuename").toString(), pdffile, pdffile
+ .getName());
+ }
+
+ } catch (Exception e) {
+ JOptionPane.showMessageDialog(internalFrame, e.getMessage(), e
+ .getClass().getName(), JOptionPane.ERROR_MESSAGE);
+ System.err.println(e.getMessage());
+ }
+ }
+
+ /**
+ * @see com.lowagie.tools.plugins.AbstractTool#valueHasChanged(com.lowagie.tools.arguments.ToolArgument)
+ */
+ public void valueHasChanged(ToolArgument arg) {
+ if (internalFrame == null) {
+ // if the internal frame is null, the tool was called from the
+ // commandline
+ return;
+ }
+ // represent the changes of the argument in the internal frame
+ }
+
+ /**
+ * Prints a PDF file via lpr.
+ *
+ * @param args
+ */
+ public static void main(String[] args) {
+ LPRClient tool = new LPRClient();
+ if (args.length < tool.getArguments().size()) {
+ System.err.println(tool.getUsage());
+ }
+ tool.setArguments(args);
+ tool.execute();
+ }
+
+ /**
+ * @see com.lowagie.tools.plugins.AbstractTool#getDestPathPDF()
+ */
+ protected File getDestPathPDF() throws InstantiationException {
+ throw new InstantiationException("There is no file to show.");
+ }
+
+}
diff --git a/src/main/java/com/lowagie/tools/plugins/NUp.java b/src/main/java/com/lowagie/tools/plugins/NUp.java
new file mode 100644
index 0000000..7376213
--- /dev/null
+++ b/src/main/java/com/lowagie/tools/plugins/NUp.java
@@ -0,0 +1,165 @@
+/*
+ * $Id: NUp.java,v 1.6 2005/11/29 21:05:02 blowagie Exp $
+ * $Name: $
+ *
+ * This code is free software. It may only be copied or modified
+ * if you include the following copyright notice:
+ *
+ * This class by Mark Thompson. Copyright (c) 2002 Mark Thompson.
+ *
+ * This code is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * itext-questions@list.sourceforge.net
+ */
+package com.lowagie.tools.plugins;
+
+import java.io.File;
+import java.io.FileOutputStream;
+
+import javax.swing.JInternalFrame;
+
+import com.lowagie.text.Document;
+import com.lowagie.text.Rectangle;
+import com.lowagie.text.pdf.PdfContentByte;
+import com.lowagie.text.pdf.PdfImportedPage;
+import com.lowagie.text.pdf.PdfReader;
+import com.lowagie.text.pdf.PdfWriter;
+import com.lowagie.tools.arguments.FileArgument;
+import com.lowagie.tools.arguments.OptionArgument;
+import com.lowagie.tools.arguments.PdfFilter;
+import com.lowagie.tools.arguments.ToolArgument;
+
+/**
+ * This tool lets you generate a PDF that shows N pages on 1.
+ */
+public class NUp extends AbstractTool {
+
+ static {
+ addVersion("$Id: NUp.java,v 1.6 2005/11/29 21:05:02 blowagie Exp $");
+ }
+
+ /**
+ * Constructs an NUp object.
+ */
+ public NUp() {
+ menuoptions = MENU_EXECUTE | MENU_EXECUTE_SHOW;
+ arguments.add(new FileArgument(this, "srcfile", "The file you want to N-up", false, new PdfFilter()));
+ arguments.add(new FileArgument(this, "destfile", "The resulting PDF", true, new PdfFilter()));
+ OptionArgument oa = new OptionArgument(this, "pow2", "The number of pages you want to copy to 1 page");
+ oa.addOption("2", "1");
+ oa.addOption("4", "2");
+ oa.addOption("8", "3");
+ oa.addOption("16", "4");
+ oa.addOption("32", "5");
+ oa.addOption("64", "6");
+ arguments.add(oa);
+ }
+
+ /**
+ * @see com.lowagie.tools.plugins.AbstractTool#createFrame()
+ */
+ protected void createFrame() {
+ internalFrame = new JInternalFrame("N-up", true, false, true);
+ internalFrame.setSize(300, 80);
+ internalFrame.setJMenuBar(getMenubar());
+ System.out.println("=== N-up OPENED ===");
+ }
+
+ /**
+ * @see com.lowagie.tools.plugins.AbstractTool#execute()
+ */
+ public void execute() {
+ try {
+ if (getValue("srcfile") == null) throw new InstantiationException("You need to choose a sourcefile");
+ File src = (File)getValue("srcfile");
+ if (getValue("destfile") == null) throw new InstantiationException("You need to choose a destination file");
+ File dest = (File)getValue("destfile");
+ int pow2;
+ try {
+ pow2 = Integer.parseInt((String) getValue("pow2"));
+ }
+ catch(Exception e) {
+ pow2 = 1;
+ }
+ // we create a reader for a certain document
+ PdfReader reader = new PdfReader(src.getAbsolutePath());
+ // we retrieve the total number of pages and the page size
+ int total = reader.getNumberOfPages();
+ System.out.println("There are " + total + " pages in the original file.");
+ Rectangle pageSize = reader.getPageSize(1);
+ Rectangle newSize = (pow2 % 2) == 0 ? new Rectangle(pageSize.width(), pageSize.height()) : new Rectangle(pageSize.height(), pageSize.width());
+ Rectangle unitSize = new Rectangle(pageSize.width(), pageSize.height());
+ Rectangle currentSize;
+ for (int i = 0; i < pow2; i++) {
+ unitSize = new Rectangle(unitSize.height() / 2, unitSize.width());
+ }
+ int n = (int)Math.pow(2, pow2);
+ int r = (int)Math.pow(2, (int)pow2 / 2);
+ int c = n / r;
+ // step 1: creation of a document-object
+ Document document = new Document(newSize, 0, 0, 0, 0);
+ // step 2: we create a writer that listens to the document
+ PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(dest));
+ // step 3: we open the document
+ document.open();
+ // step 4: adding the content
+ PdfContentByte cb = writer.getDirectContent();
+ PdfImportedPage page;
+ float offsetX, offsetY, factor;
+ int p;
+ for (int i = 0; i < total; i++) {
+ if (i % n == 0) {
+ document.newPage();
+ }
+ p = i + 1;
+ offsetX = unitSize.width() * ((i % n) % c);
+ offsetY = newSize.height() - (unitSize.height() * (((i % n) / c) + 1));
+ currentSize = reader.getPageSize(p);
+ factor = Math.min(unitSize.width() / currentSize.width(), unitSize.height() / currentSize.height());
+ offsetX += (unitSize.width() - (currentSize.width() * factor)) / 2f;
+ offsetY += (unitSize.height() - (currentSize.height() * factor)) / 2f;
+ page = writer.getImportedPage(reader, p);
+ cb.addTemplate(page, factor, 0, 0, factor, offsetX, offsetY);
+ }
+ // step 5: we close the document
+ document.close();
+ }
+ catch(Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ /**
+ * @see com.lowagie.tools.plugins.AbstractTool#valueHasChanged(com.lowagie.tools.arguments.ToolArgument)
+ */
+ public void valueHasChanged(ToolArgument arg) {
+ if (internalFrame == null) {
+ // if the internal frame is null, the tool was called from the commandline
+ return;
+ }
+ // represent the changes of the argument in the internal frame
+ }
+
+
+ /**
+ * Generates an NUp version of an existing PDF file.
+ * @param args
+ */
+ public static void main(String[] args) {
+ NUp tool = new NUp();
+ if (args.length < 2) {
+ System.err.println(tool.getUsage());
+ }
+ tool.setArguments(args);
+ tool.execute();
+ }
+
+ /**
+ * @see com.lowagie.tools.plugins.AbstractTool#getDestPathPDF()
+ */
+ protected File getDestPathPDF() throws InstantiationException {
+ return (File)getValue("destfile");
+ }
+}
diff --git a/src/main/java/com/lowagie/tools/plugins/PhotoAlbum.java b/src/main/java/com/lowagie/tools/plugins/PhotoAlbum.java
new file mode 100644
index 0000000..26a95f3
--- /dev/null
+++ b/src/main/java/com/lowagie/tools/plugins/PhotoAlbum.java
@@ -0,0 +1,200 @@
+/*
+ * $Id: PhotoAlbum.java,v 1.8 2006/03/21 08:49:35 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2005 by Bruno Lowagie.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+package com.lowagie.tools.plugins;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.util.Iterator;
+import java.util.TreeSet;
+
+import javax.swing.JInternalFrame;
+import javax.swing.JOptionPane;
+
+import com.lowagie.text.Document;
+import com.lowagie.text.Image;
+import com.lowagie.text.Rectangle;
+import com.lowagie.text.pdf.PdfPageLabels;
+import com.lowagie.text.pdf.PdfWriter;
+import com.lowagie.tools.arguments.DirFilter;
+import com.lowagie.tools.arguments.FileArgument;
+import com.lowagie.tools.arguments.PdfFilter;
+import com.lowagie.tools.arguments.ToolArgument;
+
+/**
+ * Converts a Tiff file to a PDF file.
+ * Inspired by a comp.text.pdf question by Sebastian Schubert
+ * and an answer by Hans-Werner Hilse.
+ */
+public class PhotoAlbum extends AbstractTool {
+
+ static {
+ addVersion("$Id: PhotoAlbum.java,v 1.8 2006/03/21 08:49:35 blowagie Exp $");
+ }
+ /**
+ * Constructs a PhotoAlbum object.
+ */
+ public PhotoAlbum() {
+ menuoptions = MENU_EXECUTE | MENU_EXECUTE_SHOW;
+ arguments.add(new FileArgument(this, "srcdir", "The directory containing the image files", false, new DirFilter()));
+ arguments.add(new FileArgument(this, "destfile", "The file to which the converted TIFF has to be written", true, new PdfFilter()));
+ }
+
+ /**
+ * @see com.lowagie.tools.plugins.AbstractTool#createFrame()
+ */
+ protected void createFrame() {
+ internalFrame = new JInternalFrame("PhotoAlbum", true, false, true);
+ internalFrame.setSize(300, 80);
+ internalFrame.setJMenuBar(getMenubar());
+ System.out.println("=== PhotoAlbum OPENED ===");
+ }
+
+ /**
+ * @see com.lowagie.tools.plugins.AbstractTool#execute()
+ */
+ public void execute() {
+ try {
+ if (getValue("srcdir") == null) throw new InstantiationException("You need to choose a source directory");
+ File directory = (File)getValue("srcdir");
+ if (directory.isFile()) directory = directory.getParentFile();
+ if (getValue("destfile") == null) throw new InstantiationException("You need to choose a destination file");
+ File pdf_file = (File)getValue("destfile");
+ Document document = new Document();
+ PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(pdf_file));
+ writer.setViewerPreferences(PdfWriter.PageModeUseThumbs);
+ PdfPageLabels pageLabels = new PdfPageLabels();
+ int dpiX, dpiY;
+ float imgWidthPica, imgHeightPica;
+ TreeSet images = new TreeSet();
+ File[] files = directory.listFiles();
+ for (int i = 0; i < files.length; i++) {
+ if (files[i].isFile()) images.add(files[i]);
+ }
+ File image;
+ String label;
+ for (Iterator i = images.iterator(); i.hasNext(); ) {
+ image = (File) i.next();
+ System.out.println("Testing image: " + image.getName());
+ try {
+ Image img = Image.getInstance(image.getAbsolutePath());
+ dpiX=img.getDpiX();
+ if (dpiX == 0) dpiX=72;
+ dpiY=img.getDpiY();
+ if (dpiY == 0) dpiY=72;
+ imgWidthPica=(72*img.plainWidth()) / dpiX;
+ imgHeightPica=(72*img.plainHeight()) / dpiY;
+ img.scaleAbsolute(imgWidthPica,imgHeightPica);
+ document.setPageSize(new Rectangle(imgWidthPica, imgHeightPica));
+ if (document.isOpen()) {
+ document.newPage();
+ }
+ else {
+ document.open();
+ }
+ img.setAbsolutePosition(0, 0);
+ document.add(img);
+ label = image.getName();
+ if (label.lastIndexOf(".") > 0);
+ label = label.substring(0, label.lastIndexOf("."));
+ pageLabels.addPageLabel(writer.getPageNumber(), PdfPageLabels.EMPTY, label);
+ System.out.println("Added image: " + image.getName());
+ }
+ catch(Exception e) {
+ System.err.println(e.getMessage());
+ }
+ }
+ if (document.isOpen()) {
+ writer.setPageLabels(pageLabels);
+ document.close();
+ }
+ else {
+ System.err.println("No images were found in directory " + directory.getAbsolutePath());
+ }
+ } catch (Exception e) {
+ JOptionPane.showMessageDialog(internalFrame,
+ e.getMessage(),
+ e.getClass().getName(),
+ JOptionPane.ERROR_MESSAGE);
+ System.err.println(e.getMessage());
+ }
+ }
+
+ /**
+ * @see com.lowagie.tools.plugins.AbstractTool#valueHasChanged(com.lowagie.tools.arguments.ToolArgument)
+ */
+ public void valueHasChanged(ToolArgument arg) {
+ if (internalFrame == null) {
+ // if the internal frame is null, the tool was called from the commandline
+ return;
+ }
+ // represent the changes of the argument in the internal frame
+ }
+
+
+ /**
+ * Converts a tiff file to PDF.
+ * @param args
+ */
+ public static void main(String[] args) {
+ PhotoAlbum tool = new PhotoAlbum();
+ if (args.length < 2) {
+ System.err.println(tool.getUsage());
+ }
+ tool.setArguments(args);
+ tool.execute();
+ }
+
+ /**
+ * @see com.lowagie.tools.plugins.AbstractTool#getDestPathPDF()
+ */
+ protected File getDestPathPDF() throws InstantiationException {
+ return (File)getValue("destfile");
+ }
+}
diff --git a/src/main/java/com/lowagie/tools/plugins/RemoveLaunchApplication.java b/src/main/java/com/lowagie/tools/plugins/RemoveLaunchApplication.java
new file mode 100644
index 0000000..fc082e7
--- /dev/null
+++ b/src/main/java/com/lowagie/tools/plugins/RemoveLaunchApplication.java
@@ -0,0 +1,189 @@
+/*
+ * $Id: RemoveLaunchApplication.java,v 1.4 2005/11/29 21:05:02 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2005 by Bruno Lowagie
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+package com.lowagie.tools.plugins;
+
+import java.io.File;
+import java.io.FileOutputStream;
+
+import javax.swing.JInternalFrame;
+
+import com.lowagie.text.pdf.PRIndirectReference;
+import com.lowagie.text.pdf.PdfDictionary;
+import com.lowagie.text.pdf.PdfName;
+import com.lowagie.text.pdf.PdfObject;
+import com.lowagie.text.pdf.PdfReader;
+import com.lowagie.text.pdf.PdfStamper;
+import com.lowagie.text.pdf.PdfString;
+import com.lowagie.tools.arguments.FileArgument;
+import com.lowagie.tools.arguments.PdfFilter;
+import com.lowagie.tools.arguments.ToolArgument;
+
+/**
+ * This tool copies an existing PDF and removes potentially dangerous code that launches an application.
+ */
+public class RemoveLaunchApplication
+ extends AbstractTool {
+
+ static {
+ addVersion(
+ "$Id: RemoveLaunchApplication.java,v 1.4 2005/11/29 21:05:02 blowagie Exp $");
+ }
+
+ /**
+ * Constructs a ReversePages object.
+ */
+ public RemoveLaunchApplication() {
+ menuoptions = MENU_EXECUTE | MENU_EXECUTE_SHOW;
+ arguments.add(new FileArgument(this, "srcfile",
+ "The file from which you want to remove Launch Application actions", false,
+ new PdfFilter()));
+ arguments.add(new FileArgument(this, "destfile",
+ "The file to which the cleaned up version of the original PDF has to be written", true,
+ new PdfFilter()));
+ }
+
+ /**
+ * @see com.lowagie.tools.plugins.AbstractTool#createFrame()
+ */
+ protected void createFrame() {
+ internalFrame = new JInternalFrame("Remove Launch Applications", true, false, true);
+ internalFrame.setSize(300, 80);
+ internalFrame.setJMenuBar(getMenubar());
+ System.out.println("=== Remove Launch Applications OPENED ===");
+ }
+
+ /**
+ * @see com.lowagie.tools.plugins.AbstractTool#execute()
+ */
+ public void execute() {
+ try {
+ if (getValue("srcfile") == null) {
+ throw new InstantiationException("You need to choose a sourcefile");
+ }
+ File src = (File) getValue("srcfile");
+ if (getValue("destfile") == null) {
+ throw new InstantiationException(
+ "You need to choose a destination file");
+ }
+ File dest = (File) getValue("destfile");
+
+ // we create a reader for a certain document
+ PdfReader reader = new PdfReader(src.getAbsolutePath());
+ PdfObject o;
+ PdfDictionary d;
+ PdfDictionary l;
+ PdfName n;
+ for (int i = 1; i < reader.getXrefSize(); i++) {
+ o = reader.getPdfObject(i);
+ if (o instanceof PdfDictionary) {
+ d = (PdfDictionary)o;
+ o = d.get(PdfName.A);
+ if (o == null) continue;
+ if (o instanceof PdfDictionary) {
+ l = (PdfDictionary)o;
+ }
+ else {
+ PRIndirectReference r =(PRIndirectReference)o;
+ l = (PdfDictionary)reader.getPdfObject(r.getNumber());
+ }
+ n = (PdfName)l.get(PdfName.S);
+ if (PdfName.LAUNCH.equals(n)) {
+ if (l.get(PdfName.F) != null) {
+ System.out.println("Removed: " + l.get(PdfName.F));
+ l.remove(PdfName.F);
+ }
+ if (l.get(PdfName.WIN) != null) {
+ System.out.println("Removed: " + l.get(PdfName.WIN));
+ l.remove(PdfName.WIN);
+ }
+ l.put(PdfName.S, PdfName.JAVASCRIPT);
+ l.put(PdfName.JS, new PdfString("app.alert('Launch Application Action removed by iText');\r"));
+ }
+ }
+ }
+ PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest));
+ stamper.close();
+ }
+ catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ /**
+ * @see com.lowagie.tools.plugins.AbstractTool#valueHasChanged(com.lowagie.tools.arguments.ToolArgument)
+ */
+ public void valueHasChanged(ToolArgument arg) {
+ if (internalFrame == null) {
+ // if the internal frame is null, the tool was called from the commandline
+ return;
+ }
+ // represent the changes of the argument in the internal frame
+ }
+
+ /**
+ * Copy an existing PDF and replace the Launch Application Action with JavaScript alerts.
+ * @param args
+ */
+ public static void main(String[] args) {
+ RemoveLaunchApplication tool = new RemoveLaunchApplication();
+ if (args.length < 2) {
+ System.err.println(tool.getUsage());
+ }
+ tool.setArguments(args);
+ tool.execute();
+ }
+
+ /**
+ * @see com.lowagie.tools.plugins.AbstractTool#getDestPathPDF()
+ */
+ protected File getDestPathPDF() throws InstantiationException {
+ return (File) getValue("destfile");
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/tools/plugins/ReversePages.java b/src/main/java/com/lowagie/tools/plugins/ReversePages.java
new file mode 100644
index 0000000..52b3053
--- /dev/null
+++ b/src/main/java/com/lowagie/tools/plugins/ReversePages.java
@@ -0,0 +1,180 @@
+/*
+ * $Id: ReversePages.java,v 1.3 2005/11/29 21:05:02 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2005 by Bruno Lowagie and anonymous.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+package com.lowagie.tools.plugins;
+
+import java.io.File;
+import java.io.FileOutputStream;
+
+import javax.swing.JInternalFrame;
+
+import com.lowagie.text.Document;
+import com.lowagie.text.pdf.PRAcroForm;
+import com.lowagie.text.pdf.PdfCopy;
+import com.lowagie.text.pdf.PdfImportedPage;
+import com.lowagie.text.pdf.PdfReader;
+import com.lowagie.tools.arguments.FileArgument;
+import com.lowagie.tools.arguments.PdfFilter;
+import com.lowagie.tools.arguments.ToolArgument;
+
+/**
+ * This tool lets you take pages from an existing PDF and copy them in reverse order into a new PDF.
+ */
+public class ReversePages
+ extends AbstractTool {
+
+ static {
+ addVersion(
+ "$Id: ReversePages.java,v 1.3 2005/11/29 21:05:02 blowagie Exp $");
+ }
+
+ /**
+ * Constructs a ReversePages object.
+ */
+ public ReversePages() {
+ menuoptions = MENU_EXECUTE | MENU_EXECUTE_SHOW;
+ arguments.add(new FileArgument(this, "srcfile",
+ "The file you want to reorder", false,
+ new PdfFilter()));
+ arguments.add(new FileArgument(this, "destfile",
+ "The file to which the reordered version of the original PDF has to be written", true,
+ new PdfFilter()));
+ }
+
+ /**
+ * @see com.lowagie.tools.plugins.AbstractTool#createFrame()
+ */
+ protected void createFrame() {
+ internalFrame = new JInternalFrame("ReversePages", true, false, true);
+ internalFrame.setSize(300, 80);
+ internalFrame.setJMenuBar(getMenubar());
+ System.out.println("=== ReversePages OPENED ===");
+ }
+
+ /**
+ * @see com.lowagie.tools.plugins.AbstractTool#execute()
+ */
+ public void execute() {
+ try {
+ if (getValue("srcfile") == null) {
+ throw new InstantiationException("You need to choose a sourcefile");
+ }
+ File src = (File) getValue("srcfile");
+ if (getValue("destfile") == null) {
+ throw new InstantiationException(
+ "You need to choose a destination file");
+ }
+ File dest = (File) getValue("destfile");
+
+ // we create a reader for a certain document
+ PdfReader reader = new PdfReader(src.getAbsolutePath());
+ System.out.println("The original file had " + reader.getNumberOfPages() +
+ " pages.");
+ int pages = reader.getNumberOfPages();
+ java.util.ArrayList li=new java.util.ArrayList();
+ for(int i=pages;i>0;i--){
+ li.add(new Integer(i));
+ }
+ reader.selectPages(li);
+
+ System.err.println("The new file has " + pages + " pages.");
+ Document document = new Document(reader.getPageSizeWithRotation(1));
+ PdfCopy copy = new PdfCopy(document,
+ new FileOutputStream(dest.getAbsolutePath()));
+ document.open();
+ PdfImportedPage page;
+ for (int i = 0; i < pages; ) {
+ ++i;
+ System.out.println("Processed page " + i);
+ page = copy.getImportedPage(reader, i);
+ copy.addPage(page);
+ }
+
+ PRAcroForm form = reader.getAcroForm();
+ if (form != null) {
+ copy.copyAcroForm(reader);
+ }
+ document.close();
+ }
+ catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ /**
+ * @see com.lowagie.tools.plugins.AbstractTool#valueHasChanged(com.lowagie.tools.arguments.ToolArgument)
+ */
+ public void valueHasChanged(ToolArgument arg) {
+ if (internalFrame == null) {
+ // if the internal frame is null, the tool was called from the commandline
+ return;
+ }
+ // represent the changes of the argument in the internal frame
+ }
+
+ /**
+ * Take pages from an existing PDF and copy them in reverse order into a new PDF.
+ * @param args
+ */
+ public static void main(String[] args) {
+ ReversePages tool = new ReversePages();
+ if (args.length < 2) {
+ System.err.println(tool.getUsage());
+ }
+ tool.setArguments(args);
+ tool.execute();
+ }
+
+ /**
+ * @see com.lowagie.tools.plugins.AbstractTool#getDestPathPDF()
+ */
+ protected File getDestPathPDF() throws InstantiationException {
+ return (File) getValue("destfile");
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/tools/plugins/SelectedPages.java b/src/main/java/com/lowagie/tools/plugins/SelectedPages.java
new file mode 100644
index 0000000..73b3b4f
--- /dev/null
+++ b/src/main/java/com/lowagie/tools/plugins/SelectedPages.java
@@ -0,0 +1,150 @@
+/*
+ * $Id: SelectedPages.java,v 1.7 2005/11/29 21:05:02 blowagie Exp $
+ * $Name: $
+ *
+ * This code is free software. It may only be copied or modified
+ * if you include the following copyright notice:
+ *
+ * This class by Mark Thompson. Copyright (c) 2002 Mark Thompson.
+ *
+ * This code is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * itext-questions@list.sourceforge.net
+ */
+package com.lowagie.tools.plugins;
+
+import java.io.File;
+import java.io.FileOutputStream;
+
+import javax.swing.JInternalFrame;
+
+import com.lowagie.text.Document;
+import com.lowagie.text.pdf.PRAcroForm;
+import com.lowagie.text.pdf.PdfCopy;
+import com.lowagie.text.pdf.PdfImportedPage;
+import com.lowagie.text.pdf.PdfReader;
+import com.lowagie.tools.arguments.FileArgument;
+import com.lowagie.tools.arguments.PageSelectorToolArgument;
+import com.lowagie.tools.arguments.PdfFilter;
+import com.lowagie.tools.arguments.ToolArgument;
+
+/**
+ * This tool lets you select pages from an existing PDF and copy them into a new PDF.
+ */
+public class SelectedPages
+ extends AbstractTool {
+
+ static {
+ addVersion(
+ "$Id: SelectedPages.java,v 1.7 2005/11/29 21:05:02 blowagie Exp $");
+ }
+
+ /**
+ * Constructs a SelectedPages object.
+ */
+ public SelectedPages() {
+ menuoptions = MENU_EXECUTE | MENU_EXECUTE_SHOW;
+ ToolArgument inputfile = new FileArgument(this, "srcfile",
+ "The file you want to split", false,
+ new PdfFilter());
+ arguments.add(inputfile);
+ arguments.add(new FileArgument(this, "destfile",
+ "The file to which the first part of the original PDF has to be written", true,
+ new PdfFilter()));
+ ToolArgument spfpdf = new PageSelectorToolArgument(this, "selection",
+ "A selection of pages (see Help for more info)", String.class.getName());
+ arguments.add(spfpdf);
+ inputfile.addPropertyChangeListener(spfpdf);
+ }
+
+ /**
+ * @see com.lowagie.tools.plugins.AbstractTool#createFrame()
+ */
+ protected void createFrame() {
+ internalFrame = new JInternalFrame("SelectedPages", true, false, true);
+ internalFrame.setSize(300, 80);
+ internalFrame.setJMenuBar(getMenubar());
+ System.out.println("=== SelectedPages OPENED ===");
+ }
+
+ /**
+ * @see com.lowagie.tools.plugins.AbstractTool#execute()
+ */
+ public void execute() {
+ try {
+ if (getValue("srcfile") == null) {
+ throw new InstantiationException("You need to choose a sourcefile");
+ }
+ File src = (File) getValue("srcfile");
+ if (getValue("destfile") == null) {
+ throw new InstantiationException(
+ "You need to choose a destination file for the first part of the PDF");
+ }
+ File dest = (File) getValue("destfile");
+ String selection = (String) getValue("selection");
+
+ // we create a reader for a certain document
+ PdfReader reader = new PdfReader(src.getAbsolutePath());
+ System.out.println("The original file had " + reader.getNumberOfPages() +
+ " pages.");
+ reader.selectPages(selection);
+ int pages = reader.getNumberOfPages();
+ System.err.println("The new file has " + pages + " pages.");
+ Document document = new Document(reader.getPageSizeWithRotation(1));
+ PdfCopy copy = new PdfCopy(document,
+ new FileOutputStream(dest.getAbsolutePath()));
+ document.open();
+ PdfImportedPage page;
+ for (int i = 0; i < pages; ) {
+ ++i;
+ System.out.println("Processed page " + i);
+ page = copy.getImportedPage(reader, i);
+ copy.addPage(page);
+ }
+ PRAcroForm form = reader.getAcroForm();
+ if (form != null) {
+ copy.copyAcroForm(reader);
+ }
+ document.close();
+ }
+ catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ /**
+ * @see com.lowagie.tools.plugins.AbstractTool#valueHasChanged(com.lowagie.tools.arguments.ToolArgument)
+ */
+ public void valueHasChanged(ToolArgument arg) {
+ if (internalFrame == null) {
+ // if the internal frame is null, the tool was called from the commandline
+ return;
+ }
+ // represent the changes of the argument in the internal frame
+ System.out.println("klasse:" + arg.getClassname());
+ System.out.println("arg:" + arg.getValue());
+ }
+
+ /**
+ * Select pages from an existing PDF and copy them into a new PDF.
+ * @param args
+ */
+ public static void main(String[] args) {
+ SelectedPages tool = new SelectedPages();
+ if (args.length < 4) {
+ System.err.println(tool.getUsage());
+ }
+ tool.setArguments(args);
+ tool.execute();
+ }
+
+ /**
+ * @see com.lowagie.tools.plugins.AbstractTool#getDestPathPDF()
+ */
+ protected File getDestPathPDF() throws InstantiationException {
+ return (File) getValue("destfile");
+ }
+
+}
diff --git a/src/main/java/com/lowagie/tools/plugins/Split.java b/src/main/java/com/lowagie/tools/plugins/Split.java
new file mode 100644
index 0000000..2c14651
--- /dev/null
+++ b/src/main/java/com/lowagie/tools/plugins/Split.java
@@ -0,0 +1,168 @@
+/*
+ * $Id: Split.java,v 1.9 2005/11/29 21:05:02 blowagie Exp $
+ * $Name: $
+ *
+ * This code is free software. It may only be copied or modified
+ * if you include the following copyright notice:
+ *
+ * This class by Mark Thompson. Copyright (c) 2002 Mark Thompson.
+ *
+ * This code is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * itext-questions@list.sourceforge.net
+ */
+package com.lowagie.tools.plugins;
+
+import java.io.File;
+import java.io.FileOutputStream;
+
+import javax.swing.JInternalFrame;
+
+import com.lowagie.text.Document;
+import com.lowagie.text.DocumentException;
+import com.lowagie.text.pdf.PdfContentByte;
+import com.lowagie.text.pdf.PdfImportedPage;
+import com.lowagie.text.pdf.PdfReader;
+import com.lowagie.text.pdf.PdfWriter;
+import com.lowagie.tools.arguments.FileArgument;
+import com.lowagie.tools.arguments.LabelAccessory;
+import com.lowagie.tools.arguments.PdfFilter;
+import com.lowagie.tools.arguments.ToolArgument;
+
+/**
+ * This tool lets you split a PDF in two separate PDF files.
+ */
+public class Split extends AbstractTool {
+
+ static {
+ addVersion("$Id: Split.java,v 1.9 2005/11/29 21:05:02 blowagie Exp $");
+ }
+ /**
+ * Constructs an Split object.
+ */
+ public Split() {
+ FileArgument f = new FileArgument(this, "srcfile", "The file you want to split", false, new PdfFilter());
+ f.setLabel(new LabelAccessory());
+ arguments.add(f);
+ arguments.add(new FileArgument(this, "destfile1", "The file to which the first part of the original PDF has to be written", true, new PdfFilter()));
+ arguments.add(new FileArgument(this, "destfile2", "The file to which the second part of the original PDF has to be written", true, new PdfFilter()));
+ arguments.add(new ToolArgument(this, "pagenumber", "The pagenumber where you want to split", String.class.getName()));
+ }
+
+ /**
+ * @see com.lowagie.tools.plugins.AbstractTool#createFrame()
+ */
+ protected void createFrame() {
+ internalFrame = new JInternalFrame("Split", true, false, true);
+ internalFrame.setSize(300, 80);
+ internalFrame.setJMenuBar(getMenubar());
+ System.out.println("=== Split OPENED ===");
+ }
+
+ /**
+ * @see com.lowagie.tools.plugins.AbstractTool#execute()
+ */
+ public void execute() {
+ try {
+ if (getValue("srcfile") == null) throw new InstantiationException("You need to choose a sourcefile");
+ File src = (File)getValue("srcfile");
+ if (getValue("destfile1") == null) throw new InstantiationException("You need to choose a destination file for the first part of the PDF");
+ File file1 = (File)getValue("destfile1");
+ if (getValue("destfile2") == null) throw new InstantiationException("You need to choose a destination file for the second part of the PDF");
+ File file2 = (File)getValue("destfile2");
+ int pagenumber = Integer.parseInt((String)getValue("pagenumber"));
+
+ // we create a reader for a certain document
+ PdfReader reader = new PdfReader(src.getAbsolutePath());
+ // we retrieve the total number of pages
+ int n = reader.getNumberOfPages();
+ System.out.println("There are " + n + " pages in the original file.");
+
+ if (pagenumber < 2 || pagenumber > n) {
+ throw new DocumentException("You can't split this document at page " + pagenumber + "; there is no such page.");
+ }
+
+ // step 1: creation of a document-object
+ Document document1 = new Document(reader.getPageSizeWithRotation(1));
+ Document document2 = new Document(reader.getPageSizeWithRotation(pagenumber));
+ // step 2: we create a writer that listens to the document
+ PdfWriter writer1 = PdfWriter.getInstance(document1, new FileOutputStream(file1));
+ PdfWriter writer2 = PdfWriter.getInstance(document2, new FileOutputStream(file2));
+ // step 3: we open the document
+ document1.open();
+ PdfContentByte cb1 = writer1.getDirectContent();
+ document2.open();
+ PdfContentByte cb2 = writer2.getDirectContent();
+ PdfImportedPage page;
+ int rotation;
+ int i = 0;
+ // step 4: we add content
+ while (i < pagenumber - 1) {
+ i++;
+ document1.setPageSize(reader.getPageSizeWithRotation(i));
+ document1.newPage();
+ page = writer1.getImportedPage(reader, i);
+ rotation = reader.getPageRotation(i);
+ if (rotation == 90 || rotation == 270) {
+ cb1.addTemplate(page, 0, -1f, 1f, 0, 0, reader.getPageSizeWithRotation(i).height());
+ }
+ else {
+ cb1.addTemplate(page, 1f, 0, 0, 1f, 0, 0);
+ }
+ }
+ while (i < n) {
+ i++;
+ document2.setPageSize(reader.getPageSizeWithRotation(i));
+ document2.newPage();
+ page = writer2.getImportedPage(reader, i);
+ rotation = reader.getPageRotation(i);
+ if (rotation == 90 || rotation == 270) {
+ cb2.addTemplate(page, 0, -1f, 1f, 0, 0, reader.getPageSizeWithRotation(i).height());
+ }
+ else {
+ cb2.addTemplate(page, 1f, 0, 0, 1f, 0, 0);
+ }
+ }
+ // step 5: we close the document
+ document1.close();
+ document2.close();
+ }
+ catch(Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ /**
+ * @see com.lowagie.tools.plugins.AbstractTool#valueHasChanged(com.lowagie.tools.arguments.ToolArgument)
+ */
+ public void valueHasChanged(ToolArgument arg) {
+ if (internalFrame == null) {
+ // if the internal frame is null, the tool was called from the commandline
+ return;
+ }
+ // represent the changes of the argument in the internal frame
+ }
+
+
+ /**
+ * Split a PDF in two separate PDF files.
+ * @param args
+ */
+ public static void main(String[] args) {
+ Split tool = new Split();
+ if (args.length < 4) {
+ System.err.println(tool.getUsage());
+ }
+ tool.setArguments(args);
+ tool.execute();
+ }
+
+ /**
+ * @see com.lowagie.tools.plugins.AbstractTool#getDestPathPDF()
+ */
+ protected File getDestPathPDF() throws InstantiationException {
+ return (File)getValue("destfile1");
+ }
+}
diff --git a/src/main/java/com/lowagie/tools/plugins/Tiff2Pdf.java b/src/main/java/com/lowagie/tools/plugins/Tiff2Pdf.java
new file mode 100644
index 0000000..8455cdf
--- /dev/null
+++ b/src/main/java/com/lowagie/tools/plugins/Tiff2Pdf.java
@@ -0,0 +1,192 @@
+/*
+ * $Id: Tiff2Pdf.java,v 1.9 2005/11/29 21:05:02 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2005 by Bruno Lowagie.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+package com.lowagie.tools.plugins;
+
+import java.io.File;
+import java.io.FileOutputStream;
+
+import javax.swing.JInternalFrame;
+import javax.swing.JOptionPane;
+
+import com.lowagie.text.Document;
+import com.lowagie.text.Image;
+import com.lowagie.text.PageSize;
+import com.lowagie.text.Paragraph;
+import com.lowagie.text.Rectangle;
+import com.lowagie.text.pdf.PdfContentByte;
+import com.lowagie.text.pdf.PdfWriter;
+import com.lowagie.text.pdf.RandomAccessFileOrArray;
+import com.lowagie.text.pdf.codec.TiffImage;
+import com.lowagie.tools.arguments.FileArgument;
+import com.lowagie.tools.arguments.ImageFilter;
+import com.lowagie.tools.arguments.OptionArgument;
+import com.lowagie.tools.arguments.PdfFilter;
+import com.lowagie.tools.arguments.ToolArgument;
+
+/**
+ * Converts a Tiff file to a PDF file.
+ */
+public class Tiff2Pdf extends AbstractTool {
+
+ static {
+ addVersion("$Id: Tiff2Pdf.java,v 1.9 2005/11/29 21:05:02 blowagie Exp $");
+ }
+ /**
+ * Constructs a Tiff2Pdf object.
+ */
+ public Tiff2Pdf() {
+ menuoptions = MENU_EXECUTE | MENU_EXECUTE_SHOW;
+ arguments.add(new FileArgument(this, "srcfile", "The file you want to convert", false, new ImageFilter(false, false, false, false, false, true)));
+ arguments.add(new FileArgument(this, "destfile", "The file to which the converted TIFF has to be written", true, new PdfFilter()));
+ OptionArgument oa = new OptionArgument(this, "pagesize", "Pagesize");
+ oa.addOption("A4", "A4");
+ oa.addOption("Letter", "LETTER");
+ oa.addOption("Original format", "ORIGINAL");
+ arguments.add(oa);
+ }
+
+ /**
+ * @see com.lowagie.tools.plugins.AbstractTool#createFrame()
+ */
+ protected void createFrame() {
+ internalFrame = new JInternalFrame("Tiff2Pdf", true, false, true);
+ internalFrame.setSize(550, 250);
+ internalFrame.setJMenuBar(getMenubar());
+ System.out.println("=== Tiff2Pdf OPENED ===");
+ }
+
+ /**
+ * @see com.lowagie.tools.plugins.AbstractTool#execute()
+ */
+ public void execute() {
+ try {
+ if (getValue("srcfile") == null) throw new InstantiationException("You need to choose a sourcefile");
+ File tiff_file = (File)getValue("srcfile");
+ if (getValue("destfile") == null) throw new InstantiationException("You need to choose a destination file");
+ File pdf_file = (File)getValue("destfile");
+ RandomAccessFileOrArray ra = new RandomAccessFileOrArray(tiff_file.getAbsolutePath());
+ int comps = TiffImage.getNumberOfPages(ra);
+ boolean adjustSize = false;
+ Document document = new Document(PageSize.A4);
+ if ("ORIGINAL".equals(getValue("pagesize"))) {
+ Image img = TiffImage.getTiffImage(ra, 1);
+ document.setPageSize(new Rectangle(img.scaledWidth(), img.scaledHeight()));
+ adjustSize = true;
+ }
+ else if ("LETTER".equals(getValue("pagesize"))) {
+ document.setPageSize(PageSize.LETTER);
+ }
+ PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(pdf_file));
+ document.open();
+ PdfContentByte cb = writer.getDirectContent();
+ for (int c = 0; c < comps; ++c) {
+ Image img = TiffImage.getTiffImage(ra, c + 1);
+ if (img != null) {
+ if (adjustSize) {
+ document.setPageSize(new Rectangle(img.scaledWidth(),
+ img.scaledHeight()));
+ document.newPage();
+ img.setAbsolutePosition(0, 0);
+ }
+ else {
+ if (img.scaledWidth() > 500 || img.scaledHeight() > 700) {
+ img.scaleToFit(500, 700);
+ }
+ img.setAbsolutePosition(20, 20);
+ document.newPage();
+ document.add(new Paragraph(tiff_file + " - page " + (c + 1)));
+ }
+ cb.addImage(img);
+ System.out.println("Finished page " + (c + 1));
+ }
+ }
+ ra.close();
+ document.close();
+ } catch (Exception e) {
+ JOptionPane.showMessageDialog(internalFrame,
+ e.getMessage(),
+ e.getClass().getName(),
+ JOptionPane.ERROR_MESSAGE);
+ System.err.println(e.getMessage());
+ }
+ }
+
+ /**
+ * @see com.lowagie.tools.plugins.AbstractTool#valueHasChanged(com.lowagie.tools.arguments.ToolArgument)
+ */
+ public void valueHasChanged(ToolArgument arg) {
+ if (internalFrame == null) {
+ // if the internal frame is null, the tool was called from the commandline
+ return;
+ }
+ // represent the changes of the argument in the internal frame
+ }
+
+
+ /**
+ * Converts a tiff file to PDF.
+ * @param args
+ */
+ public static void main(String[] args) {
+ Tiff2Pdf tool = new Tiff2Pdf();
+ if (args.length < 2) {
+ System.err.println(tool.getUsage());
+ }
+ tool.setArguments(args);
+ tool.execute();
+ }
+
+ /**
+ * @see com.lowagie.tools.plugins.AbstractTool#getDestPathPDF()
+ */
+ protected File getDestPathPDF() throws InstantiationException {
+ return (File)getValue("destfile");
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/tools/plugins/TreeViewPDF.java b/src/main/java/com/lowagie/tools/plugins/TreeViewPDF.java
new file mode 100644
index 0000000..0b55b8c
--- /dev/null
+++ b/src/main/java/com/lowagie/tools/plugins/TreeViewPDF.java
@@ -0,0 +1,160 @@
+/*
+ * $Id: TreeViewPDF.java,v 1.2 2006/05/29 10:31:17 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2005 by Anonymous.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+package com.lowagie.tools.plugins;
+
+import java.io.File;
+
+import javax.swing.JOptionPane;
+
+import com.lowagie.tools.arguments.FileArgument;
+import com.lowagie.tools.arguments.LabelAccessory;
+import com.lowagie.tools.arguments.PdfFilter;
+import com.lowagie.tools.arguments.ToolArgument;
+import com.lowagie.tools.plugins.treeview.TreeViewInternalFrame;
+import com.lowagie.tools.Toolbox;
+import java.beans.*;
+
+/**
+ * Allows you to inspect an existing PDF file.
+ */
+public class TreeViewPDF
+ extends AbstractTool {
+ static {
+ addVersion("$Id: TreeViewPDF.java,v 1.2 2006/05/29 10:31:17 blowagie Exp $");
+ }
+
+ TreeViewInternalFrame ul;
+ FileArgument inputfile;
+ /**
+ * Constructs an TreeViewPDF object.
+ */
+ public TreeViewPDF() {
+ inputfile = new FileArgument(this, "srcfile",
+ "The file you want to inspect", false,
+ new PdfFilter());
+ inputfile.setLabel(new LabelAccessory());
+ arguments.add(inputfile);
+ }
+
+ /**
+ * @see com.lowagie.tools.plugins.AbstractTool#createFrame()
+ */
+ protected void createFrame() {
+ ul = new TreeViewInternalFrame("Pdf Analysis", true, false, true);
+ internalFrame = ul;
+ internalFrame.setSize(500, 300);
+ internalFrame.setJMenuBar(getMenubar());
+ inputfile.addPropertyChangeListener(ul);
+ System.out.println("=== Pdf Analysis OPENED ===");
+ }
+
+ /**
+ * @see com.lowagie.tools.plugins.AbstractTool#execute()
+ */
+ public void execute() {
+ try {
+ if (getValue("srcfile") == null) {
+ throw new InstantiationException("You need to choose a sourcefile");
+ }
+
+ }
+ catch (Exception e) {
+ JOptionPane.showMessageDialog(internalFrame,
+ e.getMessage(),
+ e.getClass().getName(),
+ JOptionPane.ERROR_MESSAGE);
+ System.err.println(e.getMessage());
+ }
+ }
+
+ /**
+ * @see com.lowagie.tools.plugins.AbstractTool#valueHasChanged(com.lowagie.tools.arguments.ToolArgument)
+ */
+ public void valueHasChanged(ToolArgument arg) {
+ if (internalFrame == null) {
+ // if the internal frame is null, the tool was called from the commandline
+ return;
+ }
+ // represent the changes of the argument in the internal frame
+ }
+
+ /**
+ * Inspects an existing PDF file.
+ * @param args
+ */
+ public static void main(String[] args) {
+ try {
+ Toolbox toolbox = new Toolbox();
+ AbstractTool tool = toolbox.createFrame("TreeViewPDF");
+ if (args.length > 1) {
+ System.err.println(tool.getUsage());
+ }
+ tool.setArguments(args);
+ tool.execute();
+ }
+ catch (PropertyVetoException ex) {
+ }
+ catch (ClassNotFoundException ex) {
+ }
+ catch (IllegalAccessException ex) {
+ }
+ catch (InstantiationException ex) {
+ }
+// throw new RuntimeException("GUI only Application!");
+ }
+
+ /**
+ * @see com.lowagie.tools.plugins.AbstractTool#getDestPathPDF()
+ */
+ protected File getDestPathPDF() throws InstantiationException {
+ throw new InstantiationException("There is no file to show.");
+ }
+
+}
diff --git a/src/main/java/com/lowagie/tools/plugins/Txt2Pdf.java b/src/main/java/com/lowagie/tools/plugins/Txt2Pdf.java
new file mode 100644
index 0000000..8a377fd
--- /dev/null
+++ b/src/main/java/com/lowagie/tools/plugins/Txt2Pdf.java
@@ -0,0 +1,169 @@
+/*
+ * $Id: Txt2Pdf.java,v 1.9 2005/11/29 21:05:02 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2005 by Bruno Lowagie.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+package com.lowagie.tools.plugins;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.FileReader;
+
+import javax.swing.JInternalFrame;
+import javax.swing.JOptionPane;
+
+import com.lowagie.text.Document;
+import com.lowagie.text.Font;
+import com.lowagie.text.FontFactory;
+import com.lowagie.text.Paragraph;
+import com.lowagie.text.Rectangle;
+import com.lowagie.text.pdf.PdfWriter;
+import com.lowagie.tools.arguments.FileArgument;
+import com.lowagie.tools.arguments.OptionArgument;
+import com.lowagie.tools.arguments.PageSizeArgument;
+import com.lowagie.tools.arguments.PdfFilter;
+import com.lowagie.tools.arguments.ToolArgument;
+
+/**
+ * Converts a monospaced txt file to a PDF file.
+ */
+public class Txt2Pdf extends AbstractTool {
+
+ static {
+ addVersion("$Id: Txt2Pdf.java,v 1.9 2005/11/29 21:05:02 blowagie Exp $");
+ }
+ /**
+ * Constructs a Txt2Pdf object.
+ */
+ public Txt2Pdf() {
+ menuoptions = MENU_EXECUTE | MENU_EXECUTE_SHOW | MENU_EXECUTE_PRINT_SILENT;
+ arguments.add(new FileArgument(this, "srcfile", "The file you want to convert", false));
+ arguments.add(new FileArgument(this, "destfile", "The file to which the converted text has to be written", true, new PdfFilter()));
+ PageSizeArgument oa1 = new PageSizeArgument(this, "pagesize", "Pagesize");
+ arguments.add(oa1);
+ OptionArgument oa2 = new OptionArgument(this, "orientation", "Orientation of the page");
+ oa2.addOption("Portrait", "PORTRAIT");
+ oa2.addOption("Landscape", "LANDSCAPE");
+ arguments.add(oa2);
+ }
+
+ /**
+ * @see com.lowagie.tools.plugins.AbstractTool#createFrame()
+ */
+ protected void createFrame() {
+ internalFrame = new JInternalFrame("Txt2Pdf", true, true, true);
+ internalFrame.setSize(300, 80);
+ internalFrame.setJMenuBar(getMenubar());
+ System.out.println("=== Txt2Pdf OPENED ===");
+ }
+
+ /**
+ * @see com.lowagie.tools.plugins.AbstractTool#execute()
+ */
+ public void execute() {
+ try {
+ String line = null;
+ Document document;
+ Font f;
+ Rectangle pagesize = (Rectangle)getValue("pagesize");
+ if ("LANDSCAPE".equals(getValue("orientation"))) {
+ f = FontFactory.getFont(FontFactory.COURIER, 10);
+ document = new Document(pagesize.rotate(), 36, 9, 36, 36);
+ }
+ else {
+ f = FontFactory.getFont(FontFactory.COURIER, 11);
+ document = new Document(pagesize, 72, 36, 36, 36);
+ }
+ BufferedReader in = new BufferedReader(new FileReader((File)getValue("srcfile")));
+ PdfWriter.getInstance(document, new FileOutputStream((File)getValue("destfile")));
+ document.open();
+ while ((line = in.readLine()) != null) {
+ document.add(new Paragraph(12, line, f));
+ }
+ document.close();
+ } catch (Exception e) {
+ JOptionPane.showMessageDialog(internalFrame,
+ e.getMessage(),
+ e.getClass().getName(),
+ JOptionPane.ERROR_MESSAGE);
+ System.err.println(e.getMessage());
+ }
+ }
+
+ /**
+ * @see com.lowagie.tools.plugins.AbstractTool#valueHasChanged(com.lowagie.tools.arguments.ToolArgument)
+ */
+ public void valueHasChanged(ToolArgument arg) {
+ if (internalFrame == null) {
+ // if the internal frame is null, the tool was called from the commandline
+ return;
+ }
+ // represent the changes of the argument in the internal frame
+ }
+
+
+ /**
+ * Converts a monospaced txt file to a PDF file.
+ * @param args
+ */
+ public static void main(String[] args) {
+ Txt2Pdf tool = new Txt2Pdf();
+ if (args.length < 3) {
+ System.err.println(tool.getUsage());
+ }
+ tool.setArguments(args);
+ tool.execute();
+ }
+
+ /**
+ * @see com.lowagie.tools.plugins.AbstractTool#getDestPathPDF()
+ */
+ protected File getDestPathPDF() throws InstantiationException {
+ return (File)getValue("destfile");
+ }
+}
diff --git a/src/main/java/com/lowagie/tools/plugins/Watermarker.java b/src/main/java/com/lowagie/tools/plugins/Watermarker.java
new file mode 100644
index 0000000..e1e64f8
--- /dev/null
+++ b/src/main/java/com/lowagie/tools/plugins/Watermarker.java
@@ -0,0 +1,163 @@
+/*
+ * $Id: Watermarker.java,v 1.6 2006/03/20 14:30:33 blowagie Exp $
+ * $Name: $
+ *
+ * This code is free software. It may only be copied or modified
+ * if you include the following copyright notice:
+ *
+ * This class by Carsten hammer and Bruno Lowagie.
+ * Copyright (c) 2005 Carsten Hammer and Bruno Lowagie.
+ *
+ * This code is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * itext-questions@list.sourceforge.net
+ */
+
+package com.lowagie.tools.plugins;
+
+import java.io.*;
+
+import javax.swing.*;
+
+import com.lowagie.text.*;
+import com.lowagie.text.pdf.*;
+import com.lowagie.tools.arguments.*;
+
+/**
+ * This tool lets you add a text watermark to all pages of a document.
+ */
+public class Watermarker extends AbstractTool {
+
+ static {
+ addVersion("$Id: Watermarker.java,v 1.6 2006/03/20 14:30:33 blowagie Exp $");
+ }
+
+ /**
+ * This tool lets you add a text watermark to all pages of a document.
+ */
+ public Watermarker() {
+ super();
+ arguments.add(new FileArgument(this, "srcfile",
+ "The file you want to watermark", false, new PdfFilter()));
+ arguments.add(new ToolArgument(this, "watermark", "The text that can be used as watermark", String.class.getName()));
+ arguments.add(new ToolArgument(this, "fontsize", "The fontsize of the watermark text", String.class.getName()));
+ arguments.add(new ToolArgument(this, "opacity", "The opacity of the watermark text", String.class.getName()));
+ arguments.add(new FileArgument(this, "destfile",
+ "The file to which the watermarked PDF has to be written",
+ true, new PdfFilter()));
+
+ }
+
+ /**
+ * Creates the internal frame.
+ */
+ protected void createFrame() {
+ internalFrame = new JInternalFrame("Watermark", true, false, true);
+ internalFrame.setSize(300, 80);
+ internalFrame.setJMenuBar(getMenubar());
+ System.out.println("=== Watermark OPENED ===");
+ }
+
+ /**
+ * Executes the tool (in most cases this generates a PDF file).
+ */
+ public void execute() {
+ try {
+ if (getValue("srcfile") == null) {
+ throw new InstantiationException(
+ "You need to choose a sourcefile");
+ }
+ if (getValue("destfile") == null) {
+ throw new InstantiationException(
+ "You need to choose a destination file");
+ }
+ if (getValue("watermark") == null) {
+ throw new InstantiationException(
+ "You need to add a text for the watermark");
+ }
+ int fontsize = Integer.parseInt((String)getValue("fontsize"));
+ float opacity = Float.parseFloat((String)getValue("opacity"));
+ BaseFont bf = BaseFont.createFont("Helvetica", BaseFont.WINANSI,
+ false);
+ PdfReader reader = new PdfReader(((File) getValue("srcfile"))
+ .getAbsolutePath());
+ int pagecount = reader.getNumberOfPages();
+ PdfGState gs1 = new PdfGState();
+ gs1.setFillOpacity(opacity);
+ String text = (String)getValue("watermark");
+ PdfStamper stamp = new PdfStamper(reader, new FileOutputStream(
+ (File) getValue("destfile")));
+ float txtwidth = bf.getWidthPoint(text, fontsize);
+ for (int i = 1; i <= pagecount; i++) {
+ PdfContentByte seitex = stamp.getOverContent(i);
+ Rectangle recc = reader.getCropBox(i);
+ float winkel = (float) Math.atan(recc.height() / recc.width());
+ float m1 = (float) Math.cos(winkel);
+ float m2 = (float) -Math.sin(winkel);
+ float m3 = (float) Math.sin(winkel);
+ float m4 = (float) Math.cos(winkel);
+ float xoff = (float) (-Math.cos(winkel) * txtwidth / 2 - Math
+ .sin(winkel)
+ * fontsize / 2);
+ float yoff = (float) (Math.sin(winkel) * txtwidth / 2 - Math
+ .cos(winkel)
+ * fontsize / 2);
+ seitex.saveState();
+ seitex.setGState(gs1);
+ seitex.beginText();
+ seitex.setFontAndSize(bf, fontsize);
+ seitex.setTextMatrix(m1, m2, m3, m4, xoff + recc.width() / 2,
+ yoff + recc.height() / 2);
+ seitex.showText(text);
+ seitex.endText();
+ seitex.restoreState();
+ }
+ stamp.close();
+ } catch (Exception e) {
+ JOptionPane.showMessageDialog(internalFrame, e.getMessage(), e
+ .getClass().getName(), JOptionPane.ERROR_MESSAGE);
+ System.err.println(e.getMessage());
+ }
+ }
+
+ /**
+ * Gets the PDF file that should be generated (or null if the output isn't a
+ * PDF file).
+ *
+ * @return the PDF file that should be generated
+ * @throws InstantiationException
+ */
+ protected File getDestPathPDF() throws InstantiationException {
+ return (File) getValue("destfile");
+ }
+
+ /**
+ * Indicates that the value of an argument has changed.
+ *
+ * @param arg
+ * the argument that has changed
+ */
+ public void valueHasChanged(ToolArgument arg) {
+ if (internalFrame == null) {
+ // if the internal frame is null, the tool was called from the
+ // commandline
+ return;
+ }
+
+ }
+
+ /**
+ * This methods helps you running this tool as a standalone application.
+ * @param args the srcfile, watermark text and destfile
+ */
+ public static void main(String[] args) {
+ Watermarker watermarker = new Watermarker();
+ if (args.length != 5) {
+ System.err.println(watermarker.getUsage());
+ }
+ watermarker.setArguments(args);
+ watermarker.execute();
+ }
+} \ No newline at end of file
diff --git a/src/main/java/com/lowagie/tools/plugins/XML2Bookmarks.java b/src/main/java/com/lowagie/tools/plugins/XML2Bookmarks.java
new file mode 100644
index 0000000..9b23657
--- /dev/null
+++ b/src/main/java/com/lowagie/tools/plugins/XML2Bookmarks.java
@@ -0,0 +1,156 @@
+/*
+ * $Id: XML2Bookmarks.java,v 1.2 2006/02/03 08:30:56 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2005 by Hans-Werner Hilse.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+package com.lowagie.tools.plugins;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.util.List;
+
+import javax.swing.JInternalFrame;
+import javax.swing.JOptionPane;
+
+import com.lowagie.text.pdf.PdfReader;
+import com.lowagie.text.pdf.PdfStamper;
+import com.lowagie.text.pdf.PdfWriter;
+import com.lowagie.text.pdf.SimpleBookmark;
+import com.lowagie.tools.arguments.FileArgument;
+import com.lowagie.tools.arguments.PdfFilter;
+import com.lowagie.tools.arguments.ToolArgument;
+
+/**
+ * Allows you to add bookmarks to an existing PDF file
+ */
+public class XML2Bookmarks extends AbstractTool {
+
+ static {
+ addVersion("$Id: XML2Bookmarks.java,v 1.2 2006/02/03 08:30:56 blowagie Exp $");
+ }
+
+ /**
+ * Constructs an XML2Bookmarks object.
+ */
+ public XML2Bookmarks() {
+ arguments.add(new FileArgument(this, "xmlfile", "the bookmarks in XML", false));
+ arguments.add(new FileArgument(this, "pdffile", "the PDF to which you want to add bookmarks", false, new PdfFilter()));
+ arguments.add(new FileArgument(this, "destfile", "the resulting PDF", true, new PdfFilter()));
+ }
+
+ /**
+ * @see com.lowagie.tools.plugins.AbstractTool#createFrame()
+ */
+ protected void createFrame() {
+ internalFrame = new JInternalFrame("XML + PDF = PDF", true, true, true);
+ internalFrame.setSize(300, 80);
+ internalFrame.setJMenuBar(getMenubar());
+ System.out.println("=== XML2Bookmarks OPENED ===");
+ }
+
+ /**
+ * @see com.lowagie.tools.plugins.AbstractTool#execute()
+ */
+ public void execute() {
+ try {
+ if (getValue("xmlfile") == null) throw new InstantiationException("You need to choose an xml file");
+ if (getValue("pdffile") == null) throw new InstantiationException("You need to choose a source PDF file");
+ if (getValue("destfile") == null) throw new InstantiationException("You need to choose a destination PDF file");
+ FileInputStream bmReader = new FileInputStream( (File) getValue("xmlfile") );
+ List bookmarks = SimpleBookmark.importFromXML( bmReader );
+ bmReader.close();
+ PdfReader reader = new PdfReader(((File)getValue("pdffile")).getAbsolutePath());
+ reader.consolidateNamedDestinations();
+ int n = reader.getNumberOfPages();
+ PdfStamper stamper = new PdfStamper(reader, new FileOutputStream((File)getValue("destfile")));
+ stamper.setOutlines(bookmarks);
+ stamper.setViewerPreferences(reader.getViewerPreferences() | PdfWriter.PageModeUseOutlines);
+ stamper.close();
+ }
+ catch(Exception e) {
+ e.printStackTrace();
+ JOptionPane.showMessageDialog(internalFrame,
+ e.getMessage(),
+ e.getClass().getName(),
+ JOptionPane.ERROR_MESSAGE);
+ System.err.println(e.getMessage());
+ }
+ }
+
+ /**
+ * @see com.lowagie.tools.plugins.AbstractTool#valueHasChanged(com.lowagie.tools.arguments.ToolArgument)
+ */
+ public void valueHasChanged(ToolArgument arg) {
+ if (internalFrame == null) {
+ // if the internal frame is null, the tool was called from the commandline
+ return;
+ }
+ // represent the changes of the argument in the internal frame
+ }
+
+ /**
+ * Allows you to generate an index file in HTML containing Bookmarks to an existing PDF file.
+ * @param args
+ */
+ public static void main(String[] args) {
+ XML2Bookmarks tool = new XML2Bookmarks();
+ if (args.length < 3) {
+ System.err.println(tool.getUsage());
+ }
+ tool.setArguments(args);
+ tool.execute();
+ }
+
+ /**
+ * @see com.lowagie.tools.plugins.AbstractTool#getDestPathPDF()
+ */
+ protected File getDestPathPDF() throws InstantiationException {
+ return (File)getValue("destfile");
+ }
+
+}
diff --git a/src/main/java/com/lowagie/tools/plugins/treeview/AnalyzePDF.java b/src/main/java/com/lowagie/tools/plugins/treeview/AnalyzePDF.java
new file mode 100644
index 0000000..5907f9a
--- /dev/null
+++ b/src/main/java/com/lowagie/tools/plugins/treeview/AnalyzePDF.java
@@ -0,0 +1,507 @@
+/*
+ * $Id: AnalyzePDF.java,v 1.4 2006/05/30 09:11:45 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2005 by Anonymous.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+package com.lowagie.tools.plugins.treeview;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Vector;
+
+import javax.swing.event.TreeModelEvent;
+import javax.swing.event.TreeModelListener;
+import javax.swing.tree.DefaultMutableTreeNode;
+import javax.swing.tree.TreeModel;
+import javax.swing.tree.TreePath;
+
+import com.lowagie.text.pdf.*;
+import java.util.Set;
+import java.util.Iterator;
+import javax.swing.table.TableModel;
+import javax.swing.table.AbstractTableModel;
+
+public class AnalyzePDF
+ extends Thread implements TreeModel, ICommonAnalyzer {
+ DefaultMutableTreeNode root;
+ DefaultMutableTreeNode filenode;
+ int pagecount;
+ ProgressDialog progressdialog;
+ int numberofpages;
+ ArrayList pageInh = new ArrayList();
+ private transient Vector treeModelListeners;
+ PdfReader reader;
+
+ public AnalyzePDF(String infile,
+ com.lowagie.tools.plugins.treeview.ProgressDialog blubb) {
+ this.progressdialog = blubb;
+ try {
+ reader = new PdfReader(infile);
+ root = new SimpletextTreeNode("Dokument");
+ filenode = new FileTreeNode(infile, reader);
+ root.add(filenode);
+ this.numberofpages = reader.getNumberOfPages();
+ }
+ catch (IOException ex) {
+ }
+ pagecount = 0;
+ }
+
+ public TableModel getXReftable() {
+ TableModel tm = new AbstractTableModel() {
+ public int getColumnCount() {
+ return 2;
+ }
+
+ public int getRowCount() {
+ return reader.getXrefSize() - 1;
+ }
+
+ public Object getValueAt(int rowIndex, int columnIndex) {
+ switch (columnIndex) {
+ case 0:
+ return new Integer(rowIndex + 1);
+ case 1:
+ PdfObject pdfob=reader.getPdfObject(rowIndex + 1);
+ if(pdfob.isStream()){
+ return "Stream "+pdfob;
+ }else{
+ return pdfob;
+ }
+ default:
+ return null;
+ }
+ }
+
+ /**
+ * Returns the name of the column at <code>columnIndex</code>.
+ *
+ * @param columnIndex the index of the column
+ * @return the name of the column
+ * @todo Implement this javax.swing.table.TableModel method
+ */
+ public String getColumnName(int columnIndex) {
+ switch (columnIndex) {
+ case 0:
+ return "XRefNr";
+ case 1:
+ return "Object";
+ default:
+ return null;
+ }
+
+ }
+ };
+ return tm;
+ }
+
+ /**
+ * Walk down the Pagetree
+ * @param page PdfDictionary
+ * @param pdfreader PdfReader
+ * @param count_in_leaf int
+ * @param node DefaultMutableTreeNode
+ */
+ protected void iteratePages(PdfDictionary page, PdfReader pdfreader,
+ DefaultMutableTreeNode node) {
+ DefaultMutableTreeNode leaf;
+
+ PdfArray kidsPR = (PdfArray) PdfReader.getPdfObject(page.get(PdfName.KIDS));
+ if (kidsPR == null) {
+ node.add(new Pagetreenode(page, pagecount, this, pdfreader));
+ System.out.println("Page= " + (pagecount + 1));
+ pageInh.add(pagecount, page);
+ pagecount++;
+ }
+ else {
+ leaf = new PagelistTreeNode(kidsPR);
+ node.add(leaf);
+ page.put(PdfName.TYPE, PdfName.PAGES);
+ ArrayList kids = kidsPR.getArrayList();
+ for (int k = 0; k < kids.size(); ++k) {
+ PdfDictionary kid = (PdfDictionary) PdfReader.getPdfObject( (
+ PRIndirectReference) kids.get(k));
+ iteratePages(kid, pdfreader, leaf);
+ }
+ }
+ }
+
+ protected void iterateOutlines(PdfDictionary outlines, PdfReader pdfreader,
+ DefaultMutableTreeNode node) {
+ DefaultMutableTreeNode leaf;
+ PdfDictionary kid = outlines;
+ do {
+ PdfString title = (PdfString) pdfreader.getPdfObject(
+ kid.get(PdfName.TITLE));
+ leaf = new OutlinelistTreeNode(title, kid);
+ node.add(leaf);
+ PdfDictionary first = (PdfDictionary) PdfReader.getPdfObject( (
+ PRIndirectReference) kid.get(PdfName.FIRST));
+ if (first != null) {
+ iterateOutlines(first, pdfreader, leaf);
+ }
+ else {
+ PdfDictionary se = (PdfDictionary) PdfReader.getPdfObject( (
+ PRIndirectReference) kid.get(new PdfName("SE")));
+ if (se != null) {
+ iterateObjects(se, pdfreader, leaf);
+ }
+ PdfObject dest = (PdfObject) pdfreader.getPdfObject(kid.get(PdfName.
+ DEST));
+ if (dest != null) {
+ iterateObjects(dest, pdfreader, leaf);
+ }
+ PdfObject a = (PdfObject) pdfreader.getPdfObject(kid.get(PdfName.A));
+ if (a != null) {
+ iterateObjects(a, pdfreader, leaf);
+ }
+ }
+ }
+ while ( (kid = (PdfDictionary) pdfreader.getPdfObject(kid.get(PdfName.NEXT))) != null);
+ }
+
+ /**
+ * Recursive investigate PDF Objecttree (other than pagetree objects!)
+ * @param pdfobj PdfObject
+ * @param pdfreader PdfReader
+ * @param node DefaultMutableTreeNode
+ */
+ public void iterateObjects(PdfObject pdfobj, PdfReader pdfreader,
+ DefaultMutableTreeNode node) {
+ DefaultMutableTreeNode leaf;
+ if (pdfobj.isDictionary()) {
+ leaf = new DictionaryTreeNode("PdfDictionary " + pdfobj,
+ (PdfDictionary) pdfobj);
+ node.add(leaf);
+ Set s = ( (PdfDictionary) pdfobj).getKeys();
+ Iterator it = s.iterator();
+ int i = 0;
+ while (it.hasNext()) {
+ i++;
+ Object obj = it.next();
+// System.out.println("Feld:" + obj);
+
+ PdfObject value = PdfReader.getPdfObject( ( (PdfDictionary) pdfobj).get( (
+ PdfName) obj));
+// System.out.println("Value:" + value);
+ SimpletextTreeNode sttn = new SimpletextTreeNode(obj + " " + value);
+ leaf.add(sttn);
+ if (obj.equals(PdfName.PARENT)) {
+ continue;
+ }
+ if (value != null) {
+ iterateObjects(value, pdfreader, sttn);
+ }
+ }
+ }
+ else if (pdfobj.isArray()) {
+ leaf = new ArrayTreeNode("PdfArray " + pdfobj, (PdfArray) pdfobj);
+ node.add(leaf);
+ ArrayList kids = ( (PdfArray) pdfobj).getArrayList();
+ for (int k = 0; k < kids.size(); ++k) {
+ PdfObject curkid = (PdfObject) kids.get(k);
+ if (curkid.isIndirect()) {
+ PdfObject kid = PdfReader.getPdfObject( (
+ PRIndirectReference) kids.get(k));
+ if (kid != null) {
+ iterateObjects(kid, pdfreader, leaf);
+ }
+ }
+ else if (curkid.isNumber()) {
+
+ }
+ else {
+ PdfObject kid = (PdfObject) kids.get(k);
+ iterateObjects(kid, pdfreader, leaf);
+ }
+ }
+ }
+ else if (pdfobj.isIndirect()) {
+ leaf = new SimpletextTreeNode("PRIndirectReference " + pdfobj);
+ node.add(leaf);
+ PdfObject target = PdfReader.getPdfObject( (
+ PRIndirectReference) pdfobj);
+ if (target != null) {
+ iterateObjects(target, pdfreader, leaf);
+ }
+ }
+ else if (pdfobj.isBoolean()) {
+// leaf = new SimpletextTreeNode("Boolean " + pdfobj);
+// node.add(leaf);
+ }
+ else if (pdfobj.isName()) {
+// leaf = new SimpletextTreeNode("Name " + pdfobj);
+// node.add(leaf);
+ }
+ else if (pdfobj.isNull()) {
+// leaf = new SimpletextTreeNode("Null " + pdfobj);
+// node.add(leaf);
+ }
+ else if (pdfobj.isNumber()) {
+// leaf = new SimpletextTreeNode("Number " + pdfobj);
+// node.add(leaf);
+ }
+ else if (pdfobj.isString()) {
+// leaf = new SimpletextTreeNode("String " + pdfobj);
+// node.add(leaf);
+ }
+ else if (pdfobj.isStream()) {
+ leaf = new TextpaneTreeNode(pdfobj,"Stream");
+ node.add(leaf);
+ leaf = new DictionaryTreeNode("PdfDictionary " + pdfobj,
+ (PdfDictionary) pdfobj);
+ node.add(leaf);
+ Set s = ( (PdfDictionary) pdfobj).getKeys();
+ Iterator it = s.iterator();
+ int i = 0;
+ while (it.hasNext()) {
+ i++;
+ Object obj = it.next();
+// System.out.println("Feld:" + obj);
+
+ PdfObject value = PdfReader.getPdfObject( ( (PdfDictionary) pdfobj).get( (
+ PdfName) obj));
+// System.out.println("Value:" + value);
+ SimpletextTreeNode sttn = new SimpletextTreeNode(obj + " " + value);
+ leaf.add(sttn);
+ if (obj.equals(PdfName.PARENT)) {
+ continue;
+ }
+ if (value != null) {
+ iterateObjects(value, pdfreader, sttn);
+ }
+ }
+
+ }
+
+ else {
+ leaf = new SimpletextTreeNode("Unknown " + pdfobj);
+ node.add(leaf);
+ }
+
+ }
+
+ /**
+ * Returns the root of the tree.
+ *
+ * @return the root of the tree
+ * @todo Diese javax.swing.tree.TreeModel-Methode implementieren
+ */
+ public Object getRoot() {
+ return root;
+ }
+
+ /**
+ * Returns the child of <code>parent</code> at index <code>index</code> in the
+ * parent's child array.
+ *
+ * @param parent a node in the tree, obtained from this data source
+ * @param index int
+ * @return the child of <code>parent</code> at index <code>index</code>
+ * @todo Diese javax.swing.tree.TreeModel-Methode implementieren
+ */
+ public Object getChild(Object parent, int index) {
+ DefaultMutableTreeNode node = (DefaultMutableTreeNode) parent;
+ return node.getChildAt(index);
+ }
+
+ /**
+ * Returns the number of children of <code>parent</code>.
+ *
+ * @param parent a node in the tree, obtained from this data source
+ * @return the number of children of the node <code>parent</code>
+ * @todo Diese javax.swing.tree.TreeModel-Methode implementieren
+ */
+ public int getChildCount(Object parent) {
+ DefaultMutableTreeNode node = (DefaultMutableTreeNode) parent;
+ return node.getChildCount();
+ }
+
+ /**
+ * Returns <code>true</code> if <code>node</code> is a leaf.
+ *
+ * @param node a node in the tree, obtained from this data source
+ * @return true if <code>node</code> is a leaf
+ * @todo Diese javax.swing.tree.TreeModel-Methode implementieren
+ */
+ public boolean isLeaf(Object node) {
+ DefaultMutableTreeNode leaf = (DefaultMutableTreeNode) node;
+ return leaf.isLeaf();
+ }
+
+ /**
+ * Messaged when the user has altered the value for the item identified by
+ * <code>path</code> to <code>newValue</code>.
+ *
+ * @param path path to the node that the user has altered
+ * @param newValue the new value from the TreeCellEditor
+ * @todo Diese javax.swing.tree.TreeModel-Methode implementieren
+ */
+ public void valueForPathChanged(TreePath path, Object newValue) {
+ throw new RuntimeException("Manipulation of objecttree not yet supported!");
+ }
+
+ /**
+ * Returns the index of child in parent.
+ *
+ * @param parent a note in the tree, obtained from this data source
+ * @param child the node we are interested in
+ * @return the index of the child in the parent, or -1 if either
+ * <code>child</code> or <code>parent</code> are <code>null</code>
+ * @todo Diese javax.swing.tree.TreeModel-Methode implementieren
+ */
+ public int getIndexOfChild(Object parent, Object child) {
+ DefaultMutableTreeNode parentobj = (DefaultMutableTreeNode) parent;
+ DefaultMutableTreeNode childobj = (DefaultMutableTreeNode) child;
+ return parentobj.getIndex(childobj);
+ }
+
+ public synchronized void removeTreeModelListener(TreeModelListener l) {
+ if (treeModelListeners != null && treeModelListeners.contains(l)) {
+ Vector v = (Vector) treeModelListeners.clone();
+ v.removeElement(l);
+ treeModelListeners = v;
+ }
+ }
+
+ public synchronized void addTreeModelListener(TreeModelListener l) {
+ Vector v = treeModelListeners == null ? new Vector(2) :
+ (Vector) treeModelListeners.clone();
+ if (!v.contains(l)) {
+ v.addElement(l);
+ treeModelListeners = v;
+ }
+ }
+
+ protected void fireTreeNodesChanged(TreeModelEvent e) {
+ if (treeModelListeners != null) {
+ Vector listeners = treeModelListeners;
+ int count = listeners.size();
+ for (int i = 0; i < count; i++) {
+ ( (TreeModelListener) listeners.elementAt(i)).treeNodesChanged(e);
+ }
+ }
+ }
+
+ protected void fireTreeNodesInserted(TreeModelEvent e) {
+ if (treeModelListeners != null) {
+ Vector listeners = treeModelListeners;
+ int count = listeners.size();
+ for (int i = 0; i < count; i++) {
+ ( (TreeModelListener) listeners.elementAt(i)).treeNodesInserted(e);
+ }
+ }
+ }
+
+ protected void fireTreeNodesRemoved(TreeModelEvent e) {
+ if (treeModelListeners != null) {
+ Vector listeners = treeModelListeners;
+ int count = listeners.size();
+ for (int i = 0; i < count; i++) {
+ ( (TreeModelListener) listeners.elementAt(i)).treeNodesRemoved(e);
+ }
+ }
+ }
+
+ protected void fireTreeStructureChanged(TreeModelEvent e) {
+ if (treeModelListeners != null) {
+ Vector listeners = treeModelListeners;
+ int count = listeners.size();
+ for (int i = 0; i < count; i++) {
+ ( (TreeModelListener) listeners.elementAt(i)).treeStructureChanged(e);
+ }
+ }
+ }
+
+ /**
+ * When an object implementing interface <code>Runnable</code> is used to
+ * create a thread, starting the thread causes the object's <code>run</code>
+ * method to be called in that separately executing thread.
+ *
+ * @todo Diese java.lang.Runnable-Methode implementieren
+ */
+ public void run() {
+ try {
+ PdfDictionary catalog = reader.getCatalog();
+ PdfDictionary rootPages = (PdfDictionary) PdfReader.getPdfObject(
+ catalog.get(PdfName.PAGES));
+ DefaultMutableTreeNode rootPagesGUI = new SimpletextTreeNode("Pagetree " +
+ rootPages);
+ filenode.add(rootPagesGUI);
+ iteratePages(rootPages, reader, rootPagesGUI);
+
+ PdfDictionary rootOutlines = (PdfDictionary) PdfReader.getPdfObject(
+ catalog.get(PdfName.OUTLINES));
+ if (rootOutlines != null) {
+ DefaultMutableTreeNode outlinetree = new SimpletextTreeNode(
+ "Outlinetree " + rootOutlines);
+ filenode.add(outlinetree);
+ PdfObject firstindref = rootOutlines.get(PdfName.FIRST);
+ if (firstindref != null) {
+ PdfDictionary first = (PdfDictionary) PdfReader.getPdfObject( (
+ PRIndirectReference) firstindref);
+ if (first != null) {
+ iterateOutlines(first, reader, outlinetree);
+ }
+ }
+ }
+ System.out.println(" Pagecount= " + pagecount);
+ progressdialog.setVisible(false);
+ }
+ catch (Exception e) {
+ e.printStackTrace(System.out);
+ }
+ }
+
+ public int getPagecount() {
+ return pagecount;
+ }
+
+ public void updatecount() {
+ progressdialog.setAktuelleseite(getPagecount());
+ }
+}
diff --git a/src/main/java/com/lowagie/tools/plugins/treeview/ArrayTreeNode.java b/src/main/java/com/lowagie/tools/plugins/treeview/ArrayTreeNode.java
new file mode 100644
index 0000000..07ec49c
--- /dev/null
+++ b/src/main/java/com/lowagie/tools/plugins/treeview/ArrayTreeNode.java
@@ -0,0 +1,107 @@
+/*
+ * $Id: ArrayTreeNode.java,v 1.2 2006/05/30 09:13:36 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2005 by Anonymous.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+package com.lowagie.tools.plugins.treeview;
+
+import com.lowagie.text.pdf.PdfArray;
+import java.util.ArrayList;
+import javax.swing.Icon;
+import javax.swing.ImageIcon;
+
+/**
+ * <p>Title: </p>
+ *
+ * <p>Description: </p>
+ *
+ * <p>Copyright: Copyright (c) 2005</p>
+ *
+ * <p>Company: </p>
+ *
+ * @author not attributable
+ * @version 1.0
+ */
+public class ArrayTreeNode
+ extends UpdateableTreeNode {
+ PdfArray arr;
+
+ public ArrayTreeNode(Object userObject,PdfArray arr) {
+ super(userObject);
+ this.arr=arr;
+ }
+
+ public ArrayTreeNode(Object userObject, boolean allowchildren) {
+ super(userObject, allowchildren);
+ }
+
+ /**
+ * updateview
+ *
+ * @param updateobject IUpdatenodeview
+ * @todo Implement this com.lowagie.tools.plugins.treeview.UpdateableTreeNode method
+ */
+ public void updateview(IUpdatenodeview updateobject) {
+ StringBuffer sb = new StringBuffer();
+ sb.append("<html>");
+ sb.append("<p>");
+ sb.append(this.userObject);
+ sb.append("</p>");
+ ArrayList arl = arr.getArrayList();
+ for (int i = 0; i < arl.size(); i++) {
+ sb.append("<p>");
+ sb.append(" " + arl.get(i).toString());
+ sb.append("</p>");
+ }
+ sb.append("</html>");
+ updateobject.showvalues(sb.toString());
+ }
+ public Icon getIcon(){
+ return new ImageIcon(TreeViewInternalFrame.class.getResource(
+ "array.gif"));
+ }
+}
diff --git a/src/main/java/com/lowagie/tools/plugins/treeview/DictionaryTreeNode.java b/src/main/java/com/lowagie/tools/plugins/treeview/DictionaryTreeNode.java
new file mode 100644
index 0000000..2fc6b4e
--- /dev/null
+++ b/src/main/java/com/lowagie/tools/plugins/treeview/DictionaryTreeNode.java
@@ -0,0 +1,112 @@
+/*
+ * $Id: DictionaryTreeNode.java,v 1.2 2006/05/30 09:13:36 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2005 by Anonymous.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.tools.plugins.treeview;
+
+import java.util.Set;
+import java.util.Iterator;
+import com.lowagie.text.pdf.PdfDictionary;
+import javax.swing.Icon;
+import javax.swing.ImageIcon;
+
+/**
+ * <p>Title: </p>
+ *
+ * <p>Description: </p>
+ *
+ * <p>Copyright: Copyright (c) 2005</p>
+ *
+ * <p>Company: </p>
+ *
+ * @author not attributable
+ * @version 1.0
+ */
+public class DictionaryTreeNode
+ extends UpdateableTreeNode {
+ PdfDictionary dictionary;
+
+ public DictionaryTreeNode(Object userObject, PdfDictionary dictionary) {
+ super(userObject);
+ this.dictionary = dictionary;
+ }
+
+ public DictionaryTreeNode(Object userObject, boolean allowchildren) {
+ super(userObject, allowchildren);
+ }
+
+ /**
+ * updateview
+ *
+ * @param updateobject IUpdatenodeview
+ * @todo Implement this com.lowagie.tools.plugins.treeview.UpdateableTreeNode method
+ */
+ public void updateview(IUpdatenodeview updateobject) {
+ StringBuffer sb = new StringBuffer();
+ sb.append("<html>");
+ sb.append("<p>");
+ sb.append(this.userObject);
+ sb.append("</p>");
+ Set set = dictionary.getKeys();
+ Iterator it = set.iterator();
+ while (it.hasNext()) {
+ sb.append("<p>");
+ sb.append("Key " + it.next().toString());
+ sb.append("</p>");
+ }
+ sb.append("</html>");
+ updateobject.showvalues(sb.toString());
+ }
+
+ public Icon getIcon(){
+ return new ImageIcon(TreeViewInternalFrame.class.getResource(
+ "dictionary.gif"));
+ }
+
+}
diff --git a/src/main/java/com/lowagie/tools/plugins/treeview/FileTreeNode.java b/src/main/java/com/lowagie/tools/plugins/treeview/FileTreeNode.java
new file mode 100644
index 0000000..85e83a6
--- /dev/null
+++ b/src/main/java/com/lowagie/tools/plugins/treeview/FileTreeNode.java
@@ -0,0 +1,86 @@
+/*
+ * $Id: FileTreeNode.java,v 1.3 2006/05/30 09:13:36 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2005 by Anonymous.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.tools.plugins.treeview;
+
+import com.lowagie.text.pdf.*;
+import javax.swing.Icon;
+import javax.swing.ImageIcon;
+
+public class FileTreeNode
+ extends UpdateableTreeNode {
+
+ PdfReader reader;
+ public FileTreeNode(Object p0, PdfReader reader) {
+ super(p0,true);
+ this.reader = reader;
+ }
+
+ public void updateview(IUpdatenodeview updateobject) {
+ StringBuffer sb = new StringBuffer();
+ sb.append("<html>");
+ sb.append("<p>");
+ sb.append(this.userObject);
+ sb.append("</p>");
+ sb.append("<p>");
+ sb.append("PDF Version 1." + this.reader.getPdfVersion());
+ sb.append("</p>");
+ sb.append("<p>");
+ sb.append("Number of Pages: " + this.reader.getNumberOfPages());
+ sb.append("</p>");
+ sb.append("</html>");
+ updateobject.showvalues(sb.toString());
+ }
+ public Icon getIcon(){
+ return new ImageIcon(TreeViewInternalFrame.class.getResource(
+ "icon16.gif"));
+ }
+
+}
diff --git a/src/main/java/com/lowagie/tools/plugins/treeview/ICommonAnalyzer.java b/src/main/java/com/lowagie/tools/plugins/treeview/ICommonAnalyzer.java
new file mode 100644
index 0000000..17093f0
--- /dev/null
+++ b/src/main/java/com/lowagie/tools/plugins/treeview/ICommonAnalyzer.java
@@ -0,0 +1,79 @@
+/*
+ * $Id: ICommonAnalyzer.java,v 1.2 2005/12/06 13:20:39 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2005 by Anonymous.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.tools.plugins.treeview;
+
+import javax.swing.tree.DefaultMutableTreeNode;
+
+import com.lowagie.text.pdf.PdfObject;
+import com.lowagie.text.pdf.PdfReader;
+/**
+ *
+ * <p>Title: </p>
+ *
+ * <p>Description: </p>
+ *
+ * <p>Copyright: Copyright (c) 2005</p>
+ *
+ * <p>Company: </p>
+ *
+ * @author not attributable
+ * @version 1.0
+ */
+public interface ICommonAnalyzer {
+ /**
+ *
+ * @param pdfobj PdfObject
+ * @param pdfreader PdfReader
+ * @param node DefaultMutableTreeNode
+ */
+ void iterateObjects(PdfObject pdfobj, PdfReader pdfreader,
+ DefaultMutableTreeNode node);
+}
diff --git a/src/main/java/com/lowagie/tools/plugins/treeview/IUpdatenodeview.java b/src/main/java/com/lowagie/tools/plugins/treeview/IUpdatenodeview.java
new file mode 100644
index 0000000..01a3b45
--- /dev/null
+++ b/src/main/java/com/lowagie/tools/plugins/treeview/IUpdatenodeview.java
@@ -0,0 +1,59 @@
+/*
+ * $Id: IUpdatenodeview.java,v 1.1 2005/11/29 21:05:02 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2005 by Anonymous.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.tools.plugins.treeview;
+
+public interface IUpdatenodeview {
+ public void showempty();
+
+ public void showtext(String text);
+
+ public void showvalues(String text);
+}
diff --git a/src/main/java/com/lowagie/tools/plugins/treeview/OutlinelistTreeNode.java b/src/main/java/com/lowagie/tools/plugins/treeview/OutlinelistTreeNode.java
new file mode 100644
index 0000000..2fd78e5
--- /dev/null
+++ b/src/main/java/com/lowagie/tools/plugins/treeview/OutlinelistTreeNode.java
@@ -0,0 +1,98 @@
+/*
+ * $Id: OutlinelistTreeNode.java,v 1.2 2006/05/30 09:13:36 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2005 by Anonymous.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.tools.plugins.treeview;
+
+import java.util.ArrayList;
+
+import com.lowagie.text.pdf.PdfArray;
+import com.lowagie.text.pdf.PdfDictionary;
+import java.util.Set;
+import java.util.Iterator;
+import javax.swing.Icon;
+import javax.swing.ImageIcon;
+
+public class OutlinelistTreeNode
+ extends UpdateableTreeNode {
+ private com.lowagie.text.pdf.PdfDictionary dictionary;
+ public OutlinelistTreeNode(Object userObject, PdfDictionary dictionary) {
+ super(userObject);
+ this.dictionary = dictionary;
+ }
+
+ public OutlinelistTreeNode(PdfDictionary dictionary) {
+ super("Outlinenode " + dictionary);
+ this.dictionary = dictionary;
+ }
+
+ public void updateview(IUpdatenodeview updateobject) {
+ StringBuffer sb = new StringBuffer();
+ sb.append("<html>");
+ sb.append("<p>");
+ sb.append(this.userObject);
+ sb.append("</p>");
+ Set set = dictionary.getKeys();
+ Iterator it = set.iterator();
+ while (it.hasNext()) {
+ sb.append("<p>");
+ sb.append("Key " + it.next().toString());
+ sb.append("</p>");
+ }
+ sb.append("</html>");
+ updateobject.showvalues(sb.toString());
+
+ }
+
+ public Icon getIcon(){
+ return new ImageIcon(TreeViewInternalFrame.class.getResource(
+ "bookmarks.gif"));
+ }
+
+}
diff --git a/src/main/java/com/lowagie/tools/plugins/treeview/PagelistTreeNode.java b/src/main/java/com/lowagie/tools/plugins/treeview/PagelistTreeNode.java
new file mode 100644
index 0000000..928fefa
--- /dev/null
+++ b/src/main/java/com/lowagie/tools/plugins/treeview/PagelistTreeNode.java
@@ -0,0 +1,87 @@
+/*
+ * $Id: PagelistTreeNode.java,v 1.2 2006/05/30 09:13:36 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2005 by Anonymous.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.tools.plugins.treeview;
+
+import java.util.ArrayList;
+
+import com.lowagie.text.pdf.PdfArray;
+import javax.swing.Icon;
+import javax.swing.ImageIcon;
+
+public class PagelistTreeNode
+ extends UpdateableTreeNode {
+ private com.lowagie.text.pdf.PdfArray pdfarray;
+ public PagelistTreeNode(PdfArray pdfarray) {
+ super("Pagesnode " + pdfarray);
+ this.pdfarray = pdfarray;
+ }
+
+ public void updateview(IUpdatenodeview updateobject) {
+ StringBuffer sb = new StringBuffer();
+ sb.append("<html>");
+ sb.append("<p>");
+ sb.append(this.userObject);
+ sb.append("</p>");
+ ArrayList arl = pdfarray.getArrayList();
+ for (int i = 0; i < arl.size(); i++) {
+ sb.append("<p>");
+ sb.append(" " + arl.get(i).toString());
+ sb.append("</p>");
+ }
+ sb.append("</html>");
+ updateobject.showvalues(sb.toString());
+ }
+
+ public Icon getIcon(){
+ return new ImageIcon(TreeViewInternalFrame.class.getResource(
+ "pageonly.gif"));
+ }
+}
diff --git a/src/main/java/com/lowagie/tools/plugins/treeview/Pagetreenode.java b/src/main/java/com/lowagie/tools/plugins/treeview/Pagetreenode.java
new file mode 100644
index 0000000..4cbcfda
--- /dev/null
+++ b/src/main/java/com/lowagie/tools/plugins/treeview/Pagetreenode.java
@@ -0,0 +1,208 @@
+/*
+ * $Id: Pagetreenode.java,v 1.3 2006/05/30 09:13:36 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2005 by Anonymous.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.tools.plugins.treeview;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.Set;
+
+import javax.swing.tree.DefaultMutableTreeNode;
+
+import com.lowagie.text.Rectangle;
+import com.lowagie.text.pdf.*;
+import javax.swing.Icon;
+import javax.swing.ImageIcon;
+
+public class Pagetreenode
+ extends UpdateableTreeNode {
+ private com.lowagie.text.pdf.PdfDictionary dictionary;
+
+ private int seitennummer;
+ private float width;
+ private float height;
+
+ public Pagetreenode(com.lowagie.text.pdf.PdfDictionary page, int seitennummer,
+ ICommonAnalyzer pageanalyzer, PdfReader pdfreader) {
+ super();
+ this.dictionary = page;
+ this.seitennummer = seitennummer;
+ DefaultMutableTreeNode info;
+
+ PdfArray arr = (PdfArray) page.get(PdfName.MEDIABOX);
+ float curwidth = 0;
+ float curheight = 0;
+ if (arr != null) {
+ ArrayList arl = arr.getArrayList();
+ curwidth = Float.parseFloat(arl.get(2).toString());
+ curheight = Float.parseFloat(arl.get(3).toString());
+ info = new SimpletextTreeNode(PdfName.MEDIABOX + " " + curwidth + "*" +
+ curheight);
+ this.add(info);
+
+ }
+ PdfArray arrcrop = (PdfArray) page.get(PdfName.CROPBOX);
+ float curwidthcrop = 0;
+ float curheightcrop = 0;
+ if (arrcrop != null) {
+ ArrayList arl = arrcrop.getArrayList();
+ curwidthcrop = Float.parseFloat(arl.get(2).toString());
+ curheightcrop = Float.parseFloat(arl.get(3).toString());
+ info = new SimpletextTreeNode(PdfName.CROPBOX + " " + curwidthcrop + "*" +
+ curheightcrop);
+ this.add(info);
+
+ }
+
+ PdfNumber rotation = (PdfNumber) PdfReader.getPdfObject(page.get(PdfName.
+ ROTATE));
+
+ if (rotation == null) {
+ System.out.println("Rotation missing");
+ rotation = new PdfNumber(0);
+ }
+ else {
+ info = new SimpletextTreeNode(PdfName.
+ ROTATE + " " + rotation);
+ this.add(info);
+ }
+ Rectangle rect = new Rectangle(curwidthcrop,
+ curheightcrop);
+
+ if ( (rotation.floatValue() == 90) || (rotation.floatValue() == 270)) {
+ rect = rect.rotate();
+ }
+
+ width = rect.width();
+ height = rect.height();
+
+ // ??? Dont want a backreference! PdfDictionary parent = (PdfDictionary) PdfReader.getPdfObject(page.get(PdfName.PARENT));
+ PdfArray dict = (PdfArray) PdfReader.getPdfObject(page.get(PdfName.ANNOTS));
+ if (dict != null) {
+ this.add(new SimpletextTreeNode(PdfName.ANNOTS + " " + dict.length()));
+ SimpletextTreeNode sttn = new SimpletextTreeNode(PdfName.ANNOTS + " " +
+ dict.type());
+ this.add(sttn);
+ pageanalyzer.iterateObjects(dict, pdfreader, sttn);
+
+ }
+ PdfObject reso = PdfReader.getPdfObject(page.get(PdfName.RESOURCES));
+ if (reso != null) {
+ SimpletextTreeNode sttn = new SimpletextTreeNode(PdfName.RESOURCES + " " +
+ reso.type());
+ this.add(sttn);
+ pageanalyzer.iterateObjects(reso, pdfreader, sttn);
+ }
+
+ PdfObject contents = PdfReader.getPdfObject(page.get(PdfName.CONTENTS));
+ if (contents != null) {
+ this.add(new TextpaneTreeNode(contents,"Content"));
+
+ if (contents.isStream()) {
+ PRStream prstr = (PRStream) contents;
+
+ Set s = prstr.getKeys();
+ Iterator it = s.iterator();
+
+ while (it.hasNext()) {
+ Object obj = it.next();
+ System.out.println("Field:" + obj);
+
+ Object value = PdfReader.getPdfObject(prstr.get( (PdfName) obj));
+ System.out.println("Value:" + value);
+ }
+ }
+ }
+ }
+
+ public int getSeitennummer() {
+ return seitennummer;
+ }
+
+ public String toString() {
+ return "Page " + seitennummer;
+ }
+
+ public float getWidth() {
+ return width;
+ }
+
+ public float getHeight() {
+ return height;
+ }
+
+ public void updateview(IUpdatenodeview updateobject) {
+ StringBuffer sb = new StringBuffer();
+ sb.append("<html>");
+ sb.append("<p>");
+ sb.append("Page " + getSeitennummer());
+ sb.append("</p>");
+ sb.append("<p>");
+ sb.append("Size: " + getWidth() + "*" + getHeight());
+ sb.append("</p>");
+
+ Set set = dictionary.getKeys();
+ Iterator it = set.iterator();
+ while (it.hasNext()) {
+ sb.append("<p>");
+ sb.append("Key " + it.next().toString());
+ sb.append("</p>");
+ }
+ sb.append("</html>");
+ updateobject.showvalues(sb.toString());
+ }
+
+ public Icon getIcon(){
+ return new ImageIcon(TreeViewInternalFrame.class.getResource(
+ "pageonly.gif"));
+ }
+
+
+}
diff --git a/src/main/java/com/lowagie/tools/plugins/treeview/ProgressDialog.java b/src/main/java/com/lowagie/tools/plugins/treeview/ProgressDialog.java
new file mode 100644
index 0000000..42e46db
--- /dev/null
+++ b/src/main/java/com/lowagie/tools/plugins/treeview/ProgressDialog.java
@@ -0,0 +1,124 @@
+/*
+ * $Id: ProgressDialog.java,v 1.1 2005/11/29 21:05:02 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2005 by Anonymous.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.tools.plugins.treeview;
+
+import java.awt.BorderLayout;
+import java.awt.Dimension;
+import java.awt.Frame;
+import java.awt.Toolkit;
+import javax.swing.JDialog;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.JProgressBar;
+
+
+public class ProgressDialog extends JDialog {
+ JPanel panel1 = new JPanel();
+ BorderLayout borderLayout1 = new BorderLayout();
+ JPanel jPanel1 = new JPanel();
+ BorderLayout borderLayout2 = new BorderLayout();
+ BorderLayout borderLayout3 = new BorderLayout();
+ JLabel jLabel1 = new JLabel();
+ JProgressBar jProgressBar1 = new JProgressBar();
+ private int anzahlseiten;
+ private int aktuelleseite;
+
+ public ProgressDialog(Frame frame, String title, boolean modal) {
+ super(frame, title, modal);
+ try {
+ jbInit();
+ pack();
+ }
+ catch(Exception ex) {
+ ex.printStackTrace();
+ }
+ }
+
+ public ProgressDialog() {
+ this(null, "", false);
+ }
+
+ private void jbInit() throws Exception {
+ panel1.setLayout(borderLayout1);
+ this.getContentPane().setLayout(borderLayout2);
+ jPanel1.setLayout(borderLayout3);
+ jLabel1.setText("Analysefortschritt");
+ jProgressBar1.setStringPainted(true);
+ getContentPane().add(panel1, BorderLayout.CENTER);
+ panel1.add(jPanel1, BorderLayout.CENTER);
+ jPanel1.add(jProgressBar1, BorderLayout.CENTER);
+ this.getContentPane().add(jLabel1, BorderLayout.NORTH);
+ //Das Fenster zentrieren
+ Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
+ Dimension frameSize = getSize();
+ if (frameSize.height > screenSize.height) {
+ frameSize.height = screenSize.height;
+ }
+ if (frameSize.width > screenSize.width) {
+ frameSize.width = screenSize.width;
+ }
+ setLocation((screenSize.width - frameSize.width) / 2, (screenSize.height - frameSize.height) / 2);
+ }
+ public int getAnzahlseiten() {
+ return anzahlseiten;
+ }
+ public void setAnzahlseiten(int anzahlseiten) {
+ this.anzahlseiten = anzahlseiten;
+ jProgressBar1.setMaximum(anzahlseiten);
+ }
+ public int getAktuelleseite() {
+ return aktuelleseite;
+ }
+ public void setAktuelleseite(int aktuelleseite) {
+ this.aktuelleseite = aktuelleseite;
+ jProgressBar1.setValue(aktuelleseite);
+ }
+}
diff --git a/src/main/java/com/lowagie/tools/plugins/treeview/SimpletextTreeNode.java b/src/main/java/com/lowagie/tools/plugins/treeview/SimpletextTreeNode.java
new file mode 100644
index 0000000..2eedb6e
--- /dev/null
+++ b/src/main/java/com/lowagie/tools/plugins/treeview/SimpletextTreeNode.java
@@ -0,0 +1,69 @@
+/*
+ * $Id: SimpletextTreeNode.java,v 1.1 2005/11/29 21:05:02 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2005 by Anonymous.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.tools.plugins.treeview;
+
+public class SimpletextTreeNode
+ extends UpdateableTreeNode {
+
+ public SimpletextTreeNode(Object p0) {
+ super(p0);
+ }
+
+ public void updateview(IUpdatenodeview updateobject) {
+ StringBuffer sb = new StringBuffer();
+ sb.append("<html>");
+ sb.append("<p>");
+ sb.append(this.userObject);
+ sb.append("</p>");
+ sb.append("</html>");
+ updateobject.showvalues(sb.toString());
+ }
+}
diff --git a/src/main/java/com/lowagie/tools/plugins/treeview/TextpaneTreeNode.java b/src/main/java/com/lowagie/tools/plugins/treeview/TextpaneTreeNode.java
new file mode 100644
index 0000000..bf37c7a
--- /dev/null
+++ b/src/main/java/com/lowagie/tools/plugins/treeview/TextpaneTreeNode.java
@@ -0,0 +1,91 @@
+/*
+ * $Id: TextpaneTreeNode.java,v 1.2 2006/05/30 09:13:36 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2005 by Anonymous.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.tools.plugins.treeview;
+
+import java.io.IOException;
+
+import com.lowagie.text.pdf.*;
+import javax.swing.Icon;
+import javax.swing.ImageIcon;
+
+public class TextpaneTreeNode
+ extends UpdateableTreeNode {
+ PdfObject contents;
+ String marker;
+
+ public TextpaneTreeNode(PdfObject contents,String marker) {
+ super(contents,false);
+ this.contents = contents;
+ this.marker=marker;
+ }
+
+ public void updateview(IUpdatenodeview updateobject) {
+ if (contents.isStream()) {
+ PRStream prstr = (PRStream) contents;
+ try {
+ byte barr[] = PdfReader.getStreamBytes(prstr);
+ updateobject.showtext(new String(barr));
+ }
+ catch (IOException ex) {
+ }
+ }
+ }
+
+ public String toString() {
+ return marker;
+ }
+
+ public Icon getIcon(){
+ return new ImageIcon(TreeViewInternalFrame.class.getResource(
+ "string.gif"));
+ }
+
+}
diff --git a/src/main/java/com/lowagie/tools/plugins/treeview/TreeViewInternalFrame.java b/src/main/java/com/lowagie/tools/plugins/treeview/TreeViewInternalFrame.java
new file mode 100644
index 0000000..802059b
--- /dev/null
+++ b/src/main/java/com/lowagie/tools/plugins/treeview/TreeViewInternalFrame.java
@@ -0,0 +1,272 @@
+/*
+ * $Id: TreeViewInternalFrame.java,v 1.4 2006/05/29 10:31:32 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2005 by Anonymous.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.tools.plugins.treeview;
+
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+
+import java.awt.BorderLayout;
+import java.awt.CardLayout;
+import java.awt.Dimension;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import javax.swing.*;
+import javax.swing.event.TreeSelectionEvent;
+import javax.swing.event.TreeSelectionListener;
+import javax.swing.tree.TreeModel;
+import javax.swing.tree.DefaultTreeModel;
+import javax.swing.tree.DefaultMutableTreeNode;
+import com.lowagie.tools.SwingWorker;
+import java.awt.Cursor;
+import javax.swing.tree.DefaultTreeCellRenderer;
+import java.awt.Component;
+import javax.swing.table.TableColumnModel;
+
+public class TreeViewInternalFrame
+ extends JInternalFrame implements PropertyChangeListener, IUpdatenodeview {
+ AnalyzePDF analyzer;
+
+ public TreeViewInternalFrame(String title, boolean resizable,
+ boolean closable,
+ boolean maximizable) {
+ super(title, resizable, closable, maximizable);
+ try {
+ jbInit();
+ }
+ catch (Exception ex) {
+ ex.printStackTrace();
+ }
+ }
+
+ private void jbInit() throws Exception {
+ this.getContentPane().setLayout(borderLayout1);
+ jPanel1.setLayout(borderLayout2);
+ jPanel2.setLayout(cardLayout2);
+ jSplitPane1.setMinimumSize(new Dimension(150, 100));
+ jSplitPane1.setOrientation(JSplitPane.VERTICAL_SPLIT);
+ jTree1.addTreeSelectionListener(new Untitled1_jTree1_treeSelectionAdapter(this));
+ jPanel4.setLayout(borderLayout3);
+ jPanel5.setLayout(borderLayout5);
+ jTree1.setModel(defaultree);
+ jPanel3.setLayout(borderLayout6);
+ jPanel6.setLayout(borderLayout7);
+ jSplitPane2.setDividerSize(3);
+ jPanel1.add(jSplitPane1, java.awt.BorderLayout.CENTER);
+ this.getContentPane().add(jSplitPane1, java.awt.BorderLayout.CENTER);
+ jPanel2.add(jPanel4, "empty");
+ jPanel2.add(jPanel5, "values");
+ jScrollPane3.setViewportView(jLabel1);
+ jScrollPane2.setViewportView(jTextPane1);
+ jPanel2.add(jScrollPane2, "text");
+ jSplitPane1.add(jPanel3, JSplitPane.TOP);
+ jPanel5.add(jScrollPane3, java.awt.BorderLayout.CENTER);
+ jSplitPane1.add(jPanel2, JSplitPane.BOTTOM);
+ jSplitPane2.add(jScrollPane1, JSplitPane.TOP);
+ jSplitPane2.add(jPanel6, JSplitPane.BOTTOM);
+ jScrollPane4.setViewportView(jTable1);
+ jPanel3.add(jSplitPane2, java.awt.BorderLayout.CENTER);
+ jPanel6.add(jScrollPane4, java.awt.BorderLayout.CENTER);
+ jScrollPane1.setViewportView(jTree1);
+ jSplitPane1.setDividerLocation(170);
+ jSplitPane2.setDividerLocation(200);
+ PDFTreeCellRenderer renderer=new PDFTreeCellRenderer();
+ jTree1.setCellRenderer(renderer);
+ }
+
+ public void setTreemodel(TreeModel treemodel) {
+ jTree1.setModel(treemodel);
+ }
+
+ JPanel jPanel1 = new JPanel();
+ BorderLayout borderLayout1 = new BorderLayout();
+ JSplitPane jSplitPane1 = new JSplitPane();
+ JScrollPane jScrollPane1 = new JScrollPane();
+ JTree jTree1 = new JTree();
+ JPanel jPanel2 = new JPanel();
+ BorderLayout borderLayout2 = new BorderLayout();
+ BorderLayout borderLayout4 = new BorderLayout();
+ CardLayout cardLayout2 = new CardLayout();
+ JPanel jPanel4 = new JPanel();
+ JTextPane jTextPane1 = new JTextPane();
+ JPanel jPanel5 = new JPanel();
+ BorderLayout borderLayout3 = new BorderLayout();
+ BorderLayout borderLayout5 = new BorderLayout();
+ JLabel jLabel1 = new JLabel();
+ JScrollPane jScrollPane2 = new JScrollPane();
+ JScrollPane jScrollPane3 = new JScrollPane();
+ DefaultTreeModel defaultree = new DefaultTreeModel(new DefaultMutableTreeNode());
+ JPanel jPanel3 = new JPanel();
+ BorderLayout borderLayout6 = new BorderLayout();
+ JPanel jPanel6 = new JPanel();
+ JTable jTable1 = new JTable();
+ BorderLayout borderLayout7 = new BorderLayout();
+ JSplitPane jSplitPane2 = new JSplitPane();
+ JScrollPane jScrollPane4 = new JScrollPane();
+ TableColumnModel tableColumnModel1 = jTable1.getColumnModel();
+ /**
+ * This method gets called when a bound property is changed.
+ *
+ * @param evt A PropertyChangeEvent object describing the event source and the property that has
+ * changed.
+ * @todo Implement this java.beans.PropertyChangeListener method
+ */
+ public void propertyChange(PropertyChangeEvent evt) {
+
+ String propertyname = evt.getPropertyName();
+
+ if (propertyname == null) {
+ return;
+ }
+ else if (propertyname.equals("srcfile")) {
+ final String filename = (String) evt.getNewValue();
+ final ProgressDialog blubb;
+ blubb = new ProgressDialog(null, "PDF Analysefortschritt", false);
+
+ final JInternalFrame jif = this;
+ SwingWorker work = new SwingWorker() {
+
+ public Object construct() {
+ AnalyzePDF analyzer = new AnalyzePDF(filename, blubb);
+ jif.setCursor(Cursor.getDefaultCursor());
+ return analyzer;
+ }
+ };
+ jif.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
+ work.start();
+ blubb.show();
+ analyzer = (AnalyzePDF) work.get();
+
+ Timer activitymonitor = new Timer(250, new ActionListener() {
+ public void actionPerformed(ActionEvent event) {
+ analyzer.updatecount();
+ }
+ });
+
+ analyzer.start();
+ activitymonitor.start();
+ setTreemodel(analyzer);
+ this.jTable1.setModel(analyzer.getXReftable());
+ }
+ }
+
+ public void jTree1_valueChanged(TreeSelectionEvent e) {
+ String event = e.getClass().toString();
+ if (event.equalsIgnoreCase("class javax.swing.event.TreeSelectionEvent")) {
+ UpdateableTreeNode selectednode = (UpdateableTreeNode) jTree1.
+ getLastSelectedPathComponent();
+ System.out.println("Selected node: " + selectednode);
+ if (selectednode != null) {
+ selectednode.updateview(this);
+ }
+ }
+ }
+
+ /**
+ * This method fills the bottom window with the given text in a JtextPane
+ * IUpdatenodeview method
+ * @param text String Plain text
+ */
+ public void showtext(String text) {
+ jTextPane1.setText(text);
+ cardLayout2.show(jPanel2, "text");
+ jPanel2.repaint();
+ jTextPane1.repaint();
+ }
+
+ /**
+ * This method clears the bottom window
+ * IUpdatenodeview method
+ */
+ public void showempty() {
+ cardLayout2.show(jPanel2, "empty");
+ jPanel2.repaint();
+ }
+
+ /**
+ * This method fills the bottom window with the given text in a JLabel
+ * IUpdatenodeview method
+ * @param text String HTML formatted text
+ */
+ public void showvalues(String text) {
+ jLabel1.setText(text);
+ cardLayout2.show(jPanel2, "values");
+ }
+
+ class PDFTreeCellRenderer extends DefaultTreeCellRenderer{
+ public Component getTreeCellRendererComponent(JTree tree,Object value,boolean selected,boolean expanded,boolean leaf,int row,boolean hasFocus){
+ super.getTreeCellRendererComponent(tree,value,selected,expanded,leaf,row,hasFocus);
+ DefaultMutableTreeNode node=(DefaultMutableTreeNode)value;
+ if(node instanceof UpdateableTreeNode){
+ UpdateableTreeNode utn=(UpdateableTreeNode)node;
+ Object o = node.getUserObject();
+ setFont(getFont().deriveFont(12.1f));
+// setIcon(new ImageIcon(TreeViewInternalFrame.class.getResource(
+// "icon16.gif")));
+ setIcon(utn.getIcon());
+ }
+ return this;
+ }
+ }
+}
+
+class Untitled1_jTree1_treeSelectionAdapter
+ implements TreeSelectionListener {
+ private TreeViewInternalFrame adaptee;
+ Untitled1_jTree1_treeSelectionAdapter(TreeViewInternalFrame adaptee) {
+ this.adaptee = adaptee;
+ }
+
+ public void valueChanged(TreeSelectionEvent e) {
+ adaptee.jTree1_valueChanged(e);
+ }
+
+
+}
diff --git a/src/main/java/com/lowagie/tools/plugins/treeview/UpdateableTreeNode.java b/src/main/java/com/lowagie/tools/plugins/treeview/UpdateableTreeNode.java
new file mode 100644
index 0000000..bd7cf47
--- /dev/null
+++ b/src/main/java/com/lowagie/tools/plugins/treeview/UpdateableTreeNode.java
@@ -0,0 +1,74 @@
+/*
+ * $Id: UpdateableTreeNode.java,v 1.2 2006/05/29 10:31:32 blowagie Exp $
+ * $Name: $
+ *
+ * Copyright 2005 by Anonymous.
+ *
+ * The contents of this file are subject to the Mozilla Public License Version 1.1
+ * (the "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the License.
+ *
+ * The Original Code is 'iText, a free JAVA-PDF library'.
+ *
+ * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
+ * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
+ * All Rights Reserved.
+ * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
+ * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
+ *
+ * Contributor(s): all the names of the contributors are added in the source code
+ * where applicable.
+ *
+ * Alternatively, the contents of this file may be used under the terms of the
+ * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
+ * provisions of LGPL are applicable instead of those above. If you wish to
+ * allow use of your version of this file only under the terms of the LGPL
+ * License and not to allow others to use your version of this file under
+ * the MPL, indicate your decision by deleting the provisions above and
+ * replace them with the notice and other provisions required by the LGPL.
+ * If you do not delete the provisions above, a recipient may use your version
+ * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
+ *
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the MPL as stated above or under the terms of the GNU
+ * Library General Public License as published by the Free Software Foundation;
+ * either version 2 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
+ * details.
+ *
+ * If you didn't download this code from the following link, you should check if
+ * you aren't using an obsolete version:
+ * http://www.lowagie.com/iText/
+ */
+
+package com.lowagie.tools.plugins.treeview;
+
+import javax.swing.tree.DefaultMutableTreeNode;
+import javax.swing.ImageIcon;
+import javax.swing.Icon;
+
+public abstract class UpdateableTreeNode
+ extends DefaultMutableTreeNode {
+ public UpdateableTreeNode() {
+ super();
+ }
+
+ public UpdateableTreeNode(Object userObject) {
+ super(userObject);
+ }
+ public UpdateableTreeNode(Object userObject,boolean allowchildren) {
+ super(userObject,allowchildren);
+ }
+ public abstract void updateview(IUpdatenodeview updateobject);
+ public Icon getIcon(){
+ return null;
+ }
+ }
+
diff --git a/src/main/java/com/lowagie/tools/split_pdf.java b/src/main/java/com/lowagie/tools/split_pdf.java
new file mode 100644
index 0000000..d72b93e
--- /dev/null
+++ b/src/main/java/com/lowagie/tools/split_pdf.java
@@ -0,0 +1,103 @@
+/*
+ * $Id: split_pdf.java,v 1.18 2005/04/11 08:27:24 blowagie Exp $
+ * $Name: $
+ *
+ * This code is free software. It may only be copied or modified
+ * if you include the following copyright notice:
+ *
+ * This class by Bruno Lowagie. Copyright (c) 2002 Bruno Lowagie.
+ *
+ * This code is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * itext@lowagie.com
+ */
+package com.lowagie.tools;
+
+import java.io.*;
+
+import com.lowagie.text.*;
+import com.lowagie.text.pdf.*;
+
+/**
+ * This class demonstrates how to split a PDF file using iText.
+ * @author Bruno Lowagie
+ */
+public class split_pdf extends java.lang.Object {
+
+ /**
+ * This class can be used to split an existing PDF file.
+ * @param args the command line arguments
+ */
+ public static void main(String args[]) {
+ if (args.length != 4) {
+ System.err.println("arguments: srcfile destfile1 destfile2 pagenumber");
+ }
+ else {
+ try {
+ int pagenumber = Integer.parseInt(args[3]);
+
+ // we create a reader for a certain document
+ PdfReader reader = new PdfReader(args[0]);
+ // we retrieve the total number of pages
+ int n = reader.getNumberOfPages();
+ System.out.println("There are " + n + " pages in the original file.");
+
+ if (pagenumber < 2 || pagenumber > n) {
+ throw new DocumentException("You can't split this document at page " + pagenumber + "; there is no such page.");
+ }
+
+ // step 1: creation of a document-object
+ Document document1 = new Document(reader.getPageSizeWithRotation(1));
+ Document document2 = new Document(reader.getPageSizeWithRotation(pagenumber));
+ // step 2: we create a writer that listens to the document
+ PdfWriter writer1 = PdfWriter.getInstance(document1, new FileOutputStream(args[1]));
+ PdfWriter writer2 = PdfWriter.getInstance(document2, new FileOutputStream(args[2]));
+ // step 3: we open the document
+ document1.open();
+ PdfContentByte cb1 = writer1.getDirectContent();
+ document2.open();
+ PdfContentByte cb2 = writer2.getDirectContent();
+ PdfImportedPage page;
+ int rotation;
+ int i = 0;
+ // step 4: we add content
+ while (i < pagenumber - 1) {
+ i++;
+ document1.setPageSize(reader.getPageSizeWithRotation(i));
+ document1.newPage();
+ page = writer1.getImportedPage(reader, i);
+ rotation = reader.getPageRotation(i);
+ if (rotation == 90 || rotation == 270) {
+ cb1.addTemplate(page, 0, -1f, 1f, 0, 0, reader.getPageSizeWithRotation(i).height());
+ }
+ else {
+ cb1.addTemplate(page, 1f, 0, 0, 1f, 0, 0);
+ }
+ }
+ while (i < n) {
+ i++;
+ document2.setPageSize(reader.getPageSizeWithRotation(i));
+ document2.newPage();
+ page = writer2.getImportedPage(reader, i);
+ rotation = reader.getPageRotation(i);
+ if (rotation == 90 || rotation == 270) {
+ cb2.addTemplate(page, 0, -1f, 1f, 0, 0, reader.getPageSizeWithRotation(i).height());
+ }
+ else {
+ cb2.addTemplate(page, 1f, 0, 0, 1f, 0, 0);
+ }
+ System.out.println("Processed page " + i);
+ }
+ // step 5: we close the document
+ document1.close();
+ document2.close();
+ }
+ catch(Exception e) {
+ e.printStackTrace();
+ }
+ }
+ }
+}
+
diff --git a/src/main/java/org/pdfbox/Decrypt.java b/src/main/java/org/pdfbox/Decrypt.java
new file mode 100644
index 0000000..b338552
--- /dev/null
+++ b/src/main/java/org/pdfbox/Decrypt.java
@@ -0,0 +1,122 @@
+/**
+ * Copyright (c) 2003-2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox;
+
+import java.io.IOException;
+
+import org.pdfbox.pdmodel.PDDocument;
+
+/**
+ * This will read a document from the filesystem, decrypt it and and then write
+ * the results to the filesystem. <br/><br/>
+ *
+ * usage: java org.pdfbox.Decrypt &lt;password&gt; &lt;inputfile&gt; &lt;outputfile&gt;
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.3 $
+ */
+public class Decrypt
+{
+
+ /**
+ * This is the entry point for the application.
+ *
+ * @param args The command-line arguments.
+ *
+ * @throws Exception If there is an error decrypting the document.
+ */
+ public static void main( String[] args ) throws Exception
+ {
+ Decrypt decrypt = new Decrypt();
+ decrypt.decrypt( args );
+ }
+
+ private void decrypt( String[] args ) throws Exception
+ {
+ if( args.length < 2 || args.length > 3 )
+ {
+ usage();
+ }
+ else
+ {
+ String password = args[0];
+ String infile = args[1];
+ String outfile = args[1];
+ if( args.length == 3 )
+ {
+ outfile = args[2];
+ }
+
+
+ PDDocument document = null;
+
+ try
+ {
+ document = PDDocument.load( infile );
+
+ if( document.isEncrypted() )
+ {
+ if( document.isOwnerPassword( password ) )
+ {
+ document.decrypt( password );
+ document.save( outfile );
+ }
+ else
+ {
+ throw new IOException(
+ "Error: You are only allowed to decrypt a document with the owner password." );
+ }
+ }
+ else
+ {
+ System.err.println( "Error: Document is not encrypted." );
+ }
+ }
+ finally
+ {
+ if( document != null )
+ {
+ document.close();
+ }
+ }
+ }
+ }
+
+ /**
+ * This will print a usage message.
+ */
+ private static void usage()
+ {
+ System.err.println( "usage: java org.pdfbox.Decrypt " +
+ "<password> <inputfile> [outputfile]" );
+ }
+
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/Encrypt.java b/src/main/java/org/pdfbox/Encrypt.java
new file mode 100644
index 0000000..9038e61
--- /dev/null
+++ b/src/main/java/org/pdfbox/Encrypt.java
@@ -0,0 +1,234 @@
+/**
+ * Copyright (c) 2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox;
+
+import org.pdfbox.pdmodel.PDDocument;
+
+import org.pdfbox.pdmodel.encryption.PDStandardEncryption;
+import org.pdfbox.pdmodel.encryption.PDEncryptionDictionary;
+
+/**
+ * This will read a document from the filesystem, encrypt it and and then write
+ * the results to the filesystem. <br/><br/>
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.5 $
+ */
+public class Encrypt
+{
+
+ /**
+ * This is the entry point for the application.
+ *
+ * @param args The command-line arguments.
+ *
+ * @throws Exception If there is an error decrypting the document.
+ */
+ public static void main( String[] args ) throws Exception
+ {
+ Encrypt encrypt = new Encrypt();
+ encrypt.encrypt( args );
+ }
+
+ private void encrypt( String[] args ) throws Exception
+ {
+ if( args.length < 1 )
+ {
+ usage();
+ }
+ else
+ {
+ String infile = null;
+ String outfile = null;
+ String userPassword = "";
+ String ownerPassword = "";
+
+ PDDocument document = null;
+
+ try
+ {
+
+ PDStandardEncryption enc = new PDStandardEncryption();
+ enc.setVersion( PDEncryptionDictionary.VERSION1_40_BIT_ALGORITHM );
+ enc.setRevision( PDStandardEncryption.REVISION2 );
+ for( int i=0; i<args.length; i++ )
+ {
+ String key = args[i];
+ if( key.equals( "-O" ) )
+ {
+ ownerPassword = args[++i];
+ }
+ else if( key.equals( "-U" ) )
+ {
+ userPassword = args[++i];
+ }
+ else if( key.equals( "-canAssemble" ) )
+ {
+ enc.setCanAssembleDocument( args[++i].equalsIgnoreCase( "true" ) );
+ }
+ else if( key.equals( "-canExtractContent" ) )
+ {
+ enc.setCanExtractContent( args[++i].equalsIgnoreCase( "true" ) );
+ }
+ else if( key.equals( "-canExtractForAccessibility" ) )
+ {
+ enc.setCanExtractForAccessibility( args[++i].equalsIgnoreCase( "true" ) );
+ }
+ else if( key.equals( "-canFillInForm" ) )
+ {
+ enc.setCanFillInForm( args[++i].equalsIgnoreCase( "true" ) );
+ }
+ else if( key.equals( "-canModify" ) )
+ {
+ enc.setCanModify( args[++i].equalsIgnoreCase( "true" ) );
+ }
+ else if( key.equals( "-canModifyAnnotations" ) )
+ {
+ enc.setCanModifyAnnotations( args[++i].equalsIgnoreCase( "true" ) );
+ }
+ else if( key.equals( "-canPrint" ) )
+ {
+ enc.setCanPrint( args[++i].equalsIgnoreCase( "true" ) );
+ }
+ else if( key.equals( "-canPrintDegraded" ) )
+ {
+ enc.setCanPrintDegraded( args[++i].equalsIgnoreCase( "true" ) );
+ }
+ else if( key.equals( "-keyLength" ) )
+ {
+ try
+ {
+ enc.setLength( Integer.parseInt( args[++i] ) );
+ }
+ catch( NumberFormatException e )
+ {
+ throw new NumberFormatException(
+ "Error: -keyLength is not an integer '" + args[i] + "'" );
+ }
+ }
+ else if( key.equals( "-version" ) )
+ {
+ try
+ {
+ enc.setVersion( Integer.parseInt( args[++i] ) );
+ }
+ catch( NumberFormatException e )
+ {
+ throw new NumberFormatException( "Error: -version is not an integer '" + args[i] + "'" );
+ }
+ }
+ else if( key.equals( "-revision" ) )
+ {
+ try
+ {
+ enc.setRevision( Integer.parseInt( args[++i] ) );
+ }
+ catch( NumberFormatException e )
+ {
+ throw new NumberFormatException( "Error: -version is not an integer '" + args[i] + "'" );
+ }
+ }
+ else if( infile == null )
+ {
+ infile = key;
+ }
+ else if( outfile == null )
+ {
+ outfile = key;
+ }
+ else
+ {
+ usage();
+ }
+ }
+ if( infile == null )
+ {
+ usage();
+ }
+ if( outfile == null )
+ {
+ outfile = infile;
+ }
+ document = PDDocument.load( infile );
+
+ if( !document.isEncrypted() )
+ {
+ document.setEncryptionDictionary( enc );
+ document.encrypt( ownerPassword, userPassword );
+ document.save( outfile );
+ }
+ else
+ {
+ System.err.println( "Error: Document is already encrypted." );
+ }
+ }
+ finally
+ {
+ if( document != null )
+ {
+ document.close();
+ }
+ }
+ }
+ }
+
+ /**
+ * This will print a usage message.
+ */
+ private static void usage()
+ {
+ System.err.println( "usage: java org.pdfbox.Encrypt [options] <inputfile> [outputfile]" );
+ System.err.println( " -O <password> Set the owner password" );
+ System.err.println( " -U <password> Set the user password" );
+ System.err.println( " -canAssemble <true|false> Set the assemble permission" );
+ System.err.println( " -canExtractContent <true|false> Set the extraction permission" );
+ System.err.println( " -canExtractForAccessibility <true|false> Set the extraction permission" );
+ System.err.println( " -canFillInForm <true|false> Set the fill in form permission" );
+ System.err.println( " -canModify <true|false> Set the modify permission" );
+ System.err.println( " -canModifyAnnotations <true|false> Set the modify annots permission" );
+ System.err.println( " -canPrint <true|false> Set the print permission" );
+ System.err.println( " -canPrintDegraded <true|false> Set the print degraded permission" );
+ System.err.println( " -keyLength <length> The length of the key in bits(40)" );
+ System.err.println( " -version <0|1|2|3|4> The encryption version(1)" );
+ System.err.println( " 0 - Undocumented/Unpublished" );
+ System.err.println( " 1 - Allows for 40 bit encryption" );
+ System.err.println( " 2 - Allows for variable length encryption" );
+ System.err.println( " 3 - Unpublished but allows for key lengths from 40 to 128" );
+ System.err.println( " 4 - Security handler defines encryption" );
+ System.err.println( " -revision <2|3|4> The encryption revision(2)" );
+ System.err.println( " 2 - version less than 2" );
+ System.err.println( " 3 - version 2 or 3 or uses a revision 3 permission" );
+ System.err.println( " 4 - version of 4" );
+ System.err.println( "\nNote: By default all permissions are set to true!" );
+ System.exit( 1 );
+ }
+
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/ExportFDF.java b/src/main/java/org/pdfbox/ExportFDF.java
new file mode 100644
index 0000000..d8f6246
--- /dev/null
+++ b/src/main/java/org/pdfbox/ExportFDF.java
@@ -0,0 +1,155 @@
+/**
+ * Copyright (c) 2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox;
+
+import java.io.IOException;
+
+import org.pdfbox.pdmodel.PDDocument;
+
+import org.pdfbox.pdmodel.interactive.form.PDAcroForm;
+
+import org.pdfbox.pdmodel.fdf.FDFDocument;
+
+/**
+ * This example will take a PDF document and fill the fields with data from the
+ * FDF fields.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.2 $
+ */
+public class ExportFDF
+{
+ /**
+ * Creates a new instance of ImportFDF.
+ */
+ public ExportFDF()
+ {
+ }
+
+ /**
+ * This will import an fdf document and write out another pdf.
+ * <br />
+ * see usage() for commandline
+ *
+ * @param args command line arguments
+ *
+ * @throws Exception If there is an error importing the FDF document.
+ */
+ public static void main(String[] args) throws Exception
+ {
+ ExportFDF exporter = new ExportFDF();
+ exporter.exportFDF( args );
+ }
+
+ private void exportFDF( String[] args ) throws Exception
+ {
+ PDDocument pdf = null;
+ FDFDocument fdf = null;
+
+ try
+ {
+ if( args.length != 1 && args.length != 2 )
+ {
+ usage();
+ }
+ else
+ {
+ pdf = PDDocument.load( args[0] );
+ PDAcroForm form = pdf.getDocumentCatalog().getAcroForm();
+ if( form == null )
+ {
+ System.err.println( "Error: This PDF does not contain a form." );
+ }
+ else
+ {
+ String fdfName = null;
+ if( args.length == 2 )
+ {
+ fdfName = args[1];
+ }
+ else
+ {
+ if( args[0].length() > 4 )
+ {
+ fdfName = args[0].substring( 0, args[0].length() -4 ) + ".fdf";
+ }
+ }
+ fdf = form.exportFDF();
+ fdf.save( fdfName );
+ }
+ }
+ }
+ finally
+ {
+ close( fdf );
+ close( pdf );
+ }
+ }
+
+ /**
+ * This will print out a message telling how to use this example.
+ */
+ private static void usage()
+ {
+ System.err.println( "usage: org.pdfbox.ExortFDF <pdf-file> [output-fdf-file]" );
+ System.err.println( " [output-fdf-file] - Default is pdf name, test.pdf->test.fdf" );
+ }
+
+ /**
+ * Close the document.
+ *
+ * @param doc The doc to close.
+ *
+ * @throws IOException If there is an error closing the document.
+ */
+ public void close( FDFDocument doc ) throws IOException
+ {
+ if( doc != null )
+ {
+ doc.close();
+ }
+ }
+
+ /**
+ * Close the document.
+ *
+ * @param doc The doc to close.
+ *
+ * @throws IOException If there is an error closing the document.
+ */
+ public void close( PDDocument doc ) throws IOException
+ {
+ if( doc != null )
+ {
+ doc.close();
+ }
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/ExportXFDF.java b/src/main/java/org/pdfbox/ExportXFDF.java
new file mode 100644
index 0000000..a1cfcf2
--- /dev/null
+++ b/src/main/java/org/pdfbox/ExportXFDF.java
@@ -0,0 +1,155 @@
+/**
+ * Copyright (c) 2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox;
+
+import java.io.IOException;
+
+import org.pdfbox.pdmodel.PDDocument;
+
+import org.pdfbox.pdmodel.interactive.form.PDAcroForm;
+
+import org.pdfbox.pdmodel.fdf.FDFDocument;
+
+/**
+ * This example will take a PDF document and fill the fields with data from the
+ * FDF fields.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.2 $
+ */
+public class ExportXFDF
+{
+ /**
+ * Creates a new instance of ImportFDF.
+ */
+ public ExportXFDF()
+ {
+ }
+
+ /**
+ * This will import an fdf document and write out another pdf.
+ * <br />
+ * see usage() for commandline
+ *
+ * @param args command line arguments
+ *
+ * @throws Exception If there is an error importing the FDF document.
+ */
+ public static void main(String[] args) throws Exception
+ {
+ ExportXFDF exporter = new ExportXFDF();
+ exporter.exportXFDF( args );
+ }
+
+ private void exportXFDF( String[] args ) throws Exception
+ {
+ PDDocument pdf = null;
+ FDFDocument fdf = null;
+
+ try
+ {
+ if( args.length != 1 && args.length != 2 )
+ {
+ usage();
+ }
+ else
+ {
+ pdf = PDDocument.load( args[0] );
+ PDAcroForm form = pdf.getDocumentCatalog().getAcroForm();
+ if( form == null )
+ {
+ System.err.println( "Error: This PDF does not contain a form." );
+ }
+ else
+ {
+ String fdfName = null;
+ if( args.length == 2 )
+ {
+ fdfName = args[1];
+ }
+ else
+ {
+ if( args[0].length() > 4 )
+ {
+ fdfName = args[0].substring( 0, args[0].length() -4 ) + ".xfdf";
+ }
+ }
+ fdf = form.exportFDF();
+ fdf.saveXFDF( fdfName );
+ }
+ }
+ }
+ finally
+ {
+ close( fdf );
+ close( pdf );
+ }
+ }
+
+ /**
+ * This will print out a message telling how to use this example.
+ */
+ private static void usage()
+ {
+ System.err.println( "usage: org.pdfbox.ExortXFDF <pdf-file> [output-xfdf-file]" );
+ System.err.println( " [output-xfdf-file] - Default is pdf name, test.pdf->test.xfdf" );
+ }
+
+ /**
+ * Close the document.
+ *
+ * @param doc The doc to close.
+ *
+ * @throws IOException If there is an error closing the document.
+ */
+ public void close( FDFDocument doc ) throws IOException
+ {
+ if( doc != null )
+ {
+ doc.close();
+ }
+ }
+
+ /**
+ * Close the document.
+ *
+ * @param doc The doc to close.
+ *
+ * @throws IOException If there is an error closing the document.
+ */
+ public void close( PDDocument doc ) throws IOException
+ {
+ if( doc != null )
+ {
+ doc.close();
+ }
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/ExtractImages.java b/src/main/java/org/pdfbox/ExtractImages.java
new file mode 100644
index 0000000..a8e46ee
--- /dev/null
+++ b/src/main/java/org/pdfbox/ExtractImages.java
@@ -0,0 +1,210 @@
+/**
+ * Copyright (c) 2003-2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox;
+
+import java.io.File;
+import java.io.IOException;
+
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.pdfbox.pdmodel.PDDocument;
+import org.pdfbox.pdmodel.PDPage;
+import org.pdfbox.pdmodel.PDResources;
+
+import org.pdfbox.pdmodel.encryption.PDEncryptionDictionary;
+import org.pdfbox.pdmodel.encryption.PDStandardEncryption;
+import org.pdfbox.pdmodel.graphics.xobject.PDXObjectImage;
+
+/**
+ * This will read a read pdf and extract images. <br/><br/>
+ *
+ * usage: java org.pdfbox.ExtractImages &lt;pdffile&gt; &lt;password&gt; [imageprefix]
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.3 $
+ */
+public class ExtractImages
+{
+ private int imageCounter = 1;
+
+ private static final String PASSWORD = "-password";
+ private static final String PREFIX = "-prefix";
+
+ /**
+ * This is the entry point for the application.
+ *
+ * @param args The command-line arguments.
+ *
+ * @throws Exception If there is an error decrypting the document.
+ */
+ public static void main( String[] args ) throws Exception
+ {
+ ExtractImages extractor = new ExtractImages();
+ extractor.extractImages( args );
+ }
+
+ private void extractImages( String[] args ) throws Exception
+ {
+ if( args.length < 1 || args.length > 3 )
+ {
+ usage();
+ }
+ else
+ {
+ String pdfFile = null;
+ String password = "";
+ String prefix = null;
+ for( int i=0; i<args.length; i++ )
+ {
+ if( args[i].equals( PASSWORD ) )
+ {
+ i++;
+ if( i >= args.length )
+ {
+ usage();
+ }
+ password = args[i];
+ }
+ else if( args[i].equals( PREFIX ) )
+ {
+ i++;
+ if( i >= args.length )
+ {
+ usage();
+ }
+ prefix = args[i];
+ }
+ else
+ {
+ if( pdfFile == null )
+ {
+ pdfFile = args[i];
+ }
+ }
+ }
+ if( prefix == null && pdfFile.length() >4 )
+ {
+ prefix = pdfFile.substring( 0, pdfFile.length() -4 );
+ }
+
+ PDDocument document = null;
+
+ try
+ {
+ document = PDDocument.load( pdfFile );
+
+ if( document.isEncrypted() )
+ {
+ if( document.isOwnerPassword( password ) )
+ {
+ document.decrypt( password );
+ }
+ else
+ {
+ throw new IOException(
+ "Error: You are only allowed to extract images with the owner password." );
+ }
+ }
+
+ PDEncryptionDictionary encDictionary = document.getEncryptionDictionary();
+
+ //only care about standard encryption and if it was decrypted with the
+ //user password
+ if( encDictionary instanceof PDStandardEncryption &&
+ !document.wasDecryptedWithOwnerPassword() )
+ {
+ PDStandardEncryption stdEncryption = (PDStandardEncryption)encDictionary;
+ if( !stdEncryption.canExtractContent() )
+ {
+ throw new IOException( "You do not have permission to extract images." );
+ }
+ }
+
+ List pages = document.getDocumentCatalog().getAllPages();
+ Iterator iter = pages.iterator();
+ while( iter.hasNext() )
+ {
+ PDPage page = (PDPage)iter.next();
+ PDResources resources = page.getResources();
+ Map images = resources.getImages();
+ if( images != null )
+ {
+ Iterator imageIter = images.keySet().iterator();
+ while( imageIter.hasNext() )
+ {
+ String key = (String)imageIter.next();
+ PDXObjectImage image = (PDXObjectImage)images.get( key );
+ String name = getUniqueFileName( key, image.getSuffix() );
+ System.out.println( "Writing image:" + name );
+ image.write2file( name );
+ }
+ }
+ }
+ }
+ finally
+ {
+ if( document != null )
+ {
+ document.close();
+ }
+ }
+ }
+ }
+
+ private String getUniqueFileName( String prefix, String suffix )
+ {
+ String uniqueName = null;
+ File f = null;
+ while( f == null || f.exists() )
+ {
+ uniqueName = prefix + "-" + imageCounter;
+ f = new File( uniqueName + "." + suffix );
+ imageCounter++;
+ }
+ return uniqueName;
+ }
+
+ /**
+ * This will print the usage requirements and exit.
+ */
+ private static void usage()
+ {
+ System.err.println( "Usage: java org.pdfbox.ExtractImages [OPTIONS] <PDF file>\n" +
+ " -password <password> Password to decrypt document\n" +
+ " -suffix <password> Image suffix(default to pdf name)\n" +
+ " <PDF file> The PDF document to use\n"
+ );
+ System.exit( 1 );
+ }
+
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/ExtractText.java b/src/main/java/org/pdfbox/ExtractText.java
new file mode 100644
index 0000000..5f5a328
--- /dev/null
+++ b/src/main/java/org/pdfbox/ExtractText.java
@@ -0,0 +1,270 @@
+/**
+ * Copyright (c) 2003-2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox;
+
+import java.io.FileOutputStream;
+import java.io.OutputStreamWriter;
+import java.io.Writer;
+
+import org.pdfbox.exceptions.InvalidPasswordException;
+
+import org.pdfbox.pdmodel.PDDocument;
+
+import org.pdfbox.util.PDFText2HTML;
+import org.pdfbox.util.PDFTextStripper;
+
+import org.apache.log4j.Logger;
+
+/**
+ * This is the main program that simply parses the pdf document and transforms it
+ * into text.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.9 $
+ */
+public class ExtractText
+{
+ private static final Logger LOG = Logger.getLogger( ExtractText.class );
+
+ /**
+ * This is the default encoding of the text to be output.
+ */
+ public static final String DEFAULT_ENCODING =
+ null;
+ //"ISO-8859-1";
+ //"ISO-8859-6"; //arabic
+ //"US-ASCII";
+ //"UTF-8";
+ //"UTF-16";
+ //"UTF-16BE";
+ //"UTF-16LE";
+
+
+ private static final String PASSWORD = "-password";
+ private static final String ENCODING = "-encoding";
+ private static final String CONSOLE = "-console";
+ private static final String START_PAGE = "-startPage";
+ private static final String END_PAGE = "-endPage";
+ private static final String SORT = "-sort";
+ private static final String HTML = "-html"; // jjb - added simple HTML output
+
+ /**
+ * private constructor.
+ */
+ private ExtractText()
+ {
+ //static class
+ }
+
+ /**
+ * Infamous main method.
+ *
+ * @param args Command line arguments, should be one and a reference to a file.
+ *
+ * @throws Exception If there is an error parsing the document.
+ */
+ public static void main( String[] args ) throws Exception
+ {
+ boolean toConsole = false;
+ boolean toHTML = false;
+ boolean sort = false;
+ String password = "";
+ String encoding = DEFAULT_ENCODING;
+ String pdfFile = null;
+ String textFile = null;
+ int startPage = 1;
+ int endPage = Integer.MAX_VALUE;
+ for( int i=0; i<args.length; i++ )
+ {
+ if( args[i].equals( PASSWORD ) )
+ {
+ i++;
+ if( i >= args.length )
+ {
+ usage();
+ }
+ password = args[i];
+ }
+ else if( args[i].equals( ENCODING ) )
+ {
+ i++;
+ if( i >= args.length )
+ {
+ usage();
+ }
+ encoding = args[i];
+ }
+ else if( args[i].equals( START_PAGE ) )
+ {
+ i++;
+ if( i >= args.length )
+ {
+ usage();
+ }
+ startPage = Integer.parseInt( args[i] );
+ }
+ else if( args[i].equals( HTML ) )
+ {
+ toHTML = true;
+ }
+ else if( args[i].equals( SORT ) )
+ {
+ sort = true;
+ }
+ else if( args[i].equals( END_PAGE ) )
+ {
+ i++;
+ if( i >= args.length )
+ {
+ usage();
+ }
+ endPage = Integer.parseInt( args[i] );
+ }
+ else if( args[i].equals( CONSOLE ) )
+ {
+ toConsole = true;
+ }
+ else
+ {
+ if( pdfFile == null )
+ {
+ pdfFile = args[i];
+ }
+ else
+ {
+ textFile = args[i];
+ }
+ }
+ }
+
+ if( pdfFile == null )
+ {
+ usage();
+ }
+
+ if( textFile == null && pdfFile.length() >4 )
+ {
+ textFile = pdfFile.substring( 0, pdfFile.length() -4 ) + ".txt";
+ }
+
+ Writer output = null;
+ PDDocument document = null;
+ try
+ {
+ document = PDDocument.load( pdfFile );
+
+ //document.print();
+ if( document.isEncrypted() )
+ {
+ try
+ {
+ document.decrypt( password );
+ }
+ catch( InvalidPasswordException e )
+ {
+ if( args.length == 4 )//they supplied the wrong password
+ {
+ System.err.println( "Error: The supplied password is incorrect." );
+ System.exit( 2 );
+ }
+ else
+ {
+ //they didn't suppply a password and the default of "" was wrong.
+ System.err.println( "Error: The document is encrypted." );
+ usage();
+ }
+ }
+ }
+ if( toConsole )
+ {
+ output = new OutputStreamWriter( System.out );
+ }
+ else
+ {
+ if( encoding != null )
+ {
+ output = new OutputStreamWriter(
+ new FileOutputStream( textFile ), encoding );
+ }
+ else
+ {
+ //use default encoding
+ output = new OutputStreamWriter(
+ new FileOutputStream( textFile ) );
+ }
+ }
+
+ PDFTextStripper stripper = null;
+ if(toHTML)
+ {
+ stripper = new PDFText2HTML();
+ }
+ else
+ {
+ stripper = new PDFTextStripper();
+ }
+ stripper.setSortByPosition( sort );
+ stripper.setStartPage( startPage );
+ stripper.setEndPage( endPage );
+ stripper.writeText( document, output );
+ }
+ finally
+ {
+ if( output != null )
+ {
+ output.close();
+ }
+ if( document != null )
+ {
+ document.close();
+ }
+ }
+ }
+
+ /**
+ * This will print the usage requirements and exit.
+ */
+ private static void usage()
+ {
+ System.err.println( "Usage: java org.pdfbox.ExtractText [OPTIONS] <PDF file> [Text File]\n" +
+ " -password <password> Password to decrypt document\n" +
+ " -encoding <output encoding> (ISO-8859-1,UTF-16BE,UTF-16LE,...)\n" +
+ " -console Send text to console instead of file\n" +
+ " -html Output in HTML format instead of raw text\n" +
+ " -sort Sort the text before writing\n" +
+ " -startPage <number> The first page to start extraction(1 based)\n" +
+ " -endPage <number> The last page to extract(inclusive)\n" +
+ " <PDF file> The PDF document to use\n" +
+ " [Text File] The file to write the text to\n"
+ );
+ System.exit( 1 );
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/ImportFDF.java b/src/main/java/org/pdfbox/ImportFDF.java
new file mode 100644
index 0000000..5a0cf27
--- /dev/null
+++ b/src/main/java/org/pdfbox/ImportFDF.java
@@ -0,0 +1,156 @@
+/**
+ * Copyright (c) 2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox;
+
+import java.io.IOException;
+
+import org.pdfbox.pdmodel.PDDocument;
+import org.pdfbox.pdmodel.PDDocumentCatalog;
+
+import org.pdfbox.pdmodel.fdf.FDFDocument;
+
+import org.pdfbox.pdmodel.interactive.form.PDAcroForm;
+
+/**
+ * This example will take a PDF document and fill the fields with data from the
+ * FDF fields.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.1 $
+ */
+public class ImportFDF
+{
+ /**
+ * Creates a new instance of ImportFDF.
+ */
+ public ImportFDF()
+ {
+ }
+
+ /**
+ * This will takes the values from the fdf document and import them into the
+ * PDF document.
+ *
+ * @param pdfDocument The document to put the fdf data into.
+ * @param fdfDocument The FDF document to get the data from.
+ *
+ * @throws IOException If there is an error setting the data in the field.
+ */
+ public void importFDF( PDDocument pdfDocument, FDFDocument fdfDocument ) throws IOException
+ {
+ PDDocumentCatalog docCatalog = pdfDocument.getDocumentCatalog();
+ PDAcroForm acroForm = docCatalog.getAcroForm();
+ acroForm.setCacheFields( true );
+ acroForm.importFDF( fdfDocument );
+ }
+
+ /**
+ * This will import an fdf document and write out another pdf.
+ * <br />
+ * see usage() for commandline
+ *
+ * @param args command line arguments
+ *
+ * @throws Exception If there is an error importing the FDF document.
+ */
+ public static void main(String[] args) throws Exception
+ {
+ ImportFDF importer = new ImportFDF();
+ importer.importFDF( args );
+ }
+
+ private void importFDF( String[] args ) throws Exception
+ {
+ PDDocument pdf = null;
+ FDFDocument fdf = null;
+
+ try
+ {
+ if( args.length != 3 )
+ {
+ usage();
+ }
+ else
+ {
+ ImportFDF importer = new ImportFDF();
+
+ pdf = PDDocument.load( args[0] );
+ fdf = FDFDocument.load( args[1] );
+ importer.importFDF( pdf, fdf );
+
+ pdf.save( args[2] );
+ }
+ }
+ finally
+ {
+ close( fdf );
+ close( pdf );
+ }
+ }
+
+ /**
+ * This will print out a message telling how to use this example.
+ */
+ private static void usage()
+ {
+ System.err.println( "usage: org.pdfbox.ImportFDF <pdf-file> <fdf-file> <output-file>" );
+ }
+
+ /**
+ * Close the document.
+ *
+ * @param doc The doc to close.
+ *
+ * @throws IOException If there is an error closing the document.
+ */
+ public void close( FDFDocument doc ) throws IOException
+ {
+ if( doc != null )
+ {
+ doc.close();
+ }
+ }
+
+ /**
+ * Close the document.
+ *
+ * @param doc The doc to close.
+ *
+ * @throws IOException If there is an error closing the document.
+ */
+ public void close( PDDocument doc ) throws IOException
+ {
+ if( doc != null )
+ {
+ doc.close();
+ }
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/ImportXFDF.java b/src/main/java/org/pdfbox/ImportXFDF.java
new file mode 100644
index 0000000..24987a4
--- /dev/null
+++ b/src/main/java/org/pdfbox/ImportXFDF.java
@@ -0,0 +1,157 @@
+/**
+ * Copyright (c) 2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox;
+
+import org.pdfbox.pdmodel.PDDocument;
+import org.pdfbox.pdmodel.PDDocumentCatalog;
+
+import org.pdfbox.pdmodel.fdf.FDFDocument;
+
+import org.pdfbox.pdmodel.interactive.form.PDAcroForm;
+
+import java.io.IOException;
+
+
+/**
+ * This example will take a PDF document and fill the fields with data from the
+ * XFDF fields.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.1 $
+ */
+public class ImportXFDF
+{
+ /**
+ * Creates a new instance of ImportFDF.
+ */
+ public ImportXFDF()
+ {
+ }
+
+ /**
+ * This will takes the values from the fdf document and import them into the
+ * PDF document.
+ *
+ * @param pdfDocument The document to put the fdf data into.
+ * @param fdfDocument The FDF document to get the data from.
+ *
+ * @throws IOException If there is an error setting the data in the field.
+ */
+ public void importFDF( PDDocument pdfDocument, FDFDocument fdfDocument ) throws IOException
+ {
+ PDDocumentCatalog docCatalog = pdfDocument.getDocumentCatalog();
+ PDAcroForm acroForm = docCatalog.getAcroForm();
+ acroForm.setCacheFields( true );
+ acroForm.importFDF( fdfDocument );
+ }
+
+ /**
+ * This will import an fdf document and write out another pdf.
+ * <br />
+ * see usage() for commandline
+ *
+ * @param args command line arguments
+ *
+ * @throws Exception If there is an error importing the FDF document.
+ */
+ public static void main(String[] args) throws Exception
+ {
+ ImportXFDF importer = new ImportXFDF();
+ importer.importXFDF( args );
+ }
+
+ private void importXFDF( String[] args ) throws Exception
+ {
+ PDDocument pdf = null;
+ FDFDocument fdf = null;
+
+ try
+ {
+ if( args.length != 3 )
+ {
+ usage();
+ }
+ else
+ {
+ ImportFDF importer = new ImportFDF();
+ pdf = PDDocument.load( args[0] );
+ fdf = FDFDocument.loadXFDF( args[1] );
+
+ importer.importFDF( pdf, fdf );
+ pdf.save( args[2] );
+ fdf.save( "tmp/outputXFDFtoPDF.fdf");
+ }
+ }
+ finally
+ {
+ close( fdf );
+ close( pdf );
+ }
+ }
+
+ /**
+ * This will print out a message telling how to use this example.
+ */
+ private static void usage()
+ {
+ System.err.println( "usage: org.pdfbox.ImportXFDF <pdf-file> <fdf-file> <output-file>" );
+ }
+
+ /**
+ * Close the document.
+ *
+ * @param doc The doc to close.
+ *
+ * @throws IOException If there is an error closing the document.
+ */
+ public void close( FDFDocument doc ) throws IOException
+ {
+ if( doc != null )
+ {
+ doc.close();
+ }
+ }
+
+ /**
+ * Close the document.
+ *
+ * @param doc The doc to close.
+ *
+ * @throws IOException If there is an error closing the document.
+ */
+ public void close( PDDocument doc ) throws IOException
+ {
+ if( doc != null )
+ {
+ doc.close();
+ }
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/Overlay.java b/src/main/java/org/pdfbox/Overlay.java
new file mode 100644
index 0000000..7850d89
--- /dev/null
+++ b/src/main/java/org/pdfbox/Overlay.java
@@ -0,0 +1,530 @@
+/**
+ * Copyright (c) 2003, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox;
+
+import org.apache.log4j.Logger;
+import org.pdfbox.cos.COSArray;
+import org.pdfbox.cos.COSBase;
+import org.pdfbox.cos.COSDictionary;
+import org.pdfbox.cos.COSName;
+import org.pdfbox.cos.COSStream;
+import org.pdfbox.cos.COSInteger;
+import org.pdfbox.exceptions.COSVisitorException;
+import org.pdfbox.pdfparser.PDFParser;
+import org.pdfbox.pdfwriter.COSWriter;
+
+import org.pdfbox.pdmodel.PDDocument;
+import org.pdfbox.pdmodel.PDDocumentCatalog;
+import org.pdfbox.pdmodel.PDPage;
+import org.pdfbox.pdmodel.PDResources;
+
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.OutputStream;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.TreeMap;
+import java.util.Map;
+
+/**
+ * Overlay on document with another one.<br>
+ * e.g. Overlay an invoice with your company layout<br>
+ * <br>
+ * How it (should) work:<br>
+ * If the document has 10 pages, and the layout 2 the following is the result:<br>
+ * <pre>
+ * Document: 1234567890
+ * Layout : 1212121212
+ * </pre>
+ * <br>
+ *
+ * @author Mario Ivankovits (mario@ops.co.at)
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ *
+ * @version $Revision: 1.4 $
+ */
+public class Overlay
+{
+ /**
+ * COSName constant.
+ */
+ public static final COSName XOBJECT = COSName.getPDFName("XObject");
+ /**
+ * COSName constant.
+ */
+ public static final COSName PROC_SET = COSName.getPDFName("ProcSet");
+ /**
+ * COSName constant.
+ */
+ public static final COSName EXT_G_STATE = COSName.getPDFName("ExtGState" );
+
+ private static Logger log = Logger.getLogger(Overlay.class);
+
+ private List layoutPages = new ArrayList(10);
+
+ private PDDocument pdfOverlay;
+ private PDDocument pdfDocument;
+ private int pageCount = 0;
+ private COSStream saveGraphicsStateStream;
+ private COSStream restoreGraphicsStateStream;
+
+ /**
+ * This will overlay a document and write out the results.<br/><br/>
+ *
+ * usage: java org.pdfbox.Overlay &lt;overlay.pdf&gt; &lt;document.pdf&gt; &lt;result.pdf&gt;
+ *
+ * @param args The command line arguments.
+ *
+ * @throws IOException If there is an error reading/writing the document.
+ * @throws COSVisitorException If there is an error writing the document.
+ */
+ public static void main( String[] args ) throws IOException, COSVisitorException
+ {
+ if( args.length != 3 )
+ {
+ usage();
+ System.exit(1);
+ }
+ else
+ {
+ PDDocument overlay = null;
+ PDDocument pdf = null;
+
+ try
+ {
+ overlay = getDocument( args[0] );
+ pdf = getDocument( args[1] );
+ Overlay overlayer = new Overlay();
+ overlayer.overlay( overlay, pdf );
+ writeDocument( pdf, args[2] );
+ }
+ finally
+ {
+ if( overlay != null )
+ {
+ overlay.close();
+ }
+ if( pdf != null )
+ {
+ pdf.close();
+ }
+ }
+ }
+ }
+
+ private static void writeDocument( PDDocument pdf, String filename ) throws IOException, COSVisitorException
+ {
+ FileOutputStream output = null;
+ COSWriter writer = null;
+ try
+ {
+ output = new FileOutputStream( filename );
+ writer = new COSWriter( output );
+ writer.write( pdf );
+ }
+ finally
+ {
+ if( writer != null )
+ {
+ writer.close();
+ }
+ if( output != null )
+ {
+ output.close();
+ }
+ }
+ }
+
+ private static PDDocument getDocument( String filename ) throws IOException
+ {
+ FileInputStream input = null;
+ PDFParser parser = null;
+ PDDocument result = null;
+ try
+ {
+ input = new FileInputStream( filename );
+ parser = new PDFParser( input );
+ parser.parse();
+ result = parser.getPDDocument();
+ }
+ finally
+ {
+ if( input != null )
+ {
+ input.close();
+ }
+ }
+ return result;
+ }
+
+ private static void usage()
+ {
+ System.err.println( "usage: java " + Overlay.class.getName() + "<overlay.pdf> <document.pdf> <result.pdf>" );
+ }
+
+ /**
+ * Private class.
+ */
+ private static class LayoutPage
+ {
+ private final COSBase contents;
+ private final COSDictionary res;
+ private final Map objectNameMap;
+
+ /**
+ * Constructor.
+ *
+ * @param contentsValue The contents.
+ * @param resValue The resource dictionary
+ * @param objectNameMapValue The map
+ */
+ public LayoutPage(COSBase contentsValue, COSDictionary resValue, Map objectNameMapValue)
+ {
+ contents = contentsValue;
+ res = resValue;
+ objectNameMap = objectNameMapValue;
+ }
+ }
+
+ /**
+ * This will overlay two documents onto each other. The overlay document is
+ * repeatedly overlayed onto the destination document for every page in the
+ * destination.
+ *
+ * @param overlay The document to copy onto the destination
+ * @param destination The file that the overlay should be placed on.
+ *
+ * @return The destination pdf, same as argument passed in.
+ *
+ * @throws IOException If there is an error accessing data.
+ */
+ public PDDocument overlay( PDDocument overlay, PDDocument destination ) throws IOException
+ {
+ pdfOverlay = overlay;
+ pdfDocument = destination;
+
+ PDDocumentCatalog overlayCatalog = pdfOverlay.getDocumentCatalog();
+ collectLayoutPages( overlayCatalog.getAllPages() );
+
+ COSDictionary saveGraphicsStateDic = new COSDictionary();
+ saveGraphicsStateStream = new COSStream( saveGraphicsStateDic, pdfDocument.getDocument().getScratchFile() );
+ OutputStream saveStream = saveGraphicsStateStream.createUnfilteredStream();
+ saveStream.write( " q\n".getBytes() );
+ saveStream.flush();
+
+ restoreGraphicsStateStream = new COSStream( saveGraphicsStateDic, pdfDocument.getDocument().getScratchFile() );
+ OutputStream restoreStream = restoreGraphicsStateStream.createUnfilteredStream();
+ restoreStream.write( " Q\n".getBytes() );
+ restoreStream.flush();
+
+
+ PDDocumentCatalog pdfCatalog = pdfDocument.getDocumentCatalog();
+ processPages( pdfCatalog.getAllPages() );
+
+ return pdfDocument;
+ }
+
+ private void collectLayoutPages( List pages) throws IOException
+ {
+ Iterator pagesIter = pages.iterator();
+ while( pagesIter.hasNext() )
+ {
+ PDPage page = (PDPage)pagesIter.next();
+ COSBase contents = page.getCOSDictionary().getDictionaryObject( COSName.CONTENTS );
+ PDResources resources = page.findResources();
+ if( resources == null )
+ {
+ resources = new PDResources();
+ page.setResources( resources );
+ }
+ COSDictionary res = resources.getCOSDictionary();
+
+ if( contents instanceof COSStream )
+ {
+ COSStream stream = (COSStream) contents;
+ Map objectNameMap = new TreeMap();
+ stream = makeUniqObjectNames(objectNameMap, stream);
+
+ layoutPages.add(new LayoutPage(stream, res, objectNameMap));
+ }
+ else if( contents instanceof COSArray )
+ {
+ throw new UnsupportedOperationException("Layout pages with COSArray currently not supported.");
+ // layoutPages.add(new LayoutPage(contents, res));
+ }
+ else
+ {
+ throw new IOException( "Contents are unknown type:" + contents.getClass().getName() );
+ }
+ }
+ }
+
+ private COSStream makeUniqObjectNames(Map objectNameMap, COSStream stream) throws IOException
+ {
+ ByteArrayOutputStream baos = new ByteArrayOutputStream(10240);
+
+ byte[] buf = new byte[10240];
+ int read;
+ InputStream is = stream.getUnfilteredStream();
+ while ((read = is.read(buf)) > -1)
+ {
+ baos.write(buf, 0, read);
+ }
+
+ buf = baos.toByteArray();
+ baos = new ByteArrayOutputStream(buf.length + 100);
+ StringBuffer sbObjectName = new StringBuffer(10);
+ boolean bInObjectIdent = false;
+ boolean bInText = false;
+ boolean bInEscape = false;
+ for (int i = 0; i<buf.length; i++)
+ {
+ byte b = buf[i];
+
+ if (!bInEscape)
+ {
+ if (!bInText && b == '(')
+ {
+ bInText = true;
+ }
+ if (bInText && b == ')')
+ {
+ bInText = false;
+ }
+ if (b == '\\')
+ {
+ bInEscape = true;
+ }
+
+ if (!bInText && !bInEscape)
+ {
+ if (b == '/')
+ {
+ bInObjectIdent = true;
+ }
+ else if (bInObjectIdent && Character.isWhitespace((char) b))
+ {
+ bInObjectIdent = false;
+
+ // System.err.println(sbObjectName);
+ // String object = sbObjectName.toString();
+
+ String objectName = sbObjectName.toString().substring(1);
+ String newObjectName = objectName + "overlay";
+ baos.write('/');
+ baos.write(newObjectName.getBytes());
+
+ objectNameMap.put(objectName, COSName.getPDFName(newObjectName));
+
+ sbObjectName.delete(0, sbObjectName.length());
+ }
+ }
+
+ if (bInObjectIdent)
+ {
+ sbObjectName.append((char) b);
+ continue;
+ }
+ }
+ else
+ {
+ bInEscape = false;
+ }
+
+ baos.write(b);
+ }
+
+ COSDictionary streamDict = new COSDictionary();
+ streamDict.setItem(COSName.LENGTH, new COSInteger(baos.size()));
+ COSStream output = new COSStream(streamDict, pdfDocument.getDocument().getScratchFile());
+ output.setFilters(stream.getFilters());
+ OutputStream os = output.createUnfilteredStream();
+ baos.writeTo(os);
+ os.close();
+
+ return output;
+ }
+
+ private void processPages( List pages ) throws IOException
+ {
+ Iterator pageIter = pages.iterator();
+ while( pageIter.hasNext() )
+ {
+ PDPage page = (PDPage)pageIter.next();
+ COSDictionary pageDictionary = page.getCOSDictionary();
+ COSBase contents = pageDictionary.getDictionaryObject( COSName.CONTENTS );
+ if( contents instanceof COSStream )
+ {
+ COSStream contentsStream = (COSStream)contents;
+ // System.err.println("stream");
+ pageCount++;
+
+ COSArray array = new COSArray();
+
+ array.add(contentsStream);
+
+ mergePage( array, page );
+
+ pageDictionary.setItem(COSName.CONTENTS, array);
+ }
+ else if( contents instanceof COSArray )
+ {
+ COSArray contentsArray = (COSArray)contents;
+
+ mergePage( contentsArray, page );
+ }
+ else
+ {
+ throw new IOException( "Contents are unknown type:" + contents.getClass().getName() );
+ }
+ }
+ }
+
+ private void mergePage(COSArray array, PDPage page )
+ {
+ int layoutPageNum = pageCount % layoutPages.size();
+ LayoutPage layoutPage = (LayoutPage) layoutPages.get(layoutPageNum);
+ PDResources resources = page.findResources();
+ if( resources == null )
+ {
+ resources = new PDResources();
+ page.setResources( resources );
+ }
+ COSDictionary docResDict = resources.getCOSDictionary();
+ COSDictionary layoutResDict = layoutPage.res;
+ mergeArray(PROC_SET, docResDict, layoutResDict);
+ mergeDictionary(COSName.FONT, docResDict, layoutResDict, layoutPage.objectNameMap);
+ mergeDictionary(XOBJECT, docResDict, layoutResDict, layoutPage.objectNameMap);
+ mergeDictionary(EXT_G_STATE, docResDict, layoutResDict, layoutPage.objectNameMap);
+
+ //we are going to wrap the existing content around some save/restore
+ //graphics state, so the result is
+ //
+ //<save graphics state>
+ //<all existing content streams>
+ //<restore graphics state>
+ //<overlay content>
+ array.add(0, saveGraphicsStateStream );
+ array.add( restoreGraphicsStateStream );
+ array.add(layoutPage.contents);
+ }
+
+ /**
+ * merges two dictionaries.
+ *
+ * @param dest
+ * @param source
+ */
+ private void mergeDictionary(COSName name, COSDictionary dest, COSDictionary source, Map objectNameMap)
+ {
+ COSDictionary destDict = (COSDictionary) dest.getDictionaryObject(name);
+ COSDictionary sourceDict = (COSDictionary) source.getDictionaryObject(name);
+
+ if (destDict == null)
+ {
+ destDict = new COSDictionary();
+ dest.setItem(name, destDict);
+ }
+ if( sourceDict != null )
+ {
+
+ Iterator iterKeys = sourceDict.keyList().iterator();
+ while (iterKeys.hasNext())
+ {
+ COSName key = (COSName) iterKeys.next();
+ COSName mappedKey = (COSName) objectNameMap.get(key.getName());
+ if (mappedKey == null)
+ {
+ // object not needet
+ if (log.isDebugEnabled())
+ {
+ log.debug("MergeDict " + name.getName() +
+ ": Object " + key.getName() + " not used by content. Discarded.");
+ }
+ continue;
+ }
+
+ destDict.setItem(mappedKey, sourceDict.getItem(key));
+ }
+ }
+ }
+
+ /**
+ * merges two arrays.
+ *
+ * @param dest
+ * @param source
+ */
+ private void mergeArray(COSName name, COSDictionary dest, COSDictionary source)
+ {
+ COSArray destDict = (COSArray) dest.getDictionaryObject(name);
+ COSArray sourceDict = (COSArray) source.getDictionaryObject(name);
+
+ if (destDict == null)
+ {
+ destDict = new COSArray();
+ dest.setItem(name, destDict);
+ }
+
+ for (int sourceDictIdx = 0; sourceDict != null && sourceDictIdx<sourceDict.size(); sourceDictIdx++)
+ {
+ COSBase key = sourceDict.get(sourceDictIdx);
+ if (key instanceof COSName)
+ {
+ COSName keyname = (COSName) key;
+
+ boolean bFound = false;
+ for (int destDictIdx = 0; destDictIdx<destDict.size(); destDictIdx++)
+ {
+ COSBase destkey = destDict.get(destDictIdx);
+ if (destkey instanceof COSName)
+ {
+ COSName destkeyname = (COSName) destkey;
+ if (destkeyname.equals(keyname))
+ {
+ bFound = true;
+ break;
+ }
+ }
+ }
+ if (!bFound)
+ {
+ destDict.add(keyname);
+ }
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/PDFDebugger.java b/src/main/java/org/pdfbox/PDFDebugger.java
new file mode 100644
index 0000000..0ccf2fe
--- /dev/null
+++ b/src/main/java/org/pdfbox/PDFDebugger.java
@@ -0,0 +1,420 @@
+/**
+ * Copyright (c) 2004-2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox;
+
+import org.pdfbox.exceptions.InvalidPasswordException;
+
+import org.pdfbox.pdfviewer.PDFTreeModel;
+import org.pdfbox.pdfviewer.PDFTreeCellRenderer;
+import org.pdfbox.pdfviewer.ArrayEntry;
+import org.pdfbox.pdfviewer.MapEntry;
+
+import org.pdfbox.pdmodel.PDDocument;
+
+import org.pdfbox.util.DefaultFileFilter;
+
+import org.pdfbox.cos.COSBoolean;
+import org.pdfbox.cos.COSFloat;
+import org.pdfbox.cos.COSInteger;
+import org.pdfbox.cos.COSName;
+import org.pdfbox.cos.COSNull;
+import org.pdfbox.cos.COSStream;
+import org.pdfbox.cos.COSString;
+
+//import javax.swing.tree.*;
+import javax.swing.tree.TreeModel;
+import javax.swing.tree.TreePath;
+import javax.swing.JFileChooser;
+import javax.swing.JScrollPane;
+import javax.swing.JPanel;
+
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStream;
+import java.io.IOException;
+
+/**
+ *
+ * @author wurtz
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.1 $
+ */
+public class PDFDebugger extends javax.swing.JFrame
+{
+ private File currentDir=new File(".");
+
+ /**
+ * Constructor.
+ */
+ public PDFDebugger()
+ {
+ initComponents();
+ }
+
+ /**
+ * This method is called from within the constructor to
+ * initialize the form.
+ * WARNING: Do NOT modify this code. The content of this method is
+ * always regenerated by the Form Editor.
+ */
+ private void initComponents()
+ {
+ jSplitPane1 = new javax.swing.JSplitPane();
+ jScrollPane1 = new javax.swing.JScrollPane();
+ jTree1 = new javax.swing.JTree();
+ jScrollPane2 = new javax.swing.JScrollPane();
+ jTextPane1 = new javax.swing.JTextPane();
+ menuBar = new javax.swing.JMenuBar();
+ fileMenu = new javax.swing.JMenu();
+ openMenuItem = new javax.swing.JMenuItem();
+ saveMenuItem = new javax.swing.JMenuItem();
+ saveAsMenuItem = new javax.swing.JMenuItem();
+ exitMenuItem = new javax.swing.JMenuItem();
+ editMenu = new javax.swing.JMenu();
+ cutMenuItem = new javax.swing.JMenuItem();
+ copyMenuItem = new javax.swing.JMenuItem();
+ pasteMenuItem = new javax.swing.JMenuItem();
+ deleteMenuItem = new javax.swing.JMenuItem();
+ helpMenu = new javax.swing.JMenu();
+ contentsMenuItem = new javax.swing.JMenuItem();
+ aboutMenuItem = new javax.swing.JMenuItem();
+
+ jTree1.setCellRenderer( new PDFTreeCellRenderer() );
+ jTree1.setModel( null );
+
+ setTitle("PDFBox - PDF Viewer");
+ addWindowListener(new java.awt.event.WindowAdapter()
+ {
+ public void windowClosing(java.awt.event.WindowEvent evt)
+ {
+ exitForm(evt);
+ }
+ });
+
+
+ jScrollPane1.setBorder(new javax.swing.border.BevelBorder(javax.swing.border.BevelBorder.RAISED));
+ jScrollPane1.setPreferredSize(new java.awt.Dimension(300, 500));
+ jTree1.addTreeSelectionListener(new javax.swing.event.TreeSelectionListener()
+ {
+ public void valueChanged(javax.swing.event.TreeSelectionEvent evt)
+ {
+ jTree1ValueChanged(evt);
+ }
+ });
+
+ jScrollPane1.setViewportView(jTree1);
+
+ jSplitPane1.setRightComponent(jScrollPane2);
+
+ jScrollPane2.setPreferredSize(new java.awt.Dimension(300, 500));
+ jScrollPane2.setViewportView(jTextPane1);
+
+ jSplitPane1.setLeftComponent(jScrollPane1);
+
+ JScrollPane documentScroller = new JScrollPane();
+ //documentScroller.setPreferredSize( new Dimension( 300, 500 ) );
+ documentScroller.setViewportView( documentPanel );
+
+ getContentPane().add( jSplitPane1, java.awt.BorderLayout.CENTER );
+
+ fileMenu.setText("File");
+ openMenuItem.setText("Open");
+ openMenuItem.setToolTipText("Open PDF file");
+ openMenuItem.addActionListener(new java.awt.event.ActionListener()
+ {
+ public void actionPerformed(java.awt.event.ActionEvent evt)
+ {
+ openMenuItemActionPerformed(evt);
+ }
+ });
+
+ fileMenu.add(openMenuItem);
+
+ saveMenuItem.setText("Save");
+ //fileMenu.add(saveMenuItem);
+
+ saveAsMenuItem.setText("Save As ...");
+ //fileMenu.add(saveAsMenuItem);
+
+ exitMenuItem.setText("Exit");
+ exitMenuItem.addActionListener(new java.awt.event.ActionListener()
+ {
+ public void actionPerformed(java.awt.event.ActionEvent evt)
+ {
+ exitMenuItemActionPerformed(evt);
+ }
+ });
+
+ fileMenu.add(exitMenuItem);
+
+ menuBar.add(fileMenu);
+
+ editMenu.setText("Edit");
+ cutMenuItem.setText("Cut");
+ editMenu.add(cutMenuItem);
+
+ copyMenuItem.setText("Copy");
+ editMenu.add(copyMenuItem);
+
+ pasteMenuItem.setText("Paste");
+ editMenu.add(pasteMenuItem);
+
+ deleteMenuItem.setText("Delete");
+ editMenu.add(deleteMenuItem);
+
+ //menuBar.add(editMenu);
+
+ helpMenu.setText("Help");
+ contentsMenuItem.setText("Contents");
+ helpMenu.add(contentsMenuItem);
+
+ aboutMenuItem.setText("About");
+ helpMenu.add(aboutMenuItem);
+
+ //menuBar.add(helpMenu);
+
+ setJMenuBar(menuBar);
+
+
+ java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
+ setBounds((screenSize.width-700)/2, (screenSize.height-600)/2, 700, 600);
+ }//GEN-END:initComponents
+
+ private void openMenuItemActionPerformed(java.awt.event.ActionEvent evt)
+ {
+ JFileChooser chooser = new JFileChooser();
+ chooser.setCurrentDirectory(currentDir);
+
+ DefaultFileFilter pdfFilter = new DefaultFileFilter(new String[] {"pdf", "PDF"}, "PDF Files");
+ chooser.setFileFilter(pdfFilter);
+ int result = chooser.showOpenDialog(PDFDebugger.this);
+ if (result == JFileChooser.APPROVE_OPTION)
+ {
+ String name = chooser.getSelectedFile().getPath();
+ currentDir = new File(name).getParentFile();
+ try
+ {
+ readPDFFile(name);
+ }
+ catch (Exception e)
+ {
+ e.printStackTrace();
+ }
+ }
+ }//GEN-LAST:event_openMenuItemActionPerformed
+
+ private void jTree1ValueChanged(javax.swing.event.TreeSelectionEvent evt)
+ {
+ TreePath path = jTree1.getSelectionPath();
+ if (path != null)
+ {
+ try
+ {
+ Object selectedNode = path.getLastPathComponent();
+ String data=convertToString(selectedNode);
+
+
+
+ if (data != null)
+ {
+ jTextPane1.setText(data);
+ }
+ else
+ {
+ jTextPane1.setText( "" );
+ }
+ }
+ catch (Exception e)
+ {
+ e.printStackTrace();
+ }
+ }
+ }//GEN-LAST:event_jTree1ValueChanged
+
+ private String convertToString( Object selectedNode )
+ {
+ String data = null;
+ if(selectedNode instanceof COSBoolean)
+ {
+ data = "" + ((COSBoolean)selectedNode).getValue();
+ }
+ else if( selectedNode instanceof COSFloat )
+ {
+ data = "" + ((COSFloat)selectedNode).floatValue();
+ }
+ else if( selectedNode instanceof COSNull )
+ {
+ data = "null";
+ }
+ else if( selectedNode instanceof COSInteger )
+ {
+ data = "" + ((COSInteger)selectedNode).intValue();
+ }
+ else if( selectedNode instanceof COSName )
+ {
+ data = "" + ((COSName)selectedNode).getName();
+ }
+ else if( selectedNode instanceof COSString )
+ {
+ data = "" + ((COSString)selectedNode).getString();
+ }
+ else if( selectedNode instanceof COSStream )
+ {
+ try
+ {
+ COSStream stream = (COSStream)selectedNode;
+ InputStream ioStream = stream.getUnfilteredStream();
+ ByteArrayOutputStream byteArray = new ByteArrayOutputStream();
+ byte[] buffer = new byte[1024];
+ int amountRead = 0;
+ while( (amountRead = ioStream.read( buffer, 0, buffer.length ) ) != -1 )
+ {
+ byteArray.write( buffer, 0, amountRead );
+ }
+ data = byteArray.toString();
+ }
+ catch( IOException e )
+ {
+ e.printStackTrace();
+ }
+ }
+ else if( selectedNode instanceof MapEntry )
+ {
+ data = convertToString( ((MapEntry)selectedNode).getValue() );
+ }
+ else if( selectedNode instanceof ArrayEntry )
+ {
+ data = convertToString( ((ArrayEntry)selectedNode).getValue() );
+ }
+ return data;
+ }
+
+ private void exitMenuItemActionPerformed(java.awt.event.ActionEvent evt)
+ {
+ System.exit(0);
+ }
+
+ /**
+ * Exit the Application.
+ */
+ private void exitForm(java.awt.event.WindowEvent evt)
+ {
+ System.exit(0);
+ }
+
+ /**
+ * @param args the command line arguments
+ *
+ * @throws Exception If anything goes wrong.
+ */
+ public static void main(String[] args) throws Exception
+ {
+ PDFDebugger viewer = new PDFDebugger();
+ if( args.length >0 )
+ {
+ viewer.readPDFFile( args[0] );
+ }
+ viewer.show();
+ }
+
+ private void readPDFFile(String file) throws Exception
+ {
+ InputStream input = null;
+ File f = new File( file );
+ input = new FileInputStream(f);
+ PDDocument document = parseDocument( input );
+ TreeModel model=new PDFTreeModel(document);
+ jTree1.setModel(model);
+ setTitle( "PDFBox - " + f.getAbsolutePath() );
+ /*
+ List pages = document.getDocumentCatalog().getAllPages();
+ for( int i=0; i<pages.size(); i++ )
+ {
+ PageWrapper wrapper = new PageWrapper();
+ wrapper.displayPage( (PDPage)pages.get(i) );
+ documentPanel.add( wrapper.getPanel() );
+ }*/
+ }
+ /**
+ * This will parse a document.
+ *
+ * @param input The input stream for the document.
+ *
+ * @return The document.
+ *
+ * @throws IOException If there is an error parsing the document.
+ */
+ private static PDDocument parseDocument( InputStream input )throws IOException
+ {
+ PDDocument document = PDDocument.load( input );
+ if( document.isEncrypted() )
+ {
+ try
+ {
+ document.decrypt( "" );
+ }
+ catch( InvalidPasswordException e )
+ {
+ System.err.println( "Error: The document is encrypted." );
+ }
+ catch( org.pdfbox.exceptions.CryptographyException e )
+ {
+ e.printStackTrace();
+ }
+ }
+
+ return document;
+ }
+ // Variables declaration - do not modify//GEN-BEGIN:variables
+ private javax.swing.JMenuItem aboutMenuItem;
+ private javax.swing.JMenuItem contentsMenuItem;
+ private javax.swing.JMenuItem copyMenuItem;
+ private javax.swing.JMenuItem cutMenuItem;
+ private javax.swing.JMenuItem deleteMenuItem;
+ private javax.swing.JMenu editMenu;
+ private javax.swing.JMenuItem exitMenuItem;
+ private javax.swing.JMenu fileMenu;
+ private javax.swing.JMenu helpMenu;
+ private javax.swing.JScrollPane jScrollPane1;
+ private javax.swing.JScrollPane jScrollPane2;
+ private javax.swing.JSplitPane jSplitPane1;
+ private javax.swing.JTextPane jTextPane1;
+ private javax.swing.JTree jTree1;
+ private javax.swing.JMenuBar menuBar;
+ private javax.swing.JMenuItem openMenuItem;
+ private javax.swing.JMenuItem pasteMenuItem;
+ private javax.swing.JMenuItem saveAsMenuItem;
+ private javax.swing.JMenuItem saveMenuItem;
+ private JPanel documentPanel = new JPanel();
+ // End of variables declaration//GEN-END:variables
+
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/PDFReader.java b/src/main/java/org/pdfbox/PDFReader.java
new file mode 100644
index 0000000..cf9f548
--- /dev/null
+++ b/src/main/java/org/pdfbox/PDFReader.java
@@ -0,0 +1,308 @@
+/**
+ * Copyright (c) 2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox;
+
+import org.pdfbox.exceptions.InvalidPasswordException;
+
+import org.pdfbox.pdfviewer.PageWrapper;
+import org.pdfbox.pdfviewer.ReaderBottomPanel;
+
+import org.pdfbox.pdmodel.PDDocument;
+import org.pdfbox.pdmodel.PDPage;
+
+import org.pdfbox.util.DefaultFileFilter;
+
+import javax.swing.JFileChooser;
+import javax.swing.JScrollPane;
+import javax.swing.JPanel;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStream;
+import java.io.IOException;
+import java.util.List;
+
+/**
+ * An application to read PDF documents. This will provide Acrobat Reader like
+ * funtionality.
+ *
+ * @author Ben Litchfield (ben@pdfbox.org)
+ * @version $Revision: 1.2 $
+ */
+public class PDFReader extends javax.swing.JFrame
+{
+ private File currentDir=new File(".");
+
+ /**
+ * Constructor.
+ */
+ public PDFReader()
+ {
+ initComponents();
+ }
+
+ /**
+ * This method is called from within the constructor to
+ * initialize the form.
+ * WARNING: Do NOT modify this code. The content of this method is
+ * always regenerated by the Form Editor.
+ */
+ private void initComponents()
+ {
+ menuBar = new javax.swing.JMenuBar();
+ fileMenu = new javax.swing.JMenu();
+ openMenuItem = new javax.swing.JMenuItem();
+ saveMenuItem = new javax.swing.JMenuItem();
+ saveAsMenuItem = new javax.swing.JMenuItem();
+ exitMenuItem = new javax.swing.JMenuItem();
+ editMenu = new javax.swing.JMenu();
+ cutMenuItem = new javax.swing.JMenuItem();
+ copyMenuItem = new javax.swing.JMenuItem();
+ pasteMenuItem = new javax.swing.JMenuItem();
+ deleteMenuItem = new javax.swing.JMenuItem();
+ helpMenu = new javax.swing.JMenu();
+ contentsMenuItem = new javax.swing.JMenuItem();
+ aboutMenuItem = new javax.swing.JMenuItem();
+
+
+ setTitle("PDFBox - PDF Reader");
+ addWindowListener(new java.awt.event.WindowAdapter()
+ {
+ public void windowClosing(java.awt.event.WindowEvent evt)
+ {
+ exitForm(evt);
+ }
+ });
+
+
+ JScrollPane documentScroller = new JScrollPane();
+ documentScroller.setViewportView( documentPanel );
+
+
+ getContentPane().add( documentScroller, java.awt.BorderLayout.CENTER );
+ getContentPane().add( bottomStatusPanel, java.awt.BorderLayout.SOUTH );
+
+ fileMenu.setText("File");
+ openMenuItem.setText("Open");
+ openMenuItem.setToolTipText("Open PDF file");
+ openMenuItem.addActionListener(new java.awt.event.ActionListener()
+ {
+ public void actionPerformed(java.awt.event.ActionEvent evt)
+ {
+ openMenuItemActionPerformed(evt);
+ }
+ });
+
+ fileMenu.add(openMenuItem);
+
+ saveMenuItem.setText("Save");
+ //fileMenu.add(saveMenuItem);
+
+ saveAsMenuItem.setText("Save As ...");
+ //fileMenu.add(saveAsMenuItem);
+
+ exitMenuItem.setText("Exit");
+ exitMenuItem.addActionListener(new java.awt.event.ActionListener()
+ {
+ public void actionPerformed(java.awt.event.ActionEvent evt)
+ {
+ exitMenuItemActionPerformed(evt);
+ }
+ });
+
+ fileMenu.add(exitMenuItem);
+
+ menuBar.add(fileMenu);
+
+ editMenu.setText("Edit");
+ cutMenuItem.setText("Cut");
+ editMenu.add(cutMenuItem);
+
+ copyMenuItem.setText("Copy");
+ editMenu.add(copyMenuItem);
+
+ pasteMenuItem.setText("Paste");
+ editMenu.add(pasteMenuItem);
+
+ deleteMenuItem.setText("Delete");
+ editMenu.add(deleteMenuItem);
+
+ //menuBar.add(editMenu);
+
+ helpMenu.setText("Help");
+ contentsMenuItem.setText("Contents");
+ helpMenu.add(contentsMenuItem);
+
+ aboutMenuItem.setText("About");
+ helpMenu.add(aboutMenuItem);
+
+ //menuBar.add(helpMenu);
+
+ setJMenuBar(menuBar);
+
+
+ java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
+ setBounds((screenSize.width-700)/2, (screenSize.height-600)/2, 700, 600);
+ }//GEN-END:initComponents
+
+ private void openMenuItemActionPerformed(java.awt.event.ActionEvent evt)
+ {
+ JFileChooser chooser = new JFileChooser();
+ chooser.setCurrentDirectory(currentDir);
+
+ DefaultFileFilter pdfFilter = new DefaultFileFilter(new String[] {"pdf", "PDF"}, "PDF Files");
+ chooser.setFileFilter(pdfFilter);
+ int result = chooser.showOpenDialog(PDFReader.this);
+ if (result == JFileChooser.APPROVE_OPTION)
+ {
+ String name = chooser.getSelectedFile().getPath();
+ currentDir = new File(name).getParentFile();
+ try
+ {
+ openPDFFile(name);
+ }
+ catch (Exception e)
+ {
+ e.printStackTrace();
+ }
+ }
+ }//GEN-LAST:event_openMenuItemActionPerformed
+
+ private void exitMenuItemActionPerformed(java.awt.event.ActionEvent evt)
+ {
+ System.exit(0);
+ }
+
+ /**
+ * Exit the Application.
+ */
+ private void exitForm(java.awt.event.WindowEvent evt)
+ {
+ System.exit(0);
+ }
+
+ /**
+ * @param args the command line arguments
+ *
+ * @throws Exception If anything goes wrong.
+ */
+ public static void main(String[] args) throws Exception
+ {
+ PDFReader viewer = new PDFReader();
+ if( args.length >0 )
+ {
+ viewer.openPDFFile( args[0] );
+ }
+ viewer.show();
+ }
+
+ private void openPDFFile(String file) throws Exception
+ {
+ if( document != null )
+ {
+ document.close();
+ documentPanel.removeAll();
+ }
+ InputStream input = null;
+ File f = new File( file );
+ input = new FileInputStream(f);
+ document = parseDocument( input );
+ setTitle( "PDFBox - " + f.getAbsolutePath() );
+
+ List pages = document.getDocumentCatalog().getAllPages();
+ for( int i=0; i<pages.size(); i++ )
+ {
+ PageWrapper wrapper = new PageWrapper( this );
+ wrapper.displayPage( (PDPage)pages.get(i) );
+ documentPanel.add( wrapper.getPanel() );
+ }
+ }
+ /**
+ * This will parse a document.
+ *
+ * @param input The input stream for the document.
+ *
+ * @return The document.
+ *
+ * @throws IOException If there is an error parsing the document.
+ */
+ private static PDDocument parseDocument( InputStream input )throws IOException
+ {
+ PDDocument document = PDDocument.load( input );
+ if( document.isEncrypted() )
+ {
+ try
+ {
+ document.decrypt( "" );
+ }
+ catch( InvalidPasswordException e )
+ {
+ System.err.println( "Error: The document is encrypted." );
+ }
+ catch( org.pdfbox.exceptions.CryptographyException e )
+ {
+ e.printStackTrace();
+ }
+ }
+
+ return document;
+ }
+ // Variables declaration - do not modify//GEN-BEGIN:variables
+ private javax.swing.JMenuItem aboutMenuItem;
+ private javax.swing.JMenuItem contentsMenuItem;
+ private javax.swing.JMenuItem copyMenuItem;
+ private javax.swing.JMenuItem cutMenuItem;
+ private javax.swing.JMenuItem deleteMenuItem;
+ private javax.swing.JMenu editMenu;
+ private javax.swing.JMenuItem exitMenuItem;
+ private javax.swing.JMenu fileMenu;
+ private javax.swing.JMenu helpMenu;
+ private javax.swing.JMenuBar menuBar;
+ private javax.swing.JMenuItem openMenuItem;
+ private javax.swing.JMenuItem pasteMenuItem;
+ private javax.swing.JMenuItem saveAsMenuItem;
+ private javax.swing.JMenuItem saveMenuItem;
+ private JPanel documentPanel = new JPanel();
+ private ReaderBottomPanel bottomStatusPanel = new ReaderBottomPanel();
+ // End of variables declaration//GEN-END:variables
+
+ private PDDocument document = null;
+
+ /**
+ * Get the bottom status panel.
+ *
+ * @return The bottom status panel.
+ */
+ public ReaderBottomPanel getBottomStatusPanel()
+ {
+ return bottomStatusPanel;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/PDFSplit.java b/src/main/java/org/pdfbox/PDFSplit.java
new file mode 100644
index 0000000..2a5a3c9
--- /dev/null
+++ b/src/main/java/org/pdfbox/PDFSplit.java
@@ -0,0 +1,227 @@
+/**
+ * Copyright (c) 2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+
+import java.util.List;
+
+import org.pdfbox.exceptions.InvalidPasswordException;
+import org.pdfbox.exceptions.COSVisitorException;
+
+import org.pdfbox.pdfparser.PDFParser;
+
+import org.pdfbox.pdmodel.PDDocument;
+
+import org.pdfbox.pdfwriter.COSWriter;
+
+import org.pdfbox.util.Splitter;
+
+/**
+ * This is the main program that will take a pdf document and split it into
+ * a number of other documents.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.5 $
+ */
+public class PDFSplit
+{
+ private static final String PASSWORD = "-password";
+ private static final String SPLIT = "-split";
+
+ /**
+ * Infamous main method.
+ *
+ * @param args Command line arguments, should be one and a reference to a file.
+ *
+ * @throws Exception If there is an error parsing the document.
+ */
+ public static void main( String[] args ) throws Exception
+ {
+ PDFSplit split = new PDFSplit();
+ split.split( args );
+ }
+
+ private void split( String[] args ) throws Exception
+ {
+ String password = "";
+ String split = "1";
+
+ Splitter splitter = new Splitter();
+ String pdfFile = null;
+ for( int i=0; i<args.length; i++ )
+ {
+ if( args[i].equals( PASSWORD ) )
+ {
+ i++;
+ if( i >= args.length )
+ {
+ usage();
+ }
+ password = args[i];
+ }
+ else if( args[i].equals( SPLIT ) )
+ {
+ i++;
+ if( i >= args.length )
+ {
+ usage();
+ }
+ split = args[i];
+ }
+ else
+ {
+ if( pdfFile == null )
+ {
+ pdfFile = args[i];
+ }
+ }
+ }
+
+ if( pdfFile == null )
+ {
+ usage();
+ }
+
+ InputStream input = null;
+ PDDocument document = null;
+ List documents = null;
+ try
+ {
+ input = new FileInputStream( pdfFile );
+ document = parseDocument( input );
+
+ if( document.isEncrypted() )
+ {
+ try
+ {
+ document.decrypt( password );
+ }
+ catch( InvalidPasswordException e )
+ {
+ if( args.length == 4 )//they supplied the wrong password
+ {
+ System.err.println( "Error: The supplied password is incorrect." );
+ System.exit( 2 );
+ }
+ else
+ {
+ //they didn't suppply a password and the default of "" was wrong.
+ System.err.println( "Error: The document is encrypted." );
+ usage();
+ }
+ }
+ }
+
+ splitter.setSplitAtPage( Integer.parseInt( split ) );
+ documents = splitter.split( document );
+ for( int i=0; i<documents.size(); i++ )
+ {
+ PDDocument doc = (PDDocument)documents.get( i );
+ String fileName = pdfFile.substring(0, pdfFile.length()-4 ) + "-" + i + ".pdf";
+ writeDocument( doc, fileName );
+ doc.close();
+ }
+
+ }
+ finally
+ {
+ if( input != null )
+ {
+ input.close();
+ }
+ if( document != null )
+ {
+ document.close();
+ }
+ for( int i=0; documents != null && i<documents.size(); i++ )
+ {
+ PDDocument doc = (PDDocument)documents.get( i );
+ doc.close();
+ }
+ }
+ }
+
+ private static final void writeDocument( PDDocument doc, String fileName ) throws IOException, COSVisitorException
+ {
+ FileOutputStream output = null;
+ COSWriter writer = null;
+ try
+ {
+ output = new FileOutputStream( fileName );
+ writer = new COSWriter( output );
+ writer.write( doc );
+ }
+ finally
+ {
+ if( output != null )
+ {
+ output.close();
+ }
+ if( writer != null )
+ {
+ writer.close();
+ }
+ }
+ }
+
+ /**
+ * This will parse a document.
+ *
+ * @param input The input stream for the document.
+ *
+ * @return The document.
+ *
+ * @throws IOException If there is an error parsing the document.
+ */
+ private static PDDocument parseDocument( InputStream input )throws IOException
+ {
+ PDFParser parser = new PDFParser( input );
+ parser.parse();
+ return parser.getPDDocument();
+ }
+
+ /**
+ * This will print the usage requirements and exit.
+ */
+ private static void usage()
+ {
+ System.err.println( "Usage: java org.pdfbox.PDFSplit [OPTIONS] <PDF file>\n" +
+ " -password <password> Password to decrypt document\n" +
+ " -split <integer> split after this many pages\n" +
+ " <PDF file> The PDF document to use\n"
+ );
+ System.exit( 1 );
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/PDFToImage.java b/src/main/java/org/pdfbox/PDFToImage.java
new file mode 100644
index 0000000..7a6df6b
--- /dev/null
+++ b/src/main/java/org/pdfbox/PDFToImage.java
@@ -0,0 +1,270 @@
+/**
+ * Copyright (c) 2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox;
+
+import java.awt.image.BufferedImage;
+import java.io.File;
+import java.util.Iterator;
+import java.util.List;
+
+import javax.imageio.IIOException;
+import javax.imageio.IIOImage;
+import javax.imageio.ImageIO;
+import javax.imageio.ImageWriteParam;
+import javax.imageio.ImageWriter;
+import javax.imageio.stream.ImageOutputStream;
+
+import org.pdfbox.exceptions.InvalidPasswordException;
+
+import org.pdfbox.pdmodel.PDDocument;
+import org.pdfbox.pdmodel.PDPage;
+
+/**
+ * Convert a PDF document to an image.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.3 $
+ */
+public class PDFToImage
+{
+
+
+
+ private static final String PASSWORD = "-password";
+ private static final String START_PAGE = "-startPage";
+ private static final String END_PAGE = "-endPage";
+ private static final String IMAGE_TYPE = "-imageType";
+ private static final String OUTPUT_PREFIX = "-outputPrefix";
+
+ /**
+ * private constructor.
+ */
+ private PDFToImage()
+ {
+ //static class
+ }
+
+ /**
+ * Infamous main method.
+ *
+ * @param args Command line arguments, should be one and a reference to a file.
+ *
+ * @throws Exception If there is an error parsing the document.
+ */
+ public static void main( String[] args ) throws Exception
+ {
+ String password = "";
+ String pdfFile = null;
+ String outputPrefix = null;
+ String imageType = "jpg";
+ int startPage = 1;
+ int endPage = Integer.MAX_VALUE;
+ for( int i=0; i<args.length; i++ )
+ {
+ if( args[i].equals( PASSWORD ) )
+ {
+ i++;
+ if( i >= args.length )
+ {
+ usage();
+ }
+ password = args[i];
+ }
+ else if( args[i].equals( START_PAGE ) )
+ {
+ i++;
+ if( i >= args.length )
+ {
+ usage();
+ }
+ startPage = Integer.parseInt( args[i] );
+ }
+ else if( args[i].equals( END_PAGE ) )
+ {
+ i++;
+ if( i >= args.length )
+ {
+ usage();
+ }
+ endPage = Integer.parseInt( args[i] );
+ }
+ else if( args[i].equals( IMAGE_TYPE ) )
+ {
+ i++;
+ imageType = args[i];
+ }
+ else if( args[i].equals( OUTPUT_PREFIX ) )
+ {
+ i++;
+ outputPrefix = args[i];
+ }
+ else
+ {
+ if( pdfFile == null )
+ {
+ pdfFile = args[i];
+ }
+ }
+ }
+
+ if( pdfFile == null )
+ {
+ usage();
+ }
+ if(outputPrefix == null)
+ {
+ outputPrefix = pdfFile.substring( 0, pdfFile.lastIndexOf( '.' ));
+ }
+
+ PDDocument document = null;
+ try
+ {
+ document = PDDocument.load( pdfFile );
+
+
+ //document.print();
+ if( document.isEncrypted() )
+ {
+ try
+ {
+ document.decrypt( password );
+ }
+ catch( InvalidPasswordException e )
+ {
+ if( args.length == 4 )//they supplied the wrong password
+ {
+ System.err.println( "Error: The supplied password is incorrect." );
+ System.exit( 2 );
+ }
+ else
+ {
+ //they didn't suppply a password and the default of "" was wrong.
+ System.err.println( "Error: The document is encrypted." );
+ usage();
+ }
+ }
+ }
+ List pages = document.getDocumentCatalog().getAllPages();
+ for( int i=startPage-1; i<endPage && i<pages.size(); i++ )
+ {
+ ImageOutputStream output = null;
+ ImageWriter imageWriter = null;
+ try
+ {
+ PDPage page = (PDPage)pages.get( i );
+ BufferedImage image = page.convertToImage();
+ String fileName = outputPrefix + (i+1) + "." + imageType;
+ System.out.println( "Writing:" + fileName );
+ output = ImageIO.createImageOutputStream( new File( fileName ) );
+
+ boolean foundWriter = false;
+ Iterator writerIter = ImageIO.getImageWritersByFormatName( imageType );
+ while( writerIter.hasNext() && !foundWriter )
+ {
+ try
+ {
+ imageWriter = (ImageWriter)writerIter.next();
+ ImageWriteParam writerParams = imageWriter.getDefaultWriteParam();
+ if(writerParams.canWriteCompressed() )
+ {
+ writerParams.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
+ writerParams.setCompressionQuality(1.0f);
+ }
+
+
+ imageWriter.setOutput( output );
+ imageWriter.write( null, new IIOImage( image, null, null), writerParams );
+ foundWriter = true;
+ }
+ catch( IIOException io )
+ {
+ //ignore exception
+ }
+ finally
+ {
+ imageWriter.dispose();
+ }
+ }
+ if( !foundWriter )
+ {
+ throw new RuntimeException( "Error: no writer found for image type '" + imageType + "'" );
+ }
+ }
+ finally
+ {
+ if( output != null )
+ {
+ output.flush();
+ output.close();
+ }
+ }
+ }
+ }
+ finally
+ {
+ if( document != null )
+ {
+ document.close();
+ }
+ }
+ }
+
+ /**
+ * This will print the usage requirements and exit.
+ */
+ private static void usage()
+ {
+ System.err.println( "Usage: java org.pdfbox.ExtractText [OPTIONS] <PDF file> [Text File]\n" +
+ " -password <password> Password to decrypt document\n" +
+ " -imageType <image type> (" + getImageFormats() + ")\n" +
+ " -outputPrefix <output prefix> Filename prefix for image files\n" +
+ " -startPage <number> The first page to start extraction(1 based)\n" +
+ " -endPage <number> The last page to extract(inclusive)\n" +
+ " <PDF file> The PDF document to use\n"
+ );
+ System.exit( 1 );
+ }
+
+ private static String getImageFormats()
+ {
+ StringBuffer retval = new StringBuffer();
+ String[] formats = ImageIO.getReaderFormatNames();
+ for( int i=0; i<formats.length; i++ )
+ {
+ retval.append( formats[i] );
+ if( i+1<formats.length )
+ {
+ retval.append( "," );
+ }
+ }
+ return retval.toString();
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/PrintPDF.java b/src/main/java/org/pdfbox/PrintPDF.java
new file mode 100644
index 0000000..8db25d7
--- /dev/null
+++ b/src/main/java/org/pdfbox/PrintPDF.java
@@ -0,0 +1,118 @@
+/**
+ * Copyright (c) 2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox;
+
+import org.pdfbox.pdmodel.PDDocument;
+
+/**
+ * This is a command line program that will print a PDF document.
+ *
+ * @author Ben Litchfield (ben@benlitchfield.com)
+ * @version $Revision: 1.1 $
+ */
+public class PrintPDF
+{
+
+ private static final String PASSWORD = "-password";
+
+ /**
+ * private constructor.
+ */
+ private PrintPDF()
+ {
+ //static class
+ }
+
+ /**
+ * Infamous main method.
+ *
+ * @param args Command line arguments, should be one and a reference to a file.
+ *
+ * @throws Exception If there is an error parsing the document.
+ */
+ public static void main( String[] args ) throws Exception
+ {
+ String password = "";
+ String pdfFile = null;
+ for( int i=0; i<args.length; i++ )
+ {
+ if( args[i].equals( PASSWORD ) )
+ {
+ i++;
+ if( i >= args.length )
+ {
+ usage();
+ }
+ password = args[i];
+ }
+ else
+ {
+ pdfFile = args[i];
+ }
+ }
+
+ if( pdfFile == null )
+ {
+ usage();
+ }
+
+ PDDocument document = null;
+ try
+ {
+ document = PDDocument.load( pdfFile );
+
+ if( document.isEncrypted() )
+ {
+ document.decrypt( password );
+ }
+
+ document.print();
+ }
+ finally
+ {
+ if( document != null )
+ {
+ document.close();
+ }
+ }
+ }
+
+ /**
+ * This will print the usage requirements and exit.
+ */
+ private static void usage()
+ {
+ System.err.println( "Usage: java org.pdfbox.PrintPDF [OPTIONS] <PDF file>\n" +
+ " -password <password> Password to decrypt document\n"
+ );
+ System.exit( 1 );
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/TextToPDF.java b/src/main/java/org/pdfbox/TextToPDF.java
new file mode 100644
index 0000000..413d981
--- /dev/null
+++ b/src/main/java/org/pdfbox/TextToPDF.java
@@ -0,0 +1,259 @@
+/**
+ * Copyright (c) 2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.Reader;
+
+import org.pdfbox.pdmodel.PDDocument;
+import org.pdfbox.pdmodel.PDPage;
+
+import org.pdfbox.pdmodel.edit.PDPageContentStream;
+import org.pdfbox.pdmodel.font.PDSimpleFont;
+import org.pdfbox.pdmodel.font.PDTrueTypeFont;
+import org.pdfbox.pdmodel.font.PDType1Font;
+
+
+/**
+ * This will take a text file and ouput a pdf with that text.
+ *
+ * @author Ben Litchfield (ben@benlitchfield.com)
+ * @version $Revision: 1.3 $
+ */
+public class TextToPDF
+{
+ private int fontSize = 10;
+ private PDSimpleFont font = PDType1Font.HELVETICA;
+
+ /**
+ * Create a PDF document with some text.
+ *
+ * @param text The stream of text data.
+ *
+ * @return The document with the text in it.
+ *
+ * @throws IOException If there is an error writing the data.
+ */
+ public PDDocument createPDFFromText( Reader text ) throws IOException
+ {
+ PDDocument doc = null;
+ try
+ {
+
+ int margin = 40;
+ float height = font.getFontDescriptor().getFontBoundingBox().getHeight()/1000;
+
+ //calculate font height and increase by 5 percent.
+ height = height*fontSize*1.05f;
+ doc = new PDDocument();
+ BufferedReader data = new BufferedReader( text );
+ String nextLine = null;
+ PDPage page = new PDPage();
+ PDPageContentStream contentStream = null;
+ float y = -1;
+ float maxStringLength = page.getMediaBox().getWidth() - 2*margin;
+ while( (nextLine = data.readLine()) != null )
+ {
+
+ String[] lineWords = nextLine.trim().split( " " );
+ int lineIndex = 0;
+ while( lineIndex < lineWords.length )
+ {
+ StringBuffer nextLineToDraw = new StringBuffer();
+ float lengthIfUsingNextWord = 0;
+ do
+ {
+ nextLineToDraw.append( lineWords[lineIndex] );
+ nextLineToDraw.append( " " );
+ lineIndex++;
+ if( lineIndex < lineWords.length )
+ {
+ String lineWithNextWord = nextLineToDraw.toString() + lineWords[lineIndex];
+ lengthIfUsingNextWord =
+ (font.getStringWidth( lineWithNextWord )/1000) * fontSize;
+ }
+ }
+ while( lineIndex < lineWords.length &&
+ lengthIfUsingNextWord < maxStringLength );
+ if( y < margin )
+ {
+ page = new PDPage();
+ doc.addPage( page );
+ if( contentStream != null )
+ {
+ contentStream.endText();
+ contentStream.close();
+ }
+ contentStream = new PDPageContentStream(doc, page);
+ contentStream.setFont( font, fontSize );
+ contentStream.beginText();
+ y = page.getMediaBox().getHeight() - margin + height;
+ contentStream.moveTextPositionByAmount(
+ margin, y );
+
+ }
+ //System.out.println( "Drawing string at " + x + "," + y );
+
+
+ contentStream.moveTextPositionByAmount( 0, -height);
+ y -= height;
+ contentStream.drawString( nextLineToDraw.toString() );
+ }
+
+
+ }
+ if( contentStream != null )
+ {
+ contentStream.endText();
+ contentStream.close();
+ }
+ }
+ catch( IOException io )
+ {
+ if( doc != null )
+ {
+ doc.close();
+ }
+ throw io;
+ }
+ return doc;
+ }
+
+ /**
+ * This will create a PDF document with a single image on it.
+ * <br />
+ * see usage() for commandline
+ *
+ * @param args Command line arguments.
+ *
+ * @throws IOException If there is an error with the PDF.
+ */
+ public static void main(String[] args) throws IOException
+ {
+ TextToPDF app = new TextToPDF();
+ PDDocument doc = null;
+ try
+ {
+ if( args.length < 2 )
+ {
+ app.usage();
+ }
+ else
+ {
+ for( int i=0; i<args.length-2; i++ )
+ {
+ if( args[i].equals( "-standardFont" ))
+ {
+ i++;
+ app.setFont( PDType1Font.getStandardFont( args[i] ));
+ }
+ else if( args[i].equals( "-ttf" ))
+ {
+ i++;
+ PDTrueTypeFont font = PDTrueTypeFont.loadTTF( doc, new File( args[i]));
+ app.setFont( font );
+ }
+ else if( args[i].equals( "-fontSize" ))
+ {
+ i++;
+ app.setFontSize( Integer.parseInt( args[i] ) );
+ }
+ else
+ {
+ throw new IOException( "Unknown argument:" + args[i] );
+ }
+ }
+ doc = app.createPDFFromText( new FileReader( args[args.length-1] ) );
+ doc.save( args[args.length-2] );
+ }
+ }
+ catch (Exception e)
+ {
+ e.printStackTrace();
+ }
+ finally
+ {
+ if( doc != null )
+ {
+ doc.close();
+ }
+ }
+ }
+
+ /**
+ * This will print out a message telling how to use this example.
+ */
+ private void usage()
+ {
+ String[] std14 = PDType1Font.getStandard14Names();
+ System.err.println( "usage: " + this.getClass().getName() + " [options] <output-file> <text-file>" );
+ System.err.println( " -standardFont <name> default:" + PDType1Font.HELVETICA.getBaseFont() );
+ for( int i=0; i<std14.length; i++ )
+ {
+ System.err.println( " " + std14[i] );
+ }
+ System.err.println( " -ttf <ttf file> The TTF font to use.");
+ System.err.println( " -fontSize <fontSize> default:10" );
+
+
+ }
+ /**
+ * @return Returns the font.
+ */
+ public PDSimpleFont getFont()
+ {
+ return font;
+ }
+ /**
+ * @param aFont The font to set.
+ */
+ public void setFont(PDSimpleFont aFont)
+ {
+ this.font = aFont;
+ }
+ /**
+ * @return Returns the fontSize.
+ */
+ public int getFontSize()
+ {
+ return fontSize;
+ }
+ /**
+ * @param aFontSize The fontSize to set.
+ */
+ public void setFontSize(int aFontSize)
+ {
+ this.fontSize = aFontSize;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/Version.java b/src/main/java/org/pdfbox/Version.java
new file mode 100644
index 0000000..b2e2f34
--- /dev/null
+++ b/src/main/java/org/pdfbox/Version.java
@@ -0,0 +1,100 @@
+/**
+ * Copyright (c) 2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox;
+
+import java.io.IOException;
+
+import java.util.Properties;
+
+import org.pdfbox.util.ResourceLoader;
+
+
+/**
+ * A simple command line utility to get the version of PDFBox.
+ *
+ * @author Ben Litchfield (ben@benlitchfield.com)
+ * @version $Revision: 1.3 $
+ */
+public class Version
+{
+ private static final String PDFBOX_VERSION_PROPERTIES = "Resources/pdfbox.version";
+
+ private Version()
+ {
+ //should not be constructed.
+ }
+
+ /**
+ * Get the version of PDFBox or unknown if it is not known.
+ *
+ * @return The version of pdfbox that is being used.
+ */
+ public static String getVersion()
+ {
+ String version = "unknown";
+ try
+ {
+ Properties props = ResourceLoader.loadProperties( PDFBOX_VERSION_PROPERTIES );
+ version = props.getProperty( "pdfbox.version", version );
+ }
+ catch( IOException io )
+ {
+ //if there is a problem loading the properties then don't throw an
+ //exception, 'unknown' will be returned instead.
+ io.printStackTrace();
+ }
+ return version;
+ }
+
+ /**
+ * This will print out the version of PDF to System.out.
+ *
+ * @param args Command line arguments.
+ */
+ public static void main(String[] args)
+ {
+ if( args.length != 0 )
+ {
+ usage();
+ return;
+ }
+ System.out.println( "Version:" + getVersion() );
+ }
+
+ /**
+ * This will print out a message telling how to use this example.
+ */
+ private static void usage()
+ {
+ System.err.println( "usage: " + Version.class.getName() );
+ }
+
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/afmparser/AFMParser.java b/src/main/java/org/pdfbox/afmparser/AFMParser.java
new file mode 100644
index 0000000..44c594d
--- /dev/null
+++ b/src/main/java/org/pdfbox/afmparser/AFMParser.java
@@ -0,0 +1,1084 @@
+/**
+ * Copyright (c) 2003, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.afmparser;
+
+import java.io.InputStream;
+import java.io.IOException;
+
+import java.util.StringTokenizer;
+
+import org.pdfbox.afmtypes.Composite;
+import org.pdfbox.afmtypes.CompositePart;
+import org.pdfbox.afmtypes.CharMetric;
+import org.pdfbox.afmtypes.FontMetric;
+import org.pdfbox.afmtypes.KernPair;
+import org.pdfbox.afmtypes.Ligature;
+import org.pdfbox.afmtypes.TrackKern;
+
+import org.pdfbox.util.BoundingBox;
+
+/**
+ * This class is used to parse AFM(Adobe Font Metrics) documents.
+ *
+ * @see <A href="http://partners.adobe.com/asn/developer/type/">AFM Documentation</A>
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.9 $
+ */
+public class AFMParser
+{
+ /**
+ * This is a comment in a AFM file.
+ */
+ public static final String COMMENT = "Comment";
+ /**
+ * This is the constant used in the AFM file to start a font metrics item.
+ */
+ public static final String START_FONT_METRICS = "StartFontMetrics";
+ /**
+ * This is the constant used in the AFM file to end a font metrics item.
+ */
+ public static final String END_FONT_METRICS = "EndFontMetrics";
+ /**
+ * This is the font name.
+ */
+ public static final String FONT_NAME = "FontName";
+ /**
+ * This is the full name.
+ */
+ public static final String FULL_NAME = "FullName";
+ /**
+ * This is the Family name.
+ */
+ public static final String FAMILY_NAME = "FamilyName";
+ /**
+ * This is the weight.
+ */
+ public static final String WEIGHT = "Weight";
+ /**
+ * This is the font bounding box.
+ */
+ public static final String FONT_BBOX = "FontBBox";
+ /**
+ * This is the version of the font.
+ */
+ public static final String VERSION = "Version";
+ /**
+ * This is the notice.
+ */
+ public static final String NOTICE = "Notice";
+ /**
+ * This is the encoding scheme.
+ */
+ public static final String ENCODING_SCHEME = "EncodingScheme";
+ /**
+ * This is the mapping scheme.
+ */
+ public static final String MAPPING_SCHEME = "MappingScheme";
+ /**
+ * This is the escape character.
+ */
+ public static final String ESC_CHAR = "EscChar";
+ /**
+ * This is the character set.
+ */
+ public static final String CHARACTER_SET = "CharacterSet";
+ /**
+ * This is the characters attribute.
+ */
+ public static final String CHARACTERS = "Characters";
+ /**
+ * This will determine if this is a base font.
+ */
+ public static final String IS_BASE_FONT = "IsBaseFont";
+ /**
+ * This is the V Vector attribute.
+ */
+ public static final String V_VECTOR = "VVector";
+ /**
+ * This will tell if the V is fixed.
+ */
+ public static final String IS_FIXED_V = "IsFixedV";
+ /**
+ * This is the cap height attribute.
+ */
+ public static final String CAP_HEIGHT = "CapHeight";
+ /**
+ * This is the X height.
+ */
+ public static final String X_HEIGHT = "XHeight";
+ /**
+ * This is ascender attribute.
+ */
+ public static final String ASCENDER = "Ascender";
+ /**
+ * This is the descender attribute.
+ */
+ public static final String DESCENDER = "Descender";
+
+ /**
+ * The underline position.
+ */
+ public static final String UNDERLINE_POSITION = "UnderlinePosition";
+ /**
+ * This is the Underline thickness.
+ */
+ public static final String UNDERLINE_THICKNESS = "UnderlineThickness";
+ /**
+ * This is the italic angle.
+ */
+ public static final String ITALIC_ANGLE = "ItalicAngle";
+ /**
+ * This is the char width.
+ */
+ public static final String CHAR_WIDTH = "CharWidth";
+ /**
+ * This will determine if this is fixed pitch.
+ */
+ public static final String IS_FIXED_PITCH = "IsFixedPitch";
+ /**
+ * This is the start of character metrics.
+ */
+ public static final String START_CHAR_METRICS = "StartCharMetrics";
+ /**
+ * This is the end of character metrics.
+ */
+ public static final String END_CHAR_METRICS = "EndCharMetrics";
+ /**
+ * The character metrics c value.
+ */
+ public static final String CHARMETRICS_C = "C";
+ /**
+ * The character metrics c value.
+ */
+ public static final String CHARMETRICS_CH = "CH";
+ /**
+ * The character metrics value.
+ */
+ public static final String CHARMETRICS_WX = "WX";
+ /**
+ * The character metrics value.
+ */
+ public static final String CHARMETRICS_W0X = "W0X";
+ /**
+ * The character metrics value.
+ */
+ public static final String CHARMETRICS_W1X = "W1X";
+ /**
+ * The character metrics value.
+ */
+ public static final String CHARMETRICS_WY = "WY";
+ /**
+ * The character metrics value.
+ */
+ public static final String CHARMETRICS_W0Y = "W0Y";
+ /**
+ * The character metrics value.
+ */
+ public static final String CHARMETRICS_W1Y = "W1Y";
+ /**
+ * The character metrics value.
+ */
+ public static final String CHARMETRICS_W = "W";
+ /**
+ * The character metrics value.
+ */
+ public static final String CHARMETRICS_W0 = "W0";
+ /**
+ * The character metrics value.
+ */
+ public static final String CHARMETRICS_W1 = "W1";
+ /**
+ * The character metrics value.
+ */
+ public static final String CHARMETRICS_VV = "VV";
+ /**
+ * The character metrics value.
+ */
+ public static final String CHARMETRICS_N = "N";
+ /**
+ * The character metrics value.
+ */
+ public static final String CHARMETRICS_B = "B";
+ /**
+ * The character metrics value.
+ */
+ public static final String CHARMETRICS_L = "L";
+ /**
+ * The character metrics value.
+ */
+ public static final String STD_HW = "StdHW";
+ /**
+ * The character metrics value.
+ */
+ public static final String STD_VW = "StdVW";
+ /**
+ * This is the start of track kern data.
+ */
+ public static final String START_TRACK_KERN = "StartTrackKern";
+ /**
+ * This is the end of track kern data.
+ */
+ public static final String END_TRACK_KERN = "EndTrackKern";
+ /**
+ * This is the start of kern data.
+ */
+ public static final String START_KERN_DATA = "StartKernData";
+ /**
+ * This is the end of kern data.
+ */
+ public static final String END_KERN_DATA = "EndKernData";
+ /**
+ * This is the start of kern pairs data.
+ */
+ public static final String START_KERN_PAIRS = "StartKernPairs";
+ /**
+ * This is the end of kern pairs data.
+ */
+ public static final String END_KERN_PAIRS = "EndKernPairs";
+ /**
+ * This is the start of kern pairs data.
+ */
+ public static final String START_KERN_PAIRS0 = "StartKernPairs0";
+ /**
+ * This is the start of kern pairs data.
+ */
+ public static final String START_KERN_PAIRS1 = "StartKernPairs1";
+ /**
+ * This is the start compisites data section.
+ */
+ public static final String START_COMPOSITES = "StartComposites";
+ /**
+ * This is the end compisites data section.
+ */
+ public static final String END_COMPOSITES = "EndComposites";
+ /**
+ * This is a composite character.
+ */
+ public static final String CC = "CC";
+ /**
+ * This is a composite charater part.
+ */
+ public static final String PCC = "PCC";
+ /**
+ * This is a kern pair.
+ */
+ public static final String KERN_PAIR_KP = "KP";
+ /**
+ * This is a kern pair.
+ */
+ public static final String KERN_PAIR_KPH = "KPH";
+ /**
+ * This is a kern pair.
+ */
+ public static final String KERN_PAIR_KPX = "KPX";
+ /**
+ * This is a kern pair.
+ */
+ public static final String KERN_PAIR_KPY = "KPY";
+
+ private static final int BITS_IN_HEX = 16;
+
+
+ private InputStream input;
+ private FontMetric result;
+
+ /**
+ * A method to test parsing of all AFM documents in the resources
+ * directory.
+ *
+ * @param args Ignored.
+ *
+ * @throws IOException If there is an error parsing one of the documents.
+ */
+ public static void main( String[] args ) throws IOException
+ {
+ java.io.File afmDir = new java.io.File( "Resources/afm" );
+ java.io.File[] files = afmDir.listFiles();
+ for( int i=0; i< files.length; i++ )
+ {
+ if( files[i].getPath().toUpperCase().endsWith( ".AFM" ) )
+ {
+ long start = System.currentTimeMillis();
+ java.io.FileInputStream input = new java.io.FileInputStream( files[i] );
+ AFMParser parser = new AFMParser( input );
+ parser.parse();
+ long stop = System.currentTimeMillis();
+ System.out.println( "Parsing:" + files[i].getPath() + " " + (stop-start) );
+ }
+ }
+ }
+
+ /**
+ * Constructor.
+ *
+ * @param in The input stream to read the AFM document from.
+ */
+ public AFMParser( InputStream in )
+ {
+ input = in;
+ }
+
+ /**
+ * This will parse the AFM document. This will close the Input stream
+ * when the parsing is finished.
+ *
+ * @throws IOException If there is an IO error reading the document.
+ */
+ public void parse() throws IOException
+ {
+ result = parseFontMetric();
+ }
+
+ /**
+ * This will get the result of the parsing.
+ *
+ * @return The parsed java object.
+ */
+ public FontMetric getResult()
+ {
+ return result;
+ }
+
+ /**
+ * This will parse a font metrics item.
+ *
+ * @return The parse font metrics item.
+ *
+ * @throws IOException If there is an error reading the AFM file.
+ */
+ private FontMetric parseFontMetric() throws IOException
+ {
+ FontMetric fontMetrics = new FontMetric();
+ String startFontMetrics = readString();
+ if( !START_FONT_METRICS.equals( startFontMetrics ) )
+ {
+ throw new IOException( "Error: The AFM file should start with " + START_FONT_METRICS +
+ " and not '" + startFontMetrics + "'" );
+ }
+ fontMetrics.setAFMVersion( readFloat() );
+ String nextCommand = null;
+ while( !END_FONT_METRICS.equals( (nextCommand = readString() ) ) )
+ {
+ if( FONT_NAME.equals( nextCommand ) )
+ {
+ fontMetrics.setFontName( readLine() );
+ }
+ else if( FULL_NAME.equals( nextCommand ) )
+ {
+ fontMetrics.setFullName( readLine() );
+ }
+ else if( FAMILY_NAME.equals( nextCommand ) )
+ {
+ fontMetrics.setFamilyName( readLine() );
+ }
+ else if( WEIGHT.equals( nextCommand ) )
+ {
+ fontMetrics.setWeight( readLine() );
+ }
+ else if( FONT_BBOX.equals( nextCommand ) )
+ {
+ BoundingBox bBox = new BoundingBox();
+ bBox.setLowerLeftX( readFloat() );
+ bBox.setLowerLeftY( readFloat() );
+ bBox.setUpperRightX( readFloat() );
+ bBox.setUpperRightY( readFloat() );
+ fontMetrics.setFontBBox( bBox );
+ }
+ else if( VERSION.equals( nextCommand ) )
+ {
+ fontMetrics.setFontVersion( readLine() );
+ }
+ else if( NOTICE.equals( nextCommand ) )
+ {
+ fontMetrics.setNotice( readLine() );
+ }
+ else if( ENCODING_SCHEME.equals( nextCommand ) )
+ {
+ fontMetrics.setEncodingScheme( readLine() );
+ }
+ else if( MAPPING_SCHEME.equals( nextCommand ) )
+ {
+ fontMetrics.setMappingScheme( readInt() );
+ }
+ else if( ESC_CHAR.equals( nextCommand ) )
+ {
+ fontMetrics.setEscChar( readInt() );
+ }
+ else if( CHARACTER_SET.equals( nextCommand ) )
+ {
+ fontMetrics.setCharacterSet( readLine() );
+ }
+ else if( CHARACTERS.equals( nextCommand ) )
+ {
+ fontMetrics.setCharacters( readInt() );
+ }
+ else if( IS_BASE_FONT.equals( nextCommand ) )
+ {
+ fontMetrics.setIsBaseFont( readBoolean() );
+ }
+ else if( V_VECTOR.equals( nextCommand ) )
+ {
+ float[] vector = new float[2];
+ vector[0] = readFloat();
+ vector[1] = readFloat();
+ fontMetrics.setVVector( vector );
+ }
+ else if( IS_FIXED_V.equals( nextCommand ) )
+ {
+ fontMetrics.setIsFixedV( readBoolean() );
+ }
+ else if( CAP_HEIGHT.equals( nextCommand ) )
+ {
+ fontMetrics.setCapHeight( readFloat() );
+ }
+ else if( X_HEIGHT.equals( nextCommand ) )
+ {
+ fontMetrics.setXHeight( readFloat() );
+ }
+ else if( ASCENDER.equals( nextCommand ) )
+ {
+ fontMetrics.setAscender( readFloat() );
+ }
+ else if( DESCENDER.equals( nextCommand ) )
+ {
+ fontMetrics.setDescender( readFloat() );
+ }
+ else if( STD_HW.equals( nextCommand ) )
+ {
+ fontMetrics.setStandardHorizontalWidth( readFloat() );
+ }
+ else if( STD_VW.equals( nextCommand ) )
+ {
+ fontMetrics.setStandardVerticalWidth( readFloat() );
+ }
+ else if( COMMENT.equals( nextCommand ) )
+ {
+ fontMetrics.addComment( readLine() );
+ }
+ else if( UNDERLINE_POSITION.equals( nextCommand ) )
+ {
+ fontMetrics.setUnderlinePosition( readFloat() );
+ }
+ else if( UNDERLINE_THICKNESS.equals( nextCommand ) )
+ {
+ fontMetrics.setUnderlineThickness( readFloat() );
+ }
+ else if( ITALIC_ANGLE.equals( nextCommand ) )
+ {
+ fontMetrics.setItalicAngle( readFloat() );
+ }
+ else if( CHAR_WIDTH.equals( nextCommand ) )
+ {
+ float[] widths = new float[2];
+ widths[0] = readFloat();
+ widths[1] = readFloat();
+ fontMetrics.setCharWidth( widths );
+ }
+ else if( IS_FIXED_PITCH.equals( nextCommand ) )
+ {
+ fontMetrics.setFixedPitch( readBoolean() );
+ }
+ else if( START_CHAR_METRICS.equals( nextCommand ) )
+ {
+ int count = readInt();
+ for( int i=0; i<count; i++ )
+ {
+ CharMetric charMetric = parseCharMetric();
+ fontMetrics.addCharMetric( charMetric );
+ }
+ String end = readString();
+ if( !end.equals( END_CHAR_METRICS ) )
+ {
+ throw new IOException( "Error: Expected '" + END_CHAR_METRICS + "' actual '" +
+ end + "'" );
+ }
+ }
+ else if( START_COMPOSITES.equals( nextCommand ) )
+ {
+ int count = readInt();
+ for( int i=0; i<count; i++ )
+ {
+ Composite part = parseComposite();
+ fontMetrics.addComposite( part );
+ }
+ String end = readString();
+ if( !end.equals( END_COMPOSITES ) )
+ {
+ throw new IOException( "Error: Expected '" + END_COMPOSITES + "' actual '" +
+ end + "'" );
+ }
+ }
+ else if( START_KERN_DATA.equals( nextCommand ) )
+ {
+ parseKernData( fontMetrics );
+ }
+ else
+ {
+ throw new IOException( "Unknown AFM key '" + nextCommand + "'" );
+ }
+ }
+ return fontMetrics;
+ }
+
+ /**
+ * This will parse the kern data.
+ *
+ * @param fontMetrics The metrics class to put the parsed data into.
+ *
+ * @throws IOException If there is an error parsing the data.
+ */
+ private void parseKernData( FontMetric fontMetrics ) throws IOException
+ {
+ String nextCommand = null;
+ while( !(nextCommand = readString()).equals( END_KERN_DATA ) )
+ {
+ if( START_TRACK_KERN.equals( nextCommand ) )
+ {
+ int count = readInt();
+ for( int i=0; i<count; i++ )
+ {
+ TrackKern kern = new TrackKern();
+ kern.setDegree( readInt() );
+ kern.setMinPointSize( readFloat() );
+ kern.setMinKern( readFloat() );
+ kern.setMaxPointSize( readFloat() );
+ kern.setMaxKern( readFloat() );
+ fontMetrics.addTrackKern( kern );
+ }
+ String end = readString();
+ if( !end.equals( END_TRACK_KERN ) )
+ {
+ throw new IOException( "Error: Expected '" + END_TRACK_KERN + "' actual '" +
+ end + "'" );
+ }
+ }
+ else if( START_KERN_PAIRS.equals( nextCommand ) )
+ {
+ int count = readInt();
+ for( int i=0; i<count; i++ )
+ {
+ KernPair pair = parseKernPair();
+ fontMetrics.addKernPair( pair );
+ }
+ String end = readString();
+ if( !end.equals( END_KERN_PAIRS ) )
+ {
+ throw new IOException( "Error: Expected '" + END_KERN_PAIRS + "' actual '" +
+ end + "'" );
+ }
+ }
+ else if( START_KERN_PAIRS0.equals( nextCommand ) )
+ {
+ int count = readInt();
+ for( int i=0; i<count; i++ )
+ {
+ KernPair pair = parseKernPair();
+ fontMetrics.addKernPair0( pair );
+ }
+ String end = readString();
+ if( !end.equals( END_KERN_PAIRS ) )
+ {
+ throw new IOException( "Error: Expected '" + END_KERN_PAIRS + "' actual '" +
+ end + "'" );
+ }
+ }
+ else if( START_KERN_PAIRS1.equals( nextCommand ) )
+ {
+ int count = readInt();
+ for( int i=0; i<count; i++ )
+ {
+ KernPair pair = parseKernPair();
+ fontMetrics.addKernPair1( pair );
+ }
+ String end = readString();
+ if( !end.equals( END_KERN_PAIRS ) )
+ {
+ throw new IOException( "Error: Expected '" + END_KERN_PAIRS + "' actual '" +
+ end + "'" );
+ }
+ }
+ else
+ {
+ throw new IOException( "Unknown kerning data type '" + nextCommand + "'" );
+ }
+ }
+ }
+
+ /**
+ * This will parse a kern pair from the data stream.
+ *
+ * @return The kern pair that was parsed from the stream.
+ *
+ * @throws IOException If there is an error reading from the stream.
+ */
+ private KernPair parseKernPair() throws IOException
+ {
+ KernPair kernPair = new KernPair();
+ String cmd = readString();
+ if( KERN_PAIR_KP.equals( cmd ) )
+ {
+ String first = readString();
+ String second = readString();
+ float x = readFloat();
+ float y = readFloat();
+ kernPair.setFirstKernCharacter( first );
+ kernPair.setSecondKernCharacter( second );
+ kernPair.setX( x );
+ kernPair.setY( y );
+ }
+ else if( KERN_PAIR_KPH.equals( cmd ) )
+ {
+ String first = hexToString( readString() );
+ String second = hexToString( readString() );
+ float x = readFloat();
+ float y = readFloat();
+ kernPair.setFirstKernCharacter( first );
+ kernPair.setSecondKernCharacter( second );
+ kernPair.setX( x );
+ kernPair.setY( y );
+ }
+ else if( KERN_PAIR_KPX.equals( cmd ) )
+ {
+ String first = readString();
+ String second = readString();
+ float x = readFloat();
+ kernPair.setFirstKernCharacter( first );
+ kernPair.setSecondKernCharacter( second );
+ kernPair.setX( x );
+ kernPair.setY( 0 );
+ }
+ else if( KERN_PAIR_KPY.equals( cmd ) )
+ {
+ String first = readString();
+ String second = readString();
+ float y = readFloat();
+ kernPair.setFirstKernCharacter( first );
+ kernPair.setSecondKernCharacter( second );
+ kernPair.setX( 0 );
+ kernPair.setY( y );
+ }
+ else
+ {
+ throw new IOException( "Error expected kern pair command actual='" + cmd + "'" );
+ }
+ return kernPair;
+ }
+
+ /**
+ * This will convert and angle bracket hex string to a string.
+ *
+ * @param hexString An angle bracket string.
+ *
+ * @return The bytes of the hex string.
+ *
+ * @throws IOException If the string is in an invalid format.
+ */
+ private String hexToString( String hexString ) throws IOException
+ {
+ if( hexString.length() < 2 )
+ {
+ throw new IOException( "Error: Expected hex string of length >= 2 not='" + hexString );
+ }
+ if( hexString.charAt( 0 ) != '<' ||
+ hexString.charAt( hexString.length() -1 ) != '>' )
+ {
+ throw new IOException( "String should be enclosed by angle brackets '" + hexString+ "'" );
+ }
+ hexString = hexString.substring( 1, hexString.length() -1 );
+ byte[] data = new byte[ (hexString.length() / 2) ];
+ for( int i=0; i<hexString.length(); i+=2 )
+ {
+ String hex = "" + hexString.charAt( i ) + hexString.charAt( i+1 );
+ try
+ {
+ data[ i / 2 ] = (byte)Integer.parseInt( hex, BITS_IN_HEX );
+ }
+ catch( NumberFormatException e )
+ {
+ throw new IOException( "Error parsing AFM file:" + e );
+ }
+ }
+ return new String( data );
+ }
+
+ /**
+ * This will parse a composite part from the stream.
+ *
+ * @return The composite.
+ *
+ * @throws IOException If there is an error parsing the composite.
+ */
+ private Composite parseComposite() throws IOException
+ {
+ Composite composite = new Composite();
+ String partData = readLine();
+ StringTokenizer tokenizer = new StringTokenizer( partData, " ;" );
+
+
+ String cc = tokenizer.nextToken();
+ if( !cc.equals( CC ) )
+ {
+ throw new IOException( "Expected '" + CC + "' actual='" + cc + "'" );
+ }
+ String name = tokenizer.nextToken();
+ composite.setName( name );
+
+ int partCount;
+ try
+ {
+ partCount = Integer.parseInt( tokenizer.nextToken() );
+ }
+ catch( NumberFormatException e )
+ {
+ throw new IOException( "Error parsing AFM document:" + e );
+ }
+ for( int i=0; i<partCount; i++ )
+ {
+ CompositePart part = new CompositePart();
+ String pcc = tokenizer.nextToken();
+ if( !pcc.equals( PCC ) )
+ {
+ throw new IOException( "Expected '" + PCC + "' actual='" + pcc + "'" );
+ }
+ String partName = tokenizer.nextToken();
+ try
+ {
+ int x = Integer.parseInt( tokenizer.nextToken() );
+ int y = Integer.parseInt( tokenizer.nextToken() );
+
+ part.setName( partName );
+ part.setXDisplacement( x );
+ part.setYDisplacement( y );
+ composite.addPart( part );
+ }
+ catch( NumberFormatException e )
+ {
+ throw new IOException( "Error parsing AFM document:" + e );
+ }
+ }
+ return composite;
+ }
+
+ /**
+ * This will parse a single CharMetric object from the stream.
+ *
+ * @return The next char metric in the stream.
+ *
+ * @throws IOException If there is an error reading from the stream.
+ */
+ private CharMetric parseCharMetric() throws IOException
+ {
+ CharMetric charMetric = new CharMetric();
+ String metrics = readLine();
+ StringTokenizer metricsTokenizer = new StringTokenizer( metrics );
+ try
+ {
+ while( metricsTokenizer.hasMoreTokens() )
+ {
+ String nextCommand = metricsTokenizer.nextToken();
+ if( nextCommand.equals( CHARMETRICS_C ) )
+ {
+ String charCode = metricsTokenizer.nextToken();
+ charMetric.setCharacterCode( Integer.parseInt( charCode ) );
+ verifySemicolon( metricsTokenizer );
+ }
+ else if( nextCommand.equals( CHARMETRICS_CH ) )
+ {
+ //Is the hex string <FF> or FF, the spec is a little
+ //unclear, wait and see if it breaks anything.
+ String charCode = metricsTokenizer.nextToken();
+ charMetric.setCharacterCode( Integer.parseInt( charCode, BITS_IN_HEX ) );
+ verifySemicolon( metricsTokenizer );
+ }
+ else if( nextCommand.equals( CHARMETRICS_WX ) )
+ {
+ String wx = metricsTokenizer.nextToken();
+ charMetric.setWx( Float.parseFloat( wx ) );
+ verifySemicolon( metricsTokenizer );
+ }
+ else if( nextCommand.equals( CHARMETRICS_W0X ) )
+ {
+ String w0x = metricsTokenizer.nextToken();
+ charMetric.setW0x( Float.parseFloat( w0x ) );
+ verifySemicolon( metricsTokenizer );
+ }
+ else if( nextCommand.equals( CHARMETRICS_W1X ) )
+ {
+ String w1x = metricsTokenizer.nextToken();
+ charMetric.setW0x( Float.parseFloat( w1x ) );
+ verifySemicolon( metricsTokenizer );
+ }
+ else if( nextCommand.equals( CHARMETRICS_WY ) )
+ {
+ String wy = metricsTokenizer.nextToken();
+ charMetric.setWy( Float.parseFloat( wy ) );
+ verifySemicolon( metricsTokenizer );
+ }
+ else if( nextCommand.equals( CHARMETRICS_W0Y ) )
+ {
+ String w0y = metricsTokenizer.nextToken();
+ charMetric.setW0y( Float.parseFloat( w0y ) );
+ verifySemicolon( metricsTokenizer );
+ }
+ else if( nextCommand.equals( CHARMETRICS_W1Y ) )
+ {
+ String w1y = metricsTokenizer.nextToken();
+ charMetric.setW0y( Float.parseFloat( w1y ) );
+ verifySemicolon( metricsTokenizer );
+ }
+ else if( nextCommand.equals( CHARMETRICS_W ) )
+ {
+ String w0 = metricsTokenizer.nextToken();
+ String w1 = metricsTokenizer.nextToken();
+ float[] w = new float[2];
+ w[0] = Float.parseFloat( w0 );
+ w[1] = Float.parseFloat( w1 );
+ charMetric.setW( w );
+ verifySemicolon( metricsTokenizer );
+ }
+ else if( nextCommand.equals( CHARMETRICS_W0 ) )
+ {
+ String w00 = metricsTokenizer.nextToken();
+ String w01 = metricsTokenizer.nextToken();
+ float[] w0 = new float[2];
+ w0[0] = Float.parseFloat( w00 );
+ w0[1] = Float.parseFloat( w01 );
+ charMetric.setW0( w0 );
+ verifySemicolon( metricsTokenizer );
+ }
+ else if( nextCommand.equals( CHARMETRICS_W1 ) )
+ {
+ String w10 = metricsTokenizer.nextToken();
+ String w11 = metricsTokenizer.nextToken();
+ float[] w1 = new float[2];
+ w1[0] = Float.parseFloat( w10 );
+ w1[1] = Float.parseFloat( w11 );
+ charMetric.setW1( w1 );
+ verifySemicolon( metricsTokenizer );
+ }
+ else if( nextCommand.equals( CHARMETRICS_VV ) )
+ {
+ String vv0 = metricsTokenizer.nextToken();
+ String vv1 = metricsTokenizer.nextToken();
+ float[] vv = new float[2];
+ vv[0] = Float.parseFloat( vv0 );
+ vv[1] = Float.parseFloat( vv1 );
+ charMetric.setVv( vv );
+ verifySemicolon( metricsTokenizer );
+ }
+ else if( nextCommand.equals( CHARMETRICS_N ) )
+ {
+ String name = metricsTokenizer.nextToken();
+ charMetric.setName( name );
+ verifySemicolon( metricsTokenizer );
+ }
+ else if( nextCommand.equals( CHARMETRICS_B ) )
+ {
+ String llx = metricsTokenizer.nextToken();
+ String lly = metricsTokenizer.nextToken();
+ String urx = metricsTokenizer.nextToken();
+ String ury = metricsTokenizer.nextToken();
+ BoundingBox box = new BoundingBox();
+ box.setLowerLeftX( Float.parseFloat( llx ) );
+ box.setLowerLeftY( Float.parseFloat( lly ) );
+ box.setUpperRightX( Float.parseFloat( urx ) );
+ box.setUpperRightY( Float.parseFloat( ury ) );
+ charMetric.setBoundingBox( box );
+ verifySemicolon( metricsTokenizer );
+ }
+ else if( nextCommand.equals( CHARMETRICS_L ) )
+ {
+ String successor = metricsTokenizer.nextToken();
+ String ligature = metricsTokenizer.nextToken();
+ Ligature lig = new Ligature();
+ lig.setSuccessor( successor );
+ lig.setLigature( ligature );
+ charMetric.addLigature( lig );
+ verifySemicolon( metricsTokenizer );
+ }
+ else
+ {
+ throw new IOException( "Unknown CharMetrics command '" + nextCommand + "'" );
+ }
+ }
+ }
+ catch( NumberFormatException e )
+ {
+ throw new IOException( "Error: Corrupt AFM document:" + e );
+ }
+ return charMetric;
+ }
+
+ /**
+ * This is used to verify that a semicolon is the next token in the stream.
+ *
+ * @param tokenizer The tokenizer to read from.
+ *
+ * @throws IOException If the semicolon is missing.
+ */
+ private void verifySemicolon( StringTokenizer tokenizer ) throws IOException
+ {
+ if( tokenizer.hasMoreTokens() )
+ {
+ String semicolon = tokenizer.nextToken();
+ if( !semicolon.equals( ";" ) )
+ {
+ throw new IOException( "Error: Expected semicolon in stream actual='" +
+ semicolon + "'" );
+ }
+ }
+ else
+ {
+ throw new IOException( "CharMetrics is missing a semicolon after a command" );
+ }
+ }
+
+ /**
+ * This will read a boolean from the stream.
+ *
+ * @return The boolean in the stream.
+ */
+ private boolean readBoolean() throws IOException
+ {
+ String theBoolean = readString();
+ return Boolean.valueOf( theBoolean ).booleanValue();
+ }
+
+ /**
+ * This will read an integer from the stream.
+ *
+ * @return The integer in the stream.
+ */
+ private int readInt() throws IOException
+ {
+ String theInt = readString();
+ try
+ {
+ return Integer.parseInt( theInt );
+ }
+ catch( NumberFormatException e )
+ {
+ throw new IOException( "Error parsing AFM document:" + e );
+ }
+ }
+
+ /**
+ * This will read a float from the stream.
+ *
+ * @return The float in the stream.
+ */
+ private float readFloat() throws IOException
+ {
+ String theFloat = readString();
+ return Float.parseFloat( theFloat );
+ }
+
+ /**
+ * This will read until the end of a line.
+ *
+ * @return The string that is read.
+ */
+ private String readLine() throws IOException
+ {
+ //First skip the whitespace
+ StringBuffer buf = new StringBuffer();
+ int nextByte = input.read();
+ while( isWhitespace( nextByte ) )
+ {
+ nextByte = input.read();
+ //do nothing just skip the whitespace.
+ }
+ buf.append( (char)nextByte );
+
+ //now read the data
+ while( !isEOL(nextByte = input.read()) )
+ {
+ buf.append( (char)nextByte );
+ }
+ return buf.toString();
+ }
+
+ /**
+ * This will read a string from the input stream and stop at any whitespace.
+ *
+ * @return The string read from the stream.
+ *
+ * @throws IOException If an IO error occurs when reading from the stream.
+ */
+ private String readString() throws IOException
+ {
+ //First skip the whitespace
+ StringBuffer buf = new StringBuffer();
+ int nextByte = input.read();
+ while( isWhitespace( nextByte ) )
+ {
+ nextByte = input.read();
+ //do nothing just skip the whitespace.
+ }
+ buf.append( (char)nextByte );
+
+ //now read the data
+ while( !isWhitespace(nextByte = input.read()) )
+ {
+ buf.append( (char)nextByte );
+ }
+ return buf.toString();
+ }
+
+ /**
+ * This will determine if the byte is a whitespace character or not.
+ *
+ * @param character The character to test for whitespace.
+ *
+ * @return true If the character is whitespace as defined by the AFM spec.
+ */
+ private boolean isEOL( int character )
+ {
+ return character == 0x0D ||
+ character == 0x0A;
+ }
+
+ /**
+ * This will determine if the byte is a whitespace character or not.
+ *
+ * @param character The character to test for whitespace.
+ *
+ * @return true If the character is whitespace as defined by the AFM spec.
+ */
+ private boolean isWhitespace( int character )
+ {
+ return character == ' ' ||
+ character == '\t' ||
+ character == 0x0D ||
+ character == 0x0A;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/afmparser/package.html b/src/main/java/org/pdfbox/afmparser/package.html
new file mode 100644
index 0000000..0785815
--- /dev/null
+++ b/src/main/java/org/pdfbox/afmparser/package.html
@@ -0,0 +1,12 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head>
+
+</head>
+<body>
+This package holds classes used to parse AFM(Adobe Font Metrics) files.
+<br/>
+More information about AFM files can be found at
+<a href="http://partners.adobe.com/asn/developer/type/">http://partners.adobe.com/asn/developer/type/</a>
+</body>
+</html>
diff --git a/src/main/java/org/pdfbox/afmtypes/CharMetric.java b/src/main/java/org/pdfbox/afmtypes/CharMetric.java
new file mode 100644
index 0000000..7615845
--- /dev/null
+++ b/src/main/java/org/pdfbox/afmtypes/CharMetric.java
@@ -0,0 +1,299 @@
+/**
+ * Copyright (c) 2003, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.afmtypes;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.pdfbox.util.BoundingBox;
+
+/**
+ * This class represents a single character metric.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.4 $
+ */
+public class CharMetric
+{
+ private int characterCode;
+
+ private float wx;
+ private float w0x;
+ private float w1x;
+
+ private float wy;
+ private float w0y;
+ private float w1y;
+
+ private float[] w;
+ private float[] w0;
+ private float[] w1;
+ private float[] vv;
+
+ private String name;
+ private BoundingBox boundingBox;
+ private List ligatures = new ArrayList();
+
+ /** Getter for property boundingBox.
+ * @return Value of property boundingBox.
+ */
+ public BoundingBox getBoundingBox()
+ {
+ return boundingBox;
+ }
+
+ /** Setter for property boundingBox.
+ * @param bBox New value of property boundingBox.
+ */
+ public void setBoundingBox(BoundingBox bBox)
+ {
+ boundingBox = bBox;
+ }
+
+ /** Getter for property characterCode.
+ * @return Value of property characterCode.
+ */
+ public int getCharacterCode()
+ {
+ return characterCode;
+ }
+
+ /** Setter for property characterCode.
+ * @param cCode New value of property characterCode.
+ */
+ public void setCharacterCode(int cCode)
+ {
+ characterCode = cCode;
+ }
+
+ /**
+ * This will add an entry to the list of ligatures.
+ *
+ * @param ligature The ligature to add.
+ */
+ public void addLigature( Ligature ligature )
+ {
+ ligatures.add( ligature );
+ }
+
+ /** Getter for property ligatures.
+ * @return Value of property ligatures.
+ */
+ public List getLigatures()
+ {
+ return ligatures;
+ }
+
+ /** Setter for property ligatures.
+ * @param lig New value of property ligatures.
+ */
+ public void setLigatures(List lig)
+ {
+ this.ligatures = lig;
+ }
+
+ /** Getter for property name.
+ * @return Value of property name.
+ */
+ public String getName()
+ {
+ return name;
+ }
+
+ /** Setter for property name.
+ * @param n New value of property name.
+ */
+ public void setName(String n)
+ {
+ this.name = n;
+ }
+
+ /** Getter for property vv.
+ * @return Value of property vv.
+ */
+ public float[] getVv()
+ {
+ return this.vv;
+ }
+
+ /** Setter for property vv.
+ * @param vvValue New value of property vv.
+ */
+ public void setVv(float[] vvValue)
+ {
+ this.vv = vvValue;
+ }
+
+ /** Getter for property w.
+ * @return Value of property w.
+ */
+ public float[] getW()
+ {
+ return this.w;
+ }
+
+ /** Setter for property w.
+ * @param wValue New value of property w.
+ */
+ public void setW(float[] wValue)
+ {
+ this.w = wValue;
+ }
+
+ /** Getter for property w0.
+ * @return Value of property w0.
+ */
+ public float[] getW0()
+ {
+ return this.w0;
+ }
+
+ /** Setter for property w0.
+ * @param w0Value New value of property w0.
+ */
+ public void setW0(float[] w0Value)
+ {
+ w0 = w0Value;
+ }
+
+ /** Getter for property w0x.
+ * @return Value of property w0x.
+ */
+ public float getW0x()
+ {
+ return w0x;
+ }
+
+ /** Setter for property w0x.
+ * @param w0xValue New value of property w0x.
+ */
+ public void setW0x(float w0xValue)
+ {
+ w0x = w0xValue;
+ }
+
+ /** Getter for property w0y.
+ * @return Value of property w0y.
+ */
+ public float getW0y()
+ {
+ return w0y;
+ }
+
+ /** Setter for property w0y.
+ * @param w0yValue New value of property w0y.
+ */
+ public void setW0y(float w0yValue)
+ {
+ w0y = w0yValue;
+ }
+
+ /** Getter for property w1.
+ * @return Value of property w1.
+ */
+ public float[] getW1()
+ {
+ return this.w1;
+ }
+
+ /** Setter for property w1.
+ * @param w1Value New value of property w1.
+ */
+ public void setW1(float[] w1Value)
+ {
+ w1 = w1Value;
+ }
+
+ /** Getter for property w1x.
+ * @return Value of property w1x.
+ */
+ public float getW1x()
+ {
+ return w1x;
+ }
+
+ /** Setter for property w1x.
+ * @param w1xValue New value of property w1x.
+ */
+ public void setW1x(float w1xValue)
+ {
+ w1x = w1xValue;
+ }
+
+ /** Getter for property w1y.
+ * @return Value of property w1y.
+ */
+ public float getW1y()
+ {
+ return w1y;
+ }
+
+ /** Setter for property w1y.
+ * @param w1yValue New value of property w1y.
+ */
+ public void setW1y(float w1yValue)
+ {
+ w1y = w1yValue;
+ }
+
+ /** Getter for property wx.
+ * @return Value of property wx.
+ */
+ public float getWx()
+ {
+ return wx;
+ }
+
+ /** Setter for property wx.
+ * @param wxValue New value of property wx.
+ */
+ public void setWx(float wxValue)
+ {
+ wx = wxValue;
+ }
+
+ /** Getter for property wy.
+ * @return Value of property wy.
+ */
+ public float getWy()
+ {
+ return wy;
+ }
+
+ /** Setter for property wy.
+ * @param wyValue New value of property wy.
+ */
+ public void setWy(float wyValue)
+ {
+ this.wy = wyValue;
+ }
+
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/afmtypes/Composite.java b/src/main/java/org/pdfbox/afmtypes/Composite.java
new file mode 100644
index 0000000..874e373
--- /dev/null
+++ b/src/main/java/org/pdfbox/afmtypes/Composite.java
@@ -0,0 +1,89 @@
+/**
+ * Copyright (c) 2003, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.afmtypes;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * This class represents composite character data.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.4 $
+ */
+public class Composite
+{
+ private String name;
+ private List parts = new ArrayList();
+
+ /** Getter for property name.
+ * @return Value of property name.
+ */
+ public String getName()
+ {
+ return name;
+ }
+
+ /** Setter for property name.
+ * @param nameValue New value of property name.
+ */
+ public void setName(String nameValue)
+ {
+ this.name = nameValue;
+ }
+
+ /**
+ * This will add a composite part.
+ *
+ * @param part The composite part to add.
+ */
+ public void addPart( CompositePart part )
+ {
+ parts.add( part );
+ }
+
+ /** Getter for property parts.
+ * @return Value of property parts.
+ */
+ public List getParts()
+ {
+ return parts;
+ }
+
+ /** Setter for property parts.
+ * @param partsList New value of property parts.
+ */
+ public void setParts(List partsList)
+ {
+ this.parts = partsList;
+ }
+
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/afmtypes/CompositePart.java b/src/main/java/org/pdfbox/afmtypes/CompositePart.java
new file mode 100644
index 0000000..b88ac9e
--- /dev/null
+++ b/src/main/java/org/pdfbox/afmtypes/CompositePart.java
@@ -0,0 +1,93 @@
+/**
+ * Copyright (c) 2003, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.afmtypes;
+
+/**
+ * This class represents a part of composite character data.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.5 $
+ */
+public class CompositePart
+{
+ private String name;
+ private int xDisplacement;
+ private int yDisplacement;
+
+ /** Getter for property name.
+ * @return Value of property name.
+ */
+ public java.lang.String getName()
+ {
+ return name;
+ }
+
+ /** Setter for property name.
+ * @param nameValue New value of property name.
+ */
+ public void setName(String nameValue)
+ {
+ name = nameValue;
+ }
+
+ /** Getter for property xDisplacement.
+ * @return Value of property xDisplacement.
+ */
+ public int getXDisplacement()
+ {
+ return xDisplacement;
+ }
+
+ /** Setter for property xDisplacement.
+ * @param xDisp New value of property xDisplacement.
+ */
+ public void setXDisplacement(int xDisp)
+ {
+ xDisplacement = xDisp;
+ }
+
+ /** Getter for property yDisplacement.
+ * @return Value of property yDisplacement.
+ */
+ public int getYDisplacement()
+ {
+ return yDisplacement;
+ }
+
+ /** Setter for property yDisplacement.
+ * @param yDisp New value of property yDisplacement.
+ */
+ public void setYDisplacement(int yDisp)
+ {
+ yDisplacement = yDisp;
+ }
+
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/afmtypes/FontMetric.java b/src/main/java/org/pdfbox/afmtypes/FontMetric.java
new file mode 100644
index 0000000..b9fbeb8
--- /dev/null
+++ b/src/main/java/org/pdfbox/afmtypes/FontMetric.java
@@ -0,0 +1,891 @@
+/**
+ * Copyright (c) 2003-2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.afmtypes;
+
+import java.io.IOException;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.pdfbox.util.BoundingBox;
+
+/**
+ * This is the outermost AFM type. This can be created by the afmparser with a valid
+ * AFM document.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.7 $
+ */
+public class FontMetric
+{
+ /**
+ * This is the version of the FontMetrics.
+ */
+ private float afmVersion;
+ private int metricSets = 0;
+ private String fontName;
+ private String fullName;
+ private String familyName;
+ private String weight;
+ private BoundingBox fontBBox;
+ private String fontVersion;
+ private String notice;
+ private String encodingScheme;
+ private int mappingScheme;
+ private int escChar;
+ private String characterSet;
+ private int characters;
+ private boolean isBaseFont;
+ private float[] vVector;
+ private boolean isFixedV;
+ private float capHeight;
+ private float xHeight;
+ private float ascender;
+ private float descender;
+ private List comments = new ArrayList();
+
+ private float underlinePosition;
+ private float underlineThickness;
+ private float italicAngle;
+ private float[] charWidth;
+ private boolean isFixedPitch;
+ private float standardHorizontalWidth;
+ private float standardVerticalWidth;
+
+ private List charMetrics = new ArrayList();
+ private Map charMetricsMap = new HashMap();
+ private List trackKern = new ArrayList();
+ private List composites = new ArrayList();
+ private List kernPairs = new ArrayList();
+ private List kernPairs0 = new ArrayList();
+ private List kernPairs1 = new ArrayList();
+
+ /**
+ * Constructor.
+ */
+ public FontMetric()
+ {
+ }
+
+ /**
+ * This will get the width of a character.
+ *
+ * @param name The character to get the width for.
+ *
+ * @return The width of the character.
+ *
+ * @throws IOException If this AFM file does not handle the character.
+ */
+ public float getCharacterWidth( String name ) throws IOException
+ {
+ float result = 0;
+ CharMetric metric = (CharMetric)charMetricsMap.get( name );
+ if( metric == null )
+ {
+ result=0;
+ //don't throw an exception right away.
+ //throw new IOException( "Unknown AFM(" + getFullName() + ") characer '" + name + "'" );
+ }
+ else
+ {
+ result = metric.getWx();
+ }
+ return result;
+ }
+
+ /**
+ * This will get the average width of a character.
+ *
+ * @return The width of the character.
+ *
+ * @throws IOException If this AFM file does not handle the character.
+ */
+ public float getAverageCharacterWidth() throws IOException
+ {
+ float average = 0;
+ float totalWidths = 0;
+ float characterCount = 0;
+ Iterator iter = charMetricsMap.values().iterator();
+ while( iter.hasNext() )
+ {
+ CharMetric metric = (CharMetric)iter.next();
+ if( metric.getWx() > 0 )
+ {
+ totalWidths += metric.getWx();
+ characterCount += 1;
+ }
+ }
+ if( totalWidths > 0 )
+ {
+ average = totalWidths / characterCount;
+ }
+
+ return average;
+ }
+
+ /**
+ * This will add a new comment.
+ *
+ * @param comment The comment to add to this metric.
+ */
+ public void addComment( String comment )
+ {
+ comments.add( comment );
+ }
+
+ /**
+ * This will get all comments.
+ *
+ * @return The list of all comments.
+ */
+ public List getComments()
+ {
+ return comments;
+ }
+
+ /**
+ * This will get the version of the AFM document.
+ *
+ * @return The version of the document.
+ */
+ public float getAFMVersion()
+ {
+ return afmVersion;
+ }
+
+ /**
+ * This will get the metricSets attribute.
+ *
+ * @return The value of the metric sets.
+ */
+ public int getMetricSets()
+ {
+ return metricSets;
+ }
+
+ /**
+ * This will set the version of the AFM document.
+ *
+ * @param afmVersionValue The version of the document.
+ */
+ public void setAFMVersion( float afmVersionValue )
+ {
+ afmVersion = afmVersionValue;
+ }
+
+ /**
+ * This will set the metricSets attribute. This value must be 0,1, or 2.
+ *
+ * @param metricSetsValue The new metric sets attribute.
+ */
+ public void setMetricSets( int metricSetsValue )
+ {
+ if( metricSetsValue < 0 || metricSetsValue > 2 )
+ {
+ throw new RuntimeException( "The metricSets attribute must be in the " +
+ "set {0,1,2} and not '" + metricSetsValue + "'" );
+ }
+ metricSets = metricSetsValue;
+ }
+
+ /**
+ * Getter for property fontName.
+ *
+ * @return Value of property fontName.
+ */
+ public String getFontName()
+ {
+ return fontName;
+ }
+
+ /**
+ * Setter for property fontName.
+ *
+ * @param name New value of property fontName.
+ */
+ public void setFontName(String name)
+ {
+ fontName = name;
+ }
+
+ /**
+ * Getter for property fullName.
+ *
+ * @return Value of property fullName.
+ */
+ public String getFullName()
+ {
+ return fullName;
+ }
+
+ /**
+ * Setter for property fullName.
+ *
+ * @param fullNameValue New value of property fullName.
+ */
+ public void setFullName(String fullNameValue)
+ {
+ fullName = fullNameValue;
+ }
+
+ /**
+ * Getter for property familyName.
+ *
+ * @return Value of property familyName.
+ */
+ public String getFamilyName()
+ {
+ return familyName;
+ }
+
+ /**
+ * Setter for property familyName.
+ *
+ * @param familyNameValue New value of property familyName.
+ */
+ public void setFamilyName(String familyNameValue)
+ {
+ familyName = familyNameValue;
+ }
+
+ /**
+ * Getter for property weight.
+ *
+ * @return Value of property weight.
+ */
+ public String getWeight()
+ {
+ return weight;
+ }
+
+ /**
+ * Setter for property weight.
+ *
+ * @param weightValue New value of property weight.
+ */
+ public void setWeight(String weightValue)
+ {
+ weight = weightValue;
+ }
+
+ /**
+ * Getter for property fontBBox.
+ *
+ * @return Value of property fontBBox.
+ */
+ public BoundingBox getFontBBox()
+ {
+ return fontBBox;
+ }
+
+ /**
+ * Setter for property fontBBox.
+ *
+ * @param bBox New value of property fontBBox.
+ */
+ public void setFontBBox(BoundingBox bBox)
+ {
+ this.fontBBox = bBox;
+ }
+
+ /**
+ * Getter for property notice.
+ *
+ * @return Value of property notice.
+ */
+ public String getNotice()
+ {
+ return notice;
+ }
+
+ /**
+ * Setter for property notice.
+ *
+ * @param noticeValue New value of property notice.
+ */
+ public void setNotice(String noticeValue)
+ {
+ notice = noticeValue;
+ }
+
+ /**
+ * Getter for property encodingScheme.
+ *
+ * @return Value of property encodingScheme.
+ */
+ public String getEncodingScheme()
+ {
+ return encodingScheme;
+ }
+
+ /**
+ * Setter for property encodingScheme.
+ *
+ * @param encodingSchemeValue New value of property encodingScheme.
+ */
+ public void setEncodingScheme(String encodingSchemeValue)
+ {
+ encodingScheme = encodingSchemeValue;
+ }
+
+ /**
+ * Getter for property mappingScheme.
+ *
+ * @return Value of property mappingScheme.
+ */
+ public int getMappingScheme()
+ {
+ return mappingScheme;
+ }
+
+ /**
+ * Setter for property mappingScheme.
+ *
+ * @param mappingSchemeValue New value of property mappingScheme.
+ */
+ public void setMappingScheme(int mappingSchemeValue)
+ {
+ mappingScheme = mappingSchemeValue;
+ }
+
+ /**
+ * Getter for property escChar.
+ *
+ * @return Value of property escChar.
+ */
+ public int getEscChar()
+ {
+ return escChar;
+ }
+
+ /**
+ * Setter for property escChar.
+ *
+ * @param escCharValue New value of property escChar.
+ */
+ public void setEscChar(int escCharValue)
+ {
+ escChar = escCharValue;
+ }
+
+ /**
+ * Getter for property characterSet.
+ *
+ * @return Value of property characterSet.
+ */
+ public String getCharacterSet()
+ {
+ return characterSet;
+ }
+
+ /**
+ * Setter for property characterSet.
+ *
+ * @param characterSetValue New value of property characterSet.
+ */
+ public void setCharacterSet(String characterSetValue)
+ {
+ characterSet = characterSetValue;
+ }
+
+ /**
+ * Getter for property characters.
+ *
+ * @return Value of property characters.
+ */
+ public int getCharacters()
+ {
+ return characters;
+ }
+
+ /**
+ * Setter for property characters.
+ *
+ * @param charactersValue New value of property characters.
+ */
+ public void setCharacters(int charactersValue)
+ {
+ characters = charactersValue;
+ }
+
+ /**
+ * Getter for property isBaseFont.
+ *
+ * @return Value of property isBaseFont.
+ */
+ public boolean isBaseFont()
+ {
+ return isBaseFont;
+ }
+
+ /**
+ * Setter for property isBaseFont.
+ *
+ * @param isBaseFontValue New value of property isBaseFont.
+ */
+ public void setIsBaseFont(boolean isBaseFontValue)
+ {
+ isBaseFont = isBaseFontValue;
+ }
+
+ /**
+ * Getter for property vVector.
+ *
+ * @return Value of property vVector.
+ */
+ public float[] getVVector()
+ {
+ return this.vVector;
+ }
+
+ /**
+ * Setter for property vVector.
+ *
+ * @param vVectorValue New value of property vVector.
+ */
+ public void setVVector(float[] vVectorValue)
+ {
+ vVector = vVectorValue;
+ }
+
+ /**
+ * Getter for property isFixedV.
+ *
+ * @return Value of property isFixedV.
+ */
+ public boolean isFixedV()
+ {
+ return isFixedV;
+ }
+
+ /**
+ * Setter for property isFixedV.
+ *
+ * @param isFixedVValue New value of property isFixedV.
+ */
+ public void setIsFixedV(boolean isFixedVValue)
+ {
+ isFixedV = isFixedVValue;
+ }
+
+ /**
+ * Getter for property capHeight.
+ *
+ * @return Value of property capHeight.
+ */
+ public float getCapHeight()
+ {
+ return capHeight;
+ }
+
+ /**
+ * Setter for property capHeight.
+ *
+ * @param capHeightValue New value of property capHeight.
+ */
+ public void setCapHeight(float capHeightValue)
+ {
+ capHeight = capHeightValue;
+ }
+
+ /**
+ * Getter for property xHeight.
+ *
+ * @return Value of property xHeight.
+ */
+ public float getXHeight()
+ {
+ return xHeight;
+ }
+
+ /**
+ * Setter for property xHeight.
+ *
+ * @param xHeightValue New value of property xHeight.
+ */
+ public void setXHeight( float xHeightValue )
+ {
+ xHeight = xHeightValue;
+ }
+
+ /**
+ * Getter for property ascender.
+ *
+ * @return Value of property ascender.
+ */
+ public float getAscender()
+ {
+ return ascender;
+ }
+
+ /**
+ * Setter for property ascender.
+ *
+ * @param ascenderValue New value of property ascender.
+ */
+ public void setAscender( float ascenderValue )
+ {
+ ascender = ascenderValue;
+ }
+
+ /**
+ * Getter for property descender.
+ *
+ * @return Value of property descender.
+ */
+ public float getDescender()
+ {
+ return descender;
+ }
+
+ /**
+ * Setter for property descender.
+ *
+ * @param descenderValue New value of property descender.
+ */
+ public void setDescender( float descenderValue )
+ {
+ descender = descenderValue;
+ }
+
+ /**
+ * Getter for property fontVersion.
+ *
+ * @return Value of property fontVersion.
+ */
+ public String getFontVersion()
+ {
+ return fontVersion;
+ }
+
+ /**
+ * Setter for property fontVersion.
+ *
+ * @param fontVersionValue New value of property fontVersion.
+ */
+ public void setFontVersion(String fontVersionValue)
+ {
+ fontVersion = fontVersionValue;
+ }
+
+ /**
+ * Getter for property underlinePosition.
+ *
+ * @return Value of property underlinePosition.
+ */
+ public float getUnderlinePosition()
+ {
+ return underlinePosition;
+ }
+
+ /**
+ * Setter for property underlinePosition.
+ *
+ * @param underlinePositionValue New value of property underlinePosition.
+ */
+ public void setUnderlinePosition(float underlinePositionValue)
+ {
+ underlinePosition = underlinePositionValue;
+ }
+
+ /**
+ * Getter for property underlineThickness.
+ *
+ * @return Value of property underlineThickness.
+ */
+ public float getUnderlineThickness()
+ {
+ return underlineThickness;
+ }
+
+ /**
+ * Setter for property underlineThickness.
+ *
+ * @param underlineThicknessValue New value of property underlineThickness.
+ */
+ public void setUnderlineThickness(float underlineThicknessValue)
+ {
+ underlineThickness = underlineThicknessValue;
+ }
+
+ /**
+ * Getter for property italicAngle.
+ *
+ * @return Value of property italicAngle.
+ */
+ public float getItalicAngle()
+ {
+ return italicAngle;
+ }
+
+ /**
+ * Setter for property italicAngle.
+ *
+ * @param italicAngleValue New value of property italicAngle.
+ */
+ public void setItalicAngle(float italicAngleValue)
+ {
+ italicAngle = italicAngleValue;
+ }
+
+ /**
+ * Getter for property charWidth.
+ *
+ * @return Value of property charWidth.
+ */
+ public float[] getCharWidth()
+ {
+ return this.charWidth;
+ }
+
+ /**
+ * Setter for property charWidth.
+ *
+ * @param charWidthValue New value of property charWidth.
+ */
+ public void setCharWidth(float[] charWidthValue)
+ {
+ charWidth = charWidthValue;
+ }
+
+ /**
+ * Getter for property isFixedPitch.
+ *
+ * @return Value of property isFixedPitch.
+ */
+ public boolean isFixedPitch()
+ {
+ return isFixedPitch;
+ }
+
+ /**
+ * Setter for property isFixedPitch.
+ *
+ * @param isFixedPitchValue New value of property isFixedPitch.
+ */
+ public void setFixedPitch(boolean isFixedPitchValue)
+ {
+ isFixedPitch = isFixedPitchValue;
+ }
+
+ /** Getter for property charMetrics.
+ * @return Value of property charMetrics.
+ */
+ public List getCharMetrics()
+ {
+ return charMetrics;
+ }
+
+ /** Setter for property charMetrics.
+ * @param charMetricsValue New value of property charMetrics.
+ */
+ public void setCharMetrics(List charMetricsValue)
+ {
+ charMetrics = charMetricsValue;
+ }
+
+ /**
+ * This will add another character metric.
+ *
+ * @param metric The character metric to add.
+ */
+ public void addCharMetric( CharMetric metric )
+ {
+ charMetrics.add( metric );
+ charMetricsMap.put( metric.getName(), metric );
+ }
+
+ /** Getter for property trackKern.
+ * @return Value of property trackKern.
+ */
+ public List getTrackKern()
+ {
+ return trackKern;
+ }
+
+ /** Setter for property trackKern.
+ * @param trackKernValue New value of property trackKern.
+ */
+ public void setTrackKern(List trackKernValue)
+ {
+ trackKern = trackKernValue;
+ }
+
+ /**
+ * This will add another track kern.
+ *
+ * @param kern The track kerning data.
+ */
+ public void addTrackKern( TrackKern kern )
+ {
+ trackKern.add( kern );
+ }
+
+ /** Getter for property composites.
+ * @return Value of property composites.
+ */
+ public List getComposites()
+ {
+ return composites;
+ }
+
+ /** Setter for property composites.
+ * @param compositesList New value of property composites.
+ */
+ public void setComposites(List compositesList)
+ {
+ composites = compositesList;
+ }
+
+ /**
+ * This will add a single composite part to the picture.
+ *
+ * @param composite The composite info to add.
+ */
+ public void addComposite( Composite composite )
+ {
+ composites.add( composite );
+ }
+
+ /** Getter for property kernPairs.
+ * @return Value of property kernPairs.
+ */
+ public java.util.List getKernPairs()
+ {
+ return kernPairs;
+ }
+
+ /**
+ * This will add a kern pair.
+ *
+ * @param kernPair The kern pair to add.
+ */
+ public void addKernPair( KernPair kernPair )
+ {
+ kernPairs.add( kernPair );
+ }
+
+ /** Setter for property kernPairs.
+ * @param kernPairsList New value of property kernPairs.
+ */
+ public void setKernPairs(java.util.List kernPairsList)
+ {
+ kernPairs = kernPairsList;
+ }
+
+ /** Getter for property kernPairs0.
+ * @return Value of property kernPairs0.
+ */
+ public java.util.List getKernPairs0()
+ {
+ return kernPairs0;
+ }
+
+ /**
+ * This will add a kern pair.
+ *
+ * @param kernPair The kern pair to add.
+ */
+ public void addKernPair0( KernPair kernPair )
+ {
+ kernPairs0.add( kernPair );
+ }
+
+ /** Setter for property kernPairs0.
+ * @param kernPairs0List New value of property kernPairs0.
+ */
+ public void setKernPairs0(java.util.List kernPairs0List)
+ {
+ kernPairs0 = kernPairs0List;
+ }
+
+ /** Getter for property kernPairs1.
+ * @return Value of property kernPairs1.
+ */
+ public java.util.List getKernPairs1()
+ {
+ return kernPairs1;
+ }
+
+ /**
+ * This will add a kern pair.
+ *
+ * @param kernPair The kern pair to add.
+ */
+ public void addKernPair1( KernPair kernPair )
+ {
+ kernPairs1.add( kernPair );
+ }
+
+ /** Setter for property kernPairs1.
+ * @param kernPairs1List New value of property kernPairs1.
+ */
+ public void setKernPairs1(java.util.List kernPairs1List)
+ {
+ kernPairs1 = kernPairs1List;
+ }
+
+ /** Getter for property standardHorizontalWidth.
+ * @return Value of property standardHorizontalWidth.
+ */
+ public float getStandardHorizontalWidth()
+ {
+ return standardHorizontalWidth;
+ }
+
+ /** Setter for property standardHorizontalWidth.
+ * @param standardHorizontalWidthValue New value of property standardHorizontalWidth.
+ */
+ public void setStandardHorizontalWidth(float standardHorizontalWidthValue)
+ {
+ standardHorizontalWidth = standardHorizontalWidthValue;
+ }
+
+ /** Getter for property standardVerticalWidth.
+ * @return Value of property standardVerticalWidth.
+ */
+ public float getStandardVerticalWidth()
+ {
+ return standardVerticalWidth;
+ }
+
+ /** Setter for property standardVerticalWidth.
+ * @param standardVerticalWidthValue New value of property standardVerticalWidth.
+ */
+ public void setStandardVerticalWidth(float standardVerticalWidthValue)
+ {
+ standardVerticalWidth = standardVerticalWidthValue;
+ }
+
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/afmtypes/KernPair.java b/src/main/java/org/pdfbox/afmtypes/KernPair.java
new file mode 100644
index 0000000..a822d22
--- /dev/null
+++ b/src/main/java/org/pdfbox/afmtypes/KernPair.java
@@ -0,0 +1,110 @@
+/**
+ * Copyright (c) 2003, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.afmtypes;
+
+/**
+ * This represents some kern pair data.
+ *
+ * @author Ben Litchfied (ben@csh.rit.edu)
+ * @version $Revision: 1.4 $
+ */
+public class KernPair
+{
+ private String firstKernCharacter;
+ private String secondKernCharacter;
+ private float x;
+ private float y;
+
+ /** Getter for property firstKernCharacter.
+ * @return Value of property firstKernCharacter.
+ */
+ public java.lang.String getFirstKernCharacter()
+ {
+ return firstKernCharacter;
+ }
+
+ /** Setter for property firstKernCharacter.
+ * @param firstKernCharacterValue New value of property firstKernCharacter.
+ */
+ public void setFirstKernCharacter(String firstKernCharacterValue)
+ {
+ firstKernCharacter = firstKernCharacterValue;
+ }
+
+ /** Getter for property secondKernCharacter.
+ * @return Value of property secondKernCharacter.
+ */
+ public java.lang.String getSecondKernCharacter()
+ {
+ return secondKernCharacter;
+ }
+
+ /** Setter for property secondKernCharacter.
+ * @param secondKernCharacterValue New value of property secondKernCharacter.
+ */
+ public void setSecondKernCharacter(String secondKernCharacterValue)
+ {
+ secondKernCharacter = secondKernCharacterValue;
+ }
+
+ /** Getter for property x.
+ * @return Value of property x.
+ */
+ public float getX()
+ {
+ return x;
+ }
+
+ /** Setter for property x.
+ * @param xValue New value of property x.
+ */
+ public void setX(float xValue)
+ {
+ x = xValue;
+ }
+
+ /** Getter for property y.
+ * @return Value of property y.
+ */
+ public float getY()
+ {
+ return y;
+ }
+
+ /** Setter for property y.
+ * @param yValue New value of property y.
+ */
+ public void setY(float yValue)
+ {
+ y = yValue;
+ }
+
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/afmtypes/Ligature.java b/src/main/java/org/pdfbox/afmtypes/Ligature.java
new file mode 100644
index 0000000..99e6ae9
--- /dev/null
+++ b/src/main/java/org/pdfbox/afmtypes/Ligature.java
@@ -0,0 +1,76 @@
+/**
+ * Copyright (c) 2003, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.afmtypes;
+
+/**
+ * This class represents a ligature, which is an entry of the CharMetrics.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.4 $
+ */
+public class Ligature
+{
+ private String successor;
+ private String ligature;
+
+ /** Getter for property ligature.
+ * @return Value of property ligature.
+ */
+ public String getLigature()
+ {
+ return ligature;
+ }
+
+ /** Setter for property ligature.
+ * @param lig New value of property ligature.
+ */
+ public void setLigature(String lig)
+ {
+ ligature = lig;
+ }
+
+ /** Getter for property successor.
+ * @return Value of property successor.
+ */
+ public String getSuccessor()
+ {
+ return successor;
+ }
+
+ /** Setter for property successor.
+ * @param successorValue New value of property successor.
+ */
+ public void setSuccessor(String successorValue)
+ {
+ successor = successorValue;
+ }
+
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/afmtypes/TrackKern.java b/src/main/java/org/pdfbox/afmtypes/TrackKern.java
new file mode 100644
index 0000000..a806850
--- /dev/null
+++ b/src/main/java/org/pdfbox/afmtypes/TrackKern.java
@@ -0,0 +1,127 @@
+/**
+ * Copyright (c) 2003, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.afmtypes;
+
+/**
+ * This class represents a piece of track kerning data.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.4 $
+ */
+public class TrackKern
+{
+ private int degree;
+ private float minPointSize;
+ private float minKern;
+ private float maxPointSize;
+ private float maxKern;
+
+ /** Getter for property degree.
+ * @return Value of property degree.
+ */
+ public int getDegree()
+ {
+ return degree;
+ }
+
+ /** Setter for property degree.
+ * @param degreeValue New value of property degree.
+ */
+ public void setDegree(int degreeValue)
+ {
+ degree = degreeValue;
+ }
+
+ /** Getter for property maxKern.
+ * @return Value of property maxKern.
+ */
+ public float getMaxKern()
+ {
+ return maxKern;
+ }
+
+ /** Setter for property maxKern.
+ * @param maxKernValue New value of property maxKern.
+ */
+ public void setMaxKern(float maxKernValue)
+ {
+ maxKern = maxKernValue;
+ }
+
+ /** Getter for property maxPointSize.
+ * @return Value of property maxPointSize.
+ */
+ public float getMaxPointSize()
+ {
+ return maxPointSize;
+ }
+
+ /** Setter for property maxPointSize.
+ * @param maxPointSizeValue New value of property maxPointSize.
+ */
+ public void setMaxPointSize(float maxPointSizeValue)
+ {
+ maxPointSize = maxPointSizeValue;
+ }
+
+ /** Getter for property minKern.
+ * @return Value of property minKern.
+ */
+ public float getMinKern()
+ {
+ return minKern;
+ }
+
+ /** Setter for property minKern.
+ * @param minKernValue New value of property minKern.
+ */
+ public void setMinKern(float minKernValue)
+ {
+ minKern = minKernValue;
+ }
+
+ /** Getter for property minPointSize.
+ * @return Value of property minPointSize.
+ */
+ public float getMinPointSize()
+ {
+ return minPointSize;
+ }
+
+ /** Setter for property minPointSize.
+ * @param minPointSizeValue New value of property minPointSize.
+ */
+ public void setMinPointSize(float minPointSizeValue)
+ {
+ minPointSize = minPointSizeValue;
+ }
+
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/afmtypes/package.html b/src/main/java/org/pdfbox/afmtypes/package.html
new file mode 100644
index 0000000..e565720
--- /dev/null
+++ b/src/main/java/org/pdfbox/afmtypes/package.html
@@ -0,0 +1,9 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head>
+
+</head>
+<body>
+This package contains all the base types that can be found in an AFM file.
+</body>
+</html>
diff --git a/src/main/java/org/pdfbox/ant/PDFToTextTask.java b/src/main/java/org/pdfbox/ant/PDFToTextTask.java
new file mode 100644
index 0000000..56ef42b
--- /dev/null
+++ b/src/main/java/org/pdfbox/ant/PDFToTextTask.java
@@ -0,0 +1,100 @@
+/**
+ * Copyright (c) 2003, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.ant;
+
+import java.io.File;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.apache.tools.ant.DirectoryScanner;
+import org.apache.tools.ant.Task;
+
+import org.apache.tools.ant.types.FileSet;
+
+/**
+ * This is an ant task that will allow pdf documents to be converted using an
+ * and task.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.7 $
+ */
+public class PDFToTextTask extends Task
+{
+ private List fileSets = new ArrayList();
+
+ /**
+ * Adds a set of files (nested fileset attribute).
+ *
+ * @param set Another fileset to add.
+ */
+ public void addFileset( FileSet set )
+ {
+ fileSets.add( set );
+ }
+
+ /**
+ * This will perform the execution.
+ */
+ public void execute()
+ {
+ log( "PDFToTextTask executing" );
+ Iterator fileSetIter = fileSets.iterator();
+ while( fileSetIter.hasNext() )
+ {
+ FileSet next = (FileSet)fileSetIter.next();
+ DirectoryScanner dirScanner = next.getDirectoryScanner( getProject() );
+ dirScanner.scan();
+ String[] files = dirScanner.getIncludedFiles();
+ for( int i=0; i<files.length; i++ )
+ {
+ File f = new File( dirScanner.getBasedir(), files[i] );
+ log( "processing: " + f.getAbsolutePath() );
+ String pdfFile = f.getAbsolutePath();
+ if( pdfFile.toUpperCase().endsWith( ".PDF" ) )
+ {
+ String textFile = pdfFile.substring( 0, pdfFile.length() -3 );
+ textFile = textFile + "txt";
+ try
+ {
+ org.pdfbox.ExtractText.main( new String[] { pdfFile, textFile } );
+ }
+ catch( Exception e )
+ {
+ log( "Error processing " + pdfFile + e.getMessage() );
+ }
+ }
+ }
+
+ }
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/ant/package.html b/src/main/java/org/pdfbox/ant/package.html
new file mode 100644
index 0000000..675014e
--- /dev/null
+++ b/src/main/java/org/pdfbox/ant/package.html
@@ -0,0 +1,18 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head>
+
+</head>
+<body>
+<A href="http://jakarta.apache.org/ant/index.html">ANT</a> tasks that utilize PDFBox features can be found in this package.
+This is an example of using the PDF2Text task:<br/> <br/>
+
+&lt;taskdef name="pdf2text" classname="org.pdfbox.ant.PDFToTextTask" classpathref="build.classpath" /&gt;<br/>
+
+&lt;pdf2text&gt;<br/>
+ &nbsp;&nbsp;&lt;fileset dir="test"&gt;<br/>
+ &nbsp;&nbsp;&nbsp;&nbsp;&lt;include name="**/*.pdf" /&gt;<br/>
+ &nbsp;&nbsp;&lt;/fileset&gt;<br/>
+&lt;/pdf2text&gt;<br/>
+</body>
+</html>
diff --git a/src/main/java/org/pdfbox/cmapparser/CMapParser.java b/src/main/java/org/pdfbox/cmapparser/CMapParser.java
new file mode 100644
index 0000000..5434bb7
--- /dev/null
+++ b/src/main/java/org/pdfbox/cmapparser/CMapParser.java
@@ -0,0 +1,285 @@
+/**
+ * Copyright (c) 2003-2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.cmapparser;
+
+import java.io.FileInputStream;
+import java.io.InputStream;
+import java.io.IOException;
+import java.io.RandomAccessFile;
+
+import java.util.List;
+
+import org.pdfbox.cmaptypes.CMap;
+import org.pdfbox.cmaptypes.CodespaceRange;
+
+import org.pdfbox.cos.COSArray;
+import org.pdfbox.cos.COSName;
+import org.pdfbox.cos.COSNumber;
+import org.pdfbox.cos.COSString;
+
+import org.pdfbox.pdfparser.PDFStreamParser;
+
+import org.pdfbox.util.PDFOperator;
+
+/**
+ * This will parser a CMap stream.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.10 $
+ */
+public class CMapParser
+{
+ private static final String BEGIN_CODESPACE_RANGE = "begincodespacerange";
+ private static final String BEGIN_BASE_FONT_CHAR = "beginbfchar";
+ private static final String BEGIN_BASE_FONT_RANGE = "beginbfrange";
+
+ private InputStream input;
+ private CMap result;
+ private RandomAccessFile file;
+
+ /**
+ * Creates a new instance of CMapParser.
+ *
+ * @param in The input stream to read data from.
+ * @param raf The random access file from the document
+ */
+ public CMapParser( InputStream in, RandomAccessFile raf )
+ {
+ input = in;
+ file = raf;
+ }
+
+ /**
+ * This will get the results of the parsing. parse() must be called first.
+ *
+ * @return The parsed CMap file.
+ */
+ public CMap getResult()
+ {
+ return result;
+ }
+
+ /**
+ * This will parse the stream and create a cmap object.
+ *
+ * @throws IOException If there is an error parsing the stream.
+ */
+ public void parse() throws IOException
+ {
+ result = new CMap();
+ PDFStreamParser parser = new PDFStreamParser( input, file );
+ parser.parse();
+ List tokens = parser.getTokens();
+ for( int i=0; i<tokens.size(); i++ )
+ {
+ Object token = tokens.get( i );
+ if( token instanceof PDFOperator )
+ {
+ PDFOperator op = (PDFOperator)token;
+ if( op.getOperation().equals( BEGIN_CODESPACE_RANGE ) )
+ {
+ COSNumber cosCount = (COSNumber)tokens.get( i-1 );
+ for( int j=0; j<cosCount.intValue(); j++ )
+ {
+ i++;
+ COSString startRange = (COSString)tokens.get( i );
+ i++;
+ COSString endRange = (COSString)tokens.get( i );
+ CodespaceRange range = new CodespaceRange();
+ range.setStart( startRange.getBytes() );
+ range.setEnd( endRange.getBytes() );
+ result.addCodespaceRange( range );
+ }
+ }
+ else if( op.getOperation().equals( BEGIN_BASE_FONT_CHAR ) )
+ {
+ COSNumber cosCount = (COSNumber)tokens.get( i-1 );
+ for( int j=0; j<cosCount.intValue(); j++ )
+ {
+ i++;
+ COSString inputCode = (COSString)tokens.get( i );
+ i++;
+ Object nextToken = tokens.get( i );
+ if( nextToken instanceof COSString )
+ {
+ byte[] bytes = ((COSString)nextToken).getBytes();
+ String value = createStringFromBytes( bytes );
+ result.addMapping( inputCode.getBytes(), value );
+ }
+ else if( nextToken instanceof COSName )
+ {
+ result.addMapping( inputCode.getBytes(), ((COSName)nextToken).getName() );
+ }
+ else
+ {
+ throw new IOException( "Error parsing CMap beginbfchar, expected{COSString " +
+ "or COSName} and not " + nextToken );
+ }
+ }
+ }
+ else if( op.getOperation().equals( BEGIN_BASE_FONT_RANGE ) )
+ {
+ COSNumber cosCount = (COSNumber)tokens.get( i-1 );
+
+ for( int j=0; j<cosCount.intValue(); j++ )
+ {
+ i++;
+ COSString startCode = (COSString)tokens.get( i );
+ i++;
+ COSString endCode = (COSString)tokens.get( i );
+ i++;
+ Object nextToken = tokens.get( i );
+ COSArray array = null;
+ if( nextToken instanceof COSArray )
+ {
+ array = (COSArray)nextToken;
+ }
+
+ byte[] startBytes = startCode.getBytes();
+ byte[] endBytes = endCode.getBytes();
+ byte[] tokenBytes = null;
+ if( array == null )
+ {
+ tokenBytes = ((COSString)nextToken).getBytes();
+ }
+ else
+ {
+ tokenBytes = ((COSString)array.getObject( 0 )).getBytes();
+ }
+
+ String value = null;
+
+ int arrayIndex = 0;
+ boolean done = false;
+ while( !done )
+ {
+ if( compare( startBytes, endBytes ) >= 0 )
+ {
+ done = true;
+ }
+ value = createStringFromBytes( tokenBytes );
+ result.addMapping( startBytes, value );
+ increment( startBytes );
+
+ if( array == null )
+ {
+ increment( tokenBytes );
+ }
+ else
+ {
+ if( arrayIndex < array.size() )
+ {
+ tokenBytes = ((COSString)array.getObject( arrayIndex++ )).getBytes();
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ private void increment( byte[] data )
+ {
+ increment( data, data.length-1 );
+ }
+
+ private void increment( byte[] data, int position )
+ {
+ if( position > 0 && (data[position]+256)%256 == 255 )
+ {
+ data[position]=0;
+ increment( data, position-1);
+ }
+ else
+ {
+ data[position] = (byte)(data[position]+1);
+ }
+ }
+
+ private String createStringFromBytes( byte[] bytes ) throws IOException
+ {
+ String retval = null;
+ if( bytes.length == 1 )
+ {
+ retval = new String( bytes );
+ }
+ else
+ {
+ retval = new String( bytes, "UTF-16BE" );
+ }
+ return retval;
+ }
+
+ private int compare( byte[] first, byte[] second )
+ {
+ int retval = 1;
+ boolean done = false;
+ for( int i=0; i<first.length && !done; i++ )
+ {
+ if( first[i] == second[i] )
+ {
+ //move to next position
+ }
+ else if( ((first[i]+256)%256) < ((second[i]+256)%256) )
+ {
+ done = true;
+ retval = -1;
+ }
+ else
+ {
+ done = true;
+ retval = 1;
+ }
+ }
+ return retval;
+ }
+
+ /**
+ * A simple class to test parsing of cmap files.
+ *
+ * @param args Some command line arguments.
+ *
+ * @throws Exception If there is an error parsing the file.
+ */
+ public static void main( String[] args ) throws Exception
+ {
+ if( args.length != 1 )
+ {
+ System.err.println( "usage: java org.pdfbox.cmapparser.CMapParser <CMAP File>" );
+ System.exit( -1 );
+ }
+ CMapParser parser = new CMapParser( new FileInputStream( args[0] ), null );
+ parser.parse();
+ CMap result = parser.getResult();
+ System.out.println( "Result:" + result );
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/cmapparser/package.html b/src/main/java/org/pdfbox/cmapparser/package.html
new file mode 100644
index 0000000..929bcb2
--- /dev/null
+++ b/src/main/java/org/pdfbox/cmapparser/package.html
@@ -0,0 +1,9 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head>
+
+</head>
+<body>
+This package holds classes that are necessary to parse cmap files.
+</body>
+</html>
diff --git a/src/main/java/org/pdfbox/cmaptypes/CMap.java b/src/main/java/org/pdfbox/cmaptypes/CMap.java
new file mode 100644
index 0000000..a8f7fec
--- /dev/null
+++ b/src/main/java/org/pdfbox/cmaptypes/CMap.java
@@ -0,0 +1,161 @@
+/**
+ * Copyright (c) 2003, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.cmaptypes;
+
+import java.io.IOException;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * This class represents a CMap file.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.6 $
+ */
+public class CMap
+{
+ private List codeSpaceRanges = new ArrayList();
+ private Map singleByteMappings = new HashMap();
+ private Map doubleByteMappings = new HashMap();
+
+ /**
+ * Creates a new instance of CMap.
+ */
+ public CMap()
+ {
+ //default constructor
+ }
+
+ /**
+ * This will tell if this cmap has any one byte mappings.
+ *
+ * @return true If there are any one byte mappings, false otherwise.
+ */
+ public boolean hasOneByteMappings()
+ {
+ return singleByteMappings.size() > 0;
+ }
+
+ /**
+ * This will tell if this cmap has any two byte mappings.
+ *
+ * @return true If there are any two byte mappings, false otherwise.
+ */
+ public boolean hasTwoByteMappings()
+ {
+ return doubleByteMappings.size() > 0;
+ }
+
+ /**
+ * This will perform a lookup into the map.
+ *
+ * @param code The code used to lookup.
+ * @param offset The offset into the byte array.
+ * @param length The length of the data we are getting.
+ *
+ * @return The string that matches the lookup.
+ */
+ public String lookup( byte[] code, int offset, int length )
+ {
+
+ String result = null;
+ Integer key = null;
+ if( length == 1 )
+ {
+
+ key = new Integer( (code[offset]+256)%256 );
+ result = (String)singleByteMappings.get( key );
+ }
+ else if( length == 2 )
+ {
+ int intKey = (code[offset]+256)%256;
+ intKey <<= 8;
+ intKey += (code[offset+1]+256)%256;
+ key = new Integer( intKey );
+
+ result = (String)doubleByteMappings.get( key );
+ }
+
+ return result;
+ }
+
+ /**
+ * This will add a mapping.
+ *
+ * @param src The src to the mapping.
+ * @param dest The dest to the mapping.
+ *
+ * @throws IOException if the src is invalid.
+ */
+ public void addMapping( byte[] src, String dest ) throws IOException
+ {
+ if( src.length == 1 )
+ {
+ singleByteMappings.put( new Integer( src[0] ), dest );
+ }
+ else if( src.length == 2 )
+ {
+ int intSrc = src[0];
+ intSrc <<= 8;
+ intSrc |= (src[1]&0xFF);
+ doubleByteMappings.put( new Integer( intSrc ), dest );
+ }
+ else
+ {
+ throw new IOException( "Mapping code should be 1 or two bytes and not " + src.length );
+ }
+ }
+
+
+ /**
+ * This will add a codespace range.
+ *
+ * @param range A single codespace range.
+ */
+ public void addCodespaceRange( CodespaceRange range )
+ {
+ codeSpaceRanges.add( range );
+ }
+
+ /**
+ * Getter for property codeSpaceRanges.
+ *
+ * @return Value of property codeSpaceRanges.
+ */
+ public List getCodeSpaceRanges()
+ {
+ return codeSpaceRanges;
+ }
+
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/cmaptypes/CodespaceRange.java b/src/main/java/org/pdfbox/cmaptypes/CodespaceRange.java
new file mode 100644
index 0000000..0f1ab2e
--- /dev/null
+++ b/src/main/java/org/pdfbox/cmaptypes/CodespaceRange.java
@@ -0,0 +1,88 @@
+/**
+ * Copyright (c) 2003, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.cmaptypes;
+
+/**
+ * This represents a single entry in the codespace range.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.3 $
+ */
+public class CodespaceRange
+{
+
+ private byte[] start;
+ private byte[] end;
+
+ /**
+ * Creates a new instance of CodespaceRange.
+ */
+ public CodespaceRange()
+ {
+ }
+
+ /** Getter for property end.
+ * @return Value of property end.
+ *
+ */
+ public byte[] getEnd()
+ {
+ return this.end;
+ }
+
+ /** Setter for property end.
+ * @param endBytes New value of property end.
+ *
+ */
+ public void setEnd(byte[] endBytes)
+ {
+ end = endBytes;
+ }
+
+ /** Getter for property start.
+ * @return Value of property start.
+ *
+ */
+ public byte[] getStart()
+ {
+ return this.start;
+ }
+
+ /** Setter for property start.
+ * @param startBytes New value of property start.
+ *
+ */
+ public void setStart(byte[] startBytes)
+ {
+ start = startBytes;
+ }
+
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/cmaptypes/package.html b/src/main/java/org/pdfbox/cmaptypes/package.html
new file mode 100644
index 0000000..f1bfcac
--- /dev/null
+++ b/src/main/java/org/pdfbox/cmaptypes/package.html
@@ -0,0 +1,9 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head>
+
+</head>
+<body>
+This package holds classes that are used to represent cmap files as java objects.
+</body>
+</html>
diff --git a/src/main/java/org/pdfbox/cos/COSArray.java b/src/main/java/org/pdfbox/cos/COSArray.java
new file mode 100644
index 0000000..cb7d278
--- /dev/null
+++ b/src/main/java/org/pdfbox/cos/COSArray.java
@@ -0,0 +1,492 @@
+/**
+ * Copyright (c) 2003-2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.cos;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.List;
+
+
+
+import org.pdfbox.exceptions.COSVisitorException;
+import org.pdfbox.pdmodel.common.COSObjectable;
+
+/**
+ * An array of PDFBase objects as part of the PDF document.
+ *
+ * @author Ben Litchfield (ben@benlitchfield.com)
+ * @version $Revision: 1.22 $
+ */
+public class COSArray extends COSBase
+{
+ private List objects = new ArrayList();
+
+ /**
+ * Constructor.
+ */
+ public COSArray()
+ {
+ //default constructor
+ }
+
+ /**
+ * This will add an object to the array.
+ *
+ * @param object The object to add to the array.
+ */
+ public void add( COSBase object )
+ {
+ objects.add( object );
+ }
+
+ /**
+ * This will add an object to the array.
+ *
+ * @param object The object to add to the array.
+ */
+ public void add( COSObjectable object )
+ {
+ objects.add( object.getCOSObject() );
+ }
+
+ /**
+ * Add the specified object at the ith location and push the rest to the
+ * right.
+ *
+ * @param i The index to add at.
+ * @param object The object to add at that index.
+ */
+ public void add( int i, COSBase object)
+ {
+ objects.add( i, object );
+ }
+
+ /**
+ * This will remove all of the objects in the collection.
+ */
+ public void clear()
+ {
+ objects.clear();
+ }
+
+ /**
+ * This will remove all of the objects in the collection.
+ *
+ * @param objectsList The list of objects to remove from the collection.
+ */
+ public void removeAll( Collection objectsList )
+ {
+ objects.removeAll( objectsList );
+ }
+
+ /**
+ * This will retain all of the objects in the collection.
+ *
+ * @param objectsList The list of objects to retain from the collection.
+ */
+ public void retainAll( Collection objectsList )
+ {
+ objects.retainAll( objectsList );
+ }
+
+ /**
+ * This will add an object to the array.
+ *
+ * @param objectsList The object to add to the array.
+ */
+ public void addAll( Collection objectsList )
+ {
+ objects.addAll( objectsList );
+ }
+
+ /**
+ * This will add all objects to this array.
+ *
+ * @param objectList The objects to add.
+ */
+ public void addAll( COSArray objectList )
+ {
+ objects.addAll( objectList.objects );
+ }
+
+ /**
+ * Add the specified object at the ith location and push the rest to the
+ * right.
+ *
+ * @param i The index to add at.
+ * @param objectList The object to add at that index.
+ */
+ public void addAll( int i, Collection objectList )
+ {
+ objects.addAll( i, objectList );
+ }
+
+ /**
+ * This will set an object at a specific index.
+ *
+ * @param index zero based index into array.
+ * @param object The object to set.
+ */
+ public void set( int index, COSBase object )
+ {
+ objects.set( index, object );
+ }
+
+ /**
+ * This will set an object at a specific index.
+ *
+ * @param index zero based index into array.
+ * @param intVal The object to set.
+ */
+ public void set( int index, int intVal )
+ {
+ objects.set( index, new COSInteger( intVal ) );
+ }
+
+ /**
+ * This will set an object at a specific index.
+ *
+ * @param index zero based index into array.
+ * @param object The object to set.
+ */
+ public void set( int index, COSObjectable object )
+ {
+ COSBase base = null;
+ if( object != null )
+ {
+ base = object.getCOSObject();
+ }
+ objects.set( index, base );
+ }
+
+ /**
+ * This will get an object from the array. This will dereference the object.
+ * If the object is COSNull then null will be returned.
+ *
+ * @param index The index into the array to get the object.
+ *
+ * @return The object at the requested index.
+ */
+ public COSBase getObject( int index )
+ {
+ Object obj = objects.get( index );
+ if( obj instanceof COSObject )
+ {
+ obj = ((COSObject)obj).getObject();
+ }
+ if( obj instanceof COSNull )
+ {
+ obj = null;
+ }
+ return (COSBase)obj;
+ }
+
+ /**
+ * This will get an object from the array. This will NOT derefernce
+ * the COS object.
+ *
+ * @param index The index into the array to get the object.
+ *
+ * @return The object at the requested index.
+ */
+ public COSBase get( int index )
+ {
+ return (COSBase)objects.get( index );
+ }
+
+ /**
+ * Get the value of the array as an integer.
+ *
+ * @param index The index into the list.
+ *
+ * @return The value at that index or -1 if it is null.
+ */
+ public int getInt( int index )
+ {
+ return getInt( index, -1 );
+ }
+
+ /**
+ * Get the value of the array as an integer, return the default if it does
+ * not exist.
+ *
+ * @param index The value of the array.
+ * @param defaultValue The value to return if the value is null.
+ * @return The value at the index or the defaultValue.
+ */
+ public int getInt( int index, int defaultValue )
+ {
+ int retval = defaultValue;
+ if( defaultValue < size() )
+ {
+ COSNumber number = (COSNumber)get( index );
+ if( number != null )
+ {
+ retval = number.intValue();
+ }
+ }
+ return retval;
+ }
+
+ /**
+ * Set the value in the array as an integer.
+ *
+ * @param index The index into the array.
+ * @param value The value to set.
+ */
+ public void setInt( int index, int value )
+ {
+ set( index, new COSInteger( value ) );
+ }
+
+ /**
+ * Set the value in the array as a name.
+ * @param index The index into the array.
+ * @param name The name to set in the array.
+ */
+ public void setName( int index, String name )
+ {
+ set( index, COSName.getPDFName( name ) );
+ }
+
+ /**
+ * Get the value of the array as a string.
+ *
+ * @param index The index into the array.
+ * @return The name converted to a string or null if it does not exist.
+ */
+ public String getName( int index )
+ {
+ return getName( index, null );
+ }
+
+ /**
+ * Get an entry in the array that is expected to be a COSName.
+ * @param index The index into the array.
+ * @param defaultValue The value to return if it is null.
+ * @return The value at the index or defaultValue if none is found.
+ */
+ public String getName( int index, String defaultValue )
+ {
+ String retval = defaultValue;
+ if( index < size() )
+ {
+ COSName name = (COSName)get( index );
+ if( name != null )
+ {
+ retval = name.getName();
+ }
+ }
+ return retval;
+ }
+
+ /**
+ * Set the value in the array as a string.
+ * @param index The index into the array.
+ * @param string The string to set in the array.
+ */
+ public void setString( int index, String string )
+ {
+ set( index, new COSString( string ) );
+ }
+
+ /**
+ * Get the value of the array as a string.
+ *
+ * @param index The index into the array.
+ * @return The string or null if it does not exist.
+ */
+ public String getString( int index )
+ {
+ return getString( index, null );
+ }
+
+ /**
+ * Get an entry in the array that is expected to be a COSName.
+ * @param index The index into the array.
+ * @param defaultValue The value to return if it is null.
+ * @return The value at the index or defaultValue if none is found.
+ */
+ public String getString( int index, String defaultValue )
+ {
+ String retval = defaultValue;
+ if( index < size() )
+ {
+ COSString string = (COSString)get( index );
+ if( string != null )
+ {
+ retval = string.getString();
+ }
+ }
+ return retval;
+ }
+
+ /**
+ * This will get the size of this array.
+ *
+ * @return The number of elements in the array.
+ */
+ public int size()
+ {
+ return objects.size();
+ }
+
+ /**
+ * This will remove an element from the array.
+ *
+ * @param i The index of the object to remove.
+ *
+ * @return The object that was removed.
+ */
+ public COSBase remove( int i )
+ {
+ return (COSBase)objects.remove( i );
+ }
+
+ /**
+ * This will remove an element from the array.
+ *
+ * @param o The object to remove.
+ *
+ * @return The object that was removed.
+ */
+ public boolean remove( COSBase o )
+ {
+ return objects.remove( o );
+ }
+
+ /**
+ * @see Object#toString()
+ */
+ public String toString()
+ {
+ return "COSArray{" + objects + "}";
+ }
+
+ /**
+ * Get access to the list.
+ *
+ * @return an iterator over the array elements
+ */
+ public Iterator iterator()
+ {
+ return objects.iterator();
+ }
+
+ /**
+ * This will return the index of the entry or -1 if it is not found.
+ *
+ * @param object The object to search for.
+ * @return The index of the object or -1.
+ */
+ public int indexOf( COSBase object )
+ {
+ int retval = -1;
+ for( int i=0; retval < 0 && i<size(); i++ )
+ {
+ if( get( i ).equals( object ) )
+ {
+ retval = i;
+ }
+ }
+ return retval;
+ }
+
+ /**
+ * This will add null values until the size of the array is at least
+ * as large as the parameter. If the array is already larger than the
+ * parameter then nothing is done.
+ *
+ * @param size The desired size of the array.
+ */
+ public void growToSize( int size )
+ {
+ growToSize( size, null );
+ }
+
+ /**
+ * This will add the object until the size of the array is at least
+ * as large as the parameter. If the array is already larger than the
+ * parameter then nothing is done.
+ *
+ * @param size The desired size of the array.
+ * @param object The object to fill the array with.
+ */
+ public void growToSize( int size, COSBase object )
+ {
+ while( size() < size )
+ {
+ add( object );
+ }
+ }
+
+ /**
+ * visitor pattern double dispatch method.
+ *
+ * @param visitor The object to notify when visiting this object.
+ * @return any object, depending on the visitor implementation, or null
+ * @throws COSVisitorException If an error occurs while visiting this object.
+ */
+ public Object accept(ICOSVisitor visitor) throws COSVisitorException
+ {
+ return visitor.visitFromArray(this);
+ }
+
+ /**
+ * This will take an COSArray of numbers and convert it to a float[].
+ *
+ * @return This COSArray as an array of float numbers.
+ */
+ public float[] toFloatArray()
+ {
+ float[] retval = new float[size()];
+ for( int i=0; i<size(); i++ )
+ {
+ retval[i] = ((COSNumber)getObject( i )).floatValue();
+ }
+ return retval;
+ }
+
+ /**
+ * Clear the current contents of the COSArray and set it with the float[].
+ *
+ * @param value The new value of the float array.
+ */
+ public void setFloatArray( float[] value )
+ {
+ this.clear();
+ for( int i=0; i<value.length; i++ )
+ {
+ add( new COSFloat( value[i] ) );
+ }
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/cos/COSBase.java b/src/main/java/org/pdfbox/cos/COSBase.java
new file mode 100644
index 0000000..85e0c45
--- /dev/null
+++ b/src/main/java/org/pdfbox/cos/COSBase.java
@@ -0,0 +1,86 @@
+/**
+ * Copyright (c) 2003-2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.cos;
+
+import org.pdfbox.filter.FilterManager;
+import org.pdfbox.pdmodel.common.COSObjectable;
+
+import org.pdfbox.exceptions.COSVisitorException;
+
+/**
+ * The base object that all objects in the PDF document will extend.
+ *
+ * @author Ben Litchfield (ben@benlitchfield.com)
+ * @version $Revision: 1.13 $
+ */
+public abstract class COSBase implements COSObjectable
+{
+ /**
+ * Constructor.
+ */
+ public COSBase()
+ {
+ }
+
+ /**
+ * This will get the filter manager to use to filter streams.
+ *
+ * @return The filter manager.
+ */
+ public FilterManager getFilterManager()
+ {
+ /**
+ * @todo move this to PDFdocument or something better
+ */
+ return new FilterManager();
+ }
+
+ /**
+ * Convert this standard java object to a COS object.
+ *
+ * @return The cos object that matches this Java object.
+ */
+ public COSBase getCOSObject()
+ {
+ return this;
+ }
+
+
+
+ /**
+ * visitor pattern double dispatch method.
+ *
+ * @param visitor The object to notify when visiting this object.
+ * @return any object, depending on the visitor implementation, or null
+ * @throws COSVisitorException If an error occurs while visiting this object.
+ */
+ public abstract Object accept(ICOSVisitor visitor) throws COSVisitorException;
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/cos/COSBoolean.java b/src/main/java/org/pdfbox/cos/COSBoolean.java
new file mode 100644
index 0000000..0fe2d6f
--- /dev/null
+++ b/src/main/java/org/pdfbox/cos/COSBoolean.java
@@ -0,0 +1,161 @@
+/**
+ * Copyright (c) 2003, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.cos;
+
+import java.io.IOException;
+import java.io.OutputStream;
+
+import org.pdfbox.exceptions.COSVisitorException;
+
+/**
+ * This class represents a boolean value in the PDF document.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.13 $
+ */
+public class COSBoolean extends COSBase
+{
+ /**
+ * The true boolean token.
+ */
+ public static final byte[] TRUE_BYTES = new byte[]{ 116, 114, 117, 101 }; //"true".getBytes( "ISO-8859-1" );
+ /**
+ * The false boolean token.
+ */
+ public static final byte[] FALSE_BYTES = new byte[]{ 102, 97, 108, 115, 101 }; //"false".getBytes( "ISO-8859-1" );
+
+ /**
+ * The PDF true value.
+ */
+ public static final COSBoolean TRUE = new COSBoolean( true );
+
+ /**
+ * The PDF false value.
+ */
+ public static final COSBoolean FALSE = new COSBoolean( false );
+
+ private boolean value;
+
+ /**
+ * Constructor.
+ *
+ * @param aValue The boolean value.
+ */
+ private COSBoolean(boolean aValue )
+ {
+ value = aValue;
+ }
+
+ /**
+ * This will get the value that this object wraps.
+ *
+ * @return The boolean value of this object.
+ */
+ public boolean getValue()
+ {
+ return value;
+ }
+
+ /**
+ * This will get the value that this object wraps.
+ *
+ * @return The boolean value of this object.
+ */
+ public Boolean getValueAsObject()
+ {
+ return (value?Boolean.TRUE:Boolean.FALSE);
+ }
+
+ /**
+ * This will get the boolean value.
+ *
+ * @param value Parameter telling which boolean value to get.
+ *
+ * @return The single boolean instance that matches the parameter.
+ */
+ public static COSBoolean getBoolean( boolean value )
+ {
+ return (value?TRUE:FALSE);
+ }
+
+ /**
+ * This will get the boolean value.
+ *
+ * @param value Parameter telling which boolean value to get.
+ *
+ * @return The single boolean instance that matches the parameter.
+ */
+ public static COSBoolean getBoolean( Boolean value )
+ {
+ return getBoolean( value.booleanValue() );
+ }
+
+ /**
+ * visitor pattern double dispatch method.
+ *
+ * @param visitor The object to notify when visiting this object.
+ * @return any object, depending on the visitor implementation, or null
+ * @throws COSVisitorException If an error occurs while visiting this object.
+ */
+ public Object accept(ICOSVisitor visitor) throws COSVisitorException
+ {
+ return visitor.visitFromBoolean(this);
+ }
+
+ /**
+ * Return a string representation of this object.
+ *
+ * @return The string value of this object.
+ */
+ public String toString()
+ {
+ return String.valueOf( value );
+ }
+
+ /**
+ * This will write this object out to a PDF stream.
+ *
+ * @param output The stream to write this object out to.
+ *
+ * @throws IOException If an error occurs while writing out this object.
+ */
+ public void writePDF( OutputStream output ) throws IOException
+ {
+ if( value )
+ {
+ output.write( TRUE_BYTES );
+ }
+ else
+ {
+ output.write( FALSE_BYTES );
+ }
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/cos/COSDictionary.java b/src/main/java/org/pdfbox/cos/COSDictionary.java
new file mode 100644
index 0000000..eb92433
--- /dev/null
+++ b/src/main/java/org/pdfbox/cos/COSDictionary.java
@@ -0,0 +1,1167 @@
+/**
+ * Copyright (c) 2003-2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.cos;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import java.util.Iterator;
+
+import org.pdfbox.exceptions.COSVisitorException;
+
+import org.pdfbox.pdmodel.common.COSObjectable;
+import org.pdfbox.util.DateConverter;
+
+/**
+ * This class represents a dictionary where name/value pairs reside.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.29 $
+ */
+public class COSDictionary extends COSBase
+{
+ private static final String PATH_SEPARATOR = "/";
+
+ /**
+ * These are all of the items in the dictionary.
+ */
+ private Map items = new HashMap();
+
+ /**
+ * Used to store original sequence of keys, for testing.
+ */
+ private List keys = new ArrayList();
+
+ /**
+ * Constructor.
+ */
+ public COSDictionary()
+ {
+ //default constructor
+ }
+
+ /**
+ * Copy Constructor. This will make a shallow copy of this dictionary.
+ *
+ * @param dict The dictionary to copy.
+ */
+ public COSDictionary( COSDictionary dict )
+ {
+ items = new HashMap( dict.items );
+ keys = new ArrayList( dict.keys );
+ }
+
+ /**
+ * This will return the number of elements in this dictionary.
+ *
+ * @return The number of elements in the dictionary.
+ */
+ public int size()
+ {
+ return keys.size();
+ }
+
+ /**
+ * This will clear all items in the map.
+ */
+ public void clear()
+ {
+ items.clear();
+ keys.clear();
+ }
+
+ /**
+ * This will get an object from this dictionary. If the object is a reference then it will
+ * dereference it and get it from the document. If the object is COSNull then
+ * null will be returned.
+ *
+ * @param key The key to the object that we are getting.
+ *
+ * @return The object that matches the key.
+ */
+ public COSBase getDictionaryObject( String key )
+ {
+ return getDictionaryObject( COSName.getPDFName( key ) );
+ }
+
+ /**
+ * This is a special case of getDictionaryObject that takes multiple keys, it will handle
+ * the situation where multiple keys could get the same value, ie if either CS or ColorSpace
+ * is used to get the colorspace.
+ * This will get an object from this dictionary. If the object is a reference then it will
+ * dereference it and get it from the document. If the object is COSNull then
+ * null will be returned.
+ *
+ * @param keyList The list of keys to find a value.
+ *
+ * @return The object that matches the key.
+ */
+ public COSBase getDictionaryObject( String[] keyList )
+ {
+ COSBase retval = null;
+ for( int i=0; i<keyList.length && retval == null; i++ )
+ {
+ retval = getDictionaryObject( COSName.getPDFName( keyList[i] ) );
+ }
+ return retval;
+ }
+
+ /**
+ * This will get an object from this dictionary. If the object is a reference then it will
+ * dereference it and get it from the document. If the object is COSNull then
+ * null will be returned.
+ *
+ * @param key The key to the object that we are getting.
+ *
+ * @return The object that matches the key.
+ */
+ public COSBase getDictionaryObject( COSName key )
+ {
+ COSBase retval = (COSBase)items.get( key );
+ if( retval instanceof COSObject )
+ {
+ retval = ((COSObject)retval).getObject();
+ }
+ if( retval instanceof COSNull )
+ {
+ retval = null;
+ }
+ return retval;
+ }
+
+ /**
+ * This will set an item in the dictionary. If value is null then the result
+ * will be the same as removeItem( key ).
+ *
+ * @param key The key to the dictionary object.
+ * @param value The value to the dictionary object.
+ */
+ public void setItem( COSName key, COSBase value )
+ {
+ if( value == null )
+ {
+ removeItem( key );
+ }
+ else
+ {
+ if (!items.containsKey(key))
+ {
+ // insert only if not already there
+ keys.add(key);
+ }
+ items.put( key, value );
+ }
+ }
+
+ /**
+ * This will set an item in the dictionary. If value is null then the result
+ * will be the same as removeItem( key ).
+ *
+ * @param key The key to the dictionary object.
+ * @param value The value to the dictionary object.
+ */
+ public void setItem( COSName key, COSObjectable value )
+ {
+ COSBase base = null;
+ if( value != null )
+ {
+ base = value.getCOSObject();
+ }
+ setItem( key, base );
+ }
+
+ /**
+ * This will set an item in the dictionary. If value is null then the result
+ * will be the same as removeItem( key ).
+ *
+ * @param key The key to the dictionary object.
+ * @param value The value to the dictionary object.
+ */
+ public void setItem( String key, COSObjectable value )
+ {
+ setItem( COSName.getPDFName( key ), value );
+ }
+
+ /**
+ * This will set an item in the dictionary.
+ *
+ * @param key The key to the dictionary object.
+ * @param value The value to the dictionary object.
+ */
+ public void setBoolean( String key, boolean value )
+ {
+ setItem( COSName.getPDFName( key ), COSBoolean.getBoolean( value ) );
+ }
+
+ /**
+ * This will set an item in the dictionary.
+ *
+ * @param key The key to the dictionary object.
+ * @param value The value to the dictionary object.
+ */
+ public void setBoolean( COSName key, boolean value )
+ {
+ setItem( key , COSBoolean.getBoolean( value ) );
+ }
+
+ /**
+ * This will set an item in the dictionary. If value is null then the result
+ * will be the same as removeItem( key ).
+ *
+ * @param key The key to the dictionary object.
+ * @param value The value to the dictionary object.
+ */
+ public void setItem( String key, COSBase value )
+ {
+ setItem( COSName.getPDFName( key ), value );
+ }
+
+ /**
+ * This is a convenience method that will convert the value to a COSName
+ * object. If it is null then the object will be removed.
+ *
+ * @param key The key to the object,
+ * @param value The string value for the name.
+ */
+ public void setName( String key, String value )
+ {
+ setName( COSName.getPDFName( key ), value );
+ }
+
+ /**
+ * This is a convenience method that will convert the value to a COSName
+ * object. If it is null then the object will be removed.
+ *
+ * @param key The key to the object,
+ * @param value The string value for the name.
+ */
+ public void setName( COSName key, String value )
+ {
+ COSName name = null;
+ if( value != null )
+ {
+ name = COSName.getPDFName( value );
+ }
+ setItem( key, name );
+ }
+
+ /**
+ * Set the value of a date entry in the dictionary.
+ *
+ * @param key The key to the date value.
+ * @param date The date value.
+ */
+ public void setDate( String key, Calendar date )
+ {
+ setDate( COSName.getPDFName( key ), date );
+ }
+
+ /**
+ * Set the date object.
+ *
+ * @param key The key to the date.
+ * @param date The date to set.
+ */
+ public void setDate( COSName key, Calendar date )
+ {
+ setString( key, DateConverter.toString( date ) );
+ }
+
+ /**
+ * Set the value of a date entry in the dictionary.
+ *
+ * @param embedded The embedded dictionary.
+ * @param key The key to the date value.
+ * @param date The date value.
+ */
+ public void setEmbeddedDate( String embedded, String key, Calendar date )
+ {
+ setEmbeddedDate( embedded, COSName.getPDFName( key ), date );
+ }
+
+ /**
+ * Set the date object.
+ *
+ * @param embedded The embedded dictionary.
+ * @param key The key to the date.
+ * @param date The date to set.
+ */
+ public void setEmbeddedDate( String embedded, COSName key, Calendar date )
+ {
+ COSDictionary dic = (COSDictionary)getDictionaryObject( embedded );
+ if( dic == null && date != null )
+ {
+ dic = new COSDictionary();
+ setItem( embedded, dic );
+ }
+ if( dic != null )
+ {
+ dic.setDate( key, date );
+ }
+ }
+
+ /**
+ * This is a convenience method that will convert the value to a COSString
+ * object. If it is null then the object will be removed.
+ *
+ * @param key The key to the object,
+ * @param value The string value for the name.
+ */
+ public void setString( String key, String value )
+ {
+ setString( COSName.getPDFName( key ), value );
+ }
+
+ /**
+ * This is a convenience method that will convert the value to a COSString
+ * object. If it is null then the object will be removed.
+ *
+ * @param key The key to the object,
+ * @param value The string value for the name.
+ */
+ public void setString( COSName key, String value )
+ {
+ COSString name = null;
+ if( value != null )
+ {
+ name = new COSString( value );
+ }
+ setItem( key, name );
+ }
+
+ /**
+ * This is a convenience method that will convert the value to a COSString
+ * object. If it is null then the object will be removed.
+ *
+ * @param embedded The embedded dictionary to set the item in.
+ * @param key The key to the object,
+ * @param value The string value for the name.
+ */
+ public void setEmbeddedString( String embedded, String key, String value )
+ {
+ setEmbeddedString( embedded, COSName.getPDFName( key ), value );
+ }
+
+ /**
+ * This is a convenience method that will convert the value to a COSString
+ * object. If it is null then the object will be removed.
+ *
+ * @param embedded The embedded dictionary to set the item in.
+ * @param key The key to the object,
+ * @param value The string value for the name.
+ */
+ public void setEmbeddedString( String embedded, COSName key, String value )
+ {
+ COSDictionary dic = (COSDictionary)getDictionaryObject( embedded );
+ if( dic == null && value != null )
+ {
+ dic = new COSDictionary();
+ setItem( embedded, dic );
+ }
+ if( dic != null )
+ {
+ dic.setString( key, value );
+ }
+ }
+
+ /**
+ * This is a convenience method that will convert the value to a COSInteger
+ * object.
+ *
+ * @param key The key to the object,
+ * @param value The int value for the name.
+ */
+ public void setInt( String key, int value )
+ {
+ setInt( COSName.getPDFName( key ), value );
+ }
+
+ /**
+ * This is a convenience method that will convert the value to a COSInteger
+ * object.
+ *
+ * @param key The key to the object,
+ * @param value The int value for the name.
+ */
+ public void setInt( COSName key, int value )
+ {
+ COSInteger intVal = null;
+ intVal = new COSInteger(value);
+ setItem( key, intVal );
+ }
+
+ /**
+ * This is a convenience method that will convert the value to a COSInteger
+ * object.
+ *
+ * @param embeddedDictionary The embedded dictionary.
+ * @param key The key to the object,
+ * @param value The int value for the name.
+ */
+ public void setEmbeddedInt( String embeddedDictionary, String key, int value )
+ {
+ setEmbeddedInt( embeddedDictionary, COSName.getPDFName( key ), value );
+ }
+
+ /**
+ * This is a convenience method that will convert the value to a COSInteger
+ * object.
+ *
+ * @param embeddedDictionary The embedded dictionary.
+ * @param key The key to the object,
+ * @param value The int value for the name.
+ */
+ public void setEmbeddedInt( String embeddedDictionary, COSName key, int value )
+ {
+ COSDictionary embedded = (COSDictionary)getDictionaryObject( embeddedDictionary );
+ if( embedded == null )
+ {
+ embedded = new COSDictionary();
+ setItem( embeddedDictionary, embedded );
+ }
+ embedded.setInt( key, value );
+ }
+
+ /**
+ * This is a convenience method that will convert the value to a COSFloat
+ * object.
+ *
+ * @param key The key to the object,
+ * @param value The int value for the name.
+ */
+ public void setFloat( String key, float value )
+ {
+ setFloat( COSName.getPDFName( key ), value );
+ }
+
+ /**
+ * This is a convenience method that will convert the value to a COSFloat
+ * object.
+ *
+ * @param key The key to the object,
+ * @param value The int value for the name.
+ */
+ public void setFloat( COSName key, float value )
+ {
+ COSFloat fltVal = new COSFloat( value );
+ setItem( key, fltVal );
+ }
+
+ /**
+ * This is a convenience method that will get the dictionary object that
+ * is expected to be a name and convert it to a string. Null is returned
+ * if the entry does not exist in the dictionary.
+ *
+ * @param key The key to the item in the dictionary.
+ * @return The name converted to a string.
+ */
+ public String getNameAsString( String key )
+ {
+ return getNameAsString( COSName.getPDFName( key ) );
+ }
+
+ /**
+ * This is a convenience method that will get the dictionary object that
+ * is expected to be a name and convert it to a string. Null is returned
+ * if the entry does not exist in the dictionary.
+ *
+ * @param key The key to the item in the dictionary.
+ * @return The name converted to a string.
+ */
+ public String getNameAsString( COSName key )
+ {
+ String retval = null;
+ COSName name = (COSName)getDictionaryObject( key );
+ if( name != null )
+ {
+ retval = name.getName();
+ }
+ return retval;
+ }
+
+ /**
+ * This is a convenience method that will get the dictionary object that
+ * is expected to be a name and convert it to a string. Null is returned
+ * if the entry does not exist in the dictionary.
+ *
+ * @param key The key to the item in the dictionary.
+ * @param defaultValue The value to return if the dictionary item is null.
+ * @return The name converted to a string.
+ */
+ public String getNameAsString( String key, String defaultValue )
+ {
+ return getNameAsString( COSName.getPDFName( key ), defaultValue );
+ }
+
+ /**
+ * This is a convenience method that will get the dictionary object that
+ * is expected to be a name and convert it to a string. Null is returned
+ * if the entry does not exist in the dictionary.
+ *
+ * @param key The key to the item in the dictionary.
+ * @param defaultValue The value to return if the dictionary item is null.
+ * @return The name converted to a string.
+ */
+ public String getNameAsString( COSName key, String defaultValue )
+ {
+ String retval = getNameAsString( key );
+ if( retval == null )
+ {
+ retval = defaultValue;
+ }
+ return retval;
+ }
+
+ /**
+ * This is a convenience method that will get the dictionary object that
+ * is expected to be a name and convert it to a string. Null is returned
+ * if the entry does not exist in the dictionary.
+ *
+ * @param key The key to the item in the dictionary.
+ * @return The name converted to a string.
+ */
+ public String getString( String key )
+ {
+ return getString( COSName.getPDFName( key ) );
+ }
+
+ /**
+ * This is a convenience method that will get the dictionary object that
+ * is expected to be a name and convert it to a string. Null is returned
+ * if the entry does not exist in the dictionary.
+ *
+ * @param key The key to the item in the dictionary.
+ * @return The name converted to a string.
+ */
+ public String getString( COSName key )
+ {
+ String retval = null;
+ COSString name = (COSString)getDictionaryObject( key );
+ if( name != null )
+ {
+ retval = name.getString();
+ }
+ return retval;
+ }
+
+ /**
+ * This is a convenience method that will get the dictionary object that
+ * is expected to be a name and convert it to a string. Null is returned
+ * if the entry does not exist in the dictionary.
+ *
+ * @param key The key to the item in the dictionary.
+ * @param defaultValue The default value to return.
+ * @return The name converted to a string.
+ */
+ public String getString( String key, String defaultValue )
+ {
+ return getString( COSName.getPDFName( key ), defaultValue );
+ }
+
+ /**
+ * This is a convenience method that will get the dictionary object that
+ * is expected to be a name and convert it to a string. Null is returned
+ * if the entry does not exist in the dictionary.
+ *
+ * @param key The key to the item in the dictionary.
+ * @param defaultValue The default value to return.
+ * @return The name converted to a string.
+ */
+ public String getString( COSName key, String defaultValue )
+ {
+ String retval = getString( key );
+ if( retval == null )
+ {
+ retval = defaultValue;
+ }
+ return retval;
+ }
+
+ /**
+ * This is a convenience method that will get the dictionary object that
+ * is expected to be a name and convert it to a string. Null is returned
+ * if the entry does not exist in the dictionary.
+ *
+ * @param embedded The embedded dictionary.
+ * @param key The key to the item in the dictionary.
+ * @return The name converted to a string.
+ */
+ public String getEmbeddedString( String embedded, String key )
+ {
+ return getEmbeddedString( embedded, COSName.getPDFName( key ), null );
+ }
+
+ /**
+ * This is a convenience method that will get the dictionary object that
+ * is expected to be a name and convert it to a string. Null is returned
+ * if the entry does not exist in the dictionary.
+ *
+ * @param embedded The embedded dictionary.
+ * @param key The key to the item in the dictionary.
+ * @return The name converted to a string.
+ */
+ public String getEmbeddedString( String embedded, COSName key )
+ {
+ return getEmbeddedString( embedded, key, null );
+ }
+
+ /**
+ * This is a convenience method that will get the dictionary object that
+ * is expected to be a name and convert it to a string. Null is returned
+ * if the entry does not exist in the dictionary.
+ *
+ * @param embedded The embedded dictionary.
+ * @param key The key to the item in the dictionary.
+ * @param defaultValue The default value to return.
+ * @return The name converted to a string.
+ */
+ public String getEmbeddedString( String embedded, String key, String defaultValue )
+ {
+ return getEmbeddedString( embedded, COSName.getPDFName( key ), defaultValue );
+ }
+
+ /**
+ * This is a convenience method that will get the dictionary object that
+ * is expected to be a name and convert it to a string. Null is returned
+ * if the entry does not exist in the dictionary.
+ *
+ * @param embedded The embedded dictionary.
+ * @param key The key to the item in the dictionary.
+ * @param defaultValue The default value to return.
+ * @return The name converted to a string.
+ */
+ public String getEmbeddedString( String embedded, COSName key, String defaultValue )
+ {
+ String retval = defaultValue;
+ COSDictionary dic = (COSDictionary)getDictionaryObject( embedded );
+ if( dic != null )
+ {
+ retval = dic.getString( key, defaultValue );
+ }
+ return retval;
+ }
+
+ /**
+ * This is a convenience method that will get the dictionary object that
+ * is expected to be a name and convert it to a string. Null is returned
+ * if the entry does not exist in the dictionary.
+ *
+ * @param key The key to the item in the dictionary.
+ * @return The name converted to a string.
+ * @throws IOException If there is an error converting to a date.
+ */
+ public Calendar getDate( String key ) throws IOException
+ {
+ return getDate( COSName.getPDFName( key ) );
+ }
+
+ /**
+ * This is a convenience method that will get the dictionary object that
+ * is expected to be a name and convert it to a string. Null is returned
+ * if the entry does not exist in the dictionary.
+ *
+ * @param key The key to the item in the dictionary.
+ * @return The name converted to a string.
+ *
+ * @throws IOException If there is an error converting to a date.
+ */
+ public Calendar getDate( COSName key ) throws IOException
+ {
+ COSString date = (COSString)getDictionaryObject( key );
+ return DateConverter.toCalendar( date );
+ }
+
+ /**
+ * This is a convenience method that will get the dictionary object that
+ * is expected to be a date. Null is returned
+ * if the entry does not exist in the dictionary.
+ *
+ * @param key The key to the item in the dictionary.
+ * @param defaultValue The default value to return.
+ * @return The name converted to a string.
+ * @throws IOException If there is an error converting to a date.
+ */
+ public Calendar getDate( String key, Calendar defaultValue ) throws IOException
+ {
+ return getDate( COSName.getPDFName( key ), defaultValue );
+ }
+
+ /**
+ * This is a convenience method that will get the dictionary object that
+ * is expected to be a date. Null is returned
+ * if the entry does not exist in the dictionary.
+ *
+ * @param key The key to the item in the dictionary.
+ * @param defaultValue The default value to return.
+ * @return The name converted to a string.
+ * @throws IOException If there is an error converting to a date.
+ */
+ public Calendar getDate( COSName key, Calendar defaultValue ) throws IOException
+ {
+ Calendar retval = getDate( key );
+ if( retval == null )
+ {
+ retval = defaultValue;
+ }
+ return retval;
+ }
+
+ /**
+ * This is a convenience method that will get the dictionary object that
+ * is expected to be a name and convert it to a string. Null is returned
+ * if the entry does not exist in the dictionary.
+ *
+ * @param embedded The embedded dictionary to get.
+ * @param key The key to the item in the dictionary.
+ * @return The name converted to a string.
+ * @throws IOException If there is an error converting to a date.
+ */
+ public Calendar getEmbeddedDate( String embedded, String key ) throws IOException
+ {
+ return getEmbeddedDate( embedded, COSName.getPDFName( key ), null );
+ }
+
+ /**
+ * This is a convenience method that will get the dictionary object that
+ * is expected to be a name and convert it to a string. Null is returned
+ * if the entry does not exist in the dictionary.
+ *
+ * @param embedded The embedded dictionary to get.
+ * @param key The key to the item in the dictionary.
+ * @return The name converted to a string.
+ *
+ * @throws IOException If there is an error converting to a date.
+ */
+ public Calendar getEmbeddedDate( String embedded, COSName key ) throws IOException
+ {
+ return getEmbeddedDate( embedded, key, null );
+ }
+
+ /**
+ * This is a convenience method that will get the dictionary object that
+ * is expected to be a date. Null is returned
+ * if the entry does not exist in the dictionary.
+ *
+ * @param embedded The embedded dictionary to get.
+ * @param key The key to the item in the dictionary.
+ * @param defaultValue The default value to return.
+ * @return The name converted to a string.
+ * @throws IOException If there is an error converting to a date.
+ */
+ public Calendar getEmbeddedDate( String embedded, String key, Calendar defaultValue ) throws IOException
+ {
+ return getEmbeddedDate( embedded, COSName.getPDFName( key ), defaultValue );
+ }
+
+ /**
+ * This is a convenience method that will get the dictionary object that
+ * is expected to be a date. Null is returned
+ * if the entry does not exist in the dictionary.
+ *
+ * @param embedded The embedded dictionary to get.
+ * @param key The key to the item in the dictionary.
+ * @param defaultValue The default value to return.
+ * @return The name converted to a string.
+ * @throws IOException If there is an error converting to a date.
+ */
+ public Calendar getEmbeddedDate( String embedded, COSName key, Calendar defaultValue ) throws IOException
+ {
+ Calendar retval = defaultValue;
+ COSDictionary eDic = (COSDictionary)getDictionaryObject( embedded );
+ if( eDic != null )
+ {
+ retval = eDic.getDate( key, defaultValue );
+ }
+ return retval;
+ }
+
+ /**
+ * This is a convenience method that will get the dictionary object that
+ * is expected to be a cos boolean and convert it to a primitive boolean.
+ *
+ * @param key The key to the item in the dictionary.
+ * @param defaultValue The value returned if the entry is null.
+ *
+ * @return The value converted to a boolean.
+ */
+ public boolean getBoolean( String key, boolean defaultValue )
+ {
+ return getBoolean( COSName.getPDFName( key ), defaultValue );
+ }
+
+ /**
+ * This is a convenience method that will get the dictionary object that
+ * is expected to be a COSBoolean and convert it to a primitive boolean.
+ *
+ * @param key The key to the item in the dictionary.
+ * @param defaultValue The value returned if the entry is null.
+ *
+ * @return The entry converted to a boolean.
+ */
+ public boolean getBoolean( COSName key, boolean defaultValue )
+ {
+ boolean retval = defaultValue;
+ COSBoolean bool = (COSBoolean)getDictionaryObject( key );
+ if( bool != null )
+ {
+ retval = bool.getValue();
+ }
+ return retval;
+ }
+
+ /**
+ * This is a convenience method that will get the dictionary object that
+ * is expected to be an int. -1 is returned if there is no value.
+ *
+ * @param key The key to the item in the dictionary.
+ * @return The integer value.
+ */
+ public int getInt( String key )
+ {
+ return getInt( COSName.getPDFName( key ) );
+ }
+
+ /**
+ * Get an integer from an embedded dictionary. Useful for 1-1 mappings. default:-1
+ *
+ * @param embeddedDictionary The name of the embedded dictionary.
+ * @param key The key in the embedded dictionary.
+ *
+ * @return The value of the embedded integer.
+ */
+ public int getEmbeddedInt( String embeddedDictionary, String key )
+ {
+ return getEmbeddedInt( embeddedDictionary, COSName.getPDFName( key ) );
+ }
+
+ /**
+ * Get an integer from an embedded dictionary. Useful for 1-1 mappings. default:-1
+ *
+ * @param embeddedDictionary The name of the embedded dictionary.
+ * @param key The key in the embedded dictionary.
+ *
+ * @return The value of the embedded integer.
+ */
+ public int getEmbeddedInt( String embeddedDictionary, COSName key )
+ {
+ return getEmbeddedInt( embeddedDictionary, key, -1 );
+ }
+
+ /**
+ * Get an integer from an embedded dictionary. Useful for 1-1 mappings.
+ *
+ * @param embeddedDictionary The name of the embedded dictionary.
+ * @param key The key in the embedded dictionary.
+ * @param defaultValue The value if there is no embedded dictionary or it does not contain the key.
+ *
+ * @return The value of the embedded integer.
+ */
+ public int getEmbeddedInt( String embeddedDictionary, String key, int defaultValue )
+ {
+ return getEmbeddedInt( embeddedDictionary, COSName.getPDFName( key ), defaultValue );
+ }
+
+
+ /**
+ * Get an integer from an embedded dictionary. Useful for 1-1 mappings.
+ *
+ * @param embeddedDictionary The name of the embedded dictionary.
+ * @param key The key in the embedded dictionary.
+ * @param defaultValue The value if there is no embedded dictionary or it does not contain the key.
+ *
+ * @return The value of the embedded integer.
+ */
+ public int getEmbeddedInt( String embeddedDictionary, COSName key, int defaultValue )
+ {
+ int retval = defaultValue;
+ COSDictionary embedded = (COSDictionary)getDictionaryObject( embeddedDictionary );
+ if( embedded != null )
+ {
+ retval = embedded.getInt( key, defaultValue );
+ }
+ return retval;
+ }
+
+
+
+ /**
+ * This is a convenience method that will get the dictionary object that
+ * is expected to be an int. -1 is returned if there is no value.
+ *
+ * @param key The key to the item in the dictionary.
+ * @return The integer value..
+ */
+ public int getInt( COSName key )
+ {
+ return getInt( key, -1 );
+ }
+
+ /**
+ * This is a convenience method that will get the dictionary object that
+ * is expected to be an integer. If the dictionary value is null then the
+ * default Value will be returned.
+ *
+ * @param keyList The key to the item in the dictionary.
+ * @param defaultValue The value to return if the dictionary item is null.
+ * @return The integer value.
+ */
+ public int getInt( String[] keyList, int defaultValue )
+ {
+ int retval = defaultValue;
+ COSNumber obj = (COSNumber)getDictionaryObject( keyList );
+ if( obj != null )
+ {
+ retval = obj.intValue();
+ }
+ return retval;
+ }
+
+ /**
+ * This is a convenience method that will get the dictionary object that
+ * is expected to be an integer. If the dictionary value is null then the
+ * default Value will be returned.
+ *
+ * @param key The key to the item in the dictionary.
+ * @param defaultValue The value to return if the dictionary item is null.
+ * @return The integer value.
+ */
+ public int getInt( String key, int defaultValue )
+ {
+ return getInt( new String []{ key }, defaultValue );
+ }
+
+ /**
+ * This is a convenience method that will get the dictionary object that
+ * is expected to be an integer. If the dictionary value is null then the
+ * default Value will be returned.
+ *
+ * @param key The key to the item in the dictionary.
+ * @param defaultValue The value to return if the dictionary item is null.
+ * @return The integer value.
+ */
+ public int getInt( COSName key, int defaultValue )
+ {
+ return getInt(key.getName(), defaultValue );
+ }
+
+ /**
+ * This is a convenience method that will get the dictionary object that
+ * is expected to be an int. -1 is returned if there is no value.
+ *
+ * @param key The key to the item in the dictionary.
+ * @return The float value.
+ */
+ public float getFloat( String key )
+ {
+ return getFloat( COSName.getPDFName( key ) );
+ }
+
+ /**
+ * This is a convenience method that will get the dictionary object that
+ * is expected to be an float. -1 is returned if there is no value.
+ *
+ * @param key The key to the item in the dictionary.
+ * @return The float value.
+ */
+ public float getFloat( COSName key )
+ {
+ return getFloat( key, -1 );
+ }
+
+ /**
+ * This is a convenience method that will get the dictionary object that
+ * is expected to be a float. If the dictionary value is null then the
+ * default Value will be returned.
+ *
+ * @param key The key to the item in the dictionary.
+ * @param defaultValue The value to return if the dictionary item is null.
+ * @return The float value.
+ */
+ public float getFloat( String key, float defaultValue )
+ {
+ return getFloat( COSName.getPDFName( key ), defaultValue );
+ }
+
+ /**
+ * This is a convenience method that will get the dictionary object that
+ * is expected to be an float. If the dictionary value is null then the
+ * default Value will be returned.
+ *
+ * @param key The key to the item in the dictionary.
+ * @param defaultValue The value to return if the dictionary item is null.
+ * @return The float value.
+ */
+ public float getFloat( COSName key, float defaultValue )
+ {
+ float retval = defaultValue;
+ COSNumber obj = (COSNumber)getDictionaryObject( key );
+ if( obj != null )
+ {
+ retval = obj.floatValue();
+ }
+ return retval;
+ }
+
+ /**
+ * This will remove an item for the dictionary. This
+ * will do nothing of the object does not exist.
+ *
+ * @param key The key to the item to remove from the dictionary.
+ */
+ public void removeItem( COSName key )
+ {
+ keys.remove( key );
+ items.remove( key );
+ }
+
+ /**
+ * This will do a lookup into the dictionary.
+ *
+ * @param key The key to the object.
+ *
+ * @return The item that matches the key.
+ */
+ public COSBase getItem( COSName key )
+ {
+ return (COSBase)items.get( key );
+ }
+
+
+
+
+
+ /**
+ * This will get the keys for all objects in the dictionary in the sequence that
+ * they were added.
+ *
+ * @return a list of the keys in the sequence of insertion
+ *
+ */
+ public List keyList()
+ {
+ return keys;
+ }
+
+ /**
+ * This will get all of the values for the dictionary.
+ *
+ * @return All the values for the dictionary.
+ */
+ public Collection getValues()
+ {
+ return items.values();
+ }
+
+ /**
+ * visitor pattern double dispatch method.
+ *
+ * @param visitor The object to notify when visiting this object.
+ * @return The object that the visitor returns.
+ *
+ * @throws COSVisitorException If there is an error visiting this object.
+ */
+ public Object accept(ICOSVisitor visitor) throws COSVisitorException
+ {
+ return visitor.visitFromDictionary(this);
+ }
+
+ /**
+ * This will add all of the dictionarys keys/values to this dictionary.
+ *
+ * @param dic The dic to get the keys from.
+ */
+ public void addAll( COSDictionary dic )
+ {
+ Iterator dicKeys = dic.keyList().iterator();
+ while( dicKeys.hasNext() )
+ {
+ COSName key = (COSName)dicKeys.next();
+ COSBase value = dic.getItem( key );
+ setItem( key, value );
+ }
+ }
+
+ /**
+ * This will add all of the dictionarys keys/values to this dictionary, but only
+ * if they don't already exist. If a key already exists in this dictionary then
+ * nothing is changed.
+ *
+ * @param dic The dic to get the keys from.
+ */
+ public void mergeInto( COSDictionary dic )
+ {
+ Iterator dicKeys = dic.keyList().iterator();
+ while( dicKeys.hasNext() )
+ {
+ COSName key = (COSName)dicKeys.next();
+ COSBase value = dic.getItem( key );
+ if( getItem( key ) == null )
+ {
+ setItem( key, value );
+ }
+ }
+ }
+
+ /**
+ * Nice method, gives you every object you want
+ * Arrays works properly too. Try "P/Annots/[k]/Rect"
+ * where k means the index of the Annotsarray.
+ *
+ * @param objPath the relative path to the object.
+ * @return the object
+ */
+ public COSBase getObjectFromPath(String objPath)
+ {
+ COSBase retval = null;
+ String[] path = objPath.split(PATH_SEPARATOR);
+ retval = this;
+
+ for (int i = 0; i < path.length; i++)
+ {
+ if(retval instanceof COSArray)
+ {
+ int idx = new Integer(path[i].replaceAll("\\[","").replaceAll("\\]","")).intValue();
+ retval = ((COSArray)retval).getObject(idx);
+ }
+ else if (retval instanceof COSDictionary)
+ {
+ retval = ((COSDictionary)retval).getDictionaryObject( path[i] );
+ }
+ }
+ return retval;
+ }
+
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/cos/COSDocument.java b/src/main/java/org/pdfbox/cos/COSDocument.java
new file mode 100644
index 0000000..51ae684
--- /dev/null
+++ b/src/main/java/org/pdfbox/cos/COSDocument.java
@@ -0,0 +1,518 @@
+/**
+ * Copyright (c) 2003-2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.cos;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.RandomAccessFile;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+
+import org.pdfbox.exceptions.COSVisitorException;
+
+import org.pdfbox.pdfparser.PDFObjectStreamParser;
+import org.pdfbox.persistence.util.COSObjectKey;
+
+/**
+ * This is the in-memory representation of the PDF document. You need to call
+ * close() on this object when you are done using it!!
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.26 $
+ */
+public class COSDocument extends COSBase
+{
+ private float version;
+
+ /**
+ * added objects (actually preserving original sequence).
+ */
+ private List objects = new ArrayList();
+
+ /**
+ * a pool of objects read/referenced so far
+ * used to resolve indirect object references.
+ */
+ private Map objectPool = new HashMap();
+
+ /**
+ * Document trailer dictionary.
+ */
+ private COSDictionary trailer;
+
+ /**
+ * This file will store the streams in order to conserve memory.
+ */
+ private RandomAccessFile scratchFile = null;
+ private File tmpFile = null;
+
+ private String headerString = "%PDF-1.4";
+
+ /**
+ * Constructor. Uses the java.io.tmpdir value to create a file
+ * to store the streams.
+ *
+ * @throws IOException If there is an error creating the tmp file.
+ */
+ public COSDocument() throws IOException
+ {
+ this( new File( System.getProperty( "java.io.tmpdir" ) ) );
+ }
+
+ /**
+ * Constructor that will create a create a scratch file in the
+ * following directory.
+ *
+ * @param scratchDir The directory to store a scratch file.
+ *
+ * @throws IOException If there is an error creating the tmp file.
+ */
+ public COSDocument( File scratchDir ) throws IOException
+ {
+ tmpFile = File.createTempFile( "pdfbox", "tmp", scratchDir );
+ scratchFile = new RandomAccessFile( tmpFile, "rw" );
+ }
+
+ /**
+ * Constructor that will use the following random access file for storage
+ * of the PDF streams. The client of this method is responsible for deleting
+ * the storage if necessary that this file will write to. The close method
+ * will close the file though.
+ *
+ * @param file The random access file to use for storage.
+ */
+ public COSDocument( RandomAccessFile file )
+ {
+ scratchFile = file;
+ }
+
+ /**
+ * This will get the scratch file for this document.
+ *
+ * @return The scratch file.
+ */
+ public RandomAccessFile getScratchFile()
+ {
+ return scratchFile;
+ }
+
+ /**
+ * This will get the first dictionary object by type.
+ *
+ * @param type The type of the object.
+ *
+ * @return This will return an object with the specified type.
+ */
+ public COSObject getObjectByType( String type )
+ {
+ return getObjectByType( COSName.getPDFName( type ) );
+ }
+
+ /**
+ * This will get the first dictionary object by type.
+ *
+ * @param type The type of the object.
+ *
+ * @return This will return an object with the specified type.
+ */
+ public COSObject getObjectByType( COSName type )
+ {
+ COSObject retval = null;
+ Iterator iter = objects.iterator();
+ while( iter.hasNext() && retval == null)
+ {
+ COSObject object = (COSObject)iter.next();
+
+ COSBase realObject = object.getObject();
+ if( realObject instanceof COSDictionary )
+ {
+ COSDictionary dic = (COSDictionary)realObject;
+ COSName objectType = (COSName)dic.getItem( COSName.TYPE );
+ if( objectType != null && objectType.equals( type ) )
+ {
+ retval = object;
+ }
+ }
+ }
+ return retval;
+ }
+
+ /**
+ * This will get all dictionary objects by type.
+ *
+ * @param type The type of the object.
+ *
+ * @return This will return an object with the specified type.
+ */
+ public List getObjectsByType( String type )
+ {
+ return getObjectsByType( COSName.getPDFName( type ) );
+ }
+
+ /**
+ * This will get a dictionary object by type.
+ *
+ * @param type The type of the object.
+ *
+ * @return This will return an object with the specified type.
+ */
+ public List getObjectsByType( COSName type )
+ {
+ List retval = new ArrayList();
+ Iterator iter = objects.iterator();
+ while( iter.hasNext() )
+ {
+ COSObject object = (COSObject)iter.next();
+
+ COSBase realObject = object.getObject();
+ if( realObject instanceof COSStream )
+ {
+ realObject = (COSStream)realObject;
+ }
+ if( realObject instanceof COSDictionary )
+ {
+ COSDictionary dic = (COSDictionary)realObject;
+ COSName objectType = (COSName)dic.getItem( COSName.TYPE );
+ if( objectType != null && objectType.equals( type ) )
+ {
+ retval.add( object );
+ }
+ }
+ }
+ return retval;
+ }
+
+ /**
+ * This will print contents to stdout.
+ */
+ public void print()
+ {
+ Iterator iter = objects.iterator();
+ while( iter.hasNext() )
+ {
+ COSObject object = (COSObject)iter.next();
+ System.out.println( object);
+ }
+ }
+
+ /**
+ * This will set the version of this PDF document.
+ *
+ * @param versionValue The version of the PDF document.
+ */
+ public void setVersion( float versionValue )
+ {
+ version = versionValue;
+ }
+
+ /**
+ * This will get the version of this PDF document.
+ *
+ * @return This documents version.
+ */
+ public float getVersion()
+ {
+ return version;
+ }
+
+ /**
+ * This will tell if this is an encrypted document.
+ *
+ * @return true If this document is encrypted.
+ */
+ public boolean isEncrypted()
+ {
+ boolean encrypted = false;
+ if( trailer != null )
+ {
+ encrypted = trailer.getDictionaryObject( "Encrypt" ) != null;
+ }
+ return encrypted;
+ }
+
+ /**
+ * This will get the encryption dictionary if the document is encrypted or null
+ * if the document is not encrypted.
+ *
+ * @return The encryption dictionary.
+ */
+ public COSDictionary getEncryptionDictionary()
+ {
+ return (COSDictionary)trailer.getDictionaryObject( COSName.getPDFName( "Encrypt" ) );
+ }
+
+ /**
+ * This will set the encryption dictionary, this should only be called when
+ * encypting the document.
+ *
+ * @param encDictionary The encryption dictionary.
+ */
+ public void setEncryptionDictionary( COSDictionary encDictionary )
+ {
+ trailer.setItem( COSName.getPDFName( "Encrypt" ), encDictionary );
+ }
+
+ /**
+ * This will get the document ID.
+ *
+ * @return The document id.
+ */
+ public COSArray getDocumentID()
+ {
+ return (COSArray) getTrailer().getItem(COSName.getPDFName("ID"));
+ }
+
+ /**
+ * This will set the document ID.
+ *
+ * @param id The document id.
+ */
+ public void setDocumentID( COSArray id )
+ {
+ getTrailer().setItem(COSName.getPDFName("ID"), id);
+ }
+
+ /**
+ * This will create an object for this document.
+ *
+ * Create an indirect object out of the direct type and include in the document
+ * for later lookup via document a map from direct object to indirect object
+ * is maintained. this provides better support for manual PDF construction.
+ *
+ * @param base the base object to wrap in an indirect object.
+ *
+ * @return The pdf object that wraps the base, or creates a new one.
+ */
+ /**
+ public COSObject createObject( COSBase base )
+ {
+ COSObject obj = (COSObject)objectMap.get(base);
+ if (obj == null)
+ {
+ obj = new COSObject( base );
+ obj.addTo(this);
+ }
+ return obj;
+ }**/
+
+ /**
+ * This will get the document catalog.
+ *
+ * Maybe this should move to an object at PDFEdit level
+ *
+ * @return catalog is the root of all document activities
+ *
+ * @throws IOException If no catalog can be found.
+ */
+ public COSObject getCatalog() throws IOException
+ {
+ COSObject catalog = (COSObject)getObjectByType( COSName.CATALOG );
+ if( catalog == null )
+ {
+ throw new IOException( "Catalog cannot be found" );
+ }
+ return catalog;
+ }
+
+ /**
+ * This will get a list of all available objects.
+ *
+ * @return A list of all objects.
+ */
+ public List getObjects()
+ {
+ return new ArrayList(objects);
+ }
+
+ /**
+ * This will get the document trailer.
+ *
+ * @return the document trailer dict
+ */
+ public COSDictionary getTrailer()
+ {
+ return trailer;
+ }
+
+ /**
+ * // MIT added, maybe this should not be supported as trailer is a persistence construct.
+ * This will set the document trailer.
+ *
+ * @param newTrailer the document trailer dictionary
+ */
+ public void setTrailer(COSDictionary newTrailer)
+ {
+ trailer = newTrailer;
+ }
+
+ /**
+ * visitor pattern double dispatch method.
+ *
+ * @param visitor The object to notify when visiting this object.
+ * @return any object, depending on the visitor implementation, or null
+ * @throws COSVisitorException If an error occurs while visiting this object.
+ */
+ public Object accept(ICOSVisitor visitor) throws COSVisitorException
+ {
+ return visitor.visitFromDocument( this );
+ }
+
+ /**
+ * This will close all storage and delete the tmp files.
+ *
+ * @throws IOException If there is an error close resources.
+ */
+ public void close() throws IOException
+ {
+ if( scratchFile != null )
+ {
+ scratchFile.close();
+ scratchFile = null;
+ }
+ if( tmpFile != null )
+ {
+ tmpFile.delete();
+ tmpFile = null;
+ }
+ }
+
+ /**
+ * The sole purpose of this is to inform a client of PDFBox that they
+ * did not close the document.
+ */
+ protected void finalize()
+ {
+ if( tmpFile != null || scratchFile != null )
+ {
+ Throwable t = new Throwable( "Warning: You did not close the PDF Document" );
+ t.printStackTrace();
+ }
+ }
+ /**
+ * @return Returns the headerString.
+ */
+ public String getHeaderString()
+ {
+ return headerString;
+ }
+ /**
+ * @param header The headerString to set.
+ */
+ public void setHeaderString(String header)
+ {
+ headerString = header;
+ }
+
+ /**
+ * This method will search the list of objects for types of ObjStm. If it finds
+ * them then it will parse out all of the objects from the stream that is contains.
+ *
+ * @throws IOException If there is an error parsing the stream.
+ */
+ public void dereferenceObjectStreams() throws IOException
+ {
+ Iterator objStm = getObjectsByType( "ObjStm" ).iterator();
+ while( objStm.hasNext() )
+ {
+ COSObject objStream = (COSObject)objStm.next();
+ COSStream stream = (COSStream)objStream.getObject();
+ PDFObjectStreamParser parser = new PDFObjectStreamParser( stream, this );
+ parser.parse();
+ Iterator compressedObjects = parser.getObjects().iterator();
+ while( compressedObjects.hasNext() )
+ {
+ COSObject next = (COSObject)compressedObjects.next();
+ COSObjectKey key = new COSObjectKey( next );
+ COSObject obj = getObjectFromPool( key );
+ obj.setObject( next.getObject() );
+ }
+ }
+ }
+
+ /**
+ * This will add an object to this document.
+ * the method checks if obj is already present as there may be cyclic dependencies
+ *
+ * @param obj The object to add to the document.
+ * @return The object that was actually added to this document, if an object reference already
+ * existed then that will be returned.
+ *
+ * @throws IOException If there is an error adding the object.
+ */
+ public COSObject addObject(COSObject obj) throws IOException
+ {
+ COSObjectKey key = null;
+ if( obj.getObjectNumber() != null )
+ {
+ key = new COSObjectKey( obj );
+ }
+ COSObject fromPool = getObjectFromPool( key );
+ fromPool.setObject( obj.getObject() );
+ return fromPool;
+ }
+
+ /**
+ * This will get an object from the pool.
+ *
+ * @param key The object key.
+ *
+ * @return The object in the pool or a new one if it has not been parsed yet.
+ *
+ * @throws IOException If there is an error getting the proxy object.
+ */
+ public COSObject getObjectFromPool(COSObjectKey key) throws IOException
+ {
+ COSObject obj = null;
+ if( key != null )
+ {
+ obj = (COSObject) objectPool.get(key);
+ }
+ if (obj == null)
+ {
+ // this was a forward reference, make "proxy" object
+ obj = new COSObject(null);
+ if( key != null )
+ {
+ obj.setObjectNumber( new COSInteger( key.getNumber() ) );
+ obj.setGenerationNumber( new COSInteger( key.getGeneration() ) );
+ objectPool.put(key, obj);
+ }
+ objects.add( obj );
+ }
+
+ return obj;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/cos/COSFloat.java b/src/main/java/org/pdfbox/cos/COSFloat.java
new file mode 100644
index 0000000..eab0180
--- /dev/null
+++ b/src/main/java/org/pdfbox/cos/COSFloat.java
@@ -0,0 +1,173 @@
+/**
+ * Copyright (c) 2003-2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.cos;
+
+import java.io.IOException;
+import java.io.OutputStream;
+
+import java.text.DecimalFormat;
+import java.text.DecimalFormatSymbols;
+import java.text.NumberFormat;
+
+import org.pdfbox.exceptions.COSVisitorException;
+
+/**
+ * This class represents a floating point number in a PDF document.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.15 $
+ */
+public class COSFloat extends COSNumber
+{
+ private float value;
+
+ /**
+ * Constructor.
+ *
+ * @param aFloat The primitive float object that this object wraps.
+ */
+ public COSFloat( float aFloat )
+ {
+ value = aFloat;
+ }
+
+ /**
+ * Constructor.
+ *
+ * @param aFloat The primitive float object that this object wraps.
+ *
+ * @throws IOException If aFloat is not a float.
+ */
+ public COSFloat( String aFloat ) throws IOException
+ {
+ try
+ {
+ value = Float.parseFloat( aFloat );
+ }
+ catch( NumberFormatException e )
+ {
+ throw new IOException( "Error expected floating point number actual='" +aFloat + "'" );
+ }
+ }
+
+ /**
+ * The value of the float object that this one wraps.
+ *
+ * @return The value of this object.
+ */
+ public float floatValue()
+ {
+ return value;
+ }
+
+ /**
+ * The value of the double object that this one wraps.
+ *
+ * @return The double of this object.
+ */
+ public double doubleValue()
+ {
+ return value;
+ }
+
+ /**
+ * This will get the integer value of this object.
+ *
+ * @return The int value of this object,
+ */
+ public long longValue()
+ {
+ return (long)value;
+ }
+
+ /**
+ * This will get the integer value of this object.
+ *
+ * @return The int value of this object,
+ */
+ public int intValue()
+ {
+ return (int)value;
+ }
+
+ /**
+ * @see Object#equals( Object )
+ */
+ public boolean equals( Object o )
+ {
+ return o instanceof COSFloat && Float.floatToIntBits(((COSFloat)o).value) == Float.floatToIntBits(value);
+ }
+
+ /**
+ * @see Object#hashCode()
+ */
+ public int hashCode()
+ {
+ return Float.floatToIntBits(value);
+ }
+
+ /**
+ * @see Object#toString()
+ */
+ public String toString()
+ {
+ return "COSFloat{" + value + "}";
+ }
+
+ /**
+ * visitor pattern double dispatch method.
+ *
+ * @param visitor The object to notify when visiting this object.
+ * @return any object, depending on the visitor implementation, or null
+ * @throws COSVisitorException If an error occurs while visiting this object.
+ */
+ public Object accept(ICOSVisitor visitor) throws COSVisitorException
+ {
+ return visitor.visitFromFloat(this);
+ }
+
+ /**
+ * This will output this string as a PDF object.
+ *
+ * @param output The stream to write to.
+ * @throws IOException If there is an error writing to the stream.
+ */
+ public void writePDF( OutputStream output ) throws IOException
+ {
+ DecimalFormat formatDecimal = (DecimalFormat)NumberFormat.getNumberInstance();
+ formatDecimal.setMaximumFractionDigits( 10 );
+ formatDecimal.setGroupingUsed( false );
+ DecimalFormatSymbols symbols = formatDecimal.getDecimalFormatSymbols();
+ symbols.setDecimalSeparator( '.' );
+ formatDecimal.setDecimalFormatSymbols( symbols );
+ output.write(formatDecimal.format( value ).getBytes());
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/cos/COSInteger.java b/src/main/java/org/pdfbox/cos/COSInteger.java
new file mode 100644
index 0000000..0a523bd
--- /dev/null
+++ b/src/main/java/org/pdfbox/cos/COSInteger.java
@@ -0,0 +1,190 @@
+/**
+ * Copyright (c) 2003, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.cos;
+
+import java.io.IOException;
+import java.io.OutputStream;
+
+import org.pdfbox.exceptions.COSVisitorException;
+
+/**
+ *
+ * This class represents an integer number in a PDF document.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.11 $
+ */
+public class COSInteger extends COSNumber
+{
+
+ private long value;
+
+ /**
+ * constructor.
+ *
+ * @param val The integer value of this object.
+ */
+ public COSInteger( long val )
+ {
+ value = val;
+ }
+
+ /**
+ * constructor.
+ *
+ * @param val The integer value of this object.
+ */
+ public COSInteger( int val )
+ {
+ this( (long)val );
+ }
+
+ /**
+ * This will create a new PDF Int object using a string.
+ *
+ * @param val The string value of the integer.
+ *
+ * @throws IOException If the val is not an integer type.
+ */
+ public COSInteger( String val ) throws IOException
+ {
+ try
+ {
+ value = Long.parseLong( val );
+ }
+ catch( NumberFormatException e )
+ {
+ throw new IOException( "Error: value is not an integer type actual='" + val + "'" );
+ }
+ }
+
+ /**
+ * @see Object#equals( Object )
+ */
+ public boolean equals(Object o)
+ {
+ return o instanceof COSInteger && ((COSInteger)o).intValue() == intValue();
+ }
+
+ /**
+ * @see Object#hashCode()
+ */
+ public int hashCode()
+ {
+ //taken from java.lang.Long
+ return (int)(value ^ (value >> 32));
+ }
+
+ /**
+ * @see Object#toString()
+ */
+ public String toString()
+ {
+ return "COSInt{" + value + "}";
+ }
+
+ /**
+ * Change the value of this reference.
+ *
+ * @param newValue The new value.
+ */
+ public void setValue( long newValue )
+ {
+ value = newValue;
+ }
+
+
+
+ /**
+ * polymorphic access to value as float.
+ *
+ * @return The float value of this object.
+ */
+ public float floatValue()
+ {
+ return (float)value;
+ }
+
+ /**
+ * polymorphic access to value as float.
+ *
+ * @return The double value of this object.
+ */
+ public double doubleValue()
+ {
+ return (double)value;
+ }
+
+ /**
+ * Polymorphic access to value as int
+ * This will get the integer value of this object.
+ *
+ * @return The int value of this object,
+ */
+ public int intValue()
+ {
+ return (int)value;
+ }
+
+ /**
+ * Polymorphic access to value as int
+ * This will get the integer value of this object.
+ *
+ * @return The int value of this object,
+ */
+ public long longValue()
+ {
+ return value;
+ }
+
+ /**
+ * visitor pattern double dispatch method.
+ *
+ * @param visitor The object to notify when visiting this object.
+ * @return any object, depending on the visitor implementation, or null
+ * @throws COSVisitorException If an error occurs while visiting this object.
+ */
+ public Object accept(ICOSVisitor visitor) throws COSVisitorException
+ {
+ return visitor.visitFromInt(this);
+ }
+
+ /**
+ * This will output this string as a PDF object.
+ *
+ * @param output The stream to write to.
+ * @throws IOException If there is an error writing to the stream.
+ */
+ public void writePDF( OutputStream output ) throws IOException
+ {
+ output.write(String.valueOf(value).getBytes());
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/cos/COSName.java b/src/main/java/org/pdfbox/cos/COSName.java
new file mode 100644
index 0000000..8532cc4
--- /dev/null
+++ b/src/main/java/org/pdfbox/cos/COSName.java
@@ -0,0 +1,572 @@
+/**
+ * Copyright (c) 2003-2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.cos;
+
+import java.io.IOException;
+import java.io.OutputStream;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.pdfbox.exceptions.COSVisitorException;
+import org.pdfbox.persistence.util.COSHEXTable;
+
+
+/**
+ * This class represents a PDF named object.
+ *
+ * @author Ben Litchfield (ben@benlitchfield.com)
+ * @version $Revision: 1.38 $
+ */
+public final class COSName extends COSBase implements Comparable
+{
+ /**
+ * Note: This is synchronized because a HashMap must be synchronized if accessed by
+ * multiple threads.
+ */
+ private static Map nameMap = Collections.synchronizedMap( new HashMap(8192) );
+
+
+ /**
+ * A common COSName value.
+ */
+ public static final COSName AA = new COSName( "AA" );
+ /**
+ * A common COSName value.
+ */
+ public static final COSName ACRO_FORM = new COSName( "AcroForm" );
+ /**
+ * A common COSName value.
+ */
+ public static final COSName ANNOTS = new COSName( "Annots" );
+ /**
+ * A common COSName value.
+ */
+ public static final COSName ART_BOX = new COSName("ArtBox" );
+ /**
+ * A common COSName value.
+ */
+ public static final COSName ASCII85_DECODE = new COSName( "ASCII85Decode" );
+ /**
+ * A common COSName value.
+ */
+ public static final COSName ASCII85_DECODE_ABBREVIATION = new COSName( "A85" );
+ /**
+ * A common COSName value.
+ */
+ public static final COSName ASCII_HEX_DECODE = new COSName( "ASCIIHexDecode" );
+ /**
+ * A common COSName value.
+ */
+ public static final COSName ASCII_HEX_DECODE_ABBREVIATION = new COSName( "AHx" );
+ /**
+ * A common COSName value.
+ */
+ public static final COSName AP = new COSName( "AP" );
+ /**
+ * A common COSName value.
+ */
+ public static final COSName B = new COSName( "B" );
+ /**
+ * A common COSName value.
+ */
+ public static final COSName BASE_ENCODING = new COSName( "BaseEncoding" );
+ /**
+ * A common COSName value.
+ */
+ public static final COSName BASE_FONT = new COSName( "BaseFont" );
+ /**
+ * A common COSName value.
+ */
+ public static final COSName BBOX = new COSName( "BBox" );
+ /**
+ * A common COSName value.
+ */
+ public static final COSName BLEED_BOX = new COSName("BleedBox" );
+ /**
+ * A common COSName value.
+ */
+ public static final COSName CATALOG = new COSName( "Catalog" );
+ /**
+ * A common COSName value.
+ */
+ public static final COSName CALGRAY = new COSName( "CalGray" );
+ /**
+ * A common COSName value.
+ */
+ public static final COSName CALRGB = new COSName( "CalRGB" );
+ /**
+ * A common COSName value.
+ */
+ public static final COSName CCITTFAX_DECODE = new COSName( "CCITTFaxDecode" );
+ /**
+ * A common COSName value.
+ */
+ public static final COSName CCITTFAX_DECODE_ABBREVIATION = new COSName( "CCF" );
+ /**
+ * A common COSName value.
+ */
+ public static final COSName COLORSPACE = new COSName( "ColorSpace" );
+ /**
+ * A common COSName value.
+ */
+ public static final COSName CONTENTS = new COSName( "Contents" );
+ /**
+ * A common COSName value.
+ */
+ public static final COSName COUNT = new COSName( "Count" );
+ /**
+ * A common COSName value.
+ */
+ public static final COSName CROP_BOX = new COSName( "CropBox" );
+ /**
+ * A common COSName value.
+ */
+ public static final COSName DESCENDANT_FONTS = new COSName( "DescendantFonts" );
+ /**
+ * A common COSName value.
+ */
+ public static final COSName DIFFERENCES = new COSName( "Differences" );
+ /**
+ * A common COSName value.
+ */
+ public static final COSName DCT_DECODE = new COSName( "DCTDecode" );
+ /**
+ * A common COSName value.
+ */
+ public static final COSName DCT_DECODE_ABBREVIATION = new COSName( "DCT" );
+ /**
+ * A common COSName value.
+ */
+ public static final COSName DEVICECMYK = new COSName( "DeviceCMYK" );
+ /**
+ * A common COSName value.
+ */
+ public static final COSName DEVICEGRAY = new COSName( "DeviceGray" );
+ /**
+ * A common COSName value.
+ */
+ public static final COSName DEVICEN = new COSName( "DeviceN" );
+ /**
+ * A common COSName value.
+ */
+ public static final COSName DEVICERGB = new COSName( "DeviceRGB" );
+ /**
+ * A common COSName value.
+ */
+ public static final COSName DV = new COSName( "DV" );
+ /**
+ * A common COSName value.
+ */
+ public static final COSName ENCODING = new COSName( "Encoding" );
+ /**
+ * A common COSName value.
+ */
+ public static final COSName FIELDS = new COSName( "Fields" );
+ /**
+ * A common COSName value.
+ */
+ public static final COSName FILTER = new COSName( "Filter" );
+ /**
+ * A common COSName value.
+ */
+ public static final COSName FIRST_CHAR = new COSName( "FirstChar" );
+ /**
+ * A common COSName value.
+ */
+ public static final COSName FLATE_DECODE = new COSName( "FlateDecode" );
+ /**
+ * A common COSName value.
+ */
+ public static final COSName FLATE_DECODE_ABBREVIATION = new COSName( "Fl" );
+ /**
+ * A common COSName value.
+ */
+ public static final COSName FONT = new COSName( "Font" );
+ /**
+ * A common COSName value.
+ */
+ public static final COSName FONT_FILE = new COSName("FontFile");
+ /**
+ * A common COSName value.
+ */
+ public static final COSName FONT_FILE2 = new COSName("FontFile2");
+ /**
+ * A common COSName value.
+ */
+ public static final COSName FONT_FILE3 = new COSName("FontFile3");
+ /**
+ * A common COSName value.
+ */
+ public static final COSName FONT_DESC = new COSName("FontDescriptor");
+ /**
+ * A common COSName value.
+ */
+ public static final COSName FONT_MATRIX = new COSName("FontMatrix" );
+ /**
+ * A common COSName value.
+ */
+ public static final COSName FORMTYPE = new COSName( "FormType" );
+ /**
+ * A common COSName value.
+ */
+ public static final COSName FRM = new COSName( "FRM" );
+ /**
+ * A common COSName value.
+ */
+ public static final COSName HEIGHT = new COSName( "Height" );
+ /**
+ * A common COSName value.
+ */
+ public static final COSName ICCBASED = new COSName( "ICCBased" );
+ /**
+ * A common COSName value.
+ */
+ public static final COSName IDENTITY_H = new COSName( "Identity-H" );
+ /**
+ * A common COSName value.
+ */
+ public static final COSName IMAGE = new COSName( "Image" );
+ /**
+ * A common COSName value.
+ */
+ public static final COSName INDEXED = new COSName( "Indexed" );
+ /**
+ * A common COSName value.
+ */
+ public static final COSName INFO = new COSName( "Info" );
+ /**
+ * A common COSName value.
+ */
+ public static final COSName JPX_DECODE = new COSName( "JPXDecode" );
+ /**
+ * A common COSName value.
+ */
+ public static final COSName KIDS = new COSName( "Kids" );
+ /**
+ * A common COSName value.
+ */
+ public static final COSName LAB = new COSName( "Lab" );
+ /**
+ * A common COSName value.
+ */
+ public static final COSName LAST_CHAR = new COSName( "LastChar" );
+ /**
+ * A common COSName value.
+ */
+ public static final COSName LENGTH = new COSName( "Length" );
+ /**
+ * A common COSName value.
+ */
+ public static final COSName LENGTH1 = new COSName( "Length1" );
+ /**
+ * A common COSName value.
+ */
+ public static final COSName LZW_DECODE = new COSName( "LZWDecode" );
+ /**
+ * A common COSName value.
+ */
+ public static final COSName LZW_DECODE_ABBREVIATION = new COSName( "LZW" );
+ /**
+ * A common COSName value.
+ */
+ public static final COSName MAC_ROMAN_ENCODING = new COSName( "MacRomanEncoding" );
+ /**
+ * A common COSName value.
+ */
+ public static final COSName MATRIX = new COSName( "Matrix" );
+ /**
+ * A common COSName value.
+ */
+ public static final COSName MEDIA_BOX = new COSName( "MediaBox" );
+ /**
+ * A common COSName value.
+ */
+ public static final COSName METADATA = new COSName( "Metadata" );
+ /**
+ * A common COSName value.
+ */
+ public static final COSName N = new COSName( "N" );
+ /**
+ * A common COSName value.
+ */
+ public static final COSName NAME = new COSName( "Name" );
+ /**
+ * A common COSName value.
+ */
+ public static final COSName P = new COSName( "P" );
+ /**
+ * A common COSName value.
+ */
+ public static final COSName PAGE = new COSName( "Page" );
+ /**
+ * A common COSName value.
+ */
+ public static final COSName PAGES = new COSName( "Pages" );
+ /**
+ * A common COSName value.
+ */
+ public static final COSName PARENT = new COSName( "Parent" );
+ /**
+ * A common COSName value.
+ */
+ public static final COSName PATTERN = new COSName( "Pattern" );
+ /**
+ * A common COSName value.
+ */
+ public static final COSName PDF_DOC_ENCODING = new COSName( "PDFDocEncoding" );
+ /**
+ * A common COSName value.
+ */
+ public static final COSName PREV = new COSName( "Prev" );
+ /**
+ * A common COSName value.
+ */
+ public static final COSName R = new COSName( "R" );
+ /**
+ * A common COSName value.
+ */
+ public static final COSName RESOURCES = new COSName( "Resources" );
+ /**
+ * A common COSName value.
+ */
+ public static final COSName ROOT = new COSName( "Root" );
+ /**
+ * A common COSName value.
+ */
+ public static final COSName ROTATE = new COSName( "Rotate" );
+ /**
+ * A common COSName value.
+ */
+ public static final COSName RUN_LENGTH_DECODE = new COSName( "RunLengthDecode" );
+ /**
+ * A common COSName value.
+ */
+ public static final COSName RUN_LENGTH_DECODE_ABBREVIATION = new COSName( "RL" );
+ /**
+ * A common COSName value.
+ */
+ public static final COSName SEPARATION = new COSName( "Separation" );
+ /**
+ * A common COSName value.
+ */
+ public static final COSName STANDARD_ENCODING = new COSName( "StandardEncoding" );
+ /**
+ * A common COSName value.
+ */
+ public static final COSName SUBTYPE = new COSName( "Subtype" );
+ /**
+ * A common COSName value.
+ */
+ public static final COSName TRIM_BOX = new COSName("TrimBox" );
+ /**
+ * A common COSName value.
+ */
+ public static final COSName TRUE_TYPE = new COSName("TrueType" );
+ /**
+ * A common COSName value.
+ */
+ public static final COSName TO_UNICODE = new COSName( "ToUnicode" );
+ /**
+ * A common COSName value.
+ */
+ public static final COSName TYPE = new COSName( "Type" );
+ /**
+ * A common COSName value.
+ */
+ public static final COSName TYPE0 = new COSName( "Type0" );
+ /**
+ * A common COSName value.
+ */
+ public static final COSName V = new COSName( "V" );
+ /**
+ * A common COSName value.
+ */
+ public static final COSName VERSION = new COSName( "Version" );
+ /**
+ * A common COSName value.
+ */
+ public static final COSName WIDTHS = new COSName( "Widths" );
+ /**
+ * A common COSName value.
+ */
+ public static final COSName WIN_ANSI_ENCODING = new COSName( "WinAnsiEncoding" );
+ /**
+ * A common COSName value.
+ */
+ public static final COSName XOBJECT = new COSName( "XObject" );
+
+ /**
+ * The prefix to a PDF name.
+ */
+ public static final byte[] NAME_PREFIX = new byte[] { 47 }; // The / character
+ /**
+ * The escape character for a name.
+ */
+ public static final byte[] NAME_ESCAPE = new byte[] { 35 }; //The # character
+
+ private String name;
+ private int hashCode;
+
+ /**
+ * This will get a COSName object with that name.
+ *
+ * @param aName The name of the object.
+ *
+ * @return A COSName with the specified name.
+ */
+ public static final COSName getPDFName( String aName )
+ {
+ COSName name = null;
+ if( aName != null )
+ {
+ name = (COSName)nameMap.get( aName );
+ if( name == null )
+ {
+ //name is added to map in the constructor
+ name = new COSName( aName );
+ }
+ }
+ return name;
+ }
+
+ /**
+ * Private constructor. This will limit the number of COSName objects.
+ * that are created.
+ *
+ * @param aName The name of the COSName object.
+ */
+ private COSName( String aName )
+ {
+ name = aName;
+ nameMap.put( aName, this );
+ hashCode = name.hashCode();
+ }
+
+ /**
+ * This will get the name of this COSName object.
+ *
+ * @return The name of the object.
+ */
+ public String getName()
+ {
+ return name;
+ }
+
+ /**
+ * @see Object#toString()
+ */
+ public String toString()
+ {
+ return "COSName{" + name + "}";
+ }
+
+ /**
+ * @see Object#equals( Object )
+ */
+ public boolean equals( Object o )
+ {
+ boolean retval = this == o;
+ if( !retval && o instanceof COSName )
+ {
+ COSName other = (COSName)o;
+ retval = name == other.name || name.equals( other.name );
+ }
+ return retval;
+ }
+
+ /**
+ * @see Object#hashCode()
+ */
+ public int hashCode()
+ {
+ return hashCode;
+ }
+
+ /**
+ * @see Comparable#compareTo( Object )
+ */
+ public int compareTo(Object o)
+ {
+ COSName other = (COSName)o;
+ return this.name.compareTo( other.name );
+ }
+
+
+
+ /**
+ * visitor pattern double dispatch method.
+ *
+ * @param visitor The object to notify when visiting this object.
+ * @return any object, depending on the visitor implementation, or null
+ * @throws COSVisitorException If an error occurs while visiting this object.
+ */
+ public Object accept(ICOSVisitor visitor) throws COSVisitorException
+ {
+ return visitor.visitFromName(this);
+ }
+
+ /**
+ * This will output this string as a PDF object.
+ *
+ * @param output The stream to write to.
+ * @throws IOException If there is an error writing to the stream.
+ */
+ public void writePDF( OutputStream output ) throws IOException
+ {
+ output.write(NAME_PREFIX);
+ byte[] bytes = getName().getBytes();
+ for (int i = 0; i < bytes.length;i++)
+ {
+ int current = ((bytes[i]+256)%256);
+
+ if(current <= 32 || current >= 127 ||
+ current == '(' ||
+ current == ')' ||
+ current == '[' ||
+ current == ']' ||
+ current == '/' ||
+ current == '%' ||
+ current == '<' ||
+ current == '>' ||
+ current == NAME_ESCAPE[0] )
+ {
+ output.write(NAME_ESCAPE);
+ output.write(COSHEXTable.TABLE[current]);
+ }
+ else
+ {
+ output.write(current);
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/cos/COSNull.java b/src/main/java/org/pdfbox/cos/COSNull.java
new file mode 100644
index 0000000..15356b5
--- /dev/null
+++ b/src/main/java/org/pdfbox/cos/COSNull.java
@@ -0,0 +1,88 @@
+/**
+ * Copyright (c) 2003-2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.cos;
+
+
+
+import java.io.IOException;
+import java.io.OutputStream;
+
+import org.pdfbox.exceptions.COSVisitorException;
+
+/**
+ * This class represents a null PDF object.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.12 $
+ */
+public class COSNull extends COSBase
+{
+ /**
+ * The null token.
+ */
+ public static final byte[] NULL_BYTES = new byte[] {110, 117, 108, 108}; //"null".getBytes( "ISO-8859-1" );
+
+ /**
+ * The one null object in the system.
+ */
+ public static final COSNull NULL = new COSNull();
+
+ /**
+ * Constructor.
+ */
+ private COSNull()
+ {
+ //limit creation to one instance.
+ }
+
+ /**
+ * visitor pattern double dispatch method.
+ *
+ * @param visitor The object to notify when visiting this object.
+ * @return any object, depending on the visitor implementation, or null
+ * @throws COSVisitorException If an error occurs while visiting this object.
+ */
+ public Object accept( ICOSVisitor visitor ) throws COSVisitorException
+ {
+ return visitor.visitFromNull( this );
+ }
+
+ /**
+ * This will output this string as a PDF object.
+ *
+ * @param output The stream to write to.
+ * @throws IOException If there is an error writing to the stream.
+ */
+ public void writePDF( OutputStream output ) throws IOException
+ {
+ output.write(NULL_BYTES);
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/cos/COSNumber.java b/src/main/java/org/pdfbox/cos/COSNumber.java
new file mode 100644
index 0000000..c629f66
--- /dev/null
+++ b/src/main/java/org/pdfbox/cos/COSNumber.java
@@ -0,0 +1,115 @@
+/**
+ * Copyright (c) 2003, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.cos;
+
+import java.io.IOException;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * This class represents an abstract number in a PDF document.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.9 $
+ */
+public abstract class COSNumber extends COSBase
+{
+ /**
+ * ZERO.
+ */
+ public static final COSInteger ZERO = new COSInteger( 0 );
+ /**
+ * ONE.
+ */
+ public static final COSInteger ONE = new COSInteger( 1 );
+ private static final Map COMMON_NUMBERS = new HashMap();
+
+ static
+ {
+ COMMON_NUMBERS.put( "0", ZERO );
+ COMMON_NUMBERS.put( "1", ONE );
+ }
+
+ /**
+ * This will get the float value of this number.
+ *
+ * @return The float value of this object.
+ */
+ public abstract float floatValue();
+
+ /**
+ * This will get the double value of this number.
+ *
+ * @return The double value of this number.
+ */
+ public abstract double doubleValue();
+
+ /**
+ * This will get the integer value of this number.
+ *
+ * @return The integer value of this number.
+ */
+ public abstract int intValue();
+
+ /**
+ * This will get the long value of this number.
+ *
+ * @return The long value of this number.
+ */
+ public abstract long longValue();
+
+ /**
+ * This factory method will get the appropriate number object.
+ *
+ * @param number The string representation of the number.
+ *
+ * @return A number object, either float or int.
+ *
+ * @throws IOException If the string is not a number.
+ */
+ public static COSNumber get( String number ) throws IOException
+ {
+ COSNumber result = (COSNumber)COMMON_NUMBERS.get( number );
+ if( result == null )
+ {
+ if (number.indexOf('.') >= 0)
+ {
+ result = new COSFloat( number );
+ }
+ else
+ {
+ result = new COSInteger( number );
+ }
+ }
+ return result;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/cos/COSObject.java b/src/main/java/org/pdfbox/cos/COSObject.java
new file mode 100644
index 0000000..28f2316
--- /dev/null
+++ b/src/main/java/org/pdfbox/cos/COSObject.java
@@ -0,0 +1,226 @@
+/**
+ * Copyright (c) 2003, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.cos;
+
+import org.pdfbox.exceptions.COSVisitorException;
+
+import java.io.IOException;
+
+import org.apache.log4j.Logger;
+
+/**
+ * This class represents a PDF object.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.35 $
+ */
+public class COSObject extends COSBase
+{
+ private static Logger log = Logger.getLogger(COSObject.class);
+
+ private COSBase baseObject;
+ private COSInteger objectNumber;
+ private COSInteger generationNumber;
+
+ /**
+ * Constructor.
+ *
+ * @param object The object that this encapsulates.
+ *
+ * @throws IOException If there is an error with the object passed in.
+ */
+ public COSObject( COSBase object ) throws IOException
+ {
+ setObject( object );
+ }
+
+ /**
+ * This will get the dictionary object in this object that has the name key and
+ * if it is a pdfobjref then it will dereference that and return it.
+ *
+ * @param key The key to the value that we are searching for.
+ *
+ * @return The pdf object that matches the key.
+ */
+ public COSBase getDictionaryObject( COSName key )
+ {
+ COSBase retval =null;
+ if( baseObject instanceof COSDictionary )
+ {
+ retval = ((COSDictionary)baseObject).getDictionaryObject( key );
+ }
+ return retval;
+ }
+
+ /**
+ * This will get the dictionary object in this object that has the name key.
+ *
+ * @param key The key to the value that we are searching for.
+ *
+ * @return The pdf object that matches the key.
+ */
+ public COSBase getItem( COSName key )
+ {
+ COSBase retval =null;
+ if( baseObject instanceof COSDictionary )
+ {
+ retval = ((COSDictionary)baseObject).getItem( key );
+ }
+ return retval;
+ }
+
+ /**
+ * This will get the object that this object encapsulates.
+ *
+ * @return The encapsulated object.
+ */
+ public COSBase getObject()
+ {
+ return baseObject;
+ }
+
+ /**
+ * This will set the object that this object encapsulates.
+ *
+ * @param object The new object to encapsulate.
+ *
+ * @throws IOException If there is an error setting the updated object.
+ */
+ public void setObject( COSBase object ) throws IOException
+ {
+ baseObject = object;
+ /*if( baseObject == null )
+ {
+ baseObject = object;
+ }
+ else
+ {
+ //This is for when an object appears twice in the
+ //pdf file we really want to replace it such that
+ //object references still work correctly.
+ //see owcp-as-received.pdf for an example
+ if( baseObject instanceof COSDictionary )
+ {
+ COSDictionary dic = (COSDictionary)baseObject;
+ COSDictionary dicObject = (COSDictionary)object;
+ dic.clear();
+ dic.addAll( dicObject );
+ }
+ else if( baseObject instanceof COSArray )
+ {
+ COSArray array = (COSArray)baseObject;
+ COSArray arrObject = (COSArray)object;
+ array.clear();
+ for( int i=0; i<arrObject.size(); i++ )
+ {
+ array.add( arrObject.get( i ) );
+ }
+ }
+ else if( baseObject instanceof COSStream )
+ {
+ COSStream oldStream = (COSStream)baseObject;
+ System.out.println( "object:" + object.getClass().getName() );
+ COSStream newStream = (COSStream)object;
+ oldStream.replaceWithStream( newStream );
+ }
+ else if( baseObject instanceof COSInteger )
+ {
+ COSInteger oldInt = (COSInteger)baseObject;
+ COSInteger newInt = (COSInteger)object;
+ oldInt.setValue( newInt.longValue() );
+ }
+ else if( baseObject == null )
+ {
+ baseObject = object;
+ }
+ else
+ {
+ throw new IOException( "Unknown object substitution type:" + baseObject );
+ }
+ }*/
+
+ }
+
+ /**
+ * @see Object#toString()
+ */
+ public String toString()
+ {
+ return "COSObject{" +
+ (objectNumber == null ? "unknown" : "" + objectNumber.intValue() ) + ", " +
+ (generationNumber == null ? "unknown" : "" + generationNumber.intValue() ) +
+ "}";
+ }
+
+ /** Getter for property objectNumber.
+ * @return Value of property objectNumber.
+ */
+ public COSInteger getObjectNumber()
+ {
+ return objectNumber;
+ }
+
+ /** Setter for property objectNumber.
+ * @param objectNum New value of property objectNumber.
+ */
+ public void setObjectNumber(COSInteger objectNum)
+ {
+ objectNumber = objectNum;
+ }
+
+ /** Getter for property generationNumber.
+ * @return Value of property generationNumber.
+ */
+ public COSInteger getGenerationNumber()
+ {
+ return generationNumber;
+ }
+
+ /** Setter for property generationNumber.
+ * @param generationNumberValue New value of property generationNumber.
+ */
+ public void setGenerationNumber(COSInteger generationNumberValue)
+ {
+ generationNumber = generationNumberValue;
+ }
+
+ /**
+ * visitor pattern double dispatch method.
+ *
+ * @param visitor The object to notify when visiting this object.
+ * @return any object, depending on the visitor implementation, or null
+ * @throws COSVisitorException If an error occurs while visiting this object.
+ */
+ public Object accept( ICOSVisitor visitor ) throws COSVisitorException
+ {
+ return getObject() != null ? getObject().accept( visitor ) : COSNull.NULL.accept( visitor );
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/cos/COSStream.java b/src/main/java/org/pdfbox/cos/COSStream.java
new file mode 100644
index 0000000..206a854
--- /dev/null
+++ b/src/main/java/org/pdfbox/cos/COSStream.java
@@ -0,0 +1,495 @@
+/**
+ * Copyright (c) 200-2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.cos;
+
+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.RandomAccessFile;
+
+import java.util.List;
+
+import org.apache.log4j.Logger;
+
+import org.pdfbox.filter.Filter;
+import org.pdfbox.filter.FilterManager;
+
+import org.pdfbox.pdfparser.PDFStreamParser;
+
+import org.pdfbox.exceptions.COSVisitorException;
+
+import org.pdfbox.io.RandomAccessFileInputStream;
+import org.pdfbox.io.RandomAccessFileOutputStream;
+
+/**
+ * This class represents a stream object in a PDF document.
+ *
+ * @author Ben Litchfield (ben@benlitchfield.com)
+ * @version $Revision: 1.36 $
+ */
+public class COSStream extends COSDictionary
+{
+ private static final int BUFFER_SIZE=16384;
+ private static Logger log = Logger.getLogger(COSStream.class);
+
+ private RandomAccessFile file;
+ /**
+ * The stream with all of the filters applied.
+ */
+ private RandomAccessFileOutputStream filteredStream;
+
+ /**
+ * The stream with no filters, this contains the useful data.
+ */
+ private RandomAccessFileOutputStream unFilteredStream;
+
+ /**
+ * Constructor. Creates a new stream with an empty dictionary.
+ *
+ * @param storage The intermediate storage for the stream.
+ */
+ public COSStream( RandomAccessFile storage )
+ {
+ super();
+ file = storage;
+ }
+
+ /**
+ * Constructor.
+ *
+ * @param dictionary The dictionary that is associated with this stream.
+ * @param storage The intermediate storage for the stream.
+ */
+ public COSStream( COSDictionary dictionary, RandomAccessFile storage )
+ {
+ super( dictionary );
+ file = storage;
+ }
+
+ /**
+ * This will replace this object with the data from the new object. This
+ * is used to easily maintain referential integrity when changing references
+ * to new objects.
+ *
+ * @param stream The stream that have the new values in it.
+ */
+ public void replaceWithStream( COSStream stream )
+ {
+ this.clear();
+ this.addAll( stream );
+ file = stream.file;
+ filteredStream = stream.filteredStream;
+ unFilteredStream = stream.unFilteredStream;
+ }
+
+ /**
+ * This will get the scratch file associated with this stream.
+ *
+ * @return The scratch file where this stream is being stored.
+ */
+ public RandomAccessFile getScratchFile()
+ {
+ return file;
+ }
+
+ /**
+ * This will get all the tokens in the stream.
+ *
+ * @return All of the tokens in the stream.
+ *
+ * @throws IOException If there is an error parsing the stream.
+ */
+ public List getStreamTokens() throws IOException
+ {
+ PDFStreamParser parser = new PDFStreamParser( this );
+ parser.parse();
+ return parser.getTokens();
+ }
+
+ /**
+ * This will get the stream with all of the filters applied.
+ *
+ * @return the bytes of the physical (endoced) stream
+ *
+ * @throws IOException when encoding/decoding causes an exception
+ */
+ public InputStream getFilteredStream() throws IOException
+ {
+ if( filteredStream == null )
+ {
+ doEncode();
+ }
+ long position = filteredStream.getPosition();
+ long length = filteredStream.getLength();
+
+ RandomAccessFileInputStream input =
+ new RandomAccessFileInputStream( file, position, length );
+ return new BufferedInputStream( input, BUFFER_SIZE );
+ }
+
+ /**
+ * This will get the logical content stream with none of the filters.
+ *
+ * @return the bytes of the logical (decoded) stream
+ *
+ * @throws IOException when encoding/decoding causes an exception
+ */
+ public InputStream getUnfilteredStream() throws IOException
+ {
+ InputStream retval = null;
+ if( unFilteredStream == null )
+ {
+ doDecode();
+ }
+
+ //if unFilteredStream is still null then this stream has not been
+ //created yet, so we should return null.
+ if( unFilteredStream != null )
+ {
+ long position = unFilteredStream.getPosition();
+ long length = unFilteredStream.getLength();
+ RandomAccessFileInputStream input =
+ new RandomAccessFileInputStream( file, position, length );
+ retval = new BufferedInputStream( input, BUFFER_SIZE );
+ }
+ else
+ {
+ // We should check if the COSStream contains data, maybe it
+ // has been created with a RandomAccessFile - which is not
+ // necessary empty.
+ // In this case, the creation was been done as an input, this should
+ // be the unfiltered file, since no filter has been applied yet.
+// if ( (file != null) &&
+// (file.length() > 0) )
+// {
+// retval = new RandomAccessFileInputStream( file,
+// 0,
+// file.length() );
+// }
+// else
+// {
+ //if there is no stream data then simply return an empty stream.
+ retval = new ByteArrayInputStream( new byte[0] );
+// }
+ }
+ return retval;
+ }
+
+ /**
+ * visitor pattern double dispatch method.
+ *
+ * @param visitor The object to notify when visiting this object.
+ * @return any object, depending on the visitor implementation, or null
+ * @throws COSVisitorException If an error occurs while visiting this object.
+ */
+ public Object accept(ICOSVisitor visitor) throws COSVisitorException
+ {
+ return visitor.visitFromStream(this);
+ }
+
+ /**
+ * This will decode the physical byte stream applying all of the filters to the stream.
+ *
+ * @throws IOException If there is an error applying a filter to the stream.
+ */
+ private void doDecode() throws IOException
+ {
+ if( log.isDebugEnabled() )
+ {
+ log.debug("doDecode() start");
+ }
+// FIXME: We shouldn't keep the same reference?
+ unFilteredStream = filteredStream;
+
+ COSBase filters = getFilters();
+ if( filters == null )
+ {
+ if( log.isDebugEnabled() )
+ {
+ log.debug("doDecode() - No filter to apply");
+ }
+ }
+ else if( filters instanceof COSName )
+ {
+ if( log.isDebugEnabled() )
+ {
+ log.debug("doDecode( COSName )");
+ }
+ doDecode( (COSName)filters );
+ }
+ else if( filters instanceof COSArray )
+ {
+ if( log.isDebugEnabled() )
+ {
+ log.debug("doDecode( COSArray )");
+ }
+ COSArray filterArray = (COSArray)filters;
+ for( int i=0; i<filterArray.size(); i++ )
+ {
+ COSName filterName = (COSName)filterArray.get( i );
+ doDecode( filterName );
+ }
+ }
+ else
+ {
+ throw new IOException( "Error: Unknown filter type:" + filters );
+ }
+ if( log.isDebugEnabled() )
+ {
+ log.debug("doDecode() end");
+ }
+ }
+
+ /**
+ * This will decode applying a single filter on the stream.
+ *
+ * @param filterName The name of the filter.
+ *
+ * @throws IOException If there is an error parsing the stream.
+ */
+ private void doDecode( COSName filterName ) throws IOException
+ {
+ long start = System.currentTimeMillis();
+ if( log.isDebugEnabled() )
+ {
+ log.debug("doDecode( " + filterName.getName() + " ) dic=" + this +
+ " read.length="+unFilteredStream.getLength() );
+ }
+
+ FilterManager manager = getFilterManager();
+ Filter filter = manager.getFilter( filterName );
+ InputStream input;
+
+ boolean done = false;
+ IOException exception = null;
+ long position = unFilteredStream.getPosition();
+ long length = unFilteredStream.getLength();
+
+ if( length == 0 )
+ {
+ //if the length is zero then don't bother trying to decode
+ //some filters don't work when attempting to decode
+ //with a zero length stream. See zlib_error_01.pdf
+ unFilteredStream = new RandomAccessFileOutputStream( file );
+ done = true;
+ }
+ else
+ {
+ //ok this is a simple hack, sometimes we read a couple extra
+ //bytes that shouldn't be there, so we encounter an error we will just
+ //try again with one less byte.
+ for( int tryCount=0; !done && tryCount<5; tryCount++ )
+ {
+ try
+ {
+ input = new BufferedInputStream(
+ new RandomAccessFileInputStream( file, position, length ), BUFFER_SIZE );
+ unFilteredStream = new RandomAccessFileOutputStream( file );
+ filter.decode( input, unFilteredStream, this );
+ done = true;
+ }
+ catch( IOException io )
+ {
+ length--;
+ exception = io;
+ }
+ }
+ }
+ if( !done )
+ {
+ throw exception;
+ }
+ long stop = System.currentTimeMillis();
+ if( log.isDebugEnabled() )
+ {
+ log.debug("doDecode( " + filterName.getName() + " ) done time=" + (stop-start) );
+ }
+ }
+
+ /**
+ * This will encode the logical byte stream applying all of the filters to the stream.
+ *
+ * @throws IOException If there is an error applying a filter to the stream.
+ */
+ private void doEncode() throws IOException
+ {
+ filteredStream = unFilteredStream;
+
+ COSBase filters = getFilters();
+ if( filters == null )
+ {
+ log.debug( "No filters for stream" );
+ //there is no filter to apply
+ }
+ else if( filters instanceof COSName )
+ {
+ doEncode( (COSName)filters );
+ }
+ else if( filters instanceof COSArray )
+ {
+ // apply filters in reverse order
+ COSArray filterArray = (COSArray)filters;
+ for( int i=filterArray.size()-1; i>=0; i-- )
+ {
+ COSName filterName = (COSName)filterArray.get( i );
+ doEncode( filterName );
+ }
+ }
+ }
+
+ /**
+ * This will encode applying a single filter on the stream.
+ *
+ * @param filterName The name of the filter.
+ *
+ * @throws IOException If there is an error parsing the stream.
+ */
+ private void doEncode( COSName filterName ) throws IOException
+ {
+ FilterManager manager = getFilterManager();
+ Filter filter = manager.getFilter( filterName );
+ InputStream input;
+
+ input = new BufferedInputStream(
+ new RandomAccessFileInputStream( file, filteredStream.getPosition(),
+ filteredStream.getLength() ), BUFFER_SIZE );
+ filteredStream = new RandomAccessFileOutputStream( file );
+ filter.encode( input, filteredStream, this );
+ }
+
+ /**
+ * This will return the filters to apply to the byte stream.
+ * The method will return
+ * - null if no filters are to be applied
+ * - a COSName if one filter is to be applied
+ * - a COSArray containing COSNames if multiple filters are to be applied
+ *
+ * @return the COSBase object representing the filters
+ */
+ public COSBase getFilters()
+ {
+ return getDictionaryObject(COSName.FILTER);
+ }
+
+ /**
+ * This will create a new stream for which filtered byte should be
+ * written to. You probably don't want this but want to use the
+ * createUnfilteredStream, which is used to write raw bytes to.
+ *
+ * @return A stream that can be written to.
+ *
+ * @throws IOException If there is an error creating the stream.
+ */
+ public OutputStream createFilteredStream() throws IOException
+ {
+ filteredStream = new RandomAccessFileOutputStream( file );
+ unFilteredStream = null;
+ return new BufferedOutputStream( filteredStream, BUFFER_SIZE );
+ }
+
+ /**
+ * This will create a new stream for which filtered byte should be
+ * written to. You probably don't want this but want to use the
+ * createUnfilteredStream, which is used to write raw bytes to.
+ *
+ * @param expectedLength An entry where a length is expected.
+ *
+ * @return A stream that can be written to.
+ *
+ * @throws IOException If there is an error creating the stream.
+ */
+ public OutputStream createFilteredStream( COSBase expectedLength ) throws IOException
+ {
+ filteredStream = new RandomAccessFileOutputStream( file );
+ filteredStream.setExpectedLength( expectedLength );
+ unFilteredStream = null;
+ return new BufferedOutputStream( filteredStream, BUFFER_SIZE );
+ }
+
+ /**
+ * set the filters to be applied to the stream.
+ *
+ * @param filters The filters to set on this stream.
+ *
+ * @throws IOException If there is an error clearing the old filters.
+ */
+ public void setFilters(COSBase filters) throws IOException
+ {
+ setItem(COSName.FILTER, filters);
+ // kill cached filtered streams
+ filteredStream = null;
+ }
+
+ /**
+ * This will create an output stream that can be written to.
+ *
+ * @return An output stream which raw data bytes should be written to.
+ *
+ * @throws IOException If there is an error creating the stream.
+ */
+ public OutputStream createUnfilteredStream() throws IOException
+ {
+ unFilteredStream = new RandomAccessFileOutputStream( file );
+ filteredStream = null;
+ return new BufferedOutputStream( unFilteredStream, BUFFER_SIZE );
+ }
+
+ /**
+ * This will print a byte array as a hex string to standard output.
+ *
+ * @param data The array to print.
+ */
+ private static void printHexString( byte[] data )
+ {
+ for( int i=0; i<data.length; i++ )
+ {
+ int nextByte = (data[i] + 256)%256;
+ String hexString = Integer.toHexString( nextByte );
+ if( hexString.length() < 2 )
+ {
+ hexString = "0" + hexString;
+ }
+ System.out.print( hexString );
+ if( i != 0 && (i+1) % 2 == 0 )
+ {
+ System.out.print( " " );
+ }
+ if( i!= 0 && i % 20 == 0 )
+ {
+ System.out.println();
+ }
+ }
+ System.out.println();
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/cos/COSString.java b/src/main/java/org/pdfbox/cos/COSString.java
new file mode 100644
index 0000000..2b882f9
--- /dev/null
+++ b/src/main/java/org/pdfbox/cos/COSString.java
@@ -0,0 +1,403 @@
+/**
+ * Copyright (c) 2003-2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.cos;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.UnsupportedEncodingException;
+
+import org.pdfbox.persistence.util.COSHEXTable;
+
+import org.pdfbox.exceptions.COSVisitorException;
+
+/**
+ * This represents a string object in a PDF document.
+ *
+ * @author Ben Litchfield (ben@benlitchfield.com)
+ * @version $Revision: 1.26 $
+ */
+public class COSString extends COSBase
+{
+ /**
+ * One of the open string tokens.
+ */
+ public static final byte[] STRING_OPEN = new byte[]{ 40 }; //"(".getBytes();
+ /**
+ * One of the close string tokens.
+ */
+ public static final byte[] STRING_CLOSE = new byte[]{ 41 }; //")".getBytes( "ISO-8859-1" );
+ /**
+ * One of the open string tokens.
+ */
+ public static final byte[] HEX_STRING_OPEN = new byte[]{ 60 }; //"<".getBytes( "ISO-8859-1" );
+ /**
+ * One of the close string tokens.
+ */
+ public static final byte[] HEX_STRING_CLOSE = new byte[]{ 62 }; //">".getBytes( "ISO-8859-1" );
+ /**
+ * the escape character in strings.
+ */
+ public static final byte[] ESCAPE = new byte[]{ 92 }; //"\\".getBytes( "ISO-8859-1" );
+
+ /**
+ * CR escape characters.
+ */
+ public static final byte[] CR_ESCAPE = new byte[]{ 92, 114 }; //"\\r".getBytes( "ISO-8859-1" );
+ /**
+ * LF escape characters.
+ */
+ public static final byte[] LF_ESCAPE = new byte[]{ 92, 110 }; //"\\n".getBytes( "ISO-8859-1" );
+ /**
+ * HT escape characters.
+ */
+ public static final byte[] HT_ESCAPE = new byte[]{ 92, 116 }; //"\\t".getBytes( "ISO-8859-1" );
+ /**
+ * BS escape characters.
+ */
+ public static final byte[] BS_ESCAPE = new byte[]{ 92, 98 }; //"\\b".getBytes( "ISO-8859-1" );
+ /**
+ * FF escape characters.
+ */
+ public static final byte[] FF_ESCAPE = new byte[]{ 92, 102 }; //"\\f".getBytes( "ISO-8859-1" );
+
+ private ByteArrayOutputStream out = new ByteArrayOutputStream();
+
+ /**
+ * Constructor.
+ */
+ public COSString()
+ {
+ }
+
+ /**
+ * Explicit constructor for ease of manual PDF construction.
+ *
+ * @param value The string value of the object.
+ */
+ public COSString( String value )
+ {
+ try
+ {
+ boolean unicode16 = false;
+ char[] chars = value.toCharArray();
+ for( int i=0; i<chars.length; i++ )
+ {
+ if( chars[i] > 255 )
+ {
+ unicode16 = true;
+ }
+ }
+ if( unicode16 )
+ {
+ out.write( 0xFE );
+ out.write( 0xFF );
+ out.write( value.getBytes( "UTF-16BE" ) );
+ }
+ else
+ {
+ out.write(value.getBytes());
+ }
+ }
+ catch (IOException ignore)
+ {
+ ignore.printStackTrace();
+ //should never happen
+ }
+ }
+
+ /**
+ * Explicit constructor for ease of manual PDF construction.
+ *
+ * @param value The string value of the object.
+ */
+ public COSString( byte[] value )
+ {
+ try
+ {
+ out.write( value );
+ }
+ catch (IOException ignore)
+ {
+ ignore.printStackTrace();
+ //should never happen
+ }
+ }
+
+ /**
+ * This will create a COS string from a string of hex characters.
+ *
+ * @param hex A hex string.
+ * @return A cos string with the hex characters converted to their actual bytes.
+ * @throws IOException If there is an error with the hex string.
+ */
+ public static COSString createFromHexString( String hex ) throws IOException
+ {
+ COSString retval = new COSString();
+ StringBuffer hexBuffer = new StringBuffer( hex.trim() );
+ //if odd number then the last hex digit is assumed to be 0
+ if( hexBuffer.length() % 2 == 1 )
+ {
+ hexBuffer.append( "0" );
+ }
+ for( int i=0; i<hexBuffer.length();)
+ {
+ String hexChars = "" + hexBuffer.charAt( i++ ) + hexBuffer.charAt( i++ );
+ try
+ {
+ retval.append( Integer.parseInt( hexChars, 16 ) );
+ }
+ catch( NumberFormatException e )
+ {
+ throw new IOException( "Error: Expected hex number, actual='" + hexChars + "'" );
+ }
+ }
+ return retval;
+ }
+
+ /**
+ * This will take this string and create a hex representation of the bytes that make the string.
+ *
+ * @return A hex string representing the bytes in this string.
+ */
+ public String getHexString()
+ {
+ StringBuffer retval = new StringBuffer( out.size() * 2 );
+ byte[] data = getBytes();
+ for( int i=0; i<data.length; i++ )
+ {
+ retval.append( COSHEXTable.HEX_TABLE[ (data[i]+256)%256 ] );
+ }
+
+ return retval.toString();
+ }
+
+ /**
+ * This will get the string that this object wraps.
+ *
+ * @return The wrapped string.
+ */
+ public String getString()
+ {
+ String retval;
+ String encoding = "ISO-8859-1";
+ byte[] data = getBytes();
+ int start = 0;
+ if( data.length > 2 )
+ {
+ if( data[0] == (byte)0xFF && data[1] == (byte)0xFE )
+ {
+ encoding = "UTF-16LE";
+ start=2;
+ }
+ else if( data[0] == (byte)0xFE && data[1] == (byte)0xFF )
+ {
+ encoding = "UTF-16BE";
+ start=2;
+ }
+ }
+ try
+ {
+ if( encoding != null )
+ {
+ retval = new String( getBytes(), start, data.length-start, encoding );
+ }
+ else
+ {
+ retval = new String( getBytes() );
+ }
+ }
+ catch( UnsupportedEncodingException e )
+ {
+ //should never happen
+ e.printStackTrace();
+ retval = new String( getBytes() );
+ }
+ return retval;
+ }
+
+ /**
+ * This will append a byte[] to the string.
+ *
+ * @param data The byte[] to add to this string.
+ *
+ * @throws IOException If an IO error occurs while writing the byte.
+ */
+ public void append( byte[] data ) throws IOException
+ {
+ out.write( data );
+ }
+
+ /**
+ * This will append a byte to the string.
+ *
+ * @param in The byte to add to this string.
+ *
+ * @throws IOException If an IO error occurs while writing the byte.
+ */
+ public void append( int in ) throws IOException
+ {
+ out.write( in );
+ }
+
+ /**
+ * This will reset the internal buffer.
+ */
+ public void reset()
+ {
+ out.reset();
+ }
+
+ /**
+ * This will get the bytes of the string.
+ *
+ * @return A byte array that represents the string.
+ */
+ public byte[] getBytes()
+ {
+ return out.toByteArray();
+ }
+
+ /**
+ * @see Object#toString()
+ */
+ public String toString()
+ {
+ return "COSString{" + new String( getBytes() ) + "}";
+ }
+
+ /**
+ * This will output this string as a PDF object.
+ *
+ * @param output The stream to write to.
+ * @throws IOException If there is an error writing to the stream.
+ */
+ public void writePDF( OutputStream output ) throws IOException
+ {
+ boolean outsideASCII = false;
+ //Lets first check if we need to escape this string.
+ byte[] bytes = getBytes();
+ for( int i=0; i<bytes.length && !outsideASCII; i++ )
+ {
+ //if the byte is negative then it is an eight bit byte and is
+ //outside the ASCII range.
+ outsideASCII = bytes[i] <0;
+ }
+ if( !outsideASCII )
+ {
+ output.write(STRING_OPEN);
+ for( int i=0; i<bytes.length; i++ )
+ {
+ int b = (bytes[i]+256)%256;
+ switch( b )
+ {
+ case '(':
+ case ')':
+ case '\\':
+ {
+ output.write(ESCAPE);
+ output.write(b);
+ break;
+ }
+ case 10: //LF
+ {
+ output.write( LF_ESCAPE );
+ break;
+ }
+ case 13: // CR
+ {
+ output.write( CR_ESCAPE );
+ break;
+ }
+ case '\t':
+ {
+ output.write( HT_ESCAPE );
+ break;
+ }
+ case '\b':
+ {
+ output.write( BS_ESCAPE );
+ break;
+ }
+ case '\f':
+ {
+ output.write( FF_ESCAPE );
+ break;
+ }
+ default:
+ {
+ output.write( b );
+ }
+ }
+ }
+ output.write(STRING_CLOSE);
+ }
+ else
+ {
+ output.write(HEX_STRING_OPEN);
+ for(int i=0; i<bytes.length; i++ )
+ {
+ output.write( COSHEXTable.TABLE[ (bytes[i]+256)%256 ] );
+ }
+ output.write(HEX_STRING_CLOSE);
+ }
+ }
+
+
+
+ /**
+ * visitor pattern double dispatch method.
+ *
+ * @param visitor The object to notify when visiting this object.
+ * @return any object, depending on the visitor implementation, or null
+ * @throws COSVisitorException If an error occurs while visiting this object.
+ */
+ public Object accept(ICOSVisitor visitor) throws COSVisitorException
+ {
+ return visitor.visitFromString( this );
+ }
+
+ /**
+ * @see Object#equals( Object )
+ */
+ public boolean equals(Object obj)
+ {
+ return (obj instanceof COSString) && java.util.Arrays.equals(((COSString) obj).getBytes(), getBytes());
+ }
+
+ /**
+ * @see Object#hashCode()
+ */
+ public int hashCode()
+ {
+ return getBytes().hashCode();
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/cos/ICOSVisitor.java b/src/main/java/org/pdfbox/cos/ICOSVisitor.java
new file mode 100644
index 0000000..04b7542
--- /dev/null
+++ b/src/main/java/org/pdfbox/cos/ICOSVisitor.java
@@ -0,0 +1,132 @@
+/**
+ * Copyright (c) 2003, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.cos;
+
+import org.pdfbox.exceptions.COSVisitorException;
+
+/**
+ * An interface for visiting a PDF document at the type (COS) level.
+ *
+ * @author Michael Traut
+ * @version $Revision: 1.6 $
+ */
+public interface ICOSVisitor
+{
+ /**
+ * Notification of visit to Array object.
+ *
+ * @param obj The Object that is being visited.
+ * @return any Object depending on the visitor implementation, or null
+ * @throws COSVisitorException If there is an error while visiting this object.
+ */
+ public Object visitFromArray( COSArray obj ) throws COSVisitorException;
+
+ /**
+ * Notification of visit to boolean object.
+ *
+ * @param obj The Object that is being visited.
+ * @return any Object depending on the visitor implementation, or null
+ * @throws COSVisitorException If there is an error while visiting this object.
+ */
+ public Object visitFromBoolean( COSBoolean obj ) throws COSVisitorException;
+
+ /**
+ * Notification of visit to dictionary object.
+ *
+ * @param obj The Object that is being visited.
+ * @return any Object depending on the visitor implementation, or null
+ * @throws COSVisitorException If there is an error while visiting this object.
+ */
+ public Object visitFromDictionary( COSDictionary obj ) throws COSVisitorException;
+
+ /**
+ * Notification of visit to document object.
+ *
+ * @param obj The Object that is being visited.
+ * @return any Object depending on the visitor implementation, or null
+ * @throws COSVisitorException If there is an error while visiting this object.
+ */
+ public Object visitFromDocument( COSDocument obj ) throws COSVisitorException;
+
+ /**
+ * Notification of visit to float object.
+ *
+ * @param obj The Object that is being visited.
+ * @return any Object depending on the visitor implementation, or null
+ * @throws COSVisitorException If there is an error while visiting this object.
+ */
+ public Object visitFromFloat( COSFloat obj ) throws COSVisitorException;
+
+ /**
+ * Notification of visit to integer object.
+ *
+ * @param obj The Object that is being visited.
+ * @return any Object depending on the visitor implementation, or null
+ * @throws COSVisitorException If there is an error while visiting this object.
+ */
+ public Object visitFromInt( COSInteger obj ) throws COSVisitorException;
+
+ /**
+ * Notification of visit to name object.
+ *
+ * @param obj The Object that is being visited.
+ * @return any Object depending on the visitor implementation, or null
+ * @throws COSVisitorException If there is an error while visiting this object.
+ */
+ public Object visitFromName( COSName obj ) throws COSVisitorException;
+
+ /**
+ * Notification of visit to null object.
+ *
+ * @param obj The Object that is being visited.
+ * @return any Object depending on the visitor implementation, or null
+ * @throws COSVisitorException If there is an error while visiting this object.
+ */
+ public Object visitFromNull( COSNull obj ) throws COSVisitorException;
+
+ /**
+ * Notification of visit to stream object.
+ *
+ * @param obj The Object that is being visited.
+ * @return any Object depending on the visitor implementation, or null
+ * @throws COSVisitorException If there is an error while visiting this object.
+ */
+ public Object visitFromStream( COSStream obj ) throws COSVisitorException;
+
+ /**
+ * Notification of visit to string object.
+ *
+ * @param obj The Object that is being visited.
+ * @return any Object depending on the visitor implementation, or null
+ * @throws COSVisitorException If there is an error while visiting this object.
+ */
+ public Object visitFromString( COSString obj ) throws COSVisitorException;
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/cos/package.html b/src/main/java/org/pdfbox/cos/package.html
new file mode 100644
index 0000000..4db3df3
--- /dev/null
+++ b/src/main/java/org/pdfbox/cos/package.html
@@ -0,0 +1,12 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head>
+
+</head>
+<body>
+These are the low level objects that make up a PDF document.
+<br/><br/>
+
+See the <A href="http://partners.adobe.com/asn/developer/acrosdk/docs/filefmtspecs/PDFReference.pdf">PDF Reference 1.4</A>.
+</body>
+</html>
diff --git a/src/main/java/org/pdfbox/encoding/AFMEncoding.java b/src/main/java/org/pdfbox/encoding/AFMEncoding.java
new file mode 100644
index 0000000..badb7bf
--- /dev/null
+++ b/src/main/java/org/pdfbox/encoding/AFMEncoding.java
@@ -0,0 +1,76 @@
+/**
+ * Copyright (c) 2003, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.encoding;
+
+import java.util.Iterator;
+
+import org.pdfbox.afmtypes.CharMetric;
+import org.pdfbox.afmtypes.FontMetric;
+
+import org.pdfbox.cos.COSBase;
+import org.pdfbox.cos.COSName;
+
+/**
+ * This will handle the encoding from an AFM font.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.6 $
+ */
+public class AFMEncoding extends Encoding
+{
+ private FontMetric metric = null;
+
+ /**
+ * Constructor.
+ *
+ * @param fontInfo The font metric information.
+ */
+ public AFMEncoding( FontMetric fontInfo )
+ {
+ metric = fontInfo;
+ Iterator characters = metric.getCharMetrics().iterator();
+ while( characters.hasNext() )
+ {
+ CharMetric nextMetric = (CharMetric)characters.next();
+ addCharacterEncoding( nextMetric.getCharacterCode(), COSName.getPDFName( nextMetric.getName() ) );
+ }
+ }
+
+ /**
+ * Convert this standard java object to a COS object.
+ *
+ * @return The cos object that matches this Java object.
+ */
+ public COSBase getCOSObject()
+ {
+ return null;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/encoding/DictionaryEncoding.java b/src/main/java/org/pdfbox/encoding/DictionaryEncoding.java
new file mode 100644
index 0000000..4378898
--- /dev/null
+++ b/src/main/java/org/pdfbox/encoding/DictionaryEncoding.java
@@ -0,0 +1,112 @@
+/**
+ * Copyright (c) 2003, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.encoding;
+
+import java.io.IOException;
+
+import org.pdfbox.cos.COSArray;
+import org.pdfbox.cos.COSBase;
+import org.pdfbox.cos.COSDictionary;
+import org.pdfbox.cos.COSName;
+import org.pdfbox.cos.COSNumber;
+
+/**
+ * This will perform the encoding from a dictionary.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.12 $
+ */
+public class DictionaryEncoding extends Encoding
+{
+ private COSDictionary encoding = null;
+
+ /**
+ * Constructor.
+ *
+ * @param fontEncoding The encoding dictionary.
+ *
+ * @throws IOException If there is a problem getting the base font.
+ */
+ public DictionaryEncoding( COSDictionary fontEncoding ) throws IOException
+ {
+ encoding = fontEncoding;
+
+ //first set up the base encoding
+ //The previious value WinAnsiEncoding() has been changed to StandardEnding
+ //see p 389 of the PDF 1.5 reférence table 5.11 entries in a dictionary encoding
+ //"If this entry is absent, the Differences entry describes differences from an implicit
+ //base encoding. For a font program that is embedded in the PDF file, the
+ //implicit base encoding is the font program’s built-in encoding, as described
+ //above and further elaborated in the sections on specific font types below. Otherwise,
+ //for a nonsymbolic font, it is StandardEncoding, and for a symbolic font, it
+ //is the font’s built-in encoding."
+
+ //so the default base encoding is standardEncoding
+ Encoding baseEncoding = new StandardEncoding();
+ COSName baseEncodingName = (COSName)encoding.getDictionaryObject( COSName.BASE_ENCODING );
+
+ if( baseEncodingName != null )
+ {
+ EncodingManager manager = new EncodingManager();
+ baseEncoding = manager.getEncoding( baseEncodingName );
+ }
+ nameToCode.putAll( baseEncoding.nameToCode );
+ codeToName.putAll( baseEncoding.codeToName );
+
+
+ //now replace with the differences.
+ COSArray differences = (COSArray)encoding.getDictionaryObject( COSName.DIFFERENCES );
+ int currentIndex = -1;
+ for( int i=0; differences != null && i<differences.size(); i++ )
+ {
+ COSBase next = differences.getObject( i );
+ if( next instanceof COSNumber )
+ {
+ currentIndex = (int)((COSNumber)next).intValue();
+ }
+ else if( next instanceof COSName )
+ {
+ COSName name = (COSName)next;
+ addCharacterEncoding( currentIndex++, name );
+ }
+ }
+ }
+
+ /**
+ * Convert this standard java object to a COS object.
+ *
+ * @return The cos object that matches this Java object.
+ */
+ public COSBase getCOSObject()
+ {
+ return encoding;
+ }
+}
diff --git a/src/main/java/org/pdfbox/encoding/Encoding.java b/src/main/java/org/pdfbox/encoding/Encoding.java
new file mode 100644
index 0000000..dc6387d
--- /dev/null
+++ b/src/main/java/org/pdfbox/encoding/Encoding.java
@@ -0,0 +1,268 @@
+/**
+ * Copyright (c) 2003-2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.encoding;
+
+import java.io.BufferedReader;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.IOException;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.StringTokenizer;
+
+import org.pdfbox.cos.COSName;
+
+import org.pdfbox.util.ResourceLoader;
+
+import org.apache.log4j.Logger;
+
+import org.pdfbox.pdmodel.common.COSObjectable;
+
+/**
+ * This is an interface to a text encoder.
+ *
+ * @author Ben Litchfield
+ * @version $Revision: 1.13 $
+ */
+public abstract class Encoding implements COSObjectable
+{
+
+
+ /**
+ * This is a mapping from a character code to a character name.
+ */
+ protected Map codeToName = new HashMap();
+ /**
+ * This is a mapping from a character name to a character code.
+ */
+ protected Map nameToCode = new HashMap();
+
+ private static final Map NAME_TO_CHARACTER = new HashMap();
+ private static final Map CHARACTER_TO_NAME = new HashMap();
+
+ private static Logger log = Logger.getLogger( Encoding.class );
+
+ static
+ {
+ BufferedReader glyphStream = null;
+ try
+ {
+ InputStream resource = ResourceLoader.loadResource( "Resources/glyphlist.txt" );
+ glyphStream = new BufferedReader( new InputStreamReader( resource ) );
+ String line = null;
+ while( (line = glyphStream.readLine()) != null )
+ {
+ line = line.trim();
+ //lines starting with # are comments which we can ignore.
+ if( !line.startsWith("#" ) )
+ {
+ int semicolonIndex = line.indexOf( ';' );
+ if( semicolonIndex >= 0 )
+ {
+ try
+ {
+ String characterName = line.substring( 0, semicolonIndex );
+ String unicodeValue = line.substring( semicolonIndex+1, line.length() );
+ StringTokenizer tokenizer = new StringTokenizer( unicodeValue, " ", false );
+ String value = "";
+ while(tokenizer.hasMoreTokens())
+ {
+ int characterCode = Integer.parseInt( tokenizer.nextToken(), 16 );
+ value += (char)characterCode;
+ }
+
+ NAME_TO_CHARACTER.put( COSName.getPDFName( characterName ), value );
+ }
+ catch( NumberFormatException nfe )
+ {
+ log.error( "Error parsing line '" + line + "' ", nfe );
+ }
+ }
+ }
+ }
+ }
+ catch( IOException io )
+ {
+ log.error( "Error reading Resources/glyphlist.txt", io );
+ }
+ finally
+ {
+ if( glyphStream != null )
+ {
+ try
+ {
+ glyphStream.close();
+ }
+ catch( IOException e )
+ {
+ log.warn( "Error closing stream", e );
+ }
+
+ }
+ }
+
+
+ NAME_TO_CHARACTER.put( COSName.getPDFName( ".notdef" ), "" );
+ NAME_TO_CHARACTER.put( COSName.getPDFName( "fi" ), "fi" );
+ NAME_TO_CHARACTER.put( COSName.getPDFName( "fl" ), "fl" );
+ NAME_TO_CHARACTER.put( COSName.getPDFName( "ffi" ), "ffi" );
+ NAME_TO_CHARACTER.put( COSName.getPDFName( "ff" ), "ff" );
+ NAME_TO_CHARACTER.put( COSName.getPDFName( "pi" ), "pi" );
+
+ Iterator keys = NAME_TO_CHARACTER.keySet().iterator();
+ while( keys.hasNext() )
+ {
+ Object key = keys.next();
+ Object value = NAME_TO_CHARACTER.get( key );
+ CHARACTER_TO_NAME.put( value, key );
+ }
+ }
+
+
+ /**
+ * This will add a character encoding.
+ *
+ * @param code The character code that matches the character.
+ * @param name The name of the character.
+ */
+ protected void addCharacterEncoding( int code, COSName name )
+ {
+ Integer intCode = new Integer( code );
+ codeToName.put( intCode, name );
+ nameToCode.put( name, intCode );
+ }
+
+ /**
+ * This will get the character code for the name.
+ *
+ * @param name The name of the character.
+ *
+ * @return The code for the character.
+ *
+ * @throws IOException If there is no character code for the name.
+ */
+ public int getCode( COSName name ) throws IOException
+ {
+ Integer code = (Integer)nameToCode.get( name );
+ if( code == null )
+ {
+ throw new IOException( "No character code for character name '" + name.getName() + "'" );
+ }
+ return code.intValue();
+ }
+
+ /**
+ * This will take a character code and get the name from the code.
+ *
+ * @param code The character code.
+ *
+ * @return The name of the character.
+ *
+ * @throws IOException If there is no name for the code.
+ */
+ public COSName getName( int code ) throws IOException
+ {
+ COSName name = (COSName)codeToName.get( new Integer( code ) );
+ if( name == null )
+ {
+ //lets be forgiving for now
+ name = COSName.getPDFName( "space" );
+ //throw new IOException( getClass().getName() +
+ // ": No name for character code '" + code + "'" );
+ }
+ if( log.isDebugEnabled() )
+ {
+ log.debug( "Encoding.getName( " + code + " )=" + name );
+ }
+ return name;
+ }
+
+ /**
+ * This will take a character code and get the name from the code.
+ *
+ * @param c The character.
+ *
+ * @return The name of the character.
+ *
+ * @throws IOException If there is no name for the character.
+ */
+ public COSName getNameFromCharacter( char c ) throws IOException
+ {
+ COSName name = (COSName)CHARACTER_TO_NAME.get( "" + c );
+ if( name == null )
+ {
+ throw new IOException( "No name for character '" + c + "'" );
+ }
+ return name;
+ }
+
+ /**
+ * This will get the character from the code.
+ *
+ * @param code The character code.
+ *
+ * @return The printable character for the code.
+ *
+ * @throws IOException If there is not name for the character.
+ */
+ public String getCharacter( int code ) throws IOException
+ {
+ String character = getCharacter( getName( code ) );
+ if( log.isDebugEnabled() )
+ {
+ log.debug( "Encoding.getCharacter( " + code + " )=" + character );
+ }
+ return character;
+ }
+
+ /**
+ * This will get the character from the name.
+ *
+ * @param name The name of the character.
+ *
+ * @return The printable character for the code.
+ */
+ public static String getCharacter( COSName name )
+ {
+ String character = (String)NAME_TO_CHARACTER.get( name );
+ if( character == null )
+ {
+ character = name.getName();
+ }
+ if( log.isDebugEnabled() )
+ {
+ log.debug( "Encoding.getCharacter(" + name + ")=" + character );
+ }
+ return character;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/encoding/EncodingManager.java b/src/main/java/org/pdfbox/encoding/EncodingManager.java
new file mode 100644
index 0000000..9e8e4b3
--- /dev/null
+++ b/src/main/java/org/pdfbox/encoding/EncodingManager.java
@@ -0,0 +1,87 @@
+/**
+ * Copyright (c) 2003, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.encoding;
+
+import java.io.IOException;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.pdfbox.cos.COSName;
+
+/**
+ * This class will handle getting the appropriate encodings.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.5 $
+ */
+public class EncodingManager
+{
+ private static final Map ENCODINGS = new HashMap();
+
+ static
+ {
+ ENCODINGS.put( COSName.MAC_ROMAN_ENCODING, new MacRomanEncoding() );
+ ENCODINGS.put( COSName.PDF_DOC_ENCODING, new PdfDocEncoding() );
+ ENCODINGS.put( COSName.STANDARD_ENCODING, new StandardEncoding() );
+ ENCODINGS.put( COSName.WIN_ANSI_ENCODING, new WinAnsiEncoding() );
+
+ }
+
+ /**
+ * This will get the standard encoding.
+ *
+ * @return The standard encoding.
+ */
+ public Encoding getStandardEncoding()
+ {
+ return (Encoding)ENCODINGS.get( COSName.STANDARD_ENCODING );
+ }
+
+ /**
+ * This will get an encoding by name.
+ *
+ * @param name The name of the encoding to get.
+ *
+ * @return The encoding that matches the name.
+ *
+ * @throws IOException If there is not encoding with that name.
+ */
+ public Encoding getEncoding( COSName name ) throws IOException
+ {
+ Encoding encoding = (Encoding)ENCODINGS.get( name );
+ if( encoding == null )
+ {
+ throw new IOException( "Unknown encoding for '" + name.getName() + "'" );
+ }
+ return encoding;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/encoding/MacRomanEncoding.java b/src/main/java/org/pdfbox/encoding/MacRomanEncoding.java
new file mode 100644
index 0000000..6a560a2
--- /dev/null
+++ b/src/main/java/org/pdfbox/encoding/MacRomanEncoding.java
@@ -0,0 +1,267 @@
+/**
+ * Copyright (c) 2003, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.encoding;
+
+import org.pdfbox.cos.COSBase;
+import org.pdfbox.cos.COSName;
+
+/**
+ * This is an interface to a text encoder.
+ *
+ * @author Ben Litchfield
+ * @version $Revision: 1.9 $
+ */
+public class MacRomanEncoding extends Encoding
+{
+ /**
+ * Constructor.
+ */
+ public MacRomanEncoding()
+ {
+ addCharacterEncoding( 0101, COSName.getPDFName( "A" ) );
+ addCharacterEncoding( 0256, COSName.getPDFName( "AE" ) );
+ addCharacterEncoding( 0347, COSName.getPDFName( "Aacute" ) );
+ addCharacterEncoding( 0345, COSName.getPDFName( "Acircumflex" ) );
+ addCharacterEncoding( 0200, COSName.getPDFName( "Adieresis" ) );
+ addCharacterEncoding( 0313, COSName.getPDFName( "Agrave" ) );
+ addCharacterEncoding( 0201, COSName.getPDFName( "Aring" ) );
+ addCharacterEncoding( 0314, COSName.getPDFName( "Atilde" ) );
+ addCharacterEncoding( 0102, COSName.getPDFName( "B" ) );
+ addCharacterEncoding( 0103, COSName.getPDFName( "C" ) );
+ addCharacterEncoding( 0202, COSName.getPDFName( "Ccedilla" ) );
+ addCharacterEncoding( 0104, COSName.getPDFName( "D" ) );
+ addCharacterEncoding( 0105, COSName.getPDFName( "E" ) );
+ addCharacterEncoding( 0203, COSName.getPDFName( "Eacute" ) );
+ addCharacterEncoding( 0346, COSName.getPDFName( "Ecircumflex" ) );
+ addCharacterEncoding( 0350, COSName.getPDFName( "Edieresis" ) );
+ addCharacterEncoding( 0351, COSName.getPDFName( "Egrave" ) );
+ addCharacterEncoding( 0106, COSName.getPDFName( "F" ) );
+ addCharacterEncoding( 0107, COSName.getPDFName( "G" ) );
+ addCharacterEncoding( 0110, COSName.getPDFName( "H" ) );
+ addCharacterEncoding( 0111, COSName.getPDFName( "I" ) );
+ addCharacterEncoding( 0352, COSName.getPDFName( "Iacute" ) );
+ addCharacterEncoding( 0353, COSName.getPDFName( "Icircumflex" ) );
+ addCharacterEncoding( 0354, COSName.getPDFName( "Idieresis" ) );
+ addCharacterEncoding( 0355, COSName.getPDFName( "Igrave" ) );
+ addCharacterEncoding( 0112, COSName.getPDFName( "J" ) );
+ addCharacterEncoding( 0113, COSName.getPDFName( "K" ) );
+ addCharacterEncoding( 0114, COSName.getPDFName( "L" ) );
+ addCharacterEncoding( 0115, COSName.getPDFName( "M" ) );
+ addCharacterEncoding( 0116, COSName.getPDFName( "N" ) );
+ addCharacterEncoding( 0204, COSName.getPDFName( "Ntilde" ) );
+ addCharacterEncoding( 0117, COSName.getPDFName( "O" ) );
+ addCharacterEncoding( 0316, COSName.getPDFName( "OE" ) );
+ addCharacterEncoding( 0356, COSName.getPDFName( "Oacute" ) );
+ addCharacterEncoding( 0357, COSName.getPDFName( "Ocircumflex" ) );
+ addCharacterEncoding( 0205, COSName.getPDFName( "Odieresis" ) );
+ addCharacterEncoding( 0361, COSName.getPDFName( "Ograve" ) );
+ addCharacterEncoding( 0257, COSName.getPDFName( "Oslash" ) );
+ addCharacterEncoding( 0315, COSName.getPDFName( "Otilde" ) );
+ addCharacterEncoding( 0120, COSName.getPDFName( "P" ) );
+ addCharacterEncoding( 0121, COSName.getPDFName( "Q" ) );
+ addCharacterEncoding( 0122, COSName.getPDFName( "R" ) );
+ addCharacterEncoding( 0123, COSName.getPDFName( "S" ) );
+ addCharacterEncoding( 0124, COSName.getPDFName( "T" ) );
+ addCharacterEncoding( 0125, COSName.getPDFName( "U" ) );
+ addCharacterEncoding( 0362, COSName.getPDFName( "Uacute" ) );
+ addCharacterEncoding( 0363, COSName.getPDFName( "Ucircumflex" ) );
+ addCharacterEncoding( 0206, COSName.getPDFName( "Udieresis" ) );
+ addCharacterEncoding( 0364, COSName.getPDFName( "Ugrave" ) );
+ addCharacterEncoding( 0126, COSName.getPDFName( "V" ) );
+ addCharacterEncoding( 0127, COSName.getPDFName( "W" ) );
+ addCharacterEncoding( 0130, COSName.getPDFName( "X" ) );
+ addCharacterEncoding( 0131, COSName.getPDFName( "Y" ) );
+ addCharacterEncoding( 0331, COSName.getPDFName( "Ydieresis" ) );
+ addCharacterEncoding( 0132, COSName.getPDFName( "Z" ) );
+ addCharacterEncoding( 0141, COSName.getPDFName( "a" ) );
+ addCharacterEncoding( 0207, COSName.getPDFName( "aacute" ) );
+ addCharacterEncoding( 0211, COSName.getPDFName( "acircumflex" ) );
+ addCharacterEncoding( 0253, COSName.getPDFName( "acute" ) );
+ addCharacterEncoding( 0212, COSName.getPDFName( "adieresis" ) );
+ addCharacterEncoding( 0276, COSName.getPDFName( "ae" ) );
+ addCharacterEncoding( 0210, COSName.getPDFName( "agrave" ) );
+ addCharacterEncoding( 046, COSName.getPDFName( "ampersand" ) );
+ addCharacterEncoding( 0214, COSName.getPDFName( "aring" ) );
+ addCharacterEncoding( 0136, COSName.getPDFName( "asciicircum" ) );
+ addCharacterEncoding( 0176, COSName.getPDFName( "asciitilde" ) );
+ addCharacterEncoding( 052, COSName.getPDFName( "asterisk" ) );
+ addCharacterEncoding( 0100, COSName.getPDFName( "at" ) );
+ addCharacterEncoding( 0213, COSName.getPDFName( "atilde" ) );
+ addCharacterEncoding( 0142, COSName.getPDFName( "b" ) );
+ addCharacterEncoding( 0134, COSName.getPDFName( "backslash" ) );
+ addCharacterEncoding( 0174, COSName.getPDFName( "bar" ) );
+ addCharacterEncoding( 0173, COSName.getPDFName( "braceleft" ) );
+ addCharacterEncoding( 0175, COSName.getPDFName( "braceright" ) );
+ addCharacterEncoding( 0133, COSName.getPDFName( "bracketleft" ) );
+ addCharacterEncoding( 0135, COSName.getPDFName( "bracketright" ) );
+ addCharacterEncoding( 0371, COSName.getPDFName( "breve" ) );
+ addCharacterEncoding( 0245, COSName.getPDFName( "bullet" ) );
+ addCharacterEncoding( 0143, COSName.getPDFName( "c" ) );
+ addCharacterEncoding( 0377, COSName.getPDFName( "caron" ) );
+ addCharacterEncoding( 0215, COSName.getPDFName( "ccedilla" ) );
+ addCharacterEncoding( 0374, COSName.getPDFName( "cedilla" ) );
+ addCharacterEncoding( 0242, COSName.getPDFName( "cent" ) );
+ addCharacterEncoding( 0366, COSName.getPDFName( "circumflex" ) );
+ addCharacterEncoding( 072, COSName.getPDFName( "colon" ) );
+ addCharacterEncoding( 054, COSName.getPDFName( "comma" ) );
+ addCharacterEncoding( 0251, COSName.getPDFName( "copyright" ) );
+ addCharacterEncoding( 0333, COSName.getPDFName( "currency1" ) );
+ addCharacterEncoding( 0144, COSName.getPDFName( "d" ) );
+ addCharacterEncoding( 0240, COSName.getPDFName( "dagger" ) );
+ addCharacterEncoding( 0340, COSName.getPDFName( "daggerdbl" ) );
+ addCharacterEncoding( 0241, COSName.getPDFName( "degree" ) );
+ addCharacterEncoding( 0254, COSName.getPDFName( "dieresis" ) );
+ addCharacterEncoding( 0326, COSName.getPDFName( "divide" ) );
+ addCharacterEncoding( 044, COSName.getPDFName( "dollar" ) );
+ addCharacterEncoding( 0372, COSName.getPDFName( "dotaccent" ) );
+ addCharacterEncoding( 0365, COSName.getPDFName( "dotlessi" ) );
+ addCharacterEncoding( 0145, COSName.getPDFName( "e" ) );
+ addCharacterEncoding( 0216, COSName.getPDFName( "eacute" ) );
+ addCharacterEncoding( 0220, COSName.getPDFName( "ecircumflex" ) );
+ addCharacterEncoding( 0221, COSName.getPDFName( "edieresis" ) );
+ addCharacterEncoding( 0217, COSName.getPDFName( "egrave" ) );
+ addCharacterEncoding( 070, COSName.getPDFName( "eight" ) );
+ addCharacterEncoding( 0311, COSName.getPDFName( "ellipsis" ) );
+ addCharacterEncoding( 0321, COSName.getPDFName( "emdash" ) );
+ addCharacterEncoding( 0320, COSName.getPDFName( "endash" ) );
+ addCharacterEncoding( 075, COSName.getPDFName( "equal" ) );
+ addCharacterEncoding( 041, COSName.getPDFName( "exclam" ) );
+ addCharacterEncoding( 0301, COSName.getPDFName( "exclamdown" ) );
+ addCharacterEncoding( 0146, COSName.getPDFName( "f" ) );
+ addCharacterEncoding( 0336, COSName.getPDFName( "fi" ) );
+ addCharacterEncoding( 065, COSName.getPDFName( "five" ) );
+ addCharacterEncoding( 0337, COSName.getPDFName( "fl" ) );
+ addCharacterEncoding( 0304, COSName.getPDFName( "florin" ) );
+ addCharacterEncoding( 064, COSName.getPDFName( "four" ) );
+ addCharacterEncoding( 0332, COSName.getPDFName( "fraction" ) );
+ addCharacterEncoding( 0147, COSName.getPDFName( "g" ) );
+ addCharacterEncoding( 0247, COSName.getPDFName( "germandbls" ) );
+ addCharacterEncoding( 0140, COSName.getPDFName( "grave" ) );
+ addCharacterEncoding( 076, COSName.getPDFName( "greater" ) );
+ addCharacterEncoding( 0307, COSName.getPDFName( "guillemotleft" ) );
+ addCharacterEncoding( 0310, COSName.getPDFName( "guillemotright" ) );
+ addCharacterEncoding( 0334, COSName.getPDFName( "guilsinglleft" ) );
+ addCharacterEncoding( 0335, COSName.getPDFName( "guilsinglright" ) );
+ addCharacterEncoding( 0150, COSName.getPDFName( "h" ) );
+ addCharacterEncoding( 0375, COSName.getPDFName( "hungarumlaut" ) );
+ addCharacterEncoding( 055, COSName.getPDFName( "hyphen" ) );
+ addCharacterEncoding( 0151, COSName.getPDFName( "i" ) );
+ addCharacterEncoding( 0222, COSName.getPDFName( "iacute" ) );
+ addCharacterEncoding( 0224, COSName.getPDFName( "icircumflex" ) );
+ addCharacterEncoding( 0225, COSName.getPDFName( "idieresis" ) );
+ addCharacterEncoding( 0223, COSName.getPDFName( "igrave" ) );
+ addCharacterEncoding( 0152, COSName.getPDFName( "j" ) );
+ addCharacterEncoding( 0153, COSName.getPDFName( "k" ) );
+ addCharacterEncoding( 0154, COSName.getPDFName( "l" ) );
+ addCharacterEncoding( 074, COSName.getPDFName( "less" ) );
+ addCharacterEncoding( 0302, COSName.getPDFName( "logicalnot" ) );
+ addCharacterEncoding( 0155, COSName.getPDFName( "m" ) );
+ addCharacterEncoding( 0370, COSName.getPDFName( "macron" ) );
+ addCharacterEncoding( 0265, COSName.getPDFName( "mu" ) );
+ addCharacterEncoding( 0156, COSName.getPDFName( "n" ) );
+ addCharacterEncoding( 071, COSName.getPDFName( "nine" ) );
+ addCharacterEncoding( 0226, COSName.getPDFName( "ntilde" ) );
+ addCharacterEncoding( 043, COSName.getPDFName( "numbersign" ) );
+ addCharacterEncoding( 0157, COSName.getPDFName( "o" ) );
+ addCharacterEncoding( 0227, COSName.getPDFName( "oacute" ) );
+ addCharacterEncoding( 0231, COSName.getPDFName( "ocircumflex" ) );
+ addCharacterEncoding( 0232, COSName.getPDFName( "odieresis" ) );
+ addCharacterEncoding( 0317, COSName.getPDFName( "oe" ) );
+ addCharacterEncoding( 0376, COSName.getPDFName( "ogonek" ) );
+ addCharacterEncoding( 0230, COSName.getPDFName( "ograve" ) );
+ addCharacterEncoding( 061, COSName.getPDFName( "one" ) );
+ addCharacterEncoding( 0273, COSName.getPDFName( "ordfeminine" ) );
+ addCharacterEncoding( 0274, COSName.getPDFName( "ordmasculine" ) );
+ addCharacterEncoding( 0277, COSName.getPDFName( "oslash" ) );
+ addCharacterEncoding( 0233, COSName.getPDFName( "otilde" ) );
+ addCharacterEncoding( 0160, COSName.getPDFName( "p" ) );
+ addCharacterEncoding( 0246, COSName.getPDFName( "paragraph" ) );
+ addCharacterEncoding( 050, COSName.getPDFName( "parenleft" ) );
+ addCharacterEncoding( 051, COSName.getPDFName( "parenright" ) );
+ addCharacterEncoding( 045, COSName.getPDFName( "percent" ) );
+ addCharacterEncoding( 056, COSName.getPDFName( "period" ) );
+ addCharacterEncoding( 0341, COSName.getPDFName( "periodcentered" ) );
+ addCharacterEncoding( 0344, COSName.getPDFName( "perthousand" ) );
+ addCharacterEncoding( 053, COSName.getPDFName( "plus" ) );
+ addCharacterEncoding( 0261, COSName.getPDFName( "plusminus" ) );
+ addCharacterEncoding( 0161, COSName.getPDFName( "q" ) );
+ addCharacterEncoding( 077, COSName.getPDFName( "question" ) );
+ addCharacterEncoding( 0300, COSName.getPDFName( "questiondown" ) );
+ addCharacterEncoding( 042, COSName.getPDFName( "quotedbl" ) );
+ addCharacterEncoding( 0343, COSName.getPDFName( "quotedblbase" ) );
+ addCharacterEncoding( 0322, COSName.getPDFName( "quotedblleft" ) );
+ addCharacterEncoding( 0323, COSName.getPDFName( "quotedblright" ) );
+ addCharacterEncoding( 0324, COSName.getPDFName( "quoteleft" ) );
+ addCharacterEncoding( 0325, COSName.getPDFName( "quoteright" ) );
+ addCharacterEncoding( 0342, COSName.getPDFName( "quotesinglbase" ) );
+ addCharacterEncoding( 047, COSName.getPDFName( "quotesingle" ) );
+ addCharacterEncoding( 0162, COSName.getPDFName( "r" ) );
+ addCharacterEncoding( 0250, COSName.getPDFName( "registered" ) );
+ addCharacterEncoding( 0373, COSName.getPDFName( "ring" ) );
+ addCharacterEncoding( 0163, COSName.getPDFName( "s" ) );
+ addCharacterEncoding( 0244, COSName.getPDFName( "section" ) );
+ addCharacterEncoding( 073, COSName.getPDFName( "semicolon" ) );
+ addCharacterEncoding( 067, COSName.getPDFName( "seven" ) );
+ addCharacterEncoding( 066, COSName.getPDFName( "six" ) );
+ addCharacterEncoding( 057, COSName.getPDFName( "slash" ) );
+ addCharacterEncoding( 040, COSName.getPDFName( "space" ) );
+ addCharacterEncoding( 0243, COSName.getPDFName( "sterling" ) );
+ addCharacterEncoding( 0164, COSName.getPDFName( "t" ) );
+ addCharacterEncoding( 063, COSName.getPDFName( "three" ) );
+ addCharacterEncoding( 0367, COSName.getPDFName( "tilde" ) );
+ addCharacterEncoding( 0252, COSName.getPDFName( "trademark" ) );
+ addCharacterEncoding( 062, COSName.getPDFName( "two" ) );
+ addCharacterEncoding( 0165, COSName.getPDFName( "u" ) );
+ addCharacterEncoding( 0234, COSName.getPDFName( "uacute" ) );
+ addCharacterEncoding( 0236, COSName.getPDFName( "ucircumflex" ) );
+ addCharacterEncoding( 0237, COSName.getPDFName( "udieresis" ) );
+ addCharacterEncoding( 0235, COSName.getPDFName( "ugrave" ) );
+ addCharacterEncoding( 0137, COSName.getPDFName( "underscore" ) );
+ addCharacterEncoding( 0166, COSName.getPDFName( "v" ) );
+ addCharacterEncoding( 0167, COSName.getPDFName( "w" ) );
+ addCharacterEncoding( 0170, COSName.getPDFName( "x" ) );
+ addCharacterEncoding( 0171, COSName.getPDFName( "y" ) );
+ addCharacterEncoding( 0330, COSName.getPDFName( "ydieresis" ) );
+ addCharacterEncoding( 0264, COSName.getPDFName( "yen" ) );
+ addCharacterEncoding( 0172, COSName.getPDFName( "z" ) );
+ addCharacterEncoding( 060, COSName.getPDFName( "zero" ) );
+ }
+
+ /**
+ * Convert this standard java object to a COS object.
+ *
+ * @return The cos object that matches this Java object.
+ */
+ public COSBase getCOSObject()
+ {
+ return COSName.MAC_ROMAN_ENCODING;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/encoding/PdfDocEncoding.java b/src/main/java/org/pdfbox/encoding/PdfDocEncoding.java
new file mode 100644
index 0000000..1153002
--- /dev/null
+++ b/src/main/java/org/pdfbox/encoding/PdfDocEncoding.java
@@ -0,0 +1,289 @@
+/**
+ * Copyright (c) 2003, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.encoding;
+
+import org.pdfbox.cos.COSBase;
+import org.pdfbox.cos.COSName;
+
+/**
+ * This is an interface to a text encoder.
+ *
+ * @author Ben Litchfield
+ * @version $Revision: 1.9 $
+ */
+public class PdfDocEncoding extends Encoding
+{
+ /**
+ * Constructor.
+ */
+ public PdfDocEncoding()
+ {
+ addCharacterEncoding( 0101, COSName.getPDFName( "A" ) );
+ addCharacterEncoding( 0306, COSName.getPDFName( "AE" ) );
+ addCharacterEncoding( 0301, COSName.getPDFName( "Aacute" ) );
+ addCharacterEncoding( 0302, COSName.getPDFName( "Acircumflex" ) );
+ addCharacterEncoding( 0304, COSName.getPDFName( "Adieresis" ) );
+ addCharacterEncoding( 0300, COSName.getPDFName( "Agrave" ) );
+ addCharacterEncoding( 0305, COSName.getPDFName( "Aring" ) );
+ addCharacterEncoding( 0303, COSName.getPDFName( "Atilde" ) );
+ addCharacterEncoding( 0102, COSName.getPDFName( "B" ) );
+ addCharacterEncoding( 0103, COSName.getPDFName( "C" ) );
+ addCharacterEncoding( 0307, COSName.getPDFName( "Ccedilla" ) );
+ addCharacterEncoding( 0104, COSName.getPDFName( "D" ) );
+ addCharacterEncoding( 0105, COSName.getPDFName( "E" ) );
+ addCharacterEncoding( 0311, COSName.getPDFName( "Eacute" ) );
+ addCharacterEncoding( 0312, COSName.getPDFName( "Ecircumflex" ) );
+ addCharacterEncoding( 0313, COSName.getPDFName( "Edieresis" ) );
+ addCharacterEncoding( 0310, COSName.getPDFName( "Egrave" ) );
+ addCharacterEncoding( 0320, COSName.getPDFName( "Eth" ) );
+ addCharacterEncoding( 0240, COSName.getPDFName( "Euro" ) );
+ addCharacterEncoding( 0106, COSName.getPDFName( "F" ) );
+ addCharacterEncoding( 0107, COSName.getPDFName( "G" ) );
+ addCharacterEncoding( 0110, COSName.getPDFName( "H" ) );
+ addCharacterEncoding( 0111, COSName.getPDFName( "I" ) );
+ addCharacterEncoding( 0315, COSName.getPDFName( "Iacute" ) );
+ addCharacterEncoding( 0316, COSName.getPDFName( "Icircumflex" ) );
+ addCharacterEncoding( 0317, COSName.getPDFName( "Idieresis" ) );
+ addCharacterEncoding( 0314, COSName.getPDFName( "Igrave" ) );
+ addCharacterEncoding( 0112, COSName.getPDFName( "J" ) );
+ addCharacterEncoding( 0113, COSName.getPDFName( "K" ) );
+ addCharacterEncoding( 0114, COSName.getPDFName( "L" ) );
+ addCharacterEncoding( 0225, COSName.getPDFName( "Lslash" ) );
+ addCharacterEncoding( 0115, COSName.getPDFName( "M" ) );
+ addCharacterEncoding( 0116, COSName.getPDFName( "N" ) );
+ addCharacterEncoding( 0321, COSName.getPDFName( "Ntilde" ) );
+ addCharacterEncoding( 0117, COSName.getPDFName( "O" ) );
+ addCharacterEncoding( 0226, COSName.getPDFName( "OE" ) );
+ addCharacterEncoding( 0323, COSName.getPDFName( "Oacute" ) );
+ addCharacterEncoding( 0324, COSName.getPDFName( "Ocircumflex" ) );
+ addCharacterEncoding( 0326, COSName.getPDFName( "Odieresis" ) );
+ addCharacterEncoding( 0322, COSName.getPDFName( "Ograve" ) );
+ addCharacterEncoding( 0330, COSName.getPDFName( "Oslash" ) );
+ addCharacterEncoding( 0325, COSName.getPDFName( "Otilde" ) );
+ addCharacterEncoding( 0120, COSName.getPDFName( "P" ) );
+ addCharacterEncoding( 0121, COSName.getPDFName( "Q" ) );
+ addCharacterEncoding( 0122, COSName.getPDFName( "R" ) );
+ addCharacterEncoding( 0123, COSName.getPDFName( "S" ) );
+ addCharacterEncoding( 0227, COSName.getPDFName( "Scaron" ) );
+ addCharacterEncoding( 0124, COSName.getPDFName( "T" ) );
+ addCharacterEncoding( 0336, COSName.getPDFName( "Thorn" ) );
+ addCharacterEncoding( 0125, COSName.getPDFName( "U" ) );
+ addCharacterEncoding( 0332, COSName.getPDFName( "Uacute" ) );
+ addCharacterEncoding( 0333, COSName.getPDFName( "Ucircumflex" ) );
+ addCharacterEncoding( 0334, COSName.getPDFName( "Udieresis" ) );
+ addCharacterEncoding( 0331, COSName.getPDFName( "Ugrave" ) );
+ addCharacterEncoding( 0126, COSName.getPDFName( "V" ) );
+ addCharacterEncoding( 0127, COSName.getPDFName( "W" ) );
+ addCharacterEncoding( 0130, COSName.getPDFName( "X" ) );
+ addCharacterEncoding( 0131, COSName.getPDFName( "Y" ) );
+ addCharacterEncoding( 0335, COSName.getPDFName( "Yacute" ) );
+ addCharacterEncoding( 0230, COSName.getPDFName( "Ydieresis" ) );
+ addCharacterEncoding( 0132, COSName.getPDFName( "Z" ) );
+ addCharacterEncoding( 0231, COSName.getPDFName( "Zcaron" ) );
+ addCharacterEncoding( 0141, COSName.getPDFName( "a" ) );
+ addCharacterEncoding( 0341, COSName.getPDFName( "aacute" ) );
+ addCharacterEncoding( 0342, COSName.getPDFName( "acircumflex" ) );
+ addCharacterEncoding( 0264, COSName.getPDFName( "acute" ) );
+ addCharacterEncoding( 0344, COSName.getPDFName( "adieresis" ) );
+ addCharacterEncoding( 0346, COSName.getPDFName( "ae" ) );
+ addCharacterEncoding( 0340, COSName.getPDFName( "agrave" ) );
+ addCharacterEncoding( 046, COSName.getPDFName( "ampersand" ) );
+ addCharacterEncoding( 0345, COSName.getPDFName( "aring" ) );
+ addCharacterEncoding( 0136, COSName.getPDFName( "asciicircum" ) );
+ addCharacterEncoding( 0176, COSName.getPDFName( "asciitilde" ) );
+ addCharacterEncoding( 052, COSName.getPDFName( "asterisk" ) );
+ addCharacterEncoding( 0100, COSName.getPDFName( "at" ) );
+ addCharacterEncoding( 0343, COSName.getPDFName( "atilde" ) );
+ addCharacterEncoding( 0142, COSName.getPDFName( "b" ) );
+ addCharacterEncoding( 0134, COSName.getPDFName( "backslash" ) );
+ addCharacterEncoding( 0174, COSName.getPDFName( "bar" ) );
+ addCharacterEncoding( 0173, COSName.getPDFName( "braceleft" ) );
+ addCharacterEncoding( 0175, COSName.getPDFName( "braceright" ) );
+ addCharacterEncoding( 0133, COSName.getPDFName( "bracketleft" ) );
+ addCharacterEncoding( 0135, COSName.getPDFName( "bracketright" ) );
+ addCharacterEncoding( 030, COSName.getPDFName( "breve" ) );
+ addCharacterEncoding( 0246, COSName.getPDFName( "brokenbar" ) );
+ addCharacterEncoding( 0200, COSName.getPDFName( "bullet" ) );
+ addCharacterEncoding( 0143, COSName.getPDFName( "c" ) );
+ addCharacterEncoding( 031, COSName.getPDFName( "caron" ) );
+ addCharacterEncoding( 0347, COSName.getPDFName( "ccedilla" ) );
+ addCharacterEncoding( 0270, COSName.getPDFName( "cedilla" ) );
+ addCharacterEncoding( 0242, COSName.getPDFName( "cent" ) );
+ addCharacterEncoding( 032, COSName.getPDFName( "circumflex" ) );
+ addCharacterEncoding( 072, COSName.getPDFName( "colon" ) );
+ addCharacterEncoding( 054, COSName.getPDFName( "comma" ) );
+ addCharacterEncoding( 0251, COSName.getPDFName( "copyright" ) );
+ addCharacterEncoding( 0244, COSName.getPDFName( "currency1" ) );
+ addCharacterEncoding( 0144, COSName.getPDFName( "d" ) );
+ addCharacterEncoding( 0201, COSName.getPDFName( "dagger" ) );
+ addCharacterEncoding( 0202, COSName.getPDFName( "daggerdbl" ) );
+ addCharacterEncoding( 0260, COSName.getPDFName( "degree" ) );
+ addCharacterEncoding( 0250, COSName.getPDFName( "dieresis" ) );
+ addCharacterEncoding( 0367, COSName.getPDFName( "divide" ) );
+ addCharacterEncoding( 044, COSName.getPDFName( "dollar" ) );
+ addCharacterEncoding( 033, COSName.getPDFName( "dotaccent" ) );
+ addCharacterEncoding( 0232, COSName.getPDFName( "dotlessi" ) );
+ addCharacterEncoding( 0145, COSName.getPDFName( "e" ) );
+ addCharacterEncoding( 0351, COSName.getPDFName( "eacute" ) );
+ addCharacterEncoding( 0352, COSName.getPDFName( "ecircumflex" ) );
+ addCharacterEncoding( 0353, COSName.getPDFName( "edieresis" ) );
+ addCharacterEncoding( 0350, COSName.getPDFName( "egrave" ) );
+ addCharacterEncoding( 070, COSName.getPDFName( "eight" ) );
+ addCharacterEncoding( 0203, COSName.getPDFName( "ellipsis" ) );
+ addCharacterEncoding( 0204, COSName.getPDFName( "emdash" ) );
+ addCharacterEncoding( 0205, COSName.getPDFName( "endash" ) );
+ addCharacterEncoding( 075, COSName.getPDFName( "equal" ) );
+ addCharacterEncoding( 0360, COSName.getPDFName( "eth" ) );
+ addCharacterEncoding( 041, COSName.getPDFName( "exclam" ) );
+ addCharacterEncoding( 0241, COSName.getPDFName( "exclamdown" ) );
+ addCharacterEncoding( 0146, COSName.getPDFName( "f" ) );
+ addCharacterEncoding( 0223, COSName.getPDFName( "fi" ) );
+ addCharacterEncoding( 065, COSName.getPDFName( "five" ) );
+ addCharacterEncoding( 0224, COSName.getPDFName( "fl" ) );
+ addCharacterEncoding( 0206, COSName.getPDFName( "florin" ) );
+ addCharacterEncoding( 064, COSName.getPDFName( "four" ) );
+ addCharacterEncoding( 0207, COSName.getPDFName( "fraction" ) );
+ addCharacterEncoding( 0147, COSName.getPDFName( "g" ) );
+ addCharacterEncoding( 0337, COSName.getPDFName( "germandbls" ) );
+ addCharacterEncoding( 0140, COSName.getPDFName( "grave" ) );
+ addCharacterEncoding( 076, COSName.getPDFName( "greater" ) );
+ addCharacterEncoding( 0253, COSName.getPDFName( "guillemotleft" ) );
+ addCharacterEncoding( 0273, COSName.getPDFName( "guillemotright" ) );
+ addCharacterEncoding( 0210, COSName.getPDFName( "guilsinglleft" ) );
+ addCharacterEncoding( 0211, COSName.getPDFName( "guilsinglright" ) );
+ addCharacterEncoding( 0150, COSName.getPDFName( "h" ) );
+ addCharacterEncoding( 034, COSName.getPDFName( "hungarumlaut" ) );
+ addCharacterEncoding( 055, COSName.getPDFName( "hyphen" ) );
+ addCharacterEncoding( 0151, COSName.getPDFName( "i" ) );
+ addCharacterEncoding( 0355, COSName.getPDFName( "iacute" ) );
+ addCharacterEncoding( 0356, COSName.getPDFName( "icircumflex" ) );
+ addCharacterEncoding( 0357, COSName.getPDFName( "idieresis" ) );
+ addCharacterEncoding( 0354, COSName.getPDFName( "igrave" ) );
+ addCharacterEncoding( 0152, COSName.getPDFName( "j" ) );
+ addCharacterEncoding( 0153, COSName.getPDFName( "k" ) );
+ addCharacterEncoding( 0154, COSName.getPDFName( "l" ) );
+ addCharacterEncoding( 074, COSName.getPDFName( "less" ) );
+ addCharacterEncoding( 0254, COSName.getPDFName( "logicalnot" ) );
+ addCharacterEncoding( 0233, COSName.getPDFName( "lslash" ) );
+ addCharacterEncoding( 0155, COSName.getPDFName( "m" ) );
+ addCharacterEncoding( 0257, COSName.getPDFName( "macron" ) );
+ addCharacterEncoding( 0212, COSName.getPDFName( "minus" ) );
+ addCharacterEncoding( 0265, COSName.getPDFName( "mu" ) );
+ addCharacterEncoding( 0327, COSName.getPDFName( "multiply" ) );
+ addCharacterEncoding( 0156, COSName.getPDFName( "n" ) );
+ addCharacterEncoding( 071, COSName.getPDFName( "nine" ) );
+ addCharacterEncoding( 0361, COSName.getPDFName( "ntilde" ) );
+ addCharacterEncoding( 043, COSName.getPDFName( "numbersign" ) );
+ addCharacterEncoding( 0157, COSName.getPDFName( "o" ) );
+ addCharacterEncoding( 0363, COSName.getPDFName( "oacute" ) );
+ addCharacterEncoding( 0364, COSName.getPDFName( "ocircumflex" ) );
+ addCharacterEncoding( 0366, COSName.getPDFName( "odieresis" ) );
+ addCharacterEncoding( 0234, COSName.getPDFName( "oe" ) );
+ addCharacterEncoding( 035, COSName.getPDFName( "ogonek" ) );
+ addCharacterEncoding( 0362, COSName.getPDFName( "ograve" ) );
+ addCharacterEncoding( 061, COSName.getPDFName( "one" ) );
+ addCharacterEncoding( 0275, COSName.getPDFName( "onehalf" ) );
+ addCharacterEncoding( 0274, COSName.getPDFName( "onequarter" ) );
+ addCharacterEncoding( 0271, COSName.getPDFName( "onesuperior" ) );
+ addCharacterEncoding( 0252, COSName.getPDFName( "ordfeminine" ) );
+ addCharacterEncoding( 0272, COSName.getPDFName( "ordmasculine" ) );
+ addCharacterEncoding( 0370, COSName.getPDFName( "oslash" ) );
+ addCharacterEncoding( 0365, COSName.getPDFName( "otilde" ) );
+ addCharacterEncoding( 0160, COSName.getPDFName( "p" ) );
+ addCharacterEncoding( 0266, COSName.getPDFName( "paragraph" ) );
+ addCharacterEncoding( 050, COSName.getPDFName( "parenleft" ) );
+ addCharacterEncoding( 051, COSName.getPDFName( "parenright" ) );
+ addCharacterEncoding( 045, COSName.getPDFName( "percent" ) );
+ addCharacterEncoding( 056, COSName.getPDFName( "period" ) );
+ addCharacterEncoding( 0267, COSName.getPDFName( "periodcentered" ) );
+ addCharacterEncoding( 0213, COSName.getPDFName( "perthousand" ) );
+ addCharacterEncoding( 053, COSName.getPDFName( "plus" ) );
+ addCharacterEncoding( 0261, COSName.getPDFName( "plusminus" ) );
+ addCharacterEncoding( 0161, COSName.getPDFName( "q" ) );
+ addCharacterEncoding( 077, COSName.getPDFName( "question" ) );
+ addCharacterEncoding( 0277, COSName.getPDFName( "questiondown" ) );
+ addCharacterEncoding( 042, COSName.getPDFName( "quotedbl" ) );
+ addCharacterEncoding( 0214, COSName.getPDFName( "quotedblbase" ) );
+ addCharacterEncoding( 0215, COSName.getPDFName( "quotedblleft" ) );
+ addCharacterEncoding( 0216, COSName.getPDFName( "quotedblright" ) );
+ addCharacterEncoding( 0217, COSName.getPDFName( "quoteleft" ) );
+ addCharacterEncoding( 0220, COSName.getPDFName( "quoteright" ) );
+ addCharacterEncoding( 0221, COSName.getPDFName( "quotesinglbase" ) );
+ addCharacterEncoding( 047, COSName.getPDFName( "quotesingle" ) );
+ addCharacterEncoding( 0162, COSName.getPDFName( "r" ) );
+ addCharacterEncoding( 0256, COSName.getPDFName( "registered" ) );
+ addCharacterEncoding( 036, COSName.getPDFName( "ring" ) );
+ addCharacterEncoding( 0163, COSName.getPDFName( "s" ) );
+ addCharacterEncoding( 0235, COSName.getPDFName( "scaron" ) );
+ addCharacterEncoding( 0247, COSName.getPDFName( "section" ) );
+ addCharacterEncoding( 073, COSName.getPDFName( "semicolon" ) );
+ addCharacterEncoding( 067, COSName.getPDFName( "seven" ) );
+ addCharacterEncoding( 066, COSName.getPDFName( "six" ) );
+ addCharacterEncoding( 057, COSName.getPDFName( "slash" ) );
+ addCharacterEncoding( 040, COSName.getPDFName( "space" ) );
+ addCharacterEncoding( 0243, COSName.getPDFName( "sterling" ) );
+ addCharacterEncoding( 0164, COSName.getPDFName( "t" ) );
+ addCharacterEncoding( 0376, COSName.getPDFName( "thorn" ) );
+ addCharacterEncoding( 063, COSName.getPDFName( "three" ) );
+ addCharacterEncoding( 0276, COSName.getPDFName( "threequarters" ) );
+ addCharacterEncoding( 0263, COSName.getPDFName( "threesuperior" ) );
+ addCharacterEncoding( 037, COSName.getPDFName( "tilde" ) );
+ addCharacterEncoding( 0222, COSName.getPDFName( "trademark" ) );
+ addCharacterEncoding( 062, COSName.getPDFName( "two" ) );
+ addCharacterEncoding( 0262, COSName.getPDFName( "twosuperior" ) );
+ addCharacterEncoding( 0165, COSName.getPDFName( "u" ) );
+ addCharacterEncoding( 0372, COSName.getPDFName( "uacute" ) );
+ addCharacterEncoding( 0373, COSName.getPDFName( "ucircumflex" ) );
+ addCharacterEncoding( 0374, COSName.getPDFName( "udieresis" ) );
+ addCharacterEncoding( 0371, COSName.getPDFName( "ugrave" ) );
+ addCharacterEncoding( 0137, COSName.getPDFName( "underscore" ) );
+ addCharacterEncoding( 0166, COSName.getPDFName( "v" ) );
+ addCharacterEncoding( 0167, COSName.getPDFName( "w" ) );
+ addCharacterEncoding( 0170, COSName.getPDFName( "x" ) );
+ addCharacterEncoding( 0171, COSName.getPDFName( "y" ) );
+ addCharacterEncoding( 0375, COSName.getPDFName( "yacute" ) );
+ addCharacterEncoding( 0377, COSName.getPDFName( "ydieresis" ) );
+ addCharacterEncoding( 0245, COSName.getPDFName( "yen" ) );
+ addCharacterEncoding( 0172, COSName.getPDFName( "z" ) );
+ addCharacterEncoding( 0236, COSName.getPDFName( "zcaron" ) );
+ addCharacterEncoding( 060, COSName.getPDFName( "zero" ) );
+ }
+
+ /**
+ * Convert this standard java object to a COS object.
+ *
+ * @return The cos object that matches this Java object.
+ */
+ public COSBase getCOSObject()
+ {
+ return COSName.PDF_DOC_ENCODING;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/encoding/StandardEncoding.java b/src/main/java/org/pdfbox/encoding/StandardEncoding.java
new file mode 100644
index 0000000..229adb4
--- /dev/null
+++ b/src/main/java/org/pdfbox/encoding/StandardEncoding.java
@@ -0,0 +1,209 @@
+/**
+ * Copyright (c) 2003-2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.encoding;
+
+import org.pdfbox.cos.COSBase;
+import org.pdfbox.cos.COSName;
+
+/**
+ * This is an interface to a text encoder.
+ *
+ * @author Ben Litchfield
+ * @version $Revision: 1.9 $
+ */
+public class StandardEncoding extends Encoding
+{
+ /**
+ * Constructor.
+ */
+ public StandardEncoding()
+ {
+ addCharacterEncoding( 0101, COSName.getPDFName( "A" ) );
+ addCharacterEncoding( 0341, COSName.getPDFName( "AE" ) );
+ addCharacterEncoding( 0102, COSName.getPDFName( "B" ) );
+ addCharacterEncoding( 0103, COSName.getPDFName( "C" ) );
+ addCharacterEncoding( 0104, COSName.getPDFName( "D" ) );
+ addCharacterEncoding( 0105, COSName.getPDFName( "E" ) );
+ addCharacterEncoding( 0106, COSName.getPDFName( "F" ) );
+ addCharacterEncoding( 0107, COSName.getPDFName( "G" ) );
+ addCharacterEncoding( 0110, COSName.getPDFName( "H" ) );
+ addCharacterEncoding( 0111, COSName.getPDFName( "I" ) );
+ addCharacterEncoding( 0112, COSName.getPDFName( "J" ) );
+ addCharacterEncoding( 0113, COSName.getPDFName( "K" ) );
+ addCharacterEncoding( 0114, COSName.getPDFName( "L" ) );
+ addCharacterEncoding( 0350, COSName.getPDFName( "Lslash" ) );
+ addCharacterEncoding( 0115, COSName.getPDFName( "M" ) );
+ addCharacterEncoding( 0116, COSName.getPDFName( "N" ) );
+ addCharacterEncoding( 0117, COSName.getPDFName( "O" ) );
+ addCharacterEncoding( 0352, COSName.getPDFName( "OE" ) );
+ addCharacterEncoding( 0351, COSName.getPDFName( "Oslash" ) );
+ addCharacterEncoding( 0120, COSName.getPDFName( "P" ) );
+ addCharacterEncoding( 0121, COSName.getPDFName( "Q" ) );
+ addCharacterEncoding( 0122, COSName.getPDFName( "R" ) );
+ addCharacterEncoding( 0123, COSName.getPDFName( "S" ) );
+ addCharacterEncoding( 0124, COSName.getPDFName( "T" ) );
+ addCharacterEncoding( 0125, COSName.getPDFName( "U" ) );
+ addCharacterEncoding( 0126, COSName.getPDFName( "V" ) );
+ addCharacterEncoding( 0127, COSName.getPDFName( "W" ) );
+ addCharacterEncoding( 0130, COSName.getPDFName( "X" ) );
+ addCharacterEncoding( 0131, COSName.getPDFName( "Y" ) );
+ addCharacterEncoding( 0132, COSName.getPDFName( "Z" ) );
+ addCharacterEncoding( 0141, COSName.getPDFName( "a" ) );
+ addCharacterEncoding( 0302, COSName.getPDFName( "acute" ) );
+ addCharacterEncoding( 0361, COSName.getPDFName( "ae" ) );
+ addCharacterEncoding( 0046, COSName.getPDFName( "ampersand" ) );
+ addCharacterEncoding( 0136, COSName.getPDFName( "asciicircum" ) );
+ addCharacterEncoding( 0176, COSName.getPDFName( "asciitilde" ) );
+ addCharacterEncoding( 0052, COSName.getPDFName( "asterisk" ) );
+ addCharacterEncoding( 0100, COSName.getPDFName( "at" ) );
+ addCharacterEncoding( 0142, COSName.getPDFName( "b" ) );
+ addCharacterEncoding( 0134, COSName.getPDFName( "backslash" ) );
+ addCharacterEncoding( 0174, COSName.getPDFName( "bar" ) );
+ addCharacterEncoding( 0173, COSName.getPDFName( "braceleft" ) );
+ addCharacterEncoding( 0175, COSName.getPDFName( "braceright" ) );
+ addCharacterEncoding( 0133, COSName.getPDFName( "bracketleft" ) );
+ addCharacterEncoding( 0135, COSName.getPDFName( "bracketright" ) );
+ addCharacterEncoding( 0306, COSName.getPDFName( "breve" ) );
+ addCharacterEncoding( 0267, COSName.getPDFName( "bullet" ) );
+ addCharacterEncoding( 0143, COSName.getPDFName( "c" ) );
+ addCharacterEncoding( 0317, COSName.getPDFName( "caron" ) );
+ addCharacterEncoding( 0313, COSName.getPDFName( "cedilla" ) );
+ addCharacterEncoding( 0242, COSName.getPDFName( "cent" ) );
+ addCharacterEncoding( 0303, COSName.getPDFName( "circumflex" ) );
+ addCharacterEncoding( 0072, COSName.getPDFName( "colon" ) );
+ addCharacterEncoding( 0054, COSName.getPDFName( "comma" ) );
+ addCharacterEncoding( 0250, COSName.getPDFName( "currency1" ) );
+ addCharacterEncoding( 0144, COSName.getPDFName( "d" ) );
+ addCharacterEncoding( 0262, COSName.getPDFName( "dagger" ) );
+ addCharacterEncoding( 0263, COSName.getPDFName( "daggerdbl" ) );
+ addCharacterEncoding( 0310, COSName.getPDFName( "dieresis" ) );
+ addCharacterEncoding( 0044, COSName.getPDFName( "dollar" ) );
+ addCharacterEncoding( 0307, COSName.getPDFName( "dotaccent" ) );
+ addCharacterEncoding( 0365, COSName.getPDFName( "dotlessi" ) );
+ addCharacterEncoding( 0145, COSName.getPDFName( "e" ) );
+ addCharacterEncoding( 0070, COSName.getPDFName( "eight" ) );
+ addCharacterEncoding( 0274, COSName.getPDFName( "ellipsis" ) );
+ addCharacterEncoding( 0320, COSName.getPDFName( "emdash" ) );
+ addCharacterEncoding( 0261, COSName.getPDFName( "endash" ) );
+ addCharacterEncoding( 0075, COSName.getPDFName( "equal" ) );
+ addCharacterEncoding( 0041, COSName.getPDFName( "exclam" ) );
+ addCharacterEncoding( 0241, COSName.getPDFName( "exclamdown" ) );
+ addCharacterEncoding( 0146, COSName.getPDFName( "f" ) );
+ addCharacterEncoding( 0256, COSName.getPDFName( "fi" ) );
+ addCharacterEncoding( 0065, COSName.getPDFName( "five" ) );
+ addCharacterEncoding( 0257, COSName.getPDFName( "fl" ) );
+ addCharacterEncoding( 0246, COSName.getPDFName( "florin" ) );
+ addCharacterEncoding( 0064, COSName.getPDFName( "four" ) );
+ addCharacterEncoding( 0244, COSName.getPDFName( "fraction" ) );
+ addCharacterEncoding( 0147, COSName.getPDFName( "g" ) );
+ addCharacterEncoding( 0373, COSName.getPDFName( "germandbls" ) );
+ addCharacterEncoding( 0301, COSName.getPDFName( "grave" ) );
+ addCharacterEncoding( 0076, COSName.getPDFName( "greater" ) );
+ addCharacterEncoding( 0253, COSName.getPDFName( "guillemotleft" ) );
+ addCharacterEncoding( 0273, COSName.getPDFName( "guillemotright" ) );
+ addCharacterEncoding( 0254, COSName.getPDFName( "guilsinglleft" ) );
+ addCharacterEncoding( 0255, COSName.getPDFName( "guilsinglright" ) );
+ addCharacterEncoding( 0150, COSName.getPDFName( "h" ) );
+ addCharacterEncoding( 0315, COSName.getPDFName( "hungarumlaut" ) );
+ addCharacterEncoding( 0055, COSName.getPDFName( "hyphen" ) );
+ addCharacterEncoding( 0151, COSName.getPDFName( "i" ) );
+ addCharacterEncoding( 0152, COSName.getPDFName( "j" ) );
+ addCharacterEncoding( 0153, COSName.getPDFName( "k" ) );
+ addCharacterEncoding( 0154, COSName.getPDFName( "l" ) );
+ addCharacterEncoding( 0074, COSName.getPDFName( "less" ) );
+ addCharacterEncoding( 0370, COSName.getPDFName( "lslash" ) );
+ addCharacterEncoding( 0155, COSName.getPDFName( "m" ) );
+ addCharacterEncoding( 0305, COSName.getPDFName( "macron" ) );
+ addCharacterEncoding( 0156, COSName.getPDFName( "n" ) );
+ addCharacterEncoding( 0071, COSName.getPDFName( "nine" ) );
+ addCharacterEncoding( 0043, COSName.getPDFName( "numbersign" ) );
+ addCharacterEncoding( 0157, COSName.getPDFName( "o" ) );
+ addCharacterEncoding( 0372, COSName.getPDFName( "oe" ) );
+ addCharacterEncoding( 0316, COSName.getPDFName( "ogonek" ) );
+ addCharacterEncoding( 0061, COSName.getPDFName( "one" ) );
+ addCharacterEncoding( 0343, COSName.getPDFName( "ordfeminine" ) );
+ addCharacterEncoding( 0353, COSName.getPDFName( "ordmasculine" ) );
+ addCharacterEncoding( 0371, COSName.getPDFName( "oslash" ) );
+ addCharacterEncoding( 0160, COSName.getPDFName( "p" ) );
+ addCharacterEncoding( 0266, COSName.getPDFName( "paragraph" ) );
+ addCharacterEncoding( 0050, COSName.getPDFName( "parenleft" ) );
+ addCharacterEncoding( 0051, COSName.getPDFName( "parenright" ) );
+ addCharacterEncoding( 0045, COSName.getPDFName( "percent" ) );
+ addCharacterEncoding( 0056, COSName.getPDFName( "period" ) );
+ addCharacterEncoding( 0264, COSName.getPDFName( "periodcentered" ) );
+ addCharacterEncoding( 0275, COSName.getPDFName( "perthousand" ) );
+ addCharacterEncoding( 0053, COSName.getPDFName( "plus" ) );
+ addCharacterEncoding( 0161, COSName.getPDFName( "q" ) );
+ addCharacterEncoding( 0077, COSName.getPDFName( "question" ) );
+ addCharacterEncoding( 0277, COSName.getPDFName( "questiondown" ) );
+ addCharacterEncoding( 0042, COSName.getPDFName( "quotedbl" ) );
+ addCharacterEncoding( 0271, COSName.getPDFName( "quotedblbase" ) );
+ addCharacterEncoding( 0252, COSName.getPDFName( "quotedblleft" ) );
+ addCharacterEncoding( 0272, COSName.getPDFName( "quotedblright" ) );
+ addCharacterEncoding( 0140, COSName.getPDFName( "quoteleft" ) );
+ addCharacterEncoding( 0047, COSName.getPDFName( "quoteright" ) );
+ addCharacterEncoding( 0270, COSName.getPDFName( "quotesinglbase" ) );
+ addCharacterEncoding( 0251, COSName.getPDFName( "quotesingle" ) );
+ addCharacterEncoding( 0162, COSName.getPDFName( "r" ) );
+ addCharacterEncoding( 0312, COSName.getPDFName( "ring" ) );
+ addCharacterEncoding( 0163, COSName.getPDFName( "s" ) );
+ addCharacterEncoding( 0247, COSName.getPDFName( "section" ) );
+ addCharacterEncoding( 0073, COSName.getPDFName( "semicolon" ) );
+ addCharacterEncoding( 0067, COSName.getPDFName( "seven" ) );
+ addCharacterEncoding( 0066, COSName.getPDFName( "six" ) );
+ addCharacterEncoding( 0057, COSName.getPDFName( "slash" ) );
+ addCharacterEncoding( 0040, COSName.getPDFName( "space" ) );
+ addCharacterEncoding( 0243, COSName.getPDFName( "sterling" ) );
+ addCharacterEncoding( 0164, COSName.getPDFName( "t" ) );
+ addCharacterEncoding( 0063, COSName.getPDFName( "three" ) );
+ addCharacterEncoding( 0304, COSName.getPDFName( "tilde" ) );
+ addCharacterEncoding( 0062, COSName.getPDFName( "two" ) );
+ addCharacterEncoding( 0165, COSName.getPDFName( "u" ) );
+ addCharacterEncoding( 0137, COSName.getPDFName( "underscore" ) );
+ addCharacterEncoding( 0166, COSName.getPDFName( "v" ) );
+ addCharacterEncoding( 0167, COSName.getPDFName( "w" ) );
+ addCharacterEncoding( 0170, COSName.getPDFName( "x" ) );
+ addCharacterEncoding( 0171, COSName.getPDFName( "y" ) );
+ addCharacterEncoding( 0245, COSName.getPDFName( "yen" ) );
+ addCharacterEncoding( 0172, COSName.getPDFName( "z" ) );
+ addCharacterEncoding( 0060, COSName.getPDFName( "zero" ) );
+ }
+
+ /**
+ * Convert this standard java object to a COS object.
+ *
+ * @return The cos object that matches this Java object.
+ */
+ public COSBase getCOSObject()
+ {
+ return COSName.STANDARD_ENCODING;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/encoding/WinAnsiEncoding.java b/src/main/java/org/pdfbox/encoding/WinAnsiEncoding.java
new file mode 100644
index 0000000..dcbe872
--- /dev/null
+++ b/src/main/java/org/pdfbox/encoding/WinAnsiEncoding.java
@@ -0,0 +1,281 @@
+/**
+ * Copyright (c) 2003, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.encoding;
+
+import org.pdfbox.cos.COSBase;
+import org.pdfbox.cos.COSName;
+
+/**
+ * This the win ansi encoding.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.9 $
+ */
+public class WinAnsiEncoding extends Encoding
+{
+ /**
+ * Constructor.
+ */
+ public WinAnsiEncoding()
+ {
+ addCharacterEncoding( 0101, COSName.getPDFName( "A" ) );
+ addCharacterEncoding( 0306, COSName.getPDFName( "AE" ) );
+ addCharacterEncoding( 0301, COSName.getPDFName( "Aacute" ) );
+ addCharacterEncoding( 0302, COSName.getPDFName( "Acircumflex" ) );
+ addCharacterEncoding( 0304, COSName.getPDFName( "Adieresis" ) );
+ addCharacterEncoding( 0300, COSName.getPDFName( "Agrave" ) );
+ addCharacterEncoding( 0305, COSName.getPDFName( "Aring" ) );
+ addCharacterEncoding( 0303, COSName.getPDFName( "Atilde" ) );
+ addCharacterEncoding( 0102, COSName.getPDFName( "B" ) );
+ addCharacterEncoding( 0103, COSName.getPDFName( "C" ) );
+ addCharacterEncoding( 0307, COSName.getPDFName( "Ccedilla" ) );
+ addCharacterEncoding( 0104, COSName.getPDFName( "D" ) );
+ addCharacterEncoding( 0105, COSName.getPDFName( "E" ) );
+ addCharacterEncoding( 0311, COSName.getPDFName( "Eacute" ) );
+ addCharacterEncoding( 0312, COSName.getPDFName( "Ecircumflex" ) );
+ addCharacterEncoding( 0313, COSName.getPDFName( "Edieresis" ) );
+ addCharacterEncoding( 0310, COSName.getPDFName( "Egrave" ) );
+ addCharacterEncoding( 0320, COSName.getPDFName( "Eth" ) );
+ addCharacterEncoding( 0200, COSName.getPDFName( "Euro" ) );
+ addCharacterEncoding( 0106, COSName.getPDFName( "F" ) );
+ addCharacterEncoding( 0107, COSName.getPDFName( "G" ) );
+ addCharacterEncoding( 0110, COSName.getPDFName( "H" ) );
+ addCharacterEncoding( 0111, COSName.getPDFName( "I" ) );
+ addCharacterEncoding( 0315, COSName.getPDFName( "Iacute" ) );
+ addCharacterEncoding( 0316, COSName.getPDFName( "Icircumflex" ) );
+ addCharacterEncoding( 0317, COSName.getPDFName( "Idieresis" ) );
+ addCharacterEncoding( 0314, COSName.getPDFName( "Igrave" ) );
+ addCharacterEncoding( 0112, COSName.getPDFName( "J" ) );
+ addCharacterEncoding( 0113, COSName.getPDFName( "K" ) );
+ addCharacterEncoding( 0114, COSName.getPDFName( "L" ) );
+ addCharacterEncoding( 0115, COSName.getPDFName( "M" ) );
+ addCharacterEncoding( 0116, COSName.getPDFName( "N" ) );
+ addCharacterEncoding( 0321, COSName.getPDFName( "Ntilde" ) );
+ addCharacterEncoding( 0117, COSName.getPDFName( "O" ) );
+ addCharacterEncoding( 0214, COSName.getPDFName( "OE" ) );
+ addCharacterEncoding( 0323, COSName.getPDFName( "Oacute" ) );
+ addCharacterEncoding( 0324, COSName.getPDFName( "Ocircumflex" ) );
+ addCharacterEncoding( 0326, COSName.getPDFName( "Odieresis" ) );
+ addCharacterEncoding( 0322, COSName.getPDFName( "Ograve" ) );
+ addCharacterEncoding( 0330, COSName.getPDFName( "Oslash" ) );
+ addCharacterEncoding( 0325, COSName.getPDFName( "Otilde" ) );
+ addCharacterEncoding( 0120, COSName.getPDFName( "P" ) );
+ addCharacterEncoding( 0121, COSName.getPDFName( "Q" ) );
+ addCharacterEncoding( 0122, COSName.getPDFName( "R" ) );
+ addCharacterEncoding( 0123, COSName.getPDFName( "S" ) );
+ addCharacterEncoding( 0212, COSName.getPDFName( "Scaron" ) );
+ addCharacterEncoding( 0124, COSName.getPDFName( "T" ) );
+ addCharacterEncoding( 0336, COSName.getPDFName( "Thorn" ) );
+ addCharacterEncoding( 0125, COSName.getPDFName( "U" ) );
+ addCharacterEncoding( 0332, COSName.getPDFName( "Uacute" ) );
+ addCharacterEncoding( 0333, COSName.getPDFName( "Ucircumflex" ) );
+ addCharacterEncoding( 0334, COSName.getPDFName( "Udieresis" ) );
+ addCharacterEncoding( 0331, COSName.getPDFName( "Ugrave" ) );
+ addCharacterEncoding( 0126, COSName.getPDFName( "V" ) );
+ addCharacterEncoding( 0127, COSName.getPDFName( "W" ) );
+ addCharacterEncoding( 0130, COSName.getPDFName( "X" ) );
+ addCharacterEncoding( 0131, COSName.getPDFName( "Y" ) );
+ addCharacterEncoding( 0335, COSName.getPDFName( "Yacute" ) );
+ addCharacterEncoding( 0237, COSName.getPDFName( "Ydieresis" ) );
+ addCharacterEncoding( 0132, COSName.getPDFName( "Z" ) );
+ addCharacterEncoding( 0216, COSName.getPDFName( "Zcaron" ) );
+ addCharacterEncoding( 0141, COSName.getPDFName( "a" ) );
+ addCharacterEncoding( 0341, COSName.getPDFName( "aacute" ) );
+ addCharacterEncoding( 0342, COSName.getPDFName( "acircumflex" ) );
+ addCharacterEncoding( 0264, COSName.getPDFName( "acute" ) );
+ addCharacterEncoding( 0344, COSName.getPDFName( "adieresis" ) );
+ addCharacterEncoding( 0346, COSName.getPDFName( "ae" ) );
+ addCharacterEncoding( 0340, COSName.getPDFName( "agrave" ) );
+ addCharacterEncoding( 046, COSName.getPDFName( "ampersand" ) );
+ addCharacterEncoding( 0345, COSName.getPDFName( "aring" ) );
+ addCharacterEncoding( 0136, COSName.getPDFName( "asciicircum" ) );
+ addCharacterEncoding( 0176, COSName.getPDFName( "asciitilde" ) );
+ addCharacterEncoding( 052, COSName.getPDFName( "asterisk" ) );
+ addCharacterEncoding( 0100, COSName.getPDFName( "at" ) );
+ addCharacterEncoding( 0343, COSName.getPDFName( "atilde" ) );
+ addCharacterEncoding( 0142, COSName.getPDFName( "b" ) );
+ addCharacterEncoding( 0134, COSName.getPDFName( "backslash" ) );
+ addCharacterEncoding( 0174, COSName.getPDFName( "bar" ) );
+ addCharacterEncoding( 0173, COSName.getPDFName( "braceleft" ) );
+ addCharacterEncoding( 0175, COSName.getPDFName( "braceright" ) );
+ addCharacterEncoding( 0133, COSName.getPDFName( "bracketleft" ) );
+ addCharacterEncoding( 0135, COSName.getPDFName( "bracketright" ) );
+ addCharacterEncoding( 0246, COSName.getPDFName( "brokenbar" ) );
+ addCharacterEncoding( 0225, COSName.getPDFName( "bullet" ) );
+ addCharacterEncoding( 0143, COSName.getPDFName( "c" ) );
+ addCharacterEncoding( 0347, COSName.getPDFName( "ccedilla" ) );
+ addCharacterEncoding( 0270, COSName.getPDFName( "cedilla" ) );
+ addCharacterEncoding( 0242, COSName.getPDFName( "cent" ) );
+ addCharacterEncoding( 0210, COSName.getPDFName( "circumflex" ) );
+ addCharacterEncoding( 072, COSName.getPDFName( "colon" ) );
+ addCharacterEncoding( 054, COSName.getPDFName( "comma" ) );
+ addCharacterEncoding( 0251, COSName.getPDFName( "copyright" ) );
+
+ /**
+ * Added because cweb.pdf uses circlecopyrt
+ */
+ addCharacterEncoding( 0251, COSName.getPDFName( "circlecopyrt" ) );
+ addCharacterEncoding( 0244, COSName.getPDFName( "currency" ) );
+ addCharacterEncoding( 0144, COSName.getPDFName( "d" ) );
+ addCharacterEncoding( 0206, COSName.getPDFName( "dagger" ) );
+ addCharacterEncoding( 0207, COSName.getPDFName( "daggerdbl" ) );
+ addCharacterEncoding( 0260, COSName.getPDFName( "degree" ) );
+ addCharacterEncoding( 0250, COSName.getPDFName( "dieresis" ) );
+ addCharacterEncoding( 0367, COSName.getPDFName( "divide" ) );
+ addCharacterEncoding( 044, COSName.getPDFName( "dollar" ) );
+ addCharacterEncoding( 0145, COSName.getPDFName( "e" ) );
+ addCharacterEncoding( 0351, COSName.getPDFName( "eacute" ) );
+ addCharacterEncoding( 0352, COSName.getPDFName( "ecircumflex" ) );
+ addCharacterEncoding( 0353, COSName.getPDFName( "edieresis" ) );
+ addCharacterEncoding( 0350, COSName.getPDFName( "egrave" ) );
+ addCharacterEncoding( 070, COSName.getPDFName( "eight" ) );
+ addCharacterEncoding( 0205, COSName.getPDFName( "ellipsis" ) );
+ addCharacterEncoding( 0227, COSName.getPDFName( "emdash" ) );
+ addCharacterEncoding( 0226, COSName.getPDFName( "endash" ) );
+ addCharacterEncoding( 075, COSName.getPDFName( "equal" ) );
+ addCharacterEncoding( 0360, COSName.getPDFName( "eth" ) );
+ addCharacterEncoding( 041, COSName.getPDFName( "exclam" ) );
+ addCharacterEncoding( 0241, COSName.getPDFName( "exclamdown" ) );
+ addCharacterEncoding( 0146, COSName.getPDFName( "f" ) );
+ addCharacterEncoding( 065, COSName.getPDFName( "five" ) );
+ addCharacterEncoding( 0203, COSName.getPDFName( "florin" ) );
+ addCharacterEncoding( 064, COSName.getPDFName( "four" ) );
+ addCharacterEncoding( 0147, COSName.getPDFName( "g" ) );
+ addCharacterEncoding( 0337, COSName.getPDFName( "germandbls" ) );
+ addCharacterEncoding( 0140, COSName.getPDFName( "grave" ) );
+ addCharacterEncoding( 076, COSName.getPDFName( "greater" ) );
+ addCharacterEncoding( 0253, COSName.getPDFName( "guillemotleft" ) );
+ addCharacterEncoding( 0273, COSName.getPDFName( "guillemotright" ) );
+ addCharacterEncoding( 0213, COSName.getPDFName( "guilsinglleft" ) );
+ addCharacterEncoding( 0233, COSName.getPDFName( "guilsinglright" ) );
+ addCharacterEncoding( 0150, COSName.getPDFName( "h" ) );
+ addCharacterEncoding( 055, COSName.getPDFName( "hyphen" ) );
+ addCharacterEncoding( 0151, COSName.getPDFName( "i" ) );
+ addCharacterEncoding( 0355, COSName.getPDFName( "iacute" ) );
+ addCharacterEncoding( 0356, COSName.getPDFName( "icircumflex" ) );
+ addCharacterEncoding( 0357, COSName.getPDFName( "idieresis" ) );
+ addCharacterEncoding( 0354, COSName.getPDFName( "igrave" ) );
+ addCharacterEncoding( 0152, COSName.getPDFName( "j" ) );
+ addCharacterEncoding( 0153, COSName.getPDFName( "k" ) );
+ addCharacterEncoding( 0154, COSName.getPDFName( "l" ) );
+ addCharacterEncoding( 074, COSName.getPDFName( "less" ) );
+ addCharacterEncoding( 0254, COSName.getPDFName( "logicalnot" ) );
+ addCharacterEncoding( 0155, COSName.getPDFName( "m" ) );
+ addCharacterEncoding( 0257, COSName.getPDFName( "macron" ) );
+ addCharacterEncoding( 0265, COSName.getPDFName( "mu" ) );
+ addCharacterEncoding( 0327, COSName.getPDFName( "multiply" ) );
+ addCharacterEncoding( 0156, COSName.getPDFName( "n" ) );
+ addCharacterEncoding( 071, COSName.getPDFName( "nine" ) );
+ addCharacterEncoding( 0361, COSName.getPDFName( "ntilde" ) );
+ addCharacterEncoding( 043, COSName.getPDFName( "numbersign" ) );
+ addCharacterEncoding( 0157, COSName.getPDFName( "o" ) );
+ addCharacterEncoding( 0363, COSName.getPDFName( "oacute" ) );
+ addCharacterEncoding( 0364, COSName.getPDFName( "ocircumflex" ) );
+ addCharacterEncoding( 0366, COSName.getPDFName( "odieresis" ) );
+ addCharacterEncoding( 0234, COSName.getPDFName( "oe" ) );
+ addCharacterEncoding( 0362, COSName.getPDFName( "ograve" ) );
+ addCharacterEncoding( 061, COSName.getPDFName( "one" ) );
+ addCharacterEncoding( 0275, COSName.getPDFName( "onehalf" ) );
+ addCharacterEncoding( 0274, COSName.getPDFName( "onequarter" ) );
+ addCharacterEncoding( 0271, COSName.getPDFName( "onesuperior" ) );
+ addCharacterEncoding( 0252, COSName.getPDFName( "ordfeminine" ) );
+ addCharacterEncoding( 0272, COSName.getPDFName( "ordmasculine" ) );
+ addCharacterEncoding( 0370, COSName.getPDFName( "oslash" ) );
+ addCharacterEncoding( 0365, COSName.getPDFName( "otilde" ) );
+ addCharacterEncoding( 0160, COSName.getPDFName( "p" ) );
+ addCharacterEncoding( 0266, COSName.getPDFName( "paragraph" ) );
+ addCharacterEncoding( 050, COSName.getPDFName( "parenleft" ) );
+ addCharacterEncoding( 051, COSName.getPDFName( "parenright" ) );
+ addCharacterEncoding( 045, COSName.getPDFName( "percent" ) );
+ addCharacterEncoding( 056, COSName.getPDFName( "period" ) );
+ addCharacterEncoding( 0267, COSName.getPDFName( "periodcentered" ) );
+ addCharacterEncoding( 0211, COSName.getPDFName( "perthousand" ) );
+ addCharacterEncoding( 053, COSName.getPDFName( "plus" ) );
+ addCharacterEncoding( 0261, COSName.getPDFName( "plusminus" ) );
+ addCharacterEncoding( 0161, COSName.getPDFName( "q" ) );
+ addCharacterEncoding( 077, COSName.getPDFName( "question" ) );
+ addCharacterEncoding( 0277, COSName.getPDFName( "questiondown" ) );
+ addCharacterEncoding( 042, COSName.getPDFName( "quotedbl" ) );
+ addCharacterEncoding( 0204, COSName.getPDFName( "quotedblbase" ) );
+ addCharacterEncoding( 0223, COSName.getPDFName( "quotedblleft" ) );
+ addCharacterEncoding( 0224, COSName.getPDFName( "quotedblright" ) );
+ addCharacterEncoding( 0221, COSName.getPDFName( "quoteleft" ) );
+ addCharacterEncoding( 0222, COSName.getPDFName( "quoteright" ) );
+ addCharacterEncoding( 0202, COSName.getPDFName( "quotesinglbase" ) );
+ addCharacterEncoding( 047, COSName.getPDFName( "quotesingle" ) );
+ addCharacterEncoding( 0162, COSName.getPDFName( "r" ) );
+ addCharacterEncoding( 0256, COSName.getPDFName( "registered" ) );
+ addCharacterEncoding( 0163, COSName.getPDFName( "s" ) );
+ addCharacterEncoding( 0232, COSName.getPDFName( "scaron" ) );
+ addCharacterEncoding( 0247, COSName.getPDFName( "section" ) );
+ addCharacterEncoding( 073, COSName.getPDFName( "semicolon" ) );
+ addCharacterEncoding( 067, COSName.getPDFName( "seven" ) );
+ addCharacterEncoding( 066, COSName.getPDFName( "six" ) );
+ addCharacterEncoding( 057, COSName.getPDFName( "slash" ) );
+ addCharacterEncoding( 040, COSName.getPDFName( "space" ) );
+ addCharacterEncoding( 0243, COSName.getPDFName( "sterling" ) );
+ addCharacterEncoding( 0164, COSName.getPDFName( "t" ) );
+ addCharacterEncoding( 0376, COSName.getPDFName( "thorn" ) );
+ addCharacterEncoding( 063, COSName.getPDFName( "three" ) );
+ addCharacterEncoding( 0276, COSName.getPDFName( "threequarters" ) );
+ addCharacterEncoding( 0263, COSName.getPDFName( "threesuperior" ) );
+ addCharacterEncoding( 0230, COSName.getPDFName( "tilde" ) );
+ addCharacterEncoding( 0231, COSName.getPDFName( "trademark" ) );
+ addCharacterEncoding( 062, COSName.getPDFName( "two" ) );
+ addCharacterEncoding( 0262, COSName.getPDFName( "twosuperior" ) );
+ addCharacterEncoding( 0165, COSName.getPDFName( "u" ) );
+ addCharacterEncoding( 0372, COSName.getPDFName( "uacute" ) );
+ addCharacterEncoding( 0373, COSName.getPDFName( "ucircumflex" ) );
+ addCharacterEncoding( 0374, COSName.getPDFName( "udieresis" ) );
+ addCharacterEncoding( 0371, COSName.getPDFName( "ugrave" ) );
+ addCharacterEncoding( 0137, COSName.getPDFName( "underscore" ) );
+ addCharacterEncoding( 0166, COSName.getPDFName( "v" ) );
+ addCharacterEncoding( 0167, COSName.getPDFName( "w" ) );
+ addCharacterEncoding( 0170, COSName.getPDFName( "x" ) );
+ addCharacterEncoding( 0171, COSName.getPDFName( "y" ) );
+ addCharacterEncoding( 0375, COSName.getPDFName( "yacute" ) );
+ addCharacterEncoding( 0377, COSName.getPDFName( "ydieresis" ) );
+ addCharacterEncoding( 0245, COSName.getPDFName( "yen" ) );
+ addCharacterEncoding( 0172, COSName.getPDFName( "z" ) );
+ addCharacterEncoding( 0236, COSName.getPDFName( "zcaron" ) );
+ addCharacterEncoding( 060, COSName.getPDFName( "zero" ) );
+ }
+
+ /**
+ * Convert this standard java object to a COS object.
+ *
+ * @return The cos object that matches this Java object.
+ */
+ public COSBase getCOSObject()
+ {
+ return COSName.WIN_ANSI_ENCODING;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/encoding/package.html b/src/main/java/org/pdfbox/encoding/package.html
new file mode 100644
index 0000000..2fcc5c7
--- /dev/null
+++ b/src/main/java/org/pdfbox/encoding/package.html
@@ -0,0 +1,9 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head>
+
+</head>
+<body>
+This package contains the implementations for all of the encodings that are used in PDF documents.
+</body>
+</html>
diff --git a/src/main/java/org/pdfbox/encryption/ARCFour.java b/src/main/java/org/pdfbox/encryption/ARCFour.java
new file mode 100644
index 0000000..6eeeb95
--- /dev/null
+++ b/src/main/java/org/pdfbox/encryption/ARCFour.java
@@ -0,0 +1,182 @@
+/**
+ * Copyright (c) 2003, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.encryption;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+/**
+ * This class is an implementation of the alleged RC4 algorithm.
+ *
+ * @author Ben Litchfield
+ * @version $Revision: 1.7 $
+ */
+public class ARCFour
+{
+ private int[] salt;
+ private int b;
+ private int c;
+
+ /**
+ * Constructor.
+ *
+ */
+ public ARCFour()
+ {
+ salt = new int[256];
+ }
+
+ /**
+ * This will reset the key to be used.
+ *
+ * @param key The RC4 key used during encryption.
+ */
+ public void setKey( byte[] key )
+ {
+ b = 0;
+ c = 0;
+
+ if(key.length < 1 || key.length > 32)
+ {
+ throw new IllegalArgumentException("number of bytes must be between 1 and 32");
+ }
+ for(int i = 0; i < salt.length; i++)
+ {
+ salt[i] = i;
+ }
+
+ int keyIndex = 0;
+ int saltIndex = 0;
+ for( int i = 0; i < salt.length; i++)
+ {
+ saltIndex = (fixByte(key[keyIndex]) + salt[i] + saltIndex) % 256;
+ swap( salt, i, saltIndex );
+ keyIndex = (keyIndex + 1) % key.length;
+ }
+
+ }
+
+ /**
+ * Thie will ensure that the value for a byte >=0.
+ *
+ * @param aByte The byte to test against.
+ *
+ * @return A value >=0 and < 256
+ */
+ private static final int fixByte( byte aByte )
+ {
+ return aByte < 0 ? 256 + aByte : aByte;
+ }
+
+ /**
+ * This will swap two values in an array.
+ *
+ * @param data The array to swap from.
+ * @param firstIndex The index of the first element to swap.
+ * @param secondIndex The index of the second element to swap.
+ */
+ private static final void swap( int[] data, int firstIndex, int secondIndex )
+ {
+ int tmp = data[ firstIndex ];
+ data[ firstIndex ] = data[ secondIndex ];
+ data[ secondIndex ] = tmp;
+ }
+
+ /**
+ * This will encrypt and write the next byte.
+ *
+ * @param aByte The byte to encrypt.
+ * @param output The stream to write to.
+ *
+ * @throws IOException If there is an error writing to the output stream.
+ */
+ public void write( byte aByte, OutputStream output ) throws IOException
+ {
+ b = (b + 1) % 256;
+ c = (salt[b] + c) % 256;
+ swap( salt, b, c );
+ int saltIndex = (salt[b] + salt[c]) % 256;
+ output.write(aByte ^ (byte)salt[saltIndex]);
+ }
+
+ /**
+ * This will encrypt and write the data.
+ *
+ * @param data The data to encrypt.
+ * @param output The stream to write to.
+ *
+ * @throws IOException If there is an error writing to the output stream.
+ */
+ public void write( byte[] data, OutputStream output ) throws IOException
+ {
+ for( int i = 0; i < data.length; i++ )
+ {
+ write( data[i], output );
+ }
+ }
+
+ /**
+ * This will encrypt and write the data.
+ *
+ * @param data The data to encrypt.
+ * @param output The stream to write to.
+ *
+ * @throws IOException If there is an error writing to the output stream.
+ */
+ public void write( InputStream data, OutputStream output ) throws IOException
+ {
+ byte[] buffer = new byte[1024];
+ int amountRead = 0;
+ while( (amountRead = data.read( buffer )) != -1 )
+ {
+ write( buffer, 0, amountRead, output );
+ }
+ }
+
+ /**
+ * This will encrypt and write the data.
+ *
+ * @param data The data to encrypt.
+ * @param offset The offset into the array to start reading data from.
+ * @param len The number of bytes to attempt to read.
+ * @param output The stream to write to.
+ *
+ * @throws IOException If there is an error writing to the output stream.
+ */
+ public void write( byte[] data, int offset, int len, OutputStream output) throws IOException
+ {
+ for( int i = offset; i < offset + len; i++ )
+ {
+ write( data[i], output );
+ }
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/encryption/DocumentEncryption.java b/src/main/java/org/pdfbox/encryption/DocumentEncryption.java
new file mode 100644
index 0000000..9ae6936
--- /dev/null
+++ b/src/main/java/org/pdfbox/encryption/DocumentEncryption.java
@@ -0,0 +1,427 @@
+/**
+ * Copyright (c) 2003-2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.encryption;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.InputStream;
+import java.io.IOException;
+
+import java.math.BigInteger;
+
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+
+import org.pdfbox.exceptions.CryptographyException;
+import org.pdfbox.exceptions.InvalidPasswordException;
+
+import org.pdfbox.cos.COSArray;
+import org.pdfbox.cos.COSBase;
+import org.pdfbox.cos.COSDictionary;
+import org.pdfbox.cos.COSDocument;
+import org.pdfbox.cos.COSName;
+import org.pdfbox.cos.COSObject;
+import org.pdfbox.cos.COSStream;
+import org.pdfbox.cos.COSString;
+
+import org.pdfbox.pdmodel.PDDocument;
+
+import org.pdfbox.pdmodel.encryption.PDStandardEncryption;
+
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+
+/**
+ * This class will deal with encrypting/decrypting a document.
+ *
+ * @author Ben Litchfield (ben@benlitchfield.com)
+ * @version $Revision: 1.10 $
+ */
+public class DocumentEncryption
+{
+ private PDDocument pdDocument = null;
+ private COSDocument document = null;
+
+ private byte[] encryptionKey = null;
+ private PDFEncryption encryption = new PDFEncryption();
+
+ private Set objects = new HashSet();
+
+ /**
+ * A set that contains potential signature dictionaries. This is used
+ * because the Contents entry of the signature is not encrypted.
+ */
+ private Set potentialSignatures = new HashSet();
+
+ /**
+ * Constructor.
+ *
+ * @param doc The document to decrypt.
+ */
+ public DocumentEncryption( PDDocument doc )
+ {
+ pdDocument = doc;
+ document = doc.getDocument();
+ }
+
+ /**
+ * Constructor.
+ *
+ * @param doc The document to decrypt.
+ */
+ public DocumentEncryption( COSDocument doc )
+ {
+ pdDocument = new PDDocument( doc );
+ document = doc;
+ }
+
+ /**
+ * This will encrypt the given document, given the owner password and user password.
+ * The encryption method used is the standard filter.
+ *
+ * @throws CryptographyException If an error occurs during encryption.
+ * @throws IOException If there is an error accessing the data.
+ */
+ public void initForEncryption()
+ throws CryptographyException, IOException
+ {
+ String ownerPassword = pdDocument.getOwnerPasswordForEncryption();
+ String userPassword = pdDocument.getUserPasswordForEncryption();
+ if( ownerPassword == null )
+ {
+ ownerPassword = "";
+ }
+ if( userPassword == null )
+ {
+ userPassword = "";
+ }
+ PDStandardEncryption encParameters = (PDStandardEncryption)pdDocument.getEncryptionDictionary();
+ int permissionInt = encParameters.getPermissions();
+ int revision = encParameters.getRevision();
+ int length = encParameters.getLength()/8;
+ COSArray idArray = document.getDocumentID();
+
+ //check if the document has an id yet. If it does not then
+ //generate one
+ if( idArray == null || idArray.size() < 2 )
+ {
+ idArray = new COSArray();
+ try
+ {
+ MessageDigest md = MessageDigest.getInstance( "MD5" );
+ BigInteger time = BigInteger.valueOf( System.currentTimeMillis() );
+ md.update( time.toByteArray() );
+ md.update( ownerPassword.getBytes() );
+ md.update( userPassword.getBytes() );
+ md.update( document.toString().getBytes() );
+ byte[] id = md.digest( this.toString().getBytes() );
+ COSString idString = new COSString();
+ idString.append( id );
+ idArray.add( idString );
+ idArray.add( idString );
+ document.setDocumentID( idArray );
+ }
+ catch( NoSuchAlgorithmException e )
+ {
+ throw new CryptographyException( e );
+ }
+
+ }
+ COSString id = (COSString)idArray.getObject( 0 );
+ encryption = new PDFEncryption();
+
+ byte[] o = encryption.computeOwnerPassword(
+ ownerPassword.getBytes("ISO-8859-1"),
+ userPassword.getBytes("ISO-8859-1"), revision, length);
+
+ byte[] u = encryption.computeUserPassword(
+ userPassword.getBytes("ISO-8859-1"),
+ o, permissionInt, id.getBytes(), revision, length);
+
+ encryptionKey = encryption.computeEncryptedKey(
+ userPassword.getBytes("ISO-8859-1"), o, permissionInt, id.getBytes(), revision, length);
+
+ encParameters.setOwnerKey( o );
+ encParameters.setUserKey( u );
+
+ document.setEncryptionDictionary( encParameters.getCOSDictionary() );
+ }
+
+
+
+ /**
+ * This will decrypt the document.
+ *
+ * @param password The password for the document.
+ *
+ * @throws CryptographyException If there is an error decrypting the document.
+ * @throws IOException If there is an error getting the stream data.
+ * @throws InvalidPasswordException If the password is not a user or owner password.
+ */
+ public void decryptDocument( String password )
+ throws CryptographyException, IOException, InvalidPasswordException
+ {
+ if( password == null )
+ {
+ password = "";
+ }
+
+ PDStandardEncryption encParameters = (PDStandardEncryption)pdDocument.getEncryptionDictionary();
+
+
+ int permissions = encParameters.getPermissions();
+ int revision = encParameters.getRevision();
+ int length = encParameters.getLength()/8;
+
+ COSString id = (COSString)document.getDocumentID().getObject( 0 );
+ byte[] u = encParameters.getUserKey();
+ byte[] o = encParameters.getOwnerKey();
+
+ boolean isUserPassword =
+ encryption.isUserPassword( password.getBytes(), u,
+ o, permissions, id.getBytes(), revision, length );
+ boolean isOwnerPassword =
+ encryption.isOwnerPassword( password.getBytes(), u,
+ o, permissions, id.getBytes(), revision, length );
+
+ if( isUserPassword )
+ {
+ encryptionKey =
+ encryption.computeEncryptedKey(
+ password.getBytes(), o,
+ permissions, id.getBytes(), revision, length );
+ }
+ else if( isOwnerPassword )
+ {
+ byte[] computedUserPassword =
+ encryption.getUserPassword(
+ password.getBytes(),
+ o,
+ revision,
+ length );
+ encryptionKey =
+ encryption.computeEncryptedKey(
+ computedUserPassword, o,
+ permissions, id.getBytes(), revision, length );
+ }
+ else
+ {
+ throw new InvalidPasswordException( "Error: The supplied password does not match " +
+ "either the owner or user password in the document." );
+ }
+
+ COSDictionary trailer = document.getTrailer();
+ COSArray fields = (COSArray)trailer.getObjectFromPath( "Root/AcroForm/Fields" );
+
+ //We need to collect all the signature dictionaries, for some
+ //reason the 'Contents' entry of signatures is not really encrypted
+ if( fields != null )
+ {
+ for( int i=0; i<fields.size(); i++ )
+ {
+ COSDictionary field = (COSDictionary)fields.getObject( i );
+ addDictionaryAndSubDictionary( potentialSignatures, field );
+ }
+ }
+
+ List allObjects = document.getObjects();
+ Iterator objectIter = allObjects.iterator();
+ while( objectIter.hasNext() )
+ {
+ decryptObject( (COSObject)objectIter.next() );
+ }
+ document.setEncryptionDictionary( null );
+ }
+
+ private void addDictionaryAndSubDictionary( Set set, COSDictionary dic )
+ {
+ set.add( dic );
+ COSArray kids = (COSArray)dic.getDictionaryObject( "Kids" );
+ for( int i=0; kids != null && i<kids.size(); i++ )
+ {
+ addDictionaryAndSubDictionary( set, (COSDictionary)kids.getObject( i ) );
+ }
+ COSBase value = dic.getDictionaryObject( "V" );
+ if( value instanceof COSDictionary )
+ {
+ addDictionaryAndSubDictionary( set, (COSDictionary)value );
+ }
+ }
+
+ /**
+ * This will decrypt an object in the document.
+ *
+ * @param object The object to decrypt.
+ *
+ * @throws CryptographyException If there is an error decrypting the stream.
+ * @throws IOException If there is an error getting the stream data.
+ */
+ private void decryptObject( COSObject object )
+ throws CryptographyException, IOException
+ {
+ long objNum = object.getObjectNumber().intValue();
+ long genNum = object.getGenerationNumber().intValue();
+ COSBase base = object.getObject();
+ decrypt( base, objNum, genNum );
+ }
+
+ /**
+ * This will dispatch to the correct method.
+ *
+ * @param obj The object to decrypt.
+ * @param objNum The object number.
+ * @param genNum The object generation Number.
+ *
+ * @throws CryptographyException If there is an error decrypting the stream.
+ * @throws IOException If there is an error getting the stream data.
+ */
+ private void decrypt( Object obj, long objNum, long genNum )
+ throws CryptographyException, IOException
+ {
+ if( !objects.contains( obj ) )
+ {
+ objects.add( obj );
+
+ if( obj instanceof COSString )
+ {
+ decryptString( (COSString)obj, objNum, genNum );
+ }
+ else if( obj instanceof COSStream )
+ {
+ decryptStream( (COSStream)obj, objNum, genNum );
+ }
+ else if( obj instanceof COSDictionary )
+ {
+ decryptDictionary( (COSDictionary)obj, objNum, genNum );
+ }
+ else if( obj instanceof COSArray )
+ {
+ decryptArray( (COSArray)obj, objNum, genNum );
+ }
+ }
+ }
+
+ /**
+ * This will decrypt a stream.
+ *
+ * @param stream The stream to decrypt.
+ * @param objNum The object number.
+ * @param genNum The object generation number.
+ *
+ * @throws CryptographyException If there is an error getting the stream.
+ * @throws IOException If there is an error getting the stream data.
+ */
+ public void decryptStream( COSStream stream, long objNum, long genNum )
+ throws CryptographyException, IOException
+ {
+ decryptDictionary( stream, objNum, genNum );
+ InputStream encryptedStream = stream.getFilteredStream();
+ encryption.encryptData( objNum,
+ genNum,
+ encryptionKey,
+ encryptedStream,
+ stream.createFilteredStream() );
+ }
+
+ /**
+ * This will decrypt a dictionary.
+ *
+ * @param dictionary The dictionary to decrypt.
+ * @param objNum The object number.
+ * @param genNum The object generation number.
+ *
+ * @throws CryptographyException If there is an error decrypting the document.
+ * @throws IOException If there is an error creating a new string.
+ */
+ private void decryptDictionary( COSDictionary dictionary, long objNum, long genNum )
+ throws CryptographyException, IOException
+ {
+ Iterator keys = dictionary.keyList().iterator();
+ while( keys.hasNext() )
+ {
+ COSName key = (COSName)keys.next();
+ Object value = dictionary.getItem( key );
+ //if we are a signature dictionary and contain a Contents entry then
+ //we don't decrypt it.
+ if( !(key.getName().equals( "Contents" ) &&
+ value instanceof COSString &&
+ potentialSignatures.contains( dictionary )))
+ {
+ decrypt( value, objNum, genNum );
+ }
+ }
+ }
+
+ /**
+ * This will decrypt a string.
+ *
+ * @param string the string to decrypt.
+ * @param objNum The object number.
+ * @param genNum The object generation number.
+ *
+ * @throws CryptographyException If an error occurs during decryption.
+ * @throws IOException If an error occurs writing the new string.
+ */
+ public void decryptString( COSString string, long objNum, long genNum )
+ throws CryptographyException, IOException
+ {
+ ByteArrayInputStream data = new ByteArrayInputStream( string.getBytes() );
+ ByteArrayOutputStream buffer = new ByteArrayOutputStream();
+ encryption.encryptData( objNum,
+ genNum,
+ encryptionKey,
+ data,
+ buffer );
+ string.reset();
+ string.append( buffer.toByteArray() );
+ }
+
+ /**
+ * This will decrypt an array.
+ *
+ * @param array The array to decrypt.
+ * @param objNum The object number.
+ * @param genNum The object generation number.
+ *
+ * @throws CryptographyException If an error occurs during decryption.
+ * @throws IOException If there is an error accessing the data.
+ */
+ private void decryptArray( COSArray array, long objNum, long genNum )
+ throws CryptographyException, IOException
+ {
+ for( int i=0; i<array.size(); i++ )
+ {
+ decrypt( array.get( i ), objNum, genNum );
+ }
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/encryption/PDFEncryption.java b/src/main/java/org/pdfbox/encryption/PDFEncryption.java
new file mode 100644
index 0000000..5bd3d64
--- /dev/null
+++ b/src/main/java/org/pdfbox/encryption/PDFEncryption.java
@@ -0,0 +1,599 @@
+/**
+ * Copyright (c) 2003-2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.encryption;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+
+import org.pdfbox.exceptions.CryptographyException;
+
+/**
+ * This class will deal with PDF encryption algorithms.
+ *
+ * @author Ben Litchfield (ben@benlitchfield.com)
+ * @version $Revision: 1.13 $
+ */
+public final class PDFEncryption
+{
+ private ARCFour rc4 = new ARCFour();
+ /**
+ * The encryption padding defined in the PDF 1.4 Spec algorithm 3.2.
+ */
+ public static final byte[] ENCRYPT_PADDING =
+ {
+ (byte)0x28, (byte)0xBF, (byte)0x4E, (byte)0x5E, (byte)0x4E,
+ (byte)0x75, (byte)0x8A, (byte)0x41, (byte)0x64, (byte)0x00,
+ (byte)0x4E, (byte)0x56, (byte)0xFF, (byte)0xFA, (byte)0x01,
+ (byte)0x08, (byte)0x2E, (byte)0x2E, (byte)0x00, (byte)0xB6,
+ (byte)0xD0, (byte)0x68, (byte)0x3E, (byte)0x80, (byte)0x2F,
+ (byte)0x0C, (byte)0xA9, (byte)0xFE, (byte)0x64, (byte)0x53,
+ (byte)0x69, (byte)0x7A
+ };
+
+ /**
+ * This will encrypt a piece of data.
+ *
+ * @param objectNumber The id for the object.
+ * @param genNumber The generation id for the object.
+ * @param key The key used to encrypt the data.
+ * @param data The data to encrypt/decrypt.
+ * @param output The stream to write to.
+ *
+ * @throws CryptographyException If there is an error encrypting the data.
+ * @throws IOException If there is an io error.
+ */
+ public final void encryptData(
+ long objectNumber,
+ long genNumber,
+ byte[] key,
+ InputStream data,
+ OutputStream output )
+ throws CryptographyException, IOException
+ {
+ byte[] newKey = new byte[ key.length + 5 ];
+ System.arraycopy( key, 0, newKey, 0, key.length );
+ //PDF 1.4 reference pg 73
+ //step 1
+ //we have the reference
+
+ //step 2
+ newKey[newKey.length -5] = (byte)(objectNumber & 0xff);
+ newKey[newKey.length -4] = (byte)((objectNumber >> 8) & 0xff);
+ newKey[newKey.length -3] = (byte)((objectNumber >> 16) & 0xff);
+ newKey[newKey.length -2] = (byte)(genNumber & 0xff);
+ newKey[newKey.length -1] = (byte)((genNumber >> 8) & 0xff);
+
+
+ //step 3
+ byte[] digestedKey = null;
+ try
+ {
+ MessageDigest md = MessageDigest.getInstance( "MD5" );
+ digestedKey = md.digest( newKey );
+ }
+ catch( NoSuchAlgorithmException e )
+ {
+ throw new CryptographyException( e );
+ }
+
+ //step 4
+ int length = Math.min( newKey.length, 16 );
+ byte[] finalKey = new byte[ length ];
+ System.arraycopy( digestedKey, 0, finalKey, 0, length );
+
+ rc4.setKey( finalKey );
+ rc4.write( data, output );
+ output.flush();
+ }
+
+ /**
+ * This will get the user password from the owner password and the documents o value.
+ *
+ * @param ownerPassword The plaintext owner password.
+ * @param o The document's o entry.
+ * @param revision The document revision number.
+ * @param length The length of the encryption.
+ *
+ * @return The plaintext padded user password.
+ *
+ * @throws CryptographyException If there is an error getting the user password.
+ * @throws IOException If there is an error reading data.
+ */
+ public final byte[] getUserPassword(
+ byte[] ownerPassword,
+ byte[] o,
+ int revision,
+ long length )
+ throws CryptographyException, IOException
+ {
+ try
+ {
+ ByteArrayOutputStream result = new ByteArrayOutputStream();
+
+ //3.3 STEP 1
+ byte[] ownerPadded = truncateOrPad( ownerPassword );
+
+ //3.3 STEP 2
+ MessageDigest md = MessageDigest.getInstance( "MD5" );
+ md.update( ownerPadded );
+ byte[] digest = md.digest();
+
+ //3.3 STEP 3
+ if( revision == 3 || revision == 4 )
+ {
+ for( int i=0; i<50; i++ )
+ {
+ md.reset();
+ md.update( digest );
+ digest = md.digest();
+ }
+ }
+ if( revision == 2 && length != 5 )
+ {
+ throw new CryptographyException(
+ "Error: Expected length=5 actual=" + length );
+ }
+
+ //3.3 STEP 4
+ byte[] rc4Key = new byte[ (int)length ];
+ System.arraycopy( digest, 0, rc4Key, 0, (int)length );
+
+ //3.7 step 2
+ if( revision == 2 )
+ {
+ rc4.setKey( rc4Key );
+ rc4.write( o, result );
+ }
+ else if( revision == 3 || revision == 4)
+ {
+ /**
+ byte[] iterationKey = new byte[ rc4Key.length ];
+ byte[] dataToEncrypt = o;
+ for( int i=19; i>=0; i-- )
+ {
+ System.arraycopy( rc4Key, 0, iterationKey, 0, rc4Key.length );
+ for( int j=0; j< iterationKey.length; j++ )
+ {
+ iterationKey[j] = (byte)(iterationKey[j] ^ (byte)i);
+ }
+ rc4.setKey( iterationKey );
+ rc4.write( dataToEncrypt, result );
+ dataToEncrypt = result.toByteArray();
+ result.reset();
+ }
+ result.write( dataToEncrypt, 0, dataToEncrypt.length );
+ */
+ byte[] iterationKey = new byte[ rc4Key.length ];
+
+
+ byte[] otemp = new byte[ o.length ]; //sm
+ System.arraycopy( o, 0, otemp, 0, o.length ); //sm
+ rc4.write( o, result);//sm
+
+ for( int i=19; i>=0; i-- )
+ {
+ System.arraycopy( rc4Key, 0, iterationKey, 0, rc4Key.length );
+ for( int j=0; j< iterationKey.length; j++ )
+ {
+ iterationKey[j] = (byte)(iterationKey[j] ^ (byte)i);
+ }
+ rc4.setKey( iterationKey );
+ result.reset(); //sm
+ rc4.write( otemp, result ); //sm
+ otemp = result.toByteArray(); //sm
+ }
+ }
+
+
+ return result.toByteArray();
+
+ }
+ catch( NoSuchAlgorithmException e )
+ {
+ throw new CryptographyException( e );
+ }
+ }
+
+ /**
+ * This will tell if this is the owner password or not.
+ *
+ * @param ownerPassword The plaintext owner password.
+ * @param u The U value from the PDF Document.
+ * @param o The owner password hash.
+ * @param permissions The document permissions.
+ * @param id The document id.
+ * @param revision The revision of the encryption.
+ * @param length The length of the encryption key.
+ *
+ * @return true if the owner password matches the one from the document.
+ *
+ * @throws CryptographyException If there is an error while executing crypt functions.
+ * @throws IOException If there is an error while checking owner password.
+ */
+ public final boolean isOwnerPassword(
+ byte[] ownerPassword,
+ byte[] u,
+ byte[] o,
+ int permissions,
+ byte[] id,
+ int revision,
+ int length)
+ throws CryptographyException, IOException
+ {
+ byte[] userPassword = getUserPassword( ownerPassword, o, revision, length );
+ return isUserPassword( userPassword, u, o, permissions, id, revision, length );
+ }
+
+ /**
+ * This will tell if this is a valid user password.
+ *
+ * Algorithm 3.6 pg 80
+ *
+ * @param password The password to test.
+ * @param u The U value from the PDF Document.
+ * @param o The owner password hash.
+ * @param permissions The document permissions.
+ * @param id The document id.
+ * @param revision The revision of the encryption.
+ * @param length The length of the encryption key.
+ *
+ * @return true If this is the correct user password.
+ *
+ * @throws CryptographyException If there is an error computing the value.
+ * @throws IOException If there is an IO error while computing the owners password.
+ */
+ public final boolean isUserPassword(
+ byte[] password,
+ byte[] u,
+ byte[] o,
+ int permissions,
+ byte[] id,
+ int revision,
+ int length)
+ throws CryptographyException, IOException
+ {
+ boolean matches = false;
+ //STEP 1
+ byte[] computedValue = computeUserPassword( password, o, permissions, id, revision, length );
+ if( revision == 2 )
+ {
+ //STEP 2
+ matches = arraysEqual( u, computedValue );
+ }
+ else if( revision == 3 || revision == 4 )
+ {
+ //STEP 2
+ matches = arraysEqual( u, computedValue, 16 );
+ }
+ return matches;
+ }
+
+ /**
+ * This will compare two byte[] for equality for count number of bytes.
+ *
+ * @param first The first byte array.
+ * @param second The second byte array.
+ * @param count The number of bytes to compare.
+ *
+ * @return true If the arrays contain the exact same data.
+ */
+ private final boolean arraysEqual( byte[] first, byte[] second, int count )
+ {
+ boolean equal = first.length >= count && second.length >= count;
+ for( int i=0; i<count && equal; i++ )
+ {
+ equal = first[i] == second[i];
+ }
+ return equal;
+ }
+
+ /**
+ * This will compare two byte[] for equality.
+ *
+ * @param first The first byte array.
+ * @param second The second byte array.
+ *
+ * @return true If the arrays contain the exact same data.
+ */
+ private final boolean arraysEqual( byte[] first, byte[] second )
+ {
+ boolean equal = first.length == second.length;
+ for( int i=0; i<first.length && equal; i++ )
+ {
+ equal = first[i] == second[i];
+ }
+ return equal;
+ }
+
+ /**
+ * This will compute the user password hash.
+ *
+ * @param password The plain text password.
+ * @param o The owner password hash.
+ * @param permissions The document permissions.
+ * @param id The document id.
+ * @param revision The revision of the encryption.
+ * @param length The length of the encryption key.
+ *
+ * @return The user password.
+ *
+ * @throws CryptographyException If there is an error computing the user password.
+ * @throws IOException If there is an IO error.
+ */
+ public final byte[] computeUserPassword(
+ byte[] password,
+ byte[] o,
+ int permissions,
+ byte[] id,
+ int revision,
+ int length )
+ throws CryptographyException, IOException
+ {
+ ByteArrayOutputStream result = new ByteArrayOutputStream();
+ //STEP 1
+ byte[] encryptionKey = computeEncryptedKey( password, o, permissions, id, revision, length );
+
+ if( revision == 2 )
+ {
+ //STEP 2
+ rc4.setKey( encryptionKey );
+ rc4.write( ENCRYPT_PADDING, result );
+ }
+ else if( revision == 3 || revision == 4 )
+ {
+ try
+ {
+ //STEP 2
+ MessageDigest md = MessageDigest.getInstance("MD5");
+ //md.update( truncateOrPad( password ) );
+ md.update( ENCRYPT_PADDING );
+
+ //STEP 3
+ md.update( id );
+ result.write( md.digest() );
+
+ //STEP 4 and 5
+ byte[] iterationKey = new byte[ encryptionKey.length ];
+ for( int i=0; i<20; i++ )
+ {
+ System.arraycopy( encryptionKey, 0, iterationKey, 0, iterationKey.length );
+ for( int j=0; j< iterationKey.length; j++ )
+ {
+ iterationKey[j] = (byte)(iterationKey[j] ^ i);
+ }
+ rc4.setKey( iterationKey );
+ ByteArrayInputStream input = new ByteArrayInputStream( result.toByteArray() );
+ result.reset();
+ rc4.write( input, result );
+ }
+
+ //step 6
+ byte[] finalResult = new byte[32];
+ System.arraycopy( result.toByteArray(), 0, finalResult, 0, 16 );
+ System.arraycopy( ENCRYPT_PADDING, 0, finalResult, 16, 16 );
+ result.reset();
+ result.write( finalResult );
+ }
+ catch( NoSuchAlgorithmException e )
+ {
+ throw new CryptographyException( e );
+ }
+ }
+ return result.toByteArray();
+ }
+
+ /**
+ * This will compute the encrypted key.
+ *
+ * @param password The password used to compute the encrypted key.
+ * @param o The owner password hash.
+ * @param permissions The permissions for the document.
+ * @param id The document id.
+ * @param revision The security revision.
+ * @param length The length of the encryption key.
+ *
+ * @return The encryption key.
+ *
+ * @throws CryptographyException If there is an error computing the key.
+ */
+ public final byte[] computeEncryptedKey(
+ byte[] password,
+ byte[] o,
+ int permissions,
+ byte[] id,
+ int revision,
+ int length )
+ throws CryptographyException
+ {
+ byte[] result = new byte[ length ];
+ try
+ {
+ //PDFReference 1.4 pg 78
+ //step1
+ byte[] padded = truncateOrPad( password );
+
+ //step 2
+ MessageDigest md = MessageDigest.getInstance("MD5");
+ md.update( padded );
+
+ //step 3
+ md.update( o );
+
+ //step 4
+ byte zero = (byte)(permissions >>> 0);
+ byte one = (byte)(permissions >>> 8);
+ byte two = (byte)(permissions >>> 16);
+ byte three = (byte)(permissions >>> 24);
+
+ md.update( zero );
+ md.update( one );
+ md.update( two );
+ md.update( three );
+
+ //step 5
+ md.update( id );
+ byte[] digest = md.digest();
+
+ //step 6
+ if( revision == 3 || revision == 4)
+ {
+ for( int i=0; i<50; i++ )
+ {
+ md.reset();
+ md.update( digest, 0, length );
+ digest = md.digest();
+ }
+ }
+
+ //step 7
+ if( revision == 2 && length != 5 )
+ {
+ throw new CryptographyException(
+ "Error: length should be 5 when revision is two actual=" + length );
+ }
+ System.arraycopy( digest, 0, result, 0, length );
+ }
+ catch( NoSuchAlgorithmException e )
+ {
+ throw new CryptographyException( e );
+ }
+ return result;
+ }
+
+ /**
+ * This algorithm is taked from PDF Reference 1.4 Algorithm 3.3 Page 79.
+ *
+ * @param ownerPassword The plain owner password.
+ * @param userPassword The plain user password.
+ * @param revision The version of the security.
+ * @param length The length of the document.
+ *
+ * @return The computed owner password.
+ *
+ * @throws CryptographyException If there is an error computing O.
+ * @throws IOException If there is an error computing O.
+ */
+ public final byte[] computeOwnerPassword(
+ byte[] ownerPassword,
+ byte[] userPassword,
+ int revision,
+ int length )
+ throws CryptographyException, IOException
+ {
+ try
+ {
+ //STEP 1
+ byte[] ownerPadded = truncateOrPad( ownerPassword );
+
+ //STEP 2
+ MessageDigest md = MessageDigest.getInstance( "MD5" );
+ md.update( ownerPadded );
+ byte[] digest = md.digest();
+
+ //STEP 3
+ if( revision == 3 || revision == 4)
+ {
+ for( int i=0; i<50; i++ )
+ {
+ md.reset();
+ md.update( digest, 0, length );
+ digest = md.digest();
+ }
+ }
+ if( revision == 2 && length != 5 )
+ {
+ throw new CryptographyException(
+ "Error: Expected length=5 actual=" + length );
+ }
+
+ //STEP 4
+ byte[] rc4Key = new byte[ length ];
+ System.arraycopy( digest, 0, rc4Key, 0, length );
+
+ //STEP 5
+ byte[] paddedUser = truncateOrPad( userPassword );
+
+
+ //STEP 6
+ rc4.setKey( rc4Key );
+ ByteArrayOutputStream crypted = new ByteArrayOutputStream();
+ rc4.write( new ByteArrayInputStream( paddedUser ), crypted );
+
+
+ //STEP 7
+ if( revision == 3 || revision == 4 )
+ {
+ byte[] iterationKey = new byte[ rc4Key.length ];
+ for( int i=1; i<20; i++ )
+ {
+ System.arraycopy( rc4Key, 0, iterationKey, 0, rc4Key.length );
+ for( int j=0; j< iterationKey.length; j++ )
+ {
+ iterationKey[j] = (byte)(iterationKey[j] ^ (byte)i);
+ }
+ rc4.setKey( iterationKey );
+ ByteArrayInputStream input = new ByteArrayInputStream( crypted.toByteArray() );
+ crypted.reset();
+ rc4.write( input, crypted );
+ }
+ }
+
+ //STEP 8
+ return crypted.toByteArray();
+ }
+ catch( NoSuchAlgorithmException e )
+ {
+ throw new CryptographyException( e.getMessage() );
+ }
+ }
+
+ /**
+ * This will take the password and truncate or pad it as necessary.
+ *
+ * @param password The password to pad or truncate.
+ *
+ * @return The padded or truncated password.
+ */
+ private final byte[] truncateOrPad( byte[] password )
+ {
+ byte[] padded = new byte[ ENCRYPT_PADDING.length ];
+ int bytesBeforePad = Math.min( password.length, padded.length );
+ System.arraycopy( password, 0, padded, 0, bytesBeforePad );
+ System.arraycopy( ENCRYPT_PADDING, 0, padded, bytesBeforePad, ENCRYPT_PADDING.length-bytesBeforePad );
+ return padded;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/encryption/package.html b/src/main/java/org/pdfbox/encryption/package.html
new file mode 100644
index 0000000..62bc982
--- /dev/null
+++ b/src/main/java/org/pdfbox/encryption/package.html
@@ -0,0 +1,9 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head>
+
+</head>
+<body>
+These classes deal with encryption algorithms that are used in the PDF Document.
+</body>
+</html>
diff --git a/src/main/java/org/pdfbox/examples/AbstractExample.java b/src/main/java/org/pdfbox/examples/AbstractExample.java
new file mode 100644
index 0000000..1350b73
--- /dev/null
+++ b/src/main/java/org/pdfbox/examples/AbstractExample.java
@@ -0,0 +1,125 @@
+/**
+ * Copyright (c) 2003, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.examples;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+import org.pdfbox.cos.COSDocument;
+
+import org.pdfbox.pdmodel.PDDocument;
+
+import org.pdfbox.pdfwriter.COSWriter;
+
+/**
+ * A simple class which has some methods used by all examples.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.3 $
+ */
+public abstract class AbstractExample
+{
+ /**
+ * Close the stream.
+ *
+ * @param stream The stream to close.
+ *
+ * @throws IOException If there is an error closing the stream.
+ */
+ public void close( InputStream stream ) throws IOException
+ {
+ if( stream != null )
+ {
+ stream.close();
+ }
+ }
+
+ /**
+ * Close the stream.
+ *
+ * @param stream The stream to close.
+ *
+ * @throws IOException If there is an error closing the stream.
+ */
+ public void close( OutputStream stream ) throws IOException
+ {
+ if( stream != null )
+ {
+ stream.close();
+ }
+ }
+
+ /**
+ * Close the document.
+ *
+ * @param doc The doc to close.
+ *
+ * @throws IOException If there is an error closing the document.
+ */
+ public void close( COSDocument doc ) throws IOException
+ {
+ if( doc != null )
+ {
+ doc.close();
+ }
+ }
+
+ /**
+ * Close the document.
+ *
+ * @param doc The doc to close.
+ *
+ * @throws IOException If there is an error closing the document.
+ */
+ public void close( PDDocument doc ) throws IOException
+ {
+ if( doc != null )
+ {
+ doc.close();
+ }
+ }
+
+ /**
+ * Close the writer.
+ *
+ * @param writer The writer to close.
+ *
+ * @throws IOException If there is an error closing the writer.
+ */
+ public static void close( COSWriter writer ) throws IOException
+ {
+ if( writer != null )
+ {
+ writer.close();
+ }
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/examples/fdf/PrintFields.java b/src/main/java/org/pdfbox/examples/fdf/PrintFields.java
new file mode 100644
index 0000000..189ba72
--- /dev/null
+++ b/src/main/java/org/pdfbox/examples/fdf/PrintFields.java
@@ -0,0 +1,163 @@
+/**
+ * Copyright (c) 2003-2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.examples.fdf;
+
+import java.io.IOException;
+
+import java.util.Iterator;
+import java.util.List;
+
+import org.pdfbox.pdmodel.interactive.form.PDAcroForm;
+import org.pdfbox.pdmodel.interactive.form.PDField;
+
+import org.pdfbox.exceptions.CryptographyException;
+import org.pdfbox.exceptions.InvalidPasswordException;
+
+import org.pdfbox.pdmodel.PDDocument;
+import org.pdfbox.pdmodel.PDDocumentCatalog;
+
+/**
+ * This example will take a PDF document and print all the fields from the file.
+ *
+ * @author Ben Litchfield (ben@benlitchfield.com)
+ * @version $Revision: 1.15 $
+ */
+public class PrintFields
+{
+
+ /**
+ * This will print all the fields from the document.
+ *
+ * @param pdfDocument The PDF to get the fields from.
+ *
+ * @throws IOException If there is an error getting the fields.
+ */
+ public void printFields( PDDocument pdfDocument ) throws IOException
+ {
+ PDDocumentCatalog docCatalog = pdfDocument.getDocumentCatalog();
+ PDAcroForm acroForm = docCatalog.getAcroForm();
+ List fields = acroForm.getFields();
+ Iterator fieldsIter = fields.iterator();
+
+ System.out.println(new Integer(fields.size()).toString() + " top-level fields were found on the form");
+
+ while( fieldsIter.hasNext())
+ {
+ PDField field = (PDField)fieldsIter.next();
+ processField(field, "|--", field.getPartialName());
+ }
+ }
+
+ private void processField(PDField field, String sLevel, String sParent) throws IOException
+ {
+ List kids = field.getKids();
+ if(kids != null)
+ {
+ Iterator kidsIter = kids.iterator();
+ if(!sParent.equals(field.getPartialName()))
+ {
+ sParent = sParent + "." + field.getPartialName();
+ }
+ System.out.println(sLevel + sParent);
+ //System.out.println(sParent + " is of type " + field.getClass().getName());
+ while(kidsIter.hasNext())
+ {
+ Object pdfObj = kidsIter.next();
+ if(pdfObj instanceof PDField)
+ {
+ PDField kid = (PDField)pdfObj;
+ processField(kid, "| " + sLevel, sParent);
+ }
+ }
+ }
+ else
+ {
+ String outputString = sLevel + sParent + "." + field.getPartialName() + " = " + field.getValue() +
+ ", type=" + field.getClass().getName();
+
+ System.out.println(outputString);
+ }
+ }
+
+ /**
+ * This will read a PDF file and print out the form elements.
+ * <br />
+ * see usage() for commandline
+ *
+ * @param args command line arguments
+ *
+ * @throws IOException If there is an error importing the FDF document.
+ * @throws CryptographyException If there is an error decrypting the document.
+ */
+ public static void main(String[] args) throws IOException, CryptographyException
+ {
+ PDDocument pdf = null;
+ try
+ {
+ if( args.length != 1 )
+ {
+ usage();
+ }
+ else
+ {
+ pdf = PDDocument.load( args[0] );
+ PrintFields exporter = new PrintFields();
+ if( pdf.isEncrypted() )
+ {
+ try
+ {
+ pdf.decrypt( "" );
+ }
+ catch( InvalidPasswordException e )
+ {
+ System.err.println( "Error: The document is encrypted." );
+ usage();
+ }
+ }
+ exporter.printFields( pdf );
+ }
+ }
+ finally
+ {
+ if( pdf != null )
+ {
+ pdf.close();
+ }
+ }
+ }
+ /**
+ * This will print out a message telling how to use this example.
+ */
+ private static void usage()
+ {
+ System.err.println( "usage: org.pdfbox.examples.fdf.PrintFields <pdf-file>" );
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/examples/fdf/SetField.java b/src/main/java/org/pdfbox/examples/fdf/SetField.java
new file mode 100644
index 0000000..904feeb
--- /dev/null
+++ b/src/main/java/org/pdfbox/examples/fdf/SetField.java
@@ -0,0 +1,128 @@
+/**
+ * Copyright (c) 2003-2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.examples.fdf;
+
+import java.io.IOException;
+
+import org.pdfbox.pdmodel.interactive.form.PDAcroForm;
+import org.pdfbox.pdmodel.interactive.form.PDField;
+
+import org.pdfbox.pdmodel.PDDocument;
+import org.pdfbox.pdmodel.PDDocumentCatalog;
+
+import org.pdfbox.exceptions.COSVisitorException;
+
+import org.pdfbox.examples.AbstractExample;
+
+/**
+ * This example will take a PDF document and set a FDF field in it.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.6 $
+ */
+public class SetField extends AbstractExample
+{
+
+ /**
+ * This will set a single field in the document.
+ *
+ * @param pdfDocument The PDF to set the field in.
+ * @param name The name of the field to set.
+ * @param value The new value of the field.
+ *
+ * @throws IOException If there is an error setting the field.
+ */
+ public void setField( PDDocument pdfDocument, String name, String value ) throws IOException
+ {
+ PDDocumentCatalog docCatalog = pdfDocument.getDocumentCatalog();
+ PDAcroForm acroForm = docCatalog.getAcroForm();
+ PDField field = acroForm.getField( name );
+ if( field != null )
+ {
+ field.setValue( value );
+ }
+ else
+ {
+ System.err.println( "No field found with name:" + name );
+ }
+
+ }
+
+ /**
+ * This will read a PDF file and set a field and then write it the pdf out again.
+ * <br />
+ * see usage() for commandline
+ *
+ * @param args command line arguments
+ *
+ * @throws IOException If there is an error importing the FDF document.
+ * @throws COSVisitorException If there is an error writing the PDF.
+ */
+ public static void main(String[] args) throws IOException, COSVisitorException
+ {
+ SetField setter = new SetField();
+ setter.setField( args );
+ }
+
+ private void setField( String[] args ) throws IOException, COSVisitorException
+ {
+ PDDocument pdf = null;
+ try
+ {
+ if( args.length != 3 )
+ {
+ usage();
+ }
+ else
+ {
+ SetField example = new SetField();
+
+ pdf = PDDocument.load( args[0] );
+ example.setField( pdf, args[1], args[2] );
+ pdf.save( args[0] );
+ }
+ }
+ finally
+ {
+ if( pdf != null )
+ {
+ pdf.close();
+ }
+ }
+ }
+ /**
+ * This will print out a message telling how to use this example.
+ */
+ private static void usage()
+ {
+ System.err.println( "usage: org.pdfbox.examples.fdf.SetField <pdf-file> <field-name> <field-value>" );
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/examples/fdf/package.html b/src/main/java/org/pdfbox/examples/fdf/package.html
new file mode 100644
index 0000000..5c80aca
--- /dev/null
+++ b/src/main/java/org/pdfbox/examples/fdf/package.html
@@ -0,0 +1,9 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head>
+
+</head>
+<body>
+These are examples that use the FDF features of a PDF document.
+</body>
+</html>
diff --git a/src/main/java/org/pdfbox/examples/package.html b/src/main/java/org/pdfbox/examples/package.html
new file mode 100644
index 0000000..fe059eb
--- /dev/null
+++ b/src/main/java/org/pdfbox/examples/package.html
@@ -0,0 +1,9 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head>
+
+</head>
+<body>
+The packages in this package will show how to use the PDFBox API.
+</body>
+</html>
diff --git a/src/main/java/org/pdfbox/examples/pdmodel/AddJavascript.java b/src/main/java/org/pdfbox/examples/pdmodel/AddJavascript.java
new file mode 100644
index 0000000..d04700e
--- /dev/null
+++ b/src/main/java/org/pdfbox/examples/pdmodel/AddJavascript.java
@@ -0,0 +1,96 @@
+/**
+ * Copyright (c) 2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.examples.pdmodel;
+
+import org.pdfbox.pdmodel.PDDocument;
+import org.pdfbox.pdmodel.interactive.action.type.PDActionJavaScript;
+
+import java.io.IOException;
+
+/**
+ * This is an example of how to set some javascript in the document.
+ *
+ * @author Ben Litchfield (ben@benlitchfield.com)
+ * @version $Revision: 1.2 $
+ */
+public class AddJavascript
+{
+ private AddJavascript()
+ {
+ //static class, should not be instantiated.
+ }
+
+ /**
+ * This will print the documents data.
+ *
+ * @param args The command line arguments.
+ *
+ * @throws Exception If there is an error parsing the document.
+ */
+ public static void main( String[] args ) throws Exception
+ {
+ if( args.length != 2 )
+ {
+ usage();
+ }
+ else
+ {
+ PDDocument document = null;
+ try
+ {
+ document = PDDocument.load( args[0] );
+ PDActionJavaScript javascript = new PDActionJavaScript(
+ "app.alert( {cMsg: 'PDFBox rocks!', nIcon: 3, nType: 0, cTitle: 'PDFBox Javascript example' } );");
+ document.getDocumentCatalog().setOpenAction( javascript );
+ if( document.isEncrypted() )
+ {
+ throw new IOException( "Encrypted documents are not supported for this example" );
+ }
+ document.save( args[1] );
+ }
+ finally
+ {
+ if( document != null )
+ {
+ document.close();
+ }
+ }
+ }
+ }
+
+ /**
+ * This will print the usage for this document.
+ */
+ private static void usage()
+ {
+ System.err.println( "Usage: java org.pdfbox.examples.pdmodel.AddJavascript <input-pdf> <output-pdf>" );
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/examples/pdmodel/AddMessageToEachPage.java b/src/main/java/org/pdfbox/examples/pdmodel/AddMessageToEachPage.java
new file mode 100644
index 0000000..efb6ec1
--- /dev/null
+++ b/src/main/java/org/pdfbox/examples/pdmodel/AddMessageToEachPage.java
@@ -0,0 +1,148 @@
+/**
+ * Copyright (c) 2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.examples.pdmodel;
+
+import java.io.IOException;
+import java.util.List;
+
+import org.pdfbox.exceptions.COSVisitorException;
+
+import org.pdfbox.pdmodel.PDDocument;
+import org.pdfbox.pdmodel.PDPage;
+
+import org.pdfbox.pdmodel.common.PDRectangle;
+import org.pdfbox.pdmodel.edit.PDPageContentStream;
+
+import org.pdfbox.pdmodel.font.PDFont;
+import org.pdfbox.pdmodel.font.PDType1Font;
+
+
+/**
+ * This is an example of how to add a message to every page
+ * in a pdf document.
+ *
+ * @author Ben Litchfield (ben@benlitchfield.com)
+ * @version $Revision: 1.2 $
+ */
+public class AddMessageToEachPage
+{
+ /**
+ * Constructor.
+ */
+ public AddMessageToEachPage()
+ {
+ super();
+ }
+
+ /**
+ * create the second sample document from the PDF file format specification.
+ *
+ * @param file The file to write the PDF to.
+ * @param message The message to write in the file.
+ * @param outfile The resulting PDF.
+ *
+ * @throws IOException If there is an error writing the data.
+ * @throws COSVisitorException If there is an error writing the PDF.
+ */
+ public void doIt( String file, String message, String outfile ) throws IOException, COSVisitorException
+ {
+ // the document
+ PDDocument doc = null;
+ try
+ {
+ doc = PDDocument.load( file );
+
+ List allPages = doc.getDocumentCatalog().getAllPages();
+ PDFont font = PDType1Font.HELVETICA_BOLD;
+ float fontSize = 12.0f;
+
+ for( int i=0; i<allPages.size(); i++ )
+ {
+ PDPage page = (PDPage)allPages.get( i );
+ PDRectangle pageSize = page.findMediaBox();
+ float stringWidth = font.getStringWidth( message );
+ float centeredPosition = (pageSize.getWidth() - (stringWidth*fontSize)/1000f)/2f;
+ PDPageContentStream contentStream = new PDPageContentStream(doc, page, true, true);
+ contentStream.beginText();
+ contentStream.setFont( font, fontSize );
+ contentStream.moveTextPositionByAmount( centeredPosition, 30 );
+ contentStream.drawString( message );
+ contentStream.endText();
+ contentStream.close();
+ }
+
+
+ doc.save( outfile );
+ }
+ finally
+ {
+ if( doc != null )
+ {
+ doc.close();
+ }
+ }
+ }
+
+ /**
+ * This will create a hello world PDF document.
+ * <br />
+ * see usage() for commandline
+ *
+ * @param args Command line arguments.
+ */
+ public static void main(String[] args)
+ {
+ AddMessageToEachPage app = new AddMessageToEachPage();
+ try
+ {
+ if( args.length != 3 )
+ {
+ app.usage();
+ }
+ else
+ {
+ app.doIt( args[0], args[1], args[2] );
+ }
+ }
+ catch (Exception e)
+ {
+ e.printStackTrace();
+ }
+ }
+
+ /**
+ * This will print out a message telling how to use this example.
+ */
+ private void usage()
+ {
+ System.err.println( "usage: " + this.getClass().getName() + " <input-file> <Message> <output-file>" );
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/examples/pdmodel/AddMetadataFromDocInfo.java b/src/main/java/org/pdfbox/examples/pdmodel/AddMetadataFromDocInfo.java
new file mode 100644
index 0000000..35080cd
--- /dev/null
+++ b/src/main/java/org/pdfbox/examples/pdmodel/AddMetadataFromDocInfo.java
@@ -0,0 +1,180 @@
+/**
+ * Copyright (c) 2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.examples.pdmodel;
+
+import org.pdfbox.pdmodel.PDDocument;
+import org.pdfbox.pdmodel.PDDocumentCatalog;
+import org.pdfbox.pdmodel.PDDocumentInformation;
+import org.pdfbox.pdmodel.common.PDMetadata;
+import org.pdfbox.util.DateConverter;
+
+import java.io.ByteArrayInputStream;
+import java.util.Calendar;
+import java.util.GregorianCalendar;
+
+/**
+ * This is an example on how to add metadata to a document.
+ *
+ * Usage: java org.pdfbox.examples.pdmodel.AddMetadataToDocument &lt;input-pdf&gt; &lt;output-pdf&gt;
+ *
+ * @author Ben Litchfield (ben@benlitchfield.com)
+ * @version $Revision: 1.2 $
+ */
+public class AddMetadataFromDocInfo
+{
+ private static final String PADDING =
+ " " +
+ " " +
+ " " +
+ " " +
+ " " +
+ " " +
+ " " +
+ " " +
+ " " +
+ " " +
+ " " +
+ " ";
+
+
+
+ private AddMetadataFromDocInfo()
+ {
+ //utility class
+ }
+
+ /**
+ * This will print the documents data.
+ *
+ * @param args The command line arguments.
+ *
+ * @throws Exception If there is an error parsing the document.
+ */
+ public static void main( String[] args ) throws Exception
+ {
+ if( args.length != 2 )
+ {
+ usage();
+ }
+ else
+ {
+ PDDocument document = null;
+
+ try
+ {
+ document = PDDocument.load( args[0] );
+ if( document.isEncrypted() )
+ {
+ System.err.println( "Error: Cannot add metadata to encrypted document." );
+ System.exit( 1 );
+ }
+ PDDocumentCatalog catalog = document.getDocumentCatalog();
+ PDDocumentInformation info = document.getDocumentInformation();
+
+ //Right now, PDFBox does not have any XMP library, so we will
+ //just consruct the XML by hand.
+ StringBuffer xmp= new StringBuffer();
+ xmp.append(
+ "<?xpacket begin='' id='W5M0MpCehiHzreSzNTczkc9d'?>\n" +
+ "<?adobe-xap-filters esc=\"CRLF\"?>\n" +
+ "<x:xmpmeta>\n" +
+ " <rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#'>\n" +
+ " <rdf:Description rdf:about='' xmlns:pdf='http://ns.adobe.com/pdf/1.3/' " +
+ "pdf:Keywords='" + fixNull( info.getKeywords() ) + "' " +
+ "pdf:Producer='" + fixNull( info.getProducer() ) + "'></rdf:Description>\n" +
+ " <rdf:Description rdf:about='' xmlns:xap='http://ns.adobe.com/xap/1.0/' " +
+ "xap:ModifyDate='" + fixNull( info.getModificationDate() ) + "' " +
+ "xap:CreateDate='" + fixNull( info.getCreationDate() ) + "' " +
+ "xap:CreatorTool='" + fixNull( info.getCreator() ) + "' " +
+ "xap:MetadataDate='" + fixNull( new GregorianCalendar() )+ "'>\n" +
+ " </rdf:Description>\n" +
+ " <rdf:Description rdf:about='' xmlns:dc='http://purl.org/dc/elements/1.1/' " +
+ "dc:format='application/pdf'>\n" +
+ " <dc:title>\n" +
+ " <rdf:Alt>\n" +
+ " <rdf:li xml:lang='x-default'>" + fixNull( info.getTitle() ) +"</rdf:li>\n" +
+ " </rdf:Alt>\n" +
+ " </dc:title>\n" +
+ " <dc:creator>\n" +
+ " <rdf:Seq>\n" +
+ " <rdf:li>PDFBox.org</rdf:li>\n" +
+ " </rdf:Seq>\n" +
+ " </dc:creator>\n" +
+ " <dc:description>\n" +
+ " <rdf:Alt>\n" +
+ " <rdf:li xml:lang='x-default'>" + fixNull( info.getSubject() ) +"</rdf:li>\n" +
+ " </rdf:Alt>\n" +
+ " </dc:description>\n" +
+ " </rdf:Description>\n" +
+ " </rdf:RDF>\n" +
+ "</x:xmpmeta>\n" );
+
+ //xmp spec says we should put padding, so that the metadata can be appended to
+ //in place
+ xmp.append( PADDING );
+ xmp.append( PADDING );
+ xmp.append( PADDING );
+ xmp.append( "\n<?xpacket end='w'?>" );
+ ByteArrayInputStream mdInput = new ByteArrayInputStream( xmp.toString().getBytes() );
+ PDMetadata metadataStream = new PDMetadata(document, mdInput, false );
+ catalog.setMetadata( metadataStream );
+
+
+ document.save( args[1] );
+ }
+ finally
+ {
+ if( document != null )
+ {
+ document.close();
+ }
+ }
+ }
+ }
+
+ private static String fixNull( String string )
+ {
+ return string == null ? "" : string;
+ }
+
+ private static String fixNull( Calendar cal )
+ {
+ return cal == null ? "" : DateConverter.toISO8601( cal );
+ }
+
+ /**
+ * This will print the usage for this document.
+ */
+ private static void usage()
+ {
+ System.err.println( "Usage: java org.pdfbox.examples.pdmodel.AddMetadata <input-pdf> <output-pdf>" );
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/examples/pdmodel/CreateBlankPDF.java b/src/main/java/org/pdfbox/examples/pdmodel/CreateBlankPDF.java
new file mode 100644
index 0000000..6d942ac
--- /dev/null
+++ b/src/main/java/org/pdfbox/examples/pdmodel/CreateBlankPDF.java
@@ -0,0 +1,123 @@
+/**
+ * Copyright (c) 2003, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.examples.pdmodel;
+
+import java.io.FileOutputStream;
+import java.io.IOException;
+
+import org.pdfbox.exceptions.COSVisitorException;
+
+import org.pdfbox.pdfwriter.COSWriter;
+
+import org.pdfbox.pdmodel.PDDocument;
+import org.pdfbox.pdmodel.PDPage;
+
+/**
+ * This will create a blank PDF and write the contents to a file.
+ *
+ * usage: java org.pdfbox.examples.pdmodel.CreateBlankPDF &lt;outputfile.pdf&gt;
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.7 $
+ */
+public class CreateBlankPDF
+{
+
+ /**
+ * This will create a blank PDF and write the contents to a file.
+ *
+ * @param file The name of the file to write to.
+ *
+ * @throws IOException If there is an error writing the data.
+ * @throws COSVisitorException If there is an error while generating the document.
+ */
+ public void create( String file ) throws IOException, COSVisitorException
+ {
+ PDDocument document = null;
+ FileOutputStream output = null;
+ COSWriter writer = null;
+ try
+ {
+ document = new PDDocument();
+ //Every document requires at least one page, so we will add one
+ //blank page.
+ PDPage blankPage = new PDPage();
+ document.addPage( blankPage );
+ output = new FileOutputStream( file );
+ writer = new COSWriter( output );
+ writer.write( document.getDocument() );
+ }
+ finally
+ {
+ if( writer != null )
+ {
+ writer.close();
+ }
+ if( output != null )
+ {
+ output.close();
+ }
+ if( document != null )
+ {
+ document.close();
+ }
+ }
+ }
+
+ /**
+ * This will create a blank document.
+ *
+ * @param args The command line arguments.
+ *
+ * @throws IOException If there is an error writing the document data.
+ * @throws COSVisitorException If there is an error generating the data.
+ */
+ public static void main( String[] args ) throws IOException, COSVisitorException
+ {
+ if( args.length != 1 )
+ {
+ usage();
+ }
+ else
+ {
+ CreateBlankPDF creator = new CreateBlankPDF();
+ creator.create( args[0] );
+ }
+ }
+
+ /**
+ * This will print the usage of this class.
+ */
+ private static void usage()
+ {
+ System.err.println( "usage: java org.pdfbox.examples.pdmodel.CreateBlankPDF <outputfile.pdf>" );
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/examples/pdmodel/CreateBookmarks.java b/src/main/java/org/pdfbox/examples/pdmodel/CreateBookmarks.java
new file mode 100644
index 0000000..88c09fb
--- /dev/null
+++ b/src/main/java/org/pdfbox/examples/pdmodel/CreateBookmarks.java
@@ -0,0 +1,119 @@
+/**
+ * Copyright (c) 2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.examples.pdmodel;
+
+import org.pdfbox.pdmodel.PDDocument;
+import org.pdfbox.pdmodel.PDPage;
+import org.pdfbox.pdmodel.interactive.documentnavigation.destination.PDPageFitWidthDestination;
+import org.pdfbox.pdmodel.interactive.documentnavigation.outline.PDDocumentOutline;
+import org.pdfbox.pdmodel.interactive.documentnavigation.outline.PDOutlineItem;
+
+import java.util.List;
+
+/**
+ * This is an example on how to add bookmarks to a PDF document. It simply
+ * adds 1 bookmark for every page.
+ *
+ * Usage: java org.pdfbox.examples.pdmodel.CreateBookmarks &lt;input-pdf&gt; &lt;output-pdf&gt;
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.1 $
+ */
+public class CreateBookmarks
+{
+ private CreateBookmarks()
+ {
+ //utility class
+ }
+
+ /**
+ * This will print the documents data.
+ *
+ * @param args The command line arguments.
+ *
+ * @throws Exception If there is an error parsing the document.
+ */
+ public static void main( String[] args ) throws Exception
+ {
+ if( args.length != 2 )
+ {
+ usage();
+ }
+ else
+ {
+ PDDocument document = null;
+ try
+ {
+ document = PDDocument.load( args[0] );
+ if( document.isEncrypted() )
+ {
+ System.err.println( "Error: Cannot add bookmarks to encrypted document." );
+ System.exit( 1 );
+ }
+ PDDocumentOutline outline = new PDDocumentOutline();
+ document.getDocumentCatalog().setDocumentOutline( outline );
+ PDOutlineItem pagesOutline = new PDOutlineItem();
+ pagesOutline.setTitle( "All Pages" );
+ outline.appendChild( pagesOutline );
+ List pages = document.getDocumentCatalog().getAllPages();
+ for( int i=0; i<pages.size(); i++ )
+ {
+ PDPage page = (PDPage)pages.get( i );
+ PDPageFitWidthDestination dest = new PDPageFitWidthDestination();
+ dest.setPage( page );
+ PDOutlineItem bookmark = new PDOutlineItem();
+ bookmark.setDestination( dest );
+ bookmark.setTitle( "Page " + (i+1) );
+ pagesOutline.appendChild( bookmark );
+ }
+ pagesOutline.openNode();
+ outline.openNode();
+
+ document.save( args[1] );
+ }
+ finally
+ {
+ if( document != null )
+ {
+ document.close();
+ }
+ }
+ }
+ }
+
+ /**
+ * This will print the usage for this document.
+ */
+ private static void usage()
+ {
+ System.err.println( "Usage: java org.pdfbox.examples.pdmodel.CreateBookmarks <input-pdf> <output-pdf>" );
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/examples/pdmodel/EmbeddedFiles.java b/src/main/java/org/pdfbox/examples/pdmodel/EmbeddedFiles.java
new file mode 100644
index 0000000..86bc447
--- /dev/null
+++ b/src/main/java/org/pdfbox/examples/pdmodel/EmbeddedFiles.java
@@ -0,0 +1,170 @@
+/**
+ * Copyright (c) 2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.examples.pdmodel;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.util.GregorianCalendar;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.pdfbox.exceptions.COSVisitorException;
+
+import org.pdfbox.pdmodel.PDDocument;
+import org.pdfbox.pdmodel.PDDocumentNameDictionary;
+import org.pdfbox.pdmodel.PDEmbeddedFilesNameTreeNode;
+import org.pdfbox.pdmodel.PDPage;
+
+import org.pdfbox.pdmodel.common.filespecification.PDComplexFileSpecification;
+import org.pdfbox.pdmodel.common.filespecification.PDEmbeddedFile;
+import org.pdfbox.pdmodel.edit.PDPageContentStream;
+
+import org.pdfbox.pdmodel.font.PDFont;
+import org.pdfbox.pdmodel.font.PDType1Font;
+
+
+/**
+ * This is an example that creates a simple document and embeds a file into it..
+ *
+ * @author Ben Litchfield (ben@benlitchfield.com)
+ * @version $Revision: 1.1 $
+ */
+public class EmbeddedFiles
+{
+ /**
+ * Constructor.
+ */
+ public EmbeddedFiles()
+ {
+ super();
+ }
+
+ /**
+ * create the second sample document from the PDF file format specification.
+ *
+ * @param file The file to write the PDF to.
+ *
+ * @throws IOException If there is an error writing the data.
+ * @throws COSVisitorException If there is an error writing the PDF.
+ */
+ public void doIt( String file) throws IOException, COSVisitorException
+ {
+ // the document
+ PDDocument doc = null;
+ try
+ {
+ doc = new PDDocument();
+
+ PDPage page = new PDPage();
+ doc.addPage( page );
+ PDFont font = PDType1Font.HELVETICA_BOLD;
+
+ PDPageContentStream contentStream = new PDPageContentStream(doc, page);
+ contentStream.beginText();
+ contentStream.setFont( font, 12 );
+ contentStream.moveTextPositionByAmount( 100, 700 );
+ contentStream.drawString( "Go to Document->File Attachments to View Embedded Files" );
+ contentStream.endText();
+ contentStream.close();
+
+ //embedded files are stored in a named tree
+ PDEmbeddedFilesNameTreeNode efTree = new PDEmbeddedFilesNameTreeNode();
+
+
+ //first create the file specification, which holds the embedded file
+ PDComplexFileSpecification fs = new PDComplexFileSpecification();
+ fs.setFile( "Test.txt" );
+ //create a dummy file stream, this would probably normally be a FileInputStream
+ byte[] data = "This is the contents of the embedded file".getBytes();
+ ByteArrayInputStream fakeFile =
+ new ByteArrayInputStream( data );
+ PDEmbeddedFile ef = new PDEmbeddedFile(doc, fakeFile );
+ //now lets some of the optional parameters
+ ef.setSubtype( "test/plain" );
+ ef.setSize( data.length );
+ ef.setCreationDate( new GregorianCalendar() );
+ fs.setEmbeddedFile( ef );
+
+ //now add the entry to the embedded file tree and set in the document.
+ Map efMap = new HashMap();
+ efMap.put( "My first attachment", fs );
+ efTree.setNames( efMap );
+ PDDocumentNameDictionary names = new PDDocumentNameDictionary( doc.getDocumentCatalog() );
+ names.setEmbeddedFiles( efTree );
+ doc.getDocumentCatalog().setNames( names );
+
+
+ doc.save( file );
+ }
+ finally
+ {
+ if( doc != null )
+ {
+ doc.close();
+ }
+ }
+ }
+
+ /**
+ * This will create a hello world PDF document with an embedded file.
+ * <br />
+ * see usage() for commandline
+ *
+ * @param args Command line arguments.
+ */
+ public static void main(String[] args)
+ {
+ EmbeddedFiles app = new EmbeddedFiles();
+ try
+ {
+ if( args.length != 1 )
+ {
+ app.usage();
+ }
+ else
+ {
+ app.doIt( args[0] );
+ }
+ }
+ catch (Exception e)
+ {
+ e.printStackTrace();
+ }
+ }
+
+ /**
+ * This will print out a message telling how to use this example.
+ */
+ private void usage()
+ {
+ System.err.println( "usage: " + this.getClass().getName() + " <output-file>" );
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/examples/pdmodel/HelloWorld.java b/src/main/java/org/pdfbox/examples/pdmodel/HelloWorld.java
new file mode 100644
index 0000000..9bceca7
--- /dev/null
+++ b/src/main/java/org/pdfbox/examples/pdmodel/HelloWorld.java
@@ -0,0 +1,137 @@
+/**
+ * Copyright (c) 2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.examples.pdmodel;
+
+import java.io.IOException;
+
+import org.pdfbox.exceptions.COSVisitorException;
+
+import org.pdfbox.pdmodel.PDDocument;
+import org.pdfbox.pdmodel.PDPage;
+
+import org.pdfbox.pdmodel.edit.PDPageContentStream;
+
+import org.pdfbox.pdmodel.font.PDFont;
+import org.pdfbox.pdmodel.font.PDType1Font;
+
+
+/**
+ * This is an example that creates a simple document.
+ *
+ * The example is taken from the pdf file format specification.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.5 $
+ */
+public class HelloWorld
+{
+ /**
+ * Constructor.
+ */
+ public HelloWorld()
+ {
+ super();
+ }
+
+ /**
+ * create the second sample document from the PDF file format specification.
+ *
+ * @param file The file to write the PDF to.
+ * @param message The message to write in the file.
+ *
+ * @throws IOException If there is an error writing the data.
+ * @throws COSVisitorException If there is an error writing the PDF.
+ */
+ public void doIt( String file, String message) throws IOException, COSVisitorException
+ {
+ // the document
+ PDDocument doc = null;
+ try
+ {
+ doc = new PDDocument();
+
+ PDPage page = new PDPage();
+ doc.addPage( page );
+ PDFont font = PDType1Font.HELVETICA_BOLD;
+
+ PDPageContentStream contentStream = new PDPageContentStream(doc, page);
+ contentStream.beginText();
+ contentStream.setFont( font, 12 );
+ contentStream.moveTextPositionByAmount( 100, 700 );
+ contentStream.drawString( message );
+ contentStream.endText();
+ contentStream.close();
+ doc.save( file );
+ }
+ finally
+ {
+ if( doc != null )
+ {
+ doc.close();
+ }
+ }
+ }
+
+ /**
+ * This will create a hello world PDF document.
+ * <br />
+ * see usage() for commandline
+ *
+ * @param args Command line arguments.
+ */
+ public static void main(String[] args)
+ {
+ HelloWorld app = new HelloWorld();
+ try
+ {
+ if( args.length != 2 )
+ {
+ app.usage();
+ }
+ else
+ {
+ app.doIt( args[0], args[1] );
+ }
+ }
+ catch (Exception e)
+ {
+ e.printStackTrace();
+ }
+ }
+
+ /**
+ * This will print out a message telling how to use this example.
+ */
+ private void usage()
+ {
+ System.err.println( "usage: " + this.getClass().getName() + " <output-file> <Message>" );
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/examples/pdmodel/HelloWorldTTF.java b/src/main/java/org/pdfbox/examples/pdmodel/HelloWorldTTF.java
new file mode 100644
index 0000000..16b1423
--- /dev/null
+++ b/src/main/java/org/pdfbox/examples/pdmodel/HelloWorldTTF.java
@@ -0,0 +1,134 @@
+/**
+ * Copyright (c) 2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+
+package org.pdfbox.examples.pdmodel;
+
+import java.io.IOException;
+
+import org.pdfbox.exceptions.COSVisitorException;
+import org.pdfbox.pdmodel.PDDocument;
+import org.pdfbox.pdmodel.PDPage;
+import org.pdfbox.pdmodel.edit.PDPageContentStream;
+import org.pdfbox.pdmodel.font.PDFont;
+import org.pdfbox.pdmodel.font.PDTrueTypeFont;
+
+/**
+ * This is an example that creates a simple document
+ * with a ttf-font.
+ *
+ * @author <a href="mailto:m.g.n@gmx.de">Michael Niedermair</a>
+ * @version $Revision: 1.2 $
+ */
+public class HelloWorldTTF
+{
+
+ /**
+ * create the second sample document from the PDF file format specification.
+ *
+ * @param file The file to write the PDF to.
+ * @param message The message to write in the file.
+ * @param fontfile The ttf-font file.
+ *
+ * @throws IOException If there is an error writing the data.
+ * @throws COSVisitorException If there is an error writing the PDF.
+ */
+ public void doIt(final String file, final String message,
+ final String fontfile) throws IOException, COSVisitorException
+ {
+
+ // the document
+ PDDocument doc = null;
+ try
+ {
+ doc = new PDDocument();
+
+ PDPage page = new PDPage();
+ doc.addPage(page);
+ PDFont font = PDTrueTypeFont.loadTTF(doc, fontfile);
+
+ PDPageContentStream contentStream = new PDPageContentStream(doc,
+ page);
+ contentStream.beginText();
+ contentStream.setFont(font, 12);
+ contentStream.moveTextPositionByAmount(100, 700);
+ contentStream.drawString(message);
+ contentStream.endText();
+ contentStream.close();
+ doc.save(file);
+ System.out.println(file + " created!");
+ }
+ finally
+ {
+ if (doc != null)
+ {
+ doc.close();
+ }
+ }
+ }
+
+ /**
+ * This will create a hello world PDF document
+ * with a ttf-font.
+ * <br />
+ * see usage() for commandline
+ *
+ * @param args Command line arguments.
+ */
+ public static void main(String[] args)
+ {
+
+ HelloWorldTTF app = new HelloWorldTTF();
+ try
+ {
+ if (args.length != 3)
+ {
+ app.usage();
+ }
+ else
+ {
+ app.doIt(args[0], args[1], args[2]);
+ }
+ }
+ catch (Exception e)
+ {
+ e.printStackTrace();
+ }
+ }
+
+ /**
+ * This will print out a message telling how to use this example.
+ */
+ private void usage()
+ {
+ System.err.println("usage: " + this.getClass().getName()
+ + " <output-file> <Message> <ttf-file>");
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/examples/pdmodel/HelloWorldType1AfmPfb.java b/src/main/java/org/pdfbox/examples/pdmodel/HelloWorldType1AfmPfb.java
new file mode 100644
index 0000000..2457a2e
--- /dev/null
+++ b/src/main/java/org/pdfbox/examples/pdmodel/HelloWorldType1AfmPfb.java
@@ -0,0 +1,134 @@
+/**
+ * Copyright (c) 2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+
+package org.pdfbox.examples.pdmodel;
+
+import java.io.IOException;
+
+import org.pdfbox.exceptions.COSVisitorException;
+import org.pdfbox.pdmodel.PDDocument;
+import org.pdfbox.pdmodel.PDPage;
+import org.pdfbox.pdmodel.edit.PDPageContentStream;
+import org.pdfbox.pdmodel.font.PDFont;
+import org.pdfbox.pdmodel.font.PDType1AfmPfbFont;
+
+/**
+ * This is an example that creates a simple document
+ * with a Type 1 font (afm + pfb).
+ *
+ * @author <a href="mailto:m.g.n@gmx.de">Michael Niedermair</a>
+ * @version $Revision: 1.2 $
+ */
+public class HelloWorldType1AfmPfb
+{
+
+ /**
+ * create the second sample document from the PDF file format specification.
+ *
+ * @param file The file to write the PDF to.
+ * @param message The message to write in the file.
+ * @param fontfile The ttf-font file.
+ *
+ * @throws IOException If there is an error writing the data.
+ * @throws COSVisitorException If there is an error writing the PDF.
+ */
+ public void doIt(final String file, final String message,
+ final String fontfile) throws IOException, COSVisitorException
+ {
+
+ // the document
+ PDDocument doc = null;
+ try
+ {
+ doc = new PDDocument();
+
+ PDPage page = new PDPage();
+ doc.addPage(page);
+ PDFont font = new PDType1AfmPfbFont(doc,fontfile);
+
+ PDPageContentStream contentStream = new PDPageContentStream(doc,
+ page);
+ contentStream.beginText();
+ contentStream.setFont(font, 12);
+ contentStream.moveTextPositionByAmount(100, 700);
+ contentStream.drawString(message);
+ contentStream.endText();
+ contentStream.close();
+ doc.save(file);
+ System.out.println(file + " created!");
+ }
+ finally
+ {
+ if (doc != null)
+ {
+ doc.close();
+ }
+ }
+ }
+
+ /**
+ * This will create a hello world PDF document
+ * with a ttf-font.
+ * <br />
+ * see usage() for commandline
+ *
+ * @param args Command line arguments.
+ */
+ public static void main(String[] args)
+ {
+
+ HelloWorldType1AfmPfb app = new HelloWorldType1AfmPfb();
+ try
+ {
+ if (args.length != 3)
+ {
+ app.usage();
+ }
+ else
+ {
+ app.doIt(args[0], args[1], args[2]);
+ }
+ }
+ catch (Exception e)
+ {
+ e.printStackTrace();
+ }
+ }
+
+ /**
+ * This will print out a message telling how to use this example.
+ */
+ private void usage()
+ {
+ System.err.println("usage: " + this.getClass().getName()
+ + " <output-file> <Message> <afm-file>");
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/examples/pdmodel/ImageToPDF.java b/src/main/java/org/pdfbox/examples/pdmodel/ImageToPDF.java
new file mode 100644
index 0000000..9faf79d
--- /dev/null
+++ b/src/main/java/org/pdfbox/examples/pdmodel/ImageToPDF.java
@@ -0,0 +1,146 @@
+/**
+ * Copyright (c) 2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.examples.pdmodel;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.RandomAccessFile;
+
+import org.pdfbox.exceptions.COSVisitorException;
+
+import org.pdfbox.pdmodel.PDDocument;
+import org.pdfbox.pdmodel.PDPage;
+
+import org.pdfbox.pdmodel.edit.PDPageContentStream;
+
+import org.pdfbox.pdmodel.graphics.xobject.PDCcitt;
+import org.pdfbox.pdmodel.graphics.xobject.PDJpeg;
+import org.pdfbox.pdmodel.graphics.xobject.PDXObjectImage;
+
+
+/**
+ * This is an example that creates a simple document.
+ *
+ * The example is taken from the pdf file format specification.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.5 $
+ */
+public class ImageToPDF
+{
+
+ /**
+ * create the second sample document from the PDF file format specification.
+ *
+ * @param file The file to write the PDF to.
+ * @param image The filename of the image to put in the PDF.
+ *
+ * @throws IOException If there is an error writing the data.
+ * @throws COSVisitorException If there is an error writing the PDF.
+ */
+ public void createPDFFromImage( String file, String image) throws IOException, COSVisitorException
+ {
+ // the document
+ PDDocument doc = null;
+ try
+ {
+ doc = new PDDocument();
+
+ PDPage page = new PDPage();
+ doc.addPage( page );
+
+ PDXObjectImage ximage = null;
+ if( image.toLowerCase().endsWith( ".jpg" ) )
+ {
+ ximage = new PDJpeg(doc, new FileInputStream( image ) );
+ }
+ else if (image.toLowerCase().endsWith(".tif") || image.toLowerCase().endsWith(".tiff"))
+ {
+ ximage = new PDCcitt(doc, new RandomAccessFile(new File(image),"r"));
+ }
+ else
+ {
+ //BufferedImage awtImage = ImageIO.read( new File( image ) );
+ //ximage = new PDPixelMap(doc, awtImage);
+ throw new IOException( "Image type not supported:" + image );
+ }
+ PDPageContentStream contentStream = new PDPageContentStream(doc, page);
+
+ contentStream.drawImage( ximage, 20, 20 );
+
+ contentStream.close();
+ doc.save( file );
+ }
+ finally
+ {
+ if( doc != null )
+ {
+ doc.close();
+ }
+ }
+ }
+
+ /**
+ * This will create a PDF document with a single image on it.
+ * <br />
+ * see usage() for commandline
+ *
+ * @param args Command line arguments.
+ */
+ public static void main(String[] args)
+ {
+ ImageToPDF app = new ImageToPDF();
+ try
+ {
+ if( args.length != 2 )
+ {
+ app.usage();
+ }
+ else
+ {
+ app.createPDFFromImage( args[0], args[1] );
+ }
+ }
+ catch (Exception e)
+ {
+ e.printStackTrace();
+ }
+ }
+
+ /**
+ * This will print out a message telling how to use this example.
+ */
+ private void usage()
+ {
+ System.err.println( "usage: " + this.getClass().getName() + " <output-file> <image>" );
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/examples/pdmodel/PrintBookmarks.java b/src/main/java/org/pdfbox/examples/pdmodel/PrintBookmarks.java
new file mode 100644
index 0000000..0a1a647
--- /dev/null
+++ b/src/main/java/org/pdfbox/examples/pdmodel/PrintBookmarks.java
@@ -0,0 +1,142 @@
+/**
+ * Copyright (c) 2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.examples.pdmodel;
+
+import org.pdfbox.exceptions.InvalidPasswordException;
+
+import org.pdfbox.pdfparser.PDFParser;
+
+import org.pdfbox.pdmodel.PDDocument;
+import org.pdfbox.pdmodel.interactive.documentnavigation.outline.PDDocumentOutline;
+import org.pdfbox.pdmodel.interactive.documentnavigation.outline.PDOutlineItem;
+import org.pdfbox.pdmodel.interactive.documentnavigation.outline.PDOutlineNode;
+
+import java.io.FileInputStream;
+import java.io.IOException;
+
+/**
+ * This is an example on how to access the bookmarks that are part of a pdf document.
+ *
+ * Usage: java org.pdfbox.examples.pdmodel.PrintBookmarks &lt;input-pdf&gt;
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.1 $
+ */
+public class PrintBookmarks
+{
+ /**
+ * This will print the documents data.
+ *
+ * @param args The command line arguments.
+ *
+ * @throws Exception If there is an error parsing the document.
+ */
+ public static void main( String[] args ) throws Exception
+ {
+ if( args.length != 1 )
+ {
+ usage();
+ }
+ else
+ {
+ PDDocument document = null;
+ FileInputStream file = null;
+ try
+ {
+ file = new FileInputStream( args[0] );
+ PDFParser parser = new PDFParser( file );
+ parser.parse();
+ document = parser.getPDDocument();
+ if( document.isEncrypted() )
+ {
+ try
+ {
+ document.decrypt( "" );
+ }
+ catch( InvalidPasswordException e )
+ {
+ System.err.println( "Error: Document is encrypted with a password." );
+ System.exit( 1 );
+ }
+ }
+ PrintBookmarks meta = new PrintBookmarks();
+ PDDocumentOutline outline = document.getDocumentCatalog().getDocumentOutline();
+ if( outline != null )
+ {
+ meta.printBookmark( outline, "" );
+ }
+ else
+ {
+ System.out.println( "This document does not contain any bookmarks" );
+ }
+ }
+ finally
+ {
+ if( file != null )
+ {
+ file.close();
+ }
+ if( document != null )
+ {
+ document.close();
+ }
+ }
+ }
+ }
+
+ /**
+ * This will print the usage for this document.
+ */
+ private static void usage()
+ {
+ System.err.println( "Usage: java org.pdfbox.examples.pdmodel.PrintBookmarks <input-pdf>" );
+ }
+
+ /**
+ * This will print the documents bookmarks to System.out.
+ *
+ * @param bookmark The bookmark to print out.
+ * @param indentation A pretty printing parameter
+ *
+ * @throws IOException If there is an error getting the page count.
+ */
+ public void printBookmark( PDOutlineNode bookmark, String indentation ) throws IOException
+ {
+ PDOutlineItem current = bookmark.getFirstChild();
+ while( current != null )
+ {
+ System.out.println( indentation + current.getTitle() );
+ printBookmark( current, indentation + " " );
+ current = current.getNextSibling();
+ }
+
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/examples/pdmodel/PrintDocumentMetaData.java b/src/main/java/org/pdfbox/examples/pdmodel/PrintDocumentMetaData.java
new file mode 100644
index 0000000..c096113
--- /dev/null
+++ b/src/main/java/org/pdfbox/examples/pdmodel/PrintDocumentMetaData.java
@@ -0,0 +1,165 @@
+/**
+ * Copyright (c) 2003-2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.examples.pdmodel;
+
+import org.pdfbox.exceptions.InvalidPasswordException;
+
+import org.pdfbox.pdfparser.PDFParser;
+
+import org.pdfbox.pdmodel.PDDocument;
+import org.pdfbox.pdmodel.PDDocumentCatalog;
+import org.pdfbox.pdmodel.PDDocumentInformation;
+import org.pdfbox.pdmodel.common.PDMetadata;
+
+import java.io.FileInputStream;
+import java.io.IOException;
+
+import java.text.SimpleDateFormat;
+
+import java.util.Calendar;
+
+/**
+ * This is an example on how to get a documents metadata information.
+ *
+ * Usage: java org.pdfbox.examples.pdmodel.PrintDocumentMetaData &lt;input-pdf&gt;
+ *
+ * @author Ben Litchfield (ben@benlitchfield.com)
+ * @version $Revision: 1.10 $
+ */
+public class PrintDocumentMetaData
+{
+ /**
+ * This will print the documents data.
+ *
+ * @param args The command line arguments.
+ *
+ * @throws Exception If there is an error parsing the document.
+ */
+ public static void main( String[] args ) throws Exception
+ {
+ if( args.length != 1 )
+ {
+ usage();
+ }
+ else
+ {
+ PDDocument document = null;
+ FileInputStream file = null;
+ try
+ {
+ file = new FileInputStream( args[0] );
+ PDFParser parser = new PDFParser( file );
+ parser.parse();
+ document = parser.getPDDocument();
+ if( document.isEncrypted() )
+ {
+ try
+ {
+ document.decrypt( "" );
+ }
+ catch( InvalidPasswordException e )
+ {
+ System.err.println( "Error: Document is encrypted with a password." );
+ System.exit( 1 );
+ }
+ }
+ PrintDocumentMetaData meta = new PrintDocumentMetaData();
+ meta.printMetadata( document );
+ }
+ finally
+ {
+ if( file != null )
+ {
+ file.close();
+ }
+ if( document != null )
+ {
+ document.close();
+ }
+ }
+ }
+ }
+
+ /**
+ * This will print the usage for this document.
+ */
+ private static void usage()
+ {
+ System.err.println( "Usage: java org.pdfbox.examples.pdmodel.PrintDocumentMetaData <input-pdf>" );
+ }
+
+ /**
+ * This will print the documents data to System.out.
+ *
+ * @param document The document to get the metadata from.
+ *
+ * @throws IOException If there is an error getting the page count.
+ */
+ public void printMetadata( PDDocument document ) throws IOException
+ {
+ PDDocumentInformation info = document.getDocumentInformation();
+ PDDocumentCatalog cat = document.getDocumentCatalog();
+ PDMetadata metadata = cat.getMetadata();
+ System.out.println( "Page Count=" + document.getNumberOfPages() );
+ System.out.println( "Title=" + info.getTitle() );
+ System.out.println( "Author=" + info.getAuthor() );
+ System.out.println( "Subject=" + info.getSubject() );
+ System.out.println( "Keywords=" + info.getKeywords() );
+ System.out.println( "Creator=" + info.getCreator() );
+ System.out.println( "Producer=" + info.getProducer() );
+ System.out.println( "Creation Date=" + formatDate( info.getCreationDate() ) );
+ System.out.println( "Modification Date=" + formatDate( info.getModificationDate() ) );
+ System.out.println( "Trapped=" + info.getTrapped() );
+ if( metadata != null )
+ {
+ System.out.println( "Metadata=" + metadata.getInputStreamAsString() );
+ }
+ }
+
+ /**
+ * This will format a date object.
+ *
+ * @param date The date to format.
+ *
+ * @return A string representation of the date.
+ */
+ private String formatDate( Calendar date )
+ {
+ String retval = null;
+ if( date != null )
+ {
+ SimpleDateFormat formatter = new SimpleDateFormat();
+ retval = formatter.format( date.getTime() );
+ }
+
+ return retval;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/examples/pdmodel/RemoveFirstPage.java b/src/main/java/org/pdfbox/examples/pdmodel/RemoveFirstPage.java
new file mode 100644
index 0000000..2b7242b
--- /dev/null
+++ b/src/main/java/org/pdfbox/examples/pdmodel/RemoveFirstPage.java
@@ -0,0 +1,98 @@
+/**
+ * Copyright (c) 2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.examples.pdmodel;
+
+import org.pdfbox.pdmodel.PDDocument;
+
+import java.io.IOException;
+
+/**
+ * This is an example on how to remove pages from a PDF document.
+ *
+ * @author Ben Litchfield (ben@benlitchfield.com)
+ * @version $Revision: 1.4 $
+ */
+public class RemoveFirstPage
+{
+ private RemoveFirstPage()
+ {
+ //utility class, should not be instantiated.
+ }
+
+ /**
+ * This will print the documents data.
+ *
+ * @param args The command line arguments.
+ *
+ * @throws Exception If there is an error parsing the document.
+ */
+ public static void main( String[] args ) throws Exception
+ {
+ if( args.length != 2 )
+ {
+ usage();
+ }
+ else
+ {
+ PDDocument document = null;
+ try
+ {
+ document = PDDocument.load( args[0] );
+ if( document.isEncrypted() )
+ {
+ throw new IOException( "Encrypted documents are not supported for this example" );
+ }
+ if( document.getNumberOfPages() <= 1 )
+ {
+ throw new IOException( "Error: A PDF document must have at least one page, " +
+ "cannot remove the last page!");
+ }
+ document.removePage( 0 );
+ document.save( args[1] );
+ }
+ finally
+ {
+ if( document != null )
+ {
+ document.close();
+ }
+ }
+ }
+ }
+
+ /**
+ * This will print the usage for this document.
+ */
+ private static void usage()
+ {
+ System.err.println( "Usage: java org.pdfbox.examples.pdmodel.RemoveFirstPage <input-pdf> <output-pdf>" );
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/examples/pdmodel/ReplaceString.java b/src/main/java/org/pdfbox/examples/pdmodel/ReplaceString.java
new file mode 100644
index 0000000..bbf8688
--- /dev/null
+++ b/src/main/java/org/pdfbox/examples/pdmodel/ReplaceString.java
@@ -0,0 +1,186 @@
+/**
+ * Copyright (c) 2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.examples.pdmodel;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.List;
+
+import org.pdfbox.cos.COSArray;
+import org.pdfbox.cos.COSString;
+import org.pdfbox.exceptions.COSVisitorException;
+
+import org.pdfbox.pdfparser.PDFStreamParser;
+import org.pdfbox.pdfwriter.ContentStreamWriter;
+import org.pdfbox.pdmodel.PDDocument;
+import org.pdfbox.pdmodel.PDPage;
+
+import org.pdfbox.pdmodel.common.PDStream;
+
+import org.pdfbox.util.PDFOperator;
+
+
+/**
+ * This is an example that will replace a string in a PDF with a new one.
+ *
+ * The example is taken from the pdf file format specification.
+ *
+ * @author Ben Litchfield (ben@benlitchfield.com)
+ * @version $Revision: 1.2 $
+ */
+public class ReplaceString
+{
+ /**
+ * Constructor.
+ */
+ public ReplaceString()
+ {
+ super();
+ }
+
+ /**
+ * Locate a string in a PDF and replace it with a new string.
+ *
+ * @param inputFile The PDF to open.
+ * @param outputFile The PDF to write to.
+ * @param strToFind The string to find in the PDF document.
+ * @param message The message to write in the file.
+ *
+ * @throws IOException If there is an error writing the data.
+ * @throws COSVisitorException If there is an error writing the PDF.
+ */
+ public void doIt( String inputFile, String outputFile, String strToFind, String message)
+ throws IOException, COSVisitorException
+ {
+ // the document
+ PDDocument doc = null;
+ try
+ {
+ doc = PDDocument.load( inputFile );
+ List pages = doc.getDocumentCatalog().getAllPages();
+ for( int i=0; i<pages.size(); i++ )
+ {
+ PDPage page = (PDPage)pages.get( i );
+ PDStream contents = page.getContents();
+ PDFStreamParser parser = new PDFStreamParser(contents.getStream() );
+ parser.parse();
+ List tokens = parser.getTokens();
+ for( int j=0; j<tokens.size(); j++ )
+ {
+ Object next = tokens.get( j );
+ if( next instanceof PDFOperator )
+ {
+ PDFOperator op = (PDFOperator)next;
+ //Tj and TJ are the two operators that display
+ //strings in a PDF
+ if( op.getOperation().equals( "Tj" ) )
+ {
+ //Tj takes one operator and that is the string
+ //to display so lets update that operator
+ COSString previous = (COSString)tokens.get( j-1 );
+ String string = previous.getString();
+ string = string.replaceFirst( strToFind, message );
+ previous.reset();
+ previous.append( string.getBytes() );
+ }
+ else if( op.getOperation().equals( "TJ" ) )
+ {
+ COSArray previous = (COSArray)tokens.get( j-1 );
+ for( int k=0; k<previous.size(); k++ )
+ {
+ Object arrElement = previous.getObject( k );
+ if( arrElement instanceof COSString )
+ {
+ COSString cosString = (COSString)arrElement;
+ String string = cosString.getString();
+ string = string.replaceFirst( strToFind, message );
+ cosString.reset();
+ cosString.append( string.getBytes() );
+ }
+ }
+ }
+ }
+ }
+ //now that the tokens are updated we will replace the
+ //page content stream.
+ PDStream updatedStream = new PDStream(doc);
+ OutputStream out = updatedStream.createOutputStream();
+ ContentStreamWriter tokenWriter = new ContentStreamWriter(out);
+ tokenWriter.writeTokens( tokens );
+ page.setContents( updatedStream );
+ }
+ doc.save( outputFile );
+ }
+ finally
+ {
+ if( doc != null )
+ {
+ doc.close();
+ }
+ }
+ }
+
+ /**
+ * This will open a PDF and replace a string if it finds it.
+ * <br />
+ * see usage() for commandline
+ *
+ * @param args Command line arguments.
+ */
+ public static void main(String[] args)
+ {
+ ReplaceString app = new ReplaceString();
+ try
+ {
+ if( args.length != 4 )
+ {
+ app.usage();
+ }
+ else
+ {
+ app.doIt( args[0], args[1], args[2], args[3] );
+ }
+ }
+ catch (Exception e)
+ {
+ e.printStackTrace();
+ }
+ }
+
+ /**
+ * This will print out a message telling how to use this example.
+ */
+ private void usage()
+ {
+ System.err.println( "usage: " + this.getClass().getName() +
+ " <input-file> <output-file> <search-string> <Message>" );
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/examples/pdmodel/RubberStamp.java b/src/main/java/org/pdfbox/examples/pdmodel/RubberStamp.java
new file mode 100644
index 0000000..158e0f8
--- /dev/null
+++ b/src/main/java/org/pdfbox/examples/pdmodel/RubberStamp.java
@@ -0,0 +1,113 @@
+/**
+ * Copyright (c) 2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.examples.pdmodel;
+
+import org.pdfbox.pdmodel.PDDocument;
+import org.pdfbox.pdmodel.PDPage;
+import org.pdfbox.pdmodel.common.PDRectangle;
+import org.pdfbox.pdmodel.interactive.annotation.PDAnnotationRubberStamp;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * This is an example on how to add annotations to pages of a PDF document.
+ *
+ * @author Paul King
+ * @version $Revision: 1.1 $
+ */
+public class RubberStamp
+{
+ private RubberStamp()
+ {
+ //utility class, should not be instantiated.
+ }
+
+ /**
+ * This will print the documents data.
+ *
+ * @param args The command line arguments.
+ *
+ * @throws Exception If there is an error parsing the document.
+ */
+ public static void main( String[] args ) throws Exception
+ {
+ if( args.length != 2 )
+ {
+ usage();
+ }
+ else
+ {
+ PDDocument document = null;
+ try
+ {
+ document = PDDocument.load( args[0] );
+ if( document.isEncrypted() )
+ {
+ throw new IOException( "Encrypted documents are not supported for this example" );
+ }
+ List allpages = new ArrayList();
+ document.getDocumentCatalog().getPages().getAllKids(allpages);
+
+ for (int i=0; i < allpages.size(); i++)
+ {
+ PDPage apage = (PDPage) allpages.get(i);
+ List annotations = apage.getAnnotations();
+
+ PDAnnotationRubberStamp rs = new PDAnnotationRubberStamp();
+ rs.setName(PDAnnotationRubberStamp.NAME_TOP_SECRET);
+ rs.setRectangle(new PDRectangle(100,100));
+ rs.setContents("A top secret note");
+
+ annotations.add(rs);
+ }
+
+ document.save( args[1] );
+ }
+ finally
+ {
+ if( document != null )
+ {
+ document.close();
+ }
+ }
+ }
+ }
+
+ /**
+ * This will print the usage for this document.
+ */
+ private static void usage()
+ {
+ System.err.println( "Usage: java org.pdfbox.examples.pdmodel.RubberStamp <input-pdf> <output-pdf>" );
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/examples/pdmodel/ShowColorBoxes.java b/src/main/java/org/pdfbox/examples/pdmodel/ShowColorBoxes.java
new file mode 100644
index 0000000..f936642
--- /dev/null
+++ b/src/main/java/org/pdfbox/examples/pdmodel/ShowColorBoxes.java
@@ -0,0 +1,135 @@
+/**
+ * Copyright (c) 2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.examples.pdmodel;
+
+import java.awt.Color;
+import java.io.IOException;
+
+import org.pdfbox.exceptions.COSVisitorException;
+
+import org.pdfbox.pdmodel.PDDocument;
+import org.pdfbox.pdmodel.PDPage;
+
+import org.pdfbox.pdmodel.edit.PDPageContentStream;
+
+/**
+ * This is an example that creates a simple document.
+ *
+ * The example is taken from the pdf file format specification.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.1 $
+ */
+public class ShowColorBoxes
+{
+ /**
+ * Constructor.
+ */
+ public ShowColorBoxes()
+ {
+ super();
+ }
+
+ /**
+ * create the second sample document from the PDF file format specification.
+ *
+ * @param file The file to write the PDF to.
+ *
+ * @throws IOException If there is an error writing the data.
+ * @throws COSVisitorException If there is an error writing the PDF.
+ */
+ public void doIt( String file) throws IOException, COSVisitorException
+ {
+ // the document
+ PDDocument doc = null;
+ try
+ {
+ doc = new PDDocument();
+
+ PDPage page = new PDPage();
+ doc.addPage( page );
+
+ PDPageContentStream contentStream = new PDPageContentStream(doc, page);
+ //first fill the entire background with cyan
+ contentStream.setNonStrokingColor( Color.CYAN );
+ contentStream.fillRect( 0,0, page.findMediaBox().getWidth(), page.findMediaBox().getHeight() );
+
+ //then draw a red box in the lower left hand corner
+ contentStream.setNonStrokingColor( Color.RED );
+ contentStream.fillRect( 10, 10, 100, 100 );
+
+ contentStream.close();
+ doc.save( file );
+ }
+ finally
+ {
+ if( doc != null )
+ {
+ doc.close();
+ }
+ }
+ }
+
+ /**
+ * This will create a hello world PDF document.
+ * <br />
+ * see usage() for commandline
+ *
+ * @param args Command line arguments.
+ */
+ public static void main(String[] args)
+ {
+ ShowColorBoxes app = new ShowColorBoxes();
+ try
+ {
+ if( args.length != 1 )
+ {
+ app.usage();
+ }
+ else
+ {
+ app.doIt( args[0] );
+ }
+ }
+ catch (Exception e)
+ {
+ e.printStackTrace();
+ }
+ }
+
+ /**
+ * This will print out a message telling how to use this example.
+ */
+ private void usage()
+ {
+ System.err.println( "usage: " + this.getClass().getName() + " <output-file>" );
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/examples/pdmodel/package.html b/src/main/java/org/pdfbox/examples/pdmodel/package.html
new file mode 100644
index 0000000..b9beefa
--- /dev/null
+++ b/src/main/java/org/pdfbox/examples/pdmodel/package.html
@@ -0,0 +1,9 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head>
+
+</head>
+<body>
+These examples show how to use the classes in the PDModel package.
+</body>
+</html>
diff --git a/src/main/java/org/pdfbox/examples/persistence/AppendAndFillDoc.java b/src/main/java/org/pdfbox/examples/persistence/AppendAndFillDoc.java
new file mode 100644
index 0000000..01b8cf6
--- /dev/null
+++ b/src/main/java/org/pdfbox/examples/persistence/AppendAndFillDoc.java
@@ -0,0 +1,282 @@
+/**
+ * Copyright (c) 2003, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.examples.persistence;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.FileOutputStream;
+import java.io.InputStream;
+import java.io.FileInputStream;
+
+import java.util.Iterator;
+
+import org.pdfbox.pdfparser.PDFParser;
+
+import org.pdfbox.pdfwriter.COSWriter;
+
+import org.pdfbox.cos.COSDocument;
+import org.pdfbox.cos.COSString;
+import org.pdfbox.cos.COSBase;
+import org.pdfbox.cos.COSDictionary;
+import org.pdfbox.cos.COSObject;
+import org.pdfbox.cos.COSName;
+import org.pdfbox.cos.COSArray;
+import org.pdfbox.cos.COSNumber;
+import org.pdfbox.cos.COSInteger;
+
+import org.pdfbox.exceptions.COSVisitorException;
+
+/**
+ * This concatenates two documents with fields and fills the fields in the two templates using different
+ * values.
+ *
+ * @author Michael Traut
+ * @version $Revision: 1.6 $
+ */
+public class AppendAndFillDoc
+{
+ /**
+ * Constructor.
+ */
+ public AppendAndFillDoc()
+ {
+ super();
+ }
+
+ /**
+ * Append all pages from source to destination.
+ *
+ * todo: this method will go to the pdfmodel package one day
+ *
+ * @param destination the document to receive the pages
+ * @param source the document originating the new pages
+ *
+ */
+ public void appendDocument(COSDocument destination, COSDocument source)
+ {
+ COSDictionary pages2 = getPages(source);
+ COSArray kids = (COSArray)pages2.getItem(COSName.getPDFName("Kids"));
+ for (Iterator i = kids.iterator(); i.hasNext();)
+ {
+ COSDictionary page = (COSDictionary)((COSObject)i.next()).getObject();
+ appendPage(destination, page);
+ }
+ }
+ /**
+ * append a page dict to destination.
+ *
+ * todo: this method will go to the pdfmodel package one day
+ *
+ * @param destination the document to receive the page
+ * @param page the page to append to the document
+ *
+ */
+ public void appendPage(COSDocument destination, COSDictionary page)
+ {
+ // get the parent object (pages dictionary)
+ COSDictionary pages = getPages(destination);
+ // and set in the page object
+ page.setItem(COSName.PARENT, pages);
+ // add new page to kids entry in the pages dictionary
+ COSArray kids = (COSArray) pages.getItem(COSName.getPDFName("Kids"));
+ kids.add(page);
+ // and increase count
+ COSNumber count = (COSNumber) pages.getItem(COSName.COUNT);
+ pages.setItem(COSName.COUNT, new COSInteger(count.intValue() + 1));
+ }
+ /**
+ * concat two pdf documents and fill fields in both templates
+ * this is a bit tricky as one has to rename the fields if we use the same template two times.
+ * here we don't user a clever algorithm to create dynamic fieldnames - this is left to the user..
+ *
+ * @param in1 The first template file
+ * @param in2 The second template file
+ * @param out The created fiel with all pages from document one and document two
+ * @param name1 The name of the PDF field (FDF field) in the first template
+ * @param value1 The value to be used for the field in the first template
+ * @param name2 The name of the PDF field (FDF field) in the second template
+ * @param value2 The value to be used for the field in the second template
+ *
+ * @throws IOException If there is an error writing the data.
+ * @throws COSVisitorException If there is an error generating the PDF document.
+ */
+ public void doIt( String in1,
+ String in2,
+ String out,
+ String name1,
+ String value1,
+ String name2,
+ String value2) throws IOException, COSVisitorException
+ {
+ COSDocument doc1 = null;
+ COSDocument doc2 = null;
+ InputStream is1 = null;
+ InputStream is2 = null;
+ PDFParser parser1 = null;
+ PDFParser parser2 = null;
+
+ OutputStream os = null;
+ COSWriter writer = null;
+ try
+ {
+ is1 = new FileInputStream(in1);
+ parser1 = new PDFParser(is1);
+ parser1.parse();
+ doc1 = parser1.getDocument();
+
+ is2 = new FileInputStream(in2);
+ parser2 = new PDFParser(is2);
+ parser2.parse();
+ doc2 = parser2.getDocument();
+
+ setField(doc1, "doc1", new COSString(name1), new COSString(value1));
+ setField(doc2, "doc2", new COSString(name2), new COSString(value2));
+
+ appendDocument(doc1, doc2);
+
+ os = new FileOutputStream(out);
+ writer = new COSWriter(os);
+ writer.write(doc1);
+ }
+ finally
+ {
+ is1.close();
+ doc1.close();
+
+ is2.close();
+ doc2.close();
+
+ os.close();
+ writer.close();
+ }
+ }
+
+ /**
+ * Lookup the pages dictionary in a document.
+ *
+ * todo: this method will go to the pdfmodel package one day
+ *
+ * @param doc the document where the pages dict is searched
+ *
+ * @return The Pages dictionary.
+ */
+ public COSDictionary getPages(COSDocument doc)
+ {
+ // todo should access via catalog instead!
+ for (Iterator i = doc.getObjects().iterator(); i.hasNext();)
+ {
+ COSObject obj = (COSObject) i.next();
+ COSBase base = obj.getObject();
+ if (base instanceof COSDictionary)
+ {
+ COSDictionary dict = (COSDictionary) base;
+ COSBase type = dict.getItem(COSName.TYPE);
+ if (type != null && type.equals(COSName.getPDFName("Pages")))
+ {
+ return dict;
+ }
+ }
+ }
+ return null;
+ }
+ /**
+ * This will concat two pdf documents and fill fields in both.
+ * <br />
+ * see usage() for commandline
+ *
+ * @param args command line arguments
+ */
+ public static void main(String[] args)
+ {
+ AppendAndFillDoc app = new AppendAndFillDoc();
+ try
+ {
+ if( args.length != 7 )
+ {
+ app.usage();
+ }
+ else
+ {
+ app.doIt( args[0], args[1], args[2], args[3], args[4], args[5], args[6]);
+ }
+ }
+ catch (Exception e)
+ {
+ e.printStackTrace();
+ }
+ }
+ /**
+ * lookup and fill the field.
+ *
+ * todo: this method will go to the pdfmodel package one day
+ *
+ * @param doc the document where the field resides
+ * @param prefix a prefix to use to make the field name unique in the new document
+ * @param name the name of the PDF Annotation field
+ * @param value The desired value to be used for the field
+ *
+ */
+ public void setField(COSDocument doc, String prefix, COSString name, COSString value)
+ {
+ for (Iterator i = doc.getObjects().iterator(); i.hasNext();)
+ {
+ COSObject obj = (COSObject) i.next();
+ COSBase base = obj.getObject();
+ if (base instanceof COSDictionary)
+ {
+ COSDictionary dict = (COSDictionary) base;
+ COSBase type = dict.getItem(COSName.TYPE);
+ if (type != null && type.equals(COSName.getPDFName("Annot")))
+ {
+ COSBase subtype = dict.getItem(COSName.getPDFName("Subtype"));
+ if (subtype != null && subtype.equals(COSName.getPDFName("Widget")))
+ {
+ // we found the field
+ COSBase fname = dict.getItem(COSName.getPDFName("T"));
+ if (fname != null && fname.equals(name))
+ {
+ dict.setItem(COSName.getPDFName("V"), value);
+ dict.setItem(COSName.getPDFName("T"), new COSString(prefix + name.getString()));
+ }
+ }
+ }
+ }
+ }
+ }
+ /**
+ * This will print out a message telling how to use this example.
+ */
+ private void usage()
+ {
+ System.err.println( "usage: " + this.getClass().getName() +
+ " <input-file1> <input-file2> <output-file> <name1> <value1> <name2> <value2>" );
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/examples/persistence/AppendDoc.java b/src/main/java/org/pdfbox/examples/persistence/AppendDoc.java
new file mode 100644
index 0000000..68e254c
--- /dev/null
+++ b/src/main/java/org/pdfbox/examples/persistence/AppendDoc.java
@@ -0,0 +1,357 @@
+/**
+ * Copyright (c) 2003-2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.examples.persistence;
+
+import java.io.IOException;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.pdfbox.cos.COSBase;
+import org.pdfbox.cos.COSDictionary;
+import org.pdfbox.cos.COSName;
+import org.pdfbox.cos.COSArray;
+import org.pdfbox.cos.COSNumber;
+import org.pdfbox.cos.COSInteger;
+import org.pdfbox.cos.COSObject;
+import org.pdfbox.cos.COSStream;
+
+import org.pdfbox.pdmodel.PDDocument;
+import org.pdfbox.pdmodel.PDDocumentInformation;
+import org.pdfbox.pdmodel.PDPage;
+
+import org.pdfbox.pdmodel.common.PDStream;
+
+import org.pdfbox.exceptions.COSVisitorException;
+
+/**
+ * This example concatenates two documents and writes the result.
+ *
+ * @author Michael Traut
+ * @version $Revision: 1.17 $
+ */
+public class AppendDoc
+{
+ /**
+ * Constructor.
+ */
+ public AppendDoc()
+ {
+ super();
+ }
+ /**
+ * append all pages from source to destination.
+ *
+ * todo: this method will go to the pdfmodel package one day
+ *
+ * @param destination the document to receive the pages
+ * @param source the document originating the new pages
+ *
+ * @throws IOException If there is an error accessing data from either document.
+ */
+ public void appendDocument(PDDocument destination, PDDocument source) throws IOException
+ {
+ if( destination.isEncrypted() )
+ {
+ throw new IOException( "Error: destination PDF is encrypted, can't append encrypted PDF documents." );
+ }
+ if( source.isEncrypted() )
+ {
+ throw new IOException( "Error: destination PDF is encrypted, can't append encrypted PDF documents." );
+ }
+ PDDocumentInformation destInfo = destination.getDocumentInformation();
+ PDDocumentInformation srcInfo = source.getDocumentInformation();
+ destInfo.getDictionary().mergeInto( srcInfo.getDictionary() );
+
+ COSDictionary destTrailer = destination.getDocument().getTrailer();
+ COSDictionary destRoot = (COSDictionary)destTrailer.getDictionaryObject( COSName.ROOT );
+
+ COSDictionary srcTrailer = source.getDocument().getTrailer();
+ COSDictionary srcRoot = (COSDictionary)srcTrailer.getDictionaryObject( COSName.ROOT );
+
+ COSName openAction = COSName.getPDFName( "OpenAction" );
+ if( destRoot.getDictionaryObject( openAction ) == null )
+ {
+ COSBase open = srcRoot.getDictionaryObject( openAction );
+ if( open != null )
+ {
+ destRoot.setItem( openAction, copyStreamsIntoDocument( destination, open ) );
+ }
+ }
+
+ COSName acroForm = COSName.getPDFName( "AcroForm" );
+ COSDictionary destAcroForm = (COSDictionary)destRoot.getDictionaryObject( acroForm );
+ COSDictionary srcAcroForm = (COSDictionary)srcRoot.getDictionaryObject( acroForm );
+ if( srcAcroForm != null )
+ {
+ if( destAcroForm == null )
+ {
+ destRoot.setItem( acroForm, copyStreamsIntoDocument( destination, srcAcroForm ) );
+ }
+ else
+ {
+ //****************need to do proper merge***************
+ //destAcroForm.addAll( (COSArray)copyStreamsIntoDocument( destination, srcAcroForm ) );
+ }
+ }
+
+ COSName threads = COSName.getPDFName( "Threads" );
+ COSArray destThreads = (COSArray)destRoot.getDictionaryObject( threads );
+ COSArray srcThreads = (COSArray)srcRoot.getDictionaryObject( threads );
+ if( srcThreads != null )
+ {
+ if( destThreads == null )
+ {
+ destRoot.setItem( threads, copyStreamsIntoDocument( destination, srcThreads ) );
+ }
+ else
+ {
+ destThreads.addAll( (COSArray)copyStreamsIntoDocument( destination, srcThreads ) );
+ }
+ }
+
+ COSName names = COSName.getPDFName( "Names" );
+ COSDictionary destNames = (COSDictionary)destRoot.getDictionaryObject( names );
+ COSDictionary srcNames = (COSDictionary)srcRoot.getDictionaryObject( names );
+ if( srcNames != null )
+ {
+ if( destNames == null )
+ {
+ destRoot.setItem( names, copyStreamsIntoDocument( destination, srcNames ) );
+ }
+ else
+ {
+ //warning, potential for collision here!!
+ destNames.mergeInto( (COSDictionary)copyStreamsIntoDocument( destination, srcNames ) );
+ }
+ }
+
+ COSName outlines = COSName.getPDFName( "Outlines" );
+ COSDictionary destOutlines = (COSDictionary)destRoot.getDictionaryObject( outlines );
+ COSDictionary srcOutlines = (COSDictionary)srcRoot.getDictionaryObject( outlines );
+ if( srcOutlines != null && destOutlines == null )
+ {
+ destRoot.setItem( outlines, copyStreamsIntoDocument( destination, srcOutlines ) );
+ }
+
+ COSName pagemode = COSName.getPDFName( "PageMode" );
+ COSBase srcPageMode = srcRoot.getDictionaryObject( pagemode );
+ if( srcOutlines != null && destOutlines == null )
+ {
+ destRoot.setItem( pagemode, copyStreamsIntoDocument( destination, srcPageMode ) );
+ }
+
+ COSName pageLabels = COSName.getPDFName( "PageLabels" );
+ COSDictionary destLabels = (COSDictionary)destRoot.getDictionaryObject( pageLabels );
+ COSDictionary srcLabels = (COSDictionary)srcRoot.getDictionaryObject( pageLabels );
+ if( srcLabels != null )
+ {
+ int destPageCount = destination.getNumberOfPages();
+ COSArray destNums = null;
+ if( destLabels == null )
+ {
+ destLabels = new COSDictionary();
+ destNums = new COSArray();
+ destLabels.setItem( COSName.getPDFName( "Nums" ), destNums );
+ destRoot.setItem( pageLabels, destLabels );
+ }
+ else
+ {
+ destNums = (COSArray)destLabels.getDictionaryObject( COSName.getPDFName( "Nums" ) );
+ }
+ COSArray srcNums = (COSArray)srcLabels.getDictionaryObject( COSName.getPDFName( "Nums" ) );
+ for( int i=0; i<srcNums.size(); i+=2 )
+ {
+ COSNumber labelIndex = (COSNumber)srcNums.getObject( i );
+ long labelIndexValue = labelIndex.intValue();
+ destNums.add( new COSInteger( labelIndexValue + destPageCount ) );
+ destNums.add( copyStreamsIntoDocument( destination, srcNums.getObject( i+1 ) ) );
+ }
+ }
+
+ COSName metadata = COSName.getPDFName( "Metadata" );
+ COSStream destMetadata = (COSStream)destRoot.getDictionaryObject( metadata );
+ COSStream srcMetadata = (COSStream)srcRoot.getDictionaryObject( metadata );
+ if( destMetadata == null && srcMetadata != null )
+ {
+ PDStream newStream = new PDStream( destination, srcMetadata.getUnfilteredStream(), false );
+ newStream.getStream().mergeInto( srcMetadata );
+ newStream.addCompression();
+ destRoot.setItem( metadata, newStream );
+ }
+
+ //finally append the pages
+ List pages = source.getDocumentCatalog().getAllPages();
+ Iterator pageIter = pages.iterator();
+ while( pageIter.hasNext() )
+ {
+ PDPage page = (PDPage)pageIter.next();
+ PDPage newPage =
+ new PDPage( (COSDictionary)copyStreamsIntoDocument( destination, page.getCOSDictionary() ) );
+ destination.addPage( newPage );
+ }
+ }
+ Map clonedVersion = new HashMap();
+
+ private COSBase copyStreamsIntoDocument( PDDocument destination, COSBase base ) throws IOException
+ {
+
+ COSBase retval = (COSBase)clonedVersion.get( base );
+ if( retval != null )
+ {
+ return retval;
+ }
+ if( base instanceof COSObject )
+ {
+ COSObject object = (COSObject)base;
+ retval = new COSObject(copyStreamsIntoDocument( destination, object.getObject() ) );
+ }
+ else if( base instanceof COSArray )
+ {
+ retval = new COSArray();
+ COSArray array = (COSArray)base;
+ for( int i=0; i<array.size(); i++ )
+ {
+ ((COSArray)retval).add( copyStreamsIntoDocument( destination, array.get( i ) ) );
+ }
+ }
+ else if( base instanceof COSDictionary )
+ {
+ COSDictionary dic = (COSDictionary)base;
+ List keys = dic.keyList();
+ if( base instanceof COSStream )
+ {
+ COSStream originalStream = (COSStream)base;
+ PDStream stream = new PDStream( destination, originalStream.getFilteredStream(), true );
+ clonedVersion.put( base, stream.getStream() );
+ for( int i=0; i<keys.size(); i++ )
+ {
+ COSName key = (COSName)keys.get( i );
+ stream.getStream().setItem( key, copyStreamsIntoDocument(destination,dic.getItem(key)));
+ }
+ retval = stream.getStream();
+ }
+ else
+ {
+ retval = new COSDictionary();
+ clonedVersion.put( base, retval );
+ for( int i=0; i<keys.size(); i++ )
+ {
+ COSName key = (COSName)keys.get( i );
+ ((COSDictionary)retval).setItem( key, copyStreamsIntoDocument(destination,dic.getItem(key)));
+ }
+ }
+ }
+ else
+ {
+ retval = base;
+ }
+ clonedVersion.put( base, retval );
+ return retval;
+ }
+
+ /**
+ * concat two pdf documents.
+ *
+ * @param in1 The first template file
+ * @param in2 The second template file
+ * @param out The created fiel with all pages from document one and document two
+ *
+ * @throws IOException If there is an error writing the data.
+ * @throws COSVisitorException If there is an error generating the PDF document.
+ */
+ public void doIt(String in1, String in2, String out) throws IOException, COSVisitorException
+ {
+ PDDocument doc1 = null;
+ PDDocument doc2 = null;
+ try
+ {
+ doc1 = PDDocument.load( in1 );
+ doc2 = PDDocument.load( in2 );
+
+ appendDocument(doc1, doc2);
+ doc1.save( out );
+ }
+ catch( Exception e )
+ {
+ e.printStackTrace();
+ }
+ finally
+ {
+ close( doc1 );
+ close( doc2 );
+ }
+ }
+
+ private void close( PDDocument doc ) throws IOException
+ {
+ if( doc != null )
+ {
+ doc.close();
+ }
+ }
+
+ /**
+ * This will concat two pdf documents.
+ * <br />
+ * see usage() for commandline
+ *
+ * @param args command line arguments
+ */
+ public static void main(String[] args)
+ {
+ AppendDoc app = new AppendDoc();
+ try
+ {
+ if( args.length != 3 )
+ {
+ app.usage();
+ }
+ else
+ {
+ app.doIt( args[0], args[1], args[2]);
+ }
+ }
+ catch( Exception e )
+ {
+ e.printStackTrace();
+ }
+ }
+ /**
+ * This will print out a message telling how to use this example.
+ */
+ private void usage()
+ {
+ System.err.println( "usage: " + this.getClass().getName() + " <input-file1> <input-file2> <output-file>" );
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/examples/persistence/CopyDoc.java b/src/main/java/org/pdfbox/examples/persistence/CopyDoc.java
new file mode 100644
index 0000000..a3b7e3f
--- /dev/null
+++ b/src/main/java/org/pdfbox/examples/persistence/CopyDoc.java
@@ -0,0 +1,140 @@
+/**
+ * Copyright (c) 2003, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.examples.persistence;
+
+import java.io.IOException;
+
+import org.pdfbox.cos.COSDocument;
+
+
+
+import org.pdfbox.pdfparser.PDFParser;
+
+import org.pdfbox.pdfwriter.COSWriter;
+import org.pdfbox.exceptions.COSVisitorException;
+
+/**
+ * This is an example used to copy a documents contents from a source doc to destination doc
+ * via an in-memory document representation.
+ *
+ * @author Michael Traut
+ * @version $Revision: 1.7 $
+ */
+public class CopyDoc
+{
+ /**
+ * Constructor.
+ */
+ public CopyDoc()
+ {
+ super();
+ }
+
+ /**
+ * This will perform the document copy.
+ *
+ * @param in The filename used for input.
+ * @param out The filename used for output.
+ *
+ * @throws IOException If there is an error parsing the document.
+ * @throws COSVisitorException If there is an error while copying the document.
+ */
+ public void doIt(String in, String out) throws IOException, COSVisitorException
+ {
+ java.io.InputStream is = null;
+ java.io.OutputStream os = null;
+ COSWriter writer = null;
+ try
+ {
+ is = new java.io.FileInputStream(in);
+ PDFParser parser = new PDFParser(is);
+ parser.parse();
+
+ COSDocument doc = parser.getDocument();
+
+ os = new java.io.FileOutputStream(out);
+ writer = new COSWriter(os);
+
+ writer.write(doc);
+
+ }
+ finally
+ {
+ if( is != null )
+ {
+ is.close();
+ }
+ if( os != null )
+ {
+ os.close();
+ }
+ if( writer != null )
+ {
+ writer.close();
+ }
+ }
+ }
+
+ /**
+ * This will copy a PDF document.
+ * <br />
+ * see usage() for commandline
+ *
+ * @param args command line arguments
+ */
+ public static void main(String[] args)
+ {
+ CopyDoc app = new CopyDoc();
+ try
+ {
+ if( args.length != 2 )
+ {
+ app.usage();
+ }
+ else
+ {
+ app.doIt( args[0], args[1]);
+ }
+ }
+ catch (Exception e)
+ {
+ e.printStackTrace();
+ }
+ }
+
+ /**
+ * This will print out a message telling how to use this example.
+ */
+ private void usage()
+ {
+ System.err.println( "usage: " + this.getClass().getName() + " <input-file> <output-file>" );
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/examples/persistence/FieldsDoc.java b/src/main/java/org/pdfbox/examples/persistence/FieldsDoc.java
new file mode 100644
index 0000000..e506fe1
--- /dev/null
+++ b/src/main/java/org/pdfbox/examples/persistence/FieldsDoc.java
@@ -0,0 +1,177 @@
+/**
+ * Copyright (c) 2003, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.examples.persistence;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.FileOutputStream;
+
+import java.util.Iterator;
+
+import org.pdfbox.pdfparser.PDFParser;
+
+import org.pdfbox.pdfwriter.COSWriter;
+
+import org.pdfbox.cos.COSDocument;
+import org.pdfbox.cos.COSString;
+import org.pdfbox.cos.COSBase;
+import org.pdfbox.cos.COSDictionary;
+import org.pdfbox.cos.COSObject;
+import org.pdfbox.cos.COSName;
+
+import org.pdfbox.exceptions.COSVisitorException;
+
+/**
+ * This example fills a field in a pdf document and writes it to new destination.
+ *
+ * @author Michael Traut
+ * @version $Revision: 1.5 $
+ */
+public class FieldsDoc
+{
+ /**
+ * Constructor.
+ */
+ public FieldsDoc()
+ {
+ super();
+ }
+ /**
+ * fill a field in the pdf.
+ *
+ * @param in The template file
+ * @param out The file to write the PDF to.
+ * @param name The name of the PDF field (FDF field)
+ * @param value The value to be used for the field
+ *
+ * @throws IOException If there is an error writing the data.
+ * @throws COSVisitorException If there is an error generating the PDF document.
+ */
+ public void doIt(String in, String out, String name, String value) throws IOException, COSVisitorException
+ {
+ java.io.InputStream is = null;
+ COSDocument doc = null;
+ OutputStream os = null;
+ COSWriter writer = null;
+ try
+ {
+ is = new java.io.FileInputStream(in);
+ PDFParser parser = new PDFParser(is);
+ parser.parse();
+
+ doc = parser.getDocument();
+
+ setField(doc, new COSString(name), new COSString(value));
+
+ os = new FileOutputStream(out);
+ writer = new COSWriter(os);
+
+ writer.write(doc);
+
+ }
+ finally
+ {
+ is.close();
+ doc.close();
+ os.close();
+ writer.close();
+ }
+ }
+ /**
+ * This will fill a field in a PDF document.
+ * <br />
+ * see usage() for commandline
+ *
+ * @param args command line arguments
+ */
+ public static void main(String[] args)
+ {
+ FieldsDoc app = new FieldsDoc();
+ try
+ {
+ if( args.length != 4 )
+ {
+ app.usage();
+ }
+ else
+ {
+ app.doIt( args[0], args[1], args[2], args[3]);
+ }
+ }
+ catch (Exception e)
+ {
+ e.printStackTrace();
+ }
+ }
+ /**
+ * lookup and fill the field.
+ *
+ * todo: this method will go to the pdfmodel package one day
+ *
+ * @param doc the document where the field resides
+ * @param name the name of the PDF Annotation field
+ * @param value The desired value to be used for the field
+ *
+ */
+ public void setField(COSDocument doc, COSString name, COSString value)
+ {
+ for (Iterator i = doc.getObjects().iterator(); i.hasNext();)
+ {
+ COSObject obj = (COSObject) i.next();
+ COSBase base = obj.getObject();
+ if (base instanceof COSDictionary)
+ {
+ COSDictionary dict = (COSDictionary) base;
+ COSBase type = dict.getItem(COSName.TYPE);
+ if (type != null && type.equals(COSName.getPDFName("Annot")))
+ {
+ COSBase subtype = dict.getItem(COSName.getPDFName("Subtype"));
+ if (subtype != null && subtype.equals(COSName.getPDFName("Widget")))
+ {
+ // we found the field
+ COSBase fname = dict.getItem(COSName.getPDFName("T"));
+ if (fname != null && fname.equals(name))
+ {
+ dict.setItem(COSName.getPDFName("V"), value);
+ }
+ }
+ }
+ }
+ }
+ }
+ /**
+ * This will print out a message telling how to use this example.
+ */
+ private void usage()
+ {
+ System.err.println( "usage: " + this.getClass().getName() + " <input-file> <output-file> <name> <value>" );
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/examples/persistence/WriteDecodedDoc.java b/src/main/java/org/pdfbox/examples/persistence/WriteDecodedDoc.java
new file mode 100644
index 0000000..8fcab7f
--- /dev/null
+++ b/src/main/java/org/pdfbox/examples/persistence/WriteDecodedDoc.java
@@ -0,0 +1,151 @@
+/**
+ * Copyright (c) 2003-2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.examples.persistence;
+
+import java.io.IOException;
+
+import java.util.Iterator;
+
+import org.pdfbox.cos.COSBase;
+import org.pdfbox.cos.COSObject;
+import org.pdfbox.cos.COSStream;
+
+import org.pdfbox.pdmodel.PDDocument;
+
+import org.pdfbox.exceptions.COSVisitorException;
+
+import org.pdfbox.exceptions.InvalidPasswordException;
+
+/**
+ * load document and write with all streams decoded.
+ *
+ * @author Michael Traut
+ * @version $Revision: 1.8 $
+ */
+public class WriteDecodedDoc
+{
+
+ /**
+ * Constructor.
+ */
+ public WriteDecodedDoc()
+ {
+ super();
+ }
+
+ /**
+ * This will perform the document reading, decoding and writing.
+ *
+ * @param in The filename used for input.
+ * @param out The filename used for output.
+ *
+ * @throws IOException If there is an error parsing the document.
+ * @throws COSVisitorException If there is an error while copying the document.
+ */
+ public void doIt(String in, String out) throws IOException, COSVisitorException
+ {
+ PDDocument doc = null;
+ try
+ {
+ doc = PDDocument.load( in );
+ if( doc.isEncrypted() )
+ {
+ try
+ {
+ doc.decrypt( "" );
+ }
+ catch( InvalidPasswordException e )
+ {
+ System.err.println( "Error: The document is encrypted." );
+ }
+ catch( org.pdfbox.exceptions.CryptographyException e )
+ {
+ e.printStackTrace();
+ }
+ }
+
+ for (Iterator i = doc.getDocument().getObjects().iterator(); i.hasNext();)
+ {
+ COSBase base = ((COSObject) i.next()).getObject();
+ if (base instanceof COSStream)
+ {
+ // just kill the filters
+ COSStream cosStream = (COSStream)base;
+ cosStream.getUnfilteredStream();
+ cosStream.setFilters(null);
+ }
+ }
+ doc.save( out );
+ }
+ finally
+ {
+ if( doc != null )
+ {
+ doc.close();
+ }
+ }
+ }
+
+ /**
+ * This will write a PDF document with completely decoded streams.
+ * <br />
+ * see usage() for commandline
+ *
+ * @param args command line arguments
+ */
+ public static void main(String[] args)
+ {
+ WriteDecodedDoc app = new WriteDecodedDoc();
+ try
+ {
+ if( args.length != 2 )
+ {
+ app.usage();
+ }
+ else
+ {
+ app.doIt( args[0], args[1]);
+ }
+ }
+ catch (Exception e)
+ {
+ e.printStackTrace();
+ }
+ }
+
+ /**
+ * This will print out a message telling how to use this example.
+ */
+ private void usage()
+ {
+ System.err.println( "usage: " + this.getClass().getName() + " <input-file> <output-file>" );
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/examples/persistence/package.html b/src/main/java/org/pdfbox/examples/persistence/package.html
new file mode 100644
index 0000000..9c0d57f
--- /dev/null
+++ b/src/main/java/org/pdfbox/examples/persistence/package.html
@@ -0,0 +1,9 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head>
+
+</head>
+<body>
+These examples will show how to use the persistence features of the PDFBox.
+</body>
+</html>
diff --git a/src/main/java/org/pdfbox/examples/signature/ShowSignature.java b/src/main/java/org/pdfbox/examples/signature/ShowSignature.java
new file mode 100644
index 0000000..7398534
--- /dev/null
+++ b/src/main/java/org/pdfbox/examples/signature/ShowSignature.java
@@ -0,0 +1,168 @@
+/**
+ * Copyright (c) 2003, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.examples.signature;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+
+import java.security.cert.CertificateFactory;
+
+import java.util.Collection;
+
+import org.pdfbox.cos.COSArray;
+import org.pdfbox.cos.COSDictionary;
+import org.pdfbox.cos.COSName;
+import org.pdfbox.cos.COSString;
+
+import org.pdfbox.pdmodel.PDDocument;
+
+/**
+ * This will read a document from the filesystem, decrypt it and do something with the signature.
+ *
+ * usage: java org.pdfbox.examples.signature.ShowSignature &lt;password&gt; &lt;inputfile&gt;
+ *
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.8 $
+ */
+public class ShowSignature
+{
+
+ /**
+ * This is the entry point for the application.
+ *
+ * @param args The command-line arguments.
+ *
+ * @throws Exception If there is an error reading the file.
+ */
+ public static void main( String[] args ) throws Exception
+ {
+ ShowSignature show = new ShowSignature();
+ show.showSignature( args );
+ }
+
+ private void showSignature( String[] args ) throws Exception
+ {
+ if( args.length != 2 )
+ {
+ usage();
+ }
+ else
+ {
+ String password = args[0];
+ String infile = args[1];
+ PDDocument document = null;
+ try
+ {
+ document = PDDocument.load( infile );
+
+ if( document.isEncrypted() )
+ {
+ document.decrypt( password );
+ }
+ else
+ {
+ System.err.println( "Warning: Document is not encrypted." );
+ }
+
+ COSDictionary trailer = document.getDocument().getTrailer();
+ COSDictionary root = (COSDictionary)trailer.getDictionaryObject( COSName.ROOT );
+ COSDictionary acroForm = (COSDictionary)root.getDictionaryObject( COSName.getPDFName( "AcroForm" ) );
+ COSArray fields = (COSArray)acroForm.getDictionaryObject( COSName.getPDFName( "Fields" ) );
+ for( int i=0; i<fields.size(); i++ )
+ {
+ COSDictionary field = (COSDictionary)fields.getObject( i );
+ String type = field.getNameAsString( "FT" );
+ if( "Sig".equals( type ) )
+ {
+ COSDictionary cert = (COSDictionary)field.getDictionaryObject( COSName.getPDFName( "V" ) );
+ if( cert != null )
+ {
+ System.out.println( "Certificate found" );
+ System.out.println( "Name=" + cert.getDictionaryObject( COSName.getPDFName( "Name" ) ) );
+ System.out.println( "Modified=" + cert.getDictionaryObject( COSName.getPDFName( "M" ) ) );
+ COSName subFilter = (COSName)cert.getDictionaryObject( COSName.getPDFName( "SubFilter" ) );
+ if( subFilter != null )
+ {
+ if( subFilter.getName().equals( "adbe.x509.rsa_sha1" ) )
+ {
+ COSString certString = (COSString)cert.getDictionaryObject(
+ COSName.getPDFName( "Cert" ) );
+ byte[] certData = certString.getBytes();
+ CertificateFactory factory = CertificateFactory.getInstance( "X.509" );
+ ByteArrayInputStream certStream = new ByteArrayInputStream( certData );
+ Collection certs = factory.generateCertificates( certStream );
+ System.out.println( "certs=" + certs );
+ }
+ else if( subFilter.getName().equals( "adbe.pkcs7.sha1" ) )
+ {
+ COSString certString = (COSString)cert.getDictionaryObject(
+ COSName.getPDFName( "Contents" ) );
+ byte[] certData = certString.getBytes();
+ CertificateFactory factory = CertificateFactory.getInstance( "X.509" );
+ ByteArrayInputStream certStream = new ByteArrayInputStream( certData );
+ Collection certs = factory.generateCertificates( certStream );
+ System.out.println( "certs=" + certs );
+ }
+ else
+ {
+ System.err.println( "Unknown certificate type:" + subFilter );
+ }
+ }
+ else
+ {
+ throw new IOException( "Missing subfilter for cert dictionary" );
+ }
+ }
+ else
+ {
+ System.out.println( "Signature found, but no certificate" );
+ }
+ }
+ }
+ }
+ finally
+ {
+ document.close();
+ }
+ }
+ }
+
+ /**
+ * This will print a usage message.
+ */
+ private static void usage()
+ {
+ System.err.println( "usage: java org.pdfbox.examples.signature.ShowSignature " +
+ "<password> <inputfile>" );
+ }
+
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/examples/signature/package.html b/src/main/java/org/pdfbox/examples/signature/package.html
new file mode 100644
index 0000000..731c0ff
--- /dev/null
+++ b/src/main/java/org/pdfbox/examples/signature/package.html
@@ -0,0 +1,9 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head>
+
+</head>
+<body>
+These examples will show how to gain access to the PDF signature.
+</body>
+</html>
diff --git a/src/main/java/org/pdfbox/examples/util/ExtractTextByArea.java b/src/main/java/org/pdfbox/examples/util/ExtractTextByArea.java
new file mode 100644
index 0000000..042e3e6
--- /dev/null
+++ b/src/main/java/org/pdfbox/examples/util/ExtractTextByArea.java
@@ -0,0 +1,119 @@
+/**
+ * Copyright (c) 2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.examples.util;
+
+import org.pdfbox.exceptions.InvalidPasswordException;
+
+import org.pdfbox.pdmodel.PDDocument;
+import org.pdfbox.pdmodel.PDPage;
+import org.pdfbox.util.PDFTextStripperByArea;
+
+import java.awt.Rectangle;
+
+import java.util.List;
+
+/**
+ * This is an example on how to extract text from a specific area on the PDF document.
+ *
+ * Usage: java org.pdfbox.examples.util.ExtractTextByArea &lt;input-pdf&gt;
+ *
+ * @author Ben Litchfield (ben@benlitchfield.com)
+ * @version $Revision: 1.1 $
+ */
+public class ExtractTextByArea
+{
+ private ExtractTextByArea()
+ {
+ //utility class and should not be constructed.
+ }
+
+
+ /**
+ * This will print the documents text in a certain area.
+ *
+ * @param args The command line arguments.
+ *
+ * @throws Exception If there is an error parsing the document.
+ */
+ public static void main( String[] args ) throws Exception
+ {
+ if( args.length != 1 )
+ {
+ usage();
+ }
+ else
+ {
+ PDDocument document = null;
+ try
+ {
+ document = PDDocument.load( args[0] );
+ if( document.isEncrypted() )
+ {
+ try
+ {
+ document.decrypt( "" );
+ }
+ catch( InvalidPasswordException e )
+ {
+ System.err.println( "Error: Document is encrypted with a password." );
+ System.exit( 1 );
+ }
+ }
+ PDFTextStripperByArea stripper = new PDFTextStripperByArea();
+ stripper.setSortByPosition( true );
+ Rectangle rect = new Rectangle( 10, 280, 275, 60 );
+ stripper.addRegion( "class1", rect );
+ List allPages = document.getDocumentCatalog().getAllPages();
+ PDPage firstPage = (PDPage)allPages.get( 0 );
+ stripper.extractRegions( firstPage );
+ System.out.println( "Text in the area:" + rect );
+ System.out.println( stripper.getTextForRegion( "class1" ) );
+
+ }
+ finally
+ {
+ if( document != null )
+ {
+ document.close();
+ }
+ }
+ }
+ }
+
+ /**
+ * This will print the usage for this document.
+ */
+ private static void usage()
+ {
+ System.err.println( "Usage: java org.pdfbox.examples.util.ExtractTextByArea <input-pdf>" );
+ }
+
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/examples/util/PrintTextLocations.java b/src/main/java/org/pdfbox/examples/util/PrintTextLocations.java
new file mode 100644
index 0000000..6c83b57
--- /dev/null
+++ b/src/main/java/org/pdfbox/examples/util/PrintTextLocations.java
@@ -0,0 +1,144 @@
+/**
+ * Copyright (c) 2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.examples.util;
+
+import org.pdfbox.exceptions.InvalidPasswordException;
+
+import org.pdfbox.pdfparser.PDFParser;
+
+import org.pdfbox.pdmodel.PDDocument;
+import org.pdfbox.pdmodel.PDPage;
+import org.pdfbox.util.PDFTextStripper;
+import org.pdfbox.util.TextPosition;
+
+import java.io.FileInputStream;
+import java.io.IOException;
+
+import java.util.List;
+
+/**
+ * This is an example on how to get some x/y coordinates of text.
+ *
+ * Usage: java org.pdfbox.examples.util.PrintTextLocations &lt;input-pdf&gt;
+ *
+ * @author Ben Litchfield (ben@benlitchfield.com)
+ * @version $Revision: 1.2 $
+ */
+public class PrintTextLocations extends PDFTextStripper
+{
+ /**
+ * Default constructor.
+ *
+ * @throws IOException If there is an error loading text stripper properties.
+ */
+ public PrintTextLocations() throws IOException
+ {
+ //default constructor.
+ }
+
+ /**
+ * This will print the documents data.
+ *
+ * @param args The command line arguments.
+ *
+ * @throws Exception If there is an error parsing the document.
+ */
+ public static void main( String[] args ) throws Exception
+ {
+ if( args.length != 1 )
+ {
+ usage();
+ }
+ else
+ {
+ PDDocument document = null;
+ FileInputStream file = null;
+ try
+ {
+ file = new FileInputStream( args[0] );
+ PDFParser parser = new PDFParser( file );
+ parser.parse();
+ document = parser.getPDDocument();
+ if( document.isEncrypted() )
+ {
+ try
+ {
+ document.decrypt( "" );
+ }
+ catch( InvalidPasswordException e )
+ {
+ System.err.println( "Error: Document is encrypted with a password." );
+ System.exit( 1 );
+ }
+ }
+ PrintTextLocations printer = new PrintTextLocations();
+ List allPages = document.getDocumentCatalog().getAllPages();
+ for( int i=0; i<allPages.size(); i++ )
+ {
+ PDPage page = (PDPage)allPages.get( i );
+ System.out.println( "Processing page: " + i );
+ printer.processStream( page, page.findResources(), page.getContents().getStream() );
+ }
+ }
+ finally
+ {
+ if( file != null )
+ {
+ file.close();
+ }
+ if( document != null )
+ {
+ document.close();
+ }
+ }
+ }
+ }
+
+ /**
+ * A method provided as an event interface to allow a subclass to perform
+ * some specific functionality when a character needs to be displayed.
+ *
+ * @param text The character to be displayed.
+ */
+ protected void showCharacter( TextPosition text )
+ {
+ System.out.println( "String[" + text.getX() + "," + text.getY() + "]" + text.getCharacter() );
+ }
+
+ /**
+ * This will print the usage for this document.
+ */
+ private static void usage()
+ {
+ System.err.println( "Usage: java org.pdfbox.examples.pdmodel.PrintTextLocations <input-pdf>" );
+ }
+
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/examples/util/package.html b/src/main/java/org/pdfbox/examples/util/package.html
new file mode 100644
index 0000000..bc50f59
--- /dev/null
+++ b/src/main/java/org/pdfbox/examples/util/package.html
@@ -0,0 +1,9 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head>
+
+</head>
+<body>
+The packages in this package will show how to use the PDFBox util API.
+</body>
+</html>
diff --git a/src/main/java/org/pdfbox/exceptions/COSVisitorException.java b/src/main/java/org/pdfbox/exceptions/COSVisitorException.java
new file mode 100644
index 0000000..8c5cee1
--- /dev/null
+++ b/src/main/java/org/pdfbox/exceptions/COSVisitorException.java
@@ -0,0 +1,53 @@
+/**
+ * Copyright (c) 2003, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.exceptions;
+
+/**
+ * An exception that represents something gone wrong when visiting a PDF object.
+ *
+ * @author Michael Traut
+ * @version $Revision: 1.6 $
+ */
+public class COSVisitorException extends WrappedException
+{
+
+ /**
+ * COSVisitorException constructor comment.
+ *
+ * @param e The root exception that caused this exception.
+ */
+ public COSVisitorException( Exception e )
+ {
+ super( e );
+ }
+
+
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/exceptions/CryptographyException.java b/src/main/java/org/pdfbox/exceptions/CryptographyException.java
new file mode 100644
index 0000000..c54fb10
--- /dev/null
+++ b/src/main/java/org/pdfbox/exceptions/CryptographyException.java
@@ -0,0 +1,82 @@
+/**
+ * Copyright (c) 2003, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.exceptions;
+
+/**
+ * An exception that indicates that something has gone wrong during a
+ * cryptography operation.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.3 $
+ */
+public class CryptographyException extends Exception
+{
+ private Exception embedded;
+
+ /**
+ * Constructor.
+ *
+ * @param msg A msg to go with this exception.
+ */
+ public CryptographyException( String msg )
+ {
+ super( msg );
+ }
+
+ /**
+ * Constructor.
+ *
+ * @param e The root exception that caused this exception.
+ */
+ public CryptographyException( Exception e )
+ {
+ super( e.getMessage() );
+ setEmbedded( e );
+ }
+ /**
+ * This will get the exception that caused this exception.
+ *
+ * @return The embedded exception if one exists.
+ */
+ public Exception getEmbedded()
+ {
+ return embedded;
+ }
+ /**
+ * This will set the exception that caused this exception.
+ *
+ * @param e The sub exception.
+ */
+ private void setEmbedded( Exception e )
+ {
+ embedded = e;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/exceptions/InvalidPasswordException.java b/src/main/java/org/pdfbox/exceptions/InvalidPasswordException.java
new file mode 100644
index 0000000..22d92ec
--- /dev/null
+++ b/src/main/java/org/pdfbox/exceptions/InvalidPasswordException.java
@@ -0,0 +1,51 @@
+/**
+ * Copyright (c) 2003, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.exceptions;
+
+/**
+ * An exception that indicates an invalid password was supplied.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.3 $
+ */
+public class InvalidPasswordException extends Exception
+{
+
+ /**
+ * Constructor.
+ *
+ * @param msg A msg to go with this exception.
+ */
+ public InvalidPasswordException( String msg )
+ {
+ super( msg );
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/exceptions/OutlineNotLocalException.java b/src/main/java/org/pdfbox/exceptions/OutlineNotLocalException.java
new file mode 100644
index 0000000..db7bf76
--- /dev/null
+++ b/src/main/java/org/pdfbox/exceptions/OutlineNotLocalException.java
@@ -0,0 +1,55 @@
+/**
+ * Copyright (c) 2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.exceptions;
+
+import java.io.IOException;
+
+/**
+ * This exception will be thrown when a local destination(page within the same PDF) is required
+ * but the bookmark(PDOutlineItem) refers to an external destination or an action that does not
+ * point to a page.
+ *
+ * @author Ben Litchfield (ben@benlitchfield.com)
+ * @version $Revision: 1.1 $
+ */
+public class OutlineNotLocalException extends IOException
+{
+
+ /**
+ * Constructor.
+ *
+ * @param msg An error message.
+ */
+ public OutlineNotLocalException( String msg )
+ {
+ super( msg );
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/exceptions/WrappedException.java b/src/main/java/org/pdfbox/exceptions/WrappedException.java
new file mode 100644
index 0000000..558221d
--- /dev/null
+++ b/src/main/java/org/pdfbox/exceptions/WrappedException.java
@@ -0,0 +1,75 @@
+/**
+ * Copyright (c) 2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.exceptions;
+
+import java.io.PrintStream;
+
+/**
+ * An exception that that holds a sub exception.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.1 $
+ */
+public class WrappedException extends Exception
+{
+ private Exception wrapped = null;
+
+ /**
+ * constructor comment.
+ *
+ * @param e The root exception that caused this exception.
+ */
+ public WrappedException( Exception e )
+ {
+ wrapped = e;
+ }
+
+ /**
+ * Gets the wrapped exception message.
+ *
+ * @return A message indicating the exception.
+ */
+ public String getMessage()
+ {
+ return wrapped.getMessage();
+ }
+
+ /**
+ * Prints this throwable and its backtrace to the specified print stream.
+ *
+ * @param s <code>PrintStream</code> to use for output
+ */
+ public void printStackTrace(PrintStream s)
+ {
+ super.printStackTrace( s );
+ wrapped.printStackTrace( s );
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/exceptions/WrappedIOException.java b/src/main/java/org/pdfbox/exceptions/WrappedIOException.java
new file mode 100644
index 0000000..38a004d
--- /dev/null
+++ b/src/main/java/org/pdfbox/exceptions/WrappedIOException.java
@@ -0,0 +1,76 @@
+/**
+ * Copyright (c) 2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.exceptions;
+
+import java.io.IOException;
+import java.io.PrintStream;
+
+/**
+ * An exception that that holds a sub exception.
+ *
+ * @author Ben Litchfield (ben@benlitchfield.com)
+ * @version $Revision: 1.1 $
+ */
+public class WrappedIOException extends IOException
+{
+ private Throwable wrapped = null;
+
+ /**
+ * constructor comment.
+ *
+ * @param e The root exception that caused this exception.
+ */
+ public WrappedIOException( Throwable e )
+ {
+ wrapped = e;
+ }
+
+ /**
+ * Gets the wrapped exception message.
+ *
+ * @return A message indicating the exception.
+ */
+ public String getMessage()
+ {
+ return wrapped.getMessage();
+ }
+
+ /**
+ * Prints this throwable and its backtrace to the specified print stream.
+ *
+ * @param s <code>PrintStream</code> to use for output
+ */
+ public void printStackTrace(PrintStream s)
+ {
+ super.printStackTrace( s );
+ wrapped.printStackTrace( s );
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/exceptions/package.html b/src/main/java/org/pdfbox/exceptions/package.html
new file mode 100644
index 0000000..d45d03a
--- /dev/null
+++ b/src/main/java/org/pdfbox/exceptions/package.html
@@ -0,0 +1,9 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head>
+
+</head>
+<body>
+This package is a place holder for exceptions that are used in the PDFBox project.
+</body>
+</html>
diff --git a/src/main/java/org/pdfbox/filter/ASCII85Filter.java b/src/main/java/org/pdfbox/filter/ASCII85Filter.java
new file mode 100644
index 0000000..335208c
--- /dev/null
+++ b/src/main/java/org/pdfbox/filter/ASCII85Filter.java
@@ -0,0 +1,103 @@
+/**
+ * Copyright (c) 2003, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.filter;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+import org.pdfbox.io.ASCII85InputStream;
+import org.pdfbox.io.ASCII85OutputStream;
+
+import org.pdfbox.cos.COSDictionary;
+
+/**
+ * This is the used for the ASCIIHexDecode filter.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.6 $
+ */
+public class ASCII85Filter implements Filter
+{
+ /**
+ * This will decode some compressed data.
+ *
+ * @param compressedData The compressed byte stream.
+ * @param result The place to write the uncompressed byte stream.
+ * @param options The options to use to encode the data.
+ *
+ * @throws IOException If there is an error decompressing the stream.
+ */
+ public void decode( InputStream compressedData, OutputStream result, COSDictionary options ) throws IOException
+ {
+ ASCII85InputStream is = null;
+ try
+ {
+ is = new ASCII85InputStream(compressedData);
+ byte[] buffer = new byte[1024];
+ int amountRead = 0;
+ while( (amountRead = is.read( buffer, 0, 1024) ) != -1 )
+ {
+ result.write(buffer, 0, amountRead);
+ }
+ result.flush();
+ }
+ finally
+ {
+ if( is != null )
+ {
+ is.close();
+ }
+ }
+ }
+
+ /**
+ * This will encode some data.
+ *
+ * @param rawData The raw data to encode.
+ * @param result The place to write to encoded results to.
+ * @param options The options to use to encode the data.
+ *
+ * @throws IOException If there is an error compressing the stream.
+ */
+ public void encode( InputStream rawData, OutputStream result, COSDictionary options ) throws IOException
+ {
+ ASCII85OutputStream os = new ASCII85OutputStream(result);
+ byte[] buffer = new byte[1024];
+ int amountRead = 0;
+ while( (amountRead = rawData.read( buffer, 0, 1024 )) != -1 )
+ {
+ os.write( buffer, 0, amountRead );
+ }
+ os.close();
+ result.flush();
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/filter/ASCIIHexFilter.java b/src/main/java/org/pdfbox/filter/ASCIIHexFilter.java
new file mode 100644
index 0000000..b3cf506
--- /dev/null
+++ b/src/main/java/org/pdfbox/filter/ASCIIHexFilter.java
@@ -0,0 +1,205 @@
+/**
+ * Copyright (c) 2003, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.filter;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+import org.pdfbox.cos.COSDictionary;
+
+import org.pdfbox.persistence.util.COSHEXTable;
+
+/**
+ * This is the used for the ASCIIHexDecode filter.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.7 $
+ */
+public class ASCIIHexFilter implements Filter
+{
+ private static final int ASCII_ZERO = (int)'0';
+
+
+ /**
+ * This will decode some compressed data.
+ *
+ * @param compressedData The compressed byte stream.
+ * @param result The place to write the uncompressed byte stream.
+ * @param options The options to use to encode the data.
+ *
+ * @throws IOException If there is an error decompressing the stream.
+ */
+ public void decode( InputStream compressedData, OutputStream result, COSDictionary options ) throws IOException
+ {
+ int value =0;
+ int firstByte = 0;
+ int secondByte = 0;
+ while( (firstByte = compressedData.read()) != -1 )
+ {
+ value = REVERSE_HEX[firstByte] * 16;
+ secondByte = compressedData.read();
+ if( secondByte >= 0 )
+ {
+ value += REVERSE_HEX[ secondByte ];
+ }
+ result.write( value );
+ }
+ result.flush();
+ }
+
+ private static final int[] REVERSE_HEX =
+ {
+ -1, //0
+ -1, //1
+ -1, //2
+ -1, //3
+ -1, //4
+ -1, //5
+ -1, //6
+ -1, //7
+ -1, //8
+ -1, //9
+ -1, //10
+ -1, //11
+ -1, //12
+ -1, //13
+ -1, //14
+ -1, //15
+ -1, //16
+ -1, //17
+ -1, //18
+ -1, //19
+ -1, //20
+ -1, //21
+ -1, //22
+ -1, //23
+ -1, //24
+ -1, //25
+ -1, //26
+ -1, //27
+ -1, //28
+ -1, //29
+ -1, //30
+ -1, //31
+ -1, //32
+ -1, //33
+ -1, //34
+ -1, //35
+ -1, //36
+ -1, //37
+ -1, //38
+ -1, //39
+ -1, //40
+ -1, //41
+ -1, //42
+ -1, //43
+ -1, //44
+ -1, //45
+ -1, //46
+ -1, //47
+ 0, //48
+ 1, //49
+ 2, //50
+ 3, //51
+ 4, //52
+ 5, //53
+ 6, //54
+ 7, //55
+ 8, //56
+ 9, //57
+ -1, //58
+ -1, //59
+ -1, //60
+ -1, //61
+ -1, //62
+ -1, //63
+ -1, //64
+ 10, //65
+ 11, //66
+ 12, //67
+ 13, //68
+ 14, //69
+ 15, //70
+ -1, //71
+ -1, //72
+ -1, //73
+ -1, //74
+ -1, //75
+ -1, //76
+ -1, //77
+ -1, //78
+ -1, //79
+ -1, //80
+ -1, //81
+ -1, //82
+ -1, //83
+ -1, //84
+ -1, //85
+ -1, //86
+ -1, //87
+ -1, //88
+ -1, //89
+ -1, //90
+ -1, //91
+ -1, //92
+ -1, //93
+ -1, //94
+ -1, //95
+ -1, //96
+ 10, //97
+ 11, //98
+ 12, //99
+ 13, //100
+ 14, //101
+ 15, //102
+ };
+
+ /**
+ * This will encode some data.
+ *
+ * @param rawData The raw data to encode.
+ * @param result The place to write to encoded results to.
+ * @param options The options to use to encode the data.
+ *
+ * @throws IOException If there is an error compressing the stream.
+ */
+ public void encode( InputStream rawData, OutputStream result, COSDictionary options ) throws IOException
+ {
+ int byteRead = 0;
+ while( (byteRead = rawData.read()) != -1 )
+ {
+ int value = (byteRead+256)%256;
+ result.write( COSHEXTable.TABLE[value] );
+ }
+ result.flush();
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/filter/CCITTFaxDecodeFilter.java b/src/main/java/org/pdfbox/filter/CCITTFaxDecodeFilter.java
new file mode 100644
index 0000000..15f4c58
--- /dev/null
+++ b/src/main/java/org/pdfbox/filter/CCITTFaxDecodeFilter.java
@@ -0,0 +1,735 @@
+/**
+ * Copyright (c) 2003-2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.filter;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+import org.apache.log4j.Logger;
+import org.pdfbox.cos.COSDictionary;
+import org.pdfbox.cos.COSName;
+
+/**
+ * This is a filter for the CCITTFax Decoder.
+ *
+ * @author Ben Litchfield, Marcel Kammer, Paul King
+ * @version $Revision: 1.10 $
+ */
+public class CCITTFaxDecodeFilter implements Filter
+{
+ private static Logger log = Logger.getLogger(CCITTFaxDecodeFilter.class);
+
+ // Filter will write 15 TAG's
+ // If you add or remove TAG's you will have to modify this value
+ private static final int TAG_COUNT = 15;
+
+ // HEADERLENGTH(fix 8 Bytes) plus ImageLength(variable)
+ private int offset = 8;
+
+ // Bytecounter for Bytes that will be written after the TAG-DICTIONARY
+ private int tailingBytesCount = 0;
+
+ // Bytes to write after TAG-DICTIONARY
+ private final ByteArrayOutputStream tailer = new ByteArrayOutputStream();
+
+ /**
+ * Constructor.
+ */
+ public CCITTFaxDecodeFilter()
+ {
+ }
+
+ /**
+ * This will decode some compressed data.
+ *
+ * @param compressedData
+ * The compressed byte stream.
+ * @param result
+ * The place to write the uncompressed byte stream.
+ * @param options
+ * The options to use to encode the data.
+ *
+ * @throws IOException
+ * If there is an error decompressing the stream.
+ */
+ public void decode(InputStream compressedData, OutputStream result, COSDictionary options) throws IOException
+ {
+ // log.warn( "Warning: CCITTFaxDecode.decode is not implemented yet,
+ // skipping this stream." );
+
+
+ // Get ImageParams from PDF
+ COSDictionary dict = (COSDictionary) options.getDictionaryObject("DecodeParms");
+ int width = options.getInt("Width");
+ int height = options.getInt("Height");
+ int length = options.getInt(COSName.LENGTH);
+ int compressionType = dict.getInt("K");
+ boolean blackIs1 = dict.getBoolean("BlackIs1", false);
+
+
+ // HEADER-INFO and starting point of TAG-DICTIONARY
+ writeTagHeader(result, length);
+
+ // IMAGE-DATA
+ int i = 0;
+ //int sum = 0;
+ byte[] buffer = new byte[32768];
+ int lentoread = length;
+
+ while ((lentoread > 0) && ((i = compressedData.read(buffer, 0, Math.min(lentoread, 32768))) != -1))
+ {
+ //sum += i;
+ result.write(buffer, 0, i);
+ lentoread = lentoread - i;
+ }
+
+ // If lentoread is > 0 then we need to write out some padding to equal the header
+ // We'll use what we have in the buffer it's just padding after all
+ while (lentoread > 0)
+ {
+ result.write(buffer, 0, Math.min(lentoread, 32768));
+ lentoread = lentoread - Math.min(lentoread, 32738);
+ }
+ //System.out.println("Gelesen: " + sum);
+
+ // TAG-COUNT
+ writeTagCount(result);
+
+ // WIDTH 0x0100
+ writeTagWidth(result, width);
+
+ // HEIGHT 0x0101
+ writeTagHeight(result, height);
+
+ // BITSPERSAMPLE 0x0102
+ // Always 1 for CCITTFax
+ writeTagBitsPerSample(result, 1);
+
+ // COMPRESSION 0x0103
+ writeTagCompression(result, compressionType);
+
+ // PHOTOMETRIC 0x0106
+ writeTagPhotometric(result, blackIs1);
+
+ // STRIPOFFSET 0x0111
+ // HERE ALWAYS 8, because ImageData comes before TAG-DICTIONARY
+ writeTagStripOffset(result, 8);
+
+ // ORIENTATION 0x0112
+ writeTagOrientation(result, 1);
+
+ // SamplesPerPixel 0x0115
+ writeTagSamplesPerPixel(result, 1);
+
+ // RowsPerStrip 0x0116
+ writeTagRowsPerStrip(result, height);
+
+ // Stripcount 0x0117
+ writeTagStripByteCount(result, length);
+
+ // XRESOLUTION 0x011A
+ // HERE: 200 DPI
+ writeTagXRes(result, 200, 1);
+
+ // YRESOLITION 0x011B
+ // HERE: 200 DPI
+ writeTagYRes(result, 200, 1);
+
+ // ResolutionUnit 0x0128
+ // HERE: DPI
+ writeTagResolutionUnit(result, 2);
+
+ // SOFTWARE 0x0131
+ // minimum 4 chars
+ writeTagSoftware(result, "pdfbox".getBytes());
+
+ // DATE AND TIME 0x0132
+ writeTagDateTime(result, new Date());
+
+ // END OF TAG-DICT
+ writeTagTailer(result);
+ }
+
+ private void writeTagHeader(OutputStream result, int length) throws IOException
+ {
+ byte[] header = { 'M', 'M', 0, '*' };// Big-endian
+ result.write(header);
+
+
+ // Add imagelength to offset
+ offset += length;
+
+ // OFFSET TAG-DICTIONARY
+ int i1 = offset/16777216;//=value/(256*256*256)
+ int i2 = (offset-i1*16777216)/65536;
+ int i3 = (offset-i1*16777216-i2*65536)/256;
+ int i4 = offset % 256;
+ result.write(i1);
+ result.write(i2);
+ result.write(i3);
+ result.write(i4);
+ }
+
+ private void writeTagCount(OutputStream result) throws IOException
+ {
+ result.write(TAG_COUNT / 256);
+ result.write(TAG_COUNT % 256);// tagCount
+ }
+
+ private void writeTagWidth(OutputStream result, int width) throws IOException
+ {
+ // @todo width berechnen
+
+ // TAG-ID 100
+ result.write(1);
+ result.write(0);
+
+
+ // TAG-TYPE SHORT=3
+ result.write(0);
+ result.write(3);
+
+
+ // TAG-LENGTH = 1
+ result.write(0);
+ result.write(0);
+ result.write(0);
+ result.write(1);
+
+
+ // TAG-VALUE = width
+ result.write(width/256);
+ result.write(width%256);
+ result.write(0);// SHORT=0
+ result.write(0);// SHORT=0
+
+ }
+
+ private void writeTagHeight(OutputStream result, int height) throws IOException
+ {
+ //@todo height berechnen
+ // TAG-ID 101
+ result.write(1);
+ result.write(1);
+
+
+ // TAG-TYPE SHORT=3
+ result.write(0);
+ result.write(3);
+
+
+ // TAG-LENGTH = 1
+ result.write(0);
+ result.write(0);
+ result.write(0);
+ result.write(1);
+
+
+ // TAG-VALUE
+ result.write(height/256);
+ result.write(height%256);
+ result.write(0);// SHORT=0
+ result.write(0);// SHORT=0
+
+ }
+
+ private void writeTagBitsPerSample(OutputStream result, int value) throws IOException
+ {
+ // TAG-ID 102
+ result.write(1);
+ result.write(2);
+
+
+ // TAG-TYPE SHORT=3
+ result.write(0);
+ result.write(3);
+
+ // TAG-LENGTH = 1
+ result.write(0);
+ result.write(0);
+ result.write(0);
+ result.write(1);
+
+
+ // TAG-VALUE
+ result.write(value/256);
+ result.write(value%256);
+ result.write(0);//SHORT=0
+ result.write(0);//SHORT=0
+
+ }
+
+ /**
+ * Write the tag compression.
+ *
+ * @param result The stream to write to.
+ * @param type The type to write.
+ * @throws IOException If there is an error writing to the stream.
+ */
+ public void writeTagCompression(OutputStream result, int type) throws IOException
+ {
+ // TAG-ID 103
+ result.write(1);
+ result.write(3);
+
+ // TAG-TYPE SHORT=3
+ result.write(0);
+ result.write(3);
+
+
+ // TAG-LEGNTH = 1
+ result.write(0);
+ result.write(0);
+ result.write(0);
+ result.write(1);
+
+ // TAG-VALUE
+ //@todo typ eintragen; hier immer 4
+ result.write(0);
+ if (type < 0)
+ {
+ result.write(4);// G4
+ }
+ else if (type == 0)
+ {
+ result.write(3);// G3-1D
+ }
+ else
+ {
+ result.write(2);// G3-2D
+ }
+ result.write(0);
+ result.write(0);
+
+ }
+
+ private void writeTagPhotometric(OutputStream result, boolean blackIs1) throws IOException
+ {
+ // TAG-ID 106
+ result.write(1);
+ result.write(6);
+
+
+ // TAG-TYPE SHORT
+ result.write(0);
+ result.write(3);
+
+
+ // TAG-LENGTH = 1
+ result.write(0);
+ result.write(0);
+ result.write(0);
+ result.write(1);
+
+
+ // TAG-VALUE
+ result.write(0);
+ if (blackIs1)
+ {
+ result.write(1);
+ }
+ else
+ {
+ result.write(0);
+ }
+ result.write(0);// SHORT=0
+ result.write(0);// SHORT=0
+
+ }
+
+ private void writeTagStripOffset(OutputStream result, int value) throws IOException
+ {
+ // TAG-ID 111
+ result.write(1);
+ result.write(17);
+
+ // TAG-TYPE LONG=4
+ result.write(0);
+ result.write(4);
+
+
+ // TAG-LENGTH=1
+ result.write(0);
+ result.write(0);
+ result.write(0);
+ result.write(1);
+
+
+ // TAG-VALUE = 8 //VOR TAG-DICTIONARY
+ int i1 = value/16777216;//=value/(256*256*256)
+ int i2 = (value-i1*16777216)/65536;
+ int i3 = (value-i1*16777216-i2*65536)/256;
+ int i4 = value % 256;
+ result.write(i1);
+ result.write(i2);
+ result.write(i3);
+ result.write(i4);
+
+ }
+
+ private void writeTagSamplesPerPixel(OutputStream result, int value) throws IOException
+ {
+ // TAG-ID 115
+ result.write(1);
+ result.write(21);
+
+
+ // TAG-TYPE SHORT=3
+ result.write(0);
+ result.write(3);
+
+
+ // TAG-LENGTH=1
+ result.write(0);
+ result.write(0);
+ result.write(0);
+ result.write(1);
+
+
+ // TAG-VALUE
+ result.write(value / 256);
+ result.write(value % 256);
+ result.write(0);// SHORT=0
+ result.write(0);// SHORT=0
+
+ }
+
+ private void writeTagRowsPerStrip(OutputStream result, int value) throws IOException
+ {
+ // TAG-ID 116
+ result.write(1);
+ result.write(22);
+
+
+ // TAG-TYPE SHORT=3
+ result.write(0);
+ result.write(3);
+
+
+ // TAG-LENGTH=1
+ result.write(0);
+ result.write(0);
+ result.write(0);
+ result.write(1);
+
+
+ // TAG-VALUE
+ result.write(value / 256);
+ result.write(value % 256);
+ result.write(0);// SHORT=0
+ result.write(0);// SHORT=0
+
+ }
+
+ private void writeTagStripByteCount(OutputStream result, int value) throws IOException
+ {
+ //@todo value auswerten
+ // TAG-ID 117
+ result.write(1);
+ result.write(23);
+
+ // TAG-TYPE LONG=4
+ result.write(0);
+ result.write(4);
+
+
+ // TAG-LENGTH = 1
+ result.write(0);
+ result.write(0);
+ result.write(0);
+ result.write(1);
+
+ // TAG-VALUE
+ int i1 = value/16777216;//=value/(256*256*256)
+ int i2 = (value-i1*16777216)/65536;
+ int i3 = (value-i1*16777216-i2*65536)/256;
+ int i4 = value % 256;
+ result.write(i1);
+ result.write(i2);
+ result.write(i3);
+ result.write(i4);
+
+ }
+
+ private void writeTagXRes(OutputStream result, int value1, int value2) throws IOException
+ {
+ // TAG-ID 11A
+ result.write(1);
+ result.write(26);
+
+ // TAG-TYPE RATIONAL=5
+ result.write(0);
+ result.write(5);
+
+ // TAG-LENGTH=1
+ result.write(0);
+ result.write(0);
+ result.write(0);
+ result.write(1);
+
+
+ // TAG-VALUE=OFFSET TO RATIONAL
+ int valueOffset = offset + 6 + 12 * TAG_COUNT + tailer.size();
+ int i1 = valueOffset/16777216;//=value/(256*256*256)
+ int i2 = (valueOffset-i1*16777216)/65536;
+ int i3 = (valueOffset-i1*16777216-i2*65536)/256;
+ int i4 = valueOffset % 256;
+ result.write(i1);
+ result.write(i2);
+ result.write(i3);
+ result.write(i4);
+
+ i1 = value1 /16777216;
+ i2 = (value1-i1*16777216)/65536;
+ i3 = (value1-i1*16777216 - i2*65536)/256;
+ i4 = value1 % 256;
+ tailer.write(i1);
+ tailer.write(i2);
+ tailer.write(i3);
+ tailer.write(i4);
+
+ i1 = value2 /16777216;
+ i2 = (value2-i1*16777216)/65536;
+ i3 = (value2-i1*16777216 - i2*65536)/256;
+ i4 = value2 % 256;
+ tailer.write(i1);
+ tailer.write(i2);
+ tailer.write(i3);
+ tailer.write(i4);
+
+ tailingBytesCount += 8;
+ }
+
+ private void writeTagYRes(OutputStream result, int value1, int value2) throws IOException
+ {
+ // TAG-ID 11B
+ result.write(1);
+ result.write(27);
+
+
+ // TAG-TYPE RATIONAL=5
+ result.write(0);
+ result.write(5);
+
+ // TAG-LENGTH=1
+ result.write(0);
+ result.write(0);
+ result.write(0);
+ result.write(1);
+
+
+ // TAG-VALUE=OFFSET TO RATIONAL
+ int valueOffset = offset + 6 + 12 * TAG_COUNT + tailer.size();
+ int i1 = valueOffset/16777216;//=value/(256*256*256)
+ int i2 = (valueOffset-i1*16777216)/65536;
+ int i3 = (valueOffset-i1*16777216-i2*65536)/256;
+ int i4 = valueOffset % 256;
+ result.write(i1);
+ result.write(i2);
+ result.write(i3);
+ result.write(i4);
+
+ i1 = value1 /16777216;
+ i2 = (value1-i1*16777216)/65536;
+ i3 = (value1-i1*16777216 - i2*65536)/256;
+ i4 = value1 % 256;
+ tailer.write(i1);
+ tailer.write(i2);
+ tailer.write(i3);
+ tailer.write(i4);
+
+ i1 = value2 /16777216;
+ i2 = (value2-i1*16777216)/65536;
+ i3 = (value2-i1*16777216 - i2*65536)/256;
+ i4 = value2 % 256;
+ tailer.write(i1);
+ tailer.write(i2);
+ tailer.write(i3);
+ tailer.write(i4);
+
+ tailingBytesCount += 8;
+ }
+
+ private void writeTagResolutionUnit(OutputStream result, int value) throws IOException
+ {
+ // TAG-ID 128
+ result.write(1);
+ result.write(40);
+
+ // TAG-TYPE SHORT=3
+ result.write(0);
+ result.write(3);
+
+ // TAG-LENGTH = 1
+ result.write(0);
+ result.write(0);
+ result.write(0);
+ result.write(1);
+
+ // TAG-VALUE
+ result.write(value/256);
+ result.write(value%256);
+ result.write(0);// SHORT=0
+ result.write(0);// SHORT=0
+
+ }
+
+ private void writeTagOrientation(OutputStream result, int value) throws IOException
+ {
+ // TAG-ID 112
+ result.write(1);
+ result.write(18);
+
+ // TAG-TYPE SHORT = 3
+ result.write(0);
+ result.write(3);
+
+
+ // TAG-LENGTH=1
+ result.write(0);
+ result.write(0);
+ result.write(0);
+ result.write(1);
+
+ // TAG-VALUE
+ result.write(value / 256);
+ result.write(value % 256);
+ result.write(0);// SHORT=0
+ result.write(0);// SHORT=0
+
+ }
+
+ private void writeTagTailer(OutputStream result) throws IOException
+ {
+ // END OF TAG-DICTIONARY
+ result.write(0);
+ result.write(0);
+ result.write(0);
+ result.write(0);
+
+ // TAILER WITH VALUES OF RATIONALFIELD's
+ result.write(tailer.toByteArray());
+ }
+
+ private void writeTagSoftware(OutputStream result, byte[] text) throws IOException
+ {
+ // TAG-ID 131
+ result.write(1);
+ result.write(49);
+
+ // TAG-TYPE ASCII=2
+ result.write(0);
+ result.write(2);
+
+
+ // TAG-LENGTH=id.length+1
+ result.write(0);
+ result.write(0);
+ result.write((text.length + 1) / 256);
+ result.write((text.length + 1) % 256);
+
+ // TAG-VALUE
+ int valueOffset = offset + 6 + 12 * TAG_COUNT + tailer.size();
+ int i1 = valueOffset/16777216;//=value/(256*256*256)
+ int i2 = (valueOffset-i1*16777216)/65536;
+ int i3 = (valueOffset-i1*16777216-i2*65536)/256;
+ int i4 = valueOffset % 256;
+ result.write(i1);
+ result.write(i2);
+ result.write(i3);
+ result.write(i4);
+
+
+ tailer.write(text);
+ tailer.write(0);
+ tailingBytesCount += text.length + 1;
+ }
+
+ private void writeTagDateTime(OutputStream result, Date date) throws IOException
+ {
+ // TAG-ID 132
+ result.write(1);
+ result.write(50);
+
+
+ // TAG-TYPE ASCII=2
+ result.write(0);
+ result.write(2);
+
+
+ // TAG-LENGTH=20
+ result.write(0);
+ result.write(0);
+ result.write(0);
+ result.write(20);
+
+
+ // TAG-VALUE
+ int valueOffset = offset + 6 + 12 * TAG_COUNT + tailer.size();
+ int i1 = valueOffset/16777216;//=value/(256*256*256)
+ int i2 = (valueOffset-i1*16777216)/65536;
+ int i3 = (valueOffset-i1*16777216-i2*65536)/256;
+ int i4 = valueOffset % 256;
+ result.write(i1);
+ result.write(i2);
+ result.write(i3);
+ result.write(i4);
+
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyy:MM:dd HH:mm:ss");
+ String datetime = sdf.format(date);
+ tailer.write(datetime.getBytes());
+ tailer.write(0);
+
+ tailingBytesCount += 20;
+ }
+
+ /**
+ * This will encode some data.
+ *
+ * @param rawData
+ * The raw data to encode.
+ * @param result
+ * The place to write to encoded results to.
+ * @param options
+ * The options to use to encode the data.
+ *
+ * @throws IOException
+ * If there is an error compressing the stream.
+ */
+ public void encode(InputStream rawData, OutputStream result, COSDictionary options) throws IOException
+ {
+ log.warn("Warning: CCITTFaxDecode.encode is not implemented yet, skipping this stream.");
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/filter/DCTFilter.java b/src/main/java/org/pdfbox/filter/DCTFilter.java
new file mode 100644
index 0000000..8f371ea
--- /dev/null
+++ b/src/main/java/org/pdfbox/filter/DCTFilter.java
@@ -0,0 +1,77 @@
+/**
+ * Copyright (c) 2003, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.filter;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+import org.apache.log4j.Logger;
+import org.pdfbox.cos.COSDictionary;
+
+/**
+ * This is the used for the DCTDecode filter.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.7 $
+ */
+public class DCTFilter implements Filter
+{
+ private static Logger log = Logger.getLogger( DCTFilter.class );
+
+ /**
+ * This will decode some compressed data.
+ *
+ * @param compressedData The compressed byte stream.
+ * @param result The place to write the uncompressed byte stream.
+ * @param options The options to use to encode the data.
+ *
+ * @throws IOException If there is an error decompressing the stream.
+ */
+ public void decode( InputStream compressedData, OutputStream result, COSDictionary options ) throws IOException
+ {
+ log.warn( "Warning: DCTFilter.decode is not implemented yet, skipping this stream." );
+ }
+
+ /**
+ * This will encode some data.
+ *
+ * @param rawData The raw data to encode.
+ * @param result The place to write to encoded results to.
+ * @param options The options to use to encode the data.
+ *
+ * @throws IOException If there is an error compressing the stream.
+ */
+ public void encode( InputStream rawData, OutputStream result, COSDictionary options ) throws IOException
+ {
+ log.warn( "Warning: DCTFilter.encode is not implemented yet, skipping this stream." );
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/filter/Filter.java b/src/main/java/org/pdfbox/filter/Filter.java
new file mode 100644
index 0000000..8de3f81
--- /dev/null
+++ b/src/main/java/org/pdfbox/filter/Filter.java
@@ -0,0 +1,68 @@
+/**
+ * Copyright (c) 2003, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.filter;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+import org.pdfbox.cos.COSDictionary;
+
+/**
+ * This is the interface that will be used to apply filters to a byte stream.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.5 $
+ */
+public interface Filter
+{
+ /**
+ * This will decode some compressed data.
+ *
+ * @param compressedData The compressed byte stream.
+ * @param result The place to write the uncompressed byte stream.
+ * @param options The options to use to encode the data.
+ *
+ * @throws IOException If there is an error decompressing the stream.
+ */
+ public void decode( InputStream compressedData, OutputStream result, COSDictionary options ) throws IOException;
+
+ /**
+ * This will encode some data.
+ *
+ * @param rawData The raw data to encode.
+ * @param result The place to write to encoded results to.
+ * @param options The options to use to encode the data.
+ *
+ * @throws IOException If there is an error compressing the stream.
+ */
+ public void encode( InputStream rawData, OutputStream result, COSDictionary options ) throws IOException;
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/filter/FilterManager.java b/src/main/java/org/pdfbox/filter/FilterManager.java
new file mode 100644
index 0000000..87b1ad4
--- /dev/null
+++ b/src/main/java/org/pdfbox/filter/FilterManager.java
@@ -0,0 +1,135 @@
+/**
+ * Copyright (c) 2003, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.filter;
+
+import java.io.IOException;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.pdfbox.cos.COSName;
+
+/**
+ * This will contain manage all the different types of filters that are available.
+ *
+ * @author Ben Litchfield
+ * @version $Revision: 1.12 $
+ */
+public class FilterManager
+{
+ private Map filters = new HashMap();
+
+ /**
+ * Constructor.
+ */
+ public FilterManager()
+ {
+ Filter flateFilter = new FlateFilter();
+ Filter dctFilter = new DCTFilter();
+ Filter ccittFaxFilter = new CCITTFaxDecodeFilter();
+ Filter lzwFilter = new LZWFilter();
+ Filter asciiHexFilter = new ASCIIHexFilter();
+ Filter ascii85Filter = new ASCII85Filter();
+ Filter runLengthFilter = new RunLengthDecodeFilter();
+
+ addFilter( COSName.FLATE_DECODE, flateFilter );
+ addFilter( COSName.FLATE_DECODE_ABBREVIATION, flateFilter );
+ addFilter( COSName.DCT_DECODE, dctFilter );
+ addFilter( COSName.DCT_DECODE_ABBREVIATION, dctFilter );
+ addFilter( COSName.CCITTFAX_DECODE, ccittFaxFilter );
+ addFilter( COSName.CCITTFAX_DECODE_ABBREVIATION, ccittFaxFilter );
+ addFilter( COSName.LZW_DECODE, lzwFilter );
+ addFilter( COSName.LZW_DECODE_ABBREVIATION, lzwFilter );
+ addFilter( COSName.ASCII_HEX_DECODE, asciiHexFilter );
+ addFilter( COSName.ASCII_HEX_DECODE_ABBREVIATION, asciiHexFilter );
+ addFilter( COSName.ASCII85_DECODE, ascii85Filter );
+ addFilter( COSName.ASCII85_DECODE_ABBREVIATION, ascii85Filter );
+ addFilter( COSName.RUN_LENGTH_DECODE, runLengthFilter );
+ addFilter( COSName.RUN_LENGTH_DECODE_ABBREVIATION, runLengthFilter );
+
+ }
+
+ /**
+ * This will get all of the filters that are available in the system.
+ *
+ * @return All available filters in the system.
+ */
+ public Collection getFilters()
+ {
+ return filters.values();
+ }
+
+ /**
+ * This will add an available filter.
+ *
+ * @param filterName The name of the filter.
+ * @param filter The filter to use.
+ */
+ public void addFilter( COSName filterName, Filter filter )
+ {
+ filters.put( filterName, filter );
+ }
+
+ /**
+ * This will get a filter by name.
+ *
+ * @param filterName The name of the filter to retrieve.
+ *
+ * @return The filter that matches the name.
+ *
+ * @throws IOException If the filter could not be found.
+ */
+ public Filter getFilter( COSName filterName ) throws IOException
+ {
+ Filter filter = (Filter)filters.get( filterName );
+ if( filter == null )
+ {
+ throw new IOException( "Unknown stream filter:" + filterName );
+ }
+
+ return filter;
+ }
+
+ /**
+ * This will get a filter by name.
+ *
+ * @param filterName The name of the filter to retrieve.
+ *
+ * @return The filter that matches the name.
+ *
+ * @throws IOException If the filter could not be found.
+ */
+ public Filter getFilter( String filterName ) throws IOException
+ {
+ return getFilter( COSName.getPDFName( filterName ) );
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/filter/FlateFilter.java b/src/main/java/org/pdfbox/filter/FlateFilter.java
new file mode 100644
index 0000000..c239686
--- /dev/null
+++ b/src/main/java/org/pdfbox/filter/FlateFilter.java
@@ -0,0 +1,303 @@
+/**
+ * Copyright (c) 2003-2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.filter;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.zip.DeflaterOutputStream;
+import java.util.zip.InflaterInputStream;
+
+import org.pdfbox.cos.COSDictionary;
+
+/**
+ * This is the used for the FlateDecode filter.
+ *
+ * @author Ben Litchfield (ben@benlitchfield.com)
+ * @author Marcel Kammer
+ * @version $Revision: 1.9 $
+ */
+public class FlateFilter implements Filter
+{
+ private static final int BUFFER_SIZE = 2048;
+
+ /**
+ * This will decode some compressed data.
+ *
+ * @param compressedData
+ * The compressed byte stream.
+ * @param result
+ * The place to write the uncompressed byte stream.
+ * @param options
+ * The options to use to encode the data.
+ *
+ * @throws IOException
+ * If there is an error decompressing the stream.
+ */
+
+ public void decode(InputStream compressedData, OutputStream result, COSDictionary options) throws IOException
+ {
+ COSDictionary dict = (COSDictionary) options.getDictionaryObject("DecodeParms");
+ int predictor = -1;
+ int colors = -1;
+ int bitsPerPixel = -1;
+ int columns = -1;
+ InflaterInputStream decompressor = null;
+ ByteArrayInputStream bais = null;
+ ByteArrayOutputStream baos = null;
+ if (dict!=null)
+ {
+ predictor = dict.getInt("Predictor");
+ colors = dict.getInt("Colors");
+ bitsPerPixel = options.getInt("BitsPerComponent");
+ columns = dict.getInt("Columns");
+ }
+
+ try
+ {
+ // Decompress data to temporary ByteArrayOutputStream
+ decompressor = new InflaterInputStream(compressedData);
+ byte[] buffer = new byte[BUFFER_SIZE];
+ int amountRead;
+
+ // Decode data using given predictor
+ if (predictor==-1 || predictor == 1 && predictor == 10)
+ {
+ // decoding not needed
+ while ((amountRead = decompressor.read(buffer, 0, BUFFER_SIZE)) != -1)
+ {
+ result.write(buffer, 0, amountRead);
+ }
+ }
+ else
+ {
+ if (colors==-1 || bitsPerPixel==-1 || columns==-1)
+ {
+ throw new IOException("Could not read all parameters to decode image");
+ }
+
+ baos = new ByteArrayOutputStream();
+ while ((amountRead = decompressor.read(buffer, 0, BUFFER_SIZE)) != -1)
+ {
+ baos.write(buffer, 0, amountRead);
+ }
+ baos.flush();
+
+ // Copy data to ByteArrayInputStream for reading
+ bais = new ByteArrayInputStream(baos.toByteArray());
+ baos.close();
+ baos = null;
+
+ byte[] decodedData = decodePredictor(predictor, colors, bitsPerPixel, columns, bais);
+ bais.close();
+ bais = new ByteArrayInputStream(decodedData);
+
+ // write decoded data to result
+ while ((amountRead = bais.read(buffer)) != -1)
+ {
+ result.write(buffer, 0, amountRead);
+ }
+ bais.close();
+ bais = null;
+ }
+
+
+ result.flush();
+ }
+ finally
+ {
+ if (decompressor != null)
+ {
+ decompressor.close();
+ }
+ if (bais != null)
+ {
+ bais.close();
+ }
+ if (baos != null)
+ {
+ baos.close();
+ }
+ }
+ }
+
+ private byte[] decodePredictor(int predictor, int colors, int bitsPerComponent, int columns, InputStream data)
+ throws IOException
+ {
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ byte[] buffer = new byte[2048];
+
+ if (predictor == 1 || predictor == 10)
+ {
+ // No prediction or PNG NONE
+ int i = 0;
+ while ((i = data.read(buffer)) != -1)
+ {
+ baos.write(buffer, 0, i);
+ }
+ }
+ else
+ {
+ // calculate sizes
+ int bpp = (colors * bitsPerComponent + 7) / 8;
+ int rowlength = (columns * colors * bitsPerComponent + 7) / 8 + bpp;
+ byte[] actline = new byte[rowlength];
+ byte[] lastline = new byte[rowlength];// Initialize lastline with
+ // Zeros according to
+ // PNG-specification
+ boolean done = false;
+ int linepredictor = predictor;
+
+ while (!done)
+ {
+ if (predictor == 15)
+ {
+ linepredictor = data.read();// read per line predictor
+ if (linepredictor == -1)
+ {
+ done = true;// reached EOF
+ break;
+ }
+ else
+ {
+ linepredictor += 10; // add 10 to tread value 1 as 11
+ }
+ // (instead of PRED NONE) and 2
+ // as 12 (instead of PRED TIFF)
+ }
+
+ // read line
+ int i = 0;
+ int offset = bpp;
+ while (offset < rowlength && ((i = data.read(actline, offset, rowlength - offset)) != -1))
+ {
+ offset += i;
+ }
+
+ // Do prediction as specified in PNG-Specification 1.2
+ switch (linepredictor)
+ {
+ case 2:// PRED TIFF SUB
+ /**
+ * @todo decode tiff
+ */
+ throw new IOException("TIFF-Predictor not supported");
+ case 11:// PRED SUB
+ for (int p = bpp; p < rowlength; p++)
+ {
+ int sub = actline[p] & 0xff;
+ int left = actline[p - bpp] & 0xff;
+ actline[p] = (byte) (sub + left);
+ }
+ break;
+ case 12:// PRED UP
+ for (int p = bpp; p < rowlength; p++)
+ {
+ int up = actline[p] & 0xff;
+ int prior = lastline[p] & 0xff;
+ actline[p] = (byte) (up + prior);
+ }
+ break;
+ case 13:// PRED AVG
+ for (int p = bpp; p < rowlength; p++)
+ {
+ int avg = actline[p] & 0xff;
+ int left = actline[p - bpp] & 0xff;
+ int up = lastline[p] & 0xff;
+ actline[p] = (byte) (avg + ((left + up) / 2));
+ }
+ break;
+ case 14:// PRED PAETH
+ for (int p = bpp; p < rowlength; p++)
+ {
+ int paeth = actline[p] & 0xff;
+ int a = actline[p - bpp] & 0xff;// left
+ int b = lastline[p] & 0xff;// upper
+ int c = lastline[p - bpp] & 0xff;// upperleft
+ int value = a + b - c;
+ int absa = Math.abs(value - a);
+ int absb = Math.abs(value - b);
+ int absc = Math.abs(value - c);
+
+ if (absa <= absb && absa <= absc)
+ {
+ actline[p] = (byte) (paeth + absa);
+ }
+ else if (absb <= absc)
+ {
+ actline[p] += (byte) (paeth + absb);
+ }
+ else
+ {
+ actline[p] += (byte) (paeth + absc);
+ }
+ }
+ break;
+ default:
+ break;
+ }
+
+ lastline = actline;
+ baos.write(actline, bpp, actline.length - bpp);
+ }
+ }
+
+ return baos.toByteArray();
+ }
+
+ /**
+ * This will encode some data.
+ *
+ * @param rawData
+ * The raw data to encode.
+ * @param result
+ * The place to write to encoded results to.
+ * @param options
+ * The options to use to encode the data.
+ *
+ * @throws IOException
+ * If there is an error compressing the stream.
+ */
+ public void encode(InputStream rawData, OutputStream result, COSDictionary options) throws IOException
+ {
+ DeflaterOutputStream out = new DeflaterOutputStream(result);
+ byte[] buffer = new byte[BUFFER_SIZE];
+ int amountRead = 0;
+ while ((amountRead = rawData.read(buffer, 0, BUFFER_SIZE)) != -1)
+ {
+ out.write(buffer, 0, amountRead);
+ }
+ out.close();
+ result.flush();
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/filter/LZWDictionary.java b/src/main/java/org/pdfbox/filter/LZWDictionary.java
new file mode 100644
index 0000000..075dab8
--- /dev/null
+++ b/src/main/java/org/pdfbox/filter/LZWDictionary.java
@@ -0,0 +1,215 @@
+/**
+ * Copyright (c) 2003, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.filter;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * This is the used for the LZWDecode filter. This represents the dictionary mappings
+ * between codes and their values.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.3 $
+ */
+class LZWDictionary
+{
+ private Map codeToData = new HashMap();
+ private LZWNode root = new LZWNode();
+
+ private ByteArrayOutputStream buffer = new ByteArrayOutputStream();
+ private long nextCode = 258;
+ private int codeSize = 9;
+
+ /**
+ * constructor.
+ */
+ public LZWDictionary()
+ {
+ for( long i=0; i<256; i++ )
+ {
+ LZWNode node = new LZWNode();
+ node.setCode( i );
+ root.setNode( (byte)i, node );
+ codeToData.put( new Long( i ), new byte[]{ (byte)i } );
+ }
+ }
+
+ /**
+ * This will get the value for the code. It will return null if the code is not
+ * defined.
+ *
+ * @param code The key to the data.
+ *
+ * @return The data that is mapped to the code.
+ */
+ public byte[] getData( long code )
+ {
+ return (byte[])codeToData.get( new Long( code ) );
+ }
+
+ /**
+ * This will take a visit from a byte[]. This will create new code entries as
+ * necessary.
+ *
+ * @param data The byte to get a visit from.
+ *
+ * @throws IOException If there is an error visiting this data.
+ */
+ public void visit( byte[] data ) throws IOException
+ {
+ for( int i=0; i<data.length; i++ )
+ {
+ visit( data[i] );
+ }
+ }
+
+ /**
+ * This will take a visit from a byte. This will create new code entries as
+ * necessary.
+ *
+ * @param data The byte to get a visit from.
+ *
+ * @throws IOException If there is an error visiting this data.
+ */
+ public void visit( byte data ) throws IOException
+ {
+ buffer.write( data );
+ byte[] curBuffer = buffer.toByteArray();
+ LZWNode previous = null;
+ LZWNode current = root;
+ boolean createNewCode = false;
+ for( int i=0; i<curBuffer.length && current != null; i++ )
+ {
+ previous = current;
+ current = current.getNode( curBuffer[i] );
+ if( current == null )
+ {
+ createNewCode = true;
+ current = new LZWNode();
+ previous.setNode( curBuffer[i], current );
+ }
+ }
+ if( createNewCode )
+ {
+ long code = nextCode++;
+ current.setCode( code );
+ codeToData.put( new Long( code ), curBuffer );
+
+ /**
+ System.out.print( "Adding " + code + "='" );
+ for( int i=0; i<curBuffer.length; i++ )
+ {
+ String hex = Integer.toHexString( ((curBuffer[i]+256)%256) );
+ if( hex.length() <=1 )
+ {
+ hex = "0" + hex;
+ }
+ if( i != curBuffer.length -1 )
+ {
+ hex += " ";
+ }
+ System.out.print( hex.toUpperCase() );
+ }
+ System.out.println( "'" );
+ **/
+ buffer.reset();
+ buffer.write( data );
+ resetCodeSize();
+ }
+ }
+
+ /**
+ * This will get the next code that will be created.
+ *
+ * @return The next code to be created.
+ */
+ public long getNextCode()
+ {
+ return nextCode;
+ }
+
+ /**
+ * This will get the size of the code in bits, 9, 10, or 11.
+ *
+ * @return The size of the code in bits.
+ */
+ public int getCodeSize()
+ {
+ return codeSize;
+ }
+
+ /**
+ * This will determine the code size.
+ */
+ private void resetCodeSize()
+ {
+ if( nextCode >= 2048 )
+ {
+ codeSize = 12;
+ }
+ else if( nextCode >= 1024 )
+ {
+ codeSize = 11;
+ }
+ else if( nextCode >= 512 )
+ {
+ codeSize = 10;
+ }
+ else
+ {
+ codeSize = 9;
+ }
+ }
+
+ /**
+ * This will crear the internal buffer that the dictionary uses.
+ */
+ public void clear()
+ {
+ buffer.reset();
+ }
+
+ /**
+ * This will folow the path to the data node.
+ *
+ * @param data The path to the node.
+ *
+ * @return The node that resides at that path.
+ */
+ public LZWNode getNode( byte[] data )
+ {
+ return root.getNode( data );
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/filter/LZWFilter.java b/src/main/java/org/pdfbox/filter/LZWFilter.java
new file mode 100644
index 0000000..e8ba003
--- /dev/null
+++ b/src/main/java/org/pdfbox/filter/LZWFilter.java
@@ -0,0 +1,235 @@
+/**
+ * Copyright (c) 2003-2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.filter;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.PushbackInputStream;
+import java.io.StreamCorruptedException;
+
+import org.pdfbox.cos.COSDictionary;
+
+import org.pdfbox.io.NBitInputStream;
+import org.pdfbox.io.NBitOutputStream;
+
+/**
+ * This is the used for the LZWDecode filter.
+ *
+ * @author Ben Litchfield (ben@benlitchfield.com)
+ * @version $Revision: 1.13 $
+ */
+public class LZWFilter implements Filter
+{
+
+ /**
+ * The LZW clear table code.
+ */
+ public static final long CLEAR_TABLE = 256;
+ /**
+ * The LZW end of data code.
+ */
+ public static final long EOD = 257;
+
+ /**
+ * This will decode some compressed data.
+ *
+ * @param compressedData The compressed byte stream.
+ * @param result The place to write the uncompressed byte stream.
+ * @param options The options to use to encode the data.
+ *
+ * @throws IOException If there is an error decompressing the stream.
+ */
+ public void decode( InputStream compressedData, OutputStream result, COSDictionary options ) throws IOException
+ {
+ //log.debug("decode( )");
+ NBitInputStream in = null;
+ in = new NBitInputStream( compressedData );
+ in.setBitsInChunk( 9 );
+ LZWDictionary dic = new LZWDictionary();
+ byte firstByte = 0;
+ long nextCommand = 0;
+ while( (nextCommand = in.read() ) != EOD )
+ {
+ // log.debug( "decode - nextCommand=" + nextCommand + ", bitsInChunk: " + in.getBitsInChunk());
+
+ if( nextCommand == CLEAR_TABLE )
+ {
+ in.setBitsInChunk( 9 );
+ dic = new LZWDictionary();
+ }
+ else
+ {
+ byte[] data = dic.getData( nextCommand );
+ if( data == null )
+ {
+ dic.visit( firstByte );
+ data = dic.getData( nextCommand );
+ dic.clear();
+ }
+ if( data == null )
+ {
+ throw new StreamCorruptedException( "Error: data is null" );
+ }
+ dic.visit(data);
+
+ //log.debug( "decode - dic.getNextCode(): " + dic.getNextCode());
+
+ if( dic.getNextCode() >= 2047 )
+ {
+ in.setBitsInChunk( 12 );
+ }
+ else if( dic.getNextCode() >= 1023 )
+ {
+ in.setBitsInChunk( 11 );
+ }
+ else if( dic.getNextCode() >= 511 )
+ {
+ in.setBitsInChunk( 10 );
+ }
+ else
+ {
+ in.setBitsInChunk( 9 );
+ }
+ /**
+ if( in.getBitsInChunk() != dic.getCodeSize() )
+ {
+ in.unread( nextCommand );
+ in.setBitsInChunk( dic.getCodeSize() );
+ System.out.print( "Switching " + nextCommand + " to " );
+ nextCommand = in.read();
+ System.out.println( "" + nextCommand );
+ data = dic.getData( nextCommand );
+ }**/
+ firstByte = data[0];
+ result.write( data );
+ }
+ }
+ result.flush();
+ }
+
+
+ /**
+ * This will encode some data.
+ *
+ * @param rawData The raw data to encode.
+ * @param result The place to write to encoded results to.
+ * @param options The options to use to encode the data.
+ *
+ * @throws IOException If there is an error compressing the stream.
+ */
+ public void encode( InputStream rawData, OutputStream result, COSDictionary options ) throws IOException
+ {
+ //log.debug("encode( )");
+ PushbackInputStream input = new PushbackInputStream( rawData, 4096 );
+ LZWDictionary dic = new LZWDictionary();
+ NBitOutputStream out = new NBitOutputStream( result );
+ out.setBitsInChunk( 9 ); //initially nine
+ out.write( CLEAR_TABLE );
+ ByteArrayOutputStream buffer = new ByteArrayOutputStream();
+ int byteRead = 0;
+ for( int i=0; (byteRead = input.read()) != -1; i++ )
+ {
+ //log.debug( "byteRead = '" + (char)byteRead + "' (0x" + Integer.toHexString(byteRead) + "), i=" + i);
+ buffer.write( byteRead );
+ dic.visit( (byte)byteRead );
+ out.setBitsInChunk( dic.getCodeSize() );
+
+ //log.debug( "Getting node '" + new String( buffer.toByteArray() ) + "', buffer.size = " + buffer.size() );
+ LZWNode node = dic.getNode( buffer.toByteArray() );
+ int nextByte = input.read();
+ if( nextByte != -1 )
+ {
+ //log.debug( "nextByte = '" + (char)nextByte + "' (0x" + Integer.toHexString(nextByte) + ")");
+ LZWNode next = node.getNode( (byte)nextByte );
+ if( next == null )
+ {
+ //log.debug("encode - No next node, writing node and resetting buffer (" +
+ // " node.getCode: " + node.getCode() + ")" +
+ // " bitsInChunk: " + out.getBitsInChunk() +
+ // ")");
+ out.write( node.getCode() );
+ buffer.reset();
+ }
+
+ input.unread( nextByte );
+ }
+ else
+ {
+ //log.debug("encode - EOF on lookahead: writing node, resetting buffer, and terminating read loop (" +
+ // " node.getCode: " + node.getCode() + ")" +
+ // " bitsInChunk: " + out.getBitsInChunk() +
+ // ")");
+ out.write( node.getCode() );
+ buffer.reset();
+ break;
+ }
+
+ if( dic.getNextCode() == 4096 )
+ {
+ //log.debug("encode - Clearing dictionary and unreading pending buffer data (" +
+ // " bitsInChunk: " + out.getBitsInChunk() +
+ // ")");
+ out.write( CLEAR_TABLE );
+ dic = new LZWDictionary();
+ input.unread( buffer.toByteArray() );
+ buffer.reset();
+ }
+ }
+
+ // Fix the code size based on the fact that we are writing the EOD
+ //
+ if( dic.getNextCode() >= 2047 )
+ {
+ out.setBitsInChunk( 12 );
+ }
+ else if( dic.getNextCode() >= 1023 )
+ {
+ out.setBitsInChunk( 11 );
+ }
+ else if( dic.getNextCode() >= 511 )
+ {
+ out.setBitsInChunk( 10 );
+ }
+ else
+ {
+ out.setBitsInChunk( 9 );
+ }
+
+ //log.debug("encode - Writing EOD (" +
+ // " bitsInChunk: " + out.getBitsInChunk() +
+ // ")");
+ out.write( EOD );
+ out.close();
+ result.flush();
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/filter/LZWNode.java b/src/main/java/org/pdfbox/filter/LZWNode.java
new file mode 100644
index 0000000..563ea5d
--- /dev/null
+++ b/src/main/java/org/pdfbox/filter/LZWNode.java
@@ -0,0 +1,115 @@
+/**
+ * Copyright (c) 2003, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.filter;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * This is the used for the LZWDecode filter.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.3 $
+ */
+class LZWNode
+{
+ private long code;
+ private Map subNodes = new HashMap();
+
+ /**
+ * This will get the number of children.
+ *
+ * @return The number of children.
+ */
+ public int childCount()
+ {
+ return subNodes.size();
+ }
+
+ /**
+ * This will set the node for a particular byte.
+ *
+ * @param b The byte for that node.
+ * @param node The node to add.
+ */
+ public void setNode( byte b, LZWNode node )
+ {
+ subNodes.put( new Byte( b ), node );
+ }
+
+ /**
+ * This will get the node that is a direct sub node of this node.
+ *
+ * @param data The byte code to the node.
+ *
+ * @return The node at that value if it exists.
+ */
+ public LZWNode getNode( byte data )
+ {
+ return (LZWNode)subNodes.get( new Byte( data ) );
+ }
+
+
+ /**
+ * This will traverse the tree until it gets to the sub node.
+ * This will return null if the node does not exist.
+ *
+ * @param data The path to the node.
+ *
+ * @return The node that resides at the data path.
+ */
+ public LZWNode getNode( byte[] data )
+ {
+ LZWNode current = this;
+ for( int i=0; i<data.length && current != null; i++ )
+ {
+ current = current.getNode( data[i] );
+ }
+ return current;
+ }
+
+ /** Getter for property code.
+ * @return Value of property code.
+ */
+ public long getCode()
+ {
+ return code;
+ }
+
+ /** Setter for property code.
+ * @param codeValue New value of property code.
+ */
+ public void setCode(long codeValue)
+ {
+ code = codeValue;
+ }
+
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/filter/RunLengthDecodeFilter.java b/src/main/java/org/pdfbox/filter/RunLengthDecodeFilter.java
new file mode 100644
index 0000000..d1fe1c1
--- /dev/null
+++ b/src/main/java/org/pdfbox/filter/RunLengthDecodeFilter.java
@@ -0,0 +1,126 @@
+/**
+ * Copyright (c) 2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.filter;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+import org.apache.log4j.Logger;
+import org.pdfbox.cos.COSDictionary;
+
+/**
+ * This is a filter for the RunLength Decoder.
+ *
+ * From the PDF Reference
+ * <pre>
+ * The RunLengthDecode filter decodes data that has been encoded in a simple
+ * byte-oriented format based on run length. The encoded data is a sequence of
+ * runs, where each run consists of a length byte followed by 1 to 128 bytes of data. If
+ * the length byte is in the range 0 to 127, the following length + 1 (1 to 128) bytes
+ * are copied literally during decompression. If length is in the range 129 to 255, the
+ * following single byte is to be copied 257 ? length (2 to 128) times during decompression.
+ * A length value of 128 denotes EOD.
+ *
+ * The compression achieved by run-length encoding depends on the input data. In
+ * the best case (all zeros), a compression of approximately 64:1 is achieved for long
+ * files. The worst case (the hexadecimal sequence 00 alternating with FF) results in
+ * an expansion of 127:128.
+ * </pre>
+ *
+ * @author Ben Litchfield
+ * @version $Revision: 1.3 $
+ */
+public class RunLengthDecodeFilter implements Filter
+{
+ private static Logger log = Logger.getLogger( RunLengthDecodeFilter.class );
+
+ private static final int RUN_LENGTH_EOD = 128;
+
+ /**
+ * Constructor.
+ */
+ public RunLengthDecodeFilter()
+ {
+ //default constructor
+ }
+
+ /**
+ * This will decode some compressed data.
+ *
+ * @param compressedData The compressed byte stream.
+ * @param result The place to write the uncompressed byte stream.
+ * @param options The options to use to encode the data.
+ *
+ * @throws IOException If there is an error decompressing the stream.
+ */
+ public void decode( InputStream compressedData, OutputStream result, COSDictionary options ) throws IOException
+ {
+ int dupAmount = -1;
+ byte[] buffer = new byte[128];
+ while( (dupAmount = compressedData.read()) != -1 && dupAmount != RUN_LENGTH_EOD )
+ {
+ if( dupAmount <= 127 )
+ {
+ int amountToCopy = dupAmount+1;
+ int compressedRead = 0;
+ while( amountToCopy > 0 )
+ {
+ compressedRead = compressedData.read( buffer, 0, amountToCopy );
+ result.write( buffer, 0, compressedRead );
+ amountToCopy -= compressedRead;
+ }
+ }
+ else
+ {
+ int dupByte = compressedData.read();
+ for( int i=0; i<257-dupAmount; i++ )
+ {
+ result.write( dupByte );
+ }
+ }
+ }
+ }
+
+ /**
+ * This will encode some data.
+ *
+ * @param rawData The raw data to encode.
+ * @param result The place to write to encoded results to.
+ * @param options The options to use to encode the data.
+ *
+ * @throws IOException If there is an error compressing the stream.
+ */
+ public void encode( InputStream rawData, OutputStream result, COSDictionary options ) throws IOException
+ {
+ log.warn( "Warning: RunLengthDecodeFilter.encode is not implemented yet, skipping this stream." );
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/filter/package.html b/src/main/java/org/pdfbox/filter/package.html
new file mode 100644
index 0000000..36dbb7d
--- /dev/null
+++ b/src/main/java/org/pdfbox/filter/package.html
@@ -0,0 +1,9 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head>
+
+</head>
+<body>
+This package will hold the PDFBox implementations of the filters that are used in PDF documents.
+</body>
+</html>
diff --git a/src/main/java/org/pdfbox/io/ASCII85InputStream.java b/src/main/java/org/pdfbox/io/ASCII85InputStream.java
new file mode 100644
index 0000000..863d64d
--- /dev/null
+++ b/src/main/java/org/pdfbox/io/ASCII85InputStream.java
@@ -0,0 +1,269 @@
+/**
+ * Copyright (c) 2003, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.io;
+
+import java.io.FilterInputStream;
+import java.io.InputStream;
+import java.io.IOException;
+
+/**
+ * This class represents an ASCII85 stream.
+ *
+ * @author Ben Litchfield
+ * @version $Revision: 1.5 $
+ */
+public class ASCII85InputStream extends FilterInputStream
+{
+ private int index;
+ private int n;
+ private boolean eof;
+
+ private byte[] ascii;
+ private byte[] b;
+
+ /**
+ * Constructor.
+ *
+ * @param is The input stream to actually read from.
+ */
+ public ASCII85InputStream( InputStream is )
+ {
+ super(is);
+ index = 0;
+ n = 0;
+ eof = false;
+ ascii = new byte[5];
+ b = new byte[4];
+ }
+
+ /**
+ * This will read the next byte from the stream.
+ *
+ * @return The next byte read from the stream.
+ *
+ * @throws IOException If there is an error reading from the wrapped stream.
+ */
+ public final int read() throws IOException
+ {
+ if( index >= n )
+ {
+ if(eof)
+ {
+ return -1;
+ }
+ index = 0;
+ int k;
+ byte z;
+ do
+ {
+ int zz=(byte)in.read();
+ if(zz==-1)
+ {
+ eof=true;
+ return -1;
+ }
+ z = (byte)zz;
+ } while( z=='\n' || z=='\r' || z==' ');
+
+ if (z == '~' || z=='x')
+ {
+ eof=true;
+ ascii=b=null;
+ n = 0;
+ return -1;
+ }
+ else if (z == 'z')
+ {
+ b[0]=b[1]=b[2]=b[3]=0;
+ n = 4;
+ }
+ else
+ {
+ ascii[0]=z; // may be EOF here....
+ for (k=1;k<5;++k)
+ {
+ do
+ {
+ int zz=(byte)in.read();
+ if(zz==-1)
+ {
+ eof=true;
+ return -1;
+ }
+ z=(byte)zz;
+ } while ( z=='\n' || z=='\r' || z==' ' );
+ ascii[k]=z;
+ if (z == '~' || z=='x')
+ {
+ break;
+ }
+ }
+ n = k - 1;
+ if ( n==0 )
+ {
+ eof = true;
+ ascii = null;
+ b = null;
+ return -1;
+ }
+ if ( k < 5 )
+ {
+ for (++k; k < 5; ++k )
+ {
+ ascii[k] = 0x21;
+ }
+ eof=true;
+ }
+ // decode stream
+ long t=0;
+ for ( k=0; k<5; ++k)
+ {
+ z=(byte)(ascii[k] - 0x21);
+ if (z < 0 || z > 93)
+ {
+ n = 0;
+ eof = true;
+ ascii = null;
+ b = null;
+ throw new IOException("Invalid data in Ascii85 stream");
+ }
+ t = (t * 85L) + z;
+ }
+ for ( k = 3; k>=0; --k)
+ {
+ b[k] = (byte)(t & 0xFFL);
+ t>>>=8;
+ }
+ }
+ }
+ return b[index++] & 0xFF;
+ }
+
+ /**
+ * This will read a chunk of data.
+ *
+ * @param data The buffer to write data to.
+ * @param offset The offset into the data stream.
+ * @param len The number of byte to attempt to read.
+ *
+ * @return The number of bytes actually read.
+ *
+ * @throws IOException If there is an error reading data from the underlying stream.
+ */
+ public final int read(byte[] data, int offset, int len) throws IOException
+ {
+ if(eof && index>=n)
+ {
+ return -1;
+ }
+ for(int i=0;i<len;i++)
+ {
+ if(index<n)
+ {
+ data[i+offset]=b[index++];
+ }
+ else
+ {
+ int t = read();
+ if ( t == -1 )
+ {
+ return i;
+ }
+ data[i+offset]=(byte)t;
+ }
+ }
+ return len;
+ }
+
+ /**
+ * This will close the underlying stream and release any resources.
+ *
+ * @throws IOException If there is an error closing the underlying stream.
+ */
+ public void close() throws IOException
+ {
+ ascii = null;
+ eof = true;
+ b = null;
+ super.close();
+ }
+
+ /**
+ * non supported interface methods.
+ *
+ * @return False always.
+ */
+ public boolean markSupported()
+ {
+ return false;
+ }
+
+ /**
+ * Unsupported.
+ *
+ * @param nValue ignored.
+ *
+ * @return Always zero.
+ */
+ public long skip(long nValue)
+ {
+ return 0;
+ }
+
+ /**
+ * Unsupported.
+ *
+ * @return Always zero.
+ */
+ public int available()
+ {
+ return 0;
+ }
+
+ /**
+ * Unsupported.
+ *
+ * @param readlimit ignored.
+ */
+ public void mark(int readlimit)
+ {
+ }
+
+ /**
+ * Unsupported.
+ *
+ * @throws IOException telling that this is an unsupported action.
+ */
+ public void reset() throws IOException
+ {
+ throw new IOException("Reset is not supported");
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/io/ASCII85OutputStream.java b/src/main/java/org/pdfbox/io/ASCII85OutputStream.java
new file mode 100644
index 0000000..a59f2df
--- /dev/null
+++ b/src/main/java/org/pdfbox/io/ASCII85OutputStream.java
@@ -0,0 +1,304 @@
+/**
+ * Copyright (c) 2003, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.io;
+
+import java.io.FilterOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+
+/**
+ * This class represents an ASCII85 output stream.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.6 $
+ */
+public class ASCII85OutputStream extends FilterOutputStream
+{
+
+ private int lineBreak;
+ private int count;
+
+ private byte[] indata;
+ private byte[] outdata;
+
+ /**
+ * Function produces five ASCII printing characters from
+ * four bytes of binary data.
+ */
+ private int maxline;
+ private boolean flushed;
+ private char terminator;
+
+ /**
+ * Constructor.
+ *
+ * @param out The output stream to write to.
+ */
+ public ASCII85OutputStream( OutputStream out )
+ {
+ super( out );
+ lineBreak = 36*2;
+ maxline = 36*2;
+ count=0;
+ indata=new byte[4];
+ outdata=new byte[5];
+ flushed=true;
+ terminator='~';
+ }
+
+ /**
+ * This will set the terminating character.
+ *
+ * @param term The terminating character.
+ */
+ public void setTerminator(char term)
+ {
+ if(term<118 || term>126 || term=='z')
+ {
+ throw new IllegalArgumentException("Terminator must be 118-126 excluding z");
+ }
+ terminator=term;
+ }
+
+ /**
+ * This will get the terminating character.
+ *
+ * @return The terminating character.
+ */
+ public char getTerminator()
+ {
+ return terminator;
+ }
+
+ /**
+ * This will set the line length that will be used.
+ *
+ * @param l The length of the line to use.
+ */
+ public void setLineLength(int l)
+ {
+ if( lineBreak > l )
+ {
+ lineBreak = l;
+ }
+ maxline=l;
+ }
+
+ /**
+ * This will get the length of the line.
+ *
+ * @return The line length attribute.
+ */
+ public int getLineLength()
+ {
+ return maxline;
+ }
+
+ /**
+ * This will transform the next four ascii bytes.
+ */
+ private final void transformASCII85()
+ {
+ long word;
+ word=( (((indata[0] << 8) | (indata[1] &0xFF)) << 16) |
+ ( (indata[2] & 0xFF) << 8) | (indata[3] & 0xFF)
+ ) & 0xFFFFFFFFL;
+ // System.out.println("word=0x"+Long.toString(word,16)+" "+word);
+
+ if (word == 0 )
+ {
+ outdata[0]=(byte)'z';
+ outdata[1]=0;
+ return;
+ }
+ long x;
+ x=word/(85L*85L*85L*85L);
+ // System.out.println("x0="+x);
+ outdata[0]=(byte)(x+'!');
+ word-=x*85L*85L*85L*85L;
+
+ x=word/(85L*85L*85L);
+ // System.out.println("x1="+x);
+ outdata[1]=(byte)(x+'!');
+ word-=x*85L*85L*85L;
+
+ x=word/(85L*85L);
+ // System.out.println("x2="+x);
+ outdata[2]=(byte)(x+'!');
+ word-=x*85L*85L;
+
+ x=word/85L;
+ // System.out.println("x3="+x);
+ outdata[3]=(byte)(x+'!');
+
+ // word-=x*85L;
+
+ // System.out.println("x4="+(word % 85L));
+ outdata[4]=(byte)((word%85L)+'!');
+ }
+
+ /**
+ * This will write a single byte.
+ *
+ * @param b The byte to write.
+ *
+ * @throws IOException If there is an error writing to the stream.
+ */
+ public final void write(int b) throws IOException
+ {
+ flushed=false;
+ indata[count++]=(byte)b;
+ if(count < 4 )
+ {
+ return;
+ }
+ transformASCII85();
+ for(int i=0;i<5;i++)
+ {
+ if(outdata[i]==0)
+ {
+ break;
+ }
+ out.write(outdata[i]);
+ if(--lineBreak==0)
+ {
+ out.write('\n');
+ lineBreak=maxline;
+ }
+ }
+ count = 0;
+ }
+
+ /**
+ * This will write a chunk of data to the stream.
+ *
+ * @param b The byte buffer to read from.
+ * @param off The offset into the buffer.
+ * @param sz The number of bytes to read from the buffer.
+ *
+ * @throws IOException If there is an error writing to the underlying stream.
+ */
+ public final void write(byte[] b,int off, int sz) throws IOException
+ {
+ for(int i=0;i<sz;i++)
+ {
+ if(count < 3)
+ {
+ indata[count++]=b[off+i];
+ }
+ else
+ {
+ write(b[off+i]);
+ }
+ }
+ }
+
+ /**
+ * This will flush the data to the stream.
+ *
+ * @throws IOException If there is an error writing the data to the stream.
+ */
+ public final void flush() throws IOException
+ {
+ if(flushed)
+ {
+ return;
+ }
+ if(count > 0 )
+ {
+ for( int i=count; i<4; i++ )
+ {
+ indata[i]=0;
+ }
+ transformASCII85();
+ if(outdata[0]=='z')
+ {
+ for(int i=0;i<5;i++) // expand 'z',
+ {
+ outdata[i]=(byte)'!';
+ }
+ }
+ for(int i=0;i<count+1;i++)
+ {
+ out.write(outdata[i]);
+ if(--lineBreak==0)
+ {
+ out.write('\n');
+ lineBreak=maxline;
+ }
+ }
+ }
+ if(--lineBreak==0)
+ {
+ out.write('\n');
+ }
+ out.write(terminator);
+ out.write('\n');
+ count = 0;
+ lineBreak=maxline;
+ flushed=true;
+ super.flush();
+ }
+
+ /**
+ * This will close the stream.
+ *
+ * @throws IOException If there is an error closing the wrapped stream.
+ */
+ public void close() throws IOException
+ {
+ try
+ {
+ super.close();
+ }
+ finally
+ {
+ indata=outdata=null;
+ }
+ }
+
+ /**
+ * This will flush the stream.
+ *
+ * @throws Throwable If there is an error.
+ */
+ protected void finalize() throws Throwable
+ {
+ try
+ {
+ flush();
+ }
+ finally
+ {
+ super.finalize();
+ }
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/io/ByteArrayPushBackInputStream.java b/src/main/java/org/pdfbox/io/ByteArrayPushBackInputStream.java
new file mode 100644
index 0000000..e72cbbb
--- /dev/null
+++ b/src/main/java/org/pdfbox/io/ByteArrayPushBackInputStream.java
@@ -0,0 +1,404 @@
+/**
+ * Copyright (c) 2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.io;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+/**
+ * PushBackInputStream for byte arrays.
+ *
+ * The inheritance from PushBackInputStream is only to avoid the
+ * introduction of an interface with all PushBackInputStream
+ * methods. The parent PushBackInputStream is not used in any way and
+ * all methods are overridden. (Thus when adding new methods to PushBackInputStream
+ * override them in this class as well!)
+ * unread() is limited to the number of bytes already read from this stream (i.e.
+ * the current position in the array). This limitation usually poses no problem
+ * to a parser, but allows for some optimization since only one array has to
+ * be dealt with.
+ *
+ * Note: This class is not thread safe. Clients must provide synchronization
+ * if needed.
+ *
+ * Note: Calling unread() after mark() will cause (part of) the unread data to be
+ * read again after reset(). Thus do not call unread() between mark() and reset().
+ *
+ * @author Andreas Weiss (andreas.weiss@switzerland.org)
+ * @version $Revision: 1.2 $
+ */
+public class ByteArrayPushBackInputStream extends PushBackInputStream
+{
+ private byte[] data;
+ private int datapos;
+ private int datalen;
+ private int save;
+
+ // dummy for base class constructor
+ private static final InputStream DUMMY = new ByteArrayInputStream("".getBytes());
+
+ /**
+ * Constructor.
+ * @param input Data to read from. Note that calls to unread() will
+ * modify this array! If this is not desired, pass a copy.
+ *
+ * @throws IOException If there is an IO error.
+ */
+ public ByteArrayPushBackInputStream(byte[] input) throws IOException
+ {
+ super(DUMMY, 1);
+ data = input;
+ datapos = 0;
+ save = datapos;
+ datalen = input != null ? input.length : 0;
+ }
+
+ /**
+ * This will peek at the next byte.
+ *
+ * @return The next byte on the stream, leaving it as available to read.
+ */
+ public int peek()
+ {
+ try
+ {
+ // convert negative values to 128..255
+ return (data[datapos] + 0x100) & 0xff;
+ }
+ catch (ArrayIndexOutOfBoundsException ex)
+ {
+ // could check this before, but this is a rare case
+ // and this method is called sufficiently often to justify this
+ // optimization
+ return -1;
+ }
+ }
+
+ /**
+ * A simple test to see if we are at the end of the stream.
+ *
+ * @return true if we are at the end of the stream.
+ */
+ public boolean isEOF()
+ {
+ return datapos >= datalen;
+ }
+
+ /**
+ * Save the state of this stream.
+ * @param readlimit Has no effect.
+ * @see InputStream#mark(int)
+ */
+ public void mark(int readlimit)
+ {
+ if (false)
+ {
+ ++readlimit; // avoid unused param warning
+ }
+ save = datapos;
+ }
+
+ /**
+ * Check if mark is supported.
+ * @return Always true.
+ * @see InputStream#markSupported()
+ */
+ public boolean markSupported()
+ {
+ return true;
+ }
+
+ /**
+ * Restore the state of this stream to the last saveState call.
+ * @see InputStream#reset()
+ */
+ public void reset()
+ {
+ datapos = save;
+ }
+
+ /** Available bytes.
+ * @see InputStream#available()
+ * @return Available bytes.
+ */
+ public int available()
+ {
+ int av = datalen - datapos;
+ return av > 0 ? av : 0;
+ }
+
+ /** Totally available bytes in the underlying array.
+ * @return Available bytes.
+ */
+ public int size()
+ {
+ return datalen;
+ }
+
+ /**
+ * Pushes back a byte.
+ * After this method returns, the next byte to be read will have the value (byte)by.
+ * @param by the int value whose low-order byte is to be pushed back.
+ * @throws IOException - If there is not enough room in the buffer for the byte.
+ * @see java.io.PushbackInputStream#unread(int)
+ */
+ public void unread(int by) throws IOException
+ {
+ if (datapos == 0)
+ {
+ throw new IOException("ByteArrayParserInputStream.unread(int): " +
+ "cannot unread 1 byte at buffer position " + datapos);
+ }
+ --datapos;
+ data[datapos] = (byte)by;
+ }
+
+ /**
+ * Pushes back a portion of an array of bytes by copying it to the
+ * front of the pushback buffer. After this method returns, the next byte
+ * to be read will have the value b[off], the byte after that will have
+ * the value b[off+1], and so forth.
+ * @param buffer the byte array to push back.
+ * @param off the start offset of the data.
+ * @param len the number of bytes to push back.
+ * @throws IOException If there is not enough room in the pushback buffer
+ * for the specified number of bytes.
+ * @see java.io.PushbackInputStream#unread(byte[], int, int)
+ */
+ public void unread(byte[] buffer, int off, int len) throws IOException
+ {
+ if (len <= 0 || off >= buffer.length)
+ {
+ return;
+ }
+ if (off < 0)
+ {
+ off = 0;
+ }
+ if (len > buffer.length)
+ {
+ len = buffer.length;
+ }
+ localUnread(buffer, off, len);
+ }
+
+ /**
+ * Pushes back a portion of an array of bytes by copying it to the
+ * front of the pushback buffer. After this method returns, the next byte
+ * to be read will have the value buffer[0], the byte after that will have
+ * the value buffer[1], and so forth.
+ * @param buffer the byte array to push back.
+ * @throws IOException If there is not enough room in the pushback buffer
+ * for the specified number of bytes.
+ * @see java.io.PushbackInputStream#unread(byte[])
+ */
+ public void unread(byte[] buffer) throws IOException
+ {
+ localUnread(buffer, 0, buffer.length);
+ }
+
+ /**
+ * Pushes back a portion of an array of bytes by copying it to the
+ * front of the pushback buffer. After this method returns, the next byte
+ * to be read will have the value buffer[off], the byte after that will have
+ * the value buffer[off+1], and so forth.
+ * Internal method that assumes off and len to be valid.
+ * @param buffer the byte array to push back.
+ * @param off the start offset of the data.
+ * @param len the number of bytes to push back.
+ * @throws IOException If there is not enough room in the pushback buffer
+ * for the specified number of bytes.
+ * @see java.io.PushbackInputStream#unread(byte[], int, int)
+ */
+ private void localUnread(byte[] buffer, int off, int len) throws IOException
+ {
+ if (datapos < len)
+ {
+ throw new IOException("ByteArrayParserInputStream.unread(int): " +
+ "cannot unread " + len +
+ " bytes at buffer position " + datapos);
+ }
+ datapos -= len;
+ System.arraycopy(buffer, off, data, datapos, len);
+ }
+
+ /**
+ * Read a byte.
+ * @see InputStream#read()
+ * @return Byte read or -1 if no more bytes are available.
+ */
+ public int read()
+ {
+ try
+ {
+ // convert negative values to 128..255
+ return (data[datapos++] + 0x100) & 0xff;
+ }
+ catch (ArrayIndexOutOfBoundsException ex)
+ {
+ // could check this before, but this is a rare case
+ // and this method is called sufficiently often to justify this
+ // optimization
+ datapos = datalen;
+ return -1;
+ }
+ }
+
+ /**
+ * Read a number of bytes.
+ * @see InputStream#read(byte[])
+ * @param buffer the buffer into which the data is read.
+ * @return the total number of bytes read into the buffer, or -1 if there
+ * is no more data because the end of the stream has been reached.
+ */
+ public int read(byte[] buffer)
+ {
+ return localRead(buffer, 0, buffer.length);
+ }
+
+ /**
+ * Read a number of bytes.
+ * @see InputStream#read(byte[], int, int)
+ * @param buffer the buffer into which the data is read.
+ * @param off the start offset in array buffer at which the data is written.
+ * @param len the maximum number of bytes to read.
+ * @return the total number of bytes read into the buffer, or -1 if there
+ * is no more data because the end of the stream has been reached.
+ */
+ public int read(byte[] buffer, int off, int len)
+ {
+ if (len <= 0 || off >= buffer.length)
+ {
+ return 0;
+ }
+ if (off < 0)
+ {
+ off = 0;
+ }
+ if (len > buffer.length)
+ {
+ len = buffer.length;
+ }
+ return localRead(buffer, off, len);
+ }
+
+
+ /**
+ * Read a number of bytes. Internal method that assumes off and len to be
+ * valid.
+ * @see InputStream#read(byte[], int, int)
+ * @param buffer the buffer into which the data is read.
+ * @param off the start offset in array buffer at which the data is written.
+ * @param len the maximum number of bytes to read.
+ * @return the total number of bytes read into the buffer, or -1 if there
+ * is no more data because the end of the stream has been reached.
+ */
+ public int localRead(byte[] buffer, int off, int len)
+ {
+ if (len == 0)
+ {
+ return 0; // must return 0 even if at end!
+ }
+ else if (datapos >= datalen)
+ {
+ return -1;
+ }
+ else
+ {
+ int newpos = datapos + len;
+ if (newpos > datalen)
+ {
+ newpos = datalen;
+ len = newpos - datapos;
+ }
+ System.arraycopy(data, datapos, buffer, off, len);
+ datapos = newpos;
+ return len;
+ }
+ }
+
+ /**
+ * Skips over and discards n bytes of data from this input stream.
+ * The skip method may, for a variety of reasons, end up skipping over some
+ * smaller number of bytes, possibly 0. This may result from any of a number
+ * of conditions; reaching end of file before n bytes have been skipped is
+ * only one possibility. The actual number of bytes skipped is returned.
+ * If n is negative, no bytes are skipped.
+ * @param num the number of bytes to be skipped.
+ * @return the actual number of bytes skipped.
+ * @see InputStream#skip(long)
+ */
+ public long skip(long num)
+ {
+ if (num <= 0)
+ {
+ return 0;
+ }
+ else
+ {
+ long newpos = datapos + num;
+ if (newpos >= datalen)
+ {
+ num = datalen - datapos;
+ datapos = datalen;
+ }
+ else
+ {
+ datapos = (int)newpos;
+ }
+ return num;
+ }
+ }
+
+ /** Position the stream at a given index. Positioning the stream
+ * at position size() will cause the next call to read() to return -1.
+ *
+ * @param newpos Position in the underlying array. A negative value will be
+ * interpreted as 0, a value greater than size() as size().
+ * @return old position.
+ */
+ public int seek(int newpos)
+ {
+ if (newpos < 0)
+ {
+ newpos = 0;
+ }
+ else if (newpos > datalen)
+ {
+ newpos = datalen;
+ }
+ int oldpos = pos;
+ pos = newpos;
+ return oldpos;
+ }
+
+}
diff --git a/src/main/java/org/pdfbox/io/FastByteArrayOutputStream.java b/src/main/java/org/pdfbox/io/FastByteArrayOutputStream.java
new file mode 100644
index 0000000..1e5fdc6
--- /dev/null
+++ b/src/main/java/org/pdfbox/io/FastByteArrayOutputStream.java
@@ -0,0 +1,62 @@
+/**
+ * Copyright (c) 2003, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.io;
+
+import java.io.ByteArrayOutputStream;
+
+/**
+ * An byte array output stream that allows direct access to the byte array.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.3 $
+ */
+public class FastByteArrayOutputStream extends ByteArrayOutputStream
+{
+ /**
+ * Constructor.
+ *
+ * @param size An initial size of the stream.
+ */
+ public FastByteArrayOutputStream( int size )
+ {
+ super( size );
+ }
+
+ /**
+ * This will get the underlying byte array.
+ *
+ * @return The underlying byte array at this moment in time.
+ */
+ public byte[] getByteArray()
+ {
+ return buf;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/io/NBitInputStream.java b/src/main/java/org/pdfbox/io/NBitInputStream.java
new file mode 100644
index 0000000..d8254b2
--- /dev/null
+++ b/src/main/java/org/pdfbox/io/NBitInputStream.java
@@ -0,0 +1,124 @@
+/**
+ * Copyright (c) 2003, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.io;
+
+import java.io.InputStream;
+import java.io.IOException;
+
+/**
+ * This is an n-bit input stream. This means that you can read chunks of data
+ * as any number of bits, not just 8 bits like the regular input stream. Just set the
+ * number of bits that you would like to read on each call. The default is 8.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.3 $
+ */
+public class NBitInputStream
+{
+ private int bitsInChunk;
+ private InputStream in;
+
+ private int currentByte;
+ private int bitsLeftInCurrentByte;
+
+ /**
+ * Constructor.
+ *
+ * @param is The input stream to read from.
+ */
+ public NBitInputStream( InputStream is )
+ {
+ in = is;
+ bitsLeftInCurrentByte = 0;
+ bitsInChunk = 8;
+ }
+
+ /**
+ * This will unread some data.
+ *
+ * @param data The data to put back into the stream.
+ */
+ public void unread( long data )
+ {
+ data <<= bitsLeftInCurrentByte;
+ currentByte |= data;
+ bitsLeftInCurrentByte += bitsInChunk;
+ }
+
+ /**
+ * This will read the next n bits from the stream and return the unsigned
+ * value of those bits.
+ *
+ * @return The next n bits from the stream.
+ *
+ * @throws IOException If there is an error reading from the underlying stream.
+ */
+ public long read() throws IOException
+ {
+ long retval = 0;
+ for( int i=0; i<bitsInChunk && retval != -1; i++ )
+ {
+ if( bitsLeftInCurrentByte == 0 )
+ {
+ currentByte = in.read();
+ bitsLeftInCurrentByte = 8;
+ }
+ if( currentByte == -1 )
+ {
+ retval = -1;
+ }
+ else
+ {
+ retval <<= 1;
+ retval |= ((currentByte >> (bitsLeftInCurrentByte-1))&0x1);
+ bitsLeftInCurrentByte--;
+ }
+ }
+ return retval;
+ }
+
+ /** Getter for property bitsToRead.
+ * @return Value of property bitsToRead.
+ */
+ public int getBitsInChunk()
+ {
+ return bitsInChunk;
+ }
+
+ /** Setter for property bitsToRead.
+ * @param bitsInChunkValue New value of property bitsToRead.
+ */
+ public void setBitsInChunk(int bitsInChunkValue)
+ {
+ bitsInChunk = bitsInChunkValue;
+ }
+
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/io/NBitOutputStream.java b/src/main/java/org/pdfbox/io/NBitOutputStream.java
new file mode 100644
index 0000000..f944b8a
--- /dev/null
+++ b/src/main/java/org/pdfbox/io/NBitOutputStream.java
@@ -0,0 +1,116 @@
+/**
+ * Copyright (c) 2003, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.io;
+
+import java.io.OutputStream;
+import java.io.IOException;
+
+/**
+ * This is an n-bit output stream. This means that you write data in n-bit chunks.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.3 $
+ */
+public class NBitOutputStream
+{
+ private int bitsInChunk;
+ private OutputStream out;
+
+ private int currentByte;
+ private int positionInCurrentByte;
+
+ /**
+ * Constructor.
+ *
+ * @param os The output stream to write to.
+ */
+ public NBitOutputStream( OutputStream os )
+ {
+ out = os;
+ currentByte = 0;
+ positionInCurrentByte = 7;
+ }
+
+ /**
+ * This will write the next n-bits to the stream.
+ *
+ * @param chunk The next chunk of data to write.
+ *
+ * @throws IOException If there is an error writing the chunk.
+ */
+ public void write( long chunk ) throws IOException
+ {
+ long bitToWrite;
+ for( int i=(bitsInChunk-1); i>=0; i-- )
+ {
+ bitToWrite = (chunk >> i) & 0x1;
+ bitToWrite <<= positionInCurrentByte;
+ currentByte |= bitToWrite;
+ positionInCurrentByte--;
+ if( positionInCurrentByte < 0 )
+ {
+ out.write( currentByte );
+ currentByte = 0;
+ positionInCurrentByte = 7;
+ }
+ }
+ }
+
+ /**
+ * This will close the stream.
+ *
+ * @throws IOException if there is an error closing the stream.
+ */
+ public void close() throws IOException
+ {
+ if( positionInCurrentByte < 7 )
+ {
+ out.write( currentByte );
+ }
+ }
+
+ /** Getter for property bitsToRead.
+ * @return Value of property bitsToRead.
+ */
+ public int getBitsInChunk()
+ {
+ return bitsInChunk;
+ }
+
+ /** Setter for property bitsToRead.
+ * @param bitsInChunkValue New value of property bitsToRead.
+ */
+ public void setBitsInChunk(int bitsInChunkValue)
+ {
+ bitsInChunk = bitsInChunkValue;
+ }
+
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/io/PushBackInputStream.java b/src/main/java/org/pdfbox/io/PushBackInputStream.java
new file mode 100644
index 0000000..d519900
--- /dev/null
+++ b/src/main/java/org/pdfbox/io/PushBackInputStream.java
@@ -0,0 +1,92 @@
+/**
+ * Copyright (c) 2003, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.io;
+
+import java.io.InputStream;
+import java.io.IOException;
+
+/**
+ * A simple subclass that adds a few convience methods.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.4 $
+ */
+public class PushBackInputStream extends java.io.PushbackInputStream
+{
+
+ /**
+ * Constructor.
+ *
+ * @param input The input stream.
+ * @param size The size of the push back buffer.
+ *
+ * @throws IOException If there is an error with the stream.
+ */
+ public PushBackInputStream( InputStream input, int size ) throws IOException
+ {
+ super( input, size );
+ if( input == null )
+ {
+ throw new IOException( "Error: input was null" );
+ }
+ }
+
+ /**
+ * This will peek at the next byte.
+ *
+ * @return The next byte on the stream, leaving it as available to read.
+ *
+ * @throws IOException If there is an error reading the next byte.
+ */
+ public int peek() throws IOException
+ {
+ int result = read();
+ if( result != -1 )
+ {
+ unread( result );
+ }
+ return result;
+ }
+
+ /**
+ * A simple test to see if we are at the end of the stream.
+ *
+ * @return true if we are at the end of the stream.
+ *
+ * @throws IOException If there is an error reading the next byte.
+ */
+ public boolean isEOF() throws IOException
+ {
+ int peek = peek();
+ return peek == -1;
+ }
+
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/io/RandomAccessFileInputStream.java b/src/main/java/org/pdfbox/io/RandomAccessFileInputStream.java
new file mode 100644
index 0000000..6589bcb
--- /dev/null
+++ b/src/main/java/org/pdfbox/io/RandomAccessFileInputStream.java
@@ -0,0 +1,132 @@
+/**
+ * Copyright (c) 2003, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.io;
+
+import java.io.InputStream;
+import java.io.IOException;
+import java.io.RandomAccessFile;
+
+/**
+ * This class allows a section of a RandomAccessFile to be accessed as an
+ * input stream.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.3 $
+ */
+public class RandomAccessFileInputStream extends InputStream
+{
+ private RandomAccessFile file;
+ private long currentPosition;
+ private long endPosition;
+
+ /**
+ * Constructor.
+ *
+ * @param raFile The file to read the data from.
+ * @param startPosition The position in the file that this stream starts.
+ * @param length The length of the input stream.
+ */
+ public RandomAccessFileInputStream( RandomAccessFile raFile, long startPosition, long length )
+ {
+ file = raFile;
+ currentPosition = startPosition;
+ endPosition = currentPosition+length;
+ }
+ /**
+ * @see InputStream#available()
+ */
+ public int available()
+ {
+ return (int)(endPosition - currentPosition);
+ }
+ /**
+ * @see InputStream#close()
+ */
+ public void close()
+ {
+ //do nothing because we want to leave the random access file open.
+ }
+ /**
+ * @see InputStream#read()
+ */
+ public int read() throws IOException
+ {
+ synchronized(file)
+ {
+ int retval = -1;
+ if( currentPosition < endPosition )
+ {
+ file.seek( currentPosition );
+ currentPosition++;
+ retval = file.read();
+ }
+ return retval;
+ }
+ }
+ /**
+ * @see InputStream#read( byte[], int, int )
+ */
+ public int read( byte[] b, int offset, int length ) throws IOException
+ {
+ //only allow a read of the amount available.
+ if( length > available() )
+ {
+ length = available();
+ }
+ int amountRead = -1;
+ //only read if there are bytes actually available, otherwise
+ //return -1 if the EOF has been reached.
+ if( available() > 0 )
+ {
+ synchronized(file)
+ {
+ file.seek( currentPosition );
+ amountRead = file.read( b, offset, length );
+ }
+ }
+ //update the current cursor position.
+ if( amountRead > 0 )
+ {
+ currentPosition += amountRead;
+ }
+ return amountRead;
+ }
+
+ /**
+ * @see InputStream#skip( long )
+ */
+ public long skip( long amountToSkip )
+ {
+ long amountSkipped = Math.min( amountToSkip, available() );
+ currentPosition+= amountSkipped;
+ return amountSkipped;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/io/RandomAccessFileOutputStream.java b/src/main/java/org/pdfbox/io/RandomAccessFileOutputStream.java
new file mode 100644
index 0000000..b2e7511
--- /dev/null
+++ b/src/main/java/org/pdfbox/io/RandomAccessFileOutputStream.java
@@ -0,0 +1,145 @@
+/**
+ * Copyright (c) 2003, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.io;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.RandomAccessFile;
+
+import org.pdfbox.cos.COSBase;
+import org.pdfbox.cos.COSObject;
+import org.pdfbox.cos.COSNumber;
+
+/**
+ * This will write to a RandomAccessFile in the filesystem and keep track
+ * of the position it is writing to and the length of the stream.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.3 $
+ */
+public class RandomAccessFileOutputStream extends OutputStream
+{
+ private RandomAccessFile file;
+ private long position;
+ private long lengthWritten = 0;
+ private COSBase expectedLength = null;
+
+ /**
+ * Constructor to create an output stream that will write to the end of a
+ * random access file.
+ *
+ * @param raf The file to write to.
+ *
+ * @throws IOException If there is a problem accessing the raf.
+ */
+ public RandomAccessFileOutputStream( RandomAccessFile raf ) throws IOException
+ {
+ file = raf;
+ //first get the position that we will be writing to
+ position = raf.length();
+ }
+
+ /**
+ * This will get the position in the RAF that the stream was written
+ * to.
+ *
+ * @return The position in the raf where the file can be obtained.
+ */
+ public long getPosition()
+ {
+ return position;
+ }
+
+ /**
+ * The number of bytes written to the stream.
+ *
+ * @return The number of bytes read to the stream.
+ */
+ public long getLength()
+ {
+ long length = -1;
+ if( expectedLength instanceof COSNumber )
+ {
+ length = ((COSNumber)expectedLength).intValue();
+ }
+ else if( expectedLength instanceof COSObject &&
+ ((COSObject)expectedLength).getObject() instanceof COSNumber )
+ {
+ length = ((COSNumber)((COSObject)expectedLength).getObject()).intValue();
+ }
+ if( length == -1 )
+ {
+ length = lengthWritten;
+ }
+ return length;
+ }
+
+ /**
+ * @see OutputStream#write( byte[], int, int )
+ */
+ public void write( byte[] b, int offset, int length ) throws IOException
+ {
+ file.seek( position+lengthWritten );
+ lengthWritten += length;
+ file.write( b, offset, length );
+
+ }
+ /**
+ * @see OutputStream#write( int )
+ */
+ public void write( int b ) throws IOException
+ {
+ file.seek( position+lengthWritten );
+ lengthWritten++;
+ file.write( b );
+ }
+
+ /**
+ * This will get the length that the PDF document specified this stream
+ * should be. This may not match the number of bytes read.
+ *
+ * @return The expected length.
+ */
+ public COSBase getExpectedLength()
+ {
+ return expectedLength;
+ }
+
+ /**
+ * This will set the expected length of this stream.
+ *
+ * @param value The expected value.
+ */
+ public void setExpectedLength(COSBase value)
+ {
+ expectedLength = value;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/io/package.html b/src/main/java/org/pdfbox/io/package.html
new file mode 100644
index 0000000..12261f4
--- /dev/null
+++ b/src/main/java/org/pdfbox/io/package.html
@@ -0,0 +1,9 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head>
+
+</head>
+<body>
+This package contains IO streams.
+</body>
+</html>
diff --git a/src/main/java/org/pdfbox/package.html b/src/main/java/org/pdfbox/package.html
new file mode 100644
index 0000000..f040f68
--- /dev/null
+++ b/src/main/java/org/pdfbox/package.html
@@ -0,0 +1,9 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head>
+
+</head>
+<body>
+This package holds executable classes that interact with the PDFBox application.
+</body>
+</html>
diff --git a/src/main/java/org/pdfbox/pdfparser/BaseParser.java b/src/main/java/org/pdfbox/pdfparser/BaseParser.java
new file mode 100644
index 0000000..3937025
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdfparser/BaseParser.java
@@ -0,0 +1,1369 @@
+/**
+ * Copyright (c) 2003-2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdfparser;
+
+import java.io.BufferedInputStream;
+import java.io.InputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.RandomAccessFile;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.pdfbox.io.ByteArrayPushBackInputStream;
+import org.pdfbox.io.PushBackInputStream;
+
+import org.pdfbox.cos.COSArray;
+import org.pdfbox.cos.COSBase;
+import org.pdfbox.cos.COSBoolean;
+import org.pdfbox.cos.COSDictionary;
+import org.pdfbox.cos.COSDocument;
+import org.pdfbox.cos.COSInteger;
+import org.pdfbox.cos.COSName;
+import org.pdfbox.cos.COSNull;
+import org.pdfbox.cos.COSNumber;
+import org.pdfbox.cos.COSObject;
+import org.pdfbox.cos.COSStream;
+import org.pdfbox.cos.COSString;
+
+import org.pdfbox.persistence.util.COSObjectKey;
+import org.apache.log4j.Logger;
+
+/**
+ * This class is used to contain parsing logic that will be used by both the
+ * PDFParser and the COSStreamParser.
+ *
+ * @author Ben Litchfield (ben@benlitchfield.com)
+ * @version $Revision: 1.57 $
+ */
+public abstract class BaseParser
+{
+ private static Logger log = Logger.getLogger(BaseParser.class);
+
+ /**
+ * This is a byte array that will be used for comparisons.
+ */
+ public static final byte[] ENDSTREAM =
+ new byte[] {101,110,100,115,116,114,101,97,109};//"endstream".getBytes( "ISO-8859-1" );
+
+ /**
+ * This is a byte array that will be used for comparisons.
+ */
+ public static final String DEF = "def";
+
+ /**
+ * This is the stream that will be read from.
+ */
+ //protected PushBackByteArrayStream pdfSource;
+ protected PushBackInputStream pdfSource;
+
+ /**
+ * moved xref here, is a persistence construct
+ * maybe not needed anyway when not read from behind with delayed
+ * access to objects.
+ */
+ private List xrefs = new ArrayList();
+
+ private COSDocument document;
+
+ /**
+ * Constructor.
+ *
+ * @param input The input stream to read the data from.
+ *
+ * @throws IOException If there is an error reading the input stream.
+ */
+ public BaseParser( InputStream input) throws IOException
+ {
+ //pdfSource = new PushBackByteArrayStream( input );
+ pdfSource = new PushBackInputStream( new BufferedInputStream( input, 16384 ), 4096 );
+ }
+
+ /**
+ * Constructor.
+ *
+ * @param input The array to read the data from.
+ *
+ * @throws IOException If there is an error reading the byte data.
+ */
+ protected BaseParser(byte[] input) throws IOException
+ {
+ pdfSource = new ByteArrayPushBackInputStream(input);
+ }
+
+ /**
+ * Set the document for this stream.
+ *
+ * @param doc The current document.
+ */
+ public void setDocument( COSDocument doc )
+ {
+ document = doc;
+ }
+
+ private static boolean isHexDigit(char ch)
+ {
+ return (ch >= '0' && ch <= '9') ||
+ (ch >= 'a' && ch <= 'f') ||
+ (ch >= 'A' && ch <= 'F');
+ // the line below can lead to problems with certain versions of the IBM JIT compiler
+ // (and is slower anyway)
+ //return (HEXDIGITS.indexOf(ch) != -1);
+ }
+
+ /**
+ * This will parse a PDF dictionary value.
+ *
+ * @return The parsed Dictionary object.
+ *
+ * @throws IOException If there is an error parsing the dictionary object.
+ */
+ private COSBase parseCOSDictionaryValue() throws IOException
+ {
+
+ if( log.isDebugEnabled() )
+ {
+ log.debug("parseCOSDictionaryValue() " + pdfSource );
+ }
+ COSBase retval = null;
+ COSBase number = parseDirObject();
+ skipSpaces();
+ char next = (char)pdfSource.peek();
+ if( next >= '0' && next <= '9' )
+ {
+ COSBase generationNumber = parseDirObject();
+ skipSpaces();
+ char r = (char)pdfSource.read();
+ if( r != 'R' )
+ {
+ throw new IOException( "expected='R' actual='" + r + "' " + pdfSource );
+ }
+ COSObjectKey key = new COSObjectKey(((COSInteger) number).intValue(),
+ ((COSInteger) generationNumber).intValue());
+ retval = document.getObjectFromPool(key);
+ }
+ else
+ {
+ retval = number;
+ }
+ return retval;
+ }
+
+ /**
+ * This will parse a PDF dictionary.
+ *
+ * @return The parsed dictionary.
+ *
+ * @throws IOException IF there is an error reading the stream.
+ */
+ protected COSDictionary parseCOSDictionary() throws IOException
+ {
+ if( log.isDebugEnabled() )
+ {
+ log.debug("parseCOSDictionary() " + pdfSource );
+ }
+ char c = (char)pdfSource.read();
+ if( c != '<')
+ {
+ throw new IOException( "expected='<' actual='" + c + "'" );
+ }
+ c = (char)pdfSource.read();
+ if( c != '<')
+ {
+ throw new IOException( "expected='<' actual='" + c + "' " + pdfSource );
+ }
+ skipSpaces();
+ COSDictionary obj = new COSDictionary();
+ boolean done = false;
+ while( !done )
+ {
+ skipSpaces();
+ c = (char)pdfSource.peek();
+ if( c == '>')
+ {
+ done = true;
+ }
+ else
+ {
+ COSName key = parseCOSName();
+ COSBase value = parseCOSDictionaryValue();
+ skipSpaces();
+ if( ((char)pdfSource.peek()) == 'd' )
+ {
+ //if the next string is 'def' then we are parsing a cmap stream
+ //and want to ignore it, otherwise throw an exception.
+ String potentialDEF = readString();
+ if( !potentialDEF.equals( DEF ) )
+ {
+ pdfSource.unread( potentialDEF.getBytes() );
+ }
+ else
+ {
+ skipSpaces();
+ }
+ }
+
+ if( value == null )
+ {
+ throw new IOException("Bad Dictionary Declaration " + pdfSource );
+ }
+ obj.setItem( key, value );
+ }
+ }
+ char ch = (char)pdfSource.read();
+ if( ch != '>' )
+ {
+ throw new IOException( "expected='>' actual='" + ch + "'" );
+ }
+ ch = (char)pdfSource.read();
+ if( ch != '>' )
+ {
+ throw new IOException( "expected='>' actual='" + ch + "'" );
+ }
+ if( log.isDebugEnabled() )
+ {
+ log.debug("parseCOSDictionary() done peek='" + pdfSource.peek() + "'" );
+ }
+ return obj;
+ }
+
+ /**
+ * This will read a COSStream from the input stream.
+ *
+ * @param file The file to write the stream to when reading.
+ * @param dic The dictionary that goes with this stream.
+ *
+ * @return The parsed pdf stream.
+ *
+ * @throws IOException If there is an error reading the stream.
+ */
+ protected COSStream parseCOSStream( COSDictionary dic, RandomAccessFile file ) throws IOException
+ {
+ if( log.isDebugEnabled() )
+ {
+ log.debug("parseCOSStream() " + pdfSource );
+ }
+ COSStream stream = new COSStream( dic, file );
+ OutputStream out = null;
+ try
+ {
+ String streamString = readString();
+ //long streamLength;
+
+ if (!streamString.equals("stream"))
+ {
+ throw new IOException("expected='stream' actual='" + streamString + "'");
+ }
+
+ //PDF Ref 3.2.7 A stream must be followed by either
+ //a CRLF or LF but nothing else.
+
+ int whitespace = pdfSource.read();
+
+ //see brother_scan_cover.pdf, it adds whitespaces
+ //after the stream but before the start of the
+ //data, so just read those first
+ while (whitespace == 0x20)
+ {
+ whitespace = pdfSource.read();
+ }
+
+ if( whitespace == 0x0D )
+ {
+ whitespace = pdfSource.read();
+ if( whitespace != 0x0A )
+ {
+ pdfSource.unread( whitespace );
+ //The spec says this is invalid but it happens in the real
+ //world so we must support it.
+ //throw new IOException("expected='0x0A' actual='0x" +
+ // Integer.toHexString(whitespace) + "' " + pdfSource);
+ }
+ }
+ else if (whitespace == 0x0A)
+ {
+ //that is fine
+ }
+ else
+ {
+ //we are in an error.
+ //but again we will do a lenient parsing and just assume that everything
+ //is fine
+ pdfSource.unread( whitespace );
+ //throw new IOException("expected='0x0D or 0x0A' actual='0x" +
+ //Integer.toHexString(whitespace) + "' " + pdfSource);
+
+ }
+
+
+ COSBase streamLength = dic.getDictionaryObject(COSName.LENGTH);
+ long length = -1;
+ if( streamLength instanceof COSNumber )
+ {
+ length = ((COSNumber)streamLength).intValue();
+ }
+ else if( streamLength instanceof COSObject &&
+ ((COSObject)streamLength).getObject() instanceof COSNumber )
+ {
+ length = ((COSNumber)((COSObject)streamLength).getObject()).intValue();
+ }
+
+ //length = -1;
+ //streamLength = null;
+
+ //Need to keep track of the
+ out = stream.createFilteredStream( streamLength );
+ String endStream = null;
+ //the length is wrong in some pdf documents which means
+ //that PDFBox must basically ignore it in order to be able to read
+ //the most number of PDF documents. This of course is a penalty hit,
+ //maybe I could implement a faster parser.
+ /**if( length != -1 )
+ {
+ byte[] buffer = new byte[1024];
+ int amountRead = 0;
+ int totalAmountRead = 0;
+ while( amountRead != -1 && totalAmountRead < length )
+ {
+ int maxAmountToRead = Math.min(buffer.length, (int)(length-totalAmountRead));
+ amountRead = pdfSource.read(buffer,0,maxAmountToRead);
+ totalAmountRead += amountRead;
+ if( amountRead != -1 )
+ {
+ out.write( buffer, 0, amountRead );
+ }
+ }
+ }
+ else
+ {**/
+ readUntilEndStream( out );
+ /**}*/
+ skipSpaces();
+ endStream = readString();
+
+ if (!endStream.equals("endstream"))
+ {
+ readUntilEndStream( out );
+ endStream = readString();
+ if( !endStream.equals( "endstream" ) )
+ {
+ throw new IOException("expected='endstream' actual='" + endStream + "' " + pdfSource);
+ }
+ }
+ }
+ finally
+ {
+ if( out != null )
+ {
+ out.close();
+ }
+ }
+ if( log.isDebugEnabled() )
+ {
+ log.debug("parseCOSStream() done" );
+ }
+ return stream;
+ }
+
+ private void readUntilEndStream( OutputStream out ) throws IOException
+ {
+ int currentIndex = 0;
+ int byteRead = 0;
+ //this is the additional bytes buffered but not written
+ int additionalBytes=0;
+ byte[] buffer = new byte[ENDSTREAM.length+additionalBytes];
+ int writeIndex = 0;
+ while(!cmpCircularBuffer( buffer, currentIndex, ENDSTREAM ) && byteRead != -1 )
+ {
+ writeIndex = currentIndex - buffer.length;
+ if( writeIndex >= 0 )
+ {
+ out.write( buffer[writeIndex%buffer.length] );
+ }
+ byteRead = pdfSource.read();
+ buffer[currentIndex%buffer.length] = (byte)byteRead;
+ currentIndex++;
+ }
+
+ //we want to ignore the end of the line data when reading a stream
+ //so will make an attempt to ignore it.
+ /*writeIndex = currentIndex - buffer.length;
+ if( buffer[writeIndex%buffer.length] == 13 &&
+ buffer[(writeIndex+1)%buffer.length] == 10 )
+ {
+ //then ignore the newline before the endstream
+ }
+ else if( buffer[(writeIndex+1)%buffer.length] == 10 )
+ {
+ //Then first byte is data, second byte is newline
+ out.write( buffer[writeIndex%buffer.length] );
+ }
+ else
+ {
+ out.write( buffer[writeIndex%buffer.length] );
+ out.write( buffer[(writeIndex+1)%buffer.length] );
+ }*/
+
+ /**
+ * Old way of handling newlines before endstream
+ for( int i=0; i<additionalBytes; i++ )
+ {
+ writeIndex = currentIndex - buffer.length;
+ if( writeIndex >=0 &&
+ //buffer[writeIndex%buffer.length] != 10 &&
+ buffer[writeIndex%buffer.length] != 13 )
+ {
+ out.write( buffer[writeIndex%buffer.length] );
+ }
+ currentIndex++;
+ }
+ */
+ pdfSource.unread( ENDSTREAM );
+
+ }
+
+ /**
+ * This basically checks to see if the next compareTo.length bytes of the
+ * buffer match the compareTo byte array.
+ */
+ private boolean cmpCircularBuffer( byte[] buffer, int currentIndex, byte[] compareTo )
+ {
+ int cmpLen = compareTo.length;
+ int buflen = buffer.length;
+ boolean match = true;
+ int off = currentIndex-cmpLen;
+ if( off < 0 )
+ {
+ match = false;
+ }
+ for( int i=0; match && i<cmpLen; ++i )
+ {
+ match = buffer[(off+i)%buflen] == compareTo[i];
+ }
+ return match;
+ }
+
+ /**
+ * This will parse a PDF string.
+ *
+ * @return The parsed PDF string.
+ *
+ * @throws IOException If there is an error reading from the stream.
+ */
+ protected COSString parseCOSString() throws IOException
+ {
+ if( log.isDebugEnabled() )
+ {
+ log.debug("parseCOSString() " + pdfSource );
+ }
+ char nextChar = (char)pdfSource.read();
+ COSString retval = new COSString();
+ char openBrace;
+ char closeBrace;
+ if( nextChar == '(' )
+ {
+ openBrace = '(';
+ closeBrace = ')';
+ }
+ else if( nextChar == '<' )
+ {
+ openBrace = '<';
+ closeBrace = '>';
+ }
+ else
+ {
+ throw new IOException( "parseCOSString string should start with '(' or '<' and not '" +
+ nextChar + "' " + pdfSource );
+ }
+
+ //This is the number of braces read
+ //
+ int braces = 1;
+ int c = pdfSource.read();
+ while( braces > 0 && c != -1)
+ {
+ char ch = (char)c;
+ int nextc = -2; // not yet read
+ //if( log.isDebugEnabled() )
+ //{
+ // log.debug( "Parsing COSString character '" + c + "' code=" + (int)c );
+ //}
+
+ if(ch == closeBrace)
+ {
+ braces--;
+ byte[] nextThreeBytes = new byte[3];
+ int amountRead = pdfSource.read(nextThreeBytes);
+
+ //lets handle the special case seen in Bull River Rules and Regulations.pdf
+ //The dictionary looks like this
+ // 2 0 obj
+ // <<
+ // /Type /Info
+ // /Creator (PaperPort http://www.scansoft.com)
+ // /Producer (sspdflib 1.0 http://www.scansoft.com)
+ // /Title ( (5)
+ // /Author ()
+ // /Subject ()
+ //
+ // Notice the /Title, the braces are not even but they should
+ // be. So lets assume that if we encounter an this scenario
+ // <end_brace><new_line><opening_slash> then that
+ // means that there is an error in the pdf and assume that
+ // was the end of the document.
+ if( amountRead == 3 )
+ {
+ if( nextThreeBytes[0] == 0x0d &&
+ nextThreeBytes[1] == 0x0a &&
+ nextThreeBytes[2] == 0x2f )
+ {
+ braces = 0;
+ }
+ }
+ pdfSource.unread( nextThreeBytes, 0, amountRead );
+ if( braces != 0 )
+ {
+ retval.append( ch );
+ }
+ }
+ else if( ch == openBrace )
+ {
+ braces++;
+ retval.append( ch );
+ }
+ else if( ch == '\\' )
+ {
+ //patched by ram
+ char next = (char)pdfSource.read();
+ switch(next)
+ {
+ case 'n':
+ retval.append( '\n' );
+ break;
+ case 'r':
+ retval.append( '\r' );
+ break;
+ case 't':
+ retval.append( '\t' );
+ break;
+ case 'b':
+ retval.append( '\b' );
+ break;
+ case 'f':
+ retval.append( '\f' );
+ break;
+ case '(':
+ case ')':
+ case '\\':
+ retval.append( next );
+ break;
+ case 10:
+ case 13:
+ //this is a break in the line so ignore it and the newline and continue
+ c = pdfSource.read();
+ while( isEOL(c) && c != -1)
+ {
+ c = pdfSource.read();
+ }
+ nextc = c;
+ break;
+ case '0':
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ case '6':
+ case '7':
+ {
+ StringBuffer octal = new StringBuffer();
+ octal.append( next );
+ c = pdfSource.read();
+ char digit = (char)c;
+ if( digit >= '0' && digit <= '7' )
+ {
+ octal.append( digit );
+ c = pdfSource.read();
+ digit = (char)c;
+ if( digit >= '0' && digit <= '7' )
+ {
+ octal.append( digit );
+ }
+ else
+ {
+ nextc = c;
+ }
+ }
+ else
+ {
+ nextc = c;
+ }
+
+ int character = 0;
+ try
+ {
+ character = Integer.parseInt( octal.toString(), 8 );
+ }
+ catch( NumberFormatException e )
+ {
+ throw new IOException( "Error: Expected octal character, actual='" + octal + "'" );
+ }
+ retval.append( character );
+ break;
+ }
+ default:
+ {
+ retval.append( '\\' );
+ retval.append( next );
+ //another ficken problem with PDF's, sometimes the \ doesn't really
+ //mean escape like the PDF spec says it does, sometimes is should be literal
+ //which is what we will assume here.
+ //throw new IOException( "Unexpected break sequence '" + next + "' " + pdfSource );
+ }
+ }
+ }
+ else
+ {
+ if( openBrace == '<' )
+ {
+ if( isHexDigit(ch) )
+ {
+ retval.append( ch );
+ }
+ }
+ else
+ {
+ retval.append( ch );
+ }
+ }
+ if (nextc != -2)
+ {
+ c = nextc;
+ }
+ else
+ {
+ c = pdfSource.read();
+ }
+ }
+ if (c != -1)
+ {
+ pdfSource.unread(c);
+ }
+ if( openBrace == '<' )
+ {
+ retval = COSString.createFromHexString( retval.getString() );
+ }
+ if( log.isDebugEnabled() )
+ {
+ log.debug("parseCOSString() done parsed=" + retval );
+ }
+ return retval;
+ }
+
+ /**
+ * This will parse a PDF array object.
+ *
+ * @return The parsed PDF array.
+ *
+ * @throws IOException If there is an error parsing the stream.
+ */
+ protected COSArray parseCOSArray() throws IOException
+ {
+ if( log.isDebugEnabled() )
+ {
+ log.debug("parseCOSArray() " + pdfSource );
+ }
+ char ch = (char)pdfSource.read();
+ if( ch != '[')
+ {
+ throw new IOException( "expected='[' actual='" + ch + "'" );
+ }
+ COSArray po = new COSArray();
+ COSBase pbo = null;
+ skipSpaces();
+ int i = 0;
+ while( ((i = pdfSource.peek()) > 0) && ((char)i != ']') )
+ {
+ pbo = parseDirObject();
+ if( pbo instanceof COSObject )
+ {
+ COSInteger genNumber = (COSInteger)po.remove( po.size() -1 );
+ COSInteger number = (COSInteger)po.remove( po.size() -1 );
+ COSObjectKey key = new COSObjectKey(number.intValue(), genNumber.intValue());
+ pbo = document.getObjectFromPool(key);
+ }
+ if( pbo != null )
+ {
+ po.add( pbo );
+ }
+ else
+ {
+ //it could be a bad object in the array which is just skipped
+ }
+ skipSpaces();
+ }
+ pdfSource.read(); //read ']'
+ skipSpaces();
+ if( log.isDebugEnabled() )
+ {
+ log.debug("parseCOSArray() done peek='" + (char)pdfSource.peek() + "'" );
+ }
+ return po;
+ }
+
+ /**
+ * Determine if a character terminates a PDF name.
+ *
+ * @param ch The character
+ * @return <code>true</code> if the character terminates a PDF name, otherwise <code>false</code>.
+ */
+ protected boolean isEndOfName(char ch)
+ {
+ return (ch == ' ' || ch == 13 || ch == 10 || ch == 9 || ch == '>' || ch == '<'
+ || ch == '[' || ch =='/' || ch ==']' || ch ==')' || ch =='(' ||
+ ch == -1 //EOF
+ );
+ }
+
+ /**
+ * This will parse a PDF name from the stream.
+ *
+ * @return The parsed PDF name.
+ *
+ * @throws IOException If there is an error reading from the stream.
+ */
+ protected COSName parseCOSName() throws IOException
+ {
+ if( log.isDebugEnabled() )
+ {
+ log.debug("parseCOSName() " + pdfSource );
+ }
+ COSName retval = null;
+ int c = pdfSource.read();
+ if( (char)c != '/')
+ {
+ throw new IOException("expected='/' actual='" + (char)c + "'-" + c + " " + pdfSource );
+ }
+ // costruisce il nome
+ StringBuffer buffer = new StringBuffer();
+ c = pdfSource.read();
+ while( c != -1 )
+ {
+ char ch = (char)c;
+ if(ch == '#')
+ {
+ char ch1 = (char)pdfSource.read();
+ char ch2 = (char)pdfSource.read();
+
+ // Prior to PDF v1.2, the # was not a special character. Also,
+ // it has been observed that various PDF tools do not follow the
+ // spec with respect to the # escape, even though they report
+ // PDF versions of 1.2 or later. The solution here is that we
+ // interpret the # as an escape only when it is followed by two
+ // valid hex digits.
+ //
+ if (isHexDigit(ch1) && isHexDigit(ch2))
+ {
+ String hex = "" + ch1 + ch2;
+ try
+ {
+ buffer.append( (char) Integer.parseInt(hex, 16));
+ }
+ catch (NumberFormatException e)
+ {
+ if( log.isDebugEnabled() )
+ {
+ log.debug("isHexDigit(ch1)=" + isHexDigit(ch1) + ", isHexDigit(ch2)=" + isHexDigit(ch2));
+ }
+ throw new IOException("Error: expected hex number, actual='" + hex + "'");
+ }
+ c = pdfSource.read();
+ }
+ else
+ {
+ pdfSource.unread(ch2);
+ c = ch1;
+ buffer.append( ch );
+ }
+ }
+ else if (isEndOfName(ch))
+ {
+ break;
+ }
+ else
+ {
+ buffer.append( ch );
+ c = pdfSource.read();
+ }
+ }
+ if (c != -1)
+ {
+ pdfSource.unread(c);
+ }
+ retval = COSName.getPDFName( buffer.toString() );
+ return retval;
+ }
+
+ /**
+ * This will parse a boolean object from the stream.
+ *
+ * @return The parsed boolean object.
+ *
+ * @throws IOException If an IO error occurs during parsing.
+ */
+ protected COSBoolean parseBoolean() throws IOException
+ {
+ COSBoolean retval = null;
+ char c = (char)pdfSource.peek();
+ if( c == 't' )
+ {
+ byte[] trueArray = new byte[ 4 ];
+ int amountRead = pdfSource.read( trueArray, 0, 4 );
+ String trueString = new String( trueArray, 0, amountRead );
+ if( !trueString.equals( "true" ) )
+ {
+ throw new IOException( "Error parsing boolean: expected='true' actual='" + trueString + "'" );
+ }
+ else
+ {
+ retval = COSBoolean.TRUE;
+ }
+ }
+ else if( c == 'f' )
+ {
+ byte[] falseArray = new byte[ 5 ];
+ int amountRead = pdfSource.read( falseArray, 0, 5 );
+ String falseString = new String( falseArray, 0, amountRead );
+ if( !falseString.equals( "false" ) )
+ {
+ throw new IOException( "Error parsing boolean: expected='true' actual='" + falseString + "'" );
+ }
+ else
+ {
+ retval = COSBoolean.FALSE;
+ }
+ }
+ else
+ {
+ throw new IOException( "Error parsing boolean expected='t or f' actual='" + c + "'" );
+ }
+ return retval;
+ }
+
+ /**
+ * This will parse a directory object from the stream.
+ *
+ * @return The parsed object.
+ *
+ * @throws IOException If there is an error during parsing.
+ */
+ protected COSBase parseDirObject() throws IOException
+ {
+ if( log.isDebugEnabled() )
+ {
+ log.debug("parseDirObject() " + pdfSource );
+ }
+ COSBase retval = null;
+
+ skipSpaces();
+ int nextByte = pdfSource.peek();
+ char c = (char)nextByte;
+ switch(c)
+ {
+ case '<':
+ {
+ int leftBracket = pdfSource.read();//pull off first left bracket
+ c = (char)pdfSource.peek(); //check for second left bracket
+ pdfSource.unread( leftBracket );
+ if(c == '<')
+ {
+
+ retval = parseCOSDictionary();
+ skipSpaces();
+ }
+ else
+ {
+ retval = parseCOSString();
+ }
+ break;
+ }
+ case '[': // array
+ {
+ retval = parseCOSArray();
+ break;
+ }
+ case '(':
+ retval = parseCOSString();
+ break;
+ case '/': // name
+ retval = parseCOSName();
+ break;
+ case 'n': // null
+ {
+ String nullString = readString();
+ if( !nullString.equals( "null") )
+ {
+ throw new IOException("Expected='null' actual='" + nullString + "'");
+ }
+ retval = COSNull.NULL;
+ break;
+ }
+ case 't':
+ {
+ byte[] trueBytes = new byte[4];
+ int amountRead = pdfSource.read( trueBytes, 0, 4 );
+ String trueString = new String( trueBytes, 0, amountRead );
+ if( trueString.equals( "true" ) )
+ {
+ retval = COSBoolean.TRUE;
+ }
+ else
+ {
+ throw new IOException( "expected true actual='" + trueString + "' " + pdfSource );
+ }
+ break;
+ }
+ case 'f':
+ {
+ byte[] falseBytes = new byte[5];
+ int amountRead = pdfSource.read( falseBytes, 0, 5 );
+ String falseString = new String( falseBytes, 0, amountRead );
+ if( falseString.equals( "false" ) )
+ {
+ retval = COSBoolean.FALSE;
+ }
+ else
+ {
+ throw new IOException( "expected false actual='" + falseString + "' " + pdfSource );
+ }
+ break;
+ }
+ case 'R':
+ pdfSource.read();
+ retval = new COSObject(null);
+ break;
+ case (char)-1:
+ return null;
+ default:
+ {
+ if( Character.isDigit(c) || c == '-' || c == '+' || c == '.')
+ {
+ StringBuffer buf = new StringBuffer();
+ int ic = pdfSource.read();
+ c = (char)ic;
+ while( Character.isDigit( c )||
+ c == '-' ||
+ c == '+' ||
+ c == '.' ||
+ c == 'E' ||
+ c == 'e' )
+ {
+ buf.append( c );
+ ic = pdfSource.read();
+ c = (char)ic;
+ }
+ if( ic != -1 )
+ {
+ pdfSource.unread( ic );
+ }
+ retval = COSNumber.get( buf.toString() );
+ }
+ else
+ {
+ //This is not suppose to happen, but we will allow for it
+ //so we are more compatible with POS writers that don't
+ //follow the spec
+ String badString = readString();
+ //throw new IOException( "Unknown dir object c='" + c +
+ //"' peek='" + (char)pdfSource.peek() + "' " + pdfSource );
+ if( log.isDebugEnabled() )
+ {
+ log.debug("parseDirObject() bad DIR object found. ignoring: '" + badString + "'");
+ }
+ if( badString == null || badString.length() == 0 )
+ {
+ int peek = pdfSource.peek();
+ // we can end up in an infinite loop otherwise
+ throw new IOException( "Unknown dir object c='" + c +
+ "' cInt=" + (int)c + " peek='" + (char)peek + "' peekInt=" + peek + " " + pdfSource );
+ }
+
+ }
+ }
+ }
+ if( log.isDebugEnabled() )
+ {
+ log.debug("parseDirObject() done retval=" +retval );
+ }
+ return retval;
+ }
+
+ /**
+ * This will read the next string from the stream.
+ *
+ * @return The string that was read from the stream.
+ *
+ * @throws IOException If there is an error reading from the stream.
+ */
+ protected String readString() throws IOException
+ {
+ skipSpaces();
+ StringBuffer buffer = new StringBuffer();
+ int c = pdfSource.read();
+ while( !isEndOfName((char)c) && !isClosing(c) && c != -1 )
+ {
+ buffer.append( (char)c );
+ c = pdfSource.read();
+ }
+ if (c != -1)
+ {
+ pdfSource.unread(c);
+ }
+ return buffer.toString();
+ }
+
+ /**
+ * This will read bytes until the end of line marker occurs.
+ *
+ * @param theString The next expected string in the stream.
+ *
+ * @return The characters between the current position and the end of the line.
+ *
+ * @throws IOException If there is an error reading from the stream or theString does not match what was read.
+ */
+ protected String readExpectedString( String theString ) throws IOException
+ {
+ int c = pdfSource.read();
+ while( isWhitespace(c) && c != -1)
+ {
+ c = pdfSource.read();
+ }
+ StringBuffer buffer = new StringBuffer( theString.length() );
+ int charsRead = 0;
+ while( !isEOL(c) && c != -1 && charsRead < theString.length() )
+ {
+ char next = (char)c;
+ buffer.append( next );
+ if( theString.charAt( charsRead ) == next )
+ {
+ charsRead++;
+ }
+ else
+ {
+ throw new IOException( "Error: Expected to read '" + theString +
+ "' instead started reading '" +buffer.toString() + "'" );
+ }
+ c = pdfSource.read();
+ }
+ while( isEOL(c) && c != -1 )
+ {
+ c = pdfSource.read();
+ }
+ if (c != -1)
+ {
+ pdfSource.unread(c);
+ }
+ return buffer.toString();
+ }
+
+ /**
+ * This will read the next string from the stream up to a certain length.
+ *
+ * @param length The length to stop reading at.
+ *
+ * @return The string that was read from the stream of length 0 to length.
+ *
+ * @throws IOException If there is an error reading from the stream.
+ */
+ protected String readString( int length ) throws IOException
+ {
+ skipSpaces();
+
+ int c = pdfSource.read();
+
+ //average string size is around 2 and the normal string buffer size is
+ //about 16 so lets save some space.
+ StringBuffer buffer = new StringBuffer(length);
+ while( !isWhitespace(c) && !isClosing(c) && c != -1 && buffer.length() < length &&
+ c != '[' &&
+ c != '<' &&
+ c != '(' &&
+ c != '/' )
+ {
+ buffer.append( (char)c );
+ c = pdfSource.read();
+ }
+ if (c != -1)
+ {
+ pdfSource.unread(c);
+ }
+ return buffer.toString();
+ }
+
+ /**
+ * This will tell if the next character is a closing brace( close of PDF array ).
+ *
+ * @return true if the next byte is ']', false otherwise.
+ *
+ * @throws IOException If an IO error occurs.
+ */
+ protected boolean isClosing() throws IOException
+ {
+ return isClosing(pdfSource.peek());
+ }
+
+ /**
+ * This will tell if the next character is a closing brace( close of PDF array ).
+ *
+ * @param c The character to check against end of line
+ * @return true if the next byte is ']', false otherwise.
+ */
+ protected boolean isClosing(int c)
+ {
+ return c == ']';
+ }
+
+ /**
+ * This will read bytes until the end of line marker occurs.
+ *
+ * @return The characters between the current position and the end of the line.
+ *
+ * @throws IOException If there is an error reading from the stream.
+ */
+ protected String readLine() throws IOException
+ {
+ int c = pdfSource.read();
+ while(isWhitespace(c) && c != -1)
+ {
+ c = pdfSource.read();
+ }
+ StringBuffer buffer = new StringBuffer( 11 );
+
+ while( !isEOL(c) && c != -1 )
+ {
+ buffer.append( (char)c );
+ c = pdfSource.read();
+ }
+ while( isEOL(c) && c != -1 )
+ {
+ c = pdfSource.read();
+ }
+ if (c != -1)
+ {
+ pdfSource.unread(c);
+ }
+ return buffer.toString();
+ }
+
+ /**
+ * This will tell if the next byte to be read is an end of line byte.
+ *
+ * @return true if the next byte is 0x0A or 0x0D.
+ *
+ * @throws IOException If there is an error reading from the stream.
+ */
+ protected boolean isEOL() throws IOException
+ {
+ return isEOL(pdfSource.peek());
+ }
+
+ /**
+ * This will tell if the next byte to be read is an end of line byte.
+ *
+ * @param c The character to check against end of line
+ * @return true if the next byte is 0x0A or 0x0D.
+ */
+ protected boolean isEOL(int c)
+ {
+ return c == 10 || c == 13;
+ }
+
+ /**
+ * This will tell if the next byte is whitespace or not.
+ *
+ * @return true if the next byte in the stream is a whitespace character.
+ *
+ * @throws IOException If there is an error reading from the stream.
+ */
+ protected boolean isWhitespace() throws IOException
+ {
+ return isWhitespace( pdfSource.peek() );
+ }
+
+ /**
+ * This will tell if the next byte is whitespace or not.
+ *
+ * @param c The character to check against whitespace
+ *
+ * @return true if the next byte in the stream is a whitespace character.
+ */
+ protected boolean isWhitespace( int c )
+ {
+ return c == 0 || c == 9 || c == 12 || c == 10
+ || c == 13 || c == 32;
+ }
+
+ /**
+ * This will skip all spaces and comments that are present.
+ *
+ * @throws IOException If there is an error reading from the stream.
+ */
+ protected void skipSpaces() throws IOException
+ {
+ //log( "skipSpaces() " + pdfSource );
+ int c = pdfSource.read();
+ // identical to, but faster as: isWhiteSpace(c) || c == 37
+ while(c == 0 || c == 9 || c == 12 || c == 10
+ || c == 13 || c == 32 || c == 37)//37 is the % character, a comment
+ {
+ if ( c == 37 )
+ {
+ // skip past the comment section
+ c = pdfSource.read();
+ while(!isEOL(c) && c != -1)
+ {
+ c = pdfSource.read();
+ }
+ }
+ else
+ {
+ c = pdfSource.read();
+ }
+ }
+ if (c != -1)
+ {
+ pdfSource.unread(c);
+ }
+ //log( "skipSpaces() done peek='" + (char)pdfSource.peek() + "'" );
+ }
+
+ /**
+ * this will compare two byte arrays.
+ *
+ * @param first The first byte array to compare.
+ * @param second The second byte array to compare.
+ *
+ * @return true if both arrays are the same AND forall i : first[i] = second[i]
+ */
+ private boolean cmpArray( byte[] first, byte[] second )
+ {
+ return cmpArray( first, 0, second );
+ }
+
+ /**
+ * This will compare two arrays for equality.
+ *
+ * @param first The first array to compare.
+ * @param firstOffset The first byte to start comparing.
+ * @param second The second array to compare.
+ */
+ private boolean cmpArray( byte[] first, int firstOffset, byte[] second )
+ {
+ boolean retval = true;
+ if( first.length-firstOffset >= second.length )
+ {
+ int arrayLength = second.length;
+ for( int i =0; i<arrayLength && retval; i++ )
+ {
+ retval = retval && first[ firstOffset + i ] == second[ i ];
+ }
+ }
+ else
+ {
+ retval = false;
+ }
+ return retval;
+ }
+
+ /**
+ * This will read an integer from the stream.
+ *
+ * @return The integer that was read from the stream.
+ *
+ * @throws IOException If there is an error reading from the stream.
+ */
+ protected int readInt() throws IOException
+ {
+ skipSpaces();
+ int retval = 0;
+
+ int lastByte = 0;
+ StringBuffer intBuffer = new StringBuffer();
+ while( (lastByte = pdfSource.read() ) != 32 &&
+ lastByte != 10 &&
+ lastByte != 13 &&
+ lastByte != 0 && //See sourceforge bug 853328
+ lastByte != -1 )
+ {
+ intBuffer.append( (char)lastByte );
+ }
+ try
+ {
+ retval = Integer.parseInt( intBuffer.toString() );
+ }
+ catch( NumberFormatException e )
+ {
+ throw new IOException( "Error: Expected an integer type, actual='" + intBuffer + "'" );
+ }
+ return retval;
+ }
+
+ /**
+ * This will add an xref.
+ *
+ * @param xref The xref to add.
+ */
+ public void addXref( PDFXref xref )
+ {
+ xrefs.add(xref);
+ }
+
+ /**
+ * This will get all of the xrefs.
+ *
+ * @return A list of all xrefs.
+ */
+ public List getXrefs()
+ {
+ return xrefs;
+ }
+
+ /**
+ * This will set the xrefs for this parser.
+ *
+ * @param newXrefs The xrefs for this parser.
+ */
+ private void setXrefs( List newXrefs )
+ {
+ xrefs = newXrefs;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdfparser/PDFObjectStreamParser.java b/src/main/java/org/pdfbox/pdfparser/PDFObjectStreamParser.java
new file mode 100644
index 0000000..6fb7563
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdfparser/PDFObjectStreamParser.java
@@ -0,0 +1,137 @@
+/**
+ * Copyright (c) 2003-2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdfparser;
+
+import java.io.IOException;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.pdfbox.cos.COSBase;
+import org.pdfbox.cos.COSDocument;
+import org.pdfbox.cos.COSInteger;
+import org.pdfbox.cos.COSObject;
+import org.pdfbox.cos.COSStream;
+
+
+import org.apache.log4j.Logger;
+
+/**
+ * This will parse a PDF 1.5 object stream and extract all of the objects from the stream.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.4 $
+ */
+public class PDFObjectStreamParser extends BaseParser
+{
+ private static Logger log = Logger.getLogger(PDFObjectStreamParser.class);
+ private List streamObjects = null;
+ private List objectNumbers = null;
+ private COSStream stream;
+
+ /**
+ * Constructor.
+ *
+ * @param strm The stream to parse.
+ * @param doc The document for the current parsing.
+ *
+ * @throws IOException If there is an error initializing the stream.
+ */
+ public PDFObjectStreamParser( COSStream strm, COSDocument doc ) throws IOException
+ {
+ super( strm.getUnfilteredStream() );
+ setDocument( doc );
+ stream = strm;
+ }
+
+ /**
+ * This will parse the tokens in the stream. This will close the
+ * stream when it is finished parsing.
+ *
+ * @throws IOException If there is an error while parsing the stream.
+ */
+ public void parse() throws IOException
+ {
+ if( log.isDebugEnabled() )
+ {
+ log.debug( "parse() start" );
+ }
+
+ try
+ {
+ //need to first parse the header.
+ int numberOfObjects = stream.getInt( "N" );
+ objectNumbers = new ArrayList( numberOfObjects );
+ streamObjects = new ArrayList( numberOfObjects );
+ for( int i=0; i<numberOfObjects; i++ )
+ {
+ int objectNumber = readInt();
+ int offset = readInt();
+ if( log.isDebugEnabled() )
+ {
+ log.debug( "objNum:" + objectNumber + " offset:" + offset );
+ }
+ objectNumbers.add( new Integer( objectNumber ) );
+ }
+ COSObject object = null;
+ COSBase cosObject = null;
+ int objectCounter = 0;
+ while( (cosObject = parseDirObject()) != null )
+ {
+ object = new COSObject(cosObject);
+ object.setGenerationNumber( COSInteger.ZERO );
+ COSInteger objNum =
+ new COSInteger( ((Integer)objectNumbers.get( objectCounter)).intValue() );
+ object.setObjectNumber( objNum );
+ streamObjects.add( object );
+ objectCounter++;
+ }
+ }
+ finally
+ {
+ pdfSource.close();
+ }
+ if( log.isDebugEnabled() )
+ {
+ log.debug( "parse() end" );
+ }
+ }
+
+ /**
+ * This will get the objects that were parsed from the stream.
+ *
+ * @return All of the objects in the stream.
+ */
+ public List getObjects()
+ {
+ return streamObjects;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdfparser/PDFParser.java b/src/main/java/org/pdfbox/pdfparser/PDFParser.java
new file mode 100644
index 0000000..d655ef1
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdfparser/PDFParser.java
@@ -0,0 +1,557 @@
+/**
+ * Copyright (c) 2003-2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdfparser;
+
+import java.io.File;
+import java.io.RandomAccessFile;
+import java.io.InputStream;
+import java.io.IOException;
+
+import java.util.Iterator;
+
+import org.pdfbox.cos.COSBase;
+import org.pdfbox.cos.COSDictionary;
+import org.pdfbox.cos.COSDocument;
+import org.pdfbox.cos.COSObject;
+import org.pdfbox.cos.COSStream;
+import org.pdfbox.exceptions.WrappedIOException;
+
+import org.pdfbox.pdmodel.PDDocument;
+
+import org.pdfbox.pdmodel.fdf.FDFDocument;
+
+import org.pdfbox.persistence.util.COSObjectKey;
+
+import org.apache.log4j.Logger;
+
+/**
+ * This class will handle the parsing of the PDF document.
+ *
+ * @author Ben Litchfield (ben@benlitchfield.com)
+ * @version $Revision: 1.47 $
+ */
+public class PDFParser extends BaseParser
+{
+ private static Logger log = Logger.getLogger( PDFParser.class );
+ private static final int SPACE_BYTE = 32;
+
+ private static final String PDF_HEADER = "%PDF-";
+ private COSDocument document;
+
+ /**
+ * Temp file directory.
+ */
+ private File tempDirectory = new File( System.getProperty( "java.io.tmpdir" ) );
+
+ private RandomAccessFile raf = null;
+
+ /**
+ * Constructor.
+ *
+ * @param input The input stream that contains the PDF document.
+ *
+ * @throws IOException If there is an error initializing the stream.
+ */
+ public PDFParser( InputStream input ) throws IOException
+ {
+ this(input, null);
+ }
+
+ /**
+ * Constructor to allow control over RandomAccessFile.
+ * @param input The input stream that contains the PDF document.
+ * @param rafi The RandomAccessFile to be used in internal COSDocument
+ *
+ * @throws IOException If there is an error initializing the stream.
+ */
+ public PDFParser(InputStream input, RandomAccessFile rafi)
+ throws IOException
+ {
+ super(input);
+ this.raf = rafi;
+ }
+
+ /**
+ * This is the directory where pdfbox will create a temporary file
+ * for storing pdf document stream in. By default this directory will
+ * be the value of the system property java.io.tmpdir.
+ *
+ * @param tmpDir The directory to create scratch files needed to store
+ * pdf document streams.
+ */
+ public void setTempDirectory( File tmpDir )
+ {
+ tempDirectory = tmpDir;
+ }
+
+ /**
+ * This will prase the stream and create the PDF document. This will close
+ * the stream when it is done parsing.
+ *
+ * @throws IOException If there is an error reading from the stream.
+ */
+ public void parse() throws IOException
+ {
+ try
+ {
+ if ( raf == null )
+ {
+ document = new COSDocument( tempDirectory );
+ }
+ else
+ {
+ document = new COSDocument( raf );
+ }
+ setDocument( document );
+ String header = readLine();
+ if( log.isDebugEnabled() )
+ {
+ log.debug( "Header=" + header );
+ }
+ document.setHeaderString( header );
+
+ if( header.length() < PDF_HEADER.length()+1 )
+ {
+ throw new IOException( "Error: Header is corrupt '" + header + "'" );
+ }
+
+ //sometimes there are some garbage bytes in the header before the header
+ //actually starts, so lets try to find the header first.
+ int headerStart = header.indexOf( PDF_HEADER );
+
+ //greater than zero because if it is zero then
+ //there is no point of trimming
+ if( headerStart > 0 )
+ {
+ //trim off any leading characters
+ header = header.substring( headerStart, header.length() );
+ }
+
+ try
+ {
+ float pdfVersion = Float.parseFloat(
+ header.substring( PDF_HEADER.length(), Math.min( header.length(), PDF_HEADER.length()+3) ) );
+ document.setVersion( pdfVersion );
+ }
+ catch( NumberFormatException e )
+ {
+ throw new IOException( "Error getting pdf version:" + e );
+ }
+
+ skipHeaderFillBytes();
+
+
+ Object nextObject;
+ boolean wasLastParsedObjectAnXref = false;
+ try
+ {
+ while( (nextObject = parseObject()) != null )
+ {
+ if( nextObject instanceof PDFXref )
+ {
+ PDFXref xref = (PDFXref)nextObject;
+ addXref(xref);
+ wasLastParsedObjectAnXref = true;
+ }
+ else
+ {
+ wasLastParsedObjectAnXref = false;
+ }
+ skipSpaces();
+ }
+ if( document.getTrailer() == null )
+ {
+ COSDictionary trailer = new COSDictionary();
+ Iterator xrefIter = document.getObjectsByType( "XRef" ).iterator();
+ while( xrefIter.hasNext() )
+ {
+ COSStream next = (COSStream)((COSObject)xrefIter.next()).getObject();
+ trailer.addAll( next );
+ }
+ document.setTrailer( trailer );
+ }
+ if( !document.isEncrypted() )
+ {
+ document.dereferenceObjectStreams();
+ }
+ }
+ catch( IOException e )
+ {
+ if( wasLastParsedObjectAnXref )
+ {
+ log.debug( "Skipping some garbage", e );
+ //Then we assume that there is just random garbage after
+ //the xref, not sure why the PDF spec allows this but it does.
+ }
+ else
+ {
+ //some other error so just pass it along
+ throw e;
+ }
+ }
+ }
+ catch( Throwable t )
+ {
+ //so if the PDF is corrupt then close the document and clear
+ //all resources to it
+ if( document != null )
+ {
+ document.close();
+ }
+ if( t instanceof IOException )
+ {
+ throw (IOException)t;
+ }
+ else
+ {
+ throw new WrappedIOException( t );
+ }
+ }
+ finally
+ {
+ pdfSource.close();
+ }
+ }
+
+ /**
+ * This will skip a header's binary fill bytes. This is in accordance to
+ * PDF Specification 1.5 pg 68 section 3.4.1 "Syntax.File Structure.File Header"
+ *
+ * @throws IOException If there is an error reading from the stream.
+ */
+ protected void skipHeaderFillBytes() throws IOException
+ {
+ skipSpaces();
+ int c = pdfSource.peek();
+
+ if( !Character.isDigit( (char)c ) )
+ {
+ // Fill bytes conform with PDF reference (but without comment sign)
+ // => skip until EOL
+ readLine();
+ }
+ // else: no fill bytes
+ }
+
+ /**
+ * This will get the document that was parsed. parse() must be called before this is called.
+ * When you are done with this document you must call close() on it to release
+ * resources.
+ *
+ * @return The document that was parsed.
+ *
+ * @throws IOException If there is an error getting the document.
+ */
+ public COSDocument getDocument() throws IOException
+ {
+ if( document == null )
+ {
+ throw new IOException( "You must call parse() before calling getDocument()" );
+ }
+ return document;
+ }
+
+ /**
+ * This will get the PD document that was parsed. When you are done with
+ * this document you must call close() on it to release resources.
+ *
+ * @return The document at the PD layer.
+ *
+ * @throws IOException If there is an error getting the document.
+ */
+ public PDDocument getPDDocument() throws IOException
+ {
+ return new PDDocument( getDocument() );
+ }
+
+ /**
+ * This will get the FDF document that was parsed. When you are done with
+ * this document you must call close() on it to release resources.
+ *
+ * @return The document at the PD layer.
+ *
+ * @throws IOException If there is an error getting the document.
+ */
+ public FDFDocument getFDFDocument() throws IOException
+ {
+ return new FDFDocument( getDocument() );
+ }
+
+ /**
+ * This will parse a document object from the stream.
+ *
+ * @return The parsed object.
+ *
+ * @throws IOException If an IO error occurs.
+ */
+ private Object parseObject() throws IOException
+ {
+ Object object = null;
+ char peekedChar = (char)pdfSource.peek();
+ if( log.isDebugEnabled() )
+ {
+ log.debug( "PDFParser.parseObject() peek='" + peekedChar + "'" );
+ }
+ if( pdfSource.isEOF() )
+ {
+ if( log.isDebugEnabled() )
+ {
+ log.debug( "Skipping because of EOF" );
+ //end of file we will return a null object and call it a day.
+ }
+ }
+ else if( peekedChar == 'x' ||
+ peekedChar == 't' ||
+ peekedChar == 's')
+ {
+ //System.out.println( "parseObject() parsing xref" );
+
+ //FDF documents do not always have the xref
+ if( peekedChar == 'x' || peekedChar == 't' )
+ {
+ object = parseXrefSection();
+ }
+
+ //if peeked char is xref or startxref
+ if( peekedChar == 'x' || peekedChar == 's')
+ {
+ skipSpaces();
+ while( pdfSource.peek() == 'x' )
+ {
+ parseXrefSection();
+ }
+ String startxref = readString();
+ if( !startxref.equals( "startxref" ) )
+ {
+ throw new IOException( "expected='startxref' actual='" + startxref + "' " + pdfSource );
+ }
+ skipSpaces();
+ //read some integer that is in the stream but PDFBox doesn't use
+ readInt();
+ }
+
+ //This MUST be readLine because readString strips out comments
+ //and it will think that %% is a comment in from of the EOF
+ String eof = readExpectedString( "%%EOF" );
+ if( eof.indexOf( "%%EOF" )== -1 && !pdfSource.isEOF() )
+ {
+ throw new IOException( "expected='%%EOF' actual='" + eof + "' next=" + readString() +
+ " next=" +readString() );
+ }
+ else if( !pdfSource.isEOF() )
+ {
+ //we might really be at the end of the file, there might just be some crap at the
+ //end of the file.
+ if( pdfSource.available() < 1000 )
+ {
+ //We need to determine if we are at the end of the file.
+ byte[] data = new byte[ 1000 ];
+
+ int amountRead = pdfSource.read( data );
+ if( amountRead != -1 )
+ {
+ pdfSource.unread( data, 0, amountRead );
+ }
+ boolean atEndOfFile = true;//we assume yes unless we find another.
+ for( int i=0; i<amountRead-3 && atEndOfFile; i++ )
+ {
+ atEndOfFile = !(data[i] == 'E' &&
+ data[i+1] == 'O' &&
+ data[i+2] == 'F' );
+ }
+ if( atEndOfFile )
+ {
+ while( pdfSource.read( data, 0, data.length ) != -1 )
+ {
+ //read until done.
+ }
+ }
+ }
+ }
+ }
+ else
+ {
+ int number;
+ int genNum;
+ String objectKey = null;
+ try
+ {
+ number = readInt();
+ }
+ catch( IOException e )
+ {
+ //ok for some reason "GNU Ghostscript 5.10" puts two endobj
+ //statements after an object, of course this is nonsense
+ //but because we want to support as many PDFs as possible
+ //we will simply try again
+ number = readInt();
+ }
+ skipSpaces();
+ genNum = readInt();
+ if( log.isDebugEnabled() )
+ {
+ log.debug( "Parsing object (" + number + "," + genNum + ")" );
+ }
+
+ objectKey = readString( 3 );
+ //System.out.println( "parseObject() num=" + number + " genNumber=" + genNum + " key='" + objectKey + "'" );
+ if( !objectKey.equals( "obj" ) )
+ {
+ throw new IOException("expected='obj' actual='" + objectKey + "' " + pdfSource );
+ }
+
+ skipSpaces();
+ COSBase pb = parseDirObject();
+ String endObjectKey = readString();
+ if( endObjectKey.equals( "stream" ) )
+ {
+ pdfSource.unread( endObjectKey.getBytes() );
+ pdfSource.unread( ' ' );
+ if( pb instanceof COSDictionary )
+ {
+ pb = parseCOSStream( (COSDictionary)pb, getDocument().getScratchFile() );
+ }
+ else
+ {
+ // this is not legal
+ // the combination of a dict and the stream/endstream forms a complete stream object
+ throw new IOException("stream not preceded by dictionary");
+ }
+ endObjectKey = readString();
+ }
+ COSObjectKey key = new COSObjectKey( number, genNum );
+ COSObject pdfObject = document.getObjectFromPool( key );
+ object = pdfObject;
+ pdfObject.setObject(pb);
+
+ if( !endObjectKey.equals( "endobj" ) )
+ {
+ if( !pdfSource.isEOF() )
+ {
+ try
+ {
+ //It is possible that the endobj is missing, there
+ //are several PDFs out there that do that so skip it and move on.
+ Float.parseFloat( endObjectKey );
+ pdfSource.unread( SPACE_BYTE );
+ pdfSource.unread( endObjectKey.getBytes() );
+ if( log.isDebugEnabled() )
+ {
+ log.debug( "Missing endobj, found '" + endObjectKey +
+ "' instead, assuming that endobj is not present and will continue parsing." );
+ }
+ }
+ catch( NumberFormatException e )
+ {
+ //we will try again incase there was some garbage which
+ //some writers will leave behind.
+ String secondEndObjectKey = readString();
+ if( !secondEndObjectKey.equals( "endobj" ) )
+ {
+ throw new IOException("expected='endobj' firstReadAttempt='" + endObjectKey + "' " +
+ "secondReadAttempt='" + secondEndObjectKey + "' " + pdfSource);
+ }
+ }
+ }
+ }
+ skipSpaces();
+
+ }
+ //System.out.println( "parsed=" + object );
+ return object;
+ }
+
+
+ /**
+ * This will parse the xref table and trailers from the stream.
+ *
+ * @return a new PDFXref
+ *
+ * @throws IOException If an IO error occurs.
+ */
+ protected PDFXref parseXrefSection() throws IOException
+ {
+ int[] params = new int[2];
+ parseXrefTable(params);
+ parseTrailer();
+
+ return new PDFXref(params[0], params[1]);
+ }
+
+ /**
+ * This will parse the xref table from the stream.
+ *
+ * It stores the starting object number and the count
+ *
+ * @param params The start and count parameters
+ *
+ * @throws IOException If an IO error occurs.
+ */
+ protected void parseXrefTable(int[] params) throws IOException
+ {
+ String nextLine = null;
+
+ nextLine = readLine();
+ if( nextLine.equals( "xref" ) )
+ {
+ params[0] = readInt();
+ params[1] = readInt();
+ nextLine = readString();
+ }
+ skipSpaces();
+ while( !nextLine.equals( "trailer" ) && !pdfSource.isEOF() && !isEndOfName((char)pdfSource.peek()))
+ {
+ //skip past all the xref entries.
+ nextLine = readString();
+ skipSpaces();
+ }
+ skipSpaces();
+ }
+
+ private void parseTrailer() throws IOException
+ {
+ COSDictionary parsedTrailer = parseCOSDictionary();
+ COSDictionary docTrailer = document.getTrailer();
+ if( log.isDebugEnabled() )
+ {
+ log.debug( "parsedTrailer=" + parsedTrailer );
+ log.debug( "docTrailer=" + docTrailer );
+ }
+ if( docTrailer == null )
+ {
+ document.setTrailer( parsedTrailer );
+ }
+ else
+ {
+ docTrailer.addAll( parsedTrailer );
+ }
+ }
+}
diff --git a/src/main/java/org/pdfbox/pdfparser/PDFStreamParser.java b/src/main/java/org/pdfbox/pdfparser/PDFStreamParser.java
new file mode 100644
index 0000000..d59c5a4
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdfparser/PDFStreamParser.java
@@ -0,0 +1,403 @@
+/**
+ * Copyright (c) 2003-2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdfparser;
+
+import java.io.ByteArrayOutputStream;
+import java.io.InputStream;
+import java.io.IOException;
+import java.io.RandomAccessFile;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.pdfbox.cos.COSBase;
+import org.pdfbox.cos.COSBoolean;
+import org.pdfbox.cos.COSDictionary;
+import org.pdfbox.cos.COSName;
+import org.pdfbox.cos.COSNull;
+import org.pdfbox.cos.COSNumber;
+import org.pdfbox.cos.COSObject;
+import org.pdfbox.cos.COSStream;
+
+import org.pdfbox.util.PDFOperator;
+import org.pdfbox.util.ImageParameters;
+
+import org.apache.log4j.Logger;
+
+/**
+ * This will parse a PDF byte stream and extract operands and such.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.29 $
+ */
+public class PDFStreamParser extends BaseParser
+{
+ private static Logger log = Logger.getLogger(PDFStreamParser.class);
+ private List streamObjects = new ArrayList( 100 );
+ private RandomAccessFile file;
+ private PDFOperator lastBIToken = null;
+
+ /**
+ * Constructor that takes a stream to parse.
+ *
+ * @param stream The stream to read data from.
+ * @param raf The random access file.
+ *
+ * @throws IOException If there is an error reading from the stream.
+ */
+ public PDFStreamParser( InputStream stream, RandomAccessFile raf ) throws IOException
+ {
+ super( stream );
+ file = raf;
+ }
+
+ /**
+ * Constructor.
+ *
+ * @param stream The stream to parse.
+ *
+ * @throws IOException If there is an error initializing the stream.
+ */
+ public PDFStreamParser( COSStream stream ) throws IOException
+ {
+ this( stream.getUnfilteredStream(), stream.getScratchFile() );
+ }
+
+ /**
+ * This will parse the tokens in the stream. This will close the
+ * stream when it is finished parsing.
+ *
+ * @throws IOException If there is an error while parsing the stream.
+ */
+ public void parse() throws IOException
+ {
+ if( log.isDebugEnabled() )
+ {
+ log.debug( "parse() start" );
+ }
+
+ try
+ {
+ Object token = null;
+ while( (token = parseNextToken()) != null )
+ {
+ streamObjects.add( token );
+ }
+ }
+ finally
+ {
+ pdfSource.close();
+ }
+ if( log.isDebugEnabled() )
+ {
+ log.debug( "parse() end" );
+ }
+ }
+
+ /**
+ * This will get the tokens that were parsed from the stream.
+ *
+ * @return All of the tokens in the stream.
+ */
+ public List getTokens()
+ {
+ return streamObjects;
+ }
+
+ /**
+ * This will parse the next token in the stream.
+ *
+ * @return The next token in the stream or null if there are no more tokens in the stream.
+ *
+ * @throws IOException If an io error occurs while parsing the stream.
+ */
+ private Object parseNextToken() throws IOException
+ {
+ if( log.isDebugEnabled() )
+ {
+ log.debug( "parseNextToken() start" );
+ }
+ Object retval = null;
+
+ skipSpaces();
+ int nextByte = pdfSource.peek();
+ if( ((byte)nextByte) == -1 )
+ {
+ return null;
+ }
+ char c = (char)nextByte;
+ switch(c)
+ {
+ case '<':
+ {
+ int leftBracket = pdfSource.read();//pull off first left bracket
+ c = (char)pdfSource.peek(); //check for second left bracket
+ pdfSource.unread( leftBracket ); //put back first bracket
+ if(c == '<')
+ {
+
+ COSDictionary pod = parseCOSDictionary();
+ skipSpaces();
+ if((char)pdfSource.peek() == 's')
+ {
+ retval = parseCOSStream( pod, file );
+ }
+ else
+ {
+ retval = pod;
+ }
+ }
+ else
+ {
+ retval = parseCOSString();
+ }
+ break;
+ }
+ case '[': // array
+ {
+ retval = parseCOSArray();
+ break;
+ }
+ case '(': // string
+ retval = parseCOSString();
+ break;
+ case '/': // name
+ retval = parseCOSName();
+ break;
+ case 'n': // null
+ {
+ String nullString = readString();
+ if( nullString.equals( "null") )
+ {
+ retval = COSNull.NULL;
+ }
+ else
+ {
+ retval = PDFOperator.getOperator( nullString );
+ }
+ break;
+ }
+ case 't':
+ case 'f':
+ {
+ String next = readString();
+ if( next.equals( "true" ) )
+ {
+ retval = COSBoolean.TRUE;
+ break;
+ }
+ else if( next.equals( "false" ) )
+ {
+ retval = COSBoolean.FALSE;
+ }
+ else
+ {
+ retval = PDFOperator.getOperator( next );
+ }
+ break;
+ }
+ case 'R':
+ {
+ String line = readString();
+ if( line.equals( "R" ) )
+ {
+ retval = new COSObject( null );
+ }
+ else
+ {
+ retval = PDFOperator.getOperator( line );
+ }
+ break;
+ }
+ case '0':
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ case '6':
+ case '7':
+ case '8':
+ case '9':
+ case '-':
+ case '+':
+ case '.':
+ {
+ if( Character.isDigit(c) || c == '-' || c == '+' || c == '.')
+ {
+ StringBuffer buf = new StringBuffer();
+ while( Character.isDigit(( c = (char)pdfSource.peek()) )|| c== '-' || c== '+' || c =='.' )
+ {
+ buf.append( c );
+ pdfSource.read();
+ }
+ retval = COSNumber.get( buf.toString() );
+ }
+ else
+ {
+ throw new IOException( "Unknown dir object c='" + c +
+ "' peek='" + (char)pdfSource.peek() + "' " + pdfSource );
+ }
+ break;
+ }
+ case 'B':
+ {
+ String next = readString();
+ retval = PDFOperator.getOperator( next );
+
+ if( next.equals( "BI" ) )
+ {
+ lastBIToken = (PDFOperator)retval;
+ COSDictionary imageParams = new COSDictionary();
+ lastBIToken.setImageParameters( new ImageParameters( imageParams ) );
+ Object nextToken = null;
+ while( (nextToken = parseNextToken()) instanceof COSName )
+ {
+ Object value = parseNextToken();
+ imageParams.setItem( (COSName)nextToken, (COSBase)value );
+ }
+ //final token will be the image data, maybe??
+ PDFOperator imageData = (PDFOperator)nextToken;
+ lastBIToken.setImageData( imageData.getImageData() );
+ }
+ break;
+ }
+ case 'I':
+ {
+ ImageParameters imageParams = lastBIToken.getImageParameters();
+ int expectedBytes = (int)Math.ceil(imageParams.getHeight() * imageParams.getWidth() *
+ (imageParams.getBitsPerComponent()/8) );
+ //Special case for ID operator
+ String id = "" + (char)pdfSource.read() + (char)pdfSource.read();
+ if( !id.equals( "ID" ) )
+ {
+ throw new IOException( "Error: Expected operator 'ID' actual='" + id + "'" );
+ }
+ ByteArrayOutputStream imageData = new ByteArrayOutputStream();
+ boolean foundEnd = false;
+ if( this.isWhitespace() )
+ {
+ //pull off the whitespace character
+ pdfSource.read();
+ }
+ int twoBytesAgo = 0;
+ int lastByte = pdfSource.read();
+ int currentByte = pdfSource.read();
+ int count = 0;
+ //PDF spec is kinda unclear about this. Should a whitespace
+ //always appear before EI? Not sure, I found a PDF
+ //(UnderstandingWebSphereClassLoaders.pdf) which has EI as part
+ //of the image data and will stop parsing prematurely if there is
+ //not a check for <whitespace>EI<whitespace>.
+ while( !(isWhitespace( twoBytesAgo ) &&
+ lastByte == 'E' &&
+ currentByte == 'I' &&
+ isWhitespace() //&&
+ //amyuni2_05d__pdf1_3_acro4x.pdf has image data that
+ //is compressed, so expectedBytes is useless here.
+ //count >= expectedBytes
+ ) &&
+ !pdfSource.isEOF() )
+ {
+ imageData.write( lastByte );
+ twoBytesAgo = lastByte;
+ lastByte = currentByte;
+ currentByte = pdfSource.read();
+ count++;
+ }
+ pdfSource.unread( 'I' ); //unread the EI operator
+ pdfSource.unread( 'E' );
+ retval = PDFOperator.getOperator( "ID" );
+ ((PDFOperator)retval).setImageData( imageData.toByteArray() );
+ break;
+ }
+ case ']':
+ {
+ // some ']' around without its previous '['
+ // this means a PDF is somewhat corrupt but we will continue to parse.
+ pdfSource.read();
+ retval = COSNull.NULL; // must be a better solution than null...
+ break;
+ }
+ default:
+ {
+ //we must be an operator
+ String operator = readOperator();
+ if( operator.trim().length() == 0 )
+ {
+ //we have a corrupt stream, stop reading here
+ retval = null;
+ }
+ else
+ {
+ retval = PDFOperator.getOperator( operator );
+ }
+ }
+
+ }
+ if( log.isDebugEnabled() )
+ {
+ log.debug( "parseNextToken() retval=" + retval + " peek=" + (char)pdfSource.peek() + " end" );
+ }
+
+ return retval;
+ }
+
+ /**
+ * This will read an operator from the stream.
+ *
+ * @return The operator that was read from the stream.
+ *
+ * @throws IOException If there is an error reading from the stream.
+ */
+ protected String readOperator() throws IOException
+ {
+ skipSpaces();
+
+ //average string size is around 2 and the normal string buffer size is
+ //about 16 so lets save some space.
+ StringBuffer buffer = new StringBuffer(4);
+ while(
+ !isWhitespace() &&
+ !isClosing() &&
+ !pdfSource.isEOF() &&
+ pdfSource.peek() != (int)'[' &&
+ pdfSource.peek() != (int)'<' &&
+ pdfSource.peek() != (int)'(' &&
+ pdfSource.peek() != (int)'/' &&
+ (pdfSource.peek() < (int)'0' ||
+ pdfSource.peek() > (int)'9' ) )
+ {
+ buffer.append( (char)pdfSource.read() );
+ }
+ return buffer.toString();
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdfparser/PDFXref.java b/src/main/java/org/pdfbox/pdfparser/PDFXref.java
new file mode 100644
index 0000000..abe0f35
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdfparser/PDFXref.java
@@ -0,0 +1,96 @@
+/**
+ * Copyright (c) 2003, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdfparser;
+
+/**
+ * This class represents a PDF xref.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.3 $
+ */
+public class PDFXref
+{
+
+ private long count;
+ private long start;
+
+ /**
+ * constructor.
+ *
+ * @param startValue The start attribute.
+ * @param countValue The count attribute.
+ */
+ public PDFXref( long startValue, long countValue )
+ {
+ setStart( startValue );
+ setCount( countValue );
+ }
+
+ /**
+ * This will get the count attribute.
+ *
+ * @return The count.
+ */
+ public long getCount()
+ {
+ return count;
+ }
+
+ /**
+ * This will get the start attribute.
+ *
+ * @return The start.
+ */
+ public long getStart()
+ {
+ return start;
+ }
+
+ /**
+ * This will set the count attribute.
+ *
+ * @param newCount The new count.
+ */
+ private void setCount(long newCount)
+ {
+ count = newCount;
+ }
+
+ /**
+ * This will set the start attribute.
+ *
+ * @param newStart The new start attribute.
+ */
+ private void setStart(long newStart)
+ {
+ start = newStart;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdfparser/package.html b/src/main/java/org/pdfbox/pdfparser/package.html
new file mode 100644
index 0000000..fe012c1
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdfparser/package.html
@@ -0,0 +1,9 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head>
+
+</head>
+<body>
+The pdfparser package contains classes to parse PDF documents and objects within the document.
+</body>
+</html>
diff --git a/src/main/java/org/pdfbox/pdfviewer/ArrayEntry.java b/src/main/java/org/pdfbox/pdfviewer/ArrayEntry.java
new file mode 100644
index 0000000..e229587
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdfviewer/ArrayEntry.java
@@ -0,0 +1,83 @@
+/**
+ * Copyright (c) 2003, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdfviewer;
+
+/**
+ * This is a simple class that will contain an index and a value.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.2 $
+ */
+public class ArrayEntry
+{
+ private int index;
+ private Object value;
+
+ /**
+ * This will get the value for this entry.
+ *
+ * @return The value for this entry.
+ */
+ public Object getValue()
+ {
+ return value;
+ }
+
+ /**
+ * This will set the value for this entry.
+ *
+ * @param val the new value for this entry.
+ */
+ public void setValue(Object val)
+ {
+ this.value = val;
+ }
+
+ /**
+ * This will get the index of the array entry.
+ *
+ * @return The 0-based index into the array
+ */
+ public int getIndex()
+ {
+ return index;
+ }
+
+ /**
+ * This will set the index value.
+ *
+ * @param i The new index value.
+ */
+ public void setIndex(int i)
+ {
+ index = i;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdfviewer/MapEntry.java b/src/main/java/org/pdfbox/pdfviewer/MapEntry.java
new file mode 100644
index 0000000..9fd73e5
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdfviewer/MapEntry.java
@@ -0,0 +1,105 @@
+/**
+ * Copyright (c) 2003, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdfviewer;
+
+import org.pdfbox.cos.COSName;
+
+
+/**
+ * This is a simple class that will contain a key and a value.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.2 $
+ */
+public class MapEntry
+{
+ private Object key;
+ private Object value;
+
+ /**
+ * Get the key for this entry.
+ *
+ * @return The entry's key.
+ */
+ public Object getKey()
+ {
+ return key;
+ }
+
+ /**
+ * This will set the key for this entry.
+ *
+ * @param k the new key for this entry.
+ */
+ public void setKey(Object k)
+ {
+ key = k;
+ }
+
+ /**
+ * This will get the value for this entry.
+ *
+ * @return The value for this entry.
+ */
+ public Object getValue()
+ {
+ return value;
+ }
+
+ /**
+ * This will set the value for this entry.
+ *
+ * @param val the new value for this entry.
+ */
+ public void setValue(Object val)
+ {
+ this.value = val;
+ }
+
+ /**
+ * This will output a string representation of this class.
+ *
+ * @return A string representation of this class.
+ */
+ public String toString()
+ {
+ String retval = null;
+ if( key instanceof COSName )
+ {
+ retval = ((COSName)key).getName();
+ }
+ else
+ {
+ retval = "" +key;
+ }
+ return retval;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdfviewer/PDFPagePanel.java b/src/main/java/org/pdfbox/pdfviewer/PDFPagePanel.java
new file mode 100644
index 0000000..1d28bd3
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdfviewer/PDFPagePanel.java
@@ -0,0 +1,102 @@
+/**
+ * Copyright (c) 2004-2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdfviewer;
+
+import java.awt.Dimension;
+import java.awt.Graphics;
+
+import java.io.IOException;
+
+import javax.swing.JPanel;
+
+import org.pdfbox.pdmodel.PDPage;
+
+import org.pdfbox.pdmodel.common.PDRectangle;
+
+/**
+ * This is a simple JPanel that can be used to display a PDF page.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.3 $
+ */
+public class PDFPagePanel extends JPanel
+{
+
+ private PDPage page;
+ private PageDrawer drawer = null;
+ private Dimension pageDimension = null;
+
+ /**
+ * Constructor.
+ *
+ * @throws IOException If there is an error creating the Page drawing objects.
+ */
+ public PDFPagePanel() throws IOException
+ {
+ drawer = new PageDrawer();
+ }
+
+ /**
+ * This will set the page that should be displayed in this panel.
+ *
+ * @param pdfPage The page to draw.
+ */
+ public void setPage( PDPage pdfPage )
+ {
+ page = pdfPage;
+ PDRectangle pageSize = page.findMediaBox();
+ int rotation = page.findRotation();
+ pageDimension = pageSize.createDimension();
+ if( rotation == 90 || rotation == 270 )
+ {
+ pageDimension = new Dimension( pageDimension.height, pageDimension.width );
+ }
+ setSize( pageDimension );
+ setBackground( java.awt.Color.white );
+ }
+
+ /**
+ * @see JPanel#paint( Graphics )
+ */
+ public void paint(Graphics g )
+ {
+ try
+ {
+ g.setColor( getBackground() );
+ g.fillRect( 0, 0, getWidth(), getHeight() );
+ drawer.drawPage( g, page, pageDimension );
+ }
+ catch( IOException e )
+ {
+ e.printStackTrace();
+ }
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdfviewer/PDFTreeCellRenderer.java b/src/main/java/org/pdfbox/pdfviewer/PDFTreeCellRenderer.java
new file mode 100644
index 0000000..98c1f5a
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdfviewer/PDFTreeCellRenderer.java
@@ -0,0 +1,145 @@
+/**
+ * Copyright (c) 2003, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdfviewer;
+
+import java.awt.Component;
+
+import javax.swing.JTree;
+
+import javax.swing.tree.DefaultTreeCellRenderer;
+
+import org.pdfbox.cos.COSArray;
+import org.pdfbox.cos.COSBase;
+import org.pdfbox.cos.COSDictionary;
+import org.pdfbox.cos.COSName;
+import org.pdfbox.cos.COSNull;
+import org.pdfbox.cos.COSFloat;
+import org.pdfbox.cos.COSInteger;
+import org.pdfbox.cos.COSStream;
+import org.pdfbox.cos.COSString;
+
+/**
+ * A class to render tree cells for the pdfviewer.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.5 $
+ */
+public class PDFTreeCellRenderer extends DefaultTreeCellRenderer
+{
+ /**
+ * @see DefaultTreeCellRenderer#getTreeCellRendererComponent( JTree, Object, boolean,
+ * boolean, boolean, int, boolean )
+ */
+ public Component getTreeCellRendererComponent(
+ JTree tree,
+ Object nodeValue,
+ boolean isSelected,
+ boolean expanded,
+ boolean leaf,
+ int row,
+ boolean componentHasFocus)
+ {
+ nodeValue = convertToTreeObject( nodeValue );
+ return super.getTreeCellRendererComponent( tree, nodeValue, isSelected, expanded, leaf,
+ row, componentHasFocus );
+ }
+
+ private Object convertToTreeObject( Object nodeValue )
+ {
+ if( nodeValue instanceof MapEntry )
+ {
+ MapEntry entry = (MapEntry)nodeValue;
+ COSName key = (COSName)entry.getKey();
+ COSBase value = (COSBase)entry.getValue();
+ nodeValue = key.getName() + ":" + convertToTreeObject( value );
+ }
+ else if( nodeValue instanceof COSFloat )
+ {
+ nodeValue = "" + ((COSFloat)nodeValue).floatValue();
+ }
+ else if( nodeValue instanceof COSInteger )
+ {
+ nodeValue = "" + ((COSInteger)nodeValue).intValue();
+ }
+ else if( nodeValue instanceof COSString )
+ {
+ nodeValue = ((COSString)nodeValue).getString();
+ }
+ else if( nodeValue instanceof COSName )
+ {
+ nodeValue = ((COSName)nodeValue).getName();
+ }
+ else if( nodeValue instanceof ArrayEntry )
+ {
+ ArrayEntry entry = (ArrayEntry)nodeValue;
+ nodeValue = "[" + entry.getIndex() + "]" + convertToTreeObject( entry.getValue() );
+ }
+ else if( nodeValue instanceof COSNull )
+ {
+ nodeValue = "null";
+ }
+ else if( nodeValue instanceof COSDictionary )
+ {
+ COSDictionary dict = (COSDictionary)nodeValue;
+ if( nodeValue instanceof COSStream )
+ {
+ nodeValue = "Stream";
+ }
+ else
+ {
+ nodeValue = "Dictionary";
+ }
+
+ COSName type = (COSName)dict.getDictionaryObject( COSName.TYPE );
+ if( type != null )
+ {
+ nodeValue = nodeValue + "(" + type.getName();
+ COSName subType = (COSName)dict.getDictionaryObject( COSName.SUBTYPE );
+ if( subType != null )
+ {
+ nodeValue = nodeValue + ":" + subType.getName();
+ }
+
+ nodeValue = nodeValue + ")";
+ }
+ }
+ else if( nodeValue instanceof COSArray )
+ {
+ nodeValue="Array";
+ }
+ else if( nodeValue instanceof COSString )
+ {
+ nodeValue = ((COSString)nodeValue).getString();
+ }
+ return nodeValue;
+
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdfviewer/PDFTreeModel.java b/src/main/java/org/pdfbox/pdfviewer/PDFTreeModel.java
new file mode 100644
index 0000000..368a2ca
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdfviewer/PDFTreeModel.java
@@ -0,0 +1,332 @@
+/**
+ * Copyright (c) 2003-2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdfviewer;
+
+/**
+ * A tree model that uses a cos document.
+ *
+ *
+ * @author wurtz
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.8 $
+ */
+import javax.swing.tree.TreePath;
+import javax.swing.tree.TreeModel;
+
+//import java.awt.event.*;
+import javax.swing.event.TreeModelListener;
+
+import org.pdfbox.cos.COSArray;
+import org.pdfbox.cos.COSBase;
+import org.pdfbox.cos.COSDictionary;
+import org.pdfbox.cos.COSDocument;
+import org.pdfbox.cos.COSName;
+import org.pdfbox.cos.COSObject;
+
+import org.pdfbox.pdmodel.PDDocument;
+
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * A class to model a PDF document as a tree structure.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.8 $
+ */
+public class PDFTreeModel implements TreeModel
+{
+ private PDDocument document;
+
+ /**
+ * constructor.
+ */
+ public PDFTreeModel()
+ {
+ //default constructor
+ }
+
+ /**
+ * Constructor to take a document.
+ *
+ * @param doc The document to display in the tree.
+ */
+ public PDFTreeModel(PDDocument doc)
+ {
+ setDocument(doc);
+ }
+
+ /**
+ * Set the document to display in the tree.
+ *
+ * @param doc The document to display in the tree.
+ */
+ public void setDocument(PDDocument doc)
+ {
+ document = doc;
+ }
+ /**
+ * Adds a listener for the <code>TreeModelEvent</code>
+ * posted after the tree changes.
+ *
+ * @param l the listener to add
+ * @see #removeTreeModelListener
+ *
+ */
+ public void addTreeModelListener(TreeModelListener l)
+ {
+ //required for interface
+ }
+
+ /**
+ * Returns the child of <code>parent</code> at index <code>index</code>
+ * in the parent's
+ * child array. <code>parent</code> must be a node previously obtained
+ * from this data source. This should not return <code>null</code>
+ * if <code>index</code>
+ * is a valid index for <code>parent</code> (that is <code>index >= 0 &&
+ * index < getChildCount(parent</code>)).
+ *
+ * @param parent a node in the tree, obtained from this data source
+ * @param index The index into the parent object to location the child object.
+ * @return the child of <code>parent</code> at index <code>index</code>
+ *
+ */
+ public Object getChild(Object parent, int index)
+ {
+ Object retval = null;
+ if( parent instanceof COSArray )
+ {
+ ArrayEntry entry = new ArrayEntry();
+ entry.setIndex( index );
+ entry.setValue( ((COSArray)parent).getObject( index ) );
+ retval = entry;
+ }
+ else if( parent instanceof COSDictionary )
+ {
+ COSDictionary dict = ((COSDictionary)parent);
+ List keys = dict.keyList();
+ Collections.sort( keys );
+ Object key = keys.get( index );
+ Object value = dict.getDictionaryObject( (COSName)key );
+ MapEntry entry = new MapEntry();
+ entry.setKey( key );
+ entry.setValue( value );
+ retval = entry;
+ }
+ else if( parent instanceof MapEntry )
+ {
+ retval = getChild( ((MapEntry)parent).getValue(), index );
+ }
+ else if( parent instanceof ArrayEntry )
+ {
+ retval = getChild( ((ArrayEntry)parent).getValue(), index );
+ }
+ else if( parent instanceof COSDocument )
+ {
+ retval = ((COSDocument)parent).getObjects().get( index );
+ }
+ else if( parent instanceof COSObject )
+ {
+ retval = ((COSObject)parent).getObject();
+ }
+ else
+ {
+ throw new RuntimeException( "Unknown COS type " + parent.getClass().getName() );
+ }
+ return retval;
+ }
+
+ /** Returns the number of children of <code>parent</code>.
+ * Returns 0 if the node
+ * is a leaf or if it has no children. <code>parent</code> must be a node
+ * previously obtained from this data source.
+ *
+ * @param parent a node in the tree, obtained from this data source
+ * @return the number of children of the node <code>parent</code>
+ *
+ */
+ public int getChildCount(Object parent)
+ {
+ int retval = 0;
+ if( parent instanceof COSArray )
+ {
+ retval = ((COSArray)parent).size();
+ }
+ else if( parent instanceof COSDictionary )
+ {
+ retval = ((COSDictionary)parent).size();
+ }
+ else if( parent instanceof MapEntry )
+ {
+ retval = getChildCount( ((MapEntry)parent).getValue() );
+ }
+ else if( parent instanceof ArrayEntry )
+ {
+ retval = getChildCount( ((ArrayEntry)parent).getValue() );
+ }
+ else if( parent instanceof COSDocument )
+ {
+ retval = ((COSDocument)parent).getObjects().size();
+ }
+ else if( parent instanceof COSObject )
+ {
+ retval = 1;
+ }
+ return retval;
+ }
+
+ /** Returns the index of child in parent. If <code>parent</code>
+ * is <code>null</code> or <code>child</code> is <code>null</code>,
+ * returns -1.
+ *
+ * @param parent a note in the tree, obtained from this data source
+ * @param child the node we are interested in
+ * @return the index of the child in the parent, or -1 if either
+ * <code>child</code> or <code>parent</code> are <code>null</code>
+ *
+ */
+ public int getIndexOfChild(Object parent, Object child)
+ {
+ int retval = -1;
+ if( parent != null && child != null )
+ {
+ if( parent instanceof COSArray )
+ {
+ COSArray array = (COSArray)parent;
+ if( child instanceof ArrayEntry )
+ {
+ ArrayEntry arrayEntry = (ArrayEntry)child;
+ retval = arrayEntry.getIndex();
+ }
+ else
+ {
+ retval = array.indexOf( (COSBase)child );
+ }
+ }
+ else if( parent instanceof COSDictionary )
+ {
+ MapEntry entry = (MapEntry)child;
+ COSDictionary dict = (COSDictionary)parent;
+ List keys = dict.keyList();
+ Collections.sort( keys );
+ for( int i=0; retval == -1 && i<keys.size(); i++ )
+ {
+ if( keys.get( i ).equals( entry.getKey() ) )
+ {
+ retval = i;
+ }
+ }
+ }
+ else if( parent instanceof MapEntry )
+ {
+ retval = getIndexOfChild( ((MapEntry)parent).getValue(), child );
+ }
+ else if( parent instanceof ArrayEntry )
+ {
+ retval = getIndexOfChild( ((ArrayEntry)parent).getValue(), child );
+ }
+ else if( parent instanceof COSDocument )
+ {
+ retval = ((COSDocument)parent).getObjects().indexOf( child );
+ }
+ else if( parent instanceof COSObject )
+ {
+ retval = 0;
+ }
+ else
+ {
+ throw new RuntimeException( "Unknown COS type " + parent.getClass().getName() );
+ }
+ }
+ return retval;
+ }
+
+ /** Returns the root of the tree. Returns <code>null</code>
+ * only if the tree has no nodes.
+ *
+ * @return the root of the tree
+ *
+ */
+ public Object getRoot()
+ {
+ return document.getDocument().getTrailer();
+ }
+
+ /** Returns <code>true</code> if <code>node</code> is a leaf.
+ * It is possible for this method to return <code>false</code>
+ * even if <code>node</code> has no children.
+ * A directory in a filesystem, for example,
+ * may contain no files; the node representing
+ * the directory is not a leaf, but it also has no children.
+ *
+ * @param node a node in the tree, obtained from this data source
+ * @return true if <code>node</code> is a leaf
+ *
+ */
+ public boolean isLeaf(Object node)
+ {
+ boolean isLeaf = !(node instanceof COSDictionary ||
+ node instanceof COSArray ||
+ node instanceof COSDocument ||
+ node instanceof COSObject ||
+ (node instanceof MapEntry && !isLeaf(((MapEntry)node).getValue()) ) ||
+ (node instanceof ArrayEntry && !isLeaf(((ArrayEntry)node).getValue()) ));
+ return isLeaf;
+ }
+
+ /** Removes a listener previously added with
+ * <code>addTreeModelListener</code>.
+ *
+ * @see #addTreeModelListener
+ * @param l the listener to remove
+ *
+ */
+
+ public void removeTreeModelListener(TreeModelListener l)
+ {
+ //required for interface
+ }
+
+ /** Messaged when the user has altered the value for the item identified
+ * by <code>path</code> to <code>newValue</code>.
+ * If <code>newValue</code> signifies a truly new value
+ * the model should post a <code>treeNodesChanged</code> event.
+ *
+ * @param path path to the node that the user has altered
+ * @param newValue the new value from the TreeCellEditor
+ *
+ */
+ public void valueForPathChanged(TreePath path, Object newValue)
+ {
+ //required for interface
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdfviewer/PageDrawer.java b/src/main/java/org/pdfbox/pdfviewer/PageDrawer.java
new file mode 100644
index 0000000..7c39f7b
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdfviewer/PageDrawer.java
@@ -0,0 +1,268 @@
+/**
+ * Copyright (c) 2003-2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdfviewer;
+
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.Graphics;
+import java.awt.Graphics2D;
+import java.awt.RenderingHints;
+
+import java.awt.geom.GeneralPath;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.pdfbox.pdmodel.PDPage;
+
+import org.pdfbox.pdmodel.font.PDFont;
+
+import org.pdfbox.util.PDFStreamEngine;
+import org.pdfbox.util.ResourceLoader;
+import org.pdfbox.util.TextPosition;
+
+/**
+ * This will paint a page in a PDF document to a graphics context.
+ *
+ * @author Ben Litchfield (ben@benlitchfield.com)
+ * @version $Revision: 1.17 $
+ */
+public class PageDrawer extends PDFStreamEngine
+{
+
+ private Graphics2D graphics;
+ private Dimension pageSize;
+ private PDPage page;
+
+ private List lineSubPaths = new ArrayList();
+ private GeneralPath linePath = new GeneralPath();
+ private Color strokingColor = Color.BLACK;
+ private Color nonStrokingColor = Color.BLACK;
+
+ /**
+ * Default constructor, loads properties from file.
+ *
+ * @throws IOException If there is an error loading properties from the file.
+ */
+ public PageDrawer() throws IOException
+ {
+ super( ResourceLoader.loadProperties( "Resources/PageDrawer.properties" ) );
+ }
+
+ /**
+ * This will draw the page to the requested context.
+ *
+ * @param g The graphics context to draw onto.
+ * @param p The page to draw.
+ * @param pageDimension The size of the page to draw.
+ *
+ * @throws IOException If there is an IO error while drawing the page.
+ */
+ public void drawPage( Graphics g, PDPage p, Dimension pageDimension ) throws IOException
+ {
+ graphics = (Graphics2D)g;
+ page = p;
+ pageSize = pageDimension;
+
+ graphics.setRenderingHint( RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON );
+ processStream( page, page.findResources(), page.getContents().getStream() );
+ // Transformations should be done in order
+ // 1 - Translate
+ // 2 - Rotate
+ // 3 - Scale
+ // Refer to PDFReference p176 (or 188 in xpdf)
+ //AffineTransform transform = graphics.getTransform();
+ //transform.setToTranslate( 0, page.findMediaBox().getHeight()/2 );
+ //transform.setToRotation((double)p.getRotation());
+ //transform.setTransform( 1, 0, 0, 1, 0, 0 );
+ //transform.setToScale( 1, 1 );
+
+ //AffineTransform rotation = graphics.getTransform();
+ //rotation.rotate( (page.findRotation() * Math.PI) / 180d );
+ //graphics.setTransform( rotation );
+ }
+
+ /**
+ * You should override this method if you want to perform an action when a
+ * string is being shown.
+ *
+ * @param text The string to display.
+ */
+ protected void showCharacter( TextPosition text )
+ {
+ //should use colorspaces for the font color but for now assume that
+ //the font color is black
+ try
+ {
+ graphics.setColor( Color.black );
+ PDFont font = text.getFont();
+ font.drawString( text.getCharacter(), graphics, text.getFontSize(), text.getXScale(), text.getYScale(),
+ text.getX(), text.getY() );
+ }
+ catch( IOException io )
+ {
+ io.printStackTrace();
+ }
+ }
+
+ /**
+ * Get the graphics that we are currently drawing on.
+ *
+ * @return The graphics we are drawing on.
+ */
+ public Graphics2D getGraphics()
+ {
+ return graphics;
+ }
+
+ /**
+ * Get the page that is currently being drawn.
+ *
+ * @return The page that is being drawn.
+ */
+ public PDPage getPage()
+ {
+ return page;
+ }
+
+ /**
+ * Get the size of the page that is currently being drawn.
+ *
+ * @return The size of the page that is being drawn.
+ */
+ public Dimension getPageSize()
+ {
+ return pageSize;
+ }
+
+ /**
+ * Fix the y coordinate based on page rotation.
+ *
+ * @param x The x coordinate.
+ * @param y The y coordinate.
+ * @return The updated y coordinate.
+ */
+ public double fixY( double x, double y )
+ {
+ double retval = y;
+ int rotation = page.findRotation();
+ if( rotation == 0 )
+ {
+ retval = pageSize.getHeight() - y;
+ }
+ else if( rotation == 90 )
+ {
+ retval = y;
+ }
+ return retval;
+ }
+
+ /**
+ * Get the current line path to be drawn.
+ *
+ * @return The current line path to be drawn.
+ */
+ public GeneralPath getLinePath()
+ {
+ return linePath;
+ }
+
+ /**
+ * Set the line path to draw.
+ *
+ * @param newLinePath Set the line path to draw.
+ */
+ public void setLinePath(GeneralPath newLinePath)
+ {
+ linePath = newLinePath;
+ }
+
+ /**
+ * Get the current list of line paths to be drawn.
+ *
+ * @return The current list of line paths to be drawn.
+ */
+ public List getLineSubPaths()
+ {
+ return lineSubPaths;
+ }
+
+ /**
+ * Set the list of line paths to draw.
+ *
+ * @param newLineSubPaths Set the list of line paths to draw.
+ */
+ public void setLineSubPaths(List newLineSubPaths)
+ {
+ lineSubPaths = newLineSubPaths;
+ }
+
+ /**
+ * Get the non stroking color.
+ *
+ * @return The non stroking color.
+ */
+ public Color getNonStrokingColor()
+ {
+ return nonStrokingColor;
+ }
+
+ /**
+ * Set the non stroking color.
+ *
+ * @param newNonStrokingColor The non stroking color.
+ */
+ public void setNonStrokingColor(Color newNonStrokingColor)
+ {
+ nonStrokingColor = newNonStrokingColor;
+ }
+
+ /**
+ * Get the stroking color.
+ *
+ * @return The stroking color.
+ */
+ public Color getStrokingColor()
+ {
+ return strokingColor;
+ }
+
+ /**
+ * Set the stroking color.
+ *
+ * @param newStrokingColor The stroking color.
+ */
+ public void setStrokingColor(Color newStrokingColor)
+ {
+ strokingColor = newStrokingColor;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdfviewer/PageWrapper.java b/src/main/java/org/pdfbox/pdfviewer/PageWrapper.java
new file mode 100644
index 0000000..b2dc275
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdfviewer/PageWrapper.java
@@ -0,0 +1,118 @@
+/**
+ * Copyright (c) 2003-2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdfviewer;
+
+import java.awt.Dimension;
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseMotionListener;
+import java.io.IOException;
+
+import javax.swing.JPanel;
+
+import org.pdfbox.PDFReader;
+import org.pdfbox.pdmodel.PDPage;
+
+/**
+ * A class to handle some prettyness around a single PDF page.
+ *
+ * @author Ben Litchfield (ben@benlitchfield.com)
+ * @version $Revision: 1.4 $
+ */
+public class PageWrapper implements MouseMotionListener
+{
+ private JPanel pageWrapper = new JPanel();
+ private PDFPagePanel pagePanel = null;
+ private PDFReader reader = null;
+
+ private static final int SPACE_AROUND_DOCUMENT = 20;
+
+ /**
+ * Constructor.
+ *
+ * @param aReader The reader application that holds this page.
+ *
+ * @throws IOException If there is an error creating the page drawing objects.
+ */
+ public PageWrapper( PDFReader aReader ) throws IOException
+ {
+ reader = aReader;
+ pagePanel = new PDFPagePanel();
+ pageWrapper.setLayout( null );
+ pageWrapper.add( pagePanel );
+ pagePanel.setLocation( SPACE_AROUND_DOCUMENT, SPACE_AROUND_DOCUMENT );
+ pageWrapper.setBorder( javax.swing.border.LineBorder.createBlackLineBorder() );
+ pagePanel.addMouseMotionListener( this );
+ }
+
+ /**
+ * This will display the PDF page in this component.
+ *
+ * @param page The PDF page to display.
+ */
+ public void displayPage( PDPage page )
+ {
+ pagePanel.setPage( page );
+ pagePanel.setPreferredSize( pagePanel.getSize() );
+ Dimension d = pagePanel.getSize();
+ d.width+=(SPACE_AROUND_DOCUMENT*2);
+ d.height+=(SPACE_AROUND_DOCUMENT*2);
+
+ pageWrapper.setPreferredSize( d );
+ pageWrapper.validate();
+ }
+
+ /**
+ * This will get the JPanel that can be displayed.
+ *
+ * @return The panel with the displayed PDF page.
+ */
+ public JPanel getPanel()
+ {
+ return pageWrapper;
+ }
+
+ /**
+ * @see MouseMotionListener#mouseDragged(MouseEvent)
+ */
+ public void mouseDragged(MouseEvent e)
+ {
+ //do nothing when mouse moves.
+ }
+
+ /**
+ * @see MouseMotionListener#mouseMoved( MouseEvent )
+ */
+ public void mouseMoved(MouseEvent e)
+ {
+ //reader.getBottomStatusPanel().getStatusLabel().setText( e.getX() + "," + (pagePanel.getHeight() - e.getY()) );
+ reader.getBottomStatusPanel().getStatusLabel().setText( e.getX() + "," + e.getY() );
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdfviewer/ReaderBottomPanel.java b/src/main/java/org/pdfbox/pdfviewer/ReaderBottomPanel.java
new file mode 100644
index 0000000..516d2c2
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdfviewer/ReaderBottomPanel.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright (c) 2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdfviewer;
+
+import java.awt.Dimension;
+
+import javax.swing.JPanel;
+
+import javax.swing.JLabel;
+import java.awt.FlowLayout;
+/**
+ * A panel to display at the bottom of the window for status and other stuff.
+ *
+ * @author Ben Litchfield (ben@pdfbox.org)
+ * @version $Revision: 1.1 $
+ */
+public class ReaderBottomPanel extends JPanel
+{
+
+ private JLabel statusLabel = null;
+
+ /**
+ * This is the default constructor.
+ */
+ public ReaderBottomPanel()
+ {
+ super();
+ initialize();
+ }
+
+ /**
+ * This method initializes this.
+ */
+ private void initialize()
+ {
+ FlowLayout flowLayout1 = new FlowLayout();
+ this.setLayout(flowLayout1);
+ this.setComponentOrientation(java.awt.ComponentOrientation.LEFT_TO_RIGHT);
+ this.setPreferredSize( new Dimension( 1000, 20 ) );
+ flowLayout1.setAlignment(java.awt.FlowLayout.LEFT);
+ this.add(getStatusLabel(), null);
+ }
+
+ /**
+ * This method initializes status label.
+ *
+ * @return javax.swing.JLabel
+ */
+ public JLabel getStatusLabel()
+ {
+ if (statusLabel == null)
+ {
+ statusLabel = new JLabel();
+ statusLabel.setText("Ready");
+ }
+ return statusLabel;
+ }
+ }
diff --git a/src/main/java/org/pdfbox/pdfviewer/package.html b/src/main/java/org/pdfbox/pdfviewer/package.html
new file mode 100644
index 0000000..85ec4b6
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdfviewer/package.html
@@ -0,0 +1,9 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head>
+
+</head>
+<body>
+The pdfviewer package contains classes to graphically display information about a PDF document.
+</body>
+</html>
diff --git a/src/main/java/org/pdfbox/pdfwriter/COSStandardOutputStream.java b/src/main/java/org/pdfbox/pdfwriter/COSStandardOutputStream.java
new file mode 100644
index 0000000..1881bf2
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdfwriter/COSStandardOutputStream.java
@@ -0,0 +1,180 @@
+/**
+ * Copyright (c) 2003, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdfwriter;
+
+
+
+import java.io.FilterOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+
+/**
+ * simple output stream with some minor features for generating "pretty"
+ * pdf files.
+ *
+ * @author Michael Traut
+ * @version $Revision: 1.4 $
+ */
+public class COSStandardOutputStream extends FilterOutputStream
+{
+
+ /**
+ * To be used when 2 byte sequence is enforced.
+ */
+ public static final byte[] CRLF = "\r\n".getBytes();
+
+ /**
+ * Line feed character.
+ */
+ public static final byte[] LF = "\n".getBytes();
+
+ /**
+ * standard line separator on this platform.
+ */
+ public static final byte[] EOL = System.getProperty("line.separator").getBytes();
+
+ // current byte pos in the output stream
+ private long pos = 0;
+ // flag to prevent generating two newlines in sequence
+ private boolean onNewLine = false;
+
+ /**
+ * COSOutputStream constructor comment.
+ *
+ * @param out The underlying stream to write to.
+ */
+ public COSStandardOutputStream(OutputStream out)
+ {
+ super(out);
+ }
+ /**
+ * This will get the current position in the stream.
+ *
+ * @return The current position in the stream.
+ */
+ public long getPos()
+ {
+ return pos;
+ }
+ /**
+ * This will tell if we are on a newling.
+ *
+ * @return true If we are on a newline.
+ */
+ public boolean isOnNewLine()
+ {
+ return onNewLine;
+ }
+ /**
+ * This will set a flag telling if we are on a newline.
+ *
+ * @param newOnNewLine The new value for the onNewLine attribute.
+ */
+ public void setOnNewLine(boolean newOnNewLine)
+ {
+ onNewLine = newOnNewLine;
+ }
+ /**
+ * This will set the position in the stream.
+ *
+ * @param newPos The new position in the stream.
+ */
+ private void setPos(int newPos)
+ {
+ pos = newPos;
+ }
+
+ /**
+ * This will write some byte to the stream.
+ *
+ * @param b The source byte array.
+ * @param off The offset into the array to start writing.
+ * @param len The number of bytes to write.
+ *
+ * @throws IOException If the underlying stream throws an exception.
+ */
+ public void write(byte[] b, int off, int len) throws IOException
+ {
+ setOnNewLine(false);
+ out.write(b, off, len);
+ pos += len;
+ }
+
+ /**
+ * This will write a single byte to the stream.
+ *
+ * @param b The byte to write to the stream.
+ *
+ * @throws IOException If there is an error writing to the underlying stream.
+ */
+ public void write(int b) throws IOException
+ {
+ setOnNewLine(false);
+ out.write(b);
+ pos++;
+ }
+
+ /**
+ * This will write a CRLF to the stream.
+ *
+ * @throws IOException If there is an error writing the data to the stream.
+ */
+ public void writeCRLF() throws IOException
+ {
+ write(CRLF);
+ // setOnNewLine(true);
+ }
+
+ /**
+ * This will write an EOL to the stream.
+ *
+ * @throws IOException If there is an error writing to the stream
+ */
+ public void writeEOL() throws IOException
+ {
+ if (!isOnNewLine())
+ {
+ write(EOL);
+ setOnNewLine(true);
+ }
+ }
+
+ /**
+ * This will write a Linefeed to the stream.
+ *
+ * @throws IOException If there is an error writing to the underlying stream.
+ */
+ public void writeLF() throws IOException
+ {
+ write(LF);
+ // setOnNewLine(true);
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdfwriter/COSWriter.java b/src/main/java/org/pdfbox/pdfwriter/COSWriter.java
new file mode 100644
index 0000000..fa9cf48
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdfwriter/COSWriter.java
@@ -0,0 +1,1091 @@
+/**
+ * Copyright (c) 2003-2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdfwriter;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Hashtable;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Set;
+
+import java.text.DecimalFormat;
+import java.text.NumberFormat;
+
+import org.pdfbox.persistence.util.COSObjectKey;
+
+import org.pdfbox.cos.COSBase;
+import org.pdfbox.cos.COSFloat;
+import org.pdfbox.cos.ICOSVisitor;
+import org.pdfbox.cos.COSName;
+import org.pdfbox.cos.COSString;
+import org.pdfbox.cos.COSBoolean;
+import org.pdfbox.cos.COSArray;
+import org.pdfbox.cos.COSDocument;
+import org.pdfbox.cos.COSStream;
+import org.pdfbox.cos.COSObject;
+import org.pdfbox.encryption.DocumentEncryption;
+import org.pdfbox.exceptions.COSVisitorException;
+import org.pdfbox.exceptions.CryptographyException;
+import org.pdfbox.cos.COSDictionary;
+import org.pdfbox.cos.COSInteger;
+import org.pdfbox.cos.COSNull;
+
+import org.pdfbox.pdmodel.PDDocument;
+
+import org.apache.log4j.Logger;
+
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+
+/**
+ * this class acts on a in-memory representation of a pdf document.
+ *
+ * todo no support for incremental updates
+ * todo single xref section only
+ * todo no linearization
+ *
+ * @author Michael Traut
+ * @author Ben Litchfield (ben@benlitchfield.com)
+ * @version $Revision: 1.32 $
+ */
+public class COSWriter implements ICOSVisitor
+{
+
+ private static Logger log = Logger.getLogger( COSWriter.class );
+ /**
+ * The dictionary open token.
+ */
+ public static final byte[] DICT_OPEN = "<<".getBytes();
+ /**
+ * The dictionary close token.
+ */
+ public static final byte[] DICT_CLOSE = ">>".getBytes();
+ /**
+ * space character.
+ */
+ public static final byte[] SPACE = " ".getBytes();
+ /**
+ * The start to a PDF comment.
+ */
+ public static final byte[] COMMENT = "%".getBytes();
+
+ /**
+ * The output version of the PDF.
+ */
+ public static final byte[] VERSION = "PDF-1.4".getBytes();
+ /**
+ * Garbage bytes used to create the PDF header.
+ */
+ public static final byte[] GARBAGE = new byte[] {(byte)0xf6, (byte)0xe4, (byte)0xfc, (byte)0xdf};
+ /**
+ * The EOF constant.
+ */
+ public static final byte[] EOF = "%%EOF".getBytes();
+ // pdf tokens
+
+ /**
+ * The reference token.
+ */
+ public static final byte[] REFERENCE = "R".getBytes();
+ /**
+ * The XREF token.
+ */
+ public static final byte[] XREF = "xref".getBytes();
+ /**
+ * The xref free token.
+ */
+ public static final byte[] XREF_FREE = "f".getBytes();
+ /**
+ * The xref used token.
+ */
+ public static final byte[] XREF_USED = "n".getBytes();
+ /**
+ * The trailer token.
+ */
+ public static final byte[] TRAILER = "trailer".getBytes();
+ /**
+ * The start xref token.
+ */
+ public static final byte[] STARTXREF = "startxref".getBytes();
+ /**
+ * The starting object token.
+ */
+ public static final byte[] OBJ = "obj".getBytes();
+ /**
+ * The end object token.
+ */
+ public static final byte[] ENDOBJ = "endobj".getBytes();
+ /**
+ * The array open token.
+ */
+ public static final byte[] ARRAY_OPEN = "[".getBytes();
+ /**
+ * The array close token.
+ */
+ public static final byte[] ARRAY_CLOSE = "]".getBytes();
+ /**
+ * The open stream token.
+ */
+ public static final byte[] STREAM = "stream".getBytes();
+ /**
+ * The close stream token.
+ */
+ public static final byte[] ENDSTREAM = "endstream".getBytes();
+
+ private NumberFormat formatXrefOffset = new DecimalFormat("0000000000");
+ /**
+ * The decimal format for the xref object generation number data.
+ */
+ private NumberFormat formatXrefGeneration = new DecimalFormat("00000");
+
+ private NumberFormat formatDecimal = NumberFormat.getNumberInstance( Locale.US );
+
+ // the stream where we create the pdf output
+ private OutputStream output;
+ // the stream used to write standard cos data
+ private COSStandardOutputStream standardOutput;
+
+ // the start position of the x ref section
+ private long startxref = 0;
+
+ // the current object number
+ private long number = 0;
+
+ // maps the object to the keys generated in the writer
+ // these are used for indirect refrences in other objects
+ //A hashtable is used on purpose over a hashmap
+ //so that null entries will not get added.
+ private Map objectKeys = new Hashtable();
+
+ // the list of x ref entries to be made so far
+ private List xRefEntries = new ArrayList();
+
+ //A list of objects to write.
+ private List objectsToWrite = new ArrayList();
+
+ //a list of objects already written
+ private Set writtenObjects = new HashSet();
+ //An 'actual' is any COSBase that is not a COSObject.
+ //need to keep a list of the actuals that are added
+ //as well as the objects because there is a problem
+ //when adding a COSObject and then later adding
+ //the actual for that object, so we will track
+ //actuals separately.
+ private Set actualsAdded = new HashSet();
+
+ private COSObjectKey currentObjectKey = null;
+ private PDDocument document = null;
+ private DocumentEncryption enc = null;
+
+ /**
+ * COSWriter constructor comment.
+ *
+ * @param os The wrapped output stream.
+ */
+ public COSWriter(OutputStream os)
+ {
+ super();
+ setOutput(os);
+ setStandardOutput(new COSStandardOutputStream(getOutput()));
+ formatDecimal.setMaximumFractionDigits( 10 );
+ formatDecimal.setGroupingUsed( false );
+ }
+ /**
+ * add an entry in the x ref table for later dump.
+ *
+ * @param entry The new entry to add.
+ */
+ protected void addXRefEntry(COSWriterXRefEntry entry)
+ {
+ getXRefEntries().add(entry);
+ }
+
+ /**
+ * This will close the stream.
+ *
+ * @throws IOException If the underlying stream throws an exception.
+ */
+ public void close() throws IOException
+ {
+ if (getStandardOutput() != null)
+ {
+ getStandardOutput().close();
+ }
+ if (getOutput() != null)
+ {
+ getOutput().close();
+ }
+ }
+
+ /**
+ * This will get the current object number.
+ *
+ * @return The current object number.
+ */
+ protected long getNumber()
+ {
+ return number;
+ }
+
+ /**
+ * This will get all available object keys.
+ *
+ * @return A map of all object keys.
+ */
+ public java.util.Map getObjectKeys()
+ {
+ return objectKeys;
+ }
+
+ /**
+ * This will get the output stream.
+ *
+ * @return The output stream.
+ */
+ protected java.io.OutputStream getOutput()
+ {
+ return output;
+ }
+
+ /**
+ * This will get the standard output stream.
+ *
+ * @return The standard output stream.
+ */
+ protected COSStandardOutputStream getStandardOutput()
+ {
+ return standardOutput;
+ }
+
+ /**
+ * This will get the current start xref.
+ *
+ * @return The current start xref.
+ */
+ protected long getStartxref()
+ {
+ return startxref;
+ }
+ /**
+ * This will get the xref entries.
+ *
+ * @return All available xref entries.
+ */
+ protected java.util.List getXRefEntries()
+ {
+ return xRefEntries;
+ }
+
+ /**
+ * This will set the current object number.
+ *
+ * @param newNumber The new object number.
+ */
+ protected void setNumber(long newNumber)
+ {
+ number = newNumber;
+ }
+
+ /**
+ * This will set the output stream.
+ *
+ * @param newOutput The new output stream.
+ */
+ private void setOutput( OutputStream newOutput )
+ {
+ output = newOutput;
+ }
+
+ /**
+ * This will set the standard output stream.
+ *
+ * @param newStandardOutput The new standard output stream.
+ */
+ private void setStandardOutput(COSStandardOutputStream newStandardOutput)
+ {
+ standardOutput = newStandardOutput;
+ }
+
+ /**
+ * This will set the start xref.
+ *
+ * @param newStartxref The new start xref attribute.
+ */
+ protected void setStartxref(long newStartxref)
+ {
+ startxref = newStartxref;
+ }
+
+ /**
+ * This will write the body of the document.
+ *
+ * @param doc The document to write the body for.
+ *
+ * @throws IOException If there is an error writing the data.
+ * @throws COSVisitorException If there is an error generating the data.
+ */
+ protected void doWriteBody(COSDocument doc) throws IOException, COSVisitorException
+ {
+ COSDictionary trailer = doc.getTrailer();
+ COSDictionary root = (COSDictionary)trailer.getDictionaryObject( COSName.ROOT );
+ COSDictionary info = (COSDictionary)trailer.getDictionaryObject( COSName.getPDFName( "Info" ) );
+ COSDictionary encrypt = (COSDictionary)trailer.getDictionaryObject( COSName.getPDFName( "Encrypt" ) );
+ if( root != null )
+ {
+ addObjectToWrite( root );
+ }
+ if( info != null )
+ {
+ addObjectToWrite( info );
+ }
+
+
+ while( objectsToWrite.size() > 0 )
+ {
+ COSBase nextObject = (COSBase)objectsToWrite.remove( 0 );
+ doWriteObject( nextObject );
+ }
+
+ document.clearWillEncryptWhenSaving();
+ if( encrypt != null )
+ {
+ addObjectToWrite( encrypt );
+ }
+
+ while( objectsToWrite.size() > 0 )
+ {
+ COSBase nextObject = (COSBase)objectsToWrite.remove( 0 );
+ doWriteObject( nextObject );
+ }
+
+ // write all objects
+ /**
+ for (Iterator i = doc.getObjects().iterator(); i.hasNext();)
+ {
+ COSObject obj = (COSObject) i.next();
+ doWriteObject(obj);
+ }**/
+ }
+
+ private void addObjectToWrite( COSBase object )
+ {
+ COSBase actual = object;
+ if( actual instanceof COSObject )
+ {
+ actual = ((COSObject)actual).getObject();
+ }
+
+ if( !writtenObjects.contains( object ) &&
+ !objectsToWrite.contains( object ) &&
+ !actualsAdded.contains( actual ) )
+ {
+ objectsToWrite.add( object );
+ if( actual != null )
+ {
+ actualsAdded.add( actual );
+ }
+ }
+ }
+
+ /**
+ * This will write a COS object.
+ *
+ * @param obj The object to write.
+ *
+ * @throws COSVisitorException If there is an error visiting objects.
+ */
+ public void doWriteObject( COSBase obj ) throws COSVisitorException
+ {
+ try
+ {
+ writtenObjects.add( obj );
+ // find the physical reference
+ currentObjectKey = getObjectKey( obj );
+ // add a x ref entry
+ addXRefEntry( new COSWriterXRefEntry(getStandardOutput().getPos(), obj, currentObjectKey));
+ // write the object
+ getStandardOutput().write(String.valueOf(currentObjectKey.getNumber()).getBytes());
+ getStandardOutput().write(SPACE);
+ getStandardOutput().write(String.valueOf(currentObjectKey.getGeneration()).getBytes());
+ getStandardOutput().write(SPACE);
+ getStandardOutput().write(OBJ);
+ getStandardOutput().writeEOL();
+ obj.accept( this );
+ getStandardOutput().writeEOL();
+ getStandardOutput().write(ENDOBJ);
+ getStandardOutput().writeEOL();
+ }
+ catch (IOException e)
+ {
+ throw new COSVisitorException(e);
+ }
+ }
+
+ /**
+ * This will write the header to the PDF document.
+ *
+ * @param doc The document to get the data from.
+ *
+ * @throws IOException If there is an error writing to the stream.
+ */
+ protected void doWriteHeader(COSDocument doc) throws IOException
+ {
+ getStandardOutput().write( doc.getHeaderString().getBytes() );
+ getStandardOutput().writeEOL();
+ getStandardOutput().write(COMMENT);
+ getStandardOutput().write(GARBAGE);
+ getStandardOutput().writeEOL();
+ }
+
+
+ /**
+ * This will write the trailer to the PDF document.
+ *
+ * @param doc The document to create the trailer for.
+ *
+ * @throws IOException If there is an IOError while writing the document.
+ * @throws COSVisitorException If there is an error while generating the data.
+ */
+ protected void doWriteTrailer(COSDocument doc) throws IOException, COSVisitorException
+ {
+ getStandardOutput().write(TRAILER);
+ getStandardOutput().writeEOL();
+
+ COSDictionary trailer = doc.getTrailer();
+ //sort xref, needed only if object keys not regenerated
+ Collections.sort(getXRefEntries());
+ COSWriterXRefEntry lastEntry = (COSWriterXRefEntry)getXRefEntries().get( getXRefEntries().size()-1);
+ trailer.setInt(COSName.getPDFName("Size"), (int)lastEntry.getKey().getNumber()+1);
+ trailer.removeItem( COSName.PREV );
+ /**
+ COSObject catalog = doc.getCatalog();
+ if (catalog != null)
+ {
+ trailer.setItem(COSName.getPDFName("Root"), catalog);
+ }
+ */
+ trailer.accept(this);
+
+ getStandardOutput().write(STARTXREF);
+ getStandardOutput().writeEOL();
+ getStandardOutput().write(String.valueOf(getStartxref()).getBytes());
+ getStandardOutput().writeEOL();
+ getStandardOutput().write(EOF);
+ }
+
+ /**
+ * write the x ref section for the pdf file
+ *
+ * currently, the pdf is reconstructed from the scratch, so we write a single section
+ *
+ * todo support for incremental writing?
+ *
+ * @param doc The document to write the xref from.
+ *
+ * @throws IOException If there is an error writing the data to the stream.
+ */
+ protected void doWriteXRef(COSDocument doc) throws IOException
+ {
+ String offset;
+ String generation;
+
+ // sort xref, needed only if object keys not regenerated
+ Collections.sort(getXRefEntries());
+ COSWriterXRefEntry lastEntry = (COSWriterXRefEntry)getXRefEntries().get( getXRefEntries().size()-1 );
+
+ // remember the position where x ref is written
+ setStartxref(getStandardOutput().getPos());
+ //
+ getStandardOutput().write(XREF);
+ getStandardOutput().writeEOL();
+ // write start object number and object count for this x ref section
+ // we assume starting from scratch
+ getStandardOutput().write(String.valueOf(0).getBytes());
+ getStandardOutput().write(SPACE);
+ getStandardOutput().write(String.valueOf(lastEntry.getKey().getNumber() + 1).getBytes());
+ getStandardOutput().writeEOL();
+ // write initial start object with ref to first deleted object and magic generation number
+ offset = formatXrefOffset.format(0);
+ generation = formatXrefGeneration.format(65535);
+ getStandardOutput().write(offset.getBytes());
+ getStandardOutput().write(SPACE);
+ getStandardOutput().write(generation.getBytes());
+ getStandardOutput().write(SPACE);
+ getStandardOutput().write(XREF_FREE);
+ getStandardOutput().writeCRLF();
+ // write entry for every object
+ long lastObjectNumber = 0;
+ for (Iterator i = getXRefEntries().iterator(); i.hasNext();)
+ {
+ COSWriterXRefEntry entry = (COSWriterXRefEntry) i.next();
+ while( lastObjectNumber<entry.getKey().getNumber()-1 )
+ {
+ offset = formatXrefOffset.format(0);
+ generation = formatXrefGeneration.format(65535);
+ getStandardOutput().write(offset.getBytes());
+ getStandardOutput().write(SPACE);
+ getStandardOutput().write(generation.getBytes());
+ getStandardOutput().write(SPACE);
+ getStandardOutput().write(XREF_FREE);
+ getStandardOutput().writeCRLF();
+ lastObjectNumber++;
+ }
+ lastObjectNumber = entry.getKey().getNumber();
+ offset = formatXrefOffset.format(entry.getOffset());
+ generation = formatXrefGeneration.format(entry.getKey().getGeneration());
+ getStandardOutput().write(offset.getBytes());
+ getStandardOutput().write(SPACE);
+ getStandardOutput().write(generation.getBytes());
+ getStandardOutput().write(SPACE);
+ getStandardOutput().write(entry.isFree() ? XREF_FREE : XREF_USED);
+ getStandardOutput().writeCRLF();
+ }
+ }
+
+ /**
+ * This will get the object key for the object.
+ *
+ * @param obj The object to get the key for.
+ *
+ * @return The object key for the object.
+ */
+ private COSObjectKey getObjectKey( COSBase obj )
+ {
+ COSBase actual = obj;
+ if( actual instanceof COSObject )
+ {
+ actual = ((COSObject)obj).getObject();
+ }
+ COSObjectKey key = null;
+ if( actual != null )
+ {
+ key = (COSObjectKey)objectKeys.get(actual);
+ }
+ if( key == null )
+ {
+ key = (COSObjectKey)objectKeys.get(obj);
+ }
+ if (key == null)
+ {
+ setNumber(getNumber()+1);
+ key = new COSObjectKey(getNumber(),0);
+ objectKeys.put(obj, key);
+ if( actual != null )
+ {
+ objectKeys.put(actual, key);
+ }
+ }
+ return key;
+ }
+
+ /**
+ * visitFromArray method comment.
+ *
+ * @param obj The object that is being visited.
+ *
+ * @throws COSVisitorException If there is an exception while visiting this object.
+ *
+ * @return null
+ */
+ public Object visitFromArray( COSArray obj ) throws COSVisitorException
+ {
+ try
+ {
+ int count = 0;
+ getStandardOutput().write(ARRAY_OPEN);
+ for (Iterator i = obj.iterator(); i.hasNext();)
+ {
+ COSBase current = (COSBase) i.next();
+ if( current instanceof COSDictionary )
+ {
+ addObjectToWrite( current );
+ writeReference( current );
+ }
+ else if( current instanceof COSObject )
+ {
+ COSBase subValue = ((COSObject)current).getObject();
+ if( subValue instanceof COSDictionary || subValue == null )
+ {
+ addObjectToWrite( current );
+ writeReference( current );
+ }
+ else
+ {
+ subValue.accept( this );
+ }
+ }
+ else if( current == null )
+ {
+ COSNull.NULL.accept( this );
+ }
+ else
+ {
+ current.accept(this);
+ }
+ count++;
+ if (i.hasNext())
+ {
+ if (count % 10 == 0)
+ {
+ getStandardOutput().writeEOL();
+ }
+ else
+ {
+ getStandardOutput().write(SPACE);
+ }
+ }
+ }
+ getStandardOutput().write(ARRAY_CLOSE);
+ getStandardOutput().writeEOL();
+ return null;
+ }
+ catch (IOException e)
+ {
+ throw new COSVisitorException(e);
+ }
+ }
+
+ /**
+ * visitFromBoolean method comment.
+ *
+ * @param obj The object that is being visited.
+ *
+ * @throws COSVisitorException If there is an exception while visiting this object.
+ *
+ * @return null
+ */
+ public Object visitFromBoolean(COSBoolean obj) throws COSVisitorException
+ {
+
+ try
+ {
+ obj.writePDF( getStandardOutput() );
+ return null;
+ }
+ catch (IOException e)
+ {
+ throw new COSVisitorException(e);
+ }
+ }
+
+ /**
+ * visitFromDictionary method comment.
+ *
+ * @param obj The object that is being visited.
+ *
+ * @throws COSVisitorException If there is an exception while visiting this object.
+ *
+ * @return null
+ */
+ public Object visitFromDictionary(COSDictionary obj) throws COSVisitorException
+ {
+ try
+ {
+ getStandardOutput().write(DICT_OPEN);
+ getStandardOutput().writeEOL();
+ for (Iterator i = obj.keyList().iterator(); i.hasNext();)
+ {
+ COSName name = (COSName) i.next();
+ COSBase value = obj.getItem(name);
+ if (value != null)
+ {
+ // this is purely defensive, if entry is set to null instead of removed
+ if( value != null )
+ {
+ name.accept(this);
+ getStandardOutput().write(SPACE);
+ }
+
+
+ if( value == null )
+ {
+ log.debug( "Value is null" );
+ //then we won't write anything, there are a couple cases
+ //were the value of an entry in the COSDictionary will
+ //be a dangling reference that points to nothing
+ //so we will just not write out the entry if that is the case
+ }
+ else if( value instanceof COSDictionary )
+ {
+ addObjectToWrite( value );
+ writeReference( value );
+ }
+ else if( value instanceof COSObject )
+ {
+ COSBase subValue = ((COSObject)value).getObject();
+ if( subValue instanceof COSDictionary || subValue == null )
+ {
+ addObjectToWrite( value );
+ writeReference( value );
+ }
+ else
+ {
+ subValue.accept( this );
+ }
+ }
+ else
+ {
+ value.accept(this);
+ }
+ getStandardOutput().writeEOL();
+
+ }
+ }
+ getStandardOutput().write(DICT_CLOSE);
+ getStandardOutput().writeEOL();
+ return null;
+ }
+ catch( IOException e )
+ {
+ throw new COSVisitorException(e);
+ }
+ }
+
+ /**
+ * The visit from document method.
+ *
+ * @param doc The object that is being visited.
+ *
+ * @throws COSVisitorException If there is an exception while visiting this object.
+ *
+ * @return null
+ */
+ public Object visitFromDocument(COSDocument doc) throws COSVisitorException
+ {
+ try
+ {
+ doWriteHeader(doc);
+ doWriteBody(doc);
+ doWriteXRef(doc);
+ doWriteTrailer(doc);
+ return null;
+ }
+ catch (IOException e)
+ {
+ throw new COSVisitorException(e);
+ }
+ }
+
+ /**
+ * visitFromFloat method comment.
+ *
+ * @param obj The object that is being visited.
+ *
+ * @throws COSVisitorException If there is an exception while visiting this object.
+ *
+ * @return null
+ */
+ public Object visitFromFloat(COSFloat obj) throws COSVisitorException
+ {
+
+ try
+ {
+ obj.writePDF( getStandardOutput() );
+ return null;
+ }
+ catch (IOException e)
+ {
+ throw new COSVisitorException(e);
+ }
+ }
+
+ /**
+ * visitFromFloat method comment.
+ *
+ * @param obj The object that is being visited.
+ *
+ * @throws COSVisitorException If there is an exception while visiting this object.
+ *
+ * @return null
+ */
+ public Object visitFromInt(COSInteger obj) throws COSVisitorException
+ {
+ try
+ {
+ obj.writePDF( getStandardOutput() );
+ return null;
+ }
+ catch (IOException e)
+ {
+ throw new COSVisitorException(e);
+ }
+ }
+
+ /**
+ * visitFromName method comment.
+ *
+ * @param obj The object that is being visited.
+ *
+ * @throws COSVisitorException If there is an exception while visiting this object.
+ *
+ * @return null
+ */
+ public Object visitFromName(COSName obj) throws COSVisitorException
+ {
+ try
+ {
+ obj.writePDF( getStandardOutput() );
+ return null;
+ }
+ catch (IOException e)
+ {
+ throw new COSVisitorException(e);
+ }
+ }
+
+ /**
+ * visitFromNull method comment.
+ *
+ * @param obj The object that is being visited.
+ *
+ * @throws COSVisitorException If there is an exception while visiting this object.
+ *
+ * @return null
+ */
+ public Object visitFromNull(COSNull obj) throws COSVisitorException
+ {
+ try
+ {
+ obj.writePDF( getStandardOutput() );
+ return null;
+ }
+ catch (IOException e)
+ {
+ throw new COSVisitorException(e);
+ }
+ }
+
+ /**
+ * visitFromObjRef method comment.
+ *
+ * @param obj The object that is being visited.
+ *
+ * @throws COSVisitorException If there is an exception while visiting this object.
+ */
+ public void writeReference(COSBase obj) throws COSVisitorException
+ {
+ try
+ {
+ COSObjectKey key = getObjectKey(obj);
+ getStandardOutput().write(String.valueOf(key.getNumber()).getBytes());
+ getStandardOutput().write(SPACE);
+ getStandardOutput().write(String.valueOf(key.getGeneration()).getBytes());
+ getStandardOutput().write(SPACE);
+ getStandardOutput().write(REFERENCE);
+ }
+ catch (IOException e)
+ {
+ throw new COSVisitorException(e);
+ }
+ }
+
+ /**
+ * visitFromStream method comment.
+ *
+ * @param obj The object that is being visited.
+ *
+ * @throws COSVisitorException If there is an exception while visiting this object.
+ *
+ * @return null
+ */
+ public Object visitFromStream(COSStream obj) throws COSVisitorException
+ {
+ try
+ {
+ if( document.willEncryptWhenSaving() )
+ {
+ enc.decryptStream( obj, currentObjectKey.getNumber(), currentObjectKey.getGeneration() );
+ }
+
+ InputStream input = obj.getFilteredStream();
+ // set the length of the stream and write stream dictionary
+ COSObject lengthObject = new COSObject( null );
+
+ obj.setItem(COSName.LENGTH, lengthObject);
+ //obj.accept(this);
+ // write the stream content
+ visitFromDictionary( obj );
+ getStandardOutput().write(STREAM);
+ getStandardOutput().writeCRLF();
+ byte[] buffer = new byte[1024];
+ int amountRead = 0;
+ int totalAmountWritten = 0;
+ while( (amountRead = input.read(buffer,0,1024)) != -1 )
+ {
+ getStandardOutput().write( buffer, 0, amountRead );
+ totalAmountWritten += amountRead;
+ }
+ lengthObject.setObject( new COSInteger( totalAmountWritten ) );
+ getStandardOutput().writeCRLF();
+ getStandardOutput().write(ENDSTREAM);
+ getStandardOutput().writeEOL();
+ return null;
+ }
+ catch( Exception e )
+ {
+ throw new COSVisitorException(e);
+ }
+ }
+
+ /**
+ * visitFromString method comment.
+ *
+ * @param obj The object that is being visited.
+ *
+ * @return null
+ *
+ * @throws COSVisitorException If there is an exception while visiting this object.
+ */
+ public Object visitFromString(COSString obj) throws COSVisitorException
+ {
+ try
+ {
+ if( document.willEncryptWhenSaving() )
+ {
+ try
+ {
+ enc.decryptString( obj, currentObjectKey.getNumber(), currentObjectKey.getGeneration() );
+ }
+ catch( Exception e )
+ {
+ throw new COSVisitorException( e );
+ }
+ }
+ obj.writePDF( getStandardOutput() );
+ }
+ catch (IOException e)
+ {
+ throw new COSVisitorException(e);
+ }
+ return null;
+ }
+
+ /**
+ * This will write the pdf document.
+ *
+ * @param doc The document to write.
+ *
+ * @throws COSVisitorException If an error occurs while generating the data.
+ */
+ public void write(COSDocument doc) throws COSVisitorException
+ {
+ PDDocument pdDoc = new PDDocument( doc );
+ write( pdDoc );
+ }
+
+ /**
+ * This will write the pdf document.
+ *
+ * @param doc The document to write.
+ *
+ * @throws COSVisitorException If an error occurs while generating the data.
+ */
+ public void write(PDDocument doc) throws COSVisitorException
+ {
+ document = doc;
+ if( document.willEncryptWhenSaving() )
+ {
+ try
+ {
+ enc = new DocumentEncryption(document);
+ enc.initForEncryption();
+ }
+ catch( CryptographyException e )
+ {
+ throw new COSVisitorException( e );
+ }
+ catch( IOException e )
+ {
+ throw new COSVisitorException( e );
+ }
+ }
+ COSDocument cosDoc = document.getDocument();
+ COSDictionary trailer = cosDoc.getTrailer();
+ COSArray idArray = (COSArray)trailer.getDictionaryObject( "ID" );
+ if( idArray == null )
+ {
+ try
+ {
+
+ //algothim says to use time/path/size/values in doc to generate
+ //the id. We don't have path or size, so do the best we can
+ MessageDigest md = MessageDigest.getInstance( "MD5" );
+ md.update( Long.toString( System.currentTimeMillis()).getBytes() );
+ COSDictionary info = (COSDictionary)trailer.getDictionaryObject( "Info" );
+ if( info != null )
+ {
+ Iterator values = info.getValues().iterator();
+ while( values.hasNext() )
+ {
+ md.update( values.next().toString().getBytes() );
+ }
+ }
+ idArray = new COSArray();
+ COSString id = new COSString( md.digest() );
+ idArray.add( id );
+ idArray.add( id );
+ trailer.setItem( "ID", idArray );
+ }
+ catch( NoSuchAlgorithmException e )
+ {
+ throw new COSVisitorException( e );
+ }
+ }
+
+ /*
+ List objects = doc.getObjects();
+ Iterator iter = objects.iterator();
+ long maxNumber = 0;
+ while( iter.hasNext() )
+ {
+ COSObject object = (COSObject)iter.next();
+ if( object.getObjectNumber() != null &&
+ object.getGenerationNumber() != null )
+ {
+ COSObjectKey key = new COSObjectKey( object.getObjectNumber().longValue(),
+ object.getGenerationNumber().longValue() );
+ objectKeys.put( object.getObject(), key );
+ objectKeys.put( object, key );
+ maxNumber = Math.max( key.getNumber(), maxNumber );
+ setNumber( maxNumber );
+ }
+ }*/
+ cosDoc.accept(this);
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdfwriter/COSWriterXRefEntry.java b/src/main/java/org/pdfbox/pdfwriter/COSWriterXRefEntry.java
new file mode 100644
index 0000000..94ac2c0
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdfwriter/COSWriterXRefEntry.java
@@ -0,0 +1,165 @@
+/**
+ * Copyright (c) 2003, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdfwriter;
+
+import org.pdfbox.persistence.util.COSObjectKey;
+
+import org.pdfbox.cos.COSBase;
+
+/**
+ * this is en entry in the xref section of the physical pdf document
+ * generated by the COSWriter.
+ *
+ * @author Michael Traut
+ * @version $Revision: 1.6 $
+ */
+public class COSWriterXRefEntry implements Comparable
+{
+ private long offset;
+ private COSBase object;
+ private COSObjectKey key;
+ private boolean free = false;
+
+
+
+ /**
+ * @see Comparable#compareTo( Object )
+ */
+ public int compareTo(Object obj)
+ {
+ if (obj instanceof COSWriterXRefEntry)
+ {
+ return (int)(getKey().getNumber() - ((COSWriterXRefEntry)obj).getKey().getNumber());
+ }
+ else
+ {
+ return -1;
+ }
+ }
+ /**
+ * This will get the Object key.
+ *
+ * @return The object key.
+ */
+ public COSObjectKey getKey()
+ {
+ return key;
+ }
+
+
+
+ /**
+ * This will get the offset into the document.
+ *
+ * @return The offset into the document.
+ */
+ public long getOffset()
+ {
+ return offset;
+ }
+
+ /**
+ * Gets the xref 'free' attribute.
+ *
+ * @return The free attribute.
+ */
+ public boolean isFree()
+ {
+ return free;
+ }
+
+ /**
+ * This will set the free attribute.
+ *
+ * @param newFree The newly freed attribute.
+ */
+ public void setFree(boolean newFree)
+ {
+ free = newFree;
+ }
+
+ /**
+ * This will set the object key.
+ *
+ * @param newKey The new object key.
+ */
+ private void setKey(COSObjectKey newKey)
+ {
+ key = newKey;
+ }
+
+
+
+ /**
+ * The offset attribute.
+ *
+ * @param newOffset The new value for the offset.
+ */
+ public void setOffset(long newOffset)
+ {
+ offset = newOffset;
+ }
+
+ /**
+ * COSWriterXRefEntry constructor comment.
+ *
+ * @param start The start attribute.
+ * @param obj The COS object that this entry represents.
+ * @param keyValue The key to the COS object.
+ */
+ public COSWriterXRefEntry(long start, COSBase obj, COSObjectKey keyValue)
+ {
+ super();
+ setOffset(start);
+ setObject(obj);
+ setKey(keyValue);
+ }
+
+ /**
+ * This will get the object.
+ *
+ * @return The object.
+ */
+ public COSBase getObject()
+ {
+ return object;
+ }
+
+ /**
+ * This will set the object for this xref.
+ *
+ * @param newObject The object that is being set.
+ */
+ private void setObject(COSBase newObject)
+ {
+ object = newObject;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdfwriter/ContentStreamWriter.java b/src/main/java/org/pdfbox/pdfwriter/ContentStreamWriter.java
new file mode 100644
index 0000000..97b41b1
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdfwriter/ContentStreamWriter.java
@@ -0,0 +1,200 @@
+/**
+ * Copyright (c) 2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdfwriter;
+
+import java.io.IOException;
+import java.io.OutputStream;
+
+import java.util.Iterator;
+import java.util.List;
+
+import org.pdfbox.cos.COSArray;
+import org.pdfbox.cos.COSBase;
+import org.pdfbox.cos.COSBoolean;
+import org.pdfbox.cos.COSDictionary;
+import org.pdfbox.cos.COSFloat;
+import org.pdfbox.cos.COSInteger;
+import org.pdfbox.cos.COSName;
+import org.pdfbox.cos.COSString;
+
+import org.pdfbox.util.ImageParameters;
+import org.pdfbox.util.PDFOperator;
+
+/**
+ * A class that will take a list of tokens and write out a stream with them.
+ *
+ * @author Ben Litchfield (ben@benlitchfield.com)
+ * @version $Revision: 1.7 $
+ */
+public class ContentStreamWriter
+{
+ private OutputStream output;
+ /**
+ * space character.
+ */
+ public static final byte[] SPACE = new byte[] { 32 };
+
+ /**
+ * standard line separator on this platform.
+ */
+ public static final byte[] EOL = System.getProperty("line.separator").getBytes();
+
+ /**
+ * This will create a new content stream writer.
+ *
+ * @param out The stream to write the data to.
+ */
+ public ContentStreamWriter( OutputStream out )
+ {
+ output = out;
+ }
+
+ /**
+ * This will write out the list of tokens to the stream.
+ *
+ * @param tokens The tokens to write to the stream.
+ * @param start The start index into the list of tokens.
+ * @param end The end index into the list of tokens.
+ * @throws IOException If there is an error writing to the stream.
+ */
+ public void writeTokens( List tokens, int start, int end ) throws IOException
+ {
+ for( int i=start; i<end; i++ )
+ {
+ Object o = tokens.get( i );
+ writeObject( o );
+ //write a space between each object.
+ output.write( 32 );
+ }
+ output.flush();
+ }
+
+ private void writeObject( Object o ) throws IOException
+ {
+ if( o instanceof COSString )
+ {
+ ((COSString)o).writePDF( output );
+ }
+ else if( o instanceof COSFloat )
+ {
+ ((COSFloat)o).writePDF( output );
+ }
+ else if( o instanceof COSInteger )
+ {
+ ((COSInteger)o).writePDF( output );
+ }
+ else if( o instanceof COSBoolean )
+ {
+ ((COSBoolean)o).writePDF( output );
+ }
+ else if( o instanceof COSName )
+ {
+ ((COSName)o).writePDF( output );
+ }
+ else if( o instanceof COSArray )
+ {
+ COSArray array = (COSArray)o;
+ output.write(COSWriter.ARRAY_OPEN);
+ for( int i=0; i<array.size(); i++ )
+ {
+ writeObject( array.get( i ) );
+ output.write( SPACE );
+ }
+
+ output.write( COSWriter.ARRAY_CLOSE );
+ }
+ else if( o instanceof COSDictionary )
+ {
+ COSDictionary obj = (COSDictionary)o;
+ output.write( COSWriter.DICT_OPEN );
+ for (Iterator i = obj.keyList().iterator(); i.hasNext();)
+ {
+ COSName name = (COSName) i.next();
+ COSBase value = obj.getItem(name);
+ if (value != null)
+ {
+ writeObject( name );
+ output.write( SPACE );
+
+ writeObject( value );
+
+ output.write( SPACE );
+
+ }
+ }
+ output.write( COSWriter.DICT_CLOSE );
+ output.write( SPACE );
+ }
+ else if( o instanceof PDFOperator )
+ {
+ PDFOperator op = (PDFOperator)o;
+ if( op.getOperation().equals( "BI" ) )
+ {
+ output.write( "BI".getBytes() );
+ ImageParameters params = op.getImageParameters();
+ COSDictionary dic = params.getDictionary();
+ Iterator iter = dic.keyList().iterator();
+ while( iter.hasNext() )
+ {
+ COSName key = (COSName)iter.next();
+ Object value = dic.getDictionaryObject( key );
+ key.writePDF( output );
+ output.write( SPACE );
+ writeObject( value );
+ output.write( EOL );
+ }
+ output.write( "ID".getBytes() );
+ output.write( EOL );
+ output.write( op.getImageData() );
+ }
+ else
+ {
+ output.write( op.getOperation().getBytes() );
+ output.write( EOL );
+ }
+ }
+ else
+ {
+ throw new IOException( "Error:Unknown type in content stream:" + o );
+ }
+ }
+
+ /**
+ * This will write out the list of tokens to the stream.
+ *
+ * @param tokens The tokens to write to the stream.
+ * @throws IOException If there is an error writing to the stream.
+ */
+ public void writeTokens( List tokens ) throws IOException
+ {
+ writeTokens( tokens, 0, tokens.size() );
+ }
+}
diff --git a/src/main/java/org/pdfbox/pdfwriter/package.html b/src/main/java/org/pdfbox/pdfwriter/package.html
new file mode 100644
index 0000000..f62d897
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdfwriter/package.html
@@ -0,0 +1,9 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head>
+
+</head>
+<body>
+This is the persistence layer used to write the PDFBox documents to a stream.
+</body>
+</html>
diff --git a/src/main/java/org/pdfbox/pdmodel/PDDestinationNameTreeNode.java b/src/main/java/org/pdfbox/pdmodel/PDDestinationNameTreeNode.java
new file mode 100644
index 0000000..6c8956c
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/PDDestinationNameTreeNode.java
@@ -0,0 +1,90 @@
+/**
+ * Copyright (c) 2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel;
+
+import java.io.IOException;
+
+import org.pdfbox.cos.COSBase;
+import org.pdfbox.cos.COSDictionary;
+import org.pdfbox.pdmodel.common.PDNameTreeNode;
+import org.pdfbox.pdmodel.interactive.documentnavigation.destination.PDDestination;
+import org.pdfbox.pdmodel.interactive.documentnavigation.destination.PDPageDestination;
+
+/**
+ * This class holds all of the name trees that are available at the document level.
+ *
+ * @author Ben Litchfield (ben@benlitchfield.com)
+ * @version $Revision: 1.1 $
+ */
+public class PDDestinationNameTreeNode extends PDNameTreeNode
+{
+ /**
+ * Constructor.
+ */
+ public PDDestinationNameTreeNode()
+ {
+ super( PDPageDestination.class );
+ }
+
+ /**
+ * Constructor.
+ *
+ * @param dic The COS dictionary.
+ */
+ public PDDestinationNameTreeNode( COSDictionary dic )
+ {
+ super( dic, PDPageDestination.class );
+ }
+
+ /**
+ * @see PDNameTreeNode#convertCOSToPD( COSBase )
+ */
+ protected Object convertCOSToPD( COSBase base ) throws IOException
+ {
+ COSBase destination = base;
+ if( base instanceof COSDictionary )
+ {
+ //the destination is sometimes stored in the D dictionary
+ //entry instead of being directly an array, so just dereference
+ //it for now
+ destination = ((COSDictionary)base).getDictionaryObject( "D" );
+ }
+ return PDDestination.create( destination );
+ }
+
+ /**
+ * @see PDNameTreeNode#createChildNode( COSDictionary )
+ */
+ protected PDNameTreeNode createChildNode( COSDictionary dic )
+ {
+ return new PDDestinationNameTreeNode(dic);
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/PDDocument.java b/src/main/java/org/pdfbox/pdmodel/PDDocument.java
new file mode 100644
index 0000000..94150fb
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/PDDocument.java
@@ -0,0 +1,725 @@
+/**
+ * Copyright (c) 2003-2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel;
+
+import java.awt.print.PageFormat;
+import java.awt.print.Pageable;
+import java.awt.print.Paper;
+import java.awt.print.Printable;
+import java.awt.print.PrinterException;
+import java.awt.print.PrinterIOException;
+import java.awt.print.PrinterJob;
+import java.io.BufferedInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.InputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.List;
+
+import org.pdfbox.cos.COSArray;
+import org.pdfbox.cos.COSDictionary;
+import org.pdfbox.cos.COSDocument;
+import org.pdfbox.cos.COSInteger;
+import org.pdfbox.cos.COSName;
+import org.pdfbox.cos.COSStream;
+import org.pdfbox.cos.COSString;
+
+import org.pdfbox.encryption.PDFEncryption;
+import org.pdfbox.encryption.DocumentEncryption;
+
+import org.pdfbox.exceptions.COSVisitorException;
+import org.pdfbox.exceptions.CryptographyException;
+import org.pdfbox.exceptions.InvalidPasswordException;
+
+import org.pdfbox.pdfparser.PDFParser;
+
+import org.pdfbox.pdfwriter.COSWriter;
+
+import org.pdfbox.pdmodel.common.PDRectangle;
+import org.pdfbox.pdmodel.common.PDStream;
+
+import org.pdfbox.pdmodel.encryption.PDEncryptionDictionary;
+import org.pdfbox.pdmodel.encryption.PDEncryptionManager;
+import org.pdfbox.pdmodel.encryption.PDStandardEncryption;
+
+/**
+ * This is the in-memory representation of the PDF document. You need to call
+ * close() on this object when you are done using it!!
+ *
+ * @author Ben Litchfield (ben@benlitchfield.com)
+ * @version $Revision: 1.35 $
+ */
+public class PDDocument implements Pageable
+{
+ private COSDocument document;
+ private boolean encryptOnSave = false;
+ private String encryptUserPassword = null;
+ private String encryptOwnerPassword = null;
+
+ //cached values
+ private PDDocumentInformation documentInformation;
+ private PDDocumentCatalog documentCatalog;
+
+ //The encParameters will be cached here. When the document is decrypted then
+ //the COSDocument will not have an "Encrypt" dictionary anymore and this object
+ //must be used.
+ private PDEncryptionDictionary encParameters = null;
+ /**
+ * This will tell if the document was decrypted with the master password.
+ */
+ private boolean decryptedWithOwnerPassword = false;
+
+ /**
+ * Constructor, creates a new PDF Document with no pages. You need to add
+ * at least one page for the document to be valid.
+ *
+ * @throws IOException If there is an error creating this document.
+ */
+ public PDDocument() throws IOException
+ {
+ document = new COSDocument();
+
+ //First we need a trailer
+ COSDictionary trailer = new COSDictionary();
+ document.setTrailer( trailer );
+
+ //Next we need the root dictionary.
+ COSDictionary rootDictionary = new COSDictionary();
+ trailer.setItem( COSName.ROOT, rootDictionary );
+ rootDictionary.setItem( COSName.TYPE, COSName.CATALOG );
+ rootDictionary.setItem( COSName.VERSION, COSName.getPDFName( "1.4" ) );
+
+ //next we need the pages tree structure
+ COSDictionary pages = new COSDictionary();
+ rootDictionary.setItem( COSName.PAGES, pages );
+ pages.setItem( COSName.TYPE, COSName.PAGES );
+ COSArray kidsArray = new COSArray();
+ pages.setItem( COSName.KIDS, kidsArray );
+ pages.setItem( COSName.COUNT, new COSInteger( 0 ) );
+ }
+
+ /**
+ * This will add a page to the document. This is a convenience method, that
+ * will add the page to the root of the hierarchy and set the parent of the
+ * page to the root.
+ *
+ * @param page The page to add to the document.
+ */
+ public void addPage( PDPage page )
+ {
+ PDPageNode rootPages = getDocumentCatalog().getPages();
+ rootPages.getKids().add( page );
+ page.setParent( rootPages );
+ rootPages.updateCount();
+ }
+
+ /**
+ * Remove the page from the document.
+ *
+ * @param page The page to remove from the document.
+ *
+ * @return true if the page was found false otherwise.
+ */
+ public boolean removePage( PDPage page )
+ {
+ PDPageNode parent = page.getParent();
+ boolean retval = parent.getKids().remove( page );
+ if( retval )
+ {
+ //do a recursive updateCount starting at the root
+ //of the document
+ getDocumentCatalog().getPages().updateCount();
+ }
+ return retval;
+ }
+
+ /**
+ * Remove the page from the document.
+ *
+ * @param pageNumber 0 based index to page number.
+ * @return true if the page was found false otherwise.
+ */
+ public boolean removePage( int pageNumber )
+ {
+ boolean removed = false;
+ List allPages = getDocumentCatalog().getAllPages();
+ if( allPages.size() > pageNumber)
+ {
+ PDPage page = (PDPage)allPages.get( pageNumber );
+ removed = removePage( page );
+ }
+ return removed;
+ }
+
+ /**
+ * This will import and copy the contents from another location. Currently
+ * the content stream is stored in a scratch file. The scratch file is
+ * associated with the document. If you are adding a page to this document
+ * from another document and want to copy the contents to this document's
+ * scratch file then use this method otherwise just use the addPage method.
+ *
+ * @param page The page to import.
+ * @return The page that was imported.
+ *
+ * @throws IOException If there is an error copying the page.
+ */
+ public PDPage importPage( PDPage page ) throws IOException
+ {
+ PDPage importedPage = new PDPage( new COSDictionary( page.getCOSDictionary() ) );
+ InputStream is = null;
+ OutputStream os = null;
+ try
+ {
+ PDStream src = page.getContents();
+ PDStream dest = new PDStream( new COSStream( src.getStream(), document.getScratchFile() ) );
+ importedPage.setContents( dest );
+ os = dest.createOutputStream();
+
+ byte[] buf = new byte[10240];
+ int amountRead = 0;
+ is = src.createInputStream();
+ while((amountRead = is.read(buf,0,10240)) > -1)
+ {
+ os.write(buf, 0, amountRead);
+ }
+ addPage( importedPage );
+ }
+ finally
+ {
+ if( is != null )
+ {
+ is.close();
+ }
+ if( os != null )
+ {
+ os.close();
+ }
+ }
+ return importedPage;
+
+ }
+
+ /**
+ * Constructor that uses an existing document. The COSDocument that
+ * is passed in must be valid.
+ *
+ * @param doc The COSDocument that this document wraps.
+ */
+ public PDDocument( COSDocument doc )
+ {
+ document = doc;
+ }
+
+ /**
+ * This will get the low level document.
+ *
+ * @return The document that this layer sits on top of.
+ */
+ public COSDocument getDocument()
+ {
+ return document;
+ }
+
+ /**
+ * This will get the document info dictionary. This is guaranteed to not return null.
+ *
+ * @return The documents /Info dictionary
+ */
+ public PDDocumentInformation getDocumentInformation()
+ {
+ if( documentInformation == null )
+ {
+ COSDictionary trailer = document.getTrailer();
+ COSDictionary infoDic = (COSDictionary)trailer.getDictionaryObject( COSName.INFO );
+ if( infoDic == null )
+ {
+ infoDic = new COSDictionary();
+ trailer.setItem( COSName.INFO, infoDic );
+ }
+ documentInformation = new PDDocumentInformation( infoDic );
+ }
+ return documentInformation;
+ }
+
+ /**
+ * This will set the document information for this document.
+ *
+ * @param info The updated document information.
+ */
+ public void setDocumentInformation( PDDocumentInformation info )
+ {
+ documentInformation = info;
+ document.getTrailer().setItem( COSName.INFO, info.getDictionary() );
+ }
+
+ /**
+ * This will get the document CATALOG. This is guaranteed to not return null.
+ *
+ * @return The documents /Root dictionary
+ */
+ public PDDocumentCatalog getDocumentCatalog()
+ {
+ if( documentCatalog == null )
+ {
+ COSDictionary trailer = document.getTrailer();
+ COSDictionary infoDic = (COSDictionary)trailer.getDictionaryObject( COSName.ROOT );
+ if( infoDic == null )
+ {
+ documentCatalog = new PDDocumentCatalog( this );
+ }
+ else
+ {
+ documentCatalog = new PDDocumentCatalog( this, infoDic );
+ }
+
+ }
+ return documentCatalog;
+ }
+
+ /**
+ * This will tell if this document is encrypted or not.
+ *
+ * @return true If this document is encrypted.
+ */
+ public boolean isEncrypted()
+ {
+ return document.isEncrypted();
+ }
+
+ /**
+ * This will get the encryption dictionary for this document. This will still
+ * return the parameters if the document was decrypted. If the document was
+ * never encrypted then this will return null. As the encryption architecture
+ * in PDF documents is plugable this returns an abstract class, but the only
+ * supported subclass at this time is a PDStandardEncryption object.
+ *
+ * @return The encryption dictionary(most likely a PDStandardEncryption object)
+ *
+ * @throws IOException If there is an error determining which security handler to use.
+ */
+ public PDEncryptionDictionary getEncryptionDictionary() throws IOException
+ {
+ if( encParameters == null )
+ {
+ encParameters = PDEncryptionManager.getEncryptionDictionary( document.getEncryptionDictionary() );
+ }
+ return encParameters;
+ }
+
+ /**
+ * This will set the encryption dictionary for this document.
+ *
+ * @param encDictionary The encryption dictionary(most likely a PDStandardEncryption object)
+ *
+ * @throws IOException If there is an error determining which security handler to use.
+ */
+ public void setEncryptionDictionary( PDEncryptionDictionary encDictionary ) throws IOException
+ {
+ encParameters = encDictionary;
+ }
+
+ /**
+ * This will determine if this is the user password. This only applies when
+ * the document is encrypted and uses standard encryption.
+ *
+ * @param password The plain text user password.
+ *
+ * @return true If the password passed in matches the user password used to encrypt the document.
+ *
+ * @throws IOException If there is an error determining if it is the user password.
+ * @throws CryptographyException If there is an error in the encryption algorithms.
+ */
+ public boolean isUserPassword( String password ) throws IOException, CryptographyException
+ {
+ boolean retval = false;
+ if( password == null )
+ {
+ password = "";
+ }
+ PDFEncryption encryptor = new PDFEncryption();
+ PDEncryptionDictionary encryptionDictionary = getEncryptionDictionary();
+ if( encryptionDictionary == null )
+ {
+ throw new IOException( "Error: Document is not encrypted" );
+ }
+ else
+ {
+ if( encryptionDictionary instanceof PDStandardEncryption )
+ {
+ COSString documentID = (COSString)document.getDocumentID().get(0);
+ PDStandardEncryption standard = (PDStandardEncryption)encryptionDictionary;
+ retval = encryptor.isUserPassword(
+ password.getBytes(),
+ standard.getUserKey(),
+ standard.getOwnerKey(),
+ standard.getPermissions(),
+ documentID.getBytes(),
+ standard.getRevision(),
+ standard.getLength()/8 );
+ }
+ else
+ {
+ throw new IOException( "Error: Encyption dictionary is not 'Standard'" +
+ encryptionDictionary.getClass().getName() );
+ }
+ }
+ return retval;
+ }
+
+ /**
+ * This will determine if this is the owner password. This only applies when
+ * the document is encrypted and uses standard encryption.
+ *
+ * @param password The plain text owner password.
+ *
+ * @return true If the password passed in matches the owner password used to encrypt the document.
+ *
+ * @throws IOException If there is an error determining if it is the user password.
+ * @throws CryptographyException If there is an error in the encryption algorithms.
+ */
+ public boolean isOwnerPassword( String password ) throws IOException, CryptographyException
+ {
+ boolean retval = false;
+ if( password == null )
+ {
+ password = "";
+ }
+ PDFEncryption encryptor = new PDFEncryption();
+ PDEncryptionDictionary encryptionDictionary = getEncryptionDictionary();
+ if( encryptionDictionary == null )
+ {
+ throw new IOException( "Error: Document is not encrypted" );
+ }
+ else
+ {
+ if( encryptionDictionary instanceof PDStandardEncryption )
+ {
+ COSString documentID = (COSString)document.getDocumentID().get( 0 );
+ PDStandardEncryption standard = (PDStandardEncryption)encryptionDictionary;
+ retval = encryptor.isOwnerPassword(
+ password.getBytes(),
+ standard.getUserKey(),
+ standard.getOwnerKey(),
+ standard.getPermissions(),
+ documentID.getBytes(),
+ standard.getRevision(),
+ standard.getLength()/8 );
+ }
+ else
+ {
+ throw new IOException( "Error: Encyption dictionary is not 'Standard'" +
+ encryptionDictionary.getClass().getName() );
+ }
+ }
+ return retval;
+ }
+
+ /**
+ * This will decrypt a document.
+ *
+ * @param password Either the user or owner password.
+ *
+ * @throws CryptographyException If there is an error decrypting the document.
+ * @throws IOException If there is an error getting the stream data.
+ * @throws InvalidPasswordException If the password is not a user or owner password.
+ */
+ public void decrypt( String password ) throws CryptographyException, IOException, InvalidPasswordException
+ {
+ decryptedWithOwnerPassword = isOwnerPassword( password );
+ DocumentEncryption decryptor = new DocumentEncryption( this );
+ decryptor.decryptDocument( password );
+ document.dereferenceObjectStreams();
+ }
+
+ /**
+ * This will tell if the document was decrypted with the master password. This
+ * entry is invalid if the PDF was not decrypted.
+ *
+ * @return true if the pdf was decrypted with the master password.
+ */
+ public boolean wasDecryptedWithOwnerPassword()
+ {
+ return decryptedWithOwnerPassword;
+ }
+
+ /**
+ * This will <b>mark</b> a document to be encrypted. The actual encryption
+ * will occur when the document is saved.
+ *
+ * @param ownerPassword The owner password to encrypt the document.
+ * @param userPassword The user password to encrypt the document.
+ *
+ * @throws CryptographyException If an error occurs during encryption.
+ * @throws IOException If there is an error accessing the data.
+ */
+ public void encrypt( String ownerPassword, String userPassword )
+ throws CryptographyException, IOException
+ {
+ encryptOnSave = true;
+ encryptOwnerPassword = ownerPassword;
+ encryptUserPassword = userPassword;
+ }
+
+
+ /**
+ * The owner password that was passed into the encrypt method. You should
+ * never use this method. This will not longer be valid once encryption
+ * has occured.
+ *
+ * @return The owner password passed to the encrypt method.
+ */
+ public String getOwnerPasswordForEncryption()
+ {
+ return encryptOwnerPassword;
+ }
+
+ /**
+ * The user password that was passed into the encrypt method. You should
+ * never use this method. This will not longer be valid once encryption
+ * has occured.
+ *
+ * @return The user password passed to the encrypt method.
+ */
+ public String getUserPasswordForEncryption()
+ {
+ return encryptUserPassword;
+ }
+
+ /**
+ * Internal method do determine if the document will be encrypted when it is saved.
+ *
+ * @return True if encrypt has been called and the document
+ * has not been saved yet.
+ */
+ public boolean willEncryptWhenSaving()
+ {
+ return encryptOnSave;
+ }
+
+ /**
+ * This shoule only be called by the COSWriter after encryption has completed.
+ *
+ */
+ public void clearWillEncryptWhenSaving()
+ {
+ encryptOnSave = false;
+ }
+
+ /**
+ * This will load a document from a file.
+ *
+ * @param filename The name of the file to load.
+ *
+ * @return The document that was loaded.
+ *
+ * @throws IOException If there is an error reading from the stream.
+ */
+ public static PDDocument load( String filename ) throws IOException
+ {
+ return load( new BufferedInputStream( new FileInputStream( filename ) ) );
+ }
+
+ /**
+ * This will load a document from a file.
+ *
+ * @param file The name of the file to load.
+ *
+ * @return The document that was loaded.
+ *
+ * @throws IOException If there is an error reading from the stream.
+ */
+ public static PDDocument load( File file ) throws IOException
+ {
+ return load( new BufferedInputStream( new FileInputStream( file ) ) );
+ }
+
+ /**
+ * This will load a document from an input stream.
+ *
+ * @param input The stream that contains the document.
+ *
+ * @return The document that was loaded.
+ *
+ * @throws IOException If there is an error reading from the stream.
+ */
+ public static PDDocument load( InputStream input ) throws IOException
+ {
+ PDFParser parser = new PDFParser( input );
+ parser.parse();
+ return parser.getPDDocument();
+ }
+
+ /**
+ * This will save this document to the filesystem.
+ *
+ * @param fileName The file to save as.
+ *
+ * @throws IOException If there is an error saving the document.
+ * @throws COSVisitorException If an error occurs while generating the data.
+ */
+ public void save( String fileName ) throws IOException, COSVisitorException
+ {
+ save( new FileOutputStream( fileName ) );
+ }
+
+ /**
+ * This will save the document to an output stream.
+ *
+ * @param output The stream to write to.
+ *
+ * @throws IOException If there is an error writing the document.
+ * @throws COSVisitorException If an error occurs while generating the data.
+ */
+ public void save( OutputStream output ) throws IOException, COSVisitorException
+ {
+ //update the count in case any pages have been added behind the scenes.
+ getDocumentCatalog().getPages().updateCount();
+ COSWriter writer = null;
+ try
+ {
+ writer = new COSWriter( output );
+ writer.write( this );
+ writer.close();
+ }
+ finally
+ {
+ if( writer != null )
+ {
+ writer.close();
+ }
+ }
+
+ }
+
+ /**
+ * This will return the total page count of the PDF document. Note: This method
+ * is deprecated in favor of the getNumberOfPages method. The getNumberOfPages is
+ * a required interface method of the Pageable interface. This method will
+ * be removed in a future version of PDFBox!!
+ *
+ * @return The total number of pages in the PDF document.
+ * @deprecated Use the getNumberOfPages method instead!
+ */
+ public int getPageCount()
+ {
+ return getNumberOfPages();
+ }
+
+ /**
+ * @see Pageable#getNumberOfPages()
+ */
+ public int getNumberOfPages()
+ {
+ PDDocumentCatalog cat = getDocumentCatalog();
+ return (int)cat.getPages().getCount();
+ }
+
+ /**
+ * @see Pageable#getPageFormat(int)
+ */
+ public PageFormat getPageFormat(int pageIndex)
+ {
+ PDPage page = (PDPage)getDocumentCatalog().getAllPages().get( pageIndex );
+ PDRectangle mediaBox = page.findMediaBox();
+ PageFormat format = new PageFormat();
+ Paper paper = new Paper();
+ //hmm the imageable area might need to be the CropBox instead
+ //of the media box???
+ paper.setImageableArea( 0,0,mediaBox.getWidth(),mediaBox.getHeight());
+ paper.setSize( mediaBox.getWidth(), mediaBox.getHeight() );
+ format.setPaper( paper );
+ return format;
+ }
+
+ /**
+ * @see Pageable#getPrintable(int)
+ */
+ public Printable getPrintable(int pageIndex)
+ {
+ return (Printable)getDocumentCatalog().getAllPages().get( pageIndex );
+ }
+
+ /**
+ * This will send the PDF document to a printer. The printing functionality
+ * depends on the org.pdfbox.pdfviewer.PageDrawer functionality. The PageDrawer
+ * is a work in progress and some PDFs will print correctly and some will
+ * not. This is a convenience method to create the java.awt.print.PrinterJob.
+ * The PDDocument implements the java.awt.print.Pageable interface and
+ * PDPage implementes the java.awt.print.Printable interface, so advanced printing
+ * capabilities can be done by using those interfaces instead of this method.
+ *
+ * @throws PrinterException If there is an error while sending the PDF to
+ * the printer, or you do not have permissions to print this document.
+ */
+ public void print() throws PrinterException
+ {
+ PDEncryptionDictionary encDictionary = null;
+ try
+ {
+ encDictionary = getEncryptionDictionary();
+ }
+ catch( IOException io )
+ {
+ throw new PrinterIOException( io );
+ }
+
+ //only care about standard encryption and if it was decrypted with the
+ //user password
+ if( encDictionary instanceof PDStandardEncryption &&
+ !wasDecryptedWithOwnerPassword() )
+ {
+ PDStandardEncryption stdEncryption = (PDStandardEncryption)encDictionary;
+ if( !stdEncryption.canPrint() )
+ {
+ throw new PrinterException( "You do not have permission to print this document." );
+ }
+ }
+
+ PrinterJob printJob = PrinterJob.getPrinterJob();
+ printJob.setPageable(this);
+ if( printJob.printDialog() )
+ {
+ printJob.print();
+ }
+ }
+
+ /**
+ * This will close the underlying COSDocument object.
+ *
+ * @throws IOException If there is an error releasing resources.
+ */
+ public void close() throws IOException
+ {
+ document.close();
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/PDDocumentCatalog.java b/src/main/java/org/pdfbox/pdmodel/PDDocumentCatalog.java
new file mode 100644
index 0000000..552d404
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/PDDocumentCatalog.java
@@ -0,0 +1,378 @@
+/**
+ * Copyright (c) 2003-2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.pdfbox.cos.COSArray;
+import org.pdfbox.cos.COSBase;
+import org.pdfbox.cos.COSDictionary;
+import org.pdfbox.cos.COSName;
+import org.pdfbox.cos.COSStream;
+import org.pdfbox.cos.COSString;
+
+import org.pdfbox.pdmodel.common.COSArrayList;
+import org.pdfbox.pdmodel.common.COSObjectable;
+import org.pdfbox.pdmodel.common.PDMetadata;
+import org.pdfbox.pdmodel.documentinterchange.logicalstructure.PDMarkInfo;
+import org.pdfbox.pdmodel.interactive.action.type.PDAction;
+import org.pdfbox.pdmodel.interactive.action.PDActionFactory;
+import org.pdfbox.pdmodel.interactive.action.PDDocumentCatalogAdditionalActions;
+import org.pdfbox.pdmodel.interactive.documentnavigation.outline.PDDocumentOutline;
+import org.pdfbox.pdmodel.interactive.form.PDAcroForm;
+
+import org.pdfbox.pdmodel.interactive.pagenavigation.PDThread;
+import org.pdfbox.pdmodel.interactive.viewerpreferences.PDViewerPreferences;
+
+/**
+ * This class represents the acroform of a PDF document.
+ *
+ * @author Ben Litchfield (ben@benlitchfield.com)
+ * @version $Revision: 1.16 $
+ */
+public class PDDocumentCatalog implements COSObjectable
+{
+ private COSDictionary root;
+ private PDDocument document;
+
+ private PDAcroForm acroForm = null;
+
+ /**
+ * Constructor.
+ *
+ * @param doc The document that this catalog is part of.
+ */
+ public PDDocumentCatalog( PDDocument doc )
+ {
+ document = doc;
+ root = new COSDictionary();
+ root.setItem( COSName.TYPE, new COSString( "Catalog" ) );
+ document.getDocument().getTrailer().setItem( COSName.ROOT, root );
+ }
+
+ /**
+ * Constructor.
+ *
+ * @param doc The document that this catalog is part of.
+ * @param rootDictionary The root dictionary that this object wraps.
+ */
+ public PDDocumentCatalog( PDDocument doc, COSDictionary rootDictionary )
+ {
+ document = doc;
+ root = rootDictionary;
+ }
+
+ /**
+ * Convert this standard java object to a COS object.
+ *
+ * @return The cos object that matches this Java object.
+ */
+ public COSBase getCOSObject()
+ {
+ return root;
+ }
+
+ /**
+ * Convert this standard java object to a COS object.
+ *
+ * @return The cos object that matches this Java object.
+ */
+ public COSDictionary getCOSDictionary()
+ {
+ return root;
+ }
+
+ /**
+ * This will get the documents acroform. This will return null if
+ * no acroform is part of the document.
+ *
+ * @return The documents acroform.
+ */
+ public PDAcroForm getAcroForm()
+ {
+ if( acroForm == null )
+ {
+ COSDictionary acroFormDic =
+ (COSDictionary)root.getDictionaryObject( COSName.ACRO_FORM );
+ if( acroFormDic == null )
+ {
+ acroForm = new PDAcroForm( document );
+ root.setItem( COSName.ACRO_FORM, acroForm.getDictionary() );
+ }
+ else
+ {
+ acroForm = new PDAcroForm( document, acroFormDic );
+ }
+ }
+ return acroForm;
+ }
+
+ /**
+ * This will get the root node for the pages.
+ *
+ * @return The parent page node.
+ */
+ public PDPageNode getPages()
+ {
+ return new PDPageNode( (COSDictionary)root.getDictionaryObject( COSName.PAGES ) );
+ }
+
+ /**
+ * The PDF document contains a hierarchical structure of PDPageNode and PDPages, which
+ * is mostly just a way to store this information. This method will return a flat list
+ * of all PDPage objects in this document.
+ *
+ * @return A list of PDPage objects.
+ */
+ public List getAllPages()
+ {
+ List retval = new ArrayList();
+ PDPageNode rootNode = getPages();
+ //old (slower):
+ //getPageObjects( rootNode, retval );
+ rootNode.getAllKids(retval);
+ return retval;
+ }
+
+ /**
+ * Get the viewer preferences associated with this document or null if they
+ * do not exist.
+ *
+ * @return The document's viewer preferences.
+ */
+ public PDViewerPreferences getViewerPreferences()
+ {
+ PDViewerPreferences retval = null;
+ COSDictionary dict = (COSDictionary)root.getDictionaryObject( "ViewerPreferences" );
+ if( dict != null )
+ {
+ retval = new PDViewerPreferences( dict );
+ }
+
+ return retval;
+ }
+
+ /**
+ * Set the viewer preferences.
+ *
+ * @param prefs The new viewer preferences.
+ */
+ public void setViewerPreferences( PDViewerPreferences prefs )
+ {
+ root.setItem( "ViewerPreferences", prefs );
+ }
+
+ /**
+ * Get the outline associated with this document or null if it
+ * does not exist.
+ *
+ * @return The document's outline.
+ */
+ public PDDocumentOutline getDocumentOutline()
+ {
+ PDDocumentOutline retval = null;
+ COSDictionary dict = (COSDictionary)root.getDictionaryObject( "Outlines" );
+ if( dict != null )
+ {
+ retval = new PDDocumentOutline( dict );
+ }
+
+ return retval;
+ }
+
+ /**
+ * Set the document outlines.
+ *
+ * @param outlines The new document outlines.
+ */
+ public void setDocumentOutline( PDDocumentOutline outlines )
+ {
+ root.setItem( "Outlines", outlines );
+ }
+
+ /**
+ * Get the list threads for this pdf document.
+ *
+ * @return A list of PDThread objects.
+ */
+ public List getThreads()
+ {
+ COSArray array = (COSArray)root.getDictionaryObject( "Threads" );
+ if( array == null )
+ {
+ array = new COSArray();
+ root.setItem( "Threads", array );
+ }
+ List pdObjects = new ArrayList();
+ for( int i=0; i<array.size(); i++ )
+ {
+ pdObjects.add( new PDThread( (COSDictionary)array.getObject( i ) ) );
+ }
+ return new COSArrayList( pdObjects, array );
+ }
+
+ /**
+ * Set the list of threads for this pdf document.
+ *
+ * @param threads The list of threads, or null to clear it.
+ */
+ public void setThreads( List threads )
+ {
+ root.setItem( "Threads", COSArrayList.converterToCOSArray( threads ) );
+ }
+
+ /**
+ * Get the metadata that is part of the document catalog. This will
+ * return null if there is no meta data for this object.
+ *
+ * @return The metadata for this object.
+ */
+ public PDMetadata getMetadata()
+ {
+ PDMetadata retval = null;
+ COSStream stream = (COSStream)root.getDictionaryObject( "Metadata" );
+ if( stream != null )
+ {
+ retval = new PDMetadata( stream );
+ }
+ return retval;
+ }
+
+ /**
+ * Set the metadata for this object. This can be null.
+ *
+ * @param meta The meta data for this object.
+ */
+ public void setMetadata( PDMetadata meta )
+ {
+ root.setItem( "Metadata", meta );
+ }
+
+ /**
+ * Set the Document Open Action for this object.
+ *
+ * @param action The action you want to perform.
+ */
+ public void setOpenAction( PDAction action )
+ {
+ root.setItem( COSName.getPDFName("OpenAction"), action );
+ }
+
+ /**
+ * Get the Document Open Action for this object.
+ *
+ * @return The action to perform when the document is opened.
+ */
+ public PDAction getOpenAction()
+ {
+ PDAction action = null;
+ COSDictionary actionDic = (COSDictionary) root.getDictionaryObject("OpenAction");
+
+ action = PDActionFactory.createAction(actionDic);
+
+ return action;
+ }
+ /**
+ * @return The Additional Actions for this Document
+ */
+ public PDDocumentCatalogAdditionalActions getActions()
+ {
+ COSDictionary addAct = (COSDictionary) root.getDictionaryObject("AA");
+ if (addAct == null)
+ {
+ addAct = new COSDictionary();
+ root.setItem("AA", addAct);
+ }
+ return new PDDocumentCatalogAdditionalActions(addAct);
+ }
+
+ /**
+ * Set the additional actions for the document.
+ *
+ * @param actions The actions that are associated with this document.
+ */
+ public void setActions( PDDocumentCatalogAdditionalActions actions )
+ {
+ root.setItem("AA", actions );
+ }
+
+ /**
+ * @return The names dictionary for this document or null if none exist.
+ */
+ public PDDocumentNameDictionary getNames()
+ {
+ PDDocumentNameDictionary nameDic = null;
+ COSDictionary names = (COSDictionary) root.getDictionaryObject("Names");
+ if(names != null)
+ {
+ nameDic = new PDDocumentNameDictionary(this,names);
+ }
+ return nameDic;
+ }
+
+ /**
+ * Set the names dictionary for the document.
+ *
+ * @param names The names dictionary that is associated with this document.
+ */
+ public void setNames( PDDocumentNameDictionary names )
+ {
+ root.setItem("Names", names );
+ }
+
+ /**
+ * Get info about doc's usage of tagged features. This will return
+ * null if there is no information.
+ *
+ * @return The new mark info.
+ */
+ public PDMarkInfo getMarkInfo()
+ {
+ PDMarkInfo retval = null;
+ COSDictionary dic = (COSDictionary)root.getDictionaryObject( "MarkInfo" );
+ if( dic != null )
+ {
+ retval = new PDMarkInfo( dic );
+ }
+ return retval;
+ }
+
+ /**
+ * Set information about the doc's usage of tagged features.
+ *
+ * @param markInfo The new MarkInfo data.
+ */
+ public void setMarkInfo( PDMarkInfo markInfo )
+ {
+ root.setItem( "MarkInfo", markInfo );
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/PDDocumentInformation.java b/src/main/java/org/pdfbox/pdmodel/PDDocumentInformation.java
new file mode 100644
index 0000000..a30e90c
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/PDDocumentInformation.java
@@ -0,0 +1,297 @@
+/**
+ * Copyright (c) 2003-2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel;
+
+import java.io.IOException;
+
+import java.util.Calendar;
+
+import org.pdfbox.cos.COSBase;
+import org.pdfbox.cos.COSDictionary;
+import org.pdfbox.cos.COSName;
+
+import org.pdfbox.pdmodel.common.COSObjectable;
+
+/**
+ * This is the document metadata. Each getXXX method will return the entry if
+ * it exists or null if it does not exist. If you pass in null for the setXXX
+ * method then it will clear the value.
+ *
+ * @author Ben Litchfield (ben@benlitchfield.com)
+ * @version $Revision: 1.10 $
+ */
+public class PDDocumentInformation implements COSObjectable
+{
+ private static final COSName TITLE = COSName.getPDFName( "Title" );
+ private static final COSName AUTHOR = COSName.getPDFName( "Author" );
+ private static final COSName SUBJECT = COSName.getPDFName( "Subject" );
+ private static final COSName KEYWORDS = COSName.getPDFName( "Keywords" );
+ private static final COSName CREATOR = COSName.getPDFName( "Creator" );
+ private static final COSName PRODUCER = COSName.getPDFName( "Producer" );
+ private static final COSName CREATION_DATE = COSName.getPDFName( "CreationDate" );
+ private static final COSName MODIFICATION_DATE = COSName.getPDFName( "ModDate" );
+ private static final COSName TRAPPED = COSName.getPDFName( "Trapped" );
+ private COSDictionary info;
+
+
+ /**
+ * Default Constructor.
+ */
+ public PDDocumentInformation()
+ {
+ info = new COSDictionary();
+ }
+
+ /**
+ * Constructor that is used for a preexisting dictionary.
+ *
+ * @param dic The underlying dictionary.
+ */
+ public PDDocumentInformation( COSDictionary dic )
+ {
+ info = dic;
+ }
+
+ /**
+ * This will get the underlying dictionary that this object wraps.
+ *
+ * @return The underlying info dictionary.
+ */
+ public COSDictionary getDictionary()
+ {
+ return info;
+ }
+
+ /**
+ * Convert this standard java object to a COS object.
+ *
+ * @return The cos object that matches this Java object.
+ */
+ public COSBase getCOSObject()
+ {
+ return info;
+ }
+
+ /**
+ * This will get the title of the document. This will return null if no title exists.
+ *
+ * @return The title of the document.
+ */
+ public String getTitle()
+ {
+ return info.getString( TITLE );
+ }
+
+ /**
+ * This will set the title of the document.
+ *
+ * @param title The new title for the document.
+ */
+ public void setTitle( String title )
+ {
+ info.setString( TITLE, title );
+ }
+
+ /**
+ * This will get the author of the document. This will return null if no author exists.
+ *
+ * @return The author of the document.
+ */
+ public String getAuthor()
+ {
+ return info.getString( AUTHOR );
+ }
+
+ /**
+ * This will set the author of the document.
+ *
+ * @param author The new author for the document.
+ */
+ public void setAuthor( String author )
+ {
+ info.setString( AUTHOR, author );
+ }
+
+ /**
+ * This will get the subject of the document. This will return null if no subject exists.
+ *
+ * @return The subject of the document.
+ */
+ public String getSubject()
+ {
+ return info.getString( SUBJECT );
+ }
+
+ /**
+ * This will set the subject of the document.
+ *
+ * @param subject The new subject for the document.
+ */
+ public void setSubject( String subject )
+ {
+ info.setString( SUBJECT, subject );
+ }
+
+ /**
+ * This will get the keywords of the document. This will return null if no keywords exists.
+ *
+ * @return The keywords of the document.
+ */
+ public String getKeywords()
+ {
+ return info.getString( KEYWORDS );
+ }
+
+ /**
+ * This will set the keywords of the document.
+ *
+ * @param keywords The new keywords for the document.
+ */
+ public void setKeywords( String keywords )
+ {
+ info.setString( KEYWORDS, keywords );
+ }
+
+ /**
+ * This will get the creator of the document. This will return null if no creator exists.
+ *
+ * @return The creator of the document.
+ */
+ public String getCreator()
+ {
+ return info.getString( CREATOR );
+ }
+
+ /**
+ * This will set the creator of the document.
+ *
+ * @param creator The new creator for the document.
+ */
+ public void setCreator( String creator )
+ {
+ info.setString( CREATOR, creator );
+ }
+
+ /**
+ * This will get the producer of the document. This will return null if no producer exists.
+ *
+ * @return The producer of the document.
+ */
+ public String getProducer()
+ {
+ return info.getString( PRODUCER );
+ }
+
+ /**
+ * This will set the producer of the document.
+ *
+ * @param producer The new producer for the document.
+ */
+ public void setProducer( String producer )
+ {
+ info.setString( PRODUCER, producer );
+ }
+
+ /**
+ * This will get the creation date of the document. This will return null if no creation date exists.
+ *
+ * @return The creation date of the document.
+ *
+ * @throws IOException If there is an error creating the date.
+ */
+ public Calendar getCreationDate() throws IOException
+ {
+ return info.getDate( CREATION_DATE );
+ }
+
+ /**
+ * This will set the creation date of the document.
+ *
+ * @param date The new creation date for the document.
+ */
+ public void setCreationDate( Calendar date )
+ {
+ info.setDate( CREATION_DATE, date );
+ }
+
+ /**
+ * This will get the modification date of the document. This will return null if no modification date exists.
+ *
+ * @return The modification date of the document.
+ *
+ * @throws IOException If there is an error creating the date.
+ */
+ public Calendar getModificationDate() throws IOException
+ {
+ return info.getDate( MODIFICATION_DATE );
+ }
+
+ /**
+ * This will set the modification date of the document.
+ *
+ * @param date The new modification date for the document.
+ */
+ public void setModificationDate( Calendar date )
+ {
+ info.setDate( MODIFICATION_DATE, date );
+ }
+
+ /**
+ * This will get the trapped value for the document.
+ * This will return null if one is not found.
+ *
+ * @return The trapped value for the document.
+ */
+ public String getTrapped()
+ {
+ return info.getNameAsString( TRAPPED );
+ }
+
+ /**
+ * This will set the trapped of the document. This will be
+ * 'True', 'False', or 'Unknown'.
+ *
+ * @param value The new trapped value for the document.
+ */
+ public void setTrapped( String value )
+ {
+ if( value != null &&
+ !value.equals( "True" ) &&
+ !value.equals( "False" ) &&
+ !value.equals( "Unknown" ) )
+ {
+ throw new RuntimeException( "Valid values for trapped are " +
+ "'True', 'False', or 'Unknown'" );
+ }
+
+ info.setName( TRAPPED, value );
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/PDDocumentNameDictionary.java b/src/main/java/org/pdfbox/pdmodel/PDDocumentNameDictionary.java
new file mode 100644
index 0000000..f343d7a
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/PDDocumentNameDictionary.java
@@ -0,0 +1,164 @@
+/**
+ * Copyright (c) 2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel;
+
+import org.pdfbox.cos.COSBase;
+import org.pdfbox.cos.COSDictionary;
+import org.pdfbox.pdmodel.common.COSObjectable;
+
+/**
+ * This class holds all of the name trees that are available at the document level.
+ *
+ * @author Ben Litchfield (ben@benlitchfield.com)
+ * @version $Revision: 1.2 $
+ */
+public class PDDocumentNameDictionary implements COSObjectable
+{
+ private COSDictionary nameDictionary;
+ private PDDocumentCatalog catalog;
+
+ /**
+ * Constructor.
+ *
+ * @param cat The document catalog that this dictionary is part of.
+ */
+ public PDDocumentNameDictionary( PDDocumentCatalog cat )
+ {
+ nameDictionary = new COSDictionary();
+ catalog = cat;
+ }
+
+ /**
+ * Constructor.
+ *
+ * @param cat The document that this dictionary is part of.
+ * @param names The names dictionary.
+ */
+ public PDDocumentNameDictionary( PDDocumentCatalog cat, COSDictionary names )
+ {
+ catalog = cat;
+ nameDictionary = names;
+ }
+
+ /**
+ * Convert this standard java object to a COS object.
+ *
+ * @return The cos object that matches this Java object.
+ */
+ public COSBase getCOSObject()
+ {
+ return nameDictionary;
+ }
+
+ /**
+ * Convert this standard java object to a COS object.
+ *
+ * @return The cos dictionary for this object.
+ */
+ public COSDictionary getCOSDictionary()
+ {
+ return nameDictionary;
+ }
+
+ /**
+ * Get the destination named tree node. The value in this name tree will be PDDestination
+ * objects.
+ *
+ * @return The destination name tree node.
+ */
+ public PDDestinationNameTreeNode getDests()
+ {
+ PDDestinationNameTreeNode dests = null;
+
+ COSDictionary dic = (COSDictionary)nameDictionary.getDictionaryObject( "Dests" );
+
+ //The document catalog also contains the Dests entry sometimes
+ //so check there as well.
+ if( dic == null )
+ {
+ dic = (COSDictionary)catalog.getCOSDictionary().getDictionaryObject( "Dests" );
+ }
+
+ if( dic != null )
+ {
+ dests = new PDDestinationNameTreeNode( dic );
+ }
+
+
+ return dests;
+ }
+
+ /**
+ * Set the named destinations that are associated with this document.
+ *
+ * @param dests The destination names.
+ */
+ public void setDests( PDDestinationNameTreeNode dests )
+ {
+ nameDictionary.setItem( "Dests", dests );
+ //The dests can either be in the document catalog or in the
+ //names dictionary, PDFBox will just maintain the one in the
+ //names dictionary for now unless there is a reason to do
+ //something else.
+ //clear the potentially out of date Dests reference.
+ catalog.getCOSDictionary().setItem( "Dests", (COSObjectable)null);
+ }
+
+ /**
+ * Get the embedded files named tree node. The value in this name tree will be PDComplexFileSpecification
+ * objects.
+ *
+ * @return The embedded files name tree node.
+ */
+ public PDEmbeddedFilesNameTreeNode getEmbeddedFiles()
+ {
+ PDEmbeddedFilesNameTreeNode retval = null;
+
+ COSDictionary dic = (COSDictionary)nameDictionary.getDictionaryObject( "EmbeddedFiles" );
+
+ if( dic != null )
+ {
+ retval = new PDEmbeddedFilesNameTreeNode( dic );
+ }
+
+ return retval;
+ }
+
+ /**
+ * Set the named embedded files that are associated with this document.
+ *
+ * @param ef The new embedded files
+ */
+ public void setEmbeddedFiles( PDEmbeddedFilesNameTreeNode ef )
+ {
+ nameDictionary.setItem( "EmbeddedFiles", ef );
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/PDEmbeddedFilesNameTreeNode.java b/src/main/java/org/pdfbox/pdmodel/PDEmbeddedFilesNameTreeNode.java
new file mode 100644
index 0000000..11c1103
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/PDEmbeddedFilesNameTreeNode.java
@@ -0,0 +1,89 @@
+/**
+ * Copyright (c) 2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel;
+
+import java.io.IOException;
+
+import org.pdfbox.cos.COSBase;
+import org.pdfbox.cos.COSDictionary;
+import org.pdfbox.pdmodel.common.PDNameTreeNode;
+import org.pdfbox.pdmodel.common.filespecification.PDComplexFileSpecification;
+
+/**
+ * This class holds all of the name trees that are available at the document level.
+ *
+ * @author Ben Litchfield (ben@benlitchfield.com)
+ * @version $Revision: 1.1 $
+ */
+public class PDEmbeddedFilesNameTreeNode extends PDNameTreeNode
+{
+ /**
+ * Constructor.
+ */
+ public PDEmbeddedFilesNameTreeNode()
+ {
+ super( PDComplexFileSpecification.class );
+ }
+
+ /**
+ * Constructor.
+ *
+ * @param dic The COS dictionary.
+ */
+ public PDEmbeddedFilesNameTreeNode( COSDictionary dic )
+ {
+ super( dic, PDComplexFileSpecification.class );
+ }
+
+ /**
+ * @see PDNameTreeNode#convertCOSToPD( COSBase )
+ */
+ protected Object convertCOSToPD( COSBase base ) throws IOException
+ {
+ COSBase destination = base;
+ if( base instanceof COSDictionary )
+ {
+ //the destination is sometimes stored in the D dictionary
+ //entry instead of being directly an array, so just dereference
+ //it for now
+ destination = ((COSDictionary)base).getDictionaryObject( "D" );
+ }
+ return new PDComplexFileSpecification( (COSDictionary)destination );
+ }
+
+ /**
+ * @see PDNameTreeNode#createChildNode( COSDictionary )
+ */
+ protected PDNameTreeNode createChildNode( COSDictionary dic )
+ {
+ return new PDEmbeddedFilesNameTreeNode(dic);
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/PDPage.java b/src/main/java/org/pdfbox/pdmodel/PDPage.java
new file mode 100644
index 0000000..3739a5a
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/PDPage.java
@@ -0,0 +1,776 @@
+/**
+ * Copyright (c) 2003-2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel;
+
+import org.pdfbox.cos.COSArray;
+import org.pdfbox.cos.COSBase;
+import org.pdfbox.cos.COSDictionary;
+import org.pdfbox.cos.COSInteger;
+import org.pdfbox.cos.COSName;
+import org.pdfbox.cos.COSNumber;
+import org.pdfbox.cos.COSStream;
+
+import org.pdfbox.pdfviewer.PageDrawer;
+import org.pdfbox.pdmodel.common.COSArrayList;
+import org.pdfbox.pdmodel.common.COSObjectable;
+import org.pdfbox.pdmodel.common.PDMetadata;
+import org.pdfbox.pdmodel.common.PDRectangle;
+import org.pdfbox.pdmodel.common.PDStream;
+import org.pdfbox.pdmodel.interactive.action.PDPageAdditionalActions;
+import org.pdfbox.pdmodel.interactive.annotation.PDAnnotation;
+import org.pdfbox.pdmodel.interactive.pagenavigation.PDThreadBead;
+
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.Graphics;
+import java.awt.Graphics2D;
+import java.awt.image.BufferedImage;
+import java.awt.print.PageFormat;
+import java.awt.print.Paper;
+import java.awt.print.Printable;
+import java.awt.print.PrinterException;
+import java.awt.print.PrinterIOException;
+import java.io.IOException;
+
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.GregorianCalendar;
+import java.util.List;
+
+/**
+ * This represents a single page in a PDF document.
+ *
+ * @author Ben Litchfield (ben@benlitchfield.com)
+ * @version $Revision: 1.24 $
+ */
+public class PDPage implements COSObjectable, Printable
+{
+ private COSDictionary page;
+
+ /**
+ * A page size of LETTER or 8.5x11.
+ */
+ public static final PDRectangle PAGE_SIZE_LETTER = new PDRectangle( 612, 792 );
+
+
+ /**
+ * Creates a new instance of PDPage with a size of 8.5x11.
+ */
+ public PDPage()
+ {
+ page = new COSDictionary();
+ page.setItem( COSName.TYPE, COSName.PAGE );
+ setMediaBox( PAGE_SIZE_LETTER );
+ }
+
+ /**
+ * Creates a new instance of PDPage.
+ *
+ * @param pageDic The existing page dictionary.
+ */
+ public PDPage( COSDictionary pageDic )
+ {
+ page = pageDic;
+ }
+
+ /**
+ * Convert this standard java object to a COS object.
+ *
+ * @return The cos object that matches this Java object.
+ */
+ public COSBase getCOSObject()
+ {
+ return page;
+ }
+
+ /**
+ * This will get the underlying dictionary that this class acts on.
+ *
+ * @return The underlying dictionary for this class.
+ */
+ public COSDictionary getCOSDictionary()
+ {
+ return page;
+ }
+
+
+ /**
+ * This is the parent page node. The parent is a required element of the
+ * page. This will be null until this page is added to the document.
+ *
+ * @return The parent to this page.
+ */
+ public PDPageNode getParent()
+ {
+ PDPageNode parent = null;
+ COSDictionary parentDic = (COSDictionary)page.getDictionaryObject( COSName.PARENT );
+ if( parentDic != null )
+ {
+ parent = new PDPageNode( parentDic );
+ }
+ return parent;
+ }
+
+ /**
+ * This will set the parent of this page.
+ *
+ * @param parent The parent to this page node.
+ */
+ public void setParent( PDPageNode parent )
+ {
+ page.setItem( COSName.PARENT, parent.getDictionary() );
+ }
+
+ /**
+ * This will update the last modified time for the page object.
+ */
+ public void updateLastModified()
+ {
+ page.setDate( "LastModified", new GregorianCalendar() );
+ }
+
+ /**
+ * This will get the date that the content stream was last modified. This
+ * may return null.
+ *
+ * @return The date the content stream was last modified.
+ *
+ * @throws IOException If there is an error accessing the date information.
+ */
+ public Calendar getLastModified() throws IOException
+ {
+ return page.getDate( "LastModified" );
+ }
+
+ /**
+ * This will get the resources at this page and not look up the hierarchy.
+ * This attribute is inheritable, and findResources() should probably used.
+ * This will return null if no resources are available at this level.
+ *
+ * @return The resources at this level in the hierarchy.
+ */
+ public PDResources getResources()
+ {
+ PDResources retval = null;
+ COSDictionary resources = (COSDictionary)page.getDictionaryObject( COSName.RESOURCES );
+ if( resources != null )
+ {
+ retval = new PDResources( resources );
+ }
+ return retval;
+ }
+
+ /**
+ * This will find the resources for this page by looking up the hierarchy until
+ * it finds them.
+ *
+ * @return The resources at this level in the hierarchy.
+ */
+ public PDResources findResources()
+ {
+ PDResources retval = getResources();
+ PDPageNode parent = getParent();
+ if( retval == null && parent != null )
+ {
+ retval = parent.findResources();
+ }
+ return retval;
+ }
+
+ /**
+ * This will set the resources for this page.
+ *
+ * @param resources The new resources for this page.
+ */
+ public void setResources( PDResources resources )
+ {
+ page.setItem( COSName.RESOURCES, resources );
+ }
+
+ /**
+ * A rectangle, expressed
+ * in default user space units, defining the boundaries of the physical
+ * medium on which the page is intended to be displayed or printed
+ *
+ * This will get the MediaBox at this page and not look up the hierarchy.
+ * This attribute is inheritable, and findMediaBox() should probably used.
+ * This will return null if no MediaBox are available at this level.
+ *
+ * @return The MediaBox at this level in the hierarchy.
+ */
+ public PDRectangle getMediaBox()
+ {
+ PDRectangle retval = null;
+ COSArray array = (COSArray)page.getDictionaryObject( COSName.MEDIA_BOX );
+ if( array != null )
+ {
+ retval = new PDRectangle( array );
+ }
+ return retval;
+ }
+
+ /**
+ * This will find the MediaBox for this page by looking up the hierarchy until
+ * it finds them.
+ *
+ * @return The MediaBox at this level in the hierarchy.
+ */
+ public PDRectangle findMediaBox()
+ {
+ PDRectangle retval = getMediaBox();
+ PDPageNode parent = getParent();
+ if( retval == null && parent != null )
+ {
+ retval = parent.findMediaBox();
+ }
+ return retval;
+ }
+
+ /**
+ * This will set the mediaBox for this page.
+ *
+ * @param mediaBox The new mediaBox for this page.
+ */
+ public void setMediaBox( PDRectangle mediaBox )
+ {
+ if( mediaBox == null )
+ {
+ page.removeItem( COSName.MEDIA_BOX );
+ }
+ else
+ {
+ page.setItem( COSName.MEDIA_BOX, mediaBox.getCOSArray() );
+ }
+ }
+
+ /**
+ * A rectangle, expressed in default user space units,
+ * defining the visible region of default user space. When the page is displayed
+ * or printed, its contents are to be clipped (cropped) to this rectangle
+ * and then imposed on the output medium in some implementationdefined
+ * manner
+ *
+ * This will get the CropBox at this page and not look up the hierarchy.
+ * This attribute is inheritable, and findCropBox() should probably used.
+ * This will return null if no CropBox is available at this level.
+ *
+ * @return The CropBox at this level in the hierarchy.
+ */
+ public PDRectangle getCropBox()
+ {
+ PDRectangle retval = null;
+ COSArray array = (COSArray)page.getDictionaryObject( COSName.CROP_BOX);
+ if( array != null )
+ {
+ retval = new PDRectangle( array );
+ }
+ return retval;
+ }
+
+ /**
+ * This will find the CropBox for this page by looking up the hierarchy until
+ * it finds them.
+ *
+ * @return The CropBox at this level in the hierarchy.
+ */
+ public PDRectangle findCropBox()
+ {
+ PDRectangle retval = getCropBox();
+ PDPageNode parent = getParent();
+ if( retval == null && parent != null )
+ {
+ retval = findParentCropBox( parent );
+ }
+
+ //default value for cropbox is the media box
+ if( retval == null )
+ {
+ retval = findMediaBox();
+ }
+ return retval;
+ }
+
+ /**
+ * This will search for a crop box in the parent and return null if it is not
+ * found. It will NOT default to the media box if it cannot be found.
+ *
+ * @param node The node
+ */
+ private PDRectangle findParentCropBox( PDPageNode node )
+ {
+ PDRectangle rect = node.getCropBox();
+ PDPageNode parent = node.getParent();
+ if( rect == null && parent != null )
+ {
+ rect = findParentCropBox( parent );
+ }
+ return rect;
+ }
+
+ /**
+ * This will set the CropBox for this page.
+ *
+ * @param cropBox The new CropBox for this page.
+ */
+ public void setCropBox( PDRectangle cropBox )
+ {
+ if( cropBox == null )
+ {
+ page.removeItem( COSName.CROP_BOX );
+ }
+ else
+ {
+ page.setItem( COSName.CROP_BOX, cropBox.getCOSArray() );
+ }
+ }
+
+ /**
+ * A rectangle, expressed in default user space units, defining
+ * the region to which the contents of the page should be clipped
+ * when output in a production environment. The default is the CropBox.
+ *
+ * @return The BleedBox attribute.
+ */
+ public PDRectangle getBleedBox()
+ {
+ PDRectangle retval = null;
+ COSArray array = (COSArray)page.getDictionaryObject( COSName.BLEED_BOX );
+ if( array != null )
+ {
+ retval = new PDRectangle( array );
+ }
+ else
+ {
+ retval = findCropBox();
+ }
+ return retval;
+ }
+
+ /**
+ * This will set the BleedBox for this page.
+ *
+ * @param bleedBox The new BleedBox for this page.
+ */
+ public void setBleedBox( PDRectangle bleedBox )
+ {
+ if( bleedBox == null )
+ {
+ page.removeItem( COSName.BLEED_BOX );
+ }
+ else
+ {
+ page.setItem( COSName.BLEED_BOX, bleedBox.getCOSArray() );
+ }
+ }
+
+ /**
+ * A rectangle, expressed in default user space units, defining
+ * the intended dimensions of the finished page after trimming.
+ * The default is the CropBox.
+ *
+ * @return The TrimBox attribute.
+ */
+ public PDRectangle getTrimBox()
+ {
+ PDRectangle retval = null;
+ COSArray array = (COSArray)page.getDictionaryObject( COSName.TRIM_BOX );
+ if( array != null )
+ {
+ retval = new PDRectangle( array );
+ }
+ else
+ {
+ retval = findCropBox();
+ }
+ return retval;
+ }
+
+ /**
+ * This will set the TrimBox for this page.
+ *
+ * @param trimBox The new TrimBox for this page.
+ */
+ public void setTrimBox( PDRectangle trimBox )
+ {
+ if( trimBox == null )
+ {
+ page.removeItem( COSName.TRIM_BOX );
+ }
+ else
+ {
+ page.setItem( COSName.TRIM_BOX, trimBox.getCOSArray() );
+ }
+ }
+
+ /**
+ * A rectangle, expressed in default user space units, defining
+ * the extent of the page's meaningful content (including potential
+ * white space) as intended by the page's creator The default isthe CropBox.
+ *
+ * @return The ArtBox attribute.
+ */
+ public PDRectangle getArtBox()
+ {
+ PDRectangle retval = null;
+ COSArray array = (COSArray)page.getDictionaryObject( COSName.ART_BOX );
+ if( array != null )
+ {
+ retval = new PDRectangle( array );
+ }
+ else
+ {
+ retval = findCropBox();
+ }
+ return retval;
+ }
+
+ /**
+ * This will set the ArtBox for this page.
+ *
+ * @param artBox The new ArtBox for this page.
+ */
+ public void setArtBox( PDRectangle artBox )
+ {
+ if( artBox == null )
+ {
+ page.removeItem( COSName.ART_BOX );
+ }
+ else
+ {
+ page.setItem( COSName.ART_BOX, artBox.getCOSArray() );
+ }
+ }
+
+
+ //todo BoxColorInfo
+ //todo Contents
+
+ /**
+ * A value representing the rotation. This will be null if not set at this level
+ * The number of degrees by which the page should
+ * be rotated clockwise when displayed or printed. The value must be a multiple
+ * of 90.
+ *
+ * This will get the rotation at this page and not look up the hierarchy.
+ * This attribute is inheritable, and findRotation() should probably used.
+ * This will return null if no rotation is available at this level.
+ *
+ * @return The rotation at this level in the hierarchy.
+ */
+ public Integer getRotation()
+ {
+ Integer retval = null;
+ COSNumber value = (COSNumber)page.getDictionaryObject( COSName.ROTATE );
+ if( value != null )
+ {
+ retval = new Integer( value.intValue() );
+ }
+ return retval;
+ }
+
+ /**
+ * This will find the rotation for this page by looking up the hierarchy until
+ * it finds them.
+ *
+ * @return The rotation at this level in the hierarchy.
+ */
+ public int findRotation()
+ {
+ int retval = 0;
+ Integer rotation = getRotation();
+ if( rotation != null )
+ {
+ retval = rotation.intValue();
+ }
+ else
+ {
+ PDPageNode parent = getParent();
+ if( parent != null )
+ {
+ retval = parent.findRotation();
+ }
+ }
+
+ return retval;
+ }
+
+ /**
+ * This will set the rotation for this page.
+ *
+ * @param rotation The new rotation for this page.
+ */
+ public void setRotation( int rotation )
+ {
+ page.setItem( COSName.ROTATE, new COSInteger( rotation ) );
+ }
+
+ /**
+ * This will get the contents of the PDF Page, in the case that the contents
+ * of the page is an array then then the entire array of streams will be
+ * be wrapped and appear as a single stream.
+ *
+ * @return The page content stream.
+ *
+ * @throws IOException If there is an error obtaining the stream.
+ */
+ public PDStream getContents() throws IOException
+ {
+ return PDStream.createFromCOS( page.getDictionaryObject( COSName.CONTENTS ) );
+ }
+
+ /**
+ * This will set the contents of this page.
+ *
+ * @param contents The new contents of the page.
+ */
+ public void setContents( PDStream contents )
+ {
+ page.setItem( COSName.CONTENTS, contents );
+ }
+
+ /**
+ * This will get a list of PDThreadBead objects, which are article threads in the
+ * document. This will return an empty list of there are no thread beads.
+ *
+ * @return A list of article threads on this page.
+ */
+ public List getThreadBeads()
+ {
+ COSArray beads = (COSArray)page.getDictionaryObject( COSName.B );
+ if( beads == null )
+ {
+ beads = new COSArray();
+ }
+ List pdObjects = new ArrayList();
+ for( int i=0; i<beads.size(); i++)
+ {
+ COSDictionary beadDic = (COSDictionary)beads.getObject( i );
+ PDThreadBead bead = null;
+ //in some cases the bead is null
+ if( beadDic != null )
+ {
+ bead = new PDThreadBead( beadDic );
+ }
+ pdObjects.add( bead );
+ }
+ return new COSArrayList(pdObjects, beads);
+
+ }
+
+ /**
+ * This will set the list of thread beads.
+ *
+ * @param beads A list of PDThreadBead objects or null.
+ */
+ public void setThreadBeads( List beads )
+ {
+ page.setItem( COSName.B, COSArrayList.converterToCOSArray( beads ) );
+ }
+
+ /**
+ * Get the metadata that is part of the document catalog. This will
+ * return null if there is no meta data for this object.
+ *
+ * @return The metadata for this object.
+ */
+ public PDMetadata getMetadata()
+ {
+ PDMetadata retval = null;
+ COSStream stream = (COSStream)page.getDictionaryObject( COSName.METADATA );
+ if( stream != null )
+ {
+ retval = new PDMetadata( stream );
+ }
+ return retval;
+ }
+
+ /**
+ * Set the metadata for this object. This can be null.
+ *
+ * @param meta The meta data for this object.
+ */
+ public void setMetadata( PDMetadata meta )
+ {
+ page.setItem( COSName.METADATA, meta );
+ }
+
+ /**
+ * Convert this page to an output image.
+ *
+ * @return A graphical representation of this page.
+ *
+ * @throws IOException If there is an error drawing to the image.
+ */
+ public BufferedImage convertToImage() throws IOException
+ {
+ int scaling = 2;
+ int rotation = findRotation();
+ PDRectangle mBox = findMediaBox();
+ int width = (int)(mBox.getWidth());//*2);
+ int height = (int)(mBox.getHeight());//*2);
+ if( rotation == 90 || rotation == 270 )
+ {
+ int tmp = width;
+ width = height;
+ height = tmp;
+ }
+ Dimension pageDimension = new Dimension( width, height );
+
+ //note we are doing twice as many pixels because
+ //the default size is not really good resolution,
+ //so create an image that is twice the size
+ //and let the client scale it down.
+ BufferedImage retval =
+ new BufferedImage( width*scaling, height*scaling, BufferedImage.TYPE_BYTE_INDEXED );
+ Graphics2D graphics = (Graphics2D)retval.getGraphics();
+ graphics.setColor( Color.WHITE );
+ graphics.fillRect(0,0,width*scaling, height*scaling);
+ graphics.scale( scaling, scaling );
+ PageDrawer drawer = new PageDrawer();
+ drawer.drawPage( graphics, this, pageDimension );
+
+
+ return retval;
+ }
+
+ /**
+ * Get the page actions.
+ *
+ * @return The Actions for this Page
+ */
+ public PDPageAdditionalActions getActions()
+ {
+ COSDictionary addAct = (COSDictionary) page.getDictionaryObject(COSName.AA);
+ if (addAct == null)
+ {
+ addAct = new COSDictionary();
+ page.setItem(COSName.AA, addAct);
+ }
+ return new PDPageAdditionalActions(addAct);
+ }
+
+ /**
+ * Set the page actions.
+ *
+ * @param actions The actions for the page.
+ */
+ public void setActions( PDPageAdditionalActions actions )
+ {
+ page.setItem( COSName.AA, actions );
+ }
+
+ /**
+ * This will return a list of the Annotations for this page.
+ *
+ * @return List of the PDAnnotation objects.
+ *
+ * @throws IOException If there is an error while creating the annotations.
+ */
+ public List getAnnotations() throws IOException
+ {
+ COSArrayList retval = null;
+ COSArray annots = (COSArray)page.getDictionaryObject(COSName.ANNOTS);
+ if (annots == null)
+ {
+ annots = new COSArray();
+ page.setItem(COSName.ANNOTS, annots);
+ retval = new COSArrayList(new ArrayList(), annots);
+ }
+ else
+ {
+ List actuals = new ArrayList();
+
+ for (int i=0; i < annots.size(); i++)
+ {
+ COSBase item = annots.getObject(i);
+ actuals.add( PDAnnotation.createAnnotation( item ) );
+ }
+ retval = new COSArrayList(actuals, annots);
+ }
+ return retval;
+ }
+
+ /**
+ * This will set the list of annotations.
+ *
+ * @param annots The new list of annotations.
+ */
+ public void setAnnotations( List annots )
+ {
+ page.setItem( COSName.ANNOTS, COSArrayList.converterToCOSArray( annots ) );
+ }
+
+ /**
+ * @see Printable#print(java.awt.Graphics, java.awt.print.PageFormat, int)
+ */
+ public int print(Graphics graphics, PageFormat pageFormat, int pageIndex)
+ throws PrinterException
+ {
+ int retval = Printable.NO_SUCH_PAGE;
+ if( pageIndex == 0 )
+ {
+ try
+ {
+ retval = Printable.PAGE_EXISTS;
+ PageDrawer drawer = new PageDrawer();
+ PDRectangle pageSize = findMediaBox();
+ Paper paper = new Paper();
+
+ paper.setImageableArea( 0, 0, pageSize.getWidth(), pageSize.getHeight());
+ pageFormat.setPaper( paper );
+ drawer.drawPage( graphics, this, pageSize.createDimension() );
+
+ }
+ catch( IOException io )
+ {
+ throw new PrinterIOException( io );
+ }
+
+ }
+ return retval;
+ }
+
+ /**
+ * @see Object#equals( Object )
+ */
+ public boolean equals( Object other )
+ {
+ return other instanceof PDPage && ((PDPage)other).getCOSObject() == this.getCOSObject();
+ }
+
+ /**
+ * @see Object#hashCode()
+ */
+ public int hashCode()
+ {
+ return this.getCOSDictionary().hashCode();
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/PDPageNode.java b/src/main/java/org/pdfbox/pdmodel/PDPageNode.java
new file mode 100644
index 0000000..9567d39
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/PDPageNode.java
@@ -0,0 +1,459 @@
+/**
+ * Copyright (c) 2003, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel;
+
+import org.pdfbox.cos.COSArray;
+import org.pdfbox.cos.COSBase;
+import org.pdfbox.cos.COSDictionary;
+import org.pdfbox.cos.COSName;
+import org.pdfbox.cos.COSNumber;
+import org.pdfbox.cos.COSInteger;
+
+import org.pdfbox.pdmodel.common.COSArrayList;
+import org.pdfbox.pdmodel.common.COSObjectable;
+import org.pdfbox.pdmodel.common.PDRectangle;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * This represents a page node in a pdf document.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.6 $
+ */
+public class PDPageNode implements COSObjectable
+{
+ private COSDictionary page;
+
+ /**
+ * Creates a new instance of PDPage.
+ */
+ public PDPageNode()
+ {
+ page = new COSDictionary();
+ page.setItem( COSName.TYPE, COSName.PAGES );
+ page.setItem( COSName.KIDS, new COSArray() );
+ page.setItem( COSName.COUNT, new COSInteger( 0 ) );
+ }
+
+ /**
+ * Creates a new instance of PDPage.
+ *
+ * @param pages The dictionary pages.
+ */
+ public PDPageNode( COSDictionary pages )
+ {
+ page = pages;
+ }
+
+ /**
+ * This will update the count attribute of the page node. This only needs to
+ * be called if you add or remove pages. The PDDocument will call this for you
+ * when you use the PDDocumnet persistence methods. So, basically most clients
+ * will never need to call this.
+ *
+ * @return The update count for this node.
+ */
+ public long updateCount()
+ {
+ long totalCount = 0;
+ List kids = getKids();
+ Iterator kidIter = kids.iterator();
+ while( kidIter.hasNext() )
+ {
+ Object next = kidIter.next();
+ if( next instanceof PDPage )
+ {
+ totalCount++;
+ }
+ else
+ {
+ PDPageNode node = (PDPageNode)next;
+ totalCount += node.updateCount();
+ }
+ }
+ page.setItem( COSName.COUNT, new COSInteger( totalCount ) );
+ return totalCount;
+ }
+
+ /**
+ * This will get the count of descendent page objects.
+ *
+ * @return The total number of descendent page objects.
+ */
+ public long getCount()
+ {
+ return ((COSNumber)page.getDictionaryObject( COSName.COUNT )).intValue();
+ }
+
+ /**
+ * This will get the underlying dictionary that this class acts on.
+ *
+ * @return The underlying dictionary for this class.
+ */
+ public COSDictionary getDictionary()
+ {
+ return page;
+ }
+
+ /**
+ * This is the parent page node.
+ *
+ * @return The parent to this page.
+ */
+ public PDPageNode getParent()
+ {
+ PDPageNode parent = null;
+ COSDictionary parentDic = (COSDictionary)page.getDictionaryObject( COSName.PARENT );
+ if( parentDic != null )
+ {
+ parent = new PDPageNode( parentDic );
+ }
+ return parent;
+ }
+
+ /**
+ * This will set the parent of this page.
+ *
+ * @param parent The parent to this page node.
+ */
+ public void setParent( PDPageNode parent )
+ {
+ page.setItem( COSName.PARENT, parent.getDictionary() );
+ }
+
+ /**
+ * @see COSObjectable#getCOSObject()
+ */
+ public COSBase getCOSObject()
+ {
+ return page;
+ }
+
+ /**
+ * This will return all kids of this node, either PDPageNode or PDPage.
+ *
+ * @return All direct descendents of this node.
+ */
+ public List getKids()
+ {
+ List actuals = new ArrayList();
+ COSArray kids = getAllKids(actuals, page, false);
+ return new COSArrayList( actuals, kids );
+ }
+
+ /**
+ * This will return all kids of this node as PDPage.
+ *
+ * @param result All direct and indirect descendents of this node are added to this list.
+ */
+ public void getAllKids(List result)
+ {
+ getAllKids(result, page, true);
+ }
+
+ /**
+ * This will return all kids of the given page node as PDPage.
+ *
+ * @param result All direct and optionally indirect descendents of this node are added to this list.
+ * @param page Page dictionary of a page node.
+ * @param recurse if true indirect descendents are processed recursively
+ */
+ private static COSArray getAllKids(List result, COSDictionary page, boolean recurse)
+ {
+ COSArray kids = (COSArray)page.getDictionaryObject( COSName.KIDS );
+
+ for( int i=0; i<kids.size(); i++ )
+ {
+ COSBase obj = kids.getObject( i );
+ if (obj instanceof COSDictionary)
+ {
+ COSDictionary kid = (COSDictionary)obj;
+ if( COSName.PAGE.equals( kid.getDictionaryObject( COSName.TYPE ) ) )
+ {
+ result.add( new PDPage( kid ) );
+ }
+ else
+ {
+ if (recurse)
+ {
+ getAllKids(result, kid, recurse);
+ }
+ else
+ {
+ result.add( new PDPageNode( kid ) );
+ }
+ }
+ }
+ }
+ return kids;
+ }
+
+ /**
+ * This will get the resources at this page node and not look up the hierarchy.
+ * This attribute is inheritable, and findResources() should probably used.
+ * This will return null if no resources are available at this level.
+ *
+ * @return The resources at this level in the hierarchy.
+ */
+ public PDResources getResources()
+ {
+ PDResources retval = null;
+ COSDictionary resources = (COSDictionary)page.getDictionaryObject( COSName.RESOURCES );
+ if( resources != null )
+ {
+ retval = new PDResources( resources );
+ }
+ return retval;
+ }
+
+ /**
+ * This will find the resources for this page by looking up the hierarchy until
+ * it finds them.
+ *
+ * @return The resources at this level in the hierarchy.
+ */
+ public PDResources findResources()
+ {
+ PDResources retval = getResources();
+ PDPageNode parent = getParent();
+ if( retval == null && parent != null )
+ {
+ retval = parent.findResources();
+ }
+ return retval;
+ }
+
+ /**
+ * This will set the resources for this page.
+ *
+ * @param resources The new resources for this page.
+ */
+ public void setResources( PDResources resources )
+ {
+ if( resources == null )
+ {
+ page.removeItem( COSName.RESOURCES );
+ }
+ else
+ {
+ page.setItem( COSName.RESOURCES, resources.getCOSDictionary() );
+ }
+ }
+
+ /**
+ * This will get the MediaBox at this page and not look up the hierarchy.
+ * This attribute is inheritable, and findMediaBox() should probably used.
+ * This will return null if no MediaBox are available at this level.
+ *
+ * @return The MediaBox at this level in the hierarchy.
+ */
+ public PDRectangle getMediaBox()
+ {
+ PDRectangle retval = null;
+ COSArray array = (COSArray)page.getDictionaryObject( COSName.MEDIA_BOX );
+ if( array != null )
+ {
+ retval = new PDRectangle( array );
+ }
+ return retval;
+ }
+
+ /**
+ * This will find the MediaBox for this page by looking up the hierarchy until
+ * it finds them.
+ *
+ * @return The MediaBox at this level in the hierarchy.
+ */
+ public PDRectangle findMediaBox()
+ {
+ PDRectangle retval = getMediaBox();
+ PDPageNode parent = getParent();
+ if( retval == null && parent != null )
+ {
+ retval = parent.findMediaBox();
+ }
+ return retval;
+ }
+
+ /**
+ * This will set the mediaBox for this page.
+ *
+ * @param mediaBox The new mediaBox for this page.
+ */
+ public void setMediaBox( PDRectangle mediaBox )
+ {
+ if( mediaBox == null )
+ {
+ page.removeItem( COSName.MEDIA_BOX );
+ }
+ else
+ {
+ page.setItem( COSName.MEDIA_BOX , mediaBox.getCOSArray() );
+ }
+ }
+
+/**
+ * This will get the CropBox at this page and not look up the hierarchy.
+ * This attribute is inheritable, and findCropBox() should probably used.
+ * This will return null if no CropBox is available at this level.
+ *
+ * @return The CropBox at this level in the hierarchy.
+ */
+ public PDRectangle getCropBox()
+ {
+ PDRectangle retval = null;
+ COSArray array = (COSArray)page.getDictionaryObject( COSName.CROP_BOX );
+ if( array != null )
+ {
+ retval = new PDRectangle( array );
+ }
+ return retval;
+ }
+
+ /**
+ * This will find the CropBox for this page by looking up the hierarchy until
+ * it finds them.
+ *
+ * @return The CropBox at this level in the hierarchy.
+ */
+ public PDRectangle findCropBox()
+ {
+ PDRectangle retval = getCropBox();
+ PDPageNode parent = getParent();
+ if( retval == null && parent != null )
+ {
+ retval = findParentCropBox( parent );
+ }
+
+ //default value for cropbox is the media box
+ if( retval == null )
+ {
+ retval = findMediaBox();
+ }
+ return retval;
+ }
+
+ /**
+ * This will search for a crop box in the parent and return null if it is not
+ * found. It will NOT default to the media box if it cannot be found.
+ *
+ * @param node The node
+ */
+ private PDRectangle findParentCropBox( PDPageNode node )
+ {
+ PDRectangle rect = node.getCropBox();
+ PDPageNode parent = node.getParent();
+ if( rect == null && parent != null )
+ {
+ rect = findParentCropBox( node );
+ }
+ return rect;
+ }
+
+ /**
+ * This will set the CropBox for this page.
+ *
+ * @param cropBox The new CropBox for this page.
+ */
+ public void setCropBox( PDRectangle cropBox )
+ {
+ if( cropBox == null )
+ {
+ page.removeItem( COSName.CROP_BOX );
+ }
+ else
+ {
+ page.setItem( COSName.CROP_BOX, cropBox.getCOSArray() );
+ }
+ }
+
+ /**
+ * A value representing the rotation. This will be null if not set at this level
+ * The number of degrees by which the page should
+ * be rotated clockwise when displayed or printed. The value must be a multiple
+ * of 90.
+ *
+ * This will get the rotation at this page and not look up the hierarchy.
+ * This attribute is inheritable, and findRotation() should probably used.
+ * This will return null if no rotation is available at this level.
+ *
+ * @return The rotation at this level in the hierarchy.
+ */
+ public Integer getRotation()
+ {
+ Integer retval = null;
+ COSNumber value = (COSNumber)page.getDictionaryObject( COSName.ROTATE );
+ if( value != null )
+ {
+ retval = new Integer( (int)value.intValue() );
+ }
+ return retval;
+ }
+
+ /**
+ * This will find the rotation for this page by looking up the hierarchy until
+ * it finds them.
+ *
+ * @return The rotation at this level in the hierarchy.
+ */
+ public int findRotation()
+ {
+ int retval = 0;
+ Integer rotation = getRotation();
+ if( rotation != null )
+ {
+ retval = rotation.intValue();
+ }
+ else
+ {
+ PDPageNode parent = getParent();
+ if( parent != null )
+ {
+ retval = parent.findRotation();
+ }
+ }
+
+ return retval;
+ }
+
+ /**
+ * This will set the rotation for this page.
+ *
+ * @param rotation The new rotation for this page.
+ */
+ public void setRotation( int rotation )
+ {
+ page.setItem( COSName.ROTATE, new COSInteger( rotation ) );
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/PDResources.java b/src/main/java/org/pdfbox/pdmodel/PDResources.java
new file mode 100644
index 0000000..9494b69
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/PDResources.java
@@ -0,0 +1,313 @@
+/**
+ * Copyright (c) 2003-2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel;
+
+import java.io.IOException;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+import org.pdfbox.cos.COSBase;
+import org.pdfbox.cos.COSDictionary;
+import org.pdfbox.cos.COSName;
+import org.pdfbox.cos.COSStream;
+
+import org.pdfbox.pdmodel.common.COSDictionaryMap;
+import org.pdfbox.pdmodel.common.COSObjectable;
+
+import org.pdfbox.pdmodel.font.PDFontFactory;
+
+import org.pdfbox.pdmodel.graphics.PDExtendedGraphicsState;
+
+import org.pdfbox.pdmodel.graphics.color.PDColorSpaceFactory;
+
+import org.pdfbox.pdmodel.graphics.xobject.PDXObject;
+import org.pdfbox.pdmodel.graphics.xobject.PDXObjectImage;
+
+/**
+ * This represents a set of resources available at the page/pages/stream level.
+ *
+ * @author Ben Litchfield (ben@benlitchfield.com)
+ * @version $Revision: 1.13 $
+ */
+public class PDResources implements COSObjectable
+{
+ private COSDictionary resources;
+
+ /**
+ * Default constructor.
+ */
+ public PDResources()
+ {
+ resources = new COSDictionary();
+ }
+
+ /**
+ * Prepopulated resources.
+ *
+ * @param resourceDictionary The cos dictionary for this resource.
+ */
+ public PDResources( COSDictionary resourceDictionary )
+ {
+ resources = resourceDictionary;
+ }
+
+ /**
+ * This will get the underlying dictionary.
+ *
+ * @return The dictionary for these resources.
+ */
+ public COSDictionary getCOSDictionary()
+ {
+ return resources;
+ }
+
+ /**
+ * Convert this standard java object to a COS object.
+ *
+ * @return The cos object that matches this Java object.
+ */
+ public COSBase getCOSObject()
+ {
+ return resources;
+ }
+
+ /**
+ * This will get the map of fonts. This will never return null. The keys are string
+ * and the values are PDFont objects.
+ *
+ * @return The map of fonts.
+ *
+ * @throws IOException If there is an error getting the fonts.
+ */
+ public Map getFonts() throws IOException
+ {
+ Map retval = null;
+ COSDictionary fonts = (COSDictionary)resources.getDictionaryObject( COSName.FONT );
+
+ if( fonts == null )
+ {
+ fonts = new COSDictionary();
+ resources.setItem( COSName.FONT, fonts );
+ }
+
+ Map actuals = new HashMap();
+ retval = new COSDictionaryMap( actuals, fonts );
+ Iterator fontNames = fonts.keyList().iterator();
+ while( fontNames.hasNext() )
+ {
+ COSName fontName = (COSName)fontNames.next();
+ COSBase font = fonts.getDictionaryObject( fontName );
+ //data-000174.pdf contains a font that is a COSArray, looks to be an error in the
+ //PDF, we will just ignore entries that are not dictionaries.
+ if( font instanceof COSDictionary )
+ {
+ COSDictionary fontDictionary = (COSDictionary)font;
+ actuals.put( fontName.getName(), PDFontFactory.createFont( fontDictionary ) );
+ }
+ }
+ return retval;
+ }
+
+ /**
+ * This will get the map of PDXObjects that are in the resource dictionary.
+ *
+ * @return The map of xobjects.
+ *
+ * @throws IOException If there is an error creating the xobjects.
+ */
+ public Map getXObjects() throws IOException
+ {
+ Map retval = null;
+ COSDictionary xobjects = (COSDictionary)resources.getDictionaryObject( "XObject" );
+
+ if( xobjects == null )
+ {
+ xobjects = new COSDictionary();
+ resources.setItem( "XObject", xobjects );
+ }
+
+ Map actuals = new HashMap();
+ retval = new COSDictionaryMap( actuals, xobjects );
+ Iterator imageNames = xobjects.keyList().iterator();
+ while( imageNames.hasNext() )
+ {
+ COSName objName = (COSName)imageNames.next();
+ COSBase cosObject = xobjects.getDictionaryObject(objName);
+ PDXObject xobject = PDXObject.createXObject( cosObject );
+ if( xobject !=null )
+ {
+ actuals.put( objName.getName(), xobject);
+ }
+ }
+ return retval;
+ }
+
+ /**
+ * This will get the map of images. An empty map will be returned if there
+ * are no underlying images.
+ * So far the keys are COSName of the image
+ * and the value is the corresponding PDXObjectImage.
+ *
+ * @author By BM
+ * @return The map of images.
+ * @throws IOException If there is an error writing the picture.
+ */
+ public Map getImages() throws IOException
+ {
+ Map retval = null;
+ COSDictionary images = (COSDictionary)resources.getDictionaryObject( "XObject" );
+
+ if( images == null )
+ {
+ images = new COSDictionary();
+ resources.setItem( "XObject", images );
+ }
+
+ if( images != null )
+ {
+ Map actuals = new HashMap();
+ retval = new COSDictionaryMap( actuals, images );
+ Iterator imageNames = images.keyList().iterator();
+ while( imageNames.hasNext() )
+ {
+ COSName imageName = (COSName)imageNames.next();
+ COSStream image = (COSStream)(images.getDictionaryObject(imageName));
+
+ COSName subType =(COSName)image.getDictionaryObject(COSName.SUBTYPE);
+ if( subType.equals(COSName.IMAGE) )
+ {
+ PDXObjectImage ximage = (PDXObjectImage)PDXObject.createXObject( image );
+ if( ximage !=null )
+ {
+ actuals.put( imageName.getName(), ximage);
+ }
+ }
+ }
+ }
+ return retval;
+ }
+
+ /**
+ * This will set the map of fonts.
+ *
+ * @param fonts The new map of fonts.
+ */
+ public void setFonts( Map fonts )
+ {
+ resources.setItem( COSName.FONT, COSDictionaryMap.convert( fonts ) );
+ }
+
+ /**
+ * This will get the map of colorspaces. This will return null if the underlying
+ * resources dictionary does not have a colorspace dictionary. The keys are string
+ * and the values are PDColorSpace objects.
+ *
+ * @return The map of colorspaces.
+ *
+ * @throws IOException If there is an error getting the colorspaces.
+ */
+ public Map getColorSpaces() throws IOException
+ {
+ Map retval = null;
+ COSDictionary colorspaces = (COSDictionary)resources.getDictionaryObject( COSName.getPDFName( "ColorSpace" ) );
+
+ if( colorspaces != null )
+ {
+ Map actuals = new HashMap();
+ retval = new COSDictionaryMap( actuals, colorspaces );
+ Iterator csNames = colorspaces.keyList().iterator();
+ while( csNames.hasNext() )
+ {
+ COSName csName = (COSName)csNames.next();
+ COSBase cs = colorspaces.getDictionaryObject( csName );
+ actuals.put( csName.getName(), PDColorSpaceFactory.createColorSpace( cs ) );
+ }
+ }
+ return retval;
+ }
+
+ /**
+ * This will set the map of colorspaces.
+ *
+ * @param colorspaces The new map of colorspaces.
+ */
+ public void setColorSpaces( Map colorspaces )
+ {
+ resources.setItem( COSName.getPDFName( "ColorSpace" ), COSDictionaryMap.convert( colorspaces ) );
+ }
+
+ /**
+ * This will get the map of graphic states. This will return null if the underlying
+ * resources dictionary does not have a graphics dictionary. The keys are the graphic state
+ * name as a String and the values are PDExtendedGraphicsState objects.
+ *
+ * @return The map of extended graphic state objects.
+ */
+ public Map getGraphicsStates()
+ {
+ Map retval = null;
+ COSDictionary states = (COSDictionary)resources.getDictionaryObject( COSName.getPDFName( "ExtGState" ) );
+
+ if( states != null )
+ {
+ Map actuals = new HashMap();
+ retval = new COSDictionaryMap( actuals, states );
+ Iterator names = states.keyList().iterator();
+ while( names.hasNext() )
+ {
+ COSName name = (COSName)names.next();
+ COSDictionary dictionary = (COSDictionary)states.getDictionaryObject( name );
+ actuals.put( name.getName(), new PDExtendedGraphicsState( dictionary ) );
+ }
+ }
+ return retval;
+ }
+
+ /**
+ * This will set the map of graphics states.
+ *
+ * @param states The new map of states.
+ */
+ public void setGraphicsStates( Map states )
+ {
+ Iterator iter = states.keySet().iterator();
+ COSDictionary dic = new COSDictionary();
+ while( iter.hasNext() )
+ {
+ String name = (String)iter.next();
+ PDExtendedGraphicsState state = (PDExtendedGraphicsState)states.get( name );
+ dic.setItem( COSName.getPDFName( name ), state.getCOSObject() );
+ }
+ resources.setItem( COSName.getPDFName( "ExtGState" ), dic );
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/common/COSArrayList.java b/src/main/java/org/pdfbox/pdmodel/common/COSArrayList.java
new file mode 100644
index 0000000..bb3648a
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/common/COSArrayList.java
@@ -0,0 +1,643 @@
+/**
+ * Copyright (c) 2003-2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.common;
+
+import org.pdfbox.cos.COSArray;
+import org.pdfbox.cos.COSBase;
+import org.pdfbox.cos.COSDictionary;
+import org.pdfbox.cos.COSInteger;
+import org.pdfbox.cos.COSFloat;
+import org.pdfbox.cos.COSString;
+import org.pdfbox.cos.COSName;
+import org.pdfbox.cos.COSNull;
+import org.pdfbox.cos.COSNumber;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.List;
+import java.util.ListIterator;
+
+/**
+ * This is an implementation of a List that will sync its contents to a COSArray.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.12 $
+ */
+public class COSArrayList implements List
+{
+ private COSArray array;
+ private List actual;
+
+ private COSDictionary parentDict;
+ private String dictKey;
+
+ /**
+ * Constructor.
+ *
+ * @param actualList The list of standard java objects
+ * @param cosArray The COS array object to sync to.
+ */
+ public COSArrayList( List actualList, COSArray cosArray )
+ {
+ actual = actualList;
+ array = cosArray;
+ }
+
+ /**
+ * This is a really special constructor. Sometimes the PDF spec says
+ * that a dictionary entry can either be a single item or an array of those
+ * items. But in the PDModel interface we really just want to always return
+ * a java.util.List. In the case were we get the list and never modify it
+ * we don't want to convert to COSArray and put one element, unless we append
+ * to the list. So here we are going to create this object with a single
+ * item instead of a list, but allow more items to be added and then converted
+ * to an array.
+ *
+ * @param actualObject The PDModel object.
+ * @param item The COS Model object.
+ * @param dictionary The dictionary that holds the item, and will hold the array if an item is added.
+ * @param dictionaryKey The key into the dictionary to set the item.
+ */
+ public COSArrayList( Object actualObject, COSBase item, COSDictionary dictionary, String dictionaryKey )
+ {
+ array = new COSArray();
+ array.add( item );
+ actual = new ArrayList();
+ actual.add( actualObject );
+
+ parentDict = dictionary;
+ dictKey = dictionaryKey;
+ }
+
+ /**
+ * @see List#size()
+ */
+ public int size()
+ {
+ return actual.size();
+ }
+
+ /**
+ * @see List#isEmpty()
+ */
+ public boolean isEmpty()
+ {
+ return actual.isEmpty();
+ }
+
+ /**
+ * @see List#contains( Object )
+ */
+ public boolean contains(Object o)
+ {
+ return actual.contains(o);
+ }
+
+ /**
+ * @see List#iterator()
+ */
+ public Iterator iterator()
+ {
+ return actual.iterator();
+ }
+
+ /**
+ * @see List#toArray()
+ */
+ public Object[] toArray()
+ {
+ return actual.toArray();
+ }
+
+ /**
+ * @see List#toArray( Object[] )
+ */
+ public Object[] toArray(Object[] a)
+ {
+ return actual.toArray(a);
+
+ }
+
+ /**
+ * @see List#add( Object )
+ */
+ public boolean add(Object o)
+ {
+ //when adding if there is a parentDict then change the item
+ //in the dictionary from a single item to an array.
+ if( parentDict != null )
+ {
+ parentDict.setItem( dictKey, array );
+ //clear the parent dict so it doesn't happen again, there might be
+ //a usecase for keeping the parentDict around but not now.
+ parentDict = null;
+ }
+ //string is a special case because we can't subclass to be COSObjectable
+ if( o instanceof String )
+ {
+ array.add( new COSString( (String)o ) );
+ }
+ else if( o instanceof DualCOSObjectable )
+ {
+ DualCOSObjectable dual = (DualCOSObjectable)o;
+ array.add( dual.getFirstCOSObject() );
+ array.add( dual.getSecondCOSObject() );
+ }
+ else
+ {
+ array.add( ((COSObjectable)o).getCOSObject() );
+ }
+ return actual.add(o);
+ }
+
+ /**
+ * @see List#remove( Object )
+ */
+ public boolean remove(Object o)
+ {
+ boolean retval = true;
+ int index = actual.indexOf( o );
+ if( index >= 0 )
+ {
+ actual.remove( index );
+ array.remove( index );
+ }
+ else
+ {
+ retval = false;
+ }
+ return retval;
+ }
+
+ /**
+ * @see List#containsAll( Collection )
+ */
+ public boolean containsAll(Collection c)
+ {
+ return actual.containsAll( c );
+ }
+
+ /**
+ * @see List#addAll( Collection )
+ */
+ public boolean addAll(Collection c)
+ {
+ //when adding if there is a parentDict then change the item
+ //in the dictionary from a single item to an array.
+ if( parentDict != null && c.size() > 0)
+ {
+ parentDict.setItem( dictKey, array );
+ //clear the parent dict so it doesn't happen again, there might be
+ //a usecase for keeping the parentDict around but not now.
+ parentDict = null;
+ }
+ array.addAll( toCOSObjectList( c ) );
+ return actual.addAll( c );
+ }
+
+ /**
+ * @see List#addAll( int, Collection )
+ */
+ public boolean addAll(int index, Collection c)
+ {
+ //when adding if there is a parentDict then change the item
+ //in the dictionary from a single item to an array.
+ if( parentDict != null && c.size() > 0)
+ {
+ parentDict.setItem( dictKey, array );
+ //clear the parent dict so it doesn't happen again, there might be
+ //a usecase for keeping the parentDict around but not now.
+ parentDict = null;
+ }
+
+ if( c.size() >0 && c.toArray()[0] instanceof DualCOSObjectable )
+ {
+ array.addAll( index*2, toCOSObjectList( c ) );
+ }
+ else
+ {
+ array.addAll( index, toCOSObjectList( c ) );
+ }
+ return actual.addAll( index, c );
+ }
+
+ /**
+ * This will take an array of COSNumbers and return a COSArrayList of
+ * java.lang.Integer values.
+ *
+ * @param intArray The existing integer Array.
+ *
+ * @return A list that is part of the core Java collections.
+ */
+ public static List convertIntegerCOSArrayToList( COSArray intArray )
+ {
+ List numbers = new ArrayList();
+ for( int i=0; i<intArray.size(); i++ )
+ {
+ numbers.add( new Integer( ((COSNumber)intArray.get( i )).intValue() ) );
+ }
+ return new COSArrayList( numbers, intArray );
+ }
+
+ /**
+ * This will take an array of COSNumbers and return a COSArrayList of
+ * java.lang.Float values.
+ *
+ * @param floatArray The existing float Array.
+ *
+ * @return The list of Float objects.
+ */
+ public static List convertFloatCOSArrayToList( COSArray floatArray )
+ {
+ List retval = null;
+ if( floatArray != null )
+ {
+ List numbers = new ArrayList();
+ for( int i=0; i<floatArray.size(); i++ )
+ {
+ numbers.add( new Float( ((COSNumber)floatArray.get( i )).floatValue() ) );
+ }
+ retval = new COSArrayList( numbers, floatArray );
+ }
+ return retval;
+ }
+
+ /**
+ * This will take an array of COSName and return a COSArrayList of
+ * java.lang.String values.
+ *
+ * @param nameArray The existing name Array.
+ *
+ * @return The list of String objects.
+ */
+ public static List convertCOSNameCOSArrayToList( COSArray nameArray )
+ {
+ List retval = null;
+ if( nameArray != null )
+ {
+ List names = new ArrayList();
+ for( int i=0; i<nameArray.size(); i++ )
+ {
+ names.add( ((COSName)nameArray.getObject( i )).getName() );
+ }
+ retval = new COSArrayList( names, nameArray );
+ }
+ return retval;
+ }
+
+ /**
+ * This will take an array of COSString and return a COSArrayList of
+ * java.lang.String values.
+ *
+ * @param stringArray The existing name Array.
+ *
+ * @return The list of String objects.
+ */
+ public static List convertCOSStringCOSArrayToList( COSArray stringArray )
+ {
+ List retval = null;
+ if( stringArray != null )
+ {
+ List string = new ArrayList();
+ for( int i=0; i<stringArray.size(); i++ )
+ {
+ string.add( ((COSString)stringArray.getObject( i )).getString() );
+ }
+ retval = new COSArrayList( string, stringArray );
+ }
+ return retval;
+ }
+
+ /**
+ * This will take an list of string objects and return a COSArray of COSName
+ * objects.
+ *
+ * @param strings A list of strings
+ *
+ * @return An array of COSName objects
+ */
+ public static COSArray convertStringListToCOSNameCOSArray( List strings )
+ {
+ COSArray retval = new COSArray();
+ for( int i=0; i<strings.size(); i++ )
+ {
+ Object next = strings.get( i );
+ if( next instanceof COSName )
+ {
+ retval.add( (COSName)next );
+ }
+ else
+ {
+ retval.add( COSName.getPDFName( (String)next ) );
+ }
+ }
+ return retval;
+ }
+
+ /**
+ * This will take an list of string objects and return a COSArray of COSName
+ * objects.
+ *
+ * @param strings A list of strings
+ *
+ * @return An array of COSName objects
+ */
+ public static COSArray convertStringListToCOSStringCOSArray( List strings )
+ {
+ COSArray retval = new COSArray();
+ for( int i=0; i<strings.size(); i++ )
+ {
+ retval.add( new COSString( (String)strings.get( i ) ) );
+ }
+ return retval;
+ }
+
+ /**
+ * This will convert a list of COSObjectables to an
+ * array list of COSBase objects.
+ *
+ * @param cosObjectableList A list of COSObjectable.
+ *
+ * @return A list of COSBase.
+ */
+ public static COSArray converterToCOSArray( List cosObjectableList )
+ {
+ COSArray array = null;
+ if( cosObjectableList != null )
+ {
+ array = new COSArray();
+ Iterator iter = cosObjectableList.iterator();
+ while( iter.hasNext() )
+ {
+ Object next = iter.next();
+ if( next instanceof String )
+ {
+ array.add( new COSString( (String)next ) );
+ }
+ else if( next instanceof Integer || next instanceof Long )
+ {
+ array.add( new COSInteger( ((Number)next).longValue() ) );
+ }
+ else if( next instanceof Float || next instanceof Double )
+ {
+ array.add( new COSFloat( ((Number)next).floatValue() ) );
+ }
+ else if( next instanceof COSObjectable )
+ {
+ COSObjectable object = (COSObjectable)next;
+ array.add( object.getCOSObject() );
+ }
+ else if( next instanceof DualCOSObjectable )
+ {
+ DualCOSObjectable object = (DualCOSObjectable)next;
+ array.add( object.getFirstCOSObject() );
+ array.add( object.getSecondCOSObject() );
+ }
+ else if( next == null )
+ {
+ array.add( COSNull.NULL );
+ }
+ else
+ {
+ throw new RuntimeException( "Error: Don't know how to convert type to COSBase '" +
+ next.getClass().getName() + "'" );
+ }
+ }
+ }
+ return array;
+ }
+
+ private List toCOSObjectList( Collection list )
+ {
+ List cosObjects = new ArrayList();
+ Iterator iter = list.iterator();
+ while( iter.hasNext() )
+ {
+ Object next = iter.next();
+ if( next instanceof String )
+ {
+ cosObjects.add( new COSString( (String)next ) );
+ }
+ else if( next instanceof DualCOSObjectable )
+ {
+ DualCOSObjectable object = (DualCOSObjectable)next;
+ array.add( object.getFirstCOSObject() );
+ array.add( object.getSecondCOSObject() );
+ }
+ else
+ {
+ COSObjectable cos = (COSObjectable)next;
+ cosObjects.add( cos.getCOSObject() );
+ }
+ }
+ return cosObjects;
+ }
+
+ /**
+ * @see List#removeAll( Collection )
+ */
+ public boolean removeAll(Collection c)
+ {
+ array.removeAll( toCOSObjectList( c ) );
+ return actual.removeAll( c );
+ }
+
+ /**
+ * @see List#retainAll( Collection )
+ */
+ public boolean retainAll(Collection c)
+ {
+ array.retainAll( toCOSObjectList( c ) );
+ return actual.retainAll( c );
+ }
+
+ /**
+ * @see List#clear()
+ */
+ public void clear()
+ {
+ //when adding if there is a parentDict then change the item
+ //in the dictionary from a single item to an array.
+ if( parentDict != null )
+ {
+ parentDict.setItem( dictKey, (COSBase)null );
+ }
+ actual.clear();
+ array.clear();
+ }
+
+ /**
+ * @see List#equals( Object )
+ */
+ public boolean equals(Object o)
+ {
+ return actual.equals( o );
+ }
+
+ /**
+ * @see List#hashCode()
+ */
+ public int hashCode()
+ {
+ return actual.hashCode();
+ }
+
+ /**
+ * @see List#get( int )
+ */
+ public Object get(int index)
+ {
+ return actual.get( index );
+
+ }
+
+ /**
+ * @see List#set( int, Object )
+ */
+ public Object set(int index, Object element)
+ {
+ if( element instanceof String )
+ {
+ COSString item = new COSString( (String)element );
+ if( parentDict != null && index == 0 )
+ {
+ parentDict.setItem( dictKey, item );
+ }
+ array.set( index, item );
+ }
+ else if( element instanceof DualCOSObjectable )
+ {
+ DualCOSObjectable dual = (DualCOSObjectable)element;
+ array.set( index*2, dual.getFirstCOSObject() );
+ array.set( index*2+1, dual.getSecondCOSObject() );
+ }
+ else
+ {
+ if( parentDict != null && index == 0 )
+ {
+ parentDict.setItem( dictKey, ((COSObjectable)element).getCOSObject() );
+ }
+ array.set( index, ((COSObjectable)element).getCOSObject() );
+ }
+ return actual.set( index, element );
+ }
+
+ /**
+ * @see List#add( int, Object )
+ */
+ public void add(int index, Object element)
+ {
+ //when adding if there is a parentDict then change the item
+ //in the dictionary from a single item to an array.
+ if( parentDict != null )
+ {
+ parentDict.setItem( dictKey, array );
+ //clear the parent dict so it doesn't happen again, there might be
+ //a usecase for keeping the parentDict around but not now.
+ parentDict = null;
+ }
+ actual.add( index, element );
+ if( element instanceof String )
+ {
+ array.add( index, new COSString( (String)element ) );
+ }
+ else if( element instanceof DualCOSObjectable )
+ {
+ DualCOSObjectable dual = (DualCOSObjectable)element;
+ array.add( index*2, dual.getFirstCOSObject() );
+ array.add( index*2+1, dual.getSecondCOSObject() );
+ }
+ else
+ {
+ array.add( index, ((COSObjectable)element).getCOSObject() );
+ }
+ }
+
+ /**
+ * @see List#remove( int )
+ */
+ public Object remove(int index)
+ {
+ if( array.size() > index && array.get( index ) instanceof DualCOSObjectable )
+ {
+ //remove both objects
+ array.remove( index );
+ array.remove( index );
+ }
+ else
+ {
+ array.remove( index );
+ }
+ return actual.remove( index );
+ }
+
+ /**
+ * @see List#indexOf( Object )
+ */
+ public int indexOf(Object o)
+ {
+ return actual.indexOf( o );
+ }
+
+ /**
+ * @see List#lastIndexOf( Object )
+ */
+ public int lastIndexOf(Object o)
+ {
+ return actual.indexOf( o );
+
+ }
+
+ /**
+ * @see List#listIterator()
+ */
+ public ListIterator listIterator()
+ {
+ return actual.listIterator();
+ }
+
+ /**
+ * @see List#listIterator( int )
+ */
+ public ListIterator listIterator(int index)
+ {
+ return actual.listIterator( index );
+ }
+
+ /**
+ * @see List#subList( int, int )
+ */
+ public List subList(int fromIndex, int toIndex)
+ {
+ return actual.subList( fromIndex, toIndex );
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/common/COSDictionaryMap.java b/src/main/java/org/pdfbox/pdmodel/common/COSDictionaryMap.java
new file mode 100644
index 0000000..ca3821d
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/common/COSDictionaryMap.java
@@ -0,0 +1,278 @@
+/**
+ * Copyright (c) 2003-2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.common;
+
+import org.pdfbox.cos.COSBase;
+import org.pdfbox.cos.COSBoolean;
+import org.pdfbox.cos.COSDictionary;
+import org.pdfbox.cos.COSFloat;
+import org.pdfbox.cos.COSInteger;
+import org.pdfbox.cos.COSName;
+import org.pdfbox.cos.COSString;
+
+import java.io.IOException;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * This is a Map that will automatically sync the contents to a COSDictionary.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.9 $
+ */
+public class COSDictionaryMap implements Map
+{
+ private COSDictionary map;
+ private Map actuals;
+
+ /**
+ * Constructor for this map.
+ *
+ * @param actualsMap The map with standard java objects as values.
+ * @param dicMap The map with COSBase objects as values.
+ */
+ public COSDictionaryMap( Map actualsMap, COSDictionary dicMap )
+ {
+ actuals = actualsMap;
+ map = dicMap;
+ }
+
+
+ /**
+ * @see java.util.Map#size()
+ */
+ public int size()
+ {
+ return map.size();
+ }
+
+ /**
+ * @see java.util.Map#isEmpty()
+ */
+ public boolean isEmpty()
+ {
+ return size() == 0;
+ }
+
+ /**
+ * @see java.util.Map#containsKey()
+ */
+ public boolean containsKey(Object key)
+ {
+ return map.keyList().contains( key );
+ }
+
+ /**
+ * @see java.util.Map#containsValue()
+ */
+ public boolean containsValue(Object value)
+ {
+ return actuals.containsValue( value );
+ }
+
+ /**
+ * @see java.util.Map#get()
+ */
+ public Object get(Object key)
+ {
+ return actuals.get( key );
+ }
+
+ /**
+ * @see java.util.Map#put()
+ */
+ public Object put(Object key, Object value)
+ {
+ COSObjectable object = (COSObjectable)value;
+
+ map.setItem( COSName.getPDFName( (String)key ), object.getCOSObject() );
+ return actuals.put( key, value );
+ }
+
+ /**
+ * @see java.util.Map#remove()
+ */
+ public Object remove(Object key)
+ {
+ map.removeItem( COSName.getPDFName( (String)key ) );
+ return actuals.remove( key );
+ }
+
+ /**
+ * @see java.util.Map#putAll()
+ */
+ public void putAll(Map t)
+ {
+ throw new RuntimeException( "Not yet implemented" );
+ }
+
+ /**
+ * @see java.util.Map#clear()
+ */
+ public void clear()
+ {
+ map.clear();
+ actuals.clear();
+ }
+
+ /**
+ * @see java.util.Map#keySet()
+ */
+ public Set keySet()
+ {
+ return actuals.keySet();
+ }
+
+ /**
+ * @see java.util.Map#values()
+ */
+ public Collection values()
+ {
+ return actuals.values();
+ }
+
+ /**
+ * @see java.util.Map#entrySet()
+ */
+ public Set entrySet()
+ {
+ throw new RuntimeException( "Not yet implemented" );
+ }
+
+ /**
+ * @see java.util.Map#equals()
+ */
+ public boolean equals(Object o)
+ {
+ boolean retval = false;
+ if( o instanceof COSDictionaryMap )
+ {
+ COSDictionaryMap other = (COSDictionaryMap)o;
+ retval = other.map.equals( this.map );
+ }
+ return retval;
+ }
+
+ /**
+ * This will get a string representation of this map.
+ *
+ * @return A human readable form of this map.
+ */
+ public String toString()
+ {
+ return actuals.toString();
+ }
+
+ /**
+ * @see java.util.Map#hashCode()
+ */
+ public int hashCode()
+ {
+ return map.hashCode();
+ }
+
+ /**
+ * This will take a map&lt;java.lang.String,org.pdfbox.pdmodel.COSObjectable&gt;
+ * and convert it into a COSDictionary&lt;COSName,COSBase&gt;.
+ *
+ * @param someMap A map containing COSObjectables
+ *
+ * @return A proper COSDictionary
+ */
+ public static COSDictionary convert( Map someMap )
+ {
+ Iterator iter = someMap.keySet().iterator();
+ COSDictionary dic = new COSDictionary();
+ while( iter.hasNext() )
+ {
+ String name = (String)iter.next();
+ COSObjectable object = (COSObjectable)someMap.get( name );
+ dic.setItem( COSName.getPDFName( name ), object.getCOSObject() );
+ }
+ return dic;
+ }
+
+ /**
+ * This will take a COS dictionary and convert it into COSDictionaryMap. All cos
+ * objects will be converted to their primitive form.
+ *
+ * @param map The COS mappings.
+ * @return A standard java map.
+ * @throws IOException If there is an error during the conversion.
+ */
+ public static COSDictionaryMap convertBasicTypesToMap( COSDictionary map ) throws IOException
+ {
+ COSDictionaryMap retval = null;
+ if( map != null )
+ {
+ Map actualMap = new HashMap();
+ Iterator keyIter = map.keyList().iterator();
+ while( keyIter.hasNext() )
+ {
+ COSName key = (COSName)keyIter.next();
+ COSBase cosObj = map.getDictionaryObject( key );
+ Object actualObject = null;
+ if( cosObj instanceof COSString )
+ {
+ actualObject = ((COSString)cosObj).getString();
+ }
+ else if( cosObj instanceof COSInteger )
+ {
+ actualObject = new Integer( ((COSInteger)cosObj).intValue() );
+ }
+ else if( cosObj instanceof COSName )
+ {
+ actualObject = ((COSName)cosObj).getName();
+ }
+ else if( cosObj instanceof COSFloat )
+ {
+ actualObject = new Float( ((COSInteger)cosObj).floatValue() );
+ }
+ else if( cosObj instanceof COSBoolean )
+ {
+ actualObject = ((COSBoolean)cosObj).getValue() ? Boolean.TRUE : Boolean.FALSE;
+ }
+ else
+ {
+ throw new IOException( "Error:unknown type of object to convert:" + cosObj );
+ }
+ actualMap.put( key.getName(), actualObject );
+ }
+ retval = new COSDictionaryMap( actualMap, map );
+ }
+
+ return retval;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/common/COSObjectable.java b/src/main/java/org/pdfbox/pdmodel/common/COSObjectable.java
new file mode 100644
index 0000000..5bf7bfc
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/common/COSObjectable.java
@@ -0,0 +1,49 @@
+/**
+ * Copyright (c) 2003, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.common;
+
+import org.pdfbox.cos.COSBase;
+
+/**
+ * This is an interface used to get/create the underlying COSObject.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.2 $
+ */
+public interface COSObjectable
+{
+ /**
+ * Convert this standard java object to a COS object.
+ *
+ * @return The cos object that matches this Java object.
+ */
+ public COSBase getCOSObject();
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/common/COSStreamArray.java b/src/main/java/org/pdfbox/pdmodel/common/COSStreamArray.java
new file mode 100644
index 0000000..87dbb6a
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/common/COSStreamArray.java
@@ -0,0 +1,304 @@
+/**
+ * Copyright (c) 2003-2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.common;
+
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.RandomAccessFile;
+import java.io.SequenceInputStream;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Vector;
+
+import org.pdfbox.cos.COSArray;
+import org.pdfbox.cos.COSBase;
+import org.pdfbox.cos.COSDictionary;
+import org.pdfbox.cos.COSName;
+import org.pdfbox.cos.COSStream;
+import org.pdfbox.cos.ICOSVisitor;
+
+import org.pdfbox.exceptions.COSVisitorException;
+
+import org.pdfbox.pdfparser.PDFStreamParser;
+
+/**
+ * This will take an array of streams and sequence them together.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.7 $
+ */
+public class COSStreamArray extends COSStream
+{
+ private COSArray streams;
+
+ /**
+ * The first stream will be used to delegate some of the methods for this
+ * class.
+ */
+ private COSStream firstStream;
+
+ /**
+ * Constructor.
+ *
+ * @param array The array of COSStreams to concatenate together.
+ */
+ public COSStreamArray( COSArray array )
+ {
+ super( new COSDictionary(), null );
+ streams = array;
+ if( array.size() > 0 )
+ {
+ firstStream = (COSStream)array.getObject( 0 );
+ }
+ }
+ /**
+ * This will get the scratch file associated with this stream.
+ *
+ * @return The scratch file where this stream is being stored.
+ */
+ public RandomAccessFile getScratchFile()
+ {
+ return firstStream.getScratchFile();
+ }
+
+ /**
+ * This will get an object from this streams dictionary.
+ *
+ * @param key The key to the object.
+ *
+ * @return The dictionary object with the key or null if one does not exist.
+ */
+ public COSBase getItem( COSName key )
+ {
+ return firstStream.getItem( key );
+ }
+
+ /**
+ * This will get an object from this streams dictionary and dereference it
+ * if necessary.
+ *
+ * @param key The key to the object.
+ *
+ * @return The dictionary object with the key or null if one does not exist.
+ */
+ public COSBase getDictionaryObject( COSName key )
+ {
+ return firstStream.getDictionaryObject( key );
+ }
+
+ /**
+ * @see Object#toString()
+ */
+ public String toString()
+ {
+ String result = "COSStream{}";
+ return result;
+ }
+
+ /**
+ * This will get all the tokens in the stream.
+ *
+ * @return All of the tokens in the stream.
+ *
+ * @throws IOException If there is an error parsing the stream.
+ */
+ public List getStreamTokens() throws IOException
+ {
+ List retval = null;
+ if( streams.size() > 0 )
+ {
+ PDFStreamParser parser = new PDFStreamParser( this );
+ parser.parse();
+ retval = parser.getTokens();
+ }
+ else
+ {
+ retval = new ArrayList();
+ }
+ return retval;
+ }
+
+ /**
+ * This will get the dictionary that is associated with this stream.
+ *
+ * @return the object that is associated with this stream.
+ */
+ public COSDictionary getDictionary()
+ {
+ return firstStream;
+ }
+
+ /**
+ * This will get the stream with all of the filters applied.
+ *
+ * @return the bytes of the physical (endoced) stream
+ *
+ * @throws IOException when encoding/decoding causes an exception
+ */
+ public InputStream getFilteredStream() throws IOException
+ {
+ throw new IOException( "Error: Not allowed to get filtered stream from array of streams." );
+ /**
+ Vector inputStreams = new Vector();
+ byte[] inbetweenStreamBytes = "\n".getBytes();
+
+ for( int i=0;i<streams.size(); i++ )
+ {
+ COSStream stream = (COSStream)streams.getObject( i );
+ }
+
+ return new SequenceInputStream( inputStreams.elements() );
+ **/
+ }
+
+ /**
+ * This will get the logical content stream with none of the filters.
+ *
+ * @return the bytes of the logical (decoded) stream
+ *
+ * @throws IOException when encoding/decoding causes an exception
+ */
+ public InputStream getUnfilteredStream() throws IOException
+ {
+ Vector inputStreams = new Vector();
+ byte[] inbetweenStreamBytes = "\n".getBytes();
+
+ for( int i=0;i<streams.size(); i++ )
+ {
+ COSStream stream = (COSStream)streams.getObject( i );
+ inputStreams.add( stream.getUnfilteredStream() );
+ //handle the case where there is no whitespace in the
+ //between streams in the contents array, without this
+ //it is possible that two operators will get concatenated
+ //together
+ inputStreams.add( new ByteArrayInputStream( inbetweenStreamBytes ) );
+ }
+
+ return new SequenceInputStream( inputStreams.elements() );
+ }
+
+ /**
+ * visitor pattern double dispatch method.
+ *
+ * @param visitor The object to notify when visiting this object.
+ * @return any object, depending on the visitor implementation, or null
+ * @throws COSVisitorException If an error occurs while visiting this object.
+ */
+ public Object accept(ICOSVisitor visitor) throws COSVisitorException
+ {
+ return streams.accept( visitor );
+ }
+
+
+ /**
+ * This will return the filters to apply to the byte stream
+ * the method will return.
+ * - null if no filters are to be applied
+ * - a COSName if one filter is to be applied
+ * - a COSArray containing COSNames if multiple filters are to be applied
+ *
+ * @return the COSBase object representing the filters
+ */
+ public COSBase getFilters()
+ {
+ return firstStream.getFilters();
+ }
+
+ /**
+ * This will create a new stream for which filtered byte should be
+ * written to. You probably don't want this but want to use the
+ * createUnfilteredStream, which is used to write raw bytes to.
+ *
+ * @return A stream that can be written to.
+ *
+ * @throws IOException If there is an error creating the stream.
+ */
+ public OutputStream createFilteredStream() throws IOException
+ {
+ return firstStream.createFilteredStream();
+ }
+
+ /**
+ * This will create a new stream for which filtered byte should be
+ * written to. You probably don't want this but want to use the
+ * createUnfilteredStream, which is used to write raw bytes to.
+ *
+ * @param expectedLength An entry where a length is expected.
+ *
+ * @return A stream that can be written to.
+ *
+ * @throws IOException If there is an error creating the stream.
+ */
+ public OutputStream createFilteredStream( COSBase expectedLength ) throws IOException
+ {
+ return firstStream.createFilteredStream( expectedLength );
+ }
+
+ /**
+ * set the filters to be applied to the stream.
+ *
+ * @param filters The filters to set on this stream.
+ *
+ * @throws IOException If there is an error clearing the old filters.
+ */
+ public void setFilters(COSBase filters) throws IOException
+ {
+ //should this be allowed? Should this
+ //propagate to all streams in the array?
+ firstStream.setFilters( filters );
+ }
+
+ /**
+ * This will create an output stream that can be written to.
+ *
+ * @return An output stream which raw data bytes should be written to.
+ *
+ * @throws IOException If there is an error creating the stream.
+ */
+ public OutputStream createUnfilteredStream() throws IOException
+ {
+ return firstStream.createUnfilteredStream();
+ }
+
+ /**
+ * Appends a new stream to the array that represents this object's stream.
+ *
+ * @param streamToAppend The stream to append.
+ */
+ public void appendStream(COSStream streamToAppend)
+ {
+ streams.add(streamToAppend);
+ }
+
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/common/DualCOSObjectable.java b/src/main/java/org/pdfbox/pdmodel/common/DualCOSObjectable.java
new file mode 100644
index 0000000..9c70d15
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/common/DualCOSObjectable.java
@@ -0,0 +1,56 @@
+/**
+ * Copyright (c) 2003, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.common;
+
+import org.pdfbox.cos.COSBase;
+
+/**
+ * This is an interface to represent a PDModel object that holds two COS objects.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.1 $
+ */
+public interface DualCOSObjectable
+{
+ /**
+ * Convert this standard java object to a COS object.
+ *
+ * @return The cos object that matches this Java object.
+ */
+ public COSBase getFirstCOSObject();
+
+ /**
+ * Convert this standard java object to a COS object.
+ *
+ * @return The cos object that matches this Java object.
+ */
+ public COSBase getSecondCOSObject();
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/common/PDMatrix.java b/src/main/java/org/pdfbox/pdmodel/common/PDMatrix.java
new file mode 100644
index 0000000..ffee9e8
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/common/PDMatrix.java
@@ -0,0 +1,120 @@
+/**
+ * Copyright (c) 2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.common;
+
+import org.pdfbox.cos.COSArray;
+import org.pdfbox.cos.COSBase;
+import org.pdfbox.cos.COSFloat;
+import org.pdfbox.cos.COSNumber;
+
+/**
+ * This class will be used for matrix manipulation.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.2 $
+ */
+public class PDMatrix implements Cloneable, COSObjectable
+{
+ private COSArray matrix;
+
+ /**
+ * Constructor.
+ */
+ public PDMatrix()
+ {
+ matrix = new COSArray();
+ matrix.add( new COSFloat( 1.0f ) );
+ matrix.add( new COSFloat( 0.0f ) );
+ matrix.add( new COSFloat( 0.0f ) );
+ matrix.add( new COSFloat( 0.0f ) );
+ matrix.add( new COSFloat( 1.0f ) );
+ matrix.add( new COSFloat( 0.0f ) );
+ matrix.add( new COSFloat( 0.0f ) );
+ matrix.add( new COSFloat( 0.0f ) );
+ matrix.add( new COSFloat( 1.0f ) );
+ }
+
+ /**
+ * Constructor.
+ *
+ * @param array The array that describes the matrix.
+ */
+ public PDMatrix( COSArray array )
+ {
+ matrix = array;
+ }
+
+ /**
+ * This will get the underlying array value.
+ *
+ * @return The cos object that this object wraps.
+ */
+ public COSArray getCOSArray()
+ {
+ return matrix;
+ }
+
+ /**
+ * Convert this standard java object to a COS object.
+ *
+ * @return The cos object that matches this Java object.
+ */
+ public COSBase getCOSObject()
+ {
+ return matrix;
+ }
+
+
+ /**
+ * This will get a matrix value at some point.
+ *
+ * @param row The row to get the value from.
+ * @param column The column to get the value from.
+ *
+ * @return The value at the row/column position.
+ */
+ public float getValue( int row, int column )
+ {
+ return ((COSNumber)matrix.get( row*3 + column )).floatValue();
+ }
+
+ /**
+ * This will set a value at a position.
+ *
+ * @param row The row to set the value at.
+ * @param column the column to set the value at.
+ * @param value The value to set at the position.
+ */
+ public void setValue( int row, int column, float value )
+ {
+ matrix.set( row*3+column, new COSFloat( value ) );
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/common/PDMemoryStream.java b/src/main/java/org/pdfbox/pdmodel/common/PDMemoryStream.java
new file mode 100644
index 0000000..61cbfbf
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/common/PDMemoryStream.java
@@ -0,0 +1,284 @@
+/**
+ * Copyright (c) 2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.common;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+import java.util.List;
+
+import org.pdfbox.cos.COSBase;
+import org.pdfbox.cos.COSStream;
+
+import org.pdfbox.pdmodel.common.filespecification.PDFileSpecification;
+
+/**
+ * A PDStream represents a stream in a PDF document. Streams are tied to a single
+ * PDF document.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.1 $
+ */
+public class PDMemoryStream extends PDStream
+{
+ private byte[] data;
+
+ /**
+ * This will create a new PDStream object.
+ *
+ * @param buffer The data for this in memory stream.
+ */
+ public PDMemoryStream( byte[] buffer )
+ {
+ data = buffer;
+ }
+
+
+
+ /**
+ * If there are not compression filters on the current stream then this
+ * will add a compression filter, flate compression for example.
+ */
+ public void addCompression()
+ {
+ //no compression to add
+ }
+
+
+
+ /**
+ * Convert this standard java object to a COS object.
+ *
+ * @return The cos object that matches this Java object.
+ */
+ public COSBase getCOSObject()
+ {
+ throw new UnsupportedOperationException( "not supported for memory stream" );
+ }
+
+ /**
+ * This will get a stream that can be written to.
+ *
+ * @return An output stream to write data to.
+ *
+ * @throws IOException If an IO error occurs during writing.
+ */
+ public OutputStream createOutputStream() throws IOException
+ {
+ throw new UnsupportedOperationException( "not supported for memory stream" );
+ }
+
+ /**
+ * This will get a stream that can be read from.
+ *
+ * @return An input stream that can be read from.
+ *
+ * @throws IOException If an IO error occurs during reading.
+ */
+ public InputStream createInputStream() throws IOException
+ {
+ return new ByteArrayInputStream( data );
+ }
+
+ /**
+ * This will get a stream with some filters applied but not others. This is useful
+ * when doing images, ie filters = [flate,dct], we want to remove flate but leave dct
+ *
+ * @param stopFilters A list of filters to stop decoding at.
+ * @return A stream with decoded data.
+ * @throws IOException If there is an error processing the stream.
+ */
+ public InputStream getPartiallyFilteredStream( List stopFilters ) throws IOException
+ {
+ return createInputStream();
+ }
+
+ /**
+ * Get the cos stream associated with this object.
+ *
+ * @return The cos object that matches this Java object.
+ */
+ public COSStream getStream()
+ {
+ throw new UnsupportedOperationException( "not supported for memory stream" );
+ }
+
+ /**
+ * This will get the length of the filtered/compressed stream. This is readonly in the
+ * PD Model and will be managed by this class.
+ *
+ * @return The length of the filtered stream.
+ */
+ public int getLength()
+ {
+ return data.length;
+ }
+
+ /**
+ * This will get the list of filters that are associated with this stream. Or
+ * null if there are none.
+ * @return A list of all encoding filters to apply to this stream.
+ */
+ public List getFilters()
+ {
+ return null;
+ }
+
+ /**
+ * This will set the filters that are part of this stream.
+ *
+ * @param filters The filters that are part of this stream.
+ */
+ public void setFilters( List filters )
+ {
+ throw new UnsupportedOperationException( "not supported for memory stream" );
+ }
+
+ /**
+ * Get the list of decode parameters. Each entry in the list will refer to
+ * an entry in the filters list.
+ *
+ * @return The list of decode parameters.
+ *
+ * @throws IOException if there is an error retrieving the parameters.
+ */
+ public List getDecodeParams() throws IOException
+ {
+ return null;
+ }
+
+ /**
+ * This will set the list of decode params.
+ *
+ * @param decodeParams The list of decode params.
+ */
+ public void setDecodeParams( List decodeParams )
+ {
+ //do nothing
+ }
+
+ /**
+ * This will get the file specification for this stream. This is only
+ * required for external files.
+ *
+ * @return The file specification.
+ */
+ public PDFileSpecification getFile()
+ {
+ return null;
+ }
+
+ /**
+ * Set the file specification.
+ * @param f The file specification.
+ */
+ public void setFile( PDFileSpecification f )
+ {
+ //do nothing.
+ }
+
+ /**
+ * This will get the list of filters that are associated with this stream. Or
+ * null if there are none.
+ * @return A list of all encoding filters to apply to this stream.
+ */
+ public List getFileFilters()
+ {
+ return null;
+ }
+
+ /**
+ * This will set the filters that are part of this stream.
+ *
+ * @param filters The filters that are part of this stream.
+ */
+ public void setFileFilters( List filters )
+ {
+ //do nothing.
+ }
+
+ /**
+ * Get the list of decode parameters. Each entry in the list will refer to
+ * an entry in the filters list.
+ *
+ * @return The list of decode parameters.
+ *
+ * @throws IOException if there is an error retrieving the parameters.
+ */
+ public List getFileDecodeParams() throws IOException
+ {
+ return null;
+ }
+
+ /**
+ * This will set the list of decode params.
+ *
+ * @param decodeParams The list of decode params.
+ */
+ public void setFileDecodeParams( List decodeParams )
+ {
+ //do nothing
+ }
+
+ /**
+ * This will copy the stream into a byte array.
+ *
+ * @return The byte array of the filteredStream
+ * @throws IOException When getFilteredStream did not work
+ */
+ public byte[] getByteArray() throws IOException
+ {
+ return data;
+ }
+
+ /**
+ * Get the metadata that is part of the document catalog. This will
+ * return null if there is no meta data for this object.
+ *
+ * @return The metadata for this object.
+ */
+ public PDMetadata getMetadata()
+ {
+ return null;
+ }
+
+ /**
+ * Set the metadata for this object. This can be null.
+ *
+ * @param meta The meta data for this object.
+ */
+ public void setMetadata( PDMetadata meta )
+ {
+ //do nothing
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/common/PDMetadata.java b/src/main/java/org/pdfbox/pdmodel/common/PDMetadata.java
new file mode 100644
index 0000000..77be580
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/common/PDMetadata.java
@@ -0,0 +1,87 @@
+/**
+ * Copyright (c) 2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.common;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+import org.pdfbox.cos.COSStream;
+
+import org.pdfbox.pdmodel.PDDocument;
+
+/**
+ * This class represents metadata for various objects in a PDF document.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.1 $
+ */
+public class PDMetadata extends PDStream
+{
+
+ /**
+ * This will create a new PDMetadata object.
+ *
+ * @param document The document that the stream will be part of.
+ */
+ public PDMetadata( PDDocument document )
+ {
+ super( document );
+ getStream().setName( "Type", "Metadata" );
+ getStream().setName( "Subtype", "XML" );
+ }
+
+ /**
+ * Constructor. Reads all data from the input stream and embeds it into the
+ * document, this will close the InputStream.
+ *
+ * @param doc The document that will hold the stream.
+ * @param str The stream parameter.
+ * @param filtered True if the stream already has a filter applied.
+ * @throws IOException If there is an error creating the stream in the document.
+ */
+ public PDMetadata( PDDocument doc, InputStream str, boolean filtered ) throws IOException
+ {
+ super( doc, str, filtered );
+ getStream().setName( "Type", "Metadata" );
+ getStream().setName( "Subtype", "XML" );
+ }
+
+ /**
+ * Constructor.
+ *
+ * @param str The stream parameter.
+ */
+ public PDMetadata( COSStream str )
+ {
+ super( str );
+ }
+
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/common/PDNameTreeNode.java b/src/main/java/org/pdfbox/pdmodel/common/PDNameTreeNode.java
new file mode 100644
index 0000000..4a79d10
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/common/PDNameTreeNode.java
@@ -0,0 +1,337 @@
+/**
+ * Copyright (c) 2004-2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.common;
+
+import java.io.IOException;
+import java.lang.reflect.Constructor;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.pdfbox.cos.COSArray;
+import org.pdfbox.cos.COSBase;
+import org.pdfbox.cos.COSDictionary;
+import org.pdfbox.cos.COSString;
+
+/**
+ * This class represends a PDF Name tree. See the PDF Reference 1.5 section 3.8.5
+ * for more details.
+ *
+ * @author Ben Litchfield (ben@benlitchfield.com)
+ * @version $Revision: 1.3 $
+ */
+public class PDNameTreeNode implements COSObjectable
+{
+ private COSDictionary node;
+ private Class valueType = null;
+
+ /**
+ * Constructor.
+ *
+ * @param valueClass The PD Model type of object that is the value.
+ */
+ public PDNameTreeNode( Class valueClass )
+ {
+ node = new COSDictionary();
+ valueType = valueClass;
+ }
+
+ /**
+ * Constructor.
+ *
+ * @param dict The dictionary that holds the name information.
+ * @param valueClass The PD Model type of object that is the value.
+ */
+ public PDNameTreeNode( COSDictionary dict, Class valueClass )
+ {
+ node = dict;
+ valueType = valueClass;
+ }
+
+ /**
+ * Convert this standard java object to a COS object.
+ *
+ * @return The cos object that matches this Java object.
+ */
+ public COSBase getCOSObject()
+ {
+ return node;
+ }
+
+ /**
+ * Convert this standard java object to a COS object.
+ *
+ * @return The cos object that matches this Java object.
+ */
+ public COSDictionary getCOSDictionary()
+ {
+ return node;
+ }
+
+ /**
+ * Return the children of this node. This list will contain PDNameTreeNode objects.
+ *
+ * @return The list of children or null if there are no children.
+ */
+ public List getKids()
+ {
+
+ List retval = null;
+ COSArray kids = (COSArray)node.getDictionaryObject( "Kids" );
+ if( kids != null )
+ {
+ List pdObjects = new ArrayList();
+ for( int i=0; i<kids.size(); i++ )
+ {
+ pdObjects.add( createChildNode( (COSDictionary)kids.getObject(i) ) );
+ }
+ retval = new COSArrayList(pdObjects,kids);
+ }
+
+ return retval;
+ }
+
+ /**
+ * Set the children of this named tree.
+ *
+ * @param kids The children of this named tree.
+ */
+ public void setKids( List kids )
+ {
+ node.setItem( "Kids", COSArrayList.converterToCOSArray( kids ) );
+ }
+
+ /**
+ * The name to retrieve.
+ *
+ * @param name The name in the tree.
+ *
+ * @return The value of the name in the tree.
+ *
+ * @throws IOException If an there is a problem creating the destinations.
+ */
+ public Object getValue( String name ) throws IOException
+ {
+ Object retval = null;
+ Map names = getNames();
+ if( names != null )
+ {
+ retval = names.get( name );
+ }
+ else
+ {
+ List kids = getKids();
+ for( int i=0; i<kids.size() && retval == null; i++ )
+ {
+ PDNameTreeNode childNode = (PDNameTreeNode)kids.get( i );
+ if( childNode.getLowerLimit().compareTo( name ) <= 0 &&
+ childNode.getUpperLimit().compareTo( name ) >= 0 )
+ {
+ retval = childNode.getValue( name );
+ }
+ }
+ }
+ return retval;
+ }
+
+
+ /**
+ * This will return a map of names. The key will be a java.lang.String the value will
+ * depend on where this class is being used.
+ *
+ * @return A map of cos objects.
+ *
+ * @throws IOException If there is an error while creating the sub types.
+ */
+ public Map getNames() throws IOException
+ {
+ Map names = null;
+ COSArray namesArray = (COSArray)node.getDictionaryObject( "Names" );
+ if( namesArray != null )
+ {
+ names = new HashMap();
+ for( int i=0; i<namesArray.size(); i+=2 )
+ {
+ COSString key = (COSString)namesArray.getObject(i);
+ COSBase cosValue = namesArray.getObject( i+1 );
+ Object pdValue = convertCOSToPD( cosValue );
+
+ names.put( key.getString(), pdValue );
+ }
+ names = Collections.unmodifiableMap(names);
+ }
+
+ return names;
+ }
+
+ /**
+ * Method to convert the COS value in the name tree to the PD Model object. The
+ * default implementation will simply use reflection to create the correct object
+ * type. Subclasses can do whatever they want.
+ *
+ * @param base The COS object to convert.
+ * @return The converted PD Model object.
+ * @throws IOException If there is an error during creation.
+ */
+ protected Object convertCOSToPD( COSBase base ) throws IOException
+ {
+ Object retval = null;
+ try
+ {
+ Constructor ctor = valueType.getConstructor( new Class[] { base.getClass() } );
+ retval = ctor.newInstance( new Object[] { base } );
+ }
+ catch( Throwable t )
+ {
+ throw new IOException( "Error while trying to create value in named tree:" + t.getMessage());
+
+ }
+ return retval;
+ }
+
+ /**
+ * Create a child node object.
+ *
+ * @param dic The dictionary for the child node object to refer to.
+ * @return The new child node object.
+ */
+ protected PDNameTreeNode createChildNode( COSDictionary dic )
+ {
+ return new PDNameTreeNode(dic,valueType);
+ }
+
+ /**
+ * Set the names of for this node. The keys should be java.lang.String and the
+ * values must be a COSObjectable. This method will set the appropriate upper and lower
+ * limits based on the keys in the map.
+ *
+ * @param names The map of names to objects.
+ */
+ public void setNames( Map names )
+ {
+ if( names == null )
+ {
+ node.setItem( "Names", (COSObjectable)null );
+ node.setItem( "Limits", (COSObjectable)null);
+ }
+ else
+ {
+ List keys = new ArrayList( names.keySet() );
+ Collections.sort( keys );
+ COSArray array = new COSArray();
+ for( int i=0; i<keys.size(); i++ )
+ {
+ String key = (String)keys.get(i);
+ array.add( new COSString( key ) );
+ COSObjectable obj = (COSObjectable)names.get( key );
+ array.add( obj );
+ }
+ String lower = null;
+ String upper = null;
+ if( keys.size() > 0 )
+ {
+ lower = (String)keys.get( 0 );
+ upper = (String)keys.get( keys.size()-1 );
+ }
+ setUpperLimit( upper );
+ setLowerLimit( lower );
+ node.setItem( "Names", array );
+ }
+ }
+
+ /**
+ * Get the highest value for a key in the name map.
+ *
+ * @return The highest value for a key in the map.
+ */
+ public String getUpperLimit()
+ {
+ String retval = null;
+ COSArray arr = (COSArray)node.getDictionaryObject( "Limits" );
+ if( arr != null )
+ {
+ retval = arr.getString( 1 );
+ }
+ return retval;
+ }
+
+ /**
+ * Set the highest value for the key in the map.
+ *
+ * @param upper The new highest value for a key in the map.
+ */
+ private void setUpperLimit( String upper )
+ {
+ COSArray arr = (COSArray)node.getDictionaryObject( "Limits" );
+ if( arr == null )
+ {
+ arr = new COSArray();
+ arr.add( null );
+ arr.add( null );
+ }
+ arr.setString( 1, upper );
+ }
+
+ /**
+ * Get the lowest value for a key in the name map.
+ *
+ * @return The lowest value for a key in the map.
+ */
+ public String getLowerLimit()
+ {
+ String retval = null;
+ COSArray arr = (COSArray)node.getDictionaryObject( "Limits" );
+ if( arr != null )
+ {
+ retval = arr.getString( 0 );
+ }
+ return retval;
+ }
+
+ /**
+ * Set the lowest value for the key in the map.
+ *
+ * @param lower The new lowest value for a key in the map.
+ */
+ private void setLowerLimit( String lower )
+ {
+ COSArray arr = (COSArray)node.getDictionaryObject( "Limits" );
+ if( arr == null )
+ {
+ arr = new COSArray();
+ arr.add( null );
+ arr.add( null );
+ }
+ arr.setString( 0, lower );
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/common/PDNamedTextStream.java b/src/main/java/org/pdfbox/pdmodel/common/PDNamedTextStream.java
new file mode 100644
index 0000000..2321683
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/common/PDNamedTextStream.java
@@ -0,0 +1,137 @@
+/**
+ * Copyright (c) 2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.common;
+
+import org.pdfbox.cos.COSBase;
+import org.pdfbox.cos.COSName;
+
+/**
+ * A named text stream is a combination of a name and a PDTextStream object. This
+ * is used in name trees.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.2 $
+ */
+public class PDNamedTextStream implements DualCOSObjectable
+{
+ private COSName streamName;
+ private PDTextStream stream;
+
+ /**
+ * Constructor.
+ */
+ public PDNamedTextStream()
+ {
+ //default constructor
+ }
+
+ /**
+ * Constructor.
+ *
+ * @param name The name of the stream.
+ * @param str The stream.
+ */
+ public PDNamedTextStream( COSName name, COSBase str )
+ {
+ streamName = name;
+ stream = PDTextStream.createTextStream( str );
+ }
+
+ /**
+ * The name of the named text stream.
+ *
+ * @return The stream name.
+ */
+ public String getName()
+ {
+ String name = null;
+ if( streamName != null )
+ {
+ name = streamName.getName();
+ }
+ return name;
+ }
+
+ /**
+ * This will set the name of the named text stream.
+ *
+ * @param name The name of the named text stream.
+ */
+ public void setName( String name )
+ {
+ streamName = COSName.getPDFName( name );
+ }
+
+ /**
+ * This will get the stream.
+ *
+ * @return The stream associated with this name.
+ */
+ public PDTextStream getStream()
+ {
+ return stream;
+ }
+
+ /**
+ * This will set the stream.
+ *
+ * @param str The stream associated with this name.
+ */
+ public void setStream( PDTextStream str )
+ {
+ stream = str;
+ }
+
+ /**
+ * Convert this standard java object to a COS object.
+ *
+ * @return The cos object that matches this Java object.
+ */
+ public COSBase getFirstCOSObject()
+ {
+ return streamName;
+ }
+
+ /**
+ * Convert this standard java object to a COS object.
+ *
+ * @return The cos object that matches this Java object.
+ */
+ public COSBase getSecondCOSObject()
+ {
+ COSBase retval = null;
+ if( stream != null )
+ {
+ retval = stream.getCOSObject();
+ }
+ return retval;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/common/PDObjectStream.java b/src/main/java/org/pdfbox/pdmodel/common/PDObjectStream.java
new file mode 100644
index 0000000..3d31c1a
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/common/PDObjectStream.java
@@ -0,0 +1,151 @@
+/**
+ * Copyright (c) 2004-2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.common;
+
+import org.pdfbox.cos.COSStream;
+
+import org.pdfbox.pdmodel.PDDocument;
+
+
+
+/**
+ * A PDStream represents a stream in a PDF document. Streams are tied to a single
+ * PDF document.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.2 $
+ */
+public class PDObjectStream extends PDStream
+{
+
+ /**
+ * Constructor.
+ *
+ * @param str The stream parameter.
+ */
+ public PDObjectStream( COSStream str )
+ {
+ super( str );
+ }
+
+ /**
+ * This will create a new PDStream object.
+ *
+ * @param document The document that the stream will be part of.
+ * @return A new stream object.
+ */
+ public static PDObjectStream createStream( PDDocument document )
+ {
+ COSStream cosStream = new COSStream( document.getDocument().getScratchFile() );
+ PDObjectStream strm = new PDObjectStream( cosStream );
+ strm.getStream().setName( "Type", "ObjStm" );
+ return strm;
+ }
+
+ /**
+ * Get the type of this object, should always return "ObjStm".
+ *
+ * @return The type of this object.
+ */
+ public String getType()
+ {
+ return getStream().getNameAsString( "Type" );
+ }
+
+ /**
+ * Get the number of compressed object.
+ *
+ * @return The number of compressed objects.
+ */
+ public int getNumberOfObjects()
+ {
+ return getStream().getInt( "N", 0 );
+ }
+
+ /**
+ * Set the number of objects.
+ *
+ * @param n The new number of objects.
+ */
+ public void setNumberOfObjects( int n )
+ {
+ getStream().setInt( "N", n );
+ }
+
+ /**
+ * The byte offset (in the decoded stream) of the first compressed object.
+ *
+ * @return The byte offset to the first object.
+ */
+ public int getFirstByteOffset()
+ {
+ return getStream().getInt( "First", 0 );
+ }
+
+ /**
+ * The byte offset (in the decoded stream) of the first compressed object.
+ *
+ * @param n The byte offset to the first object.
+ */
+ public void setFirstByteOffset( int n )
+ {
+ getStream().setInt( "First", n );
+ }
+
+ /**
+ * A reference to an object stream, of which the current object stream is
+ * considered an extension.
+ *
+ * @return The object that this stream is an extension.
+ */
+ public PDObjectStream getExtends()
+ {
+ PDObjectStream retval = null;
+ COSStream stream = (COSStream)getStream().getDictionaryObject( "Extends" );
+ if( stream != null )
+ {
+ retval = new PDObjectStream( stream );
+ }
+ return retval;
+
+ }
+
+ /**
+ * A reference to an object stream, of which the current object stream is
+ * considered an extension.
+ *
+ * @param stream The object stream extension.
+ */
+ public void setExtends( PDObjectStream stream )
+ {
+ getStream().setItem( "Extends", stream );
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/common/PDRange.java b/src/main/java/org/pdfbox/pdmodel/common/PDRange.java
new file mode 100644
index 0000000..2493d87
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/common/PDRange.java
@@ -0,0 +1,146 @@
+/**
+ * Copyright (c) 2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.common;
+
+import org.pdfbox.cos.COSArray;
+import org.pdfbox.cos.COSBase;
+import org.pdfbox.cos.COSFloat;
+import org.pdfbox.cos.COSNumber;
+
+/**
+ * This class will be used to signify a range. a(min) <= a* <= a(max)
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.2 $
+ */
+public class PDRange implements COSObjectable
+{
+ private COSArray rangeArray;
+ private int startingIndex;
+
+ /**
+ * Constructor with an initial range of 0..1.
+ */
+ public PDRange()
+ {
+ rangeArray = new COSArray();
+ rangeArray.add( new COSFloat( 0.0f ) );
+ rangeArray.add( new COSFloat( 1.0f ) );
+ startingIndex = 0;
+ }
+
+ /**
+ * Constructor assumes a starting index of 0.
+ *
+ * @param range The array that describes the range.
+ */
+ public PDRange( COSArray range )
+ {
+ rangeArray = range;
+ }
+
+ /**
+ * Constructor with an index into an array. Because some arrays specify
+ * multiple ranges ie [ 0,1, 0,2, 2,3 ] It is convenient for this
+ * class to take an index into an array. So if you want this range to
+ * represent 0,2 in the above example then you would say <code>new PDRange( array, 2 )</code>.
+ *
+ * @param range The array that describes the index
+ * @param index The index into the array for the start of the range.
+ */
+ public PDRange( COSArray range, int index )
+ {
+ rangeArray = range;
+ startingIndex = index;
+ }
+
+ /**
+ * Convert this standard java object to a COS object.
+ *
+ * @return The cos object that matches this Java object.
+ */
+ public COSBase getCOSObject()
+ {
+ return rangeArray;
+ }
+
+ /**
+ * This will get the underlying array value.
+ *
+ * @return The cos object that this object wraps.
+ */
+ public COSArray getCOSArray()
+ {
+ return rangeArray;
+ }
+
+ /**
+ * This will get the minimum value of the range.
+ *
+ * @return The min value.
+ */
+ public float getMin()
+ {
+ COSNumber min = (COSNumber)rangeArray.getObject( startingIndex );
+ return min.floatValue();
+ }
+
+ /**
+ * This will set the minimum value for the range.
+ *
+ * @param min The new minimum for the range.
+ */
+ public void setMin( float min )
+ {
+ rangeArray.set( startingIndex, new COSFloat( min ) );
+ }
+
+ /**
+ * This will get the maximum value of the range.
+ *
+ * @return The max value.
+ */
+ public float getMax()
+ {
+ COSNumber max = (COSNumber)rangeArray.getObject( startingIndex+1 );
+ return max.floatValue();
+ }
+
+ /**
+ * This will set the maximum value for the range.
+ *
+ * @param max The new maximum for the range.
+ */
+ public void setMax( float max )
+ {
+ rangeArray.set( startingIndex+1, new COSFloat( max ) );
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/common/PDRectangle.java b/src/main/java/org/pdfbox/pdmodel/common/PDRectangle.java
new file mode 100644
index 0000000..b9f3267
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/common/PDRectangle.java
@@ -0,0 +1,295 @@
+/**
+ * Copyright (c) 2003-2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.common;
+
+import org.pdfbox.cos.COSArray;
+import org.pdfbox.cos.COSBase;
+import org.pdfbox.cos.COSFloat;
+import org.pdfbox.cos.COSNumber;
+
+import org.pdfbox.util.BoundingBox;
+
+import java.awt.Dimension;
+
+/**
+ * This represents a rectangle in a PDF document.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.10 $
+ */
+public class PDRectangle implements COSObjectable
+{
+ private COSArray rectArray;
+
+ /**
+ * Constructor.
+ *
+ * Initializes to 0,0,0,0
+ */
+ public PDRectangle()
+ {
+ rectArray = new COSArray();
+ rectArray.add( new COSFloat( 0.0f ) );
+ rectArray.add( new COSFloat( 0.0f ) );
+ rectArray.add( new COSFloat( 0.0f ) );
+ rectArray.add( new COSFloat( 0.0f ) );
+ }
+
+ /**
+ * Constructor.
+ *
+ * @param width The width of the rectangle.
+ * @param height The height of the rectangle.
+ */
+ public PDRectangle( float width, float height )
+ {
+ rectArray = new COSArray();
+ rectArray.add( new COSFloat( 0.0f ) );
+ rectArray.add( new COSFloat( 0.0f ) );
+ rectArray.add( new COSFloat( width ) );
+ rectArray.add( new COSFloat( height ) );
+ }
+
+ /**
+ * Constructor.
+ *
+ * @param box The non PD bouding box.
+ */
+ public PDRectangle( BoundingBox box )
+ {
+ rectArray = new COSArray();
+ rectArray.add( new COSFloat( box.getLowerLeftX() ) );
+ rectArray.add( new COSFloat( box.getLowerLeftY() ) );
+ rectArray.add( new COSFloat( box.getUpperRightX() ) );
+ rectArray.add( new COSFloat( box.getUpperRightY() ) );
+ }
+
+ /**
+ * Constructor.
+ *
+ * @param array An array of numbers as specified in the PDF Reference for a rectangle type.
+ */
+ public PDRectangle( COSArray array )
+ {
+ rectArray = array;
+ }
+
+ /**
+ * Method to determine if the x/y point is inside this rectangle.
+ * @param x The x-coordinate to test.
+ * @param y The y-coordinate to test.
+ * @return True if the point is inside this rectangle.
+ */
+ public boolean contains( float x, float y )
+ {
+ float llx = getLowerLeftX();
+ float urx = getUpperRightX();
+ float lly = getLowerLeftY();
+ float ury = getUpperRightY();
+ return x >= llx && x <= urx &&
+ y >= lly && y <= ury;
+ }
+
+ /**
+ * This will create a translated rectangle based off of this rectangle, such
+ * that the new rectangle retains the same dimensions(height/width), but the
+ * lower left x,y values are zero. <br />
+ * 100, 100, 400, 400 (llx, lly, urx, ury ) <br />
+ * will be translated to 0,0,300,300
+ *
+ * @return A new rectangle that has been translated back to the origin.
+ */
+ public PDRectangle createRetranslatedRectangle()
+ {
+ PDRectangle retval = new PDRectangle();
+ retval.setUpperRightX( getWidth() );
+ retval.setUpperRightY( getHeight() );
+ return retval;
+ }
+
+ /**
+ * This will get the underlying array for this rectangle.
+ *
+ * @return The cos array.
+ */
+ public COSArray getCOSArray()
+ {
+ return rectArray;
+ }
+
+ /**
+ * This will get the lower left x coordinate.
+ *
+ * @return The lower left x.
+ */
+ public float getLowerLeftX()
+ {
+ return ((COSNumber)rectArray.get(0)).floatValue();
+ }
+
+ /**
+ * This will set the lower left x coordinate.
+ *
+ * @param value The lower left x.
+ */
+ public void setLowerLeftX(float value)
+ {
+ rectArray.set(0, new COSFloat( value ) );
+ }
+
+ /**
+ * This will get the lower left y coordinate.
+ *
+ * @return The lower left y.
+ */
+ public float getLowerLeftY()
+ {
+ return ((COSNumber)rectArray.get(1)).floatValue();
+ }
+
+ /**
+ * This will set the lower left y coordinate.
+ *
+ * @param value The lower left y.
+ */
+ public void setLowerLeftY(float value)
+ {
+ rectArray.set(1, new COSFloat( value ) );
+ }
+
+ /**
+ * This will get the upper right x coordinate.
+ *
+ * @return The upper right x .
+ */
+ public float getUpperRightX()
+ {
+ return ((COSNumber)rectArray.get(2)).floatValue();
+ }
+
+ /**
+ * This will set the upper right x coordinate.
+ *
+ * @param value The upper right x .
+ */
+ public void setUpperRightX(float value)
+ {
+ rectArray.set(2, new COSFloat( value ) );
+ }
+
+ /**
+ * This will get the upper right y coordinate.
+ *
+ * @return The upper right y.
+ */
+ public float getUpperRightY()
+ {
+ return ((COSNumber)rectArray.get(3)).floatValue();
+ }
+
+ /**
+ * This will set the upper right y coordinate.
+ *
+ * @param value The upper right y.
+ */
+ public void setUpperRightY(float value)
+ {
+ rectArray.set(3, new COSFloat( value ) );
+ }
+
+ /**
+ * This will get the width of this rectangle as calculated by
+ * upperRightX - lowerLeftX.
+ *
+ * @return The width of this rectangle.
+ */
+ public float getWidth()
+ {
+ return getUpperRightX() - getLowerLeftX();
+ }
+
+ /**
+ * This will get the height of this rectangle as calculated by
+ * upperRightY - lowerLeftY.
+ *
+ * @return The height of this rectangle.
+ */
+ public float getHeight()
+ {
+ return getUpperRightY() - getLowerLeftY();
+ }
+
+ /**
+ * A convenience method to create a dimension object for AWT operations.
+ *
+ * @return A dimension that matches the width and height of this rectangle.
+ */
+ public Dimension createDimension()
+ {
+ return new Dimension( (int)getWidth(), (int)getHeight() );
+ }
+
+ /**
+ * This will move the rectangle the given relative amount.
+ *
+ * @param horizontalAmount positive values will move rectangle to the right, negative's to the left.
+ * @param verticalAmount positive values will move the rectangle up, negative's down.
+ */
+ public void move(float horizontalAmount, float verticalAmount)
+ {
+ setUpperRightX(getUpperRightX() + horizontalAmount);
+ setLowerLeftX(getLowerLeftX() + horizontalAmount);
+ setUpperRightY(getUpperRightY() + verticalAmount);
+ setLowerLeftY(getLowerLeftY() + verticalAmount);
+ }
+
+ /**
+ * Convert this standard java object to a COS object.
+ *
+ * @return The cos object that matches this Java object.
+ */
+ public COSBase getCOSObject()
+ {
+ return rectArray;
+ }
+
+
+ /**
+ * This will return a string representation of this rectangle.
+ *
+ * @return This object as a string.
+ */
+ public String toString()
+ {
+ return "[" + getLowerLeftX() + "," + getLowerLeftY() + "," +
+ getUpperRightX() + "," + getUpperRightY() +"]";
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/common/PDStream.java b/src/main/java/org/pdfbox/pdmodel/common/PDStream.java
new file mode 100644
index 0000000..74398b2
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/common/PDStream.java
@@ -0,0 +1,538 @@
+/**
+ * Copyright (c) 2004-2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.common;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.pdfbox.cos.COSArray;
+import org.pdfbox.cos.COSBase;
+import org.pdfbox.cos.COSDictionary;
+import org.pdfbox.cos.COSName;
+import org.pdfbox.cos.COSStream;
+
+import org.pdfbox.filter.Filter;
+import org.pdfbox.filter.FilterManager;
+
+import org.pdfbox.pdmodel.PDDocument;
+
+import org.pdfbox.pdmodel.common.filespecification.PDFileSpecification;
+
+/**
+ * A PDStream represents a stream in a PDF document. Streams are tied to a single
+ * PDF document.
+ *
+ * @author Ben Litchfield (ben@benlitchfield.com)
+ * @version $Revision: 1.14 $
+ */
+public class PDStream implements COSObjectable
+{
+ private COSStream stream;
+
+ /**
+ * This will create a new PDStream object.
+ */
+ protected PDStream()
+ {
+ //should only be called by PDMemoryStream
+ }
+
+ /**
+ * This will create a new PDStream object.
+ *
+ * @param document The document that the stream will be part of.
+ */
+ public PDStream( PDDocument document )
+ {
+ stream = new COSStream( document.getDocument().getScratchFile() );
+ }
+
+ /**
+ * Constructor.
+ *
+ * @param str The stream parameter.
+ */
+ public PDStream( COSStream str )
+ {
+ stream = str;
+ }
+
+ /**
+ * Constructor. Reads all data from the input stream and embeds it into the
+ * document, this will close the InputStream.
+ *
+ * @param doc The document that will hold the stream.
+ * @param str The stream parameter.
+ * @throws IOException If there is an error creating the stream in the document.
+ */
+ public PDStream( PDDocument doc, InputStream str ) throws IOException
+ {
+ this( doc, str, false );
+ }
+
+ /**
+ * Constructor. Reads all data from the input stream and embeds it into the
+ * document, this will close the InputStream.
+ *
+ * @param doc The document that will hold the stream.
+ * @param str The stream parameter.
+ * @param filtered True if the stream already has a filter applied.
+ * @throws IOException If there is an error creating the stream in the document.
+ */
+ public PDStream( PDDocument doc, InputStream str, boolean filtered ) throws IOException
+ {
+ OutputStream output = null;
+ try
+ {
+ stream = new COSStream( doc.getDocument().getScratchFile() );
+ if( filtered )
+ {
+ output = stream.createFilteredStream();
+ }
+ else
+ {
+ output = stream.createUnfilteredStream();
+ }
+ byte[] buffer = new byte[ 1024 ];
+ int amountRead = -1;
+ while( (amountRead = str.read(buffer)) != -1 )
+ {
+ output.write( buffer, 0, amountRead );
+ }
+ }
+ finally
+ {
+ if( output != null )
+ {
+ output.close();
+ }
+ if( str != null )
+ {
+ str.close();
+ }
+ }
+ }
+
+ /**
+ * If there are not compression filters on the current stream then this
+ * will add a compression filter, flate compression for example.
+ */
+ public void addCompression()
+ {
+ List filters = getFilters();
+ if( filters == null )
+ {
+ filters = new ArrayList();
+ filters.add( COSName.FLATE_DECODE );
+ setFilters( filters );
+ }
+ }
+
+ /**
+ * Create a pd stream from either a regular COSStream on a COSArray of cos streams.
+ * @param base Either a COSStream or COSArray.
+ * @return A PDStream or null if base is null.
+ * @throws IOException If there is an error creating the PDStream.
+ */
+ public static PDStream createFromCOS( COSBase base ) throws IOException
+ {
+ PDStream retval = null;
+ if( base instanceof COSStream )
+ {
+ retval = new PDStream( (COSStream)base );
+ }
+ else if( base instanceof COSArray )
+ {
+ retval = new PDStream( new COSStreamArray( (COSArray)base ) );
+ }
+ else
+ {
+ if( base != null )
+ {
+ throw new IOException( "Contents are unknown type:" + base.getClass().getName() );
+ }
+ }
+ return retval;
+ }
+
+
+ /**
+ * Convert this standard java object to a COS object.
+ *
+ * @return The cos object that matches this Java object.
+ */
+ public COSBase getCOSObject()
+ {
+ return stream;
+ }
+
+ /**
+ * This will get a stream that can be written to.
+ *
+ * @return An output stream to write data to.
+ *
+ * @throws IOException If an IO error occurs during writing.
+ */
+ public OutputStream createOutputStream() throws IOException
+ {
+ return stream.createUnfilteredStream();
+ }
+
+ /**
+ * This will get a stream that can be read from.
+ *
+ * @return An input stream that can be read from.
+ *
+ * @throws IOException If an IO error occurs during reading.
+ */
+ public InputStream createInputStream() throws IOException
+ {
+ return stream.getUnfilteredStream();
+ }
+
+ /**
+ * This will get a stream with some filters applied but not others. This is useful
+ * when doing images, ie filters = [flate,dct], we want to remove flate but leave dct
+ *
+ * @param stopFilters A list of filters to stop decoding at.
+ * @return A stream with decoded data.
+ * @throws IOException If there is an error processing the stream.
+ */
+ public InputStream getPartiallyFilteredStream( List stopFilters ) throws IOException
+ {
+ FilterManager manager = stream.getFilterManager();
+ InputStream is = stream.getFilteredStream();
+ ByteArrayOutputStream os = new ByteArrayOutputStream();
+ List filters = getFilters();
+ Iterator iter = filters.iterator();
+ String nextFilter = null;
+ boolean done = false;
+ while( iter.hasNext() && !done )
+ {
+ os.reset();
+ nextFilter = (String)iter.next();
+ if( stopFilters.contains( nextFilter ) )
+ {
+ done = true;
+ }
+ else
+ {
+ Filter filter = manager.getFilter( COSName.getPDFName(nextFilter) );
+ filter.decode( is, os, stream );
+ is = new ByteArrayInputStream( os.toByteArray() );
+ }
+ }
+ return is;
+ }
+
+ /**
+ * Get the cos stream associated with this object.
+ *
+ * @return The cos object that matches this Java object.
+ */
+ public COSStream getStream()
+ {
+ return stream;
+ }
+
+ /**
+ * This will get the length of the filtered/compressed stream. This is readonly in the
+ * PD Model and will be managed by this class.
+ *
+ * @return The length of the filtered stream.
+ */
+ public int getLength()
+ {
+ return stream.getInt( "Length", 0 );
+ }
+
+ /**
+ * This will get the list of filters that are associated with this stream. Or
+ * null if there are none.
+ * @return A list of all encoding filters to apply to this stream.
+ */
+ public List getFilters()
+ {
+ List retval = null;
+ COSBase filters = stream.getFilters();
+ if( filters instanceof COSName )
+ {
+ COSName name = (COSName)filters;
+ retval = new COSArrayList( name.getName(), name, stream, "Filter" );
+ }
+ else if( filters instanceof COSArray )
+ {
+ retval = COSArrayList.convertCOSNameCOSArrayToList( (COSArray)filters );
+ }
+ return retval;
+ }
+
+ /**
+ * This will set the filters that are part of this stream.
+ *
+ * @param filters The filters that are part of this stream.
+ */
+ public void setFilters( List filters )
+ {
+ COSBase obj = COSArrayList.convertStringListToCOSNameCOSArray( filters );
+ stream.setItem( "Filter", obj );
+ }
+
+ /**
+ * Get the list of decode parameters. Each entry in the list will refer to
+ * an entry in the filters list.
+ *
+ * @return The list of decode parameters.
+ *
+ * @throws IOException if there is an error retrieving the parameters.
+ */
+ public List getDecodeParams() throws IOException
+ {
+ List retval = null;
+
+ COSBase dp = stream.getDictionaryObject( "DecodeParms" );
+ if( dp == null )
+ {
+ //See PDF Ref 1.5 implementation note 7, the DP is sometimes used instead.
+ dp = stream.getDictionaryObject( "DP" );
+ }
+ if( dp instanceof COSDictionary )
+ {
+ Map map = COSDictionaryMap.convertBasicTypesToMap( (COSDictionary)dp );
+ retval = new COSArrayList(map, dp, stream, "DecodeParams" );
+ }
+ else if( dp instanceof COSArray )
+ {
+ COSArray array = (COSArray)dp;
+ List actuals = new ArrayList();
+ for( int i=0; i<array.size(); i++ )
+ {
+ actuals.add(
+ COSDictionaryMap.convertBasicTypesToMap(
+ (COSDictionary)array.getObject( i ) ) );
+ }
+ retval = new COSArrayList(actuals, array);
+ }
+
+ return retval;
+ }
+
+ /**
+ * This will set the list of decode params.
+ *
+ * @param decodeParams The list of decode params.
+ */
+ public void setDecodeParams( List decodeParams )
+ {
+ stream.setItem(
+ "DecodeParams", COSArrayList.converterToCOSArray( decodeParams ) );
+ }
+
+ /**
+ * This will get the file specification for this stream. This is only
+ * required for external files.
+ *
+ * @return The file specification.
+ */
+ public PDFileSpecification getFile()
+ {
+ COSBase f = stream.getDictionaryObject( "F" );
+ PDFileSpecification retval = PDFileSpecification.createFS( f );
+ return retval;
+ }
+
+ /**
+ * Set the file specification.
+ * @param f The file specification.
+ */
+ public void setFile( PDFileSpecification f )
+ {
+ stream.setItem( "F", f );
+ }
+
+ /**
+ * This will get the list of filters that are associated with this stream. Or
+ * null if there are none.
+ * @return A list of all encoding filters to apply to this stream.
+ */
+ public List getFileFilters()
+ {
+ List retval = null;
+ COSBase filters = stream.getDictionaryObject( "FFilter" );
+ if( filters instanceof COSName )
+ {
+ COSName name = (COSName)filters;
+ retval = new COSArrayList( name.getName(), name, stream, "FFilter" );
+ }
+ else if( filters instanceof COSArray )
+ {
+ retval = COSArrayList.convertCOSNameCOSArrayToList( (COSArray)filters );
+ }
+ return retval;
+ }
+
+ /**
+ * This will set the filters that are part of this stream.
+ *
+ * @param filters The filters that are part of this stream.
+ */
+ public void setFileFilters( List filters )
+ {
+ COSBase obj = COSArrayList.convertStringListToCOSNameCOSArray( filters );
+ stream.setItem( "FFilter", obj );
+ }
+
+ /**
+ * Get the list of decode parameters. Each entry in the list will refer to
+ * an entry in the filters list.
+ *
+ * @return The list of decode parameters.
+ *
+ * @throws IOException if there is an error retrieving the parameters.
+ */
+ public List getFileDecodeParams() throws IOException
+ {
+ List retval = null;
+
+ COSBase dp = stream.getDictionaryObject( "FDecodeParms" );
+ if( dp instanceof COSDictionary )
+ {
+ Map map = COSDictionaryMap.convertBasicTypesToMap( (COSDictionary)dp );
+ retval = new COSArrayList(map, dp, stream, "FDecodeParams" );
+ }
+ else if( dp instanceof COSArray )
+ {
+ COSArray array = (COSArray)dp;
+ List actuals = new ArrayList();
+ for( int i=0; i<array.size(); i++ )
+ {
+ actuals.add(
+ COSDictionaryMap.convertBasicTypesToMap(
+ (COSDictionary)array.getObject( i ) ) );
+ }
+ retval = new COSArrayList(actuals, array);
+ }
+
+ return retval;
+ }
+
+ /**
+ * This will set the list of decode params.
+ *
+ * @param decodeParams The list of decode params.
+ */
+ public void setFileDecodeParams( List decodeParams )
+ {
+ stream.setItem(
+ "FDecodeParams", COSArrayList.converterToCOSArray( decodeParams ) );
+ }
+
+ /**
+ * This will copy the stream into a byte array.
+ *
+ * @return The byte array of the filteredStream
+ * @throws IOException When getFilteredStream did not work
+ */
+ public byte[] getByteArray() throws IOException
+ {
+ ByteArrayOutputStream output = new ByteArrayOutputStream();
+ byte[] buf = new byte[1024];
+ InputStream is = null;
+ try
+ {
+ is = createInputStream();
+ int amountRead = -1;
+ while( (amountRead = is.read( buf )) != -1)
+ {
+ output.write( buf, 0, amountRead );
+ }
+ }
+ finally
+ {
+ if( is != null )
+ {
+ is.close();
+ }
+ }
+ return output.toByteArray();
+ }
+
+ /**
+ * A convenience method to get this stream as a string. Uses
+ * the default system encoding.
+ *
+ * @return a String representation of this (input) stream, with the
+ * platform default encoding.
+ *
+ * @throws IOException if there is an error while converting the stream
+ * to a string.
+ */
+ public String getInputStreamAsString() throws IOException
+ {
+ byte[] bStream = getByteArray();
+ return new String(bStream);
+ }
+
+ /**
+ * Get the metadata that is part of the document catalog. This will
+ * return null if there is no meta data for this object.
+ *
+ * @return The metadata for this object.
+ */
+ public PDMetadata getMetadata()
+ {
+ PDMetadata retval = null;
+ COSStream mdStream = (COSStream)stream.getDictionaryObject( "Metadata" );
+ if( mdStream != null )
+ {
+ retval = new PDMetadata( mdStream );
+ }
+ return retval;
+ }
+
+ /**
+ * Set the metadata for this object. This can be null.
+ *
+ * @param meta The meta data for this object.
+ */
+ public void setMetadata( PDMetadata meta )
+ {
+ stream.setItem( "Metadata", meta );
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/common/PDTextStream.java b/src/main/java/org/pdfbox/pdmodel/common/PDTextStream.java
new file mode 100644
index 0000000..c7c5ca1
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/common/PDTextStream.java
@@ -0,0 +1,180 @@
+/**
+ * Copyright (c) 2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.common;
+
+import java.io.ByteArrayOutputStream;
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+import java.io.IOException;
+
+import org.pdfbox.cos.COSBase;
+import org.pdfbox.cos.COSStream;
+import org.pdfbox.cos.COSString;
+
+/**
+ * A PDTextStream class is used when the PDF specification supports either
+ * a string or a stream for the value of an object. This is usually when
+ * a value could be large or small, for example a JavaScript method. This
+ * class will help abstract that and give a single unified interface to
+ * those types of fields.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.2 $
+ */
+public class PDTextStream implements COSObjectable
+{
+ private COSString string;
+ private COSStream stream;
+
+ /**
+ * Constructor.
+ *
+ * @param str The string parameter.
+ */
+ public PDTextStream( COSString str )
+ {
+ string = str;
+ }
+
+ /**
+ * Constructor.
+ *
+ * @param str The string parameter.
+ */
+ public PDTextStream( String str )
+ {
+ string = new COSString( str );
+ }
+
+ /**
+ * Constructor.
+ *
+ * @param str The stream parameter.
+ */
+ public PDTextStream( COSStream str )
+ {
+ stream = str;
+ }
+
+ /**
+ * This will create the text stream object. base must either be a string
+ * or a stream.
+ *
+ * @param base The COS text stream object.
+ *
+ * @return A PDTextStream that wraps the base object.
+ */
+ public static PDTextStream createTextStream( COSBase base )
+ {
+ PDTextStream retval = null;
+ if( base instanceof COSString )
+ {
+ retval = new PDTextStream( (COSString) base );
+ }
+ else if( base instanceof COSStream )
+ {
+ retval = new PDTextStream( (COSStream)base );
+ }
+ return retval;
+ }
+
+ /**
+ * Convert this standard java object to a COS object.
+ *
+ * @return The cos object that matches this Java object.
+ */
+ public COSBase getCOSObject()
+ {
+ COSBase retval = null;
+ if( string == null )
+ {
+ retval = stream;
+ }
+ else
+ {
+ retval = string;
+ }
+ return retval;
+ }
+
+ /**
+ * This will get this value as a string. If this is a stream then it
+ * will load the entire stream into memory, so you should only do this when
+ * the stream is a manageable size.
+ *
+ * @return This value as a string.
+ *
+ * @throws IOException If an IO error occurs while accessing the stream.
+ */
+ public String getAsString() throws IOException
+ {
+ String retval = null;
+ if( string != null )
+ {
+ retval = string.getString();
+ }
+ else
+ {
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ byte[] buffer = new byte[ 1024 ];
+ int amountRead = -1;
+ InputStream is = stream.getUnfilteredStream();
+ while( (amountRead = is.read( buffer ) ) != -1 )
+ {
+ out.write( buffer, 0, amountRead );
+ }
+ retval = new String( out.toByteArray() );
+ }
+ return retval;
+ }
+
+ /**
+ * This is the preferred way of getting data with this class as it uses
+ * a stream object.
+ *
+ * @return The stream object.
+ *
+ * @throws IOException If an IO error occurs while accessing the stream.
+ */
+ public InputStream getAsStream() throws IOException
+ {
+ InputStream retval = null;
+ if( string != null )
+ {
+ retval = new ByteArrayInputStream( string.getBytes() );
+ }
+ else
+ {
+ retval = stream.getUnfilteredStream();
+ }
+ return retval;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/common/filespecification/PDComplexFileSpecification.java b/src/main/java/org/pdfbox/pdmodel/common/filespecification/PDComplexFileSpecification.java
new file mode 100644
index 0000000..12618f1
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/common/filespecification/PDComplexFileSpecification.java
@@ -0,0 +1,326 @@
+/**
+ * Copyright (c) 2004-2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.common.filespecification;
+
+import org.pdfbox.cos.COSBase;
+import org.pdfbox.cos.COSDictionary;
+import org.pdfbox.cos.COSStream;
+
+/**
+ * This represents a file specification.
+ *
+ * @author Ben Litchfield (ben@benlitchfield.com)
+ * @version $Revision: 1.3 $
+ */
+public class PDComplexFileSpecification extends PDFileSpecification
+{
+ private COSDictionary fs;
+
+ /**
+ * Default Constructor.
+ */
+ public PDComplexFileSpecification()
+ {
+ fs = new COSDictionary();
+ fs.setName( "Type", "Filespec" );
+ }
+
+ /**
+ * Constructor.
+ *
+ * @param dict The dictionary that fulfils this file specification.
+ */
+ public PDComplexFileSpecification( COSDictionary dict )
+ {
+ fs = dict;
+ }
+
+ /**
+ * Convert this standard java object to a COS object.
+ *
+ * @return The cos object that matches this Java object.
+ */
+ public COSBase getCOSObject()
+ {
+ return fs;
+ }
+
+ /**
+ * Convert this standard java object to a COS object.
+ *
+ * @return The cos object that matches this Java object.
+ */
+ public COSDictionary getCOSDictionary()
+ {
+ return fs;
+ }
+
+ /**
+ * This will get the file name.
+ *
+ * @return The file name.
+ */
+ public String getFile()
+ {
+ return fs.getString( "F" );
+ }
+
+ /**
+ * This will set the file name.
+ *
+ * @param file The name of the file.
+ */
+ public void setFile( String file )
+ {
+ fs.setString( "F", file );
+ }
+
+ /**
+ * This will get the name representing a Dos file.
+ *
+ * @return The file name.
+ */
+ public String getFileDos()
+ {
+ return fs.getString( "DOS" );
+ }
+
+ /**
+ * This will set name representing a dos file.
+ *
+ * @param file The name of the file.
+ */
+ public void setFileDos( String file )
+ {
+ fs.setString( "DOS", file );
+ }
+
+ /**
+ * This will get the name representing a Mac file.
+ *
+ * @return The file name.
+ */
+ public String getFileMac()
+ {
+ return fs.getString( "Mac" );
+ }
+
+ /**
+ * This will set name representing a Mac file.
+ *
+ * @param file The name of the file.
+ */
+ public void setFileMac( String file )
+ {
+ fs.setString( "Mac", file );
+ }
+
+ /**
+ * This will get the name representing a Unix file.
+ *
+ * @return The file name.
+ */
+ public String getFileUnix()
+ {
+ return fs.getString( "Unix" );
+ }
+
+ /**
+ * This will set name representing a Unix file.
+ *
+ * @param file The name of the file.
+ */
+ public void setFileUnix( String file )
+ {
+ fs.setString( "Unix", file );
+ }
+
+ /**
+ * Tell if the underlying file is volatile and should not be cached by the
+ * reader application. Default: false
+ *
+ * @param fileIsVolatile The new value for the volatility of the file.
+ */
+ public void setVolatile( boolean fileIsVolatile )
+ {
+ fs.setBoolean( "V", fileIsVolatile );
+ }
+
+ /**
+ * Get if the file is volatile. Default: false
+ *
+ * @return True if the file is volatile attribute is set.
+ */
+ public boolean isVolatile()
+ {
+ return fs.getBoolean( "V", false );
+ }
+
+ /**
+ * Get the embedded file.
+ *
+ * @return The embedded file for this file spec.
+ */
+ public PDEmbeddedFile getEmbeddedFile()
+ {
+ PDEmbeddedFile file = null;
+ COSStream stream = (COSStream)fs.getObjectFromPath( "EF/F" );
+ if( stream != null )
+ {
+ file = new PDEmbeddedFile( stream );
+ }
+ return file;
+ }
+
+ /**
+ * Set the embedded file for this spec.
+ *
+ * @param file The file to be embedded.
+ */
+ public void setEmbeddedFile( PDEmbeddedFile file )
+ {
+ COSDictionary ef = (COSDictionary)fs.getDictionaryObject( "EF" );
+ if( ef == null && file != null )
+ {
+ ef = new COSDictionary();
+ fs.setItem( "EF", ef );
+ }
+ if( ef != null )
+ {
+ ef.setItem( "F", file );
+ }
+ }
+
+ /**
+ * Get the embedded dos file.
+ *
+ * @return The embedded file for this file spec.
+ */
+ public PDEmbeddedFile getEmbeddedFileDos()
+ {
+ PDEmbeddedFile file = null;
+ COSStream stream = (COSStream)fs.getObjectFromPath( "EF/DOS" );
+ if( stream != null )
+ {
+ file = new PDEmbeddedFile( stream );
+ }
+ return file;
+ }
+
+ /**
+ * Set the embedded dos file for this spec.
+ *
+ * @param file The dos file to be embedded.
+ */
+ public void setEmbeddedFileDos( PDEmbeddedFile file )
+ {
+ COSDictionary ef = (COSDictionary)fs.getDictionaryObject( "DOS" );
+ if( ef == null && file != null )
+ {
+ ef = new COSDictionary();
+ fs.setItem( "EF", ef );
+ }
+ if( ef != null )
+ {
+ ef.setItem( "DOS", file );
+ }
+ }
+
+ /**
+ * Get the embedded Mac file.
+ *
+ * @return The embedded file for this file spec.
+ */
+ public PDEmbeddedFile getEmbeddedFileMac()
+ {
+ PDEmbeddedFile file = null;
+ COSStream stream = (COSStream)fs.getObjectFromPath( "EF/Mac" );
+ if( stream != null )
+ {
+ file = new PDEmbeddedFile( stream );
+ }
+ return file;
+ }
+
+ /**
+ * Set the embedded Mac file for this spec.
+ *
+ * @param file The Mac file to be embedded.
+ */
+ public void setEmbeddedFileMac( PDEmbeddedFile file )
+ {
+ COSDictionary ef = (COSDictionary)fs.getDictionaryObject( "Mac" );
+ if( ef == null && file != null )
+ {
+ ef = new COSDictionary();
+ fs.setItem( "EF", ef );
+ }
+ if( ef != null )
+ {
+ ef.setItem( "Mac", file );
+ }
+ }
+
+ /**
+ * Get the embedded Unix file.
+ *
+ * @return The embedded file for this file spec.
+ */
+ public PDEmbeddedFile getEmbeddedFileUnix()
+ {
+ PDEmbeddedFile file = null;
+ COSStream stream = (COSStream)fs.getObjectFromPath( "EF/Unix" );
+ if( stream != null )
+ {
+ file = new PDEmbeddedFile( stream );
+ }
+ return file;
+ }
+
+ /**
+ * Set the embedded Unix file for this spec.
+ *
+ * @param file The Unix file to be embedded.
+ */
+ public void setEmbeddedFileUnix( PDEmbeddedFile file )
+ {
+ COSDictionary ef = (COSDictionary)fs.getDictionaryObject( "Unix" );
+ if( ef == null && file != null )
+ {
+ ef = new COSDictionary();
+ fs.setItem( "EF", ef );
+ }
+ if( ef != null )
+ {
+ ef.setItem( "Unix", file );
+ }
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/common/filespecification/PDEmbeddedFile.java b/src/main/java/org/pdfbox/pdmodel/common/filespecification/PDEmbeddedFile.java
new file mode 100644
index 0000000..1f4a288
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/common/filespecification/PDEmbeddedFile.java
@@ -0,0 +1,298 @@
+/**
+ * Copyright (c) 2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.common.filespecification;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Calendar;
+
+import org.pdfbox.cos.COSDictionary;
+import org.pdfbox.cos.COSStream;
+import org.pdfbox.pdmodel.PDDocument;
+import org.pdfbox.pdmodel.common.PDStream;
+
+/**
+ * This represents an embedded file in a file specification.
+ *
+ * @author Ben Litchfield (ben@benlitchfield.com)
+ * @version $Revision: 1.1 $
+ */
+public class PDEmbeddedFile extends PDStream
+{
+
+ /**
+ * @see PDStream#PDStream(PDDocument)
+ */
+ public PDEmbeddedFile( PDDocument document )
+ {
+ super( document );
+ getStream().setName( "Type", "EmbeddedFile" );
+
+ }
+
+ /**
+ * Constructor.
+ *
+ * @param str The stream parameter.
+ */
+ public PDEmbeddedFile( COSStream str )
+ {
+ super( str );
+ }
+
+ /**
+ * @see PDStream#PDStream(PDDocument, InputStream )
+ */
+ public PDEmbeddedFile( PDDocument doc, InputStream str ) throws IOException
+ {
+ super( doc, str );
+ getStream().setName( "Type", "EmbeddedFile" );
+ }
+
+ /**
+ * @see PDStream#PDStream(PDDocument, InputStream, boolean)
+ */
+ public PDEmbeddedFile( PDDocument doc, InputStream str, boolean filtered ) throws IOException
+ {
+ super( doc, str, filtered );
+ getStream().setName( "Type", "EmbeddedFile" );
+ }
+
+ /**
+ * Set the subtype for this embedded file. This should be a mime type value. Optional.
+ *
+ * @param mimeType The mimeType for the file.
+ */
+ public void setSubtype( String mimeType )
+ {
+ getStream().setName( "Subtype", mimeType );
+ }
+
+ /**
+ * Get the subtype(mimetype) for the embedded file.
+ *
+ * @return The type of embedded file.
+ */
+ public String getSubtype()
+ {
+ return getStream().getNameAsString( "Subtype" );
+ }
+
+ /**
+ * Get the size of the embedded file.
+ *
+ * @return The size of the embedded file.
+ */
+ public int getSize()
+ {
+ return getStream().getEmbeddedInt( "Params", "Size" );
+ }
+
+ /**
+ * Set the size of the embedded file.
+ *
+ * @param size The size of the embedded file.
+ */
+ public void setSize( int size )
+ {
+ getStream().setEmbeddedInt( "Params", "Size", size );
+ }
+
+ /**
+ * Get the creation date of the embedded file.
+ *
+ * @return The Creation date.
+ * @throws IOException If there is an error while constructing the date.
+ */
+ public Calendar getCreationDate() throws IOException
+ {
+ return getStream().getEmbeddedDate( "Params", "CreationDate" );
+ }
+
+ /**
+ * Set the creation date.
+ *
+ * @param creation The new creation date.
+ */
+ public void setCreationDate( Calendar creation )
+ {
+ getStream().setEmbeddedDate( "Params", "CreationDate", creation );
+ }
+
+ /**
+ * Get the mod date of the embedded file.
+ *
+ * @return The mod date.
+ * @throws IOException If there is an error while constructing the date.
+ */
+ public Calendar getModDate() throws IOException
+ {
+ return getStream().getEmbeddedDate( "Params", "ModDate" );
+ }
+
+ /**
+ * Set the mod date.
+ *
+ * @param mod The new creation mod.
+ */
+ public void setModDate( Calendar mod )
+ {
+ getStream().setEmbeddedDate( "Params", "ModDate", mod );
+ }
+
+ /**
+ * Get the check sum of the embedded file.
+ *
+ * @return The check sum of the file.
+ */
+ public String getCheckSum()
+ {
+ return getStream().getEmbeddedString( "Params", "CheckSum" );
+ }
+
+ /**
+ * Set the check sum.
+ *
+ * @param checksum The checksum of the file.
+ */
+ public void setCheckSum( String checksum )
+ {
+ getStream().setEmbeddedString( "Params", "CheckSum", checksum );
+ }
+
+ /**
+ * Get the mac subtype.
+ *
+ * @return The mac subtype.
+ */
+ public String getMacSubtype()
+ {
+ String retval = null;
+ COSDictionary params = (COSDictionary)getStream().getDictionaryObject( "Params" );
+ if( params != null )
+ {
+ retval = params.getEmbeddedString( "Mac", "Subtype" );
+ }
+ return retval;
+ }
+
+ /**
+ * Set the mac subtype.
+ *
+ * @param macSubtype The mac subtype.
+ */
+ public void setMacSubtype( String macSubtype )
+ {
+ COSDictionary params = (COSDictionary)getStream().getDictionaryObject( "Params" );
+ if( params == null && macSubtype != null )
+ {
+ params = new COSDictionary();
+ getStream().setItem( "Params", params );
+ }
+ if( params != null )
+ {
+ params.setEmbeddedString( "Mac", "Subtype", macSubtype );
+ }
+ }
+
+ /**
+ * Get the mac Creator.
+ *
+ * @return The mac Creator.
+ */
+ public String getMacCreator()
+ {
+ String retval = null;
+ COSDictionary params = (COSDictionary)getStream().getDictionaryObject( "Params" );
+ if( params != null )
+ {
+ retval = params.getEmbeddedString( "Mac", "Creator" );
+ }
+ return retval;
+ }
+
+ /**
+ * Set the mac Creator.
+ *
+ * @param macCreator The mac Creator.
+ */
+ public void setMacCreator( String macCreator )
+ {
+ COSDictionary params = (COSDictionary)getStream().getDictionaryObject( "Params" );
+ if( params == null && macCreator != null )
+ {
+ params = new COSDictionary();
+ getStream().setItem( "Params", params );
+ }
+ if( params != null )
+ {
+ params.setEmbeddedString( "Mac", "Creator", macCreator );
+ }
+ }
+
+ /**
+ * Get the mac ResFork.
+ *
+ * @return The mac ResFork.
+ */
+ public String getMacResFork()
+ {
+ String retval = null;
+ COSDictionary params = (COSDictionary)getStream().getDictionaryObject( "Params" );
+ if( params != null )
+ {
+ retval = params.getEmbeddedString( "Mac", "ResFork" );
+ }
+ return retval;
+ }
+
+ /**
+ * Set the mac ResFork.
+ *
+ * @param macResFork The mac ResFork.
+ */
+ public void setMacResFork( String macResFork )
+ {
+ COSDictionary params = (COSDictionary)getStream().getDictionaryObject( "Params" );
+ if( params == null && macResFork != null )
+ {
+ params = new COSDictionary();
+ getStream().setItem( "Params", params );
+ }
+ if( params != null )
+ {
+ params.setEmbeddedString( "Mac", "ResFork", macResFork);
+ }
+ }
+
+
+
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/common/filespecification/PDFileSpecification.java b/src/main/java/org/pdfbox/pdmodel/common/filespecification/PDFileSpecification.java
new file mode 100644
index 0000000..2028247
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/common/filespecification/PDFileSpecification.java
@@ -0,0 +1,83 @@
+/**
+ * Copyright (c) 2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.common.filespecification;
+
+import org.pdfbox.cos.COSBase;
+import org.pdfbox.cos.COSDictionary;
+import org.pdfbox.cos.COSString;
+
+import org.pdfbox.pdmodel.common.COSObjectable;
+
+/**
+ * This represents a file specification.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.2 $
+ */
+public abstract class PDFileSpecification implements COSObjectable
+{
+
+ /**
+ * A file specfication can either be a COSString or a COSDictionary. This
+ * will create the file specification either way.
+ *
+ * @param base The cos object that describes the fs.
+ *
+ * @return The file specification for the COSBase object.
+ */
+ public static PDFileSpecification createFS( COSBase base )
+ {
+ PDFileSpecification retval = null;
+ if( base instanceof COSString )
+ {
+ retval = new PDSimpleFileSpecification( (COSString)base );
+ }
+ else if( base instanceof COSDictionary )
+ {
+ retval = new PDComplexFileSpecification( (COSDictionary)base );
+ }
+ return retval;
+ }
+
+ /**
+ * This will get the file name.
+ *
+ * @return The file name.
+ */
+ public abstract String getFile();
+
+ /**
+ * This will set the file name.
+ *
+ * @param file The name of the file.
+ */
+ public abstract void setFile( String file );
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/common/filespecification/PDSimpleFileSpecification.java b/src/main/java/org/pdfbox/pdmodel/common/filespecification/PDSimpleFileSpecification.java
new file mode 100644
index 0000000..b885a78
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/common/filespecification/PDSimpleFileSpecification.java
@@ -0,0 +1,95 @@
+/**
+ * Copyright (c) 2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.common.filespecification;
+
+import org.pdfbox.cos.COSBase;
+import org.pdfbox.cos.COSString;
+
+/**
+ * A file specification that is just a string.
+ *
+ * @author blitchfield
+ * @version $Revision: 1.1 $
+ */
+public class PDSimpleFileSpecification extends PDFileSpecification
+{
+ private COSString file;
+
+ /**
+ * Constructor.
+ *
+ */
+ public PDSimpleFileSpecification()
+ {
+ file = new COSString( "" );
+ }
+
+ /**
+ * Constructor.
+ *
+ * @param fileName The file that this spec represents.
+ */
+ public PDSimpleFileSpecification( COSString fileName )
+ {
+ file = fileName;
+ }
+
+ /**
+ * This will get the file name.
+ *
+ * @return The file name.
+ */
+ public String getFile()
+ {
+ return file.getString();
+ }
+
+ /**
+ * This will set the file name.
+ *
+ * @param fileName The name of the file.
+ */
+ public void setFile( String fileName )
+ {
+ file = new COSString( fileName );
+ }
+
+ /**
+ * Convert this standard java object to a COS object.
+ *
+ * @return The cos object that matches this Java object.
+ */
+ public COSBase getCOSObject()
+ {
+ return file;
+ }
+
+}
diff --git a/src/main/java/org/pdfbox/pdmodel/common/filespecification/package.html b/src/main/java/org/pdfbox/pdmodel/common/filespecification/package.html
new file mode 100644
index 0000000..ca87d22
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/common/filespecification/package.html
@@ -0,0 +1,9 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head>
+
+</head>
+<body>
+The file specification package defines classes that are used for the PDF File Specification logic.
+</body>
+</html>
diff --git a/src/main/java/org/pdfbox/pdmodel/common/package.html b/src/main/java/org/pdfbox/pdmodel/common/package.html
new file mode 100644
index 0000000..9d81599
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/common/package.html
@@ -0,0 +1,9 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head>
+
+</head>
+<body>
+High level PD classes that are used throughout several packages are placed in the PDModel common package.
+</body>
+</html>
diff --git a/src/main/java/org/pdfbox/pdmodel/documentinterchange/logicalstructure/PDMarkInfo.java b/src/main/java/org/pdfbox/pdmodel/documentinterchange/logicalstructure/PDMarkInfo.java
new file mode 100644
index 0000000..47a8ff3
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/documentinterchange/logicalstructure/PDMarkInfo.java
@@ -0,0 +1,149 @@
+/**
+ * Copyright (c) 2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.documentinterchange.logicalstructure;
+
+import org.pdfbox.cos.COSBase;
+import org.pdfbox.cos.COSDictionary;
+import org.pdfbox.pdmodel.common.COSObjectable;
+
+/**
+ * The MarkInfo provides additional information relevant to specialized
+ * uses of structured documents.
+ *
+ * @author Ben Litchfield (ben@benlitchfield.com)
+ * @version $Revision: 1.3 $
+ */
+public class PDMarkInfo implements COSObjectable
+{
+ private COSDictionary dictionary;
+
+ /**
+ * Default Constructor.
+ *
+ */
+ public PDMarkInfo()
+ {
+ dictionary = new COSDictionary();
+ }
+
+ /**
+ * Constructor for an existing MarkInfo element.
+ *
+ * @param dic The existing dictionary.
+ */
+ public PDMarkInfo( COSDictionary dic )
+ {
+ dictionary = dic;
+ }
+
+ /**
+ * Convert this standard java object to a COS object.
+ *
+ * @return The cos object that matches this Java object.
+ */
+ public COSBase getCOSObject()
+ {
+ return dictionary;
+ }
+
+ /**
+ * Convert this standard java object to a COS object.
+ *
+ * @return The cos object that matches this Java object.
+ */
+ public COSDictionary getDictionary()
+ {
+ return dictionary;
+ }
+
+ /**
+ * Tells if this is a tagged PDF.
+ *
+ * @return true If this is a tagged PDF.
+ */
+ public boolean isMarked()
+ {
+ return dictionary.getBoolean( "Marked", false );
+ }
+
+ /**
+ * Set if this is a tagged PDF.
+ *
+ * @param value The new marked value.
+ */
+ public void setMarked( boolean value )
+ {
+ dictionary.setBoolean( "Marked", value );
+ }
+
+ /**
+ * Tells if structure elements use user properties.
+ *
+ * @return A boolean telling if the structure elements use user properties.
+ */
+ public boolean usesUserProperties()
+ {
+ return dictionary.getBoolean( "UserProperties", false );
+ }
+
+ /**
+ * Set if the structure elements contain user properties.
+ *
+ * @param userProps The new value for this property.
+ */
+ public void setUserProperties( boolean userProps )
+ {
+ dictionary.setBoolean( "UserProperties", userProps );
+ }
+
+ /**
+ * Tells if this PDF contain 'suspect' tags. See PDF Reference 1.6
+ * section 10.6 "Logical Structure" for more information about this property.
+ *
+ * @return true if the suspect flag has been set.
+ */
+ public boolean isSuspect()
+ {
+ return dictionary.getBoolean( "Suspects", false );
+ }
+
+ /**
+ * Set the value of the suspects property. See PDF Reference 1.6
+ * section 10.6 "Logical Structure" for more information about this
+ * property.
+ *
+ * @param suspect The new "Suspects" value.
+ */
+ public void setSuspect( boolean suspect )
+ {
+ dictionary.setBoolean( "Suspects", false );
+ }
+}
diff --git a/src/main/java/org/pdfbox/pdmodel/documentinterchange/logicalstructure/PDStructureElement.java b/src/main/java/org/pdfbox/pdmodel/documentinterchange/logicalstructure/PDStructureElement.java
new file mode 100644
index 0000000..9760b1b
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/documentinterchange/logicalstructure/PDStructureElement.java
@@ -0,0 +1,76 @@
+/**
+ * Copyright (c) 2003-2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.documentinterchange.logicalstructure;
+
+import org.pdfbox.cos.COSBase;
+import org.pdfbox.cos.COSDictionary;
+import org.pdfbox.pdmodel.common.COSObjectable;
+
+/**
+ * A structure element.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.1 $
+ */
+public class PDStructureElement implements COSObjectable
+{
+ private COSDictionary dictionary;
+
+ /**
+ * Default Constructor.
+ *
+ */
+ public PDStructureElement()
+ {
+ dictionary = new COSDictionary();
+ }
+
+ /**
+ * Constructor for an existing structure element.
+ *
+ * @param dic The existing dictionary.
+ */
+ public PDStructureElement( COSDictionary dic )
+ {
+ dictionary = dic;
+ }
+
+
+ /**
+ * Convert this standard java object to a COS object.
+ *
+ * @return The cos object that matches this Java object.
+ */
+ public COSBase getCOSObject()
+ {
+ return dictionary;
+ }
+}
diff --git a/src/main/java/org/pdfbox/pdmodel/documentinterchange/logicalstructure/package.html b/src/main/java/org/pdfbox/pdmodel/documentinterchange/logicalstructure/package.html
new file mode 100644
index 0000000..7039586
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/documentinterchange/logicalstructure/package.html
@@ -0,0 +1,10 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head>
+
+</head>
+<body>
+The logical structure package provides a mechanism for incorporating
+structural information about a document's content into a PDF file.
+</body>
+</html>
diff --git a/src/main/java/org/pdfbox/pdmodel/documentinterchange/prepress/PDBoxStyle.java b/src/main/java/org/pdfbox/pdmodel/documentinterchange/prepress/PDBoxStyle.java
new file mode 100644
index 0000000..4f092ef
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/documentinterchange/prepress/PDBoxStyle.java
@@ -0,0 +1,222 @@
+/**
+ * Copyright (c) 2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.documentinterchange.prepress;
+
+import org.pdfbox.cos.COSArray;
+import org.pdfbox.cos.COSBase;
+import org.pdfbox.cos.COSDictionary;
+import org.pdfbox.cos.COSInteger;
+import org.pdfbox.pdmodel.common.COSObjectable;
+import org.pdfbox.pdmodel.graphics.PDLineDashPattern;
+import org.pdfbox.pdmodel.graphics.color.PDColorSpaceInstance;
+import org.pdfbox.pdmodel.graphics.color.PDDeviceRGB;
+
+/**
+ * The Box Style specifies visual characteristics for displaying box areas.
+ *
+ * @author Ben Litchfield (ben@benlitchfield.com)
+ * @version $Revision: 1.2 $
+ */
+public class PDBoxStyle implements COSObjectable
+{
+ /**
+ * Style for guideline.
+ */
+ public static final String GUIDELINE_STYLE_SOLID = "S";
+ /**
+ * Style for guideline.
+ */
+ public static final String GUIDELINE_STYLE_DASHED = "D";
+
+ private COSDictionary dictionary;
+
+ /**
+ * Default Constructor.
+ *
+ */
+ public PDBoxStyle()
+ {
+ dictionary = new COSDictionary();
+ }
+
+ /**
+ * Constructor for an existing BoxStyle element.
+ *
+ * @param dic The existing dictionary.
+ */
+ public PDBoxStyle( COSDictionary dic )
+ {
+ dictionary = dic;
+ }
+
+ /**
+ * Convert this standard java object to a COS object.
+ *
+ * @return The cos object that matches this Java object.
+ */
+ public COSBase getCOSObject()
+ {
+ return dictionary;
+ }
+
+ /**
+ * Convert this standard java object to a COS object.
+ *
+ * @return The cos object that matches this Java object.
+ */
+ public COSDictionary getDictionary()
+ {
+ return dictionary;
+ }
+
+ /**
+ * Get the color to be used for the guidelines. This is guaranteed to
+ * not return null. The color space will always be DeviceRGB and the
+ * default color is [0,0,0].
+ *
+ *@return The guideline color.
+ */
+ public PDColorSpaceInstance getGuidelineColor()
+ {
+ COSArray colorValues = (COSArray)dictionary.getDictionaryObject( "C" );
+ if( colorValues == null )
+ {
+ colorValues = new COSArray();
+ colorValues.add( COSInteger.ZERO );
+ colorValues.add( COSInteger.ZERO );
+ colorValues.add( COSInteger.ZERO );
+ dictionary.setItem( "C", colorValues );
+ }
+ PDColorSpaceInstance instance = new PDColorSpaceInstance( colorValues );
+ instance.setColorSpace( PDDeviceRGB.INSTANCE );
+ return instance;
+ }
+
+ /**
+ * Set the color space instance for this box style. This must be a
+ * PDDeviceRGB!
+ *
+ * @param color The new colorspace value.
+ */
+ public void setGuideLineColor( PDColorSpaceInstance color )
+ {
+ COSArray values = null;
+ if( color != null )
+ {
+ values = color.getCOSColorSpaceValue();
+ }
+ dictionary.setItem( "C", values );
+ }
+
+ /**
+ * Get the width of the of the guideline in default user space units.
+ * The default is 1.
+ *
+ * @return The width of the guideline.
+ */
+ public float getGuidelineWidth()
+ {
+ return dictionary.getFloat( "W", 1 );
+ }
+
+ /**
+ * Set the guideline width.
+ *
+ * @param width The width in default user space units.
+ */
+ public void setGuidelineWidth( float width )
+ {
+ dictionary.setFloat( "W", width );
+ }
+
+ /**
+ * Get the style for the guideline. The default is "S" for solid.
+ *
+ * @return The guideline style.
+ * @see PDBoxStyle#GUIDELINE_STYLE_DASHED
+ * @see PDBoxStyle#GUIDELINE_STYLE_SOLID
+ */
+ public String getGuidelineStyle()
+ {
+ return dictionary.getNameAsString( "S", GUIDELINE_STYLE_SOLID );
+ }
+
+ /**
+ * Set the style for the box.
+ *
+ * @param style The style for the box line.
+ * @see PDBoxStyle#GUIDELINE_STYLE_DASHED
+ * @see PDBoxStyle#GUIDELINE_STYLE_SOLID
+ */
+ public void setGuidelineStyle( String style )
+ {
+ dictionary.setName( "S", style );
+ }
+
+ /**
+ * Get the line dash pattern for this box style. This is guaranteed to not
+ * return null. The default is [3],0.
+ *
+ * @return The line dash pattern.
+ */
+ public PDLineDashPattern getLineDashPattern()
+ {
+ PDLineDashPattern pattern = null;
+ COSArray d = (COSArray)dictionary.getDictionaryObject( "D" );
+ if( d == null )
+ {
+ d = new COSArray();
+ d.add( new COSInteger(3) );
+ dictionary.setItem( "D", d );
+ }
+ COSArray lineArray = new COSArray();
+ lineArray.add( d );
+ //dash phase is not specified and assumed to be zero.
+ lineArray.add( new COSInteger( 0 ) );
+ pattern = new PDLineDashPattern( lineArray );
+ return pattern;
+ }
+
+ /**
+ * Set the line dash pattern associated with this box style.
+ *
+ * @param pattern The patter for this box style.
+ */
+ public void setLineDashPattern( PDLineDashPattern pattern )
+ {
+ COSArray array = null;
+ if( pattern != null )
+ {
+ array = pattern.getCOSDashPattern();
+ }
+ dictionary.setItem( "D", array );
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/documentinterchange/prepress/package.html b/src/main/java/org/pdfbox/pdmodel/documentinterchange/prepress/package.html
new file mode 100644
index 0000000..8285a3f
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/documentinterchange/prepress/package.html
@@ -0,0 +1,9 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head>
+
+</head>
+<body>
+This package contains classes for prepress support in PDFBox.
+</body>
+</html>
diff --git a/src/main/java/org/pdfbox/pdmodel/edit/PDPageContentStream.java b/src/main/java/org/pdfbox/pdmodel/edit/PDPageContentStream.java
new file mode 100644
index 0000000..1e3b25f
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/edit/PDPageContentStream.java
@@ -0,0 +1,648 @@
+/**
+ * Copyright (c) 2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.edit;
+
+import java.awt.Color;
+import java.awt.color.ColorSpace;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+
+import java.text.NumberFormat;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.HashMap;
+
+import org.pdfbox.pdmodel.PDDocument;
+import org.pdfbox.pdmodel.PDPage;
+import org.pdfbox.pdmodel.PDResources;
+
+import org.pdfbox.pdmodel.common.COSStreamArray;
+import org.pdfbox.pdmodel.common.PDStream;
+
+import org.pdfbox.pdmodel.font.PDFont;
+import org.pdfbox.pdmodel.graphics.xobject.PDXObjectImage;
+
+import org.pdfbox.cos.COSArray;
+import org.pdfbox.cos.COSName;
+import org.pdfbox.cos.COSString;
+
+
+/**
+ * This class will is a convenience for creating page content streams. You MUST
+ * call close() when you are finished with this object.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.14 $
+ */
+public class PDPageContentStream
+{
+ private PDPage page;
+ private OutputStream output;
+ private boolean inTextMode = false;
+ private Map fontMappings = new HashMap();
+ private Map imageMappings = new HashMap();
+ private int fontNumber = 1;
+ private int imageNumber = 1;
+ private PDResources resources;
+
+ //cached storage component for getting color values
+ private float[] colorComponents = new float[4];
+
+ private NumberFormat formatDecimal = NumberFormat.getNumberInstance( Locale.US );
+
+ private static final String BEGIN_TEXT = "BT\n";
+ private static final String END_TEXT = "ET\n";
+ private static final String SET_FONT = "Tf\n";
+ private static final String MOVE_TEXT_POSITION = "Td\n";
+ private static final String SHOW_TEXT = "Tj\n";
+
+ private static final String SAVE_GRAPHICS_STATE = "q\n";
+ private static final String RESTORE_GRAPHICS_STATE = "Q\n";
+ private static final String CONCATENATE_MATRIX = "cm\n";
+ private static final String XOBJECT_DO = "Do\n";
+ private static final String RG_STROKING = "RG\n";
+ private static final String RG_NON_STROKING = "rg\n";
+ private static final String K_STROKING = "K\n";
+ private static final String K_NON_STROKING = "k\n";
+ private static final String G_STROKING = "G\n";
+ private static final String G_NON_STROKING = "g\n";
+ private static final String APPEND_RECTANGLE = "re\n";
+ private static final String FILL = "f\n";
+
+
+ private static final int SPACE = 32;
+
+
+ /**
+ * Create a new PDPage content stream.
+ *
+ * @param document The document the page is part of.
+ * @param sourcePage The page to write the contents to.
+ * @throws IOException If there is an error writing to the page contents.
+ */
+ public PDPageContentStream( PDDocument document, PDPage sourcePage ) throws IOException
+ {
+ this(document,sourcePage,false,true);
+ }
+
+ /**
+ * Create a new PDPage content stream.
+ *
+ * @param document The document the page is part of.
+ * @param sourcePage The page to write the contents to.
+ * @param appendContent Indicates whether content will be overwritten. If false all previous content is deleted.
+ * @param compress Tell if the content stream should compress the page contents.
+ * @throws IOException If there is an error writing to the page contents.
+ */
+ public PDPageContentStream( PDDocument document, PDPage sourcePage, boolean appendContent, boolean compress )
+ throws IOException
+ {
+ page = sourcePage;
+ resources = page.getResources();
+ if( resources == null )
+ {
+ resources = new PDResources();
+ page.setResources( resources );
+ }
+ // If request specifies the need to append to the document
+ if(appendContent)
+ {
+ // Get the pdstream from the source page instead of creating a new one
+ PDStream contents = sourcePage.getContents();
+
+ // Create a pdstream to append new content
+ PDStream contentsToAppend = new PDStream( document );
+
+ // This will be the resulting COSStreamArray after existing and new streams are merged
+ COSStreamArray compoundStream = null;
+
+ // If contents is already an array, a new stream is simply appended to it
+ if(contents.getStream() instanceof COSStreamArray)
+ {
+ compoundStream = (COSStreamArray)contents.getStream();
+ compoundStream.appendStream( contentsToAppend.getStream());
+ }
+ else
+ {
+ // Creates the COSStreamArray and adds the current stream plus a new one to it
+ COSArray newArray = new COSArray();
+ newArray.add(contents.getCOSObject());
+ newArray.add(contentsToAppend.getCOSObject());
+ compoundStream = new COSStreamArray(newArray);
+ }
+
+ if( compress )
+ {
+ List filters = new ArrayList();
+ filters.add( COSName.FLATE_DECODE );
+ contentsToAppend.setFilters( filters );
+ }
+
+ // Sets the compoundStream as page contents
+ sourcePage.setContents( new PDStream(compoundStream) );
+ output = contentsToAppend.createOutputStream();
+ }
+ else
+ {
+ PDStream contents = new PDStream( document );
+ if( compress )
+ {
+ List filters = new ArrayList();
+ filters.add( COSName.FLATE_DECODE );
+ contents.setFilters( filters );
+ }
+ sourcePage.setContents( contents );
+ output = contents.createOutputStream();
+ }
+ formatDecimal.setMaximumFractionDigits( 10 );
+ formatDecimal.setGroupingUsed( false );
+ }
+
+ /**
+ * Begin some text operations.
+ *
+ * @throws IOException If there is an error writing to the stream or if you attempt to
+ * nest beginText calls.
+ */
+ public void beginText() throws IOException
+ {
+ if( inTextMode )
+ {
+ throw new IOException( "Error: Nested beginText() calls are not allowed." );
+ }
+ appendRawCommands( BEGIN_TEXT );
+ inTextMode = true;
+ }
+
+ /**
+ * End some text operations.
+ *
+ * @throws IOException If there is an error writing to the stream or if you attempt to
+ * nest endText calls.
+ */
+ public void endText() throws IOException
+ {
+ if( !inTextMode )
+ {
+ throw new IOException( "Error: You must call beginText() before calling endText." );
+ }
+ appendRawCommands( END_TEXT );
+ inTextMode = false;
+ }
+
+ /**
+ * Set the font to draw text with.
+ *
+ * @param font The font to use.
+ * @param fontSize The font size to draw the text.
+ * @throws IOException If there is an error writing the font information.
+ */
+ public void setFont( PDFont font, float fontSize ) throws IOException
+ {
+ String fontMapping = (String)fontMappings.get( font );
+ if( fontMapping == null )
+ {
+ fontMapping = "F" + fontNumber++;
+ fontMappings.put( font, fontMapping );
+ resources.getFonts().put( fontMapping, font );
+ }
+ appendRawCommands( "/");
+ appendRawCommands( fontMapping );
+ appendRawCommands( SPACE );
+ appendRawCommands( formatDecimal.format( fontSize ) );
+ appendRawCommands( SPACE );
+ appendRawCommands( SET_FONT );
+ }
+
+ /**
+ * Draw an image at the x,y coordinates, with the default size of the image.
+ *
+ * @param image The image to draw.
+ * @param x The x-coordinate to draw the image.
+ * @param y The y-coordinate to draw the image.
+ *
+ * @throws IOException If there is an error writing to the stream.
+ */
+ public void drawImage( PDXObjectImage image, int x, int y ) throws IOException
+ {
+ drawImage( image, x, y, image.getWidth(), image.getHeight() );
+ }
+
+ /**
+ * Draw an image at the x,y coordinates and a certain width and height.
+ *
+ * @param image The image to draw.
+ * @param x The x-coordinate to draw the image.
+ * @param y The y-coordinate to draw the image.
+ * @param width The width of the image to draw.
+ * @param height The height of the image to draw.
+ *
+ * @throws IOException If there is an error writing to the stream.
+ */
+ public void drawImage( PDXObjectImage image, int x, int y, int width, int height ) throws IOException
+ {
+ String imageMapping = (String)imageMappings.get( image );
+ if( imageMapping == null )
+ {
+ imageMapping = "Im" + imageNumber++;
+ imageMappings.put( image, imageMapping );
+ resources.getImages().put( imageMapping, image );
+ }
+ appendRawCommands( SAVE_GRAPHICS_STATE );
+ appendRawCommands( formatDecimal.format( width ) );
+ appendRawCommands( SPACE );
+ appendRawCommands( formatDecimal.format( 0 ) );
+ appendRawCommands( SPACE );
+ appendRawCommands( formatDecimal.format( 0 ) );
+ appendRawCommands( SPACE );
+ appendRawCommands( formatDecimal.format( height ) );
+ appendRawCommands( SPACE );
+ appendRawCommands( formatDecimal.format( x ) );
+ appendRawCommands( SPACE );
+ appendRawCommands( formatDecimal.format( y ) );
+ appendRawCommands( SPACE );
+ appendRawCommands( CONCATENATE_MATRIX );
+ appendRawCommands( SPACE );
+ appendRawCommands( "/" );
+ appendRawCommands( imageMapping );
+ appendRawCommands( SPACE );
+ appendRawCommands( XOBJECT_DO );
+ appendRawCommands( SPACE );
+ appendRawCommands( RESTORE_GRAPHICS_STATE );
+ }
+
+ /**
+ * The Td operator.
+ * @param x The x coordinate.
+ * @param y The y coordinate.
+ * @throws IOException If there is an error writing to the stream.
+ */
+ public void moveTextPositionByAmount( float x, float y ) throws IOException
+ {
+ if( !inTextMode )
+ {
+ throw new IOException( "Error: must call beginText() before moveTextPositionByAmount");
+ }
+ appendRawCommands( formatDecimal.format( x ) );
+ appendRawCommands( SPACE );
+ appendRawCommands( formatDecimal.format( y ) );
+ appendRawCommands( SPACE );
+ appendRawCommands( MOVE_TEXT_POSITION );
+ }
+
+ /**
+ * This will draw a string at the current location on the screen.
+ *
+ * @param text The text to draw.
+ * @throws IOException If an io exception occurs.
+ */
+ public void drawString( String text ) throws IOException
+ {
+ if( !inTextMode )
+ {
+ throw new IOException( "Error: must call beginText() before drawString");
+ }
+ COSString string = new COSString( text );
+ ByteArrayOutputStream buffer = new ByteArrayOutputStream();
+ string.writePDF( buffer );
+ appendRawCommands( new String( buffer.toByteArray(), "ISO-8859-1"));
+ appendRawCommands( SPACE );
+ appendRawCommands( SHOW_TEXT );
+ }
+
+ /**
+ * Set the stroking color, specified as RGB.
+ *
+ * @param color The color to set.
+ * @throws IOException If an IO error occurs while writing to the stream.
+ */
+ public void setStrokingColor( Color color ) throws IOException
+ {
+ ColorSpace colorSpace = color.getColorSpace();
+ if( colorSpace.getType() == ColorSpace.TYPE_RGB )
+ {
+ setStrokingColor( color.getRed(), color.getGreen(), color.getBlue() );
+ }
+ else if( colorSpace.getType() == ColorSpace.TYPE_GRAY )
+ {
+ color.getColorComponents( colorComponents );
+ setStrokingColor( colorComponents[0] );
+ }
+ else if( colorSpace.getType() == ColorSpace.TYPE_CMYK )
+ {
+ color.getColorComponents( colorComponents );
+ setStrokingColor( colorComponents[0], colorComponents[2], colorComponents[2], colorComponents[3] );
+ }
+ else
+ {
+ throw new IOException( "Error: unknown colorspace:" + colorSpace );
+ }
+ }
+
+ /**
+ * Set the non stroking color, specified as RGB.
+ *
+ * @param color The color to set.
+ * @throws IOException If an IO error occurs while writing to the stream.
+ */
+ public void setNonStrokingColor( Color color ) throws IOException
+ {
+ ColorSpace colorSpace = color.getColorSpace();
+ if( colorSpace.getType() == ColorSpace.TYPE_RGB )
+ {
+ setNonStrokingColor( color.getRed(), color.getGreen(), color.getBlue() );
+ }
+ else if( colorSpace.getType() == ColorSpace.TYPE_GRAY )
+ {
+ color.getColorComponents( colorComponents );
+ setNonStrokingColor( colorComponents[0] );
+ }
+ else if( colorSpace.getType() == ColorSpace.TYPE_CMYK )
+ {
+ color.getColorComponents( colorComponents );
+ setNonStrokingColor( colorComponents[0], colorComponents[2], colorComponents[2], colorComponents[3] );
+ }
+ else
+ {
+ throw new IOException( "Error: unknown colorspace:" + colorSpace );
+ }
+ }
+
+ /**
+ * Set the stroking color, specified as RGB, 0-255.
+ *
+ * @param r The red value.
+ * @param g The green value.
+ * @param b The blue value.
+ * @throws IOException If an IO error occurs while writing to the stream.
+ */
+ public void setStrokingColor( int r, int g, int b ) throws IOException
+ {
+ appendRawCommands( formatDecimal.format( r/255d ) );
+ appendRawCommands( SPACE );
+ appendRawCommands( formatDecimal.format( g/255d ) );
+ appendRawCommands( SPACE );
+ appendRawCommands( formatDecimal.format( b/255d ) );
+ appendRawCommands( SPACE );
+ appendRawCommands( RG_STROKING );
+ }
+
+ /**
+ * Set the stroking color, specified as CMYK, 0-255.
+ *
+ * @param c The cyan value.
+ * @param m The magenta value.
+ * @param y The yellow value.
+ * @param k The black value.
+ * @throws IOException If an IO error occurs while writing to the stream.
+ */
+ public void setStrokingColor( int c, int m, int y, int k) throws IOException
+ {
+ appendRawCommands( formatDecimal.format( c/255d ) );
+ appendRawCommands( SPACE );
+ appendRawCommands( formatDecimal.format( m/255d ) );
+ appendRawCommands( SPACE );
+ appendRawCommands( formatDecimal.format( y/255d ) );
+ appendRawCommands( SPACE );
+ appendRawCommands( formatDecimal.format( k/255d ) );
+ appendRawCommands( SPACE );
+ appendRawCommands( K_STROKING );
+ }
+
+ /**
+ * Set the stroking color, specified as CMYK, 0.0-1.0.
+ *
+ * @param c The cyan value.
+ * @param m The magenta value.
+ * @param y The yellow value.
+ * @param k The black value.
+ * @throws IOException If an IO error occurs while writing to the stream.
+ */
+ public void setStrokingColor( double c, double m, double y, double k) throws IOException
+ {
+ appendRawCommands( formatDecimal.format( c ) );
+ appendRawCommands( SPACE );
+ appendRawCommands( formatDecimal.format( m ) );
+ appendRawCommands( SPACE );
+ appendRawCommands( formatDecimal.format( y ) );
+ appendRawCommands( SPACE );
+ appendRawCommands( formatDecimal.format( k ) );
+ appendRawCommands( SPACE );
+ appendRawCommands( K_STROKING );
+ }
+
+ /**
+ * Set the stroking color, specified as grayscale, 0-255.
+ *
+ * @param g The gray value.
+ * @throws IOException If an IO error occurs while writing to the stream.
+ */
+ public void setStrokingColor( int g ) throws IOException
+ {
+ appendRawCommands( formatDecimal.format( g/255d ) );
+ appendRawCommands( SPACE );
+ appendRawCommands( G_STROKING );
+ }
+
+ /**
+ * Set the stroking color, specified as Grayscale 0.0-1.0.
+ *
+ * @param g The gray value.
+ * @throws IOException If an IO error occurs while writing to the stream.
+ */
+ public void setStrokingColor( double g ) throws IOException
+ {
+ appendRawCommands( formatDecimal.format( g ) );
+ appendRawCommands( SPACE );
+ appendRawCommands( G_STROKING );
+ }
+
+ /**
+ * Set the non stroking color, specified as RGB, 0-255.
+ *
+ * @param r The red value.
+ * @param g The green value.
+ * @param b The blue value.
+ * @throws IOException If an IO error occurs while writing to the stream.
+ */
+ public void setNonStrokingColor( int r, int g, int b ) throws IOException
+ {
+ appendRawCommands( formatDecimal.format( r/255d ) );
+ appendRawCommands( SPACE );
+ appendRawCommands( formatDecimal.format( g/255d ) );
+ appendRawCommands( SPACE );
+ appendRawCommands( formatDecimal.format( b/255d ) );
+ appendRawCommands( SPACE );
+ appendRawCommands( RG_NON_STROKING );
+ }
+
+ /**
+ * Set the non stroking color, specified as CMYK, 0-255.
+ *
+ * @param c The cyan value.
+ * @param m The magenta value.
+ * @param y The yellow value.
+ * @param k The black value.
+ * @throws IOException If an IO error occurs while writing to the stream.
+ */
+ public void setNonStrokingColor( int c, int m, int y, int k) throws IOException
+ {
+ appendRawCommands( formatDecimal.format( c/255d ) );
+ appendRawCommands( SPACE );
+ appendRawCommands( formatDecimal.format( m/255d ) );
+ appendRawCommands( SPACE );
+ appendRawCommands( formatDecimal.format( y/255d ) );
+ appendRawCommands( SPACE );
+ appendRawCommands( formatDecimal.format( k/255d ) );
+ appendRawCommands( SPACE );
+ appendRawCommands( K_NON_STROKING );
+ }
+
+ /**
+ * Set the non stroking color, specified as CMYK, 0.0-1.0.
+ *
+ * @param c The cyan value.
+ * @param m The magenta value.
+ * @param y The yellow value.
+ * @param k The black value.
+ * @throws IOException If an IO error occurs while writing to the stream.
+ */
+ public void setNonStrokingColor( double c, double m, double y, double k) throws IOException
+ {
+ appendRawCommands( formatDecimal.format( c ) );
+ appendRawCommands( SPACE );
+ appendRawCommands( formatDecimal.format( m ) );
+ appendRawCommands( SPACE );
+ appendRawCommands( formatDecimal.format( y ) );
+ appendRawCommands( SPACE );
+ appendRawCommands( formatDecimal.format( k ) );
+ appendRawCommands( SPACE );
+ appendRawCommands( K_NON_STROKING );
+ }
+
+ /**
+ * Set the non stroking color, specified as grayscale, 0-255.
+ *
+ * @param g The gray value.
+ * @throws IOException If an IO error occurs while writing to the stream.
+ */
+ public void setNonStrokingColor( int g ) throws IOException
+ {
+ appendRawCommands( formatDecimal.format( g/255d ) );
+ appendRawCommands( SPACE );
+ appendRawCommands( G_NON_STROKING );
+ }
+
+ /**
+ * Set the non stroking color, specified as Grayscale 0.0-1.0.
+ *
+ * @param g The gray value.
+ * @throws IOException If an IO error occurs while writing to the stream.
+ */
+ public void setNonStrokingColor( double g ) throws IOException
+ {
+ appendRawCommands( formatDecimal.format( g ) );
+ appendRawCommands( SPACE );
+ appendRawCommands( G_NON_STROKING );
+ }
+
+ /**
+ * Draw a rectangle on the page using the current non stroking color.
+ *
+ * @param x The lower left x coordinate.
+ * @param y The lower left y coordinate.
+ * @param width The width of the rectangle.
+ * @param height The height of the rectangle.
+ * @throws IOException If there is an error while drawing on the screen.
+ */
+ public void fillRect( float x, float y, float width, float height ) throws IOException
+ {
+ appendRawCommands( formatDecimal.format( x ) );
+ appendRawCommands( SPACE );
+ appendRawCommands( formatDecimal.format( y ) );
+ appendRawCommands( SPACE );
+ appendRawCommands( formatDecimal.format( width ) );
+ appendRawCommands( SPACE );
+ appendRawCommands( formatDecimal.format( height ) );
+ appendRawCommands( SPACE );
+ appendRawCommands( APPEND_RECTANGLE );
+ appendRawCommands( FILL );
+ }
+
+
+ /**
+ * This will append raw commands to the content stream.
+ *
+ * @param commands The commands to append to the stream.
+ * @throws IOException If an error occurs while writing to the stream.
+ */
+ public void appendRawCommands( String commands ) throws IOException
+ {
+ appendRawCommands( commands.getBytes( "ISO-8859-1" ) );
+ }
+
+ /**
+ * This will append raw commands to the content stream.
+ *
+ * @param commands The commands to append to the stream.
+ * @throws IOException If an error occurs while writing to the stream.
+ */
+ public void appendRawCommands( byte[] commands ) throws IOException
+ {
+ output.write( commands );
+ }
+
+ /**
+ * This will append raw commands to the content stream.
+ *
+ * @param data Append a raw byte to the stream.
+ *
+ * @throws IOException If an error occurs while writing to the stream.
+ */
+ public void appendRawCommands( int data ) throws IOException
+ {
+ output.write( data );
+ }
+
+ /**
+ * Close the content stream. This must be called when you are done with this
+ * object.
+ * @throws IOException If the underlying stream has a problem being written to.
+ */
+ public void close() throws IOException
+ {
+ output.close();
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/edit/package.html b/src/main/java/org/pdfbox/pdmodel/edit/package.html
new file mode 100644
index 0000000..f6b0ffd
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/edit/package.html
@@ -0,0 +1,9 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head>
+
+</head>
+<body>
+The PDModel edit package will be used to store classes for creating page content.
+</body>
+</html>
diff --git a/src/main/java/org/pdfbox/pdmodel/encryption/PDEncryptionDictionary.java b/src/main/java/org/pdfbox/pdmodel/encryption/PDEncryptionDictionary.java
new file mode 100644
index 0000000..08f18fb
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/encryption/PDEncryptionDictionary.java
@@ -0,0 +1,193 @@
+/**
+ * Copyright (c) 2003, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.encryption;
+
+import org.pdfbox.cos.COSDictionary;
+import org.pdfbox.cos.COSInteger;
+import org.pdfbox.cos.COSName;
+import org.pdfbox.cos.COSNumber;
+
+/**
+ * This represents the base class for encryption dictionaries. All PDF implementations
+ * are expected to implement the Standard encryption algorithm, but others can be plugged in.
+ *
+ * See PDF Reference 1.4 section "3.5 Encryption"
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.5 $
+ */
+public abstract class PDEncryptionDictionary
+{
+ /**
+ * See PDF Reference 1.4 Table 3.13.
+ */
+ public static final int VERSION0_UNDOCUMENTED_UNSUPPORTED = 0;
+ /**
+ * See PDF Reference 1.4 Table 3.13.
+ */
+ public static final int VERSION1_40_BIT_ALGORITHM = 1;
+ /**
+ * See PDF Reference 1.4 Table 3.13.
+ */
+ public static final int VERSION2_VARIABLE_LENGTH_ALGORITHM = 2;
+ /**
+ * See PDF Reference 1.4 Table 3.13.
+ */
+ public static final int VERSION3_UNPUBLISHED_ALGORITHM = 3;
+ /**
+ * See PDF Reference 1.4 Table 3.13.
+ */
+ public static final int VERSION4_SECURITY_HANDLER = 4;
+
+ /**
+ * The default security handler.
+ */
+ public static final String DEFAULT_NAME = "Standard";
+
+ /**
+ * The default length for the encryption key.
+ */
+ public static final int DEFAULT_LENGTH = 40;
+
+ /**
+ * The default version, according to the PDF Reference.
+ */
+ public static final int DEFAULT_VERSION = VERSION0_UNDOCUMENTED_UNSUPPORTED;
+
+ /**
+ * The cos model wrapped object.
+ */
+ protected COSDictionary encryptionDictionary = null;
+
+ /**
+ * Constructor.
+ *
+ * @param dictionary The pre-existing encryption dictionary.
+ */
+ protected PDEncryptionDictionary( COSDictionary dictionary )
+ {
+ encryptionDictionary = dictionary;
+ }
+
+ /**
+ * Constructor, sub classes need to fill out the required fields.
+ */
+ protected PDEncryptionDictionary()
+ {
+ encryptionDictionary = new COSDictionary();
+ setLength( DEFAULT_LENGTH );
+ setVersion( DEFAULT_VERSION );
+ }
+
+ /**
+ * This will get the dictionary associated with this encryption dictionary.
+ *
+ * @return The COS dictionary that this object wraps.
+ */
+ public COSDictionary getCOSDictionary()
+ {
+ return encryptionDictionary;
+ }
+
+ /**
+ * Read-only field of the encryption filter name. The default value is
+ * "Standard" for the built in security handler.
+ *
+ * @return The name of the encryption handler.
+ */
+ public String getFilter()
+ {
+ String filter = DEFAULT_NAME;
+ COSName cosFilter = (COSName)encryptionDictionary.getDictionaryObject( COSName.FILTER );
+ if( cosFilter != null )
+ {
+ filter = cosFilter.getName();
+ }
+ return filter;
+ }
+
+ /**
+ * This will return the V entry of the encryption dictionary.<br /><br />
+ * See PDF Reference 1.4 Table 3.13.
+ *
+ * @return The encryption version to use.
+ */
+ public int getVersion()
+ {
+ int version = DEFAULT_VERSION;
+ COSNumber cosVersion = (COSNumber)encryptionDictionary.getDictionaryObject( COSName.getPDFName( "V" ) );
+ if( cosVersion != null )
+ {
+ version = cosVersion.intValue();
+ }
+ return version;
+ }
+
+ /**
+ * This will set the V entry of the encryption dictionary.<br /><br />
+ * See PDF Reference 1.4 Table 3.13. <br /><br/>
+ * <b>Note: This value is used to decrypt the pdf document. If you change this when
+ * the document is encrypted then decryption will fail!.</b>
+ *
+ * @param version The new encryption version.
+ */
+ public void setVersion( int version )
+ {
+ encryptionDictionary.setItem( COSName.getPDFName( "V" ), new COSInteger( version ) );
+ }
+
+ /**
+ * This will return the Length entry of the encryption dictionary.<br /><br />
+ * The length in <b>bits</b> for the encryption algorithm. This will return a multiple of 8.
+ *
+ * @return The length in bits for the encryption algorithm
+ */
+ public int getLength()
+ {
+ int length = DEFAULT_LENGTH;
+ COSNumber cosLength = (COSNumber)encryptionDictionary.getDictionaryObject( COSName.LENGTH );
+ if( cosLength != null )
+ {
+ length = cosLength.intValue();
+ }
+ return length;
+ }
+
+ /**
+ * This will set the number of bits to use for the encryption algorithm.
+ *
+ * @param length The new key length.
+ */
+ public void setLength( int length )
+ {
+ encryptionDictionary.setItem( COSName.LENGTH, new COSInteger( length ) );
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/encryption/PDEncryptionManager.java b/src/main/java/org/pdfbox/pdmodel/encryption/PDEncryptionManager.java
new file mode 100644
index 0000000..9dfc36e
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/encryption/PDEncryptionManager.java
@@ -0,0 +1,131 @@
+/**
+ * Copyright (c) 2003-2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.encryption;
+
+import org.pdfbox.cos.COSDictionary;
+import org.pdfbox.cos.COSName;
+import java.io.IOException;
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * This class will handle loading of the different security handlers.
+ *
+ * See PDF Reference 1.4 section "3.5 Encryption"
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.5 $
+ */
+public class PDEncryptionManager
+{
+ private static Map handlerMap = Collections.synchronizedMap( new HashMap() );
+
+ static
+ {
+ registerSecurityHandler( PDStandardEncryption.FILTER_NAME, PDStandardEncryption.class );
+ }
+
+ private PDEncryptionManager()
+ {
+ }
+
+ /**
+ * This will allow the user to register new security handlers when unencrypting a
+ * document.
+ *
+ * @param filterName As described in the encryption dictionary.
+ * @param handlerClass A subclass of PDEncryptionDictionary that has a constructor that takes
+ * a COSDictionary.
+ */
+ public static void registerSecurityHandler( String filterName, Class handlerClass )
+ {
+ handlerMap.put( COSName.getPDFName( filterName ), handlerClass );
+ }
+
+ /**
+ * This will get the correct security handler for the encryption dictionary.
+ *
+ * @param dictionary The encryption dictionary.
+ *
+ * @return An implementation of PDEncryptionDictionary(PDStandardEncryption for most cases).
+ *
+ * @throws IOException If a security handler could not be found.
+ */
+ public static PDEncryptionDictionary getEncryptionDictionary( COSDictionary dictionary )
+ throws IOException
+ {
+ Object retval = null;
+ if( dictionary != null )
+ {
+ COSName filter = (COSName)dictionary.getDictionaryObject( COSName.FILTER );
+ Class handlerClass = (Class)handlerMap.get( filter );
+ if( handlerClass == null )
+ {
+ throw new IOException( "No handler for security handler '" + filter.getName() + "'" );
+ }
+ else
+ {
+ try
+ {
+ Constructor ctor = handlerClass.getConstructor( new Class[] {
+ COSDictionary.class
+ } );
+ retval = ctor.newInstance( new Object[] {
+ dictionary
+ } );
+ }
+ catch( NoSuchMethodException e )
+ {
+ throw new IOException( e.getMessage() );
+ }
+ catch( InstantiationException e )
+ {
+ throw new IOException( e.getMessage() );
+ }
+ catch( IllegalAccessException e )
+ {
+ throw new IOException( e.getMessage() );
+ }
+ catch( InvocationTargetException e )
+ {
+ throw new IOException( e.getMessage() );
+ }
+ }
+ }
+ return (PDEncryptionDictionary)retval;
+
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/encryption/PDStandardEncryption.java b/src/main/java/org/pdfbox/pdmodel/encryption/PDStandardEncryption.java
new file mode 100644
index 0000000..5b3be3b
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/encryption/PDStandardEncryption.java
@@ -0,0 +1,416 @@
+/**
+ * Copyright (c) 2003, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.encryption;
+
+import org.pdfbox.cos.COSDictionary;
+import org.pdfbox.cos.COSInteger;
+import org.pdfbox.cos.COSName;
+import org.pdfbox.cos.COSNumber;
+import org.pdfbox.cos.COSString;
+
+import java.io.IOException;
+
+/**
+ * This class holds information that is related to the standard PDF encryption.
+ *
+ * See PDF Reference 1.4 section "3.5 Encryption"
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.5 $
+ */
+public class PDStandardEncryption extends PDEncryptionDictionary
+{
+ /**
+ * The 'Filter' name for this security handler.
+ */
+ public static final String FILTER_NAME = "Standard";
+
+ /**
+ * The default revision of one is not specified.
+ */
+ public static final int DEFAULT_REVISION = 3;
+
+ /**
+ * Encryption revision 2.
+ */
+ public static final int REVISION2 = 2;
+ /**
+ * Encryption revision 3.
+ */
+ public static final int REVISION3 = 3;
+ /**
+ * Encryption revision 4.
+ */
+ public static final int REVISION4 = 4;
+
+ /**
+ * The default set of permissions which is to allow all.
+ */
+ public static final int DEFAULT_PERMISSIONS = 0xFFFFFFFF ^ 3;//bits 0 & 1 need to be zero
+
+ private static final int PRINT_BIT = 3;
+ private static final int MODIFICATION_BIT = 4;
+ private static final int EXTRACT_BIT = 5;
+ private static final int MODIFY_ANNOTATIONS_BIT = 6;
+ private static final int FILL_IN_FORM_BIT = 9;
+ private static final int EXTRACT_FOR_ACCESSIBILITY_BIT = 10;
+ private static final int ASSEMBLE_DOCUMENT_BIT = 11;
+ private static final int DEGRADED_PRINT_BIT = 12;
+
+ /**
+ * Default constructor that uses Version 2, Revision 3, 40 bit encryption,
+ * all permissions allowed.
+ */
+ public PDStandardEncryption()
+ {
+ super();
+ encryptionDictionary.setItem( COSName.FILTER, COSName.getPDFName( FILTER_NAME ) );
+ setVersion( PDEncryptionDictionary.VERSION1_40_BIT_ALGORITHM );
+ setRevision( PDStandardEncryption.REVISION2 );
+ setPermissions( DEFAULT_PERMISSIONS );
+ }
+
+ /**
+ * Constructor from existing dictionary.
+ *
+ * @param dict The existing encryption dictionary.
+ */
+ public PDStandardEncryption( COSDictionary dict )
+ {
+ super( dict );
+ }
+
+ /**
+ * This will return the R entry of the encryption dictionary.<br /><br />
+ * See PDF Reference 1.4 Table 3.14.
+ *
+ * @return The encryption revision to use.
+ */
+ public int getRevision()
+ {
+ int revision = DEFAULT_VERSION;
+ COSNumber cosRevision = (COSNumber)encryptionDictionary.getDictionaryObject( COSName.getPDFName( "R" ) );
+ if( cosRevision != null )
+ {
+ revision = cosRevision.intValue();
+ }
+ return revision;
+ }
+
+ /**
+ * This will set the R entry of the encryption dictionary.<br /><br />
+ * See PDF Reference 1.4 Table 3.14. <br /><br/>
+ *
+ * <b>Note: This value is used to decrypt the pdf document. If you change this when
+ * the document is encrypted then decryption will fail!.</b>
+ *
+ * @param revision The new encryption version.
+ */
+ public void setRevision( int revision )
+ {
+ encryptionDictionary.setItem( COSName.getPDFName( "R" ), new COSInteger( revision ) );
+ }
+
+ /**
+ * This will get the O entry in the standard encryption dictionary.
+ *
+ * @return A 32 byte array or null if there is no owner key.
+ */
+ public byte[] getOwnerKey()
+ {
+ byte[] o = null;
+ COSString owner = (COSString)encryptionDictionary.getDictionaryObject( COSName.getPDFName( "O" ) );
+ if( owner != null )
+ {
+ o = owner.getBytes();
+ }
+ return o;
+ }
+
+ /**
+ * This will set the O entry in the standard encryption dictionary.
+ *
+ * @param o A 32 byte array or null if there is no owner key.
+ *
+ * @throws IOException If there is an error setting the data.
+ */
+ public void setOwnerKey( byte[] o ) throws IOException
+ {
+ COSString owner = new COSString();
+ owner.append( o );
+ encryptionDictionary.setItem( COSName.getPDFName( "O" ), owner );
+ }
+
+ /**
+ * This will get the U entry in the standard encryption dictionary.
+ *
+ * @return A 32 byte array or null if there is no user key.
+ */
+ public byte[] getUserKey()
+ {
+ byte[] u = null;
+ COSString user = (COSString)encryptionDictionary.getDictionaryObject( COSName.getPDFName( "U" ) );
+ if( user != null )
+ {
+ u = user.getBytes();
+ }
+ return u;
+ }
+
+ /**
+ * This will set the U entry in the standard encryption dictionary.
+ *
+ * @param u A 32 byte array.
+ *
+ * @throws IOException If there is an error setting the data.
+ */
+ public void setUserKey( byte[] u ) throws IOException
+ {
+ COSString user = new COSString();
+ user.append( u );
+ encryptionDictionary.setItem( COSName.getPDFName( "U" ), user );
+ }
+
+ /**
+ * This will get the permissions bit mask.
+ *
+ * @return The permissions bit mask.
+ */
+ public int getPermissions()
+ {
+ int permissions = 0;
+ COSInteger p = (COSInteger)encryptionDictionary.getDictionaryObject( COSName.getPDFName( "P" ) );
+ if( p != null )
+ {
+ permissions = p.intValue();
+ }
+ return permissions;
+ }
+
+ /**
+ * This will set the permissions bit mask.
+ *
+ * @param p The new permissions bit mask
+ */
+ public void setPermissions( int p )
+ {
+ encryptionDictionary.setItem( COSName.getPDFName( "P" ), new COSInteger( p ) );
+ }
+
+ private boolean isPermissionBitOn( int bit )
+ {
+ return (getPermissions() & (1 << (bit-1))) != 0;
+ }
+
+ private boolean setPermissionBit( int bit, boolean value )
+ {
+ int permissions = getPermissions();
+ if( value )
+ {
+ permissions = permissions | (1 << (bit-1));
+ }
+ else
+ {
+ permissions = permissions & (0xFFFFFFFF ^ (1 << (bit-1)));
+ }
+ setPermissions( permissions );
+
+ return (getPermissions() & (1 << (bit-1))) != 0;
+ }
+
+ /**
+ * This will tell if the user can print.
+ *
+ * @return true If supplied with the user password they are allowed to print.
+ */
+ public boolean canPrint()
+ {
+ return isPermissionBitOn( PRINT_BIT );
+ }
+
+ /**
+ * Set if the user can print.
+ *
+ * @param allowPrinting A boolean determining if the user can print.
+ */
+ public void setCanPrint( boolean allowPrinting )
+ {
+ setPermissionBit( PRINT_BIT, allowPrinting );
+ }
+
+ /**
+ * This will tell if the user can modify contents of the document.
+ *
+ * @return true If supplied with the user password they are allowed to modify the document
+ */
+ public boolean canModify()
+ {
+ return isPermissionBitOn( MODIFICATION_BIT );
+ }
+
+ /**
+ * Set if the user can modify the document.
+ *
+ * @param allowModifications A boolean determining if the user can modify the document.
+ */
+ public void setCanModify( boolean allowModifications )
+ {
+ setPermissionBit( MODIFICATION_BIT, allowModifications );
+ }
+
+ /**
+ * This will tell if the user can extract text and images from the PDF document.
+ *
+ * @return true If supplied with the user password they are allowed to extract content
+ * from the PDF document
+ */
+ public boolean canExtractContent()
+ {
+ return isPermissionBitOn( EXTRACT_BIT );
+ }
+
+ /**
+ * Set if the user can extract content from the document.
+ *
+ * @param allowExtraction A boolean determining if the user can extract content
+ * from the document.
+ */
+ public void setCanExtractContent( boolean allowExtraction )
+ {
+ setPermissionBit( EXTRACT_BIT, allowExtraction );
+ }
+
+ /**
+ * This will tell if the user can add/modify text annotations, fill in interactive forms fields.
+ *
+ * @return true If supplied with the user password they are allowed to modify annotations.
+ */
+ public boolean canModifyAnnotations()
+ {
+ return isPermissionBitOn( MODIFY_ANNOTATIONS_BIT );
+ }
+
+ /**
+ * Set if the user can modify annotations.
+ *
+ * @param allowAnnotationModification A boolean determining if the user can modify annotations.
+ */
+ public void setCanModifyAnnotations( boolean allowAnnotationModification )
+ {
+ setPermissionBit( MODIFY_ANNOTATIONS_BIT, allowAnnotationModification );
+ }
+
+ /**
+ * This will tell if the user can fill in interactive forms.
+ *
+ * @return true If supplied with the user password they are allowed to fill in form fields.
+ */
+ public boolean canFillInForm()
+ {
+ return isPermissionBitOn( FILL_IN_FORM_BIT );
+ }
+
+ /**
+ * Set if the user can fill in interactive forms.
+ *
+ * @param allowFillingInForm A boolean determining if the user can fill in interactive forms.
+ */
+ public void setCanFillInForm( boolean allowFillingInForm )
+ {
+ setPermissionBit( FILL_IN_FORM_BIT, allowFillingInForm );
+ }
+
+ /**
+ * This will tell if the user can extract text and images from the PDF document
+ * for accessibility purposes.
+ *
+ * @return true If supplied with the user password they are allowed to extract content
+ * from the PDF document
+ */
+ public boolean canExtractForAccessibility()
+ {
+ return isPermissionBitOn( EXTRACT_FOR_ACCESSIBILITY_BIT );
+ }
+
+ /**
+ * Set if the user can extract content from the document for accessibility purposes.
+ *
+ * @param allowExtraction A boolean determining if the user can extract content
+ * from the document.
+ */
+ public void setCanExtractForAccessibility( boolean allowExtraction )
+ {
+ setPermissionBit( EXTRACT_FOR_ACCESSIBILITY_BIT, allowExtraction );
+ }
+
+ /**
+ * This will tell if the user can insert/rotate/delete pages.
+ *
+ * @return true If supplied with the user password they are allowed to extract content
+ * from the PDF document
+ */
+ public boolean canAssembleDocument()
+ {
+ return isPermissionBitOn( ASSEMBLE_DOCUMENT_BIT );
+ }
+
+ /**
+ * Set if the user can insert/rotate/delete pages.
+ *
+ * @param allowAssembly A boolean determining if the user can assemble the document.
+ */
+ public void setCanAssembleDocument( boolean allowAssembly )
+ {
+ setPermissionBit( ASSEMBLE_DOCUMENT_BIT, allowAssembly );
+ }
+
+ /**
+ * This will tell if the user can print the document in a degraded format.
+ *
+ * @return true If supplied with the user password they are allowed to print the
+ * document in a degraded format.
+ */
+ public boolean canPrintDegraded()
+ {
+ return isPermissionBitOn( DEGRADED_PRINT_BIT );
+ }
+
+ /**
+ * Set if the user can print the document in a degraded format.
+ *
+ * @param allowAssembly A boolean determining if the user can print the
+ * document in a degraded format.
+ */
+ public void setCanPrintDegraded( boolean allowAssembly )
+ {
+ setPermissionBit( DEGRADED_PRINT_BIT, allowAssembly );
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/encryption/package.html b/src/main/java/org/pdfbox/pdmodel/encryption/package.html
new file mode 100644
index 0000000..a458817
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/encryption/package.html
@@ -0,0 +1,9 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head>
+
+</head>
+<body>
+The encryption package will handle the PDF document security handlers and the functionality of pluggable security handlers.
+</body>
+</html>
diff --git a/src/main/java/org/pdfbox/pdmodel/fdf/FDFAnnotation.java b/src/main/java/org/pdfbox/pdmodel/fdf/FDFAnnotation.java
new file mode 100644
index 0000000..3d121e7
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/fdf/FDFAnnotation.java
@@ -0,0 +1,114 @@
+/**
+ * Copyright (c) 2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.fdf;
+
+import org.pdfbox.cos.COSBase;
+import org.pdfbox.cos.COSDictionary;
+import org.pdfbox.cos.COSInteger;
+import org.pdfbox.cos.COSNumber;
+
+import org.pdfbox.pdmodel.common.COSObjectable;
+
+/**
+ * This represents an FDF annotation that is part of the FDF document.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.2 $
+ */
+public class FDFAnnotation implements COSObjectable
+{
+ private COSDictionary annot;
+
+ /**
+ * Default constructor.
+ */
+ public FDFAnnotation()
+ {
+ annot = new COSDictionary();
+ }
+
+ /**
+ * Constructor.
+ *
+ * @param a The FDF annotation.
+ */
+ public FDFAnnotation( COSDictionary a )
+ {
+ annot = a;
+ }
+
+ /**
+ * Convert this standard java object to a COS object.
+ *
+ * @return The cos object that matches this Java object.
+ */
+ public COSBase getCOSObject()
+ {
+ return annot;
+ }
+
+ /**
+ * Convert this standard java object to a COS object.
+ *
+ * @return The cos object that matches this Java object.
+ */
+ public COSDictionary getCOSDictionary()
+ {
+ return annot;
+ }
+
+ /**
+ * This will get the page number or null if it does not exist.
+ *
+ * @return The page number.
+ */
+ public Integer getPage()
+ {
+ Integer retval = null;
+ COSNumber page = (COSNumber)annot.getDictionaryObject( "Page" );
+ if( page != null )
+ {
+ retval = new Integer( page.intValue() );
+ }
+ return retval;
+ }
+
+ /**
+ * This will set the page.
+ *
+ * @param page The page number.
+ */
+ public void setPage( int page )
+ {
+ annot.setItem( "Page", new COSInteger( page ) );
+ }
+
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/fdf/FDFCatalog.java b/src/main/java/org/pdfbox/pdmodel/fdf/FDFCatalog.java
new file mode 100644
index 0000000..f6959ee
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/fdf/FDFCatalog.java
@@ -0,0 +1,195 @@
+/**
+ * Copyright (c) 2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.fdf;
+
+import java.io.IOException;
+import java.io.Writer;
+
+import org.pdfbox.cos.COSBase;
+import org.pdfbox.cos.COSDictionary;
+
+import org.pdfbox.pdmodel.common.COSObjectable;
+
+import org.pdfbox.pdmodel.interactive.digitalsignature.PDSignature;
+
+import org.w3c.dom.Element;
+
+/**
+ * This represents an FDF catalog that is part of the FDF document.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.2 $
+ */
+public class FDFCatalog implements COSObjectable
+{
+ private COSDictionary catalog;
+
+ /**
+ * Default constructor.
+ */
+ public FDFCatalog()
+ {
+ catalog = new COSDictionary();
+ }
+
+ /**
+ * Constructor.
+ *
+ * @param cat The FDF documents catalog.
+ */
+ public FDFCatalog( COSDictionary cat )
+ {
+ catalog = cat;
+ }
+
+ /**
+ * This will create an FDF catalog from an XFDF XML document.
+ *
+ * @param element The XML document that contains the XFDF data.
+ * @throws IOException If there is an error reading from the dom.
+ */
+ public FDFCatalog( Element element ) throws IOException
+ {
+ this();
+ FDFDictionary fdfDict = new FDFDictionary( element );
+ setFDF( fdfDict );
+ }
+
+ /**
+ * This will write this element as an XML document.
+ *
+ * @param output The stream to write the xml to.
+ *
+ * @throws IOException If there is an error writing the XML.
+ */
+ public void writeXML( Writer output ) throws IOException
+ {
+ FDFDictionary fdf = getFDF();
+ fdf.writeXML( output );
+ }
+
+ /**
+ * Convert this standard java object to a COS object.
+ *
+ * @return The cos object that matches this Java object.
+ */
+ public COSBase getCOSObject()
+ {
+ return catalog;
+ }
+
+ /**
+ * Convert this standard java object to a COS object.
+ *
+ * @return The cos object that matches this Java object.
+ */
+ public COSDictionary getCOSDictionary()
+ {
+ return catalog;
+ }
+
+ /**
+ * This will get the version that was specified in the catalog dictionary.
+ *
+ * @return The FDF version.
+ */
+ public String getVersion()
+ {
+ return catalog.getNameAsString( "Version" );
+ }
+
+ /**
+ * This will set the version of the FDF document.
+ *
+ * @param version The new version for the FDF document.
+ */
+ public void setVersion( String version )
+ {
+ catalog.setName( "Version", version );
+ }
+
+ /**
+ * This will get the FDF dictionary.
+ *
+ * @return The FDF dictionary.
+ */
+ public FDFDictionary getFDF()
+ {
+ COSDictionary fdf = (COSDictionary)catalog.getDictionaryObject( "FDF" );
+ FDFDictionary retval = null;
+ if( fdf != null )
+ {
+ retval = new FDFDictionary( fdf );
+ }
+ else
+ {
+ retval = new FDFDictionary();
+ setFDF( retval );
+ }
+ return retval;
+ }
+
+ /**
+ * This will set the FDF document.
+ *
+ * @param fdf The new FDF dictionary.
+ */
+ public void setFDF( FDFDictionary fdf )
+ {
+ catalog.setItem( "FDF", fdf );
+ }
+
+ /**
+ * This will get the signature or null if there is none.
+ *
+ * @return The signature.
+ */
+ public PDSignature getSignature()
+ {
+ PDSignature signature = null;
+ COSDictionary sig = (COSDictionary)catalog.getDictionaryObject( "Sig" );
+ if( sig != null )
+ {
+ signature = new PDSignature( sig );
+ }
+ return signature;
+ }
+
+ /**
+ * This will set the signature that is associated with this catalog.
+ *
+ * @param sig The new signature.
+ */
+ public void setSignature( PDSignature sig )
+ {
+ catalog.setItem( "Sig", sig );
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/fdf/FDFDictionary.java b/src/main/java/org/pdfbox/pdmodel/fdf/FDFDictionary.java
new file mode 100644
index 0000000..ab25bc7
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/fdf/FDFDictionary.java
@@ -0,0 +1,465 @@
+/**
+ * Copyright (c) 2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.fdf;
+
+import java.io.IOException;
+import java.io.Writer;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.pdfbox.cos.COSArray;
+import org.pdfbox.cos.COSBase;
+import org.pdfbox.cos.COSDictionary;
+import org.pdfbox.cos.COSStream;
+import org.pdfbox.cos.COSString;
+
+import org.pdfbox.pdmodel.common.COSObjectable;
+import org.pdfbox.pdmodel.common.COSArrayList;
+import org.pdfbox.pdmodel.common.filespecification.PDFileSpecification;
+import org.pdfbox.pdmodel.common.filespecification.PDSimpleFileSpecification;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+/**
+ * This represents an FDF dictionary that is part of the FDF document.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.6 $
+ */
+public class FDFDictionary implements COSObjectable
+{
+ private COSDictionary fdf;
+
+ /**
+ * Default constructor.
+ */
+ public FDFDictionary()
+ {
+ fdf = new COSDictionary();
+ }
+
+ /**
+ * Constructor.
+ *
+ * @param fdfDictionary The FDF documents catalog.
+ */
+ public FDFDictionary( COSDictionary fdfDictionary )
+ {
+ fdf = fdfDictionary;
+ }
+
+ /**
+ * This will create an FDF dictionary from an XFDF XML document.
+ *
+ * @param fdfXML The XML document that contains the XFDF data.
+ * @throws IOException If there is an error reading from the dom.
+ */
+ public FDFDictionary( Element fdfXML ) throws IOException
+ {
+ this();
+ NodeList nodeList = fdfXML.getChildNodes();
+ for( int i=0; i<nodeList.getLength(); i++ )
+ {
+ Node node = nodeList.item( i );
+ if( node instanceof Element )
+ {
+ Element child = (Element)node;
+ if( child.getTagName().equals( "f" ) )
+ {
+ PDSimpleFileSpecification fs = new PDSimpleFileSpecification();
+ fs.setFile( child.getAttribute( "href" ) );
+
+ }
+ else if( child.getTagName().equals( "ids" ) )
+ {
+ COSArray ids = new COSArray();
+ String original = child.getAttribute( "original" );
+ String modified = child.getAttribute( "modified" );
+ ids.add( COSString.createFromHexString( original ) );
+ ids.add( COSString.createFromHexString( modified ) );
+ setID( ids );
+ }
+ else if( child.getTagName().equals( "fields" ) )
+ {
+ NodeList fields = child.getElementsByTagName( "field" );
+ List fieldList = new ArrayList();
+ for( int f=0; f<fields.getLength(); f++ )
+ {
+ fieldList.add( new FDFField( (Element)fields.item( f ) ) );
+ }
+ setFields( fieldList );
+ }
+ }
+ }
+ }
+
+ /**
+ * This will write this element as an XML document.
+ *
+ * @param output The stream to write the xml to.
+ *
+ * @throws IOException If there is an error writing the XML.
+ */
+ public void writeXML( Writer output ) throws IOException
+ {
+ PDFileSpecification fs = this.getFile();
+ if( fs != null )
+ {
+ output.write( "<f href=\"" + fs.getFile() + "\" />\n" );
+ }
+ COSArray ids = this.getID();
+ if( ids != null )
+ {
+ COSString original = (COSString)ids.getObject( 0 );
+ COSString modified = (COSString)ids.getObject( 1 );
+ output.write( "<ids original=\"" + original.getHexString() + "\" " );
+ output.write( "modified=\"" + modified.getHexString() + "\" />\n");
+ }
+ List fields = getFields();
+ if( fields != null && fields.size() > 0 )
+ {
+ output.write( "<fields>\n" );
+ for( int i=0; i<fields.size(); i++ )
+ {
+ ((FDFField)fields.get( i )).writeXML( output );
+ }
+ output.write( "</fields>\n" );
+ }
+ }
+
+ /**
+ * Convert this standard java object to a COS object.
+ *
+ * @return The cos object that matches this Java object.
+ */
+ public COSBase getCOSObject()
+ {
+ return fdf;
+ }
+
+ /**
+ * Convert this standard java object to a COS object.
+ *
+ * @return The cos object that matches this Java object.
+ */
+ public COSDictionary getCOSDictionary()
+ {
+ return fdf;
+ }
+
+ /**
+ * The source file or target file: the PDF document file that
+ * this FDF file was exported from or is intended to be imported into.
+ *
+ * @return The F entry of the FDF dictionary.
+ */
+ public PDFileSpecification getFile()
+ {
+ return PDFileSpecification.createFS( fdf.getDictionaryObject( "F" ) );
+ }
+
+ /**
+ * This will set the file specification.
+ *
+ * @param fs The file specification.
+ */
+ public void setFile( PDFileSpecification fs )
+ {
+ fdf.setItem( "F", fs );
+ }
+
+ /**
+ * This is the FDF id.
+ *
+ * @return The FDF ID.
+ */
+ public COSArray getID()
+ {
+ return (COSArray)fdf.getDictionaryObject( "ID" );
+ }
+
+ /**
+ * This will set the FDF id.
+ *
+ * @param id The new id for the FDF.
+ */
+ public void setID( COSArray id )
+ {
+ fdf.setItem( "ID", id );
+ }
+
+ /**
+ * This will get the list of FDF Fields. This will return a list of FDFField
+ * objects.
+ *
+ * @return A list of FDF fields.
+ */
+ public List getFields()
+ {
+ List retval = null;
+ COSArray fieldArray = (COSArray)fdf.getDictionaryObject( "Fields" );
+ if( fieldArray != null )
+ {
+ List fields = new ArrayList();
+ for( int i=0; i<fieldArray.size(); i++ )
+ {
+ fields.add( new FDFField( (COSDictionary)fieldArray.getObject( i ) ) );
+ }
+ retval = new COSArrayList( fields, fieldArray );
+ }
+ return retval;
+ }
+
+ /**
+ * This will set the list of fields. This should be a list of FDFField objects.
+ *
+ * @param fields The list of fields.
+ */
+ public void setFields( List fields )
+ {
+ fdf.setItem( "Fields", COSArrayList.converterToCOSArray( fields ) );
+ }
+
+ /**
+ * This will get the status string to be displayed as the result of an
+ * action.
+ *
+ * @return The status.
+ */
+ public String getStatus()
+ {
+ return fdf.getString( "Status" );
+ }
+
+ /**
+ * This will set the status string.
+ *
+ * @param status The new status string.
+ */
+ public void setStatus( String status )
+ {
+ fdf.setString( "Status", status );
+ }
+
+ /**
+ * This will get the list of FDF Pages. This will return a list of FDFPage objects.
+ *
+ * @return A list of FDF pages.
+ */
+ public List getPages()
+ {
+ List retval = null;
+ COSArray pageArray = (COSArray)fdf.getDictionaryObject( "Pages" );
+ if( pageArray != null )
+ {
+ List pages = new ArrayList();
+ for( int i=0; i<pageArray.size(); i++ )
+ {
+ pages.add( new FDFPage( (COSDictionary)pageArray.get( i ) ) );
+ }
+ retval = new COSArrayList( pages, pageArray );
+ }
+ return retval;
+ }
+
+ /**
+ * This will set the list of pages. This should be a list of FDFPage objects.
+ *
+ *
+ * @param pages The list of pages.
+ */
+ public void setPages( List pages )
+ {
+ fdf.setItem( "Pages", COSArrayList.converterToCOSArray( pages ) );
+ }
+
+ /**
+ * The encoding to be used for a FDF field. The default is PDFDocEncoding
+ * and this method will never return null.
+ *
+ * @return The encoding value.
+ */
+ public String getEncoding()
+ {
+ String encoding = fdf.getNameAsString( "Encoding" );
+ if( encoding == null )
+ {
+ encoding = "PDFDocEncoding";
+ }
+ return encoding;
+
+ }
+
+ /**
+ * This will set the encoding.
+ *
+ * @param encoding The new encoding.
+ */
+ public void setEncoding( String encoding )
+ {
+ fdf.setName( "Encoding", encoding );
+ }
+
+ /**
+ * This will get the list of FDF Annotations. This will return a list of FDFAnnotation objects
+ * or null if the entry is not set.
+ *
+ * @return A list of FDF annotations.
+ */
+ public List getAnnotations()
+ {
+ List retval = null;
+ COSArray annotArray = (COSArray)fdf.getDictionaryObject( "Annots" );
+ if( annotArray != null )
+ {
+ List annots = new ArrayList();
+ for( int i=0; i<annotArray.size(); i++ )
+ {
+ annots.add( new FDFAnnotation( (COSDictionary)annotArray.getObject( i ) ) );
+ }
+ retval = new COSArrayList( annots, annotArray );
+ }
+ return retval;
+ }
+
+ /**
+ * This will set the list of annotations. This should be a list of FDFAnnotation objects.
+ *
+ *
+ * @param annots The list of annotations.
+ */
+ public void setAnnotations( List annots )
+ {
+ fdf.setItem( "Annots", COSArrayList.converterToCOSArray( annots ) );
+ }
+
+ /**
+ * This will get the incremental updates since the PDF was last opened.
+ *
+ * @return The differences entry of the FDF dictionary.
+ */
+ public COSStream getDifferences()
+ {
+ return (COSStream)fdf.getDictionaryObject( "Differences" );
+ }
+
+ /**
+ * This will set the differences stream.
+ *
+ * @param diff The new differences stream.
+ */
+ public void setDifferences( COSStream diff )
+ {
+ fdf.setItem( "Differences", diff );
+ }
+
+ /**
+ * This will get the target frame in the browser to open this document.
+ *
+ * @return The target frame.
+ */
+ public String getTarget()
+ {
+ return fdf.getString( "Target" );
+ }
+
+ /**
+ * This will set the target frame in the browser to open this document.
+ *
+ * @param target The new target frame.
+ */
+ public void setTarget( String target )
+ {
+ fdf.setString( "Target", target );
+ }
+
+ /**
+ * This will get the list of embedded FDF entries, or null if the entry is null.
+ * This will return a list of PDFileSpecification objects.
+ *
+ * @return A list of embedded FDF files.
+ */
+ public List getEmbeddedFDFs()
+ {
+ List retval = null;
+ COSArray embeddedArray = (COSArray)fdf.getDictionaryObject( "EmbeddedFDFs" );
+ if( embeddedArray != null )
+ {
+ List embedded = new ArrayList();
+ for( int i=0; i<embeddedArray.size(); i++ )
+ {
+ embedded.add( PDFileSpecification.createFS( embeddedArray.get( i ) ) );
+ }
+ retval = new COSArrayList( embedded, embeddedArray );
+ }
+ return retval;
+ }
+
+ /**
+ * This will set the list of embedded FDFs. This should be a list of
+ * PDFileSpecification objects.
+ *
+ *
+ * @param embedded The list of embedded FDFs.
+ */
+ public void setEmbeddedFDFs( List embedded )
+ {
+ fdf.setItem( "EmbeddedFDFs", COSArrayList.converterToCOSArray( embedded ) );
+ }
+
+ /**
+ * This will get the java script entry.
+ *
+ * @return The java script entry describing javascript commands.
+ */
+ public FDFJavaScript getJavaScript()
+ {
+ FDFJavaScript fs = null;
+ COSDictionary dic = (COSDictionary)fdf.getDictionaryObject( "JavaScript" );
+ if( dic != null )
+ {
+ fs = new FDFJavaScript( dic );
+ }
+ return fs;
+ }
+
+ /**
+ * This will set the JavaScript entry.
+ *
+ * @param js The javascript entries.
+ */
+ public void setJavaScript( FDFJavaScript js )
+ {
+ fdf.setItem( "JavaScript", js );
+ }
+
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/fdf/FDFDocument.java b/src/main/java/org/pdfbox/pdmodel/fdf/FDFDocument.java
new file mode 100644
index 0000000..8350314
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/fdf/FDFDocument.java
@@ -0,0 +1,377 @@
+/**
+ * Copyright (c) 2004-2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.fdf;
+
+import java.io.BufferedInputStream;
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.FileWriter;
+import java.io.InputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.Writer;
+
+import org.pdfbox.cos.COSDictionary;
+import org.pdfbox.cos.COSDocument;
+import org.pdfbox.cos.COSName;
+
+import org.pdfbox.exceptions.COSVisitorException;
+
+import org.pdfbox.pdfparser.PDFParser;
+
+import org.pdfbox.pdfwriter.COSWriter;
+
+import org.pdfbox.util.XMLUtil;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+/**
+ * This is the in-memory representation of the FDF document. You need to call
+ * close() on this object when you are done using it!!
+ *
+ * @author Ben Litchfield (ben@benlitchfield.com)
+ * @version $Revision: 1.5 $
+ */
+public class FDFDocument
+{
+ private COSDocument document;
+
+ /**
+ * Constructor, creates a new FDF document.
+ *
+ * @throws IOException If there is an error creating this document.
+ */
+ public FDFDocument() throws IOException
+ {
+ document = new COSDocument();
+ document.setHeaderString( "%FDF-1.2" );
+
+ //First we need a trailer
+ document.setTrailer( new COSDictionary() );
+
+ //Next we need the root dictionary.
+ FDFCatalog catalog = new FDFCatalog();
+ setCatalog( catalog );
+ }
+
+ /**
+ * Constructor that uses an existing document. The COSDocument that
+ * is passed in must be valid.
+ *
+ * @param doc The COSDocument that this document wraps.
+ */
+ public FDFDocument( COSDocument doc )
+ {
+ document = doc;
+ }
+
+ /**
+ * This will create an FDF document from an XFDF XML document.
+ *
+ * @param doc The XML document that contains the XFDF data.
+ * @throws IOException If there is an error reading from the dom.
+ */
+ public FDFDocument( Document doc ) throws IOException
+ {
+ this();
+ Element xfdf = doc.getDocumentElement();
+ if( !xfdf.getNodeName().equals( "xfdf" ) )
+ {
+ throw new IOException( "Error while importing xfdf document, " +
+ "root should be 'xfdf' and not '" + xfdf.getNodeName() + "'" );
+ }
+ FDFCatalog cat = new FDFCatalog( xfdf );
+ setCatalog( cat );
+ }
+
+ /**
+ * This will write this element as an XML document.
+ *
+ * @param output The stream to write the xml to.
+ *
+ * @throws IOException If there is an error writing the XML.
+ */
+ public void writeXML( Writer output ) throws IOException
+ {
+ output.write( "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" );
+ output.write( "<xfdf xmlns=\"http://ns.adobe.com/xfdf/\" xml:space=\"preserve\">\n" );
+
+ getCatalog().writeXML( output );
+
+ output.write( "</xfdf>\n" );
+ }
+
+
+
+ /**
+ * This will get the low level document.
+ *
+ * @return The document that this layer sits on top of.
+ */
+ public COSDocument getDocument()
+ {
+ return document;
+ }
+
+ /**
+ * This will get the FDF Catalog. This is guaranteed to not return null.
+ *
+ * @return The documents /Root dictionary
+ */
+ public FDFCatalog getCatalog()
+ {
+ FDFCatalog retval = null;
+ COSDictionary trailer = document.getTrailer();
+ COSDictionary root = (COSDictionary)trailer.getDictionaryObject( COSName.ROOT );
+ if( root == null )
+ {
+ retval = new FDFCatalog();
+ setCatalog( retval );
+ }
+ else
+ {
+ retval = new FDFCatalog( root );
+ }
+ return retval;
+ }
+
+ /**
+ * This will set the FDF catalog for this FDF document.
+ *
+ * @param cat The FDF catalog.
+ */
+ public void setCatalog( FDFCatalog cat )
+ {
+ COSDictionary trailer = document.getTrailer();
+ trailer.setItem( COSName.ROOT, cat );
+ }
+
+ /**
+ * This will load a document from a file.
+ *
+ * @param filename The name of the file to load.
+ *
+ * @return The document that was loaded.
+ *
+ * @throws IOException If there is an error reading from the stream.
+ */
+ public static FDFDocument load( String filename ) throws IOException
+ {
+ return load( new BufferedInputStream( new FileInputStream( filename ) ) );
+ }
+
+ /**
+ * This will load a document from a file.
+ *
+ * @param file The name of the file to load.
+ *
+ * @return The document that was loaded.
+ *
+ * @throws IOException If there is an error reading from the stream.
+ */
+ public static FDFDocument load( File file ) throws IOException
+ {
+ return load( new BufferedInputStream( new FileInputStream( file ) ) );
+ }
+
+ /**
+ * This will load a document from an input stream.
+ *
+ * @param input The stream that contains the document.
+ *
+ * @return The document that was loaded.
+ *
+ * @throws IOException If there is an error reading from the stream.
+ */
+ public static FDFDocument load( InputStream input ) throws IOException
+ {
+ PDFParser parser = new PDFParser( input );
+ parser.parse();
+ return parser.getFDFDocument();
+ }
+
+ /**
+ * This will load a document from a file.
+ *
+ * @param filename The name of the file to load.
+ *
+ * @return The document that was loaded.
+ *
+ * @throws IOException If there is an error reading from the stream.
+ */
+ public static FDFDocument loadXFDF( String filename ) throws IOException
+ {
+ return loadXFDF( new BufferedInputStream( new FileInputStream( filename ) ) );
+ }
+
+ /**
+ * This will load a document from a file.
+ *
+ * @param file The name of the file to load.
+ *
+ * @return The document that was loaded.
+ *
+ * @throws IOException If there is an error reading from the stream.
+ */
+ public static FDFDocument loadXFDF( File file ) throws IOException
+ {
+ return loadXFDF( new BufferedInputStream( new FileInputStream( file ) ) );
+ }
+
+ /**
+ * This will load a document from an input stream.
+ *
+ * @param input The stream that contains the document.
+ *
+ * @return The document that was loaded.
+ *
+ * @throws IOException If there is an error reading from the stream.
+ */
+ public static FDFDocument loadXFDF( InputStream input ) throws IOException
+ {
+ Document doc = XMLUtil.parse( input );
+ return new FDFDocument( doc );
+ }
+
+ /**
+ * This will save this document to the filesystem.
+ *
+ * @param fileName The file to save as.
+ *
+ * @throws IOException If there is an error saving the document.
+ * @throws COSVisitorException If an error occurs while generating the data.
+ */
+ public void save( File fileName ) throws IOException, COSVisitorException
+ {
+ save( new FileOutputStream( fileName ) );
+ }
+
+ /**
+ * This will save this document to the filesystem.
+ *
+ * @param fileName The file to save as.
+ *
+ * @throws IOException If there is an error saving the document.
+ * @throws COSVisitorException If an error occurs while generating the data.
+ */
+ public void save( String fileName ) throws IOException, COSVisitorException
+ {
+ save( new FileOutputStream( fileName ) );
+ }
+
+ /**
+ * This will save the document to an output stream.
+ *
+ * @param output The stream to write to.
+ *
+ * @throws IOException If there is an error writing the document.
+ * @throws COSVisitorException If an error occurs while generating the data.
+ */
+ public void save( OutputStream output ) throws IOException, COSVisitorException
+ {
+ COSWriter writer = null;
+ try
+ {
+ writer = new COSWriter( output );
+ writer.write( document );
+ writer.close();
+ }
+ finally
+ {
+ if( writer != null )
+ {
+ writer.close();
+ }
+ }
+ }
+
+ /**
+ * This will save this document to the filesystem.
+ *
+ * @param fileName The file to save as.
+ *
+ * @throws IOException If there is an error saving the document.
+ * @throws COSVisitorException If an error occurs while generating the data.
+ */
+ public void saveXFDF( File fileName ) throws IOException, COSVisitorException
+ {
+ saveXFDF( new BufferedWriter( new FileWriter( fileName ) ) );
+ }
+
+ /**
+ * This will save this document to the filesystem.
+ *
+ * @param fileName The file to save as.
+ *
+ * @throws IOException If there is an error saving the document.
+ * @throws COSVisitorException If an error occurs while generating the data.
+ */
+ public void saveXFDF( String fileName ) throws IOException, COSVisitorException
+ {
+ saveXFDF( new BufferedWriter( new FileWriter( fileName ) ) );
+ }
+
+ /**
+ * This will save the document to an output stream and close the stream.
+ *
+ * @param output The stream to write to.
+ *
+ * @throws IOException If there is an error writing the document.
+ * @throws COSVisitorException If an error occurs while generating the data.
+ */
+ public void saveXFDF( Writer output ) throws IOException, COSVisitorException
+ {
+ try
+ {
+ writeXML( output );
+ }
+ finally
+ {
+ if( output != null )
+ {
+ output.close();
+ }
+ }
+ }
+
+ /**
+ * This will close the underlying COSDocument object.
+ *
+ * @throws IOException If there is an error releasing resources.
+ */
+ public void close() throws IOException
+ {
+ document.close();
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/fdf/FDFField.java b/src/main/java/org/pdfbox/pdmodel/fdf/FDFField.java
new file mode 100644
index 0000000..35b90ed
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/fdf/FDFField.java
@@ -0,0 +1,763 @@
+/**
+ * Copyright (c) 2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.fdf;
+
+import java.io.IOException;
+import java.io.Writer;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.pdfbox.cos.COSArray;
+import org.pdfbox.cos.COSBase;
+import org.pdfbox.cos.COSDictionary;
+import org.pdfbox.cos.COSInteger;
+import org.pdfbox.cos.COSName;
+import org.pdfbox.cos.COSNumber;
+import org.pdfbox.cos.COSStream;
+import org.pdfbox.cos.COSString;
+
+import org.pdfbox.pdmodel.common.COSObjectable;
+import org.pdfbox.pdmodel.common.COSArrayList;
+import org.pdfbox.pdmodel.common.PDTextStream;
+
+import org.pdfbox.pdmodel.interactive.action.PDActionFactory;
+import org.pdfbox.pdmodel.interactive.action.PDAdditionalActions;
+import org.pdfbox.pdmodel.interactive.action.type.PDAction;
+
+import org.pdfbox.pdmodel.interactive.annotation.PDAppearanceDictionary;
+
+import org.pdfbox.util.XMLUtil;
+
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+/**
+ * This represents an FDF field that is part of the FDF document.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.4 $
+ */
+public class FDFField implements COSObjectable
+{
+ private COSDictionary field;
+
+ /**
+ * Default constructor.
+ */
+ public FDFField()
+ {
+ field = new COSDictionary();
+ }
+
+ /**
+ * Constructor.
+ *
+ * @param f The FDF field.
+ */
+ public FDFField( COSDictionary f )
+ {
+ field = f;
+ }
+
+ /**
+ * This will create an FDF field from an XFDF XML document.
+ *
+ * @param fieldXML The XML document that contains the XFDF data.
+ * @throws IOException If there is an error reading from the dom.
+ */
+ public FDFField( Element fieldXML ) throws IOException
+ {
+ this();
+ this.setPartialFieldName( fieldXML.getAttribute( "name" ) );
+ NodeList nodeList = fieldXML.getChildNodes();
+ List kids = new ArrayList();
+ for( int i=0; i<nodeList.getLength(); i++ )
+ {
+ Node node = nodeList.item( i );
+ if( node instanceof Element )
+ {
+ Element child = (Element)node;
+ if( child.getTagName().equals( "value" ) )
+ {
+ setValue( XMLUtil.getNodeValue( child ) );
+ }
+ else if( child.getTagName().equals( "value-richtext" ) )
+ {
+ setRichText( new PDTextStream( XMLUtil.getNodeValue( child ) ) );
+ }
+ else if( child.getTagName().equals( "field" ) )
+ {
+ kids.add( new FDFField( child ) );
+ }
+ }
+ }
+ if( kids.size() > 0 )
+ {
+ setKids( kids );
+ }
+
+ }
+
+ /**
+ * This will write this element as an XML document.
+ *
+ * @param output The stream to write the xml to.
+ *
+ * @throws IOException If there is an error writing the XML.
+ */
+ public void writeXML( Writer output ) throws IOException
+ {
+ output.write( "<field name=\"" + getPartialFieldName() + "\">\n");
+ Object value = getValue();
+ if( value != null )
+ {
+ output.write( "<value>" + value + "</value>\n" );
+ }
+ PDTextStream rt = getRichText();
+ if( rt != null )
+ {
+ output.write( "<value-richtext>" + rt.getAsString() + "</value-richtext>\n" );
+ }
+ List kids = getKids();
+ if( kids != null )
+ {
+ for( int i=0; i<kids.size(); i++ )
+ {
+ ((FDFField)kids.get( i ) ).writeXML( output );
+ }
+ }
+ output.write( "</field>\n");
+ }
+
+ /**
+ * Convert this standard java object to a COS object.
+ *
+ * @return The cos object that matches this Java object.
+ */
+ public COSBase getCOSObject()
+ {
+ return field;
+ }
+
+ /**
+ * Convert this standard java object to a COS object.
+ *
+ * @return The cos object that matches this Java object.
+ */
+ public COSDictionary getCOSDictionary()
+ {
+ return field;
+ }
+
+ /**
+ * This will get the list of kids. This will return a list of FDFField objects.
+ * This will return null if the underlying list is null.
+ *
+ * @return The list of kids.
+ */
+ public List getKids()
+ {
+ COSArray kids = (COSArray)field.getDictionaryObject( "Kids" );
+ List retval = null;
+ if( kids != null )
+ {
+ List actuals = new ArrayList();
+ for( int i=0; i<kids.size(); i++ )
+ {
+ actuals.add( new FDFField( (COSDictionary)kids.getObject( i ) ) );
+ }
+ retval = new COSArrayList( actuals, kids );
+ }
+ return retval;
+ }
+
+ /**
+ * This will set the list of kids.
+ *
+ * @param kids A list of FDFField objects.
+ */
+ public void setKids( List kids )
+ {
+ field.setItem( "Kids", COSArrayList.converterToCOSArray( kids ) );
+ }
+
+ /**
+ * This will get the "T" entry in the field dictionary. A partial field
+ * name. Where the fully qualified field name is a concatenation of
+ * the parent's fully qualified field name and "." as a separator. For example<br/>
+ * Address.State<br />
+ * Address.City<br />
+ *
+ * @return The partial field name.
+ */
+ public String getPartialFieldName()
+ {
+ return field.getString( "T" );
+ }
+
+ /**
+ * This will set the partial field name.
+ *
+ * @param partial The partial field name.
+ */
+ public void setPartialFieldName( String partial )
+ {
+ field.setString( "T", partial );
+ }
+
+ /**
+ * This will set the value for the field. This will return type will either be <br />
+ * String : Checkboxes, Radio Button <br />
+ * java.util.List of strings: Choice Field
+ * PDTextStream: Textfields
+ *
+ * @return The value of the field.
+ *
+ * @throws IOException If there is an error getting the value.
+ */
+ public Object getValue() throws IOException
+ {
+ Object retval = null;
+ COSBase value = field.getDictionaryObject( "V" );
+ if( value instanceof COSName )
+ {
+ retval = ((COSName)value).getName();
+ }
+ else if( value instanceof COSArray )
+ {
+ retval = COSArrayList.convertCOSStringCOSArrayToList( (COSArray)value );
+ }
+ else if( value instanceof COSString || value instanceof COSStream )
+ {
+ retval = PDTextStream.createTextStream( value );
+ }
+ else if( value == null )
+ {
+ //Ok, value is null so do nothing
+ }
+ else
+ {
+ throw new IOException( "Error:Unknown type for field import" + value );
+ }
+ return retval;
+ }
+
+ /**
+ * You should pass in a string, or a java.util.List of strings to set the
+ * value.
+ *
+ * @param value The value that should populate when imported.
+ *
+ * @throws IOException If there is an error setting the value.
+ */
+ public void setValue( Object value ) throws IOException
+ {
+ COSBase cos = null;
+ if( value instanceof List )
+ {
+ cos = COSArrayList.convertStringListToCOSStringCOSArray( (List)value );
+ }
+ else if( value instanceof String )
+ {
+ cos = COSName.getPDFName( (String)value );
+ }
+ else if( value instanceof COSObjectable )
+ {
+ cos = ((COSObjectable)value).getCOSObject();
+ }
+ else if( value == null )
+ {
+ //do nothing and let cos remain null as well.
+ }
+ else
+ {
+ throw new IOException( "Error:Unknown type for field import" + value );
+ }
+ field.setItem( "V", cos );
+ }
+
+ /**
+ * This will get the Ff entry of the cos dictionary. If it it not present then
+ * this method will return null.
+ *
+ * @return The field flags.
+ */
+ public Integer getFieldFlags()
+ {
+ Integer retval = null;
+ COSNumber ff = (COSNumber)field.getDictionaryObject( "Ff" );
+ if( ff != null )
+ {
+ retval = new Integer( ff.intValue() );
+ }
+ return retval;
+ }
+
+ /**
+ * This will get the field flags that are associated with this field. The Ff entry
+ * in the FDF field dictionary.
+ *
+ * @param ff The new value for the field flags.
+ */
+ public void setFieldFlags( Integer ff )
+ {
+ COSInteger value = null;
+ if( ff != null )
+ {
+ value = new COSInteger( ff.intValue() );
+ }
+ field.setItem( "Ff", value );
+ }
+
+ /**
+ * This will get the field flags that are associated with this field. The Ff entry
+ * in the FDF field dictionary.
+ *
+ * @param ff The new value for the field flags.
+ */
+ public void setFieldFlags( int ff )
+ {
+ field.setItem( "Ff", new COSInteger( ff ) );
+ }
+
+ /**
+ * This will get the SetFf entry of the cos dictionary. If it it not present then
+ * this method will return null.
+ *
+ * @return The field flags.
+ */
+ public Integer getSetFieldFlags()
+ {
+ Integer retval = null;
+ COSNumber ff = (COSNumber)field.getDictionaryObject( "SetFf" );
+ if( ff != null )
+ {
+ retval = new Integer( ff.intValue() );
+ }
+ return retval;
+ }
+
+ /**
+ * This will get the field flags that are associated with this field. The SetFf entry
+ * in the FDF field dictionary.
+ *
+ * @param ff The new value for the "set field flags".
+ */
+ public void setSetFieldFlags( Integer ff )
+ {
+ COSInteger value = null;
+ if( ff != null )
+ {
+ value = new COSInteger( ff.intValue() );
+ }
+ field.setItem( "SetFf", value );
+ }
+
+ /**
+ * This will get the field flags that are associated with this field. The SetFf entry
+ * in the FDF field dictionary.
+ *
+ * @param ff The new value for the "set field flags".
+ */
+ public void setSetFieldFlags( int ff )
+ {
+ field.setItem( "SetFf", new COSInteger( ff ) );
+ }
+
+ /**
+ * This will get the ClrFf entry of the cos dictionary. If it it not present then
+ * this method will return null.
+ *
+ * @return The field flags.
+ */
+ public Integer getClearFieldFlags()
+ {
+ Integer retval = null;
+ COSNumber ff = (COSNumber)field.getDictionaryObject( "ClrFf" );
+ if( ff != null )
+ {
+ retval = new Integer( ff.intValue() );
+ }
+ return retval;
+ }
+
+ /**
+ * This will get the field flags that are associated with this field. The ClrFf entry
+ * in the FDF field dictionary.
+ *
+ * @param ff The new value for the "clear field flags".
+ */
+ public void setClearFieldFlags( Integer ff )
+ {
+ COSInteger value = null;
+ if( ff != null )
+ {
+ value = new COSInteger( ff.intValue() );
+ }
+ field.setItem( "ClrFf", value );
+ }
+
+ /**
+ * This will get the field flags that are associated with this field. The ClrFf entry
+ * in the FDF field dictionary.
+ *
+ * @param ff The new value for the "clear field flags".
+ */
+ public void setClearFieldFlags( int ff )
+ {
+ field.setItem( "ClrFf", new COSInteger( ff ) );
+ }
+
+ /**
+ * This will get the F entry of the cos dictionary. If it it not present then
+ * this method will return null.
+ *
+ * @return The widget field flags.
+ */
+ public Integer getWidgetFieldFlags()
+ {
+ Integer retval = null;
+ COSNumber f = (COSNumber)field.getDictionaryObject( "F" );
+ if( f != null )
+ {
+ retval = new Integer( f.intValue() );
+ }
+ return retval;
+ }
+
+ /**
+ * This will get the widget field flags that are associated with this field. The F entry
+ * in the FDF field dictionary.
+ *
+ * @param f The new value for the field flags.
+ */
+ public void setWidgetFieldFlags( Integer f )
+ {
+ COSInteger value = null;
+ if( f != null )
+ {
+ value = new COSInteger( f.intValue() );
+ }
+ field.setItem( "F", value );
+ }
+
+ /**
+ * This will get the field flags that are associated with this field. The F entry
+ * in the FDF field dictionary.
+ *
+ * @param f The new value for the field flags.
+ */
+ public void setWidgetFieldFlags( int f )
+ {
+ field.setItem( "F", new COSInteger( f ) );
+ }
+
+ /**
+ * This will get the SetF entry of the cos dictionary. If it it not present then
+ * this method will return null.
+ *
+ * @return The field flags.
+ */
+ public Integer getSetWidgetFieldFlags()
+ {
+ Integer retval = null;
+ COSNumber ff = (COSNumber)field.getDictionaryObject( "SetF" );
+ if( ff != null )
+ {
+ retval = new Integer( ff.intValue() );
+ }
+ return retval;
+ }
+
+ /**
+ * This will get the widget field flags that are associated with this field. The SetF entry
+ * in the FDF field dictionary.
+ *
+ * @param ff The new value for the "set widget field flags".
+ */
+ public void setSetWidgetFieldFlags( Integer ff )
+ {
+ COSInteger value = null;
+ if( ff != null )
+ {
+ value = new COSInteger( ff.intValue() );
+ }
+ field.setItem( "SetF", value );
+ }
+
+ /**
+ * This will get the widget field flags that are associated with this field. The SetF entry
+ * in the FDF field dictionary.
+ *
+ * @param ff The new value for the "set widget field flags".
+ */
+ public void setSetWidgetFieldFlags( int ff )
+ {
+ field.setItem( "SetF", new COSInteger( ff ) );
+ }
+
+ /**
+ * This will get the ClrF entry of the cos dictionary. If it it not present then
+ * this method will return null.
+ *
+ * @return The widget field flags.
+ */
+ public Integer getClearWidgetFieldFlags()
+ {
+ Integer retval = null;
+ COSNumber ff = (COSNumber)field.getDictionaryObject( "ClrF" );
+ if( ff != null )
+ {
+ retval = new Integer( ff.intValue() );
+ }
+ return retval;
+ }
+
+ /**
+ * This will get the field flags that are associated with this field. The ClrF entry
+ * in the FDF field dictionary.
+ *
+ * @param ff The new value for the "clear widget field flags".
+ */
+ public void setClearWidgetFieldFlags( Integer ff )
+ {
+ COSInteger value = null;
+ if( ff != null )
+ {
+ value = new COSInteger( ff.intValue() );
+ }
+ field.setItem( "ClrF", value );
+ }
+
+ /**
+ * This will get the field flags that are associated with this field. The ClrF entry
+ * in the FDF field dictionary.
+ *
+ * @param ff The new value for the "clear field flags".
+ */
+ public void setClearWidgetFieldFlags( int ff )
+ {
+ field.setItem( "ClrF", new COSInteger( ff ) );
+ }
+
+ /**
+ * This will get the appearance dictionary that specifies the appearance of
+ * a pushbutton field.
+ *
+ * @return The AP entry of this dictionary.
+ */
+ public PDAppearanceDictionary getAppearanceDictionary()
+ {
+ PDAppearanceDictionary retval = null;
+ COSDictionary dict = (COSDictionary)field.getDictionaryObject( "AP" );
+ if( dict != null )
+ {
+ retval = new PDAppearanceDictionary( dict );
+ }
+ return retval;
+ }
+
+ /**
+ * This will set the appearance dictionary.
+ *
+ * @param ap The apperance dictionary.
+ */
+ public void setAppearanceDictionary( PDAppearanceDictionary ap )
+ {
+ field.setItem( "AP", ap );
+ }
+
+ /**
+ * This will get named page references..
+ *
+ * @return The named page references.
+ */
+ public FDFNamedPageReference getAppearanceStreamReference()
+ {
+ FDFNamedPageReference retval = null;
+ COSDictionary ref = (COSDictionary)field.getDictionaryObject( "APRef" );
+ if( ref != null )
+ {
+ retval = new FDFNamedPageReference( ref );
+ }
+ return retval;
+ }
+
+ /**
+ * This will set the named page references.
+ *
+ * @param ref The named page references.
+ */
+ public void setAppearanceStreamReference( FDFNamedPageReference ref )
+ {
+ field.setItem( "APRef", ref );
+ }
+
+ /**
+ * This will get the icon fit that is associated with this field.
+ *
+ * @return The IF entry.
+ */
+ public FDFIconFit getIconFit()
+ {
+ FDFIconFit retval = null;
+ COSDictionary dic = (COSDictionary)field.getDictionaryObject( "IF" );
+ if( dic != null )
+ {
+ retval = new FDFIconFit( dic );
+ }
+ return retval;
+ }
+
+ /**
+ * This will set the icon fit entry.
+ *
+ * @param fit The icon fit object.
+ */
+ public void setIconFit( FDFIconFit fit )
+ {
+ field.setItem( "IF", fit );
+ }
+
+ /**
+ * This will return a list of options for a choice field. The value in the
+ * list will be 1 of 2 types. java.lang.String or FDFOptionElement.
+ *
+ * @return A list of all options.
+ */
+ public List getOptions()
+ {
+ List retval = null;
+ COSArray array = (COSArray)field.getDictionaryObject( "Opt" );
+ if( array != null )
+ {
+ List objects = new ArrayList();
+ for( int i=0; i<array.size(); i++ )
+ {
+ COSBase next = array.getObject( i );
+ if( next instanceof COSString )
+ {
+ objects.add( ((COSString)next).getString() );
+ }
+ else
+ {
+ COSArray value = (COSArray)next;
+ objects.add( new FDFOptionElement( value ) );
+ }
+ }
+ retval = new COSArrayList( objects, array );
+ }
+ return retval;
+ }
+
+ /**
+ * This will set the options for the choice field. The objects in the list
+ * should either be java.lang.String or FDFOptionElement.
+ *
+ * @param options The options to set.
+ */
+ public void setOptions( List options )
+ {
+ COSArray value = COSArrayList.converterToCOSArray( options );
+ field.setItem( "Opt", value );
+ }
+
+ /**
+ * This will get the action that is associated with this field.
+ *
+ * @return The A entry in the field dictionary.
+ */
+ public PDAction getAction()
+ {
+ return PDActionFactory.createAction( (COSDictionary)field.getDictionaryObject( "A" ) );
+ }
+
+ /**
+ * This will set the action that is associated with this field.
+ *
+ * @param a The new action.
+ */
+ public void setAction( PDAction a )
+ {
+ field.setItem( "A", a );
+ }
+
+ /**
+ * This will get a list of additional actions that will get executed based
+ * on events.
+ *
+ * @return The AA entry in this field dictionary.
+ */
+ public PDAdditionalActions getAdditionalActions()
+ {
+ PDAdditionalActions retval = null;
+ COSDictionary dict = (COSDictionary)field.getDictionaryObject( "AA" );
+ if( dict != null )
+ {
+ retval = new PDAdditionalActions( dict );
+ }
+
+ return retval;
+ }
+
+ /**
+ * This will set the additional actions that are associated with this field.
+ *
+ * @param aa The additional actions.
+ */
+ public void setAdditionalActions( PDAdditionalActions aa )
+ {
+ field.setItem( "AA", aa );
+ }
+
+ /**
+ * This will set the rich text that is associated with this field.
+ *
+ * @return The rich text XHTML stream.
+ */
+ public PDTextStream getRichText()
+ {
+ COSBase rv = field.getDictionaryObject( "RV" );
+ return PDTextStream.createTextStream( rv );
+ }
+
+ /**
+ * This will set the rich text value.
+ *
+ * @param rv The rich text value for the stream.
+ */
+ public void setRichText( PDTextStream rv )
+ {
+ field.setItem( "RV", rv );
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/fdf/FDFIconFit.java b/src/main/java/org/pdfbox/pdmodel/fdf/FDFIconFit.java
new file mode 100644
index 0000000..c765bfc
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/fdf/FDFIconFit.java
@@ -0,0 +1,227 @@
+/**
+ * Copyright (c) 2004-2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.fdf;
+
+import org.pdfbox.cos.COSArray;
+import org.pdfbox.cos.COSBase;
+import org.pdfbox.cos.COSDictionary;
+
+import org.pdfbox.pdmodel.common.COSObjectable;
+import org.pdfbox.pdmodel.common.PDRange;
+
+/**
+ * This represents an Icon fit dictionary for an FDF field.
+ *
+ * @author Ben Litchfield (ben@benlitchfield.com)
+ * @version $Revision: 1.2 $
+ */
+public class FDFIconFit implements COSObjectable
+{
+ private COSDictionary fit;
+
+ /**
+ * A scale option.
+ */
+ public static final String SCALE_OPTION_ALWAYS = "A";
+ /**
+ * A scale option.
+ */
+ public static final String SCALE_OPTION_ONLY_WHEN_ICON_IS_BIGGER = "B";
+ /**
+ * A scale option.
+ */
+ public static final String SCALE_OPTION_ONLY_WHEN_ICON_IS_SMALLER = "S";
+ /**
+ * A scale option.
+ */
+ public static final String SCALE_OPTION_NEVER = "N";
+
+ /**
+ * Scale to fill with of annotation, disregarding aspect ratio.
+ */
+ public static final String SCALE_TYPE_ANAMORPHIC = "A";
+ /**
+ * Scale to fit width or height, smaller of two, while retaining aspect ration.
+ */
+ public static final String SCALE_TYPE_PROPORTIONAL = "P";
+
+
+
+ /**
+ * Default constructor.
+ */
+ public FDFIconFit()
+ {
+ fit = new COSDictionary();
+ }
+
+ /**
+ * Constructor.
+ *
+ * @param f The icon fit dictionary.
+ */
+ public FDFIconFit( COSDictionary f )
+ {
+ fit = f;
+ }
+
+ /**
+ * Convert this standard java object to a COS object.
+ *
+ * @return The cos object that matches this Java object.
+ */
+ public COSBase getCOSObject()
+ {
+ return fit;
+ }
+
+ /**
+ * Convert this standard java object to a COS object.
+ *
+ * @return The cos object that matches this Java object.
+ */
+ public COSDictionary getCOSDictionary()
+ {
+ return fit;
+ }
+
+ /**
+ * This will get the scale option. See the SCALE_OPTION_XXX constants. This
+ * is guaranteed to never return null. Default: Always
+ *
+ * @return The scale option.
+ */
+ public String getScaleOption()
+ {
+ String retval = fit.getNameAsString( "SW" );
+ if( retval == null )
+ {
+ retval = SCALE_OPTION_ALWAYS;
+ }
+ return retval;
+ }
+
+ /**
+ * This will set the scale option for the icon. Set the SCALE_OPTION_XXX constants.
+ *
+ * @param option The scale option.
+ */
+ public void setScaleOption( String option )
+ {
+ fit.setName( "SW", option );
+ }
+
+ /**
+ * This will get the scale type. See the SCALE_TYPE_XXX constants. This is
+ * guaranteed to never return null. Default: Proportional
+ *
+ * @return The scale type.
+ */
+ public String getScaleType()
+ {
+ String retval = fit.getNameAsString( "S" );
+ if( retval == null )
+ {
+ retval = SCALE_TYPE_PROPORTIONAL;
+ }
+ return retval;
+ }
+
+ /**
+ * This will set the scale type. See the SCALE_TYPE_XXX constants.
+ *
+ * @param scale The scale type.
+ */
+ public void setScaleType( String scale )
+ {
+ fit.setName( "S", scale );
+ }
+
+ /**
+ * This is guaranteed to never return null.<br />
+ *
+ * To quote the PDF Spec
+ * "An array of two numbers between 0.0 and 1.0 indicating the fraction of leftover
+ * space to allocate at the left and bottom of the icon. A value of [0.0 0.0] positions the
+ * icon at the bottom-left corner of the annotation rectangle; a value of [0.5 0.5] centers it
+ * within the rectangle. This entry is used only if the icon is scaled proportionally. Default
+ * value: [0.5 0.5]."
+ *
+ * @return The fractional space to allocate.
+ */
+ public PDRange getFractionalSpaceToAllocate()
+ {
+ PDRange retval = null;
+ COSArray array = (COSArray)fit.getDictionaryObject( "A" );
+ if( array == null )
+ {
+ retval = new PDRange();
+ retval.setMin( .5f );
+ retval.setMax( .5f );
+ setFractionalSpaceToAllocate( retval );
+ }
+ else
+ {
+ retval = new PDRange( array );
+ }
+ return retval;
+ }
+
+ /**
+ * This will set frational space to allocate.
+ *
+ * @param space The space to allocate.
+ */
+ public void setFractionalSpaceToAllocate( PDRange space )
+ {
+ fit.setItem( "A", space );
+ }
+
+ /**
+ * This will tell if the icon should scale to fit the annotation bounds. Default: false
+ *
+ * @return A flag telling if the icon should scale.
+ */
+ public boolean shouldScaleToFitAnnotation()
+ {
+ return fit.getBoolean( "FB", false );
+ }
+
+ /**
+ * This will tell the icon to scale.
+ *
+ * @param value The flag value.
+ */
+ public void setScaleToFitAnnotation( boolean value )
+ {
+ fit.setBoolean( "FB", value );
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/fdf/FDFJavaScript.java b/src/main/java/org/pdfbox/pdmodel/fdf/FDFJavaScript.java
new file mode 100644
index 0000000..dfa6b0f
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/fdf/FDFJavaScript.java
@@ -0,0 +1,172 @@
+/**
+ * Copyright (c) 2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.fdf;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.pdfbox.cos.COSArray;
+import org.pdfbox.cos.COSBase;
+import org.pdfbox.cos.COSDictionary;
+import org.pdfbox.cos.COSName;
+
+import org.pdfbox.pdmodel.common.COSObjectable;
+import org.pdfbox.pdmodel.common.COSArrayList;
+import org.pdfbox.pdmodel.common.PDTextStream;
+import org.pdfbox.pdmodel.common.PDNamedTextStream;
+
+/**
+ * This represents an FDF JavaScript dictionary that is part of the FDF document.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.2 $
+ */
+public class FDFJavaScript implements COSObjectable
+{
+ private COSDictionary js;
+
+ /**
+ * Default constructor.
+ */
+ public FDFJavaScript()
+ {
+ js = new COSDictionary();
+ }
+
+ /**
+ * Constructor.
+ *
+ * @param javaScript The FDF java script.
+ */
+ public FDFJavaScript( COSDictionary javaScript )
+ {
+ js = javaScript;
+ }
+
+ /**
+ * Convert this standard java object to a COS object.
+ *
+ * @return The cos object that matches this Java object.
+ */
+ public COSBase getCOSObject()
+ {
+ return js;
+ }
+
+ /**
+ * Convert this standard java object to a COS object.
+ *
+ * @return The cos object that matches this Java object.
+ */
+ public COSDictionary getCOSDictionary()
+ {
+ return js;
+ }
+
+ /**
+ * This will get the javascript that is executed before the import.
+ *
+ * @return Some javascript code.
+ */
+ public PDTextStream getBefore()
+ {
+ return PDTextStream.createTextStream( js.getDictionaryObject( "Before" ) );
+ }
+
+ /**
+ * This will set the javascript code the will get execute before the import.
+ *
+ * @param before A reference to some javascript code.
+ */
+ public void setBefore( PDTextStream before )
+ {
+ js.setItem( "Before", before );
+ }
+
+ /**
+ * This will get the javascript that is executed after the import.
+ *
+ * @return Some javascript code.
+ */
+ public PDTextStream getAfter()
+ {
+ return PDTextStream.createTextStream( js.getDictionaryObject( "After" ) );
+ }
+
+ /**
+ * This will set the javascript code the will get execute after the import.
+ *
+ * @param after A reference to some javascript code.
+ */
+ public void setAfter( PDTextStream after )
+ {
+ js.setItem( "After", after );
+ }
+
+ /**
+ * This will return a list of PDNamedTextStream objects. This is the "Doc"
+ * entry of the pdf document. These will be added to the PDF documents
+ * javascript name tree. This will not return null.
+ *
+ * @return A list of all named javascript entries.
+ */
+ public List getNamedJavaScripts()
+ {
+ List retval = null;
+ COSArray array = (COSArray)js.getDictionaryObject( "Doc" );
+ List namedStreams = new ArrayList();
+ if( array == null )
+ {
+ array = new COSArray();
+ js.setItem( "Doc", array );
+ }
+ for( int i=0; i<array.size(); i++ )
+ {
+ COSName name = (COSName)array.get( i );
+ i++;
+ COSBase stream = array.get( i );
+ PDNamedTextStream namedStream = new PDNamedTextStream( name, stream );
+ namedStreams.add( namedStream );
+ }
+ return new COSArrayList( namedStreams, array );
+ }
+
+ /**
+ * This should be a list of PDNamedTextStream objects.
+ *
+ * @param namedStreams The named streams.
+ */
+ public void setNamedJavaScripts( List namedStreams )
+ {
+ COSArray array = COSArrayList.converterToCOSArray( namedStreams );
+ js.setItem( "Doc", array );
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/fdf/FDFNamedPageReference.java b/src/main/java/org/pdfbox/pdmodel/fdf/FDFNamedPageReference.java
new file mode 100644
index 0000000..c03689b
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/fdf/FDFNamedPageReference.java
@@ -0,0 +1,128 @@
+/**
+ * Copyright (c) 2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.fdf;
+
+import org.pdfbox.cos.COSBase;
+import org.pdfbox.cos.COSDictionary;
+
+import org.pdfbox.pdmodel.common.COSObjectable;
+
+import org.pdfbox.pdmodel.common.filespecification.PDFileSpecification;;
+
+/**
+ * This represents an FDF named page reference that is part of the FDF field.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.1 $
+ */
+public class FDFNamedPageReference implements COSObjectable
+{
+ private COSDictionary ref;
+
+ /**
+ * Default constructor.
+ */
+ public FDFNamedPageReference()
+ {
+ ref = new COSDictionary();
+ }
+
+ /**
+ * Constructor.
+ *
+ * @param r The FDF named page reference dictionary.
+ */
+ public FDFNamedPageReference( COSDictionary r )
+ {
+ ref = r;
+ }
+
+ /**
+ * Convert this standard java object to a COS object.
+ *
+ * @return The cos object that matches this Java object.
+ */
+ public COSBase getCOSObject()
+ {
+ return ref;
+ }
+
+ /**
+ * Convert this standard java object to a COS object.
+ *
+ * @return The cos object that matches this Java object.
+ */
+ public COSDictionary getCOSDictionary()
+ {
+ return ref;
+ }
+
+ /**
+ * This will get the name of the referenced page. A required parameter.
+ *
+ * @return The name of the referenced page.
+ */
+ public String getName()
+ {
+ return ref.getString( "Name" );
+ }
+
+ /**
+ * This will set the name of the referenced page.
+ *
+ * @param name The referenced page name.
+ */
+ public void setName( String name )
+ {
+ ref.setString( "Name", name );
+ }
+
+ /**
+ * This will get the file specification of this reference. An optional parameter.
+ *
+ * @return The F entry for this dictionary.
+ */
+ public PDFileSpecification getFileSpecification()
+ {
+ COSBase fs = ref.getDictionaryObject( "F" );
+ return PDFileSpecification.createFS( fs );
+ }
+
+ /**
+ * This will set the file specification for this named page reference.
+ *
+ * @param fs The file specification to set.
+ */
+ public void setFileSpecification( PDFileSpecification fs )
+ {
+ ref.setItem( "F", fs );
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/fdf/FDFOptionElement.java b/src/main/java/org/pdfbox/pdmodel/fdf/FDFOptionElement.java
new file mode 100644
index 0000000..d82a715
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/fdf/FDFOptionElement.java
@@ -0,0 +1,129 @@
+/**
+ * Copyright (c) 2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.fdf;
+
+import org.pdfbox.cos.COSArray;
+import org.pdfbox.cos.COSBase;
+import org.pdfbox.cos.COSString;
+
+import org.pdfbox.pdmodel.common.COSObjectable;
+
+/**
+ * This represents an object that can be used in a Field's Opt entry to represent
+ * an available option and a default appearance string.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.1 $
+ */
+public class FDFOptionElement implements COSObjectable
+{
+ private COSArray option;
+
+ /**
+ * Default constructor.
+ */
+ public FDFOptionElement()
+ {
+ option = new COSArray();
+ option.add( new COSString( "" ) );
+ option.add( new COSString( "" ) );
+ }
+
+ /**
+ * Constructor.
+ *
+ * @param o The option element.
+ */
+ public FDFOptionElement( COSArray o )
+ {
+ option = o;
+ }
+
+ /**
+ * Convert this standard java object to a COS object.
+ *
+ * @return The cos object that matches this Java object.
+ */
+ public COSBase getCOSObject()
+ {
+ return option;
+ }
+
+ /**
+ * Convert this standard java object to a COS object.
+ *
+ * @return The cos object that matches this Java object.
+ */
+ public COSArray getCOSArray()
+ {
+ return option;
+ }
+
+ /**
+ * This will get the string of one of the available options. A required element.
+ *
+ * @return An available option.
+ */
+ public String getOption()
+ {
+ return ((COSString)option.getObject( 0 ) ).getString();
+ }
+
+ /**
+ * This will set the string for an available option.
+ *
+ * @param opt One of the available options.
+ */
+ public void setOption( String opt )
+ {
+ option.set( 0, new COSString( opt ) );
+ }
+
+ /**
+ * This will get the string of default appearance string. A required element.
+ *
+ * @return A default appearance string.
+ */
+ public String getDefaultAppearanceString()
+ {
+ return ((COSString)option.getObject( 1 ) ).getString();
+ }
+
+ /**
+ * This will set the default appearance string.
+ *
+ * @param da The default appearance string.
+ */
+ public void setDefaultAppearanceString( String da )
+ {
+ option.set( 1, new COSString( da ) );
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/fdf/FDFPage.java b/src/main/java/org/pdfbox/pdmodel/fdf/FDFPage.java
new file mode 100644
index 0000000..1f5e0b9
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/fdf/FDFPage.java
@@ -0,0 +1,148 @@
+/**
+ * Copyright (c) 2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.fdf;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.pdfbox.cos.COSArray;
+import org.pdfbox.cos.COSBase;
+import org.pdfbox.cos.COSDictionary;
+
+import org.pdfbox.pdmodel.common.COSArrayList;
+import org.pdfbox.pdmodel.common.COSObjectable;
+
+/**
+ * This represents an FDF page that is part of the FDF document.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.2 $
+ */
+public class FDFPage implements COSObjectable
+{
+ private COSDictionary page;
+
+ /**
+ * Default constructor.
+ */
+ public FDFPage()
+ {
+ page = new COSDictionary();
+ }
+
+ /**
+ * Constructor.
+ *
+ * @param p The FDF page.
+ */
+ public FDFPage( COSDictionary p )
+ {
+ page = p;
+ }
+
+ /**
+ * Convert this standard java object to a COS object.
+ *
+ * @return The cos object that matches this Java object.
+ */
+ public COSBase getCOSObject()
+ {
+ return page;
+ }
+
+ /**
+ * Convert this standard java object to a COS object.
+ *
+ * @return The cos object that matches this Java object.
+ */
+ public COSDictionary getCOSDictionary()
+ {
+ return page;
+ }
+
+ /**
+ * This will get a list of FDFTemplage objects that describe the named pages
+ * that serve as templates.
+ *
+ * @return A list of templates.
+ */
+ public List getTemplates()
+ {
+ List retval = null;
+ COSArray array = (COSArray)page.getDictionaryObject( "Templates" );
+ if( array != null )
+ {
+ List objects = new ArrayList();
+ for( int i=0; i<array.size(); i++ )
+ {
+ objects.add( new FDFTemplate( (COSDictionary)array.getObject( i ) ) );
+ }
+ retval = new COSArrayList( objects, array );
+ }
+ return retval;
+ }
+
+ /**
+ * A list of FDFTemplate objects.
+ *
+ * @param templates A list of templates for this Page.
+ */
+ public void setTemplates( List templates )
+ {
+ page.setItem( "Templates", COSArrayList.converterToCOSArray( templates ) );
+ }
+
+ /**
+ * This will get the FDF page info object.
+ *
+ * @return The Page info.
+ */
+ public FDFPageInfo getPageInfo()
+ {
+ FDFPageInfo retval = null;
+ COSDictionary dict = (COSDictionary)page.getDictionaryObject( "Info" );
+ if( dict != null )
+ {
+ retval = new FDFPageInfo( dict );
+ }
+ return retval;
+ }
+
+ /**
+ * This will set the page info.
+ *
+ * @param info The new page info dictionary.
+ */
+ public void setPageInfo( FDFPageInfo info )
+ {
+ page.setItem( "Info", info );
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/fdf/FDFPageInfo.java b/src/main/java/org/pdfbox/pdmodel/fdf/FDFPageInfo.java
new file mode 100644
index 0000000..e30441e
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/fdf/FDFPageInfo.java
@@ -0,0 +1,85 @@
+/**
+ * Copyright (c) 2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.fdf;
+
+import org.pdfbox.cos.COSBase;
+import org.pdfbox.cos.COSDictionary;
+
+import org.pdfbox.pdmodel.common.COSObjectable;
+
+/**
+ * This represents an FDF page info that is part of the FDF page.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.1 $
+ */
+public class FDFPageInfo implements COSObjectable
+{
+ private COSDictionary pageInfo;
+
+ /**
+ * Default constructor.
+ */
+ public FDFPageInfo()
+ {
+ pageInfo = new COSDictionary();
+ }
+
+ /**
+ * Constructor.
+ *
+ * @param p The FDF page.
+ */
+ public FDFPageInfo( COSDictionary p )
+ {
+ pageInfo = p;
+ }
+
+ /**
+ * Convert this standard java object to a COS object.
+ *
+ * @return The cos object that matches this Java object.
+ */
+ public COSBase getCOSObject()
+ {
+ return pageInfo;
+ }
+
+ /**
+ * Convert this standard java object to a COS object.
+ *
+ * @return The cos object that matches this Java object.
+ */
+ public COSDictionary getCOSDictionary()
+ {
+ return pageInfo;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/fdf/FDFTemplate.java b/src/main/java/org/pdfbox/pdmodel/fdf/FDFTemplate.java
new file mode 100644
index 0000000..217ca30
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/fdf/FDFTemplate.java
@@ -0,0 +1,167 @@
+/**
+ * Copyright (c) 2004-2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.fdf;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.pdfbox.cos.COSArray;
+import org.pdfbox.cos.COSBase;
+import org.pdfbox.cos.COSDictionary;
+
+import org.pdfbox.pdmodel.common.COSArrayList;
+import org.pdfbox.pdmodel.common.COSObjectable;
+
+/**
+ * This represents an FDF template that is part of the FDF page.
+ *
+ * @author Ben Litchfield (ben@benlitchfield.com)
+ * @version $Revision: 1.2 $
+ */
+public class FDFTemplate implements COSObjectable
+{
+ private COSDictionary template;
+
+ /**
+ * Default constructor.
+ */
+ public FDFTemplate()
+ {
+ template = new COSDictionary();
+ }
+
+ /**
+ * Constructor.
+ *
+ * @param t The FDF page template.
+ */
+ public FDFTemplate( COSDictionary t )
+ {
+ template = t;
+ }
+
+ /**
+ * Convert this standard java object to a COS object.
+ *
+ * @return The cos object that matches this Java object.
+ */
+ public COSBase getCOSObject()
+ {
+ return template;
+ }
+
+ /**
+ * Convert this standard java object to a COS object.
+ *
+ * @return The cos object that matches this Java object.
+ */
+ public COSDictionary getCOSDictionary()
+ {
+ return template;
+ }
+
+ /**
+ * This is the template reference.
+ *
+ * @return The template reference.
+ */
+ public FDFNamedPageReference getTemplateReference()
+ {
+ FDFNamedPageReference retval = null;
+ COSDictionary dict = (COSDictionary)template.getDictionaryObject( "TRef" );
+ if( dict != null )
+ {
+ retval = new FDFNamedPageReference( dict );
+ }
+ return retval;
+ }
+
+ /**
+ * This will set the template reference.
+ *
+ * @param tRef The template reference.
+ */
+ public void setTemplateReference( FDFNamedPageReference tRef )
+ {
+ template.setItem( "TRef", tRef );
+ }
+
+ /**
+ * This will get a list of fields that are part of this template.
+ *
+ * @return A list of fields.
+ */
+ public List getFields()
+ {
+ List retval = null;
+ COSArray array = (COSArray)template.getDictionaryObject( "Fields" );
+ if( array != null )
+ {
+ List fields = new ArrayList();
+ for( int i=0; i<array.size(); i++ )
+ {
+ fields.add( new FDFField( (COSDictionary)array.getObject( i ) ) );
+ }
+ retval = new COSArrayList( fields, array );
+ }
+ return retval;
+ }
+
+ /**
+ * This will set a list of fields for this template.
+ *
+ * @param fields The list of fields to set for this template.
+ */
+ public void setFields( List fields )
+ {
+ template.setItem( "Fields", COSArrayList.converterToCOSArray( fields ) );
+ }
+
+ /**
+ * A flag telling if the fields imported from the template may be renamed if there are conflicts.
+ *
+ * @return A flag telling if the fields can be renamed.
+ */
+ public boolean shouldRename()
+ {
+ return template.getBoolean( "Rename", false );
+ }
+
+ /**
+ * This will set if the fields can be renamed.
+ *
+ * @param value The flag value.
+ */
+ public void setRename( boolean value )
+ {
+ template.setBoolean( "Rename", value );
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/fdf/package.html b/src/main/java/org/pdfbox/pdmodel/fdf/package.html
new file mode 100644
index 0000000..e2b6fea
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/fdf/package.html
@@ -0,0 +1,9 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head>
+
+</head>
+<body>
+The fdf package will handle all of the logic used for FDF objects inside of the PDF/FDF document.
+</body>
+</html>
diff --git a/src/main/java/org/pdfbox/pdmodel/font/PDCIDFont.java b/src/main/java/org/pdfbox/pdmodel/font/PDCIDFont.java
new file mode 100644
index 0000000..e13b821
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/font/PDCIDFont.java
@@ -0,0 +1,248 @@
+/**
+ * Copyright (c) 2003-2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.font;
+
+import java.awt.Graphics;
+
+import java.io.IOException;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.pdfbox.cos.COSArray;
+import org.pdfbox.cos.COSBase;
+import org.pdfbox.cos.COSDictionary;
+import org.pdfbox.cos.COSInteger;
+import org.pdfbox.cos.COSName;
+import org.pdfbox.cos.COSNumber;
+import org.pdfbox.pdmodel.common.PDRectangle;
+
+import org.apache.log4j.Logger;
+
+/**
+ * This is implementation for the CIDFontType0/CIDFontType2 Fonts.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.7 $
+ */
+public abstract class PDCIDFont extends PDFont
+{
+ private static Logger log = Logger.getLogger(PDCIDFont.class);
+
+
+ private Map widthCache = new HashMap();
+
+ /**
+ * Constructor.
+ */
+ public PDCIDFont()
+ {
+ super();
+ }
+
+ /**
+ * Constructor.
+ *
+ * @param fontDictionary The font dictionary according to the PDF specification.
+ */
+ public PDCIDFont( COSDictionary fontDictionary )
+ {
+ super( fontDictionary );
+ }
+
+ /**
+ * @see PDFont#drawString( String, Graphics, float, float, float, float, float )
+ */
+ public void drawString( String string, Graphics g, float fontSize,
+ float xScale, float yScale, float x, float y )
+ {
+ throw new RuntimeException( "Not yet implemented" );
+ }
+
+ /**
+ * This will get the fonts bouding box.
+ *
+ * @return The fonts bouding box.
+ *
+ * @throws IOException If there is an error getting the font bounding box.
+ */
+ public PDRectangle getFontBoundingBox() throws IOException
+ {
+ throw new RuntimeException( "Not yet implemented" );
+ }
+
+ /**
+ * This will get the default width. The default value for the default width is 1000.
+ *
+ * @return The default width for the glyphs in this font.
+ */
+ public long getDefaultWidth()
+ {
+ long dw = 1000;
+ COSNumber number = (COSNumber)font.getDictionaryObject( COSName.getPDFName( "DW" ) );
+ if( number != null )
+ {
+ dw = number.intValue();
+ }
+ return dw;
+ }
+
+ /**
+ * This will set the default width for the glyphs of this font.
+ *
+ * @param dw The default width.
+ */
+ public void setDefaultWidth( long dw )
+ {
+ font.setItem( COSName.getPDFName( "DW" ), new COSInteger( dw ) );
+ }
+
+ /**
+ * This will get the font width for a character.
+ *
+ * @param c The character code to get the width for.
+ * @param offset The offset into the array.
+ * @param length The length of the data.
+ *
+ * @return The width is in 1000 unit of text space, ie 333 or 777
+ *
+ * @throws IOException If an error occurs while parsing.
+ */
+ public float getFontWidth( byte[] c, int offset, int length ) throws IOException
+ {
+
+ float retval = 0.0f;
+ int code = getCodeFromArray( c, offset, length );
+
+ Float widthFloat = (Float)widthCache.get( new Integer( code ) );
+ if( widthFloat == null )
+ {
+ COSArray widths = (COSArray)font.getDictionaryObject( COSName.getPDFName( "W" ) );
+
+ if( widths != null )
+ {
+ boolean foundWidth = false;
+ for( int i=0; !foundWidth && i<widths.size(); i++ )
+ {
+ COSNumber firstCode = (COSNumber)widths.getObject( i++ );
+ COSBase next = widths.getObject( i );
+ if( next instanceof COSArray )
+ {
+ COSArray array = (COSArray)next;
+ if( code >= firstCode.intValue() &&
+ code < firstCode.intValue() + array.size() )
+ {
+ COSNumber rangeWidth =
+ (COSNumber)array.get( code - firstCode.intValue() );
+ retval = rangeWidth.floatValue();
+ foundWidth = true;
+ }
+ }
+ else
+ {
+ COSNumber secondCode = (COSNumber)next;
+ i++;
+ COSNumber rangeWidth = (COSNumber)widths.getObject( i );
+ if( code >= firstCode.intValue() &&
+ code <= secondCode.intValue() )
+ {
+ retval = rangeWidth.floatValue();
+ foundWidth = true;
+ }
+ }
+ }
+ widthCache.put( new Integer( code ), new Float( retval ) );
+ }
+ }
+ else
+ {
+ retval = widthFloat.floatValue();
+ }
+
+ if(log.isDebugEnabled() )
+ {
+ log.debug( "PDCIDFontType0Font.getFontWidth( code=" + code +" ) retval=" +retval );
+ }
+ return retval;
+ }
+
+ /**
+ * This will get the average font width for all characters.
+ *
+ * @return The width is in 1000 unit of text space, ie 333 or 777
+ *
+ * @throws IOException If an error occurs while parsing.
+ */
+ public float getAverageFontWidth() throws IOException
+ {
+ float totalWidths = 0.0f;
+ float characterCount = 0.0f;
+ float defaultWidth = getDefaultWidth();
+ COSArray widths = (COSArray)font.getDictionaryObject( COSName.getPDFName( "W" ) );
+
+ if( widths != null )
+ {
+ for( int i=0; i<widths.size(); i++ )
+ {
+ COSNumber firstCode = (COSNumber)widths.getObject( i++ );
+ COSBase next = widths.getObject( i );
+ float nextWidth=0.0f;
+ if( next instanceof COSArray )
+ {
+ COSArray array = (COSArray)next;
+ for( int j=0; j<array.size(); j++ )
+ {
+ COSNumber width = (COSNumber)array.get( j );
+ totalWidths+=width.floatValue();
+ characterCount += 1;
+ }
+ }
+ else
+ {
+ COSNumber secondCode = (COSNumber)next;
+ i++;
+ COSNumber rangeWidth = (COSNumber)widths.getObject( i );
+ if( rangeWidth.floatValue() > 0 )
+ {
+ totalWidths += rangeWidth.floatValue();
+ characterCount += 1;
+ }
+ }
+ }
+ }
+ float average = totalWidths / characterCount;
+ if( average <= 0 )
+ {
+ average = defaultWidth;
+ }
+ return average;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/font/PDCIDFontType0Font.java b/src/main/java/org/pdfbox/pdmodel/font/PDCIDFontType0Font.java
new file mode 100644
index 0000000..4c6589c
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/font/PDCIDFontType0Font.java
@@ -0,0 +1,66 @@
+/**
+ * Copyright (c) 2003, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.font;
+
+import org.pdfbox.cos.COSDictionary;
+import org.pdfbox.cos.COSName;
+
+import org.apache.log4j.Logger;
+
+/**
+ * This is implementation of the CIDFontType0 Font.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.4 $
+ */
+public class PDCIDFontType0Font extends PDCIDFont
+{
+ private static Logger log = Logger.getLogger(PDCIDFontType0Font.class);
+
+ /**
+ * Constructor.
+ */
+ public PDCIDFontType0Font()
+ {
+ super();
+ font.setItem( COSName.SUBTYPE, COSName.getPDFName( "CIDFontType0" ) );
+ }
+
+ /**
+ * Constructor.
+ *
+ * @param fontDictionary The font dictionary according to the PDF specification.
+ */
+ public PDCIDFontType0Font( COSDictionary fontDictionary )
+ {
+ super( fontDictionary );
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/font/PDCIDFontType2Font.java b/src/main/java/org/pdfbox/pdmodel/font/PDCIDFontType2Font.java
new file mode 100644
index 0000000..bda6c4a
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/font/PDCIDFontType2Font.java
@@ -0,0 +1,66 @@
+/**
+ * Copyright (c) 2003, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.font;
+
+import org.pdfbox.cos.COSDictionary;
+import org.pdfbox.cos.COSName;
+
+import org.apache.log4j.Logger;
+
+/**
+ * This is implementation of the CIDFontType2 Font.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.3 $
+ */
+public class PDCIDFontType2Font extends PDCIDFont
+{
+ private static Logger log = Logger.getLogger(PDCIDFontType2Font.class);
+
+ /**
+ * Constructor.
+ */
+ public PDCIDFontType2Font()
+ {
+ super();
+ font.setItem( COSName.SUBTYPE, COSName.getPDFName( "CIDFontType2" ) );
+ }
+
+ /**
+ * Constructor.
+ *
+ * @param fontDictionary The font dictionary according to the PDF specification.
+ */
+ public PDCIDFontType2Font( COSDictionary fontDictionary )
+ {
+ super( fontDictionary );
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/font/PDFont.java b/src/main/java/org/pdfbox/pdmodel/font/PDFont.java
new file mode 100644
index 0000000..593c8b0
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/font/PDFont.java
@@ -0,0 +1,863 @@
+/**
+ * Copyright (c) 2003-2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.font;
+
+import org.pdfbox.afmparser.AFMParser;
+
+import org.pdfbox.afmtypes.FontMetric;
+
+import org.pdfbox.cmapparser.CMapParser;
+
+import org.pdfbox.cmaptypes.CMap;
+
+import org.pdfbox.encoding.AFMEncoding;
+import org.pdfbox.encoding.DictionaryEncoding;
+import org.pdfbox.encoding.Encoding;
+import org.pdfbox.encoding.EncodingManager;
+
+import org.pdfbox.cos.COSArray;
+import org.pdfbox.cos.COSBase;
+import org.pdfbox.cos.COSDictionary;
+import org.pdfbox.cos.COSFloat;
+import org.pdfbox.cos.COSName;
+import org.pdfbox.cos.COSNumber;
+import org.pdfbox.cos.COSStream;
+
+import org.pdfbox.pdmodel.common.COSArrayList;
+import org.pdfbox.pdmodel.common.COSObjectable;
+import org.pdfbox.pdmodel.common.PDMatrix;
+import org.pdfbox.pdmodel.common.PDRectangle;
+
+import org.pdfbox.util.ResourceLoader;
+
+import org.apache.log4j.Logger;
+
+import java.awt.Graphics;
+
+import java.io.BufferedReader;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.IOException;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.StringTokenizer;
+
+/**
+ * This is the base class for all PDF fonts.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.32 $
+ */
+public abstract class PDFont implements COSObjectable
+{
+ private static Logger log = Logger.getLogger(PDFont.class);
+
+ /**
+ * The cos dictionary for this font.
+ */
+ protected COSDictionary font;
+
+ /**
+ * This is only used if this is a font object and it has an encoding.
+ */
+ private Encoding fontEncoding = null;
+ /**
+ * This is only used if this is a font object and it has an encoding and it is
+ * a type0 font with a cmap.
+ */
+ private CMap cmap = null;
+
+ private static Map afmResources = null;
+ private static Map cmapObjects = null;
+ private static Map afmObjects = null;
+ private static Map cmapSubstitutions = null;
+
+ static
+ {
+ //these are read-only once they are created
+ afmResources = new HashMap();
+ cmapSubstitutions = new HashMap();
+
+ //these are read-write
+ cmapObjects = Collections.synchronizedMap( new HashMap() );
+ afmObjects = Collections.synchronizedMap( new HashMap() );
+
+
+ afmResources.put( COSName.getPDFName( "Courier-Bold" ), "Resources/afm/Courier-Bold.afm" );
+ afmResources.put( COSName.getPDFName( "Courier-BoldOblique" ), "Resources/afm/Courier-BoldOblique.afm" );
+ afmResources.put( COSName.getPDFName( "Courier" ), "Resources/afm/Courier.afm" );
+ afmResources.put( COSName.getPDFName( "Courier-Oblique" ), "Resources/afm/Courier-Oblique.afm" );
+ afmResources.put( COSName.getPDFName( "Helvetica" ), "Resources/afm/Helvetica.afm" );
+ afmResources.put( COSName.getPDFName( "Helvetica-Bold" ), "Resources/afm/Helvetica-Bold.afm" );
+ afmResources.put( COSName.getPDFName( "Helvetica-BoldOblique" ), "Resources/afm/Helvetica-BoldOblique.afm" );
+ afmResources.put( COSName.getPDFName( "Helvetica-Oblique" ), "Resources/afm/Helvetica-Oblique.afm" );
+ afmResources.put( COSName.getPDFName( "Symbol" ), "Resources/afm/Symbol.afm" );
+ afmResources.put( COSName.getPDFName( "Times-Bold" ), "Resources/afm/Times-Bold.afm" );
+ afmResources.put( COSName.getPDFName( "Times-BoldItalic" ), "Resources/afm/Times-BoldItalic.afm" );
+ afmResources.put( COSName.getPDFName( "Times-Italic" ), "Resources/afm/Times-Italic.afm" );
+ afmResources.put( COSName.getPDFName( "Times-Roman" ), "Resources/afm/Times-Roman.afm" );
+ afmResources.put( COSName.getPDFName( "ZapfDingbats" ), "Resources/afm/ZapfDingbats.afm" );
+
+ cmapSubstitutions.put( "ETenms-B5-H", "ETen-B5-H" );
+ cmapSubstitutions.put( "ETenms-B5-V", "ETen-B5-V" );
+ }
+
+ /**
+ * This will clear AFM resources that are stored statically.
+ * This is usually not a problem unless you want to reclaim
+ * resources for a long running process.
+ *
+ * SPECIAL NOTE: The font calculations are currently in COSObject, which
+ * is where they will reside until PDFont is mature enough to take them over.
+ * PDFont is the appropriate place for them and not in COSObject but we need font
+ * calculations for text extractaion. THIS METHOD WILL BE MOVED OR REMOVED
+ * TO ANOTHER LOCATION IN A FUTURE VERSION OF PDFBOX.
+ */
+ public static void clearResources()
+ {
+ afmObjects.clear();
+ cmapObjects.clear();
+ }
+
+ /**
+ * Constructor.
+ */
+ public PDFont()
+ {
+ font = new COSDictionary();
+ font.setItem( COSName.TYPE, COSName.FONT );
+ }
+
+ /**
+ * Constructor.
+ *
+ * @param fontDictionary The font dictionary according to the PDF specification.
+ */
+ public PDFont( COSDictionary fontDictionary )
+ {
+ font = fontDictionary;
+ }
+
+ /**
+ * @see COSObjectable#getCOSObject()
+ */
+ public COSBase getCOSObject()
+ {
+ return font;
+ }
+
+ /**
+ * This will get the font width for a character.
+ *
+ * @param c The character code to get the width for.
+ * @param offset The offset into the array.
+ * @param length The length of the data.
+ *
+ * @return The width is in 1000 unit of text space, ie 333 or 777
+ *
+ * @throws IOException If an error occurs while parsing.
+ */
+ public abstract float getFontWidth( byte[] c, int offset, int length ) throws IOException;
+
+ /**
+ * This will get the width of this string for this font.
+ *
+ * @param string The string to get the width of.
+ *
+ * @return The width of the string in 1000 units of text space, ie 333 567...
+ *
+ * @throws IOException If there is an error getting the width information.
+ */
+ public float getStringWidth( String string ) throws IOException
+ {
+ byte[] data = string.getBytes();
+ float totalWidth = 0;
+ for( int i=0; i<data.length; i++ )
+ {
+ totalWidth+=getFontWidth( data, i, 1 );
+ }
+ return totalWidth;
+ }
+
+ /**
+ * This will get the average font width for all characters.
+ *
+ * @return The width is in 1000 unit of text space, ie 333 or 777
+ *
+ * @throws IOException If an error occurs while parsing.
+ */
+ public abstract float getAverageFontWidth() throws IOException;
+
+ /**
+ * This will draw a string on a canvas using the font.
+ *
+ * @param string The string to draw.
+ * @param g The graphics to draw onto.
+ * @param fontSize The size of the font to draw.
+ * @param xScale The x scaling percent.
+ * @param yScale The y scaling percent.
+ * @param x The x coordinate to draw at.
+ * @param y The y coordinate to draw at.
+ *
+ * @throws IOException If there is an error drawing the specific string.
+ */
+ public abstract void drawString( String string, Graphics g, float fontSize,
+ float xScale, float yScale, float x, float y ) throws IOException;
+
+ /**
+ * Used for multibyte encodings.
+ *
+ * @param data The array of data.
+ * @param offset The offset into the array.
+ * @param length The number of bytes to use.
+ *
+ * @return The int value of data from the array.
+ */
+ protected int getCodeFromArray( byte[] data, int offset, int length )
+ {
+ int code = 0;
+ for( int i=0; i<length; i++ )
+ {
+ code <<= 8;
+ code = (data[offset+i]+256)%256;
+ }
+ return code;
+ }
+
+ /**
+ * This will attempt to get the font width from an AFM file.
+ *
+ * @param code The character code we are trying to get.
+ *
+ * @return The font width from the AFM file.
+ *
+ * @throws IOException if we cannot find the width.
+ */
+ protected float getFontWidthFromAFMFile( int code ) throws IOException
+ {
+ float retval = 0;
+ FontMetric metric = getAFM();
+ if( metric != null )
+ {
+ Encoding encoding = getEncoding();
+ COSName characterName = encoding.getName( code );
+ retval = metric.getCharacterWidth( characterName.getName() );
+ }
+ return retval;
+ }
+
+ /**
+ * This will attempt to get the average font width from an AFM file.
+ *
+ * @return The average font width from the AFM file.
+ *
+ * @throws IOException if we cannot find the width.
+ */
+ protected float getAverageFontWidthFromAFMFile() throws IOException
+ {
+ float retval = 0;
+ FontMetric metric = getAFM();
+ if( metric != null )
+ {
+ retval = metric.getAverageCharacterWidth();
+ }
+ return retval;
+ }
+
+ /**
+ * This will get an AFM object if one exists.
+ *
+ * @return The afm object from the name.
+ *
+ * @throws IOException If there is an error getting the AFM object.
+ */
+ protected FontMetric getAFM() throws IOException
+ {
+ COSName name = (COSName)font.getDictionaryObject( COSName.BASE_FONT );
+ FontMetric result = null;
+ if( name != null )
+ {
+ result = (FontMetric)afmObjects.get( name );
+ if( result == null )
+ {
+ String resource = (String)afmResources.get( name );
+ if( log.isDebugEnabled() )
+ {
+ log.debug("resource: " + resource + ", name: " + name.getName());
+ }
+ if( resource == null )
+ {
+ if( log.isDebugEnabled() )
+ {
+ log.debug( "resource is null" );
+ }
+ //ok for now
+ //throw new IOException( "Unknown AFM font '" + name.getName() + "'" );
+ }
+ else
+ {
+ InputStream afmStream = ResourceLoader.loadResource( resource );
+ if( afmStream == null )
+ {
+ throw new IOException( "Can't handle font width:" + resource );
+ }
+ AFMParser parser = new AFMParser( afmStream );
+ parser.parse();
+ result = parser.getResult();
+ afmObjects.put( name, result );
+ }
+ }
+ }
+ return result;
+ }
+
+ /**
+ * This will perform the encoding of a character if needed.
+ *
+ * @param c The character to encode.
+ * @param offset The offset into the array to get the data
+ * @param length The number of bytes to read.
+ *
+ * @return The value of the encoded character.
+ *
+ * @throws IOException If there is an error during the encoding.
+ */
+ public String encode( byte[] c, int offset, int length ) throws IOException
+ {
+ String retval = null;
+ COSName fontSubtype = (COSName)font.getDictionaryObject( COSName.SUBTYPE );
+ String fontSubtypeName = fontSubtype.getName();
+ if( fontSubtypeName.equals( "Type0" ) ||
+ fontSubtypeName.equals( "Type1" ) ||
+ fontSubtypeName.equals( "TrueType" ))
+ {
+ if( cmap == null )
+ {
+ if( font.getDictionaryObject( COSName.TO_UNICODE ) != null )
+ {
+ COSStream toUnicode = (COSStream)font.getDictionaryObject( COSName.TO_UNICODE );
+ if( toUnicode != null )
+ {
+ parseCmap( toUnicode.getUnfilteredStream(), null );
+ if( log.isDebugEnabled() )
+ {
+ log.debug( "Getting embedded CMAP Stream from ToUnicode" );
+ }
+ }
+ }
+ else
+ {
+ COSBase encoding = font.getDictionaryObject( COSName.ENCODING );
+ if( encoding instanceof COSStream )
+ {
+ COSStream encodingStream = (COSStream)encoding;
+ parseCmap( encodingStream.getUnfilteredStream(), null );
+ if( log.isDebugEnabled() )
+ {
+ log.debug( "Getting embedded CMAP Stream from encoding" );
+ }
+ }
+ else if( fontSubtypeName.equals( "Type0" ) &&
+ encoding instanceof COSName )
+ {
+ COSName encodingName = (COSName)encoding;
+ cmap = (CMap)cmapObjects.get( encodingName );
+ if( cmap != null )
+ {
+ cmap = (CMap)cmapObjects.get( encodingName );
+ }
+ else
+ {
+ if( log.isDebugEnabled() )
+ {
+ log.debug( "Getting CMAP Stream from resource" );
+ }
+ String cmapName = encodingName.getName();
+ cmapName = performCMAPSubstitution( cmapName );
+ String resourceName = "Resources/cmap/" + cmapName;
+ parseCmap( ResourceLoader.loadResource( resourceName ), encodingName );
+ if( cmap == null && !encodingName.getName().equals( COSName.IDENTITY_H.getName() ) )
+ {
+ throw new IOException( "Error: Could not find predefined " +
+ "CMAP file for '" + encodingName.getName() + "'" );
+ }
+ }
+ }
+ else if( encoding instanceof COSName ||
+ encoding instanceof COSDictionary )
+ {
+ Encoding currentFontEncoding = getEncoding();
+ if( currentFontEncoding != null )
+ {
+ retval = currentFontEncoding.getCharacter( getCodeFromArray( c, offset, length ) );
+ }
+ }
+ else
+ {
+ COSDictionary fontDescriptor =
+ (COSDictionary)font.getDictionaryObject( COSName.FONT_DESC );
+ if( fontSubtypeName.equals( "TrueType" ) &&
+ fontDescriptor != null &&
+ (fontDescriptor.getDictionaryObject( COSName.FONT_FILE )!= null ||
+ fontDescriptor.getDictionaryObject( COSName.FONT_FILE2 ) != null ||
+ fontDescriptor.getDictionaryObject( COSName.FONT_FILE3 ) != null ) )
+ {
+ //If we are using an embedded font then there is not much we can do besides
+ //return the same character codes.
+ //retval = new String( c,offset, length );
+ retval = getStringFromArray( c, offset, length );
+ }
+ else
+ {
+ //this case will be handled below after checking the cmap
+ }
+ }
+ }
+
+
+ }
+ }
+ if( log.isDebugEnabled() )
+ {
+ log.debug( "retval=" + retval + " cmap=" + cmap);
+ }
+ if( retval == null && cmap != null )
+ {
+
+ retval = cmap.lookup( c, offset, length );
+ if( log.isDebugEnabled() )
+ {
+ log.debug( "cmap.lookup(" +c + ")='" +retval + "'" );
+ }
+ }
+ //if we havn't found a value yet and
+ //we are still on the first byte and
+ //there is no cmap or the cmap does not have 2 byte mappings then try to encode
+ //using fallback methods.
+ if( retval == null &&
+ length == 1 &&
+ (cmap == null || !cmap.hasTwoByteMappings()))
+ {
+ if( log.isDebugEnabled() )
+ {
+ log.debug( "No CMAP: Using fallback method");
+ }
+ Encoding encoding = getEncoding();
+ if( encoding != null )
+ {
+ retval = encoding.getCharacter( getCodeFromArray( c, offset, length ) );
+ }
+ if( retval == null )
+ {
+ retval = getStringFromArray( c, offset, length );
+ }
+ }
+ return retval;
+ }
+
+ private static final String[] SINGLE_CHAR_STRING = new String[256];
+ private static final String[][] DOUBLE_CHAR_STRING = new String[256][256];
+ static
+ {
+ for( int i=0; i<256; i++ )
+ {
+ SINGLE_CHAR_STRING[i] = new String( new byte[] {(byte)i} );
+ for( int j=0; j<256; j++ )
+ {
+ DOUBLE_CHAR_STRING[i][j] = new String( new byte[] {(byte)i, (byte)j} );
+ }
+ }
+ }
+
+ private static String getStringFromArray( byte[] c, int offset, int length ) throws IOException
+ {
+ String retval = null;
+ if( length == 1 )
+ {
+ retval = SINGLE_CHAR_STRING[(c[offset]+256)%256];
+ }
+ else if( length == 2 )
+ {
+ retval = DOUBLE_CHAR_STRING[(c[offset]+256)%256][(c[offset+1]+256)%256];
+ }
+ else
+ {
+ throw new IOException( "Error:Unknown character length:" + length );
+ }
+ return retval;
+ }
+
+ /**
+ * Some cmap names are synonyms for other CMAPs. If that is the case
+ * then this method will perform that substitution.
+ *
+ * @param cmapName The name of the cmap to attempt to look up.
+ *
+ * @return Either the original name or the substituted name.
+ */
+ private String performCMAPSubstitution( String cmapName )
+ {
+ String retval = (String)cmapSubstitutions.get( cmapName );
+ if( retval == null )
+ {
+ //if there is no substitution then just return the same value.
+ retval = cmapName;
+ }
+ return retval;
+ }
+
+ private void parseCmap( InputStream cmapStream, COSName encodingName ) throws IOException
+ {
+ if( log.isDebugEnabled() )
+ {
+ log.debug( "Parsing a new CMAP for font:" + font );
+ }
+ if( cmapStream != null )
+ {
+ CMapParser parser = new CMapParser( cmapStream, null );
+ parser.parse();
+ cmap = parser.getResult();
+ if( encodingName != null )
+ {
+ cmapObjects.put( encodingName, cmap );
+ }
+ }
+ }
+
+ /**
+ * The will set the encoding for this font.
+ *
+ * @param enc The font encoding.
+ */
+ public void setEncoding( Encoding enc )
+ {
+ font.setItem( COSName.ENCODING, enc );
+ fontEncoding = enc;
+ }
+
+ /**
+ * This will get or create the encoder.
+ *
+ * modified by Christophe Huault : DGBS Strasbourg huault@free.fr october 2004
+ *
+ * @return The encoding to use.
+ *
+ * @throws IOException If there is an error getting the encoding.
+ */
+ public Encoding getEncoding() throws IOException
+ {
+ EncodingManager manager = new EncodingManager();
+ if( fontEncoding == null )
+ {
+ COSBase encoding = font.getDictionaryObject( COSName.ENCODING );
+ if( encoding == null )
+ {
+ FontMetric metric = getAFM();
+ if( metric != null )
+ {
+ fontEncoding = new AFMEncoding( metric );
+ }
+ if( fontEncoding == null )
+ {
+ fontEncoding = manager.getStandardEncoding();
+ }
+ }
+ /**
+ * Si la clé /Encoding existe dans le dictionnaire fonte il y a deux possibilités :
+ * 1er cas : elle est associé à une reference contenant un dictionnaire de type encoding.
+ * Ce dictionnaire PDF est représenté par un DictionaryEncoding.
+ * If the /Encoding Key does exist in the font dictionary, there are two cases :
+ * case one : The value associated with /Encoding is a reference to a dictionary.
+ * This dictionary is represented by an instance of DictionaryEncoding class
+ */
+ else if( encoding instanceof COSDictionary )
+ {
+ COSDictionary encodingDic = (COSDictionary)encoding;
+ //Let's see if the encoding dictionary has a base encoding
+ //If it does not then we will attempt to get it from the font
+ //file
+ COSName baseEncodingName = (COSName) encodingDic.getDictionaryObject(
+ COSName.BASE_ENCODING);
+ //on ajoute une entrée /BaseEncoding dans /Encoding uniquement si elle en est absente
+ //if not find in Encoding dictinary target, we try to find it from else where
+ if( baseEncodingName == null)
+ {
+ COSName fontEncodingFromFile = getEncodingFromFont();
+ encodingDic.setItem(
+ COSName.BASE_ENCODING,
+ fontEncodingFromFile );
+ }
+ fontEncoding = new DictionaryEncoding( encodingDic );
+ }
+ else if( encoding instanceof COSName )
+ {
+ if( !encoding.equals( COSName.IDENTITY_H ) )
+ {
+ fontEncoding = manager.getEncoding( (COSName)encoding );
+ }
+ }
+ else
+ {
+ throw new IOException( "Unexpected encoding type:" + encoding.getClass().getName() );
+ }
+ }
+ return fontEncoding;
+ }
+
+ /**
+ * This will always return "Font" for fonts.
+ *
+ * @return The type of object that this is.
+ */
+ public String getType()
+ {
+ return font.getNameAsString( COSName.TYPE );
+ }
+
+ /**
+ * This will get the subtype of font, Type1, Type3, ...
+ *
+ * @return The type of font that this is.
+ */
+ public String getSubType()
+ {
+ return font.getNameAsString( COSName.SUBTYPE );
+ }
+
+ /**
+ * The PostScript name of the font.
+ *
+ * @return The postscript name of the font.
+ */
+ public String getBaseFont()
+ {
+ return font.getNameAsString( COSName.BASE_FONT );
+ }
+
+ /**
+ * Set the PostScript name of the font.
+ *
+ * @param baseFont The postscript name for the font.
+ */
+ public void setBaseFont( String baseFont )
+ {
+ font.setName( COSName.BASE_FONT, baseFont );
+ }
+
+ /**
+ * The code for the first char or -1 if there is none.
+ *
+ * @return The code for the first character.
+ */
+ public int getFirstChar()
+ {
+ return font.getInt( COSName.FIRST_CHAR, -1 );
+ }
+
+ /**
+ * Set the first character this font supports.
+ *
+ * @param firstChar The first character.
+ */
+ public void setFirstChar( int firstChar )
+ {
+ font.setInt( COSName.FIRST_CHAR, firstChar );
+ }
+
+ /**
+ * The code for the last char or -1 if there is none.
+ *
+ * @return The code for the last character.
+ */
+ public int getLastChar()
+ {
+ return font.getInt( COSName.LAST_CHAR, -1 );
+ }
+
+ /**
+ * Set the last character this font supports.
+ *
+ * @param lastChar The last character.
+ */
+ public void setLastChar( int lastChar )
+ {
+ font.setInt( COSName.LAST_CHAR, lastChar );
+ }
+
+ /**
+ * The widths of the characters. This will be null for the standard 14 fonts.
+ *
+ * @return The widths of the characters.
+ */
+ public List getWidths()
+ {
+ COSArray array = (COSArray)font.getDictionaryObject( COSName.WIDTHS );
+ return COSArrayList.convertFloatCOSArrayToList( array );
+ }
+
+ /**
+ * Set the widths of the characters code.
+ *
+ * @param widths The widths of the character codes.
+ */
+ public void setWidths( List widths )
+ {
+ font.setItem( COSName.WIDTHS, COSArrayList.converterToCOSArray( widths ) );
+ }
+
+ /**
+ * This will get the matrix that is used to transform glyph space to
+ * text space. By default there are 1000 glyph units to 1 text space
+ * unit, but type3 fonts can use any value.
+ *
+ * Note:If this is a type3 font then it can be modified via the PDType3Font.setFontMatrix, otherwise this
+ * is a read-only property.
+ *
+ * @return The matrix to transform from glyph space to text space.
+ */
+ public PDMatrix getFontMatrix()
+ {
+ PDMatrix matrix = null;
+ COSArray array = (COSArray)font.getDictionaryObject( COSName.FONT_MATRIX );
+ if( array == null )
+ {
+ array = new COSArray();
+ array.add( new COSFloat( 0.001f ) );
+ array.add( COSNumber.ZERO );
+ array.add( COSNumber.ZERO );
+ array.add( new COSFloat( 0.001f ) );
+ array.add( COSNumber.ZERO );
+ array.add( COSNumber.ZERO );
+ }
+ matrix = new PDMatrix(array);
+
+ return matrix;
+ }
+
+ /**
+ * Try to get the encoding for the font and add it to the target
+ * the target must be an an Encoding Dictionary.
+ *
+ * added by Christophe Huault : DGBS Strasbourg huault@free.fr october 2004
+ *
+ * @return The encoding from the font.
+ *
+ * @throws IOException If there is an error reading the file.
+ */
+ private COSName getEncodingFromFont() throws IOException
+ {
+ //This whole section of code needs to be replaced with an actual
+ //type1 font parser!!
+
+
+ COSName retvalue = null;
+ //recuperer le programme de fonte dans son stream qui doit se trouver
+ //dans le flux référencé par à la clé FileFont lui même situé dans
+ //le dictionnaire associé à /FontDescriptor du dictionnaire de type /Font courrant
+ //get the font program in the stream which should be located in
+ //the /FileFont Stream object himself in the /FontDescriptior of the current
+ //font dictionary
+ COSDictionary fontDescriptor = (COSDictionary) font.getDictionaryObject(
+ COSName.FONT_DESC);
+ if( fontDescriptor != null )
+ {
+ COSStream fontFile = (COSStream) fontDescriptor.getDictionaryObject(
+ COSName.FONT_FILE);
+ if( fontFile != null )
+ {
+ BufferedReader in =
+ new BufferedReader(new InputStreamReader(fontFile.getUnfilteredStream()));
+ /**
+ * this section parse the FileProgram stream searching for a /Encoding entry
+ * the research stop if the entry "currentdict end" is reach or after 100 lignes
+ */
+ StringTokenizer st = null;
+ boolean found = false;
+ String line = "";
+ String key = null;
+ for( int i = 0; null!=( line = in.readLine() ) &&
+ i < 40 &&
+ !line.equals("currentdict end")
+ && !found; i++)
+ {
+ st = new StringTokenizer(line);
+ if( st.hasMoreTokens() )
+ {
+ key = st.nextToken();
+ if(key.equals("/Encoding") && st.hasMoreTokens() )
+ {
+ COSName value = COSName.getPDFName( st.nextToken() );
+ found = true;
+ if( value.equals( COSName.MAC_ROMAN_ENCODING ) ||
+ value.equals( COSName.PDF_DOC_ENCODING ) ||
+ value.equals( COSName.STANDARD_ENCODING ) ||
+ value.equals( COSName.WIN_ANSI_ENCODING ) )
+ {
+ //value is expected to be one of the encodings
+ //ie. StandardEncoding,WinAnsiEncoding,MacRomanEncoding,PDFDocEncoding
+ retvalue = value;
+ }
+ }
+ }
+ }
+ }
+ }
+ return retvalue;
+ }
+
+ /**
+ * This will get the fonts bouding box.
+ *
+ * @return The fonts bouding box.
+ *
+ * @throws IOException If there is an error getting the bounding box.
+ */
+ public abstract PDRectangle getFontBoundingBox() throws IOException;
+
+ /**
+ * @see Object#equals( Object )
+ */
+ public boolean equals( Object other )
+ {
+ return other instanceof PDFont && ((PDFont)other).getCOSObject() == this.getCOSObject();
+ }
+
+ /**
+ * @see Object#hashCode()
+ */
+ public int hashCode()
+ {
+ return this.getCOSObject().hashCode();
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/font/PDFontDescriptor.java b/src/main/java/org/pdfbox/pdmodel/font/PDFontDescriptor.java
new file mode 100644
index 0000000..59668ce
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/font/PDFontDescriptor.java
@@ -0,0 +1,530 @@
+/**
+ * Copyright (c) 2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.font;
+
+import java.io.IOException;
+
+import org.pdfbox.pdmodel.common.PDRectangle;
+
+/**
+ * This class represents an interface to the font description. This will depend
+ * on the font type for the actual implementation. If it is a AFM/cmap/or embedded font.
+ *
+ * @author Ben Litchfield
+ * @version $Revision: 1.1 $
+ */
+public abstract class PDFontDescriptor
+{
+ /**
+ * A font descriptor flag. See PDF Reference for description.
+ */
+ private static final int FLAG_FIXED_PITCH = 1;
+ /**
+ * A font descriptor flag. See PDF Reference for description.
+ */
+ private static final int FLAG_SERIF = 2;
+ /**
+ * A font descriptor flag. See PDF Reference for description.
+ */
+ private static final int FLAG_SYMBOLIC = 3;
+ /**
+ * A font descriptor flag. See PDF Reference for description.
+ */
+ private static final int FLAG_SCRIPT = 4;
+ /**
+ * A font descriptor flag. See PDF Reference for description.
+ */
+ private static final int FLAG_NON_SYMBOLIC = 6;
+ /**
+ * A font descriptor flag. See PDF Reference for description.
+ */
+ private static final int FLAG_ITALIC = 7;
+ /**
+ * A font descriptor flag. See PDF Reference for description.
+ */
+ private static final int FLAG_ALL_CAP = 17;
+ /**
+ * A font descriptor flag. See PDF Reference for description.
+ */
+ private static final int FLAG_SMALL_CAP = 18;
+ /**
+ * A font descriptor flag. See PDF Reference for description.
+ */
+ private static final int FLAG_FORCE_BOLD = 19;
+
+
+ /**
+ * Get the font name.
+ *
+ * @return The name of the font.
+ */
+ public abstract String getFontName();
+
+ /**
+ * This will set the font name.
+ *
+ * @param fontName The new name for the font.
+ */
+ public abstract void setFontName( String fontName );
+
+ /**
+ * A string representing the preferred font family.
+ *
+ * @return The font family.
+ */
+ public abstract String getFontFamily();
+
+ /**
+ * This will set the font family.
+ *
+ * @param fontFamily The font family.
+ */
+ public abstract void setFontFamily( String fontFamily );
+
+ /**
+ * A string representing the preferred font stretch.
+ * According to the PDF Spec:
+ * The font stretch value; it must be one of the following (ordered from
+ * narrowest to widest): UltraCondensed, ExtraCondensed, Condensed, SemiCondensed,
+ * Normal, SemiExpanded, Expanded, ExtraExpanded or UltraExpanded.
+ *
+ * @return The font stretch.
+ */
+ public abstract String getFontStretch();
+
+ /**
+ * This will set the font stretch.
+ *
+ * @param fontStretch The font stretch
+ */
+ public abstract void setFontStretch( String fontStretch );
+
+ /**
+ * The weight of the font. According to the PDF spec "possible values are
+ * 100, 200, 300, 400, 500, 600, 700, 800 or 900" Where a higher number is
+ * more weight and appears to be more bold.
+ *
+ * @return The font weight.
+ */
+ public abstract float getFontWeight();
+
+ /**
+ * Set the weight of the font.
+ *
+ * @param fontWeight The new weight of the font.
+ */
+ public abstract void setFontWeight( float fontWeight );
+
+ /**
+ * This will get the font flags.
+ *
+ * @return The font flags.
+ */
+ public abstract int getFlags();
+
+ /**
+ * This will set the font flags.
+ *
+ * @param flags The new font flags.
+ */
+ public abstract void setFlags( int flags );
+
+ /**
+ * A convenience method that checks the flag bit.
+ *
+ * @return The flag value.
+ */
+ public boolean isFixedPitch()
+ {
+ return isFlagBitOn( FLAG_FIXED_PITCH );
+ }
+
+ /**
+ * A convenience method that sets the flag bit.
+ *
+ * @param flag The flag value.
+ */
+ public void setFixedPitch( boolean flag )
+ {
+ setFlagBit( FLAG_FIXED_PITCH, flag );
+ }
+
+ /**
+ * A convenience method that checks the flag bit.
+ *
+ * @return The flag value.
+ */
+ public boolean isSerif()
+ {
+ return isFlagBitOn( FLAG_SERIF );
+ }
+
+ /**
+ * A convenience method that sets the flag bit.
+ *
+ * @param flag The flag value.
+ */
+ public void setSerif( boolean flag )
+ {
+ setFlagBit( FLAG_SERIF, flag );
+ }
+
+ /**
+ * A convenience method that checks the flag bit.
+ *
+ * @return The flag value.
+ */
+ public boolean isSymbolic()
+ {
+ return isFlagBitOn( FLAG_SYMBOLIC );
+ }
+
+ /**
+ * A convenience method that sets the flag bit.
+ *
+ * @param flag The flag value.
+ */
+ public void setSymbolic( boolean flag )
+ {
+ setFlagBit( FLAG_SYMBOLIC, flag );
+ }
+
+ /**
+ * A convenience method that checks the flag bit.
+ *
+ * @return The flag value.
+ */
+ public boolean isScript()
+ {
+ return isFlagBitOn( FLAG_SCRIPT );
+ }
+
+ /**
+ * A convenience method that sets the flag bit.
+ *
+ * @param flag The flag value.
+ */
+ public void setScript( boolean flag )
+ {
+ setFlagBit( FLAG_SCRIPT, flag );
+ }
+
+ /**
+ * A convenience method that checks the flag bit.
+ *
+ * @return The flag value.
+ */
+ public boolean isNonSymbolic()
+ {
+ return isFlagBitOn( FLAG_NON_SYMBOLIC );
+ }
+
+ /**
+ * A convenience method that sets the flag bit.
+ *
+ * @param flag The flag value.
+ */
+ public void setNonSymbolic( boolean flag )
+ {
+ setFlagBit( FLAG_NON_SYMBOLIC, flag );
+ }
+
+ /**
+ * A convenience method that checks the flag bit.
+ *
+ * @return The flag value.
+ */
+ public boolean isItalic()
+ {
+ return isFlagBitOn( FLAG_ITALIC );
+ }
+
+ /**
+ * A convenience method that sets the flag bit.
+ *
+ * @param flag The flag value.
+ */
+ public void setItalic( boolean flag )
+ {
+ setFlagBit( FLAG_ITALIC, flag );
+ }
+
+ /**
+ * A convenience method that checks the flag bit.
+ *
+ * @return The flag value.
+ */
+ public boolean isAllCap()
+ {
+ return isFlagBitOn( FLAG_ALL_CAP);
+ }
+
+ /**
+ * A convenience method that sets the flag bit.
+ *
+ * @param flag The flag value.
+ */
+ public void setAllCap( boolean flag )
+ {
+ setFlagBit( FLAG_ALL_CAP, flag );
+ }
+
+ /**
+ * A convenience method that checks the flag bit.
+ *
+ * @return The flag value.
+ */
+ public boolean isSmallCap()
+ {
+ return isFlagBitOn( FLAG_SMALL_CAP );
+ }
+
+ /**
+ * A convenience method that sets the flag bit.
+ *
+ * @param flag The flag value.
+ */
+ public void setSmallCap( boolean flag )
+ {
+ setFlagBit( FLAG_SMALL_CAP, flag );
+ }
+
+ /**
+ * A convenience method that checks the flag bit.
+ *
+ * @return The flag value.
+ */
+ public boolean isForceBold()
+ {
+ return isFlagBitOn( FLAG_FORCE_BOLD );
+ }
+
+ /**
+ * A convenience method that sets the flag bit.
+ *
+ * @param flag The flag value.
+ */
+ public void setForceBold( boolean flag )
+ {
+ setFlagBit( FLAG_FORCE_BOLD, flag );
+ }
+
+ private boolean isFlagBitOn( int bit )
+ {
+ return (getFlags() & (1 << (bit-1))) != 0;
+ }
+
+ private void setFlagBit( int bit, boolean value )
+ {
+ int flags = getFlags();
+ if( value )
+ {
+ flags = flags| (1 << (bit-1));
+ }
+ else
+ {
+ flags = flags & (0xFFFFFFFF ^ (1 << (bit-1)));
+ }
+ setFlags( flags );
+ }
+
+ /**
+ * This will get the fonts bouding box.
+ *
+ * @return The fonts bouding box.
+ */
+ public abstract PDRectangle getFontBoundingBox();
+
+ /**
+ * Set the fonts bounding box.
+ *
+ * @param rect The new bouding box.
+ */
+ public abstract void setFontBoundingBox( PDRectangle rect );
+
+ /**
+ * This will get the italic angle for the font.
+ *
+ * @return The italic angle.
+ */
+ public abstract float getItalicAngle();
+
+ /**
+ * This will set the italic angle for the font.
+ *
+ * @param angle The new italic angle for the font.
+ */
+ public abstract void setItalicAngle( float angle );
+
+ /**
+ * This will get the ascent for the font.
+ *
+ * @return The ascent.
+ */
+ public abstract float getAscent();
+
+ /**
+ * This will set the ascent for the font.
+ *
+ * @param ascent The new ascent for the font.
+ */
+ public abstract void setAscent( float ascent );
+
+ /**
+ * This will get the descent for the font.
+ *
+ * @return The descent.
+ */
+ public abstract float getDescent();
+
+ /**
+ * This will set the descent for the font.
+ *
+ * @param descent The new descent for the font.
+ */
+ public abstract void setDescent( float descent );
+
+ /**
+ * This will get the leading for the font.
+ *
+ * @return The leading.
+ */
+ public abstract float getLeading();
+
+ /**
+ * This will set the leading for the font.
+ *
+ * @param leading The new leading for the font.
+ */
+ public abstract void setLeading( float leading );
+
+ /**
+ * This will get the CapHeight for the font.
+ *
+ * @return The cap height.
+ */
+ public abstract float getCapHeight();
+
+ /**
+ * This will set the cap height for the font.
+ *
+ * @param capHeight The new cap height for the font.
+ */
+ public abstract void setCapHeight( float capHeight );
+
+ /**
+ * This will get the x height for the font.
+ *
+ * @return The x height.
+ */
+ public abstract float getXHeight();
+
+ /**
+ * This will set the x height for the font.
+ *
+ * @param xHeight The new x height for the font.
+ */
+ public abstract void setXHeight( float xHeight );
+
+ /**
+ * This will get the stemV for the font.
+ *
+ * @return The stem v value.
+ */
+ public abstract float getStemV();
+
+ /**
+ * This will set the stem V for the font.
+ *
+ * @param stemV The new stem v for the font.
+ */
+ public abstract void setStemV( float stemV );
+
+ /**
+ * This will get the stemH for the font.
+ *
+ * @return The stem h value.
+ */
+ public abstract float getStemH();
+
+ /**
+ * This will set the stem H for the font.
+ *
+ * @param stemH The new stem h for the font.
+ */
+ public abstract void setStemH( float stemH );
+
+ /**
+ * This will get the average width for the font. This is part of the
+ * definition in the font description. If it is not present then PDFBox
+ * will make an attempt to calculate it.
+ *
+ * @return The average width value.
+ *
+ * @throws IOException If there is an error calculating the average width.
+ */
+ public abstract float getAverageWidth() throws IOException;
+
+ /**
+ * This will set the average width for the font.
+ *
+ * @param averageWidth The new average width for the font.
+ */
+ public abstract void setAverageWidth( float averageWidth );
+
+ /**
+ * This will get the max width for the font.
+ *
+ * @return The max width value.
+ */
+ public abstract float getMaxWidth();
+
+ /**
+ * This will set the max width for the font.
+ *
+ * @param maxWidth The new max width for the font.
+ */
+ public abstract void setMaxWidth( float maxWidth );
+
+ /**
+ * This will get the character set for the font.
+ *
+ * @return The character set value.
+ */
+ public abstract String getCharSet();
+
+ /**
+ * This will set the character set for the font.
+ *
+ * @param charSet The new character set for the font.
+ */
+ public abstract void setCharacterSet( String charSet );
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/font/PDFontDescriptorAFM.java b/src/main/java/org/pdfbox/pdmodel/font/PDFontDescriptorAFM.java
new file mode 100644
index 0000000..3326b74
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/font/PDFontDescriptorAFM.java
@@ -0,0 +1,446 @@
+/**
+ * Copyright (c) 2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.font;
+
+import java.io.IOException;
+
+import org.pdfbox.afmtypes.FontMetric;
+
+import org.pdfbox.pdmodel.common.PDRectangle;
+
+import org.pdfbox.util.BoundingBox;
+
+/**
+ * This class represents the font descriptor when the font information
+ * is coming from an AFM file.
+ *
+ * @author Ben Litchfield
+ * @version $Revision: 1.1 $
+ */
+public class PDFontDescriptorAFM extends PDFontDescriptor
+{
+ private FontMetric afm;
+
+ /**
+ * Constructor.
+ *
+ * @param afmFile The AFM file.
+ */
+ public PDFontDescriptorAFM( FontMetric afmFile )
+ {
+ afm = afmFile;
+ }
+
+ /**
+ * Get the font name.
+ *
+ * @return The name of the font.
+ */
+ public String getFontName()
+ {
+ return afm.getFontName();
+ }
+
+ /**
+ * This will set the font name.
+ *
+ * @param fontName The new name for the font.
+ */
+ public void setFontName( String fontName )
+ {
+ throw new UnsupportedOperationException( "The AFM Font descriptor is immutable" );
+ }
+
+ /**
+ * A string representing the preferred font family.
+ *
+ * @return The font family.
+ */
+ public String getFontFamily()
+ {
+ return afm.getFamilyName();
+ }
+
+ /**
+ * This will set the font family.
+ *
+ * @param fontFamily The font family.
+ */
+ public void setFontFamily( String fontFamily )
+ {
+ throw new UnsupportedOperationException( "The AFM Font descriptor is immutable" );
+ }
+
+ /**
+ * The weight of the font. According to the PDF spec "possible values are
+ * 100, 200, 300, 400, 500, 600, 700, 800 or 900" Where a higher number is
+ * more weight and appears to be more bold.
+ *
+ * @return The font weight.
+ */
+ public float getFontWeight()
+ {
+ String weight = afm.getWeight();
+ float retval = 500;
+ if( weight != null && weight.equalsIgnoreCase( "bold" ) )
+ {
+ retval = 900;
+ }
+ else if( weight != null && weight.equalsIgnoreCase( "light" ) )
+ {
+ retval = 100;
+ }
+ return retval;
+ }
+
+ /**
+ * Set the weight of the font.
+ *
+ * @param fontWeight The new weight of the font.
+ */
+ public void setFontWeight( float fontWeight )
+ {
+ throw new UnsupportedOperationException( "The AFM Font descriptor is immutable" );
+ }
+
+ /**
+ * A string representing the preferred font stretch.
+ *
+ * @return The font stretch.
+ */
+ public String getFontStretch()
+ {
+ return null;
+ }
+
+ /**
+ * This will set the font stretch.
+ *
+ * @param fontStretch The font stretch
+ */
+ public void setFontStretch( String fontStretch )
+ {
+ throw new UnsupportedOperationException( "The AFM Font descriptor is immutable" );
+ }
+
+ /**
+ * This will get the font flags.
+ *
+ * @return The font flags.
+ */
+ public int getFlags()
+ {
+ //I believe that the only flag that AFM supports is the is fixed pitch
+ return afm.isFixedPitch() ? 1 : 0;
+ }
+
+ /**
+ * This will set the font flags.
+ *
+ * @param flags The new font flags.
+ */
+ public void setFlags( int flags )
+ {
+ throw new UnsupportedOperationException( "The AFM Font descriptor is immutable" );
+ }
+
+ /**
+ * This will get the fonts bouding box.
+ *
+ * @return The fonts bouding box.
+ */
+ public PDRectangle getFontBoundingBox()
+ {
+ BoundingBox box = afm.getFontBBox();
+ PDRectangle retval = null;
+ if( box != null )
+ {
+ retval = new PDRectangle( box );
+ }
+ return retval;
+ }
+
+ /**
+ * Set the fonts bounding box.
+ *
+ * @param rect The new bouding box.
+ */
+ public void setFontBoundingBox( PDRectangle rect )
+ {
+ throw new UnsupportedOperationException( "The AFM Font descriptor is immutable" );
+ }
+
+ /**
+ * This will get the italic angle for the font.
+ *
+ * @return The italic angle.
+ */
+ public float getItalicAngle()
+ {
+ return afm.getItalicAngle();
+ }
+
+ /**
+ * This will set the italic angle for the font.
+ *
+ * @param angle The new italic angle for the font.
+ */
+ public void setItalicAngle( float angle )
+ {
+ throw new UnsupportedOperationException( "The AFM Font descriptor is immutable" );
+ }
+
+ /**
+ * This will get the ascent for the font.
+ *
+ * @return The ascent.
+ */
+ public float getAscent()
+ {
+ return afm.getAscender();
+ }
+
+ /**
+ * This will set the ascent for the font.
+ *
+ * @param ascent The new ascent for the font.
+ */
+ public void setAscent( float ascent )
+ {
+ throw new UnsupportedOperationException( "The AFM Font descriptor is immutable" );
+ }
+
+ /**
+ * This will get the descent for the font.
+ *
+ * @return The descent.
+ */
+ public float getDescent()
+ {
+ return afm.getDescender();
+ }
+
+ /**
+ * This will set the descent for the font.
+ *
+ * @param descent The new descent for the font.
+ */
+ public void setDescent( float descent )
+ {
+ throw new UnsupportedOperationException( "The AFM Font descriptor is immutable" );
+ }
+
+ /**
+ * This will get the leading for the font.
+ *
+ * @return The leading.
+ */
+ public float getLeading()
+ {
+ //AFM does not support setting the leading so we will just ignore it.
+ return 0f;
+ }
+
+ /**
+ * This will set the leading for the font.
+ *
+ * @param leading The new leading for the font.
+ */
+ public void setLeading( float leading )
+ {
+ throw new UnsupportedOperationException( "The AFM Font descriptor is immutable" );
+ }
+
+ /**
+ * This will get the CapHeight for the font.
+ *
+ * @return The cap height.
+ */
+ public float getCapHeight()
+ {
+ return afm.getCapHeight();
+ }
+
+ /**
+ * This will set the cap height for the font.
+ *
+ * @param capHeight The new cap height for the font.
+ */
+ public void setCapHeight( float capHeight )
+ {
+ throw new UnsupportedOperationException( "The AFM Font descriptor is immutable" );
+ }
+
+ /**
+ * This will get the x height for the font.
+ *
+ * @return The x height.
+ */
+ public float getXHeight()
+ {
+ return afm.getXHeight();
+ }
+
+ /**
+ * This will set the x height for the font.
+ *
+ * @param xHeight The new x height for the font.
+ */
+ public void setXHeight( float xHeight )
+ {
+ throw new UnsupportedOperationException( "The AFM Font descriptor is immutable" );
+ }
+
+ /**
+ * This will get the stemV for the font.
+ *
+ * @return The stem v value.
+ */
+ public float getStemV()
+ {
+ //afm does not have a stem v
+ return 0;
+ }
+
+ /**
+ * This will set the stem V for the font.
+ *
+ * @param stemV The new stem v for the font.
+ */
+ public void setStemV( float stemV )
+ {
+ throw new UnsupportedOperationException( "The AFM Font descriptor is immutable" );
+ }
+
+ /**
+ * This will get the stemH for the font.
+ *
+ * @return The stem h value.
+ */
+ public float getStemH()
+ {
+ //afm does not have a stem h
+ return 0;
+ }
+
+ /**
+ * This will set the stem H for the font.
+ *
+ * @param stemH The new stem h for the font.
+ */
+ public void setStemH( float stemH )
+ {
+ throw new UnsupportedOperationException( "The AFM Font descriptor is immutable" );
+ }
+
+ /**
+ * This will get the average width for the font.
+ *
+ * @return The average width value.
+ *
+ * @throws IOException If there is an error calculating the average width.
+ */
+ public float getAverageWidth() throws IOException
+ {
+ return afm.getAverageCharacterWidth();
+ }
+
+ /**
+ * This will set the average width for the font.
+ *
+ * @param averageWidth The new average width for the font.
+ */
+ public void setAverageWidth( float averageWidth )
+ {
+ throw new UnsupportedOperationException( "The AFM Font descriptor is immutable" );
+ }
+
+ /**
+ * This will get the max width for the font.
+ *
+ * @return The max width value.
+ */
+ public float getMaxWidth()
+ {
+ //afm does not support max width;
+ return 0;
+ }
+
+ /**
+ * This will set the max width for the font.
+ *
+ * @param maxWidth The new max width for the font.
+ */
+ public void setMaxWidth( float maxWidth )
+ {
+ throw new UnsupportedOperationException( "The AFM Font descriptor is immutable" );
+ }
+
+ /**
+ * This will get the missing width for the font.
+ *
+ * @return The missing width value.
+ */
+ public float getMissingWidth()
+ {
+ return 0;
+ }
+
+ /**
+ * This will set the missing width for the font.
+ *
+ * @param missingWidth The new missing width for the font.
+ */
+ public void setMissingWidth( float missingWidth )
+ {
+ throw new UnsupportedOperationException( "The AFM Font descriptor is immutable" );
+ }
+
+ /**
+ * This will get the character set for the font.
+ *
+ * @return The character set value.
+ */
+ public String getCharSet()
+ {
+ return afm.getCharacterSet();
+ }
+
+ /**
+ * This will set the character set for the font.
+ *
+ * @param charSet The new character set for the font.
+ */
+ public void setCharacterSet( String charSet )
+ {
+ throw new UnsupportedOperationException( "The AFM Font descriptor is immutable" );
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/font/PDFontDescriptorDictionary.java b/src/main/java/org/pdfbox/pdmodel/font/PDFontDescriptorDictionary.java
new file mode 100644
index 0000000..f3bf61e
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/font/PDFontDescriptorDictionary.java
@@ -0,0 +1,580 @@
+/**
+ * Copyright (c) 2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.font;
+
+import org.pdfbox.cos.COSArray;
+import org.pdfbox.cos.COSDictionary;
+import org.pdfbox.cos.COSName;
+import org.pdfbox.cos.COSString;
+import org.pdfbox.cos.COSStream;
+
+import org.pdfbox.pdmodel.common.PDRectangle;
+import org.pdfbox.pdmodel.common.PDStream;
+
+/**
+ * This class represents an implementation to the font descriptor that gets its
+ * information from a COS Dictionary.
+ *
+ * @author Ben Litchfield
+ * @version $Revision: 1.2 $
+ */
+public class PDFontDescriptorDictionary extends PDFontDescriptor
+{
+ private COSDictionary dic;
+
+ /**
+ * Constructor.
+ */
+ public PDFontDescriptorDictionary()
+ {
+ dic = new COSDictionary();
+ dic.setName( "Type", "FontDescriptor" );
+ }
+
+ /**
+ * Constructor.
+ *
+ * @param desc The wrapped COS Dictionary.
+ */
+ public PDFontDescriptorDictionary( COSDictionary desc )
+ {
+ dic = desc;
+ }
+
+ /**
+ * This will get the dictionary for this object.
+ *
+ * @return The COS dictionary.
+ */
+ public COSDictionary getCOSDictionary()
+ {
+ return dic;
+ }
+
+ /**
+ * Get the font name.
+ *
+ * @return The name of the font.
+ */
+ public String getFontName()
+ {
+ String retval = null;
+ COSName name = (COSName)dic.getDictionaryObject( COSName.getPDFName( "FontName" ) );
+ if( name != null )
+ {
+ retval = name.getName();
+ }
+ return retval;
+ }
+
+ /**
+ * This will set the font name.
+ *
+ * @param fontName The new name for the font.
+ */
+ public void setFontName( String fontName )
+ {
+ COSName name = null;
+ if( fontName != null )
+ {
+ name = COSName.getPDFName( fontName );
+ }
+ dic.setItem( COSName.getPDFName( "FontName" ), name );
+ }
+
+ /**
+ * A string representing the preferred font family.
+ *
+ * @return The font family.
+ */
+ public String getFontFamily()
+ {
+ String retval = null;
+ COSString name = (COSString)dic.getDictionaryObject( COSName.getPDFName( "FontFamily" ) );
+ if( name != null )
+ {
+ retval = name.getString();
+ }
+ return retval;
+ }
+
+ /**
+ * This will set the font family.
+ *
+ * @param fontFamily The font family.
+ */
+ public void setFontFamily( String fontFamily )
+ {
+ COSString name = null;
+ if( fontFamily != null )
+ {
+ name = new COSString( fontFamily );
+ }
+ dic.setItem( COSName.getPDFName( "FontFamily" ), name );
+ }
+
+ /**
+ * The weight of the font. According to the PDF spec "possible values are
+ * 100, 200, 300, 400, 500, 600, 700, 800 or 900" Where a higher number is
+ * more weight and appears to be more bold.
+ *
+ * @return The font weight.
+ */
+ public float getFontWeight()
+ {
+ return dic.getFloat( "FontWeight",0 );
+ }
+
+ /**
+ * Set the weight of the font.
+ *
+ * @param fontWeight The new weight of the font.
+ */
+ public void setFontWeight( float fontWeight )
+ {
+ dic.setFloat( "FontWeight", fontWeight );
+ }
+
+ /**
+ * A string representing the preferred font stretch.
+ * According to the PDF Spec:
+ * The font stretch value; it must be one of the following (ordered from
+ * narrowest to widest): UltraCondensed, ExtraCondensed, Condensed, SemiCondensed,
+ * Normal, SemiExpanded, Expanded, ExtraExpanded or UltraExpanded.
+ *
+ * @return The stretch of the font.
+ */
+ public String getFontStretch()
+ {
+ String retval = null;
+ COSName name = (COSName)dic.getDictionaryObject( COSName.getPDFName( "FontStretch" ) );
+ if( name != null )
+ {
+ retval = name.getName();
+ }
+ return retval;
+ }
+
+ /**
+ * This will set the font stretch.
+ *
+ * @param fontStretch The new stretch for the font.
+ */
+ public void setFontStretch( String fontStretch )
+ {
+ COSName name = null;
+ if( fontStretch != null )
+ {
+ name = COSName.getPDFName( fontStretch );
+ }
+ dic.setItem( COSName.getPDFName( "FontStretch" ), name );
+ }
+
+ /**
+ * This will get the font flags.
+ *
+ * @return The font flags.
+ */
+ public int getFlags()
+ {
+ return dic.getInt( "Flags", 0 );
+ }
+
+ /**
+ * This will set the font flags.
+ *
+ * @param flags The new font flags.
+ */
+ public void setFlags( int flags )
+ {
+ dic.setInt( "Flags", flags );
+ }
+
+ /**
+ * This will get the fonts bouding box.
+ *
+ * @return The fonts bouding box.
+ */
+ public PDRectangle getFontBoundingBox()
+ {
+ COSArray rect = (COSArray)dic.getDictionaryObject( COSName.getPDFName( "FontBBox" ) );
+ PDRectangle retval = null;
+ if( rect != null )
+ {
+ retval = new PDRectangle( rect );
+ }
+ return retval;
+ }
+
+ /**
+ * Set the fonts bounding box.
+ *
+ * @param rect The new bouding box.
+ */
+ public void setFontBoundingBox( PDRectangle rect )
+ {
+ COSArray array = null;
+ if( rect != null )
+ {
+ array = rect.getCOSArray();
+ }
+ dic.setItem( COSName.getPDFName( "FontBBox" ), array );
+ }
+
+ /**
+ * This will get the italic angle for the font.
+ *
+ * @return The italic angle.
+ */
+ public float getItalicAngle()
+ {
+ return dic.getFloat( "ItalicAngle", 0 );
+ }
+
+ /**
+ * This will set the italic angle for the font.
+ *
+ * @param angle The new italic angle for the font.
+ */
+ public void setItalicAngle( float angle )
+ {
+ dic.setFloat( "ItalicAngle", angle );
+ }
+
+ /**
+ * This will get the ascent for the font.
+ *
+ * @return The ascent.
+ */
+ public float getAscent()
+ {
+ return dic.getFloat( "Ascent", 0 );
+ }
+
+ /**
+ * This will set the ascent for the font.
+ *
+ * @param ascent The new ascent for the font.
+ */
+ public void setAscent( float ascent )
+ {
+ dic.setFloat( "Ascent", ascent );
+ }
+
+ /**
+ * This will get the descent for the font.
+ *
+ * @return The descent.
+ */
+ public float getDescent()
+ {
+ return dic.getFloat( "Descent", 0 );
+ }
+
+ /**
+ * This will set the descent for the font.
+ *
+ * @param descent The new descent for the font.
+ */
+ public void setDescent( float descent )
+ {
+ dic.setFloat( "Descent", descent );
+ }
+
+ /**
+ * This will get the leading for the font.
+ *
+ * @return The leading.
+ */
+ public float getLeading()
+ {
+ return dic.getFloat( "Leading", 0 );
+ }
+
+ /**
+ * This will set the leading for the font.
+ *
+ * @param leading The new leading for the font.
+ */
+ public void setLeading( float leading )
+ {
+ dic.setFloat( "Leading", leading );
+ }
+
+ /**
+ * This will get the CapHeight for the font.
+ *
+ * @return The cap height.
+ */
+ public float getCapHeight()
+ {
+ return dic.getFloat( "CapHeight", 0 );
+ }
+
+ /**
+ * This will set the cap height for the font.
+ *
+ * @param capHeight The new cap height for the font.
+ */
+ public void setCapHeight( float capHeight )
+ {
+ dic.setFloat( "CapHeight", capHeight );
+ }
+
+ /**
+ * This will get the x height for the font.
+ *
+ * @return The x height.
+ */
+ public float getXHeight()
+ {
+ return dic.getFloat( "XHeight", 0 );
+ }
+
+ /**
+ * This will set the x height for the font.
+ *
+ * @param xHeight The new x height for the font.
+ */
+ public void setXHeight( float xHeight )
+ {
+ dic.setFloat( "XHeight", xHeight );
+ }
+
+ /**
+ * This will get the stemV for the font.
+ *
+ * @return The stem v value.
+ */
+ public float getStemV()
+ {
+ return dic.getFloat( "StemV", 0 );
+ }
+
+ /**
+ * This will set the stem V for the font.
+ *
+ * @param stemV The new stem v for the font.
+ */
+ public void setStemV( float stemV )
+ {
+ dic.setFloat( "StemV", stemV );
+ }
+
+ /**
+ * This will get the stemH for the font.
+ *
+ * @return The stem h value.
+ */
+ public float getStemH()
+ {
+ return dic.getFloat( "StemH", 0 );
+ }
+
+ /**
+ * This will set the stem H for the font.
+ *
+ * @param stemH The new stem h for the font.
+ */
+ public void setStemH( float stemH )
+ {
+ dic.setFloat( "StemH", stemH );
+ }
+
+ /**
+ * This will get the average width for the font.
+ *
+ * @return The average width value.
+ */
+ public float getAverageWidth()
+ {
+ return dic.getFloat( "AvgWidth", 0 );
+ }
+
+ /**
+ * This will set the average width for the font.
+ *
+ * @param averageWidth The new average width for the font.
+ */
+ public void setAverageWidth( float averageWidth )
+ {
+ dic.setFloat( "AvgWidth", averageWidth );
+ }
+
+ /**
+ * This will get the max width for the font.
+ *
+ * @return The max width value.
+ */
+ public float getMaxWidth()
+ {
+ return dic.getFloat( "MaxWidth", 0 );
+ }
+
+ /**
+ * This will set the max width for the font.
+ *
+ * @param maxWidth The new max width for the font.
+ */
+ public void setMaxWidth( float maxWidth )
+ {
+ dic.setFloat( "MaxWidth", maxWidth );
+ }
+
+ /**
+ * This will get the missing width for the font.
+ *
+ * @return The missing width value.
+ */
+ public float getMissingWidth()
+ {
+ return dic.getFloat( "MissingWidth", 0 );
+ }
+
+ /**
+ * This will set the missing width for the font.
+ *
+ * @param missingWidth The new missing width for the font.
+ */
+ public void setMissingWidth( float missingWidth )
+ {
+ dic.setFloat( "MissingWidth", missingWidth );
+ }
+
+ /**
+ * This will get the character set for the font.
+ *
+ * @return The character set value.
+ */
+ public String getCharSet()
+ {
+ String retval = null;
+ COSString name = (COSString)dic.getDictionaryObject( COSName.getPDFName( "CharSet" ) );
+ if( name != null )
+ {
+ retval = name.getString();
+ }
+ return retval;
+ }
+
+ /**
+ * This will set the character set for the font.
+ *
+ * @param charSet The new character set for the font.
+ */
+ public void setCharacterSet( String charSet )
+ {
+ COSString name = null;
+ if( charSet != null )
+ {
+ name = new COSString( charSet );
+ }
+ dic.setItem( COSName.getPDFName( "CharSet" ), name );
+ }
+
+ /**
+ * A stream containing a Type 1 font program.
+ *
+ * @return A stream containing a Type 1 font program.
+ */
+ public PDStream getFontFile()
+ {
+ PDStream retval = null;
+ COSStream stream = (COSStream)dic.getDictionaryObject( "FontFile" );
+ if( stream != null )
+ {
+ retval = new PDStream( stream );
+ }
+ return retval;
+ }
+
+ /**
+ * Set the type 1 font program.
+ *
+ * @param type1Stream The type 1 stream.
+ */
+ public void setFontFile( PDStream type1Stream )
+ {
+ dic.setItem( "FontFile", type1Stream );
+ }
+
+ /**
+ * A stream containing a true type font program.
+ *
+ * @return A stream containing a true type font program.
+ */
+ public PDStream getFontFile2()
+ {
+ PDStream retval = null;
+ COSStream stream = (COSStream)dic.getDictionaryObject( "FontFile2" );
+ if( stream != null )
+ {
+ retval = new PDStream( stream );
+ }
+ return retval;
+ }
+
+ /**
+ * Set the true type font program.
+ *
+ * @param ttfStream The true type stream.
+ */
+ public void setFontFile2( PDStream ttfStream )
+ {
+ dic.setItem( "FontFile2", ttfStream );
+ }
+
+ /**
+ * A stream containing a font program that is not true type or type 1.
+ *
+ * @return A stream containing a font program.
+ */
+ public PDStream getFontFile3()
+ {
+ PDStream retval = null;
+ COSStream stream = (COSStream)dic.getDictionaryObject( "FontFile3" );
+ if( stream != null )
+ {
+ retval = new PDStream( stream );
+ }
+ return retval;
+ }
+
+ /**
+ * Set a stream containing a font program that is not true type or type 1.
+ *
+ * @param stream The font program stream.
+ */
+ public void setFontFile3( PDStream stream )
+ {
+ dic.setItem( "FontFile3", stream );
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/font/PDFontFactory.java b/src/main/java/org/pdfbox/pdmodel/font/PDFontFactory.java
new file mode 100644
index 0000000..329a8bf
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/font/PDFontFactory.java
@@ -0,0 +1,108 @@
+/**
+ * Copyright (c) 2003, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.font;
+
+import java.io.IOException;
+
+import org.pdfbox.cos.COSDictionary;
+import org.pdfbox.cos.COSName;
+
+/**
+ * This will create the correct type of font based on information in the dictionary.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.4 $
+ */
+public class PDFontFactory
+{
+ /**
+ * private constructor, should only use static methods in this class.
+ */
+ private PDFontFactory()
+ {
+ }
+
+ /**
+ * This will create the correct font based on information in the dictionary.
+ *
+ * @param dic The populated dictionary.
+ *
+ * @return The corrent implementation for the font.
+ *
+ * @throws IOException If the dictionary is not valid.
+ */
+ public static PDFont createFont( COSDictionary dic ) throws IOException
+ {
+ PDFont retval = null;
+
+ COSName type = (COSName)dic.getDictionaryObject( COSName.TYPE );
+ if( !type.equals( COSName.FONT ) )
+ {
+ throw new IOException( "Cannot create font if /Type is not /Font. Actual=" +type );
+ }
+
+ COSName subType = (COSName)dic.getDictionaryObject( COSName.SUBTYPE );
+ if( subType.equals( COSName.getPDFName( "Type1" ) ) )
+ {
+ retval = new PDType1Font( dic );
+ }
+ else if( subType.equals( COSName.getPDFName( "MMType1" ) ) )
+ {
+ retval = new PDMMType1Font( dic );
+ }
+ else if( subType.equals( COSName.getPDFName( "TrueType" ) ) )
+ {
+ retval = new PDTrueTypeFont( dic );
+ }
+ else if( subType.equals( COSName.getPDFName( "Type3" ) ) )
+ {
+ retval = new PDType3Font( dic );
+ }
+ else if( subType.equals( COSName.getPDFName( "Type0" ) ) )
+ {
+ retval = new PDType0Font( dic );
+ }
+ else if( subType.equals( COSName.getPDFName( "CIDFontType0" ) ) )
+ {
+ retval = new PDCIDFontType0Font( dic );
+ }
+ else if( subType.equals( COSName.getPDFName( "CIDFontType2" ) ) )
+ {
+ retval = new PDCIDFontType2Font( dic );
+ }
+ else
+ {
+ throw new IOException( "Unknown font subtype=" + subType );
+ }
+
+ return retval;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/font/PDMMType1Font.java b/src/main/java/org/pdfbox/pdmodel/font/PDMMType1Font.java
new file mode 100644
index 0000000..a0dffba
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/font/PDMMType1Font.java
@@ -0,0 +1,62 @@
+/**
+ * Copyright (c) 2003, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.font;
+
+import org.pdfbox.cos.COSDictionary;
+import org.pdfbox.cos.COSName;
+
+/**
+ * This is implementation of the Multiple Master Type1 Font.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.3 $
+ */
+public class PDMMType1Font extends PDSimpleFont
+{
+ /**
+ * Constructor.
+ */
+ public PDMMType1Font()
+ {
+ super();
+ font.setItem( COSName.SUBTYPE, COSName.getPDFName( "MMType1" ) );
+ }
+
+ /**
+ * Constructor.
+ *
+ * @param fontDictionary The font dictionary according to the PDF specification.
+ */
+ public PDMMType1Font( COSDictionary fontDictionary )
+ {
+ super( fontDictionary );
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/font/PDSimpleFont.java b/src/main/java/org/pdfbox/pdmodel/font/PDSimpleFont.java
new file mode 100644
index 0000000..a1356ba
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/font/PDSimpleFont.java
@@ -0,0 +1,239 @@
+/**
+ * Copyright (c) 2003-2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.font;
+
+import java.awt.Graphics;
+
+import java.io.IOException;
+
+import org.apache.log4j.Logger;
+import org.pdfbox.afmtypes.FontMetric;
+
+import org.pdfbox.cos.COSArray;
+import org.pdfbox.cos.COSDictionary;
+import org.pdfbox.cos.COSName;
+import org.pdfbox.cos.COSNumber;
+import org.pdfbox.cos.COSInteger;
+
+import org.pdfbox.pdmodel.common.PDRectangle;
+import org.pdfbox.pdmodel.common.PDStream;
+
+/**
+ * This class contains implementation details of the simple pdf fonts.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.11 $
+ */
+public abstract class PDSimpleFont extends PDFont
+{
+ private static Logger log = Logger.getLogger( PDSimpleFont.class );
+ /**
+ * Constructor.
+ */
+ public PDSimpleFont()
+ {
+ super();
+ }
+
+ /**
+ * Constructor.
+ *
+ * @param fontDictionary The font dictionary according to the PDF specification.
+ */
+ public PDSimpleFont( COSDictionary fontDictionary )
+ {
+ super( fontDictionary );
+ }
+
+ /**
+ * @see PDFont#drawString( String, Graphics, float, float, float, float, float )
+ */
+ public void drawString( String string, Graphics g, float fontSize,
+ float xScale, float yScale, float x, float y ) throws IOException
+ {
+ log.warn( "Not yet implemented:" + getClass().getName() );
+ }
+
+ /**
+ * This will get the font width for a character.
+ *
+ * @param c The character code to get the width for.
+ * @param offset The offset into the array.
+ * @param length The length of the data.
+ *
+ * @return The width is in 1000 unit of text space, ie 333 or 777
+ *
+ * @throws IOException If an error occurs while parsing.
+ */
+ public float getFontWidth( byte[] c, int offset, int length ) throws IOException
+ {
+ float fontWidth = 0;
+ int code = getCodeFromArray( c, offset, length );
+
+ //hmm should this be in a subclass??
+ COSInteger firstChar = (COSInteger)font.getDictionaryObject( COSName.FIRST_CHAR );
+ COSInteger lastChar = (COSInteger)font.getDictionaryObject( COSName.LAST_CHAR );
+ if( firstChar != null && lastChar != null )
+ {
+ long first = firstChar.intValue();
+ long last = lastChar.intValue();
+ if( code >= first && code <= last && font.getDictionaryObject( COSName.WIDTHS ) != null )
+ {
+ COSArray widthArray = (COSArray)font.getDictionaryObject( COSName.WIDTHS );
+ COSNumber fontWidthObject = (COSNumber)widthArray.get( (int)(code - first) );
+ fontWidth = fontWidthObject.floatValue();
+ }
+ else
+ {
+ fontWidth = getFontWidthFromAFMFile( code );
+ }
+ }
+ else
+ {
+ fontWidth = getFontWidthFromAFMFile( code );
+ }
+ return fontWidth;
+ }
+
+ /**
+ * This will get the average font width for all characters.
+ *
+ * @return The width is in 1000 unit of text space, ie 333 or 777
+ *
+ * @throws IOException If an error occurs while parsing.
+ */
+ public float getAverageFontWidth() throws IOException
+ {
+ float average = 0.0f;
+ float totalWidth = 0.0f;
+ float characterCount = 0.0f;
+ COSArray widths = (COSArray)font.getDictionaryObject( COSName.WIDTHS );
+ if( widths != null )
+ {
+ for( int i=0; i<widths.size(); i++ )
+ {
+ COSNumber fontWidth = (COSNumber)widths.getObject( i );
+ if( fontWidth.floatValue() > 0 )
+ {
+ totalWidth += fontWidth.floatValue();
+ characterCount += 1;
+ }
+ }
+ }
+
+ if( totalWidth > 0 )
+ {
+ average = totalWidth / characterCount;
+ }
+ else
+ {
+ average = getAverageFontWidthFromAFMFile();
+ }
+ return average;
+ }
+
+ /**
+ * This will get the font descriptor for this font.
+ *
+ * @return The font descriptor for this font.
+ *
+ * @throws IOException If there is an error parsing an AFM file, or unable to
+ * create a PDFontDescriptor object.
+ */
+ public PDFontDescriptor getFontDescriptor() throws IOException
+ {
+ PDFontDescriptor retval = null;
+ COSDictionary fd = (COSDictionary)font.getDictionaryObject( COSName.getPDFName( "FontDescriptor" ) );
+ if( fd == null )
+ {
+ FontMetric afm = getAFM();
+ if( afm == null )
+ {
+ throw new IOException( "Error: Can't create font descriptor file" );
+ }
+ retval = new PDFontDescriptorAFM( afm );
+ }
+ else
+ {
+ retval = new PDFontDescriptorDictionary( fd );
+ }
+
+ return retval;
+ }
+
+ /**
+ * This will set the font descriptor.
+ *
+ * @param fontDescriptor The font descriptor.
+ */
+ public void setFontDescriptor( PDFontDescriptorDictionary fontDescriptor )
+ {
+ COSDictionary dic = null;
+ if( fontDescriptor != null )
+ {
+ dic = fontDescriptor.getCOSDictionary();
+ }
+ font.setItem( COSName.getPDFName( "FontDescriptor" ), dic );
+ }
+
+ /**
+ * This will get the ToUnicode stream.
+ *
+ * @return The ToUnicode stream.
+ * @throws IOException If there is an error getting the stream.
+ */
+ public PDStream getToUnicode() throws IOException
+ {
+ return PDStream.createFromCOS( font.getDictionaryObject( "ToUnicode" ) );
+ }
+
+ /**
+ * This will set the ToUnicode stream.
+ *
+ * @param unicode The unicode stream.
+ */
+ public void setToUnicode( PDStream unicode )
+ {
+ font.setItem( "ToUnicode", unicode );
+ }
+
+ /**
+ * This will get the fonts bounding box.
+ *
+ * @return The fonts bouding box.
+ *
+ * @throws IOException If there is an error getting the bounding box.
+ */
+ public PDRectangle getFontBoundingBox() throws IOException
+ {
+ return getFontDescriptor().getFontBoundingBox();
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/font/PDTrueTypeFont.java b/src/main/java/org/pdfbox/pdmodel/font/PDTrueTypeFont.java
new file mode 100644
index 0000000..d462255
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/font/PDTrueTypeFont.java
@@ -0,0 +1,437 @@
+/**
+ * Copyright (c) 2003-2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.font;
+
+import org.pdfbox.cos.COSDictionary;
+import org.pdfbox.cos.COSName;
+
+import org.pdfbox.pdmodel.PDDocument;
+
+import org.pdfbox.pdmodel.common.PDRectangle;
+import org.pdfbox.pdmodel.common.PDStream;
+
+import org.pdfbox.encoding.WinAnsiEncoding;
+
+import org.pdfbox.ttf.CMAPEncodingEntry;
+import org.pdfbox.ttf.CMAPTable;
+import org.pdfbox.ttf.GlyphData;
+import org.pdfbox.ttf.GlyphTable;
+import org.pdfbox.ttf.HeaderTable;
+import org.pdfbox.ttf.HorizontalHeaderTable;
+import org.pdfbox.ttf.HorizontalMetricsTable;
+import org.pdfbox.ttf.MemoryTTFDataStream;
+import org.pdfbox.ttf.NamingTable;
+import org.pdfbox.ttf.NameRecord;
+import org.pdfbox.ttf.OS2WindowsMetricsTable;
+import org.pdfbox.ttf.PostScriptTable;
+import org.pdfbox.ttf.TTFParser;
+import org.pdfbox.ttf.TrueTypeFont;
+import org.pdfbox.util.ResourceLoader;
+
+import java.awt.Font;
+import java.awt.FontFormatException;
+import java.awt.Graphics;
+import java.awt.Graphics2D;
+import java.awt.RenderingHints;
+import java.awt.geom.AffineTransform;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+/**
+ * This is the TrueType implementation of fonts.
+ *
+ * @author Ben Litchfield (ben@benlitchfield.com)
+ * @version $Revision: 1.14 $
+ */
+public class PDTrueTypeFont extends PDSimpleFont
+{
+ /**
+ * This is the key to a property in the Resources/PDFBox_External_Fonts.properties file
+ * to load a Font when a mapping does not exist for the current font.
+ */
+ public static final String UNKNOWN_FONT = "UNKNOWN_FONT";
+
+ private Font awtFont = null;
+
+ private static Properties externalFonts = new Properties();
+ private static Map loadedExternalFonts = new HashMap();
+
+ static
+ {
+ try
+ {
+ ResourceLoader.loadProperties( "Resources/PDFBox_External_Fonts.properties", externalFonts );
+ }
+ catch( IOException io )
+ {
+ io.printStackTrace();
+ throw new RuntimeException( "Error loading font resources" );
+ }
+ }
+
+
+ /**
+ * Constructor.
+ */
+ public PDTrueTypeFont()
+ {
+ super();
+ font.setItem( COSName.SUBTYPE, COSName.TRUE_TYPE );
+ }
+
+ /**
+ * Constructor.
+ *
+ * @param fontDictionary The font dictionary according to the PDF specification.
+ */
+ public PDTrueTypeFont( COSDictionary fontDictionary )
+ {
+ super( fontDictionary );
+ }
+
+ /**
+ * This will load a TTF font from a font file.
+ *
+ * @param doc The PDF document that will hold the embedded font.
+ * @param file The file on the filesystem that holds the font file.
+ * @return A true type font.
+ * @throws IOException If there is an error loading the file data.
+ */
+ public static PDTrueTypeFont loadTTF( PDDocument doc, String file ) throws IOException
+ {
+ return loadTTF( doc, new File( file ) );
+ }
+
+ /**
+ * This will load a TTF to be embedding into a document.
+ *
+ * @param doc The PDF document that will hold the embedded font.
+ * @param file A TTF file stream.
+ * @return A PDF TTF.
+ * @throws IOException If there is an error loading the data.
+ */
+ public static PDTrueTypeFont loadTTF( PDDocument doc, File file ) throws IOException
+ {
+ PDTrueTypeFont retval = new PDTrueTypeFont();
+ PDFontDescriptorDictionary fd = new PDFontDescriptorDictionary();
+ PDStream fontStream = new PDStream(doc, new FileInputStream( file ), false );
+ fontStream.getStream().setInt( COSName.LENGTH1, (int)file.length() );
+ fontStream.addCompression();
+ fd.setFontFile2( fontStream );
+ retval.setFontDescriptor( fd );
+ //only support winansi encoding right now, should really
+ //just use Identity-H with unicode mapping
+ retval.setEncoding( new WinAnsiEncoding() );
+ TrueTypeFont ttf = null;
+ try
+ {
+ TTFParser parser = new TTFParser();
+ ttf = parser.parseTTF( file );
+ NamingTable naming = ttf.getNaming();
+ List records = naming.getNameRecords();
+ for( int i=0; i<records.size(); i++ )
+ {
+ NameRecord nr = (NameRecord)records.get( i );
+ if( nr.getNameId() == NameRecord.NAME_POSTSCRIPT_NAME )
+ {
+ retval.setBaseFont( nr.getString() );
+ fd.setFontName( nr.getString() );
+ }
+ else if( nr.getNameId() == NameRecord.NAME_FONT_FAMILY_NAME )
+ {
+ fd.setFontFamily( nr.getString() );
+ }
+ }
+
+ OS2WindowsMetricsTable os2 = ttf.getOS2Windows();
+ fd.setNonSymbolic( true );
+ switch( os2.getFamilyClass() )
+ {
+ case OS2WindowsMetricsTable.FAMILY_CLASS_SYMBOLIC:
+ fd.setSymbolic( true );
+ fd.setNonSymbolic( false );
+ break;
+ case OS2WindowsMetricsTable.FAMILY_CLASS_SCRIPTS:
+ fd.setScript( true );
+ break;
+ case OS2WindowsMetricsTable.FAMILY_CLASS_CLAREDON_SERIFS:
+ case OS2WindowsMetricsTable.FAMILY_CLASS_FREEFORM_SERIFS:
+ case OS2WindowsMetricsTable.FAMILY_CLASS_MODERN_SERIFS:
+ case OS2WindowsMetricsTable.FAMILY_CLASS_OLDSTYLE_SERIFS:
+ case OS2WindowsMetricsTable.FAMILY_CLASS_SLAB_SERIFS:
+ fd.setSerif( true );
+ break;
+ default:
+ //do nothing
+ }
+ switch( os2.getWidthClass() )
+ {
+ case OS2WindowsMetricsTable.WIDTH_CLASS_ULTRA_CONDENSED:
+ fd.setFontStretch( "UltraCondensed" );
+ break;
+ case OS2WindowsMetricsTable.WIDTH_CLASS_EXTRA_CONDENSED:
+ fd.setFontStretch( "ExtraCondensed" );
+ break;
+ case OS2WindowsMetricsTable.WIDTH_CLASS_CONDENSED:
+ fd.setFontStretch( "Condensed" );
+ break;
+ case OS2WindowsMetricsTable.WIDTH_CLASS_SEMI_CONDENSED:
+ fd.setFontStretch( "SemiCondensed" );
+ break;
+ case OS2WindowsMetricsTable.WIDTH_CLASS_MEDIUM:
+ fd.setFontStretch( "Normal" );
+ break;
+ case OS2WindowsMetricsTable.WIDTH_CLASS_SEMI_EXPANDED:
+ fd.setFontStretch( "SemiExpanded" );
+ break;
+ case OS2WindowsMetricsTable.WIDTH_CLASS_EXPANDED:
+ fd.setFontStretch( "Expanded" );
+ break;
+ case OS2WindowsMetricsTable.WIDTH_CLASS_EXTRA_EXPANDED:
+ fd.setFontStretch( "ExtraExpanded" );
+ break;
+ case OS2WindowsMetricsTable.WIDTH_CLASS_ULTRA_EXPANDED:
+ fd.setFontStretch( "UltraExpanded" );
+ break;
+ default:
+ //do nothing
+ }
+ fd.setFontWeight( os2.getWeightClass() );
+
+ //todo retval.setFixedPitch
+ //todo retval.setNonSymbolic
+ //todo retval.setItalic
+ //todo retval.setAllCap
+ //todo retval.setSmallCap
+ //todo retval.setForceBold
+
+ HeaderTable header = ttf.getHeader();
+ PDRectangle rect = new PDRectangle();
+ rect.setLowerLeftX( header.getXMin() * 1000f/header.getUnitsPerEm() );
+ rect.setLowerLeftY( header.getYMin() * 1000f/header.getUnitsPerEm() );
+ rect.setUpperRightX( header.getXMax() * 1000f/header.getUnitsPerEm() );
+ rect.setUpperRightY( header.getYMax() * 1000f/header.getUnitsPerEm() );
+ fd.setFontBoundingBox( rect );
+
+ HorizontalHeaderTable hHeader = ttf.getHorizontalHeader();
+ fd.setAscent( hHeader.getAscender() * 1000f/header.getUnitsPerEm() );
+ fd.setDescent( hHeader.getDescender() * 1000f/header.getUnitsPerEm() );
+
+ GlyphTable glyphTable = ttf.getGlyph();
+ GlyphData[] glyphs = glyphTable.getGlyphs();
+
+ PostScriptTable ps = ttf.getPostScript();
+ fd.setFixedPitch( ps.getIsFixedPitch() > 0 );
+ fd.setItalicAngle( ps.getItalicAngle() );
+
+ String[] names = ps.getGlyphNames();
+ if( names != null )
+ {
+ for( int i=0; i<names.length; i++ )
+ {
+ //if we have a capital H then use that, otherwise use the
+ //tallest letter
+ if( names[i].equals( "H" ) )
+ {
+ fd.setCapHeight( (glyphs[i].getBoundingBox().getUpperRightY()* 1000f)/
+ header.getUnitsPerEm() );
+ }
+ if( names[i].equals( "x" ) )
+ {
+ fd.setXHeight( (glyphs[i].getBoundingBox().getUpperRightY()* 1000f)/header.getUnitsPerEm() );
+ }
+ }
+ }
+
+ //hmm there does not seem to be a clear definition for StemV,
+ //this is close enough and I am told it doesn't usually get used.
+ fd.setStemV( (fd.getFontBoundingBox().getWidth() * .13f) );
+
+
+ CMAPTable cmapTable = ttf.getCMAP();
+ CMAPEncodingEntry[] cmaps = cmapTable.getCmaps();
+ int[] glyphToCCode = null;
+ for( int i=0; i<cmaps.length; i++ )
+ {
+ if( cmaps[i].getPlatformId() == CMAPTable.PLATFORM_WINDOWS &&
+ cmaps[i].getPlatformEncodingId() == CMAPTable.ENCODING_UNICODE )
+ {
+ glyphToCCode = cmaps[i].getGlyphIdToCharacterCode();
+ }
+ }
+ int firstChar = 0;
+ /**
+ for( int i=0; i<glyphToCCode.length; i++ )
+ {
+ if( glyphToCCode[i] != 0 )
+ {
+ firstChar = Math.min( glyphToCCode[i], firstChar );
+ }
+ }*/
+
+ int maxWidths=256;
+ HorizontalMetricsTable hMet = ttf.getHorizontalMetrics();
+ int[] widthValues = hMet.getAdvanceWidth();
+ List widths = new ArrayList( widthValues.length );
+ Integer zero = new Integer( 250 );
+ for( int i=0; i<widthValues.length && i<maxWidths; i++ )
+ {
+ widths.add( zero );
+ }
+ for( int i=0; i<widthValues.length; i++ )
+ {
+ if(glyphToCCode[i]-firstChar < widths.size() &&
+ glyphToCCode[i]-firstChar >= 0 &&
+ widths.get( glyphToCCode[i]-firstChar) == zero )
+ {
+ widths.set( glyphToCCode[i]-firstChar,
+ new Integer( (int)(widthValues[i]* 1000f)/header.getUnitsPerEm() ) );
+ }
+ }
+ retval.setWidths( widths );
+
+ retval.setFirstChar( firstChar );
+ retval.setLastChar( firstChar + widths.size()-1 );
+
+ }
+ finally
+ {
+ if( ttf != null )
+ {
+ ttf.close();
+ }
+ }
+
+ return retval;
+ }
+
+ /**
+ * @see PDFont#drawString( String, Graphics, float, float, float, float, float )
+ */
+ public void drawString( String string, Graphics g, float fontSize,
+ float xScale, float yScale, float x, float y ) throws IOException
+ {
+ PDFontDescriptorDictionary fd = (PDFontDescriptorDictionary)getFontDescriptor();
+ if( awtFont == null )
+ {
+ PDStream ttfStream = fd.getFontFile2();
+ String fontName = fd.getFontName();
+ awtFont = Font.getFont( fontName, null );
+ if( ttfStream == null )
+ {
+ //throw new IOException( "Error:TTF Stream is null");
+ // Embedded true type programs are optional,
+ // if there is no stream, we must use an external
+ // file.
+ ttfStream = getExternalFontFile2( fd );
+ }
+ if( ttfStream == null )
+ {
+ //if we can't find a font then just fake it.
+ awtFont = new Font("Arial", Font.PLAIN, 1 );
+ }
+ else
+ {
+ try
+ {
+ awtFont = Font.createFont( Font.TRUETYPE_FONT, ttfStream.createInputStream() );
+ }
+ catch( FontFormatException e )
+ {
+ throw new IOException( e.getMessage() );
+ }
+ }
+ }
+ AffineTransform at = new AffineTransform();
+ at.scale( xScale, yScale );
+ Graphics2D g2d = (Graphics2D)g;
+ g2d.setRenderingHint( RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON );
+ g2d.setFont( awtFont.deriveFont( at ).deriveFont( fontSize ) );
+ g2d.drawString( string, (int)x, (int)y );
+ }
+
+ /**
+ * Permit to load an external TTF Font program file
+ *
+ * Created by Pascal Allain
+ * Vertical7 Inc.
+ *
+ * @param fd The font descriptor currently used
+ *
+ * @return A PDStream with the Font File program, null if fd is null
+ *
+ * @throws IOException If the font is not found
+ */
+ private PDStream getExternalFontFile2(PDFontDescriptorDictionary fd)
+ throws IOException
+ {
+ PDStream retval = null;
+
+ if ( fd != null )
+ {
+ String baseFont = getBaseFont();
+ String fontResource = externalFonts.getProperty( UNKNOWN_FONT );
+ if( (baseFont != null) &&
+ (externalFonts.containsKey(baseFont)) )
+ {
+ fontResource = externalFonts.getProperty(baseFont);
+ }
+ if( fontResource != null )
+ {
+ TrueTypeFont extTTF = (TrueTypeFont)loadedExternalFonts.get( baseFont );
+ if( extTTF == null )
+ {
+ TTFParser ttfParser = new TTFParser();
+ InputStream is = ResourceLoader.loadResource( fontResource );
+ if( is == null )
+ {
+ throw new IOException( "Error missing font resource '" + externalFonts.get(baseFont) + "'" );
+ }
+ MemoryTTFDataStream stream = new MemoryTTFDataStream( is );
+ extTTF = ttfParser.parseTTF( stream );
+ loadedExternalFonts.put( baseFont, extTTF );
+ }
+ retval = extTTF.getPDStream();
+ }
+ }
+
+ return retval;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/font/PDType0Font.java b/src/main/java/org/pdfbox/pdmodel/font/PDType0Font.java
new file mode 100644
index 0000000..010df33
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/font/PDType0Font.java
@@ -0,0 +1,129 @@
+/**
+ * Copyright (c) 2003-2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.font;
+
+import java.awt.Graphics;
+
+import org.pdfbox.cos.COSArray;
+import org.pdfbox.cos.COSDictionary;
+import org.pdfbox.cos.COSName;
+import org.pdfbox.pdmodel.common.PDRectangle;
+
+import java.io.IOException;
+
+/**
+ * This is implementation of the Type0 Font.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.7 $
+ */
+public class PDType0Font extends PDFont
+{
+ /**
+ * Constructor.
+ */
+ public PDType0Font()
+ {
+ super();
+ font.setItem( COSName.SUBTYPE, COSName.getPDFName( "Type0" ) );
+ }
+
+ /**
+ * Constructor.
+ *
+ * @param fontDictionary The font dictionary according to the PDF specification.
+ */
+ public PDType0Font( COSDictionary fontDictionary )
+ {
+ super( fontDictionary );
+ }
+
+ /**
+ * @see PDFont#drawString( String, Graphics, float, float, float, float, float )
+ */
+ public void drawString( String string, Graphics g, float fontSize,
+ float xScale, float yScale, float x, float y )
+ {
+ throw new RuntimeException( "Not yet implemented" );
+ }
+
+ /**
+ * This will get the fonts bouding box.
+ *
+ * @return The fonts bouding box.
+ *
+ * @throws IOException If there is an error getting the bounding box.
+ */
+ public PDRectangle getFontBoundingBox() throws IOException
+ {
+ throw new RuntimeException( "Not yet implemented" );
+ }
+
+ /**
+ * This will get the font width for a character.
+ *
+ * @param c The character code to get the width for.
+ * @param offset The offset into the array.
+ * @param length The length of the data.
+ *
+ * @return The width is in 1000 unit of text space, ie 333 or 777
+ *
+ * @throws IOException If an error occurs while parsing.
+ */
+ public float getFontWidth( byte[] c, int offset, int length ) throws IOException
+ {
+ COSArray descendantFontArray =
+ (COSArray)font.getDictionaryObject( COSName.getPDFName( "DescendantFonts" ) );
+
+ COSDictionary descendantFontDictionary = (COSDictionary)descendantFontArray.getObject( 0 );
+ PDFont descendentFont = PDFontFactory.createFont( descendantFontDictionary );
+
+ return descendentFont.getFontWidth( c, offset, length );
+ }
+
+ /**
+ * This will get the average font width for all characters.
+ *
+ * @return The width is in 1000 unit of text space, ie 333 or 777
+ *
+ * @throws IOException If an error occurs while parsing.
+ */
+ public float getAverageFontWidth() throws IOException
+ {
+ COSArray descendantFontArray =
+ (COSArray)font.getDictionaryObject( COSName.getPDFName( "DescendantFonts" ) );
+
+ COSDictionary descendantFontDictionary = (COSDictionary)descendantFontArray.getObject( 0 );
+ PDFont descendentFont = PDFontFactory.createFont( descendantFontDictionary );
+
+ return descendentFont.getAverageFontWidth();
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/font/PDType1AfmPfbFont.java b/src/main/java/org/pdfbox/pdmodel/font/PDType1AfmPfbFont.java
new file mode 100644
index 0000000..89fdc5e
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/font/PDType1AfmPfbFont.java
@@ -0,0 +1,206 @@
+/**
+ * Copyright (c) 2004-2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+
+package org.pdfbox.pdmodel.font;
+
+import java.io.BufferedInputStream;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.pdfbox.afmparser.AFMParser;
+import org.pdfbox.afmtypes.CharMetric;
+import org.pdfbox.afmtypes.FontMetric;
+import org.pdfbox.encoding.AFMEncoding;
+import org.pdfbox.pdmodel.PDDocument;
+import org.pdfbox.pdmodel.common.PDRectangle;
+import org.pdfbox.pdmodel.common.PDStream;
+import org.pdfbox.pfb.PfbParser;
+
+/**
+ * This is implementation of the Type1 Font
+ * with a afm and a pfb file.
+ *
+ * @author <a href="mailto:m.g.n@gmx.de">Michael Niedermair</a>
+ * @version $Revision: 1.3 $
+ */
+public class PDType1AfmPfbFont extends PDType1Font
+{
+ /**
+ * the buffersize.
+ */
+ private static final int BUFFERSIZE = 0xffff;
+
+ /**
+ * The font descriptor.
+ */
+ private PDFontDescriptorDictionary fd;
+
+ /**
+ * the font metric.
+ */
+ private FontMetric metric;
+
+ /**
+ * Create a new object.
+ * @param doc The PDF document that will hold the embedded font.
+ * @param afmname The font filename.
+ * @throws IOException If there is an error loading the data.
+ */
+ public PDType1AfmPfbFont(final PDDocument doc, final String afmname)
+ throws IOException
+ {
+
+ super();
+
+ InputStream afmin = new BufferedInputStream(
+ new FileInputStream(afmname), BUFFERSIZE);
+ String pfbname = afmname.replaceAll(".AFM", "").replaceAll(".afm", "")
+ + ".pfb";
+ InputStream pfbin = new BufferedInputStream(
+ new FileInputStream(pfbname), BUFFERSIZE);
+
+ load(doc, afmin, pfbin);
+ }
+
+ /**
+ * Create a new object.
+ * @param doc The PDF document that will hold the embedded font.
+ * @param afm The afm input.
+ * @param pfb The pfb input.
+ * @throws IOException If there is an error loading the data.
+ */
+ public PDType1AfmPfbFont(final PDDocument doc, final InputStream afm, final InputStream pfb)
+ throws IOException
+ {
+ super();
+
+ load(doc, afm, pfb);
+ }
+
+ /**
+ * This will load a afm and pfb to be embedding into a document.
+ *
+ * @param doc The PDF document that will hold the embedded font.
+ * @param afm The afm input.
+ * @param pfb The pfb input.
+ * @throws IOException If there is an error loading the data.
+ */
+ private void load(final PDDocument doc, final InputStream afm,
+ final InputStream pfb) throws IOException
+ {
+
+ fd = new PDFontDescriptorDictionary();
+ setFontDescriptor(fd);
+
+ // read the pfb
+ PfbParser pfbparser = new PfbParser(pfb);
+ pfb.close();
+
+ PDStream fontStream = new PDStream(doc, pfbparser.getInputStream(),
+ false);
+ fontStream.getStream().setInt("Length", pfbparser.size());
+ for (int i = 0; i < pfbparser.getLengths().length; i++)
+ {
+ fontStream.getStream().setInt("Length" + (i + 1),
+ pfbparser.getLengths()[i]);
+ }
+ fontStream.addCompression();
+ fd.setFontFile(fontStream);
+
+ // read the afm
+ AFMParser parser = new AFMParser(afm);
+ parser.parse();
+ metric = parser.getResult();
+ setEncoding(new AFMEncoding(metric));
+
+ // set the values
+ setBaseFont(metric.getFontName());
+ fd.setFontName(metric.getFontName());
+ fd.setFontFamily(metric.getFamilyName());
+ fd.setNonSymbolic(true);
+ fd.setFontBoundingBox(new PDRectangle(metric.getFontBBox()));
+ fd.setItalicAngle(metric.getItalicAngle());
+ fd.setAscent(metric.getAscender());
+ fd.setDescent(metric.getDescender());
+ fd.setCapHeight(metric.getCapHeight());
+ fd.setXHeight(metric.getXHeight());
+ fd.setAverageWidth(metric.getAverageCharacterWidth());
+ fd.setCharacterSet(metric.getCharacterSet());
+
+ // get firstchar, lastchar
+ int firstchar = 255;
+ int lastchar = 0;
+
+ // widths
+ List listmetric = metric.getCharMetrics();
+
+ int maxWidths = 256;
+ List widths = new ArrayList(maxWidths);
+ Integer zero = new Integer(0);
+ Iterator iter = listmetric.iterator();
+ while (iter.hasNext())
+ {
+ CharMetric m = (CharMetric) iter.next();
+ int n = m.getCharacterCode();
+ if (n > 0)
+ {
+ firstchar = Math.min(firstchar, n);
+ lastchar = Math.max(lastchar, n);
+ if (m.getWx() > 0)
+ {
+ float width = m.getWx();
+ widths.add(new Float(width));
+ }
+ else
+ {
+ widths.add(zero);
+ }
+ }
+ }
+ setFirstChar(firstchar);
+ setLastChar(lastchar);
+ setWidths(widths);
+
+ }
+
+ /**
+ * @see org.pdfbox.pdmodel.font.PDSimpleFont#getFontDescriptor()
+ */
+ public PDFontDescriptor getFontDescriptor() throws IOException
+ {
+ return fd;
+ }
+
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/font/PDType1Font.java b/src/main/java/org/pdfbox/pdmodel/font/PDType1Font.java
new file mode 100644
index 0000000..891f7c9
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/font/PDType1Font.java
@@ -0,0 +1,267 @@
+/**
+ * Copyright (c) 2004-2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.font;
+
+import java.awt.Font;
+import java.awt.Graphics;
+import java.awt.Graphics2D;
+import java.awt.RenderingHints;
+import java.awt.geom.AffineTransform;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.pdfbox.cos.COSDictionary;
+import org.pdfbox.cos.COSName;
+
+/**
+ * This is implementation of the Type1 Font.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.10 $
+ */
+public class PDType1Font extends PDSimpleFont
+{
+ /**
+ * Standard Base 14 Font.
+ */
+ public static final PDType1Font TIMES_ROMAN = new PDType1Font( "Times-Roman" );
+ /**
+ * Standard Base 14 Font.
+ */
+ public static final PDType1Font TIMES_BOLD = new PDType1Font( "Times-Bold" );
+ /**
+ * Standard Base 14 Font.
+ */
+ public static final PDType1Font TIMES_ITALIC = new PDType1Font( "Times-Italic" );
+ /**
+ * Standard Base 14 Font.
+ */
+ public static final PDType1Font TIMES_BOLD_ITALIC = new PDType1Font( "Times-BoldItalic" );
+ /**
+ * Standard Base 14 Font.
+ */
+ public static final PDType1Font HELVETICA = new PDType1Font( "Helvetica" );
+ /**
+ * Standard Base 14 Font.
+ */
+ public static final PDType1Font HELVETICA_BOLD = new PDType1Font( "Helvetica-Bold" );
+ /**
+ * Standard Base 14 Font.
+ */
+ public static final PDType1Font HELVETICA_OBLIQUE = new PDType1Font( "Helvetica-Oblique" );
+ /**
+ * Standard Base 14 Font.
+ */
+ public static final PDType1Font HELVETICA_BOLD_OBLIQUE = new PDType1Font( "Helvetica-BoldOblique" );
+ /**
+ * Standard Base 14 Font.
+ */
+ public static final PDType1Font COURIER = new PDType1Font( "Courier" );
+ /**
+ * Standard Base 14 Font.
+ */
+ public static final PDType1Font COURIER_BOLD = new PDType1Font( "Courier-Bold" );
+ /**
+ * Standard Base 14 Font.
+ */
+ public static final PDType1Font COURIER_OBLIQUE = new PDType1Font( "Courier-Oblique" );
+ /**
+ * Standard Base 14 Font.
+ */
+ public static final PDType1Font COURIER_BOLD_OBLIQUE = new PDType1Font( "Courier-BoldOblique" );
+ /**
+ * Standard Base 14 Font.
+ */
+ public static final PDType1Font SYMBOL = new PDType1Font( "Symbol" );
+ /**
+ * Standard Base 14 Font.
+ */
+ public static final PDType1Font ZAPF_DINGBATS = new PDType1Font( "ZapfDingbats" );
+
+
+ private static final Map STANDARD_14 = new HashMap();
+ static
+ {
+ STANDARD_14.put( TIMES_ROMAN.getBaseFont(), TIMES_ROMAN );
+ STANDARD_14.put( TIMES_BOLD.getBaseFont(), TIMES_BOLD );
+ STANDARD_14.put( TIMES_ITALIC.getBaseFont(), TIMES_ITALIC );
+ STANDARD_14.put( TIMES_BOLD_ITALIC.getBaseFont(), TIMES_BOLD_ITALIC );
+ STANDARD_14.put( HELVETICA.getBaseFont(), HELVETICA );
+ STANDARD_14.put( HELVETICA_BOLD.getBaseFont(), HELVETICA_BOLD );
+ STANDARD_14.put( HELVETICA_OBLIQUE.getBaseFont(), HELVETICA_OBLIQUE );
+ STANDARD_14.put( HELVETICA_BOLD_OBLIQUE.getBaseFont(), HELVETICA_BOLD_OBLIQUE );
+ STANDARD_14.put( COURIER.getBaseFont(), COURIER );
+ STANDARD_14.put( COURIER_BOLD.getBaseFont(), COURIER_BOLD );
+ STANDARD_14.put( COURIER_OBLIQUE.getBaseFont(), COURIER_OBLIQUE );
+ STANDARD_14.put( COURIER_BOLD_OBLIQUE.getBaseFont(), COURIER_BOLD_OBLIQUE );
+ STANDARD_14.put( SYMBOL.getBaseFont(), SYMBOL );
+ STANDARD_14.put( ZAPF_DINGBATS.getBaseFont(), ZAPF_DINGBATS );
+ }
+
+ private Font awtFont = null;
+
+ /**
+ * Constructor.
+ */
+ public PDType1Font()
+ {
+ super();
+ font.setItem( COSName.SUBTYPE, COSName.getPDFName( "Type1" ) );
+ }
+
+ /**
+ * Constructor.
+ *
+ * @param fontDictionary The font dictionary according to the PDF specification.
+ */
+ public PDType1Font( COSDictionary fontDictionary )
+ {
+ super( fontDictionary );
+ }
+
+ /**
+ * Constructor.
+ *
+ * @param baseFont The base font for this font.
+ */
+ public PDType1Font( String baseFont )
+ {
+ this();
+ setBaseFont( baseFont );
+ }
+
+ /**
+ * A convenience method to get one of the standard 14 font from name.
+ *
+ * @param name The name of the font to get.
+ *
+ * @return The font that matches the name or null if it does not exist.
+ */
+ public static PDType1Font getStandardFont( String name )
+ {
+ return (PDType1Font)STANDARD_14.get( name );
+ }
+
+ /**
+ * This will get the names of the standard 14 fonts.
+ *
+ * @return An array of the names of the standard 14 fonts.
+ */
+ public static String[] getStandard14Names()
+ {
+ return (String[])STANDARD_14.keySet().toArray( new String[14] );
+ }
+
+ /**
+ * @see PDFont#drawString( String, Graphics, float, float, float, float, float )
+ */
+ public void drawString( String string, Graphics g, float fontSize,
+ float xScale, float yScale, float x, float y ) throws IOException
+ {
+ if( awtFont == null )
+ {
+ String baseFont = this.getBaseFont();
+ if( baseFont.equals( TIMES_ROMAN.getBaseFont() ) )
+ {
+ awtFont = new Font( "Times New Roman", Font.PLAIN, 1 );
+ }
+ else if( baseFont.equals( TIMES_ITALIC.getBaseFont() ) )
+ {
+ awtFont = new Font( "Times New Roman", Font.ITALIC, 1 );
+ }
+ else if( baseFont.equals( TIMES_BOLD.getBaseFont() ) )
+ {
+ awtFont = new Font( "Times New Roman", Font.BOLD, 1 );
+ }
+ else if( baseFont.equals( TIMES_BOLD_ITALIC.getBaseFont() ) )
+ {
+ awtFont = new Font( "Times New Roman", Font.BOLD | Font.ITALIC, 1 );
+ }
+ else if( baseFont.equals( HELVETICA.getBaseFont() ) )
+ {
+ awtFont = new Font( "Helvetica", Font.PLAIN, 1 );
+ }
+ else if( baseFont.equals( HELVETICA_BOLD.getBaseFont() ) )
+ {
+ awtFont = new Font( "Helvetica", Font.BOLD, 1 );
+ }
+ else if( baseFont.equals( HELVETICA_BOLD_OBLIQUE.getBaseFont() ) )
+ {
+ awtFont = new Font( "Helvetica", Font.BOLD | Font.ITALIC, 1 );
+ }
+ else if( baseFont.equals( HELVETICA_OBLIQUE.getBaseFont() ) )
+ {
+ awtFont = new Font( "Helvetica", Font.ITALIC, 1 );
+ }
+ else if( baseFont.equals( COURIER.getBaseFont() ) )
+ {
+ awtFont = new Font( "Courier", Font.PLAIN, 1 );
+ }
+ else if( baseFont.equals( COURIER_BOLD.getBaseFont() ) )
+ {
+ awtFont = new Font( "Courier", Font.BOLD, 1 );
+ }
+ else if( baseFont.equals( COURIER_BOLD_OBLIQUE.getBaseFont() ) )
+ {
+ awtFont = new Font( "Courier", Font.BOLD | Font.ITALIC, 1 );
+ }
+ else if( baseFont.equals( COURIER_OBLIQUE.getBaseFont() ) )
+ {
+ awtFont = new Font( "Courier", Font.ITALIC, 1 );
+ }
+ else if( baseFont.equals( SYMBOL.getBaseFont() ) )
+ {
+ awtFont = new Font( "Symbol", Font.PLAIN, 1 );
+ }
+ else if( baseFont.equals( ZAPF_DINGBATS.getBaseFont() ) )
+ {
+ awtFont = new Font( "ZapfDingbats", Font.PLAIN, 1 );
+ }
+ else
+ {
+ awtFont = new Font( "Arial", Font.PLAIN, 1 );
+ //throw new IOException( "Not yet implemented:" + getClass().getName() + " " +
+ //this.getBaseFont() +
+ //" " + this + " " + TIMES_ROMAN );
+ }
+ }
+ AffineTransform at = new AffineTransform();
+ at.scale( xScale, yScale );
+
+ Graphics2D g2d = (Graphics2D)g;
+ g2d.setRenderingHint( RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON );
+ g2d.setFont( awtFont.deriveFont( at ).deriveFont( fontSize ) );
+ //g2d.getFontRenderContext().getTransform().scale( xScale, yScale );
+
+ g2d.drawString( string, (int)x, (int)y );
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/font/PDType3Font.java b/src/main/java/org/pdfbox/pdmodel/font/PDType3Font.java
new file mode 100644
index 0000000..5f9c363
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/font/PDType3Font.java
@@ -0,0 +1,152 @@
+/**
+ * Copyright (c) 2003-2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.font;
+
+import org.apache.log4j.Logger;
+import org.pdfbox.cos.COSDictionary;
+import org.pdfbox.cos.COSName;
+import org.pdfbox.cos.COSStream;
+import org.pdfbox.pdmodel.common.PDMatrix;
+
+import java.awt.Graphics;
+import java.awt.Image;
+
+import java.io.IOException;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * This is implementation of the Type3 Font.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.6 $
+ */
+public class PDType3Font extends PDSimpleFont
+{
+ private static Logger log = Logger.getLogger( PDType3Font.class );
+
+ //A map of character code to java.awt.Image for the glyph
+ private Map images = new HashMap();
+
+ /**
+ * Constructor.
+ */
+ public PDType3Font()
+ {
+ super();
+ font.setItem( COSName.SUBTYPE, COSName.getPDFName( "Type3" ) );
+ }
+
+ /**
+ * Constructor.
+ *
+ * @param fontDictionary The font dictionary according to the PDF specification.
+ */
+ public PDType3Font( COSDictionary fontDictionary )
+ {
+ super( fontDictionary );
+ }
+
+ /**
+ * Type3 fonts have their glyphs defined as a content stream. This
+ * will create the image that represents that character
+ *
+ * @throws IOException If there is an error creating the image.
+ */
+ private Image createImageIfNecessary( char character ) throws IOException
+ {
+ Character c = new Character( character );
+ Image retval = (Image)images.get( c );
+ if( retval == null )
+ {
+ COSDictionary charProcs = (COSDictionary)font.getDictionaryObject( COSName.getPDFName( "CharProcs" ) );
+ COSStream stream = (COSStream)charProcs.getDictionaryObject( COSName.getPDFName( "" + character ) );
+ if( stream != null )
+ {
+ Type3StreamParser parser = new Type3StreamParser();
+ retval = parser.createImage( stream );
+ images.put( c, retval );
+ }
+ else
+ {
+ log.warn( "Error font type 3 image stream is null" );
+ }
+ }
+ return retval;
+
+ }
+
+ /**
+ * This will draw a string on a canvas using the font.
+ *
+ * @param string The string to draw.
+ * @param g The graphics to draw onto.
+ * @param fontSize The size of the font to draw.
+ * @param x The x coordinate to draw at.
+ * @param y The y coordinate to draw at.
+ *
+ * @throws IOException If there is an error drawing the image on the screen.
+ */
+ public void drawString( String string, Graphics g, float fontSize, float x, float y ) throws IOException
+ {
+ //if( string.equals( "V" )|| string.equals( "o" ) )
+ {
+ for(int i=0; i<string.length(); i++)
+ {
+ //todo need to use image observers and such
+ char c = string.charAt( i );
+ Image image = createImageIfNecessary( c );
+ if( image != null )
+ {
+ int newWidth = (int)(.12*image.getWidth(null));
+ int newHeight = (int)(.12*image.getHeight(null));
+ if( newWidth > 0 && newHeight > 0 )
+ {
+ image = image.getScaledInstance( newWidth, newHeight, Image.SCALE_SMOOTH );
+ g.drawImage( image, (int)x, (int)y, null );
+ x+=newWidth;
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * Set the font matrix for this type3 font.
+ *
+ * @param matrix The font matrix for this type3 font.
+ */
+ public void setFontMatrix( PDMatrix matrix )
+ {
+ font.setItem( "FontMatrix", matrix );
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/font/Type3StreamParser.java b/src/main/java/org/pdfbox/pdmodel/font/Type3StreamParser.java
new file mode 100644
index 0000000..a2adc1f
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/font/Type3StreamParser.java
@@ -0,0 +1,607 @@
+/**
+ * Copyright (c) 2003-2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.font;
+
+import java.awt.Image;
+
+import java.io.IOException;
+
+import java.util.List;
+
+import org.pdfbox.cos.COSNumber;
+import org.pdfbox.cos.COSStream;
+
+import org.pdfbox.pdmodel.graphics.xobject.PDInlinedImage;
+
+import org.pdfbox.util.BoundingBox;
+import org.pdfbox.util.ImageParameters;
+import org.pdfbox.util.PDFOperator;
+import org.pdfbox.util.PDFStreamEngine;
+
+/**
+ * This class will handle creating an image for a type 3 glyph.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.8 $
+ */
+public class Type3StreamParser extends PDFStreamEngine
+{
+ private PDInlinedImage image = null;
+ private BoundingBox box = null;
+
+
+ /**
+ * This will parse a type3 stream and create an image from it.
+ *
+ * @param type3Stream The stream containing the operators to draw the image.
+ *
+ * @return The image that was created.
+ *
+ * @throws IOException If there is an error processing the stream.
+ */
+ public Image createImage( COSStream type3Stream ) throws IOException
+ {
+ processStream( null, null, type3Stream );
+ return image.createImage();
+ }
+
+ /**
+ * This is used to handle an operation.
+ *
+ * @param operator The operation to perform.
+ * @param arguments The list of arguments.
+ *
+ * @throws IOException If there is an error processing the operation.
+ */
+ protected void processOperator( PDFOperator operator, List arguments ) throws IOException
+ {
+ super.processOperator( operator, arguments );
+ String operation = operator.getOperation();
+ /**
+ if( operation.equals( "b" ) )
+ {
+ //Close, fill, and stroke path using nonzero winding number rule
+ }
+ else if( operation.equals( "B" ) )
+ {
+ //Fill and stroke path using nonzero winding number rule
+ }
+ else if( operation.equals( "b*" ) )
+ {
+ //Close, fill, and stroke path using even-odd rule
+ }
+ else if( operation.equals( "B*" ) )
+ {
+ //Fill and stroke path using even-odd rule
+ }
+ else if( operation.equals( "BDC" ) )
+ {
+ //(PDF 1.2) Begin marked-content sequence with property list
+ }
+ else **/if( operation.equals( "BI" ) )
+ {
+ ImageParameters params = operator.getImageParameters();
+ image = new PDInlinedImage();
+ image.setImageParameters( params );
+ image.setImageData( operator.getImageData() );
+ //begin inline image object
+ }/**
+ else if( operation.equals( "BMC" ) )
+ {
+ //(PDF 1.2) Begin marked-content sequence
+ }
+ else if( operation.equals( "BT" ) )
+ {
+ log.debug( "<BT>" );
+ textMatrix = new Matrix();
+ textLineMatrix = new Matrix();
+ }
+ else if( operation.equals( "BX" ) )
+ {
+ //(PDF 1.1) Begin compatibility section
+ }
+ else if( operation.equals( "c" ) )
+ {
+ //Append curved segment to path (three control points)
+ }
+ else if( operation.equals( "cm" ) )
+ {
+ }
+ else if( operation.equals( "cs" ) )
+ {
+ }
+ else if( operation.equals( "CS" ) )
+ {
+ }
+ else if( operation.equals( "d" ) )
+ {
+ //Set the line dash pattern in the graphics state
+ }
+ else */if( operation.equals( "d0" ) )
+ {
+ //set glyph with for a type3 font
+ //COSNumber horizontalWidth = (COSNumber)arguments.get( 0 );
+ //COSNumber verticalWidth = (COSNumber)arguments.get( 1 );
+ //width = horizontalWidth.intValue();
+ //height = verticalWidth.intValue();
+ }
+ else if( operation.equals( "d1" ) )
+ {
+ //set glyph with and bounding box for type 3 font
+ //COSNumber horizontalWidth = (COSNumber)arguments.get( 0 );
+ //COSNumber verticalWidth = (COSNumber)arguments.get( 1 );
+ COSNumber llx = (COSNumber)arguments.get( 2 );
+ COSNumber lly = (COSNumber)arguments.get( 3 );
+ COSNumber urx = (COSNumber)arguments.get( 4 );
+ COSNumber ury = (COSNumber)arguments.get( 5 );
+
+ //width = horizontalWidth.intValue();
+ //height = verticalWidth.intValue();
+ box = new BoundingBox();
+ box.setLowerLeftX( llx.floatValue() );
+ box.setLowerLeftY( lly.floatValue() );
+ box.setUpperRightX( urx.floatValue() );
+ box.setUpperRightY( ury.floatValue() );
+ }/*
+ else if( operation.equals( "Do" ) )
+ {
+ //invoke named object.
+ }
+ else if( operation.equals( "DP" ) )
+ {
+ //(PDF 1.2) De.ne marked-content point with property list
+ }
+ else if( operation.equals( "EI" ) )
+ {
+ //end inline image object
+ }
+ else if( operation.equals( "EMC" ) )
+ {
+ //End inline image object
+ }
+ else if( operation.equals( "ET" ) )
+ {
+ log.debug( "<ET>" );
+ textMatrix = null;
+ textLineMatrix = null;
+ }
+ else if( operation.equals( "EX" ) )
+ {
+ //(PDF 1.1) End compatibility section
+ }
+ else if( operation.equals( "f" ) )
+ {
+ //Fill the path, using the nonzero winding number rule to determine the region to .ll
+ }
+ else if( operation.equals( "F" ) )
+ {
+ }
+ else if( operation.equals( "f*" ) )
+ {
+ //Fill path using even-odd rule
+ }
+ else if( operation.equals( "g" ) )
+ {
+ }
+ else if( operation.equals( "G" ) )
+ {
+ }
+ else if( operation.equals( "gs" ) )
+ {
+ }
+ else if( operation.equals( "h" ) )
+ {
+ //close subpath
+ }
+ else if( operation.equals( "i" ) )
+ {
+ //set flatness tolerance, not sure what this does
+ }
+ else if( operation.equals( "ID" ) )
+ {
+ //begin inline image data
+ }
+ else if( operation.equals( "j" ) )
+ {
+ //Set the line join style in the graphics state
+ //System.out.println( "<j>" );
+ }
+ else if( operation.equals( "J" ) )
+ {
+ //Set the line cap style in the graphics state
+ //System.out.println( "<J>" );
+ }
+ else if( operation.equals( "k" ) )
+ {
+ //Set CMYK color for nonstroking operations
+ }
+ else if( operation.equals( "K" ) )
+ {
+ //Set CMYK color for stroking operations
+ }
+ else if( operation.equals( "l" ) )
+ {
+ //append straight line segment from the current point to the point.
+ COSNumber x = (COSNumber)arguments.get( 0 );
+ COSNumber y = (COSNumber)arguments.get( 1 );
+ linePath.lineTo( x.floatValue(), pageSize.getHeight()-y.floatValue() );
+ }
+ else if( operation.equals( "m" ) )
+ {
+ COSNumber x = (COSNumber)arguments.get( 0 );
+ COSNumber y = (COSNumber)arguments.get( 1 );
+ linePath.reset();
+ linePath.moveTo( x.floatValue(), pageSize.getHeight()-y.floatValue() );
+ //System.out.println( "<m x=\"" + x.getValue() + "\" y=\"" + y.getValue() + "\" >" );
+ }
+ else if( operation.equals( "M" ) )
+ {
+ //System.out.println( "<M>" );
+ }
+ else if( operation.equals( "MP" ) )
+ {
+ //(PDF 1.2) Define marked-content point
+ }
+ else if( operation.equals( "n" ) )
+ {
+ //End path without .lling or stroking
+ //System.out.println( "<n>" );
+ }
+ else if( operation.equals( "q" ) )
+ {
+ //save graphics state
+ if( log.isDebugEnabled() )
+ {
+ log.debug( "<" + operation + "> - save state" );
+ }
+ graphicsStack.push(graphicsState.clone());
+ }
+ else if( operation.equals( "Q" ) )
+ {
+ //restore graphics state
+ if( log.isDebugEnabled() )
+ {
+ log.debug( "<" + operation + "> - restore state" );
+ }
+ graphicsState = (PDGraphicsState)graphicsStack.pop();
+ }
+ else if( operation.equals( "re" ) )
+ {
+ }
+ else if( operation.equals( "rg" ) )
+ {
+ //Set RGB color for nonstroking operations
+ }
+ else if( operation.equals( "RG" ) )
+ {
+ //Set RGB color for stroking operations
+ }
+ else if( operation.equals( "ri" ) )
+ {
+ //Set color rendering intent
+ }
+ else if( operation.equals( "s" ) )
+ {
+ //Close and stroke path
+ }
+ else if( operation.equals( "S" ) )
+ {
+ graphics.draw( linePath );
+ }
+ else if( operation.equals( "sc" ) )
+ {
+ //set color for nonstroking operations
+ //System.out.println( "<sc>" );
+ }
+ else if( operation.equals( "SC" ) )
+ {
+ //set color for stroking operations
+ //System.out.println( "<SC>" );
+ }
+ else if( operation.equals( "scn" ) )
+ {
+ //set color for nonstroking operations special
+ }
+ else if( operation.equals( "SCN" ) )
+ {
+ //set color for stroking operations special
+ }
+ else if( operation.equals( "sh" ) )
+ {
+ //(PDF 1.3) Paint area de.ned by shading pattern
+ }
+ else if( operation.equals( "T*" ) )
+ {
+ if (log.isDebugEnabled())
+ {
+ log.debug("<T* graphicsState.getTextState().getLeading()=\"" +
+ graphicsState.getTextState().getLeading() + "\">");
+ }
+ //move to start of next text line
+ if( graphicsState.getTextState().getLeading() == 0 )
+ {
+ graphicsState.getTextState().setLeading( -.01f );
+ }
+ Matrix td = new Matrix();
+ td.setValue( 2, 1, -1 * graphicsState.getTextState().getLeading() * textMatrix.getValue(1,1));
+ textLineMatrix = textLineMatrix.multiply( td );
+ textMatrix = textLineMatrix.copy();
+ }
+ else if( operation.equals( "Tc" ) )
+ {
+ //set character spacing
+ COSNumber characterSpacing = (COSNumber)arguments.get( 0 );
+ if (log.isDebugEnabled())
+ {
+ log.debug("<Tc characterSpacing=\"" + characterSpacing.floatValue() + "\" />");
+ }
+ graphicsState.getTextState().setCharacterSpacing( characterSpacing.floatValue() );
+ }
+ else if( operation.equals( "Td" ) )
+ {
+ COSNumber x = (COSNumber)arguments.get( 0 );
+ COSNumber y = (COSNumber)arguments.get( 1 );
+ if (log.isDebugEnabled())
+ {
+ log.debug("<Td x=\"" + x.floatValue() + "\" y=\"" + y.floatValue() + "\">");
+ }
+ Matrix td = new Matrix();
+ td.setValue( 2, 0, x.floatValue() * textMatrix.getValue(0,0) );
+ td.setValue( 2, 1, y.floatValue() * textMatrix.getValue(1,1) );
+ //log.debug( "textLineMatrix before " + textLineMatrix );
+ textLineMatrix = textLineMatrix.multiply( td );
+ //log.debug( "textLineMatrix after " + textLineMatrix );
+ textMatrix = textLineMatrix.copy();
+ }
+ else if( operation.equals( "TD" ) )
+ {
+ //move text position and set leading
+ COSNumber x = (COSNumber)arguments.get( 0 );
+ COSNumber y = (COSNumber)arguments.get( 1 );
+ if (log.isDebugEnabled())
+ {
+ log.debug("<TD x=\"" + x.floatValue() + "\" y=\"" + y.floatValue() + "\">");
+ }
+ graphicsState.getTextState().setLeading( -1 * y.floatValue() );
+ Matrix td = new Matrix();
+ td.setValue( 2, 0, x.floatValue() * textMatrix.getValue(0,0) );
+ td.setValue( 2, 1, y.floatValue() * textMatrix.getValue(1,1) );
+ //log.debug( "textLineMatrix before " + textLineMatrix );
+ textLineMatrix = textLineMatrix.multiply( td );
+ //log.debug( "textLineMatrix after " + textLineMatrix );
+ textMatrix = textLineMatrix.copy();
+ }
+ else if( operation.equals( "Tf" ) )
+ {
+ //set font and size
+ COSName fontName = (COSName)arguments.get( 0 );
+ graphicsState.getTextState().setFontSize( ((COSNumber)arguments.get( 1 ) ).floatValue() );
+
+ if (log.isDebugEnabled())
+ {
+ log.debug("<Tf font=\"" + fontName.getName() + "\" size=\"" +
+ graphicsState.getTextState().getFontSize() + "\">");
+ }
+
+ //old way
+ //graphicsState.getTextState().getFont() = (COSObject)stream.getDictionaryObject( fontName );
+ //if( graphicsState.getTextState().getFont() == null )
+ //{
+ // graphicsState.getTextState().getFont() = (COSObject)graphicsState.getTextState().getFont()
+ // Dictionary.getItem( fontName );
+ //}
+ graphicsState.getTextState().setFont( (PDFont)fonts.get( fontName.getName() ) );
+ if( graphicsState.getTextState().getFont() == null )
+ {
+ throw new IOException( "Error: Could not find font(" + fontName + ") in map=" + fonts );
+ }
+ //log.debug( "Font Resource=" + fontResource );
+ //log.debug( "Current Font=" + graphicsState.getTextState().getFont() );
+ //log.debug( "graphicsState.getTextState().getFontSize()=" + graphicsState.getTextState().getFontSize() );
+ }
+ else if( operation.equals( "Tj" ) )
+ {
+ COSString string = (COSString)arguments.get( 0 );
+ TextPosition pos = showString( string.getBytes() );
+ if (log.isDebugEnabled())
+ {
+ log.debug("<Tj string=\"" + string.getString() + "\">");
+ }
+ }
+ else if( operation.equals( "TJ" ) )
+ {
+ Matrix td = new Matrix();
+
+ COSArray array = (COSArray)arguments.get( 0 );
+ for( int i=0; i<array.size(); i++ )
+ {
+ COSBase next = array.get( i );
+ if( next instanceof COSNumber )
+ {
+ float value = -1*
+ (((COSNumber)next).floatValue()/1000) *
+ graphicsState.getTextState().getFontSize() *
+ textMatrix.getValue(1,1);
+
+ if (log.isDebugEnabled())
+ {
+ log.debug( "<TJ(" + i + ") value=\"" + value +
+ "\", param=\"" + ((COSNumber)next).floatValue() +
+ "\", fontsize=\"" + graphicsState.getTextState().getFontSize() + "\">" );
+ }
+ td.setValue( 2, 0, value );
+ textMatrix = textMatrix.multiply( td );
+ }
+ else if( next instanceof COSString )
+ {
+ TextPosition pos = showString( ((COSString)next).getBytes() );
+ if (log.isDebugEnabled())
+ {
+ log.debug("<TJ(" + i + ") string=\"" + pos.getString() + "\">");
+ }
+ }
+ else
+ {
+ throw new IOException( "Unknown type in array for TJ operation:" + next );
+ }
+ }
+ }
+ else if( operation.equals( "TL" ) )
+ {
+ COSNumber leading = (COSNumber)arguments.get( 0 );
+ graphicsState.getTextState().setLeading( leading.floatValue() );
+ if (log.isDebugEnabled())
+ {
+ log.debug("<TL leading=\"" + leading.floatValue() + "\" >");
+ }
+ }
+ else if( operation.equals( "Tm" ) )
+ {
+ //Set text matrix and text line matrix
+ COSNumber a = (COSNumber)arguments.get( 0 );
+ COSNumber b = (COSNumber)arguments.get( 1 );
+ COSNumber c = (COSNumber)arguments.get( 2 );
+ COSNumber d = (COSNumber)arguments.get( 3 );
+ COSNumber e = (COSNumber)arguments.get( 4 );
+ COSNumber f = (COSNumber)arguments.get( 5 );
+
+ if (log.isDebugEnabled())
+ {
+ log.debug("<Tm " +
+ "a=\"" + a.floatValue() + "\" " +
+ "b=\"" + b.floatValue() + "\" " +
+ "c=\"" + c.floatValue() + "\" " +
+ "d=\"" + d.floatValue() + "\" " +
+ "e=\"" + e.floatValue() + "\" " +
+ "f=\"" + f.floatValue() + "\" >");
+ }
+
+ textMatrix = new Matrix();
+ textMatrix.setValue( 0, 0, a.floatValue() );
+ textMatrix.setValue( 0, 1, b.floatValue() );
+ textMatrix.setValue( 1, 0, c.floatValue() );
+ textMatrix.setValue( 1, 1, d.floatValue() );
+ textMatrix.setValue( 2, 0, e.floatValue() );
+ textMatrix.setValue( 2, 1, f.floatValue() );
+ textLineMatrix = textMatrix.copy();
+ }
+ else if( operation.equals( "Tr" ) )
+ {
+ //Set text rendering mode
+ //System.out.println( "<Tr>" );
+ }
+ else if( operation.equals( "Ts" ) )
+ {
+ //Set text rise
+ //System.out.println( "<Ts>" );
+ }
+ else if( operation.equals( "Tw" ) )
+ {
+ //set word spacing
+ COSNumber wordSpacing = (COSNumber)arguments.get( 0 );
+ if (log.isDebugEnabled())
+ {
+ log.debug("<Tw wordSpacing=\"" + wordSpacing.floatValue() + "\" />");
+ }
+ graphicsState.getTextState().setWordSpacing( wordSpacing.floatValue() );
+ }
+ else if( operation.equals( "Tz" ) )
+ {
+ //Set horizontal text scaling
+ }
+ else if( operation.equals( "v" ) )
+ {
+ //Append curved segment to path (initial point replicated)
+ }
+ else if( operation.equals( "w" ) )
+ {
+ //Set the line width in the graphics state
+ //System.out.println( "<w>" );
+ }
+ else if( operation.equals( "W" ) )
+ {
+ //Set clipping path using nonzero winding number rule
+ //System.out.println( "<W>" );
+ }
+ else if( operation.equals( "W*" ) )
+ {
+ //Set clipping path using even-odd rule
+ }
+ else if( operation.equals( "y" ) )
+ {
+ //Append curved segment to path (final point replicated)
+ }
+ else if( operation.equals( "'" ) )
+ {
+ // Move to start of next text line, and show text
+ //
+ COSString string = (COSString)arguments.get( 0 );
+ if (log.isDebugEnabled())
+ {
+ log.debug("<' string=\"" + string.getString() + "\">");
+ }
+
+ Matrix td = new Matrix();
+ td.setValue( 2, 1, -1 * graphicsState.getTextState().getLeading() * textMatrix.getValue(1,1));
+ textLineMatrix = textLineMatrix.multiply( td );
+ textMatrix = textLineMatrix.copy();
+
+ showString( string.getBytes() );
+ }
+ else if( operation.equals( "\"" ) )
+ {
+ //Set word and character spacing, move to next line, and show text
+ //
+ COSNumber wordSpacing = (COSNumber)arguments.get( 0 );
+ COSNumber characterSpacing = (COSNumber)arguments.get( 1 );
+ COSString string = (COSString)arguments.get( 2 );
+
+ if (log.isDebugEnabled())
+ {
+ log.debug("<\" wordSpacing=\"" + wordSpacing +
+ "\", characterSpacing=\"" + characterSpacing +
+ "\", string=\"" + string.getString() + "\">");
+ }
+
+ graphicsState.getTextState().setCharacterSpacing( characterSpacing.floatValue() );
+ graphicsState.getTextState().setWordSpacing( wordSpacing.floatValue() );
+
+ Matrix td = new Matrix();
+ td.setValue( 2, 1, -1 * graphicsState.getTextState().getLeading() * textMatrix.getValue(1,1));
+ textLineMatrix = textLineMatrix.multiply( td );
+ textMatrix = textLineMatrix.copy();
+
+ showString( string.getBytes() );
+ }*/
+ }
+
+
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/font/package.html b/src/main/java/org/pdfbox/pdmodel/font/package.html
new file mode 100644
index 0000000..4e8d27e
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/font/package.html
@@ -0,0 +1,9 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head>
+
+</head>
+<body>
+Classes to deal with font functionality in a PDF Document.
+</body>
+</html>
diff --git a/src/main/java/org/pdfbox/pdmodel/graphics/PDExtendedGraphicsState.java b/src/main/java/org/pdfbox/pdmodel/graphics/PDExtendedGraphicsState.java
new file mode 100644
index 0000000..3fe9c40
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/graphics/PDExtendedGraphicsState.java
@@ -0,0 +1,724 @@
+/**
+ * Copyright (c) 2003, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.graphics;
+
+import org.pdfbox.cos.COSArray;
+import org.pdfbox.cos.COSBase;
+import org.pdfbox.cos.COSBoolean;
+import org.pdfbox.cos.COSDictionary;
+import org.pdfbox.cos.COSFloat;
+import org.pdfbox.cos.COSInteger;
+import org.pdfbox.cos.COSName;
+import org.pdfbox.cos.COSNumber;
+
+import org.pdfbox.pdmodel.common.COSObjectable;
+
+import java.io.IOException;
+
+import java.util.Iterator;
+
+/**
+ * This class represents the graphics state dictionary that is stored in the PDF document.
+ * The PDGraphicsStateValue holds the current runtime values as a stream is being executed.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.4 $
+ */
+public class PDExtendedGraphicsState implements COSObjectable
+{
+ private static final COSName LW = COSName.getPDFName( "LW" );
+ private static final COSName LC = COSName.getPDFName( "LC" );
+ private static final COSName LJ = COSName.getPDFName( "LJ" );
+ private static final COSName ML = COSName.getPDFName( "ML" );
+ private static final COSName D = COSName.getPDFName( "D" );
+ private static final COSName RI = COSName.getPDFName( "RI" );
+ private static final COSName OP = COSName.getPDFName( "OP" );
+ private static final COSName OP_NS = COSName.getPDFName( "op" );
+ private static final COSName OPM = COSName.getPDFName( "OPM" );
+ private static final COSName FONT = COSName.getPDFName( "Font" );
+ private static final COSName FL = COSName.getPDFName( "FL" );
+ private static final COSName SM = COSName.getPDFName( "SM" );
+ private static final COSName SA = COSName.getPDFName( "SA" );
+ private static final COSName CA = COSName.getPDFName( "CA" );
+ private static final COSName CA_NS = COSName.getPDFName( "ca" );
+ private static final COSName AIS = COSName.getPDFName( "AIS" );
+ private static final COSName TK = COSName.getPDFName( "TK" );
+
+ /**
+ * Rendering intent constants, see PDF Reference 1.5 Section 4.5.4 Rendering Intents.
+ */
+ public static final String RENDERING_INTENT_ABSOLUTE_COLORIMETRIC = "AbsoluteColorimetric";
+ /**
+ * Rendering intent constants, see PDF Reference 1.5 Section 4.5.4 Rendering Intents.
+ */
+ public static final String RENDERING_INTENT_RELATIVE_COLORIMETRIC = "RelativeColorimetric";
+ /**
+ * Rendering intent constants, see PDF Reference 1.5 Section 4.5.4 Rendering Intents.
+ */
+ public static final String RENDERING_INTENT_SATURATION = "Saturation";
+ /**
+ * Rendering intent constants, see PDF Reference 1.5 Section 4.5.4 Rendering Intents.
+ */
+ public static final String RENDERING_INTENT_PERCEPTUAL = "Perceptual";
+
+
+ private COSDictionary graphicsState;
+
+ /**
+ * Default constructor, creates blank graphics state.
+ */
+ public PDExtendedGraphicsState()
+ {
+ graphicsState = new COSDictionary();
+ graphicsState.setItem( COSName.TYPE, COSName.getPDFName( "ExtGState" ) );
+ }
+
+ /**
+ * Create a graphics state from an existing dictionary.
+ *
+ * @param dictionary The existing graphics state.
+ */
+ public PDExtendedGraphicsState( COSDictionary dictionary )
+ {
+ graphicsState = dictionary;
+ }
+
+ /**
+ * This will implement the gs operator.
+ *
+ * @param gs The state to copy this dictionaries values into.
+ *
+ * @throws IOException If there is an error copying font information.
+ */
+ public void copyIntoGraphicsState( PDGraphicsState gs ) throws IOException
+ {
+ Iterator keys = graphicsState.keyList().iterator();
+ while( keys.hasNext() )
+ {
+ COSName key = (COSName)keys.next();
+ if( key.equals( LW ) )
+ {
+ gs.setLineWidth( getLineWidth().doubleValue() );
+ }
+ else if( key.equals( LC ) )
+ {
+ gs.setLineCap( getLineCapStyle().intValue() );
+ }
+ else if( key.equals( LJ ) )
+ {
+ gs.setLineJoin( getLineJoinStyle().intValue() );
+ }
+ else if( key.equals( ML ) )
+ {
+ gs.setMiterLimit( getMiterLimit().doubleValue() );
+ }
+ else if( key.equals( D ) )
+ {
+ gs.setLineDashPattern( getLineDashPattern() );
+ }
+ else if( key.equals( RI ) )
+ {
+ gs.setRenderingIntent( getRenderingIntent() );
+ }
+ else if( key.equals( OPM ) )
+ {
+ gs.setOverprintMode( getOverprintMode().doubleValue() );
+ }
+ else if( key.equals( FONT ) )
+ {
+ PDFontSetting setting = getFontSetting();
+ gs.getTextState().setFont( setting.getFont() );
+ gs.getTextState().setFontSize( setting.getFontSize() );
+ }
+ else if( key.equals( FL ) )
+ {
+ gs.setFlatness( getFlatnessTolerance().floatValue() );
+ }
+ else if( key.equals( SM ) )
+ {
+ gs.setSmoothness( getSmoothnessTolerance().floatValue() );
+ }
+ else if( key.equals( SA ) )
+ {
+ gs.setStrokeAdjustment( getAutomaticStrokeAdjustment().booleanValue() );
+ }
+ else if( key.equals( CA ) )
+ {
+ gs.setAlphaConstants( getStrokingAlpaConstant().floatValue() );
+ }/**
+ else if( key.equals( CA_NS ) )
+ {
+ }**/
+ else if( key.equals( AIS ) )
+ {
+ gs.setAlphaSource( getAlpaSourceFlag().booleanValue() );
+ }
+ else if( key.equals( TK ) )
+ {
+ gs.getTextState().setKnockoutFlag( getTextKnockoutFlag().booleanValue() );
+ }
+ }
+ }
+
+ /**
+ * This will get the underlying dictionary that this class acts on.
+ *
+ * @return The underlying dictionary for this class.
+ */
+ public COSDictionary getCOSDictionary()
+ {
+ return graphicsState;
+ }
+
+ /**
+ * Convert this standard java object to a COS object.
+ *
+ * @return The cos object that matches this Java object.
+ */
+ public COSBase getCOSObject()
+ {
+ return graphicsState;
+ }
+
+ /**
+ * This will get the line width. This will return null if there is no line width
+ *
+ * @return null or the LW value of the dictionary.
+ */
+ public Float getLineWidth()
+ {
+ return getFloatItem( LW );
+ }
+
+ /**
+ * This will set the line width.
+ *
+ * @param width The line width for the object.
+ */
+ public void setLineWidth( Float width )
+ {
+ setFloatItem( LW, width );
+ }
+
+ /**
+ * This will get the line cap style.
+ *
+ * @return null or the LC value of the dictionary.
+ */
+ public Long getLineCapStyle()
+ {
+ return getLongItem( LC );
+ }
+
+ /**
+ * This will set the line cap style for the graphics state.
+ *
+ * @param style The new line cap style to set.
+ */
+ public void setLineCapStyle( Long style )
+ {
+ setLongItem( LC, style );
+ }
+
+ /**
+ * This will get the line join style.
+ *
+ * @return null or the LJ value in the dictionary.
+ */
+ public Long getLineJoinStyle()
+ {
+ return getLongItem( LJ );
+ }
+
+ /**
+ * This will set the line join style.
+ *
+ * @param style The new line join style.
+ */
+ public void setLineJoinStyle( Long style )
+ {
+ setLongItem( LJ, style );
+ }
+
+
+ /**
+ * This will get the miter limit.
+ *
+ * @return null or the ML value in the dictionary.
+ */
+ public Float getMiterLimit()
+ {
+ return getFloatItem( ML );
+ }
+
+ /**
+ * This will set the miter limit for the graphics state.
+ *
+ * @param miterLimit The new miter limit value
+ */
+ public void setMiterLimit( Float miterLimit )
+ {
+ setFloatItem( ML, miterLimit );
+ }
+
+ /**
+ * This will get the dash pattern.
+ *
+ * @return null or the D value in the dictionary.
+ */
+ public PDLineDashPattern getLineDashPattern()
+ {
+ PDLineDashPattern retval = null;
+ COSArray dp = (COSArray)graphicsState.getDictionaryObject( D );
+ if( dp != null )
+ {
+ retval = new PDLineDashPattern( dp );
+ }
+ return retval;
+ }
+
+ /**
+ * This will set the dash pattern for the graphics state.
+ *
+ * @param dashPattern The dash pattern
+ */
+ public void setLineDashPattern( PDLineDashPattern dashPattern )
+ {
+ graphicsState.setItem( D, dashPattern.getCOSObject() );
+ }
+
+ /**
+ * This will get the rendering intent.
+ *
+ * @return null or the RI value in the dictionary.
+ */
+ public String getRenderingIntent()
+ {
+ String retval = null;
+ COSName ri = (COSName)graphicsState.getDictionaryObject( RI );
+ if( ri != null )
+ {
+ retval = ((COSName)ri).getName();
+ }
+ return retval;
+ }
+
+ /**
+ * This will set the rendering intent for the graphics state.
+ *
+ * @param ri The new rendering intent
+ */
+ public void setRenderingIntent( String ri )
+ {
+ COSName intent = null;
+ if( ri != null )
+ {
+ intent = COSName.getPDFName( ri );
+ }
+ graphicsState.setItem( RI, intent );
+ }
+
+ /**
+ * This will get the overprint control.
+ *
+ * @return The overprint control or null if one has not been set.
+ */
+ public Boolean getStrokingOverprintControl()
+ {
+ return getBooleanItem( OP );
+ }
+
+ /**
+ * This will get the overprint control(OP).
+ *
+ * @param op The overprint control.
+ */
+ public void setStrokingOverprintControl( Boolean op )
+ {
+ setBooleanItem( OP, op );
+ }
+
+ /**
+ * This will get the overprint control for non stroking operations. If this
+ * value is null then the regular overprint control value will be returned.
+ *
+ * @return The overprint control or null if one has not been set.
+ */
+ public Boolean getNonStrokingOverprintControl()
+ {
+ Boolean retval = getBooleanItem( OP_NS );
+ if( retval == null )
+ {
+ retval = getStrokingOverprintControl();
+ }
+ return retval;
+ }
+
+ /**
+ * This will get the overprint control(OP).
+ *
+ * @param op The overprint control.
+ */
+ public void setNonStrokingOverprintControl( Boolean op )
+ {
+ setBooleanItem( OP_NS, op );
+ }
+
+ /**
+ * This will get the overprint control mode.
+ *
+ * @return The overprint control mode or null if one has not been set.
+ */
+ public Float getOverprintMode()
+ {
+ return getFloatItem( OPM );
+ }
+
+ /**
+ * This will get the overprint mode(OPM).
+ *
+ * @param overprintMode The overprint mode
+ */
+ public void setOverprintMode( Float overprintMode )
+ {
+ setFloatItem( OPM, overprintMode );
+ }
+
+ /**
+ * This will get the font setting of the graphics state.
+ *
+ * @return The font setting.
+ */
+ public PDFontSetting getFontSetting()
+ {
+ PDFontSetting setting = null;
+ COSArray font = (COSArray)graphicsState.getDictionaryObject( FONT );
+ if( font != null )
+ {
+ setting = new PDFontSetting( font );
+ }
+ return setting;
+ }
+
+ /**
+ * This will set the font setting for this graphics state.
+ *
+ * @param fs The new font setting.
+ */
+ public void setFontSetting( PDFontSetting fs )
+ {
+ graphicsState.setItem( FONT, fs );
+ }
+
+ /**
+ * This will get the flatness tolerance.
+ *
+ * @return The flatness tolerance or null if one has not been set.
+ */
+ public Float getFlatnessTolerance()
+ {
+ return getFloatItem( FL );
+ }
+
+ /**
+ * This will get the flatness tolerance.
+ *
+ * @param flatness The new flatness tolerance
+ */
+ public void setFlatnessTolerance( Float flatness )
+ {
+ setFloatItem( FL, flatness );
+ }
+
+ /**
+ * This will get the smothness tolerance.
+ *
+ * @return The smothness tolerance or null if one has not been set.
+ */
+ public Float getSmoothnessTolerance()
+ {
+ return getFloatItem( SM );
+ }
+
+ /**
+ * This will get the smoothness tolerance.
+ *
+ * @param smoothness The new smoothness tolerance
+ */
+ public void setSmoothnessTolerance( Float smoothness )
+ {
+ setFloatItem( SM, smoothness );
+ }
+
+ /**
+ * This will get the automatic stroke adjustment flag.
+ *
+ * @return The automatic stroke adjustment flag or null if one has not been set.
+ */
+ public Boolean getAutomaticStrokeAdjustment()
+ {
+ return getBooleanItem( SA );
+ }
+
+ /**
+ * This will get the automatic stroke adjustment flag.
+ *
+ * @param sa The new automatic stroke adjustment flag.
+ */
+ public void setAutomaticStrokeAdjustment( Boolean sa )
+ {
+ setBooleanItem( SA, sa );
+ }
+
+ /**
+ * This will get the stroking alpha constant.
+ *
+ * @return The stroking alpha constant or null if one has not been set.
+ */
+ public Float getStrokingAlpaConstant()
+ {
+ return getFloatItem( CA );
+ }
+
+ /**
+ * This will get the stroking alpha constant.
+ *
+ * @param alpha The new stroking alpha constant.
+ */
+ public void setStrokingAlphaConstant( Float alpha )
+ {
+ setFloatItem( CA, alpha );
+ }
+
+ /**
+ * This will get the non stroking alpha constant.
+ *
+ * @return The non stroking alpha constant or null if one has not been set.
+ */
+ public Float getNonStrokingAlpaConstant()
+ {
+ return getFloatItem( CA_NS );
+ }
+
+ /**
+ * This will get the non stroking alpha constant.
+ *
+ * @param alpha The new non stroking alpha constant.
+ */
+ public void setNonStrokingAlphaConstant( Float alpha )
+ {
+ setFloatItem( CA_NS, alpha );
+ }
+
+ /**
+ * This will get the alpha source flag.
+ *
+ * @return The alpha source flag.
+ */
+ public Boolean getAlpaSourceFlag()
+ {
+ return getBooleanItem( AIS );
+ }
+
+ /**
+ * This will get the alpha source flag.
+ *
+ * @param alpha The alpha source flag.
+ */
+ public void setAlphaSourceFlag( Boolean alpha )
+ {
+ setBooleanItem( AIS, alpha );
+ }
+
+ /**
+ * This will get the text knockout flag.
+ *
+ * @return The text knockout flag.
+ */
+ public Boolean getTextKnockoutFlag()
+ {
+ return getBooleanItem( TK );
+ }
+
+ /**
+ * This will get the text knockout flag.
+ *
+ * @param tk The text knockout flag.
+ */
+ public void setTextKnockoutFlag( Boolean tk )
+ {
+ setBooleanItem( TK, tk );
+ }
+
+ /**
+ * This will get a float item from the dictionary.
+ *
+ * @param key The key to the item.
+ *
+ * @return The value for that item.
+ */
+ private Float getFloatItem( COSName key )
+ {
+ Float retval = null;
+ COSNumber value = (COSNumber)graphicsState.getDictionaryObject( key );
+ if( value != null )
+ {
+ retval = new Float( value.floatValue() );
+ }
+ return retval;
+ }
+
+ /**
+ * This will set a float object.
+ *
+ * @param key The key to the data that we are setting.
+ * @param value The value that we are setting.
+ */
+ private void setFloatItem( COSName key, Float value )
+ {
+ if( value == null )
+ {
+ graphicsState.removeItem( key );
+ }
+ else
+ {
+ graphicsState.setItem( key, new COSFloat( value.floatValue() ) );
+ }
+ }
+
+ /**
+ * This will get a integer item from the dictionary.
+ *
+ * @param key The key to the item.
+ *
+ * @return The value for that item.
+ */
+ private Integer getIntegerItem( COSName key )
+ {
+ Integer retval = null;
+ COSNumber value = (COSNumber)graphicsState.getDictionaryObject( key );
+ if( value != null )
+ {
+ retval = new Integer( value.intValue() );
+ }
+ return retval;
+ }
+
+ /**
+ * This will set a integer object.
+ *
+ * @param key The key to the data that we are setting.
+ * @param value The value that we are setting.
+ */
+ private void setIntegerItem( COSName key, Integer value )
+ {
+ if( value == null )
+ {
+ graphicsState.removeItem( key );
+ }
+ else
+ {
+ graphicsState.setItem( key, new COSInteger( value.intValue() ) );
+ }
+ }
+
+ /**
+ * This will get an int item from the dictionary.
+ *
+ * @param key The key to the item.
+ *
+ * @return The value for that item.
+ */
+ private Long getLongItem( COSName key )
+ {
+ Long retval = null;
+ COSNumber value = (COSNumber)graphicsState.getDictionaryObject( key );
+ if( value != null )
+ {
+ retval = new Long( value.intValue() );
+ }
+ return retval;
+ }
+
+ /**
+ * This will set an integer object.
+ *
+ * @param key The key to the data that we are setting.
+ * @param value The value that we are setting.
+ */
+ private void setLongItem( COSName key, Long value )
+ {
+ if( value == null )
+ {
+ graphicsState.removeItem( key );
+ }
+ else
+ {
+ graphicsState.setItem( key, new COSInteger( value.longValue() ) );
+ }
+ }
+
+ /**
+ * This will get a boolean item from the dictionary.
+ *
+ * @param key The key to the item.
+ *
+ * @return The value for that item.
+ */
+ private Boolean getBooleanItem( COSName key )
+ {
+ Boolean retval = null;
+ COSBoolean value = (COSBoolean)graphicsState.getDictionaryObject( key );
+ if( value != null )
+ {
+ retval = value.getValueAsObject();
+ }
+ return retval;
+ }
+
+ /**
+ * This will set an boolean object.
+ *
+ * @param key The key to the data that we are setting.
+ * @param value The value that we are setting.
+ */
+ private void setBooleanItem( COSName key, Boolean value )
+ {
+ if( value == null )
+ {
+ graphicsState.removeItem( key );
+ }
+ else
+ {
+ graphicsState.setItem( key, COSBoolean.getBoolean( value ) );
+ }
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/graphics/PDFontSetting.java b/src/main/java/org/pdfbox/pdmodel/graphics/PDFontSetting.java
new file mode 100644
index 0000000..039609f
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/graphics/PDFontSetting.java
@@ -0,0 +1,133 @@
+/**
+ * Copyright (c) 2003, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.graphics;
+
+import org.pdfbox.cos.COSArray;
+import org.pdfbox.cos.COSBase;
+import org.pdfbox.cos.COSDictionary;
+import org.pdfbox.cos.COSFloat;
+import org.pdfbox.cos.COSNumber;
+
+import org.pdfbox.pdmodel.common.COSObjectable;
+
+import org.pdfbox.pdmodel.font.PDFont;
+import org.pdfbox.pdmodel.font.PDFontFactory;
+
+import java.io.IOException;
+
+/**
+ * This class represents a font setting used for the graphics state. A font setting is a font and a
+ * font size. Maybe there is a better name for this?
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.3 $
+ */
+public class PDFontSetting implements COSObjectable
+{
+ private COSArray fontSetting = null;
+
+ /**
+ * Creates a blank font setting, font will be null, size will be 1.
+ */
+ public PDFontSetting()
+ {
+ fontSetting = new COSArray();
+ fontSetting.add( null );
+ fontSetting.add( new COSFloat( 1 ) );
+ }
+
+ /**
+ * Constructs a font setting from an existing array.
+ *
+ * @param fs The new font setting value.
+ */
+ public PDFontSetting( COSArray fs )
+ {
+ fontSetting = fs;
+ }
+
+ /**
+ * @see COSObjectable#getCOSObject()
+ */
+ public COSBase getCOSObject()
+ {
+ return fontSetting;
+ }
+
+ /**
+ * This will get the font for this font setting.
+ *
+ * @return The font for this setting of null if one was not found.
+ *
+ * @throws IOException If there is an error getting the font.
+ */
+ public PDFont getFont() throws IOException
+ {
+ PDFont retval = null;
+ COSBase font = fontSetting.get( 0 );
+ if( font instanceof COSDictionary )
+ {
+ retval = PDFontFactory.createFont( (COSDictionary)font );
+ }
+ return retval;
+ }
+
+ /**
+ * This will set the font for this font setting.
+ *
+ * @param font The new font.
+ */
+ public void setFont( PDFont font )
+ {
+ fontSetting.set( 0, font );
+ }
+
+ /**
+ * This will get the size of the font.
+ *
+ * @return The size of the font.
+ */
+ public float getFontSize()
+ {
+ COSNumber size = (COSNumber)fontSetting.get( 1 );
+ return size.floatValue();
+ }
+
+ /**
+ * This will set the size of the font.
+ *
+ * @param size The new size of the font.
+ */
+ public void setFontSize( float size )
+ {
+ fontSetting.set( 1, new COSFloat( size ) );
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/graphics/PDGraphicsState.java b/src/main/java/org/pdfbox/pdmodel/graphics/PDGraphicsState.java
new file mode 100644
index 0000000..4115198
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/graphics/PDGraphicsState.java
@@ -0,0 +1,438 @@
+/**
+ * Copyright (c) 2003, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.graphics;
+
+import org.pdfbox.util.Matrix;
+
+import org.pdfbox.pdmodel.text.PDTextState;
+
+import org.pdfbox.pdmodel.graphics.color.PDColorSpaceInstance;
+
+/**
+ * This class will hold the current state of the graphics parameters when executing a
+ * content stream.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.3 $
+ */
+public class PDGraphicsState implements Cloneable
+{
+ private Matrix currentTransformationMatrix = new Matrix();
+
+ //Here are some attributes of the Graphics state, but have not been created yet.
+ //
+ //clippingPath
+ private PDColorSpaceInstance strokingColorSpace = new PDColorSpaceInstance();
+ private PDColorSpaceInstance nonStrokingColorSpace = new PDColorSpaceInstance();
+ private PDTextState textState = new PDTextState();
+ private double lineWidth = 0;
+ private int lineCap = 0;
+ private int lineJoin = 0;
+ private double miterLimit = 0;
+ private PDLineDashPattern lineDashPattern;
+ private String renderingIntent;
+ private boolean strokeAdjustment = false;
+ //blend mode
+ //soft mask
+ private double alphaConstants = 0;
+ private boolean alphaSource = false;
+
+ //DEVICE DEPENDENT parameters
+ private boolean overprint = false;
+ private double overprintMode = 0;
+ //black generation
+ //undercolor removal
+ //transfer
+ //halftone
+ private double flatness = 1.0;
+ private double smoothness = 0;
+
+ /**
+ * Get the value of the CTM.
+ *
+ * @return The current transformation matrix.
+ */
+ public Matrix getCurrentTransformationMatrix()
+ {
+ return currentTransformationMatrix;
+ }
+
+ /**
+ * Set the value of the CTM.
+ *
+ * @param value The current transformation matrix.
+ */
+ public void setCurrentTransformationMatrix(Matrix value)
+ {
+ currentTransformationMatrix = value;
+ }
+
+ /**
+ * Get the value of the line width.
+ *
+ * @return The current line width.
+ */
+ public double getLineWidth()
+ {
+ return lineWidth;
+ }
+
+ /**
+ * set the value of the line width.
+ *
+ * @param value The current line width.
+ */
+ public void setLineWidth(double value)
+ {
+ lineWidth = value;
+ }
+
+ /**
+ * Get the value of the line cap.
+ *
+ * @return The current line cap.
+ */
+ public int getLineCap()
+ {
+ return lineCap;
+ }
+
+ /**
+ * set the value of the line cap.
+ *
+ * @param value The current line cap.
+ */
+ public void setLineCap(int value)
+ {
+ lineCap = value;
+ }
+
+ /**
+ * Get the value of the line join.
+ *
+ * @return The current line join value.
+ */
+ public int getLineJoin()
+ {
+ return lineJoin;
+ }
+
+ /**
+ * Get the value of the line join.
+ *
+ * @param value The current line join
+ */
+ public void setLineJoin(int value)
+ {
+ lineJoin = value;
+ }
+
+ /**
+ * Get the value of the miter limit.
+ *
+ * @return The current miter limit.
+ */
+ public double getMiterLimit()
+ {
+ return miterLimit;
+ }
+
+ /**
+ * set the value of the miter limit.
+ *
+ * @param value The current miter limit.
+ */
+ public void setMiterLimit(double value)
+ {
+ miterLimit = value;
+ }
+
+ /**
+ * Get the value of the stroke adjustment parameter.
+ *
+ * @return The current stroke adjustment.
+ */
+ public boolean isStrokeAdjustment()
+ {
+ return strokeAdjustment;
+ }
+
+ /**
+ * set the value of the stroke adjustment.
+ *
+ * @param value The value of the stroke adjustment parameter.
+ */
+ public void setStrokeAdjustment(boolean value)
+ {
+ strokeAdjustment = value;
+ }
+
+ /**
+ * Get the value of the alpha constants property.
+ *
+ * @return The value of the alpha constants parameter.
+ */
+ public double getAlphaConstants()
+ {
+ return alphaConstants;
+ }
+
+ /**
+ * set the value of the alpha constants property.
+ *
+ * @param value The value of the alpha constants parameter.
+ */
+ public void setAlphaConstants(double value)
+ {
+ alphaConstants = value;
+ }
+
+ /**
+ * get the value of the alpha source property.
+ *
+ * @return The value of the alpha source parameter.
+ */
+ public boolean isAlphaSource()
+ {
+ return alphaSource;
+ }
+
+ /**
+ * set the value of the alpha source property.
+ *
+ * @param value The value of the alpha source parameter.
+ */
+ public void setAlphaSource(boolean value)
+ {
+ alphaSource = value;
+ }
+
+ /**
+ * get the value of the overprint property.
+ *
+ * @return The value of the overprint parameter.
+ */
+ public boolean isOverprint()
+ {
+ return overprint;
+ }
+
+ /**
+ * set the value of the overprint property.
+ *
+ * @param value The value of the overprint parameter.
+ */
+ public void setOverprint(boolean value)
+ {
+ overprint = value;
+ }
+
+ /**
+ * get the value of the overprint mode property.
+ *
+ * @return The value of the overprint mode parameter.
+ */
+ public double getOverprintMode()
+ {
+ return overprintMode;
+ }
+
+ /**
+ * set the value of the overprint mode property.
+ *
+ * @param value The value of the overprint mode parameter.
+ */
+ public void setOverprintMode(double value)
+ {
+ overprintMode = value;
+ }
+
+ /**
+ * get the value of the flatness property.
+ *
+ * @return The value of the flatness parameter.
+ */
+ public double getFlatness()
+ {
+ return flatness;
+ }
+
+ /**
+ * set the value of the flatness property.
+ *
+ * @param value The value of the flatness parameter.
+ */
+ public void setFlatness(double value)
+ {
+ flatness = value;
+ }
+
+ /**
+ * get the value of the smoothness property.
+ *
+ * @return The value of the smoothness parameter.
+ */
+ public double getSmoothness()
+ {
+ return smoothness;
+ }
+
+ /**
+ * set the value of the smoothness property.
+ *
+ * @param value The value of the smoothness parameter.
+ */
+ public void setSmoothness(double value)
+ {
+ smoothness = value;
+ }
+
+ /**
+ * This will get the graphics text state.
+ *
+ * @return The graphics text state.
+ */
+ public PDTextState getTextState()
+ {
+ return textState;
+ }
+
+ /**
+ * This will set the graphics text state.
+ *
+ * @param value The graphics text state.
+ */
+ public void setTextState(PDTextState value)
+ {
+ textState = value;
+ }
+
+ /**
+ * This will get the current line dash pattern.
+ *
+ * @return The line dash pattern.
+ */
+ public PDLineDashPattern getLineDashPattern()
+ {
+ return lineDashPattern;
+ }
+
+ /**
+ * This will set the current line dash pattern.
+ *
+ * @param value The new line dash pattern.
+ */
+ public void setLineDashPattern(PDLineDashPattern value)
+ {
+ lineDashPattern = value;
+ }
+
+ /**
+ * This will get the rendering intent.
+ *
+ * @see PDExtendedGraphicsState
+ *
+ * @return The rendering intent
+ */
+ public String getRenderingIntent()
+ {
+ return renderingIntent;
+ }
+
+ /**
+ * This will set the rendering intent.
+ *
+ * @param value The new rendering intent.
+ */
+ public void setRenderingIntent(String value)
+ {
+ renderingIntent = value;
+ }
+
+ /**
+ * @see Object#clone()
+ */
+ public Object clone()
+ {
+ PDGraphicsState clone = null;
+ try
+ {
+ clone = (PDGraphicsState)super.clone();
+ clone.setTextState( (PDTextState)textState.clone() );
+ clone.setCurrentTransformationMatrix( currentTransformationMatrix.copy() );
+ }
+ catch( CloneNotSupportedException e )
+ {
+ e.printStackTrace();
+ }
+ return clone;
+ }
+
+ /**
+ * This will get the current stroking colorspace.
+ *
+ * @return The current stroking colorspace.
+ */
+ public PDColorSpaceInstance getStrokingColorSpace()
+ {
+ return strokingColorSpace;
+ }
+
+ /**
+ * This will set the current stroking colorspace.
+ *
+ * @param value The new stroking colorspace instance.
+ */
+ public void setStrokingColorSpace(PDColorSpaceInstance value)
+ {
+ strokingColorSpace = value;
+ }
+
+ /**
+ * This will get the nonstroking color space instance.
+ *
+ * @return The colorspace instance.
+ */
+ public PDColorSpaceInstance getNonStrokingColorSpace()
+ {
+ return nonStrokingColorSpace;
+ }
+
+ /**
+ * This will set the non-stroking colorspace instance.
+ *
+ * @param value The non-stroking colorspace instance.
+ */
+ public void setNonStrokingColorSpace(PDColorSpaceInstance value)
+ {
+ nonStrokingColorSpace = value;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/graphics/PDLineDashPattern.java b/src/main/java/org/pdfbox/pdmodel/graphics/PDLineDashPattern.java
new file mode 100644
index 0000000..a67d5e4
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/graphics/PDLineDashPattern.java
@@ -0,0 +1,135 @@
+/**
+ * Copyright (c) 2003-2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.graphics;
+
+import org.pdfbox.cos.COSArray;
+import org.pdfbox.cos.COSBase;
+import org.pdfbox.cos.COSInteger;
+import org.pdfbox.cos.COSNumber;
+
+import org.pdfbox.pdmodel.common.COSArrayList;
+import org.pdfbox.pdmodel.common.COSObjectable;
+
+import java.util.List;
+
+/**
+ * This class represents the line dash pattern for a graphics state. See PDF
+ * Reference 1.5 section 4.3.2
+ *
+ * @author Ben Litchfield (ben@benlitchfield.com)
+ * @version $Revision: 1.4 $
+ */
+public class PDLineDashPattern implements COSObjectable
+{
+ private COSArray lineDashPattern = null;
+
+ /**
+ * Creates a blank line dash pattern. With no dashes and a phase of 0.
+ */
+ public PDLineDashPattern()
+ {
+ lineDashPattern = new COSArray();
+ lineDashPattern.add( new COSArray() );
+ lineDashPattern.add( new COSInteger( 0 ) );
+ }
+
+ /**
+ * Constructs a line dash pattern from an existing array.
+ *
+ * @param ldp The existing line dash pattern.
+ */
+ public PDLineDashPattern( COSArray ldp )
+ {
+ lineDashPattern = ldp;
+ }
+
+ /**
+ * @see COSObjectable#getCOSObject()
+ */
+ public COSBase getCOSObject()
+ {
+ return lineDashPattern;
+ }
+
+ /**
+ * This will get the line dash pattern phase. The dash phase specifies the
+ * distance into the dash pattern at which to start the dash.
+ *
+ * @return The line dash pattern phase.
+ */
+ public int getPhaseStart()
+ {
+ COSNumber phase = (COSNumber)lineDashPattern.get( 1 );
+ return phase.intValue();
+ }
+
+ /**
+ * This will set the line dash pattern phase.
+ *
+ * @param phase The new line dash patter phase.
+ */
+ public void setPhaseStart( int phase )
+ {
+ lineDashPattern.set( 1, new COSInteger( phase ) );
+ }
+
+ /**
+ * This will return a list of java.lang.Integer objects that represent the line
+ * dash pattern appearance.
+ *
+ * @return The line dash pattern.
+ */
+ public List getDashPattern()
+ {
+ COSArray dashPatterns = (COSArray)lineDashPattern.get( 0 );
+ return COSArrayList.convertIntegerCOSArrayToList( dashPatterns );
+ }
+
+ /**
+ * Get the line dash pattern as a COS object.
+ *
+ * @return The cos array line dash pattern.
+ */
+ public COSArray getCOSDashPattern()
+ {
+ return (COSArray)lineDashPattern.get( 0 );
+ }
+
+ /**
+ * This will replace the existing line dash pattern.
+ *
+ * @param dashPattern A list of java.lang.Integer objects.
+ */
+ public void setDashPattern( List dashPattern )
+ {
+ lineDashPattern.set( 0, COSArrayList.converterToCOSArray( dashPattern ) );
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/graphics/color/PDCalGray.java b/src/main/java/org/pdfbox/pdmodel/graphics/color/PDCalGray.java
new file mode 100644
index 0000000..fc6f84e
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/graphics/color/PDCalGray.java
@@ -0,0 +1,240 @@
+/**
+ * Copyright (c) 2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.graphics.color;
+
+import org.pdfbox.cos.COSArray;
+import org.pdfbox.cos.COSBase;
+import org.pdfbox.cos.COSDictionary;
+import org.pdfbox.cos.COSFloat;
+import org.pdfbox.cos.COSName;
+import org.pdfbox.cos.COSNumber;
+
+import java.awt.color.ColorSpace;
+import java.awt.image.ColorModel;
+
+import java.io.IOException;
+
+/**
+ * This class represents a Cal Gray color space.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.4 $
+ */
+public class PDCalGray extends PDColorSpace
+{
+ /**
+ * The name of this color space.
+ */
+ public static final String NAME = "CalGray";
+
+ private COSArray array;
+ private COSDictionary dictionary;
+
+ /**
+ * Constructor.
+ */
+ public PDCalGray()
+ {
+ array = new COSArray();
+ dictionary = new COSDictionary();
+ array.add( COSName.getPDFName( NAME ) );
+ array.add( dictionary );
+ }
+
+ /**
+ * Constructor with array.
+ *
+ * @param gray The underlying color space.
+ */
+ public PDCalGray( COSArray gray )
+ {
+ array = gray;
+ dictionary = (COSDictionary)array.getObject( 1 );
+ }
+
+ /**
+ * This will get the number of components that this color space is made up of.
+ *
+ * @return The number of components in this color space.
+ *
+ * @throws IOException If there is an error getting the number of color components.
+ */
+ public int getNumberOfComponents() throws IOException
+ {
+ return 1;
+ }
+
+ /**
+ * This will return the name of the color space.
+ *
+ * @return The name of the color space.
+ */
+ public String getName()
+ {
+ return NAME;
+ }
+
+ /**
+ * Create a Java colorspace for this colorspace.
+ *
+ * @return A color space that can be used for Java AWT operations.
+ *
+ * @throws IOException If there is an error creating the color space.
+ */
+ public ColorSpace createColorSpace() throws IOException
+ {
+ throw new IOException( "Not implemented" );
+ }
+
+ /**
+ * Create a Java color model for this colorspace.
+ *
+ * @param bpc The number of bits per component.
+ *
+ * @return A color model that can be used for Java AWT operations.
+ *
+ * @throws IOException If there is an error creating the color model.
+ */
+ public ColorModel createColorModel( int bpc ) throws IOException
+ {
+ throw new IOException( "Not implemented" );
+ }
+
+ /**
+ * Convert this standard java object to a COS object.
+ *
+ * @return The cos object that matches this Java object.
+ */
+ public COSBase getCOSObject()
+ {
+ return array;
+ }
+
+ /**
+ * This will get the gamma value. If none is present then the default of 1
+ * will be returned.
+ *
+ * @return The gamma value.
+ */
+ public float getGamma()
+ {
+ float retval = 1.0f;
+ COSNumber gamma = (COSNumber)dictionary.getDictionaryObject( COSName.getPDFName( "Gamma" ) );
+ if( gamma != null )
+ {
+ retval = gamma.floatValue();
+ }
+ return retval;
+ }
+
+ /**
+ * Set the gamma value.
+ *
+ * @param value The new gamma value.
+ */
+ public void setGamma( float value )
+ {
+ dictionary.setItem( COSName.getPDFName( "Gamma" ), new COSFloat( value ) );
+ }
+
+ /**
+ * This will return the whitepoint tristimulus. As this is a required field
+ * this will never return null. A default of 1,1,1 will be returned if the
+ * pdf does not have any values yet.
+ *
+ * @return The whitepoint tristimulus.
+ */
+ public PDTristimulus getWhitepoint()
+ {
+ PDTristimulus retval = null;
+ COSArray wp = (COSArray)dictionary.getDictionaryObject( COSName.getPDFName( "WhitePoint" ) );
+ if( wp == null )
+ {
+ wp.add( new COSFloat( 1.0f ) );
+ wp.add( new COSFloat( 1.0f ) );
+ wp.add( new COSFloat( 1.0f ) );
+ dictionary.setItem( COSName.getPDFName( "WhitePoint" ), wp );
+ }
+ return new PDTristimulus( wp );
+ }
+
+ /**
+ * This will set the whitepoint tristimulus. As this is a required field
+ * this null should not be passed into this function.
+ *
+ * @param wp The whitepoint tristimulus.
+ */
+ public void setWhitepoint( PDTristimulus wp )
+ {
+ COSBase wpArray = wp.getCOSObject();
+ if( wpArray != null )
+ {
+ dictionary.setItem( COSName.getPDFName( "WhitePoint" ), wpArray );
+ }
+ }
+
+ /**
+ * This will return the BlackPoint tristimulus. This is an optional field but
+ * has defaults so this will never return null.
+ * A default of 0,0,0 will be returned if the pdf does not have any values yet.
+ *
+ * @return The blackpoint tristimulus.
+ */
+ public PDTristimulus getBlackPoint()
+ {
+ PDTristimulus retval = null;
+ COSArray bp = (COSArray)dictionary.getDictionaryObject( COSName.getPDFName( "BlackPoint" ) );
+ if( bp == null )
+ {
+ bp.add( new COSFloat( 0.0f ) );
+ bp.add( new COSFloat( 0.0f ) );
+ bp.add( new COSFloat( 0.0f ) );
+ dictionary.setItem( COSName.getPDFName( "BlackPoint" ), bp );
+ }
+ return new PDTristimulus( bp );
+ }
+
+ /**
+ * This will set the BlackPoint tristimulus. As this is a required field
+ * this null should not be passed into this function.
+ *
+ * @param bp The BlackPoint tristimulus.
+ */
+ public void setBlackPoint( PDTristimulus bp )
+ {
+ COSBase bpArray = null;
+ if( bp != null )
+ {
+ bpArray = bp.getCOSObject();
+ }
+ dictionary.setItem( COSName.getPDFName( "BlackPoint" ), bpArray );
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/graphics/color/PDCalRGB.java b/src/main/java/org/pdfbox/pdmodel/graphics/color/PDCalRGB.java
new file mode 100644
index 0000000..6aa4eb1
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/graphics/color/PDCalRGB.java
@@ -0,0 +1,289 @@
+/**
+ * Copyright (c) 2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.graphics.color;
+
+import org.pdfbox.cos.COSArray;
+import org.pdfbox.cos.COSBase;
+import org.pdfbox.cos.COSDictionary;
+import org.pdfbox.cos.COSFloat;
+import org.pdfbox.cos.COSName;
+
+import org.pdfbox.pdmodel.common.PDMatrix;
+
+import java.awt.color.ColorSpace;
+import java.awt.image.ColorModel;
+
+import java.io.IOException;
+
+/**
+ * This class represents a Cal RGB color space.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.2 $
+ */
+public class PDCalRGB extends PDColorSpace
+{
+ /**
+ * The name of this color space.
+ */
+ public static final String NAME = "CalRGB";
+
+ private COSArray array;
+ private COSDictionary dictionary;
+
+ /**
+ * Constructor.
+ */
+ public PDCalRGB()
+ {
+ array = new COSArray();
+ dictionary = new COSDictionary();
+ array.add( COSName.getPDFName( NAME ) );
+ array.add( dictionary );
+ }
+
+ /**
+ * Constructor with array.
+ *
+ * @param rgb The underlying color space.
+ */
+ public PDCalRGB( COSArray rgb )
+ {
+ array = rgb;
+ dictionary = (COSDictionary)array.getObject( 1 );
+ }
+
+ /**
+ * This will get the number of components that this color space is made up of.
+ *
+ * @return The number of components in this color space.
+ *
+ * @throws IOException If there is an error getting the number of color components.
+ */
+ public int getNumberOfComponents() throws IOException
+ {
+ return 3;
+ }
+
+ /**
+ * This will return the name of the color space.
+ *
+ * @return The name of the color space.
+ */
+ public String getName()
+ {
+ return NAME;
+ }
+
+ /**
+ * Create a Java colorspace for this colorspace.
+ *
+ * @return A color space that can be used for Java AWT operations.
+ *
+ * @throws IOException If there is an error creating the color space.
+ */
+ public ColorSpace createColorSpace() throws IOException
+ {
+ throw new IOException( "Not implemented" );
+ }
+
+ /**
+ * Create a Java color model for this colorspace.
+ *
+ * @param bpc The number of bits per component.
+ *
+ * @return A color model that can be used for Java AWT operations.
+ *
+ * @throws IOException If there is an error creating the color model.
+ */
+ public ColorModel createColorModel( int bpc ) throws IOException
+ {
+ throw new IOException( "Not implemented" );
+ }
+
+ /**
+ * Convert this standard java object to a COS object.
+ *
+ * @return The cos object that matches this Java object.
+ */
+ public COSBase getCOSObject()
+ {
+ return array;
+ }
+
+ /**
+ * This will return the whitepoint tristimulus. As this is a required field
+ * this will never return null. A default of 1,1,1 will be returned if the
+ * pdf does not have any values yet.
+ *
+ * @return The whitepoint tristimulus.
+ */
+ public PDTristimulus getWhitepoint()
+ {
+ PDTristimulus retval = null;
+ COSArray wp = (COSArray)dictionary.getDictionaryObject( COSName.getPDFName( "WhitePoint" ) );
+ if( wp == null )
+ {
+ wp.add( new COSFloat( 1.0f ) );
+ wp.add( new COSFloat( 1.0f ) );
+ wp.add( new COSFloat( 1.0f ) );
+ dictionary.setItem( COSName.getPDFName( "WhitePoint" ), wp );
+ }
+ return new PDTristimulus( wp );
+ }
+
+ /**
+ * This will set the whitepoint tristimulus. As this is a required field
+ * this null should not be passed into this function.
+ *
+ * @param wp The whitepoint tristimulus.
+ */
+ public void setWhitepoint( PDTristimulus wp )
+ {
+ COSBase wpArray = wp.getCOSObject();
+ if( wpArray != null )
+ {
+ dictionary.setItem( COSName.getPDFName( "WhitePoint" ), wpArray );
+ }
+ }
+
+ /**
+ * This will return the BlackPoint tristimulus. This is an optional field but
+ * has defaults so this will never return null.
+ * A default of 0,0,0 will be returned if the pdf does not have any values yet.
+ *
+ * @return The blackpoint tristimulus.
+ */
+ public PDTristimulus getBlackPoint()
+ {
+ PDTristimulus retval = null;
+ COSArray bp = (COSArray)dictionary.getDictionaryObject( COSName.getPDFName( "BlackPoint" ) );
+ if( bp == null )
+ {
+ bp.add( new COSFloat( 0.0f ) );
+ bp.add( new COSFloat( 0.0f ) );
+ bp.add( new COSFloat( 0.0f ) );
+ dictionary.setItem( COSName.getPDFName( "BlackPoint" ), bp );
+ }
+ return new PDTristimulus( bp );
+ }
+
+ /**
+ * This will set the BlackPoint tristimulus. As this is a required field
+ * this null should not be passed into this function.
+ *
+ * @param bp The BlackPoint tristimulus.
+ */
+ public void setBlackPoint( PDTristimulus bp )
+ {
+
+ COSBase bpArray = null;
+ if( bp != null )
+ {
+ bpArray = bp.getCOSObject();
+ }
+ dictionary.setItem( COSName.getPDFName( "BlackPoint" ), bpArray );
+ }
+
+ /**
+ * This will get the gamma value. If none is present then the default of 1,1,1
+ * will be returned.
+ *
+ * @return The gamma value.
+ */
+ public PDGamma getGamma()
+ {
+ COSArray gamma = (COSArray)dictionary.getDictionaryObject( COSName.getPDFName( "Gamma" ) );
+ if( gamma == null )
+ {
+ gamma = new COSArray();
+ gamma.add( new COSFloat( 1.0f ) );
+ gamma.add( new COSFloat( 1.0f ) );
+ gamma.add( new COSFloat( 1.0f ) );
+ dictionary.setItem( COSName.getPDFName( "Gamma" ), gamma );
+ }
+ return new PDGamma( gamma );
+ }
+
+ /**
+ * Set the gamma value.
+ *
+ * @param value The new gamma value.
+ */
+ public void setGamma( PDGamma value )
+ {
+ COSArray gamma = null;
+ if( value != null )
+ {
+ gamma = (COSArray)value.getCOSArray();
+ }
+ dictionary.setItem( COSName.getPDFName( "Gamma" ), gamma );
+ }
+
+ /**
+ * This will get the linear interpretation array. This is guaranteed to not
+ * return null. If the underlying dictionary contains null then the identity
+ * matrix will be returned.
+ *
+ * @return The linear interpretation matrix.
+ */
+ public PDMatrix getLinearInterpretation()
+ {
+ PDMatrix retval = null;
+ COSArray matrix = (COSArray)dictionary.getDictionaryObject( COSName.getPDFName( "Matrix" ) );
+ if( matrix == null )
+ {
+ retval = new PDMatrix();
+ setLinearInterpretation( retval );
+ }
+ else
+ {
+ retval = new PDMatrix( matrix );
+ }
+ return retval;
+ }
+
+ /**
+ * This will set the linear interpretation matrix. Passing in null will
+ * clear the matrix.
+ *
+ * @param matrix The new linear interpretation matrix.
+ */
+ public void setLinearInterpretation( PDMatrix matrix )
+ {
+ COSArray matrixArray = null;
+ if( matrix != null )
+ {
+ matrixArray = matrix.getCOSArray();
+ }
+ dictionary.setItem( COSName.getPDFName( "Matrix" ), matrixArray );
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/graphics/color/PDColorSpace.java b/src/main/java/org/pdfbox/pdmodel/graphics/color/PDColorSpace.java
new file mode 100644
index 0000000..33ac0a1
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/graphics/color/PDColorSpace.java
@@ -0,0 +1,97 @@
+/**
+ * Copyright (c) 2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.graphics.color;
+
+import org.pdfbox.cos.COSBase;
+import org.pdfbox.cos.COSName;
+
+import org.pdfbox.pdmodel.common.COSObjectable;
+
+import java.io.IOException;
+
+import java.awt.color.ColorSpace;
+import java.awt.image.ColorModel;
+
+
+/**
+ * This class represents a color space in a pdf document.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.4 $
+ */
+public abstract class PDColorSpace implements COSObjectable
+{
+ /**
+ * This will return the name of the color space.
+ *
+ * @return The name of the color space.
+ */
+ public abstract String getName();
+
+ /**
+ * This will get the number of components that this color space is made up of.
+ *
+ * @return The number of components in this color space.
+ *
+ * @throws IOException If there is an error getting the number of color components.
+ */
+ public abstract int getNumberOfComponents() throws IOException;
+
+ /**
+ * Convert this standard java object to a COS object.
+ *
+ * @return The cos object that matches this Java object.
+ */
+ public COSBase getCOSObject()
+ {
+ return COSName.getPDFName( getName() );
+ }
+
+ /**
+ * Create a Java colorspace for this colorspace.
+ *
+ * @return A color space that can be used for Java AWT operations.
+ *
+ * @throws IOException If there is an error creating the color space.
+ */
+ public abstract ColorSpace createColorSpace() throws IOException;
+
+ /**
+ * Create a Java color model for this colorspace.
+ *
+ * @param bpc The number of bits per component.
+ *
+ * @return A color model that can be used for Java AWT operations.
+ *
+ * @throws IOException If there is an error creating the color model.
+ */
+ public abstract ColorModel createColorModel( int bpc ) throws IOException;
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/graphics/color/PDColorSpaceFactory.java b/src/main/java/org/pdfbox/pdmodel/graphics/color/PDColorSpaceFactory.java
new file mode 100644
index 0000000..8c9aad5
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/graphics/color/PDColorSpaceFactory.java
@@ -0,0 +1,218 @@
+/**
+ * Copyright (c) 2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.graphics.color;
+
+import java.awt.color.ColorSpace;
+import java.awt.color.ICC_ColorSpace;
+import java.io.IOException;
+import java.io.OutputStream;
+
+import org.pdfbox.cos.COSArray;
+import org.pdfbox.cos.COSBase;
+import org.pdfbox.cos.COSFloat;
+import org.pdfbox.cos.COSName;
+import org.pdfbox.pdmodel.PDDocument;
+import org.pdfbox.pdmodel.common.PDStream;
+
+/**
+ * This class represents a color space in a pdf document.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.10 $
+ */
+public final class PDColorSpaceFactory
+{
+ /**
+ * Private constructor for utility classes.
+ */
+ private PDColorSpaceFactory()
+ {
+ //utility class should not be implemented
+ }
+
+ /**
+ * This will create the correct color space given the name.
+ *
+ * @param colorSpace The color space object.
+ *
+ * @return The color space.
+ *
+ * @throws IOException If the color space name is unknown.
+ */
+ public static PDColorSpace createColorSpace( COSBase colorSpace ) throws IOException
+ {
+ PDColorSpace retval = null;
+ if( colorSpace instanceof COSName )
+ {
+ retval = createColorSpace( ((COSName)colorSpace).getName() );
+ }
+ else if( colorSpace instanceof COSArray )
+ {
+ COSArray array = (COSArray)colorSpace;
+ COSName type = (COSName)array.getObject( 0 );
+ if( type.getName().equals( PDCalGray.NAME ) )
+ {
+ retval = new PDCalGray( array );
+ }
+ else if( type.getName().equals( PDCalRGB.NAME ) )
+ {
+ retval = new PDCalRGB( array );
+ }
+ else if( type.getName().equals( PDDeviceN.NAME ) )
+ {
+ retval = new PDDeviceN( array );
+ }
+ else if( type.getName().equals( PDIndexed.NAME ) ||
+ type.getName().equals( PDIndexed.ABBREVIATED_NAME ))
+ {
+ retval = new PDIndexed( array );
+ }
+ else if( type.getName().equals( PDLab.NAME ) )
+ {
+ retval = new PDLab( array );
+ }
+ else if( type.getName().equals( PDSeparation.NAME ) )
+ {
+ retval = new PDSeparation( array );
+ }
+ else if( type.getName().equals( PDICCBased.NAME ) )
+ {
+ retval = new PDICCBased( array );
+ }
+ else if( type.getName().equals( PDPattern.NAME ) )
+ {
+ retval = new PDPattern( array );
+ }
+ else
+ {
+ throw new IOException( "Unknown colorspace array type:" + type );
+ }
+ }
+ else
+ {
+ throw new IOException( "Unknown colorspace type:" + colorSpace );
+ }
+ return retval;
+ }
+
+ /**
+ * This will create the correct color space given the name.
+ *
+ * @param colorSpaceName The name of the colorspace.
+ *
+ * @return The color space.
+ *
+ * @throws IOException If the color space name is unknown.
+ */
+ public static PDColorSpace createColorSpace( String colorSpaceName ) throws IOException
+ {
+ PDColorSpace cs = null;
+ if( colorSpaceName.equals( PDDeviceCMYK.NAME ) ||
+ colorSpaceName.equals( PDDeviceCMYK.ABBREVIATED_NAME ) )
+ {
+ cs = PDDeviceCMYK.INSTANCE;
+ }
+ else if( colorSpaceName.equals( PDDeviceRGB.NAME ) ||
+ colorSpaceName.equals( PDDeviceRGB.ABBREVIATED_NAME ) )
+ {
+ cs = PDDeviceRGB.INSTANCE;
+ }
+ else if( colorSpaceName.equals( PDDeviceGray.NAME ) ||
+ colorSpaceName.equals( PDDeviceGray.ABBREVIATED_NAME ))
+ {
+ cs = new PDDeviceGray();
+ }
+ else if( colorSpaceName.equals( PDLab.NAME ) )
+ {
+ cs = new PDLab();
+ }
+ else if( colorSpaceName.equals( PDPattern.NAME ) )
+ {
+ cs = new PDPattern();
+ }
+ else
+ {
+ throw new IOException( "Error: Unknown colorspace '" + colorSpaceName + "'" );
+ }
+ return cs;
+ }
+
+ /**
+ * This will create the correct color space from a java colorspace.
+ *
+ * @param doc The doc to potentiall write information to.
+ * @param cs The awt colorspace.
+ *
+ * @return The color space.
+ *
+ * @throws IOException If the color space name is unknown.
+ */
+ public static PDColorSpace createColorSpace( PDDocument doc, ColorSpace cs ) throws IOException
+ {
+ PDColorSpace retval = null;
+ if( cs.isCS_sRGB() )
+ {
+ retval = PDDeviceRGB.INSTANCE;
+ }
+ else if( cs instanceof ICC_ColorSpace )
+ {
+ ICC_ColorSpace ics = (ICC_ColorSpace)cs;
+ PDICCBased pdCS = new PDICCBased( doc );
+ retval = pdCS;
+ COSArray ranges = new COSArray();
+ for( int i=0; i<cs.getNumComponents(); i++ )
+ {
+ ranges.add( new COSFloat( ics.getMinValue( i ) ) );
+ ranges.add( new COSFloat( ics.getMaxValue( i ) ) );
+ }
+ PDStream iccData = pdCS.getPDStream();
+ OutputStream output = null;
+ try
+ {
+ output = iccData.createOutputStream();
+ output.write( ics.getProfile().getData() );
+ }
+ finally
+ {
+ if( output != null )
+ {
+ output.close();
+ }
+ }
+ pdCS.setNumberOfComponents( cs.getNumComponents() );
+ }
+ else
+ {
+ throw new IOException( "Not yet implemented:" + cs );
+ }
+ return retval;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/graphics/color/PDColorSpaceInstance.java b/src/main/java/org/pdfbox/pdmodel/graphics/color/PDColorSpaceInstance.java
new file mode 100644
index 0000000..23693df
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/graphics/color/PDColorSpaceInstance.java
@@ -0,0 +1,130 @@
+/**
+ * Copyright (c) 2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.graphics.color;
+
+import java.awt.Color;
+import java.io.IOException;
+
+import org.pdfbox.cos.COSArray;
+
+/**
+ * This class represents a color space and the color value for that colorspace.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.3 $
+ */
+public class PDColorSpaceInstance
+{
+ private PDColorSpace colorSpace = new PDDeviceGray();
+ private COSArray colorSpaceValue = new COSArray();
+
+ /**
+ * Default constructor.
+ *
+ */
+ public PDColorSpaceInstance()
+ {
+ //do nothing
+ }
+
+ /**
+ * Create the current color from the colorspace and values.
+ * @return The current awt color.
+ * @throws IOException If there is an error creating the color.
+ */
+ public Color createColor() throws IOException
+ {
+ float[] components = colorSpaceValue.toFloatArray();
+ Color color = new Color( colorSpace.createColorSpace(), components, 1f );
+ return color;
+ }
+
+ /**
+ * Constructor with an existing color set. Default colorspace is PDDeviceGray.
+ *
+ * @param csValues The color space values.
+ */
+ public PDColorSpaceInstance( COSArray csValues )
+ {
+ colorSpaceValue = csValues;
+ }
+
+
+ /**
+ * This will get the current colorspace.
+ *
+ * @return The current colorspace.
+ */
+ public PDColorSpace getColorSpace()
+ {
+ return colorSpace;
+ }
+
+ /**
+ * This will set the current colorspace.
+ *
+ * @param value The new colorspace.
+ */
+ public void setColorSpace(PDColorSpace value)
+ {
+ colorSpace = value;
+ }
+
+ /**
+ * This will get the color space values. Either 1 for gray or 3 for RGB.
+ *
+ * @return The colorspace values.
+ */
+ public float[] getColorSpaceValue()
+ {
+ return colorSpaceValue.toFloatArray();
+ }
+
+ /**
+ * This will get the color space values. Either 1 for gray or 3 for RGB.
+ *
+ * @return The colorspace values.
+ */
+ public COSArray getCOSColorSpaceValue()
+ {
+ return colorSpaceValue;
+ }
+
+ /**
+ * This will update the colorspace values.
+ *
+ * @param value The new colorspace values.
+ */
+ public void setColorSpaceValue(float[] value)
+ {
+ colorSpaceValue.setFloatArray( value );
+ }
+}
diff --git a/src/main/java/org/pdfbox/pdmodel/graphics/color/PDDeviceCMYK.java b/src/main/java/org/pdfbox/pdmodel/graphics/color/PDDeviceCMYK.java
new file mode 100644
index 0000000..dfbdfe5
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/graphics/color/PDDeviceCMYK.java
@@ -0,0 +1,137 @@
+/**
+ * Copyright (c) 2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.graphics.color;
+
+import java.awt.color.ColorSpace;
+import java.awt.color.ICC_ColorSpace;
+import java.awt.color.ICC_Profile;
+import java.awt.image.ColorModel;
+
+import java.io.InputStream;
+import java.io.IOException;
+
+import org.pdfbox.util.ResourceLoader;
+
+/**
+ * This class represents a CMYK color space.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.5 $
+ */
+public class PDDeviceCMYK extends PDColorSpace
+{
+ /**
+ * The single instance of this class.
+ */
+ public static final PDDeviceCMYK INSTANCE = new PDDeviceCMYK();
+
+ /**
+ * The name of this color space.
+ */
+ public static final String NAME = "DeviceCMYK";
+
+ /**
+ * The abbreviated name of this color space.
+ */
+ public static final String ABBREVIATED_NAME = "CMYK";
+
+ private ColorSpace cSpace = null;
+
+ private PDDeviceCMYK()
+ {
+
+ }
+
+ /**
+ * This will return the name of the color space.
+ *
+ * @return The name of the color space.
+ */
+ public String getName()
+ {
+ return NAME;
+ }
+
+ /**
+ * This will get the number of components that this color space is made up of.
+ *
+ * @return The number of components in this color space.
+ *
+ * @throws IOException If there is an error getting the number of color components.
+ */
+ public int getNumberOfComponents() throws IOException
+ {
+ return 4;
+ }
+
+ /**
+ * Create a Java colorspace for this colorspace.
+ *
+ * @return A color space that can be used for Java AWT operations.
+ *
+ * @throws IOException If there is an error creating the color space.
+ */
+ public ColorSpace createColorSpace() throws IOException
+ {
+ if( cSpace == null )
+ {
+ InputStream profile = null;
+ try
+ {
+ profile = ResourceLoader.loadResource( "Resources/colorspace-profiles/CMYK.pf" );
+ ICC_Profile iccProfile = ICC_Profile.getInstance( profile );
+ cSpace = new ICC_ColorSpace( iccProfile );
+ }
+ finally
+ {
+ if( profile != null )
+ {
+ profile.close();
+ }
+ }
+ }
+ return cSpace;
+ }
+
+ /**
+ * Create a Java color model for this colorspace.
+ *
+ * @param bpc The number of bits per component.
+ *
+ * @return A color model that can be used for Java AWT operations.
+ *
+ * @throws IOException If there is an error creating the color model.
+ */
+ public ColorModel createColorModel( int bpc ) throws IOException
+ {
+ throw new IOException( "Not implemented" );
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/graphics/color/PDDeviceGray.java b/src/main/java/org/pdfbox/pdmodel/graphics/color/PDDeviceGray.java
new file mode 100644
index 0000000..a9afddb
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/graphics/color/PDDeviceGray.java
@@ -0,0 +1,112 @@
+/**
+ * Copyright (c) 2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.graphics.color;
+
+import java.awt.color.ColorSpace;
+
+import java.awt.image.ColorModel;
+import java.awt.image.ComponentColorModel;
+import java.awt.image.DataBuffer;
+import java.awt.Transparency;
+
+import java.io.IOException;
+
+/**
+ * This class represents a Gray color space.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.5 $
+ */
+public class PDDeviceGray extends PDColorSpace
+{
+ /**
+ * The name of this color space.
+ */
+ public static final String NAME = "DeviceGray";
+
+ /**
+ * The abbreviated name of this color space.
+ */
+ public static final String ABBREVIATED_NAME = "G";
+
+ /**
+ * This will return the name of the color space.
+ *
+ * @return The name of the color space.
+ */
+ public String getName()
+ {
+ return NAME;
+ }
+
+ /**
+ * This will get the number of components that this color space is made up of.
+ *
+ * @return The number of components in this color space.
+ *
+ * @throws IOException If there is an error getting the number of color components.
+ */
+ public int getNumberOfComponents() throws IOException
+ {
+ return 1;
+ }
+
+ /**
+ * Create a Java colorspace for this colorspace.
+ *
+ * @return A color space that can be used for Java AWT operations.
+ *
+ * @throws IOException If there is an error creating the color space.
+ */
+ public ColorSpace createColorSpace() throws IOException
+ {
+ return ColorSpace.getInstance( ColorSpace.CS_GRAY );
+ }
+
+ /**
+ * Create a Java color model for this colorspace.
+ *
+ * @param bpc The number of bits per component.
+ *
+ * @return A color model that can be used for Java AWT operations.
+ *
+ * @throws IOException If there is an error creating the color model.
+ */
+ public ColorModel createColorModel( int bpc ) throws IOException
+ {
+ ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_GRAY);
+ int[] nBits = {bpc};
+ ColorModel colorModel = new ComponentColorModel(cs, nBits, false,false,
+ Transparency.OPAQUE,DataBuffer.TYPE_BYTE);
+ return colorModel;
+
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/graphics/color/PDDeviceN.java b/src/main/java/org/pdfbox/pdmodel/graphics/color/PDDeviceN.java
new file mode 100644
index 0000000..92561e7
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/graphics/color/PDDeviceN.java
@@ -0,0 +1,244 @@
+/**
+ * Copyright (c) 2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.graphics.color;
+
+import java.awt.color.ColorSpace;
+import java.awt.image.ColorModel;
+
+import java.io.IOException;
+
+import java.util.List;
+
+import org.pdfbox.cos.COSArray;
+import org.pdfbox.cos.COSBase;
+import org.pdfbox.cos.COSName;
+import org.pdfbox.cos.COSNull;
+
+import org.pdfbox.pdmodel.common.COSArrayList;
+
+/**
+ * This class represents a DeviceN color space.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.2 $
+ */
+public class PDDeviceN extends PDColorSpace
+{
+ /**
+ * The name of this color space.
+ */
+ public static final String NAME = "DeviceN";
+
+ private COSArray array;
+
+ /**
+ * Constructor.
+ */
+ public PDDeviceN()
+ {
+ array = new COSArray();
+ array.add( COSName.getPDFName( NAME ) );
+ array.add( COSName.getPDFName( "" ) );
+ }
+
+ /**
+ * Constructor.
+ *
+ * @param separation The array containing all separation information.
+ */
+ public PDDeviceN( COSArray separation )
+ {
+ array = separation;
+ }
+
+ /**
+ * This will return the name of the color space. For a PDSeparation object
+ * this will always return "Separation"
+ *
+ * @return The name of the color space.
+ */
+ public String getName()
+ {
+ return NAME;
+ }
+
+ /**
+ * This will get the number of components that this color space is made up of.
+ *
+ * @return The number of components in this color space.
+ *
+ * @throws IOException If there is an error getting the number of color components.
+ */
+ public int getNumberOfComponents() throws IOException
+ {
+ return getColorantNames().size();
+ }
+
+ /**
+ * Create a Java colorspace for this colorspace.
+ *
+ * @return A color space that can be used for Java AWT operations.
+ *
+ * @throws IOException If there is an error creating the color space.
+ */
+ public ColorSpace createColorSpace() throws IOException
+ {
+ throw new IOException( "Not implemented" );
+ }
+
+ /**
+ * Create a Java color model for this colorspace.
+ *
+ * @param bpc The number of bits per component.
+ *
+ * @return A color model that can be used for Java AWT operations.
+ *
+ * @throws IOException If there is an error creating the color model.
+ */
+ public ColorModel createColorModel( int bpc ) throws IOException
+ {
+ throw new IOException( "Not implemented" );
+ }
+
+ /**
+ * This will get the colorant names. A list of string objects.
+ *
+ * @return A list of colorants
+ */
+ public List getColorantNames()
+ {
+ COSArray names = (COSArray)array.getObject( 1 );
+ return COSArrayList.convertCOSNameCOSArrayToList( names );
+ }
+
+ /**
+ * This will set the list of colorants.
+ *
+ * @param names The list of colorant names.
+ */
+ public void setColorantNames( List names )
+ {
+ COSArray namesArray = COSArrayList.convertStringListToCOSNameCOSArray( names );
+ array.set( 1, namesArray );
+ }
+
+ /**
+ * This will get the alternate color space for this separation.
+ *
+ * @return The alternate color space.
+ *
+ * @throws IOException If there is an error getting the alternate color space.
+ */
+ public PDColorSpace getAlternateColorSpace() throws IOException
+ {
+ COSBase alternate = array.getObject( 2 );
+ return PDColorSpaceFactory.createColorSpace( alternate );
+ }
+
+ /**
+ * This will set the alternate color space.
+ *
+ * @param cs The alternate color space.
+ */
+ public void setAlternateColorSpace( PDColorSpace cs )
+ {
+ COSBase space = null;
+ if( cs != null )
+ {
+ space = cs.getCOSObject();
+ }
+ array.set( 2, space );
+ }
+
+ /**
+ * This will get the tint transform function. At this time the PDModel
+ * does not support functions so we will just return the COSBase object. This
+ * method will change in the future to be a PDModel object.
+ *
+ * @return The tint transform function.
+ */
+ public COSBase getTintTransform()
+ {
+ return array.get( 3 );
+ }
+
+ /**
+ * This will set the tint transform function. At this time the PDModel
+ * does not support functions so we will just return the COSBase object. This
+ * method will change in the future to be a PDModel object.
+ *
+ * @param tint The tint transform function.
+ */
+ public void setTintTransform( COSBase tint )
+ {
+ array.set( 3, tint );
+ }
+
+ /**
+ * This will get the attributes that are associated with the deviceN
+ * color space.
+ *
+ * @return The DeviceN attributes.
+ */
+ public PDDeviceNAttributes getAttributes()
+ {
+ PDDeviceNAttributes retval = null;
+ if( array.size() <5)
+ {
+ retval = new PDDeviceNAttributes();
+ setAttributes( retval );
+ }
+ return retval;
+ }
+
+ /**
+ * This will set the color space attributes. If null is passed in then
+ * all attribute will be removed.
+ *
+ * @param attributes The color space attributes.
+ */
+ public void setAttributes( PDDeviceNAttributes attributes )
+ {
+ if( attributes == null )
+ {
+ array.remove( 4 );
+ }
+ else
+ {
+ //make sure array is large enough
+ while( array.size() < 5 )
+ {
+ array.add( COSNull.NULL );
+ }
+ array.set( 4, attributes.getCOSDictionary() );
+ }
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/graphics/color/PDDeviceNAttributes.java b/src/main/java/org/pdfbox/pdmodel/graphics/color/PDDeviceNAttributes.java
new file mode 100644
index 0000000..00366df
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/graphics/color/PDDeviceNAttributes.java
@@ -0,0 +1,126 @@
+/**
+ * Copyright (c) 2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.graphics.color;
+
+import org.pdfbox.cos.COSBase;
+import org.pdfbox.cos.COSDictionary;
+import org.pdfbox.cos.COSName;
+
+import org.pdfbox.pdmodel.common.COSDictionaryMap;
+
+import java.io.IOException;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+/**
+ * This class represents attributes for a DeviceN color space.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.1 $
+ */
+public class PDDeviceNAttributes
+{
+ private COSDictionary dictionary;
+
+ /**
+ * Constructor.
+ */
+ public PDDeviceNAttributes()
+ {
+ dictionary = new COSDictionary();
+ }
+
+ /**
+ * Constructor.
+ *
+ * @param attributes A dictionary that has all of the attributes.
+ */
+ public PDDeviceNAttributes( COSDictionary attributes )
+ {
+ dictionary = attributes;
+ }
+
+ /**
+ * This will get the underlying cos dictionary.
+ *
+ * @return The dictionary that this object wraps.
+ */
+ public COSDictionary getCOSDictionary()
+ {
+ return dictionary;
+ }
+
+ /**
+ * This will get a map of colorants. See the PDF Reference for more details about
+ * this attribute. The map will contain a java.lang.String as the key, a colorant name,
+ * and a PDColorSpace as the value.
+ *
+ * @return The colorant map.
+ *
+ * @throws IOException If there is an error getting the colorspaces.
+ */
+ public Map getColorants() throws IOException
+ {
+ Map actuals = new HashMap();
+ COSDictionary colorants = (COSDictionary)dictionary.getDictionaryObject( COSName.getPDFName( "Colorants" ) );
+ if( colorants == null )
+ {
+ colorants = new COSDictionary();
+ dictionary.setItem( COSName.getPDFName( "Colorants" ), colorants );
+ }
+ Iterator iter = colorants.keyList().iterator();
+ while( iter.hasNext() )
+ {
+ COSName name = (COSName)iter.next();
+ COSBase value = colorants.getDictionaryObject( name );
+ actuals.put( name.getName(), PDColorSpaceFactory.createColorSpace( value ) );
+ }
+ return new COSDictionaryMap( actuals, colorants );
+ }
+
+ /**
+ * This will replace the existing colorant attribute. The key should be strings
+ * and the values should be PDColorSpaces.
+ *
+ * @param colorants The map of colorants.
+ */
+ public void setColorants( Map colorants )
+ {
+ COSDictionary colorantDict = null;
+ if( colorants != null )
+ {
+ colorantDict = COSDictionaryMap.convert( colorants );
+ }
+ dictionary.setItem( COSName.getPDFName( "Colorants" ), colorantDict );
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/graphics/color/PDDeviceRGB.java b/src/main/java/org/pdfbox/pdmodel/graphics/color/PDDeviceRGB.java
new file mode 100644
index 0000000..14c0dc3
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/graphics/color/PDDeviceRGB.java
@@ -0,0 +1,130 @@
+/**
+ * Copyright (c) 2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.graphics.color;
+
+import java.awt.Transparency;
+
+import java.awt.color.ColorSpace;
+
+import java.awt.image.ColorModel;
+import java.awt.image.ComponentColorModel;
+import java.awt.image.DataBuffer;
+
+import java.io.IOException;
+
+/**
+ * This class represents an RGB color space.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.7 $
+ */
+public class PDDeviceRGB extends PDColorSpace
+{
+ /**
+ * The name of this color space.
+ */
+ public static final String NAME = "DeviceRGB";
+
+ /**
+ * The abbreviated name of this color space.
+ */
+ public static final String ABBREVIATED_NAME = "RGB";
+
+ /**
+ * This is the single instance of this class.
+ */
+ public static final PDDeviceRGB INSTANCE = new PDDeviceRGB();
+
+ /**
+ * This class is immutable.
+ */
+ private PDDeviceRGB()
+ {
+ //only here to make immutable.
+ }
+
+ /**
+ * This will return the name of the color space.
+ *
+ * @return The name of the color space.
+ */
+ public String getName()
+ {
+ return NAME;
+ }
+
+ /**
+ * This will get the number of components that this color space is made up of.
+ *
+ * @return The number of components in this color space.
+ *
+ * @throws IOException If there is an error getting the number of color components.
+ */
+ public int getNumberOfComponents() throws IOException
+ {
+ return 3;
+ }
+
+ /**
+ * Create a Java colorspace for this colorspace.
+ *
+ * @return A color space that can be used for Java AWT operations.
+ *
+ * @throws IOException If there is an error creating the color space.
+ */
+ public ColorSpace createColorSpace() throws IOException
+ {
+ return ColorSpace.getInstance( ColorSpace.CS_sRGB );
+ }
+
+ /**
+ * Create a Java color model for this colorspace.
+ *
+ * @param bpc The number of bits per component.
+ *
+ * @return A color model that can be used for Java AWT operations.
+ *
+ * @throws IOException If there is an error creating the color model.
+ */
+ public ColorModel createColorModel( int bpc ) throws IOException
+ {
+ int[] nbBits = { bpc, bpc, bpc };
+ ComponentColorModel componentColorModel =
+ new ComponentColorModel( createColorSpace(),
+ nbBits,
+ false,
+ false,
+ Transparency.OPAQUE,
+ DataBuffer.TYPE_BYTE );
+
+ return (ColorModel)componentColorModel;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/graphics/color/PDGamma.java b/src/main/java/org/pdfbox/pdmodel/graphics/color/PDGamma.java
new file mode 100644
index 0000000..31fa82e
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/graphics/color/PDGamma.java
@@ -0,0 +1,151 @@
+/**
+ * Copyright (c) 2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.graphics.color;
+
+import org.pdfbox.cos.COSArray;
+import org.pdfbox.cos.COSBase;
+import org.pdfbox.cos.COSFloat;
+import org.pdfbox.cos.COSNumber;
+
+import org.pdfbox.pdmodel.common.COSObjectable;
+
+/**
+ * A gamma array, or collection of three floating point parameters used for
+ * color operations.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.1 $
+ */
+public class PDGamma implements COSObjectable
+{
+ private COSArray values = null;
+
+ /**
+ * Constructor. Defaults all values to 0, 0, 0.
+ */
+ public PDGamma()
+ {
+ values = new COSArray();
+ values.add( new COSFloat( 0.0f ) );
+ values.add( new COSFloat( 0.0f ) );
+ values.add( new COSFloat( 0.0f ) );
+ }
+
+ /**
+ * Constructor from COS object.
+ *
+ * @param array The array containing the XYZ values.
+ */
+ public PDGamma( COSArray array )
+ {
+ values = array;
+ }
+
+ /**
+ * Convert this standard java object to a COS object.
+ *
+ * @return The cos object that matches this Java object.
+ */
+ public COSBase getCOSObject()
+ {
+ return values;
+ }
+
+ /**
+ * Convert this standard java object to a COS object.
+ *
+ * @return The cos object that matches this Java object.
+ */
+ public COSArray getCOSArray()
+ {
+ return values;
+ }
+
+ /**
+ * This will get the r value of the tristimulus.
+ *
+ * @return The R value.
+ */
+ public float getR()
+ {
+ return ((COSNumber)values.get( 0 )).floatValue();
+ }
+
+ /**
+ * This will set the r value of the tristimulus.
+ *
+ * @param r The r value for the tristimulus.
+ */
+ public void setR( float r )
+ {
+ values.set( 0, new COSFloat( r ) );
+ }
+
+ /**
+ * This will get the g value of the tristimulus.
+ *
+ * @return The g value.
+ */
+ public float getG()
+ {
+ return ((COSNumber)values.get( 1 )).floatValue();
+ }
+
+ /**
+ * This will set the g value of the tristimulus.
+ *
+ * @param g The g value for the tristimulus.
+ */
+ public void setG( float g )
+ {
+ values.set( 1, new COSFloat( g ) );
+ }
+
+ /**
+ * This will get the b value of the tristimulus.
+ *
+ * @return The B value.
+ */
+ public float getB()
+ {
+ return ((COSNumber)values.get( 2 )).floatValue();
+ }
+
+ /**
+ * This will set the b value of the tristimulus.
+ *
+ * @param b The b value for the tristimulus.
+ */
+ public void setB( float b )
+ {
+ values.set( 2, new COSFloat( b ) );
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/graphics/color/PDICCBased.java b/src/main/java/org/pdfbox/pdmodel/graphics/color/PDICCBased.java
new file mode 100644
index 0000000..d8189d0
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/graphics/color/PDICCBased.java
@@ -0,0 +1,343 @@
+/**
+ * Copyright (c) 2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.graphics.color;
+
+import org.pdfbox.cos.COSArray;
+import org.pdfbox.cos.COSBase;
+import org.pdfbox.cos.COSInteger;
+import org.pdfbox.cos.COSFloat;
+import org.pdfbox.cos.COSName;
+import org.pdfbox.cos.COSNumber;
+import org.pdfbox.cos.COSStream;
+
+import org.pdfbox.pdmodel.PDDocument;
+import org.pdfbox.pdmodel.common.COSArrayList;
+import org.pdfbox.pdmodel.common.PDRange;
+import org.pdfbox.pdmodel.common.PDStream;
+
+import java.awt.Transparency;
+import java.awt.color.ColorSpace;
+import java.awt.color.ICC_ColorSpace;
+import java.awt.color.ICC_Profile;
+import java.awt.image.ColorModel;
+import java.awt.image.ComponentColorModel;
+import java.awt.image.DataBuffer;
+
+import java.io.InputStream;
+import java.io.IOException;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * This class represents a ICC profile color space.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.5 $
+ */
+public class PDICCBased extends PDColorSpace
+{
+ /**
+ * The name of this color space.
+ */
+ public static final String NAME = "ICCBased";
+
+ private COSArray array;
+ private PDStream stream;
+
+ /**
+ * Default constructor, creates empty stream.
+ *
+ * @param doc The document to store the icc data.
+ */
+ public PDICCBased( PDDocument doc )
+ {
+ array = new COSArray();
+ array.add( COSName.getPDFName( NAME ) );
+ array.add( new PDStream( doc ) );
+ }
+
+ /**
+ * Constructor.
+ *
+ * @param iccArray The ICC stream object.
+ */
+ public PDICCBased( COSArray iccArray )
+ {
+ array = iccArray;
+ stream = new PDStream( (COSStream)iccArray.getObject( 1 ) );
+ }
+
+ /**
+ * This will return the name of the color space.
+ *
+ * @return The name of the color space.
+ */
+ public String getName()
+ {
+ return NAME;
+ }
+
+ /**
+ * Convert this standard java object to a COS object.
+ *
+ * @return The cos object that matches this Java object.
+ */
+ public COSBase getCOSObject()
+ {
+ return array;
+ }
+
+ /**
+ * Get the pd stream for this icc color space.
+ *
+ * @return Get the stream for this icc based color space.
+ */
+ public PDStream getPDStream()
+ {
+ return stream;
+ }
+
+ /**
+ * Create a Java colorspace for this colorspace.
+ *
+ * @return A color space that can be used for Java AWT operations.
+ *
+ * @throws IOException If there is an error creating the color space.
+ */
+ public ColorSpace createColorSpace() throws IOException
+ {
+ InputStream profile = null;
+ ColorSpace cSpace = null;
+ try
+ {
+ profile = stream.createInputStream();
+ ICC_Profile iccProfile = ICC_Profile.getInstance( profile );
+ cSpace = new ICC_ColorSpace( iccProfile );
+ }
+ finally
+ {
+ if( profile != null )
+ {
+ profile.close();
+ }
+ }
+ return cSpace;
+ }
+
+ /**
+ * Create a Java color model for this colorspace.
+ *
+ * @param bpc The number of bits per component.
+ *
+ * @return A color model that can be used for Java AWT operations.
+ *
+ * @throws IOException If there is an error creating the color model.
+ */
+ public ColorModel createColorModel( int bpc ) throws IOException
+ {
+ int[] nbBits = { bpc, bpc, bpc };
+ ComponentColorModel componentColorModel =
+ new ComponentColorModel( createColorSpace(),
+ nbBits,
+ false,
+ false,
+ Transparency.OPAQUE,
+ DataBuffer.TYPE_BYTE );
+
+ return componentColorModel;
+ }
+
+ /**
+ * This will return the number of color components. As of PDF 1.4 this will
+ * be 1,3,4.
+ *
+ * @return The number of components in this color space.
+ *
+ * @throws IOException If there is an error getting the number of color components.
+ */
+ public int getNumberOfComponents() throws IOException
+ {
+ COSNumber n = (COSNumber)stream.getStream().getDictionaryObject( COSName.getPDFName( "N" ) );
+ return n.intValue();
+ }
+
+ /**
+ * This will set the number of color components.
+ *
+ * @param n The number of color components.
+ */
+ public void setNumberOfComponents( int n )
+ {
+ stream.getStream().setItem( COSName.getPDFName( "N" ), new COSInteger( n ) );
+ }
+
+ /**
+ * This will return a list of alternate color spaces(PDColorSpace) if the display application
+ * does not support this icc stream.
+ *
+ * @return A list of alternate color spaces.
+ *
+ * @throws IOException If there is an error getting the alternate color spaces.
+ */
+ public List getAlternateColorSpaces() throws IOException
+ {
+ COSBase alternate = stream.getStream().getDictionaryObject( COSName.getPDFName( "Alternate" ) );
+ COSArray alternateArray = null;
+ if( alternate == null )
+ {
+ alternateArray = new COSArray();
+ int numComponents = getNumberOfComponents();
+ String csName = null;
+ if( numComponents == 1 )
+ {
+ csName = PDDeviceGray.NAME;
+ }
+ else if( numComponents == 3 )
+ {
+ csName = PDDeviceRGB.NAME;
+ }
+ else if( numComponents == 4 )
+ {
+ csName = PDDeviceCMYK.NAME;
+ }
+ else
+ {
+ throw new IOException( "Unknown colorspace number of components:" + numComponents );
+ }
+ alternateArray.add( COSName.getPDFName( csName ) );
+ }
+ else
+ {
+ if( alternate instanceof COSArray )
+ {
+ alternateArray = (COSArray)alternate;
+ }
+ else if( alternate instanceof COSName )
+ {
+ alternateArray = new COSArray();
+ alternateArray.add( alternate );
+ }
+ else
+ {
+ throw new IOException( "Error: expected COSArray or COSName and not " +
+ alternate.getClass().getName() );
+ }
+ }
+ List retval = new ArrayList();
+ for( int i=0; i<alternateArray.size(); i++ )
+ {
+ retval.add( PDColorSpaceFactory.createColorSpace( alternateArray.get( i ) ) );
+ }
+ return new COSArrayList( retval, alternateArray );
+ }
+
+ /**
+ * This will set the list of alternate color spaces. This should be a list
+ * of PDColorSpace objects.
+ *
+ * @param list The list of colorspace objects.
+ */
+ public void setAlternateColorSpaces( List list )
+ {
+ COSArray altArray = null;
+ if( list != null )
+ {
+ altArray = COSArrayList.converterToCOSArray( list );
+ }
+ stream.getStream().setItem( COSName.getPDFName( "Alternate" ), altArray );
+ }
+
+ private COSArray getRangeArray( int n )
+ {
+ COSArray rangeArray = (COSArray)stream.getStream().getDictionaryObject( COSName.getPDFName( "Range" ) );
+ if( rangeArray == null )
+ {
+ rangeArray = new COSArray();
+ stream.getStream().setItem( COSName.getPDFName( "Range" ), rangeArray );
+ while( rangeArray.size() < n*2 )
+ {
+ rangeArray.add( new COSFloat( -100 ) );
+ rangeArray.add( new COSFloat( 100 ) );
+ }
+ }
+ return rangeArray;
+ }
+
+ /**
+ * This will get the range for a certain component number. This is will never
+ * return null. If it is not present then the range -100 to 100 will
+ * be returned.
+ *
+ * @param n The component number to get the range for.
+ *
+ * @return The range for this component.
+ */
+ public PDRange getRangeForComponent( int n )
+ {
+ COSArray rangeArray = getRangeArray( n );
+ return new PDRange( rangeArray, n );
+ }
+
+ /**
+ * This will set the a range for this color space.
+ *
+ * @param range The new range for the a component.
+ * @param n The component to set the range for.
+ */
+ public void setRangeForComponent( PDRange range, int n )
+ {
+ COSArray rangeArray = getRangeArray( n );
+ rangeArray.set( n*2, new COSFloat( range.getMin() ) );
+ rangeArray.set( n*2+1, new COSFloat( range.getMax() ) );
+ }
+
+ /**
+ * This will get the metadata stream for this object. Null if there is no
+ * metadata stream.
+ *
+ * @return The metadata stream, if it exists.
+ */
+ public COSStream getMetadata()
+ {
+ return (COSStream)stream.getStream().getDictionaryObject( COSName.getPDFName( "Metadata" ) );
+ }
+
+ /**
+ * This will set the metadata stream that is associated with this color space.
+ *
+ * @param metadata The new metadata stream.
+ */
+ public void setMetadata( COSStream metadata )
+ {
+ stream.getStream().setItem( COSName.getPDFName( "Metadata" ), metadata );
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/graphics/color/PDIndexed.java b/src/main/java/org/pdfbox/pdmodel/graphics/color/PDIndexed.java
new file mode 100644
index 0000000..cd1d9e7
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/graphics/color/PDIndexed.java
@@ -0,0 +1,271 @@
+/**
+ * Copyright (c) 2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.graphics.color;
+
+import org.pdfbox.cos.COSArray;
+import org.pdfbox.cos.COSBase;
+import org.pdfbox.cos.COSInteger;
+import org.pdfbox.cos.COSName;
+import org.pdfbox.cos.COSNumber;
+import org.pdfbox.cos.COSStream;
+import org.pdfbox.cos.COSString;
+
+import java.awt.color.ColorSpace;
+import java.awt.image.ColorModel;
+import java.awt.image.IndexColorModel;
+
+import java.io.InputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+
+/**
+ * This class represents an Indexed color space.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.3 $
+ */
+public class PDIndexed extends PDColorSpace
+{
+
+ /**
+ * The name of this color space.
+ */
+ public static final String NAME = "Indexed";
+
+ /**
+ * The abbreviated name of this color space.
+ */
+ public static final String ABBREVIATED_NAME = "I";
+
+ private COSArray array;
+
+ /**
+ * Constructor, default DeviceRGB, hival 255.
+ */
+ public PDIndexed()
+ {
+ array = new COSArray();
+ array.add( COSName.getPDFName( NAME ) );
+ array.add( COSName.getPDFName( PDDeviceRGB.NAME ) );
+ array.add( new COSInteger( 255 ) );
+ array.add( org.pdfbox.cos.COSNull.NULL );
+ }
+
+ /**
+ * Constructor.
+ *
+ * @param indexedArray The array containing the indexed parameters
+ */
+ public PDIndexed( COSArray indexedArray )
+ {
+ array = indexedArray;
+ }
+
+ /**
+ * This will return the number of color components. This will return the
+ * number of color components in the base color.
+ *
+ * @return The number of components in this color space.
+ *
+ * @throws IOException If there is an error getting the number of color components.
+ */
+ public int getNumberOfComponents() throws IOException
+ {
+ return getBaseColorSpace().getNumberOfComponents();
+ }
+
+ /**
+ * This will return the name of the color space.
+ *
+ * @return The name of the color space.
+ */
+ public String getName()
+ {
+ return NAME;
+ }
+
+ /**
+ * Create a Java colorspace for this colorspace.
+ *
+ * @return A color space that can be used for Java AWT operations.
+ *
+ * @throws IOException If there is an error creating the color space.
+ */
+ public ColorSpace createColorSpace() throws IOException
+ {
+ throw new IOException( "Not implemented" );
+ }
+
+ /**
+ * Create a Java color model for this colorspace.
+ *
+ * @param bpc The number of bits per component.
+ *
+ * @return A color model that can be used for Java AWT operations.
+ *
+ * @throws IOException If there is an error creating the color model.
+ */
+ public ColorModel createColorModel( int bpc ) throws IOException
+ {
+ int size = getHighValue();
+ byte[] index = getLookupData();
+ //for (int i=0;i<index.length;i++) System.out.print(index[i]+" ");
+
+ ColorModel cm = new IndexColorModel(bpc, size+1, index,0,false);
+ return cm;
+ }
+
+ /**
+ * This will get the color space that acts as the index for this color space.
+ *
+ * @return The base color space.
+ *
+ * @throws IOException If there is error creating the base color space.
+ */
+ public PDColorSpace getBaseColorSpace() throws IOException
+ {
+ PDColorSpace retval = null;
+ COSBase base = array.getObject( 1 );
+ if( base instanceof COSName )
+ {
+ retval = PDColorSpaceFactory.createColorSpace( (COSName)base );
+ }
+ else
+ {
+ throw new IOException( "Error:unknown base colorspace" );
+ }
+
+ return retval;
+ }
+
+ /**
+ * This will set the base color space.
+ *
+ * @param base The base color space to use as the index.
+ */
+ public void setBaseColorSpace( PDColorSpace base )
+ {
+ array.set( 1, base.getCOSObject() );
+ }
+
+ /**
+ * Get the highest value for the lookup.
+ *
+ * @return The hival entry.
+ */
+ public int getHighValue()
+ {
+ return ((COSNumber)array.getObject( 2 )).intValue();
+ }
+
+ /**
+ * This will set the highest value that is allowed. This cannot be higher
+ * than 255.
+ *
+ * @param high The highest value for the lookup table.
+ */
+ public void setHighValue( int high )
+ {
+ array.set( 2, new COSInteger( high ) );
+ }
+
+ /**
+ * This will perform a lookup into the color lookup table.
+ *
+ * @param componentNumber The component number, probably 1,2,3,3.
+ * @param lookupIndex The zero-based index into the table, should not exceed the high value.
+ *
+ * @return The value that was from the lookup table.
+ *
+ * @throws IOException If there is an error looking up the color.
+ */
+ public int lookupColor( int componentNumber, int lookupIndex ) throws IOException
+ {
+ COSBase lookupTable = array.getObject( 3 );
+ PDColorSpace baseColor = getBaseColorSpace();
+ byte[] data = getLookupData();
+ int numberOfComponents = baseColor.getNumberOfComponents();
+ return (data[componentNumber*numberOfComponents + lookupIndex]+256)%256;
+ }
+
+ private byte[] getLookupData() throws IOException
+ {
+ COSBase lookupTable = array.getObject( 3 );
+ byte[] data = null;
+ if( lookupTable instanceof COSString )
+ {
+ data = ((COSString)lookupTable).getBytes();
+ }
+ else if( lookupTable instanceof COSStream )
+ {
+ //Data will be small so just load the whole thing into memory for
+ //easier processing
+ COSStream lookupStream = (COSStream)lookupTable;
+ InputStream input = lookupStream.getUnfilteredStream();
+ ByteArrayOutputStream output = new ByteArrayOutputStream(1024);
+ byte[] buffer = new byte[ 1024 ];
+ int amountRead;
+ while( (amountRead = input.read(buffer, 0, buffer.length)) != -1 )
+ {
+ output.write( buffer, 0, amountRead );
+ }
+ data = output.toByteArray();
+ }
+ else if( lookupTable == null )
+ {
+ data = new byte[0];
+ }
+ else
+ {
+ throw new IOException( "Error: Unknown type for lookup table " + lookupTable );
+ }
+ return data;
+ }
+
+ /**
+ * This will set a color in the color lookup table.
+ *
+ * @param componentNumber The component number, probably 1,2,3,3.
+ * @param lookupIndex The zero-based index into the table, should not exceed the high value.
+ * @param color The color that will go into the table.
+ *
+ * @throws IOException If there is an error looking up the color.
+ */
+ public void setLookupColor( int componentNumber, int lookupIndex, int color ) throws IOException
+ {
+ PDColorSpace baseColor = getBaseColorSpace();
+ int numberOfComponents = baseColor.getNumberOfComponents();
+ byte[] data = getLookupData();
+ data[componentNumber*numberOfComponents + lookupIndex] = (byte)color;
+ COSString string = new COSString( data );
+ array.set( 3, string );
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/graphics/color/PDLab.java b/src/main/java/org/pdfbox/pdmodel/graphics/color/PDLab.java
new file mode 100644
index 0000000..9bd3220
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/graphics/color/PDLab.java
@@ -0,0 +1,300 @@
+/**
+ * Copyright (c) 2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.graphics.color;
+
+import org.pdfbox.cos.COSArray;
+import org.pdfbox.cos.COSBase;
+import org.pdfbox.cos.COSDictionary;
+import org.pdfbox.cos.COSFloat;
+import org.pdfbox.cos.COSName;
+
+import org.pdfbox.pdmodel.common.PDRange;
+
+import java.awt.color.ColorSpace;
+import java.awt.image.ColorModel;
+
+import java.io.IOException;
+
+/**
+ * This class represents a Lab color space.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.2 $
+ */
+public class PDLab extends PDColorSpace
+{
+ /**
+ * The name of this color space.
+ */
+ public static final String NAME = "Lab";
+
+ private COSArray array;
+ private COSDictionary dictionary;
+
+ /**
+ * Constructor.
+ */
+ public PDLab()
+ {
+ array = new COSArray();
+ dictionary = new COSDictionary();
+ array.add( COSName.getPDFName( NAME ) );
+ array.add( dictionary );
+ }
+
+ /**
+ * Constructor with array.
+ *
+ * @param lab The underlying color space.
+ */
+ public PDLab( COSArray lab )
+ {
+ array = lab;
+ dictionary = (COSDictionary)array.getObject( 1 );
+ }
+
+ /**
+ * This will return the name of the color space.
+ *
+ * @return The name of the color space.
+ */
+ public String getName()
+ {
+ return NAME;
+ }
+
+ /**
+ * Convert this standard java object to a COS object.
+ *
+ * @return The cos object that matches this Java object.
+ */
+ public COSBase getCOSObject()
+ {
+ return array;
+ }
+
+ /**
+ * Create a Java colorspace for this colorspace.
+ *
+ * @return A color space that can be used for Java AWT operations.
+ *
+ * @throws IOException If there is an error creating the color space.
+ */
+ public ColorSpace createColorSpace() throws IOException
+ {
+ throw new IOException( "Not implemented" );
+ }
+
+ /**
+ * Create a Java color model for this colorspace.
+ *
+ * @param bpc The number of bits per component.
+ *
+ * @return A color model that can be used for Java AWT operations.
+ *
+ * @throws IOException If there is an error creating the color model.
+ */
+ public ColorModel createColorModel( int bpc ) throws IOException
+ {
+ throw new IOException( "Not implemented" );
+ }
+
+ /**
+ * This will get the number of components that this color space is made up of.
+ *
+ * @return The number of components in this color space.
+ *
+ * @throws IOException If there is an error getting the number of color components.
+ */
+ public int getNumberOfComponents() throws IOException
+ {
+ //BJL
+ //hmm is this correct, I am not 100% sure.
+ return 3;
+ }
+
+ /**
+ * This will return the whitepoint tristimulus. As this is a required field
+ * this will never return null. A default of 1,1,1 will be returned if the
+ * pdf does not have any values yet.
+ *
+ * @return The whitepoint tristimulus.
+ */
+ public PDTristimulus getWhitepoint()
+ {
+ PDTristimulus retval = null;
+ COSArray wp = (COSArray)dictionary.getDictionaryObject( COSName.getPDFName( "WhitePoint" ) );
+ if( wp == null )
+ {
+ wp.add( new COSFloat( 1.0f ) );
+ wp.add( new COSFloat( 1.0f ) );
+ wp.add( new COSFloat( 1.0f ) );
+ dictionary.setItem( COSName.getPDFName( "WhitePoint" ), wp );
+ }
+ return new PDTristimulus( wp );
+ }
+
+ /**
+ * This will set the whitepoint tristimulus. As this is a required field
+ * this null should not be passed into this function.
+ *
+ * @param wp The whitepoint tristimulus.
+ */
+ public void setWhitepoint( PDTristimulus wp )
+ {
+ COSBase wpArray = wp.getCOSObject();
+ if( wpArray != null )
+ {
+ dictionary.setItem( COSName.getPDFName( "WhitePoint" ), wpArray );
+ }
+ }
+
+ /**
+ * This will return the BlackPoint tristimulus. This is an optional field but
+ * has defaults so this will never return null.
+ * A default of 0,0,0 will be returned if the pdf does not have any values yet.
+ *
+ * @return The blackpoint tristimulus.
+ */
+ public PDTristimulus getBlackPoint()
+ {
+ PDTristimulus retval = null;
+ COSArray bp = (COSArray)dictionary.getDictionaryObject( COSName.getPDFName( "BlackPoint" ) );
+ if( bp == null )
+ {
+ bp.add( new COSFloat( 0.0f ) );
+ bp.add( new COSFloat( 0.0f ) );
+ bp.add( new COSFloat( 0.0f ) );
+ dictionary.setItem( COSName.getPDFName( "BlackPoint" ), bp );
+ }
+ return new PDTristimulus( bp );
+ }
+
+ /**
+ * This will set the BlackPoint tristimulus. As this is a required field
+ * this null should not be passed into this function.
+ *
+ * @param bp The BlackPoint tristimulus.
+ */
+ public void setBlackPoint( PDTristimulus bp )
+ {
+
+ COSBase bpArray = null;
+ if( bp != null )
+ {
+ bpArray = bp.getCOSObject();
+ }
+ dictionary.setItem( COSName.getPDFName( "BlackPoint" ), bpArray );
+ }
+
+ private COSArray getRangeArray()
+ {
+ COSArray range = (COSArray)dictionary.getDictionaryObject( COSName.getPDFName( "Range" ) );
+ if( range == null )
+ {
+ range = new COSArray();
+ dictionary.setItem( COSName.getPDFName( "Range" ), array );
+ range.add( new COSFloat( -100 ) );
+ range.add( new COSFloat( 100 ) );
+ range.add( new COSFloat( -100 ) );
+ range.add( new COSFloat( 100 ) );
+ }
+ return range;
+ }
+
+ /**
+ * This will get the valid range for the a component. If none is found
+ * then the default will be returned, which is -100 to 100.
+ *
+ * @return The a range.
+ */
+ public PDRange getARange()
+ {
+ COSArray range = getRangeArray();
+ return new PDRange( range, 0 );
+ }
+
+ /**
+ * This will set the a range for this color space.
+ *
+ * @param range The new range for the a component.
+ */
+ public void setARange( PDRange range )
+ {
+ COSArray rangeArray = null;
+ //if null then reset to defaults
+ if( range == null )
+ {
+ rangeArray = getRangeArray();
+ rangeArray.set( 0, new COSFloat( -100 ) );
+ rangeArray.set( 1, new COSFloat( 100 ) );
+ }
+ else
+ {
+ rangeArray = range.getCOSArray();
+ }
+ dictionary.setItem( COSName.getPDFName( "Range" ), rangeArray );
+ }
+
+ /**
+ * This will get the valid range for the b component. If none is found
+ * then the default will be returned, which is -100 to 100.
+ *
+ * @return The b range.
+ */
+ public PDRange getBRange()
+ {
+ COSArray range = getRangeArray();
+ return new PDRange( range, 2 );
+ }
+
+ /**
+ * This will set the b range for this color space.
+ *
+ * @param range The new range for the b component.
+ */
+ public void setBRange( PDRange range )
+ {
+ COSArray rangeArray = null;
+ //if null then reset to defaults
+ if( range == null )
+ {
+ rangeArray = getRangeArray();
+ rangeArray.set( 2, new COSFloat( -100 ) );
+ rangeArray.set( 3, new COSFloat( 100 ) );
+ }
+ else
+ {
+ rangeArray = range.getCOSArray();
+ }
+ dictionary.setItem( COSName.getPDFName( "Range" ), rangeArray );
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/graphics/color/PDPattern.java b/src/main/java/org/pdfbox/pdmodel/graphics/color/PDPattern.java
new file mode 100644
index 0000000..4c43914
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/graphics/color/PDPattern.java
@@ -0,0 +1,122 @@
+/**
+ * Copyright (c) 2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.graphics.color;
+
+import org.pdfbox.cos.COSArray;
+import org.pdfbox.cos.COSName;
+
+import java.awt.color.ColorSpace;
+import java.awt.image.ColorModel;
+
+import java.io.IOException;
+
+/**
+ * This class represents a Pattern color space.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.3 $
+ */
+public class PDPattern extends PDColorSpace
+{
+ private COSArray array;
+
+ /**
+ * The name of this color space.
+ */
+ public static final String NAME = "Pattern";
+
+ /**
+ * Default constructor.
+ */
+ public PDPattern()
+ {
+ array = new COSArray();
+ array.add( COSName.getPDFName( NAME ) );
+ }
+
+ /**
+ * Constructor.
+ *
+ * @param pattern The pattern array.
+ */
+ public PDPattern( COSArray pattern)
+ {
+ array = pattern;
+ }
+
+ /**
+ * This will return the name of the color space.
+ *
+ * @return The name of the color space.
+ */
+ public String getName()
+ {
+ return NAME;
+ }
+
+ /**
+ * This will get the number of components that this color space is made up of.
+ *
+ * @return The number of components in this color space.
+ *
+ * @throws IOException If there is an error getting the number of color components.
+ */
+ public int getNumberOfComponents() throws IOException
+ {
+ return -1;
+ }
+
+ /**
+ * Create a Java colorspace for this colorspace.
+ *
+ * @return A color space that can be used for Java AWT operations.
+ *
+ * @throws IOException If there is an error creating the color space.
+ */
+ public ColorSpace createColorSpace() throws IOException
+ {
+ throw new IOException( "Not implemented" );
+ }
+
+ /**
+ * Create a Java color model for this colorspace.
+ *
+ * @param bpc The number of bits per component.
+ *
+ * @return A color model that can be used for Java AWT operations.
+ *
+ * @throws IOException If there is an error creating the color model.
+ */
+ public ColorModel createColorModel( int bpc ) throws IOException
+ {
+ throw new IOException( "Not implemented" );
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/graphics/color/PDSeparation.java b/src/main/java/org/pdfbox/pdmodel/graphics/color/PDSeparation.java
new file mode 100644
index 0000000..cc92f6f
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/graphics/color/PDSeparation.java
@@ -0,0 +1,198 @@
+/**
+ * Copyright (c) 2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.graphics.color;
+
+import java.awt.color.ColorSpace;
+import java.awt.image.ColorModel;
+
+import java.io.IOException;
+
+import org.pdfbox.cos.COSArray;
+import org.pdfbox.cos.COSBase;
+import org.pdfbox.cos.COSName;
+
+/**
+ * This class represents a Separation color space.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.2 $
+ */
+public class PDSeparation extends PDColorSpace
+{
+ /**
+ * The name of this color space.
+ */
+ public static final String NAME = "Separation";
+
+ private COSArray array;
+
+ /**
+ * Constructor.
+ */
+ public PDSeparation()
+ {
+ array = new COSArray();
+ array.add( COSName.getPDFName( NAME ) );
+ array.add( COSName.getPDFName( "" ) );
+ }
+
+ /**
+ * Constructor.
+ *
+ * @param separation The array containing all separation information.
+ */
+ public PDSeparation( COSArray separation )
+ {
+ array = separation;
+ }
+
+ /**
+ * This will return the name of the color space. For a PDSeparation object
+ * this will always return "Separation"
+ *
+ * @return The name of the color space.
+ */
+ public String getName()
+ {
+ return NAME;
+ }
+
+ /**
+ * This will get the number of components that this color space is made up of.
+ *
+ * @return The number of components in this color space.
+ *
+ * @throws IOException If there is an error getting the number of color components.
+ */
+ public int getNumberOfComponents() throws IOException
+ {
+ return 1;
+ }
+
+ /**
+ * Create a Java colorspace for this colorspace.
+ *
+ * @return A color space that can be used for Java AWT operations.
+ *
+ * @throws IOException If there is an error creating the color space.
+ */
+ public ColorSpace createColorSpace() throws IOException
+ {
+ throw new IOException( "Not implemented" );
+ }
+
+ /**
+ * Create a Java color model for this colorspace.
+ *
+ * @param bpc The number of bits per component.
+ *
+ * @return A color model that can be used for Java AWT operations.
+ *
+ * @throws IOException If there is an error creating the color model.
+ */
+ public ColorModel createColorModel( int bpc ) throws IOException
+ {
+ throw new IOException( "Not implemented" );
+ }
+
+ /**
+ * This will get the separation name.
+ *
+ * @return The name in the separation.
+ */
+ public String getColorantName()
+ {
+ COSName name = (COSName)array.getObject( 1 );
+ return name.getName();
+ }
+
+ /**
+ * This will set the separation name.
+ *
+ * @param name The separation name.
+ */
+ public void setColorantName( String name )
+ {
+ array.set( 1, COSName.getPDFName( name ) );
+ }
+
+ /**
+ * This will get the alternate color space for this separation.
+ *
+ * @return The alternate color space.
+ *
+ * @throws IOException If there is an error getting the alternate color space.
+ */
+ public PDColorSpace getAlternateColorSpace() throws IOException
+ {
+ COSBase alternate = array.getObject( 2 );
+ return PDColorSpaceFactory.createColorSpace( alternate );
+ }
+
+ /**
+ * This will set the alternate color space.
+ *
+ * @param cs The alternate color space.
+ */
+ public void setAlternateColorSpace( PDColorSpace cs )
+ {
+ COSBase space = null;
+ if( cs != null )
+ {
+ space = cs.getCOSObject();
+ }
+ array.set( 2, space );
+ }
+
+ /**
+ * This will get the tint transform function. At this time the PDModel
+ * does not support functions so we will just return the COSBase object. This
+ * method will change in the future to be a PDModel object.
+ *
+ * @return The tint transform function.
+ */
+ public COSBase getTintTransform()
+ {
+ return array.get( 3 );
+ }
+
+ /**
+ * This will set the tint transform function. At this time the PDModel
+ * does not support functions so we will just return the COSBase object. This
+ * method will change in the future to be a PDModel object.
+ *
+ * @param tint The tint transform function.
+ */
+ public void setTintTransform( COSBase tint )
+ {
+ array.set( 3, tint );
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/graphics/color/PDTristimulus.java b/src/main/java/org/pdfbox/pdmodel/graphics/color/PDTristimulus.java
new file mode 100644
index 0000000..296b147
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/graphics/color/PDTristimulus.java
@@ -0,0 +1,155 @@
+/**
+ * Copyright (c) 2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.graphics.color;
+
+import org.pdfbox.cos.COSArray;
+import org.pdfbox.cos.COSBase;
+import org.pdfbox.cos.COSFloat;
+import org.pdfbox.cos.COSNumber;
+
+import org.pdfbox.pdmodel.common.COSObjectable;
+
+/**
+ * A tristimulus, or collection of three floating point parameters used for
+ * color operations.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.1 $
+ */
+public class PDTristimulus implements COSObjectable
+{
+ private COSArray values = null;
+
+ /**
+ * Constructor. Defaults all values to 0, 0, 0.
+ */
+ public PDTristimulus()
+ {
+ values = new COSArray();
+ values.add( new COSFloat( 0.0f ) );
+ values.add( new COSFloat( 0.0f ) );
+ values.add( new COSFloat( 0.0f ) );
+ }
+
+ /**
+ * Constructor from COS object.
+ *
+ * @param array The array containing the XYZ values.
+ */
+ public PDTristimulus( COSArray array )
+ {
+ values = array;
+ }
+
+ /**
+ * Constructor from COS object.
+ *
+ * @param array The array containing the XYZ values.
+ */
+ public PDTristimulus( float[] array )
+ {
+ values = new COSArray();
+ for( int i=0; i<array.length && i<3; i++ )
+ {
+ values.add( new COSFloat( array[i] ) );
+ }
+ }
+
+ /**
+ * Convert this standard java object to a COS object.
+ *
+ * @return The cos object that matches this Java object.
+ */
+ public COSBase getCOSObject()
+ {
+ return values;
+ }
+
+ /**
+ * This will get the x value of the tristimulus.
+ *
+ * @return The X value.
+ */
+ public float getX()
+ {
+ return ((COSNumber)values.get( 0 )).floatValue();
+ }
+
+ /**
+ * This will set the x value of the tristimulus.
+ *
+ * @param x The x value for the tristimulus.
+ */
+ public void setX( float x )
+ {
+ values.set( 0, new COSFloat( x ) );
+ }
+
+ /**
+ * This will get the y value of the tristimulus.
+ *
+ * @return The Y value.
+ */
+ public float getY()
+ {
+ return ((COSNumber)values.get( 1 )).floatValue();
+ }
+
+ /**
+ * This will set the y value of the tristimulus.
+ *
+ * @param y The y value for the tristimulus.
+ */
+ public void setY( float y )
+ {
+ values.set( 1, new COSFloat( y ) );
+ }
+
+ /**
+ * This will get the z value of the tristimulus.
+ *
+ * @return The Z value.
+ */
+ public float getZ()
+ {
+ return ((COSNumber)values.get( 2 )).floatValue();
+ }
+
+ /**
+ * This will set the z value of the tristimulus.
+ *
+ * @param z The z value for the tristimulus.
+ */
+ public void setZ( float z )
+ {
+ values.set( 2, new COSFloat( z ) );
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/graphics/color/package.html b/src/main/java/org/pdfbox/pdmodel/graphics/color/package.html
new file mode 100644
index 0000000..733efff
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/graphics/color/package.html
@@ -0,0 +1,9 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head>
+
+</head>
+<body>
+This package deals with colors that are stored in a PDF document.
+</body>
+</html> \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/graphics/package.html b/src/main/java/org/pdfbox/pdmodel/graphics/package.html
new file mode 100644
index 0000000..3c1f7ca
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/graphics/package.html
@@ -0,0 +1,9 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head>
+
+</head>
+<body>
+The PDModel graphics package deals with graphics states, operations, and parameters within the PDF document.
+</body>
+</html>
diff --git a/src/main/java/org/pdfbox/pdmodel/graphics/predictor/Average.java b/src/main/java/org/pdfbox/pdmodel/graphics/predictor/Average.java
new file mode 100644
index 0000000..46e65dc
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/graphics/predictor/Average.java
@@ -0,0 +1,81 @@
+/**
+ * Copyright (c) 2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.graphics.predictor;
+
+/**
+ * We can use raw on the right hand side of
+ * the decoding formula because it is already decoded.
+ *
+ * <code>average(i,j) = raw(i,j) + (raw(i-1,j)+raw(i,j-1)/2</code>
+ *
+ * decoding
+ *
+ * <code>raw(i,j) = avarage(i,j) - (raw(i-1,j)+raw(i,j-1)/2</code>
+ *
+ * @author xylifyx@yahoo.co.uk
+ * @version $Revision: 1.2 $
+ */
+public class Average extends PredictorAlgorithm
+{
+ /**
+ * Not an optimal version, but close to the def.
+ *
+ * @see org.pdfbox.pdmodel.graphics.predictor.PredictorAlgorithm#encodeLine(byte[], byte[],
+ * int, int, int, int)
+ */
+ public void encodeLine(byte[] src, byte[] dest, int srcDy, int srcOffset,
+ int destDy, int destOffset)
+ {
+ int bpl = getWidth() * getBpp();
+ for (int x = 0; x < bpl; x++)
+ {
+ dest[x + destOffset] = (byte) (src[x + srcOffset] - ((leftPixel(
+ src, srcOffset, srcDy, x) + abovePixel(src, srcOffset,
+ srcDy, x)) >>> 2));
+ }
+ }
+
+ /**
+ * @see org.pdfbox.pdmodel.graphics.predictor.PredictorAlgorithm#decodeLine(byte[], byte[],
+ * int, int, int, int)
+ */
+ public void decodeLine(byte[] src, byte[] dest, int srcDy, int srcOffset,
+ int destDy, int destOffset)
+ {
+ int bpl = getWidth() * getBpp();
+ for (int x = 0; x < bpl; x++)
+ {
+ dest[x + destOffset] = (byte) (src[x + srcOffset] + ((leftPixel(
+ dest, destOffset, destDy, x) + abovePixel(dest,
+ destOffset, destDy, x)) >>> 2));
+ }
+ }
+}
diff --git a/src/main/java/org/pdfbox/pdmodel/graphics/predictor/None.java b/src/main/java/org/pdfbox/pdmodel/graphics/predictor/None.java
new file mode 100644
index 0000000..20ec815
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/graphics/predictor/None.java
@@ -0,0 +1,104 @@
+/**
+ * Copyright (c) 2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.graphics.predictor;
+
+/**
+ * The none algorithm.
+ *
+ * <code>None(i,j) = Raw(i,j)</code>
+ *
+ * <code>Raw(i,j) = None(i,j)</code>
+ *
+ * @author xylifyx@yahoo.co.uk
+ * @version $Revision: 1.2 $
+ */
+public class None extends PredictorAlgorithm
+{
+ /**
+ * encode a byte array full of image data using the filter that this object
+ * implements.
+ *
+ * @param src
+ * buffer
+ * @param dest
+ * buffer
+ */
+ public void encode(byte[] src, byte[] dest)
+ {
+ checkBufsiz(dest, src);
+ System.arraycopy(src,0,dest,0,src.length);
+ }
+
+ /**
+ * decode a byte array full of image data using the filter that this object
+ * implements.
+ *
+ * @param src
+ * buffer
+ * @param dest
+ * buffer
+ */
+ public void decode(byte[] src, byte[] dest)
+ {
+ System.arraycopy(src,0,dest,0,src.length);
+ }
+
+
+
+ /**
+ * @see org.pdfbox.pdmodel.graphics.predictor.PredictorAlgorithm#encodeLine(byte[], byte[],
+ * int, int, int, int)
+ */
+ public void encodeLine(byte[] src, byte[] dest, int srcDy, int srcOffset,
+ int destDy, int destOffset)
+ {
+ int bpl = getWidth() * getBpp();
+ for (int x = 0; x < bpl; x++)
+ {
+ dest[destOffset + x] = src[srcOffset + x];
+ }
+ }
+
+ /**
+ * @see org.pdfbox.pdmodel.graphics.predictor.PredictorAlgorithm#decodeLine(byte[], byte[],
+ * int, int, int, int)
+ */
+ public void decodeLine(byte[] src, byte[] dest, int srcDy, int srcOffset,
+ int destDy, int destOffset)
+ {
+ int bpl = getWidth() * getBpp();
+ for (int x = 0; x < bpl; x++)
+ {
+ dest[destOffset + x] = src[srcOffset + x];
+ }
+ }
+
+}
diff --git a/src/main/java/org/pdfbox/pdmodel/graphics/predictor/Paeth.java b/src/main/java/org/pdfbox/pdmodel/graphics/predictor/Paeth.java
new file mode 100644
index 0000000..1fddef0
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/graphics/predictor/Paeth.java
@@ -0,0 +1,121 @@
+/**
+ * Copyright (c) 2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ */
+package org.pdfbox.pdmodel.graphics.predictor;
+
+/**
+ * From http://www.w3.org/TR/PNG-Filters.html: The Paeth filter computes a
+ * simple linear function of the three neighboring pixels (left, above, upper
+ * left), then chooses as predictor the neighboring pixel closest to the
+ * computed value. This technique is due to Alan W. Paeth [PAETH].
+ *
+ * To compute the Paeth filter, apply the following formula to each byte of the
+ * scanline:
+ *
+ * <code>Paeth(i,j) = Raw(i,j) - PaethPredictor(Raw(i-1,j), Raw(i,j-1), Raw(i-1,j-1))</code>
+ *
+ * To decode the Paeth filter
+ *
+ * <code>Raw(i,j) = Paeth(i,j) - PaethPredictor(Raw(i-1,j), Raw(i,j-1), Raw(i-1,j-1))</code>
+ *
+ * @author xylifyx@yahoo.co.uk
+ * @version $Revision: 1.2 $
+ */
+public class Paeth extends PredictorAlgorithm
+{
+ /**
+ * The paeth predictor function.
+ *
+ * This function is taken almost directly from the PNG definition on
+ * http://www.w3.org/TR/PNG-Filters.html
+ *
+ * @param a
+ * left
+ * @param b
+ * above
+ * @param c
+ * upper left
+ * @return The result of the paeth predictor.
+ */
+ public int paethPredictor(int a, int b, int c)
+ {
+ int p = a + b - c; // initial estimate
+ int pa = Math.abs(p - a); // distances to a, b, c
+ int pb = Math.abs(p - b);
+ int pc = Math.abs(p - c);
+ // return nearest of a,b,c,
+ // breaking ties in order a,b,c.
+ if (pa <= pb && pa <= pc)
+ {
+ return a;
+ }
+ else if (pb <= pc)
+ {
+ return b;
+ }
+ else
+ {
+ return c;
+ }
+ }
+
+ /**
+ * @see org.pdfbox.pdmodel.graphics.predictor.PredictorAlgorithm#encodeLine(byte[], byte[],
+ * int, int, int, int)
+ */
+ public void encodeLine(byte[] src, byte[] dest, int srcDy, int srcOffset,
+ int destDy, int destOffset)
+ {
+ int bpl = getWidth() * getBpp();
+ for (int x = 0; x < bpl; x++)
+ {
+ dest[x + destOffset] = (byte) (src[x + srcOffset] - paethPredictor(
+ leftPixel(src, srcOffset, srcDy, x), abovePixel(src,
+ srcOffset, srcDy, x), aboveLeftPixel(src,
+ srcOffset, srcDy, x)));
+ }
+ }
+
+ /**
+ * @see org.pdfbox.pdmodel.graphics.predictor.PredictorAlgorithm#decodeLine(byte[], byte[],
+ * int, int, int, int)
+ */
+ public void decodeLine(byte[] src, byte[] dest, int srcDy, int srcOffset,
+ int destDy, int destOffset)
+ {
+ int bpl = getWidth() * getBpp();
+ for (int x = 0; x < bpl; x++)
+ {
+ dest[x + destOffset] = (byte) (src[x + srcOffset] + paethPredictor(
+ leftPixel(dest, destOffset, destDy, x), abovePixel(dest,
+ destOffset, destDy, x), aboveLeftPixel(dest,
+ destOffset, destDy, x)));
+ }
+ }
+}
diff --git a/src/main/java/org/pdfbox/pdmodel/graphics/predictor/PredictorAlgorithm.java b/src/main/java/org/pdfbox/pdmodel/graphics/predictor/PredictorAlgorithm.java
new file mode 100644
index 0000000..11f60f9
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/graphics/predictor/PredictorAlgorithm.java
@@ -0,0 +1,336 @@
+/**
+ * Copyright (c) 2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.graphics.predictor;
+
+import java.util.Random;
+
+/**
+ * Implements different PNG predictor algorithms that is used in PDF files.
+ *
+ * @author xylifyx@yahoo.co.uk
+ * @version $Revision: 1.2 $
+ * @see http://www.w3.org/TR/PNG-Filters.html
+ */
+public abstract class PredictorAlgorithm
+{
+ private int width;
+
+ private int height;
+
+ private int bpp;
+
+ /**
+ * check that buffer sizes matches width,height,bpp. This implementation is
+ * used by most of the filters, but not Uptimum.
+ *
+ * @param src The source buffer.
+ * @param dest The destination buffer.
+ */
+ public void checkBufsiz(byte[] src, byte[] dest)
+ {
+ if (src.length != dest.length)
+ {
+ throw new IllegalArgumentException("src.length != dest.length");
+ }
+ if (src.length != getWidth() * getHeight() * getBpp())
+ {
+ throw new IllegalArgumentException(
+ "src.length != width * height * bpp");
+ }
+ }
+
+ /**
+ * encode line of pixel data in src from srcOffset and width*bpp bytes
+ * forward, put the decoded bytes into dest.
+ *
+ * @param src
+ * raw image data
+ * @param dest
+ * encoded data
+ * @param srcDy
+ * byte offset between lines
+ * @param srcOffset
+ * beginning of line data
+ * @param destDy
+ * byte offset between lines
+ * @param destOffset
+ * beginning of line data
+ */
+ public abstract void encodeLine(byte[] src, byte[] dest, int srcDy,
+ int srcOffset, int destDy, int destOffset);
+
+ /**
+ * decode line of pixel data in src from src_offset and width*bpp bytes
+ * forward, put the decoded bytes into dest.
+ *
+ * @param src
+ * encoded image data
+ * @param dest
+ * raw data
+ * @param srcDy
+ * byte offset between lines
+ * @param srcOffset
+ * beginning of line data
+ * @param destDy
+ * byte offset between lines
+ * @param destOffset
+ * beginning of line data
+ */
+ public abstract void decodeLine(byte[] src, byte[] dest, int srcDy,
+ int srcOffset, int destDy, int destOffset);
+
+ /**
+ * Simple command line program to test the algorithm.
+ *
+ * @param args The command line arguments.
+ */
+ public static void main(String[] args)
+ {
+ Random rnd = new Random();
+ int width = 5;
+ int height = 5;
+ int bpp = 3;
+ byte[] raw = new byte[width * height * bpp];
+ rnd.nextBytes(raw);
+ System.out.println("raw: ");
+ dump(raw);
+ for (int i = 10; i < 15; i++)
+ {
+ byte[] decoded = new byte[width * height * bpp];
+ byte[] encoded = new byte[width * height * bpp];
+
+ PredictorAlgorithm filter = PredictorAlgorithm.getFilter(i);
+ filter.setWidth(width);
+ filter.setHeight(height);
+ filter.setBpp(bpp);
+ filter.encode(raw, encoded);
+ filter.decode(encoded, decoded);
+ System.out.println(filter.getClass().getName());
+ dump(decoded);
+ }
+ }
+
+ /**
+ * Get the left pixel from the buffer.
+ *
+ * @param buf The buffer.
+ * @param offset The offset into the buffer.
+ * @param dy The dy value.
+ * @param x The x value.
+ *
+ * @return The left pixel.
+ */
+ public int leftPixel(byte[] buf, int offset, int dy, int x)
+ {
+ return x >= getBpp() ? buf[offset + x - getBpp()] : 0;
+ }
+
+ /**
+ * Get the above pixel from the buffer.
+ *
+ * @param buf The buffer.
+ * @param offset The offset into the buffer.
+ * @param dy The dy value.
+ * @param x The x value.
+ *
+ * @return The above pixel.
+ */
+ public int abovePixel(byte[] buf, int offset, int dy, int x)
+ {
+ return offset >= dy ? buf[offset + x - dy] : 0;
+ }
+
+ /**
+ * Get the above-left pixel from the buffer.
+ *
+ * @param buf The buffer.
+ * @param offset The offset into the buffer.
+ * @param dy The dy value.
+ * @param x The x value.
+ *
+ * @return The above-left pixel.
+ */
+ public int aboveLeftPixel(byte[] buf, int offset, int dy, int x)
+ {
+ return offset >= dy && x >= getBpp() ? buf[offset + x - dy - getBpp()]
+ : 0;
+ }
+
+ /**
+ * Simple helper to print out a buffer.
+ *
+ * @param raw The bytes to print out.
+ */
+ private static void dump(byte[] raw)
+ {
+ for (int i = 0; i < raw.length; i++)
+ {
+ System.out.print(raw[i] + " ");
+ }
+ System.out.println();
+ }
+
+ /**
+ * @return Returns the bpp.
+ */
+ public int getBpp()
+ {
+ return bpp;
+ }
+
+ /**
+ * @param newBpp
+ * The bpp to set.
+ */
+ public void setBpp(int newBpp)
+ {
+ bpp = newBpp;
+ }
+
+ /**
+ * @return Returns the height.
+ */
+ public int getHeight()
+ {
+ return height;
+ }
+
+ /**
+ * @param newHeight
+ * The height to set.
+ */
+ public void setHeight(int newHeight)
+ {
+ height = newHeight;
+ }
+
+ /**
+ * @return Returns the width.
+ */
+ public int getWidth()
+ {
+ return width;
+ }
+
+ /**
+ * @param newWidth
+ * The width to set.
+ */
+ public void setWidth(int newWidth)
+ {
+ this.width = newWidth;
+ }
+
+
+ /**
+ * encode a byte array full of image data using the filter that this object
+ * implements.
+ *
+ * @param src
+ * buffer
+ * @param dest
+ * buffer
+ */
+ public void encode(byte[] src, byte[] dest)
+ {
+ checkBufsiz(dest, src);
+ int dy = getWidth()*getBpp();
+ for (int y = 0; y < height; y++)
+ {
+ int yoffset = y * dy;
+ encodeLine(src, dest, dy, yoffset, dy, yoffset);
+ }
+ }
+
+ /**
+ * decode a byte array full of image data using the filter that this object
+ * implements.
+ *
+ * @param src
+ * buffer
+ * @param dest
+ * buffer
+ */
+ public void decode(byte[] src, byte[] dest)
+ {
+ checkBufsiz(src, dest);
+ int dy = width * bpp;
+ for (int y = 0; y < height; y++)
+ {
+ int yoffset = y * dy;
+ decodeLine(src, dest, dy, yoffset, dy, yoffset);
+ }
+ }
+
+ /**
+ * @param predictor
+ * <ul>
+ * <li>1 No prediction (the default value)
+ * <li>2 TIFF Predictor 2
+ * <li>10 PNG prediction (on encoding, PNG None on all rows)
+ * <li>11 PNG prediction (on encoding, PNG Sub on all rows)
+ * <li>12 PNG prediction (on encoding, PNG Up on all rows)
+ * <li>13 PNG prediction (on encoding, PNG Average on all rows)
+ * <li>14 PNG prediction (on encoding, PNG Paeth on all rows)
+ * <li>15 PNG prediction (on encoding, PNG optimum)
+ * </ul>
+ *
+ * @return The predictor class based on the predictor code.
+ */
+ public static PredictorAlgorithm getFilter(int predictor)
+ {
+ PredictorAlgorithm filter;
+ switch (predictor)
+ {
+ case 10:
+ filter = new None();
+ break;
+ case 11:
+ filter = new Sub();
+ break;
+ case 12:
+ filter = new Up();
+ break;
+ case 13:
+ filter = new Average();
+ break;
+ case 14:
+ filter = new Paeth();
+ break;
+ case 15:
+ filter = new Uptimum();
+ break;
+ default:
+ filter = new None();
+ }
+ return filter;
+ }
+}
diff --git a/src/main/java/org/pdfbox/pdmodel/graphics/predictor/Sub.java b/src/main/java/org/pdfbox/pdmodel/graphics/predictor/Sub.java
new file mode 100644
index 0000000..3959dbe
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/graphics/predictor/Sub.java
@@ -0,0 +1,86 @@
+/**
+ * Copyright (c) 2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.graphics.predictor;
+
+/**
+ * The sub algorithm.
+ *
+ * <code>Sub(i,j) = Raw(i,j) - Raw(i-1,j)</code>
+ *
+ * <code>Raw(i,j) = Sub(i,j) + Raw(i-1,j)</code>
+ *
+ * @author xylifyx@yahoo.co.uk
+ * @version $Revision: 1.2 $
+ */
+public class Sub extends PredictorAlgorithm
+{
+ /**
+ * @see org.pdfbox.pdmodel.graphics.predictor.PredictorAlgorithm#encodeLine(byte[], byte[], int, int, int, int)
+ */
+ public void encodeLine(byte[] src, byte[] dest, int srcDy, int srcOffset,
+ int destDy, int destOffset)
+ {
+ int bpl = getWidth()*getBpp();
+ int bpp = getBpp();
+ // case: x < bpp
+ for (int x = 0; x < bpl && x < bpp; x++)
+ {
+ dest[x + destOffset] = src[x + srcOffset];
+ }
+ // otherwise
+ for (int x = getBpp(); x < bpl; x++)
+ {
+ dest[x + destOffset] = (byte) (src[x + srcOffset] - src[x
+ + srcOffset - bpp]);
+ }
+ }
+
+ /**
+ * @see org.pdfbox.pdmodel.graphics.predictor.PredictorAlgorithm#decodeLine(byte[], byte[], int, int, int, int)
+ */
+ public void decodeLine(byte[] src, byte[] dest, int srcDy, int srcOffset,
+ int destDy, int destOffset)
+ {
+ int bpl = getWidth()*getBpp();
+ int bpp = getBpp();
+ // case: x < bpp
+ for (int x = 0; x < bpl && x < bpp; x++)
+ {
+ dest[x + destOffset] = src[x + srcOffset];
+ }
+ // otherwise
+ for (int x = getBpp(); x < bpl; x++)
+ {
+ dest[x + destOffset] = (byte) (src[x + srcOffset] + dest[x
+ + destOffset - bpp]);
+ }
+ }
+}
diff --git a/src/main/java/org/pdfbox/pdmodel/graphics/predictor/Up.java b/src/main/java/org/pdfbox/pdmodel/graphics/predictor/Up.java
new file mode 100644
index 0000000..f1932b4
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/graphics/predictor/Up.java
@@ -0,0 +1,100 @@
+/**
+ * Copyright (c) 2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.graphics.predictor;
+
+/**
+ * The up algorithm.
+ *
+ * <code>Up(i,j) = Raw(i,j) - Raw(i,j-1)</code>
+ *
+ * <code>Raw(i,j) = Up(i,j) + Raw(i,j-1)</code>
+ *
+ * @author xylifyx@yahoo.co.uk
+ * @version $Revision: 1.2 $
+ */
+public class Up extends PredictorAlgorithm
+{
+ /**
+ * @see org.pdfbox.pdmodel.graphics.predictor.PredictorAlgorithm#encodeLine(byte[], byte[], int, int, int, int)
+ */
+ public void encodeLine(byte[] src, byte[] dest, int srcDy, int srcOffset,
+ int destDy, int destOffset)
+ {
+ int bpl = getWidth()*getBpp();
+ // case: y = 0;
+ if (srcOffset - srcDy < 0)
+ {
+ if (0 < getHeight())
+ {
+ for (int x = 0; x < bpl; x++)
+ {
+ dest[destOffset + x] = src[srcOffset + x];
+ }
+ }
+ }
+ else
+ {
+ for (int x = 0; x < bpl; x++)
+ {
+ dest[destOffset + x] = (byte) (src[srcOffset + x] - src[srcOffset
+ + x - srcDy]);
+ }
+ }
+ }
+
+ /**
+ * @see org.pdfbox.pdmodel.graphics.predictor.PredictorAlgorithm#decodeLine(byte[], byte[], int, int, int, int)
+ */
+ public void decodeLine(byte[] src, byte[] dest, int srcDy, int srcOffset,
+ int destDy, int destOffset)
+ {
+ // case: y = 0;
+ int bpl = getWidth()*getBpp();
+ if (destOffset - destDy < 0)
+ {
+ if (0 < getHeight())
+ {
+ for (int x = 0; x < bpl; x++)
+ {
+ dest[destOffset + x] = src[srcOffset + x];
+ }
+ }
+ }
+ else
+ {
+ for (int x = 0; x < bpl; x++)
+ {
+ dest[destOffset + x] = (byte) (src[srcOffset + x] + dest[destOffset
+ + x - destDy]);
+ }
+ }
+ }
+}
diff --git a/src/main/java/org/pdfbox/pdmodel/graphics/predictor/Uptimum.java b/src/main/java/org/pdfbox/pdmodel/graphics/predictor/Uptimum.java
new file mode 100644
index 0000000..ac03162
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/graphics/predictor/Uptimum.java
@@ -0,0 +1,153 @@
+/**
+ * Copyright (c) 2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.graphics.predictor;
+
+/**
+ *
+ *
+ * In an Uptimum encoded image, each line takes up width*bpp+1 bytes. The first
+ * byte holds a number that signifies which algorithm encoded the line.
+ *
+ * @author xylifyx@yahoo.co.uk
+ * @version $Revision: 1.2 $
+ */
+public class Uptimum extends PredictorAlgorithm
+{
+ /**
+ * @see PredictorAlgorithm#checkBufsiz(byte[], byte[])
+ */
+ public void checkBufsiz(byte[] filtered, byte[] raw)
+ {
+ if (filtered.length != (getWidth() * getBpp() + 1) * getHeight())
+ {
+
+ throw new IllegalArgumentException(
+ "filtered.length != (width*bpp + 1) * height, "
+ + filtered.length + " "
+ + (getWidth() * getBpp() + 1) * getHeight()
+ + "w,h,bpp=" + getWidth() + "," + getHeight() + ","
+ + getBpp());
+ }
+ if (raw.length != getWidth() * getHeight() * getBpp())
+ {
+ throw new IllegalArgumentException(
+ "raw.length != width * height * bpp, raw.length="
+ + raw.length + " w,h,bpp=" + getWidth() + ","
+ + getHeight() + "," + getBpp());
+ }
+ }
+
+ /**
+ * @see org.pdfbox.pdmodel.graphics.predictor.PredictorAlgorithm#encodeLine(byte[], byte[],
+ * int, int, int, int)
+ */
+ public void encodeLine(byte[] src, byte[] dest, int srcDy, int srcOffset,
+ int destDy, int destOffset)
+ {
+ throw new UnsupportedOperationException("encodeLine");
+ }
+
+ /**
+ * @see org.pdfbox.pdmodel.graphics.predictor.PredictorAlgorithm#decodeLine(byte[], byte[],
+ * int, int, int, int)
+ */
+ public void decodeLine(byte[] src, byte[] dest, int srcDy, int srcOffset,
+ int destDy, int destOffset)
+ {
+ throw new UnsupportedOperationException("decodeLine");
+ }
+
+ /**
+ * @see PredictorAlgorithm#encode(byte[], byte[])
+ */
+ public void encode(byte[] src, byte[] dest)
+ {
+ checkBufsiz(dest, src);
+ throw new UnsupportedOperationException("encode");
+ }
+
+ /**
+ * filter indexed by byte code.
+ */
+ PredictorAlgorithm[] filter = { new None(), new Sub(), new Up(), new Average(),
+ new Paeth() };
+
+ /**
+ * @see org.pdfbox.pdmodel.graphics.predictor.PredictorAlgorithm#setBpp(int)
+ */
+ public void setBpp(int bpp)
+ {
+ super.setBpp(bpp);
+ for (int i = 0; i < filter.length; i++)
+ {
+ filter[i].setBpp(bpp);
+ }
+ }
+ /**
+ * @see org.pdfbox.pdmodel.graphics.predictor.PredictorAlgorithm#setHeight(int)
+ */
+ public void setHeight(int height)
+ {
+ super.setHeight(height);
+ for (int i = 0; i < filter.length; i++)
+ {
+ filter[i].setHeight(height);
+ }
+ }
+
+ /**
+ * @see org.pdfbox.pdmodel.graphics.predictor.PredictorAlgorithm#setWidth(int)
+ */
+ public void setWidth(int width)
+ {
+ super.setWidth(width);
+ for (int i = 0; i < filter.length; i++)
+ {
+ filter[i].setWidth(width);
+ }
+ }
+
+ /**
+ * @see PredictorAlgorithm#decode(byte[], byte[])
+ */
+ public void decode(byte[] src, byte[] dest)
+ {
+ checkBufsiz(src, dest);
+ int bpl = getWidth() * getBpp();
+ int srcDy = bpl + 1;
+ for (int y = 0; y < getHeight(); y++)
+ {
+ PredictorAlgorithm f = filter[src[y * srcDy]];
+ int srcOffset = y * srcDy + 1;
+ f.decodeLine(src, dest, srcDy, srcOffset, bpl, y * bpl);
+ }
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/graphics/predictor/package.html b/src/main/java/org/pdfbox/pdmodel/graphics/predictor/package.html
new file mode 100644
index 0000000..127d2e0
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/graphics/predictor/package.html
@@ -0,0 +1,10 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head>
+
+</head>
+<body>
+The predictor package contains code for different PNG predictor algorithms that
+are present in PDF documents. These classes are used internally by PDFBox.
+</body>
+</html>
diff --git a/src/main/java/org/pdfbox/pdmodel/graphics/xobject/PDCcitt.java b/src/main/java/org/pdfbox/pdmodel/graphics/xobject/PDCcitt.java
new file mode 100644
index 0000000..59387a0
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/graphics/xobject/PDCcitt.java
@@ -0,0 +1,598 @@
+/**
+ * Copyright (c) 2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.graphics.xobject;
+
+import java.awt.image.BufferedImage;
+import java.io.InputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.RandomAccessFile;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.imageio.ImageIO;
+
+import org.pdfbox.cos.COSDictionary;
+import org.pdfbox.cos.COSName;
+
+import org.pdfbox.pdmodel.PDDocument;
+import org.pdfbox.pdmodel.common.PDStream;
+import org.pdfbox.pdmodel.graphics.color.PDDeviceGray;
+
+/**
+ * An image class for CCITT Fax.
+ *
+ * @author paul king
+ * @version $Revision: 1.2 $
+ */
+public class PDCcitt extends PDXObjectImage
+{
+ private static final List FAX_FILTERS = new ArrayList();
+
+ static
+ {
+ FAX_FILTERS.add( COSName.CCITTFAX_DECODE.getName() );
+ FAX_FILTERS.add( COSName.CCITTFAX_DECODE_ABBREVIATION.getName() );
+ }
+
+ /**
+ * Standard constructor.
+ *
+ * @param ccitt The PDStream that already contains all ccitt information.
+ */
+ public PDCcitt(PDStream ccitt)
+ {
+ super(ccitt, "tiff");
+
+ }
+
+ /**
+ * Construct from a tiff file.
+ *
+ * @param doc The document to create the image as part of.
+ * @param raf The random access TIFF file which contains a suitable CCITT compressed image
+ * @throws IOException If there is an error reading the tiff data.
+ */
+
+ public PDCcitt( PDDocument doc, java.io.RandomAccessFile raf ) throws IOException
+ {
+ super( new PDStream(doc),"tiff");
+ // super( new PDStream( doc, null, true ), "tiff" );
+
+ COSDictionary decodeParms = new COSDictionary();
+
+ COSDictionary dic = getCOSStream();
+
+ extractFromTiff(raf, getCOSStream().createFilteredStream(),decodeParms);
+
+ dic.setItem( COSName.FILTER, COSName.CCITTFAX_DECODE);
+ dic.setItem( COSName.SUBTYPE, COSName.IMAGE);
+ dic.setItem( COSName.TYPE, COSName.getPDFName( "XObject" ) );
+ dic.setItem( "DecodeParms", decodeParms);
+
+ setBitsPerComponent( 1 );
+ setColorSpace( new PDDeviceGray() );
+ setWidth( decodeParms.getInt("Columns") );
+ setHeight( decodeParms.getInt("Rows") );
+
+ }
+
+ /**
+ * Returns an image of the CCITT Fax, or null if TIFFs are not supported. (Requires additional JAI Image filters )
+ * @see org.pdfbox.pdmodel.graphics.xobject.PDXObjectImage#getRGBImage()
+ */
+ public BufferedImage getRGBImage() throws IOException
+ {
+ // ImageIO.scanForPlugins();
+ return ImageIO.read(new TiffWrapper(getPDStream().getPartiallyFilteredStream( FAX_FILTERS ),getCOSStream()));
+ }
+
+ /**
+ * This writes a tiff to out.
+ * @see org.pdfbox.pdmodel.graphics.xobject.PDXObjectImage#write2OutputStream(java.io.OutputStream)
+ */
+ public void write2OutputStream(OutputStream out) throws IOException
+ {
+ InputStream data = new TiffWrapper(getPDStream().getPartiallyFilteredStream( FAX_FILTERS ),getCOSStream());
+ byte[] buf = new byte[1024];
+ int amountRead = -1;
+ while( (amountRead = data.read( buf )) != -1 )
+ {
+ out.write( buf, 0, amountRead );
+ }
+ }
+
+ /**
+ * Extract the ccitt stream from the tiff file.
+ *
+ * @param raf - TIFF File
+ * @param os - Stream to write raw ccitt data two
+ * @param parms - COSDictionary which the encoding parameters are added to
+ * @throws IOException If there is an error reading/writing to/from the stream
+ */
+ private void extractFromTiff(RandomAccessFile raf, OutputStream os, COSDictionary parms) throws IOException
+ {
+ try
+ {
+
+ // First check the basic tiff header
+ raf.seek(0);
+ char endianess = (char) raf.read();
+ if ((char) raf.read() != endianess)
+ {
+ throw new IOException("Not a valid tiff file");
+ }
+ //ensure that endianess is either M or I
+ if (endianess != 'M' && endianess != 'I')
+ {
+ throw new IOException("Not a valid tiff file");
+ }
+ int magicNumber = readshort(endianess, raf);
+ if( magicNumber != 42)
+ {
+ throw new IOException("Not a valid tiff file");
+ }
+
+ // Relocate to the first set of tags
+ raf.seek(readlong(endianess, raf));
+
+ int numtags = readshort(endianess, raf);
+
+ // The number 50 is somewhat arbitary, it just stops us load up junk from somewhere and tramping on
+ if (numtags > 50)
+ {
+ throw new IOException("Not a valid tiff file");
+ }
+
+ // Loop through the tags, some will convert to items in the parms dictionary
+ // Other point us to where to find the data stream
+ // The only parm which might change as a result of other options is K, so
+ // We'll deal with that as a special;
+
+ int k=-1000; // Default Non CCITT compression
+ int dataoffset=0;
+ int datalength=0;
+
+ for (int i=0; i < numtags; i++)
+ {
+ int tag = readshort(endianess, raf);
+ int type = readshort(endianess, raf);
+ int count = readlong(endianess, raf);
+ int val = readlong(endianess, raf); // See note
+
+ // Note, we treated that value as a long. The value always occupies 4 bytes
+ // But it might only use the first byte or two. Depending on endianess we might need to correct
+ // Note we ignore all other types, they are of little interest for PDFs/CCITT Fax
+ if (endianess == 'M')
+ {
+ switch (type)
+ {
+ case 1:
+ {
+ val = val >> 24;
+ break; // byte value
+ }
+ case 3:
+ {
+ val = val >> 16;
+ break; // short value
+ }
+ case 4:
+ {
+ break; // long value
+ }
+ default:
+ {
+ //do nothing
+ }
+ }
+ }
+ switch (tag)
+ {
+ case 256:
+ {
+ parms.setInt("Columns",val);
+ break;
+ }
+ case 257:
+ {
+ parms.setInt("Rows",val);
+ break;
+ }
+ case 259:
+ {
+ if (val == 4)
+ {
+ k=-1;
+ }
+ if (val == 3)
+ {
+ k=0;
+ }
+ break; // T6/T4 Compression
+ }
+ case 262:
+ {
+ if (val == 1)
+ {
+ parms.setBoolean("BlackIs1", true);
+ }
+ break;
+ }
+ case 273:
+ {
+ if (count == 1)
+ {
+ dataoffset=val;
+ }
+ break;
+ }
+ case 279:
+ {
+ if (count == 1)
+ {
+ datalength=val;
+ }
+ break;
+ }
+ case 292:
+ {
+ if (val == 1)
+ {
+ k=50; // T4 2D - arbitary K value
+ }
+ break;
+ }
+ case 324:
+ {
+ if (count == 1)
+ {
+ dataoffset=val;
+ }
+ break;
+ }
+ case 325:
+ {
+ if (count == 1)
+ {
+ datalength=val;
+ }
+ break;
+ }
+ default:
+ {
+ //do nothing
+ }
+ }
+ }
+
+ if (k == -1000)
+ {
+ throw new IOException("First image in tiff is not CCITT T4 or T6 compressed");
+ }
+ if (dataoffset == 0)
+ {
+ throw new IOException("First image in tiff is not a single tile/strip");
+ }
+
+ parms.setInt("K",k);
+
+ raf.seek(dataoffset);
+
+ byte[] buf = new byte[8192];
+ int amountRead = -1;
+ while( (amountRead = raf.read( buf,0, Math.min(8192,datalength) )) > 0 )
+ {
+ datalength -= amountRead;
+ os.write( buf, 0, amountRead );
+ }
+
+ }
+ finally
+ {
+ os.close();
+ }
+ }
+
+ private int readshort(char endianess, RandomAccessFile raf) throws IOException
+ {
+ if (endianess == 'I')
+ {
+ return raf.read() | (raf.read() << 8);
+ }
+ return (raf.read() << 8) | raf.read();
+ }
+
+ private int readlong(char endianess, RandomAccessFile raf) throws IOException
+ {
+ if (endianess == 'I')
+ {
+ return raf.read() | (raf.read() << 8) | (raf.read() << 16) | (raf.read() << 24);
+ }
+ return (raf.read() << 24) | (raf.read() << 16) | (raf.read() << 8) | raf.read();
+ }
+
+
+ /**
+ * Extends InputStream to wrap the data from the CCITT Fax with a suitable TIFF Header.
+ * For details see www.tiff.org, which contains useful information including pointers to the
+ * TIFF 6.0 Specification
+ *
+ */
+ private class TiffWrapper extends InputStream
+ {
+
+ private int currentOffset; // When reading, where in the tiffheader are we.
+ private byte[] tiffheader; // Byte array to store tiff header data
+ private InputStream datastream; // Original InputStream
+
+ public TiffWrapper(InputStream rawstream, COSDictionary options)
+ {
+ buildHeader(options);
+ currentOffset=0;
+ datastream = rawstream;
+ }
+
+ // Implement basic methods from InputStream
+
+ public boolean markSupported()
+ {
+ return false;
+ }
+
+ public void reset() throws IOException
+ {
+ throw new IOException("reset not supported");
+ }
+
+ // For simple read, take a byte from the tiffheader array or pass through.
+ public int read() throws IOException
+ {
+ if (currentOffset < tiffheader.length)
+ {
+ return tiffheader[currentOffset++];
+ }
+ return datastream.read();
+ }
+
+ // For read methods only return as many bytes as we have left in the header
+ // if we've exhausted the header, pass through to the InputStream of the raw CCITT data
+ public int read(byte[] data) throws IOException
+ {
+ if (currentOffset < tiffheader.length)
+ {
+ int length = java.lang.Math.min(tiffheader.length - currentOffset, data.length);
+ if (length > 0)
+ {
+ System.arraycopy(tiffheader, currentOffset, data, 0, length);
+ }
+ currentOffset += length;
+ return length;
+ }
+ else
+ {
+ return datastream.read(data);
+ }
+ }
+
+ // For read methods only return as many bytes as we have left in the header
+ // if we've exhausted the header, pass through to the InputStream of the raw CCITT data
+ public int read(byte[] data, int off, int len) throws IOException
+ {
+ if (currentOffset < tiffheader.length)
+ {
+ int length = java.lang.Math.min(tiffheader.length - currentOffset, len);
+ if (length > 0)
+ {
+ System.arraycopy(tiffheader, currentOffset, data, off, length);
+ }
+ currentOffset += length;
+ return length;
+ }
+ else
+ {
+ return datastream.read(data,off,len);
+ }
+ }
+
+ // When skipping if any header data not yet read, only allow to skip what we've in the buffer
+ // Otherwise just pass through.
+ public long skip(long n) throws IOException
+ {
+ if (currentOffset < tiffheader.length)
+ {
+ long length = Math.min(tiffheader.length - currentOffset, n);
+ currentOffset += length;
+ return length;
+ }
+ else
+ {
+ return datastream.skip(n);
+ }
+ }
+
+ // Static data for the beginning of the TIFF header
+ private final byte[] basicHeader = {
+ 'I','I',42,0,8,0,0,0, // File introducer and pointer to first IFD
+ 0,0}; // Number of tags start with two
+
+
+ private int additionalOffset; // Offset in header to additional data
+
+ // Builds up the tiffheader based on the options passed through.
+ private void buildHeader(COSDictionary options)
+ {
+
+ final int numOfTags = 10; // The maximum tags we'll fill
+ final int maxAdditionalData = 24; // The maximum amount of additional data
+ // outside the IFDs. (bytes)
+
+ // The length of the header will be the length of the basic header (10)
+ // plus 12 bytes for each IFD, 4 bytes as a pointer to the next IFD (will be 0)
+ // plus the length of the additional data
+
+ tiffheader = new byte[10 + (12 * numOfTags ) + 4 + maxAdditionalData];
+ java.util.Arrays.fill(tiffheader,(byte)0);
+ System.arraycopy(basicHeader,0,tiffheader,0,basicHeader.length);
+
+ // Additional data outside the IFD starts after the IFD's and pointer to the next IFD (0)
+ additionalOffset = 10 + (12 * numOfTags ) + 4;
+
+ // Now work out the variable values from TIFF defaults,
+ // PDF Defaults and the Dictionary for this XObject
+ short cols = 1728;
+ short rows = 0;
+ short blackis1 = 0;
+ short comptype = 3; // T4 compression
+ long t4options = 0; // Will set if 1d or 2d T4
+
+ COSDictionary decodeParms = (COSDictionary) options.getDictionaryObject("DecodeParms");
+
+ if (decodeParms != null)
+ {
+ cols = (short) decodeParms.getInt("Columns", cols);
+ rows = (short) decodeParms.getInt("Rows", rows);
+ if (decodeParms.getBoolean("BlackIs1", false))
+ {
+ blackis1 = 1;
+ }
+ int k = decodeParms.getInt("K"); // Mandatory parm
+ if (k < 0)
+ {
+ //T6
+ comptype = 4;
+ }
+ if (k > 0)
+ {
+ //T4 2D
+ comptype = 3;
+ t4options = 1;
+ }
+ // else k = 0, leave as default T4 1D compression
+ }
+
+ // If we couldn't get the number of rows, use the main item from XObject
+ if (rows == 0)
+ {
+ rows = (short) options.getInt("Height", rows);
+ }
+
+ // Now put the tags into the tiffheader
+ // These musn't exceed the maximum set above, and by TIFF spec should be sorted into
+ // Numeric sequence.
+
+ addTag(256, cols); // Columns
+ addTag(257, rows); // Rows
+ addTag(259, comptype); // T6
+ addTag(262, blackis1); // Photometric Interpretation
+ addTag(273, (long) tiffheader.length); // Offset to start of image data - updated below
+ addTag(279, (long) options.getInt("Length")); // Length of image data
+ addTag(282, 300, 1); // X Resolution 300 (default unit Inches) This is arbitary
+ addTag(283, 300, 1); // Y Resolution 300 (default unit Inches) This is arbitary
+ if (comptype == 3)
+ {
+ addTag(292, t4options);
+ }
+ addTag(305, "PDFBOX"); // Software generating image
+ }
+
+ /* Tiff types 1 = byte, 2=ascii, 3=short, 4=ulong 5=rational */
+
+ private void addTag(int tag,long value)
+ {
+ // Adds a tag of type 4 (ulong)
+ int count = ++tiffheader[8];
+ int offset = (count-1)*12 + 10;
+ tiffheader[offset]=(byte)(tag & 0xff);
+ tiffheader[offset+1]=(byte)((tag>>8) & 0xff);
+ tiffheader[offset+2]=4; // Type Long
+ tiffheader[offset+4]=1; // One Value
+ tiffheader[offset+8]=(byte)(value & 0xff);
+ tiffheader[offset+9]=(byte)((value>>8) & 0xff);
+ tiffheader[offset+10]=(byte)((value>>16) & 0xff);
+ tiffheader[offset+11]=(byte)((value>>24) & 0xff);
+ }
+
+ private void addTag(int tag, short value)
+ {
+ // Adds a tag of type 3 (short)
+ int count = ++tiffheader[8];
+ int offset = (count-1)*12 + 10;
+ tiffheader[offset]=(byte)(tag & 0xff);
+ tiffheader[offset+1]=(byte)((tag>>8) & 0xff);
+ tiffheader[offset+2]=3; // Type Short
+ tiffheader[offset+4]=1; // One Value
+ tiffheader[offset+8]=(byte)(value & 0xff);
+ tiffheader[offset+9]=(byte)((value>>8) & 0xff);
+ }
+
+ private void addTag(int tag, String value)
+ {
+ // Adds a tag of type 2 (ascii)
+ int count = ++tiffheader[8];
+ int offset = (count-1)*12 + 10;
+ tiffheader[offset]=(byte)(tag & 0xff);
+ tiffheader[offset+1]=(byte)((tag>>8) & 0xff);
+ tiffheader[offset+2]=2; // Type Ascii
+ tiffheader[offset+4]=1; // One Value
+ tiffheader[offset+8]=(byte)(additionalOffset & 0xff);
+ tiffheader[offset+9]=(byte)((additionalOffset>>8) & 0xff);
+ tiffheader[offset+10]=(byte)((additionalOffset>>16) & 0xff);
+ tiffheader[offset+11]=(byte)((additionalOffset>>24) & 0xff);
+ System.arraycopy(value.getBytes(), 0, tiffheader, additionalOffset, value.length());
+ additionalOffset += value.length() + 1;
+ }
+
+ private void addTag(int tag, long numerator, long denominator)
+ {
+ // Adds a tag of type 5 (rational)
+ int count = ++tiffheader[8];
+ int offset = (count-1)*12 + 10;
+ tiffheader[offset]=(byte)(tag & 0xff);
+ tiffheader[offset+1]=(byte)((tag>>8) & 0xff);
+ tiffheader[offset+2]=5; // Type Rational
+ tiffheader[offset+4]=1; // One Value
+ tiffheader[offset+8]=(byte)(additionalOffset & 0xff);
+ tiffheader[offset+9]=(byte)((additionalOffset>>8) & 0xff);
+ tiffheader[offset+10]=(byte)((additionalOffset>>16) & 0xff);
+ tiffheader[offset+11]=(byte)((additionalOffset>>24) & 0xff);
+ tiffheader[additionalOffset++]=(byte) ((numerator) & 0xFF);
+ tiffheader[additionalOffset++]=(byte) ((numerator>>8) & 0xFF);
+ tiffheader[additionalOffset++]=(byte) ((numerator>>16) & 0xFF);
+ tiffheader[additionalOffset++]=(byte) ((numerator>>24) & 0xFF);
+ tiffheader[additionalOffset++]=(byte) ((denominator) & 0xFF);
+ tiffheader[additionalOffset++]=(byte) ((denominator>>8) & 0xFF);
+ tiffheader[additionalOffset++]=(byte) ((denominator>>16) & 0xFF);
+ tiffheader[additionalOffset++]=(byte) ((denominator>>24) & 0xFF);
+ }
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/graphics/xobject/PDInlinedImage.java b/src/main/java/org/pdfbox/pdmodel/graphics/xobject/PDInlinedImage.java
new file mode 100644
index 0000000..009743f
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/graphics/xobject/PDInlinedImage.java
@@ -0,0 +1,201 @@
+/**
+ * Copyright (c) 2003-2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.graphics.xobject;
+
+import java.awt.image.BufferedImage;
+import java.awt.image.ColorModel;
+import java.awt.image.DataBuffer;
+import java.awt.image.DataBufferByte;
+import java.awt.image.DataBufferInt;
+import java.awt.image.IndexColorModel;
+import java.awt.image.WritableRaster;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.util.List;
+
+import org.pdfbox.filter.Filter;
+import org.pdfbox.filter.FilterManager;
+import org.pdfbox.pdmodel.graphics.color.PDColorSpace;
+import org.pdfbox.util.ImageParameters;
+
+/**
+ * This class represents an inlined image.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.4 $
+ */
+public class PDInlinedImage
+{
+ private ImageParameters params;
+ private byte[] imageData;
+
+ /**
+ * This will get the image parameters.
+ *
+ * @return The image parameters.
+ */
+ public ImageParameters getImageParameters()
+ {
+ return params;
+ }
+
+ /**
+ * This will set the image parameters for this image.
+ *
+ * @param imageParams The imageParams.
+ */
+ public void setImageParameters( ImageParameters imageParams )
+ {
+ params = imageParams;
+ }
+
+ /**
+ * Get the bytes for the image.
+ *
+ * @return The image data.
+ */
+ public byte[] getImageData()
+ {
+ return imageData;
+ }
+
+ /**
+ * Set the bytes that make up the image.
+ *
+ * @param value The image data.
+ */
+ public void setImageData(byte[] value)
+ {
+ imageData = value;
+ }
+
+ /**
+ * This will take the inlined image information and create a java.awt.Image from
+ * it.
+ *
+ * @return The image that this object represents.
+ *
+ * @throws IOException If there is an error creating the image.
+ */
+ public BufferedImage createImage() throws IOException
+ {
+ /*
+ * This was the previous implementation, not sure which is better right now.
+ * byte[] transparentColors = new byte[]{(byte)0xFF,(byte)0xFF};
+ byte[] colors=new byte[]{0, (byte)0xFF};
+ IndexColorModel colorModel = new IndexColorModel( 1, 2, colors, colors, colors, transparentColors );
+ BufferedImage image = new BufferedImage(
+ params.getWidth(),
+ params.getHeight(),
+ BufferedImage.TYPE_BYTE_BINARY,
+ colorModel );
+ DataBufferByte buffer = new DataBufferByte( getImageData(), 1 );
+ WritableRaster raster =
+ Raster.createPackedRaster(
+ buffer,
+ params.getWidth(),
+ params.getHeight(),
+ params.getBitsPerComponent(),
+ new Point(0,0) );
+ image.setData( raster );
+ return image;
+ */
+
+
+ //verify again pci32.pdf before changing below
+ PDColorSpace pcs = params.getColorSpace();
+ ColorModel colorModel = null;
+ if(pcs != null)
+ {
+ colorModel =
+ params.getColorSpace().createColorModel(
+ params.getBitsPerComponent() );
+ }
+ else
+ {
+ byte[] transparentColors = new
+ byte[]{(byte)0xFF,(byte)0xFF};
+ byte[] colors=new byte[]{0, (byte)0xFF};
+ colorModel = new IndexColorModel( 1, 2,
+ colors, colors, colors, transparentColors );
+ }
+ List filters = params.getFilters();
+ byte[] finalData = null;
+ if( filters == null )
+ {
+ finalData = getImageData();
+ }
+ else
+ {
+ ByteArrayInputStream in = new ByteArrayInputStream( getImageData() );
+ ByteArrayOutputStream out = new ByteArrayOutputStream(getImageData().length);
+ FilterManager filterManager = new FilterManager();
+ for( int i=0; filters != null && i<filters.size(); i++ )
+ {
+ out.reset();
+ Filter filter = filterManager.getFilter( (String)filters.get( i ) );
+ filter.decode( in, out, params.getDictionary() );
+ in = new ByteArrayInputStream( out.toByteArray() );
+ }
+ finalData = out.toByteArray();
+ }
+
+ WritableRaster raster = colorModel.createCompatibleWritableRaster( params.getWidth(), params.getHeight() );
+ /* Raster.createPackedRaster(
+ buffer,
+ params.getWidth(),
+ params.getHeight(),
+ params.getBitsPerComponent(),
+ new Point(0,0) );
+ */
+ DataBuffer rasterBuffer = raster.getDataBuffer();
+ if( rasterBuffer instanceof DataBufferByte )
+ {
+ DataBufferByte byteBuffer = (DataBufferByte)rasterBuffer;
+ byte[] data = byteBuffer.getData();
+ System.arraycopy( finalData, 0, data, 0, data.length );
+ }
+ else if( rasterBuffer instanceof DataBufferInt )
+ {
+ DataBufferInt byteBuffer = (DataBufferInt)rasterBuffer;
+ int[] data = byteBuffer.getData();
+ for( int i=0; i<finalData.length; i++ )
+ {
+ data[i] = (finalData[i]+256)%256;
+ }
+ }
+ BufferedImage image = new BufferedImage(
+ colorModel, raster, false, null );
+ image.setData( raster );
+ return image;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/graphics/xobject/PDJpeg.java b/src/main/java/org/pdfbox/pdmodel/graphics/xobject/PDJpeg.java
new file mode 100644
index 0000000..79ee8e8
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/graphics/xobject/PDJpeg.java
@@ -0,0 +1,156 @@
+/**
+ * Copyright (c) 2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.graphics.xobject;
+
+import java.awt.image.BufferedImage;
+import java.io.InputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.imageio.ImageIO;
+
+import org.pdfbox.cos.COSDictionary;
+import org.pdfbox.cos.COSName;
+
+import org.pdfbox.pdmodel.PDDocument;
+import org.pdfbox.pdmodel.common.PDStream;
+import org.pdfbox.pdmodel.graphics.color.PDDeviceRGB;
+
+/**
+ * An image class for JPegs.
+ *
+ * @author mathiak
+ * @version $Revision: 1.4 $
+ */
+public class PDJpeg extends PDXObjectImage
+{
+
+ private static final List DCT_FILTERS = new ArrayList();
+
+ static
+ {
+ DCT_FILTERS.add( COSName.DCT_DECODE.getName() );
+ DCT_FILTERS.add( COSName.DCT_DECODE_ABBREVIATION.getName() );
+ }
+
+ /**
+ * Standard constructor.
+ *
+ * @param jpeg The COSStream from which to extract the JPeg
+ */
+ public PDJpeg(PDStream jpeg)
+ {
+ super(jpeg, "jpg");
+ }
+
+ /**
+ * Construct from a stream.
+ *
+ * @param doc The document to create the image as part of.
+ * @param is The stream that contains the jpeg data.
+ * @throws IOException If there is an error reading the jpeg data.
+ */
+ public PDJpeg( PDDocument doc, InputStream is ) throws IOException
+ {
+ super( new PDStream( doc, is, true ), "jpg" );
+ COSDictionary dic = getCOSStream();
+ dic.setItem( COSName.FILTER, COSName.DCT_DECODE );
+ dic.setItem( COSName.SUBTYPE, COSName.IMAGE);
+ dic.setItem( COSName.TYPE, COSName.getPDFName( "XObject" ) );
+
+ BufferedImage image = getRGBImage();
+ setBitsPerComponent( 8 );
+ setColorSpace( PDDeviceRGB.INSTANCE );
+ setHeight( image.getHeight() );
+ setWidth( image.getWidth() );
+
+ }
+
+ /**
+ * Construct from a buffered image.
+ *
+ * @param doc The document to create the image as part of.
+ * @param bi The image to convert to a jpeg
+ * @throws IOException If there is an error processing the jpeg data.
+ */
+ public PDJpeg( PDDocument doc, BufferedImage bi ) throws IOException
+ {
+ super( new PDStream( doc ), "jpg" );
+
+ java.io.OutputStream os = getCOSStream().createFilteredStream();
+ try
+ {
+
+ ImageIO.write(bi,"jpeg",os);
+
+ COSDictionary dic = getCOSStream();
+ dic.setItem( COSName.FILTER, COSName.DCT_DECODE );
+ dic.setItem( COSName.SUBTYPE, COSName.IMAGE);
+ dic.setItem( COSName.TYPE, COSName.getPDFName( "XObject" ) );
+
+ setBitsPerComponent( 8 );
+ setColorSpace( PDDeviceRGB.INSTANCE );
+ setHeight( bi.getHeight() );
+ setWidth( bi.getWidth() );
+ }
+ finally
+ {
+ os.close();
+ }
+ }
+
+ /**
+ * Returns an image of the JPeg, or null if JPegs are not supported. (They should be. )
+ * @see org.pdfbox.pdmodel.graphics.xobject.PDXObjectImage#getRGBImage()
+ */
+ public BufferedImage getRGBImage() throws IOException
+ {
+ return ImageIO.read(getPDStream().getPartiallyFilteredStream( DCT_FILTERS ));
+ }
+
+ /**
+ * This writes the JPeg to out.
+ * @see org.pdfbox.pdmodel.graphics.xobject.PDXObjectImage#write2OutputStream(java.io.OutputStream)
+ */
+ public void write2OutputStream(OutputStream out) throws IOException
+ {
+ InputStream data = getPDStream().getPartiallyFilteredStream( DCT_FILTERS );
+ byte[] buf = new byte[1024];
+ int amountRead = -1;
+ while( (amountRead = data.read( buf )) != -1 )
+ {
+ out.write( buf, 0, amountRead );
+ }
+ }
+}
diff --git a/src/main/java/org/pdfbox/pdmodel/graphics/xobject/PDPixelMap.java b/src/main/java/org/pdfbox/pdmodel/graphics/xobject/PDPixelMap.java
new file mode 100644
index 0000000..96a1f29
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/graphics/xobject/PDPixelMap.java
@@ -0,0 +1,236 @@
+/**
+ * Copyright (c) 2004-2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.graphics.xobject;
+
+import java.awt.image.DataBufferByte;
+import java.awt.image.BufferedImage;
+import java.awt.image.ColorModel;
+import java.awt.image.WritableRaster;
+import java.io.IOException;
+import java.io.OutputStream;
+
+import javax.imageio.ImageIO;
+
+import org.pdfbox.cos.COSArray;
+import org.pdfbox.cos.COSBase;
+import org.pdfbox.cos.COSDictionary;
+import org.pdfbox.pdmodel.common.PDStream;
+
+import org.pdfbox.pdmodel.graphics.color.PDColorSpace;
+import org.pdfbox.pdmodel.graphics.predictor.PredictorAlgorithm;
+
+/**
+ * This class contains a PixelMap Image.
+ * @author Ben Litchfield (ben@benlitchfield.com)
+ * @author mathiak
+ * @version $Revision: 1.7 $
+ */
+public class PDPixelMap extends PDXObjectImage
+{
+ private BufferedImage image = null;
+
+ /**
+ * Standard constructor. Basically does nothing.
+ * @param pdStream The stream that holds the pixel map.
+ */
+ public PDPixelMap(PDStream pdStream)
+ {
+ super(pdStream, "png");
+ }
+
+ /**
+ * Construct a pixel map image from an AWT image.
+ *
+ * @param doc The PDF document to embed the image in.
+ * @param awtImage The image to read data from.
+ *
+ * @throws IOException If there is an error while embedding this image.
+ */
+ /*
+ * This method is broken and needs to be implemented, any takers?
+ public PDPixelMap(PDDocument doc, BufferedImage awtImage) throws IOException
+ {
+ super( doc, "png");
+ image = awtImage;
+ setWidth( image.getWidth() );
+ setHeight( image.getHeight() );
+
+ ColorModel cm = image.getColorModel();
+ ColorSpace cs = cm.getColorSpace();
+ PDColorSpace pdColorSpace = PDColorSpaceFactory.createColorSpace( doc, cs );
+ setColorSpace( pdColorSpace );
+ //setColorSpace( )
+
+ PDStream stream = getPDStream();
+ OutputStream output = null;
+ try
+ {
+ output = stream.createOutputStream();
+ DataBuffer buffer = awtImage.getRaster().getDataBuffer();
+ if( buffer instanceof DataBufferByte )
+ {
+ DataBufferByte byteBuffer = (DataBufferByte)buffer;
+ byte[] data = byteBuffer.getData();
+ output.write( data );
+ }
+ setBitsPerComponent( cm.getPixelSize() );
+ }
+ finally
+ {
+ if( output != null )
+ {
+ output.close();
+ }
+ }
+ }*/
+
+ /**
+ * Returns a {@link java.awt.image.BufferedImage} of the COSStream
+ * set in the constructor or null if the COSStream could not be encoded.
+ *
+ * @see org.pdfbox.pdmodel.graphics.xobject.PDXObjectImage#getRGBImage()
+ */
+ public BufferedImage getRGBImage() throws IOException
+ {
+ if( image != null )
+ {
+ return image;
+ }
+
+ //byte[] index =
+ //ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_sRGB);
+ int width = getWidth();
+ int height = getHeight();
+ int bpc = getBitsPerComponent();
+ //COSInteger length =
+ // (COSInteger) stream.getStream().getDictionary().getDictionaryObject(COSName.LENGTH);
+ //byte[] array = new byte[stream.getFilteredStream().];
+ byte[] array = getPDStream().getByteArray();
+
+// Get the ColorModel right
+ PDColorSpace colorspace = getColorSpace();
+ ColorModel cm = colorspace.createColorModel( bpc );
+ WritableRaster raster = cm.createCompatibleWritableRaster( width, height );
+ //DataBufferByte buffer = (DataBufferByte)raster.getDataBuffer();
+ DataBufferByte buffer = (DataBufferByte)raster.getDataBuffer();
+ byte[] bufferData = buffer.getData();
+ //System.arraycopy( array, 0, bufferData, 0, array.length );
+ int predictor = getPredictor();
+
+ PredictorAlgorithm filter = PredictorAlgorithm.getFilter(predictor);
+ filter.setWidth(width);
+ filter.setHeight(height);
+ filter.setBpp((bpc * 3) / 8);
+ filter.decode(array, bufferData);
+ image = new BufferedImage(cm, raster, false, null);
+ return image;
+ }
+
+ /**
+ * Writes the image as .png.
+ *
+ * @see org.pdfbox.pdmodel.graphics.xobject.PDXObjectImage#write2OutputStream(java.io.OutputStream)
+ */
+ public void write2OutputStream(OutputStream out) throws IOException
+ {
+ getRGBImage();
+ if (image!=null)
+ {
+ ImageIO.write(image, "png", out);
+ }
+ }
+
+ /**
+ * DecodeParms is an optional parameter for filters.
+ *
+ * It is provided if any of the filters has nondefault parameters. If there
+ * is only one filter it is a dictionary, if there are multiple filters it
+ * is an array with an entry for each filter. An array entry can hold a null
+ * value if only the default values are used or a dictionary with
+ * parameters.
+ *
+ * @return The decoding parameters.
+ *
+ */
+ public COSDictionary getDecodeParams()
+ {
+ COSBase decodeParms = getCOSStream().getDictionaryObject("DecodeParms");
+ if (decodeParms != null)
+ {
+ if (decodeParms instanceof COSDictionary)
+ {
+ return (COSDictionary) decodeParms;
+ }
+ else if (decodeParms instanceof COSArray)
+ {
+ // not implemented yet, which index should we use?
+ return null;//(COSDictionary)((COSArray)decodeParms).get(0);
+ }
+ else
+ {
+ return null;
+ }
+ }
+ return null;
+ }
+
+ /**
+ * A code that selects the predictor algorithm.
+ *
+ * <ul>
+ * <li>1 No prediction (the default value)
+ * <li>2 TIFF Predictor 2
+ * <li>10 PNG prediction (on encoding, PNG None on all rows)
+ * <li>11 PNG prediction (on encoding, PNG Sub on all rows)
+ * <li>12 PNG prediction (on encoding, PNG Up on all rows)
+ * <li>13 PNG prediction (on encoding, PNG Average on all rows)
+ * <li>14 PNG prediction (on encoding, PNG Paeth on all rows)
+ * <li>15 PNG prediction (on encoding, PNG optimum)
+ * </ul>
+ *
+ * Default value: 1.
+ *
+ * @return predictor algorithm code
+ */
+ public int getPredictor()
+ {
+ COSDictionary decodeParms = getDecodeParams();
+ if (decodeParms != null)
+ {
+ int i = decodeParms.getInt("Predictor");
+ if (i != -1)
+ {
+ return i;
+ }
+ }
+ return 1;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/graphics/xobject/PDXObject.java b/src/main/java/org/pdfbox/pdmodel/graphics/xobject/PDXObject.java
new file mode 100644
index 0000000..99ac8a5
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/graphics/xobject/PDXObject.java
@@ -0,0 +1,207 @@
+/**
+ * Copyright (c) 2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.graphics.xobject;
+
+import java.io.IOException;
+import java.util.List;
+
+import org.pdfbox.cos.COSBase;
+import org.pdfbox.cos.COSName;
+import org.pdfbox.cos.COSStream;
+
+import org.pdfbox.pdmodel.PDDocument;
+import org.pdfbox.pdmodel.common.COSObjectable;
+import org.pdfbox.pdmodel.common.PDMetadata;
+import org.pdfbox.pdmodel.common.PDStream;
+
+/**
+ * The base class for all XObjects in the PDF document.
+ *
+ * @author Ben Litchfield (ben@benlitchfield.com)
+ * @author mathiak
+ * @author Marcel Kammer
+ * @version $Revision: 1.12 $
+ */
+public abstract class PDXObject implements COSObjectable
+{
+ private PDStream xobject;
+
+ /**
+ * Standard constuctor.
+ *
+ * @param xobj The XObject dictionary.
+ */
+ public PDXObject(COSStream xobj)
+ {
+ xobject = new PDStream( xobj );
+ }
+
+ /**
+ * Standard constuctor.
+ *
+ * @param xobj The XObject dictionary.
+ */
+ public PDXObject(PDStream xobj)
+ {
+ xobject = xobj;
+ }
+
+ /**
+ * Standard constuctor.
+ *
+ * @param doc The doc to store the object contents.
+ */
+ public PDXObject(PDDocument doc)
+ {
+ xobject = new PDStream(doc);
+ xobject.getStream().setName( COSName.TYPE, "XObject" );
+ }
+
+ /**
+ * Returns the stream.
+ * @see org.pdfbox.pdmodel.common.COSObjectable#getCOSObject()
+ */
+ public COSBase getCOSObject()
+ {
+ return xobject.getCOSObject();
+ }
+
+ /**
+ * Returns the stream.
+ * @return The stream for this object.
+ */
+ public COSStream getCOSStream()
+ {
+ return xobject.getStream();
+ }
+
+ /**
+ * Returns the stream.
+ * @return The stream for this object.
+ */
+ public PDStream getPDStream()
+ {
+ return xobject;
+ }
+
+ /**
+ * Create the correct xobject from the cos base.
+ *
+ * @param xobject The cos level xobject to create.
+ *
+ * @return a pdmodel xobject
+ * @throws IOException If there is an error creating the xobject.
+ */
+ public static PDXObject createXObject( COSBase xobject ) throws IOException
+ {
+ PDXObject retval = null;
+ if( xobject == null )
+ {
+ retval = null;
+ }
+ else if( xobject instanceof COSStream )
+ {
+ COSStream xstream = (COSStream)xobject;
+ String subtype = xstream.getNameAsString( "Subtype" );
+ if( subtype.equals( PDXObjectImage.SUB_TYPE ) )
+ {
+ PDStream image = new PDStream( xstream );
+ // See if filters are DCT or JPX otherwise treat as Bitmap-like
+ // There might be a problem with several filters, but that's ToDo until
+ // I find an example
+ List filters = image.getFilters();
+ if( filters != null && filters.contains( COSName.DCT_DECODE.getName() ) )
+ {
+ return new PDJpeg(image);
+ }
+ else if ( filters != null && filters.contains( COSName.CCITTFAX_DECODE.getName() ) )
+ {
+ return new PDCcitt(image);
+ }
+ else if( filters != null && filters.contains(COSName.JPX_DECODE.getName()))
+ {
+ //throw new IOException( "JPXDecode has not been implemented for images" );
+ //JPX Decode is not really supported right now, but if we are just doing
+ //text extraction then we don't want to throw an exception, so for now
+ //just return a PDPixelMap, which will break later on if it is
+ //actually used, but for text extraction it is not used.
+ return new PDPixelMap( image );
+
+ }
+ else
+ {
+ retval = new PDPixelMap(image);
+ }
+ }
+ else if( subtype.equals( PDXObjectForm.SUB_TYPE ) )
+ {
+ retval = new PDXObjectForm( xstream );
+ }
+ else
+ {
+ throw new IOException( "Unknown xobject subtype '" + subtype + "'" );
+ }
+ }
+ else
+ {
+ throw new IOException( "Unknown xobject type:" + xobject.getClass().getName() );
+ }
+
+ return retval;
+ }
+
+ /**
+ * Get the metadata that is part of the document catalog. This will
+ * return null if there is no meta data for this object.
+ *
+ * @return The metadata for this object.
+ */
+ public PDMetadata getMetadata()
+ {
+ PDMetadata retval = null;
+ COSStream mdStream = (COSStream)xobject.getStream().getDictionaryObject( "Metadata" );
+ if( mdStream != null )
+ {
+ retval = new PDMetadata( mdStream );
+ }
+ return retval;
+ }
+
+ /**
+ * Set the metadata for this object. This can be null.
+ *
+ * @param meta The meta data for this object.
+ */
+ public void setMetadata( PDMetadata meta )
+ {
+ xobject.getStream().setItem( "Metadata", meta );
+ }
+}
diff --git a/src/main/java/org/pdfbox/pdmodel/graphics/xobject/PDXObjectForm.java b/src/main/java/org/pdfbox/pdmodel/graphics/xobject/PDXObjectForm.java
new file mode 100644
index 0000000..08858ea
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/graphics/xobject/PDXObjectForm.java
@@ -0,0 +1,120 @@
+/**
+ * Copyright (c) 2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.graphics.xobject;
+
+import org.pdfbox.cos.COSDictionary;
+import org.pdfbox.cos.COSName;
+import org.pdfbox.cos.COSStream;
+
+import org.pdfbox.pdmodel.PDResources;
+import org.pdfbox.pdmodel.common.PDStream;
+
+/**
+ * A form xobject.
+ *
+ * @author Ben Litchfield (ben@benlitchfield.com)
+ * @version $Revision: 1.4 $
+ */
+public class PDXObjectForm extends PDXObject
+{
+ /**
+ * The XObject subtype.
+ */
+ public static final String SUB_TYPE = "Form";
+
+ /**
+ * Standard constuctor.
+ *
+ * @param formStream The XObject is passed as a COSStream.
+ */
+ public PDXObjectForm(PDStream formStream)
+ {
+ super( formStream );
+ }
+
+ /**
+ * Standard constuctor.
+ *
+ * @param formStream The XObject is passed as a COSStream.
+ */
+ public PDXObjectForm(COSStream formStream)
+ {
+ super( formStream );
+ }
+
+ /**
+ * This will get the form type, currently 1 is the only form type.
+ *
+ * @return The form type.
+ */
+ public int getFormType()
+ {
+ return getCOSStream().getInt( "FormType",1 );
+ }
+
+ /**
+ * Set the form type.
+ *
+ * @param formType The new form type.
+ */
+ public void setFormType( int formType )
+ {
+ getCOSStream().setInt( "FormType", formType );
+ }
+
+ /**
+ * This will get the resources at this page and not look up the hierarchy.
+ * This attribute is inheritable, and findResources() should probably used.
+ * This will return null if no resources are available at this level.
+ *
+ * @return The resources at this level in the hierarchy.
+ */
+ public PDResources getResources()
+ {
+ PDResources retval = null;
+ COSDictionary resources = (COSDictionary)getCOSStream().getDictionaryObject( COSName.RESOURCES );
+ if( resources != null )
+ {
+ retval = new PDResources( resources );
+ }
+ return retval;
+ }
+
+ /**
+ * This will set the resources for this page.
+ *
+ * @param resources The new resources for this page.
+ */
+ public void setResources( PDResources resources )
+ {
+ getCOSStream().setItem( COSName.RESOURCES, resources );
+ }
+}
diff --git a/src/main/java/org/pdfbox/pdmodel/graphics/xobject/PDXObjectImage.java b/src/main/java/org/pdfbox/pdmodel/graphics/xobject/PDXObjectImage.java
new file mode 100644
index 0000000..6257113
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/graphics/xobject/PDXObjectImage.java
@@ -0,0 +1,244 @@
+/**
+ * Copyright (c) 2004-2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.graphics.xobject;
+
+import java.awt.image.BufferedImage;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+
+import org.pdfbox.cos.COSBase;
+import org.pdfbox.cos.COSName;
+import org.pdfbox.pdmodel.PDDocument;
+import org.pdfbox.pdmodel.common.PDStream;
+import org.pdfbox.pdmodel.graphics.color.PDColorSpace;
+import org.pdfbox.pdmodel.graphics.color.PDColorSpaceFactory;
+import org.pdfbox.pdmodel.graphics.color.PDDeviceGray;
+
+/**
+ * The prototype for all PDImages.
+ *
+ * @author Ben Litchfield (ben@benlitchfield.com)
+ * @author mathiak
+ * @version $Revision: 1.8 $
+ */
+public abstract class PDXObjectImage extends PDXObject
+{
+ /**
+ * The XObject subtype.
+ */
+ public static final String SUB_TYPE = "Image";
+
+ /**
+ * This contains the suffix used when writing to file.
+ */
+ private String suffix;
+
+ /**
+ * Standard constuctor.
+ *
+ * @param imageStream The XObject is passed as a COSStream.
+ * @param fileSuffix The file suffix, jpg/png.
+ */
+ public PDXObjectImage(PDStream imageStream, String fileSuffix)
+ {
+ super( imageStream );
+ suffix = fileSuffix;
+ }
+
+ /**
+ * Standard constuctor.
+ *
+ * @param doc The document to store the stream in.
+ * @param fileSuffix The file suffix, jpg/png.
+ */
+ public PDXObjectImage(PDDocument doc, String fileSuffix)
+ {
+ super( doc );
+ getCOSStream().setName( COSName.SUBTYPE, SUB_TYPE );
+ suffix = fileSuffix;
+ }
+
+ /**
+ * Returns an java.awt.Image, that can be used for display etc.
+ *
+ * @return This PDF object as an AWT image.
+ *
+ * @throws IOException If there is an error creating the image.
+ */
+ public abstract BufferedImage getRGBImage() throws IOException;
+
+ /**
+ * Writes the Image to out.
+ * @param out the OutputStream that the Image is written to.
+ * @throws IOException when somethings wrong with out
+ */
+ public abstract void write2OutputStream(OutputStream out) throws IOException;
+
+ /**
+ * Writes the image to a file with the filename + an appropriate suffix, like "Image.jpg".
+ * The suffix is automatically set by the
+ * @param filename the filename
+ * @throws IOException When somethings wrong with the corresponding file.
+ */
+ public void write2file(String filename) throws IOException
+ {
+ FileOutputStream out = null;
+ try
+ {
+ out = new FileOutputStream(filename + "." + suffix);
+ write2OutputStream(out);
+ out.flush();
+ }
+ finally
+ {
+ if( out != null )
+ {
+ out.close();
+ }
+ }
+ }
+
+ /**
+ * Get the height of the image.
+ *
+ * @return The height of the image.
+ */
+ public int getHeight()
+ {
+ return getCOSStream().getInt( "Height", -1 );
+ }
+
+ /**
+ * Set the height of the image.
+ *
+ * @param height The height of the image.
+ */
+ public void setHeight( int height )
+ {
+ getCOSStream().setInt( "Height", height );
+ }
+
+ /**
+ * Get the width of the image.
+ *
+ * @return The width of the image.
+ */
+ public int getWidth()
+ {
+ return getCOSStream().getInt( "Width", -1 );
+ }
+
+ /**
+ * Set the width of the image.
+ *
+ * @param width The width of the image.
+ */
+ public void setWidth( int width )
+ {
+ getCOSStream().setInt( "Width", width );
+ }
+
+ /**
+ * The bits per component of this image. This will return -1 if one has not
+ * been set.
+ *
+ * @return The number of bits per component.
+ */
+ public int getBitsPerComponent()
+ {
+ return getCOSStream().getInt( new String[] { "BPC", "BitsPerComponent"}, -1 );
+ }
+
+ /**
+ * Set the number of bits per component.
+ *
+ * @param bpc The number of bits per component.
+ */
+ public void setBitsPerComponent( int bpc )
+ {
+ getCOSStream().setInt( "BitsPerComponent", bpc );
+ }
+
+ /**
+ * This will get the color space or null if none exists.
+ *
+ * @return The color space for this image.
+ *
+ * @throws IOException If there is an error getting the colorspace.
+ */
+ public PDColorSpace getColorSpace() throws IOException
+ {
+ COSBase cs = getCOSStream().getDictionaryObject( new String[]{ "CS", "ColorSpace" } );
+ PDColorSpace retval = null;
+ if( cs != null )
+ {
+ retval = PDColorSpaceFactory.createColorSpace( cs );
+ }
+ else
+ {
+ //there are some cases where the 'required' CS value is not present
+ //but we know that it will be grayscale for a CCITT filter.
+ COSBase filter = getCOSStream().getDictionaryObject( "Filter" );
+ if( COSName.CCITTFAX_DECODE.equals( filter ) ||
+ COSName.CCITTFAX_DECODE_ABBREVIATION.equals( filter ) )
+ {
+ retval = new PDDeviceGray();
+ }
+ }
+ return retval;
+ }
+
+ /**
+ * This will set the color space for this image.
+ *
+ * @param cs The color space for this image.
+ */
+ public void setColorSpace( PDColorSpace cs )
+ {
+ COSBase base = null;
+ if( cs != null )
+ {
+ base = cs.getCOSObject();
+ }
+ getCOSStream().setItem( COSName.getPDFName( "ColorSpace" ), base );
+ }
+
+ /**
+ * This will get the suffix for this image type, jpg/png.
+ *
+ * @return The image suffix.
+ */
+ public String getSuffix()
+ {
+ return suffix;
+ }
+}
diff --git a/src/main/java/org/pdfbox/pdmodel/graphics/xobject/package.html b/src/main/java/org/pdfbox/pdmodel/graphics/xobject/package.html
new file mode 100644
index 0000000..60d3324
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/graphics/xobject/package.html
@@ -0,0 +1,9 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head>
+
+</head>
+<body>
+This package deals with images that are stored in a PDF document.
+</body>
+</html>
diff --git a/src/main/java/org/pdfbox/pdmodel/interactive/action/PDActionFactory.java b/src/main/java/org/pdfbox/pdmodel/interactive/action/PDActionFactory.java
new file mode 100644
index 0000000..bf0c156
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/interactive/action/PDActionFactory.java
@@ -0,0 +1,96 @@
+/**
+ * Copyright (c) 2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.interactive.action;
+
+import org.pdfbox.cos.COSDictionary;
+
+import org.pdfbox.pdmodel.interactive.action.type.PDAction;
+import org.pdfbox.pdmodel.interactive.action.type.PDActionGoTo;
+import org.pdfbox.pdmodel.interactive.action.type.PDActionJavaScript;
+import org.pdfbox.pdmodel.interactive.action.type.PDActionLaunch;
+import org.pdfbox.pdmodel.interactive.action.type.PDActionRemoteGoTo;
+import org.pdfbox.pdmodel.interactive.action.type.PDActionURI;
+
+/**
+ * This class will take a dictionary and determine which type of action to create.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.4 $
+ */
+public class PDActionFactory
+{
+ /**
+ * Utility Class.
+ */
+ private PDActionFactory()
+ {
+ //utility class
+ }
+
+ /**
+ * This will create the correct type of action based on the type specified
+ * in the dictionary.
+ *
+ * @param action An action dictionary.
+ *
+ * @return An action of the correct type.
+ */
+ public static PDAction createAction( COSDictionary action )
+ {
+ PDAction retval = null;
+ if( action != null )
+ {
+ String type = action.getNameAsString( "S" );
+ if( PDActionJavaScript.SUB_TYPE.equals( type ) )
+ {
+ retval = new PDActionJavaScript( action );
+ }
+ else if( PDActionGoTo.SUB_TYPE.equals( type ) )
+ {
+ retval = new PDActionGoTo( action );
+ }
+ else if( PDActionLaunch.SUB_TYPE.equals( type ) )
+ {
+ retval = new PDActionLaunch( action );
+ }
+ else if( PDActionRemoteGoTo.SUB_TYPE.equals( type ) )
+ {
+ retval = new PDActionRemoteGoTo( action );
+ }
+ else if( PDActionURI.SUB_TYPE.equals( type ) )
+ {
+ retval = new PDActionURI( action );
+ }
+ }
+ return retval;
+ }
+
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/interactive/action/PDAdditionalActions.java b/src/main/java/org/pdfbox/pdmodel/interactive/action/PDAdditionalActions.java
new file mode 100644
index 0000000..fc2f79b
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/interactive/action/PDAdditionalActions.java
@@ -0,0 +1,106 @@
+/**
+ * Copyright (c) 2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.interactive.action;
+
+import org.pdfbox.cos.COSBase;
+import org.pdfbox.cos.COSDictionary;
+
+import org.pdfbox.pdmodel.common.COSObjectable;
+import org.pdfbox.pdmodel.interactive.action.type.PDAction;
+
+/**
+ * This represents a dictionary of actions that occur due to events.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.3 $
+ */
+public class PDAdditionalActions implements COSObjectable
+{
+ private COSDictionary actions;
+
+ /**
+ * Default constructor.
+ */
+ public PDAdditionalActions()
+ {
+ actions = new COSDictionary();
+ }
+
+ /**
+ * Constructor.
+ *
+ * @param a The action dictionary.
+ */
+ public PDAdditionalActions( COSDictionary a )
+ {
+ actions = a;
+ }
+
+ /**
+ * Convert this standard java object to a COS object.
+ *
+ * @return The cos object that matches this Java object.
+ */
+ public COSBase getCOSObject()
+ {
+ return actions;
+ }
+
+ /**
+ * Convert this standard java object to a COS object.
+ *
+ * @return The cos object that matches this Java object.
+ */
+ public COSDictionary getCOSDictionary()
+ {
+ return actions;
+ }
+
+ /**
+ * Get the F action.
+ *
+ * @return The F action.
+ */
+ public PDAction getF()
+ {
+ return PDActionFactory.createAction( (COSDictionary)actions.getDictionaryObject("F" ) );
+ }
+
+ /**
+ * Set the F action.
+ *
+ * @param action Get the F action.
+ */
+ public void setF( PDAction action )
+ {
+ actions.setItem( "F", action );
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/interactive/action/PDAnnotationAdditionalActions.java b/src/main/java/org/pdfbox/pdmodel/interactive/action/PDAnnotationAdditionalActions.java
new file mode 100644
index 0000000..9b9232e
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/interactive/action/PDAnnotationAdditionalActions.java
@@ -0,0 +1,380 @@
+/**
+ * Copyright (c) 2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.interactive.action;
+
+import org.pdfbox.cos.COSBase;
+import org.pdfbox.cos.COSDictionary;
+
+import org.pdfbox.pdmodel.common.COSObjectable;
+import org.pdfbox.pdmodel.interactive.action.type.PDAction;
+
+/**
+ * This class represents an annotation's dictionary of actions
+ * that occur due to events.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @author Panagiotis Toumasis (ptoumasis@mail.gr)
+ * @version $Revision: 1.1 $
+ */
+public class PDAnnotationAdditionalActions implements COSObjectable
+{
+ private COSDictionary actions;
+
+ /**
+ * Default constructor.
+ */
+ public PDAnnotationAdditionalActions()
+ {
+ actions = new COSDictionary();
+ }
+
+ /**
+ * Constructor.
+ *
+ * @param a The action dictionary.
+ */
+ public PDAnnotationAdditionalActions( COSDictionary a )
+ {
+ actions = a;
+ }
+
+ /**
+ * Convert this standard java object to a COS object.
+ *
+ * @return The cos object that matches this Java object.
+ */
+ public COSBase getCOSObject()
+ {
+ return actions;
+ }
+
+ /**
+ * Convert this standard java object to a COS object.
+ *
+ * @return The cos object that matches this Java object.
+ */
+ public COSDictionary getCOSDictionary()
+ {
+ return actions;
+ }
+
+ /**
+ * This will get an action to be performed when the cursor
+ * enters the annotation's active area.
+ *
+ * @return The E entry of annotation's additional actions dictionary.
+ */
+ public PDAction getE()
+ {
+ COSDictionary e = (COSDictionary)actions.getDictionaryObject( "E" );
+ PDAction retval = null;
+ if( e != null )
+ {
+ retval = PDActionFactory.createAction( e );
+ }
+ return retval;
+ }
+
+ /**
+ * This will set an action to be performed when the cursor
+ * enters the annotation's active area.
+ *
+ * @param e The action to be performed.
+ */
+ public void setE( PDAction e )
+ {
+ actions.setItem( "E", e );
+ }
+
+ /**
+ * This will get an action to be performed when the cursor
+ * exits the annotation's active area.
+ *
+ * @return The X entry of annotation's additional actions dictionary.
+ */
+ public PDAction getX()
+ {
+ COSDictionary x = (COSDictionary)actions.getDictionaryObject( "X" );
+ PDAction retval = null;
+ if( x != null )
+ {
+ retval = PDActionFactory.createAction( x );
+ }
+ return retval;
+ }
+
+ /**
+ * This will set an action to be performed when the cursor
+ * exits the annotation's active area.
+ *
+ * @param x The action to be performed.
+ */
+ public void setX( PDAction x )
+ {
+ actions.setItem( "X", x );
+ }
+
+ /**
+ * This will get an action to be performed when the mouse button
+ * is pressed inside the annotation's active area.
+ * The name D stands for "down".
+ *
+ * @return The d entry of annotation's additional actions dictionary.
+ */
+ public PDAction getD()
+ {
+ COSDictionary d = (COSDictionary)actions.getDictionaryObject( "D" );
+ PDAction retval = null;
+ if( d != null )
+ {
+ retval = PDActionFactory.createAction( d );
+ }
+ return retval;
+ }
+
+ /**
+ * This will set an action to be performed when the mouse button
+ * is pressed inside the annotation's active area.
+ * The name D stands for "down".
+ *
+ * @param d The action to be performed.
+ */
+ public void setD( PDAction d )
+ {
+ actions.setItem( "D", d );
+ }
+
+ /**
+ * This will get an action to be performed when the mouse button
+ * is released inside the annotation's active area.
+ * The name U stands for "up".
+ *
+ * @return The U entry of annotation's additional actions dictionary.
+ */
+ public PDAction getU()
+ {
+ COSDictionary u = (COSDictionary)actions.getDictionaryObject( "U" );
+ PDAction retval = null;
+ if( u != null )
+ {
+ retval = PDActionFactory.createAction( u );
+ }
+ return retval;
+ }
+
+ /**
+ * This will set an action to be performed when the mouse button
+ * is released inside the annotation's active area.
+ * The name U stands for "up".
+ *
+ * @param u The action to be performed.
+ */
+ public void setU( PDAction u )
+ {
+ actions.setItem( "U", u );
+ }
+
+ /**
+ * This will get an action to be performed when the annotation
+ * receives the input focus.
+ *
+ * @return The Fo entry of annotation's additional actions dictionary.
+ */
+ public PDAction getFo()
+ {
+ COSDictionary fo = (COSDictionary)actions.getDictionaryObject( "Fo" );
+ PDAction retval = null;
+ if( fo != null )
+ {
+ retval = PDActionFactory.createAction( fo );
+ }
+ return retval;
+ }
+
+ /**
+ * This will set an action to be performed when the annotation
+ * receives the input focus.
+ *
+ * @param fo The action to be performed.
+ */
+ public void setFo( PDAction fo )
+ {
+ actions.setItem( "Fo", fo );
+ }
+
+ /**
+ * This will get an action to be performed when the annotation
+ * loses the input focus.
+ * The name Bl stands for "blurred".
+ *
+ * @return The Bl entry of annotation's additional actions dictionary.
+ */
+ public PDAction getBl()
+ {
+ COSDictionary bl = (COSDictionary)actions.getDictionaryObject( "Bl" );
+ PDAction retval = null;
+ if( bl != null )
+ {
+ retval = PDActionFactory.createAction( bl );
+ }
+ return retval;
+ }
+
+ /**
+ * This will set an action to be performed when the annotation
+ * loses the input focus.
+ * The name Bl stands for "blurred".
+ *
+ * @param bl The action to be performed.
+ */
+ public void setBl( PDAction bl )
+ {
+ actions.setItem( "Bl", bl );
+ }
+
+ /**
+ * This will get an action to be performed when the page containing
+ * the annotation is opened. The action is executed after the O action
+ * in the page's additional actions dictionary and the OpenAction entry
+ * in the document catalog, if such actions are present.
+ *
+ * @return The PO entry of annotation's additional actions dictionary.
+ */
+ public PDAction getPO()
+ {
+ COSDictionary po = (COSDictionary)actions.getDictionaryObject( "PO" );
+ PDAction retval = null;
+ if( po != null )
+ {
+ retval = PDActionFactory.createAction( po );
+ }
+ return retval;
+ }
+
+ /**
+ * This will set an action to be performed when the page containing
+ * the annotation is opened. The action is executed after the O action
+ * in the page's additional actions dictionary and the OpenAction entry
+ * in the document catalog, if such actions are present.
+ *
+ * @param po The action to be performed.
+ */
+ public void setPO( PDAction po )
+ {
+ actions.setItem( "PO", po );
+ }
+
+ /**
+ * This will get an action to be performed when the page containing
+ * the annotation is closed. The action is executed before the C action
+ * in the page's additional actions dictionary, if present.
+ *
+ * @return The PC entry of annotation's additional actions dictionary.
+ */
+ public PDAction getPC()
+ {
+ COSDictionary pc = (COSDictionary)actions.getDictionaryObject( "PC" );
+ PDAction retval = null;
+ if( pc != null )
+ {
+ retval = PDActionFactory.createAction( pc );
+ }
+ return retval;
+ }
+
+ /**
+ * This will set an action to be performed when the page containing
+ * the annotation is closed. The action is executed before the C action
+ * in the page's additional actions dictionary, if present.
+ *
+ * @param pc The action to be performed.
+ */
+ public void setPC( PDAction pc )
+ {
+ actions.setItem( "PC", pc );
+ }
+
+ /**
+ * This will get an action to be performed when the page containing
+ * the annotation becomes visible in the viewer application's user interface.
+ *
+ * @return The PV entry of annotation's additional actions dictionary.
+ */
+ public PDAction getPV()
+ {
+ COSDictionary pv = (COSDictionary)actions.getDictionaryObject( "PV" );
+ PDAction retval = null;
+ if( pv != null )
+ {
+ retval = PDActionFactory.createAction( pv );
+ }
+ return retval;
+ }
+
+ /**
+ * This will set an action to be performed when the page containing
+ * the annotation becomes visible in the viewer application's user interface.
+ *
+ * @param pv The action to be performed.
+ */
+ public void setPV( PDAction pv )
+ {
+ actions.setItem( "PV", pv );
+ }
+
+ /**
+ * This will get an action to be performed when the page containing the annotation
+ * is no longer visible in the viewer application's user interface.
+ *
+ * @return The PI entry of annotation's additional actions dictionary.
+ */
+ public PDAction getPI()
+ {
+ COSDictionary pi = (COSDictionary)actions.getDictionaryObject( "PI" );
+ PDAction retval = null;
+ if( pi != null )
+ {
+ retval = PDActionFactory.createAction( pi );
+ }
+ return retval;
+ }
+
+ /**
+ * This will set an action to be performed when the page containing the annotation
+ * is no longer visible in the viewer application's user interface.
+ *
+ * @param pi The action to be performed.
+ */
+ public void setPI( PDAction pi )
+ {
+ actions.setItem( "PI", pi );
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/interactive/action/PDDocumentCatalogAdditionalActions.java b/src/main/java/org/pdfbox/pdmodel/interactive/action/PDDocumentCatalogAdditionalActions.java
new file mode 100644
index 0000000..6164de1
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/interactive/action/PDDocumentCatalogAdditionalActions.java
@@ -0,0 +1,238 @@
+/**
+ * Copyright (c) 2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.interactive.action;
+
+import org.pdfbox.cos.COSBase;
+import org.pdfbox.cos.COSDictionary;
+
+import org.pdfbox.pdmodel.common.COSObjectable;
+import org.pdfbox.pdmodel.interactive.action.type.PDAction;
+
+/**
+ * This class represents a document catalog's dictionary of actions
+ * that occur due to events.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @author Panagiotis Toumasis (ptoumasis@mail.gr)
+ * @version $Revision: 1.1 $
+ */
+public class PDDocumentCatalogAdditionalActions implements COSObjectable
+{
+ private COSDictionary actions;
+
+ /**
+ * Default constructor.
+ */
+ public PDDocumentCatalogAdditionalActions()
+ {
+ actions = new COSDictionary();
+ }
+
+ /**
+ * Constructor.
+ *
+ * @param a The action dictionary.
+ */
+ public PDDocumentCatalogAdditionalActions( COSDictionary a )
+ {
+ actions = a;
+ }
+
+ /**
+ * Convert this standard java object to a COS object.
+ *
+ * @return The cos object that matches this Java object.
+ */
+ public COSBase getCOSObject()
+ {
+ return actions;
+ }
+
+ /**
+ * Convert this standard java object to a COS object.
+ *
+ * @return The cos object that matches this Java object.
+ */
+ public COSDictionary getCOSDictionary()
+ {
+ return actions;
+ }
+
+ /**
+ * This will get a JavaScript action to be performed
+ * before closing a document.
+ * The name WC stands for "will close".
+ *
+ * @return The WC entry of document catalog's additional actions dictionary.
+ */
+ public PDAction getWC()
+ {
+ COSDictionary wc = (COSDictionary)actions.getDictionaryObject( "WC" );
+ PDAction retval = null;
+ if( wc != null )
+ {
+ retval = PDActionFactory.createAction( wc );
+ }
+ return retval;
+ }
+
+ /**
+ * This will set a JavaScript action to be performed
+ * before closing a document.
+ * The name WC stands for "will close".
+ *
+ * @param wc The action to be performed.
+ */
+ public void setWC( PDAction wc )
+ {
+ actions.setItem( "WC", wc );
+ }
+
+ /**
+ * This will get a JavaScript action to be performed
+ * before saving a document.
+ * The name WS stands for "will save".
+ *
+ * @return The WS entry of document catalog's additional actions dictionary.
+ */
+ public PDAction getWS()
+ {
+ COSDictionary ws = (COSDictionary)actions.getDictionaryObject( "WS" );
+ PDAction retval = null;
+ if( ws != null )
+ {
+ retval = PDActionFactory.createAction( ws );
+ }
+ return retval;
+ }
+
+ /**
+ * This will set a JavaScript action to be performed
+ * before saving a document.
+ * The name WS stands for "will save".
+ *
+ * @param ws The action to be performed.
+ */
+ public void setWS( PDAction ws )
+ {
+ actions.setItem( "WS", ws );
+ }
+
+ /**
+ * This will get a JavaScript action to be performed
+ * after saving a document.
+ * The name DS stands for "did save".
+ *
+ * @return The DS entry of document catalog's additional actions dictionary.
+ */
+ public PDAction getDS()
+ {
+ COSDictionary ds = (COSDictionary)actions.getDictionaryObject( "DS" );
+ PDAction retval = null;
+ if( ds != null )
+ {
+ retval = PDActionFactory.createAction( ds );
+ }
+ return retval;
+ }
+
+ /**
+ * This will set a JavaScript action to be performed
+ * after saving a document.
+ * The name DS stands for "did save".
+ *
+ * @param ds The action to be performed.
+ */
+ public void setDS( PDAction ds )
+ {
+ actions.setItem( "DS", ds );
+ }
+
+ /**
+ * This will get a JavaScript action to be performed
+ * before printing a document.
+ * The name WP stands for "will print".
+ *
+ * @return The WP entry of document catalog's additional actions dictionary.
+ */
+ public PDAction getWP()
+ {
+ COSDictionary wp = (COSDictionary)actions.getDictionaryObject( "WP" );
+ PDAction retval = null;
+ if( wp != null )
+ {
+ retval = PDActionFactory.createAction( wp );
+ }
+ return retval;
+ }
+
+ /**
+ * This will set a JavaScript action to be performed
+ * before printing a document.
+ * The name WP stands for "will print".
+ *
+ * @param wp The action to be performed.
+ */
+ public void setWP( PDAction wp )
+ {
+ actions.setItem( "WP", wp );
+ }
+
+ /**
+ * This will get a JavaScript action to be performed
+ * after printing a document.
+ * The name DP stands for "did print".
+ *
+ * @return The DP entry of document catalog's additional actions dictionary.
+ */
+ public PDAction getDP()
+ {
+ COSDictionary dp = (COSDictionary)actions.getDictionaryObject( "DP" );
+ PDAction retval = null;
+ if( dp != null )
+ {
+ retval = PDActionFactory.createAction( dp );
+ }
+ return retval;
+ }
+
+ /**
+ * This will set a JavaScript action to be performed
+ * after printing a document.
+ * The name DP stands for "did print".
+ *
+ * @param dp The action to be performed.
+ */
+ public void setDP( PDAction dp )
+ {
+ actions.setItem( "DP", dp );
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/interactive/action/PDFormFieldAdditionalActions.java b/src/main/java/org/pdfbox/pdmodel/interactive/action/PDFormFieldAdditionalActions.java
new file mode 100644
index 0000000..2a594f3
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/interactive/action/PDFormFieldAdditionalActions.java
@@ -0,0 +1,216 @@
+/**
+ * Copyright (c) 2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.interactive.action;
+
+import org.pdfbox.cos.COSBase;
+import org.pdfbox.cos.COSDictionary;
+
+import org.pdfbox.pdmodel.common.COSObjectable;
+import org.pdfbox.pdmodel.interactive.action.type.PDAction;
+
+/**
+ * This class represents a form field's dictionary of actions
+ * that occur due to events.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @author Panagiotis Toumasis (ptoumasis@mail.gr)
+ * @version $Revision: 1.1 $
+ */
+public class PDFormFieldAdditionalActions implements COSObjectable
+{
+ private COSDictionary actions;
+
+ /**
+ * Default constructor.
+ */
+ public PDFormFieldAdditionalActions()
+ {
+ actions = new COSDictionary();
+ }
+
+ /**
+ * Constructor.
+ *
+ * @param a The action dictionary.
+ */
+ public PDFormFieldAdditionalActions( COSDictionary a )
+ {
+ actions = a;
+ }
+
+ /**
+ * Convert this standard java object to a COS object.
+ *
+ * @return The cos object that matches this Java object.
+ */
+ public COSBase getCOSObject()
+ {
+ return actions;
+ }
+
+ /**
+ * Convert this standard java object to a COS object.
+ *
+ * @return The cos object that matches this Java object.
+ */
+ public COSDictionary getCOSDictionary()
+ {
+ return actions;
+ }
+
+ /**
+ * This will get a JavaScript action to be performed when the user
+ * types a keystroke into a text field or combo box or modifies the
+ * selection in a scrollable list box. This allows the keystroke to
+ * be checked for validity and rejected or modified.
+ *
+ * @return The K entry of form field's additional actions dictionary.
+ */
+ public PDAction getK()
+ {
+ COSDictionary k = (COSDictionary)actions.getDictionaryObject( "K" );
+ PDAction retval = null;
+ if( k != null )
+ {
+ retval = PDActionFactory.createAction( k );
+ }
+ return retval;
+ }
+
+ /**
+ * This will set a JavaScript action to be performed when the user
+ * types a keystroke into a text field or combo box or modifies the
+ * selection in a scrollable list box. This allows the keystroke to
+ * be checked for validity and rejected or modified.
+ *
+ * @param k The action to be performed.
+ */
+ public void setK( PDAction k )
+ {
+ actions.setItem( "K", k );
+ }
+
+ /**
+ * This will get a JavaScript action to be performed before
+ * the field is formatted to display its current value. This
+ * allows the field's value to be modified before formatting.
+ *
+ * @return The F entry of form field's additional actions dictionary.
+ */
+ public PDAction getF()
+ {
+ COSDictionary f = (COSDictionary)actions.getDictionaryObject( "F" );
+ PDAction retval = null;
+ if( f != null )
+ {
+ retval = PDActionFactory.createAction( f );
+ }
+ return retval;
+ }
+
+ /**
+ * This will set a JavaScript action to be performed before
+ * the field is formatted to display its current value. This
+ * allows the field's value to be modified before formatting.
+ *
+ * @param f The action to be performed.
+ */
+ public void setF( PDAction f )
+ {
+ actions.setItem( "F", f );
+ }
+
+ /**
+ * This will get a JavaScript action to be performed
+ * when the field's value is changed. This allows the
+ * new value to be checked for validity.
+ * The name V stands for "validate".
+ *
+ * @return The V entry of form field's additional actions dictionary.
+ */
+ public PDAction getV()
+ {
+ COSDictionary v = (COSDictionary)actions.getDictionaryObject( "V" );
+ PDAction retval = null;
+ if( v != null )
+ {
+ retval = PDActionFactory.createAction( v );
+ }
+ return retval;
+ }
+
+ /**
+ * This will set a JavaScript action to be performed
+ * when the field's value is changed. This allows the
+ * new value to be checked for validity.
+ * The name V stands for "validate".
+ *
+ * @param v The action to be performed.
+ */
+ public void setV( PDAction v )
+ {
+ actions.setItem( "V", v );
+ }
+
+ /**
+ * This will get a JavaScript action to be performed in order to recalculate
+ * the value of this field when that of another field changes. The order in which
+ * the document's fields are recalculated is defined by the CO entry in the
+ * interactive form dictionary.
+ * The name C stands for "calculate".
+ *
+ * @return The C entry of form field's additional actions dictionary.
+ */
+ public PDAction getC()
+ {
+ COSDictionary c = (COSDictionary)actions.getDictionaryObject( "C" );
+ PDAction retval = null;
+ if( c != null )
+ {
+ retval = PDActionFactory.createAction( c );
+ }
+ return retval;
+ }
+
+ /**
+ * This will set a JavaScript action to be performed in order to recalculate
+ * the value of this field when that of another field changes. The order in which
+ * the document's fields are recalculated is defined by the CO entry in the
+ * interactive form dictionary.
+ * The name C stands for "calculate".
+ *
+ * @param c The action to be performed.
+ */
+ public void setC( PDAction c )
+ {
+ actions.setItem( "C", c );
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/interactive/action/PDPageAdditionalActions.java b/src/main/java/org/pdfbox/pdmodel/interactive/action/PDPageAdditionalActions.java
new file mode 100644
index 0000000..f15ffa7
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/interactive/action/PDPageAdditionalActions.java
@@ -0,0 +1,150 @@
+/**
+ * Copyright (c) 2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.interactive.action;
+
+import org.pdfbox.cos.COSBase;
+import org.pdfbox.cos.COSDictionary;
+
+import org.pdfbox.pdmodel.common.COSObjectable;
+import org.pdfbox.pdmodel.interactive.action.type.PDAction;
+
+/**
+ * This class represents a page object's dictionary of actions
+ * that occur due to events.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @author Panagiotis Toumasis (ptoumasis@mail.gr)
+ * @version $Revision: 1.1 $
+ */
+public class PDPageAdditionalActions implements COSObjectable
+{
+ private COSDictionary actions;
+
+ /**
+ * Default constructor.
+ */
+ public PDPageAdditionalActions()
+ {
+ actions = new COSDictionary();
+ }
+
+ /**
+ * Constructor.
+ *
+ * @param a The action dictionary.
+ */
+ public PDPageAdditionalActions( COSDictionary a )
+ {
+ actions = a;
+ }
+
+ /**
+ * Convert this standard java object to a COS object.
+ *
+ * @return The cos object that matches this Java object.
+ */
+ public COSBase getCOSObject()
+ {
+ return actions;
+ }
+
+ /**
+ * Convert this standard java object to a COS object.
+ *
+ * @return The cos object that matches this Java object.
+ */
+ public COSDictionary getCOSDictionary()
+ {
+ return actions;
+ }
+
+ /**
+ * This will get an action to be performed when the page
+ * is opened. This action is independent of any that may be
+ * defined by the OpenAction entry in the document catalog,
+ * and is executed after such an action.
+ *
+ * @return The O entry of page object's additional actions dictionary.
+ */
+ public PDAction getO()
+ {
+ COSDictionary o = (COSDictionary)actions.getDictionaryObject( "O" );
+ PDAction retval = null;
+ if( o != null )
+ {
+ retval = PDActionFactory.createAction( o );
+ }
+ return retval;
+ }
+
+ /**
+ * This will set an action to be performed when the page
+ * is opened. This action is independent of any that may be
+ * defined by the OpenAction entry in the document catalog,
+ * and is executed after such an action.
+ *
+ * @param o The action to be performed.
+ */
+ public void setO( PDAction o )
+ {
+ actions.setItem( "O", o );
+ }
+
+ /**
+ * This will get an action to be performed when the page
+ * is closed. This action applies to the page being closed,
+ * and is executed before any other page opened.
+ *
+ * @return The C entry of page object's additional actions dictionary.
+ */
+ public PDAction getC()
+ {
+ COSDictionary c = (COSDictionary)actions.getDictionaryObject( "C" );
+ PDAction retval = null;
+ if( c != null )
+ {
+ retval = PDActionFactory.createAction( c );
+ }
+ return retval;
+ }
+
+ /**
+ * This will set an action to be performed when the page
+ * is closed. This action applies to the page being closed,
+ * and is executed before any other page opened.
+ *
+ * @param c The action to be performed.
+ */
+ public void setC( PDAction c )
+ {
+ actions.setItem( "C", c );
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/interactive/action/package.html b/src/main/java/org/pdfbox/pdmodel/interactive/action/package.html
new file mode 100644
index 0000000..63cbfc0
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/interactive/action/package.html
@@ -0,0 +1,9 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head>
+
+</head>
+<body>
+This package represents actions that can be performed in a PDF document.
+</body>
+</html>
diff --git a/src/main/java/org/pdfbox/pdmodel/interactive/action/type/PDAction.java b/src/main/java/org/pdfbox/pdmodel/interactive/action/type/PDAction.java
new file mode 100644
index 0000000..21d40fc
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/interactive/action/type/PDAction.java
@@ -0,0 +1,187 @@
+/**
+ * Copyright (c) 2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.interactive.action.type;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.pdfbox.cos.COSArray;
+import org.pdfbox.cos.COSBase;
+import org.pdfbox.cos.COSDictionary;
+
+import org.pdfbox.pdmodel.common.COSObjectable;
+import org.pdfbox.pdmodel.common.COSArrayList;
+import org.pdfbox.pdmodel.interactive.action.PDActionFactory;
+
+/**
+ * This represents an action that can be executed in a PDF document.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @author Panagiotis Toumasis (ptoumasis@mail.gr)
+ * @version $Revision: 1.1 $
+ */
+public abstract class PDAction implements COSObjectable
+{
+ /**
+ * The type of PDF object.
+ */
+ public static final String TYPE = "Action";
+
+ /**
+ * The action dictionary.
+ */
+ protected COSDictionary action;
+
+ /**
+ * Default constructor.
+ */
+ public PDAction()
+ {
+ action = new COSDictionary();
+ setType( TYPE );
+ }
+
+ /**
+ * Constructor.
+ *
+ * @param a The action dictionary.
+ */
+ public PDAction( COSDictionary a )
+ {
+ action = a;
+ }
+
+ /**
+ * Convert this standard java object to a COS object.
+ *
+ * @return The cos object that matches this Java object.
+ */
+ public COSBase getCOSObject()
+ {
+ return action;
+ }
+
+ /**
+ * Convert this standard java object to a COS object.
+ *
+ * @return The cos object that matches this Java object.
+ */
+ public COSDictionary getCOSDictionary()
+ {
+ return action;
+ }
+
+ /**
+ * This will get the type of PDF object that the actions dictionary describes.
+ * If present must be Action for an action dictionary.
+ *
+ * @return The Type of PDF object.
+ */
+ public String getType()
+ {
+ return action.getNameAsString( "Type" );
+ }
+
+ /**
+ * This will set the type of PDF object that the actions dictionary describes.
+ * If present must be Action for an action dictionary.
+ *
+ * @param type The new Type for the PDF object.
+ */
+ public void setType( String type )
+ {
+ action.setName( "Type", type );
+ }
+
+ /**
+ * This will get the type of action that the actions dictionary describes.
+ * If present, must be Action for an action dictionary.
+ *
+ * @return The S entry of actions dictionary.
+ */
+ public String getSubType()
+ {
+ return action.getNameAsString( "S" );
+ }
+
+ /**
+ * This will set the type of action that the actions dictionary describes.
+ * If present, must be Action for an action dictionary.
+ *
+ * @param s The new type of action.
+ */
+ public void setSubType( String s )
+ {
+ action.setName( "S", s );
+ }
+
+ /**
+ * This will get the next action, or sequence of actions, to be performed after this one.
+ * The value is either a single action dictionary or an array of action dictionaries
+ * to be performed in order.
+ *
+ * @return The Next action or sequence of actions.
+ */
+ public List getNext()
+ {
+ List retval = null;
+ COSBase next = action.getDictionaryObject( "Next" );
+ if( next instanceof COSDictionary )
+ {
+ PDAction pdAction = PDActionFactory.createAction( (COSDictionary) next );
+ retval = new COSArrayList(pdAction, next, action, "Next" );
+ }
+ else if( next instanceof COSArray )
+ {
+ COSArray array = (COSArray)next;
+ List actions = new ArrayList();
+ for( int i=0; i<array.size(); i++ )
+ {
+ actions.add( PDActionFactory.createAction( (COSDictionary) array.getObject( i )));
+ }
+ retval = new COSArrayList( actions, array );
+ }
+
+ return retval;
+ }
+
+ /**
+ * This will set the next action, or sequence of actions, to be performed after this one.
+ * The value is either a single action dictionary or an array of action dictionaries
+ * to be performed in order.
+ *
+ * @param next The Next action or sequence of actions.
+ */
+ public void setNext( List next )
+ {
+ action.setItem( "Next", COSArrayList.converterToCOSArray( next ) );
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/interactive/action/type/PDActionGoTo.java b/src/main/java/org/pdfbox/pdmodel/interactive/action/type/PDActionGoTo.java
new file mode 100644
index 0000000..abf0ab5
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/interactive/action/type/PDActionGoTo.java
@@ -0,0 +1,92 @@
+/**
+ * Copyright (c) 2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.interactive.action.type;
+
+import java.io.IOException;
+
+import org.pdfbox.cos.COSDictionary;
+import org.pdfbox.pdmodel.interactive.documentnavigation.destination.PDDestination;
+
+/**
+ * This represents a go-to action that can be executed in a PDF document.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @author Panagiotis Toumasis (ptoumasis@mail.gr)
+ * @version $Revision: 1.1 $
+ */
+public class PDActionGoTo extends PDAction
+{
+ /**
+ * This type of action this object represents.
+ */
+ public static final String SUB_TYPE = "GoTo";
+
+ /**
+ * Default constructor.
+ */
+ public PDActionGoTo()
+ {
+ super();
+ setSubType( SUB_TYPE );
+ }
+
+ /**
+ * Constructor.
+ *
+ * @param a The action dictionary.
+ */
+ public PDActionGoTo( COSDictionary a )
+ {
+ super( a );
+ }
+
+ /**
+ * This will get the destination to jump to.
+ *
+ * @return The D entry of the specific go-to action dictionary.
+ *
+ * @throws IOException If there is an error creating the destination.
+ */
+ public PDDestination getDestination() throws IOException
+ {
+ return PDDestination.create( getCOSDictionary().getDictionaryObject( "D" ) );
+ }
+
+ /**
+ * This will set the destination to jump to.
+ *
+ * @param d The destination.
+ */
+ public void setDestination( PDDestination d )
+ {
+ getCOSDictionary().setItem( "D", d );
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/interactive/action/type/PDActionJavaScript.java b/src/main/java/org/pdfbox/pdmodel/interactive/action/type/PDActionJavaScript.java
new file mode 100644
index 0000000..3148dd3
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/interactive/action/type/PDActionJavaScript.java
@@ -0,0 +1,102 @@
+/**
+ * Copyright (c) 2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.interactive.action.type;
+
+import org.pdfbox.cos.COSDictionary;
+import org.pdfbox.pdmodel.common.PDTextStream;
+
+/**
+ * This represents a JavaScript action.
+ *
+ * @author Michael Schwarzenberger (mi2kee@gmail.com)
+ * @version $Revision: 1.1 $
+ */
+public class PDActionJavaScript extends PDAction
+{
+ /**
+ * This type of action this object represents.
+ */
+ public static final String SUB_TYPE = "JavaScript";
+
+ /**
+ * Constructor #1.
+ */
+ public PDActionJavaScript()
+ {
+ super();
+ setSubType( SUB_TYPE );
+ }
+
+ /**
+ * Constructor.
+ *
+ * @param js Some javascript code.
+ */
+ public PDActionJavaScript( String js )
+ {
+ this();
+ setAction( js );
+ }
+
+ /**
+ * Constructor #2.
+ *
+ * @param a The action dictionary.
+ */
+ public PDActionJavaScript(COSDictionary a)
+ {
+ super(a);
+ }
+
+ /**
+ * @param sAction The JavaScript.
+ */
+ public void setAction(PDTextStream sAction)
+ {
+ action.setItem("JS", sAction);
+ }
+
+ /**
+ * @param sAction The JavaScript.
+ */
+ public void setAction(String sAction)
+ {
+ action.setString("JS", sAction);
+ }
+
+ /**
+ * @return The Javascript Code.
+ */
+ public PDTextStream getAction()
+ {
+ return PDTextStream.createTextStream( action.getDictionaryObject("JS") );
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/interactive/action/type/PDActionLaunch.java b/src/main/java/org/pdfbox/pdmodel/interactive/action/type/PDActionLaunch.java
new file mode 100644
index 0000000..3c2ef74
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/interactive/action/type/PDActionLaunch.java
@@ -0,0 +1,244 @@
+/**
+ * Copyright (c) 2004-2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.interactive.action.type;
+
+import org.pdfbox.cos.COSDictionary;
+
+import org.pdfbox.pdmodel.common.filespecification.PDFileSpecification;
+
+/**
+ * This represents a launch action that can be executed in a PDF document.
+ *
+ * @author Ben Litchfield (ben@benlitchfield.com)
+ * @author Panagiotis Toumasis (ptoumasis@mail.gr)
+ * @version $Revision: 1.3 $
+ */
+public class PDActionLaunch extends PDAction
+{
+
+ /**
+ * This type of action this object represents.
+ */
+ public static final String SUB_TYPE = "Launch";
+
+ /**
+ * Default constructor.
+ */
+ public PDActionLaunch()
+ {
+ super();
+ setSubType( SUB_TYPE );
+ }
+
+ /**
+ * Constructor.
+ *
+ * @param a The action dictionary.
+ */
+ public PDActionLaunch( COSDictionary a )
+ {
+ super( a );
+ }
+
+ /**
+ * This will get the application to be launched or the document
+ * to be opened or printed. It is required if none of the entries
+ * Win, Mac or Unix is present. If this entry is absent and the
+ * viewer application does not understand any of the alternative
+ * entries it should do nothing.
+ *
+ * @return The F entry of the specific launch action dictionary.
+ */
+ public PDFileSpecification getFile()
+ {
+ return PDFileSpecification.createFS( getCOSDictionary().getDictionaryObject( "F" ) );
+ }
+
+ /**
+ * This will set the application to be launched or the document
+ * to be opened or printed. It is required if none of the entries
+ * Win, Mac or Unix is present. If this entry is absent and the
+ * viewer application does not understand any of the alternative
+ * entries it should do nothing.
+ *
+ * @param fs The file specification.
+ */
+ public void setFile( PDFileSpecification fs )
+ {
+ getCOSDictionary().setItem( "F", fs );
+ }
+
+ /**
+ * This will get a dictionary containing Windows-specific launch parameters.
+ *
+ * @return The Win entry of of the specific launch action dictionary.
+ */
+ public PDWindowsLaunchParams getWinLaunchParams()
+ {
+ COSDictionary win = (COSDictionary)action.getDictionaryObject( "Win" );
+ PDWindowsLaunchParams retval = null;
+ if( win != null )
+ {
+ retval = new PDWindowsLaunchParams( win );
+ }
+ return retval;
+ }
+
+ /**
+ * This will set a dictionary containing Windows-specific launch parameters.
+ *
+ * @param win The action to be performed.
+ */
+ public void setWinLaunchParams( PDWindowsLaunchParams win )
+ {
+ action.setItem( "Win", win );
+ }
+
+ /**
+ * This will get the file name to be launched or the document to be opened
+ * or printed, in standard Windows pathname format. If the name string includes
+ * a backslash character (\), the backslash must itself be preceded by a backslash.
+ * This value must be a single string; it is not a file specification.
+ *
+ * @return The F entry of the specific Windows launch parameter dictionary.
+ */
+ public String getF()
+ {
+ return action.getString( "F" );
+ }
+
+ /**
+ * This will set the file name to be launched or the document to be opened
+ * or printed, in standard Windows pathname format. If the name string includes
+ * a backslash character (\), the backslash must itself be preceded by a backslash.
+ * This value must be a single string; it is not a file specification.
+ *
+ * @param f The file name to be launched.
+ */
+ public void setF( String f )
+ {
+ action.setString( "F", f );
+ }
+
+ /**
+ * This will get the string specifying the default directory in standard DOS syntax.
+ *
+ * @return The D entry of the specific Windows launch parameter dictionary.
+ */
+ public String getD()
+ {
+ return action.getString( "D" );
+ }
+
+ /**
+ * This will set the string specifying the default directory in standard DOS syntax.
+ *
+ * @param d The default directory.
+ */
+ public void setD( String d )
+ {
+ action.setString( "D", d );
+ }
+
+ /**
+ * This will get the string specifying the operation to perform:
+ * open to open a document
+ * print to print a document
+ * If the F entry designates an application instead of a document, this entry
+ * is ignored and the application is launched. Default value: open.
+ *
+ * @return The O entry of the specific Windows launch parameter dictionary.
+ */
+ public String getO()
+ {
+ return action.getString( "O" );
+ }
+
+ /**
+ * This will set the string specifying the operation to perform:
+ * open to open a document
+ * print to print a document
+ * If the F entry designates an application instead of a document, this entry
+ * is ignored and the application is launched. Default value: open.
+ *
+ * @param o The operation to perform.
+ */
+ public void setO( String o )
+ {
+ action.setString( "O", o );
+ }
+
+ /**
+ * This will get a parameter string to be passed to the application designated by the F entry.
+ * This entry should be omitted if F designates a document.
+ *
+ * @return The P entry of the specific Windows launch parameter dictionary.
+ */
+ public String getP()
+ {
+ return action.getString( "P" );
+ }
+
+ /**
+ * This will set a parameter string to be passed to the application designated by the F entry.
+ * This entry should be omitted if F designates a document.
+ *
+ * @param p The parameter string.
+ */
+ public void setP( String p )
+ {
+ action.setString( "P", p );
+ }
+
+ /**
+ * This will specify whether to open the destination document in a new window.
+ * If this flag is false, the destination document will replace the current
+ * document in the same window. If this entry is absent, the viewer application
+ * should behave in accordance with the current user preference. This entry is
+ * ignored if the file designated by the F entry is not a PDF document.
+ *
+ * @return A flag specifying whether to open the destination document in a new window.
+ */
+ public boolean shouldOpenInNewWindow()
+ {
+ return action.getBoolean( "NewWindow", true );
+ }
+
+ /**
+ * This will specify the destination document to open in a new window.
+ *
+ * @param value The flag value.
+ */
+ public void setOpenInNewWindow( boolean value )
+ {
+ action.setBoolean( "NewWindow", value );
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/interactive/action/type/PDActionRemoteGoTo.java b/src/main/java/org/pdfbox/pdmodel/interactive/action/type/PDActionRemoteGoTo.java
new file mode 100644
index 0000000..73dbc6c
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/interactive/action/type/PDActionRemoteGoTo.java
@@ -0,0 +1,187 @@
+/**
+ * Copyright (c) 2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.interactive.action.type;
+
+import org.pdfbox.cos.COSBase;
+import org.pdfbox.cos.COSDictionary;
+
+import org.pdfbox.pdmodel.common.filespecification.PDFileSpecification;
+
+/**
+ * This represents a remote go-to action that can be executed in a PDF document.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @author Panagiotis Toumasis (ptoumasis@mail.gr)
+ * @version $Revision: 1.2 $
+ */
+public class PDActionRemoteGoTo extends PDAction
+{
+ /**
+ * This type of action this object represents.
+ */
+ public static final String SUB_TYPE = "GoToR";
+
+ /**
+ * Default constructor.
+ */
+ public PDActionRemoteGoTo()
+ {
+ action = new COSDictionary();
+ setSubType( SUB_TYPE );
+ }
+
+ /**
+ * Constructor.
+ *
+ * @param a The action dictionary.
+ */
+ public PDActionRemoteGoTo( COSDictionary a )
+ {
+ super( a );
+ }
+
+ /**
+ * Convert this standard java object to a COS object.
+ *
+ * @return The cos object that matches this Java object.
+ */
+ public COSBase getCOSObject()
+ {
+ return action;
+ }
+
+ /**
+ * Convert this standard java object to a COS object.
+ *
+ * @return The cos object that matches this Java object.
+ */
+ public COSDictionary getCOSDictionary()
+ {
+ return action;
+ }
+
+ /**
+ * This will get the type of action that the actions dictionary describes.
+ * It must be GoToR for a remote go-to action.
+ *
+ * @return The S entry of the specific remote go-to action dictionary.
+ */
+ public String getS()
+ {
+ return action.getNameAsString( "S" );
+ }
+
+ /**
+ * This will set the type of action that the actions dictionary describes.
+ * It must be GoToR for a remote go-to action.
+ *
+ * @param s The remote go-to action.
+ */
+ public void setS( String s )
+ {
+ action.setName( "S", s );
+ }
+
+ /**
+ * This will get the file in which the destination is located.
+ *
+ * @return The F entry of the specific remote go-to action dictionary.
+ */
+ public PDFileSpecification getFile()
+ {
+ return PDFileSpecification.createFS( action.getDictionaryObject( "F" ) );
+ }
+
+ /**
+ * This will set the file in which the destination is located.
+ *
+ * @param fs The file specification.
+ */
+ public void setFile( PDFileSpecification fs )
+ {
+ action.setItem( "F", fs );
+ }
+
+ /**
+ * This will get the destination to jump to.
+ * If the value is an array defining an explicit destination,
+ * its first element must be a page number within the remote
+ * document rather than an indirect reference to a page object
+ * in the current document. The first page is numbered 0.
+ *
+ * @return The D entry of the specific remote go-to action dictionary.
+ */
+
+ // Array or String.
+ public COSBase getD()
+ {
+ return action.getDictionaryObject( "D" );
+ }
+
+ /**
+ * This will set the destination to jump to.
+ * If the value is an array defining an explicit destination,
+ * its first element must be a page number within the remote
+ * document rather than an indirect reference to a page object
+ * in the current document. The first page is numbered 0.
+ *
+ * @param d The destination.
+ */
+
+ // In case the value is an array.
+ public void setD( COSBase d )
+ {
+ action.setItem( "D", d );
+ }
+
+ /**
+ * This will specify whether to open the destination document in a new window.
+ * If this flag is false, the destination document will replace the current
+ * document in the same window. If this entry is absent, the viewer application
+ * should behave in accordance with the current user preference.
+ *
+ * @return A flag specifying whether to open the destination document in a new window.
+ */
+ public boolean shouldOpenInNewWindow()
+ {
+ return action.getBoolean( "NewWindow", true );
+ }
+
+ /**
+ * This will specify the destination document to open in a new window.
+ *
+ * @param value The flag value.
+ */
+ public void setOpenInNewWindow( boolean value )
+ {
+ action.setBoolean( "NewWindow", value );
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/interactive/action/type/PDActionURI.java b/src/main/java/org/pdfbox/pdmodel/interactive/action/type/PDActionURI.java
new file mode 100644
index 0000000..b98495d
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/interactive/action/type/PDActionURI.java
@@ -0,0 +1,183 @@
+/**
+ * Copyright (c) 2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.interactive.action.type;
+
+import org.pdfbox.cos.COSBase;
+import org.pdfbox.cos.COSDictionary;
+
+/**
+ * This represents a URI action that can be executed in a PDF document.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @author Panagiotis Toumasis (ptoumasis@mail.gr)
+ * @version $Revision: 1.2 $
+ */
+public class PDActionURI extends PDAction
+{
+ /**
+ * This type of action this object represents.
+ */
+ public static final String SUB_TYPE = "URI";
+
+ /**
+ * Default constructor.
+ */
+ public PDActionURI()
+ {
+ action = new COSDictionary();
+ setSubType( SUB_TYPE );
+ }
+
+ /**
+ * Constructor.
+ *
+ * @param a The action dictionary.
+ */
+ public PDActionURI( COSDictionary a )
+ {
+ super( a );
+ }
+
+ /**
+ * Convert this standard java object to a COS object.
+ *
+ * @return The cos object that matches this Java object.
+ */
+ public COSBase getCOSObject()
+ {
+ return action;
+ }
+
+ /**
+ * Convert this standard java object to a COS object.
+ *
+ * @return The cos object that matches this Java object.
+ */
+ public COSDictionary getCOSDictionary()
+ {
+ return action;
+ }
+
+ /**
+ * This will get the type of action that the actions dictionary describes.
+ * It must be URI for a URI action.
+ *
+ * @return The S entry of the specific URI action dictionary.
+ */
+ public String getS()
+ {
+ return action.getNameAsString( "S" );
+ }
+
+ /**
+ * This will set the type of action that the actions dictionary describes.
+ * It must be URI for a URI action.
+ *
+ * @param s The URI action.
+ */
+ public void setS( String s )
+ {
+ action.setName( "S", s );
+ }
+
+ /**
+ * This will get the uniform resource identifier to resolve, encoded in 7-bit ASCII.
+ *
+ * @return The URI entry of the specific URI action dictionary.
+ */
+ public String getURI()
+ {
+ return action.getString( "URI" );
+ }
+
+ /**
+ * This will set the uniform resource identifier to resolve, encoded in 7-bit ASCII.
+ *
+ * @param uri The uniform resource identifier.
+ */
+ public void setURI( String uri )
+ {
+ action.setString( "URI", uri );
+ }
+
+ /**
+ * This will specify whether to track the mouse position when the URI is resolved.
+ * Default value: false.
+ * This entry applies only to actions triggered by the user's clicking an annotation;
+ * it is ignored for actions associated with outline items or with a document's OpenAction entry.
+ *
+ * @return A flag specifying whether to track the mouse position when the URI is resolved.
+ */
+ public boolean shouldTrackMousePosition()
+ {
+ return action.getBoolean( "MousePosition", true );
+ }
+
+ /**
+ * This will specify whether to track the mouse position when the URI is resolved.
+ *
+ * @param value The flag value.
+ */
+ public void setTrackMousePosition( boolean value )
+ {
+ action.setBoolean( "MousePosition", value );
+ }
+
+ /**
+ * This will get the base URI to be used in resolving relative URI references.
+ * URI actions within the document may specify URIs in partial form, to be interpreted
+ * relative to this base address. If no base URI is specified, such partial URIs
+ * will be interpreted relative to the location of the document itself.
+ * The use of this entry is parallel to that of the body element &lt;BASE&gt;, as described
+ * in the HTML 4.01 Specification.
+ *
+ * @return The URI entry of the specific URI dictionary.
+ */
+ public String getBase()
+ {
+ return action.getString( "Base" );
+ }
+
+ /**
+ * This will set the base URI to be used in resolving relative URI references.
+ * URI actions within the document may specify URIs in partial form, to be interpreted
+ * relative to this base address. If no base URI is specified, such partial URIs
+ * will be interpreted relative to the location of the document itself.
+ * The use of this entry is parallel to that of the body element &lt;BASE&gt;, as described
+ * in the HTML 4.01 Specification.
+ *
+ * @param base The the base URI to be used.
+ */
+ public void setBase( String base )
+ {
+ action.setString( "Base", base );
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/interactive/action/type/PDWindowsLaunchParams.java b/src/main/java/org/pdfbox/pdmodel/interactive/action/type/PDWindowsLaunchParams.java
new file mode 100644
index 0000000..7af4ff2
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/interactive/action/type/PDWindowsLaunchParams.java
@@ -0,0 +1,180 @@
+/**
+ * Copyright (c) 2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.interactive.action.type;
+
+import org.pdfbox.cos.COSBase;
+import org.pdfbox.cos.COSDictionary;
+
+import org.pdfbox.pdmodel.common.COSObjectable;
+
+/**
+ * Launch paramaters for the windows OS.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.1 $
+ */
+public class PDWindowsLaunchParams implements COSObjectable
+{
+ /**
+ * The open operation for the launch.
+ */
+ public static final String OPERATION_OPEN = "open";
+ /**
+ * The print operation for the lanuch.
+ */
+ public static final String OPERATION_PRINT = "print";
+
+ /**
+ * The params dictionary.
+ */
+ protected COSDictionary params;
+
+ /**
+ * Default constructor.
+ */
+ public PDWindowsLaunchParams()
+ {
+ params = new COSDictionary();
+ }
+
+ /**
+ * Constructor.
+ *
+ * @param p The params dictionary.
+ */
+ public PDWindowsLaunchParams( COSDictionary p )
+ {
+ params = p;
+ }
+
+ /**
+ * Convert this standard java object to a COS object.
+ *
+ * @return The cos object that matches this Java object.
+ */
+ public COSBase getCOSObject()
+ {
+ return params;
+ }
+
+ /**
+ * Convert this standard java object to a COS object.
+ *
+ * @return The cos object that matches this Java object.
+ */
+ public COSDictionary getCOSDictionary()
+ {
+ return params;
+ }
+
+ /**
+ * The file to launch.
+ *
+ * @return The executable/document to launch.
+ */
+ public String getFilename()
+ {
+ return params.getString( "F" );
+ }
+
+ /**
+ * Set the file to launch.
+ *
+ * @param file The executable/document to launch.
+ */
+ public void setFilename( String file )
+ {
+ params.setString( "F", file );
+ }
+
+ /**
+ * The dir to launch from.
+ *
+ * @return The dir of the executable/document to launch.
+ */
+ public String getDirectory()
+ {
+ return params.getString( "D" );
+ }
+
+ /**
+ * Set the dir to launch from.
+ *
+ * @param dir The dir of the executable/document to launch.
+ */
+ public void setDirectory( String dir )
+ {
+ params.setString( "D", dir );
+ }
+
+ /**
+ * Get the operation to perform on the file. This method will not return null,
+ * OPERATION_OPEN is the default.
+ *
+ * @return The operation to perform for the file.
+ * @see PDWindowsLaunchParams#OPERATION_OPEN
+ * @see PDWindowsLaunchParams#OPERATION_PRINT
+ */
+ public String getOperation()
+ {
+ return params.getString( "O", OPERATION_OPEN );
+ }
+
+ /**
+ * Set the operation to perform..
+ *
+ * @param op The operation to perform on the file.
+ */
+ public void setOperation( String op )
+ {
+ params.setString( "D", op );
+ }
+
+ /**
+ * A parameter to pass the executable.
+ *
+ * @return The parameter to pass the executable.
+ */
+ public String getExecuteParam()
+ {
+ return params.getString( "P" );
+ }
+
+ /**
+ * Set the parameter to pass the executable.
+ *
+ * @param param The parameter for the executable.
+ */
+ public void setExecuteParam( String param )
+ {
+ params.setString( "P", param );
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/interactive/action/type/package.html b/src/main/java/org/pdfbox/pdmodel/interactive/action/type/package.html
new file mode 100644
index 0000000..f0db5c3
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/interactive/action/type/package.html
@@ -0,0 +1,9 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head>
+
+</head>
+<body>
+This package contains all of the available PDF action types.
+</body>
+</html>
diff --git a/src/main/java/org/pdfbox/pdmodel/interactive/annotation/PDAnnotation.java b/src/main/java/org/pdfbox/pdmodel/interactive/annotation/PDAnnotation.java
new file mode 100644
index 0000000..4d245c0
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/interactive/annotation/PDAnnotation.java
@@ -0,0 +1,503 @@
+/**
+ * Copyright (c) 2003-2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.interactive.annotation;
+
+import java.io.IOException;
+
+import org.pdfbox.cos.COSArray;
+import org.pdfbox.cos.COSDictionary;
+import org.pdfbox.cos.COSName;
+
+import org.pdfbox.pdmodel.common.COSObjectable;
+import org.pdfbox.pdmodel.common.PDRectangle;
+import org.pdfbox.pdmodel.interactive.action.PDAdditionalActions;
+import org.pdfbox.util.BitFlagHelper;
+import org.pdfbox.cos.COSBase;
+
+/**
+ * This class represents a PDF annotation.
+ *
+ * @author Ben Litchfield (ben@benlitchfield.com)
+ * @version $Revision: 1.10 $
+ */
+public abstract class PDAnnotation implements COSObjectable
+{
+ /**
+ * An annotation flag.
+ */
+ public static final int FLAG_INVISIBLE = 1 << 0;
+ /**
+ * An annotation flag.
+ */
+ public static final int FLAG_HIDDEN = 1 << 1;
+ /**
+ * An annotation flag.
+ */
+ public static final int FLAG_PRINTED = 1 << 2;
+ /**
+ * An annotation flag.
+ */
+ public static final int FLAG_NO_ZOOM = 1 << 3;
+ /**
+ * An annotation flag.
+ */
+ public static final int FLAG_NO_ROTATE = 1 << 4;
+ /**
+ * An annotation flag.
+ */
+ public static final int FLAG_NO_VIEW = 1 << 5;
+ /**
+ * An annotation flag.
+ */
+ public static final int FLAG_READ_ONLY = 1 << 6;
+ /**
+ * An annotation flag.
+ */
+ public static final int FLAG_LOCKED = 1 << 7;
+ /**
+ * An annotation flag.
+ */
+ public static final int FLAG_TOGGLE_NO_VIEW = 1 << 8;
+
+
+
+ private COSDictionary dictionary;
+
+ /**
+ * Create the correct annotation from the base COS object.
+ *
+ * @param base The COS object that is the annotation.
+ * @return The correctly typed annotation object.
+ * @throws IOException If there is an error while creating the annotation.
+ */
+ public static PDAnnotation createAnnotation( COSBase base ) throws IOException
+ {
+ PDAnnotation annot = null;
+ if( base instanceof COSDictionary )
+ {
+ COSDictionary annotDic = (COSDictionary)base;
+ String subtype = annotDic.getString( COSName.SUBTYPE );
+ if( subtype.equals( PDAnnotationRubberStamp.SUB_TYPE ) )
+ {
+ annot = new PDAnnotationRubberStamp(annotDic);
+ }
+ else
+ {
+ annot = new PDAnnotationUnknown( annotDic );
+ }
+ }
+ else
+ {
+ throw new IOException( "Error: Unknown annotation type " + base );
+ }
+
+ return annot;
+ }
+
+ /**
+ * Constructor.
+ */
+ public PDAnnotation()
+ {
+ dictionary = new COSDictionary();
+ dictionary.setItem( COSName.TYPE, COSName.getPDFName( "Annot" ) );
+ }
+
+ /**
+ * Constructor.
+ *
+ * @param dict The annotations dictionary.
+ */
+ public PDAnnotation( COSDictionary dict )
+ {
+ dictionary = dict;
+ }
+
+ /**
+ * returns the dictionary.
+ * @return the dictionary
+ */
+ public COSDictionary getDictionary()
+ {
+ return dictionary;
+ }
+
+ /**
+ * The annotation rectangle, defining the location of the annotation
+ * on the page in default user space units. This is usually required and should
+ * not return null on valid PDF documents. But where this is a parent form field
+ * with children, such as radio button collections then the rectangle will be null.
+ *
+ * @return The Rect value of this annotation.
+ */
+ public PDRectangle getRectangle()
+ {
+ COSArray rectArray = (COSArray)dictionary.getDictionaryObject( COSName.getPDFName( "Rect" ) );
+ PDRectangle rectangle = null;
+ if( rectArray != null )
+ {
+ rectangle = new PDRectangle( rectArray );
+ }
+ return rectangle;
+ }
+
+ /**
+ * This will set the rectangle for this annotation.
+ *
+ * @param rectangle The new rectangle values.
+ */
+ public void setRectangle( PDRectangle rectangle )
+ {
+ dictionary.setItem( COSName.getPDFName( "Rect" ), rectangle.getCOSArray() );
+ }
+
+ /**
+ * This will get the flags for this field.
+ *
+ * @return flags The set of flags.
+ */
+ public int getAnnotationFlags()
+ {
+ return getDictionary().getInt( "F", 0 );
+ }
+
+ /**
+ * This will set the flags for this field.
+ *
+ * @param flags The new flags.
+ */
+ public void setAnnotationFlags( int flags )
+ {
+ getDictionary().setInt( "F", flags );
+ }
+
+ /**
+ * Interface method for COSObjectable.
+ *
+ * @return This object as a standard COS object.
+ */
+ public COSBase getCOSObject()
+ {
+ return getDictionary();
+ }
+
+ /**
+ * This will get the name of the current appearance stream if any.
+ *
+ * @return The name of the appearance stream.
+ */
+ public String getAppearanceStream()
+ {
+ String retval = null;
+ COSName name = (COSName)getDictionary().getDictionaryObject( COSName.getPDFName( "AS" ) );
+ if( name != null )
+ {
+ retval = name.getName();
+ }
+ return retval;
+ }
+
+ /**
+ * This will set the annotations appearance stream name.
+ *
+ * @param as The name of the appearance stream.
+ */
+ public void setAppearanceStream( String as )
+ {
+ if( as == null )
+ {
+ getDictionary().removeItem( COSName.getPDFName( "AS" ) );
+ }
+ else
+ {
+ getDictionary().setItem( COSName.getPDFName( "AS" ), COSName.getPDFName( as ) );
+ }
+ }
+
+ /**
+ * This will get the appearance dictionary associated with this annotation.
+ * This may return null.
+ *
+ * @return This annotations appearance.
+ */
+ public PDAppearanceDictionary getAppearance()
+ {
+ PDAppearanceDictionary ap = null;
+ COSDictionary apDic = (COSDictionary)dictionary.getDictionaryObject( COSName.getPDFName( "AP" ) );
+ if( apDic != null )
+ {
+ ap = new PDAppearanceDictionary( apDic );
+ }
+ return ap;
+ }
+
+ /**
+ * This will set the appearance associated with this annotation.
+ *
+ * @param appearance The appearance dictionary for this annotation.
+ */
+ public void setAppearance( PDAppearanceDictionary appearance )
+ {
+ COSDictionary ap = null;
+ if( appearance != null )
+ {
+ ap = appearance.getDictionary();
+ }
+ dictionary.setItem( COSName.getPDFName( "AP" ), ap );
+ }
+
+ /**
+ * Get the invisible flag.
+ *
+ * @return The invisible flag.
+ */
+ public boolean isInvisible()
+ {
+ return BitFlagHelper.getFlag( getDictionary(), "F", FLAG_INVISIBLE );
+ }
+
+ /**
+ * Set the invisible flag.
+ *
+ * @param invisible The new invisible flag.
+ */
+ public void setInvisible( boolean invisible )
+ {
+ BitFlagHelper.setFlag( getDictionary(), "F", FLAG_INVISIBLE, invisible );
+ }
+
+ /**
+ * Get the hidden flag.
+ *
+ * @return The hidden flag.
+ */
+ public boolean isHidden()
+ {
+ return BitFlagHelper.getFlag( getDictionary(), "F", FLAG_HIDDEN );
+ }
+
+ /**
+ * Set the hidden flag.
+ *
+ * @param hidden The new hidden flag.
+ */
+ public void setHidden( boolean hidden )
+ {
+ BitFlagHelper.setFlag( getDictionary(), "F", FLAG_HIDDEN, hidden );
+ }
+
+ /**
+ * Get the printed flag.
+ *
+ * @return The printed flag.
+ */
+ public boolean isPrinted()
+ {
+ return BitFlagHelper.getFlag( getDictionary(), "F", FLAG_PRINTED );
+ }
+
+ /**
+ * Set the printed flag.
+ *
+ * @param printed The new printed flag.
+ */
+ public void setPrinted( boolean printed )
+ {
+ BitFlagHelper.setFlag( getDictionary(), "F", FLAG_PRINTED, printed );
+ }
+
+ /**
+ * Get the noZoom flag.
+ *
+ * @return The noZoom flag.
+ */
+ public boolean isNoZoom()
+ {
+ return BitFlagHelper.getFlag( getDictionary(), "F", FLAG_NO_ZOOM );
+ }
+
+ /**
+ * Set the noZoom flag.
+ *
+ * @param noZoom The new noZoom flag.
+ */
+ public void setNoZoom( boolean noZoom )
+ {
+ BitFlagHelper.setFlag( getDictionary(), "F", FLAG_NO_ZOOM, noZoom );
+ }
+
+ /**
+ * Get the noRotate flag.
+ *
+ * @return The noRotate flag.
+ */
+ public boolean isNoRotate()
+ {
+ return BitFlagHelper.getFlag( getDictionary(), "F", FLAG_NO_ROTATE );
+ }
+
+ /**
+ * Set the noRotate flag.
+ *
+ * @param noRotate The new noRotate flag.
+ */
+ public void setNoRotate( boolean noRotate )
+ {
+ BitFlagHelper.setFlag( getDictionary(), "F", FLAG_NO_ROTATE, noRotate );
+ }
+
+ /**
+ * Get the noView flag.
+ *
+ * @return The noView flag.
+ */
+ public boolean isNoView()
+ {
+ return BitFlagHelper.getFlag( getDictionary(), "F", FLAG_NO_VIEW );
+ }
+
+ /**
+ * Set the noView flag.
+ *
+ * @param noView The new noView flag.
+ */
+ public void setNoView( boolean noView )
+ {
+ BitFlagHelper.setFlag( getDictionary(), "F", FLAG_NO_VIEW, noView );
+ }
+
+ /**
+ * Get the readOnly flag.
+ *
+ * @return The readOnly flag.
+ */
+ public boolean isReadOnly()
+ {
+ return BitFlagHelper.getFlag( getDictionary(), "F", FLAG_READ_ONLY );
+ }
+
+ /**
+ * Set the readOnly flag.
+ *
+ * @param readOnly The new readOnly flag.
+ */
+ public void setReadOnly( boolean readOnly )
+ {
+ BitFlagHelper.setFlag( getDictionary(), "F", FLAG_READ_ONLY, readOnly );
+ }
+
+ /**
+ * Get the locked flag.
+ *
+ * @return The locked flag.
+ */
+ public boolean isLocked()
+ {
+ return BitFlagHelper.getFlag( getDictionary(), "F", FLAG_LOCKED );
+ }
+
+ /**
+ * Set the locked flag.
+ *
+ * @param locked The new locked flag.
+ */
+ public void setLocked( boolean locked )
+ {
+ BitFlagHelper.setFlag( getDictionary(), "F", FLAG_LOCKED, locked );
+ }
+
+ /**
+ * Get the toggleNoView flag.
+ *
+ * @return The toggleNoView flag.
+ */
+ public boolean isToggleNoView()
+ {
+ return BitFlagHelper.getFlag( getDictionary(), "F", FLAG_TOGGLE_NO_VIEW );
+ }
+
+ /**
+ * Set the toggleNoView flag.
+ *
+ * @param toggleNoView The new toggleNoView flag.
+ */
+ public void setToggleNoView( boolean toggleNoView )
+ {
+ BitFlagHelper.setFlag( getDictionary(), "F", FLAG_TOGGLE_NO_VIEW, toggleNoView );
+ }
+
+ /**
+ * Get the additional actions for this field. This will return null
+ * if there are no additional actions for this field.
+ *
+ * @return The actions of the field.
+ */
+ public PDAdditionalActions getActions()
+ {
+ COSDictionary aa = (COSDictionary)dictionary.getDictionaryObject( "AA" );
+ PDAdditionalActions retval = null;
+ if( aa != null )
+ {
+ retval = new PDAdditionalActions( aa );
+ }
+ return retval;
+ }
+
+ /**
+ * Set the actions of the field.
+ *
+ * @param actions The field actions.
+ */
+ public void setActions( PDAdditionalActions actions )
+ {
+ dictionary.setItem( "AA", actions );
+ }
+
+ /**
+ * Get the "contents" of the field.
+ *
+ * @return the value of the contents
+ */
+ public String getContents()
+ {
+ return dictionary.getString(COSName.CONTENTS);
+ }
+
+ /**
+ * Set the "contents" of the field.
+ *
+ * @param value the value of the contents.
+ */
+ public void setContents( String value)
+ {
+ dictionary.setString(COSName.CONTENTS, value);
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/interactive/annotation/PDAnnotationRubberStamp.java b/src/main/java/org/pdfbox/pdmodel/interactive/annotation/PDAnnotationRubberStamp.java
new file mode 100644
index 0000000..089b19f
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/interactive/annotation/PDAnnotationRubberStamp.java
@@ -0,0 +1,153 @@
+/**
+ * Copyright (c) 2003, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.interactive.annotation;
+
+import org.pdfbox.cos.COSDictionary;
+import org.pdfbox.cos.COSName;
+
+/**
+ * This is the class that represents a widget.
+ *
+ * @author Paul King
+ * @version $Revision: 1.1 $
+ */
+public class PDAnnotationRubberStamp extends PDAnnotation
+{
+
+ /*
+ * The various values of the rubber stamp as defined in
+ * the PDF 1.6 reference Table 8.28
+ */
+
+ /**
+ * Constant for the name of a rubber stamp.
+ */
+ public static final String NAME_APPROVED = "Approved";
+ /**
+ * Constant for the name of a rubber stamp.
+ */
+ public static final String NAME_EXPERIMENTAL = "Experimental";
+ /**
+ * Constant for the name of a rubber stamp.
+ */
+ public static final String NAME_NOT_APPROVED = "NotApproved";
+ /**
+ * Constant for the name of a rubber stamp.
+ */
+ public static final String NAME_AS_IS = "AsIs";
+ /**
+ * Constant for the name of a rubber stamp.
+ */
+ public static final String NAME_EXPIRED = "Expired";
+ /**
+ * Constant for the name of a rubber stamp.
+ */
+ public static final String NAME_NOT_FOR_PUBLIC_RELEASE = "NotForPublicRelease";
+ /**
+ * Constant for the name of a rubber stamp.
+ */
+ public static final String NAME_FOR_PUBLIC_RELEASE = "ForPublicRelease";
+ /**
+ * Constant for the name of a rubber stamp.
+ */
+ public static final String NAME_DRAFT = "Draft";
+ /**
+ * Constant for the name of a rubber stamp.
+ */
+ public static final String NAME_FOR_COMMENT = "ForComment";
+ /**
+ * Constant for the name of a rubber stamp.
+ */
+ public static final String NAME_TOP_SECRET = "TopSecret";
+ /**
+ * Constant for the name of a rubber stamp.
+ */
+ public static final String NAME_DEPARTMENTAL = "Departmental";
+ /**
+ * Constant for the name of a rubber stamp.
+ */
+ public static final String NAME_CONFIDENTIAL = "Confidential";
+ /**
+ * Constant for the name of a rubber stamp.
+ */
+ public static final String NAME_FINAL = "Final";
+ /**
+ * Constant for the name of a rubber stamp.
+ */
+ public static final String NAME_SOLD = "Sold";
+
+ /**
+ * The type of annotation.
+ */
+ public static final String SUB_TYPE = "Stamp";
+
+ /**
+ * Constructor.
+ */
+ public PDAnnotationRubberStamp()
+ {
+ super();
+ getDictionary().setItem( COSName.SUBTYPE, COSName.getPDFName( SUB_TYPE ) );
+ }
+
+ /**
+ * Creates a Rubber Stamp annotation from a COSDictionary, expected to be
+ * a correct object definition.
+ *
+ * @param field the PDF objet to represent as a field.
+ */
+ public PDAnnotationRubberStamp(COSDictionary field)
+ {
+ super( field );
+ }
+
+ /**
+ * This will set the name (and hence appearance, AP taking precedence)
+ * For this annotation. See the NAME_XXX constants for valid values.
+ *
+ * @param name The name of the rubber stamp.
+ */
+ public void setName( String name )
+ {
+ getDictionary().setName(COSName.NAME, name);
+ }
+
+ /**
+ * This will retrieve the name (and hence appearance, AP taking precedence)
+ * For this annotation. The default is DRAFT.
+ *
+ * @return The name of this rubber stamp, see the NAME_XXX constants.
+ */
+ public String getName()
+ {
+ return getDictionary().getNameAsString(COSName.NAME, NAME_DRAFT);
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/interactive/annotation/PDAnnotationUnknown.java b/src/main/java/org/pdfbox/pdmodel/interactive/annotation/PDAnnotationUnknown.java
new file mode 100644
index 0000000..408f5fb
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/interactive/annotation/PDAnnotationUnknown.java
@@ -0,0 +1,54 @@
+/**
+ * Copyright (c) 2003, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.interactive.annotation;
+
+import org.pdfbox.cos.COSDictionary;
+
+/**
+ * This is the class that represents an arbitary Unknown Annotation type.
+ *
+ * @author Paul King
+ * @version $Revision: 1.1 $
+ */
+public class PDAnnotationUnknown extends PDAnnotation
+{
+
+ /**
+ * Creates an arbitary annotation from a COSDictionary, expected to be
+ * a correct object definition for some sort of annotation.
+ *
+ * @param dic The dictionary which represents this Annotation.
+ */
+ public PDAnnotationUnknown(COSDictionary dic)
+ {
+ super( dic );
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/interactive/annotation/PDAnnotationWidget.java b/src/main/java/org/pdfbox/pdmodel/interactive/annotation/PDAnnotationWidget.java
new file mode 100644
index 0000000..5faf983
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/interactive/annotation/PDAnnotationWidget.java
@@ -0,0 +1,65 @@
+/**
+ * Copyright (c) 2003, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.interactive.annotation;
+
+import org.pdfbox.cos.COSDictionary;
+import org.pdfbox.cos.COSName;
+
+/**
+ * This is the class that represents a widget.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.1 $
+ */
+public class PDAnnotationWidget extends PDAnnotation
+{
+
+ /**
+ * Constructor.
+ */
+ public PDAnnotationWidget()
+ {
+ super();
+ getDictionary().setItem( COSName.SUBTYPE, COSName.getPDFName( "Widget" ) );
+ }
+
+
+ /**
+ * Creates a PDWidget from a COSDictionary, expected to be
+ * a correct object definition for a field in PDF.
+ *
+ * @param field the PDF objet to represent as a field.
+ */
+ public PDAnnotationWidget(COSDictionary field)
+ {
+ super( field );
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/interactive/annotation/PDAppearanceDictionary.java b/src/main/java/org/pdfbox/pdmodel/interactive/annotation/PDAppearanceDictionary.java
new file mode 100644
index 0000000..da3a182
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/interactive/annotation/PDAppearanceDictionary.java
@@ -0,0 +1,245 @@
+/**
+ * Copyright (c) 2003-2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.interactive.annotation;
+
+import org.pdfbox.cos.COSBase;
+import org.pdfbox.cos.COSDictionary;
+import org.pdfbox.cos.COSName;
+import org.pdfbox.cos.COSStream;
+
+import org.pdfbox.pdmodel.common.COSObjectable;
+import org.pdfbox.pdmodel.common.COSDictionaryMap;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+/**
+ * This class represents a PDF /AP entry the appearance dictionary.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.3 $
+ */
+public class PDAppearanceDictionary implements COSObjectable
+{
+ private COSDictionary dictionary;
+
+ /**
+ * Constructor.
+ */
+ public PDAppearanceDictionary()
+ {
+ dictionary = new COSDictionary();
+ //the N entry is required.
+ dictionary.setItem( COSName.getPDFName( "N" ), new COSDictionary() );
+ }
+
+ /**
+ * Constructor.
+ *
+ * @param dict The annotations dictionary.
+ */
+ public PDAppearanceDictionary( COSDictionary dict )
+ {
+ dictionary = dict;
+ }
+
+ /**
+ * returns the dictionary.
+ * @return the dictionary
+ */
+ public COSDictionary getDictionary()
+ {
+ return dictionary;
+ }
+
+ /**
+ * returns the dictionary.
+ * @return the dictionary
+ */
+ public COSBase getCOSObject()
+ {
+ return dictionary;
+ }
+
+ /**
+ * This will return a list of appearances. In the case where there is
+ * only one appearance the map will contain one entry whose key is the string
+ * "default".
+ *
+ * @return A list of key(java.lang.String) value(PDAppearanceStream) pairs
+ */
+ public Map getNormalAppearance()
+ {
+ COSBase ap = dictionary.getDictionaryObject( COSName.getPDFName( "N" ) );
+ if( ap instanceof COSStream )
+ {
+ COSStream aux = (COSStream) ap;
+ ap = new COSDictionary();
+ ((COSDictionary)ap).setItem(COSName.getPDFName( "default" ), aux );
+ }
+ COSDictionary map = (COSDictionary)ap;
+ Map actuals = new HashMap();
+ Map retval = new COSDictionaryMap( actuals, map );
+ Iterator asNames = map.keyList().iterator();
+ while( asNames.hasNext() )
+ {
+ COSName asName = (COSName)asNames.next();
+ COSStream as = (COSStream)map.getDictionaryObject( asName );
+ actuals.put( asName.getName(), new PDAppearanceStream( as ) );
+ }
+
+ return retval;
+ }
+
+ /**
+ * This will set a list of appearances. If you would like to set the single
+ * appearance then you should use the key "default", and when the PDF is written
+ * back to the filesystem then there will only be one stream.
+ *
+ * @param appearanceMap The updated map with the appearance.
+ */
+ public void setNormalAppearance( Map appearanceMap )
+ {
+ dictionary.setItem( COSName.getPDFName( "N" ), COSDictionaryMap.convert( appearanceMap ) );
+ }
+
+ /**
+ * This will set the normal appearance when there is only one appearance
+ * to be shown.
+ *
+ * @param ap The appearance stream to show.
+ */
+ public void setNormalAppearance( PDAppearanceStream ap )
+ {
+ dictionary.setItem( COSName.getPDFName( "N" ), ap.getStream() );
+ }
+
+ /**
+ * This will return a list of appearances. In the case where there is
+ * only one appearance the map will contain one entry whose key is the string
+ * "default". If there is no rollover appearance then the normal appearance
+ * will be returned. Which means that this method will never return null.
+ *
+ * @return A list of key(java.lang.String) value(PDAppearanceStream) pairs
+ */
+ public Map getRolloverAppearance()
+ {
+ Map retval = null;
+ COSBase ap = dictionary.getDictionaryObject( COSName.getPDFName( "R" ) );
+ if( ap == null )
+ {
+ retval = getNormalAppearance();
+ }
+ else
+ {
+ if( ap instanceof COSStream )
+ {
+ ap = new COSDictionary();
+ ((COSDictionary)ap).setItem(COSName.getPDFName( "default" ), ap );
+ }
+ COSDictionary map = (COSDictionary)ap;
+ Map actuals = new HashMap();
+ retval = new COSDictionaryMap( actuals, map );
+ Iterator asNames = map.keyList().iterator();
+ while( asNames.hasNext() )
+ {
+ COSName asName = (COSName)asNames.next();
+ COSStream as = (COSStream)map.getDictionaryObject( asName );
+ actuals.put( asName.getName(), new PDAppearanceStream( as ) );
+ }
+ }
+
+ return retval;
+ }
+
+ /**
+ * This will set a list of appearances. If you would like to set the single
+ * appearance then you should use the key "default", and when the PDF is written
+ * back to the filesystem then there will only be one stream.
+ *
+ * @param appearanceMap The updated map with the appearance.
+ */
+ public void setRolloverAppearance( Map appearanceMap )
+ {
+ dictionary.setItem( COSName.getPDFName( "R" ), COSDictionaryMap.convert( appearanceMap ) );
+ }
+
+ /**
+ * This will return a list of appearances. In the case where there is
+ * only one appearance the map will contain one entry whose key is the string
+ * "default". If there is no rollover appearance then the normal appearance
+ * will be returned. Which means that this method will never return null.
+ *
+ * @return A list of key(java.lang.String) value(PDAppearanceStream) pairs
+ */
+ public Map getDownAppearance()
+ {
+ Map retval = null;
+ COSBase ap = dictionary.getDictionaryObject( COSName.getPDFName( "D" ) );
+ if( ap == null )
+ {
+ retval = getNormalAppearance();
+ }
+ else
+ {
+ if( ap instanceof COSStream )
+ {
+ ap = new COSDictionary();
+ ((COSDictionary)ap).setItem(COSName.getPDFName( "default" ), ap );
+ }
+ COSDictionary map = (COSDictionary)ap;
+ Map actuals = new HashMap();
+ retval = new COSDictionaryMap( actuals, map );
+ Iterator asNames = map.keyList().iterator();
+ while( asNames.hasNext() )
+ {
+ COSName asName = (COSName)asNames.next();
+ COSStream as = (COSStream)map.getDictionaryObject( asName );
+ actuals.put( asName.getName(), new PDAppearanceStream( as ) );
+ }
+ }
+
+ return retval;
+ }
+
+ /**
+ * This will set a list of appearances. If you would like to set the single
+ * appearance then you should use the key "default", and when the PDF is written
+ * back to the filesystem then there will only be one stream.
+ *
+ * @param appearanceMap The updated map with the appearance.
+ */
+ public void setDownAppearance( Map appearanceMap )
+ {
+ dictionary.setItem( COSName.getPDFName( "D" ), COSDictionaryMap.convert( appearanceMap ) );
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/interactive/annotation/PDAppearanceStream.java b/src/main/java/org/pdfbox/pdmodel/interactive/annotation/PDAppearanceStream.java
new file mode 100644
index 0000000..ca3f4a4
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/interactive/annotation/PDAppearanceStream.java
@@ -0,0 +1,146 @@
+/**
+ * Copyright (c) 2003-2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.interactive.annotation;
+
+import org.pdfbox.cos.COSArray;
+import org.pdfbox.cos.COSBase;
+import org.pdfbox.cos.COSDictionary;
+import org.pdfbox.cos.COSName;
+import org.pdfbox.cos.COSStream;
+
+import org.pdfbox.pdmodel.common.PDRectangle;
+import org.pdfbox.pdmodel.common.COSObjectable;
+
+import org.pdfbox.pdmodel.PDResources;
+
+
+/**
+ * This class represents an appearance for an annotation.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.3 $
+ */
+public class PDAppearanceStream implements COSObjectable
+{
+ private COSStream stream = null;
+
+
+ /**
+ * Constructor.
+ *
+ * @param s The cos stream for this appearance.
+ */
+ public PDAppearanceStream( COSStream s )
+ {
+ stream = s;
+ }
+
+ /**
+ * This will return the underlying stream.
+ *
+ * @return The wrapped stream.
+ */
+ public COSStream getStream()
+ {
+ return stream;
+ }
+
+ /**
+ * @see COSObjectable#getCOSObject()
+ */
+ public COSBase getCOSObject()
+ {
+ return stream;
+ }
+
+ /**
+ * Get the bounding box for this appearance. This may return null in which
+ * case the Rectangle from the annotation should be used.
+ *
+ * @return The bounding box for this appearance.
+ */
+ public PDRectangle getBoundingBox()
+ {
+ PDRectangle box = null;
+ COSArray bbox = (COSArray)stream.getDictionaryObject( COSName.getPDFName( "BBox" ) );
+ if( bbox != null )
+ {
+ box = new PDRectangle( bbox );
+ }
+ return box;
+ }
+
+ /**
+ * This will set the bounding box for this appearance stream.
+ *
+ * @param rectangle The new bounding box.
+ */
+ public void setBoundingBox( PDRectangle rectangle )
+ {
+ COSArray array = null;
+ if( rectangle != null )
+ {
+ array = rectangle.getCOSArray();
+ }
+ stream.setItem( COSName.getPDFName( "BBox" ), array );
+ }
+
+ /**
+ * This will get the resources for this appearance stream.
+ *
+ * @return The appearance stream resources.
+ */
+ public PDResources getResources()
+ {
+ PDResources retval = null;
+ COSDictionary dict = (COSDictionary)stream.getDictionaryObject( COSName.RESOURCES );
+ if( dict != null )
+ {
+ retval = new PDResources( dict );
+ }
+ return retval;
+ }
+
+ /**
+ * This will set the new resources.
+ *
+ * @param resources The new resources.
+ */
+ public void setResources( PDResources resources )
+ {
+ COSDictionary dict = null;
+ if( resources != null )
+ {
+ dict = resources.getCOSDictionary();
+ }
+ stream.setItem( COSName.RESOURCES, dict );
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/interactive/annotation/package.html b/src/main/java/org/pdfbox/pdmodel/interactive/annotation/package.html
new file mode 100644
index 0000000..4d9fdeb
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/interactive/annotation/package.html
@@ -0,0 +1,9 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head>
+
+</head>
+<body>
+The annotation package contains classes that work with PDF annotation elements.
+</body>
+</html>
diff --git a/src/main/java/org/pdfbox/pdmodel/interactive/digitalsignature/PDSignature.java b/src/main/java/org/pdfbox/pdmodel/interactive/digitalsignature/PDSignature.java
new file mode 100644
index 0000000..7ef1c1e
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/interactive/digitalsignature/PDSignature.java
@@ -0,0 +1,85 @@
+/**
+ * Copyright (c) 2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.interactive.digitalsignature;
+
+import org.pdfbox.cos.COSBase;
+import org.pdfbox.cos.COSDictionary;
+
+import org.pdfbox.pdmodel.common.COSObjectable;
+
+/**
+ * This represents a digital signature that can be attached to a document.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.1 $
+ */
+public class PDSignature implements COSObjectable
+{
+ private COSDictionary sig;
+
+ /**
+ * Default constructor.
+ */
+ public PDSignature()
+ {
+ sig = new COSDictionary();
+ }
+
+ /**
+ * Constructor.
+ *
+ * @param s The signature dictionary.
+ */
+ public PDSignature( COSDictionary s )
+ {
+ sig = s;
+ }
+
+ /**
+ * Convert this standard java object to a COS object.
+ *
+ * @return The cos object that matches this Java object.
+ */
+ public COSBase getCOSObject()
+ {
+ return sig;
+ }
+
+ /**
+ * Convert this standard java object to a COS object.
+ *
+ * @return The cos object that matches this Java object.
+ */
+ public COSDictionary getCOSDictionary()
+ {
+ return sig;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/interactive/digitalsignature/package.html b/src/main/java/org/pdfbox/pdmodel/interactive/digitalsignature/package.html
new file mode 100644
index 0000000..d9944e6
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/interactive/digitalsignature/package.html
@@ -0,0 +1,9 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head>
+
+</head>
+<body>
+The digitial signature library will manage signatures that are stored in the PDF document.
+</body>
+</html>
diff --git a/src/main/java/org/pdfbox/pdmodel/interactive/documentnavigation/destination/PDDestination.java b/src/main/java/org/pdfbox/pdmodel/interactive/documentnavigation/destination/PDDestination.java
new file mode 100644
index 0000000..98a0345
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/interactive/documentnavigation/destination/PDDestination.java
@@ -0,0 +1,125 @@
+/**
+ * Copyright (c) 2004-2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.interactive.documentnavigation.destination;
+
+import java.io.IOException;
+
+import org.pdfbox.cos.COSArray;
+import org.pdfbox.cos.COSBase;
+import org.pdfbox.cos.COSName;
+import org.pdfbox.cos.COSString;
+
+import org.pdfbox.pdmodel.common.COSObjectable;
+
+/**
+ * This represents a destination in a PDF document.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.4 $
+ */
+public abstract class PDDestination implements COSObjectable
+{
+
+ /**
+ * This will create a new destination depending on the type of COSBase
+ * that is passed in.
+ *
+ * @param base The base level object.
+ *
+ * @return A new destination.
+ *
+ * @throws IOException If the base cannot be converted to a Destination.
+ */
+ public static PDDestination create( COSBase base ) throws IOException
+ {
+ PDDestination retval = null;
+ if( base == null )
+ {
+ //this is ok, just return null.
+ }
+ else if( base instanceof COSArray && ((COSArray)base).size() > 0 )
+ {
+ COSArray array = (COSArray)base;
+ COSName type = (COSName)array.getObject( 1 );
+ String typeString = type.getName();
+ if( typeString.equals( PDPageFitDestination.TYPE ) ||
+ typeString.equals( PDPageFitDestination.TYPE_BOUNDED ))
+ {
+ retval = new PDPageFitDestination( array );
+ }
+ else if( typeString.equals( PDPageFitHeightDestination.TYPE ) ||
+ typeString.equals( PDPageFitHeightDestination.TYPE_BOUNDED ))
+ {
+ retval = new PDPageFitHeightDestination( array );
+ }
+ else if( typeString.equals( PDPageFitRectangleDestination.TYPE ) )
+ {
+ retval = new PDPageFitRectangleDestination( array );
+ }
+ else if( typeString.equals( PDPageFitWidthDestination.TYPE ) ||
+ typeString.equals( PDPageFitWidthDestination.TYPE_BOUNDED ))
+ {
+ retval = new PDPageFitWidthDestination( array );
+ }
+ else if( typeString.equals( PDPageXYZDestination.TYPE ) )
+ {
+ retval = new PDPageXYZDestination( array );
+ }
+ else
+ {
+ throw new IOException( "Unknown destination type:" + type );
+ }
+ }
+ else if( base instanceof COSString )
+ {
+ retval = new PDNamedDestination( (COSString)base );
+ }
+ else if( base instanceof COSName )
+ {
+ retval = new PDNamedDestination( (COSName)base );
+ }
+ else
+ {
+ throw new IOException( "Error: can't convert to Destination " + base );
+ }
+ return retval;
+ }
+
+ /**
+ * Return a string representation of this class.
+ *
+ * @return A human readable string.
+ */
+ public String toString()
+ {
+ return super.toString();
+ }
+}
diff --git a/src/main/java/org/pdfbox/pdmodel/interactive/documentnavigation/destination/PDNamedDestination.java b/src/main/java/org/pdfbox/pdmodel/interactive/documentnavigation/destination/PDNamedDestination.java
new file mode 100644
index 0000000..11da8e7
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/interactive/documentnavigation/destination/PDNamedDestination.java
@@ -0,0 +1,142 @@
+/**
+ * Copyright (c) 2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.interactive.documentnavigation.destination;
+
+import java.io.IOException;
+
+import org.pdfbox.cos.COSBase;
+import org.pdfbox.cos.COSName;
+import org.pdfbox.cos.COSString;
+
+/**
+ * This represents a destination to a page by referencing it with a name.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.2 $
+ */
+public class PDNamedDestination extends PDDestination
+{
+ private COSBase namedDestination;
+
+ /**
+ * Constructor.
+ *
+ * @param dest The named destination.
+ */
+ public PDNamedDestination( COSString dest )
+ {
+ namedDestination = dest;
+ }
+
+ /**
+ * Constructor.
+ *
+ * @param dest The named destination.
+ */
+ public PDNamedDestination( COSName dest )
+ {
+ namedDestination = dest;
+ }
+
+ /**
+ * Default constructor.
+ */
+ public PDNamedDestination()
+ {
+ //default, so do nothing
+ }
+
+ /**
+ * Default constructor.
+ *
+ * @param dest The named destination.
+ */
+ public PDNamedDestination( String dest )
+ {
+ namedDestination = new COSString( dest );
+ }
+
+ /**
+ * Convert this standard java object to a COS object.
+ *
+ * @return The cos object that matches this Java object.
+ */
+ public COSBase getCOSObject()
+ {
+ return namedDestination;
+ }
+
+ /**
+ * This will get the name of the destination.
+ *
+ * @return The name of the destination.
+ */
+ public String getNamedDestination()
+ {
+ String retval = null;
+ if( namedDestination instanceof COSString )
+ {
+ retval = ((COSString)namedDestination).getString();
+ }
+ else if( namedDestination instanceof COSName )
+ {
+ retval = ((COSName)namedDestination).getName();
+ }
+
+ return retval;
+ }
+
+ /**
+ * Set the named destination.
+ *
+ * @param dest The new named destination.
+ *
+ * @throws IOException If there is an error setting the named destination.
+ */
+ public void setNamedDestination( String dest ) throws IOException
+ {
+ if( namedDestination instanceof COSString )
+ {
+ COSString string = ((COSString)namedDestination);
+ string.reset();
+ string.append( dest.getBytes() );
+ }
+ else if( dest == null )
+ {
+ namedDestination = null;
+ }
+ else
+ {
+ namedDestination = new COSString( dest );
+ }
+ }
+
+}
diff --git a/src/main/java/org/pdfbox/pdmodel/interactive/documentnavigation/destination/PDPageDestination.java b/src/main/java/org/pdfbox/pdmodel/interactive/documentnavigation/destination/PDPageDestination.java
new file mode 100644
index 0000000..74dbf9a
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/interactive/documentnavigation/destination/PDPageDestination.java
@@ -0,0 +1,155 @@
+/**
+ * Copyright (c) 2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.interactive.documentnavigation.destination;
+
+import org.pdfbox.cos.COSArray;
+import org.pdfbox.cos.COSBase;
+import org.pdfbox.cos.COSDictionary;
+import org.pdfbox.cos.COSNumber;
+
+import org.pdfbox.pdmodel.PDPage;
+
+/**
+ * This represents a destination to a page, see subclasses for specific parameters.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.1 $
+ */
+public abstract class PDPageDestination extends PDDestination
+{
+ /**
+ * Storage for the page destination.
+ */
+ protected COSArray array;
+
+ /**
+ * Constructor to create empty page destination.
+ *
+ */
+ protected PDPageDestination()
+ {
+ array = new COSArray();
+ }
+
+ /**
+ * Constructor to create empty page destination.
+ *
+ * @param arr A page destination array.
+ */
+ protected PDPageDestination( COSArray arr )
+ {
+ array = arr;
+ }
+
+ /**
+ * This will get the page for this destination. A page destination
+ * can either reference a page or a page number(when doing a remote destination to
+ * another PDF). If this object is referencing by page number then this method will
+ * return null and getPageNumber should be used.
+ *
+ * @return The page for this destination.
+ */
+ public PDPage getPage()
+ {
+ PDPage retval = null;
+ if( array.size() > 0 )
+ {
+ COSBase page = array.getObject( 0 );
+ if( page instanceof COSDictionary )
+ {
+ retval = new PDPage( (COSDictionary)page );
+ }
+ }
+ return retval;
+ }
+
+ /**
+ * Set the page for this destination.
+ *
+ * @param page The page for the destination.
+ */
+ public void setPage( PDPage page )
+ {
+ array.set( 0, page );
+ }
+
+ /**
+ * This will get the page number for this destination. A page destination
+ * can either reference a page or a page number(when doing a remote destination to
+ * another PDF). If this object is referencing by page number then this method will
+ * return that number, otherwise -1 will be returned.
+ *
+ * @return The page number for this destination.
+ */
+ public int getPageNumber()
+ {
+ int retval = -1;
+ if( array.size() > 0 )
+ {
+ COSBase page = array.getObject( 0 );
+ if( page instanceof COSNumber )
+ {
+ retval = ((COSNumber)page).intValue();
+ }
+ }
+ return retval;
+ }
+
+ /**
+ * Set the page number for this destination.
+ *
+ * @param pageNumber The page for the destination.
+ */
+ public void setPageNumber( int pageNumber )
+ {
+ array.set( 0, pageNumber );
+ }
+
+ /**
+ * Convert this standard java object to a COS object.
+ *
+ * @return The cos object that matches this Java object.
+ */
+ public COSBase getCOSObject()
+ {
+ return array;
+ }
+
+ /**
+ * Convert this standard java object to a COS object.
+ *
+ * @return The cos object that matches this Java object.
+ */
+ public COSArray getCOSArray()
+ {
+ return array;
+ }
+}
diff --git a/src/main/java/org/pdfbox/pdmodel/interactive/documentnavigation/destination/PDPageFitDestination.java b/src/main/java/org/pdfbox/pdmodel/interactive/documentnavigation/destination/PDPageFitDestination.java
new file mode 100644
index 0000000..8f46bbe
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/interactive/documentnavigation/destination/PDPageFitDestination.java
@@ -0,0 +1,102 @@
+/**
+ * Copyright (c) 2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.interactive.documentnavigation.destination;
+
+import org.pdfbox.cos.COSArray;
+
+/**
+ * This represents a destination to a page and the page contents will be magnified to just
+ * fit on the screen.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.1 $
+ */
+public class PDPageFitDestination extends PDPageDestination
+{
+ /**
+ * The type of this destination.
+ */
+ protected static final String TYPE = "Fit";
+ /**
+ * The type of this destination.
+ */
+ protected static final String TYPE_BOUNDED = "FitB";
+
+ /**
+ * Default constructor.
+ *
+ */
+ public PDPageFitDestination()
+ {
+ super();
+ array.growToSize(2);
+ array.setName( 1, TYPE );
+
+ }
+
+ /**
+ * Constructor from an existing destination array.
+ *
+ * @param arr The destination array.
+ */
+ public PDPageFitDestination( COSArray arr )
+ {
+ super( arr );
+ }
+
+ /**
+ * A flag indicating if this page destination should just fit bounding box of the PDF.
+ *
+ * @return true If the destination should fit just the bounding box.
+ */
+ public boolean fitBoundingBox()
+ {
+ return TYPE_BOUNDED.equals( array.getName( 1 ) );
+ }
+
+ /**
+ * Set if this page destination should just fit the bounding box. The default is false.
+ *
+ * @param fitBoundingBox A flag indicating if this should fit the bounding box.
+ */
+ public void setFitBoundingBox( boolean fitBoundingBox )
+ {
+ array.growToSize( 2 );
+ if( fitBoundingBox )
+ {
+ array.setName( 1, TYPE_BOUNDED );
+ }
+ else
+ {
+ array.setName( 1, TYPE );
+ }
+ }
+}
diff --git a/src/main/java/org/pdfbox/pdmodel/interactive/documentnavigation/destination/PDPageFitHeightDestination.java b/src/main/java/org/pdfbox/pdmodel/interactive/documentnavigation/destination/PDPageFitHeightDestination.java
new file mode 100644
index 0000000..64df612
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/interactive/documentnavigation/destination/PDPageFitHeightDestination.java
@@ -0,0 +1,132 @@
+/**
+ * Copyright (c) 2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.interactive.documentnavigation.destination;
+
+import org.pdfbox.cos.COSArray;
+import org.pdfbox.cos.COSBase;
+
+/**
+ * This represents a destination to a page at a x location and the height is magnified
+ * to just fit on the screen.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.1 $
+ */
+public class PDPageFitHeightDestination extends PDPageDestination
+{
+ /**
+ * The type of this destination.
+ */
+ protected static final String TYPE = "FitV";
+ /**
+ * The type of this destination.
+ */
+ protected static final String TYPE_BOUNDED = "FitBV";
+
+ /**
+ * Default constructor.
+ *
+ */
+ public PDPageFitHeightDestination()
+ {
+ super();
+ array.growToSize(3);
+ array.setName( 1, TYPE );
+
+ }
+
+ /**
+ * Constructor from an existing destination array.
+ *
+ * @param arr The destination array.
+ */
+ public PDPageFitHeightDestination( COSArray arr )
+ {
+ super( arr );
+ }
+
+ /**
+ * Get the left x coordinate. A return value of -1 implies that the current x-coordinate
+ * will be used.
+ *
+ * @return The left x coordinate.
+ */
+ public int getLeft()
+ {
+ return array.getInt( 2 );
+ }
+
+ /**
+ * Set the left x-coordinate, a value of -1 implies that the current x-coordinate
+ * will be used.
+ * @param x The left x coordinate.
+ */
+ public void setLeft( int x )
+ {
+ array.growToSize( 3 );
+ if( x == -1 )
+ {
+ array.set( 2, (COSBase)null );
+ }
+ else
+ {
+ array.setInt( 2, x );
+ }
+ }
+
+ /**
+ * A flag indicating if this page destination should just fit bounding box of the PDF.
+ *
+ * @return true If the destination should fit just the bounding box.
+ */
+ public boolean fitBoundingBox()
+ {
+ return TYPE_BOUNDED.equals( array.getName( 1 ) );
+ }
+
+ /**
+ * Set if this page destination should just fit the bounding box. The default is false.
+ *
+ * @param fitBoundingBox A flag indicating if this should fit the bounding box.
+ */
+ public void setFitBoundingBox( boolean fitBoundingBox )
+ {
+ array.growToSize( 2 );
+ if( fitBoundingBox )
+ {
+ array.setName( 1, TYPE_BOUNDED );
+ }
+ else
+ {
+ array.setName( 1, TYPE );
+ }
+ }
+}
diff --git a/src/main/java/org/pdfbox/pdmodel/interactive/documentnavigation/destination/PDPageFitRectangleDestination.java b/src/main/java/org/pdfbox/pdmodel/interactive/documentnavigation/destination/PDPageFitRectangleDestination.java
new file mode 100644
index 0000000..00fc5f1
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/interactive/documentnavigation/destination/PDPageFitRectangleDestination.java
@@ -0,0 +1,188 @@
+/**
+ * Copyright (c) 2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.interactive.documentnavigation.destination;
+
+import org.pdfbox.cos.COSArray;
+import org.pdfbox.cos.COSBase;
+
+/**
+ * This represents a destination to a page at a y location and the width is magnified
+ * to just fit on the screen.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.1 $
+ */
+public class PDPageFitRectangleDestination extends PDPageDestination
+{
+ /**
+ * The type of this destination.
+ */
+ protected static final String TYPE = "FitR";
+
+ /**
+ * Default constructor.
+ *
+ */
+ public PDPageFitRectangleDestination()
+ {
+ super();
+ array.growToSize(6);
+ array.setName( 1, TYPE );
+
+ }
+
+ /**
+ * Constructor from an existing destination array.
+ *
+ * @param arr The destination array.
+ */
+ public PDPageFitRectangleDestination( COSArray arr )
+ {
+ super( arr );
+ }
+
+ /**
+ * Get the left x coordinate. A return value of -1 implies that the current x-coordinate
+ * will be used.
+ *
+ * @return The left x coordinate.
+ */
+ public int getLeft()
+ {
+ return array.getInt( 2 );
+ }
+
+ /**
+ * Set the left x-coordinate, a value of -1 implies that the current x-coordinate
+ * will be used.
+ * @param x The left x coordinate.
+ */
+ public void setLeft( int x )
+ {
+ array.growToSize( 3 );
+ if( x == -1 )
+ {
+ array.set( 2, (COSBase)null );
+ }
+ else
+ {
+ array.setInt( 2, x );
+ }
+ }
+
+ /**
+ * Get the bottom y coordinate. A return value of -1 implies that the current y-coordinate
+ * will be used.
+ *
+ * @return The bottom y coordinate.
+ */
+ public int getBottom()
+ {
+ return array.getInt( 3 );
+ }
+
+ /**
+ * Set the bottom y-coordinate, a value of -1 implies that the current y-coordinate
+ * will be used.
+ * @param y The bottom y coordinate.
+ */
+ public void setBottom( int y )
+ {
+ array.growToSize( 6 );
+ if( y == -1 )
+ {
+ array.set( 3, (COSBase)null );
+ }
+ else
+ {
+ array.setInt( 3, y );
+ }
+ }
+
+ /**
+ * Get the right x coordinate. A return value of -1 implies that the current x-coordinate
+ * will be used.
+ *
+ * @return The right x coordinate.
+ */
+ public int getRight()
+ {
+ return array.getInt( 4 );
+ }
+
+ /**
+ * Set the right x-coordinate, a value of -1 implies that the current x-coordinate
+ * will be used.
+ * @param x The right x coordinate.
+ */
+ public void setRight( int x )
+ {
+ array.growToSize( 6 );
+ if( x == -1 )
+ {
+ array.set( 4, (COSBase)null );
+ }
+ else
+ {
+ array.setInt( 4, x );
+ }
+ }
+
+
+ /**
+ * Get the top y coordinate. A return value of -1 implies that the current y-coordinate
+ * will be used.
+ *
+ * @return The top y coordinate.
+ */
+ public int getTop()
+ {
+ return array.getInt( 5 );
+ }
+
+ /**
+ * Set the top y-coordinate, a value of -1 implies that the current y-coordinate
+ * will be used.
+ * @param y The top ycoordinate.
+ */
+ public void setTop( int y )
+ {
+ array.growToSize( 6 );
+ if( y == -1 )
+ {
+ array.set( 5, (COSBase)null );
+ }
+ else
+ {
+ array.setInt( 5, y );
+ }
+ }
+}
diff --git a/src/main/java/org/pdfbox/pdmodel/interactive/documentnavigation/destination/PDPageFitWidthDestination.java b/src/main/java/org/pdfbox/pdmodel/interactive/documentnavigation/destination/PDPageFitWidthDestination.java
new file mode 100644
index 0000000..ef7385f
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/interactive/documentnavigation/destination/PDPageFitWidthDestination.java
@@ -0,0 +1,134 @@
+/**
+ * Copyright (c) 2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.interactive.documentnavigation.destination;
+
+import org.pdfbox.cos.COSArray;
+import org.pdfbox.cos.COSBase;
+
+/**
+ * This represents a destination to a page at a y location and the width is magnified
+ * to just fit on the screen.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.1 $
+ */
+public class PDPageFitWidthDestination extends PDPageDestination
+{
+
+ /**
+ * The type of this destination.
+ */
+ protected static final String TYPE = "FitH";
+ /**
+ * The type of this destination.
+ */
+ protected static final String TYPE_BOUNDED = "FitBH";
+
+ /**
+ * Default constructor.
+ *
+ */
+ public PDPageFitWidthDestination()
+ {
+ super();
+ array.growToSize(3);
+ array.setName( 1, TYPE );
+
+ }
+
+ /**
+ * Constructor from an existing destination array.
+ *
+ * @param arr The destination array.
+ */
+ public PDPageFitWidthDestination( COSArray arr )
+ {
+ super( arr );
+ }
+
+
+ /**
+ * Get the top y coordinate. A return value of -1 implies that the current y-coordinate
+ * will be used.
+ *
+ * @return The top y coordinate.
+ */
+ public int getTop()
+ {
+ return array.getInt( 2 );
+ }
+
+ /**
+ * Set the top y-coordinate, a value of -1 implies that the current y-coordinate
+ * will be used.
+ * @param y The top ycoordinate.
+ */
+ public void setTop( int y )
+ {
+ array.growToSize( 3 );
+ if( y == -1 )
+ {
+ array.set( 2, (COSBase)null );
+ }
+ else
+ {
+ array.setInt( 2, y );
+ }
+ }
+
+ /**
+ * A flag indicating if this page destination should just fit bounding box of the PDF.
+ *
+ * @return true If the destination should fit just the bounding box.
+ */
+ public boolean fitBoundingBox()
+ {
+ return TYPE_BOUNDED.equals( array.getName( 1 ) );
+ }
+
+ /**
+ * Set if this page destination should just fit the bounding box. The default is false.
+ *
+ * @param fitBoundingBox A flag indicating if this should fit the bounding box.
+ */
+ public void setFitBoundingBox( boolean fitBoundingBox )
+ {
+ array.growToSize( 2 );
+ if( fitBoundingBox )
+ {
+ array.setName( 1, TYPE_BOUNDED );
+ }
+ else
+ {
+ array.setName( 1, TYPE );
+ }
+ }
+}
diff --git a/src/main/java/org/pdfbox/pdmodel/interactive/documentnavigation/destination/PDPageXYZDestination.java b/src/main/java/org/pdfbox/pdmodel/interactive/documentnavigation/destination/PDPageXYZDestination.java
new file mode 100644
index 0000000..543a33c
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/interactive/documentnavigation/destination/PDPageXYZDestination.java
@@ -0,0 +1,159 @@
+/**
+ * Copyright (c) 2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.interactive.documentnavigation.destination;
+
+import org.pdfbox.cos.COSArray;
+import org.pdfbox.cos.COSBase;
+
+/**
+ * This represents a destination to a page at an x,y coordinate with a zoom setting.
+ * The default x,y,z will be whatever is the current value in the viewer application and
+ * are not required.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.1 $
+ */
+public class PDPageXYZDestination extends PDPageDestination
+{
+ /**
+ * The type of this destination.
+ */
+ protected static final String TYPE = "XYZ";
+
+ /**
+ * Default constructor.
+ *
+ */
+ public PDPageXYZDestination()
+ {
+ super();
+ array.growToSize(5);
+ array.setName( 1, TYPE );
+
+ }
+
+ /**
+ * Constructor from an existing destination array.
+ *
+ * @param arr The destination array.
+ */
+ public PDPageXYZDestination( COSArray arr )
+ {
+ super( arr );
+ }
+
+ /**
+ * Get the left x coordinate. A return value of -1 implies that the current x-coordinate
+ * will be used.
+ *
+ * @return The left x coordinate.
+ */
+ public int getLeft()
+ {
+ return array.getInt( 2 );
+ }
+
+ /**
+ * Set the left x-coordinate, a value of -1 implies that the current x-coordinate
+ * will be used.
+ * @param x The left x coordinate.
+ */
+ public void setLeft( int x )
+ {
+ array.growToSize( 3 );
+ if( x == -1 )
+ {
+ array.set( 2, (COSBase)null );
+ }
+ else
+ {
+ array.setInt( 2, x );
+ }
+ }
+
+ /**
+ * Get the top y coordinate. A return value of -1 implies that the current y-coordinate
+ * will be used.
+ *
+ * @return The top y coordinate.
+ */
+ public int getTop()
+ {
+ return array.getInt( 3 );
+ }
+
+ /**
+ * Set the top y-coordinate, a value of -1 implies that the current y-coordinate
+ * will be used.
+ * @param y The top ycoordinate.
+ */
+ public void setTop( int y )
+ {
+ array.growToSize( 4 );
+ if( y == -1 )
+ {
+ array.set( 3, (COSBase)null );
+ }
+ else
+ {
+ array.setInt( 3, y );
+ }
+ }
+
+ /**
+ * Get the zoom value. A return value of -1 implies that the current zoom
+ * will be used.
+ *
+ * @return The zoom value for the page.
+ */
+ public int getZoom()
+ {
+ return array.getInt( 4 );
+ }
+
+ /**
+ * Set the zoom value for the page, a value of -1 implies that the current zoom
+ * will be used.
+ * @param zoom The zoom value.
+ */
+ public void setZoom( int zoom )
+ {
+ array.growToSize( 5 );
+ if( zoom == -1 )
+ {
+ array.set( 4, (COSBase)null );
+ }
+ else
+ {
+ array.setInt( 4, zoom );
+ }
+ }
+}
diff --git a/src/main/java/org/pdfbox/pdmodel/interactive/documentnavigation/destination/package.html b/src/main/java/org/pdfbox/pdmodel/interactive/documentnavigation/destination/package.html
new file mode 100644
index 0000000..2122b1d
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/interactive/documentnavigation/destination/package.html
@@ -0,0 +1,9 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head>
+
+</head>
+<body>
+The destination package allows destinations into a pdf document to be specified.
+</body>
+</html>
diff --git a/src/main/java/org/pdfbox/pdmodel/interactive/documentnavigation/outline/PDDocumentOutline.java b/src/main/java/org/pdfbox/pdmodel/interactive/documentnavigation/outline/PDDocumentOutline.java
new file mode 100644
index 0000000..157a36f
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/interactive/documentnavigation/outline/PDDocumentOutline.java
@@ -0,0 +1,62 @@
+/**
+ * Copyright (c) 2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.interactive.documentnavigation.outline;
+
+import org.pdfbox.cos.COSDictionary;
+
+/**
+ * This represents an outline in a pdf document.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.1 $
+ */
+public class PDDocumentOutline extends PDOutlineNode
+{
+
+ /**
+ * Default Constructor.
+ */
+ public PDDocumentOutline()
+ {
+ super();
+ node.setName( "Type", "Outlines" );
+ }
+
+ /**
+ * Constructor for an existing document outline.
+ *
+ * @param dic The storage dictionary.
+ */
+ public PDDocumentOutline( COSDictionary dic )
+ {
+ super( dic );
+ }
+}
diff --git a/src/main/java/org/pdfbox/pdmodel/interactive/documentnavigation/outline/PDOutlineItem.java b/src/main/java/org/pdfbox/pdmodel/interactive/documentnavigation/outline/PDOutlineItem.java
new file mode 100644
index 0000000..648eb64
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/interactive/documentnavigation/outline/PDOutlineItem.java
@@ -0,0 +1,425 @@
+/**
+ * Copyright (c) 2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.interactive.documentnavigation.outline;
+
+import java.io.IOException;
+import java.util.List;
+
+import org.pdfbox.cos.COSArray;
+import org.pdfbox.cos.COSDictionary;
+import org.pdfbox.cos.COSFloat;
+import org.pdfbox.exceptions.OutlineNotLocalException;
+import org.pdfbox.pdmodel.PDDestinationNameTreeNode;
+import org.pdfbox.pdmodel.PDDocument;
+import org.pdfbox.pdmodel.PDDocumentNameDictionary;
+import org.pdfbox.pdmodel.PDPage;
+import org.pdfbox.pdmodel.documentinterchange.logicalstructure.PDStructureElement;
+import org.pdfbox.pdmodel.graphics.color.PDColorSpaceInstance;
+import org.pdfbox.pdmodel.graphics.color.PDDeviceRGB;
+import org.pdfbox.pdmodel.interactive.action.type.PDAction;
+import org.pdfbox.pdmodel.interactive.action.type.PDActionGoTo;
+import org.pdfbox.pdmodel.interactive.action.PDActionFactory;
+import org.pdfbox.pdmodel.interactive.documentnavigation.destination.PDDestination;
+import org.pdfbox.pdmodel.interactive.documentnavigation.destination.PDNamedDestination;
+import org.pdfbox.pdmodel.interactive.documentnavigation.destination.PDPageDestination;
+import org.pdfbox.pdmodel.interactive.documentnavigation.destination.PDPageXYZDestination;
+
+/**
+ * This represents an outline in a pdf document.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.5 $
+ */
+public class PDOutlineItem extends PDOutlineNode
+{
+
+ private static final int ITALIC_FLAG = 1;
+ private static final int BOLD_FLAG = 2;
+
+ /**
+ * Default Constructor.
+ */
+ public PDOutlineItem()
+ {
+ super();
+ }
+
+ /**
+ * Constructor for an existing outline item.
+ *
+ * @param dic The storage dictionary.
+ */
+ public PDOutlineItem( COSDictionary dic )
+ {
+ super( dic );
+ }
+
+ /**
+ * Insert a sibling after this node.
+ *
+ * @param item The item to insert.
+ */
+ public void insertSiblingAfter( PDOutlineItem item )
+ {
+ item.setParent( getParent() );
+ PDOutlineItem next = getNextSibling();
+ setNextSibling( item );
+ item.setPreviousSibling( this );
+ if( next != null )
+ {
+ item.setNextSibling( next );
+ next.setPreviousSibling( item );
+ }
+ updateParentOpenCount( 1 );
+ }
+
+ /**
+ * Return the previous sibling or null if there is no sibling.
+ *
+ * @return The previous sibling.
+ */
+ public PDOutlineItem getPreviousSibling()
+ {
+ PDOutlineItem last = null;
+ COSDictionary lastDic = (COSDictionary)node.getDictionaryObject( "Prev" );
+ if( lastDic != null )
+ {
+ last = new PDOutlineItem( lastDic );
+ }
+ return last;
+ }
+
+ /**
+ * Set the previous sibling, this will be maintained by this class.
+ *
+ * @param outlineNode The new previous sibling.
+ */
+ protected void setPreviousSibling( PDOutlineNode outlineNode )
+ {
+ node.setItem( "Prev", outlineNode );
+ }
+
+ /**
+ * Return the next sibling or null if there is no next sibling.
+ *
+ * @return The next sibling.
+ */
+ public PDOutlineItem getNextSibling()
+ {
+ PDOutlineItem last = null;
+ COSDictionary lastDic = (COSDictionary)node.getDictionaryObject( "Next" );
+ if( lastDic != null )
+ {
+ last = new PDOutlineItem( lastDic );
+ }
+ return last;
+ }
+
+ /**
+ * Set the next sibling, this will be maintained by this class.
+ *
+ * @param outlineNode The new next sibling.
+ */
+ protected void setNextSibling( PDOutlineNode outlineNode )
+ {
+ node.setItem( "Next", outlineNode );
+ }
+
+ /**
+ * Get the title of this node.
+ *
+ * @return The title of this node.
+ */
+ public String getTitle()
+ {
+ return node.getString( "Title" );
+ }
+
+ /**
+ * Set the title for this node.
+ *
+ * @param title The new title for this node.
+ */
+ public void setTitle( String title )
+ {
+ node.setString( "Title", title );
+ }
+
+ /**
+ * Get the page destination of this node.
+ *
+ * @return The page destination of this node.
+ * @throws IOException If there is an error creating the destination.
+ */
+ public PDDestination getDestination() throws IOException
+ {
+ return PDDestination.create( node.getDictionaryObject( "Dest" ) );
+ }
+
+ /**
+ * Set the page destination for this node.
+ *
+ * @param dest The new page destination for this node.
+ */
+ public void setDestination( PDDestination dest )
+ {
+ node.setItem( "Dest", dest );
+ }
+
+ /**
+ * A convenience method that will create an XYZ destination using only the defaults.
+ *
+ * @param page The page to refer to.
+ */
+ public void setDestination( PDPage page )
+ {
+ PDPageXYZDestination dest = null;
+ if( page != null )
+ {
+ dest = new PDPageXYZDestination();
+ dest.setPage( page );
+ }
+ setDestination( dest );
+ }
+
+ /**
+ * This method will attempt to find the page in this PDF document that this outline points to.
+ * If the outline does not point to anything then this method will return null. If the outline
+ * is an action that is not a GoTo action then this methods will throw the OutlineNotLocationException
+ *
+ * @param doc The document to get the page from.
+ *
+ * @return The page that this outline will go to when activated or null if it does not point to anything.
+ * @throws IOException If there is an error when trying to find the page.
+ */
+ public PDPage findDestinationPage( PDDocument doc ) throws IOException
+ {
+ PDPage page = null;
+ PDDestination rawDest = getDestination();
+ if( rawDest == null )
+ {
+ PDAction outlineAction = getAction();
+ if( outlineAction instanceof PDActionGoTo )
+ {
+ rawDest = ((PDActionGoTo)outlineAction).getDestination();
+ }
+ else if( outlineAction == null )
+ {
+ //if the outline action is null then this outline does not refer
+ //to anything and we will just return null.
+ }
+ else
+ {
+ throw new OutlineNotLocalException( "Error: Outline does not reference a local page." );
+ }
+ }
+
+ PDPageDestination pageDest = null;
+ if( rawDest instanceof PDNamedDestination )
+ {
+ //if we have a named destination we need to lookup the PDPageDestination
+ PDNamedDestination namedDest = (PDNamedDestination)rawDest;
+ PDDocumentNameDictionary namesDict = doc.getDocumentCatalog().getNames();
+ if( namesDict != null )
+ {
+ PDDestinationNameTreeNode destsTree = namesDict.getDests();
+ if( destsTree != null )
+ {
+ pageDest = (PDPageDestination)destsTree.getValue( namedDest.getNamedDestination() );
+ }
+ }
+ }
+ else if( rawDest instanceof PDPageDestination)
+ {
+ pageDest = (PDPageDestination) rawDest;
+ }
+ else if( rawDest == null )
+ {
+ //if the destination is null then we will simply return a null page.
+ }
+ else
+ {
+ throw new IOException( "Error: Unknown destination type " + rawDest );
+ }
+
+ if( pageDest != null )
+ {
+ page = pageDest.getPage();
+ if( page == null )
+ {
+ int pageNumber = pageDest.getPageNumber();
+ if( pageNumber != -1 )
+ {
+ List allPages = doc.getDocumentCatalog().getAllPages();
+ page = (PDPage)allPages.get( pageNumber );
+ }
+ }
+ }
+
+ return page;
+ }
+
+ /**
+ * Get the action of this node.
+ *
+ * @return The action of this node.
+ */
+ public PDAction getAction()
+ {
+ return PDActionFactory.createAction( (COSDictionary)node.getDictionaryObject( "A" ) );
+ }
+
+ /**
+ * Set the action for this node.
+ *
+ * @param action The new action for this node.
+ */
+ public void setAction( PDAction action )
+ {
+ node.setItem( "A", action );
+ }
+
+ /**
+ * Get the structure element of this node.
+ *
+ * @return The structure element of this node.
+ */
+ public PDStructureElement getStructureElement()
+ {
+ PDStructureElement se = null;
+ COSDictionary dic = (COSDictionary)node.getDictionaryObject( "SE" );
+ if( dic != null )
+ {
+ se = new PDStructureElement( dic );
+ }
+ return se;
+ }
+
+ /**
+ * Set the structure element for this node.
+ *
+ * @param structureElement The new structure element for this node.
+ */
+ public void setAction( PDStructureElement structureElement )
+ {
+ node.setItem( "SE", structureElement );
+ }
+
+ /**
+ * Get the text color of this node. Default is black and this method
+ * will never return null.
+ *
+ * @return The structure element of this node.
+ */
+ public PDColorSpaceInstance getTextColor()
+ {
+ PDColorSpaceInstance retval = null;
+ COSArray csValues = (COSArray)node.getDictionaryObject( "C" );
+ if( csValues == null )
+ {
+ csValues = new COSArray();
+ csValues.growToSize( 3, new COSFloat( 0 ) );
+ node.setItem( "C", csValues );
+ }
+ retval = new PDColorSpaceInstance(csValues);
+ retval.setColorSpace( PDDeviceRGB.INSTANCE );
+ return retval;
+ }
+
+ /**
+ * Set the text color for this node.
+ *
+ * @param textColor The text color for this node.
+ */
+ public void setTextColor( PDColorSpaceInstance textColor )
+ {
+ node.setItem( "C", textColor.getCOSColorSpaceValue() );
+ }
+
+ /**
+ * A flag telling if the text should be italic.
+ *
+ * @return The italic flag.
+ */
+ public boolean isItalic()
+ {
+ return (node.getInt( "F", 0 ) & ITALIC_FLAG) == ITALIC_FLAG;
+ }
+
+ /**
+ * Set the italic property of the text.
+ *
+ * @param italic The new italic flag.
+ */
+ public void setItalic( boolean italic )
+ {
+ int f = node.getInt( "F", 0 );
+ if( italic )
+ {
+ f = f | ITALIC_FLAG;
+ }
+ else
+ {
+ f = f ^ ITALIC_FLAG;
+ }
+ node.setInt( "F", f );
+ }
+
+ /**
+ * A flag telling if the text should be bold.
+ *
+ * @return The bold flag.
+ */
+ public boolean isBold()
+ {
+ return (node.getInt( "F", 0 ) & BOLD_FLAG) == BOLD_FLAG;
+ }
+
+ /**
+ * Set the bold property of the text.
+ *
+ * @param bold The new bold flag.
+ */
+ public void setBold( boolean bold )
+ {
+ int f = node.getInt( "F", 0 );
+ if( bold )
+ {
+ f = f | BOLD_FLAG;
+ }
+ else
+ {
+ f = f ^ BOLD_FLAG;
+ }
+ node.setInt( "F", f );
+ }
+
+}
diff --git a/src/main/java/org/pdfbox/pdmodel/interactive/documentnavigation/outline/PDOutlineNode.java b/src/main/java/org/pdfbox/pdmodel/interactive/documentnavigation/outline/PDOutlineNode.java
new file mode 100644
index 0000000..04cc45f
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/interactive/documentnavigation/outline/PDOutlineNode.java
@@ -0,0 +1,320 @@
+/**
+ * Copyright (c) 2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.interactive.documentnavigation.outline;
+
+import org.pdfbox.cos.COSBase;
+import org.pdfbox.cos.COSDictionary;
+
+import org.pdfbox.pdmodel.common.COSObjectable;
+
+/**
+ * This represents an node in an outline in a pdf document.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.1 $
+ */
+public class PDOutlineNode implements COSObjectable
+{
+ /**
+ * The dictionary for this node.
+ */
+ protected COSDictionary node;
+
+ /**
+ * Default Constructor.
+ */
+ public PDOutlineNode()
+ {
+ node = new COSDictionary();
+ }
+
+ /**
+ * Default Constructor.
+ *
+ * @param dict The dictionary storage.
+ */
+ public PDOutlineNode( COSDictionary dict)
+ {
+ node = dict;
+ }
+
+ /**
+ * Convert this standard java object to a COS object.
+ *
+ * @return The cos object that matches this Java object.
+ */
+ public COSBase getCOSObject()
+ {
+ return node;
+ }
+
+ /**
+ * Convert this standard java object to a COS object.
+ *
+ * @return The cos object that matches this Java object.
+ */
+ public COSDictionary getCOSDictionary()
+ {
+ return node;
+ }
+
+ /**
+ * Get the parent of this object. This will either be a DocumentOutline or an OutlineItem.
+ *
+ * @return The parent of this object, or null if this is the document outline and there
+ * is no parent.
+ */
+ public PDOutlineNode getParent()
+ {
+ PDOutlineNode retval = null;
+ COSDictionary parent = (COSDictionary)node.getDictionaryObject( "Parent" );
+ if( parent != null )
+ {
+ if( parent.getDictionaryObject( "Parent") == null )
+ {
+ retval = new PDDocumentOutline( parent );
+ }
+ else
+ {
+ retval = new PDOutlineItem( parent );
+ }
+ }
+
+ return retval;
+ }
+
+ /**
+ * Set the parent of this object, this is maintained by these objects and should not
+ * be called by any clients of PDFBox code.
+ *
+ * @param parent The parent of this object.
+ */
+ protected void setParent( PDOutlineNode parent )
+ {
+ node.setItem( "Parent", parent );
+ }
+
+ /**
+ * append a child node to this node.
+ *
+ * @param outlineNode The node to add.
+ */
+ public void appendChild( PDOutlineItem outlineNode )
+ {
+ outlineNode.setParent( this );
+ if( getFirstChild() == null )
+ {
+ int currentOpenCount = getOpenCount();
+ setFirstChild( outlineNode );
+ //1 for the the item we are adding;
+ int numberOfOpenNodesWeAreAdding = 1;
+ if( outlineNode.isNodeOpen() )
+ {
+ numberOfOpenNodesWeAreAdding += outlineNode.getOpenCount();
+ }
+ if( isNodeOpen() )
+ {
+ setOpenCount( currentOpenCount + numberOfOpenNodesWeAreAdding );
+ }
+ else
+ {
+ setOpenCount( currentOpenCount - numberOfOpenNodesWeAreAdding );
+ }
+ updateParentOpenCount( numberOfOpenNodesWeAreAdding );
+ }
+ else
+ {
+ PDOutlineItem previousLastChild = getLastChild();
+ previousLastChild.insertSiblingAfter( outlineNode );
+ }
+ setLastChild( outlineNode );
+ }
+
+ /**
+ * Return the first child or null if there is no child.
+ *
+ * @return The first child.
+ */
+ public PDOutlineItem getFirstChild()
+ {
+ PDOutlineItem last = null;
+ COSDictionary lastDic = (COSDictionary)node.getDictionaryObject( "First" );
+ if( lastDic != null )
+ {
+ last = new PDOutlineItem( lastDic );
+ }
+ return last;
+ }
+
+ /**
+ * Set the first child, this will be maintained by this class.
+ *
+ * @param outlineNode The new first child.
+ */
+ protected void setFirstChild( PDOutlineNode outlineNode )
+ {
+ node.setItem( "First", outlineNode );
+ }
+
+ /**
+ * Return the last child or null if there is no child.
+ *
+ * @return The last child.
+ */
+ public PDOutlineItem getLastChild()
+ {
+ PDOutlineItem last = null;
+ COSDictionary lastDic = (COSDictionary)node.getDictionaryObject( "Last" );
+ if( lastDic != null )
+ {
+ last = new PDOutlineItem( lastDic );
+ }
+ return last;
+ }
+
+ /**
+ * Set the last child, this will be maintained by this class.
+ *
+ * @param outlineNode The new last child.
+ */
+ protected void setLastChild( PDOutlineNode outlineNode )
+ {
+ node.setItem( "Last", outlineNode );
+ }
+
+ /**
+ * Get the number of open nodes. Or a negative number if this node
+ * is closed. See PDF Reference for more details. This value
+ * is updated as you append children and siblings.
+ *
+ * @return The Count attribute of the outline dictionary.
+ */
+ public int getOpenCount()
+ {
+ return node.getInt( "Count", 0 );
+ }
+
+ /**
+ * Set the open count. This number is automatically managed for you
+ * when you add items to the outline.
+ *
+ * @param openCount The new open cound.
+ */
+ protected void setOpenCount( int openCount )
+ {
+ node.setInt( "Count", openCount );
+ }
+
+ /**
+ * This will set this node to be open when it is shown in the viewer. By default, when
+ * a new node is created it will be closed.
+ * This will do nothing if the node is already open.
+ */
+ public void openNode()
+ {
+ //if the node is already open then do nothing.
+ if( !isNodeOpen() )
+ {
+ int openChildrenCount = 0;
+ PDOutlineItem currentChild = getFirstChild();
+ while( currentChild != null )
+ {
+ //first increase by one for the current child
+ openChildrenCount++;
+ //then increase by the number of open nodes the child has
+ if( currentChild.isNodeOpen() )
+ {
+ openChildrenCount += currentChild.getOpenCount();
+ }
+ currentChild = currentChild.getNextSibling();
+ }
+ setOpenCount( openChildrenCount );
+ updateParentOpenCount( openChildrenCount );
+ }
+ }
+
+ /**
+ * Close this node.
+ *
+ */
+ public void closeNode()
+ {
+ //if the node is already closed then do nothing.
+ if( isNodeOpen() )
+ {
+ int openCount = getOpenCount();
+ updateParentOpenCount( -openCount );
+ setOpenCount( -openCount );
+ }
+ }
+
+ /**
+ * Node is open if the open count is greater than zero.
+ * @return true if this node is open.
+ */
+ public boolean isNodeOpen()
+ {
+ return getOpenCount() > 0;
+ }
+
+ /**
+ * The count parameter needs to be updated when you add or remove elements to
+ * the outline. When you add an element at a lower level then you need to
+ * increase all of the parents.
+ *
+ * @param amount The amount to update by.
+ */
+ protected void updateParentOpenCount( int amount )
+ {
+ PDOutlineNode parent = getParent();
+ if( parent != null )
+ {
+ int currentCount = parent.getOpenCount();
+ //if the currentCount is negative or it is absent then
+ //we will treat it as negative. The default is to be negative.
+ boolean negative = currentCount < 0 ||
+ parent.getCOSDictionary().getDictionaryObject( "Count" ) == null;
+ currentCount = Math.abs( currentCount );
+ currentCount += amount;
+ if( negative )
+ {
+ currentCount = -currentCount;
+ }
+ parent.setOpenCount( currentCount );
+ //recursively call parent to update count, but the parents count is only
+ //updated if this is an open node
+ if( !negative )
+ {
+ parent.updateParentOpenCount( amount );
+ }
+ }
+ }
+}
diff --git a/src/main/java/org/pdfbox/pdmodel/interactive/documentnavigation/outline/package.html b/src/main/java/org/pdfbox/pdmodel/interactive/documentnavigation/outline/package.html
new file mode 100644
index 0000000..4ec0032
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/interactive/documentnavigation/outline/package.html
@@ -0,0 +1,9 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head>
+
+</head>
+<body>
+The outline package allows for a PDF outline(bookmarks) to be created.
+</body>
+</html>
diff --git a/src/main/java/org/pdfbox/pdmodel/interactive/documentnavigation/package.html b/src/main/java/org/pdfbox/pdmodel/interactive/documentnavigation/package.html
new file mode 100644
index 0000000..b210cf5
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/interactive/documentnavigation/package.html
@@ -0,0 +1,9 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head>
+
+</head>
+<body>
+A package to allow access to document level navigation within a PDF document.
+</body>
+</html>
diff --git a/src/main/java/org/pdfbox/pdmodel/interactive/form/PDAcroForm.java b/src/main/java/org/pdfbox/pdmodel/interactive/form/PDAcroForm.java
new file mode 100644
index 0000000..4fb576d
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/interactive/form/PDAcroForm.java
@@ -0,0 +1,328 @@
+/**
+ * Copyright (c) 2003-2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.interactive.form;
+
+import org.pdfbox.cos.COSArray;
+import org.pdfbox.cos.COSDictionary;
+import org.pdfbox.cos.COSName;
+import org.pdfbox.cos.COSString;
+
+import org.pdfbox.pdmodel.PDDocument;
+import org.pdfbox.pdmodel.PDResources;
+
+import org.pdfbox.pdmodel.fdf.FDFDictionary;
+import org.pdfbox.pdmodel.fdf.FDFDocument;
+import org.pdfbox.pdmodel.fdf.FDFCatalog;
+import org.pdfbox.pdmodel.fdf.FDFField;
+
+import java.io.IOException;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * This class represents the acroform of a PDF document.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.8 $
+ */
+public class PDAcroForm
+{
+ private COSDictionary acroForm;
+ private PDDocument document;
+
+ private Map fieldCache;
+
+ /**
+ * Constructor.
+ *
+ * @param doc The document that this form is part of.
+ */
+ public PDAcroForm( PDDocument doc )
+ {
+ document = doc;
+ acroForm = new COSDictionary();
+ COSArray fields = new COSArray();
+ acroForm.setItem( COSName.getPDFName( "Fields" ), fields );
+ }
+
+ /**
+ * Constructor.
+ *
+ * @param doc The document that this form is part of.
+ * @param form The existing acroForm.
+ */
+ public PDAcroForm( PDDocument doc, COSDictionary form )
+ {
+ document = doc;
+ acroForm = form;
+ }
+
+ /**
+ * This will get the document associated with this form.
+ *
+ * @return The PDF document.
+ */
+ public PDDocument getDocument()
+ {
+ return document;
+ }
+
+ /**
+ * This will get the dictionary that this form wraps.
+ *
+ * @return The dictionary for this form.
+ */
+ public COSDictionary getDictionary()
+ {
+ return acroForm;
+ }
+
+ /**
+ * This method will import an entire FDF document into the PDF document
+ * that this acroform is part of.
+ *
+ * @param fdf The FDF document to import.
+ *
+ * @throws IOException If there is an error doing the import.
+ */
+ public void importFDF( FDFDocument fdf ) throws IOException
+ {
+ List fields = fdf.getCatalog().getFDF().getFields();
+ if( fields != null )
+ {
+ for( int i=0; i<fields.size(); i++ )
+ {
+ FDFField fdfField = (FDFField)fields.get( i );
+ PDField docField = getField( fdfField.getPartialFieldName() );
+ if( docField != null )
+ {
+ docField.importFDF( fdfField );
+ }
+ }
+ }
+ }
+
+ /**
+ * This will export all FDF form data.
+ *
+ * @return An FDF document used to export the document.
+ * @throws IOException If there is an error when exporting the document.
+ */
+ public FDFDocument exportFDF() throws IOException
+ {
+ FDFDocument fdf = new FDFDocument();
+ FDFCatalog catalog = fdf.getCatalog();
+ FDFDictionary fdfDict = new FDFDictionary();
+ catalog.setFDF( fdfDict );
+
+ List fdfFields = new ArrayList();
+ List fields = getFields();
+ Iterator fieldIter = fields.iterator();
+ while( fieldIter.hasNext() )
+ {
+ PDField docField = (PDField)fieldIter.next();
+ addFieldAndChildren( docField, fdfFields );
+ }
+ fdfDict.setID( document.getDocument().getDocumentID() );
+ if( fdfFields.size() > 0 )
+ {
+ fdfDict.setFields( fdfFields );
+ }
+ return fdf;
+ }
+
+ private void addFieldAndChildren( PDField docField, List fdfFields ) throws IOException
+ {
+ Object fieldValue = docField.getValue();
+ FDFField fdfField = new FDFField();
+ fdfField.setPartialFieldName( docField.getPartialName() );
+ fdfField.setValue( fieldValue );
+ List kids = docField.getKids();
+ List childFDFFields = new ArrayList();
+ if( kids != null )
+ {
+
+ for( int i=0; i<kids.size(); i++ )
+ {
+ addFieldAndChildren( (PDField)kids.get( i ), childFDFFields );
+ }
+ if( childFDFFields.size() > 0 )
+ {
+ fdfField.setKids( childFDFFields );
+ }
+ }
+ if( fieldValue != null || childFDFFields.size() > 0 )
+ {
+ fdfFields.add( fdfField );
+ }
+ }
+
+ /**
+ * This will return all of the fields in the document. The type
+ * will be a org.pdfbox.pdmodel.field.PDField.
+ *
+ * @return A list of all the fields.
+ * @throws IOException If there is an error while getting the list of fields.
+ */
+ public List getFields() throws IOException
+ {
+ COSArray fields =
+ (COSArray) acroForm.getDictionaryObject(
+ COSName.getPDFName("Fields"));
+
+ List retval = new ArrayList();
+ for (int i = 0; i < fields.size(); i++)
+ {
+ COSDictionary element = (COSDictionary) fields.getObject(i);
+ if (element != null)
+ {
+ PDField field = PDFieldFactory.createField( this, element );
+ if( field != null )
+ {
+ retval.add(field);
+ }
+ }
+ }
+ return retval;
+ }
+
+ /**
+ * This will tell this form to cache the fields into a Map structure
+ * for fast access via the getField method. The default is false. You would
+ * want this to be false if you were changing the COSDictionary behind the scenes,
+ * otherwise setting this to true is acceptable.
+ *
+ * @param cache A boolean telling if we should cache the fields.
+ * @throws IOException If there is an error while caching the fields.
+ */
+ public void setCacheFields( boolean cache ) throws IOException
+ {
+ if( cache )
+ {
+ fieldCache = new HashMap();
+ List fields = getFields();
+ Iterator fieldIter = fields.iterator();
+ while( fieldIter.hasNext() )
+ {
+ PDField next = (PDField)fieldIter.next();
+ fieldCache.put( next.getFullyQualifiedName(), next );
+ }
+ }
+ else
+ {
+ fieldCache = null;
+ }
+ }
+
+ /**
+ * This will tell if this acro form is caching the fields.
+ *
+ * @return true if the fields are being cached.
+ */
+ public boolean isCachingFields()
+ {
+ return fieldCache != null;
+ }
+
+ /**
+ * This will get a field by name, possibly using the cache if setCache is true.
+ *
+ * @param name The name of the field to get.
+ *
+ * @return The field with that name of null if one was not found.
+ *
+ * @throws IOException If there is an error getting the field type.
+ */
+ public PDField getField( String name ) throws IOException
+ {
+ PDField retval = null;
+ if( fieldCache != null )
+ {
+ retval = (PDField)fieldCache.get( name );
+ }
+ else
+ {
+ COSArray fields =
+ (COSArray) acroForm.getDictionaryObject(
+ COSName.getPDFName("Fields"));
+
+ for (int i = 0; i < fields.size() && retval == null; i++)
+ {
+ COSDictionary element = (COSDictionary) fields.getObject(i);
+ if( element != null )
+ {
+ COSString fieldName =
+ (COSString)element.getDictionaryObject( COSName.getPDFName( "T" ) );
+ if( fieldName.getString().equals( name ) )
+ {
+ retval = PDFieldFactory.createField( this, element );
+ }
+ }
+ }
+ }
+ return retval;
+ }
+
+ /**
+ * This will get the default resources for the acro form.
+ *
+ * @return The default resources.
+ */
+ public PDResources getDefaultResources()
+ {
+ PDResources retval = null;
+ COSDictionary dr = (COSDictionary)acroForm.getDictionaryObject( COSName.getPDFName( "DR" ) );
+ if( dr != null )
+ {
+ retval = new PDResources( dr );
+ }
+ return retval;
+ }
+
+ /**
+ * This will set the default resources for the acroform.
+ *
+ * @param dr The new default resources.
+ */
+ public void setDefaultResources( PDResources dr )
+ {
+ COSDictionary drDict = null;
+ if( dr != null )
+ {
+ drDict = dr.getCOSDictionary();
+ }
+ acroForm.setItem( COSName.getPDFName( "DR" ), drDict );
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/interactive/form/PDAppearance.java b/src/main/java/org/pdfbox/pdmodel/interactive/form/PDAppearance.java
new file mode 100644
index 0000000..ff18c86
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/interactive/form/PDAppearance.java
@@ -0,0 +1,645 @@
+/**
+ * Copyright (c) 2003-2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.interactive.form;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.PrintWriter;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.pdfbox.cos.COSArray;
+import org.pdfbox.cos.COSDictionary;
+import org.pdfbox.cos.COSFloat;
+import org.pdfbox.cos.COSName;
+import org.pdfbox.cos.COSNumber;
+import org.pdfbox.cos.COSStream;
+import org.pdfbox.cos.COSString;
+
+import org.pdfbox.pdfparser.PDFStreamParser;
+import org.pdfbox.pdfwriter.ContentStreamWriter;
+
+import org.pdfbox.pdmodel.PDResources;
+
+import org.pdfbox.pdmodel.common.PDRectangle;
+
+import org.pdfbox.pdmodel.font.PDFont;
+import org.pdfbox.pdmodel.font.PDFontDescriptor;
+import org.pdfbox.pdmodel.font.PDSimpleFont;
+
+import org.pdfbox.pdmodel.interactive.action.PDAdditionalActions;
+import org.pdfbox.pdmodel.interactive.annotation.PDAppearanceDictionary;
+import org.pdfbox.pdmodel.interactive.annotation.PDAppearanceStream;
+import org.pdfbox.pdmodel.interactive.annotation.PDAnnotationWidget;
+
+import org.pdfbox.util.PDFOperator;
+
+/**
+ * This one took me a while, but i'm proud to say that it handles
+ * the appearance of a textbox. This allows you to apply a value to
+ * a field in the document and handle the appearance so that the
+ * value is actually visible too.
+ * The problem was described by Ben Litchfield, the author of the
+ * example: org.pdfbox.examlpes.fdf.ImportFDF. So Ben, here is the
+ * solution.
+ *
+ * @author sug
+ * @author Ben Litchfield (ben@benlitchfield.com)
+ * @version $Revision: 1.17 $
+ */
+public class PDAppearance
+{
+ private PDVariableText parent;
+
+ private String value;
+ private COSString defaultAppearance;
+
+ private PDAcroForm acroForm;
+ private List widgets = new ArrayList();
+
+
+ /**
+ * Constructs a COSAppearnce from the given field.
+ *
+ * @param theAcroForm the acro form that this field is part of.
+ * @param field the field which you wish to control the appearance of
+ * @throws IOException If there is an error creating the appearance.
+ */
+ public PDAppearance( PDAcroForm theAcroForm, PDVariableText field ) throws IOException
+ {
+ acroForm = theAcroForm;
+ parent = field;
+
+ widgets = field.getKids();
+ if( widgets == null )
+ {
+ widgets = new ArrayList();
+ widgets.add( field.getWidget() );
+ }
+
+ defaultAppearance = getDefaultAppearance();
+
+
+ }
+
+ /**
+ * Returns the default apperance of a textbox. If the textbox
+ * does not have one, then it will be taken from the AcroForm.
+ * @return The DA element
+ */
+ private COSString getDefaultAppearance()
+ {
+
+ COSString dap = parent.getDefaultAppearance();
+ if (dap == null)
+ {
+ COSArray kids = (COSArray)parent.getDictionary().getDictionaryObject( "Kids" );
+ if( kids != null && kids.size() > 0 )
+ {
+ COSDictionary firstKid = (COSDictionary)kids.getObject( 0 );
+ dap = (COSString)firstKid.getDictionaryObject( "DA" );
+ }
+ if( dap == null )
+ {
+ dap = (COSString) acroForm.getDictionary().getDictionaryObject(COSName.getPDFName("DA"));
+ }
+ }
+ return dap;
+ }
+
+ private int getQ()
+ {
+ int q = parent.getQ();
+ if( parent.getDictionary().getDictionaryObject( "Q" ) == null )
+ {
+ COSArray kids = (COSArray)parent.getDictionary().getDictionaryObject( "Kids" );
+ if( kids != null && kids.size() > 0 )
+ {
+ COSDictionary firstKid = (COSDictionary)kids.getObject( 0 );
+ COSNumber qNum = (COSNumber)firstKid.getDictionaryObject( "Q" );
+ if( qNum != null )
+ {
+ q = qNum.intValue();
+ }
+ }
+ }
+ return q;
+ }
+
+ /**
+ * Extracts the original appearance stream into a list of tokens.
+ *
+ * @return The tokens in the original appearance stream
+ */
+ private List getStreamTokens( PDAppearanceStream appearanceStream ) throws IOException
+ {
+ List tokens = null;
+ if( appearanceStream != null )
+ {
+ tokens = getStreamTokens( appearanceStream.getStream() );
+ }
+ return tokens;
+ }
+
+ private List getStreamTokens( COSString string ) throws IOException
+ {
+ PDFStreamParser parser;
+
+ List tokens = null;
+ if( string != null )
+ {
+ ByteArrayInputStream stream = new ByteArrayInputStream( string.getBytes() );
+ parser = new PDFStreamParser( stream, acroForm.getDocument().getDocument().getScratchFile() );
+ parser.parse();
+ tokens = parser.getTokens();
+ }
+ return tokens;
+ }
+
+ private List getStreamTokens( COSStream stream ) throws IOException
+ {
+ PDFStreamParser parser;
+
+ List tokens = null;
+ if( stream != null )
+ {
+ parser = new PDFStreamParser( stream );
+ parser.parse();
+ tokens = parser.getTokens();
+ }
+ return tokens;
+ }
+
+ /**
+ * Tests if the apperance stream already contains content.
+ *
+ * @return true if it contains any content
+ */
+ private boolean containsMarkedContent( List stream )
+ {
+ return stream.contains( PDFOperator.getOperator( "BMC" ) );
+ }
+
+ /**
+ * This is the public method for setting the appearance stream.
+ *
+ * @param apValue the String value which the apperance shoud represent
+ *
+ * @throws IOException If there is an error creating the stream.
+ */
+ public void setAppearanceValue(String apValue) throws IOException
+ {
+ // MulitLine check and set
+ if ( parent.isMultiline() && apValue.indexOf('\n') != -1 )
+ {
+ apValue = convertToMultiLine( apValue );
+ }
+
+ value = apValue;
+ Iterator widgetIter = widgets.iterator();
+ while( widgetIter.hasNext() )
+ {
+ Object next = widgetIter.next();
+ PDAnnotationWidget widget = null;
+ if( next instanceof PDField )
+ {
+ widget = ((PDField)next).getWidget();
+ }
+ else
+ {
+ widget = (PDAnnotationWidget)next;
+ }
+ PDAdditionalActions actions = widget.getActions();
+ if( actions != null &&
+ actions.getF() != null &&
+ widget.getDictionary().getDictionaryObject( "AP" ) ==null)
+ {
+ //do nothing because the field will be formatted by acrobat
+ //when it is opened. See FreedomExpressions.pdf for an example of this.
+ }
+ else
+ {
+
+ PDAppearanceDictionary appearance = widget.getAppearance();
+ if( appearance == null )
+ {
+ appearance = new PDAppearanceDictionary();
+ widget.setAppearance( appearance );
+ }
+
+ Map normalAppearance = appearance.getNormalAppearance();
+ PDAppearanceStream appearanceStream = (PDAppearanceStream)normalAppearance.get( "default" );
+ if( appearanceStream == null )
+ {
+ COSStream cosStream = new COSStream( acroForm.getDocument().getDocument().getScratchFile() );
+ appearanceStream = new PDAppearanceStream( cosStream );
+ appearanceStream.setBoundingBox( widget.getRectangle().createRetranslatedRectangle() );
+ appearance.setNormalAppearance( appearanceStream );
+ }
+
+ List tokens = getStreamTokens( appearanceStream );
+ List daTokens = getStreamTokens( getDefaultAppearance() );
+ PDFont pdFont = getFontAndUpdateResources( tokens, appearanceStream );
+
+ if (!containsMarkedContent( tokens ))
+ {
+ ByteArrayOutputStream output = new ByteArrayOutputStream();
+
+ //BJL 9/25/2004 Must prepend existing stream
+ //because it might have operators to draw things like
+ //rectangles and such
+ ContentStreamWriter writer = new ContentStreamWriter( output );
+ writer.writeTokens( tokens );
+
+ output.write( " /Tx BMC\n".getBytes() );
+ insertGeneratedAppearance( widget, output, pdFont, tokens, appearanceStream );
+ output.write( " EMC".getBytes() );
+ writeToStream( output.toByteArray(), appearanceStream );
+ }
+ else
+ {
+ if( tokens != null )
+ {
+ if( daTokens != null )
+ {
+ int bmcIndex = tokens.indexOf( PDFOperator.getOperator( "BMC" ));
+ int emcIndex = tokens.indexOf( PDFOperator.getOperator( "EMC" ));
+ if( bmcIndex != -1 && emcIndex != -1 &&
+ emcIndex == bmcIndex+1 )
+ {
+ //if the EMC immediately follows the BMC index then should
+ //insert the daTokens inbetween the two markers.
+ tokens.addAll( emcIndex, daTokens );
+ }
+ }
+ ByteArrayOutputStream output = new ByteArrayOutputStream();
+ ContentStreamWriter writer = new ContentStreamWriter( output );
+ float fontSize = calculateFontSize( pdFont, appearanceStream.getBoundingBox(), tokens, null );
+ boolean foundString = false;
+ for( int i=0; i<tokens.size(); i++ )
+ {
+ if( tokens.get( i ) instanceof COSString )
+ {
+ foundString = true;
+ COSString drawnString =((COSString)tokens.get(i));
+ drawnString.reset();
+ drawnString.append( apValue.getBytes() );
+ }
+ }
+ int setFontIndex = tokens.indexOf( PDFOperator.getOperator( "Tf" ));
+ tokens.set( setFontIndex-1, new COSFloat( fontSize ) );
+ if( foundString )
+ {
+ writer.writeTokens( tokens );
+ }
+ else
+ {
+ int bmcIndex = tokens.indexOf( PDFOperator.getOperator( "BMC" ) );
+ int emcIndex = tokens.indexOf( PDFOperator.getOperator( "EMC" ) );
+
+ if( bmcIndex != -1 )
+ {
+ writer.writeTokens( tokens, 0, bmcIndex+1 );
+ }
+ else
+ {
+ writer.writeTokens( tokens );
+ }
+ output.write( "\n".getBytes() );
+ insertGeneratedAppearance( widget, output,
+ pdFont, tokens, appearanceStream );
+ if( emcIndex != -1 )
+ {
+ writer.writeTokens( tokens, emcIndex, tokens.size() );
+ }
+ }
+ writeToStream( output.toByteArray(), appearanceStream );
+ }
+ else
+ {
+ //hmm?
+ }
+ }
+ }
+ }
+ }
+
+ private void insertGeneratedAppearance( PDAnnotationWidget fieldWidget, OutputStream output,
+ PDFont pdFont, List tokens, PDAppearanceStream appearanceStream ) throws IOException
+ {
+ PrintWriter printWriter = new PrintWriter( output, true );
+ float fontSize = 0.0f;
+ PDRectangle boundingBox = null;
+ boundingBox = appearanceStream.getBoundingBox();
+ if( boundingBox == null )
+ {
+ boundingBox = fieldWidget.getRectangle().createRetranslatedRectangle();
+ }
+ printWriter.println( "BT" );
+ if( defaultAppearance != null )
+ {
+ String daString = defaultAppearance.getString();
+ PDFStreamParser daParser = new PDFStreamParser(new ByteArrayInputStream( daString.getBytes() ), null );
+ daParser.parse();
+ List daTokens = daParser.getTokens();
+ fontSize = calculateFontSize( pdFont, boundingBox, tokens, daTokens );
+ int fontIndex = daTokens.indexOf( PDFOperator.getOperator( "Tf" ) );
+ if(fontIndex != -1 )
+ {
+ daTokens.set( fontIndex-1, new COSFloat( fontSize ) );
+ }
+ ContentStreamWriter daWriter = new ContentStreamWriter(output);
+ daWriter.writeTokens( daTokens );
+ }
+ printWriter.println( getTextPosition( boundingBox, pdFont, fontSize, tokens ) );
+ int q = getQ();
+ if( q == PDTextbox.QUADDING_LEFT )
+ {
+ //do nothing because left is default
+ }
+ else if( q == PDTextbox.QUADDING_CENTERED ||
+ q == PDTextbox.QUADDING_RIGHT )
+ {
+ float fieldWidth = boundingBox.getWidth();
+ float stringWidth = (pdFont.getStringWidth( value )/1000)*fontSize;
+ float adjustAmount = fieldWidth - stringWidth - 4;
+
+ if( q == PDTextbox.QUADDING_CENTERED )
+ {
+ adjustAmount = adjustAmount/2.0f;
+ }
+
+ printWriter.println( adjustAmount + " 0 Td" );
+ }
+ else
+ {
+ throw new IOException( "Error: Unknown justification value:" + q );
+ }
+ printWriter.println("(" + value + ") Tj");
+ printWriter.println("ET" );
+ printWriter.flush();
+ }
+
+ private PDFont getFontAndUpdateResources( List tokens, PDAppearanceStream appearanceStream ) throws IOException
+ {
+
+ PDFont retval = null;
+ PDResources streamResources = appearanceStream.getResources();
+ PDResources formResources = acroForm.getDefaultResources();
+ if( formResources != null )
+ {
+ if( streamResources == null )
+ {
+ streamResources = new PDResources();
+ appearanceStream.setResources( streamResources );
+ }
+
+ COSString da = getDefaultAppearance();
+ if( da != null )
+ {
+ String data = da.getString();
+ PDFStreamParser streamParser = new PDFStreamParser(
+ new ByteArrayInputStream( data.getBytes() ), null );
+ streamParser.parse();
+ tokens = streamParser.getTokens();
+ }
+
+ int setFontIndex = tokens.indexOf( PDFOperator.getOperator( "Tf" ));
+ COSName cosFontName = (COSName)tokens.get( setFontIndex-2 );
+ String fontName = cosFontName.getName();
+ retval = (PDFont)streamResources.getFonts().get( fontName );
+ if( retval == null )
+ {
+ retval = (PDFont)formResources.getFonts().get( fontName );
+ streamResources.getFonts().put( fontName, retval );
+ }
+ }
+ return retval;
+ }
+
+ private String convertToMultiLine( String line )
+ {
+ int currIdx = 0;
+ int lastIdx = 0;
+ StringBuffer result = new StringBuffer(line.length() + 64);
+ while( (currIdx = line.indexOf('\n',lastIdx )) > -1 )
+ {
+ result.append(value.substring(lastIdx,currIdx));
+ result.append(" ) Tj\n0 -13 Td\n(");
+ lastIdx = currIdx + 1;
+ }
+ result.append(line.substring(lastIdx));
+ return result.toString();
+ }
+
+ /**
+ * Writes the stream to the actual stream in the COSStream.
+ *
+ * @throws IOException If there is an error writing to the stream
+ */
+ private void writeToStream( byte[] data, PDAppearanceStream appearanceStream ) throws IOException
+ {
+ OutputStream out = appearanceStream.getStream().createUnfilteredStream();
+ out.write( data );
+ out.flush();
+ }
+
+
+ /**
+ * w in an appearance stream represents the lineWidth.
+ * @return the linewidth
+ */
+ private float getLineWidth( List tokens )
+ {
+
+ float retval = 1;
+ if( tokens != null )
+ {
+ int btIndex = tokens.indexOf(PDFOperator.getOperator( "BT" ));
+ int wIndex = tokens.indexOf(PDFOperator.getOperator( "w" ));
+ //the w should only be used if it is before the first BT.
+ if( (wIndex > 0) && (wIndex < btIndex) )
+ {
+ retval = ((COSNumber)tokens.get(wIndex-1)).floatValue();
+ }
+ }
+ return retval;
+ }
+
+ private PDRectangle getSmallestDrawnRectangle( PDRectangle boundingBox, List tokens )
+ {
+ PDRectangle smallest = boundingBox;
+ for( int i=0; i<tokens.size(); i++ )
+ {
+ Object next = tokens.get( i );
+ if( next == PDFOperator.getOperator( "re" ) )
+ {
+ COSNumber x = (COSNumber)tokens.get( i-4 );
+ COSNumber y = (COSNumber)tokens.get( i-3 );
+ COSNumber width = (COSNumber)tokens.get( i-2 );
+ COSNumber height = (COSNumber)tokens.get( i-1 );
+ PDRectangle potentialSmallest = new PDRectangle();
+ potentialSmallest.setLowerLeftX( x.floatValue() );
+ potentialSmallest.setLowerLeftY( y.floatValue() );
+ potentialSmallest.setUpperRightX( x.floatValue() + width.floatValue() );
+ potentialSmallest.setUpperRightY( y.floatValue() + height.floatValue() );
+ if( smallest == null ||
+ smallest.getLowerLeftX() < potentialSmallest.getLowerLeftX() ||
+ smallest.getUpperRightY() > potentialSmallest.getUpperRightY() )
+ {
+ smallest = potentialSmallest;
+ }
+
+ }
+ }
+ return smallest;
+ }
+
+ /**
+ * My "not so great" method for calculating the fontsize.
+ * It does not work superb, but it handles ok.
+ * @return the calculated font-size
+ *
+ * @throws IOException If there is an error getting the font height.
+ */
+ private float calculateFontSize( PDFont pdFont, PDRectangle boundingBox, List tokens, List daTokens )
+ throws IOException
+ {
+ float fontSize = 0;
+ if( daTokens != null )
+ {
+ //daString looks like "BMC /Helv 3.4 Tf EMC"
+
+ int fontIndex = daTokens.indexOf( PDFOperator.getOperator( "Tf" ) );
+ if(fontIndex != -1 )
+ {
+ fontSize = ((COSNumber)daTokens.get(fontIndex-1)).floatValue();
+ }
+ }
+ if( parent.doNotScroll() )
+ {
+ //if we don't scroll then we will shrink the font to fit into the text area.
+ float widthAtFontSize1 = pdFont.getStringWidth( value );
+ float availableWidth = boundingBox.getWidth();
+ float perfectFitFontSize = availableWidth / widthAtFontSize1;
+ }
+ else if( fontSize == 0 )
+ {
+ float lineWidth = getLineWidth( tokens );
+ float stringWidth = pdFont.getStringWidth( value );
+ float height = 0;
+ if( pdFont instanceof PDSimpleFont )
+ {
+ height = ((PDSimpleFont)pdFont).getFontDescriptor().getFontBoundingBox().getHeight();
+ }
+ else
+ {
+ //now much we can do, so lets assume font is square and use width
+ //as the height
+ height = pdFont.getAverageFontWidth();
+ }
+ height = height/1000f;
+
+ float availHeight = getAvailableHeight( boundingBox, lineWidth );
+ fontSize =(availHeight/height);
+ }
+ return fontSize;
+ }
+
+ /**
+ * Calculates where to start putting the text in the box.
+ * The positioning is not quite as accurate as when Acrobat
+ * places the elements, but it works though.
+ *
+ * @return the sting for representing the start position of the text
+ *
+ * @throws IOException If there is an error calculating the text position.
+ */
+ private String getTextPosition( PDRectangle boundingBox, PDFont pdFont, float fontSize, List tokens )
+ throws IOException
+ {
+ float lineWidth = getLineWidth( tokens );
+ float pos = 0.0f;
+ if(parent.isMultiline())
+ {
+ int rows = (int) (getAvailableHeight( boundingBox, lineWidth ) / ((int) fontSize));
+ pos = ((rows)*fontSize)-fontSize;
+ }
+ else
+ {
+ if( pdFont instanceof PDSimpleFont )
+ {
+ //BJL 9/25/2004
+ //This algorithm is a little bit of black magic. It does
+ //not appear to be documented anywhere. Through examining a few
+ //PDF documents and the value that Acrobat places in there I
+ //have determined that the below method of computing the position
+ //is correct for certain documents, but maybe not all. It does
+ //work f1040ez.pdf and Form_1.pdf
+ PDFontDescriptor fd = ((PDSimpleFont)pdFont).getFontDescriptor();
+ float bBoxHeight = boundingBox.getHeight();
+ float fontHeight = fd.getFontBoundingBox().getHeight() + 2 * fd.getDescent();
+ fontHeight = (fontHeight/1000) * fontSize;
+ pos = (bBoxHeight - fontHeight)/2;
+ }
+ else
+ {
+ throw new IOException( "Error: Don't know how to calculate the position for non-simple fonts" );
+ }
+ }
+ PDRectangle innerBox = getSmallestDrawnRectangle( boundingBox, tokens );
+ float xInset = 2+ 2*(boundingBox.getWidth() - innerBox.getWidth());
+ return Math.round(xInset) + " "+ pos + " Td";
+ }
+
+ /**
+ * calculates the available width of the box.
+ * @return the calculated available width of the box
+ */
+ private float getAvailableWidth( PDRectangle boundingBox, float lineWidth )
+ {
+ return boundingBox.getWidth() - 2 * lineWidth;
+ }
+
+ /**
+ * calculates the available height of the box.
+ * @return the calculated available height of the box
+ */
+ private float getAvailableHeight( PDRectangle boundingBox, float lineWidth )
+ {
+ return boundingBox.getHeight() - 2 * lineWidth;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/interactive/form/PDCheckbox.java b/src/main/java/org/pdfbox/pdmodel/interactive/form/PDCheckbox.java
new file mode 100644
index 0000000..2e175d0
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/interactive/form/PDCheckbox.java
@@ -0,0 +1,187 @@
+/**
+ * Copyright (c) 2003-2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.interactive.form;
+
+import org.pdfbox.cos.COSBase;
+import org.pdfbox.cos.COSDictionary;
+import org.pdfbox.cos.COSName;
+
+import java.io.IOException;
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * A class for handling the PDF field as a checkbox.
+ *
+ * @author sug
+ * @version $Revision: 1.10 $
+ */
+public class PDCheckbox extends PDChoiceButton
+{
+ private static final COSName KEY = COSName.getPDFName("AS");
+ private static final COSName OFF_VALUE = COSName.getPDFName("Off");
+
+ private COSName value;
+
+ /**
+ * @see PDField#PDField(PDAcroForm,COSDictionary)
+ *
+ * @param theAcroForm The acroForm for this field.
+ * @param field The checkbox field dictionary
+ */
+ public PDCheckbox( PDAcroForm theAcroForm, COSDictionary field)
+ {
+ super( theAcroForm, field);
+ COSDictionary ap = (COSDictionary) field.getDictionaryObject(COSName.getPDFName("AP"));
+ if( ap != null )
+ {
+ COSBase n = ap.getDictionaryObject(COSName.getPDFName("N"));
+
+ if( n instanceof COSDictionary )
+ {
+ List li = ((COSDictionary)n).keyList();
+ for( int i=0; i<li.size(); i++ )
+ {
+ COSName name = (COSName)li.get( i );
+ if( !name.equals( OFF_VALUE ))
+ {
+ value = name;
+ }
+ }
+
+ }
+ }
+ else
+ {
+ value = (COSName)getDictionary().getDictionaryObject( "V" );
+ }
+ }
+
+ /**
+ * This will tell if this radio button is currently checked or not.
+ *
+ * @return true If the radio button is checked.
+ */
+ public boolean isChecked()
+ {
+ boolean retval = false;
+ String onValue = getOnValue();
+ COSName radioValue = (COSName)getDictionary().getDictionaryObject( KEY );
+ if( radioValue != null && value != null && radioValue.getName().equals( onValue ) )
+ {
+ retval = true;
+ }
+
+ return retval;
+ }
+
+ /**
+ * Checks the radiobutton.
+ */
+ public void check()
+ {
+ getDictionary().setItem(KEY, value);
+ }
+
+ /**
+ * Unchecks the radiobutton.
+ */
+ public void unCheck()
+ {
+ getDictionary().setItem(KEY, OFF_VALUE);
+ }
+
+ /**
+ * @see org.pdfbox.pdmodel.interactive.form.PDField#setValue(java.lang.String)
+ */
+ public void setValue(String newValue)
+ {
+ getDictionary().setName( "V", newValue );
+ if( newValue == null )
+ {
+ getDictionary().setItem( KEY, OFF_VALUE );
+ }
+ else
+ {
+ getDictionary().setName( KEY, newValue );
+ }
+ }
+
+ /**
+ * This will get the value of the radio button.
+ *
+ * @return The value of the radio button.
+ */
+ public String getOffValue()
+ {
+ return OFF_VALUE.getName();
+ }
+
+ /**
+ * This will get the value of the radio button.
+ *
+ * @return The value of the radio button.
+ */
+ public String getOnValue()
+ {
+ String retval = null;
+ COSDictionary ap = (COSDictionary) getDictionary().getDictionaryObject(COSName.getPDFName("AP"));
+ COSBase n = ap.getDictionaryObject(COSName.getPDFName("N"));
+
+ //N can be a COSDictionary or a COSStream
+ if( n instanceof COSDictionary )
+ {
+ Iterator li = ((COSDictionary)n).keyList().iterator();
+ while( li.hasNext() )
+ {
+ Object key = li.next();
+ if( !key.equals( OFF_VALUE) )
+ {
+ retval = ((COSName)key).getName();
+ }
+ }
+ }
+ return retval;
+ }
+
+ /**
+ * getValue gets the fields value to as a string.
+ *
+ * @return The string value of this field.
+ *
+ * @throws IOException If there is an error getting the value.
+ */
+ public String getValue() throws IOException
+ {
+ return getDictionary().getNameAsString( "V" );
+ }
+
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/interactive/form/PDChoiceButton.java b/src/main/java/org/pdfbox/pdmodel/interactive/form/PDChoiceButton.java
new file mode 100644
index 0000000..5196d85
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/interactive/form/PDChoiceButton.java
@@ -0,0 +1,95 @@
+/**
+ * Copyright (c) 2003, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.interactive.form;
+
+import org.pdfbox.cos.COSArray;
+import org.pdfbox.cos.COSDictionary;
+import org.pdfbox.cos.COSName;
+import org.pdfbox.cos.COSString;
+
+import org.pdfbox.pdmodel.common.COSArrayList;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * This holds common functionality for check boxes and radio buttons.
+ *
+ * @author sug
+ * @version $Revision: 1.4 $
+ */
+public abstract class PDChoiceButton extends PDField
+{
+
+ /**
+ * @see PDField#PDField(PDAcroForm,org.pdfbox.cos.COSDictionary)
+ *
+ * @param theAcroForm The acroForm for this field.
+ * @param field The field for this button.
+ */
+ public PDChoiceButton( PDAcroForm theAcroForm, COSDictionary field)
+ {
+ super(theAcroForm, field);
+ }
+
+ /**
+ * This will get the option values "Opt" entry of the pdf button.
+ *
+ * @return A list of java.lang.String values.
+ */
+ public List getOptions()
+ {
+ List retval = null;
+ COSArray array = (COSArray)getDictionary().getDictionaryObject( COSName.getPDFName( "Opt" ) );
+ if( array != null )
+ {
+ List strings = new ArrayList();
+ for( int i=0; i<array.size(); i++ )
+ {
+ strings.add( ((COSString)array.getObject( i )).getString() );
+ }
+ retval = new COSArrayList( strings, array );
+ }
+ return retval;
+ }
+
+ /**
+ * This will will set the list of options for this button.
+ *
+ * @param options The list of options for the button.
+ */
+ public void setOptions( List options )
+ {
+ getDictionary().setItem(
+ COSName.getPDFName( "Opt" ),
+ COSArrayList.converterToCOSArray( options ) );
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/interactive/form/PDChoiceField.java b/src/main/java/org/pdfbox/pdmodel/interactive/form/PDChoiceField.java
new file mode 100644
index 0000000..ff02cc6
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/interactive/form/PDChoiceField.java
@@ -0,0 +1,127 @@
+/**
+ * Copyright (c) 2003-2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.interactive.form;
+
+import java.io.IOException;
+
+import org.pdfbox.cos.COSArray;
+import org.pdfbox.cos.COSBase;
+import org.pdfbox.cos.COSDictionary;
+import org.pdfbox.cos.COSName;
+import org.pdfbox.cos.COSString;
+import org.pdfbox.cos.COSInteger;
+
+/**
+ * A class for handling the PDF field as a choicefield.
+ *
+ * @author sug
+ * @version $Revision: 1.6 $
+ */
+public class PDChoiceField extends PDVariableText
+{
+
+ /**
+ * @see org.pdfbox.pdmodel.field.PDField#COSField(org.pdfbox.cos.COSDictionary)
+ *
+ * @param theAcroForm The acroForm for this field.
+ * @param field The field for this choice field.
+ */
+ public PDChoiceField( PDAcroForm theAcroForm, COSDictionary field)
+ {
+ super(theAcroForm, field);
+ }
+
+ /**
+ * @see org.pdfbox.pdmodel.field.PDField#setValue(java.lang.String)
+ *
+ * @param optionValue The new value for this text field.
+ *
+ * @throws IOException If there is an error calculating the appearance stream or the value in not one
+ * of the existing options.
+ */
+ public void setValue(String optionValue) throws IOException
+ {
+ int indexSelected = -1;
+ COSArray options = (COSArray)getDictionary().getDictionaryObject( "Opt" );
+ if( options.size() == 0 )
+ {
+ throw new IOException( "Error: You cannot set a value for a choice field if there are no options." );
+ }
+ else
+ {
+ COSBase option = options.getObject( 0 );
+ if( option instanceof COSArray )
+ {
+ for( int i=0; i<options.size() && indexSelected == -1; i++ )
+ {
+ COSArray keyValuePair = (COSArray)options.get( i );
+ COSString key = (COSString)keyValuePair.getObject( 0 );
+ COSString value = (COSString)keyValuePair.getObject( 1 );
+ if( optionValue.equals( key.getString() ) || optionValue.equals( value.getString() ) )
+ {
+ //have the parent draw the appearance stream with the value
+ super.setValue( value.getString() );
+ //but then use the key as the V entry
+ getDictionary().setItem( COSName.getPDFName( "V" ), key );
+ indexSelected = i;
+ }
+ }
+ }
+ else
+ {
+ for( int i=0; i<options.size() && indexSelected == -1; i++ )
+ {
+ COSString value = (COSString)options.get( i );
+ if( optionValue.equals( value.getString() ) )
+ {
+ setValue( optionValue );
+ indexSelected = i;
+ }
+ }
+ }
+ }
+ if( indexSelected == -1 )
+ {
+ throw new IOException( "Error: '" + optionValue + "' was not an available option.");
+ }
+ else
+ {
+ COSArray indexArray = (COSArray)getDictionary().getDictionaryObject( "I" );
+ if( indexArray != null )
+ {
+ indexArray.clear();
+ indexArray.add( new COSInteger( indexSelected ) );
+ }
+ }
+ }
+
+
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/interactive/form/PDField.java b/src/main/java/org/pdfbox/pdmodel/interactive/form/PDField.java
new file mode 100644
index 0000000..c395794
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/interactive/form/PDField.java
@@ -0,0 +1,610 @@
+/**
+ * Copyright (c) 2003, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.interactive.form;
+
+import org.pdfbox.pdmodel.interactive.action.PDFormFieldAdditionalActions;
+import org.pdfbox.pdmodel.interactive.annotation.PDAnnotationWidget;
+
+import org.pdfbox.pdmodel.common.COSArrayList;
+import org.pdfbox.pdmodel.common.COSObjectable;
+
+import org.pdfbox.cos.COSArray;
+import org.pdfbox.cos.COSBase;
+import org.pdfbox.cos.COSDictionary;
+import org.pdfbox.cos.COSInteger;
+import org.pdfbox.cos.COSName;
+
+import org.pdfbox.pdmodel.common.PDTextStream;
+
+import org.pdfbox.pdmodel.fdf.FDFField;
+import org.pdfbox.util.BitFlagHelper;
+
+import java.io.IOException;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * This is the superclass for a Field element in a PDF.
+ * Based on the COS object model from PDFBox.
+ *
+ * @author sug
+ * @version $Revision: 1.21 $
+ */
+public abstract class PDField implements COSObjectable
+{
+ /**
+ * A Ff flag.
+ */
+ public static final int FLAG_READ_ONLY = 1;
+ /**
+ * A Ff flag.
+ */
+ public static final int FLAG_REQUIRED = 1 << 1;
+ /**
+ * A Ff flag.
+ */
+ public static final int FLAG_NO_EXPORT = 1 << 2;
+
+
+ private PDAcroForm acroForm;
+
+ private COSDictionary dictionary;
+
+ /**
+ * Constructor.
+ *
+ * @param theAcroForm The form that this field is part of.
+ */
+ public PDField( PDAcroForm theAcroForm )
+ {
+ acroForm = theAcroForm;
+ dictionary = new COSDictionary();
+ //no required fields in base field class
+ }
+
+
+ /**
+ * Creates a COSField from a COSDictionary, expected to be
+ * a correct object definition for a field in PDF.
+ *
+ * @param theAcroForm The form that this field is part of.
+ * @param field the PDF objet to represent as a field.
+ */
+ public PDField(PDAcroForm theAcroForm, COSDictionary field)
+ {
+ acroForm = theAcroForm;
+ dictionary = field;
+ }
+
+ /**
+ * Returns the partial name of the field.
+ *
+ * @return the name of the field
+ */
+ public String getPartialName()
+ {
+ return getDictionary().getString( "T" );
+ }
+
+ /**
+ * This will set the partial name of the field.
+ *
+ * @param name The new name for the field.
+ */
+ public void setPartialName( String name )
+ {
+ getDictionary().setString( "T", name );
+ }
+
+ /**
+ * Returns the fully qualified name of the field, which is a concatenation of
+ * the names of all the parents fields.
+ *
+ * @return the name of the field
+ *
+ * @throws IOException If there is an error generating the fully qualified name.
+ */
+ public String getFullyQualifiedName() throws IOException
+ {
+ PDField parent = getParent();
+ String parentName = null;
+ if( parent != null )
+ {
+ parentName = parent.getFullyQualifiedName();
+ }
+ String finalName = getPartialName();
+ if( parentName != null )
+ {
+ finalName = parentName + "." + finalName;
+ }
+ return finalName;
+ }
+
+ /**
+ * Get the FT entry of the field. This is a read only field and is set depending
+ * on the actual type. The field type is an inheritable attribute. This method will
+ * return only the direct value on this object. Use the findFieldType for an upward
+ * recursive search.
+ *
+ * @return The Field type.
+ *
+ * @see PDField#findFieldType()
+ */
+ public String getFieldType()
+ {
+ return getDictionary().getNameAsString( "FT" );
+ }
+
+ /**
+ * Find the field type and optionally do a recursive upward search. Sometimes the fieldtype
+ * will be specified on the parent instead of the direct object. This will look at this
+ * object for the field type, if none is specified then it will look to the parent if there
+ * is a parent. If there is no parent and no field type has been found then this
+ * will return null.
+ *
+ * @return The field type or null if none was found.
+ */
+ public String findFieldType()
+ {
+ return findFieldType( getDictionary() );
+ }
+
+ private String findFieldType( COSDictionary dic )
+ {
+ String retval = dic.getNameAsString( "FT" );
+ if( retval == null )
+ {
+ COSDictionary parent = (COSDictionary)dic.getDictionaryObject( "Parent" );
+ if( parent != null )
+ {
+ retval = findFieldType( parent );
+ }
+ }
+ return retval;
+
+ }
+
+
+ /**
+ * setValue sets the fields value to a given string.
+ *
+ * @param value the string value
+ *
+ * @throws IOException If there is an error creating the appearance stream.
+ */
+ public abstract void setValue(String value) throws IOException;
+
+ /**
+ * getValue gets the fields value to as a string.
+ *
+ * @return The string value of this field.
+ *
+ * @throws IOException If there is an error getting the value.
+ */
+ public abstract String getValue() throws IOException;
+
+ /**
+ * sets the field to be read-only.
+ *
+ * @param readonly The new flag for readonly.
+ */
+ public void setReadonly(boolean readonly)
+ {
+ BitFlagHelper.setFlag( getDictionary(), "Ff", FLAG_READ_ONLY, readonly );
+ }
+
+ /**
+ *
+ * @return true if the field is readonly
+ */
+ public boolean isReadonly()
+ {
+ return BitFlagHelper.getFlag( getDictionary(), "Ff", FLAG_READ_ONLY );
+ }
+
+ /**
+ * sets the field to be required.
+ *
+ * @param required The new flag for required.
+ */
+ public void setRequired(boolean required)
+ {
+ BitFlagHelper.setFlag( getDictionary(), "Ff", FLAG_REQUIRED, required );
+ }
+
+ /**
+ *
+ * @return true if the field is required
+ */
+ public boolean isRequired()
+ {
+ return BitFlagHelper.getFlag( getDictionary(), "Ff", FLAG_REQUIRED );
+ }
+
+ /**
+ * sets the field to be not exported..
+ *
+ * @param noExport The new flag for noExport.
+ */
+ public void setNoExport(boolean noExport)
+ {
+ BitFlagHelper.setFlag( getDictionary(), "Ff", FLAG_NO_EXPORT, noExport );
+ }
+
+ /**
+ *
+ * @return true if the field is not to be exported.
+ */
+ public boolean isNoExport()
+ {
+ return BitFlagHelper.getFlag( getDictionary(), "Ff", FLAG_NO_EXPORT );
+ }
+
+ /**
+ * This will get the flags for this field.
+ *
+ * @return flags The set of flags.
+ */
+ public int getFieldFlags()
+ {
+ int retval = 0;
+ COSInteger ff = (COSInteger)getDictionary().getDictionaryObject( COSName.getPDFName( "Ff" ) );
+ if( ff != null )
+ {
+ retval = ff.intValue();
+ }
+ return retval;
+ }
+
+ /**
+ * This will set the flags for this field.
+ *
+ * @param flags The new flags.
+ */
+ public void setFieldFlags( int flags )
+ {
+ COSInteger ff = new COSInteger( flags );
+ getDictionary().setItem( COSName.getPDFName( "Ff" ), ff );
+ }
+
+ /**
+ * This will import a fdf field from a fdf document.
+ *
+ * @param fdfField The fdf field to import.
+ *
+ * @throws IOException If there is an error importing the data for this field.
+ */
+ public void importFDF( FDFField fdfField ) throws IOException
+ {
+ Object fieldValue = fdfField.getValue();
+ int fieldFlags = getFieldFlags();
+
+ if( fieldValue != null )
+ {
+ if( fieldValue instanceof String )
+ {
+ setValue( (String)fieldValue );
+ }
+ else if( fieldValue instanceof PDTextStream )
+ {
+ setValue( ((PDTextStream)fieldValue).getAsString() );
+ }
+ else
+ {
+ throw new IOException( "Unknown field type:" + fieldValue.getClass().getName() );
+ }
+ }
+ Integer ff = fdfField.getFieldFlags();
+ if( ff != null )
+ {
+ setFieldFlags( ff.intValue() );
+ }
+ else
+ {
+ //these are suppose to be ignored if the Ff is set.
+ Integer setFf = fdfField.getSetFieldFlags();
+
+ if( setFf != null )
+ {
+ int setFfInt = setFf.intValue();
+ fieldFlags = fieldFlags | setFfInt;
+ setFieldFlags( fieldFlags );
+ }
+
+ Integer clrFf = fdfField.getClearFieldFlags();
+ if( clrFf != null )
+ {
+ //we have to clear the bits of the document fields for every bit that is
+ //set in this field.
+ //
+ //Example:
+ //docFf = 1011
+ //clrFf = 1101
+ //clrFfValue = 0010;
+ //newValue = 1011 & 0010 which is 0010
+ int clrFfValue = clrFf.intValue();
+ clrFfValue ^= 0xFFFFFFFF;
+ fieldFlags = fieldFlags & clrFfValue;
+ setFieldFlags( fieldFlags );
+ }
+ }
+
+ PDAnnotationWidget widget = getWidget();
+ if( widget != null )
+ {
+ int annotFlags = widget.getAnnotationFlags();
+ Integer f = fdfField.getWidgetFieldFlags();
+ if( f != null && widget != null )
+ {
+ widget.setAnnotationFlags( f.intValue() );
+ }
+ else
+ {
+ //these are suppose to be ignored if the F is set.
+ Integer setF = fdfField.getSetWidgetFieldFlags();
+ if( setF != null )
+ {
+ annotFlags = annotFlags | setF.intValue();
+ widget.setAnnotationFlags( annotFlags );
+ }
+
+ Integer clrF = fdfField.getClearWidgetFieldFlags();
+ if( clrF != null )
+ {
+ //we have to clear the bits of the document fields for every bit that is
+ //set in this field.
+ //
+ //Example:
+ //docF = 1011
+ //clrF = 1101
+ //clrFValue = 0010;
+ //newValue = 1011 & 0010 which is 0010
+ int clrFValue = clrF.intValue();
+ clrFValue ^= 0xFFFFFFFFL;
+ annotFlags = annotFlags & clrFValue;
+ widget.setAnnotationFlags( annotFlags );
+ }
+ }
+ }
+ List fdfKids = fdfField.getKids();
+ List pdKids = getKids();
+ for( int i=0; fdfKids != null && i<fdfKids.size(); i++ )
+ {
+ FDFField fdfChild = (FDFField)fdfKids.get( i );
+ String fdfName = fdfChild.getPartialFieldName();
+ for( int j=0; j<pdKids.size(); j++ )
+ {
+ Object pdChildObj = pdKids.get( j );
+ if( pdChildObj instanceof PDField )
+ {
+ PDField pdChild = (PDField)pdChildObj;
+ if( fdfName != null && fdfName.equals( pdChild.getPartialName() ) )
+ {
+ pdChild.importFDF( fdfChild );
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * This will get the single associated widget that is part of this field. This
+ * occurs when the Widget is embedded in the fields dictionary. Sometimes there
+ * are multiple sub widgets associated with this field, in which case you want to
+ * use getKids(). If the kids entry is specified, then the first entry in that
+ * list will be returned.
+ *
+ * @return The widget that is associated with this field.
+ * @throws IOException If there is an error getting the widget object.
+ */
+ public PDAnnotationWidget getWidget() throws IOException
+ {
+ PDAnnotationWidget retval = null;
+ List kids = getKids();
+ if( kids == null )
+ {
+ retval = new PDAnnotationWidget( getDictionary() );
+ }
+ else if( kids.size() > 0 )
+ {
+ Object firstKid = kids.get( 0 );
+ if( firstKid instanceof PDAnnotationWidget )
+ {
+ retval = (PDAnnotationWidget)firstKid;
+ }
+ else
+ {
+ retval = ((PDField)firstKid).getWidget();
+ }
+ }
+ else
+ {
+ retval = null;
+ }
+ return retval;
+ }
+
+ /**
+ * Get the parent field to this field, or null if none exists.
+ *
+ * @return The parent field.
+ *
+ * @throws IOException If there is an error creating the parent field.
+ */
+ public PDField getParent() throws IOException
+ {
+ PDField parent = null;
+ COSDictionary parentDic = (COSDictionary)getDictionary().getDictionaryObject( "Parent" );
+ if( parentDic != null )
+ {
+ parent = PDFieldFactory.createField( getAcroForm(), parentDic );
+ }
+ return parent;
+ }
+
+ /**
+ * Set the parent of this field.
+ *
+ * @param parent The parent to this field.
+ */
+ public void setParent( PDField parent )
+ {
+ getDictionary().setItem( "Parent", parent );
+ }
+
+ /**
+ * This will get all the kids of this field. The values in the list
+ * will either be PDWidget or PDField. Normally they will be PDWidget objects
+ * unless this is a non-terminal field and they will be child PDField objects.
+ *
+ * @return A list of either PDWidget or PDField objects.
+ * @throws IOException If there is an error retrieving the kids.
+ */
+ public List getKids() throws IOException
+ {
+ List retval = null;
+ COSArray kids = (COSArray)getDictionary().getDictionaryObject(COSName.KIDS);
+ if( kids != null )
+ {
+ List kidsList = new ArrayList();
+ for (int i = 0; i < kids.size(); i++)
+ {
+ COSDictionary kidDictionary = (COSDictionary)kids.getObject(i);
+ COSDictionary parent = (COSDictionary)kidDictionary.getDictionaryObject( "Parent" );
+ if( kidDictionary.getDictionaryObject( "FT" ) != null ||
+ (parent != null && parent.getDictionaryObject( "FT" ) != null ) )
+ {
+ kidsList.add( PDFieldFactory.createField( acroForm, kidDictionary ));
+ }
+ else if( "Widget".equals( kidDictionary.getNameAsString( "Subtype" ) ) )
+ {
+ kidsList.add( new PDAnnotationWidget( kidDictionary ) );
+ }
+ else
+ {
+ //
+ kidsList.add( PDFieldFactory.createField( acroForm, kidDictionary ));
+ }
+ }
+ retval = new COSArrayList( kidsList, kids );
+ }
+ return retval;
+ }
+
+ /**
+ * This will set the list of kids.
+ *
+ * @param kids The list of child widgets.
+ */
+ public void setKids( List kids )
+ {
+ COSArray kidsArray = COSArrayList.converterToCOSArray( kids );
+ getDictionary().setItem( COSName.KIDS, kidsArray );
+ }
+
+ /**
+ * This will return a string representation of this field.
+ *
+ * @return A string representation of this field.
+ */
+ public String toString()
+ {
+ return "" + getDictionary().getDictionaryObject( COSName.getPDFName( "V" ) );
+ }
+
+ /**
+ * This will get the acroform that this field is part of.
+ *
+ * @return The form this field is on.
+ */
+ public PDAcroForm getAcroForm()
+ {
+ return acroForm;
+ }
+
+ /**
+ * This will set the form this field is on.
+ *
+ * @param value The new form to use.
+ */
+ public void setAcroForm(PDAcroForm value)
+ {
+ acroForm = value;
+ }
+
+ /**
+ * This will get the dictionary associated with this field.
+ *
+ * @return The dictionary that this class wraps.
+ */
+ public COSDictionary getDictionary()
+ {
+ return dictionary;
+ }
+
+ /**
+ * Convert this standard java object to a COS object.
+ *
+ * @return The cos object that matches this Java object.
+ */
+ public COSBase getCOSObject()
+ {
+ return dictionary;
+ }
+
+ /**
+ * Get the additional actions for this field. This will return null
+ * if there are no additional actions for this field.
+ *
+ * @return The actions of the field.
+ */
+ public PDFormFieldAdditionalActions getActions()
+ {
+ COSDictionary aa = (COSDictionary)dictionary.getDictionaryObject( "AA" );
+ PDFormFieldAdditionalActions retval = null;
+ if( aa != null )
+ {
+ retval = new PDFormFieldAdditionalActions( aa );
+ }
+ return retval;
+ }
+
+ /**
+ * Set the actions of the field.
+ *
+ * @param actions The field actions.
+ */
+ public void setActions( PDFormFieldAdditionalActions actions )
+ {
+ dictionary.setItem( "AA", actions );
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/interactive/form/PDFieldFactory.java b/src/main/java/org/pdfbox/pdmodel/interactive/form/PDFieldFactory.java
new file mode 100644
index 0000000..c796714
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/interactive/form/PDFieldFactory.java
@@ -0,0 +1,218 @@
+/**
+ * Copyright (c) 2003-2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.interactive.form;
+
+import org.pdfbox.cos.COSArray;
+import org.pdfbox.cos.COSDictionary;
+import org.pdfbox.cos.COSName;
+import org.pdfbox.pdmodel.interactive.annotation.PDAnnotationWidget;
+
+import java.io.IOException;
+
+import java.util.List;
+
+/**
+ * This is the Factory for creating and returning the correct
+ * field elements.
+ *
+ * @author sug
+ * @version $Revision: 1.8 $
+ */
+public class PDFieldFactory
+{
+ private static final int RADIO_BITMASK = 32768;
+ private static final int PUSHBUTTON_BITMASK = 65536;
+ private static final int RADIOS_IN_UNISON_BITMASK = 33554432;
+
+ private static final String FIELD_TYPE_BTN = "Btn";
+ private static final String FIELD_TYPE_TX = "Tx";
+ private static final String FIELD_TYPE_CH = "Ch";
+ private static final String FIELD_TYPE_SIG = "Sig";
+
+ /**
+ * Utility class so no constructor.
+ */
+ private PDFieldFactory()
+ {
+ //do nothing.
+ }
+
+ /**
+ * This method creates a COSField subclass from the given field.
+ * The field is a PDF Dictionary object that must represent a
+ * field element. - othewise null is returned
+ *
+ * @param acroForm The form that the field will be part of.
+ * @param field The dictionary representing a field element
+ *
+ * @return a subclass to COSField according to the kind of field passed to createField
+ * @throws IOException If there is an error determining the field type.
+ */
+ public static PDField createField( PDAcroForm acroForm, COSDictionary field) throws IOException
+ {
+ PDField pdField = new PDUnknownField( acroForm, field );
+ if( isButton(pdField) )
+ {
+ int flags = pdField.getFieldFlags();
+ //BJL, I have found that the radio flag bit is not always set
+ //and that sometimes there is just a kids dictionary.
+ //so, if there is a kids dictionary then it must be a radio button
+ //group.
+ COSArray kids = (COSArray)field.getDictionaryObject( COSName.getPDFName( "Kids" ) );
+ if( kids != null || isRadio(flags) )
+ {
+ pdField = new PDRadioCollection( acroForm, field );
+ }
+ else if( isPushButton( flags ) )
+ {
+ pdField = new PDPushButton( acroForm, field );
+ }
+ else
+ {
+ pdField = new PDCheckbox( acroForm, field );
+ }
+
+ }
+ else if (isChoiceField(pdField))
+ {
+ pdField = new PDChoiceField( acroForm, field );
+ }
+ else if (isTextbox(pdField))
+ {
+ pdField = new PDTextbox( acroForm, field );
+ }
+ else if( isSignature( pdField ) )
+ {
+ pdField = new PDSignature( acroForm, field );
+ }
+ else
+ {
+ //do nothing and return an unknown field type.
+ }
+ return pdField;
+ }
+
+ /**
+ * This method determines if the given
+ * field is a radiobutton collection.
+ *
+ * @param flags The field flags.
+ *
+ * @return the result of the determination
+ */
+ private static boolean isRadio( int flags )
+ {
+ return (flags & RADIO_BITMASK) > 0;
+ }
+
+ /**
+ * This method determines if the given
+ * field is a pushbutton.
+ *
+ * @param flags The field flags.
+ *
+ * @return the result of the determination
+ */
+ private static boolean isPushButton( int flags )
+ {
+ return (flags & PUSHBUTTON_BITMASK) > 0;
+ }
+
+ /**
+ * This method determines if the given field is a choicefield
+ * Choicefields are either listboxes or comboboxes.
+ *
+ * @param field the field to determine
+ * @return the result of the determination
+ */
+ private static boolean isChoiceField(PDField field) throws IOException
+ {
+ return FIELD_TYPE_CH.equals(field.findFieldType());
+ }
+
+ /**
+ * This method determines if the given field is a button.
+ *
+ * @param field the field to determine
+ * @return the result of the determination
+ *
+ * @throws IOException If there is an error determining the field type.
+ */
+ private static boolean isButton(PDField field) throws IOException
+ {
+ String ft = field.findFieldType();
+ boolean retval = FIELD_TYPE_BTN.equals( ft );
+ List kids = field.getKids();
+ if( ft == null && kids != null && kids.size() > 0)
+ {
+ //sometimes if it is a button the type is only defined by one
+ //of the kids entries
+ Object obj = kids.get( 0 );
+ COSDictionary kidDict = null;
+ if( obj instanceof PDField )
+ {
+ kidDict = ((PDField)obj).getDictionary();
+ }
+ else if( obj instanceof PDAnnotationWidget )
+ {
+ kidDict = ((PDAnnotationWidget)obj).getDictionary();
+ }
+ else
+ {
+ throw new IOException( "Error:Unexpected type of kids field:" + obj );
+ }
+ retval = isButton( new PDUnknownField( field.getAcroForm(), kidDict ) );
+ }
+ return retval;
+ }
+
+ /**
+ * This method determines if the given field is a signature.
+ *
+ * @param field the field to determine
+ * @return the result of the determination
+ */
+ private static boolean isSignature(PDField field) throws IOException
+ {
+ return FIELD_TYPE_SIG.equals(field.findFieldType());
+ }
+
+ /**
+ * This method determines if the given field is a Textbox.
+ *
+ * @param field the field to determine
+ * @return the result of the determination
+ */
+ private static boolean isTextbox(PDField field) throws IOException
+ {
+ return FIELD_TYPE_TX.equals(field.findFieldType());
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/interactive/form/PDPushButton.java b/src/main/java/org/pdfbox/pdmodel/interactive/form/PDPushButton.java
new file mode 100644
index 0000000..e832921
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/interactive/form/PDPushButton.java
@@ -0,0 +1,84 @@
+/**
+ * Copyright (c) 2003, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.interactive.form;
+
+import org.pdfbox.cos.COSDictionary;
+import org.pdfbox.cos.COSName;
+import org.pdfbox.cos.COSString;
+
+import java.io.IOException;
+
+/**
+ * A class for handling the PDF field as a PDPushButton.
+ *
+ * @author sug
+ * @version $Revision: 1.3 $
+ */
+public class PDPushButton extends PDField
+{
+
+ /**
+ * @see org.pdfbox.pdmodel.field.PDField#COSField(org.pdfbox.cos.COSDictionary)
+ *
+ * @param theAcroForm The acroForm for this field.
+ * @param field The field for this push button.
+ */
+ public PDPushButton( PDAcroForm theAcroForm, COSDictionary field)
+ {
+ super(theAcroForm, field);
+ }
+
+ /**
+ * @see as.interactive.pdf.form.cos.COSField#setValue(java.lang.String)
+ *
+ * @param value The new value for the field.
+ *
+ * @throws IOException If there is an error creating the appearance stream.
+ */
+ public void setValue(String value) throws IOException
+ {
+ COSString fieldValue = new COSString(value);
+ getDictionary().setItem( COSName.getPDFName( "V" ), fieldValue );
+ getDictionary().setItem( COSName.getPDFName( "DV" ), fieldValue );
+ }
+
+ /**
+ * getValue gets the fields value to as a string.
+ *
+ * @return The string value of this field.
+ *
+ * @throws IOException If there is an error getting the value.
+ */
+ public String getValue() throws IOException
+ {
+ return getDictionary().getString( "V" );
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/interactive/form/PDRadioCollection.java b/src/main/java/org/pdfbox/pdmodel/interactive/form/PDRadioCollection.java
new file mode 100644
index 0000000..27b48d6
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/interactive/form/PDRadioCollection.java
@@ -0,0 +1,170 @@
+/**
+ * Copyright (c) 2003-2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.interactive.form;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.pdfbox.cos.COSArray;
+import org.pdfbox.cos.COSDictionary;
+import org.pdfbox.cos.COSName;
+
+import org.pdfbox.pdmodel.common.COSArrayList;
+import org.pdfbox.util.BitFlagHelper;
+
+/**
+ * A class for handling the PDF field as a Radio Collection.
+ * This class automatically keeps track of the child radio buttons
+ * in the collection.
+ *
+ * @see PDCheckbox
+ * @author sug
+ * @version $Revision: 1.12 $
+ */
+public class PDRadioCollection extends PDChoiceButton
+{
+ /**
+ * A Ff flag.
+ */
+ public static final int FLAG_RADIOS_IN_UNISON = 1 << 25;
+
+ /**
+ * @see PDField#PDField(PDAcroForm,COSDictionary)
+ *
+ * @param theAcroForm The acroForm for this field.
+ * @param field The field that makes up the radio collection.
+ */
+ public PDRadioCollection( PDAcroForm theAcroForm, COSDictionary field)
+ {
+ super(theAcroForm,field);
+ }
+
+ /**
+ * From the PDF Spec <br/>
+ * If set, a group of radio buttons within a radio button field that
+ * use the same value for the on state will turn on and off in unison; that is if
+ * one is checked, they are all checked. If clear, the buttons are mutually exclusive
+ * (the same behavior as HTML radio buttons).
+ *
+ * @param radiosInUnison The new flag for radiosInUnison.
+ */
+ public void setRadiosInUnison(boolean radiosInUnison)
+ {
+ BitFlagHelper.setFlag( getDictionary(), "Ff", FLAG_RADIOS_IN_UNISON, radiosInUnison );
+ }
+
+ /**
+ *
+ * @return true If the flag is set for radios in unison.
+ */
+ public boolean isRadiosInUnison()
+ {
+ return BitFlagHelper.getFlag( getDictionary(), "Ff", FLAG_RADIOS_IN_UNISON );
+ }
+
+ /**
+ * This setValue method iterates the collection of radiobuttons
+ * and checks or unchecks each radiobutton according to the
+ * given value.
+ * If the value is not represented by any of the radiobuttons,
+ * then none will be checked.
+ *
+ * @see org.pdfbox.pdmodel.interactive.form.PDField#setValue(java.lang.String)
+ */
+ public void setValue(String value) throws IOException
+ {
+ getDictionary().setString( "V", value );
+ List kids = getKids();
+ for (int i = 0; i < kids.size(); i++)
+ {
+ PDCheckbox btn = (PDCheckbox)kids.get(i);
+ if( btn.getOnValue().equals(value) )
+ {
+ btn.check();
+ }
+ else
+ {
+ btn.unCheck();
+ }
+ }
+ }
+
+ /**
+ * getValue gets the fields value to as a string.
+ *
+ * @return The string value of this field.
+ *
+ * @throws IOException If there is an error getting the value.
+ */
+ public String getValue()throws IOException
+ {
+ String retval = null;
+ List kids = getKids();
+ for (int i = 0; i < kids.size(); i++)
+ {
+ PDCheckbox btn = (PDCheckbox)kids.get(i);
+ if( btn.isChecked() )
+ {
+ retval = btn.getOnValue();
+ }
+ }
+ if( retval == null )
+ {
+ retval = getDictionary().getNameAsString( "V" );
+ }
+ return retval;
+ }
+
+
+ /**
+ * This will return a list of PDField objects that are part of this radio collection.
+ *
+ * @see PDField#getWidget()
+ * @return A list of PDWidget objects.
+ * @throws IOException if there is an error while creating the children objects.
+ */
+ public List getKids() throws IOException
+ {
+ List retval = null;
+ COSArray kids = (COSArray)getDictionary().getDictionaryObject(COSName.KIDS);
+ if( kids != null )
+ {
+ List kidsList = new ArrayList();
+ for (int i = 0; i < kids.size(); i++)
+ {
+ kidsList.add( PDFieldFactory.createField( getAcroForm(), (COSDictionary)kids.getObject(i) ) );
+ }
+ retval = new COSArrayList( kidsList, kids );
+ }
+ return retval;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/interactive/form/PDSignature.java b/src/main/java/org/pdfbox/pdmodel/interactive/form/PDSignature.java
new file mode 100644
index 0000000..66ed3e3
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/interactive/form/PDSignature.java
@@ -0,0 +1,90 @@
+/**
+ * Copyright (c) 2003, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.interactive.form;
+
+import org.pdfbox.cos.COSDictionary;
+
+import java.io.IOException;
+
+/**
+ * A class for handling the PDF field as a signature.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.3 $
+ */
+public class PDSignature extends PDField
+{
+
+ /**
+ * @see org.pdfbox.pdmodel.field.PDField#COSField(org.pdfbox.cos.COSDictionary)
+ *
+ * @param theAcroForm The acroForm for this field.
+ * @param field The dictionary for the signature.
+ */
+ public PDSignature( PDAcroForm theAcroForm, COSDictionary field)
+ {
+ super(theAcroForm,field);
+ }
+
+ /**
+ * @see as.interactive.pdf.form.cos.COSField#setValue(java.lang.String)
+ *
+ * @param value The new value for the field.
+ *
+ * @throws IOException If there is an error creating the appearance stream.
+ */
+ public void setValue(String value) throws IOException
+ {
+ throw new RuntimeException( "Not yet implemented" );
+ }
+
+ /**
+ * @see as.interactive.pdf.form.cos.COSField#setValue(java.lang.String)
+ *
+ * @return The string value of this field.
+ *
+ * @throws IOException If there is an error creating the appearance stream.
+ */
+ public String getValue() throws IOException
+ {
+ throw new RuntimeException( "Not yet implemented" );
+ }
+
+ /**
+ * Return a string rep of this object.
+ *
+ * @return A string rep of this object.
+ */
+ public String toString()
+ {
+ return "PDSignature";
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/interactive/form/PDTextbox.java b/src/main/java/org/pdfbox/pdmodel/interactive/form/PDTextbox.java
new file mode 100644
index 0000000..fd9550e
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/interactive/form/PDTextbox.java
@@ -0,0 +1,64 @@
+/**
+ * Copyright (c) 2003, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.interactive.form;
+
+import org.pdfbox.cos.COSDictionary;
+
+/**
+ * A class for handling the PDF field as a textbox.
+ *
+ * @author sug
+ * @version $Revision: 1.9 $
+ */
+public class PDTextbox extends PDVariableText
+{
+
+ /**
+ * @see PDField#PDField(PDAcroForm,COSDictionary)
+ *
+ * @param theAcroForm The acroform.
+ */
+ public PDTextbox( PDAcroForm theAcroForm )
+ {
+ super( theAcroForm );
+ }
+
+ /**
+ * @see org.pdfbox.pdmodel.interactive.form.PDField#PDField(PDAcroForm,COSDictionary)
+ *
+ * @param theAcroForm The acroForm for this field.
+ * @param field The field's dictionary.
+ */
+ public PDTextbox( PDAcroForm theAcroForm, COSDictionary field)
+ {
+ super( theAcroForm, field);
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/interactive/form/PDUnknownField.java b/src/main/java/org/pdfbox/pdmodel/interactive/form/PDUnknownField.java
new file mode 100644
index 0000000..806b5f5
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/interactive/form/PDUnknownField.java
@@ -0,0 +1,72 @@
+/**
+ * Copyright (c) 2003, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.interactive.form;
+
+import java.io.IOException;
+
+import org.pdfbox.cos.COSDictionary;
+
+/**
+ * This class represents a form field with an unknown type.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.3 $
+ */
+public class PDUnknownField extends PDField
+{
+ /**
+ * @see org.pdfbox.pdmodel.interactive.form.PDField#PDField(PDAcroForm, COSDictionary)
+ *
+ * @param theAcroForm The acroForm for this field.
+ * @param field The field's dictionary.
+ */
+ public PDUnknownField( PDAcroForm theAcroForm, COSDictionary field)
+ {
+ super( theAcroForm, field);
+ }
+
+ /**
+ * @see org.pdfbox.pdmodel.interactive.form.PDField#setValue(String)
+ */
+ public void setValue(String value) throws IOException
+ {
+ //do nothing
+ }
+
+ /**
+ * @see org.pdfbox.pdmodel.interactive.form.PDField#getValue()
+ */
+ public String getValue() throws IOException
+ {
+ return null;
+ }
+
+}
diff --git a/src/main/java/org/pdfbox/pdmodel/interactive/form/PDVariableText.java b/src/main/java/org/pdfbox/pdmodel/interactive/form/PDVariableText.java
new file mode 100644
index 0000000..7ed5008
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/interactive/form/PDVariableText.java
@@ -0,0 +1,324 @@
+/**
+ * Copyright (c) 2004-2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.interactive.form;
+
+import org.pdfbox.cos.COSDictionary;
+import org.pdfbox.cos.COSInteger;
+import org.pdfbox.cos.COSName;
+import org.pdfbox.cos.COSNumber;
+import org.pdfbox.cos.COSString;
+import org.pdfbox.util.BitFlagHelper;
+
+import java.io.IOException;
+
+/**
+ * A class for handling PDF fields that display text.
+ *
+ * @author Ben Litchfield (ben@benlitchfield.com)
+ * @version $Revision: 1.6 $
+ */
+public abstract class PDVariableText extends PDField
+{
+ /**
+ * A Ff flag.
+ */
+ public static final int FLAG_MULTILINE = 1 << 12;
+ /**
+ * A Ff flag.
+ */
+ public static final int FLAG_PASSWORD = 1 << 13;
+ /**
+ * A Ff flag.
+ */
+ public static final int FLAG_FILE_SELECT = 1 << 20;
+ /**
+ * A Ff flag.
+ */
+ public static final int FLAG_DO_NOT_SPELL_CHECK = 1 << 22;
+ /**
+ * A Ff flag.
+ */
+ public static final int FLAG_DO_NOT_SCROLL = 1 << 23;
+ /**
+ * A Ff flag.
+ */
+ public static final int FLAG_COMB = 1 << 24;
+ /**
+ * A Ff flag.
+ */
+ public static final int FLAG_RICH_TEXT = 1 << 25;
+
+
+ /**
+ * DA Default appearance.
+ */
+ private COSString da;
+
+ private PDAppearance appearance;
+
+
+ /**
+ * A Q value.
+ */
+ public static final int QUADDING_LEFT = 0;
+
+ /**
+ * A Q value.
+ */
+ public static final int QUADDING_CENTERED = 1;
+
+ /**
+ * A Q value.
+ */
+ public static final int QUADDING_RIGHT = 2;
+
+ /**
+ * @see PDField#PDField(PDAcroForm,COSDictionary)
+ *
+ * @param theAcroForm The acroform.
+ */
+ public PDVariableText( PDAcroForm theAcroForm )
+ {
+ super( theAcroForm );
+ }
+
+ /**
+ * @see org.pdfbox.pdmodel.interactive.form.PDField#PDField(PDAcroForm,COSDictionary)
+ *
+ * @param theAcroForm The acroForm for this field.
+ * @param field The field's dictionary.
+ */
+ public PDVariableText( PDAcroForm theAcroForm, COSDictionary field)
+ {
+ super( theAcroForm, field);
+ da = (COSString) field.getDictionaryObject(COSName.getPDFName("DA"));
+ }
+
+ /**
+ * @see org.pdfbox.pdmodel.interactive.form.PDField#setValue(java.lang.String)
+ *
+ * @param value The new value for this text field.
+ *
+ * @throws IOException If there is an error calculating the appearance stream.
+ */
+ public void setValue(String value) throws IOException
+ {
+ COSString fieldValue = new COSString(value);
+ getDictionary().setItem( COSName.getPDFName( "V" ), fieldValue );
+
+ //hmm, not sure what the case where the DV gets set to the field
+ //value, for now leave blank until we can come up with a case
+ //where it needs to be in there
+ //getDictionary().setItem( COSName.getPDFName( "DV" ), fieldValue );
+ if(appearance == null)
+ {
+ this.appearance = new PDAppearance( getAcroForm(), this );
+ }
+ appearance.setAppearanceValue(value);
+ }
+
+ /**
+ * getValue gets the fields value to as a string.
+ *
+ * @return The string value of this field.
+ *
+ * @throws IOException If there is an error getting the value.
+ */
+ public String getValue() throws IOException
+ {
+ return getDictionary().getString( "V" );
+ }
+
+ /**
+ * @return true if the field is multiline
+ */
+ public boolean isMultiline()
+ {
+ return BitFlagHelper.getFlag( getDictionary(), "Ff", FLAG_MULTILINE );
+ }
+
+ /**
+ * Set the multiline bit.
+ *
+ * @param multiline The value for the multiline.
+ */
+ public void setMultiline( boolean multiline )
+ {
+ BitFlagHelper.setFlag( getDictionary(), "Ff", FLAG_MULTILINE, multiline );
+ }
+
+ /**
+ * @return true if the field is a password field.
+ */
+ public boolean isPassword()
+ {
+ return BitFlagHelper.getFlag( getDictionary(), "Ff", FLAG_PASSWORD );
+ }
+
+ /**
+ * Set the password bit.
+ *
+ * @param password The value for the password.
+ */
+ public void setPassword( boolean password )
+ {
+ BitFlagHelper.setFlag( getDictionary(), "Ff", FLAG_PASSWORD, password );
+ }
+
+ /**
+ * @return true if the field is a file select field.
+ */
+ public boolean isFileSelect()
+ {
+ return BitFlagHelper.getFlag( getDictionary(), "Ff", FLAG_FILE_SELECT );
+ }
+
+ /**
+ * Set the file select bit.
+ *
+ * @param fileSelect The value for the fileSelect.
+ */
+ public void setFileSelect( boolean fileSelect )
+ {
+ BitFlagHelper.setFlag( getDictionary(), "Ff", FLAG_FILE_SELECT, fileSelect );
+ }
+
+ /**
+ * @return true if the field is not suppose to spell check.
+ */
+ public boolean doNotSpellCheck()
+ {
+ return BitFlagHelper.getFlag( getDictionary(), "Ff", FLAG_DO_NOT_SPELL_CHECK );
+ }
+
+ /**
+ * Set the doNotSpellCheck bit.
+ *
+ * @param doNotSpellCheck The value for the doNotSpellCheck.
+ */
+ public void setDoNotSpellCheck( boolean doNotSpellCheck )
+ {
+ BitFlagHelper.setFlag( getDictionary(), "Ff", FLAG_DO_NOT_SPELL_CHECK, doNotSpellCheck );
+ }
+
+ /**
+ * @return true if the field is not suppose to scroll.
+ */
+ public boolean doNotScroll()
+ {
+ return BitFlagHelper.getFlag( getDictionary(), "Ff", FLAG_DO_NOT_SCROLL );
+ }
+
+ /**
+ * Set the doNotScroll bit.
+ *
+ * @param doNotScroll The value for the doNotScroll.
+ */
+ public void setDoNotScroll( boolean doNotScroll )
+ {
+ BitFlagHelper.setFlag( getDictionary(), "Ff", FLAG_DO_NOT_SCROLL, doNotScroll );
+ }
+
+ /**
+ * @return true if the field is not suppose to comb the text display.
+ */
+ public boolean shouldComb()
+ {
+ return BitFlagHelper.getFlag( getDictionary(), "Ff", FLAG_COMB );
+ }
+
+ /**
+ * Set the comb bit.
+ *
+ * @param comb The value for the comb.
+ */
+ public void setComb( boolean comb )
+ {
+ BitFlagHelper.setFlag( getDictionary(), "Ff", FLAG_COMB, comb );
+ }
+
+ /**
+ * @return true if the field is a rich text field.
+ */
+ public boolean isRichText()
+ {
+ return BitFlagHelper.getFlag( getDictionary(), "Ff", FLAG_RICH_TEXT );
+ }
+
+ /**
+ * Set the richText bit.
+ *
+ * @param richText The value for the richText.
+ */
+ public void setRichText( boolean richText )
+ {
+ BitFlagHelper.setFlag( getDictionary(), "Ff", FLAG_RICH_TEXT, richText );
+ }
+
+ /**
+ * @return the DA element of the dictionary object
+ */
+ protected COSString getDefaultAppearance()
+ {
+ return da;
+ }
+
+ /**
+ * This will get the 'quadding' or justification of the text to be displayed.
+ * 0 - Left(default)<br/>
+ * 1 - Centered<br />
+ * 2 - Right<br />
+ * Please see the QUADDING_CONSTANTS.
+ *
+ * @return The justification of the text strings.
+ */
+ public int getQ()
+ {
+ int retval = 0;
+ COSNumber number = (COSNumber)getDictionary().getDictionaryObject( COSName.getPDFName( "Q" ) );
+ if( number != null )
+ {
+ retval = number.intValue();
+ }
+ return retval;
+ }
+
+ /**
+ * This will set the quadding/justification of the text. See QUADDING constants.
+ *
+ * @param q The new text justification.
+ */
+ public void setQ( int q )
+ {
+ getDictionary().setItem( COSName.getPDFName( "Q" ), new COSInteger( q ) );
+ }
+
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/interactive/form/package.html b/src/main/java/org/pdfbox/pdmodel/interactive/form/package.html
new file mode 100644
index 0000000..36c4b4b
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/interactive/form/package.html
@@ -0,0 +1,9 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head>
+
+</head>
+<body>
+The interactive package contains classes that deal with interactive annotations such as textfields and buttons.
+</body>
+</html>
diff --git a/src/main/java/org/pdfbox/pdmodel/interactive/pagenavigation/PDThread.java b/src/main/java/org/pdfbox/pdmodel/interactive/pagenavigation/PDThread.java
new file mode 100644
index 0000000..5226099
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/interactive/pagenavigation/PDThread.java
@@ -0,0 +1,152 @@
+/**
+ * Copyright (c) 2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.interactive.pagenavigation;
+
+import org.pdfbox.cos.COSBase;
+import org.pdfbox.cos.COSDictionary;
+
+import org.pdfbox.pdmodel.PDDocumentInformation;
+import org.pdfbox.pdmodel.common.COSObjectable;
+
+/**
+ * This a single thread in a PDF document.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.1 $
+ */
+public class PDThread implements COSObjectable
+{
+
+
+ private COSDictionary thread;
+
+ /**
+ * Constructor that is used for a preexisting dictionary.
+ *
+ * @param t The underlying dictionary.
+ */
+ public PDThread( COSDictionary t )
+ {
+ thread = t;
+ }
+
+ /**
+ * Default constructor.
+ *
+ */
+ public PDThread()
+ {
+ thread = new COSDictionary();
+ thread.setName( "Type", "Thread" );
+ }
+
+ /**
+ * This will get the underlying dictionary that this object wraps.
+ *
+ * @return The underlying info dictionary.
+ */
+ public COSDictionary getDictionary()
+ {
+ return thread;
+ }
+
+ /**
+ * Convert this standard java object to a COS object.
+ *
+ * @return The cos object that matches this Java object.
+ */
+ public COSBase getCOSObject()
+ {
+ return thread;
+ }
+
+ /**
+ * Get info about the thread, or null if there is nothing.
+ *
+ * @return The thread information.
+ */
+ public PDDocumentInformation getThreadInfo()
+ {
+ PDDocumentInformation retval = null;
+ COSDictionary info = (COSDictionary)thread.getDictionaryObject( "I" );
+ if( info != null )
+ {
+ retval = new PDDocumentInformation( info );
+ }
+
+ return retval;
+ }
+
+ /**
+ * Set the thread info, can be null.
+ *
+ * @param info The info dictionary about this thread.
+ */
+ public void setThreadInfo( PDDocumentInformation info )
+ {
+ thread.setItem( "I", info );
+ }
+
+ /**
+ * Get the first bead in the thread, or null if it has not been set yet. This
+ * is a required field for this object.
+ *
+ * @return The first bead in the thread.
+ */
+ public PDThreadBead getFirstBead()
+ {
+ PDThreadBead retval = null;
+ COSDictionary bead = (COSDictionary)thread.getDictionaryObject( "F" );
+ if( bead != null )
+ {
+ retval = new PDThreadBead( bead );
+ }
+
+ return retval;
+ }
+
+ /**
+ * This will set the first bead in the thread. When this is set it will
+ * also set the thread property of the bead object.
+ *
+ * @param bead The first bead in the thread.
+ */
+ public void setFirstBead( PDThreadBead bead )
+ {
+ if( bead != null )
+ {
+ bead.setThread( this );
+ }
+ thread.setItem( "F", bead );
+ }
+
+
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/interactive/pagenavigation/PDThreadBead.java b/src/main/java/org/pdfbox/pdmodel/interactive/pagenavigation/PDThreadBead.java
new file mode 100644
index 0000000..547d4bc
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/interactive/pagenavigation/PDThreadBead.java
@@ -0,0 +1,234 @@
+/**
+ * Copyright (c) 2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.interactive.pagenavigation;
+
+import org.pdfbox.cos.COSArray;
+import org.pdfbox.cos.COSBase;
+import org.pdfbox.cos.COSDictionary;
+import org.pdfbox.cos.COSName;
+
+import org.pdfbox.pdmodel.PDPage;
+import org.pdfbox.pdmodel.common.COSObjectable;
+import org.pdfbox.pdmodel.common.PDRectangle;
+
+/**
+ * This a single bead in a thread in a PDF document.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.3 $
+ */
+public class PDThreadBead implements COSObjectable
+{
+
+
+ private COSDictionary bead;
+
+ /**
+ * Constructor that is used for a preexisting dictionary.
+ *
+ * @param b The underlying dictionary.
+ */
+ public PDThreadBead( COSDictionary b )
+ {
+ bead = b;
+ }
+
+ /**
+ * Default constructor.
+ *
+ */
+ public PDThreadBead()
+ {
+ bead = new COSDictionary();
+ bead.setName( "Type", "Bead" );
+ setNextBead( this );
+ setPreviousBead( this );
+ }
+
+ /**
+ * This will get the underlying dictionary that this object wraps.
+ *
+ * @return The underlying info dictionary.
+ */
+ public COSDictionary getDictionary()
+ {
+ return bead;
+ }
+
+ /**
+ * Convert this standard java object to a COS object.
+ *
+ * @return The cos object that matches this Java object.
+ */
+ public COSBase getCOSObject()
+ {
+ return bead;
+ }
+
+ /**
+ * This will get the thread that this bead is part of. This is only required
+ * for the first bead in a thread, so other beads 'may' return null.
+ *
+ * @return The thread that this bead is part of.
+ */
+ public PDThread getThread()
+ {
+ PDThread retval = null;
+ COSDictionary dic = (COSDictionary)bead.getDictionaryObject( "T" );
+ if( dic != null )
+ {
+ retval = new PDThread( dic );
+ }
+ return retval;
+ }
+
+ /**
+ * Set the thread that this bead is part of. This is only required for the
+ * first bead in a thread. Note: This property is set for you by the PDThread.setFirstBead() method.
+ *
+ * @param thread The thread that this bead is part of.
+ */
+ public void setThread( PDThread thread )
+ {
+ bead.setItem( "T", thread );
+ }
+
+ /**
+ * This will get the next bead. If this bead is the last bead in the list then this
+ * will return the first bead.
+ *
+ * @return The next bead in the list or the first bead if this is the last bead.
+ */
+ public PDThreadBead getNextBead()
+ {
+ return new PDThreadBead( (COSDictionary) bead.getDictionaryObject( "N" ) );
+ }
+
+ /**
+ * Set the next bead in the thread.
+ *
+ * @param next The next bead.
+ */
+ protected void setNextBead( PDThreadBead next )
+ {
+ bead.setItem( "N", next );
+ }
+
+ /**
+ * This will get the previous bead. If this bead is the first bead in the list then this
+ * will return the last bead.
+ *
+ * @return The previous bead in the list or the last bead if this is the first bead.
+ */
+ public PDThreadBead getPreviousBead()
+ {
+ return new PDThreadBead( (COSDictionary) bead.getDictionaryObject( "V" ) );
+ }
+
+ /**
+ * Set the previous bead in the thread.
+ *
+ * @param previous The previous bead.
+ */
+ protected void setPreviousBead( PDThreadBead previous )
+ {
+ bead.setItem( "V", previous );
+ }
+
+ /**
+ * Append a bead after this bead. This will correctly set the next/previous beads in the
+ * linked list.
+ *
+ * @param append The bead to insert.
+ */
+ public void appendBead( PDThreadBead append )
+ {
+ PDThreadBead nextBead = getNextBead();
+ nextBead.setPreviousBead( append );
+ append.setNextBead( nextBead );
+ setNextBead( append );
+ append.setPreviousBead( this );
+ }
+
+ /**
+ * Get the page that this bead is part of.
+ *
+ * @return The page that this bead is part of.
+ */
+ public PDPage getPage()
+ {
+ PDPage page = null;
+ COSDictionary dic = (COSDictionary)bead.getDictionaryObject( "P" );
+ if( dic != null )
+ {
+ page = new PDPage( dic );
+ }
+ return page;
+ }
+
+ /**
+ * Set the page that this bead is part of. This is a required property and must be
+ * set when creating a new bead. The PDPage object also has a list of beads in the natural
+ * reading order. It is recommended that you add this object to that list as well.
+ *
+ * @param page The page that this bead is on.
+ */
+ public void setPage( PDPage page )
+ {
+ bead.setItem( "P", page );
+ }
+
+ /**
+ * The rectangle on the page that this bead is part of.
+ *
+ * @return The part of the page that this bead covers.
+ */
+ public PDRectangle getRectangle()
+ {
+ PDRectangle rect = null;
+ COSArray array = (COSArray)bead.getDictionaryObject( COSName.R );
+ if( array != null )
+ {
+ rect = new PDRectangle( array );
+ }
+ return rect;
+ }
+
+ /**
+ * Set the rectangle on the page that this bead covers.
+ *
+ * @param rect The portion of the page that this bead covers.
+ */
+ public void setRectangle( PDRectangle rect )
+ {
+ bead.setItem( COSName.R, rect );
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/interactive/pagenavigation/package.html b/src/main/java/org/pdfbox/pdmodel/interactive/pagenavigation/package.html
new file mode 100644
index 0000000..5fb1b88
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/interactive/pagenavigation/package.html
@@ -0,0 +1,9 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head>
+
+</head>
+<body>
+A package to allow provide access to PDF page navigation functionality.
+</body>
+</html>
diff --git a/src/main/java/org/pdfbox/pdmodel/interactive/viewerpreferences/PDViewerPreferences.java b/src/main/java/org/pdfbox/pdmodel/interactive/viewerpreferences/PDViewerPreferences.java
new file mode 100644
index 0000000..d9958e6
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/interactive/viewerpreferences/PDViewerPreferences.java
@@ -0,0 +1,365 @@
+/**
+ * Copyright (c) 2003-2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.interactive.viewerpreferences;
+
+import org.pdfbox.cos.COSBase;
+import org.pdfbox.cos.COSDictionary;
+
+import org.pdfbox.pdmodel.common.COSObjectable;
+
+/**
+ * This is the document viewing preferences.
+ *
+ * @author Ben Litchfield (ben@benlitchfield.com)
+ * @version $Revision: 1.2 $
+ */
+public class PDViewerPreferences implements COSObjectable
+{
+ /**
+ * From PDF Reference: "Neither document outline nor thumbnail images visible".
+ */
+ public static final String NON_FULL_SCREEN_PAGE_MODE_USE_NONE = "UseNone";
+ /**
+ * From PDF Reference: "Document outline visible".
+ */
+ public static final String NON_FULL_SCREEN_PAGE_MODE_USE_OUTLINES = "UseOutlines";
+ /**
+ * From PDF Reference: "Thumbnail images visible".
+ */
+ public static final String NON_FULL_SCREEN_PAGE_MODE_USE_THUMBS = "UseThumbs";
+ /**
+ * From PDF Reference: "Optional content group panel visible".
+ */
+ public static final String NON_FULL_SCREEN_PAGE_MODE_USE_OPTIONAL_CONTENT = "UseOC";
+
+ /**
+ * Reading direction.
+ */
+ public static final String READING_DIRECTION_L2R = "L2R";
+ /**
+ * Reading direction.
+ */
+ public static final String READING_DIRECTION_R2L = "R2L";
+
+ /**
+ * Boundary constant.
+ */
+ public static final String BOUNDARY_MEDIA_BOX = "MediaBox";
+ /**
+ * Boundary constant.
+ */
+ public static final String BOUNDARY_CROP_BOX = "CropBox";
+ /**
+ * Boundary constant.
+ */
+ public static final String BOUNDARY_BLEED_BOX = "BleedBox";
+ /**
+ * Boundary constant.
+ */
+ public static final String BOUNDARY_TRIM_BOX = "TrimBox";
+ /**
+ * Boundary constant.
+ */
+ public static final String BOUNDARY_ART_BOX = "ArtBox";
+
+
+ private COSDictionary prefs;
+
+ /**
+ * Constructor that is used for a preexisting dictionary.
+ *
+ * @param dic The underlying dictionary.
+ */
+ public PDViewerPreferences( COSDictionary dic )
+ {
+ prefs = dic;
+ }
+
+ /**
+ * This will get the underlying dictionary that this object wraps.
+ *
+ * @return The underlying info dictionary.
+ */
+ public COSDictionary getDictionary()
+ {
+ return prefs;
+ }
+
+ /**
+ * Convert this standard java object to a COS object.
+ *
+ * @return The cos object that matches this Java object.
+ */
+ public COSBase getCOSObject()
+ {
+ return prefs;
+ }
+
+ /**
+ * Get the toolbar preference.
+ *
+ * @return the toolbar preference.
+ */
+ public boolean hideToolbar()
+ {
+ return prefs.getBoolean( "HideToolbar", false );
+ }
+
+ /**
+ * Set the toolbar preference.
+ *
+ * @param value Set the toolbar preference.
+ */
+ public void setHideToolbar( boolean value )
+ {
+ prefs.setBoolean( "HideToolbar", value );
+ }
+
+ /**
+ * Get the menubar preference.
+ *
+ * @return the menubar preference.
+ */
+ public boolean hideMenubar()
+ {
+ return prefs.getBoolean( "HideMenubar", false );
+ }
+
+ /**
+ * Set the menubar preference.
+ *
+ * @param value Set the menubar preference.
+ */
+ public void setHideMenubar( boolean value )
+ {
+ prefs.setBoolean( "HideMenubar", value );
+ }
+
+ /**
+ * Get the window UI preference.
+ *
+ * @return the window UI preference.
+ */
+ public boolean hideWindowUI()
+ {
+ return prefs.getBoolean( "HideWindowUI", false );
+ }
+
+ /**
+ * Set the window UI preference.
+ *
+ * @param value Set the window UI preference.
+ */
+ public void setHideWindowUI( boolean value )
+ {
+ prefs.setBoolean( "HideWindowUI", value );
+ }
+
+ /**
+ * Get the fit window preference.
+ *
+ * @return the fit window preference.
+ */
+ public boolean fitWindow()
+ {
+ return prefs.getBoolean( "FitWindow", false );
+ }
+
+ /**
+ * Set the fit window preference.
+ *
+ * @param value Set the fit window preference.
+ */
+ public void setFitWindow( boolean value )
+ {
+ prefs.setBoolean( "FitWindow", value );
+ }
+
+ /**
+ * Get the center window preference.
+ *
+ * @return the center window preference.
+ */
+ public boolean centerWindow()
+ {
+ return prefs.getBoolean( "CenterWindow", false );
+ }
+
+ /**
+ * Set the center window preference.
+ *
+ * @param value Set the center window preference.
+ */
+ public void setCenterWindow( boolean value )
+ {
+ prefs.setBoolean( "CenterWindow", value );
+ }
+
+ /**
+ * Get the display doc title preference.
+ *
+ * @return the display doc title preference.
+ */
+ public boolean displayDocTitle()
+ {
+ return prefs.getBoolean( "DisplayDocTitle", false );
+ }
+
+ /**
+ * Set the display doc title preference.
+ *
+ * @param value Set the display doc title preference.
+ */
+ public void setDisplayDocTitle( boolean value )
+ {
+ prefs.setBoolean( "DisplayDocTitle", value );
+ }
+
+ /**
+ * Get the non full screen page mode preference.
+ *
+ * @return the non full screen page mode preference.
+ */
+ public String getNonFullScreenPageMode()
+ {
+ return prefs.getNameAsString( "NonFullScreenPageMode", NON_FULL_SCREEN_PAGE_MODE_USE_NONE);
+ }
+
+ /**
+ * Set the non full screen page mode preference.
+ *
+ * @param value Set the non full screen page mode preference.
+ */
+ public void setNonFullScreenPageMode( String value )
+ {
+ prefs.setName( "NonFullScreenPageMode", value );
+ }
+
+ /**
+ * Get the reading direction preference.
+ *
+ * @return the reading direction preference.
+ */
+ public String getReadingDirection()
+ {
+ return prefs.getNameAsString( "Direction", READING_DIRECTION_L2R);
+ }
+
+ /**
+ * Set the reading direction preference.
+ *
+ * @param value Set the reading direction preference.
+ */
+ public void setReadingDirection( String value )
+ {
+ prefs.setName( "Direction", value );
+ }
+
+ /**
+ * Get the ViewArea preference. See BOUNDARY_XXX constants.
+ *
+ * @return the ViewArea preference.
+ */
+ public String getViewArea()
+ {
+ return prefs.getNameAsString( "ViewArea", BOUNDARY_CROP_BOX);
+ }
+
+ /**
+ * Set the ViewArea preference. See BOUNDARY_XXX constants.
+ *
+ * @param value Set the ViewArea preference.
+ */
+ public void setViewArea( String value )
+ {
+ prefs.setName( "ViewArea", value );
+ }
+
+ /**
+ * Get the ViewClip preference. See BOUNDARY_XXX constants.
+ *
+ * @return the ViewClip preference.
+ */
+ public String getViewClip()
+ {
+ return prefs.getNameAsString( "ViewClip", BOUNDARY_CROP_BOX);
+ }
+
+ /**
+ * Set the ViewClip preference. See BOUNDARY_XXX constants.
+ *
+ * @param value Set the ViewClip preference.
+ */
+ public void setViewClip( String value )
+ {
+ prefs.setName( "ViewClip", value );
+ }
+
+ /**
+ * Get the PrintArea preference. See BOUNDARY_XXX constants.
+ *
+ * @return the PrintArea preference.
+ */
+ public String getPrintArea()
+ {
+ return prefs.getNameAsString( "PrintArea", BOUNDARY_CROP_BOX);
+ }
+
+ /**
+ * Set the PrintArea preference. See BOUNDARY_XXX constants.
+ *
+ * @param value Set the PrintArea preference.
+ */
+ public void setPrintArea( String value )
+ {
+ prefs.setName( "PrintArea", value );
+ }
+
+ /**
+ * Get the PrintClip preference. See BOUNDARY_XXX constants.
+ *
+ * @return the PrintClip preference.
+ */
+ public String getPrintClip()
+ {
+ return prefs.getNameAsString( "PrintClip", BOUNDARY_CROP_BOX);
+ }
+
+ /**
+ * Set the PrintClip preference. See BOUNDARY_XXX constants.
+ *
+ * @param value Set the PrintClip preference.
+ */
+ public void setPrintClip( String value )
+ {
+ prefs.setName( "PrintClip", value );
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/interactive/viewerpreferences/package.html b/src/main/java/org/pdfbox/pdmodel/interactive/viewerpreferences/package.html
new file mode 100644
index 0000000..310d6b4
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/interactive/viewerpreferences/package.html
@@ -0,0 +1,9 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head>
+
+</head>
+<body>
+A package to allow access to document viewing preferences.
+</body>
+</html>
diff --git a/src/main/java/org/pdfbox/pdmodel/package.html b/src/main/java/org/pdfbox/pdmodel/package.html
new file mode 100644
index 0000000..85bbe62
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/package.html
@@ -0,0 +1,9 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head>
+
+</head>
+<body>
+The PDModel package represents a high level API for creating and manipulating PDF documents.
+</body>
+</html>
diff --git a/src/main/java/org/pdfbox/pdmodel/text/PDTextState.java b/src/main/java/org/pdfbox/pdmodel/text/PDTextState.java
new file mode 100644
index 0000000..45e9516
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/text/PDTextState.java
@@ -0,0 +1,286 @@
+/**
+ * Copyright (c) 2003, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.pdmodel.text;
+
+import org.pdfbox.pdmodel.font.PDFont;
+
+/**
+ * This class will hold the current state of the text parameters when executing a
+ * content stream.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.3 $
+ */
+public class PDTextState implements Cloneable
+{
+ /**
+ * See PDF Reference 1.5 Table 5.3.
+ */
+ public static final int RENDERING_MODE_FILL_TEXT = 0;
+ /**
+ * See PDF Reference 1.5 Table 5.3.
+ */
+ public static final int RENDERING_MODE_STROKE_TEXT = 1;
+ /**
+ * See PDF Reference 1.5 Table 5.3.
+ */
+ public static final int RENDERING_MODE_FILL_THEN_STROKE_TEXT = 2;
+ /**
+ * See PDF Reference 1.5 Table 5.3.
+ */
+ public static final int RENDERING_MODE_NEITHER_FILL_NOR_STROKE_TEXT = 3;
+ /**
+ * See PDF Reference 1.5 Table 5.3.
+ */
+ public static final int RENDERING_MODE_FILL_TEXT_AND_ADD_TO_PATH_FOR_CLIPPING = 4;
+ /**
+ * See PDF Reference 1.5 Table 5.3.
+ */
+ public static final int RENDERING_MODE_STROKE_TEXT_AND_ADD_TO_PATH_FOR_CLIPPING = 5;
+ /**
+ * See PDF Reference 1.5 Table 5.3.
+ */
+ public static final int RENDERING_MODE_FILL_THEN_STROKE_TEXT_AND_ADD_TO_PATH_FOR_CLIPPING = 6;
+ /**
+ * See PDF Reference 1.5 Table 5.3.
+ */
+ public static final int RENDERING_MODE_ADD_TEXT_TO_PATH_FOR_CLIPPING = 7;
+
+
+ //these are set default according to PDF Reference 1.5 section 5.2
+ private float characterSpacing = 0;
+ private float wordSpacing = 0;
+ private float horizontalScaling = 100;
+ private float leading = 0;
+ private PDFont font;
+ private float fontSize;
+ private int renderingMode = 0;
+ private float rise = 0;
+ private boolean knockout = true;
+
+ /**
+ * Get the value of the characterSpacing.
+ *
+ * @return The current characterSpacing.
+ */
+ public float getCharacterSpacing()
+ {
+ return characterSpacing;
+ }
+
+ /**
+ * Set the value of the characterSpacing.
+ *
+ * @param value The characterSpacing.
+ */
+ public void setCharacterSpacing(float value)
+ {
+ characterSpacing = value;
+ }
+
+ /**
+ * Get the value of the wordSpacing.
+ *
+ * @return The wordSpacing.
+ */
+ public float getWordSpacing()
+ {
+ return wordSpacing;
+ }
+
+ /**
+ * Set the value of the wordSpacing.
+ *
+ * @param value The wordSpacing.
+ */
+ public void setWordSpacing(float value)
+ {
+ wordSpacing = value;
+ }
+
+ /**
+ * Get the value of the horizontalScaling. The default is 100. This value
+ * is the percentage value 0-100 and not 0-1. So for mathematical operations
+ * you will probably need to divide by 100 first.
+ *
+ * @return The horizontalScaling.
+ */
+ public float getHorizontalScalingPercent()
+ {
+ return horizontalScaling;
+ }
+
+ /**
+ * Set the value of the horizontalScaling.
+ *
+ * @param value The horizontalScaling.
+ */
+ public void setHorizontalScalingPercent(float value)
+ {
+ horizontalScaling = value;
+ }
+
+ /**
+ * Get the value of the leading.
+ *
+ * @return The leading.
+ */
+ public float getLeading()
+ {
+ return leading;
+ }
+
+ /**
+ * Set the value of the leading.
+ *
+ * @param value The leading.
+ */
+ public void setLeading(float value)
+ {
+ leading = value;
+ }
+
+ /**
+ * Get the value of the font.
+ *
+ * @return The font.
+ */
+ public PDFont getFont()
+ {
+ return font;
+ }
+
+ /**
+ * Set the value of the font.
+ *
+ * @param value The font.
+ */
+ public void setFont(PDFont value)
+ {
+ font = value;
+ }
+
+ /**
+ * Get the value of the fontSize.
+ *
+ * @return The fontSize.
+ */
+ public float getFontSize()
+ {
+ return fontSize;
+ }
+
+ /**
+ * Set the value of the fontSize.
+ *
+ * @param value The fontSize.
+ */
+ public void setFontSize(float value)
+ {
+ fontSize = value;
+ }
+
+ /**
+ * Get the value of the renderingMode.
+ *
+ * @return The renderingMode.
+ */
+ public int getRenderingMode()
+ {
+ return renderingMode;
+ }
+
+ /**
+ * Set the value of the renderingMode.
+ *
+ * @param value The renderingMode.
+ */
+ public void setRenderingMode(int value)
+ {
+ renderingMode = value;
+ }
+
+ /**
+ * Get the value of the rise.
+ *
+ * @return The rise.
+ */
+ public float getRise()
+ {
+ return rise;
+ }
+
+ /**
+ * Set the value of the rise.
+ *
+ * @param value The rise.
+ */
+ public void setRise(float value)
+ {
+ rise = value;
+ }
+
+ /**
+ * Get the value of the knockout.
+ *
+ * @return The knockout.
+ */
+ public boolean getKnockoutFlag()
+ {
+ return knockout;
+ }
+
+ /**
+ * Set the value of the knockout.
+ *
+ * @param value The knockout.
+ */
+ public void setKnockoutFlag(boolean value)
+ {
+ knockout = value;
+ }
+
+ /**
+ * @see Object#clone()
+ */
+ public Object clone()
+ {
+ try
+ {
+ return super.clone();
+ }
+ catch (CloneNotSupportedException ignore)
+ {
+ //ignore
+ }
+ return null;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/pdmodel/text/package.html b/src/main/java/org/pdfbox/pdmodel/text/package.html
new file mode 100644
index 0000000..50bb7c5
--- /dev/null
+++ b/src/main/java/org/pdfbox/pdmodel/text/package.html
@@ -0,0 +1,9 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head>
+
+</head>
+<body>
+The PDModel text package deals with text states, operations, and parameters within the PDF document.
+</body>
+</html> \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/persistence/util/COSHEXTable.java b/src/main/java/org/pdfbox/persistence/util/COSHEXTable.java
new file mode 100644
index 0000000..b483213
--- /dev/null
+++ b/src/main/java/org/pdfbox/persistence/util/COSHEXTable.java
@@ -0,0 +1,566 @@
+/**
+ * Copyright (c) 2003, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.persistence.util;
+
+/**
+ * helper type for faster mapping of bytes to their hex equivalent.
+ *
+ * @author Michael Traut
+ * @version $Revision: 1.4 $
+ */
+public final class COSHEXTable
+{
+ /**
+ * ASCII byte values for the hex strings.
+ */
+ public static final byte[][] TABLE =
+ {
+ "00".getBytes(),
+ "01".getBytes(),
+ "02".getBytes(),
+ "03".getBytes(),
+ "04".getBytes(),
+ "05".getBytes(),
+ "06".getBytes(),
+ "07".getBytes(),
+ "08".getBytes(),
+ "09".getBytes(),
+ "0A".getBytes(),
+ "0B".getBytes(),
+ "0C".getBytes(),
+ "0D".getBytes(),
+ "0E".getBytes(),
+ "0F".getBytes(),
+ "10".getBytes(),
+ "11".getBytes(),
+ "12".getBytes(),
+ "13".getBytes(),
+ "14".getBytes(),
+ "15".getBytes(),
+ "16".getBytes(),
+ "17".getBytes(),
+ "18".getBytes(),
+ "19".getBytes(),
+ "1A".getBytes(),
+ "1B".getBytes(),
+ "1C".getBytes(),
+ "1D".getBytes(),
+ "1E".getBytes(),
+ "1F".getBytes(),
+ "20".getBytes(),
+ "21".getBytes(),
+ "22".getBytes(),
+ "23".getBytes(),
+ "24".getBytes(),
+ "25".getBytes(),
+ "26".getBytes(),
+ "27".getBytes(),
+ "28".getBytes(),
+ "29".getBytes(),
+ "2A".getBytes(),
+ "2B".getBytes(),
+ "2C".getBytes(),
+ "2D".getBytes(),
+ "2E".getBytes(),
+ "2F".getBytes(),
+ "30".getBytes(),
+ "31".getBytes(),
+ "32".getBytes(),
+ "33".getBytes(),
+ "34".getBytes(),
+ "35".getBytes(),
+ "36".getBytes(),
+ "37".getBytes(),
+ "38".getBytes(),
+ "39".getBytes(),
+ "3A".getBytes(),
+ "3B".getBytes(),
+ "3C".getBytes(),
+ "3D".getBytes(),
+ "3E".getBytes(),
+ "3F".getBytes(),
+ "40".getBytes(),
+ "41".getBytes(),
+ "42".getBytes(),
+ "43".getBytes(),
+ "44".getBytes(),
+ "45".getBytes(),
+ "46".getBytes(),
+ "47".getBytes(),
+ "48".getBytes(),
+ "49".getBytes(),
+ "4A".getBytes(),
+ "4B".getBytes(),
+ "4C".getBytes(),
+ "4D".getBytes(),
+ "4E".getBytes(),
+ "4F".getBytes(),
+ "50".getBytes(),
+ "51".getBytes(),
+ "52".getBytes(),
+ "53".getBytes(),
+ "54".getBytes(),
+ "55".getBytes(),
+ "56".getBytes(),
+ "57".getBytes(),
+ "58".getBytes(),
+ "59".getBytes(),
+ "5A".getBytes(),
+ "5B".getBytes(),
+ "5C".getBytes(),
+ "5D".getBytes(),
+ "5E".getBytes(),
+ "5F".getBytes(),
+ "60".getBytes(),
+ "61".getBytes(),
+ "62".getBytes(),
+ "63".getBytes(),
+ "64".getBytes(),
+ "65".getBytes(),
+ "66".getBytes(),
+ "67".getBytes(),
+ "68".getBytes(),
+ "69".getBytes(),
+ "6A".getBytes(),
+ "6B".getBytes(),
+ "6C".getBytes(),
+ "6D".getBytes(),
+ "6E".getBytes(),
+ "6F".getBytes(),
+ "70".getBytes(),
+ "71".getBytes(),
+ "72".getBytes(),
+ "73".getBytes(),
+ "74".getBytes(),
+ "75".getBytes(),
+ "76".getBytes(),
+ "77".getBytes(),
+ "78".getBytes(),
+ "79".getBytes(),
+ "7A".getBytes(),
+ "7B".getBytes(),
+ "7C".getBytes(),
+ "7D".getBytes(),
+ "7E".getBytes(),
+ "7F".getBytes(),
+ "80".getBytes(),
+ "81".getBytes(),
+ "82".getBytes(),
+ "83".getBytes(),
+ "84".getBytes(),
+ "85".getBytes(),
+ "86".getBytes(),
+ "87".getBytes(),
+ "88".getBytes(),
+ "89".getBytes(),
+ "8A".getBytes(),
+ "8B".getBytes(),
+ "8C".getBytes(),
+ "8D".getBytes(),
+ "8E".getBytes(),
+ "8F".getBytes(),
+ "90".getBytes(),
+ "91".getBytes(),
+ "92".getBytes(),
+ "93".getBytes(),
+ "94".getBytes(),
+ "95".getBytes(),
+ "96".getBytes(),
+ "97".getBytes(),
+ "98".getBytes(),
+ "99".getBytes(),
+ "9A".getBytes(),
+ "9B".getBytes(),
+ "9C".getBytes(),
+ "9D".getBytes(),
+ "9E".getBytes(),
+ "9F".getBytes(),
+ "A0".getBytes(),
+ "A1".getBytes(),
+ "A2".getBytes(),
+ "A3".getBytes(),
+ "A4".getBytes(),
+ "A5".getBytes(),
+ "A6".getBytes(),
+ "A7".getBytes(),
+ "A8".getBytes(),
+ "A9".getBytes(),
+ "AA".getBytes(),
+ "AB".getBytes(),
+ "AC".getBytes(),
+ "AD".getBytes(),
+ "AE".getBytes(),
+ "AF".getBytes(),
+ "B0".getBytes(),
+ "B1".getBytes(),
+ "B2".getBytes(),
+ "B3".getBytes(),
+ "B4".getBytes(),
+ "B5".getBytes(),
+ "B6".getBytes(),
+ "B7".getBytes(),
+ "B8".getBytes(),
+ "B9".getBytes(),
+ "BA".getBytes(),
+ "BB".getBytes(),
+ "BC".getBytes(),
+ "BD".getBytes(),
+ "BE".getBytes(),
+ "BF".getBytes(),
+ "C0".getBytes(),
+ "C1".getBytes(),
+ "C2".getBytes(),
+ "C3".getBytes(),
+ "C4".getBytes(),
+ "C5".getBytes(),
+ "C6".getBytes(),
+ "C7".getBytes(),
+ "C8".getBytes(),
+ "C9".getBytes(),
+ "CA".getBytes(),
+ "CB".getBytes(),
+ "CC".getBytes(),
+ "CD".getBytes(),
+ "CE".getBytes(),
+ "CF".getBytes(),
+ "D0".getBytes(),
+ "D1".getBytes(),
+ "D2".getBytes(),
+ "D3".getBytes(),
+ "D4".getBytes(),
+ "D5".getBytes(),
+ "D6".getBytes(),
+ "D7".getBytes(),
+ "D8".getBytes(),
+ "D9".getBytes(),
+ "DA".getBytes(),
+ "DB".getBytes(),
+ "DC".getBytes(),
+ "DD".getBytes(),
+ "DE".getBytes(),
+ "DF".getBytes(),
+ "E0".getBytes(),
+ "E1".getBytes(),
+ "E2".getBytes(),
+ "E3".getBytes(),
+ "E4".getBytes(),
+ "E5".getBytes(),
+ "E6".getBytes(),
+ "E7".getBytes(),
+ "E8".getBytes(),
+ "E9".getBytes(),
+ "EA".getBytes(),
+ "EB".getBytes(),
+ "EC".getBytes(),
+ "ED".getBytes(),
+ "EE".getBytes(),
+ "EF".getBytes(),
+ "F0".getBytes(),
+ "F1".getBytes(),
+ "F2".getBytes(),
+ "F3".getBytes(),
+ "F4".getBytes(),
+ "F5".getBytes(),
+ "F6".getBytes(),
+ "F7".getBytes(),
+ "F8".getBytes(),
+ "F9".getBytes(),
+ "FA".getBytes(),
+ "FB".getBytes(),
+ "FC".getBytes(),
+ "FD".getBytes(),
+ "FE".getBytes(),
+ "FF".getBytes()
+ };
+
+ /**
+ * ASCII byte values for the hex strings.
+ */
+ public static final String[] HEX_TABLE =
+ {
+ "00",
+ "01",
+ "02",
+ "03",
+ "04",
+ "05",
+ "06",
+ "07",
+ "08",
+ "09",
+ "0A",
+ "0B",
+ "0C",
+ "0D",
+ "0E",
+ "0F",
+ "10",
+ "11",
+ "12",
+ "13",
+ "14",
+ "15",
+ "16",
+ "17",
+ "18",
+ "19",
+ "1A",
+ "1B",
+ "1C",
+ "1D",
+ "1E",
+ "1F",
+ "20",
+ "21",
+ "22",
+ "23",
+ "24",
+ "25",
+ "26",
+ "27",
+ "28",
+ "29",
+ "2A",
+ "2B",
+ "2C",
+ "2D",
+ "2E",
+ "2F",
+ "30",
+ "31",
+ "32",
+ "33",
+ "34",
+ "35",
+ "36",
+ "37",
+ "38",
+ "39",
+ "3A",
+ "3B",
+ "3C",
+ "3D",
+ "3E",
+ "3F",
+ "40",
+ "41",
+ "42",
+ "43",
+ "44",
+ "45",
+ "46",
+ "47",
+ "48",
+ "49",
+ "4A",
+ "4B",
+ "4C",
+ "4D",
+ "4E",
+ "4F",
+ "50",
+ "51",
+ "52",
+ "53",
+ "54",
+ "55",
+ "56",
+ "57",
+ "58",
+ "59",
+ "5A",
+ "5B",
+ "5C",
+ "5D",
+ "5E",
+ "5F",
+ "60",
+ "61",
+ "62",
+ "63",
+ "64",
+ "65",
+ "66",
+ "67",
+ "68",
+ "69",
+ "6A",
+ "6B",
+ "6C",
+ "6D",
+ "6E",
+ "6F",
+ "70",
+ "71",
+ "72",
+ "73",
+ "74",
+ "75",
+ "76",
+ "77",
+ "78",
+ "79",
+ "7A",
+ "7B",
+ "7C",
+ "7D",
+ "7E",
+ "7F",
+ "80",
+ "81",
+ "82",
+ "83",
+ "84",
+ "85",
+ "86",
+ "87",
+ "88",
+ "89",
+ "8A",
+ "8B",
+ "8C",
+ "8D",
+ "8E",
+ "8F",
+ "90",
+ "91",
+ "92",
+ "93",
+ "94",
+ "95",
+ "96",
+ "97",
+ "98",
+ "99",
+ "9A",
+ "9B",
+ "9C",
+ "9D",
+ "9E",
+ "9F",
+ "A0",
+ "A1",
+ "A2",
+ "A3",
+ "A4",
+ "A5",
+ "A6",
+ "A7",
+ "A8",
+ "A9",
+ "AA",
+ "AB",
+ "AC",
+ "AD",
+ "AE",
+ "AF",
+ "B0",
+ "B1",
+ "B2",
+ "B3",
+ "B4",
+ "B5",
+ "B6",
+ "B7",
+ "B8",
+ "B9",
+ "BA",
+ "BB",
+ "BC",
+ "BD",
+ "BE",
+ "BF",
+ "C0",
+ "C1",
+ "C2",
+ "C3",
+ "C4",
+ "C5",
+ "C6",
+ "C7",
+ "C8",
+ "C9",
+ "CA",
+ "CB",
+ "CC",
+ "CD",
+ "CE",
+ "CF",
+ "D0",
+ "D1",
+ "D2",
+ "D3",
+ "D4",
+ "D5",
+ "D6",
+ "D7",
+ "D8",
+ "D9",
+ "DA",
+ "DB",
+ "DC",
+ "DD",
+ "DE",
+ "DF",
+ "E0",
+ "E1",
+ "E2",
+ "E3",
+ "E4",
+ "E5",
+ "E6",
+ "E7",
+ "E8",
+ "E9",
+ "EA",
+ "EB",
+ "EC",
+ "ED",
+ "EE",
+ "EF",
+ "F0",
+ "F1",
+ "F2",
+ "F3",
+ "F4",
+ "F5",
+ "F6",
+ "F7",
+ "F8",
+ "F9",
+ "FA",
+ "FB",
+ "FC",
+ "FD",
+ "FE",
+ "FF"
+ };
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/persistence/util/COSObjectKey.java b/src/main/java/org/pdfbox/persistence/util/COSObjectKey.java
new file mode 100644
index 0000000..4a4d778
--- /dev/null
+++ b/src/main/java/org/pdfbox/persistence/util/COSObjectKey.java
@@ -0,0 +1,131 @@
+/**
+ * Copyright (c) 2003, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.persistence.util;
+
+import org.pdfbox.cos.COSObject;
+
+/**
+ * object representing the physical reference to an indirect pdf object.
+ *
+ * @author Michael Traut
+ * @version $Revision: 1.4 $
+ */
+
+public class COSObjectKey
+{
+ private long number;
+ private long generation;
+
+ /**
+ * PDFObjectKey constructor comment.
+ *
+ * @param object The object that this key will represent.
+ */
+ public COSObjectKey(COSObject object)
+ {
+ this( object.getObjectNumber().longValue(), object.getGenerationNumber().longValue() );
+ }
+
+ /**
+ * PDFObjectKey constructor comment.
+ *
+ * @param num The object number.
+ * @param gen The object generation number.
+ */
+ public COSObjectKey(long num, long gen)
+ {
+ setNumber(num);
+ setGeneration(gen);
+ }
+
+ /**
+ * @see Object#equals( Object )
+ */
+ public boolean equals(Object obj)
+ {
+ return (obj instanceof COSObjectKey) &&
+ ((COSObjectKey)obj).getNumber() == getNumber() &&
+ ((COSObjectKey)obj).getGeneration() == getGeneration();
+ }
+
+ /**
+ * This will get the generation number.
+ *
+ * @return The objects generation number.
+ */
+ public long getGeneration()
+ {
+ return generation;
+ }
+ /**
+ * This will get the objects id.
+ *
+ * @return The object's id.
+ */
+ public long getNumber()
+ {
+ return number;
+ }
+
+ /**
+ * @see Object#hashCode()
+ */
+ public int hashCode()
+ {
+ return (int)(number + generation);
+ }
+ /**
+ * This will set the objects generation number.
+ *
+ * @param newGeneration The objects generation number.
+ */
+ public void setGeneration(long newGeneration)
+ {
+ generation = newGeneration;
+ }
+ /**
+ * This will set the objects id.
+ *
+ * @param newNumber The objects number.
+ */
+ public void setNumber(long newNumber)
+ {
+ number = newNumber;
+ }
+
+ /**
+ * @see Object#toString()
+ */
+ public String toString()
+ {
+ return "" + getNumber() + " " + getGeneration() + " R";
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/persistence/util/package.html b/src/main/java/org/pdfbox/persistence/util/package.html
new file mode 100644
index 0000000..fb8a0f8
--- /dev/null
+++ b/src/main/java/org/pdfbox/persistence/util/package.html
@@ -0,0 +1,9 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head>
+
+</head>
+<body>
+These are utilities used by the persistence layer.
+</body>
+</html>
diff --git a/src/main/java/org/pdfbox/pfb/PfbParser.java b/src/main/java/org/pdfbox/pfb/PfbParser.java
new file mode 100644
index 0000000..ab069d6
--- /dev/null
+++ b/src/main/java/org/pdfbox/pfb/PfbParser.java
@@ -0,0 +1,211 @@
+/**
+ * Copyright (c) 2004-2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+
+package org.pdfbox.pfb;
+
+import java.io.BufferedInputStream;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.EOFException;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+/**
+ * Parser for a pfb-file.
+ *
+ * @author <a href="mailto:m.g.n@gmx.de">Michael Niedermair</a>
+ * @version $Revision: 1.3 $
+ */
+public class PfbParser
+{
+ /**
+ * the pdf header length.
+ * (start-marker (1 byte), ascii-/binary-marker (1 byte), size (4 byte))
+ * 3*6 == 18
+ */
+ private static final int PFB_HEADER_LENGTH = 18;
+
+ /**
+ * the start marker.
+ */
+ private static final int START_MARKER = 0x80;
+
+ /**
+ * the ascii marker.
+ */
+ private static final int ASCII_MARKER = 0x01;
+
+ /**
+ * the binary marker.
+ */
+ private static final int BINARY_MARKER = 0x02;
+
+ /**
+ * The record types in the pfb-file.
+ */
+ private static final int[] PFB_RECORDS = {ASCII_MARKER, BINARY_MARKER,
+ ASCII_MARKER};
+
+ /**
+ * buffersize.
+ */
+ private static final int BUFFER_SIZE = 0xffff;
+
+ /**
+ * the parsed pfb-data.
+ */
+ private byte[] pfbdata;
+
+ /**
+ * the lengths of the records.
+ */
+ private int[] lengths;
+
+ // sample (pfb-file)
+ // 00000000 80 01 8b 15 00 00 25 21 50 53 2d 41 64 6f 62 65
+ // ......%!PS-Adobe
+
+
+ /**
+ * Create a new object.
+ * @param filename the file name
+ * @throws IOException if an IO-error occurs.
+ */
+ public PfbParser(final String filename) throws IOException
+ {
+ this( new BufferedInputStream(new FileInputStream(filename),BUFFER_SIZE) );
+ }
+
+ /**
+ * Create a new object.
+ * @param in The input.
+ * @throws IOException if an IO-error occurs.
+ */
+ public PfbParser(final InputStream in) throws IOException
+ {
+ byte[] pfb = readPfbInput(in);
+ parsePfb(pfb);
+ }
+
+ /**
+ * Parse the pfb-array.
+ * @param pfb The pfb-Array
+ * @throws IOException in an IO-error occurs.
+ */
+ private void parsePfb(final byte[] pfb) throws IOException
+ {
+
+ ByteArrayInputStream in = new ByteArrayInputStream(pfb);
+ pfbdata = new byte[pfb.length - PFB_HEADER_LENGTH];
+ lengths = new int[PFB_RECORDS.length];
+ int pointer = 0;
+ for (int records = 0; records < PFB_RECORDS.length; records++)
+ {
+ if (in.read() != START_MARKER)
+ {
+ throw new IOException("Start marker missing");
+ }
+
+ if (in.read() != PFB_RECORDS[records])
+ {
+ throw new IOException("Incorrect record type");
+ }
+
+ int size = in.read();
+ size += in.read() << 8;
+ size += in.read() << 16;
+ size += in.read() << 24;
+ lengths[records] = size;
+ int got = in.read(pfbdata, pointer, size);
+ if (got < 0)
+ {
+ throw new EOFException();
+ }
+ pointer += got;
+ }
+ }
+
+ /**
+ * Read the pdf input.
+ * @param in The input.
+ * @return Returns the pdf-array.
+ * @throws IOException if an IO-error occurs.
+ */
+ private byte[] readPfbInput(final InputStream in) throws IOException
+ {
+ // copy into an array
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ byte[] tmpbuf = new byte[BUFFER_SIZE];
+ int amountRead = -1;
+ while ((amountRead = in.read(tmpbuf)) != -1)
+ {
+ out.write(tmpbuf, 0, amountRead);
+ }
+ return out.toByteArray();
+ }
+
+ /**
+ * Returns the lengths.
+ * @return Returns the lengths.
+ */
+ public int[] getLengths()
+ {
+ return lengths;
+ }
+
+ /**
+ * Returns the pfbdata.
+ * @return Returns the pfbdata.
+ */
+ public byte[] getPfbdata()
+ {
+ return pfbdata;
+ }
+
+ /**
+ * Returns the pfb data as stream.
+ * @return Returns the pfb data as stream.
+ */
+ public InputStream getInputStream()
+ {
+ return new ByteArrayInputStream(pfbdata);
+ }
+
+ /**
+ * Returns the size of the pfb-data.
+ * @return Returns the size of the pfb-data.
+ */
+ public int size()
+ {
+ return pfbdata.length;
+ }
+}
diff --git a/src/main/java/org/pdfbox/pfb/package.html b/src/main/java/org/pdfbox/pfb/package.html
new file mode 100644
index 0000000..fcc23f0
--- /dev/null
+++ b/src/main/java/org/pdfbox/pfb/package.html
@@ -0,0 +1,9 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head>
+
+</head>
+<body>
+Classes that are used to parse pfb files.
+</body>
+</html>
diff --git a/src/main/java/org/pdfbox/searchengine/lucene/IndexFiles.java b/src/main/java/org/pdfbox/searchengine/lucene/IndexFiles.java
new file mode 100644
index 0000000..dd36dd9
--- /dev/null
+++ b/src/main/java/org/pdfbox/searchengine/lucene/IndexFiles.java
@@ -0,0 +1,308 @@
+package org.pdfbox.searchengine.lucene;
+
+/*
+ * This source was originally written as an example for the lucene project.
+ * It has been modified to use PDFBox as a lucene document creator.
+ * -Ben Litchfield
+ *
+ *====================================================================
+ * The Apache Software License, Version 1.1
+ *
+ * Copyright (c) 2001 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ * if any, must include the following acknowledgment:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowledgment may appear in the software itself,
+ * if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Apache" and "Apache Software Foundation" and
+ * "Apache Lucene" must not be used to endorse or promote products
+ * derived from this software without prior written permission. For
+ * written permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ * "Apache Lucene", nor may "Apache" appear in their name, without
+ * prior written permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ */
+
+import org.apache.lucene.analysis.standard.StandardAnalyzer;
+
+import org.apache.lucene.demo.HTMLDocument;
+
+import org.apache.lucene.document.Document;
+
+import org.apache.lucene.index.IndexReader;
+import org.apache.lucene.index.IndexWriter;
+import org.apache.lucene.index.Term;
+import org.apache.lucene.index.TermEnum;
+
+import java.util.Arrays;
+
+
+import java.io.File;
+import java.io.IOException;
+
+import java.util.Date;
+
+
+/**
+ * This is a class that will index some files on a local filesystem. This code
+ * was modified from a demo that comes with the lucene search engine.
+ *
+ * @author Lucene team
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ *
+ * @version $Revision: 1.6 $
+ */
+public class IndexFiles
+{
+ private boolean deleting = false; // true during deletion pass
+ private IndexReader reader; // existing index
+ private IndexWriter writer; // new index being built
+ private TermEnum uidIter; // document id iterator
+
+ /**
+ * This is the main entry point for the indexer.
+ *
+ * @param argv The command line arguments.
+ */
+ public static void main(String[] argv)
+ {
+
+ String index = "index";
+ boolean create = false;
+ File root = null;
+
+ String usage = "org.pdfbox.searchengine.lucene.IndexFiles [-create] [-index <index>] <root_directory>";
+
+ if (argv.length == 0)
+ {
+ System.err.println("Usage: " + usage);
+ return;
+ }
+
+ for (int i = 0; i < argv.length; i++)
+ {
+ if (argv[i].equals("-index"))
+ { // parse -index option
+ index = argv[++i];
+ }
+ else if (argv[i].equals("-create"))
+ { // parse -create option
+ create = true;
+ }
+ else if (i != argv.length-1)
+ {
+ System.err.println("Usage: " + usage);
+ return;
+ }
+ else
+ {
+ System.out.println( "root=" +argv[i] );
+ root = new File(argv[i]);
+ }
+ }
+ IndexFiles indexer = new IndexFiles();
+ indexer.index( root, create, index );
+ }
+
+ /**
+ * This will index a directory.
+ *
+ * @param root The root directory to start indexing.
+ * @param create Should we create a new index?
+ * @param index The name of the index.
+ */
+ public void index( File root, boolean create, String index )
+ {
+
+ try
+ {
+ Date start = new Date();
+
+ writer = new IndexWriter(index, new StandardAnalyzer(), create);
+ writer.maxFieldLength = 1000000;
+
+ if (!create)
+ { // delete stale docs
+ deleting = true;
+ indexDocs(root, index, create);
+ }
+
+ indexDocs(root, index, create); // add new docs
+
+ System.out.println("Optimizing index...");
+ writer.optimize();
+ writer.close();
+
+ Date end = new Date();
+
+ System.out.print(end.getTime() - start.getTime());
+ System.out.println(" total milliseconds");
+
+ }
+ catch( Exception e )
+ {
+ e.printStackTrace();
+ }
+ }
+
+ /**
+ * Walk directory hierarchy in uid order, while keeping uid iterator from
+ * existing index in sync. Mismatches indicate one of: (a) old documents to
+ * be deleted; (b) unchanged documents, to be left alone; or (c) new
+ * documents, to be indexed.
+ *
+ * @param file The directory to index.
+ * @param index The index to add the file to.
+ * @param create A flag telling if we should create the index.
+ *
+ * @throws Exception If there is any error indexing the directory.
+ */
+ private void indexDocs(File file, String index, boolean create) throws Exception
+ {
+ if (!create)
+ { // incrementally update
+
+ reader = IndexReader.open(index); // open existing index
+ uidIter = reader.terms(new Term("uid", "")); // init uid iterator
+
+ indexDocs(file);
+
+ if (deleting)
+ { // delete rest of stale docs
+ while (uidIter.term() != null && uidIter.term().field().equals( "uid" ) )
+ {
+ System.out.println("deleting " +
+ HTMLDocument.uid2url(uidIter.term().text()));
+ reader.delete(uidIter.term());
+ uidIter.next();
+ }
+ deleting = false;
+ }
+
+ uidIter.close(); // close uid iterator
+ reader.close(); // close existing index
+
+ }
+ else
+ {
+ indexDocs(file);
+ }
+ }
+
+
+ private void indexDocs(File file) throws Exception
+ {
+ if (file.isDirectory())
+ { // if a directory
+ String[] files = file.list(); // list its files
+ Arrays.sort(files); // sort the files
+ for (int i = 0; i < files.length; i++) // recursively index them
+ {
+ indexDocs(new File(file, files[i]));
+ }
+ }
+ else
+ {
+ if (uidIter != null)
+ {
+ String uid = HTMLDocument.uid(file); // construct uid for doc
+
+ while( uidIter.term() != null &&
+ uidIter.term().field().equals( "uid" ) &&
+ uidIter.term().text().compareTo(uid) < 0)
+ {
+ if (deleting)
+ { // delete stale docs
+ System.out.println("deleting " +
+ HTMLDocument.uid2url(uidIter.term().text()));
+ reader.delete(uidIter.term());
+ }
+ uidIter.next();
+ }
+ if( uidIter.term() != null &&
+ uidIter.term().field().equals( "uid" ) &&
+ uidIter.term().text().compareTo(uid) == 0)
+ {
+ System.out.println( "Next uid=" +uidIter );
+ uidIter.next(); // keep matching docs
+ }
+ }
+ else
+ {
+ try
+ {
+ addDocument( file );
+ }
+ catch( IOException e )
+ {
+ //catch exception and move onto the next document
+ System.out.println( e.getMessage() );
+ }
+ }
+ }
+ }
+
+ private void addDocument( File file ) throws IOException, InterruptedException
+ {
+ String path = file.getName().toUpperCase();
+ Document doc = null;
+ //Gee, this would be a great place for a command pattern
+ if( path.endsWith(".HTML") || // index .html files
+ path.endsWith(".HTM") || // index .htm files
+ path.endsWith(".TXT"))
+ {
+ System.out.println( "Indexing Text document: " + file );
+ doc = HTMLDocument.Document(file);
+ }
+ else if( path.endsWith( ".PDF" ) )
+ {
+ System.out.println( "Indexing PDF document: " + file );
+ doc = LucenePDFDocument.getDocument( file );
+ }
+ else
+ {
+ System.out.println( "Skipping " + file );
+ }
+
+ if( doc != null )
+ {
+ writer.addDocument(doc);
+ }
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/searchengine/lucene/LucenePDFDocument.java b/src/main/java/org/pdfbox/searchengine/lucene/LucenePDFDocument.java
new file mode 100644
index 0000000..1bb8d0c
--- /dev/null
+++ b/src/main/java/org/pdfbox/searchengine/lucene/LucenePDFDocument.java
@@ -0,0 +1,387 @@
+/**
+ * Copyright (c) 2003, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.searchengine.lucene;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStream;
+import java.io.IOException;
+import java.io.StringReader;
+import java.io.StringWriter;
+
+import java.net.URL;
+import java.net.URLConnection;
+
+import java.util.Date;
+
+import org.apache.lucene.document.DateField;
+import org.apache.lucene.document.Document;
+import org.apache.lucene.document.Field;
+
+import org.pdfbox.pdmodel.PDDocument;
+import org.pdfbox.pdmodel.PDDocumentInformation;
+
+import org.pdfbox.exceptions.CryptographyException;
+import org.pdfbox.exceptions.InvalidPasswordException;
+
+import org.pdfbox.util.PDFTextStripper;
+
+/**
+ * This class is used to create a document for the lucene search engine.
+ * This should easily plug into the IndexHTML or IndexFiles that comes with
+ * the lucene project. This class will populate the following fields.
+ * <table>
+ * <tr>
+ * <td>Lucene Field Name</td>
+ * <td>Description</td>
+ * </tr>
+ * <tr>
+ * <td>path</td>
+ * <td>File system path if loaded from a file</td>
+ * </tr>
+ * <tr>
+ * <td>url</td>
+ * <td>URL to PDF document</td>
+ * </tr>
+ * <tr>
+ * <td>contents</td>
+ * <td>Entire contents of PDF document, indexed but not stored</td>
+ * </tr>
+ * <tr>
+ * <td>summary</td>
+ * <td>First 500 characters of content</td>
+ * </tr>
+ * <tr>
+ * <td>modified</td>
+ * <td>The modified date/time according to the url or path</td>
+ * </tr>
+ * <tr>
+ * <td>uid</td>
+ * <td>A unique identifier for the Lucene document.</td>
+ * </tr>
+ * <tr>
+ * <td>CreationDate</td>
+ * <td>From PDF meta-data if available</td>
+ * </tr>
+ * <tr>
+ * <td>Creator</td>
+ * <td>From PDF meta-data if available</td>
+ * </tr>
+ * <tr>
+ * <td>Keywords</td>
+ * <td>From PDF meta-data if available</td>
+ * </tr>
+ * <tr>
+ * <td>ModificationDate</td>
+ * <td>From PDF meta-data if available</td>
+ * </tr>
+ * <tr>
+ * <td>Producer</td>
+ * <td>From PDF meta-data if available</td>
+ * </tr>
+ * <tr>
+ * <td>Subject</td>
+ * <td>From PDF meta-data if available</td>
+ * </tr>
+ * <tr>
+ * <td>Trapped</td>
+ * <td>From PDF meta-data if available</td>
+ * </tr>
+ * </table>
+ *
+ * @author Ben Litchfield
+ * @version $Revision: 1.18 $
+ */
+public final class LucenePDFDocument
+{
+ private static final char FILE_SEPARATOR = System.getProperty("file.separator").charAt(0);
+
+
+ /**
+ * private constructor because there are only static methods.
+ */
+ private LucenePDFDocument()
+ {
+ //utility class should not be instantiated
+ }
+
+ /**
+ * This will get a lucene document from a PDF file.
+ *
+ * @param is The stream to read the PDF from.
+ *
+ * @return The lucene document.
+ *
+ * @throws IOException If there is an error parsing or indexing the document.
+ */
+ public static Document getDocument( InputStream is ) throws IOException
+ {
+ Document document = new Document();
+ addContent( document, is, "<inputstream>" );
+ return document;
+ }
+
+ /**
+ * This will get a lucene document from a PDF file.
+ *
+ * @param file The file to get the document for.
+ *
+ * @return The lucene document.
+ *
+ * @throws IOException If there is an error parsing or indexing the document.
+ */
+ public static Document getDocument( File file ) throws IOException
+ {
+ Document document = new Document();
+
+ // Add the url as a field named "url". Use an UnIndexed field, so
+ // that the url is just stored with the document, but is not searchable.
+ document.add( Field.UnIndexed("path", file.getPath() ) );
+ document.add(Field.UnIndexed("url", file.getPath().replace(FILE_SEPARATOR, '/')));
+
+ // Add the last modified date of the file a field named "modified". Use a
+ // Keyword field, so that it's searchable, but so that no attempt is made
+ // to tokenize the field into words.
+ document.add(Field.Keyword("modified", DateField.timeToString( file.lastModified() )));
+
+ String uid = file.getPath().replace(FILE_SEPARATOR, '\u0000') + "\u0000" +
+ DateField.timeToString(file.lastModified() );
+
+ // Add the uid as a field, so that index can be incrementally maintained.
+ // This field is not stored with document, it is indexed, but it is not
+ // tokenized prior to indexing.
+ document.add(new Field("uid", uid, false, true, false));
+
+ FileInputStream input = null;
+ try
+ {
+ input = new FileInputStream( file );
+ addContent( document, input, file.getPath() );
+ }
+ finally
+ {
+ if( input != null )
+ {
+ input.close();
+ }
+ }
+
+
+ // return the document
+
+ return document;
+ }
+
+ /**
+ * This will get a lucene document from a PDF file.
+ *
+ * @param url The file to get the document for.
+ *
+ * @return The lucene document.
+ *
+ * @throws IOException If there is an error parsing or indexing the document.
+ */
+ public static Document getDocument( URL url ) throws IOException
+ {
+ Document document = new Document();
+ URLConnection connection = url.openConnection();
+ connection.connect();
+ // Add the url as a field named "url". Use an UnIndexed field, so
+ // that the url is just stored with the document, but is not searchable.
+ document.add( Field.UnIndexed("url", url.toExternalForm() ) );
+
+ // Add the last modified date of the file a field named "modified". Use a
+ // Keyword field, so that it's searchable, but so that no attempt is made
+ // to tokenize the field into words.
+ document.add(Field.Keyword("modified", DateField.timeToString( connection.getLastModified())));
+
+ String uid = url.toExternalForm().replace(FILE_SEPARATOR, '\u0000') + "\u0000" +
+ DateField.timeToString( connection.getLastModified() );
+
+ // Add the uid as a field, so that index can be incrementally maintained.
+ // This field is not stored with document, it is indexed, but it is not
+ // tokenized prior to indexing.
+ document.add(new Field("uid", uid, false, true, false));
+
+ InputStream input = null;
+ try
+ {
+ input = connection.getInputStream();
+ addContent( document, input,url.toExternalForm() );
+ }
+ finally
+ {
+ if( input != null )
+ {
+ input.close();
+ }
+ }
+
+ // return the document
+ return document;
+ }
+
+ /**
+ * This will add the contents to the lucene document.
+ *
+ * @param document The document to add the contents to.
+ * @param is The stream to get the contents from.
+ * @param documentLocation The location of the document, used just for debug messages.
+ *
+ * @throws IOException If there is an error parsing the document.
+ */
+ private static void addContent( Document document, InputStream is, String documentLocation ) throws IOException
+ {
+ PDDocument pdfDocument = null;
+ try
+ {
+ pdfDocument = PDDocument.load( is );
+
+
+ if( pdfDocument.isEncrypted() )
+ {
+ //Just try using the default password and move on
+ pdfDocument.decrypt( "" );
+ }
+
+ //create a writer where to append the text content.
+ StringWriter writer = new StringWriter();
+ PDFTextStripper stripper = new PDFTextStripper();
+ stripper.writeText( pdfDocument, writer );
+
+ // Note: the buffer to string operation is costless;
+ // the char array value of the writer buffer and the content string
+ // is shared as long as the buffer content is not modified, which will
+ // not occur here.
+ String contents = writer.getBuffer().toString();
+
+ StringReader reader = new StringReader( contents );
+
+ // Add the tag-stripped contents as a Reader-valued Text field so it will
+ // get tokenized and indexed.
+ document.add( Field.Text( "contents", reader ) );
+
+ PDDocumentInformation info = pdfDocument.getDocumentInformation();
+ if( info.getAuthor() != null )
+ {
+ document.add(Field.Text( "Author", info.getAuthor() ) );
+ }
+ if( info.getCreationDate() != null )
+ {
+ Date date = info.getCreationDate().getTime();
+ //for some reason lucene cannot handle dates before the epoch
+ //and throws a nasty RuntimeException, so we will check and
+ //verify that this does not happen
+ if( date.getTime() >= 0 )
+ {
+ document.add(Field.Text("CreationDate", DateField.dateToString( date ) ) );
+ }
+ }
+ if( info.getCreator() != null )
+ {
+ document.add( Field.Text( "Creator", info.getCreator() ) );
+ }
+ if( info.getKeywords() != null )
+ {
+ document.add( Field.Text( "Keywords", info.getKeywords() ) );
+ }
+ if( info.getModificationDate() != null )
+ {
+ Date date = info.getModificationDate().getTime();
+ //for some reason lucene cannot handle dates before the epoch
+ //and throws a nasty RuntimeException, so we will check and
+ //verify that this does not happen
+ if( date.getTime() >= 0 )
+ {
+ document.add(Field.Text("ModificationDate", DateField.dateToString( date ) ) );
+ }
+ }
+ if( info.getProducer() != null )
+ {
+ document.add( Field.Text( "Producer", info.getProducer() ) );
+ }
+ if( info.getSubject() != null )
+ {
+ document.add( Field.Text( "Subject", info.getSubject() ) );
+ }
+ if( info.getTitle() != null )
+ {
+ document.add( Field.Text( "Title", info.getTitle() ) );
+ }
+ if( info.getTrapped() != null )
+ {
+ document.add( Field.Text( "Trapped", info.getTrapped() ) );
+ }
+
+ int summarySize = Math.min( contents.length(), 500 );
+ String summary = contents.substring( 0, summarySize );
+ // Add the summary as an UnIndexed field, so that it is stored and returned
+ // with hit documents for display.
+ document.add( Field.UnIndexed( "summary", summary ) );
+ }
+ catch( CryptographyException e )
+ {
+ throw new IOException( "Error decrypting document(" + documentLocation + "): " + e );
+ }
+ catch( InvalidPasswordException e )
+ {
+ //they didn't suppply a password and the default of "" was wrong.
+ throw new IOException( "Error: The document(" + documentLocation +
+ ") is encrypted and will not be indexed." );
+ }
+ finally
+ {
+ if( pdfDocument != null )
+ {
+ pdfDocument.close();
+ }
+ }
+ }
+
+ /**
+ * This will test creating a document.
+ *
+ * usage: java pdfparser.searchengine.lucene.LucenePDFDocument &lt;pdf-document&gt;
+ *
+ * @param args command line arguments.
+ *
+ * @throws IOException If there is an error.
+ */
+ public static void main( String[] args ) throws IOException
+ {
+ if( args.length != 1 )
+ {
+ System.err.println( "usage: java org.pdfbox.searchengine.lucene.LucenePDFDocument <pdf-document>" );
+ System.exit( 1 );
+ }
+ System.out.println( "Document=" + getDocument( new File( args[0] ) ) );
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/searchengine/lucene/package.html b/src/main/java/org/pdfbox/searchengine/lucene/package.html
new file mode 100644
index 0000000..fbf3a38
--- /dev/null
+++ b/src/main/java/org/pdfbox/searchengine/lucene/package.html
@@ -0,0 +1,9 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head>
+
+</head>
+<body>
+This package holds classes that are used to integrate the PDFBox project with lucene.
+</body>
+</html>
diff --git a/src/main/java/org/pdfbox/searchengine/package.html b/src/main/java/org/pdfbox/searchengine/package.html
new file mode 100644
index 0000000..1cb4629
--- /dev/null
+++ b/src/main/java/org/pdfbox/searchengine/package.html
@@ -0,0 +1,9 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head>
+
+</head>
+<body>
+Classes that are used to integrate PDFBox with a search engine are located here.
+</body>
+</html>
diff --git a/src/main/java/org/pdfbox/ttf/CMAPEncodingEntry.java b/src/main/java/org/pdfbox/ttf/CMAPEncodingEntry.java
new file mode 100644
index 0000000..a740203
--- /dev/null
+++ b/src/main/java/org/pdfbox/ttf/CMAPEncodingEntry.java
@@ -0,0 +1,219 @@
+/**
+ * Copyright (c) 2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.ttf;
+
+import java.io.IOException;
+
+/**
+ * An encoding entry for a cmap.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.1 $
+ */
+public class CMAPEncodingEntry
+{
+
+ private int platformId;
+ private int platformEncodingId;
+ private long subTableOffset;
+ private int[] glyphIdToCharacterCode;
+ /**
+ * This will read the required data from the stream.
+ *
+ * @param ttf The font that is being read.
+ * @param data The stream to read the data from.
+ * @throws IOException If there is an error reading the data.
+ */
+ public void initData( TrueTypeFont ttf, TTFDataStream data ) throws IOException
+ {
+ platformId = data.readUnsignedShort();
+ platformEncodingId = data.readUnsignedShort();
+ subTableOffset = data.readUnsignedInt();
+ }
+
+ /**
+ * This will read the required data from the stream.
+ *
+ * @param ttf The font that is being read.
+ * @param data The stream to read the data from.
+ * @throws IOException If there is an error reading the data.
+ */
+ public void initSubtable( TrueTypeFont ttf, TTFDataStream data ) throws IOException
+ {
+ data.seek( ttf.getCMAP().getOffset() + subTableOffset );
+ int subtableFormat = data.readUnsignedShort();
+ int length = data.readUnsignedShort();
+ int version = data.readUnsignedShort();
+ int numGlyphs = ttf.getMaximumProfile().getNumGlyphs();
+ if( subtableFormat == 0 )
+ {
+ byte[] glyphMapping = data.read( 256 );
+ glyphIdToCharacterCode = new int[256];
+ for( int i=0;i<glyphMapping.length; i++ )
+ {
+ glyphIdToCharacterCode[i]=(glyphMapping[i]+256)%256;
+ }
+ }
+ else if( subtableFormat == 2 )
+ {
+ int[] subHeaderKeys = new int[256];
+ for( int i=0; i<256; i++)
+ {
+ subHeaderKeys[i] = data.readUnsignedShort();
+ }
+ int firstCode = data.readUnsignedShort();
+ int entryCount = data.readUnsignedShort();
+ short idDelta = data.readSignedShort();
+ int idRangeOffset = data.readUnsignedShort();
+ //BJL
+ //HMM the TTF spec is not very clear about what is suppose to
+ //happen here. If you know please submit a patch or point
+ //me to some better documentation.
+ throw new IOException( "Not yet implemented:" + subtableFormat );
+ }
+ else if( subtableFormat == 4 )
+ {
+ int segCountX2 = data.readUnsignedShort();
+ int segCount = segCountX2/2;
+ int searchRange = data.readUnsignedShort();
+ int entrySelector = data.readUnsignedShort();
+ int rangeShift = data.readUnsignedShort();
+ int[] endCount = data.readUnsignedShortArray( segCount );
+ int reservedPad = data.readUnsignedShort();
+ int[] startCount = data.readUnsignedShortArray( segCount );
+ int[] idDelta = data.readUnsignedShortArray( segCount );
+ int[] idRangeOffset = data.readUnsignedShortArray( segCount );
+
+ //this is the final result
+ //key=glyphId, value is character codes
+ glyphIdToCharacterCode = new int[numGlyphs];
+
+ long currentPosition = data.getCurrentPosition();
+
+ for( int i=0; i<segCount; i++ )
+ {
+ int start = startCount[i];
+ int end = endCount[i];
+ int delta = idDelta[i];
+ int rangeOffset = idRangeOffset[i];
+ if( start != 65536 && end != 65536 )
+ {
+ for( int j=start; j<=end; j++ )
+ {
+ if( rangeOffset == 0 )
+ {
+ glyphIdToCharacterCode[ ((j+delta)%65536) ]=j;
+ }
+ else
+ {
+ long glyphOffset = currentPosition +
+ ((rangeOffset/2) + //idRangeOffset[i]/2
+ (j-start) + //(c - startCount[i])
+ (i-segCount))*2; //&idRangeOffset[i]);
+ data.seek( glyphOffset );
+ int glyphIndex = data.readUnsignedShort();
+ if( glyphIndex != 0 )
+ {
+ glyphIndex += delta;
+ glyphIndex = glyphIndex % 65536;
+ if( glyphIdToCharacterCode[glyphIndex] == 0 )
+ {
+ glyphIdToCharacterCode[glyphIndex] = j;
+ }
+ }
+
+ }
+ }
+ }
+ }
+ }
+ else if( subtableFormat == 6 )
+ {
+ int firstCode = data.readUnsignedShort();
+ int entryCount = data.readUnsignedShort();
+ glyphIdToCharacterCode = new int[numGlyphs];
+ int[] glyphIdArray = data.readUnsignedShortArray( entryCount );
+ for( int i=0; i<entryCount; i++)
+ {
+ glyphIdToCharacterCode[glyphIdArray[i]] = firstCode+i;
+ }
+ }
+ else
+ {
+ throw new IOException( "Unknown cmap format:" + subtableFormat );
+ }
+ }
+
+
+ /**
+ * @return Returns the glyphIdToCharacterCode.
+ */
+ public int[] getGlyphIdToCharacterCode()
+ {
+ return glyphIdToCharacterCode;
+ }
+ /**
+ * @param glyphIdToCharacterCodeValue The glyphIdToCharacterCode to set.
+ */
+ public void setGlyphIdToCharacterCode(int[] glyphIdToCharacterCodeValue)
+ {
+ this.glyphIdToCharacterCode = glyphIdToCharacterCodeValue;
+ }
+
+ /**
+ * @return Returns the platformEncodingId.
+ */
+ public int getPlatformEncodingId()
+ {
+ return platformEncodingId;
+ }
+ /**
+ * @param platformEncodingIdValue The platformEncodingId to set.
+ */
+ public void setPlatformEncodingId(int platformEncodingIdValue)
+ {
+ this.platformEncodingId = platformEncodingIdValue;
+ }
+ /**
+ * @return Returns the platformId.
+ */
+ public int getPlatformId()
+ {
+ return platformId;
+ }
+ /**
+ * @param platformIdValue The platformId to set.
+ */
+ public void setPlatformId(int platformIdValue)
+ {
+ this.platformId = platformIdValue;
+ }
+}
diff --git a/src/main/java/org/pdfbox/ttf/CMAPTable.java b/src/main/java/org/pdfbox/ttf/CMAPTable.java
new file mode 100644
index 0000000..92a74bc
--- /dev/null
+++ b/src/main/java/org/pdfbox/ttf/CMAPTable.java
@@ -0,0 +1,122 @@
+/**
+ * Copyright (c) 2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.ttf;
+
+import java.io.IOException;
+
+/**
+ * A table in a true type font.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.1 $
+ */
+public class CMAPTable extends TTFTable
+{
+ /**
+ * A tag used to identify this table.
+ */
+ public static final String TAG = "cmap";
+
+ /**
+ * A constant for the platform.
+ */
+ public static final int PLATFORM_WINDOWS = 3;
+
+ /**
+ * An encoding constant.
+ */
+ public static final int ENCODING_SYMBOL = 0;
+ /**
+ * An encoding constant.
+ */
+ public static final int ENCODING_UNICODE = 1;
+ /**
+ * An encoding constant.
+ */
+ public static final int ENCODING_SHIFT_JIS = 2;
+ /**
+ * An encoding constant.
+ */
+ public static final int ENCODING_BIG5 = 3;
+ /**
+ * An encoding constant.
+ */
+ public static final int ENCODING_PRC = 4;
+ /**
+ * An encoding constant.
+ */
+ public static final int ENCODING_WANSUNG = 5;
+ /**
+ * An encoding constant.
+ */
+ public static final int ENCODING_JOHAB = 6;
+
+ private CMAPEncodingEntry[] cmaps;
+
+ /**
+ * This will read the required data from the stream.
+ *
+ * @param ttf The font that is being read.
+ * @param data The stream to read the data from.
+ * @throws IOException If there is an error reading the data.
+ */
+ public void initData( TrueTypeFont ttf, TTFDataStream data ) throws IOException
+ {
+ int version = data.readUnsignedShort();
+ int numberOfTables = data.readUnsignedShort();
+ cmaps = new CMAPEncodingEntry[ numberOfTables ];
+ for( int i=0; i< numberOfTables; i++ )
+ {
+ CMAPEncodingEntry cmap = new CMAPEncodingEntry();
+ cmap.initData( ttf, data );
+ cmaps[i]=cmap;
+ }
+ for( int i=0; i< numberOfTables; i++ )
+ {
+ cmaps[i].initSubtable( ttf, data );
+ }
+
+ }
+ /**
+ * @return Returns the cmaps.
+ */
+ public CMAPEncodingEntry[] getCmaps()
+ {
+ return cmaps;
+ }
+ /**
+ * @param cmapsValue The cmaps to set.
+ */
+ public void setCmaps(CMAPEncodingEntry[] cmapsValue)
+ {
+ this.cmaps = cmapsValue;
+ }
+}
diff --git a/src/main/java/org/pdfbox/ttf/DigitalSignatureTable.java b/src/main/java/org/pdfbox/ttf/DigitalSignatureTable.java
new file mode 100644
index 0000000..67ae170
--- /dev/null
+++ b/src/main/java/org/pdfbox/ttf/DigitalSignatureTable.java
@@ -0,0 +1,45 @@
+/**
+ * Copyright (c) 2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.ttf;
+
+/**
+ * A table in a true type font.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.1 $
+ */
+public class DigitalSignatureTable extends TTFTable
+{
+ /**
+ * Tag to identify this table.
+ */
+ public static final String TAG = "DSIG";
+}
diff --git a/src/main/java/org/pdfbox/ttf/GlyphData.java b/src/main/java/org/pdfbox/ttf/GlyphData.java
new file mode 100644
index 0000000..95aed28
--- /dev/null
+++ b/src/main/java/org/pdfbox/ttf/GlyphData.java
@@ -0,0 +1,125 @@
+/**
+ * Copyright (c) 2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.ttf;
+
+import java.io.IOException;
+
+import org.pdfbox.util.BoundingBox;
+
+/**
+ * A glyph data record in the glyf table.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.1 $
+ */
+public class GlyphData
+{
+ private static final int FLAG_ON_CURVE = 1;
+ private static final int FLAG_SHORT_X = 1<<1;
+ private static final int FLAG_SHORT_Y = 1<<2;
+ private static final int FLAG_X_MAGIC = 1<<3;
+ private static final int FLAG_Y_MAGIC = 1<<4;
+
+ private BoundingBox boundingBox = new BoundingBox();
+ private short numberOfContours;
+ private int[] endPointsOfContours;
+ private byte[] instructions;
+ private int[] flags;
+ private short[] xCoordinates;
+ private short[] yCoordinates;
+
+ /**
+ * This will read the required data from the stream.
+ *
+ * @param ttf The font that is being read.
+ * @param data The stream to read the data from.
+ * @throws IOException If there is an error reading the data.
+ */
+ public void initData( TrueTypeFont ttf, TTFDataStream data ) throws IOException
+ {
+ numberOfContours = data.readSignedShort();
+ boundingBox.setLowerLeftX( data.readSignedShort() );
+ boundingBox.setLowerLeftY( data.readSignedShort() );
+ boundingBox.setUpperRightX( data.readSignedShort() );
+ boundingBox.setUpperRightY( data.readSignedShort() );
+ /**if( numberOfContours > 0 )
+ {
+ endPointsOfContours = new int[ numberOfContours ];
+ for( int i=0; i<numberOfContours; i++ )
+ {
+ endPointsOfContours[i] = data.readUnsignedShort();
+ }
+ int instructionLength = data.readUnsignedShort();
+ instructions = data.read( instructionLength );
+
+ //BJL It is possible to read some more information here but PDFBox
+ //does not need it at this time so just ignore it.
+
+ //not sure if the length of the flags is the number of contours??
+ //flags = new int[numberOfContours];
+ //first read the flags, and just so the TTF can save a couples bytes
+ //we need to check some bit masks to see if there are more bytes or not.
+ //int currentFlagIndex = 0;
+ //int currentFlag =
+
+
+ }*/
+ }
+
+ /**
+ * @return Returns the boundingBox.
+ */
+ public BoundingBox getBoundingBox()
+ {
+ return boundingBox;
+ }
+ /**
+ * @param boundingBoxValue The boundingBox to set.
+ */
+ public void setBoundingBox(BoundingBox boundingBoxValue)
+ {
+ this.boundingBox = boundingBoxValue;
+ }
+ /**
+ * @return Returns the numberOfContours.
+ */
+ public short getNumberOfContours()
+ {
+ return numberOfContours;
+ }
+ /**
+ * @param numberOfContoursValue The numberOfContours to set.
+ */
+ public void setNumberOfContours(short numberOfContoursValue)
+ {
+ this.numberOfContours = numberOfContoursValue;
+ }
+}
diff --git a/src/main/java/org/pdfbox/ttf/GlyphTable.java b/src/main/java/org/pdfbox/ttf/GlyphTable.java
new file mode 100644
index 0000000..bbde89a
--- /dev/null
+++ b/src/main/java/org/pdfbox/ttf/GlyphTable.java
@@ -0,0 +1,88 @@
+/**
+ * Copyright (c) 2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.ttf;
+
+import java.io.IOException;
+
+/**
+ * A table in a true type font.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.1 $
+ */
+public class GlyphTable extends TTFTable
+{
+ /**
+ * Tag to identify this table.
+ */
+ public static final String TAG = "glyf";
+
+ private GlyphData[] glyphs;
+
+ /**
+ * This will read the required data from the stream.
+ *
+ * @param ttf The font that is being read.
+ * @param data The stream to read the data from.
+ * @throws IOException If there is an error reading the data.
+ */
+ public void initData( TrueTypeFont ttf, TTFDataStream data ) throws IOException
+ {
+ MaximumProfileTable maxp = ttf.getMaximumProfile();
+ IndexToLocationTable loc = ttf.getIndexToLocation();
+ PostScriptTable post = ttf.getPostScript();
+ long[] offsets = loc.getOffsets();
+ int numGlyphs = maxp.getNumGlyphs();
+ glyphs = new GlyphData[numGlyphs];
+ String[] glyphNames = post.getGlyphNames();
+ for( int i=0; i<numGlyphs-1; i++ )
+ {
+ GlyphData glyph = new GlyphData();
+ data.seek( getOffset() + offsets[i] );
+ glyph.initData( ttf, data );
+ glyphs[i] = glyph;
+ }
+ }
+ /**
+ * @return Returns the glyphs.
+ */
+ public GlyphData[] getGlyphs()
+ {
+ return glyphs;
+ }
+ /**
+ * @param glyphsValue The glyphs to set.
+ */
+ public void setGlyphs(GlyphData[] glyphsValue)
+ {
+ this.glyphs = glyphsValue;
+ }
+}
diff --git a/src/main/java/org/pdfbox/ttf/HeaderTable.java b/src/main/java/org/pdfbox/ttf/HeaderTable.java
new file mode 100644
index 0000000..b4a8369
--- /dev/null
+++ b/src/main/java/org/pdfbox/ttf/HeaderTable.java
@@ -0,0 +1,332 @@
+/**
+ * Copyright (c) 2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.ttf;
+
+import java.io.IOException;
+import java.util.Calendar;
+
+/**
+ * A table in a true type font.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.1 $
+ */
+public class HeaderTable extends TTFTable
+{
+ /**
+ * Tag to identify this table.
+ */
+ public static final String TAG = "head";
+
+ private float version;
+ private float fontRevision;
+ private long checkSumAdjustment;
+ private long magicNumber;
+ private int flags;
+ private int unitsPerEm;
+ private Calendar created;
+ private Calendar modified;
+ private short xMin;
+ private short yMin;
+ private short xMax;
+ private short yMax;
+ private int macStyle;
+ private int lowestRecPPEM;
+ private short fontDirectionHint;
+ private short indexToLocFormat;
+ private short glyphDataFormat;
+
+ /**
+ * This will read the required data from the stream.
+ *
+ * @param ttf The font that is being read.
+ * @param data The stream to read the data from.
+ * @throws IOException If there is an error reading the data.
+ */
+ public void initData( TrueTypeFont ttf, TTFDataStream data ) throws IOException
+ {
+ version = data.read32Fixed();
+ fontRevision = data.read32Fixed();
+ checkSumAdjustment = data.readUnsignedInt();
+ magicNumber = data.readUnsignedInt();
+ flags = data.readUnsignedShort();
+ unitsPerEm = data.readUnsignedShort();
+ created = data.readInternationalDate();
+ modified = data.readInternationalDate();
+ xMin = data.readSignedShort();
+ yMin = data.readSignedShort();
+ xMax = data.readSignedShort();
+ yMax = data.readSignedShort();
+ macStyle = data.readUnsignedShort();
+ lowestRecPPEM = data.readUnsignedShort();
+ fontDirectionHint = data.readSignedShort();
+ indexToLocFormat = data.readSignedShort();
+ glyphDataFormat = data.readSignedShort();
+ }
+ /**
+ * @return Returns the checkSumAdjustment.
+ */
+ public long getCheckSumAdjustment()
+ {
+ return checkSumAdjustment;
+ }
+ /**
+ * @param checkSumAdjustmentValue The checkSumAdjustment to set.
+ */
+ public void setCheckSumAdjustment(long checkSumAdjustmentValue)
+ {
+ this.checkSumAdjustment = checkSumAdjustmentValue;
+ }
+ /**
+ * @return Returns the created.
+ */
+ public Calendar getCreated()
+ {
+ return created;
+ }
+ /**
+ * @param createdValue The created to set.
+ */
+ public void setCreated(Calendar createdValue)
+ {
+ this.created = createdValue;
+ }
+ /**
+ * @return Returns the flags.
+ */
+ public int getFlags()
+ {
+ return flags;
+ }
+ /**
+ * @param flagsValue The flags to set.
+ */
+ public void setFlags(int flagsValue)
+ {
+ this.flags = flagsValue;
+ }
+ /**
+ * @return Returns the fontDirectionHint.
+ */
+ public short getFontDirectionHint()
+ {
+ return fontDirectionHint;
+ }
+ /**
+ * @param fontDirectionHintValue The fontDirectionHint to set.
+ */
+ public void setFontDirectionHint(short fontDirectionHintValue)
+ {
+ this.fontDirectionHint = fontDirectionHintValue;
+ }
+ /**
+ * @return Returns the fontRevision.
+ */
+ public float getFontRevision()
+ {
+ return fontRevision;
+ }
+ /**
+ * @param fontRevisionValue The fontRevision to set.
+ */
+ public void setFontRevision(float fontRevisionValue)
+ {
+ this.fontRevision = fontRevisionValue;
+ }
+ /**
+ * @return Returns the glyphDataFormat.
+ */
+ public short getGlyphDataFormat()
+ {
+ return glyphDataFormat;
+ }
+ /**
+ * @param glyphDataFormatValue The glyphDataFormat to set.
+ */
+ public void setGlyphDataFormat(short glyphDataFormatValue)
+ {
+ this.glyphDataFormat = glyphDataFormatValue;
+ }
+ /**
+ * @return Returns the indexToLocFormat.
+ */
+ public short getIndexToLocFormat()
+ {
+ return indexToLocFormat;
+ }
+ /**
+ * @param indexToLocFormatValue The indexToLocFormat to set.
+ */
+ public void setIndexToLocFormat(short indexToLocFormatValue)
+ {
+ this.indexToLocFormat = indexToLocFormatValue;
+ }
+ /**
+ * @return Returns the lowestRecPPEM.
+ */
+ public int getLowestRecPPEM()
+ {
+ return lowestRecPPEM;
+ }
+ /**
+ * @param lowestRecPPEMValue The lowestRecPPEM to set.
+ */
+ public void setLowestRecPPEM(int lowestRecPPEMValue)
+ {
+ this.lowestRecPPEM = lowestRecPPEMValue;
+ }
+ /**
+ * @return Returns the macStyle.
+ */
+ public int getMacStyle()
+ {
+ return macStyle;
+ }
+ /**
+ * @param macStyleValue The macStyle to set.
+ */
+ public void setMacStyle(int macStyleValue)
+ {
+ this.macStyle = macStyleValue;
+ }
+ /**
+ * @return Returns the magicNumber.
+ */
+ public long getMagicNumber()
+ {
+ return magicNumber;
+ }
+ /**
+ * @param magicNumberValue The magicNumber to set.
+ */
+ public void setMagicNumber(long magicNumberValue)
+ {
+ this.magicNumber = magicNumberValue;
+ }
+ /**
+ * @return Returns the modified.
+ */
+ public Calendar getModified()
+ {
+ return modified;
+ }
+ /**
+ * @param modifiedValue The modified to set.
+ */
+ public void setModified(Calendar modifiedValue)
+ {
+ this.modified = modifiedValue;
+ }
+ /**
+ * @return Returns the unitsPerEm.
+ */
+ public int getUnitsPerEm()
+ {
+ return unitsPerEm;
+ }
+ /**
+ * @param unitsPerEmValue The unitsPerEm to set.
+ */
+ public void setUnitsPerEm(int unitsPerEmValue)
+ {
+ this.unitsPerEm = unitsPerEmValue;
+ }
+ /**
+ * @return Returns the version.
+ */
+ public float getVersion()
+ {
+ return version;
+ }
+ /**
+ * @param versionValue The version to set.
+ */
+ public void setVersion(float versionValue)
+ {
+ this.version = versionValue;
+ }
+ /**
+ * @return Returns the xMax.
+ */
+ public short getXMax()
+ {
+ return xMax;
+ }
+ /**
+ * @param maxValue The xMax to set.
+ */
+ public void setXMax(short maxValue)
+ {
+ xMax = maxValue;
+ }
+ /**
+ * @return Returns the xMin.
+ */
+ public short getXMin()
+ {
+ return xMin;
+ }
+ /**
+ * @param minValue The xMin to set.
+ */
+ public void setXMin(short minValue)
+ {
+ xMin = minValue;
+ }
+ /**
+ * @return Returns the yMax.
+ */
+ public short getYMax()
+ {
+ return yMax;
+ }
+ /**
+ * @param maxValue The yMax to set.
+ */
+ public void setYMax(short maxValue)
+ {
+ yMax = maxValue;
+ }
+ /**
+ * @return Returns the yMin.
+ */
+ public short getYMin()
+ {
+ return yMin;
+ }
+ /**
+ * @param minValue The yMin to set.
+ */
+ public void setYMin(short minValue)
+ {
+ yMin = minValue;
+ }
+}
diff --git a/src/main/java/org/pdfbox/ttf/HorizontalHeaderTable.java b/src/main/java/org/pdfbox/ttf/HorizontalHeaderTable.java
new file mode 100644
index 0000000..43eff25
--- /dev/null
+++ b/src/main/java/org/pdfbox/ttf/HorizontalHeaderTable.java
@@ -0,0 +1,332 @@
+/**
+ * Copyright (c) 2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.ttf;
+
+import java.io.IOException;
+
+/**
+ * A table in a true type font.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.1 $
+ */
+public class HorizontalHeaderTable extends TTFTable
+{
+ /**
+ * A tag that identifies this table type.
+ */
+ public static final String TAG = "hhea";
+
+ private float version;
+ private short ascender;
+ private short descender;
+ private short lineGap;
+ private int advanceWidthMax;
+ private short minLeftSideBearing;
+ private short minRightSideBearing;
+ private short xMaxExtent;
+ private short caretSlopeRise;
+ private short caretSlopeRun;
+ private short reserved1;
+ private short reserved2;
+ private short reserved3;
+ private short reserved4;
+ private short reserved5;
+ private short metricDataFormat;
+ private int numberOfHMetrics;
+
+ /**
+ * This will read the required data from the stream.
+ *
+ * @param ttf The font that is being read.
+ * @param data The stream to read the data from.
+ * @throws IOException If there is an error reading the data.
+ */
+ public void initData( TrueTypeFont ttf, TTFDataStream data ) throws IOException
+ {
+ version = data.read32Fixed();
+ ascender = data.readSignedShort();
+ descender = data.readSignedShort();
+ lineGap = data.readSignedShort();
+ advanceWidthMax = data.readUnsignedShort();
+ minLeftSideBearing = data.readSignedShort();
+ minRightSideBearing = data.readSignedShort();
+ xMaxExtent = data.readSignedShort();
+ caretSlopeRise = data.readSignedShort();
+ caretSlopeRun = data.readSignedShort();
+ reserved1 = data.readSignedShort();
+ reserved2 = data.readSignedShort();
+ reserved3 = data.readSignedShort();
+ reserved4 = data.readSignedShort();
+ reserved5 = data.readSignedShort();
+ metricDataFormat = data.readSignedShort();
+ numberOfHMetrics = data.readUnsignedShort();
+ }
+
+ /**
+ * @return Returns the advanceWidthMax.
+ */
+ public int getAdvanceWidthMax()
+ {
+ return advanceWidthMax;
+ }
+ /**
+ * @param advanceWidthMaxValue The advanceWidthMax to set.
+ */
+ public void setAdvanceWidthMax(int advanceWidthMaxValue)
+ {
+ this.advanceWidthMax = advanceWidthMaxValue;
+ }
+ /**
+ * @return Returns the ascender.
+ */
+ public short getAscender()
+ {
+ return ascender;
+ }
+ /**
+ * @param ascenderValue The ascender to set.
+ */
+ public void setAscender(short ascenderValue)
+ {
+ this.ascender = ascenderValue;
+ }
+ /**
+ * @return Returns the caretSlopeRise.
+ */
+ public short getCaretSlopeRise()
+ {
+ return caretSlopeRise;
+ }
+ /**
+ * @param caretSlopeRiseValue The caretSlopeRise to set.
+ */
+ public void setCaretSlopeRise(short caretSlopeRiseValue)
+ {
+ this.caretSlopeRise = caretSlopeRiseValue;
+ }
+ /**
+ * @return Returns the caretSlopeRun.
+ */
+ public short getCaretSlopeRun()
+ {
+ return caretSlopeRun;
+ }
+ /**
+ * @param caretSlopeRunValue The caretSlopeRun to set.
+ */
+ public void setCaretSlopeRun(short caretSlopeRunValue)
+ {
+ this.caretSlopeRun = caretSlopeRunValue;
+ }
+ /**
+ * @return Returns the descender.
+ */
+ public short getDescender()
+ {
+ return descender;
+ }
+ /**
+ * @param descenderValue The descender to set.
+ */
+ public void setDescender(short descenderValue)
+ {
+ this.descender = descenderValue;
+ }
+ /**
+ * @return Returns the lineGap.
+ */
+ public short getLineGap()
+ {
+ return lineGap;
+ }
+ /**
+ * @param lineGapValue The lineGap to set.
+ */
+ public void setLineGap(short lineGapValue)
+ {
+ this.lineGap = lineGapValue;
+ }
+ /**
+ * @return Returns the metricDataFormat.
+ */
+ public short getMetricDataFormat()
+ {
+ return metricDataFormat;
+ }
+ /**
+ * @param metricDataFormatValue The metricDataFormat to set.
+ */
+ public void setMetricDataFormat(short metricDataFormatValue)
+ {
+ this.metricDataFormat = metricDataFormatValue;
+ }
+ /**
+ * @return Returns the minLeftSideBearing.
+ */
+ public short getMinLeftSideBearing()
+ {
+ return minLeftSideBearing;
+ }
+ /**
+ * @param minLeftSideBearingValue The minLeftSideBearing to set.
+ */
+ public void setMinLeftSideBearing(short minLeftSideBearingValue)
+ {
+ this.minLeftSideBearing = minLeftSideBearingValue;
+ }
+ /**
+ * @return Returns the minRightSideBearing.
+ */
+ public short getMinRightSideBearing()
+ {
+ return minRightSideBearing;
+ }
+ /**
+ * @param minRightSideBearingValue The minRightSideBearing to set.
+ */
+ public void setMinRightSideBearing(short minRightSideBearingValue)
+ {
+ this.minRightSideBearing = minRightSideBearingValue;
+ }
+ /**
+ * @return Returns the numberOfHMetrics.
+ */
+ public int getNumberOfHMetrics()
+ {
+ return numberOfHMetrics;
+ }
+ /**
+ * @param numberOfHMetricsValue The numberOfHMetrics to set.
+ */
+ public void setNumberOfHMetrics(int numberOfHMetricsValue)
+ {
+ this.numberOfHMetrics = numberOfHMetricsValue;
+ }
+ /**
+ * @return Returns the reserved1.
+ */
+ public short getReserved1()
+ {
+ return reserved1;
+ }
+ /**
+ * @param reserved1Value The reserved1 to set.
+ */
+ public void setReserved1(short reserved1Value)
+ {
+ this.reserved1 = reserved1Value;
+ }
+ /**
+ * @return Returns the reserved2.
+ */
+ public short getReserved2()
+ {
+ return reserved2;
+ }
+ /**
+ * @param reserved2Value The reserved2 to set.
+ */
+ public void setReserved2(short reserved2Value)
+ {
+ this.reserved2 = reserved2Value;
+ }
+ /**
+ * @return Returns the reserved3.
+ */
+ public short getReserved3()
+ {
+ return reserved3;
+ }
+ /**
+ * @param reserved3Value The reserved3 to set.
+ */
+ public void setReserved3(short reserved3Value)
+ {
+ this.reserved3 = reserved3Value;
+ }
+ /**
+ * @return Returns the reserved4.
+ */
+ public short getReserved4()
+ {
+ return reserved4;
+ }
+ /**
+ * @param reserved4Value The reserved4 to set.
+ */
+ public void setReserved4(short reserved4Value)
+ {
+ this.reserved4 = reserved4Value;
+ }
+ /**
+ * @return Returns the reserved5.
+ */
+ public short getReserved5()
+ {
+ return reserved5;
+ }
+ /**
+ * @param reserved5Value The reserved5 to set.
+ */
+ public void setReserved5(short reserved5Value)
+ {
+ this.reserved5 = reserved5Value;
+ }
+ /**
+ * @return Returns the version.
+ */
+ public float getVersion()
+ {
+ return version;
+ }
+ /**
+ * @param versionValue The version to set.
+ */
+ public void setVersion(float versionValue)
+ {
+ this.version = versionValue;
+ }
+ /**
+ * @return Returns the xMaxExtent.
+ */
+ public short getXMaxExtent()
+ {
+ return xMaxExtent;
+ }
+ /**
+ * @param maxExtentValue The xMaxExtent to set.
+ */
+ public void setXMaxExtent(short maxExtentValue)
+ {
+ xMaxExtent = maxExtentValue;
+ }
+}
diff --git a/src/main/java/org/pdfbox/ttf/HorizontalMetricsTable.java b/src/main/java/org/pdfbox/ttf/HorizontalMetricsTable.java
new file mode 100644
index 0000000..4dc9081
--- /dev/null
+++ b/src/main/java/org/pdfbox/ttf/HorizontalMetricsTable.java
@@ -0,0 +1,95 @@
+/**
+ * Copyright (c) 2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.ttf;
+
+import java.io.IOException;
+
+/**
+ * A table in a true type font.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.1 $
+ */
+public class HorizontalMetricsTable extends TTFTable
+{
+ /**
+ * A tag that identifies this table type.
+ */
+ public static final String TAG = "hmtx";
+
+ private int[] advanceWidth;
+ private short[] leftSideBearing;
+ private short[] nonHorizontalLeftSideBearing;
+
+ /**
+ * This will read the required data from the stream.
+ *
+ * @param ttf The font that is being read.
+ * @param data The stream to read the data from.
+ * @throws IOException If there is an error reading the data.
+ */
+ public void initData( TrueTypeFont ttf, TTFDataStream data ) throws IOException
+ {
+ HorizontalHeaderTable hHeader = ttf.getHorizontalHeader();
+ MaximumProfileTable maxp = ttf.getMaximumProfile();
+ int numHMetrics = hHeader.getNumberOfHMetrics();
+ int numGlyphs = maxp.getNumGlyphs();
+
+ advanceWidth = new int[ numHMetrics ];
+ leftSideBearing = new short[ numHMetrics ];
+ for( int i=0; i<numHMetrics; i++ )
+ {
+ advanceWidth[i] = data.readUnsignedShort();
+ leftSideBearing[i] = data.readSignedShort();
+ }
+
+ int numberNonHorizontal = numGlyphs - numHMetrics;
+ nonHorizontalLeftSideBearing = new short[ numberNonHorizontal ];
+ for( int i=0; i<numberNonHorizontal; i++ )
+ {
+ nonHorizontalLeftSideBearing[i] = data.readSignedShort();
+ }
+ }
+ /**
+ * @return Returns the advanceWidth.
+ */
+ public int[] getAdvanceWidth()
+ {
+ return advanceWidth;
+ }
+ /**
+ * @param advanceWidthValue The advanceWidth to set.
+ */
+ public void setAdvanceWidth(int[] advanceWidthValue)
+ {
+ this.advanceWidth = advanceWidthValue;
+ }
+}
diff --git a/src/main/java/org/pdfbox/ttf/IndexToLocationTable.java b/src/main/java/org/pdfbox/ttf/IndexToLocationTable.java
new file mode 100644
index 0000000..a695c73
--- /dev/null
+++ b/src/main/java/org/pdfbox/ttf/IndexToLocationTable.java
@@ -0,0 +1,96 @@
+/**
+ * Copyright (c) 2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.ttf;
+
+import java.io.IOException;
+
+/**
+ * A table in a true type font.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.1 $
+ */
+public class IndexToLocationTable extends TTFTable
+{
+ private static final short SHORT_OFFSETS = 0;
+ private static final short LONG_OFFSETS = 1;
+
+ /**
+ * A tag that identifies this table type.
+ */
+ public static final String TAG = "loca";
+
+ private long[] offsets;
+
+ /**
+ * This will read the required data from the stream.
+ *
+ * @param ttf The font that is being read.
+ * @param data The stream to read the data from.
+ * @throws IOException If there is an error reading the data.
+ */
+ public void initData( TrueTypeFont ttf, TTFDataStream data ) throws IOException
+ {
+ HeaderTable head = ttf.getHeader();
+ MaximumProfileTable maxp = ttf.getMaximumProfile();
+ int numGlyphs = maxp.getNumGlyphs();
+ offsets = new long[ numGlyphs +1];
+ for( int i=0; i<numGlyphs+1; i++ )
+ {
+ if( head.getIndexToLocFormat() == SHORT_OFFSETS )
+ {
+ offsets[i] = data.readUnsignedShort() * 2;
+ }
+ else if( head.getIndexToLocFormat() == LONG_OFFSETS )
+ {
+ offsets[i] = data.readUnsignedInt();
+ }
+ else
+ {
+ throw new IOException( "Error:TTF.loca unknown offset format.");
+ }
+ }
+ }
+ /**
+ * @return Returns the offsets.
+ */
+ public long[] getOffsets()
+ {
+ return offsets;
+ }
+ /**
+ * @param offsetsValue The offsets to set.
+ */
+ public void setOffsets(long[] offsetsValue)
+ {
+ this.offsets = offsetsValue;
+ }
+}
diff --git a/src/main/java/org/pdfbox/ttf/MaximumProfileTable.java b/src/main/java/org/pdfbox/ttf/MaximumProfileTable.java
new file mode 100644
index 0000000..36cf443
--- /dev/null
+++ b/src/main/java/org/pdfbox/ttf/MaximumProfileTable.java
@@ -0,0 +1,300 @@
+/**
+ * Copyright (c) 2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.ttf;
+
+import java.io.IOException;
+
+/**
+ * A table in a true type font.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.1 $
+ */
+public class MaximumProfileTable extends TTFTable
+{
+ /**
+ * A tag that identifies this table type.
+ */
+ public static final String TAG = "maxp";
+
+ private float version;
+ private int numGlyphs;
+ private int maxPoints;
+ private int maxContours;
+ private int maxCompositePoints;
+ private int maxCompositeContours;
+ private int maxZones;
+ private int maxTwilightPoints;
+ private int maxStorage;
+ private int maxFunctionDefs;
+ private int maxInstructionDefs;
+ private int maxStackElements;
+ private int maxSizeOfInstructions;
+ private int maxComponentElements;
+ private int maxComponentDepth;
+
+ /**
+ * @return Returns the maxComponentDepth.
+ */
+ public int getMaxComponentDepth()
+ {
+ return maxComponentDepth;
+ }
+ /**
+ * @param maxComponentDepthValue The maxComponentDepth to set.
+ */
+ public void setMaxComponentDepth(int maxComponentDepthValue)
+ {
+ this.maxComponentDepth = maxComponentDepthValue;
+ }
+ /**
+ * @return Returns the maxComponentElements.
+ */
+ public int getMaxComponentElements()
+ {
+ return maxComponentElements;
+ }
+ /**
+ * @param maxComponentElementsValue The maxComponentElements to set.
+ */
+ public void setMaxComponentElements(int maxComponentElementsValue)
+ {
+ this.maxComponentElements = maxComponentElementsValue;
+ }
+ /**
+ * @return Returns the maxCompositeContours.
+ */
+ public int getMaxCompositeContours()
+ {
+ return maxCompositeContours;
+ }
+ /**
+ * @param maxCompositeContoursValue The maxCompositeContours to set.
+ */
+ public void setMaxCompositeContours(int maxCompositeContoursValue)
+ {
+ this.maxCompositeContours = maxCompositeContoursValue;
+ }
+ /**
+ * @return Returns the maxCompositePoints.
+ */
+ public int getMaxCompositePoints()
+ {
+ return maxCompositePoints;
+ }
+ /**
+ * @param maxCompositePointsValue The maxCompositePoints to set.
+ */
+ public void setMaxCompositePoints(int maxCompositePointsValue)
+ {
+ this.maxCompositePoints = maxCompositePointsValue;
+ }
+ /**
+ * @return Returns the maxContours.
+ */
+ public int getMaxContours()
+ {
+ return maxContours;
+ }
+ /**
+ * @param maxContoursValue The maxContours to set.
+ */
+ public void setMaxContours(int maxContoursValue)
+ {
+ this.maxContours = maxContoursValue;
+ }
+ /**
+ * @return Returns the maxFunctionDefs.
+ */
+ public int getMaxFunctionDefs()
+ {
+ return maxFunctionDefs;
+ }
+ /**
+ * @param maxFunctionDefsValue The maxFunctionDefs to set.
+ */
+ public void setMaxFunctionDefs(int maxFunctionDefsValue)
+ {
+ this.maxFunctionDefs = maxFunctionDefsValue;
+ }
+ /**
+ * @return Returns the maxInstructionDefs.
+ */
+ public int getMaxInstructionDefs()
+ {
+ return maxInstructionDefs;
+ }
+ /**
+ * @param maxInstructionDefsValue The maxInstructionDefs to set.
+ */
+ public void setMaxInstructionDefs(int maxInstructionDefsValue)
+ {
+ this.maxInstructionDefs = maxInstructionDefsValue;
+ }
+ /**
+ * @return Returns the maxPoints.
+ */
+ public int getMaxPoints()
+ {
+ return maxPoints;
+ }
+ /**
+ * @param maxPointsValue The maxPoints to set.
+ */
+ public void setMaxPoints(int maxPointsValue)
+ {
+ this.maxPoints = maxPointsValue;
+ }
+ /**
+ * @return Returns the maxSizeOfInstructions.
+ */
+ public int getMaxSizeOfInstructions()
+ {
+ return maxSizeOfInstructions;
+ }
+ /**
+ * @param maxSizeOfInstructionsValue The maxSizeOfInstructions to set.
+ */
+ public void setMaxSizeOfInstructions(int maxSizeOfInstructionsValue)
+ {
+ this.maxSizeOfInstructions = maxSizeOfInstructionsValue;
+ }
+ /**
+ * @return Returns the maxStackElements.
+ */
+ public int getMaxStackElements()
+ {
+ return maxStackElements;
+ }
+ /**
+ * @param maxStackElementsValue The maxStackElements to set.
+ */
+ public void setMaxStackElements(int maxStackElementsValue)
+ {
+ this.maxStackElements = maxStackElementsValue;
+ }
+ /**
+ * @return Returns the maxStorage.
+ */
+ public int getMaxStorage()
+ {
+ return maxStorage;
+ }
+ /**
+ * @param maxStorageValue The maxStorage to set.
+ */
+ public void setMaxStorage(int maxStorageValue)
+ {
+ this.maxStorage = maxStorageValue;
+ }
+ /**
+ * @return Returns the maxTwilightPoints.
+ */
+ public int getMaxTwilightPoints()
+ {
+ return maxTwilightPoints;
+ }
+ /**
+ * @param maxTwilightPointsValue The maxTwilightPoints to set.
+ */
+ public void setMaxTwilightPoints(int maxTwilightPointsValue)
+ {
+ this.maxTwilightPoints = maxTwilightPointsValue;
+ }
+ /**
+ * @return Returns the maxZones.
+ */
+ public int getMaxZones()
+ {
+ return maxZones;
+ }
+ /**
+ * @param maxZonesValue The maxZones to set.
+ */
+ public void setMaxZones(int maxZonesValue)
+ {
+ this.maxZones = maxZonesValue;
+ }
+ /**
+ * @return Returns the numGlyphs.
+ */
+ public int getNumGlyphs()
+ {
+ return numGlyphs;
+ }
+ /**
+ * @param numGlyphsValue The numGlyphs to set.
+ */
+ public void setNumGlyphs(int numGlyphsValue)
+ {
+ this.numGlyphs = numGlyphsValue;
+ }
+ /**
+ * @return Returns the version.
+ */
+ public float getVersion()
+ {
+ return version;
+ }
+ /**
+ * @param versionValue The version to set.
+ */
+ public void setVersion(float versionValue)
+ {
+ this.version = versionValue;
+ }
+
+ /**
+ * This will read the required data from the stream.
+ *
+ * @param ttf The font that is being read.
+ * @param data The stream to read the data from.
+ * @throws IOException If there is an error reading the data.
+ */
+ public void initData( TrueTypeFont ttf, TTFDataStream data ) throws IOException
+ {
+ version = data.read32Fixed();
+ numGlyphs = data.readUnsignedShort();
+ maxPoints = data.readUnsignedShort();
+ maxContours = data.readUnsignedShort();
+ maxCompositePoints = data.readUnsignedShort();
+ maxCompositeContours = data.readUnsignedShort();
+ maxZones = data.readUnsignedShort();
+ maxTwilightPoints = data.readUnsignedShort();
+ maxStorage = data.readUnsignedShort();
+ maxFunctionDefs = data.readUnsignedShort();
+ maxInstructionDefs = data.readUnsignedShort();
+ maxStackElements = data.readUnsignedShort();
+ maxSizeOfInstructions = data.readUnsignedShort();
+ maxComponentElements = data.readUnsignedShort();
+ maxComponentDepth = data.readUnsignedShort();
+ }
+}
diff --git a/src/main/java/org/pdfbox/ttf/MemoryTTFDataStream.java b/src/main/java/org/pdfbox/ttf/MemoryTTFDataStream.java
new file mode 100644
index 0000000..17f4455
--- /dev/null
+++ b/src/main/java/org/pdfbox/ttf/MemoryTTFDataStream.java
@@ -0,0 +1,231 @@
+/**
+ * Copyright (c) 2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.ttf;
+
+import java.io.ByteArrayOutputStream;
+import java.io.EOFException;
+import java.io.IOException;
+import java.io.InputStream;
+
+import org.pdfbox.pdmodel.common.PDMemoryStream;
+import org.pdfbox.pdmodel.common.PDStream;
+
+/**
+ * An interface into a data stream.
+ *
+ * @author Ben Litchfield (ben@benlitchfield.com)
+ * @version $Revision: 1.3 $
+ */
+public class MemoryTTFDataStream extends TTFDataStream
+{
+ private byte[] data = null;
+ private int currentPosition = 0;
+
+ /**
+ * Constructor from a stream.
+ * @param is The stream of read from.
+ * @throws IOException If an error occurs while reading from the stream.
+ */
+ public MemoryTTFDataStream( InputStream is ) throws IOException
+ {
+ try
+ {
+ ByteArrayOutputStream output = new ByteArrayOutputStream( is.available() );
+ byte[] buffer = new byte[1024];
+ int amountRead = 0;
+ while( (amountRead = is.read( buffer ) ) != -1 )
+ {
+ output.write( buffer, 0, amountRead );
+ }
+ data = output.toByteArray();
+ }
+ finally
+ {
+ if( is != null )
+ {
+ is.close();
+ }
+ }
+ }
+
+
+
+ /**
+ * Read an unsigned byte.
+ * @return An unsigned byte.
+ * @throws IOException If there is an error reading the data.
+ */
+ public long readLong() throws IOException
+ {
+ return ((long)(readSignedInt()) << 32) + (readSignedInt() & 0xFFFFFFFFL);
+ }
+
+ /**
+ * Read a signed integer.
+ *
+ * @return A signed integer.
+ * @throws IOException If there is a problem reading the file.
+ */
+ public int readSignedInt() throws IOException
+ {
+ int ch1 = read();
+ int ch2 = read();
+ int ch3 = read();
+ int ch4 = read();
+ if( (ch1 | ch2 | ch3 | ch4) < 0)
+ {
+ throw new EOFException();
+ }
+ return ((ch1 << 24) + (ch2 << 16) + (ch3 << 8) + (ch4 << 0));
+ }
+
+ /**
+ * Read an unsigned byte.
+ * @return An unsigned byte.
+ * @throws IOException If there is an error reading the data.
+ */
+ public int read() throws IOException
+ {
+ int retval = -1;
+ if( currentPosition < data.length )
+ {
+ retval = data[currentPosition];
+ }
+ currentPosition++;
+ return (retval+256)%256;
+ }
+
+ /**
+ * Read an unsigned short.
+ *
+ * @return An unsigned short.
+ * @throws IOException If there is an error reading the data.
+ */
+ public int readUnsignedShort() throws IOException
+ {
+ int ch1 = this.read();
+ int ch2 = this.read();
+ if ((ch1 | ch2) < 0)
+ {
+ throw new EOFException();
+ }
+ return (ch1 << 8) + (ch2 << 0);
+ }
+
+ /**
+ * Read an signed short.
+ *
+ * @return An signed short.
+ * @throws IOException If there is an error reading the data.
+ */
+ public short readSignedShort() throws IOException
+ {
+ int ch1 = this.read();
+ int ch2 = this.read();
+ if ((ch1 | ch2) < 0)
+ {
+ throw new EOFException();
+ }
+ return (short)((ch1 << 8) + (ch2 << 0));
+ }
+
+ /**
+ * Close the underlying resources.
+ *
+ * @throws IOException If there is an error closing the resources.
+ */
+ public void close() throws IOException
+ {
+ data = null;
+ }
+
+ /**
+ * Seek into the datasource.
+ *
+ * @param pos The position to seek to.
+ * @throws IOException If there is an error seeking to that position.
+ */
+ public void seek(long pos) throws IOException
+ {
+ currentPosition = (int)pos;
+ }
+
+ /**
+ * @see java.io.InputStream#read( byte[], int, int )
+ *
+ * @param b The buffer to write to.
+ * @param off The offset into the buffer.
+ * @param len The length into the buffer.
+ *
+ * @return The number of bytes read.
+ *
+ * @throws IOException If there is an error reading from the stream.
+ */
+ public int read(byte[] b,
+ int off,
+ int len)
+ throws IOException
+ {
+ int amountRead = Math.min( len, data.length-currentPosition );
+ System.arraycopy(data,currentPosition,b, off, amountRead );
+ currentPosition+=amountRead;
+
+ return amountRead;
+ }
+
+ /**
+ * Get the current position in the stream.
+ * @return The current position in the stream.
+ * @throws IOException If an error occurs while reading the stream.
+ */
+ public long getCurrentPosition() throws IOException
+ {
+ return currentPosition;
+ }
+
+ /**
+ * Get a COSStream from this TTFDataStream
+ * This permit to pass the data read from an
+ * external source to the COSObjects to keep
+ * a certain persistence layer between specialized
+ * objects like the TTF package and the pdmodel package.
+ *
+ * Created by Pascal Allain
+ * Vertical7 Inc.
+ *
+ * @return COSStream describing this stream
+ */
+ public PDStream getPDStream()
+ {
+ return new PDMemoryStream( data );
+ }
+
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/ttf/NameRecord.java b/src/main/java/org/pdfbox/ttf/NameRecord.java
new file mode 100644
index 0000000..354fa89
--- /dev/null
+++ b/src/main/java/org/pdfbox/ttf/NameRecord.java
@@ -0,0 +1,242 @@
+/**
+ * Copyright (c) 2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.ttf;
+
+import java.io.IOException;
+
+/**
+ * A name record in the name table.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.1 $
+ */
+public class NameRecord
+{
+ /**
+ * A constant for the platform.
+ */
+ public static final int PLATFORM_APPLE_UNICODE = 0;
+ /**
+ * A constant for the platform.
+ */
+ public static final int PLATFORM_MACINTOSH = 1;
+ /**
+ * A constant for the platform.
+ */
+ public static final int PLATFORM_ISO = 2;
+ /**
+ * A constant for the platform.
+ */
+ public static final int PLATFORM_WINDOWS = 3;
+
+ /**
+ * Platform specific encoding.
+ */
+ public static final int PLATFORM_ENCODING_WINDOWS_UNDEFINED = 0;
+ /**
+ * Platform specific encoding.
+ */
+ public static final int PLATFORM_ENCODING_WINDOWS_UNICODE = 1;
+
+ /**
+ * A name id.
+ */
+ public static final int NAME_COPYRIGHT = 0;
+ /**
+ * A name id.
+ */
+ public static final int NAME_FONT_FAMILY_NAME = 1;
+ /**
+ * A name id.
+ */
+ public static final int NAME_FONT_SUB_FAMILY_NAME = 2;
+ /**
+ * A name id.
+ */
+ public static final int NAME_UNIQUE_FONT_ID = 3;
+ /**
+ * A name id.
+ */
+ public static final int NAME_FULL_FONT_NAME = 4;
+ /**
+ * A name id.
+ */
+ public static final int NAME_VERSION = 5;
+ /**
+ * A name id.
+ */
+ public static final int NAME_POSTSCRIPT_NAME = 6;
+ /**
+ * A name id.
+ */
+ public static final int NAME_TRADEMARK = 7;
+
+
+
+ private int platformId;
+ private int platformEncodingId;
+ private int languageId;
+ private int nameId;
+ private int stringLength;
+ private int stringOffset;
+ private String string;
+
+ /**
+ * @return Returns the stringLength.
+ */
+ public int getStringLength()
+ {
+ return stringLength;
+ }
+ /**
+ * @param stringLengthValue The stringLength to set.
+ */
+ public void setStringLength(int stringLengthValue)
+ {
+ this.stringLength = stringLengthValue;
+ }
+ /**
+ * @return Returns the stringOffset.
+ */
+ public int getStringOffset()
+ {
+ return stringOffset;
+ }
+ /**
+ * @param stringOffsetValue The stringOffset to set.
+ */
+ public void setStringOffset(int stringOffsetValue)
+ {
+ this.stringOffset = stringOffsetValue;
+ }
+
+ /**
+ * @return Returns the languageId.
+ */
+ public int getLanguageId()
+ {
+ return languageId;
+ }
+ /**
+ * @param languageIdValue The languageId to set.
+ */
+ public void setLanguageId(int languageIdValue)
+ {
+ this.languageId = languageIdValue;
+ }
+ /**
+ * @return Returns the nameId.
+ */
+ public int getNameId()
+ {
+ return nameId;
+ }
+ /**
+ * @param nameIdValue The nameId to set.
+ */
+ public void setNameId(int nameIdValue)
+ {
+ this.nameId = nameIdValue;
+ }
+ /**
+ * @return Returns the platformEncodingId.
+ */
+ public int getPlatformEncodingId()
+ {
+ return platformEncodingId;
+ }
+ /**
+ * @param platformEncodingIdValue The platformEncodingId to set.
+ */
+ public void setPlatformEncodingId(int platformEncodingIdValue)
+ {
+ this.platformEncodingId = platformEncodingIdValue;
+ }
+ /**
+ * @return Returns the platformId.
+ */
+ public int getPlatformId()
+ {
+ return platformId;
+ }
+ /**
+ * @param platformIdValue The platformId to set.
+ */
+ public void setPlatformId(int platformIdValue)
+ {
+ this.platformId = platformIdValue;
+ }
+
+ /**
+ * This will read the required data from the stream.
+ *
+ * @param ttf The font that is being read.
+ * @param data The stream to read the data from.
+ * @throws IOException If there is an error reading the data.
+ */
+ public void initData( TrueTypeFont ttf, TTFDataStream data ) throws IOException
+ {
+ platformId = data.readUnsignedShort();
+ platformEncodingId = data.readUnsignedShort();
+ languageId = data.readUnsignedShort();
+ nameId = data.readUnsignedShort();
+ stringLength = data.readUnsignedShort();
+ stringOffset = data.readUnsignedShort();
+ }
+
+ /**
+ * Return a string representation of this class.
+ *
+ * @return A string for this class.
+ */
+ public String toString()
+ {
+ return
+ "platform=" + platformId +
+ " pEncoding=" + platformEncodingId +
+ " language=" + languageId +
+ " name=" + nameId;
+ }
+ /**
+ * @return Returns the string.
+ */
+ public String getString()
+ {
+ return string;
+ }
+ /**
+ * @param stringValue The string to set.
+ */
+ public void setString(String stringValue)
+ {
+ this.string = stringValue;
+ }
+}
diff --git a/src/main/java/org/pdfbox/ttf/NamingTable.java b/src/main/java/org/pdfbox/ttf/NamingTable.java
new file mode 100644
index 0000000..5976e47
--- /dev/null
+++ b/src/main/java/org/pdfbox/ttf/NamingTable.java
@@ -0,0 +1,112 @@
+/**
+ * Copyright (c) 2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.ttf;
+
+import java.io.IOException;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * A table in a true type font.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.1 $
+ */
+public class NamingTable extends TTFTable
+{
+ /**
+ * A tag that identifies this table type.
+ */
+ public static final String TAG = "name";
+
+ private List nameRecords = new ArrayList();
+
+ /**
+ * This will read the required data from the stream.
+ *
+ * @param ttf The font that is being read.
+ * @param data The stream to read the data from.
+ * @throws IOException If there is an error reading the data.
+ */
+ public void initData( TrueTypeFont ttf, TTFDataStream data ) throws IOException
+ {
+ int formatSelector = data.readUnsignedShort();
+ int numberOfNameRecords = data.readUnsignedShort();
+ int offsetToStartOfStringStorage = data.readUnsignedShort();
+ for( int i=0; i< numberOfNameRecords; i++ )
+ {
+ NameRecord nr = new NameRecord();
+ nr.initData( ttf, data );
+ nameRecords.add( nr );
+ }
+ for( int i=0; i<numberOfNameRecords; i++ )
+ {
+ NameRecord nr = (NameRecord)nameRecords.get( i );
+ data.seek( getOffset() + (2*3)+numberOfNameRecords*2*6+nr.getStringOffset() );
+ int platform = nr.getPlatformId();
+ int encoding = nr.getPlatformEncodingId();
+ String charset = "ISO-8859-1";
+ if( platform == 3 && encoding == 1 )
+ {
+ charset = "UTF-16";
+ }
+ else if( platform == 2 )
+ {
+ if( encoding == 0 )
+ {
+ charset = "US-ASCII";
+ }
+ else if( encoding == 1 )
+ {
+ //not sure is this is correct??
+ charset = "ISO-10646-1";
+ }
+ else if( encoding == 2 )
+ {
+ charset = "ISO-8859-1";
+ }
+ }
+ String string = data.readString( nr.getStringLength(), charset );
+ nr.setString( string );
+ }
+ }
+
+ /**
+ * This will get the name records for this naming table.
+ *
+ * @return A list of NameRecord objects.
+ */
+ public List getNameRecords()
+ {
+ return nameRecords;
+ }
+}
diff --git a/src/main/java/org/pdfbox/ttf/OS2WindowsMetricsTable.java b/src/main/java/org/pdfbox/ttf/OS2WindowsMetricsTable.java
new file mode 100644
index 0000000..f5c5a90
--- /dev/null
+++ b/src/main/java/org/pdfbox/ttf/OS2WindowsMetricsTable.java
@@ -0,0 +1,694 @@
+/**
+ * Copyright (c) 2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.ttf;
+
+import java.io.IOException;
+
+/**
+ * A table in a true type font.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.1 $
+ */
+public class OS2WindowsMetricsTable extends TTFTable
+{
+
+ /**
+ * Weight class constant.
+ */
+ public static final int WEIGHT_CLASS_THIN = 100;
+ /**
+ * Weight class constant.
+ */
+ public static final int WEIGHT_CLASS_ULTRA_LIGHT = 200;
+ /**
+ * Weight class constant.
+ */
+ public static final int WEIGHT_CLASS_LIGHT = 300;
+ /**
+ * Weight class constant.
+ */
+ public static final int WEIGHT_CLASS_NORMAL = 400;
+ /**
+ * Weight class constant.
+ */
+ public static final int WEIGHT_CLASS_MEDIUM = 500;
+ /**
+ * Weight class constant.
+ */
+ public static final int WEIGHT_CLASS_SEMI_BOLD = 600;
+ /**
+ * Weight class constant.
+ */
+ public static final int WEIGHT_CLASS_BOLD = 700;
+ /**
+ * Weight class constant.
+ */
+ public static final int WEIGHT_CLASS_EXTRA_BOLD = 800;
+ /**
+ * Weight class constant.
+ */
+ public static final int WEIGHT_CLASS_BLACK = 900;
+
+ /**
+ * Width class constant.
+ */
+ public static final int WIDTH_CLASS_ULTRA_CONDENSED = 1;
+ /**
+ * Width class constant.
+ */
+ public static final int WIDTH_CLASS_EXTRA_CONDENSED = 2;
+ /**
+ * Width class constant.
+ */
+ public static final int WIDTH_CLASS_CONDENSED = 3;
+ /**
+ * Width class constant.
+ */
+ public static final int WIDTH_CLASS_SEMI_CONDENSED = 4;
+ /**
+ * Width class constant.
+ */
+ public static final int WIDTH_CLASS_MEDIUM = 5;
+ /**
+ * Width class constant.
+ */
+ public static final int WIDTH_CLASS_SEMI_EXPANDED = 6;
+ /**
+ * Width class constant.
+ */
+ public static final int WIDTH_CLASS_EXPANDED = 7;
+ /**
+ * Width class constant.
+ */
+ public static final int WIDTH_CLASS_EXTRA_EXPANDED = 8;
+ /**
+ * Width class constant.
+ */
+ public static final int WIDTH_CLASS_ULTRA_EXPANDED = 9;
+
+ /**
+ * Family class constant.
+ */
+ public static final int FAMILY_CLASS_NO_CLASSIFICATION = 0;
+ /**
+ * Family class constant.
+ */
+ public static final int FAMILY_CLASS_OLDSTYLE_SERIFS = 1;
+ /**
+ * Family class constant.
+ */
+ public static final int FAMILY_CLASS_TRANSITIONAL_SERIFS = 2;
+ /**
+ * Family class constant.
+ */
+ public static final int FAMILY_CLASS_MODERN_SERIFS = 3;
+ /**
+ * Family class constant.
+ */
+ public static final int FAMILY_CLASS_CLAREDON_SERIFS = 4;
+ /**
+ * Family class constant.
+ */
+ public static final int FAMILY_CLASS_SLAB_SERIFS = 5;
+ /**
+ * Family class constant.
+ */
+ public static final int FAMILY_CLASS_FREEFORM_SERIFS = 7;
+ /**
+ * Family class constant.
+ */
+ public static final int FAMILY_CLASS_SANS_SERIF = 8;
+ /**
+ * Family class constant.
+ */
+ public static final int FAMILY_CLASS_ORNAMENTALS = 9;
+ /**
+ * Family class constant.
+ */
+ public static final int FAMILY_CLASS_SCRIPTS = 10;
+ /**
+ * Family class constant.
+ */
+ public static final int FAMILY_CLASS_SYMBOLIC = 12;
+
+ /**
+ * @return Returns the achVendId.
+ */
+ public String getAchVendId()
+ {
+ return achVendId;
+ }
+ /**
+ * @param achVendIdValue The achVendId to set.
+ */
+ public void setAchVendId(String achVendIdValue)
+ {
+ this.achVendId = achVendIdValue;
+ }
+ /**
+ * @return Returns the averageCharWidth.
+ */
+ public short getAverageCharWidth()
+ {
+ return averageCharWidth;
+ }
+ /**
+ * @param averageCharWidthValue The averageCharWidth to set.
+ */
+ public void setAverageCharWidth(short averageCharWidthValue)
+ {
+ this.averageCharWidth = averageCharWidthValue;
+ }
+ /**
+ * @return Returns the codePageRange1.
+ */
+ public long getCodePageRange1()
+ {
+ return codePageRange1;
+ }
+ /**
+ * @param codePageRange1Value The codePageRange1 to set.
+ */
+ public void setCodePageRange1(long codePageRange1Value)
+ {
+ this.codePageRange1 = codePageRange1Value;
+ }
+ /**
+ * @return Returns the codePageRange2.
+ */
+ public long getCodePageRange2()
+ {
+ return codePageRange2;
+ }
+ /**
+ * @param codePageRange2Value The codePageRange2 to set.
+ */
+ public void setCodePageRange2(long codePageRange2Value)
+ {
+ this.codePageRange2 = codePageRange2Value;
+ }
+ /**
+ * @return Returns the familyClass.
+ */
+ public short getFamilyClass()
+ {
+ return familyClass;
+ }
+ /**
+ * @param familyClassValue The familyClass to set.
+ */
+ public void setFamilyClass(short familyClassValue)
+ {
+ this.familyClass = familyClassValue;
+ }
+ /**
+ * @return Returns the firstCharIndex.
+ */
+ public int getFirstCharIndex()
+ {
+ return firstCharIndex;
+ }
+ /**
+ * @param firstCharIndexValue The firstCharIndex to set.
+ */
+ public void setFirstCharIndex(int firstCharIndexValue)
+ {
+ this.firstCharIndex = firstCharIndexValue;
+ }
+ /**
+ * @return Returns the fsSelection.
+ */
+ public int getFsSelection()
+ {
+ return fsSelection;
+ }
+ /**
+ * @param fsSelectionValue The fsSelection to set.
+ */
+ public void setFsSelection(int fsSelectionValue)
+ {
+ this.fsSelection = fsSelectionValue;
+ }
+ /**
+ * @return Returns the fsType.
+ */
+ public short getFsType()
+ {
+ return fsType;
+ }
+ /**
+ * @param fsTypeValue The fsType to set.
+ */
+ public void setFsType(short fsTypeValue)
+ {
+ this.fsType = fsTypeValue;
+ }
+ /**
+ * @return Returns the lastCharIndex.
+ */
+ public int getLastCharIndex()
+ {
+ return lastCharIndex;
+ }
+ /**
+ * @param lastCharIndexValue The lastCharIndex to set.
+ */
+ public void setLastCharIndex(int lastCharIndexValue)
+ {
+ this.lastCharIndex = lastCharIndexValue;
+ }
+ /**
+ * @return Returns the panose.
+ */
+ public byte[] getPanose()
+ {
+ return panose;
+ }
+ /**
+ * @param panoseValue The panose to set.
+ */
+ public void setPanose(byte[] panoseValue)
+ {
+ this.panose = panoseValue;
+ }
+ /**
+ * @return Returns the strikeoutPosition.
+ */
+ public short getStrikeoutPosition()
+ {
+ return strikeoutPosition;
+ }
+ /**
+ * @param strikeoutPositionValue The strikeoutPosition to set.
+ */
+ public void setStrikeoutPosition(short strikeoutPositionValue)
+ {
+ this.strikeoutPosition = strikeoutPositionValue;
+ }
+ /**
+ * @return Returns the strikeoutSize.
+ */
+ public short getStrikeoutSize()
+ {
+ return strikeoutSize;
+ }
+ /**
+ * @param strikeoutSizeValue The strikeoutSize to set.
+ */
+ public void setStrikeoutSize(short strikeoutSizeValue)
+ {
+ this.strikeoutSize = strikeoutSizeValue;
+ }
+ /**
+ * @return Returns the subscriptXOffset.
+ */
+ public short getSubscriptXOffset()
+ {
+ return subscriptXOffset;
+ }
+ /**
+ * @param subscriptXOffsetValue The subscriptXOffset to set.
+ */
+ public void setSubscriptXOffset(short subscriptXOffsetValue)
+ {
+ this.subscriptXOffset = subscriptXOffsetValue;
+ }
+ /**
+ * @return Returns the subscriptXSize.
+ */
+ public short getSubscriptXSize()
+ {
+ return subscriptXSize;
+ }
+ /**
+ * @param subscriptXSizeValue The subscriptXSize to set.
+ */
+ public void setSubscriptXSize(short subscriptXSizeValue)
+ {
+ this.subscriptXSize = subscriptXSizeValue;
+ }
+ /**
+ * @return Returns the subscriptYOffset.
+ */
+ public short getSubscriptYOffset()
+ {
+ return subscriptYOffset;
+ }
+ /**
+ * @param subscriptYOffsetValue The subscriptYOffset to set.
+ */
+ public void setSubscriptYOffset(short subscriptYOffsetValue)
+ {
+ this.subscriptYOffset = subscriptYOffsetValue;
+ }
+ /**
+ * @return Returns the subscriptYSize.
+ */
+ public short getSubscriptYSize()
+ {
+ return subscriptYSize;
+ }
+ /**
+ * @param subscriptYSizeValue The subscriptYSize to set.
+ */
+ public void setSubscriptYSize(short subscriptYSizeValue)
+ {
+ this.subscriptYSize = subscriptYSizeValue;
+ }
+ /**
+ * @return Returns the superscriptXOffset.
+ */
+ public short getSuperscriptXOffset()
+ {
+ return superscriptXOffset;
+ }
+ /**
+ * @param superscriptXOffsetValue The superscriptXOffset to set.
+ */
+ public void setSuperscriptXOffset(short superscriptXOffsetValue)
+ {
+ this.superscriptXOffset = superscriptXOffsetValue;
+ }
+ /**
+ * @return Returns the superscriptXSize.
+ */
+ public short getSuperscriptXSize()
+ {
+ return superscriptXSize;
+ }
+ /**
+ * @param superscriptXSizeValue The superscriptXSize to set.
+ */
+ public void setSuperscriptXSize(short superscriptXSizeValue)
+ {
+ this.superscriptXSize = superscriptXSizeValue;
+ }
+ /**
+ * @return Returns the superscriptYOffset.
+ */
+ public short getSuperscriptYOffset()
+ {
+ return superscriptYOffset;
+ }
+ /**
+ * @param superscriptYOffsetValue The superscriptYOffset to set.
+ */
+ public void setSuperscriptYOffset(short superscriptYOffsetValue)
+ {
+ this.superscriptYOffset = superscriptYOffsetValue;
+ }
+ /**
+ * @return Returns the superscriptYSize.
+ */
+ public short getSuperscriptYSize()
+ {
+ return superscriptYSize;
+ }
+ /**
+ * @param superscriptYSizeValue The superscriptYSize to set.
+ */
+ public void setSuperscriptYSize(short superscriptYSizeValue)
+ {
+ this.superscriptYSize = superscriptYSizeValue;
+ }
+ /**
+ * @return Returns the typeLineGap.
+ */
+ public int getTypeLineGap()
+ {
+ return typeLineGap;
+ }
+ /**
+ * @param typeLineGapValue The typeLineGap to set.
+ */
+ public void setTypeLineGap(int typeLineGapValue)
+ {
+ this.typeLineGap = typeLineGapValue;
+ }
+ /**
+ * @return Returns the typoAscender.
+ */
+ public int getTypoAscender()
+ {
+ return typoAscender;
+ }
+ /**
+ * @param typoAscenderValue The typoAscender to set.
+ */
+ public void setTypoAscender(int typoAscenderValue)
+ {
+ this.typoAscender = typoAscenderValue;
+ }
+ /**
+ * @return Returns the typoDescender.
+ */
+ public int getTypoDescender()
+ {
+ return typoDescender;
+ }
+ /**
+ * @param typoDescenderValue The typoDescender to set.
+ */
+ public void setTypoDescender(int typoDescenderValue)
+ {
+ this.typoDescender = typoDescenderValue;
+ }
+ /**
+ * @return Returns the unicodeRange1.
+ */
+ public long getUnicodeRange1()
+ {
+ return unicodeRange1;
+ }
+ /**
+ * @param unicodeRange1Value The unicodeRange1 to set.
+ */
+ public void setUnicodeRange1(long unicodeRange1Value)
+ {
+ this.unicodeRange1 = unicodeRange1Value;
+ }
+ /**
+ * @return Returns the unicodeRange2.
+ */
+ public long getUnicodeRange2()
+ {
+ return unicodeRange2;
+ }
+ /**
+ * @param unicodeRange2Value The unicodeRange2 to set.
+ */
+ public void setUnicodeRange2(long unicodeRange2Value)
+ {
+ this.unicodeRange2 = unicodeRange2Value;
+ }
+ /**
+ * @return Returns the unicodeRange3.
+ */
+ public long getUnicodeRange3()
+ {
+ return unicodeRange3;
+ }
+ /**
+ * @param unicodeRange3Value The unicodeRange3 to set.
+ */
+ public void setUnicodeRange3(long unicodeRange3Value)
+ {
+ this.unicodeRange3 = unicodeRange3Value;
+ }
+ /**
+ * @return Returns the unicodeRange4.
+ */
+ public long getUnicodeRange4()
+ {
+ return unicodeRange4;
+ }
+ /**
+ * @param unicodeRange4Value The unicodeRange4 to set.
+ */
+ public void setUnicodeRange4(long unicodeRange4Value)
+ {
+ this.unicodeRange4 = unicodeRange4Value;
+ }
+ /**
+ * @return Returns the version.
+ */
+ public int getVersion()
+ {
+ return version;
+ }
+ /**
+ * @param versionValue The version to set.
+ */
+ public void setVersion(int versionValue)
+ {
+ this.version = versionValue;
+ }
+ /**
+ * @return Returns the weightClass.
+ */
+ public int getWeightClass()
+ {
+ return weightClass;
+ }
+ /**
+ * @param weightClassValue The weightClass to set.
+ */
+ public void setWeightClass(int weightClassValue)
+ {
+ this.weightClass = weightClassValue;
+ }
+ /**
+ * @return Returns the widthClass.
+ */
+ public int getWidthClass()
+ {
+ return widthClass;
+ }
+ /**
+ * @param widthClassValue The widthClass to set.
+ */
+ public void setWidthClass(int widthClassValue)
+ {
+ this.widthClass = widthClassValue;
+ }
+ /**
+ * @return Returns the winAscent.
+ */
+ public int getWinAscent()
+ {
+ return winAscent;
+ }
+ /**
+ * @param winAscentValue The winAscent to set.
+ */
+ public void setWinAscent(int winAscentValue)
+ {
+ this.winAscent = winAscentValue;
+ }
+ /**
+ * @return Returns the winDescent.
+ */
+ public int getWinDescent()
+ {
+ return winDescent;
+ }
+ /**
+ * @param winDescentValue The winDescent to set.
+ */
+ public void setWinDescent(int winDescentValue)
+ {
+ this.winDescent = winDescentValue;
+ }
+ private int version;
+ private short averageCharWidth;
+ private int weightClass;
+ private int widthClass;
+ private short fsType;
+ private short subscriptXSize;
+ private short subscriptYSize;
+ private short subscriptXOffset;
+ private short subscriptYOffset;
+ private short superscriptXSize;
+ private short superscriptYSize;
+ private short superscriptXOffset;
+ private short superscriptYOffset;
+ private short strikeoutSize;
+ private short strikeoutPosition;
+ private short familyClass;
+ private byte[] panose = new byte[10];
+ private long unicodeRange1;
+ private long unicodeRange2;
+ private long unicodeRange3;
+ private long unicodeRange4;
+ private String achVendId;
+ private int fsSelection;
+ private int firstCharIndex;
+ private int lastCharIndex;
+ private int typoAscender;
+ private int typoDescender;
+ private int typeLineGap;
+ private int winAscent;
+ private int winDescent;
+ private long codePageRange1 = -1;
+ private long codePageRange2 = -1;
+
+ /**
+ * A tag that identifies this table type.
+ */
+ public static final String TAG = "OS/2";
+
+ /**
+ * This will read the required data from the stream.
+ *
+ * @param ttf The font that is being read.
+ * @param data The stream to read the data from.
+ * @throws IOException If there is an error reading the data.
+ */
+ public void initData( TrueTypeFont ttf, TTFDataStream data ) throws IOException
+ {
+ version = data.readUnsignedShort();
+ averageCharWidth = data.readSignedShort();
+ weightClass = data.readUnsignedShort();
+ widthClass = data.readUnsignedShort();
+ fsType = data.readSignedShort();
+ subscriptXSize = data.readSignedShort();
+ subscriptYSize = data.readSignedShort();
+ subscriptXOffset = data.readSignedShort();
+ subscriptYOffset = data.readSignedShort();
+ superscriptXSize = data.readSignedShort();
+ superscriptYSize = data.readSignedShort();
+ superscriptXOffset = data.readSignedShort();
+ superscriptYOffset = data.readSignedShort();
+ strikeoutSize = data.readSignedShort();
+ strikeoutPosition = data.readSignedShort();
+ familyClass = data.readSignedShort();
+ panose = data.read( 10 );
+ unicodeRange1 = data.readUnsignedInt();
+ unicodeRange2 = data.readUnsignedInt();
+ unicodeRange3 = data.readUnsignedInt();
+ unicodeRange4 = data.readUnsignedInt();
+ achVendId = data.readString( 4 );
+ fsSelection = data.readUnsignedShort();
+ firstCharIndex = data.readUnsignedShort();
+ lastCharIndex = data.readUnsignedShort();
+ typoAscender = data.readSignedShort();
+ typoDescender = data.readSignedShort();
+ typeLineGap = data.readSignedShort();
+ winAscent = data.readUnsignedShort();
+ winDescent = data.readUnsignedShort();
+ if( version >= 1 )
+ {
+ codePageRange1 = data.readUnsignedInt();
+ codePageRange2 = data.readUnsignedInt();
+ }
+ }
+}
diff --git a/src/main/java/org/pdfbox/ttf/PostScriptTable.java b/src/main/java/org/pdfbox/ttf/PostScriptTable.java
new file mode 100644
index 0000000..e7b7822
--- /dev/null
+++ b/src/main/java/org/pdfbox/ttf/PostScriptTable.java
@@ -0,0 +1,304 @@
+/**
+ * Copyright (c) 2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.ttf;
+
+import java.io.IOException;
+
+import org.pdfbox.cos.COSName;
+
+import org.pdfbox.encoding.MacRomanEncoding;
+
+/**
+ * A table in a true type font.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.1 $
+ */
+public class PostScriptTable extends TTFTable
+{
+ private float formatType;
+ private float italicAngle;
+ private short underlinePosition;
+ private short underlineThickness;
+ private long isFixedPitch;
+ private long minMemType42;
+ private long maxMemType42;
+ private long mimMemType1;
+ private long maxMemType1;
+ private String[] glyphNames = null;
+
+ /**
+ * A tag that identifies this table type.
+ */
+ public static final String TAG = "post";
+
+ /**
+ * This will read the required data from the stream.
+ *
+ * @param ttf The font that is being read.
+ * @param data The stream to read the data from.
+ * @throws IOException If there is an error reading the data.
+ */
+ public void initData( TrueTypeFont ttf, TTFDataStream data ) throws IOException
+ {
+ MaximumProfileTable maxp = ttf.getMaximumProfile();
+ formatType = data.read32Fixed();
+ italicAngle = data.read32Fixed();
+ underlinePosition = data.readSignedShort();
+ underlineThickness = data.readSignedShort();
+ isFixedPitch = data.readUnsignedInt();
+ minMemType42 = data.readUnsignedInt();
+ maxMemType42 = data.readUnsignedInt();
+ mimMemType1 = data.readUnsignedInt();
+ maxMemType1 = data.readUnsignedInt();
+ MacRomanEncoding encoding = new MacRomanEncoding();
+
+
+ if( formatType == 1.0f )
+ {
+ /*
+ * This TrueType font file contains exactly the 258 glyphs in the standard
+ * Macintosh TrueType.
+ */
+ glyphNames = new String[258];
+ for( int i=0; i<glyphNames.length; i++)
+ {
+ COSName name = encoding.getName( i );
+ if( name != null )
+ {
+ glyphNames[i] = name.getName();
+ }
+ }
+ }
+ else if( formatType == 2.0f )
+ {
+ int numGlyphs = data.readUnsignedShort();
+ int[] glyphNameIndex = new int[numGlyphs];
+ glyphNames = new String[ numGlyphs ];
+ int maxIndex = Integer.MIN_VALUE;
+ for( int i=0; i<numGlyphs; i++ )
+ {
+ int index = data.readUnsignedShort();
+ glyphNameIndex[i] = index;
+ maxIndex = Math.max( maxIndex, index );
+ }
+ String[] nameArray = null;
+ if( maxIndex >= 258 )
+ {
+ nameArray = new String[ maxIndex-258 +1 ];
+ for( int i=0; i<maxIndex-258+1; i++ )
+ {
+ int numberOfChars = data.read();
+ nameArray[i]=data.readString( numberOfChars );
+ }
+ }
+ for( int i=0; i<numGlyphs; i++ )
+ {
+ int index = glyphNameIndex[i];
+ if( index < 258 )
+ {
+ glyphNames[i] = encoding.getName( index ).getName();
+ }
+ else if( index >= 258 && index <= 32767 )
+ {
+ glyphNames[i] = nameArray[index-258];
+ }
+ else
+ {
+ throw new IOException( "Unknown glyph name index:" + index );
+ }
+ }
+ }
+ else if( formatType == 2.5f )
+ {
+ int[] glyphNameIndex = new int[maxp.getNumGlyphs()];
+ for( int i=0; i<glyphNameIndex.length; i++)
+ {
+ int offset = data.readSignedByte();
+ glyphNameIndex[i] = i+1+offset;
+ }
+ glyphNames = new String[glyphNameIndex.length];
+ for( int i=0; i<glyphNames.length; i++)
+ {
+ COSName name = encoding.getName( glyphNameIndex[i] );
+ if( name != null )
+ {
+ glyphNames[i] = name.getName();
+ }
+ }
+
+ }
+ else if( formatType == 3.0f )
+ {
+ //no postscript information is provided.
+ }
+ }
+ /**
+ * @return Returns the formatType.
+ */
+ public float getFormatType()
+ {
+ return formatType;
+ }
+ /**
+ * @param formatTypeValue The formatType to set.
+ */
+ public void setFormatType(float formatTypeValue)
+ {
+ this.formatType = formatTypeValue;
+ }
+ /**
+ * @return Returns the isFixedPitch.
+ */
+ public long getIsFixedPitch()
+ {
+ return isFixedPitch;
+ }
+ /**
+ * @param isFixedPitchValue The isFixedPitch to set.
+ */
+ public void setIsFixedPitch(long isFixedPitchValue)
+ {
+ this.isFixedPitch = isFixedPitchValue;
+ }
+ /**
+ * @return Returns the italicAngle.
+ */
+ public float getItalicAngle()
+ {
+ return italicAngle;
+ }
+ /**
+ * @param italicAngleValue The italicAngle to set.
+ */
+ public void setItalicAngle(float italicAngleValue)
+ {
+ this.italicAngle = italicAngleValue;
+ }
+ /**
+ * @return Returns the maxMemType1.
+ */
+ public long getMaxMemType1()
+ {
+ return maxMemType1;
+ }
+ /**
+ * @param maxMemType1Value The maxMemType1 to set.
+ */
+ public void setMaxMemType1(long maxMemType1Value)
+ {
+ this.maxMemType1 = maxMemType1Value;
+ }
+ /**
+ * @return Returns the maxMemType42.
+ */
+ public long getMaxMemType42()
+ {
+ return maxMemType42;
+ }
+ /**
+ * @param maxMemType42Value The maxMemType42 to set.
+ */
+ public void setMaxMemType42(long maxMemType42Value)
+ {
+ this.maxMemType42 = maxMemType42Value;
+ }
+ /**
+ * @return Returns the mimMemType1.
+ */
+ public long getMimMemType1()
+ {
+ return mimMemType1;
+ }
+ /**
+ * @param mimMemType1Value The mimMemType1 to set.
+ */
+ public void setMimMemType1(long mimMemType1Value)
+ {
+ this.mimMemType1 = mimMemType1Value;
+ }
+ /**
+ * @return Returns the minMemType42.
+ */
+ public long getMinMemType42()
+ {
+ return minMemType42;
+ }
+ /**
+ * @param minMemType42Value The minMemType42 to set.
+ */
+ public void setMinMemType42(long minMemType42Value)
+ {
+ this.minMemType42 = minMemType42Value;
+ }
+ /**
+ * @return Returns the underlinePosition.
+ */
+ public short getUnderlinePosition()
+ {
+ return underlinePosition;
+ }
+ /**
+ * @param underlinePositionValue The underlinePosition to set.
+ */
+ public void setUnderlinePosition(short underlinePositionValue)
+ {
+ this.underlinePosition = underlinePositionValue;
+ }
+ /**
+ * @return Returns the underlineThickness.
+ */
+ public short getUnderlineThickness()
+ {
+ return underlineThickness;
+ }
+ /**
+ * @param underlineThicknessValue The underlineThickness to set.
+ */
+ public void setUnderlineThickness(short underlineThicknessValue)
+ {
+ this.underlineThickness = underlineThicknessValue;
+ }
+ /**
+ * @return Returns the glyphNames.
+ */
+ public String[] getGlyphNames()
+ {
+ return glyphNames;
+ }
+ /**
+ * @param glyphNamesValue The glyphNames to set.
+ */
+ public void setGlyphNames(String[] glyphNamesValue)
+ {
+ this.glyphNames = glyphNamesValue;
+ }
+}
diff --git a/src/main/java/org/pdfbox/ttf/RAFDataStream.java b/src/main/java/org/pdfbox/ttf/RAFDataStream.java
new file mode 100644
index 0000000..14ebfd9
--- /dev/null
+++ b/src/main/java/org/pdfbox/ttf/RAFDataStream.java
@@ -0,0 +1,193 @@
+/**
+ * Copyright (c) 2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.ttf;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.RandomAccessFile;
+
+import org.pdfbox.cos.COSStream;
+import org.pdfbox.pdmodel.common.PDStream;
+
+/**
+ * An implementation of the TTFDataStream that goes against a RAF.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.4 $
+ */
+public class RAFDataStream extends TTFDataStream
+{
+ private RandomAccessFile raf = null;
+ /**
+ * Constructor.
+ *
+ * @param name The raf file.
+ * @param mode The mode to open the RAF.
+ *
+ * @throws FileNotFoundException If there is a problem creating the RAF.
+ *
+ * @see RandomAccessFile#RandomAccessFile( String, String )
+ */
+ public RAFDataStream(String name, String mode) throws FileNotFoundException
+ {
+ raf = new RandomAccessFile( name, mode );
+ }
+
+ /**
+ * Constructor.
+ *
+ * @param file The raf file.
+ * @param mode The mode to open the RAF.
+ *
+ * @throws FileNotFoundException If there is a problem creating the RAF.
+ *
+ * @see RandomAccessFile#RandomAccessFile( File, String )
+ */
+ public RAFDataStream(File file, String mode) throws FileNotFoundException
+ {
+ raf = new RandomAccessFile( file, mode );
+ }
+
+ /**
+ * Read an signed short.
+ *
+ * @return An signed short.
+ * @throws IOException If there is an error reading the data.
+ */
+ public short readSignedShort() throws IOException
+ {
+ return raf.readShort();
+ }
+
+ /**
+ * Get the current position in the stream.
+ * @return The current position in the stream.
+ * @throws IOException If an error occurs while reading the stream.
+ */
+ public long getCurrentPosition() throws IOException
+ {
+ return raf.getFilePointer();
+ }
+
+ /**
+ * Get a COSStream from this TTFDataStream
+ * This permit to pass the data read from an
+ * external source to the COSObjects to keep
+ * a certain persistence layer between specialized
+ * objects like the TTF package and the pdmodel package.
+ *
+ * Created by Pascal Allain
+ * Vertical7 Inc.
+ *
+ * @return COSStream describing this stream (unfiletred)
+ */
+ public PDStream getPDStream()
+ {
+ COSStream retval = null;
+
+ retval = new COSStream(raf);
+
+ return new PDStream( retval );
+ }
+
+ /**
+ * Close the underlying resources.
+ *
+ * @throws IOException If there is an error closing the resources.
+ */
+ public void close() throws IOException
+ {
+ raf.close();
+ raf = null;
+ }
+
+ /**
+ * Read an unsigned byte.
+ * @return An unsigned byte.
+ * @throws IOException If there is an error reading the data.
+ */
+ public int read() throws IOException
+ {
+ return raf.read();
+ }
+
+ /**
+ * Read an unsigned short.
+ *
+ * @return An unsigned short.
+ * @throws IOException If there is an error reading the data.
+ */
+ public int readUnsignedShort() throws IOException
+ {
+ return raf.readUnsignedShort();
+ }
+
+ /**
+ * Read an unsigned byte.
+ * @return An unsigned byte.
+ * @throws IOException If there is an error reading the data.
+ */
+ public long readLong() throws IOException
+ {
+ return raf.readLong();
+ }
+
+ /**
+ * Seek into the datasource.
+ *
+ * @param pos The position to seek to.
+ * @throws IOException If there is an error seeking to that position.
+ */
+ public void seek(long pos) throws IOException
+ {
+ raf.seek( pos );
+ }
+
+ /**
+ * @see java.io.InputStream#read( byte[], int, int )
+ *
+ * @param b The buffer to write to.
+ * @param off The offset into the buffer.
+ * @param len The length into the buffer.
+ *
+ * @return The number of bytes read.
+ *
+ * @throws IOException If there is an error reading from the stream.
+ */
+ public int read(byte[] b,
+ int off,
+ int len)
+ throws IOException
+ {
+ return raf.read(b,off,len);
+ }
+}
diff --git a/src/main/java/org/pdfbox/ttf/TTFDataStream.java b/src/main/java/org/pdfbox/ttf/TTFDataStream.java
new file mode 100644
index 0000000..c4cf19d
--- /dev/null
+++ b/src/main/java/org/pdfbox/ttf/TTFDataStream.java
@@ -0,0 +1,253 @@
+/**
+ * Copyright (c) 2004-2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.ttf;
+
+import java.io.EOFException;
+import java.io.IOException;
+
+import java.util.Calendar;
+import java.util.GregorianCalendar;
+
+import org.pdfbox.pdmodel.common.PDStream;
+
+/**
+ * An interface into a data stream.
+ *
+ * @author Ben Litchfield (ben@benlitchfield.com)
+ * @version $Revision: 1.5 $
+ */
+public abstract class TTFDataStream
+{
+
+ /**
+ * Read a 16.16 fixed value, where the first 16 bits are the decimal and the last
+ * 16 bits are the fraction.
+ * @return A 32 bit value.
+ * @throws IOException If there is an error reading the data.
+ */
+ public float read32Fixed() throws IOException
+ {
+ float retval = 0;
+ retval = readSignedShort();
+ retval += (readUnsignedShort()/65536);
+ return retval;
+ }
+
+ /**
+ * Read a fixed length ascii string.
+ * @param length The length of the string to read.
+ * @return A string of the desired length.
+ * @throws IOException If there is an error reading the data.
+ */
+ public String readString( int length ) throws IOException
+ {
+ return readString( length, "ISO-8859-1" );
+ }
+
+ /**
+ * Read a fixed length ascii string.
+ * @param length The length of the string to read in bytes.
+ * @param charset The expected character set of the string.
+ * @return A string of the desired length.
+ * @throws IOException If there is an error reading the data.
+ */
+ public String readString( int length, String charset ) throws IOException
+ {
+ byte[] buffer = read( length );
+ return new String(buffer, charset);
+ }
+
+ /**
+ * Read an unsigned byte.
+ * @return An unsigned byte.
+ * @throws IOException If there is an error reading the data.
+ */
+ public abstract int read() throws IOException;
+
+ /**
+ * Read an unsigned byte.
+ * @return An unsigned byte.
+ * @throws IOException If there is an error reading the data.
+ */
+ public abstract long readLong() throws IOException;
+
+
+ /**
+ * Read a signed byte.
+ * @return A signed byte.
+ * @throws IOException If there is an error reading the data.
+ */
+ public int readSignedByte() throws IOException
+ {
+ int signedByte = read();
+ return signedByte < 127 ? signedByte : signedByte-256;
+ }
+
+ /**
+ * Read an unsigned integer.
+ * @return An unsiged integer.
+ * @throws IOException If there is an error reading the data.
+ */
+ public long readUnsignedInt() throws IOException
+ {
+ long byte1 = read();
+ long byte2 = read();
+ long byte3 = read();
+ long byte4 = read();
+ if( byte4 < 0 )
+ {
+ throw new EOFException();
+ }
+ return (byte1 << 24) + (byte2 << 16) + (byte3 << 8) + (byte4 << 0);
+ }
+
+ /**
+ * Read an unsigned short.
+ *
+ * @return An unsigned short.
+ * @throws IOException If there is an error reading the data.
+ */
+ public abstract int readUnsignedShort() throws IOException;
+
+ /**
+ * Read an unsigned short array.
+ *
+ * @param length The length of the array to read.
+ * @return An unsigned short array.
+ * @throws IOException If there is an error reading the data.
+ */
+ public int[] readUnsignedShortArray( int length ) throws IOException
+ {
+ int[] array = new int[ length ];
+ for( int i=0; i<length; i++ )
+ {
+ array[i] = readUnsignedShort();
+ }
+ return array;
+ }
+
+ /**
+ * Read an signed short.
+ *
+ * @return An signed short.
+ * @throws IOException If there is an error reading the data.
+ */
+ public abstract short readSignedShort() throws IOException;
+
+ /**
+ * Read an eight byte international date.
+ *
+ * @return An signed short.
+ * @throws IOException If there is an error reading the data.
+ */
+ public Calendar readInternationalDate() throws IOException
+ {
+ long secondsSince1904 = readLong();
+ GregorianCalendar cal = new GregorianCalendar( 1904, 0, 1 );
+ long millisFor1904 = cal.getTimeInMillis();
+ millisFor1904 += (secondsSince1904*1000);
+ cal.setTimeInMillis( millisFor1904 );
+ return cal;
+ }
+
+ /**
+ * Close the underlying resources.
+ *
+ * @throws IOException If there is an error closing the resources.
+ */
+ public abstract void close() throws IOException;
+
+ /**
+ * Seek into the datasource.
+ *
+ * @param pos The position to seek to.
+ * @throws IOException If there is an error seeking to that position.
+ */
+ public abstract void seek(long pos) throws IOException;
+
+ /**
+ * Read a specific number of bytes from the stream.
+ * @param numberOfBytes The number of bytes to read.
+ * @return The byte buffer.
+ * @throws IOException If there is an error while reading.
+ */
+ public byte[] read( int numberOfBytes ) throws IOException
+ {
+ byte[] data = new byte[ numberOfBytes ];
+ int amountRead = 0;
+ int totalAmountRead = 0;
+ while( (amountRead = read( data, totalAmountRead, numberOfBytes-totalAmountRead ) ) != -1 &&
+ totalAmountRead < numberOfBytes )
+ {
+ totalAmountRead += amountRead;
+ //read at most numberOfBytes bytes from the stream.
+ }
+ return data;
+ }
+
+ /**
+ * @see java.io.InputStream#read( byte[], int, int )
+ *
+ * @param b The buffer to write to.
+ * @param off The offset into the buffer.
+ * @param len The length into the buffer.
+ *
+ * @return The number of bytes read.
+ *
+ * @throws IOException If there is an error reading from the stream.
+ */
+ public abstract int read(byte[] b,
+ int off,
+ int len)
+ throws IOException;
+
+ /**
+ * Get the current position in the stream.
+ * @return The current position in the stream.
+ * @throws IOException If an error occurs while reading the stream.
+ */
+ public abstract long getCurrentPosition() throws IOException;
+
+ /**
+ * Get a COSStream from this TTFDataStream
+ * This permit to pass the data read from an
+ * external source to the COSObjects to keep
+ * a certain persistence layer between specialized
+ * objects like the TTF package and the pdmodel package.
+ *
+ * Created by Pascal Allain
+ * Vertical7 Inc.
+ *
+ * @return COSStream describing this stream
+ */
+ public abstract PDStream getPDStream();
+
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/ttf/TTFParser.java b/src/main/java/org/pdfbox/ttf/TTFParser.java
new file mode 100644
index 0000000..903badb
--- /dev/null
+++ b/src/main/java/org/pdfbox/ttf/TTFParser.java
@@ -0,0 +1,219 @@
+/**
+ * Copyright (c) 2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.ttf;
+
+import java.io.File;
+import java.io.IOException;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * A true type font file parser.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.3 $
+ */
+public class TTFParser
+{
+ /**
+ * A simple command line program to test parsing of a TTF file. <br/>
+ * usage: java org.pdfbox.ttf.TTFParser &lt;ttf-file&gt;
+ *
+ * @param args The command line arguments.
+ *
+ * @throws IOException If there is an error while parsing the font file.
+ */
+ public static void main( String[] args ) throws IOException
+ {
+ if( args.length != 1 )
+ {
+ System.err.println( "usage: java org.pdfbox.ttf.TTFParser <ttf-file>" );
+ System.exit( -1 );
+ }
+ TTFParser parser = new TTFParser();
+ TrueTypeFont font = parser.parseTTF( args[0] );
+ System.out.println( "Font:" + font );
+ }
+
+ /**
+ * Parse a file and get a true type font.
+ * @param ttfFile The TTF file.
+ * @return A true type font.
+ * @throws IOException If there is an error parsing the true type font.
+ */
+ public TrueTypeFont parseTTF( String ttfFile ) throws IOException
+ {
+ RAFDataStream raf = new RAFDataStream( ttfFile, "r" );
+ return parseTTF( raf );
+ }
+
+ /**
+ * Parse a file and get a true type font.
+ * @param ttfFile The TTF file.
+ * @return A true type font.
+ * @throws IOException If there is an error parsing the true type font.
+ */
+ public TrueTypeFont parseTTF( File ttfFile ) throws IOException
+ {
+ RAFDataStream raf = new RAFDataStream( ttfFile, "r" );
+ return parseTTF( raf );
+ }
+
+ /**
+ * Parse a file and get a true type font.
+ * @param raf The TTF file.
+ * @return A true type font.
+ * @throws IOException If there is an error parsing the true type font.
+ */
+ public TrueTypeFont parseTTF( TTFDataStream raf ) throws IOException
+ {
+ TrueTypeFont font = new TrueTypeFont( raf );
+ font.setVersion( raf.read32Fixed() );
+ int numberOfTables = raf.readUnsignedShort();
+ int searchRange = raf.readUnsignedShort();
+ int entrySelector = raf.readUnsignedShort();
+ int rangeShift = raf.readUnsignedShort();
+ for( int i=0; i<numberOfTables; i++ )
+ {
+ TTFTable table = readTableDirectory( raf );
+ font.addTable( table );
+ }
+ List initialized = new ArrayList();
+ //need to initialize a couple tables in a certain order
+ HeaderTable head = font.getHeader();
+ raf.seek( head.getOffset() );
+ head.initData( font, raf );
+ initialized.add( head );
+
+
+ HorizontalHeaderTable hh = font.getHorizontalHeader();
+ raf.seek( hh.getOffset() );
+ hh.initData( font, raf );
+ initialized.add( hh );
+
+ MaximumProfileTable maxp = font.getMaximumProfile();
+ raf.seek( maxp.getOffset() );
+ maxp.initData( font, raf );
+ initialized.add( maxp );
+
+ PostScriptTable post = font.getPostScript();
+ raf.seek( post.getOffset() );
+ post.initData( font, raf );
+ initialized.add( post );
+
+ IndexToLocationTable loc = font.getIndexToLocation();
+ raf.seek( loc.getOffset() );
+ loc.initData( font, raf );
+ initialized.add( loc );
+
+ Iterator iter = font.getTables().iterator();
+ while( iter.hasNext() )
+ {
+ TTFTable table = (TTFTable)iter.next();
+ if( !initialized.contains( table ) )
+ {
+ raf.seek( table.getOffset() );
+ table.initData( font, raf );
+ }
+ }
+ return font;
+ }
+
+ private TTFTable readTableDirectory( TTFDataStream raf ) throws IOException
+ {
+ TTFTable retval = null;
+ String tag = raf.readString( 4 );
+ if( tag.equals( CMAPTable.TAG ) )
+ {
+ retval = new CMAPTable();
+ }
+ else if( tag.equals( GlyphTable.TAG ) )
+ {
+ retval = new GlyphTable();
+ }
+ else if( tag.equals( HeaderTable.TAG ) )
+ {
+ retval = new HeaderTable();
+ }
+ else if( tag.equals( HorizontalHeaderTable.TAG ) )
+ {
+ retval = new HorizontalHeaderTable();
+ }
+ else if( tag.equals( HorizontalMetricsTable.TAG ) )
+ {
+ retval = new HorizontalMetricsTable();
+ }
+ else if( tag.equals( IndexToLocationTable.TAG ) )
+ {
+ retval = new IndexToLocationTable();
+ }
+ else if( tag.equals( MaximumProfileTable.TAG ) )
+ {
+ retval = new MaximumProfileTable();
+ }
+ else if( tag.equals( NamingTable.TAG ) )
+ {
+ retval = new NamingTable();
+ }
+ else if( tag.equals( OS2WindowsMetricsTable.TAG ) )
+ {
+ retval = new OS2WindowsMetricsTable();
+ }
+ else if( tag.equals( PostScriptTable.TAG ) )
+ {
+ retval = new PostScriptTable();
+ }
+ else if( tag.equals( GlyphTable.TAG ) )
+ {
+ retval = new GlyphTable();
+ }
+ else if( tag.equals( GlyphTable.TAG ) )
+ {
+ retval = new GlyphTable();
+ }
+ else if( tag.equals( DigitalSignatureTable.TAG ) )
+ {
+ retval = new DigitalSignatureTable();
+ }
+ else
+ {
+ //unknown table type but read it anyway.
+ retval = new TTFTable();
+ }
+ retval.setTag( tag );
+ retval.setCheckSum( raf.readUnsignedInt() );
+ retval.setOffset( raf.readUnsignedInt() );
+ retval.setLength( raf.readUnsignedInt() );
+ return retval;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/ttf/TTFTable.java b/src/main/java/org/pdfbox/ttf/TTFTable.java
new file mode 100644
index 0000000..fdc03ea
--- /dev/null
+++ b/src/main/java/org/pdfbox/ttf/TTFTable.java
@@ -0,0 +1,115 @@
+/**
+ * Copyright (c) 2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.ttf;
+
+import java.io.IOException;
+
+/**
+ * A table in a true type font.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.1 $
+ */
+public class TTFTable
+{
+ private String tag;
+ private long checkSum;
+ private long offset;
+ private long length;
+
+ /**
+ * @return Returns the checkSum.
+ */
+ public long getCheckSum()
+ {
+ return checkSum;
+ }
+ /**
+ * @param checkSumValue The checkSum to set.
+ */
+ public void setCheckSum(long checkSumValue)
+ {
+ this.checkSum = checkSumValue;
+ }
+ /**
+ * @return Returns the length.
+ */
+ public long getLength()
+ {
+ return length;
+ }
+ /**
+ * @param lengthValue The length to set.
+ */
+ public void setLength(long lengthValue)
+ {
+ this.length = lengthValue;
+ }
+ /**
+ * @return Returns the offset.
+ */
+ public long getOffset()
+ {
+ return offset;
+ }
+ /**
+ * @param offsetValue The offset to set.
+ */
+ public void setOffset(long offsetValue)
+ {
+ this.offset = offsetValue;
+ }
+ /**
+ * @return Returns the tag.
+ */
+ public String getTag()
+ {
+ return tag;
+ }
+ /**
+ * @param tagValue The tag to set.
+ */
+ public void setTag(String tagValue)
+ {
+ this.tag = tagValue;
+ }
+
+ /**
+ * This will read the required data from the stream.
+ *
+ * @param ttf The font that is being read.
+ * @param data The stream to read the data from.
+ * @throws IOException If there is an error reading the data.
+ */
+ public void initData( TrueTypeFont ttf, TTFDataStream data ) throws IOException
+ {
+ }
+}
diff --git a/src/main/java/org/pdfbox/ttf/TrueTypeFont.java b/src/main/java/org/pdfbox/ttf/TrueTypeFont.java
new file mode 100644
index 0000000..bbe6392
--- /dev/null
+++ b/src/main/java/org/pdfbox/ttf/TrueTypeFont.java
@@ -0,0 +1,221 @@
+/**
+ * Copyright (c) 2004-2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.ttf;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+
+import java.io.IOException;
+
+import org.pdfbox.pdmodel.common.PDStream;
+
+/**
+ * A class to hold true type font information.
+ *
+ * @author Ben Litchfield (ben@benlitchfield.com)
+ * @version $Revision: 1.4 $
+ */
+public class TrueTypeFont
+{
+ private float version;
+
+ private Map tables = new HashMap();
+
+ private TTFDataStream data;
+
+ /**
+ * Constructor. Clients should use the TTFParser to create a new TrueTypeFont object.
+ *
+ * @param fontData The font data.
+ */
+ TrueTypeFont( TTFDataStream fontData )
+ {
+ data = fontData;
+ }
+
+ /**
+ * Close the underlying resources.
+ *
+ * @throws IOException If there is an error closing the resources.
+ */
+ public void close() throws IOException
+ {
+ data.close();
+ }
+
+ /**
+ * @return Returns the version.
+ */
+ public float getVersion()
+ {
+ return version;
+ }
+ /**
+ * @param versionValue The version to set.
+ */
+ public void setVersion(float versionValue)
+ {
+ version = versionValue;
+ }
+
+ /**
+ * Add a table definition.
+ *
+ * @param table The table to add.
+ */
+ public void addTable( TTFTable table )
+ {
+ tables.put( table.getTag(), table );
+ }
+
+ /**
+ * Get all of the tables.
+ *
+ * @return All of the tables.
+ */
+ public Collection getTables()
+ {
+ return tables.values();
+ }
+
+ /**
+ * This will get the naming table for the true type font.
+ *
+ * @return The naming table.
+ */
+ public NamingTable getNaming()
+ {
+ return (NamingTable)tables.get( NamingTable.TAG );
+ }
+
+ /**
+ * Get the postscript table for this TTF.
+ *
+ * @return The postscript table.
+ */
+ public PostScriptTable getPostScript()
+ {
+ return (PostScriptTable)tables.get( PostScriptTable.TAG );
+ }
+
+ /**
+ * Get the OS/2 table for this TTF.
+ *
+ * @return The OS/2 table.
+ */
+ public OS2WindowsMetricsTable getOS2Windows()
+ {
+ return (OS2WindowsMetricsTable)tables.get( OS2WindowsMetricsTable.TAG );
+ }
+
+ /**
+ * Get the maxp table for this TTF.
+ *
+ * @return The maxp table.
+ */
+ public MaximumProfileTable getMaximumProfile()
+ {
+ return (MaximumProfileTable)tables.get( MaximumProfileTable.TAG );
+ }
+
+ /**
+ * Get the head table for this TTF.
+ *
+ * @return The head table.
+ */
+ public HeaderTable getHeader()
+ {
+ return (HeaderTable)tables.get( HeaderTable.TAG );
+ }
+
+ /**
+ * Get the hhea table for this TTF.
+ *
+ * @return The hhea table.
+ */
+ public HorizontalHeaderTable getHorizontalHeader()
+ {
+ return (HorizontalHeaderTable)tables.get( HorizontalHeaderTable.TAG );
+ }
+
+ /**
+ * Get the hmtx table for this TTF.
+ *
+ * @return The hmtx table.
+ */
+ public HorizontalMetricsTable getHorizontalMetrics()
+ {
+ return (HorizontalMetricsTable)tables.get( HorizontalMetricsTable.TAG );
+ }
+
+ /**
+ * Get the loca table for this TTF.
+ *
+ * @return The loca table.
+ */
+ public IndexToLocationTable getIndexToLocation()
+ {
+ return (IndexToLocationTable)tables.get( IndexToLocationTable.TAG );
+ }
+
+ /**
+ * Get the glyf table for this TTF.
+ *
+ * @return The glyf table.
+ */
+ public GlyphTable getGlyph()
+ {
+ return (GlyphTable)tables.get( GlyphTable.TAG );
+ }
+
+ /**
+ * Get the cmap table for this TTF.
+ *
+ * @return The cmap table.
+ */
+ public CMAPTable getCMAP()
+ {
+ return (CMAPTable)tables.get( CMAPTable.TAG );
+ }
+
+ /**
+ * This permit to get the COSStream of the True Type Font
+ * program representing the stream used to build this
+ * object (normally from the TTFParser object).
+ *
+ * @return COSStream True type font program stream
+ */
+ public PDStream getPDStream()
+ {
+ return data.getPDStream();
+ }
+}
diff --git a/src/main/java/org/pdfbox/ttf/package.html b/src/main/java/org/pdfbox/ttf/package.html
new file mode 100644
index 0000000..55d2af5
--- /dev/null
+++ b/src/main/java/org/pdfbox/ttf/package.html
@@ -0,0 +1,9 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head>
+
+</head>
+<body>
+This package contains classes to parse a TTF file.
+</body>
+</html>
diff --git a/src/main/java/org/pdfbox/util/BitFlagHelper.java b/src/main/java/org/pdfbox/util/BitFlagHelper.java
new file mode 100644
index 0000000..058f733
--- /dev/null
+++ b/src/main/java/org/pdfbox/util/BitFlagHelper.java
@@ -0,0 +1,85 @@
+/**
+ * Copyright (c) 2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.util;
+
+import org.pdfbox.cos.COSDictionary;
+
+/**
+ * This class will be used for bit flag operations.
+ *
+ * @author Ben Litchfield (ben@benlitchfield.com)
+ * @version $Revision: 1.2 $
+ */
+public class BitFlagHelper
+{
+ private BitFlagHelper()
+ {
+ //helper class should not be constructed
+ }
+
+ /**
+ * Sets the given boolean value at bitPos in the flags.
+ *
+ * @param dic The dictionary to set the value into.
+ * @param field The name of the field to set the value into.
+ * @param bitFlag the bit position to set the value in.
+ * @param value the value the bit position should have.
+ */
+ public static void setFlag( COSDictionary dic, String field, int bitFlag, boolean value )
+ {
+ int currentFlags = dic.getInt( field, 0 );
+ if( value )
+ {
+ currentFlags = currentFlags | bitFlag;
+ }
+ else
+ {
+ currentFlags = currentFlags &= ~bitFlag;
+ }
+ dic.setInt( field, currentFlags );
+ }
+
+ /**
+ * Gets the boolean value from the flags at the given bit
+ * position.
+ *
+ * @param dic The dictionary to get the field from.
+ * @param field The name of the field to get the flag from.
+ * @param bitFlag the bitPosition to get the value from.
+ *
+ * @return true if the number at bitPos is '1'
+ */
+ public static boolean getFlag(COSDictionary dic, String field, int bitFlag)
+ {
+ int ff = dic.getInt( field, 0 );
+ return (ff & bitFlag) == bitFlag;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/util/BoundingBox.java b/src/main/java/org/pdfbox/util/BoundingBox.java
new file mode 100644
index 0000000..aaea354
--- /dev/null
+++ b/src/main/java/org/pdfbox/util/BoundingBox.java
@@ -0,0 +1,188 @@
+/**
+ * Copyright (c) 2003, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.util;
+
+import java.awt.Point;
+
+/**
+ * This is an implementation of a bounding box. This was originally written for the
+ * AMF parser.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.6 $
+ */
+public class BoundingBox
+{
+ private float lowerLeftX;
+ private float lowerLeftY;
+ private float upperRightX;
+ private float upperRightY;
+
+ /**
+ * Getter for property lowerLeftX.
+ *
+ * @return Value of property lowerLeftX.
+ */
+ public float getLowerLeftX()
+ {
+ return lowerLeftX;
+ }
+
+ /**
+ * Setter for property lowerLeftX.
+ *
+ * @param lowerLeftXValue New value of property lowerLeftX.
+ */
+ public void setLowerLeftX(float lowerLeftXValue)
+ {
+ this.lowerLeftX = lowerLeftXValue;
+ }
+
+ /**
+ * Getter for property lowerLeftY.
+ *
+ * @return Value of property lowerLeftY.
+ */
+ public float getLowerLeftY()
+ {
+ return lowerLeftY;
+ }
+
+ /**
+ * Setter for property lowerLeftY.
+ *
+ * @param lowerLeftYValue New value of property lowerLeftY.
+ */
+ public void setLowerLeftY(float lowerLeftYValue)
+ {
+ this.lowerLeftY = lowerLeftYValue;
+ }
+
+ /**
+ * Getter for property upperRightX.
+ *
+ * @return Value of property upperRightX.
+ */
+ public float getUpperRightX()
+ {
+ return upperRightX;
+ }
+
+ /**
+ * Setter for property upperRightX.
+ *
+ * @param upperRightXValue New value of property upperRightX.
+ */
+ public void setUpperRightX(float upperRightXValue)
+ {
+ this.upperRightX = upperRightXValue;
+ }
+
+ /**
+ * Getter for property upperRightY.
+ *
+ * @return Value of property upperRightY.
+ */
+ public float getUpperRightY()
+ {
+ return upperRightY;
+ }
+
+ /**
+ * Setter for property upperRightY.
+ *
+ * @param upperRightYValue New value of property upperRightY.
+ */
+ public void setUpperRightY(float upperRightYValue)
+ {
+ this.upperRightY = upperRightYValue;
+ }
+
+ /**
+ * This will get the width of this rectangle as calculated by
+ * upperRightX - lowerLeftX.
+ *
+ * @return The width of this rectangle.
+ */
+ public float getWidth()
+ {
+ return getUpperRightX() - getLowerLeftX();
+ }
+
+ /**
+ * This will get the height of this rectangle as calculated by
+ * upperRightY - lowerLeftY.
+ *
+ * @return The height of this rectangle.
+ */
+ public float getHeight()
+ {
+ return getUpperRightY() - getLowerLeftY();
+ }
+
+ /**
+ * Checks if a point is inside this rectangle.
+ *
+ * @param x The x coordinate.
+ * @param y The y coordinate.
+ *
+ * @return true If the point is on the edge or inside the rectangle bounds.
+ */
+ public boolean contains( float x, float y )
+ {
+ return x >= lowerLeftX && x <= upperRightX &&
+ y >= lowerLeftY && y <= upperRightY;
+ }
+
+ /**
+ * Checks if a point is inside this rectangle.
+ *
+ * @param point The point to check
+ *
+ * @return true If the point is on the edge or inside the rectangle bounds.
+ */
+ public boolean contains( Point point )
+ {
+ return contains( (float)point.getX(), (float)point.getY() );
+ }
+
+ /**
+ * This will return a string representation of this rectangle.
+ *
+ * @return This object as a string.
+ */
+ public String toString()
+ {
+ return "[" + getLowerLeftX() + "," + getLowerLeftY() + "," +
+ getUpperRightX() + "," + getUpperRightY() +"]";
+ }
+
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/util/DateConverter.java b/src/main/java/org/pdfbox/util/DateConverter.java
new file mode 100644
index 0000000..43d3566
--- /dev/null
+++ b/src/main/java/org/pdfbox/util/DateConverter.java
@@ -0,0 +1,281 @@
+/**
+ * Copyright (c) 2003-2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.util;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+
+import java.io.IOException;
+
+import java.util.Calendar;
+import java.util.Date;
+import java.util.GregorianCalendar;
+import java.util.SimpleTimeZone;
+import java.util.TimeZone;
+
+import org.pdfbox.cos.COSString;
+
+/**
+ * This class is used to convert dates to strings and back using the PDF
+ * date standards. Date are described in PDFReference1.4 section 3.8.2
+ *
+ * @author Ben Litchfield (ben@benlitchfield.com)
+ * @version $Revision: 1.9 $
+ */
+public class DateConverter
+{
+ private static final SimpleDateFormat PDF_DATE_FORMAT = new SimpleDateFormat( "yyyyMMddHHmmss" );
+
+ //The Date format is supposed to be the PDF_DATE_FORMAT, but not all PDF documents
+ //will use that date, so I have added a couple other potential formats
+ //to try if the original one does not work.
+ private static final SimpleDateFormat[] POTENTIAL_FORMATS = new SimpleDateFormat[] {
+ new SimpleDateFormat("EEEE, dd MMM yyyy hh:mm:ss a"),
+ new SimpleDateFormat("EEEE, MMM dd, yyyy hh:mm:ss a")};
+
+ private static final SimpleDateFormat ISO_8601_DATE_FORMAT = new SimpleDateFormat( "yyyy-MM-dd'T'HH:mm:ss" );
+
+ private DateConverter()
+ {
+ //utility class should not be constructed.
+ }
+
+ /**
+ * This will convert the calendar to a string.
+ *
+ * @param date The date to convert to a string.
+ *
+ * @return The date as a String to be used in a PDF document.
+ */
+ public static String toString( Calendar date )
+ {
+ String retval = null;
+ if( date != null )
+ {
+ StringBuffer buffer = new StringBuffer();
+ TimeZone zone = date.getTimeZone();
+ long offsetInMinutes = zone.getOffset( date.getTimeInMillis() )/1000/60;
+ long hours = Math.abs( offsetInMinutes/60 );
+ long minutes = Math.abs( offsetInMinutes%60 );
+ buffer.append( "D:" );
+ buffer.append( PDF_DATE_FORMAT.format( date.getTime() ) );
+ if( offsetInMinutes == 0 )
+ {
+ buffer.append( "Z" );
+ }
+ else if( offsetInMinutes < 0 )
+ {
+ buffer.append( "-" );
+ }
+ else
+ {
+ buffer.append( "+" );
+ }
+ if( hours < 10 )
+ {
+ buffer.append( "0" );
+ }
+ buffer.append( hours );
+ buffer.append( "'" );
+ if( minutes < 10 )
+ {
+ buffer.append( "0" );
+ }
+ buffer.append( minutes );
+ buffer.append( "'" );
+ retval = buffer.toString();
+
+ }
+ return retval;
+ }
+
+ /**
+ * This will convert a string to a calendar.
+ *
+ * @param date The string representation of the calendar.
+ *
+ * @return The calendar that this string represents.
+ *
+ * @throws IOException If the date string is not in the correct format.
+ */
+ public static Calendar toCalendar( COSString date ) throws IOException
+ {
+ Calendar retval = null;
+ if( date != null )
+ {
+ retval = toCalendar( date.getString() );
+ }
+
+ return retval;
+ }
+
+ /**
+ * This will convert a string to a calendar.
+ *
+ * @param date The string representation of the calendar.
+ *
+ * @return The calendar that this string represents.
+ *
+ * @throws IOException If the date string is not in the correct format.
+ */
+ public static Calendar toCalendar( String date ) throws IOException
+ {
+ Calendar retval = null;
+ if( date != null )
+ {
+ //these are the default values
+ int year = 0;
+ int month = 1;
+ int day = 1;
+ int hour = 0;
+ int minute = 0;
+ int second = 0;
+ //first string off the prefix if it exists
+ try
+ {
+ SimpleTimeZone zone = null;
+ if( date.startsWith( "D:" ) )
+ {
+ date = date.substring( 2, date.length() );
+ }
+ if( date.length() < 4 )
+ {
+ throw new IOException( "Error: Invalid date format '" + date + "'" );
+ }
+ year = Integer.parseInt( date.substring( 0, 4 ) );
+ if( date.length() >= 6 )
+ {
+ month = Integer.parseInt( date.substring( 4, 6 ) );
+ }
+ if( date.length() >= 8 )
+ {
+ day = Integer.parseInt( date.substring( 6, 8 ) );
+ }
+ if( date.length() >= 10 )
+ {
+ hour = Integer.parseInt( date.substring( 8, 10 ) );
+ }
+ if( date.length() >= 12 )
+ {
+ minute = Integer.parseInt( date.substring( 10, 12 ) );
+ }
+ if( date.length() >= 14 )
+ {
+ second = Integer.parseInt( date.substring( 12, 14 ) );
+ }
+ retval = new GregorianCalendar( year, month-1, day, hour, minute, second );
+ if( date.length() >= 15 )
+ {
+ char sign = date.charAt( 14 );
+ if( sign == 'Z' )
+ {
+ zone = new SimpleTimeZone(0,"Unknown");
+ }
+ else
+ {
+ int hours = 0;
+ int minutes = 0;
+ if( date.length() >= 17 )
+ {
+ hours = Integer.parseInt( date.substring( 15, 17 ) );
+ }
+ if( date.length() > 20 )
+ {
+ minutes = Integer.parseInt( date.substring( 18, 20 ) );
+ }
+ zone = new SimpleTimeZone( hours*60*60*1000 + minutes*60*1000, "Unknown" );
+ }
+ retval.setTimeZone( zone );
+ }
+ }
+ catch( NumberFormatException e )
+ {
+ for( int i=0; retval == null && i<POTENTIAL_FORMATS.length; i++ )
+ {
+ try
+ {
+ Date utilDate = POTENTIAL_FORMATS[i].parse( date );
+ retval = new GregorianCalendar();
+ retval.setTime( utilDate );
+ }
+ catch( ParseException pe )
+ {
+ //ignore and move to next potential format
+ }
+ }
+ if( retval == null )
+ {
+ //we didn't find a valid date format so throw an exception
+ throw new IOException( "Error converting date:" + date );
+ }
+ }
+ }
+ return retval;
+ }
+
+ /**
+ * Convert the date to iso 8601 string format.
+ *
+ * @param cal The date to convert.
+ * @return The date represented as an ISO 8601 string.
+ */
+ public static String toISO8601( Calendar cal )
+ {
+ StringBuffer retval = new StringBuffer();
+ retval.append( ISO_8601_DATE_FORMAT.format( cal.getTime() ) );
+ int timeZone = cal.get( Calendar.ZONE_OFFSET );
+ if( timeZone < 0 )
+ {
+ retval.append( "-" );
+ }
+ else
+ {
+ retval.append( "+" );
+ }
+ timeZone = Math.abs( timeZone );
+ //milliseconds/1000 = seconds = seconds / 60 = minutes = minutes/60 = hours
+ int hours = timeZone/1000/60/60;
+ int minutes = (timeZone - (hours*1000*60*60))/1000/1000;
+ if( hours < 10 )
+ {
+ retval.append( "0" );
+ }
+ retval.append( Integer.toString( hours ) );
+ retval.append( ":" );
+ if( minutes < 10 )
+ {
+ retval.append( "0" );
+ }
+ retval.append( Integer.toString( minutes ) );
+
+ return retval.toString();
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/util/DefaultFileFilter.java b/src/main/java/org/pdfbox/util/DefaultFileFilter.java
new file mode 100644
index 0000000..e4baec0
--- /dev/null
+++ b/src/main/java/org/pdfbox/util/DefaultFileFilter.java
@@ -0,0 +1,285 @@
+/*
+ * @(#)DefaultFileFilter.java 1.12 01/12/03
+ *
+ * Copyright 2002 Sun Microsystems, Inc. All rights reserved.
+ * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
+ */
+package org.pdfbox.util;
+
+import java.io.File;
+import java.util.Hashtable;
+import java.util.Enumeration;
+//import javax.swing.*;
+import javax.swing.filechooser.FileFilter;
+
+/**
+ * A convenience implementation of FileFilter that filters out
+ * all files except for those type extensions that it knows about.
+ *
+ * Extensions are of the type ".foo", which is typically found on
+ * Windows and Unix boxes, but not on Macinthosh. Case is ignored.
+ *
+ * Example - create a new filter that filerts out all files
+ * but gif and jpg image files:
+ *
+ * JFileChooser chooser = new JFileChooser();
+ * DefaultFileFilter filter = new DefaultFileFilter(
+ * new String{"gif", "jpg"}, "JPEG & GIF Images")
+ * chooser.addChoosableFileFilter(filter);
+ * chooser.showOpenDialog(this);
+ *
+ * @version $Revision: 1.2 $
+ * @author Jeff Dinkins
+ */
+public class DefaultFileFilter extends FileFilter
+{
+
+ private static final String TYPE_UNKNOWN = "Type Unknown";
+ private static final String HIDDEN_FILE = "Hidden File";
+
+ private Hashtable filters = null;
+ private String description = null;
+ private String fullDescription = null;
+ private boolean useExtensionsInDescription = true;
+
+ /**
+ * Creates a file filter. If no filters are added, then all
+ * files are accepted.
+ *
+ * @see #addExtension
+ */
+ public DefaultFileFilter()
+ {
+ this.filters = new Hashtable();
+ }
+
+ /**
+ * Creates a file filter that accepts files with the given extension.
+ * Example: new DefaultFileFilter("jpg");
+ *
+ * @see #addExtension
+ */
+ public DefaultFileFilter(String extension)
+ {
+ this(extension,null);
+ }
+
+ /**
+ * Creates a file filter that accepts the given file type.
+ * Example: new DefaultFileFilter("jpg", "JPEG Image Images");
+ *
+ * Note that the "." before the extension is not needed. If
+ * provided, it will be ignored.
+ *
+ * @see #addExtension
+ */
+ public DefaultFileFilter(String extension, String desc)
+ {
+ this();
+ if(extension!=null)
+ {
+ addExtension(extension);
+ }
+ if(desc!=null)
+ {
+ setDescription(desc);
+ }
+ }
+
+ /**
+ * Creates a file filter from the given string array.
+ * Example: new DefaultFileFilter(String {"gif", "jpg"});
+ *
+ * Note that the "." before the extension is not needed adn
+ * will be ignored.
+ *
+ * @see #addExtension
+ */
+ public DefaultFileFilter(String[] filterArray)
+ {
+ this(filterArray, null);
+ }
+
+ /**
+ * Creates a file filter from the given string array and description.
+ * Example: new DefaultFileFilter(String {"gif", "jpg"}, "Gif and JPG Images");
+ *
+ * Note that the "." before the extension is not needed and will be ignored.
+ *
+ * @see #addExtension
+ */
+ public DefaultFileFilter(String[] filterArray, String desc)
+ {
+ this();
+ for (int i = 0; i < filterArray.length; i++)
+ {
+ // add filters one by one
+ addExtension(filterArray[i]);
+ }
+ if(desc!=null)
+ {
+ setDescription(desc);
+ }
+ }
+
+ /**
+ * Files that begin with "." are ignored.
+ *
+ * @param f The file to accept.
+ * @return true if this file should be shown in the directory pane, false if it shouldn't.
+ * @see #getExtension
+ * @see FileFilter#accepts
+ */
+ public boolean accept(File f)
+ {
+ if(f != null)
+ {
+ if(f.isDirectory())
+ {
+ return true;
+ }
+ String extension = getExtension(f);
+ if(extension != null && filters.get(getExtension(f)) != null)
+ {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Return the extension portion of the file's name .
+ *
+ * @param f The file to get the extension of.
+ * @return The extension of a file.
+ * @see #getExtension
+ * @see FileFilter#accept
+ */
+ public String getExtension(File f)
+ {
+ if(f != null)
+ {
+ String filename = f.getName();
+ int i = filename.lastIndexOf('.');
+ if(i>0 && i<filename.length()-1)
+ {
+ return filename.substring(i+1).toLowerCase();
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Adds a filetype "dot" extension to filter against.
+ *
+ * For example: the following code will create a filter that filters
+ * out all files except those that end in ".jpg" and ".tif":
+ *
+ * DefaultFileFilter filter = new DefaultFileFilter();
+ * filter.addExtension("jpg");
+ * filter.addExtension("tif");
+ *
+ * Note that the "." before the extension is not needed and will be ignored.
+ *
+ * @param extension The new extension to add.
+ */
+ public void addExtension(String extension)
+ {
+ if(filters == null)
+ {
+ filters = new Hashtable(5);
+ }
+ filters.put(extension.toLowerCase(), this);
+ fullDescription = null;
+ }
+
+
+ /**
+ * Returns the human readable description of this filter. For
+ * example: "JPEG and GIF Image Files (*.jpg, *.gif)"
+ *
+ * @see setDescription
+ * @see setExtensionListInDescription
+ * @see isExtensionListInDescription
+ * @see FileFilter#getDescription
+ *
+ * @return The human readable description of this filter.
+ */
+ public String getDescription()
+ {
+ if(fullDescription == null)
+ {
+ if(description == null || isExtensionListInDescription())
+ {
+ fullDescription = description==null ? "(" : description + " (";
+ // build the description from the extension list
+ Enumeration extensions = filters.keys();
+ if(extensions != null)
+ {
+ fullDescription += "." + (String) extensions.nextElement();
+ while (extensions.hasMoreElements())
+ {
+ fullDescription += ", ." + (String) extensions.nextElement();
+ }
+ }
+ fullDescription += ")";
+ }
+ else
+ {
+ fullDescription = description;
+ }
+ }
+ return fullDescription;
+ }
+
+ /**
+ * Sets the human readable description of this filter. For
+ * example: filter.setDescription("Gif and JPG Images");
+ *
+ * @param desc the new description for the file.
+ * @see setDescription
+ * @see setExtensionListInDescription
+ * @see isExtensionListInDescription
+ */
+ public void setDescription(String desc)
+ {
+ description = desc;
+ fullDescription = null;
+ }
+
+ /**
+ * Determines whether the extension list (.jpg, .gif, etc) should
+ * show up in the human readable description.
+ *
+ * Only relevent if a description was provided in the constructor
+ * or using setDescription();
+ *
+ *
+ * @param b Tell if the extionsion shoud show up in human readable description.
+ * @see getDescription
+ * @see setDescription
+ * @see isExtensionListInDescription
+ */
+ public void setExtensionListInDescription(boolean b)
+ {
+ useExtensionsInDescription = b;
+ fullDescription = null;
+ }
+
+ /**
+ * @return whether the extension list (.jpg, .gif, etc) should
+ * show up in the human readable description.
+ *
+ * Only relevent if a description was provided in the constructor
+ * or using setDescription();
+ *
+ *
+ * @see getDescription
+ * @see setDescription
+ * @see setExtensionListInDescription
+ */
+ public boolean isExtensionListInDescription()
+ {
+ return useExtensionsInDescription;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/util/ErrorLogger.java b/src/main/java/org/pdfbox/util/ErrorLogger.java
new file mode 100644
index 0000000..b2f380c
--- /dev/null
+++ b/src/main/java/org/pdfbox/util/ErrorLogger.java
@@ -0,0 +1,72 @@
+/**
+ * Copyright (c) 2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.util;
+
+/**
+ * This class deals with some logging that is not handled by the log4j replacement.
+ *
+ * @author Ben Litchfield (ben@benlitchfield.com)
+ * @version $Revision: 1.2 $
+ */
+public class ErrorLogger
+{
+ /**
+ * Utility class, should not be instantiated.
+ *
+ */
+ private ErrorLogger()
+ {
+ }
+
+ /**
+ * Log an error message. This is only used for log4j replacement and
+ * should never be used when writing code.
+ *
+ * @param errorMessage The error message.
+ */
+ public static void log( String errorMessage )
+ {
+ System.err.println( errorMessage );
+ }
+
+ /**
+ * Log an error message. This is only used for log4j replacement and
+ * should never be used when writing code.
+ *
+ * @param errorMessage The error message.
+ * @param t The exception.
+ */
+ public static void log( String errorMessage, Throwable t )
+ {
+ System.err.println( errorMessage );
+ t.printStackTrace();
+ }
+}
diff --git a/src/main/java/org/pdfbox/util/ImageParameters.java b/src/main/java/org/pdfbox/util/ImageParameters.java
new file mode 100644
index 0000000..79f09b0
--- /dev/null
+++ b/src/main/java/org/pdfbox/util/ImageParameters.java
@@ -0,0 +1,234 @@
+/**
+ * Copyright (c) 2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.util;
+
+import org.pdfbox.cos.COSArray;
+import org.pdfbox.cos.COSBase;
+import org.pdfbox.cos.COSDictionary;
+import org.pdfbox.cos.COSInteger;
+import org.pdfbox.cos.COSName;
+import org.pdfbox.cos.COSNumber;
+
+import org.pdfbox.pdmodel.common.COSArrayList;
+import org.pdfbox.pdmodel.graphics.color.PDColorSpace;
+import org.pdfbox.pdmodel.graphics.color.PDColorSpaceFactory;
+
+import java.io.IOException;
+import java.util.List;
+
+/**
+ * This contains all of the image parameters for in inlined image.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.3 $
+ */
+public class ImageParameters
+{
+ private COSDictionary dictionary;
+
+ /**
+ * Constructor.
+ */
+ public ImageParameters()
+ {
+ dictionary = new COSDictionary();
+ }
+
+ /**
+ * Constructor.
+ *
+ * @param params The image parameters.
+ */
+ public ImageParameters( COSDictionary params )
+ {
+ dictionary = params;
+ }
+
+ /**
+ * This will get the dictionary that stores the image parameters.
+ *
+ * @return The COS dictionary that stores the image parameters.
+ */
+ public COSDictionary getDictionary()
+ {
+ return dictionary;
+ }
+
+ private COSBase getCOSObject( String abbreviatedName, String name )
+ {
+ COSBase retval = dictionary.getDictionaryObject( COSName.getPDFName( abbreviatedName ) );
+ if( retval == null )
+ {
+ retval = dictionary.getDictionaryObject( COSName.getPDFName( name ) );
+ }
+ return retval;
+ }
+
+ private int getNumberOrNegativeOne( String abbreviatedName, String name )
+ {
+ int retval = -1;
+ COSNumber number = (COSNumber)getCOSObject( abbreviatedName, name );
+ if( number != null )
+ {
+ retval = number.intValue();
+ }
+ return retval;
+ }
+
+ /**
+ * The bits per component of this image. This will return -1 if one has not
+ * been set.
+ *
+ * @return The number of bits per component.
+ */
+ public int getBitsPerComponent()
+ {
+ return getNumberOrNegativeOne( "BPC", "BitsPerComponent" );
+ }
+
+ /**
+ * Set the number of bits per component.
+ *
+ * @param bpc The number of bits per component.
+ */
+ public void setBitsPerComponent( int bpc )
+ {
+ dictionary.setItem( COSName.getPDFName( "BPC" ), new COSInteger( bpc ) );
+ }
+
+
+ /**
+ * This will get the color space or null if none exists.
+ *
+ * @return The color space for this image.
+ *
+ * @throws IOException If there is an error getting the colorspace.
+ */
+ public PDColorSpace getColorSpace() throws IOException
+ {
+ COSBase cs = getCOSObject( "CS", "ColorSpace" );
+ PDColorSpace retval = null;
+ if( cs != null )
+ {
+ retval = PDColorSpaceFactory.createColorSpace( cs );
+ }
+ return retval;
+ }
+
+ /**
+ * This will set the color space for this image.
+ *
+ * @param cs The color space for this image.
+ */
+ public void setColorSpace( PDColorSpace cs )
+ {
+ COSBase base = null;
+ if( cs != null )
+ {
+ base = cs.getCOSObject();
+ }
+ dictionary.setItem( COSName.getPDFName( "CS" ), base );
+ }
+
+ /**
+ * The height of this image. This will return -1 if one has not
+ * been set.
+ *
+ * @return The height.
+ */
+ public int getHeight()
+ {
+ return getNumberOrNegativeOne( "H", "Height" );
+ }
+
+ /**
+ * Set the height of the image.
+ *
+ * @param h The height of the image.
+ */
+ public void setHeight( int h )
+ {
+ dictionary.setItem( COSName.getPDFName( "H" ), new COSInteger( h ) );
+ }
+
+ /**
+ * The width of this image. This will return -1 if one has not
+ * been set.
+ *
+ * @return The width.
+ */
+ public int getWidth()
+ {
+ return getNumberOrNegativeOne( "W", "Width" );
+ }
+
+ /**
+ * Set the width of the image.
+ *
+ * @param w The width of the image.
+ */
+ public void setWidth( int w )
+ {
+ dictionary.setItem( COSName.getPDFName( "W" ), new COSInteger( w ) );
+ }
+
+ /**
+ * This will get the list of filters that are associated with this stream. Or
+ * null if there are none.
+ * @return A list of all encoding filters to apply to this stream.
+ */
+ public List getFilters()
+ {
+ List retval = null;
+ COSBase filters = dictionary.getDictionaryObject( new String[] {"Filter", "F"} );
+ if( filters instanceof COSName )
+ {
+ COSName name = (COSName)filters;
+ retval = new COSArrayList( name.getName(), name, dictionary, "Filter" );
+ }
+ else if( filters instanceof COSArray )
+ {
+ retval = COSArrayList.convertCOSNameCOSArrayToList( (COSArray)filters );
+ }
+ return retval;
+ }
+
+ /**
+ * This will set the filters that are part of this stream.
+ *
+ * @param filters The filters that are part of this stream.
+ */
+ public void setFilters( List filters )
+ {
+ COSBase obj = COSArrayList.convertStringListToCOSNameCOSArray( filters );
+ dictionary.setItem( "Filter", obj );
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/util/Matrix.java b/src/main/java/org/pdfbox/util/Matrix.java
new file mode 100644
index 0000000..ff14887
--- /dev/null
+++ b/src/main/java/org/pdfbox/util/Matrix.java
@@ -0,0 +1,350 @@
+/**
+ * Copyright (c) 2003, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.util;
+
+import java.awt.geom.AffineTransform;
+
+/**
+ * This class will be used for matrix manipulation.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.13 $
+ */
+public class Matrix implements Cloneable
+{
+ private float[] single =
+ {
+ 1,0,0,
+ 0,1,0,
+ 0,0,1
+ };
+
+ /**
+ * Constructor.
+ */
+ public Matrix()
+ {
+ //default constructor
+ }
+
+ /**
+ * Create an affine transform from this matrix's values.
+ *
+ * @return An affine transform with this matrix's values.
+ */
+ public AffineTransform createAffineTransform()
+ {
+ AffineTransform retval = new AffineTransform(
+ single[0], single[1],
+ single[3], single[4],
+ single[6], single[7] );
+ return retval;
+ }
+
+ /**
+ * Set the values of the matrix from the AffineTransform.
+ *
+ * @param af The transform to get the values from.
+ */
+ public void setFromAffineTransform( AffineTransform af )
+ {
+ single[0] = (float)af.getScaleX();
+ single[1] = (float)af.getShearY();
+ single[3] = (float)af.getShearX();
+ single[4] = (float)af.getScaleY();
+ single[6] = (float)af.getTranslateX();
+ single[7] = (float)af.getTranslateY();
+ }
+
+ /**
+ * This will get a matrix value at some point.
+ *
+ * @param row The row to get the value from.
+ * @param column The column to get the value from.
+ *
+ * @return The value at the row/column position.
+ */
+ public float getValue( int row, int column )
+ {
+ return single[row*3+column];
+ }
+
+ /**
+ * This will set a value at a position.
+ *
+ * @param row The row to set the value at.
+ * @param column the column to set the value at.
+ * @param value The value to set at the position.
+ */
+ public void setValue( int row, int column, float value )
+ {
+ single[row*3+column] = value;
+ }
+
+ /**
+ * Return a single dimension array of all values in the matrix.
+ *
+ * @return The values ot this matrix.
+ */
+ public float[][] getValues()
+ {
+ float[][] retval = new float[3][3];
+ retval[0][0] = single[0];
+ retval[0][1] = single[1];
+ retval[0][2] = single[2];
+ retval[1][0] = single[3];
+ retval[1][1] = single[4];
+ retval[1][2] = single[5];
+ retval[2][0] = single[6];
+ retval[2][1] = single[7];
+ retval[2][2] = single[8];
+ return retval;
+ }
+
+ /**
+ * Return a single dimension array of all values in the matrix.
+ *
+ * @return The values ot this matrix.
+ */
+ public double[][] getValuesAsDouble()
+ {
+ double[][] retval = new double[3][3];
+ retval[0][0] = single[0];
+ retval[0][1] = single[1];
+ retval[0][2] = single[2];
+ retval[1][0] = single[3];
+ retval[1][1] = single[4];
+ retval[1][2] = single[5];
+ retval[2][0] = single[6];
+ retval[2][1] = single[7];
+ retval[2][2] = single[8];
+ return retval;
+ }
+
+ /**
+ * This will take the current matrix and multipy it with a matrix that is passed in.
+ *
+ * @param b The matrix to multiply by.
+ *
+ * @return The result of the two multiplied matrices.
+ */
+ public Matrix multiply( Matrix b )
+ {
+ Matrix result = new Matrix();
+
+ float[] bMatrix = b.single;
+ float[] resultMatrix = result.single;
+ resultMatrix[0] = single[0] * bMatrix[0] + single[1] * bMatrix[3] + single[2] * bMatrix[6];
+ resultMatrix[1] = single[0] * bMatrix[1] + single[1] * bMatrix[4] + single[2] * bMatrix[7];
+ resultMatrix[2] = single[0] * bMatrix[2] + single[1] * bMatrix[5] + single[2] * bMatrix[8];
+ resultMatrix[3] = single[3] * bMatrix[0] + single[4] * bMatrix[3] + single[5] * bMatrix[6];
+ resultMatrix[4] = single[3] * bMatrix[1] + single[4] * bMatrix[4] + single[5] * bMatrix[7];
+ resultMatrix[5] = single[3] * bMatrix[2] + single[4] * bMatrix[5] + single[5] * bMatrix[8];
+ resultMatrix[6] = single[6] * bMatrix[0] + single[7] * bMatrix[3] + single[8] * bMatrix[6];
+ resultMatrix[7] = single[6] * bMatrix[1] + single[7] * bMatrix[4] + single[8] * bMatrix[7];
+ resultMatrix[8] = single[6] * bMatrix[2] + single[7] * bMatrix[5] + single[8] * bMatrix[8];
+
+ return result;
+ }
+
+ /**
+ * Create a new matrix with just the scaling operators.
+ *
+ * @return A new matrix with just the scaling operators.
+ */
+ public Matrix extractScaling()
+ {
+ Matrix retval = new Matrix();
+
+ retval.single[0] = this.single[0];
+ retval.single[4] = this.single[4];
+
+ return retval;
+ }
+
+ /**
+ * Convenience method to create a scaled instance.
+ *
+ * @param x The xscale operator.
+ * @param y The yscale operator.
+ * @return A new matrix with just the x/y scaling
+ */
+ public static Matrix getScaleInstance( float x, float y)
+ {
+ Matrix retval = new Matrix();
+
+ retval.single[0] = x;
+ retval.single[4] = y;
+
+ return retval;
+ }
+
+ /**
+ * Create a new matrix with just the translating operators.
+ *
+ * @return A new matrix with just the translating operators.
+ */
+ public Matrix extractTranslating()
+ {
+ Matrix retval = new Matrix();
+
+ retval.single[6] = this.single[6];
+ retval.single[7] = this.single[7];
+
+ return retval;
+ }
+
+ /**
+ * Convenience method to create a translating instance.
+ *
+ * @param x The x translating operator.
+ * @param y The y translating operator.
+ * @return A new matrix with just the x/y translating.
+ */
+ public static Matrix getTranslatingInstance( float x, float y)
+ {
+ Matrix retval = new Matrix();
+
+ retval.single[6] = x;
+ retval.single[7] = y;
+
+ return retval;
+ }
+
+ /**
+ * Clones this object.
+ * @return cloned matrix as an object.
+ */
+ public Object clone()
+ {
+ Matrix clone = new Matrix();
+ System.arraycopy( single, 0, clone.single, 0, 9 );
+ return clone;
+ }
+
+ /**
+ * This will copy the text matrix data.
+ *
+ * @return a matrix that matches this one.
+ */
+ public Matrix copy()
+ {
+ return (Matrix) clone();
+ }
+
+ /**
+ * This will return a string representation of the matrix.
+ *
+ * @return The matrix as a string.
+ */
+ public String toString()
+ {
+ StringBuffer result = new StringBuffer( "" );
+ result.append( "[[" );
+ result.append( single[0] + "," );
+ result.append( single[1] + "," );
+ result.append( single[2] + "][");
+ result.append( single[3] + "," );
+ result.append( single[4] + "," );
+ result.append( single[5] + "][");
+ result.append( single[6] + "," );
+ result.append( single[7] + "," );
+ result.append( single[8] + "]]");
+
+ return result.toString();
+ }
+
+ /**
+ * Get the xscaling factor of this matrix.
+ * @return The x-scale.
+ */
+ public float getXScale()
+ {
+ float xScale = single[0];
+
+ /**
+ * BM: if the trm is rotated, the calculation is a little more complicated
+ *
+ * The rotation matrix multiplied with the scaling matrix is:
+ * ( x 0 0) ( cos sin 0) ( x*cos x*sin 0)
+ * ( 0 y 0) * (-sin cos 0) = (-y*sin y*cos 0)
+ * ( 0 0 1) ( 0 0 1) ( 0 0 1)
+ *
+ * So, if you want to deduce x from the matrix you take
+ * M(0,0) = x*cos and M(0,1) = x*sin and use the theorem of Pythagoras
+ *
+ * sqrt(M(0,0)^2+M(0,1)^2) =
+ * sqrt(x2*cos2+x2*sin2) =
+ * sqrt(x2*(cos2+sin2)) = <- here is the trick cos2+sin2 is one
+ * sqrt(x2) =
+ * abs(x)
+ */
+ if( !(single[1]==0.0f && single[3]==0.0f) )
+ {
+ xScale = (float)Math.sqrt(Math.pow(single[0], 2)+
+ Math.pow(single[1], 2));
+ }
+ return xScale;
+ }
+
+ /**
+ * Get the y scaling factor of this matrix.
+ * @return The y-scale factor.
+ */
+ public float getYScale()
+ {
+ float yScale = single[4];
+ if( !(single[1]==0.0f && single[3]==0.0f) )
+ {
+ yScale = (float)Math.sqrt(Math.pow(single[3], 2)+
+ Math.pow(single[4], 2));
+ }
+ return yScale;
+ }
+
+ /**
+ * Get the x position in the matrix.
+ * @return The x-position.
+ */
+ public float getXPosition()
+ {
+ return single[6];
+ }
+
+ /**
+ * Get the y position.
+ * @return The y position.
+ */
+ public float getYPosition()
+ {
+ return single[7];
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/util/PDFHighlighter.java b/src/main/java/org/pdfbox/util/PDFHighlighter.java
new file mode 100644
index 0000000..6c27225
--- /dev/null
+++ b/src/main/java/org/pdfbox/util/PDFHighlighter.java
@@ -0,0 +1,213 @@
+package org.pdfbox.util;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.OutputStreamWriter;
+import java.io.Writer;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.pdfbox.pdmodel.PDDocument;
+import org.pdfbox.pdmodel.PDPage;
+
+
+/**
+ * Highlighting of words in a PDF document with an XML file.
+ *
+ * @author slagraulet (slagraulet@cardiweb.com)
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.6 $
+ *
+ * @see <a href="http://partners.adobe.com/public/developer/en/pdf/HighlightFileFormat.pdf">
+ * Adobe Highlight File Format</a>
+ */
+public class PDFHighlighter extends PDFTextStripper
+{
+ private Writer highlighterOutput = null;
+ //private Color highlightColor = Color.YELLOW;
+
+ private String[] searchedWords;
+ private ByteArrayOutputStream textOS = null;
+ private Writer textWriter = null;
+
+ /**
+ * Default constructor.
+ *
+ * @throws IOException If there is an error constructing this class.
+ */
+ public PDFHighlighter() throws IOException
+ {
+ super();
+ super.setLineSeparator( "" );
+ super.setPageSeparator( "" );
+ super.setWordSeparator( "" );
+ super.setShouldSeparateByBeads( false );
+ super.setSuppressDuplicateOverlappingText( false );
+ }
+
+ /**
+ * Generate an XML highlight string based on the PDF.
+ *
+ * @param pdDocument The PDF to find words in.
+ * @param highlightWord The word to search for.
+ * @param xmlOutput The resulting output xml file.
+ *
+ * @throws IOException If there is an error reading from the PDF, or writing to the XML.
+ */
+ public void generateXMLHighlight(PDDocument pdDocument, String highlightWord, Writer xmlOutput ) throws IOException
+ {
+ generateXMLHighlight( pdDocument, new String[] { highlightWord }, xmlOutput );
+ }
+
+ /**
+ * Generate an XML highlight string based on the PDF.
+ *
+ * @param pdDocument The PDF to find words in.
+ * @param sWords The words to search for.
+ * @param xmlOutput The resulting output xml file.
+ *
+ * @throws IOException If there is an error reading from the PDF, or writing to the XML.
+ */
+ public void generateXMLHighlight(PDDocument pdDocument, String[] sWords, Writer xmlOutput ) throws IOException
+ {
+ highlighterOutput = xmlOutput;
+ searchedWords = sWords;
+ highlighterOutput.write("<XML>\n<Body units=characters " +
+ //color and mode are not implemented by the highlight spec
+ //so don't include them for now
+ //" color=#" + getHighlightColorAsString() +
+ //" mode=active " + */
+ " version=2>\n<Highlight>\n");
+ textOS = new ByteArrayOutputStream();
+ textWriter = new OutputStreamWriter( textOS, "UTF-16" );
+ writeText(pdDocument, textWriter);
+ highlighterOutput.write("</Highlight>\n</Body>\n</XML>");
+ highlighterOutput.flush();
+ }
+
+ /**
+ * @see PDFTextStripper#endPage( PDPage )
+ */
+ protected void endPage( PDPage pdPage ) throws IOException
+ {
+ textWriter.flush();
+
+ String page = new String( textOS.toByteArray(), "UTF-16" );
+ textOS.reset();
+ //page = page.replaceAll( "\n", "" );
+ //page = page.replaceAll( "\r", "" );
+ //page = CCRStringUtil.stripChar(page, '\n');
+ //page = CCRStringUtil.stripChar(page, '\r');
+
+ // Traitement des listes à puces (caractères spéciaux)
+ if (page.indexOf("a") != -1)
+ {
+ page = page.replaceAll("a[0-9]{1,3}", ".");
+ }
+
+ for (int i = 0; i < searchedWords.length; i++)
+ {
+ Pattern pattern = Pattern.compile(searchedWords[i], Pattern.CASE_INSENSITIVE);
+ Matcher matcher = pattern.matcher(page);
+ while( matcher.find() )
+ {
+ int begin = matcher.start();
+ int end = matcher.end();
+ highlighterOutput.write(" <loc " +
+ "pg=" + (getCurrentPageNo()-1)
+ + " pos=" + begin
+ + " len="+ (end - begin)
+ + ">\n");
+ }
+ }
+ }
+
+ /**
+ * Command line application.
+ *
+ * @param args The command line arguments to the application.
+ *
+ * @throws IOException If there is an error generating the highlight file.
+ */
+ public static void main(String[] args) throws IOException
+ {
+ PDFHighlighter xmlExtractor = new PDFHighlighter();
+ PDDocument doc = null;
+ try
+ {
+ if( args.length < 2 )
+ {
+ usage();
+ }
+ String[] highlightStrings = new String[ args.length - 1];
+ System.arraycopy( args, 1, highlightStrings, 0, highlightStrings.length );
+ doc = PDDocument.load( args[0] );
+
+ xmlExtractor.generateXMLHighlight(
+ doc,
+ highlightStrings,
+ new OutputStreamWriter( System.out ) );
+ }
+ finally
+ {
+ if( doc != null )
+ {
+ doc.close();
+ }
+ }
+ }
+
+ private static void usage()
+ {
+ System.err.println( "usage: java " + PDFHighlighter.class.getName() + " <pdf file> word1 word2 word3 ..." );
+ System.exit( 1 );
+ }
+
+
+ /**
+ * Get the color to highlight the strings with. Default is Color.YELLOW.
+ *
+ * @return The color to highlight strings with.
+ */
+ /*public Color getHighlightColor()
+ {
+ return highlightColor;
+ }**/
+
+ /**
+ * Get the color to highlight the strings with. Default is Color.YELLOW.
+ *
+ * @param color The color to highlight strings with.
+ */
+ /*public void setHighlightColor(Color color)
+ {
+ this.highlightColor = color;
+ }**/
+
+ /**
+ * Set the highlight color using HTML like rgb string. The string must be 6 characters long.
+ *
+ * @param color The color to use for highlighting. Should be in the format of "FF0000".
+ */
+ /*public void setHighlightColor( String color )
+ {
+ highlightColor = Color.decode( color );
+ }**/
+
+ /**
+ * Get the highlight color as an HTML like string. This will return a string of six characters.
+ *
+ * @return The current highlight color. For example FF0000
+ */
+ /*public String getHighlightColorAsString()
+ {
+ //BJL: kudos to anyone that has a cleaner way of doing this!
+ String red = Integer.toHexString( highlightColor.getRed() );
+ String green = Integer.toHexString( highlightColor.getGreen() );
+ String blue = Integer.toHexString( highlightColor.getBlue() );
+
+ return (red.length() < 2 ? "0" + red : red) +
+ (green.length() < 2 ? "0" + green : green) +
+ (blue.length() < 2 ? "0" + blue : blue);
+ }**/
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/util/PDFOperator.java b/src/main/java/org/pdfbox/util/PDFOperator.java
new file mode 100644
index 0000000..76d9887
--- /dev/null
+++ b/src/main/java/org/pdfbox/util/PDFOperator.java
@@ -0,0 +1,153 @@
+/**
+ * Copyright (c) 2003-2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.util;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * This class represents an Operator in the content stream.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.13 $
+ */
+public class PDFOperator
+{
+ private String theOperator;
+ private byte[] imageData;
+ private ImageParameters imageParameters;
+
+ private static Map operators = Collections.synchronizedMap( new HashMap() );
+
+ /**
+ * Constructor.
+ *
+ * @param aOperator The operator that this object will represent.
+ */
+ private PDFOperator( String aOperator )
+ {
+ theOperator = aOperator;
+ if( aOperator.startsWith( "/" ) )
+ {
+ throw new RuntimeException( "Operators are not allowed to start with / '" + aOperator + "'" );
+ }
+ }
+
+ /**
+ * This is used to create/cache operators in the system.
+ *
+ * @param operator The operator for the system.
+ *
+ * @return The operator that matches the operator keyword.
+ */
+ public static PDFOperator getOperator( String operator )
+ {
+ PDFOperator operation = null;
+ if( operator.equals( "ID" ) || operator.equals( "BI" ) )
+ {
+ //we can't cache the ID operators.
+ operation = new PDFOperator( operator );
+ }
+ else
+ {
+ operation = (PDFOperator)operators.get( operator );
+ if( operation == null )
+ {
+ operation = new PDFOperator( operator );
+ operators.put( operator, operation );
+ }
+ }
+
+ return operation;
+ }
+
+ /**
+ * This will get the operation that this operator represents.
+ *
+ * @return The string representation of the operation.
+ */
+ public String getOperation()
+ {
+ return theOperator;
+ }
+
+ /**
+ * This will print a string rep of this class.
+ *
+ * @return A string rep of this class.
+ */
+ public String toString()
+ {
+ return "PDFOperator{" + theOperator + "}";
+ }
+
+ /**
+ * This is the special case for the ID operator where there are just random
+ * bytes inlined the stream.
+ *
+ * @return Value of property imageData.
+ */
+ public byte[] getImageData()
+ {
+ return this.imageData;
+ }
+
+ /**
+ * This will set the image data, this is only used for the ID operator.
+ *
+ * @param imageDataArray New value of property imageData.
+ */
+ public void setImageData(byte[] imageDataArray)
+ {
+ imageData = imageDataArray;
+ }
+
+ /**
+ * This will get the image parameters, this is only valid for BI operators.
+ *
+ * @return The image parameters.
+ */
+ public ImageParameters getImageParameters()
+ {
+ return imageParameters;
+ }
+
+ /**
+ * This will set the image parameters, this is only valid for BI operators.
+ *
+ * @param params The image parameters.
+ */
+ public void setImageParameters( ImageParameters params)
+ {
+ imageParameters = params;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/util/PDFStreamEngine.java b/src/main/java/org/pdfbox/util/PDFStreamEngine.java
new file mode 100644
index 0000000..1e05f8a
--- /dev/null
+++ b/src/main/java/org/pdfbox/util/PDFStreamEngine.java
@@ -0,0 +1,622 @@
+/**
+ * Copyright (c) 2003-2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.util;
+
+import java.io.IOException;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+import java.util.Stack;
+
+import org.pdfbox.cos.COSObject;
+import org.pdfbox.cos.COSStream;
+import org.pdfbox.exceptions.WrappedIOException;
+
+import org.pdfbox.pdmodel.PDPage;
+import org.pdfbox.pdmodel.PDResources;
+
+import org.pdfbox.pdmodel.font.PDFont;
+
+import org.pdfbox.pdmodel.graphics.PDGraphicsState;
+
+import org.pdfbox.util.operator.OperatorProcessor;
+
+import org.apache.log4j.Logger;
+
+/**
+ * This class will run through a PDF content stream and execute certain operations
+ * and provide a callback interface for clients that want to do things with the stream.
+ * See the PDFTextStripper class for an example of how to use this class.
+ *
+ * @author Ben Litchfield (ben@benlitchfield.com)
+ * @version $Revision: 1.29 $
+ */
+public class PDFStreamEngine
+{
+ private static Logger log = Logger.getLogger(PDFStreamEngine.class);
+
+ static protected final byte[] SPACE_BYTES = { (byte)32 };
+
+ private PDGraphicsState graphicsState = null;
+
+ protected Matrix textMatrix = null;
+ protected Matrix textLineMatrix = null;
+ protected Stack graphicsStack = new Stack();
+ //private PDResources resources = null;
+
+ protected Map operators = new HashMap();
+
+ protected Map fontToAverageWidths = new HashMap();
+
+ protected Stack streamResourcesStack = new Stack();
+
+ protected PDPage page;
+
+ /**
+ * This is a simple internal class used by the Stream engine to handle the
+ * resources stack.
+ */
+ protected static class StreamResources
+ {
+ protected Map fonts;
+ protected Map colorSpaces;
+ protected Map xobjects;
+ protected Map graphicsStates;
+ protected PDResources resources;
+ }
+
+ /**
+ * Constructor.
+ */
+ public PDFStreamEngine()
+ {
+ //default constructor
+ }
+
+ /**
+ * Constructor with engine properties. The property keys are all
+ * PDF operators, the values are class names used to execute those
+ * operators.
+ *
+ * @param properties The engine properties.
+ *
+ * @throws IOException If there is an error setting the engine properties.
+ */
+ public PDFStreamEngine( Properties properties ) throws IOException
+ {
+ try
+ {
+ Iterator keys = properties.keySet().iterator();
+ while( keys.hasNext() )
+ {
+ String operator = (String)keys.next();
+ String operatorClass = properties.getProperty( operator );
+ if( log.isDebugEnabled() )
+ {
+ log.debug( "Operator Class: " + operator + "=" + operatorClass );
+ }
+ OperatorProcessor op = (OperatorProcessor)Class.forName( operatorClass ).newInstance();
+ op.setContext( this );
+ operators.put( operator, op );
+ }
+ }
+ catch( Exception e )
+ {
+ throw new WrappedIOException( e );
+ }
+ }
+
+ /**
+ * This will process the contents of the stream.
+ *
+ * @param aPage The page.
+ * @param resources The location to retrieve resources.
+ * @param cosStream the Stream to execute.
+ *
+ *
+ * @throws IOException if there is an error accessing the stream.
+ */
+ public void processStream( PDPage aPage, PDResources resources, COSStream cosStream ) throws IOException
+ {
+ graphicsState = new PDGraphicsState();
+ textMatrix = null;
+ textLineMatrix = null;
+ graphicsStack.clear();
+ streamResourcesStack.clear();
+ fontToAverageWidths.clear();
+
+ processSubStream( aPage, resources, cosStream );
+ }
+
+ /**
+ * Process a sub stream of the current stream.
+ *
+ * @param aPage The page used for drawing.
+ * @param resources The resources used when processing the stream.
+ * @param cosStream The stream to process.
+ *
+ * @throws IOException If there is an exception while processing the stream.
+ */
+ public void processSubStream( PDPage aPage, PDResources resources, COSStream cosStream ) throws IOException
+ {
+ page = aPage;
+ if( resources != null )
+ {
+ StreamResources sr = new StreamResources();
+ sr.fonts = resources.getFonts();
+ sr.colorSpaces = resources.getColorSpaces();
+ sr.xobjects = resources.getXObjects();
+ sr.graphicsStates = resources.getGraphicsStates();
+ sr.resources = resources;
+ streamResourcesStack.push(sr);
+ }
+ try
+ {
+ List arguments = new ArrayList();
+ long startTokens = System.currentTimeMillis();
+ List tokens = cosStream.getStreamTokens();
+ long stopTokens = System.currentTimeMillis();
+ if( log.isDebugEnabled() )
+ {
+ log.debug( "Getting tokens time=" + (stopTokens-startTokens) );
+ }
+ if( tokens != null )
+ {
+ Iterator iter = tokens.iterator();
+ while( iter.hasNext() )
+ {
+ Object next = iter.next();
+ if( next instanceof COSObject )
+ {
+ arguments.add( ((COSObject)next).getObject() );
+ }
+ else if( next instanceof PDFOperator )
+ {
+ processOperator( (PDFOperator)next, arguments );
+ arguments = new ArrayList();
+ }
+ else
+ {
+ arguments.add( next );
+ }
+ }
+ }
+ }
+ finally
+ {
+ if( resources != null )
+ {
+ streamResourcesStack.pop();
+ }
+ }
+
+ }
+
+ /**
+ * A method provided as an event interface to allow a subclass to perform
+ * some specific functionality when a character needs to be displayed.
+ *
+ * @param text The character to be displayed.
+ */
+ protected void showCharacter( TextPosition text )
+ {
+ //subclasses can override to provide specific functionality.
+ }
+
+ /**
+ * You should override this method if you want to perform an action when a
+ * string is being shown.
+ *
+ * @param string The string to display.
+ *
+ * @throws IOException If there is an error showing the string
+ */
+ public void showString( byte[] string ) throws IOException
+ {
+ float spaceWidth = 0;
+ float spacing = 0;
+ StringBuffer stringResult = new StringBuffer(string.length);
+
+ float characterDisplacement = 0;
+ float spaceDisplacement = 0;
+ float fontSize = graphicsState.getTextState().getFontSize();
+ float horizontalScaling = graphicsState.getTextState().getHorizontalScalingPercent()/100f;
+ float rise = graphicsState.getTextState().getRise();
+ final float wordSpacing = graphicsState.getTextState().getWordSpacing();
+ final float characterSpacing = graphicsState.getTextState().getCharacterSpacing();
+ float wordSpacingDisplacement = 0;
+
+ PDFont font = graphicsState.getTextState().getFont();
+
+ //This will typically be 1000 but in the case of a type3 font
+ //this might be a different number
+ float glyphSpaceToTextSpaceFactor = 1f/font.getFontMatrix().getValue( 0, 0 );
+ Float averageWidth = (Float)fontToAverageWidths.get( font );
+ if( averageWidth == null )
+ {
+ averageWidth = new Float( font.getAverageFontWidth() );
+ fontToAverageWidths.put( font, averageWidth );
+ }
+
+ Matrix initialMatrix = new Matrix();
+ initialMatrix.setValue(0,0,1);
+ initialMatrix.setValue(0,1,0);
+ initialMatrix.setValue(0,2,0);
+ initialMatrix.setValue(1,0,0);
+ initialMatrix.setValue(1,1,1);
+ initialMatrix.setValue(1,2,0);
+ initialMatrix.setValue(2,0,0);
+ initialMatrix.setValue(2,1,rise);
+ initialMatrix.setValue(2,2,1);
+
+
+ //this
+ int codeLength = 1;
+ Matrix ctm = graphicsState.getCurrentTransformationMatrix();
+
+ //lets see what the space displacement should be
+ spaceDisplacement = (font.getFontWidth( SPACE_BYTES, 0, 1 )/glyphSpaceToTextSpaceFactor);
+ if( spaceDisplacement == 0 )
+ {
+ spaceDisplacement = (averageWidth.floatValue()/glyphSpaceToTextSpaceFactor);
+ //The average space width appears to be higher than necessary
+ //so lets make it a little bit smaller.
+ spaceDisplacement *= .80f;
+ if( log.isDebugEnabled() )
+ {
+ log.debug( "Font: Space From Average=" + spaceDisplacement );
+ }
+ }
+ int pageRotation = page.findRotation();
+ Matrix trm = initialMatrix.multiply( textMatrix ).multiply( ctm );
+ float x = trm.getValue(2,0);
+ float y = trm.getValue(2,1);
+ if( pageRotation == 0 )
+ {
+ trm.setValue( 2,1, -y + page.findMediaBox().getHeight() );
+ }
+ else if( pageRotation == 90 )
+ {
+ trm.setValue( 2,0, y );
+ trm.setValue( 2,1, x );
+ }
+ else if( pageRotation == 270 )
+ {
+ trm.setValue( 2,0, -y + page.findMediaBox().getHeight() );
+ trm.setValue( 2,1, x );
+ }
+ for( int i=0; i<string.length; i+=codeLength )
+ {
+ if( log.isDebugEnabled() )
+ {
+ log.debug( "initialMatrix=" + initialMatrix );
+ log.debug( "textMatrix=" + textMatrix );
+ log.debug( "initialMatrix.multiply( textMatrix )=" + initialMatrix.multiply( textMatrix ) );
+ log.debug( "ctm=" + ctm );
+ log.debug( "trm=" + initialMatrix.multiply( textMatrix ).multiply( ctm ) );
+ }
+ codeLength = 1;
+
+ String c = font.encode( string, i, codeLength );
+
+ if( log.isDebugEnabled() )
+ {
+ log.debug( "Character Code=" + string[i] + "='" + c + "'" );
+ }
+ if( c == null && i+1<string.length)
+ {
+ //maybe a multibyte encoding
+ codeLength++;
+ if( log.isDebugEnabled() )
+ {
+ log.debug( "Multibyte Character Code=" + string[i] + string[i+1] );
+ }
+ c = font.encode( string, i, codeLength );
+ }
+ stringResult.append( c );
+
+ //todo, handle horizontal displacement
+ characterDisplacement += (font.getFontWidth( string, i, codeLength )/glyphSpaceToTextSpaceFactor);
+
+
+ // PDF Spec - 5.5.2 Word Spacing
+ //
+ // Word spacing works the same was as character spacing, but applies
+ // only to the space character, code 32.
+ //
+ // Note: Word spacing is applied to every occurrence of the single-byte
+ // character code 32 in a string. This can occur when using a simple
+ // font or a composite font that defines code 32 as a single-byte code.
+ // It does not apply to occurrences of the byte value 32 in multiple-byte
+ // codes.
+ //
+ // RDD - My interpretation of this is that only character code 32's that
+ // encode to spaces should have word spacing applied. Cases have been
+ // observed where a font has a space character with a character code
+ // other than 32, and where word spacing (Tw) was used. In these cases,
+ // applying word spacing to either the non-32 space or to the character
+ // code 32 non-space resulted in errors consistent with this interpretation.
+ //
+
+ boolean withCS = false;
+ if( (string[i] == 0x20) && c.equals( " " ) )
+ {
+ spacing += wordSpacing + characterSpacing;
+ withCS = true;
+ }
+ else
+ {
+ spacing += characterSpacing;
+ }
+
+ if( log.isDebugEnabled() )
+ {
+ log.debug( "Checking code '" + c + "' font=" + graphicsState.getTextState().getFont() +
+ " Tc=" + characterSpacing +
+ " Tw=" + wordSpacing +
+ " fontSize=" + fontSize +
+ " horizontalScaling=" + horizontalScaling +
+ " totalDisp=" + characterDisplacement +
+ " spacing=" + spacing + "(" + withCS + ")" );
+ }
+ // We want to update the textMatrix using the width, in text space units.
+ //
+
+ }
+
+ //The adjustment will always be zero. The adjustment as shown in the
+ //TJ operator will be handled separately.
+ float adjustment=0;
+ //todo, need to compute the horizontal displacement
+ float ty = 0;
+ float tx = ((characterDisplacement-adjustment/glyphSpaceToTextSpaceFactor)*fontSize + spacing)
+ *horizontalScaling;
+
+ if( log.isDebugEnabled() )
+ {
+ log.debug( "disp=" + characterDisplacement + " adj=" + adjustment +
+ " fSize=" + fontSize + " tx=" + tx );
+ }
+
+ float xScale = trm.getXScale();
+ float yScale = trm.getYScale();
+ float xPos = trm.getXPosition();
+ float yPos = trm.getYPosition();
+ spaceWidth = spaceDisplacement * xScale * fontSize;
+ wordSpacingDisplacement = wordSpacing*xScale * fontSize;
+ Matrix td = new Matrix();
+ td.setValue( 2, 0, tx );
+ td.setValue( 2, 1, ty );
+
+ if( log.isDebugEnabled() )
+ {
+ log.debug( "TRM=" + trm );
+ log.debug( "TextMatrix before " + textMatrix );
+ }
+ float xPosBefore = textMatrix.getXPosition();
+ float yPosBefore = textMatrix.getYPosition();
+ textMatrix = td.multiply( textMatrix );
+ if( log.isDebugEnabled() )
+ {
+ log.debug( "TextMatrix after " + textMatrix );
+ }
+ float totalStringDisplacement = 0;
+ if( pageRotation == 0 )
+ {
+ totalStringDisplacement = (textMatrix.getXPosition() - xPosBefore);
+ }
+ else if( pageRotation == 90 )
+ {
+ totalStringDisplacement = (textMatrix.getYPosition() - yPosBefore);
+ }
+ else if( pageRotation == 270 )
+ {
+ totalStringDisplacement = (yPosBefore - textMatrix.getYPosition());
+ }
+ showCharacter(
+ new TextPosition(
+ xPos,
+ yPos,
+ xScale,
+ yScale,
+ totalStringDisplacement,
+ spaceWidth,
+ stringResult.toString(),
+ graphicsState.getTextState().getFont(),
+ graphicsState.getTextState().getFontSize(),
+ wordSpacingDisplacement ));
+ }
+
+ /**
+ * This is used to handle an operation.
+ *
+ * @param operation The operation to perform.
+ * @param arguments The list of arguments.
+ *
+ * @throws IOException If there is an error processing the operation.
+ */
+ public void processOperator( String operation, List arguments ) throws IOException
+ {
+ PDFOperator oper = PDFOperator.getOperator( operation );
+ processOperator( oper, arguments );
+ }
+
+ /**
+ * This is used to handle an operation.
+ *
+ * @param operator The operation to perform.
+ * @param arguments The list of arguments.
+ *
+ * @throws IOException If there is an error processing the operation.
+ */
+ protected void processOperator( PDFOperator operator, List arguments ) throws IOException
+ {
+ String operation = operator.getOperation();
+ if( log.isDebugEnabled() )
+ {
+ log.debug( "processOperator( '" + operation + "' )" );
+ }
+ OperatorProcessor processor = (OperatorProcessor)operators.get( operation );
+ if( processor != null )
+ {
+ processor.process( operator, arguments );
+ }
+ }
+
+ /**
+ * @return Returns the colorSpaces.
+ */
+ public Map getColorSpaces()
+ {
+ return ((StreamResources) streamResourcesStack.peek()).colorSpaces;
+ }
+
+ /**
+ * @return Returns the colorSpaces.
+ */
+ public Map getXObjects()
+ {
+ return ((StreamResources) streamResourcesStack.peek()).xobjects;
+ }
+
+ /**
+ * @param value The colorSpaces to set.
+ */
+ public void setColorSpaces(Map value)
+ {
+ ((StreamResources) streamResourcesStack.peek()).colorSpaces = value;
+ }
+ /**
+ * @return Returns the fonts.
+ */
+ public Map getFonts()
+ {
+ return ((StreamResources) streamResourcesStack.peek()).fonts;
+ }
+ /**
+ * @param value The fonts to set.
+ */
+ public void setFonts(Map value)
+ {
+ ((StreamResources) streamResourcesStack.peek()).fonts = value;
+ }
+ /**
+ * @return Returns the graphicsStack.
+ */
+ public Stack getGraphicsStack()
+ {
+ return graphicsStack;
+ }
+ /**
+ * @param value The graphicsStack to set.
+ */
+ public void setGraphicsStack(Stack value)
+ {
+ graphicsStack = value;
+ }
+ /**
+ * @return Returns the graphicsState.
+ */
+ public PDGraphicsState getGraphicsState()
+ {
+ return graphicsState;
+ }
+ /**
+ * @param value The graphicsState to set.
+ */
+ public void setGraphicsState(PDGraphicsState value)
+ {
+ graphicsState = value;
+ }
+ /**
+ * @return Returns the graphicsStates.
+ */
+ public Map getGraphicsStates()
+ {
+ return ((StreamResources) streamResourcesStack.peek()).graphicsStates;
+ }
+ /**
+ * @param value The graphicsStates to set.
+ */
+ public void setGraphicsStates(Map value)
+ {
+ ((StreamResources) streamResourcesStack.peek()).graphicsStates = value;
+ }
+ /**
+ * @return Returns the textLineMatrix.
+ */
+ public Matrix getTextLineMatrix()
+ {
+ return textLineMatrix;
+ }
+ /**
+ * @param value The textLineMatrix to set.
+ */
+ public void setTextLineMatrix(Matrix value)
+ {
+ textLineMatrix = value;
+ }
+ /**
+ * @return Returns the textMatrix.
+ */
+ public Matrix getTextMatrix()
+ {
+ return textMatrix;
+ }
+ /**
+ * @param value The textMatrix to set.
+ */
+ public void setTextMatrix(Matrix value)
+ {
+ textMatrix = value;
+ }
+ /**
+ * @return Returns the resources.
+ */
+ public PDResources getResources()
+ {
+ return ((StreamResources) streamResourcesStack.peek()).resources;
+ }
+
+ /**
+ * Get the current page that is being processed.
+ *
+ * @return The page being processed.
+ */
+ public PDPage getCurrentPage()
+ {
+ return page;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/util/PDFText2HTML.java b/src/main/java/org/pdfbox/util/PDFText2HTML.java
new file mode 100644
index 0000000..0409eaa
--- /dev/null
+++ b/src/main/java/org/pdfbox/util/PDFText2HTML.java
@@ -0,0 +1,271 @@
+/**
+ * Copyright (c) 2003-2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.util;
+
+import java.io.IOException;
+
+import java.util.Iterator;
+import java.util.List;
+
+import org.pdfbox.pdmodel.PDDocument;
+
+import org.apache.log4j.Logger;
+
+/**
+ * Wrap stripped text in simple HTML, trying to form HTML paragraphs.
+ * Paragraphs broken by pages, columns, or figures are not mended.
+ *
+ *
+ * @author jjb - http://www.johnjbarton.com
+ * @version $Revision: 1.1 $
+ *
+ */
+public class PDFText2HTML extends PDFTextStripper
+{
+ private static Logger log = Logger.getLogger(PDFText2HTML.class);
+ private static final int INITIAL_PDF_TO_HTML_BYTES = 8192;
+
+ private TextPosition beginTitle;
+ private TextPosition afterEndTitle;
+ private String titleGuess;
+ private boolean suppressParagraphs;
+ private boolean onFirstPage = true;
+
+ /**
+ * Constructor.
+ *
+ * @throws IOException If there is an error during initialization.
+ */
+ public PDFText2HTML() throws IOException
+ {
+ titleGuess = "";
+ beginTitle = null;
+ afterEndTitle = null;
+ suppressParagraphs = false;
+ }
+
+ /**
+ * Write the header to the output document.
+ *
+ * @throws IOException If there is a problem writing out the header to the document.
+ */
+ protected void writeHeader() throws IOException
+ {
+ StringBuffer buf = new StringBuffer(INITIAL_PDF_TO_HTML_BYTES);
+ buf.append("<html><head>");
+ buf.append("<title>");
+ buf.append(getTitleGuess());
+ buf.append("</title>");
+ buf.append("</head>");
+ buf.append("<body>\n");
+ getOutput().write(buf.toString());
+ }
+
+ /**
+ * The guess to the document title.
+ *
+ * @return A string that is the title of this document.
+ */
+ protected String getTitleGuess()
+ {
+ return titleGuess;
+ }
+
+ /**
+ * @see PDFTextStripper#flushText
+ */
+ protected void flushText() throws IOException
+ {
+ Iterator textIter = getCharactersByArticle().iterator();
+
+ if (onFirstPage)
+ {
+ guessTitle(textIter);
+ writeHeader();
+ onFirstPage = false;
+ }
+ super.flushText();
+ }
+
+ /**
+ * @see PDFTextStripper#endDocument( PDDocument )
+ */
+ public void endDocument(PDDocument pdf) throws IOException
+ {
+ output.write("</body></html>");
+ }
+
+ /**
+ * This method will attempt to guess the title of the document.
+ *
+ * @param textIter The characters on the first page.
+ * @return The text position that is guessed to be the title.
+ */
+ protected TextPosition guessTitle(Iterator textIter)
+ {
+ float lastFontSize = -1.0f;
+ int stringsInFont = 0;
+ StringBuffer titleText = new StringBuffer();
+ while (textIter.hasNext())
+ {
+ Iterator textByArticle = ((List)textIter.next()).iterator();
+ while( textByArticle.hasNext() )
+ {
+ TextPosition position = (TextPosition) textByArticle.next();
+ float currentFontSize = position.getFontSize();
+ if (currentFontSize != lastFontSize)
+ {
+ if (beginTitle != null)
+ { // font change in candidate title.
+ if (stringsInFont == 0)
+ {
+ beginTitle = null; // false alarm
+ titleText.setLength(0);
+ }
+ else
+ {
+ // had a significant font with some words: call it a title
+ titleGuess = titleText.toString();
+ log.debug("Title candidate =" + titleGuess);
+ afterEndTitle = position;
+ return beginTitle;
+ }
+ }
+ else
+ { // font change and begin == null
+ if (currentFontSize > 13.0f)
+ { // most body text is 12pt max I guess
+ beginTitle = position;
+ }
+ }
+
+ lastFontSize = currentFontSize;
+ stringsInFont = 0;
+ }
+ stringsInFont++;
+ if (beginTitle != null)
+ {
+ titleText.append(position.getCharacter()+" ");
+ }
+ }
+ }
+ return beginTitle; // null
+ }
+
+ /**
+ * Write out the paragraph separator.
+ *
+ * @throws IOException If there is an error writing to the stream.
+ */
+ protected void startParagraph() throws IOException
+ {
+ if (! suppressParagraphs)
+ {
+ getOutput().write("<p>");
+ }
+ }
+ /**
+ * Write out the paragraph separator.
+ *
+ * @throws IOException If there is an error writing to the stream.
+ */
+ protected void endParagraph() throws IOException
+ {
+ if (! suppressParagraphs)
+ {
+ getOutput().write("</p>");
+ }
+ }
+
+ /**
+ * @see PDFTextStripper#writeCharacters( TextPosition )
+ */
+ protected void writeCharacters(TextPosition position ) throws IOException
+ {
+ if (position == beginTitle)
+ {
+ output.write("<H1>");
+ suppressParagraphs = true;
+ }
+ if (position == afterEndTitle)
+ {
+ output.write("</H1>"); // end title and start first paragraph
+ suppressParagraphs = false;
+ }
+
+ String chars = position.getCharacter();
+
+ for (int i = 0; i < chars.length(); i++)
+ {
+ char c = chars.charAt(i);
+ if ((c < 32) || (c > 126))
+ {
+ int charAsInt = c;
+ output.write("&#" + charAsInt + ";");
+ }
+ else
+ {
+ switch (c)
+ {
+ case 34:
+ output.write("&quot;");
+ break;
+ case 38:
+ output.write("&amp;");
+ break;
+ case 60:
+ output.write("&lt;");
+ break;
+ case 62:
+ output.write("&gt;");
+ break;
+ default:
+ output.write(c);
+ }
+ }
+ }
+ }
+
+ /**
+ * @return Returns the suppressParagraphs.
+ */
+ public boolean isSuppressParagraphs()
+ {
+ return suppressParagraphs;
+ }
+ /**
+ * @param shouldSuppressParagraphs The suppressParagraphs to set.
+ */
+ public void setSuppressParagraphs(boolean shouldSuppressParagraphs)
+ {
+ this.suppressParagraphs = shouldSuppressParagraphs;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/util/PDFTextStripper.java b/src/main/java/org/pdfbox/util/PDFTextStripper.java
new file mode 100644
index 0000000..56e80cc
--- /dev/null
+++ b/src/main/java/org/pdfbox/util/PDFTextStripper.java
@@ -0,0 +1,1033 @@
+/**
+ * Copyright (c) 2003-2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.util;
+
+import java.io.IOException;
+import java.io.StringWriter;
+import java.io.Writer;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Vector;
+
+import org.pdfbox.cos.COSDocument;
+import org.pdfbox.cos.COSStream;
+
+import org.pdfbox.pdmodel.PDDocument;
+import org.pdfbox.pdmodel.PDPage;
+
+import org.pdfbox.pdmodel.common.PDRectangle;
+import org.pdfbox.pdmodel.common.PDStream;
+
+import org.pdfbox.pdmodel.encryption.PDEncryptionDictionary;
+import org.pdfbox.pdmodel.encryption.PDStandardEncryption;
+import org.pdfbox.pdmodel.interactive.documentnavigation.outline.PDOutlineItem;
+import org.pdfbox.pdmodel.interactive.pagenavigation.PDThreadBead;
+
+import org.pdfbox.exceptions.CryptographyException;
+import org.pdfbox.exceptions.InvalidPasswordException;
+
+import org.apache.log4j.Logger;
+
+
+/**
+ * This class will take a pdf document and strip out all of the text and ignore the
+ * formatting and such.
+ *
+ * @author Ben Litchfield (ben@benlitchfield.com)
+ * @version $Revision: 1.62 $
+ */
+public class PDFTextStripper extends PDFStreamEngine
+{
+ private static Logger log = Logger.getLogger(PDFTextStripper.class);
+
+ private int currentPageNo = 0;
+ private int startPage = 1;
+ private int endPage = Integer.MAX_VALUE;
+ private PDOutlineItem startBookmark = null;
+ private int startBookmarkPageNumber = -1;
+ private PDOutlineItem endBookmark = null;
+ private int endBookmarkPageNumber = -1;
+ private PDDocument document;
+ private boolean suppressDuplicateOverlappingText = true;
+ private boolean shouldSeparateByBeads = true;
+ private boolean sortByPosition = false;
+
+ private List pageArticles = null;
+ /**
+ * The charactersByArticle is used to extract text by article divisions. For example
+ * a PDF that has two columns like a newspaper, we want to extract the first column and
+ * then the second column. In this example the PDF would have 2 beads(or articles), one for
+ * each column. The size of the charactersByArticle would be 5, because not all text on the
+ * screen will fall into one of the articles. The five divisions are shown below
+ *
+ * Text before first article
+ * first article text
+ * text between first article and second article
+ * second article text
+ * text after second article
+ *
+ * Most PDFs won't have any beads, so charactersByArticle will contain a single entry.
+ */
+ protected Vector charactersByArticle = new Vector();
+
+ private Map characterListMapping = new HashMap();
+
+ private String lineSeparator = System.getProperty("line.separator");
+ private String pageSeparator = System.getProperty("line.separator");
+ private String wordSeparator = " ";
+
+ /**
+ * The stream to write the output to.
+ */
+ protected Writer output;
+
+ /**
+ * Instantiate a new PDFTextStripper object. This object will load properties from
+ * Resources/PDFTextStripper.properties.
+ * @throws IOException If there is an error loading the properties.
+ */
+ public PDFTextStripper() throws IOException
+ {
+ super( ResourceLoader.loadProperties( "Resources/PDFTextStripper.properties" ) );
+ }
+
+ /**
+ * This will return the text of a document. See writeText. <br />
+ * NOTE: The document must not be encrypted when coming into this method.
+ *
+ * @param doc The document to get the text from.
+ *
+ * @return The text of the PDF document.
+ *
+ * @throws IOException if the doc state is invalid or it is encrypted.
+ */
+ public String getText( PDDocument doc ) throws IOException
+ {
+ StringWriter outputStream = new StringWriter();
+ writeText( doc, outputStream );
+ return outputStream.toString();
+ }
+
+ /**
+ * @deprecated
+ * @see PDFTextStripper#getText( PDDocument )
+ * @param doc The document to extract the text from.
+ * @return The document text.
+ * @throws IOException If there is an error extracting the text.
+ */
+ public String getText( COSDocument doc ) throws IOException
+ {
+ return getText( new PDDocument( doc ) );
+ }
+
+ /**
+ * @deprecated
+ * @see PDFTextStripper#writeText( PDDocument, Writer )
+ * @param doc The document to extract the text.
+ * @param outputStream The stream to write the text to.
+ * @throws IOException If there is an error extracting the text.
+ */
+ public void writeText( COSDocument doc, Writer outputStream ) throws IOException
+ {
+ writeText( new PDDocument( doc ), outputStream );
+ }
+
+ /**
+ * This will take a PDDocument and write the text of that document to the print writer.
+ *
+ * @param doc The document to get the data from.
+ * @param outputStream The location to put the text.
+ *
+ * @throws IOException If the doc is in an invalid state.
+ */
+ public void writeText( PDDocument doc, Writer outputStream ) throws IOException
+ {
+
+ PDEncryptionDictionary encDictionary = doc.getEncryptionDictionary();
+
+ //only care about standard encryption and if it was decrypted with the
+ //user password
+ if( encDictionary instanceof PDStandardEncryption &&
+ !doc.wasDecryptedWithOwnerPassword() )
+ {
+ PDStandardEncryption stdEncryption = (PDStandardEncryption)encDictionary;
+ if( !stdEncryption.canExtractContent() )
+ {
+ throw new IOException( "You do not have permission to extract text" );
+ }
+ }
+ currentPageNo = 0;
+ document = doc;
+ output = outputStream;
+ startDocument(document);
+
+ if( document.isEncrypted() )
+ {
+ // We are expecting non-encrypted documents here, but it is common
+ // for users to pass in a document that is encrypted with an empty
+ // password (such a document appears to not be encrypted by
+ // someone viewing the document, thus the confusion). We will
+ // attempt to decrypt with the empty password to handle this case.
+ //
+ log.debug("Document is encrypted, decrypting with empty password");
+ try
+ {
+ document.decrypt("");
+ }
+ catch (CryptographyException e)
+ {
+ throw new IOException("Error decrypting document, details: " + e.getMessage());
+ }
+ catch (InvalidPasswordException e)
+ {
+ throw new IOException("Error: document is encrypted");
+ }
+ }
+
+ processPages( document.getDocumentCatalog().getAllPages() );
+ endDocument(document);
+ }
+
+ /**
+ * This will process all of the pages and the text that is in them.
+ *
+ * @param pages The pages object in the document.
+ *
+ * @throws IOException If there is an error parsing the text.
+ */
+ protected void processPages( List pages ) throws IOException
+ {
+ if( log.isDebugEnabled() )
+ {
+ log.debug( "processPages( " + pages + " )" );
+ }
+
+ if( startBookmark != null )
+ {
+ startBookmarkPageNumber = getPageNumber( startBookmark, pages );
+ }
+
+ if( endBookmark != null )
+ {
+ endBookmarkPageNumber = getPageNumber( endBookmark, pages );
+ }
+
+ if( startBookmarkPageNumber == -1 && startBookmark != null &&
+ endBookmarkPageNumber == -1 && endBookmark != null &&
+ startBookmark.getCOSObject() == endBookmark.getCOSObject() )
+ {
+ //this is a special case where both the start and end bookmark
+ //are the same but point to nothing. In this case
+ //we will not extract any text.
+ startBookmarkPageNumber = 0;
+ endBookmarkPageNumber = 0;
+ }
+
+
+ Iterator pageIter = pages.iterator();
+ while( pageIter.hasNext() )
+ {
+ PDPage nextPage = (PDPage)pageIter.next();
+ PDStream contentStream = nextPage.getContents();
+ if( contentStream != null )
+ {
+ COSStream contents = contentStream.getStream();
+ processPage( nextPage, contents );
+ }
+ }
+ if( log.isDebugEnabled() )
+ {
+ log.debug( "processPages() end" );
+ }
+ }
+
+ private int getPageNumber( PDOutlineItem bookmark, List allPages ) throws IOException
+ {
+ int pageNumber = -1;
+ PDPage page = bookmark.findDestinationPage( document );
+ if( page != null )
+ {
+ pageNumber = allPages.indexOf( page )+1;//use one based indexing
+ }
+ return pageNumber;
+ }
+
+ /**
+ * This method is available for subclasses of this class. It will be called before processing
+ * of the document start.
+ *
+ * @param pdf The PDF document that is being processed.
+ * @throws IOException If an IO error occurs.
+ */
+ protected void startDocument(PDDocument pdf) throws IOException
+ {
+ // no default implementation, but available for subclasses
+ }
+
+ /**
+ * This method is available for subclasses of this class. It will be called after processing
+ * of the document finishes.
+ *
+ * @param pdf The PDF document that is being processed.
+ * @throws IOException If an IO error occurs.
+ */
+ protected void endDocument(PDDocument pdf ) throws IOException
+ {
+ // no default implementation, but available for subclasses
+ }
+
+ /**
+ * This will process the contents of a page.
+ *
+ * @param page The page to process.
+ * @param content The contents of the page.
+ *
+ * @throws IOException If there is an error processing the page.
+ */
+ protected void processPage( PDPage page, COSStream content ) throws IOException
+ {
+ long start = System.currentTimeMillis();
+ if( log.isDebugEnabled() )
+ {
+ log.debug( "processPage( " + page + ", " + content + " )" );
+ }
+ currentPageNo++;
+ if( currentPageNo >= startPage && currentPageNo <= endPage &&
+ (startBookmarkPageNumber == -1 || currentPageNo >= startBookmarkPageNumber ) &&
+ (endBookmarkPageNumber == -1 || currentPageNo <= endBookmarkPageNumber ))
+ {
+ startPage( page );
+ pageArticles = page.getThreadBeads();
+ int numberOfArticleSections = 1 + pageArticles.size() * 2;
+ if( !shouldSeparateByBeads )
+ {
+ numberOfArticleSections = 1;
+ }
+ int originalSize = charactersByArticle.size();
+ charactersByArticle.setSize( numberOfArticleSections );
+ for( int i=0; i<numberOfArticleSections; i++ )
+ {
+ if( numberOfArticleSections < originalSize )
+ {
+ ((List)charactersByArticle.get( i )).clear();
+ }
+ else
+ {
+ charactersByArticle.set( i, new ArrayList() );
+ }
+ }
+
+ characterListMapping.clear();
+ long startProcess = System.currentTimeMillis();
+ processStream( page, page.findResources(), content );
+ long stopProcess = System.currentTimeMillis();
+ long startFlush = System.currentTimeMillis();
+ flushText();
+ long stopFlush = System.currentTimeMillis();
+ if( log.isDebugEnabled() )
+ {
+ log.debug( "processStream time=" + (stopProcess-startProcess) );
+ log.debug( "flushText time=" + (stopFlush-startFlush) );
+ }
+ endPage( page );
+ }
+ long stop = System.currentTimeMillis();
+ if( log.isDebugEnabled() )
+ {
+ log.debug( "processPage() end time=" + (stop-start) );
+ }
+
+ }
+
+ /**
+ * Start a new paragraph. Default implementation is to do nothing. Subclasses
+ * may provide additional information.
+ *
+ * @throws IOException If there is any error writing to the stream.
+ */
+ protected void startParagraph() throws IOException
+ {
+ //default is to do nothing.
+ }
+
+ /**
+ * End a paragraph. Default implementation is to do nothing. Subclasses
+ * may provide additional information.
+ *
+ * @throws IOException If there is any error writing to the stream.
+ */
+ protected void endParagraph() throws IOException
+ {
+ //default is to do nothing
+ }
+
+ /**
+ * Start a new page. Default implementation is to do nothing. Subclasses
+ * may provide additional information.
+ *
+ * @param page The page we are about to process.
+ *
+ * @throws IOException If there is any error writing to the stream.
+ */
+ protected void startPage( PDPage page ) throws IOException
+ {
+ //default is to do nothing.
+ }
+
+ /**
+ * End a page. Default implementation is to do nothing. Subclasses
+ * may provide additional information.
+ *
+ * @param page The page we are about to process.
+ *
+ * @throws IOException If there is any error writing to the stream.
+ */
+ protected void endPage( PDPage page ) throws IOException
+ {
+ //default is to do nothing
+ }
+
+ /**
+ * This will print the text to the output stream.
+ *
+ * @throws IOException If there is an error writing the text.
+ */
+ protected void flushText() throws IOException
+ {
+ if( log.isDebugEnabled() )
+ {
+ log.debug( "flushText() start" );
+ }
+ float currentY = -1;
+ float lastBaselineFontSize = -1;
+ if( log.isDebugEnabled() )
+ {
+ log.debug("<Starting text object list>");
+ }
+ float endOfLastTextX = -1;
+ float startOfNextWordX = -1;
+ float lastWordSpacing = -1;
+ TextPosition lastProcessedCharacter = null;
+
+ for( int i=0; i<charactersByArticle.size(); i++)
+ {
+ startParagraph();
+ List textList = (List)charactersByArticle.get( i );
+ if( sortByPosition )
+ {
+ TextPositionComparator comparator = new TextPositionComparator( getCurrentPage() );
+ Collections.sort( textList, comparator );
+ }
+ Iterator textIter = textList.iterator();
+ while( textIter.hasNext() )
+ {
+ TextPosition position = (TextPosition)textIter.next();
+ String characterValue = position.getCharacter();
+
+ //wordSpacing = position.getWordSpacing();
+ float wordSpacing = 0;
+
+ if( wordSpacing == 0 )
+ {
+ //try to get width of a space character
+ wordSpacing = position.getWidthOfSpace();
+ //if still zero fall back to getting the width of the current
+ //character
+ if( wordSpacing == 0 )
+ {
+ wordSpacing = position.getWidth();
+ }
+ }
+
+
+ // RDD - We add a conservative approximation for space determination.
+ // basically if there is a blank area between two characters that is
+ //equal to some percentage of the word spacing then that will be the
+ //start of the next word
+ if( lastWordSpacing <= 0 )
+ {
+ startOfNextWordX = endOfLastTextX + (wordSpacing* 0.50f);
+ }
+ else
+ {
+ startOfNextWordX = endOfLastTextX + (((wordSpacing+lastWordSpacing)/2f)* 0.50f);
+ }
+
+ lastWordSpacing = wordSpacing;
+
+ // RDD - We will suppress text that is very close to the current line
+ // and which overwrites previously rendered text on this line.
+ // This is done specifically to handle a reasonably common situation
+ // where an application (MS Word, in the case of my examples) renders
+ // text four times at small (1 point) offsets in order to accomplish
+ // bold printing. You would not want to do this step if you were
+ // going to render the TextPosition objects graphically.
+ //
+ /*if ((endOfLastTextX != -1 && position.getX() < endOfLastTextX) &&
+ (currentY != -1 && Math.abs(position.getY() - currentY) < 1))
+ {
+ if (log.isDebugEnabled())
+ {
+ log.debug("Suppressing text overwrite" +
+ " x: " + position.getX() +
+ " endOfLastTextX: " + endOfLastTextX +
+ " string: " + position.getCharacter());
+ }
+ continue;
+ }*/
+
+ // RDD - Here we determine whether this text object is on the current
+ // line. We use the lastBaselineFontSize to handle the superscript
+ // case, and the size of the current font to handle the subscript case.
+ // Text must overlap with the last rendered baseline text by at least
+ // a small amount in order to be considered as being on the same line.
+ //
+ int verticalScaling = 1;
+ if( lastBaselineFontSize < 0 || position.getFontSize() < 0 )
+ {
+ verticalScaling = -1;
+ }
+ if (currentY != -1 &&
+ ((position.getY() < (currentY - (lastBaselineFontSize * 0.9f * verticalScaling))) ||
+ (position.getY() > (currentY + (position.getFontSize() * 0.9f * verticalScaling)))))
+ {
+ if (log.isDebugEnabled())
+ {
+ log.debug("<newline currentY=" + currentY + ", y=" + position.getY() +
+ " fs=" + position.getFontSize()+ " lb fs=" + lastBaselineFontSize + ">");
+ }
+ output.write(lineSeparator);
+ endOfLastTextX = -1;
+ startOfNextWordX = -1;
+ currentY = -1;
+ lastBaselineFontSize = -1;
+ }
+
+ if (startOfNextWordX != -1 && startOfNextWordX < position.getX() &&
+ lastProcessedCharacter != null &&
+ //only bother adding a space if the last character was not a space
+ lastProcessedCharacter.getCharacter() != null &&
+ !lastProcessedCharacter.getCharacter().endsWith( " " ) )
+ {
+ if (log.isDebugEnabled())
+ {
+ log.debug("<space startOfNextWordX=" + startOfNextWordX + ", x=" + position.getX() + ">");
+ }
+ output.write( wordSeparator );
+ }
+
+
+ if (log.isDebugEnabled())
+ {
+ log.debug("flushText" +
+ " x=" + position.getX() +
+ " y=" + position.getY() +
+ " xScale=" + position.getXScale() +
+ " yScale=" + position.getYScale() +
+ " width=" + position.getWidth() +
+ " currentY=" + currentY +
+ " endOfLastTextX=" + endOfLastTextX +
+ " startOfNextWordX=" + startOfNextWordX +
+ " fontSize=" + position.getFontSize() +
+ " wordSpacing=" + wordSpacing +
+ " string=\"" + characterValue + "\"");
+ }
+
+ if (currentY == -1)
+ {
+ currentY = position.getY();
+ }
+
+ if (currentY == position.getY())
+ {
+ lastBaselineFontSize = position.getFontSize();
+ }
+
+ // RDD - endX is what PDF considers to be the x coordinate of the
+ // end position of the text. We use it in computing our metrics below.
+ //
+ endOfLastTextX = position.getX() + position.getWidth();
+
+
+ if (characterValue != null)
+ {
+ output.write(characterValue);
+ }
+ else
+ {
+ log.debug( "Position.getString() is null so not writing anything" );
+ }
+ lastProcessedCharacter = position;
+ }
+ endParagraph();
+ }
+
+
+ // RDD - newline at end of flush - required for end of page (so that the top
+ // of the next page starts on its own line.
+ //
+ if( log.isDebugEnabled() )
+ {
+ log.debug("<newline endOfFlush=\"true\">");
+ }
+ output.write(pageSeparator);
+
+ output.flush();
+ }
+
+ /**
+ * Write the string to the output stream.
+ *
+ * @param text The text to write to the stream.
+ * @throws IOException If there is an error when writing the text.
+ */
+ protected void writeCharacters( TextPosition text ) throws IOException
+ {
+ output.write( text.getCharacter() );
+ }
+
+ /**
+ * This will determine of two floating point numbers are within a specified variance.
+ *
+ * @param first The first number to compare to.
+ * @param second The second number to compare to.
+ * @param variance The allowed variance.
+ */
+ private boolean within( float first, float second, float variance )
+ {
+ return second > first - variance && second < first + variance;
+ }
+
+ /**
+ * This will show add a character to the list of characters to be printed to
+ * the text file.
+ *
+ * @param text The description of the character to display.
+ */
+ protected void showCharacter( TextPosition text )
+ {
+ boolean showCharacter = true;
+ if( suppressDuplicateOverlappingText )
+ {
+ showCharacter = false;
+ String textCharacter = text.getCharacter();
+ float textX = text.getX();
+ float textY = text.getY();
+ List sameTextCharacters = (List)characterListMapping.get( textCharacter );
+ if( sameTextCharacters == null )
+ {
+ sameTextCharacters = new ArrayList();
+ characterListMapping.put( textCharacter, sameTextCharacters );
+ }
+
+ // RDD - Here we compute the value that represents the end of the rendered
+ // text. This value is used to determine whether subsequent text rendered
+ // on the same line overwrites the current text.
+ //
+ // We subtract any positive padding to handle cases where extreme amounts
+ // of padding are applied, then backed off (not sure why this is done, but there
+ // are cases where the padding is on the order of 10x the character width, and
+ // the TJ just backs up to compensate after each character). Also, we subtract
+ // an amount to allow for kerning (a percentage of the width of the last
+ // character).
+ //
+ boolean suppressCharacter = false;
+ float tolerance = (text.getWidth()/textCharacter.length())/3.0f;
+ for( int i=0; i<sameTextCharacters.size() && textCharacter != null; i++ )
+ {
+ TextPosition character = (TextPosition)sameTextCharacters.get( i );
+ String charCharacter = character.getCharacter();
+ float charX = character.getX();
+ float charY = character.getY();
+ //only want to suppress
+
+ if( charCharacter != null &&
+ //charCharacter.equals( textCharacter ) &&
+ within( charX, textX, tolerance ) &&
+ within( charY,
+ textY,
+ tolerance ) )
+ {
+ if( log.isDebugEnabled() )
+ {
+ log.debug("suppressText" +
+ " x=" + charX +
+ " y=" + charY +
+ " width=" + character.getWidth() +
+ " fontSize=" + character.getFontSize() +
+ " string=\"" + charCharacter + "\"");
+ }
+ suppressCharacter = true;
+ }
+ }
+ if( !suppressCharacter )
+ {
+ sameTextCharacters.add( text );
+ showCharacter = true;
+ }
+ }
+
+ if( showCharacter )
+ {
+ //if we are showing the character then we need to determine which
+ //article it belongs to.
+ int foundArticleDivisionIndex = -1;
+ int notFoundButFirstLeftAndAboveArticleDivisionIndex = -1;
+ int notFoundButFirstLeftArticleDivisionIndex = -1;
+ int notFoundButFirstAboveArticleDivisionIndex = -1;
+ float x = text.getX();
+ float y = text.getY();
+ if( shouldSeparateByBeads )
+ {
+ for( int i=0; i<pageArticles.size() && foundArticleDivisionIndex == -1; i++ )
+ {
+ PDThreadBead bead = (PDThreadBead)pageArticles.get( i );
+ if( bead != null )
+ {
+ PDRectangle rect = bead.getRectangle();
+ if( rect.contains( x, y ) )
+ {
+ foundArticleDivisionIndex = i*2+1;
+ }
+ else if( (x < rect.getLowerLeftX() ||
+ y < rect.getUpperRightY()) &&
+ notFoundButFirstLeftAndAboveArticleDivisionIndex == -1)
+ {
+ notFoundButFirstLeftAndAboveArticleDivisionIndex = i*2;
+ }
+ else if( x < rect.getLowerLeftX() &&
+ notFoundButFirstLeftArticleDivisionIndex == -1)
+ {
+ notFoundButFirstLeftArticleDivisionIndex = i*2;
+ }
+ else if( y < rect.getUpperRightY() &&
+ notFoundButFirstAboveArticleDivisionIndex == -1)
+ {
+ notFoundButFirstAboveArticleDivisionIndex = i*2;
+ }
+ }
+ else
+ {
+ foundArticleDivisionIndex = 0;
+ }
+ }
+ }
+ else
+ {
+ foundArticleDivisionIndex = 0;
+ }
+ int articleDivisionIndex = -1;
+ if( foundArticleDivisionIndex != -1 )
+ {
+ articleDivisionIndex = foundArticleDivisionIndex;
+ }
+ else if( notFoundButFirstLeftAndAboveArticleDivisionIndex != -1 )
+ {
+ articleDivisionIndex = notFoundButFirstLeftAndAboveArticleDivisionIndex;
+ }
+ else if( notFoundButFirstLeftArticleDivisionIndex != -1 )
+ {
+ articleDivisionIndex = notFoundButFirstLeftArticleDivisionIndex;
+ }
+ else if( notFoundButFirstAboveArticleDivisionIndex != -1 )
+ {
+ articleDivisionIndex = notFoundButFirstAboveArticleDivisionIndex;
+ }
+ else
+ {
+ articleDivisionIndex = charactersByArticle.size()-1;
+ }
+ List textList = (List) charactersByArticle.get( articleDivisionIndex );
+ textList.add( text );
+ }
+ }
+
+ /**
+ * This is the page that the text extraction will start on. The pages start
+ * at page 1. For example in a 5 page PDF document, if the start page is 1
+ * then all pages will be extracted. If the start page is 4 then pages 4 and 5
+ * will be extracted. The default value is 1.
+ *
+ * @return Value of property startPage.
+ */
+ public int getStartPage()
+ {
+ return startPage;
+ }
+
+ /**
+ * This will set the first page to be extracted by this class.
+ *
+ * @param startPageValue New value of property startPage.
+ */
+ public void setStartPage(int startPageValue)
+ {
+ startPage = startPageValue;
+ }
+
+ /**
+ * This will get the last page that will be extracted. This is inclusive,
+ * for example if a 5 page PDF an endPage value of 5 would extract the
+ * entire document, an end page of 2 would extract pages 1 and 2. This defaults
+ * to Integer.MAX_VALUE such that all pages of the pdf will be extracted.
+ *
+ * @return Value of property endPage.
+ */
+ public int getEndPage()
+ {
+ return endPage;
+ }
+
+ /**
+ * This will set the last page to be extracted by this class.
+ *
+ * @param endPageValue New value of property endPage.
+ */
+ public void setEndPage(int endPageValue)
+ {
+ endPage = endPageValue;
+ }
+
+ /**
+ * Set the desired line separator for output text. The line.separator
+ * system property is used if the line separator preference is not set
+ * explicitly using this method.
+ *
+ * @param separator The desired line separator string.
+ */
+ public void setLineSeparator(String separator)
+ {
+ lineSeparator = separator;
+ }
+
+ /**
+ * This will get the line separator.
+ *
+ * @return The desired line separator string.
+ */
+ public String getLineSeparator()
+ {
+ return lineSeparator;
+ }
+
+ /**
+ * Set the desired page separator for output text. The line.separator
+ * system property is used if the page separator preference is not set
+ * explicitly using this method.
+ *
+ * @param separator The desired page separator string.
+ */
+ public void setPageSeparator(String separator)
+ {
+ pageSeparator = separator;
+ }
+
+ /**
+ * This will get the word separator.
+ *
+ * @return The desired word separator string.
+ */
+ public String getWordSeparator()
+ {
+ return wordSeparator;
+ }
+
+ /**
+ * Set the desired word separator for output text. The PDFBox text extraction
+ * algorithm will output a space character if there is enough space between
+ * two words. By default a space character is used. If you need and accurate
+ * count of characters that are found in a PDF document then you might want to
+ * set the word separator to the empty string.
+ *
+ * @param separator The desired page separator string.
+ */
+ public void setWordSeparator(String separator)
+ {
+ wordSeparator = separator;
+ }
+
+ /**
+ * This will get the page separator.
+ *
+ * @return The page separator string.
+ */
+ public String getPageSeparator()
+ {
+ return pageSeparator;
+ }
+ /**
+ * @return Returns the suppressDuplicateOverlappingText.
+ */
+ public boolean shouldSuppressDuplicateOverlappingText()
+ {
+ return suppressDuplicateOverlappingText;
+ }
+
+ /**
+ * Get the current page number that is being processed.
+ *
+ * @return A 1 based number representing the current page.
+ */
+ protected int getCurrentPageNo()
+ {
+ return currentPageNo;
+ }
+
+ /**
+ * The output stream that is being written to.
+ *
+ * @return The stream that output is being written to.
+ */
+ protected Writer getOutput()
+ {
+ return output;
+ }
+
+ /**
+ * Character strings are grouped by articles. It is quite common that there
+ * will only be a single article. This returns a List that contains List objects,
+ * the inner lists will contain TextPosition objects.
+ *
+ * @return A double List of TextPositions for all text strings on the page.
+ */
+ protected List getCharactersByArticle()
+ {
+ return charactersByArticle;
+ }
+
+ /**
+ * By default the text stripper will attempt to remove text that overlapps each other.
+ * Word paints the same character several times in order to make it look bold. By setting
+ * this to false all text will be extracted, which means that certain sections will be
+ * duplicated, but better performance will be noticed.
+ *
+ * @param suppressDuplicateOverlappingTextValue The suppressDuplicateOverlappingText to set.
+ */
+ public void setSuppressDuplicateOverlappingText(
+ boolean suppressDuplicateOverlappingTextValue)
+ {
+ this.suppressDuplicateOverlappingText = suppressDuplicateOverlappingTextValue;
+ }
+
+ /**
+ * This will tell if the text stripper should separate by beads.
+ *
+ * @return If the text will be grouped by beads.
+ */
+ public boolean shouldSeparateByBeads()
+ {
+ return shouldSeparateByBeads;
+ }
+
+ /**
+ * Set if the text stripper should group the text output by a list of beads. The default value is true!
+ *
+ * @param aShouldSeparateByBeads The new grouping of beads.
+ */
+ public void setShouldSeparateByBeads(boolean aShouldSeparateByBeads)
+ {
+ this.shouldSeparateByBeads = aShouldSeparateByBeads;
+ }
+
+ /**
+ * Get the bookmark where text extraction should end, inclusive. Default is null.
+ *
+ * @return The ending bookmark.
+ */
+ public PDOutlineItem getEndBookmark()
+ {
+ return endBookmark;
+ }
+
+ /**
+ * Set the bookmark where the text extraction should stop.
+ *
+ * @param aEndBookmark The ending bookmark.
+ */
+ public void setEndBookmark(PDOutlineItem aEndBookmark)
+ {
+ endBookmark = aEndBookmark;
+ }
+
+ /**
+ * Get the bookmark where text extraction should start, inclusive. Default is null.
+ *
+ * @return The starting bookmark.
+ */
+ public PDOutlineItem getStartBookmark()
+ {
+ return startBookmark;
+ }
+
+ /**
+ * Set the bookmark where text extraction should start, inclusive.
+ *
+ * @param aStartBookmark The starting bookmark.
+ */
+ public void setStartBookmark(PDOutlineItem aStartBookmark)
+ {
+ startBookmark = aStartBookmark;
+ }
+
+ /**
+ * This will tell if the text stripper should sort the text tokens
+ * before writing to the stream.
+ *
+ * @return true If the text tokens will be sorted before being written.
+ */
+ public boolean shouldSortByPosition()
+ {
+ return sortByPosition;
+ }
+
+ /**
+ * The order of the text tokens in a PDF file may not be in the same
+ * as they appear visually on the screen. For example, a PDF writer may
+ * write out all text by font, so all bold or larger text, then make a second
+ * pass and write out the normal text.<br/>
+ * The default is to <b>not</b> sort by position.<br/>
+ * <br/>
+ * A PDF writer could choose to write each character in a different order. By
+ * default PDFBox does <b>not</b> sort the text tokens before processing them due to
+ * performance reasons.
+ *
+ * @param newSortByPosition Tell PDFBox to sort the text positions.
+ */
+ public void setSortByPosition(boolean newSortByPosition)
+ {
+ sortByPosition = newSortByPosition;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/util/PDFTextStripperByArea.java b/src/main/java/org/pdfbox/util/PDFTextStripperByArea.java
new file mode 100644
index 0000000..91c76a5
--- /dev/null
+++ b/src/main/java/org/pdfbox/util/PDFTextStripperByArea.java
@@ -0,0 +1,165 @@
+/**
+ * Copyright (c) 2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.util;
+
+import java.awt.Rectangle;
+import java.io.IOException;
+import java.io.StringWriter;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Vector;
+
+import org.pdfbox.cos.COSStream;
+import org.pdfbox.pdmodel.PDPage;
+import org.pdfbox.pdmodel.common.PDStream;
+
+/**
+ * This will extract text from a specified region in the PDF.
+ *
+ * @author Ben Litchfield (ben@benlitchfield.com)
+ * @version $Revision: 1.3 $
+ */
+public class PDFTextStripperByArea extends PDFTextStripper
+{
+ private List regions = new ArrayList();
+ private Map regionArea = new HashMap();
+ private Map regionCharacterList = new HashMap();
+ private Map regionText = new HashMap();
+
+ /**
+ * Constructor.
+ * @throws IOException If there is an error loading properties.
+ */
+ public PDFTextStripperByArea() throws IOException
+ {
+ super();
+ }
+
+ /**
+ * Add a new region to group text by.
+ *
+ * @param regionName The name of the region.
+ * @param rect The rectangle area to retrieve the text from.
+ */
+ public void addRegion( String regionName, Rectangle rect )
+ {
+ regions.add( regionName );
+ regionArea.put( regionName, rect );
+ }
+
+ /**
+ * Get the list of regions that have been setup.
+ *
+ * @return A list of java.lang.String objects to identify the region names.
+ */
+ public List getRegions()
+ {
+ return regions;
+ }
+
+ /**
+ * Get the text for the region, this should be called after extractRegions().
+ *
+ * @param regionName The name of the region to get the text from.
+ * @return The text that was identified in that region.
+ */
+ public String getTextForRegion( String regionName )
+ {
+ StringWriter text = (StringWriter)regionText.get( regionName );
+ return text.toString();
+ }
+
+ /**
+ * Process the page to extract the region text.
+ *
+ * @param page The page to extract the regions from.
+ * @throws IOException If there is an error while extracting text.
+ */
+ public void extractRegions( PDPage page ) throws IOException
+ {
+ Iterator regionIter = regions.iterator();
+ while( regionIter.hasNext() )
+ {
+ //reset the stored text for the region so this class
+ //can be reused.
+ String regionName = (String)regionIter.next();
+ Vector regionCharactersByArticle = new Vector();
+ regionCharactersByArticle.add( new ArrayList() );
+ regionCharacterList.put( regionName, regionCharactersByArticle );
+ regionText.put( regionName, new StringWriter() );
+ }
+
+ PDStream contentStream = page.getContents();
+ if( contentStream != null )
+ {
+ COSStream contents = contentStream.getStream();
+ processPage( page, contents );
+ }
+ }
+
+ /**
+ * @see PDFTextStripper#showCharacter(TextPosition)
+ */
+ protected void showCharacter( TextPosition text )
+ {
+ Iterator regionIter = regionArea.keySet().iterator();
+ while( regionIter.hasNext() )
+ {
+ String region = (String)regionIter.next();
+ Rectangle rect = (Rectangle)regionArea.get( region );
+ if( rect.contains( text.getX(), text.getY() ) )
+ {
+ charactersByArticle = (Vector)regionCharacterList.get( region );
+ super.showCharacter( text );
+ }
+ }
+ }
+
+ /**
+ * This will print the text to the output stream.
+ *
+ * @throws IOException If there is an error writing the text.
+ */
+ protected void flushText() throws IOException
+ {
+ Iterator regionIter = regionArea.keySet().iterator();
+ while( regionIter.hasNext() )
+ {
+ String region = (String)regionIter.next();
+ charactersByArticle = (Vector)regionCharacterList.get( region );
+ output = (StringWriter)regionText.get( region );
+ super.flushText();
+ }
+ }
+}
diff --git a/src/main/java/org/pdfbox/util/ResourceLoader.java b/src/main/java/org/pdfbox/util/ResourceLoader.java
new file mode 100644
index 0000000..0f80d09
--- /dev/null
+++ b/src/main/java/org/pdfbox/util/ResourceLoader.java
@@ -0,0 +1,169 @@
+/**
+ * Copyright (c) 2003, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ */
+package org.pdfbox.util;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStream;
+import java.io.IOException;
+
+import java.util.Properties;
+
+import org.apache.log4j.Logger;
+
+/**
+ * This class will handle loading resource files(AFM/CMAP).
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.6 $
+ */
+public class ResourceLoader
+{
+ private static Logger log = Logger.getLogger( ResourceLoader.class );
+
+ /**
+ * private constructor for utility class.
+ */
+ private ResourceLoader()
+ {
+ //private utility class
+ }
+
+ /**
+ * This will attempt to load the resource given the resource name.
+ *
+ * @param resourceName The resource to try and load.
+ *
+ * @return The resource as a stream or null if it could not be found.
+ *
+ * @throws IOException If there is an error while attempting to load the resource.
+ */
+ public static InputStream loadResource( String resourceName ) throws IOException
+ {
+ if( log.isDebugEnabled() )
+ {
+ log.debug( "loadResource( " + resourceName + ")" );
+ }
+
+ ClassLoader loader = ResourceLoader.class.getClassLoader();
+
+ InputStream is = null;
+
+ if( loader != null )
+ {
+ is = loader.getResourceAsStream( resourceName );
+ }
+
+ //see sourceforge bug 863053, this is a fix for a user that
+ //needed to have PDFBox loaded by the bootstrap classloader
+ if( is == null )
+ {
+ loader = ClassLoader.getSystemClassLoader();
+ if( loader != null )
+ {
+ is = loader.getResourceAsStream( resourceName );
+ }
+ }
+
+ if( is == null )
+ {
+ File f = new File( resourceName );
+ if( f.exists() )
+ {
+ is = new FileInputStream( f );
+ }
+ }
+
+ return is;
+ }
+
+ /**
+ * This will attempt to load the resource given the resource name.
+ *
+ * @param resourceName The resource to try and load.
+ *
+ * @return The resource as a stream or null if it could not be found.
+ *
+ * @throws IOException If there is an error loading the properties.
+ */
+ public static Properties loadProperties( String resourceName ) throws IOException
+ {
+ Properties properties = null;
+ InputStream is = null;
+ try
+ {
+ is = loadResource( resourceName );
+ if( is != null )
+ {
+ properties = new Properties();
+ properties.load( is );
+ }
+ }
+ finally
+ {
+ if( is != null )
+ {
+ is.close();
+ }
+ }
+ return properties;
+ }
+
+ /**
+ * This will attempt to load the resource given the resource name.
+ *
+ * @param resourceName The resource to try and load.
+ * @param defaults A stream of default properties.
+ *
+ * @return The resource as a stream or null if it could not be found.
+ *
+ * @throws IOException If there is an error loading the properties.
+ */
+ public static Properties loadProperties( String resourceName, Properties defaults ) throws IOException
+ {
+ InputStream is = null;
+ try
+ {
+ is = loadResource( resourceName );
+ if( is != null )
+ {
+ defaults.load( is );
+ }
+ }
+ finally
+ {
+ if( is != null )
+ {
+ is.close();
+ }
+ }
+ return defaults;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/util/SimpleConfigurator.java b/src/main/java/org/pdfbox/util/SimpleConfigurator.java
new file mode 100644
index 0000000..df94029
--- /dev/null
+++ b/src/main/java/org/pdfbox/util/SimpleConfigurator.java
@@ -0,0 +1,68 @@
+/**
+ * Copyright (c) 2003, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ */
+package org.pdfbox.util;
+
+import java.net.URL;
+
+import org.apache.log4j.BasicConfigurator;
+import org.apache.log4j.Logger;
+import org.apache.log4j.Level;
+
+import org.apache.log4j.spi.Configurator;
+import org.apache.log4j.spi.LoggerRepository;
+
+/**
+ * Log4J configurator.
+ *
+ * @author Robert Dickinson (bob@brutesquadlabs.com)
+ * @version $Revision: 1.2 $
+ */
+public class SimpleConfigurator implements Configurator
+{
+ /**
+ * Constructor.
+ */
+ public SimpleConfigurator()
+ {
+ }
+
+ /**
+ * Interpret a resource pointed to by a URL and set up log4J accordingly.
+ * The configuration is done relative to the <code>heirarchy</code> parameter.
+ *
+ * @param url The URL to parse
+ * @param repository The heirarchy to operate upon
+ */
+ public void doConfigure(URL url, LoggerRepository repository)
+ {
+ BasicConfigurator.configure();
+ Logger.getRootLogger().setLevel(Level.DEBUG);
+ }
+}
diff --git a/src/main/java/org/pdfbox/util/Splitter.java b/src/main/java/org/pdfbox/util/Splitter.java
new file mode 100644
index 0000000..c03a989
--- /dev/null
+++ b/src/main/java/org/pdfbox/util/Splitter.java
@@ -0,0 +1,201 @@
+/**
+ * Copyright (c) 2004-2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.util;
+
+import org.pdfbox.pdmodel.PDDocument;
+import org.pdfbox.pdmodel.PDPage;
+
+import java.io.IOException;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * Split a document into several other documents.
+ *
+ * @author Mario Ivankovits (mario@ops.co.at)
+ * @author Ben Litchfield (ben@benlitchfield.com)
+ * @version $Revision: 1.6 $
+ */
+public class Splitter
+{
+
+ /**
+ * The source PDF document.
+ */
+ protected PDDocument pdfDocument;
+
+ /**
+ * The current PDF document that contains the splitted page.
+ */
+ protected PDDocument currentDocument = null;
+
+ private int splitAtPage=1;
+ private List newDocuments = null;
+
+ /**
+ * The current page number that we are processing, zero based.
+ */
+ protected int pageNumber = 0;
+
+ /**
+ * This will take a document and split into several other documents.
+ *
+ * @param document The document to split.
+ *
+ * @return A list of all the split documents.
+ *
+ * @throws IOException If there is an IOError
+ */
+ public List split( PDDocument document ) throws IOException
+ {
+ newDocuments = new ArrayList();
+ pdfDocument = document;
+
+ List pages = pdfDocument.getDocumentCatalog().getAllPages();
+ processPages(pages);
+ return newDocuments;
+ }
+
+ /**
+ * This will tell the splitting algorithm where to split the pages. The default
+ * is 1, so every page will become a new document. If it was to then each document would
+ * contain 2 pages. So it the source document had 5 pages it would split into
+ * 3 new documents, 2 documents containing 2 pages and 1 document containing one
+ * page.
+ *
+ * @param split The number of pages each split document should contain.
+ */
+ public void setSplitAtPage( int split )
+ {
+ if( split <= 0 )
+ {
+ throw new RuntimeException( "Error split must be at least one page." );
+ }
+ splitAtPage = split;
+ }
+
+ /**
+ * This will return how many pages each split document will contain.
+ *
+ * @return The split parameter.
+ */
+ public int getSplitAtPage()
+ {
+ return splitAtPage;
+ }
+
+ /**
+ * Interface method to handle the start of the page processing.
+ *
+ * @param pages The list of pages from the source document.
+ *
+ * @throws IOException If an IO error occurs.
+ */
+ protected void processPages(List pages) throws IOException
+ {
+ Iterator iter = pages.iterator();
+ while( iter.hasNext() )
+ {
+ PDPage page = (PDPage)iter.next();
+ processNextPage( page );
+ }
+ }
+
+ /**
+ * Interface method, you can control where a document gets split by implementing
+ * this method. By default a split occurs at every page. If you wanted to split
+ * based on some complex logic then you could override this method. For example.
+ * <code>
+ * protected void createNewDocumentIfNecessary()
+ * {
+ * if( isPrime( pageNumber ) )
+ * {
+ * super.createNewDocumentIfNecessary();
+ * }
+ * }
+ * </code>
+ *
+ * @throws IOException If there is an error creating the new document.
+ */
+ protected void createNewDocumentIfNecessary() throws IOException
+ {
+ if (isNewDocNecessary())
+ {
+ createNewDocument();
+ }
+ }
+
+ /**
+ * Check if it is necessary to create a new document.
+ *
+ * @return true If a new document should be created.
+ */
+ protected boolean isNewDocNecessary()
+ {
+ return pageNumber % splitAtPage == 0 || currentDocument == null;
+ }
+
+ /**
+ * Create a new document to write the splitted contents to.
+ *
+ * @throws IOException If there is an problem creating the new document.
+ */
+ protected void createNewDocument() throws IOException
+ {
+ currentDocument = new PDDocument();
+ currentDocument.setDocumentInformation(pdfDocument.getDocumentInformation());
+ currentDocument.getDocumentCatalog().setViewerPreferences(
+ pdfDocument.getDocumentCatalog().getViewerPreferences());
+ newDocuments.add(currentDocument);
+ }
+
+
+
+ /**
+ * Interface to start processing a new page.
+ *
+ * @param page The page that is about to get processed.
+ *
+ * @throws IOException If there is an error creating the new document.
+ */
+ protected void processNextPage( PDPage page ) throws IOException
+ {
+ createNewDocumentIfNecessary();
+ PDPage imported = currentDocument.importPage( page );
+ imported.setCropBox( page.findCropBox() );
+ imported.setMediaBox( page.findMediaBox() );
+ imported.setResources( page.findResources() );
+ imported.setRotation( page.findRotation() );
+ pageNumber++;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/util/TextPosition.java b/src/main/java/org/pdfbox/util/TextPosition.java
new file mode 100644
index 0000000..f44ca56
--- /dev/null
+++ b/src/main/java/org/pdfbox/util/TextPosition.java
@@ -0,0 +1,203 @@
+/**
+ * Copyright (c) 2003-2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.util;
+
+import org.pdfbox.pdmodel.font.PDFont;
+
+/**
+ * This represents a character and a position on the screen of those characters.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.9 $
+ */
+public class TextPosition
+{
+ private float x;
+ private float y;
+ private float xScale;
+ private float yScale;
+ private float width;
+ private float widthOfSpace;
+ private String c;
+ private PDFont font;
+ private float fontSize;
+ private float wordSpacing;
+
+ /**
+ * Constructor.
+ *
+ * @param xPos The x coordinate of the character.
+ * @param yPos The y coordinate of the character.
+ * @param xScl The x scaling of the character.
+ * @param yScl The y scaling of the character.
+ * @param widthValue The width of the character.
+ * @param spaceWidth The width of the space character.
+ * @param string The character to be displayed.
+ * @param currentFont The current for for this text position.
+ * @param fontSizeValue The new font size.
+ * @param ws The word spacing parameter
+ */
+ public TextPosition(
+ float xPos,
+ float yPos,
+ float xScl,
+ float yScl,
+ float widthValue,
+ float spaceWidth,
+ String string,
+ PDFont currentFont,
+ float fontSizeValue,
+ float ws
+ )
+ {
+ this.x = xPos;
+ this.y = yPos;
+ this.xScale = xScl;
+ this.yScale = yScl;
+ this.width = widthValue;
+ this.widthOfSpace = spaceWidth;
+ this.c = string;
+ this.font = currentFont;
+ this.fontSize = fontSizeValue;
+ this.wordSpacing = ws;
+ }
+
+ /**
+ * This will the character that will be displayed on the screen.
+ *
+ * @return The character on the screen.
+ */
+ public String getCharacter()
+ {
+ return c;
+ }
+
+ /**
+ * This will get the x position of the character.
+ *
+ * @return The x coordinate of the character.
+ */
+ public float getX()
+ {
+ return x;
+ }
+
+ /**
+ * This will get the y position of the character.
+ *
+ * @return The y coordinate of the character.
+ */
+ public float getY()
+ {
+ return y;
+ }
+
+ /**
+ * This will get with width of this character.
+ *
+ * @return The width of this character.
+ */
+ public float getWidth()
+ {
+ return width;
+ }
+
+ /**
+ * This will get the font size that this object is
+ * suppose to be drawn at.
+ *
+ * @return The font size.
+ */
+ public float getFontSize()
+ {
+ return fontSize;
+ }
+
+ /**
+ * This will get the font for the text being drawn.
+ *
+ * @return The font size.
+ */
+ public PDFont getFont()
+ {
+ return font;
+ }
+
+ /**
+ * This will get the current word spacing.
+ *
+ * @return The current word spacing.
+ */
+ public float getWordSpacing()
+ {
+ return wordSpacing;
+ }
+
+ /**
+ * This will get the width of a space character. This is useful for some
+ * algorithms such as the text stripper, that need to know the width of a
+ * space character.
+ *
+ * @return The width of a space character.
+ */
+ public float getWidthOfSpace()
+ {
+ return widthOfSpace;
+ }
+ /**
+ * @return Returns the xScale.
+ */
+ public float getXScale()
+ {
+ return xScale;
+ }
+ /**
+ * @param scale The xScale to set.
+ */
+ public void setXScale(float scale)
+ {
+ xScale = scale;
+ }
+ /**
+ * @return Returns the yScale.
+ */
+ public float getYScale()
+ {
+ return yScale;
+ }
+ /**
+ * @param scale The yScale to set.
+ */
+ public void setYScale(float scale)
+ {
+ yScale = scale;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/util/TextPositionComparator.java b/src/main/java/org/pdfbox/util/TextPositionComparator.java
new file mode 100644
index 0000000..fab6a6e
--- /dev/null
+++ b/src/main/java/org/pdfbox/util/TextPositionComparator.java
@@ -0,0 +1,126 @@
+/**
+ * Copyright (c) 2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.util;
+
+import java.util.Comparator;
+
+import org.pdfbox.pdmodel.PDPage;
+
+/**
+ * This class is a comparator for TextPosition operators.
+ *
+ * @author Ben Litchfield (ben@benlitchfield.com)
+ * @version $Revision: 1.2 $
+ */
+public class TextPositionComparator implements Comparator
+{
+ private PDPage thePage = null;
+
+ /**
+ * Constuctor, comparison of TextPosition depends on the rotation
+ * of the page.
+ * @param page The page that the text position is on.
+ */
+ public TextPositionComparator( PDPage page )
+ {
+ thePage = page;
+ }
+
+ /**
+ * @see Comparator#compare(java.lang.Object, java.lang.Object)
+ */
+ public int compare(Object o1, Object o2)
+ {
+ int retval = 0;
+ TextPosition pos1 = (TextPosition)o1;
+ TextPosition pos2 = (TextPosition)o2;
+ int rotation = thePage.findRotation();
+ float x1 = 0;
+ float x2 = 0;
+ float y1 = 0;
+ float y2 = 0;
+ if( rotation == 0 )
+ {
+ x1 = pos1.getX();
+ x2 = pos2.getX();
+ y1 = pos1.getY();
+ y2 = pos2.getY();
+ }
+ else if( rotation == 90 )
+ {
+ x1 = pos1.getY();
+ x2 = pos2.getX();
+ y1 = pos1.getX();
+ y2 = pos2.getY();
+ }
+ else if( rotation == 180 )
+ {
+ x1 = -pos1.getX();
+ x2 = -pos2.getX();
+ y1 = -pos1.getY();
+ y2 = -pos2.getY();
+ }
+ else if( rotation == 270 )
+ {
+ x1 = -pos1.getY();
+ x2 = -pos2.getY();
+ y1 = -pos1.getX();
+ y2 = -pos2.getX();
+ }
+
+ if( y1 < y2 )
+ {
+ retval = -1;
+ }
+ else if( y1 > y2 )
+ {
+ return 1;
+ }
+ else
+ {
+ if( x1 < x2 )
+ {
+ retval = -1;
+ }
+ else if( x1 > x2 )
+ {
+ retval = 1;
+ }
+ else
+ {
+ retval = 0;
+ }
+ }
+
+ return retval;
+ }
+
+} \ No newline at end of file
diff --git a/src/main/java/org/pdfbox/util/XMLUtil.java b/src/main/java/org/pdfbox/util/XMLUtil.java
new file mode 100644
index 0000000..1798aa2
--- /dev/null
+++ b/src/main/java/org/pdfbox/util/XMLUtil.java
@@ -0,0 +1,103 @@
+/**
+ * Copyright (c) 2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.util;
+
+import java.io.InputStream;
+import java.io.IOException;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.w3c.dom.Text;
+
+/**
+ * This class with handle some simple XML operations.
+ *
+ * @author blitchfield
+ * @version $Revision: 1.2 $
+ */
+public class XMLUtil
+{
+ /**
+ * Utility class, should not be instantiated.
+ *
+ */
+ private XMLUtil()
+ {
+ }
+
+ /**
+ * This will parse an XML stream and create a DOM document.
+ *
+ * @param is The stream to get the XML from.
+ * @return The DOM document.
+ * @throws IOException It there is an error creating the dom.
+ */
+ public static Document parse( InputStream is ) throws IOException
+ {
+ try
+ {
+ DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
+ DocumentBuilder builder = builderFactory.newDocumentBuilder();
+ return builder.parse( is );
+ }
+ catch( Exception e )
+ {
+ IOException thrown = new IOException( e.getMessage() );
+ throw thrown;
+ }
+ }
+
+ /**
+ * This will get the text value of an element.
+ *
+ * @param node The node to get the text value for.
+ * @return The text of the node.
+ */
+ public static String getNodeValue( Element node )
+ {
+ String retval = "";
+ NodeList children = node.getChildNodes();
+ for( int i=0; i<children.getLength(); i++ )
+ {
+ Node next = children.item( i );
+ if( next instanceof Text )
+ {
+ retval = next.getNodeValue();
+ }
+ }
+ return retval;
+ }
+}
diff --git a/src/main/java/org/pdfbox/util/operator/BeginText.java b/src/main/java/org/pdfbox/util/operator/BeginText.java
new file mode 100644
index 0000000..2b6af60
--- /dev/null
+++ b/src/main/java/org/pdfbox/util/operator/BeginText.java
@@ -0,0 +1,68 @@
+/**
+ * Copyright (c) 2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.util.operator;
+
+import java.util.List;
+import org.apache.log4j.Logger;
+import org.pdfbox.util.Matrix;
+import org.pdfbox.util.PDFOperator;
+
+/**
+ *
+ * <p>Titre : PDFEngine Modification.</p>
+ * <p>Description : Structal modification of the PDFEngine class :
+* the long sequence of conditions in processOperator is remplaced
+* by this strategy pattern</p>
+ * <p>Copyright : Copyright (c) 2004</p>
+ * <p>Société : DBGS</p>
+ * @author Huault : huault@free.fr
+ * @version $Revision: 1.3 $
+ */
+public class BeginText extends OperatorProcessor
+{
+
+ private static final Logger LOG = Logger.getLogger(BeginText.class);
+
+ /**
+ * process : BT : Begin text object.
+ * @param operator The operator that is being executed.
+ * @param arguments List
+ */
+ public void process(PDFOperator operator, List arguments)
+ {
+ if( LOG.isDebugEnabled() )
+ {
+ LOG.debug("<BT> " + this.toString()+ " from " + context.toString());
+ }
+ context.setTextMatrix( new Matrix());
+ context.setTextLineMatrix( new Matrix() );
+ }
+}
diff --git a/src/main/java/org/pdfbox/util/operator/Concatenate.java b/src/main/java/org/pdfbox/util/operator/Concatenate.java
new file mode 100644
index 0000000..7fc986c
--- /dev/null
+++ b/src/main/java/org/pdfbox/util/operator/Concatenate.java
@@ -0,0 +1,106 @@
+/**
+ * Copyright (c) 2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.util.operator;
+
+import java.util.List;
+import org.pdfbox.cos.COSNumber;
+import org.apache.log4j.Logger;
+import org.pdfbox.util.Matrix;
+import org.pdfbox.util.PDFOperator;
+
+/**
+ *
+ * <p>Titre : PDFEngine Modification.</p>
+ * <p>Description : Structal modification of the PDFEngine class :
+* the long sequence of conditions in processOperator is remplaced by
+* this strategy pattern</p>
+ * <p>Copyright : Copyright (c) 2004</p>
+ * <p>Société : DBGS</p>
+ * @author Huault : huault@free.fr
+ * @version $Revision: 1.3 $
+ */
+
+public class Concatenate extends OperatorProcessor
+{
+
+ private static final Logger LOG = Logger.getLogger(Concatenate.class);
+
+ /**
+ * process : cm : Concatenate matrix to current transformation matrix.
+ * @param operator The operator that is being executed.
+ * @param arguments List
+ */
+ public void process(PDFOperator operator, List arguments)
+ {
+
+ //concatenate matrix to current transformation matrix
+ COSNumber a = (COSNumber) arguments.get(0);
+ COSNumber b = (COSNumber) arguments.get(1);
+ COSNumber c = (COSNumber) arguments.get(2);
+ COSNumber d = (COSNumber) arguments.get(3);
+ COSNumber e = (COSNumber) arguments.get(4);
+ COSNumber f = (COSNumber) arguments.get(5);
+
+ if( LOG.isDebugEnabled() )
+ {
+ LOG.debug("<cm " +
+ "a=\"" + a.floatValue() + "\" " +
+ "b=\"" + b.floatValue() + "\" " +
+ "c=\"" + c.floatValue() + "\" " +
+ "d=\"" + d.floatValue() + "\" " +
+ "e=\"" + e.floatValue() + "\" " +
+ "f=\"" + f.floatValue() + "\" > " +
+ this.toString() + " from " + context.toString());
+ }
+
+ Matrix newMatrix = new Matrix();
+ newMatrix.setValue(0, 0, a.floatValue());
+ newMatrix.setValue(0, 1, b.floatValue());
+ newMatrix.setValue(1, 0, c.floatValue());
+ newMatrix.setValue(1, 1, d.floatValue());
+ newMatrix.setValue(2, 0, e.floatValue());
+ newMatrix.setValue(2, 1, f.floatValue());
+
+ // wprinz: BUG Fix:
+ // In PDF, matrices have to be multiplied from left to right
+ // (the new matrix is left, the old one(s) are right)
+
+ Matrix old_ctm = context.getGraphicsState().getCurrentTransformationMatrix();
+ Matrix matrix_to_concat = newMatrix;
+ Matrix new_ctm = matrix_to_concat.multiply(old_ctm);
+ context.getGraphicsState().setCurrentTransformationMatrix(
+ new_ctm );
+
+ // :wprinz
+
+ }
+
+}
diff --git a/src/main/java/org/pdfbox/util/operator/EndText.java b/src/main/java/org/pdfbox/util/operator/EndText.java
new file mode 100644
index 0000000..2794ccf
--- /dev/null
+++ b/src/main/java/org/pdfbox/util/operator/EndText.java
@@ -0,0 +1,67 @@
+/**
+ * Copyright (c) 2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.util.operator;
+
+import java.util.List;
+import org.apache.log4j.Logger;
+import org.pdfbox.util.PDFOperator;
+/**
+ *
+ * <p>Titre : PDFEngine Modification.</p>
+ * <p>Description : Structal modification of the PDFEngine class : the
+* long sequence of conditions in processOperator is remplaced by
+* this strategy pattern</p>
+ * <p>Copyright : Copyright (c) 2004</p>
+ * <p>Société : DBGS</p>
+ * @author Huault : huault@free.fr
+ * @version $Revision: 1.3 $
+ */
+public class EndText extends OperatorProcessor
+{
+
+ private static final Logger LOG = Logger.getLogger(EndText.class);
+
+ /**
+ * process : ET : End text object.
+ * @param operator The operator that is being executed.
+ * @param arguments List
+ */
+ public void process(PDFOperator operator, List arguments)
+ {
+ if( LOG.isDebugEnabled() )
+ {
+ LOG.debug("<ET> "+ this.toString());
+ }
+ context.setTextMatrix( null);
+ context.setTextLineMatrix( null);
+ }
+
+}
diff --git a/src/main/java/org/pdfbox/util/operator/GRestore.java b/src/main/java/org/pdfbox/util/operator/GRestore.java
new file mode 100644
index 0000000..c07b8d8
--- /dev/null
+++ b/src/main/java/org/pdfbox/util/operator/GRestore.java
@@ -0,0 +1,67 @@
+/**
+ * Copyright (c) 2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.util.operator;
+
+import org.apache.log4j.Logger;
+import java.util.List;
+
+import org.pdfbox.pdmodel.graphics.PDGraphicsState;
+import org.pdfbox.util.PDFOperator;
+
+/**
+ *
+ * <p>Titre : PDFEngine Modification.</p>
+ * <p>Description : Structal modification of the PDFEngine class : the long sequence of
+ * conditions in processOperator is remplaced by this strategy pattern</p>
+ * <p>Copyright : Copyright (c) 2004</p>
+ * <p>Société : DBGS</p>
+ * @author Huault : huault@free.fr
+ * @version $Revision: 1.3 $
+ */
+public class GRestore extends OperatorProcessor
+{
+ private static final Logger LOG = Logger.getLogger(GRestore.class);
+
+
+ /**
+ * process : Q : Restore graphics state.
+ * @param operator The operator that is being executed.
+ * @param arguments List
+ */
+ public void process(PDFOperator operator, List arguments)
+ {
+ if( LOG.isDebugEnabled() )
+ {
+ LOG.debug("<Q> - restore state" + this.toString());
+ }
+ context.setGraphicsState( (PDGraphicsState)context.getGraphicsStack().pop() );
+ }
+}
diff --git a/src/main/java/org/pdfbox/util/operator/GSave.java b/src/main/java/org/pdfbox/util/operator/GSave.java
new file mode 100644
index 0000000..6a754b6
--- /dev/null
+++ b/src/main/java/org/pdfbox/util/operator/GSave.java
@@ -0,0 +1,66 @@
+/**
+ * Copyright (c) 2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.util.operator;
+
+import java.util.List;
+import org.apache.log4j.Logger;
+import org.pdfbox.util.PDFOperator;
+
+/**
+ *
+ * <p>Titre : PDFEngine Modification.</p>
+ * <p>Description : Structal modification of the PDFEngine class : the long sequence of
+ * conditions in processOperator is remplaced by this strategy pattern</p>
+ * <p>Copyright : Copyright (c) 2004</p>
+ * <p>Société : DBGS</p>
+ * @author Huault : huault@free.fr
+ * @version $Revision: 1.3 $
+ */
+
+public class GSave extends OperatorProcessor
+{
+ private static final Logger LOG = Logger.getLogger(GSave.class);
+
+ /**
+ * process : q : Save graphics state.
+ * @param operator The operator that is being executed.
+ * @param arguments List
+ */
+ public void process(PDFOperator operator, List arguments)
+ {
+ if( LOG.isDebugEnabled() )
+ {
+ LOG.debug("<q> - save state " + this.toString());
+ }
+ context.getGraphicsStack().push( context.getGraphicsState().clone() );
+ }
+
+}
diff --git a/src/main/java/org/pdfbox/util/operator/Invoke.java b/src/main/java/org/pdfbox/util/operator/Invoke.java
new file mode 100644
index 0000000..2f8f789
--- /dev/null
+++ b/src/main/java/org/pdfbox/util/operator/Invoke.java
@@ -0,0 +1,113 @@
+/**
+ * Copyright (c) 2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.util.operator;
+
+import org.apache.log4j.Logger;
+import org.pdfbox.cos.COSName;
+import org.pdfbox.cos.COSStream;
+import org.pdfbox.pdmodel.PDPage;
+import org.pdfbox.pdmodel.PDResources;
+import org.pdfbox.pdmodel.graphics.xobject.PDXObject;
+import org.pdfbox.pdmodel.graphics.xobject.PDXObjectForm;
+import org.pdfbox.util.PDFOperator;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.Set;
+import java.util.TreeSet;
+import java.util.Map;
+
+/**
+ * Invoke named XObject.
+ *
+ * @author Ben Litchfield (ben@benlitchfield.com)
+ * @author Mario Ivankovits
+ *
+ * @version $Revision: 1.6 $
+ */
+public class Invoke extends OperatorProcessor
+{
+ private static final Logger LOG = Logger.getLogger(Invoke.class);
+
+ private Set inProcess = new TreeSet();
+
+ /**
+ * process : Do - Invoke a named xobject.
+ * @param operator The operator that is being executed.
+ * @param arguments List
+ *
+ * @throws IOException If there is an error processing this operator.
+ */
+ public void process(PDFOperator operator, List arguments) throws IOException
+ {
+ COSName name = (COSName) arguments.get( 0 );
+ if (LOG.isDebugEnabled())
+ {
+ LOG.debug("<Do name=\"" + name.getName() + "\">");
+ }
+
+ // wprinz: allow recursive processing so that nested xobject forms are correctly dealt with
+// if (inProcess.contains(name))
+// {
+// // avoid recursive loop
+// return;
+// }
+ // /wprinz
+
+ inProcess.add(name);
+
+ try
+ {
+ //PDResources res = context.getResources();
+
+ Map xobjects = context.getXObjects();
+ PDXObject xobject = (PDXObject) xobjects.get(name.getName());
+
+ if(xobject instanceof PDXObjectForm)
+ {
+ PDXObjectForm form = (PDXObjectForm)xobject;
+ COSStream invoke = (COSStream)form.getCOSObject();
+ PDResources pdResources = form.getResources();
+ PDPage page = context.getCurrentPage();
+ if(pdResources == null)
+ {
+ pdResources = page.findResources();
+ }
+
+ getContext().processSubStream( page, pdResources, invoke );
+ }
+ }
+ finally
+ {
+ inProcess.remove(name);
+ }
+ }
+}
diff --git a/src/main/java/org/pdfbox/util/operator/MoveAndShow.java b/src/main/java/org/pdfbox/util/operator/MoveAndShow.java
new file mode 100644
index 0000000..ca3a3f9
--- /dev/null
+++ b/src/main/java/org/pdfbox/util/operator/MoveAndShow.java
@@ -0,0 +1,75 @@
+/**
+ * Copyright (c) 2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.util.operator;
+
+import java.util.List;
+import org.apache.log4j.Logger;
+import org.pdfbox.cos.COSString;
+import org.pdfbox.util.PDFOperator;
+
+import java.io.IOException;
+
+/**
+ * <p>Titre : PDFEngine Modification.</p>
+ * <p>Description : Structal modification of the PDFEngine class :
+* the long sequence of conditions in processOperator is remplaced by
+* this strategy pattern</p>
+ * <p>Copyright : Copyright (c) 2004</p>
+ * <p>Société : DBGS</p>
+ * @author Huault : huault@free.fr
+ * @version $Revision: 1.4 $
+ */
+public class MoveAndShow extends OperatorProcessor
+{
+
+ private static final Logger LOG = Logger.getLogger(MoveAndShow.class);
+
+ /**
+ * ' Move to next line and show text.
+ * @param arguments List
+ * @param operator The operator that is being executed.
+ * @throws IOException If there is an error processing the operator.
+ */
+ public void process(PDFOperator operator, List arguments) throws IOException
+ {
+ // Move to start of next text line, and show text
+ //
+ if( LOG.isDebugEnabled())
+ {
+ COSString string = (COSString)arguments.get( 0 );
+ LOG.debug("<' string=\"" + string.getString() + "\">");
+ }
+
+ context.processOperator("T*", null);
+ context.processOperator("Tj", arguments);
+ }
+
+}
diff --git a/src/main/java/org/pdfbox/util/operator/MoveText.java b/src/main/java/org/pdfbox/util/operator/MoveText.java
new file mode 100644
index 0000000..10360bb
--- /dev/null
+++ b/src/main/java/org/pdfbox/util/operator/MoveText.java
@@ -0,0 +1,76 @@
+/**
+ * Copyright (c) 2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.util.operator;
+
+import java.util.List;
+import org.apache.log4j.Logger;
+import org.pdfbox.cos.COSNumber;
+import org.pdfbox.util.Matrix;
+import org.pdfbox.util.PDFOperator;
+
+/**
+ *
+ * <p>Titre : PDFEngine Modification.</p>
+ * <p>Description : Structal modification of the PDFEngine class :
+ * the long sequence of conditions in processOperator is remplaced by
+ * this strategy pattern</p>
+ * <p>Copyright : Copyright (c) 2004</p>
+ * <p>Société : DBGS</p>
+ * @author Huault : huault@free.fr
+ * @version $Revision: 1.3 $
+ */
+public class MoveText extends OperatorProcessor
+{
+ private static final Logger LOG = Logger.getLogger(MoveText.class);
+
+
+ /**
+ * process : Td : Move text position.
+ * @param operator The operator that is being executed.
+ * @param arguments List
+ */
+ public void process(PDFOperator operator, List arguments)
+ {
+ COSNumber x = (COSNumber)arguments.get( 0 );
+ COSNumber y = (COSNumber)arguments.get( 1 );
+ if (LOG.isDebugEnabled())
+ {
+ LOG.debug("<Td x=\"" + x.floatValue() + "\" y=\"" + y.floatValue() + "\">");
+ }
+ Matrix td = new Matrix();
+ td.setValue( 2, 0, x.floatValue() );//.* textMatrix.getValue(0,0) );
+ td.setValue( 2, 1, y.floatValue() );//* textMatrix.getValue(1,1) );
+ //log.debug( "textLineMatrix before " + textLineMatrix );
+ context.setTextLineMatrix( td.multiply( context.getTextLineMatrix() ) ); //textLineMatrix.multiply( td );
+ //log.debug( "textLineMatrix after " + textLineMatrix );
+ context.setTextMatrix( context.getTextLineMatrix().copy() );
+ }
+}
diff --git a/src/main/java/org/pdfbox/util/operator/MoveTextSetLeading.java b/src/main/java/org/pdfbox/util/operator/MoveTextSetLeading.java
new file mode 100644
index 0000000..e68a1d1
--- /dev/null
+++ b/src/main/java/org/pdfbox/util/operator/MoveTextSetLeading.java
@@ -0,0 +1,80 @@
+/**
+ * Copyright (c) 2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.util.operator;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import org.apache.log4j.Logger;
+import org.pdfbox.cos.COSFloat;
+import org.pdfbox.cos.COSNumber;
+import org.pdfbox.util.PDFOperator;
+
+/**
+ *
+ * <p>Titre : PDFEngine Modification.</p>
+ * <p>Description : Structal modification of the PDFEngine class :
+ * the long sequence of conditions in processOperator is remplaced by
+ * this strategy pattern</p>
+ * <p>Copyright : Copyright (c) 2004</p>
+ * <p>Société : DBGS</p>
+ * @author Huault : huault@free.fr
+ * @version $Revision: 1.4 $
+ */
+public class MoveTextSetLeading extends OperatorProcessor
+{
+
+ private static final Logger LOG = Logger.getLogger(MoveTextSetLeading.class);
+
+ /**
+ * process : TD Move text position and set leading.
+ * @param operator The operator that is being executed.
+ * @param arguments List
+ *
+ * @throws IOException If there is an error during processing.
+ */
+ public void process(PDFOperator operator, List arguments) throws IOException
+ {
+ //move text position and set leading
+ COSNumber y = (COSNumber)arguments.get( 1 );
+ if (LOG.isDebugEnabled())
+ {
+ COSNumber x = (COSNumber)arguments.get( 0 );
+ LOG.debug("<TD x=\"" + x.floatValue() + "\" y=\"" + y.floatValue() + "\">");
+ }
+
+ ArrayList args = new ArrayList();
+ args.add(new COSFloat(-1*y.floatValue()));
+ context.processOperator("TL", args);
+ context.processOperator("Td", arguments);
+
+ }
+}
diff --git a/src/main/java/org/pdfbox/util/operator/NextLine.java b/src/main/java/org/pdfbox/util/operator/NextLine.java
new file mode 100644
index 0000000..daa35eb
--- /dev/null
+++ b/src/main/java/org/pdfbox/util/operator/NextLine.java
@@ -0,0 +1,82 @@
+/**
+ * Copyright (c) 2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.util.operator;
+
+import org.apache.log4j.Logger;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.pdfbox.cos.COSFloat;
+import org.pdfbox.util.PDFOperator;
+
+/**
+ *
+ * <p>Titre : PDFEngine Modification.</p>
+ * <p>Description : Structal modification of the PDFEngine class : the long sequence of
+ * conditions in processOperator is remplaced by this strategy pattern</p>
+ * <p>Copyright : Copyright (c) 2004</p>
+ * <p>Société : DBGS</p>
+ * @author Huault : huault@free.fr
+ * @version $Revision: 1.4 $
+ */
+public class NextLine extends OperatorProcessor
+{
+
+ private static final Logger LOG = Logger.getLogger(NextLine.class);
+
+ /**
+ * process : T* Move to start of next text line.
+ * @param operator The operator that is being executed.
+ * @param arguments List
+ *
+ * @throws IOException If there is an error during processing.
+ */
+ public void process(PDFOperator operator, List arguments) throws IOException
+ {
+
+ if (LOG.isDebugEnabled())
+ {
+ LOG.debug("<T* graphicsState.getTextState().getLeading()=\"" +
+ context.getGraphicsState().getTextState().getLeading() + "\">");
+ }
+ //move to start of next text line
+ ArrayList args = new ArrayList();
+ args.add(new COSFloat(0.0f));
+ // this must be -leading instead of just leading as written in the
+ // specification (p.369) the acrobat reader seems to implement it the same way
+ args.add(new COSFloat(-1*context.getGraphicsState().getTextState().getLeading()));
+ // use Td instead of repeating code
+ context.processOperator("Td", args);
+
+ }
+}
diff --git a/src/main/java/org/pdfbox/util/operator/OperatorProcessor.java b/src/main/java/org/pdfbox/util/operator/OperatorProcessor.java
new file mode 100644
index 0000000..27c21b9
--- /dev/null
+++ b/src/main/java/org/pdfbox/util/operator/OperatorProcessor.java
@@ -0,0 +1,93 @@
+/**
+ * Copyright (c) 2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.util.operator;
+
+import org.pdfbox.util.PDFOperator;
+import org.pdfbox.util.PDFStreamEngine;
+import java.util.List;
+import java.io.IOException;
+
+/**
+ *
+ * <p>Titre : OperatorProcessor</p>
+ * <p>Description : This class is the strategy abstract class
+ * in the strategy GOF pattern. After instancated, you must ever call
+* the setContext method to initiamise OPeratorProcessor</p>
+ * <p>Copyright : Copyright (c) 2004</p>
+ * <p>Société : DBGS</p>
+ * @author Huault : huault@free.fr
+ * @version $Revision: 1.3 $
+ */
+public abstract class OperatorProcessor
+{
+
+ /**
+ * The stream engine processing context.
+ */
+ protected PDFStreamEngine context = null;
+
+ /**
+ * Constructor.
+ *
+ */
+ protected OperatorProcessor()
+ {
+ }
+
+ /**
+ * Get the context for processing.
+ *
+ * @return The processing context.
+ */
+ protected PDFStreamEngine getContext()
+ {
+ return context;
+ }
+
+ /**
+ * Set the processing context.
+ *
+ * @param ctx The context for processing.
+ */
+ public void setContext(PDFStreamEngine ctx)
+ {
+ context = ctx;
+ }
+
+ /**
+ * process the operator.
+ * @param operator The operator that is being processed.
+ * @param arguments arguments needed by this operator.
+ *
+ * @throws IOException If there is an error processing the operator.
+ */
+ public abstract void process(PDFOperator operator, List arguments) throws IOException;
+}
diff --git a/src/main/java/org/pdfbox/util/operator/SetCharSpacing.java b/src/main/java/org/pdfbox/util/operator/SetCharSpacing.java
new file mode 100644
index 0000000..6813dce
--- /dev/null
+++ b/src/main/java/org/pdfbox/util/operator/SetCharSpacing.java
@@ -0,0 +1,79 @@
+/**
+ * Copyright (c) 2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.util.operator;
+
+import java.util.List;
+import org.apache.log4j.Logger;
+import org.pdfbox.cos.COSNumber;
+import org.pdfbox.util.PDFOperator;
+
+/**
+ *
+ * <p>Titre : PDFEngine Modification.</p>
+ * <p>Description : Structal modification of the PDFEngine class :
+ * the long sequence of conditions in processOperator is remplaced by
+ * this strategy pattern</p>
+ * <p>Copyright : Copyright (c) 2004</p>
+ * <p>Société : DBGS</p>
+ * @author Huault : huault@free.fr
+ * @version $Revision: 1.4 $
+ */
+public class SetCharSpacing extends OperatorProcessor
+{
+
+ private static final Logger LOG = Logger.getLogger(SetCharSpacing.class);
+
+ /**
+ * process : Tc Set character spacing.
+ * @param operator The operator that is being executed.
+ * @param arguments List
+ */
+ public void process(PDFOperator operator, List arguments)
+ {
+ //set character spacing
+ if( arguments.size() > 0 )
+ {
+ //There are some documents which are incorrectly structured, and have
+ //a wrong number of arguments to this, so we will assume the last argument
+ //in the list
+ Object charSpacing = arguments.get( arguments.size()-1 );
+ if( charSpacing instanceof COSNumber )
+ {
+ COSNumber characterSpacing = (COSNumber)charSpacing;
+ if (LOG.isDebugEnabled())
+ {
+ LOG.debug("<Tc characterSpacing=\"" + characterSpacing.floatValue() + "\" />");
+ }
+ context.getGraphicsState().getTextState().setCharacterSpacing( characterSpacing.floatValue() );
+ }
+ }
+ }
+}
diff --git a/src/main/java/org/pdfbox/util/operator/SetGraphicsStateParameters.java b/src/main/java/org/pdfbox/util/operator/SetGraphicsStateParameters.java
new file mode 100644
index 0000000..e72e05d
--- /dev/null
+++ b/src/main/java/org/pdfbox/util/operator/SetGraphicsStateParameters.java
@@ -0,0 +1,72 @@
+/**
+ * Copyright (c) 2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.util.operator;
+
+import java.util.List;
+import org.apache.log4j.Logger;
+import org.pdfbox.cos.COSName;
+import org.pdfbox.pdmodel.graphics.PDExtendedGraphicsState;
+import org.pdfbox.util.PDFOperator;
+
+import java.io.IOException;
+
+/**
+ * <p>Structal modification of the PDFEngine class :
+ * the long sequence of conditions in processOperator is remplaced by
+ * this strategy pattern.</p>
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.3 $
+ */
+
+public class SetGraphicsStateParameters extends OperatorProcessor
+{
+ private static final Logger LOG = Logger.getLogger(SetTextFont.class);
+
+ /**
+ * gs Set parameters from graphics state parameter dictionary.
+ * @param operator The operator that is being executed.
+ * @param arguments List
+ * @throws IOException If an error occurs while processing the font.
+ */
+ public void process(PDFOperator operator, List arguments) throws IOException
+ {
+ //set parameters from graphics state parameter dictionary
+ COSName graphicsName = (COSName)arguments.get( 0 );
+
+ if (LOG.isDebugEnabled())
+ {
+ LOG.debug("<gs name=\"" + graphicsName.getName() + "\" />" );
+ }
+ PDExtendedGraphicsState gs = (PDExtendedGraphicsState)context.getGraphicsStates().get( graphicsName.getName() );
+ gs.copyIntoGraphicsState( context.getGraphicsState() );
+ }
+}
diff --git a/src/main/java/org/pdfbox/util/operator/SetHorizontalTextScaling.java b/src/main/java/org/pdfbox/util/operator/SetHorizontalTextScaling.java
new file mode 100644
index 0000000..bfb9ebe
--- /dev/null
+++ b/src/main/java/org/pdfbox/util/operator/SetHorizontalTextScaling.java
@@ -0,0 +1,64 @@
+/**
+ * Copyright (c) 2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.util.operator;
+
+import java.util.List;
+import org.apache.log4j.Logger;
+import org.pdfbox.cos.COSNumber;
+import org.pdfbox.util.PDFOperator;
+
+import java.io.IOException;
+
+/**
+ * <p>Structal modification of the PDFEngine class :
+ * the long sequence of conditions in processOperator is remplaced by
+ * this strategy pattern.</p>
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.3 $
+ */
+
+public class SetHorizontalTextScaling extends OperatorProcessor
+{
+ private static final Logger LOG = Logger.getLogger(SetTextFont.class);
+
+ /**
+ * Tz Set horizontal text scaling.
+ * @param operator The operator that is being executed.
+ * @param arguments List
+ * @throws IOException If an error occurs while processing the font.
+ */
+ public void process(PDFOperator operator, List arguments) throws IOException
+ {
+ COSNumber scaling = (COSNumber)arguments.get(0);
+ context.getGraphicsState().getTextState().setHorizontalScalingPercent( scaling.floatValue() );
+ }
+}
diff --git a/src/main/java/org/pdfbox/util/operator/SetLineWidth.java b/src/main/java/org/pdfbox/util/operator/SetLineWidth.java
new file mode 100644
index 0000000..de0576d
--- /dev/null
+++ b/src/main/java/org/pdfbox/util/operator/SetLineWidth.java
@@ -0,0 +1,64 @@
+/**
+ * Copyright (c) 2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.util.operator;
+
+import java.util.List;
+import org.apache.log4j.Logger;
+import org.pdfbox.cos.COSNumber;
+import org.pdfbox.util.PDFOperator;
+
+import java.io.IOException;
+
+/**
+ * <p>Structal modification of the PDFEngine class :
+ * the long sequence of conditions in processOperator is remplaced by
+ * this strategy pattern.</p>
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.3 $
+ */
+
+public class SetLineWidth extends OperatorProcessor
+{
+ private static final Logger LOG = Logger.getLogger(SetTextFont.class);
+
+ /**
+ * w Set line width.
+ * @param operator The operator that is being executed.
+ * @param arguments List
+ * @throws IOException If an error occurs while processing the font.
+ */
+ public void process(PDFOperator operator, List arguments) throws IOException
+ {
+ COSNumber width = (COSNumber)arguments.get( 0 );
+ context.getGraphicsState().setLineWidth( width.doubleValue() );
+ }
+}
diff --git a/src/main/java/org/pdfbox/util/operator/SetMatrix.java b/src/main/java/org/pdfbox/util/operator/SetMatrix.java
new file mode 100644
index 0000000..5d5f1f5
--- /dev/null
+++ b/src/main/java/org/pdfbox/util/operator/SetMatrix.java
@@ -0,0 +1,90 @@
+/**
+ * Copyright (c) 2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.util.operator;
+
+import java.util.List;
+import org.apache.log4j.Logger;
+import org.pdfbox.cos.COSNumber;
+import org.pdfbox.util.Matrix;
+import org.pdfbox.util.PDFOperator;
+
+/**
+ * <p>Titre : PDFEngine Modification.</p>
+ * <p>Description : Structal modification of the PDFEngine class : the long sequence of conditions
+ * in processOperator is remplaced by this strategy pattern</p>
+ * <p>Copyright : Copyright (c) 2004</p>
+ * <p>Société : DBGS</p>
+ * @author Huault : huault@free.fr
+ * @version $Revision: 1.3 $
+ */
+
+public class SetMatrix extends OperatorProcessor
+{
+
+ private static final Logger LOG = Logger.getLogger(SetMatrix.class);
+
+ /**
+ * Tm Set text matrix and text line matrix.
+ * @param operator The operator that is being executed.
+ * @param arguments List
+ */
+ public void process(PDFOperator operator, List arguments)
+ {
+ //Set text matrix and text line matrix
+ COSNumber a = (COSNumber)arguments.get( 0 );
+ COSNumber b = (COSNumber)arguments.get( 1 );
+ COSNumber c = (COSNumber)arguments.get( 2 );
+ COSNumber d = (COSNumber)arguments.get( 3 );
+ COSNumber e = (COSNumber)arguments.get( 4 );
+ COSNumber f = (COSNumber)arguments.get( 5 );
+
+ if (LOG.isDebugEnabled())
+ {
+ LOG.debug("<Tm " +
+ "a=\"" + a.floatValue() + "\" " +
+ "b=\"" + b.floatValue() + "\" " +
+ "c=\"" + c.floatValue() + "\" " +
+ "d=\"" + d.floatValue() + "\" " +
+ "e=\"" + e.floatValue() + "\" " +
+ "f=\"" + f.floatValue() + "\" >");
+ }
+
+ Matrix textMatrix = new Matrix();
+ textMatrix.setValue( 0, 0, a.floatValue() );
+ textMatrix.setValue( 0, 1, b.floatValue() );
+ textMatrix.setValue( 1, 0, c.floatValue() );
+ textMatrix.setValue( 1, 1, d.floatValue() );
+ textMatrix.setValue( 2, 0, e.floatValue() );
+ textMatrix.setValue( 2, 1, f.floatValue() );
+ context.setTextMatrix( textMatrix );
+ context.setTextLineMatrix( textMatrix.copy() );
+ }
+}
diff --git a/src/main/java/org/pdfbox/util/operator/SetMoveAndShow.java b/src/main/java/org/pdfbox/util/operator/SetMoveAndShow.java
new file mode 100644
index 0000000..b49206d
--- /dev/null
+++ b/src/main/java/org/pdfbox/util/operator/SetMoveAndShow.java
@@ -0,0 +1,80 @@
+/**
+ * Copyright (c) 2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.util.operator;
+
+import java.util.List;
+import org.apache.log4j.Logger;
+import org.pdfbox.cos.COSNumber;
+import org.pdfbox.cos.COSString;
+import org.pdfbox.util.PDFOperator;
+
+import java.io.IOException;
+
+/**
+ * <p>Titre : PDFEngine Modification.</p>
+ * <p>Description : Structal modification of the PDFEngine class : the long sequence of conditions
+ * in processOperator is remplaced by this strategy pattern</p>
+ * <p>Copyright : Copyright (c) 2004</p>
+ * <p>Société : DBGS</p>
+ * @author Huault : huault@free.fr
+ * @version $Revision: 1.5 $
+ */
+
+public class SetMoveAndShow extends OperatorProcessor
+{
+
+ private static final Logger LOG = Logger.getLogger(SetMoveAndShow.class);
+
+ /**
+ * " Set word and character spacing, move to next line, and show text.
+ * @param operator The operator that is being executed.
+ * @param arguments List.
+ * @throws IOException If there is an error processing the operator.
+ */
+ public void process(PDFOperator operator, List arguments) throws IOException
+ {
+ //Set word and character spacing, move to next line, and show text
+ //
+ if (LOG.isDebugEnabled())
+ {
+ COSNumber wordSpacing = (COSNumber)arguments.get( 0 );
+ COSNumber characterSpacing = (COSNumber)arguments.get( 1 );
+ COSString string = (COSString)arguments.get( 2 );
+ LOG.debug("<\" wordSpacing=\"" + wordSpacing +
+ "\", characterSpacing=\"" + characterSpacing +
+ "\", string=\"" + string.getString() + "\">");
+ }
+
+ context.processOperator("Tw", arguments.subList(0,1));
+ context.processOperator("Tc", arguments.subList(1,2));
+ context.processOperator("'", arguments.subList(2,3));
+ }
+}
diff --git a/src/main/java/org/pdfbox/util/operator/SetNonStrokingCMYKColor.java b/src/main/java/org/pdfbox/util/operator/SetNonStrokingCMYKColor.java
new file mode 100644
index 0000000..941fcd6
--- /dev/null
+++ b/src/main/java/org/pdfbox/util/operator/SetNonStrokingCMYKColor.java
@@ -0,0 +1,69 @@
+/**
+ * Copyright (c) 2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.util.operator;
+
+import java.util.List;
+
+import org.pdfbox.cos.COSNumber;
+import org.pdfbox.pdmodel.graphics.color.PDColorSpace;
+import org.pdfbox.pdmodel.graphics.color.PDColorSpaceInstance;
+import org.pdfbox.pdmodel.graphics.color.PDDeviceCMYK;
+import org.pdfbox.util.PDFOperator;
+
+import java.io.IOException;
+
+/**
+ * <p>Set the non stroking color space.</p>
+ *
+ * @author Ben Litchfield (ben@benlitchfield.com)
+ * @version $Revision: 1.2 $
+ */
+public class SetNonStrokingCMYKColor extends OperatorProcessor
+{
+ /**
+ * cs Set color space for non stroking operations.
+ * @param operator The operator that is being executed.
+ * @param arguments List
+ * @throws IOException If an error occurs while processing the font.
+ */
+ public void process(PDFOperator operator, List arguments) throws IOException
+ {
+ PDColorSpace cs = PDDeviceCMYK.INSTANCE;
+ PDColorSpaceInstance colorInstance = context.getGraphicsState().getNonStrokingColorSpace();
+ colorInstance.setColorSpace( cs );
+ float[] values = new float[4];
+ for( int i=0; i<arguments.size(); i++ )
+ {
+ values[i] = ((COSNumber)arguments.get( i )).floatValue();
+ }
+ colorInstance.setColorSpaceValue( values );
+ }
+}
diff --git a/src/main/java/org/pdfbox/util/operator/SetNonStrokingColorSpace.java b/src/main/java/org/pdfbox/util/operator/SetNonStrokingColorSpace.java
new file mode 100644
index 0000000..c75d1a4
--- /dev/null
+++ b/src/main/java/org/pdfbox/util/operator/SetNonStrokingColorSpace.java
@@ -0,0 +1,86 @@
+/**
+ * Copyright (c) 2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.util.operator;
+
+import java.util.List;
+import org.pdfbox.cos.COSName;
+import org.pdfbox.pdmodel.graphics.color.PDColorSpace;
+import org.pdfbox.pdmodel.graphics.color.PDColorSpaceFactory;
+import org.pdfbox.pdmodel.graphics.color.PDColorSpaceInstance;
+import org.pdfbox.pdmodel.graphics.color.PDDeviceCMYK;
+import org.pdfbox.util.PDFOperator;
+
+import java.io.IOException;
+
+/**
+ * <p>Set the non stroking color space.</p>
+ *
+ * @author Ben Litchfield (ben@benlitchfield.com)
+ * @version $Revision: 1.2 $
+ */
+public class SetNonStrokingColorSpace extends OperatorProcessor
+{
+ private static final float[] EMPTY_FLOAT_ARRAY = new float[0];
+
+ /**
+ * cs Set color space for non stroking operations.
+ * @param operator The operator that is being executed.
+ * @param arguments List
+ * @throws IOException If an error occurs while processing the font.
+ */
+ public void process(PDFOperator operator, List arguments) throws IOException
+ {
+// (PDF 1.1) Set color space for stroking operations
+ COSName name = (COSName)arguments.get( 0 );
+ PDColorSpace cs = (PDColorSpace)context.getColorSpaces().get( name.getName() );
+ if( cs == null )
+ {
+ cs = PDColorSpaceFactory.createColorSpace( name );
+ }
+ PDColorSpaceInstance colorInstance = context.getGraphicsState().getNonStrokingColorSpace();
+ colorInstance.setColorSpace( cs );
+ int numComponents = cs.getNumberOfComponents();
+ float[] values = EMPTY_FLOAT_ARRAY;
+ if( numComponents >= 0 )
+ {
+ values = new float[numComponents];
+ for( int i=0; i<numComponents; i++ )
+ {
+ values[i] = 0f;
+ }
+ if( cs instanceof PDDeviceCMYK )
+ {
+ values[3] = 1f;
+ }
+ }
+ colorInstance.setColorSpaceValue( values );
+ }
+}
diff --git a/src/main/java/org/pdfbox/util/operator/SetNonStrokingRGBColor.java b/src/main/java/org/pdfbox/util/operator/SetNonStrokingRGBColor.java
new file mode 100644
index 0000000..ca4e8b9
--- /dev/null
+++ b/src/main/java/org/pdfbox/util/operator/SetNonStrokingRGBColor.java
@@ -0,0 +1,69 @@
+/**
+ * Copyright (c) 2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.util.operator;
+
+import java.util.List;
+
+import org.pdfbox.cos.COSNumber;
+import org.pdfbox.pdmodel.graphics.color.PDColorSpace;
+import org.pdfbox.pdmodel.graphics.color.PDColorSpaceInstance;
+import org.pdfbox.pdmodel.graphics.color.PDDeviceRGB;
+import org.pdfbox.util.PDFOperator;
+
+import java.io.IOException;
+
+/**
+ * <p>Set the non stroking color space.</p>
+ *
+ * @author Ben Litchfield (ben@benlitchfield.com)
+ * @version $Revision: 1.2 $
+ */
+public class SetNonStrokingRGBColor extends OperatorProcessor
+{
+ /**
+ * rg Set color space for non stroking operations.
+ * @param operator The operator that is being executed.
+ * @param arguments List
+ * @throws IOException If an error occurs while processing the font.
+ */
+ public void process(PDFOperator operator, List arguments) throws IOException
+ {
+ PDColorSpace cs = PDDeviceRGB.INSTANCE;
+ PDColorSpaceInstance colorInstance = context.getGraphicsState().getNonStrokingColorSpace();
+ colorInstance.setColorSpace( cs );
+ float[] values = new float[3];
+ for( int i=0; i<arguments.size(); i++ )
+ {
+ values[i] = ((COSNumber)arguments.get( i )).floatValue();
+ }
+ colorInstance.setColorSpaceValue( values );
+ }
+}
diff --git a/src/main/java/org/pdfbox/util/operator/SetStrokingCMYKColor.java b/src/main/java/org/pdfbox/util/operator/SetStrokingCMYKColor.java
new file mode 100644
index 0000000..5a03d83
--- /dev/null
+++ b/src/main/java/org/pdfbox/util/operator/SetStrokingCMYKColor.java
@@ -0,0 +1,71 @@
+/**
+ * Copyright (c) 2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.util.operator;
+
+import java.util.List;
+
+import org.pdfbox.cos.COSNumber;
+import org.pdfbox.pdmodel.graphics.color.PDColorSpace;
+import org.pdfbox.pdmodel.graphics.color.PDColorSpaceInstance;
+import org.pdfbox.pdmodel.graphics.color.PDDeviceCMYK;
+import org.pdfbox.util.PDFOperator;
+
+import java.io.IOException;
+
+/**
+ * <p>Structal modification of the PDFEngine class :
+ * the long sequence of conditions in processOperator is remplaced by
+ * this strategy pattern.</p>
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.2 $
+ */
+public class SetStrokingCMYKColor extends OperatorProcessor
+{
+ /**
+ * CS Set color space for stroking operations.
+ * @param operator The operator that is being executed.
+ * @param arguments List
+ * @throws IOException If an error occurs while processing the font.
+ */
+ public void process(PDFOperator operator, List arguments) throws IOException
+ {
+ PDColorSpace cs = PDDeviceCMYK.INSTANCE;
+ PDColorSpaceInstance colorInstance = context.getGraphicsState().getStrokingColorSpace();
+ colorInstance.setColorSpace( cs );
+ float[] values = new float[4];
+ for( int i=0; i<arguments.size(); i++ )
+ {
+ values[i] = ((COSNumber)arguments.get( i )).floatValue();
+ }
+ colorInstance.setColorSpaceValue( values );
+ }
+}
diff --git a/src/main/java/org/pdfbox/util/operator/SetStrokingColorSpace.java b/src/main/java/org/pdfbox/util/operator/SetStrokingColorSpace.java
new file mode 100644
index 0000000..66d5bbc
--- /dev/null
+++ b/src/main/java/org/pdfbox/util/operator/SetStrokingColorSpace.java
@@ -0,0 +1,89 @@
+/**
+ * Copyright (c) 2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.util.operator;
+
+import java.util.List;
+import org.pdfbox.cos.COSName;
+import org.pdfbox.pdmodel.graphics.color.PDColorSpace;
+import org.pdfbox.pdmodel.graphics.color.PDColorSpaceFactory;
+import org.pdfbox.pdmodel.graphics.color.PDColorSpaceInstance;
+import org.pdfbox.pdmodel.graphics.color.PDDeviceCMYK;
+import org.pdfbox.util.PDFOperator;
+
+import java.io.IOException;
+
+/**
+ * <p>Structal modification of the PDFEngine class :
+ * the long sequence of conditions in processOperator is remplaced by
+ * this strategy pattern.</p>
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.3 $
+ */
+
+public class SetStrokingColorSpace extends OperatorProcessor
+{
+ private static final float[] EMPTY_FLOAT_ARRAY = new float[0];
+
+ /**
+ * CS Set color space for stroking operations.
+ * @param operator The operator that is being executed.
+ * @param arguments List
+ * @throws IOException If an error occurs while processing the font.
+ */
+ public void process(PDFOperator operator, List arguments) throws IOException
+ {
+ //(PDF 1.1) Set color space for stroking operations
+ COSName name = (COSName)arguments.get( 0 );
+ PDColorSpace cs = (PDColorSpace)context.getColorSpaces().get( name.getName() );
+ if( cs == null )
+ {
+ cs = PDColorSpaceFactory.createColorSpace( name );
+ }
+ PDColorSpaceInstance colorInstance = context.getGraphicsState().getStrokingColorSpace();
+ colorInstance.setColorSpace( cs );
+ int numComponents = cs.getNumberOfComponents();
+ float[] values = EMPTY_FLOAT_ARRAY;
+ if( numComponents >= 0 )
+ {
+ values = new float[numComponents];
+ for( int i=0; i<numComponents; i++ )
+ {
+ values[i] = 0f;
+ }
+ if( cs instanceof PDDeviceCMYK )
+ {
+ values[3] = 1f;
+ }
+ }
+ colorInstance.setColorSpaceValue( values );
+ }
+}
diff --git a/src/main/java/org/pdfbox/util/operator/SetStrokingRGBColor.java b/src/main/java/org/pdfbox/util/operator/SetStrokingRGBColor.java
new file mode 100644
index 0000000..1b66445
--- /dev/null
+++ b/src/main/java/org/pdfbox/util/operator/SetStrokingRGBColor.java
@@ -0,0 +1,71 @@
+/**
+ * Copyright (c) 2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.util.operator;
+
+import java.util.List;
+
+import org.pdfbox.cos.COSNumber;
+import org.pdfbox.pdmodel.graphics.color.PDColorSpace;
+import org.pdfbox.pdmodel.graphics.color.PDColorSpaceInstance;
+import org.pdfbox.pdmodel.graphics.color.PDDeviceRGB;
+import org.pdfbox.util.PDFOperator;
+
+import java.io.IOException;
+
+/**
+ * <p>Structal modification of the PDFEngine class :
+ * the long sequence of conditions in processOperator is remplaced by
+ * this strategy pattern.</p>
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.2 $
+ */
+public class SetStrokingRGBColor extends OperatorProcessor
+{
+ /**
+ * RG Set color space for stroking operations.
+ * @param operator The operator that is being executed.
+ * @param arguments List
+ * @throws IOException If an error occurs while processing the font.
+ */
+ public void process(PDFOperator operator, List arguments) throws IOException
+ {
+ PDColorSpace cs = PDDeviceRGB.INSTANCE;
+ PDColorSpaceInstance colorInstance = context.getGraphicsState().getStrokingColorSpace();
+ colorInstance.setColorSpace( cs );
+ float[] values = new float[3];
+ for( int i=0; i<arguments.size(); i++ )
+ {
+ values[i] = ((COSNumber)arguments.get( i )).floatValue();
+ }
+ colorInstance.setColorSpaceValue( values );
+ }
+}
diff --git a/src/main/java/org/pdfbox/util/operator/SetTextFont.java b/src/main/java/org/pdfbox/util/operator/SetTextFont.java
new file mode 100644
index 0000000..3e54943
--- /dev/null
+++ b/src/main/java/org/pdfbox/util/operator/SetTextFont.java
@@ -0,0 +1,96 @@
+/**
+ * Copyright (c) 2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.util.operator;
+
+import java.util.List;
+import org.apache.log4j.Logger;
+import org.pdfbox.cos.COSName;
+import org.pdfbox.cos.COSNumber;
+import org.pdfbox.pdmodel.font.PDFont;
+import org.pdfbox.util.PDFOperator;
+
+import java.io.IOException;
+
+/**
+ * <p>Titre : PDFEngine Modification.</p>
+ * <p>Description : Structal modification of the PDFEngine class :
+ * the long sequence of conditions in processOperator is remplaced by
+ * this strategy pattern</p>
+ * <p>Copyright : Copyright (c) 2004</p>
+ * <p>Société : DBGS</p>
+ * @author Huault : huault@free.fr
+ * @version $Revision: 1.4 $
+ */
+
+public class SetTextFont extends OperatorProcessor
+{
+ private static final Logger LOG = Logger.getLogger(SetTextFont.class);
+
+ /**
+ * Tf selectfont Set text font and size.
+ * @param operator The operator that is being executed.
+ * @param arguments List
+ * @throws IOException If an error occurs while processing the font.
+ */
+ public void process(PDFOperator operator, List arguments) throws IOException
+ {
+ //there are some documents that are incorrectly structured and
+ //arguments are in the wrong spot, so we will silently ignore them
+ //if there are no arguments
+ if( arguments.size() >= 2 )
+ {
+ //set font and size
+ COSName fontName = (COSName)arguments.get( 0 );
+ float fontSize = ((COSNumber)arguments.get( 1 ) ).floatValue();
+ context.getGraphicsState().getTextState().setFontSize( fontSize );
+
+ if (LOG.isDebugEnabled())
+ {
+ LOG.debug("<Tf font=\"" + fontName.getName() + "\" size=\"" +
+ context.getGraphicsState().getTextState().getFontSize() + "\">");
+ }
+
+ //old way
+ //graphicsState.getTextState().getFont() = (COSObject)stream.getDictionaryObject( fontName );
+ //if( graphicsState.getTextState().getFont() == null )
+ //{
+ // graphicsState.getTextState().getFont() = (COSObject)graphicsState.getTextState().getFont()
+ // Dictionary.getItem( fontName );
+ //}
+ context.getGraphicsState().getTextState().setFont( (PDFont)context.getFonts().get( fontName.getName() ) );
+ if( context.getGraphicsState().getTextState().getFont() == null )
+ {
+ throw new IOException( "Error: Could not find font(" + fontName + ") in map=" + context.getFonts() );
+ }
+ }
+ }
+
+}
diff --git a/src/main/java/org/pdfbox/util/operator/SetTextLeading.java b/src/main/java/org/pdfbox/util/operator/SetTextLeading.java
new file mode 100644
index 0000000..928172b
--- /dev/null
+++ b/src/main/java/org/pdfbox/util/operator/SetTextLeading.java
@@ -0,0 +1,69 @@
+/**
+ * Copyright (c) 2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.util.operator;
+
+import java.util.List;
+import org.apache.log4j.Logger;
+import org.pdfbox.cos.COSNumber;
+import org.pdfbox.util.PDFOperator;
+
+/**
+ * <p>Titre : PDFEngine Modification.</p>
+ * <p>Description : Structal modification of the PDFEngine class :
+* the long sequence of conditions in processOperator is remplaced
+* by this strategy pattern</p>
+ * <p>Copyright : Copyright (c) 2004</p>
+ * <p>Société : DBGS</p>
+ * @author Huault : huault@free.fr
+ * @version $Revision: 1.3 $
+ */
+
+public class SetTextLeading extends OperatorProcessor
+{
+
+ private static final Logger LOG = Logger.getLogger(SetTextLeading.class);
+
+ /**
+ * TL Set text leading.
+ * @param operator The operator that is being executed.
+ * @param arguments List
+ */
+ public void process(PDFOperator operator, List arguments)
+ {
+ COSNumber leading = (COSNumber)arguments.get( 0 );
+ context.getGraphicsState().getTextState().setLeading( leading.floatValue() );
+ if (LOG.isDebugEnabled())
+ {
+ LOG.debug("<TL leading=\"" + leading.floatValue() + "\" >");
+ }
+ }
+
+}
diff --git a/src/main/java/org/pdfbox/util/operator/SetTextRenderingMode.java b/src/main/java/org/pdfbox/util/operator/SetTextRenderingMode.java
new file mode 100644
index 0000000..19da1e2
--- /dev/null
+++ b/src/main/java/org/pdfbox/util/operator/SetTextRenderingMode.java
@@ -0,0 +1,64 @@
+/**
+ * Copyright (c) 2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.util.operator;
+
+import java.util.List;
+import org.apache.log4j.Logger;
+import org.pdfbox.cos.COSNumber;
+import org.pdfbox.util.PDFOperator;
+
+import java.io.IOException;
+
+/**
+ * <p>Structal modification of the PDFEngine class :
+ * the long sequence of conditions in processOperator is remplaced by
+ * this strategy pattern.</p>
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.3 $
+ */
+
+public class SetTextRenderingMode extends OperatorProcessor
+{
+ private static final Logger LOG = Logger.getLogger(SetTextFont.class);
+
+ /**
+ * Tr Set text rendering mode.
+ * @param operator The operator that is being executed.
+ * @param arguments List
+ * @throws IOException If an error occurs while processing the font.
+ */
+ public void process(PDFOperator operator, List arguments) throws IOException
+ {
+ COSNumber mode = (COSNumber)arguments.get( 0 );
+ context.getGraphicsState().getTextState().setRenderingMode( mode.intValue() );
+ }
+}
diff --git a/src/main/java/org/pdfbox/util/operator/SetTextRise.java b/src/main/java/org/pdfbox/util/operator/SetTextRise.java
new file mode 100644
index 0000000..0d1e884
--- /dev/null
+++ b/src/main/java/org/pdfbox/util/operator/SetTextRise.java
@@ -0,0 +1,64 @@
+/**
+ * Copyright (c) 2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.util.operator;
+
+import java.util.List;
+import org.apache.log4j.Logger;
+import org.pdfbox.cos.COSNumber;
+import org.pdfbox.util.PDFOperator;
+
+import java.io.IOException;
+
+/**
+ * <p>Structal modification of the PDFEngine class :
+ * the long sequence of conditions in processOperator is remplaced by
+ * this strategy pattern.</p>
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.3 $
+ */
+
+public class SetTextRise extends OperatorProcessor
+{
+ private static final Logger LOG = Logger.getLogger(SetTextFont.class);
+
+ /**
+ * Ts Set text rise.
+ * @param operator The operator that is being executed.
+ * @param arguments List
+ * @throws IOException If an error occurs while processing the font.
+ */
+ public void process(PDFOperator operator, List arguments) throws IOException
+ {
+ COSNumber rise = (COSNumber)arguments.get(0);
+ context.getGraphicsState().getTextState().setRise( rise.floatValue() );
+ }
+}
diff --git a/src/main/java/org/pdfbox/util/operator/SetWordSpacing.java b/src/main/java/org/pdfbox/util/operator/SetWordSpacing.java
new file mode 100644
index 0000000..3a1e176
--- /dev/null
+++ b/src/main/java/org/pdfbox/util/operator/SetWordSpacing.java
@@ -0,0 +1,68 @@
+/**
+ * Copyright (c) 2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.util.operator;
+
+import java.util.List;
+import org.apache.log4j.Logger;
+import org.pdfbox.cos.COSNumber;
+import org.pdfbox.util.PDFOperator;
+
+/**
+ * <p>Titre : PDFEngine Modification.</p>
+ * <p>Description : Structal modification of the PDFEngine class : the long sequence of
+ * conditions in processOperator is remplaced by this strategy pattern</p>
+ * <p>Copyright : Copyright (c) 2004</p>
+ * <p>Société : DBGS</p>
+ * @author Huault : huault@free.fr
+ * @version $Revision: 1.3 $
+ */
+
+public class SetWordSpacing extends OperatorProcessor
+{
+ private static final Logger LOG = Logger.getLogger(SetWordSpacing.class);
+
+ /**
+ * Tw Set word spacing.
+ * @param operator The operator that is being executed.
+ * @param arguments List
+ */
+ public void process(PDFOperator operator, List arguments)
+ {
+ //set word spacing
+ COSNumber wordSpacing = (COSNumber)arguments.get( 0 );
+ if (LOG.isDebugEnabled())
+ {
+ LOG.debug("<Tw wordSpacing=\"" + wordSpacing.floatValue() + "\" />");
+ }
+ context.getGraphicsState().getTextState().setWordSpacing( wordSpacing.floatValue() );
+ }
+
+}
diff --git a/src/main/java/org/pdfbox/util/operator/ShowText.java b/src/main/java/org/pdfbox/util/operator/ShowText.java
new file mode 100644
index 0000000..1889259
--- /dev/null
+++ b/src/main/java/org/pdfbox/util/operator/ShowText.java
@@ -0,0 +1,73 @@
+/**
+ * Copyright (c) 2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.util.operator;
+
+import java.util.List;
+import org.apache.log4j.Logger;
+import org.pdfbox.cos.COSString;
+import org.pdfbox.util.PDFOperator;
+
+import java.io.IOException;
+
+/**
+ * <p>Titre : PDFEngine Modification.</p>
+ * <p>Description : Structal modification of the PDFEngine class :
+ * the long sequence of conditions in processOperator
+ * is remplaced by this strategy pattern</p>
+ * <p>Copyright : Copyright (c) 2004</p>
+ * <p>Société : DBGS</p>
+ * @author Huault : huault@free.fr
+ * @version $Revision: 1.3 $
+ */
+
+public class ShowText extends OperatorProcessor
+{
+
+ private static final Logger LOG = Logger.getLogger(ShowText.class);
+
+ /**
+ * Tj show Show text.
+ * @param operator The operator that is being executed.
+ * @param arguments List
+ *
+ * @throws IOException If there is an error processing this operator.
+ */
+ public void process(PDFOperator operator, List arguments) throws IOException
+ {
+ COSString string = (COSString)arguments.get( 0 );
+ context.showString( string.getBytes() );
+ if (LOG.isDebugEnabled())
+ {
+ LOG.debug("<Tj string=\"" + string.getString() + "\">");
+ }
+ }
+
+}
diff --git a/src/main/java/org/pdfbox/util/operator/ShowTextGlyph.java b/src/main/java/org/pdfbox/util/operator/ShowTextGlyph.java
new file mode 100644
index 0000000..cf22e11
--- /dev/null
+++ b/src/main/java/org/pdfbox/util/operator/ShowTextGlyph.java
@@ -0,0 +1,99 @@
+/**
+ * Copyright (c) 2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.util.operator;
+
+import java.util.List;
+import org.apache.log4j.Logger;
+import org.pdfbox.util.Matrix;
+import org.pdfbox.util.PDFOperator;
+import org.pdfbox.cos.COSArray;
+import org.pdfbox.cos.COSBase;
+import org.pdfbox.cos.COSNumber;
+import java.io.IOException;
+import org.pdfbox.cos.COSString;
+
+/**
+ * <p>Titre : PDFEngine Modification.</p>
+ * <p>Description : Structal modification of the PDFEngine class : the long sequence of
+ * conditions in processOperator is remplaced by this strategy pattern</p>
+ * <p>Copyright : Copyright (c) 2004</p>
+ * <p>Société : DBGS</p>
+ * @author Huault : huault@free.fr
+ * @version $Revision: 1.5 $
+ */
+
+public class ShowTextGlyph extends OperatorProcessor
+{
+ private static final Logger LOG = Logger.getLogger(ShowTextGlyph.class);
+
+ /**
+ * TJ Show text, allowing individual glyph positioning.
+ * @param operator The operator that is being executed.
+ * @param arguments List
+ * @throws IOException If there is an error processing this operator.
+ */
+ public void process(PDFOperator operator, List arguments) throws IOException
+ {
+ COSArray array = (COSArray)arguments.get( 0 );
+ float adjustment=0;
+ for( int i=0; i<array.size(); i++ )
+ {
+ COSBase next = array.get( i );
+ if( next instanceof COSNumber )
+ {
+ adjustment = ((COSNumber)next).floatValue();
+
+ Matrix adjMatrix = new Matrix();
+ adjustment=(-adjustment/1000)*context.getGraphicsState().getTextState().getFontSize() *
+ (context.getGraphicsState().getTextState().getHorizontalScalingPercent()/100);
+ adjMatrix.setValue( 2, 0, adjustment );
+ if( LOG.isDebugEnabled() )
+ {
+ LOG.debug( "TJ adjustment=" + adjustment + " textMatrix=" + context.getTextMatrix() );
+ }
+ context.setTextMatrix( adjMatrix.multiply( context.getTextMatrix() ) );
+ if( LOG.isDebugEnabled() )
+ {
+ LOG.debug( "textMatrix after=" + context.getTextMatrix() );
+ }
+ }
+ else if( next instanceof COSString )
+ {
+ context.showString( ((COSString)next).getBytes() );
+ }
+ else
+ {
+ throw new IOException( "Unknown type in array for TJ operation:" + next );
+ }
+ }
+ }
+
+}
diff --git a/src/main/java/org/pdfbox/util/operator/package.html b/src/main/java/org/pdfbox/util/operator/package.html
new file mode 100644
index 0000000..edb8444
--- /dev/null
+++ b/src/main/java/org/pdfbox/util/operator/package.html
@@ -0,0 +1,9 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head>
+
+</head>
+<body>
+This package contains implementations of all of the PDF operators.
+</body>
+</html>
diff --git a/src/main/java/org/pdfbox/util/operator/pagedrawer/AppendRectangleToPath.java b/src/main/java/org/pdfbox/util/operator/pagedrawer/AppendRectangleToPath.java
new file mode 100644
index 0000000..7d2d49f
--- /dev/null
+++ b/src/main/java/org/pdfbox/util/operator/pagedrawer/AppendRectangleToPath.java
@@ -0,0 +1,77 @@
+/**
+ * Copyright (c) 2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.util.operator.pagedrawer;
+
+import java.awt.geom.Rectangle2D;
+import java.util.List;
+
+import org.pdfbox.cos.COSNumber;
+import org.pdfbox.pdfviewer.PageDrawer;
+import org.pdfbox.util.PDFOperator;
+import org.pdfbox.util.operator.OperatorProcessor;
+
+/**
+ * Implementation of content stream operator for page drawer.
+ *
+ * @author Ben Litchfield (ben@benlitchfield.com)
+ * @version $Revision: 1.1 $
+ */
+public class AppendRectangleToPath extends OperatorProcessor
+{
+
+
+ /**
+ * process : re : append rectangle to path.
+ * @param operator The operator that is being executed.
+ * @param arguments List
+ */
+ public void process(PDFOperator operator, List arguments)
+ {
+ PageDrawer drawer = (PageDrawer)context;
+
+ COSNumber x = (COSNumber)arguments.get( 0 );
+ COSNumber y = (COSNumber)arguments.get( 1 );
+ COSNumber w = (COSNumber)arguments.get( 2 );
+ COSNumber h = (COSNumber)arguments.get( 3 );
+ Rectangle2D rect = new Rectangle2D.Double(
+ x.doubleValue(),
+ drawer.fixY( x.doubleValue(), y.doubleValue())-h.doubleValue(),
+ w.doubleValue()+1,
+ h.doubleValue()+1);
+ drawer.getLinePath().reset();
+
+ drawer.getLinePath().append( rect, false );
+ //graphics.drawRect((int)x.doubleValue(), (int)(pageSize.getHeight() - y.doubleValue()),
+ // (int)w.doubleValue(),(int)h.doubleValue() );
+ //System.out.println( "<re x=\"" + x.getValue() + "\" y=\"" + y.getValue() + "\" width=\"" +
+ // width.getValue() + "\" height=\"" + height.getValue() + "\" >" );
+ }
+}
diff --git a/src/main/java/org/pdfbox/util/operator/pagedrawer/BeginInlineImage.java b/src/main/java/org/pdfbox/util/operator/pagedrawer/BeginInlineImage.java
new file mode 100644
index 0000000..9031345
--- /dev/null
+++ b/src/main/java/org/pdfbox/util/operator/pagedrawer/BeginInlineImage.java
@@ -0,0 +1,114 @@
+/**
+ * Copyright (c) 2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.util.operator.pagedrawer;
+
+import java.awt.Graphics2D;
+import java.awt.geom.AffineTransform;
+import java.awt.image.BufferedImage;
+import java.io.IOException;
+import java.util.List;
+
+import org.pdfbox.pdfviewer.PageDrawer;
+import org.pdfbox.pdmodel.graphics.xobject.PDInlinedImage;
+import org.pdfbox.util.ImageParameters;
+import org.pdfbox.util.Matrix;
+import org.pdfbox.util.PDFOperator;
+import org.pdfbox.util.operator.OperatorProcessor;
+
+/**
+ * Implementation of content stream operator for page drawer.
+ *
+ * @author Ben Litchfield (ben@benlitchfield.com)
+ * @version $Revision: 1.1 $
+ */
+public class BeginInlineImage extends OperatorProcessor
+{
+
+
+ /**
+ * process : BI : begin inline image.
+ * @param operator The operator that is being executed.
+ * @param arguments List
+ * @throws IOException If there is an error displaying the inline image.
+ */
+ public void process(PDFOperator operator, List arguments) throws IOException
+ {
+ PageDrawer drawer = (PageDrawer)context;
+ Graphics2D graphics = drawer.getGraphics();
+ //begin inline image object
+ ImageParameters params = operator.getImageParameters();
+ PDInlinedImage image = new PDInlinedImage();
+ image.setImageParameters( params );
+ image.setImageData( operator.getImageData() );
+ BufferedImage awtImage = image.createImage();
+
+ Matrix ctm = drawer.getGraphicsState().getCurrentTransformationMatrix();
+
+ int width = awtImage.getWidth();
+ int height = awtImage.getHeight();
+
+
+ AffineTransform at = new AffineTransform(
+ ctm.getValue(0,0)/width,
+ ctm.getValue(0,1),
+ ctm.getValue(1,0),
+ ctm.getValue(1,1)/height,
+ ctm.getValue(2,0),
+ ctm.getValue(2,1)
+ );
+ //at.setToRotation((double)page.getRotation());
+
+
+ // The transformation should be done
+ // 1 - Translation
+ // 2 - Rotation
+ // 3 - Scale or Skew
+ //AffineTransform at = new AffineTransform();
+
+ // Translation
+ //at = new AffineTransform();
+ //at.setToTranslation((double)ctm.getValue(0,0),
+ // (double)ctm.getValue(0,1));
+
+ // Rotation
+ //AffineTransform toAdd = new AffineTransform();
+ //toAdd.setToRotation(1.5705);
+ //toAdd.setToRotation(ctm.getValue(2,0)*(Math.PI/180));
+ //at.concatenate(toAdd);
+
+ // Scale / Skew?
+ //toAdd.setToScale(width, height);
+ //at.concatenate(toAdd);
+ //at.setToScale( width, height );
+ graphics.drawImage( awtImage, at, null );
+ //graphics.drawImage( awtImage,0,0, width,height,null);
+ }
+}
diff --git a/src/main/java/org/pdfbox/util/operator/pagedrawer/ClosePath.java b/src/main/java/org/pdfbox/util/operator/pagedrawer/ClosePath.java
new file mode 100644
index 0000000..418af6d
--- /dev/null
+++ b/src/main/java/org/pdfbox/util/operator/pagedrawer/ClosePath.java
@@ -0,0 +1,59 @@
+/**
+ * Copyright (c) 2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.util.operator.pagedrawer;
+
+import java.util.List;
+
+import org.pdfbox.pdfviewer.PageDrawer;
+import org.pdfbox.util.PDFOperator;
+import org.pdfbox.util.operator.OperatorProcessor;
+
+/**
+ * Implementation of content stream operator for page drawer.
+ *
+ * @author Ben Litchfield (ben@benlitchfield.com)
+ * @version $Revision: 1.1 $
+ */
+public class ClosePath extends OperatorProcessor
+{
+
+
+ /**
+ * process : h : Close path.
+ * @param operator The operator that is being executed.
+ * @param arguments List
+ */
+ public void process(PDFOperator operator, List arguments)
+ {
+ PageDrawer drawer = (PageDrawer)context;
+ drawer.getLinePath().closePath();
+ }
+}
diff --git a/src/main/java/org/pdfbox/util/operator/pagedrawer/CurveTo.java b/src/main/java/org/pdfbox/util/operator/pagedrawer/CurveTo.java
new file mode 100644
index 0000000..c056b91
--- /dev/null
+++ b/src/main/java/org/pdfbox/util/operator/pagedrawer/CurveTo.java
@@ -0,0 +1,73 @@
+/**
+ * Copyright (c) 2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.util.operator.pagedrawer;
+
+import java.util.List;
+
+import org.pdfbox.cos.COSNumber;
+import org.pdfbox.pdfviewer.PageDrawer;
+import org.pdfbox.util.PDFOperator;
+import org.pdfbox.util.operator.OperatorProcessor;
+
+/**
+ * Implementation of content stream operator for page drawer.
+ *
+ * @author Ben Litchfield (ben@benlitchfield.com)
+ * @version $Revision: 1.1 $
+ */
+public class CurveTo extends OperatorProcessor
+{
+
+
+ /**
+ * process : c : Append curved segment to path.
+ * @param operator The operator that is being executed.
+ * @param arguments List
+ */
+ public void process(PDFOperator operator, List arguments)
+ {
+ PageDrawer drawer = (PageDrawer)context;
+
+ COSNumber x1 = (COSNumber)arguments.get( 0 );
+ COSNumber y1 = (COSNumber)arguments.get( 1 );
+ COSNumber x2 = (COSNumber)arguments.get( 2 );
+ COSNumber y2 = (COSNumber)arguments.get( 3 );
+ COSNumber x3 = (COSNumber)arguments.get( 4 );
+ COSNumber y3 = (COSNumber)arguments.get( 5 );
+ float x1f = x1.floatValue();
+ float y1f = (float)drawer.fixY( x1f, y1.floatValue() );
+ float x2f = x2.floatValue();
+ float y2f = (float)drawer.fixY( x2f, y2.floatValue() );
+ float x3f = x3.floatValue();
+ float y3f = (float)drawer.fixY( x3f, y3.floatValue() );
+ drawer.getLinePath().curveTo(x1f,y1f,x2f,y2f,x3f,y3f);
+ }
+}
diff --git a/src/main/java/org/pdfbox/util/operator/pagedrawer/CurveToReplicateFinalPoint.java b/src/main/java/org/pdfbox/util/operator/pagedrawer/CurveToReplicateFinalPoint.java
new file mode 100644
index 0000000..670cdb3
--- /dev/null
+++ b/src/main/java/org/pdfbox/util/operator/pagedrawer/CurveToReplicateFinalPoint.java
@@ -0,0 +1,69 @@
+/**
+ * Copyright (c) 2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.util.operator.pagedrawer;
+
+import java.util.List;
+
+import org.pdfbox.cos.COSNumber;
+import org.pdfbox.pdfviewer.PageDrawer;
+import org.pdfbox.util.PDFOperator;
+import org.pdfbox.util.operator.OperatorProcessor;
+
+/**
+ * Implementation of content stream operator for page drawer.
+ *
+ * @author Ben Litchfield (ben@benlitchfield.com)
+ * @version $Revision: 1.1 $
+ */
+public class CurveToReplicateFinalPoint extends OperatorProcessor
+{
+
+
+ /**
+ * process : y : Append curved segment to path (final point replicated).
+ * @param operator The operator that is being executed.
+ * @param arguments List
+ */
+ public void process(PDFOperator operator, List arguments)
+ {
+ PageDrawer drawer = (PageDrawer)context;
+
+ COSNumber x1 = (COSNumber)arguments.get( 0 );
+ COSNumber y1 = (COSNumber)arguments.get( 1 );
+ COSNumber x3 = (COSNumber)arguments.get( 2 );
+ COSNumber y3 = (COSNumber)arguments.get( 3 );
+ float x1f = x1.floatValue();
+ float y1f = (float)drawer.fixY( x1f, y1.floatValue() );
+ float x3f = x3.floatValue();
+ float y3f = (float)drawer.fixY( x3f, y3.floatValue() );
+ drawer.getLinePath().curveTo(x1f,y1f,x3f,y3f,x3f,y3f);
+ }
+}
diff --git a/src/main/java/org/pdfbox/util/operator/pagedrawer/CurveToReplicateInitialPoint.java b/src/main/java/org/pdfbox/util/operator/pagedrawer/CurveToReplicateInitialPoint.java
new file mode 100644
index 0000000..ff354d0
--- /dev/null
+++ b/src/main/java/org/pdfbox/util/operator/pagedrawer/CurveToReplicateInitialPoint.java
@@ -0,0 +1,76 @@
+/**
+ * Copyright (c) 2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.util.operator.pagedrawer;
+
+import java.awt.geom.GeneralPath;
+import java.awt.geom.Point2D;
+import java.util.List;
+
+import org.pdfbox.cos.COSNumber;
+import org.pdfbox.pdfviewer.PageDrawer;
+import org.pdfbox.util.PDFOperator;
+import org.pdfbox.util.operator.OperatorProcessor;
+
+/**
+ * Implementation of content stream operator for page drawer.
+ *
+ * @author Ben Litchfield (ben@benlitchfield.com)
+ * @version $Revision: 1.1 $
+ */
+public class CurveToReplicateInitialPoint extends OperatorProcessor
+{
+
+
+ /**
+ * process : v : Append curved segment to path (initial point replicated).
+ * @param operator The operator that is being executed.
+ * @param arguments List
+ */
+ public void process(PDFOperator operator, List arguments)
+ {
+ PageDrawer drawer = (PageDrawer)context;
+
+ COSNumber x2 = (COSNumber)arguments.get( 0 );
+ COSNumber y2 = (COSNumber)arguments.get( 1 );
+ COSNumber x3 = (COSNumber)arguments.get( 2 );
+ COSNumber y3 = (COSNumber)arguments.get( 3 );
+ float x2f = x2.floatValue();
+ float y2f = (float)drawer.fixY( x2f, y2.floatValue() );
+ float x3f = x3.floatValue();
+ float y3f = (float)drawer.fixY( x3f, y3.floatValue() );
+
+ GeneralPath path = drawer.getLinePath();
+ Point2D currentPoint = path.getCurrentPoint();
+ float currentX = (float)currentPoint.getX();
+ float currentY = (float)currentPoint.getY();
+ drawer.getLinePath().curveTo(currentX,currentY,x2f,y2f,x3f,y3f);
+ }
+}
diff --git a/src/main/java/org/pdfbox/util/operator/pagedrawer/FillEvenOddRule.java b/src/main/java/org/pdfbox/util/operator/pagedrawer/FillEvenOddRule.java
new file mode 100644
index 0000000..da9e834
--- /dev/null
+++ b/src/main/java/org/pdfbox/util/operator/pagedrawer/FillEvenOddRule.java
@@ -0,0 +1,71 @@
+/**
+ * Copyright (c) 2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.util.operator.pagedrawer;
+
+import java.awt.Graphics2D;
+import java.awt.RenderingHints;
+import java.awt.geom.GeneralPath;
+import java.util.List;
+
+import org.pdfbox.pdfviewer.PageDrawer;
+import org.pdfbox.util.PDFOperator;
+import org.pdfbox.util.operator.OperatorProcessor;
+
+/**
+ * Implementation of content stream operator for page drawer.
+ *
+ * @author Ben Litchfield (ben@benlitchfield.com)
+ * @version $Revision: 1.1 $
+ */
+public class FillEvenOddRule extends OperatorProcessor
+{
+
+
+ /**
+ * process : f* : fill path using even odd rule.
+ * @param operator The operator that is being executed.
+ * @param arguments List
+ */
+ public void process(PDFOperator operator, List arguments)
+ {
+// NOTE:changes here should probably also be made to FillNonZeroRule
+ PageDrawer drawer = (PageDrawer)context;
+ Graphics2D graphics = drawer.getGraphics();
+ //linePath.closePath();
+ graphics.setColor( drawer.getNonStrokingColor() );
+ drawer.getLinePath().setWindingRule( GeneralPath.WIND_EVEN_ODD );
+ graphics.setRenderingHint( RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF );
+ //else
+ //{
+ graphics.fill( drawer.getLinePath() );
+ //}
+ }
+}
diff --git a/src/main/java/org/pdfbox/util/operator/pagedrawer/FillNonZeroRule.java b/src/main/java/org/pdfbox/util/operator/pagedrawer/FillNonZeroRule.java
new file mode 100644
index 0000000..56efa33
--- /dev/null
+++ b/src/main/java/org/pdfbox/util/operator/pagedrawer/FillNonZeroRule.java
@@ -0,0 +1,71 @@
+/**
+ * Copyright (c) 2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.util.operator.pagedrawer;
+
+import java.awt.Graphics2D;
+import java.awt.RenderingHints;
+import java.awt.geom.GeneralPath;
+import java.util.List;
+
+import org.pdfbox.pdfviewer.PageDrawer;
+import org.pdfbox.util.PDFOperator;
+import org.pdfbox.util.operator.OperatorProcessor;
+
+/**
+ * Implementation of content stream operator for page drawer.
+ *
+ * @author Ben Litchfield (ben@benlitchfield.com)
+ * @version $Revision: 1.1 $
+ */
+public class FillNonZeroRule extends OperatorProcessor
+{
+
+
+ /**
+ * process : F/f : fill path using non zero winding rule.
+ * @param operator The operator that is being executed.
+ * @param arguments List
+ */
+ public void process(PDFOperator operator, List arguments)
+ {
+ //NOTE:changes here should probably also be made to FillEvenOddRule
+ PageDrawer drawer = (PageDrawer)context;
+ Graphics2D graphics = drawer.getGraphics();
+ //linePath.closePath();
+ graphics.setColor( drawer.getNonStrokingColor() );
+ drawer.getLinePath().setWindingRule( GeneralPath.WIND_NON_ZERO );
+ graphics.setRenderingHint( RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF );
+ //else
+ //{
+ graphics.fill( drawer.getLinePath() );
+ //}
+ }
+}
diff --git a/src/main/java/org/pdfbox/util/operator/pagedrawer/Invoke.java b/src/main/java/org/pdfbox/util/operator/pagedrawer/Invoke.java
new file mode 100644
index 0000000..3d99b74
--- /dev/null
+++ b/src/main/java/org/pdfbox/util/operator/pagedrawer/Invoke.java
@@ -0,0 +1,180 @@
+/**
+ * Copyright (c) 2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.util.operator.pagedrawer;
+
+import java.awt.Dimension;
+import java.awt.Graphics2D;
+import java.awt.geom.AffineTransform;
+import java.awt.image.BufferedImage;
+import java.io.IOException;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.log4j.Logger;
+import org.pdfbox.cos.COSName;
+import org.pdfbox.pdfviewer.PageDrawer;
+import org.pdfbox.pdmodel.PDPage;
+import org.pdfbox.pdmodel.graphics.xobject.PDXObject;
+import org.pdfbox.pdmodel.graphics.xobject.PDXObjectImage;
+import org.pdfbox.util.Matrix;
+import org.pdfbox.util.PDFOperator;
+import org.pdfbox.util.operator.OperatorProcessor;
+
+/**
+ * Implementation of content stream operator for page drawer.
+ *
+ * @author Ben Litchfield (ben@benlitchfield.com)
+ * @version $Revision: 1.1 $
+ */
+public class Invoke extends OperatorProcessor
+{
+ private static Logger log = Logger.getLogger( Invoke.class );
+
+ /**
+ * process : re : append rectangle to path.
+ * @param operator The operator that is being executed.
+ * @param arguments List
+ * @throws IOException If there is an error invoking the sub object.
+ */
+ public void process(PDFOperator operator, List arguments) throws IOException
+ {
+ PageDrawer drawer = (PageDrawer)context;
+ PDPage page = drawer.getPage();
+ Dimension pageSize = drawer.getPageSize();
+ Graphics2D graphics = drawer.getGraphics();
+ COSName objectName = (COSName)arguments.get( 0 );
+ Map xobjects = drawer.getResources().getXObjects();
+ PDXObject xobject = (PDXObject)xobjects.get( objectName.getName() );
+ if( xobject instanceof PDXObjectImage )
+ {
+ PDXObjectImage image = (PDXObjectImage)xobject;
+ try
+ {
+ BufferedImage awtImage = image.getRGBImage();
+ Matrix ctm = drawer.getGraphicsState().getCurrentTransformationMatrix();
+
+ int width = awtImage.getWidth();
+ int height = awtImage.getHeight();
+
+ double rotationInRadians =(page.findRotation() * Math.PI)/180;
+
+
+ AffineTransform rotation = new AffineTransform();
+ rotation.setToRotation( rotationInRadians );
+ AffineTransform rotationInverse = rotation.createInverse();
+ Matrix rotationInverseMatrix = new Matrix();
+ rotationInverseMatrix.setFromAffineTransform( rotationInverse );
+ Matrix rotationMatrix = new Matrix();
+ rotationMatrix.setFromAffineTransform( rotation );
+
+ Matrix unrotatedCTM = ctm.multiply( rotationInverseMatrix );
+
+ Matrix scalingParams = unrotatedCTM.extractScaling();
+ Matrix scalingMatrix = Matrix.getScaleInstance(1f/width,1f/height);
+ scalingParams = scalingParams.multiply( scalingMatrix );
+
+ Matrix translationParams = unrotatedCTM.extractTranslating();
+ Matrix translationMatrix = null;
+ int pageRotation = page.findRotation();
+ if( pageRotation == 0 )
+ {
+ translationParams.setValue(2,1, -translationParams.getValue( 2,1 ));
+ translationMatrix = Matrix.getTranslatingInstance(
+ 0, (float)pageSize.getHeight()-height*scalingParams.getYScale() );
+ }
+ else if( pageRotation == 90 )
+ {
+ translationMatrix = Matrix.getTranslatingInstance( 0, (float)pageSize.getHeight() );
+ }
+ else
+ {
+ //TODO need to figure out other cases
+ }
+ translationParams = translationParams.multiply( translationMatrix );
+
+ AffineTransform at = new AffineTransform(
+ scalingParams.getValue( 0,0), 0,
+ 0, scalingParams.getValue( 1, 1),
+ translationParams.getValue(2,0), translationParams.getValue( 2,1 )
+ );
+
+
+
+
+ //at.setToTranslation( pageSize.getHeight()-ctm.getValue(2,0),ctm.getValue(2,1) );
+ //at.setToScale( ctm.getValue(0,0)/width, ctm.getValue(1,1)/height);
+ //at.setToRotation( (page.findRotation() * Math.PI)/180 );
+
+
+
+ //AffineTransform rotation = new AffineTransform();
+ //rotation.rotate( (90*Math.PI)/180);
+
+ /*
+
+ // The transformation should be done
+ // 1 - Translation
+ // 2 - Rotation
+ // 3 - Scale or Skew
+ AffineTransform at = new AffineTransform();
+
+ // Translation
+ at = new AffineTransform();
+ //at.setToTranslation((double)ctm.getValue(0,0),
+ // (double)ctm.getValue(0,1));
+
+ // Rotation
+ //AffineTransform toAdd = new AffineTransform();
+ toAdd.setToRotation(1.5705);
+ toAdd.setToRotation(ctm.getValue(2,0)*(Math.PI/180));
+ at.concatenate(toAdd);
+ */
+
+ // Scale / Skew?
+ //toAdd.setToScale(1, 1);
+ //at.concatenate(toAdd);
+
+ graphics.drawImage( awtImage, at, null );
+ }
+ catch( Exception e )
+ {
+ e.printStackTrace();
+ }
+ }
+ else
+ {
+ log.warn( "Unknown xobject type:" + xobject );
+ }
+
+
+ //invoke named object.
+ }
+}
diff --git a/src/main/java/org/pdfbox/util/operator/pagedrawer/LineTo.java b/src/main/java/org/pdfbox/util/operator/pagedrawer/LineTo.java
new file mode 100644
index 0000000..a70099b
--- /dev/null
+++ b/src/main/java/org/pdfbox/util/operator/pagedrawer/LineTo.java
@@ -0,0 +1,65 @@
+/**
+ * Copyright (c) 2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.util.operator.pagedrawer;
+
+import java.util.List;
+
+import org.pdfbox.cos.COSNumber;
+import org.pdfbox.pdfviewer.PageDrawer;
+import org.pdfbox.util.PDFOperator;
+import org.pdfbox.util.operator.OperatorProcessor;
+
+/**
+ * Implementation of content stream operator for page drawer.
+ *
+ * @author Ben Litchfield (ben@benlitchfield.com)
+ * @version $Revision: 1.1 $
+ */
+public class LineTo extends OperatorProcessor
+{
+
+
+ /**
+ * process : l : Append straight line segment to path.
+ * @param operator The operator that is being executed.
+ * @param arguments List
+ */
+ public void process(PDFOperator operator, List arguments)
+ {
+ PageDrawer drawer = (PageDrawer)context;
+
+ //append straight line segment from the current point to the point.
+ COSNumber x = (COSNumber)arguments.get( 0 );
+ COSNumber y = (COSNumber)arguments.get( 1 );
+
+ drawer.getLinePath().lineTo( x.floatValue(), (float)drawer.fixY( x.doubleValue(), y.doubleValue()) );
+ }
+}
diff --git a/src/main/java/org/pdfbox/util/operator/pagedrawer/MoveTo.java b/src/main/java/org/pdfbox/util/operator/pagedrawer/MoveTo.java
new file mode 100644
index 0000000..e1c8f1e
--- /dev/null
+++ b/src/main/java/org/pdfbox/util/operator/pagedrawer/MoveTo.java
@@ -0,0 +1,68 @@
+/**
+ * Copyright (c) 2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.util.operator.pagedrawer;
+
+import java.awt.geom.GeneralPath;
+import java.util.List;
+
+import org.pdfbox.cos.COSNumber;
+import org.pdfbox.pdfviewer.PageDrawer;
+import org.pdfbox.util.PDFOperator;
+import org.pdfbox.util.operator.OperatorProcessor;
+
+/**
+ * Implementation of content stream operator for page drawer.
+ *
+ * @author Ben Litchfield (ben@benlitchfield.com)
+ * @version $Revision: 1.1 $
+ */
+public class MoveTo extends OperatorProcessor
+{
+
+
+ /**
+ * process : m : Begin new subpath.
+ * @param operator The operator that is being executed.
+ * @param arguments List
+ */
+ public void process(PDFOperator operator, List arguments)
+ {
+ PageDrawer drawer = (PageDrawer)context;
+
+ COSNumber x = (COSNumber)arguments.get( 0 );
+ COSNumber y = (COSNumber)arguments.get( 1 );
+
+ drawer.getLineSubPaths().add( drawer.getLinePath() );
+ GeneralPath newPath = new GeneralPath();
+ newPath.moveTo( x.floatValue(), (float)drawer.fixY( x.doubleValue(), y.doubleValue()) );
+ drawer.setLinePath( newPath );
+ }
+}
diff --git a/src/main/java/org/pdfbox/util/operator/pagedrawer/SetLineWidth.java b/src/main/java/org/pdfbox/util/operator/pagedrawer/SetLineWidth.java
new file mode 100644
index 0000000..4217451
--- /dev/null
+++ b/src/main/java/org/pdfbox/util/operator/pagedrawer/SetLineWidth.java
@@ -0,0 +1,65 @@
+/**
+ * Copyright (c) 2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.util.operator.pagedrawer;
+
+import java.util.List;
+import org.pdfbox.pdfviewer.PageDrawer;
+import org.pdfbox.util.PDFOperator;
+
+import java.awt.BasicStroke;
+import java.io.IOException;
+
+/**
+ * Implementation of content stream operator for page drawer.
+ *
+ * @author Ben Litchfield (ben@benlitchfield.com)
+ * @version $Revision: 1.1 $
+ */
+public class SetLineWidth extends org.pdfbox.util.operator.SetLineWidth
+{
+
+ /**
+ * w Set line width.
+ * @param operator The operator that is being executed.
+ * @param arguments List
+ * @throws IOException If an error occurs while processing the font.
+ */
+ public void process(PDFOperator operator, List arguments) throws IOException
+ {
+ super.process( operator, arguments );
+ float lineWidth = (float)context.getGraphicsState().getLineWidth();
+ if( lineWidth == 0 )
+ {
+ lineWidth = 1;
+ }
+ ((PageDrawer)context).getGraphics().setStroke( new BasicStroke( lineWidth ) );
+ }
+}
diff --git a/src/main/java/org/pdfbox/util/operator/pagedrawer/SetNonStrokingCMYKColor.java b/src/main/java/org/pdfbox/util/operator/pagedrawer/SetNonStrokingCMYKColor.java
new file mode 100644
index 0000000..d1c37fe
--- /dev/null
+++ b/src/main/java/org/pdfbox/util/operator/pagedrawer/SetNonStrokingCMYKColor.java
@@ -0,0 +1,64 @@
+/**
+ * Copyright (c) 2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.util.operator.pagedrawer;
+
+import java.util.List;
+
+import java.awt.Color;
+import java.io.IOException;
+
+import org.pdfbox.pdfviewer.PageDrawer;
+import org.pdfbox.pdmodel.graphics.color.PDColorSpaceInstance;
+import org.pdfbox.util.PDFOperator;
+
+/**
+ * Implementation of content stream operator for page drawer.
+ *
+ * @author Ben Litchfield (ben@benlitchfield.com)
+ * @version $Revision: 1.1 $
+ */
+public class SetNonStrokingCMYKColor extends org.pdfbox.util.operator.SetNonStrokingCMYKColor
+{
+ /**
+ * k Set color space for non stroking operations.
+ * @param operator The operator that is being executed.
+ * @param arguments List
+ * @throws IOException If an error occurs while processing the font.
+ */
+ public void process(PDFOperator operator, List arguments) throws IOException
+ {
+ super.process( operator, arguments );
+ PageDrawer drawer = (PageDrawer)context;
+ PDColorSpaceInstance colorInstance = drawer.getGraphicsState().getNonStrokingColorSpace();
+ Color color = colorInstance.createColor();
+ drawer.setNonStrokingColor( color );
+ }
+}
diff --git a/src/main/java/org/pdfbox/util/operator/pagedrawer/SetNonStrokingColorSpace.java b/src/main/java/org/pdfbox/util/operator/pagedrawer/SetNonStrokingColorSpace.java
new file mode 100644
index 0000000..e5abae8
--- /dev/null
+++ b/src/main/java/org/pdfbox/util/operator/pagedrawer/SetNonStrokingColorSpace.java
@@ -0,0 +1,71 @@
+/**
+ * Copyright (c) 2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.util.operator.pagedrawer;
+
+import java.util.List;
+import org.pdfbox.pdfviewer.PageDrawer;
+import org.pdfbox.pdmodel.graphics.color.PDColorSpaceInstance;
+import org.pdfbox.util.PDFOperator;
+
+
+import java.awt.Color;
+import java.io.IOException;
+
+/**
+ * Implementation of content stream operator for page drawer.
+ *
+ * @author Ben Litchfield (ben@benlitchfield.com)
+ * @version $Revision: 1.1 $
+ */
+public class SetNonStrokingColorSpace extends org.pdfbox.util.operator.SetNonStrokingColorSpace
+{
+ /**
+ * cs Set color space for non stroking operations.
+ * @param operator The operator that is being executed.
+ * @param arguments List
+ * @throws IOException If an error occurs while processing the font.
+ */
+ public void process(PDFOperator operator, List arguments) throws IOException
+ {
+ try
+ {
+ super.process( operator, arguments );
+ PageDrawer drawer = (PageDrawer)context;
+ PDColorSpaceInstance colorInstance = drawer.getGraphicsState().getNonStrokingColorSpace();
+ Color color = colorInstance.createColor();
+ drawer.setNonStrokingColor( color );
+ }
+ catch( IOException e )
+ {
+ //ignore for now and continue drawing
+ }
+ }
+}
diff --git a/src/main/java/org/pdfbox/util/operator/pagedrawer/SetNonStrokingRGBColor.java b/src/main/java/org/pdfbox/util/operator/pagedrawer/SetNonStrokingRGBColor.java
new file mode 100644
index 0000000..f816d1f
--- /dev/null
+++ b/src/main/java/org/pdfbox/util/operator/pagedrawer/SetNonStrokingRGBColor.java
@@ -0,0 +1,65 @@
+/**
+ * Copyright (c) 2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.util.operator.pagedrawer;
+
+import java.util.List;
+
+import java.awt.Color;
+import java.io.IOException;
+
+import org.pdfbox.cos.COSNumber;
+import org.pdfbox.pdfviewer.PageDrawer;
+import org.pdfbox.util.PDFOperator;
+
+/**
+ * Implementation of content stream operator for page drawer.
+ *
+ * @author Ben Litchfield (ben@benlitchfield.com)
+ * @version $Revision: 1.1 $
+ */
+public class SetNonStrokingRGBColor extends org.pdfbox.util.operator.SetNonStrokingRGBColor
+{
+ /**
+ * rg Set color space for non stroking operations.
+ * @param operator The operator that is being executed.
+ * @param arguments List
+ * @throws IOException If an error occurs while processing the font.
+ */
+ public void process(PDFOperator operator, List arguments) throws IOException
+ {
+ super.process( operator, arguments );
+ PageDrawer drawer = (PageDrawer)context;
+ COSNumber r = (COSNumber)arguments.get( 0 );
+ COSNumber g = (COSNumber)arguments.get( 1 );
+ COSNumber b = (COSNumber)arguments.get( 2 );
+ drawer.setNonStrokingColor( new Color( r.floatValue(), g.floatValue(), b.floatValue() ) );
+ }
+}
diff --git a/src/main/java/org/pdfbox/util/operator/pagedrawer/SetStrokingCMYKColor.java b/src/main/java/org/pdfbox/util/operator/pagedrawer/SetStrokingCMYKColor.java
new file mode 100644
index 0000000..81fcef3
--- /dev/null
+++ b/src/main/java/org/pdfbox/util/operator/pagedrawer/SetStrokingCMYKColor.java
@@ -0,0 +1,64 @@
+/**
+ * Copyright (c) 2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.util.operator.pagedrawer;
+
+import java.util.List;
+
+import java.awt.Color;
+import java.io.IOException;
+
+import org.pdfbox.pdfviewer.PageDrawer;
+import org.pdfbox.pdmodel.graphics.color.PDColorSpaceInstance;
+import org.pdfbox.util.PDFOperator;
+
+/**
+ * Implementation of content stream operator for page drawer.
+ *
+ * @author Ben Litchfield (ben@benlitchfield.com)
+ * @version $Revision: 1.1 $
+ */
+public class SetStrokingCMYKColor extends org.pdfbox.util.operator.SetStrokingCMYKColor
+{
+ /**
+ * CS Set color space for stroking operations.
+ * @param operator The operator that is being executed.
+ * @param arguments List
+ * @throws IOException If an error occurs while processing the font.
+ */
+ public void process(PDFOperator operator, List arguments) throws IOException
+ {
+ super.process( operator, arguments );
+ PageDrawer drawer = (PageDrawer)context;
+ PDColorSpaceInstance colorInstance = drawer.getGraphicsState().getNonStrokingColorSpace();
+ Color color = colorInstance.createColor();
+ drawer.setStrokingColor( color );
+ }
+}
diff --git a/src/main/java/org/pdfbox/util/operator/pagedrawer/SetStrokingColorSpace.java b/src/main/java/org/pdfbox/util/operator/pagedrawer/SetStrokingColorSpace.java
new file mode 100644
index 0000000..22c9c5c
--- /dev/null
+++ b/src/main/java/org/pdfbox/util/operator/pagedrawer/SetStrokingColorSpace.java
@@ -0,0 +1,70 @@
+/**
+ * Copyright (c) 2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.util.operator.pagedrawer;
+
+import java.util.List;
+import org.pdfbox.pdfviewer.PageDrawer;
+import org.pdfbox.pdmodel.graphics.color.PDColorSpaceInstance;
+import org.pdfbox.util.PDFOperator;
+
+import java.awt.Color;
+import java.io.IOException;
+
+/**
+ * Implementation of content stream operator for page drawer.
+ *
+ * @author Ben Litchfield (ben@benlitchfield.com)
+ * @version $Revision: 1.1 $
+ */
+public class SetStrokingColorSpace extends org.pdfbox.util.operator.SetNonStrokingColorSpace
+{
+ /**
+ * CS Set color space for stroking operations.
+ * @param operator The operator that is being executed.
+ * @param arguments List
+ * @throws IOException If an error occurs while processing the font.
+ */
+ public void process(PDFOperator operator, List arguments) throws IOException
+ {
+ super.process( operator, arguments );
+ try
+ {
+ PageDrawer drawer = (PageDrawer)context;
+ PDColorSpaceInstance colorInstance = drawer.getGraphicsState().getNonStrokingColorSpace();
+ Color color = colorInstance.createColor();
+ drawer.setStrokingColor( color );
+ }
+ catch( IOException e )
+ {
+ //ignore for now and continue drawing
+ }
+ }
+}
diff --git a/src/main/java/org/pdfbox/util/operator/pagedrawer/SetStrokingRGBColor.java b/src/main/java/org/pdfbox/util/operator/pagedrawer/SetStrokingRGBColor.java
new file mode 100644
index 0000000..8d7099e
--- /dev/null
+++ b/src/main/java/org/pdfbox/util/operator/pagedrawer/SetStrokingRGBColor.java
@@ -0,0 +1,65 @@
+/**
+ * Copyright (c) 2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.util.operator.pagedrawer;
+
+import java.util.List;
+
+import java.awt.Color;
+import java.io.IOException;
+
+import org.pdfbox.cos.COSNumber;
+import org.pdfbox.pdfviewer.PageDrawer;
+import org.pdfbox.util.PDFOperator;
+
+/**
+ * Implementation of content stream operator for page drawer.
+ *
+ * @author Ben Litchfield (ben@benlitchfield.com)
+ * @version $Revision: 1.1 $
+ */
+public class SetStrokingRGBColor extends org.pdfbox.util.operator.SetStrokingRGBColor
+{
+ /**
+ * RG Set color space for stroking operations.
+ * @param operator The operator that is being executed.
+ * @param arguments List
+ * @throws IOException If an error occurs while processing the font.
+ */
+ public void process(PDFOperator operator, List arguments) throws IOException
+ {
+ super.process( operator, arguments );
+ PageDrawer drawer = (PageDrawer)context;
+ COSNumber r = (COSNumber)arguments.get( 0 );
+ COSNumber g = (COSNumber)arguments.get( 1 );
+ COSNumber b = (COSNumber)arguments.get( 2 );
+ drawer.setStrokingColor( new Color( r.floatValue(), g.floatValue(), b.floatValue() ) );
+ }
+}
diff --git a/src/main/java/org/pdfbox/util/operator/pagedrawer/StrokePath.java b/src/main/java/org/pdfbox/util/operator/pagedrawer/StrokePath.java
new file mode 100644
index 0000000..31a489c
--- /dev/null
+++ b/src/main/java/org/pdfbox/util/operator/pagedrawer/StrokePath.java
@@ -0,0 +1,73 @@
+/**
+ * Copyright (c) 2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox.util.operator.pagedrawer;
+
+import java.util.List;
+import org.pdfbox.pdfviewer.PageDrawer;
+import org.pdfbox.util.PDFOperator;
+
+import java.awt.Graphics2D;
+import java.awt.geom.GeneralPath;
+import java.io.IOException;
+
+/**
+ * Implementation of content stream operator for page drawer.
+ *
+ * @author Ben Litchfield (ben@benlitchfield.com)
+ * @version $Revision: 1.1 $
+ */
+public class StrokePath extends org.pdfbox.util.operator.SetLineWidth
+{
+
+ /**
+ * S stroke the path.
+ * @param operator The operator that is being executed.
+ * @param arguments List
+ *
+ * @throws IOException If an error occurs while processing the font.
+ */
+ public void process(PDFOperator operator, List arguments) throws IOException
+ {
+ PageDrawer drawer = (PageDrawer)context;
+ Graphics2D graphics = ((PageDrawer)context).getGraphics();
+ graphics.setColor( drawer.getStrokingColor() );
+ List subPaths = drawer.getLineSubPaths();
+ for( int i=0; i<subPaths.size(); i++ )
+ {
+ GeneralPath subPath = (GeneralPath)subPaths.get( i );
+ graphics.draw( subPath );
+ }
+ subPaths.clear();
+ GeneralPath path = drawer.getLinePath();
+ graphics.draw( path );
+ path.reset();
+ }
+}
diff --git a/src/main/java/org/pdfbox/util/operator/pagedrawer/package.html b/src/main/java/org/pdfbox/util/operator/pagedrawer/package.html
new file mode 100644
index 0000000..edb8444
--- /dev/null
+++ b/src/main/java/org/pdfbox/util/operator/pagedrawer/package.html
@@ -0,0 +1,9 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head>
+
+</head>
+<body>
+This package contains implementations of all of the PDF operators.
+</body>
+</html>
diff --git a/src/main/java/org/pdfbox/util/package.html b/src/main/java/org/pdfbox/util/package.html
new file mode 100644
index 0000000..f8948fb
--- /dev/null
+++ b/src/main/java/org/pdfbox/util/package.html
@@ -0,0 +1,9 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head>
+
+</head>
+<body>
+This package contains utility classes that are used by the PDFBox project.
+</body>
+</html>
diff --git a/src/main/java/test/pdfbox/TestAll.java b/src/main/java/test/pdfbox/TestAll.java
new file mode 100644
index 0000000..c1882fc
--- /dev/null
+++ b/src/main/java/test/pdfbox/TestAll.java
@@ -0,0 +1,88 @@
+/**
+ * Copyright (c) 2003-2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package test.pdfbox;
+
+import test.pdfbox.cos.TestCOSString;
+import test.pdfbox.encryption.TestEncryption;
+import test.pdfbox.filter.TestFilters;
+import test.pdfbox.pdmodel.TestFDF;
+import test.pdfbox.pdmodel.interactive.form.TestFields;
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+/**
+ * This is a holder for all test cases in the pdfbox system.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.6 $
+ */
+public class TestAll extends TestCase
+{
+
+ /**
+ * Constructor.
+ *
+ * @param name The name of the test to run.
+ */
+ public TestAll( String name )
+ {
+ super( name );
+ }
+
+ /**
+ * The main method to run tests.
+ *
+ * @param args The command line arguments.
+ */
+ public static void main( String[] args )
+ {
+ String[] arg = {TestAll.class.getName() };
+ junit.textui.TestRunner.main( arg );
+ }
+
+ /**
+ * This will get the suite of test that this class holds.
+ *
+ * @return All of the tests that this class holds.
+ */
+ public static Test suite()
+ {
+ TestSuite suite = new TestSuite();
+ suite.addTest( TestFilters.suite() );
+ suite.addTest( TestFDF.suite() );
+ suite.addTest( TestFields.suite() );
+ suite.addTest( TestEncryption.suite() );
+ suite.addTest( TestFDF.suite() );
+ suite.addTest( TestCOSString.suite() );
+ return suite;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/test/pdfbox/cos/TestCOSString.java b/src/main/java/test/pdfbox/cos/TestCOSString.java
new file mode 100644
index 0000000..19b3ca0
--- /dev/null
+++ b/src/main/java/test/pdfbox/cos/TestCOSString.java
@@ -0,0 +1,92 @@
+/**
+ * Copyright (c) 2003-2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package test.pdfbox.cos;
+
+import java.io.IOException;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+import org.pdfbox.cos.COSString;
+
+/**
+ * This will test all of the filters in the PDFBox system.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision$
+ */
+public class TestCOSString extends TestCase
+{
+
+ /**
+ * Constructor.
+ *
+ * @param name The name of the test to run.
+ */
+ public TestCOSString( String name )
+ {
+ super( name );
+ }
+
+ /**
+ * This will get the suite of test that this class holds.
+ *
+ * @return All of the tests that this class holds.
+ */
+ public static Test suite()
+ {
+ return new TestSuite( TestCOSString.class );
+ }
+
+ /**
+ * infamous main method.
+ *
+ * @param args The command line arguments.
+ */
+ public static void main( String[] args )
+ {
+ String[] arg = {TestCOSString.class.getName() };
+ junit.textui.TestRunner.main( arg );
+ }
+
+ /**
+ * This will test all of the filters in the system.
+ *
+ * @throws IOException If there is an exception while encoding.
+ */
+ public void testUnicode() throws IOException
+ {
+ String theString = "\u4e16";
+ COSString string = new COSString( theString );
+ assertTrue( string.getString().equals( theString ) );
+ }
+} \ No newline at end of file
diff --git a/src/main/java/test/pdfbox/cos/package.html b/src/main/java/test/pdfbox/cos/package.html
new file mode 100644
index 0000000..c64f742
--- /dev/null
+++ b/src/main/java/test/pdfbox/cos/package.html
@@ -0,0 +1,9 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head>
+
+</head>
+<body>
+These classes will be used to test the various COS objects that make up the core of PDFBox.
+</body>
+</html>
diff --git a/src/main/java/test/pdfbox/encryption/TestEncryption.java b/src/main/java/test/pdfbox/encryption/TestEncryption.java
new file mode 100644
index 0000000..e13de2a
--- /dev/null
+++ b/src/main/java/test/pdfbox/encryption/TestEncryption.java
@@ -0,0 +1,179 @@
+/**
+ * Copyright (c) 2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package test.pdfbox.encryption;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+import org.apache.log4j.Logger;
+
+import org.pdfbox.encryption.PDFEncryption;
+
+/**
+ * This will test the encryption algorithms in PDFBox.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.3 $
+ */
+public class TestEncryption extends TestCase
+{
+ private static Logger log = Logger.getLogger(TestEncryption.class);
+
+ /**
+ * Constructor.
+ *
+ * @param name The name of the test to run.
+ */
+ public TestEncryption( String name )
+ {
+ super( name );
+ }
+
+ /**
+ * This will get the suite of test that this class holds.
+ *
+ * @return All of the tests that this class holds.
+ */
+ public static Test suite()
+ {
+ return new TestSuite( TestEncryption.class );
+ }
+
+ /**
+ * infamous main method.
+ *
+ * @param args The command line arguments.
+ */
+ public static void main( String[] args )
+ {
+ String[] arg = {TestEncryption.class.getName() };
+ junit.textui.TestRunner.main( arg );
+ }
+
+ /**
+ * This will test some simple encryption.
+ *
+ * @throws Exception If there is an exception while encrypting.
+ */
+ public void testEncryption() throws Exception
+ {
+ byte[] key={0x65, 0x3d, 0x4f, 0x70, 0x0c };
+ byte[] data={0x31, 0x20, 0x30, 0x20, 0x30, 0x20, 0x72, 0x67, 0x20, 0x30,
+ 0x20, 0x30, 0x20, 0x33, 0x30, 0x38, 0x2e, 0x34, 0x37, 0x34,
+ 0x37, 0x20, 0x35, 0x37, 0x2e, 0x36, 0x32, 0x37, 0x31, 0x20,
+ 0x72, 0x65, 0x20, 0x66, 0x20, 0x30, 0x20, 0x47, 0x20, 0x31,
+ 0x20, 0x77, 0x20, 0x30, 0x2e, 0x35, 0x20, 0x30, 0x2e, 0x35,
+ 0x20, 0x33, 0x30, 0x37, 0x2e, 0x34, 0x37, 0x34, 0x37, 0x20,
+ 0x35, 0x36, 0x2e, 0x36, 0x32, 0x37, 0x31, 0x20, 0x72, 0x65,
+ 0x20, 0x73, 0x20, 0x2f, 0x54, 0x78, 0x20, 0x42, 0x4d, 0x43,
+ 0x20, 0x71, 0x20, 0x31, 0x20, 0x31, 0x20, 0x33, 0x30, 0x36,
+ 0x2e, 0x34, 0x37, 0x34, 0x37, 0x20, 0x35, 0x35, 0x2e, 0x36,
+ 0x32, 0x37, 0x31, 0x20, 0x72, 0x65, 0x20, 0x57, 0x20, 0x6e,
+ 0x20, 0x30, 0x20, 0x67, 0x20, 0x42, 0x54, 0x0a, 0x2f, 0x48,
+ 0x65, 0x6c, 0x76, 0x20, 0x31, 0x30, 0x20, 0x54, 0x66, 0x0a,
+ 0x32, 0x20, 0x32, 0x35, 0x2e, 0x31, 0x30, 0x33, 0x35, 0x20,
+ 0x54, 0x64, 0x0a, 0x31, 0x31, 0x2e, 0x35, 0x35, 0x39, 0x39,
+ 0x20, 0x54, 0x4c, 0x0a, 0x28, 0x2d, 0x2d, 0x5c, 0x30, 0x34,
+ 0x30, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5c, 0x30,
+ 0x34, 0x30, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5c, 0x30, 0x34,
+ 0x30, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5c, 0x30, 0x34, 0x30,
+ 0x2d, 0x2d, 0x29, 0x20, 0x54, 0x6a, 0x0a, 0x45, 0x54, 0x0a,
+ 0x20, 0x51, 0x20, 0x45, 0x4d, 0x43, (byte)0x8a, 0x0d, 0x0a
+ };
+ PDFEncryption enc = new PDFEncryption();
+ ByteArrayOutputStream output = new ByteArrayOutputStream();
+ enc.encryptData( 43, 0, key, new ByteArrayInputStream( data ), output );
+
+ byte[] encrypted = output.toByteArray();
+ printHexString( encrypted );
+
+ ByteArrayOutputStream sameAsInput = new ByteArrayOutputStream();
+ enc.encryptData( 43, 0, key, new ByteArrayInputStream( encrypted ), sameAsInput );
+ byte[] dataAgain = sameAsInput.toByteArray();
+ cmpArray( data, dataAgain );
+ }
+
+ /**
+ * This will compare a couple of arrays and fail if they do not match.
+ *
+ * @param firstArray The first array.
+ * @param secondArray The second array.
+ */
+ private void cmpArray( byte[] firstArray, byte[] secondArray )
+ {
+ if( firstArray.length != secondArray.length )
+ {
+ fail( "The array lengths do not match for " +
+ ", firstArray length was: " + firstArray.length +
+ ", secondArray length was: " + secondArray.length);
+ }
+
+ for( int i=0; i<firstArray.length; i++ )
+ {
+ if( firstArray[i] != secondArray[i] )
+ {
+ fail( "Array data does not match " );
+ }
+ }
+ }
+
+ /**
+ * This will print a byte array as a hex string to standard output.
+ *
+ * @param data The array to print.
+ */
+ private void printHexString( byte[] data )
+ {
+ for( int i=0; i<data.length; i++ )
+ {
+ int nextByte = (data[i] + 256)%256;
+ String hexString = Integer.toHexString( nextByte );
+ if( hexString.length() < 2 )
+ {
+ hexString = "0" + hexString;
+ }
+ System.out.print( hexString );
+ if( i != 0 && (i+1) % 2 == 0 )
+ {
+ System.out.print( " " );
+ }
+ else if( i!= 0 &&i % 20 == 0 )
+ {
+ System.out.println();
+ }
+ }
+ System.out.println();
+ }
+} \ No newline at end of file
diff --git a/src/main/java/test/pdfbox/encryption/package.html b/src/main/java/test/pdfbox/encryption/package.html
new file mode 100644
index 0000000..1dcaad7
--- /dev/null
+++ b/src/main/java/test/pdfbox/encryption/package.html
@@ -0,0 +1,9 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head>
+
+</head>
+<body>
+These classes will be used to test the various encryption algorithms that are used in PDFBox.
+</body>
+</html>
diff --git a/src/main/java/test/pdfbox/filter/TestFilters.java b/src/main/java/test/pdfbox/filter/TestFilters.java
new file mode 100644
index 0000000..db124eb
--- /dev/null
+++ b/src/main/java/test/pdfbox/filter/TestFilters.java
@@ -0,0 +1,182 @@
+/**
+ * Copyright (c) 2003-2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package test.pdfbox.filter;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.File;
+import java.io.FileInputStream;
+
+import java.util.Collection;
+import java.util.Iterator;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+import org.apache.log4j.Logger;
+
+import org.pdfbox.cos.COSDictionary;
+
+import org.pdfbox.filter.DCTFilter;
+import org.pdfbox.filter.CCITTFaxDecodeFilter;
+import org.pdfbox.filter.Filter;
+import org.pdfbox.filter.FilterManager;
+import org.pdfbox.filter.RunLengthDecodeFilter;
+
+/**
+ * This will test all of the filters in the PDFBox system.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.5 $
+ */
+public class TestFilters extends TestCase
+{
+ private static Logger log = Logger.getLogger(TestFilters.class);
+
+ private static final int BUFFER_SIZE = 2048;
+ private static final COSDictionary EMPTY_DICTIONARY = new COSDictionary();
+
+ /**
+ * Constructor.
+ *
+ * @param name The name of the test to run.
+ */
+ public TestFilters( String name )
+ {
+ super( name );
+ }
+
+ /**
+ * This will get the suite of test that this class holds.
+ *
+ * @return All of the tests that this class holds.
+ */
+ public static Test suite()
+ {
+ return new TestSuite( TestFilters.class );
+ }
+
+ /**
+ * This will test all of the filters in the system.
+ *
+ * @throws IOException If there is an exception while encoding.
+ */
+ public void testFilters() throws IOException
+ {
+ FilterManager manager = new FilterManager();
+ Collection filters = manager.getFilters();
+
+ Iterator filterIter = filters.iterator();
+ while( filterIter.hasNext() )
+ {
+ long start = System.currentTimeMillis();
+ Filter filter = (Filter)filterIter.next();
+ if( !(filter instanceof DCTFilter ||
+ filter instanceof CCITTFaxDecodeFilter ||
+ filter instanceof RunLengthDecodeFilter))
+ {
+ checkFilter( new File( "classes" ), filter );
+ long stop = System.currentTimeMillis();
+ System.out.println( "Time for filter " + filter.getClass().getName() + "=" + (stop-start) );
+ }
+ }
+ }
+
+ /**
+ * This will check the filter.
+ *
+ * @param file The file or directory to test.
+ * @param filter The filter to check.
+ *
+ * @throws IOException If there is an exception while encoding.
+ */
+ private void checkFilter( File file, Filter filter ) throws IOException
+ {
+ if( file.isDirectory() )
+ {
+ File[] subFiles = file.listFiles();
+ for( int i=0; i<subFiles.length; i++ )
+ {
+ checkFilter( subFiles[i], filter );
+ }
+ }
+ else
+ {
+ log.debug("Checking filter: " + filter + ", with file: " + file.getAbsolutePath());
+ ByteArrayOutputStream output = new ByteArrayOutputStream();
+
+ ByteArrayOutputStream encoded = new ByteArrayOutputStream();
+ ByteArrayOutputStream decoded = new ByteArrayOutputStream();
+ FileInputStream fin = new FileInputStream( file );
+ int amountRead = 0;
+ byte[] buffer = new byte[ BUFFER_SIZE ];
+ while( (amountRead = fin.read( buffer, 0, BUFFER_SIZE )) != -1 )
+ {
+ output.write( buffer, 0, amountRead );
+ }
+ fin.close();
+ byte[] original = output.toByteArray();
+ filter.encode( new ByteArrayInputStream( original ), encoded, EMPTY_DICTIONARY );
+ filter.decode( new ByteArrayInputStream( encoded.toByteArray() ), decoded, EMPTY_DICTIONARY );
+
+ cmpArray( original, decoded.toByteArray(), filter, file );
+ }
+ }
+
+ /**
+ * This will compare a couple of arrays and fail if they do not match.
+ *
+ * @param firstArray The first array.
+ * @param secondArray The second array.
+ * @param filter The filter that did the encoding.
+ * @param file The file that was encoded.
+ */
+ private void cmpArray( byte[] firstArray, byte[] secondArray, Filter filter, File file )
+ {
+ String fileMsg = filter.getClass().getName() + " " + file.getAbsolutePath();
+ if( firstArray.length != secondArray.length )
+ {
+ fail( "The array lengths do not match for " + fileMsg +
+ ", firstArray length was: " + firstArray.length +
+ ", secondArray length was: " + secondArray.length);
+ }
+
+ for( int i=0; i<firstArray.length; i++ )
+ {
+ if( firstArray[i] != secondArray[i] )
+ {
+ fail( "Array data does not match " + fileMsg );
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/src/main/java/test/pdfbox/filter/package.html b/src/main/java/test/pdfbox/filter/package.html
new file mode 100644
index 0000000..41556d1
--- /dev/null
+++ b/src/main/java/test/pdfbox/filter/package.html
@@ -0,0 +1,9 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head>
+
+</head>
+<body>
+These classes will be used to test the various filters that are available with PDFBox.
+</body>
+</html>
diff --git a/src/main/java/test/pdfbox/package.html b/src/main/java/test/pdfbox/package.html
new file mode 100644
index 0000000..2d5d590
--- /dev/null
+++ b/src/main/java/test/pdfbox/package.html
@@ -0,0 +1,9 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head>
+
+</head>
+<body>
+This holds classes that will be used to test all of PDFBox.
+</body>
+</html>
diff --git a/src/main/java/test/pdfbox/pdfparser/TestPDFParser.java b/src/main/java/test/pdfbox/pdfparser/TestPDFParser.java
new file mode 100644
index 0000000..e935af3
--- /dev/null
+++ b/src/main/java/test/pdfbox/pdfparser/TestPDFParser.java
@@ -0,0 +1,126 @@
+/**
+ * Copyright (c) 2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package test.pdfbox.pdfparser;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+import org.pdfbox.cos.COSName;
+
+import org.pdfbox.pdfparser.BaseParser;
+
+
+/**
+ * This will test the PDF parsing in PDFBox.
+ *
+ * @author Ben Litchfield (ben@benlitchfield.com)
+ * @version $Revision: 1.1 $
+ */
+public class TestPDFParser extends TestCase
+{
+ //private static Logger log = Logger.getLogger(TestFDF.class);
+
+ /**
+ * Constructor.
+ *
+ * @param name The name of the test to run.
+ */
+ public TestPDFParser( String name )
+ {
+ super( name );
+ }
+
+ /**
+ * This will get the suite of test that this class holds.
+ *
+ * @return All of the tests that this class holds.
+ */
+ public static Test suite()
+ {
+ return new TestSuite( TestPDFParser.class );
+ }
+
+ /**
+ * infamous main method.
+ *
+ * @param args The command line arguments.
+ */
+ public static void main( String[] args )
+ {
+ String[] arg = {TestPDFParser.class.getName() };
+ junit.textui.TestRunner.main( arg );
+ }
+
+ /**
+ * This will test some cos name parsing.
+ *
+ * @throws Exception If there is an exception while parsing.
+ */
+ public void testCOSName() throws Exception
+ {
+ TestParser parser = new TestParser(new ByteArrayInputStream( "/PANTONE#20116#20CV".getBytes() ) );
+ COSName name = parser.parseCOSName();
+ assertTrue("Failed to parse COSName",name.getName().equals( "PANTONE 116 CV" ));
+
+ }
+
+ /**
+ * A simple class used to test parsing of the cos name.
+ */
+ private class TestParser extends BaseParser
+ {
+ /**
+ * Constructor.
+ * @param input The input stream.
+ * @throws IOException If there is an error during parsing.
+ */
+ public TestParser( InputStream input) throws IOException
+ {
+ super( input );
+ }
+
+ /**
+ * Expose the parseCOSName as public.
+ *
+ * @return The parsed cos name.
+ * @throws IOException If there is an error parsing the COSName.
+ */
+ public COSName parseCOSName() throws IOException
+ {
+ return super.parseCOSName();
+ }
+ }
+} \ No newline at end of file
diff --git a/src/main/java/test/pdfbox/pdfparser/package.html b/src/main/java/test/pdfbox/pdfparser/package.html
new file mode 100644
index 0000000..d723694
--- /dev/null
+++ b/src/main/java/test/pdfbox/pdfparser/package.html
@@ -0,0 +1,9 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head>
+
+</head>
+<body>
+This holds classes that will be used to test the pdf parsing classes.
+</body>
+</html>
diff --git a/src/main/java/test/pdfbox/pdmodel/TestFDF.java b/src/main/java/test/pdfbox/pdmodel/TestFDF.java
new file mode 100644
index 0000000..d17ed11
--- /dev/null
+++ b/src/main/java/test/pdfbox/pdmodel/TestFDF.java
@@ -0,0 +1,292 @@
+/**
+ * Copyright (c) 2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package test.pdfbox.pdmodel;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.util.List;
+import java.util.Map;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+import org.pdfbox.cos.COSStream;
+import org.pdfbox.cos.COSString;
+import org.pdfbox.pdfparser.PDFStreamParser;
+import org.pdfbox.pdmodel.PDDocument;
+import org.pdfbox.pdmodel.fdf.FDFDocument;
+import org.pdfbox.pdmodel.interactive.annotation.PDAppearanceStream;
+import org.pdfbox.pdmodel.interactive.annotation.PDAnnotationWidget;
+import org.pdfbox.pdmodel.interactive.form.PDAcroForm;
+import org.pdfbox.pdmodel.interactive.form.PDField;
+import org.pdfbox.pdmodel.interactive.form.PDRadioCollection;
+import org.pdfbox.pdmodel.interactive.form.PDTextbox;
+
+/**
+ * This will test the FDF algorithms in PDFBox.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.5 $
+ */
+public class TestFDF extends TestCase
+{
+ //private static Logger log = Logger.getLogger(TestFDF.class);
+
+ /**
+ * Constructor.
+ *
+ * @param name The name of the test to run.
+ */
+ public TestFDF( String name )
+ {
+ super( name );
+ }
+
+ /**
+ * This will get the suite of test that this class holds.
+ *
+ * @return All of the tests that this class holds.
+ */
+ public static Test suite()
+ {
+ return new TestSuite( TestFDF.class );
+ }
+
+ /**
+ * infamous main method.
+ *
+ * @param args The command line arguments.
+ */
+ public static void main( String[] args )
+ {
+ String[] arg = {TestFDF.class.getName() };
+ junit.textui.TestRunner.main( arg );
+ }
+
+ /**
+ * This will test some simple field setting.
+ *
+ * @throws Exception If there is an exception while encrypting.
+ */
+ public void testFDFfdeb() throws Exception
+ {
+ PDDocument fdeb = null;
+ try
+ {
+ fdeb = PDDocument.load( "test/input/fdeb.pdf" );
+ PDAcroForm form = fdeb.getDocumentCatalog().getAcroForm();
+ PDTextbox field = (PDTextbox)form.getField( "f67_1" );
+ field.setValue( "2" );
+
+ String expected =
+ "/Tx BMC " +
+ "BT " +
+ "/Helv 9 Tf " +
+ " 0 g " +
+ " 2 1.985585 Td " +
+ "2.07698 0 Td " +
+ "(2) Tj " +
+ "ET " +
+ "EMC";
+
+ testContentStreams( fdeb, field, expected );
+ }
+ finally
+ {
+ fdeb.close();
+ }
+
+ }
+
+ /**
+ * This will test a pdf with lots of fields.
+ *
+ * @throws Exception If there is an exception while encrypting.
+ */
+ public void testFDFPDFWithLotsOfFields() throws Exception
+ {
+ PDDocument fdeb = null;
+ try
+ {
+ fdeb = PDDocument.load( "test/input/pdf_with_lots_of_fields.pdf" );
+ PDAcroForm form = fdeb.getDocumentCatalog().getAcroForm();
+ PDTextbox feld2 = (PDTextbox)form.getField( "Feld.2" );
+ feld2.setValue( "Benjamin" );
+
+ String expected =
+ "1 1 0.8000000119 rg " +
+ " 0 0 127.5 19.8299999237 re " +
+ " f " +
+ " 0 0 0 RG " +
+ " 1 w " +
+ " 0.5 0.5 126.5 18.8299999237 re " +
+ " S " +
+ " 0.5 g " +
+ " 1 1 m " +
+ " 1 18.8299999237 l " +
+ " 126.5 18.8299999237 l " +
+ " 125.5 17.8299999237 l " +
+ " 2 17.8299999237 l " +
+ " 2 2 l " +
+ " 1 1 l " +
+ " f " +
+ " 0.75 g " +
+ " 1 1 m " +
+ " 126.5 1 l " +
+ " 126.5 18.8299999237 l " +
+ " 125.5 17.8299999237 l " +
+ " 125.5 2 l " +
+ " 2 2 l " +
+ " 1 1 l " +
+ " f " +
+ " /Tx BMC " +
+ "BT " +
+ "/Helv 14 Tf " +
+ " 0 0 0 rg " +
+ " 4 4.721 Td " +
+ "(Benjamin) Tj " +
+ "ET " +
+ "EMC";
+
+ testContentStreams( fdeb, feld2, expected );
+
+ PDRadioCollection feld3 = (PDRadioCollection)form.getField( "Feld.3" );
+ feld3.setValue("RB1");
+ assertEquals( "RB1", feld3.getValue() );
+ //assertEquals( ((PDCheckbox)feld3.getKids().get( 0 )).getValue(), "RB1" );
+
+ }
+ finally
+ {
+ fdeb.close();
+ }
+ }
+
+ /**
+ * This will test the Freedom pdf.
+ *
+ * @throws Exception If there is an error while testing.
+ */
+ public void testFDFFreedomExpressions() throws Exception
+ {
+ PDDocument freedom = null;
+ FDFDocument fdf = null;
+ try
+ {
+ freedom = PDDocument.load( "test/input/FreedomExpressions.pdf" );
+ fdf = FDFDocument.load( "test/input/FreedomExpressions.fdf" );
+ PDAcroForm form = freedom.getDocumentCatalog().getAcroForm();
+ form.importFDF( fdf );
+ PDTextbox feld2 = (PDTextbox)form.getField( "eeFirstName" );
+ List kids = feld2.getKids();
+ PDField firstKid = (PDField)kids.get( 0 );
+ PDField secondKid = (PDField)kids.get( 1 );
+ testContentStreamContains( freedom, firstKid, "Steve" );
+ testContentStreamContains( freedom, secondKid, "Steve" );
+
+ //the appearance stream is suppose to be null because there
+ //is an F action in the AA dictionary that populates that field.
+ PDField totalAmt = form.getField( "eeSuppTotalAmt" );
+ assertTrue( totalAmt.getDictionary().getDictionaryObject( "AP" ) == null );
+
+ }
+ finally
+ {
+ if( freedom != null )
+ {
+ freedom.close();
+ }
+ if( fdf != null )
+ {
+ fdf.close();
+ }
+ }
+ }
+
+ private void testContentStreamContains( PDDocument doc, PDField field, String expected ) throws Exception
+ {
+ PDAnnotationWidget widget = field.getWidget();
+ Map normalAppearance = widget.getAppearance().getNormalAppearance();
+ PDAppearanceStream appearanceStream = (PDAppearanceStream)normalAppearance.get( "default" );
+ COSStream actual = appearanceStream.getStream();
+
+ List actualTokens = getStreamTokens( doc, actual );
+ assertTrue( actualTokens.contains( new COSString( expected ) ) );
+ }
+
+ private void testContentStreams( PDDocument doc, PDField field, String expected ) throws Exception
+ {
+ PDAnnotationWidget widget = field.getWidget();
+ Map normalAppearance = widget.getAppearance().getNormalAppearance();
+ PDAppearanceStream appearanceStream = (PDAppearanceStream)normalAppearance.get( "default" );
+ COSStream actual = appearanceStream.getStream();
+
+ List actualTokens = getStreamTokens( doc, actual );
+ List expectedTokens = getStreamTokens( doc, expected );
+ assertEquals( actualTokens.size(), expectedTokens.size() );
+ for( int i=0; i<actualTokens.size(); i++ )
+ {
+ Object actualToken = actualTokens.get( i );
+ Object expectedToken = expectedTokens.get( i );
+ assertEquals( actualToken, expectedToken );
+ }
+ }
+
+ private List getStreamTokens( PDDocument doc, String string ) throws IOException
+ {
+ PDFStreamParser parser;
+
+ List tokens = null;
+ if( string != null )
+ {
+ ByteArrayInputStream stream = new ByteArrayInputStream( string.getBytes() );
+ parser = new PDFStreamParser( stream, doc.getDocument().getScratchFile() );
+ parser.parse();
+ tokens = parser.getTokens();
+ }
+ return tokens;
+ }
+
+ private List getStreamTokens( PDDocument doc, COSStream stream ) throws IOException
+ {
+ PDFStreamParser parser;
+
+ List tokens = null;
+ if( stream != null )
+ {
+ parser = new PDFStreamParser( stream );
+ parser.parse();
+ tokens = parser.getTokens();
+ }
+ return tokens;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/test/pdfbox/pdmodel/interactive/form/TestFields.java b/src/main/java/test/pdfbox/pdmodel/interactive/form/TestFields.java
new file mode 100644
index 0000000..8453fbc
--- /dev/null
+++ b/src/main/java/test/pdfbox/pdmodel/interactive/form/TestFields.java
@@ -0,0 +1,144 @@
+/**
+ * Copyright (c) 2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package test.pdfbox.pdmodel.interactive.form;
+
+import java.io.IOException;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+import org.pdfbox.pdmodel.PDDocument;
+import org.pdfbox.pdmodel.interactive.form.PDAcroForm;
+import org.pdfbox.pdmodel.interactive.form.PDTextbox;
+
+/**
+ * This will test the form fields in PDFBox.
+ *
+ * @author Ben Litchfield (ben@benlitchfield.com)
+ * @version $Revision: 1.3 $
+ */
+public class TestFields extends TestCase
+{
+ //private static Logger log = Logger.getLogger(TestFDF.class);
+
+ /**
+ * Constructor.
+ *
+ * @param name The name of the test to run.
+ */
+ public TestFields( String name )
+ {
+ super( name );
+ }
+
+ /**
+ * This will get the suite of test that this class holds.
+ *
+ * @return All of the tests that this class holds.
+ */
+ public static Test suite()
+ {
+ return new TestSuite( TestFields.class );
+ }
+
+ /**
+ * infamous main method.
+ *
+ * @param args The command line arguments.
+ */
+ public static void main( String[] args )
+ {
+ String[] arg = {TestFields.class.getName() };
+ junit.textui.TestRunner.main( arg );
+ }
+
+ /**
+ * This will test setting field flags on the PDField.
+ *
+ * @throws IOException If there is an error creating the field.
+ */
+ public void testFlags() throws IOException
+ {
+ PDDocument doc = null;
+ try
+ {
+ doc = new PDDocument();
+ PDAcroForm form = new PDAcroForm( doc );
+ PDTextbox textBox = new PDTextbox(form);
+
+ //assert that default is false.
+ assertFalse( textBox.shouldComb() );
+
+ //try setting and clearing a single field
+ textBox.setComb( true );
+ assertTrue( textBox.shouldComb() );
+ textBox.setComb( false );
+ assertFalse( textBox.shouldComb() );
+
+ //try setting and clearing multiple fields
+ textBox.setComb( true );
+ textBox.setDoNotScroll( true );
+ assertTrue( textBox.shouldComb() );
+ assertTrue( textBox.doNotScroll() );
+
+ textBox.setComb( false );
+ textBox.setDoNotScroll( false );
+ assertFalse( textBox.shouldComb() );
+ assertFalse( textBox.doNotScroll() );
+
+ //assert that setting a field to false multiple times works
+ textBox.setComb( false );
+ assertFalse( textBox.shouldComb() );
+ textBox.setComb( false );
+ assertFalse( textBox.shouldComb() );
+
+ //assert that setting a field to true multiple times works
+ textBox.setComb( true );
+ assertTrue( textBox.shouldComb() );
+ textBox.setComb( true );
+ assertTrue( textBox.shouldComb() );
+
+
+
+
+
+ }
+ finally
+ {
+ if( doc != null )
+ {
+ doc.close();
+ }
+ }
+ }
+
+} \ No newline at end of file
diff --git a/src/main/java/test/pdfbox/pdmodel/interactive/form/package.html b/src/main/java/test/pdfbox/pdmodel/interactive/form/package.html
new file mode 100644
index 0000000..d6c2f8c
--- /dev/null
+++ b/src/main/java/test/pdfbox/pdmodel/interactive/form/package.html
@@ -0,0 +1,9 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head>
+
+</head>
+<body>
+This holds classes that will be used to test pdmodel form classes.
+</body>
+</html>
diff --git a/src/main/java/test/pdfbox/pdmodel/package.html b/src/main/java/test/pdfbox/pdmodel/package.html
new file mode 100644
index 0000000..7cb4cde
--- /dev/null
+++ b/src/main/java/test/pdfbox/pdmodel/package.html
@@ -0,0 +1,9 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head>
+
+</head>
+<body>
+This holds classes that will be used to test pdmodel classes.
+</body>
+</html>
diff --git a/src/main/java/test/pdfbox/util/TestTextStripper.java b/src/main/java/test/pdfbox/util/TestTextStripper.java
new file mode 100644
index 0000000..c425f38
--- /dev/null
+++ b/src/main/java/test/pdfbox/util/TestTextStripper.java
@@ -0,0 +1,371 @@
+/**
+ * Copyright (c) 2003-2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILIT, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ */
+package test.pdfbox.util;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FilenameFilter;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.LineNumberReader;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.io.Writer;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+import org.apache.log4j.Logger;
+import org.apache.log4j.Level;
+
+import org.pdfbox.pdmodel.PDDocument;
+
+import org.pdfbox.util.PDFTextStripper;
+
+/**
+ * Test suite for PDFTextStripper.
+ *
+ * FILE SET VALIDATION
+ *
+ * This test suite is designed to test PDFTextStripper using a set of PDF
+ * files and known good output for each. The default mode of testAll()
+ * is to process each *.pdf file in "test/input". An output file is
+ * created in "test/output" with the same name as the PDF file, plus an
+ * additional ".txt" suffix.
+ *
+ * The output file is then tested against a known good result file from
+ * the input directory (again, with the same name as the tested PDF file,
+ * but with the additional ".txt" suffix).
+ *
+ * So for the file "test/input/hello.pdf", an output file will be generated
+ * named "test/output/hello.pdf.txt". Then that file will be compared to
+ * the known good file "test/input/hello.pdf.txt", if it exists.
+ *
+ * Any errors are logged, and at the end of processing all *.pdf files, if
+ * there were any errors, the test fails. The logging is at INFO, as the
+ * general goal is overall validation, and on failure, the indication of
+ * which file or files failed.
+ *
+ * When processing new PDF files, you may use testAll() to generate output,
+ * verify the output manually, then move the output file to the test input
+ * directory to use as the basis for future validations.
+ *
+ * SINGLE FILE VALIDATION
+ *
+ * To further research individual failures, the test.pdfbox.util.TextStripper.file
+ * system property may be set with the name of a single file in the "test/input"
+ * directory. In this mode, testAll() will evaluate only that file, and will
+ * do so with DEBUG level logging. You can set this property from ant by
+ * defining "file", as in:
+ *
+ * ant testextract -Dfile=hello.pdf
+ *
+ * @author Robert Dickinson (bob@brutesquadlabs.com)
+ * @author Ben Litchfield (ben@benlitchfield.com)
+ * @version $Revision: 1.14 $
+ */
+public class TestTextStripper extends TestCase
+{
+ private static Logger log = Logger.getLogger(TestTextStripper.class);
+
+ private boolean bFail = false;
+ private PDFTextStripper stripper = null;
+
+ /**
+ * Test class constructor.
+ *
+ * @param name The name of the test class.
+ *
+ * @throws IOException If there is an error creating the test.
+ */
+ public TestTextStripper( String name ) throws IOException
+ {
+ super( name );
+ stripper = new PDFTextStripper();
+ stripper.setLineSeparator("\n");
+ }
+
+ /**
+ * Test suite setup.
+ */
+ public void setUp()
+ {
+ // If you want to test a single file using DEBUG logging, from an IDE,
+ // you can do something like this:
+ //
+ // System.setProperty("test.pdfbox.util.TextStripper.file", "FVS318Ref.pdf");
+ }
+
+ /**
+ * Determine whether two strings are equal, where two null strings are
+ * considered equal.
+ *
+ * @param expected Excpected string
+ * @param actual Actual String
+ * @return <code>true</code> is the strings are both null,
+ * or if their contents are the same, otherwise <code>false</code>.
+ */
+ private boolean stringsEqual(String expected, String actual)
+ {
+ boolean equals = true;
+ if( (expected == null) && (actual == null) )
+ {
+ return true;
+ }
+ else if( expected != null && actual != null )
+ {
+ expected = expected.trim();
+ actual = actual.trim();
+ char[] expectedArray = expected.toCharArray();
+ char[] actualArray = actual.toCharArray();
+ int expectedIndex = 0;
+ int actualIndex = 0;
+ while( expectedIndex<expectedArray.length && actualIndex<actualArray.length )
+ {
+ if( expectedArray[expectedIndex] != actualArray[actualIndex] )
+ {
+ equals = false;
+ log.error("Lines differ at index"
+ + " expected:" + expectedIndex + "-" + (int)expectedArray[expectedIndex]
+ + " actual:" + actualIndex + "-" + (int)actualArray[actualIndex] );
+ break;
+ }
+ expectedIndex = skipWhitespace( expectedArray, expectedIndex );
+ actualIndex = skipWhitespace( actualArray, actualIndex );
+ expectedIndex++;
+ actualIndex++;
+ }
+ if( equals )
+ {
+ if( expectedIndex != expectedArray.length )
+ {
+ equals = false;
+ log.error("Expected line is longer at:" + expectedIndex );
+ }
+ if( actualIndex != actualArray.length )
+ {
+ equals = false;
+ log.error("Actual line is longer at:" + actualIndex );
+ }
+ }
+ }
+ else if( ( expected == null && actual != null && actual.trim().equals( "" ) ) ||
+ ( actual == null && expected != null && expected.trim().equals( "" ) ) )
+ {
+ //basically there are some cases where pdfbox will put an extra line
+ //at the end of the file, who cares, this is not enough to report
+ // a failure
+ equals = true;
+ }
+ else
+ {
+ equals = false;
+ }
+ return equals;
+ }
+
+ /**
+ * If the current index is whitespace then skip any subsequent whitespace.
+ */
+ private int skipWhitespace( char[] array, int index )
+ {
+ //if we are at a space character then skip all space
+ //characters, but when all done rollback 1 because stringsEqual
+ //will roll forward 1
+ if( array[index] == ' ' || array[index] > 256 )
+ {
+ while( index < array.length && (array[index] == ' ' || array[index] > 256))
+ {
+ index++;
+ }
+ index--;
+ }
+ return index;
+ }
+
+ /**
+ * Validate text extraction on a single file.
+ *
+ * @param file The file to validate
+ * @param bLogResult Whether to log the extracted text
+ * @throws Exception when there is an exception
+ */
+ public void doTestFile(File file, boolean bLogResult)
+ throws Exception
+ {
+ log.info("Preparing to parse " + file.getName());
+
+
+ OutputStream os = null;
+ Writer writer = null;
+ PDDocument document = null;
+ try
+ {
+ document = PDDocument.load(file);
+
+ File outFile = new File(file.getParentFile().getParentFile(), "output/" + file.getName() + ".txt");
+ os = new FileOutputStream(outFile);
+ os.write( 0xFF );
+ os.write( 0xFE );
+ writer = new OutputStreamWriter(os,"UTF-16LE");
+
+ stripper.writeText(document, writer);
+
+
+
+ if (bLogResult)
+ {
+ log.info("Text for " + file.getName() + ":\r\n" + stripper.getText(document));
+ }
+
+ File expectedFile = new File(file.getParentFile().getParentFile(), "input/" + file.getName() + ".txt");
+ File actualFile = new File(file.getParentFile().getParentFile(), "output/" + file.getName() + ".txt");
+
+ if (!expectedFile.exists())
+ {
+ this.bFail = true;
+ log.error("FAILURE: Input verification file: " + expectedFile.getAbsolutePath() + " did not exist");
+ return;
+ }
+
+ LineNumberReader expectedReader =
+ new LineNumberReader(new InputStreamReader(new FileInputStream(expectedFile),"UTF-16"));
+ LineNumberReader actualReader =
+ new LineNumberReader(new InputStreamReader(new FileInputStream(actualFile), "UTF-16"));
+
+ while (true)
+ {
+ String expectedLine = expectedReader.readLine();
+ while( expectedLine != null && expectedLine.trim().length() == 0 )
+ {
+ expectedLine = expectedReader.readLine();
+ }
+ String actualLine = actualReader.readLine();
+ while( actualLine != null && actualLine.trim().length() == 0 )
+ {
+ actualLine = actualReader.readLine();
+ }
+ if (!stringsEqual(expectedLine, actualLine))
+ {
+ this.bFail = true;
+ log.error("FAILURE: Line mismatch for file " + file.getName() +
+ " at expected line: " + expectedReader.getLineNumber() +
+ " at actual line: " + actualReader.getLineNumber() +
+ "\r\n expected line was: \"" + expectedLine + "\"" +
+ "\r\n actual line was: \"" + actualLine + "\"");
+ //lets report all lines, even though this might produce some verbose logging
+ //break;
+ }
+
+ if( expectedLine == null || actualLine==null)
+ {
+ break;
+ }
+ }
+ }
+ finally
+ {
+ if( writer != null )
+ {
+ writer.close();
+ }
+ if( os != null )
+ {
+ os.close();
+ }
+ if( document != null )
+ {
+ document.close();
+ }
+ }
+ }
+
+ /**
+ * Test to validate text extraction of file set.
+ *
+ * @throws Exception when there is an exception
+ */
+ public void testExtract()
+ throws Exception
+ {
+ String filename = System.getProperty("test.pdfbox.util.TextStripper.file");
+ File testDir = new File("test/input");
+
+ if ((filename == null) || (filename.length() == 0))
+ {
+ Logger.getRootLogger().setLevel( Level.INFO );
+
+ File[] testFiles = testDir.listFiles(new FilenameFilter()
+ {
+ public boolean accept(File dir, String name)
+ {
+ return (name.endsWith(".pdf"));
+ }
+ });
+
+ for (int n = 0; n < testFiles.length; n++)
+ {
+ doTestFile(testFiles[n], false);
+ }
+ }
+ else
+ {
+ doTestFile(new File(testDir, filename), true);
+ }
+
+ if (this.bFail)
+ {
+ fail("One or more failures, see test log for details");
+ }
+ }
+
+ /**
+ * Set the tests in the suite for this test class.
+ *
+ * @return the Suite.
+ */
+ public static Test suite()
+ {
+ return new TestSuite( TestTextStripper.class );
+ }
+
+ /**
+ * Command line execution.
+ *
+ * @param args Command line arguments.
+ */
+ public static void main( String[] args )
+ {
+ String[] arg = {TestTextStripper.class.getName() };
+ junit.textui.TestRunner.main( arg );
+ }
+} \ No newline at end of file
diff --git a/src/main/java/test/pdfbox/util/TestTextStripperPerformance.java b/src/main/java/test/pdfbox/util/TestTextStripperPerformance.java
new file mode 100644
index 0000000..0aadb30
--- /dev/null
+++ b/src/main/java/test/pdfbox/util/TestTextStripperPerformance.java
@@ -0,0 +1,173 @@
+/**
+ * Copyright (c) 2003-2004, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILIT, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ */
+package test.pdfbox.util;
+
+import java.io.File;
+import java.io.FilenameFilter;
+import java.io.FileOutputStream;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.io.Writer;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+import org.apache.log4j.Logger;
+
+import org.pdfbox.pdmodel.PDDocument;
+
+import org.pdfbox.util.PDFTextStripper;
+
+/**
+ * Test the performance of the PDF text stripper utility.
+ *
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.2 $
+ */
+public class TestTextStripperPerformance extends TestCase
+{
+ private static Logger log = Logger.getLogger(TestTextStripperPerformance.class);
+
+ private boolean bFail = false;
+
+ /**
+ * Test class constructor.
+ *
+ * @param name The name of the test class.
+ */
+ public TestTextStripperPerformance( String name )
+ {
+ super( name );
+ }
+
+ /**
+ * Test suite setup.
+ */
+ public void setUp()
+ {
+ }
+
+
+ /**
+ * Validate text extraction on a single file.
+ *
+ * @param file The file to validate
+ * @param bLogResult Whether to log the extracted text
+ * @throws Exception when there is an exception
+ */
+ public void doTestFile(File file, boolean bLogResult)
+ throws Exception
+ {
+
+ PDFTextStripper stripper = new PDFTextStripper();
+ OutputStream os = null;
+ Writer writer = null;
+ PDDocument document = null;
+ try
+ {
+ document = PDDocument.load(file);
+
+ File outFile = new File(file.getParentFile().getParentFile(), "output/" + file.getName() + ".txt");
+ os = new FileOutputStream(outFile);
+ writer = new OutputStreamWriter(os);
+
+ stripper.writeText(document, writer);
+ }
+ finally
+ {
+ if( writer != null )
+ {
+ writer.close();
+ }
+ if( os != null )
+ {
+ os.close();
+ }
+ if( document != null )
+ {
+ document.close();
+ }
+ }
+ }
+
+ /**
+ * Test to validate text extraction of file set.
+ *
+ * @throws Exception when there is an exception
+ */
+ public void testExtract()
+ throws Exception
+ {
+ String filename = System.getProperty("test.pdfbox.util.TextStripper.file");
+ File testDir = new File("test/input");
+
+ if ((filename == null) || (filename.length() == 0))
+ {
+ File[] testFiles = testDir.listFiles(new FilenameFilter()
+ {
+ public boolean accept(File dir, String name)
+ {
+ return (name.endsWith(".pdf"));
+ }
+ });
+
+ for (int n = 0; n < testFiles.length; n++)
+ {
+ doTestFile(testFiles[n], false);
+ }
+ }
+ else
+ {
+ //doTestFile(new File(testDir, filename), true);
+ }
+ }
+
+ /**
+ * Set the tests in the suite for this test class.
+ *
+ * @return the Suite.
+ */
+ public static Test suite()
+ {
+ return new TestSuite( TestTextStripperPerformance.class );
+ }
+
+ /**
+ * Command line execution.
+ *
+ * @param args Command line arguments.
+ */
+ public static void main( String[] args )
+ {
+ String[] arg = {TestTextStripperPerformance.class.getName() };
+ junit.textui.TestRunner.main( arg );
+ }
+} \ No newline at end of file
diff --git a/src/main/java/test/pdfbox/util/package.html b/src/main/java/test/pdfbox/util/package.html
new file mode 100644
index 0000000..8d98577
--- /dev/null
+++ b/src/main/java/test/pdfbox/util/package.html
@@ -0,0 +1,9 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<html>
+<head>
+
+</head>
+<body>
+These classes will be used to test the text extraction capabilities that are available with PDFBox.
+</body>
+</html>
diff --git a/src/main/resources/Resources/PDFBox_External_Fonts.properties b/src/main/resources/Resources/PDFBox_External_Fonts.properties
new file mode 100644
index 0000000..384a35e
--- /dev/null
+++ b/src/main/resources/Resources/PDFBox_External_Fonts.properties
@@ -0,0 +1,4 @@
+Arial-BoldItalicMT=Resources/ttf/Arial-BoldItalicMT.ttf
+Arial-BoldMT=Resources/ttf/Arial-BoldMT.ttf
+ArialMT=Resources/ttf/ArialMT.ttf
+UNKNOWN_FONT=Resources/ttf/ArialMT.ttf \ No newline at end of file
diff --git a/src/main/resources/Resources/PDFTextStripper.properties b/src/main/resources/Resources/PDFTextStripper.properties
new file mode 100644
index 0000000..2f655bd
--- /dev/null
+++ b/src/main/resources/Resources/PDFTextStripper.properties
@@ -0,0 +1,78 @@
+# this Table is a correspondance Map of the PDF stream operators with concretes class of the
+# OperatorProcessor abstract class for the stategy pattern used in the
+# org.pdfbox.util.PDFStreamEngine class.
+# To change the behaviour of the system, remplace the class name by a new class name.
+#b org.pdfbox.util.operator.NotImplemented
+#B org.pdfbox.util.operator.NotImplemented
+#b* org.pdfbox.util.operator.NotImplemented
+#B* org.pdfbox.util.operator.NotImplemented
+#BDC org.pdfbox.util.operator.NotImplemented
+#BI org.pdfbox.util.operator.NotImplemented
+#BMC org.pdfbox.util.operator.NotImplemented
+BT=org.pdfbox.util.operator.BeginText
+#BX org.pdfbox.util.operator.NotImplemented
+#c org.pdfbox.util.operator.NotImplemented
+cm=org.pdfbox.util.operator.Concatenate
+#CS is not required for text extraction
+#CS=org.pdfbox.util.operator.SetStrokingColorSpace
+#cs org.pdfbox.util.operator.NotImplemented
+#d org.pdfbox.util.operator.NotImplemented
+#d0 org.pdfbox.util.operator.NotImplemented
+#d1 org.pdfbox.util.operator.NotImplemented
+Do=org.pdfbox.util.operator.Invoke
+#DP org.pdfbox.util.operator.NotImplemented
+#El org.pdfbox.util.operator.NotImplemented
+#EMC org.pdfbox.util.operator.NotImplemented
+ET=org.pdfbox.util.operator.EndText
+#EX org.pdfbox.util.operator.NotImplemented
+#f org.pdfbox.util.operator.NotImplemented
+#F org.pdfbox.util.operator.NotImplemented
+#f* org.pdfbox.util.operator.NotImplemented
+#G org.pdfbox.util.operator.NotImplemented
+#g org.pdfbox.util.operator.NotImplemented
+gs=org.pdfbox.util.operator.SetGraphicsStateParameters
+#h org.pdfbox.util.operator.NotImplemented
+#i org.pdfbox.util.operator.NotImplemented
+#ID org.pdfbox.util.operator.NotImplemented
+#j org.pdfbox.util.operator.NotImplemented
+#J org.pdfbox.util.operator.NotImplemented
+#K org.pdfbox.util.operator.NotImplemented
+#k org.pdfbox.util.operator.NotImplemented
+#l org.pdfbox.util.operator.NotImplemented
+#m org.pdfbox.util.operator.NotImplemented
+#M org.pdfbox.util.operator.NotImplemented
+#MP org.pdfbox.util.operator.NotImplemented
+#n org.pdfbox.util.operator.NotImplemented
+q=org.pdfbox.util.operator.GSave
+Q=org.pdfbox.util.operator.GRestore
+#re org.pdfbox.util.operator.NotImplemented
+#RG org.pdfbox.util.operator.NotImplemented
+#rg org.pdfbox.util.operator.NotImplemented
+#ri org.pdfbox.util.operator.NotImplemented
+#s org.pdfbox.util.operator.NotImplemented
+#S org.pdfbox.util.operator.NotImplemented
+#SC org.pdfbox.util.operator.NotImplemented
+#sc org.pdfbox.util.operator.NotImplemented
+#SCN org.pdfbox.util.operator.NotImplemented
+#scn org.pdfbox.util.operator.NotImplemented
+#sh org.pdfbox.util.operator.NotImplemented
+T*=org.pdfbox.util.operator.NextLine
+Tc=org.pdfbox.util.operator.SetCharSpacing
+Td=org.pdfbox.util.operator.MoveText
+TD=org.pdfbox.util.operator.MoveTextSetLeading
+Tf=org.pdfbox.util.operator.SetTextFont
+Tj=org.pdfbox.util.operator.ShowText
+TJ=org.pdfbox.util.operator.ShowTextGlyph
+TL=org.pdfbox.util.operator.SetTextLeading
+Tm=org.pdfbox.util.operator.SetMatrix
+Tr=org.pdfbox.util.operator.SetTextRenderingMode
+Ts=org.pdfbox.util.operator.SetTextRise
+Tw org.pdfbox.util.operator.SetWordSpacing
+Tz=org.pdfbox.util.operator.SetHorizontalTextScaling
+#v org.pdfbox.util.operator.NotImplemented
+w=org.pdfbox.util.operator.SetLineWidth
+#W org.pdfbox.util.operator.NotImplemented
+#W* org.pdfbox.util.operator.NotImplemented
+#y org.pdfbox.util.operator.NotImplemented
+\'=org.pdfbox.util.operator.MoveAndShow
+\"=org.pdfbox.util.operator.SetMoveAndShow \ No newline at end of file
diff --git a/src/main/resources/Resources/PageDrawer.properties b/src/main/resources/Resources/PageDrawer.properties
new file mode 100644
index 0000000..3179250
--- /dev/null
+++ b/src/main/resources/Resources/PageDrawer.properties
@@ -0,0 +1,77 @@
+# this Table is a correspondance Map of the PDF stream operators with concretes class of the
+# OperatorProcessor abstract class for the stategy pattern used in the
+# org.pdfbox.util.PDFStreamEngine class.
+# To change the behaviour of the system, remplace the class name by a new class name.
+#b org.pdfbox.util.operator.NotImplemented
+#B org.pdfbox.util.operator.NotImplemented
+#b* org.pdfbox.util.operator.NotImplemented
+#B* org.pdfbox.util.operator.NotImplemented
+#BDC org.pdfbox.util.operator.NotImplemented
+BI=org.pdfbox.util.operator.pagedrawer.BeginInlineImage
+#BMC org.pdfbox.util.operator.NotImplemented
+BT=org.pdfbox.util.operator.BeginText
+#BX org.pdfbox.util.operator.NotImplemented
+c=org.pdfbox.util.operator.pagedrawer.CurveTo
+cm=org.pdfbox.util.operator.Concatenate
+CS org.pdfbox.util.operator.pagedrawer.SetStrokingColorSpace
+cs org.pdfbox.util.operator.pagedrawer.SetNonStrokingColorSpace
+#d org.pdfbox.util.operator.NotImplemented
+#d0 org.pdfbox.util.operator.NotImplemented
+#d1 org.pdfbox.util.operator.NotImplemented
+Do=org.pdfbox.util.operator.pagedrawer.Invoke
+#DP org.pdfbox.util.operator.NotImplemented
+#El org.pdfbox.util.operator.NotImplemented
+#EMC org.pdfbox.util.operator.NotImplemented
+ET=org.pdfbox.util.operator.EndText
+#EX org.pdfbox.util.operator.NotImplemented
+f=org.pdfbox.util.operator.pagedrawer.FillNonZeroRule
+F=org.pdfbox.util.operator.pagedrawer.FillNonZeroRule
+f*=org.pdfbox.util.operator.pagedrawer.FillEvenOddRule
+#G org.pdfbox.util.operator.NotImplemented
+#g org.pdfbox.util.operator.NotImplemented
+gs=org.pdfbox.util.operator.SetGraphicsStateParameters
+h org.pdfbox.util.operator.pagedrawer.ClosePath
+#i org.pdfbox.util.operator.NotImplemented
+#ID org.pdfbox.util.operator.NotImplemented
+#j org.pdfbox.util.operator.NotImplemented
+#J org.pdfbox.util.operator.NotImplemented
+K=org.pdfbox.util.operator.pagedrawer.SetStrokingCMYKColor
+k=org.pdfbox.util.operator.pagedrawer.SetNonStrokingCMYKColor
+l=org.pdfbox.util.operator.pagedrawer.LineTo
+m=org.pdfbox.util.operator.pagedrawer.MoveTo
+#M org.pdfbox.util.operator.NotImplemented
+#MP org.pdfbox.util.operator.NotImplemented
+#n org.pdfbox.util.operator.NotImplemented
+q=org.pdfbox.util.operator.GSave
+Q=org.pdfbox.util.operator.GRestore
+re=org.pdfbox.util.operator.pagedrawer.AppendRectangleToPath
+RG=org.pdfbox.util.operator.pagedrawer.SetStrokingRGBColor
+rg=org.pdfbox.util.operator.pagedrawer.SetNonStrokingRGBColor
+#ri org.pdfbox.util.operator.NotImplemented
+#s org.pdfbox.util.operator.NotImplemented
+S=org.pdfbox.util.operator.pagedrawer.StrokePath
+#SC org.pdfbox.util.operator.NotImplemented
+#sc org.pdfbox.util.operator.NotImplemented
+#SCN org.pdfbox.util.operator.NotImplemented
+#scn org.pdfbox.util.operator.NotImplemented
+#sh org.pdfbox.util.operator.NotImplemented
+T*=org.pdfbox.util.operator.NextLine
+Tc=org.pdfbox.util.operator.SetCharSpacing
+Td=org.pdfbox.util.operator.MoveText
+TD=org.pdfbox.util.operator.MoveTextSetLeading
+Tf=org.pdfbox.util.operator.SetTextFont
+Tj=org.pdfbox.util.operator.ShowText
+TJ=org.pdfbox.util.operator.ShowTextGlyph
+TL=org.pdfbox.util.operator.SetTextLeading
+Tm=org.pdfbox.util.operator.SetMatrix
+Tr=org.pdfbox.util.operator.SetTextRenderingMode
+Ts=org.pdfbox.util.operator.SetTextRise
+Tw org.pdfbox.util.operator.SetWordSpacing
+Tz=org.pdfbox.util.operator.SetHorizontalTextScaling
+v=org.pdfbox.util.operator.pagedrawer.CurveToReplicateInitialPoint
+w=org.pdfbox.util.operator.pagedrawer.SetLineWidth
+#W org.pdfbox.util.operator.NotImplemented
+#W* org.pdfbox.util.operator.NotImplemented
+y=org.pdfbox.util.operator.pagedrawer.CurveToReplicateFinalPoint
+\'=org.pdfbox.util.operator.MoveAndShow
+\"=org.pdfbox.util.operator.SetMoveAndShow \ No newline at end of file
diff --git a/src/main/resources/Resources/afm/Courier-Bold.afm b/src/main/resources/Resources/afm/Courier-Bold.afm
new file mode 100644
index 0000000..d25d776
--- /dev/null
+++ b/src/main/resources/Resources/afm/Courier-Bold.afm
@@ -0,0 +1,342 @@
+StartFontMetrics 4.1
+Comment Copyright (c) 1989, 1990, 1991, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.
+Comment Creation Date: Mon Jun 23 16:28:00 1997
+Comment UniqueID 43048
+Comment VMusage 41139 52164
+FontName Courier-Bold
+FullName Courier Bold
+FamilyName Courier
+Weight Bold
+ItalicAngle 0
+IsFixedPitch true
+CharacterSet ExtendedRoman
+FontBBox -113 -250 749 801
+UnderlinePosition -100
+UnderlineThickness 50
+Version 003.000
+Notice Copyright (c) 1989, 1990, 1991, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.
+EncodingScheme AdobeStandardEncoding
+CapHeight 562
+XHeight 439
+Ascender 629
+Descender -157
+StdHW 84
+StdVW 106
+StartCharMetrics 315
+C 32 ; WX 600 ; N space ; B 0 0 0 0 ;
+C 33 ; WX 600 ; N exclam ; B 202 -15 398 572 ;
+C 34 ; WX 600 ; N quotedbl ; B 135 277 465 562 ;
+C 35 ; WX 600 ; N numbersign ; B 56 -45 544 651 ;
+C 36 ; WX 600 ; N dollar ; B 82 -126 519 666 ;
+C 37 ; WX 600 ; N percent ; B 5 -15 595 616 ;
+C 38 ; WX 600 ; N ampersand ; B 36 -15 546 543 ;
+C 39 ; WX 600 ; N quoteright ; B 171 277 423 562 ;
+C 40 ; WX 600 ; N parenleft ; B 219 -102 461 616 ;
+C 41 ; WX 600 ; N parenright ; B 139 -102 381 616 ;
+C 42 ; WX 600 ; N asterisk ; B 91 219 509 601 ;
+C 43 ; WX 600 ; N plus ; B 71 39 529 478 ;
+C 44 ; WX 600 ; N comma ; B 123 -111 393 174 ;
+C 45 ; WX 600 ; N hyphen ; B 100 203 500 313 ;
+C 46 ; WX 600 ; N period ; B 192 -15 408 171 ;
+C 47 ; WX 600 ; N slash ; B 98 -77 502 626 ;
+C 48 ; WX 600 ; N zero ; B 87 -15 513 616 ;
+C 49 ; WX 600 ; N one ; B 81 0 539 616 ;
+C 50 ; WX 600 ; N two ; B 61 0 499 616 ;
+C 51 ; WX 600 ; N three ; B 63 -15 501 616 ;
+C 52 ; WX 600 ; N four ; B 53 0 507 616 ;
+C 53 ; WX 600 ; N five ; B 70 -15 521 601 ;
+C 54 ; WX 600 ; N six ; B 90 -15 521 616 ;
+C 55 ; WX 600 ; N seven ; B 55 0 494 601 ;
+C 56 ; WX 600 ; N eight ; B 83 -15 517 616 ;
+C 57 ; WX 600 ; N nine ; B 79 -15 510 616 ;
+C 58 ; WX 600 ; N colon ; B 191 -15 407 425 ;
+C 59 ; WX 600 ; N semicolon ; B 123 -111 408 425 ;
+C 60 ; WX 600 ; N less ; B 66 15 523 501 ;
+C 61 ; WX 600 ; N equal ; B 71 118 529 398 ;
+C 62 ; WX 600 ; N greater ; B 77 15 534 501 ;
+C 63 ; WX 600 ; N question ; B 98 -14 501 580 ;
+C 64 ; WX 600 ; N at ; B 16 -15 584 616 ;
+C 65 ; WX 600 ; N A ; B -9 0 609 562 ;
+C 66 ; WX 600 ; N B ; B 30 0 573 562 ;
+C 67 ; WX 600 ; N C ; B 22 -18 560 580 ;
+C 68 ; WX 600 ; N D ; B 30 0 594 562 ;
+C 69 ; WX 600 ; N E ; B 25 0 560 562 ;
+C 70 ; WX 600 ; N F ; B 39 0 570 562 ;
+C 71 ; WX 600 ; N G ; B 22 -18 594 580 ;
+C 72 ; WX 600 ; N H ; B 20 0 580 562 ;
+C 73 ; WX 600 ; N I ; B 77 0 523 562 ;
+C 74 ; WX 600 ; N J ; B 37 -18 601 562 ;
+C 75 ; WX 600 ; N K ; B 21 0 599 562 ;
+C 76 ; WX 600 ; N L ; B 39 0 578 562 ;
+C 77 ; WX 600 ; N M ; B -2 0 602 562 ;
+C 78 ; WX 600 ; N N ; B 8 -12 610 562 ;
+C 79 ; WX 600 ; N O ; B 22 -18 578 580 ;
+C 80 ; WX 600 ; N P ; B 48 0 559 562 ;
+C 81 ; WX 600 ; N Q ; B 32 -138 578 580 ;
+C 82 ; WX 600 ; N R ; B 24 0 599 562 ;
+C 83 ; WX 600 ; N S ; B 47 -22 553 582 ;
+C 84 ; WX 600 ; N T ; B 21 0 579 562 ;
+C 85 ; WX 600 ; N U ; B 4 -18 596 562 ;
+C 86 ; WX 600 ; N V ; B -13 0 613 562 ;
+C 87 ; WX 600 ; N W ; B -18 0 618 562 ;
+C 88 ; WX 600 ; N X ; B 12 0 588 562 ;
+C 89 ; WX 600 ; N Y ; B 12 0 589 562 ;
+C 90 ; WX 600 ; N Z ; B 62 0 539 562 ;
+C 91 ; WX 600 ; N bracketleft ; B 245 -102 475 616 ;
+C 92 ; WX 600 ; N backslash ; B 99 -77 503 626 ;
+C 93 ; WX 600 ; N bracketright ; B 125 -102 355 616 ;
+C 94 ; WX 600 ; N asciicircum ; B 108 250 492 616 ;
+C 95 ; WX 600 ; N underscore ; B 0 -125 600 -75 ;
+C 96 ; WX 600 ; N quoteleft ; B 178 277 428 562 ;
+C 97 ; WX 600 ; N a ; B 35 -15 570 454 ;
+C 98 ; WX 600 ; N b ; B 0 -15 584 626 ;
+C 99 ; WX 600 ; N c ; B 40 -15 545 459 ;
+C 100 ; WX 600 ; N d ; B 20 -15 591 626 ;
+C 101 ; WX 600 ; N e ; B 40 -15 563 454 ;
+C 102 ; WX 600 ; N f ; B 83 0 547 626 ; L i fi ; L l fl ;
+C 103 ; WX 600 ; N g ; B 30 -146 580 454 ;
+C 104 ; WX 600 ; N h ; B 5 0 592 626 ;
+C 105 ; WX 600 ; N i ; B 77 0 523 658 ;
+C 106 ; WX 600 ; N j ; B 63 -146 440 658 ;
+C 107 ; WX 600 ; N k ; B 20 0 585 626 ;
+C 108 ; WX 600 ; N l ; B 77 0 523 626 ;
+C 109 ; WX 600 ; N m ; B -22 0 626 454 ;
+C 110 ; WX 600 ; N n ; B 18 0 592 454 ;
+C 111 ; WX 600 ; N o ; B 30 -15 570 454 ;
+C 112 ; WX 600 ; N p ; B -1 -142 570 454 ;
+C 113 ; WX 600 ; N q ; B 20 -142 591 454 ;
+C 114 ; WX 600 ; N r ; B 47 0 580 454 ;
+C 115 ; WX 600 ; N s ; B 68 -17 535 459 ;
+C 116 ; WX 600 ; N t ; B 47 -15 532 562 ;
+C 117 ; WX 600 ; N u ; B -1 -15 569 439 ;
+C 118 ; WX 600 ; N v ; B -1 0 601 439 ;
+C 119 ; WX 600 ; N w ; B -18 0 618 439 ;
+C 120 ; WX 600 ; N x ; B 6 0 594 439 ;
+C 121 ; WX 600 ; N y ; B -4 -142 601 439 ;
+C 122 ; WX 600 ; N z ; B 81 0 520 439 ;
+C 123 ; WX 600 ; N braceleft ; B 160 -102 464 616 ;
+C 124 ; WX 600 ; N bar ; B 255 -250 345 750 ;
+C 125 ; WX 600 ; N braceright ; B 136 -102 440 616 ;
+C 126 ; WX 600 ; N asciitilde ; B 71 153 530 356 ;
+C 161 ; WX 600 ; N exclamdown ; B 202 -146 398 449 ;
+C 162 ; WX 600 ; N cent ; B 66 -49 518 614 ;
+C 163 ; WX 600 ; N sterling ; B 72 -28 558 611 ;
+C 164 ; WX 600 ; N fraction ; B 25 -60 576 661 ;
+C 165 ; WX 600 ; N yen ; B 10 0 590 562 ;
+C 166 ; WX 600 ; N florin ; B -30 -131 572 616 ;
+C 167 ; WX 600 ; N section ; B 83 -70 517 580 ;
+C 168 ; WX 600 ; N currency ; B 54 49 546 517 ;
+C 169 ; WX 600 ; N quotesingle ; B 227 277 373 562 ;
+C 170 ; WX 600 ; N quotedblleft ; B 71 277 535 562 ;
+C 171 ; WX 600 ; N guillemotleft ; B 8 70 553 446 ;
+C 172 ; WX 600 ; N guilsinglleft ; B 141 70 459 446 ;
+C 173 ; WX 600 ; N guilsinglright ; B 141 70 459 446 ;
+C 174 ; WX 600 ; N fi ; B 12 0 593 626 ;
+C 175 ; WX 600 ; N fl ; B 12 0 593 626 ;
+C 177 ; WX 600 ; N endash ; B 65 203 535 313 ;
+C 178 ; WX 600 ; N dagger ; B 106 -70 494 580 ;
+C 179 ; WX 600 ; N daggerdbl ; B 106 -70 494 580 ;
+C 180 ; WX 600 ; N periodcentered ; B 196 165 404 351 ;
+C 182 ; WX 600 ; N paragraph ; B 6 -70 576 580 ;
+C 183 ; WX 600 ; N bullet ; B 140 132 460 430 ;
+C 184 ; WX 600 ; N quotesinglbase ; B 175 -142 427 143 ;
+C 185 ; WX 600 ; N quotedblbase ; B 65 -142 529 143 ;
+C 186 ; WX 600 ; N quotedblright ; B 61 277 525 562 ;
+C 187 ; WX 600 ; N guillemotright ; B 47 70 592 446 ;
+C 188 ; WX 600 ; N ellipsis ; B 26 -15 574 116 ;
+C 189 ; WX 600 ; N perthousand ; B -113 -15 713 616 ;
+C 191 ; WX 600 ; N questiondown ; B 99 -146 502 449 ;
+C 193 ; WX 600 ; N grave ; B 132 508 395 661 ;
+C 194 ; WX 600 ; N acute ; B 205 508 468 661 ;
+C 195 ; WX 600 ; N circumflex ; B 103 483 497 657 ;
+C 196 ; WX 600 ; N tilde ; B 89 493 512 636 ;
+C 197 ; WX 600 ; N macron ; B 88 505 512 585 ;
+C 198 ; WX 600 ; N breve ; B 83 468 517 631 ;
+C 199 ; WX 600 ; N dotaccent ; B 230 498 370 638 ;
+C 200 ; WX 600 ; N dieresis ; B 128 498 472 638 ;
+C 202 ; WX 600 ; N ring ; B 198 481 402 678 ;
+C 203 ; WX 600 ; N cedilla ; B 205 -206 387 0 ;
+C 205 ; WX 600 ; N hungarumlaut ; B 68 488 588 661 ;
+C 206 ; WX 600 ; N ogonek ; B 169 -199 400 0 ;
+C 207 ; WX 600 ; N caron ; B 103 493 497 667 ;
+C 208 ; WX 600 ; N emdash ; B -10 203 610 313 ;
+C 225 ; WX 600 ; N AE ; B -29 0 602 562 ;
+C 227 ; WX 600 ; N ordfeminine ; B 147 196 453 580 ;
+C 232 ; WX 600 ; N Lslash ; B 39 0 578 562 ;
+C 233 ; WX 600 ; N Oslash ; B 22 -22 578 584 ;
+C 234 ; WX 600 ; N OE ; B -25 0 595 562 ;
+C 235 ; WX 600 ; N ordmasculine ; B 147 196 453 580 ;
+C 241 ; WX 600 ; N ae ; B -4 -15 601 454 ;
+C 245 ; WX 600 ; N dotlessi ; B 77 0 523 439 ;
+C 248 ; WX 600 ; N lslash ; B 77 0 523 626 ;
+C 249 ; WX 600 ; N oslash ; B 30 -24 570 463 ;
+C 250 ; WX 600 ; N oe ; B -18 -15 611 454 ;
+C 251 ; WX 600 ; N germandbls ; B 22 -15 596 626 ;
+C -1 ; WX 600 ; N Idieresis ; B 77 0 523 761 ;
+C -1 ; WX 600 ; N eacute ; B 40 -15 563 661 ;
+C -1 ; WX 600 ; N abreve ; B 35 -15 570 661 ;
+C -1 ; WX 600 ; N uhungarumlaut ; B -1 -15 628 661 ;
+C -1 ; WX 600 ; N ecaron ; B 40 -15 563 667 ;
+C -1 ; WX 600 ; N Ydieresis ; B 12 0 589 761 ;
+C -1 ; WX 600 ; N divide ; B 71 16 529 500 ;
+C -1 ; WX 600 ; N Yacute ; B 12 0 589 784 ;
+C -1 ; WX 600 ; N Acircumflex ; B -9 0 609 780 ;
+C -1 ; WX 600 ; N aacute ; B 35 -15 570 661 ;
+C -1 ; WX 600 ; N Ucircumflex ; B 4 -18 596 780 ;
+C -1 ; WX 600 ; N yacute ; B -4 -142 601 661 ;
+C -1 ; WX 600 ; N scommaaccent ; B 68 -250 535 459 ;
+C -1 ; WX 600 ; N ecircumflex ; B 40 -15 563 657 ;
+C -1 ; WX 600 ; N Uring ; B 4 -18 596 801 ;
+C -1 ; WX 600 ; N Udieresis ; B 4 -18 596 761 ;
+C -1 ; WX 600 ; N aogonek ; B 35 -199 586 454 ;
+C -1 ; WX 600 ; N Uacute ; B 4 -18 596 784 ;
+C -1 ; WX 600 ; N uogonek ; B -1 -199 585 439 ;
+C -1 ; WX 600 ; N Edieresis ; B 25 0 560 761 ;
+C -1 ; WX 600 ; N Dcroat ; B 30 0 594 562 ;
+C -1 ; WX 600 ; N commaaccent ; B 205 -250 397 -57 ;
+C -1 ; WX 600 ; N copyright ; B 0 -18 600 580 ;
+C -1 ; WX 600 ; N Emacron ; B 25 0 560 708 ;
+C -1 ; WX 600 ; N ccaron ; B 40 -15 545 667 ;
+C -1 ; WX 600 ; N aring ; B 35 -15 570 678 ;
+C -1 ; WX 600 ; N Ncommaaccent ; B 8 -250 610 562 ;
+C -1 ; WX 600 ; N lacute ; B 77 0 523 801 ;
+C -1 ; WX 600 ; N agrave ; B 35 -15 570 661 ;
+C -1 ; WX 600 ; N Tcommaaccent ; B 21 -250 579 562 ;
+C -1 ; WX 600 ; N Cacute ; B 22 -18 560 784 ;
+C -1 ; WX 600 ; N atilde ; B 35 -15 570 636 ;
+C -1 ; WX 600 ; N Edotaccent ; B 25 0 560 761 ;
+C -1 ; WX 600 ; N scaron ; B 68 -17 535 667 ;
+C -1 ; WX 600 ; N scedilla ; B 68 -206 535 459 ;
+C -1 ; WX 600 ; N iacute ; B 77 0 523 661 ;
+C -1 ; WX 600 ; N lozenge ; B 66 0 534 740 ;
+C -1 ; WX 600 ; N Rcaron ; B 24 0 599 790 ;
+C -1 ; WX 600 ; N Gcommaaccent ; B 22 -250 594 580 ;
+C -1 ; WX 600 ; N ucircumflex ; B -1 -15 569 657 ;
+C -1 ; WX 600 ; N acircumflex ; B 35 -15 570 657 ;
+C -1 ; WX 600 ; N Amacron ; B -9 0 609 708 ;
+C -1 ; WX 600 ; N rcaron ; B 47 0 580 667 ;
+C -1 ; WX 600 ; N ccedilla ; B 40 -206 545 459 ;
+C -1 ; WX 600 ; N Zdotaccent ; B 62 0 539 761 ;
+C -1 ; WX 600 ; N Thorn ; B 48 0 557 562 ;
+C -1 ; WX 600 ; N Omacron ; B 22 -18 578 708 ;
+C -1 ; WX 600 ; N Racute ; B 24 0 599 784 ;
+C -1 ; WX 600 ; N Sacute ; B 47 -22 553 784 ;
+C -1 ; WX 600 ; N dcaron ; B 20 -15 727 626 ;
+C -1 ; WX 600 ; N Umacron ; B 4 -18 596 708 ;
+C -1 ; WX 600 ; N uring ; B -1 -15 569 678 ;
+C -1 ; WX 600 ; N threesuperior ; B 138 222 433 616 ;
+C -1 ; WX 600 ; N Ograve ; B 22 -18 578 784 ;
+C -1 ; WX 600 ; N Agrave ; B -9 0 609 784 ;
+C -1 ; WX 600 ; N Abreve ; B -9 0 609 784 ;
+C -1 ; WX 600 ; N multiply ; B 81 39 520 478 ;
+C -1 ; WX 600 ; N uacute ; B -1 -15 569 661 ;
+C -1 ; WX 600 ; N Tcaron ; B 21 0 579 790 ;
+C -1 ; WX 600 ; N partialdiff ; B 63 -38 537 728 ;
+C -1 ; WX 600 ; N ydieresis ; B -4 -142 601 638 ;
+C -1 ; WX 600 ; N Nacute ; B 8 -12 610 784 ;
+C -1 ; WX 600 ; N icircumflex ; B 73 0 523 657 ;
+C -1 ; WX 600 ; N Ecircumflex ; B 25 0 560 780 ;
+C -1 ; WX 600 ; N adieresis ; B 35 -15 570 638 ;
+C -1 ; WX 600 ; N edieresis ; B 40 -15 563 638 ;
+C -1 ; WX 600 ; N cacute ; B 40 -15 545 661 ;
+C -1 ; WX 600 ; N nacute ; B 18 0 592 661 ;
+C -1 ; WX 600 ; N umacron ; B -1 -15 569 585 ;
+C -1 ; WX 600 ; N Ncaron ; B 8 -12 610 790 ;
+C -1 ; WX 600 ; N Iacute ; B 77 0 523 784 ;
+C -1 ; WX 600 ; N plusminus ; B 71 24 529 515 ;
+C -1 ; WX 600 ; N brokenbar ; B 255 -175 345 675 ;
+C -1 ; WX 600 ; N registered ; B 0 -18 600 580 ;
+C -1 ; WX 600 ; N Gbreve ; B 22 -18 594 784 ;
+C -1 ; WX 600 ; N Idotaccent ; B 77 0 523 761 ;
+C -1 ; WX 600 ; N summation ; B 15 -10 586 706 ;
+C -1 ; WX 600 ; N Egrave ; B 25 0 560 784 ;
+C -1 ; WX 600 ; N racute ; B 47 0 580 661 ;
+C -1 ; WX 600 ; N omacron ; B 30 -15 570 585 ;
+C -1 ; WX 600 ; N Zacute ; B 62 0 539 784 ;
+C -1 ; WX 600 ; N Zcaron ; B 62 0 539 790 ;
+C -1 ; WX 600 ; N greaterequal ; B 26 0 523 696 ;
+C -1 ; WX 600 ; N Eth ; B 30 0 594 562 ;
+C -1 ; WX 600 ; N Ccedilla ; B 22 -206 560 580 ;
+C -1 ; WX 600 ; N lcommaaccent ; B 77 -250 523 626 ;
+C -1 ; WX 600 ; N tcaron ; B 47 -15 532 703 ;
+C -1 ; WX 600 ; N eogonek ; B 40 -199 563 454 ;
+C -1 ; WX 600 ; N Uogonek ; B 4 -199 596 562 ;
+C -1 ; WX 600 ; N Aacute ; B -9 0 609 784 ;
+C -1 ; WX 600 ; N Adieresis ; B -9 0 609 761 ;
+C -1 ; WX 600 ; N egrave ; B 40 -15 563 661 ;
+C -1 ; WX 600 ; N zacute ; B 81 0 520 661 ;
+C -1 ; WX 600 ; N iogonek ; B 77 -199 523 658 ;
+C -1 ; WX 600 ; N Oacute ; B 22 -18 578 784 ;
+C -1 ; WX 600 ; N oacute ; B 30 -15 570 661 ;
+C -1 ; WX 600 ; N amacron ; B 35 -15 570 585 ;
+C -1 ; WX 600 ; N sacute ; B 68 -17 535 661 ;
+C -1 ; WX 600 ; N idieresis ; B 77 0 523 618 ;
+C -1 ; WX 600 ; N Ocircumflex ; B 22 -18 578 780 ;
+C -1 ; WX 600 ; N Ugrave ; B 4 -18 596 784 ;
+C -1 ; WX 600 ; N Delta ; B 6 0 594 688 ;
+C -1 ; WX 600 ; N thorn ; B -14 -142 570 626 ;
+C -1 ; WX 600 ; N twosuperior ; B 143 230 436 616 ;
+C -1 ; WX 600 ; N Odieresis ; B 22 -18 578 761 ;
+C -1 ; WX 600 ; N mu ; B -1 -142 569 439 ;
+C -1 ; WX 600 ; N igrave ; B 77 0 523 661 ;
+C -1 ; WX 600 ; N ohungarumlaut ; B 30 -15 668 661 ;
+C -1 ; WX 600 ; N Eogonek ; B 25 -199 576 562 ;
+C -1 ; WX 600 ; N dcroat ; B 20 -15 591 626 ;
+C -1 ; WX 600 ; N threequarters ; B -47 -60 648 661 ;
+C -1 ; WX 600 ; N Scedilla ; B 47 -206 553 582 ;
+C -1 ; WX 600 ; N lcaron ; B 77 0 597 626 ;
+C -1 ; WX 600 ; N Kcommaaccent ; B 21 -250 599 562 ;
+C -1 ; WX 600 ; N Lacute ; B 39 0 578 784 ;
+C -1 ; WX 600 ; N trademark ; B -9 230 749 562 ;
+C -1 ; WX 600 ; N edotaccent ; B 40 -15 563 638 ;
+C -1 ; WX 600 ; N Igrave ; B 77 0 523 784 ;
+C -1 ; WX 600 ; N Imacron ; B 77 0 523 708 ;
+C -1 ; WX 600 ; N Lcaron ; B 39 0 637 562 ;
+C -1 ; WX 600 ; N onehalf ; B -47 -60 648 661 ;
+C -1 ; WX 600 ; N lessequal ; B 26 0 523 696 ;
+C -1 ; WX 600 ; N ocircumflex ; B 30 -15 570 657 ;
+C -1 ; WX 600 ; N ntilde ; B 18 0 592 636 ;
+C -1 ; WX 600 ; N Uhungarumlaut ; B 4 -18 638 784 ;
+C -1 ; WX 600 ; N Eacute ; B 25 0 560 784 ;
+C -1 ; WX 600 ; N emacron ; B 40 -15 563 585 ;
+C -1 ; WX 600 ; N gbreve ; B 30 -146 580 661 ;
+C -1 ; WX 600 ; N onequarter ; B -56 -60 656 661 ;
+C -1 ; WX 600 ; N Scaron ; B 47 -22 553 790 ;
+C -1 ; WX 600 ; N Scommaaccent ; B 47 -250 553 582 ;
+C -1 ; WX 600 ; N Ohungarumlaut ; B 22 -18 628 784 ;
+C -1 ; WX 600 ; N degree ; B 86 243 474 616 ;
+C -1 ; WX 600 ; N ograve ; B 30 -15 570 661 ;
+C -1 ; WX 600 ; N Ccaron ; B 22 -18 560 790 ;
+C -1 ; WX 600 ; N ugrave ; B -1 -15 569 661 ;
+C -1 ; WX 600 ; N radical ; B -19 -104 473 778 ;
+C -1 ; WX 600 ; N Dcaron ; B 30 0 594 790 ;
+C -1 ; WX 600 ; N rcommaaccent ; B 47 -250 580 454 ;
+C -1 ; WX 600 ; N Ntilde ; B 8 -12 610 759 ;
+C -1 ; WX 600 ; N otilde ; B 30 -15 570 636 ;
+C -1 ; WX 600 ; N Rcommaaccent ; B 24 -250 599 562 ;
+C -1 ; WX 600 ; N Lcommaaccent ; B 39 -250 578 562 ;
+C -1 ; WX 600 ; N Atilde ; B -9 0 609 759 ;
+C -1 ; WX 600 ; N Aogonek ; B -9 -199 625 562 ;
+C -1 ; WX 600 ; N Aring ; B -9 0 609 801 ;
+C -1 ; WX 600 ; N Otilde ; B 22 -18 578 759 ;
+C -1 ; WX 600 ; N zdotaccent ; B 81 0 520 638 ;
+C -1 ; WX 600 ; N Ecaron ; B 25 0 560 790 ;
+C -1 ; WX 600 ; N Iogonek ; B 77 -199 523 562 ;
+C -1 ; WX 600 ; N kcommaaccent ; B 20 -250 585 626 ;
+C -1 ; WX 600 ; N minus ; B 71 203 529 313 ;
+C -1 ; WX 600 ; N Icircumflex ; B 77 0 523 780 ;
+C -1 ; WX 600 ; N ncaron ; B 18 0 592 667 ;
+C -1 ; WX 600 ; N tcommaaccent ; B 47 -250 532 562 ;
+C -1 ; WX 600 ; N logicalnot ; B 71 103 529 413 ;
+C -1 ; WX 600 ; N odieresis ; B 30 -15 570 638 ;
+C -1 ; WX 600 ; N udieresis ; B -1 -15 569 638 ;
+C -1 ; WX 600 ; N notequal ; B 12 -47 537 563 ;
+C -1 ; WX 600 ; N gcommaaccent ; B 30 -146 580 714 ;
+C -1 ; WX 600 ; N eth ; B 58 -27 543 626 ;
+C -1 ; WX 600 ; N zcaron ; B 81 0 520 667 ;
+C -1 ; WX 600 ; N ncommaaccent ; B 18 -250 592 454 ;
+C -1 ; WX 600 ; N onesuperior ; B 153 230 447 616 ;
+C -1 ; WX 600 ; N imacron ; B 77 0 523 585 ;
+C -1 ; WX 600 ; N Euro ; B 0 0 0 0 ;
+EndCharMetrics
+EndFontMetrics
diff --git a/src/main/resources/Resources/afm/Courier-BoldOblique.afm b/src/main/resources/Resources/afm/Courier-BoldOblique.afm
new file mode 100644
index 0000000..9f365ee
--- /dev/null
+++ b/src/main/resources/Resources/afm/Courier-BoldOblique.afm
@@ -0,0 +1,342 @@
+StartFontMetrics 4.1
+Comment Copyright (c) 1989, 1990, 1991, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.
+Comment Creation Date: Mon Jun 23 16:28:46 1997
+Comment UniqueID 43049
+Comment VMusage 17529 79244
+FontName Courier-BoldOblique
+FullName Courier Bold Oblique
+FamilyName Courier
+Weight Bold
+ItalicAngle -12
+IsFixedPitch true
+CharacterSet ExtendedRoman
+FontBBox -57 -250 869 801
+UnderlinePosition -100
+UnderlineThickness 50
+Version 003.000
+Notice Copyright (c) 1989, 1990, 1991, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.
+EncodingScheme AdobeStandardEncoding
+CapHeight 562
+XHeight 439
+Ascender 629
+Descender -157
+StdHW 84
+StdVW 106
+StartCharMetrics 315
+C 32 ; WX 600 ; N space ; B 0 0 0 0 ;
+C 33 ; WX 600 ; N exclam ; B 215 -15 495 572 ;
+C 34 ; WX 600 ; N quotedbl ; B 211 277 585 562 ;
+C 35 ; WX 600 ; N numbersign ; B 88 -45 641 651 ;
+C 36 ; WX 600 ; N dollar ; B 87 -126 630 666 ;
+C 37 ; WX 600 ; N percent ; B 101 -15 625 616 ;
+C 38 ; WX 600 ; N ampersand ; B 61 -15 595 543 ;
+C 39 ; WX 600 ; N quoteright ; B 229 277 543 562 ;
+C 40 ; WX 600 ; N parenleft ; B 265 -102 592 616 ;
+C 41 ; WX 600 ; N parenright ; B 117 -102 444 616 ;
+C 42 ; WX 600 ; N asterisk ; B 179 219 598 601 ;
+C 43 ; WX 600 ; N plus ; B 114 39 596 478 ;
+C 44 ; WX 600 ; N comma ; B 99 -111 430 174 ;
+C 45 ; WX 600 ; N hyphen ; B 143 203 567 313 ;
+C 46 ; WX 600 ; N period ; B 206 -15 427 171 ;
+C 47 ; WX 600 ; N slash ; B 90 -77 626 626 ;
+C 48 ; WX 600 ; N zero ; B 135 -15 593 616 ;
+C 49 ; WX 600 ; N one ; B 93 0 562 616 ;
+C 50 ; WX 600 ; N two ; B 61 0 594 616 ;
+C 51 ; WX 600 ; N three ; B 71 -15 571 616 ;
+C 52 ; WX 600 ; N four ; B 81 0 559 616 ;
+C 53 ; WX 600 ; N five ; B 77 -15 621 601 ;
+C 54 ; WX 600 ; N six ; B 135 -15 652 616 ;
+C 55 ; WX 600 ; N seven ; B 147 0 622 601 ;
+C 56 ; WX 600 ; N eight ; B 115 -15 604 616 ;
+C 57 ; WX 600 ; N nine ; B 75 -15 592 616 ;
+C 58 ; WX 600 ; N colon ; B 205 -15 480 425 ;
+C 59 ; WX 600 ; N semicolon ; B 99 -111 481 425 ;
+C 60 ; WX 600 ; N less ; B 120 15 613 501 ;
+C 61 ; WX 600 ; N equal ; B 96 118 614 398 ;
+C 62 ; WX 600 ; N greater ; B 97 15 589 501 ;
+C 63 ; WX 600 ; N question ; B 183 -14 592 580 ;
+C 64 ; WX 600 ; N at ; B 65 -15 642 616 ;
+C 65 ; WX 600 ; N A ; B -9 0 632 562 ;
+C 66 ; WX 600 ; N B ; B 30 0 630 562 ;
+C 67 ; WX 600 ; N C ; B 74 -18 675 580 ;
+C 68 ; WX 600 ; N D ; B 30 0 664 562 ;
+C 69 ; WX 600 ; N E ; B 25 0 670 562 ;
+C 70 ; WX 600 ; N F ; B 39 0 684 562 ;
+C 71 ; WX 600 ; N G ; B 74 -18 675 580 ;
+C 72 ; WX 600 ; N H ; B 20 0 700 562 ;
+C 73 ; WX 600 ; N I ; B 77 0 643 562 ;
+C 74 ; WX 600 ; N J ; B 58 -18 721 562 ;
+C 75 ; WX 600 ; N K ; B 21 0 692 562 ;
+C 76 ; WX 600 ; N L ; B 39 0 636 562 ;
+C 77 ; WX 600 ; N M ; B -2 0 722 562 ;
+C 78 ; WX 600 ; N N ; B 8 -12 730 562 ;
+C 79 ; WX 600 ; N O ; B 74 -18 645 580 ;
+C 80 ; WX 600 ; N P ; B 48 0 643 562 ;
+C 81 ; WX 600 ; N Q ; B 83 -138 636 580 ;
+C 82 ; WX 600 ; N R ; B 24 0 617 562 ;
+C 83 ; WX 600 ; N S ; B 54 -22 673 582 ;
+C 84 ; WX 600 ; N T ; B 86 0 679 562 ;
+C 85 ; WX 600 ; N U ; B 101 -18 716 562 ;
+C 86 ; WX 600 ; N V ; B 84 0 733 562 ;
+C 87 ; WX 600 ; N W ; B 79 0 738 562 ;
+C 88 ; WX 600 ; N X ; B 12 0 690 562 ;
+C 89 ; WX 600 ; N Y ; B 109 0 709 562 ;
+C 90 ; WX 600 ; N Z ; B 62 0 637 562 ;
+C 91 ; WX 600 ; N bracketleft ; B 223 -102 606 616 ;
+C 92 ; WX 600 ; N backslash ; B 222 -77 496 626 ;
+C 93 ; WX 600 ; N bracketright ; B 103 -102 486 616 ;
+C 94 ; WX 600 ; N asciicircum ; B 171 250 556 616 ;
+C 95 ; WX 600 ; N underscore ; B -27 -125 585 -75 ;
+C 96 ; WX 600 ; N quoteleft ; B 297 277 487 562 ;
+C 97 ; WX 600 ; N a ; B 61 -15 593 454 ;
+C 98 ; WX 600 ; N b ; B 13 -15 636 626 ;
+C 99 ; WX 600 ; N c ; B 81 -15 631 459 ;
+C 100 ; WX 600 ; N d ; B 60 -15 645 626 ;
+C 101 ; WX 600 ; N e ; B 81 -15 605 454 ;
+C 102 ; WX 600 ; N f ; B 83 0 677 626 ; L i fi ; L l fl ;
+C 103 ; WX 600 ; N g ; B 40 -146 674 454 ;
+C 104 ; WX 600 ; N h ; B 18 0 615 626 ;
+C 105 ; WX 600 ; N i ; B 77 0 546 658 ;
+C 106 ; WX 600 ; N j ; B 36 -146 580 658 ;
+C 107 ; WX 600 ; N k ; B 33 0 643 626 ;
+C 108 ; WX 600 ; N l ; B 77 0 546 626 ;
+C 109 ; WX 600 ; N m ; B -22 0 649 454 ;
+C 110 ; WX 600 ; N n ; B 18 0 615 454 ;
+C 111 ; WX 600 ; N o ; B 71 -15 622 454 ;
+C 112 ; WX 600 ; N p ; B -32 -142 622 454 ;
+C 113 ; WX 600 ; N q ; B 60 -142 685 454 ;
+C 114 ; WX 600 ; N r ; B 47 0 655 454 ;
+C 115 ; WX 600 ; N s ; B 66 -17 608 459 ;
+C 116 ; WX 600 ; N t ; B 118 -15 567 562 ;
+C 117 ; WX 600 ; N u ; B 70 -15 592 439 ;
+C 118 ; WX 600 ; N v ; B 70 0 695 439 ;
+C 119 ; WX 600 ; N w ; B 53 0 712 439 ;
+C 120 ; WX 600 ; N x ; B 6 0 671 439 ;
+C 121 ; WX 600 ; N y ; B -21 -142 695 439 ;
+C 122 ; WX 600 ; N z ; B 81 0 614 439 ;
+C 123 ; WX 600 ; N braceleft ; B 203 -102 595 616 ;
+C 124 ; WX 600 ; N bar ; B 201 -250 505 750 ;
+C 125 ; WX 600 ; N braceright ; B 114 -102 506 616 ;
+C 126 ; WX 600 ; N asciitilde ; B 120 153 590 356 ;
+C 161 ; WX 600 ; N exclamdown ; B 196 -146 477 449 ;
+C 162 ; WX 600 ; N cent ; B 121 -49 605 614 ;
+C 163 ; WX 600 ; N sterling ; B 106 -28 650 611 ;
+C 164 ; WX 600 ; N fraction ; B 22 -60 708 661 ;
+C 165 ; WX 600 ; N yen ; B 98 0 710 562 ;
+C 166 ; WX 600 ; N florin ; B -57 -131 702 616 ;
+C 167 ; WX 600 ; N section ; B 74 -70 620 580 ;
+C 168 ; WX 600 ; N currency ; B 77 49 644 517 ;
+C 169 ; WX 600 ; N quotesingle ; B 303 277 493 562 ;
+C 170 ; WX 600 ; N quotedblleft ; B 190 277 594 562 ;
+C 171 ; WX 600 ; N guillemotleft ; B 62 70 639 446 ;
+C 172 ; WX 600 ; N guilsinglleft ; B 195 70 545 446 ;
+C 173 ; WX 600 ; N guilsinglright ; B 165 70 514 446 ;
+C 174 ; WX 600 ; N fi ; B 12 0 644 626 ;
+C 175 ; WX 600 ; N fl ; B 12 0 644 626 ;
+C 177 ; WX 600 ; N endash ; B 108 203 602 313 ;
+C 178 ; WX 600 ; N dagger ; B 175 -70 586 580 ;
+C 179 ; WX 600 ; N daggerdbl ; B 121 -70 587 580 ;
+C 180 ; WX 600 ; N periodcentered ; B 248 165 461 351 ;
+C 182 ; WX 600 ; N paragraph ; B 61 -70 700 580 ;
+C 183 ; WX 600 ; N bullet ; B 196 132 523 430 ;
+C 184 ; WX 600 ; N quotesinglbase ; B 144 -142 458 143 ;
+C 185 ; WX 600 ; N quotedblbase ; B 34 -142 560 143 ;
+C 186 ; WX 600 ; N quotedblright ; B 119 277 645 562 ;
+C 187 ; WX 600 ; N guillemotright ; B 71 70 647 446 ;
+C 188 ; WX 600 ; N ellipsis ; B 35 -15 587 116 ;
+C 189 ; WX 600 ; N perthousand ; B -45 -15 743 616 ;
+C 191 ; WX 600 ; N questiondown ; B 100 -146 509 449 ;
+C 193 ; WX 600 ; N grave ; B 272 508 503 661 ;
+C 194 ; WX 600 ; N acute ; B 312 508 609 661 ;
+C 195 ; WX 600 ; N circumflex ; B 212 483 607 657 ;
+C 196 ; WX 600 ; N tilde ; B 199 493 643 636 ;
+C 197 ; WX 600 ; N macron ; B 195 505 637 585 ;
+C 198 ; WX 600 ; N breve ; B 217 468 652 631 ;
+C 199 ; WX 600 ; N dotaccent ; B 348 498 493 638 ;
+C 200 ; WX 600 ; N dieresis ; B 246 498 595 638 ;
+C 202 ; WX 600 ; N ring ; B 319 481 528 678 ;
+C 203 ; WX 600 ; N cedilla ; B 168 -206 368 0 ;
+C 205 ; WX 600 ; N hungarumlaut ; B 171 488 729 661 ;
+C 206 ; WX 600 ; N ogonek ; B 143 -199 367 0 ;
+C 207 ; WX 600 ; N caron ; B 238 493 633 667 ;
+C 208 ; WX 600 ; N emdash ; B 33 203 677 313 ;
+C 225 ; WX 600 ; N AE ; B -29 0 708 562 ;
+C 227 ; WX 600 ; N ordfeminine ; B 188 196 526 580 ;
+C 232 ; WX 600 ; N Lslash ; B 39 0 636 562 ;
+C 233 ; WX 600 ; N Oslash ; B 48 -22 673 584 ;
+C 234 ; WX 600 ; N OE ; B 26 0 701 562 ;
+C 235 ; WX 600 ; N ordmasculine ; B 188 196 543 580 ;
+C 241 ; WX 600 ; N ae ; B 21 -15 652 454 ;
+C 245 ; WX 600 ; N dotlessi ; B 77 0 546 439 ;
+C 248 ; WX 600 ; N lslash ; B 77 0 587 626 ;
+C 249 ; WX 600 ; N oslash ; B 54 -24 638 463 ;
+C 250 ; WX 600 ; N oe ; B 18 -15 662 454 ;
+C 251 ; WX 600 ; N germandbls ; B 22 -15 629 626 ;
+C -1 ; WX 600 ; N Idieresis ; B 77 0 643 761 ;
+C -1 ; WX 600 ; N eacute ; B 81 -15 609 661 ;
+C -1 ; WX 600 ; N abreve ; B 61 -15 658 661 ;
+C -1 ; WX 600 ; N uhungarumlaut ; B 70 -15 769 661 ;
+C -1 ; WX 600 ; N ecaron ; B 81 -15 633 667 ;
+C -1 ; WX 600 ; N Ydieresis ; B 109 0 709 761 ;
+C -1 ; WX 600 ; N divide ; B 114 16 596 500 ;
+C -1 ; WX 600 ; N Yacute ; B 109 0 709 784 ;
+C -1 ; WX 600 ; N Acircumflex ; B -9 0 632 780 ;
+C -1 ; WX 600 ; N aacute ; B 61 -15 609 661 ;
+C -1 ; WX 600 ; N Ucircumflex ; B 101 -18 716 780 ;
+C -1 ; WX 600 ; N yacute ; B -21 -142 695 661 ;
+C -1 ; WX 600 ; N scommaaccent ; B 66 -250 608 459 ;
+C -1 ; WX 600 ; N ecircumflex ; B 81 -15 607 657 ;
+C -1 ; WX 600 ; N Uring ; B 101 -18 716 801 ;
+C -1 ; WX 600 ; N Udieresis ; B 101 -18 716 761 ;
+C -1 ; WX 600 ; N aogonek ; B 61 -199 593 454 ;
+C -1 ; WX 600 ; N Uacute ; B 101 -18 716 784 ;
+C -1 ; WX 600 ; N uogonek ; B 70 -199 592 439 ;
+C -1 ; WX 600 ; N Edieresis ; B 25 0 670 761 ;
+C -1 ; WX 600 ; N Dcroat ; B 30 0 664 562 ;
+C -1 ; WX 600 ; N commaaccent ; B 151 -250 385 -57 ;
+C -1 ; WX 600 ; N copyright ; B 53 -18 667 580 ;
+C -1 ; WX 600 ; N Emacron ; B 25 0 670 708 ;
+C -1 ; WX 600 ; N ccaron ; B 81 -15 633 667 ;
+C -1 ; WX 600 ; N aring ; B 61 -15 593 678 ;
+C -1 ; WX 600 ; N Ncommaaccent ; B 8 -250 730 562 ;
+C -1 ; WX 600 ; N lacute ; B 77 0 639 801 ;
+C -1 ; WX 600 ; N agrave ; B 61 -15 593 661 ;
+C -1 ; WX 600 ; N Tcommaaccent ; B 86 -250 679 562 ;
+C -1 ; WX 600 ; N Cacute ; B 74 -18 675 784 ;
+C -1 ; WX 600 ; N atilde ; B 61 -15 643 636 ;
+C -1 ; WX 600 ; N Edotaccent ; B 25 0 670 761 ;
+C -1 ; WX 600 ; N scaron ; B 66 -17 633 667 ;
+C -1 ; WX 600 ; N scedilla ; B 66 -206 608 459 ;
+C -1 ; WX 600 ; N iacute ; B 77 0 609 661 ;
+C -1 ; WX 600 ; N lozenge ; B 145 0 614 740 ;
+C -1 ; WX 600 ; N Rcaron ; B 24 0 659 790 ;
+C -1 ; WX 600 ; N Gcommaaccent ; B 74 -250 675 580 ;
+C -1 ; WX 600 ; N ucircumflex ; B 70 -15 597 657 ;
+C -1 ; WX 600 ; N acircumflex ; B 61 -15 607 657 ;
+C -1 ; WX 600 ; N Amacron ; B -9 0 633 708 ;
+C -1 ; WX 600 ; N rcaron ; B 47 0 655 667 ;
+C -1 ; WX 600 ; N ccedilla ; B 81 -206 631 459 ;
+C -1 ; WX 600 ; N Zdotaccent ; B 62 0 637 761 ;
+C -1 ; WX 600 ; N Thorn ; B 48 0 620 562 ;
+C -1 ; WX 600 ; N Omacron ; B 74 -18 663 708 ;
+C -1 ; WX 600 ; N Racute ; B 24 0 665 784 ;
+C -1 ; WX 600 ; N Sacute ; B 54 -22 673 784 ;
+C -1 ; WX 600 ; N dcaron ; B 60 -15 861 626 ;
+C -1 ; WX 600 ; N Umacron ; B 101 -18 716 708 ;
+C -1 ; WX 600 ; N uring ; B 70 -15 592 678 ;
+C -1 ; WX 600 ; N threesuperior ; B 193 222 526 616 ;
+C -1 ; WX 600 ; N Ograve ; B 74 -18 645 784 ;
+C -1 ; WX 600 ; N Agrave ; B -9 0 632 784 ;
+C -1 ; WX 600 ; N Abreve ; B -9 0 684 784 ;
+C -1 ; WX 600 ; N multiply ; B 104 39 606 478 ;
+C -1 ; WX 600 ; N uacute ; B 70 -15 599 661 ;
+C -1 ; WX 600 ; N Tcaron ; B 86 0 679 790 ;
+C -1 ; WX 600 ; N partialdiff ; B 91 -38 627 728 ;
+C -1 ; WX 600 ; N ydieresis ; B -21 -142 695 638 ;
+C -1 ; WX 600 ; N Nacute ; B 8 -12 730 784 ;
+C -1 ; WX 600 ; N icircumflex ; B 77 0 577 657 ;
+C -1 ; WX 600 ; N Ecircumflex ; B 25 0 670 780 ;
+C -1 ; WX 600 ; N adieresis ; B 61 -15 595 638 ;
+C -1 ; WX 600 ; N edieresis ; B 81 -15 605 638 ;
+C -1 ; WX 600 ; N cacute ; B 81 -15 649 661 ;
+C -1 ; WX 600 ; N nacute ; B 18 0 639 661 ;
+C -1 ; WX 600 ; N umacron ; B 70 -15 637 585 ;
+C -1 ; WX 600 ; N Ncaron ; B 8 -12 730 790 ;
+C -1 ; WX 600 ; N Iacute ; B 77 0 643 784 ;
+C -1 ; WX 600 ; N plusminus ; B 76 24 614 515 ;
+C -1 ; WX 600 ; N brokenbar ; B 217 -175 489 675 ;
+C -1 ; WX 600 ; N registered ; B 53 -18 667 580 ;
+C -1 ; WX 600 ; N Gbreve ; B 74 -18 684 784 ;
+C -1 ; WX 600 ; N Idotaccent ; B 77 0 643 761 ;
+C -1 ; WX 600 ; N summation ; B 15 -10 672 706 ;
+C -1 ; WX 600 ; N Egrave ; B 25 0 670 784 ;
+C -1 ; WX 600 ; N racute ; B 47 0 655 661 ;
+C -1 ; WX 600 ; N omacron ; B 71 -15 637 585 ;
+C -1 ; WX 600 ; N Zacute ; B 62 0 665 784 ;
+C -1 ; WX 600 ; N Zcaron ; B 62 0 659 790 ;
+C -1 ; WX 600 ; N greaterequal ; B 26 0 627 696 ;
+C -1 ; WX 600 ; N Eth ; B 30 0 664 562 ;
+C -1 ; WX 600 ; N Ccedilla ; B 74 -206 675 580 ;
+C -1 ; WX 600 ; N lcommaaccent ; B 77 -250 546 626 ;
+C -1 ; WX 600 ; N tcaron ; B 118 -15 627 703 ;
+C -1 ; WX 600 ; N eogonek ; B 81 -199 605 454 ;
+C -1 ; WX 600 ; N Uogonek ; B 101 -199 716 562 ;
+C -1 ; WX 600 ; N Aacute ; B -9 0 655 784 ;
+C -1 ; WX 600 ; N Adieresis ; B -9 0 632 761 ;
+C -1 ; WX 600 ; N egrave ; B 81 -15 605 661 ;
+C -1 ; WX 600 ; N zacute ; B 81 0 614 661 ;
+C -1 ; WX 600 ; N iogonek ; B 77 -199 546 658 ;
+C -1 ; WX 600 ; N Oacute ; B 74 -18 645 784 ;
+C -1 ; WX 600 ; N oacute ; B 71 -15 649 661 ;
+C -1 ; WX 600 ; N amacron ; B 61 -15 637 585 ;
+C -1 ; WX 600 ; N sacute ; B 66 -17 609 661 ;
+C -1 ; WX 600 ; N idieresis ; B 77 0 561 618 ;
+C -1 ; WX 600 ; N Ocircumflex ; B 74 -18 645 780 ;
+C -1 ; WX 600 ; N Ugrave ; B 101 -18 716 784 ;
+C -1 ; WX 600 ; N Delta ; B 6 0 594 688 ;
+C -1 ; WX 600 ; N thorn ; B -32 -142 622 626 ;
+C -1 ; WX 600 ; N twosuperior ; B 191 230 542 616 ;
+C -1 ; WX 600 ; N Odieresis ; B 74 -18 645 761 ;
+C -1 ; WX 600 ; N mu ; B 49 -142 592 439 ;
+C -1 ; WX 600 ; N igrave ; B 77 0 546 661 ;
+C -1 ; WX 600 ; N ohungarumlaut ; B 71 -15 809 661 ;
+C -1 ; WX 600 ; N Eogonek ; B 25 -199 670 562 ;
+C -1 ; WX 600 ; N dcroat ; B 60 -15 712 626 ;
+C -1 ; WX 600 ; N threequarters ; B 8 -60 699 661 ;
+C -1 ; WX 600 ; N Scedilla ; B 54 -206 673 582 ;
+C -1 ; WX 600 ; N lcaron ; B 77 0 731 626 ;
+C -1 ; WX 600 ; N Kcommaaccent ; B 21 -250 692 562 ;
+C -1 ; WX 600 ; N Lacute ; B 39 0 636 784 ;
+C -1 ; WX 600 ; N trademark ; B 86 230 869 562 ;
+C -1 ; WX 600 ; N edotaccent ; B 81 -15 605 638 ;
+C -1 ; WX 600 ; N Igrave ; B 77 0 643 784 ;
+C -1 ; WX 600 ; N Imacron ; B 77 0 663 708 ;
+C -1 ; WX 600 ; N Lcaron ; B 39 0 757 562 ;
+C -1 ; WX 600 ; N onehalf ; B 22 -60 716 661 ;
+C -1 ; WX 600 ; N lessequal ; B 26 0 671 696 ;
+C -1 ; WX 600 ; N ocircumflex ; B 71 -15 622 657 ;
+C -1 ; WX 600 ; N ntilde ; B 18 0 643 636 ;
+C -1 ; WX 600 ; N Uhungarumlaut ; B 101 -18 805 784 ;
+C -1 ; WX 600 ; N Eacute ; B 25 0 670 784 ;
+C -1 ; WX 600 ; N emacron ; B 81 -15 637 585 ;
+C -1 ; WX 600 ; N gbreve ; B 40 -146 674 661 ;
+C -1 ; WX 600 ; N onequarter ; B 13 -60 707 661 ;
+C -1 ; WX 600 ; N Scaron ; B 54 -22 689 790 ;
+C -1 ; WX 600 ; N Scommaaccent ; B 54 -250 673 582 ;
+C -1 ; WX 600 ; N Ohungarumlaut ; B 74 -18 795 784 ;
+C -1 ; WX 600 ; N degree ; B 173 243 570 616 ;
+C -1 ; WX 600 ; N ograve ; B 71 -15 622 661 ;
+C -1 ; WX 600 ; N Ccaron ; B 74 -18 689 790 ;
+C -1 ; WX 600 ; N ugrave ; B 70 -15 592 661 ;
+C -1 ; WX 600 ; N radical ; B 67 -104 635 778 ;
+C -1 ; WX 600 ; N Dcaron ; B 30 0 664 790 ;
+C -1 ; WX 600 ; N rcommaaccent ; B 47 -250 655 454 ;
+C -1 ; WX 600 ; N Ntilde ; B 8 -12 730 759 ;
+C -1 ; WX 600 ; N otilde ; B 71 -15 643 636 ;
+C -1 ; WX 600 ; N Rcommaaccent ; B 24 -250 617 562 ;
+C -1 ; WX 600 ; N Lcommaaccent ; B 39 -250 636 562 ;
+C -1 ; WX 600 ; N Atilde ; B -9 0 669 759 ;
+C -1 ; WX 600 ; N Aogonek ; B -9 -199 632 562 ;
+C -1 ; WX 600 ; N Aring ; B -9 0 632 801 ;
+C -1 ; WX 600 ; N Otilde ; B 74 -18 669 759 ;
+C -1 ; WX 600 ; N zdotaccent ; B 81 0 614 638 ;
+C -1 ; WX 600 ; N Ecaron ; B 25 0 670 790 ;
+C -1 ; WX 600 ; N Iogonek ; B 77 -199 643 562 ;
+C -1 ; WX 600 ; N kcommaaccent ; B 33 -250 643 626 ;
+C -1 ; WX 600 ; N minus ; B 114 203 596 313 ;
+C -1 ; WX 600 ; N Icircumflex ; B 77 0 643 780 ;
+C -1 ; WX 600 ; N ncaron ; B 18 0 633 667 ;
+C -1 ; WX 600 ; N tcommaaccent ; B 118 -250 567 562 ;
+C -1 ; WX 600 ; N logicalnot ; B 135 103 617 413 ;
+C -1 ; WX 600 ; N odieresis ; B 71 -15 622 638 ;
+C -1 ; WX 600 ; N udieresis ; B 70 -15 595 638 ;
+C -1 ; WX 600 ; N notequal ; B 30 -47 626 563 ;
+C -1 ; WX 600 ; N gcommaaccent ; B 40 -146 674 714 ;
+C -1 ; WX 600 ; N eth ; B 93 -27 661 626 ;
+C -1 ; WX 600 ; N zcaron ; B 81 0 643 667 ;
+C -1 ; WX 600 ; N ncommaaccent ; B 18 -250 615 454 ;
+C -1 ; WX 600 ; N onesuperior ; B 212 230 514 616 ;
+C -1 ; WX 600 ; N imacron ; B 77 0 575 585 ;
+C -1 ; WX 600 ; N Euro ; B 0 0 0 0 ;
+EndCharMetrics
+EndFontMetrics
diff --git a/src/main/resources/Resources/afm/Courier-Oblique.afm b/src/main/resources/Resources/afm/Courier-Oblique.afm
new file mode 100644
index 0000000..acacb3d
--- /dev/null
+++ b/src/main/resources/Resources/afm/Courier-Oblique.afm
@@ -0,0 +1,342 @@
+StartFontMetrics 4.1
+Comment Copyright (c) 1989, 1990, 1991, 1992, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.
+Comment Creation Date: Thu May 1 17:37:52 1997
+Comment UniqueID 43051
+Comment VMusage 16248 75829
+FontName Courier-Oblique
+FullName Courier Oblique
+FamilyName Courier
+Weight Medium
+ItalicAngle -12
+IsFixedPitch true
+CharacterSet ExtendedRoman
+FontBBox -27 -250 849 805
+UnderlinePosition -100
+UnderlineThickness 50
+Version 003.000
+Notice Copyright (c) 1989, 1990, 1991, 1992, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.
+EncodingScheme AdobeStandardEncoding
+CapHeight 562
+XHeight 426
+Ascender 629
+Descender -157
+StdHW 51
+StdVW 51
+StartCharMetrics 315
+C 32 ; WX 600 ; N space ; B 0 0 0 0 ;
+C 33 ; WX 600 ; N exclam ; B 243 -15 464 572 ;
+C 34 ; WX 600 ; N quotedbl ; B 273 328 532 562 ;
+C 35 ; WX 600 ; N numbersign ; B 133 -32 596 639 ;
+C 36 ; WX 600 ; N dollar ; B 108 -126 596 662 ;
+C 37 ; WX 600 ; N percent ; B 134 -15 599 622 ;
+C 38 ; WX 600 ; N ampersand ; B 87 -15 580 543 ;
+C 39 ; WX 600 ; N quoteright ; B 283 328 495 562 ;
+C 40 ; WX 600 ; N parenleft ; B 313 -108 572 622 ;
+C 41 ; WX 600 ; N parenright ; B 137 -108 396 622 ;
+C 42 ; WX 600 ; N asterisk ; B 212 257 580 607 ;
+C 43 ; WX 600 ; N plus ; B 129 44 580 470 ;
+C 44 ; WX 600 ; N comma ; B 157 -112 370 122 ;
+C 45 ; WX 600 ; N hyphen ; B 152 231 558 285 ;
+C 46 ; WX 600 ; N period ; B 238 -15 382 109 ;
+C 47 ; WX 600 ; N slash ; B 112 -80 604 629 ;
+C 48 ; WX 600 ; N zero ; B 154 -15 575 622 ;
+C 49 ; WX 600 ; N one ; B 98 0 515 622 ;
+C 50 ; WX 600 ; N two ; B 70 0 568 622 ;
+C 51 ; WX 600 ; N three ; B 82 -15 538 622 ;
+C 52 ; WX 600 ; N four ; B 108 0 541 622 ;
+C 53 ; WX 600 ; N five ; B 99 -15 589 607 ;
+C 54 ; WX 600 ; N six ; B 155 -15 629 622 ;
+C 55 ; WX 600 ; N seven ; B 182 0 612 607 ;
+C 56 ; WX 600 ; N eight ; B 132 -15 588 622 ;
+C 57 ; WX 600 ; N nine ; B 93 -15 574 622 ;
+C 58 ; WX 600 ; N colon ; B 238 -15 441 385 ;
+C 59 ; WX 600 ; N semicolon ; B 157 -112 441 385 ;
+C 60 ; WX 600 ; N less ; B 96 42 610 472 ;
+C 61 ; WX 600 ; N equal ; B 109 138 600 376 ;
+C 62 ; WX 600 ; N greater ; B 85 42 599 472 ;
+C 63 ; WX 600 ; N question ; B 222 -15 583 572 ;
+C 64 ; WX 600 ; N at ; B 127 -15 582 622 ;
+C 65 ; WX 600 ; N A ; B 3 0 607 562 ;
+C 66 ; WX 600 ; N B ; B 43 0 616 562 ;
+C 67 ; WX 600 ; N C ; B 93 -18 655 580 ;
+C 68 ; WX 600 ; N D ; B 43 0 645 562 ;
+C 69 ; WX 600 ; N E ; B 53 0 660 562 ;
+C 70 ; WX 600 ; N F ; B 53 0 660 562 ;
+C 71 ; WX 600 ; N G ; B 83 -18 645 580 ;
+C 72 ; WX 600 ; N H ; B 32 0 687 562 ;
+C 73 ; WX 600 ; N I ; B 96 0 623 562 ;
+C 74 ; WX 600 ; N J ; B 52 -18 685 562 ;
+C 75 ; WX 600 ; N K ; B 38 0 671 562 ;
+C 76 ; WX 600 ; N L ; B 47 0 607 562 ;
+C 77 ; WX 600 ; N M ; B 4 0 715 562 ;
+C 78 ; WX 600 ; N N ; B 7 -13 712 562 ;
+C 79 ; WX 600 ; N O ; B 94 -18 625 580 ;
+C 80 ; WX 600 ; N P ; B 79 0 644 562 ;
+C 81 ; WX 600 ; N Q ; B 95 -138 625 580 ;
+C 82 ; WX 600 ; N R ; B 38 0 598 562 ;
+C 83 ; WX 600 ; N S ; B 76 -20 650 580 ;
+C 84 ; WX 600 ; N T ; B 108 0 665 562 ;
+C 85 ; WX 600 ; N U ; B 125 -18 702 562 ;
+C 86 ; WX 600 ; N V ; B 105 -13 723 562 ;
+C 87 ; WX 600 ; N W ; B 106 -13 722 562 ;
+C 88 ; WX 600 ; N X ; B 23 0 675 562 ;
+C 89 ; WX 600 ; N Y ; B 133 0 695 562 ;
+C 90 ; WX 600 ; N Z ; B 86 0 610 562 ;
+C 91 ; WX 600 ; N bracketleft ; B 246 -108 574 622 ;
+C 92 ; WX 600 ; N backslash ; B 249 -80 468 629 ;
+C 93 ; WX 600 ; N bracketright ; B 135 -108 463 622 ;
+C 94 ; WX 600 ; N asciicircum ; B 175 354 587 622 ;
+C 95 ; WX 600 ; N underscore ; B -27 -125 584 -75 ;
+C 96 ; WX 600 ; N quoteleft ; B 343 328 457 562 ;
+C 97 ; WX 600 ; N a ; B 76 -15 569 441 ;
+C 98 ; WX 600 ; N b ; B 29 -15 625 629 ;
+C 99 ; WX 600 ; N c ; B 106 -15 608 441 ;
+C 100 ; WX 600 ; N d ; B 85 -15 640 629 ;
+C 101 ; WX 600 ; N e ; B 106 -15 598 441 ;
+C 102 ; WX 600 ; N f ; B 114 0 662 629 ; L i fi ; L l fl ;
+C 103 ; WX 600 ; N g ; B 61 -157 657 441 ;
+C 104 ; WX 600 ; N h ; B 33 0 592 629 ;
+C 105 ; WX 600 ; N i ; B 95 0 515 657 ;
+C 106 ; WX 600 ; N j ; B 52 -157 550 657 ;
+C 107 ; WX 600 ; N k ; B 58 0 633 629 ;
+C 108 ; WX 600 ; N l ; B 95 0 515 629 ;
+C 109 ; WX 600 ; N m ; B -5 0 615 441 ;
+C 110 ; WX 600 ; N n ; B 26 0 585 441 ;
+C 111 ; WX 600 ; N o ; B 102 -15 588 441 ;
+C 112 ; WX 600 ; N p ; B -24 -157 605 441 ;
+C 113 ; WX 600 ; N q ; B 85 -157 682 441 ;
+C 114 ; WX 600 ; N r ; B 60 0 636 441 ;
+C 115 ; WX 600 ; N s ; B 78 -15 584 441 ;
+C 116 ; WX 600 ; N t ; B 167 -15 561 561 ;
+C 117 ; WX 600 ; N u ; B 101 -15 572 426 ;
+C 118 ; WX 600 ; N v ; B 90 -10 681 426 ;
+C 119 ; WX 600 ; N w ; B 76 -10 695 426 ;
+C 120 ; WX 600 ; N x ; B 20 0 655 426 ;
+C 121 ; WX 600 ; N y ; B -4 -157 683 426 ;
+C 122 ; WX 600 ; N z ; B 99 0 593 426 ;
+C 123 ; WX 600 ; N braceleft ; B 233 -108 569 622 ;
+C 124 ; WX 600 ; N bar ; B 222 -250 485 750 ;
+C 125 ; WX 600 ; N braceright ; B 140 -108 477 622 ;
+C 126 ; WX 600 ; N asciitilde ; B 116 197 600 320 ;
+C 161 ; WX 600 ; N exclamdown ; B 225 -157 445 430 ;
+C 162 ; WX 600 ; N cent ; B 151 -49 588 614 ;
+C 163 ; WX 600 ; N sterling ; B 124 -21 621 611 ;
+C 164 ; WX 600 ; N fraction ; B 84 -57 646 665 ;
+C 165 ; WX 600 ; N yen ; B 120 0 693 562 ;
+C 166 ; WX 600 ; N florin ; B -26 -143 671 622 ;
+C 167 ; WX 600 ; N section ; B 104 -78 590 580 ;
+C 168 ; WX 600 ; N currency ; B 94 58 628 506 ;
+C 169 ; WX 600 ; N quotesingle ; B 345 328 460 562 ;
+C 170 ; WX 600 ; N quotedblleft ; B 262 328 541 562 ;
+C 171 ; WX 600 ; N guillemotleft ; B 92 70 652 446 ;
+C 172 ; WX 600 ; N guilsinglleft ; B 204 70 540 446 ;
+C 173 ; WX 600 ; N guilsinglright ; B 170 70 506 446 ;
+C 174 ; WX 600 ; N fi ; B 3 0 619 629 ;
+C 175 ; WX 600 ; N fl ; B 3 0 619 629 ;
+C 177 ; WX 600 ; N endash ; B 124 231 586 285 ;
+C 178 ; WX 600 ; N dagger ; B 217 -78 546 580 ;
+C 179 ; WX 600 ; N daggerdbl ; B 163 -78 546 580 ;
+C 180 ; WX 600 ; N periodcentered ; B 275 189 434 327 ;
+C 182 ; WX 600 ; N paragraph ; B 100 -78 630 562 ;
+C 183 ; WX 600 ; N bullet ; B 224 130 485 383 ;
+C 184 ; WX 600 ; N quotesinglbase ; B 185 -134 397 100 ;
+C 185 ; WX 600 ; N quotedblbase ; B 115 -134 478 100 ;
+C 186 ; WX 600 ; N quotedblright ; B 213 328 576 562 ;
+C 187 ; WX 600 ; N guillemotright ; B 58 70 618 446 ;
+C 188 ; WX 600 ; N ellipsis ; B 46 -15 575 111 ;
+C 189 ; WX 600 ; N perthousand ; B 59 -15 627 622 ;
+C 191 ; WX 600 ; N questiondown ; B 105 -157 466 430 ;
+C 193 ; WX 600 ; N grave ; B 294 497 484 672 ;
+C 194 ; WX 600 ; N acute ; B 348 497 612 672 ;
+C 195 ; WX 600 ; N circumflex ; B 229 477 581 654 ;
+C 196 ; WX 600 ; N tilde ; B 212 489 629 606 ;
+C 197 ; WX 600 ; N macron ; B 232 525 600 565 ;
+C 198 ; WX 600 ; N breve ; B 279 501 576 609 ;
+C 199 ; WX 600 ; N dotaccent ; B 373 537 478 640 ;
+C 200 ; WX 600 ; N dieresis ; B 272 537 579 640 ;
+C 202 ; WX 600 ; N ring ; B 332 463 500 627 ;
+C 203 ; WX 600 ; N cedilla ; B 197 -151 344 10 ;
+C 205 ; WX 600 ; N hungarumlaut ; B 239 497 683 672 ;
+C 206 ; WX 600 ; N ogonek ; B 189 -172 377 4 ;
+C 207 ; WX 600 ; N caron ; B 262 492 614 669 ;
+C 208 ; WX 600 ; N emdash ; B 49 231 661 285 ;
+C 225 ; WX 600 ; N AE ; B 3 0 655 562 ;
+C 227 ; WX 600 ; N ordfeminine ; B 209 249 512 580 ;
+C 232 ; WX 600 ; N Lslash ; B 47 0 607 562 ;
+C 233 ; WX 600 ; N Oslash ; B 94 -80 625 629 ;
+C 234 ; WX 600 ; N OE ; B 59 0 672 562 ;
+C 235 ; WX 600 ; N ordmasculine ; B 210 249 535 580 ;
+C 241 ; WX 600 ; N ae ; B 41 -15 626 441 ;
+C 245 ; WX 600 ; N dotlessi ; B 95 0 515 426 ;
+C 248 ; WX 600 ; N lslash ; B 95 0 587 629 ;
+C 249 ; WX 600 ; N oslash ; B 102 -80 588 506 ;
+C 250 ; WX 600 ; N oe ; B 54 -15 615 441 ;
+C 251 ; WX 600 ; N germandbls ; B 48 -15 617 629 ;
+C -1 ; WX 600 ; N Idieresis ; B 96 0 623 753 ;
+C -1 ; WX 600 ; N eacute ; B 106 -15 612 672 ;
+C -1 ; WX 600 ; N abreve ; B 76 -15 576 609 ;
+C -1 ; WX 600 ; N uhungarumlaut ; B 101 -15 723 672 ;
+C -1 ; WX 600 ; N ecaron ; B 106 -15 614 669 ;
+C -1 ; WX 600 ; N Ydieresis ; B 133 0 695 753 ;
+C -1 ; WX 600 ; N divide ; B 136 48 573 467 ;
+C -1 ; WX 600 ; N Yacute ; B 133 0 695 805 ;
+C -1 ; WX 600 ; N Acircumflex ; B 3 0 607 787 ;
+C -1 ; WX 600 ; N aacute ; B 76 -15 612 672 ;
+C -1 ; WX 600 ; N Ucircumflex ; B 125 -18 702 787 ;
+C -1 ; WX 600 ; N yacute ; B -4 -157 683 672 ;
+C -1 ; WX 600 ; N scommaaccent ; B 78 -250 584 441 ;
+C -1 ; WX 600 ; N ecircumflex ; B 106 -15 598 654 ;
+C -1 ; WX 600 ; N Uring ; B 125 -18 702 760 ;
+C -1 ; WX 600 ; N Udieresis ; B 125 -18 702 753 ;
+C -1 ; WX 600 ; N aogonek ; B 76 -172 569 441 ;
+C -1 ; WX 600 ; N Uacute ; B 125 -18 702 805 ;
+C -1 ; WX 600 ; N uogonek ; B 101 -172 572 426 ;
+C -1 ; WX 600 ; N Edieresis ; B 53 0 660 753 ;
+C -1 ; WX 600 ; N Dcroat ; B 43 0 645 562 ;
+C -1 ; WX 600 ; N commaaccent ; B 145 -250 323 -58 ;
+C -1 ; WX 600 ; N copyright ; B 53 -18 667 580 ;
+C -1 ; WX 600 ; N Emacron ; B 53 0 660 698 ;
+C -1 ; WX 600 ; N ccaron ; B 106 -15 614 669 ;
+C -1 ; WX 600 ; N aring ; B 76 -15 569 627 ;
+C -1 ; WX 600 ; N Ncommaaccent ; B 7 -250 712 562 ;
+C -1 ; WX 600 ; N lacute ; B 95 0 640 805 ;
+C -1 ; WX 600 ; N agrave ; B 76 -15 569 672 ;
+C -1 ; WX 600 ; N Tcommaaccent ; B 108 -250 665 562 ;
+C -1 ; WX 600 ; N Cacute ; B 93 -18 655 805 ;
+C -1 ; WX 600 ; N atilde ; B 76 -15 629 606 ;
+C -1 ; WX 600 ; N Edotaccent ; B 53 0 660 753 ;
+C -1 ; WX 600 ; N scaron ; B 78 -15 614 669 ;
+C -1 ; WX 600 ; N scedilla ; B 78 -151 584 441 ;
+C -1 ; WX 600 ; N iacute ; B 95 0 612 672 ;
+C -1 ; WX 600 ; N lozenge ; B 94 0 519 706 ;
+C -1 ; WX 600 ; N Rcaron ; B 38 0 642 802 ;
+C -1 ; WX 600 ; N Gcommaaccent ; B 83 -250 645 580 ;
+C -1 ; WX 600 ; N ucircumflex ; B 101 -15 572 654 ;
+C -1 ; WX 600 ; N acircumflex ; B 76 -15 581 654 ;
+C -1 ; WX 600 ; N Amacron ; B 3 0 607 698 ;
+C -1 ; WX 600 ; N rcaron ; B 60 0 636 669 ;
+C -1 ; WX 600 ; N ccedilla ; B 106 -151 614 441 ;
+C -1 ; WX 600 ; N Zdotaccent ; B 86 0 610 753 ;
+C -1 ; WX 600 ; N Thorn ; B 79 0 606 562 ;
+C -1 ; WX 600 ; N Omacron ; B 94 -18 628 698 ;
+C -1 ; WX 600 ; N Racute ; B 38 0 670 805 ;
+C -1 ; WX 600 ; N Sacute ; B 76 -20 650 805 ;
+C -1 ; WX 600 ; N dcaron ; B 85 -15 849 629 ;
+C -1 ; WX 600 ; N Umacron ; B 125 -18 702 698 ;
+C -1 ; WX 600 ; N uring ; B 101 -15 572 627 ;
+C -1 ; WX 600 ; N threesuperior ; B 213 240 501 622 ;
+C -1 ; WX 600 ; N Ograve ; B 94 -18 625 805 ;
+C -1 ; WX 600 ; N Agrave ; B 3 0 607 805 ;
+C -1 ; WX 600 ; N Abreve ; B 3 0 607 732 ;
+C -1 ; WX 600 ; N multiply ; B 103 43 607 470 ;
+C -1 ; WX 600 ; N uacute ; B 101 -15 602 672 ;
+C -1 ; WX 600 ; N Tcaron ; B 108 0 665 802 ;
+C -1 ; WX 600 ; N partialdiff ; B 45 -38 546 710 ;
+C -1 ; WX 600 ; N ydieresis ; B -4 -157 683 620 ;
+C -1 ; WX 600 ; N Nacute ; B 7 -13 712 805 ;
+C -1 ; WX 600 ; N icircumflex ; B 95 0 551 654 ;
+C -1 ; WX 600 ; N Ecircumflex ; B 53 0 660 787 ;
+C -1 ; WX 600 ; N adieresis ; B 76 -15 575 620 ;
+C -1 ; WX 600 ; N edieresis ; B 106 -15 598 620 ;
+C -1 ; WX 600 ; N cacute ; B 106 -15 612 672 ;
+C -1 ; WX 600 ; N nacute ; B 26 0 602 672 ;
+C -1 ; WX 600 ; N umacron ; B 101 -15 600 565 ;
+C -1 ; WX 600 ; N Ncaron ; B 7 -13 712 802 ;
+C -1 ; WX 600 ; N Iacute ; B 96 0 640 805 ;
+C -1 ; WX 600 ; N plusminus ; B 96 44 594 558 ;
+C -1 ; WX 600 ; N brokenbar ; B 238 -175 469 675 ;
+C -1 ; WX 600 ; N registered ; B 53 -18 667 580 ;
+C -1 ; WX 600 ; N Gbreve ; B 83 -18 645 732 ;
+C -1 ; WX 600 ; N Idotaccent ; B 96 0 623 753 ;
+C -1 ; WX 600 ; N summation ; B 15 -10 670 706 ;
+C -1 ; WX 600 ; N Egrave ; B 53 0 660 805 ;
+C -1 ; WX 600 ; N racute ; B 60 0 636 672 ;
+C -1 ; WX 600 ; N omacron ; B 102 -15 600 565 ;
+C -1 ; WX 600 ; N Zacute ; B 86 0 670 805 ;
+C -1 ; WX 600 ; N Zcaron ; B 86 0 642 802 ;
+C -1 ; WX 600 ; N greaterequal ; B 98 0 594 710 ;
+C -1 ; WX 600 ; N Eth ; B 43 0 645 562 ;
+C -1 ; WX 600 ; N Ccedilla ; B 93 -151 658 580 ;
+C -1 ; WX 600 ; N lcommaaccent ; B 95 -250 515 629 ;
+C -1 ; WX 600 ; N tcaron ; B 167 -15 587 717 ;
+C -1 ; WX 600 ; N eogonek ; B 106 -172 598 441 ;
+C -1 ; WX 600 ; N Uogonek ; B 124 -172 702 562 ;
+C -1 ; WX 600 ; N Aacute ; B 3 0 660 805 ;
+C -1 ; WX 600 ; N Adieresis ; B 3 0 607 753 ;
+C -1 ; WX 600 ; N egrave ; B 106 -15 598 672 ;
+C -1 ; WX 600 ; N zacute ; B 99 0 612 672 ;
+C -1 ; WX 600 ; N iogonek ; B 95 -172 515 657 ;
+C -1 ; WX 600 ; N Oacute ; B 94 -18 640 805 ;
+C -1 ; WX 600 ; N oacute ; B 102 -15 612 672 ;
+C -1 ; WX 600 ; N amacron ; B 76 -15 600 565 ;
+C -1 ; WX 600 ; N sacute ; B 78 -15 612 672 ;
+C -1 ; WX 600 ; N idieresis ; B 95 0 545 620 ;
+C -1 ; WX 600 ; N Ocircumflex ; B 94 -18 625 787 ;
+C -1 ; WX 600 ; N Ugrave ; B 125 -18 702 805 ;
+C -1 ; WX 600 ; N Delta ; B 6 0 598 688 ;
+C -1 ; WX 600 ; N thorn ; B -24 -157 605 629 ;
+C -1 ; WX 600 ; N twosuperior ; B 230 249 535 622 ;
+C -1 ; WX 600 ; N Odieresis ; B 94 -18 625 753 ;
+C -1 ; WX 600 ; N mu ; B 72 -157 572 426 ;
+C -1 ; WX 600 ; N igrave ; B 95 0 515 672 ;
+C -1 ; WX 600 ; N ohungarumlaut ; B 102 -15 723 672 ;
+C -1 ; WX 600 ; N Eogonek ; B 53 -172 660 562 ;
+C -1 ; WX 600 ; N dcroat ; B 85 -15 704 629 ;
+C -1 ; WX 600 ; N threequarters ; B 73 -56 659 666 ;
+C -1 ; WX 600 ; N Scedilla ; B 76 -151 650 580 ;
+C -1 ; WX 600 ; N lcaron ; B 95 0 667 629 ;
+C -1 ; WX 600 ; N Kcommaaccent ; B 38 -250 671 562 ;
+C -1 ; WX 600 ; N Lacute ; B 47 0 607 805 ;
+C -1 ; WX 600 ; N trademark ; B 75 263 742 562 ;
+C -1 ; WX 600 ; N edotaccent ; B 106 -15 598 620 ;
+C -1 ; WX 600 ; N Igrave ; B 96 0 623 805 ;
+C -1 ; WX 600 ; N Imacron ; B 96 0 628 698 ;
+C -1 ; WX 600 ; N Lcaron ; B 47 0 632 562 ;
+C -1 ; WX 600 ; N onehalf ; B 65 -57 669 665 ;
+C -1 ; WX 600 ; N lessequal ; B 98 0 645 710 ;
+C -1 ; WX 600 ; N ocircumflex ; B 102 -15 588 654 ;
+C -1 ; WX 600 ; N ntilde ; B 26 0 629 606 ;
+C -1 ; WX 600 ; N Uhungarumlaut ; B 125 -18 761 805 ;
+C -1 ; WX 600 ; N Eacute ; B 53 0 670 805 ;
+C -1 ; WX 600 ; N emacron ; B 106 -15 600 565 ;
+C -1 ; WX 600 ; N gbreve ; B 61 -157 657 609 ;
+C -1 ; WX 600 ; N onequarter ; B 65 -57 674 665 ;
+C -1 ; WX 600 ; N Scaron ; B 76 -20 672 802 ;
+C -1 ; WX 600 ; N Scommaaccent ; B 76 -250 650 580 ;
+C -1 ; WX 600 ; N Ohungarumlaut ; B 94 -18 751 805 ;
+C -1 ; WX 600 ; N degree ; B 214 269 576 622 ;
+C -1 ; WX 600 ; N ograve ; B 102 -15 588 672 ;
+C -1 ; WX 600 ; N Ccaron ; B 93 -18 672 802 ;
+C -1 ; WX 600 ; N ugrave ; B 101 -15 572 672 ;
+C -1 ; WX 600 ; N radical ; B 85 -15 765 792 ;
+C -1 ; WX 600 ; N Dcaron ; B 43 0 645 802 ;
+C -1 ; WX 600 ; N rcommaaccent ; B 60 -250 636 441 ;
+C -1 ; WX 600 ; N Ntilde ; B 7 -13 712 729 ;
+C -1 ; WX 600 ; N otilde ; B 102 -15 629 606 ;
+C -1 ; WX 600 ; N Rcommaaccent ; B 38 -250 598 562 ;
+C -1 ; WX 600 ; N Lcommaaccent ; B 47 -250 607 562 ;
+C -1 ; WX 600 ; N Atilde ; B 3 0 655 729 ;
+C -1 ; WX 600 ; N Aogonek ; B 3 -172 607 562 ;
+C -1 ; WX 600 ; N Aring ; B 3 0 607 750 ;
+C -1 ; WX 600 ; N Otilde ; B 94 -18 655 729 ;
+C -1 ; WX 600 ; N zdotaccent ; B 99 0 593 620 ;
+C -1 ; WX 600 ; N Ecaron ; B 53 0 660 802 ;
+C -1 ; WX 600 ; N Iogonek ; B 96 -172 623 562 ;
+C -1 ; WX 600 ; N kcommaaccent ; B 58 -250 633 629 ;
+C -1 ; WX 600 ; N minus ; B 129 232 580 283 ;
+C -1 ; WX 600 ; N Icircumflex ; B 96 0 623 787 ;
+C -1 ; WX 600 ; N ncaron ; B 26 0 614 669 ;
+C -1 ; WX 600 ; N tcommaaccent ; B 165 -250 561 561 ;
+C -1 ; WX 600 ; N logicalnot ; B 155 108 591 369 ;
+C -1 ; WX 600 ; N odieresis ; B 102 -15 588 620 ;
+C -1 ; WX 600 ; N udieresis ; B 101 -15 575 620 ;
+C -1 ; WX 600 ; N notequal ; B 43 -16 621 529 ;
+C -1 ; WX 600 ; N gcommaaccent ; B 61 -157 657 708 ;
+C -1 ; WX 600 ; N eth ; B 102 -15 639 629 ;
+C -1 ; WX 600 ; N zcaron ; B 99 0 624 669 ;
+C -1 ; WX 600 ; N ncommaaccent ; B 26 -250 585 441 ;
+C -1 ; WX 600 ; N onesuperior ; B 231 249 491 622 ;
+C -1 ; WX 600 ; N imacron ; B 95 0 543 565 ;
+C -1 ; WX 600 ; N Euro ; B 0 0 0 0 ;
+EndCharMetrics
+EndFontMetrics
diff --git a/src/main/resources/Resources/afm/Courier.afm b/src/main/resources/Resources/afm/Courier.afm
new file mode 100644
index 0000000..be84b6b
--- /dev/null
+++ b/src/main/resources/Resources/afm/Courier.afm
@@ -0,0 +1,342 @@
+StartFontMetrics 4.1
+Comment Copyright (c) 1989, 1990, 1991, 1992, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.
+Comment Creation Date: Thu May 1 17:27:09 1997
+Comment UniqueID 43050
+Comment VMusage 39754 50779
+FontName Courier
+FullName Courier
+FamilyName Courier
+Weight Medium
+ItalicAngle 0
+IsFixedPitch true
+CharacterSet ExtendedRoman
+FontBBox -23 -250 715 805
+UnderlinePosition -100
+UnderlineThickness 50
+Version 003.000
+Notice Copyright (c) 1989, 1990, 1991, 1992, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.
+EncodingScheme AdobeStandardEncoding
+CapHeight 562
+XHeight 426
+Ascender 629
+Descender -157
+StdHW 51
+StdVW 51
+StartCharMetrics 315
+C 32 ; WX 600 ; N space ; B 0 0 0 0 ;
+C 33 ; WX 600 ; N exclam ; B 236 -15 364 572 ;
+C 34 ; WX 600 ; N quotedbl ; B 187 328 413 562 ;
+C 35 ; WX 600 ; N numbersign ; B 93 -32 507 639 ;
+C 36 ; WX 600 ; N dollar ; B 105 -126 496 662 ;
+C 37 ; WX 600 ; N percent ; B 81 -15 518 622 ;
+C 38 ; WX 600 ; N ampersand ; B 63 -15 538 543 ;
+C 39 ; WX 600 ; N quoteright ; B 213 328 376 562 ;
+C 40 ; WX 600 ; N parenleft ; B 269 -108 440 622 ;
+C 41 ; WX 600 ; N parenright ; B 160 -108 331 622 ;
+C 42 ; WX 600 ; N asterisk ; B 116 257 484 607 ;
+C 43 ; WX 600 ; N plus ; B 80 44 520 470 ;
+C 44 ; WX 600 ; N comma ; B 181 -112 344 122 ;
+C 45 ; WX 600 ; N hyphen ; B 103 231 497 285 ;
+C 46 ; WX 600 ; N period ; B 229 -15 371 109 ;
+C 47 ; WX 600 ; N slash ; B 125 -80 475 629 ;
+C 48 ; WX 600 ; N zero ; B 106 -15 494 622 ;
+C 49 ; WX 600 ; N one ; B 96 0 505 622 ;
+C 50 ; WX 600 ; N two ; B 70 0 471 622 ;
+C 51 ; WX 600 ; N three ; B 75 -15 466 622 ;
+C 52 ; WX 600 ; N four ; B 78 0 500 622 ;
+C 53 ; WX 600 ; N five ; B 92 -15 497 607 ;
+C 54 ; WX 600 ; N six ; B 111 -15 497 622 ;
+C 55 ; WX 600 ; N seven ; B 82 0 483 607 ;
+C 56 ; WX 600 ; N eight ; B 102 -15 498 622 ;
+C 57 ; WX 600 ; N nine ; B 96 -15 489 622 ;
+C 58 ; WX 600 ; N colon ; B 229 -15 371 385 ;
+C 59 ; WX 600 ; N semicolon ; B 181 -112 371 385 ;
+C 60 ; WX 600 ; N less ; B 41 42 519 472 ;
+C 61 ; WX 600 ; N equal ; B 80 138 520 376 ;
+C 62 ; WX 600 ; N greater ; B 66 42 544 472 ;
+C 63 ; WX 600 ; N question ; B 129 -15 492 572 ;
+C 64 ; WX 600 ; N at ; B 77 -15 533 622 ;
+C 65 ; WX 600 ; N A ; B 3 0 597 562 ;
+C 66 ; WX 600 ; N B ; B 43 0 559 562 ;
+C 67 ; WX 600 ; N C ; B 41 -18 540 580 ;
+C 68 ; WX 600 ; N D ; B 43 0 574 562 ;
+C 69 ; WX 600 ; N E ; B 53 0 550 562 ;
+C 70 ; WX 600 ; N F ; B 53 0 545 562 ;
+C 71 ; WX 600 ; N G ; B 31 -18 575 580 ;
+C 72 ; WX 600 ; N H ; B 32 0 568 562 ;
+C 73 ; WX 600 ; N I ; B 96 0 504 562 ;
+C 74 ; WX 600 ; N J ; B 34 -18 566 562 ;
+C 75 ; WX 600 ; N K ; B 38 0 582 562 ;
+C 76 ; WX 600 ; N L ; B 47 0 554 562 ;
+C 77 ; WX 600 ; N M ; B 4 0 596 562 ;
+C 78 ; WX 600 ; N N ; B 7 -13 593 562 ;
+C 79 ; WX 600 ; N O ; B 43 -18 557 580 ;
+C 80 ; WX 600 ; N P ; B 79 0 558 562 ;
+C 81 ; WX 600 ; N Q ; B 43 -138 557 580 ;
+C 82 ; WX 600 ; N R ; B 38 0 588 562 ;
+C 83 ; WX 600 ; N S ; B 72 -20 529 580 ;
+C 84 ; WX 600 ; N T ; B 38 0 563 562 ;
+C 85 ; WX 600 ; N U ; B 17 -18 583 562 ;
+C 86 ; WX 600 ; N V ; B -4 -13 604 562 ;
+C 87 ; WX 600 ; N W ; B -3 -13 603 562 ;
+C 88 ; WX 600 ; N X ; B 23 0 577 562 ;
+C 89 ; WX 600 ; N Y ; B 24 0 576 562 ;
+C 90 ; WX 600 ; N Z ; B 86 0 514 562 ;
+C 91 ; WX 600 ; N bracketleft ; B 269 -108 442 622 ;
+C 92 ; WX 600 ; N backslash ; B 118 -80 482 629 ;
+C 93 ; WX 600 ; N bracketright ; B 158 -108 331 622 ;
+C 94 ; WX 600 ; N asciicircum ; B 94 354 506 622 ;
+C 95 ; WX 600 ; N underscore ; B 0 -125 600 -75 ;
+C 96 ; WX 600 ; N quoteleft ; B 224 328 387 562 ;
+C 97 ; WX 600 ; N a ; B 53 -15 559 441 ;
+C 98 ; WX 600 ; N b ; B 14 -15 575 629 ;
+C 99 ; WX 600 ; N c ; B 66 -15 529 441 ;
+C 100 ; WX 600 ; N d ; B 45 -15 591 629 ;
+C 101 ; WX 600 ; N e ; B 66 -15 548 441 ;
+C 102 ; WX 600 ; N f ; B 114 0 531 629 ; L i fi ; L l fl ;
+C 103 ; WX 600 ; N g ; B 45 -157 566 441 ;
+C 104 ; WX 600 ; N h ; B 18 0 582 629 ;
+C 105 ; WX 600 ; N i ; B 95 0 505 657 ;
+C 106 ; WX 600 ; N j ; B 82 -157 410 657 ;
+C 107 ; WX 600 ; N k ; B 43 0 580 629 ;
+C 108 ; WX 600 ; N l ; B 95 0 505 629 ;
+C 109 ; WX 600 ; N m ; B -5 0 605 441 ;
+C 110 ; WX 600 ; N n ; B 26 0 575 441 ;
+C 111 ; WX 600 ; N o ; B 62 -15 538 441 ;
+C 112 ; WX 600 ; N p ; B 9 -157 555 441 ;
+C 113 ; WX 600 ; N q ; B 45 -157 591 441 ;
+C 114 ; WX 600 ; N r ; B 60 0 559 441 ;
+C 115 ; WX 600 ; N s ; B 80 -15 513 441 ;
+C 116 ; WX 600 ; N t ; B 87 -15 530 561 ;
+C 117 ; WX 600 ; N u ; B 21 -15 562 426 ;
+C 118 ; WX 600 ; N v ; B 10 -10 590 426 ;
+C 119 ; WX 600 ; N w ; B -4 -10 604 426 ;
+C 120 ; WX 600 ; N x ; B 20 0 580 426 ;
+C 121 ; WX 600 ; N y ; B 7 -157 592 426 ;
+C 122 ; WX 600 ; N z ; B 99 0 502 426 ;
+C 123 ; WX 600 ; N braceleft ; B 182 -108 437 622 ;
+C 124 ; WX 600 ; N bar ; B 275 -250 326 750 ;
+C 125 ; WX 600 ; N braceright ; B 163 -108 418 622 ;
+C 126 ; WX 600 ; N asciitilde ; B 63 197 540 320 ;
+C 161 ; WX 600 ; N exclamdown ; B 236 -157 364 430 ;
+C 162 ; WX 600 ; N cent ; B 96 -49 500 614 ;
+C 163 ; WX 600 ; N sterling ; B 84 -21 521 611 ;
+C 164 ; WX 600 ; N fraction ; B 92 -57 509 665 ;
+C 165 ; WX 600 ; N yen ; B 26 0 574 562 ;
+C 166 ; WX 600 ; N florin ; B 4 -143 539 622 ;
+C 167 ; WX 600 ; N section ; B 113 -78 488 580 ;
+C 168 ; WX 600 ; N currency ; B 73 58 527 506 ;
+C 169 ; WX 600 ; N quotesingle ; B 259 328 341 562 ;
+C 170 ; WX 600 ; N quotedblleft ; B 143 328 471 562 ;
+C 171 ; WX 600 ; N guillemotleft ; B 37 70 563 446 ;
+C 172 ; WX 600 ; N guilsinglleft ; B 149 70 451 446 ;
+C 173 ; WX 600 ; N guilsinglright ; B 149 70 451 446 ;
+C 174 ; WX 600 ; N fi ; B 3 0 597 629 ;
+C 175 ; WX 600 ; N fl ; B 3 0 597 629 ;
+C 177 ; WX 600 ; N endash ; B 75 231 525 285 ;
+C 178 ; WX 600 ; N dagger ; B 141 -78 459 580 ;
+C 179 ; WX 600 ; N daggerdbl ; B 141 -78 459 580 ;
+C 180 ; WX 600 ; N periodcentered ; B 222 189 378 327 ;
+C 182 ; WX 600 ; N paragraph ; B 50 -78 511 562 ;
+C 183 ; WX 600 ; N bullet ; B 172 130 428 383 ;
+C 184 ; WX 600 ; N quotesinglbase ; B 213 -134 376 100 ;
+C 185 ; WX 600 ; N quotedblbase ; B 143 -134 457 100 ;
+C 186 ; WX 600 ; N quotedblright ; B 143 328 457 562 ;
+C 187 ; WX 600 ; N guillemotright ; B 37 70 563 446 ;
+C 188 ; WX 600 ; N ellipsis ; B 37 -15 563 111 ;
+C 189 ; WX 600 ; N perthousand ; B 3 -15 600 622 ;
+C 191 ; WX 600 ; N questiondown ; B 108 -157 471 430 ;
+C 193 ; WX 600 ; N grave ; B 151 497 378 672 ;
+C 194 ; WX 600 ; N acute ; B 242 497 469 672 ;
+C 195 ; WX 600 ; N circumflex ; B 124 477 476 654 ;
+C 196 ; WX 600 ; N tilde ; B 105 489 503 606 ;
+C 197 ; WX 600 ; N macron ; B 120 525 480 565 ;
+C 198 ; WX 600 ; N breve ; B 153 501 447 609 ;
+C 199 ; WX 600 ; N dotaccent ; B 249 537 352 640 ;
+C 200 ; WX 600 ; N dieresis ; B 148 537 453 640 ;
+C 202 ; WX 600 ; N ring ; B 218 463 382 627 ;
+C 203 ; WX 600 ; N cedilla ; B 224 -151 362 10 ;
+C 205 ; WX 600 ; N hungarumlaut ; B 133 497 540 672 ;
+C 206 ; WX 600 ; N ogonek ; B 211 -172 407 4 ;
+C 207 ; WX 600 ; N caron ; B 124 492 476 669 ;
+C 208 ; WX 600 ; N emdash ; B 0 231 600 285 ;
+C 225 ; WX 600 ; N AE ; B 3 0 550 562 ;
+C 227 ; WX 600 ; N ordfeminine ; B 156 249 442 580 ;
+C 232 ; WX 600 ; N Lslash ; B 47 0 554 562 ;
+C 233 ; WX 600 ; N Oslash ; B 43 -80 557 629 ;
+C 234 ; WX 600 ; N OE ; B 7 0 567 562 ;
+C 235 ; WX 600 ; N ordmasculine ; B 157 249 443 580 ;
+C 241 ; WX 600 ; N ae ; B 19 -15 570 441 ;
+C 245 ; WX 600 ; N dotlessi ; B 95 0 505 426 ;
+C 248 ; WX 600 ; N lslash ; B 95 0 505 629 ;
+C 249 ; WX 600 ; N oslash ; B 62 -80 538 506 ;
+C 250 ; WX 600 ; N oe ; B 19 -15 559 441 ;
+C 251 ; WX 600 ; N germandbls ; B 48 -15 588 629 ;
+C -1 ; WX 600 ; N Idieresis ; B 96 0 504 753 ;
+C -1 ; WX 600 ; N eacute ; B 66 -15 548 672 ;
+C -1 ; WX 600 ; N abreve ; B 53 -15 559 609 ;
+C -1 ; WX 600 ; N uhungarumlaut ; B 21 -15 580 672 ;
+C -1 ; WX 600 ; N ecaron ; B 66 -15 548 669 ;
+C -1 ; WX 600 ; N Ydieresis ; B 24 0 576 753 ;
+C -1 ; WX 600 ; N divide ; B 87 48 513 467 ;
+C -1 ; WX 600 ; N Yacute ; B 24 0 576 805 ;
+C -1 ; WX 600 ; N Acircumflex ; B 3 0 597 787 ;
+C -1 ; WX 600 ; N aacute ; B 53 -15 559 672 ;
+C -1 ; WX 600 ; N Ucircumflex ; B 17 -18 583 787 ;
+C -1 ; WX 600 ; N yacute ; B 7 -157 592 672 ;
+C -1 ; WX 600 ; N scommaaccent ; B 80 -250 513 441 ;
+C -1 ; WX 600 ; N ecircumflex ; B 66 -15 548 654 ;
+C -1 ; WX 600 ; N Uring ; B 17 -18 583 760 ;
+C -1 ; WX 600 ; N Udieresis ; B 17 -18 583 753 ;
+C -1 ; WX 600 ; N aogonek ; B 53 -172 587 441 ;
+C -1 ; WX 600 ; N Uacute ; B 17 -18 583 805 ;
+C -1 ; WX 600 ; N uogonek ; B 21 -172 590 426 ;
+C -1 ; WX 600 ; N Edieresis ; B 53 0 550 753 ;
+C -1 ; WX 600 ; N Dcroat ; B 30 0 574 562 ;
+C -1 ; WX 600 ; N commaaccent ; B 198 -250 335 -58 ;
+C -1 ; WX 600 ; N copyright ; B 0 -18 600 580 ;
+C -1 ; WX 600 ; N Emacron ; B 53 0 550 698 ;
+C -1 ; WX 600 ; N ccaron ; B 66 -15 529 669 ;
+C -1 ; WX 600 ; N aring ; B 53 -15 559 627 ;
+C -1 ; WX 600 ; N Ncommaaccent ; B 7 -250 593 562 ;
+C -1 ; WX 600 ; N lacute ; B 95 0 505 805 ;
+C -1 ; WX 600 ; N agrave ; B 53 -15 559 672 ;
+C -1 ; WX 600 ; N Tcommaaccent ; B 38 -250 563 562 ;
+C -1 ; WX 600 ; N Cacute ; B 41 -18 540 805 ;
+C -1 ; WX 600 ; N atilde ; B 53 -15 559 606 ;
+C -1 ; WX 600 ; N Edotaccent ; B 53 0 550 753 ;
+C -1 ; WX 600 ; N scaron ; B 80 -15 513 669 ;
+C -1 ; WX 600 ; N scedilla ; B 80 -151 513 441 ;
+C -1 ; WX 600 ; N iacute ; B 95 0 505 672 ;
+C -1 ; WX 600 ; N lozenge ; B 18 0 443 706 ;
+C -1 ; WX 600 ; N Rcaron ; B 38 0 588 802 ;
+C -1 ; WX 600 ; N Gcommaaccent ; B 31 -250 575 580 ;
+C -1 ; WX 600 ; N ucircumflex ; B 21 -15 562 654 ;
+C -1 ; WX 600 ; N acircumflex ; B 53 -15 559 654 ;
+C -1 ; WX 600 ; N Amacron ; B 3 0 597 698 ;
+C -1 ; WX 600 ; N rcaron ; B 60 0 559 669 ;
+C -1 ; WX 600 ; N ccedilla ; B 66 -151 529 441 ;
+C -1 ; WX 600 ; N Zdotaccent ; B 86 0 514 753 ;
+C -1 ; WX 600 ; N Thorn ; B 79 0 538 562 ;
+C -1 ; WX 600 ; N Omacron ; B 43 -18 557 698 ;
+C -1 ; WX 600 ; N Racute ; B 38 0 588 805 ;
+C -1 ; WX 600 ; N Sacute ; B 72 -20 529 805 ;
+C -1 ; WX 600 ; N dcaron ; B 45 -15 715 629 ;
+C -1 ; WX 600 ; N Umacron ; B 17 -18 583 698 ;
+C -1 ; WX 600 ; N uring ; B 21 -15 562 627 ;
+C -1 ; WX 600 ; N threesuperior ; B 155 240 406 622 ;
+C -1 ; WX 600 ; N Ograve ; B 43 -18 557 805 ;
+C -1 ; WX 600 ; N Agrave ; B 3 0 597 805 ;
+C -1 ; WX 600 ; N Abreve ; B 3 0 597 732 ;
+C -1 ; WX 600 ; N multiply ; B 87 43 515 470 ;
+C -1 ; WX 600 ; N uacute ; B 21 -15 562 672 ;
+C -1 ; WX 600 ; N Tcaron ; B 38 0 563 802 ;
+C -1 ; WX 600 ; N partialdiff ; B 17 -38 459 710 ;
+C -1 ; WX 600 ; N ydieresis ; B 7 -157 592 620 ;
+C -1 ; WX 600 ; N Nacute ; B 7 -13 593 805 ;
+C -1 ; WX 600 ; N icircumflex ; B 94 0 505 654 ;
+C -1 ; WX 600 ; N Ecircumflex ; B 53 0 550 787 ;
+C -1 ; WX 600 ; N adieresis ; B 53 -15 559 620 ;
+C -1 ; WX 600 ; N edieresis ; B 66 -15 548 620 ;
+C -1 ; WX 600 ; N cacute ; B 66 -15 529 672 ;
+C -1 ; WX 600 ; N nacute ; B 26 0 575 672 ;
+C -1 ; WX 600 ; N umacron ; B 21 -15 562 565 ;
+C -1 ; WX 600 ; N Ncaron ; B 7 -13 593 802 ;
+C -1 ; WX 600 ; N Iacute ; B 96 0 504 805 ;
+C -1 ; WX 600 ; N plusminus ; B 87 44 513 558 ;
+C -1 ; WX 600 ; N brokenbar ; B 275 -175 326 675 ;
+C -1 ; WX 600 ; N registered ; B 0 -18 600 580 ;
+C -1 ; WX 600 ; N Gbreve ; B 31 -18 575 732 ;
+C -1 ; WX 600 ; N Idotaccent ; B 96 0 504 753 ;
+C -1 ; WX 600 ; N summation ; B 15 -10 585 706 ;
+C -1 ; WX 600 ; N Egrave ; B 53 0 550 805 ;
+C -1 ; WX 600 ; N racute ; B 60 0 559 672 ;
+C -1 ; WX 600 ; N omacron ; B 62 -15 538 565 ;
+C -1 ; WX 600 ; N Zacute ; B 86 0 514 805 ;
+C -1 ; WX 600 ; N Zcaron ; B 86 0 514 802 ;
+C -1 ; WX 600 ; N greaterequal ; B 98 0 502 710 ;
+C -1 ; WX 600 ; N Eth ; B 30 0 574 562 ;
+C -1 ; WX 600 ; N Ccedilla ; B 41 -151 540 580 ;
+C -1 ; WX 600 ; N lcommaaccent ; B 95 -250 505 629 ;
+C -1 ; WX 600 ; N tcaron ; B 87 -15 530 717 ;
+C -1 ; WX 600 ; N eogonek ; B 66 -172 548 441 ;
+C -1 ; WX 600 ; N Uogonek ; B 17 -172 583 562 ;
+C -1 ; WX 600 ; N Aacute ; B 3 0 597 805 ;
+C -1 ; WX 600 ; N Adieresis ; B 3 0 597 753 ;
+C -1 ; WX 600 ; N egrave ; B 66 -15 548 672 ;
+C -1 ; WX 600 ; N zacute ; B 99 0 502 672 ;
+C -1 ; WX 600 ; N iogonek ; B 95 -172 505 657 ;
+C -1 ; WX 600 ; N Oacute ; B 43 -18 557 805 ;
+C -1 ; WX 600 ; N oacute ; B 62 -15 538 672 ;
+C -1 ; WX 600 ; N amacron ; B 53 -15 559 565 ;
+C -1 ; WX 600 ; N sacute ; B 80 -15 513 672 ;
+C -1 ; WX 600 ; N idieresis ; B 95 0 505 620 ;
+C -1 ; WX 600 ; N Ocircumflex ; B 43 -18 557 787 ;
+C -1 ; WX 600 ; N Ugrave ; B 17 -18 583 805 ;
+C -1 ; WX 600 ; N Delta ; B 6 0 598 688 ;
+C -1 ; WX 600 ; N thorn ; B -6 -157 555 629 ;
+C -1 ; WX 600 ; N twosuperior ; B 177 249 424 622 ;
+C -1 ; WX 600 ; N Odieresis ; B 43 -18 557 753 ;
+C -1 ; WX 600 ; N mu ; B 21 -157 562 426 ;
+C -1 ; WX 600 ; N igrave ; B 95 0 505 672 ;
+C -1 ; WX 600 ; N ohungarumlaut ; B 62 -15 580 672 ;
+C -1 ; WX 600 ; N Eogonek ; B 53 -172 561 562 ;
+C -1 ; WX 600 ; N dcroat ; B 45 -15 591 629 ;
+C -1 ; WX 600 ; N threequarters ; B 8 -56 593 666 ;
+C -1 ; WX 600 ; N Scedilla ; B 72 -151 529 580 ;
+C -1 ; WX 600 ; N lcaron ; B 95 0 533 629 ;
+C -1 ; WX 600 ; N Kcommaaccent ; B 38 -250 582 562 ;
+C -1 ; WX 600 ; N Lacute ; B 47 0 554 805 ;
+C -1 ; WX 600 ; N trademark ; B -23 263 623 562 ;
+C -1 ; WX 600 ; N edotaccent ; B 66 -15 548 620 ;
+C -1 ; WX 600 ; N Igrave ; B 96 0 504 805 ;
+C -1 ; WX 600 ; N Imacron ; B 96 0 504 698 ;
+C -1 ; WX 600 ; N Lcaron ; B 47 0 554 562 ;
+C -1 ; WX 600 ; N onehalf ; B 0 -57 611 665 ;
+C -1 ; WX 600 ; N lessequal ; B 98 0 502 710 ;
+C -1 ; WX 600 ; N ocircumflex ; B 62 -15 538 654 ;
+C -1 ; WX 600 ; N ntilde ; B 26 0 575 606 ;
+C -1 ; WX 600 ; N Uhungarumlaut ; B 17 -18 590 805 ;
+C -1 ; WX 600 ; N Eacute ; B 53 0 550 805 ;
+C -1 ; WX 600 ; N emacron ; B 66 -15 548 565 ;
+C -1 ; WX 600 ; N gbreve ; B 45 -157 566 609 ;
+C -1 ; WX 600 ; N onequarter ; B 0 -57 600 665 ;
+C -1 ; WX 600 ; N Scaron ; B 72 -20 529 802 ;
+C -1 ; WX 600 ; N Scommaaccent ; B 72 -250 529 580 ;
+C -1 ; WX 600 ; N Ohungarumlaut ; B 43 -18 580 805 ;
+C -1 ; WX 600 ; N degree ; B 123 269 477 622 ;
+C -1 ; WX 600 ; N ograve ; B 62 -15 538 672 ;
+C -1 ; WX 600 ; N Ccaron ; B 41 -18 540 802 ;
+C -1 ; WX 600 ; N ugrave ; B 21 -15 562 672 ;
+C -1 ; WX 600 ; N radical ; B 3 -15 597 792 ;
+C -1 ; WX 600 ; N Dcaron ; B 43 0 574 802 ;
+C -1 ; WX 600 ; N rcommaaccent ; B 60 -250 559 441 ;
+C -1 ; WX 600 ; N Ntilde ; B 7 -13 593 729 ;
+C -1 ; WX 600 ; N otilde ; B 62 -15 538 606 ;
+C -1 ; WX 600 ; N Rcommaaccent ; B 38 -250 588 562 ;
+C -1 ; WX 600 ; N Lcommaaccent ; B 47 -250 554 562 ;
+C -1 ; WX 600 ; N Atilde ; B 3 0 597 729 ;
+C -1 ; WX 600 ; N Aogonek ; B 3 -172 608 562 ;
+C -1 ; WX 600 ; N Aring ; B 3 0 597 750 ;
+C -1 ; WX 600 ; N Otilde ; B 43 -18 557 729 ;
+C -1 ; WX 600 ; N zdotaccent ; B 99 0 502 620 ;
+C -1 ; WX 600 ; N Ecaron ; B 53 0 550 802 ;
+C -1 ; WX 600 ; N Iogonek ; B 96 -172 504 562 ;
+C -1 ; WX 600 ; N kcommaaccent ; B 43 -250 580 629 ;
+C -1 ; WX 600 ; N minus ; B 80 232 520 283 ;
+C -1 ; WX 600 ; N Icircumflex ; B 96 0 504 787 ;
+C -1 ; WX 600 ; N ncaron ; B 26 0 575 669 ;
+C -1 ; WX 600 ; N tcommaaccent ; B 87 -250 530 561 ;
+C -1 ; WX 600 ; N logicalnot ; B 87 108 513 369 ;
+C -1 ; WX 600 ; N odieresis ; B 62 -15 538 620 ;
+C -1 ; WX 600 ; N udieresis ; B 21 -15 562 620 ;
+C -1 ; WX 600 ; N notequal ; B 15 -16 540 529 ;
+C -1 ; WX 600 ; N gcommaaccent ; B 45 -157 566 708 ;
+C -1 ; WX 600 ; N eth ; B 62 -15 538 629 ;
+C -1 ; WX 600 ; N zcaron ; B 99 0 502 669 ;
+C -1 ; WX 600 ; N ncommaaccent ; B 26 -250 575 441 ;
+C -1 ; WX 600 ; N onesuperior ; B 172 249 428 622 ;
+C -1 ; WX 600 ; N imacron ; B 95 0 505 565 ;
+C -1 ; WX 600 ; N Euro ; B 0 0 0 0 ;
+EndCharMetrics
+EndFontMetrics
diff --git a/src/main/resources/Resources/afm/Helvetica-Bold.afm b/src/main/resources/Resources/afm/Helvetica-Bold.afm
new file mode 100644
index 0000000..0d41049
--- /dev/null
+++ b/src/main/resources/Resources/afm/Helvetica-Bold.afm
@@ -0,0 +1,2827 @@
+StartFontMetrics 4.1
+Comment Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved.
+Comment Creation Date: Thu May 1 12:43:52 1997
+Comment UniqueID 43052
+Comment VMusage 37169 48194
+FontName Helvetica-Bold
+FullName Helvetica Bold
+FamilyName Helvetica
+Weight Bold
+ItalicAngle 0
+IsFixedPitch false
+CharacterSet ExtendedRoman
+FontBBox -170 -228 1003 962
+UnderlinePosition -100
+UnderlineThickness 50
+Version 002.000
+Notice Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved.Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries.
+EncodingScheme AdobeStandardEncoding
+CapHeight 718
+XHeight 532
+Ascender 718
+Descender -207
+StdHW 118
+StdVW 140
+StartCharMetrics 315
+C 32 ; WX 278 ; N space ; B 0 0 0 0 ;
+C 33 ; WX 333 ; N exclam ; B 90 0 244 718 ;
+C 34 ; WX 474 ; N quotedbl ; B 98 447 376 718 ;
+C 35 ; WX 556 ; N numbersign ; B 18 0 538 698 ;
+C 36 ; WX 556 ; N dollar ; B 30 -115 523 775 ;
+C 37 ; WX 889 ; N percent ; B 28 -19 861 710 ;
+C 38 ; WX 722 ; N ampersand ; B 54 -19 701 718 ;
+C 39 ; WX 278 ; N quoteright ; B 69 445 209 718 ;
+C 40 ; WX 333 ; N parenleft ; B 35 -208 314 734 ;
+C 41 ; WX 333 ; N parenright ; B 19 -208 298 734 ;
+C 42 ; WX 389 ; N asterisk ; B 27 387 362 718 ;
+C 43 ; WX 584 ; N plus ; B 40 0 544 506 ;
+C 44 ; WX 278 ; N comma ; B 64 -168 214 146 ;
+C 45 ; WX 333 ; N hyphen ; B 27 215 306 345 ;
+C 46 ; WX 278 ; N period ; B 64 0 214 146 ;
+C 47 ; WX 278 ; N slash ; B -33 -19 311 737 ;
+C 48 ; WX 556 ; N zero ; B 32 -19 524 710 ;
+C 49 ; WX 556 ; N one ; B 69 0 378 710 ;
+C 50 ; WX 556 ; N two ; B 26 0 511 710 ;
+C 51 ; WX 556 ; N three ; B 27 -19 516 710 ;
+C 52 ; WX 556 ; N four ; B 27 0 526 710 ;
+C 53 ; WX 556 ; N five ; B 27 -19 516 698 ;
+C 54 ; WX 556 ; N six ; B 31 -19 520 710 ;
+C 55 ; WX 556 ; N seven ; B 25 0 528 698 ;
+C 56 ; WX 556 ; N eight ; B 32 -19 524 710 ;
+C 57 ; WX 556 ; N nine ; B 30 -19 522 710 ;
+C 58 ; WX 333 ; N colon ; B 92 0 242 512 ;
+C 59 ; WX 333 ; N semicolon ; B 92 -168 242 512 ;
+C 60 ; WX 584 ; N less ; B 38 -8 546 514 ;
+C 61 ; WX 584 ; N equal ; B 40 87 544 419 ;
+C 62 ; WX 584 ; N greater ; B 38 -8 546 514 ;
+C 63 ; WX 611 ; N question ; B 60 0 556 727 ;
+C 64 ; WX 975 ; N at ; B 118 -19 856 737 ;
+C 65 ; WX 722 ; N A ; B 20 0 702 718 ;
+C 66 ; WX 722 ; N B ; B 76 0 669 718 ;
+C 67 ; WX 722 ; N C ; B 44 -19 684 737 ;
+C 68 ; WX 722 ; N D ; B 76 0 685 718 ;
+C 69 ; WX 667 ; N E ; B 76 0 621 718 ;
+C 70 ; WX 611 ; N F ; B 76 0 587 718 ;
+C 71 ; WX 778 ; N G ; B 44 -19 713 737 ;
+C 72 ; WX 722 ; N H ; B 71 0 651 718 ;
+C 73 ; WX 278 ; N I ; B 64 0 214 718 ;
+C 74 ; WX 556 ; N J ; B 22 -18 484 718 ;
+C 75 ; WX 722 ; N K ; B 87 0 722 718 ;
+C 76 ; WX 611 ; N L ; B 76 0 583 718 ;
+C 77 ; WX 833 ; N M ; B 69 0 765 718 ;
+C 78 ; WX 722 ; N N ; B 69 0 654 718 ;
+C 79 ; WX 778 ; N O ; B 44 -19 734 737 ;
+C 80 ; WX 667 ; N P ; B 76 0 627 718 ;
+C 81 ; WX 778 ; N Q ; B 44 -52 737 737 ;
+C 82 ; WX 722 ; N R ; B 76 0 677 718 ;
+C 83 ; WX 667 ; N S ; B 39 -19 629 737 ;
+C 84 ; WX 611 ; N T ; B 14 0 598 718 ;
+C 85 ; WX 722 ; N U ; B 72 -19 651 718 ;
+C 86 ; WX 667 ; N V ; B 19 0 648 718 ;
+C 87 ; WX 944 ; N W ; B 16 0 929 718 ;
+C 88 ; WX 667 ; N X ; B 14 0 653 718 ;
+C 89 ; WX 667 ; N Y ; B 15 0 653 718 ;
+C 90 ; WX 611 ; N Z ; B 25 0 586 718 ;
+C 91 ; WX 333 ; N bracketleft ; B 63 -196 309 722 ;
+C 92 ; WX 278 ; N backslash ; B -33 -19 311 737 ;
+C 93 ; WX 333 ; N bracketright ; B 24 -196 270 722 ;
+C 94 ; WX 584 ; N asciicircum ; B 62 323 522 698 ;
+C 95 ; WX 556 ; N underscore ; B 0 -125 556 -75 ;
+C 96 ; WX 278 ; N quoteleft ; B 69 454 209 727 ;
+C 97 ; WX 556 ; N a ; B 29 -14 527 546 ;
+C 98 ; WX 611 ; N b ; B 61 -14 578 718 ;
+C 99 ; WX 556 ; N c ; B 34 -14 524 546 ;
+C 100 ; WX 611 ; N d ; B 34 -14 551 718 ;
+C 101 ; WX 556 ; N e ; B 23 -14 528 546 ;
+C 102 ; WX 333 ; N f ; B 10 0 318 727 ; L i fi ; L l fl ;
+C 103 ; WX 611 ; N g ; B 40 -217 553 546 ;
+C 104 ; WX 611 ; N h ; B 65 0 546 718 ;
+C 105 ; WX 278 ; N i ; B 69 0 209 725 ;
+C 106 ; WX 278 ; N j ; B 3 -214 209 725 ;
+C 107 ; WX 556 ; N k ; B 69 0 562 718 ;
+C 108 ; WX 278 ; N l ; B 69 0 209 718 ;
+C 109 ; WX 889 ; N m ; B 64 0 826 546 ;
+C 110 ; WX 611 ; N n ; B 65 0 546 546 ;
+C 111 ; WX 611 ; N o ; B 34 -14 578 546 ;
+C 112 ; WX 611 ; N p ; B 62 -207 578 546 ;
+C 113 ; WX 611 ; N q ; B 34 -207 552 546 ;
+C 114 ; WX 389 ; N r ; B 64 0 373 546 ;
+C 115 ; WX 556 ; N s ; B 30 -14 519 546 ;
+C 116 ; WX 333 ; N t ; B 10 -6 309 676 ;
+C 117 ; WX 611 ; N u ; B 66 -14 545 532 ;
+C 118 ; WX 556 ; N v ; B 13 0 543 532 ;
+C 119 ; WX 778 ; N w ; B 10 0 769 532 ;
+C 120 ; WX 556 ; N x ; B 15 0 541 532 ;
+C 121 ; WX 556 ; N y ; B 10 -214 539 532 ;
+C 122 ; WX 500 ; N z ; B 20 0 480 532 ;
+C 123 ; WX 389 ; N braceleft ; B 48 -196 365 722 ;
+C 124 ; WX 280 ; N bar ; B 84 -225 196 775 ;
+C 125 ; WX 389 ; N braceright ; B 24 -196 341 722 ;
+C 126 ; WX 584 ; N asciitilde ; B 61 163 523 343 ;
+C 161 ; WX 333 ; N exclamdown ; B 90 -186 244 532 ;
+C 162 ; WX 556 ; N cent ; B 34 -118 524 628 ;
+C 163 ; WX 556 ; N sterling ; B 28 -16 541 718 ;
+C 164 ; WX 167 ; N fraction ; B -170 -19 336 710 ;
+C 165 ; WX 556 ; N yen ; B -9 0 565 698 ;
+C 166 ; WX 556 ; N florin ; B -10 -210 516 737 ;
+C 167 ; WX 556 ; N section ; B 34 -184 522 727 ;
+C 168 ; WX 556 ; N currency ; B -3 76 559 636 ;
+C 169 ; WX 238 ; N quotesingle ; B 70 447 168 718 ;
+C 170 ; WX 500 ; N quotedblleft ; B 64 454 436 727 ;
+C 171 ; WX 556 ; N guillemotleft ; B 88 76 468 484 ;
+C 172 ; WX 333 ; N guilsinglleft ; B 83 76 250 484 ;
+C 173 ; WX 333 ; N guilsinglright ; B 83 76 250 484 ;
+C 174 ; WX 611 ; N fi ; B 10 0 542 727 ;
+C 175 ; WX 611 ; N fl ; B 10 0 542 727 ;
+C 177 ; WX 556 ; N endash ; B 0 227 556 333 ;
+C 178 ; WX 556 ; N dagger ; B 36 -171 520 718 ;
+C 179 ; WX 556 ; N daggerdbl ; B 36 -171 520 718 ;
+C 180 ; WX 278 ; N periodcentered ; B 58 172 220 334 ;
+C 182 ; WX 556 ; N paragraph ; B -8 -191 539 700 ;
+C 183 ; WX 350 ; N bullet ; B 10 194 340 524 ;
+C 184 ; WX 278 ; N quotesinglbase ; B 69 -146 209 127 ;
+C 185 ; WX 500 ; N quotedblbase ; B 64 -146 436 127 ;
+C 186 ; WX 500 ; N quotedblright ; B 64 445 436 718 ;
+C 187 ; WX 556 ; N guillemotright ; B 88 76 468 484 ;
+C 188 ; WX 1000 ; N ellipsis ; B 92 0 908 146 ;
+C 189 ; WX 1000 ; N perthousand ; B -3 -19 1003 710 ;
+C 191 ; WX 611 ; N questiondown ; B 55 -195 551 532 ;
+C 193 ; WX 333 ; N grave ; B -23 604 225 750 ;
+C 194 ; WX 333 ; N acute ; B 108 604 356 750 ;
+C 195 ; WX 333 ; N circumflex ; B -10 604 343 750 ;
+C 196 ; WX 333 ; N tilde ; B -17 610 350 737 ;
+C 197 ; WX 333 ; N macron ; B -6 604 339 678 ;
+C 198 ; WX 333 ; N breve ; B -2 604 335 750 ;
+C 199 ; WX 333 ; N dotaccent ; B 104 614 230 729 ;
+C 200 ; WX 333 ; N dieresis ; B 6 614 327 729 ;
+C 202 ; WX 333 ; N ring ; B 59 568 275 776 ;
+C 203 ; WX 333 ; N cedilla ; B 6 -228 245 0 ;
+C 205 ; WX 333 ; N hungarumlaut ; B 9 604 486 750 ;
+C 206 ; WX 333 ; N ogonek ; B 71 -228 304 0 ;
+C 207 ; WX 333 ; N caron ; B -10 604 343 750 ;
+C 208 ; WX 1000 ; N emdash ; B 0 227 1000 333 ;
+C 225 ; WX 1000 ; N AE ; B 5 0 954 718 ;
+C 227 ; WX 370 ; N ordfeminine ; B 22 401 347 737 ;
+C 232 ; WX 611 ; N Lslash ; B -20 0 583 718 ;
+C 233 ; WX 778 ; N Oslash ; B 33 -27 744 745 ;
+C 234 ; WX 1000 ; N OE ; B 37 -19 961 737 ;
+C 235 ; WX 365 ; N ordmasculine ; B 6 401 360 737 ;
+C 241 ; WX 889 ; N ae ; B 29 -14 858 546 ;
+C 245 ; WX 278 ; N dotlessi ; B 69 0 209 532 ;
+C 248 ; WX 278 ; N lslash ; B -18 0 296 718 ;
+C 249 ; WX 611 ; N oslash ; B 22 -29 589 560 ;
+C 250 ; WX 944 ; N oe ; B 34 -14 912 546 ;
+C 251 ; WX 611 ; N germandbls ; B 69 -14 579 731 ;
+C -1 ; WX 278 ; N Idieresis ; B -21 0 300 915 ;
+C -1 ; WX 556 ; N eacute ; B 23 -14 528 750 ;
+C -1 ; WX 556 ; N abreve ; B 29 -14 527 750 ;
+C -1 ; WX 611 ; N uhungarumlaut ; B 66 -14 625 750 ;
+C -1 ; WX 556 ; N ecaron ; B 23 -14 528 750 ;
+C -1 ; WX 667 ; N Ydieresis ; B 15 0 653 915 ;
+C -1 ; WX 584 ; N divide ; B 40 -42 544 548 ;
+C -1 ; WX 667 ; N Yacute ; B 15 0 653 936 ;
+C -1 ; WX 722 ; N Acircumflex ; B 20 0 702 936 ;
+C -1 ; WX 556 ; N aacute ; B 29 -14 527 750 ;
+C -1 ; WX 722 ; N Ucircumflex ; B 72 -19 651 936 ;
+C -1 ; WX 556 ; N yacute ; B 10 -214 539 750 ;
+C -1 ; WX 556 ; N scommaaccent ; B 30 -228 519 546 ;
+C -1 ; WX 556 ; N ecircumflex ; B 23 -14 528 750 ;
+C -1 ; WX 722 ; N Uring ; B 72 -19 651 962 ;
+C -1 ; WX 722 ; N Udieresis ; B 72 -19 651 915 ;
+C -1 ; WX 556 ; N aogonek ; B 29 -224 545 546 ;
+C -1 ; WX 722 ; N Uacute ; B 72 -19 651 936 ;
+C -1 ; WX 611 ; N uogonek ; B 66 -228 545 532 ;
+C -1 ; WX 667 ; N Edieresis ; B 76 0 621 915 ;
+C -1 ; WX 722 ; N Dcroat ; B -5 0 685 718 ;
+C -1 ; WX 250 ; N commaaccent ; B 64 -228 199 -50 ;
+C -1 ; WX 737 ; N copyright ; B -11 -19 749 737 ;
+C -1 ; WX 667 ; N Emacron ; B 76 0 621 864 ;
+C -1 ; WX 556 ; N ccaron ; B 34 -14 524 750 ;
+C -1 ; WX 556 ; N aring ; B 29 -14 527 776 ;
+C -1 ; WX 722 ; N Ncommaaccent ; B 69 -228 654 718 ;
+C -1 ; WX 278 ; N lacute ; B 69 0 329 936 ;
+C -1 ; WX 556 ; N agrave ; B 29 -14 527 750 ;
+C -1 ; WX 611 ; N Tcommaaccent ; B 14 -228 598 718 ;
+C -1 ; WX 722 ; N Cacute ; B 44 -19 684 936 ;
+C -1 ; WX 556 ; N atilde ; B 29 -14 527 737 ;
+C -1 ; WX 667 ; N Edotaccent ; B 76 0 621 915 ;
+C -1 ; WX 556 ; N scaron ; B 30 -14 519 750 ;
+C -1 ; WX 556 ; N scedilla ; B 30 -228 519 546 ;
+C -1 ; WX 278 ; N iacute ; B 69 0 329 750 ;
+C -1 ; WX 494 ; N lozenge ; B 10 0 484 745 ;
+C -1 ; WX 722 ; N Rcaron ; B 76 0 677 936 ;
+C -1 ; WX 778 ; N Gcommaaccent ; B 44 -228 713 737 ;
+C -1 ; WX 611 ; N ucircumflex ; B 66 -14 545 750 ;
+C -1 ; WX 556 ; N acircumflex ; B 29 -14 527 750 ;
+C -1 ; WX 722 ; N Amacron ; B 20 0 702 864 ;
+C -1 ; WX 389 ; N rcaron ; B 18 0 373 750 ;
+C -1 ; WX 556 ; N ccedilla ; B 34 -228 524 546 ;
+C -1 ; WX 611 ; N Zdotaccent ; B 25 0 586 915 ;
+C -1 ; WX 667 ; N Thorn ; B 76 0 627 718 ;
+C -1 ; WX 778 ; N Omacron ; B 44 -19 734 864 ;
+C -1 ; WX 722 ; N Racute ; B 76 0 677 936 ;
+C -1 ; WX 667 ; N Sacute ; B 39 -19 629 936 ;
+C -1 ; WX 743 ; N dcaron ; B 34 -14 750 718 ;
+C -1 ; WX 722 ; N Umacron ; B 72 -19 651 864 ;
+C -1 ; WX 611 ; N uring ; B 66 -14 545 776 ;
+C -1 ; WX 333 ; N threesuperior ; B 8 271 326 710 ;
+C -1 ; WX 778 ; N Ograve ; B 44 -19 734 936 ;
+C -1 ; WX 722 ; N Agrave ; B 20 0 702 936 ;
+C -1 ; WX 722 ; N Abreve ; B 20 0 702 936 ;
+C -1 ; WX 584 ; N multiply ; B 40 1 545 505 ;
+C -1 ; WX 611 ; N uacute ; B 66 -14 545 750 ;
+C -1 ; WX 611 ; N Tcaron ; B 14 0 598 936 ;
+C -1 ; WX 494 ; N partialdiff ; B 11 -21 494 750 ;
+C -1 ; WX 556 ; N ydieresis ; B 10 -214 539 729 ;
+C -1 ; WX 722 ; N Nacute ; B 69 0 654 936 ;
+C -1 ; WX 278 ; N icircumflex ; B -37 0 316 750 ;
+C -1 ; WX 667 ; N Ecircumflex ; B 76 0 621 936 ;
+C -1 ; WX 556 ; N adieresis ; B 29 -14 527 729 ;
+C -1 ; WX 556 ; N edieresis ; B 23 -14 528 729 ;
+C -1 ; WX 556 ; N cacute ; B 34 -14 524 750 ;
+C -1 ; WX 611 ; N nacute ; B 65 0 546 750 ;
+C -1 ; WX 611 ; N umacron ; B 66 -14 545 678 ;
+C -1 ; WX 722 ; N Ncaron ; B 69 0 654 936 ;
+C -1 ; WX 278 ; N Iacute ; B 64 0 329 936 ;
+C -1 ; WX 584 ; N plusminus ; B 40 0 544 506 ;
+C -1 ; WX 280 ; N brokenbar ; B 84 -150 196 700 ;
+C -1 ; WX 737 ; N registered ; B -11 -19 748 737 ;
+C -1 ; WX 778 ; N Gbreve ; B 44 -19 713 936 ;
+C -1 ; WX 278 ; N Idotaccent ; B 64 0 214 915 ;
+C -1 ; WX 600 ; N summation ; B 14 -10 585 706 ;
+C -1 ; WX 667 ; N Egrave ; B 76 0 621 936 ;
+C -1 ; WX 389 ; N racute ; B 64 0 384 750 ;
+C -1 ; WX 611 ; N omacron ; B 34 -14 578 678 ;
+C -1 ; WX 611 ; N Zacute ; B 25 0 586 936 ;
+C -1 ; WX 611 ; N Zcaron ; B 25 0 586 936 ;
+C -1 ; WX 549 ; N greaterequal ; B 26 0 523 704 ;
+C -1 ; WX 722 ; N Eth ; B -5 0 685 718 ;
+C -1 ; WX 722 ; N Ccedilla ; B 44 -228 684 737 ;
+C -1 ; WX 278 ; N lcommaaccent ; B 69 -228 213 718 ;
+C -1 ; WX 389 ; N tcaron ; B 10 -6 421 878 ;
+C -1 ; WX 556 ; N eogonek ; B 23 -228 528 546 ;
+C -1 ; WX 722 ; N Uogonek ; B 72 -228 651 718 ;
+C -1 ; WX 722 ; N Aacute ; B 20 0 702 936 ;
+C -1 ; WX 722 ; N Adieresis ; B 20 0 702 915 ;
+C -1 ; WX 556 ; N egrave ; B 23 -14 528 750 ;
+C -1 ; WX 500 ; N zacute ; B 20 0 480 750 ;
+C -1 ; WX 278 ; N iogonek ; B 16 -224 249 725 ;
+C -1 ; WX 778 ; N Oacute ; B 44 -19 734 936 ;
+C -1 ; WX 611 ; N oacute ; B 34 -14 578 750 ;
+C -1 ; WX 556 ; N amacron ; B 29 -14 527 678 ;
+C -1 ; WX 556 ; N sacute ; B 30 -14 519 750 ;
+C -1 ; WX 278 ; N idieresis ; B -21 0 300 729 ;
+C -1 ; WX 778 ; N Ocircumflex ; B 44 -19 734 936 ;
+C -1 ; WX 722 ; N Ugrave ; B 72 -19 651 936 ;
+C -1 ; WX 612 ; N Delta ; B 6 0 608 688 ;
+C -1 ; WX 611 ; N thorn ; B 62 -208 578 718 ;
+C -1 ; WX 333 ; N twosuperior ; B 9 283 324 710 ;
+C -1 ; WX 778 ; N Odieresis ; B 44 -19 734 915 ;
+C -1 ; WX 611 ; N mu ; B 66 -207 545 532 ;
+C -1 ; WX 278 ; N igrave ; B -50 0 209 750 ;
+C -1 ; WX 611 ; N ohungarumlaut ; B 34 -14 625 750 ;
+C -1 ; WX 667 ; N Eogonek ; B 76 -224 639 718 ;
+C -1 ; WX 611 ; N dcroat ; B 34 -14 650 718 ;
+C -1 ; WX 834 ; N threequarters ; B 16 -19 799 710 ;
+C -1 ; WX 667 ; N Scedilla ; B 39 -228 629 737 ;
+C -1 ; WX 400 ; N lcaron ; B 69 0 408 718 ;
+C -1 ; WX 722 ; N Kcommaaccent ; B 87 -228 722 718 ;
+C -1 ; WX 611 ; N Lacute ; B 76 0 583 936 ;
+C -1 ; WX 1000 ; N trademark ; B 44 306 956 718 ;
+C -1 ; WX 556 ; N edotaccent ; B 23 -14 528 729 ;
+C -1 ; WX 278 ; N Igrave ; B -50 0 214 936 ;
+C -1 ; WX 278 ; N Imacron ; B -33 0 312 864 ;
+C -1 ; WX 611 ; N Lcaron ; B 76 0 583 718 ;
+C -1 ; WX 834 ; N onehalf ; B 26 -19 794 710 ;
+C -1 ; WX 549 ; N lessequal ; B 29 0 526 704 ;
+C -1 ; WX 611 ; N ocircumflex ; B 34 -14 578 750 ;
+C -1 ; WX 611 ; N ntilde ; B 65 0 546 737 ;
+C -1 ; WX 722 ; N Uhungarumlaut ; B 72 -19 681 936 ;
+C -1 ; WX 667 ; N Eacute ; B 76 0 621 936 ;
+C -1 ; WX 556 ; N emacron ; B 23 -14 528 678 ;
+C -1 ; WX 611 ; N gbreve ; B 40 -217 553 750 ;
+C -1 ; WX 834 ; N onequarter ; B 26 -19 766 710 ;
+C -1 ; WX 667 ; N Scaron ; B 39 -19 629 936 ;
+C -1 ; WX 667 ; N Scommaaccent ; B 39 -228 629 737 ;
+C -1 ; WX 778 ; N Ohungarumlaut ; B 44 -19 734 936 ;
+C -1 ; WX 400 ; N degree ; B 57 426 343 712 ;
+C -1 ; WX 611 ; N ograve ; B 34 -14 578 750 ;
+C -1 ; WX 722 ; N Ccaron ; B 44 -19 684 936 ;
+C -1 ; WX 611 ; N ugrave ; B 66 -14 545 750 ;
+C -1 ; WX 549 ; N radical ; B 10 -46 512 850 ;
+C -1 ; WX 722 ; N Dcaron ; B 76 0 685 936 ;
+C -1 ; WX 389 ; N rcommaaccent ; B 64 -228 373 546 ;
+C -1 ; WX 722 ; N Ntilde ; B 69 0 654 923 ;
+C -1 ; WX 611 ; N otilde ; B 34 -14 578 737 ;
+C -1 ; WX 722 ; N Rcommaaccent ; B 76 -228 677 718 ;
+C -1 ; WX 611 ; N Lcommaaccent ; B 76 -228 583 718 ;
+C -1 ; WX 722 ; N Atilde ; B 20 0 702 923 ;
+C -1 ; WX 722 ; N Aogonek ; B 20 -224 742 718 ;
+C -1 ; WX 722 ; N Aring ; B 20 0 702 962 ;
+C -1 ; WX 778 ; N Otilde ; B 44 -19 734 923 ;
+C -1 ; WX 500 ; N zdotaccent ; B 20 0 480 729 ;
+C -1 ; WX 667 ; N Ecaron ; B 76 0 621 936 ;
+C -1 ; WX 278 ; N Iogonek ; B -11 -228 222 718 ;
+C -1 ; WX 556 ; N kcommaaccent ; B 69 -228 562 718 ;
+C -1 ; WX 584 ; N minus ; B 40 197 544 309 ;
+C -1 ; WX 278 ; N Icircumflex ; B -37 0 316 936 ;
+C -1 ; WX 611 ; N ncaron ; B 65 0 546 750 ;
+C -1 ; WX 333 ; N tcommaaccent ; B 10 -228 309 676 ;
+C -1 ; WX 584 ; N logicalnot ; B 40 108 544 419 ;
+C -1 ; WX 611 ; N odieresis ; B 34 -14 578 729 ;
+C -1 ; WX 611 ; N udieresis ; B 66 -14 545 729 ;
+C -1 ; WX 549 ; N notequal ; B 15 -49 540 570 ;
+C -1 ; WX 611 ; N gcommaaccent ; B 40 -217 553 850 ;
+C -1 ; WX 611 ; N eth ; B 34 -14 578 737 ;
+C -1 ; WX 500 ; N zcaron ; B 20 0 480 750 ;
+C -1 ; WX 611 ; N ncommaaccent ; B 65 -228 546 546 ;
+C -1 ; WX 333 ; N onesuperior ; B 26 283 237 710 ;
+C -1 ; WX 278 ; N imacron ; B -8 0 285 678 ;
+C -1 ; WX 556 ; N Euro ; B 0 0 0 0 ;
+EndCharMetrics
+StartKernData
+StartKernPairs 2481
+KPX A C -40
+KPX A Cacute -40
+KPX A Ccaron -40
+KPX A Ccedilla -40
+KPX A G -50
+KPX A Gbreve -50
+KPX A Gcommaaccent -50
+KPX A O -40
+KPX A Oacute -40
+KPX A Ocircumflex -40
+KPX A Odieresis -40
+KPX A Ograve -40
+KPX A Ohungarumlaut -40
+KPX A Omacron -40
+KPX A Oslash -40
+KPX A Otilde -40
+KPX A Q -40
+KPX A T -90
+KPX A Tcaron -90
+KPX A Tcommaaccent -90
+KPX A U -50
+KPX A Uacute -50
+KPX A Ucircumflex -50
+KPX A Udieresis -50
+KPX A Ugrave -50
+KPX A Uhungarumlaut -50
+KPX A Umacron -50
+KPX A Uogonek -50
+KPX A Uring -50
+KPX A V -80
+KPX A W -60
+KPX A Y -110
+KPX A Yacute -110
+KPX A Ydieresis -110
+KPX A u -30
+KPX A uacute -30
+KPX A ucircumflex -30
+KPX A udieresis -30
+KPX A ugrave -30
+KPX A uhungarumlaut -30
+KPX A umacron -30
+KPX A uogonek -30
+KPX A uring -30
+KPX A v -40
+KPX A w -30
+KPX A y -30
+KPX A yacute -30
+KPX A ydieresis -30
+KPX Aacute C -40
+KPX Aacute Cacute -40
+KPX Aacute Ccaron -40
+KPX Aacute Ccedilla -40
+KPX Aacute G -50
+KPX Aacute Gbreve -50
+KPX Aacute Gcommaaccent -50
+KPX Aacute O -40
+KPX Aacute Oacute -40
+KPX Aacute Ocircumflex -40
+KPX Aacute Odieresis -40
+KPX Aacute Ograve -40
+KPX Aacute Ohungarumlaut -40
+KPX Aacute Omacron -40
+KPX Aacute Oslash -40
+KPX Aacute Otilde -40
+KPX Aacute Q -40
+KPX Aacute T -90
+KPX Aacute Tcaron -90
+KPX Aacute Tcommaaccent -90
+KPX Aacute U -50
+KPX Aacute Uacute -50
+KPX Aacute Ucircumflex -50
+KPX Aacute Udieresis -50
+KPX Aacute Ugrave -50
+KPX Aacute Uhungarumlaut -50
+KPX Aacute Umacron -50
+KPX Aacute Uogonek -50
+KPX Aacute Uring -50
+KPX Aacute V -80
+KPX Aacute W -60
+KPX Aacute Y -110
+KPX Aacute Yacute -110
+KPX Aacute Ydieresis -110
+KPX Aacute u -30
+KPX Aacute uacute -30
+KPX Aacute ucircumflex -30
+KPX Aacute udieresis -30
+KPX Aacute ugrave -30
+KPX Aacute uhungarumlaut -30
+KPX Aacute umacron -30
+KPX Aacute uogonek -30
+KPX Aacute uring -30
+KPX Aacute v -40
+KPX Aacute w -30
+KPX Aacute y -30
+KPX Aacute yacute -30
+KPX Aacute ydieresis -30
+KPX Abreve C -40
+KPX Abreve Cacute -40
+KPX Abreve Ccaron -40
+KPX Abreve Ccedilla -40
+KPX Abreve G -50
+KPX Abreve Gbreve -50
+KPX Abreve Gcommaaccent -50
+KPX Abreve O -40
+KPX Abreve Oacute -40
+KPX Abreve Ocircumflex -40
+KPX Abreve Odieresis -40
+KPX Abreve Ograve -40
+KPX Abreve Ohungarumlaut -40
+KPX Abreve Omacron -40
+KPX Abreve Oslash -40
+KPX Abreve Otilde -40
+KPX Abreve Q -40
+KPX Abreve T -90
+KPX Abreve Tcaron -90
+KPX Abreve Tcommaaccent -90
+KPX Abreve U -50
+KPX Abreve Uacute -50
+KPX Abreve Ucircumflex -50
+KPX Abreve Udieresis -50
+KPX Abreve Ugrave -50
+KPX Abreve Uhungarumlaut -50
+KPX Abreve Umacron -50
+KPX Abreve Uogonek -50
+KPX Abreve Uring -50
+KPX Abreve V -80
+KPX Abreve W -60
+KPX Abreve Y -110
+KPX Abreve Yacute -110
+KPX Abreve Ydieresis -110
+KPX Abreve u -30
+KPX Abreve uacute -30
+KPX Abreve ucircumflex -30
+KPX Abreve udieresis -30
+KPX Abreve ugrave -30
+KPX Abreve uhungarumlaut -30
+KPX Abreve umacron -30
+KPX Abreve uogonek -30
+KPX Abreve uring -30
+KPX Abreve v -40
+KPX Abreve w -30
+KPX Abreve y -30
+KPX Abreve yacute -30
+KPX Abreve ydieresis -30
+KPX Acircumflex C -40
+KPX Acircumflex Cacute -40
+KPX Acircumflex Ccaron -40
+KPX Acircumflex Ccedilla -40
+KPX Acircumflex G -50
+KPX Acircumflex Gbreve -50
+KPX Acircumflex Gcommaaccent -50
+KPX Acircumflex O -40
+KPX Acircumflex Oacute -40
+KPX Acircumflex Ocircumflex -40
+KPX Acircumflex Odieresis -40
+KPX Acircumflex Ograve -40
+KPX Acircumflex Ohungarumlaut -40
+KPX Acircumflex Omacron -40
+KPX Acircumflex Oslash -40
+KPX Acircumflex Otilde -40
+KPX Acircumflex Q -40
+KPX Acircumflex T -90
+KPX Acircumflex Tcaron -90
+KPX Acircumflex Tcommaaccent -90
+KPX Acircumflex U -50
+KPX Acircumflex Uacute -50
+KPX Acircumflex Ucircumflex -50
+KPX Acircumflex Udieresis -50
+KPX Acircumflex Ugrave -50
+KPX Acircumflex Uhungarumlaut -50
+KPX Acircumflex Umacron -50
+KPX Acircumflex Uogonek -50
+KPX Acircumflex Uring -50
+KPX Acircumflex V -80
+KPX Acircumflex W -60
+KPX Acircumflex Y -110
+KPX Acircumflex Yacute -110
+KPX Acircumflex Ydieresis -110
+KPX Acircumflex u -30
+KPX Acircumflex uacute -30
+KPX Acircumflex ucircumflex -30
+KPX Acircumflex udieresis -30
+KPX Acircumflex ugrave -30
+KPX Acircumflex uhungarumlaut -30
+KPX Acircumflex umacron -30
+KPX Acircumflex uogonek -30
+KPX Acircumflex uring -30
+KPX Acircumflex v -40
+KPX Acircumflex w -30
+KPX Acircumflex y -30
+KPX Acircumflex yacute -30
+KPX Acircumflex ydieresis -30
+KPX Adieresis C -40
+KPX Adieresis Cacute -40
+KPX Adieresis Ccaron -40
+KPX Adieresis Ccedilla -40
+KPX Adieresis G -50
+KPX Adieresis Gbreve -50
+KPX Adieresis Gcommaaccent -50
+KPX Adieresis O -40
+KPX Adieresis Oacute -40
+KPX Adieresis Ocircumflex -40
+KPX Adieresis Odieresis -40
+KPX Adieresis Ograve -40
+KPX Adieresis Ohungarumlaut -40
+KPX Adieresis Omacron -40
+KPX Adieresis Oslash -40
+KPX Adieresis Otilde -40
+KPX Adieresis Q -40
+KPX Adieresis T -90
+KPX Adieresis Tcaron -90
+KPX Adieresis Tcommaaccent -90
+KPX Adieresis U -50
+KPX Adieresis Uacute -50
+KPX Adieresis Ucircumflex -50
+KPX Adieresis Udieresis -50
+KPX Adieresis Ugrave -50
+KPX Adieresis Uhungarumlaut -50
+KPX Adieresis Umacron -50
+KPX Adieresis Uogonek -50
+KPX Adieresis Uring -50
+KPX Adieresis V -80
+KPX Adieresis W -60
+KPX Adieresis Y -110
+KPX Adieresis Yacute -110
+KPX Adieresis Ydieresis -110
+KPX Adieresis u -30
+KPX Adieresis uacute -30
+KPX Adieresis ucircumflex -30
+KPX Adieresis udieresis -30
+KPX Adieresis ugrave -30
+KPX Adieresis uhungarumlaut -30
+KPX Adieresis umacron -30
+KPX Adieresis uogonek -30
+KPX Adieresis uring -30
+KPX Adieresis v -40
+KPX Adieresis w -30
+KPX Adieresis y -30
+KPX Adieresis yacute -30
+KPX Adieresis ydieresis -30
+KPX Agrave C -40
+KPX Agrave Cacute -40
+KPX Agrave Ccaron -40
+KPX Agrave Ccedilla -40
+KPX Agrave G -50
+KPX Agrave Gbreve -50
+KPX Agrave Gcommaaccent -50
+KPX Agrave O -40
+KPX Agrave Oacute -40
+KPX Agrave Ocircumflex -40
+KPX Agrave Odieresis -40
+KPX Agrave Ograve -40
+KPX Agrave Ohungarumlaut -40
+KPX Agrave Omacron -40
+KPX Agrave Oslash -40
+KPX Agrave Otilde -40
+KPX Agrave Q -40
+KPX Agrave T -90
+KPX Agrave Tcaron -90
+KPX Agrave Tcommaaccent -90
+KPX Agrave U -50
+KPX Agrave Uacute -50
+KPX Agrave Ucircumflex -50
+KPX Agrave Udieresis -50
+KPX Agrave Ugrave -50
+KPX Agrave Uhungarumlaut -50
+KPX Agrave Umacron -50
+KPX Agrave Uogonek -50
+KPX Agrave Uring -50
+KPX Agrave V -80
+KPX Agrave W -60
+KPX Agrave Y -110
+KPX Agrave Yacute -110
+KPX Agrave Ydieresis -110
+KPX Agrave u -30
+KPX Agrave uacute -30
+KPX Agrave ucircumflex -30
+KPX Agrave udieresis -30
+KPX Agrave ugrave -30
+KPX Agrave uhungarumlaut -30
+KPX Agrave umacron -30
+KPX Agrave uogonek -30
+KPX Agrave uring -30
+KPX Agrave v -40
+KPX Agrave w -30
+KPX Agrave y -30
+KPX Agrave yacute -30
+KPX Agrave ydieresis -30
+KPX Amacron C -40
+KPX Amacron Cacute -40
+KPX Amacron Ccaron -40
+KPX Amacron Ccedilla -40
+KPX Amacron G -50
+KPX Amacron Gbreve -50
+KPX Amacron Gcommaaccent -50
+KPX Amacron O -40
+KPX Amacron Oacute -40
+KPX Amacron Ocircumflex -40
+KPX Amacron Odieresis -40
+KPX Amacron Ograve -40
+KPX Amacron Ohungarumlaut -40
+KPX Amacron Omacron -40
+KPX Amacron Oslash -40
+KPX Amacron Otilde -40
+KPX Amacron Q -40
+KPX Amacron T -90
+KPX Amacron Tcaron -90
+KPX Amacron Tcommaaccent -90
+KPX Amacron U -50
+KPX Amacron Uacute -50
+KPX Amacron Ucircumflex -50
+KPX Amacron Udieresis -50
+KPX Amacron Ugrave -50
+KPX Amacron Uhungarumlaut -50
+KPX Amacron Umacron -50
+KPX Amacron Uogonek -50
+KPX Amacron Uring -50
+KPX Amacron V -80
+KPX Amacron W -60
+KPX Amacron Y -110
+KPX Amacron Yacute -110
+KPX Amacron Ydieresis -110
+KPX Amacron u -30
+KPX Amacron uacute -30
+KPX Amacron ucircumflex -30
+KPX Amacron udieresis -30
+KPX Amacron ugrave -30
+KPX Amacron uhungarumlaut -30
+KPX Amacron umacron -30
+KPX Amacron uogonek -30
+KPX Amacron uring -30
+KPX Amacron v -40
+KPX Amacron w -30
+KPX Amacron y -30
+KPX Amacron yacute -30
+KPX Amacron ydieresis -30
+KPX Aogonek C -40
+KPX Aogonek Cacute -40
+KPX Aogonek Ccaron -40
+KPX Aogonek Ccedilla -40
+KPX Aogonek G -50
+KPX Aogonek Gbreve -50
+KPX Aogonek Gcommaaccent -50
+KPX Aogonek O -40
+KPX Aogonek Oacute -40
+KPX Aogonek Ocircumflex -40
+KPX Aogonek Odieresis -40
+KPX Aogonek Ograve -40
+KPX Aogonek Ohungarumlaut -40
+KPX Aogonek Omacron -40
+KPX Aogonek Oslash -40
+KPX Aogonek Otilde -40
+KPX Aogonek Q -40
+KPX Aogonek T -90
+KPX Aogonek Tcaron -90
+KPX Aogonek Tcommaaccent -90
+KPX Aogonek U -50
+KPX Aogonek Uacute -50
+KPX Aogonek Ucircumflex -50
+KPX Aogonek Udieresis -50
+KPX Aogonek Ugrave -50
+KPX Aogonek Uhungarumlaut -50
+KPX Aogonek Umacron -50
+KPX Aogonek Uogonek -50
+KPX Aogonek Uring -50
+KPX Aogonek V -80
+KPX Aogonek W -60
+KPX Aogonek Y -110
+KPX Aogonek Yacute -110
+KPX Aogonek Ydieresis -110
+KPX Aogonek u -30
+KPX Aogonek uacute -30
+KPX Aogonek ucircumflex -30
+KPX Aogonek udieresis -30
+KPX Aogonek ugrave -30
+KPX Aogonek uhungarumlaut -30
+KPX Aogonek umacron -30
+KPX Aogonek uogonek -30
+KPX Aogonek uring -30
+KPX Aogonek v -40
+KPX Aogonek w -30
+KPX Aogonek y -30
+KPX Aogonek yacute -30
+KPX Aogonek ydieresis -30
+KPX Aring C -40
+KPX Aring Cacute -40
+KPX Aring Ccaron -40
+KPX Aring Ccedilla -40
+KPX Aring G -50
+KPX Aring Gbreve -50
+KPX Aring Gcommaaccent -50
+KPX Aring O -40
+KPX Aring Oacute -40
+KPX Aring Ocircumflex -40
+KPX Aring Odieresis -40
+KPX Aring Ograve -40
+KPX Aring Ohungarumlaut -40
+KPX Aring Omacron -40
+KPX Aring Oslash -40
+KPX Aring Otilde -40
+KPX Aring Q -40
+KPX Aring T -90
+KPX Aring Tcaron -90
+KPX Aring Tcommaaccent -90
+KPX Aring U -50
+KPX Aring Uacute -50
+KPX Aring Ucircumflex -50
+KPX Aring Udieresis -50
+KPX Aring Ugrave -50
+KPX Aring Uhungarumlaut -50
+KPX Aring Umacron -50
+KPX Aring Uogonek -50
+KPX Aring Uring -50
+KPX Aring V -80
+KPX Aring W -60
+KPX Aring Y -110
+KPX Aring Yacute -110
+KPX Aring Ydieresis -110
+KPX Aring u -30
+KPX Aring uacute -30
+KPX Aring ucircumflex -30
+KPX Aring udieresis -30
+KPX Aring ugrave -30
+KPX Aring uhungarumlaut -30
+KPX Aring umacron -30
+KPX Aring uogonek -30
+KPX Aring uring -30
+KPX Aring v -40
+KPX Aring w -30
+KPX Aring y -30
+KPX Aring yacute -30
+KPX Aring ydieresis -30
+KPX Atilde C -40
+KPX Atilde Cacute -40
+KPX Atilde Ccaron -40
+KPX Atilde Ccedilla -40
+KPX Atilde G -50
+KPX Atilde Gbreve -50
+KPX Atilde Gcommaaccent -50
+KPX Atilde O -40
+KPX Atilde Oacute -40
+KPX Atilde Ocircumflex -40
+KPX Atilde Odieresis -40
+KPX Atilde Ograve -40
+KPX Atilde Ohungarumlaut -40
+KPX Atilde Omacron -40
+KPX Atilde Oslash -40
+KPX Atilde Otilde -40
+KPX Atilde Q -40
+KPX Atilde T -90
+KPX Atilde Tcaron -90
+KPX Atilde Tcommaaccent -90
+KPX Atilde U -50
+KPX Atilde Uacute -50
+KPX Atilde Ucircumflex -50
+KPX Atilde Udieresis -50
+KPX Atilde Ugrave -50
+KPX Atilde Uhungarumlaut -50
+KPX Atilde Umacron -50
+KPX Atilde Uogonek -50
+KPX Atilde Uring -50
+KPX Atilde V -80
+KPX Atilde W -60
+KPX Atilde Y -110
+KPX Atilde Yacute -110
+KPX Atilde Ydieresis -110
+KPX Atilde u -30
+KPX Atilde uacute -30
+KPX Atilde ucircumflex -30
+KPX Atilde udieresis -30
+KPX Atilde ugrave -30
+KPX Atilde uhungarumlaut -30
+KPX Atilde umacron -30
+KPX Atilde uogonek -30
+KPX Atilde uring -30
+KPX Atilde v -40
+KPX Atilde w -30
+KPX Atilde y -30
+KPX Atilde yacute -30
+KPX Atilde ydieresis -30
+KPX B A -30
+KPX B Aacute -30
+KPX B Abreve -30
+KPX B Acircumflex -30
+KPX B Adieresis -30
+KPX B Agrave -30
+KPX B Amacron -30
+KPX B Aogonek -30
+KPX B Aring -30
+KPX B Atilde -30
+KPX B U -10
+KPX B Uacute -10
+KPX B Ucircumflex -10
+KPX B Udieresis -10
+KPX B Ugrave -10
+KPX B Uhungarumlaut -10
+KPX B Umacron -10
+KPX B Uogonek -10
+KPX B Uring -10
+KPX D A -40
+KPX D Aacute -40
+KPX D Abreve -40
+KPX D Acircumflex -40
+KPX D Adieresis -40
+KPX D Agrave -40
+KPX D Amacron -40
+KPX D Aogonek -40
+KPX D Aring -40
+KPX D Atilde -40
+KPX D V -40
+KPX D W -40
+KPX D Y -70
+KPX D Yacute -70
+KPX D Ydieresis -70
+KPX D comma -30
+KPX D period -30
+KPX Dcaron A -40
+KPX Dcaron Aacute -40
+KPX Dcaron Abreve -40
+KPX Dcaron Acircumflex -40
+KPX Dcaron Adieresis -40
+KPX Dcaron Agrave -40
+KPX Dcaron Amacron -40
+KPX Dcaron Aogonek -40
+KPX Dcaron Aring -40
+KPX Dcaron Atilde -40
+KPX Dcaron V -40
+KPX Dcaron W -40
+KPX Dcaron Y -70
+KPX Dcaron Yacute -70
+KPX Dcaron Ydieresis -70
+KPX Dcaron comma -30
+KPX Dcaron period -30
+KPX Dcroat A -40
+KPX Dcroat Aacute -40
+KPX Dcroat Abreve -40
+KPX Dcroat Acircumflex -40
+KPX Dcroat Adieresis -40
+KPX Dcroat Agrave -40
+KPX Dcroat Amacron -40
+KPX Dcroat Aogonek -40
+KPX Dcroat Aring -40
+KPX Dcroat Atilde -40
+KPX Dcroat V -40
+KPX Dcroat W -40
+KPX Dcroat Y -70
+KPX Dcroat Yacute -70
+KPX Dcroat Ydieresis -70
+KPX Dcroat comma -30
+KPX Dcroat period -30
+KPX F A -80
+KPX F Aacute -80
+KPX F Abreve -80
+KPX F Acircumflex -80
+KPX F Adieresis -80
+KPX F Agrave -80
+KPX F Amacron -80
+KPX F Aogonek -80
+KPX F Aring -80
+KPX F Atilde -80
+KPX F a -20
+KPX F aacute -20
+KPX F abreve -20
+KPX F acircumflex -20
+KPX F adieresis -20
+KPX F agrave -20
+KPX F amacron -20
+KPX F aogonek -20
+KPX F aring -20
+KPX F atilde -20
+KPX F comma -100
+KPX F period -100
+KPX J A -20
+KPX J Aacute -20
+KPX J Abreve -20
+KPX J Acircumflex -20
+KPX J Adieresis -20
+KPX J Agrave -20
+KPX J Amacron -20
+KPX J Aogonek -20
+KPX J Aring -20
+KPX J Atilde -20
+KPX J comma -20
+KPX J period -20
+KPX J u -20
+KPX J uacute -20
+KPX J ucircumflex -20
+KPX J udieresis -20
+KPX J ugrave -20
+KPX J uhungarumlaut -20
+KPX J umacron -20
+KPX J uogonek -20
+KPX J uring -20
+KPX K O -30
+KPX K Oacute -30
+KPX K Ocircumflex -30
+KPX K Odieresis -30
+KPX K Ograve -30
+KPX K Ohungarumlaut -30
+KPX K Omacron -30
+KPX K Oslash -30
+KPX K Otilde -30
+KPX K e -15
+KPX K eacute -15
+KPX K ecaron -15
+KPX K ecircumflex -15
+KPX K edieresis -15
+KPX K edotaccent -15
+KPX K egrave -15
+KPX K emacron -15
+KPX K eogonek -15
+KPX K o -35
+KPX K oacute -35
+KPX K ocircumflex -35
+KPX K odieresis -35
+KPX K ograve -35
+KPX K ohungarumlaut -35
+KPX K omacron -35
+KPX K oslash -35
+KPX K otilde -35
+KPX K u -30
+KPX K uacute -30
+KPX K ucircumflex -30
+KPX K udieresis -30
+KPX K ugrave -30
+KPX K uhungarumlaut -30
+KPX K umacron -30
+KPX K uogonek -30
+KPX K uring -30
+KPX K y -40
+KPX K yacute -40
+KPX K ydieresis -40
+KPX Kcommaaccent O -30
+KPX Kcommaaccent Oacute -30
+KPX Kcommaaccent Ocircumflex -30
+KPX Kcommaaccent Odieresis -30
+KPX Kcommaaccent Ograve -30
+KPX Kcommaaccent Ohungarumlaut -30
+KPX Kcommaaccent Omacron -30
+KPX Kcommaaccent Oslash -30
+KPX Kcommaaccent Otilde -30
+KPX Kcommaaccent e -15
+KPX Kcommaaccent eacute -15
+KPX Kcommaaccent ecaron -15
+KPX Kcommaaccent ecircumflex -15
+KPX Kcommaaccent edieresis -15
+KPX Kcommaaccent edotaccent -15
+KPX Kcommaaccent egrave -15
+KPX Kcommaaccent emacron -15
+KPX Kcommaaccent eogonek -15
+KPX Kcommaaccent o -35
+KPX Kcommaaccent oacute -35
+KPX Kcommaaccent ocircumflex -35
+KPX Kcommaaccent odieresis -35
+KPX Kcommaaccent ograve -35
+KPX Kcommaaccent ohungarumlaut -35
+KPX Kcommaaccent omacron -35
+KPX Kcommaaccent oslash -35
+KPX Kcommaaccent otilde -35
+KPX Kcommaaccent u -30
+KPX Kcommaaccent uacute -30
+KPX Kcommaaccent ucircumflex -30
+KPX Kcommaaccent udieresis -30
+KPX Kcommaaccent ugrave -30
+KPX Kcommaaccent uhungarumlaut -30
+KPX Kcommaaccent umacron -30
+KPX Kcommaaccent uogonek -30
+KPX Kcommaaccent uring -30
+KPX Kcommaaccent y -40
+KPX Kcommaaccent yacute -40
+KPX Kcommaaccent ydieresis -40
+KPX L T -90
+KPX L Tcaron -90
+KPX L Tcommaaccent -90
+KPX L V -110
+KPX L W -80
+KPX L Y -120
+KPX L Yacute -120
+KPX L Ydieresis -120
+KPX L quotedblright -140
+KPX L quoteright -140
+KPX L y -30
+KPX L yacute -30
+KPX L ydieresis -30
+KPX Lacute T -90
+KPX Lacute Tcaron -90
+KPX Lacute Tcommaaccent -90
+KPX Lacute V -110
+KPX Lacute W -80
+KPX Lacute Y -120
+KPX Lacute Yacute -120
+KPX Lacute Ydieresis -120
+KPX Lacute quotedblright -140
+KPX Lacute quoteright -140
+KPX Lacute y -30
+KPX Lacute yacute -30
+KPX Lacute ydieresis -30
+KPX Lcommaaccent T -90
+KPX Lcommaaccent Tcaron -90
+KPX Lcommaaccent Tcommaaccent -90
+KPX Lcommaaccent V -110
+KPX Lcommaaccent W -80
+KPX Lcommaaccent Y -120
+KPX Lcommaaccent Yacute -120
+KPX Lcommaaccent Ydieresis -120
+KPX Lcommaaccent quotedblright -140
+KPX Lcommaaccent quoteright -140
+KPX Lcommaaccent y -30
+KPX Lcommaaccent yacute -30
+KPX Lcommaaccent ydieresis -30
+KPX Lslash T -90
+KPX Lslash Tcaron -90
+KPX Lslash Tcommaaccent -90
+KPX Lslash V -110
+KPX Lslash W -80
+KPX Lslash Y -120
+KPX Lslash Yacute -120
+KPX Lslash Ydieresis -120
+KPX Lslash quotedblright -140
+KPX Lslash quoteright -140
+KPX Lslash y -30
+KPX Lslash yacute -30
+KPX Lslash ydieresis -30
+KPX O A -50
+KPX O Aacute -50
+KPX O Abreve -50
+KPX O Acircumflex -50
+KPX O Adieresis -50
+KPX O Agrave -50
+KPX O Amacron -50
+KPX O Aogonek -50
+KPX O Aring -50
+KPX O Atilde -50
+KPX O T -40
+KPX O Tcaron -40
+KPX O Tcommaaccent -40
+KPX O V -50
+KPX O W -50
+KPX O X -50
+KPX O Y -70
+KPX O Yacute -70
+KPX O Ydieresis -70
+KPX O comma -40
+KPX O period -40
+KPX Oacute A -50
+KPX Oacute Aacute -50
+KPX Oacute Abreve -50
+KPX Oacute Acircumflex -50
+KPX Oacute Adieresis -50
+KPX Oacute Agrave -50
+KPX Oacute Amacron -50
+KPX Oacute Aogonek -50
+KPX Oacute Aring -50
+KPX Oacute Atilde -50
+KPX Oacute T -40
+KPX Oacute Tcaron -40
+KPX Oacute Tcommaaccent -40
+KPX Oacute V -50
+KPX Oacute W -50
+KPX Oacute X -50
+KPX Oacute Y -70
+KPX Oacute Yacute -70
+KPX Oacute Ydieresis -70
+KPX Oacute comma -40
+KPX Oacute period -40
+KPX Ocircumflex A -50
+KPX Ocircumflex Aacute -50
+KPX Ocircumflex Abreve -50
+KPX Ocircumflex Acircumflex -50
+KPX Ocircumflex Adieresis -50
+KPX Ocircumflex Agrave -50
+KPX Ocircumflex Amacron -50
+KPX Ocircumflex Aogonek -50
+KPX Ocircumflex Aring -50
+KPX Ocircumflex Atilde -50
+KPX Ocircumflex T -40
+KPX Ocircumflex Tcaron -40
+KPX Ocircumflex Tcommaaccent -40
+KPX Ocircumflex V -50
+KPX Ocircumflex W -50
+KPX Ocircumflex X -50
+KPX Ocircumflex Y -70
+KPX Ocircumflex Yacute -70
+KPX Ocircumflex Ydieresis -70
+KPX Ocircumflex comma -40
+KPX Ocircumflex period -40
+KPX Odieresis A -50
+KPX Odieresis Aacute -50
+KPX Odieresis Abreve -50
+KPX Odieresis Acircumflex -50
+KPX Odieresis Adieresis -50
+KPX Odieresis Agrave -50
+KPX Odieresis Amacron -50
+KPX Odieresis Aogonek -50
+KPX Odieresis Aring -50
+KPX Odieresis Atilde -50
+KPX Odieresis T -40
+KPX Odieresis Tcaron -40
+KPX Odieresis Tcommaaccent -40
+KPX Odieresis V -50
+KPX Odieresis W -50
+KPX Odieresis X -50
+KPX Odieresis Y -70
+KPX Odieresis Yacute -70
+KPX Odieresis Ydieresis -70
+KPX Odieresis comma -40
+KPX Odieresis period -40
+KPX Ograve A -50
+KPX Ograve Aacute -50
+KPX Ograve Abreve -50
+KPX Ograve Acircumflex -50
+KPX Ograve Adieresis -50
+KPX Ograve Agrave -50
+KPX Ograve Amacron -50
+KPX Ograve Aogonek -50
+KPX Ograve Aring -50
+KPX Ograve Atilde -50
+KPX Ograve T -40
+KPX Ograve Tcaron -40
+KPX Ograve Tcommaaccent -40
+KPX Ograve V -50
+KPX Ograve W -50
+KPX Ograve X -50
+KPX Ograve Y -70
+KPX Ograve Yacute -70
+KPX Ograve Ydieresis -70
+KPX Ograve comma -40
+KPX Ograve period -40
+KPX Ohungarumlaut A -50
+KPX Ohungarumlaut Aacute -50
+KPX Ohungarumlaut Abreve -50
+KPX Ohungarumlaut Acircumflex -50
+KPX Ohungarumlaut Adieresis -50
+KPX Ohungarumlaut Agrave -50
+KPX Ohungarumlaut Amacron -50
+KPX Ohungarumlaut Aogonek -50
+KPX Ohungarumlaut Aring -50
+KPX Ohungarumlaut Atilde -50
+KPX Ohungarumlaut T -40
+KPX Ohungarumlaut Tcaron -40
+KPX Ohungarumlaut Tcommaaccent -40
+KPX Ohungarumlaut V -50
+KPX Ohungarumlaut W -50
+KPX Ohungarumlaut X -50
+KPX Ohungarumlaut Y -70
+KPX Ohungarumlaut Yacute -70
+KPX Ohungarumlaut Ydieresis -70
+KPX Ohungarumlaut comma -40
+KPX Ohungarumlaut period -40
+KPX Omacron A -50
+KPX Omacron Aacute -50
+KPX Omacron Abreve -50
+KPX Omacron Acircumflex -50
+KPX Omacron Adieresis -50
+KPX Omacron Agrave -50
+KPX Omacron Amacron -50
+KPX Omacron Aogonek -50
+KPX Omacron Aring -50
+KPX Omacron Atilde -50
+KPX Omacron T -40
+KPX Omacron Tcaron -40
+KPX Omacron Tcommaaccent -40
+KPX Omacron V -50
+KPX Omacron W -50
+KPX Omacron X -50
+KPX Omacron Y -70
+KPX Omacron Yacute -70
+KPX Omacron Ydieresis -70
+KPX Omacron comma -40
+KPX Omacron period -40
+KPX Oslash A -50
+KPX Oslash Aacute -50
+KPX Oslash Abreve -50
+KPX Oslash Acircumflex -50
+KPX Oslash Adieresis -50
+KPX Oslash Agrave -50
+KPX Oslash Amacron -50
+KPX Oslash Aogonek -50
+KPX Oslash Aring -50
+KPX Oslash Atilde -50
+KPX Oslash T -40
+KPX Oslash Tcaron -40
+KPX Oslash Tcommaaccent -40
+KPX Oslash V -50
+KPX Oslash W -50
+KPX Oslash X -50
+KPX Oslash Y -70
+KPX Oslash Yacute -70
+KPX Oslash Ydieresis -70
+KPX Oslash comma -40
+KPX Oslash period -40
+KPX Otilde A -50
+KPX Otilde Aacute -50
+KPX Otilde Abreve -50
+KPX Otilde Acircumflex -50
+KPX Otilde Adieresis -50
+KPX Otilde Agrave -50
+KPX Otilde Amacron -50
+KPX Otilde Aogonek -50
+KPX Otilde Aring -50
+KPX Otilde Atilde -50
+KPX Otilde T -40
+KPX Otilde Tcaron -40
+KPX Otilde Tcommaaccent -40
+KPX Otilde V -50
+KPX Otilde W -50
+KPX Otilde X -50
+KPX Otilde Y -70
+KPX Otilde Yacute -70
+KPX Otilde Ydieresis -70
+KPX Otilde comma -40
+KPX Otilde period -40
+KPX P A -100
+KPX P Aacute -100
+KPX P Abreve -100
+KPX P Acircumflex -100
+KPX P Adieresis -100
+KPX P Agrave -100
+KPX P Amacron -100
+KPX P Aogonek -100
+KPX P Aring -100
+KPX P Atilde -100
+KPX P a -30
+KPX P aacute -30
+KPX P abreve -30
+KPX P acircumflex -30
+KPX P adieresis -30
+KPX P agrave -30
+KPX P amacron -30
+KPX P aogonek -30
+KPX P aring -30
+KPX P atilde -30
+KPX P comma -120
+KPX P e -30
+KPX P eacute -30
+KPX P ecaron -30
+KPX P ecircumflex -30
+KPX P edieresis -30
+KPX P edotaccent -30
+KPX P egrave -30
+KPX P emacron -30
+KPX P eogonek -30
+KPX P o -40
+KPX P oacute -40
+KPX P ocircumflex -40
+KPX P odieresis -40
+KPX P ograve -40
+KPX P ohungarumlaut -40
+KPX P omacron -40
+KPX P oslash -40
+KPX P otilde -40
+KPX P period -120
+KPX Q U -10
+KPX Q Uacute -10
+KPX Q Ucircumflex -10
+KPX Q Udieresis -10
+KPX Q Ugrave -10
+KPX Q Uhungarumlaut -10
+KPX Q Umacron -10
+KPX Q Uogonek -10
+KPX Q Uring -10
+KPX Q comma 20
+KPX Q period 20
+KPX R O -20
+KPX R Oacute -20
+KPX R Ocircumflex -20
+KPX R Odieresis -20
+KPX R Ograve -20
+KPX R Ohungarumlaut -20
+KPX R Omacron -20
+KPX R Oslash -20
+KPX R Otilde -20
+KPX R T -20
+KPX R Tcaron -20
+KPX R Tcommaaccent -20
+KPX R U -20
+KPX R Uacute -20
+KPX R Ucircumflex -20
+KPX R Udieresis -20
+KPX R Ugrave -20
+KPX R Uhungarumlaut -20
+KPX R Umacron -20
+KPX R Uogonek -20
+KPX R Uring -20
+KPX R V -50
+KPX R W -40
+KPX R Y -50
+KPX R Yacute -50
+KPX R Ydieresis -50
+KPX Racute O -20
+KPX Racute Oacute -20
+KPX Racute Ocircumflex -20
+KPX Racute Odieresis -20
+KPX Racute Ograve -20
+KPX Racute Ohungarumlaut -20
+KPX Racute Omacron -20
+KPX Racute Oslash -20
+KPX Racute Otilde -20
+KPX Racute T -20
+KPX Racute Tcaron -20
+KPX Racute Tcommaaccent -20
+KPX Racute U -20
+KPX Racute Uacute -20
+KPX Racute Ucircumflex -20
+KPX Racute Udieresis -20
+KPX Racute Ugrave -20
+KPX Racute Uhungarumlaut -20
+KPX Racute Umacron -20
+KPX Racute Uogonek -20
+KPX Racute Uring -20
+KPX Racute V -50
+KPX Racute W -40
+KPX Racute Y -50
+KPX Racute Yacute -50
+KPX Racute Ydieresis -50
+KPX Rcaron O -20
+KPX Rcaron Oacute -20
+KPX Rcaron Ocircumflex -20
+KPX Rcaron Odieresis -20
+KPX Rcaron Ograve -20
+KPX Rcaron Ohungarumlaut -20
+KPX Rcaron Omacron -20
+KPX Rcaron Oslash -20
+KPX Rcaron Otilde -20
+KPX Rcaron T -20
+KPX Rcaron Tcaron -20
+KPX Rcaron Tcommaaccent -20
+KPX Rcaron U -20
+KPX Rcaron Uacute -20
+KPX Rcaron Ucircumflex -20
+KPX Rcaron Udieresis -20
+KPX Rcaron Ugrave -20
+KPX Rcaron Uhungarumlaut -20
+KPX Rcaron Umacron -20
+KPX Rcaron Uogonek -20
+KPX Rcaron Uring -20
+KPX Rcaron V -50
+KPX Rcaron W -40
+KPX Rcaron Y -50
+KPX Rcaron Yacute -50
+KPX Rcaron Ydieresis -50
+KPX Rcommaaccent O -20
+KPX Rcommaaccent Oacute -20
+KPX Rcommaaccent Ocircumflex -20
+KPX Rcommaaccent Odieresis -20
+KPX Rcommaaccent Ograve -20
+KPX Rcommaaccent Ohungarumlaut -20
+KPX Rcommaaccent Omacron -20
+KPX Rcommaaccent Oslash -20
+KPX Rcommaaccent Otilde -20
+KPX Rcommaaccent T -20
+KPX Rcommaaccent Tcaron -20
+KPX Rcommaaccent Tcommaaccent -20
+KPX Rcommaaccent U -20
+KPX Rcommaaccent Uacute -20
+KPX Rcommaaccent Ucircumflex -20
+KPX Rcommaaccent Udieresis -20
+KPX Rcommaaccent Ugrave -20
+KPX Rcommaaccent Uhungarumlaut -20
+KPX Rcommaaccent Umacron -20
+KPX Rcommaaccent Uogonek -20
+KPX Rcommaaccent Uring -20
+KPX Rcommaaccent V -50
+KPX Rcommaaccent W -40
+KPX Rcommaaccent Y -50
+KPX Rcommaaccent Yacute -50
+KPX Rcommaaccent Ydieresis -50
+KPX T A -90
+KPX T Aacute -90
+KPX T Abreve -90
+KPX T Acircumflex -90
+KPX T Adieresis -90
+KPX T Agrave -90
+KPX T Amacron -90
+KPX T Aogonek -90
+KPX T Aring -90
+KPX T Atilde -90
+KPX T O -40
+KPX T Oacute -40
+KPX T Ocircumflex -40
+KPX T Odieresis -40
+KPX T Ograve -40
+KPX T Ohungarumlaut -40
+KPX T Omacron -40
+KPX T Oslash -40
+KPX T Otilde -40
+KPX T a -80
+KPX T aacute -80
+KPX T abreve -80
+KPX T acircumflex -80
+KPX T adieresis -80
+KPX T agrave -80
+KPX T amacron -80
+KPX T aogonek -80
+KPX T aring -80
+KPX T atilde -80
+KPX T colon -40
+KPX T comma -80
+KPX T e -60
+KPX T eacute -60
+KPX T ecaron -60
+KPX T ecircumflex -60
+KPX T edieresis -60
+KPX T edotaccent -60
+KPX T egrave -60
+KPX T emacron -60
+KPX T eogonek -60
+KPX T hyphen -120
+KPX T o -80
+KPX T oacute -80
+KPX T ocircumflex -80
+KPX T odieresis -80
+KPX T ograve -80
+KPX T ohungarumlaut -80
+KPX T omacron -80
+KPX T oslash -80
+KPX T otilde -80
+KPX T period -80
+KPX T r -80
+KPX T racute -80
+KPX T rcommaaccent -80
+KPX T semicolon -40
+KPX T u -90
+KPX T uacute -90
+KPX T ucircumflex -90
+KPX T udieresis -90
+KPX T ugrave -90
+KPX T uhungarumlaut -90
+KPX T umacron -90
+KPX T uogonek -90
+KPX T uring -90
+KPX T w -60
+KPX T y -60
+KPX T yacute -60
+KPX T ydieresis -60
+KPX Tcaron A -90
+KPX Tcaron Aacute -90
+KPX Tcaron Abreve -90
+KPX Tcaron Acircumflex -90
+KPX Tcaron Adieresis -90
+KPX Tcaron Agrave -90
+KPX Tcaron Amacron -90
+KPX Tcaron Aogonek -90
+KPX Tcaron Aring -90
+KPX Tcaron Atilde -90
+KPX Tcaron O -40
+KPX Tcaron Oacute -40
+KPX Tcaron Ocircumflex -40
+KPX Tcaron Odieresis -40
+KPX Tcaron Ograve -40
+KPX Tcaron Ohungarumlaut -40
+KPX Tcaron Omacron -40
+KPX Tcaron Oslash -40
+KPX Tcaron Otilde -40
+KPX Tcaron a -80
+KPX Tcaron aacute -80
+KPX Tcaron abreve -80
+KPX Tcaron acircumflex -80
+KPX Tcaron adieresis -80
+KPX Tcaron agrave -80
+KPX Tcaron amacron -80
+KPX Tcaron aogonek -80
+KPX Tcaron aring -80
+KPX Tcaron atilde -80
+KPX Tcaron colon -40
+KPX Tcaron comma -80
+KPX Tcaron e -60
+KPX Tcaron eacute -60
+KPX Tcaron ecaron -60
+KPX Tcaron ecircumflex -60
+KPX Tcaron edieresis -60
+KPX Tcaron edotaccent -60
+KPX Tcaron egrave -60
+KPX Tcaron emacron -60
+KPX Tcaron eogonek -60
+KPX Tcaron hyphen -120
+KPX Tcaron o -80
+KPX Tcaron oacute -80
+KPX Tcaron ocircumflex -80
+KPX Tcaron odieresis -80
+KPX Tcaron ograve -80
+KPX Tcaron ohungarumlaut -80
+KPX Tcaron omacron -80
+KPX Tcaron oslash -80
+KPX Tcaron otilde -80
+KPX Tcaron period -80
+KPX Tcaron r -80
+KPX Tcaron racute -80
+KPX Tcaron rcommaaccent -80
+KPX Tcaron semicolon -40
+KPX Tcaron u -90
+KPX Tcaron uacute -90
+KPX Tcaron ucircumflex -90
+KPX Tcaron udieresis -90
+KPX Tcaron ugrave -90
+KPX Tcaron uhungarumlaut -90
+KPX Tcaron umacron -90
+KPX Tcaron uogonek -90
+KPX Tcaron uring -90
+KPX Tcaron w -60
+KPX Tcaron y -60
+KPX Tcaron yacute -60
+KPX Tcaron ydieresis -60
+KPX Tcommaaccent A -90
+KPX Tcommaaccent Aacute -90
+KPX Tcommaaccent Abreve -90
+KPX Tcommaaccent Acircumflex -90
+KPX Tcommaaccent Adieresis -90
+KPX Tcommaaccent Agrave -90
+KPX Tcommaaccent Amacron -90
+KPX Tcommaaccent Aogonek -90
+KPX Tcommaaccent Aring -90
+KPX Tcommaaccent Atilde -90
+KPX Tcommaaccent O -40
+KPX Tcommaaccent Oacute -40
+KPX Tcommaaccent Ocircumflex -40
+KPX Tcommaaccent Odieresis -40
+KPX Tcommaaccent Ograve -40
+KPX Tcommaaccent Ohungarumlaut -40
+KPX Tcommaaccent Omacron -40
+KPX Tcommaaccent Oslash -40
+KPX Tcommaaccent Otilde -40
+KPX Tcommaaccent a -80
+KPX Tcommaaccent aacute -80
+KPX Tcommaaccent abreve -80
+KPX Tcommaaccent acircumflex -80
+KPX Tcommaaccent adieresis -80
+KPX Tcommaaccent agrave -80
+KPX Tcommaaccent amacron -80
+KPX Tcommaaccent aogonek -80
+KPX Tcommaaccent aring -80
+KPX Tcommaaccent atilde -80
+KPX Tcommaaccent colon -40
+KPX Tcommaaccent comma -80
+KPX Tcommaaccent e -60
+KPX Tcommaaccent eacute -60
+KPX Tcommaaccent ecaron -60
+KPX Tcommaaccent ecircumflex -60
+KPX Tcommaaccent edieresis -60
+KPX Tcommaaccent edotaccent -60
+KPX Tcommaaccent egrave -60
+KPX Tcommaaccent emacron -60
+KPX Tcommaaccent eogonek -60
+KPX Tcommaaccent hyphen -120
+KPX Tcommaaccent o -80
+KPX Tcommaaccent oacute -80
+KPX Tcommaaccent ocircumflex -80
+KPX Tcommaaccent odieresis -80
+KPX Tcommaaccent ograve -80
+KPX Tcommaaccent ohungarumlaut -80
+KPX Tcommaaccent omacron -80
+KPX Tcommaaccent oslash -80
+KPX Tcommaaccent otilde -80
+KPX Tcommaaccent period -80
+KPX Tcommaaccent r -80
+KPX Tcommaaccent racute -80
+KPX Tcommaaccent rcommaaccent -80
+KPX Tcommaaccent semicolon -40
+KPX Tcommaaccent u -90
+KPX Tcommaaccent uacute -90
+KPX Tcommaaccent ucircumflex -90
+KPX Tcommaaccent udieresis -90
+KPX Tcommaaccent ugrave -90
+KPX Tcommaaccent uhungarumlaut -90
+KPX Tcommaaccent umacron -90
+KPX Tcommaaccent uogonek -90
+KPX Tcommaaccent uring -90
+KPX Tcommaaccent w -60
+KPX Tcommaaccent y -60
+KPX Tcommaaccent yacute -60
+KPX Tcommaaccent ydieresis -60
+KPX U A -50
+KPX U Aacute -50
+KPX U Abreve -50
+KPX U Acircumflex -50
+KPX U Adieresis -50
+KPX U Agrave -50
+KPX U Amacron -50
+KPX U Aogonek -50
+KPX U Aring -50
+KPX U Atilde -50
+KPX U comma -30
+KPX U period -30
+KPX Uacute A -50
+KPX Uacute Aacute -50
+KPX Uacute Abreve -50
+KPX Uacute Acircumflex -50
+KPX Uacute Adieresis -50
+KPX Uacute Agrave -50
+KPX Uacute Amacron -50
+KPX Uacute Aogonek -50
+KPX Uacute Aring -50
+KPX Uacute Atilde -50
+KPX Uacute comma -30
+KPX Uacute period -30
+KPX Ucircumflex A -50
+KPX Ucircumflex Aacute -50
+KPX Ucircumflex Abreve -50
+KPX Ucircumflex Acircumflex -50
+KPX Ucircumflex Adieresis -50
+KPX Ucircumflex Agrave -50
+KPX Ucircumflex Amacron -50
+KPX Ucircumflex Aogonek -50
+KPX Ucircumflex Aring -50
+KPX Ucircumflex Atilde -50
+KPX Ucircumflex comma -30
+KPX Ucircumflex period -30
+KPX Udieresis A -50
+KPX Udieresis Aacute -50
+KPX Udieresis Abreve -50
+KPX Udieresis Acircumflex -50
+KPX Udieresis Adieresis -50
+KPX Udieresis Agrave -50
+KPX Udieresis Amacron -50
+KPX Udieresis Aogonek -50
+KPX Udieresis Aring -50
+KPX Udieresis Atilde -50
+KPX Udieresis comma -30
+KPX Udieresis period -30
+KPX Ugrave A -50
+KPX Ugrave Aacute -50
+KPX Ugrave Abreve -50
+KPX Ugrave Acircumflex -50
+KPX Ugrave Adieresis -50
+KPX Ugrave Agrave -50
+KPX Ugrave Amacron -50
+KPX Ugrave Aogonek -50
+KPX Ugrave Aring -50
+KPX Ugrave Atilde -50
+KPX Ugrave comma -30
+KPX Ugrave period -30
+KPX Uhungarumlaut A -50
+KPX Uhungarumlaut Aacute -50
+KPX Uhungarumlaut Abreve -50
+KPX Uhungarumlaut Acircumflex -50
+KPX Uhungarumlaut Adieresis -50
+KPX Uhungarumlaut Agrave -50
+KPX Uhungarumlaut Amacron -50
+KPX Uhungarumlaut Aogonek -50
+KPX Uhungarumlaut Aring -50
+KPX Uhungarumlaut Atilde -50
+KPX Uhungarumlaut comma -30
+KPX Uhungarumlaut period -30
+KPX Umacron A -50
+KPX Umacron Aacute -50
+KPX Umacron Abreve -50
+KPX Umacron Acircumflex -50
+KPX Umacron Adieresis -50
+KPX Umacron Agrave -50
+KPX Umacron Amacron -50
+KPX Umacron Aogonek -50
+KPX Umacron Aring -50
+KPX Umacron Atilde -50
+KPX Umacron comma -30
+KPX Umacron period -30
+KPX Uogonek A -50
+KPX Uogonek Aacute -50
+KPX Uogonek Abreve -50
+KPX Uogonek Acircumflex -50
+KPX Uogonek Adieresis -50
+KPX Uogonek Agrave -50
+KPX Uogonek Amacron -50
+KPX Uogonek Aogonek -50
+KPX Uogonek Aring -50
+KPX Uogonek Atilde -50
+KPX Uogonek comma -30
+KPX Uogonek period -30
+KPX Uring A -50
+KPX Uring Aacute -50
+KPX Uring Abreve -50
+KPX Uring Acircumflex -50
+KPX Uring Adieresis -50
+KPX Uring Agrave -50
+KPX Uring Amacron -50
+KPX Uring Aogonek -50
+KPX Uring Aring -50
+KPX Uring Atilde -50
+KPX Uring comma -30
+KPX Uring period -30
+KPX V A -80
+KPX V Aacute -80
+KPX V Abreve -80
+KPX V Acircumflex -80
+KPX V Adieresis -80
+KPX V Agrave -80
+KPX V Amacron -80
+KPX V Aogonek -80
+KPX V Aring -80
+KPX V Atilde -80
+KPX V G -50
+KPX V Gbreve -50
+KPX V Gcommaaccent -50
+KPX V O -50
+KPX V Oacute -50
+KPX V Ocircumflex -50
+KPX V Odieresis -50
+KPX V Ograve -50
+KPX V Ohungarumlaut -50
+KPX V Omacron -50
+KPX V Oslash -50
+KPX V Otilde -50
+KPX V a -60
+KPX V aacute -60
+KPX V abreve -60
+KPX V acircumflex -60
+KPX V adieresis -60
+KPX V agrave -60
+KPX V amacron -60
+KPX V aogonek -60
+KPX V aring -60
+KPX V atilde -60
+KPX V colon -40
+KPX V comma -120
+KPX V e -50
+KPX V eacute -50
+KPX V ecaron -50
+KPX V ecircumflex -50
+KPX V edieresis -50
+KPX V edotaccent -50
+KPX V egrave -50
+KPX V emacron -50
+KPX V eogonek -50
+KPX V hyphen -80
+KPX V o -90
+KPX V oacute -90
+KPX V ocircumflex -90
+KPX V odieresis -90
+KPX V ograve -90
+KPX V ohungarumlaut -90
+KPX V omacron -90
+KPX V oslash -90
+KPX V otilde -90
+KPX V period -120
+KPX V semicolon -40
+KPX V u -60
+KPX V uacute -60
+KPX V ucircumflex -60
+KPX V udieresis -60
+KPX V ugrave -60
+KPX V uhungarumlaut -60
+KPX V umacron -60
+KPX V uogonek -60
+KPX V uring -60
+KPX W A -60
+KPX W Aacute -60
+KPX W Abreve -60
+KPX W Acircumflex -60
+KPX W Adieresis -60
+KPX W Agrave -60
+KPX W Amacron -60
+KPX W Aogonek -60
+KPX W Aring -60
+KPX W Atilde -60
+KPX W O -20
+KPX W Oacute -20
+KPX W Ocircumflex -20
+KPX W Odieresis -20
+KPX W Ograve -20
+KPX W Ohungarumlaut -20
+KPX W Omacron -20
+KPX W Oslash -20
+KPX W Otilde -20
+KPX W a -40
+KPX W aacute -40
+KPX W abreve -40
+KPX W acircumflex -40
+KPX W adieresis -40
+KPX W agrave -40
+KPX W amacron -40
+KPX W aogonek -40
+KPX W aring -40
+KPX W atilde -40
+KPX W colon -10
+KPX W comma -80
+KPX W e -35
+KPX W eacute -35
+KPX W ecaron -35
+KPX W ecircumflex -35
+KPX W edieresis -35
+KPX W edotaccent -35
+KPX W egrave -35
+KPX W emacron -35
+KPX W eogonek -35
+KPX W hyphen -40
+KPX W o -60
+KPX W oacute -60
+KPX W ocircumflex -60
+KPX W odieresis -60
+KPX W ograve -60
+KPX W ohungarumlaut -60
+KPX W omacron -60
+KPX W oslash -60
+KPX W otilde -60
+KPX W period -80
+KPX W semicolon -10
+KPX W u -45
+KPX W uacute -45
+KPX W ucircumflex -45
+KPX W udieresis -45
+KPX W ugrave -45
+KPX W uhungarumlaut -45
+KPX W umacron -45
+KPX W uogonek -45
+KPX W uring -45
+KPX W y -20
+KPX W yacute -20
+KPX W ydieresis -20
+KPX Y A -110
+KPX Y Aacute -110
+KPX Y Abreve -110
+KPX Y Acircumflex -110
+KPX Y Adieresis -110
+KPX Y Agrave -110
+KPX Y Amacron -110
+KPX Y Aogonek -110
+KPX Y Aring -110
+KPX Y Atilde -110
+KPX Y O -70
+KPX Y Oacute -70
+KPX Y Ocircumflex -70
+KPX Y Odieresis -70
+KPX Y Ograve -70
+KPX Y Ohungarumlaut -70
+KPX Y Omacron -70
+KPX Y Oslash -70
+KPX Y Otilde -70
+KPX Y a -90
+KPX Y aacute -90
+KPX Y abreve -90
+KPX Y acircumflex -90
+KPX Y adieresis -90
+KPX Y agrave -90
+KPX Y amacron -90
+KPX Y aogonek -90
+KPX Y aring -90
+KPX Y atilde -90
+KPX Y colon -50
+KPX Y comma -100
+KPX Y e -80
+KPX Y eacute -80
+KPX Y ecaron -80
+KPX Y ecircumflex -80
+KPX Y edieresis -80
+KPX Y edotaccent -80
+KPX Y egrave -80
+KPX Y emacron -80
+KPX Y eogonek -80
+KPX Y o -100
+KPX Y oacute -100
+KPX Y ocircumflex -100
+KPX Y odieresis -100
+KPX Y ograve -100
+KPX Y ohungarumlaut -100
+KPX Y omacron -100
+KPX Y oslash -100
+KPX Y otilde -100
+KPX Y period -100
+KPX Y semicolon -50
+KPX Y u -100
+KPX Y uacute -100
+KPX Y ucircumflex -100
+KPX Y udieresis -100
+KPX Y ugrave -100
+KPX Y uhungarumlaut -100
+KPX Y umacron -100
+KPX Y uogonek -100
+KPX Y uring -100
+KPX Yacute A -110
+KPX Yacute Aacute -110
+KPX Yacute Abreve -110
+KPX Yacute Acircumflex -110
+KPX Yacute Adieresis -110
+KPX Yacute Agrave -110
+KPX Yacute Amacron -110
+KPX Yacute Aogonek -110
+KPX Yacute Aring -110
+KPX Yacute Atilde -110
+KPX Yacute O -70
+KPX Yacute Oacute -70
+KPX Yacute Ocircumflex -70
+KPX Yacute Odieresis -70
+KPX Yacute Ograve -70
+KPX Yacute Ohungarumlaut -70
+KPX Yacute Omacron -70
+KPX Yacute Oslash -70
+KPX Yacute Otilde -70
+KPX Yacute a -90
+KPX Yacute aacute -90
+KPX Yacute abreve -90
+KPX Yacute acircumflex -90
+KPX Yacute adieresis -90
+KPX Yacute agrave -90
+KPX Yacute amacron -90
+KPX Yacute aogonek -90
+KPX Yacute aring -90
+KPX Yacute atilde -90
+KPX Yacute colon -50
+KPX Yacute comma -100
+KPX Yacute e -80
+KPX Yacute eacute -80
+KPX Yacute ecaron -80
+KPX Yacute ecircumflex -80
+KPX Yacute edieresis -80
+KPX Yacute edotaccent -80
+KPX Yacute egrave -80
+KPX Yacute emacron -80
+KPX Yacute eogonek -80
+KPX Yacute o -100
+KPX Yacute oacute -100
+KPX Yacute ocircumflex -100
+KPX Yacute odieresis -100
+KPX Yacute ograve -100
+KPX Yacute ohungarumlaut -100
+KPX Yacute omacron -100
+KPX Yacute oslash -100
+KPX Yacute otilde -100
+KPX Yacute period -100
+KPX Yacute semicolon -50
+KPX Yacute u -100
+KPX Yacute uacute -100
+KPX Yacute ucircumflex -100
+KPX Yacute udieresis -100
+KPX Yacute ugrave -100
+KPX Yacute uhungarumlaut -100
+KPX Yacute umacron -100
+KPX Yacute uogonek -100
+KPX Yacute uring -100
+KPX Ydieresis A -110
+KPX Ydieresis Aacute -110
+KPX Ydieresis Abreve -110
+KPX Ydieresis Acircumflex -110
+KPX Ydieresis Adieresis -110
+KPX Ydieresis Agrave -110
+KPX Ydieresis Amacron -110
+KPX Ydieresis Aogonek -110
+KPX Ydieresis Aring -110
+KPX Ydieresis Atilde -110
+KPX Ydieresis O -70
+KPX Ydieresis Oacute -70
+KPX Ydieresis Ocircumflex -70
+KPX Ydieresis Odieresis -70
+KPX Ydieresis Ograve -70
+KPX Ydieresis Ohungarumlaut -70
+KPX Ydieresis Omacron -70
+KPX Ydieresis Oslash -70
+KPX Ydieresis Otilde -70
+KPX Ydieresis a -90
+KPX Ydieresis aacute -90
+KPX Ydieresis abreve -90
+KPX Ydieresis acircumflex -90
+KPX Ydieresis adieresis -90
+KPX Ydieresis agrave -90
+KPX Ydieresis amacron -90
+KPX Ydieresis aogonek -90
+KPX Ydieresis aring -90
+KPX Ydieresis atilde -90
+KPX Ydieresis colon -50
+KPX Ydieresis comma -100
+KPX Ydieresis e -80
+KPX Ydieresis eacute -80
+KPX Ydieresis ecaron -80
+KPX Ydieresis ecircumflex -80
+KPX Ydieresis edieresis -80
+KPX Ydieresis edotaccent -80
+KPX Ydieresis egrave -80
+KPX Ydieresis emacron -80
+KPX Ydieresis eogonek -80
+KPX Ydieresis o -100
+KPX Ydieresis oacute -100
+KPX Ydieresis ocircumflex -100
+KPX Ydieresis odieresis -100
+KPX Ydieresis ograve -100
+KPX Ydieresis ohungarumlaut -100
+KPX Ydieresis omacron -100
+KPX Ydieresis oslash -100
+KPX Ydieresis otilde -100
+KPX Ydieresis period -100
+KPX Ydieresis semicolon -50
+KPX Ydieresis u -100
+KPX Ydieresis uacute -100
+KPX Ydieresis ucircumflex -100
+KPX Ydieresis udieresis -100
+KPX Ydieresis ugrave -100
+KPX Ydieresis uhungarumlaut -100
+KPX Ydieresis umacron -100
+KPX Ydieresis uogonek -100
+KPX Ydieresis uring -100
+KPX a g -10
+KPX a gbreve -10
+KPX a gcommaaccent -10
+KPX a v -15
+KPX a w -15
+KPX a y -20
+KPX a yacute -20
+KPX a ydieresis -20
+KPX aacute g -10
+KPX aacute gbreve -10
+KPX aacute gcommaaccent -10
+KPX aacute v -15
+KPX aacute w -15
+KPX aacute y -20
+KPX aacute yacute -20
+KPX aacute ydieresis -20
+KPX abreve g -10
+KPX abreve gbreve -10
+KPX abreve gcommaaccent -10
+KPX abreve v -15
+KPX abreve w -15
+KPX abreve y -20
+KPX abreve yacute -20
+KPX abreve ydieresis -20
+KPX acircumflex g -10
+KPX acircumflex gbreve -10
+KPX acircumflex gcommaaccent -10
+KPX acircumflex v -15
+KPX acircumflex w -15
+KPX acircumflex y -20
+KPX acircumflex yacute -20
+KPX acircumflex ydieresis -20
+KPX adieresis g -10
+KPX adieresis gbreve -10
+KPX adieresis gcommaaccent -10
+KPX adieresis v -15
+KPX adieresis w -15
+KPX adieresis y -20
+KPX adieresis yacute -20
+KPX adieresis ydieresis -20
+KPX agrave g -10
+KPX agrave gbreve -10
+KPX agrave gcommaaccent -10
+KPX agrave v -15
+KPX agrave w -15
+KPX agrave y -20
+KPX agrave yacute -20
+KPX agrave ydieresis -20
+KPX amacron g -10
+KPX amacron gbreve -10
+KPX amacron gcommaaccent -10
+KPX amacron v -15
+KPX amacron w -15
+KPX amacron y -20
+KPX amacron yacute -20
+KPX amacron ydieresis -20
+KPX aogonek g -10
+KPX aogonek gbreve -10
+KPX aogonek gcommaaccent -10
+KPX aogonek v -15
+KPX aogonek w -15
+KPX aogonek y -20
+KPX aogonek yacute -20
+KPX aogonek ydieresis -20
+KPX aring g -10
+KPX aring gbreve -10
+KPX aring gcommaaccent -10
+KPX aring v -15
+KPX aring w -15
+KPX aring y -20
+KPX aring yacute -20
+KPX aring ydieresis -20
+KPX atilde g -10
+KPX atilde gbreve -10
+KPX atilde gcommaaccent -10
+KPX atilde v -15
+KPX atilde w -15
+KPX atilde y -20
+KPX atilde yacute -20
+KPX atilde ydieresis -20
+KPX b l -10
+KPX b lacute -10
+KPX b lcommaaccent -10
+KPX b lslash -10
+KPX b u -20
+KPX b uacute -20
+KPX b ucircumflex -20
+KPX b udieresis -20
+KPX b ugrave -20
+KPX b uhungarumlaut -20
+KPX b umacron -20
+KPX b uogonek -20
+KPX b uring -20
+KPX b v -20
+KPX b y -20
+KPX b yacute -20
+KPX b ydieresis -20
+KPX c h -10
+KPX c k -20
+KPX c kcommaaccent -20
+KPX c l -20
+KPX c lacute -20
+KPX c lcommaaccent -20
+KPX c lslash -20
+KPX c y -10
+KPX c yacute -10
+KPX c ydieresis -10
+KPX cacute h -10
+KPX cacute k -20
+KPX cacute kcommaaccent -20
+KPX cacute l -20
+KPX cacute lacute -20
+KPX cacute lcommaaccent -20
+KPX cacute lslash -20
+KPX cacute y -10
+KPX cacute yacute -10
+KPX cacute ydieresis -10
+KPX ccaron h -10
+KPX ccaron k -20
+KPX ccaron kcommaaccent -20
+KPX ccaron l -20
+KPX ccaron lacute -20
+KPX ccaron lcommaaccent -20
+KPX ccaron lslash -20
+KPX ccaron y -10
+KPX ccaron yacute -10
+KPX ccaron ydieresis -10
+KPX ccedilla h -10
+KPX ccedilla k -20
+KPX ccedilla kcommaaccent -20
+KPX ccedilla l -20
+KPX ccedilla lacute -20
+KPX ccedilla lcommaaccent -20
+KPX ccedilla lslash -20
+KPX ccedilla y -10
+KPX ccedilla yacute -10
+KPX ccedilla ydieresis -10
+KPX colon space -40
+KPX comma quotedblright -120
+KPX comma quoteright -120
+KPX comma space -40
+KPX d d -10
+KPX d dcroat -10
+KPX d v -15
+KPX d w -15
+KPX d y -15
+KPX d yacute -15
+KPX d ydieresis -15
+KPX dcroat d -10
+KPX dcroat dcroat -10
+KPX dcroat v -15
+KPX dcroat w -15
+KPX dcroat y -15
+KPX dcroat yacute -15
+KPX dcroat ydieresis -15
+KPX e comma 10
+KPX e period 20
+KPX e v -15
+KPX e w -15
+KPX e x -15
+KPX e y -15
+KPX e yacute -15
+KPX e ydieresis -15
+KPX eacute comma 10
+KPX eacute period 20
+KPX eacute v -15
+KPX eacute w -15
+KPX eacute x -15
+KPX eacute y -15
+KPX eacute yacute -15
+KPX eacute ydieresis -15
+KPX ecaron comma 10
+KPX ecaron period 20
+KPX ecaron v -15
+KPX ecaron w -15
+KPX ecaron x -15
+KPX ecaron y -15
+KPX ecaron yacute -15
+KPX ecaron ydieresis -15
+KPX ecircumflex comma 10
+KPX ecircumflex period 20
+KPX ecircumflex v -15
+KPX ecircumflex w -15
+KPX ecircumflex x -15
+KPX ecircumflex y -15
+KPX ecircumflex yacute -15
+KPX ecircumflex ydieresis -15
+KPX edieresis comma 10
+KPX edieresis period 20
+KPX edieresis v -15
+KPX edieresis w -15
+KPX edieresis x -15
+KPX edieresis y -15
+KPX edieresis yacute -15
+KPX edieresis ydieresis -15
+KPX edotaccent comma 10
+KPX edotaccent period 20
+KPX edotaccent v -15
+KPX edotaccent w -15
+KPX edotaccent x -15
+KPX edotaccent y -15
+KPX edotaccent yacute -15
+KPX edotaccent ydieresis -15
+KPX egrave comma 10
+KPX egrave period 20
+KPX egrave v -15
+KPX egrave w -15
+KPX egrave x -15
+KPX egrave y -15
+KPX egrave yacute -15
+KPX egrave ydieresis -15
+KPX emacron comma 10
+KPX emacron period 20
+KPX emacron v -15
+KPX emacron w -15
+KPX emacron x -15
+KPX emacron y -15
+KPX emacron yacute -15
+KPX emacron ydieresis -15
+KPX eogonek comma 10
+KPX eogonek period 20
+KPX eogonek v -15
+KPX eogonek w -15
+KPX eogonek x -15
+KPX eogonek y -15
+KPX eogonek yacute -15
+KPX eogonek ydieresis -15
+KPX f comma -10
+KPX f e -10
+KPX f eacute -10
+KPX f ecaron -10
+KPX f ecircumflex -10
+KPX f edieresis -10
+KPX f edotaccent -10
+KPX f egrave -10
+KPX f emacron -10
+KPX f eogonek -10
+KPX f o -20
+KPX f oacute -20
+KPX f ocircumflex -20
+KPX f odieresis -20
+KPX f ograve -20
+KPX f ohungarumlaut -20
+KPX f omacron -20
+KPX f oslash -20
+KPX f otilde -20
+KPX f period -10
+KPX f quotedblright 30
+KPX f quoteright 30
+KPX g e 10
+KPX g eacute 10
+KPX g ecaron 10
+KPX g ecircumflex 10
+KPX g edieresis 10
+KPX g edotaccent 10
+KPX g egrave 10
+KPX g emacron 10
+KPX g eogonek 10
+KPX g g -10
+KPX g gbreve -10
+KPX g gcommaaccent -10
+KPX gbreve e 10
+KPX gbreve eacute 10
+KPX gbreve ecaron 10
+KPX gbreve ecircumflex 10
+KPX gbreve edieresis 10
+KPX gbreve edotaccent 10
+KPX gbreve egrave 10
+KPX gbreve emacron 10
+KPX gbreve eogonek 10
+KPX gbreve g -10
+KPX gbreve gbreve -10
+KPX gbreve gcommaaccent -10
+KPX gcommaaccent e 10
+KPX gcommaaccent eacute 10
+KPX gcommaaccent ecaron 10
+KPX gcommaaccent ecircumflex 10
+KPX gcommaaccent edieresis 10
+KPX gcommaaccent edotaccent 10
+KPX gcommaaccent egrave 10
+KPX gcommaaccent emacron 10
+KPX gcommaaccent eogonek 10
+KPX gcommaaccent g -10
+KPX gcommaaccent gbreve -10
+KPX gcommaaccent gcommaaccent -10
+KPX h y -20
+KPX h yacute -20
+KPX h ydieresis -20
+KPX k o -15
+KPX k oacute -15
+KPX k ocircumflex -15
+KPX k odieresis -15
+KPX k ograve -15
+KPX k ohungarumlaut -15
+KPX k omacron -15
+KPX k oslash -15
+KPX k otilde -15
+KPX kcommaaccent o -15
+KPX kcommaaccent oacute -15
+KPX kcommaaccent ocircumflex -15
+KPX kcommaaccent odieresis -15
+KPX kcommaaccent ograve -15
+KPX kcommaaccent ohungarumlaut -15
+KPX kcommaaccent omacron -15
+KPX kcommaaccent oslash -15
+KPX kcommaaccent otilde -15
+KPX l w -15
+KPX l y -15
+KPX l yacute -15
+KPX l ydieresis -15
+KPX lacute w -15
+KPX lacute y -15
+KPX lacute yacute -15
+KPX lacute ydieresis -15
+KPX lcommaaccent w -15
+KPX lcommaaccent y -15
+KPX lcommaaccent yacute -15
+KPX lcommaaccent ydieresis -15
+KPX lslash w -15
+KPX lslash y -15
+KPX lslash yacute -15
+KPX lslash ydieresis -15
+KPX m u -20
+KPX m uacute -20
+KPX m ucircumflex -20
+KPX m udieresis -20
+KPX m ugrave -20
+KPX m uhungarumlaut -20
+KPX m umacron -20
+KPX m uogonek -20
+KPX m uring -20
+KPX m y -30
+KPX m yacute -30
+KPX m ydieresis -30
+KPX n u -10
+KPX n uacute -10
+KPX n ucircumflex -10
+KPX n udieresis -10
+KPX n ugrave -10
+KPX n uhungarumlaut -10
+KPX n umacron -10
+KPX n uogonek -10
+KPX n uring -10
+KPX n v -40
+KPX n y -20
+KPX n yacute -20
+KPX n ydieresis -20
+KPX nacute u -10
+KPX nacute uacute -10
+KPX nacute ucircumflex -10
+KPX nacute udieresis -10
+KPX nacute ugrave -10
+KPX nacute uhungarumlaut -10
+KPX nacute umacron -10
+KPX nacute uogonek -10
+KPX nacute uring -10
+KPX nacute v -40
+KPX nacute y -20
+KPX nacute yacute -20
+KPX nacute ydieresis -20
+KPX ncaron u -10
+KPX ncaron uacute -10
+KPX ncaron ucircumflex -10
+KPX ncaron udieresis -10
+KPX ncaron ugrave -10
+KPX ncaron uhungarumlaut -10
+KPX ncaron umacron -10
+KPX ncaron uogonek -10
+KPX ncaron uring -10
+KPX ncaron v -40
+KPX ncaron y -20
+KPX ncaron yacute -20
+KPX ncaron ydieresis -20
+KPX ncommaaccent u -10
+KPX ncommaaccent uacute -10
+KPX ncommaaccent ucircumflex -10
+KPX ncommaaccent udieresis -10
+KPX ncommaaccent ugrave -10
+KPX ncommaaccent uhungarumlaut -10
+KPX ncommaaccent umacron -10
+KPX ncommaaccent uogonek -10
+KPX ncommaaccent uring -10
+KPX ncommaaccent v -40
+KPX ncommaaccent y -20
+KPX ncommaaccent yacute -20
+KPX ncommaaccent ydieresis -20
+KPX ntilde u -10
+KPX ntilde uacute -10
+KPX ntilde ucircumflex -10
+KPX ntilde udieresis -10
+KPX ntilde ugrave -10
+KPX ntilde uhungarumlaut -10
+KPX ntilde umacron -10
+KPX ntilde uogonek -10
+KPX ntilde uring -10
+KPX ntilde v -40
+KPX ntilde y -20
+KPX ntilde yacute -20
+KPX ntilde ydieresis -20
+KPX o v -20
+KPX o w -15
+KPX o x -30
+KPX o y -20
+KPX o yacute -20
+KPX o ydieresis -20
+KPX oacute v -20
+KPX oacute w -15
+KPX oacute x -30
+KPX oacute y -20
+KPX oacute yacute -20
+KPX oacute ydieresis -20
+KPX ocircumflex v -20
+KPX ocircumflex w -15
+KPX ocircumflex x -30
+KPX ocircumflex y -20
+KPX ocircumflex yacute -20
+KPX ocircumflex ydieresis -20
+KPX odieresis v -20
+KPX odieresis w -15
+KPX odieresis x -30
+KPX odieresis y -20
+KPX odieresis yacute -20
+KPX odieresis ydieresis -20
+KPX ograve v -20
+KPX ograve w -15
+KPX ograve x -30
+KPX ograve y -20
+KPX ograve yacute -20
+KPX ograve ydieresis -20
+KPX ohungarumlaut v -20
+KPX ohungarumlaut w -15
+KPX ohungarumlaut x -30
+KPX ohungarumlaut y -20
+KPX ohungarumlaut yacute -20
+KPX ohungarumlaut ydieresis -20
+KPX omacron v -20
+KPX omacron w -15
+KPX omacron x -30
+KPX omacron y -20
+KPX omacron yacute -20
+KPX omacron ydieresis -20
+KPX oslash v -20
+KPX oslash w -15
+KPX oslash x -30
+KPX oslash y -20
+KPX oslash yacute -20
+KPX oslash ydieresis -20
+KPX otilde v -20
+KPX otilde w -15
+KPX otilde x -30
+KPX otilde y -20
+KPX otilde yacute -20
+KPX otilde ydieresis -20
+KPX p y -15
+KPX p yacute -15
+KPX p ydieresis -15
+KPX period quotedblright -120
+KPX period quoteright -120
+KPX period space -40
+KPX quotedblright space -80
+KPX quoteleft quoteleft -46
+KPX quoteright d -80
+KPX quoteright dcroat -80
+KPX quoteright l -20
+KPX quoteright lacute -20
+KPX quoteright lcommaaccent -20
+KPX quoteright lslash -20
+KPX quoteright quoteright -46
+KPX quoteright r -40
+KPX quoteright racute -40
+KPX quoteright rcaron -40
+KPX quoteright rcommaaccent -40
+KPX quoteright s -60
+KPX quoteright sacute -60
+KPX quoteright scaron -60
+KPX quoteright scedilla -60
+KPX quoteright scommaaccent -60
+KPX quoteright space -80
+KPX quoteright v -20
+KPX r c -20
+KPX r cacute -20
+KPX r ccaron -20
+KPX r ccedilla -20
+KPX r comma -60
+KPX r d -20
+KPX r dcroat -20
+KPX r g -15
+KPX r gbreve -15
+KPX r gcommaaccent -15
+KPX r hyphen -20
+KPX r o -20
+KPX r oacute -20
+KPX r ocircumflex -20
+KPX r odieresis -20
+KPX r ograve -20
+KPX r ohungarumlaut -20
+KPX r omacron -20
+KPX r oslash -20
+KPX r otilde -20
+KPX r period -60
+KPX r q -20
+KPX r s -15
+KPX r sacute -15
+KPX r scaron -15
+KPX r scedilla -15
+KPX r scommaaccent -15
+KPX r t 20
+KPX r tcommaaccent 20
+KPX r v 10
+KPX r y 10
+KPX r yacute 10
+KPX r ydieresis 10
+KPX racute c -20
+KPX racute cacute -20
+KPX racute ccaron -20
+KPX racute ccedilla -20
+KPX racute comma -60
+KPX racute d -20
+KPX racute dcroat -20
+KPX racute g -15
+KPX racute gbreve -15
+KPX racute gcommaaccent -15
+KPX racute hyphen -20
+KPX racute o -20
+KPX racute oacute -20
+KPX racute ocircumflex -20
+KPX racute odieresis -20
+KPX racute ograve -20
+KPX racute ohungarumlaut -20
+KPX racute omacron -20
+KPX racute oslash -20
+KPX racute otilde -20
+KPX racute period -60
+KPX racute q -20
+KPX racute s -15
+KPX racute sacute -15
+KPX racute scaron -15
+KPX racute scedilla -15
+KPX racute scommaaccent -15
+KPX racute t 20
+KPX racute tcommaaccent 20
+KPX racute v 10
+KPX racute y 10
+KPX racute yacute 10
+KPX racute ydieresis 10
+KPX rcaron c -20
+KPX rcaron cacute -20
+KPX rcaron ccaron -20
+KPX rcaron ccedilla -20
+KPX rcaron comma -60
+KPX rcaron d -20
+KPX rcaron dcroat -20
+KPX rcaron g -15
+KPX rcaron gbreve -15
+KPX rcaron gcommaaccent -15
+KPX rcaron hyphen -20
+KPX rcaron o -20
+KPX rcaron oacute -20
+KPX rcaron ocircumflex -20
+KPX rcaron odieresis -20
+KPX rcaron ograve -20
+KPX rcaron ohungarumlaut -20
+KPX rcaron omacron -20
+KPX rcaron oslash -20
+KPX rcaron otilde -20
+KPX rcaron period -60
+KPX rcaron q -20
+KPX rcaron s -15
+KPX rcaron sacute -15
+KPX rcaron scaron -15
+KPX rcaron scedilla -15
+KPX rcaron scommaaccent -15
+KPX rcaron t 20
+KPX rcaron tcommaaccent 20
+KPX rcaron v 10
+KPX rcaron y 10
+KPX rcaron yacute 10
+KPX rcaron ydieresis 10
+KPX rcommaaccent c -20
+KPX rcommaaccent cacute -20
+KPX rcommaaccent ccaron -20
+KPX rcommaaccent ccedilla -20
+KPX rcommaaccent comma -60
+KPX rcommaaccent d -20
+KPX rcommaaccent dcroat -20
+KPX rcommaaccent g -15
+KPX rcommaaccent gbreve -15
+KPX rcommaaccent gcommaaccent -15
+KPX rcommaaccent hyphen -20
+KPX rcommaaccent o -20
+KPX rcommaaccent oacute -20
+KPX rcommaaccent ocircumflex -20
+KPX rcommaaccent odieresis -20
+KPX rcommaaccent ograve -20
+KPX rcommaaccent ohungarumlaut -20
+KPX rcommaaccent omacron -20
+KPX rcommaaccent oslash -20
+KPX rcommaaccent otilde -20
+KPX rcommaaccent period -60
+KPX rcommaaccent q -20
+KPX rcommaaccent s -15
+KPX rcommaaccent sacute -15
+KPX rcommaaccent scaron -15
+KPX rcommaaccent scedilla -15
+KPX rcommaaccent scommaaccent -15
+KPX rcommaaccent t 20
+KPX rcommaaccent tcommaaccent 20
+KPX rcommaaccent v 10
+KPX rcommaaccent y 10
+KPX rcommaaccent yacute 10
+KPX rcommaaccent ydieresis 10
+KPX s w -15
+KPX sacute w -15
+KPX scaron w -15
+KPX scedilla w -15
+KPX scommaaccent w -15
+KPX semicolon space -40
+KPX space T -100
+KPX space Tcaron -100
+KPX space Tcommaaccent -100
+KPX space V -80
+KPX space W -80
+KPX space Y -120
+KPX space Yacute -120
+KPX space Ydieresis -120
+KPX space quotedblleft -80
+KPX space quoteleft -60
+KPX v a -20
+KPX v aacute -20
+KPX v abreve -20
+KPX v acircumflex -20
+KPX v adieresis -20
+KPX v agrave -20
+KPX v amacron -20
+KPX v aogonek -20
+KPX v aring -20
+KPX v atilde -20
+KPX v comma -80
+KPX v o -30
+KPX v oacute -30
+KPX v ocircumflex -30
+KPX v odieresis -30
+KPX v ograve -30
+KPX v ohungarumlaut -30
+KPX v omacron -30
+KPX v oslash -30
+KPX v otilde -30
+KPX v period -80
+KPX w comma -40
+KPX w o -20
+KPX w oacute -20
+KPX w ocircumflex -20
+KPX w odieresis -20
+KPX w ograve -20
+KPX w ohungarumlaut -20
+KPX w omacron -20
+KPX w oslash -20
+KPX w otilde -20
+KPX w period -40
+KPX x e -10
+KPX x eacute -10
+KPX x ecaron -10
+KPX x ecircumflex -10
+KPX x edieresis -10
+KPX x edotaccent -10
+KPX x egrave -10
+KPX x emacron -10
+KPX x eogonek -10
+KPX y a -30
+KPX y aacute -30
+KPX y abreve -30
+KPX y acircumflex -30
+KPX y adieresis -30
+KPX y agrave -30
+KPX y amacron -30
+KPX y aogonek -30
+KPX y aring -30
+KPX y atilde -30
+KPX y comma -80
+KPX y e -10
+KPX y eacute -10
+KPX y ecaron -10
+KPX y ecircumflex -10
+KPX y edieresis -10
+KPX y edotaccent -10
+KPX y egrave -10
+KPX y emacron -10
+KPX y eogonek -10
+KPX y o -25
+KPX y oacute -25
+KPX y ocircumflex -25
+KPX y odieresis -25
+KPX y ograve -25
+KPX y ohungarumlaut -25
+KPX y omacron -25
+KPX y oslash -25
+KPX y otilde -25
+KPX y period -80
+KPX yacute a -30
+KPX yacute aacute -30
+KPX yacute abreve -30
+KPX yacute acircumflex -30
+KPX yacute adieresis -30
+KPX yacute agrave -30
+KPX yacute amacron -30
+KPX yacute aogonek -30
+KPX yacute aring -30
+KPX yacute atilde -30
+KPX yacute comma -80
+KPX yacute e -10
+KPX yacute eacute -10
+KPX yacute ecaron -10
+KPX yacute ecircumflex -10
+KPX yacute edieresis -10
+KPX yacute edotaccent -10
+KPX yacute egrave -10
+KPX yacute emacron -10
+KPX yacute eogonek -10
+KPX yacute o -25
+KPX yacute oacute -25
+KPX yacute ocircumflex -25
+KPX yacute odieresis -25
+KPX yacute ograve -25
+KPX yacute ohungarumlaut -25
+KPX yacute omacron -25
+KPX yacute oslash -25
+KPX yacute otilde -25
+KPX yacute period -80
+KPX ydieresis a -30
+KPX ydieresis aacute -30
+KPX ydieresis abreve -30
+KPX ydieresis acircumflex -30
+KPX ydieresis adieresis -30
+KPX ydieresis agrave -30
+KPX ydieresis amacron -30
+KPX ydieresis aogonek -30
+KPX ydieresis aring -30
+KPX ydieresis atilde -30
+KPX ydieresis comma -80
+KPX ydieresis e -10
+KPX ydieresis eacute -10
+KPX ydieresis ecaron -10
+KPX ydieresis ecircumflex -10
+KPX ydieresis edieresis -10
+KPX ydieresis edotaccent -10
+KPX ydieresis egrave -10
+KPX ydieresis emacron -10
+KPX ydieresis eogonek -10
+KPX ydieresis o -25
+KPX ydieresis oacute -25
+KPX ydieresis ocircumflex -25
+KPX ydieresis odieresis -25
+KPX ydieresis ograve -25
+KPX ydieresis ohungarumlaut -25
+KPX ydieresis omacron -25
+KPX ydieresis oslash -25
+KPX ydieresis otilde -25
+KPX ydieresis period -80
+KPX z e 10
+KPX z eacute 10
+KPX z ecaron 10
+KPX z ecircumflex 10
+KPX z edieresis 10
+KPX z edotaccent 10
+KPX z egrave 10
+KPX z emacron 10
+KPX z eogonek 10
+KPX zacute e 10
+KPX zacute eacute 10
+KPX zacute ecaron 10
+KPX zacute ecircumflex 10
+KPX zacute edieresis 10
+KPX zacute edotaccent 10
+KPX zacute egrave 10
+KPX zacute emacron 10
+KPX zacute eogonek 10
+KPX zcaron e 10
+KPX zcaron eacute 10
+KPX zcaron ecaron 10
+KPX zcaron ecircumflex 10
+KPX zcaron edieresis 10
+KPX zcaron edotaccent 10
+KPX zcaron egrave 10
+KPX zcaron emacron 10
+KPX zcaron eogonek 10
+KPX zdotaccent e 10
+KPX zdotaccent eacute 10
+KPX zdotaccent ecaron 10
+KPX zdotaccent ecircumflex 10
+KPX zdotaccent edieresis 10
+KPX zdotaccent edotaccent 10
+KPX zdotaccent egrave 10
+KPX zdotaccent emacron 10
+KPX zdotaccent eogonek 10
+EndKernPairs
+EndKernData
+EndFontMetrics
diff --git a/src/main/resources/Resources/afm/Helvetica-BoldOblique.afm b/src/main/resources/Resources/afm/Helvetica-BoldOblique.afm
new file mode 100644
index 0000000..16845ae
--- /dev/null
+++ b/src/main/resources/Resources/afm/Helvetica-BoldOblique.afm
@@ -0,0 +1,2827 @@
+StartFontMetrics 4.1
+Comment Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved.
+Comment Creation Date: Thu May 1 12:45:12 1997
+Comment UniqueID 43053
+Comment VMusage 14482 68586
+FontName Helvetica-BoldOblique
+FullName Helvetica Bold Oblique
+FamilyName Helvetica
+Weight Bold
+ItalicAngle -12
+IsFixedPitch false
+CharacterSet ExtendedRoman
+FontBBox -174 -228 1114 962
+UnderlinePosition -100
+UnderlineThickness 50
+Version 002.000
+Notice Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved.Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries.
+EncodingScheme AdobeStandardEncoding
+CapHeight 718
+XHeight 532
+Ascender 718
+Descender -207
+StdHW 118
+StdVW 140
+StartCharMetrics 315
+C 32 ; WX 278 ; N space ; B 0 0 0 0 ;
+C 33 ; WX 333 ; N exclam ; B 94 0 397 718 ;
+C 34 ; WX 474 ; N quotedbl ; B 193 447 529 718 ;
+C 35 ; WX 556 ; N numbersign ; B 60 0 644 698 ;
+C 36 ; WX 556 ; N dollar ; B 67 -115 622 775 ;
+C 37 ; WX 889 ; N percent ; B 136 -19 901 710 ;
+C 38 ; WX 722 ; N ampersand ; B 89 -19 732 718 ;
+C 39 ; WX 278 ; N quoteright ; B 167 445 362 718 ;
+C 40 ; WX 333 ; N parenleft ; B 76 -208 470 734 ;
+C 41 ; WX 333 ; N parenright ; B -25 -208 369 734 ;
+C 42 ; WX 389 ; N asterisk ; B 146 387 481 718 ;
+C 43 ; WX 584 ; N plus ; B 82 0 610 506 ;
+C 44 ; WX 278 ; N comma ; B 28 -168 245 146 ;
+C 45 ; WX 333 ; N hyphen ; B 73 215 379 345 ;
+C 46 ; WX 278 ; N period ; B 64 0 245 146 ;
+C 47 ; WX 278 ; N slash ; B -37 -19 468 737 ;
+C 48 ; WX 556 ; N zero ; B 86 -19 617 710 ;
+C 49 ; WX 556 ; N one ; B 173 0 529 710 ;
+C 50 ; WX 556 ; N two ; B 26 0 619 710 ;
+C 51 ; WX 556 ; N three ; B 65 -19 608 710 ;
+C 52 ; WX 556 ; N four ; B 60 0 598 710 ;
+C 53 ; WX 556 ; N five ; B 64 -19 636 698 ;
+C 54 ; WX 556 ; N six ; B 85 -19 619 710 ;
+C 55 ; WX 556 ; N seven ; B 125 0 676 698 ;
+C 56 ; WX 556 ; N eight ; B 69 -19 616 710 ;
+C 57 ; WX 556 ; N nine ; B 78 -19 615 710 ;
+C 58 ; WX 333 ; N colon ; B 92 0 351 512 ;
+C 59 ; WX 333 ; N semicolon ; B 56 -168 351 512 ;
+C 60 ; WX 584 ; N less ; B 82 -8 655 514 ;
+C 61 ; WX 584 ; N equal ; B 58 87 633 419 ;
+C 62 ; WX 584 ; N greater ; B 36 -8 609 514 ;
+C 63 ; WX 611 ; N question ; B 165 0 671 727 ;
+C 64 ; WX 975 ; N at ; B 186 -19 954 737 ;
+C 65 ; WX 722 ; N A ; B 20 0 702 718 ;
+C 66 ; WX 722 ; N B ; B 76 0 764 718 ;
+C 67 ; WX 722 ; N C ; B 107 -19 789 737 ;
+C 68 ; WX 722 ; N D ; B 76 0 777 718 ;
+C 69 ; WX 667 ; N E ; B 76 0 757 718 ;
+C 70 ; WX 611 ; N F ; B 76 0 740 718 ;
+C 71 ; WX 778 ; N G ; B 108 -19 817 737 ;
+C 72 ; WX 722 ; N H ; B 71 0 804 718 ;
+C 73 ; WX 278 ; N I ; B 64 0 367 718 ;
+C 74 ; WX 556 ; N J ; B 60 -18 637 718 ;
+C 75 ; WX 722 ; N K ; B 87 0 858 718 ;
+C 76 ; WX 611 ; N L ; B 76 0 611 718 ;
+C 77 ; WX 833 ; N M ; B 69 0 918 718 ;
+C 78 ; WX 722 ; N N ; B 69 0 807 718 ;
+C 79 ; WX 778 ; N O ; B 107 -19 823 737 ;
+C 80 ; WX 667 ; N P ; B 76 0 738 718 ;
+C 81 ; WX 778 ; N Q ; B 107 -52 823 737 ;
+C 82 ; WX 722 ; N R ; B 76 0 778 718 ;
+C 83 ; WX 667 ; N S ; B 81 -19 718 737 ;
+C 84 ; WX 611 ; N T ; B 140 0 751 718 ;
+C 85 ; WX 722 ; N U ; B 116 -19 804 718 ;
+C 86 ; WX 667 ; N V ; B 172 0 801 718 ;
+C 87 ; WX 944 ; N W ; B 169 0 1082 718 ;
+C 88 ; WX 667 ; N X ; B 14 0 791 718 ;
+C 89 ; WX 667 ; N Y ; B 168 0 806 718 ;
+C 90 ; WX 611 ; N Z ; B 25 0 737 718 ;
+C 91 ; WX 333 ; N bracketleft ; B 21 -196 462 722 ;
+C 92 ; WX 278 ; N backslash ; B 124 -19 307 737 ;
+C 93 ; WX 333 ; N bracketright ; B -18 -196 423 722 ;
+C 94 ; WX 584 ; N asciicircum ; B 131 323 591 698 ;
+C 95 ; WX 556 ; N underscore ; B -27 -125 540 -75 ;
+C 96 ; WX 278 ; N quoteleft ; B 165 454 361 727 ;
+C 97 ; WX 556 ; N a ; B 55 -14 583 546 ;
+C 98 ; WX 611 ; N b ; B 61 -14 645 718 ;
+C 99 ; WX 556 ; N c ; B 79 -14 599 546 ;
+C 100 ; WX 611 ; N d ; B 82 -14 704 718 ;
+C 101 ; WX 556 ; N e ; B 70 -14 593 546 ;
+C 102 ; WX 333 ; N f ; B 87 0 469 727 ; L i fi ; L l fl ;
+C 103 ; WX 611 ; N g ; B 38 -217 666 546 ;
+C 104 ; WX 611 ; N h ; B 65 0 629 718 ;
+C 105 ; WX 278 ; N i ; B 69 0 363 725 ;
+C 106 ; WX 278 ; N j ; B -42 -214 363 725 ;
+C 107 ; WX 556 ; N k ; B 69 0 670 718 ;
+C 108 ; WX 278 ; N l ; B 69 0 362 718 ;
+C 109 ; WX 889 ; N m ; B 64 0 909 546 ;
+C 110 ; WX 611 ; N n ; B 65 0 629 546 ;
+C 111 ; WX 611 ; N o ; B 82 -14 643 546 ;
+C 112 ; WX 611 ; N p ; B 18 -207 645 546 ;
+C 113 ; WX 611 ; N q ; B 80 -207 665 546 ;
+C 114 ; WX 389 ; N r ; B 64 0 489 546 ;
+C 115 ; WX 556 ; N s ; B 63 -14 584 546 ;
+C 116 ; WX 333 ; N t ; B 100 -6 422 676 ;
+C 117 ; WX 611 ; N u ; B 98 -14 658 532 ;
+C 118 ; WX 556 ; N v ; B 126 0 656 532 ;
+C 119 ; WX 778 ; N w ; B 123 0 882 532 ;
+C 120 ; WX 556 ; N x ; B 15 0 648 532 ;
+C 121 ; WX 556 ; N y ; B 42 -214 652 532 ;
+C 122 ; WX 500 ; N z ; B 20 0 583 532 ;
+C 123 ; WX 389 ; N braceleft ; B 94 -196 518 722 ;
+C 124 ; WX 280 ; N bar ; B 36 -225 361 775 ;
+C 125 ; WX 389 ; N braceright ; B -18 -196 407 722 ;
+C 126 ; WX 584 ; N asciitilde ; B 115 163 577 343 ;
+C 161 ; WX 333 ; N exclamdown ; B 50 -186 353 532 ;
+C 162 ; WX 556 ; N cent ; B 79 -118 599 628 ;
+C 163 ; WX 556 ; N sterling ; B 50 -16 635 718 ;
+C 164 ; WX 167 ; N fraction ; B -174 -19 487 710 ;
+C 165 ; WX 556 ; N yen ; B 60 0 713 698 ;
+C 166 ; WX 556 ; N florin ; B -50 -210 669 737 ;
+C 167 ; WX 556 ; N section ; B 61 -184 598 727 ;
+C 168 ; WX 556 ; N currency ; B 27 76 680 636 ;
+C 169 ; WX 238 ; N quotesingle ; B 165 447 321 718 ;
+C 170 ; WX 500 ; N quotedblleft ; B 160 454 588 727 ;
+C 171 ; WX 556 ; N guillemotleft ; B 135 76 571 484 ;
+C 172 ; WX 333 ; N guilsinglleft ; B 130 76 353 484 ;
+C 173 ; WX 333 ; N guilsinglright ; B 99 76 322 484 ;
+C 174 ; WX 611 ; N fi ; B 87 0 696 727 ;
+C 175 ; WX 611 ; N fl ; B 87 0 695 727 ;
+C 177 ; WX 556 ; N endash ; B 48 227 627 333 ;
+C 178 ; WX 556 ; N dagger ; B 118 -171 626 718 ;
+C 179 ; WX 556 ; N daggerdbl ; B 46 -171 628 718 ;
+C 180 ; WX 278 ; N periodcentered ; B 110 172 276 334 ;
+C 182 ; WX 556 ; N paragraph ; B 98 -191 688 700 ;
+C 183 ; WX 350 ; N bullet ; B 83 194 420 524 ;
+C 184 ; WX 278 ; N quotesinglbase ; B 41 -146 236 127 ;
+C 185 ; WX 500 ; N quotedblbase ; B 36 -146 463 127 ;
+C 186 ; WX 500 ; N quotedblright ; B 162 445 589 718 ;
+C 187 ; WX 556 ; N guillemotright ; B 104 76 540 484 ;
+C 188 ; WX 1000 ; N ellipsis ; B 92 0 939 146 ;
+C 189 ; WX 1000 ; N perthousand ; B 76 -19 1038 710 ;
+C 191 ; WX 611 ; N questiondown ; B 53 -195 559 532 ;
+C 193 ; WX 333 ; N grave ; B 136 604 353 750 ;
+C 194 ; WX 333 ; N acute ; B 236 604 515 750 ;
+C 195 ; WX 333 ; N circumflex ; B 118 604 471 750 ;
+C 196 ; WX 333 ; N tilde ; B 113 610 507 737 ;
+C 197 ; WX 333 ; N macron ; B 122 604 483 678 ;
+C 198 ; WX 333 ; N breve ; B 156 604 494 750 ;
+C 199 ; WX 333 ; N dotaccent ; B 235 614 385 729 ;
+C 200 ; WX 333 ; N dieresis ; B 137 614 482 729 ;
+C 202 ; WX 333 ; N ring ; B 200 568 420 776 ;
+C 203 ; WX 333 ; N cedilla ; B -37 -228 220 0 ;
+C 205 ; WX 333 ; N hungarumlaut ; B 137 604 645 750 ;
+C 206 ; WX 333 ; N ogonek ; B 41 -228 264 0 ;
+C 207 ; WX 333 ; N caron ; B 149 604 502 750 ;
+C 208 ; WX 1000 ; N emdash ; B 48 227 1071 333 ;
+C 225 ; WX 1000 ; N AE ; B 5 0 1100 718 ;
+C 227 ; WX 370 ; N ordfeminine ; B 125 401 465 737 ;
+C 232 ; WX 611 ; N Lslash ; B 34 0 611 718 ;
+C 233 ; WX 778 ; N Oslash ; B 35 -27 894 745 ;
+C 234 ; WX 1000 ; N OE ; B 99 -19 1114 737 ;
+C 235 ; WX 365 ; N ordmasculine ; B 123 401 485 737 ;
+C 241 ; WX 889 ; N ae ; B 56 -14 923 546 ;
+C 245 ; WX 278 ; N dotlessi ; B 69 0 322 532 ;
+C 248 ; WX 278 ; N lslash ; B 40 0 407 718 ;
+C 249 ; WX 611 ; N oslash ; B 22 -29 701 560 ;
+C 250 ; WX 944 ; N oe ; B 82 -14 977 546 ;
+C 251 ; WX 611 ; N germandbls ; B 69 -14 657 731 ;
+C -1 ; WX 278 ; N Idieresis ; B 64 0 494 915 ;
+C -1 ; WX 556 ; N eacute ; B 70 -14 627 750 ;
+C -1 ; WX 556 ; N abreve ; B 55 -14 606 750 ;
+C -1 ; WX 611 ; N uhungarumlaut ; B 98 -14 784 750 ;
+C -1 ; WX 556 ; N ecaron ; B 70 -14 614 750 ;
+C -1 ; WX 667 ; N Ydieresis ; B 168 0 806 915 ;
+C -1 ; WX 584 ; N divide ; B 82 -42 610 548 ;
+C -1 ; WX 667 ; N Yacute ; B 168 0 806 936 ;
+C -1 ; WX 722 ; N Acircumflex ; B 20 0 706 936 ;
+C -1 ; WX 556 ; N aacute ; B 55 -14 627 750 ;
+C -1 ; WX 722 ; N Ucircumflex ; B 116 -19 804 936 ;
+C -1 ; WX 556 ; N yacute ; B 42 -214 652 750 ;
+C -1 ; WX 556 ; N scommaaccent ; B 63 -228 584 546 ;
+C -1 ; WX 556 ; N ecircumflex ; B 70 -14 593 750 ;
+C -1 ; WX 722 ; N Uring ; B 116 -19 804 962 ;
+C -1 ; WX 722 ; N Udieresis ; B 116 -19 804 915 ;
+C -1 ; WX 556 ; N aogonek ; B 55 -224 583 546 ;
+C -1 ; WX 722 ; N Uacute ; B 116 -19 804 936 ;
+C -1 ; WX 611 ; N uogonek ; B 98 -228 658 532 ;
+C -1 ; WX 667 ; N Edieresis ; B 76 0 757 915 ;
+C -1 ; WX 722 ; N Dcroat ; B 62 0 777 718 ;
+C -1 ; WX 250 ; N commaaccent ; B 16 -228 188 -50 ;
+C -1 ; WX 737 ; N copyright ; B 56 -19 835 737 ;
+C -1 ; WX 667 ; N Emacron ; B 76 0 757 864 ;
+C -1 ; WX 556 ; N ccaron ; B 79 -14 614 750 ;
+C -1 ; WX 556 ; N aring ; B 55 -14 583 776 ;
+C -1 ; WX 722 ; N Ncommaaccent ; B 69 -228 807 718 ;
+C -1 ; WX 278 ; N lacute ; B 69 0 528 936 ;
+C -1 ; WX 556 ; N agrave ; B 55 -14 583 750 ;
+C -1 ; WX 611 ; N Tcommaaccent ; B 140 -228 751 718 ;
+C -1 ; WX 722 ; N Cacute ; B 107 -19 789 936 ;
+C -1 ; WX 556 ; N atilde ; B 55 -14 619 737 ;
+C -1 ; WX 667 ; N Edotaccent ; B 76 0 757 915 ;
+C -1 ; WX 556 ; N scaron ; B 63 -14 614 750 ;
+C -1 ; WX 556 ; N scedilla ; B 63 -228 584 546 ;
+C -1 ; WX 278 ; N iacute ; B 69 0 488 750 ;
+C -1 ; WX 494 ; N lozenge ; B 90 0 564 745 ;
+C -1 ; WX 722 ; N Rcaron ; B 76 0 778 936 ;
+C -1 ; WX 778 ; N Gcommaaccent ; B 108 -228 817 737 ;
+C -1 ; WX 611 ; N ucircumflex ; B 98 -14 658 750 ;
+C -1 ; WX 556 ; N acircumflex ; B 55 -14 583 750 ;
+C -1 ; WX 722 ; N Amacron ; B 20 0 718 864 ;
+C -1 ; WX 389 ; N rcaron ; B 64 0 530 750 ;
+C -1 ; WX 556 ; N ccedilla ; B 79 -228 599 546 ;
+C -1 ; WX 611 ; N Zdotaccent ; B 25 0 737 915 ;
+C -1 ; WX 667 ; N Thorn ; B 76 0 716 718 ;
+C -1 ; WX 778 ; N Omacron ; B 107 -19 823 864 ;
+C -1 ; WX 722 ; N Racute ; B 76 0 778 936 ;
+C -1 ; WX 667 ; N Sacute ; B 81 -19 722 936 ;
+C -1 ; WX 743 ; N dcaron ; B 82 -14 903 718 ;
+C -1 ; WX 722 ; N Umacron ; B 116 -19 804 864 ;
+C -1 ; WX 611 ; N uring ; B 98 -14 658 776 ;
+C -1 ; WX 333 ; N threesuperior ; B 91 271 441 710 ;
+C -1 ; WX 778 ; N Ograve ; B 107 -19 823 936 ;
+C -1 ; WX 722 ; N Agrave ; B 20 0 702 936 ;
+C -1 ; WX 722 ; N Abreve ; B 20 0 729 936 ;
+C -1 ; WX 584 ; N multiply ; B 57 1 635 505 ;
+C -1 ; WX 611 ; N uacute ; B 98 -14 658 750 ;
+C -1 ; WX 611 ; N Tcaron ; B 140 0 751 936 ;
+C -1 ; WX 494 ; N partialdiff ; B 43 -21 585 750 ;
+C -1 ; WX 556 ; N ydieresis ; B 42 -214 652 729 ;
+C -1 ; WX 722 ; N Nacute ; B 69 0 807 936 ;
+C -1 ; WX 278 ; N icircumflex ; B 69 0 444 750 ;
+C -1 ; WX 667 ; N Ecircumflex ; B 76 0 757 936 ;
+C -1 ; WX 556 ; N adieresis ; B 55 -14 594 729 ;
+C -1 ; WX 556 ; N edieresis ; B 70 -14 594 729 ;
+C -1 ; WX 556 ; N cacute ; B 79 -14 627 750 ;
+C -1 ; WX 611 ; N nacute ; B 65 0 654 750 ;
+C -1 ; WX 611 ; N umacron ; B 98 -14 658 678 ;
+C -1 ; WX 722 ; N Ncaron ; B 69 0 807 936 ;
+C -1 ; WX 278 ; N Iacute ; B 64 0 528 936 ;
+C -1 ; WX 584 ; N plusminus ; B 40 0 625 506 ;
+C -1 ; WX 280 ; N brokenbar ; B 52 -150 345 700 ;
+C -1 ; WX 737 ; N registered ; B 55 -19 834 737 ;
+C -1 ; WX 778 ; N Gbreve ; B 108 -19 817 936 ;
+C -1 ; WX 278 ; N Idotaccent ; B 64 0 397 915 ;
+C -1 ; WX 600 ; N summation ; B 14 -10 670 706 ;
+C -1 ; WX 667 ; N Egrave ; B 76 0 757 936 ;
+C -1 ; WX 389 ; N racute ; B 64 0 543 750 ;
+C -1 ; WX 611 ; N omacron ; B 82 -14 643 678 ;
+C -1 ; WX 611 ; N Zacute ; B 25 0 737 936 ;
+C -1 ; WX 611 ; N Zcaron ; B 25 0 737 936 ;
+C -1 ; WX 549 ; N greaterequal ; B 26 0 629 704 ;
+C -1 ; WX 722 ; N Eth ; B 62 0 777 718 ;
+C -1 ; WX 722 ; N Ccedilla ; B 107 -228 789 737 ;
+C -1 ; WX 278 ; N lcommaaccent ; B 30 -228 362 718 ;
+C -1 ; WX 389 ; N tcaron ; B 100 -6 608 878 ;
+C -1 ; WX 556 ; N eogonek ; B 70 -228 593 546 ;
+C -1 ; WX 722 ; N Uogonek ; B 116 -228 804 718 ;
+C -1 ; WX 722 ; N Aacute ; B 20 0 750 936 ;
+C -1 ; WX 722 ; N Adieresis ; B 20 0 716 915 ;
+C -1 ; WX 556 ; N egrave ; B 70 -14 593 750 ;
+C -1 ; WX 500 ; N zacute ; B 20 0 599 750 ;
+C -1 ; WX 278 ; N iogonek ; B -14 -224 363 725 ;
+C -1 ; WX 778 ; N Oacute ; B 107 -19 823 936 ;
+C -1 ; WX 611 ; N oacute ; B 82 -14 654 750 ;
+C -1 ; WX 556 ; N amacron ; B 55 -14 595 678 ;
+C -1 ; WX 556 ; N sacute ; B 63 -14 627 750 ;
+C -1 ; WX 278 ; N idieresis ; B 69 0 455 729 ;
+C -1 ; WX 778 ; N Ocircumflex ; B 107 -19 823 936 ;
+C -1 ; WX 722 ; N Ugrave ; B 116 -19 804 936 ;
+C -1 ; WX 612 ; N Delta ; B 6 0 608 688 ;
+C -1 ; WX 611 ; N thorn ; B 18 -208 645 718 ;
+C -1 ; WX 333 ; N twosuperior ; B 69 283 449 710 ;
+C -1 ; WX 778 ; N Odieresis ; B 107 -19 823 915 ;
+C -1 ; WX 611 ; N mu ; B 22 -207 658 532 ;
+C -1 ; WX 278 ; N igrave ; B 69 0 326 750 ;
+C -1 ; WX 611 ; N ohungarumlaut ; B 82 -14 784 750 ;
+C -1 ; WX 667 ; N Eogonek ; B 76 -224 757 718 ;
+C -1 ; WX 611 ; N dcroat ; B 82 -14 789 718 ;
+C -1 ; WX 834 ; N threequarters ; B 99 -19 839 710 ;
+C -1 ; WX 667 ; N Scedilla ; B 81 -228 718 737 ;
+C -1 ; WX 400 ; N lcaron ; B 69 0 561 718 ;
+C -1 ; WX 722 ; N Kcommaaccent ; B 87 -228 858 718 ;
+C -1 ; WX 611 ; N Lacute ; B 76 0 611 936 ;
+C -1 ; WX 1000 ; N trademark ; B 179 306 1109 718 ;
+C -1 ; WX 556 ; N edotaccent ; B 70 -14 593 729 ;
+C -1 ; WX 278 ; N Igrave ; B 64 0 367 936 ;
+C -1 ; WX 278 ; N Imacron ; B 64 0 496 864 ;
+C -1 ; WX 611 ; N Lcaron ; B 76 0 643 718 ;
+C -1 ; WX 834 ; N onehalf ; B 132 -19 858 710 ;
+C -1 ; WX 549 ; N lessequal ; B 29 0 676 704 ;
+C -1 ; WX 611 ; N ocircumflex ; B 82 -14 643 750 ;
+C -1 ; WX 611 ; N ntilde ; B 65 0 646 737 ;
+C -1 ; WX 722 ; N Uhungarumlaut ; B 116 -19 880 936 ;
+C -1 ; WX 667 ; N Eacute ; B 76 0 757 936 ;
+C -1 ; WX 556 ; N emacron ; B 70 -14 595 678 ;
+C -1 ; WX 611 ; N gbreve ; B 38 -217 666 750 ;
+C -1 ; WX 834 ; N onequarter ; B 132 -19 806 710 ;
+C -1 ; WX 667 ; N Scaron ; B 81 -19 718 936 ;
+C -1 ; WX 667 ; N Scommaaccent ; B 81 -228 718 737 ;
+C -1 ; WX 778 ; N Ohungarumlaut ; B 107 -19 908 936 ;
+C -1 ; WX 400 ; N degree ; B 175 426 467 712 ;
+C -1 ; WX 611 ; N ograve ; B 82 -14 643 750 ;
+C -1 ; WX 722 ; N Ccaron ; B 107 -19 789 936 ;
+C -1 ; WX 611 ; N ugrave ; B 98 -14 658 750 ;
+C -1 ; WX 549 ; N radical ; B 112 -46 689 850 ;
+C -1 ; WX 722 ; N Dcaron ; B 76 0 777 936 ;
+C -1 ; WX 389 ; N rcommaaccent ; B 26 -228 489 546 ;
+C -1 ; WX 722 ; N Ntilde ; B 69 0 807 923 ;
+C -1 ; WX 611 ; N otilde ; B 82 -14 646 737 ;
+C -1 ; WX 722 ; N Rcommaaccent ; B 76 -228 778 718 ;
+C -1 ; WX 611 ; N Lcommaaccent ; B 76 -228 611 718 ;
+C -1 ; WX 722 ; N Atilde ; B 20 0 741 923 ;
+C -1 ; WX 722 ; N Aogonek ; B 20 -224 702 718 ;
+C -1 ; WX 722 ; N Aring ; B 20 0 702 962 ;
+C -1 ; WX 778 ; N Otilde ; B 107 -19 823 923 ;
+C -1 ; WX 500 ; N zdotaccent ; B 20 0 583 729 ;
+C -1 ; WX 667 ; N Ecaron ; B 76 0 757 936 ;
+C -1 ; WX 278 ; N Iogonek ; B -41 -228 367 718 ;
+C -1 ; WX 556 ; N kcommaaccent ; B 69 -228 670 718 ;
+C -1 ; WX 584 ; N minus ; B 82 197 610 309 ;
+C -1 ; WX 278 ; N Icircumflex ; B 64 0 484 936 ;
+C -1 ; WX 611 ; N ncaron ; B 65 0 641 750 ;
+C -1 ; WX 333 ; N tcommaaccent ; B 58 -228 422 676 ;
+C -1 ; WX 584 ; N logicalnot ; B 105 108 633 419 ;
+C -1 ; WX 611 ; N odieresis ; B 82 -14 643 729 ;
+C -1 ; WX 611 ; N udieresis ; B 98 -14 658 729 ;
+C -1 ; WX 549 ; N notequal ; B 32 -49 630 570 ;
+C -1 ; WX 611 ; N gcommaaccent ; B 38 -217 666 850 ;
+C -1 ; WX 611 ; N eth ; B 82 -14 670 737 ;
+C -1 ; WX 500 ; N zcaron ; B 20 0 586 750 ;
+C -1 ; WX 611 ; N ncommaaccent ; B 65 -228 629 546 ;
+C -1 ; WX 333 ; N onesuperior ; B 148 283 388 710 ;
+C -1 ; WX 278 ; N imacron ; B 69 0 429 678 ;
+C -1 ; WX 556 ; N Euro ; B 0 0 0 0 ;
+EndCharMetrics
+StartKernData
+StartKernPairs 2481
+KPX A C -40
+KPX A Cacute -40
+KPX A Ccaron -40
+KPX A Ccedilla -40
+KPX A G -50
+KPX A Gbreve -50
+KPX A Gcommaaccent -50
+KPX A O -40
+KPX A Oacute -40
+KPX A Ocircumflex -40
+KPX A Odieresis -40
+KPX A Ograve -40
+KPX A Ohungarumlaut -40
+KPX A Omacron -40
+KPX A Oslash -40
+KPX A Otilde -40
+KPX A Q -40
+KPX A T -90
+KPX A Tcaron -90
+KPX A Tcommaaccent -90
+KPX A U -50
+KPX A Uacute -50
+KPX A Ucircumflex -50
+KPX A Udieresis -50
+KPX A Ugrave -50
+KPX A Uhungarumlaut -50
+KPX A Umacron -50
+KPX A Uogonek -50
+KPX A Uring -50
+KPX A V -80
+KPX A W -60
+KPX A Y -110
+KPX A Yacute -110
+KPX A Ydieresis -110
+KPX A u -30
+KPX A uacute -30
+KPX A ucircumflex -30
+KPX A udieresis -30
+KPX A ugrave -30
+KPX A uhungarumlaut -30
+KPX A umacron -30
+KPX A uogonek -30
+KPX A uring -30
+KPX A v -40
+KPX A w -30
+KPX A y -30
+KPX A yacute -30
+KPX A ydieresis -30
+KPX Aacute C -40
+KPX Aacute Cacute -40
+KPX Aacute Ccaron -40
+KPX Aacute Ccedilla -40
+KPX Aacute G -50
+KPX Aacute Gbreve -50
+KPX Aacute Gcommaaccent -50
+KPX Aacute O -40
+KPX Aacute Oacute -40
+KPX Aacute Ocircumflex -40
+KPX Aacute Odieresis -40
+KPX Aacute Ograve -40
+KPX Aacute Ohungarumlaut -40
+KPX Aacute Omacron -40
+KPX Aacute Oslash -40
+KPX Aacute Otilde -40
+KPX Aacute Q -40
+KPX Aacute T -90
+KPX Aacute Tcaron -90
+KPX Aacute Tcommaaccent -90
+KPX Aacute U -50
+KPX Aacute Uacute -50
+KPX Aacute Ucircumflex -50
+KPX Aacute Udieresis -50
+KPX Aacute Ugrave -50
+KPX Aacute Uhungarumlaut -50
+KPX Aacute Umacron -50
+KPX Aacute Uogonek -50
+KPX Aacute Uring -50
+KPX Aacute V -80
+KPX Aacute W -60
+KPX Aacute Y -110
+KPX Aacute Yacute -110
+KPX Aacute Ydieresis -110
+KPX Aacute u -30
+KPX Aacute uacute -30
+KPX Aacute ucircumflex -30
+KPX Aacute udieresis -30
+KPX Aacute ugrave -30
+KPX Aacute uhungarumlaut -30
+KPX Aacute umacron -30
+KPX Aacute uogonek -30
+KPX Aacute uring -30
+KPX Aacute v -40
+KPX Aacute w -30
+KPX Aacute y -30
+KPX Aacute yacute -30
+KPX Aacute ydieresis -30
+KPX Abreve C -40
+KPX Abreve Cacute -40
+KPX Abreve Ccaron -40
+KPX Abreve Ccedilla -40
+KPX Abreve G -50
+KPX Abreve Gbreve -50
+KPX Abreve Gcommaaccent -50
+KPX Abreve O -40
+KPX Abreve Oacute -40
+KPX Abreve Ocircumflex -40
+KPX Abreve Odieresis -40
+KPX Abreve Ograve -40
+KPX Abreve Ohungarumlaut -40
+KPX Abreve Omacron -40
+KPX Abreve Oslash -40
+KPX Abreve Otilde -40
+KPX Abreve Q -40
+KPX Abreve T -90
+KPX Abreve Tcaron -90
+KPX Abreve Tcommaaccent -90
+KPX Abreve U -50
+KPX Abreve Uacute -50
+KPX Abreve Ucircumflex -50
+KPX Abreve Udieresis -50
+KPX Abreve Ugrave -50
+KPX Abreve Uhungarumlaut -50
+KPX Abreve Umacron -50
+KPX Abreve Uogonek -50
+KPX Abreve Uring -50
+KPX Abreve V -80
+KPX Abreve W -60
+KPX Abreve Y -110
+KPX Abreve Yacute -110
+KPX Abreve Ydieresis -110
+KPX Abreve u -30
+KPX Abreve uacute -30
+KPX Abreve ucircumflex -30
+KPX Abreve udieresis -30
+KPX Abreve ugrave -30
+KPX Abreve uhungarumlaut -30
+KPX Abreve umacron -30
+KPX Abreve uogonek -30
+KPX Abreve uring -30
+KPX Abreve v -40
+KPX Abreve w -30
+KPX Abreve y -30
+KPX Abreve yacute -30
+KPX Abreve ydieresis -30
+KPX Acircumflex C -40
+KPX Acircumflex Cacute -40
+KPX Acircumflex Ccaron -40
+KPX Acircumflex Ccedilla -40
+KPX Acircumflex G -50
+KPX Acircumflex Gbreve -50
+KPX Acircumflex Gcommaaccent -50
+KPX Acircumflex O -40
+KPX Acircumflex Oacute -40
+KPX Acircumflex Ocircumflex -40
+KPX Acircumflex Odieresis -40
+KPX Acircumflex Ograve -40
+KPX Acircumflex Ohungarumlaut -40
+KPX Acircumflex Omacron -40
+KPX Acircumflex Oslash -40
+KPX Acircumflex Otilde -40
+KPX Acircumflex Q -40
+KPX Acircumflex T -90
+KPX Acircumflex Tcaron -90
+KPX Acircumflex Tcommaaccent -90
+KPX Acircumflex U -50
+KPX Acircumflex Uacute -50
+KPX Acircumflex Ucircumflex -50
+KPX Acircumflex Udieresis -50
+KPX Acircumflex Ugrave -50
+KPX Acircumflex Uhungarumlaut -50
+KPX Acircumflex Umacron -50
+KPX Acircumflex Uogonek -50
+KPX Acircumflex Uring -50
+KPX Acircumflex V -80
+KPX Acircumflex W -60
+KPX Acircumflex Y -110
+KPX Acircumflex Yacute -110
+KPX Acircumflex Ydieresis -110
+KPX Acircumflex u -30
+KPX Acircumflex uacute -30
+KPX Acircumflex ucircumflex -30
+KPX Acircumflex udieresis -30
+KPX Acircumflex ugrave -30
+KPX Acircumflex uhungarumlaut -30
+KPX Acircumflex umacron -30
+KPX Acircumflex uogonek -30
+KPX Acircumflex uring -30
+KPX Acircumflex v -40
+KPX Acircumflex w -30
+KPX Acircumflex y -30
+KPX Acircumflex yacute -30
+KPX Acircumflex ydieresis -30
+KPX Adieresis C -40
+KPX Adieresis Cacute -40
+KPX Adieresis Ccaron -40
+KPX Adieresis Ccedilla -40
+KPX Adieresis G -50
+KPX Adieresis Gbreve -50
+KPX Adieresis Gcommaaccent -50
+KPX Adieresis O -40
+KPX Adieresis Oacute -40
+KPX Adieresis Ocircumflex -40
+KPX Adieresis Odieresis -40
+KPX Adieresis Ograve -40
+KPX Adieresis Ohungarumlaut -40
+KPX Adieresis Omacron -40
+KPX Adieresis Oslash -40
+KPX Adieresis Otilde -40
+KPX Adieresis Q -40
+KPX Adieresis T -90
+KPX Adieresis Tcaron -90
+KPX Adieresis Tcommaaccent -90
+KPX Adieresis U -50
+KPX Adieresis Uacute -50
+KPX Adieresis Ucircumflex -50
+KPX Adieresis Udieresis -50
+KPX Adieresis Ugrave -50
+KPX Adieresis Uhungarumlaut -50
+KPX Adieresis Umacron -50
+KPX Adieresis Uogonek -50
+KPX Adieresis Uring -50
+KPX Adieresis V -80
+KPX Adieresis W -60
+KPX Adieresis Y -110
+KPX Adieresis Yacute -110
+KPX Adieresis Ydieresis -110
+KPX Adieresis u -30
+KPX Adieresis uacute -30
+KPX Adieresis ucircumflex -30
+KPX Adieresis udieresis -30
+KPX Adieresis ugrave -30
+KPX Adieresis uhungarumlaut -30
+KPX Adieresis umacron -30
+KPX Adieresis uogonek -30
+KPX Adieresis uring -30
+KPX Adieresis v -40
+KPX Adieresis w -30
+KPX Adieresis y -30
+KPX Adieresis yacute -30
+KPX Adieresis ydieresis -30
+KPX Agrave C -40
+KPX Agrave Cacute -40
+KPX Agrave Ccaron -40
+KPX Agrave Ccedilla -40
+KPX Agrave G -50
+KPX Agrave Gbreve -50
+KPX Agrave Gcommaaccent -50
+KPX Agrave O -40
+KPX Agrave Oacute -40
+KPX Agrave Ocircumflex -40
+KPX Agrave Odieresis -40
+KPX Agrave Ograve -40
+KPX Agrave Ohungarumlaut -40
+KPX Agrave Omacron -40
+KPX Agrave Oslash -40
+KPX Agrave Otilde -40
+KPX Agrave Q -40
+KPX Agrave T -90
+KPX Agrave Tcaron -90
+KPX Agrave Tcommaaccent -90
+KPX Agrave U -50
+KPX Agrave Uacute -50
+KPX Agrave Ucircumflex -50
+KPX Agrave Udieresis -50
+KPX Agrave Ugrave -50
+KPX Agrave Uhungarumlaut -50
+KPX Agrave Umacron -50
+KPX Agrave Uogonek -50
+KPX Agrave Uring -50
+KPX Agrave V -80
+KPX Agrave W -60
+KPX Agrave Y -110
+KPX Agrave Yacute -110
+KPX Agrave Ydieresis -110
+KPX Agrave u -30
+KPX Agrave uacute -30
+KPX Agrave ucircumflex -30
+KPX Agrave udieresis -30
+KPX Agrave ugrave -30
+KPX Agrave uhungarumlaut -30
+KPX Agrave umacron -30
+KPX Agrave uogonek -30
+KPX Agrave uring -30
+KPX Agrave v -40
+KPX Agrave w -30
+KPX Agrave y -30
+KPX Agrave yacute -30
+KPX Agrave ydieresis -30
+KPX Amacron C -40
+KPX Amacron Cacute -40
+KPX Amacron Ccaron -40
+KPX Amacron Ccedilla -40
+KPX Amacron G -50
+KPX Amacron Gbreve -50
+KPX Amacron Gcommaaccent -50
+KPX Amacron O -40
+KPX Amacron Oacute -40
+KPX Amacron Ocircumflex -40
+KPX Amacron Odieresis -40
+KPX Amacron Ograve -40
+KPX Amacron Ohungarumlaut -40
+KPX Amacron Omacron -40
+KPX Amacron Oslash -40
+KPX Amacron Otilde -40
+KPX Amacron Q -40
+KPX Amacron T -90
+KPX Amacron Tcaron -90
+KPX Amacron Tcommaaccent -90
+KPX Amacron U -50
+KPX Amacron Uacute -50
+KPX Amacron Ucircumflex -50
+KPX Amacron Udieresis -50
+KPX Amacron Ugrave -50
+KPX Amacron Uhungarumlaut -50
+KPX Amacron Umacron -50
+KPX Amacron Uogonek -50
+KPX Amacron Uring -50
+KPX Amacron V -80
+KPX Amacron W -60
+KPX Amacron Y -110
+KPX Amacron Yacute -110
+KPX Amacron Ydieresis -110
+KPX Amacron u -30
+KPX Amacron uacute -30
+KPX Amacron ucircumflex -30
+KPX Amacron udieresis -30
+KPX Amacron ugrave -30
+KPX Amacron uhungarumlaut -30
+KPX Amacron umacron -30
+KPX Amacron uogonek -30
+KPX Amacron uring -30
+KPX Amacron v -40
+KPX Amacron w -30
+KPX Amacron y -30
+KPX Amacron yacute -30
+KPX Amacron ydieresis -30
+KPX Aogonek C -40
+KPX Aogonek Cacute -40
+KPX Aogonek Ccaron -40
+KPX Aogonek Ccedilla -40
+KPX Aogonek G -50
+KPX Aogonek Gbreve -50
+KPX Aogonek Gcommaaccent -50
+KPX Aogonek O -40
+KPX Aogonek Oacute -40
+KPX Aogonek Ocircumflex -40
+KPX Aogonek Odieresis -40
+KPX Aogonek Ograve -40
+KPX Aogonek Ohungarumlaut -40
+KPX Aogonek Omacron -40
+KPX Aogonek Oslash -40
+KPX Aogonek Otilde -40
+KPX Aogonek Q -40
+KPX Aogonek T -90
+KPX Aogonek Tcaron -90
+KPX Aogonek Tcommaaccent -90
+KPX Aogonek U -50
+KPX Aogonek Uacute -50
+KPX Aogonek Ucircumflex -50
+KPX Aogonek Udieresis -50
+KPX Aogonek Ugrave -50
+KPX Aogonek Uhungarumlaut -50
+KPX Aogonek Umacron -50
+KPX Aogonek Uogonek -50
+KPX Aogonek Uring -50
+KPX Aogonek V -80
+KPX Aogonek W -60
+KPX Aogonek Y -110
+KPX Aogonek Yacute -110
+KPX Aogonek Ydieresis -110
+KPX Aogonek u -30
+KPX Aogonek uacute -30
+KPX Aogonek ucircumflex -30
+KPX Aogonek udieresis -30
+KPX Aogonek ugrave -30
+KPX Aogonek uhungarumlaut -30
+KPX Aogonek umacron -30
+KPX Aogonek uogonek -30
+KPX Aogonek uring -30
+KPX Aogonek v -40
+KPX Aogonek w -30
+KPX Aogonek y -30
+KPX Aogonek yacute -30
+KPX Aogonek ydieresis -30
+KPX Aring C -40
+KPX Aring Cacute -40
+KPX Aring Ccaron -40
+KPX Aring Ccedilla -40
+KPX Aring G -50
+KPX Aring Gbreve -50
+KPX Aring Gcommaaccent -50
+KPX Aring O -40
+KPX Aring Oacute -40
+KPX Aring Ocircumflex -40
+KPX Aring Odieresis -40
+KPX Aring Ograve -40
+KPX Aring Ohungarumlaut -40
+KPX Aring Omacron -40
+KPX Aring Oslash -40
+KPX Aring Otilde -40
+KPX Aring Q -40
+KPX Aring T -90
+KPX Aring Tcaron -90
+KPX Aring Tcommaaccent -90
+KPX Aring U -50
+KPX Aring Uacute -50
+KPX Aring Ucircumflex -50
+KPX Aring Udieresis -50
+KPX Aring Ugrave -50
+KPX Aring Uhungarumlaut -50
+KPX Aring Umacron -50
+KPX Aring Uogonek -50
+KPX Aring Uring -50
+KPX Aring V -80
+KPX Aring W -60
+KPX Aring Y -110
+KPX Aring Yacute -110
+KPX Aring Ydieresis -110
+KPX Aring u -30
+KPX Aring uacute -30
+KPX Aring ucircumflex -30
+KPX Aring udieresis -30
+KPX Aring ugrave -30
+KPX Aring uhungarumlaut -30
+KPX Aring umacron -30
+KPX Aring uogonek -30
+KPX Aring uring -30
+KPX Aring v -40
+KPX Aring w -30
+KPX Aring y -30
+KPX Aring yacute -30
+KPX Aring ydieresis -30
+KPX Atilde C -40
+KPX Atilde Cacute -40
+KPX Atilde Ccaron -40
+KPX Atilde Ccedilla -40
+KPX Atilde G -50
+KPX Atilde Gbreve -50
+KPX Atilde Gcommaaccent -50
+KPX Atilde O -40
+KPX Atilde Oacute -40
+KPX Atilde Ocircumflex -40
+KPX Atilde Odieresis -40
+KPX Atilde Ograve -40
+KPX Atilde Ohungarumlaut -40
+KPX Atilde Omacron -40
+KPX Atilde Oslash -40
+KPX Atilde Otilde -40
+KPX Atilde Q -40
+KPX Atilde T -90
+KPX Atilde Tcaron -90
+KPX Atilde Tcommaaccent -90
+KPX Atilde U -50
+KPX Atilde Uacute -50
+KPX Atilde Ucircumflex -50
+KPX Atilde Udieresis -50
+KPX Atilde Ugrave -50
+KPX Atilde Uhungarumlaut -50
+KPX Atilde Umacron -50
+KPX Atilde Uogonek -50
+KPX Atilde Uring -50
+KPX Atilde V -80
+KPX Atilde W -60
+KPX Atilde Y -110
+KPX Atilde Yacute -110
+KPX Atilde Ydieresis -110
+KPX Atilde u -30
+KPX Atilde uacute -30
+KPX Atilde ucircumflex -30
+KPX Atilde udieresis -30
+KPX Atilde ugrave -30
+KPX Atilde uhungarumlaut -30
+KPX Atilde umacron -30
+KPX Atilde uogonek -30
+KPX Atilde uring -30
+KPX Atilde v -40
+KPX Atilde w -30
+KPX Atilde y -30
+KPX Atilde yacute -30
+KPX Atilde ydieresis -30
+KPX B A -30
+KPX B Aacute -30
+KPX B Abreve -30
+KPX B Acircumflex -30
+KPX B Adieresis -30
+KPX B Agrave -30
+KPX B Amacron -30
+KPX B Aogonek -30
+KPX B Aring -30
+KPX B Atilde -30
+KPX B U -10
+KPX B Uacute -10
+KPX B Ucircumflex -10
+KPX B Udieresis -10
+KPX B Ugrave -10
+KPX B Uhungarumlaut -10
+KPX B Umacron -10
+KPX B Uogonek -10
+KPX B Uring -10
+KPX D A -40
+KPX D Aacute -40
+KPX D Abreve -40
+KPX D Acircumflex -40
+KPX D Adieresis -40
+KPX D Agrave -40
+KPX D Amacron -40
+KPX D Aogonek -40
+KPX D Aring -40
+KPX D Atilde -40
+KPX D V -40
+KPX D W -40
+KPX D Y -70
+KPX D Yacute -70
+KPX D Ydieresis -70
+KPX D comma -30
+KPX D period -30
+KPX Dcaron A -40
+KPX Dcaron Aacute -40
+KPX Dcaron Abreve -40
+KPX Dcaron Acircumflex -40
+KPX Dcaron Adieresis -40
+KPX Dcaron Agrave -40
+KPX Dcaron Amacron -40
+KPX Dcaron Aogonek -40
+KPX Dcaron Aring -40
+KPX Dcaron Atilde -40
+KPX Dcaron V -40
+KPX Dcaron W -40
+KPX Dcaron Y -70
+KPX Dcaron Yacute -70
+KPX Dcaron Ydieresis -70
+KPX Dcaron comma -30
+KPX Dcaron period -30
+KPX Dcroat A -40
+KPX Dcroat Aacute -40
+KPX Dcroat Abreve -40
+KPX Dcroat Acircumflex -40
+KPX Dcroat Adieresis -40
+KPX Dcroat Agrave -40
+KPX Dcroat Amacron -40
+KPX Dcroat Aogonek -40
+KPX Dcroat Aring -40
+KPX Dcroat Atilde -40
+KPX Dcroat V -40
+KPX Dcroat W -40
+KPX Dcroat Y -70
+KPX Dcroat Yacute -70
+KPX Dcroat Ydieresis -70
+KPX Dcroat comma -30
+KPX Dcroat period -30
+KPX F A -80
+KPX F Aacute -80
+KPX F Abreve -80
+KPX F Acircumflex -80
+KPX F Adieresis -80
+KPX F Agrave -80
+KPX F Amacron -80
+KPX F Aogonek -80
+KPX F Aring -80
+KPX F Atilde -80
+KPX F a -20
+KPX F aacute -20
+KPX F abreve -20
+KPX F acircumflex -20
+KPX F adieresis -20
+KPX F agrave -20
+KPX F amacron -20
+KPX F aogonek -20
+KPX F aring -20
+KPX F atilde -20
+KPX F comma -100
+KPX F period -100
+KPX J A -20
+KPX J Aacute -20
+KPX J Abreve -20
+KPX J Acircumflex -20
+KPX J Adieresis -20
+KPX J Agrave -20
+KPX J Amacron -20
+KPX J Aogonek -20
+KPX J Aring -20
+KPX J Atilde -20
+KPX J comma -20
+KPX J period -20
+KPX J u -20
+KPX J uacute -20
+KPX J ucircumflex -20
+KPX J udieresis -20
+KPX J ugrave -20
+KPX J uhungarumlaut -20
+KPX J umacron -20
+KPX J uogonek -20
+KPX J uring -20
+KPX K O -30
+KPX K Oacute -30
+KPX K Ocircumflex -30
+KPX K Odieresis -30
+KPX K Ograve -30
+KPX K Ohungarumlaut -30
+KPX K Omacron -30
+KPX K Oslash -30
+KPX K Otilde -30
+KPX K e -15
+KPX K eacute -15
+KPX K ecaron -15
+KPX K ecircumflex -15
+KPX K edieresis -15
+KPX K edotaccent -15
+KPX K egrave -15
+KPX K emacron -15
+KPX K eogonek -15
+KPX K o -35
+KPX K oacute -35
+KPX K ocircumflex -35
+KPX K odieresis -35
+KPX K ograve -35
+KPX K ohungarumlaut -35
+KPX K omacron -35
+KPX K oslash -35
+KPX K otilde -35
+KPX K u -30
+KPX K uacute -30
+KPX K ucircumflex -30
+KPX K udieresis -30
+KPX K ugrave -30
+KPX K uhungarumlaut -30
+KPX K umacron -30
+KPX K uogonek -30
+KPX K uring -30
+KPX K y -40
+KPX K yacute -40
+KPX K ydieresis -40
+KPX Kcommaaccent O -30
+KPX Kcommaaccent Oacute -30
+KPX Kcommaaccent Ocircumflex -30
+KPX Kcommaaccent Odieresis -30
+KPX Kcommaaccent Ograve -30
+KPX Kcommaaccent Ohungarumlaut -30
+KPX Kcommaaccent Omacron -30
+KPX Kcommaaccent Oslash -30
+KPX Kcommaaccent Otilde -30
+KPX Kcommaaccent e -15
+KPX Kcommaaccent eacute -15
+KPX Kcommaaccent ecaron -15
+KPX Kcommaaccent ecircumflex -15
+KPX Kcommaaccent edieresis -15
+KPX Kcommaaccent edotaccent -15
+KPX Kcommaaccent egrave -15
+KPX Kcommaaccent emacron -15
+KPX Kcommaaccent eogonek -15
+KPX Kcommaaccent o -35
+KPX Kcommaaccent oacute -35
+KPX Kcommaaccent ocircumflex -35
+KPX Kcommaaccent odieresis -35
+KPX Kcommaaccent ograve -35
+KPX Kcommaaccent ohungarumlaut -35
+KPX Kcommaaccent omacron -35
+KPX Kcommaaccent oslash -35
+KPX Kcommaaccent otilde -35
+KPX Kcommaaccent u -30
+KPX Kcommaaccent uacute -30
+KPX Kcommaaccent ucircumflex -30
+KPX Kcommaaccent udieresis -30
+KPX Kcommaaccent ugrave -30
+KPX Kcommaaccent uhungarumlaut -30
+KPX Kcommaaccent umacron -30
+KPX Kcommaaccent uogonek -30
+KPX Kcommaaccent uring -30
+KPX Kcommaaccent y -40
+KPX Kcommaaccent yacute -40
+KPX Kcommaaccent ydieresis -40
+KPX L T -90
+KPX L Tcaron -90
+KPX L Tcommaaccent -90
+KPX L V -110
+KPX L W -80
+KPX L Y -120
+KPX L Yacute -120
+KPX L Ydieresis -120
+KPX L quotedblright -140
+KPX L quoteright -140
+KPX L y -30
+KPX L yacute -30
+KPX L ydieresis -30
+KPX Lacute T -90
+KPX Lacute Tcaron -90
+KPX Lacute Tcommaaccent -90
+KPX Lacute V -110
+KPX Lacute W -80
+KPX Lacute Y -120
+KPX Lacute Yacute -120
+KPX Lacute Ydieresis -120
+KPX Lacute quotedblright -140
+KPX Lacute quoteright -140
+KPX Lacute y -30
+KPX Lacute yacute -30
+KPX Lacute ydieresis -30
+KPX Lcommaaccent T -90
+KPX Lcommaaccent Tcaron -90
+KPX Lcommaaccent Tcommaaccent -90
+KPX Lcommaaccent V -110
+KPX Lcommaaccent W -80
+KPX Lcommaaccent Y -120
+KPX Lcommaaccent Yacute -120
+KPX Lcommaaccent Ydieresis -120
+KPX Lcommaaccent quotedblright -140
+KPX Lcommaaccent quoteright -140
+KPX Lcommaaccent y -30
+KPX Lcommaaccent yacute -30
+KPX Lcommaaccent ydieresis -30
+KPX Lslash T -90
+KPX Lslash Tcaron -90
+KPX Lslash Tcommaaccent -90
+KPX Lslash V -110
+KPX Lslash W -80
+KPX Lslash Y -120
+KPX Lslash Yacute -120
+KPX Lslash Ydieresis -120
+KPX Lslash quotedblright -140
+KPX Lslash quoteright -140
+KPX Lslash y -30
+KPX Lslash yacute -30
+KPX Lslash ydieresis -30
+KPX O A -50
+KPX O Aacute -50
+KPX O Abreve -50
+KPX O Acircumflex -50
+KPX O Adieresis -50
+KPX O Agrave -50
+KPX O Amacron -50
+KPX O Aogonek -50
+KPX O Aring -50
+KPX O Atilde -50
+KPX O T -40
+KPX O Tcaron -40
+KPX O Tcommaaccent -40
+KPX O V -50
+KPX O W -50
+KPX O X -50
+KPX O Y -70
+KPX O Yacute -70
+KPX O Ydieresis -70
+KPX O comma -40
+KPX O period -40
+KPX Oacute A -50
+KPX Oacute Aacute -50
+KPX Oacute Abreve -50
+KPX Oacute Acircumflex -50
+KPX Oacute Adieresis -50
+KPX Oacute Agrave -50
+KPX Oacute Amacron -50
+KPX Oacute Aogonek -50
+KPX Oacute Aring -50
+KPX Oacute Atilde -50
+KPX Oacute T -40
+KPX Oacute Tcaron -40
+KPX Oacute Tcommaaccent -40
+KPX Oacute V -50
+KPX Oacute W -50
+KPX Oacute X -50
+KPX Oacute Y -70
+KPX Oacute Yacute -70
+KPX Oacute Ydieresis -70
+KPX Oacute comma -40
+KPX Oacute period -40
+KPX Ocircumflex A -50
+KPX Ocircumflex Aacute -50
+KPX Ocircumflex Abreve -50
+KPX Ocircumflex Acircumflex -50
+KPX Ocircumflex Adieresis -50
+KPX Ocircumflex Agrave -50
+KPX Ocircumflex Amacron -50
+KPX Ocircumflex Aogonek -50
+KPX Ocircumflex Aring -50
+KPX Ocircumflex Atilde -50
+KPX Ocircumflex T -40
+KPX Ocircumflex Tcaron -40
+KPX Ocircumflex Tcommaaccent -40
+KPX Ocircumflex V -50
+KPX Ocircumflex W -50
+KPX Ocircumflex X -50
+KPX Ocircumflex Y -70
+KPX Ocircumflex Yacute -70
+KPX Ocircumflex Ydieresis -70
+KPX Ocircumflex comma -40
+KPX Ocircumflex period -40
+KPX Odieresis A -50
+KPX Odieresis Aacute -50
+KPX Odieresis Abreve -50
+KPX Odieresis Acircumflex -50
+KPX Odieresis Adieresis -50
+KPX Odieresis Agrave -50
+KPX Odieresis Amacron -50
+KPX Odieresis Aogonek -50
+KPX Odieresis Aring -50
+KPX Odieresis Atilde -50
+KPX Odieresis T -40
+KPX Odieresis Tcaron -40
+KPX Odieresis Tcommaaccent -40
+KPX Odieresis V -50
+KPX Odieresis W -50
+KPX Odieresis X -50
+KPX Odieresis Y -70
+KPX Odieresis Yacute -70
+KPX Odieresis Ydieresis -70
+KPX Odieresis comma -40
+KPX Odieresis period -40
+KPX Ograve A -50
+KPX Ograve Aacute -50
+KPX Ograve Abreve -50
+KPX Ograve Acircumflex -50
+KPX Ograve Adieresis -50
+KPX Ograve Agrave -50
+KPX Ograve Amacron -50
+KPX Ograve Aogonek -50
+KPX Ograve Aring -50
+KPX Ograve Atilde -50
+KPX Ograve T -40
+KPX Ograve Tcaron -40
+KPX Ograve Tcommaaccent -40
+KPX Ograve V -50
+KPX Ograve W -50
+KPX Ograve X -50
+KPX Ograve Y -70
+KPX Ograve Yacute -70
+KPX Ograve Ydieresis -70
+KPX Ograve comma -40
+KPX Ograve period -40
+KPX Ohungarumlaut A -50
+KPX Ohungarumlaut Aacute -50
+KPX Ohungarumlaut Abreve -50
+KPX Ohungarumlaut Acircumflex -50
+KPX Ohungarumlaut Adieresis -50
+KPX Ohungarumlaut Agrave -50
+KPX Ohungarumlaut Amacron -50
+KPX Ohungarumlaut Aogonek -50
+KPX Ohungarumlaut Aring -50
+KPX Ohungarumlaut Atilde -50
+KPX Ohungarumlaut T -40
+KPX Ohungarumlaut Tcaron -40
+KPX Ohungarumlaut Tcommaaccent -40
+KPX Ohungarumlaut V -50
+KPX Ohungarumlaut W -50
+KPX Ohungarumlaut X -50
+KPX Ohungarumlaut Y -70
+KPX Ohungarumlaut Yacute -70
+KPX Ohungarumlaut Ydieresis -70
+KPX Ohungarumlaut comma -40
+KPX Ohungarumlaut period -40
+KPX Omacron A -50
+KPX Omacron Aacute -50
+KPX Omacron Abreve -50
+KPX Omacron Acircumflex -50
+KPX Omacron Adieresis -50
+KPX Omacron Agrave -50
+KPX Omacron Amacron -50
+KPX Omacron Aogonek -50
+KPX Omacron Aring -50
+KPX Omacron Atilde -50
+KPX Omacron T -40
+KPX Omacron Tcaron -40
+KPX Omacron Tcommaaccent -40
+KPX Omacron V -50
+KPX Omacron W -50
+KPX Omacron X -50
+KPX Omacron Y -70
+KPX Omacron Yacute -70
+KPX Omacron Ydieresis -70
+KPX Omacron comma -40
+KPX Omacron period -40
+KPX Oslash A -50
+KPX Oslash Aacute -50
+KPX Oslash Abreve -50
+KPX Oslash Acircumflex -50
+KPX Oslash Adieresis -50
+KPX Oslash Agrave -50
+KPX Oslash Amacron -50
+KPX Oslash Aogonek -50
+KPX Oslash Aring -50
+KPX Oslash Atilde -50
+KPX Oslash T -40
+KPX Oslash Tcaron -40
+KPX Oslash Tcommaaccent -40
+KPX Oslash V -50
+KPX Oslash W -50
+KPX Oslash X -50
+KPX Oslash Y -70
+KPX Oslash Yacute -70
+KPX Oslash Ydieresis -70
+KPX Oslash comma -40
+KPX Oslash period -40
+KPX Otilde A -50
+KPX Otilde Aacute -50
+KPX Otilde Abreve -50
+KPX Otilde Acircumflex -50
+KPX Otilde Adieresis -50
+KPX Otilde Agrave -50
+KPX Otilde Amacron -50
+KPX Otilde Aogonek -50
+KPX Otilde Aring -50
+KPX Otilde Atilde -50
+KPX Otilde T -40
+KPX Otilde Tcaron -40
+KPX Otilde Tcommaaccent -40
+KPX Otilde V -50
+KPX Otilde W -50
+KPX Otilde X -50
+KPX Otilde Y -70
+KPX Otilde Yacute -70
+KPX Otilde Ydieresis -70
+KPX Otilde comma -40
+KPX Otilde period -40
+KPX P A -100
+KPX P Aacute -100
+KPX P Abreve -100
+KPX P Acircumflex -100
+KPX P Adieresis -100
+KPX P Agrave -100
+KPX P Amacron -100
+KPX P Aogonek -100
+KPX P Aring -100
+KPX P Atilde -100
+KPX P a -30
+KPX P aacute -30
+KPX P abreve -30
+KPX P acircumflex -30
+KPX P adieresis -30
+KPX P agrave -30
+KPX P amacron -30
+KPX P aogonek -30
+KPX P aring -30
+KPX P atilde -30
+KPX P comma -120
+KPX P e -30
+KPX P eacute -30
+KPX P ecaron -30
+KPX P ecircumflex -30
+KPX P edieresis -30
+KPX P edotaccent -30
+KPX P egrave -30
+KPX P emacron -30
+KPX P eogonek -30
+KPX P o -40
+KPX P oacute -40
+KPX P ocircumflex -40
+KPX P odieresis -40
+KPX P ograve -40
+KPX P ohungarumlaut -40
+KPX P omacron -40
+KPX P oslash -40
+KPX P otilde -40
+KPX P period -120
+KPX Q U -10
+KPX Q Uacute -10
+KPX Q Ucircumflex -10
+KPX Q Udieresis -10
+KPX Q Ugrave -10
+KPX Q Uhungarumlaut -10
+KPX Q Umacron -10
+KPX Q Uogonek -10
+KPX Q Uring -10
+KPX Q comma 20
+KPX Q period 20
+KPX R O -20
+KPX R Oacute -20
+KPX R Ocircumflex -20
+KPX R Odieresis -20
+KPX R Ograve -20
+KPX R Ohungarumlaut -20
+KPX R Omacron -20
+KPX R Oslash -20
+KPX R Otilde -20
+KPX R T -20
+KPX R Tcaron -20
+KPX R Tcommaaccent -20
+KPX R U -20
+KPX R Uacute -20
+KPX R Ucircumflex -20
+KPX R Udieresis -20
+KPX R Ugrave -20
+KPX R Uhungarumlaut -20
+KPX R Umacron -20
+KPX R Uogonek -20
+KPX R Uring -20
+KPX R V -50
+KPX R W -40
+KPX R Y -50
+KPX R Yacute -50
+KPX R Ydieresis -50
+KPX Racute O -20
+KPX Racute Oacute -20
+KPX Racute Ocircumflex -20
+KPX Racute Odieresis -20
+KPX Racute Ograve -20
+KPX Racute Ohungarumlaut -20
+KPX Racute Omacron -20
+KPX Racute Oslash -20
+KPX Racute Otilde -20
+KPX Racute T -20
+KPX Racute Tcaron -20
+KPX Racute Tcommaaccent -20
+KPX Racute U -20
+KPX Racute Uacute -20
+KPX Racute Ucircumflex -20
+KPX Racute Udieresis -20
+KPX Racute Ugrave -20
+KPX Racute Uhungarumlaut -20
+KPX Racute Umacron -20
+KPX Racute Uogonek -20
+KPX Racute Uring -20
+KPX Racute V -50
+KPX Racute W -40
+KPX Racute Y -50
+KPX Racute Yacute -50
+KPX Racute Ydieresis -50
+KPX Rcaron O -20
+KPX Rcaron Oacute -20
+KPX Rcaron Ocircumflex -20
+KPX Rcaron Odieresis -20
+KPX Rcaron Ograve -20
+KPX Rcaron Ohungarumlaut -20
+KPX Rcaron Omacron -20
+KPX Rcaron Oslash -20
+KPX Rcaron Otilde -20
+KPX Rcaron T -20
+KPX Rcaron Tcaron -20
+KPX Rcaron Tcommaaccent -20
+KPX Rcaron U -20
+KPX Rcaron Uacute -20
+KPX Rcaron Ucircumflex -20
+KPX Rcaron Udieresis -20
+KPX Rcaron Ugrave -20
+KPX Rcaron Uhungarumlaut -20
+KPX Rcaron Umacron -20
+KPX Rcaron Uogonek -20
+KPX Rcaron Uring -20
+KPX Rcaron V -50
+KPX Rcaron W -40
+KPX Rcaron Y -50
+KPX Rcaron Yacute -50
+KPX Rcaron Ydieresis -50
+KPX Rcommaaccent O -20
+KPX Rcommaaccent Oacute -20
+KPX Rcommaaccent Ocircumflex -20
+KPX Rcommaaccent Odieresis -20
+KPX Rcommaaccent Ograve -20
+KPX Rcommaaccent Ohungarumlaut -20
+KPX Rcommaaccent Omacron -20
+KPX Rcommaaccent Oslash -20
+KPX Rcommaaccent Otilde -20
+KPX Rcommaaccent T -20
+KPX Rcommaaccent Tcaron -20
+KPX Rcommaaccent Tcommaaccent -20
+KPX Rcommaaccent U -20
+KPX Rcommaaccent Uacute -20
+KPX Rcommaaccent Ucircumflex -20
+KPX Rcommaaccent Udieresis -20
+KPX Rcommaaccent Ugrave -20
+KPX Rcommaaccent Uhungarumlaut -20
+KPX Rcommaaccent Umacron -20
+KPX Rcommaaccent Uogonek -20
+KPX Rcommaaccent Uring -20
+KPX Rcommaaccent V -50
+KPX Rcommaaccent W -40
+KPX Rcommaaccent Y -50
+KPX Rcommaaccent Yacute -50
+KPX Rcommaaccent Ydieresis -50
+KPX T A -90
+KPX T Aacute -90
+KPX T Abreve -90
+KPX T Acircumflex -90
+KPX T Adieresis -90
+KPX T Agrave -90
+KPX T Amacron -90
+KPX T Aogonek -90
+KPX T Aring -90
+KPX T Atilde -90
+KPX T O -40
+KPX T Oacute -40
+KPX T Ocircumflex -40
+KPX T Odieresis -40
+KPX T Ograve -40
+KPX T Ohungarumlaut -40
+KPX T Omacron -40
+KPX T Oslash -40
+KPX T Otilde -40
+KPX T a -80
+KPX T aacute -80
+KPX T abreve -80
+KPX T acircumflex -80
+KPX T adieresis -80
+KPX T agrave -80
+KPX T amacron -80
+KPX T aogonek -80
+KPX T aring -80
+KPX T atilde -80
+KPX T colon -40
+KPX T comma -80
+KPX T e -60
+KPX T eacute -60
+KPX T ecaron -60
+KPX T ecircumflex -60
+KPX T edieresis -60
+KPX T edotaccent -60
+KPX T egrave -60
+KPX T emacron -60
+KPX T eogonek -60
+KPX T hyphen -120
+KPX T o -80
+KPX T oacute -80
+KPX T ocircumflex -80
+KPX T odieresis -80
+KPX T ograve -80
+KPX T ohungarumlaut -80
+KPX T omacron -80
+KPX T oslash -80
+KPX T otilde -80
+KPX T period -80
+KPX T r -80
+KPX T racute -80
+KPX T rcommaaccent -80
+KPX T semicolon -40
+KPX T u -90
+KPX T uacute -90
+KPX T ucircumflex -90
+KPX T udieresis -90
+KPX T ugrave -90
+KPX T uhungarumlaut -90
+KPX T umacron -90
+KPX T uogonek -90
+KPX T uring -90
+KPX T w -60
+KPX T y -60
+KPX T yacute -60
+KPX T ydieresis -60
+KPX Tcaron A -90
+KPX Tcaron Aacute -90
+KPX Tcaron Abreve -90
+KPX Tcaron Acircumflex -90
+KPX Tcaron Adieresis -90
+KPX Tcaron Agrave -90
+KPX Tcaron Amacron -90
+KPX Tcaron Aogonek -90
+KPX Tcaron Aring -90
+KPX Tcaron Atilde -90
+KPX Tcaron O -40
+KPX Tcaron Oacute -40
+KPX Tcaron Ocircumflex -40
+KPX Tcaron Odieresis -40
+KPX Tcaron Ograve -40
+KPX Tcaron Ohungarumlaut -40
+KPX Tcaron Omacron -40
+KPX Tcaron Oslash -40
+KPX Tcaron Otilde -40
+KPX Tcaron a -80
+KPX Tcaron aacute -80
+KPX Tcaron abreve -80
+KPX Tcaron acircumflex -80
+KPX Tcaron adieresis -80
+KPX Tcaron agrave -80
+KPX Tcaron amacron -80
+KPX Tcaron aogonek -80
+KPX Tcaron aring -80
+KPX Tcaron atilde -80
+KPX Tcaron colon -40
+KPX Tcaron comma -80
+KPX Tcaron e -60
+KPX Tcaron eacute -60
+KPX Tcaron ecaron -60
+KPX Tcaron ecircumflex -60
+KPX Tcaron edieresis -60
+KPX Tcaron edotaccent -60
+KPX Tcaron egrave -60
+KPX Tcaron emacron -60
+KPX Tcaron eogonek -60
+KPX Tcaron hyphen -120
+KPX Tcaron o -80
+KPX Tcaron oacute -80
+KPX Tcaron ocircumflex -80
+KPX Tcaron odieresis -80
+KPX Tcaron ograve -80
+KPX Tcaron ohungarumlaut -80
+KPX Tcaron omacron -80
+KPX Tcaron oslash -80
+KPX Tcaron otilde -80
+KPX Tcaron period -80
+KPX Tcaron r -80
+KPX Tcaron racute -80
+KPX Tcaron rcommaaccent -80
+KPX Tcaron semicolon -40
+KPX Tcaron u -90
+KPX Tcaron uacute -90
+KPX Tcaron ucircumflex -90
+KPX Tcaron udieresis -90
+KPX Tcaron ugrave -90
+KPX Tcaron uhungarumlaut -90
+KPX Tcaron umacron -90
+KPX Tcaron uogonek -90
+KPX Tcaron uring -90
+KPX Tcaron w -60
+KPX Tcaron y -60
+KPX Tcaron yacute -60
+KPX Tcaron ydieresis -60
+KPX Tcommaaccent A -90
+KPX Tcommaaccent Aacute -90
+KPX Tcommaaccent Abreve -90
+KPX Tcommaaccent Acircumflex -90
+KPX Tcommaaccent Adieresis -90
+KPX Tcommaaccent Agrave -90
+KPX Tcommaaccent Amacron -90
+KPX Tcommaaccent Aogonek -90
+KPX Tcommaaccent Aring -90
+KPX Tcommaaccent Atilde -90
+KPX Tcommaaccent O -40
+KPX Tcommaaccent Oacute -40
+KPX Tcommaaccent Ocircumflex -40
+KPX Tcommaaccent Odieresis -40
+KPX Tcommaaccent Ograve -40
+KPX Tcommaaccent Ohungarumlaut -40
+KPX Tcommaaccent Omacron -40
+KPX Tcommaaccent Oslash -40
+KPX Tcommaaccent Otilde -40
+KPX Tcommaaccent a -80
+KPX Tcommaaccent aacute -80
+KPX Tcommaaccent abreve -80
+KPX Tcommaaccent acircumflex -80
+KPX Tcommaaccent adieresis -80
+KPX Tcommaaccent agrave -80
+KPX Tcommaaccent amacron -80
+KPX Tcommaaccent aogonek -80
+KPX Tcommaaccent aring -80
+KPX Tcommaaccent atilde -80
+KPX Tcommaaccent colon -40
+KPX Tcommaaccent comma -80
+KPX Tcommaaccent e -60
+KPX Tcommaaccent eacute -60
+KPX Tcommaaccent ecaron -60
+KPX Tcommaaccent ecircumflex -60
+KPX Tcommaaccent edieresis -60
+KPX Tcommaaccent edotaccent -60
+KPX Tcommaaccent egrave -60
+KPX Tcommaaccent emacron -60
+KPX Tcommaaccent eogonek -60
+KPX Tcommaaccent hyphen -120
+KPX Tcommaaccent o -80
+KPX Tcommaaccent oacute -80
+KPX Tcommaaccent ocircumflex -80
+KPX Tcommaaccent odieresis -80
+KPX Tcommaaccent ograve -80
+KPX Tcommaaccent ohungarumlaut -80
+KPX Tcommaaccent omacron -80
+KPX Tcommaaccent oslash -80
+KPX Tcommaaccent otilde -80
+KPX Tcommaaccent period -80
+KPX Tcommaaccent r -80
+KPX Tcommaaccent racute -80
+KPX Tcommaaccent rcommaaccent -80
+KPX Tcommaaccent semicolon -40
+KPX Tcommaaccent u -90
+KPX Tcommaaccent uacute -90
+KPX Tcommaaccent ucircumflex -90
+KPX Tcommaaccent udieresis -90
+KPX Tcommaaccent ugrave -90
+KPX Tcommaaccent uhungarumlaut -90
+KPX Tcommaaccent umacron -90
+KPX Tcommaaccent uogonek -90
+KPX Tcommaaccent uring -90
+KPX Tcommaaccent w -60
+KPX Tcommaaccent y -60
+KPX Tcommaaccent yacute -60
+KPX Tcommaaccent ydieresis -60
+KPX U A -50
+KPX U Aacute -50
+KPX U Abreve -50
+KPX U Acircumflex -50
+KPX U Adieresis -50
+KPX U Agrave -50
+KPX U Amacron -50
+KPX U Aogonek -50
+KPX U Aring -50
+KPX U Atilde -50
+KPX U comma -30
+KPX U period -30
+KPX Uacute A -50
+KPX Uacute Aacute -50
+KPX Uacute Abreve -50
+KPX Uacute Acircumflex -50
+KPX Uacute Adieresis -50
+KPX Uacute Agrave -50
+KPX Uacute Amacron -50
+KPX Uacute Aogonek -50
+KPX Uacute Aring -50
+KPX Uacute Atilde -50
+KPX Uacute comma -30
+KPX Uacute period -30
+KPX Ucircumflex A -50
+KPX Ucircumflex Aacute -50
+KPX Ucircumflex Abreve -50
+KPX Ucircumflex Acircumflex -50
+KPX Ucircumflex Adieresis -50
+KPX Ucircumflex Agrave -50
+KPX Ucircumflex Amacron -50
+KPX Ucircumflex Aogonek -50
+KPX Ucircumflex Aring -50
+KPX Ucircumflex Atilde -50
+KPX Ucircumflex comma -30
+KPX Ucircumflex period -30
+KPX Udieresis A -50
+KPX Udieresis Aacute -50
+KPX Udieresis Abreve -50
+KPX Udieresis Acircumflex -50
+KPX Udieresis Adieresis -50
+KPX Udieresis Agrave -50
+KPX Udieresis Amacron -50
+KPX Udieresis Aogonek -50
+KPX Udieresis Aring -50
+KPX Udieresis Atilde -50
+KPX Udieresis comma -30
+KPX Udieresis period -30
+KPX Ugrave A -50
+KPX Ugrave Aacute -50
+KPX Ugrave Abreve -50
+KPX Ugrave Acircumflex -50
+KPX Ugrave Adieresis -50
+KPX Ugrave Agrave -50
+KPX Ugrave Amacron -50
+KPX Ugrave Aogonek -50
+KPX Ugrave Aring -50
+KPX Ugrave Atilde -50
+KPX Ugrave comma -30
+KPX Ugrave period -30
+KPX Uhungarumlaut A -50
+KPX Uhungarumlaut Aacute -50
+KPX Uhungarumlaut Abreve -50
+KPX Uhungarumlaut Acircumflex -50
+KPX Uhungarumlaut Adieresis -50
+KPX Uhungarumlaut Agrave -50
+KPX Uhungarumlaut Amacron -50
+KPX Uhungarumlaut Aogonek -50
+KPX Uhungarumlaut Aring -50
+KPX Uhungarumlaut Atilde -50
+KPX Uhungarumlaut comma -30
+KPX Uhungarumlaut period -30
+KPX Umacron A -50
+KPX Umacron Aacute -50
+KPX Umacron Abreve -50
+KPX Umacron Acircumflex -50
+KPX Umacron Adieresis -50
+KPX Umacron Agrave -50
+KPX Umacron Amacron -50
+KPX Umacron Aogonek -50
+KPX Umacron Aring -50
+KPX Umacron Atilde -50
+KPX Umacron comma -30
+KPX Umacron period -30
+KPX Uogonek A -50
+KPX Uogonek Aacute -50
+KPX Uogonek Abreve -50
+KPX Uogonek Acircumflex -50
+KPX Uogonek Adieresis -50
+KPX Uogonek Agrave -50
+KPX Uogonek Amacron -50
+KPX Uogonek Aogonek -50
+KPX Uogonek Aring -50
+KPX Uogonek Atilde -50
+KPX Uogonek comma -30
+KPX Uogonek period -30
+KPX Uring A -50
+KPX Uring Aacute -50
+KPX Uring Abreve -50
+KPX Uring Acircumflex -50
+KPX Uring Adieresis -50
+KPX Uring Agrave -50
+KPX Uring Amacron -50
+KPX Uring Aogonek -50
+KPX Uring Aring -50
+KPX Uring Atilde -50
+KPX Uring comma -30
+KPX Uring period -30
+KPX V A -80
+KPX V Aacute -80
+KPX V Abreve -80
+KPX V Acircumflex -80
+KPX V Adieresis -80
+KPX V Agrave -80
+KPX V Amacron -80
+KPX V Aogonek -80
+KPX V Aring -80
+KPX V Atilde -80
+KPX V G -50
+KPX V Gbreve -50
+KPX V Gcommaaccent -50
+KPX V O -50
+KPX V Oacute -50
+KPX V Ocircumflex -50
+KPX V Odieresis -50
+KPX V Ograve -50
+KPX V Ohungarumlaut -50
+KPX V Omacron -50
+KPX V Oslash -50
+KPX V Otilde -50
+KPX V a -60
+KPX V aacute -60
+KPX V abreve -60
+KPX V acircumflex -60
+KPX V adieresis -60
+KPX V agrave -60
+KPX V amacron -60
+KPX V aogonek -60
+KPX V aring -60
+KPX V atilde -60
+KPX V colon -40
+KPX V comma -120
+KPX V e -50
+KPX V eacute -50
+KPX V ecaron -50
+KPX V ecircumflex -50
+KPX V edieresis -50
+KPX V edotaccent -50
+KPX V egrave -50
+KPX V emacron -50
+KPX V eogonek -50
+KPX V hyphen -80
+KPX V o -90
+KPX V oacute -90
+KPX V ocircumflex -90
+KPX V odieresis -90
+KPX V ograve -90
+KPX V ohungarumlaut -90
+KPX V omacron -90
+KPX V oslash -90
+KPX V otilde -90
+KPX V period -120
+KPX V semicolon -40
+KPX V u -60
+KPX V uacute -60
+KPX V ucircumflex -60
+KPX V udieresis -60
+KPX V ugrave -60
+KPX V uhungarumlaut -60
+KPX V umacron -60
+KPX V uogonek -60
+KPX V uring -60
+KPX W A -60
+KPX W Aacute -60
+KPX W Abreve -60
+KPX W Acircumflex -60
+KPX W Adieresis -60
+KPX W Agrave -60
+KPX W Amacron -60
+KPX W Aogonek -60
+KPX W Aring -60
+KPX W Atilde -60
+KPX W O -20
+KPX W Oacute -20
+KPX W Ocircumflex -20
+KPX W Odieresis -20
+KPX W Ograve -20
+KPX W Ohungarumlaut -20
+KPX W Omacron -20
+KPX W Oslash -20
+KPX W Otilde -20
+KPX W a -40
+KPX W aacute -40
+KPX W abreve -40
+KPX W acircumflex -40
+KPX W adieresis -40
+KPX W agrave -40
+KPX W amacron -40
+KPX W aogonek -40
+KPX W aring -40
+KPX W atilde -40
+KPX W colon -10
+KPX W comma -80
+KPX W e -35
+KPX W eacute -35
+KPX W ecaron -35
+KPX W ecircumflex -35
+KPX W edieresis -35
+KPX W edotaccent -35
+KPX W egrave -35
+KPX W emacron -35
+KPX W eogonek -35
+KPX W hyphen -40
+KPX W o -60
+KPX W oacute -60
+KPX W ocircumflex -60
+KPX W odieresis -60
+KPX W ograve -60
+KPX W ohungarumlaut -60
+KPX W omacron -60
+KPX W oslash -60
+KPX W otilde -60
+KPX W period -80
+KPX W semicolon -10
+KPX W u -45
+KPX W uacute -45
+KPX W ucircumflex -45
+KPX W udieresis -45
+KPX W ugrave -45
+KPX W uhungarumlaut -45
+KPX W umacron -45
+KPX W uogonek -45
+KPX W uring -45
+KPX W y -20
+KPX W yacute -20
+KPX W ydieresis -20
+KPX Y A -110
+KPX Y Aacute -110
+KPX Y Abreve -110
+KPX Y Acircumflex -110
+KPX Y Adieresis -110
+KPX Y Agrave -110
+KPX Y Amacron -110
+KPX Y Aogonek -110
+KPX Y Aring -110
+KPX Y Atilde -110
+KPX Y O -70
+KPX Y Oacute -70
+KPX Y Ocircumflex -70
+KPX Y Odieresis -70
+KPX Y Ograve -70
+KPX Y Ohungarumlaut -70
+KPX Y Omacron -70
+KPX Y Oslash -70
+KPX Y Otilde -70
+KPX Y a -90
+KPX Y aacute -90
+KPX Y abreve -90
+KPX Y acircumflex -90
+KPX Y adieresis -90
+KPX Y agrave -90
+KPX Y amacron -90
+KPX Y aogonek -90
+KPX Y aring -90
+KPX Y atilde -90
+KPX Y colon -50
+KPX Y comma -100
+KPX Y e -80
+KPX Y eacute -80
+KPX Y ecaron -80
+KPX Y ecircumflex -80
+KPX Y edieresis -80
+KPX Y edotaccent -80
+KPX Y egrave -80
+KPX Y emacron -80
+KPX Y eogonek -80
+KPX Y o -100
+KPX Y oacute -100
+KPX Y ocircumflex -100
+KPX Y odieresis -100
+KPX Y ograve -100
+KPX Y ohungarumlaut -100
+KPX Y omacron -100
+KPX Y oslash -100
+KPX Y otilde -100
+KPX Y period -100
+KPX Y semicolon -50
+KPX Y u -100
+KPX Y uacute -100
+KPX Y ucircumflex -100
+KPX Y udieresis -100
+KPX Y ugrave -100
+KPX Y uhungarumlaut -100
+KPX Y umacron -100
+KPX Y uogonek -100
+KPX Y uring -100
+KPX Yacute A -110
+KPX Yacute Aacute -110
+KPX Yacute Abreve -110
+KPX Yacute Acircumflex -110
+KPX Yacute Adieresis -110
+KPX Yacute Agrave -110
+KPX Yacute Amacron -110
+KPX Yacute Aogonek -110
+KPX Yacute Aring -110
+KPX Yacute Atilde -110
+KPX Yacute O -70
+KPX Yacute Oacute -70
+KPX Yacute Ocircumflex -70
+KPX Yacute Odieresis -70
+KPX Yacute Ograve -70
+KPX Yacute Ohungarumlaut -70
+KPX Yacute Omacron -70
+KPX Yacute Oslash -70
+KPX Yacute Otilde -70
+KPX Yacute a -90
+KPX Yacute aacute -90
+KPX Yacute abreve -90
+KPX Yacute acircumflex -90
+KPX Yacute adieresis -90
+KPX Yacute agrave -90
+KPX Yacute amacron -90
+KPX Yacute aogonek -90
+KPX Yacute aring -90
+KPX Yacute atilde -90
+KPX Yacute colon -50
+KPX Yacute comma -100
+KPX Yacute e -80
+KPX Yacute eacute -80
+KPX Yacute ecaron -80
+KPX Yacute ecircumflex -80
+KPX Yacute edieresis -80
+KPX Yacute edotaccent -80
+KPX Yacute egrave -80
+KPX Yacute emacron -80
+KPX Yacute eogonek -80
+KPX Yacute o -100
+KPX Yacute oacute -100
+KPX Yacute ocircumflex -100
+KPX Yacute odieresis -100
+KPX Yacute ograve -100
+KPX Yacute ohungarumlaut -100
+KPX Yacute omacron -100
+KPX Yacute oslash -100
+KPX Yacute otilde -100
+KPX Yacute period -100
+KPX Yacute semicolon -50
+KPX Yacute u -100
+KPX Yacute uacute -100
+KPX Yacute ucircumflex -100
+KPX Yacute udieresis -100
+KPX Yacute ugrave -100
+KPX Yacute uhungarumlaut -100
+KPX Yacute umacron -100
+KPX Yacute uogonek -100
+KPX Yacute uring -100
+KPX Ydieresis A -110
+KPX Ydieresis Aacute -110
+KPX Ydieresis Abreve -110
+KPX Ydieresis Acircumflex -110
+KPX Ydieresis Adieresis -110
+KPX Ydieresis Agrave -110
+KPX Ydieresis Amacron -110
+KPX Ydieresis Aogonek -110
+KPX Ydieresis Aring -110
+KPX Ydieresis Atilde -110
+KPX Ydieresis O -70
+KPX Ydieresis Oacute -70
+KPX Ydieresis Ocircumflex -70
+KPX Ydieresis Odieresis -70
+KPX Ydieresis Ograve -70
+KPX Ydieresis Ohungarumlaut -70
+KPX Ydieresis Omacron -70
+KPX Ydieresis Oslash -70
+KPX Ydieresis Otilde -70
+KPX Ydieresis a -90
+KPX Ydieresis aacute -90
+KPX Ydieresis abreve -90
+KPX Ydieresis acircumflex -90
+KPX Ydieresis adieresis -90
+KPX Ydieresis agrave -90
+KPX Ydieresis amacron -90
+KPX Ydieresis aogonek -90
+KPX Ydieresis aring -90
+KPX Ydieresis atilde -90
+KPX Ydieresis colon -50
+KPX Ydieresis comma -100
+KPX Ydieresis e -80
+KPX Ydieresis eacute -80
+KPX Ydieresis ecaron -80
+KPX Ydieresis ecircumflex -80
+KPX Ydieresis edieresis -80
+KPX Ydieresis edotaccent -80
+KPX Ydieresis egrave -80
+KPX Ydieresis emacron -80
+KPX Ydieresis eogonek -80
+KPX Ydieresis o -100
+KPX Ydieresis oacute -100
+KPX Ydieresis ocircumflex -100
+KPX Ydieresis odieresis -100
+KPX Ydieresis ograve -100
+KPX Ydieresis ohungarumlaut -100
+KPX Ydieresis omacron -100
+KPX Ydieresis oslash -100
+KPX Ydieresis otilde -100
+KPX Ydieresis period -100
+KPX Ydieresis semicolon -50
+KPX Ydieresis u -100
+KPX Ydieresis uacute -100
+KPX Ydieresis ucircumflex -100
+KPX Ydieresis udieresis -100
+KPX Ydieresis ugrave -100
+KPX Ydieresis uhungarumlaut -100
+KPX Ydieresis umacron -100
+KPX Ydieresis uogonek -100
+KPX Ydieresis uring -100
+KPX a g -10
+KPX a gbreve -10
+KPX a gcommaaccent -10
+KPX a v -15
+KPX a w -15
+KPX a y -20
+KPX a yacute -20
+KPX a ydieresis -20
+KPX aacute g -10
+KPX aacute gbreve -10
+KPX aacute gcommaaccent -10
+KPX aacute v -15
+KPX aacute w -15
+KPX aacute y -20
+KPX aacute yacute -20
+KPX aacute ydieresis -20
+KPX abreve g -10
+KPX abreve gbreve -10
+KPX abreve gcommaaccent -10
+KPX abreve v -15
+KPX abreve w -15
+KPX abreve y -20
+KPX abreve yacute -20
+KPX abreve ydieresis -20
+KPX acircumflex g -10
+KPX acircumflex gbreve -10
+KPX acircumflex gcommaaccent -10
+KPX acircumflex v -15
+KPX acircumflex w -15
+KPX acircumflex y -20
+KPX acircumflex yacute -20
+KPX acircumflex ydieresis -20
+KPX adieresis g -10
+KPX adieresis gbreve -10
+KPX adieresis gcommaaccent -10
+KPX adieresis v -15
+KPX adieresis w -15
+KPX adieresis y -20
+KPX adieresis yacute -20
+KPX adieresis ydieresis -20
+KPX agrave g -10
+KPX agrave gbreve -10
+KPX agrave gcommaaccent -10
+KPX agrave v -15
+KPX agrave w -15
+KPX agrave y -20
+KPX agrave yacute -20
+KPX agrave ydieresis -20
+KPX amacron g -10
+KPX amacron gbreve -10
+KPX amacron gcommaaccent -10
+KPX amacron v -15
+KPX amacron w -15
+KPX amacron y -20
+KPX amacron yacute -20
+KPX amacron ydieresis -20
+KPX aogonek g -10
+KPX aogonek gbreve -10
+KPX aogonek gcommaaccent -10
+KPX aogonek v -15
+KPX aogonek w -15
+KPX aogonek y -20
+KPX aogonek yacute -20
+KPX aogonek ydieresis -20
+KPX aring g -10
+KPX aring gbreve -10
+KPX aring gcommaaccent -10
+KPX aring v -15
+KPX aring w -15
+KPX aring y -20
+KPX aring yacute -20
+KPX aring ydieresis -20
+KPX atilde g -10
+KPX atilde gbreve -10
+KPX atilde gcommaaccent -10
+KPX atilde v -15
+KPX atilde w -15
+KPX atilde y -20
+KPX atilde yacute -20
+KPX atilde ydieresis -20
+KPX b l -10
+KPX b lacute -10
+KPX b lcommaaccent -10
+KPX b lslash -10
+KPX b u -20
+KPX b uacute -20
+KPX b ucircumflex -20
+KPX b udieresis -20
+KPX b ugrave -20
+KPX b uhungarumlaut -20
+KPX b umacron -20
+KPX b uogonek -20
+KPX b uring -20
+KPX b v -20
+KPX b y -20
+KPX b yacute -20
+KPX b ydieresis -20
+KPX c h -10
+KPX c k -20
+KPX c kcommaaccent -20
+KPX c l -20
+KPX c lacute -20
+KPX c lcommaaccent -20
+KPX c lslash -20
+KPX c y -10
+KPX c yacute -10
+KPX c ydieresis -10
+KPX cacute h -10
+KPX cacute k -20
+KPX cacute kcommaaccent -20
+KPX cacute l -20
+KPX cacute lacute -20
+KPX cacute lcommaaccent -20
+KPX cacute lslash -20
+KPX cacute y -10
+KPX cacute yacute -10
+KPX cacute ydieresis -10
+KPX ccaron h -10
+KPX ccaron k -20
+KPX ccaron kcommaaccent -20
+KPX ccaron l -20
+KPX ccaron lacute -20
+KPX ccaron lcommaaccent -20
+KPX ccaron lslash -20
+KPX ccaron y -10
+KPX ccaron yacute -10
+KPX ccaron ydieresis -10
+KPX ccedilla h -10
+KPX ccedilla k -20
+KPX ccedilla kcommaaccent -20
+KPX ccedilla l -20
+KPX ccedilla lacute -20
+KPX ccedilla lcommaaccent -20
+KPX ccedilla lslash -20
+KPX ccedilla y -10
+KPX ccedilla yacute -10
+KPX ccedilla ydieresis -10
+KPX colon space -40
+KPX comma quotedblright -120
+KPX comma quoteright -120
+KPX comma space -40
+KPX d d -10
+KPX d dcroat -10
+KPX d v -15
+KPX d w -15
+KPX d y -15
+KPX d yacute -15
+KPX d ydieresis -15
+KPX dcroat d -10
+KPX dcroat dcroat -10
+KPX dcroat v -15
+KPX dcroat w -15
+KPX dcroat y -15
+KPX dcroat yacute -15
+KPX dcroat ydieresis -15
+KPX e comma 10
+KPX e period 20
+KPX e v -15
+KPX e w -15
+KPX e x -15
+KPX e y -15
+KPX e yacute -15
+KPX e ydieresis -15
+KPX eacute comma 10
+KPX eacute period 20
+KPX eacute v -15
+KPX eacute w -15
+KPX eacute x -15
+KPX eacute y -15
+KPX eacute yacute -15
+KPX eacute ydieresis -15
+KPX ecaron comma 10
+KPX ecaron period 20
+KPX ecaron v -15
+KPX ecaron w -15
+KPX ecaron x -15
+KPX ecaron y -15
+KPX ecaron yacute -15
+KPX ecaron ydieresis -15
+KPX ecircumflex comma 10
+KPX ecircumflex period 20
+KPX ecircumflex v -15
+KPX ecircumflex w -15
+KPX ecircumflex x -15
+KPX ecircumflex y -15
+KPX ecircumflex yacute -15
+KPX ecircumflex ydieresis -15
+KPX edieresis comma 10
+KPX edieresis period 20
+KPX edieresis v -15
+KPX edieresis w -15
+KPX edieresis x -15
+KPX edieresis y -15
+KPX edieresis yacute -15
+KPX edieresis ydieresis -15
+KPX edotaccent comma 10
+KPX edotaccent period 20
+KPX edotaccent v -15
+KPX edotaccent w -15
+KPX edotaccent x -15
+KPX edotaccent y -15
+KPX edotaccent yacute -15
+KPX edotaccent ydieresis -15
+KPX egrave comma 10
+KPX egrave period 20
+KPX egrave v -15
+KPX egrave w -15
+KPX egrave x -15
+KPX egrave y -15
+KPX egrave yacute -15
+KPX egrave ydieresis -15
+KPX emacron comma 10
+KPX emacron period 20
+KPX emacron v -15
+KPX emacron w -15
+KPX emacron x -15
+KPX emacron y -15
+KPX emacron yacute -15
+KPX emacron ydieresis -15
+KPX eogonek comma 10
+KPX eogonek period 20
+KPX eogonek v -15
+KPX eogonek w -15
+KPX eogonek x -15
+KPX eogonek y -15
+KPX eogonek yacute -15
+KPX eogonek ydieresis -15
+KPX f comma -10
+KPX f e -10
+KPX f eacute -10
+KPX f ecaron -10
+KPX f ecircumflex -10
+KPX f edieresis -10
+KPX f edotaccent -10
+KPX f egrave -10
+KPX f emacron -10
+KPX f eogonek -10
+KPX f o -20
+KPX f oacute -20
+KPX f ocircumflex -20
+KPX f odieresis -20
+KPX f ograve -20
+KPX f ohungarumlaut -20
+KPX f omacron -20
+KPX f oslash -20
+KPX f otilde -20
+KPX f period -10
+KPX f quotedblright 30
+KPX f quoteright 30
+KPX g e 10
+KPX g eacute 10
+KPX g ecaron 10
+KPX g ecircumflex 10
+KPX g edieresis 10
+KPX g edotaccent 10
+KPX g egrave 10
+KPX g emacron 10
+KPX g eogonek 10
+KPX g g -10
+KPX g gbreve -10
+KPX g gcommaaccent -10
+KPX gbreve e 10
+KPX gbreve eacute 10
+KPX gbreve ecaron 10
+KPX gbreve ecircumflex 10
+KPX gbreve edieresis 10
+KPX gbreve edotaccent 10
+KPX gbreve egrave 10
+KPX gbreve emacron 10
+KPX gbreve eogonek 10
+KPX gbreve g -10
+KPX gbreve gbreve -10
+KPX gbreve gcommaaccent -10
+KPX gcommaaccent e 10
+KPX gcommaaccent eacute 10
+KPX gcommaaccent ecaron 10
+KPX gcommaaccent ecircumflex 10
+KPX gcommaaccent edieresis 10
+KPX gcommaaccent edotaccent 10
+KPX gcommaaccent egrave 10
+KPX gcommaaccent emacron 10
+KPX gcommaaccent eogonek 10
+KPX gcommaaccent g -10
+KPX gcommaaccent gbreve -10
+KPX gcommaaccent gcommaaccent -10
+KPX h y -20
+KPX h yacute -20
+KPX h ydieresis -20
+KPX k o -15
+KPX k oacute -15
+KPX k ocircumflex -15
+KPX k odieresis -15
+KPX k ograve -15
+KPX k ohungarumlaut -15
+KPX k omacron -15
+KPX k oslash -15
+KPX k otilde -15
+KPX kcommaaccent o -15
+KPX kcommaaccent oacute -15
+KPX kcommaaccent ocircumflex -15
+KPX kcommaaccent odieresis -15
+KPX kcommaaccent ograve -15
+KPX kcommaaccent ohungarumlaut -15
+KPX kcommaaccent omacron -15
+KPX kcommaaccent oslash -15
+KPX kcommaaccent otilde -15
+KPX l w -15
+KPX l y -15
+KPX l yacute -15
+KPX l ydieresis -15
+KPX lacute w -15
+KPX lacute y -15
+KPX lacute yacute -15
+KPX lacute ydieresis -15
+KPX lcommaaccent w -15
+KPX lcommaaccent y -15
+KPX lcommaaccent yacute -15
+KPX lcommaaccent ydieresis -15
+KPX lslash w -15
+KPX lslash y -15
+KPX lslash yacute -15
+KPX lslash ydieresis -15
+KPX m u -20
+KPX m uacute -20
+KPX m ucircumflex -20
+KPX m udieresis -20
+KPX m ugrave -20
+KPX m uhungarumlaut -20
+KPX m umacron -20
+KPX m uogonek -20
+KPX m uring -20
+KPX m y -30
+KPX m yacute -30
+KPX m ydieresis -30
+KPX n u -10
+KPX n uacute -10
+KPX n ucircumflex -10
+KPX n udieresis -10
+KPX n ugrave -10
+KPX n uhungarumlaut -10
+KPX n umacron -10
+KPX n uogonek -10
+KPX n uring -10
+KPX n v -40
+KPX n y -20
+KPX n yacute -20
+KPX n ydieresis -20
+KPX nacute u -10
+KPX nacute uacute -10
+KPX nacute ucircumflex -10
+KPX nacute udieresis -10
+KPX nacute ugrave -10
+KPX nacute uhungarumlaut -10
+KPX nacute umacron -10
+KPX nacute uogonek -10
+KPX nacute uring -10
+KPX nacute v -40
+KPX nacute y -20
+KPX nacute yacute -20
+KPX nacute ydieresis -20
+KPX ncaron u -10
+KPX ncaron uacute -10
+KPX ncaron ucircumflex -10
+KPX ncaron udieresis -10
+KPX ncaron ugrave -10
+KPX ncaron uhungarumlaut -10
+KPX ncaron umacron -10
+KPX ncaron uogonek -10
+KPX ncaron uring -10
+KPX ncaron v -40
+KPX ncaron y -20
+KPX ncaron yacute -20
+KPX ncaron ydieresis -20
+KPX ncommaaccent u -10
+KPX ncommaaccent uacute -10
+KPX ncommaaccent ucircumflex -10
+KPX ncommaaccent udieresis -10
+KPX ncommaaccent ugrave -10
+KPX ncommaaccent uhungarumlaut -10
+KPX ncommaaccent umacron -10
+KPX ncommaaccent uogonek -10
+KPX ncommaaccent uring -10
+KPX ncommaaccent v -40
+KPX ncommaaccent y -20
+KPX ncommaaccent yacute -20
+KPX ncommaaccent ydieresis -20
+KPX ntilde u -10
+KPX ntilde uacute -10
+KPX ntilde ucircumflex -10
+KPX ntilde udieresis -10
+KPX ntilde ugrave -10
+KPX ntilde uhungarumlaut -10
+KPX ntilde umacron -10
+KPX ntilde uogonek -10
+KPX ntilde uring -10
+KPX ntilde v -40
+KPX ntilde y -20
+KPX ntilde yacute -20
+KPX ntilde ydieresis -20
+KPX o v -20
+KPX o w -15
+KPX o x -30
+KPX o y -20
+KPX o yacute -20
+KPX o ydieresis -20
+KPX oacute v -20
+KPX oacute w -15
+KPX oacute x -30
+KPX oacute y -20
+KPX oacute yacute -20
+KPX oacute ydieresis -20
+KPX ocircumflex v -20
+KPX ocircumflex w -15
+KPX ocircumflex x -30
+KPX ocircumflex y -20
+KPX ocircumflex yacute -20
+KPX ocircumflex ydieresis -20
+KPX odieresis v -20
+KPX odieresis w -15
+KPX odieresis x -30
+KPX odieresis y -20
+KPX odieresis yacute -20
+KPX odieresis ydieresis -20
+KPX ograve v -20
+KPX ograve w -15
+KPX ograve x -30
+KPX ograve y -20
+KPX ograve yacute -20
+KPX ograve ydieresis -20
+KPX ohungarumlaut v -20
+KPX ohungarumlaut w -15
+KPX ohungarumlaut x -30
+KPX ohungarumlaut y -20
+KPX ohungarumlaut yacute -20
+KPX ohungarumlaut ydieresis -20
+KPX omacron v -20
+KPX omacron w -15
+KPX omacron x -30
+KPX omacron y -20
+KPX omacron yacute -20
+KPX omacron ydieresis -20
+KPX oslash v -20
+KPX oslash w -15
+KPX oslash x -30
+KPX oslash y -20
+KPX oslash yacute -20
+KPX oslash ydieresis -20
+KPX otilde v -20
+KPX otilde w -15
+KPX otilde x -30
+KPX otilde y -20
+KPX otilde yacute -20
+KPX otilde ydieresis -20
+KPX p y -15
+KPX p yacute -15
+KPX p ydieresis -15
+KPX period quotedblright -120
+KPX period quoteright -120
+KPX period space -40
+KPX quotedblright space -80
+KPX quoteleft quoteleft -46
+KPX quoteright d -80
+KPX quoteright dcroat -80
+KPX quoteright l -20
+KPX quoteright lacute -20
+KPX quoteright lcommaaccent -20
+KPX quoteright lslash -20
+KPX quoteright quoteright -46
+KPX quoteright r -40
+KPX quoteright racute -40
+KPX quoteright rcaron -40
+KPX quoteright rcommaaccent -40
+KPX quoteright s -60
+KPX quoteright sacute -60
+KPX quoteright scaron -60
+KPX quoteright scedilla -60
+KPX quoteright scommaaccent -60
+KPX quoteright space -80
+KPX quoteright v -20
+KPX r c -20
+KPX r cacute -20
+KPX r ccaron -20
+KPX r ccedilla -20
+KPX r comma -60
+KPX r d -20
+KPX r dcroat -20
+KPX r g -15
+KPX r gbreve -15
+KPX r gcommaaccent -15
+KPX r hyphen -20
+KPX r o -20
+KPX r oacute -20
+KPX r ocircumflex -20
+KPX r odieresis -20
+KPX r ograve -20
+KPX r ohungarumlaut -20
+KPX r omacron -20
+KPX r oslash -20
+KPX r otilde -20
+KPX r period -60
+KPX r q -20
+KPX r s -15
+KPX r sacute -15
+KPX r scaron -15
+KPX r scedilla -15
+KPX r scommaaccent -15
+KPX r t 20
+KPX r tcommaaccent 20
+KPX r v 10
+KPX r y 10
+KPX r yacute 10
+KPX r ydieresis 10
+KPX racute c -20
+KPX racute cacute -20
+KPX racute ccaron -20
+KPX racute ccedilla -20
+KPX racute comma -60
+KPX racute d -20
+KPX racute dcroat -20
+KPX racute g -15
+KPX racute gbreve -15
+KPX racute gcommaaccent -15
+KPX racute hyphen -20
+KPX racute o -20
+KPX racute oacute -20
+KPX racute ocircumflex -20
+KPX racute odieresis -20
+KPX racute ograve -20
+KPX racute ohungarumlaut -20
+KPX racute omacron -20
+KPX racute oslash -20
+KPX racute otilde -20
+KPX racute period -60
+KPX racute q -20
+KPX racute s -15
+KPX racute sacute -15
+KPX racute scaron -15
+KPX racute scedilla -15
+KPX racute scommaaccent -15
+KPX racute t 20
+KPX racute tcommaaccent 20
+KPX racute v 10
+KPX racute y 10
+KPX racute yacute 10
+KPX racute ydieresis 10
+KPX rcaron c -20
+KPX rcaron cacute -20
+KPX rcaron ccaron -20
+KPX rcaron ccedilla -20
+KPX rcaron comma -60
+KPX rcaron d -20
+KPX rcaron dcroat -20
+KPX rcaron g -15
+KPX rcaron gbreve -15
+KPX rcaron gcommaaccent -15
+KPX rcaron hyphen -20
+KPX rcaron o -20
+KPX rcaron oacute -20
+KPX rcaron ocircumflex -20
+KPX rcaron odieresis -20
+KPX rcaron ograve -20
+KPX rcaron ohungarumlaut -20
+KPX rcaron omacron -20
+KPX rcaron oslash -20
+KPX rcaron otilde -20
+KPX rcaron period -60
+KPX rcaron q -20
+KPX rcaron s -15
+KPX rcaron sacute -15
+KPX rcaron scaron -15
+KPX rcaron scedilla -15
+KPX rcaron scommaaccent -15
+KPX rcaron t 20
+KPX rcaron tcommaaccent 20
+KPX rcaron v 10
+KPX rcaron y 10
+KPX rcaron yacute 10
+KPX rcaron ydieresis 10
+KPX rcommaaccent c -20
+KPX rcommaaccent cacute -20
+KPX rcommaaccent ccaron -20
+KPX rcommaaccent ccedilla -20
+KPX rcommaaccent comma -60
+KPX rcommaaccent d -20
+KPX rcommaaccent dcroat -20
+KPX rcommaaccent g -15
+KPX rcommaaccent gbreve -15
+KPX rcommaaccent gcommaaccent -15
+KPX rcommaaccent hyphen -20
+KPX rcommaaccent o -20
+KPX rcommaaccent oacute -20
+KPX rcommaaccent ocircumflex -20
+KPX rcommaaccent odieresis -20
+KPX rcommaaccent ograve -20
+KPX rcommaaccent ohungarumlaut -20
+KPX rcommaaccent omacron -20
+KPX rcommaaccent oslash -20
+KPX rcommaaccent otilde -20
+KPX rcommaaccent period -60
+KPX rcommaaccent q -20
+KPX rcommaaccent s -15
+KPX rcommaaccent sacute -15
+KPX rcommaaccent scaron -15
+KPX rcommaaccent scedilla -15
+KPX rcommaaccent scommaaccent -15
+KPX rcommaaccent t 20
+KPX rcommaaccent tcommaaccent 20
+KPX rcommaaccent v 10
+KPX rcommaaccent y 10
+KPX rcommaaccent yacute 10
+KPX rcommaaccent ydieresis 10
+KPX s w -15
+KPX sacute w -15
+KPX scaron w -15
+KPX scedilla w -15
+KPX scommaaccent w -15
+KPX semicolon space -40
+KPX space T -100
+KPX space Tcaron -100
+KPX space Tcommaaccent -100
+KPX space V -80
+KPX space W -80
+KPX space Y -120
+KPX space Yacute -120
+KPX space Ydieresis -120
+KPX space quotedblleft -80
+KPX space quoteleft -60
+KPX v a -20
+KPX v aacute -20
+KPX v abreve -20
+KPX v acircumflex -20
+KPX v adieresis -20
+KPX v agrave -20
+KPX v amacron -20
+KPX v aogonek -20
+KPX v aring -20
+KPX v atilde -20
+KPX v comma -80
+KPX v o -30
+KPX v oacute -30
+KPX v ocircumflex -30
+KPX v odieresis -30
+KPX v ograve -30
+KPX v ohungarumlaut -30
+KPX v omacron -30
+KPX v oslash -30
+KPX v otilde -30
+KPX v period -80
+KPX w comma -40
+KPX w o -20
+KPX w oacute -20
+KPX w ocircumflex -20
+KPX w odieresis -20
+KPX w ograve -20
+KPX w ohungarumlaut -20
+KPX w omacron -20
+KPX w oslash -20
+KPX w otilde -20
+KPX w period -40
+KPX x e -10
+KPX x eacute -10
+KPX x ecaron -10
+KPX x ecircumflex -10
+KPX x edieresis -10
+KPX x edotaccent -10
+KPX x egrave -10
+KPX x emacron -10
+KPX x eogonek -10
+KPX y a -30
+KPX y aacute -30
+KPX y abreve -30
+KPX y acircumflex -30
+KPX y adieresis -30
+KPX y agrave -30
+KPX y amacron -30
+KPX y aogonek -30
+KPX y aring -30
+KPX y atilde -30
+KPX y comma -80
+KPX y e -10
+KPX y eacute -10
+KPX y ecaron -10
+KPX y ecircumflex -10
+KPX y edieresis -10
+KPX y edotaccent -10
+KPX y egrave -10
+KPX y emacron -10
+KPX y eogonek -10
+KPX y o -25
+KPX y oacute -25
+KPX y ocircumflex -25
+KPX y odieresis -25
+KPX y ograve -25
+KPX y ohungarumlaut -25
+KPX y omacron -25
+KPX y oslash -25
+KPX y otilde -25
+KPX y period -80
+KPX yacute a -30
+KPX yacute aacute -30
+KPX yacute abreve -30
+KPX yacute acircumflex -30
+KPX yacute adieresis -30
+KPX yacute agrave -30
+KPX yacute amacron -30
+KPX yacute aogonek -30
+KPX yacute aring -30
+KPX yacute atilde -30
+KPX yacute comma -80
+KPX yacute e -10
+KPX yacute eacute -10
+KPX yacute ecaron -10
+KPX yacute ecircumflex -10
+KPX yacute edieresis -10
+KPX yacute edotaccent -10
+KPX yacute egrave -10
+KPX yacute emacron -10
+KPX yacute eogonek -10
+KPX yacute o -25
+KPX yacute oacute -25
+KPX yacute ocircumflex -25
+KPX yacute odieresis -25
+KPX yacute ograve -25
+KPX yacute ohungarumlaut -25
+KPX yacute omacron -25
+KPX yacute oslash -25
+KPX yacute otilde -25
+KPX yacute period -80
+KPX ydieresis a -30
+KPX ydieresis aacute -30
+KPX ydieresis abreve -30
+KPX ydieresis acircumflex -30
+KPX ydieresis adieresis -30
+KPX ydieresis agrave -30
+KPX ydieresis amacron -30
+KPX ydieresis aogonek -30
+KPX ydieresis aring -30
+KPX ydieresis atilde -30
+KPX ydieresis comma -80
+KPX ydieresis e -10
+KPX ydieresis eacute -10
+KPX ydieresis ecaron -10
+KPX ydieresis ecircumflex -10
+KPX ydieresis edieresis -10
+KPX ydieresis edotaccent -10
+KPX ydieresis egrave -10
+KPX ydieresis emacron -10
+KPX ydieresis eogonek -10
+KPX ydieresis o -25
+KPX ydieresis oacute -25
+KPX ydieresis ocircumflex -25
+KPX ydieresis odieresis -25
+KPX ydieresis ograve -25
+KPX ydieresis ohungarumlaut -25
+KPX ydieresis omacron -25
+KPX ydieresis oslash -25
+KPX ydieresis otilde -25
+KPX ydieresis period -80
+KPX z e 10
+KPX z eacute 10
+KPX z ecaron 10
+KPX z ecircumflex 10
+KPX z edieresis 10
+KPX z edotaccent 10
+KPX z egrave 10
+KPX z emacron 10
+KPX z eogonek 10
+KPX zacute e 10
+KPX zacute eacute 10
+KPX zacute ecaron 10
+KPX zacute ecircumflex 10
+KPX zacute edieresis 10
+KPX zacute edotaccent 10
+KPX zacute egrave 10
+KPX zacute emacron 10
+KPX zacute eogonek 10
+KPX zcaron e 10
+KPX zcaron eacute 10
+KPX zcaron ecaron 10
+KPX zcaron ecircumflex 10
+KPX zcaron edieresis 10
+KPX zcaron edotaccent 10
+KPX zcaron egrave 10
+KPX zcaron emacron 10
+KPX zcaron eogonek 10
+KPX zdotaccent e 10
+KPX zdotaccent eacute 10
+KPX zdotaccent ecaron 10
+KPX zdotaccent ecircumflex 10
+KPX zdotaccent edieresis 10
+KPX zdotaccent edotaccent 10
+KPX zdotaccent egrave 10
+KPX zdotaccent emacron 10
+KPX zdotaccent eogonek 10
+EndKernPairs
+EndKernData
+EndFontMetrics
diff --git a/src/main/resources/Resources/afm/Helvetica-Oblique.afm b/src/main/resources/Resources/afm/Helvetica-Oblique.afm
new file mode 100644
index 0000000..57bf472
--- /dev/null
+++ b/src/main/resources/Resources/afm/Helvetica-Oblique.afm
@@ -0,0 +1,3051 @@
+StartFontMetrics 4.1
+Comment Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved.
+Comment Creation Date: Thu May 1 12:44:31 1997
+Comment UniqueID 43055
+Comment VMusage 14960 69346
+FontName Helvetica-Oblique
+FullName Helvetica Oblique
+FamilyName Helvetica
+Weight Medium
+ItalicAngle -12
+IsFixedPitch false
+CharacterSet ExtendedRoman
+FontBBox -170 -225 1116 931
+UnderlinePosition -100
+UnderlineThickness 50
+Version 002.000
+Notice Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved.Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries.
+EncodingScheme AdobeStandardEncoding
+CapHeight 718
+XHeight 523
+Ascender 718
+Descender -207
+StdHW 76
+StdVW 88
+StartCharMetrics 315
+C 32 ; WX 278 ; N space ; B 0 0 0 0 ;
+C 33 ; WX 278 ; N exclam ; B 90 0 340 718 ;
+C 34 ; WX 355 ; N quotedbl ; B 168 463 438 718 ;
+C 35 ; WX 556 ; N numbersign ; B 73 0 631 688 ;
+C 36 ; WX 556 ; N dollar ; B 69 -115 617 775 ;
+C 37 ; WX 889 ; N percent ; B 147 -19 889 703 ;
+C 38 ; WX 667 ; N ampersand ; B 77 -15 647 718 ;
+C 39 ; WX 222 ; N quoteright ; B 151 463 310 718 ;
+C 40 ; WX 333 ; N parenleft ; B 108 -207 454 733 ;
+C 41 ; WX 333 ; N parenright ; B -9 -207 337 733 ;
+C 42 ; WX 389 ; N asterisk ; B 165 431 475 718 ;
+C 43 ; WX 584 ; N plus ; B 85 0 606 505 ;
+C 44 ; WX 278 ; N comma ; B 56 -147 214 106 ;
+C 45 ; WX 333 ; N hyphen ; B 93 232 357 322 ;
+C 46 ; WX 278 ; N period ; B 87 0 214 106 ;
+C 47 ; WX 278 ; N slash ; B -21 -19 452 737 ;
+C 48 ; WX 556 ; N zero ; B 93 -19 608 703 ;
+C 49 ; WX 556 ; N one ; B 207 0 508 703 ;
+C 50 ; WX 556 ; N two ; B 26 0 617 703 ;
+C 51 ; WX 556 ; N three ; B 75 -19 610 703 ;
+C 52 ; WX 556 ; N four ; B 61 0 576 703 ;
+C 53 ; WX 556 ; N five ; B 68 -19 621 688 ;
+C 54 ; WX 556 ; N six ; B 91 -19 615 703 ;
+C 55 ; WX 556 ; N seven ; B 137 0 669 688 ;
+C 56 ; WX 556 ; N eight ; B 74 -19 607 703 ;
+C 57 ; WX 556 ; N nine ; B 82 -19 609 703 ;
+C 58 ; WX 278 ; N colon ; B 87 0 301 516 ;
+C 59 ; WX 278 ; N semicolon ; B 56 -147 301 516 ;
+C 60 ; WX 584 ; N less ; B 94 11 641 495 ;
+C 61 ; WX 584 ; N equal ; B 63 115 628 390 ;
+C 62 ; WX 584 ; N greater ; B 50 11 597 495 ;
+C 63 ; WX 556 ; N question ; B 161 0 610 727 ;
+C 64 ; WX 1015 ; N at ; B 215 -19 965 737 ;
+C 65 ; WX 667 ; N A ; B 14 0 654 718 ;
+C 66 ; WX 667 ; N B ; B 74 0 712 718 ;
+C 67 ; WX 722 ; N C ; B 108 -19 782 737 ;
+C 68 ; WX 722 ; N D ; B 81 0 764 718 ;
+C 69 ; WX 667 ; N E ; B 86 0 762 718 ;
+C 70 ; WX 611 ; N F ; B 86 0 736 718 ;
+C 71 ; WX 778 ; N G ; B 111 -19 799 737 ;
+C 72 ; WX 722 ; N H ; B 77 0 799 718 ;
+C 73 ; WX 278 ; N I ; B 91 0 341 718 ;
+C 74 ; WX 500 ; N J ; B 47 -19 581 718 ;
+C 75 ; WX 667 ; N K ; B 76 0 808 718 ;
+C 76 ; WX 556 ; N L ; B 76 0 555 718 ;
+C 77 ; WX 833 ; N M ; B 73 0 914 718 ;
+C 78 ; WX 722 ; N N ; B 76 0 799 718 ;
+C 79 ; WX 778 ; N O ; B 105 -19 826 737 ;
+C 80 ; WX 667 ; N P ; B 86 0 737 718 ;
+C 81 ; WX 778 ; N Q ; B 105 -56 826 737 ;
+C 82 ; WX 722 ; N R ; B 88 0 773 718 ;
+C 83 ; WX 667 ; N S ; B 90 -19 713 737 ;
+C 84 ; WX 611 ; N T ; B 148 0 750 718 ;
+C 85 ; WX 722 ; N U ; B 123 -19 797 718 ;
+C 86 ; WX 667 ; N V ; B 173 0 800 718 ;
+C 87 ; WX 944 ; N W ; B 169 0 1081 718 ;
+C 88 ; WX 667 ; N X ; B 19 0 790 718 ;
+C 89 ; WX 667 ; N Y ; B 167 0 806 718 ;
+C 90 ; WX 611 ; N Z ; B 23 0 741 718 ;
+C 91 ; WX 278 ; N bracketleft ; B 21 -196 403 722 ;
+C 92 ; WX 278 ; N backslash ; B 140 -19 291 737 ;
+C 93 ; WX 278 ; N bracketright ; B -14 -196 368 722 ;
+C 94 ; WX 469 ; N asciicircum ; B 42 264 539 688 ;
+C 95 ; WX 556 ; N underscore ; B -27 -125 540 -75 ;
+C 96 ; WX 222 ; N quoteleft ; B 165 470 323 725 ;
+C 97 ; WX 556 ; N a ; B 61 -15 559 538 ;
+C 98 ; WX 556 ; N b ; B 58 -15 584 718 ;
+C 99 ; WX 500 ; N c ; B 74 -15 553 538 ;
+C 100 ; WX 556 ; N d ; B 84 -15 652 718 ;
+C 101 ; WX 556 ; N e ; B 84 -15 578 538 ;
+C 102 ; WX 278 ; N f ; B 86 0 416 728 ; L i fi ; L l fl ;
+C 103 ; WX 556 ; N g ; B 42 -220 610 538 ;
+C 104 ; WX 556 ; N h ; B 65 0 573 718 ;
+C 105 ; WX 222 ; N i ; B 67 0 308 718 ;
+C 106 ; WX 222 ; N j ; B -60 -210 308 718 ;
+C 107 ; WX 500 ; N k ; B 67 0 600 718 ;
+C 108 ; WX 222 ; N l ; B 67 0 308 718 ;
+C 109 ; WX 833 ; N m ; B 65 0 852 538 ;
+C 110 ; WX 556 ; N n ; B 65 0 573 538 ;
+C 111 ; WX 556 ; N o ; B 83 -14 585 538 ;
+C 112 ; WX 556 ; N p ; B 14 -207 584 538 ;
+C 113 ; WX 556 ; N q ; B 84 -207 605 538 ;
+C 114 ; WX 333 ; N r ; B 77 0 446 538 ;
+C 115 ; WX 500 ; N s ; B 63 -15 529 538 ;
+C 116 ; WX 278 ; N t ; B 102 -7 368 669 ;
+C 117 ; WX 556 ; N u ; B 94 -15 600 523 ;
+C 118 ; WX 500 ; N v ; B 119 0 603 523 ;
+C 119 ; WX 722 ; N w ; B 125 0 820 523 ;
+C 120 ; WX 500 ; N x ; B 11 0 594 523 ;
+C 121 ; WX 500 ; N y ; B 15 -214 600 523 ;
+C 122 ; WX 500 ; N z ; B 31 0 571 523 ;
+C 123 ; WX 334 ; N braceleft ; B 92 -196 445 722 ;
+C 124 ; WX 260 ; N bar ; B 46 -225 332 775 ;
+C 125 ; WX 334 ; N braceright ; B 0 -196 354 722 ;
+C 126 ; WX 584 ; N asciitilde ; B 111 180 580 326 ;
+C 161 ; WX 333 ; N exclamdown ; B 77 -195 326 523 ;
+C 162 ; WX 556 ; N cent ; B 95 -115 584 623 ;
+C 163 ; WX 556 ; N sterling ; B 49 -16 634 718 ;
+C 164 ; WX 167 ; N fraction ; B -170 -19 482 703 ;
+C 165 ; WX 556 ; N yen ; B 81 0 699 688 ;
+C 166 ; WX 556 ; N florin ; B -52 -207 654 737 ;
+C 167 ; WX 556 ; N section ; B 76 -191 584 737 ;
+C 168 ; WX 556 ; N currency ; B 60 99 646 603 ;
+C 169 ; WX 191 ; N quotesingle ; B 157 463 285 718 ;
+C 170 ; WX 333 ; N quotedblleft ; B 138 470 461 725 ;
+C 171 ; WX 556 ; N guillemotleft ; B 146 108 554 446 ;
+C 172 ; WX 333 ; N guilsinglleft ; B 137 108 340 446 ;
+C 173 ; WX 333 ; N guilsinglright ; B 111 108 314 446 ;
+C 174 ; WX 500 ; N fi ; B 86 0 587 728 ;
+C 175 ; WX 500 ; N fl ; B 86 0 585 728 ;
+C 177 ; WX 556 ; N endash ; B 51 240 623 313 ;
+C 178 ; WX 556 ; N dagger ; B 135 -159 622 718 ;
+C 179 ; WX 556 ; N daggerdbl ; B 52 -159 623 718 ;
+C 180 ; WX 278 ; N periodcentered ; B 129 190 257 315 ;
+C 182 ; WX 537 ; N paragraph ; B 126 -173 650 718 ;
+C 183 ; WX 350 ; N bullet ; B 91 202 413 517 ;
+C 184 ; WX 222 ; N quotesinglbase ; B 21 -149 180 106 ;
+C 185 ; WX 333 ; N quotedblbase ; B -6 -149 318 106 ;
+C 186 ; WX 333 ; N quotedblright ; B 124 463 448 718 ;
+C 187 ; WX 556 ; N guillemotright ; B 120 108 528 446 ;
+C 188 ; WX 1000 ; N ellipsis ; B 115 0 908 106 ;
+C 189 ; WX 1000 ; N perthousand ; B 88 -19 1029 703 ;
+C 191 ; WX 611 ; N questiondown ; B 85 -201 534 525 ;
+C 193 ; WX 333 ; N grave ; B 170 593 337 734 ;
+C 194 ; WX 333 ; N acute ; B 248 593 475 734 ;
+C 195 ; WX 333 ; N circumflex ; B 147 593 438 734 ;
+C 196 ; WX 333 ; N tilde ; B 125 606 490 722 ;
+C 197 ; WX 333 ; N macron ; B 143 627 468 684 ;
+C 198 ; WX 333 ; N breve ; B 167 595 476 731 ;
+C 199 ; WX 333 ; N dotaccent ; B 249 604 362 706 ;
+C 200 ; WX 333 ; N dieresis ; B 168 604 443 706 ;
+C 202 ; WX 333 ; N ring ; B 214 572 402 756 ;
+C 203 ; WX 333 ; N cedilla ; B 2 -225 232 0 ;
+C 205 ; WX 333 ; N hungarumlaut ; B 157 593 565 734 ;
+C 206 ; WX 333 ; N ogonek ; B 43 -225 249 0 ;
+C 207 ; WX 333 ; N caron ; B 177 593 468 734 ;
+C 208 ; WX 1000 ; N emdash ; B 51 240 1067 313 ;
+C 225 ; WX 1000 ; N AE ; B 8 0 1097 718 ;
+C 227 ; WX 370 ; N ordfeminine ; B 127 405 449 737 ;
+C 232 ; WX 556 ; N Lslash ; B 41 0 555 718 ;
+C 233 ; WX 778 ; N Oslash ; B 43 -19 890 737 ;
+C 234 ; WX 1000 ; N OE ; B 98 -19 1116 737 ;
+C 235 ; WX 365 ; N ordmasculine ; B 141 405 468 737 ;
+C 241 ; WX 889 ; N ae ; B 61 -15 909 538 ;
+C 245 ; WX 278 ; N dotlessi ; B 95 0 294 523 ;
+C 248 ; WX 222 ; N lslash ; B 41 0 347 718 ;
+C 249 ; WX 611 ; N oslash ; B 29 -22 647 545 ;
+C 250 ; WX 944 ; N oe ; B 83 -15 964 538 ;
+C 251 ; WX 611 ; N germandbls ; B 67 -15 658 728 ;
+C -1 ; WX 278 ; N Idieresis ; B 91 0 458 901 ;
+C -1 ; WX 556 ; N eacute ; B 84 -15 587 734 ;
+C -1 ; WX 556 ; N abreve ; B 61 -15 578 731 ;
+C -1 ; WX 556 ; N uhungarumlaut ; B 94 -15 677 734 ;
+C -1 ; WX 556 ; N ecaron ; B 84 -15 580 734 ;
+C -1 ; WX 667 ; N Ydieresis ; B 167 0 806 901 ;
+C -1 ; WX 584 ; N divide ; B 85 -19 606 524 ;
+C -1 ; WX 667 ; N Yacute ; B 167 0 806 929 ;
+C -1 ; WX 667 ; N Acircumflex ; B 14 0 654 929 ;
+C -1 ; WX 556 ; N aacute ; B 61 -15 587 734 ;
+C -1 ; WX 722 ; N Ucircumflex ; B 123 -19 797 929 ;
+C -1 ; WX 500 ; N yacute ; B 15 -214 600 734 ;
+C -1 ; WX 500 ; N scommaaccent ; B 63 -225 529 538 ;
+C -1 ; WX 556 ; N ecircumflex ; B 84 -15 578 734 ;
+C -1 ; WX 722 ; N Uring ; B 123 -19 797 931 ;
+C -1 ; WX 722 ; N Udieresis ; B 123 -19 797 901 ;
+C -1 ; WX 556 ; N aogonek ; B 61 -220 559 538 ;
+C -1 ; WX 722 ; N Uacute ; B 123 -19 797 929 ;
+C -1 ; WX 556 ; N uogonek ; B 94 -225 600 523 ;
+C -1 ; WX 667 ; N Edieresis ; B 86 0 762 901 ;
+C -1 ; WX 722 ; N Dcroat ; B 69 0 764 718 ;
+C -1 ; WX 250 ; N commaaccent ; B 39 -225 172 -40 ;
+C -1 ; WX 737 ; N copyright ; B 54 -19 837 737 ;
+C -1 ; WX 667 ; N Emacron ; B 86 0 762 879 ;
+C -1 ; WX 500 ; N ccaron ; B 74 -15 553 734 ;
+C -1 ; WX 556 ; N aring ; B 61 -15 559 756 ;
+C -1 ; WX 722 ; N Ncommaaccent ; B 76 -225 799 718 ;
+C -1 ; WX 222 ; N lacute ; B 67 0 461 929 ;
+C -1 ; WX 556 ; N agrave ; B 61 -15 559 734 ;
+C -1 ; WX 611 ; N Tcommaaccent ; B 148 -225 750 718 ;
+C -1 ; WX 722 ; N Cacute ; B 108 -19 782 929 ;
+C -1 ; WX 556 ; N atilde ; B 61 -15 592 722 ;
+C -1 ; WX 667 ; N Edotaccent ; B 86 0 762 901 ;
+C -1 ; WX 500 ; N scaron ; B 63 -15 552 734 ;
+C -1 ; WX 500 ; N scedilla ; B 63 -225 529 538 ;
+C -1 ; WX 278 ; N iacute ; B 95 0 448 734 ;
+C -1 ; WX 471 ; N lozenge ; B 88 0 540 728 ;
+C -1 ; WX 722 ; N Rcaron ; B 88 0 773 929 ;
+C -1 ; WX 778 ; N Gcommaaccent ; B 111 -225 799 737 ;
+C -1 ; WX 556 ; N ucircumflex ; B 94 -15 600 734 ;
+C -1 ; WX 556 ; N acircumflex ; B 61 -15 559 734 ;
+C -1 ; WX 667 ; N Amacron ; B 14 0 677 879 ;
+C -1 ; WX 333 ; N rcaron ; B 77 0 508 734 ;
+C -1 ; WX 500 ; N ccedilla ; B 74 -225 553 538 ;
+C -1 ; WX 611 ; N Zdotaccent ; B 23 0 741 901 ;
+C -1 ; WX 667 ; N Thorn ; B 86 0 712 718 ;
+C -1 ; WX 778 ; N Omacron ; B 105 -19 826 879 ;
+C -1 ; WX 722 ; N Racute ; B 88 0 773 929 ;
+C -1 ; WX 667 ; N Sacute ; B 90 -19 713 929 ;
+C -1 ; WX 643 ; N dcaron ; B 84 -15 808 718 ;
+C -1 ; WX 722 ; N Umacron ; B 123 -19 797 879 ;
+C -1 ; WX 556 ; N uring ; B 94 -15 600 756 ;
+C -1 ; WX 333 ; N threesuperior ; B 90 270 436 703 ;
+C -1 ; WX 778 ; N Ograve ; B 105 -19 826 929 ;
+C -1 ; WX 667 ; N Agrave ; B 14 0 654 929 ;
+C -1 ; WX 667 ; N Abreve ; B 14 0 685 926 ;
+C -1 ; WX 584 ; N multiply ; B 50 0 642 506 ;
+C -1 ; WX 556 ; N uacute ; B 94 -15 600 734 ;
+C -1 ; WX 611 ; N Tcaron ; B 148 0 750 929 ;
+C -1 ; WX 476 ; N partialdiff ; B 41 -38 550 714 ;
+C -1 ; WX 500 ; N ydieresis ; B 15 -214 600 706 ;
+C -1 ; WX 722 ; N Nacute ; B 76 0 799 929 ;
+C -1 ; WX 278 ; N icircumflex ; B 95 0 411 734 ;
+C -1 ; WX 667 ; N Ecircumflex ; B 86 0 762 929 ;
+C -1 ; WX 556 ; N adieresis ; B 61 -15 559 706 ;
+C -1 ; WX 556 ; N edieresis ; B 84 -15 578 706 ;
+C -1 ; WX 500 ; N cacute ; B 74 -15 559 734 ;
+C -1 ; WX 556 ; N nacute ; B 65 0 587 734 ;
+C -1 ; WX 556 ; N umacron ; B 94 -15 600 684 ;
+C -1 ; WX 722 ; N Ncaron ; B 76 0 799 929 ;
+C -1 ; WX 278 ; N Iacute ; B 91 0 489 929 ;
+C -1 ; WX 584 ; N plusminus ; B 39 0 618 506 ;
+C -1 ; WX 260 ; N brokenbar ; B 62 -150 316 700 ;
+C -1 ; WX 737 ; N registered ; B 54 -19 837 737 ;
+C -1 ; WX 778 ; N Gbreve ; B 111 -19 799 926 ;
+C -1 ; WX 278 ; N Idotaccent ; B 91 0 377 901 ;
+C -1 ; WX 600 ; N summation ; B 15 -10 671 706 ;
+C -1 ; WX 667 ; N Egrave ; B 86 0 762 929 ;
+C -1 ; WX 333 ; N racute ; B 77 0 475 734 ;
+C -1 ; WX 556 ; N omacron ; B 83 -14 585 684 ;
+C -1 ; WX 611 ; N Zacute ; B 23 0 741 929 ;
+C -1 ; WX 611 ; N Zcaron ; B 23 0 741 929 ;
+C -1 ; WX 549 ; N greaterequal ; B 26 0 620 674 ;
+C -1 ; WX 722 ; N Eth ; B 69 0 764 718 ;
+C -1 ; WX 722 ; N Ccedilla ; B 108 -225 782 737 ;
+C -1 ; WX 222 ; N lcommaaccent ; B 25 -225 308 718 ;
+C -1 ; WX 317 ; N tcaron ; B 102 -7 501 808 ;
+C -1 ; WX 556 ; N eogonek ; B 84 -225 578 538 ;
+C -1 ; WX 722 ; N Uogonek ; B 123 -225 797 718 ;
+C -1 ; WX 667 ; N Aacute ; B 14 0 683 929 ;
+C -1 ; WX 667 ; N Adieresis ; B 14 0 654 901 ;
+C -1 ; WX 556 ; N egrave ; B 84 -15 578 734 ;
+C -1 ; WX 500 ; N zacute ; B 31 0 571 734 ;
+C -1 ; WX 222 ; N iogonek ; B -61 -225 308 718 ;
+C -1 ; WX 778 ; N Oacute ; B 105 -19 826 929 ;
+C -1 ; WX 556 ; N oacute ; B 83 -14 587 734 ;
+C -1 ; WX 556 ; N amacron ; B 61 -15 580 684 ;
+C -1 ; WX 500 ; N sacute ; B 63 -15 559 734 ;
+C -1 ; WX 278 ; N idieresis ; B 95 0 416 706 ;
+C -1 ; WX 778 ; N Ocircumflex ; B 105 -19 826 929 ;
+C -1 ; WX 722 ; N Ugrave ; B 123 -19 797 929 ;
+C -1 ; WX 612 ; N Delta ; B 6 0 608 688 ;
+C -1 ; WX 556 ; N thorn ; B 14 -207 584 718 ;
+C -1 ; WX 333 ; N twosuperior ; B 64 281 449 703 ;
+C -1 ; WX 778 ; N Odieresis ; B 105 -19 826 901 ;
+C -1 ; WX 556 ; N mu ; B 24 -207 600 523 ;
+C -1 ; WX 278 ; N igrave ; B 95 0 310 734 ;
+C -1 ; WX 556 ; N ohungarumlaut ; B 83 -14 677 734 ;
+C -1 ; WX 667 ; N Eogonek ; B 86 -220 762 718 ;
+C -1 ; WX 556 ; N dcroat ; B 84 -15 689 718 ;
+C -1 ; WX 834 ; N threequarters ; B 130 -19 861 703 ;
+C -1 ; WX 667 ; N Scedilla ; B 90 -225 713 737 ;
+C -1 ; WX 299 ; N lcaron ; B 67 0 464 718 ;
+C -1 ; WX 667 ; N Kcommaaccent ; B 76 -225 808 718 ;
+C -1 ; WX 556 ; N Lacute ; B 76 0 555 929 ;
+C -1 ; WX 1000 ; N trademark ; B 186 306 1056 718 ;
+C -1 ; WX 556 ; N edotaccent ; B 84 -15 578 706 ;
+C -1 ; WX 278 ; N Igrave ; B 91 0 351 929 ;
+C -1 ; WX 278 ; N Imacron ; B 91 0 483 879 ;
+C -1 ; WX 556 ; N Lcaron ; B 76 0 570 718 ;
+C -1 ; WX 834 ; N onehalf ; B 114 -19 839 703 ;
+C -1 ; WX 549 ; N lessequal ; B 26 0 666 674 ;
+C -1 ; WX 556 ; N ocircumflex ; B 83 -14 585 734 ;
+C -1 ; WX 556 ; N ntilde ; B 65 0 592 722 ;
+C -1 ; WX 722 ; N Uhungarumlaut ; B 123 -19 801 929 ;
+C -1 ; WX 667 ; N Eacute ; B 86 0 762 929 ;
+C -1 ; WX 556 ; N emacron ; B 84 -15 580 684 ;
+C -1 ; WX 556 ; N gbreve ; B 42 -220 610 731 ;
+C -1 ; WX 834 ; N onequarter ; B 150 -19 802 703 ;
+C -1 ; WX 667 ; N Scaron ; B 90 -19 713 929 ;
+C -1 ; WX 667 ; N Scommaaccent ; B 90 -225 713 737 ;
+C -1 ; WX 778 ; N Ohungarumlaut ; B 105 -19 829 929 ;
+C -1 ; WX 400 ; N degree ; B 169 411 468 703 ;
+C -1 ; WX 556 ; N ograve ; B 83 -14 585 734 ;
+C -1 ; WX 722 ; N Ccaron ; B 108 -19 782 929 ;
+C -1 ; WX 556 ; N ugrave ; B 94 -15 600 734 ;
+C -1 ; WX 453 ; N radical ; B 79 -80 617 762 ;
+C -1 ; WX 722 ; N Dcaron ; B 81 0 764 929 ;
+C -1 ; WX 333 ; N rcommaaccent ; B 30 -225 446 538 ;
+C -1 ; WX 722 ; N Ntilde ; B 76 0 799 917 ;
+C -1 ; WX 556 ; N otilde ; B 83 -14 602 722 ;
+C -1 ; WX 722 ; N Rcommaaccent ; B 88 -225 773 718 ;
+C -1 ; WX 556 ; N Lcommaaccent ; B 76 -225 555 718 ;
+C -1 ; WX 667 ; N Atilde ; B 14 0 699 917 ;
+C -1 ; WX 667 ; N Aogonek ; B 14 -225 654 718 ;
+C -1 ; WX 667 ; N Aring ; B 14 0 654 931 ;
+C -1 ; WX 778 ; N Otilde ; B 105 -19 826 917 ;
+C -1 ; WX 500 ; N zdotaccent ; B 31 0 571 706 ;
+C -1 ; WX 667 ; N Ecaron ; B 86 0 762 929 ;
+C -1 ; WX 278 ; N Iogonek ; B -33 -225 341 718 ;
+C -1 ; WX 500 ; N kcommaaccent ; B 67 -225 600 718 ;
+C -1 ; WX 584 ; N minus ; B 85 216 606 289 ;
+C -1 ; WX 278 ; N Icircumflex ; B 91 0 452 929 ;
+C -1 ; WX 556 ; N ncaron ; B 65 0 580 734 ;
+C -1 ; WX 278 ; N tcommaaccent ; B 63 -225 368 669 ;
+C -1 ; WX 584 ; N logicalnot ; B 106 108 628 390 ;
+C -1 ; WX 556 ; N odieresis ; B 83 -14 585 706 ;
+C -1 ; WX 556 ; N udieresis ; B 94 -15 600 706 ;
+C -1 ; WX 549 ; N notequal ; B 34 -35 623 551 ;
+C -1 ; WX 556 ; N gcommaaccent ; B 42 -220 610 822 ;
+C -1 ; WX 556 ; N eth ; B 81 -15 617 737 ;
+C -1 ; WX 500 ; N zcaron ; B 31 0 571 734 ;
+C -1 ; WX 556 ; N ncommaaccent ; B 65 -225 573 538 ;
+C -1 ; WX 333 ; N onesuperior ; B 166 281 371 703 ;
+C -1 ; WX 278 ; N imacron ; B 95 0 417 684 ;
+C -1 ; WX 556 ; N Euro ; B 0 0 0 0 ;
+EndCharMetrics
+StartKernData
+StartKernPairs 2705
+KPX A C -30
+KPX A Cacute -30
+KPX A Ccaron -30
+KPX A Ccedilla -30
+KPX A G -30
+KPX A Gbreve -30
+KPX A Gcommaaccent -30
+KPX A O -30
+KPX A Oacute -30
+KPX A Ocircumflex -30
+KPX A Odieresis -30
+KPX A Ograve -30
+KPX A Ohungarumlaut -30
+KPX A Omacron -30
+KPX A Oslash -30
+KPX A Otilde -30
+KPX A Q -30
+KPX A T -120
+KPX A Tcaron -120
+KPX A Tcommaaccent -120
+KPX A U -50
+KPX A Uacute -50
+KPX A Ucircumflex -50
+KPX A Udieresis -50
+KPX A Ugrave -50
+KPX A Uhungarumlaut -50
+KPX A Umacron -50
+KPX A Uogonek -50
+KPX A Uring -50
+KPX A V -70
+KPX A W -50
+KPX A Y -100
+KPX A Yacute -100
+KPX A Ydieresis -100
+KPX A u -30
+KPX A uacute -30
+KPX A ucircumflex -30
+KPX A udieresis -30
+KPX A ugrave -30
+KPX A uhungarumlaut -30
+KPX A umacron -30
+KPX A uogonek -30
+KPX A uring -30
+KPX A v -40
+KPX A w -40
+KPX A y -40
+KPX A yacute -40
+KPX A ydieresis -40
+KPX Aacute C -30
+KPX Aacute Cacute -30
+KPX Aacute Ccaron -30
+KPX Aacute Ccedilla -30
+KPX Aacute G -30
+KPX Aacute Gbreve -30
+KPX Aacute Gcommaaccent -30
+KPX Aacute O -30
+KPX Aacute Oacute -30
+KPX Aacute Ocircumflex -30
+KPX Aacute Odieresis -30
+KPX Aacute Ograve -30
+KPX Aacute Ohungarumlaut -30
+KPX Aacute Omacron -30
+KPX Aacute Oslash -30
+KPX Aacute Otilde -30
+KPX Aacute Q -30
+KPX Aacute T -120
+KPX Aacute Tcaron -120
+KPX Aacute Tcommaaccent -120
+KPX Aacute U -50
+KPX Aacute Uacute -50
+KPX Aacute Ucircumflex -50
+KPX Aacute Udieresis -50
+KPX Aacute Ugrave -50
+KPX Aacute Uhungarumlaut -50
+KPX Aacute Umacron -50
+KPX Aacute Uogonek -50
+KPX Aacute Uring -50
+KPX Aacute V -70
+KPX Aacute W -50
+KPX Aacute Y -100
+KPX Aacute Yacute -100
+KPX Aacute Ydieresis -100
+KPX Aacute u -30
+KPX Aacute uacute -30
+KPX Aacute ucircumflex -30
+KPX Aacute udieresis -30
+KPX Aacute ugrave -30
+KPX Aacute uhungarumlaut -30
+KPX Aacute umacron -30
+KPX Aacute uogonek -30
+KPX Aacute uring -30
+KPX Aacute v -40
+KPX Aacute w -40
+KPX Aacute y -40
+KPX Aacute yacute -40
+KPX Aacute ydieresis -40
+KPX Abreve C -30
+KPX Abreve Cacute -30
+KPX Abreve Ccaron -30
+KPX Abreve Ccedilla -30
+KPX Abreve G -30
+KPX Abreve Gbreve -30
+KPX Abreve Gcommaaccent -30
+KPX Abreve O -30
+KPX Abreve Oacute -30
+KPX Abreve Ocircumflex -30
+KPX Abreve Odieresis -30
+KPX Abreve Ograve -30
+KPX Abreve Ohungarumlaut -30
+KPX Abreve Omacron -30
+KPX Abreve Oslash -30
+KPX Abreve Otilde -30
+KPX Abreve Q -30
+KPX Abreve T -120
+KPX Abreve Tcaron -120
+KPX Abreve Tcommaaccent -120
+KPX Abreve U -50
+KPX Abreve Uacute -50
+KPX Abreve Ucircumflex -50
+KPX Abreve Udieresis -50
+KPX Abreve Ugrave -50
+KPX Abreve Uhungarumlaut -50
+KPX Abreve Umacron -50
+KPX Abreve Uogonek -50
+KPX Abreve Uring -50
+KPX Abreve V -70
+KPX Abreve W -50
+KPX Abreve Y -100
+KPX Abreve Yacute -100
+KPX Abreve Ydieresis -100
+KPX Abreve u -30
+KPX Abreve uacute -30
+KPX Abreve ucircumflex -30
+KPX Abreve udieresis -30
+KPX Abreve ugrave -30
+KPX Abreve uhungarumlaut -30
+KPX Abreve umacron -30
+KPX Abreve uogonek -30
+KPX Abreve uring -30
+KPX Abreve v -40
+KPX Abreve w -40
+KPX Abreve y -40
+KPX Abreve yacute -40
+KPX Abreve ydieresis -40
+KPX Acircumflex C -30
+KPX Acircumflex Cacute -30
+KPX Acircumflex Ccaron -30
+KPX Acircumflex Ccedilla -30
+KPX Acircumflex G -30
+KPX Acircumflex Gbreve -30
+KPX Acircumflex Gcommaaccent -30
+KPX Acircumflex O -30
+KPX Acircumflex Oacute -30
+KPX Acircumflex Ocircumflex -30
+KPX Acircumflex Odieresis -30
+KPX Acircumflex Ograve -30
+KPX Acircumflex Ohungarumlaut -30
+KPX Acircumflex Omacron -30
+KPX Acircumflex Oslash -30
+KPX Acircumflex Otilde -30
+KPX Acircumflex Q -30
+KPX Acircumflex T -120
+KPX Acircumflex Tcaron -120
+KPX Acircumflex Tcommaaccent -120
+KPX Acircumflex U -50
+KPX Acircumflex Uacute -50
+KPX Acircumflex Ucircumflex -50
+KPX Acircumflex Udieresis -50
+KPX Acircumflex Ugrave -50
+KPX Acircumflex Uhungarumlaut -50
+KPX Acircumflex Umacron -50
+KPX Acircumflex Uogonek -50
+KPX Acircumflex Uring -50
+KPX Acircumflex V -70
+KPX Acircumflex W -50
+KPX Acircumflex Y -100
+KPX Acircumflex Yacute -100
+KPX Acircumflex Ydieresis -100
+KPX Acircumflex u -30
+KPX Acircumflex uacute -30
+KPX Acircumflex ucircumflex -30
+KPX Acircumflex udieresis -30
+KPX Acircumflex ugrave -30
+KPX Acircumflex uhungarumlaut -30
+KPX Acircumflex umacron -30
+KPX Acircumflex uogonek -30
+KPX Acircumflex uring -30
+KPX Acircumflex v -40
+KPX Acircumflex w -40
+KPX Acircumflex y -40
+KPX Acircumflex yacute -40
+KPX Acircumflex ydieresis -40
+KPX Adieresis C -30
+KPX Adieresis Cacute -30
+KPX Adieresis Ccaron -30
+KPX Adieresis Ccedilla -30
+KPX Adieresis G -30
+KPX Adieresis Gbreve -30
+KPX Adieresis Gcommaaccent -30
+KPX Adieresis O -30
+KPX Adieresis Oacute -30
+KPX Adieresis Ocircumflex -30
+KPX Adieresis Odieresis -30
+KPX Adieresis Ograve -30
+KPX Adieresis Ohungarumlaut -30
+KPX Adieresis Omacron -30
+KPX Adieresis Oslash -30
+KPX Adieresis Otilde -30
+KPX Adieresis Q -30
+KPX Adieresis T -120
+KPX Adieresis Tcaron -120
+KPX Adieresis Tcommaaccent -120
+KPX Adieresis U -50
+KPX Adieresis Uacute -50
+KPX Adieresis Ucircumflex -50
+KPX Adieresis Udieresis -50
+KPX Adieresis Ugrave -50
+KPX Adieresis Uhungarumlaut -50
+KPX Adieresis Umacron -50
+KPX Adieresis Uogonek -50
+KPX Adieresis Uring -50
+KPX Adieresis V -70
+KPX Adieresis W -50
+KPX Adieresis Y -100
+KPX Adieresis Yacute -100
+KPX Adieresis Ydieresis -100
+KPX Adieresis u -30
+KPX Adieresis uacute -30
+KPX Adieresis ucircumflex -30
+KPX Adieresis udieresis -30
+KPX Adieresis ugrave -30
+KPX Adieresis uhungarumlaut -30
+KPX Adieresis umacron -30
+KPX Adieresis uogonek -30
+KPX Adieresis uring -30
+KPX Adieresis v -40
+KPX Adieresis w -40
+KPX Adieresis y -40
+KPX Adieresis yacute -40
+KPX Adieresis ydieresis -40
+KPX Agrave C -30
+KPX Agrave Cacute -30
+KPX Agrave Ccaron -30
+KPX Agrave Ccedilla -30
+KPX Agrave G -30
+KPX Agrave Gbreve -30
+KPX Agrave Gcommaaccent -30
+KPX Agrave O -30
+KPX Agrave Oacute -30
+KPX Agrave Ocircumflex -30
+KPX Agrave Odieresis -30
+KPX Agrave Ograve -30
+KPX Agrave Ohungarumlaut -30
+KPX Agrave Omacron -30
+KPX Agrave Oslash -30
+KPX Agrave Otilde -30
+KPX Agrave Q -30
+KPX Agrave T -120
+KPX Agrave Tcaron -120
+KPX Agrave Tcommaaccent -120
+KPX Agrave U -50
+KPX Agrave Uacute -50
+KPX Agrave Ucircumflex -50
+KPX Agrave Udieresis -50
+KPX Agrave Ugrave -50
+KPX Agrave Uhungarumlaut -50
+KPX Agrave Umacron -50
+KPX Agrave Uogonek -50
+KPX Agrave Uring -50
+KPX Agrave V -70
+KPX Agrave W -50
+KPX Agrave Y -100
+KPX Agrave Yacute -100
+KPX Agrave Ydieresis -100
+KPX Agrave u -30
+KPX Agrave uacute -30
+KPX Agrave ucircumflex -30
+KPX Agrave udieresis -30
+KPX Agrave ugrave -30
+KPX Agrave uhungarumlaut -30
+KPX Agrave umacron -30
+KPX Agrave uogonek -30
+KPX Agrave uring -30
+KPX Agrave v -40
+KPX Agrave w -40
+KPX Agrave y -40
+KPX Agrave yacute -40
+KPX Agrave ydieresis -40
+KPX Amacron C -30
+KPX Amacron Cacute -30
+KPX Amacron Ccaron -30
+KPX Amacron Ccedilla -30
+KPX Amacron G -30
+KPX Amacron Gbreve -30
+KPX Amacron Gcommaaccent -30
+KPX Amacron O -30
+KPX Amacron Oacute -30
+KPX Amacron Ocircumflex -30
+KPX Amacron Odieresis -30
+KPX Amacron Ograve -30
+KPX Amacron Ohungarumlaut -30
+KPX Amacron Omacron -30
+KPX Amacron Oslash -30
+KPX Amacron Otilde -30
+KPX Amacron Q -30
+KPX Amacron T -120
+KPX Amacron Tcaron -120
+KPX Amacron Tcommaaccent -120
+KPX Amacron U -50
+KPX Amacron Uacute -50
+KPX Amacron Ucircumflex -50
+KPX Amacron Udieresis -50
+KPX Amacron Ugrave -50
+KPX Amacron Uhungarumlaut -50
+KPX Amacron Umacron -50
+KPX Amacron Uogonek -50
+KPX Amacron Uring -50
+KPX Amacron V -70
+KPX Amacron W -50
+KPX Amacron Y -100
+KPX Amacron Yacute -100
+KPX Amacron Ydieresis -100
+KPX Amacron u -30
+KPX Amacron uacute -30
+KPX Amacron ucircumflex -30
+KPX Amacron udieresis -30
+KPX Amacron ugrave -30
+KPX Amacron uhungarumlaut -30
+KPX Amacron umacron -30
+KPX Amacron uogonek -30
+KPX Amacron uring -30
+KPX Amacron v -40
+KPX Amacron w -40
+KPX Amacron y -40
+KPX Amacron yacute -40
+KPX Amacron ydieresis -40
+KPX Aogonek C -30
+KPX Aogonek Cacute -30
+KPX Aogonek Ccaron -30
+KPX Aogonek Ccedilla -30
+KPX Aogonek G -30
+KPX Aogonek Gbreve -30
+KPX Aogonek Gcommaaccent -30
+KPX Aogonek O -30
+KPX Aogonek Oacute -30
+KPX Aogonek Ocircumflex -30
+KPX Aogonek Odieresis -30
+KPX Aogonek Ograve -30
+KPX Aogonek Ohungarumlaut -30
+KPX Aogonek Omacron -30
+KPX Aogonek Oslash -30
+KPX Aogonek Otilde -30
+KPX Aogonek Q -30
+KPX Aogonek T -120
+KPX Aogonek Tcaron -120
+KPX Aogonek Tcommaaccent -120
+KPX Aogonek U -50
+KPX Aogonek Uacute -50
+KPX Aogonek Ucircumflex -50
+KPX Aogonek Udieresis -50
+KPX Aogonek Ugrave -50
+KPX Aogonek Uhungarumlaut -50
+KPX Aogonek Umacron -50
+KPX Aogonek Uogonek -50
+KPX Aogonek Uring -50
+KPX Aogonek V -70
+KPX Aogonek W -50
+KPX Aogonek Y -100
+KPX Aogonek Yacute -100
+KPX Aogonek Ydieresis -100
+KPX Aogonek u -30
+KPX Aogonek uacute -30
+KPX Aogonek ucircumflex -30
+KPX Aogonek udieresis -30
+KPX Aogonek ugrave -30
+KPX Aogonek uhungarumlaut -30
+KPX Aogonek umacron -30
+KPX Aogonek uogonek -30
+KPX Aogonek uring -30
+KPX Aogonek v -40
+KPX Aogonek w -40
+KPX Aogonek y -40
+KPX Aogonek yacute -40
+KPX Aogonek ydieresis -40
+KPX Aring C -30
+KPX Aring Cacute -30
+KPX Aring Ccaron -30
+KPX Aring Ccedilla -30
+KPX Aring G -30
+KPX Aring Gbreve -30
+KPX Aring Gcommaaccent -30
+KPX Aring O -30
+KPX Aring Oacute -30
+KPX Aring Ocircumflex -30
+KPX Aring Odieresis -30
+KPX Aring Ograve -30
+KPX Aring Ohungarumlaut -30
+KPX Aring Omacron -30
+KPX Aring Oslash -30
+KPX Aring Otilde -30
+KPX Aring Q -30
+KPX Aring T -120
+KPX Aring Tcaron -120
+KPX Aring Tcommaaccent -120
+KPX Aring U -50
+KPX Aring Uacute -50
+KPX Aring Ucircumflex -50
+KPX Aring Udieresis -50
+KPX Aring Ugrave -50
+KPX Aring Uhungarumlaut -50
+KPX Aring Umacron -50
+KPX Aring Uogonek -50
+KPX Aring Uring -50
+KPX Aring V -70
+KPX Aring W -50
+KPX Aring Y -100
+KPX Aring Yacute -100
+KPX Aring Ydieresis -100
+KPX Aring u -30
+KPX Aring uacute -30
+KPX Aring ucircumflex -30
+KPX Aring udieresis -30
+KPX Aring ugrave -30
+KPX Aring uhungarumlaut -30
+KPX Aring umacron -30
+KPX Aring uogonek -30
+KPX Aring uring -30
+KPX Aring v -40
+KPX Aring w -40
+KPX Aring y -40
+KPX Aring yacute -40
+KPX Aring ydieresis -40
+KPX Atilde C -30
+KPX Atilde Cacute -30
+KPX Atilde Ccaron -30
+KPX Atilde Ccedilla -30
+KPX Atilde G -30
+KPX Atilde Gbreve -30
+KPX Atilde Gcommaaccent -30
+KPX Atilde O -30
+KPX Atilde Oacute -30
+KPX Atilde Ocircumflex -30
+KPX Atilde Odieresis -30
+KPX Atilde Ograve -30
+KPX Atilde Ohungarumlaut -30
+KPX Atilde Omacron -30
+KPX Atilde Oslash -30
+KPX Atilde Otilde -30
+KPX Atilde Q -30
+KPX Atilde T -120
+KPX Atilde Tcaron -120
+KPX Atilde Tcommaaccent -120
+KPX Atilde U -50
+KPX Atilde Uacute -50
+KPX Atilde Ucircumflex -50
+KPX Atilde Udieresis -50
+KPX Atilde Ugrave -50
+KPX Atilde Uhungarumlaut -50
+KPX Atilde Umacron -50
+KPX Atilde Uogonek -50
+KPX Atilde Uring -50
+KPX Atilde V -70
+KPX Atilde W -50
+KPX Atilde Y -100
+KPX Atilde Yacute -100
+KPX Atilde Ydieresis -100
+KPX Atilde u -30
+KPX Atilde uacute -30
+KPX Atilde ucircumflex -30
+KPX Atilde udieresis -30
+KPX Atilde ugrave -30
+KPX Atilde uhungarumlaut -30
+KPX Atilde umacron -30
+KPX Atilde uogonek -30
+KPX Atilde uring -30
+KPX Atilde v -40
+KPX Atilde w -40
+KPX Atilde y -40
+KPX Atilde yacute -40
+KPX Atilde ydieresis -40
+KPX B U -10
+KPX B Uacute -10
+KPX B Ucircumflex -10
+KPX B Udieresis -10
+KPX B Ugrave -10
+KPX B Uhungarumlaut -10
+KPX B Umacron -10
+KPX B Uogonek -10
+KPX B Uring -10
+KPX B comma -20
+KPX B period -20
+KPX C comma -30
+KPX C period -30
+KPX Cacute comma -30
+KPX Cacute period -30
+KPX Ccaron comma -30
+KPX Ccaron period -30
+KPX Ccedilla comma -30
+KPX Ccedilla period -30
+KPX D A -40
+KPX D Aacute -40
+KPX D Abreve -40
+KPX D Acircumflex -40
+KPX D Adieresis -40
+KPX D Agrave -40
+KPX D Amacron -40
+KPX D Aogonek -40
+KPX D Aring -40
+KPX D Atilde -40
+KPX D V -70
+KPX D W -40
+KPX D Y -90
+KPX D Yacute -90
+KPX D Ydieresis -90
+KPX D comma -70
+KPX D period -70
+KPX Dcaron A -40
+KPX Dcaron Aacute -40
+KPX Dcaron Abreve -40
+KPX Dcaron Acircumflex -40
+KPX Dcaron Adieresis -40
+KPX Dcaron Agrave -40
+KPX Dcaron Amacron -40
+KPX Dcaron Aogonek -40
+KPX Dcaron Aring -40
+KPX Dcaron Atilde -40
+KPX Dcaron V -70
+KPX Dcaron W -40
+KPX Dcaron Y -90
+KPX Dcaron Yacute -90
+KPX Dcaron Ydieresis -90
+KPX Dcaron comma -70
+KPX Dcaron period -70
+KPX Dcroat A -40
+KPX Dcroat Aacute -40
+KPX Dcroat Abreve -40
+KPX Dcroat Acircumflex -40
+KPX Dcroat Adieresis -40
+KPX Dcroat Agrave -40
+KPX Dcroat Amacron -40
+KPX Dcroat Aogonek -40
+KPX Dcroat Aring -40
+KPX Dcroat Atilde -40
+KPX Dcroat V -70
+KPX Dcroat W -40
+KPX Dcroat Y -90
+KPX Dcroat Yacute -90
+KPX Dcroat Ydieresis -90
+KPX Dcroat comma -70
+KPX Dcroat period -70
+KPX F A -80
+KPX F Aacute -80
+KPX F Abreve -80
+KPX F Acircumflex -80
+KPX F Adieresis -80
+KPX F Agrave -80
+KPX F Amacron -80
+KPX F Aogonek -80
+KPX F Aring -80
+KPX F Atilde -80
+KPX F a -50
+KPX F aacute -50
+KPX F abreve -50
+KPX F acircumflex -50
+KPX F adieresis -50
+KPX F agrave -50
+KPX F amacron -50
+KPX F aogonek -50
+KPX F aring -50
+KPX F atilde -50
+KPX F comma -150
+KPX F e -30
+KPX F eacute -30
+KPX F ecaron -30
+KPX F ecircumflex -30
+KPX F edieresis -30
+KPX F edotaccent -30
+KPX F egrave -30
+KPX F emacron -30
+KPX F eogonek -30
+KPX F o -30
+KPX F oacute -30
+KPX F ocircumflex -30
+KPX F odieresis -30
+KPX F ograve -30
+KPX F ohungarumlaut -30
+KPX F omacron -30
+KPX F oslash -30
+KPX F otilde -30
+KPX F period -150
+KPX F r -45
+KPX F racute -45
+KPX F rcaron -45
+KPX F rcommaaccent -45
+KPX J A -20
+KPX J Aacute -20
+KPX J Abreve -20
+KPX J Acircumflex -20
+KPX J Adieresis -20
+KPX J Agrave -20
+KPX J Amacron -20
+KPX J Aogonek -20
+KPX J Aring -20
+KPX J Atilde -20
+KPX J a -20
+KPX J aacute -20
+KPX J abreve -20
+KPX J acircumflex -20
+KPX J adieresis -20
+KPX J agrave -20
+KPX J amacron -20
+KPX J aogonek -20
+KPX J aring -20
+KPX J atilde -20
+KPX J comma -30
+KPX J period -30
+KPX J u -20
+KPX J uacute -20
+KPX J ucircumflex -20
+KPX J udieresis -20
+KPX J ugrave -20
+KPX J uhungarumlaut -20
+KPX J umacron -20
+KPX J uogonek -20
+KPX J uring -20
+KPX K O -50
+KPX K Oacute -50
+KPX K Ocircumflex -50
+KPX K Odieresis -50
+KPX K Ograve -50
+KPX K Ohungarumlaut -50
+KPX K Omacron -50
+KPX K Oslash -50
+KPX K Otilde -50
+KPX K e -40
+KPX K eacute -40
+KPX K ecaron -40
+KPX K ecircumflex -40
+KPX K edieresis -40
+KPX K edotaccent -40
+KPX K egrave -40
+KPX K emacron -40
+KPX K eogonek -40
+KPX K o -40
+KPX K oacute -40
+KPX K ocircumflex -40
+KPX K odieresis -40
+KPX K ograve -40
+KPX K ohungarumlaut -40
+KPX K omacron -40
+KPX K oslash -40
+KPX K otilde -40
+KPX K u -30
+KPX K uacute -30
+KPX K ucircumflex -30
+KPX K udieresis -30
+KPX K ugrave -30
+KPX K uhungarumlaut -30
+KPX K umacron -30
+KPX K uogonek -30
+KPX K uring -30
+KPX K y -50
+KPX K yacute -50
+KPX K ydieresis -50
+KPX Kcommaaccent O -50
+KPX Kcommaaccent Oacute -50
+KPX Kcommaaccent Ocircumflex -50
+KPX Kcommaaccent Odieresis -50
+KPX Kcommaaccent Ograve -50
+KPX Kcommaaccent Ohungarumlaut -50
+KPX Kcommaaccent Omacron -50
+KPX Kcommaaccent Oslash -50
+KPX Kcommaaccent Otilde -50
+KPX Kcommaaccent e -40
+KPX Kcommaaccent eacute -40
+KPX Kcommaaccent ecaron -40
+KPX Kcommaaccent ecircumflex -40
+KPX Kcommaaccent edieresis -40
+KPX Kcommaaccent edotaccent -40
+KPX Kcommaaccent egrave -40
+KPX Kcommaaccent emacron -40
+KPX Kcommaaccent eogonek -40
+KPX Kcommaaccent o -40
+KPX Kcommaaccent oacute -40
+KPX Kcommaaccent ocircumflex -40
+KPX Kcommaaccent odieresis -40
+KPX Kcommaaccent ograve -40
+KPX Kcommaaccent ohungarumlaut -40
+KPX Kcommaaccent omacron -40
+KPX Kcommaaccent oslash -40
+KPX Kcommaaccent otilde -40
+KPX Kcommaaccent u -30
+KPX Kcommaaccent uacute -30
+KPX Kcommaaccent ucircumflex -30
+KPX Kcommaaccent udieresis -30
+KPX Kcommaaccent ugrave -30
+KPX Kcommaaccent uhungarumlaut -30
+KPX Kcommaaccent umacron -30
+KPX Kcommaaccent uogonek -30
+KPX Kcommaaccent uring -30
+KPX Kcommaaccent y -50
+KPX Kcommaaccent yacute -50
+KPX Kcommaaccent ydieresis -50
+KPX L T -110
+KPX L Tcaron -110
+KPX L Tcommaaccent -110
+KPX L V -110
+KPX L W -70
+KPX L Y -140
+KPX L Yacute -140
+KPX L Ydieresis -140
+KPX L quotedblright -140
+KPX L quoteright -160
+KPX L y -30
+KPX L yacute -30
+KPX L ydieresis -30
+KPX Lacute T -110
+KPX Lacute Tcaron -110
+KPX Lacute Tcommaaccent -110
+KPX Lacute V -110
+KPX Lacute W -70
+KPX Lacute Y -140
+KPX Lacute Yacute -140
+KPX Lacute Ydieresis -140
+KPX Lacute quotedblright -140
+KPX Lacute quoteright -160
+KPX Lacute y -30
+KPX Lacute yacute -30
+KPX Lacute ydieresis -30
+KPX Lcaron T -110
+KPX Lcaron Tcaron -110
+KPX Lcaron Tcommaaccent -110
+KPX Lcaron V -110
+KPX Lcaron W -70
+KPX Lcaron Y -140
+KPX Lcaron Yacute -140
+KPX Lcaron Ydieresis -140
+KPX Lcaron quotedblright -140
+KPX Lcaron quoteright -160
+KPX Lcaron y -30
+KPX Lcaron yacute -30
+KPX Lcaron ydieresis -30
+KPX Lcommaaccent T -110
+KPX Lcommaaccent Tcaron -110
+KPX Lcommaaccent Tcommaaccent -110
+KPX Lcommaaccent V -110
+KPX Lcommaaccent W -70
+KPX Lcommaaccent Y -140
+KPX Lcommaaccent Yacute -140
+KPX Lcommaaccent Ydieresis -140
+KPX Lcommaaccent quotedblright -140
+KPX Lcommaaccent quoteright -160
+KPX Lcommaaccent y -30
+KPX Lcommaaccent yacute -30
+KPX Lcommaaccent ydieresis -30
+KPX Lslash T -110
+KPX Lslash Tcaron -110
+KPX Lslash Tcommaaccent -110
+KPX Lslash V -110
+KPX Lslash W -70
+KPX Lslash Y -140
+KPX Lslash Yacute -140
+KPX Lslash Ydieresis -140
+KPX Lslash quotedblright -140
+KPX Lslash quoteright -160
+KPX Lslash y -30
+KPX Lslash yacute -30
+KPX Lslash ydieresis -30
+KPX O A -20
+KPX O Aacute -20
+KPX O Abreve -20
+KPX O Acircumflex -20
+KPX O Adieresis -20
+KPX O Agrave -20
+KPX O Amacron -20
+KPX O Aogonek -20
+KPX O Aring -20
+KPX O Atilde -20
+KPX O T -40
+KPX O Tcaron -40
+KPX O Tcommaaccent -40
+KPX O V -50
+KPX O W -30
+KPX O X -60
+KPX O Y -70
+KPX O Yacute -70
+KPX O Ydieresis -70
+KPX O comma -40
+KPX O period -40
+KPX Oacute A -20
+KPX Oacute Aacute -20
+KPX Oacute Abreve -20
+KPX Oacute Acircumflex -20
+KPX Oacute Adieresis -20
+KPX Oacute Agrave -20
+KPX Oacute Amacron -20
+KPX Oacute Aogonek -20
+KPX Oacute Aring -20
+KPX Oacute Atilde -20
+KPX Oacute T -40
+KPX Oacute Tcaron -40
+KPX Oacute Tcommaaccent -40
+KPX Oacute V -50
+KPX Oacute W -30
+KPX Oacute X -60
+KPX Oacute Y -70
+KPX Oacute Yacute -70
+KPX Oacute Ydieresis -70
+KPX Oacute comma -40
+KPX Oacute period -40
+KPX Ocircumflex A -20
+KPX Ocircumflex Aacute -20
+KPX Ocircumflex Abreve -20
+KPX Ocircumflex Acircumflex -20
+KPX Ocircumflex Adieresis -20
+KPX Ocircumflex Agrave -20
+KPX Ocircumflex Amacron -20
+KPX Ocircumflex Aogonek -20
+KPX Ocircumflex Aring -20
+KPX Ocircumflex Atilde -20
+KPX Ocircumflex T -40
+KPX Ocircumflex Tcaron -40
+KPX Ocircumflex Tcommaaccent -40
+KPX Ocircumflex V -50
+KPX Ocircumflex W -30
+KPX Ocircumflex X -60
+KPX Ocircumflex Y -70
+KPX Ocircumflex Yacute -70
+KPX Ocircumflex Ydieresis -70
+KPX Ocircumflex comma -40
+KPX Ocircumflex period -40
+KPX Odieresis A -20
+KPX Odieresis Aacute -20
+KPX Odieresis Abreve -20
+KPX Odieresis Acircumflex -20
+KPX Odieresis Adieresis -20
+KPX Odieresis Agrave -20
+KPX Odieresis Amacron -20
+KPX Odieresis Aogonek -20
+KPX Odieresis Aring -20
+KPX Odieresis Atilde -20
+KPX Odieresis T -40
+KPX Odieresis Tcaron -40
+KPX Odieresis Tcommaaccent -40
+KPX Odieresis V -50
+KPX Odieresis W -30
+KPX Odieresis X -60
+KPX Odieresis Y -70
+KPX Odieresis Yacute -70
+KPX Odieresis Ydieresis -70
+KPX Odieresis comma -40
+KPX Odieresis period -40
+KPX Ograve A -20
+KPX Ograve Aacute -20
+KPX Ograve Abreve -20
+KPX Ograve Acircumflex -20
+KPX Ograve Adieresis -20
+KPX Ograve Agrave -20
+KPX Ograve Amacron -20
+KPX Ograve Aogonek -20
+KPX Ograve Aring -20
+KPX Ograve Atilde -20
+KPX Ograve T -40
+KPX Ograve Tcaron -40
+KPX Ograve Tcommaaccent -40
+KPX Ograve V -50
+KPX Ograve W -30
+KPX Ograve X -60
+KPX Ograve Y -70
+KPX Ograve Yacute -70
+KPX Ograve Ydieresis -70
+KPX Ograve comma -40
+KPX Ograve period -40
+KPX Ohungarumlaut A -20
+KPX Ohungarumlaut Aacute -20
+KPX Ohungarumlaut Abreve -20
+KPX Ohungarumlaut Acircumflex -20
+KPX Ohungarumlaut Adieresis -20
+KPX Ohungarumlaut Agrave -20
+KPX Ohungarumlaut Amacron -20
+KPX Ohungarumlaut Aogonek -20
+KPX Ohungarumlaut Aring -20
+KPX Ohungarumlaut Atilde -20
+KPX Ohungarumlaut T -40
+KPX Ohungarumlaut Tcaron -40
+KPX Ohungarumlaut Tcommaaccent -40
+KPX Ohungarumlaut V -50
+KPX Ohungarumlaut W -30
+KPX Ohungarumlaut X -60
+KPX Ohungarumlaut Y -70
+KPX Ohungarumlaut Yacute -70
+KPX Ohungarumlaut Ydieresis -70
+KPX Ohungarumlaut comma -40
+KPX Ohungarumlaut period -40
+KPX Omacron A -20
+KPX Omacron Aacute -20
+KPX Omacron Abreve -20
+KPX Omacron Acircumflex -20
+KPX Omacron Adieresis -20
+KPX Omacron Agrave -20
+KPX Omacron Amacron -20
+KPX Omacron Aogonek -20
+KPX Omacron Aring -20
+KPX Omacron Atilde -20
+KPX Omacron T -40
+KPX Omacron Tcaron -40
+KPX Omacron Tcommaaccent -40
+KPX Omacron V -50
+KPX Omacron W -30
+KPX Omacron X -60
+KPX Omacron Y -70
+KPX Omacron Yacute -70
+KPX Omacron Ydieresis -70
+KPX Omacron comma -40
+KPX Omacron period -40
+KPX Oslash A -20
+KPX Oslash Aacute -20
+KPX Oslash Abreve -20
+KPX Oslash Acircumflex -20
+KPX Oslash Adieresis -20
+KPX Oslash Agrave -20
+KPX Oslash Amacron -20
+KPX Oslash Aogonek -20
+KPX Oslash Aring -20
+KPX Oslash Atilde -20
+KPX Oslash T -40
+KPX Oslash Tcaron -40
+KPX Oslash Tcommaaccent -40
+KPX Oslash V -50
+KPX Oslash W -30
+KPX Oslash X -60
+KPX Oslash Y -70
+KPX Oslash Yacute -70
+KPX Oslash Ydieresis -70
+KPX Oslash comma -40
+KPX Oslash period -40
+KPX Otilde A -20
+KPX Otilde Aacute -20
+KPX Otilde Abreve -20
+KPX Otilde Acircumflex -20
+KPX Otilde Adieresis -20
+KPX Otilde Agrave -20
+KPX Otilde Amacron -20
+KPX Otilde Aogonek -20
+KPX Otilde Aring -20
+KPX Otilde Atilde -20
+KPX Otilde T -40
+KPX Otilde Tcaron -40
+KPX Otilde Tcommaaccent -40
+KPX Otilde V -50
+KPX Otilde W -30
+KPX Otilde X -60
+KPX Otilde Y -70
+KPX Otilde Yacute -70
+KPX Otilde Ydieresis -70
+KPX Otilde comma -40
+KPX Otilde period -40
+KPX P A -120
+KPX P Aacute -120
+KPX P Abreve -120
+KPX P Acircumflex -120
+KPX P Adieresis -120
+KPX P Agrave -120
+KPX P Amacron -120
+KPX P Aogonek -120
+KPX P Aring -120
+KPX P Atilde -120
+KPX P a -40
+KPX P aacute -40
+KPX P abreve -40
+KPX P acircumflex -40
+KPX P adieresis -40
+KPX P agrave -40
+KPX P amacron -40
+KPX P aogonek -40
+KPX P aring -40
+KPX P atilde -40
+KPX P comma -180
+KPX P e -50
+KPX P eacute -50
+KPX P ecaron -50
+KPX P ecircumflex -50
+KPX P edieresis -50
+KPX P edotaccent -50
+KPX P egrave -50
+KPX P emacron -50
+KPX P eogonek -50
+KPX P o -50
+KPX P oacute -50
+KPX P ocircumflex -50
+KPX P odieresis -50
+KPX P ograve -50
+KPX P ohungarumlaut -50
+KPX P omacron -50
+KPX P oslash -50
+KPX P otilde -50
+KPX P period -180
+KPX Q U -10
+KPX Q Uacute -10
+KPX Q Ucircumflex -10
+KPX Q Udieresis -10
+KPX Q Ugrave -10
+KPX Q Uhungarumlaut -10
+KPX Q Umacron -10
+KPX Q Uogonek -10
+KPX Q Uring -10
+KPX R O -20
+KPX R Oacute -20
+KPX R Ocircumflex -20
+KPX R Odieresis -20
+KPX R Ograve -20
+KPX R Ohungarumlaut -20
+KPX R Omacron -20
+KPX R Oslash -20
+KPX R Otilde -20
+KPX R T -30
+KPX R Tcaron -30
+KPX R Tcommaaccent -30
+KPX R U -40
+KPX R Uacute -40
+KPX R Ucircumflex -40
+KPX R Udieresis -40
+KPX R Ugrave -40
+KPX R Uhungarumlaut -40
+KPX R Umacron -40
+KPX R Uogonek -40
+KPX R Uring -40
+KPX R V -50
+KPX R W -30
+KPX R Y -50
+KPX R Yacute -50
+KPX R Ydieresis -50
+KPX Racute O -20
+KPX Racute Oacute -20
+KPX Racute Ocircumflex -20
+KPX Racute Odieresis -20
+KPX Racute Ograve -20
+KPX Racute Ohungarumlaut -20
+KPX Racute Omacron -20
+KPX Racute Oslash -20
+KPX Racute Otilde -20
+KPX Racute T -30
+KPX Racute Tcaron -30
+KPX Racute Tcommaaccent -30
+KPX Racute U -40
+KPX Racute Uacute -40
+KPX Racute Ucircumflex -40
+KPX Racute Udieresis -40
+KPX Racute Ugrave -40
+KPX Racute Uhungarumlaut -40
+KPX Racute Umacron -40
+KPX Racute Uogonek -40
+KPX Racute Uring -40
+KPX Racute V -50
+KPX Racute W -30
+KPX Racute Y -50
+KPX Racute Yacute -50
+KPX Racute Ydieresis -50
+KPX Rcaron O -20
+KPX Rcaron Oacute -20
+KPX Rcaron Ocircumflex -20
+KPX Rcaron Odieresis -20
+KPX Rcaron Ograve -20
+KPX Rcaron Ohungarumlaut -20
+KPX Rcaron Omacron -20
+KPX Rcaron Oslash -20
+KPX Rcaron Otilde -20
+KPX Rcaron T -30
+KPX Rcaron Tcaron -30
+KPX Rcaron Tcommaaccent -30
+KPX Rcaron U -40
+KPX Rcaron Uacute -40
+KPX Rcaron Ucircumflex -40
+KPX Rcaron Udieresis -40
+KPX Rcaron Ugrave -40
+KPX Rcaron Uhungarumlaut -40
+KPX Rcaron Umacron -40
+KPX Rcaron Uogonek -40
+KPX Rcaron Uring -40
+KPX Rcaron V -50
+KPX Rcaron W -30
+KPX Rcaron Y -50
+KPX Rcaron Yacute -50
+KPX Rcaron Ydieresis -50
+KPX Rcommaaccent O -20
+KPX Rcommaaccent Oacute -20
+KPX Rcommaaccent Ocircumflex -20
+KPX Rcommaaccent Odieresis -20
+KPX Rcommaaccent Ograve -20
+KPX Rcommaaccent Ohungarumlaut -20
+KPX Rcommaaccent Omacron -20
+KPX Rcommaaccent Oslash -20
+KPX Rcommaaccent Otilde -20
+KPX Rcommaaccent T -30
+KPX Rcommaaccent Tcaron -30
+KPX Rcommaaccent Tcommaaccent -30
+KPX Rcommaaccent U -40
+KPX Rcommaaccent Uacute -40
+KPX Rcommaaccent Ucircumflex -40
+KPX Rcommaaccent Udieresis -40
+KPX Rcommaaccent Ugrave -40
+KPX Rcommaaccent Uhungarumlaut -40
+KPX Rcommaaccent Umacron -40
+KPX Rcommaaccent Uogonek -40
+KPX Rcommaaccent Uring -40
+KPX Rcommaaccent V -50
+KPX Rcommaaccent W -30
+KPX Rcommaaccent Y -50
+KPX Rcommaaccent Yacute -50
+KPX Rcommaaccent Ydieresis -50
+KPX S comma -20
+KPX S period -20
+KPX Sacute comma -20
+KPX Sacute period -20
+KPX Scaron comma -20
+KPX Scaron period -20
+KPX Scedilla comma -20
+KPX Scedilla period -20
+KPX Scommaaccent comma -20
+KPX Scommaaccent period -20
+KPX T A -120
+KPX T Aacute -120
+KPX T Abreve -120
+KPX T Acircumflex -120
+KPX T Adieresis -120
+KPX T Agrave -120
+KPX T Amacron -120
+KPX T Aogonek -120
+KPX T Aring -120
+KPX T Atilde -120
+KPX T O -40
+KPX T Oacute -40
+KPX T Ocircumflex -40
+KPX T Odieresis -40
+KPX T Ograve -40
+KPX T Ohungarumlaut -40
+KPX T Omacron -40
+KPX T Oslash -40
+KPX T Otilde -40
+KPX T a -120
+KPX T aacute -120
+KPX T abreve -60
+KPX T acircumflex -120
+KPX T adieresis -120
+KPX T agrave -120
+KPX T amacron -60
+KPX T aogonek -120
+KPX T aring -120
+KPX T atilde -60
+KPX T colon -20
+KPX T comma -120
+KPX T e -120
+KPX T eacute -120
+KPX T ecaron -120
+KPX T ecircumflex -120
+KPX T edieresis -120
+KPX T edotaccent -120
+KPX T egrave -60
+KPX T emacron -60
+KPX T eogonek -120
+KPX T hyphen -140
+KPX T o -120
+KPX T oacute -120
+KPX T ocircumflex -120
+KPX T odieresis -120
+KPX T ograve -120
+KPX T ohungarumlaut -120
+KPX T omacron -60
+KPX T oslash -120
+KPX T otilde -60
+KPX T period -120
+KPX T r -120
+KPX T racute -120
+KPX T rcaron -120
+KPX T rcommaaccent -120
+KPX T semicolon -20
+KPX T u -120
+KPX T uacute -120
+KPX T ucircumflex -120
+KPX T udieresis -120
+KPX T ugrave -120
+KPX T uhungarumlaut -120
+KPX T umacron -60
+KPX T uogonek -120
+KPX T uring -120
+KPX T w -120
+KPX T y -120
+KPX T yacute -120
+KPX T ydieresis -60
+KPX Tcaron A -120
+KPX Tcaron Aacute -120
+KPX Tcaron Abreve -120
+KPX Tcaron Acircumflex -120
+KPX Tcaron Adieresis -120
+KPX Tcaron Agrave -120
+KPX Tcaron Amacron -120
+KPX Tcaron Aogonek -120
+KPX Tcaron Aring -120
+KPX Tcaron Atilde -120
+KPX Tcaron O -40
+KPX Tcaron Oacute -40
+KPX Tcaron Ocircumflex -40
+KPX Tcaron Odieresis -40
+KPX Tcaron Ograve -40
+KPX Tcaron Ohungarumlaut -40
+KPX Tcaron Omacron -40
+KPX Tcaron Oslash -40
+KPX Tcaron Otilde -40
+KPX Tcaron a -120
+KPX Tcaron aacute -120
+KPX Tcaron abreve -60
+KPX Tcaron acircumflex -120
+KPX Tcaron adieresis -120
+KPX Tcaron agrave -120
+KPX Tcaron amacron -60
+KPX Tcaron aogonek -120
+KPX Tcaron aring -120
+KPX Tcaron atilde -60
+KPX Tcaron colon -20
+KPX Tcaron comma -120
+KPX Tcaron e -120
+KPX Tcaron eacute -120
+KPX Tcaron ecaron -120
+KPX Tcaron ecircumflex -120
+KPX Tcaron edieresis -120
+KPX Tcaron edotaccent -120
+KPX Tcaron egrave -60
+KPX Tcaron emacron -60
+KPX Tcaron eogonek -120
+KPX Tcaron hyphen -140
+KPX Tcaron o -120
+KPX Tcaron oacute -120
+KPX Tcaron ocircumflex -120
+KPX Tcaron odieresis -120
+KPX Tcaron ograve -120
+KPX Tcaron ohungarumlaut -120
+KPX Tcaron omacron -60
+KPX Tcaron oslash -120
+KPX Tcaron otilde -60
+KPX Tcaron period -120
+KPX Tcaron r -120
+KPX Tcaron racute -120
+KPX Tcaron rcaron -120
+KPX Tcaron rcommaaccent -120
+KPX Tcaron semicolon -20
+KPX Tcaron u -120
+KPX Tcaron uacute -120
+KPX Tcaron ucircumflex -120
+KPX Tcaron udieresis -120
+KPX Tcaron ugrave -120
+KPX Tcaron uhungarumlaut -120
+KPX Tcaron umacron -60
+KPX Tcaron uogonek -120
+KPX Tcaron uring -120
+KPX Tcaron w -120
+KPX Tcaron y -120
+KPX Tcaron yacute -120
+KPX Tcaron ydieresis -60
+KPX Tcommaaccent A -120
+KPX Tcommaaccent Aacute -120
+KPX Tcommaaccent Abreve -120
+KPX Tcommaaccent Acircumflex -120
+KPX Tcommaaccent Adieresis -120
+KPX Tcommaaccent Agrave -120
+KPX Tcommaaccent Amacron -120
+KPX Tcommaaccent Aogonek -120
+KPX Tcommaaccent Aring -120
+KPX Tcommaaccent Atilde -120
+KPX Tcommaaccent O -40
+KPX Tcommaaccent Oacute -40
+KPX Tcommaaccent Ocircumflex -40
+KPX Tcommaaccent Odieresis -40
+KPX Tcommaaccent Ograve -40
+KPX Tcommaaccent Ohungarumlaut -40
+KPX Tcommaaccent Omacron -40
+KPX Tcommaaccent Oslash -40
+KPX Tcommaaccent Otilde -40
+KPX Tcommaaccent a -120
+KPX Tcommaaccent aacute -120
+KPX Tcommaaccent abreve -60
+KPX Tcommaaccent acircumflex -120
+KPX Tcommaaccent adieresis -120
+KPX Tcommaaccent agrave -120
+KPX Tcommaaccent amacron -60
+KPX Tcommaaccent aogonek -120
+KPX Tcommaaccent aring -120
+KPX Tcommaaccent atilde -60
+KPX Tcommaaccent colon -20
+KPX Tcommaaccent comma -120
+KPX Tcommaaccent e -120
+KPX Tcommaaccent eacute -120
+KPX Tcommaaccent ecaron -120
+KPX Tcommaaccent ecircumflex -120
+KPX Tcommaaccent edieresis -120
+KPX Tcommaaccent edotaccent -120
+KPX Tcommaaccent egrave -60
+KPX Tcommaaccent emacron -60
+KPX Tcommaaccent eogonek -120
+KPX Tcommaaccent hyphen -140
+KPX Tcommaaccent o -120
+KPX Tcommaaccent oacute -120
+KPX Tcommaaccent ocircumflex -120
+KPX Tcommaaccent odieresis -120
+KPX Tcommaaccent ograve -120
+KPX Tcommaaccent ohungarumlaut -120
+KPX Tcommaaccent omacron -60
+KPX Tcommaaccent oslash -120
+KPX Tcommaaccent otilde -60
+KPX Tcommaaccent period -120
+KPX Tcommaaccent r -120
+KPX Tcommaaccent racute -120
+KPX Tcommaaccent rcaron -120
+KPX Tcommaaccent rcommaaccent -120
+KPX Tcommaaccent semicolon -20
+KPX Tcommaaccent u -120
+KPX Tcommaaccent uacute -120
+KPX Tcommaaccent ucircumflex -120
+KPX Tcommaaccent udieresis -120
+KPX Tcommaaccent ugrave -120
+KPX Tcommaaccent uhungarumlaut -120
+KPX Tcommaaccent umacron -60
+KPX Tcommaaccent uogonek -120
+KPX Tcommaaccent uring -120
+KPX Tcommaaccent w -120
+KPX Tcommaaccent y -120
+KPX Tcommaaccent yacute -120
+KPX Tcommaaccent ydieresis -60
+KPX U A -40
+KPX U Aacute -40
+KPX U Abreve -40
+KPX U Acircumflex -40
+KPX U Adieresis -40
+KPX U Agrave -40
+KPX U Amacron -40
+KPX U Aogonek -40
+KPX U Aring -40
+KPX U Atilde -40
+KPX U comma -40
+KPX U period -40
+KPX Uacute A -40
+KPX Uacute Aacute -40
+KPX Uacute Abreve -40
+KPX Uacute Acircumflex -40
+KPX Uacute Adieresis -40
+KPX Uacute Agrave -40
+KPX Uacute Amacron -40
+KPX Uacute Aogonek -40
+KPX Uacute Aring -40
+KPX Uacute Atilde -40
+KPX Uacute comma -40
+KPX Uacute period -40
+KPX Ucircumflex A -40
+KPX Ucircumflex Aacute -40
+KPX Ucircumflex Abreve -40
+KPX Ucircumflex Acircumflex -40
+KPX Ucircumflex Adieresis -40
+KPX Ucircumflex Agrave -40
+KPX Ucircumflex Amacron -40
+KPX Ucircumflex Aogonek -40
+KPX Ucircumflex Aring -40
+KPX Ucircumflex Atilde -40
+KPX Ucircumflex comma -40
+KPX Ucircumflex period -40
+KPX Udieresis A -40
+KPX Udieresis Aacute -40
+KPX Udieresis Abreve -40
+KPX Udieresis Acircumflex -40
+KPX Udieresis Adieresis -40
+KPX Udieresis Agrave -40
+KPX Udieresis Amacron -40
+KPX Udieresis Aogonek -40
+KPX Udieresis Aring -40
+KPX Udieresis Atilde -40
+KPX Udieresis comma -40
+KPX Udieresis period -40
+KPX Ugrave A -40
+KPX Ugrave Aacute -40
+KPX Ugrave Abreve -40
+KPX Ugrave Acircumflex -40
+KPX Ugrave Adieresis -40
+KPX Ugrave Agrave -40
+KPX Ugrave Amacron -40
+KPX Ugrave Aogonek -40
+KPX Ugrave Aring -40
+KPX Ugrave Atilde -40
+KPX Ugrave comma -40
+KPX Ugrave period -40
+KPX Uhungarumlaut A -40
+KPX Uhungarumlaut Aacute -40
+KPX Uhungarumlaut Abreve -40
+KPX Uhungarumlaut Acircumflex -40
+KPX Uhungarumlaut Adieresis -40
+KPX Uhungarumlaut Agrave -40
+KPX Uhungarumlaut Amacron -40
+KPX Uhungarumlaut Aogonek -40
+KPX Uhungarumlaut Aring -40
+KPX Uhungarumlaut Atilde -40
+KPX Uhungarumlaut comma -40
+KPX Uhungarumlaut period -40
+KPX Umacron A -40
+KPX Umacron Aacute -40
+KPX Umacron Abreve -40
+KPX Umacron Acircumflex -40
+KPX Umacron Adieresis -40
+KPX Umacron Agrave -40
+KPX Umacron Amacron -40
+KPX Umacron Aogonek -40
+KPX Umacron Aring -40
+KPX Umacron Atilde -40
+KPX Umacron comma -40
+KPX Umacron period -40
+KPX Uogonek A -40
+KPX Uogonek Aacute -40
+KPX Uogonek Abreve -40
+KPX Uogonek Acircumflex -40
+KPX Uogonek Adieresis -40
+KPX Uogonek Agrave -40
+KPX Uogonek Amacron -40
+KPX Uogonek Aogonek -40
+KPX Uogonek Aring -40
+KPX Uogonek Atilde -40
+KPX Uogonek comma -40
+KPX Uogonek period -40
+KPX Uring A -40
+KPX Uring Aacute -40
+KPX Uring Abreve -40
+KPX Uring Acircumflex -40
+KPX Uring Adieresis -40
+KPX Uring Agrave -40
+KPX Uring Amacron -40
+KPX Uring Aogonek -40
+KPX Uring Aring -40
+KPX Uring Atilde -40
+KPX Uring comma -40
+KPX Uring period -40
+KPX V A -80
+KPX V Aacute -80
+KPX V Abreve -80
+KPX V Acircumflex -80
+KPX V Adieresis -80
+KPX V Agrave -80
+KPX V Amacron -80
+KPX V Aogonek -80
+KPX V Aring -80
+KPX V Atilde -80
+KPX V G -40
+KPX V Gbreve -40
+KPX V Gcommaaccent -40
+KPX V O -40
+KPX V Oacute -40
+KPX V Ocircumflex -40
+KPX V Odieresis -40
+KPX V Ograve -40
+KPX V Ohungarumlaut -40
+KPX V Omacron -40
+KPX V Oslash -40
+KPX V Otilde -40
+KPX V a -70
+KPX V aacute -70
+KPX V abreve -70
+KPX V acircumflex -70
+KPX V adieresis -70
+KPX V agrave -70
+KPX V amacron -70
+KPX V aogonek -70
+KPX V aring -70
+KPX V atilde -70
+KPX V colon -40
+KPX V comma -125
+KPX V e -80
+KPX V eacute -80
+KPX V ecaron -80
+KPX V ecircumflex -80
+KPX V edieresis -80
+KPX V edotaccent -80
+KPX V egrave -80
+KPX V emacron -80
+KPX V eogonek -80
+KPX V hyphen -80
+KPX V o -80
+KPX V oacute -80
+KPX V ocircumflex -80
+KPX V odieresis -80
+KPX V ograve -80
+KPX V ohungarumlaut -80
+KPX V omacron -80
+KPX V oslash -80
+KPX V otilde -80
+KPX V period -125
+KPX V semicolon -40
+KPX V u -70
+KPX V uacute -70
+KPX V ucircumflex -70
+KPX V udieresis -70
+KPX V ugrave -70
+KPX V uhungarumlaut -70
+KPX V umacron -70
+KPX V uogonek -70
+KPX V uring -70
+KPX W A -50
+KPX W Aacute -50
+KPX W Abreve -50
+KPX W Acircumflex -50
+KPX W Adieresis -50
+KPX W Agrave -50
+KPX W Amacron -50
+KPX W Aogonek -50
+KPX W Aring -50
+KPX W Atilde -50
+KPX W O -20
+KPX W Oacute -20
+KPX W Ocircumflex -20
+KPX W Odieresis -20
+KPX W Ograve -20
+KPX W Ohungarumlaut -20
+KPX W Omacron -20
+KPX W Oslash -20
+KPX W Otilde -20
+KPX W a -40
+KPX W aacute -40
+KPX W abreve -40
+KPX W acircumflex -40
+KPX W adieresis -40
+KPX W agrave -40
+KPX W amacron -40
+KPX W aogonek -40
+KPX W aring -40
+KPX W atilde -40
+KPX W comma -80
+KPX W e -30
+KPX W eacute -30
+KPX W ecaron -30
+KPX W ecircumflex -30
+KPX W edieresis -30
+KPX W edotaccent -30
+KPX W egrave -30
+KPX W emacron -30
+KPX W eogonek -30
+KPX W hyphen -40
+KPX W o -30
+KPX W oacute -30
+KPX W ocircumflex -30
+KPX W odieresis -30
+KPX W ograve -30
+KPX W ohungarumlaut -30
+KPX W omacron -30
+KPX W oslash -30
+KPX W otilde -30
+KPX W period -80
+KPX W u -30
+KPX W uacute -30
+KPX W ucircumflex -30
+KPX W udieresis -30
+KPX W ugrave -30
+KPX W uhungarumlaut -30
+KPX W umacron -30
+KPX W uogonek -30
+KPX W uring -30
+KPX W y -20
+KPX W yacute -20
+KPX W ydieresis -20
+KPX Y A -110
+KPX Y Aacute -110
+KPX Y Abreve -110
+KPX Y Acircumflex -110
+KPX Y Adieresis -110
+KPX Y Agrave -110
+KPX Y Amacron -110
+KPX Y Aogonek -110
+KPX Y Aring -110
+KPX Y Atilde -110
+KPX Y O -85
+KPX Y Oacute -85
+KPX Y Ocircumflex -85
+KPX Y Odieresis -85
+KPX Y Ograve -85
+KPX Y Ohungarumlaut -85
+KPX Y Omacron -85
+KPX Y Oslash -85
+KPX Y Otilde -85
+KPX Y a -140
+KPX Y aacute -140
+KPX Y abreve -70
+KPX Y acircumflex -140
+KPX Y adieresis -140
+KPX Y agrave -140
+KPX Y amacron -70
+KPX Y aogonek -140
+KPX Y aring -140
+KPX Y atilde -140
+KPX Y colon -60
+KPX Y comma -140
+KPX Y e -140
+KPX Y eacute -140
+KPX Y ecaron -140
+KPX Y ecircumflex -140
+KPX Y edieresis -140
+KPX Y edotaccent -140
+KPX Y egrave -140
+KPX Y emacron -70
+KPX Y eogonek -140
+KPX Y hyphen -140
+KPX Y i -20
+KPX Y iacute -20
+KPX Y iogonek -20
+KPX Y o -140
+KPX Y oacute -140
+KPX Y ocircumflex -140
+KPX Y odieresis -140
+KPX Y ograve -140
+KPX Y ohungarumlaut -140
+KPX Y omacron -140
+KPX Y oslash -140
+KPX Y otilde -140
+KPX Y period -140
+KPX Y semicolon -60
+KPX Y u -110
+KPX Y uacute -110
+KPX Y ucircumflex -110
+KPX Y udieresis -110
+KPX Y ugrave -110
+KPX Y uhungarumlaut -110
+KPX Y umacron -110
+KPX Y uogonek -110
+KPX Y uring -110
+KPX Yacute A -110
+KPX Yacute Aacute -110
+KPX Yacute Abreve -110
+KPX Yacute Acircumflex -110
+KPX Yacute Adieresis -110
+KPX Yacute Agrave -110
+KPX Yacute Amacron -110
+KPX Yacute Aogonek -110
+KPX Yacute Aring -110
+KPX Yacute Atilde -110
+KPX Yacute O -85
+KPX Yacute Oacute -85
+KPX Yacute Ocircumflex -85
+KPX Yacute Odieresis -85
+KPX Yacute Ograve -85
+KPX Yacute Ohungarumlaut -85
+KPX Yacute Omacron -85
+KPX Yacute Oslash -85
+KPX Yacute Otilde -85
+KPX Yacute a -140
+KPX Yacute aacute -140
+KPX Yacute abreve -70
+KPX Yacute acircumflex -140
+KPX Yacute adieresis -140
+KPX Yacute agrave -140
+KPX Yacute amacron -70
+KPX Yacute aogonek -140
+KPX Yacute aring -140
+KPX Yacute atilde -70
+KPX Yacute colon -60
+KPX Yacute comma -140
+KPX Yacute e -140
+KPX Yacute eacute -140
+KPX Yacute ecaron -140
+KPX Yacute ecircumflex -140
+KPX Yacute edieresis -140
+KPX Yacute edotaccent -140
+KPX Yacute egrave -140
+KPX Yacute emacron -70
+KPX Yacute eogonek -140
+KPX Yacute hyphen -140
+KPX Yacute i -20
+KPX Yacute iacute -20
+KPX Yacute iogonek -20
+KPX Yacute o -140
+KPX Yacute oacute -140
+KPX Yacute ocircumflex -140
+KPX Yacute odieresis -140
+KPX Yacute ograve -140
+KPX Yacute ohungarumlaut -140
+KPX Yacute omacron -70
+KPX Yacute oslash -140
+KPX Yacute otilde -140
+KPX Yacute period -140
+KPX Yacute semicolon -60
+KPX Yacute u -110
+KPX Yacute uacute -110
+KPX Yacute ucircumflex -110
+KPX Yacute udieresis -110
+KPX Yacute ugrave -110
+KPX Yacute uhungarumlaut -110
+KPX Yacute umacron -110
+KPX Yacute uogonek -110
+KPX Yacute uring -110
+KPX Ydieresis A -110
+KPX Ydieresis Aacute -110
+KPX Ydieresis Abreve -110
+KPX Ydieresis Acircumflex -110
+KPX Ydieresis Adieresis -110
+KPX Ydieresis Agrave -110
+KPX Ydieresis Amacron -110
+KPX Ydieresis Aogonek -110
+KPX Ydieresis Aring -110
+KPX Ydieresis Atilde -110
+KPX Ydieresis O -85
+KPX Ydieresis Oacute -85
+KPX Ydieresis Ocircumflex -85
+KPX Ydieresis Odieresis -85
+KPX Ydieresis Ograve -85
+KPX Ydieresis Ohungarumlaut -85
+KPX Ydieresis Omacron -85
+KPX Ydieresis Oslash -85
+KPX Ydieresis Otilde -85
+KPX Ydieresis a -140
+KPX Ydieresis aacute -140
+KPX Ydieresis abreve -70
+KPX Ydieresis acircumflex -140
+KPX Ydieresis adieresis -140
+KPX Ydieresis agrave -140
+KPX Ydieresis amacron -70
+KPX Ydieresis aogonek -140
+KPX Ydieresis aring -140
+KPX Ydieresis atilde -70
+KPX Ydieresis colon -60
+KPX Ydieresis comma -140
+KPX Ydieresis e -140
+KPX Ydieresis eacute -140
+KPX Ydieresis ecaron -140
+KPX Ydieresis ecircumflex -140
+KPX Ydieresis edieresis -140
+KPX Ydieresis edotaccent -140
+KPX Ydieresis egrave -140
+KPX Ydieresis emacron -70
+KPX Ydieresis eogonek -140
+KPX Ydieresis hyphen -140
+KPX Ydieresis i -20
+KPX Ydieresis iacute -20
+KPX Ydieresis iogonek -20
+KPX Ydieresis o -140
+KPX Ydieresis oacute -140
+KPX Ydieresis ocircumflex -140
+KPX Ydieresis odieresis -140
+KPX Ydieresis ograve -140
+KPX Ydieresis ohungarumlaut -140
+KPX Ydieresis omacron -140
+KPX Ydieresis oslash -140
+KPX Ydieresis otilde -140
+KPX Ydieresis period -140
+KPX Ydieresis semicolon -60
+KPX Ydieresis u -110
+KPX Ydieresis uacute -110
+KPX Ydieresis ucircumflex -110
+KPX Ydieresis udieresis -110
+KPX Ydieresis ugrave -110
+KPX Ydieresis uhungarumlaut -110
+KPX Ydieresis umacron -110
+KPX Ydieresis uogonek -110
+KPX Ydieresis uring -110
+KPX a v -20
+KPX a w -20
+KPX a y -30
+KPX a yacute -30
+KPX a ydieresis -30
+KPX aacute v -20
+KPX aacute w -20
+KPX aacute y -30
+KPX aacute yacute -30
+KPX aacute ydieresis -30
+KPX abreve v -20
+KPX abreve w -20
+KPX abreve y -30
+KPX abreve yacute -30
+KPX abreve ydieresis -30
+KPX acircumflex v -20
+KPX acircumflex w -20
+KPX acircumflex y -30
+KPX acircumflex yacute -30
+KPX acircumflex ydieresis -30
+KPX adieresis v -20
+KPX adieresis w -20
+KPX adieresis y -30
+KPX adieresis yacute -30
+KPX adieresis ydieresis -30
+KPX agrave v -20
+KPX agrave w -20
+KPX agrave y -30
+KPX agrave yacute -30
+KPX agrave ydieresis -30
+KPX amacron v -20
+KPX amacron w -20
+KPX amacron y -30
+KPX amacron yacute -30
+KPX amacron ydieresis -30
+KPX aogonek v -20
+KPX aogonek w -20
+KPX aogonek y -30
+KPX aogonek yacute -30
+KPX aogonek ydieresis -30
+KPX aring v -20
+KPX aring w -20
+KPX aring y -30
+KPX aring yacute -30
+KPX aring ydieresis -30
+KPX atilde v -20
+KPX atilde w -20
+KPX atilde y -30
+KPX atilde yacute -30
+KPX atilde ydieresis -30
+KPX b b -10
+KPX b comma -40
+KPX b l -20
+KPX b lacute -20
+KPX b lcommaaccent -20
+KPX b lslash -20
+KPX b period -40
+KPX b u -20
+KPX b uacute -20
+KPX b ucircumflex -20
+KPX b udieresis -20
+KPX b ugrave -20
+KPX b uhungarumlaut -20
+KPX b umacron -20
+KPX b uogonek -20
+KPX b uring -20
+KPX b v -20
+KPX b y -20
+KPX b yacute -20
+KPX b ydieresis -20
+KPX c comma -15
+KPX c k -20
+KPX c kcommaaccent -20
+KPX cacute comma -15
+KPX cacute k -20
+KPX cacute kcommaaccent -20
+KPX ccaron comma -15
+KPX ccaron k -20
+KPX ccaron kcommaaccent -20
+KPX ccedilla comma -15
+KPX ccedilla k -20
+KPX ccedilla kcommaaccent -20
+KPX colon space -50
+KPX comma quotedblright -100
+KPX comma quoteright -100
+KPX e comma -15
+KPX e period -15
+KPX e v -30
+KPX e w -20
+KPX e x -30
+KPX e y -20
+KPX e yacute -20
+KPX e ydieresis -20
+KPX eacute comma -15
+KPX eacute period -15
+KPX eacute v -30
+KPX eacute w -20
+KPX eacute x -30
+KPX eacute y -20
+KPX eacute yacute -20
+KPX eacute ydieresis -20
+KPX ecaron comma -15
+KPX ecaron period -15
+KPX ecaron v -30
+KPX ecaron w -20
+KPX ecaron x -30
+KPX ecaron y -20
+KPX ecaron yacute -20
+KPX ecaron ydieresis -20
+KPX ecircumflex comma -15
+KPX ecircumflex period -15
+KPX ecircumflex v -30
+KPX ecircumflex w -20
+KPX ecircumflex x -30
+KPX ecircumflex y -20
+KPX ecircumflex yacute -20
+KPX ecircumflex ydieresis -20
+KPX edieresis comma -15
+KPX edieresis period -15
+KPX edieresis v -30
+KPX edieresis w -20
+KPX edieresis x -30
+KPX edieresis y -20
+KPX edieresis yacute -20
+KPX edieresis ydieresis -20
+KPX edotaccent comma -15
+KPX edotaccent period -15
+KPX edotaccent v -30
+KPX edotaccent w -20
+KPX edotaccent x -30
+KPX edotaccent y -20
+KPX edotaccent yacute -20
+KPX edotaccent ydieresis -20
+KPX egrave comma -15
+KPX egrave period -15
+KPX egrave v -30
+KPX egrave w -20
+KPX egrave x -30
+KPX egrave y -20
+KPX egrave yacute -20
+KPX egrave ydieresis -20
+KPX emacron comma -15
+KPX emacron period -15
+KPX emacron v -30
+KPX emacron w -20
+KPX emacron x -30
+KPX emacron y -20
+KPX emacron yacute -20
+KPX emacron ydieresis -20
+KPX eogonek comma -15
+KPX eogonek period -15
+KPX eogonek v -30
+KPX eogonek w -20
+KPX eogonek x -30
+KPX eogonek y -20
+KPX eogonek yacute -20
+KPX eogonek ydieresis -20
+KPX f a -30
+KPX f aacute -30
+KPX f abreve -30
+KPX f acircumflex -30
+KPX f adieresis -30
+KPX f agrave -30
+KPX f amacron -30
+KPX f aogonek -30
+KPX f aring -30
+KPX f atilde -30
+KPX f comma -30
+KPX f dotlessi -28
+KPX f e -30
+KPX f eacute -30
+KPX f ecaron -30
+KPX f ecircumflex -30
+KPX f edieresis -30
+KPX f edotaccent -30
+KPX f egrave -30
+KPX f emacron -30
+KPX f eogonek -30
+KPX f o -30
+KPX f oacute -30
+KPX f ocircumflex -30
+KPX f odieresis -30
+KPX f ograve -30
+KPX f ohungarumlaut -30
+KPX f omacron -30
+KPX f oslash -30
+KPX f otilde -30
+KPX f period -30
+KPX f quotedblright 60
+KPX f quoteright 50
+KPX g r -10
+KPX g racute -10
+KPX g rcaron -10
+KPX g rcommaaccent -10
+KPX gbreve r -10
+KPX gbreve racute -10
+KPX gbreve rcaron -10
+KPX gbreve rcommaaccent -10
+KPX gcommaaccent r -10
+KPX gcommaaccent racute -10
+KPX gcommaaccent rcaron -10
+KPX gcommaaccent rcommaaccent -10
+KPX h y -30
+KPX h yacute -30
+KPX h ydieresis -30
+KPX k e -20
+KPX k eacute -20
+KPX k ecaron -20
+KPX k ecircumflex -20
+KPX k edieresis -20
+KPX k edotaccent -20
+KPX k egrave -20
+KPX k emacron -20
+KPX k eogonek -20
+KPX k o -20
+KPX k oacute -20
+KPX k ocircumflex -20
+KPX k odieresis -20
+KPX k ograve -20
+KPX k ohungarumlaut -20
+KPX k omacron -20
+KPX k oslash -20
+KPX k otilde -20
+KPX kcommaaccent e -20
+KPX kcommaaccent eacute -20
+KPX kcommaaccent ecaron -20
+KPX kcommaaccent ecircumflex -20
+KPX kcommaaccent edieresis -20
+KPX kcommaaccent edotaccent -20
+KPX kcommaaccent egrave -20
+KPX kcommaaccent emacron -20
+KPX kcommaaccent eogonek -20
+KPX kcommaaccent o -20
+KPX kcommaaccent oacute -20
+KPX kcommaaccent ocircumflex -20
+KPX kcommaaccent odieresis -20
+KPX kcommaaccent ograve -20
+KPX kcommaaccent ohungarumlaut -20
+KPX kcommaaccent omacron -20
+KPX kcommaaccent oslash -20
+KPX kcommaaccent otilde -20
+KPX m u -10
+KPX m uacute -10
+KPX m ucircumflex -10
+KPX m udieresis -10
+KPX m ugrave -10
+KPX m uhungarumlaut -10
+KPX m umacron -10
+KPX m uogonek -10
+KPX m uring -10
+KPX m y -15
+KPX m yacute -15
+KPX m ydieresis -15
+KPX n u -10
+KPX n uacute -10
+KPX n ucircumflex -10
+KPX n udieresis -10
+KPX n ugrave -10
+KPX n uhungarumlaut -10
+KPX n umacron -10
+KPX n uogonek -10
+KPX n uring -10
+KPX n v -20
+KPX n y -15
+KPX n yacute -15
+KPX n ydieresis -15
+KPX nacute u -10
+KPX nacute uacute -10
+KPX nacute ucircumflex -10
+KPX nacute udieresis -10
+KPX nacute ugrave -10
+KPX nacute uhungarumlaut -10
+KPX nacute umacron -10
+KPX nacute uogonek -10
+KPX nacute uring -10
+KPX nacute v -20
+KPX nacute y -15
+KPX nacute yacute -15
+KPX nacute ydieresis -15
+KPX ncaron u -10
+KPX ncaron uacute -10
+KPX ncaron ucircumflex -10
+KPX ncaron udieresis -10
+KPX ncaron ugrave -10
+KPX ncaron uhungarumlaut -10
+KPX ncaron umacron -10
+KPX ncaron uogonek -10
+KPX ncaron uring -10
+KPX ncaron v -20
+KPX ncaron y -15
+KPX ncaron yacute -15
+KPX ncaron ydieresis -15
+KPX ncommaaccent u -10
+KPX ncommaaccent uacute -10
+KPX ncommaaccent ucircumflex -10
+KPX ncommaaccent udieresis -10
+KPX ncommaaccent ugrave -10
+KPX ncommaaccent uhungarumlaut -10
+KPX ncommaaccent umacron -10
+KPX ncommaaccent uogonek -10
+KPX ncommaaccent uring -10
+KPX ncommaaccent v -20
+KPX ncommaaccent y -15
+KPX ncommaaccent yacute -15
+KPX ncommaaccent ydieresis -15
+KPX ntilde u -10
+KPX ntilde uacute -10
+KPX ntilde ucircumflex -10
+KPX ntilde udieresis -10
+KPX ntilde ugrave -10
+KPX ntilde uhungarumlaut -10
+KPX ntilde umacron -10
+KPX ntilde uogonek -10
+KPX ntilde uring -10
+KPX ntilde v -20
+KPX ntilde y -15
+KPX ntilde yacute -15
+KPX ntilde ydieresis -15
+KPX o comma -40
+KPX o period -40
+KPX o v -15
+KPX o w -15
+KPX o x -30
+KPX o y -30
+KPX o yacute -30
+KPX o ydieresis -30
+KPX oacute comma -40
+KPX oacute period -40
+KPX oacute v -15
+KPX oacute w -15
+KPX oacute x -30
+KPX oacute y -30
+KPX oacute yacute -30
+KPX oacute ydieresis -30
+KPX ocircumflex comma -40
+KPX ocircumflex period -40
+KPX ocircumflex v -15
+KPX ocircumflex w -15
+KPX ocircumflex x -30
+KPX ocircumflex y -30
+KPX ocircumflex yacute -30
+KPX ocircumflex ydieresis -30
+KPX odieresis comma -40
+KPX odieresis period -40
+KPX odieresis v -15
+KPX odieresis w -15
+KPX odieresis x -30
+KPX odieresis y -30
+KPX odieresis yacute -30
+KPX odieresis ydieresis -30
+KPX ograve comma -40
+KPX ograve period -40
+KPX ograve v -15
+KPX ograve w -15
+KPX ograve x -30
+KPX ograve y -30
+KPX ograve yacute -30
+KPX ograve ydieresis -30
+KPX ohungarumlaut comma -40
+KPX ohungarumlaut period -40
+KPX ohungarumlaut v -15
+KPX ohungarumlaut w -15
+KPX ohungarumlaut x -30
+KPX ohungarumlaut y -30
+KPX ohungarumlaut yacute -30
+KPX ohungarumlaut ydieresis -30
+KPX omacron comma -40
+KPX omacron period -40
+KPX omacron v -15
+KPX omacron w -15
+KPX omacron x -30
+KPX omacron y -30
+KPX omacron yacute -30
+KPX omacron ydieresis -30
+KPX oslash a -55
+KPX oslash aacute -55
+KPX oslash abreve -55
+KPX oslash acircumflex -55
+KPX oslash adieresis -55
+KPX oslash agrave -55
+KPX oslash amacron -55
+KPX oslash aogonek -55
+KPX oslash aring -55
+KPX oslash atilde -55
+KPX oslash b -55
+KPX oslash c -55
+KPX oslash cacute -55
+KPX oslash ccaron -55
+KPX oslash ccedilla -55
+KPX oslash comma -95
+KPX oslash d -55
+KPX oslash dcroat -55
+KPX oslash e -55
+KPX oslash eacute -55
+KPX oslash ecaron -55
+KPX oslash ecircumflex -55
+KPX oslash edieresis -55
+KPX oslash edotaccent -55
+KPX oslash egrave -55
+KPX oslash emacron -55
+KPX oslash eogonek -55
+KPX oslash f -55
+KPX oslash g -55
+KPX oslash gbreve -55
+KPX oslash gcommaaccent -55
+KPX oslash h -55
+KPX oslash i -55
+KPX oslash iacute -55
+KPX oslash icircumflex -55
+KPX oslash idieresis -55
+KPX oslash igrave -55
+KPX oslash imacron -55
+KPX oslash iogonek -55
+KPX oslash j -55
+KPX oslash k -55
+KPX oslash kcommaaccent -55
+KPX oslash l -55
+KPX oslash lacute -55
+KPX oslash lcommaaccent -55
+KPX oslash lslash -55
+KPX oslash m -55
+KPX oslash n -55
+KPX oslash nacute -55
+KPX oslash ncaron -55
+KPX oslash ncommaaccent -55
+KPX oslash ntilde -55
+KPX oslash o -55
+KPX oslash oacute -55
+KPX oslash ocircumflex -55
+KPX oslash odieresis -55
+KPX oslash ograve -55
+KPX oslash ohungarumlaut -55
+KPX oslash omacron -55
+KPX oslash oslash -55
+KPX oslash otilde -55
+KPX oslash p -55
+KPX oslash period -95
+KPX oslash q -55
+KPX oslash r -55
+KPX oslash racute -55
+KPX oslash rcaron -55
+KPX oslash rcommaaccent -55
+KPX oslash s -55
+KPX oslash sacute -55
+KPX oslash scaron -55
+KPX oslash scedilla -55
+KPX oslash scommaaccent -55
+KPX oslash t -55
+KPX oslash tcommaaccent -55
+KPX oslash u -55
+KPX oslash uacute -55
+KPX oslash ucircumflex -55
+KPX oslash udieresis -55
+KPX oslash ugrave -55
+KPX oslash uhungarumlaut -55
+KPX oslash umacron -55
+KPX oslash uogonek -55
+KPX oslash uring -55
+KPX oslash v -70
+KPX oslash w -70
+KPX oslash x -85
+KPX oslash y -70
+KPX oslash yacute -70
+KPX oslash ydieresis -70
+KPX oslash z -55
+KPX oslash zacute -55
+KPX oslash zcaron -55
+KPX oslash zdotaccent -55
+KPX otilde comma -40
+KPX otilde period -40
+KPX otilde v -15
+KPX otilde w -15
+KPX otilde x -30
+KPX otilde y -30
+KPX otilde yacute -30
+KPX otilde ydieresis -30
+KPX p comma -35
+KPX p period -35
+KPX p y -30
+KPX p yacute -30
+KPX p ydieresis -30
+KPX period quotedblright -100
+KPX period quoteright -100
+KPX period space -60
+KPX quotedblright space -40
+KPX quoteleft quoteleft -57
+KPX quoteright d -50
+KPX quoteright dcroat -50
+KPX quoteright quoteright -57
+KPX quoteright r -50
+KPX quoteright racute -50
+KPX quoteright rcaron -50
+KPX quoteright rcommaaccent -50
+KPX quoteright s -50
+KPX quoteright sacute -50
+KPX quoteright scaron -50
+KPX quoteright scedilla -50
+KPX quoteright scommaaccent -50
+KPX quoteright space -70
+KPX r a -10
+KPX r aacute -10
+KPX r abreve -10
+KPX r acircumflex -10
+KPX r adieresis -10
+KPX r agrave -10
+KPX r amacron -10
+KPX r aogonek -10
+KPX r aring -10
+KPX r atilde -10
+KPX r colon 30
+KPX r comma -50
+KPX r i 15
+KPX r iacute 15
+KPX r icircumflex 15
+KPX r idieresis 15
+KPX r igrave 15
+KPX r imacron 15
+KPX r iogonek 15
+KPX r k 15
+KPX r kcommaaccent 15
+KPX r l 15
+KPX r lacute 15
+KPX r lcommaaccent 15
+KPX r lslash 15
+KPX r m 25
+KPX r n 25
+KPX r nacute 25
+KPX r ncaron 25
+KPX r ncommaaccent 25
+KPX r ntilde 25
+KPX r p 30
+KPX r period -50
+KPX r semicolon 30
+KPX r t 40
+KPX r tcommaaccent 40
+KPX r u 15
+KPX r uacute 15
+KPX r ucircumflex 15
+KPX r udieresis 15
+KPX r ugrave 15
+KPX r uhungarumlaut 15
+KPX r umacron 15
+KPX r uogonek 15
+KPX r uring 15
+KPX r v 30
+KPX r y 30
+KPX r yacute 30
+KPX r ydieresis 30
+KPX racute a -10
+KPX racute aacute -10
+KPX racute abreve -10
+KPX racute acircumflex -10
+KPX racute adieresis -10
+KPX racute agrave -10
+KPX racute amacron -10
+KPX racute aogonek -10
+KPX racute aring -10
+KPX racute atilde -10
+KPX racute colon 30
+KPX racute comma -50
+KPX racute i 15
+KPX racute iacute 15
+KPX racute icircumflex 15
+KPX racute idieresis 15
+KPX racute igrave 15
+KPX racute imacron 15
+KPX racute iogonek 15
+KPX racute k 15
+KPX racute kcommaaccent 15
+KPX racute l 15
+KPX racute lacute 15
+KPX racute lcommaaccent 15
+KPX racute lslash 15
+KPX racute m 25
+KPX racute n 25
+KPX racute nacute 25
+KPX racute ncaron 25
+KPX racute ncommaaccent 25
+KPX racute ntilde 25
+KPX racute p 30
+KPX racute period -50
+KPX racute semicolon 30
+KPX racute t 40
+KPX racute tcommaaccent 40
+KPX racute u 15
+KPX racute uacute 15
+KPX racute ucircumflex 15
+KPX racute udieresis 15
+KPX racute ugrave 15
+KPX racute uhungarumlaut 15
+KPX racute umacron 15
+KPX racute uogonek 15
+KPX racute uring 15
+KPX racute v 30
+KPX racute y 30
+KPX racute yacute 30
+KPX racute ydieresis 30
+KPX rcaron a -10
+KPX rcaron aacute -10
+KPX rcaron abreve -10
+KPX rcaron acircumflex -10
+KPX rcaron adieresis -10
+KPX rcaron agrave -10
+KPX rcaron amacron -10
+KPX rcaron aogonek -10
+KPX rcaron aring -10
+KPX rcaron atilde -10
+KPX rcaron colon 30
+KPX rcaron comma -50
+KPX rcaron i 15
+KPX rcaron iacute 15
+KPX rcaron icircumflex 15
+KPX rcaron idieresis 15
+KPX rcaron igrave 15
+KPX rcaron imacron 15
+KPX rcaron iogonek 15
+KPX rcaron k 15
+KPX rcaron kcommaaccent 15
+KPX rcaron l 15
+KPX rcaron lacute 15
+KPX rcaron lcommaaccent 15
+KPX rcaron lslash 15
+KPX rcaron m 25
+KPX rcaron n 25
+KPX rcaron nacute 25
+KPX rcaron ncaron 25
+KPX rcaron ncommaaccent 25
+KPX rcaron ntilde 25
+KPX rcaron p 30
+KPX rcaron period -50
+KPX rcaron semicolon 30
+KPX rcaron t 40
+KPX rcaron tcommaaccent 40
+KPX rcaron u 15
+KPX rcaron uacute 15
+KPX rcaron ucircumflex 15
+KPX rcaron udieresis 15
+KPX rcaron ugrave 15
+KPX rcaron uhungarumlaut 15
+KPX rcaron umacron 15
+KPX rcaron uogonek 15
+KPX rcaron uring 15
+KPX rcaron v 30
+KPX rcaron y 30
+KPX rcaron yacute 30
+KPX rcaron ydieresis 30
+KPX rcommaaccent a -10
+KPX rcommaaccent aacute -10
+KPX rcommaaccent abreve -10
+KPX rcommaaccent acircumflex -10
+KPX rcommaaccent adieresis -10
+KPX rcommaaccent agrave -10
+KPX rcommaaccent amacron -10
+KPX rcommaaccent aogonek -10
+KPX rcommaaccent aring -10
+KPX rcommaaccent atilde -10
+KPX rcommaaccent colon 30
+KPX rcommaaccent comma -50
+KPX rcommaaccent i 15
+KPX rcommaaccent iacute 15
+KPX rcommaaccent icircumflex 15
+KPX rcommaaccent idieresis 15
+KPX rcommaaccent igrave 15
+KPX rcommaaccent imacron 15
+KPX rcommaaccent iogonek 15
+KPX rcommaaccent k 15
+KPX rcommaaccent kcommaaccent 15
+KPX rcommaaccent l 15
+KPX rcommaaccent lacute 15
+KPX rcommaaccent lcommaaccent 15
+KPX rcommaaccent lslash 15
+KPX rcommaaccent m 25
+KPX rcommaaccent n 25
+KPX rcommaaccent nacute 25
+KPX rcommaaccent ncaron 25
+KPX rcommaaccent ncommaaccent 25
+KPX rcommaaccent ntilde 25
+KPX rcommaaccent p 30
+KPX rcommaaccent period -50
+KPX rcommaaccent semicolon 30
+KPX rcommaaccent t 40
+KPX rcommaaccent tcommaaccent 40
+KPX rcommaaccent u 15
+KPX rcommaaccent uacute 15
+KPX rcommaaccent ucircumflex 15
+KPX rcommaaccent udieresis 15
+KPX rcommaaccent ugrave 15
+KPX rcommaaccent uhungarumlaut 15
+KPX rcommaaccent umacron 15
+KPX rcommaaccent uogonek 15
+KPX rcommaaccent uring 15
+KPX rcommaaccent v 30
+KPX rcommaaccent y 30
+KPX rcommaaccent yacute 30
+KPX rcommaaccent ydieresis 30
+KPX s comma -15
+KPX s period -15
+KPX s w -30
+KPX sacute comma -15
+KPX sacute period -15
+KPX sacute w -30
+KPX scaron comma -15
+KPX scaron period -15
+KPX scaron w -30
+KPX scedilla comma -15
+KPX scedilla period -15
+KPX scedilla w -30
+KPX scommaaccent comma -15
+KPX scommaaccent period -15
+KPX scommaaccent w -30
+KPX semicolon space -50
+KPX space T -50
+KPX space Tcaron -50
+KPX space Tcommaaccent -50
+KPX space V -50
+KPX space W -40
+KPX space Y -90
+KPX space Yacute -90
+KPX space Ydieresis -90
+KPX space quotedblleft -30
+KPX space quoteleft -60
+KPX v a -25
+KPX v aacute -25
+KPX v abreve -25
+KPX v acircumflex -25
+KPX v adieresis -25
+KPX v agrave -25
+KPX v amacron -25
+KPX v aogonek -25
+KPX v aring -25
+KPX v atilde -25
+KPX v comma -80
+KPX v e -25
+KPX v eacute -25
+KPX v ecaron -25
+KPX v ecircumflex -25
+KPX v edieresis -25
+KPX v edotaccent -25
+KPX v egrave -25
+KPX v emacron -25
+KPX v eogonek -25
+KPX v o -25
+KPX v oacute -25
+KPX v ocircumflex -25
+KPX v odieresis -25
+KPX v ograve -25
+KPX v ohungarumlaut -25
+KPX v omacron -25
+KPX v oslash -25
+KPX v otilde -25
+KPX v period -80
+KPX w a -15
+KPX w aacute -15
+KPX w abreve -15
+KPX w acircumflex -15
+KPX w adieresis -15
+KPX w agrave -15
+KPX w amacron -15
+KPX w aogonek -15
+KPX w aring -15
+KPX w atilde -15
+KPX w comma -60
+KPX w e -10
+KPX w eacute -10
+KPX w ecaron -10
+KPX w ecircumflex -10
+KPX w edieresis -10
+KPX w edotaccent -10
+KPX w egrave -10
+KPX w emacron -10
+KPX w eogonek -10
+KPX w o -10
+KPX w oacute -10
+KPX w ocircumflex -10
+KPX w odieresis -10
+KPX w ograve -10
+KPX w ohungarumlaut -10
+KPX w omacron -10
+KPX w oslash -10
+KPX w otilde -10
+KPX w period -60
+KPX x e -30
+KPX x eacute -30
+KPX x ecaron -30
+KPX x ecircumflex -30
+KPX x edieresis -30
+KPX x edotaccent -30
+KPX x egrave -30
+KPX x emacron -30
+KPX x eogonek -30
+KPX y a -20
+KPX y aacute -20
+KPX y abreve -20
+KPX y acircumflex -20
+KPX y adieresis -20
+KPX y agrave -20
+KPX y amacron -20
+KPX y aogonek -20
+KPX y aring -20
+KPX y atilde -20
+KPX y comma -100
+KPX y e -20
+KPX y eacute -20
+KPX y ecaron -20
+KPX y ecircumflex -20
+KPX y edieresis -20
+KPX y edotaccent -20
+KPX y egrave -20
+KPX y emacron -20
+KPX y eogonek -20
+KPX y o -20
+KPX y oacute -20
+KPX y ocircumflex -20
+KPX y odieresis -20
+KPX y ograve -20
+KPX y ohungarumlaut -20
+KPX y omacron -20
+KPX y oslash -20
+KPX y otilde -20
+KPX y period -100
+KPX yacute a -20
+KPX yacute aacute -20
+KPX yacute abreve -20
+KPX yacute acircumflex -20
+KPX yacute adieresis -20
+KPX yacute agrave -20
+KPX yacute amacron -20
+KPX yacute aogonek -20
+KPX yacute aring -20
+KPX yacute atilde -20
+KPX yacute comma -100
+KPX yacute e -20
+KPX yacute eacute -20
+KPX yacute ecaron -20
+KPX yacute ecircumflex -20
+KPX yacute edieresis -20
+KPX yacute edotaccent -20
+KPX yacute egrave -20
+KPX yacute emacron -20
+KPX yacute eogonek -20
+KPX yacute o -20
+KPX yacute oacute -20
+KPX yacute ocircumflex -20
+KPX yacute odieresis -20
+KPX yacute ograve -20
+KPX yacute ohungarumlaut -20
+KPX yacute omacron -20
+KPX yacute oslash -20
+KPX yacute otilde -20
+KPX yacute period -100
+KPX ydieresis a -20
+KPX ydieresis aacute -20
+KPX ydieresis abreve -20
+KPX ydieresis acircumflex -20
+KPX ydieresis adieresis -20
+KPX ydieresis agrave -20
+KPX ydieresis amacron -20
+KPX ydieresis aogonek -20
+KPX ydieresis aring -20
+KPX ydieresis atilde -20
+KPX ydieresis comma -100
+KPX ydieresis e -20
+KPX ydieresis eacute -20
+KPX ydieresis ecaron -20
+KPX ydieresis ecircumflex -20
+KPX ydieresis edieresis -20
+KPX ydieresis edotaccent -20
+KPX ydieresis egrave -20
+KPX ydieresis emacron -20
+KPX ydieresis eogonek -20
+KPX ydieresis o -20
+KPX ydieresis oacute -20
+KPX ydieresis ocircumflex -20
+KPX ydieresis odieresis -20
+KPX ydieresis ograve -20
+KPX ydieresis ohungarumlaut -20
+KPX ydieresis omacron -20
+KPX ydieresis oslash -20
+KPX ydieresis otilde -20
+KPX ydieresis period -100
+KPX z e -15
+KPX z eacute -15
+KPX z ecaron -15
+KPX z ecircumflex -15
+KPX z edieresis -15
+KPX z edotaccent -15
+KPX z egrave -15
+KPX z emacron -15
+KPX z eogonek -15
+KPX z o -15
+KPX z oacute -15
+KPX z ocircumflex -15
+KPX z odieresis -15
+KPX z ograve -15
+KPX z ohungarumlaut -15
+KPX z omacron -15
+KPX z oslash -15
+KPX z otilde -15
+KPX zacute e -15
+KPX zacute eacute -15
+KPX zacute ecaron -15
+KPX zacute ecircumflex -15
+KPX zacute edieresis -15
+KPX zacute edotaccent -15
+KPX zacute egrave -15
+KPX zacute emacron -15
+KPX zacute eogonek -15
+KPX zacute o -15
+KPX zacute oacute -15
+KPX zacute ocircumflex -15
+KPX zacute odieresis -15
+KPX zacute ograve -15
+KPX zacute ohungarumlaut -15
+KPX zacute omacron -15
+KPX zacute oslash -15
+KPX zacute otilde -15
+KPX zcaron e -15
+KPX zcaron eacute -15
+KPX zcaron ecaron -15
+KPX zcaron ecircumflex -15
+KPX zcaron edieresis -15
+KPX zcaron edotaccent -15
+KPX zcaron egrave -15
+KPX zcaron emacron -15
+KPX zcaron eogonek -15
+KPX zcaron o -15
+KPX zcaron oacute -15
+KPX zcaron ocircumflex -15
+KPX zcaron odieresis -15
+KPX zcaron ograve -15
+KPX zcaron ohungarumlaut -15
+KPX zcaron omacron -15
+KPX zcaron oslash -15
+KPX zcaron otilde -15
+KPX zdotaccent e -15
+KPX zdotaccent eacute -15
+KPX zdotaccent ecaron -15
+KPX zdotaccent ecircumflex -15
+KPX zdotaccent edieresis -15
+KPX zdotaccent edotaccent -15
+KPX zdotaccent egrave -15
+KPX zdotaccent emacron -15
+KPX zdotaccent eogonek -15
+KPX zdotaccent o -15
+KPX zdotaccent oacute -15
+KPX zdotaccent ocircumflex -15
+KPX zdotaccent odieresis -15
+KPX zdotaccent ograve -15
+KPX zdotaccent ohungarumlaut -15
+KPX zdotaccent omacron -15
+KPX zdotaccent oslash -15
+KPX zdotaccent otilde -15
+EndKernPairs
+EndKernData
+EndFontMetrics
diff --git a/src/main/resources/Resources/afm/Helvetica.afm b/src/main/resources/Resources/afm/Helvetica.afm
new file mode 100644
index 0000000..9492d8f
--- /dev/null
+++ b/src/main/resources/Resources/afm/Helvetica.afm
@@ -0,0 +1,3051 @@
+StartFontMetrics 4.1
+Comment Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved.
+Comment Creation Date: Thu May 1 12:38:23 1997
+Comment UniqueID 43054
+Comment VMusage 37069 48094
+FontName Helvetica
+FullName Helvetica
+FamilyName Helvetica
+Weight Medium
+ItalicAngle 0
+IsFixedPitch false
+CharacterSet ExtendedRoman
+FontBBox -166 -225 1000 931
+UnderlinePosition -100
+UnderlineThickness 50
+Version 002.000
+Notice Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved.Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries.
+EncodingScheme AdobeStandardEncoding
+CapHeight 718
+XHeight 523
+Ascender 718
+Descender -207
+StdHW 76
+StdVW 88
+StartCharMetrics 315
+C 32 ; WX 278 ; N space ; B 0 0 0 0 ;
+C 33 ; WX 278 ; N exclam ; B 90 0 187 718 ;
+C 34 ; WX 355 ; N quotedbl ; B 70 463 285 718 ;
+C 35 ; WX 556 ; N numbersign ; B 28 0 529 688 ;
+C 36 ; WX 556 ; N dollar ; B 32 -115 520 775 ;
+C 37 ; WX 889 ; N percent ; B 39 -19 850 703 ;
+C 38 ; WX 667 ; N ampersand ; B 44 -15 645 718 ;
+C 39 ; WX 222 ; N quoteright ; B 53 463 157 718 ;
+C 40 ; WX 333 ; N parenleft ; B 68 -207 299 733 ;
+C 41 ; WX 333 ; N parenright ; B 34 -207 265 733 ;
+C 42 ; WX 389 ; N asterisk ; B 39 431 349 718 ;
+C 43 ; WX 584 ; N plus ; B 39 0 545 505 ;
+C 44 ; WX 278 ; N comma ; B 87 -147 191 106 ;
+C 45 ; WX 333 ; N hyphen ; B 44 232 289 322 ;
+C 46 ; WX 278 ; N period ; B 87 0 191 106 ;
+C 47 ; WX 278 ; N slash ; B -17 -19 295 737 ;
+C 48 ; WX 556 ; N zero ; B 37 -19 519 703 ;
+C 49 ; WX 556 ; N one ; B 101 0 359 703 ;
+C 50 ; WX 556 ; N two ; B 26 0 507 703 ;
+C 51 ; WX 556 ; N three ; B 34 -19 522 703 ;
+C 52 ; WX 556 ; N four ; B 25 0 523 703 ;
+C 53 ; WX 556 ; N five ; B 32 -19 514 688 ;
+C 54 ; WX 556 ; N six ; B 38 -19 518 703 ;
+C 55 ; WX 556 ; N seven ; B 37 0 523 688 ;
+C 56 ; WX 556 ; N eight ; B 38 -19 517 703 ;
+C 57 ; WX 556 ; N nine ; B 42 -19 514 703 ;
+C 58 ; WX 278 ; N colon ; B 87 0 191 516 ;
+C 59 ; WX 278 ; N semicolon ; B 87 -147 191 516 ;
+C 60 ; WX 584 ; N less ; B 48 11 536 495 ;
+C 61 ; WX 584 ; N equal ; B 39 115 545 390 ;
+C 62 ; WX 584 ; N greater ; B 48 11 536 495 ;
+C 63 ; WX 556 ; N question ; B 56 0 492 727 ;
+C 64 ; WX 1015 ; N at ; B 147 -19 868 737 ;
+C 65 ; WX 667 ; N A ; B 14 0 654 718 ;
+C 66 ; WX 667 ; N B ; B 74 0 627 718 ;
+C 67 ; WX 722 ; N C ; B 44 -19 681 737 ;
+C 68 ; WX 722 ; N D ; B 81 0 674 718 ;
+C 69 ; WX 667 ; N E ; B 86 0 616 718 ;
+C 70 ; WX 611 ; N F ; B 86 0 583 718 ;
+C 71 ; WX 778 ; N G ; B 48 -19 704 737 ;
+C 72 ; WX 722 ; N H ; B 77 0 646 718 ;
+C 73 ; WX 278 ; N I ; B 91 0 188 718 ;
+C 74 ; WX 500 ; N J ; B 17 -19 428 718 ;
+C 75 ; WX 667 ; N K ; B 76 0 663 718 ;
+C 76 ; WX 556 ; N L ; B 76 0 537 718 ;
+C 77 ; WX 833 ; N M ; B 73 0 761 718 ;
+C 78 ; WX 722 ; N N ; B 76 0 646 718 ;
+C 79 ; WX 778 ; N O ; B 39 -19 739 737 ;
+C 80 ; WX 667 ; N P ; B 86 0 622 718 ;
+C 81 ; WX 778 ; N Q ; B 39 -56 739 737 ;
+C 82 ; WX 722 ; N R ; B 88 0 684 718 ;
+C 83 ; WX 667 ; N S ; B 49 -19 620 737 ;
+C 84 ; WX 611 ; N T ; B 14 0 597 718 ;
+C 85 ; WX 722 ; N U ; B 79 -19 644 718 ;
+C 86 ; WX 667 ; N V ; B 20 0 647 718 ;
+C 87 ; WX 944 ; N W ; B 16 0 928 718 ;
+C 88 ; WX 667 ; N X ; B 19 0 648 718 ;
+C 89 ; WX 667 ; N Y ; B 14 0 653 718 ;
+C 90 ; WX 611 ; N Z ; B 23 0 588 718 ;
+C 91 ; WX 278 ; N bracketleft ; B 63 -196 250 722 ;
+C 92 ; WX 278 ; N backslash ; B -17 -19 295 737 ;
+C 93 ; WX 278 ; N bracketright ; B 28 -196 215 722 ;
+C 94 ; WX 469 ; N asciicircum ; B -14 264 483 688 ;
+C 95 ; WX 556 ; N underscore ; B 0 -125 556 -75 ;
+C 96 ; WX 222 ; N quoteleft ; B 65 470 169 725 ;
+C 97 ; WX 556 ; N a ; B 36 -15 530 538 ;
+C 98 ; WX 556 ; N b ; B 58 -15 517 718 ;
+C 99 ; WX 500 ; N c ; B 30 -15 477 538 ;
+C 100 ; WX 556 ; N d ; B 35 -15 499 718 ;
+C 101 ; WX 556 ; N e ; B 40 -15 516 538 ;
+C 102 ; WX 278 ; N f ; B 14 0 262 728 ; L i fi ; L l fl ;
+C 103 ; WX 556 ; N g ; B 40 -220 499 538 ;
+C 104 ; WX 556 ; N h ; B 65 0 491 718 ;
+C 105 ; WX 222 ; N i ; B 67 0 155 718 ;
+C 106 ; WX 222 ; N j ; B -16 -210 155 718 ;
+C 107 ; WX 500 ; N k ; B 67 0 501 718 ;
+C 108 ; WX 222 ; N l ; B 67 0 155 718 ;
+C 109 ; WX 833 ; N m ; B 65 0 769 538 ;
+C 110 ; WX 556 ; N n ; B 65 0 491 538 ;
+C 111 ; WX 556 ; N o ; B 35 -14 521 538 ;
+C 112 ; WX 556 ; N p ; B 58 -207 517 538 ;
+C 113 ; WX 556 ; N q ; B 35 -207 494 538 ;
+C 114 ; WX 333 ; N r ; B 77 0 332 538 ;
+C 115 ; WX 500 ; N s ; B 32 -15 464 538 ;
+C 116 ; WX 278 ; N t ; B 14 -7 257 669 ;
+C 117 ; WX 556 ; N u ; B 68 -15 489 523 ;
+C 118 ; WX 500 ; N v ; B 8 0 492 523 ;
+C 119 ; WX 722 ; N w ; B 14 0 709 523 ;
+C 120 ; WX 500 ; N x ; B 11 0 490 523 ;
+C 121 ; WX 500 ; N y ; B 11 -214 489 523 ;
+C 122 ; WX 500 ; N z ; B 31 0 469 523 ;
+C 123 ; WX 334 ; N braceleft ; B 42 -196 292 722 ;
+C 124 ; WX 260 ; N bar ; B 94 -225 167 775 ;
+C 125 ; WX 334 ; N braceright ; B 42 -196 292 722 ;
+C 126 ; WX 584 ; N asciitilde ; B 61 180 523 326 ;
+C 161 ; WX 333 ; N exclamdown ; B 118 -195 215 523 ;
+C 162 ; WX 556 ; N cent ; B 51 -115 513 623 ;
+C 163 ; WX 556 ; N sterling ; B 33 -16 539 718 ;
+C 164 ; WX 167 ; N fraction ; B -166 -19 333 703 ;
+C 165 ; WX 556 ; N yen ; B 3 0 553 688 ;
+C 166 ; WX 556 ; N florin ; B -11 -207 501 737 ;
+C 167 ; WX 556 ; N section ; B 43 -191 512 737 ;
+C 168 ; WX 556 ; N currency ; B 28 99 528 603 ;
+C 169 ; WX 191 ; N quotesingle ; B 59 463 132 718 ;
+C 170 ; WX 333 ; N quotedblleft ; B 38 470 307 725 ;
+C 171 ; WX 556 ; N guillemotleft ; B 97 108 459 446 ;
+C 172 ; WX 333 ; N guilsinglleft ; B 88 108 245 446 ;
+C 173 ; WX 333 ; N guilsinglright ; B 88 108 245 446 ;
+C 174 ; WX 500 ; N fi ; B 14 0 434 728 ;
+C 175 ; WX 500 ; N fl ; B 14 0 432 728 ;
+C 177 ; WX 556 ; N endash ; B 0 240 556 313 ;
+C 178 ; WX 556 ; N dagger ; B 43 -159 514 718 ;
+C 179 ; WX 556 ; N daggerdbl ; B 43 -159 514 718 ;
+C 180 ; WX 278 ; N periodcentered ; B 77 190 202 315 ;
+C 182 ; WX 537 ; N paragraph ; B 18 -173 497 718 ;
+C 183 ; WX 350 ; N bullet ; B 18 202 333 517 ;
+C 184 ; WX 222 ; N quotesinglbase ; B 53 -149 157 106 ;
+C 185 ; WX 333 ; N quotedblbase ; B 26 -149 295 106 ;
+C 186 ; WX 333 ; N quotedblright ; B 26 463 295 718 ;
+C 187 ; WX 556 ; N guillemotright ; B 97 108 459 446 ;
+C 188 ; WX 1000 ; N ellipsis ; B 115 0 885 106 ;
+C 189 ; WX 1000 ; N perthousand ; B 7 -19 994 703 ;
+C 191 ; WX 611 ; N questiondown ; B 91 -201 527 525 ;
+C 193 ; WX 333 ; N grave ; B 14 593 211 734 ;
+C 194 ; WX 333 ; N acute ; B 122 593 319 734 ;
+C 195 ; WX 333 ; N circumflex ; B 21 593 312 734 ;
+C 196 ; WX 333 ; N tilde ; B -4 606 337 722 ;
+C 197 ; WX 333 ; N macron ; B 10 627 323 684 ;
+C 198 ; WX 333 ; N breve ; B 13 595 321 731 ;
+C 199 ; WX 333 ; N dotaccent ; B 121 604 212 706 ;
+C 200 ; WX 333 ; N dieresis ; B 40 604 293 706 ;
+C 202 ; WX 333 ; N ring ; B 75 572 259 756 ;
+C 203 ; WX 333 ; N cedilla ; B 45 -225 259 0 ;
+C 205 ; WX 333 ; N hungarumlaut ; B 31 593 409 734 ;
+C 206 ; WX 333 ; N ogonek ; B 73 -225 287 0 ;
+C 207 ; WX 333 ; N caron ; B 21 593 312 734 ;
+C 208 ; WX 1000 ; N emdash ; B 0 240 1000 313 ;
+C 225 ; WX 1000 ; N AE ; B 8 0 951 718 ;
+C 227 ; WX 370 ; N ordfeminine ; B 24 405 346 737 ;
+C 232 ; WX 556 ; N Lslash ; B -20 0 537 718 ;
+C 233 ; WX 778 ; N Oslash ; B 39 -19 740 737 ;
+C 234 ; WX 1000 ; N OE ; B 36 -19 965 737 ;
+C 235 ; WX 365 ; N ordmasculine ; B 25 405 341 737 ;
+C 241 ; WX 889 ; N ae ; B 36 -15 847 538 ;
+C 245 ; WX 278 ; N dotlessi ; B 95 0 183 523 ;
+C 248 ; WX 222 ; N lslash ; B -20 0 242 718 ;
+C 249 ; WX 611 ; N oslash ; B 28 -22 537 545 ;
+C 250 ; WX 944 ; N oe ; B 35 -15 902 538 ;
+C 251 ; WX 611 ; N germandbls ; B 67 -15 571 728 ;
+C -1 ; WX 278 ; N Idieresis ; B 13 0 266 901 ;
+C -1 ; WX 556 ; N eacute ; B 40 -15 516 734 ;
+C -1 ; WX 556 ; N abreve ; B 36 -15 530 731 ;
+C -1 ; WX 556 ; N uhungarumlaut ; B 68 -15 521 734 ;
+C -1 ; WX 556 ; N ecaron ; B 40 -15 516 734 ;
+C -1 ; WX 667 ; N Ydieresis ; B 14 0 653 901 ;
+C -1 ; WX 584 ; N divide ; B 39 -19 545 524 ;
+C -1 ; WX 667 ; N Yacute ; B 14 0 653 929 ;
+C -1 ; WX 667 ; N Acircumflex ; B 14 0 654 929 ;
+C -1 ; WX 556 ; N aacute ; B 36 -15 530 734 ;
+C -1 ; WX 722 ; N Ucircumflex ; B 79 -19 644 929 ;
+C -1 ; WX 500 ; N yacute ; B 11 -214 489 734 ;
+C -1 ; WX 500 ; N scommaaccent ; B 32 -225 464 538 ;
+C -1 ; WX 556 ; N ecircumflex ; B 40 -15 516 734 ;
+C -1 ; WX 722 ; N Uring ; B 79 -19 644 931 ;
+C -1 ; WX 722 ; N Udieresis ; B 79 -19 644 901 ;
+C -1 ; WX 556 ; N aogonek ; B 36 -220 547 538 ;
+C -1 ; WX 722 ; N Uacute ; B 79 -19 644 929 ;
+C -1 ; WX 556 ; N uogonek ; B 68 -225 519 523 ;
+C -1 ; WX 667 ; N Edieresis ; B 86 0 616 901 ;
+C -1 ; WX 722 ; N Dcroat ; B 0 0 674 718 ;
+C -1 ; WX 250 ; N commaaccent ; B 87 -225 181 -40 ;
+C -1 ; WX 737 ; N copyright ; B -14 -19 752 737 ;
+C -1 ; WX 667 ; N Emacron ; B 86 0 616 879 ;
+C -1 ; WX 500 ; N ccaron ; B 30 -15 477 734 ;
+C -1 ; WX 556 ; N aring ; B 36 -15 530 756 ;
+C -1 ; WX 722 ; N Ncommaaccent ; B 76 -225 646 718 ;
+C -1 ; WX 222 ; N lacute ; B 67 0 264 929 ;
+C -1 ; WX 556 ; N agrave ; B 36 -15 530 734 ;
+C -1 ; WX 611 ; N Tcommaaccent ; B 14 -225 597 718 ;
+C -1 ; WX 722 ; N Cacute ; B 44 -19 681 929 ;
+C -1 ; WX 556 ; N atilde ; B 36 -15 530 722 ;
+C -1 ; WX 667 ; N Edotaccent ; B 86 0 616 901 ;
+C -1 ; WX 500 ; N scaron ; B 32 -15 464 734 ;
+C -1 ; WX 500 ; N scedilla ; B 32 -225 464 538 ;
+C -1 ; WX 278 ; N iacute ; B 95 0 292 734 ;
+C -1 ; WX 471 ; N lozenge ; B 10 0 462 728 ;
+C -1 ; WX 722 ; N Rcaron ; B 88 0 684 929 ;
+C -1 ; WX 778 ; N Gcommaaccent ; B 48 -225 704 737 ;
+C -1 ; WX 556 ; N ucircumflex ; B 68 -15 489 734 ;
+C -1 ; WX 556 ; N acircumflex ; B 36 -15 530 734 ;
+C -1 ; WX 667 ; N Amacron ; B 14 0 654 879 ;
+C -1 ; WX 333 ; N rcaron ; B 61 0 352 734 ;
+C -1 ; WX 500 ; N ccedilla ; B 30 -225 477 538 ;
+C -1 ; WX 611 ; N Zdotaccent ; B 23 0 588 901 ;
+C -1 ; WX 667 ; N Thorn ; B 86 0 622 718 ;
+C -1 ; WX 778 ; N Omacron ; B 39 -19 739 879 ;
+C -1 ; WX 722 ; N Racute ; B 88 0 684 929 ;
+C -1 ; WX 667 ; N Sacute ; B 49 -19 620 929 ;
+C -1 ; WX 643 ; N dcaron ; B 35 -15 655 718 ;
+C -1 ; WX 722 ; N Umacron ; B 79 -19 644 879 ;
+C -1 ; WX 556 ; N uring ; B 68 -15 489 756 ;
+C -1 ; WX 333 ; N threesuperior ; B 5 270 325 703 ;
+C -1 ; WX 778 ; N Ograve ; B 39 -19 739 929 ;
+C -1 ; WX 667 ; N Agrave ; B 14 0 654 929 ;
+C -1 ; WX 667 ; N Abreve ; B 14 0 654 926 ;
+C -1 ; WX 584 ; N multiply ; B 39 0 545 506 ;
+C -1 ; WX 556 ; N uacute ; B 68 -15 489 734 ;
+C -1 ; WX 611 ; N Tcaron ; B 14 0 597 929 ;
+C -1 ; WX 476 ; N partialdiff ; B 13 -38 463 714 ;
+C -1 ; WX 500 ; N ydieresis ; B 11 -214 489 706 ;
+C -1 ; WX 722 ; N Nacute ; B 76 0 646 929 ;
+C -1 ; WX 278 ; N icircumflex ; B -6 0 285 734 ;
+C -1 ; WX 667 ; N Ecircumflex ; B 86 0 616 929 ;
+C -1 ; WX 556 ; N adieresis ; B 36 -15 530 706 ;
+C -1 ; WX 556 ; N edieresis ; B 40 -15 516 706 ;
+C -1 ; WX 500 ; N cacute ; B 30 -15 477 734 ;
+C -1 ; WX 556 ; N nacute ; B 65 0 491 734 ;
+C -1 ; WX 556 ; N umacron ; B 68 -15 489 684 ;
+C -1 ; WX 722 ; N Ncaron ; B 76 0 646 929 ;
+C -1 ; WX 278 ; N Iacute ; B 91 0 292 929 ;
+C -1 ; WX 584 ; N plusminus ; B 39 0 545 506 ;
+C -1 ; WX 260 ; N brokenbar ; B 94 -150 167 700 ;
+C -1 ; WX 737 ; N registered ; B -14 -19 752 737 ;
+C -1 ; WX 778 ; N Gbreve ; B 48 -19 704 926 ;
+C -1 ; WX 278 ; N Idotaccent ; B 91 0 188 901 ;
+C -1 ; WX 600 ; N summation ; B 15 -10 586 706 ;
+C -1 ; WX 667 ; N Egrave ; B 86 0 616 929 ;
+C -1 ; WX 333 ; N racute ; B 77 0 332 734 ;
+C -1 ; WX 556 ; N omacron ; B 35 -14 521 684 ;
+C -1 ; WX 611 ; N Zacute ; B 23 0 588 929 ;
+C -1 ; WX 611 ; N Zcaron ; B 23 0 588 929 ;
+C -1 ; WX 549 ; N greaterequal ; B 26 0 523 674 ;
+C -1 ; WX 722 ; N Eth ; B 0 0 674 718 ;
+C -1 ; WX 722 ; N Ccedilla ; B 44 -225 681 737 ;
+C -1 ; WX 222 ; N lcommaaccent ; B 67 -225 167 718 ;
+C -1 ; WX 317 ; N tcaron ; B 14 -7 329 808 ;
+C -1 ; WX 556 ; N eogonek ; B 40 -225 516 538 ;
+C -1 ; WX 722 ; N Uogonek ; B 79 -225 644 718 ;
+C -1 ; WX 667 ; N Aacute ; B 14 0 654 929 ;
+C -1 ; WX 667 ; N Adieresis ; B 14 0 654 901 ;
+C -1 ; WX 556 ; N egrave ; B 40 -15 516 734 ;
+C -1 ; WX 500 ; N zacute ; B 31 0 469 734 ;
+C -1 ; WX 222 ; N iogonek ; B -31 -225 183 718 ;
+C -1 ; WX 778 ; N Oacute ; B 39 -19 739 929 ;
+C -1 ; WX 556 ; N oacute ; B 35 -14 521 734 ;
+C -1 ; WX 556 ; N amacron ; B 36 -15 530 684 ;
+C -1 ; WX 500 ; N sacute ; B 32 -15 464 734 ;
+C -1 ; WX 278 ; N idieresis ; B 13 0 266 706 ;
+C -1 ; WX 778 ; N Ocircumflex ; B 39 -19 739 929 ;
+C -1 ; WX 722 ; N Ugrave ; B 79 -19 644 929 ;
+C -1 ; WX 612 ; N Delta ; B 6 0 608 688 ;
+C -1 ; WX 556 ; N thorn ; B 58 -207 517 718 ;
+C -1 ; WX 333 ; N twosuperior ; B 4 281 323 703 ;
+C -1 ; WX 778 ; N Odieresis ; B 39 -19 739 901 ;
+C -1 ; WX 556 ; N mu ; B 68 -207 489 523 ;
+C -1 ; WX 278 ; N igrave ; B -13 0 184 734 ;
+C -1 ; WX 556 ; N ohungarumlaut ; B 35 -14 521 734 ;
+C -1 ; WX 667 ; N Eogonek ; B 86 -220 633 718 ;
+C -1 ; WX 556 ; N dcroat ; B 35 -15 550 718 ;
+C -1 ; WX 834 ; N threequarters ; B 45 -19 810 703 ;
+C -1 ; WX 667 ; N Scedilla ; B 49 -225 620 737 ;
+C -1 ; WX 299 ; N lcaron ; B 67 0 311 718 ;
+C -1 ; WX 667 ; N Kcommaaccent ; B 76 -225 663 718 ;
+C -1 ; WX 556 ; N Lacute ; B 76 0 537 929 ;
+C -1 ; WX 1000 ; N trademark ; B 46 306 903 718 ;
+C -1 ; WX 556 ; N edotaccent ; B 40 -15 516 706 ;
+C -1 ; WX 278 ; N Igrave ; B -13 0 188 929 ;
+C -1 ; WX 278 ; N Imacron ; B -17 0 296 879 ;
+C -1 ; WX 556 ; N Lcaron ; B 76 0 537 718 ;
+C -1 ; WX 834 ; N onehalf ; B 43 -19 773 703 ;
+C -1 ; WX 549 ; N lessequal ; B 26 0 523 674 ;
+C -1 ; WX 556 ; N ocircumflex ; B 35 -14 521 734 ;
+C -1 ; WX 556 ; N ntilde ; B 65 0 491 722 ;
+C -1 ; WX 722 ; N Uhungarumlaut ; B 79 -19 644 929 ;
+C -1 ; WX 667 ; N Eacute ; B 86 0 616 929 ;
+C -1 ; WX 556 ; N emacron ; B 40 -15 516 684 ;
+C -1 ; WX 556 ; N gbreve ; B 40 -220 499 731 ;
+C -1 ; WX 834 ; N onequarter ; B 73 -19 756 703 ;
+C -1 ; WX 667 ; N Scaron ; B 49 -19 620 929 ;
+C -1 ; WX 667 ; N Scommaaccent ; B 49 -225 620 737 ;
+C -1 ; WX 778 ; N Ohungarumlaut ; B 39 -19 739 929 ;
+C -1 ; WX 400 ; N degree ; B 54 411 346 703 ;
+C -1 ; WX 556 ; N ograve ; B 35 -14 521 734 ;
+C -1 ; WX 722 ; N Ccaron ; B 44 -19 681 929 ;
+C -1 ; WX 556 ; N ugrave ; B 68 -15 489 734 ;
+C -1 ; WX 453 ; N radical ; B -4 -80 458 762 ;
+C -1 ; WX 722 ; N Dcaron ; B 81 0 674 929 ;
+C -1 ; WX 333 ; N rcommaaccent ; B 77 -225 332 538 ;
+C -1 ; WX 722 ; N Ntilde ; B 76 0 646 917 ;
+C -1 ; WX 556 ; N otilde ; B 35 -14 521 722 ;
+C -1 ; WX 722 ; N Rcommaaccent ; B 88 -225 684 718 ;
+C -1 ; WX 556 ; N Lcommaaccent ; B 76 -225 537 718 ;
+C -1 ; WX 667 ; N Atilde ; B 14 0 654 917 ;
+C -1 ; WX 667 ; N Aogonek ; B 14 -225 654 718 ;
+C -1 ; WX 667 ; N Aring ; B 14 0 654 931 ;
+C -1 ; WX 778 ; N Otilde ; B 39 -19 739 917 ;
+C -1 ; WX 500 ; N zdotaccent ; B 31 0 469 706 ;
+C -1 ; WX 667 ; N Ecaron ; B 86 0 616 929 ;
+C -1 ; WX 278 ; N Iogonek ; B -3 -225 211 718 ;
+C -1 ; WX 500 ; N kcommaaccent ; B 67 -225 501 718 ;
+C -1 ; WX 584 ; N minus ; B 39 216 545 289 ;
+C -1 ; WX 278 ; N Icircumflex ; B -6 0 285 929 ;
+C -1 ; WX 556 ; N ncaron ; B 65 0 491 734 ;
+C -1 ; WX 278 ; N tcommaaccent ; B 14 -225 257 669 ;
+C -1 ; WX 584 ; N logicalnot ; B 39 108 545 390 ;
+C -1 ; WX 556 ; N odieresis ; B 35 -14 521 706 ;
+C -1 ; WX 556 ; N udieresis ; B 68 -15 489 706 ;
+C -1 ; WX 549 ; N notequal ; B 12 -35 537 551 ;
+C -1 ; WX 556 ; N gcommaaccent ; B 40 -220 499 822 ;
+C -1 ; WX 556 ; N eth ; B 35 -15 522 737 ;
+C -1 ; WX 500 ; N zcaron ; B 31 0 469 734 ;
+C -1 ; WX 556 ; N ncommaaccent ; B 65 -225 491 538 ;
+C -1 ; WX 333 ; N onesuperior ; B 43 281 222 703 ;
+C -1 ; WX 278 ; N imacron ; B 5 0 272 684 ;
+C -1 ; WX 556 ; N Euro ; B 0 0 0 0 ;
+EndCharMetrics
+StartKernData
+StartKernPairs 2705
+KPX A C -30
+KPX A Cacute -30
+KPX A Ccaron -30
+KPX A Ccedilla -30
+KPX A G -30
+KPX A Gbreve -30
+KPX A Gcommaaccent -30
+KPX A O -30
+KPX A Oacute -30
+KPX A Ocircumflex -30
+KPX A Odieresis -30
+KPX A Ograve -30
+KPX A Ohungarumlaut -30
+KPX A Omacron -30
+KPX A Oslash -30
+KPX A Otilde -30
+KPX A Q -30
+KPX A T -120
+KPX A Tcaron -120
+KPX A Tcommaaccent -120
+KPX A U -50
+KPX A Uacute -50
+KPX A Ucircumflex -50
+KPX A Udieresis -50
+KPX A Ugrave -50
+KPX A Uhungarumlaut -50
+KPX A Umacron -50
+KPX A Uogonek -50
+KPX A Uring -50
+KPX A V -70
+KPX A W -50
+KPX A Y -100
+KPX A Yacute -100
+KPX A Ydieresis -100
+KPX A u -30
+KPX A uacute -30
+KPX A ucircumflex -30
+KPX A udieresis -30
+KPX A ugrave -30
+KPX A uhungarumlaut -30
+KPX A umacron -30
+KPX A uogonek -30
+KPX A uring -30
+KPX A v -40
+KPX A w -40
+KPX A y -40
+KPX A yacute -40
+KPX A ydieresis -40
+KPX Aacute C -30
+KPX Aacute Cacute -30
+KPX Aacute Ccaron -30
+KPX Aacute Ccedilla -30
+KPX Aacute G -30
+KPX Aacute Gbreve -30
+KPX Aacute Gcommaaccent -30
+KPX Aacute O -30
+KPX Aacute Oacute -30
+KPX Aacute Ocircumflex -30
+KPX Aacute Odieresis -30
+KPX Aacute Ograve -30
+KPX Aacute Ohungarumlaut -30
+KPX Aacute Omacron -30
+KPX Aacute Oslash -30
+KPX Aacute Otilde -30
+KPX Aacute Q -30
+KPX Aacute T -120
+KPX Aacute Tcaron -120
+KPX Aacute Tcommaaccent -120
+KPX Aacute U -50
+KPX Aacute Uacute -50
+KPX Aacute Ucircumflex -50
+KPX Aacute Udieresis -50
+KPX Aacute Ugrave -50
+KPX Aacute Uhungarumlaut -50
+KPX Aacute Umacron -50
+KPX Aacute Uogonek -50
+KPX Aacute Uring -50
+KPX Aacute V -70
+KPX Aacute W -50
+KPX Aacute Y -100
+KPX Aacute Yacute -100
+KPX Aacute Ydieresis -100
+KPX Aacute u -30
+KPX Aacute uacute -30
+KPX Aacute ucircumflex -30
+KPX Aacute udieresis -30
+KPX Aacute ugrave -30
+KPX Aacute uhungarumlaut -30
+KPX Aacute umacron -30
+KPX Aacute uogonek -30
+KPX Aacute uring -30
+KPX Aacute v -40
+KPX Aacute w -40
+KPX Aacute y -40
+KPX Aacute yacute -40
+KPX Aacute ydieresis -40
+KPX Abreve C -30
+KPX Abreve Cacute -30
+KPX Abreve Ccaron -30
+KPX Abreve Ccedilla -30
+KPX Abreve G -30
+KPX Abreve Gbreve -30
+KPX Abreve Gcommaaccent -30
+KPX Abreve O -30
+KPX Abreve Oacute -30
+KPX Abreve Ocircumflex -30
+KPX Abreve Odieresis -30
+KPX Abreve Ograve -30
+KPX Abreve Ohungarumlaut -30
+KPX Abreve Omacron -30
+KPX Abreve Oslash -30
+KPX Abreve Otilde -30
+KPX Abreve Q -30
+KPX Abreve T -120
+KPX Abreve Tcaron -120
+KPX Abreve Tcommaaccent -120
+KPX Abreve U -50
+KPX Abreve Uacute -50
+KPX Abreve Ucircumflex -50
+KPX Abreve Udieresis -50
+KPX Abreve Ugrave -50
+KPX Abreve Uhungarumlaut -50
+KPX Abreve Umacron -50
+KPX Abreve Uogonek -50
+KPX Abreve Uring -50
+KPX Abreve V -70
+KPX Abreve W -50
+KPX Abreve Y -100
+KPX Abreve Yacute -100
+KPX Abreve Ydieresis -100
+KPX Abreve u -30
+KPX Abreve uacute -30
+KPX Abreve ucircumflex -30
+KPX Abreve udieresis -30
+KPX Abreve ugrave -30
+KPX Abreve uhungarumlaut -30
+KPX Abreve umacron -30
+KPX Abreve uogonek -30
+KPX Abreve uring -30
+KPX Abreve v -40
+KPX Abreve w -40
+KPX Abreve y -40
+KPX Abreve yacute -40
+KPX Abreve ydieresis -40
+KPX Acircumflex C -30
+KPX Acircumflex Cacute -30
+KPX Acircumflex Ccaron -30
+KPX Acircumflex Ccedilla -30
+KPX Acircumflex G -30
+KPX Acircumflex Gbreve -30
+KPX Acircumflex Gcommaaccent -30
+KPX Acircumflex O -30
+KPX Acircumflex Oacute -30
+KPX Acircumflex Ocircumflex -30
+KPX Acircumflex Odieresis -30
+KPX Acircumflex Ograve -30
+KPX Acircumflex Ohungarumlaut -30
+KPX Acircumflex Omacron -30
+KPX Acircumflex Oslash -30
+KPX Acircumflex Otilde -30
+KPX Acircumflex Q -30
+KPX Acircumflex T -120
+KPX Acircumflex Tcaron -120
+KPX Acircumflex Tcommaaccent -120
+KPX Acircumflex U -50
+KPX Acircumflex Uacute -50
+KPX Acircumflex Ucircumflex -50
+KPX Acircumflex Udieresis -50
+KPX Acircumflex Ugrave -50
+KPX Acircumflex Uhungarumlaut -50
+KPX Acircumflex Umacron -50
+KPX Acircumflex Uogonek -50
+KPX Acircumflex Uring -50
+KPX Acircumflex V -70
+KPX Acircumflex W -50
+KPX Acircumflex Y -100
+KPX Acircumflex Yacute -100
+KPX Acircumflex Ydieresis -100
+KPX Acircumflex u -30
+KPX Acircumflex uacute -30
+KPX Acircumflex ucircumflex -30
+KPX Acircumflex udieresis -30
+KPX Acircumflex ugrave -30
+KPX Acircumflex uhungarumlaut -30
+KPX Acircumflex umacron -30
+KPX Acircumflex uogonek -30
+KPX Acircumflex uring -30
+KPX Acircumflex v -40
+KPX Acircumflex w -40
+KPX Acircumflex y -40
+KPX Acircumflex yacute -40
+KPX Acircumflex ydieresis -40
+KPX Adieresis C -30
+KPX Adieresis Cacute -30
+KPX Adieresis Ccaron -30
+KPX Adieresis Ccedilla -30
+KPX Adieresis G -30
+KPX Adieresis Gbreve -30
+KPX Adieresis Gcommaaccent -30
+KPX Adieresis O -30
+KPX Adieresis Oacute -30
+KPX Adieresis Ocircumflex -30
+KPX Adieresis Odieresis -30
+KPX Adieresis Ograve -30
+KPX Adieresis Ohungarumlaut -30
+KPX Adieresis Omacron -30
+KPX Adieresis Oslash -30
+KPX Adieresis Otilde -30
+KPX Adieresis Q -30
+KPX Adieresis T -120
+KPX Adieresis Tcaron -120
+KPX Adieresis Tcommaaccent -120
+KPX Adieresis U -50
+KPX Adieresis Uacute -50
+KPX Adieresis Ucircumflex -50
+KPX Adieresis Udieresis -50
+KPX Adieresis Ugrave -50
+KPX Adieresis Uhungarumlaut -50
+KPX Adieresis Umacron -50
+KPX Adieresis Uogonek -50
+KPX Adieresis Uring -50
+KPX Adieresis V -70
+KPX Adieresis W -50
+KPX Adieresis Y -100
+KPX Adieresis Yacute -100
+KPX Adieresis Ydieresis -100
+KPX Adieresis u -30
+KPX Adieresis uacute -30
+KPX Adieresis ucircumflex -30
+KPX Adieresis udieresis -30
+KPX Adieresis ugrave -30
+KPX Adieresis uhungarumlaut -30
+KPX Adieresis umacron -30
+KPX Adieresis uogonek -30
+KPX Adieresis uring -30
+KPX Adieresis v -40
+KPX Adieresis w -40
+KPX Adieresis y -40
+KPX Adieresis yacute -40
+KPX Adieresis ydieresis -40
+KPX Agrave C -30
+KPX Agrave Cacute -30
+KPX Agrave Ccaron -30
+KPX Agrave Ccedilla -30
+KPX Agrave G -30
+KPX Agrave Gbreve -30
+KPX Agrave Gcommaaccent -30
+KPX Agrave O -30
+KPX Agrave Oacute -30
+KPX Agrave Ocircumflex -30
+KPX Agrave Odieresis -30
+KPX Agrave Ograve -30
+KPX Agrave Ohungarumlaut -30
+KPX Agrave Omacron -30
+KPX Agrave Oslash -30
+KPX Agrave Otilde -30
+KPX Agrave Q -30
+KPX Agrave T -120
+KPX Agrave Tcaron -120
+KPX Agrave Tcommaaccent -120
+KPX Agrave U -50
+KPX Agrave Uacute -50
+KPX Agrave Ucircumflex -50
+KPX Agrave Udieresis -50
+KPX Agrave Ugrave -50
+KPX Agrave Uhungarumlaut -50
+KPX Agrave Umacron -50
+KPX Agrave Uogonek -50
+KPX Agrave Uring -50
+KPX Agrave V -70
+KPX Agrave W -50
+KPX Agrave Y -100
+KPX Agrave Yacute -100
+KPX Agrave Ydieresis -100
+KPX Agrave u -30
+KPX Agrave uacute -30
+KPX Agrave ucircumflex -30
+KPX Agrave udieresis -30
+KPX Agrave ugrave -30
+KPX Agrave uhungarumlaut -30
+KPX Agrave umacron -30
+KPX Agrave uogonek -30
+KPX Agrave uring -30
+KPX Agrave v -40
+KPX Agrave w -40
+KPX Agrave y -40
+KPX Agrave yacute -40
+KPX Agrave ydieresis -40
+KPX Amacron C -30
+KPX Amacron Cacute -30
+KPX Amacron Ccaron -30
+KPX Amacron Ccedilla -30
+KPX Amacron G -30
+KPX Amacron Gbreve -30
+KPX Amacron Gcommaaccent -30
+KPX Amacron O -30
+KPX Amacron Oacute -30
+KPX Amacron Ocircumflex -30
+KPX Amacron Odieresis -30
+KPX Amacron Ograve -30
+KPX Amacron Ohungarumlaut -30
+KPX Amacron Omacron -30
+KPX Amacron Oslash -30
+KPX Amacron Otilde -30
+KPX Amacron Q -30
+KPX Amacron T -120
+KPX Amacron Tcaron -120
+KPX Amacron Tcommaaccent -120
+KPX Amacron U -50
+KPX Amacron Uacute -50
+KPX Amacron Ucircumflex -50
+KPX Amacron Udieresis -50
+KPX Amacron Ugrave -50
+KPX Amacron Uhungarumlaut -50
+KPX Amacron Umacron -50
+KPX Amacron Uogonek -50
+KPX Amacron Uring -50
+KPX Amacron V -70
+KPX Amacron W -50
+KPX Amacron Y -100
+KPX Amacron Yacute -100
+KPX Amacron Ydieresis -100
+KPX Amacron u -30
+KPX Amacron uacute -30
+KPX Amacron ucircumflex -30
+KPX Amacron udieresis -30
+KPX Amacron ugrave -30
+KPX Amacron uhungarumlaut -30
+KPX Amacron umacron -30
+KPX Amacron uogonek -30
+KPX Amacron uring -30
+KPX Amacron v -40
+KPX Amacron w -40
+KPX Amacron y -40
+KPX Amacron yacute -40
+KPX Amacron ydieresis -40
+KPX Aogonek C -30
+KPX Aogonek Cacute -30
+KPX Aogonek Ccaron -30
+KPX Aogonek Ccedilla -30
+KPX Aogonek G -30
+KPX Aogonek Gbreve -30
+KPX Aogonek Gcommaaccent -30
+KPX Aogonek O -30
+KPX Aogonek Oacute -30
+KPX Aogonek Ocircumflex -30
+KPX Aogonek Odieresis -30
+KPX Aogonek Ograve -30
+KPX Aogonek Ohungarumlaut -30
+KPX Aogonek Omacron -30
+KPX Aogonek Oslash -30
+KPX Aogonek Otilde -30
+KPX Aogonek Q -30
+KPX Aogonek T -120
+KPX Aogonek Tcaron -120
+KPX Aogonek Tcommaaccent -120
+KPX Aogonek U -50
+KPX Aogonek Uacute -50
+KPX Aogonek Ucircumflex -50
+KPX Aogonek Udieresis -50
+KPX Aogonek Ugrave -50
+KPX Aogonek Uhungarumlaut -50
+KPX Aogonek Umacron -50
+KPX Aogonek Uogonek -50
+KPX Aogonek Uring -50
+KPX Aogonek V -70
+KPX Aogonek W -50
+KPX Aogonek Y -100
+KPX Aogonek Yacute -100
+KPX Aogonek Ydieresis -100
+KPX Aogonek u -30
+KPX Aogonek uacute -30
+KPX Aogonek ucircumflex -30
+KPX Aogonek udieresis -30
+KPX Aogonek ugrave -30
+KPX Aogonek uhungarumlaut -30
+KPX Aogonek umacron -30
+KPX Aogonek uogonek -30
+KPX Aogonek uring -30
+KPX Aogonek v -40
+KPX Aogonek w -40
+KPX Aogonek y -40
+KPX Aogonek yacute -40
+KPX Aogonek ydieresis -40
+KPX Aring C -30
+KPX Aring Cacute -30
+KPX Aring Ccaron -30
+KPX Aring Ccedilla -30
+KPX Aring G -30
+KPX Aring Gbreve -30
+KPX Aring Gcommaaccent -30
+KPX Aring O -30
+KPX Aring Oacute -30
+KPX Aring Ocircumflex -30
+KPX Aring Odieresis -30
+KPX Aring Ograve -30
+KPX Aring Ohungarumlaut -30
+KPX Aring Omacron -30
+KPX Aring Oslash -30
+KPX Aring Otilde -30
+KPX Aring Q -30
+KPX Aring T -120
+KPX Aring Tcaron -120
+KPX Aring Tcommaaccent -120
+KPX Aring U -50
+KPX Aring Uacute -50
+KPX Aring Ucircumflex -50
+KPX Aring Udieresis -50
+KPX Aring Ugrave -50
+KPX Aring Uhungarumlaut -50
+KPX Aring Umacron -50
+KPX Aring Uogonek -50
+KPX Aring Uring -50
+KPX Aring V -70
+KPX Aring W -50
+KPX Aring Y -100
+KPX Aring Yacute -100
+KPX Aring Ydieresis -100
+KPX Aring u -30
+KPX Aring uacute -30
+KPX Aring ucircumflex -30
+KPX Aring udieresis -30
+KPX Aring ugrave -30
+KPX Aring uhungarumlaut -30
+KPX Aring umacron -30
+KPX Aring uogonek -30
+KPX Aring uring -30
+KPX Aring v -40
+KPX Aring w -40
+KPX Aring y -40
+KPX Aring yacute -40
+KPX Aring ydieresis -40
+KPX Atilde C -30
+KPX Atilde Cacute -30
+KPX Atilde Ccaron -30
+KPX Atilde Ccedilla -30
+KPX Atilde G -30
+KPX Atilde Gbreve -30
+KPX Atilde Gcommaaccent -30
+KPX Atilde O -30
+KPX Atilde Oacute -30
+KPX Atilde Ocircumflex -30
+KPX Atilde Odieresis -30
+KPX Atilde Ograve -30
+KPX Atilde Ohungarumlaut -30
+KPX Atilde Omacron -30
+KPX Atilde Oslash -30
+KPX Atilde Otilde -30
+KPX Atilde Q -30
+KPX Atilde T -120
+KPX Atilde Tcaron -120
+KPX Atilde Tcommaaccent -120
+KPX Atilde U -50
+KPX Atilde Uacute -50
+KPX Atilde Ucircumflex -50
+KPX Atilde Udieresis -50
+KPX Atilde Ugrave -50
+KPX Atilde Uhungarumlaut -50
+KPX Atilde Umacron -50
+KPX Atilde Uogonek -50
+KPX Atilde Uring -50
+KPX Atilde V -70
+KPX Atilde W -50
+KPX Atilde Y -100
+KPX Atilde Yacute -100
+KPX Atilde Ydieresis -100
+KPX Atilde u -30
+KPX Atilde uacute -30
+KPX Atilde ucircumflex -30
+KPX Atilde udieresis -30
+KPX Atilde ugrave -30
+KPX Atilde uhungarumlaut -30
+KPX Atilde umacron -30
+KPX Atilde uogonek -30
+KPX Atilde uring -30
+KPX Atilde v -40
+KPX Atilde w -40
+KPX Atilde y -40
+KPX Atilde yacute -40
+KPX Atilde ydieresis -40
+KPX B U -10
+KPX B Uacute -10
+KPX B Ucircumflex -10
+KPX B Udieresis -10
+KPX B Ugrave -10
+KPX B Uhungarumlaut -10
+KPX B Umacron -10
+KPX B Uogonek -10
+KPX B Uring -10
+KPX B comma -20
+KPX B period -20
+KPX C comma -30
+KPX C period -30
+KPX Cacute comma -30
+KPX Cacute period -30
+KPX Ccaron comma -30
+KPX Ccaron period -30
+KPX Ccedilla comma -30
+KPX Ccedilla period -30
+KPX D A -40
+KPX D Aacute -40
+KPX D Abreve -40
+KPX D Acircumflex -40
+KPX D Adieresis -40
+KPX D Agrave -40
+KPX D Amacron -40
+KPX D Aogonek -40
+KPX D Aring -40
+KPX D Atilde -40
+KPX D V -70
+KPX D W -40
+KPX D Y -90
+KPX D Yacute -90
+KPX D Ydieresis -90
+KPX D comma -70
+KPX D period -70
+KPX Dcaron A -40
+KPX Dcaron Aacute -40
+KPX Dcaron Abreve -40
+KPX Dcaron Acircumflex -40
+KPX Dcaron Adieresis -40
+KPX Dcaron Agrave -40
+KPX Dcaron Amacron -40
+KPX Dcaron Aogonek -40
+KPX Dcaron Aring -40
+KPX Dcaron Atilde -40
+KPX Dcaron V -70
+KPX Dcaron W -40
+KPX Dcaron Y -90
+KPX Dcaron Yacute -90
+KPX Dcaron Ydieresis -90
+KPX Dcaron comma -70
+KPX Dcaron period -70
+KPX Dcroat A -40
+KPX Dcroat Aacute -40
+KPX Dcroat Abreve -40
+KPX Dcroat Acircumflex -40
+KPX Dcroat Adieresis -40
+KPX Dcroat Agrave -40
+KPX Dcroat Amacron -40
+KPX Dcroat Aogonek -40
+KPX Dcroat Aring -40
+KPX Dcroat Atilde -40
+KPX Dcroat V -70
+KPX Dcroat W -40
+KPX Dcroat Y -90
+KPX Dcroat Yacute -90
+KPX Dcroat Ydieresis -90
+KPX Dcroat comma -70
+KPX Dcroat period -70
+KPX F A -80
+KPX F Aacute -80
+KPX F Abreve -80
+KPX F Acircumflex -80
+KPX F Adieresis -80
+KPX F Agrave -80
+KPX F Amacron -80
+KPX F Aogonek -80
+KPX F Aring -80
+KPX F Atilde -80
+KPX F a -50
+KPX F aacute -50
+KPX F abreve -50
+KPX F acircumflex -50
+KPX F adieresis -50
+KPX F agrave -50
+KPX F amacron -50
+KPX F aogonek -50
+KPX F aring -50
+KPX F atilde -50
+KPX F comma -150
+KPX F e -30
+KPX F eacute -30
+KPX F ecaron -30
+KPX F ecircumflex -30
+KPX F edieresis -30
+KPX F edotaccent -30
+KPX F egrave -30
+KPX F emacron -30
+KPX F eogonek -30
+KPX F o -30
+KPX F oacute -30
+KPX F ocircumflex -30
+KPX F odieresis -30
+KPX F ograve -30
+KPX F ohungarumlaut -30
+KPX F omacron -30
+KPX F oslash -30
+KPX F otilde -30
+KPX F period -150
+KPX F r -45
+KPX F racute -45
+KPX F rcaron -45
+KPX F rcommaaccent -45
+KPX J A -20
+KPX J Aacute -20
+KPX J Abreve -20
+KPX J Acircumflex -20
+KPX J Adieresis -20
+KPX J Agrave -20
+KPX J Amacron -20
+KPX J Aogonek -20
+KPX J Aring -20
+KPX J Atilde -20
+KPX J a -20
+KPX J aacute -20
+KPX J abreve -20
+KPX J acircumflex -20
+KPX J adieresis -20
+KPX J agrave -20
+KPX J amacron -20
+KPX J aogonek -20
+KPX J aring -20
+KPX J atilde -20
+KPX J comma -30
+KPX J period -30
+KPX J u -20
+KPX J uacute -20
+KPX J ucircumflex -20
+KPX J udieresis -20
+KPX J ugrave -20
+KPX J uhungarumlaut -20
+KPX J umacron -20
+KPX J uogonek -20
+KPX J uring -20
+KPX K O -50
+KPX K Oacute -50
+KPX K Ocircumflex -50
+KPX K Odieresis -50
+KPX K Ograve -50
+KPX K Ohungarumlaut -50
+KPX K Omacron -50
+KPX K Oslash -50
+KPX K Otilde -50
+KPX K e -40
+KPX K eacute -40
+KPX K ecaron -40
+KPX K ecircumflex -40
+KPX K edieresis -40
+KPX K edotaccent -40
+KPX K egrave -40
+KPX K emacron -40
+KPX K eogonek -40
+KPX K o -40
+KPX K oacute -40
+KPX K ocircumflex -40
+KPX K odieresis -40
+KPX K ograve -40
+KPX K ohungarumlaut -40
+KPX K omacron -40
+KPX K oslash -40
+KPX K otilde -40
+KPX K u -30
+KPX K uacute -30
+KPX K ucircumflex -30
+KPX K udieresis -30
+KPX K ugrave -30
+KPX K uhungarumlaut -30
+KPX K umacron -30
+KPX K uogonek -30
+KPX K uring -30
+KPX K y -50
+KPX K yacute -50
+KPX K ydieresis -50
+KPX Kcommaaccent O -50
+KPX Kcommaaccent Oacute -50
+KPX Kcommaaccent Ocircumflex -50
+KPX Kcommaaccent Odieresis -50
+KPX Kcommaaccent Ograve -50
+KPX Kcommaaccent Ohungarumlaut -50
+KPX Kcommaaccent Omacron -50
+KPX Kcommaaccent Oslash -50
+KPX Kcommaaccent Otilde -50
+KPX Kcommaaccent e -40
+KPX Kcommaaccent eacute -40
+KPX Kcommaaccent ecaron -40
+KPX Kcommaaccent ecircumflex -40
+KPX Kcommaaccent edieresis -40
+KPX Kcommaaccent edotaccent -40
+KPX Kcommaaccent egrave -40
+KPX Kcommaaccent emacron -40
+KPX Kcommaaccent eogonek -40
+KPX Kcommaaccent o -40
+KPX Kcommaaccent oacute -40
+KPX Kcommaaccent ocircumflex -40
+KPX Kcommaaccent odieresis -40
+KPX Kcommaaccent ograve -40
+KPX Kcommaaccent ohungarumlaut -40
+KPX Kcommaaccent omacron -40
+KPX Kcommaaccent oslash -40
+KPX Kcommaaccent otilde -40
+KPX Kcommaaccent u -30
+KPX Kcommaaccent uacute -30
+KPX Kcommaaccent ucircumflex -30
+KPX Kcommaaccent udieresis -30
+KPX Kcommaaccent ugrave -30
+KPX Kcommaaccent uhungarumlaut -30
+KPX Kcommaaccent umacron -30
+KPX Kcommaaccent uogonek -30
+KPX Kcommaaccent uring -30
+KPX Kcommaaccent y -50
+KPX Kcommaaccent yacute -50
+KPX Kcommaaccent ydieresis -50
+KPX L T -110
+KPX L Tcaron -110
+KPX L Tcommaaccent -110
+KPX L V -110
+KPX L W -70
+KPX L Y -140
+KPX L Yacute -140
+KPX L Ydieresis -140
+KPX L quotedblright -140
+KPX L quoteright -160
+KPX L y -30
+KPX L yacute -30
+KPX L ydieresis -30
+KPX Lacute T -110
+KPX Lacute Tcaron -110
+KPX Lacute Tcommaaccent -110
+KPX Lacute V -110
+KPX Lacute W -70
+KPX Lacute Y -140
+KPX Lacute Yacute -140
+KPX Lacute Ydieresis -140
+KPX Lacute quotedblright -140
+KPX Lacute quoteright -160
+KPX Lacute y -30
+KPX Lacute yacute -30
+KPX Lacute ydieresis -30
+KPX Lcaron T -110
+KPX Lcaron Tcaron -110
+KPX Lcaron Tcommaaccent -110
+KPX Lcaron V -110
+KPX Lcaron W -70
+KPX Lcaron Y -140
+KPX Lcaron Yacute -140
+KPX Lcaron Ydieresis -140
+KPX Lcaron quotedblright -140
+KPX Lcaron quoteright -160
+KPX Lcaron y -30
+KPX Lcaron yacute -30
+KPX Lcaron ydieresis -30
+KPX Lcommaaccent T -110
+KPX Lcommaaccent Tcaron -110
+KPX Lcommaaccent Tcommaaccent -110
+KPX Lcommaaccent V -110
+KPX Lcommaaccent W -70
+KPX Lcommaaccent Y -140
+KPX Lcommaaccent Yacute -140
+KPX Lcommaaccent Ydieresis -140
+KPX Lcommaaccent quotedblright -140
+KPX Lcommaaccent quoteright -160
+KPX Lcommaaccent y -30
+KPX Lcommaaccent yacute -30
+KPX Lcommaaccent ydieresis -30
+KPX Lslash T -110
+KPX Lslash Tcaron -110
+KPX Lslash Tcommaaccent -110
+KPX Lslash V -110
+KPX Lslash W -70
+KPX Lslash Y -140
+KPX Lslash Yacute -140
+KPX Lslash Ydieresis -140
+KPX Lslash quotedblright -140
+KPX Lslash quoteright -160
+KPX Lslash y -30
+KPX Lslash yacute -30
+KPX Lslash ydieresis -30
+KPX O A -20
+KPX O Aacute -20
+KPX O Abreve -20
+KPX O Acircumflex -20
+KPX O Adieresis -20
+KPX O Agrave -20
+KPX O Amacron -20
+KPX O Aogonek -20
+KPX O Aring -20
+KPX O Atilde -20
+KPX O T -40
+KPX O Tcaron -40
+KPX O Tcommaaccent -40
+KPX O V -50
+KPX O W -30
+KPX O X -60
+KPX O Y -70
+KPX O Yacute -70
+KPX O Ydieresis -70
+KPX O comma -40
+KPX O period -40
+KPX Oacute A -20
+KPX Oacute Aacute -20
+KPX Oacute Abreve -20
+KPX Oacute Acircumflex -20
+KPX Oacute Adieresis -20
+KPX Oacute Agrave -20
+KPX Oacute Amacron -20
+KPX Oacute Aogonek -20
+KPX Oacute Aring -20
+KPX Oacute Atilde -20
+KPX Oacute T -40
+KPX Oacute Tcaron -40
+KPX Oacute Tcommaaccent -40
+KPX Oacute V -50
+KPX Oacute W -30
+KPX Oacute X -60
+KPX Oacute Y -70
+KPX Oacute Yacute -70
+KPX Oacute Ydieresis -70
+KPX Oacute comma -40
+KPX Oacute period -40
+KPX Ocircumflex A -20
+KPX Ocircumflex Aacute -20
+KPX Ocircumflex Abreve -20
+KPX Ocircumflex Acircumflex -20
+KPX Ocircumflex Adieresis -20
+KPX Ocircumflex Agrave -20
+KPX Ocircumflex Amacron -20
+KPX Ocircumflex Aogonek -20
+KPX Ocircumflex Aring -20
+KPX Ocircumflex Atilde -20
+KPX Ocircumflex T -40
+KPX Ocircumflex Tcaron -40
+KPX Ocircumflex Tcommaaccent -40
+KPX Ocircumflex V -50
+KPX Ocircumflex W -30
+KPX Ocircumflex X -60
+KPX Ocircumflex Y -70
+KPX Ocircumflex Yacute -70
+KPX Ocircumflex Ydieresis -70
+KPX Ocircumflex comma -40
+KPX Ocircumflex period -40
+KPX Odieresis A -20
+KPX Odieresis Aacute -20
+KPX Odieresis Abreve -20
+KPX Odieresis Acircumflex -20
+KPX Odieresis Adieresis -20
+KPX Odieresis Agrave -20
+KPX Odieresis Amacron -20
+KPX Odieresis Aogonek -20
+KPX Odieresis Aring -20
+KPX Odieresis Atilde -20
+KPX Odieresis T -40
+KPX Odieresis Tcaron -40
+KPX Odieresis Tcommaaccent -40
+KPX Odieresis V -50
+KPX Odieresis W -30
+KPX Odieresis X -60
+KPX Odieresis Y -70
+KPX Odieresis Yacute -70
+KPX Odieresis Ydieresis -70
+KPX Odieresis comma -40
+KPX Odieresis period -40
+KPX Ograve A -20
+KPX Ograve Aacute -20
+KPX Ograve Abreve -20
+KPX Ograve Acircumflex -20
+KPX Ograve Adieresis -20
+KPX Ograve Agrave -20
+KPX Ograve Amacron -20
+KPX Ograve Aogonek -20
+KPX Ograve Aring -20
+KPX Ograve Atilde -20
+KPX Ograve T -40
+KPX Ograve Tcaron -40
+KPX Ograve Tcommaaccent -40
+KPX Ograve V -50
+KPX Ograve W -30
+KPX Ograve X -60
+KPX Ograve Y -70
+KPX Ograve Yacute -70
+KPX Ograve Ydieresis -70
+KPX Ograve comma -40
+KPX Ograve period -40
+KPX Ohungarumlaut A -20
+KPX Ohungarumlaut Aacute -20
+KPX Ohungarumlaut Abreve -20
+KPX Ohungarumlaut Acircumflex -20
+KPX Ohungarumlaut Adieresis -20
+KPX Ohungarumlaut Agrave -20
+KPX Ohungarumlaut Amacron -20
+KPX Ohungarumlaut Aogonek -20
+KPX Ohungarumlaut Aring -20
+KPX Ohungarumlaut Atilde -20
+KPX Ohungarumlaut T -40
+KPX Ohungarumlaut Tcaron -40
+KPX Ohungarumlaut Tcommaaccent -40
+KPX Ohungarumlaut V -50
+KPX Ohungarumlaut W -30
+KPX Ohungarumlaut X -60
+KPX Ohungarumlaut Y -70
+KPX Ohungarumlaut Yacute -70
+KPX Ohungarumlaut Ydieresis -70
+KPX Ohungarumlaut comma -40
+KPX Ohungarumlaut period -40
+KPX Omacron A -20
+KPX Omacron Aacute -20
+KPX Omacron Abreve -20
+KPX Omacron Acircumflex -20
+KPX Omacron Adieresis -20
+KPX Omacron Agrave -20
+KPX Omacron Amacron -20
+KPX Omacron Aogonek -20
+KPX Omacron Aring -20
+KPX Omacron Atilde -20
+KPX Omacron T -40
+KPX Omacron Tcaron -40
+KPX Omacron Tcommaaccent -40
+KPX Omacron V -50
+KPX Omacron W -30
+KPX Omacron X -60
+KPX Omacron Y -70
+KPX Omacron Yacute -70
+KPX Omacron Ydieresis -70
+KPX Omacron comma -40
+KPX Omacron period -40
+KPX Oslash A -20
+KPX Oslash Aacute -20
+KPX Oslash Abreve -20
+KPX Oslash Acircumflex -20
+KPX Oslash Adieresis -20
+KPX Oslash Agrave -20
+KPX Oslash Amacron -20
+KPX Oslash Aogonek -20
+KPX Oslash Aring -20
+KPX Oslash Atilde -20
+KPX Oslash T -40
+KPX Oslash Tcaron -40
+KPX Oslash Tcommaaccent -40
+KPX Oslash V -50
+KPX Oslash W -30
+KPX Oslash X -60
+KPX Oslash Y -70
+KPX Oslash Yacute -70
+KPX Oslash Ydieresis -70
+KPX Oslash comma -40
+KPX Oslash period -40
+KPX Otilde A -20
+KPX Otilde Aacute -20
+KPX Otilde Abreve -20
+KPX Otilde Acircumflex -20
+KPX Otilde Adieresis -20
+KPX Otilde Agrave -20
+KPX Otilde Amacron -20
+KPX Otilde Aogonek -20
+KPX Otilde Aring -20
+KPX Otilde Atilde -20
+KPX Otilde T -40
+KPX Otilde Tcaron -40
+KPX Otilde Tcommaaccent -40
+KPX Otilde V -50
+KPX Otilde W -30
+KPX Otilde X -60
+KPX Otilde Y -70
+KPX Otilde Yacute -70
+KPX Otilde Ydieresis -70
+KPX Otilde comma -40
+KPX Otilde period -40
+KPX P A -120
+KPX P Aacute -120
+KPX P Abreve -120
+KPX P Acircumflex -120
+KPX P Adieresis -120
+KPX P Agrave -120
+KPX P Amacron -120
+KPX P Aogonek -120
+KPX P Aring -120
+KPX P Atilde -120
+KPX P a -40
+KPX P aacute -40
+KPX P abreve -40
+KPX P acircumflex -40
+KPX P adieresis -40
+KPX P agrave -40
+KPX P amacron -40
+KPX P aogonek -40
+KPX P aring -40
+KPX P atilde -40
+KPX P comma -180
+KPX P e -50
+KPX P eacute -50
+KPX P ecaron -50
+KPX P ecircumflex -50
+KPX P edieresis -50
+KPX P edotaccent -50
+KPX P egrave -50
+KPX P emacron -50
+KPX P eogonek -50
+KPX P o -50
+KPX P oacute -50
+KPX P ocircumflex -50
+KPX P odieresis -50
+KPX P ograve -50
+KPX P ohungarumlaut -50
+KPX P omacron -50
+KPX P oslash -50
+KPX P otilde -50
+KPX P period -180
+KPX Q U -10
+KPX Q Uacute -10
+KPX Q Ucircumflex -10
+KPX Q Udieresis -10
+KPX Q Ugrave -10
+KPX Q Uhungarumlaut -10
+KPX Q Umacron -10
+KPX Q Uogonek -10
+KPX Q Uring -10
+KPX R O -20
+KPX R Oacute -20
+KPX R Ocircumflex -20
+KPX R Odieresis -20
+KPX R Ograve -20
+KPX R Ohungarumlaut -20
+KPX R Omacron -20
+KPX R Oslash -20
+KPX R Otilde -20
+KPX R T -30
+KPX R Tcaron -30
+KPX R Tcommaaccent -30
+KPX R U -40
+KPX R Uacute -40
+KPX R Ucircumflex -40
+KPX R Udieresis -40
+KPX R Ugrave -40
+KPX R Uhungarumlaut -40
+KPX R Umacron -40
+KPX R Uogonek -40
+KPX R Uring -40
+KPX R V -50
+KPX R W -30
+KPX R Y -50
+KPX R Yacute -50
+KPX R Ydieresis -50
+KPX Racute O -20
+KPX Racute Oacute -20
+KPX Racute Ocircumflex -20
+KPX Racute Odieresis -20
+KPX Racute Ograve -20
+KPX Racute Ohungarumlaut -20
+KPX Racute Omacron -20
+KPX Racute Oslash -20
+KPX Racute Otilde -20
+KPX Racute T -30
+KPX Racute Tcaron -30
+KPX Racute Tcommaaccent -30
+KPX Racute U -40
+KPX Racute Uacute -40
+KPX Racute Ucircumflex -40
+KPX Racute Udieresis -40
+KPX Racute Ugrave -40
+KPX Racute Uhungarumlaut -40
+KPX Racute Umacron -40
+KPX Racute Uogonek -40
+KPX Racute Uring -40
+KPX Racute V -50
+KPX Racute W -30
+KPX Racute Y -50
+KPX Racute Yacute -50
+KPX Racute Ydieresis -50
+KPX Rcaron O -20
+KPX Rcaron Oacute -20
+KPX Rcaron Ocircumflex -20
+KPX Rcaron Odieresis -20
+KPX Rcaron Ograve -20
+KPX Rcaron Ohungarumlaut -20
+KPX Rcaron Omacron -20
+KPX Rcaron Oslash -20
+KPX Rcaron Otilde -20
+KPX Rcaron T -30
+KPX Rcaron Tcaron -30
+KPX Rcaron Tcommaaccent -30
+KPX Rcaron U -40
+KPX Rcaron Uacute -40
+KPX Rcaron Ucircumflex -40
+KPX Rcaron Udieresis -40
+KPX Rcaron Ugrave -40
+KPX Rcaron Uhungarumlaut -40
+KPX Rcaron Umacron -40
+KPX Rcaron Uogonek -40
+KPX Rcaron Uring -40
+KPX Rcaron V -50
+KPX Rcaron W -30
+KPX Rcaron Y -50
+KPX Rcaron Yacute -50
+KPX Rcaron Ydieresis -50
+KPX Rcommaaccent O -20
+KPX Rcommaaccent Oacute -20
+KPX Rcommaaccent Ocircumflex -20
+KPX Rcommaaccent Odieresis -20
+KPX Rcommaaccent Ograve -20
+KPX Rcommaaccent Ohungarumlaut -20
+KPX Rcommaaccent Omacron -20
+KPX Rcommaaccent Oslash -20
+KPX Rcommaaccent Otilde -20
+KPX Rcommaaccent T -30
+KPX Rcommaaccent Tcaron -30
+KPX Rcommaaccent Tcommaaccent -30
+KPX Rcommaaccent U -40
+KPX Rcommaaccent Uacute -40
+KPX Rcommaaccent Ucircumflex -40
+KPX Rcommaaccent Udieresis -40
+KPX Rcommaaccent Ugrave -40
+KPX Rcommaaccent Uhungarumlaut -40
+KPX Rcommaaccent Umacron -40
+KPX Rcommaaccent Uogonek -40
+KPX Rcommaaccent Uring -40
+KPX Rcommaaccent V -50
+KPX Rcommaaccent W -30
+KPX Rcommaaccent Y -50
+KPX Rcommaaccent Yacute -50
+KPX Rcommaaccent Ydieresis -50
+KPX S comma -20
+KPX S period -20
+KPX Sacute comma -20
+KPX Sacute period -20
+KPX Scaron comma -20
+KPX Scaron period -20
+KPX Scedilla comma -20
+KPX Scedilla period -20
+KPX Scommaaccent comma -20
+KPX Scommaaccent period -20
+KPX T A -120
+KPX T Aacute -120
+KPX T Abreve -120
+KPX T Acircumflex -120
+KPX T Adieresis -120
+KPX T Agrave -120
+KPX T Amacron -120
+KPX T Aogonek -120
+KPX T Aring -120
+KPX T Atilde -120
+KPX T O -40
+KPX T Oacute -40
+KPX T Ocircumflex -40
+KPX T Odieresis -40
+KPX T Ograve -40
+KPX T Ohungarumlaut -40
+KPX T Omacron -40
+KPX T Oslash -40
+KPX T Otilde -40
+KPX T a -120
+KPX T aacute -120
+KPX T abreve -60
+KPX T acircumflex -120
+KPX T adieresis -120
+KPX T agrave -120
+KPX T amacron -60
+KPX T aogonek -120
+KPX T aring -120
+KPX T atilde -60
+KPX T colon -20
+KPX T comma -120
+KPX T e -120
+KPX T eacute -120
+KPX T ecaron -120
+KPX T ecircumflex -120
+KPX T edieresis -120
+KPX T edotaccent -120
+KPX T egrave -60
+KPX T emacron -60
+KPX T eogonek -120
+KPX T hyphen -140
+KPX T o -120
+KPX T oacute -120
+KPX T ocircumflex -120
+KPX T odieresis -120
+KPX T ograve -120
+KPX T ohungarumlaut -120
+KPX T omacron -60
+KPX T oslash -120
+KPX T otilde -60
+KPX T period -120
+KPX T r -120
+KPX T racute -120
+KPX T rcaron -120
+KPX T rcommaaccent -120
+KPX T semicolon -20
+KPX T u -120
+KPX T uacute -120
+KPX T ucircumflex -120
+KPX T udieresis -120
+KPX T ugrave -120
+KPX T uhungarumlaut -120
+KPX T umacron -60
+KPX T uogonek -120
+KPX T uring -120
+KPX T w -120
+KPX T y -120
+KPX T yacute -120
+KPX T ydieresis -60
+KPX Tcaron A -120
+KPX Tcaron Aacute -120
+KPX Tcaron Abreve -120
+KPX Tcaron Acircumflex -120
+KPX Tcaron Adieresis -120
+KPX Tcaron Agrave -120
+KPX Tcaron Amacron -120
+KPX Tcaron Aogonek -120
+KPX Tcaron Aring -120
+KPX Tcaron Atilde -120
+KPX Tcaron O -40
+KPX Tcaron Oacute -40
+KPX Tcaron Ocircumflex -40
+KPX Tcaron Odieresis -40
+KPX Tcaron Ograve -40
+KPX Tcaron Ohungarumlaut -40
+KPX Tcaron Omacron -40
+KPX Tcaron Oslash -40
+KPX Tcaron Otilde -40
+KPX Tcaron a -120
+KPX Tcaron aacute -120
+KPX Tcaron abreve -60
+KPX Tcaron acircumflex -120
+KPX Tcaron adieresis -120
+KPX Tcaron agrave -120
+KPX Tcaron amacron -60
+KPX Tcaron aogonek -120
+KPX Tcaron aring -120
+KPX Tcaron atilde -60
+KPX Tcaron colon -20
+KPX Tcaron comma -120
+KPX Tcaron e -120
+KPX Tcaron eacute -120
+KPX Tcaron ecaron -120
+KPX Tcaron ecircumflex -120
+KPX Tcaron edieresis -120
+KPX Tcaron edotaccent -120
+KPX Tcaron egrave -60
+KPX Tcaron emacron -60
+KPX Tcaron eogonek -120
+KPX Tcaron hyphen -140
+KPX Tcaron o -120
+KPX Tcaron oacute -120
+KPX Tcaron ocircumflex -120
+KPX Tcaron odieresis -120
+KPX Tcaron ograve -120
+KPX Tcaron ohungarumlaut -120
+KPX Tcaron omacron -60
+KPX Tcaron oslash -120
+KPX Tcaron otilde -60
+KPX Tcaron period -120
+KPX Tcaron r -120
+KPX Tcaron racute -120
+KPX Tcaron rcaron -120
+KPX Tcaron rcommaaccent -120
+KPX Tcaron semicolon -20
+KPX Tcaron u -120
+KPX Tcaron uacute -120
+KPX Tcaron ucircumflex -120
+KPX Tcaron udieresis -120
+KPX Tcaron ugrave -120
+KPX Tcaron uhungarumlaut -120
+KPX Tcaron umacron -60
+KPX Tcaron uogonek -120
+KPX Tcaron uring -120
+KPX Tcaron w -120
+KPX Tcaron y -120
+KPX Tcaron yacute -120
+KPX Tcaron ydieresis -60
+KPX Tcommaaccent A -120
+KPX Tcommaaccent Aacute -120
+KPX Tcommaaccent Abreve -120
+KPX Tcommaaccent Acircumflex -120
+KPX Tcommaaccent Adieresis -120
+KPX Tcommaaccent Agrave -120
+KPX Tcommaaccent Amacron -120
+KPX Tcommaaccent Aogonek -120
+KPX Tcommaaccent Aring -120
+KPX Tcommaaccent Atilde -120
+KPX Tcommaaccent O -40
+KPX Tcommaaccent Oacute -40
+KPX Tcommaaccent Ocircumflex -40
+KPX Tcommaaccent Odieresis -40
+KPX Tcommaaccent Ograve -40
+KPX Tcommaaccent Ohungarumlaut -40
+KPX Tcommaaccent Omacron -40
+KPX Tcommaaccent Oslash -40
+KPX Tcommaaccent Otilde -40
+KPX Tcommaaccent a -120
+KPX Tcommaaccent aacute -120
+KPX Tcommaaccent abreve -60
+KPX Tcommaaccent acircumflex -120
+KPX Tcommaaccent adieresis -120
+KPX Tcommaaccent agrave -120
+KPX Tcommaaccent amacron -60
+KPX Tcommaaccent aogonek -120
+KPX Tcommaaccent aring -120
+KPX Tcommaaccent atilde -60
+KPX Tcommaaccent colon -20
+KPX Tcommaaccent comma -120
+KPX Tcommaaccent e -120
+KPX Tcommaaccent eacute -120
+KPX Tcommaaccent ecaron -120
+KPX Tcommaaccent ecircumflex -120
+KPX Tcommaaccent edieresis -120
+KPX Tcommaaccent edotaccent -120
+KPX Tcommaaccent egrave -60
+KPX Tcommaaccent emacron -60
+KPX Tcommaaccent eogonek -120
+KPX Tcommaaccent hyphen -140
+KPX Tcommaaccent o -120
+KPX Tcommaaccent oacute -120
+KPX Tcommaaccent ocircumflex -120
+KPX Tcommaaccent odieresis -120
+KPX Tcommaaccent ograve -120
+KPX Tcommaaccent ohungarumlaut -120
+KPX Tcommaaccent omacron -60
+KPX Tcommaaccent oslash -120
+KPX Tcommaaccent otilde -60
+KPX Tcommaaccent period -120
+KPX Tcommaaccent r -120
+KPX Tcommaaccent racute -120
+KPX Tcommaaccent rcaron -120
+KPX Tcommaaccent rcommaaccent -120
+KPX Tcommaaccent semicolon -20
+KPX Tcommaaccent u -120
+KPX Tcommaaccent uacute -120
+KPX Tcommaaccent ucircumflex -120
+KPX Tcommaaccent udieresis -120
+KPX Tcommaaccent ugrave -120
+KPX Tcommaaccent uhungarumlaut -120
+KPX Tcommaaccent umacron -60
+KPX Tcommaaccent uogonek -120
+KPX Tcommaaccent uring -120
+KPX Tcommaaccent w -120
+KPX Tcommaaccent y -120
+KPX Tcommaaccent yacute -120
+KPX Tcommaaccent ydieresis -60
+KPX U A -40
+KPX U Aacute -40
+KPX U Abreve -40
+KPX U Acircumflex -40
+KPX U Adieresis -40
+KPX U Agrave -40
+KPX U Amacron -40
+KPX U Aogonek -40
+KPX U Aring -40
+KPX U Atilde -40
+KPX U comma -40
+KPX U period -40
+KPX Uacute A -40
+KPX Uacute Aacute -40
+KPX Uacute Abreve -40
+KPX Uacute Acircumflex -40
+KPX Uacute Adieresis -40
+KPX Uacute Agrave -40
+KPX Uacute Amacron -40
+KPX Uacute Aogonek -40
+KPX Uacute Aring -40
+KPX Uacute Atilde -40
+KPX Uacute comma -40
+KPX Uacute period -40
+KPX Ucircumflex A -40
+KPX Ucircumflex Aacute -40
+KPX Ucircumflex Abreve -40
+KPX Ucircumflex Acircumflex -40
+KPX Ucircumflex Adieresis -40
+KPX Ucircumflex Agrave -40
+KPX Ucircumflex Amacron -40
+KPX Ucircumflex Aogonek -40
+KPX Ucircumflex Aring -40
+KPX Ucircumflex Atilde -40
+KPX Ucircumflex comma -40
+KPX Ucircumflex period -40
+KPX Udieresis A -40
+KPX Udieresis Aacute -40
+KPX Udieresis Abreve -40
+KPX Udieresis Acircumflex -40
+KPX Udieresis Adieresis -40
+KPX Udieresis Agrave -40
+KPX Udieresis Amacron -40
+KPX Udieresis Aogonek -40
+KPX Udieresis Aring -40
+KPX Udieresis Atilde -40
+KPX Udieresis comma -40
+KPX Udieresis period -40
+KPX Ugrave A -40
+KPX Ugrave Aacute -40
+KPX Ugrave Abreve -40
+KPX Ugrave Acircumflex -40
+KPX Ugrave Adieresis -40
+KPX Ugrave Agrave -40
+KPX Ugrave Amacron -40
+KPX Ugrave Aogonek -40
+KPX Ugrave Aring -40
+KPX Ugrave Atilde -40
+KPX Ugrave comma -40
+KPX Ugrave period -40
+KPX Uhungarumlaut A -40
+KPX Uhungarumlaut Aacute -40
+KPX Uhungarumlaut Abreve -40
+KPX Uhungarumlaut Acircumflex -40
+KPX Uhungarumlaut Adieresis -40
+KPX Uhungarumlaut Agrave -40
+KPX Uhungarumlaut Amacron -40
+KPX Uhungarumlaut Aogonek -40
+KPX Uhungarumlaut Aring -40
+KPX Uhungarumlaut Atilde -40
+KPX Uhungarumlaut comma -40
+KPX Uhungarumlaut period -40
+KPX Umacron A -40
+KPX Umacron Aacute -40
+KPX Umacron Abreve -40
+KPX Umacron Acircumflex -40
+KPX Umacron Adieresis -40
+KPX Umacron Agrave -40
+KPX Umacron Amacron -40
+KPX Umacron Aogonek -40
+KPX Umacron Aring -40
+KPX Umacron Atilde -40
+KPX Umacron comma -40
+KPX Umacron period -40
+KPX Uogonek A -40
+KPX Uogonek Aacute -40
+KPX Uogonek Abreve -40
+KPX Uogonek Acircumflex -40
+KPX Uogonek Adieresis -40
+KPX Uogonek Agrave -40
+KPX Uogonek Amacron -40
+KPX Uogonek Aogonek -40
+KPX Uogonek Aring -40
+KPX Uogonek Atilde -40
+KPX Uogonek comma -40
+KPX Uogonek period -40
+KPX Uring A -40
+KPX Uring Aacute -40
+KPX Uring Abreve -40
+KPX Uring Acircumflex -40
+KPX Uring Adieresis -40
+KPX Uring Agrave -40
+KPX Uring Amacron -40
+KPX Uring Aogonek -40
+KPX Uring Aring -40
+KPX Uring Atilde -40
+KPX Uring comma -40
+KPX Uring period -40
+KPX V A -80
+KPX V Aacute -80
+KPX V Abreve -80
+KPX V Acircumflex -80
+KPX V Adieresis -80
+KPX V Agrave -80
+KPX V Amacron -80
+KPX V Aogonek -80
+KPX V Aring -80
+KPX V Atilde -80
+KPX V G -40
+KPX V Gbreve -40
+KPX V Gcommaaccent -40
+KPX V O -40
+KPX V Oacute -40
+KPX V Ocircumflex -40
+KPX V Odieresis -40
+KPX V Ograve -40
+KPX V Ohungarumlaut -40
+KPX V Omacron -40
+KPX V Oslash -40
+KPX V Otilde -40
+KPX V a -70
+KPX V aacute -70
+KPX V abreve -70
+KPX V acircumflex -70
+KPX V adieresis -70
+KPX V agrave -70
+KPX V amacron -70
+KPX V aogonek -70
+KPX V aring -70
+KPX V atilde -70
+KPX V colon -40
+KPX V comma -125
+KPX V e -80
+KPX V eacute -80
+KPX V ecaron -80
+KPX V ecircumflex -80
+KPX V edieresis -80
+KPX V edotaccent -80
+KPX V egrave -80
+KPX V emacron -80
+KPX V eogonek -80
+KPX V hyphen -80
+KPX V o -80
+KPX V oacute -80
+KPX V ocircumflex -80
+KPX V odieresis -80
+KPX V ograve -80
+KPX V ohungarumlaut -80
+KPX V omacron -80
+KPX V oslash -80
+KPX V otilde -80
+KPX V period -125
+KPX V semicolon -40
+KPX V u -70
+KPX V uacute -70
+KPX V ucircumflex -70
+KPX V udieresis -70
+KPX V ugrave -70
+KPX V uhungarumlaut -70
+KPX V umacron -70
+KPX V uogonek -70
+KPX V uring -70
+KPX W A -50
+KPX W Aacute -50
+KPX W Abreve -50
+KPX W Acircumflex -50
+KPX W Adieresis -50
+KPX W Agrave -50
+KPX W Amacron -50
+KPX W Aogonek -50
+KPX W Aring -50
+KPX W Atilde -50
+KPX W O -20
+KPX W Oacute -20
+KPX W Ocircumflex -20
+KPX W Odieresis -20
+KPX W Ograve -20
+KPX W Ohungarumlaut -20
+KPX W Omacron -20
+KPX W Oslash -20
+KPX W Otilde -20
+KPX W a -40
+KPX W aacute -40
+KPX W abreve -40
+KPX W acircumflex -40
+KPX W adieresis -40
+KPX W agrave -40
+KPX W amacron -40
+KPX W aogonek -40
+KPX W aring -40
+KPX W atilde -40
+KPX W comma -80
+KPX W e -30
+KPX W eacute -30
+KPX W ecaron -30
+KPX W ecircumflex -30
+KPX W edieresis -30
+KPX W edotaccent -30
+KPX W egrave -30
+KPX W emacron -30
+KPX W eogonek -30
+KPX W hyphen -40
+KPX W o -30
+KPX W oacute -30
+KPX W ocircumflex -30
+KPX W odieresis -30
+KPX W ograve -30
+KPX W ohungarumlaut -30
+KPX W omacron -30
+KPX W oslash -30
+KPX W otilde -30
+KPX W period -80
+KPX W u -30
+KPX W uacute -30
+KPX W ucircumflex -30
+KPX W udieresis -30
+KPX W ugrave -30
+KPX W uhungarumlaut -30
+KPX W umacron -30
+KPX W uogonek -30
+KPX W uring -30
+KPX W y -20
+KPX W yacute -20
+KPX W ydieresis -20
+KPX Y A -110
+KPX Y Aacute -110
+KPX Y Abreve -110
+KPX Y Acircumflex -110
+KPX Y Adieresis -110
+KPX Y Agrave -110
+KPX Y Amacron -110
+KPX Y Aogonek -110
+KPX Y Aring -110
+KPX Y Atilde -110
+KPX Y O -85
+KPX Y Oacute -85
+KPX Y Ocircumflex -85
+KPX Y Odieresis -85
+KPX Y Ograve -85
+KPX Y Ohungarumlaut -85
+KPX Y Omacron -85
+KPX Y Oslash -85
+KPX Y Otilde -85
+KPX Y a -140
+KPX Y aacute -140
+KPX Y abreve -70
+KPX Y acircumflex -140
+KPX Y adieresis -140
+KPX Y agrave -140
+KPX Y amacron -70
+KPX Y aogonek -140
+KPX Y aring -140
+KPX Y atilde -140
+KPX Y colon -60
+KPX Y comma -140
+KPX Y e -140
+KPX Y eacute -140
+KPX Y ecaron -140
+KPX Y ecircumflex -140
+KPX Y edieresis -140
+KPX Y edotaccent -140
+KPX Y egrave -140
+KPX Y emacron -70
+KPX Y eogonek -140
+KPX Y hyphen -140
+KPX Y i -20
+KPX Y iacute -20
+KPX Y iogonek -20
+KPX Y o -140
+KPX Y oacute -140
+KPX Y ocircumflex -140
+KPX Y odieresis -140
+KPX Y ograve -140
+KPX Y ohungarumlaut -140
+KPX Y omacron -140
+KPX Y oslash -140
+KPX Y otilde -140
+KPX Y period -140
+KPX Y semicolon -60
+KPX Y u -110
+KPX Y uacute -110
+KPX Y ucircumflex -110
+KPX Y udieresis -110
+KPX Y ugrave -110
+KPX Y uhungarumlaut -110
+KPX Y umacron -110
+KPX Y uogonek -110
+KPX Y uring -110
+KPX Yacute A -110
+KPX Yacute Aacute -110
+KPX Yacute Abreve -110
+KPX Yacute Acircumflex -110
+KPX Yacute Adieresis -110
+KPX Yacute Agrave -110
+KPX Yacute Amacron -110
+KPX Yacute Aogonek -110
+KPX Yacute Aring -110
+KPX Yacute Atilde -110
+KPX Yacute O -85
+KPX Yacute Oacute -85
+KPX Yacute Ocircumflex -85
+KPX Yacute Odieresis -85
+KPX Yacute Ograve -85
+KPX Yacute Ohungarumlaut -85
+KPX Yacute Omacron -85
+KPX Yacute Oslash -85
+KPX Yacute Otilde -85
+KPX Yacute a -140
+KPX Yacute aacute -140
+KPX Yacute abreve -70
+KPX Yacute acircumflex -140
+KPX Yacute adieresis -140
+KPX Yacute agrave -140
+KPX Yacute amacron -70
+KPX Yacute aogonek -140
+KPX Yacute aring -140
+KPX Yacute atilde -70
+KPX Yacute colon -60
+KPX Yacute comma -140
+KPX Yacute e -140
+KPX Yacute eacute -140
+KPX Yacute ecaron -140
+KPX Yacute ecircumflex -140
+KPX Yacute edieresis -140
+KPX Yacute edotaccent -140
+KPX Yacute egrave -140
+KPX Yacute emacron -70
+KPX Yacute eogonek -140
+KPX Yacute hyphen -140
+KPX Yacute i -20
+KPX Yacute iacute -20
+KPX Yacute iogonek -20
+KPX Yacute o -140
+KPX Yacute oacute -140
+KPX Yacute ocircumflex -140
+KPX Yacute odieresis -140
+KPX Yacute ograve -140
+KPX Yacute ohungarumlaut -140
+KPX Yacute omacron -70
+KPX Yacute oslash -140
+KPX Yacute otilde -140
+KPX Yacute period -140
+KPX Yacute semicolon -60
+KPX Yacute u -110
+KPX Yacute uacute -110
+KPX Yacute ucircumflex -110
+KPX Yacute udieresis -110
+KPX Yacute ugrave -110
+KPX Yacute uhungarumlaut -110
+KPX Yacute umacron -110
+KPX Yacute uogonek -110
+KPX Yacute uring -110
+KPX Ydieresis A -110
+KPX Ydieresis Aacute -110
+KPX Ydieresis Abreve -110
+KPX Ydieresis Acircumflex -110
+KPX Ydieresis Adieresis -110
+KPX Ydieresis Agrave -110
+KPX Ydieresis Amacron -110
+KPX Ydieresis Aogonek -110
+KPX Ydieresis Aring -110
+KPX Ydieresis Atilde -110
+KPX Ydieresis O -85
+KPX Ydieresis Oacute -85
+KPX Ydieresis Ocircumflex -85
+KPX Ydieresis Odieresis -85
+KPX Ydieresis Ograve -85
+KPX Ydieresis Ohungarumlaut -85
+KPX Ydieresis Omacron -85
+KPX Ydieresis Oslash -85
+KPX Ydieresis Otilde -85
+KPX Ydieresis a -140
+KPX Ydieresis aacute -140
+KPX Ydieresis abreve -70
+KPX Ydieresis acircumflex -140
+KPX Ydieresis adieresis -140
+KPX Ydieresis agrave -140
+KPX Ydieresis amacron -70
+KPX Ydieresis aogonek -140
+KPX Ydieresis aring -140
+KPX Ydieresis atilde -70
+KPX Ydieresis colon -60
+KPX Ydieresis comma -140
+KPX Ydieresis e -140
+KPX Ydieresis eacute -140
+KPX Ydieresis ecaron -140
+KPX Ydieresis ecircumflex -140
+KPX Ydieresis edieresis -140
+KPX Ydieresis edotaccent -140
+KPX Ydieresis egrave -140
+KPX Ydieresis emacron -70
+KPX Ydieresis eogonek -140
+KPX Ydieresis hyphen -140
+KPX Ydieresis i -20
+KPX Ydieresis iacute -20
+KPX Ydieresis iogonek -20
+KPX Ydieresis o -140
+KPX Ydieresis oacute -140
+KPX Ydieresis ocircumflex -140
+KPX Ydieresis odieresis -140
+KPX Ydieresis ograve -140
+KPX Ydieresis ohungarumlaut -140
+KPX Ydieresis omacron -140
+KPX Ydieresis oslash -140
+KPX Ydieresis otilde -140
+KPX Ydieresis period -140
+KPX Ydieresis semicolon -60
+KPX Ydieresis u -110
+KPX Ydieresis uacute -110
+KPX Ydieresis ucircumflex -110
+KPX Ydieresis udieresis -110
+KPX Ydieresis ugrave -110
+KPX Ydieresis uhungarumlaut -110
+KPX Ydieresis umacron -110
+KPX Ydieresis uogonek -110
+KPX Ydieresis uring -110
+KPX a v -20
+KPX a w -20
+KPX a y -30
+KPX a yacute -30
+KPX a ydieresis -30
+KPX aacute v -20
+KPX aacute w -20
+KPX aacute y -30
+KPX aacute yacute -30
+KPX aacute ydieresis -30
+KPX abreve v -20
+KPX abreve w -20
+KPX abreve y -30
+KPX abreve yacute -30
+KPX abreve ydieresis -30
+KPX acircumflex v -20
+KPX acircumflex w -20
+KPX acircumflex y -30
+KPX acircumflex yacute -30
+KPX acircumflex ydieresis -30
+KPX adieresis v -20
+KPX adieresis w -20
+KPX adieresis y -30
+KPX adieresis yacute -30
+KPX adieresis ydieresis -30
+KPX agrave v -20
+KPX agrave w -20
+KPX agrave y -30
+KPX agrave yacute -30
+KPX agrave ydieresis -30
+KPX amacron v -20
+KPX amacron w -20
+KPX amacron y -30
+KPX amacron yacute -30
+KPX amacron ydieresis -30
+KPX aogonek v -20
+KPX aogonek w -20
+KPX aogonek y -30
+KPX aogonek yacute -30
+KPX aogonek ydieresis -30
+KPX aring v -20
+KPX aring w -20
+KPX aring y -30
+KPX aring yacute -30
+KPX aring ydieresis -30
+KPX atilde v -20
+KPX atilde w -20
+KPX atilde y -30
+KPX atilde yacute -30
+KPX atilde ydieresis -30
+KPX b b -10
+KPX b comma -40
+KPX b l -20
+KPX b lacute -20
+KPX b lcommaaccent -20
+KPX b lslash -20
+KPX b period -40
+KPX b u -20
+KPX b uacute -20
+KPX b ucircumflex -20
+KPX b udieresis -20
+KPX b ugrave -20
+KPX b uhungarumlaut -20
+KPX b umacron -20
+KPX b uogonek -20
+KPX b uring -20
+KPX b v -20
+KPX b y -20
+KPX b yacute -20
+KPX b ydieresis -20
+KPX c comma -15
+KPX c k -20
+KPX c kcommaaccent -20
+KPX cacute comma -15
+KPX cacute k -20
+KPX cacute kcommaaccent -20
+KPX ccaron comma -15
+KPX ccaron k -20
+KPX ccaron kcommaaccent -20
+KPX ccedilla comma -15
+KPX ccedilla k -20
+KPX ccedilla kcommaaccent -20
+KPX colon space -50
+KPX comma quotedblright -100
+KPX comma quoteright -100
+KPX e comma -15
+KPX e period -15
+KPX e v -30
+KPX e w -20
+KPX e x -30
+KPX e y -20
+KPX e yacute -20
+KPX e ydieresis -20
+KPX eacute comma -15
+KPX eacute period -15
+KPX eacute v -30
+KPX eacute w -20
+KPX eacute x -30
+KPX eacute y -20
+KPX eacute yacute -20
+KPX eacute ydieresis -20
+KPX ecaron comma -15
+KPX ecaron period -15
+KPX ecaron v -30
+KPX ecaron w -20
+KPX ecaron x -30
+KPX ecaron y -20
+KPX ecaron yacute -20
+KPX ecaron ydieresis -20
+KPX ecircumflex comma -15
+KPX ecircumflex period -15
+KPX ecircumflex v -30
+KPX ecircumflex w -20
+KPX ecircumflex x -30
+KPX ecircumflex y -20
+KPX ecircumflex yacute -20
+KPX ecircumflex ydieresis -20
+KPX edieresis comma -15
+KPX edieresis period -15
+KPX edieresis v -30
+KPX edieresis w -20
+KPX edieresis x -30
+KPX edieresis y -20
+KPX edieresis yacute -20
+KPX edieresis ydieresis -20
+KPX edotaccent comma -15
+KPX edotaccent period -15
+KPX edotaccent v -30
+KPX edotaccent w -20
+KPX edotaccent x -30
+KPX edotaccent y -20
+KPX edotaccent yacute -20
+KPX edotaccent ydieresis -20
+KPX egrave comma -15
+KPX egrave period -15
+KPX egrave v -30
+KPX egrave w -20
+KPX egrave x -30
+KPX egrave y -20
+KPX egrave yacute -20
+KPX egrave ydieresis -20
+KPX emacron comma -15
+KPX emacron period -15
+KPX emacron v -30
+KPX emacron w -20
+KPX emacron x -30
+KPX emacron y -20
+KPX emacron yacute -20
+KPX emacron ydieresis -20
+KPX eogonek comma -15
+KPX eogonek period -15
+KPX eogonek v -30
+KPX eogonek w -20
+KPX eogonek x -30
+KPX eogonek y -20
+KPX eogonek yacute -20
+KPX eogonek ydieresis -20
+KPX f a -30
+KPX f aacute -30
+KPX f abreve -30
+KPX f acircumflex -30
+KPX f adieresis -30
+KPX f agrave -30
+KPX f amacron -30
+KPX f aogonek -30
+KPX f aring -30
+KPX f atilde -30
+KPX f comma -30
+KPX f dotlessi -28
+KPX f e -30
+KPX f eacute -30
+KPX f ecaron -30
+KPX f ecircumflex -30
+KPX f edieresis -30
+KPX f edotaccent -30
+KPX f egrave -30
+KPX f emacron -30
+KPX f eogonek -30
+KPX f o -30
+KPX f oacute -30
+KPX f ocircumflex -30
+KPX f odieresis -30
+KPX f ograve -30
+KPX f ohungarumlaut -30
+KPX f omacron -30
+KPX f oslash -30
+KPX f otilde -30
+KPX f period -30
+KPX f quotedblright 60
+KPX f quoteright 50
+KPX g r -10
+KPX g racute -10
+KPX g rcaron -10
+KPX g rcommaaccent -10
+KPX gbreve r -10
+KPX gbreve racute -10
+KPX gbreve rcaron -10
+KPX gbreve rcommaaccent -10
+KPX gcommaaccent r -10
+KPX gcommaaccent racute -10
+KPX gcommaaccent rcaron -10
+KPX gcommaaccent rcommaaccent -10
+KPX h y -30
+KPX h yacute -30
+KPX h ydieresis -30
+KPX k e -20
+KPX k eacute -20
+KPX k ecaron -20
+KPX k ecircumflex -20
+KPX k edieresis -20
+KPX k edotaccent -20
+KPX k egrave -20
+KPX k emacron -20
+KPX k eogonek -20
+KPX k o -20
+KPX k oacute -20
+KPX k ocircumflex -20
+KPX k odieresis -20
+KPX k ograve -20
+KPX k ohungarumlaut -20
+KPX k omacron -20
+KPX k oslash -20
+KPX k otilde -20
+KPX kcommaaccent e -20
+KPX kcommaaccent eacute -20
+KPX kcommaaccent ecaron -20
+KPX kcommaaccent ecircumflex -20
+KPX kcommaaccent edieresis -20
+KPX kcommaaccent edotaccent -20
+KPX kcommaaccent egrave -20
+KPX kcommaaccent emacron -20
+KPX kcommaaccent eogonek -20
+KPX kcommaaccent o -20
+KPX kcommaaccent oacute -20
+KPX kcommaaccent ocircumflex -20
+KPX kcommaaccent odieresis -20
+KPX kcommaaccent ograve -20
+KPX kcommaaccent ohungarumlaut -20
+KPX kcommaaccent omacron -20
+KPX kcommaaccent oslash -20
+KPX kcommaaccent otilde -20
+KPX m u -10
+KPX m uacute -10
+KPX m ucircumflex -10
+KPX m udieresis -10
+KPX m ugrave -10
+KPX m uhungarumlaut -10
+KPX m umacron -10
+KPX m uogonek -10
+KPX m uring -10
+KPX m y -15
+KPX m yacute -15
+KPX m ydieresis -15
+KPX n u -10
+KPX n uacute -10
+KPX n ucircumflex -10
+KPX n udieresis -10
+KPX n ugrave -10
+KPX n uhungarumlaut -10
+KPX n umacron -10
+KPX n uogonek -10
+KPX n uring -10
+KPX n v -20
+KPX n y -15
+KPX n yacute -15
+KPX n ydieresis -15
+KPX nacute u -10
+KPX nacute uacute -10
+KPX nacute ucircumflex -10
+KPX nacute udieresis -10
+KPX nacute ugrave -10
+KPX nacute uhungarumlaut -10
+KPX nacute umacron -10
+KPX nacute uogonek -10
+KPX nacute uring -10
+KPX nacute v -20
+KPX nacute y -15
+KPX nacute yacute -15
+KPX nacute ydieresis -15
+KPX ncaron u -10
+KPX ncaron uacute -10
+KPX ncaron ucircumflex -10
+KPX ncaron udieresis -10
+KPX ncaron ugrave -10
+KPX ncaron uhungarumlaut -10
+KPX ncaron umacron -10
+KPX ncaron uogonek -10
+KPX ncaron uring -10
+KPX ncaron v -20
+KPX ncaron y -15
+KPX ncaron yacute -15
+KPX ncaron ydieresis -15
+KPX ncommaaccent u -10
+KPX ncommaaccent uacute -10
+KPX ncommaaccent ucircumflex -10
+KPX ncommaaccent udieresis -10
+KPX ncommaaccent ugrave -10
+KPX ncommaaccent uhungarumlaut -10
+KPX ncommaaccent umacron -10
+KPX ncommaaccent uogonek -10
+KPX ncommaaccent uring -10
+KPX ncommaaccent v -20
+KPX ncommaaccent y -15
+KPX ncommaaccent yacute -15
+KPX ncommaaccent ydieresis -15
+KPX ntilde u -10
+KPX ntilde uacute -10
+KPX ntilde ucircumflex -10
+KPX ntilde udieresis -10
+KPX ntilde ugrave -10
+KPX ntilde uhungarumlaut -10
+KPX ntilde umacron -10
+KPX ntilde uogonek -10
+KPX ntilde uring -10
+KPX ntilde v -20
+KPX ntilde y -15
+KPX ntilde yacute -15
+KPX ntilde ydieresis -15
+KPX o comma -40
+KPX o period -40
+KPX o v -15
+KPX o w -15
+KPX o x -30
+KPX o y -30
+KPX o yacute -30
+KPX o ydieresis -30
+KPX oacute comma -40
+KPX oacute period -40
+KPX oacute v -15
+KPX oacute w -15
+KPX oacute x -30
+KPX oacute y -30
+KPX oacute yacute -30
+KPX oacute ydieresis -30
+KPX ocircumflex comma -40
+KPX ocircumflex period -40
+KPX ocircumflex v -15
+KPX ocircumflex w -15
+KPX ocircumflex x -30
+KPX ocircumflex y -30
+KPX ocircumflex yacute -30
+KPX ocircumflex ydieresis -30
+KPX odieresis comma -40
+KPX odieresis period -40
+KPX odieresis v -15
+KPX odieresis w -15
+KPX odieresis x -30
+KPX odieresis y -30
+KPX odieresis yacute -30
+KPX odieresis ydieresis -30
+KPX ograve comma -40
+KPX ograve period -40
+KPX ograve v -15
+KPX ograve w -15
+KPX ograve x -30
+KPX ograve y -30
+KPX ograve yacute -30
+KPX ograve ydieresis -30
+KPX ohungarumlaut comma -40
+KPX ohungarumlaut period -40
+KPX ohungarumlaut v -15
+KPX ohungarumlaut w -15
+KPX ohungarumlaut x -30
+KPX ohungarumlaut y -30
+KPX ohungarumlaut yacute -30
+KPX ohungarumlaut ydieresis -30
+KPX omacron comma -40
+KPX omacron period -40
+KPX omacron v -15
+KPX omacron w -15
+KPX omacron x -30
+KPX omacron y -30
+KPX omacron yacute -30
+KPX omacron ydieresis -30
+KPX oslash a -55
+KPX oslash aacute -55
+KPX oslash abreve -55
+KPX oslash acircumflex -55
+KPX oslash adieresis -55
+KPX oslash agrave -55
+KPX oslash amacron -55
+KPX oslash aogonek -55
+KPX oslash aring -55
+KPX oslash atilde -55
+KPX oslash b -55
+KPX oslash c -55
+KPX oslash cacute -55
+KPX oslash ccaron -55
+KPX oslash ccedilla -55
+KPX oslash comma -95
+KPX oslash d -55
+KPX oslash dcroat -55
+KPX oslash e -55
+KPX oslash eacute -55
+KPX oslash ecaron -55
+KPX oslash ecircumflex -55
+KPX oslash edieresis -55
+KPX oslash edotaccent -55
+KPX oslash egrave -55
+KPX oslash emacron -55
+KPX oslash eogonek -55
+KPX oslash f -55
+KPX oslash g -55
+KPX oslash gbreve -55
+KPX oslash gcommaaccent -55
+KPX oslash h -55
+KPX oslash i -55
+KPX oslash iacute -55
+KPX oslash icircumflex -55
+KPX oslash idieresis -55
+KPX oslash igrave -55
+KPX oslash imacron -55
+KPX oslash iogonek -55
+KPX oslash j -55
+KPX oslash k -55
+KPX oslash kcommaaccent -55
+KPX oslash l -55
+KPX oslash lacute -55
+KPX oslash lcommaaccent -55
+KPX oslash lslash -55
+KPX oslash m -55
+KPX oslash n -55
+KPX oslash nacute -55
+KPX oslash ncaron -55
+KPX oslash ncommaaccent -55
+KPX oslash ntilde -55
+KPX oslash o -55
+KPX oslash oacute -55
+KPX oslash ocircumflex -55
+KPX oslash odieresis -55
+KPX oslash ograve -55
+KPX oslash ohungarumlaut -55
+KPX oslash omacron -55
+KPX oslash oslash -55
+KPX oslash otilde -55
+KPX oslash p -55
+KPX oslash period -95
+KPX oslash q -55
+KPX oslash r -55
+KPX oslash racute -55
+KPX oslash rcaron -55
+KPX oslash rcommaaccent -55
+KPX oslash s -55
+KPX oslash sacute -55
+KPX oslash scaron -55
+KPX oslash scedilla -55
+KPX oslash scommaaccent -55
+KPX oslash t -55
+KPX oslash tcommaaccent -55
+KPX oslash u -55
+KPX oslash uacute -55
+KPX oslash ucircumflex -55
+KPX oslash udieresis -55
+KPX oslash ugrave -55
+KPX oslash uhungarumlaut -55
+KPX oslash umacron -55
+KPX oslash uogonek -55
+KPX oslash uring -55
+KPX oslash v -70
+KPX oslash w -70
+KPX oslash x -85
+KPX oslash y -70
+KPX oslash yacute -70
+KPX oslash ydieresis -70
+KPX oslash z -55
+KPX oslash zacute -55
+KPX oslash zcaron -55
+KPX oslash zdotaccent -55
+KPX otilde comma -40
+KPX otilde period -40
+KPX otilde v -15
+KPX otilde w -15
+KPX otilde x -30
+KPX otilde y -30
+KPX otilde yacute -30
+KPX otilde ydieresis -30
+KPX p comma -35
+KPX p period -35
+KPX p y -30
+KPX p yacute -30
+KPX p ydieresis -30
+KPX period quotedblright -100
+KPX period quoteright -100
+KPX period space -60
+KPX quotedblright space -40
+KPX quoteleft quoteleft -57
+KPX quoteright d -50
+KPX quoteright dcroat -50
+KPX quoteright quoteright -57
+KPX quoteright r -50
+KPX quoteright racute -50
+KPX quoteright rcaron -50
+KPX quoteright rcommaaccent -50
+KPX quoteright s -50
+KPX quoteright sacute -50
+KPX quoteright scaron -50
+KPX quoteright scedilla -50
+KPX quoteright scommaaccent -50
+KPX quoteright space -70
+KPX r a -10
+KPX r aacute -10
+KPX r abreve -10
+KPX r acircumflex -10
+KPX r adieresis -10
+KPX r agrave -10
+KPX r amacron -10
+KPX r aogonek -10
+KPX r aring -10
+KPX r atilde -10
+KPX r colon 30
+KPX r comma -50
+KPX r i 15
+KPX r iacute 15
+KPX r icircumflex 15
+KPX r idieresis 15
+KPX r igrave 15
+KPX r imacron 15
+KPX r iogonek 15
+KPX r k 15
+KPX r kcommaaccent 15
+KPX r l 15
+KPX r lacute 15
+KPX r lcommaaccent 15
+KPX r lslash 15
+KPX r m 25
+KPX r n 25
+KPX r nacute 25
+KPX r ncaron 25
+KPX r ncommaaccent 25
+KPX r ntilde 25
+KPX r p 30
+KPX r period -50
+KPX r semicolon 30
+KPX r t 40
+KPX r tcommaaccent 40
+KPX r u 15
+KPX r uacute 15
+KPX r ucircumflex 15
+KPX r udieresis 15
+KPX r ugrave 15
+KPX r uhungarumlaut 15
+KPX r umacron 15
+KPX r uogonek 15
+KPX r uring 15
+KPX r v 30
+KPX r y 30
+KPX r yacute 30
+KPX r ydieresis 30
+KPX racute a -10
+KPX racute aacute -10
+KPX racute abreve -10
+KPX racute acircumflex -10
+KPX racute adieresis -10
+KPX racute agrave -10
+KPX racute amacron -10
+KPX racute aogonek -10
+KPX racute aring -10
+KPX racute atilde -10
+KPX racute colon 30
+KPX racute comma -50
+KPX racute i 15
+KPX racute iacute 15
+KPX racute icircumflex 15
+KPX racute idieresis 15
+KPX racute igrave 15
+KPX racute imacron 15
+KPX racute iogonek 15
+KPX racute k 15
+KPX racute kcommaaccent 15
+KPX racute l 15
+KPX racute lacute 15
+KPX racute lcommaaccent 15
+KPX racute lslash 15
+KPX racute m 25
+KPX racute n 25
+KPX racute nacute 25
+KPX racute ncaron 25
+KPX racute ncommaaccent 25
+KPX racute ntilde 25
+KPX racute p 30
+KPX racute period -50
+KPX racute semicolon 30
+KPX racute t 40
+KPX racute tcommaaccent 40
+KPX racute u 15
+KPX racute uacute 15
+KPX racute ucircumflex 15
+KPX racute udieresis 15
+KPX racute ugrave 15
+KPX racute uhungarumlaut 15
+KPX racute umacron 15
+KPX racute uogonek 15
+KPX racute uring 15
+KPX racute v 30
+KPX racute y 30
+KPX racute yacute 30
+KPX racute ydieresis 30
+KPX rcaron a -10
+KPX rcaron aacute -10
+KPX rcaron abreve -10
+KPX rcaron acircumflex -10
+KPX rcaron adieresis -10
+KPX rcaron agrave -10
+KPX rcaron amacron -10
+KPX rcaron aogonek -10
+KPX rcaron aring -10
+KPX rcaron atilde -10
+KPX rcaron colon 30
+KPX rcaron comma -50
+KPX rcaron i 15
+KPX rcaron iacute 15
+KPX rcaron icircumflex 15
+KPX rcaron idieresis 15
+KPX rcaron igrave 15
+KPX rcaron imacron 15
+KPX rcaron iogonek 15
+KPX rcaron k 15
+KPX rcaron kcommaaccent 15
+KPX rcaron l 15
+KPX rcaron lacute 15
+KPX rcaron lcommaaccent 15
+KPX rcaron lslash 15
+KPX rcaron m 25
+KPX rcaron n 25
+KPX rcaron nacute 25
+KPX rcaron ncaron 25
+KPX rcaron ncommaaccent 25
+KPX rcaron ntilde 25
+KPX rcaron p 30
+KPX rcaron period -50
+KPX rcaron semicolon 30
+KPX rcaron t 40
+KPX rcaron tcommaaccent 40
+KPX rcaron u 15
+KPX rcaron uacute 15
+KPX rcaron ucircumflex 15
+KPX rcaron udieresis 15
+KPX rcaron ugrave 15
+KPX rcaron uhungarumlaut 15
+KPX rcaron umacron 15
+KPX rcaron uogonek 15
+KPX rcaron uring 15
+KPX rcaron v 30
+KPX rcaron y 30
+KPX rcaron yacute 30
+KPX rcaron ydieresis 30
+KPX rcommaaccent a -10
+KPX rcommaaccent aacute -10
+KPX rcommaaccent abreve -10
+KPX rcommaaccent acircumflex -10
+KPX rcommaaccent adieresis -10
+KPX rcommaaccent agrave -10
+KPX rcommaaccent amacron -10
+KPX rcommaaccent aogonek -10
+KPX rcommaaccent aring -10
+KPX rcommaaccent atilde -10
+KPX rcommaaccent colon 30
+KPX rcommaaccent comma -50
+KPX rcommaaccent i 15
+KPX rcommaaccent iacute 15
+KPX rcommaaccent icircumflex 15
+KPX rcommaaccent idieresis 15
+KPX rcommaaccent igrave 15
+KPX rcommaaccent imacron 15
+KPX rcommaaccent iogonek 15
+KPX rcommaaccent k 15
+KPX rcommaaccent kcommaaccent 15
+KPX rcommaaccent l 15
+KPX rcommaaccent lacute 15
+KPX rcommaaccent lcommaaccent 15
+KPX rcommaaccent lslash 15
+KPX rcommaaccent m 25
+KPX rcommaaccent n 25
+KPX rcommaaccent nacute 25
+KPX rcommaaccent ncaron 25
+KPX rcommaaccent ncommaaccent 25
+KPX rcommaaccent ntilde 25
+KPX rcommaaccent p 30
+KPX rcommaaccent period -50
+KPX rcommaaccent semicolon 30
+KPX rcommaaccent t 40
+KPX rcommaaccent tcommaaccent 40
+KPX rcommaaccent u 15
+KPX rcommaaccent uacute 15
+KPX rcommaaccent ucircumflex 15
+KPX rcommaaccent udieresis 15
+KPX rcommaaccent ugrave 15
+KPX rcommaaccent uhungarumlaut 15
+KPX rcommaaccent umacron 15
+KPX rcommaaccent uogonek 15
+KPX rcommaaccent uring 15
+KPX rcommaaccent v 30
+KPX rcommaaccent y 30
+KPX rcommaaccent yacute 30
+KPX rcommaaccent ydieresis 30
+KPX s comma -15
+KPX s period -15
+KPX s w -30
+KPX sacute comma -15
+KPX sacute period -15
+KPX sacute w -30
+KPX scaron comma -15
+KPX scaron period -15
+KPX scaron w -30
+KPX scedilla comma -15
+KPX scedilla period -15
+KPX scedilla w -30
+KPX scommaaccent comma -15
+KPX scommaaccent period -15
+KPX scommaaccent w -30
+KPX semicolon space -50
+KPX space T -50
+KPX space Tcaron -50
+KPX space Tcommaaccent -50
+KPX space V -50
+KPX space W -40
+KPX space Y -90
+KPX space Yacute -90
+KPX space Ydieresis -90
+KPX space quotedblleft -30
+KPX space quoteleft -60
+KPX v a -25
+KPX v aacute -25
+KPX v abreve -25
+KPX v acircumflex -25
+KPX v adieresis -25
+KPX v agrave -25
+KPX v amacron -25
+KPX v aogonek -25
+KPX v aring -25
+KPX v atilde -25
+KPX v comma -80
+KPX v e -25
+KPX v eacute -25
+KPX v ecaron -25
+KPX v ecircumflex -25
+KPX v edieresis -25
+KPX v edotaccent -25
+KPX v egrave -25
+KPX v emacron -25
+KPX v eogonek -25
+KPX v o -25
+KPX v oacute -25
+KPX v ocircumflex -25
+KPX v odieresis -25
+KPX v ograve -25
+KPX v ohungarumlaut -25
+KPX v omacron -25
+KPX v oslash -25
+KPX v otilde -25
+KPX v period -80
+KPX w a -15
+KPX w aacute -15
+KPX w abreve -15
+KPX w acircumflex -15
+KPX w adieresis -15
+KPX w agrave -15
+KPX w amacron -15
+KPX w aogonek -15
+KPX w aring -15
+KPX w atilde -15
+KPX w comma -60
+KPX w e -10
+KPX w eacute -10
+KPX w ecaron -10
+KPX w ecircumflex -10
+KPX w edieresis -10
+KPX w edotaccent -10
+KPX w egrave -10
+KPX w emacron -10
+KPX w eogonek -10
+KPX w o -10
+KPX w oacute -10
+KPX w ocircumflex -10
+KPX w odieresis -10
+KPX w ograve -10
+KPX w ohungarumlaut -10
+KPX w omacron -10
+KPX w oslash -10
+KPX w otilde -10
+KPX w period -60
+KPX x e -30
+KPX x eacute -30
+KPX x ecaron -30
+KPX x ecircumflex -30
+KPX x edieresis -30
+KPX x edotaccent -30
+KPX x egrave -30
+KPX x emacron -30
+KPX x eogonek -30
+KPX y a -20
+KPX y aacute -20
+KPX y abreve -20
+KPX y acircumflex -20
+KPX y adieresis -20
+KPX y agrave -20
+KPX y amacron -20
+KPX y aogonek -20
+KPX y aring -20
+KPX y atilde -20
+KPX y comma -100
+KPX y e -20
+KPX y eacute -20
+KPX y ecaron -20
+KPX y ecircumflex -20
+KPX y edieresis -20
+KPX y edotaccent -20
+KPX y egrave -20
+KPX y emacron -20
+KPX y eogonek -20
+KPX y o -20
+KPX y oacute -20
+KPX y ocircumflex -20
+KPX y odieresis -20
+KPX y ograve -20
+KPX y ohungarumlaut -20
+KPX y omacron -20
+KPX y oslash -20
+KPX y otilde -20
+KPX y period -100
+KPX yacute a -20
+KPX yacute aacute -20
+KPX yacute abreve -20
+KPX yacute acircumflex -20
+KPX yacute adieresis -20
+KPX yacute agrave -20
+KPX yacute amacron -20
+KPX yacute aogonek -20
+KPX yacute aring -20
+KPX yacute atilde -20
+KPX yacute comma -100
+KPX yacute e -20
+KPX yacute eacute -20
+KPX yacute ecaron -20
+KPX yacute ecircumflex -20
+KPX yacute edieresis -20
+KPX yacute edotaccent -20
+KPX yacute egrave -20
+KPX yacute emacron -20
+KPX yacute eogonek -20
+KPX yacute o -20
+KPX yacute oacute -20
+KPX yacute ocircumflex -20
+KPX yacute odieresis -20
+KPX yacute ograve -20
+KPX yacute ohungarumlaut -20
+KPX yacute omacron -20
+KPX yacute oslash -20
+KPX yacute otilde -20
+KPX yacute period -100
+KPX ydieresis a -20
+KPX ydieresis aacute -20
+KPX ydieresis abreve -20
+KPX ydieresis acircumflex -20
+KPX ydieresis adieresis -20
+KPX ydieresis agrave -20
+KPX ydieresis amacron -20
+KPX ydieresis aogonek -20
+KPX ydieresis aring -20
+KPX ydieresis atilde -20
+KPX ydieresis comma -100
+KPX ydieresis e -20
+KPX ydieresis eacute -20
+KPX ydieresis ecaron -20
+KPX ydieresis ecircumflex -20
+KPX ydieresis edieresis -20
+KPX ydieresis edotaccent -20
+KPX ydieresis egrave -20
+KPX ydieresis emacron -20
+KPX ydieresis eogonek -20
+KPX ydieresis o -20
+KPX ydieresis oacute -20
+KPX ydieresis ocircumflex -20
+KPX ydieresis odieresis -20
+KPX ydieresis ograve -20
+KPX ydieresis ohungarumlaut -20
+KPX ydieresis omacron -20
+KPX ydieresis oslash -20
+KPX ydieresis otilde -20
+KPX ydieresis period -100
+KPX z e -15
+KPX z eacute -15
+KPX z ecaron -15
+KPX z ecircumflex -15
+KPX z edieresis -15
+KPX z edotaccent -15
+KPX z egrave -15
+KPX z emacron -15
+KPX z eogonek -15
+KPX z o -15
+KPX z oacute -15
+KPX z ocircumflex -15
+KPX z odieresis -15
+KPX z ograve -15
+KPX z ohungarumlaut -15
+KPX z omacron -15
+KPX z oslash -15
+KPX z otilde -15
+KPX zacute e -15
+KPX zacute eacute -15
+KPX zacute ecaron -15
+KPX zacute ecircumflex -15
+KPX zacute edieresis -15
+KPX zacute edotaccent -15
+KPX zacute egrave -15
+KPX zacute emacron -15
+KPX zacute eogonek -15
+KPX zacute o -15
+KPX zacute oacute -15
+KPX zacute ocircumflex -15
+KPX zacute odieresis -15
+KPX zacute ograve -15
+KPX zacute ohungarumlaut -15
+KPX zacute omacron -15
+KPX zacute oslash -15
+KPX zacute otilde -15
+KPX zcaron e -15
+KPX zcaron eacute -15
+KPX zcaron ecaron -15
+KPX zcaron ecircumflex -15
+KPX zcaron edieresis -15
+KPX zcaron edotaccent -15
+KPX zcaron egrave -15
+KPX zcaron emacron -15
+KPX zcaron eogonek -15
+KPX zcaron o -15
+KPX zcaron oacute -15
+KPX zcaron ocircumflex -15
+KPX zcaron odieresis -15
+KPX zcaron ograve -15
+KPX zcaron ohungarumlaut -15
+KPX zcaron omacron -15
+KPX zcaron oslash -15
+KPX zcaron otilde -15
+KPX zdotaccent e -15
+KPX zdotaccent eacute -15
+KPX zdotaccent ecaron -15
+KPX zdotaccent ecircumflex -15
+KPX zdotaccent edieresis -15
+KPX zdotaccent edotaccent -15
+KPX zdotaccent egrave -15
+KPX zdotaccent emacron -15
+KPX zdotaccent eogonek -15
+KPX zdotaccent o -15
+KPX zdotaccent oacute -15
+KPX zdotaccent ocircumflex -15
+KPX zdotaccent odieresis -15
+KPX zdotaccent ograve -15
+KPX zdotaccent ohungarumlaut -15
+KPX zdotaccent omacron -15
+KPX zdotaccent oslash -15
+KPX zdotaccent otilde -15
+EndKernPairs
+EndKernData
+EndFontMetrics
diff --git a/src/main/resources/Resources/afm/Symbol.afm b/src/main/resources/Resources/afm/Symbol.afm
new file mode 100644
index 0000000..524cfb6
--- /dev/null
+++ b/src/main/resources/Resources/afm/Symbol.afm
@@ -0,0 +1,213 @@
+StartFontMetrics 4.1
+Comment Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All rights reserved.
+Comment Creation Date: Thu May 1 15:12:25 1997
+Comment UniqueID 43064
+Comment VMusage 30820 39997
+FontName Symbol
+FullName Symbol
+FamilyName Symbol
+Weight Medium
+ItalicAngle 0
+IsFixedPitch false
+CharacterSet Special
+FontBBox -180 -293 1090 1010
+UnderlinePosition -100
+UnderlineThickness 50
+Version 001.008
+Notice Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All rights reserved.
+EncodingScheme FontSpecific
+StdHW 92
+StdVW 85
+StartCharMetrics 190
+C 32 ; WX 250 ; N space ; B 0 0 0 0 ;
+C 33 ; WX 333 ; N exclam ; B 128 -17 240 672 ;
+C 34 ; WX 713 ; N universal ; B 31 0 681 705 ;
+C 35 ; WX 500 ; N numbersign ; B 20 -16 481 673 ;
+C 36 ; WX 549 ; N existential ; B 25 0 478 707 ;
+C 37 ; WX 833 ; N percent ; B 63 -36 771 655 ;
+C 38 ; WX 778 ; N ampersand ; B 41 -18 750 661 ;
+C 39 ; WX 439 ; N suchthat ; B 48 -17 414 500 ;
+C 40 ; WX 333 ; N parenleft ; B 53 -191 300 673 ;
+C 41 ; WX 333 ; N parenright ; B 30 -191 277 673 ;
+C 42 ; WX 500 ; N asteriskmath ; B 65 134 427 551 ;
+C 43 ; WX 549 ; N plus ; B 10 0 539 533 ;
+C 44 ; WX 250 ; N comma ; B 56 -152 194 104 ;
+C 45 ; WX 549 ; N minus ; B 11 233 535 288 ;
+C 46 ; WX 250 ; N period ; B 69 -17 181 95 ;
+C 47 ; WX 278 ; N slash ; B 0 -18 254 646 ;
+C 48 ; WX 500 ; N zero ; B 24 -14 476 685 ;
+C 49 ; WX 500 ; N one ; B 117 0 390 673 ;
+C 50 ; WX 500 ; N two ; B 25 0 475 685 ;
+C 51 ; WX 500 ; N three ; B 43 -14 435 685 ;
+C 52 ; WX 500 ; N four ; B 15 0 469 685 ;
+C 53 ; WX 500 ; N five ; B 32 -14 445 690 ;
+C 54 ; WX 500 ; N six ; B 34 -14 468 685 ;
+C 55 ; WX 500 ; N seven ; B 24 -16 448 673 ;
+C 56 ; WX 500 ; N eight ; B 56 -14 445 685 ;
+C 57 ; WX 500 ; N nine ; B 30 -18 459 685 ;
+C 58 ; WX 278 ; N colon ; B 81 -17 193 460 ;
+C 59 ; WX 278 ; N semicolon ; B 83 -152 221 460 ;
+C 60 ; WX 549 ; N less ; B 26 0 523 522 ;
+C 61 ; WX 549 ; N equal ; B 11 141 537 390 ;
+C 62 ; WX 549 ; N greater ; B 26 0 523 522 ;
+C 63 ; WX 444 ; N question ; B 70 -17 412 686 ;
+C 64 ; WX 549 ; N congruent ; B 11 0 537 475 ;
+C 65 ; WX 722 ; N Alpha ; B 4 0 684 673 ;
+C 66 ; WX 667 ; N Beta ; B 29 0 592 673 ;
+C 67 ; WX 722 ; N Chi ; B -9 0 704 673 ;
+C 68 ; WX 612 ; N Delta ; B 6 0 608 688 ;
+C 69 ; WX 611 ; N Epsilon ; B 32 0 617 673 ;
+C 70 ; WX 763 ; N Phi ; B 26 0 741 673 ;
+C 71 ; WX 603 ; N Gamma ; B 24 0 609 673 ;
+C 72 ; WX 722 ; N Eta ; B 39 0 729 673 ;
+C 73 ; WX 333 ; N Iota ; B 32 0 316 673 ;
+C 74 ; WX 631 ; N theta1 ; B 18 -18 623 689 ;
+C 75 ; WX 722 ; N Kappa ; B 35 0 722 673 ;
+C 76 ; WX 686 ; N Lambda ; B 6 0 680 688 ;
+C 77 ; WX 889 ; N Mu ; B 28 0 887 673 ;
+C 78 ; WX 722 ; N Nu ; B 29 -8 720 673 ;
+C 79 ; WX 722 ; N Omicron ; B 41 -17 715 685 ;
+C 80 ; WX 768 ; N Pi ; B 25 0 745 673 ;
+C 81 ; WX 741 ; N Theta ; B 41 -17 715 685 ;
+C 82 ; WX 556 ; N Rho ; B 28 0 563 673 ;
+C 83 ; WX 592 ; N Sigma ; B 5 0 589 673 ;
+C 84 ; WX 611 ; N Tau ; B 33 0 607 673 ;
+C 85 ; WX 690 ; N Upsilon ; B -8 0 694 673 ;
+C 86 ; WX 439 ; N sigma1 ; B 40 -233 436 500 ;
+C 87 ; WX 768 ; N Omega ; B 34 0 736 688 ;
+C 88 ; WX 645 ; N Xi ; B 40 0 599 673 ;
+C 89 ; WX 795 ; N Psi ; B 15 0 781 684 ;
+C 90 ; WX 611 ; N Zeta ; B 44 0 636 673 ;
+C 91 ; WX 333 ; N bracketleft ; B 86 -155 299 674 ;
+C 92 ; WX 863 ; N therefore ; B 163 0 701 487 ;
+C 93 ; WX 333 ; N bracketright ; B 33 -155 246 674 ;
+C 94 ; WX 658 ; N perpendicular ; B 15 0 652 674 ;
+C 95 ; WX 500 ; N underscore ; B -2 -125 502 -75 ;
+C 96 ; WX 500 ; N radicalex ; B 480 881 1090 917 ;
+C 97 ; WX 631 ; N alpha ; B 41 -18 622 500 ;
+C 98 ; WX 549 ; N beta ; B 61 -223 515 741 ;
+C 99 ; WX 549 ; N chi ; B 12 -231 522 499 ;
+C 100 ; WX 494 ; N delta ; B 40 -19 481 740 ;
+C 101 ; WX 439 ; N epsilon ; B 22 -19 427 502 ;
+C 102 ; WX 521 ; N phi ; B 28 -224 492 673 ;
+C 103 ; WX 411 ; N gamma ; B 5 -225 484 499 ;
+C 104 ; WX 603 ; N eta ; B 0 -202 527 514 ;
+C 105 ; WX 329 ; N iota ; B 0 -17 301 503 ;
+C 106 ; WX 603 ; N phi1 ; B 36 -224 587 499 ;
+C 107 ; WX 549 ; N kappa ; B 33 0 558 501 ;
+C 108 ; WX 549 ; N lambda ; B 24 -17 548 739 ;
+C 109 ; WX 576 ; N mu ; B 33 -223 567 500 ;
+C 110 ; WX 521 ; N nu ; B -9 -16 475 507 ;
+C 111 ; WX 549 ; N omicron ; B 35 -19 501 499 ;
+C 112 ; WX 549 ; N pi ; B 10 -19 530 487 ;
+C 113 ; WX 521 ; N theta ; B 43 -17 485 690 ;
+C 114 ; WX 549 ; N rho ; B 50 -230 490 499 ;
+C 115 ; WX 603 ; N sigma ; B 30 -21 588 500 ;
+C 116 ; WX 439 ; N tau ; B 10 -19 418 500 ;
+C 117 ; WX 576 ; N upsilon ; B 7 -18 535 507 ;
+C 118 ; WX 713 ; N omega1 ; B 12 -18 671 583 ;
+C 119 ; WX 686 ; N omega ; B 42 -17 684 500 ;
+C 120 ; WX 493 ; N xi ; B 27 -224 469 766 ;
+C 121 ; WX 686 ; N psi ; B 12 -228 701 500 ;
+C 122 ; WX 494 ; N zeta ; B 60 -225 467 756 ;
+C 123 ; WX 480 ; N braceleft ; B 58 -183 397 673 ;
+C 124 ; WX 200 ; N bar ; B 65 -293 135 707 ;
+C 125 ; WX 480 ; N braceright ; B 79 -183 418 673 ;
+C 126 ; WX 549 ; N similar ; B 17 203 529 307 ;
+C 160 ; WX 750 ; N Euro ; B 20 -12 714 685 ;
+C 161 ; WX 620 ; N Upsilon1 ; B -2 0 610 685 ;
+C 162 ; WX 247 ; N minute ; B 27 459 228 735 ;
+C 163 ; WX 549 ; N lessequal ; B 29 0 526 639 ;
+C 164 ; WX 167 ; N fraction ; B -180 -12 340 677 ;
+C 165 ; WX 713 ; N infinity ; B 26 124 688 404 ;
+C 166 ; WX 500 ; N florin ; B 2 -193 494 686 ;
+C 167 ; WX 753 ; N club ; B 86 -26 660 533 ;
+C 168 ; WX 753 ; N diamond ; B 142 -36 600 550 ;
+C 169 ; WX 753 ; N heart ; B 117 -33 631 532 ;
+C 170 ; WX 753 ; N spade ; B 113 -36 629 548 ;
+C 171 ; WX 1042 ; N arrowboth ; B 24 -15 1024 511 ;
+C 172 ; WX 987 ; N arrowleft ; B 32 -15 942 511 ;
+C 173 ; WX 603 ; N arrowup ; B 45 0 571 910 ;
+C 174 ; WX 987 ; N arrowright ; B 49 -15 959 511 ;
+C 175 ; WX 603 ; N arrowdown ; B 45 -22 571 888 ;
+C 176 ; WX 400 ; N degree ; B 50 385 350 685 ;
+C 177 ; WX 549 ; N plusminus ; B 10 0 539 645 ;
+C 178 ; WX 411 ; N second ; B 20 459 413 737 ;
+C 179 ; WX 549 ; N greaterequal ; B 29 0 526 639 ;
+C 180 ; WX 549 ; N multiply ; B 17 8 533 524 ;
+C 181 ; WX 713 ; N proportional ; B 27 123 639 404 ;
+C 182 ; WX 494 ; N partialdiff ; B 26 -20 462 746 ;
+C 183 ; WX 460 ; N bullet ; B 50 113 410 473 ;
+C 184 ; WX 549 ; N divide ; B 10 71 536 456 ;
+C 185 ; WX 549 ; N notequal ; B 15 -25 540 549 ;
+C 186 ; WX 549 ; N equivalence ; B 14 82 538 443 ;
+C 187 ; WX 549 ; N approxequal ; B 14 135 527 394 ;
+C 188 ; WX 1000 ; N ellipsis ; B 111 -17 889 95 ;
+C 189 ; WX 603 ; N arrowvertex ; B 280 -120 336 1010 ;
+C 190 ; WX 1000 ; N arrowhorizex ; B -60 220 1050 276 ;
+C 191 ; WX 658 ; N carriagereturn ; B 15 -16 602 629 ;
+C 192 ; WX 823 ; N aleph ; B 175 -18 661 658 ;
+C 193 ; WX 686 ; N Ifraktur ; B 10 -53 578 740 ;
+C 194 ; WX 795 ; N Rfraktur ; B 26 -15 759 734 ;
+C 195 ; WX 987 ; N weierstrass ; B 159 -211 870 573 ;
+C 196 ; WX 768 ; N circlemultiply ; B 43 -17 733 673 ;
+C 197 ; WX 768 ; N circleplus ; B 43 -15 733 675 ;
+C 198 ; WX 823 ; N emptyset ; B 39 -24 781 719 ;
+C 199 ; WX 768 ; N intersection ; B 40 0 732 509 ;
+C 200 ; WX 768 ; N union ; B 40 -17 732 492 ;
+C 201 ; WX 713 ; N propersuperset ; B 20 0 673 470 ;
+C 202 ; WX 713 ; N reflexsuperset ; B 20 -125 673 470 ;
+C 203 ; WX 713 ; N notsubset ; B 36 -70 690 540 ;
+C 204 ; WX 713 ; N propersubset ; B 37 0 690 470 ;
+C 205 ; WX 713 ; N reflexsubset ; B 37 -125 690 470 ;
+C 206 ; WX 713 ; N element ; B 45 0 505 468 ;
+C 207 ; WX 713 ; N notelement ; B 45 -58 505 555 ;
+C 208 ; WX 768 ; N angle ; B 26 0 738 673 ;
+C 209 ; WX 713 ; N gradient ; B 36 -19 681 718 ;
+C 210 ; WX 790 ; N registerserif ; B 50 -17 740 673 ;
+C 211 ; WX 790 ; N copyrightserif ; B 51 -15 741 675 ;
+C 212 ; WX 890 ; N trademarkserif ; B 18 293 855 673 ;
+C 213 ; WX 823 ; N product ; B 25 -101 803 751 ;
+C 214 ; WX 549 ; N radical ; B 10 -38 515 917 ;
+C 215 ; WX 250 ; N dotmath ; B 69 210 169 310 ;
+C 216 ; WX 713 ; N logicalnot ; B 15 0 680 288 ;
+C 217 ; WX 603 ; N logicaland ; B 23 0 583 454 ;
+C 218 ; WX 603 ; N logicalor ; B 30 0 578 477 ;
+C 219 ; WX 1042 ; N arrowdblboth ; B 27 -20 1023 510 ;
+C 220 ; WX 987 ; N arrowdblleft ; B 30 -15 939 513 ;
+C 221 ; WX 603 ; N arrowdblup ; B 39 2 567 911 ;
+C 222 ; WX 987 ; N arrowdblright ; B 45 -20 954 508 ;
+C 223 ; WX 603 ; N arrowdbldown ; B 44 -19 572 890 ;
+C 224 ; WX 494 ; N lozenge ; B 18 0 466 745 ;
+C 225 ; WX 329 ; N angleleft ; B 25 -198 306 746 ;
+C 226 ; WX 790 ; N registersans ; B 50 -20 740 670 ;
+C 227 ; WX 790 ; N copyrightsans ; B 49 -15 739 675 ;
+C 228 ; WX 786 ; N trademarksans ; B 5 293 725 673 ;
+C 229 ; WX 713 ; N summation ; B 14 -108 695 752 ;
+C 230 ; WX 384 ; N parenlefttp ; B 24 -293 436 926 ;
+C 231 ; WX 384 ; N parenleftex ; B 24 -85 108 925 ;
+C 232 ; WX 384 ; N parenleftbt ; B 24 -293 436 926 ;
+C 233 ; WX 384 ; N bracketlefttp ; B 0 -80 349 926 ;
+C 234 ; WX 384 ; N bracketleftex ; B 0 -79 77 925 ;
+C 235 ; WX 384 ; N bracketleftbt ; B 0 -80 349 926 ;
+C 236 ; WX 494 ; N bracelefttp ; B 209 -85 445 925 ;
+C 237 ; WX 494 ; N braceleftmid ; B 20 -85 284 935 ;
+C 238 ; WX 494 ; N braceleftbt ; B 209 -75 445 935 ;
+C 239 ; WX 494 ; N braceex ; B 209 -85 284 935 ;
+C 241 ; WX 329 ; N angleright ; B 21 -198 302 746 ;
+C 242 ; WX 274 ; N integral ; B 2 -107 291 916 ;
+C 243 ; WX 686 ; N integraltp ; B 308 -88 675 920 ;
+C 244 ; WX 686 ; N integralex ; B 308 -88 378 975 ;
+C 245 ; WX 686 ; N integralbt ; B 11 -87 378 921 ;
+C 246 ; WX 384 ; N parenrighttp ; B 54 -293 466 926 ;
+C 247 ; WX 384 ; N parenrightex ; B 382 -85 466 925 ;
+C 248 ; WX 384 ; N parenrightbt ; B 54 -293 466 926 ;
+C 249 ; WX 384 ; N bracketrighttp ; B 22 -80 371 926 ;
+C 250 ; WX 384 ; N bracketrightex ; B 294 -79 371 925 ;
+C 251 ; WX 384 ; N bracketrightbt ; B 22 -80 371 926 ;
+C 252 ; WX 494 ; N bracerighttp ; B 48 -85 284 925 ;
+C 253 ; WX 494 ; N bracerightmid ; B 209 -85 473 935 ;
+C 254 ; WX 494 ; N bracerightbt ; B 48 -75 284 935 ;
+C -1 ; WX 790 ; N apple ; B 56 -3 733 808 ;
+EndCharMetrics
+EndFontMetrics
diff --git a/src/main/resources/Resources/afm/Times-Bold.afm b/src/main/resources/Resources/afm/Times-Bold.afm
new file mode 100644
index 0000000..ee718a2
--- /dev/null
+++ b/src/main/resources/Resources/afm/Times-Bold.afm
@@ -0,0 +1,2588 @@
+StartFontMetrics 4.1
+Comment Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.
+Comment Creation Date: Thu May 1 12:52:56 1997
+Comment UniqueID 43065
+Comment VMusage 41636 52661
+FontName Times-Bold
+FullName Times Bold
+FamilyName Times
+Weight Bold
+ItalicAngle 0
+IsFixedPitch false
+CharacterSet ExtendedRoman
+FontBBox -168 -218 1000 935
+UnderlinePosition -100
+UnderlineThickness 50
+Version 002.000
+Notice Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.Times is a trademark of Linotype-Hell AG and/or its subsidiaries.
+EncodingScheme AdobeStandardEncoding
+CapHeight 676
+XHeight 461
+Ascender 683
+Descender -217
+StdHW 44
+StdVW 139
+StartCharMetrics 315
+C 32 ; WX 250 ; N space ; B 0 0 0 0 ;
+C 33 ; WX 333 ; N exclam ; B 81 -13 251 691 ;
+C 34 ; WX 555 ; N quotedbl ; B 83 404 472 691 ;
+C 35 ; WX 500 ; N numbersign ; B 4 0 496 700 ;
+C 36 ; WX 500 ; N dollar ; B 29 -99 472 750 ;
+C 37 ; WX 1000 ; N percent ; B 124 -14 877 692 ;
+C 38 ; WX 833 ; N ampersand ; B 62 -16 787 691 ;
+C 39 ; WX 333 ; N quoteright ; B 79 356 263 691 ;
+C 40 ; WX 333 ; N parenleft ; B 46 -168 306 694 ;
+C 41 ; WX 333 ; N parenright ; B 27 -168 287 694 ;
+C 42 ; WX 500 ; N asterisk ; B 56 255 447 691 ;
+C 43 ; WX 570 ; N plus ; B 33 0 537 506 ;
+C 44 ; WX 250 ; N comma ; B 39 -180 223 155 ;
+C 45 ; WX 333 ; N hyphen ; B 44 171 287 287 ;
+C 46 ; WX 250 ; N period ; B 41 -13 210 156 ;
+C 47 ; WX 278 ; N slash ; B -24 -19 302 691 ;
+C 48 ; WX 500 ; N zero ; B 24 -13 476 688 ;
+C 49 ; WX 500 ; N one ; B 65 0 442 688 ;
+C 50 ; WX 500 ; N two ; B 17 0 478 688 ;
+C 51 ; WX 500 ; N three ; B 16 -14 468 688 ;
+C 52 ; WX 500 ; N four ; B 19 0 475 688 ;
+C 53 ; WX 500 ; N five ; B 22 -8 470 676 ;
+C 54 ; WX 500 ; N six ; B 28 -13 475 688 ;
+C 55 ; WX 500 ; N seven ; B 17 0 477 676 ;
+C 56 ; WX 500 ; N eight ; B 28 -13 472 688 ;
+C 57 ; WX 500 ; N nine ; B 26 -13 473 688 ;
+C 58 ; WX 333 ; N colon ; B 82 -13 251 472 ;
+C 59 ; WX 333 ; N semicolon ; B 82 -180 266 472 ;
+C 60 ; WX 570 ; N less ; B 31 -8 539 514 ;
+C 61 ; WX 570 ; N equal ; B 33 107 537 399 ;
+C 62 ; WX 570 ; N greater ; B 31 -8 539 514 ;
+C 63 ; WX 500 ; N question ; B 57 -13 445 689 ;
+C 64 ; WX 930 ; N at ; B 108 -19 822 691 ;
+C 65 ; WX 722 ; N A ; B 9 0 689 690 ;
+C 66 ; WX 667 ; N B ; B 16 0 619 676 ;
+C 67 ; WX 722 ; N C ; B 49 -19 687 691 ;
+C 68 ; WX 722 ; N D ; B 14 0 690 676 ;
+C 69 ; WX 667 ; N E ; B 16 0 641 676 ;
+C 70 ; WX 611 ; N F ; B 16 0 583 676 ;
+C 71 ; WX 778 ; N G ; B 37 -19 755 691 ;
+C 72 ; WX 778 ; N H ; B 21 0 759 676 ;
+C 73 ; WX 389 ; N I ; B 20 0 370 676 ;
+C 74 ; WX 500 ; N J ; B 3 -96 479 676 ;
+C 75 ; WX 778 ; N K ; B 30 0 769 676 ;
+C 76 ; WX 667 ; N L ; B 19 0 638 676 ;
+C 77 ; WX 944 ; N M ; B 14 0 921 676 ;
+C 78 ; WX 722 ; N N ; B 16 -18 701 676 ;
+C 79 ; WX 778 ; N O ; B 35 -19 743 691 ;
+C 80 ; WX 611 ; N P ; B 16 0 600 676 ;
+C 81 ; WX 778 ; N Q ; B 35 -176 743 691 ;
+C 82 ; WX 722 ; N R ; B 26 0 715 676 ;
+C 83 ; WX 556 ; N S ; B 35 -19 513 692 ;
+C 84 ; WX 667 ; N T ; B 31 0 636 676 ;
+C 85 ; WX 722 ; N U ; B 16 -19 701 676 ;
+C 86 ; WX 722 ; N V ; B 16 -18 701 676 ;
+C 87 ; WX 1000 ; N W ; B 19 -15 981 676 ;
+C 88 ; WX 722 ; N X ; B 16 0 699 676 ;
+C 89 ; WX 722 ; N Y ; B 15 0 699 676 ;
+C 90 ; WX 667 ; N Z ; B 28 0 634 676 ;
+C 91 ; WX 333 ; N bracketleft ; B 67 -149 301 678 ;
+C 92 ; WX 278 ; N backslash ; B -25 -19 303 691 ;
+C 93 ; WX 333 ; N bracketright ; B 32 -149 266 678 ;
+C 94 ; WX 581 ; N asciicircum ; B 73 311 509 676 ;
+C 95 ; WX 500 ; N underscore ; B 0 -125 500 -75 ;
+C 96 ; WX 333 ; N quoteleft ; B 70 356 254 691 ;
+C 97 ; WX 500 ; N a ; B 25 -14 488 473 ;
+C 98 ; WX 556 ; N b ; B 17 -14 521 676 ;
+C 99 ; WX 444 ; N c ; B 25 -14 430 473 ;
+C 100 ; WX 556 ; N d ; B 25 -14 534 676 ;
+C 101 ; WX 444 ; N e ; B 25 -14 426 473 ;
+C 102 ; WX 333 ; N f ; B 14 0 389 691 ; L i fi ; L l fl ;
+C 103 ; WX 500 ; N g ; B 28 -206 483 473 ;
+C 104 ; WX 556 ; N h ; B 16 0 534 676 ;
+C 105 ; WX 278 ; N i ; B 16 0 255 691 ;
+C 106 ; WX 333 ; N j ; B -57 -203 263 691 ;
+C 107 ; WX 556 ; N k ; B 22 0 543 676 ;
+C 108 ; WX 278 ; N l ; B 16 0 255 676 ;
+C 109 ; WX 833 ; N m ; B 16 0 814 473 ;
+C 110 ; WX 556 ; N n ; B 21 0 539 473 ;
+C 111 ; WX 500 ; N o ; B 25 -14 476 473 ;
+C 112 ; WX 556 ; N p ; B 19 -205 524 473 ;
+C 113 ; WX 556 ; N q ; B 34 -205 536 473 ;
+C 114 ; WX 444 ; N r ; B 29 0 434 473 ;
+C 115 ; WX 389 ; N s ; B 25 -14 361 473 ;
+C 116 ; WX 333 ; N t ; B 20 -12 332 630 ;
+C 117 ; WX 556 ; N u ; B 16 -14 537 461 ;
+C 118 ; WX 500 ; N v ; B 21 -14 485 461 ;
+C 119 ; WX 722 ; N w ; B 23 -14 707 461 ;
+C 120 ; WX 500 ; N x ; B 12 0 484 461 ;
+C 121 ; WX 500 ; N y ; B 16 -205 480 461 ;
+C 122 ; WX 444 ; N z ; B 21 0 420 461 ;
+C 123 ; WX 394 ; N braceleft ; B 22 -175 340 698 ;
+C 124 ; WX 220 ; N bar ; B 66 -218 154 782 ;
+C 125 ; WX 394 ; N braceright ; B 54 -175 372 698 ;
+C 126 ; WX 520 ; N asciitilde ; B 29 173 491 333 ;
+C 161 ; WX 333 ; N exclamdown ; B 82 -203 252 501 ;
+C 162 ; WX 500 ; N cent ; B 53 -140 458 588 ;
+C 163 ; WX 500 ; N sterling ; B 21 -14 477 684 ;
+C 164 ; WX 167 ; N fraction ; B -168 -12 329 688 ;
+C 165 ; WX 500 ; N yen ; B -64 0 547 676 ;
+C 166 ; WX 500 ; N florin ; B 0 -155 498 706 ;
+C 167 ; WX 500 ; N section ; B 57 -132 443 691 ;
+C 168 ; WX 500 ; N currency ; B -26 61 526 613 ;
+C 169 ; WX 278 ; N quotesingle ; B 75 404 204 691 ;
+C 170 ; WX 500 ; N quotedblleft ; B 32 356 486 691 ;
+C 171 ; WX 500 ; N guillemotleft ; B 23 36 473 415 ;
+C 172 ; WX 333 ; N guilsinglleft ; B 51 36 305 415 ;
+C 173 ; WX 333 ; N guilsinglright ; B 28 36 282 415 ;
+C 174 ; WX 556 ; N fi ; B 14 0 536 691 ;
+C 175 ; WX 556 ; N fl ; B 14 0 536 691 ;
+C 177 ; WX 500 ; N endash ; B 0 181 500 271 ;
+C 178 ; WX 500 ; N dagger ; B 47 -134 453 691 ;
+C 179 ; WX 500 ; N daggerdbl ; B 45 -132 456 691 ;
+C 180 ; WX 250 ; N periodcentered ; B 41 248 210 417 ;
+C 182 ; WX 540 ; N paragraph ; B 0 -186 519 676 ;
+C 183 ; WX 350 ; N bullet ; B 35 198 315 478 ;
+C 184 ; WX 333 ; N quotesinglbase ; B 79 -180 263 155 ;
+C 185 ; WX 500 ; N quotedblbase ; B 14 -180 468 155 ;
+C 186 ; WX 500 ; N quotedblright ; B 14 356 468 691 ;
+C 187 ; WX 500 ; N guillemotright ; B 27 36 477 415 ;
+C 188 ; WX 1000 ; N ellipsis ; B 82 -13 917 156 ;
+C 189 ; WX 1000 ; N perthousand ; B 7 -29 995 706 ;
+C 191 ; WX 500 ; N questiondown ; B 55 -201 443 501 ;
+C 193 ; WX 333 ; N grave ; B 8 528 246 713 ;
+C 194 ; WX 333 ; N acute ; B 86 528 324 713 ;
+C 195 ; WX 333 ; N circumflex ; B -2 528 335 704 ;
+C 196 ; WX 333 ; N tilde ; B -16 547 349 674 ;
+C 197 ; WX 333 ; N macron ; B 1 565 331 637 ;
+C 198 ; WX 333 ; N breve ; B 15 528 318 691 ;
+C 199 ; WX 333 ; N dotaccent ; B 103 536 258 691 ;
+C 200 ; WX 333 ; N dieresis ; B -2 537 335 667 ;
+C 202 ; WX 333 ; N ring ; B 60 527 273 740 ;
+C 203 ; WX 333 ; N cedilla ; B 68 -218 294 0 ;
+C 205 ; WX 333 ; N hungarumlaut ; B -13 528 425 713 ;
+C 206 ; WX 333 ; N ogonek ; B 90 -193 319 24 ;
+C 207 ; WX 333 ; N caron ; B -2 528 335 704 ;
+C 208 ; WX 1000 ; N emdash ; B 0 181 1000 271 ;
+C 225 ; WX 1000 ; N AE ; B 4 0 951 676 ;
+C 227 ; WX 300 ; N ordfeminine ; B -1 397 301 688 ;
+C 232 ; WX 667 ; N Lslash ; B 19 0 638 676 ;
+C 233 ; WX 778 ; N Oslash ; B 35 -74 743 737 ;
+C 234 ; WX 1000 ; N OE ; B 22 -5 981 684 ;
+C 235 ; WX 330 ; N ordmasculine ; B 18 397 312 688 ;
+C 241 ; WX 722 ; N ae ; B 33 -14 693 473 ;
+C 245 ; WX 278 ; N dotlessi ; B 16 0 255 461 ;
+C 248 ; WX 278 ; N lslash ; B -22 0 303 676 ;
+C 249 ; WX 500 ; N oslash ; B 25 -92 476 549 ;
+C 250 ; WX 722 ; N oe ; B 22 -14 696 473 ;
+C 251 ; WX 556 ; N germandbls ; B 19 -12 517 691 ;
+C -1 ; WX 389 ; N Idieresis ; B 20 0 370 877 ;
+C -1 ; WX 444 ; N eacute ; B 25 -14 426 713 ;
+C -1 ; WX 500 ; N abreve ; B 25 -14 488 691 ;
+C -1 ; WX 556 ; N uhungarumlaut ; B 16 -14 557 713 ;
+C -1 ; WX 444 ; N ecaron ; B 25 -14 426 704 ;
+C -1 ; WX 722 ; N Ydieresis ; B 15 0 699 877 ;
+C -1 ; WX 570 ; N divide ; B 33 -31 537 537 ;
+C -1 ; WX 722 ; N Yacute ; B 15 0 699 923 ;
+C -1 ; WX 722 ; N Acircumflex ; B 9 0 689 914 ;
+C -1 ; WX 500 ; N aacute ; B 25 -14 488 713 ;
+C -1 ; WX 722 ; N Ucircumflex ; B 16 -19 701 914 ;
+C -1 ; WX 500 ; N yacute ; B 16 -205 480 713 ;
+C -1 ; WX 389 ; N scommaaccent ; B 25 -218 361 473 ;
+C -1 ; WX 444 ; N ecircumflex ; B 25 -14 426 704 ;
+C -1 ; WX 722 ; N Uring ; B 16 -19 701 935 ;
+C -1 ; WX 722 ; N Udieresis ; B 16 -19 701 877 ;
+C -1 ; WX 500 ; N aogonek ; B 25 -193 504 473 ;
+C -1 ; WX 722 ; N Uacute ; B 16 -19 701 923 ;
+C -1 ; WX 556 ; N uogonek ; B 16 -193 539 461 ;
+C -1 ; WX 667 ; N Edieresis ; B 16 0 641 877 ;
+C -1 ; WX 722 ; N Dcroat ; B 6 0 690 676 ;
+C -1 ; WX 250 ; N commaaccent ; B 47 -218 203 -50 ;
+C -1 ; WX 747 ; N copyright ; B 26 -19 721 691 ;
+C -1 ; WX 667 ; N Emacron ; B 16 0 641 847 ;
+C -1 ; WX 444 ; N ccaron ; B 25 -14 430 704 ;
+C -1 ; WX 500 ; N aring ; B 25 -14 488 740 ;
+C -1 ; WX 722 ; N Ncommaaccent ; B 16 -188 701 676 ;
+C -1 ; WX 278 ; N lacute ; B 16 0 297 923 ;
+C -1 ; WX 500 ; N agrave ; B 25 -14 488 713 ;
+C -1 ; WX 667 ; N Tcommaaccent ; B 31 -218 636 676 ;
+C -1 ; WX 722 ; N Cacute ; B 49 -19 687 923 ;
+C -1 ; WX 500 ; N atilde ; B 25 -14 488 674 ;
+C -1 ; WX 667 ; N Edotaccent ; B 16 0 641 901 ;
+C -1 ; WX 389 ; N scaron ; B 25 -14 363 704 ;
+C -1 ; WX 389 ; N scedilla ; B 25 -218 361 473 ;
+C -1 ; WX 278 ; N iacute ; B 16 0 289 713 ;
+C -1 ; WX 494 ; N lozenge ; B 10 0 484 745 ;
+C -1 ; WX 722 ; N Rcaron ; B 26 0 715 914 ;
+C -1 ; WX 778 ; N Gcommaaccent ; B 37 -218 755 691 ;
+C -1 ; WX 556 ; N ucircumflex ; B 16 -14 537 704 ;
+C -1 ; WX 500 ; N acircumflex ; B 25 -14 488 704 ;
+C -1 ; WX 722 ; N Amacron ; B 9 0 689 847 ;
+C -1 ; WX 444 ; N rcaron ; B 29 0 434 704 ;
+C -1 ; WX 444 ; N ccedilla ; B 25 -218 430 473 ;
+C -1 ; WX 667 ; N Zdotaccent ; B 28 0 634 901 ;
+C -1 ; WX 611 ; N Thorn ; B 16 0 600 676 ;
+C -1 ; WX 778 ; N Omacron ; B 35 -19 743 847 ;
+C -1 ; WX 722 ; N Racute ; B 26 0 715 923 ;
+C -1 ; WX 556 ; N Sacute ; B 35 -19 513 923 ;
+C -1 ; WX 672 ; N dcaron ; B 25 -14 681 682 ;
+C -1 ; WX 722 ; N Umacron ; B 16 -19 701 847 ;
+C -1 ; WX 556 ; N uring ; B 16 -14 537 740 ;
+C -1 ; WX 300 ; N threesuperior ; B 3 268 297 688 ;
+C -1 ; WX 778 ; N Ograve ; B 35 -19 743 923 ;
+C -1 ; WX 722 ; N Agrave ; B 9 0 689 923 ;
+C -1 ; WX 722 ; N Abreve ; B 9 0 689 901 ;
+C -1 ; WX 570 ; N multiply ; B 48 16 522 490 ;
+C -1 ; WX 556 ; N uacute ; B 16 -14 537 713 ;
+C -1 ; WX 667 ; N Tcaron ; B 31 0 636 914 ;
+C -1 ; WX 494 ; N partialdiff ; B 11 -21 494 750 ;
+C -1 ; WX 500 ; N ydieresis ; B 16 -205 480 667 ;
+C -1 ; WX 722 ; N Nacute ; B 16 -18 701 923 ;
+C -1 ; WX 278 ; N icircumflex ; B -37 0 300 704 ;
+C -1 ; WX 667 ; N Ecircumflex ; B 16 0 641 914 ;
+C -1 ; WX 500 ; N adieresis ; B 25 -14 488 667 ;
+C -1 ; WX 444 ; N edieresis ; B 25 -14 426 667 ;
+C -1 ; WX 444 ; N cacute ; B 25 -14 430 713 ;
+C -1 ; WX 556 ; N nacute ; B 21 0 539 713 ;
+C -1 ; WX 556 ; N umacron ; B 16 -14 537 637 ;
+C -1 ; WX 722 ; N Ncaron ; B 16 -18 701 914 ;
+C -1 ; WX 389 ; N Iacute ; B 20 0 370 923 ;
+C -1 ; WX 570 ; N plusminus ; B 33 0 537 506 ;
+C -1 ; WX 220 ; N brokenbar ; B 66 -143 154 707 ;
+C -1 ; WX 747 ; N registered ; B 26 -19 721 691 ;
+C -1 ; WX 778 ; N Gbreve ; B 37 -19 755 901 ;
+C -1 ; WX 389 ; N Idotaccent ; B 20 0 370 901 ;
+C -1 ; WX 600 ; N summation ; B 14 -10 585 706 ;
+C -1 ; WX 667 ; N Egrave ; B 16 0 641 923 ;
+C -1 ; WX 444 ; N racute ; B 29 0 434 713 ;
+C -1 ; WX 500 ; N omacron ; B 25 -14 476 637 ;
+C -1 ; WX 667 ; N Zacute ; B 28 0 634 923 ;
+C -1 ; WX 667 ; N Zcaron ; B 28 0 634 914 ;
+C -1 ; WX 549 ; N greaterequal ; B 26 0 523 704 ;
+C -1 ; WX 722 ; N Eth ; B 6 0 690 676 ;
+C -1 ; WX 722 ; N Ccedilla ; B 49 -218 687 691 ;
+C -1 ; WX 278 ; N lcommaaccent ; B 16 -218 255 676 ;
+C -1 ; WX 416 ; N tcaron ; B 20 -12 425 815 ;
+C -1 ; WX 444 ; N eogonek ; B 25 -193 426 473 ;
+C -1 ; WX 722 ; N Uogonek ; B 16 -193 701 676 ;
+C -1 ; WX 722 ; N Aacute ; B 9 0 689 923 ;
+C -1 ; WX 722 ; N Adieresis ; B 9 0 689 877 ;
+C -1 ; WX 444 ; N egrave ; B 25 -14 426 713 ;
+C -1 ; WX 444 ; N zacute ; B 21 0 420 713 ;
+C -1 ; WX 278 ; N iogonek ; B 16 -193 274 691 ;
+C -1 ; WX 778 ; N Oacute ; B 35 -19 743 923 ;
+C -1 ; WX 500 ; N oacute ; B 25 -14 476 713 ;
+C -1 ; WX 500 ; N amacron ; B 25 -14 488 637 ;
+C -1 ; WX 389 ; N sacute ; B 25 -14 361 713 ;
+C -1 ; WX 278 ; N idieresis ; B -37 0 300 667 ;
+C -1 ; WX 778 ; N Ocircumflex ; B 35 -19 743 914 ;
+C -1 ; WX 722 ; N Ugrave ; B 16 -19 701 923 ;
+C -1 ; WX 612 ; N Delta ; B 6 0 608 688 ;
+C -1 ; WX 556 ; N thorn ; B 19 -205 524 676 ;
+C -1 ; WX 300 ; N twosuperior ; B 0 275 300 688 ;
+C -1 ; WX 778 ; N Odieresis ; B 35 -19 743 877 ;
+C -1 ; WX 556 ; N mu ; B 33 -206 536 461 ;
+C -1 ; WX 278 ; N igrave ; B -27 0 255 713 ;
+C -1 ; WX 500 ; N ohungarumlaut ; B 25 -14 529 713 ;
+C -1 ; WX 667 ; N Eogonek ; B 16 -193 644 676 ;
+C -1 ; WX 556 ; N dcroat ; B 25 -14 534 676 ;
+C -1 ; WX 750 ; N threequarters ; B 23 -12 733 688 ;
+C -1 ; WX 556 ; N Scedilla ; B 35 -218 513 692 ;
+C -1 ; WX 394 ; N lcaron ; B 16 0 412 682 ;
+C -1 ; WX 778 ; N Kcommaaccent ; B 30 -218 769 676 ;
+C -1 ; WX 667 ; N Lacute ; B 19 0 638 923 ;
+C -1 ; WX 1000 ; N trademark ; B 24 271 977 676 ;
+C -1 ; WX 444 ; N edotaccent ; B 25 -14 426 691 ;
+C -1 ; WX 389 ; N Igrave ; B 20 0 370 923 ;
+C -1 ; WX 389 ; N Imacron ; B 20 0 370 847 ;
+C -1 ; WX 667 ; N Lcaron ; B 19 0 652 682 ;
+C -1 ; WX 750 ; N onehalf ; B -7 -12 775 688 ;
+C -1 ; WX 549 ; N lessequal ; B 29 0 526 704 ;
+C -1 ; WX 500 ; N ocircumflex ; B 25 -14 476 704 ;
+C -1 ; WX 556 ; N ntilde ; B 21 0 539 674 ;
+C -1 ; WX 722 ; N Uhungarumlaut ; B 16 -19 701 923 ;
+C -1 ; WX 667 ; N Eacute ; B 16 0 641 923 ;
+C -1 ; WX 444 ; N emacron ; B 25 -14 426 637 ;
+C -1 ; WX 500 ; N gbreve ; B 28 -206 483 691 ;
+C -1 ; WX 750 ; N onequarter ; B 28 -12 743 688 ;
+C -1 ; WX 556 ; N Scaron ; B 35 -19 513 914 ;
+C -1 ; WX 556 ; N Scommaaccent ; B 35 -218 513 692 ;
+C -1 ; WX 778 ; N Ohungarumlaut ; B 35 -19 743 923 ;
+C -1 ; WX 400 ; N degree ; B 57 402 343 688 ;
+C -1 ; WX 500 ; N ograve ; B 25 -14 476 713 ;
+C -1 ; WX 722 ; N Ccaron ; B 49 -19 687 914 ;
+C -1 ; WX 556 ; N ugrave ; B 16 -14 537 713 ;
+C -1 ; WX 549 ; N radical ; B 10 -46 512 850 ;
+C -1 ; WX 722 ; N Dcaron ; B 14 0 690 914 ;
+C -1 ; WX 444 ; N rcommaaccent ; B 29 -218 434 473 ;
+C -1 ; WX 722 ; N Ntilde ; B 16 -18 701 884 ;
+C -1 ; WX 500 ; N otilde ; B 25 -14 476 674 ;
+C -1 ; WX 722 ; N Rcommaaccent ; B 26 -218 715 676 ;
+C -1 ; WX 667 ; N Lcommaaccent ; B 19 -218 638 676 ;
+C -1 ; WX 722 ; N Atilde ; B 9 0 689 884 ;
+C -1 ; WX 722 ; N Aogonek ; B 9 -193 699 690 ;
+C -1 ; WX 722 ; N Aring ; B 9 0 689 935 ;
+C -1 ; WX 778 ; N Otilde ; B 35 -19 743 884 ;
+C -1 ; WX 444 ; N zdotaccent ; B 21 0 420 691 ;
+C -1 ; WX 667 ; N Ecaron ; B 16 0 641 914 ;
+C -1 ; WX 389 ; N Iogonek ; B 20 -193 370 676 ;
+C -1 ; WX 556 ; N kcommaaccent ; B 22 -218 543 676 ;
+C -1 ; WX 570 ; N minus ; B 33 209 537 297 ;
+C -1 ; WX 389 ; N Icircumflex ; B 20 0 370 914 ;
+C -1 ; WX 556 ; N ncaron ; B 21 0 539 704 ;
+C -1 ; WX 333 ; N tcommaaccent ; B 20 -218 332 630 ;
+C -1 ; WX 570 ; N logicalnot ; B 33 108 537 399 ;
+C -1 ; WX 500 ; N odieresis ; B 25 -14 476 667 ;
+C -1 ; WX 556 ; N udieresis ; B 16 -14 537 667 ;
+C -1 ; WX 549 ; N notequal ; B 15 -49 540 570 ;
+C -1 ; WX 500 ; N gcommaaccent ; B 28 -206 483 829 ;
+C -1 ; WX 500 ; N eth ; B 25 -14 476 691 ;
+C -1 ; WX 444 ; N zcaron ; B 21 0 420 704 ;
+C -1 ; WX 556 ; N ncommaaccent ; B 21 -218 539 473 ;
+C -1 ; WX 300 ; N onesuperior ; B 28 275 273 688 ;
+C -1 ; WX 278 ; N imacron ; B -8 0 272 637 ;
+C -1 ; WX 500 ; N Euro ; B 0 0 0 0 ;
+EndCharMetrics
+StartKernData
+StartKernPairs 2242
+KPX A C -55
+KPX A Cacute -55
+KPX A Ccaron -55
+KPX A Ccedilla -55
+KPX A G -55
+KPX A Gbreve -55
+KPX A Gcommaaccent -55
+KPX A O -45
+KPX A Oacute -45
+KPX A Ocircumflex -45
+KPX A Odieresis -45
+KPX A Ograve -45
+KPX A Ohungarumlaut -45
+KPX A Omacron -45
+KPX A Oslash -45
+KPX A Otilde -45
+KPX A Q -45
+KPX A T -95
+KPX A Tcaron -95
+KPX A Tcommaaccent -95
+KPX A U -50
+KPX A Uacute -50
+KPX A Ucircumflex -50
+KPX A Udieresis -50
+KPX A Ugrave -50
+KPX A Uhungarumlaut -50
+KPX A Umacron -50
+KPX A Uogonek -50
+KPX A Uring -50
+KPX A V -145
+KPX A W -130
+KPX A Y -100
+KPX A Yacute -100
+KPX A Ydieresis -100
+KPX A p -25
+KPX A quoteright -74
+KPX A u -50
+KPX A uacute -50
+KPX A ucircumflex -50
+KPX A udieresis -50
+KPX A ugrave -50
+KPX A uhungarumlaut -50
+KPX A umacron -50
+KPX A uogonek -50
+KPX A uring -50
+KPX A v -100
+KPX A w -90
+KPX A y -74
+KPX A yacute -74
+KPX A ydieresis -74
+KPX Aacute C -55
+KPX Aacute Cacute -55
+KPX Aacute Ccaron -55
+KPX Aacute Ccedilla -55
+KPX Aacute G -55
+KPX Aacute Gbreve -55
+KPX Aacute Gcommaaccent -55
+KPX Aacute O -45
+KPX Aacute Oacute -45
+KPX Aacute Ocircumflex -45
+KPX Aacute Odieresis -45
+KPX Aacute Ograve -45
+KPX Aacute Ohungarumlaut -45
+KPX Aacute Omacron -45
+KPX Aacute Oslash -45
+KPX Aacute Otilde -45
+KPX Aacute Q -45
+KPX Aacute T -95
+KPX Aacute Tcaron -95
+KPX Aacute Tcommaaccent -95
+KPX Aacute U -50
+KPX Aacute Uacute -50
+KPX Aacute Ucircumflex -50
+KPX Aacute Udieresis -50
+KPX Aacute Ugrave -50
+KPX Aacute Uhungarumlaut -50
+KPX Aacute Umacron -50
+KPX Aacute Uogonek -50
+KPX Aacute Uring -50
+KPX Aacute V -145
+KPX Aacute W -130
+KPX Aacute Y -100
+KPX Aacute Yacute -100
+KPX Aacute Ydieresis -100
+KPX Aacute p -25
+KPX Aacute quoteright -74
+KPX Aacute u -50
+KPX Aacute uacute -50
+KPX Aacute ucircumflex -50
+KPX Aacute udieresis -50
+KPX Aacute ugrave -50
+KPX Aacute uhungarumlaut -50
+KPX Aacute umacron -50
+KPX Aacute uogonek -50
+KPX Aacute uring -50
+KPX Aacute v -100
+KPX Aacute w -90
+KPX Aacute y -74
+KPX Aacute yacute -74
+KPX Aacute ydieresis -74
+KPX Abreve C -55
+KPX Abreve Cacute -55
+KPX Abreve Ccaron -55
+KPX Abreve Ccedilla -55
+KPX Abreve G -55
+KPX Abreve Gbreve -55
+KPX Abreve Gcommaaccent -55
+KPX Abreve O -45
+KPX Abreve Oacute -45
+KPX Abreve Ocircumflex -45
+KPX Abreve Odieresis -45
+KPX Abreve Ograve -45
+KPX Abreve Ohungarumlaut -45
+KPX Abreve Omacron -45
+KPX Abreve Oslash -45
+KPX Abreve Otilde -45
+KPX Abreve Q -45
+KPX Abreve T -95
+KPX Abreve Tcaron -95
+KPX Abreve Tcommaaccent -95
+KPX Abreve U -50
+KPX Abreve Uacute -50
+KPX Abreve Ucircumflex -50
+KPX Abreve Udieresis -50
+KPX Abreve Ugrave -50
+KPX Abreve Uhungarumlaut -50
+KPX Abreve Umacron -50
+KPX Abreve Uogonek -50
+KPX Abreve Uring -50
+KPX Abreve V -145
+KPX Abreve W -130
+KPX Abreve Y -100
+KPX Abreve Yacute -100
+KPX Abreve Ydieresis -100
+KPX Abreve p -25
+KPX Abreve quoteright -74
+KPX Abreve u -50
+KPX Abreve uacute -50
+KPX Abreve ucircumflex -50
+KPX Abreve udieresis -50
+KPX Abreve ugrave -50
+KPX Abreve uhungarumlaut -50
+KPX Abreve umacron -50
+KPX Abreve uogonek -50
+KPX Abreve uring -50
+KPX Abreve v -100
+KPX Abreve w -90
+KPX Abreve y -74
+KPX Abreve yacute -74
+KPX Abreve ydieresis -74
+KPX Acircumflex C -55
+KPX Acircumflex Cacute -55
+KPX Acircumflex Ccaron -55
+KPX Acircumflex Ccedilla -55
+KPX Acircumflex G -55
+KPX Acircumflex Gbreve -55
+KPX Acircumflex Gcommaaccent -55
+KPX Acircumflex O -45
+KPX Acircumflex Oacute -45
+KPX Acircumflex Ocircumflex -45
+KPX Acircumflex Odieresis -45
+KPX Acircumflex Ograve -45
+KPX Acircumflex Ohungarumlaut -45
+KPX Acircumflex Omacron -45
+KPX Acircumflex Oslash -45
+KPX Acircumflex Otilde -45
+KPX Acircumflex Q -45
+KPX Acircumflex T -95
+KPX Acircumflex Tcaron -95
+KPX Acircumflex Tcommaaccent -95
+KPX Acircumflex U -50
+KPX Acircumflex Uacute -50
+KPX Acircumflex Ucircumflex -50
+KPX Acircumflex Udieresis -50
+KPX Acircumflex Ugrave -50
+KPX Acircumflex Uhungarumlaut -50
+KPX Acircumflex Umacron -50
+KPX Acircumflex Uogonek -50
+KPX Acircumflex Uring -50
+KPX Acircumflex V -145
+KPX Acircumflex W -130
+KPX Acircumflex Y -100
+KPX Acircumflex Yacute -100
+KPX Acircumflex Ydieresis -100
+KPX Acircumflex p -25
+KPX Acircumflex quoteright -74
+KPX Acircumflex u -50
+KPX Acircumflex uacute -50
+KPX Acircumflex ucircumflex -50
+KPX Acircumflex udieresis -50
+KPX Acircumflex ugrave -50
+KPX Acircumflex uhungarumlaut -50
+KPX Acircumflex umacron -50
+KPX Acircumflex uogonek -50
+KPX Acircumflex uring -50
+KPX Acircumflex v -100
+KPX Acircumflex w -90
+KPX Acircumflex y -74
+KPX Acircumflex yacute -74
+KPX Acircumflex ydieresis -74
+KPX Adieresis C -55
+KPX Adieresis Cacute -55
+KPX Adieresis Ccaron -55
+KPX Adieresis Ccedilla -55
+KPX Adieresis G -55
+KPX Adieresis Gbreve -55
+KPX Adieresis Gcommaaccent -55
+KPX Adieresis O -45
+KPX Adieresis Oacute -45
+KPX Adieresis Ocircumflex -45
+KPX Adieresis Odieresis -45
+KPX Adieresis Ograve -45
+KPX Adieresis Ohungarumlaut -45
+KPX Adieresis Omacron -45
+KPX Adieresis Oslash -45
+KPX Adieresis Otilde -45
+KPX Adieresis Q -45
+KPX Adieresis T -95
+KPX Adieresis Tcaron -95
+KPX Adieresis Tcommaaccent -95
+KPX Adieresis U -50
+KPX Adieresis Uacute -50
+KPX Adieresis Ucircumflex -50
+KPX Adieresis Udieresis -50
+KPX Adieresis Ugrave -50
+KPX Adieresis Uhungarumlaut -50
+KPX Adieresis Umacron -50
+KPX Adieresis Uogonek -50
+KPX Adieresis Uring -50
+KPX Adieresis V -145
+KPX Adieresis W -130
+KPX Adieresis Y -100
+KPX Adieresis Yacute -100
+KPX Adieresis Ydieresis -100
+KPX Adieresis p -25
+KPX Adieresis quoteright -74
+KPX Adieresis u -50
+KPX Adieresis uacute -50
+KPX Adieresis ucircumflex -50
+KPX Adieresis udieresis -50
+KPX Adieresis ugrave -50
+KPX Adieresis uhungarumlaut -50
+KPX Adieresis umacron -50
+KPX Adieresis uogonek -50
+KPX Adieresis uring -50
+KPX Adieresis v -100
+KPX Adieresis w -90
+KPX Adieresis y -74
+KPX Adieresis yacute -74
+KPX Adieresis ydieresis -74
+KPX Agrave C -55
+KPX Agrave Cacute -55
+KPX Agrave Ccaron -55
+KPX Agrave Ccedilla -55
+KPX Agrave G -55
+KPX Agrave Gbreve -55
+KPX Agrave Gcommaaccent -55
+KPX Agrave O -45
+KPX Agrave Oacute -45
+KPX Agrave Ocircumflex -45
+KPX Agrave Odieresis -45
+KPX Agrave Ograve -45
+KPX Agrave Ohungarumlaut -45
+KPX Agrave Omacron -45
+KPX Agrave Oslash -45
+KPX Agrave Otilde -45
+KPX Agrave Q -45
+KPX Agrave T -95
+KPX Agrave Tcaron -95
+KPX Agrave Tcommaaccent -95
+KPX Agrave U -50
+KPX Agrave Uacute -50
+KPX Agrave Ucircumflex -50
+KPX Agrave Udieresis -50
+KPX Agrave Ugrave -50
+KPX Agrave Uhungarumlaut -50
+KPX Agrave Umacron -50
+KPX Agrave Uogonek -50
+KPX Agrave Uring -50
+KPX Agrave V -145
+KPX Agrave W -130
+KPX Agrave Y -100
+KPX Agrave Yacute -100
+KPX Agrave Ydieresis -100
+KPX Agrave p -25
+KPX Agrave quoteright -74
+KPX Agrave u -50
+KPX Agrave uacute -50
+KPX Agrave ucircumflex -50
+KPX Agrave udieresis -50
+KPX Agrave ugrave -50
+KPX Agrave uhungarumlaut -50
+KPX Agrave umacron -50
+KPX Agrave uogonek -50
+KPX Agrave uring -50
+KPX Agrave v -100
+KPX Agrave w -90
+KPX Agrave y -74
+KPX Agrave yacute -74
+KPX Agrave ydieresis -74
+KPX Amacron C -55
+KPX Amacron Cacute -55
+KPX Amacron Ccaron -55
+KPX Amacron Ccedilla -55
+KPX Amacron G -55
+KPX Amacron Gbreve -55
+KPX Amacron Gcommaaccent -55
+KPX Amacron O -45
+KPX Amacron Oacute -45
+KPX Amacron Ocircumflex -45
+KPX Amacron Odieresis -45
+KPX Amacron Ograve -45
+KPX Amacron Ohungarumlaut -45
+KPX Amacron Omacron -45
+KPX Amacron Oslash -45
+KPX Amacron Otilde -45
+KPX Amacron Q -45
+KPX Amacron T -95
+KPX Amacron Tcaron -95
+KPX Amacron Tcommaaccent -95
+KPX Amacron U -50
+KPX Amacron Uacute -50
+KPX Amacron Ucircumflex -50
+KPX Amacron Udieresis -50
+KPX Amacron Ugrave -50
+KPX Amacron Uhungarumlaut -50
+KPX Amacron Umacron -50
+KPX Amacron Uogonek -50
+KPX Amacron Uring -50
+KPX Amacron V -145
+KPX Amacron W -130
+KPX Amacron Y -100
+KPX Amacron Yacute -100
+KPX Amacron Ydieresis -100
+KPX Amacron p -25
+KPX Amacron quoteright -74
+KPX Amacron u -50
+KPX Amacron uacute -50
+KPX Amacron ucircumflex -50
+KPX Amacron udieresis -50
+KPX Amacron ugrave -50
+KPX Amacron uhungarumlaut -50
+KPX Amacron umacron -50
+KPX Amacron uogonek -50
+KPX Amacron uring -50
+KPX Amacron v -100
+KPX Amacron w -90
+KPX Amacron y -74
+KPX Amacron yacute -74
+KPX Amacron ydieresis -74
+KPX Aogonek C -55
+KPX Aogonek Cacute -55
+KPX Aogonek Ccaron -55
+KPX Aogonek Ccedilla -55
+KPX Aogonek G -55
+KPX Aogonek Gbreve -55
+KPX Aogonek Gcommaaccent -55
+KPX Aogonek O -45
+KPX Aogonek Oacute -45
+KPX Aogonek Ocircumflex -45
+KPX Aogonek Odieresis -45
+KPX Aogonek Ograve -45
+KPX Aogonek Ohungarumlaut -45
+KPX Aogonek Omacron -45
+KPX Aogonek Oslash -45
+KPX Aogonek Otilde -45
+KPX Aogonek Q -45
+KPX Aogonek T -95
+KPX Aogonek Tcaron -95
+KPX Aogonek Tcommaaccent -95
+KPX Aogonek U -50
+KPX Aogonek Uacute -50
+KPX Aogonek Ucircumflex -50
+KPX Aogonek Udieresis -50
+KPX Aogonek Ugrave -50
+KPX Aogonek Uhungarumlaut -50
+KPX Aogonek Umacron -50
+KPX Aogonek Uogonek -50
+KPX Aogonek Uring -50
+KPX Aogonek V -145
+KPX Aogonek W -130
+KPX Aogonek Y -100
+KPX Aogonek Yacute -100
+KPX Aogonek Ydieresis -100
+KPX Aogonek p -25
+KPX Aogonek quoteright -74
+KPX Aogonek u -50
+KPX Aogonek uacute -50
+KPX Aogonek ucircumflex -50
+KPX Aogonek udieresis -50
+KPX Aogonek ugrave -50
+KPX Aogonek uhungarumlaut -50
+KPX Aogonek umacron -50
+KPX Aogonek uogonek -50
+KPX Aogonek uring -50
+KPX Aogonek v -100
+KPX Aogonek w -90
+KPX Aogonek y -34
+KPX Aogonek yacute -34
+KPX Aogonek ydieresis -34
+KPX Aring C -55
+KPX Aring Cacute -55
+KPX Aring Ccaron -55
+KPX Aring Ccedilla -55
+KPX Aring G -55
+KPX Aring Gbreve -55
+KPX Aring Gcommaaccent -55
+KPX Aring O -45
+KPX Aring Oacute -45
+KPX Aring Ocircumflex -45
+KPX Aring Odieresis -45
+KPX Aring Ograve -45
+KPX Aring Ohungarumlaut -45
+KPX Aring Omacron -45
+KPX Aring Oslash -45
+KPX Aring Otilde -45
+KPX Aring Q -45
+KPX Aring T -95
+KPX Aring Tcaron -95
+KPX Aring Tcommaaccent -95
+KPX Aring U -50
+KPX Aring Uacute -50
+KPX Aring Ucircumflex -50
+KPX Aring Udieresis -50
+KPX Aring Ugrave -50
+KPX Aring Uhungarumlaut -50
+KPX Aring Umacron -50
+KPX Aring Uogonek -50
+KPX Aring Uring -50
+KPX Aring V -145
+KPX Aring W -130
+KPX Aring Y -100
+KPX Aring Yacute -100
+KPX Aring Ydieresis -100
+KPX Aring p -25
+KPX Aring quoteright -74
+KPX Aring u -50
+KPX Aring uacute -50
+KPX Aring ucircumflex -50
+KPX Aring udieresis -50
+KPX Aring ugrave -50
+KPX Aring uhungarumlaut -50
+KPX Aring umacron -50
+KPX Aring uogonek -50
+KPX Aring uring -50
+KPX Aring v -100
+KPX Aring w -90
+KPX Aring y -74
+KPX Aring yacute -74
+KPX Aring ydieresis -74
+KPX Atilde C -55
+KPX Atilde Cacute -55
+KPX Atilde Ccaron -55
+KPX Atilde Ccedilla -55
+KPX Atilde G -55
+KPX Atilde Gbreve -55
+KPX Atilde Gcommaaccent -55
+KPX Atilde O -45
+KPX Atilde Oacute -45
+KPX Atilde Ocircumflex -45
+KPX Atilde Odieresis -45
+KPX Atilde Ograve -45
+KPX Atilde Ohungarumlaut -45
+KPX Atilde Omacron -45
+KPX Atilde Oslash -45
+KPX Atilde Otilde -45
+KPX Atilde Q -45
+KPX Atilde T -95
+KPX Atilde Tcaron -95
+KPX Atilde Tcommaaccent -95
+KPX Atilde U -50
+KPX Atilde Uacute -50
+KPX Atilde Ucircumflex -50
+KPX Atilde Udieresis -50
+KPX Atilde Ugrave -50
+KPX Atilde Uhungarumlaut -50
+KPX Atilde Umacron -50
+KPX Atilde Uogonek -50
+KPX Atilde Uring -50
+KPX Atilde V -145
+KPX Atilde W -130
+KPX Atilde Y -100
+KPX Atilde Yacute -100
+KPX Atilde Ydieresis -100
+KPX Atilde p -25
+KPX Atilde quoteright -74
+KPX Atilde u -50
+KPX Atilde uacute -50
+KPX Atilde ucircumflex -50
+KPX Atilde udieresis -50
+KPX Atilde ugrave -50
+KPX Atilde uhungarumlaut -50
+KPX Atilde umacron -50
+KPX Atilde uogonek -50
+KPX Atilde uring -50
+KPX Atilde v -100
+KPX Atilde w -90
+KPX Atilde y -74
+KPX Atilde yacute -74
+KPX Atilde ydieresis -74
+KPX B A -30
+KPX B Aacute -30
+KPX B Abreve -30
+KPX B Acircumflex -30
+KPX B Adieresis -30
+KPX B Agrave -30
+KPX B Amacron -30
+KPX B Aogonek -30
+KPX B Aring -30
+KPX B Atilde -30
+KPX B U -10
+KPX B Uacute -10
+KPX B Ucircumflex -10
+KPX B Udieresis -10
+KPX B Ugrave -10
+KPX B Uhungarumlaut -10
+KPX B Umacron -10
+KPX B Uogonek -10
+KPX B Uring -10
+KPX D A -35
+KPX D Aacute -35
+KPX D Abreve -35
+KPX D Acircumflex -35
+KPX D Adieresis -35
+KPX D Agrave -35
+KPX D Amacron -35
+KPX D Aogonek -35
+KPX D Aring -35
+KPX D Atilde -35
+KPX D V -40
+KPX D W -40
+KPX D Y -40
+KPX D Yacute -40
+KPX D Ydieresis -40
+KPX D period -20
+KPX Dcaron A -35
+KPX Dcaron Aacute -35
+KPX Dcaron Abreve -35
+KPX Dcaron Acircumflex -35
+KPX Dcaron Adieresis -35
+KPX Dcaron Agrave -35
+KPX Dcaron Amacron -35
+KPX Dcaron Aogonek -35
+KPX Dcaron Aring -35
+KPX Dcaron Atilde -35
+KPX Dcaron V -40
+KPX Dcaron W -40
+KPX Dcaron Y -40
+KPX Dcaron Yacute -40
+KPX Dcaron Ydieresis -40
+KPX Dcaron period -20
+KPX Dcroat A -35
+KPX Dcroat Aacute -35
+KPX Dcroat Abreve -35
+KPX Dcroat Acircumflex -35
+KPX Dcroat Adieresis -35
+KPX Dcroat Agrave -35
+KPX Dcroat Amacron -35
+KPX Dcroat Aogonek -35
+KPX Dcroat Aring -35
+KPX Dcroat Atilde -35
+KPX Dcroat V -40
+KPX Dcroat W -40
+KPX Dcroat Y -40
+KPX Dcroat Yacute -40
+KPX Dcroat Ydieresis -40
+KPX Dcroat period -20
+KPX F A -90
+KPX F Aacute -90
+KPX F Abreve -90
+KPX F Acircumflex -90
+KPX F Adieresis -90
+KPX F Agrave -90
+KPX F Amacron -90
+KPX F Aogonek -90
+KPX F Aring -90
+KPX F Atilde -90
+KPX F a -25
+KPX F aacute -25
+KPX F abreve -25
+KPX F acircumflex -25
+KPX F adieresis -25
+KPX F agrave -25
+KPX F amacron -25
+KPX F aogonek -25
+KPX F aring -25
+KPX F atilde -25
+KPX F comma -92
+KPX F e -25
+KPX F eacute -25
+KPX F ecaron -25
+KPX F ecircumflex -25
+KPX F edieresis -25
+KPX F edotaccent -25
+KPX F egrave -25
+KPX F emacron -25
+KPX F eogonek -25
+KPX F o -25
+KPX F oacute -25
+KPX F ocircumflex -25
+KPX F odieresis -25
+KPX F ograve -25
+KPX F ohungarumlaut -25
+KPX F omacron -25
+KPX F oslash -25
+KPX F otilde -25
+KPX F period -110
+KPX J A -30
+KPX J Aacute -30
+KPX J Abreve -30
+KPX J Acircumflex -30
+KPX J Adieresis -30
+KPX J Agrave -30
+KPX J Amacron -30
+KPX J Aogonek -30
+KPX J Aring -30
+KPX J Atilde -30
+KPX J a -15
+KPX J aacute -15
+KPX J abreve -15
+KPX J acircumflex -15
+KPX J adieresis -15
+KPX J agrave -15
+KPX J amacron -15
+KPX J aogonek -15
+KPX J aring -15
+KPX J atilde -15
+KPX J e -15
+KPX J eacute -15
+KPX J ecaron -15
+KPX J ecircumflex -15
+KPX J edieresis -15
+KPX J edotaccent -15
+KPX J egrave -15
+KPX J emacron -15
+KPX J eogonek -15
+KPX J o -15
+KPX J oacute -15
+KPX J ocircumflex -15
+KPX J odieresis -15
+KPX J ograve -15
+KPX J ohungarumlaut -15
+KPX J omacron -15
+KPX J oslash -15
+KPX J otilde -15
+KPX J period -20
+KPX J u -15
+KPX J uacute -15
+KPX J ucircumflex -15
+KPX J udieresis -15
+KPX J ugrave -15
+KPX J uhungarumlaut -15
+KPX J umacron -15
+KPX J uogonek -15
+KPX J uring -15
+KPX K O -30
+KPX K Oacute -30
+KPX K Ocircumflex -30
+KPX K Odieresis -30
+KPX K Ograve -30
+KPX K Ohungarumlaut -30
+KPX K Omacron -30
+KPX K Oslash -30
+KPX K Otilde -30
+KPX K e -25
+KPX K eacute -25
+KPX K ecaron -25
+KPX K ecircumflex -25
+KPX K edieresis -25
+KPX K edotaccent -25
+KPX K egrave -25
+KPX K emacron -25
+KPX K eogonek -25
+KPX K o -25
+KPX K oacute -25
+KPX K ocircumflex -25
+KPX K odieresis -25
+KPX K ograve -25
+KPX K ohungarumlaut -25
+KPX K omacron -25
+KPX K oslash -25
+KPX K otilde -25
+KPX K u -15
+KPX K uacute -15
+KPX K ucircumflex -15
+KPX K udieresis -15
+KPX K ugrave -15
+KPX K uhungarumlaut -15
+KPX K umacron -15
+KPX K uogonek -15
+KPX K uring -15
+KPX K y -45
+KPX K yacute -45
+KPX K ydieresis -45
+KPX Kcommaaccent O -30
+KPX Kcommaaccent Oacute -30
+KPX Kcommaaccent Ocircumflex -30
+KPX Kcommaaccent Odieresis -30
+KPX Kcommaaccent Ograve -30
+KPX Kcommaaccent Ohungarumlaut -30
+KPX Kcommaaccent Omacron -30
+KPX Kcommaaccent Oslash -30
+KPX Kcommaaccent Otilde -30
+KPX Kcommaaccent e -25
+KPX Kcommaaccent eacute -25
+KPX Kcommaaccent ecaron -25
+KPX Kcommaaccent ecircumflex -25
+KPX Kcommaaccent edieresis -25
+KPX Kcommaaccent edotaccent -25
+KPX Kcommaaccent egrave -25
+KPX Kcommaaccent emacron -25
+KPX Kcommaaccent eogonek -25
+KPX Kcommaaccent o -25
+KPX Kcommaaccent oacute -25
+KPX Kcommaaccent ocircumflex -25
+KPX Kcommaaccent odieresis -25
+KPX Kcommaaccent ograve -25
+KPX Kcommaaccent ohungarumlaut -25
+KPX Kcommaaccent omacron -25
+KPX Kcommaaccent oslash -25
+KPX Kcommaaccent otilde -25
+KPX Kcommaaccent u -15
+KPX Kcommaaccent uacute -15
+KPX Kcommaaccent ucircumflex -15
+KPX Kcommaaccent udieresis -15
+KPX Kcommaaccent ugrave -15
+KPX Kcommaaccent uhungarumlaut -15
+KPX Kcommaaccent umacron -15
+KPX Kcommaaccent uogonek -15
+KPX Kcommaaccent uring -15
+KPX Kcommaaccent y -45
+KPX Kcommaaccent yacute -45
+KPX Kcommaaccent ydieresis -45
+KPX L T -92
+KPX L Tcaron -92
+KPX L Tcommaaccent -92
+KPX L V -92
+KPX L W -92
+KPX L Y -92
+KPX L Yacute -92
+KPX L Ydieresis -92
+KPX L quotedblright -20
+KPX L quoteright -110
+KPX L y -55
+KPX L yacute -55
+KPX L ydieresis -55
+KPX Lacute T -92
+KPX Lacute Tcaron -92
+KPX Lacute Tcommaaccent -92
+KPX Lacute V -92
+KPX Lacute W -92
+KPX Lacute Y -92
+KPX Lacute Yacute -92
+KPX Lacute Ydieresis -92
+KPX Lacute quotedblright -20
+KPX Lacute quoteright -110
+KPX Lacute y -55
+KPX Lacute yacute -55
+KPX Lacute ydieresis -55
+KPX Lcommaaccent T -92
+KPX Lcommaaccent Tcaron -92
+KPX Lcommaaccent Tcommaaccent -92
+KPX Lcommaaccent V -92
+KPX Lcommaaccent W -92
+KPX Lcommaaccent Y -92
+KPX Lcommaaccent Yacute -92
+KPX Lcommaaccent Ydieresis -92
+KPX Lcommaaccent quotedblright -20
+KPX Lcommaaccent quoteright -110
+KPX Lcommaaccent y -55
+KPX Lcommaaccent yacute -55
+KPX Lcommaaccent ydieresis -55
+KPX Lslash T -92
+KPX Lslash Tcaron -92
+KPX Lslash Tcommaaccent -92
+KPX Lslash V -92
+KPX Lslash W -92
+KPX Lslash Y -92
+KPX Lslash Yacute -92
+KPX Lslash Ydieresis -92
+KPX Lslash quotedblright -20
+KPX Lslash quoteright -110
+KPX Lslash y -55
+KPX Lslash yacute -55
+KPX Lslash ydieresis -55
+KPX N A -20
+KPX N Aacute -20
+KPX N Abreve -20
+KPX N Acircumflex -20
+KPX N Adieresis -20
+KPX N Agrave -20
+KPX N Amacron -20
+KPX N Aogonek -20
+KPX N Aring -20
+KPX N Atilde -20
+KPX Nacute A -20
+KPX Nacute Aacute -20
+KPX Nacute Abreve -20
+KPX Nacute Acircumflex -20
+KPX Nacute Adieresis -20
+KPX Nacute Agrave -20
+KPX Nacute Amacron -20
+KPX Nacute Aogonek -20
+KPX Nacute Aring -20
+KPX Nacute Atilde -20
+KPX Ncaron A -20
+KPX Ncaron Aacute -20
+KPX Ncaron Abreve -20
+KPX Ncaron Acircumflex -20
+KPX Ncaron Adieresis -20
+KPX Ncaron Agrave -20
+KPX Ncaron Amacron -20
+KPX Ncaron Aogonek -20
+KPX Ncaron Aring -20
+KPX Ncaron Atilde -20
+KPX Ncommaaccent A -20
+KPX Ncommaaccent Aacute -20
+KPX Ncommaaccent Abreve -20
+KPX Ncommaaccent Acircumflex -20
+KPX Ncommaaccent Adieresis -20
+KPX Ncommaaccent Agrave -20
+KPX Ncommaaccent Amacron -20
+KPX Ncommaaccent Aogonek -20
+KPX Ncommaaccent Aring -20
+KPX Ncommaaccent Atilde -20
+KPX Ntilde A -20
+KPX Ntilde Aacute -20
+KPX Ntilde Abreve -20
+KPX Ntilde Acircumflex -20
+KPX Ntilde Adieresis -20
+KPX Ntilde Agrave -20
+KPX Ntilde Amacron -20
+KPX Ntilde Aogonek -20
+KPX Ntilde Aring -20
+KPX Ntilde Atilde -20
+KPX O A -40
+KPX O Aacute -40
+KPX O Abreve -40
+KPX O Acircumflex -40
+KPX O Adieresis -40
+KPX O Agrave -40
+KPX O Amacron -40
+KPX O Aogonek -40
+KPX O Aring -40
+KPX O Atilde -40
+KPX O T -40
+KPX O Tcaron -40
+KPX O Tcommaaccent -40
+KPX O V -50
+KPX O W -50
+KPX O X -40
+KPX O Y -50
+KPX O Yacute -50
+KPX O Ydieresis -50
+KPX Oacute A -40
+KPX Oacute Aacute -40
+KPX Oacute Abreve -40
+KPX Oacute Acircumflex -40
+KPX Oacute Adieresis -40
+KPX Oacute Agrave -40
+KPX Oacute Amacron -40
+KPX Oacute Aogonek -40
+KPX Oacute Aring -40
+KPX Oacute Atilde -40
+KPX Oacute T -40
+KPX Oacute Tcaron -40
+KPX Oacute Tcommaaccent -40
+KPX Oacute V -50
+KPX Oacute W -50
+KPX Oacute X -40
+KPX Oacute Y -50
+KPX Oacute Yacute -50
+KPX Oacute Ydieresis -50
+KPX Ocircumflex A -40
+KPX Ocircumflex Aacute -40
+KPX Ocircumflex Abreve -40
+KPX Ocircumflex Acircumflex -40
+KPX Ocircumflex Adieresis -40
+KPX Ocircumflex Agrave -40
+KPX Ocircumflex Amacron -40
+KPX Ocircumflex Aogonek -40
+KPX Ocircumflex Aring -40
+KPX Ocircumflex Atilde -40
+KPX Ocircumflex T -40
+KPX Ocircumflex Tcaron -40
+KPX Ocircumflex Tcommaaccent -40
+KPX Ocircumflex V -50
+KPX Ocircumflex W -50
+KPX Ocircumflex X -40
+KPX Ocircumflex Y -50
+KPX Ocircumflex Yacute -50
+KPX Ocircumflex Ydieresis -50
+KPX Odieresis A -40
+KPX Odieresis Aacute -40
+KPX Odieresis Abreve -40
+KPX Odieresis Acircumflex -40
+KPX Odieresis Adieresis -40
+KPX Odieresis Agrave -40
+KPX Odieresis Amacron -40
+KPX Odieresis Aogonek -40
+KPX Odieresis Aring -40
+KPX Odieresis Atilde -40
+KPX Odieresis T -40
+KPX Odieresis Tcaron -40
+KPX Odieresis Tcommaaccent -40
+KPX Odieresis V -50
+KPX Odieresis W -50
+KPX Odieresis X -40
+KPX Odieresis Y -50
+KPX Odieresis Yacute -50
+KPX Odieresis Ydieresis -50
+KPX Ograve A -40
+KPX Ograve Aacute -40
+KPX Ograve Abreve -40
+KPX Ograve Acircumflex -40
+KPX Ograve Adieresis -40
+KPX Ograve Agrave -40
+KPX Ograve Amacron -40
+KPX Ograve Aogonek -40
+KPX Ograve Aring -40
+KPX Ograve Atilde -40
+KPX Ograve T -40
+KPX Ograve Tcaron -40
+KPX Ograve Tcommaaccent -40
+KPX Ograve V -50
+KPX Ograve W -50
+KPX Ograve X -40
+KPX Ograve Y -50
+KPX Ograve Yacute -50
+KPX Ograve Ydieresis -50
+KPX Ohungarumlaut A -40
+KPX Ohungarumlaut Aacute -40
+KPX Ohungarumlaut Abreve -40
+KPX Ohungarumlaut Acircumflex -40
+KPX Ohungarumlaut Adieresis -40
+KPX Ohungarumlaut Agrave -40
+KPX Ohungarumlaut Amacron -40
+KPX Ohungarumlaut Aogonek -40
+KPX Ohungarumlaut Aring -40
+KPX Ohungarumlaut Atilde -40
+KPX Ohungarumlaut T -40
+KPX Ohungarumlaut Tcaron -40
+KPX Ohungarumlaut Tcommaaccent -40
+KPX Ohungarumlaut V -50
+KPX Ohungarumlaut W -50
+KPX Ohungarumlaut X -40
+KPX Ohungarumlaut Y -50
+KPX Ohungarumlaut Yacute -50
+KPX Ohungarumlaut Ydieresis -50
+KPX Omacron A -40
+KPX Omacron Aacute -40
+KPX Omacron Abreve -40
+KPX Omacron Acircumflex -40
+KPX Omacron Adieresis -40
+KPX Omacron Agrave -40
+KPX Omacron Amacron -40
+KPX Omacron Aogonek -40
+KPX Omacron Aring -40
+KPX Omacron Atilde -40
+KPX Omacron T -40
+KPX Omacron Tcaron -40
+KPX Omacron Tcommaaccent -40
+KPX Omacron V -50
+KPX Omacron W -50
+KPX Omacron X -40
+KPX Omacron Y -50
+KPX Omacron Yacute -50
+KPX Omacron Ydieresis -50
+KPX Oslash A -40
+KPX Oslash Aacute -40
+KPX Oslash Abreve -40
+KPX Oslash Acircumflex -40
+KPX Oslash Adieresis -40
+KPX Oslash Agrave -40
+KPX Oslash Amacron -40
+KPX Oslash Aogonek -40
+KPX Oslash Aring -40
+KPX Oslash Atilde -40
+KPX Oslash T -40
+KPX Oslash Tcaron -40
+KPX Oslash Tcommaaccent -40
+KPX Oslash V -50
+KPX Oslash W -50
+KPX Oslash X -40
+KPX Oslash Y -50
+KPX Oslash Yacute -50
+KPX Oslash Ydieresis -50
+KPX Otilde A -40
+KPX Otilde Aacute -40
+KPX Otilde Abreve -40
+KPX Otilde Acircumflex -40
+KPX Otilde Adieresis -40
+KPX Otilde Agrave -40
+KPX Otilde Amacron -40
+KPX Otilde Aogonek -40
+KPX Otilde Aring -40
+KPX Otilde Atilde -40
+KPX Otilde T -40
+KPX Otilde Tcaron -40
+KPX Otilde Tcommaaccent -40
+KPX Otilde V -50
+KPX Otilde W -50
+KPX Otilde X -40
+KPX Otilde Y -50
+KPX Otilde Yacute -50
+KPX Otilde Ydieresis -50
+KPX P A -74
+KPX P Aacute -74
+KPX P Abreve -74
+KPX P Acircumflex -74
+KPX P Adieresis -74
+KPX P Agrave -74
+KPX P Amacron -74
+KPX P Aogonek -74
+KPX P Aring -74
+KPX P Atilde -74
+KPX P a -10
+KPX P aacute -10
+KPX P abreve -10
+KPX P acircumflex -10
+KPX P adieresis -10
+KPX P agrave -10
+KPX P amacron -10
+KPX P aogonek -10
+KPX P aring -10
+KPX P atilde -10
+KPX P comma -92
+KPX P e -20
+KPX P eacute -20
+KPX P ecaron -20
+KPX P ecircumflex -20
+KPX P edieresis -20
+KPX P edotaccent -20
+KPX P egrave -20
+KPX P emacron -20
+KPX P eogonek -20
+KPX P o -20
+KPX P oacute -20
+KPX P ocircumflex -20
+KPX P odieresis -20
+KPX P ograve -20
+KPX P ohungarumlaut -20
+KPX P omacron -20
+KPX P oslash -20
+KPX P otilde -20
+KPX P period -110
+KPX Q U -10
+KPX Q Uacute -10
+KPX Q Ucircumflex -10
+KPX Q Udieresis -10
+KPX Q Ugrave -10
+KPX Q Uhungarumlaut -10
+KPX Q Umacron -10
+KPX Q Uogonek -10
+KPX Q Uring -10
+KPX Q period -20
+KPX R O -30
+KPX R Oacute -30
+KPX R Ocircumflex -30
+KPX R Odieresis -30
+KPX R Ograve -30
+KPX R Ohungarumlaut -30
+KPX R Omacron -30
+KPX R Oslash -30
+KPX R Otilde -30
+KPX R T -40
+KPX R Tcaron -40
+KPX R Tcommaaccent -40
+KPX R U -30
+KPX R Uacute -30
+KPX R Ucircumflex -30
+KPX R Udieresis -30
+KPX R Ugrave -30
+KPX R Uhungarumlaut -30
+KPX R Umacron -30
+KPX R Uogonek -30
+KPX R Uring -30
+KPX R V -55
+KPX R W -35
+KPX R Y -35
+KPX R Yacute -35
+KPX R Ydieresis -35
+KPX Racute O -30
+KPX Racute Oacute -30
+KPX Racute Ocircumflex -30
+KPX Racute Odieresis -30
+KPX Racute Ograve -30
+KPX Racute Ohungarumlaut -30
+KPX Racute Omacron -30
+KPX Racute Oslash -30
+KPX Racute Otilde -30
+KPX Racute T -40
+KPX Racute Tcaron -40
+KPX Racute Tcommaaccent -40
+KPX Racute U -30
+KPX Racute Uacute -30
+KPX Racute Ucircumflex -30
+KPX Racute Udieresis -30
+KPX Racute Ugrave -30
+KPX Racute Uhungarumlaut -30
+KPX Racute Umacron -30
+KPX Racute Uogonek -30
+KPX Racute Uring -30
+KPX Racute V -55
+KPX Racute W -35
+KPX Racute Y -35
+KPX Racute Yacute -35
+KPX Racute Ydieresis -35
+KPX Rcaron O -30
+KPX Rcaron Oacute -30
+KPX Rcaron Ocircumflex -30
+KPX Rcaron Odieresis -30
+KPX Rcaron Ograve -30
+KPX Rcaron Ohungarumlaut -30
+KPX Rcaron Omacron -30
+KPX Rcaron Oslash -30
+KPX Rcaron Otilde -30
+KPX Rcaron T -40
+KPX Rcaron Tcaron -40
+KPX Rcaron Tcommaaccent -40
+KPX Rcaron U -30
+KPX Rcaron Uacute -30
+KPX Rcaron Ucircumflex -30
+KPX Rcaron Udieresis -30
+KPX Rcaron Ugrave -30
+KPX Rcaron Uhungarumlaut -30
+KPX Rcaron Umacron -30
+KPX Rcaron Uogonek -30
+KPX Rcaron Uring -30
+KPX Rcaron V -55
+KPX Rcaron W -35
+KPX Rcaron Y -35
+KPX Rcaron Yacute -35
+KPX Rcaron Ydieresis -35
+KPX Rcommaaccent O -30
+KPX Rcommaaccent Oacute -30
+KPX Rcommaaccent Ocircumflex -30
+KPX Rcommaaccent Odieresis -30
+KPX Rcommaaccent Ograve -30
+KPX Rcommaaccent Ohungarumlaut -30
+KPX Rcommaaccent Omacron -30
+KPX Rcommaaccent Oslash -30
+KPX Rcommaaccent Otilde -30
+KPX Rcommaaccent T -40
+KPX Rcommaaccent Tcaron -40
+KPX Rcommaaccent Tcommaaccent -40
+KPX Rcommaaccent U -30
+KPX Rcommaaccent Uacute -30
+KPX Rcommaaccent Ucircumflex -30
+KPX Rcommaaccent Udieresis -30
+KPX Rcommaaccent Ugrave -30
+KPX Rcommaaccent Uhungarumlaut -30
+KPX Rcommaaccent Umacron -30
+KPX Rcommaaccent Uogonek -30
+KPX Rcommaaccent Uring -30
+KPX Rcommaaccent V -55
+KPX Rcommaaccent W -35
+KPX Rcommaaccent Y -35
+KPX Rcommaaccent Yacute -35
+KPX Rcommaaccent Ydieresis -35
+KPX T A -90
+KPX T Aacute -90
+KPX T Abreve -90
+KPX T Acircumflex -90
+KPX T Adieresis -90
+KPX T Agrave -90
+KPX T Amacron -90
+KPX T Aogonek -90
+KPX T Aring -90
+KPX T Atilde -90
+KPX T O -18
+KPX T Oacute -18
+KPX T Ocircumflex -18
+KPX T Odieresis -18
+KPX T Ograve -18
+KPX T Ohungarumlaut -18
+KPX T Omacron -18
+KPX T Oslash -18
+KPX T Otilde -18
+KPX T a -92
+KPX T aacute -92
+KPX T abreve -52
+KPX T acircumflex -52
+KPX T adieresis -52
+KPX T agrave -52
+KPX T amacron -52
+KPX T aogonek -92
+KPX T aring -92
+KPX T atilde -52
+KPX T colon -74
+KPX T comma -74
+KPX T e -92
+KPX T eacute -92
+KPX T ecaron -92
+KPX T ecircumflex -92
+KPX T edieresis -52
+KPX T edotaccent -92
+KPX T egrave -52
+KPX T emacron -52
+KPX T eogonek -92
+KPX T hyphen -92
+KPX T i -18
+KPX T iacute -18
+KPX T iogonek -18
+KPX T o -92
+KPX T oacute -92
+KPX T ocircumflex -92
+KPX T odieresis -92
+KPX T ograve -92
+KPX T ohungarumlaut -92
+KPX T omacron -92
+KPX T oslash -92
+KPX T otilde -92
+KPX T period -90
+KPX T r -74
+KPX T racute -74
+KPX T rcaron -74
+KPX T rcommaaccent -74
+KPX T semicolon -74
+KPX T u -92
+KPX T uacute -92
+KPX T ucircumflex -92
+KPX T udieresis -92
+KPX T ugrave -92
+KPX T uhungarumlaut -92
+KPX T umacron -92
+KPX T uogonek -92
+KPX T uring -92
+KPX T w -74
+KPX T y -34
+KPX T yacute -34
+KPX T ydieresis -34
+KPX Tcaron A -90
+KPX Tcaron Aacute -90
+KPX Tcaron Abreve -90
+KPX Tcaron Acircumflex -90
+KPX Tcaron Adieresis -90
+KPX Tcaron Agrave -90
+KPX Tcaron Amacron -90
+KPX Tcaron Aogonek -90
+KPX Tcaron Aring -90
+KPX Tcaron Atilde -90
+KPX Tcaron O -18
+KPX Tcaron Oacute -18
+KPX Tcaron Ocircumflex -18
+KPX Tcaron Odieresis -18
+KPX Tcaron Ograve -18
+KPX Tcaron Ohungarumlaut -18
+KPX Tcaron Omacron -18
+KPX Tcaron Oslash -18
+KPX Tcaron Otilde -18
+KPX Tcaron a -92
+KPX Tcaron aacute -92
+KPX Tcaron abreve -52
+KPX Tcaron acircumflex -52
+KPX Tcaron adieresis -52
+KPX Tcaron agrave -52
+KPX Tcaron amacron -52
+KPX Tcaron aogonek -92
+KPX Tcaron aring -92
+KPX Tcaron atilde -52
+KPX Tcaron colon -74
+KPX Tcaron comma -74
+KPX Tcaron e -92
+KPX Tcaron eacute -92
+KPX Tcaron ecaron -92
+KPX Tcaron ecircumflex -92
+KPX Tcaron edieresis -52
+KPX Tcaron edotaccent -92
+KPX Tcaron egrave -52
+KPX Tcaron emacron -52
+KPX Tcaron eogonek -92
+KPX Tcaron hyphen -92
+KPX Tcaron i -18
+KPX Tcaron iacute -18
+KPX Tcaron iogonek -18
+KPX Tcaron o -92
+KPX Tcaron oacute -92
+KPX Tcaron ocircumflex -92
+KPX Tcaron odieresis -92
+KPX Tcaron ograve -92
+KPX Tcaron ohungarumlaut -92
+KPX Tcaron omacron -92
+KPX Tcaron oslash -92
+KPX Tcaron otilde -92
+KPX Tcaron period -90
+KPX Tcaron r -74
+KPX Tcaron racute -74
+KPX Tcaron rcaron -74
+KPX Tcaron rcommaaccent -74
+KPX Tcaron semicolon -74
+KPX Tcaron u -92
+KPX Tcaron uacute -92
+KPX Tcaron ucircumflex -92
+KPX Tcaron udieresis -92
+KPX Tcaron ugrave -92
+KPX Tcaron uhungarumlaut -92
+KPX Tcaron umacron -92
+KPX Tcaron uogonek -92
+KPX Tcaron uring -92
+KPX Tcaron w -74
+KPX Tcaron y -34
+KPX Tcaron yacute -34
+KPX Tcaron ydieresis -34
+KPX Tcommaaccent A -90
+KPX Tcommaaccent Aacute -90
+KPX Tcommaaccent Abreve -90
+KPX Tcommaaccent Acircumflex -90
+KPX Tcommaaccent Adieresis -90
+KPX Tcommaaccent Agrave -90
+KPX Tcommaaccent Amacron -90
+KPX Tcommaaccent Aogonek -90
+KPX Tcommaaccent Aring -90
+KPX Tcommaaccent Atilde -90
+KPX Tcommaaccent O -18
+KPX Tcommaaccent Oacute -18
+KPX Tcommaaccent Ocircumflex -18
+KPX Tcommaaccent Odieresis -18
+KPX Tcommaaccent Ograve -18
+KPX Tcommaaccent Ohungarumlaut -18
+KPX Tcommaaccent Omacron -18
+KPX Tcommaaccent Oslash -18
+KPX Tcommaaccent Otilde -18
+KPX Tcommaaccent a -92
+KPX Tcommaaccent aacute -92
+KPX Tcommaaccent abreve -52
+KPX Tcommaaccent acircumflex -52
+KPX Tcommaaccent adieresis -52
+KPX Tcommaaccent agrave -52
+KPX Tcommaaccent amacron -52
+KPX Tcommaaccent aogonek -92
+KPX Tcommaaccent aring -92
+KPX Tcommaaccent atilde -52
+KPX Tcommaaccent colon -74
+KPX Tcommaaccent comma -74
+KPX Tcommaaccent e -92
+KPX Tcommaaccent eacute -92
+KPX Tcommaaccent ecaron -92
+KPX Tcommaaccent ecircumflex -92
+KPX Tcommaaccent edieresis -52
+KPX Tcommaaccent edotaccent -92
+KPX Tcommaaccent egrave -52
+KPX Tcommaaccent emacron -52
+KPX Tcommaaccent eogonek -92
+KPX Tcommaaccent hyphen -92
+KPX Tcommaaccent i -18
+KPX Tcommaaccent iacute -18
+KPX Tcommaaccent iogonek -18
+KPX Tcommaaccent o -92
+KPX Tcommaaccent oacute -92
+KPX Tcommaaccent ocircumflex -92
+KPX Tcommaaccent odieresis -92
+KPX Tcommaaccent ograve -92
+KPX Tcommaaccent ohungarumlaut -92
+KPX Tcommaaccent omacron -92
+KPX Tcommaaccent oslash -92
+KPX Tcommaaccent otilde -92
+KPX Tcommaaccent period -90
+KPX Tcommaaccent r -74
+KPX Tcommaaccent racute -74
+KPX Tcommaaccent rcaron -74
+KPX Tcommaaccent rcommaaccent -74
+KPX Tcommaaccent semicolon -74
+KPX Tcommaaccent u -92
+KPX Tcommaaccent uacute -92
+KPX Tcommaaccent ucircumflex -92
+KPX Tcommaaccent udieresis -92
+KPX Tcommaaccent ugrave -92
+KPX Tcommaaccent uhungarumlaut -92
+KPX Tcommaaccent umacron -92
+KPX Tcommaaccent uogonek -92
+KPX Tcommaaccent uring -92
+KPX Tcommaaccent w -74
+KPX Tcommaaccent y -34
+KPX Tcommaaccent yacute -34
+KPX Tcommaaccent ydieresis -34
+KPX U A -60
+KPX U Aacute -60
+KPX U Abreve -60
+KPX U Acircumflex -60
+KPX U Adieresis -60
+KPX U Agrave -60
+KPX U Amacron -60
+KPX U Aogonek -60
+KPX U Aring -60
+KPX U Atilde -60
+KPX U comma -50
+KPX U period -50
+KPX Uacute A -60
+KPX Uacute Aacute -60
+KPX Uacute Abreve -60
+KPX Uacute Acircumflex -60
+KPX Uacute Adieresis -60
+KPX Uacute Agrave -60
+KPX Uacute Amacron -60
+KPX Uacute Aogonek -60
+KPX Uacute Aring -60
+KPX Uacute Atilde -60
+KPX Uacute comma -50
+KPX Uacute period -50
+KPX Ucircumflex A -60
+KPX Ucircumflex Aacute -60
+KPX Ucircumflex Abreve -60
+KPX Ucircumflex Acircumflex -60
+KPX Ucircumflex Adieresis -60
+KPX Ucircumflex Agrave -60
+KPX Ucircumflex Amacron -60
+KPX Ucircumflex Aogonek -60
+KPX Ucircumflex Aring -60
+KPX Ucircumflex Atilde -60
+KPX Ucircumflex comma -50
+KPX Ucircumflex period -50
+KPX Udieresis A -60
+KPX Udieresis Aacute -60
+KPX Udieresis Abreve -60
+KPX Udieresis Acircumflex -60
+KPX Udieresis Adieresis -60
+KPX Udieresis Agrave -60
+KPX Udieresis Amacron -60
+KPX Udieresis Aogonek -60
+KPX Udieresis Aring -60
+KPX Udieresis Atilde -60
+KPX Udieresis comma -50
+KPX Udieresis period -50
+KPX Ugrave A -60
+KPX Ugrave Aacute -60
+KPX Ugrave Abreve -60
+KPX Ugrave Acircumflex -60
+KPX Ugrave Adieresis -60
+KPX Ugrave Agrave -60
+KPX Ugrave Amacron -60
+KPX Ugrave Aogonek -60
+KPX Ugrave Aring -60
+KPX Ugrave Atilde -60
+KPX Ugrave comma -50
+KPX Ugrave period -50
+KPX Uhungarumlaut A -60
+KPX Uhungarumlaut Aacute -60
+KPX Uhungarumlaut Abreve -60
+KPX Uhungarumlaut Acircumflex -60
+KPX Uhungarumlaut Adieresis -60
+KPX Uhungarumlaut Agrave -60
+KPX Uhungarumlaut Amacron -60
+KPX Uhungarumlaut Aogonek -60
+KPX Uhungarumlaut Aring -60
+KPX Uhungarumlaut Atilde -60
+KPX Uhungarumlaut comma -50
+KPX Uhungarumlaut period -50
+KPX Umacron A -60
+KPX Umacron Aacute -60
+KPX Umacron Abreve -60
+KPX Umacron Acircumflex -60
+KPX Umacron Adieresis -60
+KPX Umacron Agrave -60
+KPX Umacron Amacron -60
+KPX Umacron Aogonek -60
+KPX Umacron Aring -60
+KPX Umacron Atilde -60
+KPX Umacron comma -50
+KPX Umacron period -50
+KPX Uogonek A -60
+KPX Uogonek Aacute -60
+KPX Uogonek Abreve -60
+KPX Uogonek Acircumflex -60
+KPX Uogonek Adieresis -60
+KPX Uogonek Agrave -60
+KPX Uogonek Amacron -60
+KPX Uogonek Aogonek -60
+KPX Uogonek Aring -60
+KPX Uogonek Atilde -60
+KPX Uogonek comma -50
+KPX Uogonek period -50
+KPX Uring A -60
+KPX Uring Aacute -60
+KPX Uring Abreve -60
+KPX Uring Acircumflex -60
+KPX Uring Adieresis -60
+KPX Uring Agrave -60
+KPX Uring Amacron -60
+KPX Uring Aogonek -60
+KPX Uring Aring -60
+KPX Uring Atilde -60
+KPX Uring comma -50
+KPX Uring period -50
+KPX V A -135
+KPX V Aacute -135
+KPX V Abreve -135
+KPX V Acircumflex -135
+KPX V Adieresis -135
+KPX V Agrave -135
+KPX V Amacron -135
+KPX V Aogonek -135
+KPX V Aring -135
+KPX V Atilde -135
+KPX V G -30
+KPX V Gbreve -30
+KPX V Gcommaaccent -30
+KPX V O -45
+KPX V Oacute -45
+KPX V Ocircumflex -45
+KPX V Odieresis -45
+KPX V Ograve -45
+KPX V Ohungarumlaut -45
+KPX V Omacron -45
+KPX V Oslash -45
+KPX V Otilde -45
+KPX V a -92
+KPX V aacute -92
+KPX V abreve -92
+KPX V acircumflex -92
+KPX V adieresis -92
+KPX V agrave -92
+KPX V amacron -92
+KPX V aogonek -92
+KPX V aring -92
+KPX V atilde -92
+KPX V colon -92
+KPX V comma -129
+KPX V e -100
+KPX V eacute -100
+KPX V ecaron -100
+KPX V ecircumflex -100
+KPX V edieresis -100
+KPX V edotaccent -100
+KPX V egrave -100
+KPX V emacron -100
+KPX V eogonek -100
+KPX V hyphen -74
+KPX V i -37
+KPX V iacute -37
+KPX V icircumflex -37
+KPX V idieresis -37
+KPX V igrave -37
+KPX V imacron -37
+KPX V iogonek -37
+KPX V o -100
+KPX V oacute -100
+KPX V ocircumflex -100
+KPX V odieresis -100
+KPX V ograve -100
+KPX V ohungarumlaut -100
+KPX V omacron -100
+KPX V oslash -100
+KPX V otilde -100
+KPX V period -145
+KPX V semicolon -92
+KPX V u -92
+KPX V uacute -92
+KPX V ucircumflex -92
+KPX V udieresis -92
+KPX V ugrave -92
+KPX V uhungarumlaut -92
+KPX V umacron -92
+KPX V uogonek -92
+KPX V uring -92
+KPX W A -120
+KPX W Aacute -120
+KPX W Abreve -120
+KPX W Acircumflex -120
+KPX W Adieresis -120
+KPX W Agrave -120
+KPX W Amacron -120
+KPX W Aogonek -120
+KPX W Aring -120
+KPX W Atilde -120
+KPX W O -10
+KPX W Oacute -10
+KPX W Ocircumflex -10
+KPX W Odieresis -10
+KPX W Ograve -10
+KPX W Ohungarumlaut -10
+KPX W Omacron -10
+KPX W Oslash -10
+KPX W Otilde -10
+KPX W a -65
+KPX W aacute -65
+KPX W abreve -65
+KPX W acircumflex -65
+KPX W adieresis -65
+KPX W agrave -65
+KPX W amacron -65
+KPX W aogonek -65
+KPX W aring -65
+KPX W atilde -65
+KPX W colon -55
+KPX W comma -92
+KPX W e -65
+KPX W eacute -65
+KPX W ecaron -65
+KPX W ecircumflex -65
+KPX W edieresis -65
+KPX W edotaccent -65
+KPX W egrave -65
+KPX W emacron -65
+KPX W eogonek -65
+KPX W hyphen -37
+KPX W i -18
+KPX W iacute -18
+KPX W iogonek -18
+KPX W o -75
+KPX W oacute -75
+KPX W ocircumflex -75
+KPX W odieresis -75
+KPX W ograve -75
+KPX W ohungarumlaut -75
+KPX W omacron -75
+KPX W oslash -75
+KPX W otilde -75
+KPX W period -92
+KPX W semicolon -55
+KPX W u -50
+KPX W uacute -50
+KPX W ucircumflex -50
+KPX W udieresis -50
+KPX W ugrave -50
+KPX W uhungarumlaut -50
+KPX W umacron -50
+KPX W uogonek -50
+KPX W uring -50
+KPX W y -60
+KPX W yacute -60
+KPX W ydieresis -60
+KPX Y A -110
+KPX Y Aacute -110
+KPX Y Abreve -110
+KPX Y Acircumflex -110
+KPX Y Adieresis -110
+KPX Y Agrave -110
+KPX Y Amacron -110
+KPX Y Aogonek -110
+KPX Y Aring -110
+KPX Y Atilde -110
+KPX Y O -35
+KPX Y Oacute -35
+KPX Y Ocircumflex -35
+KPX Y Odieresis -35
+KPX Y Ograve -35
+KPX Y Ohungarumlaut -35
+KPX Y Omacron -35
+KPX Y Oslash -35
+KPX Y Otilde -35
+KPX Y a -85
+KPX Y aacute -85
+KPX Y abreve -85
+KPX Y acircumflex -85
+KPX Y adieresis -85
+KPX Y agrave -85
+KPX Y amacron -85
+KPX Y aogonek -85
+KPX Y aring -85
+KPX Y atilde -85
+KPX Y colon -92
+KPX Y comma -92
+KPX Y e -111
+KPX Y eacute -111
+KPX Y ecaron -111
+KPX Y ecircumflex -111
+KPX Y edieresis -71
+KPX Y edotaccent -111
+KPX Y egrave -71
+KPX Y emacron -71
+KPX Y eogonek -111
+KPX Y hyphen -92
+KPX Y i -37
+KPX Y iacute -37
+KPX Y iogonek -37
+KPX Y o -111
+KPX Y oacute -111
+KPX Y ocircumflex -111
+KPX Y odieresis -111
+KPX Y ograve -111
+KPX Y ohungarumlaut -111
+KPX Y omacron -111
+KPX Y oslash -111
+KPX Y otilde -111
+KPX Y period -92
+KPX Y semicolon -92
+KPX Y u -92
+KPX Y uacute -92
+KPX Y ucircumflex -92
+KPX Y udieresis -92
+KPX Y ugrave -92
+KPX Y uhungarumlaut -92
+KPX Y umacron -92
+KPX Y uogonek -92
+KPX Y uring -92
+KPX Yacute A -110
+KPX Yacute Aacute -110
+KPX Yacute Abreve -110
+KPX Yacute Acircumflex -110
+KPX Yacute Adieresis -110
+KPX Yacute Agrave -110
+KPX Yacute Amacron -110
+KPX Yacute Aogonek -110
+KPX Yacute Aring -110
+KPX Yacute Atilde -110
+KPX Yacute O -35
+KPX Yacute Oacute -35
+KPX Yacute Ocircumflex -35
+KPX Yacute Odieresis -35
+KPX Yacute Ograve -35
+KPX Yacute Ohungarumlaut -35
+KPX Yacute Omacron -35
+KPX Yacute Oslash -35
+KPX Yacute Otilde -35
+KPX Yacute a -85
+KPX Yacute aacute -85
+KPX Yacute abreve -85
+KPX Yacute acircumflex -85
+KPX Yacute adieresis -85
+KPX Yacute agrave -85
+KPX Yacute amacron -85
+KPX Yacute aogonek -85
+KPX Yacute aring -85
+KPX Yacute atilde -85
+KPX Yacute colon -92
+KPX Yacute comma -92
+KPX Yacute e -111
+KPX Yacute eacute -111
+KPX Yacute ecaron -111
+KPX Yacute ecircumflex -111
+KPX Yacute edieresis -71
+KPX Yacute edotaccent -111
+KPX Yacute egrave -71
+KPX Yacute emacron -71
+KPX Yacute eogonek -111
+KPX Yacute hyphen -92
+KPX Yacute i -37
+KPX Yacute iacute -37
+KPX Yacute iogonek -37
+KPX Yacute o -111
+KPX Yacute oacute -111
+KPX Yacute ocircumflex -111
+KPX Yacute odieresis -111
+KPX Yacute ograve -111
+KPX Yacute ohungarumlaut -111
+KPX Yacute omacron -111
+KPX Yacute oslash -111
+KPX Yacute otilde -111
+KPX Yacute period -92
+KPX Yacute semicolon -92
+KPX Yacute u -92
+KPX Yacute uacute -92
+KPX Yacute ucircumflex -92
+KPX Yacute udieresis -92
+KPX Yacute ugrave -92
+KPX Yacute uhungarumlaut -92
+KPX Yacute umacron -92
+KPX Yacute uogonek -92
+KPX Yacute uring -92
+KPX Ydieresis A -110
+KPX Ydieresis Aacute -110
+KPX Ydieresis Abreve -110
+KPX Ydieresis Acircumflex -110
+KPX Ydieresis Adieresis -110
+KPX Ydieresis Agrave -110
+KPX Ydieresis Amacron -110
+KPX Ydieresis Aogonek -110
+KPX Ydieresis Aring -110
+KPX Ydieresis Atilde -110
+KPX Ydieresis O -35
+KPX Ydieresis Oacute -35
+KPX Ydieresis Ocircumflex -35
+KPX Ydieresis Odieresis -35
+KPX Ydieresis Ograve -35
+KPX Ydieresis Ohungarumlaut -35
+KPX Ydieresis Omacron -35
+KPX Ydieresis Oslash -35
+KPX Ydieresis Otilde -35
+KPX Ydieresis a -85
+KPX Ydieresis aacute -85
+KPX Ydieresis abreve -85
+KPX Ydieresis acircumflex -85
+KPX Ydieresis adieresis -85
+KPX Ydieresis agrave -85
+KPX Ydieresis amacron -85
+KPX Ydieresis aogonek -85
+KPX Ydieresis aring -85
+KPX Ydieresis atilde -85
+KPX Ydieresis colon -92
+KPX Ydieresis comma -92
+KPX Ydieresis e -111
+KPX Ydieresis eacute -111
+KPX Ydieresis ecaron -111
+KPX Ydieresis ecircumflex -111
+KPX Ydieresis edieresis -71
+KPX Ydieresis edotaccent -111
+KPX Ydieresis egrave -71
+KPX Ydieresis emacron -71
+KPX Ydieresis eogonek -111
+KPX Ydieresis hyphen -92
+KPX Ydieresis i -37
+KPX Ydieresis iacute -37
+KPX Ydieresis iogonek -37
+KPX Ydieresis o -111
+KPX Ydieresis oacute -111
+KPX Ydieresis ocircumflex -111
+KPX Ydieresis odieresis -111
+KPX Ydieresis ograve -111
+KPX Ydieresis ohungarumlaut -111
+KPX Ydieresis omacron -111
+KPX Ydieresis oslash -111
+KPX Ydieresis otilde -111
+KPX Ydieresis period -92
+KPX Ydieresis semicolon -92
+KPX Ydieresis u -92
+KPX Ydieresis uacute -92
+KPX Ydieresis ucircumflex -92
+KPX Ydieresis udieresis -92
+KPX Ydieresis ugrave -92
+KPX Ydieresis uhungarumlaut -92
+KPX Ydieresis umacron -92
+KPX Ydieresis uogonek -92
+KPX Ydieresis uring -92
+KPX a v -25
+KPX aacute v -25
+KPX abreve v -25
+KPX acircumflex v -25
+KPX adieresis v -25
+KPX agrave v -25
+KPX amacron v -25
+KPX aogonek v -25
+KPX aring v -25
+KPX atilde v -25
+KPX b b -10
+KPX b period -40
+KPX b u -20
+KPX b uacute -20
+KPX b ucircumflex -20
+KPX b udieresis -20
+KPX b ugrave -20
+KPX b uhungarumlaut -20
+KPX b umacron -20
+KPX b uogonek -20
+KPX b uring -20
+KPX b v -15
+KPX comma quotedblright -45
+KPX comma quoteright -55
+KPX d w -15
+KPX dcroat w -15
+KPX e v -15
+KPX eacute v -15
+KPX ecaron v -15
+KPX ecircumflex v -15
+KPX edieresis v -15
+KPX edotaccent v -15
+KPX egrave v -15
+KPX emacron v -15
+KPX eogonek v -15
+KPX f comma -15
+KPX f dotlessi -35
+KPX f i -25
+KPX f o -25
+KPX f oacute -25
+KPX f ocircumflex -25
+KPX f odieresis -25
+KPX f ograve -25
+KPX f ohungarumlaut -25
+KPX f omacron -25
+KPX f oslash -25
+KPX f otilde -25
+KPX f period -15
+KPX f quotedblright 50
+KPX f quoteright 55
+KPX g period -15
+KPX gbreve period -15
+KPX gcommaaccent period -15
+KPX h y -15
+KPX h yacute -15
+KPX h ydieresis -15
+KPX i v -10
+KPX iacute v -10
+KPX icircumflex v -10
+KPX idieresis v -10
+KPX igrave v -10
+KPX imacron v -10
+KPX iogonek v -10
+KPX k e -10
+KPX k eacute -10
+KPX k ecaron -10
+KPX k ecircumflex -10
+KPX k edieresis -10
+KPX k edotaccent -10
+KPX k egrave -10
+KPX k emacron -10
+KPX k eogonek -10
+KPX k o -15
+KPX k oacute -15
+KPX k ocircumflex -15
+KPX k odieresis -15
+KPX k ograve -15
+KPX k ohungarumlaut -15
+KPX k omacron -15
+KPX k oslash -15
+KPX k otilde -15
+KPX k y -15
+KPX k yacute -15
+KPX k ydieresis -15
+KPX kcommaaccent e -10
+KPX kcommaaccent eacute -10
+KPX kcommaaccent ecaron -10
+KPX kcommaaccent ecircumflex -10
+KPX kcommaaccent edieresis -10
+KPX kcommaaccent edotaccent -10
+KPX kcommaaccent egrave -10
+KPX kcommaaccent emacron -10
+KPX kcommaaccent eogonek -10
+KPX kcommaaccent o -15
+KPX kcommaaccent oacute -15
+KPX kcommaaccent ocircumflex -15
+KPX kcommaaccent odieresis -15
+KPX kcommaaccent ograve -15
+KPX kcommaaccent ohungarumlaut -15
+KPX kcommaaccent omacron -15
+KPX kcommaaccent oslash -15
+KPX kcommaaccent otilde -15
+KPX kcommaaccent y -15
+KPX kcommaaccent yacute -15
+KPX kcommaaccent ydieresis -15
+KPX n v -40
+KPX nacute v -40
+KPX ncaron v -40
+KPX ncommaaccent v -40
+KPX ntilde v -40
+KPX o v -10
+KPX o w -10
+KPX oacute v -10
+KPX oacute w -10
+KPX ocircumflex v -10
+KPX ocircumflex w -10
+KPX odieresis v -10
+KPX odieresis w -10
+KPX ograve v -10
+KPX ograve w -10
+KPX ohungarumlaut v -10
+KPX ohungarumlaut w -10
+KPX omacron v -10
+KPX omacron w -10
+KPX oslash v -10
+KPX oslash w -10
+KPX otilde v -10
+KPX otilde w -10
+KPX period quotedblright -55
+KPX period quoteright -55
+KPX quotedblleft A -10
+KPX quotedblleft Aacute -10
+KPX quotedblleft Abreve -10
+KPX quotedblleft Acircumflex -10
+KPX quotedblleft Adieresis -10
+KPX quotedblleft Agrave -10
+KPX quotedblleft Amacron -10
+KPX quotedblleft Aogonek -10
+KPX quotedblleft Aring -10
+KPX quotedblleft Atilde -10
+KPX quoteleft A -10
+KPX quoteleft Aacute -10
+KPX quoteleft Abreve -10
+KPX quoteleft Acircumflex -10
+KPX quoteleft Adieresis -10
+KPX quoteleft Agrave -10
+KPX quoteleft Amacron -10
+KPX quoteleft Aogonek -10
+KPX quoteleft Aring -10
+KPX quoteleft Atilde -10
+KPX quoteleft quoteleft -63
+KPX quoteright d -20
+KPX quoteright dcroat -20
+KPX quoteright quoteright -63
+KPX quoteright r -20
+KPX quoteright racute -20
+KPX quoteright rcaron -20
+KPX quoteright rcommaaccent -20
+KPX quoteright s -37
+KPX quoteright sacute -37
+KPX quoteright scaron -37
+KPX quoteright scedilla -37
+KPX quoteright scommaaccent -37
+KPX quoteright space -74
+KPX quoteright v -20
+KPX r c -18
+KPX r cacute -18
+KPX r ccaron -18
+KPX r ccedilla -18
+KPX r comma -92
+KPX r e -18
+KPX r eacute -18
+KPX r ecaron -18
+KPX r ecircumflex -18
+KPX r edieresis -18
+KPX r edotaccent -18
+KPX r egrave -18
+KPX r emacron -18
+KPX r eogonek -18
+KPX r g -10
+KPX r gbreve -10
+KPX r gcommaaccent -10
+KPX r hyphen -37
+KPX r n -15
+KPX r nacute -15
+KPX r ncaron -15
+KPX r ncommaaccent -15
+KPX r ntilde -15
+KPX r o -18
+KPX r oacute -18
+KPX r ocircumflex -18
+KPX r odieresis -18
+KPX r ograve -18
+KPX r ohungarumlaut -18
+KPX r omacron -18
+KPX r oslash -18
+KPX r otilde -18
+KPX r p -10
+KPX r period -100
+KPX r q -18
+KPX r v -10
+KPX racute c -18
+KPX racute cacute -18
+KPX racute ccaron -18
+KPX racute ccedilla -18
+KPX racute comma -92
+KPX racute e -18
+KPX racute eacute -18
+KPX racute ecaron -18
+KPX racute ecircumflex -18
+KPX racute edieresis -18
+KPX racute edotaccent -18
+KPX racute egrave -18
+KPX racute emacron -18
+KPX racute eogonek -18
+KPX racute g -10
+KPX racute gbreve -10
+KPX racute gcommaaccent -10
+KPX racute hyphen -37
+KPX racute n -15
+KPX racute nacute -15
+KPX racute ncaron -15
+KPX racute ncommaaccent -15
+KPX racute ntilde -15
+KPX racute o -18
+KPX racute oacute -18
+KPX racute ocircumflex -18
+KPX racute odieresis -18
+KPX racute ograve -18
+KPX racute ohungarumlaut -18
+KPX racute omacron -18
+KPX racute oslash -18
+KPX racute otilde -18
+KPX racute p -10
+KPX racute period -100
+KPX racute q -18
+KPX racute v -10
+KPX rcaron c -18
+KPX rcaron cacute -18
+KPX rcaron ccaron -18
+KPX rcaron ccedilla -18
+KPX rcaron comma -92
+KPX rcaron e -18
+KPX rcaron eacute -18
+KPX rcaron ecaron -18
+KPX rcaron ecircumflex -18
+KPX rcaron edieresis -18
+KPX rcaron edotaccent -18
+KPX rcaron egrave -18
+KPX rcaron emacron -18
+KPX rcaron eogonek -18
+KPX rcaron g -10
+KPX rcaron gbreve -10
+KPX rcaron gcommaaccent -10
+KPX rcaron hyphen -37
+KPX rcaron n -15
+KPX rcaron nacute -15
+KPX rcaron ncaron -15
+KPX rcaron ncommaaccent -15
+KPX rcaron ntilde -15
+KPX rcaron o -18
+KPX rcaron oacute -18
+KPX rcaron ocircumflex -18
+KPX rcaron odieresis -18
+KPX rcaron ograve -18
+KPX rcaron ohungarumlaut -18
+KPX rcaron omacron -18
+KPX rcaron oslash -18
+KPX rcaron otilde -18
+KPX rcaron p -10
+KPX rcaron period -100
+KPX rcaron q -18
+KPX rcaron v -10
+KPX rcommaaccent c -18
+KPX rcommaaccent cacute -18
+KPX rcommaaccent ccaron -18
+KPX rcommaaccent ccedilla -18
+KPX rcommaaccent comma -92
+KPX rcommaaccent e -18
+KPX rcommaaccent eacute -18
+KPX rcommaaccent ecaron -18
+KPX rcommaaccent ecircumflex -18
+KPX rcommaaccent edieresis -18
+KPX rcommaaccent edotaccent -18
+KPX rcommaaccent egrave -18
+KPX rcommaaccent emacron -18
+KPX rcommaaccent eogonek -18
+KPX rcommaaccent g -10
+KPX rcommaaccent gbreve -10
+KPX rcommaaccent gcommaaccent -10
+KPX rcommaaccent hyphen -37
+KPX rcommaaccent n -15
+KPX rcommaaccent nacute -15
+KPX rcommaaccent ncaron -15
+KPX rcommaaccent ncommaaccent -15
+KPX rcommaaccent ntilde -15
+KPX rcommaaccent o -18
+KPX rcommaaccent oacute -18
+KPX rcommaaccent ocircumflex -18
+KPX rcommaaccent odieresis -18
+KPX rcommaaccent ograve -18
+KPX rcommaaccent ohungarumlaut -18
+KPX rcommaaccent omacron -18
+KPX rcommaaccent oslash -18
+KPX rcommaaccent otilde -18
+KPX rcommaaccent p -10
+KPX rcommaaccent period -100
+KPX rcommaaccent q -18
+KPX rcommaaccent v -10
+KPX space A -55
+KPX space Aacute -55
+KPX space Abreve -55
+KPX space Acircumflex -55
+KPX space Adieresis -55
+KPX space Agrave -55
+KPX space Amacron -55
+KPX space Aogonek -55
+KPX space Aring -55
+KPX space Atilde -55
+KPX space T -30
+KPX space Tcaron -30
+KPX space Tcommaaccent -30
+KPX space V -45
+KPX space W -30
+KPX space Y -55
+KPX space Yacute -55
+KPX space Ydieresis -55
+KPX v a -10
+KPX v aacute -10
+KPX v abreve -10
+KPX v acircumflex -10
+KPX v adieresis -10
+KPX v agrave -10
+KPX v amacron -10
+KPX v aogonek -10
+KPX v aring -10
+KPX v atilde -10
+KPX v comma -55
+KPX v e -10
+KPX v eacute -10
+KPX v ecaron -10
+KPX v ecircumflex -10
+KPX v edieresis -10
+KPX v edotaccent -10
+KPX v egrave -10
+KPX v emacron -10
+KPX v eogonek -10
+KPX v o -10
+KPX v oacute -10
+KPX v ocircumflex -10
+KPX v odieresis -10
+KPX v ograve -10
+KPX v ohungarumlaut -10
+KPX v omacron -10
+KPX v oslash -10
+KPX v otilde -10
+KPX v period -70
+KPX w comma -55
+KPX w o -10
+KPX w oacute -10
+KPX w ocircumflex -10
+KPX w odieresis -10
+KPX w ograve -10
+KPX w ohungarumlaut -10
+KPX w omacron -10
+KPX w oslash -10
+KPX w otilde -10
+KPX w period -70
+KPX y comma -55
+KPX y e -10
+KPX y eacute -10
+KPX y ecaron -10
+KPX y ecircumflex -10
+KPX y edieresis -10
+KPX y edotaccent -10
+KPX y egrave -10
+KPX y emacron -10
+KPX y eogonek -10
+KPX y o -25
+KPX y oacute -25
+KPX y ocircumflex -25
+KPX y odieresis -25
+KPX y ograve -25
+KPX y ohungarumlaut -25
+KPX y omacron -25
+KPX y oslash -25
+KPX y otilde -25
+KPX y period -70
+KPX yacute comma -55
+KPX yacute e -10
+KPX yacute eacute -10
+KPX yacute ecaron -10
+KPX yacute ecircumflex -10
+KPX yacute edieresis -10
+KPX yacute edotaccent -10
+KPX yacute egrave -10
+KPX yacute emacron -10
+KPX yacute eogonek -10
+KPX yacute o -25
+KPX yacute oacute -25
+KPX yacute ocircumflex -25
+KPX yacute odieresis -25
+KPX yacute ograve -25
+KPX yacute ohungarumlaut -25
+KPX yacute omacron -25
+KPX yacute oslash -25
+KPX yacute otilde -25
+KPX yacute period -70
+KPX ydieresis comma -55
+KPX ydieresis e -10
+KPX ydieresis eacute -10
+KPX ydieresis ecaron -10
+KPX ydieresis ecircumflex -10
+KPX ydieresis edieresis -10
+KPX ydieresis edotaccent -10
+KPX ydieresis egrave -10
+KPX ydieresis emacron -10
+KPX ydieresis eogonek -10
+KPX ydieresis o -25
+KPX ydieresis oacute -25
+KPX ydieresis ocircumflex -25
+KPX ydieresis odieresis -25
+KPX ydieresis ograve -25
+KPX ydieresis ohungarumlaut -25
+KPX ydieresis omacron -25
+KPX ydieresis oslash -25
+KPX ydieresis otilde -25
+KPX ydieresis period -70
+EndKernPairs
+EndKernData
+EndFontMetrics
diff --git a/src/main/resources/Resources/afm/Times-BoldItalic.afm b/src/main/resources/Resources/afm/Times-BoldItalic.afm
new file mode 100644
index 0000000..6da5178
--- /dev/null
+++ b/src/main/resources/Resources/afm/Times-BoldItalic.afm
@@ -0,0 +1,2384 @@
+StartFontMetrics 4.1
+Comment Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.
+Comment Creation Date: Thu May 1 13:04:06 1997
+Comment UniqueID 43066
+Comment VMusage 45874 56899
+FontName Times-BoldItalic
+FullName Times Bold Italic
+FamilyName Times
+Weight Bold
+ItalicAngle -15
+IsFixedPitch false
+CharacterSet ExtendedRoman
+FontBBox -200 -218 996 921
+UnderlinePosition -100
+UnderlineThickness 50
+Version 002.000
+Notice Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.Times is a trademark of Linotype-Hell AG and/or its subsidiaries.
+EncodingScheme AdobeStandardEncoding
+CapHeight 669
+XHeight 462
+Ascender 683
+Descender -217
+StdHW 42
+StdVW 121
+StartCharMetrics 315
+C 32 ; WX 250 ; N space ; B 0 0 0 0 ;
+C 33 ; WX 389 ; N exclam ; B 67 -13 370 684 ;
+C 34 ; WX 555 ; N quotedbl ; B 136 398 536 685 ;
+C 35 ; WX 500 ; N numbersign ; B -33 0 533 700 ;
+C 36 ; WX 500 ; N dollar ; B -20 -100 497 733 ;
+C 37 ; WX 833 ; N percent ; B 39 -10 793 692 ;
+C 38 ; WX 778 ; N ampersand ; B 5 -19 699 682 ;
+C 39 ; WX 333 ; N quoteright ; B 98 369 302 685 ;
+C 40 ; WX 333 ; N parenleft ; B 28 -179 344 685 ;
+C 41 ; WX 333 ; N parenright ; B -44 -179 271 685 ;
+C 42 ; WX 500 ; N asterisk ; B 65 249 456 685 ;
+C 43 ; WX 570 ; N plus ; B 33 0 537 506 ;
+C 44 ; WX 250 ; N comma ; B -60 -182 144 134 ;
+C 45 ; WX 333 ; N hyphen ; B 2 166 271 282 ;
+C 46 ; WX 250 ; N period ; B -9 -13 139 135 ;
+C 47 ; WX 278 ; N slash ; B -64 -18 342 685 ;
+C 48 ; WX 500 ; N zero ; B 17 -14 477 683 ;
+C 49 ; WX 500 ; N one ; B 5 0 419 683 ;
+C 50 ; WX 500 ; N two ; B -27 0 446 683 ;
+C 51 ; WX 500 ; N three ; B -15 -13 450 683 ;
+C 52 ; WX 500 ; N four ; B -15 0 503 683 ;
+C 53 ; WX 500 ; N five ; B -11 -13 487 669 ;
+C 54 ; WX 500 ; N six ; B 23 -15 509 679 ;
+C 55 ; WX 500 ; N seven ; B 52 0 525 669 ;
+C 56 ; WX 500 ; N eight ; B 3 -13 476 683 ;
+C 57 ; WX 500 ; N nine ; B -12 -10 475 683 ;
+C 58 ; WX 333 ; N colon ; B 23 -13 264 459 ;
+C 59 ; WX 333 ; N semicolon ; B -25 -183 264 459 ;
+C 60 ; WX 570 ; N less ; B 31 -8 539 514 ;
+C 61 ; WX 570 ; N equal ; B 33 107 537 399 ;
+C 62 ; WX 570 ; N greater ; B 31 -8 539 514 ;
+C 63 ; WX 500 ; N question ; B 79 -13 470 684 ;
+C 64 ; WX 832 ; N at ; B 63 -18 770 685 ;
+C 65 ; WX 667 ; N A ; B -67 0 593 683 ;
+C 66 ; WX 667 ; N B ; B -24 0 624 669 ;
+C 67 ; WX 667 ; N C ; B 32 -18 677 685 ;
+C 68 ; WX 722 ; N D ; B -46 0 685 669 ;
+C 69 ; WX 667 ; N E ; B -27 0 653 669 ;
+C 70 ; WX 667 ; N F ; B -13 0 660 669 ;
+C 71 ; WX 722 ; N G ; B 21 -18 706 685 ;
+C 72 ; WX 778 ; N H ; B -24 0 799 669 ;
+C 73 ; WX 389 ; N I ; B -32 0 406 669 ;
+C 74 ; WX 500 ; N J ; B -46 -99 524 669 ;
+C 75 ; WX 667 ; N K ; B -21 0 702 669 ;
+C 76 ; WX 611 ; N L ; B -22 0 590 669 ;
+C 77 ; WX 889 ; N M ; B -29 -12 917 669 ;
+C 78 ; WX 722 ; N N ; B -27 -15 748 669 ;
+C 79 ; WX 722 ; N O ; B 27 -18 691 685 ;
+C 80 ; WX 611 ; N P ; B -27 0 613 669 ;
+C 81 ; WX 722 ; N Q ; B 27 -208 691 685 ;
+C 82 ; WX 667 ; N R ; B -29 0 623 669 ;
+C 83 ; WX 556 ; N S ; B 2 -18 526 685 ;
+C 84 ; WX 611 ; N T ; B 50 0 650 669 ;
+C 85 ; WX 722 ; N U ; B 67 -18 744 669 ;
+C 86 ; WX 667 ; N V ; B 65 -18 715 669 ;
+C 87 ; WX 889 ; N W ; B 65 -18 940 669 ;
+C 88 ; WX 667 ; N X ; B -24 0 694 669 ;
+C 89 ; WX 611 ; N Y ; B 73 0 659 669 ;
+C 90 ; WX 611 ; N Z ; B -11 0 590 669 ;
+C 91 ; WX 333 ; N bracketleft ; B -37 -159 362 674 ;
+C 92 ; WX 278 ; N backslash ; B -1 -18 279 685 ;
+C 93 ; WX 333 ; N bracketright ; B -56 -157 343 674 ;
+C 94 ; WX 570 ; N asciicircum ; B 67 304 503 669 ;
+C 95 ; WX 500 ; N underscore ; B 0 -125 500 -75 ;
+C 96 ; WX 333 ; N quoteleft ; B 128 369 332 685 ;
+C 97 ; WX 500 ; N a ; B -21 -14 455 462 ;
+C 98 ; WX 500 ; N b ; B -14 -13 444 699 ;
+C 99 ; WX 444 ; N c ; B -5 -13 392 462 ;
+C 100 ; WX 500 ; N d ; B -21 -13 517 699 ;
+C 101 ; WX 444 ; N e ; B 5 -13 398 462 ;
+C 102 ; WX 333 ; N f ; B -169 -205 446 698 ; L i fi ; L l fl ;
+C 103 ; WX 500 ; N g ; B -52 -203 478 462 ;
+C 104 ; WX 556 ; N h ; B -13 -9 498 699 ;
+C 105 ; WX 278 ; N i ; B 2 -9 263 684 ;
+C 106 ; WX 278 ; N j ; B -189 -207 279 684 ;
+C 107 ; WX 500 ; N k ; B -23 -8 483 699 ;
+C 108 ; WX 278 ; N l ; B 2 -9 290 699 ;
+C 109 ; WX 778 ; N m ; B -14 -9 722 462 ;
+C 110 ; WX 556 ; N n ; B -6 -9 493 462 ;
+C 111 ; WX 500 ; N o ; B -3 -13 441 462 ;
+C 112 ; WX 500 ; N p ; B -120 -205 446 462 ;
+C 113 ; WX 500 ; N q ; B 1 -205 471 462 ;
+C 114 ; WX 389 ; N r ; B -21 0 389 462 ;
+C 115 ; WX 389 ; N s ; B -19 -13 333 462 ;
+C 116 ; WX 278 ; N t ; B -11 -9 281 594 ;
+C 117 ; WX 556 ; N u ; B 15 -9 492 462 ;
+C 118 ; WX 444 ; N v ; B 16 -13 401 462 ;
+C 119 ; WX 667 ; N w ; B 16 -13 614 462 ;
+C 120 ; WX 500 ; N x ; B -46 -13 469 462 ;
+C 121 ; WX 444 ; N y ; B -94 -205 392 462 ;
+C 122 ; WX 389 ; N z ; B -43 -78 368 449 ;
+C 123 ; WX 348 ; N braceleft ; B 5 -187 436 686 ;
+C 124 ; WX 220 ; N bar ; B 66 -218 154 782 ;
+C 125 ; WX 348 ; N braceright ; B -129 -187 302 686 ;
+C 126 ; WX 570 ; N asciitilde ; B 54 173 516 333 ;
+C 161 ; WX 389 ; N exclamdown ; B 19 -205 322 492 ;
+C 162 ; WX 500 ; N cent ; B 42 -143 439 576 ;
+C 163 ; WX 500 ; N sterling ; B -32 -12 510 683 ;
+C 164 ; WX 167 ; N fraction ; B -169 -14 324 683 ;
+C 165 ; WX 500 ; N yen ; B 33 0 628 669 ;
+C 166 ; WX 500 ; N florin ; B -87 -156 537 707 ;
+C 167 ; WX 500 ; N section ; B 36 -143 459 685 ;
+C 168 ; WX 500 ; N currency ; B -26 34 526 586 ;
+C 169 ; WX 278 ; N quotesingle ; B 128 398 268 685 ;
+C 170 ; WX 500 ; N quotedblleft ; B 53 369 513 685 ;
+C 171 ; WX 500 ; N guillemotleft ; B 12 32 468 415 ;
+C 172 ; WX 333 ; N guilsinglleft ; B 32 32 303 415 ;
+C 173 ; WX 333 ; N guilsinglright ; B 10 32 281 415 ;
+C 174 ; WX 556 ; N fi ; B -188 -205 514 703 ;
+C 175 ; WX 556 ; N fl ; B -186 -205 553 704 ;
+C 177 ; WX 500 ; N endash ; B -40 178 477 269 ;
+C 178 ; WX 500 ; N dagger ; B 91 -145 494 685 ;
+C 179 ; WX 500 ; N daggerdbl ; B 10 -139 493 685 ;
+C 180 ; WX 250 ; N periodcentered ; B 51 257 199 405 ;
+C 182 ; WX 500 ; N paragraph ; B -57 -193 562 669 ;
+C 183 ; WX 350 ; N bullet ; B 0 175 350 525 ;
+C 184 ; WX 333 ; N quotesinglbase ; B -5 -182 199 134 ;
+C 185 ; WX 500 ; N quotedblbase ; B -57 -182 403 134 ;
+C 186 ; WX 500 ; N quotedblright ; B 53 369 513 685 ;
+C 187 ; WX 500 ; N guillemotright ; B 12 32 468 415 ;
+C 188 ; WX 1000 ; N ellipsis ; B 40 -13 852 135 ;
+C 189 ; WX 1000 ; N perthousand ; B 7 -29 996 706 ;
+C 191 ; WX 500 ; N questiondown ; B 30 -205 421 492 ;
+C 193 ; WX 333 ; N grave ; B 85 516 297 697 ;
+C 194 ; WX 333 ; N acute ; B 139 516 379 697 ;
+C 195 ; WX 333 ; N circumflex ; B 40 516 367 690 ;
+C 196 ; WX 333 ; N tilde ; B 48 536 407 655 ;
+C 197 ; WX 333 ; N macron ; B 51 553 393 623 ;
+C 198 ; WX 333 ; N breve ; B 71 516 387 678 ;
+C 199 ; WX 333 ; N dotaccent ; B 163 550 298 684 ;
+C 200 ; WX 333 ; N dieresis ; B 55 550 402 684 ;
+C 202 ; WX 333 ; N ring ; B 127 516 340 729 ;
+C 203 ; WX 333 ; N cedilla ; B -80 -218 156 5 ;
+C 205 ; WX 333 ; N hungarumlaut ; B 69 516 498 697 ;
+C 206 ; WX 333 ; N ogonek ; B 15 -183 244 34 ;
+C 207 ; WX 333 ; N caron ; B 79 516 411 690 ;
+C 208 ; WX 1000 ; N emdash ; B -40 178 977 269 ;
+C 225 ; WX 944 ; N AE ; B -64 0 918 669 ;
+C 227 ; WX 266 ; N ordfeminine ; B 16 399 330 685 ;
+C 232 ; WX 611 ; N Lslash ; B -22 0 590 669 ;
+C 233 ; WX 722 ; N Oslash ; B 27 -125 691 764 ;
+C 234 ; WX 944 ; N OE ; B 23 -8 946 677 ;
+C 235 ; WX 300 ; N ordmasculine ; B 56 400 347 685 ;
+C 241 ; WX 722 ; N ae ; B -5 -13 673 462 ;
+C 245 ; WX 278 ; N dotlessi ; B 2 -9 238 462 ;
+C 248 ; WX 278 ; N lslash ; B -7 -9 307 699 ;
+C 249 ; WX 500 ; N oslash ; B -3 -119 441 560 ;
+C 250 ; WX 722 ; N oe ; B 6 -13 674 462 ;
+C 251 ; WX 500 ; N germandbls ; B -200 -200 473 705 ;
+C -1 ; WX 389 ; N Idieresis ; B -32 0 450 862 ;
+C -1 ; WX 444 ; N eacute ; B 5 -13 435 697 ;
+C -1 ; WX 500 ; N abreve ; B -21 -14 471 678 ;
+C -1 ; WX 556 ; N uhungarumlaut ; B 15 -9 610 697 ;
+C -1 ; WX 444 ; N ecaron ; B 5 -13 467 690 ;
+C -1 ; WX 611 ; N Ydieresis ; B 73 0 659 862 ;
+C -1 ; WX 570 ; N divide ; B 33 -29 537 535 ;
+C -1 ; WX 611 ; N Yacute ; B 73 0 659 904 ;
+C -1 ; WX 667 ; N Acircumflex ; B -67 0 593 897 ;
+C -1 ; WX 500 ; N aacute ; B -21 -14 463 697 ;
+C -1 ; WX 722 ; N Ucircumflex ; B 67 -18 744 897 ;
+C -1 ; WX 444 ; N yacute ; B -94 -205 435 697 ;
+C -1 ; WX 389 ; N scommaaccent ; B -19 -218 333 462 ;
+C -1 ; WX 444 ; N ecircumflex ; B 5 -13 423 690 ;
+C -1 ; WX 722 ; N Uring ; B 67 -18 744 921 ;
+C -1 ; WX 722 ; N Udieresis ; B 67 -18 744 862 ;
+C -1 ; WX 500 ; N aogonek ; B -21 -183 455 462 ;
+C -1 ; WX 722 ; N Uacute ; B 67 -18 744 904 ;
+C -1 ; WX 556 ; N uogonek ; B 15 -183 492 462 ;
+C -1 ; WX 667 ; N Edieresis ; B -27 0 653 862 ;
+C -1 ; WX 722 ; N Dcroat ; B -31 0 700 669 ;
+C -1 ; WX 250 ; N commaaccent ; B -36 -218 131 -50 ;
+C -1 ; WX 747 ; N copyright ; B 30 -18 718 685 ;
+C -1 ; WX 667 ; N Emacron ; B -27 0 653 830 ;
+C -1 ; WX 444 ; N ccaron ; B -5 -13 467 690 ;
+C -1 ; WX 500 ; N aring ; B -21 -14 455 729 ;
+C -1 ; WX 722 ; N Ncommaaccent ; B -27 -218 748 669 ;
+C -1 ; WX 278 ; N lacute ; B 2 -9 392 904 ;
+C -1 ; WX 500 ; N agrave ; B -21 -14 455 697 ;
+C -1 ; WX 611 ; N Tcommaaccent ; B 50 -218 650 669 ;
+C -1 ; WX 667 ; N Cacute ; B 32 -18 677 904 ;
+C -1 ; WX 500 ; N atilde ; B -21 -14 491 655 ;
+C -1 ; WX 667 ; N Edotaccent ; B -27 0 653 862 ;
+C -1 ; WX 389 ; N scaron ; B -19 -13 424 690 ;
+C -1 ; WX 389 ; N scedilla ; B -19 -218 333 462 ;
+C -1 ; WX 278 ; N iacute ; B 2 -9 352 697 ;
+C -1 ; WX 494 ; N lozenge ; B 10 0 484 745 ;
+C -1 ; WX 667 ; N Rcaron ; B -29 0 623 897 ;
+C -1 ; WX 722 ; N Gcommaaccent ; B 21 -218 706 685 ;
+C -1 ; WX 556 ; N ucircumflex ; B 15 -9 492 690 ;
+C -1 ; WX 500 ; N acircumflex ; B -21 -14 455 690 ;
+C -1 ; WX 667 ; N Amacron ; B -67 0 593 830 ;
+C -1 ; WX 389 ; N rcaron ; B -21 0 424 690 ;
+C -1 ; WX 444 ; N ccedilla ; B -5 -218 392 462 ;
+C -1 ; WX 611 ; N Zdotaccent ; B -11 0 590 862 ;
+C -1 ; WX 611 ; N Thorn ; B -27 0 573 669 ;
+C -1 ; WX 722 ; N Omacron ; B 27 -18 691 830 ;
+C -1 ; WX 667 ; N Racute ; B -29 0 623 904 ;
+C -1 ; WX 556 ; N Sacute ; B 2 -18 531 904 ;
+C -1 ; WX 608 ; N dcaron ; B -21 -13 675 708 ;
+C -1 ; WX 722 ; N Umacron ; B 67 -18 744 830 ;
+C -1 ; WX 556 ; N uring ; B 15 -9 492 729 ;
+C -1 ; WX 300 ; N threesuperior ; B 17 265 321 683 ;
+C -1 ; WX 722 ; N Ograve ; B 27 -18 691 904 ;
+C -1 ; WX 667 ; N Agrave ; B -67 0 593 904 ;
+C -1 ; WX 667 ; N Abreve ; B -67 0 593 885 ;
+C -1 ; WX 570 ; N multiply ; B 48 16 522 490 ;
+C -1 ; WX 556 ; N uacute ; B 15 -9 492 697 ;
+C -1 ; WX 611 ; N Tcaron ; B 50 0 650 897 ;
+C -1 ; WX 494 ; N partialdiff ; B 11 -21 494 750 ;
+C -1 ; WX 444 ; N ydieresis ; B -94 -205 443 655 ;
+C -1 ; WX 722 ; N Nacute ; B -27 -15 748 904 ;
+C -1 ; WX 278 ; N icircumflex ; B -3 -9 324 690 ;
+C -1 ; WX 667 ; N Ecircumflex ; B -27 0 653 897 ;
+C -1 ; WX 500 ; N adieresis ; B -21 -14 476 655 ;
+C -1 ; WX 444 ; N edieresis ; B 5 -13 448 655 ;
+C -1 ; WX 444 ; N cacute ; B -5 -13 435 697 ;
+C -1 ; WX 556 ; N nacute ; B -6 -9 493 697 ;
+C -1 ; WX 556 ; N umacron ; B 15 -9 492 623 ;
+C -1 ; WX 722 ; N Ncaron ; B -27 -15 748 897 ;
+C -1 ; WX 389 ; N Iacute ; B -32 0 432 904 ;
+C -1 ; WX 570 ; N plusminus ; B 33 0 537 506 ;
+C -1 ; WX 220 ; N brokenbar ; B 66 -143 154 707 ;
+C -1 ; WX 747 ; N registered ; B 30 -18 718 685 ;
+C -1 ; WX 722 ; N Gbreve ; B 21 -18 706 885 ;
+C -1 ; WX 389 ; N Idotaccent ; B -32 0 406 862 ;
+C -1 ; WX 600 ; N summation ; B 14 -10 585 706 ;
+C -1 ; WX 667 ; N Egrave ; B -27 0 653 904 ;
+C -1 ; WX 389 ; N racute ; B -21 0 407 697 ;
+C -1 ; WX 500 ; N omacron ; B -3 -13 462 623 ;
+C -1 ; WX 611 ; N Zacute ; B -11 0 590 904 ;
+C -1 ; WX 611 ; N Zcaron ; B -11 0 590 897 ;
+C -1 ; WX 549 ; N greaterequal ; B 26 0 523 704 ;
+C -1 ; WX 722 ; N Eth ; B -31 0 700 669 ;
+C -1 ; WX 667 ; N Ccedilla ; B 32 -218 677 685 ;
+C -1 ; WX 278 ; N lcommaaccent ; B -42 -218 290 699 ;
+C -1 ; WX 366 ; N tcaron ; B -11 -9 434 754 ;
+C -1 ; WX 444 ; N eogonek ; B 5 -183 398 462 ;
+C -1 ; WX 722 ; N Uogonek ; B 67 -183 744 669 ;
+C -1 ; WX 667 ; N Aacute ; B -67 0 593 904 ;
+C -1 ; WX 667 ; N Adieresis ; B -67 0 593 862 ;
+C -1 ; WX 444 ; N egrave ; B 5 -13 398 697 ;
+C -1 ; WX 389 ; N zacute ; B -43 -78 407 697 ;
+C -1 ; WX 278 ; N iogonek ; B -20 -183 263 684 ;
+C -1 ; WX 722 ; N Oacute ; B 27 -18 691 904 ;
+C -1 ; WX 500 ; N oacute ; B -3 -13 463 697 ;
+C -1 ; WX 500 ; N amacron ; B -21 -14 467 623 ;
+C -1 ; WX 389 ; N sacute ; B -19 -13 407 697 ;
+C -1 ; WX 278 ; N idieresis ; B 2 -9 364 655 ;
+C -1 ; WX 722 ; N Ocircumflex ; B 27 -18 691 897 ;
+C -1 ; WX 722 ; N Ugrave ; B 67 -18 744 904 ;
+C -1 ; WX 612 ; N Delta ; B 6 0 608 688 ;
+C -1 ; WX 500 ; N thorn ; B -120 -205 446 699 ;
+C -1 ; WX 300 ; N twosuperior ; B 2 274 313 683 ;
+C -1 ; WX 722 ; N Odieresis ; B 27 -18 691 862 ;
+C -1 ; WX 576 ; N mu ; B -60 -207 516 449 ;
+C -1 ; WX 278 ; N igrave ; B 2 -9 259 697 ;
+C -1 ; WX 500 ; N ohungarumlaut ; B -3 -13 582 697 ;
+C -1 ; WX 667 ; N Eogonek ; B -27 -183 653 669 ;
+C -1 ; WX 500 ; N dcroat ; B -21 -13 552 699 ;
+C -1 ; WX 750 ; N threequarters ; B 7 -14 726 683 ;
+C -1 ; WX 556 ; N Scedilla ; B 2 -218 526 685 ;
+C -1 ; WX 382 ; N lcaron ; B 2 -9 448 708 ;
+C -1 ; WX 667 ; N Kcommaaccent ; B -21 -218 702 669 ;
+C -1 ; WX 611 ; N Lacute ; B -22 0 590 904 ;
+C -1 ; WX 1000 ; N trademark ; B 32 263 968 669 ;
+C -1 ; WX 444 ; N edotaccent ; B 5 -13 398 655 ;
+C -1 ; WX 389 ; N Igrave ; B -32 0 406 904 ;
+C -1 ; WX 389 ; N Imacron ; B -32 0 461 830 ;
+C -1 ; WX 611 ; N Lcaron ; B -22 0 671 718 ;
+C -1 ; WX 750 ; N onehalf ; B -9 -14 723 683 ;
+C -1 ; WX 549 ; N lessequal ; B 29 0 526 704 ;
+C -1 ; WX 500 ; N ocircumflex ; B -3 -13 451 690 ;
+C -1 ; WX 556 ; N ntilde ; B -6 -9 504 655 ;
+C -1 ; WX 722 ; N Uhungarumlaut ; B 67 -18 744 904 ;
+C -1 ; WX 667 ; N Eacute ; B -27 0 653 904 ;
+C -1 ; WX 444 ; N emacron ; B 5 -13 439 623 ;
+C -1 ; WX 500 ; N gbreve ; B -52 -203 478 678 ;
+C -1 ; WX 750 ; N onequarter ; B 7 -14 721 683 ;
+C -1 ; WX 556 ; N Scaron ; B 2 -18 553 897 ;
+C -1 ; WX 556 ; N Scommaaccent ; B 2 -218 526 685 ;
+C -1 ; WX 722 ; N Ohungarumlaut ; B 27 -18 723 904 ;
+C -1 ; WX 400 ; N degree ; B 83 397 369 683 ;
+C -1 ; WX 500 ; N ograve ; B -3 -13 441 697 ;
+C -1 ; WX 667 ; N Ccaron ; B 32 -18 677 897 ;
+C -1 ; WX 556 ; N ugrave ; B 15 -9 492 697 ;
+C -1 ; WX 549 ; N radical ; B 10 -46 512 850 ;
+C -1 ; WX 722 ; N Dcaron ; B -46 0 685 897 ;
+C -1 ; WX 389 ; N rcommaaccent ; B -67 -218 389 462 ;
+C -1 ; WX 722 ; N Ntilde ; B -27 -15 748 862 ;
+C -1 ; WX 500 ; N otilde ; B -3 -13 491 655 ;
+C -1 ; WX 667 ; N Rcommaaccent ; B -29 -218 623 669 ;
+C -1 ; WX 611 ; N Lcommaaccent ; B -22 -218 590 669 ;
+C -1 ; WX 667 ; N Atilde ; B -67 0 593 862 ;
+C -1 ; WX 667 ; N Aogonek ; B -67 -183 604 683 ;
+C -1 ; WX 667 ; N Aring ; B -67 0 593 921 ;
+C -1 ; WX 722 ; N Otilde ; B 27 -18 691 862 ;
+C -1 ; WX 389 ; N zdotaccent ; B -43 -78 368 655 ;
+C -1 ; WX 667 ; N Ecaron ; B -27 0 653 897 ;
+C -1 ; WX 389 ; N Iogonek ; B -32 -183 406 669 ;
+C -1 ; WX 500 ; N kcommaaccent ; B -23 -218 483 699 ;
+C -1 ; WX 606 ; N minus ; B 51 209 555 297 ;
+C -1 ; WX 389 ; N Icircumflex ; B -32 0 450 897 ;
+C -1 ; WX 556 ; N ncaron ; B -6 -9 523 690 ;
+C -1 ; WX 278 ; N tcommaaccent ; B -62 -218 281 594 ;
+C -1 ; WX 606 ; N logicalnot ; B 51 108 555 399 ;
+C -1 ; WX 500 ; N odieresis ; B -3 -13 471 655 ;
+C -1 ; WX 556 ; N udieresis ; B 15 -9 499 655 ;
+C -1 ; WX 549 ; N notequal ; B 15 -49 540 570 ;
+C -1 ; WX 500 ; N gcommaaccent ; B -52 -203 478 767 ;
+C -1 ; WX 500 ; N eth ; B -3 -13 454 699 ;
+C -1 ; WX 389 ; N zcaron ; B -43 -78 424 690 ;
+C -1 ; WX 556 ; N ncommaaccent ; B -6 -218 493 462 ;
+C -1 ; WX 300 ; N onesuperior ; B 30 274 301 683 ;
+C -1 ; WX 278 ; N imacron ; B 2 -9 294 623 ;
+C -1 ; WX 500 ; N Euro ; B 0 0 0 0 ;
+EndCharMetrics
+StartKernData
+StartKernPairs 2038
+KPX A C -65
+KPX A Cacute -65
+KPX A Ccaron -65
+KPX A Ccedilla -65
+KPX A G -60
+KPX A Gbreve -60
+KPX A Gcommaaccent -60
+KPX A O -50
+KPX A Oacute -50
+KPX A Ocircumflex -50
+KPX A Odieresis -50
+KPX A Ograve -50
+KPX A Ohungarumlaut -50
+KPX A Omacron -50
+KPX A Oslash -50
+KPX A Otilde -50
+KPX A Q -55
+KPX A T -55
+KPX A Tcaron -55
+KPX A Tcommaaccent -55
+KPX A U -50
+KPX A Uacute -50
+KPX A Ucircumflex -50
+KPX A Udieresis -50
+KPX A Ugrave -50
+KPX A Uhungarumlaut -50
+KPX A Umacron -50
+KPX A Uogonek -50
+KPX A Uring -50
+KPX A V -95
+KPX A W -100
+KPX A Y -70
+KPX A Yacute -70
+KPX A Ydieresis -70
+KPX A quoteright -74
+KPX A u -30
+KPX A uacute -30
+KPX A ucircumflex -30
+KPX A udieresis -30
+KPX A ugrave -30
+KPX A uhungarumlaut -30
+KPX A umacron -30
+KPX A uogonek -30
+KPX A uring -30
+KPX A v -74
+KPX A w -74
+KPX A y -74
+KPX A yacute -74
+KPX A ydieresis -74
+KPX Aacute C -65
+KPX Aacute Cacute -65
+KPX Aacute Ccaron -65
+KPX Aacute Ccedilla -65
+KPX Aacute G -60
+KPX Aacute Gbreve -60
+KPX Aacute Gcommaaccent -60
+KPX Aacute O -50
+KPX Aacute Oacute -50
+KPX Aacute Ocircumflex -50
+KPX Aacute Odieresis -50
+KPX Aacute Ograve -50
+KPX Aacute Ohungarumlaut -50
+KPX Aacute Omacron -50
+KPX Aacute Oslash -50
+KPX Aacute Otilde -50
+KPX Aacute Q -55
+KPX Aacute T -55
+KPX Aacute Tcaron -55
+KPX Aacute Tcommaaccent -55
+KPX Aacute U -50
+KPX Aacute Uacute -50
+KPX Aacute Ucircumflex -50
+KPX Aacute Udieresis -50
+KPX Aacute Ugrave -50
+KPX Aacute Uhungarumlaut -50
+KPX Aacute Umacron -50
+KPX Aacute Uogonek -50
+KPX Aacute Uring -50
+KPX Aacute V -95
+KPX Aacute W -100
+KPX Aacute Y -70
+KPX Aacute Yacute -70
+KPX Aacute Ydieresis -70
+KPX Aacute quoteright -74
+KPX Aacute u -30
+KPX Aacute uacute -30
+KPX Aacute ucircumflex -30
+KPX Aacute udieresis -30
+KPX Aacute ugrave -30
+KPX Aacute uhungarumlaut -30
+KPX Aacute umacron -30
+KPX Aacute uogonek -30
+KPX Aacute uring -30
+KPX Aacute v -74
+KPX Aacute w -74
+KPX Aacute y -74
+KPX Aacute yacute -74
+KPX Aacute ydieresis -74
+KPX Abreve C -65
+KPX Abreve Cacute -65
+KPX Abreve Ccaron -65
+KPX Abreve Ccedilla -65
+KPX Abreve G -60
+KPX Abreve Gbreve -60
+KPX Abreve Gcommaaccent -60
+KPX Abreve O -50
+KPX Abreve Oacute -50
+KPX Abreve Ocircumflex -50
+KPX Abreve Odieresis -50
+KPX Abreve Ograve -50
+KPX Abreve Ohungarumlaut -50
+KPX Abreve Omacron -50
+KPX Abreve Oslash -50
+KPX Abreve Otilde -50
+KPX Abreve Q -55
+KPX Abreve T -55
+KPX Abreve Tcaron -55
+KPX Abreve Tcommaaccent -55
+KPX Abreve U -50
+KPX Abreve Uacute -50
+KPX Abreve Ucircumflex -50
+KPX Abreve Udieresis -50
+KPX Abreve Ugrave -50
+KPX Abreve Uhungarumlaut -50
+KPX Abreve Umacron -50
+KPX Abreve Uogonek -50
+KPX Abreve Uring -50
+KPX Abreve V -95
+KPX Abreve W -100
+KPX Abreve Y -70
+KPX Abreve Yacute -70
+KPX Abreve Ydieresis -70
+KPX Abreve quoteright -74
+KPX Abreve u -30
+KPX Abreve uacute -30
+KPX Abreve ucircumflex -30
+KPX Abreve udieresis -30
+KPX Abreve ugrave -30
+KPX Abreve uhungarumlaut -30
+KPX Abreve umacron -30
+KPX Abreve uogonek -30
+KPX Abreve uring -30
+KPX Abreve v -74
+KPX Abreve w -74
+KPX Abreve y -74
+KPX Abreve yacute -74
+KPX Abreve ydieresis -74
+KPX Acircumflex C -65
+KPX Acircumflex Cacute -65
+KPX Acircumflex Ccaron -65
+KPX Acircumflex Ccedilla -65
+KPX Acircumflex G -60
+KPX Acircumflex Gbreve -60
+KPX Acircumflex Gcommaaccent -60
+KPX Acircumflex O -50
+KPX Acircumflex Oacute -50
+KPX Acircumflex Ocircumflex -50
+KPX Acircumflex Odieresis -50
+KPX Acircumflex Ograve -50
+KPX Acircumflex Ohungarumlaut -50
+KPX Acircumflex Omacron -50
+KPX Acircumflex Oslash -50
+KPX Acircumflex Otilde -50
+KPX Acircumflex Q -55
+KPX Acircumflex T -55
+KPX Acircumflex Tcaron -55
+KPX Acircumflex Tcommaaccent -55
+KPX Acircumflex U -50
+KPX Acircumflex Uacute -50
+KPX Acircumflex Ucircumflex -50
+KPX Acircumflex Udieresis -50
+KPX Acircumflex Ugrave -50
+KPX Acircumflex Uhungarumlaut -50
+KPX Acircumflex Umacron -50
+KPX Acircumflex Uogonek -50
+KPX Acircumflex Uring -50
+KPX Acircumflex V -95
+KPX Acircumflex W -100
+KPX Acircumflex Y -70
+KPX Acircumflex Yacute -70
+KPX Acircumflex Ydieresis -70
+KPX Acircumflex quoteright -74
+KPX Acircumflex u -30
+KPX Acircumflex uacute -30
+KPX Acircumflex ucircumflex -30
+KPX Acircumflex udieresis -30
+KPX Acircumflex ugrave -30
+KPX Acircumflex uhungarumlaut -30
+KPX Acircumflex umacron -30
+KPX Acircumflex uogonek -30
+KPX Acircumflex uring -30
+KPX Acircumflex v -74
+KPX Acircumflex w -74
+KPX Acircumflex y -74
+KPX Acircumflex yacute -74
+KPX Acircumflex ydieresis -74
+KPX Adieresis C -65
+KPX Adieresis Cacute -65
+KPX Adieresis Ccaron -65
+KPX Adieresis Ccedilla -65
+KPX Adieresis G -60
+KPX Adieresis Gbreve -60
+KPX Adieresis Gcommaaccent -60
+KPX Adieresis O -50
+KPX Adieresis Oacute -50
+KPX Adieresis Ocircumflex -50
+KPX Adieresis Odieresis -50
+KPX Adieresis Ograve -50
+KPX Adieresis Ohungarumlaut -50
+KPX Adieresis Omacron -50
+KPX Adieresis Oslash -50
+KPX Adieresis Otilde -50
+KPX Adieresis Q -55
+KPX Adieresis T -55
+KPX Adieresis Tcaron -55
+KPX Adieresis Tcommaaccent -55
+KPX Adieresis U -50
+KPX Adieresis Uacute -50
+KPX Adieresis Ucircumflex -50
+KPX Adieresis Udieresis -50
+KPX Adieresis Ugrave -50
+KPX Adieresis Uhungarumlaut -50
+KPX Adieresis Umacron -50
+KPX Adieresis Uogonek -50
+KPX Adieresis Uring -50
+KPX Adieresis V -95
+KPX Adieresis W -100
+KPX Adieresis Y -70
+KPX Adieresis Yacute -70
+KPX Adieresis Ydieresis -70
+KPX Adieresis quoteright -74
+KPX Adieresis u -30
+KPX Adieresis uacute -30
+KPX Adieresis ucircumflex -30
+KPX Adieresis udieresis -30
+KPX Adieresis ugrave -30
+KPX Adieresis uhungarumlaut -30
+KPX Adieresis umacron -30
+KPX Adieresis uogonek -30
+KPX Adieresis uring -30
+KPX Adieresis v -74
+KPX Adieresis w -74
+KPX Adieresis y -74
+KPX Adieresis yacute -74
+KPX Adieresis ydieresis -74
+KPX Agrave C -65
+KPX Agrave Cacute -65
+KPX Agrave Ccaron -65
+KPX Agrave Ccedilla -65
+KPX Agrave G -60
+KPX Agrave Gbreve -60
+KPX Agrave Gcommaaccent -60
+KPX Agrave O -50
+KPX Agrave Oacute -50
+KPX Agrave Ocircumflex -50
+KPX Agrave Odieresis -50
+KPX Agrave Ograve -50
+KPX Agrave Ohungarumlaut -50
+KPX Agrave Omacron -50
+KPX Agrave Oslash -50
+KPX Agrave Otilde -50
+KPX Agrave Q -55
+KPX Agrave T -55
+KPX Agrave Tcaron -55
+KPX Agrave Tcommaaccent -55
+KPX Agrave U -50
+KPX Agrave Uacute -50
+KPX Agrave Ucircumflex -50
+KPX Agrave Udieresis -50
+KPX Agrave Ugrave -50
+KPX Agrave Uhungarumlaut -50
+KPX Agrave Umacron -50
+KPX Agrave Uogonek -50
+KPX Agrave Uring -50
+KPX Agrave V -95
+KPX Agrave W -100
+KPX Agrave Y -70
+KPX Agrave Yacute -70
+KPX Agrave Ydieresis -70
+KPX Agrave quoteright -74
+KPX Agrave u -30
+KPX Agrave uacute -30
+KPX Agrave ucircumflex -30
+KPX Agrave udieresis -30
+KPX Agrave ugrave -30
+KPX Agrave uhungarumlaut -30
+KPX Agrave umacron -30
+KPX Agrave uogonek -30
+KPX Agrave uring -30
+KPX Agrave v -74
+KPX Agrave w -74
+KPX Agrave y -74
+KPX Agrave yacute -74
+KPX Agrave ydieresis -74
+KPX Amacron C -65
+KPX Amacron Cacute -65
+KPX Amacron Ccaron -65
+KPX Amacron Ccedilla -65
+KPX Amacron G -60
+KPX Amacron Gbreve -60
+KPX Amacron Gcommaaccent -60
+KPX Amacron O -50
+KPX Amacron Oacute -50
+KPX Amacron Ocircumflex -50
+KPX Amacron Odieresis -50
+KPX Amacron Ograve -50
+KPX Amacron Ohungarumlaut -50
+KPX Amacron Omacron -50
+KPX Amacron Oslash -50
+KPX Amacron Otilde -50
+KPX Amacron Q -55
+KPX Amacron T -55
+KPX Amacron Tcaron -55
+KPX Amacron Tcommaaccent -55
+KPX Amacron U -50
+KPX Amacron Uacute -50
+KPX Amacron Ucircumflex -50
+KPX Amacron Udieresis -50
+KPX Amacron Ugrave -50
+KPX Amacron Uhungarumlaut -50
+KPX Amacron Umacron -50
+KPX Amacron Uogonek -50
+KPX Amacron Uring -50
+KPX Amacron V -95
+KPX Amacron W -100
+KPX Amacron Y -70
+KPX Amacron Yacute -70
+KPX Amacron Ydieresis -70
+KPX Amacron quoteright -74
+KPX Amacron u -30
+KPX Amacron uacute -30
+KPX Amacron ucircumflex -30
+KPX Amacron udieresis -30
+KPX Amacron ugrave -30
+KPX Amacron uhungarumlaut -30
+KPX Amacron umacron -30
+KPX Amacron uogonek -30
+KPX Amacron uring -30
+KPX Amacron v -74
+KPX Amacron w -74
+KPX Amacron y -74
+KPX Amacron yacute -74
+KPX Amacron ydieresis -74
+KPX Aogonek C -65
+KPX Aogonek Cacute -65
+KPX Aogonek Ccaron -65
+KPX Aogonek Ccedilla -65
+KPX Aogonek G -60
+KPX Aogonek Gbreve -60
+KPX Aogonek Gcommaaccent -60
+KPX Aogonek O -50
+KPX Aogonek Oacute -50
+KPX Aogonek Ocircumflex -50
+KPX Aogonek Odieresis -50
+KPX Aogonek Ograve -50
+KPX Aogonek Ohungarumlaut -50
+KPX Aogonek Omacron -50
+KPX Aogonek Oslash -50
+KPX Aogonek Otilde -50
+KPX Aogonek Q -55
+KPX Aogonek T -55
+KPX Aogonek Tcaron -55
+KPX Aogonek Tcommaaccent -55
+KPX Aogonek U -50
+KPX Aogonek Uacute -50
+KPX Aogonek Ucircumflex -50
+KPX Aogonek Udieresis -50
+KPX Aogonek Ugrave -50
+KPX Aogonek Uhungarumlaut -50
+KPX Aogonek Umacron -50
+KPX Aogonek Uogonek -50
+KPX Aogonek Uring -50
+KPX Aogonek V -95
+KPX Aogonek W -100
+KPX Aogonek Y -70
+KPX Aogonek Yacute -70
+KPX Aogonek Ydieresis -70
+KPX Aogonek quoteright -74
+KPX Aogonek u -30
+KPX Aogonek uacute -30
+KPX Aogonek ucircumflex -30
+KPX Aogonek udieresis -30
+KPX Aogonek ugrave -30
+KPX Aogonek uhungarumlaut -30
+KPX Aogonek umacron -30
+KPX Aogonek uogonek -30
+KPX Aogonek uring -30
+KPX Aogonek v -74
+KPX Aogonek w -74
+KPX Aogonek y -34
+KPX Aogonek yacute -34
+KPX Aogonek ydieresis -34
+KPX Aring C -65
+KPX Aring Cacute -65
+KPX Aring Ccaron -65
+KPX Aring Ccedilla -65
+KPX Aring G -60
+KPX Aring Gbreve -60
+KPX Aring Gcommaaccent -60
+KPX Aring O -50
+KPX Aring Oacute -50
+KPX Aring Ocircumflex -50
+KPX Aring Odieresis -50
+KPX Aring Ograve -50
+KPX Aring Ohungarumlaut -50
+KPX Aring Omacron -50
+KPX Aring Oslash -50
+KPX Aring Otilde -50
+KPX Aring Q -55
+KPX Aring T -55
+KPX Aring Tcaron -55
+KPX Aring Tcommaaccent -55
+KPX Aring U -50
+KPX Aring Uacute -50
+KPX Aring Ucircumflex -50
+KPX Aring Udieresis -50
+KPX Aring Ugrave -50
+KPX Aring Uhungarumlaut -50
+KPX Aring Umacron -50
+KPX Aring Uogonek -50
+KPX Aring Uring -50
+KPX Aring V -95
+KPX Aring W -100
+KPX Aring Y -70
+KPX Aring Yacute -70
+KPX Aring Ydieresis -70
+KPX Aring quoteright -74
+KPX Aring u -30
+KPX Aring uacute -30
+KPX Aring ucircumflex -30
+KPX Aring udieresis -30
+KPX Aring ugrave -30
+KPX Aring uhungarumlaut -30
+KPX Aring umacron -30
+KPX Aring uogonek -30
+KPX Aring uring -30
+KPX Aring v -74
+KPX Aring w -74
+KPX Aring y -74
+KPX Aring yacute -74
+KPX Aring ydieresis -74
+KPX Atilde C -65
+KPX Atilde Cacute -65
+KPX Atilde Ccaron -65
+KPX Atilde Ccedilla -65
+KPX Atilde G -60
+KPX Atilde Gbreve -60
+KPX Atilde Gcommaaccent -60
+KPX Atilde O -50
+KPX Atilde Oacute -50
+KPX Atilde Ocircumflex -50
+KPX Atilde Odieresis -50
+KPX Atilde Ograve -50
+KPX Atilde Ohungarumlaut -50
+KPX Atilde Omacron -50
+KPX Atilde Oslash -50
+KPX Atilde Otilde -50
+KPX Atilde Q -55
+KPX Atilde T -55
+KPX Atilde Tcaron -55
+KPX Atilde Tcommaaccent -55
+KPX Atilde U -50
+KPX Atilde Uacute -50
+KPX Atilde Ucircumflex -50
+KPX Atilde Udieresis -50
+KPX Atilde Ugrave -50
+KPX Atilde Uhungarumlaut -50
+KPX Atilde Umacron -50
+KPX Atilde Uogonek -50
+KPX Atilde Uring -50
+KPX Atilde V -95
+KPX Atilde W -100
+KPX Atilde Y -70
+KPX Atilde Yacute -70
+KPX Atilde Ydieresis -70
+KPX Atilde quoteright -74
+KPX Atilde u -30
+KPX Atilde uacute -30
+KPX Atilde ucircumflex -30
+KPX Atilde udieresis -30
+KPX Atilde ugrave -30
+KPX Atilde uhungarumlaut -30
+KPX Atilde umacron -30
+KPX Atilde uogonek -30
+KPX Atilde uring -30
+KPX Atilde v -74
+KPX Atilde w -74
+KPX Atilde y -74
+KPX Atilde yacute -74
+KPX Atilde ydieresis -74
+KPX B A -25
+KPX B Aacute -25
+KPX B Abreve -25
+KPX B Acircumflex -25
+KPX B Adieresis -25
+KPX B Agrave -25
+KPX B Amacron -25
+KPX B Aogonek -25
+KPX B Aring -25
+KPX B Atilde -25
+KPX B U -10
+KPX B Uacute -10
+KPX B Ucircumflex -10
+KPX B Udieresis -10
+KPX B Ugrave -10
+KPX B Uhungarumlaut -10
+KPX B Umacron -10
+KPX B Uogonek -10
+KPX B Uring -10
+KPX D A -25
+KPX D Aacute -25
+KPX D Abreve -25
+KPX D Acircumflex -25
+KPX D Adieresis -25
+KPX D Agrave -25
+KPX D Amacron -25
+KPX D Aogonek -25
+KPX D Aring -25
+KPX D Atilde -25
+KPX D V -50
+KPX D W -40
+KPX D Y -50
+KPX D Yacute -50
+KPX D Ydieresis -50
+KPX Dcaron A -25
+KPX Dcaron Aacute -25
+KPX Dcaron Abreve -25
+KPX Dcaron Acircumflex -25
+KPX Dcaron Adieresis -25
+KPX Dcaron Agrave -25
+KPX Dcaron Amacron -25
+KPX Dcaron Aogonek -25
+KPX Dcaron Aring -25
+KPX Dcaron Atilde -25
+KPX Dcaron V -50
+KPX Dcaron W -40
+KPX Dcaron Y -50
+KPX Dcaron Yacute -50
+KPX Dcaron Ydieresis -50
+KPX Dcroat A -25
+KPX Dcroat Aacute -25
+KPX Dcroat Abreve -25
+KPX Dcroat Acircumflex -25
+KPX Dcroat Adieresis -25
+KPX Dcroat Agrave -25
+KPX Dcroat Amacron -25
+KPX Dcroat Aogonek -25
+KPX Dcroat Aring -25
+KPX Dcroat Atilde -25
+KPX Dcroat V -50
+KPX Dcroat W -40
+KPX Dcroat Y -50
+KPX Dcroat Yacute -50
+KPX Dcroat Ydieresis -50
+KPX F A -100
+KPX F Aacute -100
+KPX F Abreve -100
+KPX F Acircumflex -100
+KPX F Adieresis -100
+KPX F Agrave -100
+KPX F Amacron -100
+KPX F Aogonek -100
+KPX F Aring -100
+KPX F Atilde -100
+KPX F a -95
+KPX F aacute -95
+KPX F abreve -95
+KPX F acircumflex -95
+KPX F adieresis -95
+KPX F agrave -95
+KPX F amacron -95
+KPX F aogonek -95
+KPX F aring -95
+KPX F atilde -95
+KPX F comma -129
+KPX F e -100
+KPX F eacute -100
+KPX F ecaron -100
+KPX F ecircumflex -100
+KPX F edieresis -100
+KPX F edotaccent -100
+KPX F egrave -100
+KPX F emacron -100
+KPX F eogonek -100
+KPX F i -40
+KPX F iacute -40
+KPX F icircumflex -40
+KPX F idieresis -40
+KPX F igrave -40
+KPX F imacron -40
+KPX F iogonek -40
+KPX F o -70
+KPX F oacute -70
+KPX F ocircumflex -70
+KPX F odieresis -70
+KPX F ograve -70
+KPX F ohungarumlaut -70
+KPX F omacron -70
+KPX F oslash -70
+KPX F otilde -70
+KPX F period -129
+KPX F r -50
+KPX F racute -50
+KPX F rcaron -50
+KPX F rcommaaccent -50
+KPX J A -25
+KPX J Aacute -25
+KPX J Abreve -25
+KPX J Acircumflex -25
+KPX J Adieresis -25
+KPX J Agrave -25
+KPX J Amacron -25
+KPX J Aogonek -25
+KPX J Aring -25
+KPX J Atilde -25
+KPX J a -40
+KPX J aacute -40
+KPX J abreve -40
+KPX J acircumflex -40
+KPX J adieresis -40
+KPX J agrave -40
+KPX J amacron -40
+KPX J aogonek -40
+KPX J aring -40
+KPX J atilde -40
+KPX J comma -10
+KPX J e -40
+KPX J eacute -40
+KPX J ecaron -40
+KPX J ecircumflex -40
+KPX J edieresis -40
+KPX J edotaccent -40
+KPX J egrave -40
+KPX J emacron -40
+KPX J eogonek -40
+KPX J o -40
+KPX J oacute -40
+KPX J ocircumflex -40
+KPX J odieresis -40
+KPX J ograve -40
+KPX J ohungarumlaut -40
+KPX J omacron -40
+KPX J oslash -40
+KPX J otilde -40
+KPX J period -10
+KPX J u -40
+KPX J uacute -40
+KPX J ucircumflex -40
+KPX J udieresis -40
+KPX J ugrave -40
+KPX J uhungarumlaut -40
+KPX J umacron -40
+KPX J uogonek -40
+KPX J uring -40
+KPX K O -30
+KPX K Oacute -30
+KPX K Ocircumflex -30
+KPX K Odieresis -30
+KPX K Ograve -30
+KPX K Ohungarumlaut -30
+KPX K Omacron -30
+KPX K Oslash -30
+KPX K Otilde -30
+KPX K e -25
+KPX K eacute -25
+KPX K ecaron -25
+KPX K ecircumflex -25
+KPX K edieresis -25
+KPX K edotaccent -25
+KPX K egrave -25
+KPX K emacron -25
+KPX K eogonek -25
+KPX K o -25
+KPX K oacute -25
+KPX K ocircumflex -25
+KPX K odieresis -25
+KPX K ograve -25
+KPX K ohungarumlaut -25
+KPX K omacron -25
+KPX K oslash -25
+KPX K otilde -25
+KPX K u -20
+KPX K uacute -20
+KPX K ucircumflex -20
+KPX K udieresis -20
+KPX K ugrave -20
+KPX K uhungarumlaut -20
+KPX K umacron -20
+KPX K uogonek -20
+KPX K uring -20
+KPX K y -20
+KPX K yacute -20
+KPX K ydieresis -20
+KPX Kcommaaccent O -30
+KPX Kcommaaccent Oacute -30
+KPX Kcommaaccent Ocircumflex -30
+KPX Kcommaaccent Odieresis -30
+KPX Kcommaaccent Ograve -30
+KPX Kcommaaccent Ohungarumlaut -30
+KPX Kcommaaccent Omacron -30
+KPX Kcommaaccent Oslash -30
+KPX Kcommaaccent Otilde -30
+KPX Kcommaaccent e -25
+KPX Kcommaaccent eacute -25
+KPX Kcommaaccent ecaron -25
+KPX Kcommaaccent ecircumflex -25
+KPX Kcommaaccent edieresis -25
+KPX Kcommaaccent edotaccent -25
+KPX Kcommaaccent egrave -25
+KPX Kcommaaccent emacron -25
+KPX Kcommaaccent eogonek -25
+KPX Kcommaaccent o -25
+KPX Kcommaaccent oacute -25
+KPX Kcommaaccent ocircumflex -25
+KPX Kcommaaccent odieresis -25
+KPX Kcommaaccent ograve -25
+KPX Kcommaaccent ohungarumlaut -25
+KPX Kcommaaccent omacron -25
+KPX Kcommaaccent oslash -25
+KPX Kcommaaccent otilde -25
+KPX Kcommaaccent u -20
+KPX Kcommaaccent uacute -20
+KPX Kcommaaccent ucircumflex -20
+KPX Kcommaaccent udieresis -20
+KPX Kcommaaccent ugrave -20
+KPX Kcommaaccent uhungarumlaut -20
+KPX Kcommaaccent umacron -20
+KPX Kcommaaccent uogonek -20
+KPX Kcommaaccent uring -20
+KPX Kcommaaccent y -20
+KPX Kcommaaccent yacute -20
+KPX Kcommaaccent ydieresis -20
+KPX L T -18
+KPX L Tcaron -18
+KPX L Tcommaaccent -18
+KPX L V -37
+KPX L W -37
+KPX L Y -37
+KPX L Yacute -37
+KPX L Ydieresis -37
+KPX L quoteright -55
+KPX L y -37
+KPX L yacute -37
+KPX L ydieresis -37
+KPX Lacute T -18
+KPX Lacute Tcaron -18
+KPX Lacute Tcommaaccent -18
+KPX Lacute V -37
+KPX Lacute W -37
+KPX Lacute Y -37
+KPX Lacute Yacute -37
+KPX Lacute Ydieresis -37
+KPX Lacute quoteright -55
+KPX Lacute y -37
+KPX Lacute yacute -37
+KPX Lacute ydieresis -37
+KPX Lcommaaccent T -18
+KPX Lcommaaccent Tcaron -18
+KPX Lcommaaccent Tcommaaccent -18
+KPX Lcommaaccent V -37
+KPX Lcommaaccent W -37
+KPX Lcommaaccent Y -37
+KPX Lcommaaccent Yacute -37
+KPX Lcommaaccent Ydieresis -37
+KPX Lcommaaccent quoteright -55
+KPX Lcommaaccent y -37
+KPX Lcommaaccent yacute -37
+KPX Lcommaaccent ydieresis -37
+KPX Lslash T -18
+KPX Lslash Tcaron -18
+KPX Lslash Tcommaaccent -18
+KPX Lslash V -37
+KPX Lslash W -37
+KPX Lslash Y -37
+KPX Lslash Yacute -37
+KPX Lslash Ydieresis -37
+KPX Lslash quoteright -55
+KPX Lslash y -37
+KPX Lslash yacute -37
+KPX Lslash ydieresis -37
+KPX N A -30
+KPX N Aacute -30
+KPX N Abreve -30
+KPX N Acircumflex -30
+KPX N Adieresis -30
+KPX N Agrave -30
+KPX N Amacron -30
+KPX N Aogonek -30
+KPX N Aring -30
+KPX N Atilde -30
+KPX Nacute A -30
+KPX Nacute Aacute -30
+KPX Nacute Abreve -30
+KPX Nacute Acircumflex -30
+KPX Nacute Adieresis -30
+KPX Nacute Agrave -30
+KPX Nacute Amacron -30
+KPX Nacute Aogonek -30
+KPX Nacute Aring -30
+KPX Nacute Atilde -30
+KPX Ncaron A -30
+KPX Ncaron Aacute -30
+KPX Ncaron Abreve -30
+KPX Ncaron Acircumflex -30
+KPX Ncaron Adieresis -30
+KPX Ncaron Agrave -30
+KPX Ncaron Amacron -30
+KPX Ncaron Aogonek -30
+KPX Ncaron Aring -30
+KPX Ncaron Atilde -30
+KPX Ncommaaccent A -30
+KPX Ncommaaccent Aacute -30
+KPX Ncommaaccent Abreve -30
+KPX Ncommaaccent Acircumflex -30
+KPX Ncommaaccent Adieresis -30
+KPX Ncommaaccent Agrave -30
+KPX Ncommaaccent Amacron -30
+KPX Ncommaaccent Aogonek -30
+KPX Ncommaaccent Aring -30
+KPX Ncommaaccent Atilde -30
+KPX Ntilde A -30
+KPX Ntilde Aacute -30
+KPX Ntilde Abreve -30
+KPX Ntilde Acircumflex -30
+KPX Ntilde Adieresis -30
+KPX Ntilde Agrave -30
+KPX Ntilde Amacron -30
+KPX Ntilde Aogonek -30
+KPX Ntilde Aring -30
+KPX Ntilde Atilde -30
+KPX O A -40
+KPX O Aacute -40
+KPX O Abreve -40
+KPX O Acircumflex -40
+KPX O Adieresis -40
+KPX O Agrave -40
+KPX O Amacron -40
+KPX O Aogonek -40
+KPX O Aring -40
+KPX O Atilde -40
+KPX O T -40
+KPX O Tcaron -40
+KPX O Tcommaaccent -40
+KPX O V -50
+KPX O W -50
+KPX O X -40
+KPX O Y -50
+KPX O Yacute -50
+KPX O Ydieresis -50
+KPX Oacute A -40
+KPX Oacute Aacute -40
+KPX Oacute Abreve -40
+KPX Oacute Acircumflex -40
+KPX Oacute Adieresis -40
+KPX Oacute Agrave -40
+KPX Oacute Amacron -40
+KPX Oacute Aogonek -40
+KPX Oacute Aring -40
+KPX Oacute Atilde -40
+KPX Oacute T -40
+KPX Oacute Tcaron -40
+KPX Oacute Tcommaaccent -40
+KPX Oacute V -50
+KPX Oacute W -50
+KPX Oacute X -40
+KPX Oacute Y -50
+KPX Oacute Yacute -50
+KPX Oacute Ydieresis -50
+KPX Ocircumflex A -40
+KPX Ocircumflex Aacute -40
+KPX Ocircumflex Abreve -40
+KPX Ocircumflex Acircumflex -40
+KPX Ocircumflex Adieresis -40
+KPX Ocircumflex Agrave -40
+KPX Ocircumflex Amacron -40
+KPX Ocircumflex Aogonek -40
+KPX Ocircumflex Aring -40
+KPX Ocircumflex Atilde -40
+KPX Ocircumflex T -40
+KPX Ocircumflex Tcaron -40
+KPX Ocircumflex Tcommaaccent -40
+KPX Ocircumflex V -50
+KPX Ocircumflex W -50
+KPX Ocircumflex X -40
+KPX Ocircumflex Y -50
+KPX Ocircumflex Yacute -50
+KPX Ocircumflex Ydieresis -50
+KPX Odieresis A -40
+KPX Odieresis Aacute -40
+KPX Odieresis Abreve -40
+KPX Odieresis Acircumflex -40
+KPX Odieresis Adieresis -40
+KPX Odieresis Agrave -40
+KPX Odieresis Amacron -40
+KPX Odieresis Aogonek -40
+KPX Odieresis Aring -40
+KPX Odieresis Atilde -40
+KPX Odieresis T -40
+KPX Odieresis Tcaron -40
+KPX Odieresis Tcommaaccent -40
+KPX Odieresis V -50
+KPX Odieresis W -50
+KPX Odieresis X -40
+KPX Odieresis Y -50
+KPX Odieresis Yacute -50
+KPX Odieresis Ydieresis -50
+KPX Ograve A -40
+KPX Ograve Aacute -40
+KPX Ograve Abreve -40
+KPX Ograve Acircumflex -40
+KPX Ograve Adieresis -40
+KPX Ograve Agrave -40
+KPX Ograve Amacron -40
+KPX Ograve Aogonek -40
+KPX Ograve Aring -40
+KPX Ograve Atilde -40
+KPX Ograve T -40
+KPX Ograve Tcaron -40
+KPX Ograve Tcommaaccent -40
+KPX Ograve V -50
+KPX Ograve W -50
+KPX Ograve X -40
+KPX Ograve Y -50
+KPX Ograve Yacute -50
+KPX Ograve Ydieresis -50
+KPX Ohungarumlaut A -40
+KPX Ohungarumlaut Aacute -40
+KPX Ohungarumlaut Abreve -40
+KPX Ohungarumlaut Acircumflex -40
+KPX Ohungarumlaut Adieresis -40
+KPX Ohungarumlaut Agrave -40
+KPX Ohungarumlaut Amacron -40
+KPX Ohungarumlaut Aogonek -40
+KPX Ohungarumlaut Aring -40
+KPX Ohungarumlaut Atilde -40
+KPX Ohungarumlaut T -40
+KPX Ohungarumlaut Tcaron -40
+KPX Ohungarumlaut Tcommaaccent -40
+KPX Ohungarumlaut V -50
+KPX Ohungarumlaut W -50
+KPX Ohungarumlaut X -40
+KPX Ohungarumlaut Y -50
+KPX Ohungarumlaut Yacute -50
+KPX Ohungarumlaut Ydieresis -50
+KPX Omacron A -40
+KPX Omacron Aacute -40
+KPX Omacron Abreve -40
+KPX Omacron Acircumflex -40
+KPX Omacron Adieresis -40
+KPX Omacron Agrave -40
+KPX Omacron Amacron -40
+KPX Omacron Aogonek -40
+KPX Omacron Aring -40
+KPX Omacron Atilde -40
+KPX Omacron T -40
+KPX Omacron Tcaron -40
+KPX Omacron Tcommaaccent -40
+KPX Omacron V -50
+KPX Omacron W -50
+KPX Omacron X -40
+KPX Omacron Y -50
+KPX Omacron Yacute -50
+KPX Omacron Ydieresis -50
+KPX Oslash A -40
+KPX Oslash Aacute -40
+KPX Oslash Abreve -40
+KPX Oslash Acircumflex -40
+KPX Oslash Adieresis -40
+KPX Oslash Agrave -40
+KPX Oslash Amacron -40
+KPX Oslash Aogonek -40
+KPX Oslash Aring -40
+KPX Oslash Atilde -40
+KPX Oslash T -40
+KPX Oslash Tcaron -40
+KPX Oslash Tcommaaccent -40
+KPX Oslash V -50
+KPX Oslash W -50
+KPX Oslash X -40
+KPX Oslash Y -50
+KPX Oslash Yacute -50
+KPX Oslash Ydieresis -50
+KPX Otilde A -40
+KPX Otilde Aacute -40
+KPX Otilde Abreve -40
+KPX Otilde Acircumflex -40
+KPX Otilde Adieresis -40
+KPX Otilde Agrave -40
+KPX Otilde Amacron -40
+KPX Otilde Aogonek -40
+KPX Otilde Aring -40
+KPX Otilde Atilde -40
+KPX Otilde T -40
+KPX Otilde Tcaron -40
+KPX Otilde Tcommaaccent -40
+KPX Otilde V -50
+KPX Otilde W -50
+KPX Otilde X -40
+KPX Otilde Y -50
+KPX Otilde Yacute -50
+KPX Otilde Ydieresis -50
+KPX P A -85
+KPX P Aacute -85
+KPX P Abreve -85
+KPX P Acircumflex -85
+KPX P Adieresis -85
+KPX P Agrave -85
+KPX P Amacron -85
+KPX P Aogonek -85
+KPX P Aring -85
+KPX P Atilde -85
+KPX P a -40
+KPX P aacute -40
+KPX P abreve -40
+KPX P acircumflex -40
+KPX P adieresis -40
+KPX P agrave -40
+KPX P amacron -40
+KPX P aogonek -40
+KPX P aring -40
+KPX P atilde -40
+KPX P comma -129
+KPX P e -50
+KPX P eacute -50
+KPX P ecaron -50
+KPX P ecircumflex -50
+KPX P edieresis -50
+KPX P edotaccent -50
+KPX P egrave -50
+KPX P emacron -50
+KPX P eogonek -50
+KPX P o -55
+KPX P oacute -55
+KPX P ocircumflex -55
+KPX P odieresis -55
+KPX P ograve -55
+KPX P ohungarumlaut -55
+KPX P omacron -55
+KPX P oslash -55
+KPX P otilde -55
+KPX P period -129
+KPX Q U -10
+KPX Q Uacute -10
+KPX Q Ucircumflex -10
+KPX Q Udieresis -10
+KPX Q Ugrave -10
+KPX Q Uhungarumlaut -10
+KPX Q Umacron -10
+KPX Q Uogonek -10
+KPX Q Uring -10
+KPX R O -40
+KPX R Oacute -40
+KPX R Ocircumflex -40
+KPX R Odieresis -40
+KPX R Ograve -40
+KPX R Ohungarumlaut -40
+KPX R Omacron -40
+KPX R Oslash -40
+KPX R Otilde -40
+KPX R T -30
+KPX R Tcaron -30
+KPX R Tcommaaccent -30
+KPX R U -40
+KPX R Uacute -40
+KPX R Ucircumflex -40
+KPX R Udieresis -40
+KPX R Ugrave -40
+KPX R Uhungarumlaut -40
+KPX R Umacron -40
+KPX R Uogonek -40
+KPX R Uring -40
+KPX R V -18
+KPX R W -18
+KPX R Y -18
+KPX R Yacute -18
+KPX R Ydieresis -18
+KPX Racute O -40
+KPX Racute Oacute -40
+KPX Racute Ocircumflex -40
+KPX Racute Odieresis -40
+KPX Racute Ograve -40
+KPX Racute Ohungarumlaut -40
+KPX Racute Omacron -40
+KPX Racute Oslash -40
+KPX Racute Otilde -40
+KPX Racute T -30
+KPX Racute Tcaron -30
+KPX Racute Tcommaaccent -30
+KPX Racute U -40
+KPX Racute Uacute -40
+KPX Racute Ucircumflex -40
+KPX Racute Udieresis -40
+KPX Racute Ugrave -40
+KPX Racute Uhungarumlaut -40
+KPX Racute Umacron -40
+KPX Racute Uogonek -40
+KPX Racute Uring -40
+KPX Racute V -18
+KPX Racute W -18
+KPX Racute Y -18
+KPX Racute Yacute -18
+KPX Racute Ydieresis -18
+KPX Rcaron O -40
+KPX Rcaron Oacute -40
+KPX Rcaron Ocircumflex -40
+KPX Rcaron Odieresis -40
+KPX Rcaron Ograve -40
+KPX Rcaron Ohungarumlaut -40
+KPX Rcaron Omacron -40
+KPX Rcaron Oslash -40
+KPX Rcaron Otilde -40
+KPX Rcaron T -30
+KPX Rcaron Tcaron -30
+KPX Rcaron Tcommaaccent -30
+KPX Rcaron U -40
+KPX Rcaron Uacute -40
+KPX Rcaron Ucircumflex -40
+KPX Rcaron Udieresis -40
+KPX Rcaron Ugrave -40
+KPX Rcaron Uhungarumlaut -40
+KPX Rcaron Umacron -40
+KPX Rcaron Uogonek -40
+KPX Rcaron Uring -40
+KPX Rcaron V -18
+KPX Rcaron W -18
+KPX Rcaron Y -18
+KPX Rcaron Yacute -18
+KPX Rcaron Ydieresis -18
+KPX Rcommaaccent O -40
+KPX Rcommaaccent Oacute -40
+KPX Rcommaaccent Ocircumflex -40
+KPX Rcommaaccent Odieresis -40
+KPX Rcommaaccent Ograve -40
+KPX Rcommaaccent Ohungarumlaut -40
+KPX Rcommaaccent Omacron -40
+KPX Rcommaaccent Oslash -40
+KPX Rcommaaccent Otilde -40
+KPX Rcommaaccent T -30
+KPX Rcommaaccent Tcaron -30
+KPX Rcommaaccent Tcommaaccent -30
+KPX Rcommaaccent U -40
+KPX Rcommaaccent Uacute -40
+KPX Rcommaaccent Ucircumflex -40
+KPX Rcommaaccent Udieresis -40
+KPX Rcommaaccent Ugrave -40
+KPX Rcommaaccent Uhungarumlaut -40
+KPX Rcommaaccent Umacron -40
+KPX Rcommaaccent Uogonek -40
+KPX Rcommaaccent Uring -40
+KPX Rcommaaccent V -18
+KPX Rcommaaccent W -18
+KPX Rcommaaccent Y -18
+KPX Rcommaaccent Yacute -18
+KPX Rcommaaccent Ydieresis -18
+KPX T A -55
+KPX T Aacute -55
+KPX T Abreve -55
+KPX T Acircumflex -55
+KPX T Adieresis -55
+KPX T Agrave -55
+KPX T Amacron -55
+KPX T Aogonek -55
+KPX T Aring -55
+KPX T Atilde -55
+KPX T O -18
+KPX T Oacute -18
+KPX T Ocircumflex -18
+KPX T Odieresis -18
+KPX T Ograve -18
+KPX T Ohungarumlaut -18
+KPX T Omacron -18
+KPX T Oslash -18
+KPX T Otilde -18
+KPX T a -92
+KPX T aacute -92
+KPX T abreve -92
+KPX T acircumflex -92
+KPX T adieresis -92
+KPX T agrave -92
+KPX T amacron -92
+KPX T aogonek -92
+KPX T aring -92
+KPX T atilde -92
+KPX T colon -74
+KPX T comma -92
+KPX T e -92
+KPX T eacute -92
+KPX T ecaron -92
+KPX T ecircumflex -92
+KPX T edieresis -52
+KPX T edotaccent -92
+KPX T egrave -52
+KPX T emacron -52
+KPX T eogonek -92
+KPX T hyphen -92
+KPX T i -37
+KPX T iacute -37
+KPX T iogonek -37
+KPX T o -95
+KPX T oacute -95
+KPX T ocircumflex -95
+KPX T odieresis -95
+KPX T ograve -95
+KPX T ohungarumlaut -95
+KPX T omacron -95
+KPX T oslash -95
+KPX T otilde -95
+KPX T period -92
+KPX T r -37
+KPX T racute -37
+KPX T rcaron -37
+KPX T rcommaaccent -37
+KPX T semicolon -74
+KPX T u -37
+KPX T uacute -37
+KPX T ucircumflex -37
+KPX T udieresis -37
+KPX T ugrave -37
+KPX T uhungarumlaut -37
+KPX T umacron -37
+KPX T uogonek -37
+KPX T uring -37
+KPX T w -37
+KPX T y -37
+KPX T yacute -37
+KPX T ydieresis -37
+KPX Tcaron A -55
+KPX Tcaron Aacute -55
+KPX Tcaron Abreve -55
+KPX Tcaron Acircumflex -55
+KPX Tcaron Adieresis -55
+KPX Tcaron Agrave -55
+KPX Tcaron Amacron -55
+KPX Tcaron Aogonek -55
+KPX Tcaron Aring -55
+KPX Tcaron Atilde -55
+KPX Tcaron O -18
+KPX Tcaron Oacute -18
+KPX Tcaron Ocircumflex -18
+KPX Tcaron Odieresis -18
+KPX Tcaron Ograve -18
+KPX Tcaron Ohungarumlaut -18
+KPX Tcaron Omacron -18
+KPX Tcaron Oslash -18
+KPX Tcaron Otilde -18
+KPX Tcaron a -92
+KPX Tcaron aacute -92
+KPX Tcaron abreve -92
+KPX Tcaron acircumflex -92
+KPX Tcaron adieresis -92
+KPX Tcaron agrave -92
+KPX Tcaron amacron -92
+KPX Tcaron aogonek -92
+KPX Tcaron aring -92
+KPX Tcaron atilde -92
+KPX Tcaron colon -74
+KPX Tcaron comma -92
+KPX Tcaron e -92
+KPX Tcaron eacute -92
+KPX Tcaron ecaron -92
+KPX Tcaron ecircumflex -92
+KPX Tcaron edieresis -52
+KPX Tcaron edotaccent -92
+KPX Tcaron egrave -52
+KPX Tcaron emacron -52
+KPX Tcaron eogonek -92
+KPX Tcaron hyphen -92
+KPX Tcaron i -37
+KPX Tcaron iacute -37
+KPX Tcaron iogonek -37
+KPX Tcaron o -95
+KPX Tcaron oacute -95
+KPX Tcaron ocircumflex -95
+KPX Tcaron odieresis -95
+KPX Tcaron ograve -95
+KPX Tcaron ohungarumlaut -95
+KPX Tcaron omacron -95
+KPX Tcaron oslash -95
+KPX Tcaron otilde -95
+KPX Tcaron period -92
+KPX Tcaron r -37
+KPX Tcaron racute -37
+KPX Tcaron rcaron -37
+KPX Tcaron rcommaaccent -37
+KPX Tcaron semicolon -74
+KPX Tcaron u -37
+KPX Tcaron uacute -37
+KPX Tcaron ucircumflex -37
+KPX Tcaron udieresis -37
+KPX Tcaron ugrave -37
+KPX Tcaron uhungarumlaut -37
+KPX Tcaron umacron -37
+KPX Tcaron uogonek -37
+KPX Tcaron uring -37
+KPX Tcaron w -37
+KPX Tcaron y -37
+KPX Tcaron yacute -37
+KPX Tcaron ydieresis -37
+KPX Tcommaaccent A -55
+KPX Tcommaaccent Aacute -55
+KPX Tcommaaccent Abreve -55
+KPX Tcommaaccent Acircumflex -55
+KPX Tcommaaccent Adieresis -55
+KPX Tcommaaccent Agrave -55
+KPX Tcommaaccent Amacron -55
+KPX Tcommaaccent Aogonek -55
+KPX Tcommaaccent Aring -55
+KPX Tcommaaccent Atilde -55
+KPX Tcommaaccent O -18
+KPX Tcommaaccent Oacute -18
+KPX Tcommaaccent Ocircumflex -18
+KPX Tcommaaccent Odieresis -18
+KPX Tcommaaccent Ograve -18
+KPX Tcommaaccent Ohungarumlaut -18
+KPX Tcommaaccent Omacron -18
+KPX Tcommaaccent Oslash -18
+KPX Tcommaaccent Otilde -18
+KPX Tcommaaccent a -92
+KPX Tcommaaccent aacute -92
+KPX Tcommaaccent abreve -92
+KPX Tcommaaccent acircumflex -92
+KPX Tcommaaccent adieresis -92
+KPX Tcommaaccent agrave -92
+KPX Tcommaaccent amacron -92
+KPX Tcommaaccent aogonek -92
+KPX Tcommaaccent aring -92
+KPX Tcommaaccent atilde -92
+KPX Tcommaaccent colon -74
+KPX Tcommaaccent comma -92
+KPX Tcommaaccent e -92
+KPX Tcommaaccent eacute -92
+KPX Tcommaaccent ecaron -92
+KPX Tcommaaccent ecircumflex -92
+KPX Tcommaaccent edieresis -52
+KPX Tcommaaccent edotaccent -92
+KPX Tcommaaccent egrave -52
+KPX Tcommaaccent emacron -52
+KPX Tcommaaccent eogonek -92
+KPX Tcommaaccent hyphen -92
+KPX Tcommaaccent i -37
+KPX Tcommaaccent iacute -37
+KPX Tcommaaccent iogonek -37
+KPX Tcommaaccent o -95
+KPX Tcommaaccent oacute -95
+KPX Tcommaaccent ocircumflex -95
+KPX Tcommaaccent odieresis -95
+KPX Tcommaaccent ograve -95
+KPX Tcommaaccent ohungarumlaut -95
+KPX Tcommaaccent omacron -95
+KPX Tcommaaccent oslash -95
+KPX Tcommaaccent otilde -95
+KPX Tcommaaccent period -92
+KPX Tcommaaccent r -37
+KPX Tcommaaccent racute -37
+KPX Tcommaaccent rcaron -37
+KPX Tcommaaccent rcommaaccent -37
+KPX Tcommaaccent semicolon -74
+KPX Tcommaaccent u -37
+KPX Tcommaaccent uacute -37
+KPX Tcommaaccent ucircumflex -37
+KPX Tcommaaccent udieresis -37
+KPX Tcommaaccent ugrave -37
+KPX Tcommaaccent uhungarumlaut -37
+KPX Tcommaaccent umacron -37
+KPX Tcommaaccent uogonek -37
+KPX Tcommaaccent uring -37
+KPX Tcommaaccent w -37
+KPX Tcommaaccent y -37
+KPX Tcommaaccent yacute -37
+KPX Tcommaaccent ydieresis -37
+KPX U A -45
+KPX U Aacute -45
+KPX U Abreve -45
+KPX U Acircumflex -45
+KPX U Adieresis -45
+KPX U Agrave -45
+KPX U Amacron -45
+KPX U Aogonek -45
+KPX U Aring -45
+KPX U Atilde -45
+KPX Uacute A -45
+KPX Uacute Aacute -45
+KPX Uacute Abreve -45
+KPX Uacute Acircumflex -45
+KPX Uacute Adieresis -45
+KPX Uacute Agrave -45
+KPX Uacute Amacron -45
+KPX Uacute Aogonek -45
+KPX Uacute Aring -45
+KPX Uacute Atilde -45
+KPX Ucircumflex A -45
+KPX Ucircumflex Aacute -45
+KPX Ucircumflex Abreve -45
+KPX Ucircumflex Acircumflex -45
+KPX Ucircumflex Adieresis -45
+KPX Ucircumflex Agrave -45
+KPX Ucircumflex Amacron -45
+KPX Ucircumflex Aogonek -45
+KPX Ucircumflex Aring -45
+KPX Ucircumflex Atilde -45
+KPX Udieresis A -45
+KPX Udieresis Aacute -45
+KPX Udieresis Abreve -45
+KPX Udieresis Acircumflex -45
+KPX Udieresis Adieresis -45
+KPX Udieresis Agrave -45
+KPX Udieresis Amacron -45
+KPX Udieresis Aogonek -45
+KPX Udieresis Aring -45
+KPX Udieresis Atilde -45
+KPX Ugrave A -45
+KPX Ugrave Aacute -45
+KPX Ugrave Abreve -45
+KPX Ugrave Acircumflex -45
+KPX Ugrave Adieresis -45
+KPX Ugrave Agrave -45
+KPX Ugrave Amacron -45
+KPX Ugrave Aogonek -45
+KPX Ugrave Aring -45
+KPX Ugrave Atilde -45
+KPX Uhungarumlaut A -45
+KPX Uhungarumlaut Aacute -45
+KPX Uhungarumlaut Abreve -45
+KPX Uhungarumlaut Acircumflex -45
+KPX Uhungarumlaut Adieresis -45
+KPX Uhungarumlaut Agrave -45
+KPX Uhungarumlaut Amacron -45
+KPX Uhungarumlaut Aogonek -45
+KPX Uhungarumlaut Aring -45
+KPX Uhungarumlaut Atilde -45
+KPX Umacron A -45
+KPX Umacron Aacute -45
+KPX Umacron Abreve -45
+KPX Umacron Acircumflex -45
+KPX Umacron Adieresis -45
+KPX Umacron Agrave -45
+KPX Umacron Amacron -45
+KPX Umacron Aogonek -45
+KPX Umacron Aring -45
+KPX Umacron Atilde -45
+KPX Uogonek A -45
+KPX Uogonek Aacute -45
+KPX Uogonek Abreve -45
+KPX Uogonek Acircumflex -45
+KPX Uogonek Adieresis -45
+KPX Uogonek Agrave -45
+KPX Uogonek Amacron -45
+KPX Uogonek Aogonek -45
+KPX Uogonek Aring -45
+KPX Uogonek Atilde -45
+KPX Uring A -45
+KPX Uring Aacute -45
+KPX Uring Abreve -45
+KPX Uring Acircumflex -45
+KPX Uring Adieresis -45
+KPX Uring Agrave -45
+KPX Uring Amacron -45
+KPX Uring Aogonek -45
+KPX Uring Aring -45
+KPX Uring Atilde -45
+KPX V A -85
+KPX V Aacute -85
+KPX V Abreve -85
+KPX V Acircumflex -85
+KPX V Adieresis -85
+KPX V Agrave -85
+KPX V Amacron -85
+KPX V Aogonek -85
+KPX V Aring -85
+KPX V Atilde -85
+KPX V G -10
+KPX V Gbreve -10
+KPX V Gcommaaccent -10
+KPX V O -30
+KPX V Oacute -30
+KPX V Ocircumflex -30
+KPX V Odieresis -30
+KPX V Ograve -30
+KPX V Ohungarumlaut -30
+KPX V Omacron -30
+KPX V Oslash -30
+KPX V Otilde -30
+KPX V a -111
+KPX V aacute -111
+KPX V abreve -111
+KPX V acircumflex -111
+KPX V adieresis -111
+KPX V agrave -111
+KPX V amacron -111
+KPX V aogonek -111
+KPX V aring -111
+KPX V atilde -111
+KPX V colon -74
+KPX V comma -129
+KPX V e -111
+KPX V eacute -111
+KPX V ecaron -111
+KPX V ecircumflex -111
+KPX V edieresis -71
+KPX V edotaccent -111
+KPX V egrave -71
+KPX V emacron -71
+KPX V eogonek -111
+KPX V hyphen -70
+KPX V i -55
+KPX V iacute -55
+KPX V iogonek -55
+KPX V o -111
+KPX V oacute -111
+KPX V ocircumflex -111
+KPX V odieresis -111
+KPX V ograve -111
+KPX V ohungarumlaut -111
+KPX V omacron -111
+KPX V oslash -111
+KPX V otilde -111
+KPX V period -129
+KPX V semicolon -74
+KPX V u -55
+KPX V uacute -55
+KPX V ucircumflex -55
+KPX V udieresis -55
+KPX V ugrave -55
+KPX V uhungarumlaut -55
+KPX V umacron -55
+KPX V uogonek -55
+KPX V uring -55
+KPX W A -74
+KPX W Aacute -74
+KPX W Abreve -74
+KPX W Acircumflex -74
+KPX W Adieresis -74
+KPX W Agrave -74
+KPX W Amacron -74
+KPX W Aogonek -74
+KPX W Aring -74
+KPX W Atilde -74
+KPX W O -15
+KPX W Oacute -15
+KPX W Ocircumflex -15
+KPX W Odieresis -15
+KPX W Ograve -15
+KPX W Ohungarumlaut -15
+KPX W Omacron -15
+KPX W Oslash -15
+KPX W Otilde -15
+KPX W a -85
+KPX W aacute -85
+KPX W abreve -85
+KPX W acircumflex -85
+KPX W adieresis -85
+KPX W agrave -85
+KPX W amacron -85
+KPX W aogonek -85
+KPX W aring -85
+KPX W atilde -85
+KPX W colon -55
+KPX W comma -74
+KPX W e -90
+KPX W eacute -90
+KPX W ecaron -90
+KPX W ecircumflex -90
+KPX W edieresis -50
+KPX W edotaccent -90
+KPX W egrave -50
+KPX W emacron -50
+KPX W eogonek -90
+KPX W hyphen -50
+KPX W i -37
+KPX W iacute -37
+KPX W iogonek -37
+KPX W o -80
+KPX W oacute -80
+KPX W ocircumflex -80
+KPX W odieresis -80
+KPX W ograve -80
+KPX W ohungarumlaut -80
+KPX W omacron -80
+KPX W oslash -80
+KPX W otilde -80
+KPX W period -74
+KPX W semicolon -55
+KPX W u -55
+KPX W uacute -55
+KPX W ucircumflex -55
+KPX W udieresis -55
+KPX W ugrave -55
+KPX W uhungarumlaut -55
+KPX W umacron -55
+KPX W uogonek -55
+KPX W uring -55
+KPX W y -55
+KPX W yacute -55
+KPX W ydieresis -55
+KPX Y A -74
+KPX Y Aacute -74
+KPX Y Abreve -74
+KPX Y Acircumflex -74
+KPX Y Adieresis -74
+KPX Y Agrave -74
+KPX Y Amacron -74
+KPX Y Aogonek -74
+KPX Y Aring -74
+KPX Y Atilde -74
+KPX Y O -25
+KPX Y Oacute -25
+KPX Y Ocircumflex -25
+KPX Y Odieresis -25
+KPX Y Ograve -25
+KPX Y Ohungarumlaut -25
+KPX Y Omacron -25
+KPX Y Oslash -25
+KPX Y Otilde -25
+KPX Y a -92
+KPX Y aacute -92
+KPX Y abreve -92
+KPX Y acircumflex -92
+KPX Y adieresis -92
+KPX Y agrave -92
+KPX Y amacron -92
+KPX Y aogonek -92
+KPX Y aring -92
+KPX Y atilde -92
+KPX Y colon -92
+KPX Y comma -92
+KPX Y e -111
+KPX Y eacute -111
+KPX Y ecaron -111
+KPX Y ecircumflex -71
+KPX Y edieresis -71
+KPX Y edotaccent -111
+KPX Y egrave -71
+KPX Y emacron -71
+KPX Y eogonek -111
+KPX Y hyphen -92
+KPX Y i -55
+KPX Y iacute -55
+KPX Y iogonek -55
+KPX Y o -111
+KPX Y oacute -111
+KPX Y ocircumflex -111
+KPX Y odieresis -111
+KPX Y ograve -111
+KPX Y ohungarumlaut -111
+KPX Y omacron -111
+KPX Y oslash -111
+KPX Y otilde -111
+KPX Y period -74
+KPX Y semicolon -92
+KPX Y u -92
+KPX Y uacute -92
+KPX Y ucircumflex -92
+KPX Y udieresis -92
+KPX Y ugrave -92
+KPX Y uhungarumlaut -92
+KPX Y umacron -92
+KPX Y uogonek -92
+KPX Y uring -92
+KPX Yacute A -74
+KPX Yacute Aacute -74
+KPX Yacute Abreve -74
+KPX Yacute Acircumflex -74
+KPX Yacute Adieresis -74
+KPX Yacute Agrave -74
+KPX Yacute Amacron -74
+KPX Yacute Aogonek -74
+KPX Yacute Aring -74
+KPX Yacute Atilde -74
+KPX Yacute O -25
+KPX Yacute Oacute -25
+KPX Yacute Ocircumflex -25
+KPX Yacute Odieresis -25
+KPX Yacute Ograve -25
+KPX Yacute Ohungarumlaut -25
+KPX Yacute Omacron -25
+KPX Yacute Oslash -25
+KPX Yacute Otilde -25
+KPX Yacute a -92
+KPX Yacute aacute -92
+KPX Yacute abreve -92
+KPX Yacute acircumflex -92
+KPX Yacute adieresis -92
+KPX Yacute agrave -92
+KPX Yacute amacron -92
+KPX Yacute aogonek -92
+KPX Yacute aring -92
+KPX Yacute atilde -92
+KPX Yacute colon -92
+KPX Yacute comma -92
+KPX Yacute e -111
+KPX Yacute eacute -111
+KPX Yacute ecaron -111
+KPX Yacute ecircumflex -71
+KPX Yacute edieresis -71
+KPX Yacute edotaccent -111
+KPX Yacute egrave -71
+KPX Yacute emacron -71
+KPX Yacute eogonek -111
+KPX Yacute hyphen -92
+KPX Yacute i -55
+KPX Yacute iacute -55
+KPX Yacute iogonek -55
+KPX Yacute o -111
+KPX Yacute oacute -111
+KPX Yacute ocircumflex -111
+KPX Yacute odieresis -111
+KPX Yacute ograve -111
+KPX Yacute ohungarumlaut -111
+KPX Yacute omacron -111
+KPX Yacute oslash -111
+KPX Yacute otilde -111
+KPX Yacute period -74
+KPX Yacute semicolon -92
+KPX Yacute u -92
+KPX Yacute uacute -92
+KPX Yacute ucircumflex -92
+KPX Yacute udieresis -92
+KPX Yacute ugrave -92
+KPX Yacute uhungarumlaut -92
+KPX Yacute umacron -92
+KPX Yacute uogonek -92
+KPX Yacute uring -92
+KPX Ydieresis A -74
+KPX Ydieresis Aacute -74
+KPX Ydieresis Abreve -74
+KPX Ydieresis Acircumflex -74
+KPX Ydieresis Adieresis -74
+KPX Ydieresis Agrave -74
+KPX Ydieresis Amacron -74
+KPX Ydieresis Aogonek -74
+KPX Ydieresis Aring -74
+KPX Ydieresis Atilde -74
+KPX Ydieresis O -25
+KPX Ydieresis Oacute -25
+KPX Ydieresis Ocircumflex -25
+KPX Ydieresis Odieresis -25
+KPX Ydieresis Ograve -25
+KPX Ydieresis Ohungarumlaut -25
+KPX Ydieresis Omacron -25
+KPX Ydieresis Oslash -25
+KPX Ydieresis Otilde -25
+KPX Ydieresis a -92
+KPX Ydieresis aacute -92
+KPX Ydieresis abreve -92
+KPX Ydieresis acircumflex -92
+KPX Ydieresis adieresis -92
+KPX Ydieresis agrave -92
+KPX Ydieresis amacron -92
+KPX Ydieresis aogonek -92
+KPX Ydieresis aring -92
+KPX Ydieresis atilde -92
+KPX Ydieresis colon -92
+KPX Ydieresis comma -92
+KPX Ydieresis e -111
+KPX Ydieresis eacute -111
+KPX Ydieresis ecaron -111
+KPX Ydieresis ecircumflex -71
+KPX Ydieresis edieresis -71
+KPX Ydieresis edotaccent -111
+KPX Ydieresis egrave -71
+KPX Ydieresis emacron -71
+KPX Ydieresis eogonek -111
+KPX Ydieresis hyphen -92
+KPX Ydieresis i -55
+KPX Ydieresis iacute -55
+KPX Ydieresis iogonek -55
+KPX Ydieresis o -111
+KPX Ydieresis oacute -111
+KPX Ydieresis ocircumflex -111
+KPX Ydieresis odieresis -111
+KPX Ydieresis ograve -111
+KPX Ydieresis ohungarumlaut -111
+KPX Ydieresis omacron -111
+KPX Ydieresis oslash -111
+KPX Ydieresis otilde -111
+KPX Ydieresis period -74
+KPX Ydieresis semicolon -92
+KPX Ydieresis u -92
+KPX Ydieresis uacute -92
+KPX Ydieresis ucircumflex -92
+KPX Ydieresis udieresis -92
+KPX Ydieresis ugrave -92
+KPX Ydieresis uhungarumlaut -92
+KPX Ydieresis umacron -92
+KPX Ydieresis uogonek -92
+KPX Ydieresis uring -92
+KPX b b -10
+KPX b period -40
+KPX b u -20
+KPX b uacute -20
+KPX b ucircumflex -20
+KPX b udieresis -20
+KPX b ugrave -20
+KPX b uhungarumlaut -20
+KPX b umacron -20
+KPX b uogonek -20
+KPX b uring -20
+KPX c h -10
+KPX c k -10
+KPX c kcommaaccent -10
+KPX cacute h -10
+KPX cacute k -10
+KPX cacute kcommaaccent -10
+KPX ccaron h -10
+KPX ccaron k -10
+KPX ccaron kcommaaccent -10
+KPX ccedilla h -10
+KPX ccedilla k -10
+KPX ccedilla kcommaaccent -10
+KPX comma quotedblright -95
+KPX comma quoteright -95
+KPX e b -10
+KPX eacute b -10
+KPX ecaron b -10
+KPX ecircumflex b -10
+KPX edieresis b -10
+KPX edotaccent b -10
+KPX egrave b -10
+KPX emacron b -10
+KPX eogonek b -10
+KPX f comma -10
+KPX f dotlessi -30
+KPX f e -10
+KPX f eacute -10
+KPX f edotaccent -10
+KPX f eogonek -10
+KPX f f -18
+KPX f o -10
+KPX f oacute -10
+KPX f ocircumflex -10
+KPX f ograve -10
+KPX f ohungarumlaut -10
+KPX f oslash -10
+KPX f otilde -10
+KPX f period -10
+KPX f quoteright 55
+KPX k e -30
+KPX k eacute -30
+KPX k ecaron -30
+KPX k ecircumflex -30
+KPX k edieresis -30
+KPX k edotaccent -30
+KPX k egrave -30
+KPX k emacron -30
+KPX k eogonek -30
+KPX k o -10
+KPX k oacute -10
+KPX k ocircumflex -10
+KPX k odieresis -10
+KPX k ograve -10
+KPX k ohungarumlaut -10
+KPX k omacron -10
+KPX k oslash -10
+KPX k otilde -10
+KPX kcommaaccent e -30
+KPX kcommaaccent eacute -30
+KPX kcommaaccent ecaron -30
+KPX kcommaaccent ecircumflex -30
+KPX kcommaaccent edieresis -30
+KPX kcommaaccent edotaccent -30
+KPX kcommaaccent egrave -30
+KPX kcommaaccent emacron -30
+KPX kcommaaccent eogonek -30
+KPX kcommaaccent o -10
+KPX kcommaaccent oacute -10
+KPX kcommaaccent ocircumflex -10
+KPX kcommaaccent odieresis -10
+KPX kcommaaccent ograve -10
+KPX kcommaaccent ohungarumlaut -10
+KPX kcommaaccent omacron -10
+KPX kcommaaccent oslash -10
+KPX kcommaaccent otilde -10
+KPX n v -40
+KPX nacute v -40
+KPX ncaron v -40
+KPX ncommaaccent v -40
+KPX ntilde v -40
+KPX o v -15
+KPX o w -25
+KPX o x -10
+KPX o y -10
+KPX o yacute -10
+KPX o ydieresis -10
+KPX oacute v -15
+KPX oacute w -25
+KPX oacute x -10
+KPX oacute y -10
+KPX oacute yacute -10
+KPX oacute ydieresis -10
+KPX ocircumflex v -15
+KPX ocircumflex w -25
+KPX ocircumflex x -10
+KPX ocircumflex y -10
+KPX ocircumflex yacute -10
+KPX ocircumflex ydieresis -10
+KPX odieresis v -15
+KPX odieresis w -25
+KPX odieresis x -10
+KPX odieresis y -10
+KPX odieresis yacute -10
+KPX odieresis ydieresis -10
+KPX ograve v -15
+KPX ograve w -25
+KPX ograve x -10
+KPX ograve y -10
+KPX ograve yacute -10
+KPX ograve ydieresis -10
+KPX ohungarumlaut v -15
+KPX ohungarumlaut w -25
+KPX ohungarumlaut x -10
+KPX ohungarumlaut y -10
+KPX ohungarumlaut yacute -10
+KPX ohungarumlaut ydieresis -10
+KPX omacron v -15
+KPX omacron w -25
+KPX omacron x -10
+KPX omacron y -10
+KPX omacron yacute -10
+KPX omacron ydieresis -10
+KPX oslash v -15
+KPX oslash w -25
+KPX oslash x -10
+KPX oslash y -10
+KPX oslash yacute -10
+KPX oslash ydieresis -10
+KPX otilde v -15
+KPX otilde w -25
+KPX otilde x -10
+KPX otilde y -10
+KPX otilde yacute -10
+KPX otilde ydieresis -10
+KPX period quotedblright -95
+KPX period quoteright -95
+KPX quoteleft quoteleft -74
+KPX quoteright d -15
+KPX quoteright dcroat -15
+KPX quoteright quoteright -74
+KPX quoteright r -15
+KPX quoteright racute -15
+KPX quoteright rcaron -15
+KPX quoteright rcommaaccent -15
+KPX quoteright s -74
+KPX quoteright sacute -74
+KPX quoteright scaron -74
+KPX quoteright scedilla -74
+KPX quoteright scommaaccent -74
+KPX quoteright space -74
+KPX quoteright t -37
+KPX quoteright tcommaaccent -37
+KPX quoteright v -15
+KPX r comma -65
+KPX r period -65
+KPX racute comma -65
+KPX racute period -65
+KPX rcaron comma -65
+KPX rcaron period -65
+KPX rcommaaccent comma -65
+KPX rcommaaccent period -65
+KPX space A -37
+KPX space Aacute -37
+KPX space Abreve -37
+KPX space Acircumflex -37
+KPX space Adieresis -37
+KPX space Agrave -37
+KPX space Amacron -37
+KPX space Aogonek -37
+KPX space Aring -37
+KPX space Atilde -37
+KPX space V -70
+KPX space W -70
+KPX space Y -70
+KPX space Yacute -70
+KPX space Ydieresis -70
+KPX v comma -37
+KPX v e -15
+KPX v eacute -15
+KPX v ecaron -15
+KPX v ecircumflex -15
+KPX v edieresis -15
+KPX v edotaccent -15
+KPX v egrave -15
+KPX v emacron -15
+KPX v eogonek -15
+KPX v o -15
+KPX v oacute -15
+KPX v ocircumflex -15
+KPX v odieresis -15
+KPX v ograve -15
+KPX v ohungarumlaut -15
+KPX v omacron -15
+KPX v oslash -15
+KPX v otilde -15
+KPX v period -37
+KPX w a -10
+KPX w aacute -10
+KPX w abreve -10
+KPX w acircumflex -10
+KPX w adieresis -10
+KPX w agrave -10
+KPX w amacron -10
+KPX w aogonek -10
+KPX w aring -10
+KPX w atilde -10
+KPX w comma -37
+KPX w e -10
+KPX w eacute -10
+KPX w ecaron -10
+KPX w ecircumflex -10
+KPX w edieresis -10
+KPX w edotaccent -10
+KPX w egrave -10
+KPX w emacron -10
+KPX w eogonek -10
+KPX w o -15
+KPX w oacute -15
+KPX w ocircumflex -15
+KPX w odieresis -15
+KPX w ograve -15
+KPX w ohungarumlaut -15
+KPX w omacron -15
+KPX w oslash -15
+KPX w otilde -15
+KPX w period -37
+KPX x e -10
+KPX x eacute -10
+KPX x ecaron -10
+KPX x ecircumflex -10
+KPX x edieresis -10
+KPX x edotaccent -10
+KPX x egrave -10
+KPX x emacron -10
+KPX x eogonek -10
+KPX y comma -37
+KPX y period -37
+KPX yacute comma -37
+KPX yacute period -37
+KPX ydieresis comma -37
+KPX ydieresis period -37
+EndKernPairs
+EndKernData
+EndFontMetrics
diff --git a/src/main/resources/Resources/afm/Times-Italic.afm b/src/main/resources/Resources/afm/Times-Italic.afm
new file mode 100644
index 0000000..8de6e42
--- /dev/null
+++ b/src/main/resources/Resources/afm/Times-Italic.afm
@@ -0,0 +1,2667 @@
+StartFontMetrics 4.1
+Comment Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.
+Comment Creation Date: Thu May 1 12:56:55 1997
+Comment UniqueID 43067
+Comment VMusage 47727 58752
+FontName Times-Italic
+FullName Times Italic
+FamilyName Times
+Weight Medium
+ItalicAngle -15.5
+IsFixedPitch false
+CharacterSet ExtendedRoman
+FontBBox -169 -217 1010 883
+UnderlinePosition -100
+UnderlineThickness 50
+Version 002.000
+Notice Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.Times is a trademark of Linotype-Hell AG and/or its subsidiaries.
+EncodingScheme AdobeStandardEncoding
+CapHeight 653
+XHeight 441
+Ascender 683
+Descender -217
+StdHW 32
+StdVW 76
+StartCharMetrics 315
+C 32 ; WX 250 ; N space ; B 0 0 0 0 ;
+C 33 ; WX 333 ; N exclam ; B 39 -11 302 667 ;
+C 34 ; WX 420 ; N quotedbl ; B 144 421 432 666 ;
+C 35 ; WX 500 ; N numbersign ; B 2 0 540 676 ;
+C 36 ; WX 500 ; N dollar ; B 31 -89 497 731 ;
+C 37 ; WX 833 ; N percent ; B 79 -13 790 676 ;
+C 38 ; WX 778 ; N ampersand ; B 76 -18 723 666 ;
+C 39 ; WX 333 ; N quoteright ; B 151 436 290 666 ;
+C 40 ; WX 333 ; N parenleft ; B 42 -181 315 669 ;
+C 41 ; WX 333 ; N parenright ; B 16 -180 289 669 ;
+C 42 ; WX 500 ; N asterisk ; B 128 255 492 666 ;
+C 43 ; WX 675 ; N plus ; B 86 0 590 506 ;
+C 44 ; WX 250 ; N comma ; B -4 -129 135 101 ;
+C 45 ; WX 333 ; N hyphen ; B 49 192 282 255 ;
+C 46 ; WX 250 ; N period ; B 27 -11 138 100 ;
+C 47 ; WX 278 ; N slash ; B -65 -18 386 666 ;
+C 48 ; WX 500 ; N zero ; B 32 -7 497 676 ;
+C 49 ; WX 500 ; N one ; B 49 0 409 676 ;
+C 50 ; WX 500 ; N two ; B 12 0 452 676 ;
+C 51 ; WX 500 ; N three ; B 15 -7 465 676 ;
+C 52 ; WX 500 ; N four ; B 1 0 479 676 ;
+C 53 ; WX 500 ; N five ; B 15 -7 491 666 ;
+C 54 ; WX 500 ; N six ; B 30 -7 521 686 ;
+C 55 ; WX 500 ; N seven ; B 75 -8 537 666 ;
+C 56 ; WX 500 ; N eight ; B 30 -7 493 676 ;
+C 57 ; WX 500 ; N nine ; B 23 -17 492 676 ;
+C 58 ; WX 333 ; N colon ; B 50 -11 261 441 ;
+C 59 ; WX 333 ; N semicolon ; B 27 -129 261 441 ;
+C 60 ; WX 675 ; N less ; B 84 -8 592 514 ;
+C 61 ; WX 675 ; N equal ; B 86 120 590 386 ;
+C 62 ; WX 675 ; N greater ; B 84 -8 592 514 ;
+C 63 ; WX 500 ; N question ; B 132 -12 472 664 ;
+C 64 ; WX 920 ; N at ; B 118 -18 806 666 ;
+C 65 ; WX 611 ; N A ; B -51 0 564 668 ;
+C 66 ; WX 611 ; N B ; B -8 0 588 653 ;
+C 67 ; WX 667 ; N C ; B 66 -18 689 666 ;
+C 68 ; WX 722 ; N D ; B -8 0 700 653 ;
+C 69 ; WX 611 ; N E ; B -1 0 634 653 ;
+C 70 ; WX 611 ; N F ; B 8 0 645 653 ;
+C 71 ; WX 722 ; N G ; B 52 -18 722 666 ;
+C 72 ; WX 722 ; N H ; B -8 0 767 653 ;
+C 73 ; WX 333 ; N I ; B -8 0 384 653 ;
+C 74 ; WX 444 ; N J ; B -6 -18 491 653 ;
+C 75 ; WX 667 ; N K ; B 7 0 722 653 ;
+C 76 ; WX 556 ; N L ; B -8 0 559 653 ;
+C 77 ; WX 833 ; N M ; B -18 0 873 653 ;
+C 78 ; WX 667 ; N N ; B -20 -15 727 653 ;
+C 79 ; WX 722 ; N O ; B 60 -18 699 666 ;
+C 80 ; WX 611 ; N P ; B 0 0 605 653 ;
+C 81 ; WX 722 ; N Q ; B 59 -182 699 666 ;
+C 82 ; WX 611 ; N R ; B -13 0 588 653 ;
+C 83 ; WX 500 ; N S ; B 17 -18 508 667 ;
+C 84 ; WX 556 ; N T ; B 59 0 633 653 ;
+C 85 ; WX 722 ; N U ; B 102 -18 765 653 ;
+C 86 ; WX 611 ; N V ; B 76 -18 688 653 ;
+C 87 ; WX 833 ; N W ; B 71 -18 906 653 ;
+C 88 ; WX 611 ; N X ; B -29 0 655 653 ;
+C 89 ; WX 556 ; N Y ; B 78 0 633 653 ;
+C 90 ; WX 556 ; N Z ; B -6 0 606 653 ;
+C 91 ; WX 389 ; N bracketleft ; B 21 -153 391 663 ;
+C 92 ; WX 278 ; N backslash ; B -41 -18 319 666 ;
+C 93 ; WX 389 ; N bracketright ; B 12 -153 382 663 ;
+C 94 ; WX 422 ; N asciicircum ; B 0 301 422 666 ;
+C 95 ; WX 500 ; N underscore ; B 0 -125 500 -75 ;
+C 96 ; WX 333 ; N quoteleft ; B 171 436 310 666 ;
+C 97 ; WX 500 ; N a ; B 17 -11 476 441 ;
+C 98 ; WX 500 ; N b ; B 23 -11 473 683 ;
+C 99 ; WX 444 ; N c ; B 30 -11 425 441 ;
+C 100 ; WX 500 ; N d ; B 15 -13 527 683 ;
+C 101 ; WX 444 ; N e ; B 31 -11 412 441 ;
+C 102 ; WX 278 ; N f ; B -147 -207 424 678 ; L i fi ; L l fl ;
+C 103 ; WX 500 ; N g ; B 8 -206 472 441 ;
+C 104 ; WX 500 ; N h ; B 19 -9 478 683 ;
+C 105 ; WX 278 ; N i ; B 49 -11 264 654 ;
+C 106 ; WX 278 ; N j ; B -124 -207 276 654 ;
+C 107 ; WX 444 ; N k ; B 14 -11 461 683 ;
+C 108 ; WX 278 ; N l ; B 41 -11 279 683 ;
+C 109 ; WX 722 ; N m ; B 12 -9 704 441 ;
+C 110 ; WX 500 ; N n ; B 14 -9 474 441 ;
+C 111 ; WX 500 ; N o ; B 27 -11 468 441 ;
+C 112 ; WX 500 ; N p ; B -75 -205 469 441 ;
+C 113 ; WX 500 ; N q ; B 25 -209 483 441 ;
+C 114 ; WX 389 ; N r ; B 45 0 412 441 ;
+C 115 ; WX 389 ; N s ; B 16 -13 366 442 ;
+C 116 ; WX 278 ; N t ; B 37 -11 296 546 ;
+C 117 ; WX 500 ; N u ; B 42 -11 475 441 ;
+C 118 ; WX 444 ; N v ; B 21 -18 426 441 ;
+C 119 ; WX 667 ; N w ; B 16 -18 648 441 ;
+C 120 ; WX 444 ; N x ; B -27 -11 447 441 ;
+C 121 ; WX 444 ; N y ; B -24 -206 426 441 ;
+C 122 ; WX 389 ; N z ; B -2 -81 380 428 ;
+C 123 ; WX 400 ; N braceleft ; B 51 -177 407 687 ;
+C 124 ; WX 275 ; N bar ; B 105 -217 171 783 ;
+C 125 ; WX 400 ; N braceright ; B -7 -177 349 687 ;
+C 126 ; WX 541 ; N asciitilde ; B 40 183 502 323 ;
+C 161 ; WX 389 ; N exclamdown ; B 59 -205 322 473 ;
+C 162 ; WX 500 ; N cent ; B 77 -143 472 560 ;
+C 163 ; WX 500 ; N sterling ; B 10 -6 517 670 ;
+C 164 ; WX 167 ; N fraction ; B -169 -10 337 676 ;
+C 165 ; WX 500 ; N yen ; B 27 0 603 653 ;
+C 166 ; WX 500 ; N florin ; B 25 -182 507 682 ;
+C 167 ; WX 500 ; N section ; B 53 -162 461 666 ;
+C 168 ; WX 500 ; N currency ; B -22 53 522 597 ;
+C 169 ; WX 214 ; N quotesingle ; B 132 421 241 666 ;
+C 170 ; WX 556 ; N quotedblleft ; B 166 436 514 666 ;
+C 171 ; WX 500 ; N guillemotleft ; B 53 37 445 403 ;
+C 172 ; WX 333 ; N guilsinglleft ; B 51 37 281 403 ;
+C 173 ; WX 333 ; N guilsinglright ; B 52 37 282 403 ;
+C 174 ; WX 500 ; N fi ; B -141 -207 481 681 ;
+C 175 ; WX 500 ; N fl ; B -141 -204 518 682 ;
+C 177 ; WX 500 ; N endash ; B -6 197 505 243 ;
+C 178 ; WX 500 ; N dagger ; B 101 -159 488 666 ;
+C 179 ; WX 500 ; N daggerdbl ; B 22 -143 491 666 ;
+C 180 ; WX 250 ; N periodcentered ; B 70 199 181 310 ;
+C 182 ; WX 523 ; N paragraph ; B 55 -123 616 653 ;
+C 183 ; WX 350 ; N bullet ; B 40 191 310 461 ;
+C 184 ; WX 333 ; N quotesinglbase ; B 44 -129 183 101 ;
+C 185 ; WX 556 ; N quotedblbase ; B 57 -129 405 101 ;
+C 186 ; WX 556 ; N quotedblright ; B 151 436 499 666 ;
+C 187 ; WX 500 ; N guillemotright ; B 55 37 447 403 ;
+C 188 ; WX 889 ; N ellipsis ; B 57 -11 762 100 ;
+C 189 ; WX 1000 ; N perthousand ; B 25 -19 1010 706 ;
+C 191 ; WX 500 ; N questiondown ; B 28 -205 368 471 ;
+C 193 ; WX 333 ; N grave ; B 121 492 311 664 ;
+C 194 ; WX 333 ; N acute ; B 180 494 403 664 ;
+C 195 ; WX 333 ; N circumflex ; B 91 492 385 661 ;
+C 196 ; WX 333 ; N tilde ; B 100 517 427 624 ;
+C 197 ; WX 333 ; N macron ; B 99 532 411 583 ;
+C 198 ; WX 333 ; N breve ; B 117 492 418 650 ;
+C 199 ; WX 333 ; N dotaccent ; B 207 548 305 646 ;
+C 200 ; WX 333 ; N dieresis ; B 107 548 405 646 ;
+C 202 ; WX 333 ; N ring ; B 155 492 355 691 ;
+C 203 ; WX 333 ; N cedilla ; B -30 -217 182 0 ;
+C 205 ; WX 333 ; N hungarumlaut ; B 93 494 486 664 ;
+C 206 ; WX 333 ; N ogonek ; B 20 -169 203 40 ;
+C 207 ; WX 333 ; N caron ; B 121 492 426 661 ;
+C 208 ; WX 889 ; N emdash ; B -6 197 894 243 ;
+C 225 ; WX 889 ; N AE ; B -27 0 911 653 ;
+C 227 ; WX 276 ; N ordfeminine ; B 42 406 352 676 ;
+C 232 ; WX 556 ; N Lslash ; B -8 0 559 653 ;
+C 233 ; WX 722 ; N Oslash ; B 60 -105 699 722 ;
+C 234 ; WX 944 ; N OE ; B 49 -8 964 666 ;
+C 235 ; WX 310 ; N ordmasculine ; B 67 406 362 676 ;
+C 241 ; WX 667 ; N ae ; B 23 -11 640 441 ;
+C 245 ; WX 278 ; N dotlessi ; B 49 -11 235 441 ;
+C 248 ; WX 278 ; N lslash ; B 41 -11 312 683 ;
+C 249 ; WX 500 ; N oslash ; B 28 -135 469 554 ;
+C 250 ; WX 667 ; N oe ; B 20 -12 646 441 ;
+C 251 ; WX 500 ; N germandbls ; B -168 -207 493 679 ;
+C -1 ; WX 333 ; N Idieresis ; B -8 0 435 818 ;
+C -1 ; WX 444 ; N eacute ; B 31 -11 459 664 ;
+C -1 ; WX 500 ; N abreve ; B 17 -11 502 650 ;
+C -1 ; WX 500 ; N uhungarumlaut ; B 42 -11 580 664 ;
+C -1 ; WX 444 ; N ecaron ; B 31 -11 482 661 ;
+C -1 ; WX 556 ; N Ydieresis ; B 78 0 633 818 ;
+C -1 ; WX 675 ; N divide ; B 86 -11 590 517 ;
+C -1 ; WX 556 ; N Yacute ; B 78 0 633 876 ;
+C -1 ; WX 611 ; N Acircumflex ; B -51 0 564 873 ;
+C -1 ; WX 500 ; N aacute ; B 17 -11 487 664 ;
+C -1 ; WX 722 ; N Ucircumflex ; B 102 -18 765 873 ;
+C -1 ; WX 444 ; N yacute ; B -24 -206 459 664 ;
+C -1 ; WX 389 ; N scommaaccent ; B 16 -217 366 442 ;
+C -1 ; WX 444 ; N ecircumflex ; B 31 -11 441 661 ;
+C -1 ; WX 722 ; N Uring ; B 102 -18 765 883 ;
+C -1 ; WX 722 ; N Udieresis ; B 102 -18 765 818 ;
+C -1 ; WX 500 ; N aogonek ; B 17 -169 476 441 ;
+C -1 ; WX 722 ; N Uacute ; B 102 -18 765 876 ;
+C -1 ; WX 500 ; N uogonek ; B 42 -169 477 441 ;
+C -1 ; WX 611 ; N Edieresis ; B -1 0 634 818 ;
+C -1 ; WX 722 ; N Dcroat ; B -8 0 700 653 ;
+C -1 ; WX 250 ; N commaaccent ; B 8 -217 133 -50 ;
+C -1 ; WX 760 ; N copyright ; B 41 -18 719 666 ;
+C -1 ; WX 611 ; N Emacron ; B -1 0 634 795 ;
+C -1 ; WX 444 ; N ccaron ; B 30 -11 482 661 ;
+C -1 ; WX 500 ; N aring ; B 17 -11 476 691 ;
+C -1 ; WX 667 ; N Ncommaaccent ; B -20 -187 727 653 ;
+C -1 ; WX 278 ; N lacute ; B 41 -11 395 876 ;
+C -1 ; WX 500 ; N agrave ; B 17 -11 476 664 ;
+C -1 ; WX 556 ; N Tcommaaccent ; B 59 -217 633 653 ;
+C -1 ; WX 667 ; N Cacute ; B 66 -18 690 876 ;
+C -1 ; WX 500 ; N atilde ; B 17 -11 511 624 ;
+C -1 ; WX 611 ; N Edotaccent ; B -1 0 634 818 ;
+C -1 ; WX 389 ; N scaron ; B 16 -13 454 661 ;
+C -1 ; WX 389 ; N scedilla ; B 16 -217 366 442 ;
+C -1 ; WX 278 ; N iacute ; B 49 -11 355 664 ;
+C -1 ; WX 471 ; N lozenge ; B 13 0 459 724 ;
+C -1 ; WX 611 ; N Rcaron ; B -13 0 588 873 ;
+C -1 ; WX 722 ; N Gcommaaccent ; B 52 -217 722 666 ;
+C -1 ; WX 500 ; N ucircumflex ; B 42 -11 475 661 ;
+C -1 ; WX 500 ; N acircumflex ; B 17 -11 476 661 ;
+C -1 ; WX 611 ; N Amacron ; B -51 0 564 795 ;
+C -1 ; WX 389 ; N rcaron ; B 45 0 434 661 ;
+C -1 ; WX 444 ; N ccedilla ; B 30 -217 425 441 ;
+C -1 ; WX 556 ; N Zdotaccent ; B -6 0 606 818 ;
+C -1 ; WX 611 ; N Thorn ; B 0 0 569 653 ;
+C -1 ; WX 722 ; N Omacron ; B 60 -18 699 795 ;
+C -1 ; WX 611 ; N Racute ; B -13 0 588 876 ;
+C -1 ; WX 500 ; N Sacute ; B 17 -18 508 876 ;
+C -1 ; WX 544 ; N dcaron ; B 15 -13 658 683 ;
+C -1 ; WX 722 ; N Umacron ; B 102 -18 765 795 ;
+C -1 ; WX 500 ; N uring ; B 42 -11 475 691 ;
+C -1 ; WX 300 ; N threesuperior ; B 43 268 339 676 ;
+C -1 ; WX 722 ; N Ograve ; B 60 -18 699 876 ;
+C -1 ; WX 611 ; N Agrave ; B -51 0 564 876 ;
+C -1 ; WX 611 ; N Abreve ; B -51 0 564 862 ;
+C -1 ; WX 675 ; N multiply ; B 93 8 582 497 ;
+C -1 ; WX 500 ; N uacute ; B 42 -11 477 664 ;
+C -1 ; WX 556 ; N Tcaron ; B 59 0 633 873 ;
+C -1 ; WX 476 ; N partialdiff ; B 17 -38 459 710 ;
+C -1 ; WX 444 ; N ydieresis ; B -24 -206 441 606 ;
+C -1 ; WX 667 ; N Nacute ; B -20 -15 727 876 ;
+C -1 ; WX 278 ; N icircumflex ; B 33 -11 327 661 ;
+C -1 ; WX 611 ; N Ecircumflex ; B -1 0 634 873 ;
+C -1 ; WX 500 ; N adieresis ; B 17 -11 489 606 ;
+C -1 ; WX 444 ; N edieresis ; B 31 -11 451 606 ;
+C -1 ; WX 444 ; N cacute ; B 30 -11 459 664 ;
+C -1 ; WX 500 ; N nacute ; B 14 -9 477 664 ;
+C -1 ; WX 500 ; N umacron ; B 42 -11 485 583 ;
+C -1 ; WX 667 ; N Ncaron ; B -20 -15 727 873 ;
+C -1 ; WX 333 ; N Iacute ; B -8 0 433 876 ;
+C -1 ; WX 675 ; N plusminus ; B 86 0 590 506 ;
+C -1 ; WX 275 ; N brokenbar ; B 105 -142 171 708 ;
+C -1 ; WX 760 ; N registered ; B 41 -18 719 666 ;
+C -1 ; WX 722 ; N Gbreve ; B 52 -18 722 862 ;
+C -1 ; WX 333 ; N Idotaccent ; B -8 0 384 818 ;
+C -1 ; WX 600 ; N summation ; B 15 -10 585 706 ;
+C -1 ; WX 611 ; N Egrave ; B -1 0 634 876 ;
+C -1 ; WX 389 ; N racute ; B 45 0 431 664 ;
+C -1 ; WX 500 ; N omacron ; B 27 -11 495 583 ;
+C -1 ; WX 556 ; N Zacute ; B -6 0 606 876 ;
+C -1 ; WX 556 ; N Zcaron ; B -6 0 606 873 ;
+C -1 ; WX 549 ; N greaterequal ; B 26 0 523 658 ;
+C -1 ; WX 722 ; N Eth ; B -8 0 700 653 ;
+C -1 ; WX 667 ; N Ccedilla ; B 66 -217 689 666 ;
+C -1 ; WX 278 ; N lcommaaccent ; B 22 -217 279 683 ;
+C -1 ; WX 300 ; N tcaron ; B 37 -11 407 681 ;
+C -1 ; WX 444 ; N eogonek ; B 31 -169 412 441 ;
+C -1 ; WX 722 ; N Uogonek ; B 102 -184 765 653 ;
+C -1 ; WX 611 ; N Aacute ; B -51 0 564 876 ;
+C -1 ; WX 611 ; N Adieresis ; B -51 0 564 818 ;
+C -1 ; WX 444 ; N egrave ; B 31 -11 412 664 ;
+C -1 ; WX 389 ; N zacute ; B -2 -81 431 664 ;
+C -1 ; WX 278 ; N iogonek ; B 49 -169 264 654 ;
+C -1 ; WX 722 ; N Oacute ; B 60 -18 699 876 ;
+C -1 ; WX 500 ; N oacute ; B 27 -11 487 664 ;
+C -1 ; WX 500 ; N amacron ; B 17 -11 495 583 ;
+C -1 ; WX 389 ; N sacute ; B 16 -13 431 664 ;
+C -1 ; WX 278 ; N idieresis ; B 49 -11 352 606 ;
+C -1 ; WX 722 ; N Ocircumflex ; B 60 -18 699 873 ;
+C -1 ; WX 722 ; N Ugrave ; B 102 -18 765 876 ;
+C -1 ; WX 612 ; N Delta ; B 6 0 608 688 ;
+C -1 ; WX 500 ; N thorn ; B -75 -205 469 683 ;
+C -1 ; WX 300 ; N twosuperior ; B 33 271 324 676 ;
+C -1 ; WX 722 ; N Odieresis ; B 60 -18 699 818 ;
+C -1 ; WX 500 ; N mu ; B -30 -209 497 428 ;
+C -1 ; WX 278 ; N igrave ; B 49 -11 284 664 ;
+C -1 ; WX 500 ; N ohungarumlaut ; B 27 -11 590 664 ;
+C -1 ; WX 611 ; N Eogonek ; B -1 -169 634 653 ;
+C -1 ; WX 500 ; N dcroat ; B 15 -13 572 683 ;
+C -1 ; WX 750 ; N threequarters ; B 23 -10 736 676 ;
+C -1 ; WX 500 ; N Scedilla ; B 17 -217 508 667 ;
+C -1 ; WX 300 ; N lcaron ; B 41 -11 407 683 ;
+C -1 ; WX 667 ; N Kcommaaccent ; B 7 -217 722 653 ;
+C -1 ; WX 556 ; N Lacute ; B -8 0 559 876 ;
+C -1 ; WX 980 ; N trademark ; B 30 247 957 653 ;
+C -1 ; WX 444 ; N edotaccent ; B 31 -11 412 606 ;
+C -1 ; WX 333 ; N Igrave ; B -8 0 384 876 ;
+C -1 ; WX 333 ; N Imacron ; B -8 0 441 795 ;
+C -1 ; WX 611 ; N Lcaron ; B -8 0 586 653 ;
+C -1 ; WX 750 ; N onehalf ; B 34 -10 749 676 ;
+C -1 ; WX 549 ; N lessequal ; B 26 0 523 658 ;
+C -1 ; WX 500 ; N ocircumflex ; B 27 -11 468 661 ;
+C -1 ; WX 500 ; N ntilde ; B 14 -9 476 624 ;
+C -1 ; WX 722 ; N Uhungarumlaut ; B 102 -18 765 876 ;
+C -1 ; WX 611 ; N Eacute ; B -1 0 634 876 ;
+C -1 ; WX 444 ; N emacron ; B 31 -11 457 583 ;
+C -1 ; WX 500 ; N gbreve ; B 8 -206 487 650 ;
+C -1 ; WX 750 ; N onequarter ; B 33 -10 736 676 ;
+C -1 ; WX 500 ; N Scaron ; B 17 -18 520 873 ;
+C -1 ; WX 500 ; N Scommaaccent ; B 17 -217 508 667 ;
+C -1 ; WX 722 ; N Ohungarumlaut ; B 60 -18 699 876 ;
+C -1 ; WX 400 ; N degree ; B 101 390 387 676 ;
+C -1 ; WX 500 ; N ograve ; B 27 -11 468 664 ;
+C -1 ; WX 667 ; N Ccaron ; B 66 -18 689 873 ;
+C -1 ; WX 500 ; N ugrave ; B 42 -11 475 664 ;
+C -1 ; WX 453 ; N radical ; B 2 -60 452 768 ;
+C -1 ; WX 722 ; N Dcaron ; B -8 0 700 873 ;
+C -1 ; WX 389 ; N rcommaaccent ; B -3 -217 412 441 ;
+C -1 ; WX 667 ; N Ntilde ; B -20 -15 727 836 ;
+C -1 ; WX 500 ; N otilde ; B 27 -11 496 624 ;
+C -1 ; WX 611 ; N Rcommaaccent ; B -13 -187 588 653 ;
+C -1 ; WX 556 ; N Lcommaaccent ; B -8 -217 559 653 ;
+C -1 ; WX 611 ; N Atilde ; B -51 0 566 836 ;
+C -1 ; WX 611 ; N Aogonek ; B -51 -169 566 668 ;
+C -1 ; WX 611 ; N Aring ; B -51 0 564 883 ;
+C -1 ; WX 722 ; N Otilde ; B 60 -18 699 836 ;
+C -1 ; WX 389 ; N zdotaccent ; B -2 -81 380 606 ;
+C -1 ; WX 611 ; N Ecaron ; B -1 0 634 873 ;
+C -1 ; WX 333 ; N Iogonek ; B -8 -169 384 653 ;
+C -1 ; WX 444 ; N kcommaaccent ; B 14 -187 461 683 ;
+C -1 ; WX 675 ; N minus ; B 86 220 590 286 ;
+C -1 ; WX 333 ; N Icircumflex ; B -8 0 425 873 ;
+C -1 ; WX 500 ; N ncaron ; B 14 -9 510 661 ;
+C -1 ; WX 278 ; N tcommaaccent ; B 2 -217 296 546 ;
+C -1 ; WX 675 ; N logicalnot ; B 86 108 590 386 ;
+C -1 ; WX 500 ; N odieresis ; B 27 -11 489 606 ;
+C -1 ; WX 500 ; N udieresis ; B 42 -11 479 606 ;
+C -1 ; WX 549 ; N notequal ; B 12 -29 537 541 ;
+C -1 ; WX 500 ; N gcommaaccent ; B 8 -206 472 706 ;
+C -1 ; WX 500 ; N eth ; B 27 -11 482 683 ;
+C -1 ; WX 389 ; N zcaron ; B -2 -81 434 661 ;
+C -1 ; WX 500 ; N ncommaaccent ; B 14 -187 474 441 ;
+C -1 ; WX 300 ; N onesuperior ; B 43 271 284 676 ;
+C -1 ; WX 278 ; N imacron ; B 46 -11 311 583 ;
+C -1 ; WX 500 ; N Euro ; B 0 0 0 0 ;
+EndCharMetrics
+StartKernData
+StartKernPairs 2321
+KPX A C -30
+KPX A Cacute -30
+KPX A Ccaron -30
+KPX A Ccedilla -30
+KPX A G -35
+KPX A Gbreve -35
+KPX A Gcommaaccent -35
+KPX A O -40
+KPX A Oacute -40
+KPX A Ocircumflex -40
+KPX A Odieresis -40
+KPX A Ograve -40
+KPX A Ohungarumlaut -40
+KPX A Omacron -40
+KPX A Oslash -40
+KPX A Otilde -40
+KPX A Q -40
+KPX A T -37
+KPX A Tcaron -37
+KPX A Tcommaaccent -37
+KPX A U -50
+KPX A Uacute -50
+KPX A Ucircumflex -50
+KPX A Udieresis -50
+KPX A Ugrave -50
+KPX A Uhungarumlaut -50
+KPX A Umacron -50
+KPX A Uogonek -50
+KPX A Uring -50
+KPX A V -105
+KPX A W -95
+KPX A Y -55
+KPX A Yacute -55
+KPX A Ydieresis -55
+KPX A quoteright -37
+KPX A u -20
+KPX A uacute -20
+KPX A ucircumflex -20
+KPX A udieresis -20
+KPX A ugrave -20
+KPX A uhungarumlaut -20
+KPX A umacron -20
+KPX A uogonek -20
+KPX A uring -20
+KPX A v -55
+KPX A w -55
+KPX A y -55
+KPX A yacute -55
+KPX A ydieresis -55
+KPX Aacute C -30
+KPX Aacute Cacute -30
+KPX Aacute Ccaron -30
+KPX Aacute Ccedilla -30
+KPX Aacute G -35
+KPX Aacute Gbreve -35
+KPX Aacute Gcommaaccent -35
+KPX Aacute O -40
+KPX Aacute Oacute -40
+KPX Aacute Ocircumflex -40
+KPX Aacute Odieresis -40
+KPX Aacute Ograve -40
+KPX Aacute Ohungarumlaut -40
+KPX Aacute Omacron -40
+KPX Aacute Oslash -40
+KPX Aacute Otilde -40
+KPX Aacute Q -40
+KPX Aacute T -37
+KPX Aacute Tcaron -37
+KPX Aacute Tcommaaccent -37
+KPX Aacute U -50
+KPX Aacute Uacute -50
+KPX Aacute Ucircumflex -50
+KPX Aacute Udieresis -50
+KPX Aacute Ugrave -50
+KPX Aacute Uhungarumlaut -50
+KPX Aacute Umacron -50
+KPX Aacute Uogonek -50
+KPX Aacute Uring -50
+KPX Aacute V -105
+KPX Aacute W -95
+KPX Aacute Y -55
+KPX Aacute Yacute -55
+KPX Aacute Ydieresis -55
+KPX Aacute quoteright -37
+KPX Aacute u -20
+KPX Aacute uacute -20
+KPX Aacute ucircumflex -20
+KPX Aacute udieresis -20
+KPX Aacute ugrave -20
+KPX Aacute uhungarumlaut -20
+KPX Aacute umacron -20
+KPX Aacute uogonek -20
+KPX Aacute uring -20
+KPX Aacute v -55
+KPX Aacute w -55
+KPX Aacute y -55
+KPX Aacute yacute -55
+KPX Aacute ydieresis -55
+KPX Abreve C -30
+KPX Abreve Cacute -30
+KPX Abreve Ccaron -30
+KPX Abreve Ccedilla -30
+KPX Abreve G -35
+KPX Abreve Gbreve -35
+KPX Abreve Gcommaaccent -35
+KPX Abreve O -40
+KPX Abreve Oacute -40
+KPX Abreve Ocircumflex -40
+KPX Abreve Odieresis -40
+KPX Abreve Ograve -40
+KPX Abreve Ohungarumlaut -40
+KPX Abreve Omacron -40
+KPX Abreve Oslash -40
+KPX Abreve Otilde -40
+KPX Abreve Q -40
+KPX Abreve T -37
+KPX Abreve Tcaron -37
+KPX Abreve Tcommaaccent -37
+KPX Abreve U -50
+KPX Abreve Uacute -50
+KPX Abreve Ucircumflex -50
+KPX Abreve Udieresis -50
+KPX Abreve Ugrave -50
+KPX Abreve Uhungarumlaut -50
+KPX Abreve Umacron -50
+KPX Abreve Uogonek -50
+KPX Abreve Uring -50
+KPX Abreve V -105
+KPX Abreve W -95
+KPX Abreve Y -55
+KPX Abreve Yacute -55
+KPX Abreve Ydieresis -55
+KPX Abreve quoteright -37
+KPX Abreve u -20
+KPX Abreve uacute -20
+KPX Abreve ucircumflex -20
+KPX Abreve udieresis -20
+KPX Abreve ugrave -20
+KPX Abreve uhungarumlaut -20
+KPX Abreve umacron -20
+KPX Abreve uogonek -20
+KPX Abreve uring -20
+KPX Abreve v -55
+KPX Abreve w -55
+KPX Abreve y -55
+KPX Abreve yacute -55
+KPX Abreve ydieresis -55
+KPX Acircumflex C -30
+KPX Acircumflex Cacute -30
+KPX Acircumflex Ccaron -30
+KPX Acircumflex Ccedilla -30
+KPX Acircumflex G -35
+KPX Acircumflex Gbreve -35
+KPX Acircumflex Gcommaaccent -35
+KPX Acircumflex O -40
+KPX Acircumflex Oacute -40
+KPX Acircumflex Ocircumflex -40
+KPX Acircumflex Odieresis -40
+KPX Acircumflex Ograve -40
+KPX Acircumflex Ohungarumlaut -40
+KPX Acircumflex Omacron -40
+KPX Acircumflex Oslash -40
+KPX Acircumflex Otilde -40
+KPX Acircumflex Q -40
+KPX Acircumflex T -37
+KPX Acircumflex Tcaron -37
+KPX Acircumflex Tcommaaccent -37
+KPX Acircumflex U -50
+KPX Acircumflex Uacute -50
+KPX Acircumflex Ucircumflex -50
+KPX Acircumflex Udieresis -50
+KPX Acircumflex Ugrave -50
+KPX Acircumflex Uhungarumlaut -50
+KPX Acircumflex Umacron -50
+KPX Acircumflex Uogonek -50
+KPX Acircumflex Uring -50
+KPX Acircumflex V -105
+KPX Acircumflex W -95
+KPX Acircumflex Y -55
+KPX Acircumflex Yacute -55
+KPX Acircumflex Ydieresis -55
+KPX Acircumflex quoteright -37
+KPX Acircumflex u -20
+KPX Acircumflex uacute -20
+KPX Acircumflex ucircumflex -20
+KPX Acircumflex udieresis -20
+KPX Acircumflex ugrave -20
+KPX Acircumflex uhungarumlaut -20
+KPX Acircumflex umacron -20
+KPX Acircumflex uogonek -20
+KPX Acircumflex uring -20
+KPX Acircumflex v -55
+KPX Acircumflex w -55
+KPX Acircumflex y -55
+KPX Acircumflex yacute -55
+KPX Acircumflex ydieresis -55
+KPX Adieresis C -30
+KPX Adieresis Cacute -30
+KPX Adieresis Ccaron -30
+KPX Adieresis Ccedilla -30
+KPX Adieresis G -35
+KPX Adieresis Gbreve -35
+KPX Adieresis Gcommaaccent -35
+KPX Adieresis O -40
+KPX Adieresis Oacute -40
+KPX Adieresis Ocircumflex -40
+KPX Adieresis Odieresis -40
+KPX Adieresis Ograve -40
+KPX Adieresis Ohungarumlaut -40
+KPX Adieresis Omacron -40
+KPX Adieresis Oslash -40
+KPX Adieresis Otilde -40
+KPX Adieresis Q -40
+KPX Adieresis T -37
+KPX Adieresis Tcaron -37
+KPX Adieresis Tcommaaccent -37
+KPX Adieresis U -50
+KPX Adieresis Uacute -50
+KPX Adieresis Ucircumflex -50
+KPX Adieresis Udieresis -50
+KPX Adieresis Ugrave -50
+KPX Adieresis Uhungarumlaut -50
+KPX Adieresis Umacron -50
+KPX Adieresis Uogonek -50
+KPX Adieresis Uring -50
+KPX Adieresis V -105
+KPX Adieresis W -95
+KPX Adieresis Y -55
+KPX Adieresis Yacute -55
+KPX Adieresis Ydieresis -55
+KPX Adieresis quoteright -37
+KPX Adieresis u -20
+KPX Adieresis uacute -20
+KPX Adieresis ucircumflex -20
+KPX Adieresis udieresis -20
+KPX Adieresis ugrave -20
+KPX Adieresis uhungarumlaut -20
+KPX Adieresis umacron -20
+KPX Adieresis uogonek -20
+KPX Adieresis uring -20
+KPX Adieresis v -55
+KPX Adieresis w -55
+KPX Adieresis y -55
+KPX Adieresis yacute -55
+KPX Adieresis ydieresis -55
+KPX Agrave C -30
+KPX Agrave Cacute -30
+KPX Agrave Ccaron -30
+KPX Agrave Ccedilla -30
+KPX Agrave G -35
+KPX Agrave Gbreve -35
+KPX Agrave Gcommaaccent -35
+KPX Agrave O -40
+KPX Agrave Oacute -40
+KPX Agrave Ocircumflex -40
+KPX Agrave Odieresis -40
+KPX Agrave Ograve -40
+KPX Agrave Ohungarumlaut -40
+KPX Agrave Omacron -40
+KPX Agrave Oslash -40
+KPX Agrave Otilde -40
+KPX Agrave Q -40
+KPX Agrave T -37
+KPX Agrave Tcaron -37
+KPX Agrave Tcommaaccent -37
+KPX Agrave U -50
+KPX Agrave Uacute -50
+KPX Agrave Ucircumflex -50
+KPX Agrave Udieresis -50
+KPX Agrave Ugrave -50
+KPX Agrave Uhungarumlaut -50
+KPX Agrave Umacron -50
+KPX Agrave Uogonek -50
+KPX Agrave Uring -50
+KPX Agrave V -105
+KPX Agrave W -95
+KPX Agrave Y -55
+KPX Agrave Yacute -55
+KPX Agrave Ydieresis -55
+KPX Agrave quoteright -37
+KPX Agrave u -20
+KPX Agrave uacute -20
+KPX Agrave ucircumflex -20
+KPX Agrave udieresis -20
+KPX Agrave ugrave -20
+KPX Agrave uhungarumlaut -20
+KPX Agrave umacron -20
+KPX Agrave uogonek -20
+KPX Agrave uring -20
+KPX Agrave v -55
+KPX Agrave w -55
+KPX Agrave y -55
+KPX Agrave yacute -55
+KPX Agrave ydieresis -55
+KPX Amacron C -30
+KPX Amacron Cacute -30
+KPX Amacron Ccaron -30
+KPX Amacron Ccedilla -30
+KPX Amacron G -35
+KPX Amacron Gbreve -35
+KPX Amacron Gcommaaccent -35
+KPX Amacron O -40
+KPX Amacron Oacute -40
+KPX Amacron Ocircumflex -40
+KPX Amacron Odieresis -40
+KPX Amacron Ograve -40
+KPX Amacron Ohungarumlaut -40
+KPX Amacron Omacron -40
+KPX Amacron Oslash -40
+KPX Amacron Otilde -40
+KPX Amacron Q -40
+KPX Amacron T -37
+KPX Amacron Tcaron -37
+KPX Amacron Tcommaaccent -37
+KPX Amacron U -50
+KPX Amacron Uacute -50
+KPX Amacron Ucircumflex -50
+KPX Amacron Udieresis -50
+KPX Amacron Ugrave -50
+KPX Amacron Uhungarumlaut -50
+KPX Amacron Umacron -50
+KPX Amacron Uogonek -50
+KPX Amacron Uring -50
+KPX Amacron V -105
+KPX Amacron W -95
+KPX Amacron Y -55
+KPX Amacron Yacute -55
+KPX Amacron Ydieresis -55
+KPX Amacron quoteright -37
+KPX Amacron u -20
+KPX Amacron uacute -20
+KPX Amacron ucircumflex -20
+KPX Amacron udieresis -20
+KPX Amacron ugrave -20
+KPX Amacron uhungarumlaut -20
+KPX Amacron umacron -20
+KPX Amacron uogonek -20
+KPX Amacron uring -20
+KPX Amacron v -55
+KPX Amacron w -55
+KPX Amacron y -55
+KPX Amacron yacute -55
+KPX Amacron ydieresis -55
+KPX Aogonek C -30
+KPX Aogonek Cacute -30
+KPX Aogonek Ccaron -30
+KPX Aogonek Ccedilla -30
+KPX Aogonek G -35
+KPX Aogonek Gbreve -35
+KPX Aogonek Gcommaaccent -35
+KPX Aogonek O -40
+KPX Aogonek Oacute -40
+KPX Aogonek Ocircumflex -40
+KPX Aogonek Odieresis -40
+KPX Aogonek Ograve -40
+KPX Aogonek Ohungarumlaut -40
+KPX Aogonek Omacron -40
+KPX Aogonek Oslash -40
+KPX Aogonek Otilde -40
+KPX Aogonek Q -40
+KPX Aogonek T -37
+KPX Aogonek Tcaron -37
+KPX Aogonek Tcommaaccent -37
+KPX Aogonek U -50
+KPX Aogonek Uacute -50
+KPX Aogonek Ucircumflex -50
+KPX Aogonek Udieresis -50
+KPX Aogonek Ugrave -50
+KPX Aogonek Uhungarumlaut -50
+KPX Aogonek Umacron -50
+KPX Aogonek Uogonek -50
+KPX Aogonek Uring -50
+KPX Aogonek V -105
+KPX Aogonek W -95
+KPX Aogonek Y -55
+KPX Aogonek Yacute -55
+KPX Aogonek Ydieresis -55
+KPX Aogonek quoteright -37
+KPX Aogonek u -20
+KPX Aogonek uacute -20
+KPX Aogonek ucircumflex -20
+KPX Aogonek udieresis -20
+KPX Aogonek ugrave -20
+KPX Aogonek uhungarumlaut -20
+KPX Aogonek umacron -20
+KPX Aogonek uogonek -20
+KPX Aogonek uring -20
+KPX Aogonek v -55
+KPX Aogonek w -55
+KPX Aogonek y -55
+KPX Aogonek yacute -55
+KPX Aogonek ydieresis -55
+KPX Aring C -30
+KPX Aring Cacute -30
+KPX Aring Ccaron -30
+KPX Aring Ccedilla -30
+KPX Aring G -35
+KPX Aring Gbreve -35
+KPX Aring Gcommaaccent -35
+KPX Aring O -40
+KPX Aring Oacute -40
+KPX Aring Ocircumflex -40
+KPX Aring Odieresis -40
+KPX Aring Ograve -40
+KPX Aring Ohungarumlaut -40
+KPX Aring Omacron -40
+KPX Aring Oslash -40
+KPX Aring Otilde -40
+KPX Aring Q -40
+KPX Aring T -37
+KPX Aring Tcaron -37
+KPX Aring Tcommaaccent -37
+KPX Aring U -50
+KPX Aring Uacute -50
+KPX Aring Ucircumflex -50
+KPX Aring Udieresis -50
+KPX Aring Ugrave -50
+KPX Aring Uhungarumlaut -50
+KPX Aring Umacron -50
+KPX Aring Uogonek -50
+KPX Aring Uring -50
+KPX Aring V -105
+KPX Aring W -95
+KPX Aring Y -55
+KPX Aring Yacute -55
+KPX Aring Ydieresis -55
+KPX Aring quoteright -37
+KPX Aring u -20
+KPX Aring uacute -20
+KPX Aring ucircumflex -20
+KPX Aring udieresis -20
+KPX Aring ugrave -20
+KPX Aring uhungarumlaut -20
+KPX Aring umacron -20
+KPX Aring uogonek -20
+KPX Aring uring -20
+KPX Aring v -55
+KPX Aring w -55
+KPX Aring y -55
+KPX Aring yacute -55
+KPX Aring ydieresis -55
+KPX Atilde C -30
+KPX Atilde Cacute -30
+KPX Atilde Ccaron -30
+KPX Atilde Ccedilla -30
+KPX Atilde G -35
+KPX Atilde Gbreve -35
+KPX Atilde Gcommaaccent -35
+KPX Atilde O -40
+KPX Atilde Oacute -40
+KPX Atilde Ocircumflex -40
+KPX Atilde Odieresis -40
+KPX Atilde Ograve -40
+KPX Atilde Ohungarumlaut -40
+KPX Atilde Omacron -40
+KPX Atilde Oslash -40
+KPX Atilde Otilde -40
+KPX Atilde Q -40
+KPX Atilde T -37
+KPX Atilde Tcaron -37
+KPX Atilde Tcommaaccent -37
+KPX Atilde U -50
+KPX Atilde Uacute -50
+KPX Atilde Ucircumflex -50
+KPX Atilde Udieresis -50
+KPX Atilde Ugrave -50
+KPX Atilde Uhungarumlaut -50
+KPX Atilde Umacron -50
+KPX Atilde Uogonek -50
+KPX Atilde Uring -50
+KPX Atilde V -105
+KPX Atilde W -95
+KPX Atilde Y -55
+KPX Atilde Yacute -55
+KPX Atilde Ydieresis -55
+KPX Atilde quoteright -37
+KPX Atilde u -20
+KPX Atilde uacute -20
+KPX Atilde ucircumflex -20
+KPX Atilde udieresis -20
+KPX Atilde ugrave -20
+KPX Atilde uhungarumlaut -20
+KPX Atilde umacron -20
+KPX Atilde uogonek -20
+KPX Atilde uring -20
+KPX Atilde v -55
+KPX Atilde w -55
+KPX Atilde y -55
+KPX Atilde yacute -55
+KPX Atilde ydieresis -55
+KPX B A -25
+KPX B Aacute -25
+KPX B Abreve -25
+KPX B Acircumflex -25
+KPX B Adieresis -25
+KPX B Agrave -25
+KPX B Amacron -25
+KPX B Aogonek -25
+KPX B Aring -25
+KPX B Atilde -25
+KPX B U -10
+KPX B Uacute -10
+KPX B Ucircumflex -10
+KPX B Udieresis -10
+KPX B Ugrave -10
+KPX B Uhungarumlaut -10
+KPX B Umacron -10
+KPX B Uogonek -10
+KPX B Uring -10
+KPX D A -35
+KPX D Aacute -35
+KPX D Abreve -35
+KPX D Acircumflex -35
+KPX D Adieresis -35
+KPX D Agrave -35
+KPX D Amacron -35
+KPX D Aogonek -35
+KPX D Aring -35
+KPX D Atilde -35
+KPX D V -40
+KPX D W -40
+KPX D Y -40
+KPX D Yacute -40
+KPX D Ydieresis -40
+KPX Dcaron A -35
+KPX Dcaron Aacute -35
+KPX Dcaron Abreve -35
+KPX Dcaron Acircumflex -35
+KPX Dcaron Adieresis -35
+KPX Dcaron Agrave -35
+KPX Dcaron Amacron -35
+KPX Dcaron Aogonek -35
+KPX Dcaron Aring -35
+KPX Dcaron Atilde -35
+KPX Dcaron V -40
+KPX Dcaron W -40
+KPX Dcaron Y -40
+KPX Dcaron Yacute -40
+KPX Dcaron Ydieresis -40
+KPX Dcroat A -35
+KPX Dcroat Aacute -35
+KPX Dcroat Abreve -35
+KPX Dcroat Acircumflex -35
+KPX Dcroat Adieresis -35
+KPX Dcroat Agrave -35
+KPX Dcroat Amacron -35
+KPX Dcroat Aogonek -35
+KPX Dcroat Aring -35
+KPX Dcroat Atilde -35
+KPX Dcroat V -40
+KPX Dcroat W -40
+KPX Dcroat Y -40
+KPX Dcroat Yacute -40
+KPX Dcroat Ydieresis -40
+KPX F A -115
+KPX F Aacute -115
+KPX F Abreve -115
+KPX F Acircumflex -115
+KPX F Adieresis -115
+KPX F Agrave -115
+KPX F Amacron -115
+KPX F Aogonek -115
+KPX F Aring -115
+KPX F Atilde -115
+KPX F a -75
+KPX F aacute -75
+KPX F abreve -75
+KPX F acircumflex -75
+KPX F adieresis -75
+KPX F agrave -75
+KPX F amacron -75
+KPX F aogonek -75
+KPX F aring -75
+KPX F atilde -75
+KPX F comma -135
+KPX F e -75
+KPX F eacute -75
+KPX F ecaron -75
+KPX F ecircumflex -75
+KPX F edieresis -75
+KPX F edotaccent -75
+KPX F egrave -75
+KPX F emacron -75
+KPX F eogonek -75
+KPX F i -45
+KPX F iacute -45
+KPX F icircumflex -45
+KPX F idieresis -45
+KPX F igrave -45
+KPX F imacron -45
+KPX F iogonek -45
+KPX F o -105
+KPX F oacute -105
+KPX F ocircumflex -105
+KPX F odieresis -105
+KPX F ograve -105
+KPX F ohungarumlaut -105
+KPX F omacron -105
+KPX F oslash -105
+KPX F otilde -105
+KPX F period -135
+KPX F r -55
+KPX F racute -55
+KPX F rcaron -55
+KPX F rcommaaccent -55
+KPX J A -40
+KPX J Aacute -40
+KPX J Abreve -40
+KPX J Acircumflex -40
+KPX J Adieresis -40
+KPX J Agrave -40
+KPX J Amacron -40
+KPX J Aogonek -40
+KPX J Aring -40
+KPX J Atilde -40
+KPX J a -35
+KPX J aacute -35
+KPX J abreve -35
+KPX J acircumflex -35
+KPX J adieresis -35
+KPX J agrave -35
+KPX J amacron -35
+KPX J aogonek -35
+KPX J aring -35
+KPX J atilde -35
+KPX J comma -25
+KPX J e -25
+KPX J eacute -25
+KPX J ecaron -25
+KPX J ecircumflex -25
+KPX J edieresis -25
+KPX J edotaccent -25
+KPX J egrave -25
+KPX J emacron -25
+KPX J eogonek -25
+KPX J o -25
+KPX J oacute -25
+KPX J ocircumflex -25
+KPX J odieresis -25
+KPX J ograve -25
+KPX J ohungarumlaut -25
+KPX J omacron -25
+KPX J oslash -25
+KPX J otilde -25
+KPX J period -25
+KPX J u -35
+KPX J uacute -35
+KPX J ucircumflex -35
+KPX J udieresis -35
+KPX J ugrave -35
+KPX J uhungarumlaut -35
+KPX J umacron -35
+KPX J uogonek -35
+KPX J uring -35
+KPX K O -50
+KPX K Oacute -50
+KPX K Ocircumflex -50
+KPX K Odieresis -50
+KPX K Ograve -50
+KPX K Ohungarumlaut -50
+KPX K Omacron -50
+KPX K Oslash -50
+KPX K Otilde -50
+KPX K e -35
+KPX K eacute -35
+KPX K ecaron -35
+KPX K ecircumflex -35
+KPX K edieresis -35
+KPX K edotaccent -35
+KPX K egrave -35
+KPX K emacron -35
+KPX K eogonek -35
+KPX K o -40
+KPX K oacute -40
+KPX K ocircumflex -40
+KPX K odieresis -40
+KPX K ograve -40
+KPX K ohungarumlaut -40
+KPX K omacron -40
+KPX K oslash -40
+KPX K otilde -40
+KPX K u -40
+KPX K uacute -40
+KPX K ucircumflex -40
+KPX K udieresis -40
+KPX K ugrave -40
+KPX K uhungarumlaut -40
+KPX K umacron -40
+KPX K uogonek -40
+KPX K uring -40
+KPX K y -40
+KPX K yacute -40
+KPX K ydieresis -40
+KPX Kcommaaccent O -50
+KPX Kcommaaccent Oacute -50
+KPX Kcommaaccent Ocircumflex -50
+KPX Kcommaaccent Odieresis -50
+KPX Kcommaaccent Ograve -50
+KPX Kcommaaccent Ohungarumlaut -50
+KPX Kcommaaccent Omacron -50
+KPX Kcommaaccent Oslash -50
+KPX Kcommaaccent Otilde -50
+KPX Kcommaaccent e -35
+KPX Kcommaaccent eacute -35
+KPX Kcommaaccent ecaron -35
+KPX Kcommaaccent ecircumflex -35
+KPX Kcommaaccent edieresis -35
+KPX Kcommaaccent edotaccent -35
+KPX Kcommaaccent egrave -35
+KPX Kcommaaccent emacron -35
+KPX Kcommaaccent eogonek -35
+KPX Kcommaaccent o -40
+KPX Kcommaaccent oacute -40
+KPX Kcommaaccent ocircumflex -40
+KPX Kcommaaccent odieresis -40
+KPX Kcommaaccent ograve -40
+KPX Kcommaaccent ohungarumlaut -40
+KPX Kcommaaccent omacron -40
+KPX Kcommaaccent oslash -40
+KPX Kcommaaccent otilde -40
+KPX Kcommaaccent u -40
+KPX Kcommaaccent uacute -40
+KPX Kcommaaccent ucircumflex -40
+KPX Kcommaaccent udieresis -40
+KPX Kcommaaccent ugrave -40
+KPX Kcommaaccent uhungarumlaut -40
+KPX Kcommaaccent umacron -40
+KPX Kcommaaccent uogonek -40
+KPX Kcommaaccent uring -40
+KPX Kcommaaccent y -40
+KPX Kcommaaccent yacute -40
+KPX Kcommaaccent ydieresis -40
+KPX L T -20
+KPX L Tcaron -20
+KPX L Tcommaaccent -20
+KPX L V -55
+KPX L W -55
+KPX L Y -20
+KPX L Yacute -20
+KPX L Ydieresis -20
+KPX L quoteright -37
+KPX L y -30
+KPX L yacute -30
+KPX L ydieresis -30
+KPX Lacute T -20
+KPX Lacute Tcaron -20
+KPX Lacute Tcommaaccent -20
+KPX Lacute V -55
+KPX Lacute W -55
+KPX Lacute Y -20
+KPX Lacute Yacute -20
+KPX Lacute Ydieresis -20
+KPX Lacute quoteright -37
+KPX Lacute y -30
+KPX Lacute yacute -30
+KPX Lacute ydieresis -30
+KPX Lcommaaccent T -20
+KPX Lcommaaccent Tcaron -20
+KPX Lcommaaccent Tcommaaccent -20
+KPX Lcommaaccent V -55
+KPX Lcommaaccent W -55
+KPX Lcommaaccent Y -20
+KPX Lcommaaccent Yacute -20
+KPX Lcommaaccent Ydieresis -20
+KPX Lcommaaccent quoteright -37
+KPX Lcommaaccent y -30
+KPX Lcommaaccent yacute -30
+KPX Lcommaaccent ydieresis -30
+KPX Lslash T -20
+KPX Lslash Tcaron -20
+KPX Lslash Tcommaaccent -20
+KPX Lslash V -55
+KPX Lslash W -55
+KPX Lslash Y -20
+KPX Lslash Yacute -20
+KPX Lslash Ydieresis -20
+KPX Lslash quoteright -37
+KPX Lslash y -30
+KPX Lslash yacute -30
+KPX Lslash ydieresis -30
+KPX N A -27
+KPX N Aacute -27
+KPX N Abreve -27
+KPX N Acircumflex -27
+KPX N Adieresis -27
+KPX N Agrave -27
+KPX N Amacron -27
+KPX N Aogonek -27
+KPX N Aring -27
+KPX N Atilde -27
+KPX Nacute A -27
+KPX Nacute Aacute -27
+KPX Nacute Abreve -27
+KPX Nacute Acircumflex -27
+KPX Nacute Adieresis -27
+KPX Nacute Agrave -27
+KPX Nacute Amacron -27
+KPX Nacute Aogonek -27
+KPX Nacute Aring -27
+KPX Nacute Atilde -27
+KPX Ncaron A -27
+KPX Ncaron Aacute -27
+KPX Ncaron Abreve -27
+KPX Ncaron Acircumflex -27
+KPX Ncaron Adieresis -27
+KPX Ncaron Agrave -27
+KPX Ncaron Amacron -27
+KPX Ncaron Aogonek -27
+KPX Ncaron Aring -27
+KPX Ncaron Atilde -27
+KPX Ncommaaccent A -27
+KPX Ncommaaccent Aacute -27
+KPX Ncommaaccent Abreve -27
+KPX Ncommaaccent Acircumflex -27
+KPX Ncommaaccent Adieresis -27
+KPX Ncommaaccent Agrave -27
+KPX Ncommaaccent Amacron -27
+KPX Ncommaaccent Aogonek -27
+KPX Ncommaaccent Aring -27
+KPX Ncommaaccent Atilde -27
+KPX Ntilde A -27
+KPX Ntilde Aacute -27
+KPX Ntilde Abreve -27
+KPX Ntilde Acircumflex -27
+KPX Ntilde Adieresis -27
+KPX Ntilde Agrave -27
+KPX Ntilde Amacron -27
+KPX Ntilde Aogonek -27
+KPX Ntilde Aring -27
+KPX Ntilde Atilde -27
+KPX O A -55
+KPX O Aacute -55
+KPX O Abreve -55
+KPX O Acircumflex -55
+KPX O Adieresis -55
+KPX O Agrave -55
+KPX O Amacron -55
+KPX O Aogonek -55
+KPX O Aring -55
+KPX O Atilde -55
+KPX O T -40
+KPX O Tcaron -40
+KPX O Tcommaaccent -40
+KPX O V -50
+KPX O W -50
+KPX O X -40
+KPX O Y -50
+KPX O Yacute -50
+KPX O Ydieresis -50
+KPX Oacute A -55
+KPX Oacute Aacute -55
+KPX Oacute Abreve -55
+KPX Oacute Acircumflex -55
+KPX Oacute Adieresis -55
+KPX Oacute Agrave -55
+KPX Oacute Amacron -55
+KPX Oacute Aogonek -55
+KPX Oacute Aring -55
+KPX Oacute Atilde -55
+KPX Oacute T -40
+KPX Oacute Tcaron -40
+KPX Oacute Tcommaaccent -40
+KPX Oacute V -50
+KPX Oacute W -50
+KPX Oacute X -40
+KPX Oacute Y -50
+KPX Oacute Yacute -50
+KPX Oacute Ydieresis -50
+KPX Ocircumflex A -55
+KPX Ocircumflex Aacute -55
+KPX Ocircumflex Abreve -55
+KPX Ocircumflex Acircumflex -55
+KPX Ocircumflex Adieresis -55
+KPX Ocircumflex Agrave -55
+KPX Ocircumflex Amacron -55
+KPX Ocircumflex Aogonek -55
+KPX Ocircumflex Aring -55
+KPX Ocircumflex Atilde -55
+KPX Ocircumflex T -40
+KPX Ocircumflex Tcaron -40
+KPX Ocircumflex Tcommaaccent -40
+KPX Ocircumflex V -50
+KPX Ocircumflex W -50
+KPX Ocircumflex X -40
+KPX Ocircumflex Y -50
+KPX Ocircumflex Yacute -50
+KPX Ocircumflex Ydieresis -50
+KPX Odieresis A -55
+KPX Odieresis Aacute -55
+KPX Odieresis Abreve -55
+KPX Odieresis Acircumflex -55
+KPX Odieresis Adieresis -55
+KPX Odieresis Agrave -55
+KPX Odieresis Amacron -55
+KPX Odieresis Aogonek -55
+KPX Odieresis Aring -55
+KPX Odieresis Atilde -55
+KPX Odieresis T -40
+KPX Odieresis Tcaron -40
+KPX Odieresis Tcommaaccent -40
+KPX Odieresis V -50
+KPX Odieresis W -50
+KPX Odieresis X -40
+KPX Odieresis Y -50
+KPX Odieresis Yacute -50
+KPX Odieresis Ydieresis -50
+KPX Ograve A -55
+KPX Ograve Aacute -55
+KPX Ograve Abreve -55
+KPX Ograve Acircumflex -55
+KPX Ograve Adieresis -55
+KPX Ograve Agrave -55
+KPX Ograve Amacron -55
+KPX Ograve Aogonek -55
+KPX Ograve Aring -55
+KPX Ograve Atilde -55
+KPX Ograve T -40
+KPX Ograve Tcaron -40
+KPX Ograve Tcommaaccent -40
+KPX Ograve V -50
+KPX Ograve W -50
+KPX Ograve X -40
+KPX Ograve Y -50
+KPX Ograve Yacute -50
+KPX Ograve Ydieresis -50
+KPX Ohungarumlaut A -55
+KPX Ohungarumlaut Aacute -55
+KPX Ohungarumlaut Abreve -55
+KPX Ohungarumlaut Acircumflex -55
+KPX Ohungarumlaut Adieresis -55
+KPX Ohungarumlaut Agrave -55
+KPX Ohungarumlaut Amacron -55
+KPX Ohungarumlaut Aogonek -55
+KPX Ohungarumlaut Aring -55
+KPX Ohungarumlaut Atilde -55
+KPX Ohungarumlaut T -40
+KPX Ohungarumlaut Tcaron -40
+KPX Ohungarumlaut Tcommaaccent -40
+KPX Ohungarumlaut V -50
+KPX Ohungarumlaut W -50
+KPX Ohungarumlaut X -40
+KPX Ohungarumlaut Y -50
+KPX Ohungarumlaut Yacute -50
+KPX Ohungarumlaut Ydieresis -50
+KPX Omacron A -55
+KPX Omacron Aacute -55
+KPX Omacron Abreve -55
+KPX Omacron Acircumflex -55
+KPX Omacron Adieresis -55
+KPX Omacron Agrave -55
+KPX Omacron Amacron -55
+KPX Omacron Aogonek -55
+KPX Omacron Aring -55
+KPX Omacron Atilde -55
+KPX Omacron T -40
+KPX Omacron Tcaron -40
+KPX Omacron Tcommaaccent -40
+KPX Omacron V -50
+KPX Omacron W -50
+KPX Omacron X -40
+KPX Omacron Y -50
+KPX Omacron Yacute -50
+KPX Omacron Ydieresis -50
+KPX Oslash A -55
+KPX Oslash Aacute -55
+KPX Oslash Abreve -55
+KPX Oslash Acircumflex -55
+KPX Oslash Adieresis -55
+KPX Oslash Agrave -55
+KPX Oslash Amacron -55
+KPX Oslash Aogonek -55
+KPX Oslash Aring -55
+KPX Oslash Atilde -55
+KPX Oslash T -40
+KPX Oslash Tcaron -40
+KPX Oslash Tcommaaccent -40
+KPX Oslash V -50
+KPX Oslash W -50
+KPX Oslash X -40
+KPX Oslash Y -50
+KPX Oslash Yacute -50
+KPX Oslash Ydieresis -50
+KPX Otilde A -55
+KPX Otilde Aacute -55
+KPX Otilde Abreve -55
+KPX Otilde Acircumflex -55
+KPX Otilde Adieresis -55
+KPX Otilde Agrave -55
+KPX Otilde Amacron -55
+KPX Otilde Aogonek -55
+KPX Otilde Aring -55
+KPX Otilde Atilde -55
+KPX Otilde T -40
+KPX Otilde Tcaron -40
+KPX Otilde Tcommaaccent -40
+KPX Otilde V -50
+KPX Otilde W -50
+KPX Otilde X -40
+KPX Otilde Y -50
+KPX Otilde Yacute -50
+KPX Otilde Ydieresis -50
+KPX P A -90
+KPX P Aacute -90
+KPX P Abreve -90
+KPX P Acircumflex -90
+KPX P Adieresis -90
+KPX P Agrave -90
+KPX P Amacron -90
+KPX P Aogonek -90
+KPX P Aring -90
+KPX P Atilde -90
+KPX P a -80
+KPX P aacute -80
+KPX P abreve -80
+KPX P acircumflex -80
+KPX P adieresis -80
+KPX P agrave -80
+KPX P amacron -80
+KPX P aogonek -80
+KPX P aring -80
+KPX P atilde -80
+KPX P comma -135
+KPX P e -80
+KPX P eacute -80
+KPX P ecaron -80
+KPX P ecircumflex -80
+KPX P edieresis -80
+KPX P edotaccent -80
+KPX P egrave -80
+KPX P emacron -80
+KPX P eogonek -80
+KPX P o -80
+KPX P oacute -80
+KPX P ocircumflex -80
+KPX P odieresis -80
+KPX P ograve -80
+KPX P ohungarumlaut -80
+KPX P omacron -80
+KPX P oslash -80
+KPX P otilde -80
+KPX P period -135
+KPX Q U -10
+KPX Q Uacute -10
+KPX Q Ucircumflex -10
+KPX Q Udieresis -10
+KPX Q Ugrave -10
+KPX Q Uhungarumlaut -10
+KPX Q Umacron -10
+KPX Q Uogonek -10
+KPX Q Uring -10
+KPX R O -40
+KPX R Oacute -40
+KPX R Ocircumflex -40
+KPX R Odieresis -40
+KPX R Ograve -40
+KPX R Ohungarumlaut -40
+KPX R Omacron -40
+KPX R Oslash -40
+KPX R Otilde -40
+KPX R U -40
+KPX R Uacute -40
+KPX R Ucircumflex -40
+KPX R Udieresis -40
+KPX R Ugrave -40
+KPX R Uhungarumlaut -40
+KPX R Umacron -40
+KPX R Uogonek -40
+KPX R Uring -40
+KPX R V -18
+KPX R W -18
+KPX R Y -18
+KPX R Yacute -18
+KPX R Ydieresis -18
+KPX Racute O -40
+KPX Racute Oacute -40
+KPX Racute Ocircumflex -40
+KPX Racute Odieresis -40
+KPX Racute Ograve -40
+KPX Racute Ohungarumlaut -40
+KPX Racute Omacron -40
+KPX Racute Oslash -40
+KPX Racute Otilde -40
+KPX Racute U -40
+KPX Racute Uacute -40
+KPX Racute Ucircumflex -40
+KPX Racute Udieresis -40
+KPX Racute Ugrave -40
+KPX Racute Uhungarumlaut -40
+KPX Racute Umacron -40
+KPX Racute Uogonek -40
+KPX Racute Uring -40
+KPX Racute V -18
+KPX Racute W -18
+KPX Racute Y -18
+KPX Racute Yacute -18
+KPX Racute Ydieresis -18
+KPX Rcaron O -40
+KPX Rcaron Oacute -40
+KPX Rcaron Ocircumflex -40
+KPX Rcaron Odieresis -40
+KPX Rcaron Ograve -40
+KPX Rcaron Ohungarumlaut -40
+KPX Rcaron Omacron -40
+KPX Rcaron Oslash -40
+KPX Rcaron Otilde -40
+KPX Rcaron U -40
+KPX Rcaron Uacute -40
+KPX Rcaron Ucircumflex -40
+KPX Rcaron Udieresis -40
+KPX Rcaron Ugrave -40
+KPX Rcaron Uhungarumlaut -40
+KPX Rcaron Umacron -40
+KPX Rcaron Uogonek -40
+KPX Rcaron Uring -40
+KPX Rcaron V -18
+KPX Rcaron W -18
+KPX Rcaron Y -18
+KPX Rcaron Yacute -18
+KPX Rcaron Ydieresis -18
+KPX Rcommaaccent O -40
+KPX Rcommaaccent Oacute -40
+KPX Rcommaaccent Ocircumflex -40
+KPX Rcommaaccent Odieresis -40
+KPX Rcommaaccent Ograve -40
+KPX Rcommaaccent Ohungarumlaut -40
+KPX Rcommaaccent Omacron -40
+KPX Rcommaaccent Oslash -40
+KPX Rcommaaccent Otilde -40
+KPX Rcommaaccent U -40
+KPX Rcommaaccent Uacute -40
+KPX Rcommaaccent Ucircumflex -40
+KPX Rcommaaccent Udieresis -40
+KPX Rcommaaccent Ugrave -40
+KPX Rcommaaccent Uhungarumlaut -40
+KPX Rcommaaccent Umacron -40
+KPX Rcommaaccent Uogonek -40
+KPX Rcommaaccent Uring -40
+KPX Rcommaaccent V -18
+KPX Rcommaaccent W -18
+KPX Rcommaaccent Y -18
+KPX Rcommaaccent Yacute -18
+KPX Rcommaaccent Ydieresis -18
+KPX T A -50
+KPX T Aacute -50
+KPX T Abreve -50
+KPX T Acircumflex -50
+KPX T Adieresis -50
+KPX T Agrave -50
+KPX T Amacron -50
+KPX T Aogonek -50
+KPX T Aring -50
+KPX T Atilde -50
+KPX T O -18
+KPX T Oacute -18
+KPX T Ocircumflex -18
+KPX T Odieresis -18
+KPX T Ograve -18
+KPX T Ohungarumlaut -18
+KPX T Omacron -18
+KPX T Oslash -18
+KPX T Otilde -18
+KPX T a -92
+KPX T aacute -92
+KPX T abreve -92
+KPX T acircumflex -92
+KPX T adieresis -92
+KPX T agrave -92
+KPX T amacron -92
+KPX T aogonek -92
+KPX T aring -92
+KPX T atilde -92
+KPX T colon -55
+KPX T comma -74
+KPX T e -92
+KPX T eacute -92
+KPX T ecaron -92
+KPX T ecircumflex -52
+KPX T edieresis -52
+KPX T edotaccent -92
+KPX T egrave -52
+KPX T emacron -52
+KPX T eogonek -92
+KPX T hyphen -74
+KPX T i -55
+KPX T iacute -55
+KPX T iogonek -55
+KPX T o -92
+KPX T oacute -92
+KPX T ocircumflex -92
+KPX T odieresis -92
+KPX T ograve -92
+KPX T ohungarumlaut -92
+KPX T omacron -92
+KPX T oslash -92
+KPX T otilde -92
+KPX T period -74
+KPX T r -55
+KPX T racute -55
+KPX T rcaron -55
+KPX T rcommaaccent -55
+KPX T semicolon -65
+KPX T u -55
+KPX T uacute -55
+KPX T ucircumflex -55
+KPX T udieresis -55
+KPX T ugrave -55
+KPX T uhungarumlaut -55
+KPX T umacron -55
+KPX T uogonek -55
+KPX T uring -55
+KPX T w -74
+KPX T y -74
+KPX T yacute -74
+KPX T ydieresis -34
+KPX Tcaron A -50
+KPX Tcaron Aacute -50
+KPX Tcaron Abreve -50
+KPX Tcaron Acircumflex -50
+KPX Tcaron Adieresis -50
+KPX Tcaron Agrave -50
+KPX Tcaron Amacron -50
+KPX Tcaron Aogonek -50
+KPX Tcaron Aring -50
+KPX Tcaron Atilde -50
+KPX Tcaron O -18
+KPX Tcaron Oacute -18
+KPX Tcaron Ocircumflex -18
+KPX Tcaron Odieresis -18
+KPX Tcaron Ograve -18
+KPX Tcaron Ohungarumlaut -18
+KPX Tcaron Omacron -18
+KPX Tcaron Oslash -18
+KPX Tcaron Otilde -18
+KPX Tcaron a -92
+KPX Tcaron aacute -92
+KPX Tcaron abreve -92
+KPX Tcaron acircumflex -92
+KPX Tcaron adieresis -92
+KPX Tcaron agrave -92
+KPX Tcaron amacron -92
+KPX Tcaron aogonek -92
+KPX Tcaron aring -92
+KPX Tcaron atilde -92
+KPX Tcaron colon -55
+KPX Tcaron comma -74
+KPX Tcaron e -92
+KPX Tcaron eacute -92
+KPX Tcaron ecaron -92
+KPX Tcaron ecircumflex -52
+KPX Tcaron edieresis -52
+KPX Tcaron edotaccent -92
+KPX Tcaron egrave -52
+KPX Tcaron emacron -52
+KPX Tcaron eogonek -92
+KPX Tcaron hyphen -74
+KPX Tcaron i -55
+KPX Tcaron iacute -55
+KPX Tcaron iogonek -55
+KPX Tcaron o -92
+KPX Tcaron oacute -92
+KPX Tcaron ocircumflex -92
+KPX Tcaron odieresis -92
+KPX Tcaron ograve -92
+KPX Tcaron ohungarumlaut -92
+KPX Tcaron omacron -92
+KPX Tcaron oslash -92
+KPX Tcaron otilde -92
+KPX Tcaron period -74
+KPX Tcaron r -55
+KPX Tcaron racute -55
+KPX Tcaron rcaron -55
+KPX Tcaron rcommaaccent -55
+KPX Tcaron semicolon -65
+KPX Tcaron u -55
+KPX Tcaron uacute -55
+KPX Tcaron ucircumflex -55
+KPX Tcaron udieresis -55
+KPX Tcaron ugrave -55
+KPX Tcaron uhungarumlaut -55
+KPX Tcaron umacron -55
+KPX Tcaron uogonek -55
+KPX Tcaron uring -55
+KPX Tcaron w -74
+KPX Tcaron y -74
+KPX Tcaron yacute -74
+KPX Tcaron ydieresis -34
+KPX Tcommaaccent A -50
+KPX Tcommaaccent Aacute -50
+KPX Tcommaaccent Abreve -50
+KPX Tcommaaccent Acircumflex -50
+KPX Tcommaaccent Adieresis -50
+KPX Tcommaaccent Agrave -50
+KPX Tcommaaccent Amacron -50
+KPX Tcommaaccent Aogonek -50
+KPX Tcommaaccent Aring -50
+KPX Tcommaaccent Atilde -50
+KPX Tcommaaccent O -18
+KPX Tcommaaccent Oacute -18
+KPX Tcommaaccent Ocircumflex -18
+KPX Tcommaaccent Odieresis -18
+KPX Tcommaaccent Ograve -18
+KPX Tcommaaccent Ohungarumlaut -18
+KPX Tcommaaccent Omacron -18
+KPX Tcommaaccent Oslash -18
+KPX Tcommaaccent Otilde -18
+KPX Tcommaaccent a -92
+KPX Tcommaaccent aacute -92
+KPX Tcommaaccent abreve -92
+KPX Tcommaaccent acircumflex -92
+KPX Tcommaaccent adieresis -92
+KPX Tcommaaccent agrave -92
+KPX Tcommaaccent amacron -92
+KPX Tcommaaccent aogonek -92
+KPX Tcommaaccent aring -92
+KPX Tcommaaccent atilde -92
+KPX Tcommaaccent colon -55
+KPX Tcommaaccent comma -74
+KPX Tcommaaccent e -92
+KPX Tcommaaccent eacute -92
+KPX Tcommaaccent ecaron -92
+KPX Tcommaaccent ecircumflex -52
+KPX Tcommaaccent edieresis -52
+KPX Tcommaaccent edotaccent -92
+KPX Tcommaaccent egrave -52
+KPX Tcommaaccent emacron -52
+KPX Tcommaaccent eogonek -92
+KPX Tcommaaccent hyphen -74
+KPX Tcommaaccent i -55
+KPX Tcommaaccent iacute -55
+KPX Tcommaaccent iogonek -55
+KPX Tcommaaccent o -92
+KPX Tcommaaccent oacute -92
+KPX Tcommaaccent ocircumflex -92
+KPX Tcommaaccent odieresis -92
+KPX Tcommaaccent ograve -92
+KPX Tcommaaccent ohungarumlaut -92
+KPX Tcommaaccent omacron -92
+KPX Tcommaaccent oslash -92
+KPX Tcommaaccent otilde -92
+KPX Tcommaaccent period -74
+KPX Tcommaaccent r -55
+KPX Tcommaaccent racute -55
+KPX Tcommaaccent rcaron -55
+KPX Tcommaaccent rcommaaccent -55
+KPX Tcommaaccent semicolon -65
+KPX Tcommaaccent u -55
+KPX Tcommaaccent uacute -55
+KPX Tcommaaccent ucircumflex -55
+KPX Tcommaaccent udieresis -55
+KPX Tcommaaccent ugrave -55
+KPX Tcommaaccent uhungarumlaut -55
+KPX Tcommaaccent umacron -55
+KPX Tcommaaccent uogonek -55
+KPX Tcommaaccent uring -55
+KPX Tcommaaccent w -74
+KPX Tcommaaccent y -74
+KPX Tcommaaccent yacute -74
+KPX Tcommaaccent ydieresis -34
+KPX U A -40
+KPX U Aacute -40
+KPX U Abreve -40
+KPX U Acircumflex -40
+KPX U Adieresis -40
+KPX U Agrave -40
+KPX U Amacron -40
+KPX U Aogonek -40
+KPX U Aring -40
+KPX U Atilde -40
+KPX U comma -25
+KPX U period -25
+KPX Uacute A -40
+KPX Uacute Aacute -40
+KPX Uacute Abreve -40
+KPX Uacute Acircumflex -40
+KPX Uacute Adieresis -40
+KPX Uacute Agrave -40
+KPX Uacute Amacron -40
+KPX Uacute Aogonek -40
+KPX Uacute Aring -40
+KPX Uacute Atilde -40
+KPX Uacute comma -25
+KPX Uacute period -25
+KPX Ucircumflex A -40
+KPX Ucircumflex Aacute -40
+KPX Ucircumflex Abreve -40
+KPX Ucircumflex Acircumflex -40
+KPX Ucircumflex Adieresis -40
+KPX Ucircumflex Agrave -40
+KPX Ucircumflex Amacron -40
+KPX Ucircumflex Aogonek -40
+KPX Ucircumflex Aring -40
+KPX Ucircumflex Atilde -40
+KPX Ucircumflex comma -25
+KPX Ucircumflex period -25
+KPX Udieresis A -40
+KPX Udieresis Aacute -40
+KPX Udieresis Abreve -40
+KPX Udieresis Acircumflex -40
+KPX Udieresis Adieresis -40
+KPX Udieresis Agrave -40
+KPX Udieresis Amacron -40
+KPX Udieresis Aogonek -40
+KPX Udieresis Aring -40
+KPX Udieresis Atilde -40
+KPX Udieresis comma -25
+KPX Udieresis period -25
+KPX Ugrave A -40
+KPX Ugrave Aacute -40
+KPX Ugrave Abreve -40
+KPX Ugrave Acircumflex -40
+KPX Ugrave Adieresis -40
+KPX Ugrave Agrave -40
+KPX Ugrave Amacron -40
+KPX Ugrave Aogonek -40
+KPX Ugrave Aring -40
+KPX Ugrave Atilde -40
+KPX Ugrave comma -25
+KPX Ugrave period -25
+KPX Uhungarumlaut A -40
+KPX Uhungarumlaut Aacute -40
+KPX Uhungarumlaut Abreve -40
+KPX Uhungarumlaut Acircumflex -40
+KPX Uhungarumlaut Adieresis -40
+KPX Uhungarumlaut Agrave -40
+KPX Uhungarumlaut Amacron -40
+KPX Uhungarumlaut Aogonek -40
+KPX Uhungarumlaut Aring -40
+KPX Uhungarumlaut Atilde -40
+KPX Uhungarumlaut comma -25
+KPX Uhungarumlaut period -25
+KPX Umacron A -40
+KPX Umacron Aacute -40
+KPX Umacron Abreve -40
+KPX Umacron Acircumflex -40
+KPX Umacron Adieresis -40
+KPX Umacron Agrave -40
+KPX Umacron Amacron -40
+KPX Umacron Aogonek -40
+KPX Umacron Aring -40
+KPX Umacron Atilde -40
+KPX Umacron comma -25
+KPX Umacron period -25
+KPX Uogonek A -40
+KPX Uogonek Aacute -40
+KPX Uogonek Abreve -40
+KPX Uogonek Acircumflex -40
+KPX Uogonek Adieresis -40
+KPX Uogonek Agrave -40
+KPX Uogonek Amacron -40
+KPX Uogonek Aogonek -40
+KPX Uogonek Aring -40
+KPX Uogonek Atilde -40
+KPX Uogonek comma -25
+KPX Uogonek period -25
+KPX Uring A -40
+KPX Uring Aacute -40
+KPX Uring Abreve -40
+KPX Uring Acircumflex -40
+KPX Uring Adieresis -40
+KPX Uring Agrave -40
+KPX Uring Amacron -40
+KPX Uring Aogonek -40
+KPX Uring Aring -40
+KPX Uring Atilde -40
+KPX Uring comma -25
+KPX Uring period -25
+KPX V A -60
+KPX V Aacute -60
+KPX V Abreve -60
+KPX V Acircumflex -60
+KPX V Adieresis -60
+KPX V Agrave -60
+KPX V Amacron -60
+KPX V Aogonek -60
+KPX V Aring -60
+KPX V Atilde -60
+KPX V O -30
+KPX V Oacute -30
+KPX V Ocircumflex -30
+KPX V Odieresis -30
+KPX V Ograve -30
+KPX V Ohungarumlaut -30
+KPX V Omacron -30
+KPX V Oslash -30
+KPX V Otilde -30
+KPX V a -111
+KPX V aacute -111
+KPX V abreve -111
+KPX V acircumflex -111
+KPX V adieresis -111
+KPX V agrave -111
+KPX V amacron -111
+KPX V aogonek -111
+KPX V aring -111
+KPX V atilde -111
+KPX V colon -65
+KPX V comma -129
+KPX V e -111
+KPX V eacute -111
+KPX V ecaron -111
+KPX V ecircumflex -111
+KPX V edieresis -71
+KPX V edotaccent -111
+KPX V egrave -71
+KPX V emacron -71
+KPX V eogonek -111
+KPX V hyphen -55
+KPX V i -74
+KPX V iacute -74
+KPX V icircumflex -34
+KPX V idieresis -34
+KPX V igrave -34
+KPX V imacron -34
+KPX V iogonek -74
+KPX V o -111
+KPX V oacute -111
+KPX V ocircumflex -111
+KPX V odieresis -111
+KPX V ograve -111
+KPX V ohungarumlaut -111
+KPX V omacron -111
+KPX V oslash -111
+KPX V otilde -111
+KPX V period -129
+KPX V semicolon -74
+KPX V u -74
+KPX V uacute -74
+KPX V ucircumflex -74
+KPX V udieresis -74
+KPX V ugrave -74
+KPX V uhungarumlaut -74
+KPX V umacron -74
+KPX V uogonek -74
+KPX V uring -74
+KPX W A -60
+KPX W Aacute -60
+KPX W Abreve -60
+KPX W Acircumflex -60
+KPX W Adieresis -60
+KPX W Agrave -60
+KPX W Amacron -60
+KPX W Aogonek -60
+KPX W Aring -60
+KPX W Atilde -60
+KPX W O -25
+KPX W Oacute -25
+KPX W Ocircumflex -25
+KPX W Odieresis -25
+KPX W Ograve -25
+KPX W Ohungarumlaut -25
+KPX W Omacron -25
+KPX W Oslash -25
+KPX W Otilde -25
+KPX W a -92
+KPX W aacute -92
+KPX W abreve -92
+KPX W acircumflex -92
+KPX W adieresis -92
+KPX W agrave -92
+KPX W amacron -92
+KPX W aogonek -92
+KPX W aring -92
+KPX W atilde -92
+KPX W colon -65
+KPX W comma -92
+KPX W e -92
+KPX W eacute -92
+KPX W ecaron -92
+KPX W ecircumflex -92
+KPX W edieresis -52
+KPX W edotaccent -92
+KPX W egrave -52
+KPX W emacron -52
+KPX W eogonek -92
+KPX W hyphen -37
+KPX W i -55
+KPX W iacute -55
+KPX W iogonek -55
+KPX W o -92
+KPX W oacute -92
+KPX W ocircumflex -92
+KPX W odieresis -92
+KPX W ograve -92
+KPX W ohungarumlaut -92
+KPX W omacron -92
+KPX W oslash -92
+KPX W otilde -92
+KPX W period -92
+KPX W semicolon -65
+KPX W u -55
+KPX W uacute -55
+KPX W ucircumflex -55
+KPX W udieresis -55
+KPX W ugrave -55
+KPX W uhungarumlaut -55
+KPX W umacron -55
+KPX W uogonek -55
+KPX W uring -55
+KPX W y -70
+KPX W yacute -70
+KPX W ydieresis -70
+KPX Y A -50
+KPX Y Aacute -50
+KPX Y Abreve -50
+KPX Y Acircumflex -50
+KPX Y Adieresis -50
+KPX Y Agrave -50
+KPX Y Amacron -50
+KPX Y Aogonek -50
+KPX Y Aring -50
+KPX Y Atilde -50
+KPX Y O -15
+KPX Y Oacute -15
+KPX Y Ocircumflex -15
+KPX Y Odieresis -15
+KPX Y Ograve -15
+KPX Y Ohungarumlaut -15
+KPX Y Omacron -15
+KPX Y Oslash -15
+KPX Y Otilde -15
+KPX Y a -92
+KPX Y aacute -92
+KPX Y abreve -92
+KPX Y acircumflex -92
+KPX Y adieresis -92
+KPX Y agrave -92
+KPX Y amacron -92
+KPX Y aogonek -92
+KPX Y aring -92
+KPX Y atilde -92
+KPX Y colon -65
+KPX Y comma -92
+KPX Y e -92
+KPX Y eacute -92
+KPX Y ecaron -92
+KPX Y ecircumflex -92
+KPX Y edieresis -52
+KPX Y edotaccent -92
+KPX Y egrave -52
+KPX Y emacron -52
+KPX Y eogonek -92
+KPX Y hyphen -74
+KPX Y i -74
+KPX Y iacute -74
+KPX Y icircumflex -34
+KPX Y idieresis -34
+KPX Y igrave -34
+KPX Y imacron -34
+KPX Y iogonek -74
+KPX Y o -92
+KPX Y oacute -92
+KPX Y ocircumflex -92
+KPX Y odieresis -92
+KPX Y ograve -92
+KPX Y ohungarumlaut -92
+KPX Y omacron -92
+KPX Y oslash -92
+KPX Y otilde -92
+KPX Y period -92
+KPX Y semicolon -65
+KPX Y u -92
+KPX Y uacute -92
+KPX Y ucircumflex -92
+KPX Y udieresis -92
+KPX Y ugrave -92
+KPX Y uhungarumlaut -92
+KPX Y umacron -92
+KPX Y uogonek -92
+KPX Y uring -92
+KPX Yacute A -50
+KPX Yacute Aacute -50
+KPX Yacute Abreve -50
+KPX Yacute Acircumflex -50
+KPX Yacute Adieresis -50
+KPX Yacute Agrave -50
+KPX Yacute Amacron -50
+KPX Yacute Aogonek -50
+KPX Yacute Aring -50
+KPX Yacute Atilde -50
+KPX Yacute O -15
+KPX Yacute Oacute -15
+KPX Yacute Ocircumflex -15
+KPX Yacute Odieresis -15
+KPX Yacute Ograve -15
+KPX Yacute Ohungarumlaut -15
+KPX Yacute Omacron -15
+KPX Yacute Oslash -15
+KPX Yacute Otilde -15
+KPX Yacute a -92
+KPX Yacute aacute -92
+KPX Yacute abreve -92
+KPX Yacute acircumflex -92
+KPX Yacute adieresis -92
+KPX Yacute agrave -92
+KPX Yacute amacron -92
+KPX Yacute aogonek -92
+KPX Yacute aring -92
+KPX Yacute atilde -92
+KPX Yacute colon -65
+KPX Yacute comma -92
+KPX Yacute e -92
+KPX Yacute eacute -92
+KPX Yacute ecaron -92
+KPX Yacute ecircumflex -92
+KPX Yacute edieresis -52
+KPX Yacute edotaccent -92
+KPX Yacute egrave -52
+KPX Yacute emacron -52
+KPX Yacute eogonek -92
+KPX Yacute hyphen -74
+KPX Yacute i -74
+KPX Yacute iacute -74
+KPX Yacute icircumflex -34
+KPX Yacute idieresis -34
+KPX Yacute igrave -34
+KPX Yacute imacron -34
+KPX Yacute iogonek -74
+KPX Yacute o -92
+KPX Yacute oacute -92
+KPX Yacute ocircumflex -92
+KPX Yacute odieresis -92
+KPX Yacute ograve -92
+KPX Yacute ohungarumlaut -92
+KPX Yacute omacron -92
+KPX Yacute oslash -92
+KPX Yacute otilde -92
+KPX Yacute period -92
+KPX Yacute semicolon -65
+KPX Yacute u -92
+KPX Yacute uacute -92
+KPX Yacute ucircumflex -92
+KPX Yacute udieresis -92
+KPX Yacute ugrave -92
+KPX Yacute uhungarumlaut -92
+KPX Yacute umacron -92
+KPX Yacute uogonek -92
+KPX Yacute uring -92
+KPX Ydieresis A -50
+KPX Ydieresis Aacute -50
+KPX Ydieresis Abreve -50
+KPX Ydieresis Acircumflex -50
+KPX Ydieresis Adieresis -50
+KPX Ydieresis Agrave -50
+KPX Ydieresis Amacron -50
+KPX Ydieresis Aogonek -50
+KPX Ydieresis Aring -50
+KPX Ydieresis Atilde -50
+KPX Ydieresis O -15
+KPX Ydieresis Oacute -15
+KPX Ydieresis Ocircumflex -15
+KPX Ydieresis Odieresis -15
+KPX Ydieresis Ograve -15
+KPX Ydieresis Ohungarumlaut -15
+KPX Ydieresis Omacron -15
+KPX Ydieresis Oslash -15
+KPX Ydieresis Otilde -15
+KPX Ydieresis a -92
+KPX Ydieresis aacute -92
+KPX Ydieresis abreve -92
+KPX Ydieresis acircumflex -92
+KPX Ydieresis adieresis -92
+KPX Ydieresis agrave -92
+KPX Ydieresis amacron -92
+KPX Ydieresis aogonek -92
+KPX Ydieresis aring -92
+KPX Ydieresis atilde -92
+KPX Ydieresis colon -65
+KPX Ydieresis comma -92
+KPX Ydieresis e -92
+KPX Ydieresis eacute -92
+KPX Ydieresis ecaron -92
+KPX Ydieresis ecircumflex -92
+KPX Ydieresis edieresis -52
+KPX Ydieresis edotaccent -92
+KPX Ydieresis egrave -52
+KPX Ydieresis emacron -52
+KPX Ydieresis eogonek -92
+KPX Ydieresis hyphen -74
+KPX Ydieresis i -74
+KPX Ydieresis iacute -74
+KPX Ydieresis icircumflex -34
+KPX Ydieresis idieresis -34
+KPX Ydieresis igrave -34
+KPX Ydieresis imacron -34
+KPX Ydieresis iogonek -74
+KPX Ydieresis o -92
+KPX Ydieresis oacute -92
+KPX Ydieresis ocircumflex -92
+KPX Ydieresis odieresis -92
+KPX Ydieresis ograve -92
+KPX Ydieresis ohungarumlaut -92
+KPX Ydieresis omacron -92
+KPX Ydieresis oslash -92
+KPX Ydieresis otilde -92
+KPX Ydieresis period -92
+KPX Ydieresis semicolon -65
+KPX Ydieresis u -92
+KPX Ydieresis uacute -92
+KPX Ydieresis ucircumflex -92
+KPX Ydieresis udieresis -92
+KPX Ydieresis ugrave -92
+KPX Ydieresis uhungarumlaut -92
+KPX Ydieresis umacron -92
+KPX Ydieresis uogonek -92
+KPX Ydieresis uring -92
+KPX a g -10
+KPX a gbreve -10
+KPX a gcommaaccent -10
+KPX aacute g -10
+KPX aacute gbreve -10
+KPX aacute gcommaaccent -10
+KPX abreve g -10
+KPX abreve gbreve -10
+KPX abreve gcommaaccent -10
+KPX acircumflex g -10
+KPX acircumflex gbreve -10
+KPX acircumflex gcommaaccent -10
+KPX adieresis g -10
+KPX adieresis gbreve -10
+KPX adieresis gcommaaccent -10
+KPX agrave g -10
+KPX agrave gbreve -10
+KPX agrave gcommaaccent -10
+KPX amacron g -10
+KPX amacron gbreve -10
+KPX amacron gcommaaccent -10
+KPX aogonek g -10
+KPX aogonek gbreve -10
+KPX aogonek gcommaaccent -10
+KPX aring g -10
+KPX aring gbreve -10
+KPX aring gcommaaccent -10
+KPX atilde g -10
+KPX atilde gbreve -10
+KPX atilde gcommaaccent -10
+KPX b period -40
+KPX b u -20
+KPX b uacute -20
+KPX b ucircumflex -20
+KPX b udieresis -20
+KPX b ugrave -20
+KPX b uhungarumlaut -20
+KPX b umacron -20
+KPX b uogonek -20
+KPX b uring -20
+KPX c h -15
+KPX c k -20
+KPX c kcommaaccent -20
+KPX cacute h -15
+KPX cacute k -20
+KPX cacute kcommaaccent -20
+KPX ccaron h -15
+KPX ccaron k -20
+KPX ccaron kcommaaccent -20
+KPX ccedilla h -15
+KPX ccedilla k -20
+KPX ccedilla kcommaaccent -20
+KPX comma quotedblright -140
+KPX comma quoteright -140
+KPX e comma -10
+KPX e g -40
+KPX e gbreve -40
+KPX e gcommaaccent -40
+KPX e period -15
+KPX e v -15
+KPX e w -15
+KPX e x -20
+KPX e y -30
+KPX e yacute -30
+KPX e ydieresis -30
+KPX eacute comma -10
+KPX eacute g -40
+KPX eacute gbreve -40
+KPX eacute gcommaaccent -40
+KPX eacute period -15
+KPX eacute v -15
+KPX eacute w -15
+KPX eacute x -20
+KPX eacute y -30
+KPX eacute yacute -30
+KPX eacute ydieresis -30
+KPX ecaron comma -10
+KPX ecaron g -40
+KPX ecaron gbreve -40
+KPX ecaron gcommaaccent -40
+KPX ecaron period -15
+KPX ecaron v -15
+KPX ecaron w -15
+KPX ecaron x -20
+KPX ecaron y -30
+KPX ecaron yacute -30
+KPX ecaron ydieresis -30
+KPX ecircumflex comma -10
+KPX ecircumflex g -40
+KPX ecircumflex gbreve -40
+KPX ecircumflex gcommaaccent -40
+KPX ecircumflex period -15
+KPX ecircumflex v -15
+KPX ecircumflex w -15
+KPX ecircumflex x -20
+KPX ecircumflex y -30
+KPX ecircumflex yacute -30
+KPX ecircumflex ydieresis -30
+KPX edieresis comma -10
+KPX edieresis g -40
+KPX edieresis gbreve -40
+KPX edieresis gcommaaccent -40
+KPX edieresis period -15
+KPX edieresis v -15
+KPX edieresis w -15
+KPX edieresis x -20
+KPX edieresis y -30
+KPX edieresis yacute -30
+KPX edieresis ydieresis -30
+KPX edotaccent comma -10
+KPX edotaccent g -40
+KPX edotaccent gbreve -40
+KPX edotaccent gcommaaccent -40
+KPX edotaccent period -15
+KPX edotaccent v -15
+KPX edotaccent w -15
+KPX edotaccent x -20
+KPX edotaccent y -30
+KPX edotaccent yacute -30
+KPX edotaccent ydieresis -30
+KPX egrave comma -10
+KPX egrave g -40
+KPX egrave gbreve -40
+KPX egrave gcommaaccent -40
+KPX egrave period -15
+KPX egrave v -15
+KPX egrave w -15
+KPX egrave x -20
+KPX egrave y -30
+KPX egrave yacute -30
+KPX egrave ydieresis -30
+KPX emacron comma -10
+KPX emacron g -40
+KPX emacron gbreve -40
+KPX emacron gcommaaccent -40
+KPX emacron period -15
+KPX emacron v -15
+KPX emacron w -15
+KPX emacron x -20
+KPX emacron y -30
+KPX emacron yacute -30
+KPX emacron ydieresis -30
+KPX eogonek comma -10
+KPX eogonek g -40
+KPX eogonek gbreve -40
+KPX eogonek gcommaaccent -40
+KPX eogonek period -15
+KPX eogonek v -15
+KPX eogonek w -15
+KPX eogonek x -20
+KPX eogonek y -30
+KPX eogonek yacute -30
+KPX eogonek ydieresis -30
+KPX f comma -10
+KPX f dotlessi -60
+KPX f f -18
+KPX f i -20
+KPX f iogonek -20
+KPX f period -15
+KPX f quoteright 92
+KPX g comma -10
+KPX g e -10
+KPX g eacute -10
+KPX g ecaron -10
+KPX g ecircumflex -10
+KPX g edieresis -10
+KPX g edotaccent -10
+KPX g egrave -10
+KPX g emacron -10
+KPX g eogonek -10
+KPX g g -10
+KPX g gbreve -10
+KPX g gcommaaccent -10
+KPX g period -15
+KPX gbreve comma -10
+KPX gbreve e -10
+KPX gbreve eacute -10
+KPX gbreve ecaron -10
+KPX gbreve ecircumflex -10
+KPX gbreve edieresis -10
+KPX gbreve edotaccent -10
+KPX gbreve egrave -10
+KPX gbreve emacron -10
+KPX gbreve eogonek -10
+KPX gbreve g -10
+KPX gbreve gbreve -10
+KPX gbreve gcommaaccent -10
+KPX gbreve period -15
+KPX gcommaaccent comma -10
+KPX gcommaaccent e -10
+KPX gcommaaccent eacute -10
+KPX gcommaaccent ecaron -10
+KPX gcommaaccent ecircumflex -10
+KPX gcommaaccent edieresis -10
+KPX gcommaaccent edotaccent -10
+KPX gcommaaccent egrave -10
+KPX gcommaaccent emacron -10
+KPX gcommaaccent eogonek -10
+KPX gcommaaccent g -10
+KPX gcommaaccent gbreve -10
+KPX gcommaaccent gcommaaccent -10
+KPX gcommaaccent period -15
+KPX k e -10
+KPX k eacute -10
+KPX k ecaron -10
+KPX k ecircumflex -10
+KPX k edieresis -10
+KPX k edotaccent -10
+KPX k egrave -10
+KPX k emacron -10
+KPX k eogonek -10
+KPX k o -10
+KPX k oacute -10
+KPX k ocircumflex -10
+KPX k odieresis -10
+KPX k ograve -10
+KPX k ohungarumlaut -10
+KPX k omacron -10
+KPX k oslash -10
+KPX k otilde -10
+KPX k y -10
+KPX k yacute -10
+KPX k ydieresis -10
+KPX kcommaaccent e -10
+KPX kcommaaccent eacute -10
+KPX kcommaaccent ecaron -10
+KPX kcommaaccent ecircumflex -10
+KPX kcommaaccent edieresis -10
+KPX kcommaaccent edotaccent -10
+KPX kcommaaccent egrave -10
+KPX kcommaaccent emacron -10
+KPX kcommaaccent eogonek -10
+KPX kcommaaccent o -10
+KPX kcommaaccent oacute -10
+KPX kcommaaccent ocircumflex -10
+KPX kcommaaccent odieresis -10
+KPX kcommaaccent ograve -10
+KPX kcommaaccent ohungarumlaut -10
+KPX kcommaaccent omacron -10
+KPX kcommaaccent oslash -10
+KPX kcommaaccent otilde -10
+KPX kcommaaccent y -10
+KPX kcommaaccent yacute -10
+KPX kcommaaccent ydieresis -10
+KPX n v -40
+KPX nacute v -40
+KPX ncaron v -40
+KPX ncommaaccent v -40
+KPX ntilde v -40
+KPX o g -10
+KPX o gbreve -10
+KPX o gcommaaccent -10
+KPX o v -10
+KPX oacute g -10
+KPX oacute gbreve -10
+KPX oacute gcommaaccent -10
+KPX oacute v -10
+KPX ocircumflex g -10
+KPX ocircumflex gbreve -10
+KPX ocircumflex gcommaaccent -10
+KPX ocircumflex v -10
+KPX odieresis g -10
+KPX odieresis gbreve -10
+KPX odieresis gcommaaccent -10
+KPX odieresis v -10
+KPX ograve g -10
+KPX ograve gbreve -10
+KPX ograve gcommaaccent -10
+KPX ograve v -10
+KPX ohungarumlaut g -10
+KPX ohungarumlaut gbreve -10
+KPX ohungarumlaut gcommaaccent -10
+KPX ohungarumlaut v -10
+KPX omacron g -10
+KPX omacron gbreve -10
+KPX omacron gcommaaccent -10
+KPX omacron v -10
+KPX oslash g -10
+KPX oslash gbreve -10
+KPX oslash gcommaaccent -10
+KPX oslash v -10
+KPX otilde g -10
+KPX otilde gbreve -10
+KPX otilde gcommaaccent -10
+KPX otilde v -10
+KPX period quotedblright -140
+KPX period quoteright -140
+KPX quoteleft quoteleft -111
+KPX quoteright d -25
+KPX quoteright dcroat -25
+KPX quoteright quoteright -111
+KPX quoteright r -25
+KPX quoteright racute -25
+KPX quoteright rcaron -25
+KPX quoteright rcommaaccent -25
+KPX quoteright s -40
+KPX quoteright sacute -40
+KPX quoteright scaron -40
+KPX quoteright scedilla -40
+KPX quoteright scommaaccent -40
+KPX quoteright space -111
+KPX quoteright t -30
+KPX quoteright tcommaaccent -30
+KPX quoteright v -10
+KPX r a -15
+KPX r aacute -15
+KPX r abreve -15
+KPX r acircumflex -15
+KPX r adieresis -15
+KPX r agrave -15
+KPX r amacron -15
+KPX r aogonek -15
+KPX r aring -15
+KPX r atilde -15
+KPX r c -37
+KPX r cacute -37
+KPX r ccaron -37
+KPX r ccedilla -37
+KPX r comma -111
+KPX r d -37
+KPX r dcroat -37
+KPX r e -37
+KPX r eacute -37
+KPX r ecaron -37
+KPX r ecircumflex -37
+KPX r edieresis -37
+KPX r edotaccent -37
+KPX r egrave -37
+KPX r emacron -37
+KPX r eogonek -37
+KPX r g -37
+KPX r gbreve -37
+KPX r gcommaaccent -37
+KPX r hyphen -20
+KPX r o -45
+KPX r oacute -45
+KPX r ocircumflex -45
+KPX r odieresis -45
+KPX r ograve -45
+KPX r ohungarumlaut -45
+KPX r omacron -45
+KPX r oslash -45
+KPX r otilde -45
+KPX r period -111
+KPX r q -37
+KPX r s -10
+KPX r sacute -10
+KPX r scaron -10
+KPX r scedilla -10
+KPX r scommaaccent -10
+KPX racute a -15
+KPX racute aacute -15
+KPX racute abreve -15
+KPX racute acircumflex -15
+KPX racute adieresis -15
+KPX racute agrave -15
+KPX racute amacron -15
+KPX racute aogonek -15
+KPX racute aring -15
+KPX racute atilde -15
+KPX racute c -37
+KPX racute cacute -37
+KPX racute ccaron -37
+KPX racute ccedilla -37
+KPX racute comma -111
+KPX racute d -37
+KPX racute dcroat -37
+KPX racute e -37
+KPX racute eacute -37
+KPX racute ecaron -37
+KPX racute ecircumflex -37
+KPX racute edieresis -37
+KPX racute edotaccent -37
+KPX racute egrave -37
+KPX racute emacron -37
+KPX racute eogonek -37
+KPX racute g -37
+KPX racute gbreve -37
+KPX racute gcommaaccent -37
+KPX racute hyphen -20
+KPX racute o -45
+KPX racute oacute -45
+KPX racute ocircumflex -45
+KPX racute odieresis -45
+KPX racute ograve -45
+KPX racute ohungarumlaut -45
+KPX racute omacron -45
+KPX racute oslash -45
+KPX racute otilde -45
+KPX racute period -111
+KPX racute q -37
+KPX racute s -10
+KPX racute sacute -10
+KPX racute scaron -10
+KPX racute scedilla -10
+KPX racute scommaaccent -10
+KPX rcaron a -15
+KPX rcaron aacute -15
+KPX rcaron abreve -15
+KPX rcaron acircumflex -15
+KPX rcaron adieresis -15
+KPX rcaron agrave -15
+KPX rcaron amacron -15
+KPX rcaron aogonek -15
+KPX rcaron aring -15
+KPX rcaron atilde -15
+KPX rcaron c -37
+KPX rcaron cacute -37
+KPX rcaron ccaron -37
+KPX rcaron ccedilla -37
+KPX rcaron comma -111
+KPX rcaron d -37
+KPX rcaron dcroat -37
+KPX rcaron e -37
+KPX rcaron eacute -37
+KPX rcaron ecaron -37
+KPX rcaron ecircumflex -37
+KPX rcaron edieresis -37
+KPX rcaron edotaccent -37
+KPX rcaron egrave -37
+KPX rcaron emacron -37
+KPX rcaron eogonek -37
+KPX rcaron g -37
+KPX rcaron gbreve -37
+KPX rcaron gcommaaccent -37
+KPX rcaron hyphen -20
+KPX rcaron o -45
+KPX rcaron oacute -45
+KPX rcaron ocircumflex -45
+KPX rcaron odieresis -45
+KPX rcaron ograve -45
+KPX rcaron ohungarumlaut -45
+KPX rcaron omacron -45
+KPX rcaron oslash -45
+KPX rcaron otilde -45
+KPX rcaron period -111
+KPX rcaron q -37
+KPX rcaron s -10
+KPX rcaron sacute -10
+KPX rcaron scaron -10
+KPX rcaron scedilla -10
+KPX rcaron scommaaccent -10
+KPX rcommaaccent a -15
+KPX rcommaaccent aacute -15
+KPX rcommaaccent abreve -15
+KPX rcommaaccent acircumflex -15
+KPX rcommaaccent adieresis -15
+KPX rcommaaccent agrave -15
+KPX rcommaaccent amacron -15
+KPX rcommaaccent aogonek -15
+KPX rcommaaccent aring -15
+KPX rcommaaccent atilde -15
+KPX rcommaaccent c -37
+KPX rcommaaccent cacute -37
+KPX rcommaaccent ccaron -37
+KPX rcommaaccent ccedilla -37
+KPX rcommaaccent comma -111
+KPX rcommaaccent d -37
+KPX rcommaaccent dcroat -37
+KPX rcommaaccent e -37
+KPX rcommaaccent eacute -37
+KPX rcommaaccent ecaron -37
+KPX rcommaaccent ecircumflex -37
+KPX rcommaaccent edieresis -37
+KPX rcommaaccent edotaccent -37
+KPX rcommaaccent egrave -37
+KPX rcommaaccent emacron -37
+KPX rcommaaccent eogonek -37
+KPX rcommaaccent g -37
+KPX rcommaaccent gbreve -37
+KPX rcommaaccent gcommaaccent -37
+KPX rcommaaccent hyphen -20
+KPX rcommaaccent o -45
+KPX rcommaaccent oacute -45
+KPX rcommaaccent ocircumflex -45
+KPX rcommaaccent odieresis -45
+KPX rcommaaccent ograve -45
+KPX rcommaaccent ohungarumlaut -45
+KPX rcommaaccent omacron -45
+KPX rcommaaccent oslash -45
+KPX rcommaaccent otilde -45
+KPX rcommaaccent period -111
+KPX rcommaaccent q -37
+KPX rcommaaccent s -10
+KPX rcommaaccent sacute -10
+KPX rcommaaccent scaron -10
+KPX rcommaaccent scedilla -10
+KPX rcommaaccent scommaaccent -10
+KPX space A -18
+KPX space Aacute -18
+KPX space Abreve -18
+KPX space Acircumflex -18
+KPX space Adieresis -18
+KPX space Agrave -18
+KPX space Amacron -18
+KPX space Aogonek -18
+KPX space Aring -18
+KPX space Atilde -18
+KPX space T -18
+KPX space Tcaron -18
+KPX space Tcommaaccent -18
+KPX space V -35
+KPX space W -40
+KPX space Y -75
+KPX space Yacute -75
+KPX space Ydieresis -75
+KPX v comma -74
+KPX v period -74
+KPX w comma -74
+KPX w period -74
+KPX y comma -55
+KPX y period -55
+KPX yacute comma -55
+KPX yacute period -55
+KPX ydieresis comma -55
+KPX ydieresis period -55
+EndKernPairs
+EndKernData
+EndFontMetrics
diff --git a/src/main/resources/Resources/afm/Times-Roman.afm b/src/main/resources/Resources/afm/Times-Roman.afm
new file mode 100644
index 0000000..2680669
--- /dev/null
+++ b/src/main/resources/Resources/afm/Times-Roman.afm
@@ -0,0 +1,2419 @@
+StartFontMetrics 4.1
+Comment Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.
+Comment Creation Date: Thu May 1 12:49:17 1997
+Comment UniqueID 43068
+Comment VMusage 43909 54934
+FontName Times-Roman
+FullName Times Roman
+FamilyName Times
+Weight Roman
+ItalicAngle 0
+IsFixedPitch false
+CharacterSet ExtendedRoman
+FontBBox -168 -218 1000 898
+UnderlinePosition -100
+UnderlineThickness 50
+Version 002.000
+Notice Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.Times is a trademark of Linotype-Hell AG and/or its subsidiaries.
+EncodingScheme AdobeStandardEncoding
+CapHeight 662
+XHeight 450
+Ascender 683
+Descender -217
+StdHW 28
+StdVW 84
+StartCharMetrics 315
+C 32 ; WX 250 ; N space ; B 0 0 0 0 ;
+C 33 ; WX 333 ; N exclam ; B 130 -9 238 676 ;
+C 34 ; WX 408 ; N quotedbl ; B 77 431 331 676 ;
+C 35 ; WX 500 ; N numbersign ; B 5 0 496 662 ;
+C 36 ; WX 500 ; N dollar ; B 44 -87 457 727 ;
+C 37 ; WX 833 ; N percent ; B 61 -13 772 676 ;
+C 38 ; WX 778 ; N ampersand ; B 42 -13 750 676 ;
+C 39 ; WX 333 ; N quoteright ; B 79 433 218 676 ;
+C 40 ; WX 333 ; N parenleft ; B 48 -177 304 676 ;
+C 41 ; WX 333 ; N parenright ; B 29 -177 285 676 ;
+C 42 ; WX 500 ; N asterisk ; B 69 265 432 676 ;
+C 43 ; WX 564 ; N plus ; B 30 0 534 506 ;
+C 44 ; WX 250 ; N comma ; B 56 -141 195 102 ;
+C 45 ; WX 333 ; N hyphen ; B 39 194 285 257 ;
+C 46 ; WX 250 ; N period ; B 70 -11 181 100 ;
+C 47 ; WX 278 ; N slash ; B -9 -14 287 676 ;
+C 48 ; WX 500 ; N zero ; B 24 -14 476 676 ;
+C 49 ; WX 500 ; N one ; B 111 0 394 676 ;
+C 50 ; WX 500 ; N two ; B 30 0 475 676 ;
+C 51 ; WX 500 ; N three ; B 43 -14 431 676 ;
+C 52 ; WX 500 ; N four ; B 12 0 472 676 ;
+C 53 ; WX 500 ; N five ; B 32 -14 438 688 ;
+C 54 ; WX 500 ; N six ; B 34 -14 468 684 ;
+C 55 ; WX 500 ; N seven ; B 20 -8 449 662 ;
+C 56 ; WX 500 ; N eight ; B 56 -14 445 676 ;
+C 57 ; WX 500 ; N nine ; B 30 -22 459 676 ;
+C 58 ; WX 278 ; N colon ; B 81 -11 192 459 ;
+C 59 ; WX 278 ; N semicolon ; B 80 -141 219 459 ;
+C 60 ; WX 564 ; N less ; B 28 -8 536 514 ;
+C 61 ; WX 564 ; N equal ; B 30 120 534 386 ;
+C 62 ; WX 564 ; N greater ; B 28 -8 536 514 ;
+C 63 ; WX 444 ; N question ; B 68 -8 414 676 ;
+C 64 ; WX 921 ; N at ; B 116 -14 809 676 ;
+C 65 ; WX 722 ; N A ; B 15 0 706 674 ;
+C 66 ; WX 667 ; N B ; B 17 0 593 662 ;
+C 67 ; WX 667 ; N C ; B 28 -14 633 676 ;
+C 68 ; WX 722 ; N D ; B 16 0 685 662 ;
+C 69 ; WX 611 ; N E ; B 12 0 597 662 ;
+C 70 ; WX 556 ; N F ; B 12 0 546 662 ;
+C 71 ; WX 722 ; N G ; B 32 -14 709 676 ;
+C 72 ; WX 722 ; N H ; B 19 0 702 662 ;
+C 73 ; WX 333 ; N I ; B 18 0 315 662 ;
+C 74 ; WX 389 ; N J ; B 10 -14 370 662 ;
+C 75 ; WX 722 ; N K ; B 34 0 723 662 ;
+C 76 ; WX 611 ; N L ; B 12 0 598 662 ;
+C 77 ; WX 889 ; N M ; B 12 0 863 662 ;
+C 78 ; WX 722 ; N N ; B 12 -11 707 662 ;
+C 79 ; WX 722 ; N O ; B 34 -14 688 676 ;
+C 80 ; WX 556 ; N P ; B 16 0 542 662 ;
+C 81 ; WX 722 ; N Q ; B 34 -178 701 676 ;
+C 82 ; WX 667 ; N R ; B 17 0 659 662 ;
+C 83 ; WX 556 ; N S ; B 42 -14 491 676 ;
+C 84 ; WX 611 ; N T ; B 17 0 593 662 ;
+C 85 ; WX 722 ; N U ; B 14 -14 705 662 ;
+C 86 ; WX 722 ; N V ; B 16 -11 697 662 ;
+C 87 ; WX 944 ; N W ; B 5 -11 932 662 ;
+C 88 ; WX 722 ; N X ; B 10 0 704 662 ;
+C 89 ; WX 722 ; N Y ; B 22 0 703 662 ;
+C 90 ; WX 611 ; N Z ; B 9 0 597 662 ;
+C 91 ; WX 333 ; N bracketleft ; B 88 -156 299 662 ;
+C 92 ; WX 278 ; N backslash ; B -9 -14 287 676 ;
+C 93 ; WX 333 ; N bracketright ; B 34 -156 245 662 ;
+C 94 ; WX 469 ; N asciicircum ; B 24 297 446 662 ;
+C 95 ; WX 500 ; N underscore ; B 0 -125 500 -75 ;
+C 96 ; WX 333 ; N quoteleft ; B 115 433 254 676 ;
+C 97 ; WX 444 ; N a ; B 37 -10 442 460 ;
+C 98 ; WX 500 ; N b ; B 3 -10 468 683 ;
+C 99 ; WX 444 ; N c ; B 25 -10 412 460 ;
+C 100 ; WX 500 ; N d ; B 27 -10 491 683 ;
+C 101 ; WX 444 ; N e ; B 25 -10 424 460 ;
+C 102 ; WX 333 ; N f ; B 20 0 383 683 ; L i fi ; L l fl ;
+C 103 ; WX 500 ; N g ; B 28 -218 470 460 ;
+C 104 ; WX 500 ; N h ; B 9 0 487 683 ;
+C 105 ; WX 278 ; N i ; B 16 0 253 683 ;
+C 106 ; WX 278 ; N j ; B -70 -218 194 683 ;
+C 107 ; WX 500 ; N k ; B 7 0 505 683 ;
+C 108 ; WX 278 ; N l ; B 19 0 257 683 ;
+C 109 ; WX 778 ; N m ; B 16 0 775 460 ;
+C 110 ; WX 500 ; N n ; B 16 0 485 460 ;
+C 111 ; WX 500 ; N o ; B 29 -10 470 460 ;
+C 112 ; WX 500 ; N p ; B 5 -217 470 460 ;
+C 113 ; WX 500 ; N q ; B 24 -217 488 460 ;
+C 114 ; WX 333 ; N r ; B 5 0 335 460 ;
+C 115 ; WX 389 ; N s ; B 51 -10 348 460 ;
+C 116 ; WX 278 ; N t ; B 13 -10 279 579 ;
+C 117 ; WX 500 ; N u ; B 9 -10 479 450 ;
+C 118 ; WX 500 ; N v ; B 19 -14 477 450 ;
+C 119 ; WX 722 ; N w ; B 21 -14 694 450 ;
+C 120 ; WX 500 ; N x ; B 17 0 479 450 ;
+C 121 ; WX 500 ; N y ; B 14 -218 475 450 ;
+C 122 ; WX 444 ; N z ; B 27 0 418 450 ;
+C 123 ; WX 480 ; N braceleft ; B 100 -181 350 680 ;
+C 124 ; WX 200 ; N bar ; B 67 -218 133 782 ;
+C 125 ; WX 480 ; N braceright ; B 130 -181 380 680 ;
+C 126 ; WX 541 ; N asciitilde ; B 40 183 502 323 ;
+C 161 ; WX 333 ; N exclamdown ; B 97 -218 205 467 ;
+C 162 ; WX 500 ; N cent ; B 53 -138 448 579 ;
+C 163 ; WX 500 ; N sterling ; B 12 -8 490 676 ;
+C 164 ; WX 167 ; N fraction ; B -168 -14 331 676 ;
+C 165 ; WX 500 ; N yen ; B -53 0 512 662 ;
+C 166 ; WX 500 ; N florin ; B 7 -189 490 676 ;
+C 167 ; WX 500 ; N section ; B 70 -148 426 676 ;
+C 168 ; WX 500 ; N currency ; B -22 58 522 602 ;
+C 169 ; WX 180 ; N quotesingle ; B 48 431 133 676 ;
+C 170 ; WX 444 ; N quotedblleft ; B 43 433 414 676 ;
+C 171 ; WX 500 ; N guillemotleft ; B 42 33 456 416 ;
+C 172 ; WX 333 ; N guilsinglleft ; B 63 33 285 416 ;
+C 173 ; WX 333 ; N guilsinglright ; B 48 33 270 416 ;
+C 174 ; WX 556 ; N fi ; B 31 0 521 683 ;
+C 175 ; WX 556 ; N fl ; B 32 0 521 683 ;
+C 177 ; WX 500 ; N endash ; B 0 201 500 250 ;
+C 178 ; WX 500 ; N dagger ; B 59 -149 442 676 ;
+C 179 ; WX 500 ; N daggerdbl ; B 58 -153 442 676 ;
+C 180 ; WX 250 ; N periodcentered ; B 70 199 181 310 ;
+C 182 ; WX 453 ; N paragraph ; B -22 -154 450 662 ;
+C 183 ; WX 350 ; N bullet ; B 40 196 310 466 ;
+C 184 ; WX 333 ; N quotesinglbase ; B 79 -141 218 102 ;
+C 185 ; WX 444 ; N quotedblbase ; B 45 -141 416 102 ;
+C 186 ; WX 444 ; N quotedblright ; B 30 433 401 676 ;
+C 187 ; WX 500 ; N guillemotright ; B 44 33 458 416 ;
+C 188 ; WX 1000 ; N ellipsis ; B 111 -11 888 100 ;
+C 189 ; WX 1000 ; N perthousand ; B 7 -19 994 706 ;
+C 191 ; WX 444 ; N questiondown ; B 30 -218 376 466 ;
+C 193 ; WX 333 ; N grave ; B 19 507 242 678 ;
+C 194 ; WX 333 ; N acute ; B 93 507 317 678 ;
+C 195 ; WX 333 ; N circumflex ; B 11 507 322 674 ;
+C 196 ; WX 333 ; N tilde ; B 1 532 331 638 ;
+C 197 ; WX 333 ; N macron ; B 11 547 322 601 ;
+C 198 ; WX 333 ; N breve ; B 26 507 307 664 ;
+C 199 ; WX 333 ; N dotaccent ; B 118 581 216 681 ;
+C 200 ; WX 333 ; N dieresis ; B 18 581 315 681 ;
+C 202 ; WX 333 ; N ring ; B 67 512 266 711 ;
+C 203 ; WX 333 ; N cedilla ; B 52 -215 261 0 ;
+C 205 ; WX 333 ; N hungarumlaut ; B -3 507 377 678 ;
+C 206 ; WX 333 ; N ogonek ; B 62 -165 243 0 ;
+C 207 ; WX 333 ; N caron ; B 11 507 322 674 ;
+C 208 ; WX 1000 ; N emdash ; B 0 201 1000 250 ;
+C 225 ; WX 889 ; N AE ; B 0 0 863 662 ;
+C 227 ; WX 276 ; N ordfeminine ; B 4 394 270 676 ;
+C 232 ; WX 611 ; N Lslash ; B 12 0 598 662 ;
+C 233 ; WX 722 ; N Oslash ; B 34 -80 688 734 ;
+C 234 ; WX 889 ; N OE ; B 30 -6 885 668 ;
+C 235 ; WX 310 ; N ordmasculine ; B 6 394 304 676 ;
+C 241 ; WX 667 ; N ae ; B 38 -10 632 460 ;
+C 245 ; WX 278 ; N dotlessi ; B 16 0 253 460 ;
+C 248 ; WX 278 ; N lslash ; B 19 0 259 683 ;
+C 249 ; WX 500 ; N oslash ; B 29 -112 470 551 ;
+C 250 ; WX 722 ; N oe ; B 30 -10 690 460 ;
+C 251 ; WX 500 ; N germandbls ; B 12 -9 468 683 ;
+C -1 ; WX 333 ; N Idieresis ; B 18 0 315 835 ;
+C -1 ; WX 444 ; N eacute ; B 25 -10 424 678 ;
+C -1 ; WX 444 ; N abreve ; B 37 -10 442 664 ;
+C -1 ; WX 500 ; N uhungarumlaut ; B 9 -10 501 678 ;
+C -1 ; WX 444 ; N ecaron ; B 25 -10 424 674 ;
+C -1 ; WX 722 ; N Ydieresis ; B 22 0 703 835 ;
+C -1 ; WX 564 ; N divide ; B 30 -10 534 516 ;
+C -1 ; WX 722 ; N Yacute ; B 22 0 703 890 ;
+C -1 ; WX 722 ; N Acircumflex ; B 15 0 706 886 ;
+C -1 ; WX 444 ; N aacute ; B 37 -10 442 678 ;
+C -1 ; WX 722 ; N Ucircumflex ; B 14 -14 705 886 ;
+C -1 ; WX 500 ; N yacute ; B 14 -218 475 678 ;
+C -1 ; WX 389 ; N scommaaccent ; B 51 -218 348 460 ;
+C -1 ; WX 444 ; N ecircumflex ; B 25 -10 424 674 ;
+C -1 ; WX 722 ; N Uring ; B 14 -14 705 898 ;
+C -1 ; WX 722 ; N Udieresis ; B 14 -14 705 835 ;
+C -1 ; WX 444 ; N aogonek ; B 37 -165 469 460 ;
+C -1 ; WX 722 ; N Uacute ; B 14 -14 705 890 ;
+C -1 ; WX 500 ; N uogonek ; B 9 -155 487 450 ;
+C -1 ; WX 611 ; N Edieresis ; B 12 0 597 835 ;
+C -1 ; WX 722 ; N Dcroat ; B 16 0 685 662 ;
+C -1 ; WX 250 ; N commaaccent ; B 59 -218 184 -50 ;
+C -1 ; WX 760 ; N copyright ; B 38 -14 722 676 ;
+C -1 ; WX 611 ; N Emacron ; B 12 0 597 813 ;
+C -1 ; WX 444 ; N ccaron ; B 25 -10 412 674 ;
+C -1 ; WX 444 ; N aring ; B 37 -10 442 711 ;
+C -1 ; WX 722 ; N Ncommaaccent ; B 12 -198 707 662 ;
+C -1 ; WX 278 ; N lacute ; B 19 0 290 890 ;
+C -1 ; WX 444 ; N agrave ; B 37 -10 442 678 ;
+C -1 ; WX 611 ; N Tcommaaccent ; B 17 -218 593 662 ;
+C -1 ; WX 667 ; N Cacute ; B 28 -14 633 890 ;
+C -1 ; WX 444 ; N atilde ; B 37 -10 442 638 ;
+C -1 ; WX 611 ; N Edotaccent ; B 12 0 597 835 ;
+C -1 ; WX 389 ; N scaron ; B 39 -10 350 674 ;
+C -1 ; WX 389 ; N scedilla ; B 51 -215 348 460 ;
+C -1 ; WX 278 ; N iacute ; B 16 0 290 678 ;
+C -1 ; WX 471 ; N lozenge ; B 13 0 459 724 ;
+C -1 ; WX 667 ; N Rcaron ; B 17 0 659 886 ;
+C -1 ; WX 722 ; N Gcommaaccent ; B 32 -218 709 676 ;
+C -1 ; WX 500 ; N ucircumflex ; B 9 -10 479 674 ;
+C -1 ; WX 444 ; N acircumflex ; B 37 -10 442 674 ;
+C -1 ; WX 722 ; N Amacron ; B 15 0 706 813 ;
+C -1 ; WX 333 ; N rcaron ; B 5 0 335 674 ;
+C -1 ; WX 444 ; N ccedilla ; B 25 -215 412 460 ;
+C -1 ; WX 611 ; N Zdotaccent ; B 9 0 597 835 ;
+C -1 ; WX 556 ; N Thorn ; B 16 0 542 662 ;
+C -1 ; WX 722 ; N Omacron ; B 34 -14 688 813 ;
+C -1 ; WX 667 ; N Racute ; B 17 0 659 890 ;
+C -1 ; WX 556 ; N Sacute ; B 42 -14 491 890 ;
+C -1 ; WX 588 ; N dcaron ; B 27 -10 589 695 ;
+C -1 ; WX 722 ; N Umacron ; B 14 -14 705 813 ;
+C -1 ; WX 500 ; N uring ; B 9 -10 479 711 ;
+C -1 ; WX 300 ; N threesuperior ; B 15 262 291 676 ;
+C -1 ; WX 722 ; N Ograve ; B 34 -14 688 890 ;
+C -1 ; WX 722 ; N Agrave ; B 15 0 706 890 ;
+C -1 ; WX 722 ; N Abreve ; B 15 0 706 876 ;
+C -1 ; WX 564 ; N multiply ; B 38 8 527 497 ;
+C -1 ; WX 500 ; N uacute ; B 9 -10 479 678 ;
+C -1 ; WX 611 ; N Tcaron ; B 17 0 593 886 ;
+C -1 ; WX 476 ; N partialdiff ; B 17 -38 459 710 ;
+C -1 ; WX 500 ; N ydieresis ; B 14 -218 475 623 ;
+C -1 ; WX 722 ; N Nacute ; B 12 -11 707 890 ;
+C -1 ; WX 278 ; N icircumflex ; B -16 0 295 674 ;
+C -1 ; WX 611 ; N Ecircumflex ; B 12 0 597 886 ;
+C -1 ; WX 444 ; N adieresis ; B 37 -10 442 623 ;
+C -1 ; WX 444 ; N edieresis ; B 25 -10 424 623 ;
+C -1 ; WX 444 ; N cacute ; B 25 -10 413 678 ;
+C -1 ; WX 500 ; N nacute ; B 16 0 485 678 ;
+C -1 ; WX 500 ; N umacron ; B 9 -10 479 601 ;
+C -1 ; WX 722 ; N Ncaron ; B 12 -11 707 886 ;
+C -1 ; WX 333 ; N Iacute ; B 18 0 317 890 ;
+C -1 ; WX 564 ; N plusminus ; B 30 0 534 506 ;
+C -1 ; WX 200 ; N brokenbar ; B 67 -143 133 707 ;
+C -1 ; WX 760 ; N registered ; B 38 -14 722 676 ;
+C -1 ; WX 722 ; N Gbreve ; B 32 -14 709 876 ;
+C -1 ; WX 333 ; N Idotaccent ; B 18 0 315 835 ;
+C -1 ; WX 600 ; N summation ; B 15 -10 585 706 ;
+C -1 ; WX 611 ; N Egrave ; B 12 0 597 890 ;
+C -1 ; WX 333 ; N racute ; B 5 0 335 678 ;
+C -1 ; WX 500 ; N omacron ; B 29 -10 470 601 ;
+C -1 ; WX 611 ; N Zacute ; B 9 0 597 890 ;
+C -1 ; WX 611 ; N Zcaron ; B 9 0 597 886 ;
+C -1 ; WX 549 ; N greaterequal ; B 26 0 523 666 ;
+C -1 ; WX 722 ; N Eth ; B 16 0 685 662 ;
+C -1 ; WX 667 ; N Ccedilla ; B 28 -215 633 676 ;
+C -1 ; WX 278 ; N lcommaaccent ; B 19 -218 257 683 ;
+C -1 ; WX 326 ; N tcaron ; B 13 -10 318 722 ;
+C -1 ; WX 444 ; N eogonek ; B 25 -165 424 460 ;
+C -1 ; WX 722 ; N Uogonek ; B 14 -165 705 662 ;
+C -1 ; WX 722 ; N Aacute ; B 15 0 706 890 ;
+C -1 ; WX 722 ; N Adieresis ; B 15 0 706 835 ;
+C -1 ; WX 444 ; N egrave ; B 25 -10 424 678 ;
+C -1 ; WX 444 ; N zacute ; B 27 0 418 678 ;
+C -1 ; WX 278 ; N iogonek ; B 16 -165 265 683 ;
+C -1 ; WX 722 ; N Oacute ; B 34 -14 688 890 ;
+C -1 ; WX 500 ; N oacute ; B 29 -10 470 678 ;
+C -1 ; WX 444 ; N amacron ; B 37 -10 442 601 ;
+C -1 ; WX 389 ; N sacute ; B 51 -10 348 678 ;
+C -1 ; WX 278 ; N idieresis ; B -9 0 288 623 ;
+C -1 ; WX 722 ; N Ocircumflex ; B 34 -14 688 886 ;
+C -1 ; WX 722 ; N Ugrave ; B 14 -14 705 890 ;
+C -1 ; WX 612 ; N Delta ; B 6 0 608 688 ;
+C -1 ; WX 500 ; N thorn ; B 5 -217 470 683 ;
+C -1 ; WX 300 ; N twosuperior ; B 1 270 296 676 ;
+C -1 ; WX 722 ; N Odieresis ; B 34 -14 688 835 ;
+C -1 ; WX 500 ; N mu ; B 36 -218 512 450 ;
+C -1 ; WX 278 ; N igrave ; B -8 0 253 678 ;
+C -1 ; WX 500 ; N ohungarumlaut ; B 29 -10 491 678 ;
+C -1 ; WX 611 ; N Eogonek ; B 12 -165 597 662 ;
+C -1 ; WX 500 ; N dcroat ; B 27 -10 500 683 ;
+C -1 ; WX 750 ; N threequarters ; B 15 -14 718 676 ;
+C -1 ; WX 556 ; N Scedilla ; B 42 -215 491 676 ;
+C -1 ; WX 344 ; N lcaron ; B 19 0 347 695 ;
+C -1 ; WX 722 ; N Kcommaaccent ; B 34 -198 723 662 ;
+C -1 ; WX 611 ; N Lacute ; B 12 0 598 890 ;
+C -1 ; WX 980 ; N trademark ; B 30 256 957 662 ;
+C -1 ; WX 444 ; N edotaccent ; B 25 -10 424 623 ;
+C -1 ; WX 333 ; N Igrave ; B 18 0 315 890 ;
+C -1 ; WX 333 ; N Imacron ; B 11 0 322 813 ;
+C -1 ; WX 611 ; N Lcaron ; B 12 0 598 676 ;
+C -1 ; WX 750 ; N onehalf ; B 31 -14 746 676 ;
+C -1 ; WX 549 ; N lessequal ; B 26 0 523 666 ;
+C -1 ; WX 500 ; N ocircumflex ; B 29 -10 470 674 ;
+C -1 ; WX 500 ; N ntilde ; B 16 0 485 638 ;
+C -1 ; WX 722 ; N Uhungarumlaut ; B 14 -14 705 890 ;
+C -1 ; WX 611 ; N Eacute ; B 12 0 597 890 ;
+C -1 ; WX 444 ; N emacron ; B 25 -10 424 601 ;
+C -1 ; WX 500 ; N gbreve ; B 28 -218 470 664 ;
+C -1 ; WX 750 ; N onequarter ; B 37 -14 718 676 ;
+C -1 ; WX 556 ; N Scaron ; B 42 -14 491 886 ;
+C -1 ; WX 556 ; N Scommaaccent ; B 42 -218 491 676 ;
+C -1 ; WX 722 ; N Ohungarumlaut ; B 34 -14 688 890 ;
+C -1 ; WX 400 ; N degree ; B 57 390 343 676 ;
+C -1 ; WX 500 ; N ograve ; B 29 -10 470 678 ;
+C -1 ; WX 667 ; N Ccaron ; B 28 -14 633 886 ;
+C -1 ; WX 500 ; N ugrave ; B 9 -10 479 678 ;
+C -1 ; WX 453 ; N radical ; B 2 -60 452 768 ;
+C -1 ; WX 722 ; N Dcaron ; B 16 0 685 886 ;
+C -1 ; WX 333 ; N rcommaaccent ; B 5 -218 335 460 ;
+C -1 ; WX 722 ; N Ntilde ; B 12 -11 707 850 ;
+C -1 ; WX 500 ; N otilde ; B 29 -10 470 638 ;
+C -1 ; WX 667 ; N Rcommaaccent ; B 17 -198 659 662 ;
+C -1 ; WX 611 ; N Lcommaaccent ; B 12 -218 598 662 ;
+C -1 ; WX 722 ; N Atilde ; B 15 0 706 850 ;
+C -1 ; WX 722 ; N Aogonek ; B 15 -165 738 674 ;
+C -1 ; WX 722 ; N Aring ; B 15 0 706 898 ;
+C -1 ; WX 722 ; N Otilde ; B 34 -14 688 850 ;
+C -1 ; WX 444 ; N zdotaccent ; B 27 0 418 623 ;
+C -1 ; WX 611 ; N Ecaron ; B 12 0 597 886 ;
+C -1 ; WX 333 ; N Iogonek ; B 18 -165 315 662 ;
+C -1 ; WX 500 ; N kcommaaccent ; B 7 -218 505 683 ;
+C -1 ; WX 564 ; N minus ; B 30 220 534 286 ;
+C -1 ; WX 333 ; N Icircumflex ; B 11 0 322 886 ;
+C -1 ; WX 500 ; N ncaron ; B 16 0 485 674 ;
+C -1 ; WX 278 ; N tcommaaccent ; B 13 -218 279 579 ;
+C -1 ; WX 564 ; N logicalnot ; B 30 108 534 386 ;
+C -1 ; WX 500 ; N odieresis ; B 29 -10 470 623 ;
+C -1 ; WX 500 ; N udieresis ; B 9 -10 479 623 ;
+C -1 ; WX 549 ; N notequal ; B 12 -31 537 547 ;
+C -1 ; WX 500 ; N gcommaaccent ; B 28 -218 470 749 ;
+C -1 ; WX 500 ; N eth ; B 29 -10 471 686 ;
+C -1 ; WX 444 ; N zcaron ; B 27 0 418 674 ;
+C -1 ; WX 500 ; N ncommaaccent ; B 16 -218 485 460 ;
+C -1 ; WX 300 ; N onesuperior ; B 57 270 248 676 ;
+C -1 ; WX 278 ; N imacron ; B 6 0 271 601 ;
+C -1 ; WX 500 ; N Euro ; B 0 0 0 0 ;
+EndCharMetrics
+StartKernData
+StartKernPairs 2073
+KPX A C -40
+KPX A Cacute -40
+KPX A Ccaron -40
+KPX A Ccedilla -40
+KPX A G -40
+KPX A Gbreve -40
+KPX A Gcommaaccent -40
+KPX A O -55
+KPX A Oacute -55
+KPX A Ocircumflex -55
+KPX A Odieresis -55
+KPX A Ograve -55
+KPX A Ohungarumlaut -55
+KPX A Omacron -55
+KPX A Oslash -55
+KPX A Otilde -55
+KPX A Q -55
+KPX A T -111
+KPX A Tcaron -111
+KPX A Tcommaaccent -111
+KPX A U -55
+KPX A Uacute -55
+KPX A Ucircumflex -55
+KPX A Udieresis -55
+KPX A Ugrave -55
+KPX A Uhungarumlaut -55
+KPX A Umacron -55
+KPX A Uogonek -55
+KPX A Uring -55
+KPX A V -135
+KPX A W -90
+KPX A Y -105
+KPX A Yacute -105
+KPX A Ydieresis -105
+KPX A quoteright -111
+KPX A v -74
+KPX A w -92
+KPX A y -92
+KPX A yacute -92
+KPX A ydieresis -92
+KPX Aacute C -40
+KPX Aacute Cacute -40
+KPX Aacute Ccaron -40
+KPX Aacute Ccedilla -40
+KPX Aacute G -40
+KPX Aacute Gbreve -40
+KPX Aacute Gcommaaccent -40
+KPX Aacute O -55
+KPX Aacute Oacute -55
+KPX Aacute Ocircumflex -55
+KPX Aacute Odieresis -55
+KPX Aacute Ograve -55
+KPX Aacute Ohungarumlaut -55
+KPX Aacute Omacron -55
+KPX Aacute Oslash -55
+KPX Aacute Otilde -55
+KPX Aacute Q -55
+KPX Aacute T -111
+KPX Aacute Tcaron -111
+KPX Aacute Tcommaaccent -111
+KPX Aacute U -55
+KPX Aacute Uacute -55
+KPX Aacute Ucircumflex -55
+KPX Aacute Udieresis -55
+KPX Aacute Ugrave -55
+KPX Aacute Uhungarumlaut -55
+KPX Aacute Umacron -55
+KPX Aacute Uogonek -55
+KPX Aacute Uring -55
+KPX Aacute V -135
+KPX Aacute W -90
+KPX Aacute Y -105
+KPX Aacute Yacute -105
+KPX Aacute Ydieresis -105
+KPX Aacute quoteright -111
+KPX Aacute v -74
+KPX Aacute w -92
+KPX Aacute y -92
+KPX Aacute yacute -92
+KPX Aacute ydieresis -92
+KPX Abreve C -40
+KPX Abreve Cacute -40
+KPX Abreve Ccaron -40
+KPX Abreve Ccedilla -40
+KPX Abreve G -40
+KPX Abreve Gbreve -40
+KPX Abreve Gcommaaccent -40
+KPX Abreve O -55
+KPX Abreve Oacute -55
+KPX Abreve Ocircumflex -55
+KPX Abreve Odieresis -55
+KPX Abreve Ograve -55
+KPX Abreve Ohungarumlaut -55
+KPX Abreve Omacron -55
+KPX Abreve Oslash -55
+KPX Abreve Otilde -55
+KPX Abreve Q -55
+KPX Abreve T -111
+KPX Abreve Tcaron -111
+KPX Abreve Tcommaaccent -111
+KPX Abreve U -55
+KPX Abreve Uacute -55
+KPX Abreve Ucircumflex -55
+KPX Abreve Udieresis -55
+KPX Abreve Ugrave -55
+KPX Abreve Uhungarumlaut -55
+KPX Abreve Umacron -55
+KPX Abreve Uogonek -55
+KPX Abreve Uring -55
+KPX Abreve V -135
+KPX Abreve W -90
+KPX Abreve Y -105
+KPX Abreve Yacute -105
+KPX Abreve Ydieresis -105
+KPX Abreve quoteright -111
+KPX Abreve v -74
+KPX Abreve w -92
+KPX Abreve y -92
+KPX Abreve yacute -92
+KPX Abreve ydieresis -92
+KPX Acircumflex C -40
+KPX Acircumflex Cacute -40
+KPX Acircumflex Ccaron -40
+KPX Acircumflex Ccedilla -40
+KPX Acircumflex G -40
+KPX Acircumflex Gbreve -40
+KPX Acircumflex Gcommaaccent -40
+KPX Acircumflex O -55
+KPX Acircumflex Oacute -55
+KPX Acircumflex Ocircumflex -55
+KPX Acircumflex Odieresis -55
+KPX Acircumflex Ograve -55
+KPX Acircumflex Ohungarumlaut -55
+KPX Acircumflex Omacron -55
+KPX Acircumflex Oslash -55
+KPX Acircumflex Otilde -55
+KPX Acircumflex Q -55
+KPX Acircumflex T -111
+KPX Acircumflex Tcaron -111
+KPX Acircumflex Tcommaaccent -111
+KPX Acircumflex U -55
+KPX Acircumflex Uacute -55
+KPX Acircumflex Ucircumflex -55
+KPX Acircumflex Udieresis -55
+KPX Acircumflex Ugrave -55
+KPX Acircumflex Uhungarumlaut -55
+KPX Acircumflex Umacron -55
+KPX Acircumflex Uogonek -55
+KPX Acircumflex Uring -55
+KPX Acircumflex V -135
+KPX Acircumflex W -90
+KPX Acircumflex Y -105
+KPX Acircumflex Yacute -105
+KPX Acircumflex Ydieresis -105
+KPX Acircumflex quoteright -111
+KPX Acircumflex v -74
+KPX Acircumflex w -92
+KPX Acircumflex y -92
+KPX Acircumflex yacute -92
+KPX Acircumflex ydieresis -92
+KPX Adieresis C -40
+KPX Adieresis Cacute -40
+KPX Adieresis Ccaron -40
+KPX Adieresis Ccedilla -40
+KPX Adieresis G -40
+KPX Adieresis Gbreve -40
+KPX Adieresis Gcommaaccent -40
+KPX Adieresis O -55
+KPX Adieresis Oacute -55
+KPX Adieresis Ocircumflex -55
+KPX Adieresis Odieresis -55
+KPX Adieresis Ograve -55
+KPX Adieresis Ohungarumlaut -55
+KPX Adieresis Omacron -55
+KPX Adieresis Oslash -55
+KPX Adieresis Otilde -55
+KPX Adieresis Q -55
+KPX Adieresis T -111
+KPX Adieresis Tcaron -111
+KPX Adieresis Tcommaaccent -111
+KPX Adieresis U -55
+KPX Adieresis Uacute -55
+KPX Adieresis Ucircumflex -55
+KPX Adieresis Udieresis -55
+KPX Adieresis Ugrave -55
+KPX Adieresis Uhungarumlaut -55
+KPX Adieresis Umacron -55
+KPX Adieresis Uogonek -55
+KPX Adieresis Uring -55
+KPX Adieresis V -135
+KPX Adieresis W -90
+KPX Adieresis Y -105
+KPX Adieresis Yacute -105
+KPX Adieresis Ydieresis -105
+KPX Adieresis quoteright -111
+KPX Adieresis v -74
+KPX Adieresis w -92
+KPX Adieresis y -92
+KPX Adieresis yacute -92
+KPX Adieresis ydieresis -92
+KPX Agrave C -40
+KPX Agrave Cacute -40
+KPX Agrave Ccaron -40
+KPX Agrave Ccedilla -40
+KPX Agrave G -40
+KPX Agrave Gbreve -40
+KPX Agrave Gcommaaccent -40
+KPX Agrave O -55
+KPX Agrave Oacute -55
+KPX Agrave Ocircumflex -55
+KPX Agrave Odieresis -55
+KPX Agrave Ograve -55
+KPX Agrave Ohungarumlaut -55
+KPX Agrave Omacron -55
+KPX Agrave Oslash -55
+KPX Agrave Otilde -55
+KPX Agrave Q -55
+KPX Agrave T -111
+KPX Agrave Tcaron -111
+KPX Agrave Tcommaaccent -111
+KPX Agrave U -55
+KPX Agrave Uacute -55
+KPX Agrave Ucircumflex -55
+KPX Agrave Udieresis -55
+KPX Agrave Ugrave -55
+KPX Agrave Uhungarumlaut -55
+KPX Agrave Umacron -55
+KPX Agrave Uogonek -55
+KPX Agrave Uring -55
+KPX Agrave V -135
+KPX Agrave W -90
+KPX Agrave Y -105
+KPX Agrave Yacute -105
+KPX Agrave Ydieresis -105
+KPX Agrave quoteright -111
+KPX Agrave v -74
+KPX Agrave w -92
+KPX Agrave y -92
+KPX Agrave yacute -92
+KPX Agrave ydieresis -92
+KPX Amacron C -40
+KPX Amacron Cacute -40
+KPX Amacron Ccaron -40
+KPX Amacron Ccedilla -40
+KPX Amacron G -40
+KPX Amacron Gbreve -40
+KPX Amacron Gcommaaccent -40
+KPX Amacron O -55
+KPX Amacron Oacute -55
+KPX Amacron Ocircumflex -55
+KPX Amacron Odieresis -55
+KPX Amacron Ograve -55
+KPX Amacron Ohungarumlaut -55
+KPX Amacron Omacron -55
+KPX Amacron Oslash -55
+KPX Amacron Otilde -55
+KPX Amacron Q -55
+KPX Amacron T -111
+KPX Amacron Tcaron -111
+KPX Amacron Tcommaaccent -111
+KPX Amacron U -55
+KPX Amacron Uacute -55
+KPX Amacron Ucircumflex -55
+KPX Amacron Udieresis -55
+KPX Amacron Ugrave -55
+KPX Amacron Uhungarumlaut -55
+KPX Amacron Umacron -55
+KPX Amacron Uogonek -55
+KPX Amacron Uring -55
+KPX Amacron V -135
+KPX Amacron W -90
+KPX Amacron Y -105
+KPX Amacron Yacute -105
+KPX Amacron Ydieresis -105
+KPX Amacron quoteright -111
+KPX Amacron v -74
+KPX Amacron w -92
+KPX Amacron y -92
+KPX Amacron yacute -92
+KPX Amacron ydieresis -92
+KPX Aogonek C -40
+KPX Aogonek Cacute -40
+KPX Aogonek Ccaron -40
+KPX Aogonek Ccedilla -40
+KPX Aogonek G -40
+KPX Aogonek Gbreve -40
+KPX Aogonek Gcommaaccent -40
+KPX Aogonek O -55
+KPX Aogonek Oacute -55
+KPX Aogonek Ocircumflex -55
+KPX Aogonek Odieresis -55
+KPX Aogonek Ograve -55
+KPX Aogonek Ohungarumlaut -55
+KPX Aogonek Omacron -55
+KPX Aogonek Oslash -55
+KPX Aogonek Otilde -55
+KPX Aogonek Q -55
+KPX Aogonek T -111
+KPX Aogonek Tcaron -111
+KPX Aogonek Tcommaaccent -111
+KPX Aogonek U -55
+KPX Aogonek Uacute -55
+KPX Aogonek Ucircumflex -55
+KPX Aogonek Udieresis -55
+KPX Aogonek Ugrave -55
+KPX Aogonek Uhungarumlaut -55
+KPX Aogonek Umacron -55
+KPX Aogonek Uogonek -55
+KPX Aogonek Uring -55
+KPX Aogonek V -135
+KPX Aogonek W -90
+KPX Aogonek Y -105
+KPX Aogonek Yacute -105
+KPX Aogonek Ydieresis -105
+KPX Aogonek quoteright -111
+KPX Aogonek v -74
+KPX Aogonek w -52
+KPX Aogonek y -52
+KPX Aogonek yacute -52
+KPX Aogonek ydieresis -52
+KPX Aring C -40
+KPX Aring Cacute -40
+KPX Aring Ccaron -40
+KPX Aring Ccedilla -40
+KPX Aring G -40
+KPX Aring Gbreve -40
+KPX Aring Gcommaaccent -40
+KPX Aring O -55
+KPX Aring Oacute -55
+KPX Aring Ocircumflex -55
+KPX Aring Odieresis -55
+KPX Aring Ograve -55
+KPX Aring Ohungarumlaut -55
+KPX Aring Omacron -55
+KPX Aring Oslash -55
+KPX Aring Otilde -55
+KPX Aring Q -55
+KPX Aring T -111
+KPX Aring Tcaron -111
+KPX Aring Tcommaaccent -111
+KPX Aring U -55
+KPX Aring Uacute -55
+KPX Aring Ucircumflex -55
+KPX Aring Udieresis -55
+KPX Aring Ugrave -55
+KPX Aring Uhungarumlaut -55
+KPX Aring Umacron -55
+KPX Aring Uogonek -55
+KPX Aring Uring -55
+KPX Aring V -135
+KPX Aring W -90
+KPX Aring Y -105
+KPX Aring Yacute -105
+KPX Aring Ydieresis -105
+KPX Aring quoteright -111
+KPX Aring v -74
+KPX Aring w -92
+KPX Aring y -92
+KPX Aring yacute -92
+KPX Aring ydieresis -92
+KPX Atilde C -40
+KPX Atilde Cacute -40
+KPX Atilde Ccaron -40
+KPX Atilde Ccedilla -40
+KPX Atilde G -40
+KPX Atilde Gbreve -40
+KPX Atilde Gcommaaccent -40
+KPX Atilde O -55
+KPX Atilde Oacute -55
+KPX Atilde Ocircumflex -55
+KPX Atilde Odieresis -55
+KPX Atilde Ograve -55
+KPX Atilde Ohungarumlaut -55
+KPX Atilde Omacron -55
+KPX Atilde Oslash -55
+KPX Atilde Otilde -55
+KPX Atilde Q -55
+KPX Atilde T -111
+KPX Atilde Tcaron -111
+KPX Atilde Tcommaaccent -111
+KPX Atilde U -55
+KPX Atilde Uacute -55
+KPX Atilde Ucircumflex -55
+KPX Atilde Udieresis -55
+KPX Atilde Ugrave -55
+KPX Atilde Uhungarumlaut -55
+KPX Atilde Umacron -55
+KPX Atilde Uogonek -55
+KPX Atilde Uring -55
+KPX Atilde V -135
+KPX Atilde W -90
+KPX Atilde Y -105
+KPX Atilde Yacute -105
+KPX Atilde Ydieresis -105
+KPX Atilde quoteright -111
+KPX Atilde v -74
+KPX Atilde w -92
+KPX Atilde y -92
+KPX Atilde yacute -92
+KPX Atilde ydieresis -92
+KPX B A -35
+KPX B Aacute -35
+KPX B Abreve -35
+KPX B Acircumflex -35
+KPX B Adieresis -35
+KPX B Agrave -35
+KPX B Amacron -35
+KPX B Aogonek -35
+KPX B Aring -35
+KPX B Atilde -35
+KPX B U -10
+KPX B Uacute -10
+KPX B Ucircumflex -10
+KPX B Udieresis -10
+KPX B Ugrave -10
+KPX B Uhungarumlaut -10
+KPX B Umacron -10
+KPX B Uogonek -10
+KPX B Uring -10
+KPX D A -40
+KPX D Aacute -40
+KPX D Abreve -40
+KPX D Acircumflex -40
+KPX D Adieresis -40
+KPX D Agrave -40
+KPX D Amacron -40
+KPX D Aogonek -40
+KPX D Aring -40
+KPX D Atilde -40
+KPX D V -40
+KPX D W -30
+KPX D Y -55
+KPX D Yacute -55
+KPX D Ydieresis -55
+KPX Dcaron A -40
+KPX Dcaron Aacute -40
+KPX Dcaron Abreve -40
+KPX Dcaron Acircumflex -40
+KPX Dcaron Adieresis -40
+KPX Dcaron Agrave -40
+KPX Dcaron Amacron -40
+KPX Dcaron Aogonek -40
+KPX Dcaron Aring -40
+KPX Dcaron Atilde -40
+KPX Dcaron V -40
+KPX Dcaron W -30
+KPX Dcaron Y -55
+KPX Dcaron Yacute -55
+KPX Dcaron Ydieresis -55
+KPX Dcroat A -40
+KPX Dcroat Aacute -40
+KPX Dcroat Abreve -40
+KPX Dcroat Acircumflex -40
+KPX Dcroat Adieresis -40
+KPX Dcroat Agrave -40
+KPX Dcroat Amacron -40
+KPX Dcroat Aogonek -40
+KPX Dcroat Aring -40
+KPX Dcroat Atilde -40
+KPX Dcroat V -40
+KPX Dcroat W -30
+KPX Dcroat Y -55
+KPX Dcroat Yacute -55
+KPX Dcroat Ydieresis -55
+KPX F A -74
+KPX F Aacute -74
+KPX F Abreve -74
+KPX F Acircumflex -74
+KPX F Adieresis -74
+KPX F Agrave -74
+KPX F Amacron -74
+KPX F Aogonek -74
+KPX F Aring -74
+KPX F Atilde -74
+KPX F a -15
+KPX F aacute -15
+KPX F abreve -15
+KPX F acircumflex -15
+KPX F adieresis -15
+KPX F agrave -15
+KPX F amacron -15
+KPX F aogonek -15
+KPX F aring -15
+KPX F atilde -15
+KPX F comma -80
+KPX F o -15
+KPX F oacute -15
+KPX F ocircumflex -15
+KPX F odieresis -15
+KPX F ograve -15
+KPX F ohungarumlaut -15
+KPX F omacron -15
+KPX F oslash -15
+KPX F otilde -15
+KPX F period -80
+KPX J A -60
+KPX J Aacute -60
+KPX J Abreve -60
+KPX J Acircumflex -60
+KPX J Adieresis -60
+KPX J Agrave -60
+KPX J Amacron -60
+KPX J Aogonek -60
+KPX J Aring -60
+KPX J Atilde -60
+KPX K O -30
+KPX K Oacute -30
+KPX K Ocircumflex -30
+KPX K Odieresis -30
+KPX K Ograve -30
+KPX K Ohungarumlaut -30
+KPX K Omacron -30
+KPX K Oslash -30
+KPX K Otilde -30
+KPX K e -25
+KPX K eacute -25
+KPX K ecaron -25
+KPX K ecircumflex -25
+KPX K edieresis -25
+KPX K edotaccent -25
+KPX K egrave -25
+KPX K emacron -25
+KPX K eogonek -25
+KPX K o -35
+KPX K oacute -35
+KPX K ocircumflex -35
+KPX K odieresis -35
+KPX K ograve -35
+KPX K ohungarumlaut -35
+KPX K omacron -35
+KPX K oslash -35
+KPX K otilde -35
+KPX K u -15
+KPX K uacute -15
+KPX K ucircumflex -15
+KPX K udieresis -15
+KPX K ugrave -15
+KPX K uhungarumlaut -15
+KPX K umacron -15
+KPX K uogonek -15
+KPX K uring -15
+KPX K y -25
+KPX K yacute -25
+KPX K ydieresis -25
+KPX Kcommaaccent O -30
+KPX Kcommaaccent Oacute -30
+KPX Kcommaaccent Ocircumflex -30
+KPX Kcommaaccent Odieresis -30
+KPX Kcommaaccent Ograve -30
+KPX Kcommaaccent Ohungarumlaut -30
+KPX Kcommaaccent Omacron -30
+KPX Kcommaaccent Oslash -30
+KPX Kcommaaccent Otilde -30
+KPX Kcommaaccent e -25
+KPX Kcommaaccent eacute -25
+KPX Kcommaaccent ecaron -25
+KPX Kcommaaccent ecircumflex -25
+KPX Kcommaaccent edieresis -25
+KPX Kcommaaccent edotaccent -25
+KPX Kcommaaccent egrave -25
+KPX Kcommaaccent emacron -25
+KPX Kcommaaccent eogonek -25
+KPX Kcommaaccent o -35
+KPX Kcommaaccent oacute -35
+KPX Kcommaaccent ocircumflex -35
+KPX Kcommaaccent odieresis -35
+KPX Kcommaaccent ograve -35
+KPX Kcommaaccent ohungarumlaut -35
+KPX Kcommaaccent omacron -35
+KPX Kcommaaccent oslash -35
+KPX Kcommaaccent otilde -35
+KPX Kcommaaccent u -15
+KPX Kcommaaccent uacute -15
+KPX Kcommaaccent ucircumflex -15
+KPX Kcommaaccent udieresis -15
+KPX Kcommaaccent ugrave -15
+KPX Kcommaaccent uhungarumlaut -15
+KPX Kcommaaccent umacron -15
+KPX Kcommaaccent uogonek -15
+KPX Kcommaaccent uring -15
+KPX Kcommaaccent y -25
+KPX Kcommaaccent yacute -25
+KPX Kcommaaccent ydieresis -25
+KPX L T -92
+KPX L Tcaron -92
+KPX L Tcommaaccent -92
+KPX L V -100
+KPX L W -74
+KPX L Y -100
+KPX L Yacute -100
+KPX L Ydieresis -100
+KPX L quoteright -92
+KPX L y -55
+KPX L yacute -55
+KPX L ydieresis -55
+KPX Lacute T -92
+KPX Lacute Tcaron -92
+KPX Lacute Tcommaaccent -92
+KPX Lacute V -100
+KPX Lacute W -74
+KPX Lacute Y -100
+KPX Lacute Yacute -100
+KPX Lacute Ydieresis -100
+KPX Lacute quoteright -92
+KPX Lacute y -55
+KPX Lacute yacute -55
+KPX Lacute ydieresis -55
+KPX Lcaron quoteright -92
+KPX Lcaron y -55
+KPX Lcaron yacute -55
+KPX Lcaron ydieresis -55
+KPX Lcommaaccent T -92
+KPX Lcommaaccent Tcaron -92
+KPX Lcommaaccent Tcommaaccent -92
+KPX Lcommaaccent V -100
+KPX Lcommaaccent W -74
+KPX Lcommaaccent Y -100
+KPX Lcommaaccent Yacute -100
+KPX Lcommaaccent Ydieresis -100
+KPX Lcommaaccent quoteright -92
+KPX Lcommaaccent y -55
+KPX Lcommaaccent yacute -55
+KPX Lcommaaccent ydieresis -55
+KPX Lslash T -92
+KPX Lslash Tcaron -92
+KPX Lslash Tcommaaccent -92
+KPX Lslash V -100
+KPX Lslash W -74
+KPX Lslash Y -100
+KPX Lslash Yacute -100
+KPX Lslash Ydieresis -100
+KPX Lslash quoteright -92
+KPX Lslash y -55
+KPX Lslash yacute -55
+KPX Lslash ydieresis -55
+KPX N A -35
+KPX N Aacute -35
+KPX N Abreve -35
+KPX N Acircumflex -35
+KPX N Adieresis -35
+KPX N Agrave -35
+KPX N Amacron -35
+KPX N Aogonek -35
+KPX N Aring -35
+KPX N Atilde -35
+KPX Nacute A -35
+KPX Nacute Aacute -35
+KPX Nacute Abreve -35
+KPX Nacute Acircumflex -35
+KPX Nacute Adieresis -35
+KPX Nacute Agrave -35
+KPX Nacute Amacron -35
+KPX Nacute Aogonek -35
+KPX Nacute Aring -35
+KPX Nacute Atilde -35
+KPX Ncaron A -35
+KPX Ncaron Aacute -35
+KPX Ncaron Abreve -35
+KPX Ncaron Acircumflex -35
+KPX Ncaron Adieresis -35
+KPX Ncaron Agrave -35
+KPX Ncaron Amacron -35
+KPX Ncaron Aogonek -35
+KPX Ncaron Aring -35
+KPX Ncaron Atilde -35
+KPX Ncommaaccent A -35
+KPX Ncommaaccent Aacute -35
+KPX Ncommaaccent Abreve -35
+KPX Ncommaaccent Acircumflex -35
+KPX Ncommaaccent Adieresis -35
+KPX Ncommaaccent Agrave -35
+KPX Ncommaaccent Amacron -35
+KPX Ncommaaccent Aogonek -35
+KPX Ncommaaccent Aring -35
+KPX Ncommaaccent Atilde -35
+KPX Ntilde A -35
+KPX Ntilde Aacute -35
+KPX Ntilde Abreve -35
+KPX Ntilde Acircumflex -35
+KPX Ntilde Adieresis -35
+KPX Ntilde Agrave -35
+KPX Ntilde Amacron -35
+KPX Ntilde Aogonek -35
+KPX Ntilde Aring -35
+KPX Ntilde Atilde -35
+KPX O A -35
+KPX O Aacute -35
+KPX O Abreve -35
+KPX O Acircumflex -35
+KPX O Adieresis -35
+KPX O Agrave -35
+KPX O Amacron -35
+KPX O Aogonek -35
+KPX O Aring -35
+KPX O Atilde -35
+KPX O T -40
+KPX O Tcaron -40
+KPX O Tcommaaccent -40
+KPX O V -50
+KPX O W -35
+KPX O X -40
+KPX O Y -50
+KPX O Yacute -50
+KPX O Ydieresis -50
+KPX Oacute A -35
+KPX Oacute Aacute -35
+KPX Oacute Abreve -35
+KPX Oacute Acircumflex -35
+KPX Oacute Adieresis -35
+KPX Oacute Agrave -35
+KPX Oacute Amacron -35
+KPX Oacute Aogonek -35
+KPX Oacute Aring -35
+KPX Oacute Atilde -35
+KPX Oacute T -40
+KPX Oacute Tcaron -40
+KPX Oacute Tcommaaccent -40
+KPX Oacute V -50
+KPX Oacute W -35
+KPX Oacute X -40
+KPX Oacute Y -50
+KPX Oacute Yacute -50
+KPX Oacute Ydieresis -50
+KPX Ocircumflex A -35
+KPX Ocircumflex Aacute -35
+KPX Ocircumflex Abreve -35
+KPX Ocircumflex Acircumflex -35
+KPX Ocircumflex Adieresis -35
+KPX Ocircumflex Agrave -35
+KPX Ocircumflex Amacron -35
+KPX Ocircumflex Aogonek -35
+KPX Ocircumflex Aring -35
+KPX Ocircumflex Atilde -35
+KPX Ocircumflex T -40
+KPX Ocircumflex Tcaron -40
+KPX Ocircumflex Tcommaaccent -40
+KPX Ocircumflex V -50
+KPX Ocircumflex W -35
+KPX Ocircumflex X -40
+KPX Ocircumflex Y -50
+KPX Ocircumflex Yacute -50
+KPX Ocircumflex Ydieresis -50
+KPX Odieresis A -35
+KPX Odieresis Aacute -35
+KPX Odieresis Abreve -35
+KPX Odieresis Acircumflex -35
+KPX Odieresis Adieresis -35
+KPX Odieresis Agrave -35
+KPX Odieresis Amacron -35
+KPX Odieresis Aogonek -35
+KPX Odieresis Aring -35
+KPX Odieresis Atilde -35
+KPX Odieresis T -40
+KPX Odieresis Tcaron -40
+KPX Odieresis Tcommaaccent -40
+KPX Odieresis V -50
+KPX Odieresis W -35
+KPX Odieresis X -40
+KPX Odieresis Y -50
+KPX Odieresis Yacute -50
+KPX Odieresis Ydieresis -50
+KPX Ograve A -35
+KPX Ograve Aacute -35
+KPX Ograve Abreve -35
+KPX Ograve Acircumflex -35
+KPX Ograve Adieresis -35
+KPX Ograve Agrave -35
+KPX Ograve Amacron -35
+KPX Ograve Aogonek -35
+KPX Ograve Aring -35
+KPX Ograve Atilde -35
+KPX Ograve T -40
+KPX Ograve Tcaron -40
+KPX Ograve Tcommaaccent -40
+KPX Ograve V -50
+KPX Ograve W -35
+KPX Ograve X -40
+KPX Ograve Y -50
+KPX Ograve Yacute -50
+KPX Ograve Ydieresis -50
+KPX Ohungarumlaut A -35
+KPX Ohungarumlaut Aacute -35
+KPX Ohungarumlaut Abreve -35
+KPX Ohungarumlaut Acircumflex -35
+KPX Ohungarumlaut Adieresis -35
+KPX Ohungarumlaut Agrave -35
+KPX Ohungarumlaut Amacron -35
+KPX Ohungarumlaut Aogonek -35
+KPX Ohungarumlaut Aring -35
+KPX Ohungarumlaut Atilde -35
+KPX Ohungarumlaut T -40
+KPX Ohungarumlaut Tcaron -40
+KPX Ohungarumlaut Tcommaaccent -40
+KPX Ohungarumlaut V -50
+KPX Ohungarumlaut W -35
+KPX Ohungarumlaut X -40
+KPX Ohungarumlaut Y -50
+KPX Ohungarumlaut Yacute -50
+KPX Ohungarumlaut Ydieresis -50
+KPX Omacron A -35
+KPX Omacron Aacute -35
+KPX Omacron Abreve -35
+KPX Omacron Acircumflex -35
+KPX Omacron Adieresis -35
+KPX Omacron Agrave -35
+KPX Omacron Amacron -35
+KPX Omacron Aogonek -35
+KPX Omacron Aring -35
+KPX Omacron Atilde -35
+KPX Omacron T -40
+KPX Omacron Tcaron -40
+KPX Omacron Tcommaaccent -40
+KPX Omacron V -50
+KPX Omacron W -35
+KPX Omacron X -40
+KPX Omacron Y -50
+KPX Omacron Yacute -50
+KPX Omacron Ydieresis -50
+KPX Oslash A -35
+KPX Oslash Aacute -35
+KPX Oslash Abreve -35
+KPX Oslash Acircumflex -35
+KPX Oslash Adieresis -35
+KPX Oslash Agrave -35
+KPX Oslash Amacron -35
+KPX Oslash Aogonek -35
+KPX Oslash Aring -35
+KPX Oslash Atilde -35
+KPX Oslash T -40
+KPX Oslash Tcaron -40
+KPX Oslash Tcommaaccent -40
+KPX Oslash V -50
+KPX Oslash W -35
+KPX Oslash X -40
+KPX Oslash Y -50
+KPX Oslash Yacute -50
+KPX Oslash Ydieresis -50
+KPX Otilde A -35
+KPX Otilde Aacute -35
+KPX Otilde Abreve -35
+KPX Otilde Acircumflex -35
+KPX Otilde Adieresis -35
+KPX Otilde Agrave -35
+KPX Otilde Amacron -35
+KPX Otilde Aogonek -35
+KPX Otilde Aring -35
+KPX Otilde Atilde -35
+KPX Otilde T -40
+KPX Otilde Tcaron -40
+KPX Otilde Tcommaaccent -40
+KPX Otilde V -50
+KPX Otilde W -35
+KPX Otilde X -40
+KPX Otilde Y -50
+KPX Otilde Yacute -50
+KPX Otilde Ydieresis -50
+KPX P A -92
+KPX P Aacute -92
+KPX P Abreve -92
+KPX P Acircumflex -92
+KPX P Adieresis -92
+KPX P Agrave -92
+KPX P Amacron -92
+KPX P Aogonek -92
+KPX P Aring -92
+KPX P Atilde -92
+KPX P a -15
+KPX P aacute -15
+KPX P abreve -15
+KPX P acircumflex -15
+KPX P adieresis -15
+KPX P agrave -15
+KPX P amacron -15
+KPX P aogonek -15
+KPX P aring -15
+KPX P atilde -15
+KPX P comma -111
+KPX P period -111
+KPX Q U -10
+KPX Q Uacute -10
+KPX Q Ucircumflex -10
+KPX Q Udieresis -10
+KPX Q Ugrave -10
+KPX Q Uhungarumlaut -10
+KPX Q Umacron -10
+KPX Q Uogonek -10
+KPX Q Uring -10
+KPX R O -40
+KPX R Oacute -40
+KPX R Ocircumflex -40
+KPX R Odieresis -40
+KPX R Ograve -40
+KPX R Ohungarumlaut -40
+KPX R Omacron -40
+KPX R Oslash -40
+KPX R Otilde -40
+KPX R T -60
+KPX R Tcaron -60
+KPX R Tcommaaccent -60
+KPX R U -40
+KPX R Uacute -40
+KPX R Ucircumflex -40
+KPX R Udieresis -40
+KPX R Ugrave -40
+KPX R Uhungarumlaut -40
+KPX R Umacron -40
+KPX R Uogonek -40
+KPX R Uring -40
+KPX R V -80
+KPX R W -55
+KPX R Y -65
+KPX R Yacute -65
+KPX R Ydieresis -65
+KPX Racute O -40
+KPX Racute Oacute -40
+KPX Racute Ocircumflex -40
+KPX Racute Odieresis -40
+KPX Racute Ograve -40
+KPX Racute Ohungarumlaut -40
+KPX Racute Omacron -40
+KPX Racute Oslash -40
+KPX Racute Otilde -40
+KPX Racute T -60
+KPX Racute Tcaron -60
+KPX Racute Tcommaaccent -60
+KPX Racute U -40
+KPX Racute Uacute -40
+KPX Racute Ucircumflex -40
+KPX Racute Udieresis -40
+KPX Racute Ugrave -40
+KPX Racute Uhungarumlaut -40
+KPX Racute Umacron -40
+KPX Racute Uogonek -40
+KPX Racute Uring -40
+KPX Racute V -80
+KPX Racute W -55
+KPX Racute Y -65
+KPX Racute Yacute -65
+KPX Racute Ydieresis -65
+KPX Rcaron O -40
+KPX Rcaron Oacute -40
+KPX Rcaron Ocircumflex -40
+KPX Rcaron Odieresis -40
+KPX Rcaron Ograve -40
+KPX Rcaron Ohungarumlaut -40
+KPX Rcaron Omacron -40
+KPX Rcaron Oslash -40
+KPX Rcaron Otilde -40
+KPX Rcaron T -60
+KPX Rcaron Tcaron -60
+KPX Rcaron Tcommaaccent -60
+KPX Rcaron U -40
+KPX Rcaron Uacute -40
+KPX Rcaron Ucircumflex -40
+KPX Rcaron Udieresis -40
+KPX Rcaron Ugrave -40
+KPX Rcaron Uhungarumlaut -40
+KPX Rcaron Umacron -40
+KPX Rcaron Uogonek -40
+KPX Rcaron Uring -40
+KPX Rcaron V -80
+KPX Rcaron W -55
+KPX Rcaron Y -65
+KPX Rcaron Yacute -65
+KPX Rcaron Ydieresis -65
+KPX Rcommaaccent O -40
+KPX Rcommaaccent Oacute -40
+KPX Rcommaaccent Ocircumflex -40
+KPX Rcommaaccent Odieresis -40
+KPX Rcommaaccent Ograve -40
+KPX Rcommaaccent Ohungarumlaut -40
+KPX Rcommaaccent Omacron -40
+KPX Rcommaaccent Oslash -40
+KPX Rcommaaccent Otilde -40
+KPX Rcommaaccent T -60
+KPX Rcommaaccent Tcaron -60
+KPX Rcommaaccent Tcommaaccent -60
+KPX Rcommaaccent U -40
+KPX Rcommaaccent Uacute -40
+KPX Rcommaaccent Ucircumflex -40
+KPX Rcommaaccent Udieresis -40
+KPX Rcommaaccent Ugrave -40
+KPX Rcommaaccent Uhungarumlaut -40
+KPX Rcommaaccent Umacron -40
+KPX Rcommaaccent Uogonek -40
+KPX Rcommaaccent Uring -40
+KPX Rcommaaccent V -80
+KPX Rcommaaccent W -55
+KPX Rcommaaccent Y -65
+KPX Rcommaaccent Yacute -65
+KPX Rcommaaccent Ydieresis -65
+KPX T A -93
+KPX T Aacute -93
+KPX T Abreve -93
+KPX T Acircumflex -93
+KPX T Adieresis -93
+KPX T Agrave -93
+KPX T Amacron -93
+KPX T Aogonek -93
+KPX T Aring -93
+KPX T Atilde -93
+KPX T O -18
+KPX T Oacute -18
+KPX T Ocircumflex -18
+KPX T Odieresis -18
+KPX T Ograve -18
+KPX T Ohungarumlaut -18
+KPX T Omacron -18
+KPX T Oslash -18
+KPX T Otilde -18
+KPX T a -80
+KPX T aacute -80
+KPX T abreve -80
+KPX T acircumflex -80
+KPX T adieresis -40
+KPX T agrave -40
+KPX T amacron -40
+KPX T aogonek -80
+KPX T aring -80
+KPX T atilde -40
+KPX T colon -50
+KPX T comma -74
+KPX T e -70
+KPX T eacute -70
+KPX T ecaron -70
+KPX T ecircumflex -70
+KPX T edieresis -30
+KPX T edotaccent -70
+KPX T egrave -70
+KPX T emacron -30
+KPX T eogonek -70
+KPX T hyphen -92
+KPX T i -35
+KPX T iacute -35
+KPX T iogonek -35
+KPX T o -80
+KPX T oacute -80
+KPX T ocircumflex -80
+KPX T odieresis -80
+KPX T ograve -80
+KPX T ohungarumlaut -80
+KPX T omacron -80
+KPX T oslash -80
+KPX T otilde -80
+KPX T period -74
+KPX T r -35
+KPX T racute -35
+KPX T rcaron -35
+KPX T rcommaaccent -35
+KPX T semicolon -55
+KPX T u -45
+KPX T uacute -45
+KPX T ucircumflex -45
+KPX T udieresis -45
+KPX T ugrave -45
+KPX T uhungarumlaut -45
+KPX T umacron -45
+KPX T uogonek -45
+KPX T uring -45
+KPX T w -80
+KPX T y -80
+KPX T yacute -80
+KPX T ydieresis -80
+KPX Tcaron A -93
+KPX Tcaron Aacute -93
+KPX Tcaron Abreve -93
+KPX Tcaron Acircumflex -93
+KPX Tcaron Adieresis -93
+KPX Tcaron Agrave -93
+KPX Tcaron Amacron -93
+KPX Tcaron Aogonek -93
+KPX Tcaron Aring -93
+KPX Tcaron Atilde -93
+KPX Tcaron O -18
+KPX Tcaron Oacute -18
+KPX Tcaron Ocircumflex -18
+KPX Tcaron Odieresis -18
+KPX Tcaron Ograve -18
+KPX Tcaron Ohungarumlaut -18
+KPX Tcaron Omacron -18
+KPX Tcaron Oslash -18
+KPX Tcaron Otilde -18
+KPX Tcaron a -80
+KPX Tcaron aacute -80
+KPX Tcaron abreve -80
+KPX Tcaron acircumflex -80
+KPX Tcaron adieresis -40
+KPX Tcaron agrave -40
+KPX Tcaron amacron -40
+KPX Tcaron aogonek -80
+KPX Tcaron aring -80
+KPX Tcaron atilde -40
+KPX Tcaron colon -50
+KPX Tcaron comma -74
+KPX Tcaron e -70
+KPX Tcaron eacute -70
+KPX Tcaron ecaron -70
+KPX Tcaron ecircumflex -30
+KPX Tcaron edieresis -30
+KPX Tcaron edotaccent -70
+KPX Tcaron egrave -70
+KPX Tcaron emacron -30
+KPX Tcaron eogonek -70
+KPX Tcaron hyphen -92
+KPX Tcaron i -35
+KPX Tcaron iacute -35
+KPX Tcaron iogonek -35
+KPX Tcaron o -80
+KPX Tcaron oacute -80
+KPX Tcaron ocircumflex -80
+KPX Tcaron odieresis -80
+KPX Tcaron ograve -80
+KPX Tcaron ohungarumlaut -80
+KPX Tcaron omacron -80
+KPX Tcaron oslash -80
+KPX Tcaron otilde -80
+KPX Tcaron period -74
+KPX Tcaron r -35
+KPX Tcaron racute -35
+KPX Tcaron rcaron -35
+KPX Tcaron rcommaaccent -35
+KPX Tcaron semicolon -55
+KPX Tcaron u -45
+KPX Tcaron uacute -45
+KPX Tcaron ucircumflex -45
+KPX Tcaron udieresis -45
+KPX Tcaron ugrave -45
+KPX Tcaron uhungarumlaut -45
+KPX Tcaron umacron -45
+KPX Tcaron uogonek -45
+KPX Tcaron uring -45
+KPX Tcaron w -80
+KPX Tcaron y -80
+KPX Tcaron yacute -80
+KPX Tcaron ydieresis -80
+KPX Tcommaaccent A -93
+KPX Tcommaaccent Aacute -93
+KPX Tcommaaccent Abreve -93
+KPX Tcommaaccent Acircumflex -93
+KPX Tcommaaccent Adieresis -93
+KPX Tcommaaccent Agrave -93
+KPX Tcommaaccent Amacron -93
+KPX Tcommaaccent Aogonek -93
+KPX Tcommaaccent Aring -93
+KPX Tcommaaccent Atilde -93
+KPX Tcommaaccent O -18
+KPX Tcommaaccent Oacute -18
+KPX Tcommaaccent Ocircumflex -18
+KPX Tcommaaccent Odieresis -18
+KPX Tcommaaccent Ograve -18
+KPX Tcommaaccent Ohungarumlaut -18
+KPX Tcommaaccent Omacron -18
+KPX Tcommaaccent Oslash -18
+KPX Tcommaaccent Otilde -18
+KPX Tcommaaccent a -80
+KPX Tcommaaccent aacute -80
+KPX Tcommaaccent abreve -80
+KPX Tcommaaccent acircumflex -80
+KPX Tcommaaccent adieresis -40
+KPX Tcommaaccent agrave -40
+KPX Tcommaaccent amacron -40
+KPX Tcommaaccent aogonek -80
+KPX Tcommaaccent aring -80
+KPX Tcommaaccent atilde -40
+KPX Tcommaaccent colon -50
+KPX Tcommaaccent comma -74
+KPX Tcommaaccent e -70
+KPX Tcommaaccent eacute -70
+KPX Tcommaaccent ecaron -70
+KPX Tcommaaccent ecircumflex -30
+KPX Tcommaaccent edieresis -30
+KPX Tcommaaccent edotaccent -70
+KPX Tcommaaccent egrave -30
+KPX Tcommaaccent emacron -70
+KPX Tcommaaccent eogonek -70
+KPX Tcommaaccent hyphen -92
+KPX Tcommaaccent i -35
+KPX Tcommaaccent iacute -35
+KPX Tcommaaccent iogonek -35
+KPX Tcommaaccent o -80
+KPX Tcommaaccent oacute -80
+KPX Tcommaaccent ocircumflex -80
+KPX Tcommaaccent odieresis -80
+KPX Tcommaaccent ograve -80
+KPX Tcommaaccent ohungarumlaut -80
+KPX Tcommaaccent omacron -80
+KPX Tcommaaccent oslash -80
+KPX Tcommaaccent otilde -80
+KPX Tcommaaccent period -74
+KPX Tcommaaccent r -35
+KPX Tcommaaccent racute -35
+KPX Tcommaaccent rcaron -35
+KPX Tcommaaccent rcommaaccent -35
+KPX Tcommaaccent semicolon -55
+KPX Tcommaaccent u -45
+KPX Tcommaaccent uacute -45
+KPX Tcommaaccent ucircumflex -45
+KPX Tcommaaccent udieresis -45
+KPX Tcommaaccent ugrave -45
+KPX Tcommaaccent uhungarumlaut -45
+KPX Tcommaaccent umacron -45
+KPX Tcommaaccent uogonek -45
+KPX Tcommaaccent uring -45
+KPX Tcommaaccent w -80
+KPX Tcommaaccent y -80
+KPX Tcommaaccent yacute -80
+KPX Tcommaaccent ydieresis -80
+KPX U A -40
+KPX U Aacute -40
+KPX U Abreve -40
+KPX U Acircumflex -40
+KPX U Adieresis -40
+KPX U Agrave -40
+KPX U Amacron -40
+KPX U Aogonek -40
+KPX U Aring -40
+KPX U Atilde -40
+KPX Uacute A -40
+KPX Uacute Aacute -40
+KPX Uacute Abreve -40
+KPX Uacute Acircumflex -40
+KPX Uacute Adieresis -40
+KPX Uacute Agrave -40
+KPX Uacute Amacron -40
+KPX Uacute Aogonek -40
+KPX Uacute Aring -40
+KPX Uacute Atilde -40
+KPX Ucircumflex A -40
+KPX Ucircumflex Aacute -40
+KPX Ucircumflex Abreve -40
+KPX Ucircumflex Acircumflex -40
+KPX Ucircumflex Adieresis -40
+KPX Ucircumflex Agrave -40
+KPX Ucircumflex Amacron -40
+KPX Ucircumflex Aogonek -40
+KPX Ucircumflex Aring -40
+KPX Ucircumflex Atilde -40
+KPX Udieresis A -40
+KPX Udieresis Aacute -40
+KPX Udieresis Abreve -40
+KPX Udieresis Acircumflex -40
+KPX Udieresis Adieresis -40
+KPX Udieresis Agrave -40
+KPX Udieresis Amacron -40
+KPX Udieresis Aogonek -40
+KPX Udieresis Aring -40
+KPX Udieresis Atilde -40
+KPX Ugrave A -40
+KPX Ugrave Aacute -40
+KPX Ugrave Abreve -40
+KPX Ugrave Acircumflex -40
+KPX Ugrave Adieresis -40
+KPX Ugrave Agrave -40
+KPX Ugrave Amacron -40
+KPX Ugrave Aogonek -40
+KPX Ugrave Aring -40
+KPX Ugrave Atilde -40
+KPX Uhungarumlaut A -40
+KPX Uhungarumlaut Aacute -40
+KPX Uhungarumlaut Abreve -40
+KPX Uhungarumlaut Acircumflex -40
+KPX Uhungarumlaut Adieresis -40
+KPX Uhungarumlaut Agrave -40
+KPX Uhungarumlaut Amacron -40
+KPX Uhungarumlaut Aogonek -40
+KPX Uhungarumlaut Aring -40
+KPX Uhungarumlaut Atilde -40
+KPX Umacron A -40
+KPX Umacron Aacute -40
+KPX Umacron Abreve -40
+KPX Umacron Acircumflex -40
+KPX Umacron Adieresis -40
+KPX Umacron Agrave -40
+KPX Umacron Amacron -40
+KPX Umacron Aogonek -40
+KPX Umacron Aring -40
+KPX Umacron Atilde -40
+KPX Uogonek A -40
+KPX Uogonek Aacute -40
+KPX Uogonek Abreve -40
+KPX Uogonek Acircumflex -40
+KPX Uogonek Adieresis -40
+KPX Uogonek Agrave -40
+KPX Uogonek Amacron -40
+KPX Uogonek Aogonek -40
+KPX Uogonek Aring -40
+KPX Uogonek Atilde -40
+KPX Uring A -40
+KPX Uring Aacute -40
+KPX Uring Abreve -40
+KPX Uring Acircumflex -40
+KPX Uring Adieresis -40
+KPX Uring Agrave -40
+KPX Uring Amacron -40
+KPX Uring Aogonek -40
+KPX Uring Aring -40
+KPX Uring Atilde -40
+KPX V A -135
+KPX V Aacute -135
+KPX V Abreve -135
+KPX V Acircumflex -135
+KPX V Adieresis -135
+KPX V Agrave -135
+KPX V Amacron -135
+KPX V Aogonek -135
+KPX V Aring -135
+KPX V Atilde -135
+KPX V G -15
+KPX V Gbreve -15
+KPX V Gcommaaccent -15
+KPX V O -40
+KPX V Oacute -40
+KPX V Ocircumflex -40
+KPX V Odieresis -40
+KPX V Ograve -40
+KPX V Ohungarumlaut -40
+KPX V Omacron -40
+KPX V Oslash -40
+KPX V Otilde -40
+KPX V a -111
+KPX V aacute -111
+KPX V abreve -111
+KPX V acircumflex -71
+KPX V adieresis -71
+KPX V agrave -71
+KPX V amacron -71
+KPX V aogonek -111
+KPX V aring -111
+KPX V atilde -71
+KPX V colon -74
+KPX V comma -129
+KPX V e -111
+KPX V eacute -111
+KPX V ecaron -71
+KPX V ecircumflex -71
+KPX V edieresis -71
+KPX V edotaccent -111
+KPX V egrave -71
+KPX V emacron -71
+KPX V eogonek -111
+KPX V hyphen -100
+KPX V i -60
+KPX V iacute -60
+KPX V icircumflex -20
+KPX V idieresis -20
+KPX V igrave -20
+KPX V imacron -20
+KPX V iogonek -60
+KPX V o -129
+KPX V oacute -129
+KPX V ocircumflex -129
+KPX V odieresis -89
+KPX V ograve -89
+KPX V ohungarumlaut -129
+KPX V omacron -89
+KPX V oslash -129
+KPX V otilde -89
+KPX V period -129
+KPX V semicolon -74
+KPX V u -75
+KPX V uacute -75
+KPX V ucircumflex -75
+KPX V udieresis -75
+KPX V ugrave -75
+KPX V uhungarumlaut -75
+KPX V umacron -75
+KPX V uogonek -75
+KPX V uring -75
+KPX W A -120
+KPX W Aacute -120
+KPX W Abreve -120
+KPX W Acircumflex -120
+KPX W Adieresis -120
+KPX W Agrave -120
+KPX W Amacron -120
+KPX W Aogonek -120
+KPX W Aring -120
+KPX W Atilde -120
+KPX W O -10
+KPX W Oacute -10
+KPX W Ocircumflex -10
+KPX W Odieresis -10
+KPX W Ograve -10
+KPX W Ohungarumlaut -10
+KPX W Omacron -10
+KPX W Oslash -10
+KPX W Otilde -10
+KPX W a -80
+KPX W aacute -80
+KPX W abreve -80
+KPX W acircumflex -80
+KPX W adieresis -80
+KPX W agrave -80
+KPX W amacron -80
+KPX W aogonek -80
+KPX W aring -80
+KPX W atilde -80
+KPX W colon -37
+KPX W comma -92
+KPX W e -80
+KPX W eacute -80
+KPX W ecaron -80
+KPX W ecircumflex -80
+KPX W edieresis -40
+KPX W edotaccent -80
+KPX W egrave -40
+KPX W emacron -40
+KPX W eogonek -80
+KPX W hyphen -65
+KPX W i -40
+KPX W iacute -40
+KPX W iogonek -40
+KPX W o -80
+KPX W oacute -80
+KPX W ocircumflex -80
+KPX W odieresis -80
+KPX W ograve -80
+KPX W ohungarumlaut -80
+KPX W omacron -80
+KPX W oslash -80
+KPX W otilde -80
+KPX W period -92
+KPX W semicolon -37
+KPX W u -50
+KPX W uacute -50
+KPX W ucircumflex -50
+KPX W udieresis -50
+KPX W ugrave -50
+KPX W uhungarumlaut -50
+KPX W umacron -50
+KPX W uogonek -50
+KPX W uring -50
+KPX W y -73
+KPX W yacute -73
+KPX W ydieresis -73
+KPX Y A -120
+KPX Y Aacute -120
+KPX Y Abreve -120
+KPX Y Acircumflex -120
+KPX Y Adieresis -120
+KPX Y Agrave -120
+KPX Y Amacron -120
+KPX Y Aogonek -120
+KPX Y Aring -120
+KPX Y Atilde -120
+KPX Y O -30
+KPX Y Oacute -30
+KPX Y Ocircumflex -30
+KPX Y Odieresis -30
+KPX Y Ograve -30
+KPX Y Ohungarumlaut -30
+KPX Y Omacron -30
+KPX Y Oslash -30
+KPX Y Otilde -30
+KPX Y a -100
+KPX Y aacute -100
+KPX Y abreve -100
+KPX Y acircumflex -100
+KPX Y adieresis -60
+KPX Y agrave -60
+KPX Y amacron -60
+KPX Y aogonek -100
+KPX Y aring -100
+KPX Y atilde -60
+KPX Y colon -92
+KPX Y comma -129
+KPX Y e -100
+KPX Y eacute -100
+KPX Y ecaron -100
+KPX Y ecircumflex -100
+KPX Y edieresis -60
+KPX Y edotaccent -100
+KPX Y egrave -60
+KPX Y emacron -60
+KPX Y eogonek -100
+KPX Y hyphen -111
+KPX Y i -55
+KPX Y iacute -55
+KPX Y iogonek -55
+KPX Y o -110
+KPX Y oacute -110
+KPX Y ocircumflex -110
+KPX Y odieresis -70
+KPX Y ograve -70
+KPX Y ohungarumlaut -110
+KPX Y omacron -70
+KPX Y oslash -110
+KPX Y otilde -70
+KPX Y period -129
+KPX Y semicolon -92
+KPX Y u -111
+KPX Y uacute -111
+KPX Y ucircumflex -111
+KPX Y udieresis -71
+KPX Y ugrave -71
+KPX Y uhungarumlaut -111
+KPX Y umacron -71
+KPX Y uogonek -111
+KPX Y uring -111
+KPX Yacute A -120
+KPX Yacute Aacute -120
+KPX Yacute Abreve -120
+KPX Yacute Acircumflex -120
+KPX Yacute Adieresis -120
+KPX Yacute Agrave -120
+KPX Yacute Amacron -120
+KPX Yacute Aogonek -120
+KPX Yacute Aring -120
+KPX Yacute Atilde -120
+KPX Yacute O -30
+KPX Yacute Oacute -30
+KPX Yacute Ocircumflex -30
+KPX Yacute Odieresis -30
+KPX Yacute Ograve -30
+KPX Yacute Ohungarumlaut -30
+KPX Yacute Omacron -30
+KPX Yacute Oslash -30
+KPX Yacute Otilde -30
+KPX Yacute a -100
+KPX Yacute aacute -100
+KPX Yacute abreve -100
+KPX Yacute acircumflex -100
+KPX Yacute adieresis -60
+KPX Yacute agrave -60
+KPX Yacute amacron -60
+KPX Yacute aogonek -100
+KPX Yacute aring -100
+KPX Yacute atilde -60
+KPX Yacute colon -92
+KPX Yacute comma -129
+KPX Yacute e -100
+KPX Yacute eacute -100
+KPX Yacute ecaron -100
+KPX Yacute ecircumflex -100
+KPX Yacute edieresis -60
+KPX Yacute edotaccent -100
+KPX Yacute egrave -60
+KPX Yacute emacron -60
+KPX Yacute eogonek -100
+KPX Yacute hyphen -111
+KPX Yacute i -55
+KPX Yacute iacute -55
+KPX Yacute iogonek -55
+KPX Yacute o -110
+KPX Yacute oacute -110
+KPX Yacute ocircumflex -110
+KPX Yacute odieresis -70
+KPX Yacute ograve -70
+KPX Yacute ohungarumlaut -110
+KPX Yacute omacron -70
+KPX Yacute oslash -110
+KPX Yacute otilde -70
+KPX Yacute period -129
+KPX Yacute semicolon -92
+KPX Yacute u -111
+KPX Yacute uacute -111
+KPX Yacute ucircumflex -111
+KPX Yacute udieresis -71
+KPX Yacute ugrave -71
+KPX Yacute uhungarumlaut -111
+KPX Yacute umacron -71
+KPX Yacute uogonek -111
+KPX Yacute uring -111
+KPX Ydieresis A -120
+KPX Ydieresis Aacute -120
+KPX Ydieresis Abreve -120
+KPX Ydieresis Acircumflex -120
+KPX Ydieresis Adieresis -120
+KPX Ydieresis Agrave -120
+KPX Ydieresis Amacron -120
+KPX Ydieresis Aogonek -120
+KPX Ydieresis Aring -120
+KPX Ydieresis Atilde -120
+KPX Ydieresis O -30
+KPX Ydieresis Oacute -30
+KPX Ydieresis Ocircumflex -30
+KPX Ydieresis Odieresis -30
+KPX Ydieresis Ograve -30
+KPX Ydieresis Ohungarumlaut -30
+KPX Ydieresis Omacron -30
+KPX Ydieresis Oslash -30
+KPX Ydieresis Otilde -30
+KPX Ydieresis a -100
+KPX Ydieresis aacute -100
+KPX Ydieresis abreve -100
+KPX Ydieresis acircumflex -100
+KPX Ydieresis adieresis -60
+KPX Ydieresis agrave -60
+KPX Ydieresis amacron -60
+KPX Ydieresis aogonek -100
+KPX Ydieresis aring -100
+KPX Ydieresis atilde -100
+KPX Ydieresis colon -92
+KPX Ydieresis comma -129
+KPX Ydieresis e -100
+KPX Ydieresis eacute -100
+KPX Ydieresis ecaron -100
+KPX Ydieresis ecircumflex -100
+KPX Ydieresis edieresis -60
+KPX Ydieresis edotaccent -100
+KPX Ydieresis egrave -60
+KPX Ydieresis emacron -60
+KPX Ydieresis eogonek -100
+KPX Ydieresis hyphen -111
+KPX Ydieresis i -55
+KPX Ydieresis iacute -55
+KPX Ydieresis iogonek -55
+KPX Ydieresis o -110
+KPX Ydieresis oacute -110
+KPX Ydieresis ocircumflex -110
+KPX Ydieresis odieresis -70
+KPX Ydieresis ograve -70
+KPX Ydieresis ohungarumlaut -110
+KPX Ydieresis omacron -70
+KPX Ydieresis oslash -110
+KPX Ydieresis otilde -70
+KPX Ydieresis period -129
+KPX Ydieresis semicolon -92
+KPX Ydieresis u -111
+KPX Ydieresis uacute -111
+KPX Ydieresis ucircumflex -111
+KPX Ydieresis udieresis -71
+KPX Ydieresis ugrave -71
+KPX Ydieresis uhungarumlaut -111
+KPX Ydieresis umacron -71
+KPX Ydieresis uogonek -111
+KPX Ydieresis uring -111
+KPX a v -20
+KPX a w -15
+KPX aacute v -20
+KPX aacute w -15
+KPX abreve v -20
+KPX abreve w -15
+KPX acircumflex v -20
+KPX acircumflex w -15
+KPX adieresis v -20
+KPX adieresis w -15
+KPX agrave v -20
+KPX agrave w -15
+KPX amacron v -20
+KPX amacron w -15
+KPX aogonek v -20
+KPX aogonek w -15
+KPX aring v -20
+KPX aring w -15
+KPX atilde v -20
+KPX atilde w -15
+KPX b period -40
+KPX b u -20
+KPX b uacute -20
+KPX b ucircumflex -20
+KPX b udieresis -20
+KPX b ugrave -20
+KPX b uhungarumlaut -20
+KPX b umacron -20
+KPX b uogonek -20
+KPX b uring -20
+KPX b v -15
+KPX c y -15
+KPX c yacute -15
+KPX c ydieresis -15
+KPX cacute y -15
+KPX cacute yacute -15
+KPX cacute ydieresis -15
+KPX ccaron y -15
+KPX ccaron yacute -15
+KPX ccaron ydieresis -15
+KPX ccedilla y -15
+KPX ccedilla yacute -15
+KPX ccedilla ydieresis -15
+KPX comma quotedblright -70
+KPX comma quoteright -70
+KPX e g -15
+KPX e gbreve -15
+KPX e gcommaaccent -15
+KPX e v -25
+KPX e w -25
+KPX e x -15
+KPX e y -15
+KPX e yacute -15
+KPX e ydieresis -15
+KPX eacute g -15
+KPX eacute gbreve -15
+KPX eacute gcommaaccent -15
+KPX eacute v -25
+KPX eacute w -25
+KPX eacute x -15
+KPX eacute y -15
+KPX eacute yacute -15
+KPX eacute ydieresis -15
+KPX ecaron g -15
+KPX ecaron gbreve -15
+KPX ecaron gcommaaccent -15
+KPX ecaron v -25
+KPX ecaron w -25
+KPX ecaron x -15
+KPX ecaron y -15
+KPX ecaron yacute -15
+KPX ecaron ydieresis -15
+KPX ecircumflex g -15
+KPX ecircumflex gbreve -15
+KPX ecircumflex gcommaaccent -15
+KPX ecircumflex v -25
+KPX ecircumflex w -25
+KPX ecircumflex x -15
+KPX ecircumflex y -15
+KPX ecircumflex yacute -15
+KPX ecircumflex ydieresis -15
+KPX edieresis g -15
+KPX edieresis gbreve -15
+KPX edieresis gcommaaccent -15
+KPX edieresis v -25
+KPX edieresis w -25
+KPX edieresis x -15
+KPX edieresis y -15
+KPX edieresis yacute -15
+KPX edieresis ydieresis -15
+KPX edotaccent g -15
+KPX edotaccent gbreve -15
+KPX edotaccent gcommaaccent -15
+KPX edotaccent v -25
+KPX edotaccent w -25
+KPX edotaccent x -15
+KPX edotaccent y -15
+KPX edotaccent yacute -15
+KPX edotaccent ydieresis -15
+KPX egrave g -15
+KPX egrave gbreve -15
+KPX egrave gcommaaccent -15
+KPX egrave v -25
+KPX egrave w -25
+KPX egrave x -15
+KPX egrave y -15
+KPX egrave yacute -15
+KPX egrave ydieresis -15
+KPX emacron g -15
+KPX emacron gbreve -15
+KPX emacron gcommaaccent -15
+KPX emacron v -25
+KPX emacron w -25
+KPX emacron x -15
+KPX emacron y -15
+KPX emacron yacute -15
+KPX emacron ydieresis -15
+KPX eogonek g -15
+KPX eogonek gbreve -15
+KPX eogonek gcommaaccent -15
+KPX eogonek v -25
+KPX eogonek w -25
+KPX eogonek x -15
+KPX eogonek y -15
+KPX eogonek yacute -15
+KPX eogonek ydieresis -15
+KPX f a -10
+KPX f aacute -10
+KPX f abreve -10
+KPX f acircumflex -10
+KPX f adieresis -10
+KPX f agrave -10
+KPX f amacron -10
+KPX f aogonek -10
+KPX f aring -10
+KPX f atilde -10
+KPX f dotlessi -50
+KPX f f -25
+KPX f i -20
+KPX f iacute -20
+KPX f quoteright 55
+KPX g a -5
+KPX g aacute -5
+KPX g abreve -5
+KPX g acircumflex -5
+KPX g adieresis -5
+KPX g agrave -5
+KPX g amacron -5
+KPX g aogonek -5
+KPX g aring -5
+KPX g atilde -5
+KPX gbreve a -5
+KPX gbreve aacute -5
+KPX gbreve abreve -5
+KPX gbreve acircumflex -5
+KPX gbreve adieresis -5
+KPX gbreve agrave -5
+KPX gbreve amacron -5
+KPX gbreve aogonek -5
+KPX gbreve aring -5
+KPX gbreve atilde -5
+KPX gcommaaccent a -5
+KPX gcommaaccent aacute -5
+KPX gcommaaccent abreve -5
+KPX gcommaaccent acircumflex -5
+KPX gcommaaccent adieresis -5
+KPX gcommaaccent agrave -5
+KPX gcommaaccent amacron -5
+KPX gcommaaccent aogonek -5
+KPX gcommaaccent aring -5
+KPX gcommaaccent atilde -5
+KPX h y -5
+KPX h yacute -5
+KPX h ydieresis -5
+KPX i v -25
+KPX iacute v -25
+KPX icircumflex v -25
+KPX idieresis v -25
+KPX igrave v -25
+KPX imacron v -25
+KPX iogonek v -25
+KPX k e -10
+KPX k eacute -10
+KPX k ecaron -10
+KPX k ecircumflex -10
+KPX k edieresis -10
+KPX k edotaccent -10
+KPX k egrave -10
+KPX k emacron -10
+KPX k eogonek -10
+KPX k o -10
+KPX k oacute -10
+KPX k ocircumflex -10
+KPX k odieresis -10
+KPX k ograve -10
+KPX k ohungarumlaut -10
+KPX k omacron -10
+KPX k oslash -10
+KPX k otilde -10
+KPX k y -15
+KPX k yacute -15
+KPX k ydieresis -15
+KPX kcommaaccent e -10
+KPX kcommaaccent eacute -10
+KPX kcommaaccent ecaron -10
+KPX kcommaaccent ecircumflex -10
+KPX kcommaaccent edieresis -10
+KPX kcommaaccent edotaccent -10
+KPX kcommaaccent egrave -10
+KPX kcommaaccent emacron -10
+KPX kcommaaccent eogonek -10
+KPX kcommaaccent o -10
+KPX kcommaaccent oacute -10
+KPX kcommaaccent ocircumflex -10
+KPX kcommaaccent odieresis -10
+KPX kcommaaccent ograve -10
+KPX kcommaaccent ohungarumlaut -10
+KPX kcommaaccent omacron -10
+KPX kcommaaccent oslash -10
+KPX kcommaaccent otilde -10
+KPX kcommaaccent y -15
+KPX kcommaaccent yacute -15
+KPX kcommaaccent ydieresis -15
+KPX l w -10
+KPX lacute w -10
+KPX lcommaaccent w -10
+KPX lslash w -10
+KPX n v -40
+KPX n y -15
+KPX n yacute -15
+KPX n ydieresis -15
+KPX nacute v -40
+KPX nacute y -15
+KPX nacute yacute -15
+KPX nacute ydieresis -15
+KPX ncaron v -40
+KPX ncaron y -15
+KPX ncaron yacute -15
+KPX ncaron ydieresis -15
+KPX ncommaaccent v -40
+KPX ncommaaccent y -15
+KPX ncommaaccent yacute -15
+KPX ncommaaccent ydieresis -15
+KPX ntilde v -40
+KPX ntilde y -15
+KPX ntilde yacute -15
+KPX ntilde ydieresis -15
+KPX o v -15
+KPX o w -25
+KPX o y -10
+KPX o yacute -10
+KPX o ydieresis -10
+KPX oacute v -15
+KPX oacute w -25
+KPX oacute y -10
+KPX oacute yacute -10
+KPX oacute ydieresis -10
+KPX ocircumflex v -15
+KPX ocircumflex w -25
+KPX ocircumflex y -10
+KPX ocircumflex yacute -10
+KPX ocircumflex ydieresis -10
+KPX odieresis v -15
+KPX odieresis w -25
+KPX odieresis y -10
+KPX odieresis yacute -10
+KPX odieresis ydieresis -10
+KPX ograve v -15
+KPX ograve w -25
+KPX ograve y -10
+KPX ograve yacute -10
+KPX ograve ydieresis -10
+KPX ohungarumlaut v -15
+KPX ohungarumlaut w -25
+KPX ohungarumlaut y -10
+KPX ohungarumlaut yacute -10
+KPX ohungarumlaut ydieresis -10
+KPX omacron v -15
+KPX omacron w -25
+KPX omacron y -10
+KPX omacron yacute -10
+KPX omacron ydieresis -10
+KPX oslash v -15
+KPX oslash w -25
+KPX oslash y -10
+KPX oslash yacute -10
+KPX oslash ydieresis -10
+KPX otilde v -15
+KPX otilde w -25
+KPX otilde y -10
+KPX otilde yacute -10
+KPX otilde ydieresis -10
+KPX p y -10
+KPX p yacute -10
+KPX p ydieresis -10
+KPX period quotedblright -70
+KPX period quoteright -70
+KPX quotedblleft A -80
+KPX quotedblleft Aacute -80
+KPX quotedblleft Abreve -80
+KPX quotedblleft Acircumflex -80
+KPX quotedblleft Adieresis -80
+KPX quotedblleft Agrave -80
+KPX quotedblleft Amacron -80
+KPX quotedblleft Aogonek -80
+KPX quotedblleft Aring -80
+KPX quotedblleft Atilde -80
+KPX quoteleft A -80
+KPX quoteleft Aacute -80
+KPX quoteleft Abreve -80
+KPX quoteleft Acircumflex -80
+KPX quoteleft Adieresis -80
+KPX quoteleft Agrave -80
+KPX quoteleft Amacron -80
+KPX quoteleft Aogonek -80
+KPX quoteleft Aring -80
+KPX quoteleft Atilde -80
+KPX quoteleft quoteleft -74
+KPX quoteright d -50
+KPX quoteright dcroat -50
+KPX quoteright l -10
+KPX quoteright lacute -10
+KPX quoteright lcommaaccent -10
+KPX quoteright lslash -10
+KPX quoteright quoteright -74
+KPX quoteright r -50
+KPX quoteright racute -50
+KPX quoteright rcaron -50
+KPX quoteright rcommaaccent -50
+KPX quoteright s -55
+KPX quoteright sacute -55
+KPX quoteright scaron -55
+KPX quoteright scedilla -55
+KPX quoteright scommaaccent -55
+KPX quoteright space -74
+KPX quoteright t -18
+KPX quoteright tcommaaccent -18
+KPX quoteright v -50
+KPX r comma -40
+KPX r g -18
+KPX r gbreve -18
+KPX r gcommaaccent -18
+KPX r hyphen -20
+KPX r period -55
+KPX racute comma -40
+KPX racute g -18
+KPX racute gbreve -18
+KPX racute gcommaaccent -18
+KPX racute hyphen -20
+KPX racute period -55
+KPX rcaron comma -40
+KPX rcaron g -18
+KPX rcaron gbreve -18
+KPX rcaron gcommaaccent -18
+KPX rcaron hyphen -20
+KPX rcaron period -55
+KPX rcommaaccent comma -40
+KPX rcommaaccent g -18
+KPX rcommaaccent gbreve -18
+KPX rcommaaccent gcommaaccent -18
+KPX rcommaaccent hyphen -20
+KPX rcommaaccent period -55
+KPX space A -55
+KPX space Aacute -55
+KPX space Abreve -55
+KPX space Acircumflex -55
+KPX space Adieresis -55
+KPX space Agrave -55
+KPX space Amacron -55
+KPX space Aogonek -55
+KPX space Aring -55
+KPX space Atilde -55
+KPX space T -18
+KPX space Tcaron -18
+KPX space Tcommaaccent -18
+KPX space V -50
+KPX space W -30
+KPX space Y -90
+KPX space Yacute -90
+KPX space Ydieresis -90
+KPX v a -25
+KPX v aacute -25
+KPX v abreve -25
+KPX v acircumflex -25
+KPX v adieresis -25
+KPX v agrave -25
+KPX v amacron -25
+KPX v aogonek -25
+KPX v aring -25
+KPX v atilde -25
+KPX v comma -65
+KPX v e -15
+KPX v eacute -15
+KPX v ecaron -15
+KPX v ecircumflex -15
+KPX v edieresis -15
+KPX v edotaccent -15
+KPX v egrave -15
+KPX v emacron -15
+KPX v eogonek -15
+KPX v o -20
+KPX v oacute -20
+KPX v ocircumflex -20
+KPX v odieresis -20
+KPX v ograve -20
+KPX v ohungarumlaut -20
+KPX v omacron -20
+KPX v oslash -20
+KPX v otilde -20
+KPX v period -65
+KPX w a -10
+KPX w aacute -10
+KPX w abreve -10
+KPX w acircumflex -10
+KPX w adieresis -10
+KPX w agrave -10
+KPX w amacron -10
+KPX w aogonek -10
+KPX w aring -10
+KPX w atilde -10
+KPX w comma -65
+KPX w o -10
+KPX w oacute -10
+KPX w ocircumflex -10
+KPX w odieresis -10
+KPX w ograve -10
+KPX w ohungarumlaut -10
+KPX w omacron -10
+KPX w oslash -10
+KPX w otilde -10
+KPX w period -65
+KPX x e -15
+KPX x eacute -15
+KPX x ecaron -15
+KPX x ecircumflex -15
+KPX x edieresis -15
+KPX x edotaccent -15
+KPX x egrave -15
+KPX x emacron -15
+KPX x eogonek -15
+KPX y comma -65
+KPX y period -65
+KPX yacute comma -65
+KPX yacute period -65
+KPX ydieresis comma -65
+KPX ydieresis period -65
+EndKernPairs
+EndKernData
+EndFontMetrics
diff --git a/src/main/resources/Resources/afm/ZapfDingbats.afm b/src/main/resources/Resources/afm/ZapfDingbats.afm
new file mode 100644
index 0000000..dc5662e
--- /dev/null
+++ b/src/main/resources/Resources/afm/ZapfDingbats.afm
@@ -0,0 +1,225 @@
+StartFontMetrics 4.1
+Comment Copyright (c) 1985, 1987, 1988, 1989, 1997 Adobe Systems Incorporated. All Rights Reserved.
+Comment Creation Date: Thu May 1 15:14:13 1997
+Comment UniqueID 43082
+Comment VMusage 45775 55535
+FontName ZapfDingbats
+FullName ITC Zapf Dingbats
+FamilyName ZapfDingbats
+Weight Medium
+ItalicAngle 0
+IsFixedPitch false
+CharacterSet Special
+FontBBox -1 -143 981 820
+UnderlinePosition -100
+UnderlineThickness 50
+Version 002.000
+Notice Copyright (c) 1985, 1987, 1988, 1989, 1997 Adobe Systems Incorporated. All Rights Reserved.ITC Zapf Dingbats is a registered trademark of International Typeface Corporation.
+EncodingScheme FontSpecific
+StdHW 28
+StdVW 90
+StartCharMetrics 202
+C 32 ; WX 278 ; N space ; B 0 0 0 0 ;
+C 33 ; WX 974 ; N a1 ; B 35 72 939 621 ;
+C 34 ; WX 961 ; N a2 ; B 35 81 927 611 ;
+C 35 ; WX 974 ; N a202 ; B 35 72 939 621 ;
+C 36 ; WX 980 ; N a3 ; B 35 0 945 692 ;
+C 37 ; WX 719 ; N a4 ; B 34 139 685 566 ;
+C 38 ; WX 789 ; N a5 ; B 35 -14 755 705 ;
+C 39 ; WX 790 ; N a119 ; B 35 -14 755 705 ;
+C 40 ; WX 791 ; N a118 ; B 35 -13 761 705 ;
+C 41 ; WX 690 ; N a117 ; B 34 138 655 553 ;
+C 42 ; WX 960 ; N a11 ; B 35 123 925 568 ;
+C 43 ; WX 939 ; N a12 ; B 35 134 904 559 ;
+C 44 ; WX 549 ; N a13 ; B 29 -11 516 705 ;
+C 45 ; WX 855 ; N a14 ; B 34 59 820 632 ;
+C 46 ; WX 911 ; N a15 ; B 35 50 876 642 ;
+C 47 ; WX 933 ; N a16 ; B 35 139 899 550 ;
+C 48 ; WX 911 ; N a105 ; B 35 50 876 642 ;
+C 49 ; WX 945 ; N a17 ; B 35 139 909 553 ;
+C 50 ; WX 974 ; N a18 ; B 35 104 938 587 ;
+C 51 ; WX 755 ; N a19 ; B 34 -13 721 705 ;
+C 52 ; WX 846 ; N a20 ; B 36 -14 811 705 ;
+C 53 ; WX 762 ; N a21 ; B 35 0 727 692 ;
+C 54 ; WX 761 ; N a22 ; B 35 0 727 692 ;
+C 55 ; WX 571 ; N a23 ; B -1 -68 571 661 ;
+C 56 ; WX 677 ; N a24 ; B 36 -13 642 705 ;
+C 57 ; WX 763 ; N a25 ; B 35 0 728 692 ;
+C 58 ; WX 760 ; N a26 ; B 35 0 726 692 ;
+C 59 ; WX 759 ; N a27 ; B 35 0 725 692 ;
+C 60 ; WX 754 ; N a28 ; B 35 0 720 692 ;
+C 61 ; WX 494 ; N a6 ; B 35 0 460 692 ;
+C 62 ; WX 552 ; N a7 ; B 35 0 517 692 ;
+C 63 ; WX 537 ; N a8 ; B 35 0 503 692 ;
+C 64 ; WX 577 ; N a9 ; B 35 96 542 596 ;
+C 65 ; WX 692 ; N a10 ; B 35 -14 657 705 ;
+C 66 ; WX 786 ; N a29 ; B 35 -14 751 705 ;
+C 67 ; WX 788 ; N a30 ; B 35 -14 752 705 ;
+C 68 ; WX 788 ; N a31 ; B 35 -14 753 705 ;
+C 69 ; WX 790 ; N a32 ; B 35 -14 756 705 ;
+C 70 ; WX 793 ; N a33 ; B 35 -13 759 705 ;
+C 71 ; WX 794 ; N a34 ; B 35 -13 759 705 ;
+C 72 ; WX 816 ; N a35 ; B 35 -14 782 705 ;
+C 73 ; WX 823 ; N a36 ; B 35 -14 787 705 ;
+C 74 ; WX 789 ; N a37 ; B 35 -14 754 705 ;
+C 75 ; WX 841 ; N a38 ; B 35 -14 807 705 ;
+C 76 ; WX 823 ; N a39 ; B 35 -14 789 705 ;
+C 77 ; WX 833 ; N a40 ; B 35 -14 798 705 ;
+C 78 ; WX 816 ; N a41 ; B 35 -13 782 705 ;
+C 79 ; WX 831 ; N a42 ; B 35 -14 796 705 ;
+C 80 ; WX 923 ; N a43 ; B 35 -14 888 705 ;
+C 81 ; WX 744 ; N a44 ; B 35 0 710 692 ;
+C 82 ; WX 723 ; N a45 ; B 35 0 688 692 ;
+C 83 ; WX 749 ; N a46 ; B 35 0 714 692 ;
+C 84 ; WX 790 ; N a47 ; B 34 -14 756 705 ;
+C 85 ; WX 792 ; N a48 ; B 35 -14 758 705 ;
+C 86 ; WX 695 ; N a49 ; B 35 -14 661 706 ;
+C 87 ; WX 776 ; N a50 ; B 35 -6 741 699 ;
+C 88 ; WX 768 ; N a51 ; B 35 -7 734 699 ;
+C 89 ; WX 792 ; N a52 ; B 35 -14 757 705 ;
+C 90 ; WX 759 ; N a53 ; B 35 0 725 692 ;
+C 91 ; WX 707 ; N a54 ; B 35 -13 672 704 ;
+C 92 ; WX 708 ; N a55 ; B 35 -14 672 705 ;
+C 93 ; WX 682 ; N a56 ; B 35 -14 647 705 ;
+C 94 ; WX 701 ; N a57 ; B 35 -14 666 705 ;
+C 95 ; WX 826 ; N a58 ; B 35 -14 791 705 ;
+C 96 ; WX 815 ; N a59 ; B 35 -14 780 705 ;
+C 97 ; WX 789 ; N a60 ; B 35 -14 754 705 ;
+C 98 ; WX 789 ; N a61 ; B 35 -14 754 705 ;
+C 99 ; WX 707 ; N a62 ; B 34 -14 673 705 ;
+C 100 ; WX 687 ; N a63 ; B 36 0 651 692 ;
+C 101 ; WX 696 ; N a64 ; B 35 0 661 691 ;
+C 102 ; WX 689 ; N a65 ; B 35 0 655 692 ;
+C 103 ; WX 786 ; N a66 ; B 34 -14 751 705 ;
+C 104 ; WX 787 ; N a67 ; B 35 -14 752 705 ;
+C 105 ; WX 713 ; N a68 ; B 35 -14 678 705 ;
+C 106 ; WX 791 ; N a69 ; B 35 -14 756 705 ;
+C 107 ; WX 785 ; N a70 ; B 36 -14 751 705 ;
+C 108 ; WX 791 ; N a71 ; B 35 -14 757 705 ;
+C 109 ; WX 873 ; N a72 ; B 35 -14 838 705 ;
+C 110 ; WX 761 ; N a73 ; B 35 0 726 692 ;
+C 111 ; WX 762 ; N a74 ; B 35 0 727 692 ;
+C 112 ; WX 762 ; N a203 ; B 35 0 727 692 ;
+C 113 ; WX 759 ; N a75 ; B 35 0 725 692 ;
+C 114 ; WX 759 ; N a204 ; B 35 0 725 692 ;
+C 115 ; WX 892 ; N a76 ; B 35 0 858 705 ;
+C 116 ; WX 892 ; N a77 ; B 35 -14 858 692 ;
+C 117 ; WX 788 ; N a78 ; B 35 -14 754 705 ;
+C 118 ; WX 784 ; N a79 ; B 35 -14 749 705 ;
+C 119 ; WX 438 ; N a81 ; B 35 -14 403 705 ;
+C 120 ; WX 138 ; N a82 ; B 35 0 104 692 ;
+C 121 ; WX 277 ; N a83 ; B 35 0 242 692 ;
+C 122 ; WX 415 ; N a84 ; B 35 0 380 692 ;
+C 123 ; WX 392 ; N a97 ; B 35 263 357 705 ;
+C 124 ; WX 392 ; N a98 ; B 34 263 357 705 ;
+C 125 ; WX 668 ; N a99 ; B 35 263 633 705 ;
+C 126 ; WX 668 ; N a100 ; B 36 263 634 705 ;
+C 128 ; WX 390 ; N a89 ; B 35 -14 356 705 ;
+C 129 ; WX 390 ; N a90 ; B 35 -14 355 705 ;
+C 130 ; WX 317 ; N a93 ; B 35 0 283 692 ;
+C 131 ; WX 317 ; N a94 ; B 35 0 283 692 ;
+C 132 ; WX 276 ; N a91 ; B 35 0 242 692 ;
+C 133 ; WX 276 ; N a92 ; B 35 0 242 692 ;
+C 134 ; WX 509 ; N a205 ; B 35 0 475 692 ;
+C 135 ; WX 509 ; N a85 ; B 35 0 475 692 ;
+C 136 ; WX 410 ; N a206 ; B 35 0 375 692 ;
+C 137 ; WX 410 ; N a86 ; B 35 0 375 692 ;
+C 138 ; WX 234 ; N a87 ; B 35 -14 199 705 ;
+C 139 ; WX 234 ; N a88 ; B 35 -14 199 705 ;
+C 140 ; WX 334 ; N a95 ; B 35 0 299 692 ;
+C 141 ; WX 334 ; N a96 ; B 35 0 299 692 ;
+C 161 ; WX 732 ; N a101 ; B 35 -143 697 806 ;
+C 162 ; WX 544 ; N a102 ; B 56 -14 488 706 ;
+C 163 ; WX 544 ; N a103 ; B 34 -14 508 705 ;
+C 164 ; WX 910 ; N a104 ; B 35 40 875 651 ;
+C 165 ; WX 667 ; N a106 ; B 35 -14 633 705 ;
+C 166 ; WX 760 ; N a107 ; B 35 -14 726 705 ;
+C 167 ; WX 760 ; N a108 ; B 0 121 758 569 ;
+C 168 ; WX 776 ; N a112 ; B 35 0 741 705 ;
+C 169 ; WX 595 ; N a111 ; B 34 -14 560 705 ;
+C 170 ; WX 694 ; N a110 ; B 35 -14 659 705 ;
+C 171 ; WX 626 ; N a109 ; B 34 0 591 705 ;
+C 172 ; WX 788 ; N a120 ; B 35 -14 754 705 ;
+C 173 ; WX 788 ; N a121 ; B 35 -14 754 705 ;
+C 174 ; WX 788 ; N a122 ; B 35 -14 754 705 ;
+C 175 ; WX 788 ; N a123 ; B 35 -14 754 705 ;
+C 176 ; WX 788 ; N a124 ; B 35 -14 754 705 ;
+C 177 ; WX 788 ; N a125 ; B 35 -14 754 705 ;
+C 178 ; WX 788 ; N a126 ; B 35 -14 754 705 ;
+C 179 ; WX 788 ; N a127 ; B 35 -14 754 705 ;
+C 180 ; WX 788 ; N a128 ; B 35 -14 754 705 ;
+C 181 ; WX 788 ; N a129 ; B 35 -14 754 705 ;
+C 182 ; WX 788 ; N a130 ; B 35 -14 754 705 ;
+C 183 ; WX 788 ; N a131 ; B 35 -14 754 705 ;
+C 184 ; WX 788 ; N a132 ; B 35 -14 754 705 ;
+C 185 ; WX 788 ; N a133 ; B 35 -14 754 705 ;
+C 186 ; WX 788 ; N a134 ; B 35 -14 754 705 ;
+C 187 ; WX 788 ; N a135 ; B 35 -14 754 705 ;
+C 188 ; WX 788 ; N a136 ; B 35 -14 754 705 ;
+C 189 ; WX 788 ; N a137 ; B 35 -14 754 705 ;
+C 190 ; WX 788 ; N a138 ; B 35 -14 754 705 ;
+C 191 ; WX 788 ; N a139 ; B 35 -14 754 705 ;
+C 192 ; WX 788 ; N a140 ; B 35 -14 754 705 ;
+C 193 ; WX 788 ; N a141 ; B 35 -14 754 705 ;
+C 194 ; WX 788 ; N a142 ; B 35 -14 754 705 ;
+C 195 ; WX 788 ; N a143 ; B 35 -14 754 705 ;
+C 196 ; WX 788 ; N a144 ; B 35 -14 754 705 ;
+C 197 ; WX 788 ; N a145 ; B 35 -14 754 705 ;
+C 198 ; WX 788 ; N a146 ; B 35 -14 754 705 ;
+C 199 ; WX 788 ; N a147 ; B 35 -14 754 705 ;
+C 200 ; WX 788 ; N a148 ; B 35 -14 754 705 ;
+C 201 ; WX 788 ; N a149 ; B 35 -14 754 705 ;
+C 202 ; WX 788 ; N a150 ; B 35 -14 754 705 ;
+C 203 ; WX 788 ; N a151 ; B 35 -14 754 705 ;
+C 204 ; WX 788 ; N a152 ; B 35 -14 754 705 ;
+C 205 ; WX 788 ; N a153 ; B 35 -14 754 705 ;
+C 206 ; WX 788 ; N a154 ; B 35 -14 754 705 ;
+C 207 ; WX 788 ; N a155 ; B 35 -14 754 705 ;
+C 208 ; WX 788 ; N a156 ; B 35 -14 754 705 ;
+C 209 ; WX 788 ; N a157 ; B 35 -14 754 705 ;
+C 210 ; WX 788 ; N a158 ; B 35 -14 754 705 ;
+C 211 ; WX 788 ; N a159 ; B 35 -14 754 705 ;
+C 212 ; WX 894 ; N a160 ; B 35 58 860 634 ;
+C 213 ; WX 838 ; N a161 ; B 35 152 803 540 ;
+C 214 ; WX 1016 ; N a163 ; B 34 152 981 540 ;
+C 215 ; WX 458 ; N a164 ; B 35 -127 422 820 ;
+C 216 ; WX 748 ; N a196 ; B 35 94 698 597 ;
+C 217 ; WX 924 ; N a165 ; B 35 140 890 552 ;
+C 218 ; WX 748 ; N a192 ; B 35 94 698 597 ;
+C 219 ; WX 918 ; N a166 ; B 35 166 884 526 ;
+C 220 ; WX 927 ; N a167 ; B 35 32 892 660 ;
+C 221 ; WX 928 ; N a168 ; B 35 129 891 562 ;
+C 222 ; WX 928 ; N a169 ; B 35 128 893 563 ;
+C 223 ; WX 834 ; N a170 ; B 35 155 799 537 ;
+C 224 ; WX 873 ; N a171 ; B 35 93 838 599 ;
+C 225 ; WX 828 ; N a172 ; B 35 104 791 588 ;
+C 226 ; WX 924 ; N a173 ; B 35 98 889 594 ;
+C 227 ; WX 924 ; N a162 ; B 35 98 889 594 ;
+C 228 ; WX 917 ; N a174 ; B 35 0 882 692 ;
+C 229 ; WX 930 ; N a175 ; B 35 84 896 608 ;
+C 230 ; WX 931 ; N a176 ; B 35 84 896 608 ;
+C 231 ; WX 463 ; N a177 ; B 35 -99 429 791 ;
+C 232 ; WX 883 ; N a178 ; B 35 71 848 623 ;
+C 233 ; WX 836 ; N a179 ; B 35 44 802 648 ;
+C 234 ; WX 836 ; N a193 ; B 35 44 802 648 ;
+C 235 ; WX 867 ; N a180 ; B 35 101 832 591 ;
+C 236 ; WX 867 ; N a199 ; B 35 101 832 591 ;
+C 237 ; WX 696 ; N a181 ; B 35 44 661 648 ;
+C 238 ; WX 696 ; N a200 ; B 35 44 661 648 ;
+C 239 ; WX 874 ; N a182 ; B 35 77 840 619 ;
+C 241 ; WX 874 ; N a201 ; B 35 73 840 615 ;
+C 242 ; WX 760 ; N a183 ; B 35 0 725 692 ;
+C 243 ; WX 946 ; N a184 ; B 35 160 911 533 ;
+C 244 ; WX 771 ; N a197 ; B 34 37 736 655 ;
+C 245 ; WX 865 ; N a185 ; B 35 207 830 481 ;
+C 246 ; WX 771 ; N a194 ; B 34 37 736 655 ;
+C 247 ; WX 888 ; N a198 ; B 34 -19 853 712 ;
+C 248 ; WX 967 ; N a186 ; B 35 124 932 568 ;
+C 249 ; WX 888 ; N a195 ; B 34 -19 853 712 ;
+C 250 ; WX 831 ; N a187 ; B 35 113 796 579 ;
+C 251 ; WX 873 ; N a188 ; B 36 118 838 578 ;
+C 252 ; WX 927 ; N a189 ; B 35 150 891 542 ;
+C 253 ; WX 970 ; N a190 ; B 35 76 931 616 ;
+C 254 ; WX 918 ; N a191 ; B 34 99 884 593 ;
+EndCharMetrics
+EndFontMetrics
diff --git a/src/main/resources/Resources/cmap/00_ReadMe.pdf b/src/main/resources/Resources/cmap/00_ReadMe.pdf
new file mode 100644
index 0000000..de4db52
--- /dev/null
+++ b/src/main/resources/Resources/cmap/00_ReadMe.pdf
Binary files differ
diff --git a/src/main/resources/Resources/cmap/78-EUC-H b/src/main/resources/Resources/cmap/78-EUC-H
new file mode 100644
index 0000000..4bbbbff
--- /dev/null
+++ b/src/main/resources/Resources/cmap/78-EUC-H
@@ -0,0 +1,708 @@
+%!PS-Adobe-3.0 Resource-CMap
+%%DocumentNeededResources: ProcSet (CIDInit)
+%%IncludeResource: ProcSet (CIDInit)
+%%BeginResource: CMap (78-EUC-H)
+%%Title: (78-EUC-H Adobe Japan1 0)
+%%Version: 6.001
+%%Copyright: -----------------------------------------------------------
+%%Copyright: Copyright 1990-1997 Adobe Systems Incorporated.
+%%Copyright: All Rights Reserved.
+%%Copyright:
+%%Copyright: Patents Pending
+%%Copyright:
+%%Copyright: NOTICE: All information contained herein is the property
+%%Copyright: of Adobe Systems Incorporated.
+%%Copyright:
+%%Copyright: Permission is granted for redistribution of this file
+%%Copyright: provided this copyright notice is maintained intact and
+%%Copyright: that the contents of this file are not altered in any
+%%Copyright: way from its original form.
+%%Copyright:
+%%Copyright: PostScript and Display PostScript are trademarks of
+%%Copyright: Adobe Systems Incorporated which may be registered in
+%%Copyright: certain jurisdictions.
+%%Copyright: -----------------------------------------------------------
+%%EndComments
+
+/CIDInit /ProcSet findresource begin
+
+12 dict begin
+
+begincmap
+
+/CIDSystemInfo 3 dict dup begin
+ /Registry (Adobe) def
+ /Ordering (Japan1) def
+ /Supplement 0 def
+end def
+
+/CMapName /78-EUC-H def
+/CMapVersion 6.001 def
+/CMapType 1 def
+
+/XUID [1 10 25347] def
+
+/WMode 0 def
+
+3 begincodespacerange
+ <00> <80>
+ <8EA0> <8EDF>
+ <A1A1> <FEFE>
+endcodespacerange
+
+1 beginnotdefrange
+<00> <1f> 231
+endnotdefrange
+
+100 begincidrange
+<20> <7e> 231
+<8ea0> <8edf> 326
+<a1a1> <a1fe> 633
+<a2a1> <a2ae> 727
+<a3b0> <a3b9> 780
+<a3c1> <a3da> 790
+<a3e1> <a3fa> 816
+<a4a1> <a4f3> 842
+<a5a1> <a5f6> 925
+<a6a1> <a6b8> 1011
+<a6c1> <a6d8> 1035
+<a7a1> <a7c1> 1059
+<a7d1> <a7f1> 1092
+<b0a1> <b0a1> 1125
+<b0a2> <b0a2> 7633
+<b0a3> <b0a8> 1127
+<b0a9> <b0a9> 8266
+<b0aa> <b0b1> 1134
+<b0b2> <b0b2> 7961
+<b0b3> <b0b3> 7330
+<b0b4> <b0ba> 1144
+<b0bb> <b0bb> 7634
+<b0bc> <b0ed> 1152
+<b0ee> <b0ee> 7635
+<b0ef> <b0f2> 1203
+<b0f3> <b0f3> 7636
+<b0f4> <b0fb> 1208
+<b0fc> <b0fc> 7637
+<b0fd> <b0fe> 1217
+<b1a1> <b1a9> 1219
+<b1aa> <b1aa> 7638
+<b1ab> <b1b4> 1229
+<b1b5> <b1b5> 7639
+<b1b6> <b1b8> 1240
+<b1b9> <b1b9> 7640
+<b1ba> <b1bc> 1244
+<b1bd> <b1bd> 7642
+<b1be> <b1c1> 1248
+<b1c2> <b1c2> 7643
+<b1c3> <b1ea> 1253
+<b1eb> <b1eb> 7644
+<b1ec> <b1fe> 1294
+<b2a1> <b2a7> 1313
+<b2a8> <b2a8> 7645
+<b2a9> <b2a9> 7369
+<b2aa> <b2aa> 7646
+<b2ab> <b2df> 1323
+<b2e0> <b2e0> 7647
+<b2e1> <b2f9> 1377
+<b2fa> <b2fa> 7648
+<b2fb> <b2fc> 1403
+<b2fd> <b2fd> 7649
+<b2fe> <b2fe> 1406
+<b3a1> <b3a1> 1407
+<b3a2> <b3a2> 7650
+<b3a3> <b3c1> 1409
+<b3c2> <b3c2> 6497
+<b3c3> <b3c8> 1441
+<b3c9> <b3c9> 5023
+<b3ca> <b3e4> 1448
+<b3e5> <b3e5> 7651
+<b3e6> <b3ea> 1476
+<b3eb> <b3eb> 7652
+<b3ec> <b3f2> 1482
+<b3f3> <b3f3> 7653
+<b3f4> <b3f5> 1490
+<b3f6> <b3f6> 5937
+<b3f7> <b3f9> 1493
+<b3fa> <b3fa> 7654
+<b3fb> <b3fe> 1497
+<b4a1> <b4c1> 1501
+<b4c2> <b4c2> 7655
+<b4c3> <b4c3> 5490
+<b4c4> <b4cc> 1536
+<b4cd> <b4cd> 7656
+<b4ce> <b4d1> 1546
+<b4d2> <b4d2> 6688
+<b4d3> <b4e4> 1551
+<b4e5> <b4e5> 7657
+<b4e6> <b4fe> 1570
+<b5a1> <b5aa> 1595
+<b5ab> <b5ab> 7658
+<b5ac> <b5bf> 1606
+<b5c0> <b5c0> 7659
+<b5c1> <b5fe> 1627
+<b6a1> <b6a1> 1689
+<b6a2> <b6a2> 7660
+<b6a3> <b6a9> 1691
+<b6aa> <b6aa> 7661
+<b6ab> <b6c5> 1699
+<b6c6> <b6c6> 7474
+<b6c7> <b6ce> 1727
+<b6cf> <b6cf> 7662
+<b6d0> <b6ec> 1736
+<b6ed> <b6ed> 7663
+<b6ee> <b6f3> 1766
+<b6f4> <b6f4> 7664
+<b6f5> <b6fa> 1773
+<b6fb> <b6fb> 7665
+<b6fc> <b6fc> 1780
+endcidrange
+
+100 begincidrange
+<b6fd> <b6fd> 7666
+<b6fe> <b6fe> 1782
+<b7a1> <b7a3> 1783
+<b7a4> <b7a4> 7667
+<b7a5> <b7b6> 1787
+<b7b7> <b7b7> 7668
+<b7b8> <b7c4> 1806
+<b7c5> <b7c5> 7669
+<b7c6> <b7cd> 1820
+<b7ce> <b7ce> 7670
+<b7cf> <b7d1> 1829
+<b7d2> <b7d2> 7671
+<b7d3> <b7d4> 1833
+<b7d5> <b7d5> 7672
+<b7d6> <b7da> 1836
+<b7db> <b7db> 7181
+<b7dc> <b7e3> 1842
+<b7e4> <b7e4> 7673
+<b7e5> <b7f0> 1851
+<b7f1> <b7f1> 7674
+<b7f2> <b7f8> 1864
+<b7f9> <b7f9> 7675
+<b7fa> <b7fd> 1872
+<b7fe> <b7fe> 7676
+<b8a1> <b8b3> 1877
+<b8b4> <b8b4> 7677
+<b8b5> <b8c0> 1897
+<b8c1> <b8c1> 7678
+<b8c2> <b8fe> 1910
+<b9a1> <b9aa> 1971
+<b9ab> <b9ab> 7679
+<b9ac> <b9b6> 1982
+<b9b7> <b9b7> 7680
+<b9b8> <b9c1> 1994
+<b9c2> <b9c2> 7681
+<b9c3> <b9db> 2005
+<b9dc> <b9dc> 5853
+<b9dd> <b9ec> 2031
+<b9ed> <b9ed> 7682
+<b9ee> <b9f3> 2048
+<b9f4> <b9f4> 7683
+<b9f5> <b9f8> 2055
+<b9f9> <b9f9> 7684
+<b9fa> <b9fe> 2060
+<baa1> <bad2> 2065
+<bad3> <bad3> 7685
+<bad4> <bae6> 2116
+<bae7> <bae7> 7686
+<bae8> <baf3> 2136
+<baf4> <baf4> 7687
+<baf5> <bafe> 2149
+<bba1> <bba6> 2159
+<bba7> <bba7> 7688
+<bba8> <bba9> 2166
+<bbaa> <bbaa> 7689
+<bbab> <bbab> 2169
+<bbac> <bbac> 7690
+<bbad> <bbb8> 2171
+<bbb9> <bbb9> 7691
+<bbba> <bbfe> 2184
+<bca1> <bcc7> 2253
+<bcc8> <bcc8> 7693
+<bcc9> <bcc9> 6441
+<bcca> <bcd6> 2294
+<bcd7> <bcd7> 7694
+<bcd8> <bcdc> 2308
+<bcdd> <bcde> 7695
+<bcdf> <bcfe> 2315
+<bda1> <bdaa> 2347
+<bdab> <bdab> 7697
+<bdac> <bdb5> 2358
+<bdb6> <bdb6> 7698
+<bdb7> <bdeb> 2369
+<bdec> <bded> 7699
+<bdee> <bdf1> 2424
+<bdf2> <bdf3> 7701
+<bdf4> <bdfe> 2430
+<bea1> <bea4> 2441
+<bea5> <bea5> 7703
+<bea6> <beb2> 2446
+<beb3> <beb3> 7704
+<beb4> <bebe> 2460
+<bebf> <bebf> 7705
+<bec0> <bed4> 2472
+<bed5> <bed5> 7706
+<bed6> <bede> 2494
+<bedf> <bedf> 7707
+<bee0> <bee3> 2504
+<bee4> <bee4> 7708
+<bee5> <befe> 2509
+<bfa1> <bfa9> 2535
+<bfaa> <bfaa> 7709
+<bfab> <bfd8> 2545
+<bfd9> <bfd9> 7710
+<bfda> <bfdf> 2592
+<bfe0> <bfe0> 7711
+<bfe1> <bfe8> 2599
+<bfe9> <bfe9> 7712
+<bfea> <bffe> 2608
+<c0a1> <c0a1> 2629
+endcidrange
+
+100 begincidrange
+<c0a2> <c0a2> 7713
+<c0a3> <c0c1> 2631
+<c0c2> <c0c2> 7714
+<c0c3> <c0e5> 2663
+<c0e6> <c0e6> 7715
+<c0e7> <c0f0> 2699
+<c0f1> <c0f2> 7716
+<c0f3> <c0f8> 2711
+<c0f9> <c0fa> 7718
+<c0fb> <c0fe> 2719
+<c1a1> <c1a6> 2723
+<c1a7> <c1a7> 7720
+<c1a8> <c1a8> 6766
+<c1a9> <c1b8> 2731
+<c1b9> <c1b9> 7721
+<c1ba> <c1cb> 2748
+<c1cc> <c1cc> 7722
+<c1cd> <c1ce> 2767
+<c1cf> <c1cf> 7723
+<c1d0> <c1de> 2770
+<c1df> <c1df> 7724
+<c1e0> <c1e8> 2786
+<c1e9> <c1e9> 7725
+<c1ea> <c1fe> 2796
+<c2a1> <c2bc> 2817
+<c2bd> <c2bd> 7726
+<c2be> <c2cc> 2846
+<c2cd> <c2cd> 7727
+<c2ce> <c2db> 2862
+<c2dc> <c2dc> 7728
+<c2dd> <c2e2> 2877
+<c2e3> <c2e3> 7729
+<c2e4> <c2ee> 2884
+<c2ef> <c2ef> 7730
+<c2f0> <c2f4> 2896
+<c2f5> <c2f6> 7731
+<c2f7> <c2fc> 2903
+<c2fd> <c2fd> 7733
+<c2fe> <c2fe> 2910
+<c3a1> <c3a6> 2911
+<c3a7> <c3a7> 7734
+<c3a8> <c3a8> 2918
+<c3a9> <c3aa> 7735
+<c3ab> <c3ac> 2921
+<c3ad> <c3ae> 7737
+<c3af> <c3bc> 2925
+<c3bd> <c3bd> 7739
+<c3be> <c3ef> 2940
+<c3f0> <c3f0> 7740
+<c3f1> <c3f4> 2991
+<c3f5> <c3f5> 7741
+<c3f6> <c3fb> 2996
+<c3fc> <c3fc> 7742
+<c3fd> <c3fe> 3003
+<c4a1> <c4bc> 3005
+<c4bd> <c4bd> 7743
+<c4be> <c4c7> 3034
+<c4c8> <c4c8> 7744
+<c4c9> <c4c9> 3045
+<c4ca> <c4ca> 7745
+<c4cb> <c4cc> 3047
+<c4cd> <c4cd> 7746
+<c4ce> <c4ce> 3050
+<c4cf> <c4cf> 7747
+<c4d0> <c4d3> 3052
+<c4d4> <c4d4> 8267
+<c4d5> <c4da> 3057
+<c4db> <c4db> 4533
+<c4dc> <c4fe> 3064
+<c5a1> <c5a1> 3099
+<c5a2> <c5a2> 7748
+<c5a3> <c5a6> 3101
+<c5a7> <c5a7> 7749
+<c5a8> <c5ad> 3106
+<c5ae> <c5ae> 7750
+<c5af> <c5b5> 3113
+<c5b6> <c5b6> 7751
+<c5b7> <c5be> 3121
+<c5bf> <c5bf> 7752
+<c5c0> <c5c7> 3130
+<c5c8> <c5c8> 7753
+<c5c9> <c5ca> 3139
+<c5cb> <c5cb> 7754
+<c5cc> <c5d0> 3142
+<c5d1> <c5d2> 7755
+<c5d3> <c5d6> 3149
+<c5d7> <c5d7> 5855
+<c5d8> <c5e3> 3154
+<c5e4> <c5e4> 7757
+<c5e5> <c5ed> 3167
+<c5ee> <c5ee> 5200
+<c5ef> <c5f2> 3177
+<c5f3> <c5f3> 5430
+<c5f4> <c5f7> 3182
+<c5f8> <c5f8> 7758
+<c5f9> <c5fe> 3187
+<c6a1> <c6bd> 3193
+<c6be> <c6be> 7759
+<c6bf> <c6c1> 3223
+<c6c2> <c6c2> 7760
+endcidrange
+
+100 begincidrange
+<c6c3> <c6d3> 3227
+<c6d4> <c6d5> 7761
+<c6d6> <c6da> 3246
+<c6db> <c6dc> 7763
+<c6dd> <c6e0> 3253
+<c6e1> <c6e1> 7765
+<c6e2> <c6e5> 3258
+<c6e6> <c6e7> 7766
+<c6e8> <c6e9> 3264
+<c6ea> <c6ea> 7768
+<c6eb> <c6f5> 3267
+<c6f6> <c6f6> 6893
+<c6f7> <c6fe> 3279
+<c7a1> <c7a8> 3287
+<c7a9> <c7a9> 7769
+<c7aa> <c7b8> 3296
+<c7b9> <c7b9> 7770
+<c7ba> <c7d6> 3312
+<c7d7> <c7d7> 7771
+<c7d8> <c7e6> 3342
+<c7e7> <c7e7> 7772
+<c7e8> <c7e8> 6537
+<c7e9> <c7e9> 7773
+<c7ea> <c7ec> 3360
+<c7ed> <c7ed> 7774
+<c7ee> <c7fe> 3364
+<c8a1> <c8a3> 3381
+<c8a4> <c8a4> 7775
+<c8a5> <c8ad> 3385
+<c8ae> <c8ae> 7776
+<c8af> <c8af> 3395
+<c8b0> <c8b0> 7777
+<c8b1> <c8d3> 3397
+<c8d4> <c8d4> 7778
+<c8d5> <c8e1> 3433
+<c8e2> <c8e2> 7779
+<c8e3> <c8f4> 3447
+<c8f5> <c8f5> 7780
+<c8f6> <c8fe> 3466
+<c9a1> <c9a1> 3475
+<c9a2> <c9a3> 7781
+<c9a4> <c9ae> 3478
+<c9af> <c9af> 7783
+<c9b0> <c9b0> 5179
+<c9b1> <c9b1> 3491
+<c9b2> <c9b2> 7784
+<c9b3> <c9b4> 3493
+<c9b5> <c9b5> 7785
+<c9b6> <c9bf> 3496
+<c9c0> <c9c0> 7786
+<c9c1> <c9cd> 3507
+<c9ce> <c9ce> 7787
+<c9cf> <c9d0> 3521
+<c9d1> <c9d1> 7788
+<c9d2> <c9fe> 3524
+<caa1> <cac2> 3569
+<cac3> <cac3> 7789
+<cac4> <cacc> 3604
+<cacd> <cacd> 7790
+<cace> <cad9> 3614
+<cada> <cada> 7791
+<cadb> <caf8> 3627
+<caf9> <caf9> 7792
+<cafa> <cafe> 3658
+<cba1> <cba1> 3663
+<cba2> <cba2> 7793
+<cba3> <cba8> 3665
+<cba9> <cba9> 7794
+<cbaa> <cbca> 3672
+<cbcb> <cbcb> 7795
+<cbcc> <cbe9> 3706
+<cbea> <cbea> 7475
+<cbeb> <cbef> 3737
+<cbf0> <cbf0> 7796
+<cbf1> <cbf7> 3743
+<cbf8> <cbf8> 7980
+<cbf9> <cbf9> 4143
+<cbfa> <cbfe> 3752
+<cca1> <cccc> 3757
+<cccd> <cccd> 7797
+<ccce> <ccd8> 3802
+<ccd9> <ccd9> 7798
+<ccda> <ccde> 3814
+<ccdf> <ccdf> 7799
+<cce0> <cce1> 3820
+<cce2> <cce2> 7800
+<cce3> <ccf8> 3823
+<ccf9> <ccf9> 6453
+<ccfa> <ccfa> 7801
+<ccfb> <ccfb> 3847
+<ccfc> <ccfc> 7802
+<ccfd> <ccfd> 3849
+<ccfe> <ccfe> 7803
+<cda1> <cdb1> 3851
+<cdb2> <cdb2> 7804
+<cdb3> <cdcf> 3869
+<cdd0> <cdd0> 7805
+<cdd1> <cdd3> 3899
+<cdd4> <cdd4> 7806
+<cdd5> <cdd9> 3903
+endcidrange
+
+100 begincidrange
+<cdda> <cdda> 7476
+<cddb> <cde8> 3909
+<cde9> <cde9> 7807
+<cdea> <cdfe> 3924
+<cea1> <ceca> 3945
+<cecb> <cecb> 7808
+<cecc> <cef9> 3988
+<cefa> <cefb> 7809
+<cefc> <cefe> 4036
+<cfa1> <cfa1> 7811
+<cfa2> <cfb0> 4040
+<cfb1> <cfb1> 7812
+<cfb2> <cfb5> 4056
+<cfb6> <cfb6> 6007
+<cfb7> <cfb8> 4061
+<cfb9> <cfb9> 7813
+<cfba> <cfd3> 4064
+<d0a1> <d0d5> 4090
+<d0d6> <d0d6> 3751
+<d0d7> <d0fe> 4144
+<d1a1> <d1bc> 4184
+<d1bd> <d1bd> 7814
+<d1be> <d1c6> 4213
+<d1c7> <d1c7> 7815
+<d1c8> <d1ca> 4223
+<d1cb> <d1cb> 7816
+<d1cc> <d1cc> 4227
+<d1cd> <d1cd> 7817
+<d1ce> <d1fe> 4229
+<d2a1> <d2fe> 4278
+<d3a1> <d3af> 4372
+<d3b0> <d3b0> 7818
+<d3b1> <d3b9> 4388
+<d3ba> <d3ba> 7819
+<d3bb> <d3dd> 4398
+<d3de> <d3de> 7821
+<d3df> <d3ea> 4434
+<d3eb> <d3eb> 7822
+<d3ec> <d3fe> 4447
+<d4a1> <d4c3> 4466
+<d4c4> <d4c4> 7823
+<d4c5> <d4e3> 4502
+<d4e4> <d4e4> 3063
+<d4e5> <d4fe> 4534
+<d5a1> <d5bc> 4560
+<d5bd> <d5bd> 7824
+<d5be> <d5e2> 4589
+<d5e3> <d5e3> 7825
+<d5e4> <d5fe> 4627
+<d6a1> <d6a1> 4654
+<d6a2> <d6a2> 7826
+<d6a3> <d6fe> 4656
+<d7a1> <d7fe> 4748
+<d8a1> <d8a3> 4842
+<d8a4> <d8a4> 7828
+<d8a5> <d8fe> 4846
+<d9a1> <d9df> 4936
+<d9e0> <d9e0> 7829
+<d9e1> <d9eb> 5000
+<d9ec> <d9ec> 7830
+<d9ed> <d9f7> 5012
+<d9f8> <d9f8> 1447
+<d9f9> <d9fe> 5024
+<daa1> <dab8> 5030
+<dab9> <dab9> 7831
+<daba> <dacc> 5055
+<dacd> <dacd> 7832
+<dace> <dafe> 5075
+<dba1> <dbc4> 5124
+<dbc5> <dbc5> 7833
+<dbc6> <dbc9> 5161
+<dbca> <dbca> 7834
+<dbcb> <dbd7> 5166
+<dbd8> <dbd8> 3490
+<dbd9> <dbea> 5180
+<dbeb> <dbeb> 7835
+<dbec> <dbec> 5199
+<dbed> <dbed> 3176
+<dbee> <dbf3> 5201
+<dbf4> <dbf4> 7836
+<dbf5> <dbfe> 5208
+<dca1> <dcfe> 5218
+<dda1> <ddfe> 5312
+<dea1> <deb8> 5406
+<deb9> <deb9> 3181
+<deba> <decf> 5431
+<ded0> <ded0> 7837
+<ded1> <def4> 5454
+<def5> <def5> 1535
+<def6> <defe> 5491
+<dfa1> <dffe> 5500
+<e0a1> <e0a5> 5594
+<e0a6> <e0a6> 7839
+<e0a7> <e0de> 5600
+<e0df> <e0df> 7840
+<e0e0> <e0f5> 5657
+<e0f6> <e0f6> 7477
+<e0f7> <e0fe> 5680
+<e1a1> <e1aa> 5688
+<e1ab> <e1ab> 7841
+endcidrange
+
+100 begincidrange
+<e1ac> <e1af> 5699
+<e1b0> <e1b1> 7842
+<e1b2> <e1fe> 5705
+<e2a1> <e2aa> 5782
+<e2ab> <e2ab> 7844
+<e2ac> <e2e7> 5793
+<e2e8> <e2e8> 2030
+<e2e9> <e2e9> 5854
+<e2ea> <e2ea> 3153
+<e2eb> <e2ee> 5856
+<e2ef> <e2ef> 7845
+<e2f0> <e2fe> 5861
+<e3a1> <e3c9> 5876
+<e3ca> <e3ca> 7846
+<e3cb> <e3d3> 5918
+<e3d4> <e3d4> 7847
+<e3d5> <e3dd> 5928
+<e3de> <e3de> 1492
+<e3df> <e3fe> 5938
+<e4a1> <e4b8> 5970
+<e4b9> <e4b9> 7848
+<e4ba> <e4c5> 5995
+<e4c6> <e4c6> 4060
+<e4c7> <e4e3> 6008
+<e4e4> <e4e4> 7849
+<e4e5> <e4ed> 6038
+<e4ee> <e4ee> 7850
+<e4ef> <e4fe> 6048
+<e5a1> <e5b8> 6064
+<e5b9> <e5b9> 7851
+<e5ba> <e5ba> 6089
+<e5bb> <e5bb> 7852
+<e5bc> <e5c5> 6091
+<e5c6> <e5c6> 7853
+<e5c7> <e5fe> 6102
+<e6a1> <e6c5> 6158
+<e6c6> <e6c6> 7854
+<e6c7> <e6fe> 6196
+<e7a1> <e7e3> 6252
+<e7e4> <e7e4> 7855
+<e7e5> <e7e8> 6320
+<e7e9> <e7e9> 7856
+<e7ea> <e7f1> 6325
+<e7f2> <e7f2> 7857
+<e7f3> <e7fe> 6334
+<e8a1> <e8b3> 6346
+<e8b4> <e8b4> 7858
+<e8b5> <e8ba> 6366
+<e8bb> <e8bb> 7859
+<e8bc> <e8f3> 6373
+<e8f4> <e8f4> 7860
+<e8f5> <e8fe> 6430
+<e9a1> <e9a1> 6440
+<e9a2> <e9a2> 2293
+<e9a3> <e9ad> 6442
+<e9ae> <e9ae> 3845
+<e9af> <e9d9> 6454
+<e9da> <e9da> 1440
+<e9db> <e9fe> 6498
+<eaa1> <eaa3> 6534
+<eaa4> <eaa4> 3358
+<eaa5> <eaa6> 6538
+<eaa7> <eaa7> 7862
+<eaa8> <eabc> 6541
+<eabd> <eabd> 7863
+<eabe> <eaee> 6563
+<eaef> <eaef> 7864
+<eaf0> <eafe> 6613
+<eba1> <ebb1> 6628
+<ebb2> <ebb2> 7865
+<ebb3> <ebdc> 6646
+<ebdd> <ebdd> 1550
+<ebde> <ebe5> 6689
+<ebe6> <ebe6> 7866
+<ebe7> <ebf5> 6698
+<ebf6> <ebf6> 7867
+<ebf7> <ebfe> 6714
+<eca1> <eccc> 6722
+<eccd> <eccd> 2730
+<ecce> <ece8> 6767
+<ece9> <ece9> 7868
+<ecea> <ecf3> 6795
+<ecf4> <ecf4> 7869
+<ecf5> <ecfe> 6806
+<eda1> <edcd> 6816
+<edce> <edce> 7870
+<edcf> <edeb> 6862
+<edec> <edec> 7871
+<eded> <eded> 6892
+<edee> <edee> 7872
+<edef> <edfe> 6894
+<eea1> <eea8> 6910
+<eea9> <eea9> 7873
+<eeaa> <eebc> 6919
+<eebd> <eebd> 7874
+<eebe> <eed6> 6939
+<eed7> <eed7> 7875
+<eed8> <eefe> 6965
+<efa1> <effe> 7004
+<f0a1> <f0c4> 7098
+endcidrange
+
+25 begincidrange
+<f0c5> <f0c5> 7878
+<f0c6> <f0d0> 7135
+<f0d1> <f0d1> 7879
+<f0d2> <f0d6> 7147
+<f0d7> <f0d7> 7880
+<f0d8> <f0f3> 7153
+<f0f4> <f0f4> 1841
+<f0f5> <f0f5> 7881
+<f0f6> <f0fe> 7183
+<f1a1> <f1fe> 7192
+<f2a1> <f2ac> 7286
+<f2ad> <f2ad> 7882
+<f2ae> <f2bb> 7299
+<f2bc> <f2bc> 7883
+<f2bd> <f2cc> 7314
+<f2cd> <f2cd> 1143
+<f2ce> <f2ce> 7884
+<f2cf> <f2f3> 7332
+<f2f4> <f2f4> 1321
+<f2f5> <f2fe> 7370
+<f3a1> <f3d0> 7380
+<f3d1> <f3d1> 7885
+<f3d2> <f3fc> 7429
+<f3fd> <f3fd> 7886
+<f3fe> <f3fe> 7473
+endcidrange
+endcmap
+CMapName currentdict /CMap defineresource pop
+end
+end
+
+%%EndResource
+%%EOF
diff --git a/src/main/resources/Resources/cmap/78-EUC-V b/src/main/resources/Resources/cmap/78-EUC-V
new file mode 100644
index 0000000..2564034
--- /dev/null
+++ b/src/main/resources/Resources/cmap/78-EUC-V
@@ -0,0 +1,86 @@
+%!PS-Adobe-3.0 Resource-CMap
+%%DocumentNeededResources: ProcSet (CIDInit)
+%%DocumentNeededResources: CMap (78-EUC-H)
+%%IncludeResource: ProcSet (CIDInit)
+%%IncludeResource: CMap (78-EUC-H)
+%%BeginResource: CMap (78-EUC-V)
+%%Title: (78-EUC-V Adobe Japan1 0)
+%%Version: 6.001
+%%Copyright: -----------------------------------------------------------
+%%Copyright: Copyright 1990-1997 Adobe Systems Incorporated.
+%%Copyright: All Rights Reserved.
+%%Copyright:
+%%Copyright: Patents Pending
+%%Copyright:
+%%Copyright: NOTICE: All information contained herein is the property
+%%Copyright: of Adobe Systems Incorporated.
+%%Copyright:
+%%Copyright: Permission is granted for redistribution of this file
+%%Copyright: provided this copyright notice is maintained intact and
+%%Copyright: that the contents of this file are not altered in any
+%%Copyright: way from its original form.
+%%Copyright:
+%%Copyright: PostScript and Display PostScript are trademarks of
+%%Copyright: Adobe Systems Incorporated which may be registered in
+%%Copyright: certain jurisdictions.
+%%Copyright: -----------------------------------------------------------
+%%EndComments
+
+/CIDInit /ProcSet findresource begin
+
+12 dict begin
+
+begincmap
+
+/78-EUC-H usecmap
+
+/CIDSystemInfo 3 dict dup begin
+ /Registry (Adobe) def
+ /Ordering (Japan1) def
+ /Supplement 0 def
+end def
+
+/CMapName /78-EUC-V def
+/CMapVersion 6.001 def
+/CMapType 1 def
+
+/XUID [1 10 25355] def
+
+/WMode 1 def
+
+27 begincidrange
+<a1a2> <a1a3> 7887
+<a1b1> <a1b2> 7889
+<a1bc> <a1be> 7891
+<a1c1> <a1c5> 7894
+<a1ca> <a1db> 7899
+<a1e1> <a1e1> 7917
+<a4a1> <a4a1> 7918
+<a4a3> <a4a3> 7919
+<a4a5> <a4a5> 7920
+<a4a7> <a4a7> 7921
+<a4a9> <a4a9> 7922
+<a4c3> <a4c3> 7923
+<a4e3> <a4e3> 7924
+<a4e5> <a4e5> 7925
+<a4e7> <a4e7> 7926
+<a4ee> <a4ee> 7927
+<a5a1> <a5a1> 7928
+<a5a3> <a5a3> 7929
+<a5a5> <a5a5> 7930
+<a5a7> <a5a7> 7931
+<a5a9> <a5a9> 7932
+<a5c3> <a5c3> 7933
+<a5e3> <a5e3> 7934
+<a5e5> <a5e5> 7935
+<a5e7> <a5e7> 7936
+<a5ee> <a5ee> 7937
+<a5f5> <a5f6> 7938
+endcidrange
+endcmap
+CMapName currentdict /CMap defineresource pop
+end
+end
+
+%%EndResource
+%%EOF
diff --git a/src/main/resources/Resources/cmap/78-H b/src/main/resources/Resources/cmap/78-H
new file mode 100644
index 0000000..f171e6e
--- /dev/null
+++ b/src/main/resources/Resources/cmap/78-H
@@ -0,0 +1,700 @@
+%!PS-Adobe-3.0 Resource-CMap
+%%DocumentNeededResources: ProcSet (CIDInit)
+%%IncludeResource: ProcSet (CIDInit)
+%%BeginResource: CMap (78-H)
+%%Title: (78-H Adobe Japan1 0)
+%%Version: 6.001
+%%Copyright: -----------------------------------------------------------
+%%Copyright: Copyright 1990-1997 Adobe Systems Incorporated.
+%%Copyright: All Rights Reserved.
+%%Copyright:
+%%Copyright: Patents Pending
+%%Copyright:
+%%Copyright: NOTICE: All information contained herein is the property
+%%Copyright: of Adobe Systems Incorporated.
+%%Copyright:
+%%Copyright: Permission is granted for redistribution of this file
+%%Copyright: provided this copyright notice is maintained intact and
+%%Copyright: that the contents of this file are not altered in any
+%%Copyright: way from its original form.
+%%Copyright:
+%%Copyright: PostScript and Display PostScript are trademarks of
+%%Copyright: Adobe Systems Incorporated which may be registered in
+%%Copyright: certain jurisdictions.
+%%Copyright: -----------------------------------------------------------
+%%EndComments
+
+/CIDInit /ProcSet findresource begin
+
+12 dict begin
+
+begincmap
+
+/CIDSystemInfo 3 dict dup begin
+ /Registry (Adobe) def
+ /Ordering (Japan1) def
+ /Supplement 0 def
+end def
+
+/CMapName /78-H def
+/CMapVersion 6.001 def
+/CMapType 1 def
+
+/XUID [1 10 25345] def
+
+/WMode 0 def
+
+1 begincodespacerange
+ <2121> <7E7E>
+endcodespacerange
+
+100 begincidrange
+<2121> <217e> 633
+<2221> <222e> 727
+<2330> <2339> 780
+<2341> <235a> 790
+<2361> <237a> 816
+<2421> <2473> 842
+<2521> <2576> 925
+<2621> <2638> 1011
+<2641> <2658> 1035
+<2721> <2741> 1059
+<2751> <2771> 1092
+<3021> <3021> 1125
+<3022> <3022> 7633
+<3023> <3028> 1127
+<3029> <3029> 8266
+<302a> <3031> 1134
+<3032> <3032> 7961
+<3033> <3033> 7330
+<3034> <303a> 1144
+<303b> <303b> 7634
+<303c> <306d> 1152
+<306e> <306e> 7635
+<306f> <3072> 1203
+<3073> <3073> 7636
+<3074> <307b> 1208
+<307c> <307c> 7637
+<307d> <307e> 1217
+<3121> <3129> 1219
+<312a> <312a> 7638
+<312b> <3134> 1229
+<3135> <3135> 7639
+<3136> <3138> 1240
+<3139> <3139> 7640
+<313a> <313c> 1244
+<313d> <313d> 7642
+<313e> <3141> 1248
+<3142> <3142> 7643
+<3143> <316a> 1253
+<316b> <316b> 7644
+<316c> <317e> 1294
+<3221> <3227> 1313
+<3228> <3228> 7645
+<3229> <3229> 7369
+<322a> <322a> 7646
+<322b> <325f> 1323
+<3260> <3260> 7647
+<3261> <3279> 1377
+<327a> <327a> 7648
+<327b> <327c> 1403
+<327d> <327d> 7649
+<327e> <327e> 1406
+<3321> <3321> 1407
+<3322> <3322> 7650
+<3323> <3341> 1409
+<3342> <3342> 6497
+<3343> <3348> 1441
+<3349> <3349> 5023
+<334a> <3364> 1448
+<3365> <3365> 7651
+<3366> <336a> 1476
+<336b> <336b> 7652
+<336c> <3372> 1482
+<3373> <3373> 7653
+<3374> <3375> 1490
+<3376> <3376> 5937
+<3377> <3379> 1493
+<337a> <337a> 7654
+<337b> <337e> 1497
+<3421> <3441> 1501
+<3442> <3442> 7655
+<3443> <3443> 5490
+<3444> <344c> 1536
+<344d> <344d> 7656
+<344e> <3451> 1546
+<3452> <3452> 6688
+<3453> <3464> 1551
+<3465> <3465> 7657
+<3466> <347e> 1570
+<3521> <352a> 1595
+<352b> <352b> 7658
+<352c> <353f> 1606
+<3540> <3540> 7659
+<3541> <357e> 1627
+<3621> <3621> 1689
+<3622> <3622> 7660
+<3623> <3629> 1691
+<362a> <362a> 7661
+<362b> <3645> 1699
+<3646> <3646> 7474
+<3647> <364e> 1727
+<364f> <364f> 7662
+<3650> <366c> 1736
+<366d> <366d> 7663
+<366e> <3673> 1766
+<3674> <3674> 7664
+<3675> <367a> 1773
+<367b> <367b> 7665
+<367c> <367c> 1780
+<367d> <367d> 7666
+<367e> <367e> 1782
+endcidrange
+
+100 begincidrange
+<3721> <3723> 1783
+<3724> <3724> 7667
+<3725> <3736> 1787
+<3737> <3737> 7668
+<3738> <3744> 1806
+<3745> <3745> 7669
+<3746> <374d> 1820
+<374e> <374e> 7670
+<374f> <3751> 1829
+<3752> <3752> 7671
+<3753> <3754> 1833
+<3755> <3755> 7672
+<3756> <375a> 1836
+<375b> <375b> 7181
+<375c> <3763> 1842
+<3764> <3764> 7673
+<3765> <3770> 1851
+<3771> <3771> 7674
+<3772> <3778> 1864
+<3779> <3779> 7675
+<377a> <377d> 1872
+<377e> <377e> 7676
+<3821> <3833> 1877
+<3834> <3834> 7677
+<3835> <3840> 1897
+<3841> <3841> 7678
+<3842> <387e> 1910
+<3921> <392a> 1971
+<392b> <392b> 7679
+<392c> <3936> 1982
+<3937> <3937> 7680
+<3938> <3941> 1994
+<3942> <3942> 7681
+<3943> <395b> 2005
+<395c> <395c> 5853
+<395d> <396c> 2031
+<396d> <396d> 7682
+<396e> <3973> 2048
+<3974> <3974> 7683
+<3975> <3978> 2055
+<3979> <3979> 7684
+<397a> <397e> 2060
+<3a21> <3a52> 2065
+<3a53> <3a53> 7685
+<3a54> <3a66> 2116
+<3a67> <3a67> 7686
+<3a68> <3a73> 2136
+<3a74> <3a74> 7687
+<3a75> <3a7e> 2149
+<3b21> <3b26> 2159
+<3b27> <3b27> 7688
+<3b28> <3b29> 2166
+<3b2a> <3b2a> 7689
+<3b2b> <3b2b> 2169
+<3b2c> <3b2c> 7690
+<3b2d> <3b38> 2171
+<3b39> <3b39> 7691
+<3b3a> <3b7e> 2184
+<3c21> <3c47> 2253
+<3c48> <3c48> 7693
+<3c49> <3c49> 6441
+<3c4a> <3c56> 2294
+<3c57> <3c57> 7694
+<3c58> <3c5c> 2308
+<3c5d> <3c5e> 7695
+<3c5f> <3c7e> 2315
+<3d21> <3d2a> 2347
+<3d2b> <3d2b> 7697
+<3d2c> <3d35> 2358
+<3d36> <3d36> 7698
+<3d37> <3d6b> 2369
+<3d6c> <3d6d> 7699
+<3d6e> <3d71> 2424
+<3d72> <3d73> 7701
+<3d74> <3d7e> 2430
+<3e21> <3e24> 2441
+<3e25> <3e25> 7703
+<3e26> <3e32> 2446
+<3e33> <3e33> 7704
+<3e34> <3e3e> 2460
+<3e3f> <3e3f> 7705
+<3e40> <3e54> 2472
+<3e55> <3e55> 7706
+<3e56> <3e5e> 2494
+<3e5f> <3e5f> 7707
+<3e60> <3e63> 2504
+<3e64> <3e64> 7708
+<3e65> <3e7e> 2509
+<3f21> <3f29> 2535
+<3f2a> <3f2a> 7709
+<3f2b> <3f58> 2545
+<3f59> <3f59> 7710
+<3f5a> <3f5f> 2592
+<3f60> <3f60> 7711
+<3f61> <3f68> 2599
+<3f69> <3f69> 7712
+<3f6a> <3f7e> 2608
+<4021> <4021> 2629
+<4022> <4022> 7713
+<4023> <4041> 2631
+endcidrange
+
+100 begincidrange
+<4042> <4042> 7714
+<4043> <4065> 2663
+<4066> <4066> 7715
+<4067> <4070> 2699
+<4071> <4072> 7716
+<4073> <4078> 2711
+<4079> <407a> 7718
+<407b> <407e> 2719
+<4121> <4126> 2723
+<4127> <4127> 7720
+<4128> <4128> 6766
+<4129> <4138> 2731
+<4139> <4139> 7721
+<413a> <414b> 2748
+<414c> <414c> 7722
+<414d> <414e> 2767
+<414f> <414f> 7723
+<4150> <415e> 2770
+<415f> <415f> 7724
+<4160> <4168> 2786
+<4169> <4169> 7725
+<416a> <417e> 2796
+<4221> <423c> 2817
+<423d> <423d> 7726
+<423e> <424c> 2846
+<424d> <424d> 7727
+<424e> <425b> 2862
+<425c> <425c> 7728
+<425d> <4262> 2877
+<4263> <4263> 7729
+<4264> <426e> 2884
+<426f> <426f> 7730
+<4270> <4274> 2896
+<4275> <4276> 7731
+<4277> <427c> 2903
+<427d> <427d> 7733
+<427e> <427e> 2910
+<4321> <4326> 2911
+<4327> <4327> 7734
+<4328> <4328> 2918
+<4329> <432a> 7735
+<432b> <432c> 2921
+<432d> <432e> 7737
+<432f> <433c> 2925
+<433d> <433d> 7739
+<433e> <436f> 2940
+<4370> <4370> 7740
+<4371> <4374> 2991
+<4375> <4375> 7741
+<4376> <437b> 2996
+<437c> <437c> 7742
+<437d> <437e> 3003
+<4421> <443c> 3005
+<443d> <443d> 7743
+<443e> <4447> 3034
+<4448> <4448> 7744
+<4449> <4449> 3045
+<444a> <444a> 7745
+<444b> <444c> 3047
+<444d> <444d> 7746
+<444e> <444e> 3050
+<444f> <444f> 7747
+<4450> <4453> 3052
+<4454> <4454> 8267
+<4455> <445a> 3057
+<445b> <445b> 4533
+<445c> <447e> 3064
+<4521> <4521> 3099
+<4522> <4522> 7748
+<4523> <4526> 3101
+<4527> <4527> 7749
+<4528> <452d> 3106
+<452e> <452e> 7750
+<452f> <4535> 3113
+<4536> <4536> 7751
+<4537> <453e> 3121
+<453f> <453f> 7752
+<4540> <4547> 3130
+<4548> <4548> 7753
+<4549> <454a> 3139
+<454b> <454b> 7754
+<454c> <4550> 3142
+<4551> <4552> 7755
+<4553> <4556> 3149
+<4557> <4557> 5855
+<4558> <4563> 3154
+<4564> <4564> 7757
+<4565> <456d> 3167
+<456e> <456e> 5200
+<456f> <4572> 3177
+<4573> <4573> 5430
+<4574> <4577> 3182
+<4578> <4578> 7758
+<4579> <457e> 3187
+<4621> <463d> 3193
+<463e> <463e> 7759
+<463f> <4641> 3223
+<4642> <4642> 7760
+<4643> <4653> 3227
+<4654> <4655> 7761
+endcidrange
+
+100 begincidrange
+<4656> <465a> 3246
+<465b> <465c> 7763
+<465d> <4660> 3253
+<4661> <4661> 7765
+<4662> <4665> 3258
+<4666> <4667> 7766
+<4668> <4669> 3264
+<466a> <466a> 7768
+<466b> <4675> 3267
+<4676> <4676> 6893
+<4677> <467e> 3279
+<4721> <4728> 3287
+<4729> <4729> 7769
+<472a> <4738> 3296
+<4739> <4739> 7770
+<473a> <4756> 3312
+<4757> <4757> 7771
+<4758> <4766> 3342
+<4767> <4767> 7772
+<4768> <4768> 6537
+<4769> <4769> 7773
+<476a> <476c> 3360
+<476d> <476d> 7774
+<476e> <477e> 3364
+<4821> <4823> 3381
+<4824> <4824> 7775
+<4825> <482d> 3385
+<482e> <482e> 7776
+<482f> <482f> 3395
+<4830> <4830> 7777
+<4831> <4853> 3397
+<4854> <4854> 7778
+<4855> <4861> 3433
+<4862> <4862> 7779
+<4863> <4874> 3447
+<4875> <4875> 7780
+<4876> <487e> 3466
+<4921> <4921> 3475
+<4922> <4923> 7781
+<4924> <492e> 3478
+<492f> <492f> 7783
+<4930> <4930> 5179
+<4931> <4931> 3491
+<4932> <4932> 7784
+<4933> <4934> 3493
+<4935> <4935> 7785
+<4936> <493f> 3496
+<4940> <4940> 7786
+<4941> <494d> 3507
+<494e> <494e> 7787
+<494f> <4950> 3521
+<4951> <4951> 7788
+<4952> <497e> 3524
+<4a21> <4a42> 3569
+<4a43> <4a43> 7789
+<4a44> <4a4c> 3604
+<4a4d> <4a4d> 7790
+<4a4e> <4a59> 3614
+<4a5a> <4a5a> 7791
+<4a5b> <4a78> 3627
+<4a79> <4a79> 7792
+<4a7a> <4a7e> 3658
+<4b21> <4b21> 3663
+<4b22> <4b22> 7793
+<4b23> <4b28> 3665
+<4b29> <4b29> 7794
+<4b2a> <4b4a> 3672
+<4b4b> <4b4b> 7795
+<4b4c> <4b69> 3706
+<4b6a> <4b6a> 7475
+<4b6b> <4b6f> 3737
+<4b70> <4b70> 7796
+<4b71> <4b77> 3743
+<4b78> <4b78> 7980
+<4b79> <4b79> 4143
+<4b7a> <4b7e> 3752
+<4c21> <4c4c> 3757
+<4c4d> <4c4d> 7797
+<4c4e> <4c58> 3802
+<4c59> <4c59> 7798
+<4c5a> <4c5e> 3814
+<4c5f> <4c5f> 7799
+<4c60> <4c61> 3820
+<4c62> <4c62> 7800
+<4c63> <4c78> 3823
+<4c79> <4c79> 6453
+<4c7a> <4c7a> 7801
+<4c7b> <4c7b> 3847
+<4c7c> <4c7c> 7802
+<4c7d> <4c7d> 3849
+<4c7e> <4c7e> 7803
+<4d21> <4d31> 3851
+<4d32> <4d32> 7804
+<4d33> <4d4f> 3869
+<4d50> <4d50> 7805
+<4d51> <4d53> 3899
+<4d54> <4d54> 7806
+<4d55> <4d59> 3903
+<4d5a> <4d5a> 7476
+<4d5b> <4d68> 3909
+endcidrange
+
+100 begincidrange
+<4d69> <4d69> 7807
+<4d6a> <4d7e> 3924
+<4e21> <4e4a> 3945
+<4e4b> <4e4b> 7808
+<4e4c> <4e79> 3988
+<4e7a> <4e7b> 7809
+<4e7c> <4e7e> 4036
+<4f21> <4f21> 7811
+<4f22> <4f30> 4040
+<4f31> <4f31> 7812
+<4f32> <4f35> 4056
+<4f36> <4f36> 6007
+<4f37> <4f38> 4061
+<4f39> <4f39> 7813
+<4f3a> <4f53> 4064
+<5021> <5055> 4090
+<5056> <5056> 3751
+<5057> <507e> 4144
+<5121> <513c> 4184
+<513d> <513d> 7814
+<513e> <5146> 4213
+<5147> <5147> 7815
+<5148> <514a> 4223
+<514b> <514b> 7816
+<514c> <514c> 4227
+<514d> <514d> 7817
+<514e> <517e> 4229
+<5221> <527e> 4278
+<5321> <532f> 4372
+<5330> <5330> 7818
+<5331> <5339> 4388
+<533a> <533a> 7819
+<533b> <535d> 4398
+<535e> <535e> 7821
+<535f> <536a> 4434
+<536b> <536b> 7822
+<536c> <537e> 4447
+<5421> <5443> 4466
+<5444> <5444> 7823
+<5445> <5463> 4502
+<5464> <5464> 3063
+<5465> <547e> 4534
+<5521> <553c> 4560
+<553d> <553d> 7824
+<553e> <5562> 4589
+<5563> <5563> 7825
+<5564> <557e> 4627
+<5621> <5621> 4654
+<5622> <5622> 7826
+<5623> <567e> 4656
+<5721> <577e> 4748
+<5821> <5823> 4842
+<5824> <5824> 7828
+<5825> <587e> 4846
+<5921> <595f> 4936
+<5960> <5960> 7829
+<5961> <596b> 5000
+<596c> <596c> 7830
+<596d> <5977> 5012
+<5978> <5978> 1447
+<5979> <597e> 5024
+<5a21> <5a38> 5030
+<5a39> <5a39> 7831
+<5a3a> <5a4c> 5055
+<5a4d> <5a4d> 7832
+<5a4e> <5a7e> 5075
+<5b21> <5b44> 5124
+<5b45> <5b45> 7833
+<5b46> <5b49> 5161
+<5b4a> <5b4a> 7834
+<5b4b> <5b57> 5166
+<5b58> <5b58> 3490
+<5b59> <5b6a> 5180
+<5b6b> <5b6b> 7835
+<5b6c> <5b6c> 5199
+<5b6d> <5b6d> 3176
+<5b6e> <5b73> 5201
+<5b74> <5b74> 7836
+<5b75> <5b7e> 5208
+<5c21> <5c7e> 5218
+<5d21> <5d7e> 5312
+<5e21> <5e38> 5406
+<5e39> <5e39> 3181
+<5e3a> <5e4f> 5431
+<5e50> <5e50> 7837
+<5e51> <5e74> 5454
+<5e75> <5e75> 1535
+<5e76> <5e7e> 5491
+<5f21> <5f7e> 5500
+<6021> <6025> 5594
+<6026> <6026> 7839
+<6027> <605e> 5600
+<605f> <605f> 7840
+<6060> <6075> 5657
+<6076> <6076> 7477
+<6077> <607e> 5680
+<6121> <612a> 5688
+<612b> <612b> 7841
+<612c> <612f> 5699
+<6130> <6131> 7842
+endcidrange
+
+100 begincidrange
+<6132> <617e> 5705
+<6221> <622a> 5782
+<622b> <622b> 7844
+<622c> <6267> 5793
+<6268> <6268> 2030
+<6269> <6269> 5854
+<626a> <626a> 3153
+<626b> <626e> 5856
+<626f> <626f> 7845
+<6270> <627e> 5861
+<6321> <6349> 5876
+<634a> <634a> 7846
+<634b> <6353> 5918
+<6354> <6354> 7847
+<6355> <635d> 5928
+<635e> <635e> 1492
+<635f> <637e> 5938
+<6421> <6438> 5970
+<6439> <6439> 7848
+<643a> <6445> 5995
+<6446> <6446> 4060
+<6447> <6463> 6008
+<6464> <6464> 7849
+<6465> <646d> 6038
+<646e> <646e> 7850
+<646f> <647e> 6048
+<6521> <6538> 6064
+<6539> <6539> 7851
+<653a> <653a> 6089
+<653b> <653b> 7852
+<653c> <6545> 6091
+<6546> <6546> 7853
+<6547> <657e> 6102
+<6621> <6645> 6158
+<6646> <6646> 7854
+<6647> <667e> 6196
+<6721> <6763> 6252
+<6764> <6764> 7855
+<6765> <6768> 6320
+<6769> <6769> 7856
+<676a> <6771> 6325
+<6772> <6772> 7857
+<6773> <677e> 6334
+<6821> <6833> 6346
+<6834> <6834> 7858
+<6835> <683a> 6366
+<683b> <683b> 7859
+<683c> <6873> 6373
+<6874> <6874> 7860
+<6875> <687e> 6430
+<6921> <6921> 6440
+<6922> <6922> 2293
+<6923> <692d> 6442
+<692e> <692e> 3845
+<692f> <6959> 6454
+<695a> <695a> 1440
+<695b> <697e> 6498
+<6a21> <6a23> 6534
+<6a24> <6a24> 3358
+<6a25> <6a26> 6538
+<6a27> <6a27> 7862
+<6a28> <6a3c> 6541
+<6a3d> <6a3d> 7863
+<6a3e> <6a6e> 6563
+<6a6f> <6a6f> 7864
+<6a70> <6a7e> 6613
+<6b21> <6b31> 6628
+<6b32> <6b32> 7865
+<6b33> <6b5c> 6646
+<6b5d> <6b5d> 1550
+<6b5e> <6b65> 6689
+<6b66> <6b66> 7866
+<6b67> <6b75> 6698
+<6b76> <6b76> 7867
+<6b77> <6b7e> 6714
+<6c21> <6c4c> 6722
+<6c4d> <6c4d> 2730
+<6c4e> <6c68> 6767
+<6c69> <6c69> 7868
+<6c6a> <6c73> 6795
+<6c74> <6c74> 7869
+<6c75> <6c7e> 6806
+<6d21> <6d4d> 6816
+<6d4e> <6d4e> 7870
+<6d4f> <6d6b> 6862
+<6d6c> <6d6c> 7871
+<6d6d> <6d6d> 6892
+<6d6e> <6d6e> 7872
+<6d6f> <6d7e> 6894
+<6e21> <6e28> 6910
+<6e29> <6e29> 7873
+<6e2a> <6e3c> 6919
+<6e3d> <6e3d> 7874
+<6e3e> <6e56> 6939
+<6e57> <6e57> 7875
+<6e58> <6e7e> 6965
+<6f21> <6f7e> 7004
+<7021> <7044> 7098
+<7045> <7045> 7878
+<7046> <7050> 7135
+endcidrange
+
+23 begincidrange
+<7051> <7051> 7879
+<7052> <7056> 7147
+<7057> <7057> 7880
+<7058> <7073> 7153
+<7074> <7074> 1841
+<7075> <7075> 7881
+<7076> <707e> 7183
+<7121> <717e> 7192
+<7221> <722c> 7286
+<722d> <722d> 7882
+<722e> <723b> 7299
+<723c> <723c> 7883
+<723d> <724c> 7314
+<724d> <724d> 1143
+<724e> <724e> 7884
+<724f> <7273> 7332
+<7274> <7274> 1321
+<7275> <727e> 7370
+<7321> <7350> 7380
+<7351> <7351> 7885
+<7352> <737c> 7429
+<737d> <737d> 7886
+<737e> <737e> 7473
+endcidrange
+endcmap
+CMapName currentdict /CMap defineresource pop
+end
+end
+
+%%EndResource
+%%EOF
diff --git a/src/main/resources/Resources/cmap/78-RKSJ-H b/src/main/resources/Resources/cmap/78-RKSJ-H
new file mode 100644
index 0000000..bdfa403
--- /dev/null
+++ b/src/main/resources/Resources/cmap/78-RKSJ-H
@@ -0,0 +1,710 @@
+%!PS-Adobe-3.0 Resource-CMap
+%%DocumentNeededResources: ProcSet (CIDInit)
+%%IncludeResource: ProcSet (CIDInit)
+%%BeginResource: CMap (78-RKSJ-H)
+%%Title: (78-RKSJ-H Adobe Japan1 0)
+%%Version: 6.001
+%%Copyright: -----------------------------------------------------------
+%%Copyright: Copyright 1990-1997 Adobe Systems Incorporated.
+%%Copyright: All Rights Reserved.
+%%Copyright:
+%%Copyright: Patents Pending
+%%Copyright:
+%%Copyright: NOTICE: All information contained herein is the property
+%%Copyright: of Adobe Systems Incorporated.
+%%Copyright:
+%%Copyright: Permission is granted for redistribution of this file
+%%Copyright: provided this copyright notice is maintained intact and
+%%Copyright: that the contents of this file are not altered in any
+%%Copyright: way from its original form.
+%%Copyright:
+%%Copyright: PostScript and Display PostScript are trademarks of
+%%Copyright: Adobe Systems Incorporated which may be registered in
+%%Copyright: certain jurisdictions.
+%%Copyright: -----------------------------------------------------------
+%%EndComments
+
+/CIDInit /ProcSet findresource begin
+
+12 dict begin
+
+begincmap
+
+/CIDSystemInfo 3 dict dup begin
+ /Registry (Adobe) def
+ /Ordering (Japan1) def
+ /Supplement 0 def
+end def
+
+/CMapName /78-RKSJ-H def
+/CMapVersion 6.001 def
+/CMapType 1 def
+
+/XUID [1 10 25346] def
+
+/WMode 0 def
+
+4 begincodespacerange
+ <00> <80>
+ <8140> <9FFC>
+ <A0> <DF>
+ <E040> <FCFC>
+endcodespacerange
+
+1 beginnotdefrange
+<00> <1f> 231
+endnotdefrange
+
+100 begincidrange
+<20> <7e> 231
+<8140> <817e> 633
+<8180> <81ac> 696
+<824f> <8258> 780
+<8260> <8279> 790
+<8281> <829a> 816
+<829f> <82f1> 842
+<8340> <837e> 925
+<8380> <8396> 988
+<839f> <83b6> 1011
+<83bf> <83d6> 1035
+<8440> <8460> 1059
+<8470> <847e> 1092
+<8480> <8491> 1107
+<889f> <889f> 1125
+<88a0> <88a0> 7633
+<88a1> <88a6> 1127
+<88a7> <88a7> 8266
+<88a8> <88af> 1134
+<88b0> <88b0> 7961
+<88b1> <88b1> 7330
+<88b2> <88b8> 1144
+<88b9> <88b9> 7634
+<88ba> <88eb> 1152
+<88ec> <88ec> 7635
+<88ed> <88f0> 1203
+<88f1> <88f1> 7636
+<88f2> <88f9> 1208
+<88fa> <88fa> 7637
+<88fb> <88fc> 1217
+<8940> <8948> 1219
+<8949> <8949> 7638
+<894a> <8953> 1229
+<8954> <8954> 7639
+<8955> <8957> 1240
+<8958> <8958> 7640
+<8959> <895b> 1244
+<895c> <895c> 7642
+<895d> <8960> 1248
+<8961> <8961> 7643
+<8962> <897e> 1253
+<8980> <898a> 1282
+<898b> <898b> 7644
+<898c> <89a5> 1294
+<89a6> <89a6> 7645
+<89a7> <89a7> 7369
+<89a8> <89a8> 7646
+<89a9> <89dd> 1323
+<89de> <89de> 7647
+<89df> <89f7> 1377
+<89f8> <89f8> 7648
+<89f9> <89fa> 1403
+<89fb> <89fb> 7649
+<89fc> <89fc> 1406
+<8a40> <8a40> 1407
+<8a41> <8a41> 7650
+<8a42> <8a60> 1409
+<8a61> <8a61> 6497
+<8a62> <8a67> 1441
+<8a68> <8a68> 5023
+<8a69> <8a7e> 1448
+<8a80> <8a84> 1470
+<8a85> <8a85> 7651
+<8a86> <8a8a> 1476
+<8a8b> <8a8b> 7652
+<8a8c> <8a92> 1482
+<8a93> <8a93> 7653
+<8a94> <8a95> 1490
+<8a96> <8a96> 5937
+<8a97> <8a99> 1493
+<8a9a> <8a9a> 7654
+<8a9b> <8abf> 1497
+<8ac0> <8ac0> 7655
+<8ac1> <8ac1> 5490
+<8ac2> <8aca> 1536
+<8acb> <8acb> 7656
+<8acc> <8acf> 1546
+<8ad0> <8ad0> 6688
+<8ad1> <8ae2> 1551
+<8ae3> <8ae3> 7657
+<8ae4> <8afc> 1570
+<8b40> <8b49> 1595
+<8b4a> <8b4a> 7658
+<8b4b> <8b5e> 1606
+<8b5f> <8b5f> 7659
+<8b60> <8b7e> 1627
+<8b80> <8b9f> 1658
+<8ba0> <8ba0> 7660
+<8ba1> <8ba7> 1691
+<8ba8> <8ba8> 7661
+<8ba9> <8bc3> 1699
+<8bc4> <8bc4> 7474
+<8bc5> <8bcc> 1727
+<8bcd> <8bcd> 7662
+<8bce> <8bea> 1736
+<8beb> <8beb> 7663
+<8bec> <8bf1> 1766
+<8bf2> <8bf2> 7664
+<8bf3> <8bf8> 1773
+<8bf9> <8bf9> 7665
+endcidrange
+
+100 begincidrange
+<8bfa> <8bfa> 1780
+<8bfb> <8bfb> 7666
+<8bfc> <8bfc> 1782
+<8c40> <8c42> 1783
+<8c43> <8c43> 7667
+<8c44> <8c55> 1787
+<8c56> <8c56> 7668
+<8c57> <8c63> 1806
+<8c64> <8c64> 7669
+<8c65> <8c6c> 1820
+<8c6d> <8c6d> 7670
+<8c6e> <8c70> 1829
+<8c71> <8c71> 7671
+<8c72> <8c73> 1833
+<8c74> <8c74> 7672
+<8c75> <8c79> 1836
+<8c7a> <8c7a> 7181
+<8c7b> <8c7e> 1842
+<8c80> <8c83> 1846
+<8c84> <8c84> 7673
+<8c85> <8c90> 1851
+<8c91> <8c91> 7674
+<8c92> <8c98> 1864
+<8c99> <8c99> 7675
+<8c9a> <8c9d> 1872
+<8c9e> <8c9e> 7676
+<8c9f> <8cb1> 1877
+<8cb2> <8cb2> 7677
+<8cb3> <8cbe> 1897
+<8cbf> <8cbf> 7678
+<8cc0> <8cfc> 1910
+<8d40> <8d49> 1971
+<8d4a> <8d4a> 7679
+<8d4b> <8d55> 1982
+<8d56> <8d56> 7680
+<8d57> <8d60> 1994
+<8d61> <8d61> 7681
+<8d62> <8d7a> 2005
+<8d7b> <8d7b> 5853
+<8d7c> <8d7e> 2031
+<8d80> <8d8c> 2034
+<8d8d> <8d8d> 7682
+<8d8e> <8d93> 2048
+<8d94> <8d94> 7683
+<8d95> <8d98> 2055
+<8d99> <8d99> 7684
+<8d9a> <8dd0> 2060
+<8dd1> <8dd1> 7685
+<8dd2> <8de4> 2116
+<8de5> <8de5> 7686
+<8de6> <8df1> 2136
+<8df2> <8df2> 7687
+<8df3> <8dfc> 2149
+<8e40> <8e45> 2159
+<8e46> <8e46> 7688
+<8e47> <8e48> 2166
+<8e49> <8e49> 7689
+<8e4a> <8e4a> 2169
+<8e4b> <8e4b> 7690
+<8e4c> <8e57> 2171
+<8e58> <8e58> 7691
+<8e59> <8e7e> 2184
+<8e80> <8ec5> 2222
+<8ec6> <8ec6> 7693
+<8ec7> <8ec7> 6441
+<8ec8> <8ed4> 2294
+<8ed5> <8ed5> 7694
+<8ed6> <8eda> 2308
+<8edb> <8edc> 7695
+<8edd> <8efc> 2315
+<8f40> <8f49> 2347
+<8f4a> <8f4a> 7697
+<8f4b> <8f54> 2358
+<8f55> <8f55> 7698
+<8f56> <8f7e> 2369
+<8f80> <8f8b> 2410
+<8f8c> <8f8d> 7699
+<8f8e> <8f91> 2424
+<8f92> <8f93> 7701
+<8f94> <8fa2> 2430
+<8fa3> <8fa3> 7703
+<8fa4> <8fb0> 2446
+<8fb1> <8fb1> 7704
+<8fb2> <8fbc> 2460
+<8fbd> <8fbd> 7705
+<8fbe> <8fd2> 2472
+<8fd3> <8fd3> 7706
+<8fd4> <8fdc> 2494
+<8fdd> <8fdd> 7707
+<8fde> <8fe1> 2504
+<8fe2> <8fe2> 7708
+<8fe3> <8ffc> 2509
+<9040> <9048> 2535
+<9049> <9049> 7709
+<904a> <9077> 2545
+<9078> <9078> 7710
+<9079> <907e> 2592
+<9080> <9080> 7711
+<9081> <9088> 2599
+<9089> <9089> 7712
+endcidrange
+
+100 begincidrange
+<908a> <909f> 2608
+<90a0> <90a0> 7713
+<90a1> <90bf> 2631
+<90c0> <90c0> 7714
+<90c1> <90e3> 2663
+<90e4> <90e4> 7715
+<90e5> <90ee> 2699
+<90ef> <90f0> 7716
+<90f1> <90f6> 2711
+<90f7> <90f8> 7718
+<90f9> <90fc> 2719
+<9140> <9145> 2723
+<9146> <9146> 7720
+<9147> <9147> 6766
+<9148> <9157> 2731
+<9158> <9158> 7721
+<9159> <916a> 2748
+<916b> <916b> 7722
+<916c> <916d> 2767
+<916e> <916e> 7723
+<916f> <917d> 2770
+<917e> <917e> 7724
+<9180> <9188> 2786
+<9189> <9189> 7725
+<918a> <91ba> 2796
+<91bb> <91bb> 7726
+<91bc> <91ca> 2846
+<91cb> <91cb> 7727
+<91cc> <91d9> 2862
+<91da> <91da> 7728
+<91db> <91e0> 2877
+<91e1> <91e1> 7729
+<91e2> <91ec> 2884
+<91ed> <91ed> 7730
+<91ee> <91f2> 2896
+<91f3> <91f4> 7731
+<91f5> <91fa> 2903
+<91fb> <91fb> 7733
+<91fc> <91fc> 2910
+<9240> <9245> 2911
+<9246> <9246> 7734
+<9247> <9247> 2918
+<9248> <9249> 7735
+<924a> <924b> 2921
+<924c> <924d> 7737
+<924e> <925b> 2925
+<925c> <925c> 7739
+<925d> <927e> 2940
+<9280> <928f> 2974
+<9290> <9290> 7740
+<9291> <9294> 2991
+<9295> <9295> 7741
+<9296> <929b> 2996
+<929c> <929c> 7742
+<929d> <92ba> 3003
+<92bb> <92bb> 7743
+<92bc> <92c5> 3034
+<92c6> <92c6> 7744
+<92c7> <92c7> 3045
+<92c8> <92c8> 7745
+<92c9> <92ca> 3047
+<92cb> <92cb> 7746
+<92cc> <92cc> 3050
+<92cd> <92cd> 7747
+<92ce> <92d1> 3052
+<92d2> <92d2> 8267
+<92d3> <92d8> 3057
+<92d9> <92d9> 4533
+<92da> <92fc> 3064
+<9340> <9340> 3099
+<9341> <9341> 7748
+<9342> <9345> 3101
+<9346> <9346> 7749
+<9347> <934c> 3106
+<934d> <934d> 7750
+<934e> <9354> 3113
+<9355> <9355> 7751
+<9356> <935d> 3121
+<935e> <935e> 7752
+<935f> <9366> 3130
+<9367> <9367> 7753
+<9368> <9369> 3139
+<936a> <936a> 7754
+<936b> <936f> 3142
+<9370> <9371> 7755
+<9372> <9375> 3149
+<9376> <9376> 5855
+<9377> <937e> 3154
+<9380> <9383> 3162
+<9384> <9384> 7757
+<9385> <938d> 3167
+<938e> <938e> 5200
+<938f> <9392> 3177
+<9393> <9393> 5430
+<9394> <9397> 3182
+<9398> <9398> 7758
+<9399> <93bb> 3187
+<93bc> <93bc> 7759
+<93bd> <93bf> 3223
+<93c0> <93c0> 7760
+endcidrange
+
+100 begincidrange
+<93c1> <93d1> 3227
+<93d2> <93d3> 7761
+<93d4> <93d8> 3246
+<93d9> <93da> 7763
+<93db> <93de> 3253
+<93df> <93df> 7765
+<93e0> <93e3> 3258
+<93e4> <93e5> 7766
+<93e6> <93e7> 3264
+<93e8> <93e8> 7768
+<93e9> <93f3> 3267
+<93f4> <93f4> 6893
+<93f5> <93fc> 3279
+<9440> <9447> 3287
+<9448> <9448> 7769
+<9449> <9457> 3296
+<9458> <9458> 7770
+<9459> <9475> 3312
+<9476> <9476> 7771
+<9477> <947e> 3342
+<9480> <9486> 3350
+<9487> <9487> 7772
+<9488> <9488> 6537
+<9489> <9489> 7773
+<948a> <948c> 3360
+<948d> <948d> 7774
+<948e> <94a1> 3364
+<94a2> <94a2> 7775
+<94a3> <94ab> 3385
+<94ac> <94ac> 7776
+<94ad> <94ad> 3395
+<94ae> <94ae> 7777
+<94af> <94d1> 3397
+<94d2> <94d2> 7778
+<94d3> <94df> 3433
+<94e0> <94e0> 7779
+<94e1> <94f2> 3447
+<94f3> <94f3> 7780
+<94f4> <94fc> 3466
+<9540> <9540> 3475
+<9541> <9542> 7781
+<9543> <954d> 3478
+<954e> <954e> 7783
+<954f> <954f> 5179
+<9550> <9550> 3491
+<9551> <9551> 7784
+<9552> <9553> 3493
+<9554> <9554> 7785
+<9555> <955e> 3496
+<955f> <955f> 7786
+<9560> <956c> 3507
+<956d> <956d> 7787
+<956e> <956f> 3521
+<9570> <9570> 7788
+<9571> <957e> 3524
+<9580> <95c0> 3538
+<95c1> <95c1> 7789
+<95c2> <95ca> 3604
+<95cb> <95cb> 7790
+<95cc> <95d7> 3614
+<95d8> <95d8> 7791
+<95d9> <95f6> 3627
+<95f7> <95f7> 7792
+<95f8> <95fc> 3658
+<9640> <9640> 3663
+<9641> <9641> 7793
+<9642> <9647> 3665
+<9648> <9648> 7794
+<9649> <9669> 3672
+<966a> <966a> 7795
+<966b> <967e> 3706
+<9680> <9689> 3726
+<968a> <968a> 7475
+<968b> <968f> 3737
+<9690> <9690> 7796
+<9691> <9697> 3743
+<9698> <9698> 7980
+<9699> <9699> 4143
+<969a> <96ca> 3752
+<96cb> <96cb> 7797
+<96cc> <96d6> 3802
+<96d7> <96d7> 7798
+<96d8> <96dc> 3814
+<96dd> <96dd> 7799
+<96de> <96df> 3820
+<96e0> <96e0> 7800
+<96e1> <96f6> 3823
+<96f7> <96f7> 6453
+<96f8> <96f8> 7801
+<96f9> <96f9> 3847
+<96fa> <96fa> 7802
+<96fb> <96fb> 3849
+<96fc> <96fc> 7803
+<9740> <9750> 3851
+<9751> <9751> 7804
+<9752> <976e> 3869
+<976f> <976f> 7805
+<9770> <9772> 3899
+<9773> <9773> 7806
+<9774> <9778> 3903
+endcidrange
+
+100 begincidrange
+<9779> <9779> 7476
+<977a> <977e> 3909
+<9780> <9788> 3914
+<9789> <9789> 7807
+<978a> <97c8> 3924
+<97c9> <97c9> 7808
+<97ca> <97f7> 3988
+<97f8> <97f9> 7809
+<97fa> <97fc> 4036
+<9840> <9840> 7811
+<9841> <984f> 4040
+<9850> <9850> 7812
+<9851> <9854> 4056
+<9855> <9855> 6007
+<9856> <9857> 4061
+<9858> <9858> 7813
+<9859> <9872> 4064
+<989f> <98d3> 4090
+<98d4> <98d4> 3751
+<98d5> <98fc> 4144
+<9940> <995b> 4184
+<995c> <995c> 7814
+<995d> <9965> 4213
+<9966> <9966> 7815
+<9967> <9969> 4223
+<996a> <996a> 7816
+<996b> <996b> 4227
+<996c> <996c> 7817
+<996d> <997e> 4229
+<9980> <99fc> 4247
+<9a40> <9a4e> 4372
+<9a4f> <9a4f> 7818
+<9a50> <9a58> 4388
+<9a59> <9a59> 7819
+<9a5a> <9a7c> 4398
+<9a7d> <9a7d> 7821
+<9a7e> <9a7e> 4434
+<9a80> <9a8a> 4435
+<9a8b> <9a8b> 7822
+<9a8c> <9ac1> 4447
+<9ac2> <9ac2> 7823
+<9ac3> <9ae1> 4502
+<9ae2> <9ae2> 3063
+<9ae3> <9afc> 4534
+<9b40> <9b5b> 4560
+<9b5c> <9b5c> 7824
+<9b5d> <9b7e> 4589
+<9b80> <9b82> 4623
+<9b83> <9b83> 7825
+<9b84> <9b9f> 4627
+<9ba0> <9ba0> 7826
+<9ba1> <9bfc> 4656
+<9c40> <9c7e> 4748
+<9c80> <9ca1> 4811
+<9ca2> <9ca2> 7828
+<9ca3> <9cfc> 4846
+<9d40> <9d7e> 4936
+<9d80> <9d80> 7829
+<9d81> <9d8b> 5000
+<9d8c> <9d8c> 7830
+<9d8d> <9d97> 5012
+<9d98> <9d98> 1447
+<9d99> <9db6> 5024
+<9db7> <9db7> 7831
+<9db8> <9dca> 5055
+<9dcb> <9dcb> 7832
+<9dcc> <9dfc> 5075
+<9e40> <9e63> 5124
+<9e64> <9e64> 7833
+<9e65> <9e68> 5161
+<9e69> <9e69> 7834
+<9e6a> <9e76> 5166
+<9e77> <9e77> 3490
+<9e78> <9e7e> 5180
+<9e80> <9e8a> 5187
+<9e8b> <9e8b> 7835
+<9e8c> <9e8c> 5199
+<9e8d> <9e8d> 3176
+<9e8e> <9e93> 5201
+<9e94> <9e94> 7836
+<9e95> <9efc> 5208
+<9f40> <9f7e> 5312
+<9f80> <9fb6> 5375
+<9fb7> <9fb7> 3181
+<9fb8> <9fcd> 5431
+<9fce> <9fce> 7837
+<9fcf> <9ff2> 5454
+<9ff3> <9ff3> 1535
+<9ff4> <9ffc> 5491
+<a0> <df> 326
+<e040> <e07e> 5500
+<e080> <e0a3> 5563
+<e0a4> <e0a4> 7839
+<e0a5> <e0dc> 5600
+<e0dd> <e0dd> 7840
+<e0de> <e0f3> 5657
+<e0f4> <e0f4> 7477
+<e0f5> <e0fc> 5680
+<e140> <e149> 5688
+<e14a> <e14a> 7841
+endcidrange
+
+100 begincidrange
+<e14b> <e14e> 5699
+<e14f> <e150> 7842
+<e151> <e17e> 5705
+<e180> <e1a8> 5751
+<e1a9> <e1a9> 7844
+<e1aa> <e1e5> 5793
+<e1e6> <e1e6> 2030
+<e1e7> <e1e7> 5854
+<e1e8> <e1e8> 3153
+<e1e9> <e1ec> 5856
+<e1ed> <e1ed> 7845
+<e1ee> <e1fc> 5861
+<e240> <e268> 5876
+<e269> <e269> 7846
+<e26a> <e272> 5918
+<e273> <e273> 7847
+<e274> <e27c> 5928
+<e27d> <e27d> 1492
+<e27e> <e27e> 5938
+<e280> <e2b6> 5939
+<e2b7> <e2b7> 7848
+<e2b8> <e2c3> 5995
+<e2c4> <e2c4> 4060
+<e2c5> <e2e1> 6008
+<e2e2> <e2e2> 7849
+<e2e3> <e2eb> 6038
+<e2ec> <e2ec> 7850
+<e2ed> <e2fc> 6048
+<e340> <e357> 6064
+<e358> <e358> 7851
+<e359> <e359> 6089
+<e35a> <e35a> 7852
+<e35b> <e364> 6091
+<e365> <e365> 7853
+<e366> <e37e> 6102
+<e380> <e3c3> 6127
+<e3c4> <e3c4> 7854
+<e3c5> <e3fc> 6196
+<e440> <e47e> 6252
+<e480> <e483> 6315
+<e484> <e484> 7855
+<e485> <e488> 6320
+<e489> <e489> 7856
+<e48a> <e491> 6325
+<e492> <e492> 7857
+<e493> <e4b1> 6334
+<e4b2> <e4b2> 7858
+<e4b3> <e4b8> 6366
+<e4b9> <e4b9> 7859
+<e4ba> <e4f1> 6373
+<e4f2> <e4f2> 7860
+<e4f3> <e4fc> 6430
+<e540> <e540> 6440
+<e541> <e541> 2293
+<e542> <e54c> 6442
+<e54d> <e54d> 3845
+<e54e> <e578> 6454
+<e579> <e579> 1440
+<e57a> <e57e> 6498
+<e580> <e5a1> 6503
+<e5a2> <e5a2> 3358
+<e5a3> <e5a4> 6538
+<e5a5> <e5a5> 7862
+<e5a6> <e5ba> 6541
+<e5bb> <e5bb> 7863
+<e5bc> <e5ec> 6563
+<e5ed> <e5ed> 7864
+<e5ee> <e5fc> 6613
+<e640> <e650> 6628
+<e651> <e651> 7865
+<e652> <e67b> 6646
+<e67c> <e67c> 1550
+<e67d> <e67e> 6689
+<e680> <e685> 6691
+<e686> <e686> 7866
+<e687> <e695> 6698
+<e696> <e696> 7867
+<e697> <e6ca> 6714
+<e6cb> <e6cb> 2730
+<e6cc> <e6e6> 6767
+<e6e7> <e6e7> 7868
+<e6e8> <e6f1> 6795
+<e6f2> <e6f2> 7869
+<e6f3> <e6fc> 6806
+<e740> <e76c> 6816
+<e76d> <e76d> 7870
+<e76e> <e77e> 6862
+<e780> <e78b> 6879
+<e78c> <e78c> 7871
+<e78d> <e78d> 6892
+<e78e> <e78e> 7872
+<e78f> <e7a6> 6894
+<e7a7> <e7a7> 7873
+<e7a8> <e7ba> 6919
+<e7bb> <e7bb> 7874
+<e7bc> <e7d4> 6939
+<e7d5> <e7d5> 7875
+<e7d6> <e7fc> 6965
+<e840> <e87e> 7004
+<e880> <e8c2> 7067
+endcidrange
+
+26 begincidrange
+<e8c3> <e8c3> 7878
+<e8c4> <e8ce> 7135
+<e8cf> <e8cf> 7879
+<e8d0> <e8d4> 7147
+<e8d5> <e8d5> 7880
+<e8d6> <e8f1> 7153
+<e8f2> <e8f2> 1841
+<e8f3> <e8f3> 7881
+<e8f4> <e8fc> 7183
+<e940> <e97e> 7192
+<e980> <e9aa> 7255
+<e9ab> <e9ab> 7882
+<e9ac> <e9b9> 7299
+<e9ba> <e9ba> 7883
+<e9bb> <e9ca> 7314
+<e9cb> <e9cb> 1143
+<e9cc> <e9cc> 7884
+<e9cd> <e9f1> 7332
+<e9f2> <e9f2> 1321
+<e9f3> <e9fc> 7370
+<ea40> <ea6f> 7380
+<ea70> <ea70> 7885
+<ea71> <ea7e> 7429
+<ea80> <ea9c> 7443
+<ea9d> <ea9d> 7886
+<ea9e> <ea9e> 7473
+endcidrange
+endcmap
+CMapName currentdict /CMap defineresource pop
+end
+end
+
+%%EndResource
+%%EOF
diff --git a/src/main/resources/Resources/cmap/78-RKSJ-V b/src/main/resources/Resources/cmap/78-RKSJ-V
new file mode 100644
index 0000000..d497361
--- /dev/null
+++ b/src/main/resources/Resources/cmap/78-RKSJ-V
@@ -0,0 +1,86 @@
+%!PS-Adobe-3.0 Resource-CMap
+%%DocumentNeededResources: ProcSet (CIDInit)
+%%DocumentNeededResources: CMap (78-RKSJ-H)
+%%IncludeResource: ProcSet (CIDInit)
+%%IncludeResource: CMap (78-RKSJ-H)
+%%BeginResource: CMap (78-RKSJ-V)
+%%Title: (78-RKSJ-V Adobe Japan1 0)
+%%Version: 6.001
+%%Copyright: -----------------------------------------------------------
+%%Copyright: Copyright 1990-1997 Adobe Systems Incorporated.
+%%Copyright: All Rights Reserved.
+%%Copyright:
+%%Copyright: Patents Pending
+%%Copyright:
+%%Copyright: NOTICE: All information contained herein is the property
+%%Copyright: of Adobe Systems Incorporated.
+%%Copyright:
+%%Copyright: Permission is granted for redistribution of this file
+%%Copyright: provided this copyright notice is maintained intact and
+%%Copyright: that the contents of this file are not altered in any
+%%Copyright: way from its original form.
+%%Copyright:
+%%Copyright: PostScript and Display PostScript are trademarks of
+%%Copyright: Adobe Systems Incorporated which may be registered in
+%%Copyright: certain jurisdictions.
+%%Copyright: -----------------------------------------------------------
+%%EndComments
+
+/CIDInit /ProcSet findresource begin
+
+12 dict begin
+
+begincmap
+
+/78-RKSJ-H usecmap
+
+/CIDSystemInfo 3 dict dup begin
+ /Registry (Adobe) def
+ /Ordering (Japan1) def
+ /Supplement 0 def
+end def
+
+/CMapName /78-RKSJ-V def
+/CMapVersion 6.001 def
+/CMapType 1 def
+
+/XUID [1 10 25354] def
+
+/WMode 1 def
+
+27 begincidrange
+<8141> <8142> 7887
+<8150> <8151> 7889
+<815b> <815d> 7891
+<8160> <8164> 7894
+<8169> <817a> 7899
+<8181> <8181> 7917
+<829f> <829f> 7918
+<82a1> <82a1> 7919
+<82a3> <82a3> 7920
+<82a5> <82a5> 7921
+<82a7> <82a7> 7922
+<82c1> <82c1> 7923
+<82e1> <82e1> 7924
+<82e3> <82e3> 7925
+<82e5> <82e5> 7926
+<82ec> <82ec> 7927
+<8340> <8340> 7928
+<8342> <8342> 7929
+<8344> <8344> 7930
+<8346> <8346> 7931
+<8348> <8348> 7932
+<8362> <8362> 7933
+<8383> <8383> 7934
+<8385> <8385> 7935
+<8387> <8387> 7936
+<838e> <838e> 7937
+<8395> <8396> 7938
+endcidrange
+endcmap
+CMapName currentdict /CMap defineresource pop
+end
+end
+
+%%EndResource
+%%EOF
diff --git a/src/main/resources/Resources/cmap/78-V b/src/main/resources/Resources/cmap/78-V
new file mode 100644
index 0000000..349219c
--- /dev/null
+++ b/src/main/resources/Resources/cmap/78-V
@@ -0,0 +1,86 @@
+%!PS-Adobe-3.0 Resource-CMap
+%%DocumentNeededResources: ProcSet (CIDInit)
+%%DocumentNeededResources: CMap (78-H)
+%%IncludeResource: ProcSet (CIDInit)
+%%IncludeResource: CMap (78-H)
+%%BeginResource: CMap (78-V)
+%%Title: (78-V Adobe Japan1 0)
+%%Version: 6.001
+%%Copyright: -----------------------------------------------------------
+%%Copyright: Copyright 1990-1997 Adobe Systems Incorporated.
+%%Copyright: All Rights Reserved.
+%%Copyright:
+%%Copyright: Patents Pending
+%%Copyright:
+%%Copyright: NOTICE: All information contained herein is the property
+%%Copyright: of Adobe Systems Incorporated.
+%%Copyright:
+%%Copyright: Permission is granted for redistribution of this file
+%%Copyright: provided this copyright notice is maintained intact and
+%%Copyright: that the contents of this file are not altered in any
+%%Copyright: way from its original form.
+%%Copyright:
+%%Copyright: PostScript and Display PostScript are trademarks of
+%%Copyright: Adobe Systems Incorporated which may be registered in
+%%Copyright: certain jurisdictions.
+%%Copyright: -----------------------------------------------------------
+%%EndComments
+
+/CIDInit /ProcSet findresource begin
+
+12 dict begin
+
+begincmap
+
+/78-H usecmap
+
+/CIDSystemInfo 3 dict dup begin
+ /Registry (Adobe) def
+ /Ordering (Japan1) def
+ /Supplement 0 def
+end def
+
+/CMapName /78-V def
+/CMapVersion 6.001 def
+/CMapType 1 def
+
+/XUID [1 10 25353] def
+
+/WMode 1 def
+
+27 begincidrange
+<2122> <2123> 7887
+<2131> <2132> 7889
+<213c> <213e> 7891
+<2141> <2145> 7894
+<214a> <215b> 7899
+<2161> <2161> 7917
+<2421> <2421> 7918
+<2423> <2423> 7919
+<2425> <2425> 7920
+<2427> <2427> 7921
+<2429> <2429> 7922
+<2443> <2443> 7923
+<2463> <2463> 7924
+<2465> <2465> 7925
+<2467> <2467> 7926
+<246e> <246e> 7927
+<2521> <2521> 7928
+<2523> <2523> 7929
+<2525> <2525> 7930
+<2527> <2527> 7931
+<2529> <2529> 7932
+<2543> <2543> 7933
+<2563> <2563> 7934
+<2565> <2565> 7935
+<2567> <2567> 7936
+<256e> <256e> 7937
+<2575> <2576> 7938
+endcidrange
+endcmap
+CMapName currentdict /CMap defineresource pop
+end
+end
+
+%%EndResource
+%%EOF
diff --git a/src/main/resources/Resources/cmap/78ms-RKSJ-H b/src/main/resources/Resources/cmap/78ms-RKSJ-H
new file mode 100644
index 0000000..43bf483
--- /dev/null
+++ b/src/main/resources/Resources/cmap/78ms-RKSJ-H
@@ -0,0 +1,800 @@
+%!PS-Adobe-3.0 Resource-CMap
+%%DocumentNeededResources: ProcSet (CIDInit)
+%%IncludeResource: ProcSet (CIDInit)
+%%BeginResource: CMap (78ms-RKSJ-H)
+%%Title: (78ms-RKSJ-H Adobe Japan1 2)
+%%Version: 6.001
+%%Copyright: -----------------------------------------------------------
+%%Copyright: Copyright 1990-1997 Adobe Systems Incorporated.
+%%Copyright: All Rights Reserved.
+%%Copyright:
+%%Copyright: Patents Pending
+%%Copyright:
+%%Copyright: NOTICE: All information contained herein is the property
+%%Copyright: of Adobe Systems Incorporated.
+%%Copyright:
+%%Copyright: Permission is granted for redistribution of this file
+%%Copyright: provided this copyright notice is maintained intact and
+%%Copyright: that the contents of this file are not altered in any
+%%Copyright: way from its original form.
+%%Copyright:
+%%Copyright: PostScript and Display PostScript are trademarks of
+%%Copyright: Adobe Systems Incorporated which may be registered in
+%%Copyright: certain jurisdictions.
+%%Copyright: -----------------------------------------------------------
+%%EndComments
+
+/CIDInit /ProcSet findresource begin
+
+12 dict begin
+
+begincmap
+
+/CIDSystemInfo 3 dict dup begin
+ /Registry (Adobe) def
+ /Ordering (Japan1) def
+ /Supplement 2 def
+end def
+
+/CMapName /78ms-RKSJ-H def
+/CMapVersion 6.001 def
+/CMapType 1 def
+
+/XUID [1 10 25441] def
+
+/WMode 0 def
+
+4 begincodespacerange
+ <00> <80>
+ <8140> <9FFC>
+ <A0> <DF>
+ <E040> <FCFC>
+endcodespacerange
+
+1 beginnotdefrange
+<00> <1f> 231
+endnotdefrange
+
+100 begincidrange
+<20> <7d> 231
+<7e> <7e> 631
+<8140> <817e> 633
+<8180> <81ac> 696
+<81b8> <81bf> 741
+<81c8> <81ce> 749
+<81da> <81e8> 756
+<81f0> <81f7> 771
+<81fc> <81fc> 779
+<824f> <8258> 780
+<8260> <8279> 790
+<8281> <829a> 816
+<829f> <82f1> 842
+<8340> <837e> 925
+<8380> <8396> 988
+<839f> <83b6> 1011
+<83bf> <83d6> 1035
+<8440> <8460> 1059
+<8470> <847e> 1092
+<8480> <8491> 1107
+<849f> <849f> 7479
+<84a0> <84a0> 7481
+<84a1> <84a1> 7491
+<84a2> <84a2> 7495
+<84a3> <84a3> 7503
+<84a4> <84a4> 7499
+<84a5> <84a5> 7507
+<84a6> <84a6> 7523
+<84a7> <84a7> 7515
+<84a8> <84a8> 7531
+<84a9> <84a9> 7539
+<84aa> <84aa> 7480
+<84ab> <84ab> 7482
+<84ac> <84ac> 7494
+<84ad> <84ad> 7498
+<84ae> <84ae> 7506
+<84af> <84af> 7502
+<84b0> <84b0> 7514
+<84b1> <84b1> 7530
+<84b2> <84b2> 7522
+<84b3> <84b3> 7538
+<84b4> <84b4> 7554
+<84b5> <84b5> 7511
+<84b6> <84b6> 7526
+<84b7> <84b7> 7519
+<84b8> <84b8> 7534
+<84b9> <84b9> 7542
+<84ba> <84ba> 7508
+<84bb> <84bb> 7527
+<84bc> <84bc> 7516
+<84bd> <84bd> 7535
+<84be> <84be> 7545
+<8740> <875d> 7555
+<875f> <8760> 7585
+<8761> <8761> 8038
+<8762> <8762> 7588
+<8763> <8763> 8040
+<8764> <8764> 7590
+<8765> <8765> 8042
+<8766> <8767> 7592
+<8768> <8768> 8044
+<8769> <876a> 7595
+<876b> <876b> 8043
+<876c> <876d> 7598
+<876e> <876e> 8047
+<876f> <8775> 7601
+<877e> <877e> 8323
+<8780> <8783> 7608
+<8784> <8784> 8055
+<8785> <878f> 7613
+<8790> <8790> 762
+<8791> <8791> 761
+<8792> <8792> 769
+<8793> <8799> 7624
+<879a> <879a> 768
+<879b> <879c> 7631
+<889f> <889f> 1125
+<88a0> <88a0> 7633
+<88a1> <88a6> 1127
+<88a7> <88a7> 8266
+<88a8> <88af> 1134
+<88b0> <88b0> 7961
+<88b1> <88b1> 7330
+<88b2> <88b8> 1144
+<88b9> <88b9> 7634
+<88ba> <88eb> 1152
+<88ec> <88ec> 7635
+<88ed> <88f0> 1203
+<88f1> <88f1> 7636
+<88f2> <88f9> 1208
+<88fa> <88fa> 7637
+<88fb> <88fc> 1217
+<8940> <8948> 1219
+<8949> <8949> 7638
+<894a> <8953> 1229
+<8954> <8954> 7639
+<8955> <8957> 1240
+<8958> <8958> 7640
+<8959> <895b> 1244
+<895c> <895c> 7642
+endcidrange
+
+100 begincidrange
+<895d> <8960> 1248
+<8961> <8961> 7643
+<8962> <897e> 1253
+<8980> <898a> 1282
+<898b> <898b> 7644
+<898c> <89a5> 1294
+<89a6> <89a6> 7645
+<89a7> <89a7> 7369
+<89a8> <89a8> 7646
+<89a9> <89dd> 1323
+<89de> <89de> 7647
+<89df> <89f7> 1377
+<89f8> <89f8> 7648
+<89f9> <89fa> 1403
+<89fb> <89fb> 7649
+<89fc> <89fc> 1406
+<8a40> <8a40> 1407
+<8a41> <8a41> 7650
+<8a42> <8a60> 1409
+<8a61> <8a61> 6497
+<8a62> <8a67> 1441
+<8a68> <8a68> 5023
+<8a69> <8a7e> 1448
+<8a80> <8a84> 1470
+<8a85> <8a85> 7651
+<8a86> <8a8a> 1476
+<8a8b> <8a8b> 7652
+<8a8c> <8a92> 1482
+<8a93> <8a93> 7653
+<8a94> <8a95> 1490
+<8a96> <8a96> 5937
+<8a97> <8a99> 1493
+<8a9a> <8a9a> 7654
+<8a9b> <8abf> 1497
+<8ac0> <8ac0> 7655
+<8ac1> <8ac1> 5490
+<8ac2> <8aca> 1536
+<8acb> <8acb> 7656
+<8acc> <8acf> 1546
+<8ad0> <8ad0> 6688
+<8ad1> <8ae2> 1551
+<8ae3> <8ae3> 7657
+<8ae4> <8afc> 1570
+<8b40> <8b49> 1595
+<8b4a> <8b4a> 7658
+<8b4b> <8b5e> 1606
+<8b5f> <8b5f> 7659
+<8b60> <8b7e> 1627
+<8b80> <8b9f> 1658
+<8ba0> <8ba0> 7660
+<8ba1> <8ba7> 1691
+<8ba8> <8ba8> 7661
+<8ba9> <8bc3> 1699
+<8bc4> <8bc4> 7474
+<8bc5> <8bcc> 1727
+<8bcd> <8bcd> 7662
+<8bce> <8bea> 1736
+<8beb> <8beb> 7663
+<8bec> <8bf1> 1766
+<8bf2> <8bf2> 7664
+<8bf3> <8bf8> 1773
+<8bf9> <8bf9> 7665
+<8bfa> <8bfa> 1780
+<8bfb> <8bfb> 7666
+<8bfc> <8bfc> 1782
+<8c40> <8c42> 1783
+<8c43> <8c43> 7667
+<8c44> <8c55> 1787
+<8c56> <8c56> 7668
+<8c57> <8c63> 1806
+<8c64> <8c64> 7669
+<8c65> <8c6c> 1820
+<8c6d> <8c6d> 7670
+<8c6e> <8c70> 1829
+<8c71> <8c71> 7671
+<8c72> <8c73> 1833
+<8c74> <8c74> 7672
+<8c75> <8c79> 1836
+<8c7a> <8c7a> 7181
+<8c7b> <8c7e> 1842
+<8c80> <8c83> 1846
+<8c84> <8c84> 7673
+<8c85> <8c90> 1851
+<8c91> <8c91> 7674
+<8c92> <8c98> 1864
+<8c99> <8c99> 7675
+<8c9a> <8c9d> 1872
+<8c9e> <8c9e> 7676
+<8c9f> <8cb1> 1877
+<8cb2> <8cb2> 7677
+<8cb3> <8cbe> 1897
+<8cbf> <8cbf> 7678
+<8cc0> <8cfc> 1910
+<8d40> <8d49> 1971
+<8d4a> <8d4a> 7679
+<8d4b> <8d55> 1982
+<8d56> <8d56> 7680
+<8d57> <8d60> 1994
+<8d61> <8d61> 7681
+<8d62> <8d7a> 2005
+endcidrange
+
+100 begincidrange
+<8d7b> <8d7b> 5853
+<8d7c> <8d7e> 2031
+<8d80> <8d8c> 2034
+<8d8d> <8d8d> 7682
+<8d8e> <8d93> 2048
+<8d94> <8d94> 7683
+<8d95> <8d98> 2055
+<8d99> <8d99> 7684
+<8d9a> <8dd0> 2060
+<8dd1> <8dd1> 7685
+<8dd2> <8de4> 2116
+<8de5> <8de5> 7686
+<8de6> <8df1> 2136
+<8df2> <8df2> 7687
+<8df3> <8dfc> 2149
+<8e40> <8e45> 2159
+<8e46> <8e46> 7688
+<8e47> <8e48> 2166
+<8e49> <8e49> 7689
+<8e4a> <8e4a> 2169
+<8e4b> <8e4b> 7690
+<8e4c> <8e57> 2171
+<8e58> <8e58> 7691
+<8e59> <8e7e> 2184
+<8e80> <8ec5> 2222
+<8ec6> <8ec6> 7693
+<8ec7> <8ec7> 6441
+<8ec8> <8ed4> 2294
+<8ed5> <8ed5> 7694
+<8ed6> <8eda> 2308
+<8edb> <8edc> 7695
+<8edd> <8efc> 2315
+<8f40> <8f49> 2347
+<8f4a> <8f4a> 7697
+<8f4b> <8f54> 2358
+<8f55> <8f55> 7698
+<8f56> <8f7e> 2369
+<8f80> <8f8b> 2410
+<8f8c> <8f8d> 7699
+<8f8e> <8f91> 2424
+<8f92> <8f93> 7701
+<8f94> <8fa2> 2430
+<8fa3> <8fa3> 7703
+<8fa4> <8fb0> 2446
+<8fb1> <8fb1> 7704
+<8fb2> <8fbc> 2460
+<8fbd> <8fbd> 7705
+<8fbe> <8fd2> 2472
+<8fd3> <8fd3> 7706
+<8fd4> <8fdc> 2494
+<8fdd> <8fdd> 7707
+<8fde> <8fe1> 2504
+<8fe2> <8fe2> 7708
+<8fe3> <8ffc> 2509
+<9040> <9048> 2535
+<9049> <9049> 7709
+<904a> <9077> 2545
+<9078> <9078> 7710
+<9079> <907e> 2592
+<9080> <9080> 7711
+<9081> <9088> 2599
+<9089> <9089> 7712
+<908a> <909f> 2608
+<90a0> <90a0> 7713
+<90a1> <90bf> 2631
+<90c0> <90c0> 7714
+<90c1> <90e3> 2663
+<90e4> <90e4> 7715
+<90e5> <90ee> 2699
+<90ef> <90f0> 7716
+<90f1> <90f6> 2711
+<90f7> <90f8> 7718
+<90f9> <90fc> 2719
+<9140> <9145> 2723
+<9146> <9146> 7720
+<9147> <9147> 6766
+<9148> <9157> 2731
+<9158> <9158> 7721
+<9159> <916a> 2748
+<916b> <916b> 7722
+<916c> <916d> 2767
+<916e> <916e> 7723
+<916f> <917d> 2770
+<917e> <917e> 7724
+<9180> <9188> 2786
+<9189> <9189> 7725
+<918a> <91ba> 2796
+<91bb> <91bb> 7726
+<91bc> <91ca> 2846
+<91cb> <91cb> 7727
+<91cc> <91d9> 2862
+<91da> <91da> 7728
+<91db> <91e0> 2877
+<91e1> <91e1> 7729
+<91e2> <91ec> 2884
+<91ed> <91ed> 7730
+<91ee> <91f2> 2896
+<91f3> <91f4> 7731
+<91f5> <91fa> 2903
+<91fb> <91fb> 7733
+endcidrange
+
+100 begincidrange
+<91fc> <91fc> 2910
+<9240> <9245> 2911
+<9246> <9246> 7734
+<9247> <9247> 2918
+<9248> <9249> 7735
+<924a> <924b> 2921
+<924c> <924d> 7737
+<924e> <925b> 2925
+<925c> <925c> 7739
+<925d> <927e> 2940
+<9280> <928f> 2974
+<9290> <9290> 7740
+<9291> <9294> 2991
+<9295> <9295> 7741
+<9296> <929b> 2996
+<929c> <929c> 7742
+<929d> <92ba> 3003
+<92bb> <92bb> 7743
+<92bc> <92c5> 3034
+<92c6> <92c6> 7744
+<92c7> <92c7> 3045
+<92c8> <92c8> 7745
+<92c9> <92ca> 3047
+<92cb> <92cb> 7746
+<92cc> <92cc> 3050
+<92cd> <92cd> 7747
+<92ce> <92d1> 3052
+<92d2> <92d2> 8267
+<92d3> <92d8> 3057
+<92d9> <92d9> 4533
+<92da> <92fc> 3064
+<9340> <9340> 3099
+<9341> <9341> 7748
+<9342> <9345> 3101
+<9346> <9346> 7749
+<9347> <934c> 3106
+<934d> <934d> 7750
+<934e> <9354> 3113
+<9355> <9355> 7751
+<9356> <935d> 3121
+<935e> <935e> 7752
+<935f> <9366> 3130
+<9367> <9367> 7753
+<9368> <9369> 3139
+<936a> <936a> 7754
+<936b> <936f> 3142
+<9370> <9371> 7755
+<9372> <9375> 3149
+<9376> <9376> 5855
+<9377> <937e> 3154
+<9380> <9383> 3162
+<9384> <9384> 7757
+<9385> <938d> 3167
+<938e> <938e> 5200
+<938f> <9392> 3177
+<9393> <9393> 5430
+<9394> <9397> 3182
+<9398> <9398> 7758
+<9399> <93bb> 3187
+<93bc> <93bc> 7759
+<93bd> <93bf> 3223
+<93c0> <93c0> 7760
+<93c1> <93d1> 3227
+<93d2> <93d3> 7761
+<93d4> <93d8> 3246
+<93d9> <93da> 7763
+<93db> <93de> 3253
+<93df> <93df> 7765
+<93e0> <93e3> 3258
+<93e4> <93e5> 7766
+<93e6> <93e7> 3264
+<93e8> <93e8> 7768
+<93e9> <93f3> 3267
+<93f4> <93f4> 6893
+<93f5> <93fc> 3279
+<9440> <9447> 3287
+<9448> <9448> 7769
+<9449> <9457> 3296
+<9458> <9458> 7770
+<9459> <9475> 3312
+<9476> <9476> 7771
+<9477> <947e> 3342
+<9480> <9486> 3350
+<9487> <9487> 7772
+<9488> <9488> 6537
+<9489> <9489> 7773
+<948a> <948c> 3360
+<948d> <948d> 7774
+<948e> <94a1> 3364
+<94a2> <94a2> 7775
+<94a3> <94ab> 3385
+<94ac> <94ac> 7776
+<94ad> <94ad> 3395
+<94ae> <94ae> 7777
+<94af> <94d1> 3397
+<94d2> <94d2> 7778
+<94d3> <94df> 3433
+<94e0> <94e0> 7779
+<94e1> <94f2> 3447
+<94f3> <94f3> 7780
+endcidrange
+
+100 begincidrange
+<94f4> <94fc> 3466
+<9540> <9540> 3475
+<9541> <9542> 7781
+<9543> <954d> 3478
+<954e> <954e> 7783
+<954f> <954f> 5179
+<9550> <9550> 3491
+<9551> <9551> 7784
+<9552> <9553> 3493
+<9554> <9554> 7785
+<9555> <955e> 3496
+<955f> <955f> 7786
+<9560> <956c> 3507
+<956d> <956d> 7787
+<956e> <956f> 3521
+<9570> <9570> 7788
+<9571> <957e> 3524
+<9580> <95c0> 3538
+<95c1> <95c1> 7789
+<95c2> <95ca> 3604
+<95cb> <95cb> 7790
+<95cc> <95d7> 3614
+<95d8> <95d8> 7791
+<95d9> <95f6> 3627
+<95f7> <95f7> 7792
+<95f8> <95fc> 3658
+<9640> <9640> 3663
+<9641> <9641> 7793
+<9642> <9647> 3665
+<9648> <9648> 7794
+<9649> <9669> 3672
+<966a> <966a> 7795
+<966b> <967e> 3706
+<9680> <9689> 3726
+<968a> <968a> 7475
+<968b> <968f> 3737
+<9690> <9690> 7796
+<9691> <9697> 3743
+<9698> <9698> 7980
+<9699> <9699> 4143
+<969a> <96ca> 3752
+<96cb> <96cb> 7797
+<96cc> <96d6> 3802
+<96d7> <96d7> 7798
+<96d8> <96dc> 3814
+<96dd> <96dd> 7799
+<96de> <96df> 3820
+<96e0> <96e0> 7800
+<96e1> <96f6> 3823
+<96f7> <96f7> 6453
+<96f8> <96f8> 7801
+<96f9> <96f9> 3847
+<96fa> <96fa> 7802
+<96fb> <96fb> 3849
+<96fc> <96fc> 7803
+<9740> <9750> 3851
+<9751> <9751> 7804
+<9752> <976e> 3869
+<976f> <976f> 7805
+<9770> <9772> 3899
+<9773> <9773> 7806
+<9774> <9778> 3903
+<9779> <9779> 7476
+<977a> <977e> 3909
+<9780> <9788> 3914
+<9789> <9789> 7807
+<978a> <97c8> 3924
+<97c9> <97c9> 7808
+<97ca> <97f7> 3988
+<97f8> <97f9> 7809
+<97fa> <97fc> 4036
+<9840> <9840> 7811
+<9841> <984f> 4040
+<9850> <9850> 7812
+<9851> <9854> 4056
+<9855> <9855> 6007
+<9856> <9857> 4061
+<9858> <9858> 7813
+<9859> <9872> 4064
+<989f> <98d3> 4090
+<98d4> <98d4> 3751
+<98d5> <98fc> 4144
+<9940> <995b> 4184
+<995c> <995c> 7814
+<995d> <9965> 4213
+<9966> <9966> 7815
+<9967> <9969> 4223
+<996a> <996a> 7816
+<996b> <996b> 4227
+<996c> <996c> 7817
+<996d> <997e> 4229
+<9980> <99fc> 4247
+<9a40> <9a4e> 4372
+<9a4f> <9a4f> 7818
+<9a50> <9a58> 4388
+<9a59> <9a59> 7819
+<9a5a> <9a7c> 4398
+<9a7d> <9a7d> 7821
+<9a7e> <9a7e> 4434
+<9a80> <9a8a> 4435
+endcidrange
+
+100 begincidrange
+<9a8b> <9a8b> 7822
+<9a8c> <9ac1> 4447
+<9ac2> <9ac2> 7823
+<9ac3> <9ae1> 4502
+<9ae2> <9ae2> 3063
+<9ae3> <9afc> 4534
+<9b40> <9b5b> 4560
+<9b5c> <9b5c> 7824
+<9b5d> <9b7e> 4589
+<9b80> <9b82> 4623
+<9b83> <9b83> 7825
+<9b84> <9b9f> 4627
+<9ba0> <9ba0> 7826
+<9ba1> <9bfc> 4656
+<9c40> <9c7e> 4748
+<9c80> <9ca1> 4811
+<9ca2> <9ca2> 7828
+<9ca3> <9cfc> 4846
+<9d40> <9d7e> 4936
+<9d80> <9d80> 7829
+<9d81> <9d8b> 5000
+<9d8c> <9d8c> 7830
+<9d8d> <9d97> 5012
+<9d98> <9d98> 1447
+<9d99> <9db6> 5024
+<9db7> <9db7> 7831
+<9db8> <9dca> 5055
+<9dcb> <9dcb> 7832
+<9dcc> <9dfc> 5075
+<9e40> <9e63> 5124
+<9e64> <9e64> 7833
+<9e65> <9e68> 5161
+<9e69> <9e69> 7834
+<9e6a> <9e76> 5166
+<9e77> <9e77> 3490
+<9e78> <9e7e> 5180
+<9e80> <9e8a> 5187
+<9e8b> <9e8b> 7835
+<9e8c> <9e8c> 5199
+<9e8d> <9e8d> 3176
+<9e8e> <9e93> 5201
+<9e94> <9e94> 7836
+<9e95> <9efc> 5208
+<9f40> <9f7e> 5312
+<9f80> <9fb6> 5375
+<9fb7> <9fb7> 3181
+<9fb8> <9fcd> 5431
+<9fce> <9fce> 7837
+<9fcf> <9ff2> 5454
+<9ff3> <9ff3> 1535
+<9ff4> <9ffc> 5491
+<a0> <df> 326
+<e040> <e07e> 5500
+<e080> <e0a3> 5563
+<e0a4> <e0a4> 7839
+<e0a5> <e0dc> 5600
+<e0dd> <e0dd> 7840
+<e0de> <e0f3> 5657
+<e0f4> <e0f4> 7477
+<e0f5> <e0fc> 5680
+<e140> <e149> 5688
+<e14a> <e14a> 7841
+<e14b> <e14e> 5699
+<e14f> <e150> 7842
+<e151> <e17e> 5705
+<e180> <e1a8> 5751
+<e1a9> <e1a9> 7844
+<e1aa> <e1e5> 5793
+<e1e6> <e1e6> 2030
+<e1e7> <e1e7> 5854
+<e1e8> <e1e8> 3153
+<e1e9> <e1ec> 5856
+<e1ed> <e1ed> 7845
+<e1ee> <e1fc> 5861
+<e240> <e268> 5876
+<e269> <e269> 7846
+<e26a> <e272> 5918
+<e273> <e273> 7847
+<e274> <e27c> 5928
+<e27d> <e27d> 1492
+<e27e> <e27e> 5938
+<e280> <e2b6> 5939
+<e2b7> <e2b7> 7848
+<e2b8> <e2c3> 5995
+<e2c4> <e2c4> 4060
+<e2c5> <e2e1> 6008
+<e2e2> <e2e2> 7849
+<e2e3> <e2eb> 6038
+<e2ec> <e2ec> 7850
+<e2ed> <e2fc> 6048
+<e340> <e357> 6064
+<e358> <e358> 7851
+<e359> <e359> 6089
+<e35a> <e35a> 7852
+<e35b> <e364> 6091
+<e365> <e365> 7853
+<e366> <e37e> 6102
+<e380> <e3c3> 6127
+<e3c4> <e3c4> 7854
+<e3c5> <e3fc> 6196
+endcidrange
+
+100 begincidrange
+<e440> <e47e> 6252
+<e480> <e483> 6315
+<e484> <e484> 7855
+<e485> <e488> 6320
+<e489> <e489> 7856
+<e48a> <e491> 6325
+<e492> <e492> 7857
+<e493> <e4b1> 6334
+<e4b2> <e4b2> 7858
+<e4b3> <e4b8> 6366
+<e4b9> <e4b9> 7859
+<e4ba> <e4f1> 6373
+<e4f2> <e4f2> 7860
+<e4f3> <e4fc> 6430
+<e540> <e540> 6440
+<e541> <e541> 2293
+<e542> <e54c> 6442
+<e54d> <e54d> 3845
+<e54e> <e578> 6454
+<e579> <e579> 1440
+<e57a> <e57e> 6498
+<e580> <e5a1> 6503
+<e5a2> <e5a2> 3358
+<e5a3> <e5a4> 6538
+<e5a5> <e5a5> 7862
+<e5a6> <e5ba> 6541
+<e5bb> <e5bb> 7863
+<e5bc> <e5ec> 6563
+<e5ed> <e5ed> 7864
+<e5ee> <e5fc> 6613
+<e640> <e650> 6628
+<e651> <e651> 7865
+<e652> <e67b> 6646
+<e67c> <e67c> 1550
+<e67d> <e67e> 6689
+<e680> <e685> 6691
+<e686> <e686> 7866
+<e687> <e695> 6698
+<e696> <e696> 7867
+<e697> <e6ca> 6714
+<e6cb> <e6cb> 2730
+<e6cc> <e6e6> 6767
+<e6e7> <e6e7> 7868
+<e6e8> <e6f1> 6795
+<e6f2> <e6f2> 7869
+<e6f3> <e6fc> 6806
+<e740> <e76c> 6816
+<e76d> <e76d> 7870
+<e76e> <e77e> 6862
+<e780> <e78b> 6879
+<e78c> <e78c> 7871
+<e78d> <e78d> 6892
+<e78e> <e78e> 7872
+<e78f> <e7a6> 6894
+<e7a7> <e7a7> 7873
+<e7a8> <e7ba> 6919
+<e7bb> <e7bb> 7874
+<e7bc> <e7d4> 6939
+<e7d5> <e7d5> 7875
+<e7d6> <e7fc> 6965
+<e840> <e87e> 7004
+<e880> <e8c2> 7067
+<e8c3> <e8c3> 7878
+<e8c4> <e8ce> 7135
+<e8cf> <e8cf> 7879
+<e8d0> <e8d4> 7147
+<e8d5> <e8d5> 7880
+<e8d6> <e8f1> 7153
+<e8f2> <e8f2> 1841
+<e8f3> <e8f3> 7881
+<e8f4> <e8fc> 7183
+<e940> <e97e> 7192
+<e980> <e9aa> 7255
+<e9ab> <e9ab> 7882
+<e9ac> <e9b9> 7299
+<e9ba> <e9ba> 7883
+<e9bb> <e9ca> 7314
+<e9cb> <e9cb> 1143
+<e9cc> <e9cc> 7884
+<e9cd> <e9f1> 7332
+<e9f2> <e9f2> 1321
+<e9f3> <e9fc> 7370
+<ea40> <ea6f> 7380
+<ea70> <ea70> 7885
+<ea71> <ea7e> 7429
+<ea80> <ea9c> 7443
+<ea9d> <ea9d> 7886
+<ea9e> <eaa2> 7473
+<eaa3> <eaa4> 8284
+<ed40> <ed7e> 8359
+<ed80> <edb3> 8422
+<edb4> <edb4> 1993
+<edb5> <edfc> 8474
+<ee40> <ee7e> 8546
+<ee80> <eeec> 8609
+<eeef> <eef8> 8092
+<eef9> <eef9> 751
+<eefa> <eefc> 8005
+<fa40> <fa49> 8092
+<fa4a> <fa53> 7575
+endcidrange
+
+13 begincidrange
+<fa54> <fa54> 751
+<fa55> <fa57> 8005
+<fa58> <fa58> 7618
+<fa59> <fa59> 7610
+<fa5a> <fa5a> 8055
+<fa5b> <fa5b> 768
+<fa5c> <fa7e> 8359
+<fa80> <facf> 8394
+<fad0> <fad0> 1993
+<fad1> <fafc> 8474
+<fb40> <fb7e> 8518
+<fb80> <fbfc> 8581
+<fc40> <fc4b> 8706
+endcidrange
+endcmap
+CMapName currentdict /CMap defineresource pop
+end
+end
+
+%%EndResource
+%%EOF
diff --git a/src/main/resources/Resources/cmap/78ms-RKSJ-V b/src/main/resources/Resources/cmap/78ms-RKSJ-V
new file mode 100644
index 0000000..ee1f417
--- /dev/null
+++ b/src/main/resources/Resources/cmap/78ms-RKSJ-V
@@ -0,0 +1,137 @@
+%!PS-Adobe-3.0 Resource-CMap
+%%DocumentNeededResources: ProcSet (CIDInit)
+%%DocumentNeededResources: CMap (78ms-RKSJ-H)
+%%IncludeResource: ProcSet (CIDInit)
+%%IncludeResource: CMap (78ms-RKSJ-H)
+%%BeginResource: CMap (78ms-RKSJ-V)
+%%Title: (78ms-RKSJ-V Adobe Japan1 2)
+%%Version: 6.001
+%%Copyright: -----------------------------------------------------------
+%%Copyright: Copyright 1990-1997 Adobe Systems Incorporated.
+%%Copyright: All Rights Reserved.
+%%Copyright:
+%%Copyright: Patents Pending
+%%Copyright:
+%%Copyright: NOTICE: All information contained herein is the property
+%%Copyright: of Adobe Systems Incorporated.
+%%Copyright:
+%%Copyright: Permission is granted for redistribution of this file
+%%Copyright: provided this copyright notice is maintained intact and
+%%Copyright: that the contents of this file are not altered in any
+%%Copyright: way from its original form.
+%%Copyright:
+%%Copyright: PostScript and Display PostScript are trademarks of
+%%Copyright: Adobe Systems Incorporated which may be registered in
+%%Copyright: certain jurisdictions.
+%%Copyright: -----------------------------------------------------------
+%%EndComments
+
+/CIDInit /ProcSet findresource begin
+
+12 dict begin
+
+begincmap
+
+/78ms-RKSJ-H usecmap
+
+/CIDSystemInfo 3 dict dup begin
+ /Registry (Adobe) def
+ /Ordering (Japan1) def
+ /Supplement 2 def
+end def
+
+/CMapName /78ms-RKSJ-V def
+/CMapVersion 6.001 def
+/CMapType 1 def
+
+/XUID [1 10 25442] def
+
+/WMode 1 def
+
+78 begincidrange
+<8141> <8142> 7887
+<8143> <8143> 8268
+<8144> <8144> 8274
+<8150> <8151> 7889
+<815b> <815d> 7891
+<8160> <8164> 7894
+<8169> <817a> 7899
+<8181> <8181> 7917
+<81a8> <81a8> 739
+<81a9> <81a9> 738
+<81aa> <81ab> 736
+<81ac> <81ac> 8270
+<829f> <829f> 7918
+<82a1> <82a1> 7919
+<82a3> <82a3> 7920
+<82a5> <82a5> 7921
+<82a7> <82a7> 7922
+<82c1> <82c1> 7923
+<82e1> <82e1> 7924
+<82e3> <82e3> 7925
+<82e5> <82e5> 7926
+<82ec> <82ec> 7927
+<8340> <8340> 7928
+<8342> <8342> 7929
+<8344> <8344> 7930
+<8346> <8346> 7931
+<8348> <8348> 7932
+<8362> <8362> 7933
+<8383> <8383> 7934
+<8385> <8385> 7935
+<8387> <8387> 7936
+<838e> <838e> 7937
+<8395> <8396> 7938
+<849f> <849f> 7481
+<84a0> <84a0> 7479
+<84a1> <84a1> 7495
+<84a2> <84a2> 7503
+<84a3> <84a3> 7499
+<84a4> <84a4> 7491
+<84a5> <84a5> 7523
+<84a6> <84a6> 7515
+<84a7> <84a7> 7531
+<84a8> <84a8> 7507
+<84a9> <84a9> 7539
+<84aa> <84aa> 7482
+<84ab> <84ab> 7480
+<84ac> <84ac> 7498
+<84ad> <84ad> 7506
+<84ae> <84ae> 7502
+<84af> <84af> 7494
+<84b0> <84b0> 7530
+<84b1> <84b1> 7522
+<84b2> <84b2> 7538
+<84b3> <84b3> 7514
+<84b4> <84b4> 7554
+<84b5> <84b5> 7526
+<84b6> <84b6> 7519
+<84b7> <84b7> 7534
+<84b8> <84b8> 7511
+<84b9> <84b9> 7545
+<84ba> <84ba> 7527
+<84bb> <84bb> 7516
+<84bc> <84bc> 7535
+<84bd> <84bd> 7508
+<84be> <84be> 7542
+<875f> <8760> 7940
+<8761> <8761> 8329
+<8762> <8762> 7943
+<8763> <8763> 8339
+<8764> <8764> 7945
+<8765> <8765> 8338
+<8766> <8767> 7947
+<8768> <8768> 8344
+<8769> <876a> 7950
+<876b> <876b> 8348
+<876c> <876d> 7953
+<876e> <876e> 8349
+<8780> <8781> 7956
+endcidrange
+endcmap
+CMapName currentdict /CMap defineresource pop
+end
+end
+
+%%EndResource
+%%EOF
diff --git a/src/main/resources/Resources/cmap/83pv-RKSJ-H b/src/main/resources/Resources/cmap/83pv-RKSJ-H
new file mode 100644
index 0000000..e4e955b
--- /dev/null
+++ b/src/main/resources/Resources/cmap/83pv-RKSJ-H
@@ -0,0 +1 @@
+%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%IncludeResource: ProcSet (CIDInit) %%BeginResource: CMap (83pv-RKSJ-H) %%Title: (83pv-RKSJ-H Adobe Japan1 1) %%Version: 10.001 %%Copyright: ----------------------------------------------------------- %%Copyright: Copyright 1990-1998 Adobe Systems Incorporated. %%Copyright: All Rights Reserved. %%Copyright: %%Copyright: Patents Pending %%Copyright: %%Copyright: NOTICE: All information contained herein is the property %%Copyright: of Adobe Systems Incorporated. %%Copyright: %%Copyright: Permission is granted for redistribution of this file %%Copyright: provided this copyright notice is maintained intact and %%Copyright: that the contents of this file are not altered in any %%Copyright: way from its original form. %%Copyright: %%Copyright: PostScript and Display PostScript are trademarks of %%Copyright: Adobe Systems Incorporated which may be registered in %%Copyright: certain jurisdictions. %%Copyright: ----------------------------------------------------------- %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo 3 dict dup begin /Registry (Adobe) def /Ordering (Japan1) def /Supplement 1 def end def /CMapName /83pv-RKSJ-H def /CMapVersion 10.001 def /CMapType 1 def /UIDOffset 0 def /XUID [1 10 25324] def /WMode 0 def 5 begincodespacerange <00> <80> <8140> <9FFC> <A0> <DF> <E040> <FCFC> <FD> <FF> endcodespacerange 1 beginnotdefrange <00> <1f> 1 endnotdefrange 100 begincidrange <20> <7e> 1 <80> <80> 97 <8140> <817e> 633 <8180> <81ac> 696 <81b8> <81bf> 741 <81c8> <81ce> 749 <81da> <81e8> 756 <81f0> <81f7> 771 <81fc> <81fc> 779 <824f> <8258> 780 <8260> <8279> 790 <8281> <829a> 816 <829f> <82f1> 842 <8340> <837e> 925 <8380> <8396> 988 <839f> <83b6> 1011 <83bf> <83d6> 1035 <8440> <8460> 1059 <8470> <847e> 1092 <8480> <8491> 1107 <849f> <849f> 7479 <84a0> <84a0> 7481 <84a1> <84a1> 7491 <84a2> <84a2> 7495 <84a3> <84a3> 7503 <84a4> <84a4> 7499 <84a5> <84a5> 7507 <84a6> <84a6> 7523 <84a7> <84a7> 7515 <84a8> <84a8> 7531 <84a9> <84a9> 7539 <84aa> <84aa> 7480 <84ab> <84ab> 7482 <84ac> <84ac> 7494 <84ad> <84ad> 7498 <84ae> <84ae> 7506 <84af> <84af> 7502 <84b0> <84b0> 7514 <84b1> <84b1> 7530 <84b2> <84b2> 7522 <84b3> <84b3> 7538 <84b4> <84b4> 7554 <84b5> <84b5> 7511 <84b6> <84b6> 7526 <84b7> <84b7> 7519 <84b8> <84b8> 7534 <84b9> <84b9> 7542 <84ba> <84ba> 7508 <84bb> <84bb> 7527 <84bc> <84bc> 7516 <84bd> <84bd> 7535 <84be> <84be> 7545 <8540> <857e> 232 <8580> <8580> 390 <8581> <859e> 296 <859f> <85dd> 327 <85de> <85fc> 391 <8640> <867e> 422 <8680> <8691> 485 <8692> <8692> 295 <8693> <869e> 503 <86a2> <86ed> 7479 <8740> <875d> 7555 <875f> <8775> 7585 <8780> <878f> 7608 <8790> <8790> 762 <8791> <8791> 761 <8792> <8792> 769 <8793> <8799> 7624 <879a> <879a> 768 <879b> <879c> 7631 <889f> <88fc> 1125 <8940> <897e> 1219 <8980> <89fc> 1282 <8a40> <8a7e> 1407 <8a80> <8afc> 1470 <8b40> <8b7e> 1595 <8b80> <8bfc> 1658 <8c40> <8c7e> 1783 <8c80> <8cfc> 1846 <8d40> <8d7e> 1971 <8d80> <8dfc> 2034 <8e40> <8e7e> 2159 <8e80> <8efc> 2222 <8f40> <8f7e> 2347 <8f80> <8ffc> 2410 <9040> <907e> 2535 <9080> <90fc> 2598 <9140> <917e> 2723 <9180> <91fc> 2786 <9240> <927e> 2911 <9280> <92fc> 2974 <9340> <937e> 3099 <9380> <93fc> 3162 <9440> <947e> 3287 <9480> <94fc> 3350 <9540> <957e> 3475 <9580> <95fc> 3538 <9640> <967e> 3663 <9680> <96fc> 3726 endcidrange 100 begincidrange <9740> <977e> 3851 <9780> <97fc> 3914 <9840> <9872> 4039 <989f> <98fc> 4090 <9940> <997e> 4184 <9980> <99fc> 4247 <9a40> <9a7e> 4372 <9a80> <9afc> 4435 <9b40> <9b7e> 4560 <9b80> <9bfc> 4623 <9c40> <9c7e> 4748 <9c80> <9cfc> 4811 <9d40> <9d7e> 4936 <9d80> <9dfc> 4999 <9e40> <9e7e> 5124 <9e80> <9efc> 5187 <9f40> <9f7e> 5312 <9f80> <9ffc> 5375 <a0> <df> 326 <e040> <e07e> 5500 <e080> <e0fc> 5563 <e140> <e17e> 5688 <e180> <e1fc> 5751 <e240> <e27e> 5876 <e280> <e2fc> 5939 <e340> <e37e> 6064 <e380> <e3fc> 6127 <e440> <e47e> 6252 <e480> <e4fc> 6315 <e540> <e57e> 6440 <e580> <e5fc> 6503 <e640> <e67e> 6628 <e680> <e6fc> 6691 <e740> <e77e> 6816 <e780> <e7fc> 6879 <e840> <e87e> 7004 <e880> <e8fc> 7067 <e940> <e97e> 7192 <e980> <e9fc> 7255 <ea40> <ea7e> 7380 <ea80> <eaa2> 7443 <eaa3> <eaa4> 8284 <eb40> <eb40> 633 <eb41> <eb42> 7887 <eb43> <eb4f> 636 <eb50> <eb51> 7889 <eb52> <eb5a> 651 <eb5b> <eb5d> 7891 <eb5e> <eb5f> 663 <eb60> <eb64> 7894 <eb65> <eb68> 670 <eb69> <eb7a> 7899 <eb7b> <eb7e> 692 <eb80> <eb80> 696 <eb81> <eb81> 7917 <eb82> <ebac> 698 <ebb8> <ebbf> 741 <ebc8> <ebce> 749 <ebda> <ebe8> 756 <ebf0> <ebf7> 771 <ebfc> <ebfc> 779 <ec4f> <ec58> 780 <ec60> <ec79> 790 <ec81> <ec9a> 816 <ec9f> <ec9f> 7918 <eca0> <eca0> 843 <eca1> <eca1> 7919 <eca2> <eca2> 845 <eca3> <eca3> 7920 <eca4> <eca4> 847 <eca5> <eca5> 7921 <eca6> <eca6> 849 <eca7> <eca7> 7922 <eca8> <ecc0> 851 <ecc1> <ecc1> 7923 <ecc2> <ece0> 877 <ece1> <ece1> 7924 <ece2> <ece2> 909 <ece3> <ece3> 7925 <ece4> <ece4> 911 <ece5> <ece5> 7926 <ece6> <eceb> 913 <ecec> <ecec> 7927 <eced> <ecf1> 920 <ed40> <ed40> 7928 <ed41> <ed41> 926 <ed42> <ed42> 7929 <ed43> <ed43> 928 <ed44> <ed44> 7930 <ed45> <ed45> 930 <ed46> <ed46> 7931 <ed47> <ed47> 932 <ed48> <ed48> 7932 <ed49> <ed61> 934 <ed62> <ed62> 7933 <ed63> <ed7e> 960 <ed80> <ed82> 988 <ed83> <ed83> 7934 <ed84> <ed84> 992 <ed85> <ed85> 7935 endcidrange 22 begincidrange <ed86> <ed86> 994 <ed87> <ed87> 7936 <ed88> <ed8d> 996 <ed8e> <ed8e> 7937 <ed8f> <ed94> 1003 <ed95> <ed96> 7938 <ed9f> <edb6> 1011 <edbf> <edd6> 1035 <ee40> <ee5d> 7555 <ee5f> <ee6e> 7940 <ee6f> <ee75> 7601 <ee80> <ee81> 7956 <ee82> <ee8f> 7610 <ee90> <ee90> 762 <ee91> <ee91> 761 <ee92> <ee92> 769 <ee93> <ee99> 7624 <ee9a> <ee9a> 768 <ee9b> <ee9c> 7631 <fd> <fd> 152 <fe> <fe> 228 <ff> <ff> 124 endcidrange endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF \ No newline at end of file
diff --git a/src/main/resources/Resources/cmap/90ms-RKSJ-H b/src/main/resources/Resources/cmap/90ms-RKSJ-H
new file mode 100644
index 0000000..06e216b
--- /dev/null
+++ b/src/main/resources/Resources/cmap/90ms-RKSJ-H
@@ -0,0 +1 @@
+%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%IncludeResource: ProcSet (CIDInit) %%BeginResource: CMap (90ms-RKSJ-H) %%Title: (90ms-RKSJ-H Adobe Japan1 2) %%Version: 11.001 %%Copyright: ----------------------------------------------------------- %%Copyright: Copyright 1990-1998 Adobe Systems Incorporated. %%Copyright: All Rights Reserved. %%Copyright: %%Copyright: Patents Pending %%Copyright: %%Copyright: NOTICE: All information contained herein is the property %%Copyright: of Adobe Systems Incorporated. %%Copyright: %%Copyright: Permission is granted for redistribution of this file %%Copyright: provided this copyright notice is maintained intact and %%Copyright: that the contents of this file are not altered in any %%Copyright: way from its original form. %%Copyright: %%Copyright: PostScript and Display PostScript are trademarks of %%Copyright: Adobe Systems Incorporated which may be registered in %%Copyright: certain jurisdictions. %%Copyright: ----------------------------------------------------------- %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo 3 dict dup begin /Registry (Adobe) def /Ordering (Japan1) def /Supplement 2 def end def /CMapName /90ms-RKSJ-H def /CMapVersion 11.001 def /CMapType 1 def /UIDOffset 950 def /XUID [1 10 25343] def /WMode 0 def 4 begincodespacerange <00> <80> <8140> <9FFC> <A0> <DF> <E040> <FCFC> endcodespacerange 1 beginnotdefrange <00> <1f> 231 endnotdefrange 100 begincidrange <20> <7d> 231 <7e> <7e> 631 <8140> <817e> 633 <8180> <81ac> 696 <81b8> <81bf> 741 <81c8> <81ce> 749 <81da> <81e8> 756 <81f0> <81f7> 771 <81fc> <81fc> 779 <824f> <8258> 780 <8260> <8279> 790 <8281> <829a> 816 <829f> <82f1> 842 <8340> <837e> 925 <8380> <8396> 988 <839f> <83b6> 1011 <83bf> <83d6> 1035 <8440> <8460> 1059 <8470> <847e> 1092 <8480> <8491> 1107 <849f> <849f> 7479 <84a0> <84a0> 7481 <84a1> <84a1> 7491 <84a2> <84a2> 7495 <84a3> <84a3> 7503 <84a4> <84a4> 7499 <84a5> <84a5> 7507 <84a6> <84a6> 7523 <84a7> <84a7> 7515 <84a8> <84a8> 7531 <84a9> <84a9> 7539 <84aa> <84aa> 7480 <84ab> <84ab> 7482 <84ac> <84ac> 7494 <84ad> <84ad> 7498 <84ae> <84ae> 7506 <84af> <84af> 7502 <84b0> <84b0> 7514 <84b1> <84b1> 7530 <84b2> <84b2> 7522 <84b3> <84b3> 7538 <84b4> <84b4> 7554 <84b5> <84b5> 7511 <84b6> <84b6> 7526 <84b7> <84b7> 7519 <84b8> <84b8> 7534 <84b9> <84b9> 7542 <84ba> <84ba> 7508 <84bb> <84bb> 7527 <84bc> <84bc> 7516 <84bd> <84bd> 7535 <84be> <84be> 7545 <8740> <875d> 7555 <875f> <8760> 7585 <8761> <8761> 8038 <8762> <8762> 7588 <8763> <8763> 8040 <8764> <8764> 7590 <8765> <8765> 8042 <8766> <8767> 7592 <8768> <8768> 8044 <8769> <876a> 7595 <876b> <876b> 8043 <876c> <876d> 7598 <876e> <876e> 8047 <876f> <8775> 7601 <877e> <877e> 8323 <8780> <8783> 7608 <8784> <8784> 8055 <8785> <878f> 7613 <8790> <8790> 762 <8791> <8791> 761 <8792> <8792> 769 <8793> <8799> 7624 <879a> <879a> 768 <879b> <879c> 7631 <889f> <88fc> 1125 <8940> <897e> 1219 <8980> <89fc> 1282 <8a40> <8a7e> 1407 <8a80> <8afc> 1470 <8b40> <8b7e> 1595 <8b80> <8bfc> 1658 <8c40> <8c7e> 1783 <8c80> <8cfc> 1846 <8d40> <8d7e> 1971 <8d80> <8dfc> 2034 <8e40> <8e7e> 2159 <8e80> <8efc> 2222 <8f40> <8f7e> 2347 <8f80> <8ffc> 2410 <9040> <907e> 2535 <9080> <90fc> 2598 <9140> <917e> 2723 <9180> <91fc> 2786 <9240> <927e> 2911 <9280> <92fc> 2974 <9340> <937e> 3099 <9380> <93fc> 3162 <9440> <947e> 3287 endcidrange 71 begincidrange <9480> <94fc> 3350 <9540> <957e> 3475 <9580> <95fc> 3538 <9640> <967e> 3663 <9680> <96fc> 3726 <9740> <977e> 3851 <9780> <97fc> 3914 <9840> <9872> 4039 <989f> <98fc> 4090 <9940> <997e> 4184 <9980> <99fc> 4247 <9a40> <9a7e> 4372 <9a80> <9afc> 4435 <9b40> <9b7e> 4560 <9b80> <9bfc> 4623 <9c40> <9c7e> 4748 <9c80> <9cfc> 4811 <9d40> <9d7e> 4936 <9d80> <9dfc> 4999 <9e40> <9e7e> 5124 <9e80> <9efc> 5187 <9f40> <9f7e> 5312 <9f80> <9ffc> 5375 <a0> <df> 326 <e040> <e07e> 5500 <e080> <e0fc> 5563 <e140> <e17e> 5688 <e180> <e1fc> 5751 <e240> <e27e> 5876 <e280> <e2fc> 5939 <e340> <e37e> 6064 <e380> <e3fc> 6127 <e440> <e47e> 6252 <e480> <e4fc> 6315 <e540> <e57e> 6440 <e580> <e5fc> 6503 <e640> <e67e> 6628 <e680> <e6fc> 6691 <e740> <e77e> 6816 <e780> <e7fc> 6879 <e840> <e87e> 7004 <e880> <e8fc> 7067 <e940> <e97e> 7192 <e980> <e9fc> 7255 <ea40> <ea7e> 7380 <ea80> <eaa2> 7443 <eaa3> <eaa4> 8284 <ed40> <ed7e> 8359 <ed80> <edb3> 8422 <edb4> <edb4> 1993 <edb5> <edfc> 8474 <ee40> <ee7e> 8546 <ee80> <eeec> 8609 <eeef> <eef8> 8092 <eef9> <eef9> 751 <eefa> <eefc> 8005 <fa40> <fa49> 8092 <fa4a> <fa53> 7575 <fa54> <fa54> 751 <fa55> <fa57> 8005 <fa58> <fa58> 7618 <fa59> <fa59> 7610 <fa5a> <fa5a> 8055 <fa5b> <fa5b> 768 <fa5c> <fa7e> 8359 <fa80> <facf> 8394 <fad0> <fad0> 1993 <fad1> <fafc> 8474 <fb40> <fb7e> 8518 <fb80> <fbfc> 8581 <fc40> <fc4b> 8706 endcidrange endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF \ No newline at end of file
diff --git a/src/main/resources/Resources/cmap/90ms-RKSJ-UCS2 b/src/main/resources/Resources/cmap/90ms-RKSJ-UCS2
new file mode 100644
index 0000000..3e45ad3
--- /dev/null
+++ b/src/main/resources/Resources/cmap/90ms-RKSJ-UCS2
@@ -0,0 +1 @@
+%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%IncludeResource: ProcSet (CIDInit) %%BeginResource: CMap (90ms-RKSJ-UCS2) %%Title: (90ms-RKSJ-UCS2) %%Version: 12.000 %%Copyright: ----------------------------------------------------------- %%Copyright: Copyright 1990-2000 Adobe Systems Incorporated. %%Copyright: All Rights Reserved. %%Copyright: %%Copyright: Patents Pending %%Copyright: %%Copyright: NOTICE: All information contained herein is the property %%Copyright: of Adobe Systems Incorporated. %%Copyright: %%Copyright: Permission is granted for redistribution of this file %%Copyright: provided this copyright notice is maintained intact and %%Copyright: that the contents of this file are not altered in any %%Copyright: way from its original form. %%Copyright: %%Copyright: PostScript and Display PostScript are trademarks of %%Copyright: Adobe Systems Incorporated which may be registered in %%Copyright: certain jurisdictions. %%Copyright: ----------------------------------------------------------- %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo 3 dict dup begin /Registry (Adobe) def /Ordering (90ms_RKSJ_UCS2) def /Supplement 2 def end def /CMapName /90ms-RKSJ-UCS2 def /CMapVersion 12.000 def /CMapType 1 def /WMode 0 def 5 begincodespacerange <00> <80> <8140> <9FFC> <A0> <DF> <E040> <FCFC> <FD> <FF> endcodespacerange 100 beginbfchar <80> <20AC> <A0> <F8F0> <8143> <FF0C> <8144> <FF0E> <8145> <30FB> <8148> <FF1F> <8149> <FF01> <814C> <00B4> <814D> <FF40> <814E> <00A8> <814F> <FF3E> <8150> <203E> <8151> <FF3F> <8156> <3003> <8157> <4EDD> <815B> <30FC> <815C> <2015> <815D> <2010> <815E> <FF0F> <815F> <FF3C> <8160> <FF5E> <8161> <2016> <8162> <FF5C> <8163> <2026> <8164> <2025> <816D> <FF3B> <816E> <FF3D> <816F> <FF5B> <8170> <FF5D> <817B> <FF0B> <817C> <FF0D> <817D> <00B1> <817E> <00D7> <8180> <00F7> <8181> <FF1D> <8182> <2260> <8183> <FF1C> <8184> <FF1E> <8187> <221E> <8188> <2234> <8189> <2642> <818A> <2640> <818B> <00B0> <818E> <2103> <818F> <FFE5> <8190> <FF04> <8193> <FF05> <8194> <FF03> <8195> <FF06> <8196> <FF0A> <8197> <FF20> <8198> <00A7> <8199> <2606> <819A> <2605> <819B> <25CB> <819C> <25CF> <819D> <25CE> <819E> <25C7> <819F> <25C6> <81A0> <25A1> <81A1> <25A0> <81A2> <25B3> <81A3> <25B2> <81A4> <25BD> <81A5> <25BC> <81A6> <203B> <81A7> <3012> <81A8> <2192> <81AB> <2193> <81AC> <3013> <81B8> <2208> <81B9> <220B> <81BE> <222A> <81BF> <2229> <81CA> <FFE2> <81CB> <21D2> <81CC> <21D4> <81CD> <2200> <81CE> <2203> <81DA> <2220> <81DB> <22A5> <81DC> <2312> <81DD> <2202> <81DE> <2207> <81DF> <2261> <81E0> <2252> <81E3> <221A> <81E4> <223D> <81E5> <221D> <81E6> <2235> <81F0> <212B> <81F1> <2030> <81F2> <266F> <81F3> <266D> <81F4> <266A> <81F7> <00B6> <81FC> <25EF> <8446> <0401> <8476> <0451> <849F> <2500> endbfchar 100 beginbfchar <84A0> <2502> <84A1> <250C> <84A2> <2510> <84A3> <2518> <84A4> <2514> <84A5> <251C> <84A6> <252C> <84A7> <2524> <84A8> <2534> <84A9> <253C> <84AA> <2501> <84AB> <2503> <84AC> <250F> <84AD> <2513> <84AE> <251B> <84AF> <2517> <84B0> <2523> <84B1> <2533> <84B2> <252B> <84B3> <253B> <84B4> <254B> <84B5> <2520> <84B6> <252F> <84B7> <2528> <84B8> <2537> <84B9> <253F> <84BA> <251D> <84BB> <2530> <84BC> <2525> <84BD> <2538> <84BE> <2542> <875F> <3349> <8760> <3314> <8761> <3322> <8762> <334D> <8763> <3318> <8764> <3327> <8765> <3303> <8766> <3336> <8767> <3351> <8768> <3357> <8769> <330D> <876A> <3326> <876B> <3323> <876C> <332B> <876D> <334A> <876E> <333B> <8774> <33C4> <8775> <33A1> <877E> <337B> <8780> <301D> <8781> <301F> <8782> <2116> <8783> <33CD> <8784> <2121> <878C> <3239> <878D> <337E> <878E> <337D> <878F> <337C> <8790> <2252> <8791> <2261> <8792> <222B> <8793> <222E> <8794> <2211> <8795> <221A> <8796> <22A5> <8797> <2220> <8798> <221F> <8799> <22BF> <879A> <2235> <889F> <4E9C> <88A0> <5516> <88A1> <5A03> <88A2> <963F> <88A3> <54C0> <88A4> <611B> <88A5> <6328> <88A6> <59F6> <88A7> <9022> <88A8> <8475> <88A9> <831C> <88AA> <7A50> <88AB> <60AA> <88AC> <63E1> <88AD> <6E25> <88AE> <65ED> <88AF> <8466> <88B0> <82A6> <88B1> <9BF5> <88B2> <6893> <88B3> <5727> <88B4> <65A1> <88B5> <6271> <88B6> <5B9B> <88B7> <59D0> <88B8> <867B> <88B9> <98F4> <88BA> <7D62> <88BB> <7DBE> <88BC> <9B8E> endbfchar 100 beginbfchar <88BD> <6216> <88BE> <7C9F> <88BF> <88B7> <88C0> <5B89> <88C1> <5EB5> <88C2> <6309> <88C3> <6697> <88C4> <6848> <88C5> <95C7> <88C6> <978D> <88C7> <674F> <88C8> <4EE5> <88C9> <4F0A> <88CA> <4F4D> <88CB> <4F9D> <88CC> <5049> <88CD> <56F2> <88CE> <5937> <88CF> <59D4> <88D0> <5A01> <88D1> <5C09> <88D2> <60DF> <88D3> <610F> <88D4> <6170> <88D5> <6613> <88D6> <6905> <88D7> <70BA> <88D8> <754F> <88D9> <7570> <88DA> <79FB> <88DB> <7DAD> <88DC> <7DEF> <88DD> <80C3> <88DE> <840E> <88DF> <8863> <88E0> <8B02> <88E1> <9055> <88E2> <907A> <88E3> <533B> <88E4> <4E95> <88E5> <4EA5> <88E6> <57DF> <88E7> <80B2> <88E8> <90C1> <88E9> <78EF> <88EA> <4E00> <88EB> <58F1> <88EC> <6EA2> <88ED> <9038> <88EE> <7A32> <88EF> <8328> <88F0> <828B> <88F1> <9C2F> <88F2> <5141> <88F3> <5370> <88F4> <54BD> <88F5> <54E1> <88F6> <56E0> <88F7> <59FB> <88F8> <5F15> <88F9> <98F2> <88FA> <6DEB> <88FB> <80E4> <88FC> <852D> <8940> <9662> <8941> <9670> <8942> <96A0> <8943> <97FB> <8944> <540B> <8945> <53F3> <8946> <5B87> <8947> <70CF> <8948> <7FBD> <8949> <8FC2> <894A> <96E8> <894B> <536F> <894C> <9D5C> <894D> <7ABA> <894E> <4E11> <894F> <7893> <8950> <81FC> <8951> <6E26> <8952> <5618> <8953> <5504> <8954> <6B1D> <8955> <851A> <8956> <9C3B> <8957> <59E5> <8958> <53A9> <8959> <6D66> <895A> <74DC> <895B> <958F> <895C> <5642> <895D> <4E91> <895E> <904B> <895F> <96F2> <8960> <834F> <8961> <990C> <8962> <53E1> <8963> <55B6> endbfchar 100 beginbfchar <8964> <5B30> <8965> <5F71> <8966> <6620> <8967> <66F3> <8968> <6804> <8969> <6C38> <896A> <6CF3> <896B> <6D29> <896C> <745B> <896D> <76C8> <896E> <7A4E> <896F> <9834> <8970> <82F1> <8971> <885B> <8972> <8A60> <8973> <92ED> <8974> <6DB2> <8975> <75AB> <8976> <76CA> <8977> <99C5> <8978> <60A6> <8979> <8B01> <897A> <8D8A> <897B> <95B2> <897C> <698E> <897D> <53AD> <897E> <5186> <8980> <5712> <8981> <5830> <8982> <5944> <8983> <5BB4> <8984> <5EF6> <8985> <6028> <8986> <63A9> <8987> <63F4> <8988> <6CBF> <8989> <6F14> <898A> <708E> <898B> <7114> <898C> <7159> <898D> <71D5> <898E> <733F> <898F> <7E01> <8990> <8276> <8991> <82D1> <8992> <8597> <8993> <9060> <8994> <925B> <8995> <9D1B> <8996> <5869> <8997> <65BC> <8998> <6C5A> <8999> <7525> <899A> <51F9> <899B> <592E> <899C> <5965> <899D> <5F80> <899E> <5FDC> <899F> <62BC> <89A0> <65FA> <89A1> <6A2A> <89A2> <6B27> <89A3> <6BB4> <89A4> <738B> <89A5> <7FC1> <89A6> <8956> <89A7> <9D2C> <89A8> <9D0E> <89A9> <9EC4> <89AA> <5CA1> <89AB> <6C96> <89AC> <837B> <89AD> <5104> <89AE> <5C4B> <89AF> <61B6> <89B0> <81C6> <89B1> <6876> <89B2> <7261> <89B3> <4E59> <89B4> <4FFA> <89B5> <5378> <89B6> <6069> <89B7> <6E29> <89B8> <7A4F> <89B9> <97F3> <89BA> <4E0B> <89BB> <5316> <89BC> <4EEE> <89BD> <4F55> <89BE> <4F3D> <89BF> <4FA1> <89C0> <4F73> <89C1> <52A0> <89C2> <53EF> <89C3> <5609> <89C4> <590F> <89C5> <5AC1> <89C6> <5BB6> <89C7> <5BE1> <89C8> <79D1> endbfchar 100 beginbfchar <89C9> <6687> <89CA> <679C> <89CB> <67B6> <89CC> <6B4C> <89CD> <6CB3> <89CE> <706B> <89CF> <73C2> <89D0> <798D> <89D1> <79BE> <89D2> <7A3C> <89D3> <7B87> <89D4> <82B1> <89D5> <82DB> <89D6> <8304> <89D7> <8377> <89D8> <83EF> <89D9> <83D3> <89DA> <8766> <89DB> <8AB2> <89DC> <5629> <89DD> <8CA8> <89DE> <8FE6> <89DF> <904E> <89E0> <971E> <89E1> <868A> <89E2> <4FC4> <89E3> <5CE8> <89E4> <6211> <89E5> <7259> <89E6> <753B> <89E7> <81E5> <89E8> <82BD> <89E9> <86FE> <89EA> <8CC0> <89EB> <96C5> <89EC> <9913> <89ED> <99D5> <89EE> <4ECB> <89EF> <4F1A> <89F0> <89E3> <89F1> <56DE> <89F2> <584A> <89F3> <58CA> <89F4> <5EFB> <89F5> <5FEB> <89F6> <602A> <89F7> <6094> <89F8> <6062> <89F9> <61D0> <89FA> <6212> <89FB> <62D0> <89FC> <6539> <8A40> <9B41> <8A41> <6666> <8A42> <68B0> <8A43> <6D77> <8A44> <7070> <8A45> <754C> <8A46> <7686> <8A47> <7D75> <8A48> <82A5> <8A49> <87F9> <8A4A> <958B> <8A4B> <968E> <8A4C> <8C9D> <8A4D> <51F1> <8A4E> <52BE> <8A4F> <5916> <8A50> <54B3> <8A51> <5BB3> <8A52> <5D16> <8A53> <6168> <8A54> <6982> <8A55> <6DAF> <8A56> <788D> <8A57> <84CB> <8A58> <8857> <8A59> <8A72> <8A5A> <93A7> <8A5B> <9AB8> <8A5C> <6D6C> <8A5D> <99A8> <8A5E> <86D9> <8A5F> <57A3> <8A60> <67FF> <8A61> <86CE> <8A62> <920E> <8A63> <5283> <8A64> <5687> <8A65> <5404> <8A66> <5ED3> <8A67> <62E1> <8A68> <64B9> <8A69> <683C> <8A6A> <6838> <8A6B> <6BBB> <8A6C> <7372> <8A6D> <78BA> <8A6E> <7A6B> <8A6F> <899A> endbfchar 100 beginbfchar <8A70> <89D2> <8A71> <8D6B> <8A72> <8F03> <8A73> <90ED> <8A74> <95A3> <8A75> <9694> <8A76> <9769> <8A77> <5B66> <8A78> <5CB3> <8A79> <697D> <8A7C> <639B> <8A7D> <7B20> <8A7E> <6A2B> <8A80> <6A7F> <8A81> <68B6> <8A82> <9C0D> <8A83> <6F5F> <8A84> <5272> <8A85> <559D> <8A86> <6070> <8A87> <62EC> <8A88> <6D3B> <8A89> <6E07> <8A8A> <6ED1> <8A8B> <845B> <8A8C> <8910> <8A8D> <8F44> <8A8E> <4E14> <8A8F> <9C39> <8A90> <53F6> <8A91> <691B> <8A92> <6A3A> <8A93> <9784> <8A94> <682A> <8A95> <515C> <8A96> <7AC3> <8A97> <84B2> <8A98> <91DC> <8A99> <938C> <8A9A> <565B> <8A9B> <9D28> <8A9C> <6822> <8A9D> <8305> <8A9E> <8431> <8A9F> <7CA5> <8AA0> <5208> <8AA1> <82C5> <8AA2> <74E6> <8AA3> <4E7E> <8AA4> <4F83> <8AA5> <51A0> <8AA6> <5BD2> <8AA7> <520A> <8AA8> <52D8> <8AA9> <52E7> <8AAA> <5DFB> <8AAB> <559A> <8AAC> <582A> <8AAD> <59E6> <8AAE> <5B8C> <8AAF> <5B98> <8AB0> <5BDB> <8AB1> <5E72> <8AB2> <5E79> <8AB3> <60A3> <8AB4> <611F> <8AB5> <6163> <8AB6> <61BE> <8AB7> <63DB> <8AB8> <6562> <8AB9> <67D1> <8ABA> <6853> <8ABB> <68FA> <8ABC> <6B3E> <8ABD> <6B53> <8ABE> <6C57> <8ABF> <6F22> <8AC0> <6F97> <8AC1> <6F45> <8AC2> <74B0> <8AC3> <7518> <8AC4> <76E3> <8AC5> <770B> <8AC6> <7AFF> <8AC7> <7BA1> <8AC8> <7C21> <8AC9> <7DE9> <8ACA> <7F36> <8ACB> <7FF0> <8ACC> <809D> <8ACD> <8266> <8ACE> <839E> <8ACF> <89B3> <8AD0> <8ACC> <8AD1> <8CAB> <8AD2> <9084> <8AD3> <9451> <8AD4> <9593> <8AD5> <9591> <8AD6> <95A2> endbfchar 100 beginbfchar <8AD7> <9665> <8AD8> <97D3> <8AD9> <9928> <8ADA> <8218> <8ADB> <4E38> <8ADC> <542B> <8ADD> <5CB8> <8ADE> <5DCC> <8ADF> <73A9> <8AE0> <764C> <8AE1> <773C> <8AE2> <5CA9> <8AE3> <7FEB> <8AE4> <8D0B> <8AE5> <96C1> <8AE6> <9811> <8AE7> <9854> <8AE8> <9858> <8AE9> <4F01> <8AEA> <4F0E> <8AEB> <5371> <8AEC> <559C> <8AED> <5668> <8AEE> <57FA> <8AEF> <5947> <8AF0> <5B09> <8AF1> <5BC4> <8AF2> <5C90> <8AF3> <5E0C> <8AF4> <5E7E> <8AF5> <5FCC> <8AF6> <63EE> <8AF7> <673A> <8AF8> <65D7> <8AF9> <65E2> <8AFA> <671F> <8AFB> <68CB> <8AFC> <68C4> <8B40> <6A5F> <8B41> <5E30> <8B42> <6BC5> <8B43> <6C17> <8B44> <6C7D> <8B45> <757F> <8B46> <7948> <8B47> <5B63> <8B48> <7A00> <8B49> <7D00> <8B4A> <5FBD> <8B4B> <898F> <8B4C> <8A18> <8B4D> <8CB4> <8B4E> <8D77> <8B4F> <8ECC> <8B50> <8F1D> <8B51> <98E2> <8B52> <9A0E> <8B53> <9B3C> <8B54> <4E80> <8B55> <507D> <8B56> <5100> <8B57> <5993> <8B58> <5B9C> <8B59> <622F> <8B5A> <6280> <8B5B> <64EC> <8B5C> <6B3A> <8B5D> <72A0> <8B5E> <7591> <8B5F> <7947> <8B60> <7FA9> <8B61> <87FB> <8B62> <8ABC> <8B63> <8B70> <8B64> <63AC> <8B65> <83CA> <8B66> <97A0> <8B67> <5409> <8B68> <5403> <8B69> <55AB> <8B6A> <6854> <8B6B> <6A58> <8B6C> <8A70> <8B6D> <7827> <8B6E> <6775> <8B6F> <9ECD> <8B70> <5374> <8B71> <5BA2> <8B72> <811A> <8B73> <8650> <8B74> <9006> <8B75> <4E18> <8B76> <4E45> <8B77> <4EC7> <8B78> <4F11> <8B79> <53CA> <8B7A> <5438> <8B7B> <5BAE> <8B7C> <5F13> <8B7D> <6025> endbfchar 100 beginbfchar <8B7E> <6551> <8B80> <673D> <8B81> <6C42> <8B82> <6C72> <8B83> <6CE3> <8B84> <7078> <8B85> <7403> <8B86> <7A76> <8B87> <7AAE> <8B88> <7B08> <8B89> <7D1A> <8B8A> <7CFE> <8B8B> <7D66> <8B8C> <65E7> <8B8D> <725B> <8B8E> <53BB> <8B8F> <5C45> <8B90> <5DE8> <8B91> <62D2> <8B92> <62E0> <8B93> <6319> <8B94> <6E20> <8B95> <865A> <8B96> <8A31> <8B97> <8DDD> <8B98> <92F8> <8B99> <6F01> <8B9A> <79A6> <8B9B> <9B5A> <8B9C> <4EA8> <8B9F> <4F9B> <8BA0> <4FA0> <8BA1> <50D1> <8BA2> <5147> <8BA3> <7AF6> <8BA4> <5171> <8BA5> <51F6> <8BA6> <5354> <8BA7> <5321> <8BA8> <537F> <8BA9> <53EB> <8BAA> <55AC> <8BAB> <5883> <8BAC> <5CE1> <8BAD> <5F37> <8BAE> <5F4A> <8BAF> <602F> <8BB0> <6050> <8BB1> <606D> <8BB2> <631F> <8BB3> <6559> <8BB4> <6A4B> <8BB5> <6CC1> <8BB6> <72C2> <8BB7> <72ED> <8BB8> <77EF> <8BB9> <80F8> <8BBA> <8105> <8BBB> <8208> <8BBC> <854E> <8BBD> <90F7> <8BBE> <93E1> <8BBF> <97FF> <8BC0> <9957> <8BC1> <9A5A> <8BC2> <4EF0> <8BC3> <51DD> <8BC4> <5C2D> <8BC5> <6681> <8BC6> <696D> <8BC7> <5C40> <8BC8> <66F2> <8BC9> <6975> <8BCA> <7389> <8BCB> <6850> <8BCC> <7C81> <8BCD> <50C5> <8BCE> <52E4> <8BCF> <5747> <8BD0> <5DFE> <8BD1> <9326> <8BD2> <65A4> <8BD3> <6B23> <8BD4> <6B3D> <8BD5> <7434> <8BD6> <7981> <8BD7> <79BD> <8BD8> <7B4B> <8BD9> <7DCA> <8BDA> <82B9> <8BDB> <83CC> <8BDC> <887F> <8BDD> <895F> <8BDE> <8B39> <8BDF> <8FD1> <8BE0> <91D1> <8BE1> <541F> <8BE2> <9280> <8BE3> <4E5D> <8BE4> <5036> endbfchar 100 beginbfchar <8BE5> <53E5> <8BE6> <533A> <8BE7> <72D7> <8BE8> <7396> <8BE9> <77E9> <8BEA> <82E6> <8BEB> <8EAF> <8BEC> <99C6> <8BED> <99C8> <8BEE> <99D2> <8BEF> <5177> <8BF0> <611A> <8BF1> <865E> <8BF2> <55B0> <8BF3> <7A7A> <8BF4> <5076> <8BF5> <5BD3> <8BF6> <9047> <8BF7> <9685> <8BF8> <4E32> <8BF9> <6ADB> <8BFA> <91E7> <8BFB> <5C51> <8BFC> <5C48> <8C40> <6398> <8C41> <7A9F> <8C42> <6C93> <8C43> <9774> <8C44> <8F61> <8C45> <7AAA> <8C46> <718A> <8C47> <9688> <8C48> <7C82> <8C49> <6817> <8C4A> <7E70> <8C4B> <6851> <8C4C> <936C> <8C4D> <52F2> <8C4E> <541B> <8C4F> <85AB> <8C50> <8A13> <8C51> <7FA4> <8C52> <8ECD> <8C53> <90E1> <8C54> <5366> <8C55> <8888> <8C56> <7941> <8C57> <4FC2> <8C58> <50BE> <8C59> <5211> <8C5A> <5144> <8C5B> <5553> <8C5C> <572D> <8C5D> <73EA> <8C5E> <578B> <8C5F> <5951> <8C60> <5F62> <8C61> <5F84> <8C62> <6075> <8C63> <6176> <8C64> <6167> <8C65> <61A9> <8C66> <63B2> <8C67> <643A> <8C68> <656C> <8C69> <666F> <8C6A> <6842> <8C6B> <6E13> <8C6C> <7566> <8C6D> <7A3D> <8C6E> <7CFB> <8C6F> <7D4C> <8C70> <7D99> <8C71> <7E4B> <8C72> <7F6B> <8C73> <830E> <8C74> <834A> <8C75> <86CD> <8C76> <8A08> <8C77> <8A63> <8C78> <8B66> <8C79> <8EFD> <8C7A> <981A> <8C7B> <9D8F> <8C7C> <82B8> <8C7D> <8FCE> <8C7E> <9BE8> <8C80> <5287> <8C81> <621F> <8C82> <6483> <8C83> <6FC0> <8C84> <9699> <8C85> <6841> <8C86> <5091> <8C87> <6B20> <8C88> <6C7A> <8C89> <6F54> <8C8A> <7A74> <8C8B> <7D50> <8C8C> <8840> endbfchar 100 beginbfchar <8C8D> <8A23> <8C8E> <6708> <8C8F> <4EF6> <8C90> <5039> <8C91> <5026> <8C92> <5065> <8C93> <517C> <8C94> <5238> <8C95> <5263> <8C96> <55A7> <8C97> <570F> <8C98> <5805> <8C99> <5ACC> <8C9A> <5EFA> <8C9B> <61B2> <8C9C> <61F8> <8C9D> <62F3> <8C9E> <6372> <8C9F> <691C> <8CA0> <6A29> <8CA1> <727D> <8CA2> <72AC> <8CA3> <732E> <8CA4> <7814> <8CA5> <786F> <8CA6> <7D79> <8CA7> <770C> <8CA8> <80A9> <8CA9> <898B> <8CAA> <8B19> <8CAB> <8CE2> <8CAC> <8ED2> <8CAD> <9063> <8CAE> <9375> <8CAF> <967A> <8CB0> <9855> <8CB1> <9A13> <8CB2> <9E78> <8CB3> <5143> <8CB4> <539F> <8CB5> <53B3> <8CB6> <5E7B> <8CB7> <5F26> <8CB8> <6E1B> <8CB9> <6E90> <8CBA> <7384> <8CBB> <73FE> <8CBC> <7D43> <8CBD> <8237> <8CBE> <8A00> <8CBF> <8AFA> <8CC0> <9650> <8CC1> <4E4E> <8CC2> <500B> <8CC3> <53E4> <8CC4> <547C> <8CC5> <56FA> <8CC6> <59D1> <8CC7> <5B64> <8CC8> <5DF1> <8CC9> <5EAB> <8CCA> <5F27> <8CCB> <6238> <8CCC> <6545> <8CCD> <67AF> <8CCE> <6E56> <8CCF> <72D0> <8CD0> <7CCA> <8CD1> <88B4> <8CD2> <80A1> <8CD3> <80E1> <8CD4> <83F0> <8CD5> <864E> <8CD6> <8A87> <8CD7> <8DE8> <8CD8> <9237> <8CD9> <96C7> <8CDA> <9867> <8CDB> <9F13> <8CDC> <4E94> <8CDD> <4E92> <8CDE> <4F0D> <8CDF> <5348> <8CE0> <5449> <8CE1> <543E> <8CE2> <5A2F> <8CE3> <5F8C> <8CE4> <5FA1> <8CE5> <609F> <8CE6> <68A7> <8CE7> <6A8E> <8CE8> <745A> <8CE9> <7881> <8CEA> <8A9E> <8CEB> <8AA4> <8CEC> <8B77> <8CED> <9190> <8CEE> <4E5E> <8CEF> <9BC9> <8CF0> <4EA4> endbfchar 100 beginbfchar <8CF1> <4F7C> <8CF2> <4FAF> <8CF3> <5019> <8CF4> <5016> <8CF5> <5149> <8CF6> <516C> <8CF7> <529F> <8CF8> <52B9> <8CF9> <52FE> <8CFA> <539A> <8CFB> <53E3> <8CFC> <5411> <8D40> <540E> <8D41> <5589> <8D42> <5751> <8D43> <57A2> <8D44> <597D> <8D45> <5B54> <8D46> <5B5D> <8D47> <5B8F> <8D48> <5DE5> <8D49> <5DE7> <8D4A> <5DF7> <8D4B> <5E78> <8D4C> <5E83> <8D4D> <5E9A> <8D4E> <5EB7> <8D4F> <5F18> <8D50> <6052> <8D51> <614C> <8D52> <6297> <8D53> <62D8> <8D54> <63A7> <8D55> <653B> <8D56> <6602> <8D57> <6643> <8D58> <66F4> <8D59> <676D> <8D5A> <6821> <8D5B> <6897> <8D5C> <69CB> <8D5D> <6C5F> <8D5E> <6D2A> <8D5F> <6D69> <8D60> <6E2F> <8D61> <6E9D> <8D62> <7532> <8D63> <7687> <8D64> <786C> <8D65> <7A3F> <8D66> <7CE0> <8D67> <7D05> <8D68> <7D18> <8D69> <7D5E> <8D6A> <7DB1> <8D6B> <8015> <8D6C> <8003> <8D6D> <80AF> <8D6E> <80B1> <8D6F> <8154> <8D70> <818F> <8D71> <822A> <8D72> <8352> <8D73> <884C> <8D74> <8861> <8D75> <8B1B> <8D76> <8CA2> <8D77> <8CFC> <8D78> <90CA> <8D79> <9175> <8D7A> <9271> <8D7B> <783F> <8D7C> <92FC> <8D7D> <95A4> <8D7E> <964D> <8D80> <9805> <8D81> <9999> <8D82> <9AD8> <8D83> <9D3B> <8D84> <525B> <8D85> <52AB> <8D86> <53F7> <8D87> <5408> <8D88> <58D5> <8D89> <62F7> <8D8A> <6FE0> <8D8B> <8C6A> <8D8C> <8F5F> <8D8D> <9EB9> <8D8E> <514B> <8D8F> <523B> <8D90> <544A> <8D91> <56FD> <8D92> <7A40> <8D93> <9177> <8D94> <9D60> <8D95> <9ED2> <8D96> <7344> <8D97> <6F09> <8D98> <8170> endbfchar 100 beginbfchar <8D99> <7511> <8D9A> <5FFD> <8D9B> <60DA> <8D9C> <9AA8> <8D9D> <72DB> <8D9E> <8FBC> <8D9F> <6B64> <8DA0> <9803> <8DA1> <4ECA> <8DA2> <56F0> <8DA3> <5764> <8DA4> <58BE> <8DA5> <5A5A> <8DA6> <6068> <8DA7> <61C7> <8DA8> <660F> <8DA9> <6606> <8DAA> <6839> <8DAB> <68B1> <8DAC> <6DF7> <8DAD> <75D5> <8DAE> <7D3A> <8DAF> <826E> <8DB0> <9B42> <8DB1> <4E9B> <8DB2> <4F50> <8DB3> <53C9> <8DB4> <5506> <8DB5> <5D6F> <8DB6> <5DE6> <8DB7> <5DEE> <8DB8> <67FB> <8DB9> <6C99> <8DBA> <7473> <8DBB> <7802> <8DBC> <8A50> <8DBD> <9396> <8DBE> <88DF> <8DBF> <5750> <8DC0> <5EA7> <8DC1> <632B> <8DC2> <50B5> <8DC3> <50AC> <8DC4> <518D> <8DC5> <6700> <8DC6> <54C9> <8DC7> <585E> <8DC8> <59BB> <8DC9> <5BB0> <8DCA> <5F69> <8DCB> <624D> <8DCC> <63A1> <8DCD> <683D> <8DCE> <6B73> <8DCF> <6E08> <8DD0> <707D> <8DD1> <91C7> <8DD2> <7280> <8DD3> <7815> <8DD4> <7826> <8DD5> <796D> <8DD6> <658E> <8DD7> <7D30> <8DD8> <83DC> <8DD9> <88C1> <8DDA> <8F09> <8DDB> <969B> <8DDC> <5264> <8DDD> <5728> <8DDE> <6750> <8DDF> <7F6A> <8DE0> <8CA1> <8DE1> <51B4> <8DE2> <5742> <8DE3> <962A> <8DE4> <583A> <8DE5> <698A> <8DE6> <80B4> <8DE7> <54B2> <8DE8> <5D0E> <8DE9> <57FC> <8DEA> <7895> <8DEB> <9DFA> <8DEC> <4F5C> <8DED> <524A> <8DEE> <548B> <8DEF> <643E> <8DF0> <6628> <8DF1> <6714> <8DF2> <67F5> <8DF3> <7A84> <8DF4> <7B56> <8DF5> <7D22> <8DF6> <932F> <8DF7> <685C> <8DF8> <9BAD> <8DF9> <7B39> <8DFA> <5319> <8DFB> <518A> <8DFC> <5237> endbfchar 100 beginbfchar <8E40> <5BDF> <8E41> <62F6> <8E42> <64AE> <8E43> <64E6> <8E44> <672D> <8E45> <6BBA> <8E46> <85A9> <8E47> <96D1> <8E48> <7690> <8E49> <9BD6> <8E4A> <634C> <8E4B> <9306> <8E4C> <9BAB> <8E4D> <76BF> <8E4E> <6652> <8E4F> <4E09> <8E50> <5098> <8E51> <53C2> <8E52> <5C71> <8E53> <60E8> <8E54> <6492> <8E55> <6563> <8E56> <685F> <8E57> <71E6> <8E58> <73CA> <8E59> <7523> <8E5A> <7B97> <8E5B> <7E82> <8E5C> <8695> <8E5D> <8B83> <8E5E> <8CDB> <8E5F> <9178> <8E60> <9910> <8E61> <65AC> <8E62> <66AB> <8E63> <6B8B> <8E64> <4ED5> <8E65> <4ED4> <8E66> <4F3A> <8E67> <4F7F> <8E68> <523A> <8E69> <53F8> <8E6A> <53F2> <8E6B> <55E3> <8E6C> <56DB> <8E6D> <58EB> <8E6E> <59CB> <8E6F> <59C9> <8E70> <59FF> <8E71> <5B50> <8E72> <5C4D> <8E73> <5E02> <8E74> <5E2B> <8E75> <5FD7> <8E76> <601D> <8E77> <6307> <8E78> <652F> <8E79> <5B5C> <8E7A> <65AF> <8E7B> <65BD> <8E7C> <65E8> <8E7D> <679D> <8E7E> <6B62> <8E80> <6B7B> <8E81> <6C0F> <8E82> <7345> <8E83> <7949> <8E84> <79C1> <8E85> <7CF8> <8E86> <7D19> <8E87> <7D2B> <8E88> <80A2> <8E89> <8102> <8E8A> <81F3> <8E8B> <8996> <8E8C> <8A5E> <8E8D> <8A69> <8E8E> <8A66> <8E8F> <8A8C> <8E90> <8AEE> <8E91> <8CC7> <8E92> <8CDC> <8E93> <96CC> <8E94> <98FC> <8E95> <6B6F> <8E96> <4E8B> <8E97> <4F3C> <8E98> <4F8D> <8E99> <5150> <8E9A> <5B57> <8E9B> <5BFA> <8E9C> <6148> <8E9D> <6301> <8E9E> <6642> <8E9F> <6B21> <8EA0> <6ECB> <8EA1> <6CBB> <8EA2> <723E> <8EA3> <74BD> <8EA4> <75D4> endbfchar 100 beginbfchar <8EA5> <78C1> <8EA6> <793A> <8EA7> <800C> <8EA8> <8033> <8EA9> <81EA> <8EAA> <8494> <8EAB> <8F9E> <8EAC> <6C50> <8EAD> <9E7F> <8EAE> <5F0F> <8EAF> <8B58> <8EB0> <9D2B> <8EB1> <7AFA> <8EB2> <8EF8> <8EB3> <5B8D> <8EB4> <96EB> <8EB5> <4E03> <8EB6> <53F1> <8EB7> <57F7> <8EB8> <5931> <8EB9> <5AC9> <8EBA> <5BA4> <8EBB> <6089> <8EBC> <6E7F> <8EBD> <6F06> <8EBE> <75BE> <8EBF> <8CEA> <8EC0> <5B9F> <8EC1> <8500> <8EC2> <7BE0> <8EC3> <5072> <8EC4> <67F4> <8EC5> <829D> <8EC6> <5C61> <8EC7> <854A> <8EC8> <7E1E> <8EC9> <820E> <8ECA> <5199> <8ECB> <5C04> <8ECC> <6368> <8ECD> <8D66> <8ECE> <659C> <8ECF> <716E> <8ED0> <793E> <8ED1> <7D17> <8ED2> <8005> <8ED3> <8B1D> <8ED4> <8ECA> <8ED5> <906E> <8ED6> <86C7> <8ED7> <90AA> <8ED8> <501F> <8ED9> <52FA> <8EDA> <5C3A> <8EDB> <6753> <8EDC> <707C> <8EDD> <7235> <8EDE> <914C> <8EDF> <91C8> <8EE0> <932B> <8EE1> <82E5> <8EE2> <5BC2> <8EE3> <5F31> <8EE4> <60F9> <8EE5> <4E3B> <8EE6> <53D6> <8EE7> <5B88> <8EE8> <624B> <8EE9> <6731> <8EEA> <6B8A> <8EEB> <72E9> <8EEC> <73E0> <8EED> <7A2E> <8EEE> <816B> <8EEF> <8DA3> <8EF0> <9152> <8EF1> <9996> <8EF2> <5112> <8EF3> <53D7> <8EF4> <546A> <8EF5> <5BFF> <8EF6> <6388> <8EF7> <6A39> <8EF8> <7DAC> <8EF9> <9700> <8EFA> <56DA> <8EFB> <53CE> <8EFC> <5468> <8F40> <5B97> <8F41> <5C31> <8F42> <5DDE> <8F43> <4FEE> <8F44> <6101> <8F45> <62FE> <8F46> <6D32> <8F47> <79C0> <8F48> <79CB> <8F49> <7D42> <8F4A> <7E4D> <8F4B> <7FD2> endbfchar 100 beginbfchar <8F4C> <81ED> <8F4D> <821F> <8F4E> <8490> <8F4F> <8846> <8F50> <8972> <8F51> <8B90> <8F52> <8E74> <8F53> <8F2F> <8F54> <9031> <8F55> <914B> <8F56> <916C> <8F57> <96C6> <8F58> <919C> <8F59> <4EC0> <8F5A> <4F4F> <8F5B> <5145> <8F5C> <5341> <8F5D> <5F93> <8F5E> <620E> <8F5F> <67D4> <8F60> <6C41> <8F61> <6E0B> <8F62> <7363> <8F63> <7E26> <8F64> <91CD> <8F65> <9283> <8F66> <53D4> <8F67> <5919> <8F68> <5BBF> <8F69> <6DD1> <8F6A> <795D> <8F6B> <7E2E> <8F6C> <7C9B> <8F6D> <587E> <8F6E> <719F> <8F6F> <51FA> <8F70> <8853> <8F71> <8FF0> <8F72> <4FCA> <8F73> <5CFB> <8F74> <6625> <8F75> <77AC> <8F76> <7AE3> <8F77> <821C> <8F78> <99FF> <8F79> <51C6> <8F7A> <5FAA> <8F7B> <65EC> <8F7C> <696F> <8F7D> <6B89> <8F7E> <6DF3> <8F80> <6E96> <8F81> <6F64> <8F82> <76FE> <8F83> <7D14> <8F84> <5DE1> <8F85> <9075> <8F86> <9187> <8F87> <9806> <8F88> <51E6> <8F89> <521D> <8F8A> <6240> <8F8B> <6691> <8F8C> <66D9> <8F8D> <6E1A> <8F8E> <5EB6> <8F8F> <7DD2> <8F90> <7F72> <8F91> <66F8> <8F92> <85AF> <8F93> <85F7> <8F94> <8AF8> <8F95> <52A9> <8F96> <53D9> <8F97> <5973> <8F98> <5E8F> <8F99> <5F90> <8F9A> <6055> <8F9B> <92E4> <8F9C> <9664> <8F9D> <50B7> <8F9E> <511F> <8F9F> <52DD> <8FA0> <5320> <8FA1> <5347> <8FA2> <53EC> <8FA3> <54E8> <8FA4> <5546> <8FA5> <5531> <8FA6> <5617> <8FA7> <5968> <8FA8> <59BE> <8FA9> <5A3C> <8FAA> <5BB5> <8FAB> <5C06> <8FAC> <5C0F> <8FAD> <5C11> <8FAE> <5C1A> <8FAF> <5E84> <8FB0> <5E8A> endbfchar 100 beginbfchar <8FB1> <5EE0> <8FB2> <5F70> <8FB3> <627F> <8FB4> <6284> <8FB5> <62DB> <8FB6> <638C> <8FB7> <6377> <8FB8> <6607> <8FB9> <660C> <8FBA> <662D> <8FBB> <6676> <8FBC> <677E> <8FBD> <68A2> <8FBE> <6A1F> <8FBF> <6A35> <8FC0> <6CBC> <8FC1> <6D88> <8FC2> <6E09> <8FC3> <6E58> <8FC4> <713C> <8FC5> <7126> <8FC6> <7167> <8FC7> <75C7> <8FC8> <7701> <8FC9> <785D> <8FCA> <7901> <8FCB> <7965> <8FCC> <79F0> <8FCD> <7AE0> <8FCE> <7B11> <8FCF> <7CA7> <8FD0> <7D39> <8FD1> <8096> <8FD2> <83D6> <8FD3> <848B> <8FD4> <8549> <8FD5> <885D> <8FD6> <88F3> <8FD7> <8A1F> <8FD8> <8A3C> <8FD9> <8A54> <8FDA> <8A73> <8FDB> <8C61> <8FDC> <8CDE> <8FDD> <91A4> <8FDE> <9266> <8FDF> <937E> <8FE0> <9418> <8FE1> <969C> <8FE2> <9798> <8FE3> <4E0A> <8FE4> <4E08> <8FE5> <4E1E> <8FE6> <4E57> <8FE7> <5197> <8FE8> <5270> <8FE9> <57CE> <8FEA> <5834> <8FEB> <58CC> <8FEC> <5B22> <8FED> <5E38> <8FEE> <60C5> <8FEF> <64FE> <8FF0> <6761> <8FF1> <6756> <8FF2> <6D44> <8FF3> <72B6> <8FF4> <7573> <8FF5> <7A63> <8FF6> <84B8> <8FF7> <8B72> <8FF8> <91B8> <8FF9> <9320> <8FFA> <5631> <8FFB> <57F4> <8FFC> <98FE> <9040> <62ED> <9041> <690D> <9042> <6B96> <9043> <71ED> <9044> <7E54> <9045> <8077> <9046> <8272> <9047> <89E6> <9048> <98DF> <9049> <8755> <904A> <8FB1> <904B> <5C3B> <904C> <4F38> <904D> <4FE1> <904E> <4FB5> <904F> <5507> <9050> <5A20> <9051> <5BDD> <9052> <5BE9> <9053> <5FC3> <9054> <614E> <9055> <632F> <9056> <65B0> <9057> <664B> endbfchar 100 beginbfchar <9058> <68EE> <9059> <699B> <905A> <6D78> <905B> <6DF1> <905C> <7533> <905D> <75B9> <905E> <771F> <905F> <795E> <9060> <79E6> <9061> <7D33> <9062> <81E3> <9063> <82AF> <9064> <85AA> <9065> <89AA> <9066> <8A3A> <9067> <8EAB> <9068> <8F9B> <9069> <9032> <906A> <91DD> <906B> <9707> <906C> <4EBA> <906D> <4EC1> <906E> <5203> <906F> <5875> <9070> <58EC> <9071> <5C0B> <9072> <751A> <9073> <5C3D> <9074> <814E> <9075> <8A0A> <9076> <8FC5> <9077> <9663> <9078> <976D> <9079> <7B25> <907A> <8ACF> <907B> <9808> <907C> <9162> <907D> <56F3> <907E> <53A8> <9080> <9017> <9081> <5439> <9082> <5782> <9083> <5E25> <9084> <63A8> <9085> <6C34> <9086> <708A> <9087> <7761> <9088> <7C8B> <9089> <7FE0> <908A> <8870> <908B> <9042> <908C> <9154> <908D> <9310> <908E> <9318> <908F> <968F> <9090> <745E> <9091> <9AC4> <9092> <5D07> <9093> <5D69> <9094> <6570> <9095> <67A2> <9096> <8DA8> <9097> <96DB> <9098> <636E> <9099> <6749> <909A> <6919> <909B> <83C5> <909C> <9817> <909D> <96C0> <909E> <88FE> <909F> <6F84> <90A0> <647A> <90A1> <5BF8> <90A2> <4E16> <90A3> <702C> <90A4> <755D> <90A5> <662F> <90A6> <51C4> <90A7> <5236> <90A8> <52E2> <90A9> <59D3> <90AA> <5F81> <90AB> <6027> <90AC> <6210> <90AD> <653F> <90AE> <6574> <90AF> <661F> <90B0> <6674> <90B1> <68F2> <90B2> <6816> <90B3> <6B63> <90B4> <6E05> <90B5> <7272> <90B6> <751F> <90B7> <76DB> <90B8> <7CBE> <90B9> <8056> <90BA> <58F0> <90BB> <88FD> <90BC> <897F> endbfchar 100 beginbfchar <90BD> <8AA0> <90BE> <8A93> <90BF> <8ACB> <90C0> <901D> <90C1> <9192> <90C2> <9752> <90C3> <9759> <90C4> <6589> <90C5> <7A0E> <90C6> <8106> <90C7> <96BB> <90C8> <5E2D> <90C9> <60DC> <90CA> <621A> <90CB> <65A5> <90CC> <6614> <90CD> <6790> <90CE> <77F3> <90CF> <7A4D> <90D0> <7C4D> <90D1> <7E3E> <90D2> <810A> <90D3> <8CAC> <90D4> <8D64> <90D5> <8DE1> <90D6> <8E5F> <90D7> <78A9> <90D8> <5207> <90D9> <62D9> <90DA> <63A5> <90DB> <6442> <90DC> <6298> <90DD> <8A2D> <90DE> <7A83> <90DF> <7BC0> <90E0> <8AAC> <90E1> <96EA> <90E2> <7D76> <90E3> <820C> <90E4> <8749> <90E5> <4ED9> <90E6> <5148> <90E7> <5343> <90E8> <5360> <90E9> <5BA3> <90EA> <5C02> <90EB> <5C16> <90EC> <5DDD> <90ED> <6226> <90EE> <6247> <90EF> <64B0> <90F0> <6813> <90F1> <6834> <90F2> <6CC9> <90F3> <6D45> <90F4> <6D17> <90F5> <67D3> <90F6> <6F5C> <90F7> <714E> <90F8> <717D> <90F9> <65CB> <90FA> <7A7F> <90FB> <7BAD> <90FC> <7DDA> <9140> <7E4A> <9141> <7FA8> <9142> <817A> <9143> <821B> <9144> <8239> <9145> <85A6> <9146> <8A6E> <9147> <8CCE> <9148> <8DF5> <9149> <9078> <914A> <9077> <914B> <92AD> <914C> <9291> <914D> <9583> <914E> <9BAE> <914F> <524D> <9150> <5584> <9151> <6F38> <9152> <7136> <9153> <5168> <9154> <7985> <9155> <7E55> <9156> <81B3> <9157> <7CCE> <9158> <564C> <9159> <5851> <915A> <5CA8> <915B> <63AA> <915C> <66FE> <915D> <66FD> <915E> <695A> <915F> <72D9> <9160> <758F> <9161> <758E> <9162> <790E> <9163> <7956> endbfchar 100 beginbfchar <9164> <79DF> <9165> <7C97> <9166> <7D20> <9167> <7D44> <9168> <8607> <9169> <8A34> <916A> <963B> <916B> <9061> <916C> <9F20> <916D> <50E7> <916E> <5275> <916F> <53CC> <9170> <53E2> <9171> <5009> <9172> <55AA> <9173> <58EE> <9174> <594F> <9175> <723D> <9176> <5B8B> <9177> <5C64> <9178> <531D> <9179> <60E3> <917A> <60F3> <917B> <635C> <917C> <6383> <917D> <633F> <917E> <63BB> <9180> <64CD> <9181> <65E9> <9182> <66F9> <9183> <5DE3> <9184> <69CD> <9185> <69FD> <9186> <6F15> <9187> <71E5> <9188> <4E89> <9189> <75E9> <918A> <76F8> <918B> <7A93> <918C> <7CDF> <918D> <7DCF> <918E> <7D9C> <918F> <8061> <9190> <8349> <9191> <8358> <9192> <846C> <9193> <84BC> <9194> <85FB> <9195> <88C5> <9196> <8D70> <9197> <9001> <9198> <906D> <9199> <9397> <919A> <971C> <919B> <9A12> <919C> <50CF> <919D> <5897> <919E> <618E> <919F> <81D3> <91A0> <8535> <91A1> <8D08> <91A2> <9020> <91A3> <4FC3> <91A4> <5074> <91A5> <5247> <91A6> <5373> <91A7> <606F> <91A8> <6349> <91A9> <675F> <91AA> <6E2C> <91AB> <8DB3> <91AC> <901F> <91AD> <4FD7> <91AE> <5C5E> <91AF> <8CCA> <91B0> <65CF> <91B1> <7D9A> <91B2> <5352> <91B3> <8896> <91B4> <5176> <91B5> <63C3> <91B6> <5B58> <91B7> <5B6B> <91B8> <5C0A> <91B9> <640D> <91BA> <6751> <91BB> <905C> <91BC> <4ED6> <91BD> <591A> <91BE> <592A> <91BF> <6C70> <91C0> <8A51> <91C1> <553E> <91C2> <5815> <91C3> <59A5> <91C4> <60F0> <91C5> <6253> <91C6> <67C1> <91C7> <8235> <91C8> <6955> endbfchar 100 beginbfchar <91C9> <9640> <91CA> <99C4> <91CB> <9A28> <91CC> <4F53> <91CD> <5806> <91CE> <5BFE> <91CF> <8010> <91D0> <5CB1> <91D1> <5E2F> <91D2> <5F85> <91D3> <6020> <91D4> <614B> <91D5> <6234> <91D6> <66FF> <91D7> <6CF0> <91D8> <6EDE> <91D9> <80CE> <91DA> <817F> <91DB> <82D4> <91DC> <888B> <91DD> <8CB8> <91DE> <9000> <91DF> <902E> <91E0> <968A> <91E1> <9EDB> <91E2> <9BDB> <91E3> <4EE3> <91E4> <53F0> <91E5> <5927> <91E6> <7B2C> <91E7> <918D> <91E8> <984C> <91E9> <9DF9> <91EA> <6EDD> <91EB> <7027> <91EC> <5353> <91ED> <5544> <91EE> <5B85> <91EF> <6258> <91F0> <629E> <91F1> <62D3> <91F2> <6CA2> <91F3> <6FEF> <91F4> <7422> <91F5> <8A17> <91F6> <9438> <91F7> <6FC1> <91F8> <8AFE> <91F9> <8338> <91FA> <51E7> <91FB> <86F8> <91FC> <53EA> <9240> <53E9> <9241> <4F46> <9242> <9054> <9243> <8FB0> <9244> <596A> <9245> <8131> <9246> <5DFD> <9247> <7AEA> <9248> <8FBF> <9249> <68DA> <924A> <8C37> <924B> <72F8> <924C> <9C48> <924D> <6A3D> <924E> <8AB0> <924F> <4E39> <9250> <5358> <9251> <5606> <9252> <5766> <9253> <62C5> <9254> <63A2> <9255> <65E6> <9256> <6B4E> <9257> <6DE1> <9258> <6E5B> <9259> <70AD> <925A> <77ED> <925B> <7AEF> <925C> <7BAA> <925D> <7DBB> <925E> <803D> <925F> <80C6> <9260> <86CB> <9261> <8A95> <9262> <935B> <9263> <56E3> <9264> <58C7> <9265> <5F3E> <9266> <65AD> <9267> <6696> <9268> <6A80> <9269> <6BB5> <926A> <7537> <926B> <8AC7> <926C> <5024> <926D> <77E5> <926E> <5730> <926F> <5F1B> endbfchar 100 beginbfchar <9270> <6065> <9271> <667A> <9272> <6C60> <9273> <75F4> <9274> <7A1A> <9275> <7F6E> <9276> <81F4> <9277> <8718> <9278> <9045> <9279> <99B3> <927A> <7BC9> <927B> <755C> <927C> <7AF9> <927D> <7B51> <927E> <84C4> <9280> <9010> <9281> <79E9> <9282> <7A92> <9283> <8336> <9284> <5AE1> <9285> <7740> <9286> <4E2D> <9287> <4EF2> <9288> <5B99> <9289> <5FE0> <928A> <62BD> <928B> <663C> <928C> <67F1> <928D> <6CE8> <928E> <866B> <928F> <8877> <9290> <8A3B> <9291> <914E> <9292> <92F3> <9293> <99D0> <9294> <6A17> <9295> <7026> <9296> <732A> <9297> <82E7> <9298> <8457> <9299> <8CAF> <929A> <4E01> <929B> <5146> <929C> <51CB> <929D> <558B> <929E> <5BF5> <929F> <5E16> <92A0> <5E33> <92A1> <5E81> <92A2> <5F14> <92A3> <5F35> <92A4> <5F6B> <92A5> <5FB4> <92A6> <61F2> <92A7> <6311> <92A8> <66A2> <92A9> <671D> <92AA> <6F6E> <92AB> <7252> <92AC> <753A> <92AD> <773A> <92AE> <8074> <92AF> <8139> <92B0> <8178> <92B1> <8776> <92B2> <8ABF> <92B3> <8ADC> <92B4> <8D85> <92B5> <8DF3> <92B6> <929A> <92B7> <9577> <92B8> <9802> <92B9> <9CE5> <92BA> <52C5> <92BB> <6357> <92BC> <76F4> <92BD> <6715> <92BE> <6C88> <92BF> <73CD> <92C0> <8CC3> <92C1> <93AE> <92C2> <9673> <92C3> <6D25> <92C4> <589C> <92C5> <690E> <92C6> <69CC> <92C7> <8FFD> <92C8> <939A> <92C9> <75DB> <92CA> <901A> <92CB> <585A> <92CC> <6802> <92CD> <63B4> <92CE> <69FB> <92CF> <4F43> <92D0> <6F2C> <92D1> <67D8> <92D2> <8FBB> <92D3> <8526> <92D4> <7DB4> endbfchar 100 beginbfchar <92D5> <9354> <92D6> <693F> <92D7> <6F70> <92D8> <576A> <92D9> <58F7> <92DA> <5B2C> <92DB> <7D2C> <92DC> <722A> <92DD> <540A> <92DE> <91E3> <92DF> <9DB4> <92E0> <4EAD> <92E1> <4F4E> <92E2> <505C> <92E3> <5075> <92E4> <5243> <92E5> <8C9E> <92E6> <5448> <92E7> <5824> <92E8> <5B9A> <92E9> <5E1D> <92EA> <5E95> <92EB> <5EAD> <92EC> <5EF7> <92ED> <5F1F> <92EE> <608C> <92EF> <62B5> <92F0> <633A> <92F1> <63D0> <92F2> <68AF> <92F3> <6C40> <92F4> <7887> <92F5> <798E> <92F6> <7A0B> <92F7> <7DE0> <92F8> <8247> <92F9> <8A02> <92FA> <8AE6> <92FB> <8E44> <92FC> <9013> <9340> <90B8> <9341> <912D> <9342> <91D8> <9343> <9F0E> <9344> <6CE5> <9345> <6458> <9346> <64E2> <9347> <6575> <9348> <6EF4> <9349> <7684> <934A> <7B1B> <934B> <9069> <934C> <93D1> <934D> <6EBA> <934E> <54F2> <934F> <5FB9> <9350> <64A4> <9351> <8F4D> <9352> <8FED> <9353> <9244> <9354> <5178> <9355> <586B> <9356> <5929> <9357> <5C55> <9358> <5E97> <9359> <6DFB> <935A> <7E8F> <935B> <751C> <935C> <8CBC> <935D> <8EE2> <935E> <985B> <935F> <70B9> <9360> <4F1D> <9361> <6BBF> <9362> <6FB1> <9363> <7530> <9364> <96FB> <9365> <514E> <9366> <5410> <9367> <5835> <9368> <5857> <9369> <59AC> <936A> <5C60> <936B> <5F92> <936C> <6597> <936D> <675C> <936E> <6E21> <936F> <767B> <9370> <83DF> <9371> <8CED> <9372> <9014> <9373> <90FD> <9374> <934D> <9375> <7825> <9376> <783A> <9377> <52AA> <9378> <5EA6> <9379> <571F> <937A> <5974> <937B> <6012> endbfchar 100 beginbfchar <937C> <5012> <937D> <515A> <937E> <51AC> <9380> <51CD> <9381> <5200> <9382> <5510> <9383> <5854> <9384> <5858> <9385> <5957> <9386> <5B95> <9387> <5CF6> <9388> <5D8B> <9389> <60BC> <938A> <6295> <938B> <642D> <938C> <6771> <938D> <6843> <938E> <68BC> <938F> <68DF> <9390> <76D7> <9391> <6DD8> <9392> <6E6F> <9393> <6D9B> <9394> <706F> <9395> <71C8> <9396> <5F53> <9397> <75D8> <9398> <7977> <9399> <7B49> <939A> <7B54> <939B> <7B52> <939C> <7CD6> <939D> <7D71> <939E> <5230> <939F> <8463> <93A0> <8569> <93A1> <85E4> <93A2> <8A0E> <93A3> <8B04> <93A4> <8C46> <93A5> <8E0F> <93A6> <9003> <93A7> <900F> <93A8> <9419> <93A9> <9676> <93AA> <982D> <93AB> <9A30> <93AC> <95D8> <93AD> <50CD> <93AE> <52D5> <93AF> <540C> <93B0> <5802> <93B1> <5C0E> <93B2> <61A7> <93B3> <649E> <93B4> <6D1E> <93B5> <77B3> <93B6> <7AE5> <93B7> <80F4> <93B8> <8404> <93B9> <9053> <93BA> <9285> <93BB> <5CE0> <93BC> <9D07> <93BD> <533F> <93BE> <5F97> <93BF> <5FB3> <93C0> <6D9C> <93C1> <7279> <93C2> <7763> <93C3> <79BF> <93C4> <7BE4> <93C5> <6BD2> <93C6> <72EC> <93C7> <8AAD> <93C8> <6803> <93C9> <6A61> <93CA> <51F8> <93CB> <7A81> <93CC> <6934> <93CD> <5C4A> <93CE> <9CF6> <93CF> <82EB> <93D0> <5BC5> <93D1> <9149> <93D2> <701E> <93D3> <5678> <93D4> <5C6F> <93D5> <60C7> <93D6> <6566> <93D7> <6C8C> <93D8> <8C5A> <93D9> <9041> <93DA> <9813> <93DB> <5451> <93DC> <66C7> <93DD> <920D> <93DE> <5948> <93DF> <90A3> <93E0> <5185> endbfchar 100 beginbfchar <93E1> <4E4D> <93E2> <51EA> <93E3> <8599> <93E4> <8B0E> <93E5> <7058> <93E6> <637A> <93E7> <934B> <93E8> <6962> <93E9> <99B4> <93EA> <7E04> <93EB> <7577> <93EC> <5357> <93ED> <6960> <93EE> <8EDF> <93EF> <96E3> <93F0> <6C5D> <93F1> <4E8C> <93F2> <5C3C> <93F3> <5F10> <93F4> <8FE9> <93F5> <5302> <93F6> <8CD1> <93F7> <8089> <93F8> <8679> <93F9> <5EFF> <93FA> <65E5> <93FB> <4E73> <93FC> <5165> <9440> <5982> <9441> <5C3F> <9442> <97EE> <9443> <4EFB> <9444> <598A> <9445> <5FCD> <9446> <8A8D> <9447> <6FE1> <9448> <79B0> <9449> <7962> <944A> <5BE7> <944B> <8471> <944C> <732B> <944D> <71B1> <944E> <5E74> <944F> <5FF5> <9450> <637B> <9451> <649A> <9452> <71C3> <9453> <7C98> <9454> <4E43> <9455> <5EFC> <9456> <4E4B> <9457> <57DC> <9458> <56A2> <9459> <60A9> <945A> <6FC3> <945B> <7D0D> <945C> <80FD> <945D> <8133> <945E> <81BF> <945F> <8FB2> <9460> <8997> <9461> <86A4> <9462> <5DF4> <9463> <628A> <9464> <64AD> <9465> <8987> <9466> <6777> <9467> <6CE2> <9468> <6D3E> <9469> <7436> <946A> <7834> <946B> <5A46> <946C> <7F75> <946D> <82AD> <946E> <99AC> <946F> <4FF3> <9470> <5EC3> <9471> <62DD> <9472> <6392> <9473> <6557> <9474> <676F> <9475> <76C3> <9476> <724C> <9477> <80CC> <9478> <80BA> <9479> <8F29> <947A> <914D> <947B> <500D> <947C> <57F9> <947D> <5A92> <947E> <6885> <9480> <6973> <9481> <7164> <9482> <72FD> <9483> <8CB7> <9484> <58F2> <9485> <8CE0> <9486> <966A> <9487> <9019> <9488> <877F> endbfchar 100 beginbfchar <9489> <79E4> <948A> <77E7> <948B> <8429> <948C> <4F2F> <948D> <5265> <948E> <535A> <948F> <62CD> <9490> <67CF> <9491> <6CCA> <9492> <767D> <9493> <7B94> <9494> <7C95> <9495> <8236> <9496> <8584> <9497> <8FEB> <9498> <66DD> <9499> <6F20> <949A> <7206> <949B> <7E1B> <949C> <83AB> <949D> <99C1> <949E> <9EA6> <949F> <51FD> <94A0> <7BB1> <94A1> <7872> <94A2> <7BB8> <94A3> <8087> <94A4> <7B48> <94A5> <6AE8> <94A6> <5E61> <94A7> <808C> <94A8> <7551> <94A9> <7560> <94AA> <516B> <94AB> <9262> <94AC> <6E8C> <94AD> <767A> <94AE> <9197> <94AF> <9AEA> <94B0> <4F10> <94B1> <7F70> <94B2> <629C> <94B3> <7B4F> <94B4> <95A5> <94B5> <9CE9> <94B6> <567A> <94B7> <5859> <94B8> <86E4> <94B9> <96BC> <94BA> <4F34> <94BB> <5224> <94BC> <534A> <94BD> <53CD> <94BE> <53DB> <94BF> <5E06> <94C0> <642C> <94C1> <6591> <94C2> <677F> <94C3> <6C3E> <94C4> <6C4E> <94C5> <7248> <94C6> <72AF> <94C7> <73ED> <94C8> <7554> <94C9> <7E41> <94CA> <822C> <94CB> <85E9> <94CC> <8CA9> <94CD> <7BC4> <94CE> <91C6> <94CF> <7169> <94D0> <9812> <94D1> <98EF> <94D2> <633D> <94D3> <6669> <94D4> <756A> <94D5> <76E4> <94D6> <78D0> <94D7> <8543> <94D8> <86EE> <94D9> <532A> <94DA> <5351> <94DB> <5426> <94DC> <5983> <94DD> <5E87> <94DE> <5F7C> <94DF> <60B2> <94E0> <6249> <94E1> <6279> <94E2> <62AB> <94E3> <6590> <94E4> <6BD4> <94E5> <6CCC> <94E6> <75B2> <94E7> <76AE> <94E8> <7891> <94E9> <79D8> <94EA> <7DCB> <94EB> <7F77> <94EC> <80A5> endbfchar 100 beginbfchar <94ED> <88AB> <94EE> <8AB9> <94EF> <8CBB> <94F0> <907F> <94F1> <975E> <94F2> <98DB> <94F3> <6A0B> <94F4> <7C38> <94F5> <5099> <94F6> <5C3E> <94F7> <5FAE> <94F8> <6787> <94F9> <6BD8> <94FA> <7435> <94FB> <7709> <94FC> <7F8E> <9540> <9F3B> <9541> <67CA> <9542> <7A17> <9543> <5339> <9544> <758B> <9545> <9AED> <9546> <5F66> <9547> <819D> <9548> <83F1> <9549> <8098> <954A> <5F3C> <954B> <5FC5> <954C> <7562> <954D> <7B46> <954E> <903C> <954F> <6867> <9550> <59EB> <9551> <5A9B> <9552> <7D10> <9553> <767E> <9554> <8B2C> <9555> <4FF5> <9556> <5F6A> <9557> <6A19> <9558> <6C37> <9559> <6F02> <955A> <74E2> <955B> <7968> <955C> <8868> <955D> <8A55> <955E> <8C79> <955F> <5EDF> <9560> <63CF> <9561> <75C5> <9562> <79D2> <9563> <82D7> <9564> <9328> <9565> <92F2> <9566> <849C> <9567> <86ED> <9568> <9C2D> <9569> <54C1> <956A> <5F6C> <956B> <658C> <956C> <6D5C> <956D> <7015> <956E> <8CA7> <956F> <8CD3> <9570> <983B> <9571> <654F> <9572> <74F6> <9573> <4E0D> <9574> <4ED8> <9575> <57E0> <9576> <592B> <9577> <5A66> <9578> <5BCC> <9579> <51A8> <957A> <5E03> <957B> <5E9C> <957C> <6016> <957D> <6276> <957E> <6577> <9580> <65A7> <9581> <666E> <9582> <6D6E> <9583> <7236> <9584> <7B26> <9585> <8150> <9586> <819A> <9587> <8299> <9588> <8B5C> <9589> <8CA0> <958A> <8CE6> <958B> <8D74> <958C> <961C> <958D> <9644> <958E> <4FAE> <958F> <64AB> <9590> <6B66> <9591> <821E> <9592> <8461> <9593> <856A> <9594> <90E8> endbfchar 100 beginbfchar <9595> <5C01> <9596> <6953> <9597> <98A8> <9598> <847A> <9599> <8557> <959A> <4F0F> <959B> <526F> <959C> <5FA9> <959D> <5E45> <959E> <670D> <959F> <798F> <95A0> <8179> <95A1> <8907> <95A2> <8986> <95A3> <6DF5> <95A4> <5F17> <95A5> <6255> <95A6> <6CB8> <95A7> <4ECF> <95A8> <7269> <95A9> <9B92> <95AA> <5206> <95AB> <543B> <95AC> <5674> <95AD> <58B3> <95AE> <61A4> <95AF> <626E> <95B0> <711A> <95B1> <596E> <95B2> <7C89> <95B3> <7CDE> <95B4> <7D1B> <95B5> <96F0> <95B6> <6587> <95B7> <805E> <95B8> <4E19> <95B9> <4F75> <95BA> <5175> <95BB> <5840> <95BC> <5E63> <95BD> <5E73> <95BE> <5F0A> <95BF> <67C4> <95C0> <4E26> <95C1> <853D> <95C2> <9589> <95C3> <965B> <95C4> <7C73> <95C5> <9801> <95C6> <50FB> <95C7> <58C1> <95C8> <7656> <95C9> <78A7> <95CA> <5225> <95CB> <77A5> <95CC> <8511> <95CD> <7B86> <95CE> <504F> <95CF> <5909> <95D0> <7247> <95D1> <7BC7> <95D2> <7DE8> <95D3> <8FBA> <95D4> <8FD4> <95D5> <904D> <95D6> <4FBF> <95D7> <52C9> <95D8> <5A29> <95D9> <5F01> <95DA> <97AD> <95DB> <4FDD> <95DC> <8217> <95DD> <92EA> <95DE> <5703> <95DF> <6355> <95E0> <6B69> <95E1> <752B> <95E2> <88DC> <95E3> <8F14> <95E4> <7A42> <95E5> <52DF> <95E6> <5893> <95E7> <6155> <95E8> <620A> <95E9> <66AE> <95EA> <6BCD> <95EB> <7C3F> <95EC> <83E9> <95ED> <5023> <95EE> <4FF8> <95EF> <5305> <95F0> <5446> <95F1> <5831> <95F2> <5949> <95F3> <5B9D> <95F4> <5CF0> <95F5> <5CEF> <95F6> <5D29> <95F7> <5E96> <95F8> <62B1> endbfchar 100 beginbfchar <95F9> <6367> <95FA> <653E> <95FB> <65B9> <95FC> <670B> <9640> <6CD5> <9641> <6CE1> <9642> <70F9> <9643> <7832> <9644> <7E2B> <9645> <80DE> <9646> <82B3> <9647> <840C> <9648> <84EC> <9649> <8702> <964A> <8912> <964B> <8A2A> <964C> <8C4A> <964D> <90A6> <964E> <92D2> <964F> <98FD> <9650> <9CF3> <9651> <9D6C> <9652> <4E4F> <9653> <4EA1> <9654> <508D> <9655> <5256> <9656> <574A> <9657> <59A8> <9658> <5E3D> <965B> <623F> <965C> <66B4> <965D> <671B> <965E> <67D0> <965F> <68D2> <9660> <5192> <9661> <7D21> <9662> <80AA> <9663> <81A8> <9664> <8B00> <9665> <8C8C> <9666> <8CBF> <9667> <927E> <9668> <9632> <9669> <5420> <966A> <982C> <966B> <5317> <966C> <50D5> <966D> <535C> <966E> <58A8> <966F> <64B2> <9670> <6734> <9671> <7267> <9672> <7766> <9673> <7A46> <9674> <91E6> <9675> <52C3> <9676> <6CA1> <9677> <6B86> <9678> <5800> <9679> <5E4C> <967A> <5954> <967B> <672C> <967C> <7FFB> <967D> <51E1> <967E> <76C6> <9680> <6469> <9681> <78E8> <9682> <9B54> <9683> <9EBB> <9684> <57CB> <9685> <59B9> <9686> <6627> <9687> <679A> <9688> <6BCE> <9689> <54E9> <968A> <69D9> <968B> <5E55> <968C> <819C> <968D> <6795> <968E> <9BAA> <968F> <67FE> <9690> <9C52> <9691> <685D> <9692> <4EA6> <9693> <4FE3> <9694> <53C8> <9695> <62B9> <9696> <672B> <9697> <6CAB> <9698> <8FC4> <9699> <4FAD> <969A> <7E6D> <969B> <9EBF> <969C> <4E07> <969D> <6162> <969E> <6E80> <969F> <6F2B> <96A0> <8513> <96A1> <5473> <96A2> <672A> endbfchar 100 beginbfchar <96A3> <9B45> <96A4> <5DF3> <96A5> <7B95> <96A6> <5CAC> <96A7> <5BC6> <96A8> <871C> <96A9> <6E4A> <96AA> <84D1> <96AB> <7A14> <96AC> <8108> <96AD> <5999> <96AE> <7C8D> <96AF> <6C11> <96B0> <7720> <96B1> <52D9> <96B2> <5922> <96B3> <7121> <96B4> <725F> <96B5> <77DB> <96B6> <9727> <96B7> <9D61> <96B8> <690B> <96B9> <5A7F> <96BA> <5A18> <96BB> <51A5> <96BC> <540D> <96BD> <547D> <96BE> <660E> <96BF> <76DF> <96C0> <8FF7> <96C1> <9298> <96C2> <9CF4> <96C3> <59EA> <96C4> <725D> <96C5> <6EC5> <96C6> <514D> <96C7> <68C9> <96C8> <7DBF> <96C9> <7DEC> <96CA> <9762> <96CB> <9EBA> <96CC> <6478> <96CD> <6A21> <96CE> <8302> <96CF> <5984> <96D0> <5B5F> <96D1> <6BDB> <96D2> <731B> <96D3> <76F2> <96D4> <7DB2> <96D5> <8017> <96D6> <8499> <96D7> <5132> <96D8> <6728> <96D9> <9ED9> <96DA> <76EE> <96DB> <6762> <96DC> <52FF> <96DD> <9905> <96DE> <5C24> <96DF> <623B> <96E0> <7C7E> <96E1> <8CB0> <96E2> <554F> <96E3> <60B6> <96E4> <7D0B> <96E5> <9580> <96E6> <5301> <96E7> <4E5F> <96E8> <51B6> <96E9> <591C> <96EA> <723A> <96EB> <8036> <96EC> <91CE> <96ED> <5F25> <96EE> <77E2> <96EF> <5384> <96F0> <5F79> <96F1> <7D04> <96F2> <85AC> <96F3> <8A33> <96F4> <8E8D> <96F5> <9756> <96F6> <67F3> <96F7> <85AE> <96F8> <9453> <96F9> <6109> <96FA> <6108> <96FB> <6CB9> <96FC> <7652> <9740> <8AED> <9741> <8F38> <9742> <552F> <9743> <4F51> <9744> <512A> <9745> <52C7> <9746> <53CB> <9747> <5BA5> <9748> <5E7D> <9749> <60A0> endbfchar 100 beginbfchar <974A> <6182> <974B> <63D6> <974C> <6709> <974D> <67DA> <974E> <6E67> <974F> <6D8C> <9752> <7531> <9753> <7950> <9754> <88D5> <9755> <8A98> <9756> <904A> <9757> <9091> <9758> <90F5> <9759> <96C4> <975A> <878D> <975B> <5915> <975C> <4E88> <975D> <4F59> <975E> <4E0E> <975F> <8A89> <9760> <8F3F> <9761> <9810> <9762> <50AD> <9763> <5E7C> <9764> <5996> <9765> <5BB9> <9766> <5EB8> <9767> <63DA> <9768> <63FA> <9769> <64C1> <976A> <66DC> <976B> <694A> <976C> <69D8> <976D> <6D0B> <976E> <6EB6> <976F> <7194> <9770> <7528> <9771> <7AAF> <9772> <7F8A> <9773> <8000> <9774> <8449> <9775> <84C9> <9776> <8981> <9777> <8B21> <9778> <8E0A> <9779> <9065> <977A> <967D> <977B> <990A> <977C> <617E> <977D> <6291> <977E> <6B32> <9780> <6C83> <9781> <6D74> <9782> <7FCC> <9783> <7FFC> <9784> <6DC0> <9785> <7F85> <9786> <87BA> <9787> <88F8> <9788> <6765> <9789> <83B1> <978A> <983C> <978B> <96F7> <978C> <6D1B> <978D> <7D61> <978E> <843D> <978F> <916A> <9790> <4E71> <9791> <5375> <9792> <5D50> <9793> <6B04> <9794> <6FEB> <9795> <85CD> <9796> <862D> <9797> <89A7> <9798> <5229> <9799> <540F> <979A> <5C65> <979B> <674E> <979C> <68A8> <979D> <7406> <979E> <7483> <979F> <75E2> <97A0> <88CF> <97A1> <88E1> <97A2> <91CC> <97A3> <96E2> <97A4> <9678> <97A5> <5F8B> <97A6> <7387> <97A7> <7ACB> <97A8> <844E> <97A9> <63A0> <97AA> <7565> <97AB> <5289> <97AC> <6D41> <97AD> <6E9C> <97AE> <7409> <97AF> <7559> <97B0> <786B> endbfchar 100 beginbfchar <97B1> <7C92> <97B2> <9686> <97B3> <7ADC> <97B4> <9F8D> <97B5> <4FB6> <97B6> <616E> <97B7> <65C5> <97B8> <865C> <97B9> <4E86> <97BA> <4EAE> <97BB> <50DA> <97BC> <4E21> <97BD> <51CC> <97BE> <5BEE> <97BF> <6599> <97C0> <6881> <97C1> <6DBC> <97C2> <731F> <97C3> <7642> <97C4> <77AD> <97C5> <7A1C> <97C6> <7CE7> <97C7> <826F> <97C8> <8AD2> <97C9> <907C> <97CA> <91CF> <97CB> <9675> <97CC> <9818> <97CD> <529B> <97CE> <7DD1> <97CF> <502B> <97D0> <5398> <97D1> <6797> <97D2> <6DCB> <97D3> <71D0> <97D4> <7433> <97D5> <81E8> <97D6> <8F2A> <97D7> <96A3> <97D8> <9C57> <97D9> <9E9F> <97DA> <7460> <97DB> <5841> <97DC> <6D99> <97DD> <7D2F> <97DE> <985E> <97DF> <4EE4> <97E0> <4F36> <97E1> <4F8B> <97E2> <51B7> <97E3> <52B1> <97E4> <5DBA> <97E5> <601C> <97E6> <73B2> <97E7> <793C> <97E8> <82D3> <97E9> <9234> <97EA> <96B7> <97EB> <96F6> <97EC> <970A> <97ED> <9E97> <97EE> <9F62> <97EF> <66A6> <97F0> <6B74> <97F1> <5217> <97F2> <52A3> <97F3> <70C8> <97F4> <88C2> <97F5> <5EC9> <97F6> <604B> <97F7> <6190> <97F8> <6F23> <97F9> <7149> <97FA> <7C3E> <97FB> <7DF4> <97FC> <806F> <9840> <84EE> <9841> <9023> <9842> <932C> <9843> <5442> <9844> <9B6F> <9845> <6AD3> <9846> <7089> <9847> <8CC2> <9848> <8DEF> <9849> <9732> <984A> <52B4> <984B> <5A41> <984C> <5ECA> <984D> <5F04> <984E> <6717> <984F> <697C> <9850> <6994> <9851> <6D6A> <9852> <6F0F> <9853> <7262> <9854> <72FC> <9855> <7BED> <9856> <8001> <9857> <807E> endbfchar 100 beginbfchar <9858> <874B> <9859> <90CE> <985A> <516D> <985B> <9E93> <985C> <7984> <985D> <808B> <985E> <9332> <985F> <8AD6> <9860> <502D> <9861> <548C> <9862> <8A71> <9863> <6B6A> <9864> <8CC4> <9865> <8107> <9866> <60D1> <9867> <67A0> <9868> <9DF2> <9869> <4E99> <986A> <4E98> <986B> <9C10> <986C> <8A6B> <986D> <85C1> <986E> <8568> <986F> <6900> <9870> <6E7E> <9871> <7897> <9872> <8155> <989F> <5F0C> <98A0> <4E10> <98A1> <4E15> <98A2> <4E2A> <98A3> <4E31> <98A4> <4E36> <98A5> <4E3C> <98A6> <4E3F> <98A7> <4E42> <98A8> <4E56> <98A9> <4E58> <98AA> <4E82> <98AB> <4E85> <98AC> <8C6B> <98AD> <4E8A> <98AE> <8212> <98AF> <5F0D> <98B0> <4E8E> <98B4> <4EA2> <98B5> <4EB0> <98B6> <4EB3> <98B7> <4EB6> <98B8> <4ECE> <98B9> <4ECD> <98BA> <4EC4> <98BB> <4EC6> <98BC> <4EC2> <98BD> <4ED7> <98BE> <4EDE> <98BF> <4EED> <98C0> <4EDF> <98C1> <4EF7> <98C2> <4F09> <98C3> <4F5A> <98C4> <4F30> <98C5> <4F5B> <98C6> <4F5D> <98C7> <4F57> <98C8> <4F47> <98C9> <4F76> <98CA> <4F88> <98CB> <4F8F> <98CC> <4F98> <98CD> <4F7B> <98CE> <4F69> <98CF> <4F70> <98D0> <4F91> <98D1> <4F6F> <98D2> <4F86> <98D3> <4F96> <98D4> <5118> <98D5> <4FD4> <98D6> <4FDF> <98D7> <4FCE> <98D8> <4FD8> <98D9> <4FDB> <98DA> <4FD1> <98DB> <4FDA> <98DC> <4FD0> <98DF> <501A> <98E0> <5028> <98E1> <5014> <98E2> <502A> <98E3> <5025> <98E4> <5005> <98E5> <4F1C> <98E6> <4FF6> <98E7> <5021> <98E8> <5029> <98E9> <502C> <98EA> <4FFE> <98EB> <4FEF> <98EC> <5011> endbfchar 100 beginbfchar <98ED> <5006> <98EE> <5043> <98EF> <5047> <98F0> <6703> <98F1> <5055> <98F2> <5050> <98F3> <5048> <98F4> <505A> <98F5> <5056> <98F6> <506C> <98F7> <5078> <98F8> <5080> <98F9> <509A> <98FA> <5085> <98FB> <50B4> <98FC> <50B2> <9942> <50B3> <9943> <50C2> <9944> <50D6> <9945> <50DE> <9946> <50E5> <9947> <50ED> <9948> <50E3> <9949> <50EE> <994A> <50F9> <994B> <50F5> <994C> <5109> <994F> <5116> <9950> <5115> <9951> <5114> <9952> <511A> <9953> <5121> <9954> <513A> <9955> <5137> <9956> <513C> <9957> <513B> <995A> <5152> <995B> <514C> <995C> <5154> <995D> <5162> <995E> <7AF8> <9961> <516E> <9962> <5180> <9963> <5182> <9964> <56D8> <9965> <518C> <9966> <5189> <9967> <518F> <9968> <5191> <9969> <5193> <996C> <51A4> <996D> <51A6> <996E> <51A2> <9972> <51B3> <9975> <51B0> <9976> <51B5> <9977> <51BD> <9978> <51C5> <9979> <51C9> <997A> <51DB> <997B> <51E0> <997C> <8655> <997D> <51E9> <997E> <51ED> <9980> <51F0> <9981> <51F5> <9982> <51FE> <9983> <5204> <9984> <520B> <9985> <5214> <9986> <520E> <9987> <5227> <9988> <522A> <9989> <522E> <998A> <5233> <998B> <5239> <998C> <524F> <998D> <5244> <9990> <525E> <9991> <5254> <9992> <526A> <9993> <5274> <9994> <5269> <9995> <5273> <9996> <527F> <9997> <527D> <9998> <528D> <9999> <5294> <999A> <5292> <999B> <5271> <999C> <5288> <999D> <5291> <999E> <8FA8> <999F> <8FA7> <99A2> <52BC> <99A3> <52B5> <99A4> <52C1> <99A5> <52CD> <99A6> <52D7> <99A7> <52DE> endbfchar 100 beginbfchar <99A8> <52E3> <99A9> <52E6> <99AA> <98ED> <99AB> <52E0> <99AC> <52F3> <99AD> <52F5> <99B0> <5306> <99B1> <5308> <99B2> <7538> <99B3> <530D> <99B4> <5310> <99B5> <530F> <99B6> <5315> <99B7> <531A> <99B8> <5323> <99B9> <532F> <99BA> <5331> <99BB> <5333> <99BC> <5338> <99BD> <5340> <99BE> <5346> <99BF> <5345> <99C0> <4E17> <99C1> <5349> <99C2> <534D> <99C3> <51D6> <99C4> <535E> <99C5> <5369> <99C6> <536E> <99C7> <5918> <99C8> <537B> <99C9> <5377> <99CA> <5382> <99CB> <5396> <99CC> <53A0> <99CD> <53A6> <99CE> <53A5> <99CF> <53AE> <99D0> <53B0> <99D1> <53B6> <99D2> <53C3> <99D3> <7C12> <99D4> <96D9> <99D5> <53DF> <99D6> <66FC> <99D7> <71EE> <99D8> <53EE> <99D9> <53E8> <99DA> <53ED> <99DB> <53FA> <99DC> <5401> <99DD> <543D> <99DE> <5440> <99E1> <543C> <99E2> <542E> <99E3> <5436> <99E4> <5429> <99E5> <541D> <99E6> <544E> <99E7> <548F> <99E8> <5475> <99E9> <548E> <99EA> <545F> <99EB> <5471> <99EC> <5477> <99ED> <5470> <99EE> <5492> <99EF> <547B> <99F0> <5480> <99F1> <5476> <99F2> <5484> <99F3> <5490> <99F4> <5486> <99F5> <54C7> <99F6> <54A2> <99F7> <54B8> <99F8> <54A5> <99F9> <54AC> <99FA> <54C4> <99FB> <54C8> <99FC> <54A8> <9A40> <54AB> <9A41> <54C2> <9A42> <54A4> <9A43> <54BE> <9A44> <54BC> <9A45> <54D8> <9A48> <550F> <9A49> <5514> <9A4A> <54FD> <9A4B> <54EE> <9A4C> <54ED> <9A4D> <54FA> <9A4E> <54E2> <9A4F> <5539> <9A50> <5540> <9A51> <5563> <9A52> <554C> <9A53> <552E> <9A54> <555C> endbfchar 100 beginbfchar <9A55> <5545> <9A58> <5538> <9A59> <5533> <9A5A> <555D> <9A5B> <5599> <9A5C> <5580> <9A5D> <54AF> <9A5E> <558A> <9A5F> <559F> <9A60> <557B> <9A61> <557E> <9A62> <5598> <9A63> <559E> <9A64> <55AE> <9A65> <557C> <9A66> <5583> <9A67> <55A9> <9A68> <5587> <9A69> <55A8> <9A6A> <55DA> <9A6B> <55C5> <9A6C> <55DF> <9A6D> <55C4> <9A6E> <55DC> <9A6F> <55E4> <9A70> <55D4> <9A71> <5614> <9A72> <55F7> <9A73> <5616> <9A74> <55FE> <9A75> <55FD> <9A76> <561B> <9A77> <55F9> <9A78> <564E> <9A79> <5650> <9A7A> <71DF> <9A7B> <5634> <9A7C> <5636> <9A7D> <5632> <9A7E> <5638> <9A80> <566B> <9A81> <5664> <9A82> <562F> <9A83> <566C> <9A84> <566A> <9A85> <5686> <9A86> <5680> <9A87> <568A> <9A88> <56A0> <9A89> <5694> <9A8A> <568F> <9A8B> <56A5> <9A8C> <56AE> <9A8D> <56B6> <9A8E> <56B4> <9A8F> <56C2> <9A90> <56BC> <9A91> <56C1> <9A92> <56C3> <9A93> <56C0> <9A94> <56C8> <9A95> <56CE> <9A96> <56D1> <9A97> <56D3> <9A98> <56D7> <9A99> <56EE> <9A9A> <56F9> <9A9B> <5700> <9A9C> <56FF> <9A9D> <5704> <9A9E> <5709> <9A9F> <5708> <9AA0> <570B> <9AA1> <570D> <9AA2> <5713> <9AA3> <5718> <9AA4> <5716> <9AA5> <55C7> <9AA6> <571C> <9AA7> <5726> <9AAA> <574E> <9AAB> <573B> <9AAC> <5740> <9AAD> <574F> <9AAE> <5769> <9AAF> <57C0> <9AB0> <5788> <9AB1> <5761> <9AB2> <577F> <9AB3> <5789> <9AB4> <5793> <9AB5> <57A0> <9AB6> <57B3> <9AB7> <57A4> <9AB8> <57AA> <9AB9> <57B0> <9ABA> <57C3> <9ABB> <57C6> <9ABC> <57D4> <9ABF> <580A> endbfchar 100 beginbfchar <9AC0> <57D6> <9AC1> <57E3> <9AC2> <580B> <9AC3> <5819> <9AC4> <581D> <9AC5> <5872> <9AC6> <5821> <9AC7> <5862> <9AC8> <584B> <9AC9> <5870> <9ACA> <6BC0> <9ACB> <5852> <9ACC> <583D> <9ACD> <5879> <9ACE> <5885> <9ACF> <58B9> <9AD0> <589F> <9AD1> <58AB> <9AD2> <58BA> <9AD3> <58DE> <9AD4> <58BB> <9AD5> <58B8> <9AD6> <58AE> <9AD7> <58C5> <9AD8> <58D3> <9AD9> <58D1> <9ADA> <58D7> <9ADB> <58D9> <9ADC> <58D8> <9ADD> <58E5> <9ADE> <58DC> <9ADF> <58E4> <9AE0> <58DF> <9AE1> <58EF> <9AE2> <58FA> <9AE3> <58F9> <9AE7> <5902> <9AE8> <590A> <9AE9> <5910> <9AEA> <591B> <9AEB> <68A6> <9AEC> <5925> <9AEF> <5932> <9AF0> <5938> <9AF1> <593E> <9AF2> <7AD2> <9AF3> <5955> <9AF4> <5950> <9AF5> <594E> <9AF6> <595A> <9AF7> <5958> <9AF8> <5962> <9AF9> <5960> <9AFA> <5967> <9AFB> <596C> <9AFC> <5969> <9B40> <5978> <9B41> <5981> <9B42> <599D> <9B43> <4F5E> <9B44> <4FAB> <9B45> <59A3> <9B46> <59B2> <9B47> <59C6> <9B48> <59E8> <9B49> <59DC> <9B4A> <598D> <9B4D> <5A25> <9B4E> <5A1F> <9B4F> <5A11> <9B50> <5A1C> <9B51> <5A09> <9B52> <5A1A> <9B53> <5A40> <9B54> <5A6C> <9B55> <5A49> <9B58> <5A62> <9B59> <5A6A> <9B5A> <5A9A> <9B5B> <5ABC> <9B5C> <5ABE> <9B5D> <5ACB> <9B5E> <5AC2> <9B5F> <5ABD> <9B60> <5AE3> <9B61> <5AD7> <9B62> <5AE6> <9B63> <5AE9> <9B64> <5AD6> <9B67> <5B0C> <9B68> <5B0B> <9B69> <5B16> <9B6A> <5B32> <9B6B> <5AD0> <9B6C> <5B2A> <9B6D> <5B36> <9B6E> <5B3E> <9B6F> <5B43> <9B70> <5B45> <9B71> <5B40> endbfchar 100 beginbfchar <9B72> <5B51> <9B73> <5B55> <9B76> <5B65> <9B77> <5B69> <9B78> <5B70> <9B79> <5B73> <9B7A> <5B75> <9B7B> <5B78> <9B7C> <6588> <9B7D> <5B7A> <9B7E> <5B80> <9B80> <5B83> <9B81> <5BA6> <9B82> <5BB8> <9B83> <5BC3> <9B84> <5BC7> <9B85> <5BC9> <9B86> <5BD4> <9B87> <5BD0> <9B88> <5BE4> <9B89> <5BE6> <9B8A> <5BE2> <9B8B> <5BDE> <9B8C> <5BE5> <9B8D> <5BEB> <9B8E> <5BF0> <9B8F> <5BF6> <9B90> <5BF3> <9B91> <5C05> <9B94> <5C0D> <9B95> <5C13> <9B96> <5C20> <9B97> <5C22> <9B98> <5C28> <9B9B> <5C41> <9B9C> <5C46> <9B9D> <5C4E> <9B9E> <5C53> <9B9F> <5C50> <9BA0> <5C4F> <9BA1> <5B71> <9BA2> <5C6C> <9BA3> <5C6E> <9BA4> <4E62> <9BA5> <5C76> <9BA6> <5C79> <9BA7> <5C8C> <9BA8> <5C91> <9BA9> <5C94> <9BAA> <599B> <9BAB> <5CAB> <9BAC> <5CBB> <9BAD> <5CB6> <9BAE> <5CBC> <9BAF> <5CB7> <9BB0> <5CC5> <9BB1> <5CBE> <9BB2> <5CC7> <9BB3> <5CD9> <9BB4> <5CE9> <9BB5> <5CFD> <9BB6> <5CFA> <9BB7> <5CED> <9BB8> <5D8C> <9BB9> <5CEA> <9BBA> <5D0B> <9BBB> <5D15> <9BBC> <5D17> <9BBD> <5D5C> <9BBE> <5D1F> <9BBF> <5D1B> <9BC0> <5D11> <9BC1> <5D14> <9BC2> <5D22> <9BC3> <5D1A> <9BC4> <5D19> <9BC5> <5D18> <9BC6> <5D4C> <9BC7> <5D52> <9BC8> <5D4E> <9BC9> <5D4B> <9BCA> <5D6C> <9BCB> <5D73> <9BCC> <5D76> <9BCD> <5D87> <9BCE> <5D84> <9BCF> <5D82> <9BD0> <5DA2> <9BD1> <5D9D> <9BD2> <5DAC> <9BD3> <5DAE> <9BD4> <5DBD> <9BD5> <5D90> <9BD6> <5DB7> <9BD7> <5DBC> <9BD8> <5DC9> <9BD9> <5DCD> <9BDA> <5DD3> <9BDB> <5DD2> <9BDC> <5DD6> endbfchar 100 beginbfchar <9BDD> <5DDB> <9BDE> <5DEB> <9BDF> <5DF2> <9BE0> <5DF5> <9BE1> <5E0B> <9BE2> <5E1A> <9BE3> <5E19> <9BE4> <5E11> <9BE5> <5E1B> <9BE8> <5E44> <9BE9> <5E43> <9BEA> <5E40> <9BEB> <5E4E> <9BEC> <5E57> <9BED> <5E54> <9BEE> <5E5F> <9BEF> <5E62> <9BF0> <5E64> <9BF1> <5E47> <9BF4> <5E7A> <9BF5> <9EBC> <9BF6> <5E7F> <9BF7> <5EA0> <9BFA> <5EC8> <9BFB> <5ED0> <9BFC> <5ECF> <9C40> <5ED6> <9C41> <5EE3> <9C42> <5EDD> <9C45> <5EE2> <9C46> <5EE1> <9C49> <5EEC> <9C4A> <5EF1> <9C4B> <5EF3> <9C4C> <5EF0> <9C4D> <5EF4> <9C4E> <5EF8> <9C4F> <5EFE> <9C50> <5F03> <9C51> <5F09> <9C52> <5F5D> <9C53> <5F5C> <9C54> <5F0B> <9C55> <5F11> <9C56> <5F16> <9C57> <5F29> <9C58> <5F2D> <9C59> <5F38> <9C5A> <5F41> <9C5B> <5F48> <9C5C> <5F4C> <9C5D> <5F4E> <9C5E> <5F2F> <9C5F> <5F51> <9C62> <5F59> <9C63> <5F61> <9C64> <5F6D> <9C65> <5F73> <9C66> <5F77> <9C67> <5F83> <9C68> <5F82> <9C69> <5F7F> <9C6A> <5F8A> <9C6B> <5F88> <9C6C> <5F91> <9C6D> <5F87> <9C6E> <5F9E> <9C6F> <5F99> <9C70> <5F98> <9C71> <5FA0> <9C72> <5FA8> <9C73> <5FAD> <9C74> <5FBC> <9C75> <5FD6> <9C76> <5FFB> <9C77> <5FE4> <9C78> <5FF8> <9C79> <5FF1> <9C7A> <5FDD> <9C7B> <60B3> <9C7C> <5FFF> <9C7D> <6021> <9C7E> <6060> <9C80> <6019> <9C81> <6010> <9C82> <6029> <9C83> <600E> <9C84> <6031> <9C85> <601B> <9C86> <6015> <9C87> <602B> <9C88> <6026> <9C89> <600F> <9C8A> <603A> <9C8B> <605A> <9C8C> <6041> <9C8D> <606A> <9C8E> <6077> <9C8F> <605F> <9C90> <604A> endbfchar 100 beginbfchar <9C91> <6046> <9C92> <604D> <9C93> <6063> <9C94> <6043> <9C95> <6064> <9C96> <6042> <9C97> <606C> <9C98> <606B> <9C99> <6059> <9C9A> <6081> <9C9B> <608D> <9C9C> <60E7> <9C9D> <6083> <9C9E> <609A> <9C9F> <6084> <9CA0> <609B> <9CA3> <6092> <9CA4> <60A7> <9CA5> <608B> <9CA6> <60E1> <9CA7> <60B8> <9CA8> <60E0> <9CA9> <60D3> <9CAA> <60B4> <9CAB> <5FF0> <9CAC> <60BD> <9CAD> <60C6> <9CAE> <60B5> <9CAF> <60D8> <9CB0> <614D> <9CB1> <6115> <9CB2> <6106> <9CB5> <6100> <9CB6> <60F4> <9CB7> <60FA> <9CB8> <6103> <9CB9> <6121> <9CBA> <60FB> <9CBB> <60F1> <9CBE> <6147> <9CBF> <613E> <9CC0> <6128> <9CC1> <6127> <9CC2> <614A> <9CC3> <613F> <9CC4> <613C> <9CC5> <612C> <9CC6> <6134> <9CC7> <613D> <9CC8> <6142> <9CC9> <6144> <9CCA> <6173> <9CCB> <6177> <9CCF> <616B> <9CD0> <6174> <9CD1> <616F> <9CD2> <6165> <9CD3> <6171> <9CD4> <615F> <9CD5> <615D> <9CD6> <6153> <9CD7> <6175> <9CD8> <6199> <9CD9> <6196> <9CDA> <6187> <9CDB> <61AC> <9CDC> <6194> <9CDD> <619A> <9CDE> <618A> <9CDF> <6191> <9CE0> <61AB> <9CE1> <61AE> <9CE2> <61CC> <9CE3> <61CA> <9CE4> <61C9> <9CE5> <61F7> <9CE6> <61C8> <9CE7> <61C3> <9CE8> <61C6> <9CE9> <61BA> <9CEA> <61CB> <9CEB> <7F79> <9CEC> <61CD> <9CED> <61E6> <9CEE> <61E3> <9CEF> <61F6> <9CF0> <61FA> <9CF1> <61F4> <9CF2> <61FF> <9CF3> <61FD> <9CF4> <61FC> <9CF5> <61FE> <9CF6> <6200> <9CF9> <620D> <9CFA> <620C> <9CFB> <6214> <9CFC> <621B> <9D40> <621E> <9D41> <6221> <9D42> <622A> endbfchar 100 beginbfchar <9D43> <622E> <9D44> <6230> <9D47> <6241> <9D48> <624E> <9D49> <625E> <9D4A> <6263> <9D4B> <625B> <9D4C> <6260> <9D4D> <6268> <9D4E> <627C> <9D4F> <6282> <9D50> <6289> <9D51> <627E> <9D54> <6296> <9D55> <62D4> <9D56> <6283> <9D57> <6294> <9D58> <62D7> <9D59> <62D1> <9D5A> <62BB> <9D5B> <62CF> <9D5C> <62FF> <9D5D> <62C6> <9D5E> <64D4> <9D5F> <62C8> <9D60> <62DC> <9D61> <62CC> <9D62> <62CA> <9D63> <62C2> <9D64> <62C7> <9D65> <629B> <9D66> <62C9> <9D67> <630C> <9D68> <62EE> <9D69> <62F1> <9D6A> <6327> <9D6B> <6302> <9D6C> <6308> <9D6D> <62EF> <9D6E> <62F5> <9D6F> <6350> <9D70> <633E> <9D71> <634D> <9D72> <641C> <9D73> <634F> <9D74> <6396> <9D75> <638E> <9D76> <6380> <9D77> <63AB> <9D78> <6376> <9D79> <63A3> <9D7A> <638F> <9D7B> <6389> <9D7C> <639F> <9D7D> <63B5> <9D7E> <636B> <9D80> <6369> <9D81> <63BE> <9D82> <63E9> <9D83> <63C0> <9D84> <63C6> <9D85> <63E3> <9D86> <63C9> <9D87> <63D2> <9D88> <63F6> <9D89> <63C4> <9D8A> <6416> <9D8B> <6434> <9D8C> <6406> <9D8D> <6413> <9D8E> <6426> <9D8F> <6436> <9D90> <651D> <9D91> <6417> <9D92> <6428> <9D93> <640F> <9D94> <6467> <9D95> <646F> <9D96> <6476> <9D97> <644E> <9D98> <652A> <9D99> <6495> <9D9A> <6493> <9D9B> <64A5> <9D9C> <64A9> <9D9D> <6488> <9D9E> <64BC> <9D9F> <64DA> <9DA0> <64D2> <9DA1> <64C5> <9DA2> <64C7> <9DA3> <64BB> <9DA4> <64D8> <9DA5> <64C2> <9DA6> <64F1> <9DA7> <64E7> <9DA8> <8209> <9DAB> <62AC> <9DAC> <64E3> <9DAD> <64EF> endbfchar 100 beginbfchar <9DAE> <652C> <9DAF> <64F6> <9DB0> <64F4> <9DB1> <64F2> <9DB2> <64FA> <9DB3> <6500> <9DB4> <64FD> <9DB5> <6518> <9DB6> <651C> <9DB7> <6505> <9DB8> <6524> <9DB9> <6523> <9DBA> <652B> <9DBD> <6537> <9DBE> <6536> <9DBF> <6538> <9DC0> <754B> <9DC1> <6548> <9DC2> <6556> <9DC3> <6555> <9DC4> <654D> <9DC5> <6558> <9DC6> <655E> <9DC7> <655D> <9DC8> <6572> <9DC9> <6578> <9DCC> <8B8A> <9DCD> <659B> <9DCE> <659F> <9DCF> <65AB> <9DD0> <65B7> <9DD1> <65C3> <9DD2> <65C6> <9DD3> <65C1> <9DD4> <65C4> <9DD5> <65CC> <9DD6> <65D2> <9DD7> <65DB> <9DD8> <65D9> <9DDB> <65F1> <9DDC> <6772> <9DDD> <660A> <9DDE> <6603> <9DDF> <65FB> <9DE0> <6773> <9DE3> <6634> <9DE4> <661C> <9DE5> <664F> <9DE6> <6644> <9DE7> <6649> <9DE8> <6641> <9DE9> <665E> <9DEA> <665D> <9DEB> <6664> <9DEE> <665F> <9DEF> <6662> <9DF0> <6670> <9DF1> <6683> <9DF2> <6688> <9DF3> <668E> <9DF4> <6689> <9DF5> <6684> <9DF6> <6698> <9DF7> <669D> <9DF8> <66C1> <9DF9> <66B9> <9DFA> <66C9> <9DFB> <66BE> <9DFC> <66BC> <9E40> <66C4> <9E41> <66B8> <9E42> <66D6> <9E43> <66DA> <9E44> <66E0> <9E45> <663F> <9E46> <66E6> <9E47> <66E9> <9E48> <66F0> <9E49> <66F5> <9E4A> <66F7> <9E4B> <670F> <9E4C> <6716> <9E4D> <671E> <9E50> <9738> <9E51> <672E> <9E52> <673F> <9E53> <6736> <9E54> <6741> <9E55> <6738> <9E56> <6737> <9E57> <6746> <9E58> <675E> <9E59> <6760> <9E5A> <6759> <9E5D> <6789> <9E5E> <6770> <9E5F> <67A9> <9E60> <677C> <9E61> <676A> <9E62> <678C> endbfchar 100 beginbfchar <9E63> <678B> <9E64> <67A6> <9E65> <67A1> <9E66> <6785> <9E67> <67B7> <9E68> <67EF> <9E69> <67B4> <9E6A> <67EC> <9E6B> <67B3> <9E6C> <67E9> <9E6D> <67B8> <9E6E> <67E4> <9E6F> <67DE> <9E70> <67DD> <9E71> <67E2> <9E72> <67EE> <9E73> <67B9> <9E74> <67CE> <9E75> <67C6> <9E76> <67E7> <9E77> <6A9C> <9E78> <681E> <9E79> <6846> <9E7A> <6829> <9E7B> <6840> <9E7C> <684D> <9E7D> <6832> <9E7E> <684E> <9E80> <68B3> <9E81> <682B> <9E82> <6859> <9E83> <6863> <9E84> <6877> <9E85> <687F> <9E86> <689F> <9E87> <688F> <9E88> <68AD> <9E89> <6894> <9E8A> <689D> <9E8B> <689B> <9E8C> <6883> <9E8D> <6AAE> <9E8E> <68B9> <9E8F> <6874> <9E90> <68B5> <9E91> <68A0> <9E92> <68BA> <9E93> <690F> <9E94> <688D> <9E95> <687E> <9E96> <6901> <9E97> <68CA> <9E98> <6908> <9E99> <68D8> <9E9A> <6922> <9E9B> <6926> <9E9C> <68E1> <9E9D> <690C> <9E9E> <68CD> <9E9F> <68D4> <9EA0> <68E7> <9EA1> <68D5> <9EA2> <6936> <9EA3> <6912> <9EA4> <6904> <9EA5> <68D7> <9EA6> <68E3> <9EA7> <6925> <9EA8> <68F9> <9EA9> <68E0> <9EAA> <68EF> <9EAB> <6928> <9EAC> <692A> <9EAD> <691A> <9EAE> <6923> <9EAF> <6921> <9EB0> <68C6> <9EB1> <6979> <9EB2> <6977> <9EB3> <695C> <9EB4> <6978> <9EB5> <696B> <9EB6> <6954> <9EB7> <697E> <9EB8> <696E> <9EB9> <6939> <9EBA> <6974> <9EBB> <693D> <9EBC> <6959> <9EBD> <6930> <9EBE> <6961> <9EBF> <695E> <9EC0> <695D> <9EC1> <6981> <9EC2> <696A> <9EC3> <69B2> <9EC4> <69AE> <9EC5> <69D0> <9EC6> <69BF> <9EC7> <69C1> endbfchar 100 beginbfchar <9EC8> <69D3> <9EC9> <69BE> <9ECA> <69CE> <9ECB> <5BE8> <9ECC> <69CA> <9ECD> <69DD> <9ECE> <69BB> <9ECF> <69C3> <9ED0> <69A7> <9ED1> <6A2E> <9ED2> <6991> <9ED3> <69A0> <9ED4> <699C> <9ED5> <6995> <9ED6> <69B4> <9ED7> <69DE> <9ED8> <69E8> <9ED9> <6A02> <9EDA> <6A1B> <9EDB> <69FF> <9EDC> <6B0A> <9EDD> <69F9> <9EDE> <69F2> <9EDF> <69E7> <9EE0> <6A05> <9EE1> <69B1> <9EE2> <6A1E> <9EE3> <69ED> <9EE4> <6A14> <9EE5> <69EB> <9EE6> <6A0A> <9EE7> <6A12> <9EE8> <6AC1> <9EE9> <6A23> <9EEA> <6A13> <9EEB> <6A44> <9EEC> <6A0C> <9EED> <6A72> <9EEE> <6A36> <9EEF> <6A78> <9EF0> <6A47> <9EF1> <6A62> <9EF2> <6A59> <9EF3> <6A66> <9EF4> <6A48> <9EF5> <6A38> <9EF6> <6A22> <9EF7> <6A90> <9EF8> <6A8D> <9EF9> <6AA0> <9EFA> <6A84> <9F40> <6A97> <9F41> <8617> <9F42> <6ABB> <9F43> <6AC3> <9F44> <6AC2> <9F45> <6AB8> <9F46> <6AB3> <9F47> <6AAC> <9F48> <6ADE> <9F49> <6AD1> <9F4A> <6ADF> <9F4B> <6AAA> <9F4C> <6ADA> <9F4D> <6AEA> <9F4E> <6AFB> <9F4F> <6B05> <9F50> <8616> <9F51> <6AFA> <9F52> <6B12> <9F53> <6B16> <9F54> <9B31> <9F55> <6B1F> <9F56> <6B38> <9F57> <6B37> <9F58> <76DC> <9F59> <6B39> <9F5A> <98EE> <9F5B> <6B47> <9F5C> <6B43> <9F5D> <6B49> <9F5E> <6B50> <9F5F> <6B59> <9F60> <6B54> <9F61> <6B5B> <9F62> <6B5F> <9F63> <6B61> <9F68> <6B84> <9F69> <6B83> <9F6A> <6B8D> <9F6B> <6B98> <9F6C> <6B95> <9F6D> <6B9E> <9F6E> <6BA4> <9F71> <6BAF> <9F72> <6BB2> <9F73> <6BB1> <9F74> <6BB3> <9F75> <6BB7> <9F76> <6BBC> endbfchar 100 beginbfchar <9F77> <6BC6> <9F78> <6BCB> <9F79> <6BD3> <9F7A> <6BDF> <9F7B> <6BEC> <9F7C> <6BEB> <9F7D> <6BF3> <9F7E> <6BEF> <9F80> <9EBE> <9F81> <6C08> <9F84> <6C1B> <9F85> <6C24> <9F86> <6C23> <9F87> <6C5E> <9F88> <6C55> <9F89> <6C62> <9F8A> <6C6A> <9F8B> <6C82> <9F8C> <6C8D> <9F8D> <6C9A> <9F8E> <6C81> <9F8F> <6C9B> <9F90> <6C7E> <9F91> <6C68> <9F92> <6C73> <9F93> <6C92> <9F94> <6C90> <9F95> <6CC4> <9F96> <6CF1> <9F97> <6CD3> <9F98> <6CBD> <9F99> <6CD7> <9F9A> <6CC5> <9F9B> <6CDD> <9F9C> <6CAE> <9F9D> <6CB1> <9F9E> <6CBE> <9F9F> <6CBA> <9FA0> <6CDB> <9FA1> <6CEF> <9FA2> <6CD9> <9FA3> <6CEA> <9FA4> <6D1F> <9FA5> <884D> <9FA6> <6D36> <9FA7> <6D2B> <9FA8> <6D3D> <9FA9> <6D38> <9FAA> <6D19> <9FAB> <6D35> <9FAC> <6D33> <9FAD> <6D12> <9FAE> <6D0C> <9FAF> <6D63> <9FB0> <6D93> <9FB1> <6D64> <9FB2> <6D5A> <9FB3> <6D79> <9FB4> <6D59> <9FB5> <6D8E> <9FB6> <6D95> <9FB7> <6FE4> <9FB8> <6D85> <9FB9> <6DF9> <9FBA> <6E15> <9FBB> <6E0A> <9FBC> <6DB5> <9FBD> <6DC7> <9FBE> <6DE6> <9FBF> <6DB8> <9FC0> <6DC6> <9FC1> <6DEC> <9FC2> <6DDE> <9FC3> <6DCC> <9FC4> <6DE8> <9FC5> <6DD2> <9FC6> <6DC5> <9FC7> <6DFA> <9FC8> <6DD9> <9FC9> <6DE4> <9FCA> <6DD5> <9FCB> <6DEA> <9FCC> <6DEE> <9FCD> <6E2D> <9FCE> <6E6E> <9FCF> <6E2E> <9FD0> <6E19> <9FD1> <6E72> <9FD2> <6E5F> <9FD3> <6E3E> <9FD4> <6E23> <9FD5> <6E6B> <9FD6> <6E2B> <9FD7> <6E76> <9FD8> <6E4D> <9FD9> <6E1F> <9FDA> <6E43> <9FDB> <6E3A> <9FDC> <6E4E> <9FDD> <6E24> endbfchar 100 beginbfchar <9FDE> <6EFF> <9FDF> <6E1D> <9FE0> <6E38> <9FE1> <6E82> <9FE2> <6EAA> <9FE3> <6E98> <9FE4> <6EC9> <9FE5> <6EB7> <9FE6> <6ED3> <9FE7> <6EBD> <9FE8> <6EAF> <9FE9> <6EC4> <9FEA> <6EB2> <9FED> <6E8F> <9FEE> <6EA5> <9FEF> <6EC2> <9FF0> <6E9F> <9FF1> <6F41> <9FF2> <6F11> <9FF3> <704C> <9FF4> <6EEC> <9FF5> <6EF8> <9FF6> <6EFE> <9FF7> <6F3F> <9FF8> <6EF2> <9FF9> <6F31> <9FFA> <6EEF> <9FFB> <6F32> <9FFC> <6ECC> <E040> <6F3E> <E041> <6F13> <E042> <6EF7> <E043> <6F86> <E044> <6F7A> <E045> <6F78> <E046> <6F81> <E047> <6F80> <E048> <6F6F> <E049> <6F5B> <E04A> <6FF3> <E04B> <6F6D> <E04C> <6F82> <E04D> <6F7C> <E04E> <6F58> <E04F> <6F8E> <E050> <6F91> <E051> <6FC2> <E052> <6F66> <E053> <6FB3> <E054> <6FA3> <E055> <6FA1> <E056> <6FA4> <E057> <6FB9> <E058> <6FC6> <E059> <6FAA> <E05A> <6FDF> <E05B> <6FD5> <E05C> <6FEC> <E05D> <6FD4> <E05E> <6FD8> <E05F> <6FF1> <E060> <6FEE> <E061> <6FDB> <E062> <7009> <E063> <700B> <E064> <6FFA> <E065> <7011> <E066> <7001> <E067> <700F> <E068> <6FFE> <E069> <701B> <E06A> <701A> <E06B> <6F74> <E06C> <701D> <E06D> <7018> <E06E> <701F> <E06F> <7030> <E070> <703E> <E071> <7032> <E072> <7051> <E073> <7063> <E074> <7099> <E075> <7092> <E076> <70AF> <E077> <70F1> <E078> <70AC> <E079> <70B8> <E07A> <70B3> <E07B> <70AE> <E07C> <70DF> <E07D> <70CB> <E07E> <70DD> <E080> <70D9> <E081> <7109> <E082> <70FD> <E083> <711C> <E084> <7119> <E085> <7165> <E086> <7155> <E087> <7188> endbfchar 100 beginbfchar <E088> <7166> <E089> <7162> <E08A> <714C> <E08B> <7156> <E08C> <716C> <E08D> <718F> <E08E> <71FB> <E08F> <7184> <E090> <7195> <E091> <71A8> <E092> <71AC> <E093> <71D7> <E094> <71B9> <E095> <71BE> <E096> <71D2> <E097> <71C9> <E098> <71D4> <E099> <71CE> <E09A> <71E0> <E09B> <71EC> <E09C> <71E7> <E09D> <71F5> <E09E> <71FC> <E09F> <71F9> <E0A0> <71FF> <E0A1> <720D> <E0A2> <7210> <E0A3> <721B> <E0A4> <7228> <E0A5> <722D> <E0A6> <722C> <E0A7> <7230> <E0A8> <7232> <E0AD> <7246> <E0AE> <724B> <E0AF> <7258> <E0B0> <7274> <E0B1> <727E> <E0B2> <7282> <E0B3> <7281> <E0B4> <7287> <E0B5> <7292> <E0B6> <7296> <E0B7> <72A2> <E0B8> <72A7> <E0B9> <72B9> <E0BA> <72B2> <E0BB> <72C3> <E0BC> <72C6> <E0BD> <72C4> <E0BE> <72CE> <E0BF> <72D2> <E0C0> <72E2> <E0C3> <72F9> <E0C4> <72F7> <E0C5> <500F> <E0C6> <7317> <E0C7> <730A> <E0C8> <731C> <E0C9> <7316> <E0CA> <731D> <E0CB> <7334> <E0CC> <732F> <E0CD> <7329> <E0CE> <7325> <E0CF> <733E> <E0D2> <9ED8> <E0D3> <7357> <E0D4> <736A> <E0D5> <7368> <E0D6> <7370> <E0D7> <7378> <E0D8> <7375> <E0D9> <737B> <E0DA> <737A> <E0DB> <73C8> <E0DC> <73B3> <E0DD> <73CE> <E0DE> <73BB> <E0DF> <73C0> <E0E0> <73E5> <E0E1> <73EE> <E0E2> <73DE> <E0E3> <74A2> <E0E4> <7405> <E0E5> <746F> <E0E6> <7425> <E0E7> <73F8> <E0E8> <7432> <E0E9> <743A> <E0EA> <7455> <E0EB> <743F> <E0EC> <745F> <E0ED> <7459> <E0EE> <7441> <E0EF> <745C> <E0F0> <7469> <E0F1> <7470> <E0F2> <7463> <E0F3> <746A> endbfchar 100 beginbfchar <E0F4> <7476> <E0F5> <747E> <E0F6> <748B> <E0F7> <749E> <E0F8> <74A7> <E0F9> <74CA> <E0FA> <74CF> <E0FB> <74D4> <E0FC> <73F1> <E140> <74E0> <E141> <74E3> <E142> <74E7> <E143> <74E9> <E144> <74EE> <E145> <74F2> <E148> <74F8> <E149> <74F7> <E14A> <7504> <E14B> <7503> <E14C> <7505> <E14D> <750C> <E14E> <750E> <E14F> <750D> <E150> <7515> <E151> <7513> <E152> <751E> <E153> <7526> <E154> <752C> <E155> <753C> <E156> <7544> <E157> <754D> <E158> <754A> <E159> <7549> <E15A> <755B> <E15B> <7546> <E15C> <755A> <E15D> <7569> <E15E> <7564> <E15F> <7567> <E160> <756B> <E161> <756D> <E162> <7578> <E163> <7576> <E166> <7574> <E167> <758A> <E168> <7589> <E169> <7582> <E16A> <7594> <E16B> <759A> <E16C> <759D> <E16D> <75A5> <E16E> <75A3> <E16F> <75C2> <E170> <75B3> <E171> <75C3> <E172> <75B5> <E173> <75BD> <E174> <75B8> <E175> <75BC> <E176> <75B1> <E177> <75CD> <E178> <75CA> <E179> <75D2> <E17A> <75D9> <E17B> <75E3> <E17C> <75DE> <E180> <75FC> <E181> <7601> <E182> <75F0> <E183> <75FA> <E186> <760B> <E187> <760D> <E188> <7609> <E189> <761F> <E18A> <7627> <E18E> <7624> <E18F> <7634> <E190> <7630> <E191> <763B> <E194> <7646> <E195> <765C> <E196> <7658> <E19C> <7667> <E19D> <766C> <E19E> <7670> <E19F> <7672> <E1A0> <7676> <E1A1> <7678> <E1A2> <767C> <E1A3> <7680> <E1A4> <7683> <E1A5> <7688> <E1A6> <768B> <E1A7> <768E> <E1A8> <7696> <E1A9> <7693> <E1AC> <76B0> <E1AD> <76B4> <E1B1> <76C2> <E1B2> <76CD> endbfchar 100 beginbfchar <E1B3> <76D6> <E1B4> <76D2> <E1B5> <76DE> <E1B6> <76E1> <E1B7> <76E5> <E1B8> <76E7> <E1B9> <76EA> <E1BA> <862F> <E1BB> <76FB> <E1BC> <7708> <E1BD> <7707> <E1BE> <7704> <E1BF> <7729> <E1C0> <7724> <E1C1> <771E> <E1C4> <771B> <E1C7> <7747> <E1C8> <775A> <E1C9> <7768> <E1CA> <776B> <E1CB> <775B> <E1CC> <7765> <E1CD> <777F> <E1CE> <777E> <E1CF> <7779> <E1D0> <778E> <E1D1> <778B> <E1D2> <7791> <E1D3> <77A0> <E1D4> <779E> <E1D5> <77B0> <E1D6> <77B6> <E1D7> <77B9> <E1D8> <77BF> <E1DB> <77BB> <E1DC> <77C7> <E1DD> <77CD> <E1DE> <77D7> <E1DF> <77DA> <E1E0> <77DC> <E1E1> <77E3> <E1E2> <77EE> <E1E3> <77FC> <E1E4> <780C> <E1E5> <7812> <E1E6> <7926> <E1E7> <7820> <E1E8> <792A> <E1E9> <7845> <E1EA> <788E> <E1EB> <7874> <E1EC> <7886> <E1ED> <787C> <E1EE> <789A> <E1EF> <788C> <E1F0> <78A3> <E1F1> <78B5> <E1F2> <78AA> <E1F3> <78AF> <E1F4> <78D1> <E1F5> <78C6> <E1F6> <78CB> <E1F7> <78D4> <E1F8> <78BE> <E1F9> <78BC> <E1FA> <78C5> <E1FB> <78CA> <E1FC> <78EC> <E240> <78E7> <E241> <78DA> <E242> <78FD> <E243> <78F4> <E244> <7907> <E245> <7912> <E246> <7911> <E247> <7919> <E248> <792C> <E249> <792B> <E24A> <7940> <E24B> <7960> <E24C> <7957> <E24D> <795F> <E24E> <795A> <E24F> <7955> <E250> <7953> <E251> <797A> <E252> <797F> <E253> <798A> <E254> <799D> <E255> <79A7> <E256> <9F4B> <E257> <79AA> <E258> <79AE> <E259> <79B3> <E25C> <79C9> <E25D> <79D5> <E25E> <79E7> <E25F> <79EC> <E260> <79E1> <E261> <79E3> endbfchar 100 beginbfchar <E262> <7A08> <E263> <7A0D> <E266> <7A20> <E267> <7A1F> <E268> <7980> <E269> <7A31> <E26A> <7A3B> <E26B> <7A3E> <E26C> <7A37> <E26D> <7A43> <E26E> <7A57> <E26F> <7A49> <E272> <7A69> <E273> <9F9D> <E274> <7A70> <E275> <7A79> <E276> <7A7D> <E277> <7A88> <E278> <7A97> <E279> <7A95> <E27A> <7A98> <E27B> <7A96> <E27C> <7AA9> <E27D> <7AC8> <E27E> <7AB0> <E280> <7AB6> <E281> <7AC5> <E282> <7AC4> <E283> <7ABF> <E284> <9083> <E285> <7AC7> <E286> <7ACA> <E287> <7ACD> <E288> <7ACF> <E289> <7AD5> <E28A> <7AD3> <E28D> <7ADD> <E290> <7AE6> <E291> <7AED> <E292> <7AF0> <E293> <7B02> <E294> <7B0F> <E295> <7B0A> <E296> <7B06> <E297> <7B33> <E29A> <7B1E> <E29B> <7B35> <E29C> <7B28> <E29D> <7B36> <E29E> <7B50> <E29F> <7B7A> <E2A0> <7B04> <E2A1> <7B4D> <E2A2> <7B0B> <E2A3> <7B4C> <E2A4> <7B45> <E2A5> <7B75> <E2A6> <7B65> <E2A7> <7B74> <E2A8> <7B67> <E2AB> <7B6C> <E2AC> <7B6E> <E2AD> <7B9D> <E2AE> <7B98> <E2AF> <7B9F> <E2B0> <7B8D> <E2B1> <7B9C> <E2B2> <7B9A> <E2B3> <7B8B> <E2B4> <7B92> <E2B5> <7B8F> <E2B6> <7B5D> <E2B7> <7B99> <E2B8> <7BCB> <E2B9> <7BC1> <E2BA> <7BCC> <E2BB> <7BCF> <E2BC> <7BB4> <E2BD> <7BC6> <E2BE> <7BDD> <E2BF> <7BE9> <E2C0> <7C11> <E2C1> <7C14> <E2C2> <7BE6> <E2C3> <7BE5> <E2C4> <7C60> <E2C5> <7C00> <E2C6> <7C07> <E2C7> <7C13> <E2C8> <7BF3> <E2C9> <7BF7> <E2CA> <7C17> <E2CB> <7C0D> <E2CC> <7BF6> <E2CD> <7C23> <E2CE> <7C27> <E2CF> <7C2A> <E2D0> <7C1F> <E2D1> <7C37> <E2D2> <7C2B> endbfchar 100 beginbfchar <E2D3> <7C3D> <E2D4> <7C4C> <E2D5> <7C43> <E2D6> <7C54> <E2D7> <7C4F> <E2D8> <7C40> <E2D9> <7C50> <E2DA> <7C58> <E2DB> <7C5F> <E2DC> <7C64> <E2DD> <7C56> <E2DE> <7C65> <E2DF> <7C6C> <E2E0> <7C75> <E2E1> <7C83> <E2E2> <7C90> <E2E3> <7CA4> <E2E4> <7CAD> <E2E5> <7CA2> <E2E6> <7CAB> <E2E7> <7CA1> <E2E8> <7CA8> <E2E9> <7CB3> <E2EA> <7CB2> <E2EB> <7CB1> <E2EC> <7CAE> <E2ED> <7CB9> <E2EE> <7CBD> <E2EF> <7CC0> <E2F0> <7CC5> <E2F1> <7CC2> <E2F2> <7CD8> <E2F3> <7CD2> <E2F4> <7CDC> <E2F5> <7CE2> <E2F6> <9B3B> <E2F7> <7CEF> <E2F8> <7CF2> <E2F9> <7CF4> <E2FA> <7CF6> <E2FB> <7CFA> <E2FC> <7D06> <E340> <7D02> <E341> <7D1C> <E342> <7D15> <E343> <7D0A> <E344> <7D45> <E345> <7D4B> <E346> <7D2E> <E347> <7D32> <E348> <7D3F> <E349> <7D35> <E34A> <7D46> <E34B> <7D73> <E34C> <7D56> <E34D> <7D4E> <E34E> <7D72> <E34F> <7D68> <E350> <7D6E> <E351> <7D4F> <E352> <7D63> <E353> <7D93> <E354> <7D89> <E355> <7D5B> <E356> <7D8F> <E357> <7D7D> <E358> <7D9B> <E359> <7DBA> <E35A> <7DAE> <E35B> <7DA3> <E35C> <7DB5> <E35D> <7DC7> <E35E> <7DBD> <E35F> <7DAB> <E360> <7E3D> <E361> <7DA2> <E362> <7DAF> <E363> <7DDC> <E364> <7DB8> <E365> <7D9F> <E366> <7DB0> <E367> <7DD8> <E368> <7DDD> <E369> <7DE4> <E36A> <7DDE> <E36B> <7DFB> <E36C> <7DF2> <E36D> <7DE1> <E36E> <7E05> <E36F> <7E0A> <E370> <7E23> <E371> <7E21> <E372> <7E12> <E373> <7E31> <E374> <7E1F> <E375> <7E09> <E376> <7E0B> <E377> <7E22> <E378> <7E46> <E379> <7E66> endbfchar 100 beginbfchar <E37A> <7E3B> <E37B> <7E35> <E37C> <7E39> <E37D> <7E43> <E37E> <7E37> <E380> <7E32> <E381> <7E3A> <E382> <7E67> <E383> <7E5D> <E384> <7E56> <E385> <7E5E> <E388> <7E79> <E389> <7E6A> <E38A> <7E69> <E38B> <7E7C> <E38C> <7E7B> <E38D> <7E83> <E38E> <7DD5> <E38F> <7E7D> <E390> <8FAE> <E391> <7E7F> <E394> <7E8C> <E395> <7E92> <E396> <7E90> <E399> <7E96> <E39A> <7E8E> <E39D> <7F38> <E39E> <7F3A> <E39F> <7F45> <E3A5> <7F55> <E3A6> <7F54> <E3A7> <7F58> <E3AC> <7F67> <E3AD> <7F78> <E3AE> <7F82> <E3AF> <7F86> <E3B0> <7F83> <E3B1> <7F88> <E3B2> <7F87> <E3B3> <7F8C> <E3B4> <7F94> <E3B5> <7F9E> <E3B6> <7F9D> <E3B7> <7F9A> <E3B8> <7FA3> <E3B9> <7FAF> <E3BA> <7FB2> <E3BB> <7FB9> <E3BC> <7FAE> <E3BD> <7FB6> <E3BE> <7FB8> <E3BF> <8B71> <E3C2> <7FCA> <E3C3> <7FD5> <E3C4> <7FD4> <E3C5> <7FE1> <E3C6> <7FE6> <E3C7> <7FE9> <E3C8> <7FF3> <E3C9> <7FF9> <E3CA> <98DC> <E3CB> <8006> <E3CC> <8004> <E3CD> <800B> <E3CE> <8012> <E3D1> <801C> <E3D2> <8021> <E3D3> <8028> <E3D4> <803F> <E3D5> <803B> <E3D6> <804A> <E3D7> <8046> <E3D8> <8052> <E3D9> <8058> <E3DA> <805A> <E3DB> <805F> <E3DC> <8062> <E3DD> <8068> <E3DE> <8073> <E3DF> <8072> <E3E0> <8070> <E3E1> <8076> <E3E2> <8079> <E3E3> <807D> <E3E4> <807F> <E3E5> <8084> <E3E6> <8086> <E3E7> <8085> <E3E8> <809B> <E3E9> <8093> <E3EA> <809A> <E3EB> <80AD> <E3EC> <5190> <E3ED> <80AC> <E3EE> <80DB> <E3EF> <80E5> <E3F0> <80D9> <E3F1> <80DD> <E3F2> <80C4> <E3F3> <80DA> endbfchar 100 beginbfchar <E3F4> <80D6> <E3F5> <8109> <E3F6> <80EF> <E3F7> <80F1> <E3F8> <811B> <E3F9> <8129> <E3FA> <8123> <E3FB> <812F> <E3FC> <814B> <E440> <968B> <E441> <8146> <E442> <813E> <E443> <8153> <E444> <8151> <E445> <80FC> <E446> <8171> <E447> <816E> <E44A> <8174> <E44B> <8183> <E44C> <8188> <E44D> <818A> <E44E> <8180> <E44F> <8182> <E450> <81A0> <E451> <8195> <E452> <81A4> <E453> <81A3> <E454> <815F> <E455> <8193> <E456> <81A9> <E457> <81B0> <E458> <81B5> <E459> <81BE> <E45A> <81B8> <E45B> <81BD> <E45C> <81C0> <E45D> <81C2> <E45E> <81BA> <E45F> <81C9> <E460> <81CD> <E461> <81D1> <E462> <81D9> <E463> <81D8> <E464> <81C8> <E465> <81DA> <E468> <81E7> <E46B> <81FE> <E46E> <8205> <E46F> <8207> <E470> <820A> <E471> <820D> <E472> <8210> <E473> <8216> <E474> <8229> <E475> <822B> <E476> <8238> <E477> <8233> <E478> <8240> <E479> <8259> <E47A> <8258> <E47B> <825D> <E47C> <825A> <E47D> <825F> <E47E> <8264> <E480> <8262> <E481> <8268> <E484> <822E> <E485> <8271> <E488> <827E> <E489> <828D> <E48A> <8292> <E48B> <82AB> <E48C> <829F> <E48D> <82BB> <E48E> <82AC> <E48F> <82E1> <E490> <82E3> <E491> <82DF> <E492> <82D2> <E493> <82F4> <E494> <82F3> <E495> <82FA> <E496> <8393> <E497> <8303> <E498> <82FB> <E499> <82F9> <E49A> <82DE> <E49B> <8306> <E49C> <82DC> <E49D> <8309> <E49E> <82D9> <E49F> <8335> <E4A0> <8334> <E4A1> <8316> <E4A2> <8332> <E4A3> <8331> <E4A4> <8340> <E4A5> <8339> <E4A6> <8350> <E4A7> <8345> endbfchar 100 beginbfchar <E4A8> <832F> <E4A9> <832B> <E4AC> <8385> <E4AD> <839A> <E4AE> <83AA> <E4AF> <839F> <E4B0> <83A2> <E4B1> <8396> <E4B2> <8323> <E4B3> <838E> <E4B4> <8387> <E4B5> <838A> <E4B6> <837C> <E4B7> <83B5> <E4B8> <8373> <E4B9> <8375> <E4BA> <83A0> <E4BB> <8389> <E4BC> <83A8> <E4BD> <83F4> <E4BE> <8413> <E4BF> <83EB> <E4C0> <83CE> <E4C1> <83FD> <E4C2> <8403> <E4C3> <83D8> <E4C4> <840B> <E4C5> <83C1> <E4C6> <83F7> <E4C7> <8407> <E4C8> <83E0> <E4C9> <83F2> <E4CA> <840D> <E4CB> <8422> <E4CC> <8420> <E4CD> <83BD> <E4CE> <8438> <E4CF> <8506> <E4D0> <83FB> <E4D1> <846D> <E4D2> <842A> <E4D3> <843C> <E4D4> <855A> <E4D5> <8484> <E4D6> <8477> <E4D7> <846B> <E4D8> <84AD> <E4D9> <846E> <E4DA> <8482> <E4DB> <8469> <E4DC> <8446> <E4DD> <842C> <E4DE> <846F> <E4DF> <8479> <E4E0> <8435> <E4E1> <84CA> <E4E2> <8462> <E4E3> <84B9> <E4E4> <84BF> <E4E5> <849F> <E4E6> <84D9> <E4E7> <84CD> <E4E8> <84BB> <E4E9> <84DA> <E4EA> <84D0> <E4EB> <84C1> <E4EC> <84C6> <E4ED> <84D6> <E4EE> <84A1> <E4EF> <8521> <E4F0> <84FF> <E4F1> <84F4> <E4F4> <852C> <E4F5> <851F> <E4F6> <8515> <E4F7> <8514> <E4F8> <84FC> <E4F9> <8540> <E4FA> <8563> <E4FB> <8558> <E4FC> <8548> <E540> <8541> <E541> <8602> <E542> <854B> <E543> <8555> <E544> <8580> <E545> <85A4> <E546> <8588> <E547> <8591> <E548> <858A> <E549> <85A8> <E54A> <856D> <E54B> <8594> <E54C> <859B> <E54D> <85EA> <E54E> <8587> <E54F> <859C> <E550> <8577> <E551> <857E> <E552> <8590> endbfchar 100 beginbfchar <E553> <85C9> <E554> <85BA> <E555> <85CF> <E556> <85B9> <E557> <85D0> <E558> <85D5> <E559> <85DD> <E55A> <85E5> <E55B> <85DC> <E55C> <85F9> <E55D> <860A> <E55E> <8613> <E55F> <860B> <E560> <85FE> <E561> <85FA> <E562> <8606> <E563> <8622> <E564> <861A> <E565> <8630> <E566> <863F> <E567> <864D> <E568> <4E55> <E569> <8654> <E56A> <865F> <E56B> <8667> <E56C> <8671> <E56D> <8693> <E56E> <86A3> <E573> <86B6> <E574> <86AF> <E575> <86C4> <E576> <86C6> <E577> <86B0> <E578> <86C9> <E579> <8823> <E57A> <86AB> <E57B> <86D4> <E57C> <86DE> <E57D> <86E9> <E57E> <86EC> <E580> <86DF> <E581> <86DB> <E582> <86EF> <E583> <8712> <E584> <8706> <E585> <8708> <E586> <8700> <E587> <8703> <E588> <86FB> <E589> <8711> <E58A> <8709> <E58B> <870D> <E58C> <86F9> <E58D> <870A> <E58E> <8734> <E58F> <873F> <E590> <8737> <E591> <873B> <E592> <8725> <E593> <8729> <E594> <871A> <E595> <8760> <E596> <875F> <E597> <8778> <E598> <874C> <E599> <874E> <E59A> <8774> <E59B> <8757> <E59C> <8768> <E59D> <876E> <E59E> <8759> <E59F> <8753> <E5A0> <8763> <E5A1> <876A> <E5A2> <8805> <E5A3> <87A2> <E5A4> <879F> <E5A5> <8782> <E5A6> <87AF> <E5A7> <87CB> <E5A8> <87BD> <E5A9> <87C0> <E5AA> <87D0> <E5AB> <96D6> <E5AC> <87AB> <E5AD> <87C4> <E5AE> <87B3> <E5AF> <87C7> <E5B0> <87C6> <E5B1> <87BB> <E5B2> <87EF> <E5B3> <87F2> <E5B4> <87E0> <E5B5> <880F> <E5B6> <880D> <E5B7> <87FE> <E5BA> <880E> <E5BB> <87D2> <E5BC> <8811> <E5BD> <8816> endbfchar 100 beginbfchar <E5BE> <8815> <E5BF> <8822> <E5C0> <8821> <E5C1> <8831> <E5C2> <8836> <E5C3> <8839> <E5C4> <8827> <E5C5> <883B> <E5C6> <8844> <E5C7> <8842> <E5C8> <8852> <E5C9> <8859> <E5CA> <885E> <E5CB> <8862> <E5CC> <886B> <E5CD> <8881> <E5CE> <887E> <E5CF> <889E> <E5D0> <8875> <E5D1> <887D> <E5D2> <88B5> <E5D3> <8872> <E5D4> <8882> <E5D5> <8897> <E5D6> <8892> <E5D7> <88AE> <E5D8> <8899> <E5D9> <88A2> <E5DA> <888D> <E5DB> <88A4> <E5DC> <88B0> <E5DD> <88BF> <E5DE> <88B1> <E5E1> <88D4> <E5E4> <88DD> <E5E5> <88F9> <E5E6> <8902> <E5E7> <88FC> <E5E8> <88F4> <E5E9> <88E8> <E5EA> <88F2> <E5EB> <8904> <E5EC> <890C> <E5ED> <890A> <E5EE> <8913> <E5EF> <8943> <E5F0> <891E> <E5F1> <8925> <E5F4> <8941> <E5F5> <8944> <E5F6> <893B> <E5F7> <8936> <E5F8> <8938> <E5F9> <894C> <E5FA> <891D> <E5FB> <8960> <E5FC> <895E> <E640> <8966> <E641> <8964> <E642> <896D> <E643> <896A> <E644> <896F> <E645> <8974> <E646> <8977> <E647> <897E> <E648> <8983> <E649> <8988> <E64A> <898A> <E64B> <8993> <E64C> <8998> <E64D> <89A1> <E64E> <89A9> <E64F> <89A6> <E650> <89AC> <E651> <89AF> <E652> <89B2> <E653> <89BA> <E654> <89BD> <E657> <89DA> <E65A> <89E7> <E65B> <89F4> <E65C> <89F8> <E65D> <8A03> <E65E> <8A16> <E65F> <8A10> <E660> <8A0C> <E661> <8A1B> <E662> <8A1D> <E663> <8A25> <E664> <8A36> <E665> <8A41> <E666> <8A5B> <E667> <8A52> <E668> <8A46> <E669> <8A48> <E66A> <8A7C> <E66B> <8A6D> <E66C> <8A6C> <E66D> <8A62> <E66E> <8A85> endbfchar 100 beginbfchar <E66F> <8A82> <E670> <8A84> <E671> <8AA8> <E672> <8AA1> <E673> <8A91> <E676> <8A9A> <E677> <8AA3> <E678> <8AC4> <E679> <8ACD> <E67A> <8AC2> <E67B> <8ADA> <E67C> <8AEB> <E67D> <8AF3> <E67E> <8AE7> <E680> <8AE4> <E681> <8AF1> <E682> <8B14> <E683> <8AE0> <E684> <8AE2> <E685> <8AF7> <E686> <8ADE> <E687> <8ADB> <E688> <8B0C> <E689> <8B07> <E68A> <8B1A> <E68B> <8AE1> <E68C> <8B16> <E68D> <8B10> <E68E> <8B17> <E68F> <8B20> <E690> <8B33> <E691> <97AB> <E692> <8B26> <E693> <8B2B> <E694> <8B3E> <E695> <8B28> <E696> <8B41> <E697> <8B4C> <E698> <8B4F> <E699> <8B4E> <E69A> <8B49> <E69B> <8B56> <E69C> <8B5B> <E69D> <8B5A> <E69E> <8B6B> <E69F> <8B5F> <E6A0> <8B6C> <E6A1> <8B6F> <E6A2> <8B74> <E6A3> <8B7D> <E6A4> <8B80> <E6A5> <8B8C> <E6A6> <8B8E> <E6A9> <8B96> <E6AC> <8C3A> <E6AD> <8C41> <E6AE> <8C3F> <E6AF> <8C48> <E6B0> <8C4C> <E6B1> <8C4E> <E6B2> <8C50> <E6B3> <8C55> <E6B4> <8C62> <E6B5> <8C6C> <E6B6> <8C78> <E6B7> <8C7A> <E6B8> <8C82> <E6B9> <8C89> <E6BA> <8C85> <E6BB> <8C8A> <E6BE> <8C94> <E6BF> <8C7C> <E6C0> <8C98> <E6C1> <621D> <E6C2> <8CAD> <E6C3> <8CAA> <E6C4> <8CBD> <E6C7> <8CAE> <E6C8> <8CB6> <E6C9> <8CC8> <E6CA> <8CC1> <E6CB> <8CE4> <E6CC> <8CE3> <E6CD> <8CDA> <E6CE> <8CFD> <E6D3> <8D0A> <E6D4> <8D07> <E6D5> <8D0F> <E6D6> <8D0D> <E6D7> <8D10> <E6D8> <9F4E> <E6D9> <8D13> <E6DA> <8CCD> <E6DB> <8D14> <E6DC> <8D16> <E6DD> <8D67> <E6DE> <8D6D> <E6DF> <8D71> <E6E0> <8D73> <E6E1> <8D81> endbfchar 100 beginbfchar <E6E2> <8D99> <E6E3> <8DC2> <E6E4> <8DBE> <E6E5> <8DBA> <E6E6> <8DCF> <E6E7> <8DDA> <E6E8> <8DD6> <E6E9> <8DCC> <E6EA> <8DDB> <E6EB> <8DCB> <E6EE> <8DDF> <E6EF> <8DE3> <E6F0> <8DFC> <E6F3> <8DFF> <E6F6> <8E10> <E6F7> <8E1F> <E6F8> <8E42> <E6F9> <8E35> <E6FA> <8E30> <E6FB> <8E34> <E6FC> <8E4A> <E740> <8E47> <E741> <8E49> <E742> <8E4C> <E743> <8E50> <E744> <8E48> <E745> <8E59> <E746> <8E64> <E747> <8E60> <E748> <8E2A> <E749> <8E63> <E74A> <8E55> <E74B> <8E76> <E74C> <8E72> <E74D> <8E7C> <E74E> <8E81> <E74F> <8E87> <E750> <8E85> <E751> <8E84> <E752> <8E8B> <E753> <8E8A> <E754> <8E93> <E755> <8E91> <E756> <8E94> <E757> <8E99> <E758> <8EAA> <E759> <8EA1> <E75A> <8EAC> <E75B> <8EB0> <E75C> <8EC6> <E75D> <8EB1> <E75E> <8EBE> <E75F> <8EC5> <E760> <8EC8> <E761> <8ECB> <E762> <8EDB> <E763> <8EE3> <E764> <8EFC> <E765> <8EFB> <E766> <8EEB> <E767> <8EFE> <E768> <8F0A> <E769> <8F05> <E76A> <8F15> <E76B> <8F12> <E76C> <8F19> <E76D> <8F13> <E76E> <8F1C> <E76F> <8F1F> <E770> <8F1B> <E771> <8F0C> <E772> <8F26> <E773> <8F33> <E774> <8F3B> <E775> <8F39> <E776> <8F45> <E777> <8F42> <E778> <8F3E> <E779> <8F4C> <E77A> <8F49> <E77B> <8F46> <E77C> <8F4E> <E77D> <8F57> <E77E> <8F5C> <E783> <8F9C> <E784> <8F9F> <E785> <8FA3> <E786> <8FAD> <E787> <8FAF> <E788> <8FB7> <E789> <8FDA> <E78A> <8FE5> <E78B> <8FE2> <E78C> <8FEA> <E78D> <8FEF> <E78E> <9087> <E78F> <8FF4> <E790> <9005> <E793> <9011> <E794> <9015> endbfchar 100 beginbfchar <E795> <9021> <E796> <900D> <E797> <901E> <E798> <9016> <E799> <900B> <E79A> <9027> <E79B> <9036> <E79C> <9035> <E79D> <9039> <E79E> <8FF8> <E7A3> <900E> <E7A4> <9049> <E7A5> <903E> <E7A6> <9056> <E7A7> <9058> <E7A8> <905E> <E7A9> <9068> <E7AA> <906F> <E7AB> <9076> <E7AC> <96A8> <E7AD> <9072> <E7AE> <9082> <E7AF> <907D> <E7B0> <9081> <E7B1> <9080> <E7B2> <908A> <E7B3> <9089> <E7B4> <908F> <E7B5> <90A8> <E7B6> <90AF> <E7B7> <90B1> <E7B8> <90B5> <E7B9> <90E2> <E7BA> <90E4> <E7BB> <6248> <E7BC> <90DB> <E7BD> <9102> <E7BE> <9112> <E7BF> <9119> <E7C0> <9132> <E7C1> <9130> <E7C2> <914A> <E7C3> <9156> <E7C4> <9158> <E7C5> <9163> <E7C6> <9165> <E7C7> <9169> <E7C8> <9173> <E7C9> <9172> <E7CA> <918B> <E7CB> <9189> <E7CC> <9182> <E7CD> <91A2> <E7CE> <91AB> <E7CF> <91AF> <E7D0> <91AA> <E7D1> <91B5> <E7D2> <91B4> <E7D3> <91BA> <E7D6> <91C9> <E7D7> <91CB> <E7D8> <91D0> <E7D9> <91D6> <E7DA> <91DF> <E7DB> <91E1> <E7DC> <91DB> <E7DD> <91FC> <E7E0> <921E> <E7E1> <91FF> <E7E2> <9214> <E7E3> <922C> <E7E4> <9215> <E7E5> <9211> <E7E6> <925E> <E7E7> <9257> <E7E8> <9245> <E7E9> <9249> <E7EA> <9264> <E7EB> <9248> <E7EC> <9295> <E7ED> <923F> <E7EE> <924B> <E7EF> <9250> <E7F0> <929C> <E7F1> <9296> <E7F2> <9293> <E7F3> <929B> <E7F4> <925A> <E7F5> <92CF> <E7F6> <92B9> <E7F7> <92B7> <E7F8> <92E9> <E7F9> <930F> <E7FA> <92FA> <E7FB> <9344> <E7FC> <932E> <E840> <9319> <E841> <9322> <E842> <931A> <E843> <9323> endbfchar 100 beginbfchar <E844> <933A> <E845> <9335> <E846> <933B> <E847> <935C> <E848> <9360> <E849> <937C> <E84A> <936E> <E84B> <9356> <E84C> <93B0> <E84F> <9394> <E850> <93B9> <E853> <93E8> <E854> <93E5> <E855> <93D8> <E856> <93C3> <E857> <93DD> <E858> <93D0> <E859> <93C8> <E85A> <93E4> <E85B> <941A> <E85C> <9414> <E85D> <9413> <E85E> <9403> <E85F> <9407> <E860> <9410> <E861> <9436> <E862> <942B> <E863> <9435> <E864> <9421> <E865> <943A> <E866> <9441> <E867> <9452> <E868> <9444> <E869> <945B> <E86A> <9460> <E86B> <9462> <E86C> <945E> <E86D> <946A> <E86E> <9229> <E86F> <9470> <E870> <9475> <E871> <9477> <E872> <947D> <E873> <945A> <E874> <947C> <E875> <947E> <E876> <9481> <E877> <947F> <E878> <9582> <E879> <9587> <E87A> <958A> <E87B> <9594> <E87C> <9596> <E880> <95A0> <E881> <95A8> <E882> <95A7> <E883> <95AD> <E884> <95BC> <E885> <95BB> <E886> <95B9> <E887> <95BE> <E888> <95CA> <E889> <6FF6> <E88A> <95C3> <E88B> <95CD> <E88C> <95CC> <E88D> <95D5> <E88E> <95D4> <E88F> <95D6> <E890> <95DC> <E891> <95E1> <E892> <95E5> <E893> <95E2> <E894> <9621> <E895> <9628> <E898> <9642> <E899> <964C> <E89A> <964F> <E89B> <964B> <E89C> <9677> <E89D> <965C> <E89E> <965E> <E89F> <965D> <E8A0> <965F> <E8A1> <9666> <E8A2> <9672> <E8A3> <966C> <E8A4> <968D> <E8A5> <9698> <E8A6> <9695> <E8A7> <9697> <E8A8> <96AA> <E8A9> <96A7> <E8AC> <96B0> <E8AD> <96B4> <E8AE> <96B6> <E8B1> <96CE> <E8B2> <96CB> <E8B3> <96C9> <E8B4> <96CD> endbfchar 100 beginbfchar <E8B5> <894D> <E8B6> <96DC> <E8B7> <970D> <E8B8> <96D5> <E8B9> <96F9> <E8BA> <9704> <E8BB> <9706> <E8BC> <9708> <E8BD> <9713> <E8BE> <970E> <E8BF> <9711> <E8C0> <970F> <E8C1> <9716> <E8C2> <9719> <E8C3> <9724> <E8C4> <972A> <E8C5> <9730> <E8C6> <9739> <E8C9> <9744> <E8CA> <9746> <E8CB> <9748> <E8CC> <9742> <E8CD> <9749> <E8CE> <975C> <E8CF> <9760> <E8D0> <9764> <E8D1> <9766> <E8D2> <9768> <E8D3> <52D2> <E8D4> <976B> <E8D5> <9771> <E8D6> <9779> <E8D7> <9785> <E8D8> <977C> <E8D9> <9781> <E8DA> <977A> <E8DB> <9786> <E8DC> <978B> <E8DF> <979C> <E8E0> <97A8> <E8E1> <97A6> <E8E2> <97A3> <E8E5> <97C3> <E8E6> <97C6> <E8E7> <97C8> <E8E8> <97CB> <E8E9> <97DC> <E8EA> <97ED> <E8EB> <9F4F> <E8EC> <97F2> <E8ED> <7ADF> <E8EE> <97F6> <E8EF> <97F5> <E8F0> <980F> <E8F1> <980C> <E8F2> <9838> <E8F3> <9824> <E8F4> <9821> <E8F5> <9837> <E8F6> <983D> <E8F7> <9846> <E8F8> <984F> <E8F9> <984B> <E8FA> <986B> <E940> <9871> <E941> <9874> <E942> <9873> <E943> <98AA> <E944> <98AF> <E945> <98B1> <E946> <98B6> <E947> <98C4> <E948> <98C3> <E949> <98C6> <E94A> <98E9> <E94B> <98EB> <E94C> <9903> <E94D> <9909> <E94E> <9912> <E94F> <9914> <E950> <9918> <E951> <9921> <E954> <9924> <E955> <9920> <E956> <992C> <E957> <992E> <E95A> <9942> <E95B> <9949> <E95C> <9945> <E95D> <9950> <E95E> <994B> <E961> <994C> <E962> <9955> <E965> <99A5> <E968> <99BC> <E969> <99DF> <E96A> <99DB> <E96B> <99DD> <E96C> <99D8> <E96D> <99D1> endbfchar 100 beginbfchar <E972> <99FB> <E973> <99F8> <E974> <9A01> <E975> <9A0F> <E976> <9A05> <E977> <99E2> <E978> <9A19> <E979> <9A2B> <E97A> <9A37> <E97B> <9A45> <E97C> <9A42> <E97D> <9A40> <E97E> <9A43> <E980> <9A3E> <E981> <9A55> <E982> <9A4D> <E983> <9A5B> <E984> <9A57> <E985> <9A5F> <E986> <9A62> <E987> <9A65> <E988> <9A64> <E989> <9A69> <E98A> <9A6B> <E98B> <9A6A> <E98C> <9AAD> <E98D> <9AB0> <E98E> <9ABC> <E98F> <9AC0> <E990> <9ACF> <E991> <9AD1> <E998> <9AE6> <E999> <9AEF> <E99A> <9AEB> <E99B> <9AEE> <E99C> <9AF4> <E99D> <9AF1> <E99E> <9AF7> <E99F> <9AFB> <E9A0> <9B06> <E9A1> <9B18> <E9A2> <9B1A> <E9A3> <9B1F> <E9A6> <9B25> <E9AD> <9B32> <E9AE> <9B44> <E9AF> <9B43> <E9B0> <9B4F> <E9B3> <9B51> <E9B4> <9B58> <E9B5> <9B74> <E9B6> <9B93> <E9B7> <9B83> <E9B8> <9B91> <E9BD> <9BA8> <E9BE> <9BB4> <E9BF> <9BC0> <E9C0> <9BCA> <E9C1> <9BB9> <E9C2> <9BC6> <E9C3> <9BCF> <E9C6> <9BE3> <E9C7> <9BE2> <E9C8> <9BE4> <E9C9> <9BD4> <E9CA> <9BE1> <E9CB> <9C3A> <E9CC> <9BF2> <E9CD> <9BF1> <E9CE> <9BF0> <E9CF> <9C15> <E9D0> <9C14> <E9D1> <9C09> <E9D2> <9C13> <E9D3> <9C0C> <E9D4> <9C06> <E9D5> <9C08> <E9D6> <9C12> <E9D7> <9C0A> <E9D8> <9C04> <E9D9> <9C2E> <E9DA> <9C1B> <E9DB> <9C25> <E9DC> <9C24> <E9DD> <9C21> <E9DE> <9C30> <E9DF> <9C47> <E9E0> <9C32> <E9E1> <9C46> <E9E2> <9C3E> <E9E3> <9C5A> <E9E4> <9C60> <E9E5> <9C67> <E9E6> <9C76> <E9E7> <9C78> <E9E8> <9CE7> <E9E9> <9CEC> <E9EA> <9CF0> <E9EB> <9D09> <E9EC> <9D08> endbfchar 100 beginbfchar <E9ED> <9CEB> <E9EE> <9D03> <E9EF> <9D06> <E9F0> <9D2A> <E9F1> <9D26> <E9F2> <9DAF> <E9F3> <9D23> <E9F4> <9D1F> <E9F5> <9D44> <E9F6> <9D15> <E9F7> <9D12> <E9F8> <9D41> <E9F9> <9D3F> <E9FA> <9D3E> <E9FB> <9D46> <E9FC> <9D48> <EA42> <9D64> <EA43> <9D51> <EA44> <9D50> <EA45> <9D59> <EA46> <9D72> <EA47> <9D89> <EA48> <9D87> <EA49> <9DAB> <EA4A> <9D6F> <EA4B> <9D7A> <EA4C> <9D9A> <EA4D> <9DA4> <EA4E> <9DA9> <EA4F> <9DB2> <EA50> <9DC4> <EA51> <9DC1> <EA52> <9DBB> <EA53> <9DB8> <EA54> <9DBA> <EA55> <9DC6> <EA56> <9DCF> <EA57> <9DC2> <EA58> <9DD9> <EA59> <9DD3> <EA5A> <9DF8> <EA5B> <9DE6> <EA5C> <9DED> <EA5D> <9DEF> <EA5E> <9DFD> <EA61> <9E1E> <EA62> <9E75> <EA63> <9E79> <EA64> <9E7D> <EA65> <9E81> <EA66> <9E88> <EA69> <9E92> <EA6A> <9E95> <EA6B> <9E91> <EA6C> <9E9D> <EA6D> <9EA5> <EA6E> <9EA9> <EA6F> <9EB8> <EA70> <9EAA> <EA71> <9EAD> <EA72> <9761> <EA73> <9ECC> <EA77> <9ED4> <EA78> <9EDC> <EA79> <9EDE> <EA7A> <9EDD> <EA7B> <9EE0> <EA7C> <9EE5> <EA7D> <9EE8> <EA7E> <9EEF> <EA80> <9EF4> <EA83> <9EF9> <EA89> <76B7> <EA8A> <9F15> <EA8B> <9F21> <EA8C> <9F2C> <EA8D> <9F3E> <EA8E> <9F4A> <EA8F> <9F52> <EA90> <9F54> <EA91> <9F63> <EA97> <9F6C> <EA98> <9F6A> <EA99> <9F77> <EA9A> <9F72> <EA9B> <9F76> <EA9C> <9F95> <EA9D> <9F9C> <EA9E> <9FA0> <EA9F> <582F> <EAA0> <69C7> <EAA1> <9059> <EAA2> <7464> <EAA3> <51DC> <EAA4> <7199> <ED40> <7E8A> <ED41> <891C> <ED42> <9348> <ED43> <9288> <ED44> <84DC> endbfchar 100 beginbfchar <ED45> <4FC9> <ED46> <70BB> <ED47> <6631> <ED48> <68C8> <ED49> <92F9> <ED4A> <66FB> <ED4B> <5F45> <ED4C> <4E28> <ED4D> <4EE1> <ED4E> <4EFC> <ED4F> <4F00> <ED50> <4F03> <ED51> <4F39> <ED52> <4F56> <ED53> <4F92> <ED54> <4F8A> <ED55> <4F9A> <ED56> <4F94> <ED57> <4FCD> <ED58> <5040> <ED59> <5022> <ED5A> <4FFF> <ED5B> <501E> <ED5C> <5046> <ED5D> <5070> <ED5E> <5042> <ED5F> <5094> <ED60> <50F4> <ED61> <50D8> <ED62> <514A> <ED63> <5164> <ED64> <519D> <ED65> <51BE> <ED66> <51EC> <ED67> <5215> <ED68> <529C> <ED69> <52A6> <ED6A> <52C0> <ED6B> <52DB> <ED6C> <5300> <ED6D> <5307> <ED6E> <5324> <ED6F> <5372> <ED70> <5393> <ED71> <53B2> <ED72> <53DD> <ED73> <FA0E> <ED74> <549C> <ED75> <548A> <ED76> <54A9> <ED77> <54FF> <ED78> <5586> <ED79> <5759> <ED7A> <5765> <ED7B> <57AC> <ED7C> <57C8> <ED7D> <57C7> <ED7E> <FA0F> <ED80> <FA10> <ED81> <589E> <ED82> <58B2> <ED83> <590B> <ED84> <5953> <ED85> <595B> <ED86> <595D> <ED87> <5963> <ED88> <59A4> <ED89> <59BA> <ED8A> <5B56> <ED8B> <5BC0> <ED8C> <752F> <ED8D> <5BD8> <ED8E> <5BEC> <ED8F> <5C1E> <ED90> <5CA6> <ED91> <5CBA> <ED92> <5CF5> <ED93> <5D27> <ED94> <5D53> <ED95> <FA11> <ED96> <5D42> <ED97> <5D6D> <ED9A> <5DD0> <ED9B> <5F21> <ED9C> <5F34> <ED9D> <5F67> <ED9E> <5FB7> <ED9F> <5FDE> <EDA0> <605D> <EDA1> <6085> <EDA2> <608A> <EDA3> <60DE> <EDA4> <60D5> <EDA5> <6120> <EDA6> <60F2> <EDA7> <6111> <EDA8> <6137> <EDA9> <6130> <EDAA> <6198> <EDAB> <6213> endbfchar 100 beginbfchar <EDAC> <62A6> <EDAD> <63F5> <EDAE> <6460> <EDAF> <649D> <EDB0> <64CE> <EDB1> <654E> <EDB2> <6600> <EDB3> <6615> <EDB4> <663B> <EDB5> <6609> <EDB6> <662E> <EDB7> <661E> <EDB8> <6624> <EDB9> <6665> <EDBA> <6657> <EDBB> <6659> <EDBC> <FA12> <EDBD> <6673> <EDBE> <6699> <EDBF> <66A0> <EDC0> <66B2> <EDC1> <66BF> <EDC2> <66FA> <EDC3> <670E> <EDC4> <F929> <EDC5> <6766> <EDC6> <67BB> <EDC7> <6852> <EDC8> <67C0> <EDC9> <6801> <EDCA> <6844> <EDCB> <68CF> <EDCC> <FA13> <EDCD> <6968> <EDCE> <FA14> <EDCF> <6998> <EDD0> <69E2> <EDD1> <6A30> <EDD2> <6A6B> <EDD3> <6A46> <EDD4> <6A73> <EDD5> <6A7E> <EDD6> <6AE2> <EDD7> <6AE4> <EDD8> <6BD6> <EDD9> <6C3F> <EDDA> <6C5C> <EDDB> <6C86> <EDDC> <6C6F> <EDDD> <6CDA> <EDDE> <6D04> <EDDF> <6D87> <EDE0> <6D6F> <EDE1> <6D96> <EDE2> <6DAC> <EDE3> <6DCF> <EDE4> <6DF8> <EDE5> <6DF2> <EDE6> <6DFC> <EDE7> <6E39> <EDE8> <6E5C> <EDE9> <6E27> <EDEA> <6E3C> <EDEB> <6EBF> <EDEC> <6F88> <EDED> <6FB5> <EDEE> <6FF5> <EDEF> <7005> <EDF0> <7007> <EDF1> <7028> <EDF2> <7085> <EDF3> <70AB> <EDF4> <710F> <EDF5> <7104> <EDF6> <715C> <EDF9> <FA15> <EDFA> <71C1> <EDFB> <71FE> <EDFC> <72B1> <EE40> <72BE> <EE41> <7324> <EE42> <FA16> <EE43> <7377> <EE44> <73BD> <EE45> <73C9> <EE46> <73D6> <EE47> <73E3> <EE48> <73D2> <EE49> <7407> <EE4A> <73F5> <EE4B> <7426> <EE4C> <742A> <EE4D> <7429> <EE4E> <742E> <EE4F> <7462> <EE50> <7489> <EE51> <749F> <EE52> <7501> <EE53> <756F> <EE54> <7682> endbfchar 100 beginbfchar <EE55> <769C> <EE56> <769E> <EE57> <769B> <EE58> <76A6> <EE59> <FA17> <EE5A> <7746> <EE5B> <52AF> <EE5C> <7821> <EE5D> <784E> <EE5E> <7864> <EE5F> <787A> <EE60> <7930> <EE64> <7994> <EE65> <FA1B> <EE66> <799B> <EE67> <7AD1> <EE68> <7AE7> <EE69> <FA1C> <EE6A> <7AEB> <EE6B> <7B9E> <EE6C> <FA1D> <EE6D> <7D48> <EE6E> <7D5C> <EE6F> <7DB7> <EE70> <7DA0> <EE71> <7DD6> <EE72> <7E52> <EE73> <7F47> <EE74> <7FA1> <EE75> <FA1E> <EE76> <8301> <EE77> <8362> <EE78> <837F> <EE79> <83C7> <EE7A> <83F6> <EE7B> <8448> <EE7C> <84B4> <EE7D> <8553> <EE7E> <8559> <EE80> <856B> <EE81> <FA1F> <EE82> <85B0> <EE85> <8807> <EE86> <88F5> <EE87> <8A12> <EE88> <8A37> <EE89> <8A79> <EE8A> <8AA7> <EE8B> <8ABE> <EE8C> <8ADF> <EE8D> <FA22> <EE8E> <8AF6> <EE8F> <8B53> <EE90> <8B7F> <EE91> <8CF0> <EE92> <8CF4> <EE93> <8D12> <EE94> <8D76> <EE95> <FA23> <EE96> <8ECF> <EE99> <9067> <EE9A> <90DE> <EE9B> <FA26> <EE9C> <9115> <EE9D> <9127> <EE9E> <91DA> <EE9F> <91D7> <EEA0> <91DE> <EEA5> <9206> <EEA6> <9210> <EEA7> <920A> <EEA8> <923A> <EEA9> <9240> <EEAA> <923C> <EEAB> <924E> <EEAC> <9259> <EEAD> <9251> <EEAE> <9239> <EEAF> <9267> <EEB0> <92A7> <EEB3> <92E7> <EEB4> <92D7> <EEB5> <92D9> <EEB6> <92D0> <EEB7> <FA27> <EEB8> <92D5> <EEB9> <92E0> <EEBA> <92D3> <EEBB> <9325> <EEBC> <9321> <EEBD> <92FB> <EEBE> <FA28> <EEBF> <931E> <EEC0> <92FF> <EEC1> <931D> <EEC2> <9302> <EEC3> <9370> <EEC4> <9357> <EEC5> <93A4> <EEC6> <93C6> endbfchar 100 beginbfchar <EEC7> <93DE> <EEC8> <93F8> <EEC9> <9431> <EECA> <9445> <EECB> <9448> <EECC> <9592> <EECD> <F9DC> <EECE> <FA29> <EECF> <969D> <EED0> <96AF> <EED1> <9733> <EED2> <973B> <EED3> <9743> <EED4> <974D> <EED5> <974F> <EED6> <9751> <EED7> <9755> <EED8> <9857> <EED9> <9865> <EEDC> <9927> <EEDD> <FA2C> <EEDE> <999E> <EEDF> <9A4E> <EEE0> <9AD9> <EEE1> <9ADC> <EEE2> <9B75> <EEE3> <9B72> <EEE4> <9B8F> <EEE5> <9BB1> <EEE6> <9BBB> <EEE7> <9C00> <EEE8> <9D70> <EEE9> <9D6B> <EEEA> <FA2D> <EEEB> <9E19> <EEEC> <9ED1> <EEF9> <FFE2> <EEFA> <FFE4> <EEFB> <FF07> <EEFC> <FF02> <FA54> <FFE2> <FA55> <FFE4> <FA56> <FF07> <FA57> <FF02> <FA58> <3231> <FA59> <2116> <FA5A> <2121> <FA5B> <2235> <FA5C> <7E8A> <FA5D> <891C> <FA5E> <9348> <FA5F> <9288> <FA60> <84DC> <FA61> <4FC9> <FA62> <70BB> <FA63> <6631> <FA64> <68C8> <FA65> <92F9> <FA66> <66FB> <FA67> <5F45> <FA68> <4E28> <FA69> <4EE1> <FA6A> <4EFC> <FA6B> <4F00> <FA6C> <4F03> <FA6D> <4F39> <FA6E> <4F56> <FA6F> <4F92> <FA70> <4F8A> <FA71> <4F9A> <FA72> <4F94> <FA73> <4FCD> <FA74> <5040> <FA75> <5022> <FA76> <4FFF> <FA77> <501E> <FA78> <5046> <FA79> <5070> <FA7A> <5042> <FA7B> <5094> <FA7C> <50F4> <FA7D> <50D8> <FA7E> <514A> <FA80> <5164> <FA81> <519D> <FA82> <51BE> <FA83> <51EC> <FA84> <5215> <FA85> <529C> <FA86> <52A6> <FA87> <52C0> <FA88> <52DB> <FA89> <5300> <FA8A> <5307> <FA8B> <5324> <FA8C> <5372> <FA8D> <5393> <FA8E> <53B2> <FA8F> <53DD> <FA90> <FA0E> endbfchar 100 beginbfchar <FA91> <549C> <FA92> <548A> <FA93> <54A9> <FA94> <54FF> <FA95> <5586> <FA96> <5759> <FA97> <5765> <FA98> <57AC> <FA99> <57C8> <FA9A> <57C7> <FA9D> <589E> <FA9E> <58B2> <FA9F> <590B> <FAA0> <5953> <FAA1> <595B> <FAA2> <595D> <FAA3> <5963> <FAA4> <59A4> <FAA5> <59BA> <FAA6> <5B56> <FAA7> <5BC0> <FAA8> <752F> <FAA9> <5BD8> <FAAA> <5BEC> <FAAB> <5C1E> <FAAC> <5CA6> <FAAD> <5CBA> <FAAE> <5CF5> <FAAF> <5D27> <FAB0> <5D53> <FAB1> <FA11> <FAB2> <5D42> <FAB3> <5D6D> <FAB6> <5DD0> <FAB7> <5F21> <FAB8> <5F34> <FAB9> <5F67> <FABA> <5FB7> <FABB> <5FDE> <FABC> <605D> <FABD> <6085> <FABE> <608A> <FABF> <60DE> <FAC0> <60D5> <FAC1> <6120> <FAC2> <60F2> <FAC3> <6111> <FAC4> <6137> <FAC5> <6130> <FAC6> <6198> <FAC7> <6213> <FAC8> <62A6> <FAC9> <63F5> <FACA> <6460> <FACB> <649D> <FACC> <64CE> <FACD> <654E> <FACE> <6600> <FACF> <6615> <FAD0> <663B> <FAD1> <6609> <FAD2> <662E> <FAD3> <661E> <FAD4> <6624> <FAD5> <6665> <FAD6> <6657> <FAD7> <6659> <FAD8> <FA12> <FAD9> <6673> <FADA> <6699> <FADB> <66A0> <FADC> <66B2> <FADD> <66BF> <FADE> <66FA> <FADF> <670E> <FAE0> <F929> <FAE1> <6766> <FAE2> <67BB> <FAE3> <6852> <FAE4> <67C0> <FAE5> <6801> <FAE6> <6844> <FAE7> <68CF> <FAE8> <FA13> <FAE9> <6968> <FAEA> <FA14> <FAEB> <6998> <FAEC> <69E2> <FAED> <6A30> <FAEE> <6A6B> <FAEF> <6A46> <FAF0> <6A73> <FAF1> <6A7E> <FAF2> <6AE2> <FAF3> <6AE4> <FAF4> <6BD6> <FAF5> <6C3F> <FAF6> <6C5C> <FAF7> <6C86> <FAF8> <6C6F> endbfchar 100 beginbfchar <FAF9> <6CDA> <FAFA> <6D04> <FAFB> <6D87> <FAFC> <6D6F> <FB40> <6D96> <FB41> <6DAC> <FB42> <6DCF> <FB43> <6DF8> <FB44> <6DF2> <FB45> <6DFC> <FB46> <6E39> <FB47> <6E5C> <FB48> <6E27> <FB49> <6E3C> <FB4A> <6EBF> <FB4B> <6F88> <FB4C> <6FB5> <FB4D> <6FF5> <FB4E> <7005> <FB4F> <7007> <FB50> <7028> <FB51> <7085> <FB52> <70AB> <FB53> <710F> <FB54> <7104> <FB55> <715C> <FB58> <FA15> <FB59> <71C1> <FB5A> <71FE> <FB5B> <72B1> <FB5C> <72BE> <FB5D> <7324> <FB5E> <FA16> <FB5F> <7377> <FB60> <73BD> <FB61> <73C9> <FB62> <73D6> <FB63> <73E3> <FB64> <73D2> <FB65> <7407> <FB66> <73F5> <FB67> <7426> <FB68> <742A> <FB69> <7429> <FB6A> <742E> <FB6B> <7462> <FB6C> <7489> <FB6D> <749F> <FB6E> <7501> <FB6F> <756F> <FB70> <7682> <FB71> <769C> <FB72> <769E> <FB73> <769B> <FB74> <76A6> <FB75> <FA17> <FB76> <7746> <FB77> <52AF> <FB78> <7821> <FB79> <784E> <FB7A> <7864> <FB7B> <787A> <FB7C> <7930> <FB80> <FA1A> <FB81> <7994> <FB82> <FA1B> <FB83> <799B> <FB84> <7AD1> <FB85> <7AE7> <FB86> <FA1C> <FB87> <7AEB> <FB88> <7B9E> <FB89> <FA1D> <FB8A> <7D48> <FB8B> <7D5C> <FB8C> <7DB7> <FB8D> <7DA0> <FB8E> <7DD6> <FB8F> <7E52> <FB90> <7F47> <FB91> <7FA1> <FB92> <FA1E> <FB93> <8301> <FB94> <8362> <FB95> <837F> <FB96> <83C7> <FB97> <83F6> <FB98> <8448> <FB99> <84B4> <FB9A> <8553> <FB9B> <8559> <FB9C> <856B> <FB9D> <FA1F> <FB9E> <85B0> <FBA1> <8807> <FBA2> <88F5> <FBA3> <8A12> <FBA4> <8A37> <FBA5> <8A79> <FBA6> <8AA7> endbfchar 88 beginbfchar <FBA7> <8ABE> <FBA8> <8ADF> <FBA9> <FA22> <FBAA> <8AF6> <FBAB> <8B53> <FBAC> <8B7F> <FBAD> <8CF0> <FBAE> <8CF4> <FBAF> <8D12> <FBB0> <8D76> <FBB1> <FA23> <FBB2> <8ECF> <FBB5> <9067> <FBB6> <90DE> <FBB7> <FA26> <FBB8> <9115> <FBB9> <9127> <FBBA> <91DA> <FBBB> <91D7> <FBBC> <91DE> <FBC1> <9206> <FBC2> <9210> <FBC3> <920A> <FBC4> <923A> <FBC5> <9240> <FBC6> <923C> <FBC7> <924E> <FBC8> <9259> <FBC9> <9251> <FBCA> <9239> <FBCB> <9267> <FBCC> <92A7> <FBCF> <92E7> <FBD0> <92D7> <FBD1> <92D9> <FBD2> <92D0> <FBD3> <FA27> <FBD4> <92D5> <FBD5> <92E0> <FBD6> <92D3> <FBD7> <9325> <FBD8> <9321> <FBD9> <92FB> <FBDA> <FA28> <FBDB> <931E> <FBDC> <92FF> <FBDD> <931D> <FBDE> <9302> <FBDF> <9370> <FBE0> <9357> <FBE1> <93A4> <FBE2> <93C6> <FBE3> <93DE> <FBE4> <93F8> <FBE5> <9431> <FBE6> <9445> <FBE7> <9448> <FBE8> <9592> <FBE9> <F9DC> <FBEA> <FA29> <FBEB> <969D> <FBEC> <96AF> <FBED> <9733> <FBEE> <973B> <FBEF> <9743> <FBF0> <974D> <FBF1> <974F> <FBF2> <9751> <FBF3> <9755> <FBF4> <9857> <FBF5> <9865> <FBF8> <9927> <FBF9> <FA2C> <FBFA> <999E> <FBFB> <9A4E> <FBFC> <9AD9> <FC40> <9ADC> <FC41> <9B75> <FC42> <9B72> <FC43> <9B8F> <FC44> <9BB1> <FC45> <9BBB> <FC46> <9C00> <FC47> <9D70> <FC48> <9D6B> <FC49> <FA2D> <FC4A> <9E19> <FC4B> <9ED1> endbfchar 100 beginbfrange <00> <7F> <0000> <A1> <DF> <FF61> <FD> <FF> <F8F1> <8140> <8142> <3000> <8146> <8147> <FF1A> <814A> <814B> <309B> <8152> <8153> <30FD> <8154> <8155> <309D> <8158> <815A> <3005> <8165> <8166> <2018> <8167> <8168> <201C> <8169> <816A> <FF08> <816B> <816C> <3014> <8171> <817A> <3008> <8185> <8186> <2266> <818C> <818D> <2032> <8191> <8192> <FFE0> <81A9> <81AA> <2190> <81BA> <81BB> <2286> <81BC> <81BD> <2282> <81C8> <81C9> <2227> <81E1> <81E2> <226A> <81E7> <81E8> <222B> <81F5> <81F6> <2020> <824F> <8258> <FF10> <8260> <8279> <FF21> <8281> <829A> <FF41> <829F> <82F1> <3041> <8340> <837E> <30A1> <8380> <8396> <30E0> <839F> <83AF> <0391> <83B0> <83B6> <03A3> <83BF> <83CF> <03B1> <83D0> <83D6> <03C3> <8440> <8445> <0410> <8447> <8460> <0416> <8470> <8475> <0430> <8477> <847E> <0436> <8480> <8491> <043E> <8740> <8753> <2460> <8754> <875D> <2160> <876F> <8771> <339C> <8772> <8773> <338E> <8785> <8789> <32A4> <878A> <878B> <3231> <879B> <879C> <2229> <8A7A> <8A7B> <984D> <8B9D> <8B9E> <4EAB> <9659> <965A> <5FD8> <9750> <9751> <7336> <98B1> <98B3> <4E9E> <98DD> <98DE> <4FE4> <9940> <9941> <50C9> <994D> <994E> <5101> <9958> <9959> <513F> <995F> <9960> <5169> <996A> <996B> <5195> <996F> <9971> <51A9> <9973> <9974> <51B1> <998E> <998F> <524B> <99A0> <99A1> <52AC> <99AE> <99AF> <52F8> <99DF> <99E0> <542C> <9A46> <9A47> <54E5> <9A56> <9A57> <5556> <9AA8> <9AA9> <5737> <9ABD> <9ABE> <57D2> <9AE4> <9AE6> <58FB> <9AED> <9AEE> <592C> <9B4B> <9B4C> <59D9> <9B56> <9B57> <5A35> <9B65> <9B66> <5AFA> <9B74> <9B75> <5B5A> <9B92> <9B93> <5C07> <9B99> <9B9A> <5C38> <9BE6> <9BE7> <5E36> <9BF2> <9BF3> <5E75> <9BF8> <9BF9> <5EC1> <9C43> <9C44> <5EDA> <9C47> <9C48> <5EE8> <9C60> <9C61> <5F56> <9CA1> <9CA2> <6096> <9CB3> <9CB4> <60F6> <9CBC> <9CBD> <610D> <9CCC> <9CCE> <6158> <9CF7> <9CF8> <6208> <9D45> <9D46> <6232> <9D52> <9D53> <6292> <9DA9> <9DAA> <64E0> <9DBB> <9DBC> <6534> <9DCA> <9DCB> <6582> <9DD9> <9DDA> <65E0> <9DE1> <9DE2> <6635> <9DEC> <9DED> <6667> <9E4E> <9E4F> <6726> <9E5B> <9E5C> <6763> <9EFB> <9EFC> <6AA2> <9F64> <9F65> <6B78> <9F66> <9F67> <6B7F> <9F6F> <9F70> <6BAA> endbfrange 100 beginbfrange <9F82> <9F83> <6C13> <9FEB> <9FEC> <6ED4> <E0A9> <E0AA> <723B> <E0AB> <E0AC> <723F> <E0C1> <E0C2> <72E0> <E0D0> <E0D1> <734E> <E146> <E147> <74F0> <E164> <E165> <7586> <E17D> <E17E> <75FE> <E184> <E185> <75F2> <E18B> <E18D> <7620> <E192> <E193> <7647> <E197> <E198> <7661> <E199> <E19B> <7668> <E1AA> <E1AB> <7699> <E1AE> <E1B0> <76B8> <E1C2> <E1C3> <7725> <E1C5> <E1C6> <7737> <E1D9> <E1DA> <77BC> <E25A> <E25B> <79B9> <E264> <E265> <7A18> <E270> <E271> <7A61> <E28B> <E28C> <7AD9> <E28E> <E28F> <7AE1> <E298> <E299> <7B18> <E2A9> <E2AA> <7B70> <E386> <E387> <7E59> <E392> <E393> <7E88> <E397> <E398> <7E93> <E39B> <E39C> <7E9B> <E3A0> <E3A2> <7F4C> <E3A3> <E3A4> <7F50> <E3A8> <E3A9> <7F5F> <E3AA> <E3AB> <7F68> <E3C0> <E3C1> <7FC5> <E3CF> <E3D0> <8018> <E448> <E449> <8165> <E466> <E467> <81DF> <E469> <E46A> <81FA> <E46C> <E46D> <8201> <E482> <E483> <826A> <E486> <E487> <8277> <E4AA> <E4AB> <8317> <E4F2> <E4F3> <8517> <E56F> <E570> <86A9> <E571> <E572> <868B> <E5B8> <E5B9> <87F6> <E5DF> <E5E0> <88C3> <E5E2> <E5E3> <88D8> <E5F2> <E5F3> <892A> <E655> <E656> <89BF> <E658> <E659> <89DC> <E674> <E675> <8AA5> <E6A7> <E6A8> <8B92> <E6AA> <E6AB> <8B99> <E6BC> <E6BD> <8C8D> <E6C5> <E6C6> <8CB2> <E6CF> <E6D0> <8CFA> <E6D1> <E6D2> <8D04> <E6EC> <E6ED> <8DEA> <E6F1> <E6F2> <8E08> <E6F4> <E6F5> <8E1D> <E780> <E782> <8F62> <E791> <E792> <8FF9> <E79F> <E7A2> <904F> <E7D4> <E7D5> <91C0> <E7DE> <E7DF> <91F5> <E84D> <E84E> <93AC> <E851> <E852> <93D6> <E87D> <E87E> <9598> <E896> <E897> <962E> <E8AA> <E8AB> <96B1> <E8AF> <E8B0> <96B8> <E8C7> <E8C8> <973D> <E8DD> <E8DE> <978F> <E8E3> <E8E4> <97B3> <E8FB> <E8FC> <986F> <E952> <E953> <991D> <E958> <E959> <993D> <E95F> <E960> <9951> <E963> <E964> <9997> <E966> <E967> <99AD> <E96E> <E96F> <99ED> <E970> <E971> <99F1> <E992> <E993> <9AD3> <E994> <E995> <9ADE> <E996> <E997> <9AE2> <E9A4> <E9A5> <9B22> <E9A7> <E9AA> <9B27> <E9AB> <E9AC> <9B2E> <E9B1> <E9B2> <9B4D> <E9B9> <E9BA> <9B96> <E9BB> <E9BC> <9B9F> <E9C4> <E9C5> <9BD1> <EA40> <EA41> <9D5D> <EA5F> <EA60> <9E1A> <EA67> <EA68> <9E8B> <EA74> <EA76> <9ECE> <EA81> <EA82> <9EF6> <EA84> <EA86> <9EFB> endbfrange 45 beginbfrange <EA87> <EA88> <9F07> <EA92> <EA94> <9F5F> <EA95> <EA96> <9F66> <ED98> <ED99> <5DB8> <EDF7> <EDF8> <7146> <EE61> <EE63> <FA18> <EE83> <EE84> <FA20> <EE97> <EE98> <FA24> <EEA1> <EEA2> <91ED> <EEA3> <EEA4> <91E4> <EEB1> <EEB2> <9277> <EEDA> <EEDB> <FA2A> <EEEF> <EEF8> <2170> <F040> <F07E> <E000> <F080> <F0FC> <E03F> <F140> <F17E> <E0BC> <F180> <F1FC> <E0FB> <F240> <F27E> <E178> <F280> <F2FC> <E1B7> <F340> <F37E> <E234> <F380> <F3FC> <E273> <F440> <F47E> <E2F0> <F480> <F4FC> <E32F> <F540> <F57E> <E3AC> <F580> <F5FC> <E3EB> <F640> <F67E> <E468> <F680> <F6FC> <E4A7> <F740> <F77E> <E524> <F780> <F7FC> <E563> <F840> <F87E> <E5E0> <F880> <F8FC> <E61F> <F940> <F97E> <E69C> <F980> <F9FC> <E6DB> <FA40> <FA49> <2170> <FA4A> <FA53> <2160> <FA9B> <FA9C> <FA0F> <FAB4> <FAB5> <5DB8> <FB56> <FB57> <7146> <FB7D> <FB7E> <FA18> <FB9F> <FBA0> <FA20> <FBB3> <FBB4> <FA24> <FBBD> <FBBE> <91ED> <FBBF> <FBC0> <91E4> <FBCD> <FBCE> <9277> <FBF6> <FBF7> <FA2A> endbfrange endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF \ No newline at end of file
diff --git a/src/main/resources/Resources/cmap/90ms-RKSJ-V b/src/main/resources/Resources/cmap/90ms-RKSJ-V
new file mode 100644
index 0000000..7aba69b
--- /dev/null
+++ b/src/main/resources/Resources/cmap/90ms-RKSJ-V
@@ -0,0 +1 @@
+%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%DocumentNeededResources: CMap (90ms-RKSJ-H) %%IncludeResource: ProcSet (CIDInit) %%IncludeResource: CMap (90ms-RKSJ-H) %%BeginResource: CMap (90ms-RKSJ-V) %%Title: (90ms-RKSJ-V Adobe Japan1 2) %%Version: 11.001 %%Copyright: ----------------------------------------------------------- %%Copyright: Copyright 1990-1998 Adobe Systems Incorporated. %%Copyright: All Rights Reserved. %%Copyright: %%Copyright: Patents Pending %%Copyright: %%Copyright: NOTICE: All information contained herein is the property %%Copyright: of Adobe Systems Incorporated. %%Copyright: %%Copyright: Permission is granted for redistribution of this file %%Copyright: provided this copyright notice is maintained intact and %%Copyright: that the contents of this file are not altered in any %%Copyright: way from its original form. %%Copyright: %%Copyright: PostScript and Display PostScript are trademarks of %%Copyright: Adobe Systems Incorporated which may be registered in %%Copyright: certain jurisdictions. %%Copyright: ----------------------------------------------------------- %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /90ms-RKSJ-H usecmap /CIDSystemInfo 3 dict dup begin /Registry (Adobe) def /Ordering (Japan1) def /Supplement 2 def end def /CMapName /90ms-RKSJ-V def /CMapVersion 11.001 def /CMapType 1 def /UIDOffset 1020 def /XUID [1 10 25344] def /WMode 1 def 78 begincidrange <8141> <8142> 7887 <8143> <8143> 8268 <8144> <8144> 8274 <8150> <8151> 7889 <815b> <815d> 7891 <8160> <8164> 7894 <8169> <817a> 7899 <8181> <8181> 7917 <81a8> <81a8> 739 <81a9> <81a9> 738 <81aa> <81ab> 736 <81ac> <81ac> 8270 <829f> <829f> 7918 <82a1> <82a1> 7919 <82a3> <82a3> 7920 <82a5> <82a5> 7921 <82a7> <82a7> 7922 <82c1> <82c1> 7923 <82e1> <82e1> 7924 <82e3> <82e3> 7925 <82e5> <82e5> 7926 <82ec> <82ec> 7927 <8340> <8340> 7928 <8342> <8342> 7929 <8344> <8344> 7930 <8346> <8346> 7931 <8348> <8348> 7932 <8362> <8362> 7933 <8383> <8383> 7934 <8385> <8385> 7935 <8387> <8387> 7936 <838e> <838e> 7937 <8395> <8396> 7938 <849f> <849f> 7481 <84a0> <84a0> 7479 <84a1> <84a1> 7495 <84a2> <84a2> 7503 <84a3> <84a3> 7499 <84a4> <84a4> 7491 <84a5> <84a5> 7523 <84a6> <84a6> 7515 <84a7> <84a7> 7531 <84a8> <84a8> 7507 <84a9> <84a9> 7539 <84aa> <84aa> 7482 <84ab> <84ab> 7480 <84ac> <84ac> 7498 <84ad> <84ad> 7506 <84ae> <84ae> 7502 <84af> <84af> 7494 <84b0> <84b0> 7530 <84b1> <84b1> 7522 <84b2> <84b2> 7538 <84b3> <84b3> 7514 <84b4> <84b4> 7554 <84b5> <84b5> 7526 <84b6> <84b6> 7519 <84b7> <84b7> 7534 <84b8> <84b8> 7511 <84b9> <84b9> 7545 <84ba> <84ba> 7527 <84bb> <84bb> 7516 <84bc> <84bc> 7535 <84bd> <84bd> 7508 <84be> <84be> 7542 <875f> <8760> 7940 <8761> <8761> 8329 <8762> <8762> 7943 <8763> <8763> 8339 <8764> <8764> 7945 <8765> <8765> 8338 <8766> <8767> 7947 <8768> <8768> 8344 <8769> <876a> 7950 <876b> <876b> 8348 <876c> <876d> 7953 <876e> <876e> 8349 <8780> <8781> 7956 endcidrange endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF \ No newline at end of file
diff --git a/src/main/resources/Resources/cmap/90msp-RKSJ-H b/src/main/resources/Resources/cmap/90msp-RKSJ-H
new file mode 100644
index 0000000..2e02095
--- /dev/null
+++ b/src/main/resources/Resources/cmap/90msp-RKSJ-H
@@ -0,0 +1 @@
+%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%IncludeResource: ProcSet (CIDInit) %%BeginResource: CMap (90msp-RKSJ-H) %%Title: (90msp-RKSJ-H Adobe Japan1 2) %%Version: 11.001 %%Copyright: ----------------------------------------------------------- %%Copyright: Copyright 1990-1998 Adobe Systems Incorporated. %%Copyright: All Rights Reserved. %%Copyright: %%Copyright: Patents Pending %%Copyright: %%Copyright: NOTICE: All information contained herein is the property %%Copyright: of Adobe Systems Incorporated. %%Copyright: %%Copyright: Permission is granted for redistribution of this file %%Copyright: provided this copyright notice is maintained intact and %%Copyright: that the contents of this file are not altered in any %%Copyright: way from its original form. %%Copyright: %%Copyright: PostScript and Display PostScript are trademarks of %%Copyright: Adobe Systems Incorporated which may be registered in %%Copyright: certain jurisdictions. %%Copyright: ----------------------------------------------------------- %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo 3 dict dup begin /Registry (Adobe) def /Ordering (Japan1) def /Supplement 2 def end def /CMapName /90msp-RKSJ-H def /CMapVersion 11.001 def /CMapType 1 def /XUID [1 10 25445] def /WMode 0 def 4 begincodespacerange <00> <80> <8140> <9FFC> <A0> <DF> <E040> <FCFC> endcodespacerange 1 beginnotdefrange <00> <1f> 1 endnotdefrange 100 begincidrange <20> <7e> 1 <8140> <817e> 633 <8180> <81ac> 696 <81b8> <81bf> 741 <81c8> <81ce> 749 <81da> <81e8> 756 <81f0> <81f7> 771 <81fc> <81fc> 779 <824f> <8258> 780 <8260> <8279> 790 <8281> <829a> 816 <829f> <82f1> 842 <8340> <837e> 925 <8380> <8396> 988 <839f> <83b6> 1011 <83bf> <83d6> 1035 <8440> <8460> 1059 <8470> <847e> 1092 <8480> <8491> 1107 <849f> <849f> 7479 <84a0> <84a0> 7481 <84a1> <84a1> 7491 <84a2> <84a2> 7495 <84a3> <84a3> 7503 <84a4> <84a4> 7499 <84a5> <84a5> 7507 <84a6> <84a6> 7523 <84a7> <84a7> 7515 <84a8> <84a8> 7531 <84a9> <84a9> 7539 <84aa> <84aa> 7480 <84ab> <84ab> 7482 <84ac> <84ac> 7494 <84ad> <84ad> 7498 <84ae> <84ae> 7506 <84af> <84af> 7502 <84b0> <84b0> 7514 <84b1> <84b1> 7530 <84b2> <84b2> 7522 <84b3> <84b3> 7538 <84b4> <84b4> 7554 <84b5> <84b5> 7511 <84b6> <84b6> 7526 <84b7> <84b7> 7519 <84b8> <84b8> 7534 <84b9> <84b9> 7542 <84ba> <84ba> 7508 <84bb> <84bb> 7527 <84bc> <84bc> 7516 <84bd> <84bd> 7535 <84be> <84be> 7545 <8740> <875d> 7555 <875f> <8760> 7585 <8761> <8761> 8038 <8762> <8762> 7588 <8763> <8763> 8040 <8764> <8764> 7590 <8765> <8765> 8042 <8766> <8767> 7592 <8768> <8768> 8044 <8769> <876a> 7595 <876b> <876b> 8043 <876c> <876d> 7598 <876e> <876e> 8047 <876f> <8775> 7601 <877e> <877e> 8323 <8780> <8783> 7608 <8784> <8784> 8055 <8785> <878f> 7613 <8790> <8790> 762 <8791> <8791> 761 <8792> <8792> 769 <8793> <8799> 7624 <879a> <879a> 768 <879b> <879c> 7631 <889f> <88fc> 1125 <8940> <897e> 1219 <8980> <89fc> 1282 <8a40> <8a7e> 1407 <8a80> <8afc> 1470 <8b40> <8b7e> 1595 <8b80> <8bfc> 1658 <8c40> <8c7e> 1783 <8c80> <8cfc> 1846 <8d40> <8d7e> 1971 <8d80> <8dfc> 2034 <8e40> <8e7e> 2159 <8e80> <8efc> 2222 <8f40> <8f7e> 2347 <8f80> <8ffc> 2410 <9040> <907e> 2535 <9080> <90fc> 2598 <9140> <917e> 2723 <9180> <91fc> 2786 <9240> <927e> 2911 <9280> <92fc> 2974 <9340> <937e> 3099 <9380> <93fc> 3162 <9440> <947e> 3287 <9480> <94fc> 3350 endcidrange 70 begincidrange <9540> <957e> 3475 <9580> <95fc> 3538 <9640> <967e> 3663 <9680> <96fc> 3726 <9740> <977e> 3851 <9780> <97fc> 3914 <9840> <9872> 4039 <989f> <98fc> 4090 <9940> <997e> 4184 <9980> <99fc> 4247 <9a40> <9a7e> 4372 <9a80> <9afc> 4435 <9b40> <9b7e> 4560 <9b80> <9bfc> 4623 <9c40> <9c7e> 4748 <9c80> <9cfc> 4811 <9d40> <9d7e> 4936 <9d80> <9dfc> 4999 <9e40> <9e7e> 5124 <9e80> <9efc> 5187 <9f40> <9f7e> 5312 <9f80> <9ffc> 5375 <a0> <df> 326 <e040> <e07e> 5500 <e080> <e0fc> 5563 <e140> <e17e> 5688 <e180> <e1fc> 5751 <e240> <e27e> 5876 <e280> <e2fc> 5939 <e340> <e37e> 6064 <e380> <e3fc> 6127 <e440> <e47e> 6252 <e480> <e4fc> 6315 <e540> <e57e> 6440 <e580> <e5fc> 6503 <e640> <e67e> 6628 <e680> <e6fc> 6691 <e740> <e77e> 6816 <e780> <e7fc> 6879 <e840> <e87e> 7004 <e880> <e8fc> 7067 <e940> <e97e> 7192 <e980> <e9fc> 7255 <ea40> <ea7e> 7380 <ea80> <eaa2> 7443 <eaa3> <eaa4> 8284 <ed40> <ed7e> 8359 <ed80> <edb3> 8422 <edb4> <edb4> 1993 <edb5> <edfc> 8474 <ee40> <ee7e> 8546 <ee80> <eeec> 8609 <eeef> <eef8> 8092 <eef9> <eef9> 751 <eefa> <eefc> 8005 <fa40> <fa49> 8092 <fa4a> <fa53> 7575 <fa54> <fa54> 751 <fa55> <fa57> 8005 <fa58> <fa58> 7618 <fa59> <fa59> 7610 <fa5a> <fa5a> 8055 <fa5b> <fa5b> 768 <fa5c> <fa7e> 8359 <fa80> <facf> 8394 <fad0> <fad0> 1993 <fad1> <fafc> 8474 <fb40> <fb7e> 8518 <fb80> <fbfc> 8581 <fc40> <fc4b> 8706 endcidrange endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF \ No newline at end of file
diff --git a/src/main/resources/Resources/cmap/90msp-RKSJ-V b/src/main/resources/Resources/cmap/90msp-RKSJ-V
new file mode 100644
index 0000000..ad598aa
--- /dev/null
+++ b/src/main/resources/Resources/cmap/90msp-RKSJ-V
@@ -0,0 +1 @@
+%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%DocumentNeededResources: CMap (90msp-RKSJ-H) %%IncludeResource: ProcSet (CIDInit) %%IncludeResource: CMap (90msp-RKSJ-H) %%BeginResource: CMap (90msp-RKSJ-V) %%Title: (90msp-RKSJ-V Adobe Japan1 2) %%Version: 11.001 %%Copyright: ----------------------------------------------------------- %%Copyright: Copyright 1990-1998 Adobe Systems Incorporated. %%Copyright: All Rights Reserved. %%Copyright: %%Copyright: Patents Pending %%Copyright: %%Copyright: NOTICE: All information contained herein is the property %%Copyright: of Adobe Systems Incorporated. %%Copyright: %%Copyright: Permission is granted for redistribution of this file %%Copyright: provided this copyright notice is maintained intact and %%Copyright: that the contents of this file are not altered in any %%Copyright: way from its original form. %%Copyright: %%Copyright: PostScript and Display PostScript are trademarks of %%Copyright: Adobe Systems Incorporated which may be registered in %%Copyright: certain jurisdictions. %%Copyright: ----------------------------------------------------------- %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /90msp-RKSJ-H usecmap /CIDSystemInfo 3 dict dup begin /Registry (Adobe) def /Ordering (Japan1) def /Supplement 2 def end def /CMapName /90msp-RKSJ-V def /CMapVersion 11.001 def /CMapType 1 def /XUID [1 10 25446] def /WMode 1 def 78 begincidrange <8141> <8142> 7887 <8143> <8143> 8268 <8144> <8144> 8274 <8150> <8151> 7889 <815b> <815d> 7891 <8160> <8164> 7894 <8169> <817a> 7899 <8181> <8181> 7917 <81a8> <81a8> 739 <81a9> <81a9> 738 <81aa> <81ab> 736 <81ac> <81ac> 8270 <829f> <829f> 7918 <82a1> <82a1> 7919 <82a3> <82a3> 7920 <82a5> <82a5> 7921 <82a7> <82a7> 7922 <82c1> <82c1> 7923 <82e1> <82e1> 7924 <82e3> <82e3> 7925 <82e5> <82e5> 7926 <82ec> <82ec> 7927 <8340> <8340> 7928 <8342> <8342> 7929 <8344> <8344> 7930 <8346> <8346> 7931 <8348> <8348> 7932 <8362> <8362> 7933 <8383> <8383> 7934 <8385> <8385> 7935 <8387> <8387> 7936 <838e> <838e> 7937 <8395> <8396> 7938 <849f> <849f> 7481 <84a0> <84a0> 7479 <84a1> <84a1> 7495 <84a2> <84a2> 7503 <84a3> <84a3> 7499 <84a4> <84a4> 7491 <84a5> <84a5> 7523 <84a6> <84a6> 7515 <84a7> <84a7> 7531 <84a8> <84a8> 7507 <84a9> <84a9> 7539 <84aa> <84aa> 7482 <84ab> <84ab> 7480 <84ac> <84ac> 7498 <84ad> <84ad> 7506 <84ae> <84ae> 7502 <84af> <84af> 7494 <84b0> <84b0> 7530 <84b1> <84b1> 7522 <84b2> <84b2> 7538 <84b3> <84b3> 7514 <84b4> <84b4> 7554 <84b5> <84b5> 7526 <84b6> <84b6> 7519 <84b7> <84b7> 7534 <84b8> <84b8> 7511 <84b9> <84b9> 7545 <84ba> <84ba> 7527 <84bb> <84bb> 7516 <84bc> <84bc> 7535 <84bd> <84bd> 7508 <84be> <84be> 7542 <875f> <8760> 7940 <8761> <8761> 8329 <8762> <8762> 7943 <8763> <8763> 8339 <8764> <8764> 7945 <8765> <8765> 8338 <8766> <8767> 7947 <8768> <8768> 8344 <8769> <876a> 7950 <876b> <876b> 8348 <876c> <876d> 7953 <876e> <876e> 8349 <8780> <8781> 7956 endcidrange endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF \ No newline at end of file
diff --git a/src/main/resources/Resources/cmap/90pv-RKSJ-H b/src/main/resources/Resources/cmap/90pv-RKSJ-H
new file mode 100644
index 0000000..0edce80
--- /dev/null
+++ b/src/main/resources/Resources/cmap/90pv-RKSJ-H
@@ -0,0 +1 @@
+%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%IncludeResource: ProcSet (CIDInit) %%BeginResource: CMap (90pv-RKSJ-H) %%Title: (90pv-RKSJ-H Adobe Japan1 1) %%Version: 10.001 %%Copyright: ----------------------------------------------------------- %%Copyright: Copyright 1990-1998 Adobe Systems Incorporated. %%Copyright: All Rights Reserved. %%Copyright: %%Copyright: Patents Pending %%Copyright: %%Copyright: NOTICE: All information contained herein is the property %%Copyright: of Adobe Systems Incorporated. %%Copyright: %%Copyright: Permission is granted for redistribution of this file %%Copyright: provided this copyright notice is maintained intact and %%Copyright: that the contents of this file are not altered in any %%Copyright: way from its original form. %%Copyright: %%Copyright: PostScript and Display PostScript are trademarks of %%Copyright: Adobe Systems Incorporated which may be registered in %%Copyright: certain jurisdictions. %%Copyright: ----------------------------------------------------------- %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo 3 dict dup begin /Registry (Adobe) def /Ordering (Japan1) def /Supplement 1 def end def /CMapName /90pv-RKSJ-H def /CMapVersion 10.001 def /CMapType 1 def /UIDOffset 870 def /XUID [1 10 25341] def /WMode 0 def 5 begincodespacerange <00> <80> <8140> <9FFC> <A0> <DF> <E040> <FCFC> <FD> <FF> endcodespacerange 1 beginnotdefrange <00> <1f> 1 endnotdefrange 100 begincidrange <20> <7e> 1 <80> <80> 97 <8140> <817e> 633 <8180> <81ac> 696 <81b8> <81bf> 741 <81c8> <81ce> 749 <81da> <81e8> 756 <81f0> <81f7> 771 <81fc> <81fc> 779 <824f> <8258> 780 <8260> <8279> 790 <8281> <829a> 816 <829f> <82f1> 842 <8340> <837e> 925 <8380> <8396> 988 <839f> <83b6> 1011 <83bf> <83d6> 1035 <8440> <8460> 1059 <8470> <847e> 1092 <8480> <8491> 1107 <849f> <849f> 7479 <84a0> <84a0> 7481 <84a1> <84a1> 7491 <84a2> <84a2> 7495 <84a3> <84a3> 7503 <84a4> <84a4> 7499 <84a5> <84a5> 7507 <84a6> <84a6> 7523 <84a7> <84a7> 7515 <84a8> <84a8> 7531 <84a9> <84a9> 7539 <84aa> <84aa> 7480 <84ab> <84ab> 7482 <84ac> <84ac> 7494 <84ad> <84ad> 7498 <84ae> <84ae> 7506 <84af> <84af> 7502 <84b0> <84b0> 7514 <84b1> <84b1> 7530 <84b2> <84b2> 7522 <84b3> <84b3> 7538 <84b4> <84b4> 7554 <84b5> <84b5> 7511 <84b6> <84b6> 7526 <84b7> <84b7> 7519 <84b8> <84b8> 7534 <84b9> <84b9> 7542 <84ba> <84ba> 7508 <84bb> <84bb> 7527 <84bc> <84bc> 7516 <84bd> <84bd> 7535 <84be> <84be> 7545 <8540> <8553> 7555 <855e> <8571> 8071 <857c> <857e> 8286 <8580> <8585> 8289 <8591> <859a> 8061 <859f> <85a8> 7575 <85a9> <85aa> 8225 <85ab> <85ad> 8295 <85b3> <85bc> 8092 <85bd> <85c1> 8298 <85db> <85f4> 8112 <8640> <8640> 7601 <8641> <8641> 8186 <8642> <8642> 7602 <8643> <8643> 8020 <8644> <8644> 8022 <8645> <8645> 8303 <8646> <8646> 7607 <8647> <8647> 8023 <8648> <8648> 7603 <8649> <8649> 8021 <864a> <864a> 7604 <864b> <864b> 8304 <864c> <864d> 7605 <864e> <864e> 8037 <864f> <8655> 8024 <8656> <8656> 8305 <8657> <8657> 8036 <8658> <8659> 8034 <865a> <865c> 8031 <865d> <865d> 8306 <869b> <869d> 7610 <869e> <869e> 8307 <869f> <869f> 8018 <86a0> <86a1> 8016 <86a2> <86a2> 8019 <86a3> <86a3> 8211 <86a4> <86a4> 8213 <86a5> <86a5> 8212 <86a6> <86a6> 8214 <86b3> <86b3> 8058 <86b4> <86b4> 8056 <86b5> <86b5> 8308 <86c7> <86ca> 8219 <86cb> <86ce> 8309 <86cf> <86cf> 8014 <86d0> <86d0> 8013 <86d1> <86d1> 8012 endcidrange 100 begincidrange <86d2> <86d2> 8011 <86d3> <86d6> 8206 <8740> <8746> 8197 <8747> <8747> 8150 <8748> <8748> 8204 <8749> <8749> 8145 <874a> <874a> 8138 <874b> <874b> 7620 <874c> <874c> 8151 <874d> <874d> 7618 <874e> <874e> 8146 <874f> <874f> 8141 <8750> <8750> 7619 <8751> <8751> 8149 <8752> <8752> 8147 <8753> <8753> 8143 <8754> <8754> 8148 <8755> <8755> 8144 <8756> <8757> 8139 <8758> <8758> 8142 <8791> <8792> 8317 <8793> <8797> 7613 <8798> <8798> 8154 <8799> <8799> 8165 <879a> <879a> 8319 <879b> <879b> 8158 <879c> <879c> 8191 <879d> <879d> 8320 <879e> <879e> 8223 <879f> <879f> 7585 <87a0> <87a0> 8038 <87a1> <87a1> 7588 <87a2> <87a2> 7586 <87a3> <87a3> 8039 <87a4> <87a4> 8183 <87a5> <87a6> 8327 <87a7> <87a7> 8042 <87a8> <87a8> 7592 <87a9> <87aa> 8040 <87ab> <87ab> 7590 <87ac> <87ac> 7593 <87ad> <87ad> 7599 <87ae> <87ae> 8046 <87af> <87af> 8044 <87b0> <87b0> 7595 <87b1> <87b1> 8045 <87b2> <87b2> 8043 <87b3> <87b3> 7596 <87b4> <87b4> 8047 <87b5> <87b5> 7598 <87bd> <87bd> 8048 <87be> <87bf> 8051 <87c0> <87c1> 8049 <87e5> <87e7> 7621 <87e8> <87e8> 8323 <87fa> <87fa> 8054 <87fb> <87fc> 8321 <8840> <8840> 7624 <8841> <8842> 7629 <8854> <8855> 7608 <8868> <8868> 7958 <886a> <886d> 8313 <889f> <88fc> 1125 <8940> <897e> 1219 <8980> <89fc> 1282 <8a40> <8a7e> 1407 <8a80> <8afc> 1470 <8b40> <8b7e> 1595 <8b80> <8bfc> 1658 <8c40> <8c7e> 1783 <8c80> <8cfc> 1846 <8d40> <8d7e> 1971 <8d80> <8dfc> 2034 <8e40> <8e7e> 2159 <8e80> <8efc> 2222 <8f40> <8f7e> 2347 <8f80> <8ffc> 2410 <9040> <907e> 2535 <9080> <90fc> 2598 <9140> <917e> 2723 <9180> <91fc> 2786 <9240> <927e> 2911 <9280> <92fc> 2974 <9340> <937e> 3099 <9380> <93fc> 3162 <9440> <947e> 3287 <9480> <94fc> 3350 <9540> <957e> 3475 <9580> <95fc> 3538 <9640> <967e> 3663 <9680> <96fc> 3726 <9740> <977e> 3851 <9780> <97fc> 3914 <9840> <9872> 4039 <989f> <98fc> 4090 <9940> <997e> 4184 <9980> <99fc> 4247 <9a40> <9a7e> 4372 <9a80> <9afc> 4435 <9b40> <9b7e> 4560 endcidrange 63 begincidrange <9b80> <9bfc> 4623 <9c40> <9c7e> 4748 <9c80> <9cfc> 4811 <9d40> <9d7e> 4936 <9d80> <9dfc> 4999 <9e40> <9e7e> 5124 <9e80> <9efc> 5187 <9f40> <9f7e> 5312 <9f80> <9ffc> 5375 <a0> <df> 326 <e040> <e07e> 5500 <e080> <e0fc> 5563 <e140> <e17e> 5688 <e180> <e1fc> 5751 <e240> <e27e> 5876 <e280> <e2fc> 5939 <e340> <e37e> 6064 <e380> <e3fc> 6127 <e440> <e47e> 6252 <e480> <e4fc> 6315 <e540> <e57e> 6440 <e580> <e5fc> 6503 <e640> <e67e> 6628 <e680> <e6fc> 6691 <e740> <e77e> 6816 <e780> <e7fc> 6879 <e840> <e87e> 7004 <e880> <e8fc> 7067 <e940> <e97e> 7192 <e980> <e9fc> 7255 <ea40> <ea7e> 7380 <ea80> <eaa2> 7443 <eaa3> <eaa4> 8284 <eb41> <eb42> 7887 <eb50> <eb51> 7889 <eb5b> <eb5d> 7891 <eb60> <eb64> 7894 <eb69> <eb7a> 7899 <eb81> <eb81> 7917 <ec9f> <ec9f> 7918 <eca1> <eca1> 7919 <eca3> <eca3> 7920 <eca5> <eca5> 7921 <eca7> <eca7> 7922 <ecc1> <ecc1> 7923 <ece1> <ece1> 7924 <ece3> <ece3> 7925 <ece5> <ece5> 7926 <ecec> <ecec> 7927 <ed40> <ed40> 7928 <ed42> <ed42> 7929 <ed44> <ed44> 7930 <ed46> <ed46> 7931 <ed48> <ed48> 7932 <ed62> <ed62> 7933 <ed83> <ed83> 7934 <ed85> <ed85> 7935 <ed87> <ed87> 7936 <ed8e> <ed8e> 7937 <ed95> <ed96> 7938 <fd> <fd> 152 <fe> <fe> 228 <ff> <ff> 124 endcidrange endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF \ No newline at end of file
diff --git a/src/main/resources/Resources/cmap/90pv-RKSJ-UCS2 b/src/main/resources/Resources/cmap/90pv-RKSJ-UCS2
new file mode 100644
index 0000000..55a2f99
--- /dev/null
+++ b/src/main/resources/Resources/cmap/90pv-RKSJ-UCS2
@@ -0,0 +1 @@
+%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%DocumentNeededResources: CMap (90pv-RKSJ-UCS2C) %%IncludeResource: ProcSet (CIDInit) %%IncludeResource: CMap (90pv-RKSJ-UCS2C) %%BeginResource: CMap (90pv-RKSJ-UCS2) %%Title: (90pv-RKSJ-UCS2) %%Version: 4.002 %%Copyright: ----------------------------------------------------------- %%Copyright: Copyright 1990-1997 Adobe Systems Incorporated. %%Copyright: All Rights Reserved. %%Copyright: %%Copyright: Patents Pending %%Copyright: %%Copyright: NOTICE: All information contained herein is the property %%Copyright: of Adobe Systems Incorporated. %%Copyright: %%Copyright: Permission is granted for redistribution of this file %%Copyright: provided this copyright notice is maintained intact and %%Copyright: that the contents of this file are not altered in any %%Copyright: way from its original form. %%Copyright: %%Copyright: PostScript and Display PostScript are trademarks of %%Copyright: Adobe Systems Incorporated which may be registered in %%Copyright: certain jurisdictions. %%Copyright: ----------------------------------------------------------- %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /90pv-RKSJ-UCS2C usecmap /CIDSystemInfo 3 dict dup begin /Registry (Adobe) def /Ordering (90pv_RKSJ_UCS2) def /Supplement 2 def end def /CMapName /90pv-RKSJ-UCS2 def /CMapVersion 4.002 def /CMapType 1 def /WMode 0 def 18 beginbfrange <8591> <8591> <f8600030002e> <85ab> <85ab> <f8620058004900490049> <85ac> <85ac> <f861005800490056> <85ad> <85ad> <f86000580056> <85bf> <85bf> <f8620078006900690069> <85c0> <85c0> <f861007800690076> <85c1> <85c1> <f86000780076> <865d> <865d> <f86000540042> <869e> <869e> <f861004600410058> <86d4> <86d4> <21e6f87a> <86d5> <86d5> <21e7f87a> <86d6> <86d6> <21e9f87a> <86ce> <86ce> <f86021932191> <8791> <8791> <592720dd> <8792> <8792> <5c0f20dd> <879d> <879d> <63a720dd> <87fb> <87fb> <f862670996504f1a793e> <87fc> <87fc> <f8628ca156e36cd54eba> endbfrange endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF \ No newline at end of file
diff --git a/src/main/resources/Resources/cmap/90pv-RKSJ-UCS2C b/src/main/resources/Resources/cmap/90pv-RKSJ-UCS2C
new file mode 100644
index 0000000..11fb957
--- /dev/null
+++ b/src/main/resources/Resources/cmap/90pv-RKSJ-UCS2C
@@ -0,0 +1 @@
+%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%IncludeResource: ProcSet (CIDInit) %%BeginResource: CMap (90pv-RKSJ-UCS2C) %%Title: (90pv-RKSJ-UCS2C) %%Version: 12.000 %%Copyright: ----------------------------------------------------------- %%Copyright: Copyright 1990-2000 Adobe Systems Incorporated. %%Copyright: All Rights Reserved. %%Copyright: %%Copyright: Patents Pending %%Copyright: %%Copyright: NOTICE: All information contained herein is the property %%Copyright: of Adobe Systems Incorporated. %%Copyright: %%Copyright: Permission is granted for redistribution of this file %%Copyright: provided this copyright notice is maintained intact and %%Copyright: that the contents of this file are not altered in any %%Copyright: way from its original form. %%Copyright: %%Copyright: PostScript and Display PostScript are trademarks of %%Copyright: Adobe Systems Incorporated which may be registered in %%Copyright: certain jurisdictions. %%Copyright: ----------------------------------------------------------- %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo 3 dict dup begin /Registry (Adobe) def /Ordering (90pv_RKSJ_UCS2C) def /Supplement 2 def end def /CMapName /90pv-RKSJ-UCS2C def /CMapVersion 12.000 def /CMapType 1 def /WMode 0 def 5 begincodespacerange <00> <80> <8140> <9FFC> <A0> <DF> <E040> <FCFC> <FD> <FF> endcodespacerange 100 beginbfchar <5C> <00A5> <80> <005C> <A0> <00A0> <FD> <00A9> <FE> <2122> <FF> <2026> <8143> <FF0C> <8144> <FF0E> <8145> <30FB> <8148> <FF1F> <8149> <FF01> <814C> <00B4> <814D> <FF40> <814E> <00A8> <814F> <FF3E> <8150> <203E> <8151> <FF3F> <8156> <3003> <8157> <4EDD> <815B> <30FC> <815C> <2015> <815D> <2010> <815E> <FF0F> <815F> <FF3C> <8160> <301C> <8161> <2016> <8162> <FF5C> <8163> <2026> <8164> <2025> <816D> <FF3B> <816E> <FF3D> <816F> <FF5B> <8170> <FF5D> <817B> <FF0B> <817C> <2212> <817D> <00B1> <817E> <00D7> <8180> <00F7> <8181> <FF1D> <8182> <2260> <8183> <FF1C> <8184> <FF1E> <8187> <221E> <8188> <2234> <8189> <2642> <818A> <2640> <818B> <00B0> <818E> <2103> <818F> <FFE5> <8190> <FF04> <8193> <FF05> <8194> <FF03> <8195> <FF06> <8196> <FF0A> <8197> <FF20> <8198> <00A7> <8199> <2606> <819A> <2605> <819B> <25CB> <819C> <25CF> <819D> <25CE> <819E> <25C7> <819F> <25C6> <81A0> <25A1> <81A1> <25A0> <81A2> <25B3> <81A3> <25B2> <81A4> <25BD> <81A5> <25BC> <81A6> <203B> <81A7> <3012> <81A8> <2192> <81AB> <2193> <81AC> <3013> <81B8> <2208> <81B9> <220B> <81BE> <222A> <81BF> <2229> <81CA> <00AC> <81CB> <21D2> <81CC> <21D4> <81CD> <2200> <81CE> <2203> <81DA> <2220> <81DB> <22A5> <81DC> <2312> <81DD> <2202> <81DE> <2207> <81DF> <2261> <81E0> <2252> <81E3> <221A> <81E4> <223D> <81E5> <221D> <81E6> <2235> <81F0> <212B> <81F1> <2030> <81F2> <266F> <81F3> <266D> <81F4> <266A> <81F7> <00B6> endbfchar 100 beginbfchar <81FC> <25EF> <8446> <0401> <8476> <0451> <849F> <2500> <84A0> <2502> <84A1> <250C> <84A2> <2510> <84A3> <2518> <84A4> <2514> <84A5> <251C> <84A6> <252C> <84A7> <2524> <84A8> <2534> <84A9> <253C> <84AA> <2501> <84AB> <2503> <84AC> <250F> <84AD> <2513> <84AE> <251B> <84AF> <2517> <84B0> <2523> <84B1> <2533> <84B2> <252B> <84B3> <253B> <84B4> <254B> <84B5> <2520> <84B6> <252F> <84B7> <2528> <84B8> <2537> <84B9> <253F> <84BA> <251D> <84BB> <2530> <84BC> <2525> <84BD> <2538> <84BE> <2542> <8640> <339C> <8641> <339F> <8642> <339D> <8643> <33A0> <8644> <33A4> <8645> <217F> <8646> <33A1> <8647> <33A5> <8648> <339E> <8649> <33A2> <864A> <338E> <864B> <210A> <864C> <338F> <864D> <33C4> <8650> <2113> <8651> <3398> <8652> <33B3> <8653> <33B2> <8654> <33B1> <8655> <33B0> <8656> <2109> <8657> <33D4> <8658> <33CB> <8659> <3390> <869B> <2116> <869C> <33CD> <869D> <2121> <869F> <2664> <86A0> <2667> <86A3> <2660> <86A4> <2663> <86B3> <3020> <86B4> <260E> <86B5> <3004> <86C7> <261E> <86CA> <261F> <86CB> <21C6> <86CF> <21E8> <86D2> <21E9> <86D3> <27A1> <86D6> <21E9> <8740> <3230> <8747> <3240> <8748> <3237> <874D> <3231> <874E> <323E> <874F> <3234> <8750> <3232> <8751> <323B> <8752> <3236> <8753> <3233> <8754> <3235> <8757> <323F> <8758> <3238> <8799> <3296> <879A> <329D> <879B> <3298> <879C> <329E> <879E> <3299> <879F> <3349> <87A0> <3322> <87A1> <334D> <87A2> <3314> <87A3> <3316> <87A4> <3305> endbfchar 100 beginbfchar <87A5> <3333> <87A6> <334E> <87A7> <3303> <87A8> <3336> <87A9> <3318> <87AA> <3315> <87AB> <3327> <87AC> <3351> <87AD> <334A> <87AE> <3339> <87AF> <3357> <87B0> <330D> <87B1> <3342> <87B2> <3323> <87B3> <3326> <87B4> <333B> <87B5> <332B> <87BD> <3300> <87BE> <331E> <87BF> <332A> <87C0> <3331> <87C1> <3347> <87E5> <337E> <87E6> <337D> <87E7> <337C> <87E8> <337B> <87FA> <337F> <8840> <222E> <8841> <221F> <8842> <22BF> <8854> <301D> <8855> <301F> <8868> <3094> <889F> <4E9C> <88A0> <5516> <88A1> <5A03> <88A2> <963F> <88A3> <54C0> <88A4> <611B> <88A5> <6328> <88A6> <59F6> <88A7> <9022> <88A8> <8475> <88A9> <831C> <88AA> <7A50> <88AB> <60AA> <88AC> <63E1> <88AD> <6E25> <88AE> <65ED> <88AF> <8466> <88B0> <82A6> <88B1> <9BF5> <88B2> <6893> <88B3> <5727> <88B4> <65A1> <88B5> <6271> <88B6> <5B9B> <88B7> <59D0> <88B8> <867B> <88B9> <98F4> <88BA> <7D62> <88BB> <7DBE> <88BC> <9B8E> <88BD> <6216> <88BE> <7C9F> <88BF> <88B7> <88C0> <5B89> <88C1> <5EB5> <88C2> <6309> <88C3> <6697> <88C4> <6848> <88C5> <95C7> <88C6> <978D> <88C7> <674F> <88C8> <4EE5> <88C9> <4F0A> <88CA> <4F4D> <88CB> <4F9D> <88CC> <5049> <88CD> <56F2> <88CE> <5937> <88CF> <59D4> <88D0> <5A01> <88D1> <5C09> <88D2> <60DF> <88D3> <610F> <88D4> <6170> <88D5> <6613> <88D6> <6905> <88D7> <70BA> <88D8> <754F> <88D9> <7570> <88DA> <79FB> <88DB> <7DAD> <88DC> <7DEF> <88DD> <80C3> <88DE> <840E> <88DF> <8863> <88E0> <8B02> <88E1> <9055> endbfchar 100 beginbfchar <88E2> <907A> <88E3> <533B> <88E4> <4E95> <88E5> <4EA5> <88E6> <57DF> <88E7> <80B2> <88E8> <90C1> <88E9> <78EF> <88EA> <4E00> <88EB> <58F1> <88EC> <6EA2> <88ED> <9038> <88EE> <7A32> <88EF> <8328> <88F0> <828B> <88F1> <9C2F> <88F2> <5141> <88F3> <5370> <88F4> <54BD> <88F5> <54E1> <88F6> <56E0> <88F7> <59FB> <88F8> <5F15> <88F9> <98F2> <88FA> <6DEB> <88FB> <80E4> <88FC> <852D> <8940> <9662> <8941> <9670> <8942> <96A0> <8943> <97FB> <8944> <540B> <8945> <53F3> <8946> <5B87> <8947> <70CF> <8948> <7FBD> <8949> <8FC2> <894A> <96E8> <894B> <536F> <894C> <9D5C> <894D> <7ABA> <894E> <4E11> <894F> <7893> <8950> <81FC> <8951> <6E26> <8952> <5618> <8953> <5504> <8954> <6B1D> <8955> <851A> <8956> <9C3B> <8957> <59E5> <8958> <53A9> <8959> <6D66> <895A> <74DC> <895B> <958F> <895C> <5642> <895D> <4E91> <895E> <904B> <895F> <96F2> <8960> <834F> <8961> <990C> <8962> <53E1> <8963> <55B6> <8964> <5B30> <8965> <5F71> <8966> <6620> <8967> <66F3> <8968> <6804> <8969> <6C38> <896A> <6CF3> <896B> <6D29> <896C> <745B> <896D> <76C8> <896E> <7A4E> <896F> <9834> <8970> <82F1> <8971> <885B> <8972> <8A60> <8973> <92ED> <8974> <6DB2> <8975> <75AB> <8976> <76CA> <8977> <99C5> <8978> <60A6> <8979> <8B01> <897A> <8D8A> <897B> <95B2> <897C> <698E> <897D> <53AD> <897E> <5186> <8980> <5712> <8981> <5830> <8982> <5944> <8983> <5BB4> <8984> <5EF6> <8985> <6028> <8986> <63A9> <8987> <63F4> <8988> <6CBF> <8989> <6F14> endbfchar 100 beginbfchar <898A> <708E> <898B> <7114> <898C> <7159> <898D> <71D5> <898E> <733F> <898F> <7E01> <8990> <8276> <8991> <82D1> <8992> <8597> <8993> <9060> <8994> <925B> <8995> <9D1B> <8996> <5869> <8997> <65BC> <8998> <6C5A> <8999> <7525> <899A> <51F9> <899B> <592E> <899C> <5965> <899D> <5F80> <899E> <5FDC> <899F> <62BC> <89A0> <65FA> <89A1> <6A2A> <89A2> <6B27> <89A3> <6BB4> <89A4> <738B> <89A5> <7FC1> <89A6> <8956> <89A7> <9D2C> <89A8> <9D0E> <89A9> <9EC4> <89AA> <5CA1> <89AB> <6C96> <89AC> <837B> <89AD> <5104> <89AE> <5C4B> <89AF> <61B6> <89B0> <81C6> <89B1> <6876> <89B2> <7261> <89B3> <4E59> <89B4> <4FFA> <89B5> <5378> <89B6> <6069> <89B7> <6E29> <89B8> <7A4F> <89B9> <97F3> <89BA> <4E0B> <89BB> <5316> <89BC> <4EEE> <89BD> <4F55> <89BE> <4F3D> <89BF> <4FA1> <89C0> <4F73> <89C1> <52A0> <89C2> <53EF> <89C3> <5609> <89C4> <590F> <89C5> <5AC1> <89C6> <5BB6> <89C7> <5BE1> <89C8> <79D1> <89C9> <6687> <89CA> <679C> <89CB> <67B6> <89CC> <6B4C> <89CD> <6CB3> <89CE> <706B> <89CF> <73C2> <89D0> <798D> <89D1> <79BE> <89D2> <7A3C> <89D3> <7B87> <89D4> <82B1> <89D5> <82DB> <89D6> <8304> <89D7> <8377> <89D8> <83EF> <89D9> <83D3> <89DA> <8766> <89DB> <8AB2> <89DC> <5629> <89DD> <8CA8> <89DE> <8FE6> <89DF> <904E> <89E0> <971E> <89E1> <868A> <89E2> <4FC4> <89E3> <5CE8> <89E4> <6211> <89E5> <7259> <89E6> <753B> <89E7> <81E5> <89E8> <82BD> <89E9> <86FE> <89EA> <8CC0> <89EB> <96C5> <89EC> <9913> <89ED> <99D5> endbfchar 100 beginbfchar <89EE> <4ECB> <89EF> <4F1A> <89F0> <89E3> <89F1> <56DE> <89F2> <584A> <89F3> <58CA> <89F4> <5EFB> <89F5> <5FEB> <89F6> <602A> <89F7> <6094> <89F8> <6062> <89F9> <61D0> <89FA> <6212> <89FB> <62D0> <89FC> <6539> <8A40> <9B41> <8A41> <6666> <8A42> <68B0> <8A43> <6D77> <8A44> <7070> <8A45> <754C> <8A46> <7686> <8A47> <7D75> <8A48> <82A5> <8A49> <87F9> <8A4A> <958B> <8A4B> <968E> <8A4C> <8C9D> <8A4D> <51F1> <8A4E> <52BE> <8A4F> <5916> <8A50> <54B3> <8A51> <5BB3> <8A52> <5D16> <8A53> <6168> <8A54> <6982> <8A55> <6DAF> <8A56> <788D> <8A57> <84CB> <8A58> <8857> <8A59> <8A72> <8A5A> <93A7> <8A5B> <9AB8> <8A5C> <6D6C> <8A5D> <99A8> <8A5E> <86D9> <8A5F> <57A3> <8A60> <67FF> <8A61> <86CE> <8A62> <920E> <8A63> <5283> <8A64> <5687> <8A65> <5404> <8A66> <5ED3> <8A67> <62E1> <8A68> <64B9> <8A69> <683C> <8A6A> <6838> <8A6B> <6BBB> <8A6C> <7372> <8A6D> <78BA> <8A6E> <7A6B> <8A6F> <899A> <8A70> <89D2> <8A71> <8D6B> <8A72> <8F03> <8A73> <90ED> <8A74> <95A3> <8A75> <9694> <8A76> <9769> <8A77> <5B66> <8A78> <5CB3> <8A79> <697D> <8A7C> <639B> <8A7D> <7B20> <8A7E> <6A2B> <8A80> <6A7F> <8A81> <68B6> <8A82> <9C0D> <8A83> <6F5F> <8A84> <5272> <8A85> <559D> <8A86> <6070> <8A87> <62EC> <8A88> <6D3B> <8A89> <6E07> <8A8A> <6ED1> <8A8B> <845B> <8A8C> <8910> <8A8D> <8F44> <8A8E> <4E14> <8A8F> <9C39> <8A90> <53F6> <8A91> <691B> <8A92> <6A3A> <8A93> <9784> <8A94> <682A> <8A95> <515C> <8A96> <7AC3> <8A97> <84B2> endbfchar 100 beginbfchar <8A98> <91DC> <8A99> <938C> <8A9A> <565B> <8A9B> <9D28> <8A9C> <6822> <8A9D> <8305> <8A9E> <8431> <8A9F> <7CA5> <8AA0> <5208> <8AA1> <82C5> <8AA2> <74E6> <8AA3> <4E7E> <8AA4> <4F83> <8AA5> <51A0> <8AA6> <5BD2> <8AA7> <520A> <8AA8> <52D8> <8AA9> <52E7> <8AAA> <5DFB> <8AAB> <559A> <8AAC> <582A> <8AAD> <59E6> <8AAE> <5B8C> <8AAF> <5B98> <8AB0> <5BDB> <8AB1> <5E72> <8AB2> <5E79> <8AB3> <60A3> <8AB4> <611F> <8AB5> <6163> <8AB6> <61BE> <8AB7> <63DB> <8AB8> <6562> <8AB9> <67D1> <8ABA> <6853> <8ABB> <68FA> <8ABC> <6B3E> <8ABD> <6B53> <8ABE> <6C57> <8ABF> <6F22> <8AC0> <6F97> <8AC1> <6F45> <8AC2> <74B0> <8AC3> <7518> <8AC4> <76E3> <8AC5> <770B> <8AC6> <7AFF> <8AC7> <7BA1> <8AC8> <7C21> <8AC9> <7DE9> <8ACA> <7F36> <8ACB> <7FF0> <8ACC> <809D> <8ACD> <8266> <8ACE> <839E> <8ACF> <89B3> <8AD0> <8ACC> <8AD1> <8CAB> <8AD2> <9084> <8AD3> <9451> <8AD4> <9593> <8AD5> <9591> <8AD6> <95A2> <8AD7> <9665> <8AD8> <97D3> <8AD9> <9928> <8ADA> <8218> <8ADB> <4E38> <8ADC> <542B> <8ADD> <5CB8> <8ADE> <5DCC> <8ADF> <73A9> <8AE0> <764C> <8AE1> <773C> <8AE2> <5CA9> <8AE3> <7FEB> <8AE4> <8D0B> <8AE5> <96C1> <8AE6> <9811> <8AE7> <9854> <8AE8> <9858> <8AE9> <4F01> <8AEA> <4F0E> <8AEB> <5371> <8AEC> <559C> <8AED> <5668> <8AEE> <57FA> <8AEF> <5947> <8AF0> <5B09> <8AF1> <5BC4> <8AF2> <5C90> <8AF3> <5E0C> <8AF4> <5E7E> <8AF5> <5FCC> <8AF6> <63EE> <8AF7> <673A> <8AF8> <65D7> <8AF9> <65E2> <8AFA> <671F> <8AFB> <68CB> endbfchar 100 beginbfchar <8AFC> <68C4> <8B40> <6A5F> <8B41> <5E30> <8B42> <6BC5> <8B43> <6C17> <8B44> <6C7D> <8B45> <757F> <8B46> <7948> <8B47> <5B63> <8B48> <7A00> <8B49> <7D00> <8B4A> <5FBD> <8B4B> <898F> <8B4C> <8A18> <8B4D> <8CB4> <8B4E> <8D77> <8B4F> <8ECC> <8B50> <8F1D> <8B51> <98E2> <8B52> <9A0E> <8B53> <9B3C> <8B54> <4E80> <8B55> <507D> <8B56> <5100> <8B57> <5993> <8B58> <5B9C> <8B59> <622F> <8B5A> <6280> <8B5B> <64EC> <8B5C> <6B3A> <8B5D> <72A0> <8B5E> <7591> <8B5F> <7947> <8B60> <7FA9> <8B61> <87FB> <8B62> <8ABC> <8B63> <8B70> <8B64> <63AC> <8B65> <83CA> <8B66> <97A0> <8B67> <5409> <8B68> <5403> <8B69> <55AB> <8B6A> <6854> <8B6B> <6A58> <8B6C> <8A70> <8B6D> <7827> <8B6E> <6775> <8B6F> <9ECD> <8B70> <5374> <8B71> <5BA2> <8B72> <811A> <8B73> <8650> <8B74> <9006> <8B75> <4E18> <8B76> <4E45> <8B77> <4EC7> <8B78> <4F11> <8B79> <53CA> <8B7A> <5438> <8B7B> <5BAE> <8B7C> <5F13> <8B7D> <6025> <8B7E> <6551> <8B80> <673D> <8B81> <6C42> <8B82> <6C72> <8B83> <6CE3> <8B84> <7078> <8B85> <7403> <8B86> <7A76> <8B87> <7AAE> <8B88> <7B08> <8B89> <7D1A> <8B8A> <7CFE> <8B8B> <7D66> <8B8C> <65E7> <8B8D> <725B> <8B8E> <53BB> <8B8F> <5C45> <8B90> <5DE8> <8B91> <62D2> <8B92> <62E0> <8B93> <6319> <8B94> <6E20> <8B95> <865A> <8B96> <8A31> <8B97> <8DDD> <8B98> <92F8> <8B99> <6F01> <8B9A> <79A6> <8B9B> <9B5A> <8B9C> <4EA8> <8B9F> <4F9B> <8BA0> <4FA0> <8BA1> <50D1> <8BA2> <5147> <8BA3> <7AF6> <8BA4> <5171> <8BA5> <51F6> endbfchar 100 beginbfchar <8BA6> <5354> <8BA7> <5321> <8BA8> <537F> <8BA9> <53EB> <8BAA> <55AC> <8BAB> <5883> <8BAC> <5CE1> <8BAD> <5F37> <8BAE> <5F4A> <8BAF> <602F> <8BB0> <6050> <8BB1> <606D> <8BB2> <631F> <8BB3> <6559> <8BB4> <6A4B> <8BB5> <6CC1> <8BB6> <72C2> <8BB7> <72ED> <8BB8> <77EF> <8BB9> <80F8> <8BBA> <8105> <8BBB> <8208> <8BBC> <854E> <8BBD> <90F7> <8BBE> <93E1> <8BBF> <97FF> <8BC0> <9957> <8BC1> <9A5A> <8BC2> <4EF0> <8BC3> <51DD> <8BC4> <5C2D> <8BC5> <6681> <8BC6> <696D> <8BC7> <5C40> <8BC8> <66F2> <8BC9> <6975> <8BCA> <7389> <8BCB> <6850> <8BCC> <7C81> <8BCD> <50C5> <8BCE> <52E4> <8BCF> <5747> <8BD0> <5DFE> <8BD1> <9326> <8BD2> <65A4> <8BD3> <6B23> <8BD4> <6B3D> <8BD5> <7434> <8BD6> <7981> <8BD7> <79BD> <8BD8> <7B4B> <8BD9> <7DCA> <8BDA> <82B9> <8BDB> <83CC> <8BDC> <887F> <8BDD> <895F> <8BDE> <8B39> <8BDF> <8FD1> <8BE0> <91D1> <8BE1> <541F> <8BE2> <9280> <8BE3> <4E5D> <8BE4> <5036> <8BE5> <53E5> <8BE6> <533A> <8BE7> <72D7> <8BE8> <7396> <8BE9> <77E9> <8BEA> <82E6> <8BEB> <8EAF> <8BEC> <99C6> <8BED> <99C8> <8BEE> <99D2> <8BEF> <5177> <8BF0> <611A> <8BF1> <865E> <8BF2> <55B0> <8BF3> <7A7A> <8BF4> <5076> <8BF5> <5BD3> <8BF6> <9047> <8BF7> <9685> <8BF8> <4E32> <8BF9> <6ADB> <8BFA> <91E7> <8BFB> <5C51> <8BFC> <5C48> <8C40> <6398> <8C41> <7A9F> <8C42> <6C93> <8C43> <9774> <8C44> <8F61> <8C45> <7AAA> <8C46> <718A> <8C47> <9688> <8C48> <7C82> <8C49> <6817> <8C4A> <7E70> <8C4B> <6851> <8C4C> <936C> endbfchar 100 beginbfchar <8C4D> <52F2> <8C4E> <541B> <8C4F> <85AB> <8C50> <8A13> <8C51> <7FA4> <8C52> <8ECD> <8C53> <90E1> <8C54> <5366> <8C55> <8888> <8C56> <7941> <8C57> <4FC2> <8C58> <50BE> <8C59> <5211> <8C5A> <5144> <8C5B> <5553> <8C5C> <572D> <8C5D> <73EA> <8C5E> <578B> <8C5F> <5951> <8C60> <5F62> <8C61> <5F84> <8C62> <6075> <8C63> <6176> <8C64> <6167> <8C65> <61A9> <8C66> <63B2> <8C67> <643A> <8C68> <656C> <8C69> <666F> <8C6A> <6842> <8C6B> <6E13> <8C6C> <7566> <8C6D> <7A3D> <8C6E> <7CFB> <8C6F> <7D4C> <8C70> <7D99> <8C71> <7E4B> <8C72> <7F6B> <8C73> <830E> <8C74> <834A> <8C75> <86CD> <8C76> <8A08> <8C77> <8A63> <8C78> <8B66> <8C79> <8EFD> <8C7A> <981A> <8C7B> <9D8F> <8C7C> <82B8> <8C7D> <8FCE> <8C7E> <9BE8> <8C80> <5287> <8C81> <621F> <8C82> <6483> <8C83> <6FC0> <8C84> <9699> <8C85> <6841> <8C86> <5091> <8C87> <6B20> <8C88> <6C7A> <8C89> <6F54> <8C8A> <7A74> <8C8B> <7D50> <8C8C> <8840> <8C8D> <8A23> <8C8E> <6708> <8C8F> <4EF6> <8C90> <5039> <8C91> <5026> <8C92> <5065> <8C93> <517C> <8C94> <5238> <8C95> <5263> <8C96> <55A7> <8C97> <570F> <8C98> <5805> <8C99> <5ACC> <8C9A> <5EFA> <8C9B> <61B2> <8C9C> <61F8> <8C9D> <62F3> <8C9E> <6372> <8C9F> <691C> <8CA0> <6A29> <8CA1> <727D> <8CA2> <72AC> <8CA3> <732E> <8CA4> <7814> <8CA5> <786F> <8CA6> <7D79> <8CA7> <770C> <8CA8> <80A9> <8CA9> <898B> <8CAA> <8B19> <8CAB> <8CE2> <8CAC> <8ED2> <8CAD> <9063> <8CAE> <9375> <8CAF> <967A> <8CB0> <9855> <8CB1> <9A13> endbfchar 100 beginbfchar <8CB2> <9E78> <8CB3> <5143> <8CB4> <539F> <8CB5> <53B3> <8CB6> <5E7B> <8CB7> <5F26> <8CB8> <6E1B> <8CB9> <6E90> <8CBA> <7384> <8CBB> <73FE> <8CBC> <7D43> <8CBD> <8237> <8CBE> <8A00> <8CBF> <8AFA> <8CC0> <9650> <8CC1> <4E4E> <8CC2> <500B> <8CC3> <53E4> <8CC4> <547C> <8CC5> <56FA> <8CC6> <59D1> <8CC7> <5B64> <8CC8> <5DF1> <8CC9> <5EAB> <8CCA> <5F27> <8CCB> <6238> <8CCC> <6545> <8CCD> <67AF> <8CCE> <6E56> <8CCF> <72D0> <8CD0> <7CCA> <8CD1> <88B4> <8CD2> <80A1> <8CD3> <80E1> <8CD4> <83F0> <8CD5> <864E> <8CD6> <8A87> <8CD7> <8DE8> <8CD8> <9237> <8CD9> <96C7> <8CDA> <9867> <8CDB> <9F13> <8CDC> <4E94> <8CDD> <4E92> <8CDE> <4F0D> <8CDF> <5348> <8CE0> <5449> <8CE1> <543E> <8CE2> <5A2F> <8CE3> <5F8C> <8CE4> <5FA1> <8CE5> <609F> <8CE6> <68A7> <8CE7> <6A8E> <8CE8> <745A> <8CE9> <7881> <8CEA> <8A9E> <8CEB> <8AA4> <8CEC> <8B77> <8CED> <9190> <8CEE> <4E5E> <8CEF> <9BC9> <8CF0> <4EA4> <8CF1> <4F7C> <8CF2> <4FAF> <8CF3> <5019> <8CF4> <5016> <8CF5> <5149> <8CF6> <516C> <8CF7> <529F> <8CF8> <52B9> <8CF9> <52FE> <8CFA> <539A> <8CFB> <53E3> <8CFC> <5411> <8D40> <540E> <8D41> <5589> <8D42> <5751> <8D43> <57A2> <8D44> <597D> <8D45> <5B54> <8D46> <5B5D> <8D47> <5B8F> <8D48> <5DE5> <8D49> <5DE7> <8D4A> <5DF7> <8D4B> <5E78> <8D4C> <5E83> <8D4D> <5E9A> <8D4E> <5EB7> <8D4F> <5F18> <8D50> <6052> <8D51> <614C> <8D52> <6297> <8D53> <62D8> <8D54> <63A7> <8D55> <653B> <8D56> <6602> <8D57> <6643> <8D58> <66F4> endbfchar 100 beginbfchar <8D59> <676D> <8D5A> <6821> <8D5B> <6897> <8D5C> <69CB> <8D5D> <6C5F> <8D5E> <6D2A> <8D5F> <6D69> <8D60> <6E2F> <8D61> <6E9D> <8D62> <7532> <8D63> <7687> <8D64> <786C> <8D65> <7A3F> <8D66> <7CE0> <8D67> <7D05> <8D68> <7D18> <8D69> <7D5E> <8D6A> <7DB1> <8D6B> <8015> <8D6C> <8003> <8D6D> <80AF> <8D6E> <80B1> <8D6F> <8154> <8D70> <818F> <8D71> <822A> <8D72> <8352> <8D73> <884C> <8D74> <8861> <8D75> <8B1B> <8D76> <8CA2> <8D77> <8CFC> <8D78> <90CA> <8D79> <9175> <8D7A> <9271> <8D7B> <783F> <8D7C> <92FC> <8D7D> <95A4> <8D7E> <964D> <8D80> <9805> <8D81> <9999> <8D82> <9AD8> <8D83> <9D3B> <8D84> <525B> <8D85> <52AB> <8D86> <53F7> <8D87> <5408> <8D88> <58D5> <8D89> <62F7> <8D8A> <6FE0> <8D8B> <8C6A> <8D8C> <8F5F> <8D8D> <9EB9> <8D8E> <514B> <8D8F> <523B> <8D90> <544A> <8D91> <56FD> <8D92> <7A40> <8D93> <9177> <8D94> <9D60> <8D95> <9ED2> <8D96> <7344> <8D97> <6F09> <8D98> <8170> <8D99> <7511> <8D9A> <5FFD> <8D9B> <60DA> <8D9C> <9AA8> <8D9D> <72DB> <8D9E> <8FBC> <8D9F> <6B64> <8DA0> <9803> <8DA1> <4ECA> <8DA2> <56F0> <8DA3> <5764> <8DA4> <58BE> <8DA5> <5A5A> <8DA6> <6068> <8DA7> <61C7> <8DA8> <660F> <8DA9> <6606> <8DAA> <6839> <8DAB> <68B1> <8DAC> <6DF7> <8DAD> <75D5> <8DAE> <7D3A> <8DAF> <826E> <8DB0> <9B42> <8DB1> <4E9B> <8DB2> <4F50> <8DB3> <53C9> <8DB4> <5506> <8DB5> <5D6F> <8DB6> <5DE6> <8DB7> <5DEE> <8DB8> <67FB> <8DB9> <6C99> <8DBA> <7473> <8DBB> <7802> <8DBC> <8A50> <8DBD> <9396> endbfchar 100 beginbfchar <8DBE> <88DF> <8DBF> <5750> <8DC0> <5EA7> <8DC1> <632B> <8DC2> <50B5> <8DC3> <50AC> <8DC4> <518D> <8DC5> <6700> <8DC6> <54C9> <8DC7> <585E> <8DC8> <59BB> <8DC9> <5BB0> <8DCA> <5F69> <8DCB> <624D> <8DCC> <63A1> <8DCD> <683D> <8DCE> <6B73> <8DCF> <6E08> <8DD0> <707D> <8DD1> <91C7> <8DD2> <7280> <8DD3> <7815> <8DD4> <7826> <8DD5> <796D> <8DD6> <658E> <8DD7> <7D30> <8DD8> <83DC> <8DD9> <88C1> <8DDA> <8F09> <8DDB> <969B> <8DDC> <5264> <8DDD> <5728> <8DDE> <6750> <8DDF> <7F6A> <8DE0> <8CA1> <8DE1> <51B4> <8DE2> <5742> <8DE3> <962A> <8DE4> <583A> <8DE5> <698A> <8DE6> <80B4> <8DE7> <54B2> <8DE8> <5D0E> <8DE9> <57FC> <8DEA> <7895> <8DEB> <9DFA> <8DEC> <4F5C> <8DED> <524A> <8DEE> <548B> <8DEF> <643E> <8DF0> <6628> <8DF1> <6714> <8DF2> <67F5> <8DF3> <7A84> <8DF4> <7B56> <8DF5> <7D22> <8DF6> <932F> <8DF7> <685C> <8DF8> <9BAD> <8DF9> <7B39> <8DFA> <5319> <8DFB> <518A> <8DFC> <5237> <8E40> <5BDF> <8E41> <62F6> <8E42> <64AE> <8E43> <64E6> <8E44> <672D> <8E45> <6BBA> <8E46> <85A9> <8E47> <96D1> <8E48> <7690> <8E49> <9BD6> <8E4A> <634C> <8E4B> <9306> <8E4C> <9BAB> <8E4D> <76BF> <8E4E> <6652> <8E4F> <4E09> <8E50> <5098> <8E51> <53C2> <8E52> <5C71> <8E53> <60E8> <8E54> <6492> <8E55> <6563> <8E56> <685F> <8E57> <71E6> <8E58> <73CA> <8E59> <7523> <8E5A> <7B97> <8E5B> <7E82> <8E5C> <8695> <8E5D> <8B83> <8E5E> <8CDB> <8E5F> <9178> <8E60> <9910> <8E61> <65AC> <8E62> <66AB> <8E63> <6B8B> <8E64> <4ED5> endbfchar 100 beginbfchar <8E65> <4ED4> <8E66> <4F3A> <8E67> <4F7F> <8E68> <523A> <8E69> <53F8> <8E6A> <53F2> <8E6B> <55E3> <8E6C> <56DB> <8E6D> <58EB> <8E6E> <59CB> <8E6F> <59C9> <8E70> <59FF> <8E71> <5B50> <8E72> <5C4D> <8E73> <5E02> <8E74> <5E2B> <8E75> <5FD7> <8E76> <601D> <8E77> <6307> <8E78> <652F> <8E79> <5B5C> <8E7A> <65AF> <8E7B> <65BD> <8E7C> <65E8> <8E7D> <679D> <8E7E> <6B62> <8E80> <6B7B> <8E81> <6C0F> <8E82> <7345> <8E83> <7949> <8E84> <79C1> <8E85> <7CF8> <8E86> <7D19> <8E87> <7D2B> <8E88> <80A2> <8E89> <8102> <8E8A> <81F3> <8E8B> <8996> <8E8C> <8A5E> <8E8D> <8A69> <8E8E> <8A66> <8E8F> <8A8C> <8E90> <8AEE> <8E91> <8CC7> <8E92> <8CDC> <8E93> <96CC> <8E94> <98FC> <8E95> <6B6F> <8E96> <4E8B> <8E97> <4F3C> <8E98> <4F8D> <8E99> <5150> <8E9A> <5B57> <8E9B> <5BFA> <8E9C> <6148> <8E9D> <6301> <8E9E> <6642> <8E9F> <6B21> <8EA0> <6ECB> <8EA1> <6CBB> <8EA2> <723E> <8EA3> <74BD> <8EA4> <75D4> <8EA5> <78C1> <8EA6> <793A> <8EA7> <800C> <8EA8> <8033> <8EA9> <81EA> <8EAA> <8494> <8EAB> <8F9E> <8EAC> <6C50> <8EAD> <9E7F> <8EAE> <5F0F> <8EAF> <8B58> <8EB0> <9D2B> <8EB1> <7AFA> <8EB2> <8EF8> <8EB3> <5B8D> <8EB4> <96EB> <8EB5> <4E03> <8EB6> <53F1> <8EB7> <57F7> <8EB8> <5931> <8EB9> <5AC9> <8EBA> <5BA4> <8EBB> <6089> <8EBC> <6E7F> <8EBD> <6F06> <8EBE> <75BE> <8EBF> <8CEA> <8EC0> <5B9F> <8EC1> <8500> <8EC2> <7BE0> <8EC3> <5072> <8EC4> <67F4> <8EC5> <829D> <8EC6> <5C61> <8EC7> <854A> <8EC8> <7E1E> <8EC9> <820E> endbfchar 100 beginbfchar <8ECA> <5199> <8ECB> <5C04> <8ECC> <6368> <8ECD> <8D66> <8ECE> <659C> <8ECF> <716E> <8ED0> <793E> <8ED1> <7D17> <8ED2> <8005> <8ED3> <8B1D> <8ED4> <8ECA> <8ED5> <906E> <8ED6> <86C7> <8ED7> <90AA> <8ED8> <501F> <8ED9> <52FA> <8EDA> <5C3A> <8EDB> <6753> <8EDC> <707C> <8EDD> <7235> <8EDE> <914C> <8EDF> <91C8> <8EE0> <932B> <8EE1> <82E5> <8EE2> <5BC2> <8EE3> <5F31> <8EE4> <60F9> <8EE5> <4E3B> <8EE6> <53D6> <8EE7> <5B88> <8EE8> <624B> <8EE9> <6731> <8EEA> <6B8A> <8EEB> <72E9> <8EEC> <73E0> <8EED> <7A2E> <8EEE> <816B> <8EEF> <8DA3> <8EF0> <9152> <8EF1> <9996> <8EF2> <5112> <8EF3> <53D7> <8EF4> <546A> <8EF5> <5BFF> <8EF6> <6388> <8EF7> <6A39> <8EF8> <7DAC> <8EF9> <9700> <8EFA> <56DA> <8EFB> <53CE> <8EFC> <5468> <8F40> <5B97> <8F41> <5C31> <8F42> <5DDE> <8F43> <4FEE> <8F44> <6101> <8F45> <62FE> <8F46> <6D32> <8F47> <79C0> <8F48> <79CB> <8F49> <7D42> <8F4A> <7E4D> <8F4B> <7FD2> <8F4C> <81ED> <8F4D> <821F> <8F4E> <8490> <8F4F> <8846> <8F50> <8972> <8F51> <8B90> <8F52> <8E74> <8F53> <8F2F> <8F54> <9031> <8F55> <914B> <8F56> <916C> <8F57> <96C6> <8F58> <919C> <8F59> <4EC0> <8F5A> <4F4F> <8F5B> <5145> <8F5C> <5341> <8F5D> <5F93> <8F5E> <620E> <8F5F> <67D4> <8F60> <6C41> <8F61> <6E0B> <8F62> <7363> <8F63> <7E26> <8F64> <91CD> <8F65> <9283> <8F66> <53D4> <8F67> <5919> <8F68> <5BBF> <8F69> <6DD1> <8F6A> <795D> <8F6B> <7E2E> <8F6C> <7C9B> <8F6D> <587E> <8F6E> <719F> <8F6F> <51FA> <8F70> <8853> endbfchar 100 beginbfchar <8F71> <8FF0> <8F72> <4FCA> <8F73> <5CFB> <8F74> <6625> <8F75> <77AC> <8F76> <7AE3> <8F77> <821C> <8F78> <99FF> <8F79> <51C6> <8F7A> <5FAA> <8F7B> <65EC> <8F7C> <696F> <8F7D> <6B89> <8F7E> <6DF3> <8F80> <6E96> <8F81> <6F64> <8F82> <76FE> <8F83> <7D14> <8F84> <5DE1> <8F85> <9075> <8F86> <9187> <8F87> <9806> <8F88> <51E6> <8F89> <521D> <8F8A> <6240> <8F8B> <6691> <8F8C> <66D9> <8F8D> <6E1A> <8F8E> <5EB6> <8F8F> <7DD2> <8F90> <7F72> <8F91> <66F8> <8F92> <85AF> <8F93> <85F7> <8F94> <8AF8> <8F95> <52A9> <8F96> <53D9> <8F97> <5973> <8F98> <5E8F> <8F99> <5F90> <8F9A> <6055> <8F9B> <92E4> <8F9C> <9664> <8F9D> <50B7> <8F9E> <511F> <8F9F> <52DD> <8FA0> <5320> <8FA1> <5347> <8FA2> <53EC> <8FA3> <54E8> <8FA4> <5546> <8FA5> <5531> <8FA6> <5617> <8FA7> <5968> <8FA8> <59BE> <8FA9> <5A3C> <8FAA> <5BB5> <8FAB> <5C06> <8FAC> <5C0F> <8FAD> <5C11> <8FAE> <5C1A> <8FAF> <5E84> <8FB0> <5E8A> <8FB1> <5EE0> <8FB2> <5F70> <8FB3> <627F> <8FB4> <6284> <8FB5> <62DB> <8FB6> <638C> <8FB7> <6377> <8FB8> <6607> <8FB9> <660C> <8FBA> <662D> <8FBB> <6676> <8FBC> <677E> <8FBD> <68A2> <8FBE> <6A1F> <8FBF> <6A35> <8FC0> <6CBC> <8FC1> <6D88> <8FC2> <6E09> <8FC3> <6E58> <8FC4> <713C> <8FC5> <7126> <8FC6> <7167> <8FC7> <75C7> <8FC8> <7701> <8FC9> <785D> <8FCA> <7901> <8FCB> <7965> <8FCC> <79F0> <8FCD> <7AE0> <8FCE> <7B11> <8FCF> <7CA7> <8FD0> <7D39> <8FD1> <8096> <8FD2> <83D6> <8FD3> <848B> <8FD4> <8549> <8FD5> <885D> endbfchar 100 beginbfchar <8FD6> <88F3> <8FD7> <8A1F> <8FD8> <8A3C> <8FD9> <8A54> <8FDA> <8A73> <8FDB> <8C61> <8FDC> <8CDE> <8FDD> <91A4> <8FDE> <9266> <8FDF> <937E> <8FE0> <9418> <8FE1> <969C> <8FE2> <9798> <8FE3> <4E0A> <8FE4> <4E08> <8FE5> <4E1E> <8FE6> <4E57> <8FE7> <5197> <8FE8> <5270> <8FE9> <57CE> <8FEA> <5834> <8FEB> <58CC> <8FEC> <5B22> <8FED> <5E38> <8FEE> <60C5> <8FEF> <64FE> <8FF0> <6761> <8FF1> <6756> <8FF2> <6D44> <8FF3> <72B6> <8FF4> <7573> <8FF5> <7A63> <8FF6> <84B8> <8FF7> <8B72> <8FF8> <91B8> <8FF9> <9320> <8FFA> <5631> <8FFB> <57F4> <8FFC> <98FE> <9040> <62ED> <9041> <690D> <9042> <6B96> <9043> <71ED> <9044> <7E54> <9045> <8077> <9046> <8272> <9047> <89E6> <9048> <98DF> <9049> <8755> <904A> <8FB1> <904B> <5C3B> <904C> <4F38> <904D> <4FE1> <904E> <4FB5> <904F> <5507> <9050> <5A20> <9051> <5BDD> <9052> <5BE9> <9053> <5FC3> <9054> <614E> <9055> <632F> <9056> <65B0> <9057> <664B> <9058> <68EE> <9059> <699B> <905A> <6D78> <905B> <6DF1> <905C> <7533> <905D> <75B9> <905E> <771F> <905F> <795E> <9060> <79E6> <9061> <7D33> <9062> <81E3> <9063> <82AF> <9064> <85AA> <9065> <89AA> <9066> <8A3A> <9067> <8EAB> <9068> <8F9B> <9069> <9032> <906A> <91DD> <906B> <9707> <906C> <4EBA> <906D> <4EC1> <906E> <5203> <906F> <5875> <9070> <58EC> <9071> <5C0B> <9072> <751A> <9073> <5C3D> <9074> <814E> <9075> <8A0A> <9076> <8FC5> <9077> <9663> <9078> <976D> <9079> <7B25> <907A> <8ACF> <907B> <9808> <907C> <9162> endbfchar 100 beginbfchar <907D> <56F3> <907E> <53A8> <9080> <9017> <9081> <5439> <9082> <5782> <9083> <5E25> <9084> <63A8> <9085> <6C34> <9086> <708A> <9087> <7761> <9088> <7C8B> <9089> <7FE0> <908A> <8870> <908B> <9042> <908C> <9154> <908D> <9310> <908E> <9318> <908F> <968F> <9090> <745E> <9091> <9AC4> <9092> <5D07> <9093> <5D69> <9094> <6570> <9095> <67A2> <9096> <8DA8> <9097> <96DB> <9098> <636E> <9099> <6749> <909A> <6919> <909B> <83C5> <909C> <9817> <909D> <96C0> <909E> <88FE> <909F> <6F84> <90A0> <647A> <90A1> <5BF8> <90A2> <4E16> <90A3> <702C> <90A4> <755D> <90A5> <662F> <90A6> <51C4> <90A7> <5236> <90A8> <52E2> <90A9> <59D3> <90AA> <5F81> <90AB> <6027> <90AC> <6210> <90AD> <653F> <90AE> <6574> <90AF> <661F> <90B0> <6674> <90B1> <68F2> <90B2> <6816> <90B3> <6B63> <90B4> <6E05> <90B5> <7272> <90B6> <751F> <90B7> <76DB> <90B8> <7CBE> <90B9> <8056> <90BA> <58F0> <90BB> <88FD> <90BC> <897F> <90BD> <8AA0> <90BE> <8A93> <90BF> <8ACB> <90C0> <901D> <90C1> <9192> <90C2> <9752> <90C3> <9759> <90C4> <6589> <90C5> <7A0E> <90C6> <8106> <90C7> <96BB> <90C8> <5E2D> <90C9> <60DC> <90CA> <621A> <90CB> <65A5> <90CC> <6614> <90CD> <6790> <90CE> <77F3> <90CF> <7A4D> <90D0> <7C4D> <90D1> <7E3E> <90D2> <810A> <90D3> <8CAC> <90D4> <8D64> <90D5> <8DE1> <90D6> <8E5F> <90D7> <78A9> <90D8> <5207> <90D9> <62D9> <90DA> <63A5> <90DB> <6442> <90DC> <6298> <90DD> <8A2D> <90DE> <7A83> <90DF> <7BC0> <90E0> <8AAC> <90E1> <96EA> endbfchar 100 beginbfchar <90E2> <7D76> <90E3> <820C> <90E4> <8749> <90E5> <4ED9> <90E6> <5148> <90E7> <5343> <90E8> <5360> <90E9> <5BA3> <90EA> <5C02> <90EB> <5C16> <90EC> <5DDD> <90ED> <6226> <90EE> <6247> <90EF> <64B0> <90F0> <6813> <90F1> <6834> <90F2> <6CC9> <90F3> <6D45> <90F4> <6D17> <90F5> <67D3> <90F6> <6F5C> <90F7> <714E> <90F8> <717D> <90F9> <65CB> <90FA> <7A7F> <90FB> <7BAD> <90FC> <7DDA> <9140> <7E4A> <9141> <7FA8> <9142> <817A> <9143> <821B> <9144> <8239> <9145> <85A6> <9146> <8A6E> <9147> <8CCE> <9148> <8DF5> <9149> <9078> <914A> <9077> <914B> <92AD> <914C> <9291> <914D> <9583> <914E> <9BAE> <914F> <524D> <9150> <5584> <9151> <6F38> <9152> <7136> <9153> <5168> <9154> <7985> <9155> <7E55> <9156> <81B3> <9157> <7CCE> <9158> <564C> <9159> <5851> <915A> <5CA8> <915B> <63AA> <915C> <66FE> <915D> <66FD> <915E> <695A> <915F> <72D9> <9160> <758F> <9161> <758E> <9162> <790E> <9163> <7956> <9164> <79DF> <9165> <7C97> <9166> <7D20> <9167> <7D44> <9168> <8607> <9169> <8A34> <916A> <963B> <916B> <9061> <916C> <9F20> <916D> <50E7> <916E> <5275> <916F> <53CC> <9170> <53E2> <9171> <5009> <9172> <55AA> <9173> <58EE> <9174> <594F> <9175> <723D> <9176> <5B8B> <9177> <5C64> <9178> <531D> <9179> <60E3> <917A> <60F3> <917B> <635C> <917C> <6383> <917D> <633F> <917E> <63BB> <9180> <64CD> <9181> <65E9> <9182> <66F9> <9183> <5DE3> <9184> <69CD> <9185> <69FD> <9186> <6F15> <9187> <71E5> <9188> <4E89> <9189> <75E9> endbfchar 100 beginbfchar <918A> <76F8> <918B> <7A93> <918C> <7CDF> <918D> <7DCF> <918E> <7D9C> <918F> <8061> <9190> <8349> <9191> <8358> <9192> <846C> <9193> <84BC> <9194> <85FB> <9195> <88C5> <9196> <8D70> <9197> <9001> <9198> <906D> <9199> <9397> <919A> <971C> <919B> <9A12> <919C> <50CF> <919D> <5897> <919E> <618E> <919F> <81D3> <91A0> <8535> <91A1> <8D08> <91A2> <9020> <91A3> <4FC3> <91A4> <5074> <91A5> <5247> <91A6> <5373> <91A7> <606F> <91A8> <6349> <91A9> <675F> <91AA> <6E2C> <91AB> <8DB3> <91AC> <901F> <91AD> <4FD7> <91AE> <5C5E> <91AF> <8CCA> <91B0> <65CF> <91B1> <7D9A> <91B2> <5352> <91B3> <8896> <91B4> <5176> <91B5> <63C3> <91B6> <5B58> <91B7> <5B6B> <91B8> <5C0A> <91B9> <640D> <91BA> <6751> <91BB> <905C> <91BC> <4ED6> <91BD> <591A> <91BE> <592A> <91BF> <6C70> <91C0> <8A51> <91C1> <553E> <91C2> <5815> <91C3> <59A5> <91C4> <60F0> <91C5> <6253> <91C6> <67C1> <91C7> <8235> <91C8> <6955> <91C9> <9640> <91CA> <99C4> <91CB> <9A28> <91CC> <4F53> <91CD> <5806> <91CE> <5BFE> <91CF> <8010> <91D0> <5CB1> <91D1> <5E2F> <91D2> <5F85> <91D3> <6020> <91D4> <614B> <91D5> <6234> <91D6> <66FF> <91D7> <6CF0> <91D8> <6EDE> <91D9> <80CE> <91DA> <817F> <91DB> <82D4> <91DC> <888B> <91DD> <8CB8> <91DE> <9000> <91DF> <902E> <91E0> <968A> <91E1> <9EDB> <91E2> <9BDB> <91E3> <4EE3> <91E4> <53F0> <91E5> <5927> <91E6> <7B2C> <91E7> <918D> <91E8> <984C> <91E9> <9DF9> <91EA> <6EDD> <91EB> <7027> <91EC> <5353> <91ED> <5544> endbfchar 100 beginbfchar <91EE> <5B85> <91EF> <6258> <91F0> <629E> <91F1> <62D3> <91F2> <6CA2> <91F3> <6FEF> <91F4> <7422> <91F5> <8A17> <91F6> <9438> <91F7> <6FC1> <91F8> <8AFE> <91F9> <8338> <91FA> <51E7> <91FB> <86F8> <91FC> <53EA> <9240> <53E9> <9241> <4F46> <9242> <9054> <9243> <8FB0> <9244> <596A> <9245> <8131> <9246> <5DFD> <9247> <7AEA> <9248> <8FBF> <9249> <68DA> <924A> <8C37> <924B> <72F8> <924C> <9C48> <924D> <6A3D> <924E> <8AB0> <924F> <4E39> <9250> <5358> <9251> <5606> <9252> <5766> <9253> <62C5> <9254> <63A2> <9255> <65E6> <9256> <6B4E> <9257> <6DE1> <9258> <6E5B> <9259> <70AD> <925A> <77ED> <925B> <7AEF> <925C> <7BAA> <925D> <7DBB> <925E> <803D> <925F> <80C6> <9260> <86CB> <9261> <8A95> <9262> <935B> <9263> <56E3> <9264> <58C7> <9265> <5F3E> <9266> <65AD> <9267> <6696> <9268> <6A80> <9269> <6BB5> <926A> <7537> <926B> <8AC7> <926C> <5024> <926D> <77E5> <926E> <5730> <926F> <5F1B> <9270> <6065> <9271> <667A> <9272> <6C60> <9273> <75F4> <9274> <7A1A> <9275> <7F6E> <9276> <81F4> <9277> <8718> <9278> <9045> <9279> <99B3> <927A> <7BC9> <927B> <755C> <927C> <7AF9> <927D> <7B51> <927E> <84C4> <9280> <9010> <9281> <79E9> <9282> <7A92> <9283> <8336> <9284> <5AE1> <9285> <7740> <9286> <4E2D> <9287> <4EF2> <9288> <5B99> <9289> <5FE0> <928A> <62BD> <928B> <663C> <928C> <67F1> <928D> <6CE8> <928E> <866B> <928F> <8877> <9290> <8A3B> <9291> <914E> <9292> <92F3> <9293> <99D0> <9294> <6A17> <9295> <7026> endbfchar 100 beginbfchar <9296> <732A> <9297> <82E7> <9298> <8457> <9299> <8CAF> <929A> <4E01> <929B> <5146> <929C> <51CB> <929D> <558B> <929E> <5BF5> <929F> <5E16> <92A0> <5E33> <92A1> <5E81> <92A2> <5F14> <92A3> <5F35> <92A4> <5F6B> <92A5> <5FB4> <92A6> <61F2> <92A7> <6311> <92A8> <66A2> <92A9> <671D> <92AA> <6F6E> <92AB> <7252> <92AC> <753A> <92AD> <773A> <92AE> <8074> <92AF> <8139> <92B0> <8178> <92B1> <8776> <92B2> <8ABF> <92B3> <8ADC> <92B4> <8D85> <92B5> <8DF3> <92B6> <929A> <92B7> <9577> <92B8> <9802> <92B9> <9CE5> <92BA> <52C5> <92BB> <6357> <92BC> <76F4> <92BD> <6715> <92BE> <6C88> <92BF> <73CD> <92C0> <8CC3> <92C1> <93AE> <92C2> <9673> <92C3> <6D25> <92C4> <589C> <92C5> <690E> <92C6> <69CC> <92C7> <8FFD> <92C8> <939A> <92C9> <75DB> <92CA> <901A> <92CB> <585A> <92CC> <6802> <92CD> <63B4> <92CE> <69FB> <92CF> <4F43> <92D0> <6F2C> <92D1> <67D8> <92D2> <8FBB> <92D3> <8526> <92D4> <7DB4> <92D5> <9354> <92D6> <693F> <92D7> <6F70> <92D8> <576A> <92D9> <58F7> <92DA> <5B2C> <92DB> <7D2C> <92DC> <722A> <92DD> <540A> <92DE> <91E3> <92DF> <9DB4> <92E0> <4EAD> <92E1> <4F4E> <92E2> <505C> <92E3> <5075> <92E4> <5243> <92E5> <8C9E> <92E6> <5448> <92E7> <5824> <92E8> <5B9A> <92E9> <5E1D> <92EA> <5E95> <92EB> <5EAD> <92EC> <5EF7> <92ED> <5F1F> <92EE> <608C> <92EF> <62B5> <92F0> <633A> <92F1> <63D0> <92F2> <68AF> <92F3> <6C40> <92F4> <7887> <92F5> <798E> <92F6> <7A0B> <92F7> <7DE0> <92F8> <8247> <92F9> <8A02> endbfchar 100 beginbfchar <92FA> <8AE6> <92FB> <8E44> <92FC> <9013> <9340> <90B8> <9341> <912D> <9342> <91D8> <9343> <9F0E> <9344> <6CE5> <9345> <6458> <9346> <64E2> <9347> <6575> <9348> <6EF4> <9349> <7684> <934A> <7B1B> <934B> <9069> <934C> <93D1> <934D> <6EBA> <934E> <54F2> <934F> <5FB9> <9350> <64A4> <9351> <8F4D> <9352> <8FED> <9353> <9244> <9354> <5178> <9355> <586B> <9356> <5929> <9357> <5C55> <9358> <5E97> <9359> <6DFB> <935A> <7E8F> <935B> <751C> <935C> <8CBC> <935D> <8EE2> <935E> <985B> <935F> <70B9> <9360> <4F1D> <9361> <6BBF> <9362> <6FB1> <9363> <7530> <9364> <96FB> <9365> <514E> <9366> <5410> <9367> <5835> <9368> <5857> <9369> <59AC> <936A> <5C60> <936B> <5F92> <936C> <6597> <936D> <675C> <936E> <6E21> <936F> <767B> <9370> <83DF> <9371> <8CED> <9372> <9014> <9373> <90FD> <9374> <934D> <9375> <7825> <9376> <783A> <9377> <52AA> <9378> <5EA6> <9379> <571F> <937A> <5974> <937B> <6012> <937C> <5012> <937D> <515A> <937E> <51AC> <9380> <51CD> <9381> <5200> <9382> <5510> <9383> <5854> <9384> <5858> <9385> <5957> <9386> <5B95> <9387> <5CF6> <9388> <5D8B> <9389> <60BC> <938A> <6295> <938B> <642D> <938C> <6771> <938D> <6843> <938E> <68BC> <938F> <68DF> <9390> <76D7> <9391> <6DD8> <9392> <6E6F> <9393> <6D9B> <9394> <706F> <9395> <71C8> <9396> <5F53> <9397> <75D8> <9398> <7977> <9399> <7B49> <939A> <7B54> <939B> <7B52> <939C> <7CD6> <939D> <7D71> <939E> <5230> <939F> <8463> <93A0> <8569> <93A1> <85E4> endbfchar 100 beginbfchar <93A2> <8A0E> <93A3> <8B04> <93A4> <8C46> <93A5> <8E0F> <93A6> <9003> <93A7> <900F> <93A8> <9419> <93A9> <9676> <93AA> <982D> <93AB> <9A30> <93AC> <95D8> <93AD> <50CD> <93AE> <52D5> <93AF> <540C> <93B0> <5802> <93B1> <5C0E> <93B2> <61A7> <93B3> <649E> <93B4> <6D1E> <93B5> <77B3> <93B6> <7AE5> <93B7> <80F4> <93B8> <8404> <93B9> <9053> <93BA> <9285> <93BB> <5CE0> <93BC> <9D07> <93BD> <533F> <93BE> <5F97> <93BF> <5FB3> <93C0> <6D9C> <93C1> <7279> <93C2> <7763> <93C3> <79BF> <93C4> <7BE4> <93C5> <6BD2> <93C6> <72EC> <93C7> <8AAD> <93C8> <6803> <93C9> <6A61> <93CA> <51F8> <93CB> <7A81> <93CC> <6934> <93CD> <5C4A> <93CE> <9CF6> <93CF> <82EB> <93D0> <5BC5> <93D1> <9149> <93D2> <701E> <93D3> <5678> <93D4> <5C6F> <93D5> <60C7> <93D6> <6566> <93D7> <6C8C> <93D8> <8C5A> <93D9> <9041> <93DA> <9813> <93DB> <5451> <93DC> <66C7> <93DD> <920D> <93DE> <5948> <93DF> <90A3> <93E0> <5185> <93E1> <4E4D> <93E2> <51EA> <93E3> <8599> <93E4> <8B0E> <93E5> <7058> <93E6> <637A> <93E7> <934B> <93E8> <6962> <93E9> <99B4> <93EA> <7E04> <93EB> <7577> <93EC> <5357> <93ED> <6960> <93EE> <8EDF> <93EF> <96E3> <93F0> <6C5D> <93F1> <4E8C> <93F2> <5C3C> <93F3> <5F10> <93F4> <8FE9> <93F5> <5302> <93F6> <8CD1> <93F7> <8089> <93F8> <8679> <93F9> <5EFF> <93FA> <65E5> <93FB> <4E73> <93FC> <5165> <9440> <5982> <9441> <5C3F> <9442> <97EE> <9443> <4EFB> <9444> <598A> <9445> <5FCD> <9446> <8A8D> <9447> <6FE1> <9448> <79B0> endbfchar 100 beginbfchar <9449> <7962> <944A> <5BE7> <944B> <8471> <944C> <732B> <944D> <71B1> <944E> <5E74> <944F> <5FF5> <9450> <637B> <9451> <649A> <9452> <71C3> <9453> <7C98> <9454> <4E43> <9455> <5EFC> <9456> <4E4B> <9457> <57DC> <9458> <56A2> <9459> <60A9> <945A> <6FC3> <945B> <7D0D> <945C> <80FD> <945D> <8133> <945E> <81BF> <945F> <8FB2> <9460> <8997> <9461> <86A4> <9462> <5DF4> <9463> <628A> <9464> <64AD> <9465> <8987> <9466> <6777> <9467> <6CE2> <9468> <6D3E> <9469> <7436> <946A> <7834> <946B> <5A46> <946C> <7F75> <946D> <82AD> <946E> <99AC> <946F> <4FF3> <9470> <5EC3> <9471> <62DD> <9472> <6392> <9473> <6557> <9474> <676F> <9475> <76C3> <9476> <724C> <9477> <80CC> <9478> <80BA> <9479> <8F29> <947A> <914D> <947B> <500D> <947C> <57F9> <947D> <5A92> <947E> <6885> <9480> <6973> <9481> <7164> <9482> <72FD> <9483> <8CB7> <9484> <58F2> <9485> <8CE0> <9486> <966A> <9487> <9019> <9488> <877F> <9489> <79E4> <948A> <77E7> <948B> <8429> <948C> <4F2F> <948D> <5265> <948E> <535A> <948F> <62CD> <9490> <67CF> <9491> <6CCA> <9492> <767D> <9493> <7B94> <9494> <7C95> <9495> <8236> <9496> <8584> <9497> <8FEB> <9498> <66DD> <9499> <6F20> <949A> <7206> <949B> <7E1B> <949C> <83AB> <949D> <99C1> <949E> <9EA6> <949F> <51FD> <94A0> <7BB1> <94A1> <7872> <94A2> <7BB8> <94A3> <8087> <94A4> <7B48> <94A5> <6AE8> <94A6> <5E61> <94A7> <808C> <94A8> <7551> <94A9> <7560> <94AA> <516B> <94AB> <9262> <94AC> <6E8C> <94AD> <767A> endbfchar 100 beginbfchar <94AE> <9197> <94AF> <9AEA> <94B0> <4F10> <94B1> <7F70> <94B2> <629C> <94B3> <7B4F> <94B4> <95A5> <94B5> <9CE9> <94B6> <567A> <94B7> <5859> <94B8> <86E4> <94B9> <96BC> <94BA> <4F34> <94BB> <5224> <94BC> <534A> <94BD> <53CD> <94BE> <53DB> <94BF> <5E06> <94C0> <642C> <94C1> <6591> <94C2> <677F> <94C3> <6C3E> <94C4> <6C4E> <94C5> <7248> <94C6> <72AF> <94C7> <73ED> <94C8> <7554> <94C9> <7E41> <94CA> <822C> <94CB> <85E9> <94CC> <8CA9> <94CD> <7BC4> <94CE> <91C6> <94CF> <7169> <94D0> <9812> <94D1> <98EF> <94D2> <633D> <94D3> <6669> <94D4> <756A> <94D5> <76E4> <94D6> <78D0> <94D7> <8543> <94D8> <86EE> <94D9> <532A> <94DA> <5351> <94DB> <5426> <94DC> <5983> <94DD> <5E87> <94DE> <5F7C> <94DF> <60B2> <94E0> <6249> <94E1> <6279> <94E2> <62AB> <94E3> <6590> <94E4> <6BD4> <94E5> <6CCC> <94E6> <75B2> <94E7> <76AE> <94E8> <7891> <94E9> <79D8> <94EA> <7DCB> <94EB> <7F77> <94EC> <80A5> <94ED> <88AB> <94EE> <8AB9> <94EF> <8CBB> <94F0> <907F> <94F1> <975E> <94F2> <98DB> <94F3> <6A0B> <94F4> <7C38> <94F5> <5099> <94F6> <5C3E> <94F7> <5FAE> <94F8> <6787> <94F9> <6BD8> <94FA> <7435> <94FB> <7709> <94FC> <7F8E> <9540> <9F3B> <9541> <67CA> <9542> <7A17> <9543> <5339> <9544> <758B> <9545> <9AED> <9546> <5F66> <9547> <819D> <9548> <83F1> <9549> <8098> <954A> <5F3C> <954B> <5FC5> <954C> <7562> <954D> <7B46> <954E> <903C> <954F> <6867> <9550> <59EB> <9551> <5A9B> <9552> <7D10> <9553> <767E> <9554> <8B2C> endbfchar 100 beginbfchar <9555> <4FF5> <9556> <5F6A> <9557> <6A19> <9558> <6C37> <9559> <6F02> <955A> <74E2> <955B> <7968> <955C> <8868> <955D> <8A55> <955E> <8C79> <955F> <5EDF> <9560> <63CF> <9561> <75C5> <9562> <79D2> <9563> <82D7> <9564> <9328> <9565> <92F2> <9566> <849C> <9567> <86ED> <9568> <9C2D> <9569> <54C1> <956A> <5F6C> <956B> <658C> <956C> <6D5C> <956D> <7015> <956E> <8CA7> <956F> <8CD3> <9570> <983B> <9571> <654F> <9572> <74F6> <9573> <4E0D> <9574> <4ED8> <9575> <57E0> <9576> <592B> <9577> <5A66> <9578> <5BCC> <9579> <51A8> <957A> <5E03> <957B> <5E9C> <957C> <6016> <957D> <6276> <957E> <6577> <9580> <65A7> <9581> <666E> <9582> <6D6E> <9583> <7236> <9584> <7B26> <9585> <8150> <9586> <819A> <9587> <8299> <9588> <8B5C> <9589> <8CA0> <958A> <8CE6> <958B> <8D74> <958C> <961C> <958D> <9644> <958E> <4FAE> <958F> <64AB> <9590> <6B66> <9591> <821E> <9592> <8461> <9593> <856A> <9594> <90E8> <9595> <5C01> <9596> <6953> <9597> <98A8> <9598> <847A> <9599> <8557> <959A> <4F0F> <959B> <526F> <959C> <5FA9> <959D> <5E45> <959E> <670D> <959F> <798F> <95A0> <8179> <95A1> <8907> <95A2> <8986> <95A3> <6DF5> <95A4> <5F17> <95A5> <6255> <95A6> <6CB8> <95A7> <4ECF> <95A8> <7269> <95A9> <9B92> <95AA> <5206> <95AB> <543B> <95AC> <5674> <95AD> <58B3> <95AE> <61A4> <95AF> <626E> <95B0> <711A> <95B1> <596E> <95B2> <7C89> <95B3> <7CDE> <95B4> <7D1B> <95B5> <96F0> <95B6> <6587> <95B7> <805E> <95B8> <4E19> <95B9> <4F75> endbfchar 100 beginbfchar <95BA> <5175> <95BB> <5840> <95BC> <5E63> <95BD> <5E73> <95BE> <5F0A> <95BF> <67C4> <95C0> <4E26> <95C1> <853D> <95C2> <9589> <95C3> <965B> <95C4> <7C73> <95C5> <9801> <95C6> <50FB> <95C7> <58C1> <95C8> <7656> <95C9> <78A7> <95CA> <5225> <95CB> <77A5> <95CC> <8511> <95CD> <7B86> <95CE> <504F> <95CF> <5909> <95D0> <7247> <95D1> <7BC7> <95D2> <7DE8> <95D3> <8FBA> <95D4> <8FD4> <95D5> <904D> <95D6> <4FBF> <95D7> <52C9> <95D8> <5A29> <95D9> <5F01> <95DA> <97AD> <95DB> <4FDD> <95DC> <8217> <95DD> <92EA> <95DE> <5703> <95DF> <6355> <95E0> <6B69> <95E1> <752B> <95E2> <88DC> <95E3> <8F14> <95E4> <7A42> <95E5> <52DF> <95E6> <5893> <95E7> <6155> <95E8> <620A> <95E9> <66AE> <95EA> <6BCD> <95EB> <7C3F> <95EC> <83E9> <95ED> <5023> <95EE> <4FF8> <95EF> <5305> <95F0> <5446> <95F1> <5831> <95F2> <5949> <95F3> <5B9D> <95F4> <5CF0> <95F5> <5CEF> <95F6> <5D29> <95F7> <5E96> <95F8> <62B1> <95F9> <6367> <95FA> <653E> <95FB> <65B9> <95FC> <670B> <9640> <6CD5> <9641> <6CE1> <9642> <70F9> <9643> <7832> <9644> <7E2B> <9645> <80DE> <9646> <82B3> <9647> <840C> <9648> <84EC> <9649> <8702> <964A> <8912> <964B> <8A2A> <964C> <8C4A> <964D> <90A6> <964E> <92D2> <964F> <98FD> <9650> <9CF3> <9651> <9D6C> <9652> <4E4F> <9653> <4EA1> <9654> <508D> <9655> <5256> <9656> <574A> <9657> <59A8> <9658> <5E3D> <965B> <623F> <965C> <66B4> <965D> <671B> <965E> <67D0> <965F> <68D2> <9660> <5192> <9661> <7D21> <9662> <80AA> endbfchar 100 beginbfchar <9663> <81A8> <9664> <8B00> <9665> <8C8C> <9666> <8CBF> <9667> <927E> <9668> <9632> <9669> <5420> <966A> <982C> <966B> <5317> <966C> <50D5> <966D> <535C> <966E> <58A8> <966F> <64B2> <9670> <6734> <9671> <7267> <9672> <7766> <9673> <7A46> <9674> <91E6> <9675> <52C3> <9676> <6CA1> <9677> <6B86> <9678> <5800> <9679> <5E4C> <967A> <5954> <967B> <672C> <967C> <7FFB> <967D> <51E1> <967E> <76C6> <9680> <6469> <9681> <78E8> <9682> <9B54> <9683> <9EBB> <9684> <57CB> <9685> <59B9> <9686> <6627> <9687> <679A> <9688> <6BCE> <9689> <54E9> <968A> <69D9> <968B> <5E55> <968C> <819C> <968D> <6795> <968E> <9BAA> <968F> <67FE> <9690> <9C52> <9691> <685D> <9692> <4EA6> <9693> <4FE3> <9694> <53C8> <9695> <62B9> <9696> <672B> <9697> <6CAB> <9698> <8FC4> <9699> <4FAD> <969A> <7E6D> <969B> <9EBF> <969C> <4E07> <969D> <6162> <969E> <6E80> <969F> <6F2B> <96A0> <8513> <96A1> <5473> <96A2> <672A> <96A3> <9B45> <96A4> <5DF3> <96A5> <7B95> <96A6> <5CAC> <96A7> <5BC6> <96A8> <871C> <96A9> <6E4A> <96AA> <84D1> <96AB> <7A14> <96AC> <8108> <96AD> <5999> <96AE> <7C8D> <96AF> <6C11> <96B0> <7720> <96B1> <52D9> <96B2> <5922> <96B3> <7121> <96B4> <725F> <96B5> <77DB> <96B6> <9727> <96B7> <9D61> <96B8> <690B> <96B9> <5A7F> <96BA> <5A18> <96BB> <51A5> <96BC> <540D> <96BD> <547D> <96BE> <660E> <96BF> <76DF> <96C0> <8FF7> <96C1> <9298> <96C2> <9CF4> <96C3> <59EA> <96C4> <725D> <96C5> <6EC5> <96C6> <514D> <96C7> <68C9> endbfchar 100 beginbfchar <96C8> <7DBF> <96C9> <7DEC> <96CA> <9762> <96CB> <9EBA> <96CC> <6478> <96CD> <6A21> <96CE> <8302> <96CF> <5984> <96D0> <5B5F> <96D1> <6BDB> <96D2> <731B> <96D3> <76F2> <96D4> <7DB2> <96D5> <8017> <96D6> <8499> <96D7> <5132> <96D8> <6728> <96D9> <9ED9> <96DA> <76EE> <96DB> <6762> <96DC> <52FF> <96DD> <9905> <96DE> <5C24> <96DF> <623B> <96E0> <7C7E> <96E1> <8CB0> <96E2> <554F> <96E3> <60B6> <96E4> <7D0B> <96E5> <9580> <96E6> <5301> <96E7> <4E5F> <96E8> <51B6> <96E9> <591C> <96EA> <723A> <96EB> <8036> <96EC> <91CE> <96ED> <5F25> <96EE> <77E2> <96EF> <5384> <96F0> <5F79> <96F1> <7D04> <96F2> <85AC> <96F3> <8A33> <96F4> <8E8D> <96F5> <9756> <96F6> <67F3> <96F7> <85AE> <96F8> <9453> <96F9> <6109> <96FA> <6108> <96FB> <6CB9> <96FC> <7652> <9740> <8AED> <9741> <8F38> <9742> <552F> <9743> <4F51> <9744> <512A> <9745> <52C7> <9746> <53CB> <9747> <5BA5> <9748> <5E7D> <9749> <60A0> <974A> <6182> <974B> <63D6> <974C> <6709> <974D> <67DA> <974E> <6E67> <974F> <6D8C> <9752> <7531> <9753> <7950> <9754> <88D5> <9755> <8A98> <9756> <904A> <9757> <9091> <9758> <90F5> <9759> <96C4> <975A> <878D> <975B> <5915> <975C> <4E88> <975D> <4F59> <975E> <4E0E> <975F> <8A89> <9760> <8F3F> <9761> <9810> <9762> <50AD> <9763> <5E7C> <9764> <5996> <9765> <5BB9> <9766> <5EB8> <9767> <63DA> <9768> <63FA> <9769> <64C1> <976A> <66DC> <976B> <694A> <976C> <69D8> <976D> <6D0B> <976E> <6EB6> <976F> <7194> <9770> <7528> endbfchar 100 beginbfchar <9771> <7AAF> <9772> <7F8A> <9773> <8000> <9774> <8449> <9775> <84C9> <9776> <8981> <9777> <8B21> <9778> <8E0A> <9779> <9065> <977A> <967D> <977B> <990A> <977C> <617E> <977D> <6291> <977E> <6B32> <9780> <6C83> <9781> <6D74> <9782> <7FCC> <9783> <7FFC> <9784> <6DC0> <9785> <7F85> <9786> <87BA> <9787> <88F8> <9788> <6765> <9789> <83B1> <978A> <983C> <978B> <96F7> <978C> <6D1B> <978D> <7D61> <978E> <843D> <978F> <916A> <9790> <4E71> <9791> <5375> <9792> <5D50> <9793> <6B04> <9794> <6FEB> <9795> <85CD> <9796> <862D> <9797> <89A7> <9798> <5229> <9799> <540F> <979A> <5C65> <979B> <674E> <979C> <68A8> <979D> <7406> <979E> <7483> <979F> <75E2> <97A0> <88CF> <97A1> <88E1> <97A2> <91CC> <97A3> <96E2> <97A4> <9678> <97A5> <5F8B> <97A6> <7387> <97A7> <7ACB> <97A8> <844E> <97A9> <63A0> <97AA> <7565> <97AB> <5289> <97AC> <6D41> <97AD> <6E9C> <97AE> <7409> <97AF> <7559> <97B0> <786B> <97B1> <7C92> <97B2> <9686> <97B3> <7ADC> <97B4> <9F8D> <97B5> <4FB6> <97B6> <616E> <97B7> <65C5> <97B8> <865C> <97B9> <4E86> <97BA> <4EAE> <97BB> <50DA> <97BC> <4E21> <97BD> <51CC> <97BE> <5BEE> <97BF> <6599> <97C0> <6881> <97C1> <6DBC> <97C2> <731F> <97C3> <7642> <97C4> <77AD> <97C5> <7A1C> <97C6> <7CE7> <97C7> <826F> <97C8> <8AD2> <97C9> <907C> <97CA> <91CF> <97CB> <9675> <97CC> <9818> <97CD> <529B> <97CE> <7DD1> <97CF> <502B> <97D0> <5398> <97D1> <6797> <97D2> <6DCB> <97D3> <71D0> <97D4> <7433> <97D5> <81E8> endbfchar 100 beginbfchar <97D6> <8F2A> <97D7> <96A3> <97D8> <9C57> <97D9> <9E9F> <97DA> <7460> <97DB> <5841> <97DC> <6D99> <97DD> <7D2F> <97DE> <985E> <97DF> <4EE4> <97E0> <4F36> <97E1> <4F8B> <97E2> <51B7> <97E3> <52B1> <97E4> <5DBA> <97E5> <601C> <97E6> <73B2> <97E7> <793C> <97E8> <82D3> <97E9> <9234> <97EA> <96B7> <97EB> <96F6> <97EC> <970A> <97ED> <9E97> <97EE> <9F62> <97EF> <66A6> <97F0> <6B74> <97F1> <5217> <97F2> <52A3> <97F3> <70C8> <97F4> <88C2> <97F5> <5EC9> <97F6> <604B> <97F7> <6190> <97F8> <6F23> <97F9> <7149> <97FA> <7C3E> <97FB> <7DF4> <97FC> <806F> <9840> <84EE> <9841> <9023> <9842> <932C> <9843> <5442> <9844> <9B6F> <9845> <6AD3> <9846> <7089> <9847> <8CC2> <9848> <8DEF> <9849> <9732> <984A> <52B4> <984B> <5A41> <984C> <5ECA> <984D> <5F04> <984E> <6717> <984F> <697C> <9850> <6994> <9851> <6D6A> <9852> <6F0F> <9853> <7262> <9854> <72FC> <9855> <7BED> <9856> <8001> <9857> <807E> <9858> <874B> <9859> <90CE> <985A> <516D> <985B> <9E93> <985C> <7984> <985D> <808B> <985E> <9332> <985F> <8AD6> <9860> <502D> <9861> <548C> <9862> <8A71> <9863> <6B6A> <9864> <8CC4> <9865> <8107> <9866> <60D1> <9867> <67A0> <9868> <9DF2> <9869> <4E99> <986A> <4E98> <986B> <9C10> <986C> <8A6B> <986D> <85C1> <986E> <8568> <986F> <6900> <9870> <6E7E> <9871> <7897> <9872> <8155> <989F> <5F0C> <98A0> <4E10> <98A1> <4E15> <98A2> <4E2A> <98A3> <4E31> <98A4> <4E36> <98A5> <4E3C> <98A6> <4E3F> <98A7> <4E42> <98A8> <4E56> endbfchar 100 beginbfchar <98A9> <4E58> <98AA> <4E82> <98AB> <4E85> <98AC> <8C6B> <98AD> <4E8A> <98AE> <8212> <98AF> <5F0D> <98B0> <4E8E> <98B4> <4EA2> <98B5> <4EB0> <98B6> <4EB3> <98B7> <4EB6> <98B8> <4ECE> <98B9> <4ECD> <98BA> <4EC4> <98BB> <4EC6> <98BC> <4EC2> <98BD> <4ED7> <98BE> <4EDE> <98BF> <4EED> <98C0> <4EDF> <98C1> <4EF7> <98C2> <4F09> <98C3> <4F5A> <98C4> <4F30> <98C5> <4F5B> <98C6> <4F5D> <98C7> <4F57> <98C8> <4F47> <98C9> <4F76> <98CA> <4F88> <98CB> <4F8F> <98CC> <4F98> <98CD> <4F7B> <98CE> <4F69> <98CF> <4F70> <98D0> <4F91> <98D1> <4F6F> <98D2> <4F86> <98D3> <4F96> <98D4> <5118> <98D5> <4FD4> <98D6> <4FDF> <98D7> <4FCE> <98D8> <4FD8> <98D9> <4FDB> <98DA> <4FD1> <98DB> <4FDA> <98DC> <4FD0> <98DF> <501A> <98E0> <5028> <98E1> <5014> <98E2> <502A> <98E3> <5025> <98E4> <5005> <98E5> <4F1C> <98E6> <4FF6> <98E7> <5021> <98E8> <5029> <98E9> <502C> <98EA> <4FFE> <98EB> <4FEF> <98EC> <5011> <98ED> <5006> <98EE> <5043> <98EF> <5047> <98F0> <6703> <98F1> <5055> <98F2> <5050> <98F3> <5048> <98F4> <505A> <98F5> <5056> <98F6> <506C> <98F7> <5078> <98F8> <5080> <98F9> <509A> <98FA> <5085> <98FB> <50B4> <98FC> <50B2> <9942> <50B3> <9943> <50C2> <9944> <50D6> <9945> <50DE> <9946> <50E5> <9947> <50ED> <9948> <50E3> <9949> <50EE> <994A> <50F9> <994B> <50F5> <994C> <5109> <994F> <5116> <9950> <5115> <9951> <5114> <9952> <511A> <9953> <5121> <9954> <513A> <9955> <5137> <9956> <513C> <9957> <513B> <995A> <5152> endbfchar 100 beginbfchar <995B> <514C> <995C> <5154> <995D> <5162> <995E> <7AF8> <9961> <516E> <9962> <5180> <9963> <5182> <9964> <56D8> <9965> <518C> <9966> <5189> <9967> <518F> <9968> <5191> <9969> <5193> <996C> <51A4> <996D> <51A6> <996E> <51A2> <9972> <51B3> <9975> <51B0> <9976> <51B5> <9977> <51BD> <9978> <51C5> <9979> <51C9> <997A> <51DB> <997B> <51E0> <997C> <8655> <997D> <51E9> <997E> <51ED> <9980> <51F0> <9981> <51F5> <9982> <51FE> <9983> <5204> <9984> <520B> <9985> <5214> <9986> <520E> <9987> <5227> <9988> <522A> <9989> <522E> <998A> <5233> <998B> <5239> <998C> <524F> <998D> <5244> <9990> <525E> <9991> <5254> <9992> <526A> <9993> <5274> <9994> <5269> <9995> <5273> <9996> <527F> <9997> <527D> <9998> <528D> <9999> <5294> <999A> <5292> <999B> <5271> <999C> <5288> <999D> <5291> <999E> <8FA8> <999F> <8FA7> <99A2> <52BC> <99A3> <52B5> <99A4> <52C1> <99A5> <52CD> <99A6> <52D7> <99A7> <52DE> <99A8> <52E3> <99A9> <52E6> <99AA> <98ED> <99AB> <52E0> <99AC> <52F3> <99AD> <52F5> <99B0> <5306> <99B1> <5308> <99B2> <7538> <99B3> <530D> <99B4> <5310> <99B5> <530F> <99B6> <5315> <99B7> <531A> <99B8> <5323> <99B9> <532F> <99BA> <5331> <99BB> <5333> <99BC> <5338> <99BD> <5340> <99BE> <5346> <99BF> <5345> <99C0> <4E17> <99C1> <5349> <99C2> <534D> <99C3> <51D6> <99C4> <535E> <99C5> <5369> <99C6> <536E> <99C7> <5918> <99C8> <537B> <99C9> <5377> <99CA> <5382> <99CB> <5396> <99CC> <53A0> <99CD> <53A6> <99CE> <53A5> endbfchar 100 beginbfchar <99CF> <53AE> <99D0> <53B0> <99D1> <53B6> <99D2> <53C3> <99D3> <7C12> <99D4> <96D9> <99D5> <53DF> <99D6> <66FC> <99D7> <71EE> <99D8> <53EE> <99D9> <53E8> <99DA> <53ED> <99DB> <53FA> <99DC> <5401> <99DD> <543D> <99DE> <5440> <99E1> <543C> <99E2> <542E> <99E3> <5436> <99E4> <5429> <99E5> <541D> <99E6> <544E> <99E7> <548F> <99E8> <5475> <99E9> <548E> <99EA> <545F> <99EB> <5471> <99EC> <5477> <99ED> <5470> <99EE> <5492> <99EF> <547B> <99F0> <5480> <99F1> <5476> <99F2> <5484> <99F3> <5490> <99F4> <5486> <99F5> <54C7> <99F6> <54A2> <99F7> <54B8> <99F8> <54A5> <99F9> <54AC> <99FA> <54C4> <99FB> <54C8> <99FC> <54A8> <9A40> <54AB> <9A41> <54C2> <9A42> <54A4> <9A43> <54BE> <9A44> <54BC> <9A45> <54D8> <9A48> <550F> <9A49> <5514> <9A4A> <54FD> <9A4B> <54EE> <9A4C> <54ED> <9A4D> <54FA> <9A4E> <54E2> <9A4F> <5539> <9A50> <5540> <9A51> <5563> <9A52> <554C> <9A53> <552E> <9A54> <555C> <9A55> <5545> <9A58> <5538> <9A59> <5533> <9A5A> <555D> <9A5B> <5599> <9A5C> <5580> <9A5D> <54AF> <9A5E> <558A> <9A5F> <559F> <9A60> <557B> <9A61> <557E> <9A62> <5598> <9A63> <559E> <9A64> <55AE> <9A65> <557C> <9A66> <5583> <9A67> <55A9> <9A68> <5587> <9A69> <55A8> <9A6A> <55DA> <9A6B> <55C5> <9A6C> <55DF> <9A6D> <55C4> <9A6E> <55DC> <9A6F> <55E4> <9A70> <55D4> <9A71> <5614> <9A72> <55F7> <9A73> <5616> <9A74> <55FE> <9A75> <55FD> <9A76> <561B> <9A77> <55F9> <9A78> <564E> <9A79> <5650> <9A7A> <71DF> <9A7B> <5634> endbfchar 100 beginbfchar <9A7C> <5636> <9A7D> <5632> <9A7E> <5638> <9A80> <566B> <9A81> <5664> <9A82> <562F> <9A83> <566C> <9A84> <566A> <9A85> <5686> <9A86> <5680> <9A87> <568A> <9A88> <56A0> <9A89> <5694> <9A8A> <568F> <9A8B> <56A5> <9A8C> <56AE> <9A8D> <56B6> <9A8E> <56B4> <9A8F> <56C2> <9A90> <56BC> <9A91> <56C1> <9A92> <56C3> <9A93> <56C0> <9A94> <56C8> <9A95> <56CE> <9A96> <56D1> <9A97> <56D3> <9A98> <56D7> <9A99> <56EE> <9A9A> <56F9> <9A9B> <5700> <9A9C> <56FF> <9A9D> <5704> <9A9E> <5709> <9A9F> <5708> <9AA0> <570B> <9AA1> <570D> <9AA2> <5713> <9AA3> <5718> <9AA4> <5716> <9AA5> <55C7> <9AA6> <571C> <9AA7> <5726> <9AAA> <574E> <9AAB> <573B> <9AAC> <5740> <9AAD> <574F> <9AAE> <5769> <9AAF> <57C0> <9AB0> <5788> <9AB1> <5761> <9AB2> <577F> <9AB3> <5789> <9AB4> <5793> <9AB5> <57A0> <9AB6> <57B3> <9AB7> <57A4> <9AB8> <57AA> <9AB9> <57B0> <9ABA> <57C3> <9ABB> <57C6> <9ABC> <57D4> <9ABF> <580A> <9AC0> <57D6> <9AC1> <57E3> <9AC2> <580B> <9AC3> <5819> <9AC4> <581D> <9AC5> <5872> <9AC6> <5821> <9AC7> <5862> <9AC8> <584B> <9AC9> <5870> <9ACA> <6BC0> <9ACB> <5852> <9ACC> <583D> <9ACD> <5879> <9ACE> <5885> <9ACF> <58B9> <9AD0> <589F> <9AD1> <58AB> <9AD2> <58BA> <9AD3> <58DE> <9AD4> <58BB> <9AD5> <58B8> <9AD6> <58AE> <9AD7> <58C5> <9AD8> <58D3> <9AD9> <58D1> <9ADA> <58D7> <9ADB> <58D9> <9ADC> <58D8> <9ADD> <58E5> <9ADE> <58DC> <9ADF> <58E4> <9AE0> <58DF> <9AE1> <58EF> <9AE2> <58FA> <9AE3> <58F9> <9AE7> <5902> endbfchar 100 beginbfchar <9AE8> <590A> <9AE9> <5910> <9AEA> <591B> <9AEB> <68A6> <9AEC> <5925> <9AEF> <5932> <9AF0> <5938> <9AF1> <593E> <9AF2> <7AD2> <9AF3> <5955> <9AF4> <5950> <9AF5> <594E> <9AF6> <595A> <9AF7> <5958> <9AF8> <5962> <9AF9> <5960> <9AFA> <5967> <9AFB> <596C> <9AFC> <5969> <9B40> <5978> <9B41> <5981> <9B42> <599D> <9B43> <4F5E> <9B44> <4FAB> <9B45> <59A3> <9B46> <59B2> <9B47> <59C6> <9B48> <59E8> <9B49> <59DC> <9B4A> <598D> <9B4D> <5A25> <9B4E> <5A1F> <9B4F> <5A11> <9B50> <5A1C> <9B51> <5A09> <9B52> <5A1A> <9B53> <5A40> <9B54> <5A6C> <9B55> <5A49> <9B58> <5A62> <9B59> <5A6A> <9B5A> <5A9A> <9B5B> <5ABC> <9B5C> <5ABE> <9B5D> <5ACB> <9B5E> <5AC2> <9B5F> <5ABD> <9B60> <5AE3> <9B61> <5AD7> <9B62> <5AE6> <9B63> <5AE9> <9B64> <5AD6> <9B67> <5B0C> <9B68> <5B0B> <9B69> <5B16> <9B6A> <5B32> <9B6B> <5AD0> <9B6C> <5B2A> <9B6D> <5B36> <9B6E> <5B3E> <9B6F> <5B43> <9B70> <5B45> <9B71> <5B40> <9B72> <5B51> <9B73> <5B55> <9B76> <5B65> <9B77> <5B69> <9B78> <5B70> <9B79> <5B73> <9B7A> <5B75> <9B7B> <5B78> <9B7C> <6588> <9B7D> <5B7A> <9B7E> <5B80> <9B80> <5B83> <9B81> <5BA6> <9B82> <5BB8> <9B83> <5BC3> <9B84> <5BC7> <9B85> <5BC9> <9B86> <5BD4> <9B87> <5BD0> <9B88> <5BE4> <9B89> <5BE6> <9B8A> <5BE2> <9B8B> <5BDE> <9B8C> <5BE5> <9B8D> <5BEB> <9B8E> <5BF0> <9B8F> <5BF6> <9B90> <5BF3> <9B91> <5C05> <9B94> <5C0D> <9B95> <5C13> <9B96> <5C20> <9B97> <5C22> <9B98> <5C28> <9B9B> <5C41> <9B9C> <5C46> <9B9D> <5C4E> endbfchar 100 beginbfchar <9B9E> <5C53> <9B9F> <5C50> <9BA0> <5C4F> <9BA1> <5B71> <9BA2> <5C6C> <9BA3> <5C6E> <9BA4> <4E62> <9BA5> <5C76> <9BA6> <5C79> <9BA7> <5C8C> <9BA8> <5C91> <9BA9> <5C94> <9BAA> <599B> <9BAB> <5CAB> <9BAC> <5CBB> <9BAD> <5CB6> <9BAE> <5CBC> <9BAF> <5CB7> <9BB0> <5CC5> <9BB1> <5CBE> <9BB2> <5CC7> <9BB3> <5CD9> <9BB4> <5CE9> <9BB5> <5CFD> <9BB6> <5CFA> <9BB7> <5CED> <9BB8> <5D8C> <9BB9> <5CEA> <9BBA> <5D0B> <9BBB> <5D15> <9BBC> <5D17> <9BBD> <5D5C> <9BBE> <5D1F> <9BBF> <5D1B> <9BC0> <5D11> <9BC1> <5D14> <9BC2> <5D22> <9BC3> <5D1A> <9BC4> <5D19> <9BC5> <5D18> <9BC6> <5D4C> <9BC7> <5D52> <9BC8> <5D4E> <9BC9> <5D4B> <9BCA> <5D6C> <9BCB> <5D73> <9BCC> <5D76> <9BCD> <5D87> <9BCE> <5D84> <9BCF> <5D82> <9BD0> <5DA2> <9BD1> <5D9D> <9BD2> <5DAC> <9BD3> <5DAE> <9BD4> <5DBD> <9BD5> <5D90> <9BD6> <5DB7> <9BD7> <5DBC> <9BD8> <5DC9> <9BD9> <5DCD> <9BDA> <5DD3> <9BDB> <5DD2> <9BDC> <5DD6> <9BDD> <5DDB> <9BDE> <5DEB> <9BDF> <5DF2> <9BE0> <5DF5> <9BE1> <5E0B> <9BE2> <5E1A> <9BE3> <5E19> <9BE4> <5E11> <9BE5> <5E1B> <9BE8> <5E44> <9BE9> <5E43> <9BEA> <5E40> <9BEB> <5E4E> <9BEC> <5E57> <9BED> <5E54> <9BEE> <5E5F> <9BEF> <5E62> <9BF0> <5E64> <9BF1> <5E47> <9BF4> <5E7A> <9BF5> <9EBC> <9BF6> <5E7F> <9BF7> <5EA0> <9BFA> <5EC8> <9BFB> <5ED0> <9BFC> <5ECF> <9C40> <5ED6> <9C41> <5EE3> <9C42> <5EDD> <9C45> <5EE2> <9C46> <5EE1> <9C49> <5EEC> <9C4A> <5EF1> <9C4B> <5EF3> <9C4C> <5EF0> <9C4D> <5EF4> <9C4E> <5EF8> endbfchar 100 beginbfchar <9C4F> <5EFE> <9C50> <5F03> <9C51> <5F09> <9C52> <5F5D> <9C53> <5F5C> <9C54> <5F0B> <9C55> <5F11> <9C56> <5F16> <9C57> <5F29> <9C58> <5F2D> <9C59> <5F38> <9C5A> <5F41> <9C5B> <5F48> <9C5C> <5F4C> <9C5D> <5F4E> <9C5E> <5F2F> <9C5F> <5F51> <9C62> <5F59> <9C63> <5F61> <9C64> <5F6D> <9C65> <5F73> <9C66> <5F77> <9C67> <5F83> <9C68> <5F82> <9C69> <5F7F> <9C6A> <5F8A> <9C6B> <5F88> <9C6C> <5F91> <9C6D> <5F87> <9C6E> <5F9E> <9C6F> <5F99> <9C70> <5F98> <9C71> <5FA0> <9C72> <5FA8> <9C73> <5FAD> <9C74> <5FBC> <9C75> <5FD6> <9C76> <5FFB> <9C77> <5FE4> <9C78> <5FF8> <9C79> <5FF1> <9C7A> <5FDD> <9C7B> <60B3> <9C7C> <5FFF> <9C7D> <6021> <9C7E> <6060> <9C80> <6019> <9C81> <6010> <9C82> <6029> <9C83> <600E> <9C84> <6031> <9C85> <601B> <9C86> <6015> <9C87> <602B> <9C88> <6026> <9C89> <600F> <9C8A> <603A> <9C8B> <605A> <9C8C> <6041> <9C8D> <606A> <9C8E> <6077> <9C8F> <605F> <9C90> <604A> <9C91> <6046> <9C92> <604D> <9C93> <6063> <9C94> <6043> <9C95> <6064> <9C96> <6042> <9C97> <606C> <9C98> <606B> <9C99> <6059> <9C9A> <6081> <9C9B> <608D> <9C9C> <60E7> <9C9D> <6083> <9C9E> <609A> <9C9F> <6084> <9CA0> <609B> <9CA3> <6092> <9CA4> <60A7> <9CA5> <608B> <9CA6> <60E1> <9CA7> <60B8> <9CA8> <60E0> <9CA9> <60D3> <9CAA> <60B4> <9CAB> <5FF0> <9CAC> <60BD> <9CAD> <60C6> <9CAE> <60B5> <9CAF> <60D8> <9CB0> <614D> <9CB1> <6115> <9CB2> <6106> <9CB5> <6100> <9CB6> <60F4> <9CB7> <60FA> <9CB8> <6103> <9CB9> <6121> endbfchar 100 beginbfchar <9CBA> <60FB> <9CBB> <60F1> <9CBE> <6147> <9CBF> <613E> <9CC0> <6128> <9CC1> <6127> <9CC2> <614A> <9CC3> <613F> <9CC4> <613C> <9CC5> <612C> <9CC6> <6134> <9CC7> <613D> <9CC8> <6142> <9CC9> <6144> <9CCA> <6173> <9CCB> <6177> <9CCF> <616B> <9CD0> <6174> <9CD1> <616F> <9CD2> <6165> <9CD3> <6171> <9CD4> <615F> <9CD5> <615D> <9CD6> <6153> <9CD7> <6175> <9CD8> <6199> <9CD9> <6196> <9CDA> <6187> <9CDB> <61AC> <9CDC> <6194> <9CDD> <619A> <9CDE> <618A> <9CDF> <6191> <9CE0> <61AB> <9CE1> <61AE> <9CE2> <61CC> <9CE3> <61CA> <9CE4> <61C9> <9CE5> <61F7> <9CE6> <61C8> <9CE7> <61C3> <9CE8> <61C6> <9CE9> <61BA> <9CEA> <61CB> <9CEB> <7F79> <9CEC> <61CD> <9CED> <61E6> <9CEE> <61E3> <9CEF> <61F6> <9CF0> <61FA> <9CF1> <61F4> <9CF2> <61FF> <9CF3> <61FD> <9CF4> <61FC> <9CF5> <61FE> <9CF6> <6200> <9CF9> <620D> <9CFA> <620C> <9CFB> <6214> <9CFC> <621B> <9D40> <621E> <9D41> <6221> <9D42> <622A> <9D43> <622E> <9D44> <6230> <9D47> <6241> <9D48> <624E> <9D49> <625E> <9D4A> <6263> <9D4B> <625B> <9D4C> <6260> <9D4D> <6268> <9D4E> <627C> <9D4F> <6282> <9D50> <6289> <9D51> <627E> <9D54> <6296> <9D55> <62D4> <9D56> <6283> <9D57> <6294> <9D58> <62D7> <9D59> <62D1> <9D5A> <62BB> <9D5B> <62CF> <9D5C> <62FF> <9D5D> <62C6> <9D5E> <64D4> <9D5F> <62C8> <9D60> <62DC> <9D61> <62CC> <9D62> <62CA> <9D63> <62C2> <9D64> <62C7> <9D65> <629B> <9D66> <62C9> <9D67> <630C> <9D68> <62EE> <9D69> <62F1> <9D6A> <6327> <9D6B> <6302> endbfchar 100 beginbfchar <9D6C> <6308> <9D6D> <62EF> <9D6E> <62F5> <9D6F> <6350> <9D70> <633E> <9D71> <634D> <9D72> <641C> <9D73> <634F> <9D74> <6396> <9D75> <638E> <9D76> <6380> <9D77> <63AB> <9D78> <6376> <9D79> <63A3> <9D7A> <638F> <9D7B> <6389> <9D7C> <639F> <9D7D> <63B5> <9D7E> <636B> <9D80> <6369> <9D81> <63BE> <9D82> <63E9> <9D83> <63C0> <9D84> <63C6> <9D85> <63E3> <9D86> <63C9> <9D87> <63D2> <9D88> <63F6> <9D89> <63C4> <9D8A> <6416> <9D8B> <6434> <9D8C> <6406> <9D8D> <6413> <9D8E> <6426> <9D8F> <6436> <9D90> <651D> <9D91> <6417> <9D92> <6428> <9D93> <640F> <9D94> <6467> <9D95> <646F> <9D96> <6476> <9D97> <644E> <9D98> <652A> <9D99> <6495> <9D9A> <6493> <9D9B> <64A5> <9D9C> <64A9> <9D9D> <6488> <9D9E> <64BC> <9D9F> <64DA> <9DA0> <64D2> <9DA1> <64C5> <9DA2> <64C7> <9DA3> <64BB> <9DA4> <64D8> <9DA5> <64C2> <9DA6> <64F1> <9DA7> <64E7> <9DA8> <8209> <9DAB> <62AC> <9DAC> <64E3> <9DAD> <64EF> <9DAE> <652C> <9DAF> <64F6> <9DB0> <64F4> <9DB1> <64F2> <9DB2> <64FA> <9DB3> <6500> <9DB4> <64FD> <9DB5> <6518> <9DB6> <651C> <9DB7> <6505> <9DB8> <6524> <9DB9> <6523> <9DBA> <652B> <9DBD> <6537> <9DBE> <6536> <9DBF> <6538> <9DC0> <754B> <9DC1> <6548> <9DC2> <6556> <9DC3> <6555> <9DC4> <654D> <9DC5> <6558> <9DC6> <655E> <9DC7> <655D> <9DC8> <6572> <9DC9> <6578> <9DCC> <8B8A> <9DCD> <659B> <9DCE> <659F> <9DCF> <65AB> <9DD0> <65B7> <9DD1> <65C3> <9DD2> <65C6> <9DD3> <65C1> <9DD4> <65C4> <9DD5> <65CC> <9DD6> <65D2> endbfchar 100 beginbfchar <9DD7> <65DB> <9DD8> <65D9> <9DDB> <65F1> <9DDC> <6772> <9DDD> <660A> <9DDE> <6603> <9DDF> <65FB> <9DE0> <6773> <9DE3> <6634> <9DE4> <661C> <9DE5> <664F> <9DE6> <6644> <9DE7> <6649> <9DE8> <6641> <9DE9> <665E> <9DEA> <665D> <9DEB> <6664> <9DEE> <665F> <9DEF> <6662> <9DF0> <6670> <9DF1> <6683> <9DF2> <6688> <9DF3> <668E> <9DF4> <6689> <9DF5> <6684> <9DF6> <6698> <9DF7> <669D> <9DF8> <66C1> <9DF9> <66B9> <9DFA> <66C9> <9DFB> <66BE> <9DFC> <66BC> <9E40> <66C4> <9E41> <66B8> <9E42> <66D6> <9E43> <66DA> <9E44> <66E0> <9E45> <663F> <9E46> <66E6> <9E47> <66E9> <9E48> <66F0> <9E49> <66F5> <9E4A> <66F7> <9E4B> <670F> <9E4C> <6716> <9E4D> <671E> <9E50> <9738> <9E51> <672E> <9E52> <673F> <9E53> <6736> <9E54> <6741> <9E55> <6738> <9E56> <6737> <9E57> <6746> <9E58> <675E> <9E59> <6760> <9E5A> <6759> <9E5D> <6789> <9E5E> <6770> <9E5F> <67A9> <9E60> <677C> <9E61> <676A> <9E62> <678C> <9E63> <678B> <9E64> <67A6> <9E65> <67A1> <9E66> <6785> <9E67> <67B7> <9E68> <67EF> <9E69> <67B4> <9E6A> <67EC> <9E6B> <67B3> <9E6C> <67E9> <9E6D> <67B8> <9E6E> <67E4> <9E6F> <67DE> <9E70> <67DD> <9E71> <67E2> <9E72> <67EE> <9E73> <67B9> <9E74> <67CE> <9E75> <67C6> <9E76> <67E7> <9E77> <6A9C> <9E78> <681E> <9E79> <6846> <9E7A> <6829> <9E7B> <6840> <9E7C> <684D> <9E7D> <6832> <9E7E> <684E> <9E80> <68B3> <9E81> <682B> <9E82> <6859> <9E83> <6863> <9E84> <6877> <9E85> <687F> <9E86> <689F> <9E87> <688F> <9E88> <68AD> endbfchar 100 beginbfchar <9E89> <6894> <9E8A> <689D> <9E8B> <689B> <9E8C> <6883> <9E8D> <6AAE> <9E8E> <68B9> <9E8F> <6874> <9E90> <68B5> <9E91> <68A0> <9E92> <68BA> <9E93> <690F> <9E94> <688D> <9E95> <687E> <9E96> <6901> <9E97> <68CA> <9E98> <6908> <9E99> <68D8> <9E9A> <6922> <9E9B> <6926> <9E9C> <68E1> <9E9D> <690C> <9E9E> <68CD> <9E9F> <68D4> <9EA0> <68E7> <9EA1> <68D5> <9EA2> <6936> <9EA3> <6912> <9EA4> <6904> <9EA5> <68D7> <9EA6> <68E3> <9EA7> <6925> <9EA8> <68F9> <9EA9> <68E0> <9EAA> <68EF> <9EAB> <6928> <9EAC> <692A> <9EAD> <691A> <9EAE> <6923> <9EAF> <6921> <9EB0> <68C6> <9EB1> <6979> <9EB2> <6977> <9EB3> <695C> <9EB4> <6978> <9EB5> <696B> <9EB6> <6954> <9EB7> <697E> <9EB8> <696E> <9EB9> <6939> <9EBA> <6974> <9EBB> <693D> <9EBC> <6959> <9EBD> <6930> <9EBE> <6961> <9EBF> <695E> <9EC0> <695D> <9EC1> <6981> <9EC2> <696A> <9EC3> <69B2> <9EC4> <69AE> <9EC5> <69D0> <9EC6> <69BF> <9EC7> <69C1> <9EC8> <69D3> <9EC9> <69BE> <9ECA> <69CE> <9ECB> <5BE8> <9ECC> <69CA> <9ECD> <69DD> <9ECE> <69BB> <9ECF> <69C3> <9ED0> <69A7> <9ED1> <6A2E> <9ED2> <6991> <9ED3> <69A0> <9ED4> <699C> <9ED5> <6995> <9ED6> <69B4> <9ED7> <69DE> <9ED8> <69E8> <9ED9> <6A02> <9EDA> <6A1B> <9EDB> <69FF> <9EDC> <6B0A> <9EDD> <69F9> <9EDE> <69F2> <9EDF> <69E7> <9EE0> <6A05> <9EE1> <69B1> <9EE2> <6A1E> <9EE3> <69ED> <9EE4> <6A14> <9EE5> <69EB> <9EE6> <6A0A> <9EE7> <6A12> <9EE8> <6AC1> <9EE9> <6A23> <9EEA> <6A13> <9EEB> <6A44> <9EEC> <6A0C> endbfchar 100 beginbfchar <9EED> <6A72> <9EEE> <6A36> <9EEF> <6A78> <9EF0> <6A47> <9EF1> <6A62> <9EF2> <6A59> <9EF3> <6A66> <9EF4> <6A48> <9EF5> <6A38> <9EF6> <6A22> <9EF7> <6A90> <9EF8> <6A8D> <9EF9> <6AA0> <9EFA> <6A84> <9F40> <6A97> <9F41> <8617> <9F42> <6ABB> <9F43> <6AC3> <9F44> <6AC2> <9F45> <6AB8> <9F46> <6AB3> <9F47> <6AAC> <9F48> <6ADE> <9F49> <6AD1> <9F4A> <6ADF> <9F4B> <6AAA> <9F4C> <6ADA> <9F4D> <6AEA> <9F4E> <6AFB> <9F4F> <6B05> <9F50> <8616> <9F51> <6AFA> <9F52> <6B12> <9F53> <6B16> <9F54> <9B31> <9F55> <6B1F> <9F56> <6B38> <9F57> <6B37> <9F58> <76DC> <9F59> <6B39> <9F5A> <98EE> <9F5B> <6B47> <9F5C> <6B43> <9F5D> <6B49> <9F5E> <6B50> <9F5F> <6B59> <9F60> <6B54> <9F61> <6B5B> <9F62> <6B5F> <9F63> <6B61> <9F68> <6B84> <9F69> <6B83> <9F6A> <6B8D> <9F6B> <6B98> <9F6C> <6B95> <9F6D> <6B9E> <9F6E> <6BA4> <9F71> <6BAF> <9F72> <6BB2> <9F73> <6BB1> <9F74> <6BB3> <9F75> <6BB7> <9F76> <6BBC> <9F77> <6BC6> <9F78> <6BCB> <9F79> <6BD3> <9F7A> <6BDF> <9F7B> <6BEC> <9F7C> <6BEB> <9F7D> <6BF3> <9F7E> <6BEF> <9F80> <9EBE> <9F81> <6C08> <9F84> <6C1B> <9F85> <6C24> <9F86> <6C23> <9F87> <6C5E> <9F88> <6C55> <9F89> <6C62> <9F8A> <6C6A> <9F8B> <6C82> <9F8C> <6C8D> <9F8D> <6C9A> <9F8E> <6C81> <9F8F> <6C9B> <9F90> <6C7E> <9F91> <6C68> <9F92> <6C73> <9F93> <6C92> <9F94> <6C90> <9F95> <6CC4> <9F96> <6CF1> <9F97> <6CD3> <9F98> <6CBD> <9F99> <6CD7> <9F9A> <6CC5> <9F9B> <6CDD> <9F9C> <6CAE> <9F9D> <6CB1> <9F9E> <6CBE> endbfchar 100 beginbfchar <9F9F> <6CBA> <9FA0> <6CDB> <9FA1> <6CEF> <9FA2> <6CD9> <9FA3> <6CEA> <9FA4> <6D1F> <9FA5> <884D> <9FA6> <6D36> <9FA7> <6D2B> <9FA8> <6D3D> <9FA9> <6D38> <9FAA> <6D19> <9FAB> <6D35> <9FAC> <6D33> <9FAD> <6D12> <9FAE> <6D0C> <9FAF> <6D63> <9FB0> <6D93> <9FB1> <6D64> <9FB2> <6D5A> <9FB3> <6D79> <9FB4> <6D59> <9FB5> <6D8E> <9FB6> <6D95> <9FB7> <6FE4> <9FB8> <6D85> <9FB9> <6DF9> <9FBA> <6E15> <9FBB> <6E0A> <9FBC> <6DB5> <9FBD> <6DC7> <9FBE> <6DE6> <9FBF> <6DB8> <9FC0> <6DC6> <9FC1> <6DEC> <9FC2> <6DDE> <9FC3> <6DCC> <9FC4> <6DE8> <9FC5> <6DD2> <9FC6> <6DC5> <9FC7> <6DFA> <9FC8> <6DD9> <9FC9> <6DE4> <9FCA> <6DD5> <9FCB> <6DEA> <9FCC> <6DEE> <9FCD> <6E2D> <9FCE> <6E6E> <9FCF> <6E2E> <9FD0> <6E19> <9FD1> <6E72> <9FD2> <6E5F> <9FD3> <6E3E> <9FD4> <6E23> <9FD5> <6E6B> <9FD6> <6E2B> <9FD7> <6E76> <9FD8> <6E4D> <9FD9> <6E1F> <9FDA> <6E43> <9FDB> <6E3A> <9FDC> <6E4E> <9FDD> <6E24> <9FDE> <6EFF> <9FDF> <6E1D> <9FE0> <6E38> <9FE1> <6E82> <9FE2> <6EAA> <9FE3> <6E98> <9FE4> <6EC9> <9FE5> <6EB7> <9FE6> <6ED3> <9FE7> <6EBD> <9FE8> <6EAF> <9FE9> <6EC4> <9FEA> <6EB2> <9FED> <6E8F> <9FEE> <6EA5> <9FEF> <6EC2> <9FF0> <6E9F> <9FF1> <6F41> <9FF2> <6F11> <9FF3> <704C> <9FF4> <6EEC> <9FF5> <6EF8> <9FF6> <6EFE> <9FF7> <6F3F> <9FF8> <6EF2> <9FF9> <6F31> <9FFA> <6EEF> <9FFB> <6F32> <9FFC> <6ECC> <E040> <6F3E> <E041> <6F13> <E042> <6EF7> <E043> <6F86> <E044> <6F7A> <E045> <6F78> <E046> <6F81> <E047> <6F80> endbfchar 100 beginbfchar <E048> <6F6F> <E049> <6F5B> <E04A> <6FF3> <E04B> <6F6D> <E04C> <6F82> <E04D> <6F7C> <E04E> <6F58> <E04F> <6F8E> <E050> <6F91> <E051> <6FC2> <E052> <6F66> <E053> <6FB3> <E054> <6FA3> <E055> <6FA1> <E056> <6FA4> <E057> <6FB9> <E058> <6FC6> <E059> <6FAA> <E05A> <6FDF> <E05B> <6FD5> <E05C> <6FEC> <E05D> <6FD4> <E05E> <6FD8> <E05F> <6FF1> <E060> <6FEE> <E061> <6FDB> <E062> <7009> <E063> <700B> <E064> <6FFA> <E065> <7011> <E066> <7001> <E067> <700F> <E068> <6FFE> <E069> <701B> <E06A> <701A> <E06B> <6F74> <E06C> <701D> <E06D> <7018> <E06E> <701F> <E06F> <7030> <E070> <703E> <E071> <7032> <E072> <7051> <E073> <7063> <E074> <7099> <E075> <7092> <E076> <70AF> <E077> <70F1> <E078> <70AC> <E079> <70B8> <E07A> <70B3> <E07B> <70AE> <E07C> <70DF> <E07D> <70CB> <E07E> <70DD> <E080> <70D9> <E081> <7109> <E082> <70FD> <E083> <711C> <E084> <7119> <E085> <7165> <E086> <7155> <E087> <7188> <E088> <7166> <E089> <7162> <E08A> <714C> <E08B> <7156> <E08C> <716C> <E08D> <718F> <E08E> <71FB> <E08F> <7184> <E090> <7195> <E091> <71A8> <E092> <71AC> <E093> <71D7> <E094> <71B9> <E095> <71BE> <E096> <71D2> <E097> <71C9> <E098> <71D4> <E099> <71CE> <E09A> <71E0> <E09B> <71EC> <E09C> <71E7> <E09D> <71F5> <E09E> <71FC> <E09F> <71F9> <E0A0> <71FF> <E0A1> <720D> <E0A2> <7210> <E0A3> <721B> <E0A4> <7228> <E0A5> <722D> <E0A6> <722C> <E0A7> <7230> <E0A8> <7232> <E0AD> <7246> <E0AE> <724B> <E0AF> <7258> <E0B0> <7274> endbfchar 100 beginbfchar <E0B1> <727E> <E0B2> <7282> <E0B3> <7281> <E0B4> <7287> <E0B5> <7292> <E0B6> <7296> <E0B7> <72A2> <E0B8> <72A7> <E0B9> <72B9> <E0BA> <72B2> <E0BB> <72C3> <E0BC> <72C6> <E0BD> <72C4> <E0BE> <72CE> <E0BF> <72D2> <E0C0> <72E2> <E0C3> <72F9> <E0C4> <72F7> <E0C5> <500F> <E0C6> <7317> <E0C7> <730A> <E0C8> <731C> <E0C9> <7316> <E0CA> <731D> <E0CB> <7334> <E0CC> <732F> <E0CD> <7329> <E0CE> <7325> <E0CF> <733E> <E0D2> <9ED8> <E0D3> <7357> <E0D4> <736A> <E0D5> <7368> <E0D6> <7370> <E0D7> <7378> <E0D8> <7375> <E0D9> <737B> <E0DA> <737A> <E0DB> <73C8> <E0DC> <73B3> <E0DD> <73CE> <E0DE> <73BB> <E0DF> <73C0> <E0E0> <73E5> <E0E1> <73EE> <E0E2> <73DE> <E0E3> <74A2> <E0E4> <7405> <E0E5> <746F> <E0E6> <7425> <E0E7> <73F8> <E0E8> <7432> <E0E9> <743A> <E0EA> <7455> <E0EB> <743F> <E0EC> <745F> <E0ED> <7459> <E0EE> <7441> <E0EF> <745C> <E0F0> <7469> <E0F1> <7470> <E0F2> <7463> <E0F3> <746A> <E0F4> <7476> <E0F5> <747E> <E0F6> <748B> <E0F7> <749E> <E0F8> <74A7> <E0F9> <74CA> <E0FA> <74CF> <E0FB> <74D4> <E0FC> <73F1> <E140> <74E0> <E141> <74E3> <E142> <74E7> <E143> <74E9> <E144> <74EE> <E145> <74F2> <E148> <74F8> <E149> <74F7> <E14A> <7504> <E14B> <7503> <E14C> <7505> <E14D> <750C> <E14E> <750E> <E14F> <750D> <E150> <7515> <E151> <7513> <E152> <751E> <E153> <7526> <E154> <752C> <E155> <753C> <E156> <7544> <E157> <754D> <E158> <754A> <E159> <7549> <E15A> <755B> <E15B> <7546> <E15C> <755A> <E15D> <7569> endbfchar 100 beginbfchar <E15E> <7564> <E15F> <7567> <E160> <756B> <E161> <756D> <E162> <7578> <E163> <7576> <E166> <7574> <E167> <758A> <E168> <7589> <E169> <7582> <E16A> <7594> <E16B> <759A> <E16C> <759D> <E16D> <75A5> <E16E> <75A3> <E16F> <75C2> <E170> <75B3> <E171> <75C3> <E172> <75B5> <E173> <75BD> <E174> <75B8> <E175> <75BC> <E176> <75B1> <E177> <75CD> <E178> <75CA> <E179> <75D2> <E17A> <75D9> <E17B> <75E3> <E17C> <75DE> <E180> <75FC> <E181> <7601> <E182> <75F0> <E183> <75FA> <E186> <760B> <E187> <760D> <E188> <7609> <E189> <761F> <E18A> <7627> <E18E> <7624> <E18F> <7634> <E190> <7630> <E191> <763B> <E194> <7646> <E195> <765C> <E196> <7658> <E19C> <7667> <E19D> <766C> <E19E> <7670> <E19F> <7672> <E1A0> <7676> <E1A1> <7678> <E1A2> <767C> <E1A3> <7680> <E1A4> <7683> <E1A5> <7688> <E1A6> <768B> <E1A7> <768E> <E1A8> <7696> <E1A9> <7693> <E1AC> <76B0> <E1AD> <76B4> <E1B1> <76C2> <E1B2> <76CD> <E1B3> <76D6> <E1B4> <76D2> <E1B5> <76DE> <E1B6> <76E1> <E1B7> <76E5> <E1B8> <76E7> <E1B9> <76EA> <E1BA> <862F> <E1BB> <76FB> <E1BC> <7708> <E1BD> <7707> <E1BE> <7704> <E1BF> <7729> <E1C0> <7724> <E1C1> <771E> <E1C4> <771B> <E1C7> <7747> <E1C8> <775A> <E1C9> <7768> <E1CA> <776B> <E1CB> <775B> <E1CC> <7765> <E1CD> <777F> <E1CE> <777E> <E1CF> <7779> <E1D0> <778E> <E1D1> <778B> <E1D2> <7791> <E1D3> <77A0> <E1D4> <779E> <E1D5> <77B0> <E1D6> <77B6> <E1D7> <77B9> <E1D8> <77BF> <E1DB> <77BB> <E1DC> <77C7> <E1DD> <77CD> endbfchar 100 beginbfchar <E1DE> <77D7> <E1DF> <77DA> <E1E0> <77DC> <E1E1> <77E3> <E1E2> <77EE> <E1E3> <77FC> <E1E4> <780C> <E1E5> <7812> <E1E6> <7926> <E1E7> <7820> <E1E8> <792A> <E1E9> <7845> <E1EA> <788E> <E1EB> <7874> <E1EC> <7886> <E1ED> <787C> <E1EE> <789A> <E1EF> <788C> <E1F0> <78A3> <E1F1> <78B5> <E1F2> <78AA> <E1F3> <78AF> <E1F4> <78D1> <E1F5> <78C6> <E1F6> <78CB> <E1F7> <78D4> <E1F8> <78BE> <E1F9> <78BC> <E1FA> <78C5> <E1FB> <78CA> <E1FC> <78EC> <E240> <78E7> <E241> <78DA> <E242> <78FD> <E243> <78F4> <E244> <7907> <E245> <7912> <E246> <7911> <E247> <7919> <E248> <792C> <E249> <792B> <E24A> <7940> <E24B> <7960> <E24C> <7957> <E24D> <795F> <E24E> <795A> <E24F> <7955> <E250> <7953> <E251> <797A> <E252> <797F> <E253> <798A> <E254> <799D> <E255> <79A7> <E256> <9F4B> <E257> <79AA> <E258> <79AE> <E259> <79B3> <E25C> <79C9> <E25D> <79D5> <E25E> <79E7> <E25F> <79EC> <E260> <79E1> <E261> <79E3> <E262> <7A08> <E263> <7A0D> <E266> <7A20> <E267> <7A1F> <E268> <7980> <E269> <7A31> <E26A> <7A3B> <E26B> <7A3E> <E26C> <7A37> <E26D> <7A43> <E26E> <7A57> <E26F> <7A49> <E272> <7A69> <E273> <9F9D> <E274> <7A70> <E275> <7A79> <E276> <7A7D> <E277> <7A88> <E278> <7A97> <E279> <7A95> <E27A> <7A98> <E27B> <7A96> <E27C> <7AA9> <E27D> <7AC8> <E27E> <7AB0> <E280> <7AB6> <E281> <7AC5> <E282> <7AC4> <E283> <7ABF> <E284> <9083> <E285> <7AC7> <E286> <7ACA> <E287> <7ACD> <E288> <7ACF> <E289> <7AD5> <E28A> <7AD3> <E28D> <7ADD> endbfchar 100 beginbfchar <E290> <7AE6> <E291> <7AED> <E292> <7AF0> <E293> <7B02> <E294> <7B0F> <E295> <7B0A> <E296> <7B06> <E297> <7B33> <E29A> <7B1E> <E29B> <7B35> <E29C> <7B28> <E29D> <7B36> <E29E> <7B50> <E29F> <7B7A> <E2A0> <7B04> <E2A1> <7B4D> <E2A2> <7B0B> <E2A3> <7B4C> <E2A4> <7B45> <E2A5> <7B75> <E2A6> <7B65> <E2A7> <7B74> <E2A8> <7B67> <E2AB> <7B6C> <E2AC> <7B6E> <E2AD> <7B9D> <E2AE> <7B98> <E2AF> <7B9F> <E2B0> <7B8D> <E2B1> <7B9C> <E2B2> <7B9A> <E2B3> <7B8B> <E2B4> <7B92> <E2B5> <7B8F> <E2B6> <7B5D> <E2B7> <7B99> <E2B8> <7BCB> <E2B9> <7BC1> <E2BA> <7BCC> <E2BB> <7BCF> <E2BC> <7BB4> <E2BD> <7BC6> <E2BE> <7BDD> <E2BF> <7BE9> <E2C0> <7C11> <E2C1> <7C14> <E2C2> <7BE6> <E2C3> <7BE5> <E2C4> <7C60> <E2C5> <7C00> <E2C6> <7C07> <E2C7> <7C13> <E2C8> <7BF3> <E2C9> <7BF7> <E2CA> <7C17> <E2CB> <7C0D> <E2CC> <7BF6> <E2CD> <7C23> <E2CE> <7C27> <E2CF> <7C2A> <E2D0> <7C1F> <E2D1> <7C37> <E2D2> <7C2B> <E2D3> <7C3D> <E2D4> <7C4C> <E2D5> <7C43> <E2D6> <7C54> <E2D7> <7C4F> <E2D8> <7C40> <E2D9> <7C50> <E2DA> <7C58> <E2DB> <7C5F> <E2DC> <7C64> <E2DD> <7C56> <E2DE> <7C65> <E2DF> <7C6C> <E2E0> <7C75> <E2E1> <7C83> <E2E2> <7C90> <E2E3> <7CA4> <E2E4> <7CAD> <E2E5> <7CA2> <E2E6> <7CAB> <E2E7> <7CA1> <E2E8> <7CA8> <E2E9> <7CB3> <E2EA> <7CB2> <E2EB> <7CB1> <E2EC> <7CAE> <E2ED> <7CB9> <E2EE> <7CBD> <E2EF> <7CC0> <E2F0> <7CC5> <E2F1> <7CC2> <E2F2> <7CD8> <E2F3> <7CD2> <E2F4> <7CDC> <E2F5> <7CE2> <E2F6> <9B3B> <E2F7> <7CEF> endbfchar 100 beginbfchar <E2F8> <7CF2> <E2F9> <7CF4> <E2FA> <7CF6> <E2FB> <7CFA> <E2FC> <7D06> <E340> <7D02> <E341> <7D1C> <E342> <7D15> <E343> <7D0A> <E344> <7D45> <E345> <7D4B> <E346> <7D2E> <E347> <7D32> <E348> <7D3F> <E349> <7D35> <E34A> <7D46> <E34B> <7D73> <E34C> <7D56> <E34D> <7D4E> <E34E> <7D72> <E34F> <7D68> <E350> <7D6E> <E351> <7D4F> <E352> <7D63> <E353> <7D93> <E354> <7D89> <E355> <7D5B> <E356> <7D8F> <E357> <7D7D> <E358> <7D9B> <E359> <7DBA> <E35A> <7DAE> <E35B> <7DA3> <E35C> <7DB5> <E35D> <7DC7> <E35E> <7DBD> <E35F> <7DAB> <E360> <7E3D> <E361> <7DA2> <E362> <7DAF> <E363> <7DDC> <E364> <7DB8> <E365> <7D9F> <E366> <7DB0> <E367> <7DD8> <E368> <7DDD> <E369> <7DE4> <E36A> <7DDE> <E36B> <7DFB> <E36C> <7DF2> <E36D> <7DE1> <E36E> <7E05> <E36F> <7E0A> <E370> <7E23> <E371> <7E21> <E372> <7E12> <E373> <7E31> <E374> <7E1F> <E375> <7E09> <E376> <7E0B> <E377> <7E22> <E378> <7E46> <E379> <7E66> <E37A> <7E3B> <E37B> <7E35> <E37C> <7E39> <E37D> <7E43> <E37E> <7E37> <E380> <7E32> <E381> <7E3A> <E382> <7E67> <E383> <7E5D> <E384> <7E56> <E385> <7E5E> <E388> <7E79> <E389> <7E6A> <E38A> <7E69> <E38B> <7E7C> <E38C> <7E7B> <E38D> <7E83> <E38E> <7DD5> <E38F> <7E7D> <E390> <8FAE> <E391> <7E7F> <E394> <7E8C> <E395> <7E92> <E396> <7E90> <E399> <7E96> <E39A> <7E8E> <E39D> <7F38> <E39E> <7F3A> <E39F> <7F45> <E3A5> <7F55> <E3A6> <7F54> <E3A7> <7F58> <E3AC> <7F67> <E3AD> <7F78> <E3AE> <7F82> <E3AF> <7F86> <E3B0> <7F83> endbfchar 100 beginbfchar <E3B1> <7F88> <E3B2> <7F87> <E3B3> <7F8C> <E3B4> <7F94> <E3B5> <7F9E> <E3B6> <7F9D> <E3B7> <7F9A> <E3B8> <7FA3> <E3B9> <7FAF> <E3BA> <7FB2> <E3BB> <7FB9> <E3BC> <7FAE> <E3BD> <7FB6> <E3BE> <7FB8> <E3BF> <8B71> <E3C2> <7FCA> <E3C3> <7FD5> <E3C4> <7FD4> <E3C5> <7FE1> <E3C6> <7FE6> <E3C7> <7FE9> <E3C8> <7FF3> <E3C9> <7FF9> <E3CA> <98DC> <E3CB> <8006> <E3CC> <8004> <E3CD> <800B> <E3CE> <8012> <E3D1> <801C> <E3D2> <8021> <E3D3> <8028> <E3D4> <803F> <E3D5> <803B> <E3D6> <804A> <E3D7> <8046> <E3D8> <8052> <E3D9> <8058> <E3DA> <805A> <E3DB> <805F> <E3DC> <8062> <E3DD> <8068> <E3DE> <8073> <E3DF> <8072> <E3E0> <8070> <E3E1> <8076> <E3E2> <8079> <E3E3> <807D> <E3E4> <807F> <E3E5> <8084> <E3E6> <8086> <E3E7> <8085> <E3E8> <809B> <E3E9> <8093> <E3EA> <809A> <E3EB> <80AD> <E3EC> <5190> <E3ED> <80AC> <E3EE> <80DB> <E3EF> <80E5> <E3F0> <80D9> <E3F1> <80DD> <E3F2> <80C4> <E3F3> <80DA> <E3F4> <80D6> <E3F5> <8109> <E3F6> <80EF> <E3F7> <80F1> <E3F8> <811B> <E3F9> <8129> <E3FA> <8123> <E3FB> <812F> <E3FC> <814B> <E440> <968B> <E441> <8146> <E442> <813E> <E443> <8153> <E444> <8151> <E445> <80FC> <E446> <8171> <E447> <816E> <E44A> <8174> <E44B> <8183> <E44C> <8188> <E44D> <818A> <E44E> <8180> <E44F> <8182> <E450> <81A0> <E451> <8195> <E452> <81A4> <E453> <81A3> <E454> <815F> <E455> <8193> <E456> <81A9> <E457> <81B0> <E458> <81B5> <E459> <81BE> <E45A> <81B8> <E45B> <81BD> <E45C> <81C0> <E45D> <81C2> endbfchar 100 beginbfchar <E45E> <81BA> <E45F> <81C9> <E460> <81CD> <E461> <81D1> <E462> <81D9> <E463> <81D8> <E464> <81C8> <E465> <81DA> <E468> <81E7> <E46B> <81FE> <E46E> <8205> <E46F> <8207> <E470> <820A> <E471> <820D> <E472> <8210> <E473> <8216> <E474> <8229> <E475> <822B> <E476> <8238> <E477> <8233> <E478> <8240> <E479> <8259> <E47A> <8258> <E47B> <825D> <E47C> <825A> <E47D> <825F> <E47E> <8264> <E480> <8262> <E481> <8268> <E484> <822E> <E485> <8271> <E488> <827E> <E489> <828D> <E48A> <8292> <E48B> <82AB> <E48C> <829F> <E48D> <82BB> <E48E> <82AC> <E48F> <82E1> <E490> <82E3> <E491> <82DF> <E492> <82D2> <E493> <82F4> <E494> <82F3> <E495> <82FA> <E496> <8393> <E497> <8303> <E498> <82FB> <E499> <82F9> <E49A> <82DE> <E49B> <8306> <E49C> <82DC> <E49D> <8309> <E49E> <82D9> <E49F> <8335> <E4A0> <8334> <E4A1> <8316> <E4A2> <8332> <E4A3> <8331> <E4A4> <8340> <E4A5> <8339> <E4A6> <8350> <E4A7> <8345> <E4A8> <832F> <E4A9> <832B> <E4AC> <8385> <E4AD> <839A> <E4AE> <83AA> <E4AF> <839F> <E4B0> <83A2> <E4B1> <8396> <E4B2> <8323> <E4B3> <838E> <E4B4> <8387> <E4B5> <838A> <E4B6> <837C> <E4B7> <83B5> <E4B8> <8373> <E4B9> <8375> <E4BA> <83A0> <E4BB> <8389> <E4BC> <83A8> <E4BD> <83F4> <E4BE> <8413> <E4BF> <83EB> <E4C0> <83CE> <E4C1> <83FD> <E4C2> <8403> <E4C3> <83D8> <E4C4> <840B> <E4C5> <83C1> <E4C6> <83F7> <E4C7> <8407> <E4C8> <83E0> <E4C9> <83F2> <E4CA> <840D> <E4CB> <8422> <E4CC> <8420> <E4CD> <83BD> <E4CE> <8438> endbfchar 100 beginbfchar <E4CF> <8506> <E4D0> <83FB> <E4D1> <846D> <E4D2> <842A> <E4D3> <843C> <E4D4> <855A> <E4D5> <8484> <E4D6> <8477> <E4D7> <846B> <E4D8> <84AD> <E4D9> <846E> <E4DA> <8482> <E4DB> <8469> <E4DC> <8446> <E4DD> <842C> <E4DE> <846F> <E4DF> <8479> <E4E0> <8435> <E4E1> <84CA> <E4E2> <8462> <E4E3> <84B9> <E4E4> <84BF> <E4E5> <849F> <E4E6> <84D9> <E4E7> <84CD> <E4E8> <84BB> <E4E9> <84DA> <E4EA> <84D0> <E4EB> <84C1> <E4EC> <84C6> <E4ED> <84D6> <E4EE> <84A1> <E4EF> <8521> <E4F0> <84FF> <E4F1> <84F4> <E4F4> <852C> <E4F5> <851F> <E4F6> <8515> <E4F7> <8514> <E4F8> <84FC> <E4F9> <8540> <E4FA> <8563> <E4FB> <8558> <E4FC> <8548> <E540> <8541> <E541> <8602> <E542> <854B> <E543> <8555> <E544> <8580> <E545> <85A4> <E546> <8588> <E547> <8591> <E548> <858A> <E549> <85A8> <E54A> <856D> <E54B> <8594> <E54C> <859B> <E54D> <85EA> <E54E> <8587> <E54F> <859C> <E550> <8577> <E551> <857E> <E552> <8590> <E553> <85C9> <E554> <85BA> <E555> <85CF> <E556> <85B9> <E557> <85D0> <E558> <85D5> <E559> <85DD> <E55A> <85E5> <E55B> <85DC> <E55C> <85F9> <E55D> <860A> <E55E> <8613> <E55F> <860B> <E560> <85FE> <E561> <85FA> <E562> <8606> <E563> <8622> <E564> <861A> <E565> <8630> <E566> <863F> <E567> <864D> <E568> <4E55> <E569> <8654> <E56A> <865F> <E56B> <8667> <E56C> <8671> <E56D> <8693> <E56E> <86A3> <E573> <86B6> <E574> <86AF> <E575> <86C4> <E576> <86C6> <E577> <86B0> <E578> <86C9> <E579> <8823> <E57A> <86AB> <E57B> <86D4> endbfchar 100 beginbfchar <E57C> <86DE> <E57D> <86E9> <E57E> <86EC> <E580> <86DF> <E581> <86DB> <E582> <86EF> <E583> <8712> <E584> <8706> <E585> <8708> <E586> <8700> <E587> <8703> <E588> <86FB> <E589> <8711> <E58A> <8709> <E58B> <870D> <E58C> <86F9> <E58D> <870A> <E58E> <8734> <E58F> <873F> <E590> <8737> <E591> <873B> <E592> <8725> <E593> <8729> <E594> <871A> <E595> <8760> <E596> <875F> <E597> <8778> <E598> <874C> <E599> <874E> <E59A> <8774> <E59B> <8757> <E59C> <8768> <E59D> <876E> <E59E> <8759> <E59F> <8753> <E5A0> <8763> <E5A1> <876A> <E5A2> <8805> <E5A3> <87A2> <E5A4> <879F> <E5A5> <8782> <E5A6> <87AF> <E5A7> <87CB> <E5A8> <87BD> <E5A9> <87C0> <E5AA> <87D0> <E5AB> <96D6> <E5AC> <87AB> <E5AD> <87C4> <E5AE> <87B3> <E5AF> <87C7> <E5B0> <87C6> <E5B1> <87BB> <E5B2> <87EF> <E5B3> <87F2> <E5B4> <87E0> <E5B5> <880F> <E5B6> <880D> <E5B7> <87FE> <E5BA> <880E> <E5BB> <87D2> <E5BC> <8811> <E5BD> <8816> <E5BE> <8815> <E5BF> <8822> <E5C0> <8821> <E5C1> <8831> <E5C2> <8836> <E5C3> <8839> <E5C4> <8827> <E5C5> <883B> <E5C6> <8844> <E5C7> <8842> <E5C8> <8852> <E5C9> <8859> <E5CA> <885E> <E5CB> <8862> <E5CC> <886B> <E5CD> <8881> <E5CE> <887E> <E5CF> <889E> <E5D0> <8875> <E5D1> <887D> <E5D2> <88B5> <E5D3> <8872> <E5D4> <8882> <E5D5> <8897> <E5D6> <8892> <E5D7> <88AE> <E5D8> <8899> <E5D9> <88A2> <E5DA> <888D> <E5DB> <88A4> <E5DC> <88B0> <E5DD> <88BF> <E5DE> <88B1> <E5E1> <88D4> <E5E4> <88DD> <E5E5> <88F9> <E5E6> <8902> endbfchar 100 beginbfchar <E5E7> <88FC> <E5E8> <88F4> <E5E9> <88E8> <E5EA> <88F2> <E5EB> <8904> <E5EC> <890C> <E5ED> <890A> <E5EE> <8913> <E5EF> <8943> <E5F0> <891E> <E5F1> <8925> <E5F4> <8941> <E5F5> <8944> <E5F6> <893B> <E5F7> <8936> <E5F8> <8938> <E5F9> <894C> <E5FA> <891D> <E5FB> <8960> <E5FC> <895E> <E640> <8966> <E641> <8964> <E642> <896D> <E643> <896A> <E644> <896F> <E645> <8974> <E646> <8977> <E647> <897E> <E648> <8983> <E649> <8988> <E64A> <898A> <E64B> <8993> <E64C> <8998> <E64D> <89A1> <E64E> <89A9> <E64F> <89A6> <E650> <89AC> <E651> <89AF> <E652> <89B2> <E653> <89BA> <E654> <89BD> <E657> <89DA> <E65A> <89E7> <E65B> <89F4> <E65C> <89F8> <E65D> <8A03> <E65E> <8A16> <E65F> <8A10> <E660> <8A0C> <E661> <8A1B> <E662> <8A1D> <E663> <8A25> <E664> <8A36> <E665> <8A41> <E666> <8A5B> <E667> <8A52> <E668> <8A46> <E669> <8A48> <E66A> <8A7C> <E66B> <8A6D> <E66C> <8A6C> <E66D> <8A62> <E66E> <8A85> <E66F> <8A82> <E670> <8A84> <E671> <8AA8> <E672> <8AA1> <E673> <8A91> <E676> <8A9A> <E677> <8AA3> <E678> <8AC4> <E679> <8ACD> <E67A> <8AC2> <E67B> <8ADA> <E67C> <8AEB> <E67D> <8AF3> <E67E> <8AE7> <E680> <8AE4> <E681> <8AF1> <E682> <8B14> <E683> <8AE0> <E684> <8AE2> <E685> <8AF7> <E686> <8ADE> <E687> <8ADB> <E688> <8B0C> <E689> <8B07> <E68A> <8B1A> <E68B> <8AE1> <E68C> <8B16> <E68D> <8B10> <E68E> <8B17> <E68F> <8B20> <E690> <8B33> <E691> <97AB> <E692> <8B26> <E693> <8B2B> <E694> <8B3E> <E695> <8B28> <E696> <8B41> endbfchar 100 beginbfchar <E697> <8B4C> <E698> <8B4F> <E699> <8B4E> <E69A> <8B49> <E69B> <8B56> <E69C> <8B5B> <E69D> <8B5A> <E69E> <8B6B> <E69F> <8B5F> <E6A0> <8B6C> <E6A1> <8B6F> <E6A2> <8B74> <E6A3> <8B7D> <E6A4> <8B80> <E6A5> <8B8C> <E6A6> <8B8E> <E6A9> <8B96> <E6AC> <8C3A> <E6AD> <8C41> <E6AE> <8C3F> <E6AF> <8C48> <E6B0> <8C4C> <E6B1> <8C4E> <E6B2> <8C50> <E6B3> <8C55> <E6B4> <8C62> <E6B5> <8C6C> <E6B6> <8C78> <E6B7> <8C7A> <E6B8> <8C82> <E6B9> <8C89> <E6BA> <8C85> <E6BB> <8C8A> <E6BE> <8C94> <E6BF> <8C7C> <E6C0> <8C98> <E6C1> <621D> <E6C2> <8CAD> <E6C3> <8CAA> <E6C4> <8CBD> <E6C7> <8CAE> <E6C8> <8CB6> <E6C9> <8CC8> <E6CA> <8CC1> <E6CB> <8CE4> <E6CC> <8CE3> <E6CD> <8CDA> <E6CE> <8CFD> <E6D3> <8D0A> <E6D4> <8D07> <E6D5> <8D0F> <E6D6> <8D0D> <E6D7> <8D10> <E6D8> <9F4E> <E6D9> <8D13> <E6DA> <8CCD> <E6DB> <8D14> <E6DC> <8D16> <E6DD> <8D67> <E6DE> <8D6D> <E6DF> <8D71> <E6E0> <8D73> <E6E1> <8D81> <E6E2> <8D99> <E6E3> <8DC2> <E6E4> <8DBE> <E6E5> <8DBA> <E6E6> <8DCF> <E6E7> <8DDA> <E6E8> <8DD6> <E6E9> <8DCC> <E6EA> <8DDB> <E6EB> <8DCB> <E6EE> <8DDF> <E6EF> <8DE3> <E6F0> <8DFC> <E6F3> <8DFF> <E6F6> <8E10> <E6F7> <8E1F> <E6F8> <8E42> <E6F9> <8E35> <E6FA> <8E30> <E6FB> <8E34> <E6FC> <8E4A> <E740> <8E47> <E741> <8E49> <E742> <8E4C> <E743> <8E50> <E744> <8E48> <E745> <8E59> <E746> <8E64> <E747> <8E60> <E748> <8E2A> <E749> <8E63> <E74A> <8E55> <E74B> <8E76> <E74C> <8E72> <E74D> <8E7C> <E74E> <8E81> <E74F> <8E87> endbfchar 100 beginbfchar <E750> <8E85> <E751> <8E84> <E752> <8E8B> <E753> <8E8A> <E754> <8E93> <E755> <8E91> <E756> <8E94> <E757> <8E99> <E758> <8EAA> <E759> <8EA1> <E75A> <8EAC> <E75B> <8EB0> <E75C> <8EC6> <E75D> <8EB1> <E75E> <8EBE> <E75F> <8EC5> <E760> <8EC8> <E761> <8ECB> <E762> <8EDB> <E763> <8EE3> <E764> <8EFC> <E765> <8EFB> <E766> <8EEB> <E767> <8EFE> <E768> <8F0A> <E769> <8F05> <E76A> <8F15> <E76B> <8F12> <E76C> <8F19> <E76D> <8F13> <E76E> <8F1C> <E76F> <8F1F> <E770> <8F1B> <E771> <8F0C> <E772> <8F26> <E773> <8F33> <E774> <8F3B> <E775> <8F39> <E776> <8F45> <E777> <8F42> <E778> <8F3E> <E779> <8F4C> <E77A> <8F49> <E77B> <8F46> <E77C> <8F4E> <E77D> <8F57> <E77E> <8F5C> <E783> <8F9C> <E784> <8F9F> <E785> <8FA3> <E786> <8FAD> <E787> <8FAF> <E788> <8FB7> <E789> <8FDA> <E78A> <8FE5> <E78B> <8FE2> <E78C> <8FEA> <E78D> <8FEF> <E78E> <9087> <E78F> <8FF4> <E790> <9005> <E793> <9011> <E794> <9015> <E795> <9021> <E796> <900D> <E797> <901E> <E798> <9016> <E799> <900B> <E79A> <9027> <E79B> <9036> <E79C> <9035> <E79D> <9039> <E79E> <8FF8> <E7A3> <900E> <E7A4> <9049> <E7A5> <903E> <E7A6> <9056> <E7A7> <9058> <E7A8> <905E> <E7A9> <9068> <E7AA> <906F> <E7AB> <9076> <E7AC> <96A8> <E7AD> <9072> <E7AE> <9082> <E7AF> <907D> <E7B0> <9081> <E7B1> <9080> <E7B2> <908A> <E7B3> <9089> <E7B4> <908F> <E7B5> <90A8> <E7B6> <90AF> <E7B7> <90B1> <E7B8> <90B5> <E7B9> <90E2> <E7BA> <90E4> <E7BB> <6248> <E7BC> <90DB> <E7BD> <9102> endbfchar 100 beginbfchar <E7BE> <9112> <E7BF> <9119> <E7C0> <9132> <E7C1> <9130> <E7C2> <914A> <E7C3> <9156> <E7C4> <9158> <E7C5> <9163> <E7C6> <9165> <E7C7> <9169> <E7C8> <9173> <E7C9> <9172> <E7CA> <918B> <E7CB> <9189> <E7CC> <9182> <E7CD> <91A2> <E7CE> <91AB> <E7CF> <91AF> <E7D0> <91AA> <E7D1> <91B5> <E7D2> <91B4> <E7D3> <91BA> <E7D6> <91C9> <E7D7> <91CB> <E7D8> <91D0> <E7D9> <91D6> <E7DA> <91DF> <E7DB> <91E1> <E7DC> <91DB> <E7DD> <91FC> <E7E0> <921E> <E7E1> <91FF> <E7E2> <9214> <E7E3> <922C> <E7E4> <9215> <E7E5> <9211> <E7E6> <925E> <E7E7> <9257> <E7E8> <9245> <E7E9> <9249> <E7EA> <9264> <E7EB> <9248> <E7EC> <9295> <E7ED> <923F> <E7EE> <924B> <E7EF> <9250> <E7F0> <929C> <E7F1> <9296> <E7F2> <9293> <E7F3> <929B> <E7F4> <925A> <E7F5> <92CF> <E7F6> <92B9> <E7F7> <92B7> <E7F8> <92E9> <E7F9> <930F> <E7FA> <92FA> <E7FB> <9344> <E7FC> <932E> <E840> <9319> <E841> <9322> <E842> <931A> <E843> <9323> <E844> <933A> <E845> <9335> <E846> <933B> <E847> <935C> <E848> <9360> <E849> <937C> <E84A> <936E> <E84B> <9356> <E84C> <93B0> <E84F> <9394> <E850> <93B9> <E853> <93E8> <E854> <93E5> <E855> <93D8> <E856> <93C3> <E857> <93DD> <E858> <93D0> <E859> <93C8> <E85A> <93E4> <E85B> <941A> <E85C> <9414> <E85D> <9413> <E85E> <9403> <E85F> <9407> <E860> <9410> <E861> <9436> <E862> <942B> <E863> <9435> <E864> <9421> <E865> <943A> <E866> <9441> <E867> <9452> <E868> <9444> <E869> <945B> <E86A> <9460> <E86B> <9462> <E86C> <945E> endbfchar 100 beginbfchar <E86D> <946A> <E86E> <9229> <E86F> <9470> <E870> <9475> <E871> <9477> <E872> <947D> <E873> <945A> <E874> <947C> <E875> <947E> <E876> <9481> <E877> <947F> <E878> <9582> <E879> <9587> <E87A> <958A> <E87B> <9594> <E87C> <9596> <E880> <95A0> <E881> <95A8> <E882> <95A7> <E883> <95AD> <E884> <95BC> <E885> <95BB> <E886> <95B9> <E887> <95BE> <E888> <95CA> <E889> <6FF6> <E88A> <95C3> <E88B> <95CD> <E88C> <95CC> <E88D> <95D5> <E88E> <95D4> <E88F> <95D6> <E890> <95DC> <E891> <95E1> <E892> <95E5> <E893> <95E2> <E894> <9621> <E895> <9628> <E898> <9642> <E899> <964C> <E89A> <964F> <E89B> <964B> <E89C> <9677> <E89D> <965C> <E89E> <965E> <E89F> <965D> <E8A0> <965F> <E8A1> <9666> <E8A2> <9672> <E8A3> <966C> <E8A4> <968D> <E8A5> <9698> <E8A6> <9695> <E8A7> <9697> <E8A8> <96AA> <E8A9> <96A7> <E8AC> <96B0> <E8AD> <96B4> <E8AE> <96B6> <E8B1> <96CE> <E8B2> <96CB> <E8B3> <96C9> <E8B4> <96CD> <E8B5> <894D> <E8B6> <96DC> <E8B7> <970D> <E8B8> <96D5> <E8B9> <96F9> <E8BA> <9704> <E8BB> <9706> <E8BC> <9708> <E8BD> <9713> <E8BE> <970E> <E8BF> <9711> <E8C0> <970F> <E8C1> <9716> <E8C2> <9719> <E8C3> <9724> <E8C4> <972A> <E8C5> <9730> <E8C6> <9739> <E8C9> <9744> <E8CA> <9746> <E8CB> <9748> <E8CC> <9742> <E8CD> <9749> <E8CE> <975C> <E8CF> <9760> <E8D0> <9764> <E8D1> <9766> <E8D2> <9768> <E8D3> <52D2> <E8D4> <976B> <E8D5> <9771> <E8D6> <9779> <E8D7> <9785> <E8D8> <977C> <E8D9> <9781> <E8DA> <977A> <E8DB> <9786> endbfchar 100 beginbfchar <E8DC> <978B> <E8DF> <979C> <E8E0> <97A8> <E8E1> <97A6> <E8E2> <97A3> <E8E5> <97C3> <E8E6> <97C6> <E8E7> <97C8> <E8E8> <97CB> <E8E9> <97DC> <E8EA> <97ED> <E8EB> <9F4F> <E8EC> <97F2> <E8ED> <7ADF> <E8EE> <97F6> <E8EF> <97F5> <E8F0> <980F> <E8F1> <980C> <E8F2> <9838> <E8F3> <9824> <E8F4> <9821> <E8F5> <9837> <E8F6> <983D> <E8F7> <9846> <E8F8> <984F> <E8F9> <984B> <E8FA> <986B> <E940> <9871> <E941> <9874> <E942> <9873> <E943> <98AA> <E944> <98AF> <E945> <98B1> <E946> <98B6> <E947> <98C4> <E948> <98C3> <E949> <98C6> <E94A> <98E9> <E94B> <98EB> <E94C> <9903> <E94D> <9909> <E94E> <9912> <E94F> <9914> <E950> <9918> <E951> <9921> <E954> <9924> <E955> <9920> <E956> <992C> <E957> <992E> <E95A> <9942> <E95B> <9949> <E95C> <9945> <E95D> <9950> <E95E> <994B> <E961> <994C> <E962> <9955> <E965> <99A5> <E968> <99BC> <E969> <99DF> <E96A> <99DB> <E96B> <99DD> <E96C> <99D8> <E96D> <99D1> <E972> <99FB> <E973> <99F8> <E974> <9A01> <E975> <9A0F> <E976> <9A05> <E977> <99E2> <E978> <9A19> <E979> <9A2B> <E97A> <9A37> <E97B> <9A45> <E97C> <9A42> <E97D> <9A40> <E97E> <9A43> <E980> <9A3E> <E981> <9A55> <E982> <9A4D> <E983> <9A5B> <E984> <9A57> <E985> <9A5F> <E986> <9A62> <E987> <9A65> <E988> <9A64> <E989> <9A69> <E98A> <9A6B> <E98B> <9A6A> <E98C> <9AAD> <E98D> <9AB0> <E98E> <9ABC> <E98F> <9AC0> <E990> <9ACF> <E991> <9AD1> <E998> <9AE6> <E999> <9AEF> <E99A> <9AEB> <E99B> <9AEE> <E99C> <9AF4> <E99D> <9AF1> endbfchar 100 beginbfchar <E99E> <9AF7> <E99F> <9AFB> <E9A0> <9B06> <E9A1> <9B18> <E9A2> <9B1A> <E9A3> <9B1F> <E9A6> <9B25> <E9AD> <9B32> <E9AE> <9B44> <E9AF> <9B43> <E9B0> <9B4F> <E9B3> <9B51> <E9B4> <9B58> <E9B5> <9B74> <E9B6> <9B93> <E9B7> <9B83> <E9B8> <9B91> <E9BD> <9BA8> <E9BE> <9BB4> <E9BF> <9BC0> <E9C0> <9BCA> <E9C1> <9BB9> <E9C2> <9BC6> <E9C3> <9BCF> <E9C6> <9BE3> <E9C7> <9BE2> <E9C8> <9BE4> <E9C9> <9BD4> <E9CA> <9BE1> <E9CB> <9C3A> <E9CC> <9BF2> <E9CD> <9BF1> <E9CE> <9BF0> <E9CF> <9C15> <E9D0> <9C14> <E9D1> <9C09> <E9D2> <9C13> <E9D3> <9C0C> <E9D4> <9C06> <E9D5> <9C08> <E9D6> <9C12> <E9D7> <9C0A> <E9D8> <9C04> <E9D9> <9C2E> <E9DA> <9C1B> <E9DB> <9C25> <E9DC> <9C24> <E9DD> <9C21> <E9DE> <9C30> <E9DF> <9C47> <E9E0> <9C32> <E9E1> <9C46> <E9E2> <9C3E> <E9E3> <9C5A> <E9E4> <9C60> <E9E5> <9C67> <E9E6> <9C76> <E9E7> <9C78> <E9E8> <9CE7> <E9E9> <9CEC> <E9EA> <9CF0> <E9EB> <9D09> <E9EC> <9D08> <E9ED> <9CEB> <E9EE> <9D03> <E9EF> <9D06> <E9F0> <9D2A> <E9F1> <9D26> <E9F2> <9DAF> <E9F3> <9D23> <E9F4> <9D1F> <E9F5> <9D44> <E9F6> <9D15> <E9F7> <9D12> <E9F8> <9D41> <E9F9> <9D3F> <E9FA> <9D3E> <E9FB> <9D46> <E9FC> <9D48> <EA42> <9D64> <EA43> <9D51> <EA44> <9D50> <EA45> <9D59> <EA46> <9D72> <EA47> <9D89> <EA48> <9D87> <EA49> <9DAB> <EA4A> <9D6F> <EA4B> <9D7A> <EA4C> <9D9A> <EA4D> <9DA4> <EA4E> <9DA9> <EA4F> <9DB2> <EA50> <9DC4> <EA51> <9DC1> <EA52> <9DBB> <EA53> <9DB8> <EA54> <9DBA> <EA55> <9DC6> <EA56> <9DCF> endbfchar 91 beginbfchar <EA57> <9DC2> <EA58> <9DD9> <EA59> <9DD3> <EA5A> <9DF8> <EA5B> <9DE6> <EA5C> <9DED> <EA5D> <9DEF> <EA5E> <9DFD> <EA61> <9E1E> <EA62> <9E75> <EA63> <9E79> <EA64> <9E7D> <EA65> <9E81> <EA66> <9E88> <EA69> <9E92> <EA6A> <9E95> <EA6B> <9E91> <EA6C> <9E9D> <EA6D> <9EA5> <EA6E> <9EA9> <EA6F> <9EB8> <EA70> <9EAA> <EA71> <9EAD> <EA72> <9761> <EA73> <9ECC> <EA77> <9ED4> <EA78> <9EDC> <EA79> <9EDE> <EA7A> <9EDD> <EA7B> <9EE0> <EA7C> <9EE5> <EA7D> <9EE8> <EA7E> <9EEF> <EA80> <9EF4> <EA83> <9EF9> <EA89> <76B7> <EA8A> <9F15> <EA8B> <9F21> <EA8C> <9F2C> <EA8D> <9F3E> <EA8E> <9F4A> <EA8F> <9F52> <EA90> <9F54> <EA91> <9F63> <EA97> <9F6C> <EA98> <9F6A> <EA99> <9F77> <EA9A> <9F72> <EA9B> <9F76> <EA9C> <9F95> <EA9D> <9F9C> <EA9E> <9FA0> <EA9F> <582F> <EAA0> <69C7> <EAA1> <9059> <EAA2> <7464> <EAA3> <51DC> <EAA4> <7199> <EB50> <203E> <EB51> <FE33> <EB5B> <30FC> <EB5C> <FE31> <EB5D> <2010> <EB60> <301C> <EB61> <2016> <EB62> <FF5C> <EB63> <22EF> <EB64> <FE30> <EB6D> <FF3B> <EB6E> <FF3D> <EB81> <FF1D> <EC9F> <3041> <ECA1> <3043> <ECA3> <3045> <ECA5> <3047> <ECA7> <3049> <ECC1> <3063> <ECE1> <3083> <ECE3> <3085> <ECE5> <3087> <ECEC> <308E> <ED40> <30A1> <ED42> <30A3> <ED44> <30A5> <ED46> <30A7> <ED48> <30A9> <ED62> <30C3> <ED83> <30E3> <ED85> <30E5> <ED87> <30E7> <ED8E> <30EE> endbfchar 100 beginbfrange <00> <5B> <0000> <5D> <7F> <005D> <A1> <DF> <FF61> <8140> <8142> <3000> <8146> <8147> <FF1A> <814A> <814B> <309B> <8152> <8153> <30FD> <8154> <8155> <309D> <8158> <815A> <3005> <8165> <8166> <2018> <8167> <8168> <201C> <8169> <816A> <FF08> <816B> <816C> <3014> <8171> <817A> <3008> <8185> <8186> <2266> <818C> <818D> <2032> <8191> <8192> <00A2> <81A9> <81AA> <2190> <81BA> <81BB> <2286> <81BC> <81BD> <2282> <81C8> <81C9> <2227> <81E1> <81E2> <226A> <81E7> <81E8> <222B> <81F5> <81F6> <2020> <824F> <8258> <FF10> <8260> <8279> <FF21> <8281> <829A> <FF41> <829F> <82F1> <3041> <8340> <837E> <30A1> <8380> <8396> <30E0> <839F> <83AF> <0391> <83B0> <83B6> <03A3> <83BF> <83CF> <03B1> <83D0> <83D6> <03C3> <8440> <8445> <0410> <8447> <8460> <0416> <8470> <8475> <0430> <8477> <847E> <0436> <8480> <8491> <043E> <8540> <8553> <2460> <855E> <8571> <2474> <857C> <857E> <2776> <8580> <8585> <2779> <8592> <859A> <2488> <859F> <85AA> <2160> <85B3> <85BE> <2170> <85DB> <85F4> <249C> <864E> <864F> <3396> <865A> <865C> <3385> <86A1> <86A2> <2661> <86A5> <86A6> <2665> <86C8> <86C9> <261C> <86CC> <86CD> <21C4> <86D0> <86D1> <21E6> <86D4> <86D5> <21E6> <8741> <8746> <322A> <8749> <874A> <3242> <874B> <874C> <3239> <8755> <8756> <323C> <8793> <8798> <32A4> <886A> <886D> <30F7> <8A7A> <8A7B> <984D> <8B9D> <8B9E> <4EAB> <9659> <965A> <5FD8> <9750> <9751> <7336> <98B1> <98B3> <4E9E> <98DD> <98DE> <4FE4> <9940> <9941> <50C9> <994D> <994E> <5101> <9958> <9959> <513F> <995F> <9960> <5169> <996A> <996B> <5195> <996F> <9971> <51A9> <9973> <9974> <51B1> <998E> <998F> <524B> <99A0> <99A1> <52AC> <99AE> <99AF> <52F8> <99DF> <99E0> <542C> <9A46> <9A47> <54E5> <9A56> <9A57> <5556> <9AA8> <9AA9> <5737> <9ABD> <9ABE> <57D2> <9AE4> <9AE6> <58FB> <9AED> <9AEE> <592C> <9B4B> <9B4C> <59D9> <9B56> <9B57> <5A35> <9B65> <9B66> <5AFA> <9B74> <9B75> <5B5A> <9B92> <9B93> <5C07> <9B99> <9B9A> <5C38> <9BE6> <9BE7> <5E36> <9BF2> <9BF3> <5E75> <9BF8> <9BF9> <5EC1> <9C43> <9C44> <5EDA> <9C47> <9C48> <5EE8> <9C60> <9C61> <5F56> <9CA1> <9CA2> <6096> <9CB3> <9CB4> <60F6> <9CBC> <9CBD> <610D> <9CCC> <9CCE> <6158> endbfrange 100 beginbfrange <9CF7> <9CF8> <6208> <9D45> <9D46> <6232> <9D52> <9D53> <6292> <9DA9> <9DAA> <64E0> <9DBB> <9DBC> <6534> <9DCA> <9DCB> <6582> <9DD9> <9DDA> <65E0> <9DE1> <9DE2> <6635> <9DEC> <9DED> <6667> <9E4E> <9E4F> <6726> <9E5B> <9E5C> <6763> <9EFB> <9EFC> <6AA2> <9F64> <9F65> <6B78> <9F66> <9F67> <6B7F> <9F6F> <9F70> <6BAA> <9F82> <9F83> <6C13> <9FEB> <9FEC> <6ED4> <E0A9> <E0AA> <723B> <E0AB> <E0AC> <723F> <E0C1> <E0C2> <72E0> <E0D0> <E0D1> <734E> <E146> <E147> <74F0> <E164> <E165> <7586> <E17D> <E17E> <75FE> <E184> <E185> <75F2> <E18B> <E18D> <7620> <E192> <E193> <7647> <E197> <E198> <7661> <E199> <E19B> <7668> <E1AA> <E1AB> <7699> <E1AE> <E1B0> <76B8> <E1C2> <E1C3> <7725> <E1C5> <E1C6> <7737> <E1D9> <E1DA> <77BC> <E25A> <E25B> <79B9> <E264> <E265> <7A18> <E270> <E271> <7A61> <E28B> <E28C> <7AD9> <E28E> <E28F> <7AE1> <E298> <E299> <7B18> <E2A9> <E2AA> <7B70> <E386> <E387> <7E59> <E392> <E393> <7E88> <E397> <E398> <7E93> <E39B> <E39C> <7E9B> <E3A0> <E3A2> <7F4C> <E3A3> <E3A4> <7F50> <E3A8> <E3A9> <7F5F> <E3AA> <E3AB> <7F68> <E3C0> <E3C1> <7FC5> <E3CF> <E3D0> <8018> <E448> <E449> <8165> <E466> <E467> <81DF> <E469> <E46A> <81FA> <E46C> <E46D> <8201> <E482> <E483> <826A> <E486> <E487> <8277> <E4AA> <E4AB> <8317> <E4F2> <E4F3> <8517> <E56F> <E570> <86A9> <E571> <E572> <868B> <E5B8> <E5B9> <87F6> <E5DF> <E5E0> <88C3> <E5E2> <E5E3> <88D8> <E5F2> <E5F3> <892A> <E655> <E656> <89BF> <E658> <E659> <89DC> <E674> <E675> <8AA5> <E6A7> <E6A8> <8B92> <E6AA> <E6AB> <8B99> <E6BC> <E6BD> <8C8D> <E6C5> <E6C6> <8CB2> <E6CF> <E6D0> <8CFA> <E6D1> <E6D2> <8D04> <E6EC> <E6ED> <8DEA> <E6F1> <E6F2> <8E08> <E6F4> <E6F5> <8E1D> <E780> <E782> <8F62> <E791> <E792> <8FF9> <E79F> <E7A2> <904F> <E7D4> <E7D5> <91C0> <E7DE> <E7DF> <91F5> <E84D> <E84E> <93AC> <E851> <E852> <93D6> <E87D> <E87E> <9598> <E896> <E897> <962E> <E8AA> <E8AB> <96B1> <E8AF> <E8B0> <96B8> <E8C7> <E8C8> <973D> <E8DD> <E8DE> <978F> <E8E3> <E8E4> <97B3> <E8FB> <E8FC> <986F> <E952> <E953> <991D> <E958> <E959> <993D> <E95F> <E960> <9951> <E963> <E964> <9997> <E966> <E967> <99AD> <E96E> <E96F> <99ED> <E970> <E971> <99F1> <E992> <E993> <9AD3> endbfrange 27 beginbfrange <E994> <E995> <9ADE> <E996> <E997> <9AE2> <E9A4> <E9A5> <9B22> <E9A7> <E9AA> <9B27> <E9AB> <E9AC> <9B2E> <E9B1> <E9B2> <9B4D> <E9B9> <E9BA> <9B96> <E9BB> <E9BC> <9B9F> <E9C4> <E9C5> <9BD1> <EA40> <EA41> <9D5D> <EA5F> <EA60> <9E1A> <EA67> <EA68> <9E8B> <EA74> <EA76> <9ECE> <EA81> <EA82> <9EF6> <EA84> <EA86> <9EFB> <EA87> <EA88> <9F07> <EA92> <EA94> <9F5F> <EA95> <EA96> <9F66> <EB41> <EB42> <3001> <EB69> <EB6A> <FE35> <EB6B> <EB6C> <FE39> <EB6F> <EB70> <FE37> <EB71> <EB72> <FE3F> <EB73> <EB74> <FE3D> <EB75> <EB78> <FE41> <EB79> <EB7A> <FE3B> <ED95> <ED96> <30F5> endbfrange endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF \ No newline at end of file
diff --git a/src/main/resources/Resources/cmap/90pv-RKSJ-V b/src/main/resources/Resources/cmap/90pv-RKSJ-V
new file mode 100644
index 0000000..a3eb897
--- /dev/null
+++ b/src/main/resources/Resources/cmap/90pv-RKSJ-V
@@ -0,0 +1,111 @@
+%!PS-Adobe-3.0 Resource-CMap
+%%DocumentNeededResources: ProcSet (CIDInit)
+%%DocumentNeededResources: CMap (90pv-RKSJ-H)
+%%IncludeResource: ProcSet (CIDInit)
+%%IncludeResource: CMap (90pv-RKSJ-H)
+%%BeginResource: CMap (90pv-RKSJ-V)
+%%Title: (90pv-RKSJ-V Adobe Japan1 1)
+%%Version: 10.001
+%%Copyright: -----------------------------------------------------------
+%%Copyright: Copyright 1990-1998 Adobe Systems Incorporated.
+%%Copyright: All Rights Reserved.
+%%Copyright:
+%%Copyright: Patents Pending
+%%Copyright:
+%%Copyright: NOTICE: All information contained herein is the property
+%%Copyright: of Adobe Systems Incorporated.
+%%Copyright:
+%%Copyright: Permission is granted for redistribution of this file
+%%Copyright: provided this copyright notice is maintained intact and
+%%Copyright: that the contents of this file are not altered in any
+%%Copyright: way from its original form.
+%%Copyright:
+%%Copyright: PostScript and Display PostScript are trademarks of
+%%Copyright: Adobe Systems Incorporated which may be registered in
+%%Copyright: certain jurisdictions.
+%%Copyright: -----------------------------------------------------------
+%%EndComments
+
+/CIDInit /ProcSet findresource begin
+
+12 dict begin
+
+begincmap
+
+/90pv-RKSJ-H usecmap
+
+/CIDSystemInfo 3 dict dup begin
+ /Registry (Adobe) def
+ /Ordering (Japan1) def
+ /Supplement 1 def
+end def
+
+/CMapName /90pv-RKSJ-V def
+/CMapVersion 10.001 def
+/CMapType 1 def
+
+/UIDOffset 940 def
+/XUID [1 10 25342] def
+
+/WMode 1 def
+
+51 begincidrange
+<8141> <8142> 7887
+<8150> <8151> 7889
+<815b> <815d> 7891
+<8160> <8164> 7894
+<8169> <817a> 7899
+<8181> <8181> 7917
+<829f> <829f> 7918
+<82a1> <82a1> 7919
+<82a3> <82a3> 7920
+<82a5> <82a5> 7921
+<82a7> <82a7> 7922
+<82c1> <82c1> 7923
+<82e1> <82e1> 7924
+<82e3> <82e3> 7925
+<82e5> <82e5> 7926
+<82ec> <82ec> 7927
+<8340> <8340> 7928
+<8342> <8342> 7929
+<8344> <8344> 7930
+<8346> <8346> 7931
+<8348> <8348> 7932
+<8362> <8362> 7933
+<8383> <8383> 7934
+<8385> <8385> 7935
+<8387> <8387> 7936
+<838e> <838e> 7937
+<8395> <8396> 7938
+<879f> <879f> 7940
+<87a0> <87a0> 8329
+<87a1> <87a1> 7943
+<87a2> <87a2> 7941
+<87a3> <87a3> 8330
+<87a4> <87a5> 8333
+<87a6> <87a7> 8337
+<87a8> <87a8> 7947
+<87a9> <87aa> 8339
+<87ab> <87ab> 7945
+<87ac> <87ac> 7948
+<87ad> <87ad> 7954
+<87ae> <87af> 8343
+<87b0> <87b0> 7950
+<87b1> <87b2> 8347
+<87b3> <87b3> 7951
+<87b4> <87b4> 8349
+<87b5> <87b5> 7953
+<87bd> <87bd> 8350
+<87be> <87be> 8353
+<87bf> <87bf> 8356
+<87c0> <87c0> 8358
+<87c1> <87c1> 8357
+<87fa> <87fc> 8324
+endcidrange
+endcmap
+CMapName currentdict /CMap defineresource pop
+end
+end
+
+%%EndResource
+%%EOF
diff --git a/src/main/resources/Resources/cmap/Add-H b/src/main/resources/Resources/cmap/Add-H
new file mode 100644
index 0000000..318166d
--- /dev/null
+++ b/src/main/resources/Resources/cmap/Add-H
@@ -0,0 +1,709 @@
+%!PS-Adobe-3.0 Resource-CMap
+%%DocumentNeededResources: ProcSet (CIDInit)
+%%IncludeResource: ProcSet (CIDInit)
+%%BeginResource: CMap (Add-H)
+%%Title: (Add-H Adobe Japan1 1)
+%%Version: 5.008
+%%Copyright: -----------------------------------------------------------
+%%Copyright: Copyright 1990-1996 Adobe Systems Incorporated.
+%%Copyright: All Rights Reserved.
+%%Copyright:
+%%Copyright: Patents Pending
+%%Copyright:
+%%Copyright: NOTICE: All information contained herein is the property
+%%Copyright: of Adobe Systems Incorporated.
+%%Copyright:
+%%Copyright: Permission is granted for redistribution of this file
+%%Copyright: provided this copyright notice is maintained intact and
+%%Copyright: that the contents of this file are not altered in any
+%%Copyright: way from its original form.
+%%Copyright:
+%%Copyright: PostScript and Display PostScript are trademarks of
+%%Copyright: Adobe Systems Incorporated which may be registered in
+%%Copyright: certain jurisdictions.
+%%Copyright: -----------------------------------------------------------
+%%EndComments
+
+/CIDInit /ProcSet findresource begin
+
+12 dict begin
+
+begincmap
+
+/CIDSystemInfo 3 dict dup begin
+ /Registry (Adobe) def
+ /Ordering (Japan1) def
+ /Supplement 1 def
+end def
+
+/CMapName /Add-H def
+/CMapVersion 5.008 def
+/CMapType 1 def
+
+/UIDOffset 580 def
+/XUID [1 10 25325] def
+
+/WMode 0 def
+
+1 begincodespacerange
+ <2121> <7E7E>
+endcodespacerange
+
+100 begincidrange
+<2121> <217e> 633
+<2221> <222e> 727
+<223a> <2241> 741
+<224a> <2250> 749
+<225c> <226a> 756
+<2272> <2279> 771
+<227e> <227e> 779
+<2330> <2339> 780
+<2341> <235a> 790
+<2361> <237a> 816
+<2421> <2473> 842
+<2474> <2476> 7958
+<2521> <2576> 925
+<2621> <2638> 1011
+<2641> <2658> 1035
+<2721> <2741> 1059
+<2751> <2771> 1092
+<2821> <2821> 7479
+<2822> <2822> 7481
+<2823> <2823> 7491
+<2824> <2824> 7495
+<2825> <2825> 7503
+<2826> <2826> 7499
+<2827> <2827> 7507
+<2828> <2828> 7523
+<2829> <2829> 7515
+<282a> <282a> 7531
+<282b> <282b> 7539
+<282c> <282c> 7480
+<282d> <282d> 7482
+<282e> <282e> 7494
+<282f> <282f> 7498
+<2830> <2830> 7506
+<2831> <2831> 7502
+<2832> <2832> 7514
+<2833> <2833> 7530
+<2834> <2834> 7522
+<2835> <2835> 7538
+<2836> <2836> 7554
+<2837> <2837> 7511
+<2838> <2838> 7526
+<2839> <2839> 7519
+<283a> <283a> 7534
+<283b> <283b> 7542
+<283c> <283c> 7508
+<283d> <283d> 7527
+<283e> <283e> 7516
+<283f> <283f> 7535
+<2840> <2840> 7545
+<3021> <3021> 1125
+<3022> <3022> 7633
+<3023> <3031> 1127
+<3032> <3032> 7961
+<3033> <303a> 1143
+<303b> <303b> 7634
+<303c> <306d> 1152
+<306e> <306e> 7635
+<306f> <3070> 1203
+<3071> <3071> 7962
+<3072> <3072> 1206
+<3073> <3073> 7636
+<3074> <307b> 1208
+<307c> <307c> 7637
+<307d> <307e> 1217
+<3121> <3129> 1219
+<312a> <312a> 7638
+<312b> <3132> 1229
+<3133> <3133> 7963
+<3134> <3134> 1238
+<3135> <3135> 7639
+<3136> <3138> 1240
+<3139> <3139> 7964
+<313a> <313c> 1244
+<313d> <313d> 7642
+<313e> <3141> 1248
+<3142> <3142> 7643
+<3143> <316a> 1253
+<316b> <316b> 7644
+<316c> <317e> 1294
+<3221> <3227> 1313
+<3228> <3228> 7645
+<3229> <3229> 1321
+<322a> <322a> 7646
+<322b> <325f> 1323
+<3260> <3260> 7647
+<3261> <3266> 1377
+<3267> <3267> 7965
+<3268> <3279> 1384
+<327a> <327a> 7648
+<327b> <327e> 1403
+<3321> <3321> 1407
+<3322> <3322> 7650
+<3323> <336a> 1409
+<336b> <336b> 7652
+<336c> <3372> 1482
+<3373> <3373> 7653
+<3374> <3379> 1490
+<337a> <337a> 7654
+<337b> <337e> 1497
+<3421> <3441> 1501
+endcidrange
+
+100 begincidrange
+<3442> <3442> 7655
+<3443> <344c> 1535
+<344d> <344d> 7656
+<344e> <3464> 1546
+<3465> <3465> 7657
+<3466> <347e> 1570
+<3521> <352a> 1595
+<352b> <352b> 7658
+<352c> <353f> 1606
+<3540> <3540> 7659
+<3541> <3561> 1627
+<3562> <3562> 7966
+<3563> <3567> 1661
+<3568> <3568> 7967
+<3569> <357e> 1667
+<3621> <3621> 1689
+<3622> <3622> 7660
+<3623> <3629> 1691
+<362a> <362a> 7661
+<362b> <3641> 1699
+<3642> <3642> 7968
+<3643> <364e> 1723
+<364f> <364f> 7662
+<3650> <366c> 1736
+<366d> <366d> 7663
+<366e> <3673> 1766
+<3674> <3674> 7664
+<3675> <367a> 1773
+<367b> <367b> 7665
+<367c> <367c> 1780
+<367d> <367d> 7666
+<367e> <367e> 1782
+<3721> <3736> 1783
+<3737> <3737> 7668
+<3738> <3751> 1806
+<3752> <3752> 7671
+<3753> <3770> 1833
+<3771> <3771> 7674
+<3772> <377c> 1864
+<377d> <377d> 7969
+<377e> <377e> 7676
+<3821> <3833> 1877
+<3834> <3834> 7677
+<3835> <3840> 1897
+<3841> <3841> 7678
+<3842> <387e> 1910
+<3921> <392a> 1971
+<392b> <392b> 7679
+<392c> <396c> 1982
+<396d> <396d> 7682
+<396e> <3973> 2048
+<3974> <3974> 7683
+<3975> <3978> 2055
+<3979> <3979> 7684
+<397a> <397e> 2060
+<3a21> <3a52> 2065
+<3a53> <3a53> 7685
+<3a54> <3a66> 2116
+<3a67> <3a67> 7686
+<3a68> <3a73> 2136
+<3a74> <3a74> 7687
+<3a75> <3a7e> 2149
+<3b21> <3b26> 2159
+<3b27> <3b27> 7688
+<3b28> <3b29> 2166
+<3b2a> <3b2a> 7689
+<3b2b> <3b2b> 2169
+<3b2c> <3b2c> 7690
+<3b2d> <3b38> 2171
+<3b39> <3b39> 7691
+<3b3a> <3b40> 2184
+<3b41> <3b41> 7970
+<3b42> <3b7e> 2192
+<3c21> <3c47> 2253
+<3c48> <3c48> 7693
+<3c49> <3c5c> 2293
+<3c5d> <3c5e> 7695
+<3c5f> <3c7e> 2315
+<3d21> <3d2a> 2347
+<3d2b> <3d2b> 7697
+<3d2c> <3d35> 2358
+<3d36> <3d36> 7698
+<3d37> <3d6b> 2369
+<3d6c> <3d6c> 7699
+<3d6d> <3d71> 2423
+<3d72> <3d73> 7701
+<3d74> <3d7e> 2430
+<3e21> <3e24> 2441
+<3e25> <3e25> 7703
+<3e26> <3e32> 2446
+<3e33> <3e33> 7704
+<3e34> <3e54> 2460
+<3e55> <3e55> 7706
+<3e56> <3e5e> 2494
+<3e5f> <3e5f> 7707
+<3e60> <3e63> 2504
+<3e64> <3e64> 7708
+<3e65> <3e7e> 2509
+<3f21> <3f29> 2535
+<3f2a> <3f2a> 7709
+endcidrange
+
+100 begincidrange
+<3f2b> <3f58> 2545
+<3f59> <3f59> 7971
+<3f5a> <3f5f> 2592
+<3f60> <3f60> 7711
+<3f61> <3f7e> 2599
+<4021> <4021> 2629
+<4022> <4022> 7713
+<4023> <4065> 2631
+<4066> <4066> 7715
+<4067> <4070> 2699
+<4071> <4071> 7716
+<4072> <4078> 2710
+<4079> <4079> 7718
+<407a> <407a> 7972
+<407b> <407b> 2719
+<407c> <407d> 7973
+<407e> <407e> 2722
+<4121> <4126> 2723
+<4127> <4127> 7720
+<4128> <4138> 2730
+<4139> <4139> 7721
+<413a> <414b> 2748
+<414c> <414c> 7722
+<414d> <414e> 2767
+<414f> <414f> 7723
+<4150> <415e> 2770
+<415f> <415f> 7724
+<4160> <4168> 2786
+<4169> <4169> 7725
+<416a> <417e> 2796
+<4221> <4236> 2817
+<4237> <4237> 7975
+<4238> <423c> 2840
+<423d> <423d> 7726
+<423e> <424c> 2846
+<424d> <424d> 7727
+<424e> <425b> 2862
+<425c> <425c> 7728
+<425d> <4262> 2877
+<4263> <4263> 7729
+<4264> <426e> 2884
+<426f> <426f> 7730
+<4270> <427c> 2896
+<427d> <427d> 7733
+<427e> <427e> 2910
+<4321> <4326> 2911
+<4327> <4327> 7734
+<4328> <4328> 2918
+<4329> <4329> 7735
+<432a> <432c> 2920
+<432d> <432e> 7737
+<432f> <433c> 2925
+<433d> <433d> 7739
+<433e> <436f> 2940
+<4370> <4370> 7740
+<4371> <4374> 2991
+<4375> <4375> 7741
+<4376> <437b> 2996
+<437c> <437c> 7742
+<437d> <437e> 3003
+<4421> <443c> 3005
+<443d> <443d> 7743
+<443e> <4447> 3034
+<4448> <4448> 7744
+<4449> <4449> 3045
+<444a> <444a> 7745
+<444b> <444e> 3047
+<444f> <444f> 7747
+<4450> <447e> 3052
+<4521> <4521> 3099
+<4522> <4522> 7748
+<4523> <4526> 3101
+<4527> <4527> 7749
+<4528> <452d> 3106
+<452e> <452e> 7750
+<452f> <4535> 3113
+<4536> <4536> 7751
+<4537> <453e> 3121
+<453f> <453f> 7752
+<4540> <4547> 3130
+<4548> <4548> 7753
+<4549> <454a> 3139
+<454b> <454b> 7754
+<454c> <4550> 3142
+<4551> <4551> 7976
+<4552> <4552> 7756
+<4553> <4563> 3149
+<4564> <4564> 7757
+<4565> <4577> 3167
+<4578> <4578> 7758
+<4579> <457e> 3187
+<4621> <4641> 3193
+<4642> <4642> 7760
+<4643> <4653> 3227
+<4654> <4654> 7761
+<4655> <465a> 3245
+<465b> <465b> 7763
+<465c> <4665> 3252
+<4666> <4667> 7766
+<4668> <4669> 3264
+endcidrange
+
+100 begincidrange
+<466a> <466a> 7768
+<466b> <4675> 3267
+<4676> <4676> 7872
+<4677> <467e> 3279
+<4721> <4728> 3287
+<4729> <4729> 7769
+<472a> <472a> 7977
+<472b> <4738> 3297
+<4739> <4739> 7770
+<473a> <4756> 3312
+<4757> <4757> 7771
+<4758> <4766> 3342
+<4767> <4767> 7772
+<4768> <4768> 3358
+<4769> <4769> 7773
+<476a> <476c> 3360
+<476d> <476d> 7774
+<476e> <477e> 3364
+<4821> <4823> 3381
+<4824> <4824> 7775
+<4825> <482d> 3385
+<482e> <482e> 7776
+<482f> <482f> 3395
+<4830> <4830> 7777
+<4831> <483f> 3397
+<4840> <4840> 7978
+<4841> <4853> 3413
+<4854> <4854> 7778
+<4855> <4874> 3433
+<4875> <4875> 7780
+<4876> <487e> 3466
+<4921> <4921> 3475
+<4922> <4923> 7781
+<4924> <492e> 3478
+<492f> <492f> 7783
+<4930> <4931> 3490
+<4932> <4932> 7784
+<4933> <4934> 3493
+<4935> <4935> 7785
+<4936> <493f> 3496
+<4940> <4940> 7786
+<4941> <494d> 3507
+<494e> <494e> 7787
+<494f> <497e> 3521
+<4a21> <4a42> 3569
+<4a43> <4a43> 7789
+<4a44> <4a4c> 3604
+<4a4d> <4a4d> 7790
+<4a4e> <4a52> 3614
+<4a53> <4a53> 7979
+<4a54> <4a59> 3620
+<4a5a> <4a5a> 7791
+<4a5b> <4a78> 3627
+<4a79> <4a79> 7792
+<4a7a> <4a7e> 3658
+<4b21> <4b28> 3663
+<4b29> <4b29> 7794
+<4b2a> <4b4a> 3672
+<4b4b> <4b4b> 7795
+<4b4c> <4b6f> 3706
+<4b70> <4b70> 7796
+<4b71> <4b77> 3743
+<4b78> <4b78> 7980
+<4b79> <4b7e> 3751
+<4c21> <4c4c> 3757
+<4c4d> <4c4d> 7797
+<4c4e> <4c58> 3802
+<4c59> <4c59> 7798
+<4c5a> <4c5e> 3814
+<4c5f> <4c5f> 7799
+<4c60> <4c61> 3820
+<4c62> <4c62> 7800
+<4c63> <4c79> 3823
+<4c7a> <4c7a> 7801
+<4c7b> <4c7b> 3847
+<4c7c> <4c7c> 7802
+<4c7d> <4c7e> 3849
+<4d21> <4d31> 3851
+<4d32> <4d32> 7804
+<4d33> <4d4f> 3869
+<4d50> <4d50> 7805
+<4d51> <4d53> 3899
+<4d54> <4d54> 7806
+<4d55> <4d68> 3903
+<4d69> <4d69> 7807
+<4d6a> <4d7e> 3924
+<4e21> <4e79> 3945
+<4e7a> <4e7b> 7809
+<4e7c> <4e7c> 7981
+<4e7d> <4e7e> 4037
+<4f21> <4f21> 7811
+<4f22> <4f30> 4040
+<4f31> <4f31> 7812
+<4f32> <4f38> 4056
+<4f39> <4f39> 7813
+<4f3a> <4f53> 4064
+<5021> <507e> 4090
+<5121> <5121> 4184
+<5122> <5122> 7982
+<5123> <513c> 4186
+endcidrange
+
+100 begincidrange
+<513d> <513d> 7814
+<513e> <514c> 4213
+<514d> <514d> 7817
+<514e> <517e> 4229
+<5221> <5237> 4278
+<5238> <5238> 7983
+<5239> <527e> 4302
+<5321> <532f> 4372
+<5330> <5330> 7818
+<5331> <5339> 4388
+<533a> <533a> 7819
+<533b> <5347> 4398
+<5348> <5348> 7984
+<5349> <535d> 4412
+<535e> <535e> 7821
+<535f> <536a> 4434
+<536b> <536b> 7822
+<536c> <536c> 7985
+<536d> <537e> 4448
+<5421> <5443> 4466
+<5444> <5444> 7823
+<5445> <5445> 7986
+<5446> <546b> 4503
+<546c> <546c> 7987
+<546d> <547e> 4542
+<5521> <553c> 4560
+<553d> <553d> 7824
+<553e> <5562> 4589
+<5563> <5563> 7825
+<5564> <5577> 4627
+<5578> <5578> 7988
+<5579> <557e> 4648
+<5621> <5621> 4654
+<5622> <5622> 7826
+<5623> <567c> 4656
+<567d> <567e> 7989
+<5721> <577e> 4748
+<5821> <5823> 4842
+<5824> <5824> 7828
+<5825> <587e> 4846
+<5921> <5927> 4936
+<5928> <5928> 7991
+<5929> <595f> 4944
+<5960> <5960> 7829
+<5961> <596b> 5000
+<596c> <596c> 7830
+<596d> <597e> 5012
+<5a21> <5a38> 5030
+<5a39> <5a39> 7831
+<5a3a> <5a79> 5055
+<5a7a> <5a7a> 7992
+<5a7b> <5a7e> 5120
+<5b21> <5b44> 5124
+<5b45> <5b45> 7833
+<5b46> <5b6a> 5161
+<5b6b> <5b6b> 7835
+<5b6c> <5b7e> 5199
+<5c21> <5c7e> 5218
+<5d21> <5d60> 5312
+<5d61> <5d61> 7993
+<5d62> <5d7e> 5377
+<5e21> <5e4f> 5406
+<5e50> <5e50> 7837
+<5e51> <5e55> 5454
+<5e56> <5e56> 7994
+<5e57> <5e75> 5460
+<5e76> <5e76> 7995
+<5e77> <5e7e> 5492
+<5f21> <5f72> 5500
+<5f73> <5f73> 7838
+<5f74> <5f7e> 5583
+<6021> <6025> 5594
+<6026> <6026> 7839
+<6027> <605e> 5600
+<605f> <605f> 7840
+<6060> <607e> 5657
+<6121> <612a> 5688
+<612b> <612b> 7841
+<612c> <617e> 5699
+<6221> <626e> 5782
+<626f> <626f> 7845
+<6270> <627e> 5861
+<6321> <6349> 5876
+<634a> <634a> 7846
+<634b> <6353> 5918
+<6354> <6354> 7847
+<6355> <6358> 5928
+<6359> <6359> 7996
+<635a> <637e> 5933
+<6421> <6438> 5970
+<6439> <6439> 7848
+<643a> <643f> 5995
+<6440> <6440> 7997
+<6441> <6463> 6002
+<6464> <6464> 7849
+<6465> <646d> 6038
+<646e> <646e> 7850
+<646f> <647e> 6048
+<6521> <6538> 6064
+<6539> <6539> 7851
+endcidrange
+
+100 begincidrange
+<653a> <653a> 6089
+<653b> <653b> 7852
+<653c> <6545> 6091
+<6546> <6546> 7853
+<6547> <657e> 6102
+<6621> <6648> 6158
+<6649> <6649> 7998
+<664a> <667e> 6199
+<6721> <6763> 6252
+<6764> <6764> 7855
+<6765> <6768> 6320
+<6769> <6769> 7856
+<676a> <6771> 6325
+<6772> <6772> 7857
+<6773> <677e> 6334
+<6821> <683a> 6346
+<683b> <683b> 7859
+<683c> <684c> 6373
+<684d> <684d> 7999
+<684e> <687e> 6391
+<6921> <697d> 6440
+<697e> <697e> 8000
+<6a21> <6a3b> 6534
+<6a3c> <6a3d> 8001
+<6a3e> <6a6e> 6563
+<6a6f> <6a6f> 7864
+<6a70> <6a7e> 6613
+<6b21> <6b31> 6628
+<6b32> <6b32> 7865
+<6b33> <6b65> 6646
+<6b66> <6b66> 7866
+<6b67> <6b7e> 6698
+<6c21> <6c68> 6722
+<6c69> <6c69> 7868
+<6c6a> <6c7e> 6795
+<6d21> <6d4d> 6816
+<6d4e> <6d4e> 7870
+<6d4f> <6d7e> 6862
+<6e21> <6e28> 6910
+<6e29> <6e29> 7873
+<6e2a> <6e3c> 6919
+<6e3d> <6e3d> 7874
+<6e3e> <6e7e> 6939
+<6f21> <6f7e> 7004
+<7021> <7050> 7098
+<7051> <7051> 7879
+<7052> <707e> 7147
+<7121> <7158> 7192
+<7159> <7159> 8003
+<715a> <717e> 7249
+<7221> <722c> 7286
+<722d> <722d> 7882
+<722e> <723b> 7299
+<723c> <723c> 7883
+<723d> <724d> 7314
+<724e> <724e> 7884
+<724f> <727e> 7332
+<7321> <7350> 7380
+<7351> <7351> 7885
+<7352> <7352> 8004
+<7353> <737c> 7430
+<737d> <737d> 7886
+<737e> <737e> 7473
+<7421> <7424> 7474
+<7425> <7426> 8284
+<7721> <7723> 8005
+<7727> <7727> 8008
+<7728> <7728> 768
+<7729> <7729> 762
+<772a> <772a> 761
+<772e> <7738> 8009
+<773c> <773e> 7601
+<773f> <773f> 8020
+<7740> <7740> 7607
+<7741> <7743> 8021
+<7744> <7746> 7604
+<7747> <7750> 8024
+<7751> <7751> 771
+<7752> <7752> 8034
+<7753> <7753> 772
+<7754> <7755> 8035
+<7757> <7757> 8037
+<7759> <7759> 7588
+<775a> <775a> 7585
+<775b> <775b> 8038
+<775c> <775c> 7586
+<775d> <775f> 8039
+<7760> <7760> 7590
+<7761> <7761> 8042
+<7762> <7762> 7592
+<7763> <7763> 7596
+<7764> <7764> 8043
+<7765> <7765> 7598
+<7766> <7766> 7595
+<7767> <7768> 8044
+<7769> <7769> 7599
+<776a> <7770> 8046
+<7774> <7779> 8053
+<777a> <777a> 7610
+<777b> <777b> 8059
+endcidrange
+
+31 begincidrange
+<777e> <777e> 8060
+<7829> <7832> 8061
+<7834> <7847> 8071
+<7849> <785c> 7555
+<785d> <785d> 8091
+<785e> <7867> 7575
+<786b> <787e> 8092
+<7921> <793a> 8112
+<7945> <7945> 7958
+<7949> <794a> 8138
+<794b> <794b> 7620
+<794c> <794e> 8140
+<794f> <794f> 7619
+<7950> <7954> 8143
+<7955> <7955> 7618
+<7956> <7959> 8148
+<795d> <796a> 8152
+<796f> <797e> 8166
+<7d21> <7d22> 7887
+<7d23> <7d23> 8268
+<7d24> <7d24> 8274
+<7d25> <7d2e> 7889
+<7d2f> <7d2f> 8282
+<7d30> <7d30> 8275
+<7d31> <7d31> 8280
+<7d32> <7d32> 8277
+<7d33> <7d44> 7899
+<7d45> <7d5a> 7918
+<7d5b> <7d5c> 8264
+<7d6d> <7d70> 736
+<7d71> <7d74> 8182
+endcidrange
+endcmap
+CMapName currentdict /CMap defineresource pop
+end
+end
+
+%%EndResource
+%%EOF
diff --git a/src/main/resources/Resources/cmap/Add-RKSJ-H b/src/main/resources/Resources/cmap/Add-RKSJ-H
new file mode 100644
index 0000000..80c102b
--- /dev/null
+++ b/src/main/resources/Resources/cmap/Add-RKSJ-H
@@ -0,0 +1 @@
+%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%IncludeResource: ProcSet (CIDInit) %%BeginResource: CMap (Add-RKSJ-H) %%Title: (Add-RKSJ-H Adobe Japan1 1) %%Version: 10.001 %%Copyright: ----------------------------------------------------------- %%Copyright: Copyright 1990-1998 Adobe Systems Incorporated. %%Copyright: All Rights Reserved. %%Copyright: %%Copyright: Patents Pending %%Copyright: %%Copyright: NOTICE: All information contained herein is the property %%Copyright: of Adobe Systems Incorporated. %%Copyright: %%Copyright: Permission is granted for redistribution of this file %%Copyright: provided this copyright notice is maintained intact and %%Copyright: that the contents of this file are not altered in any %%Copyright: way from its original form. %%Copyright: %%Copyright: PostScript and Display PostScript are trademarks of %%Copyright: Adobe Systems Incorporated which may be registered in %%Copyright: certain jurisdictions. %%Copyright: ----------------------------------------------------------- %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo 3 dict dup begin /Registry (Adobe) def /Ordering (Japan1) def /Supplement 1 def end def /CMapName /Add-RKSJ-H def /CMapVersion 10.001 def /CMapType 1 def /UIDOffset 140 def /XUID [1 10 25326] def /WMode 0 def 4 begincodespacerange <00> <80> <8140> <9FFC> <A0> <DF> <E040> <FCFC> endcodespacerange 1 beginnotdefrange <00> <1f> 231 endnotdefrange 100 begincidrange <20> <7e> 231 <8140> <817e> 633 <8180> <81ac> 696 <81b8> <81bf> 741 <81c8> <81ce> 749 <81da> <81e8> 756 <81f0> <81f7> 771 <81fc> <81fc> 779 <824f> <8258> 780 <8260> <8279> 790 <8281> <829a> 816 <829f> <82f1> 842 <82f2> <82f4> 7958 <8340> <837e> 925 <8380> <8396> 988 <839f> <83b6> 1011 <83bf> <83d6> 1035 <8440> <8460> 1059 <8470> <847e> 1092 <8480> <8491> 1107 <849f> <849f> 7479 <84a0> <84a0> 7481 <84a1> <84a1> 7491 <84a2> <84a2> 7495 <84a3> <84a3> 7503 <84a4> <84a4> 7499 <84a5> <84a5> 7507 <84a6> <84a6> 7523 <84a7> <84a7> 7515 <84a8> <84a8> 7531 <84a9> <84a9> 7539 <84aa> <84aa> 7480 <84ab> <84ab> 7482 <84ac> <84ac> 7494 <84ad> <84ad> 7498 <84ae> <84ae> 7506 <84af> <84af> 7502 <84b0> <84b0> 7514 <84b1> <84b1> 7530 <84b2> <84b2> 7522 <84b3> <84b3> 7538 <84b4> <84b4> 7554 <84b5> <84b5> 7511 <84b6> <84b6> 7526 <84b7> <84b7> 7519 <84b8> <84b8> 7534 <84b9> <84b9> 7542 <84ba> <84ba> 7508 <84bb> <84bb> 7527 <84bc> <84bc> 7516 <84bd> <84bd> 7535 <84be> <84be> 7545 <889f> <889f> 1125 <88a0> <88a0> 7633 <88a1> <88af> 1127 <88b0> <88b0> 7961 <88b1> <88b8> 1143 <88b9> <88b9> 7634 <88ba> <88eb> 1152 <88ec> <88ec> 7635 <88ed> <88ee> 1203 <88ef> <88ef> 7962 <88f0> <88f0> 1206 <88f1> <88f1> 7636 <88f2> <88f9> 1208 <88fa> <88fa> 7637 <88fb> <88fc> 1217 <8940> <8948> 1219 <8949> <8949> 7638 <894a> <8951> 1229 <8952> <8952> 7963 <8953> <8953> 1238 <8954> <8954> 7639 <8955> <8957> 1240 <8958> <8958> 7964 <8959> <895b> 1244 <895c> <895c> 7642 <895d> <8960> 1248 <8961> <8961> 7643 <8962> <897e> 1253 <8980> <898a> 1282 <898b> <898b> 7644 <898c> <89a5> 1294 <89a6> <89a6> 7645 <89a7> <89a7> 1321 <89a8> <89a8> 7646 <89a9> <89dd> 1323 <89de> <89de> 7647 <89df> <89e4> 1377 <89e5> <89e5> 7965 <89e6> <89f7> 1384 <89f8> <89f8> 7648 <89f9> <89fc> 1403 <8a40> <8a40> 1407 <8a41> <8a41> 7650 <8a42> <8a7e> 1409 <8a80> <8a8a> 1470 <8a8b> <8a8b> 7652 <8a8c> <8a92> 1482 <8a93> <8a93> 7653 endcidrange 100 begincidrange <8a94> <8a99> 1490 <8a9a> <8a9a> 7654 <8a9b> <8abf> 1497 <8ac0> <8ac0> 7655 <8ac1> <8aca> 1535 <8acb> <8acb> 7656 <8acc> <8ae2> 1546 <8ae3> <8ae3> 7657 <8ae4> <8afc> 1570 <8b40> <8b49> 1595 <8b4a> <8b4a> 7658 <8b4b> <8b5e> 1606 <8b5f> <8b5f> 7659 <8b60> <8b7e> 1627 <8b80> <8b81> 1658 <8b82> <8b82> 7966 <8b83> <8b87> 1661 <8b88> <8b88> 7967 <8b89> <8b9f> 1667 <8ba0> <8ba0> 7660 <8ba1> <8ba7> 1691 <8ba8> <8ba8> 7661 <8ba9> <8bbf> 1699 <8bc0> <8bc0> 7968 <8bc1> <8bcc> 1723 <8bcd> <8bcd> 7662 <8bce> <8bea> 1736 <8beb> <8beb> 7663 <8bec> <8bf1> 1766 <8bf2> <8bf2> 7664 <8bf3> <8bf8> 1773 <8bf9> <8bf9> 7665 <8bfa> <8bfa> 1780 <8bfb> <8bfb> 7666 <8bfc> <8bfc> 1782 <8c40> <8c55> 1783 <8c56> <8c56> 7668 <8c57> <8c70> 1806 <8c71> <8c71> 7671 <8c72> <8c7e> 1833 <8c80> <8c90> 1846 <8c91> <8c91> 7674 <8c92> <8c9c> 1864 <8c9d> <8c9d> 7969 <8c9e> <8c9e> 7676 <8c9f> <8cb1> 1877 <8cb2> <8cb2> 7677 <8cb3> <8cbe> 1897 <8cbf> <8cbf> 7678 <8cc0> <8cfc> 1910 <8d40> <8d49> 1971 <8d4a> <8d4a> 7679 <8d4b> <8d7e> 1982 <8d80> <8d8c> 2034 <8d8d> <8d8d> 7682 <8d8e> <8d93> 2048 <8d94> <8d94> 7683 <8d95> <8d98> 2055 <8d99> <8d99> 7684 <8d9a> <8dd0> 2060 <8dd1> <8dd1> 7685 <8dd2> <8de4> 2116 <8de5> <8de5> 7686 <8de6> <8df1> 2136 <8df2> <8df2> 7687 <8df3> <8dfc> 2149 <8e40> <8e45> 2159 <8e46> <8e46> 7688 <8e47> <8e48> 2166 <8e49> <8e49> 7689 <8e4a> <8e4a> 2169 <8e4b> <8e4b> 7690 <8e4c> <8e57> 2171 <8e58> <8e58> 7691 <8e59> <8e5f> 2184 <8e60> <8e60> 7970 <8e61> <8e7e> 2192 <8e80> <8ec5> 2222 <8ec6> <8ec6> 7693 <8ec7> <8eda> 2293 <8edb> <8edc> 7695 <8edd> <8efc> 2315 <8f40> <8f49> 2347 <8f4a> <8f4a> 7697 <8f4b> <8f54> 2358 <8f55> <8f55> 7698 <8f56> <8f7e> 2369 <8f80> <8f8b> 2410 <8f8c> <8f8c> 7699 <8f8d> <8f91> 2423 <8f92> <8f93> 7701 <8f94> <8fa2> 2430 <8fa3> <8fa3> 7703 <8fa4> <8fb0> 2446 <8fb1> <8fb1> 7704 <8fb2> <8fd2> 2460 <8fd3> <8fd3> 7706 <8fd4> <8fdc> 2494 <8fdd> <8fdd> 7707 <8fde> <8fe1> 2504 endcidrange 100 begincidrange <8fe2> <8fe2> 7708 <8fe3> <8ffc> 2509 <9040> <9048> 2535 <9049> <9049> 7709 <904a> <9077> 2545 <9078> <9078> 7971 <9079> <907e> 2592 <9080> <9080> 7711 <9081> <909f> 2599 <90a0> <90a0> 7713 <90a1> <90e3> 2631 <90e4> <90e4> 7715 <90e5> <90ee> 2699 <90ef> <90ef> 7716 <90f0> <90f6> 2710 <90f7> <90f7> 7718 <90f8> <90f8> 7972 <90f9> <90f9> 2719 <90fa> <90fb> 7973 <90fc> <90fc> 2722 <9140> <9145> 2723 <9146> <9146> 7720 <9147> <9157> 2730 <9158> <9158> 7721 <9159> <916a> 2748 <916b> <916b> 7722 <916c> <916d> 2767 <916e> <916e> 7723 <916f> <917d> 2770 <917e> <917e> 7724 <9180> <9188> 2786 <9189> <9189> 7725 <918a> <91b4> 2796 <91b5> <91b5> 7975 <91b6> <91ba> 2840 <91bb> <91bb> 7726 <91bc> <91ca> 2846 <91cb> <91cb> 7727 <91cc> <91d9> 2862 <91da> <91da> 7728 <91db> <91e0> 2877 <91e1> <91e1> 7729 <91e2> <91ec> 2884 <91ed> <91ed> 7730 <91ee> <91fa> 2896 <91fb> <91fb> 7733 <91fc> <91fc> 2910 <9240> <9245> 2911 <9246> <9246> 7734 <9247> <9247> 2918 <9248> <9248> 7735 <9249> <924b> 2920 <924c> <924d> 7737 <924e> <925b> 2925 <925c> <925c> 7739 <925d> <927e> 2940 <9280> <928f> 2974 <9290> <9290> 7740 <9291> <9294> 2991 <9295> <9295> 7741 <9296> <929b> 2996 <929c> <929c> 7742 <929d> <92ba> 3003 <92bb> <92bb> 7743 <92bc> <92c5> 3034 <92c6> <92c6> 7744 <92c7> <92c7> 3045 <92c8> <92c8> 7745 <92c9> <92cc> 3047 <92cd> <92cd> 7747 <92ce> <92fc> 3052 <9340> <9340> 3099 <9341> <9341> 7748 <9342> <9345> 3101 <9346> <9346> 7749 <9347> <934c> 3106 <934d> <934d> 7750 <934e> <9354> 3113 <9355> <9355> 7751 <9356> <935d> 3121 <935e> <935e> 7752 <935f> <9366> 3130 <9367> <9367> 7753 <9368> <9369> 3139 <936a> <936a> 7754 <936b> <936f> 3142 <9370> <9370> 7976 <9371> <9371> 7756 <9372> <937e> 3149 <9380> <9383> 3162 <9384> <9384> 7757 <9385> <9397> 3167 <9398> <9398> 7758 <9399> <93bf> 3187 <93c0> <93c0> 7760 <93c1> <93d1> 3227 <93d2> <93d2> 7761 <93d3> <93d8> 3245 <93d9> <93d9> 7763 <93da> <93e3> 3252 endcidrange 100 begincidrange <93e4> <93e5> 7766 <93e6> <93e7> 3264 <93e8> <93e8> 7768 <93e9> <93f3> 3267 <93f4> <93f4> 7872 <93f5> <93fc> 3279 <9440> <9447> 3287 <9448> <9448> 7769 <9449> <9449> 7977 <944a> <9457> 3297 <9458> <9458> 7770 <9459> <9475> 3312 <9476> <9476> 7771 <9477> <947e> 3342 <9480> <9486> 3350 <9487> <9487> 7772 <9488> <9488> 3358 <9489> <9489> 7773 <948a> <948c> 3360 <948d> <948d> 7774 <948e> <94a1> 3364 <94a2> <94a2> 7775 <94a3> <94ab> 3385 <94ac> <94ac> 7776 <94ad> <94ad> 3395 <94ae> <94ae> 7777 <94af> <94bd> 3397 <94be> <94be> 7978 <94bf> <94d1> 3413 <94d2> <94d2> 7778 <94d3> <94f2> 3433 <94f3> <94f3> 7780 <94f4> <94fc> 3466 <9540> <9540> 3475 <9541> <9542> 7781 <9543> <954d> 3478 <954e> <954e> 7783 <954f> <9550> 3490 <9551> <9551> 7784 <9552> <9553> 3493 <9554> <9554> 7785 <9555> <955e> 3496 <955f> <955f> 7786 <9560> <956c> 3507 <956d> <956d> 7787 <956e> <957e> 3521 <9580> <95c0> 3538 <95c1> <95c1> 7789 <95c2> <95ca> 3604 <95cb> <95cb> 7790 <95cc> <95d0> 3614 <95d1> <95d1> 7979 <95d2> <95d7> 3620 <95d8> <95d8> 7791 <95d9> <95f6> 3627 <95f7> <95f7> 7792 <95f8> <95fc> 3658 <9640> <9647> 3663 <9648> <9648> 7794 <9649> <9669> 3672 <966a> <966a> 7795 <966b> <967e> 3706 <9680> <968f> 3726 <9690> <9690> 7796 <9691> <9697> 3743 <9698> <9698> 7980 <9699> <96ca> 3751 <96cb> <96cb> 7797 <96cc> <96d6> 3802 <96d7> <96d7> 7798 <96d8> <96dc> 3814 <96dd> <96dd> 7799 <96de> <96df> 3820 <96e0> <96e0> 7800 <96e1> <96f7> 3823 <96f8> <96f8> 7801 <96f9> <96f9> 3847 <96fa> <96fa> 7802 <96fb> <96fc> 3849 <9740> <9750> 3851 <9751> <9751> 7804 <9752> <976e> 3869 <976f> <976f> 7805 <9770> <9772> 3899 <9773> <9773> 7806 <9774> <977e> 3903 <9780> <9788> 3914 <9789> <9789> 7807 <978a> <97f7> 3924 <97f8> <97f9> 7809 <97fa> <97fa> 7981 <97fb> <97fc> 4037 <9840> <9840> 7811 <9841> <984f> 4040 <9850> <9850> 7812 <9851> <9857> 4056 <9858> <9858> 7813 <9859> <9872> 4064 <989f> <98fc> 4090 <9940> <9940> 4184 endcidrange 100 begincidrange <9941> <9941> 7982 <9942> <995b> 4186 <995c> <995c> 7814 <995d> <996b> 4213 <996c> <996c> 7817 <996d> <997e> 4229 <9980> <99b5> 4247 <99b6> <99b6> 7983 <99b7> <99fc> 4302 <9a40> <9a4e> 4372 <9a4f> <9a4f> 7818 <9a50> <9a58> 4388 <9a59> <9a59> 7819 <9a5a> <9a66> 4398 <9a67> <9a67> 7984 <9a68> <9a7c> 4412 <9a7d> <9a7d> 7821 <9a7e> <9a7e> 4434 <9a80> <9a8a> 4435 <9a8b> <9a8b> 7822 <9a8c> <9a8c> 7985 <9a8d> <9ac1> 4448 <9ac2> <9ac2> 7823 <9ac3> <9ac3> 7986 <9ac4> <9ae9> 4503 <9aea> <9aea> 7987 <9aeb> <9afc> 4542 <9b40> <9b5b> 4560 <9b5c> <9b5c> 7824 <9b5d> <9b7e> 4589 <9b80> <9b82> 4623 <9b83> <9b83> 7825 <9b84> <9b97> 4627 <9b98> <9b98> 7988 <9b99> <9b9f> 4648 <9ba0> <9ba0> 7826 <9ba1> <9bfa> 4656 <9bfb> <9bfc> 7989 <9c40> <9c7e> 4748 <9c80> <9ca1> 4811 <9ca2> <9ca2> 7828 <9ca3> <9cfc> 4846 <9d40> <9d46> 4936 <9d47> <9d47> 7991 <9d48> <9d7e> 4944 <9d80> <9d80> 7829 <9d81> <9d8b> 5000 <9d8c> <9d8c> 7830 <9d8d> <9db6> 5012 <9db7> <9db7> 7831 <9db8> <9df7> 5055 <9df8> <9df8> 7992 <9df9> <9dfc> 5120 <9e40> <9e63> 5124 <9e64> <9e64> 7833 <9e65> <9e7e> 5161 <9e80> <9e8a> 5187 <9e8b> <9e8b> 7835 <9e8c> <9efc> 5199 <9f40> <9f7e> 5312 <9f80> <9f80> 5375 <9f81> <9f81> 7993 <9f82> <9fcd> 5377 <9fce> <9fce> 7837 <9fcf> <9fd3> 5454 <9fd4> <9fd4> 7994 <9fd5> <9ff3> 5460 <9ff4> <9ff4> 7995 <9ff5> <9ffc> 5492 <a0> <df> 326 <e040> <e07e> 5500 <e080> <e092> 5563 <e093> <e093> 7838 <e094> <e0a3> 5583 <e0a4> <e0a4> 7839 <e0a5> <e0dc> 5600 <e0dd> <e0dd> 7840 <e0de> <e0fc> 5657 <e140> <e149> 5688 <e14a> <e14a> 7841 <e14b> <e17e> 5699 <e180> <e1ec> 5751 <e1ed> <e1ed> 7845 <e1ee> <e1fc> 5861 <e240> <e268> 5876 <e269> <e269> 7846 <e26a> <e272> 5918 <e273> <e273> 7847 <e274> <e277> 5928 <e278> <e278> 7996 <e279> <e27e> 5933 <e280> <e2b6> 5939 <e2b7> <e2b7> 7848 <e2b8> <e2bd> 5995 <e2be> <e2be> 7997 <e2bf> <e2e1> 6002 <e2e2> <e2e2> 7849 <e2e3> <e2eb> 6038 <e2ec> <e2ec> 7850 <e2ed> <e2fc> 6048 endcidrange 100 begincidrange <e340> <e357> 6064 <e358> <e358> 7851 <e359> <e359> 6089 <e35a> <e35a> 7852 <e35b> <e364> 6091 <e365> <e365> 7853 <e366> <e37e> 6102 <e380> <e3c6> 6127 <e3c7> <e3c7> 7998 <e3c8> <e3fc> 6199 <e440> <e47e> 6252 <e480> <e483> 6315 <e484> <e484> 7855 <e485> <e488> 6320 <e489> <e489> 7856 <e48a> <e491> 6325 <e492> <e492> 7857 <e493> <e4b8> 6334 <e4b9> <e4b9> 7859 <e4ba> <e4ca> 6373 <e4cb> <e4cb> 7999 <e4cc> <e4fc> 6391 <e540> <e57e> 6440 <e580> <e59d> 6503 <e59e> <e59e> 8000 <e59f> <e5b9> 6534 <e5ba> <e5bb> 8001 <e5bc> <e5ec> 6563 <e5ed> <e5ed> 7864 <e5ee> <e5fc> 6613 <e640> <e650> 6628 <e651> <e651> 7865 <e652> <e67e> 6646 <e680> <e685> 6691 <e686> <e686> 7866 <e687> <e6e6> 6698 <e6e7> <e6e7> 7868 <e6e8> <e6fc> 6795 <e740> <e76c> 6816 <e76d> <e76d> 7870 <e76e> <e77e> 6862 <e780> <e7a6> 6879 <e7a7> <e7a7> 7873 <e7a8> <e7ba> 6919 <e7bb> <e7bb> 7874 <e7bc> <e7fc> 6939 <e840> <e87e> 7004 <e880> <e8ce> 7067 <e8cf> <e8cf> 7879 <e8d0> <e8fc> 7147 <e940> <e977> 7192 <e978> <e978> 8003 <e979> <e97e> 7249 <e980> <e9aa> 7255 <e9ab> <e9ab> 7882 <e9ac> <e9b9> 7299 <e9ba> <e9ba> 7883 <e9bb> <e9cb> 7314 <e9cc> <e9cc> 7884 <e9cd> <e9fc> 7332 <ea40> <ea6f> 7380 <ea70> <ea70> 7885 <ea71> <ea71> 8004 <ea72> <ea7e> 7430 <ea80> <ea9c> 7443 <ea9d> <ea9d> 7886 <ea9e> <eaa2> 7473 <eaa3> <eaa4> 8284 <ec40> <ec42> 8005 <ec46> <ec46> 8008 <ec47> <ec47> 768 <ec48> <ec48> 762 <ec49> <ec49> 761 <ec4d> <ec57> 8009 <ec5b> <ec5d> 7601 <ec5e> <ec5e> 8020 <ec5f> <ec5f> 7607 <ec60> <ec62> 8021 <ec63> <ec65> 7604 <ec66> <ec6f> 8024 <ec70> <ec70> 771 <ec71> <ec71> 8034 <ec72> <ec72> 772 <ec73> <ec74> 8035 <ec76> <ec76> 8037 <ec78> <ec78> 7588 <ec79> <ec79> 7585 <ec7a> <ec7a> 8038 <ec7b> <ec7b> 7586 <ec7c> <ec7e> 8039 <ec80> <ec80> 7590 <ec81> <ec81> 8042 <ec82> <ec82> 7592 <ec83> <ec83> 7596 <ec84> <ec84> 8043 <ec85> <ec85> 7598 <ec86> <ec86> 7595 <ec87> <ec88> 8044 <ec89> <ec89> 7599 <ec8a> <ec90> 8046 endcidrange 35 begincidrange <ec94> <ec99> 8053 <ec9a> <ec9a> 7610 <ec9b> <ec9b> 8059 <ec9e> <ec9e> 8060 <eca7> <ecb0> 8061 <ecb2> <ecc5> 8071 <ecc7> <ecda> 7555 <ecdb> <ecdb> 8091 <ecdc> <ece5> 7575 <ece9> <ecfc> 8092 <ed40> <ed59> 8112 <ed64> <ed64> 7958 <ed68> <ed69> 8138 <ed6a> <ed6a> 7620 <ed6b> <ed6d> 8140 <ed6e> <ed6e> 7619 <ed6f> <ed73> 8143 <ed74> <ed74> 7618 <ed75> <ed78> 8148 <ed7c> <ed7e> 8152 <ed80> <ed8a> 8155 <ed8f> <ed9e> 8166 <ef40> <ef41> 7887 <ef42> <ef42> 8268 <ef43> <ef43> 8274 <ef44> <ef4d> 7889 <ef4e> <ef4e> 8282 <ef4f> <ef4f> 8275 <ef50> <ef50> 8280 <ef51> <ef51> 8277 <ef52> <ef63> 7899 <ef64> <ef79> 7918 <ef7a> <ef7b> 8264 <ef8d> <ef90> 736 <ef91> <ef94> 8182 endcidrange endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF \ No newline at end of file
diff --git a/src/main/resources/Resources/cmap/Add-RKSJ-V b/src/main/resources/Resources/cmap/Add-RKSJ-V
new file mode 100644
index 0000000..144a730
--- /dev/null
+++ b/src/main/resources/Resources/cmap/Add-RKSJ-V
@@ -0,0 +1 @@
+%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%DocumentNeededResources: CMap (Add-RKSJ-H) %%IncludeResource: ProcSet (CIDInit) %%IncludeResource: CMap (Add-RKSJ-H) %%BeginResource: CMap (Add-RKSJ-V) %%Title: (Add-RKSJ-V Adobe Japan1 1) %%Version: 10.001 %%Copyright: ----------------------------------------------------------- %%Copyright: Copyright 1990-1998 Adobe Systems Incorporated. %%Copyright: All Rights Reserved. %%Copyright: %%Copyright: Patents Pending %%Copyright: %%Copyright: NOTICE: All information contained herein is the property %%Copyright: of Adobe Systems Incorporated. %%Copyright: %%Copyright: Permission is granted for redistribution of this file %%Copyright: provided this copyright notice is maintained intact and %%Copyright: that the contents of this file are not altered in any %%Copyright: way from its original form. %%Copyright: %%Copyright: PostScript and Display PostScript are trademarks of %%Copyright: Adobe Systems Incorporated which may be registered in %%Copyright: certain jurisdictions. %%Copyright: ----------------------------------------------------------- %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /Add-RKSJ-H usecmap /CIDSystemInfo 3 dict dup begin /Registry (Adobe) def /Ordering (Japan1) def /Supplement 1 def end def /CMapName /Add-RKSJ-V def /CMapVersion 10.001 def /CMapType 1 def /UIDOffset 780 def /XUID [1 10 25327] def /WMode 1 def 57 begincidrange <8141> <8142> 7887 <8143> <8143> 8268 <8144> <8144> 8274 <8150> <8151> 7889 <815b> <815d> 7891 <8160> <8164> 7894 <8165> <8165> 8282 <8166> <8166> 8275 <8167> <8167> 8280 <8168> <8168> 8277 <8169> <817a> 7899 <829f> <829f> 7918 <82a1> <82a1> 7919 <82a3> <82a3> 7920 <82a5> <82a5> 7921 <82a7> <82a7> 7922 <82c1> <82c1> 7923 <82e1> <82e1> 7924 <82e3> <82e3> 7925 <82e5> <82e5> 7926 <82ec> <82ec> 7927 <82f3> <82f4> 8264 <8340> <8340> 7928 <8342> <8342> 7929 <8344> <8344> 7930 <8346> <8346> 7931 <8348> <8348> 7932 <8362> <8362> 7933 <8383> <8383> 7934 <8385> <8385> 7935 <8387> <8387> 7936 <838e> <838e> 7937 <8395> <8396> 7938 <ec78> <ec78> 7943 <ec79> <ec79> 7940 <ec7a> <ec7a> 8329 <ec7b> <ec7b> 7941 <ec7c> <ec7c> 8330 <ec7d> <ec7e> 8339 <ec80> <ec80> 7945 <ec81> <ec81> 8338 <ec82> <ec82> 7947 <ec83> <ec83> 7951 <ec84> <ec84> 8348 <ec85> <ec85> 7953 <ec86> <ec86> 7950 <ec87> <ec87> 8344 <ec88> <ec88> 8347 <ec89> <ec89> 7954 <ec8a> <ec8a> 8343 <ec8b> <ec8c> 8349 <ec8d> <ec8d> 8358 <ec8e> <ec8e> 8357 <ec8f> <ec8f> 8353 <ec90> <ec90> 8356 <ec95> <ec95> 8324 <ef92> <ef92> 8333 endcidrange endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF \ No newline at end of file
diff --git a/src/main/resources/Resources/cmap/Add-V b/src/main/resources/Resources/cmap/Add-V
new file mode 100644
index 0000000..6b56ee4
--- /dev/null
+++ b/src/main/resources/Resources/cmap/Add-V
@@ -0,0 +1,117 @@
+%!PS-Adobe-3.0 Resource-CMap
+%%DocumentNeededResources: ProcSet (CIDInit)
+%%DocumentNeededResources: CMap (Add-H)
+%%IncludeResource: ProcSet (CIDInit)
+%%IncludeResource: CMap (Add-H)
+%%BeginResource: CMap (Add-V)
+%%Title: (Add-V Adobe Japan1 1)
+%%Version: 5.008
+%%Copyright: -----------------------------------------------------------
+%%Copyright: Copyright 1990-1996 Adobe Systems Incorporated.
+%%Copyright: All Rights Reserved.
+%%Copyright:
+%%Copyright: Patents Pending
+%%Copyright:
+%%Copyright: NOTICE: All information contained herein is the property
+%%Copyright: of Adobe Systems Incorporated.
+%%Copyright:
+%%Copyright: Permission is granted for redistribution of this file
+%%Copyright: provided this copyright notice is maintained intact and
+%%Copyright: that the contents of this file are not altered in any
+%%Copyright: way from its original form.
+%%Copyright:
+%%Copyright: PostScript and Display PostScript are trademarks of
+%%Copyright: Adobe Systems Incorporated which may be registered in
+%%Copyright: certain jurisdictions.
+%%Copyright: -----------------------------------------------------------
+%%EndComments
+
+/CIDInit /ProcSet findresource begin
+
+12 dict begin
+
+begincmap
+
+/Add-H usecmap
+
+/CIDSystemInfo 3 dict dup begin
+ /Registry (Adobe) def
+ /Ordering (Japan1) def
+ /Supplement 1 def
+end def
+
+/CMapName /Add-V def
+/CMapVersion 5.008 def
+/CMapType 1 def
+
+/UIDOffset 790 def
+/XUID [1 10 25328] def
+
+/WMode 1 def
+
+57 begincidrange
+<2122> <2123> 7887
+<2124> <2124> 8268
+<2125> <2125> 8274
+<2131> <2132> 7889
+<213c> <213e> 7891
+<2141> <2145> 7894
+<2146> <2146> 8282
+<2147> <2147> 8275
+<2148> <2148> 8280
+<2149> <2149> 8277
+<214a> <215b> 7899
+<2421> <2421> 7918
+<2423> <2423> 7919
+<2425> <2425> 7920
+<2427> <2427> 7921
+<2429> <2429> 7922
+<2443> <2443> 7923
+<2463> <2463> 7924
+<2465> <2465> 7925
+<2467> <2467> 7926
+<246e> <246e> 7927
+<2475> <2476> 8264
+<2521> <2521> 7928
+<2523> <2523> 7929
+<2525> <2525> 7930
+<2527> <2527> 7931
+<2529> <2529> 7932
+<2543> <2543> 7933
+<2563> <2563> 7934
+<2565> <2565> 7935
+<2567> <2567> 7936
+<256e> <256e> 7937
+<2575> <2576> 7938
+<7759> <7759> 7943
+<775a> <775a> 7940
+<775b> <775b> 8329
+<775c> <775c> 7941
+<775d> <775d> 8330
+<775e> <775f> 8339
+<7760> <7760> 7945
+<7761> <7761> 8338
+<7762> <7762> 7947
+<7763> <7763> 7951
+<7764> <7764> 8348
+<7765> <7765> 7953
+<7766> <7766> 7950
+<7767> <7767> 8344
+<7768> <7768> 8347
+<7769> <7769> 7954
+<776a> <776a> 8343
+<776b> <776c> 8349
+<776d> <776d> 8358
+<776e> <776e> 8357
+<776f> <776f> 8353
+<7770> <7770> 8356
+<7775> <7775> 8324
+<7d72> <7d72> 8333
+endcidrange
+endcmap
+CMapName currentdict /CMap defineresource pop
+end
+end
+
+%%EndResource
+%%EOF
diff --git a/src/main/resources/Resources/cmap/Adobe-CNS1-3 b/src/main/resources/Resources/cmap/Adobe-CNS1-3
new file mode 100644
index 0000000..d6d7676
--- /dev/null
+++ b/src/main/resources/Resources/cmap/Adobe-CNS1-3
@@ -0,0 +1 @@
+%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%IncludeResource: ProcSet (CIDInit) %%BeginResource: CMap (Identity) %%Title: (Identity Adobe CNS1 3) %%Version: 1.000 %%Copyright: ----------------------------------------------------------- %%Copyright: Copyright 1990-2000 Adobe Systems Incorporated. %%Copyright: All Rights Reserved. %%Copyright: %%Copyright: Patents Pending %%Copyright: %%Copyright: NOTICE: All information contained herein is the property %%Copyright: of Adobe Systems Incorporated. %%Copyright: %%Copyright: Permission is granted for redistribution of this file %%Copyright: provided this copyright notice is maintained intact and %%Copyright: that the contents of this file are not altered in any %%Copyright: way from its original form. %%Copyright: %%Copyright: PostScript and Display PostScript are trademarks of %%Copyright: Adobe Systems Incorporated which may be registered in %%Copyright: certain jurisdictions. %%Copyright: ----------------------------------------------------------- %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo 3 dict dup begin /Registry (Adobe) def /Ordering (CNS1) def /Supplement 3 def end def /CMapName /Adobe-CNS1-3 def /CMapVersion 1.000 def /CMapType 1 def /XUID [1 10 25587] def /WMode 0 def /CIDCount 18846 def 1 begincodespacerange <0000> <49FF> endcodespacerange 74 begincidrange <0000> <00ff> 0 <0100> <01ff> 256 <0200> <02ff> 512 <0300> <03ff> 768 <0400> <04ff> 1024 <0500> <05ff> 1280 <0600> <06ff> 1536 <0700> <07ff> 1792 <0800> <08ff> 2048 <0900> <09ff> 2304 <0a00> <0aff> 2560 <0b00> <0bff> 2816 <0c00> <0cff> 3072 <0d00> <0dff> 3328 <0e00> <0eff> 3584 <0f00> <0fff> 3840 <1000> <10ff> 4096 <1100> <11ff> 4352 <1200> <12ff> 4608 <1300> <13ff> 4864 <1400> <14ff> 5120 <1500> <15ff> 5376 <1600> <16ff> 5632 <1700> <17ff> 5888 <1800> <18ff> 6144 <1900> <19ff> 6400 <1a00> <1aff> 6656 <1b00> <1bff> 6912 <1c00> <1cff> 7168 <1d00> <1dff> 7424 <1e00> <1eff> 7680 <1f00> <1fff> 7936 <2000> <20ff> 8192 <2100> <21ff> 8448 <2200> <22ff> 8704 <2300> <23ff> 8960 <2400> <24ff> 9216 <2500> <25ff> 9472 <2600> <26ff> 9728 <2700> <27ff> 9984 <2800> <28ff> 10240 <2900> <29ff> 10496 <2a00> <2aff> 10752 <2b00> <2bff> 11008 <2c00> <2cff> 11264 <2d00> <2dff> 11520 <2e00> <2eff> 11776 <2f00> <2fff> 12032 <3000> <30ff> 12288 <3100> <31ff> 12544 <3200> <32ff> 12800 <3300> <33ff> 13056 <3400> <34ff> 13312 <3500> <35ff> 13568 <3600> <36ff> 13824 <3700> <37ff> 14080 <3800> <38ff> 14336 <3900> <39ff> 14592 <3a00> <3aff> 14848 <3b00> <3bff> 15104 <3c00> <3cff> 15360 <3d00> <3dff> 15616 <3e00> <3eff> 15872 <3f00> <3fff> 16128 <4000> <40ff> 16384 <4100> <41ff> 16640 <4200> <42ff> 16896 <4300> <43ff> 17152 <4400> <44ff> 17408 <4500> <45ff> 17664 <4600> <46ff> 17920 <4700> <47ff> 18176 <4800> <48ff> 18432 <4900> <499d> 18688 endcidrange endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF \ No newline at end of file
diff --git a/src/main/resources/Resources/cmap/Adobe-CNS1-B5pc b/src/main/resources/Resources/cmap/Adobe-CNS1-B5pc
new file mode 100644
index 0000000..80e0d09
--- /dev/null
+++ b/src/main/resources/Resources/cmap/Adobe-CNS1-B5pc
@@ -0,0 +1,368 @@
+%!PS-Adobe-3.0 Resource-CMap
+%%DocumentNeededResources: ProcSet (CIDInit)
+%%IncludeResource: ProcSet (CIDInit)
+%%BeginResource: CMap (Adobe-CNS1-B5pc)
+%%Title: (Adobe-CNS1-B5pc Adobe B5pc 0)
+%%Version: 4.002
+%%Copyright: -----------------------------------------------------------
+%%Copyright: Copyright 1990-1996 Adobe Systems Incorporated.
+%%Copyright: All Rights Reserved.
+%%Copyright:
+%%Copyright: Patents Pending
+%%Copyright:
+%%Copyright: NOTICE: All information contained herein is the property
+%%Copyright: of Adobe Systems Incorporated.
+%%Copyright:
+%%Copyright: Permission is granted for redistribution of this file
+%%Copyright: provided this copyright notice is maintained intact and
+%%Copyright: that the contents of this file are not altered in any
+%%Copyright: way from its original form.
+%%Copyright:
+%%Copyright: PostScript and Display PostScript are trademarks of
+%%Copyright: Adobe Systems Incorporated which may be registered in
+%%Copyright: certain jurisdictions.
+%%Copyright: -----------------------------------------------------------
+%%EndComments
+
+/CIDInit /ProcSet findresource begin
+
+12 dict begin
+
+begincmap
+
+/CIDSystemInfo 3 dict dup begin
+/Registry (Adobe) def
+/Ordering (Adobe_CNS1_B5pc) def
+/Supplement 0 def
+end def
+
+/CMapName /Adobe-CNS1-B5pc def
+
+/CMapVersion 4.002 def
+/CMapType 1 def
+
+/XUID [1 10 25335 1212] def
+
+/WMode 0 def
+
+1 begincodespacerange
+<0000> <FFFF>
+endcodespacerange
+
+1 beginbfrange
+<0000> <0000> <20>
+endbfrange
+
+% Adobe-CNS1
+% B5pc (Macintosh)
+100 beginbfrange
+<0001> <005F> <20>
+<0060> <0062> <FD>
+<0063> <007B> <A140>
+<0080> <00A1> <A15D>
+<00A2> <00F6> <A1A1>
+<00F7> <00F7> <A1F7>
+<00F8> <00F8> <A1F6>
+<00F9> <00FF> <A1F8>
+<0100> <013E> <A240>
+<013F> <019C> <A2A1>
+<019D> <01DB> <A340>
+<01DC> <01F6> <A3A1>
+<01F7> <01F9> <A3BD>
+<0232> <0252> <A3C0>
+<0253> <0291> <A440>
+<0292> <02EF> <A4A1>
+<02F0> <02FF> <A540>
+<0300> <032E> <A550>
+<032F> <038C> <A5A1>
+<038D> <03CB> <A640>
+<03CC> <03FF> <A6A1>
+<0400> <0429> <A6D5>
+<042A> <0468> <A740>
+<0469> <04C6> <A7A1>
+<04C7> <04FF> <A840>
+<0500> <0505> <A879>
+<0506> <0563> <A8A1>
+<0564> <05A2> <A940>
+<05A3> <05FF> <A9A1>
+<0600> <0600> <A9FE>
+<0601> <063F> <AA40>
+<0640> <069D> <AAA1>
+<069E> <06DC> <AB40>
+<06DD> <06FF> <ABA1>
+<0700> <073A> <ABC4>
+<073B> <0779> <AC40>
+<077A> <07D6> <ACA1>
+<07D7> <07FF> <AD40>
+<0800> <0815> <AD69>
+<0816> <0873> <ADA1>
+<0874> <08B2> <AE40>
+<08B3> <08FF> <AEA1>
+<0900> <0910> <AEEE>
+<0911> <094F> <AF40>
+<0950> <097E> <AFA1>
+<097F> <097F> <ACFE>
+<0980> <09AE> <AFD0>
+<09AF> <09ED> <B040>
+<09EE> <09FF> <B0A1>
+<0A00> <0A4B> <B0B3>
+<0A4C> <0A8A> <B140>
+<0A8B> <0AE8> <B1A1>
+<0AE9> <0AFF> <B240>
+<0B00> <0B27> <B257>
+<0B28> <0B85> <B2A1>
+<0B86> <0BC4> <B340>
+<0BC5> <0BFF> <B3A1>
+<0C00> <0C22> <B3DC>
+<0C23> <0C61> <B440>
+<0C62> <0CBF> <B4A1>
+<0CC0> <0CFE> <B540>
+<0CFF> <0CFF> <B5A1>
+<0D00> <0D5C> <B5A2>
+<0D5D> <0D9B> <B640>
+<0D9C> <0DF9> <B6A1>
+<0DFA> <0DFF> <B740>
+<0E00> <0E38> <B746>
+<0E39> <0E96> <B7A1>
+<0E97> <0ED5> <B840>
+<0ED6> <0EFF> <B8A1>
+<0F00> <0F33> <B8CB>
+<0F34> <0F72> <B940>
+<0F73> <0FD0> <B9A1>
+<0FD1> <0FFF> <BA40>
+<1000> <100F> <BA6F>
+<1010> <106D> <BAA1>
+<106E> <10AC> <BB40>
+<10AD> <10D3> <BBA1>
+<10D4> <10D4> <BE52>
+<10D5> <10FF> <BBC8>
+<1100> <110B> <BBF3>
+<110C> <114A> <BC40>
+<114B> <11A8> <BCA1>
+<11A9> <11E7> <BD40>
+<11E8> <11FF> <BDA1>
+<1200> <1245> <BDB9>
+<1246> <1257> <BE40>
+<1258> <1283> <BE53>
+<1284> <12E1> <BEA1>
+<12E2> <12FF> <BF40>
+<1300> <1320> <BF5E>
+<1321> <137E> <BFA1>
+<137F> <13BD> <C040>
+<13BE> <13FF> <C0A1>
+<1400> <141B> <C0E3>
+<141C> <145A> <C140>
+<145B> <1464> <C1A1>
+<1465> <1465> <C2CB>
+<1466> <14B9> <C1AB>
+<14BA> <14F8> <C240>
+endbfrange
+100 beginbfrange
+<14F9> <14FF> <C2A1>
+<1500> <1522> <C2A8>
+<1523> <1555> <C2CC>
+<1556> <1576> <C340>
+<1577> <1577> <C456>
+<1578> <1595> <C361>
+<1596> <15AD> <C3A1>
+<15AE> <15AE> <C3BA>
+<15AF> <15AF> <C3B9>
+<15B0> <15F3> <C3BB>
+<15F4> <15FF> <C440>
+<1600> <1609> <C44C>
+<160A> <1631> <C457>
+<1632> <168F> <C4A1>
+<1690> <16CE> <C540>
+<16CF> <16FF> <C5A1>
+<1700> <172C> <C5D2>
+<172D> <176B> <C640>
+<176C> <1775> <C940>
+<1776> <1796> <C94B>
+<1797> <1797> <C9BE>
+<1798> <17AA> <C96C>
+<17AB> <17C7> <C9A1>
+<17C8> <17F5> <C9BF>
+<17F6> <17F6> <CAF7>
+<17F7> <17FF> <C9ED>
+<1800> <1808> <C9F6>
+<1809> <1847> <CA40>
+<1848> <189D> <CAA1>
+<189E> <18A4> <CAF8>
+<18A5> <18E3> <CB40>
+<18E4> <18FF> <CBA1>
+<1900> <1941> <CBBD>
+<1942> <1980> <CC40>
+<1981> <19DE> <CCA1>
+<19DF> <19FF> <CD40>
+<1A00> <1A1D> <CD61>
+<1A1E> <1A7B> <CDA1>
+<1A7C> <1ABA> <CE40>
+<1ABB> <1AFF> <CEA1>
+<1B00> <1B18> <CEE6>
+<1B19> <1B57> <CF40>
+<1B58> <1BB5> <CFA1>
+<1BB6> <1BF4> <D040>
+<1BF5> <1BFF> <D0A1>
+<1C00> <1C52> <D0AC>
+<1C53> <1C91> <D140>
+<1C92> <1CEF> <D1A1>
+<1CF0> <1CFF> <D240>
+<1D00> <1D2E> <D250>
+<1D2F> <1D8C> <D2A1>
+<1D8D> <1DCB> <D340>
+<1DCC> <1DFF> <D3A1>
+<1E00> <1E29> <D3D5>
+<1E2A> <1E68> <D440>
+<1E69> <1EC6> <D4A1>
+<1EC7> <1EFF> <D540>
+<1F00> <1F05> <D579>
+<1F06> <1F63> <D5A1>
+<1F64> <1FA2> <D640>
+<1FA3> <1FCD> <D6A1>
+<1FCE> <1FCE> <DADF>
+<1FCF> <1FFF> <D6CD>
+<2000> <2000> <D6FE>
+<2001> <203A> <D740>
+<203B> <203E> <D77B>
+<203F> <209C> <D7A1>
+<209D> <20DB> <D840>
+<20DC> <20FF> <D8A1>
+<2100> <2139> <D8C5>
+<213A> <2178> <D940>
+<2179> <21D6> <D9A1>
+<21D7> <21FF> <DA40>
+<2200> <2215> <DA69>
+<2216> <2253> <DAA1>
+<2254> <2254> <D6CC>
+<2255> <2273> <DAE0>
+<2274> <22B2> <DB40>
+<22B3> <22B8> <DBA1>
+<22B9> <22B9> <D77A>
+<22BA> <22FF> <DBA7>
+<2300> <2311> <DBED>
+<2312> <2350> <DC40>
+<2351> <23AE> <DCA1>
+<23AF> <23ED> <DD40>
+<23EE> <23FF> <DDA1>
+<2400> <2448> <DDB3>
+<2449> <244A> <DDFD>
+<244B> <2489> <DE40>
+<248A> <24E7> <DEA1>
+<24E8> <24FF> <DF40>
+<2500> <2526> <DF58>
+<2527> <2584> <DFA1>
+<2585> <25C3> <E040>
+<25C4> <25FF> <E0A1>
+<2600> <2621> <E0DD>
+<2622> <2660> <E140>
+<2661> <26BE> <E1A1>
+<26BF> <26FD> <E240>
+<26FE> <26FF> <E2A1>
+endbfrange
+97 beginbfrange
+<2700> <275B> <E2A3>
+<275C> <279A> <E340>
+<279B> <27F8> <E3A1>
+<27F9> <27FF> <E440>
+<2800> <2837> <E447>
+<2838> <2895> <E4A1>
+<2896> <28D4> <E540>
+<28D5> <28FF> <E5A1>
+<2900> <2932> <E5CC>
+<2933> <2971> <E640>
+<2972> <29CF> <E6A1>
+<29D0> <29FF> <E740>
+<2A00> <2A0E> <E770>
+<2A0F> <2A6C> <E7A1>
+<2A6D> <2AAB> <E840>
+<2AAC> <2AAD> <E8A1>
+<2AAE> <2AAE> <EBF1>
+<2AAF> <2AFF> <E8A3>
+<2B00> <2B0A> <E8F4>
+<2B0B> <2B40> <E940>
+<2B41> <2B41> <ECDE>
+<2B42> <2B4A> <E976>
+<2B4B> <2BA8> <E9A1>
+<2BA9> <2BE7> <EA40>
+<2BE8> <2BFF> <EAA1>
+<2C00> <2C45> <EAB9>
+<2C46> <2C60> <EB40>
+<2C61> <2C61> <F0CB>
+<2C62> <2C85> <EB5B>
+<2C86> <2CD5> <EBA1>
+<2CD6> <2CE2> <EBF2>
+<2CE3> <2CFF> <EC40>
+<2D00> <2D21> <EC5D>
+<2D22> <2D5E> <ECA1>
+<2D5F> <2D7E> <ECDF>
+<2D7F> <2DBD> <ED40>
+<2DBE> <2DC6> <EDA1>
+<2DC7> <2DC7> <F056>
+<2DC8> <2DFF> <EDAA>
+<2E00> <2E1C> <EDE2>
+<2E1D> <2E5B> <EE40>
+<2E5C> <2EA5> <EEA1>
+<2EA6> <2EB8> <EEEC>
+<2EB9> <2EF7> <EF40>
+<2EF8> <2EFF> <EFA1>
+<2F00> <2F55> <EFA9>
+<2F56> <2F6B> <F040>
+<2F6C> <2F93> <F057>
+<2F94> <2FBD> <F0A1>
+<2FBE> <2FF0> <F0CC>
+<2FF1> <2FFF> <F140>
+<3000> <3013> <F14F>
+<3014> <3014> <EEEB>
+<3015> <301C> <F163>
+<301D> <302F> <F16C>
+<3030> <308D> <F1A1>
+<308E> <30B5> <F240>
+<30B6> <30CB> <F269>
+<30CC> <30ED> <F2A1>
+<30EE> <30EE> <F4B5>
+<30EF> <30FF> <F2C3>
+<3100> <312A> <F2D4>
+<312B> <315F> <F340>
+<3160> <3160> <F16B>
+<3161> <316A> <F375>
+<316B> <31C8> <F3A1>
+<31C9> <31EE> <F440>
+<31EF> <31EF> <F268>
+<31F0> <31FF> <F466>
+<3200> <3208> <F476>
+<3209> <321C> <F4A1>
+<321D> <3263> <F4B6>
+<3264> <3264> <F663>
+<3265> <3266> <F4FD>
+<3267> <32A5> <F540>
+<32A6> <32FF> <F5A1>
+<3300> <3303> <F5FB>
+<3304> <3326> <F640>
+<3327> <3341> <F664>
+<3342> <339F> <F6A1>
+<33A0> <33DE> <F740>
+<33DF> <33FF> <F7A1>
+<3400> <343C> <F7C2>
+<343D> <347B> <F840>
+<347C> <34D9> <F8A1>
+<34DA> <34FF> <F940>
+<3500> <3510> <F966>
+<3511> <3511> <F9C4>
+<3512> <3519> <F977>
+<351A> <353C> <F9A1>
+<353D> <353D> <F9C5>
+<353E> <3548> <F9C7>
+<3549> <3549> <F9C6>
+<354A> <354D> <F9D2>
+<354E> <354E> <A14B>
+<354F> <354F> <A1E3>
+<35AF> <35B2> <A159>
+endbfrange
+
+endcmap
+CMapName currentdict /CMap defineresource pop
+end
+end
+
+%%EndResource
+%%EOF
diff --git a/src/main/resources/Resources/cmap/Adobe-CNS1-H-CID b/src/main/resources/Resources/cmap/Adobe-CNS1-H-CID
new file mode 100644
index 0000000..0b6d673
--- /dev/null
+++ b/src/main/resources/Resources/cmap/Adobe-CNS1-H-CID
@@ -0,0 +1,91 @@
+%!PS-Adobe-3.0 Resource-CMap
+%%DocumentNeededResources: ProcSet (CIDInit)
+%%IncludeResource: ProcSet (CIDInit)
+%%BeginResource: CMap (Adobe-CNS1-H-CID)
+%%Title: (Adobe-CNS1-H-CID Adobe CNS1 0)
+%%Version: 2.000
+%%Copyright: -----------------------------------------------------------
+%%Copyright: Copyright 1990-2000 Adobe Systems Incorporated.
+%%Copyright: All Rights Reserved.
+%%Copyright:
+%%Copyright: Patents Pending
+%%Copyright:
+%%Copyright: NOTICE: All information contained herein is the property
+%%Copyright: of Adobe Systems Incorporated.
+%%Copyright:
+%%Copyright: Permission is granted for redistribution of this file
+%%Copyright: provided this copyright notice is maintained intact and
+%%Copyright: that the contents of this file are not altered in any
+%%Copyright: way from its original form.
+%%Copyright:
+%%Copyright: PostScript and Display PostScript are trademarks of
+%%Copyright: Adobe Systems Incorporated which may be registered in
+%%Copyright: certain jurisdictions.
+%%Copyright: -----------------------------------------------------------
+%%EndComments
+
+/CIDInit /ProcSet findresource begin
+
+12 dict begin
+
+begincmap
+
+/CIDSystemInfo 3 dict dup begin
+ /Registry (Adobe) def
+ /Ordering (Adobe_CNS1_H_CID) def
+ /Supplement 0 def
+end def
+
+/CMapName /Adobe-CNS1-H-CID def
+/CMapVersion 2.000 def
+/CMapType 1 def
+
+/UIDOffset 0 def
+
+/WMode 0 def
+
+1 begincodespacerange
+ <0000> <FFFF>
+endcodespacerange
+
+% Map all CIDs to font 0 - for Supplement 0
+0 usefont
+1 begincidrange
+<0000> <FFFF> 0
+endcidrange
+
+% Map CIDs 1 thru 95 to Ascii codes 0x20 - 0x7F in fontID 1.
+1 usefont
+1 beginbfrange
+<0001> <005F> <20>
+endbfrange
+
+% Map CIDs 14099 - 17407 to fontID 2 for Supplement 1.
+2 usefont
+2 begincidrange
+<3713> <37FF> 14099
+<3800> <43FF> 14336
+endcidrange
+
+% Map CIDs 17408 to 17600 to fontID 3 for Supplement 2.
+3 usefont
+1 begincidrange
+<4400> <44C0> 17408
+endcidrange
+
+% Map CIDs 17601 to fontID 4 for Supplement 3.
+% Also map CIDs upto 65535 to this fontID.
+4 usefont
+2 begincidrange
+<44C1> <44FF> 17601
+<4500> <FFFF> 17664
+endcidrange
+
+
+endcmap
+CMapName currentdict /CMap defineresource pop
+end
+end
+
+%%EndResource
+%%EOF
diff --git a/src/main/resources/Resources/cmap/Adobe-CNS1-H-Host b/src/main/resources/Resources/cmap/Adobe-CNS1-H-Host
new file mode 100644
index 0000000..494dcce
--- /dev/null
+++ b/src/main/resources/Resources/cmap/Adobe-CNS1-H-Host
@@ -0,0 +1,390 @@
+%!PS-Adobe-3.0 Resource-CMap
+%%DocumentNeededResources: ProcSet (CIDInit)
+%%IncludeResource: ProcSet (CIDInit)
+%%BeginResource: CMap (Adobe-CNS1-H-Host)
+%%Title: (Adobe-CNS1-H-Host Adobe ETen-B5 0)
+%%Version: 4.000
+%%Copyright: -----------------------------------------------------------
+%%Copyright: Copyright 1990-1996 Adobe Systems Incorporated.
+%%Copyright: All Rights Reserved.
+%%Copyright:
+%%Copyright: Patents Pending
+%%Copyright:
+%%Copyright: NOTICE: All information contained herein is the property
+%%Copyright: of Adobe Systems Incorporated.
+%%Copyright:
+%%Copyright: Permission is granted for redistribution of this file
+%%Copyright: provided this copyright notice is maintained intact and
+%%Copyright: that the contents of this file are not altered in any
+%%Copyright: way from its original form.
+%%Copyright:
+%%Copyright: PostScript and Display PostScript are trademarks of
+%%Copyright: Adobe Systems Incorporated which may be registered in
+%%Copyright: certain jurisdictions.
+%%Copyright: -----------------------------------------------------------
+%%EndComments
+
+/CIDInit /ProcSet findresource begin
+
+12 dict begin
+
+begincmap
+
+/CIDSystemInfo 3 dict dup begin
+/Registry (Adobe) def
+/Ordering (Adobe_CNS1_H_Host) def
+/Supplement 0 def
+end def
+
+/CMapName /Adobe-CNS1-H-Host def
+
+/CMapVersion 4.000 def
+/CMapType 1 def
+
+/WMode 0 def
+
+1 begincodespacerange
+<0000> <FFFF>
+endcodespacerange
+
+4 usefont
+% Subset Fonts
+1 begincidrange
+<0000> <FFFF> 0
+endcidrange
+
+1 usefont % Prop Roman
+1 beginbfrange
+<0001> <005F> <20>
+endbfrange
+
+2 usefont % Halfwidth Roman
+1 beginbfrange
+<3550> <35AE> <20>
+endbfrange
+
+0 usefont % Windows TrueType
+97 beginbfrange
+<0063> <007B> <A140>
+<0080> <00A1> <A15D>
+<00A2> <00F6> <A1A1>
+<00F7> <00F7> <A1F7>
+<00F8> <00F8> <A1F6>
+<00F9> <00FF> <A1F8>
+<0100> <0103> <A240>
+<0105> <013E> <A245>
+<013F> <019C> <A2A1>
+<019D> <01DB> <A340>
+<01DC> <01F6> <A3A1>
+<01F7> <01F9> <A3BD>
+<0253> <0291> <A440>
+<0292> <02EF> <A4A1>
+<02F0> <02FF> <A540>
+<0300> <032E> <A550>
+<032F> <038C> <A5A1>
+<038D> <03CB> <A640>
+<03CC> <03FF> <A6A1>
+<0400> <0429> <A6D5>
+<042A> <0468> <A740>
+<0469> <04C6> <A7A1>
+<04C7> <04FF> <A840>
+<0500> <0505> <A879>
+<0506> <0563> <A8A1>
+<0564> <05A2> <A940>
+<05A3> <05FF> <A9A1>
+<0600> <0600> <A9FE>
+<0601> <063F> <AA40>
+<0640> <069D> <AAA1>
+<069E> <06DC> <AB40>
+<06DD> <06FF> <ABA1>
+<0700> <073A> <ABC4>
+<073B> <0779> <AC40>
+<077A> <07D6> <ACA1>
+<07D7> <07FF> <AD40>
+<0800> <0815> <AD69>
+<0816> <0873> <ADA1>
+<0874> <08B2> <AE40>
+<08B3> <08FF> <AEA1>
+<0900> <0910> <AEEE>
+<0911> <094F> <AF40>
+<0950> <097E> <AFA1>
+<097F> <097F> <ACFE>
+<0980> <09AE> <AFD0>
+<09AF> <09ED> <B040>
+<09EE> <09FF> <B0A1>
+<0A00> <0A4B> <B0B3>
+<0A4C> <0A8A> <B140>
+<0A8B> <0AE8> <B1A1>
+<0AE9> <0AFF> <B240>
+<0B00> <0B27> <B257>
+<0B28> <0B85> <B2A1>
+<0B86> <0BC4> <B340>
+<0BC5> <0BFF> <B3A1>
+<0C00> <0C22> <B3DC>
+<0C23> <0C61> <B440>
+<0C62> <0CBF> <B4A1>
+<0CC0> <0CFE> <B540>
+<0CFF> <0CFF> <B5A1>
+<0D00> <0D5C> <B5A2>
+<0D5D> <0D9B> <B640>
+<0D9C> <0DF9> <B6A1>
+<0DFA> <0DFF> <B740>
+<0E00> <0E38> <B746>
+<0E39> <0E96> <B7A1>
+<0E97> <0ED5> <B840>
+<0ED6> <0EFF> <B8A1>
+<0F00> <0F33> <B8CB>
+<0F34> <0F72> <B940>
+<0F73> <0FD0> <B9A1>
+<0FD1> <0FFF> <BA40>
+<1000> <100F> <BA6F>
+<1010> <106D> <BAA1>
+<106E> <10AC> <BB40>
+<10AD> <10D3> <BBA1>
+<10D4> <10D4> <BE52>
+<10D5> <10FF> <BBC8>
+<1100> <110B> <BBF3>
+<110C> <114A> <BC40>
+<114B> <11A8> <BCA1>
+<11A9> <11E7> <BD40>
+<11E8> <11FF> <BDA1>
+<1200> <1245> <BDB9>
+<1246> <1257> <BE40>
+<1258> <1283> <BE53>
+<1284> <12E1> <BEA1>
+<12E2> <12FF> <BF40>
+<1300> <1320> <BF5E>
+<1321> <137E> <BFA1>
+<137F> <13BD> <C040>
+<13BE> <13FF> <C0A1>
+<1400> <141B> <C0E3>
+<141C> <145A> <C140>
+<145B> <1464> <C1A1>
+<1465> <1465> <C2CB>
+<1466> <14B9> <C1AB>
+endbfrange
+99 beginbfrange
+<14BA> <14F8> <C240>
+<14F9> <14FF> <C2A1>
+<1500> <1522> <C2A8>
+<1523> <1555> <C2CC>
+<1556> <1576> <C340>
+<1577> <1577> <C456>
+<1578> <1595> <C361>
+<1596> <15AD> <C3A1>
+<15AE> <15AE> <C3BA>
+<15AF> <15AF> <C3B9>
+<15B0> <15F3> <C3BB>
+<15F4> <15FF> <C440>
+<1600> <1609> <C44C>
+<160A> <1631> <C457>
+<1632> <168F> <C4A1>
+<1690> <16CE> <C540>
+<16CF> <16FF> <C5A1>
+<1700> <172C> <C5D2>
+<172D> <176B> <C640>
+<176C> <1775> <C940>
+<1776> <1793> <C94B>
+<1794> <1796> <C969>
+<1797> <1797> <C9BE>
+<1798> <17AA> <C96C>
+<17AB> <17C7> <C9A1>
+<17C8> <17F5> <C9BF>
+<17F6> <17F6> <CAF7>
+<17F7> <17FF> <C9ED>
+<1800> <1808> <C9F6>
+<1809> <1847> <CA40>
+<1848> <189D> <CAA1>
+<189E> <18A4> <CAF8>
+<18A5> <18E3> <CB40>
+<18E4> <18FF> <CBA1>
+<1900> <1941> <CBBD>
+<1942> <1980> <CC40>
+<1981> <19DE> <CCA1>
+<19DF> <19FF> <CD40>
+<1A00> <1A1D> <CD61>
+<1A1E> <1A7B> <CDA1>
+<1A7C> <1ABA> <CE40>
+<1ABB> <1AFF> <CEA1>
+<1B00> <1B18> <CEE6>
+<1B19> <1B57> <CF40>
+<1B58> <1BB5> <CFA1>
+<1BB6> <1BF4> <D040>
+<1BF5> <1BFF> <D0A1>
+<1C00> <1C52> <D0AC>
+<1C53> <1C91> <D140>
+<1C92> <1CEF> <D1A1>
+<1CF0> <1CFF> <D240>
+<1D00> <1D2E> <D250>
+<1D2F> <1D8C> <D2A1>
+<1D8D> <1DCB> <D340>
+<1DCC> <1DFF> <D3A1>
+<1E00> <1E29> <D3D5>
+<1E2A> <1E68> <D440>
+<1E69> <1EC6> <D4A1>
+<1EC7> <1EFF> <D540>
+<1F00> <1F05> <D579>
+<1F06> <1F63> <D5A1>
+<1F64> <1FA2> <D640>
+<1FA3> <1FCD> <D6A1>
+<1FCE> <1FCE> <DADF>
+<1FCF> <1FFF> <D6CD>
+<2000> <2000> <D6FE>
+<2001> <203A> <D740>
+<203B> <203E> <D77B>
+<203F> <209C> <D7A1>
+<209D> <20DB> <D840>
+<20DC> <20FF> <D8A1>
+<2100> <2139> <D8C5>
+<213A> <2178> <D940>
+<2179> <21D6> <D9A1>
+<21D7> <21FF> <DA40>
+<2200> <2215> <DA69>
+<2216> <2253> <DAA1>
+<2254> <2254> <D6CC>
+<2255> <2273> <DAE0>
+<2274> <22B2> <DB40>
+<22B3> <22B8> <DBA1>
+<22B9> <22B9> <D77A>
+<22BA> <22FF> <DBA7>
+<2300> <2311> <DBED>
+<2312> <2350> <DC40>
+<2351> <23AE> <DCA1>
+<23AF> <23ED> <DD40>
+<23EE> <23FF> <DDA1>
+<2400> <2448> <DDB3>
+<2449> <244A> <DDFD>
+<244B> <2489> <DE40>
+<248A> <24E7> <DEA1>
+<24E8> <24FF> <DF40>
+<2500> <2526> <DF58>
+<2527> <2584> <DFA1>
+<2585> <25C3> <E040>
+<25C4> <25FF> <E0A1>
+<2600> <2621> <E0DD>
+<2622> <2660> <E140>
+endbfrange
+98 beginbfrange
+<2661> <26BE> <E1A1>
+<26BF> <26FD> <E240>
+<26FE> <26FF> <E2A1>
+<2700> <275B> <E2A3>
+<275C> <279A> <E340>
+<279B> <27F8> <E3A1>
+<27F9> <27FF> <E440>
+<2800> <2837> <E447>
+<2838> <2895> <E4A1>
+<2896> <28D4> <E540>
+<28D5> <28FF> <E5A1>
+<2900> <2932> <E5CC>
+<2933> <2971> <E640>
+<2972> <29CF> <E6A1>
+<29D0> <29FF> <E740>
+<2A00> <2A0E> <E770>
+<2A0F> <2A6C> <E7A1>
+<2A6D> <2AAB> <E840>
+<2AAC> <2AAD> <E8A1>
+<2AAE> <2AAE> <EBF1>
+<2AAF> <2AFF> <E8A3>
+<2B00> <2B0A> <E8F4>
+<2B0B> <2B40> <E940>
+<2B41> <2B41> <ECDE>
+<2B42> <2B4A> <E976>
+<2B4B> <2BA8> <E9A1>
+<2BA9> <2BE7> <EA40>
+<2BE8> <2BFF> <EAA1>
+<2C00> <2C45> <EAB9>
+<2C46> <2C60> <EB40>
+<2C61> <2C61> <F0CB>
+<2C62> <2C85> <EB5B>
+<2C86> <2CD5> <EBA1>
+<2CD6> <2CE2> <EBF2>
+<2CE3> <2CFF> <EC40>
+<2D00> <2D21> <EC5D>
+<2D22> <2D5E> <ECA1>
+<2D5F> <2D7E> <ECDF>
+<2D7F> <2DBD> <ED40>
+<2DBE> <2DC6> <EDA1>
+<2DC7> <2DC7> <F056>
+<2DC8> <2DFF> <EDAA>
+<2E00> <2E1C> <EDE2>
+<2E1D> <2E5B> <EE40>
+<2E5C> <2EA5> <EEA1>
+<2EA6> <2EB8> <EEEC>
+<2EB9> <2EF7> <EF40>
+<2EF8> <2EFF> <EFA1>
+<2F00> <2F55> <EFA9>
+<2F56> <2F6B> <F040>
+<2F6C> <2F93> <F057>
+<2F94> <2FBD> <F0A1>
+<2FBE> <2FF0> <F0CC>
+<2FF1> <2FFF> <F140>
+<3000> <3013> <F14F>
+<3014> <3014> <EEEB>
+<3015> <301C> <F163>
+<301D> <302F> <F16C>
+<3030> <308D> <F1A1>
+<308E> <30B5> <F240>
+<30B6> <30CB> <F269>
+<30CC> <30ED> <F2A1>
+<30EE> <30EE> <F4B5>
+<30EF> <30FF> <F2C3>
+<3100> <312A> <F2D4>
+<312B> <315F> <F340>
+<3160> <3160> <F16B>
+<3161> <316A> <F375>
+<316B> <31C8> <F3A1>
+<31C9> <31EE> <F440>
+<31EF> <31EF> <F268>
+<31F0> <31FF> <F466>
+<3200> <3208> <F476>
+<3209> <321C> <F4A1>
+<321D> <3263> <F4B6>
+<3264> <3264> <F663>
+<3265> <3266> <F4FD>
+<3267> <32A5> <F540>
+<32A6> <32FF> <F5A1>
+<3300> <3303> <F5FB>
+<3304> <3326> <F640>
+<3327> <3341> <F664>
+<3342> <339F> <F6A1>
+<33A0> <33DE> <F740>
+<33DF> <33FF> <F7A1>
+<3400> <343C> <F7C2>
+<343D> <347B> <F840>
+<347C> <34D9> <F8A1>
+<34DA> <34FF> <F940>
+<3500> <3510> <F966>
+<3511> <3511> <F9C4>
+<3512> <3519> <F977>
+<351A> <353C> <F9A1>
+<353D> <353D> <F9C5>
+<353E> <3548> <F9C7>
+<3549> <3549> <F9C6>
+<354A> <354D> <F9D2>
+<35AF> <35B2> <A159>
+endbfrange
+
+3 usefont % Vertical Fonts
+12 beginbfrange
+<0082> <0083> <A15D>
+<0086> <0087> <A161>
+<008A> <008B> <A165>
+<008E> <008F> <A169>
+<0092> <0093> <A16D>
+<0096> <0097> <A171>
+<009A> <009B> <A175>
+<009E> <009F> <A179>
+<354E> <354E> <A14B>
+<354F> <354F> <A1E3>
+<35AF> <35AF> <A15A>
+<35B1> <35B1> <A15C>
+endbfrange
+
+endcmap
+CMapName currentdict /CMap defineresource pop
+end
+end
+
+%%EndResource
+%%EOF
diff --git a/src/main/resources/Resources/cmap/Adobe-CNS1-H-Mac b/src/main/resources/Resources/cmap/Adobe-CNS1-H-Mac
new file mode 100644
index 0000000..4516a70
--- /dev/null
+++ b/src/main/resources/Resources/cmap/Adobe-CNS1-H-Mac
@@ -0,0 +1,366 @@
+%!PS-Adobe-3.0 Resource-CMap
+%%DocumentNeededResources: ProcSet (CIDInit)
+%%IncludeResource: ProcSet (CIDInit)
+%%BeginResource: CMap (Adobe-CNS1-H-Mac)
+%%Title: (Adobe-CNS1-H-Mac Adobe B5pc 0)
+%%Version: 1.000
+%%Copyright: -----------------------------------------------------------
+%%Copyright: Copyright 1990-1998 Adobe Systems Incorporated.
+%%Copyright: All Rights Reserved.
+%%Copyright:
+%%Copyright: Patents Pending
+%%Copyright:
+%%Copyright: NOTICE: All information contained herein is the property
+%%Copyright: of Adobe Systems Incorporated.
+%%Copyright:
+%%Copyright: Permission is granted for redistribution of this file
+%%Copyright: provided this copyright notice is maintained intact and
+%%Copyright: that the contents of this file are not altered in any
+%%Copyright: way from its original form.
+%%Copyright:
+%%Copyright: PostScript and Display PostScript are trademarks of
+%%Copyright: Adobe Systems Incorporated which may be registered in
+%%Copyright: certain jurisdictions.
+%%Copyright: -----------------------------------------------------------
+%%EndComments
+
+/CIDInit /ProcSet findresource begin
+
+12 dict begin
+
+begincmap
+
+/CIDSystemInfo 3 dict dup begin
+/Registry (Adobe) def
+/Ordering (Adobe_CNS1_H_Mac) def
+/Supplement 0 def
+end def
+
+/CMapName /Adobe-CNS1-H-Mac def
+
+/CMapVersion 1.000 def
+/CMapType 1 def
+
+/WMode 0 def
+
+1 begincodespacerange
+<0000> <FFFF>
+endcodespacerange
+
+2 usefont % Subset Font
+1 begincidrange
+<0000> <FFFF> 0
+endcidrange
+
+1 usefont % Prop Roman
+1 beginbfrange
+<0001> <005F> <20>
+endbfrange
+
+0 usefont % Host Font
+100 beginbfrange
+<0063> <007B> <A140>
+<0080> <00A1> <A15D>
+<00A2> <00F6> <A1A1>
+<00F7> <00F7> <A1F7>
+<00F8> <00F8> <A1F6>
+<00F9> <00FF> <A1F8>
+<0100> <013E> <A240>
+<013F> <019C> <A2A1>
+<019D> <01DB> <A340>
+<01DC> <01F6> <A3A1>
+<01F7> <01F9> <A3BD>
+<0253> <0291> <A440>
+<0292> <02EF> <A4A1>
+<02F0> <02FF> <A540>
+<0300> <032E> <A550>
+<032F> <038C> <A5A1>
+<038D> <03CB> <A640>
+<03CC> <03FF> <A6A1>
+<0400> <0429> <A6D5>
+<042A> <0468> <A740>
+<0469> <04C6> <A7A1>
+<04C7> <04FF> <A840>
+<0500> <0505> <A879>
+<0506> <0563> <A8A1>
+<0564> <05A2> <A940>
+<05A3> <05FF> <A9A1>
+<0600> <0600> <A9FE>
+<0601> <063F> <AA40>
+<0640> <069D> <AAA1>
+<069E> <06DC> <AB40>
+<06DD> <06FF> <ABA1>
+<0700> <073A> <ABC4>
+<073B> <0779> <AC40>
+<077A> <07D6> <ACA1>
+<07D7> <07FF> <AD40>
+<0800> <0815> <AD69>
+<0816> <0873> <ADA1>
+<0874> <08B2> <AE40>
+<08B3> <08FF> <AEA1>
+<0900> <0910> <AEEE>
+<0911> <094F> <AF40>
+<0950> <097E> <AFA1>
+<097F> <097F> <ACFE>
+<0980> <09AE> <AFD0>
+<09AF> <09ED> <B040>
+<09EE> <09FF> <B0A1>
+<0A00> <0A4B> <B0B3>
+<0A4C> <0A8A> <B140>
+<0A8B> <0AE8> <B1A1>
+<0AE9> <0AFF> <B240>
+<0B00> <0B27> <B257>
+<0B28> <0B85> <B2A1>
+<0B86> <0BC4> <B340>
+<0BC5> <0BFF> <B3A1>
+<0C00> <0C22> <B3DC>
+<0C23> <0C61> <B440>
+<0C62> <0CBF> <B4A1>
+<0CC0> <0CFE> <B540>
+<0CFF> <0CFF> <B5A1>
+<0D00> <0D5C> <B5A2>
+<0D5D> <0D9B> <B640>
+<0D9C> <0DF9> <B6A1>
+<0DFA> <0DFF> <B740>
+<0E00> <0E38> <B746>
+<0E39> <0E96> <B7A1>
+<0E97> <0ED5> <B840>
+<0ED6> <0EFF> <B8A1>
+<0F00> <0F33> <B8CB>
+<0F34> <0F72> <B940>
+<0F73> <0FD0> <B9A1>
+<0FD1> <0FFF> <BA40>
+<1000> <100F> <BA6F>
+<1010> <106D> <BAA1>
+<106E> <10AC> <BB40>
+<10AD> <10D3> <BBA1>
+<10D4> <10D4> <BE52>
+<10D5> <10FF> <BBC8>
+<1100> <110B> <BBF3>
+<110C> <114A> <BC40>
+<114B> <11A8> <BCA1>
+<11A9> <11E7> <BD40>
+<11E8> <11FF> <BDA1>
+<1200> <1245> <BDB9>
+<1246> <1257> <BE40>
+<1258> <1283> <BE53>
+<1284> <12E1> <BEA1>
+<12E2> <12FF> <BF40>
+<1300> <1320> <BF5E>
+<1321> <137E> <BFA1>
+<137F> <13BD> <C040>
+<13BE> <13FF> <C0A1>
+<1400> <141B> <C0E3>
+<141C> <145A> <C140>
+<145B> <1464> <C1A1>
+<1465> <1465> <C2CB>
+<1466> <14B9> <C1AB>
+<14BA> <14F8> <C240>
+<14F9> <14FF> <C2A1>
+<1500> <1522> <C2A8>
+<1523> <1555> <C2CC>
+endbfrange
+100 beginbfrange
+<1556> <1576> <C340>
+<1577> <1577> <C456>
+<1578> <1595> <C361>
+<1596> <15AD> <C3A1>
+<15AE> <15AE> <C3BA>
+<15AF> <15AF> <C3B9>
+<15B0> <15F3> <C3BB>
+<15F4> <15FF> <C440>
+<1600> <1609> <C44C>
+<160A> <1631> <C457>
+<1632> <168F> <C4A1>
+<1690> <16CE> <C540>
+<16CF> <16FF> <C5A1>
+<1700> <172C> <C5D2>
+<172D> <176B> <C640>
+<176C> <1775> <C940>
+<1776> <1796> <C94B>
+<1797> <1797> <C9BE>
+<1798> <17AA> <C96C>
+<17AB> <17C7> <C9A1>
+<17C8> <17F5> <C9BF>
+<17F6> <17F6> <CAF7>
+<17F7> <17FF> <C9ED>
+<1800> <1808> <C9F6>
+<1809> <1847> <CA40>
+<1848> <189D> <CAA1>
+<189E> <18A4> <CAF8>
+<18A5> <18E3> <CB40>
+<18E4> <18FF> <CBA1>
+<1900> <1941> <CBBD>
+<1942> <1980> <CC40>
+<1981> <19DE> <CCA1>
+<19DF> <19FF> <CD40>
+<1A00> <1A1D> <CD61>
+<1A1E> <1A7B> <CDA1>
+<1A7C> <1ABA> <CE40>
+<1ABB> <1AFF> <CEA1>
+<1B00> <1B18> <CEE6>
+<1B19> <1B57> <CF40>
+<1B58> <1BB5> <CFA1>
+<1BB6> <1BF4> <D040>
+<1BF5> <1BFF> <D0A1>
+<1C00> <1C52> <D0AC>
+<1C53> <1C91> <D140>
+<1C92> <1CEF> <D1A1>
+<1CF0> <1CFF> <D240>
+<1D00> <1D2E> <D250>
+<1D2F> <1D8C> <D2A1>
+<1D8D> <1DCB> <D340>
+<1DCC> <1DFF> <D3A1>
+<1E00> <1E29> <D3D5>
+<1E2A> <1E68> <D440>
+<1E69> <1EC6> <D4A1>
+<1EC7> <1EFF> <D540>
+<1F00> <1F05> <D579>
+<1F06> <1F63> <D5A1>
+<1F64> <1FA2> <D640>
+<1FA3> <1FCD> <D6A1>
+<1FCE> <1FCE> <DADF>
+<1FCF> <1FFF> <D6CD>
+<2000> <2000> <D6FE>
+<2001> <203A> <D740>
+<203B> <203E> <D77B>
+<203F> <209C> <D7A1>
+<209D> <20DB> <D840>
+<20DC> <20FF> <D8A1>
+<2100> <2139> <D8C5>
+<213A> <2178> <D940>
+<2179> <21D6> <D9A1>
+<21D7> <21FF> <DA40>
+<2200> <2215> <DA69>
+<2216> <2253> <DAA1>
+<2254> <2254> <D6CC>
+<2255> <2273> <DAE0>
+<2274> <22B2> <DB40>
+<22B3> <22B8> <DBA1>
+<22B9> <22B9> <D77A>
+<22BA> <22FF> <DBA7>
+<2300> <2311> <DBED>
+<2312> <2350> <DC40>
+<2351> <23AE> <DCA1>
+<23AF> <23ED> <DD40>
+<23EE> <23FF> <DDA1>
+<2400> <2448> <DDB3>
+<2449> <244A> <DDFD>
+<244B> <2489> <DE40>
+<248A> <24E7> <DEA1>
+<24E8> <24FF> <DF40>
+<2500> <2526> <DF58>
+<2527> <2584> <DFA1>
+<2585> <25C3> <E040>
+<25C4> <25FF> <E0A1>
+<2600> <2621> <E0DD>
+<2622> <2660> <E140>
+<2661> <26BE> <E1A1>
+<26BF> <26FD> <E240>
+<26FE> <26FF> <E2A1>
+<2700> <275B> <E2A3>
+<275C> <279A> <E340>
+<279B> <27F8> <E3A1>
+endbfrange
+92 beginbfrange
+<27F9> <27FF> <E440>
+<2800> <2837> <E447>
+<2838> <2895> <E4A1>
+<2896> <28D4> <E540>
+<28D5> <28FF> <E5A1>
+<2900> <2932> <E5CC>
+<2933> <2971> <E640>
+<2972> <29CF> <E6A1>
+<29D0> <29FF> <E740>
+<2A00> <2A0E> <E770>
+<2A0F> <2A6C> <E7A1>
+<2A6D> <2AAB> <E840>
+<2AAC> <2AAD> <E8A1>
+<2AAE> <2AAE> <EBF1>
+<2AAF> <2AFF> <E8A3>
+<2B00> <2B0A> <E8F4>
+<2B0B> <2B40> <E940>
+<2B41> <2B41> <ECDE>
+<2B42> <2B4A> <E976>
+<2B4B> <2BA8> <E9A1>
+<2BA9> <2BE7> <EA40>
+<2BE8> <2BFF> <EAA1>
+<2C00> <2C45> <EAB9>
+<2C46> <2C60> <EB40>
+<2C61> <2C61> <F0CB>
+<2C62> <2C85> <EB5B>
+<2C86> <2CD5> <EBA1>
+<2CD6> <2CE2> <EBF2>
+<2CE3> <2CFF> <EC40>
+<2D00> <2D21> <EC5D>
+<2D22> <2D5E> <ECA1>
+<2D5F> <2D7E> <ECDF>
+<2D7F> <2DBD> <ED40>
+<2DBE> <2DC6> <EDA1>
+<2DC7> <2DC7> <F056>
+<2DC8> <2DFF> <EDAA>
+<2E00> <2E1C> <EDE2>
+<2E1D> <2E5B> <EE40>
+<2E5C> <2EA5> <EEA1>
+<2EA6> <2EB8> <EEEC>
+<2EB9> <2EF7> <EF40>
+<2EF8> <2EFF> <EFA1>
+<2F00> <2F55> <EFA9>
+<2F56> <2F6B> <F040>
+<2F6C> <2F93> <F057>
+<2F94> <2FBD> <F0A1>
+<2FBE> <2FF0> <F0CC>
+<2FF1> <2FFF> <F140>
+<3000> <3013> <F14F>
+<3014> <3014> <EEEB>
+<3015> <301C> <F163>
+<301D> <302F> <F16C>
+<3030> <308D> <F1A1>
+<308E> <30B5> <F240>
+<30B6> <30CB> <F269>
+<30CC> <30ED> <F2A1>
+<30EE> <30EE> <F4B5>
+<30EF> <30FF> <F2C3>
+<3100> <312A> <F2D4>
+<312B> <315F> <F340>
+<3160> <3160> <F16B>
+<3161> <316A> <F375>
+<316B> <31C8> <F3A1>
+<31C9> <31EE> <F440>
+<31EF> <31EF> <F268>
+<31F0> <31FF> <F466>
+<3200> <3208> <F476>
+<3209> <321C> <F4A1>
+<321D> <3263> <F4B6>
+<3264> <3264> <F663>
+<3265> <3266> <F4FD>
+<3267> <32A5> <F540>
+<32A6> <32FF> <F5A1>
+<3300> <3303> <F5FB>
+<3304> <3326> <F640>
+<3327> <3341> <F664>
+<3342> <339F> <F6A1>
+<33A0> <33DE> <F740>
+<33DF> <33FF> <F7A1>
+<3400> <343C> <F7C2>
+<343D> <347B> <F840>
+<347C> <34D9> <F8A1>
+<34DA> <34FF> <F940>
+<3500> <3510> <F966>
+<3511> <3511> <F9C4>
+<3512> <3519> <F977>
+<351A> <353C> <F9A1>
+<353D> <353D> <F9C5>
+<353E> <3548> <F9C7>
+<3549> <3549> <F9C6>
+<354A> <354D> <F9D2>
+<35AF> <35B2> <A159>
+endbfrange
+
+endcmap
+CMapName currentdict /CMap defineresource pop
+end
+end
+
+%%EndResource
+%%EOF
diff --git a/src/main/resources/Resources/cmap/Adobe-CNS1-UCS2 b/src/main/resources/Resources/cmap/Adobe-CNS1-UCS2
new file mode 100644
index 0000000..2185acc
--- /dev/null
+++ b/src/main/resources/Resources/cmap/Adobe-CNS1-UCS2
@@ -0,0 +1 @@
+%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%IncludeResource: ProcSet (CIDInit) %%BeginResource: CMap (Adobe-CNS1-UCS2) %%Title: (Adobe-CNS1-UCS2 Adobe CNS1 3) %%Version: 12.001 %%Copyright: ----------------------------------------------------------- %%Copyright: Copyright 1990-2001 Adobe Systems Incorporated. %%Copyright: All Rights Reserved. %%Copyright: %%Copyright: Patents Pending %%Copyright: %%Copyright: NOTICE: All information contained herein is the property %%Copyright: of Adobe Systems Incorporated. %%Copyright: %%Copyright: Permission is granted for redistribution of this file %%Copyright: provided this copyright notice is maintained intact and %%Copyright: that the contents of this file are not altered in any %%Copyright: way from its original form. %%Copyright: %%Copyright: PostScript and Display PostScript are trademarks of %%Copyright: Adobe Systems Incorporated which may be registered in %%Copyright: certain jurisdictions. %%Copyright: ----------------------------------------------------------- %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo 3 dict dup begin /Registry (Adobe) def /Ordering (Adobe_CNS1_UCS2) def /Supplement 3 def end def /CMapName /Adobe-CNS1-UCS2 def /CMapVersion 12.001 def /CMapType 1 def /XUID [1 10 25335 1212] def /WMode 0 def 1 begincodespacerange <0000> <FFFF> endcodespacerange 100 beginbfchar <0000> <FFFD> <0060> <00A9> <0061> <2122> <0062> <2026> <0063> <3000> <0064> <FF0C> <0067> <FF0E> <0068> <2027> <0069> <FF1B> <006A> <FF1A> <006B> <FF1F> <006C> <FF01> <006D> <FE30> <006E> <22EF> <006F> <2025> <0073> <00B7> <0078> <FF5C> <0079> <2013> <007A> <FE31> <007B> <2014> <0084> <FF5B> <0085> <FF5D> <00AC> <2035> <00AD> <2032> <00AE> <FF03> <00AF> <FF06> <00B0> <FF0A> <00B1> <203B> <00B2> <00A7> <00B3> <3003> <00B4> <25CB> <00B5> <25CF> <00B6> <25B3> <00B7> <25B2> <00B8> <25CE> <00B9> <2606> <00BA> <2605> <00BB> <25C7> <00BC> <25C6> <00BD> <25A1> <00BE> <25A0> <00BF> <25BD> <00C0> <25BC> <00C1> <32A3> <00C2> <2105> <00C3> <203E> <00C4> <203E> <00C5> <FF3F> <00C6> <FF3F> <00D0> <FF0B> <00D1> <FF0D> <00D2> <00D7> <00D3> <00F7> <00D4> <00B1> <00D5> <221A> <00D6> <FF1C> <00D7> <FF1E> <00D8> <FF1D> <00DB> <2260> <00DC> <221E> <00DD> <2252> <00DE> <2261> <00E4> <223C> <00E7> <22A5> <00E8> <2220> <00E9> <221F> <00EA> <22BF> <00EB> <33D2> <00EC> <33D1> <00ED> <222B> <00EE> <222E> <00EF> <2235> <00F0> <2234> <00F1> <2640> <00F2> <2642> <00F3> <2295> <00F4> <2609> <00F5> <2191> <00F6> <2193> <00F7> <2192> <00F8> <2190> <00FB> <2199> <00FC> <2198> <00FD> <2225> <00FE> <2223> <00FF> <FF0F> <0100> <FF3C> <0101> <FF0F> <0102> <FF3C> <0103> <FF04> <0104> <00A5> <0105> <3012> <0108> <FF05> <0109> <FF20> <010A> <2103> <010B> <2109> <010F> <33D5> <0113> <33CE> <0114> <33A1> <0117> <33C4> endbfchar 100 beginbfchar <0118> <00B0> <0119> <5159> <011A> <515B> <011B> <515E> <011C> <515D> <011D> <5161> <011E> <5163> <011F> <55E7> <0120> <74E9> <0121> <7CCE> <012A> <258F> <012B> <258E> <012C> <258D> <012D> <258C> <012E> <258B> <012F> <258A> <0130> <2589> <0131> <253C> <0132> <2534> <0133> <252C> <0134> <2524> <0135> <251C> <0136> <2594> <0137> <2500> <0138> <2502> <0139> <2595> <013A> <250C> <013B> <2510> <013C> <2514> <013D> <2518> <0140> <2570> <0141> <256F> <0142> <2550> <0143> <255E> <0144> <256A> <0145> <2561> <0148> <25E5> <0149> <25E4> <016A> <5341> <01F6> <02D9> <01F7> <02CA> <01F8> <02C7> <01F9> <02CB> <0218> <4E28> <0219> <4E36> <021A> <4E3F> <021B> <4E85> <021C> <4EA0> <021D> <5182> <021E> <5196> <021F> <51AB> <0220> <52F9> <0221> <5338> <0222> <5369> <0223> <53B6> <0224> <5902> <0225> <5B80> <0226> <5DDB> <0227> <5E7A> <0228> <5E7F> <0229> <5EF4> <022A> <5F50> <022B> <5F61> <022C> <6534> <022D> <65E0> <022E> <7592> <022F> <7676> <0230> <8FB5> <0231> <96B6> <0252> <2421> <0253> <4E00> <0254> <4E59> <0255> <4E01> <0256> <4E03> <0257> <4E43> <0258> <4E5D> <0259> <4E86> <025A> <4E8C> <025B> <4EBA> <025C> <513F> <025D> <5165> <025E> <516B> <025F> <51E0> <0262> <529B> <0263> <5315> <0264> <5341> <0265> <535C> <0266> <53C8> <0267> <4E09> <0268> <4E0B> <0269> <4E08> <026A> <4E0A> <026B> <4E2B> <026C> <4E38> <026D> <51E1> <026E> <4E45> <026F> <4E48> <0270> <4E5F> <0271> <4E5E> <0272> <4E8E> endbfchar 100 beginbfchar <0273> <4EA1> <0274> <5140> <0275> <5203> <0276> <52FA> <0277> <5343> <0278> <53C9> <0279> <53E3> <027A> <571F> <027B> <58EB> <027C> <5915> <027D> <5927> <027E> <5973> <0281> <5B53> <0282> <5BF8> <0283> <5C0F> <0284> <5C22> <0285> <5C38> <0286> <5C71> <0287> <5DDD> <0288> <5DE5> <028C> <5DFE> <028D> <5E72> <028E> <5EFE> <028F> <5F0B> <0290> <5F13> <0291> <624D> <0292> <4E11> <0293> <4E10> <0294> <4E0D> <0295> <4E2D> <0296> <4E30> <0297> <4E39> <0298> <4E4B> <0299> <5C39> <029A> <4E88> <029B> <4E91> <029C> <4E95> <029D> <4E92> <029E> <4E94> <029F> <4EA2> <02A0> <4EC1> <02A1> <4EC0> <02A2> <4EC3> <02A5> <4ECD> <02A8> <4EC4> <02A9> <5143> <02AA> <5141> <02AB> <5167> <02AE> <516C> <02AF> <5197> <02B0> <51F6> <02B4> <52FB> <02B7> <5316> <02B8> <5339> <02B9> <5348> <02BA> <5347> <02BB> <5345> <02BC> <535E> <02BD> <5384> <02BE> <53CB> <02BF> <53CA> <02C0> <53CD> <02C1> <58EC> <02C2> <5929> <02C3> <592B> <02C4> <592A> <02C5> <592D> <02C6> <5B54> <02C7> <5C11> <02C8> <5C24> <02C9> <5C3A> <02CA> <5C6F> <02CB> <5DF4> <02CC> <5E7B> <02CD> <5EFF> <02D0> <5FC3> <02D1> <6208> <02D2> <6236> <02D3> <624B> <02D4> <624E> <02D5> <652F> <02D6> <6587> <02D7> <6597> <02D8> <65A4> <02D9> <65B9> <02DA> <65E5> <02DB> <66F0> <02DC> <6708> <02DD> <6728> <02DE> <6B20> <02DF> <6B62> <02E0> <6B79> <02E1> <6BCB> <02E2> <6BD4> <02E3> <6BDB> <02E4> <6C0F> <02E5> <6C34> <02E6> <706B> <02E7> <722A> <02E8> <7236> endbfchar 100 beginbfchar <02E9> <723B> <02EA> <7247> <02EB> <7259> <02EC> <725B> <02ED> <72AC> <02EE> <738B> <02EF> <4E19> <02F0> <4E16> <02F1> <4E15> <02F2> <4E14> <02F3> <4E18> <02F4> <4E3B> <02F5> <4E4D> <02F6> <4E4F> <02F7> <4E4E> <02F8> <4EE5> <02F9> <4ED8> <0300> <4ED9> <0301> <4EDE> <0302> <5145> <0303> <5144> <0306> <51AC> <0309> <51F8> <030A> <520A> <030B> <52A0> <030C> <529F> <030F> <5317> <0310> <531D> <0311> <4EDF> <0312> <534A> <0313> <5349> <0314> <5361> <0315> <5360> <0316> <536F> <0317> <536E> <0318> <53BB> <0319> <53EF> <031A> <53E4> <031B> <53F3> <031C> <53EC> <031D> <53EE> <031E> <53E9> <031F> <53E8> <0320> <53FC> <0321> <53F8> <0322> <53F5> <0323> <53EB> <0324> <53E6> <0325> <53EA> <0326> <53F2> <0327> <53F1> <0328> <53F0> <0329> <53E5> <032A> <53ED> <032B> <53FB> <032C> <56DB> <032D> <56DA> <032E> <5916> <032F> <592E> <0330> <5931> <0331> <5974> <0332> <5976> <0333> <5B55> <0334> <5B83> <0335> <5C3C> <0336> <5DE8> <0337> <5DE7> <0338> <5DE6> <033B> <5E73> <033C> <5E7C> <033D> <5F01> <033E> <5F18> <033F> <5F17> <0340> <5FC5> <0341> <620A> <0344> <6252> <0345> <6251> <0346> <65A5> <0347> <65E6> <0348> <672E> <0349> <672C> <034C> <672D> <034D> <6B63> <034E> <6BCD> <034F> <6C11> <0350> <6C10> <0351> <6C38> <0352> <6C41> <0353> <6C40> <0354> <6C3E> <0355> <72AF> <0356> <7384> <0357> <7389> <0358> <74DC> <0359> <74E6> <035A> <7518> <035B> <751F> <0362> <758B> <0363> <767D> <0364> <76AE> endbfchar 100 beginbfchar <0365> <76BF> <0366> <76EE> <0367> <77DB> <0368> <77E2> <0369> <77F3> <036A> <793A> <036B> <79BE> <036C> <7A74> <036D> <7ACB> <0372> <4E69> <0373> <4E99> <0374> <4EA4> <0375> <4EA6> <0376> <4EA5> <0377> <4EFF> <0378> <4F09> <0379> <4F19> <037A> <4F0A> <037B> <4F15> <037C> <4F0D> <037F> <4F0F> <0380> <4EF2> <0381> <4EF6> <0382> <4EFB> <0383> <4EF0> <0384> <4EF3> <0385> <4EFD> <0386> <4F01> <0387> <4F0B> <0388> <5149> <0389> <5147> <038A> <5146> <038B> <5148> <038C> <5168> <038D> <5171> <038E> <518D> <038F> <51B0> <0390> <5217> <0393> <520E> <0394> <5216> <0395> <52A3> <0396> <5308> <0397> <5321> <0398> <5320> <039B> <5409> <039C> <540F> <039D> <540C> <039E> <540A> <039F> <5410> <03A0> <5401> <03A1> <540B> <03A2> <5404> <03A3> <5411> <03A4> <540D> <03A5> <5408> <03A6> <5403> <03A7> <540E> <03A8> <5406> <03A9> <5412> <03AA> <56E0> <03AB> <56DE> <03AC> <56DD> <03AD> <5733> <03AE> <5730> <03AF> <5728> <03B0> <572D> <03B1> <572C> <03B2> <572F> <03B3> <5729> <03B8> <5984> <03B9> <5978> <03BA> <5983> <03BB> <597D> <03BC> <5979> <03BD> <5982> <03BE> <5981> <03C3> <5B85> <03C4> <5B89> <03C5> <5BFA> <03C6> <5C16> <03C7> <5C79> <03C8> <5DDE> <03C9> <5E06> <03CA> <5E76> <03CB> <5E74> <03CC> <5F0F> <03CD> <5F1B> <03CE> <5FD9> <03CF> <5FD6> <03D0> <620E> <03D3> <6210> <03D4> <6263> <03D5> <625B> <03D6> <6258> <03D7> <6536> <03D8> <65E9> <03D9> <65E8> <03DE> <6709> <03DF> <673D> <03E0> <6734> endbfchar 100 beginbfchar <03E1> <6731> <03E2> <6735> <03E3> <6B21> <03E4> <6B64> <03E5> <6B7B> <03E6> <6C16> <03E7> <6C5D> <03E8> <6C57> <03E9> <6C59> <03EC> <6C50> <03ED> <6C55> <03EE> <6C61> <03EF> <6C5B> <03F2> <7070> <03F3> <725F> <03F4> <725D> <03F5> <767E> <03F6> <7AF9> <03F7> <7C73> <03F8> <7CF8> <03F9> <7F36> <03FA> <7F8A> <03FB> <7FBD> <03FC> <8001> <03FD> <8003> <03FE> <800C> <03FF> <8012> <0400> <8033> <0401> <807F> <0402> <8089> <0405> <81E3> <0406> <81EA> <0407> <81F3> <0408> <81FC> <0409> <820C> <040A> <821B> <040B> <821F> <040C> <826E> <040D> <8272> <040E> <827E> <040F> <866B> <0410> <8840> <0411> <884C> <0412> <8863> <0413> <897F> <0414> <9621> <0415> <4E32> <0416> <4EA8> <0417> <4F4D> <0418> <4F4F> <0419> <4F47> <041A> <4F57> <041B> <4F5E> <041C> <4F34> <041D> <4F5B> <041E> <4F55> <041F> <4F30> <0422> <4F3D> <0423> <4F3A> <0424> <4F38> <0425> <4F43> <0426> <4F54> <0427> <4F3C> <0428> <4F46> <0429> <4F63> <042A> <4F5C> <042B> <4F60> <042C> <4F2F> <042D> <4F4E> <042E> <4F36> <042F> <4F59> <0430> <4F5D> <0431> <4F48> <0432> <4F5A> <0433> <514C> <0434> <514B> <0435> <514D> <0436> <5175> <0439> <5225> <043A> <5224> <043D> <5228> <043E> <52AB> <0441> <52AC> <0442> <5323> <0443> <5373> <0444> <5375> <0445> <541D> <0446> <542D> <0447> <541E> <0448> <543E> <0449> <5426> <044A> <544E> <044B> <5427> <044C> <5446> <044D> <5443> <044E> <5433> <044F> <5448> <0450> <5442> <0451> <541B> <0452> <5429> endbfchar 100 beginbfchar <0453> <544A> <0454> <5439> <0455> <543B> <0456> <5438> <0457> <542E> <045A> <5420> <045B> <543C> <045C> <5440> <045D> <5431> <045E> <542B> <045F> <541F> <0460> <542C> <0461> <56EA> <0462> <56F0> <0463> <56E4> <0464> <56EB> <0465> <574A> <0466> <5751> <0467> <5740> <0468> <574D> <0469> <5747> <046A> <574E> <046B> <573E> <046C> <5750> <046D> <574F> <046E> <573B> <046F> <58EF> <0470> <593E> <0471> <599D> <0472> <5992> <0473> <59A8> <0474> <599E> <0475> <59A3> <0476> <5999> <0477> <5996> <0478> <598D> <0479> <59A4> <047A> <5993> <047B> <598A> <047C> <59A5> <047D> <5B5D> <047E> <5B5C> <0481> <5B8C> <0482> <5B8B> <0483> <5B8F> <0484> <5C2C> <0487> <5C3F> <0488> <5C3E> <048B> <5C94> <048C> <5C8C> <048D> <5DEB> <048E> <5E0C> <048F> <5E8F> <0490> <5E87> <0491> <5E8A> <0492> <5EF7> <0493> <5F04> <0494> <5F1F> <0495> <5F64> <0496> <5F62> <0497> <5F77> <0498> <5F79> <0499> <5FD8> <049A> <5FCC> <049B> <5FD7> <049C> <5FCD> <049D> <5FF1> <049E> <5FEB> <049F> <5FF8> <04A0> <5FEA> <04A1> <6212> <04A2> <6211> <04A3> <6284> <04A4> <6297> <04A5> <6296> <04A6> <6280> <04A7> <6276> <04A8> <6289> <04A9> <626D> <04AA> <628A> <04AB> <627C> <04AC> <627E> <04AD> <6279> <04AE> <6273> <04AF> <6292> <04B0> <626F> <04B1> <6298> <04B2> <626E> <04B3> <6295> <04B4> <6293> <04B5> <6291> <04B6> <6286> <04B7> <6539> <04B8> <653B> <04B9> <6538> <04BA> <65F1> <04BB> <66F4> <04BC> <675F> <04C1> <675C> <04C2> <6756> endbfchar 100 beginbfchar <04C3> <675E> <04C4> <6749> <04C5> <6746> <04C6> <6760> <04C7> <6753> <04C8> <6757> <04C9> <6B65> <04CA> <6BCF> <04CB> <6C42> <04CC> <6C5E> <04CD> <6C99> <04CE> <6C81> <04D1> <6C85> <04D2> <6C9B> <04D3> <6C6A> <04D4> <6C7A> <04D5> <6C90> <04D6> <6C70> <04D7> <6C8C> <04D8> <6C68> <04D9> <6C96> <04DA> <6C92> <04DB> <6C7D> <04DC> <6C83> <04DD> <6C72> <04DE> <6C7E> <04DF> <6C74> <04E0> <6C86> <04E1> <6C76> <04E2> <6C8D> <04E3> <6C94> <04E4> <6C98> <04E5> <6C82> <04E6> <7076> <04E9> <7078> <04EA> <7262> <04EB> <7261> <04EC> <7260> <04ED> <72C4> <04EE> <72C2> <04EF> <7396> <04F0> <752C> <04F1> <752B> <04F4> <7682> <04F5> <76EF> <04F6> <77E3> <04F7> <79C1> <04F8> <79C0> <04F9> <79BF> <04FA> <7A76> <04FB> <7CFB> <04FC> <7F55> <04FD> <8096> <04FE> <8093> <04FF> <809D> <0500> <8098> <0501> <809B> <0502> <809A> <0503> <80B2> <0504> <826F> <0505> <8292> <0506> <828B> <0507> <828D> <0508> <898B> <0509> <89D2> <050A> <8A00> <050B> <8C37> <050C> <8C46> <050D> <8C55> <050E> <8C9D> <050F> <8D64> <0510> <8D70> <0511> <8DB3> <0512> <8EAB> <0513> <8ECA> <0514> <8F9B> <0515> <8FB0> <0516> <8FC2> <0517> <8FC6> <0518> <8FC5> <0519> <8FC4> <051A> <5DE1> <051B> <9091> <051C> <90A2> <051D> <90AA> <051E> <90A6> <051F> <90A3> <0520> <9149> <0521> <91C6> <0522> <91CC> <0523> <9632> <0524> <962E> <0525> <9631> <0526> <962A> <0527> <962C> <0528> <4E26> <0529> <4E56> <052A> <4E73> <052B> <4E8B> <052C> <4E9B> endbfchar 100 beginbfchar <052D> <4E9E> <0530> <4F6F> <0531> <4F9D> <0532> <4F8D> <0533> <4F73> <0534> <4F7F> <0535> <4F6C> <0536> <4F9B> <0537> <4F8B> <0538> <4F86> <0539> <4F83> <053A> <4F70> <053B> <4F75> <053C> <4F88> <053D> <4F69> <053E> <4F7B> <053F> <4F96> <0540> <4F7E> <0541> <4F8F> <0542> <4F91> <0543> <4F7A> <0544> <5154> <0545> <5152> <0546> <5155> <0547> <5169> <0548> <5177> <0549> <5176> <054A> <5178> <054B> <51BD> <054C> <51FD> <054D> <523B> <054E> <5238> <054F> <5237> <0550> <523A> <0551> <5230> <0552> <522E> <0553> <5236> <0554> <5241> <0555> <52BE> <0556> <52BB> <0557> <5352> <0558> <5354> <0559> <5353> <055A> <5351> <055B> <5366> <055F> <53D6> <0560> <53D4> <0561> <53D7> <0562> <5473> <0563> <5475> <0564> <5496> <0565> <5478> <0566> <5495> <0567> <5480> <0568> <547B> <0569> <5477> <056A> <5484> <056B> <5492> <056C> <5486> <056D> <547C> <056E> <5490> <056F> <5471> <0570> <5476> <0571> <548C> <0572> <549A> <0573> <5462> <0574> <5468> <0575> <548B> <0576> <547D> <0577> <548E> <0578> <56FA> <0579> <5783> <057A> <5777> <057B> <576A> <057C> <5769> <057D> <5761> <057E> <5766> <057F> <5764> <0580> <577C> <0581> <591C> <0582> <5949> <0585> <5944> <0586> <5954> <0587> <59BE> <0588> <59BB> <0589> <59D4> <058A> <59B9> <058B> <59AE> <058C> <59D1> <058D> <59C6> <058E> <59D0> <058F> <59CD> <0590> <59CB> <0591> <59D3> <0592> <59CA> <0593> <59AF> <0594> <59B3> <0595> <59D2> <0596> <59C5> <0597> <5B5F> endbfchar 100 beginbfchar <0598> <5B64> <0599> <5B63> <059A> <5B97> <059B> <5B9A> <059C> <5B98> <059D> <5B9C> <059E> <5B99> <059F> <5B9B> <05A0> <5C1A> <05A1> <5C48> <05A4> <5CB7> <05A5> <5CA1> <05A6> <5CB8> <05A7> <5CA9> <05A8> <5CAB> <05A9> <5CB1> <05AA> <5CB3> <05AB> <5E18> <05AC> <5E1A> <05AD> <5E16> <05AE> <5E15> <05AF> <5E1B> <05B0> <5E11> <05B1> <5E78> <05B2> <5E9A> <05B3> <5E97> <05B4> <5E9C> <05B7> <5EF6> <05BA> <5F29> <05BD> <5F7F> <05BE> <5F7C> <05BF> <5FDD> <05C0> <5FE0> <05C1> <5FFD> <05C2> <5FF5> <05C3> <5FFF> <05C4> <600F> <05C5> <6014> <05C6> <602F> <05C7> <6035> <05C8> <6016> <05C9> <602A> <05CA> <6015> <05CB> <6021> <05CC> <6027> <05CD> <6029> <05CE> <602B> <05CF> <601B> <05D0> <6216> <05D1> <6215> <05D2> <623F> <05D3> <623E> <05D4> <6240> <05D5> <627F> <05D6> <62C9> <05D7> <62CC> <05D8> <62C4> <05D9> <62BF> <05DA> <62C2> <05DB> <62B9> <05DC> <62D2> <05DD> <62DB> <05DE> <62AB> <05E1> <62CB> <05E2> <62C8> <05E3> <62A8> <05E4> <62BD> <05E5> <62BC> <05E6> <62D0> <05E7> <62D9> <05E8> <62C7> <05E9> <62CD> <05EA> <62B5> <05EB> <62DA> <05EC> <62B1> <05ED> <62D8> <05F0> <62C6> <05F1> <62AC> <05F2> <62CE> <05F3> <653E> <05F4> <65A7> <05F5> <65BC> <05F6> <65FA> <05F7> <6614> <05F8> <6613> <05F9> <660C> <05FA> <6606> <05FB> <6602> <05FC> <660E> <05FD> <6600> <05FE> <660F> <05FF> <6615> <0600> <660A> <0601> <6607> <0602> <670D> <0603> <670B> <0604> <676D> <0605> <678B> <0606> <6795> <0607> <6771> endbfchar 100 beginbfchar <0608> <679C> <0609> <6773> <060A> <6777> <060B> <6787> <060C> <679D> <060D> <6797> <0610> <677F> <0611> <6789> <0612> <677E> <0613> <6790> <0614> <6775> <0615> <679A> <0616> <6793> <0617> <677C> <0618> <676A> <0619> <6772> <061A> <6B23> <061D> <6B7F> <061E> <6C13> <061F> <6C1B> <0620> <6CE3> <0621> <6CE8> <0622> <6CF3> <0623> <6CB1> <0624> <6CCC> <0625> <6CE5> <0626> <6CB3> <0629> <6CBC> <062A> <6CE2> <062B> <6CAB> <062C> <6CD5> <062D> <6CD3> <062E> <6CB8> <062F> <6CC4> <0630> <6CB9> <0631> <6CC1> <0632> <6CAE> <0633> <6CD7> <0634> <6CC5> <0635> <6CF1> <0636> <6CBF> <0637> <6CBB> <0638> <6CE1> <0639> <6CDB> <063A> <6CCA> <063B> <6CAC> <063C> <6CEF> <063D> <6CDC> <063E> <6CD6> <063F> <6CE0> <0640> <7095> <0641> <708E> <0642> <7092> <0643> <708A> <0644> <7099> <0647> <7238> <0648> <7248> <0649> <7267> <064A> <7269> <064B> <72C0> <064C> <72CE> <064D> <72D9> <064E> <72D7> <064F> <72D0> <0650> <73A9> <0651> <73A8> <0652> <739F> <0653> <73AB> <0654> <73A5> <0655> <753D> <0656> <759D> <0659> <7684> <065A> <76C2> <065B> <76F2> <065C> <76F4> <065D> <77E5> <065E> <77FD> <065F> <793E> <0662> <79C9> <0663> <79C8> <0664> <7A7A> <0665> <7A79> <0666> <7AFA> <0667> <7CFE> <0668> <7F54> <0669> <7F8C> <066A> <7F8B> <066B> <8005> <066C> <80BA> <066D> <80A5> <066E> <80A2> <066F> <80B1> <0670> <80A1> <0671> <80AB> <0672> <80A9> <0673> <80B4> <0674> <80AA> <0675> <80AF> <0676> <81E5> <0677> <81FE> endbfchar 100 beginbfchar <0678> <820D> <0679> <82B3> <067A> <829D> <067B> <8299> <067C> <82AD> <067D> <82BD> <067E> <829F> <067F> <82B9> <0680> <82B1> <0681> <82AC> <0682> <82A5> <0683> <82AF> <0684> <82B8> <0685> <82A3> <0686> <82B0> <0687> <82BE> <0688> <82B7> <0689> <864E> <068A> <8671> <068B> <521D> <068C> <8868> <068D> <8ECB> <068E> <8FCE> <068F> <8FD4> <0690> <8FD1> <0691> <90B5> <0692> <90B8> <0693> <90B1> <0694> <90B6> <0695> <91C7> <0696> <91D1> <0697> <9577> <0698> <9580> <0699> <961C> <069A> <9640> <069B> <963F> <069C> <963B> <069D> <9644> <069E> <9642> <069F> <96B9> <06A0> <96E8> <06A1> <9752> <06A2> <975E> <06A3> <4E9F> <06A6> <4FE1> <06A7> <4FB5> <06A8> <4FAF> <06A9> <4FBF> <06AA> <4FE0> <06AB> <4FD1> <06AC> <4FCF> <06AD> <4FDD> <06AE> <4FC3> <06AF> <4FB6> <06B0> <4FD8> <06B1> <4FDF> <06B2> <4FCA> <06B3> <4FD7> <06B4> <4FAE> <06B5> <4FD0> <06B6> <4FC4> <06B7> <4FC2> <06B8> <4FDA> <06B9> <4FCE> <06BA> <4FDE> <06BB> <4FB7> <06BC> <5157> <06BD> <5192> <06BE> <5191> <06BF> <51A0> <06C0> <524E> <06C1> <5243> <06C2> <524A> <06C3> <524D> <06C4> <524C> <06C5> <524B> <06C6> <5247> <06C7> <52C7> <06C8> <52C9> <06C9> <52C3> <06CA> <52C1> <06CB> <530D> <06CC> <5357> <06CD> <537B> <06CE> <539A> <06CF> <53DB> <06D0> <54AC> <06D1> <54C0> <06D2> <54A8> <06D3> <54CE> <06D4> <54C9> <06D5> <54B8> <06D6> <54A6> <06D7> <54B3> <06D8> <54C7> <06D9> <54C2> <06DA> <54BD> <06DB> <54AA> <06DC> <54C1> <06DD> <54C4> endbfchar 100 beginbfchar <06DE> <54C8> <06DF> <54AF> <06E0> <54AB> <06E1> <54B1> <06E2> <54BB> <06E3> <54A9> <06E4> <54A7> <06E5> <54BF> <06E6> <56FF> <06E7> <5782> <06E8> <578B> <06E9> <57A0> <06EA> <57A3> <06EB> <57A2> <06EC> <57CE> <06ED> <57AE> <06EE> <5793> <06EF> <5955> <06F0> <5951> <06F1> <594F> <06F2> <594E> <06F3> <5950> <06F4> <59DC> <06F5> <59D8> <06F6> <59FF> <06F7> <59E3> <06F8> <59E8> <06F9> <5A03> <06FA> <59E5> <06FB> <59EA> <06FC> <59DA> <06FD> <59E6> <06FE> <5A01> <06FF> <59FB> <0700> <5B69> <0701> <5BA3> <0702> <5BA6> <0703> <5BA4> <0704> <5BA2> <0705> <5BA5> <0706> <5C01> <0709> <5C4D> <070A> <5C4B> <070B> <5CD9> <070C> <5CD2> <070D> <5DF7> <070E> <5E1D> <070F> <5E25> <0710> <5E1F> <0711> <5E7D> <0712> <5EA0> <0713> <5EA6> <0714> <5EFA> <0715> <5F08> <0716> <5F2D> <0717> <5F65> <0718> <5F88> <0719> <5F85> <071C> <5F87> <071D> <5F8C> <071E> <5F89> <071F> <6012> <0720> <601D> <0721> <6020> <0722> <6025> <0723> <600E> <0724> <6028> <0725> <604D> <0726> <6070> <0727> <6068> <0728> <6062> <0729> <6046> <072A> <6043> <072B> <606C> <072C> <606B> <072D> <606A> <072E> <6064> <072F> <6241> <0730> <62DC> <0731> <6316> <0732> <6309> <0733> <62FC> <0734> <62ED> <0735> <6301> <0736> <62EE> <0737> <62FD> <0738> <6307> <0739> <62F1> <073A> <62F7> <073B> <62EF> <073C> <62EC> <073D> <62FE> <073E> <62F4> <073F> <6311> <0740> <6302> <0741> <653F> <0742> <6545> <0743> <65AB> <0744> <65BD> <0745> <65E2> endbfchar 100 beginbfchar <0746> <6625> <0747> <662D> <0748> <6620> <0749> <6627> <074A> <662F> <074B> <661F> <074C> <6628> <074D> <6631> <074E> <6624> <074F> <66F7> <0750> <67FF> <0751> <67D3> <0752> <67F1> <0753> <67D4> <0754> <67D0> <0755> <67EC> <0756> <67B6> <0757> <67AF> <0758> <67F5> <0759> <67E9> <075A> <67EF> <075B> <67C4> <075C> <67D1> <075D> <67B4> <075E> <67DA> <075F> <67E5> <0760> <67B8> <0761> <67CF> <0762> <67DE> <0763> <67F3> <0764> <67B0> <0765> <67D9> <0766> <67E2> <0767> <67DD> <0768> <67D2> <0769> <6B6A> <076A> <6B83> <076B> <6B86> <076C> <6BB5> <076D> <6BD2> <076E> <6BD7> <076F> <6C1F> <0770> <6CC9> <0771> <6D0B> <0772> <6D32> <0773> <6D2A> <0774> <6D41> <0775> <6D25> <0776> <6D0C> <0777> <6D31> <0778> <6D1E> <0779> <6D17> <077A> <6D3B> <077D> <6D36> <077E> <6D1B> <077F> <6CF5> <0780> <6D39> <0781> <6D27> <0782> <6D38> <0783> <6D29> <0784> <6D2E> <0785> <6D35> <0786> <6D0E> <0787> <6D2B> <0788> <70AB> <0789> <70BA> <078A> <70B3> <078B> <70AC> <078C> <70AF> <078D> <70AD> <078E> <70B8> <078F> <70AE> <0790> <70A4> <0791> <7230> <0792> <7272> <0793> <726F> <0794> <7274> <0795> <72E9> <0798> <73B7> <0799> <73CA> <079A> <73BB> <079B> <73B2> <079C> <73CD> <079D> <73C0> <079E> <73B3> <079F> <751A> <07A0> <752D> <07A1> <754F> <07A2> <754C> <07A3> <754E> <07A4> <754B> <07A5> <75AB> <07AA> <7678> <07AE> <76C8> <07AF> <76C6> <07B0> <76C3> <07B1> <76C5> <07B2> <7701> <07B3> <76F9> <07B4> <76F8> endbfchar 100 beginbfchar <07B5> <7709> <07B6> <770B> <07B7> <76FE> <07B8> <76FC> <07B9> <7707> <07BA> <77DC> <07BB> <7802> <07BC> <7814> <07BF> <7946> <07C0> <7949> <07C1> <7948> <07C2> <7947> <07C7> <79CB> <07C8> <7A7F> <07C9> <7A81> <07CA> <7AFF> <07CB> <7AFD> <07CC> <7C7D> <07CD> <7D02> <07CE> <7D05> <07CF> <7D00> <07D0> <7D09> <07D1> <7D07> <07D2> <7D04> <07D3> <7D06> <07D4> <7F38> <07D5> <7F8E> <07D6> <7FBF> <07D7> <8010> <07D8> <800D> <07D9> <8011> <07DA> <8036> <07DB> <80D6> <07DC> <80E5> <07DD> <80DA> <07E0> <80CC> <07E1> <80E1> <07E2> <80DB> <07E3> <80CE> <07E4> <80DE> <07E5> <80E4> <07E6> <80DD> <07E7> <81F4> <07E8> <8222> <07E9> <82E7> <07EA> <8303> <07EB> <8305> <07EC> <82E3> <07ED> <82DB> <07EE> <82E6> <07EF> <8304> <07F0> <82E5> <07F1> <8302> <07F2> <8309> <07F3> <82D2> <07F4> <82D7> <07F5> <82F1> <07F6> <8301> <07F7> <82DC> <07F8> <82D4> <07F9> <82D1> <07FA> <82DE> <07FB> <82D3> <07FC> <82DF> <07FD> <82EF> <07FE> <8306> <07FF> <8650> <0800> <8679> <0801> <867B> <0802> <867A> <0803> <884D> <0804> <886B> <0805> <8981> <0806> <89D4> <0807> <8A08> <080A> <8C9E> <080B> <8CA0> <080C> <8D74> <080D> <8D73> <080E> <8DB4> <080F> <8ECD> <0810> <8ECC> <0811> <8FF0> <0812> <8FE6> <0813> <8FE2> <0814> <8FEA> <0815> <8FE5> <0816> <8FED> <0817> <8FEB> <0818> <8FE4> <0819> <8FE8> <081A> <90CA> <081B> <90CE> <081C> <90C1> <081D> <90C3> <081E> <914B> <081F> <914A> <0820> <91CD> <0821> <9582> <0822> <9650> endbfchar 100 beginbfchar <0826> <9762> <0827> <9769> <0828> <97CB> <0829> <97ED> <082A> <97F3> <082B> <9801> <082C> <98A8> <082D> <98DB> <082E> <98DF> <082F> <9996> <0830> <9999> <0831> <4E58> <0832> <4EB3> <0835> <5023> <0836> <4FEF> <0837> <5026> <0838> <5025> <0839> <4FF8> <083A> <5029> <083B> <5016> <083C> <5006> <083D> <503C> <083E> <501F> <083F> <501A> <0840> <5012> <0841> <5011> <0842> <4FFA> <0843> <5000> <0844> <5014> <0845> <5028> <0846> <4FF1> <0847> <5021> <0848> <500B> <0849> <5019> <084A> <5018> <084B> <4FF3> <084C> <4FEE> <084D> <502D> <084E> <502A> <084F> <4FFE> <0850> <502B> <0851> <5009> <0852> <517C> <0855> <51A2> <0856> <51CD> <0857> <51CC> <0858> <51C6> <0859> <51CB> <085A> <5256> <085B> <525C> <085C> <5254> <085D> <525B> <085E> <525D> <085F> <532A> <0860> <537F> <0861> <539F> <0862> <539D> <0863> <53DF> <0864> <54E8> <0865> <5510> <0866> <5501> <0867> <5537> <0868> <54FC> <0869> <54E5> <086A> <54F2> <086B> <5506> <086C> <54FA> <086D> <5514> <086E> <54E9> <086F> <54ED> <0870> <54E1> <0871> <5509> <0872> <54EE> <0873> <54EA> <0874> <54E6> <0875> <5527> <0876> <5507> <0877> <54FD> <0878> <550F> <087B> <57C2> <087C> <57D4> <087D> <57CB> <087E> <57C3> <087F> <5809> <0880> <590F> <0883> <595A> <0884> <5A11> <0885> <5A18> <0886> <5A1C> <0887> <5A1F> <0888> <5A1B> <0889> <5A13> <088A> <59EC> <088B> <5A20> <088C> <5A23> <088D> <5A29> <088E> <5A25> <088F> <5A0C> <0890> <5A09> <0891> <5B6B> endbfchar 100 beginbfchar <0892> <5C58> <0893> <5BB0> <0894> <5BB3> <0895> <5BB6> <0896> <5BB4> <0897> <5BAE> <0898> <5BB5> <0899> <5BB9> <089A> <5BB8> <089B> <5C04> <089C> <5C51> <089D> <5C55> <089E> <5C50> <089F> <5CED> <08A0> <5CFD> <08A1> <5CFB> <08A2> <5CEA> <08A3> <5CE8> <08A4> <5CF0> <08A5> <5CF6> <08A6> <5D01> <08A7> <5CF4> <08A8> <5DEE> <08A9> <5E2D> <08AA> <5E2B> <08AB> <5EAB> <08AC> <5EAD> <08AD> <5EA7> <08AE> <5F31> <08AF> <5F92> <08B0> <5F91> <08B1> <5F90> <08B2> <6059> <08B3> <6063> <08B4> <6065> <08B5> <6050> <08B6> <6055> <08B7> <606D> <08B8> <6069> <08B9> <606F> <08BA> <6084> <08BB> <609F> <08BC> <609A> <08BD> <608D> <08BE> <6094> <08BF> <608C> <08C0> <6085> <08C1> <6096> <08C2> <6247> <08C3> <62F3> <08C4> <6308> <08C5> <62FF> <08C6> <634E> <08C7> <633E> <08C8> <632F> <08C9> <6355> <08CA> <6342> <08CB> <6346> <08CC> <634F> <08CD> <6349> <08CE> <633A> <08CF> <6350> <08D0> <633D> <08D3> <6328> <08D4> <634D> <08D5> <634C> <08D8> <6599> <08D9> <65C1> <08DA> <65C5> <08DB> <6642> <08DC> <6649> <08DD> <664F> <08DE> <6643> <08DF> <6652> <08E0> <664C> <08E1> <6645> <08E2> <6641> <08E3> <66F8> <08E6> <6717> <08E7> <6821> <08E8> <6838> <08E9> <6848> <08EA> <6846> <08EB> <6853> <08EC> <6839> <08ED> <6842> <08EE> <6854> <08EF> <6829> <08F0> <68B3> <08F1> <6817> <08F2> <684C> <08F3> <6851> <08F4> <683D> <08F5> <67F4> <08F6> <6850> <08F7> <6840> <08F8> <683C> <08F9> <6843> <08FA> <682A> <08FB> <6845> endbfchar 100 beginbfchar <08FC> <6813> <08FD> <6818> <08FE> <6841> <08FF> <6B8A> <0900> <6B89> <0901> <6BB7> <0902> <6C23> <0905> <6C26> <0906> <6C24> <0907> <6CF0> <0908> <6D6A> <0909> <6D95> <090A> <6D88> <090B> <6D87> <090C> <6D66> <090D> <6D78> <090E> <6D77> <090F> <6D59> <0910> <6D93> <0911> <6D6C> <0912> <6D89> <0913> <6D6E> <0914> <6D5A> <0915> <6D74> <0916> <6D69> <0917> <6D8C> <0918> <6D8A> <0919> <6D79> <091A> <6D85> <091B> <6D65> <091C> <6D94> <091D> <70CA> <091E> <70D8> <091F> <70E4> <0920> <70D9> <0921> <70C8> <0922> <70CF> <0923> <7239> <0924> <7279> <0925> <72FC> <0926> <72F9> <0927> <72FD> <0928> <72F8> <0929> <72F7> <092A> <7386> <092B> <73ED> <092C> <7409> <092D> <73EE> <092E> <73E0> <092F> <73EA> <0930> <73DE> <0931> <7554> <0932> <755D> <0933> <755C> <0934> <755A> <0935> <7559> <0936> <75BE> <0937> <75C5> <0938> <75C7> <093B> <75BD> <093C> <75BC> <093D> <75B9> <093E> <75C2> <093F> <75B8> <0940> <768B> <0941> <76B0> <0942> <76CA> <0945> <7729> <0948> <7728> <0949> <77E9> <094A> <7830> <094B> <7827> <094C> <7838> <094D> <781D> <094E> <7834> <094F> <7837> <0950> <7825> <0951> <782D> <0952> <7820> <0953> <781F> <0954> <7832> <0955> <7955> <0956> <7950> <0957> <7960> <0958> <795F> <0959> <7956> <095A> <795E> <095B> <795D> <095C> <7957> <095D> <795A> <095E> <79E4> <095F> <79E3> <0960> <79E7> <0961> <79DF> <0962> <79E6> <0963> <79E9> <0964> <79D8> <0965> <7A84> <0966> <7A88> <0967> <7AD9> endbfchar 100 beginbfchar <0968> <7B06> <0969> <7B11> <096A> <7C89> <096B> <7D21> <096C> <7D17> <096D> <7D0B> <096E> <7D0A> <096F> <7D20> <0970> <7D22> <0971> <7D14> <0972> <7D10> <0973> <7D15> <0974> <7D1A> <0975> <7D1C> <0976> <7D0D> <0977> <7D19> <0978> <7D1B> <0979> <7F3A> <097A> <7F5F> <097B> <7F94> <097C> <7FC5> <097D> <7FC1> <097E> <8006> <097F> <8004> <0980> <8018> <0981> <8015> <0982> <8019> <0983> <8017> <0984> <803D> <0985> <803F> <0986> <80F1> <0987> <8102> <0988> <80F0> <0989> <8105> <098A> <80ED> <098B> <80F4> <098C> <8106> <098D> <80F8> <098E> <80F3> <098F> <8108> <0990> <80FD> <0991> <810A> <0992> <80FC> <0993> <80EF> <0994> <81ED> <0995> <81EC> <0996> <8200> <0997> <8210> <099A> <8228> <099B> <822C> <099C> <82BB> <099D> <832B> <099E> <8352> <099F> <8354> <09A0> <834A> <09A1> <8338> <09A2> <8350> <09A3> <8349> <09A4> <8335> <09A5> <8334> <09A6> <834F> <09A7> <8332> <09A8> <8339> <09A9> <8336> <09AA> <8317> <09AB> <8340> <09AC> <8331> <09AD> <8328> <09AE> <8343> <09AF> <8654> <09B0> <868A> <09B1> <86AA> <09B2> <8693> <09B3> <86A4> <09B4> <86A9> <09B5> <868C> <09B6> <86A3> <09B7> <869C> <09B8> <8870> <09B9> <8877> <09BC> <887D> <09BD> <8879> <09BE> <8A18> <09BF> <8A10> <09C0> <8A0E> <09C1> <8A0C> <09C2> <8A15> <09C3> <8A0A> <09C4> <8A17> <09C5> <8A13> <09C6> <8A16> <09C7> <8A0F> <09C8> <8A11> <09C9> <8C48> <09CA> <8C7A> <09CB> <8C79> <09CE> <8D77> <09CF> <8EAC> <09D0> <8ED2> <09D1> <8ED4> endbfchar 100 beginbfchar <09D2> <8ECF> <09D3> <8FB1> <09D4> <9001> <09D5> <9006> <09D6> <8FF7> <09D7> <9000> <09D8> <8FFA> <09D9> <8FF4> <09DA> <9003> <09DB> <8FFD> <09DC> <9005> <09DD> <8FF8> <09DE> <9095> <09DF> <90E1> <09E0> <90DD> <09E1> <90E2> <09E2> <9152> <09E3> <914D> <09E4> <914C> <09E5> <91D8> <09E6> <91DD> <09E7> <91D7> <09E8> <91DC> <09E9> <91D9> <09EA> <9583> <09ED> <9661> <09EE> <965B> <09EF> <965D> <09F0> <9664> <09F1> <9658> <09F2> <965E> <09F3> <96BB> <09F4> <98E2> <09F5> <99AC> <09F6> <9AA8> <09F7> <9AD8> <09F8> <9B25> <09F9> <9B32> <09FA> <9B3C> <09FB> <4E7E> <09FC> <507A> <09FD> <507D> <09FE> <505C> <09FF> <5047> <0A00> <5043> <0A01> <504C> <0A02> <505A> <0A03> <5049> <0A04> <5065> <0A05> <5076> <0A06> <504E> <0A07> <5055> <0A08> <5075> <0A09> <5074> <0A0A> <5077> <0A0B> <504F> <0A0C> <500F> <0A0D> <506F> <0A0E> <506D> <0A0F> <515C> <0A10> <5195> <0A11> <51F0> <0A12> <526A> <0A13> <526F> <0A14> <52D2> <0A15> <52D9> <0A16> <52D8> <0A17> <52D5> <0A18> <5310> <0A19> <530F> <0A1A> <5319> <0A1D> <533E> <0A1E> <53C3> <0A1F> <66FC> <0A20> <5546> <0A21> <556A> <0A22> <5566> <0A23> <5544> <0A24> <555E> <0A25> <5561> <0A26> <5543> <0A27> <554A> <0A28> <5531> <0A29> <5556> <0A2A> <554F> <0A2B> <5555> <0A2C> <552F> <0A2D> <5564> <0A2E> <5538> <0A2F> <552E> <0A30> <555C> <0A31> <552C> <0A32> <5563> <0A33> <5533> <0A34> <5541> <0A35> <5557> <0A36> <5708> <0A37> <570B> <0A38> <5709> <0A39> <57DF> endbfchar 100 beginbfchar <0A3A> <5805> <0A3B> <580A> <0A3C> <5806> <0A3D> <57E0> <0A3E> <57E4> <0A3F> <57FA> <0A40> <5802> <0A41> <5835> <0A42> <57F7> <0A43> <57F9> <0A44> <5920> <0A45> <5962> <0A46> <5A36> <0A47> <5A41> <0A48> <5A49> <0A49> <5A66> <0A4A> <5A6A> <0A4B> <5A40> <0A4C> <5A3C> <0A4D> <5A62> <0A4E> <5A5A> <0A4F> <5A46> <0A50> <5A4A> <0A51> <5B70> <0A52> <5BC7> <0A53> <5BC5> <0A54> <5BC4> <0A55> <5BC2> <0A56> <5BBF> <0A57> <5BC6> <0A58> <5C09> <0A59> <5C08> <0A5A> <5C07> <0A5B> <5C60> <0A5E> <5D07> <0A5F> <5D06> <0A60> <5D0E> <0A61> <5D1B> <0A62> <5D16> <0A63> <5D22> <0A64> <5D11> <0A65> <5D29> <0A66> <5D14> <0A67> <5D19> <0A68> <5D24> <0A69> <5D27> <0A6A> <5D17> <0A6B> <5DE2> <0A6C> <5E38> <0A6D> <5E36> <0A6E> <5E33> <0A6F> <5E37> <0A72> <5EB6> <0A73> <5EB5> <0A74> <5EBE> <0A75> <5F35> <0A76> <5F37> <0A77> <5F57> <0A78> <5F6C> <0A79> <5F69> <0A7A> <5F6B> <0A7B> <5F97> <0A7C> <5F99> <0A7D> <5F9E> <0A7E> <5F98> <0A7F> <5FA1> <0A80> <5FA0> <0A81> <5F9C> <0A82> <607F> <0A83> <60A3> <0A84> <6089> <0A85> <60A0> <0A86> <60A8> <0A87> <60CB> <0A88> <60B4> <0A89> <60E6> <0A8A> <60BD> <0A8B> <60C5> <0A8C> <60BB> <0A8D> <60B5> <0A8E> <60DC> <0A8F> <60BC> <0A90> <60D8> <0A91> <60D5> <0A92> <60C6> <0A93> <60DF> <0A94> <60B8> <0A95> <60DA> <0A96> <60C7> <0A99> <6248> <0A9A> <63A0> <0A9B> <63A7> <0A9C> <6372> <0A9D> <6396> <0A9E> <63A2> <0A9F> <63A5> <0AA0> <6377> <0AA1> <6367> <0AA2> <6398> <0AA3> <63AA> endbfchar 100 beginbfchar <0AA4> <6371> <0AA5> <63A9> <0AA6> <6389> <0AA7> <6383> <0AA8> <639B> <0AA9> <636B> <0AAA> <63A8> <0AAB> <6384> <0AAC> <6388> <0AAD> <6399> <0AAE> <63A1> <0AAF> <63AC> <0AB0> <6392> <0AB1> <638F> <0AB2> <6380> <0AB3> <637B> <0AB4> <6369> <0AB5> <6368> <0AB6> <637A> <0AB7> <655D> <0AB8> <6556> <0AB9> <6551> <0ABA> <6559> <0ABB> <6557> <0ABC> <555F> <0ABD> <654F> <0ABE> <6558> <0ABF> <6555> <0AC0> <6554> <0AC1> <659C> <0AC2> <659B> <0AC3> <65AC> <0AC4> <65CF> <0AC7> <65CE> <0AC8> <665D> <0AC9> <665A> <0ACA> <6664> <0ACB> <6668> <0ACC> <6666> <0ACD> <665E> <0ACE> <66F9> <0ACF> <52D7> <0AD0> <671B> <0AD1> <6881> <0AD2> <68AF> <0AD3> <68A2> <0AD4> <6893> <0AD5> <68B5> <0AD6> <687F> <0AD7> <6876> <0AD8> <68B1> <0AD9> <68A7> <0ADA> <6897> <0ADB> <68B0> <0ADC> <6883> <0ADD> <68C4> <0ADE> <68AD> <0ADF> <6886> <0AE0> <6885> <0AE1> <6894> <0AE2> <689D> <0AE3> <68A8> <0AE4> <689F> <0AE5> <68A1> <0AE6> <6882> <0AE7> <6B32> <0AE8> <6BBA> <0AEB> <6C2B> <0AEC> <6D8E> <0AED> <6DBC> <0AEE> <6DF3> <0AEF> <6DD9> <0AF0> <6DB2> <0AF1> <6DE1> <0AF2> <6DCC> <0AF3> <6DE4> <0AF4> <6DFB> <0AF5> <6DFA> <0AF6> <6E05> <0AF7> <6DC7> <0AF8> <6DCB> <0AF9> <6DAF> <0AFA> <6DD1> <0AFB> <6DAE> <0AFC> <6DDE> <0AFD> <6DF9> <0AFE> <6DB8> <0AFF> <6DF7> <0B00> <6DF5> <0B01> <6DC5> <0B02> <6DD2> <0B03> <6E1A> <0B04> <6DB5> <0B05> <6DDA> <0B06> <6DEB> <0B07> <6DD8> <0B08> <6DEA> <0B09> <6DF1> <0B0A> <6DEE> <0B0B> <6DE8> endbfchar 100 beginbfchar <0B0C> <6DC6> <0B0D> <6DC4> <0B0E> <6DAA> <0B0F> <6DEC> <0B10> <6DBF> <0B11> <6DE6> <0B12> <70F9> <0B15> <70FD> <0B16> <70EF> <0B17> <723D> <0B18> <727D> <0B19> <7281> <0B1A> <731C> <0B1B> <731B> <0B1C> <7316> <0B1D> <7313> <0B1E> <7319> <0B1F> <7387> <0B20> <7405> <0B21> <740A> <0B22> <7403> <0B23> <7406> <0B24> <73FE> <0B25> <740D> <0B26> <74E0> <0B29> <751C> <0B2A> <7522> <0B2D> <7562> <0B2E> <7570> <0B2F> <758F> <0B32> <75B5> <0B33> <75CA> <0B34> <75CD> <0B35> <768E> <0B36> <76D4> <0B37> <76D2> <0B38> <76DB> <0B39> <7737> <0B3A> <773E> <0B3B> <773C> <0B3C> <7736> <0B3D> <7738> <0B3E> <773A> <0B3F> <786B> <0B40> <7843> <0B41> <784E> <0B42> <7965> <0B43> <7968> <0B44> <796D> <0B45> <79FB> <0B46> <7A92> <0B47> <7A95> <0B48> <7B20> <0B49> <7B28> <0B4A> <7B1B> <0B4B> <7B2C> <0B4C> <7B26> <0B4D> <7B19> <0B4E> <7B1E> <0B4F> <7B2E> <0B50> <7C92> <0B51> <7C97> <0B52> <7C95> <0B53> <7D46> <0B54> <7D43> <0B55> <7D71> <0B56> <7D2E> <0B57> <7D39> <0B58> <7D3C> <0B59> <7D40> <0B5A> <7D30> <0B5B> <7D33> <0B5C> <7D44> <0B5D> <7D2F> <0B5E> <7D42> <0B5F> <7D32> <0B60> <7D31> <0B61> <7F3D> <0B62> <7F9E> <0B63> <7F9A> <0B64> <7FCC> <0B65> <7FCE> <0B66> <7FD2> <0B67> <801C> <0B68> <804A> <0B69> <8046> <0B6A> <812F> <0B6B> <8116> <0B6C> <8123> <0B6D> <812B> <0B6E> <8129> <0B6F> <8130> <0B70> <8124> <0B71> <8202> <0B72> <8235> <0B73> <8237> <0B74> <8236> <0B75> <8239> <0B76> <838E> <0B77> <839E> endbfchar 100 beginbfchar <0B78> <8398> <0B79> <8378> <0B7A> <83A2> <0B7B> <8396> <0B7C> <83BD> <0B7D> <83AB> <0B7E> <8392> <0B7F> <838A> <0B80> <8393> <0B81> <8389> <0B82> <83A0> <0B83> <8377> <0B86> <8386> <0B87> <83A7> <0B88> <8655> <0B89> <5F6A> <0B8A> <86C7> <0B8B> <86C0> <0B8C> <86B6> <0B8D> <86C4> <0B8E> <86B5> <0B8F> <86C6> <0B90> <86CB> <0B91> <86B1> <0B92> <86AF> <0B93> <86C9> <0B94> <8853> <0B95> <889E> <0B96> <8888> <0B97> <88AB> <0B98> <8892> <0B99> <8896> <0B9A> <888D> <0B9B> <888B> <0B9C> <8993> <0B9D> <898F> <0B9E> <8A2A> <0B9F> <8A1D> <0BA0> <8A23> <0BA1> <8A25> <0BA2> <8A31> <0BA3> <8A2D> <0BA4> <8A1F> <0BA5> <8A1B> <0BA6> <8A22> <0BA7> <8C49> <0BA8> <8C5A> <0BA9> <8CA9> <0BAA> <8CAC> <0BAB> <8CAB> <0BAC> <8CA8> <0BAD> <8CAA> <0BAE> <8CA7> <0BAF> <8D67> <0BB0> <8D66> <0BB1> <8DBE> <0BB2> <8DBA> <0BB3> <8EDB> <0BB4> <8EDF> <0BB5> <9019> <0BB6> <900D> <0BB7> <901A> <0BB8> <9017> <0BB9> <9023> <0BBA> <901F> <0BBB> <901D> <0BBC> <9010> <0BBD> <9015> <0BBE> <901E> <0BBF> <9020> <0BC0> <900F> <0BC1> <9022> <0BC2> <9016> <0BC3> <901B> <0BC4> <9014> <0BC5> <90E8> <0BC6> <90ED> <0BC7> <90FD> <0BC8> <9157> <0BC9> <91CE> <0BCA> <91F5> <0BCB> <91E6> <0BCC> <91E3> <0BCD> <91E7> <0BCE> <91ED> <0BCF> <91E9> <0BD0> <9589> <0BD1> <966A> <0BD2> <9675> <0BD3> <9673> <0BD4> <9678> <0BD5> <9670> <0BD6> <9674> <0BD9> <966C> <0BDA> <96C0> <0BDB> <96EA> <0BDC> <96E9> <0BDD> <7AE0> <0BDE> <7ADF> <0BE1> <9B5A> endbfchar 100 beginbfchar <0BE2> <9CE5> <0BE3> <9E75> <0BE4> <9E7F> <0BE5> <9EA5> <0BE6> <9EBB> <0BE7> <50A2> <0BE8> <508D> <0BE9> <5085> <0BEA> <5099> <0BEB> <5091> <0BEC> <5080> <0BED> <5096> <0BEE> <5098> <0BEF> <509A> <0BF0> <6700> <0BF1> <51F1> <0BF2> <5272> <0BF5> <5269> <0BF6> <52DE> <0BF7> <52DD> <0BF8> <52DB> <0BF9> <535A> <0BFA> <53A5> <0BFB> <557B> <0BFC> <5580> <0BFD> <55A7> <0BFE> <557C> <0BFF> <558A> <0C00> <559D> <0C01> <5598> <0C02> <5582> <0C03> <559C> <0C04> <55AA> <0C05> <5594> <0C06> <5587> <0C07> <558B> <0C08> <5583> <0C09> <55B3> <0C0A> <55AE> <0C0B> <559F> <0C0C> <553E> <0C0D> <55B2> <0C0E> <559A> <0C0F> <55BB> <0C10> <55AC> <0C11> <55B1> <0C12> <557E> <0C13> <5589> <0C14> <55AB> <0C15> <5599> <0C16> <570D> <0C17> <582F> <0C18> <582A> <0C19> <5834> <0C1A> <5824> <0C1D> <5821> <0C1E> <581D> <0C1F> <5820> <0C22> <5960> <0C23> <5A77> <0C24> <5A9A> <0C25> <5A7F> <0C26> <5A92> <0C27> <5A9B> <0C28> <5AA7> <0C29> <5B73> <0C2A> <5B71> <0C2B> <5BD2> <0C2C> <5BCC> <0C2D> <5BD3> <0C2E> <5BD0> <0C31> <5C31> <0C32> <5D4C> <0C33> <5D50> <0C34> <5D34> <0C35> <5D47> <0C36> <5DFD> <0C37> <5E45> <0C38> <5E3D> <0C39> <5E40> <0C3A> <5E43> <0C3B> <5E7E> <0C3C> <5ECA> <0C3F> <5EC4> <0C40> <5F3C> <0C41> <5F6D> <0C44> <5FA8> <0C45> <60D1> <0C46> <60E1> <0C47> <60B2> <0C48> <60B6> <0C49> <60E0> <0C4A> <611C> <0C4B> <6123> <0C4C> <60FA> <0C4D> <6115> <0C4E> <60F0> <0C4F> <60FB> <0C50> <60F4> <0C51> <6168> endbfchar 100 beginbfchar <0C52> <60F1> <0C53> <610E> <0C54> <60F6> <0C55> <6109> <0C56> <6100> <0C57> <6112> <0C58> <621F> <0C59> <6249> <0C5A> <63A3> <0C5B> <638C> <0C5C> <63CF> <0C5D> <63C0> <0C5E> <63E9> <0C5F> <63C9> <0C60> <63C6> <0C61> <63CD> <0C62> <63D2> <0C63> <63E3> <0C64> <63D0> <0C65> <63E1> <0C66> <63D6> <0C69> <6376> <0C6A> <63F4> <0C6B> <63EA> <0C6C> <63DB> <0C6D> <6452> <0C6E> <63DA> <0C6F> <63F9> <0C70> <655E> <0C71> <6566> <0C74> <6591> <0C75> <6590> <0C76> <65AF> <0C77> <666E> <0C78> <6670> <0C79> <6674> <0C7A> <6676> <0C7B> <666F> <0C7C> <6691> <0C7D> <667A> <0C7E> <667E> <0C7F> <6677> <0C82> <671F> <0C83> <671D> <0C84> <68FA> <0C85> <68D5> <0C86> <68E0> <0C87> <68D8> <0C88> <68D7> <0C89> <6905> <0C8A> <68DF> <0C8B> <68F5> <0C8C> <68EE> <0C8D> <68E7> <0C8E> <68F9> <0C8F> <68D2> <0C90> <68F2> <0C91> <68E3> <0C92> <68CB> <0C93> <68CD> <0C94> <690D> <0C95> <6912> <0C96> <690E> <0C97> <68C9> <0C98> <68DA> <0C99> <696E> <0C9A> <68FB> <0C9B> <6B3E> <0C9C> <6B3A> <0C9D> <6B3D> <0C9E> <6B98> <0C9F> <6B96> <0CA0> <6BBC> <0CA1> <6BEF> <0CA4> <6C2C> <0CA5> <6E2F> <0CA6> <6E38> <0CA7> <6E54> <0CA8> <6E21> <0CA9> <6E32> <0CAA> <6E67> <0CAB> <6E4A> <0CAC> <6E20> <0CAD> <6E25> <0CAE> <6E23> <0CAF> <6E1B> <0CB0> <6E5B> <0CB1> <6E58> <0CB2> <6E24> <0CB3> <6E56> <0CB4> <6E6E> <0CB5> <6E2D> <0CB6> <6E26> <0CB7> <6E6F> <0CB8> <6E34> <0CB9> <6E4D> <0CBA> <6E3A> <0CBB> <6E2C> <0CBC> <6E43> <0CBD> <6E1D> endbfchar 100 beginbfchar <0CBE> <6E3E> <0CBF> <6ECB> <0CC0> <6E89> <0CC1> <6E19> <0CC2> <6E4E> <0CC3> <6E63> <0CC4> <6E44> <0CC5> <6E72> <0CC6> <6E69> <0CC7> <6E5F> <0CCA> <7126> <0CCB> <7130> <0CCC> <7121> <0CCD> <7136> <0CCE> <716E> <0CCF> <711C> <0CD0> <724C> <0CD1> <7284> <0CD2> <7280> <0CD3> <7336> <0CD4> <7325> <0CD5> <7334> <0CD6> <7329> <0CD7> <743A> <0CD8> <742A> <0CD9> <7433> <0CDA> <7422> <0CDB> <7425> <0CDE> <7434> <0CDF> <742F> <0CE0> <741B> <0CE1> <7426> <0CE2> <7428> <0CE5> <756B> <0CE6> <756A> <0CE7> <75E2> <0CE8> <75DB> <0CE9> <75E3> <0CEA> <75D9> <0CEB> <75D8> <0CEC> <75DE> <0CED> <75E0> <0CF0> <7696> <0CF1> <7693> <0CF2> <76B4> <0CF3> <76DC> <0CF4> <774F> <0CF5> <77ED> <0CF6> <785D> <0CF7> <786C> <0CF8> <786F> <0CF9> <7A0D> <0CFA> <7A08> <0CFB> <7A0B> <0CFC> <7A05> <0CFD> <7A00> <0CFE> <7A98> <0CFF> <7A97> <0D00> <7A96> <0D01> <7AE5> <0D02> <7AE3> <0D03> <7B49> <0D04> <7B56> <0D05> <7B46> <0D06> <7B50> <0D07> <7B52> <0D08> <7B54> <0D09> <7B4D> <0D0A> <7B4B> <0D0B> <7B4F> <0D0C> <7B51> <0D0D> <7C9F> <0D0E> <7CA5> <0D0F> <7D5E> <0D10> <7D50> <0D11> <7D68> <0D12> <7D55> <0D13> <7D2B> <0D14> <7D6E> <0D15> <7D72> <0D16> <7D61> <0D17> <7D66> <0D18> <7D62> <0D19> <7D70> <0D1A> <7D73> <0D1B> <5584> <0D1E> <800B> <0D1F> <8052> <0D20> <8085> <0D21> <8155> <0D22> <8154> <0D23> <814B> <0D24> <8151> <0D25> <814E> <0D26> <8139> <0D27> <8146> <0D28> <813E> <0D29> <814C> <0D2A> <8153> <0D2B> <8174> endbfchar 100 beginbfchar <0D2C> <8212> <0D2D> <821C> <0D2E> <83E9> <0D2F> <8403> <0D30> <83F8> <0D31> <840D> <0D32> <83E0> <0D33> <83C5> <0D34> <840B> <0D35> <83C1> <0D36> <83EF> <0D37> <83F1> <0D38> <83F4> <0D39> <8457> <0D3A> <840A> <0D3B> <83F0> <0D3C> <840C> <0D3D> <83CC> <0D3E> <83FD> <0D3F> <83F2> <0D40> <83CA> <0D41> <8438> <0D42> <840E> <0D43> <8404> <0D44> <83DC> <0D45> <8407> <0D46> <83D4> <0D47> <83DF> <0D48> <865B> <0D49> <86DF> <0D4A> <86D9> <0D4B> <86ED> <0D4C> <86D4> <0D4D> <86DB> <0D4E> <86E4> <0D4F> <86D0> <0D50> <86DE> <0D51> <8857> <0D54> <88B1> <0D55> <8983> <0D56> <8996> <0D57> <8A3B> <0D58> <8A60> <0D59> <8A55> <0D5A> <8A5E> <0D5B> <8A3C> <0D5C> <8A41> <0D5D> <8A54> <0D5E> <8A5B> <0D5F> <8A50> <0D60> <8A46> <0D61> <8A34> <0D62> <8A3A> <0D63> <8A36> <0D64> <8A56> <0D65> <8C61> <0D66> <8C82> <0D67> <8CAF> <0D68> <8CBC> <0D69> <8CB3> <0D6A> <8CBD> <0D6B> <8CC1> <0D6C> <8CBB> <0D6D> <8CC0> <0D6E> <8CB4> <0D6F> <8CB7> <0D70> <8CB6> <0D71> <8CBF> <0D72> <8CB8> <0D73> <8D8A> <0D74> <8D85> <0D75> <8D81> <0D76> <8DCE> <0D77> <8DDD> <0D78> <8DCB> <0D79> <8DDA> <0D7A> <8DD1> <0D7B> <8DCC> <0D7C> <8DDB> <0D7D> <8DC6> <0D7E> <8EFB> <0D7F> <8EF8> <0D80> <8EFC> <0D81> <8F9C> <0D82> <902E> <0D83> <9035> <0D84> <9031> <0D85> <9038> <0D86> <9032> <0D87> <9036> <0D88> <9102> <0D89> <90F5> <0D8A> <9109> <0D8B> <90FE> <0D8C> <9163> <0D8D> <9165> <0D8E> <91CF> <0D91> <9223> <0D92> <9209> <0D93> <921E> endbfchar 100 beginbfchar <0D94> <920D> <0D95> <9210> <0D96> <9207> <0D97> <9211> <0D98> <9594> <0D99> <958F> <0D9A> <958B> <0D9B> <9591> <0D9C> <9593> <0D9D> <9592> <0D9E> <958E> <0D9F> <968A> <0DA0> <968E> <0DA1> <968B> <0DA2> <967D> <0DA5> <968D> <0DA6> <9672> <0DA7> <9684> <0DA8> <96C1> <0DA9> <96C5> <0DAA> <96C4> <0DAD> <96EF> <0DAE> <96F2> <0DAF> <97CC> <0DB2> <9808> <0DB3> <98E7> <0DB4> <98EA> <0DB5> <98EF> <0DB6> <98E9> <0DB7> <98F2> <0DB8> <98ED> <0DB9> <99AE> <0DBA> <99AD> <0DBB> <9EC3> <0DBC> <9ECD> <0DBD> <9ED1> <0DBE> <4E82> <0DBF> <50AD> <0DC0> <50B5> <0DC3> <50C5> <0DC4> <50BE> <0DC5> <50AC> <0DC6> <50B7> <0DC7> <50BB> <0DC8> <50AF> <0DC9> <50C7> <0DCA> <527F> <0DCB> <5277> <0DCC> <527D> <0DCD> <52DF> <0DCE> <52E6> <0DCF> <52E4> <0DD2> <532F> <0DD3> <55DF> <0DD4> <55E8> <0DD5> <55D3> <0DD6> <55E6> <0DD7> <55CE> <0DD8> <55DC> <0DD9> <55C7> <0DDA> <55D1> <0DDD> <55EF> <0DDE> <55DA> <0DDF> <55E1> <0DE2> <55E5> <0DE3> <55C9> <0DE6> <585E> <0DE7> <5851> <0DE8> <5858> <0DE9> <5857> <0DEA> <585A> <0DEB> <5854> <0DEC> <586B> <0DED> <584C> <0DEE> <586D> <0DEF> <584A> <0DF0> <5862> <0DF1> <5852> <0DF2> <584B> <0DF3> <5967> <0DF4> <5AC1> <0DF5> <5AC9> <0DF6> <5ACC> <0DF7> <5ABE> <0DF8> <5ABD> <0DF9> <5ABC> <0DFA> <5AB3> <0DFB> <5AC2> <0DFC> <5AB2> <0DFD> <5D69> <0DFE> <5D6F> <0DFF> <5E4C> <0E00> <5E79> <0E01> <5EC9> <0E02> <5EC8> <0E03> <5F12> <0E04> <5F59> <0E05> <5FAC> <0E06> <5FAE> <0E07> <611A> endbfchar 100 beginbfchar <0E08> <610F> <0E09> <6148> <0E0A> <611F> <0E0B> <60F3> <0E0C> <611B> <0E0D> <60F9> <0E0E> <6101> <0E0F> <6108> <0E10> <614E> <0E11> <614C> <0E12> <6144> <0E13> <614D> <0E14> <613E> <0E15> <6134> <0E16> <6127> <0E17> <610D> <0E18> <6106> <0E19> <6137> <0E1C> <6413> <0E1D> <643E> <0E1E> <641E> <0E1F> <642A> <0E20> <642D> <0E21> <643D> <0E22> <642C> <0E23> <640F> <0E24> <641C> <0E25> <6414> <0E26> <640D> <0E27> <6436> <0E2A> <6406> <0E2B> <656C> <0E2C> <659F> <0E2D> <65B0> <0E2E> <6697> <0E2F> <6689> <0E32> <6696> <0E33> <6684> <0E34> <6698> <0E35> <668D> <0E36> <6703> <0E37> <6994> <0E38> <696D> <0E39> <695A> <0E3A> <6977> <0E3B> <6960> <0E3C> <6954> <0E3D> <6975> <0E3E> <6930> <0E3F> <6982> <0E40> <694A> <0E41> <6968> <0E42> <696B> <0E43> <695E> <0E44> <6953> <0E45> <6979> <0E46> <6986> <0E47> <695D> <0E48> <6963> <0E49> <695B> <0E4A> <6B47> <0E4B> <6B72> <0E4C> <6BC0> <0E4D> <6BBF> <0E4E> <6BD3> <0E4F> <6BFD> <0E50> <6EA2> <0E51> <6EAF> <0E52> <6ED3> <0E53> <6EB6> <0E54> <6EC2> <0E55> <6E90> <0E56> <6E9D> <0E57> <6EC7> <0E58> <6EC5> <0E59> <6EA5> <0E5A> <6E98> <0E5B> <6EBC> <0E5C> <6EBA> <0E5D> <6EAB> <0E5E> <6ED1> <0E5F> <6E96> <0E60> <6E9C> <0E61> <6EC4> <0E62> <6ED4> <0E63> <6EAA> <0E64> <6EA7> <0E65> <6EB4> <0E66> <714E> <0E67> <7159> <0E68> <7169> <0E69> <7164> <0E6A> <7149> <0E6B> <7167> <0E6C> <715C> <0E6D> <716C> <0E6E> <7166> <0E6F> <714C> <0E70> <7165> <0E71> <715E> endbfchar 100 beginbfchar <0E72> <7146> <0E73> <7168> <0E74> <7156> <0E75> <723A> <0E76> <7252> <0E77> <7337> <0E78> <7345> <0E79> <733F> <0E7A> <733E> <0E7B> <746F> <0E7C> <745A> <0E7D> <7455> <0E7E> <745F> <0E7F> <745E> <0E80> <7441> <0E81> <743F> <0E82> <7459> <0E85> <7576> <0E86> <7578> <0E87> <7600> <0E88> <75F0> <0E89> <7601> <0E8A> <75F2> <0E8B> <75F1> <0E8C> <75FA> <0E8D> <75FF> <0E8E> <75F4> <0E8F> <75F3> <0E92> <775B> <0E93> <776B> <0E94> <7766> <0E95> <775E> <0E96> <7763> <0E97> <7779> <0E98> <776A> <0E99> <776C> <0E9A> <775C> <0E9B> <7765> <0E9C> <7768> <0E9D> <7762> <0E9E> <77EE> <0E9F> <788E> <0EA0> <78B0> <0EA3> <788C> <0EA4> <7889> <0EA5> <787C> <0EA6> <7891> <0EA7> <7893> <0EA8> <787F> <0EA9> <797A> <0EAA> <797F> <0EAB> <7981> <0EAC> <842C> <0EAD> <79BD> <0EAE> <7A1C> <0EAF> <7A1A> <0EB0> <7A20> <0EB1> <7A14> <0EB2> <7A1F> <0EB3> <7A1E> <0EB6> <7B77> <0EB7> <7BC0> <0EB8> <7B60> <0EB9> <7B6E> <0EBA> <7B67> <0EBB> <7CB1> <0EBC> <7CB3> <0EBD> <7CB5> <0EBE> <7D93> <0EBF> <7D79> <0EC0> <7D91> <0EC1> <7D81> <0EC2> <7D8F> <0EC3> <7D5B> <0EC4> <7F6E> <0EC7> <7F72> <0EC8> <7FA9> <0EC9> <7FA8> <0ECA> <7FA4> <0ECB> <8056> <0ECC> <8058> <0ECD> <8086> <0ECE> <8084> <0ECF> <8171> <0ED0> <8170> <0ED1> <8178> <0ED2> <8165> <0ED3> <816E> <0ED4> <8173> <0ED5> <816B> <0ED8> <8166> <0ED9> <8205> <0EDA> <8247> <0EDB> <8482> <0EDC> <8477> <0EDD> <843D> <0EDE> <8431> <0EDF> <8475> <0EE0> <8466> <0EE1> <846B> endbfchar 100 beginbfchar <0EE2> <8449> <0EE3> <846C> <0EE4> <845B> <0EE5> <843C> <0EE6> <8435> <0EE7> <8461> <0EE8> <8463> <0EE9> <8469> <0EEA> <846D> <0EEB> <8446> <0EEC> <865E> <0EED> <865C> <0EEE> <865F> <0EEF> <86F9> <0EF0> <8713> <0EF1> <8708> <0EF2> <8707> <0EF3> <8700> <0EF4> <86FE> <0EF5> <86FB> <0EF8> <8706> <0EF9> <870A> <0EFA> <8859> <0EFB> <88DF> <0EFC> <88D4> <0EFD> <88D9> <0EFE> <88DC> <0EFF> <88D8> <0F00> <88DD> <0F01> <88E1> <0F02> <88CA> <0F03> <88D5> <0F04> <88D2> <0F05> <899C> <0F06> <89E3> <0F07> <8A6B> <0F0A> <8A66> <0F0B> <8A69> <0F0C> <8A70> <0F0D> <8A87> <0F0E> <8A7C> <0F0F> <8A63> <0F10> <8AA0> <0F11> <8A71> <0F12> <8A85> <0F13> <8A6D> <0F14> <8A62> <0F15> <8A6E> <0F16> <8A6C> <0F17> <8A79> <0F18> <8A7B> <0F19> <8A3E> <0F1A> <8A68> <0F1B> <8C62> <0F1C> <8C8A> <0F1D> <8C89> <0F1E> <8CCA> <0F21> <8CC4> <0F22> <8CB2> <0F23> <8CC3> <0F24> <8CC2> <0F25> <8CC5> <0F26> <8DE1> <0F27> <8DDF> <0F28> <8DE8> <0F29> <8DEF> <0F2A> <8DF3> <0F2B> <8DFA> <0F2C> <8DEA> <0F2D> <8DE4> <0F2E> <8DE6> <0F2F> <8EB2> <0F30> <8F03> <0F31> <8F09> <0F32> <8EFE> <0F33> <8F0A> <0F34> <8F9F> <0F35> <8FB2> <0F36> <904B> <0F37> <904A> <0F38> <9053> <0F39> <9042> <0F3A> <9054> <0F3B> <903C> <0F3C> <9055> <0F3D> <9050> <0F3E> <9047> <0F3F> <904F> <0F40> <904E> <0F41> <904D> <0F42> <9051> <0F43> <903E> <0F44> <9041> <0F45> <9112> <0F46> <9117> <0F47> <916C> <0F48> <916A> <0F49> <9169> <0F4A> <91C9> <0F4B> <9237> endbfchar 100 beginbfchar <0F4C> <9257> <0F4D> <9238> <0F4E> <923D> <0F4F> <9240> <0F50> <923E> <0F51> <925B> <0F52> <924B> <0F53> <9264> <0F54> <9251> <0F55> <9234> <0F56> <9249> <0F57> <924D> <0F58> <9245> <0F59> <9239> <0F5A> <923F> <0F5B> <925A> <0F5C> <9598> <0F5D> <9698> <0F60> <96CD> <0F61> <96CB> <0F64> <96F7> <0F65> <96FB> <0F66> <96F9> <0F67> <96F6> <0F68> <9756> <0F69> <9774> <0F6A> <9776> <0F6D> <9813> <0F6E> <980A> <0F6F> <9812> <0F70> <980C> <0F71> <98FC> <0F72> <98F4> <0F75> <99B3> <0F76> <99B1> <0F77> <99B4> <0F78> <9AE1> <0F79> <9CE9> <0F7A> <9E82> <0F7B> <9F0E> <0F7C> <9F13> <0F7D> <9F20> <0F7E> <50E7> <0F7F> <50EE> <0F80> <50E5> <0F81> <50D6> <0F82> <50ED> <0F83> <50DA> <0F84> <50D5> <0F85> <50CF> <0F86> <50D1> <0F87> <50F1> <0F88> <50CE> <0F89> <50E9> <0F8A> <5162> <0F8B> <51F3> <0F8C> <5283> <0F8D> <5282> <0F8E> <5331> <0F8F> <53AD> <0F90> <55FE> <0F91> <5600> <0F92> <561B> <0F93> <5617> <0F94> <55FD> <0F95> <5614> <0F96> <5606> <0F97> <5609> <0F9A> <55F7> <0F9B> <5616> <0F9C> <561F> <0F9D> <5608> <0F9E> <5610> <0F9F> <55F6> <0FA0> <5718> <0FA1> <5716> <0FA2> <5875> <0FA3> <587E> <0FA4> <5883> <0FA5> <5893> <0FA6> <588A> <0FA7> <5879> <0FA8> <5885> <0FA9> <587D> <0FAA> <58FD> <0FAB> <5925> <0FAC> <5922> <0FAD> <5924> <0FAE> <596A> <0FAF> <5969> <0FB0> <5AE1> <0FB1> <5AE6> <0FB2> <5AE9> <0FB3> <5AD7> <0FB4> <5AD6> <0FB5> <5AD8> <0FB6> <5AE3> <0FB7> <5B75> <0FB8> <5BDE> <0FB9> <5BE7> endbfchar 100 beginbfchar <0FBA> <5BE1> <0FBD> <5BE8> <0FBE> <5BE2> <0FBF> <5BE4> <0FC0> <5BDF> <0FC1> <5C0D> <0FC2> <5C62> <0FC3> <5D84> <0FC4> <5D87> <0FC5> <5E5B> <0FC6> <5E63> <0FC7> <5E55> <0FC8> <5E57> <0FC9> <5E54> <0FCA> <5ED3> <0FCB> <5ED6> <0FCC> <5F0A> <0FCD> <5F46> <0FCE> <5F70> <0FCF> <5FB9> <0FD0> <6147> <0FD1> <613F> <0FD2> <614B> <0FD3> <6177> <0FD6> <615F> <0FD7> <615A> <0FD8> <6158> <0FD9> <6175> <0FDA> <622A> <0FDB> <6487> <0FDC> <6458> <0FDD> <6454> <0FDE> <64A4> <0FDF> <6478> <0FE0> <645F> <0FE1> <647A> <0FE2> <6451> <0FE3> <6467> <0FE4> <6434> <0FE5> <646D> <0FE6> <647B> <0FE7> <6572> <0FE8> <65A1> <0FE9> <65D7> <0FEA> <65D6> <0FEB> <66A2> <0FEC> <66A8> <0FED> <669D> <0FEE> <699C> <0FEF> <69A8> <0FF0> <6995> <0FF1> <69C1> <0FF2> <69AE> <0FF3> <69D3> <0FF4> <69CB> <0FF5> <699B> <0FF6> <69B7> <0FF7> <69BB> <0FF8> <69AB> <0FF9> <69B4> <0FFA> <69D0> <0FFB> <69CD> <0FFC> <69AD> <0FFD> <69CC> <0FFE> <69A6> <0FFF> <69C3> <1000> <69A3> <1001> <6B49> <1002> <6B4C> <1003> <6C33> <1004> <6F33> <1005> <6F14> <1006> <6EFE> <1007> <6F13> <1008> <6EF4> <1009> <6F29> <100A> <6F3E> <100B> <6F20> <100C> <6F2C> <100D> <6F0F> <100E> <6F02> <100F> <6F22> <1010> <6EFF> <1011> <6EEF> <1012> <6F06> <1013> <6F31> <1014> <6F38> <1015> <6F32> <1016> <6F23> <1017> <6F15> <1018> <6F2B> <1019> <6F2F> <101A> <6F88> <101B> <6F2A> <101C> <6EEC> <101D> <6F01> <101E> <6EF2> <101F> <6ECC> <1020> <6EF7> <1021> <7194> endbfchar 100 beginbfchar <1022> <7199> <1023> <717D> <1024> <718A> <1025> <7184> <1026> <7192> <1027> <723E> <1028> <7292> <1029> <7296> <102A> <7344> <102B> <7350> <102C> <7464> <102D> <7463> <102E> <746A> <102F> <7470> <1030> <746D> <1031> <7504> <1032> <7591> <1033> <7627> <1034> <760D> <1035> <760B> <1036> <7609> <1037> <7613> <1038> <76E1> <1039> <76E3> <103A> <7784> <103B> <777D> <103C> <777F> <103D> <7761> <103E> <78C1> <103F> <789F> <1040> <78A7> <1041> <78B3> <1042> <78A9> <1043> <78A3> <1046> <798D> <1047> <7A2E> <1048> <7A31> <1049> <7AAA> <104A> <7AA9> <104B> <7AED> <104C> <7AEF> <104D> <7BA1> <104E> <7B95> <104F> <7B8B> <1050> <7B75> <1051> <7B97> <1052> <7B9D> <1053> <7B94> <1054> <7B8F> <1055> <7BB8> <1056> <7B87> <1057> <7B84> <1058> <7CB9> <105B> <7DBB> <105C> <7DB0> <105D> <7D9C> <1060> <7DA0> <1061> <7DCA> <1062> <7DB4> <1063> <7DB2> <1064> <7DB1> <1065> <7DBA> <1066> <7DA2> <1067> <7DBF> <1068> <7DB5> <1069> <7DB8> <106A> <7DAD> <106B> <7DD2> <106C> <7DC7> <106D> <7DAC> <106E> <7F70> <1071> <7FDF> <1072> <805E> <1073> <805A> <1074> <8087> <1075> <8150> <1076> <8180> <1077> <818F> <1078> <8188> <1079> <818A> <107A> <817F> <107B> <8182> <107C> <81E7> <107D> <81FA> <107E> <8207> <107F> <8214> <1080> <821E> <1081> <824B> <1082> <84C9> <1083> <84BF> <1084> <84C6> <1085> <84C4> <1086> <8499> <1087> <849E> <1088> <84B2> <1089> <849C> <108A> <84CB> <108B> <84B8> <108C> <84C0> <108D> <84D3> endbfchar 100 beginbfchar <108E> <8490> <108F> <84BC> <1090> <84D1> <1091> <84CA> <1092> <873F> <1093> <871C> <1094> <873B> <1095> <8722> <1096> <8725> <1097> <8734> <1098> <8718> <1099> <8755> <109A> <8737> <109B> <8729> <109C> <88F3> <109D> <8902> <109E> <88F4> <109F> <88F9> <10A0> <88F8> <10A1> <88FD> <10A2> <88E8> <10A3> <891A> <10A4> <88EF> <10A5> <8AA6> <10A6> <8A8C> <10A7> <8A9E> <10A8> <8AA3> <10A9> <8A8D> <10AA> <8AA1> <10AB> <8A93> <10AC> <8AA4> <10AD> <8AAA> <10AE> <8AA5> <10AF> <8AA8> <10B0> <8A98> <10B1> <8A91> <10B2> <8A9A> <10B3> <8AA7> <10B4> <8C6A> <10B5> <8C8D> <10B6> <8C8C> <10B7> <8CD3> <10BA> <8D6B> <10BB> <8D99> <10BC> <8D95> <10BD> <8DFC> <10BE> <8F14> <10BF> <8F12> <10C0> <8F15> <10C1> <8F13> <10C2> <8FA3> <10C3> <9060> <10C4> <9058> <10C5> <905C> <10C6> <9063> <10C7> <9059> <10C8> <905E> <10C9> <9062> <10CA> <905D> <10CB> <905B> <10CC> <9119> <10CD> <9118> <10CE> <911E> <10CF> <9175> <10D0> <9178> <10D1> <9177> <10D2> <9174> <10D3> <9278> <10D4> <92AC> <10D5> <9280> <10D6> <9285> <10D7> <9298> <10D8> <9296> <10D9> <927B> <10DA> <9293> <10DB> <929C> <10DC> <92A8> <10DD> <927C> <10DE> <9291> <10DF> <95A1> <10E2> <95A3> <10E3> <95A5> <10E4> <95A4> <10E5> <9699> <10E6> <969C> <10E7> <969B> <10E8> <96CC> <10E9> <96D2> <10EA> <9700> <10EB> <977C> <10EC> <9785> <10ED> <97F6> <10F0> <98AF> <10F1> <98B1> <10F2> <9903> <10F3> <9905> <10F4> <990C> <10F5> <9909> <10F6> <99C1> <10F9> <9AE6> endbfchar 100 beginbfchar <10FC> <9CF4> <10FD> <9CF6> <10FE> <9CF3> <10FF> <9EBC> <1100> <9F3B> <1101> <9F4A> <1102> <5104> <1103> <5100> <1104> <50FB> <1105> <50F5> <1106> <50F9> <1107> <5102> <110A> <5105> <110B> <51DC> <110F> <528D> <1110> <528A> <1111> <52F0> <1112> <53B2> <1113> <562E> <1114> <563B> <1115> <5639> <1116> <5632> <1117> <563F> <1118> <5634> <1119> <5629> <111A> <5653> <111B> <564E> <111C> <5657> <111D> <5674> <111E> <5636> <1121> <5880> <1122> <589F> <1123> <589E> <1124> <58B3> <1125> <589C> <1126> <58AE> <1127> <58A9> <1128> <58A6> <1129> <596D> <112A> <5B09> <112B> <5AFB> <112C> <5B0B> <112D> <5AF5> <112E> <5B0C> <112F> <5B08> <1130> <5BEE> <1131> <5BEC> <1132> <5BE9> <1133> <5BEB> <1136> <5D9D> <1137> <5D94> <1138> <5E62> <1139> <5E5F> <113A> <5E61> <113B> <5EE2> <113C> <5EDA> <113D> <5EDF> <113E> <5EDD> <113F> <5EE3> <1140> <5EE0> <1141> <5F48> <1142> <5F71> <1143> <5FB7> <1144> <5FB5> <1145> <6176> <1146> <6167> <1147> <616E> <1148> <615D> <1149> <6155> <114A> <6182> <114B> <617C> <114C> <6170> <114D> <616B> <114E> <617E> <114F> <61A7> <1150> <6190> <1151> <61AB> <1152> <618E> <1153> <61AC> <1154> <619A> <1155> <61A4> <1156> <6194> <1157> <61AE> <1158> <622E> <1159> <6469> <115A> <646F> <115B> <6479> <115C> <649E> <115D> <64B2> <115E> <6488> <115F> <6490> <1160> <64B0> <1161> <64A5> <1162> <6493> <1163> <6495> <1164> <64A9> <1165> <6492> <1166> <64AE> <1167> <64AD> <1168> <64AB> endbfchar 100 beginbfchar <1169> <649A> <116A> <64AC> <116B> <6499> <116C> <64A2> <116D> <64B3> <116E> <6575> <1171> <66AE> <1172> <66AB> <1173> <66B4> <1174> <66B1> <1175> <6A23> <1176> <6A1F> <1177> <69E8> <1178> <6A01> <1179> <6A1E> <117A> <6A19> <117B> <69FD> <117C> <6A21> <117D> <6A13> <117E> <6A0A> <117F> <69F3> <1180> <6A02> <1181> <6A05> <1182> <69ED> <1183> <6A11> <1184> <6B50> <1185> <6B4E> <1186> <6BA4> <1189> <6F3F> <118A> <6F7C> <118B> <6F84> <118C> <6F51> <118D> <6F66> <118E> <6F54> <118F> <6F86> <1190> <6F6D> <1191> <6F5B> <1192> <6F78> <1193> <6F6E> <1194> <6F8E> <1195> <6F7A> <1196> <6F70> <1197> <6F64> <1198> <6F97> <1199> <6F58> <119A> <6ED5> <119B> <6F6F> <119C> <6F60> <119D> <6F5F> <119E> <719F> <119F> <71AC> <11A0> <71B1> <11A1> <71A8> <11A2> <7256> <11A3> <729B> <11A4> <734E> <11A5> <7357> <11A6> <7469> <11A7> <748B> <11A8> <7483> <11A9> <747E> <11AA> <7480> <11AB> <757F> <11AC> <7620> <11AD> <7629> <11AE> <761F> <11AF> <7624> <11B0> <7626> <11B3> <769A> <11B4> <76BA> <11B5> <76E4> <11B6> <778E> <11B7> <7787> <11B8> <778C> <11B9> <7791> <11BA> <778B> <11BB> <78CB> <11BC> <78C5> <11BD> <78BA> <11BE> <78CA> <11BF> <78BE> <11C0> <78D5> <11C1> <78BC> <11C2> <78D0> <11C3> <7A3F> <11C4> <7A3C> <11C5> <7A40> <11C6> <7A3D> <11C7> <7A37> <11C8> <7A3B> <11C9> <7AAF> <11CA> <7AAE> <11CB> <7BAD> <11CC> <7BB1> <11CD> <7BC4> <11CE> <7BB4> <11D1> <7BC1> <11D2> <7BA0> <11D3> <7BCC> <11D4> <7CCA> endbfchar 100 beginbfchar <11D5> <7DE0> <11D6> <7DF4> <11D7> <7DEF> <11D8> <7DFB> <11D9> <7DD8> <11DA> <7DEC> <11DB> <7DDD> <11DC> <7DE8> <11DD> <7DE3> <11DE> <7DDA> <11DF> <7DDE> <11E0> <7DE9> <11E1> <7D9E> <11E2> <7DD9> <11E3> <7DF2> <11E4> <7DF9> <11E5> <7F75> <11E6> <7F77> <11E7> <7FAF> <11E8> <7FE9> <11E9> <8026> <11ED> <81A0> <11EE> <819A> <11EF> <8198> <11F0> <8517> <11F1> <853D> <11F2> <851A> <11F3> <84EE> <11F6> <8513> <11F7> <8511> <11F8> <8523> <11F9> <8521> <11FA> <8514> <11FB> <84EC> <11FC> <8525> <11FD> <84FF> <11FE> <8506> <11FF> <8782> <1200> <8774> <1201> <8776> <1202> <8760> <1203> <8766> <1204> <8778> <1205> <8768> <1206> <8759> <1207> <8757> <1208> <874C> <1209> <8753> <120A> <885B> <120B> <885D> <120C> <8910> <120D> <8907> <1210> <8915> <1211> <890A> <1212> <8ABC> <1213> <8AD2> <1214> <8AC7> <1215> <8AC4> <1216> <8A95> <1217> <8ACB> <1218> <8AF8> <1219> <8AB2> <121A> <8AC9> <121B> <8AC2> <121C> <8ABF> <121D> <8AB0> <121E> <8AD6> <121F> <8ACD> <1220> <8AB6> <1221> <8AB9> <1222> <8ADB> <1223> <8C4C> <1224> <8C4E> <1225> <8C6C> <1226> <8CE0> <1227> <8CDE> <1228> <8CE6> <1229> <8CE4> <122E> <8CDC> <122F> <8CEA> <1230> <8CE1> <1231> <8D6D> <1232> <8D9F> <1233> <8DA3> <1234> <8E2B> <1235> <8E10> <1236> <8E1D> <1237> <8E22> <1238> <8E0F> <1239> <8E29> <123A> <8E1F> <123B> <8E21> <123C> <8E1E> <123D> <8EBA> <123E> <8F1D> <123F> <8F1B> <1240> <8F1F> <1241> <8F29> <1242> <8F26> <1243> <8F2A> endbfchar 100 beginbfchar <1244> <8F1C> <1245> <8F1E> <1246> <8F25> <1247> <9069> <1248> <906E> <1249> <9068> <124A> <906D> <124B> <9077> <124C> <9130> <124D> <912D> <124E> <9127> <124F> <9131> <1250> <9187> <1251> <9189> <1252> <918B> <1253> <9183> <1254> <92C5> <1255> <92BB> <1256> <92B7> <1257> <92EA> <1258> <92E4> <1259> <92C1> <125A> <92B3> <125B> <92BC> <125C> <92D2> <125D> <92C7> <125E> <92F0> <125F> <92B2> <1260> <95AD> <1261> <95B1> <1262> <9704> <1265> <9709> <1266> <9760> <1267> <978D> <1268> <978B> <1269> <978F> <126A> <9821> <126B> <982B> <126C> <981C> <126D> <98B3> <126E> <990A> <126F> <9913> <1270> <9912> <1271> <9918> <1272> <99DD> <1273> <99D0> <1274> <99DF> <1275> <99DB> <1276> <99D1> <1277> <99D5> <1278> <99D2> <1279> <99D9> <127A> <9AB7> <127D> <9B27> <127E> <9B45> <127F> <9B44> <1280> <9B77> <1281> <9B6F> <1282> <9D06> <1283> <9D09> <1284> <9D03> <1285> <9EA9> <1286> <9EBE> <1287> <9ECE> <1288> <58A8> <1289> <9F52> <128A> <5112> <128B> <5118> <128C> <5114> <128D> <5110> <128E> <5115> <128F> <5180> <1290> <51AA> <1291> <51DD> <1292> <5291> <1293> <5293> <1294> <52F3> <1295> <5659> <1296> <566B> <1297> <5679> <1298> <5669> <1299> <5664> <129A> <5678> <129B> <566A> <129C> <5668> <129D> <5665> <129E> <5671> <129F> <566F> <12A0> <566C> <12A1> <5662> <12A2> <5676> <12A3> <58C1> <12A4> <58BE> <12A5> <58C7> <12A6> <58C5> <12A7> <596E> <12A8> <5B1D> <12A9> <5B34> <12AA> <5B78> <12AB> <5BF0> endbfchar 100 beginbfchar <12AC> <5C0E> <12AD> <5F4A> <12AE> <61B2> <12AF> <6191> <12B0> <61A9> <12B1> <618A> <12B2> <61CD> <12B3> <61B6> <12B4> <61BE> <12B5> <61CA> <12B6> <61C8> <12B7> <6230> <12B8> <64C5> <12B9> <64C1> <12BA> <64CB> <12BD> <64DA> <12BE> <64C4> <12BF> <64C7> <12C0> <64C2> <12C1> <64CD> <12C2> <64BF> <12C3> <64D2> <12C4> <64D4> <12C5> <64BE> <12C6> <6574> <12C7> <66C6> <12C8> <66C9> <12C9> <66B9> <12CA> <66C4> <12CB> <66C7> <12CC> <66B8> <12CD> <6A3D> <12CE> <6A38> <12CF> <6A3A> <12D0> <6A59> <12D1> <6A6B> <12D2> <6A58> <12D3> <6A39> <12D4> <6A44> <12D5> <6A62> <12D6> <6A61> <12D7> <6A4B> <12D8> <6A47> <12D9> <6A35> <12DA> <6A5F> <12DB> <6A48> <12DC> <6B59> <12DD> <6B77> <12DE> <6C05> <12DF> <6FC2> <12E0> <6FB1> <12E1> <6FA1> <12E2> <6FC3> <12E3> <6FA4> <12E4> <6FC1> <12E5> <6FA7> <12E6> <6FB3> <12E7> <6FC0> <12E8> <6FB9> <12E9> <6FB6> <12EA> <6FA6> <12EB> <6FA0> <12EC> <6FB4> <12ED> <71BE> <12EE> <71C9> <12EF> <71D0> <12F0> <71D2> <12F1> <71C8> <12F2> <71D5> <12F3> <71B9> <12F4> <71CE> <12F5> <71D9> <12F6> <71DC> <12F9> <7368> <12FA> <749C> <12FB> <74A3> <12FC> <7498> <12FD> <749F> <12FE> <749E> <12FF> <74E2> <1302> <7634> <1303> <7638> <1304> <763A> <1305> <76E7> <1306> <76E5> <1307> <77A0> <130A> <77A5> <130B> <78E8> <130C> <78DA> <130D> <78EC> <130E> <78E7> <130F> <79A6> <1312> <7A46> <1313> <7A4C> <1314> <7A4B> <1315> <7ABA> <1316> <7BD9> <1317> <7C11> <1318> <7BC9> <1319> <7BE4> endbfchar 100 beginbfchar <131A> <7BDB> <131B> <7BE1> <131C> <7BE9> <131D> <7BE6> <1320> <7E0A> <1321> <7E11> <1322> <7E08> <1323> <7E1B> <1324> <7E23> <1325> <7E1E> <1326> <7E1D> <1327> <7E09> <1328> <7E10> <1329> <7F79> <132A> <7FB2> <132D> <7FEE> <132E> <8028> <132F> <81B3> <1330> <81A9> <1331> <81A8> <1332> <81FB> <1333> <8208> <1336> <854A> <1337> <8559> <1338> <8548> <133B> <8543> <133C> <8549> <133D> <856D> <133E> <856A> <133F> <855E> <1340> <8783> <1341> <879F> <1342> <879E> <1343> <87A2> <1344> <878D> <1345> <8861> <1346> <892A> <1347> <8932> <1348> <8925> <1349> <892B> <134A> <8921> <134B> <89AA> <134C> <89A6> <134D> <8AE6> <134E> <8AFA> <134F> <8AEB> <1350> <8AF1> <1351> <8B00> <1352> <8ADC> <1353> <8AE7> <1354> <8AEE> <1355> <8AFE> <1358> <8AF7> <1359> <8AED> <135A> <8AF3> <135B> <8AF6> <135C> <8AFC> <135D> <8C6B> <135E> <8C6D> <135F> <8C93> <1360> <8CF4> <1361> <8E44> <1362> <8E31> <1363> <8E34> <1364> <8E42> <1365> <8E39> <1366> <8E35> <1367> <8F3B> <1368> <8F2F> <1369> <8F38> <136A> <8F33> <136B> <8FA8> <136C> <8FA6> <136D> <9075> <136E> <9074> <136F> <9078> <1370> <9072> <1371> <907C> <1372> <907A> <1373> <9134> <1374> <9192> <1375> <9320> <1376> <9336> <1377> <92F8> <1378> <9333> <1379> <932F> <137A> <9322> <137B> <92FC> <137C> <932B> <137D> <9304> <137E> <931A> <137F> <9310> <1380> <9326> <1381> <9321> <1382> <9315> <1383> <932E> <1384> <9319> <1385> <95BB> <1388> <96AA> <1389> <96D5> endbfchar 100 beginbfchar <138A> <970E> <138B> <9711> <138C> <9716> <138D> <970D> <138E> <9713> <138F> <970F> <1392> <9766> <1393> <9798> <1394> <9830> <1395> <9838> <1396> <983B> <1397> <9837> <1398> <982D> <1399> <9839> <139A> <9824> <139B> <9910> <139C> <9928> <139D> <991E> <139E> <991B> <139F> <9921> <13A0> <991A> <13A1> <99ED> <13A2> <99E2> <13A3> <99F1> <13A4> <9AB8> <13A5> <9ABC> <13A6> <9AFB> <13A7> <9AED> <13A8> <9B28> <13A9> <9B91> <13AA> <9D15> <13AB> <9D23> <13AC> <9D26> <13AD> <9D28> <13AE> <9D12> <13AF> <9D1B> <13B0> <9ED8> <13B1> <9ED4> <13B2> <9F8D> <13B3> <9F9C> <13B4> <512A> <13B5> <511F> <13B6> <5121> <13B7> <5132> <13B8> <52F5> <13B9> <568E> <13BA> <5680> <13BB> <5690> <13BC> <5685> <13BD> <5687> <13BE> <568F> <13BF> <58D5> <13C0> <58D3> <13C1> <58D1> <13C2> <58CE> <13C3> <5B30> <13C4> <5B2A> <13C5> <5B24> <13C6> <5B7A> <13C7> <5C37> <13C8> <5C68> <13C9> <5DBC> <13CA> <5DBA> <13CB> <5DBD> <13CC> <5DB8> <13CD> <5E6B> <13CE> <5F4C> <13CF> <5FBD> <13D0> <61C9> <13D1> <61C2> <13D2> <61C7> <13D3> <61E6> <13D4> <61CB> <13D5> <6232> <13D6> <6234> <13D7> <64CE> <13D8> <64CA> <13D9> <64D8> <13DA> <64E0> <13DB> <64F0> <13DC> <64E6> <13DD> <64EC> <13DE> <64F1> <13DF> <64E2> <13E0> <64ED> <13E3> <66D9> <13E4> <66D6> <13E5> <6A80> <13E6> <6A94> <13E7> <6A84> <13E8> <6AA2> <13E9> <6A9C> <13EA> <6ADB> <13EB> <6AA3> <13EC> <6A7E> <13ED> <6A97> <13EE> <6A90> <13EF> <6AA0> <13F0> <6B5C> <13F1> <6BAE> endbfchar 100 beginbfchar <13F2> <6BDA> <13F3> <6C08> <13F4> <6FD8> <13F5> <6FF1> <13F8> <6FDB> <13F9> <6FE4> <13FA> <6FEB> <13FB> <6FEF> <13FC> <6F80> <13FD> <6FEC> <13FE> <6FE1> <13FF> <6FE9> <1400> <6FD5> <1401> <6FEE> <1402> <6FF0> <1403> <71E7> <1404> <71DF> <1405> <71EE> <1406> <71E6> <1407> <71E5> <1408> <71ED> <1409> <71EC> <140A> <71F4> <140B> <71E0> <140C> <7235> <140D> <7246> <140E> <7370> <140F> <7372> <1410> <74A9> <1411> <74B0> <1412> <74A6> <1413> <74A8> <1414> <7646> <1415> <7642> <1416> <764C> <1417> <76EA> <1418> <77B3> <1419> <77AA> <141A> <77B0> <141B> <77AC> <141C> <77A7> <141D> <77AD> <141E> <77EF> <141F> <78F7> <1420> <78FA> <1421> <78F4> <1422> <78EF> <1423> <7901> <1424> <79A7> <1425> <79AA> <1426> <7A57> <1427> <7ABF> <1428> <7C07> <1429> <7C0D> <142A> <7BFE> <142B> <7BF7> <142C> <7C0C> <142D> <7BE0> <142E> <7CE0> <142F> <7CDC> <1430> <7CDE> <1431> <7CE2> <1432> <7CDF> <1433> <7CD9> <1434> <7CDD> <1435> <7E2E> <1436> <7E3E> <1437> <7E46> <1438> <7E37> <1439> <7E32> <143A> <7E43> <143B> <7E2B> <143C> <7E3D> <143D> <7E31> <143E> <7E45> <143F> <7E41> <1440> <7E34> <1441> <7E39> <1442> <7E48> <1443> <7E35> <1444> <7E3F> <1445> <7E2F> <1446> <7F44> <1447> <7FF3> <1448> <7FFC> <144B> <8070> <144C> <806F> <144D> <8073> <144E> <81C6> <144F> <81C3> <1450> <81BA> <1451> <81C2> <1452> <81C0> <1453> <81BF> <1454> <81BD> <1455> <81C9> <1456> <81BE> <1457> <81E8> <1458> <8209> <1459> <8271> endbfchar 100 beginbfchar <145A> <85AA> <145B> <8584> <145C> <857E> <145D> <859C> <145E> <8591> <145F> <8594> <1460> <85AF> <1461> <859B> <1462> <8587> <1463> <85A8> <1464> <858A> <1465> <85A6> <1466> <8667> <1467> <87C0> <1468> <87D1> <1469> <87B3> <146A> <87D2> <146B> <87C6> <146C> <87AB> <146D> <87BB> <146E> <87BA> <146F> <87C8> <1470> <87CB> <1471> <893B> <1472> <8936> <1473> <8944> <1474> <8938> <1475> <893D> <1476> <89AC> <1477> <8B0E> <1478> <8B17> <1479> <8B19> <147A> <8B1B> <147B> <8B0A> <147C> <8B20> <147D> <8B1D> <147E> <8B04> <147F> <8B10> <1480> <8C41> <1481> <8C3F> <1482> <8C73> <1483> <8CFA> <1484> <8CFD> <1485> <8CFC> <1486> <8CF8> <1487> <8CFB> <1488> <8DA8> <1489> <8E49> <148A> <8E4B> <148B> <8E48> <148C> <8E4A> <148D> <8F44> <148E> <8F3E> <148F> <8F42> <1490> <8F45> <1491> <8F3F> <1492> <907F> <1493> <907D> <1494> <9084> <1497> <9080> <1498> <9139> <1499> <91A3> <149A> <919E> <149B> <919C> <149C> <934D> <149D> <9382> <149E> <9328> <149F> <9375> <14A0> <934A> <14A1> <9365> <14A2> <934B> <14A3> <9318> <14A4> <937E> <14A5> <936C> <14A6> <935B> <14A7> <9370> <14A8> <935A> <14A9> <9354> <14AD> <95C8> <14AE> <95C6> <14AF> <96B1> <14B0> <96B8> <14B1> <96D6> <14B2> <971C> <14B3> <971E> <14B4> <97A0> <14B5> <97D3> <14B6> <9846> <14B7> <98B6> <14B8> <9935> <14B9> <9A01> <14BA> <99FF> <14BB> <9BAE> <14BC> <9BAB> <14BD> <9BAA> <14BE> <9BAD> <14BF> <9D3B> <14C0> <9D3F> <14C1> <9E8B> <14C2> <9ECF> endbfchar 100 beginbfchar <14C3> <9EDE> <14C6> <9EDB> <14C7> <9F3E> <14C8> <9F4B> <14C9> <53E2> <14CA> <5695> <14CB> <56AE> <14CC> <58D9> <14CD> <58D8> <14CE> <5B38> <14CF> <5F5D> <14D0> <61E3> <14D1> <6233> <14D2> <64F4> <14D3> <64F2> <14D4> <64FE> <14D5> <6506> <14D8> <64F7> <14D9> <65B7> <14DA> <66DC> <14DB> <6726> <14DC> <6AB3> <14DD> <6AAC> <14DE> <6AC3> <14DF> <6ABB> <14E0> <6AB8> <14E1> <6AC2> <14E4> <6B5F> <14E5> <6B78> <14E6> <6BAF> <14E7> <7009> <14E8> <700B> <14E9> <6FFE> <14EA> <7006> <14EB> <6FFA> <14EC> <7011> <14ED> <700F> <14F0> <71FE> <14F1> <71F8> <14F2> <7377> <14F3> <7375> <14F4> <74A7> <14F5> <74BF> <14F6> <7515> <14F7> <7656> <14F8> <7658> <14F9> <7652> <14FA> <77BD> <14FB> <77BF> <14FE> <790E> <14FF> <79AE> <1502> <7A60> <1505> <7C2B> <1506> <7C27> <1507> <7C2A> <1508> <7C1E> <1509> <7C23> <150A> <7C21> <150B> <7CE7> <150E> <7E5E> <150F> <7E5A> <1510> <7E61> <1511> <7E52> <1512> <7E59> <1513> <7F48> <1514> <7FF9> <1515> <7FFB> <1516> <8077> <1517> <8076> <1518> <81CD> <1519> <81CF> <151A> <820A> <151B> <85CF> <151C> <85A9> <151D> <85CD> <151E> <85D0> <151F> <85C9> <1520> <85B0> <1521> <85BA> <1522> <85B9> <1523> <87EF> <1524> <87EC> <1525> <87F2> <1526> <87E0> <1527> <8986> <1528> <89B2> <1529> <89F4> <152A> <8B28> <152B> <8B39> <152C> <8B2C> <152D> <8B2B> <152E> <8C50> <152F> <8D05> <1530> <8E59> <1531> <8E63> <1532> <8E66> <1533> <8E64> <1534> <8E5F> <1535> <8E55> <1536> <8EC0> endbfchar 100 beginbfchar <1537> <8F49> <1538> <8F4D> <1539> <9087> <153A> <9083> <153B> <9088> <153E> <91D0> <153F> <9394> <1540> <938A> <1541> <9396> <1542> <93A2> <1543> <93B3> <1544> <93AE> <1545> <93AC> <1546> <93B0> <1547> <9398> <1548> <939A> <1549> <9397> <154A> <95D4> <154B> <95D6> <154C> <95D0> <154D> <95D5> <154E> <96E2> <154F> <96DC> <1550> <96D9> <1551> <96DB> <1552> <96DE> <1553> <9724> <1554> <97A3> <1555> <97A6> <1556> <97AD> <1557> <97F9> <1558> <984D> <1559> <984F> <155A> <984C> <155B> <984E> <155C> <9853> <155D> <98BA> <1560> <993D> <1561> <992E> <1562> <99A5> <1563> <9A0E> <1564> <9AC1> <1565> <9B03> <1566> <9B06> <1567> <9B4F> <1568> <9B4E> <1569> <9B4D> <156A> <9BCA> <156B> <9BC9> <156C> <9BFD> <156D> <9BC8> <156E> <9BC0> <156F> <9D51> <1570> <9D5D> <1571> <9D60> <1572> <9EE0> <1573> <9F15> <1574> <9F2C> <1575> <5133> <1576> <56A5> <1577> <56A8> <157A> <58E2> <157B> <5BF5> <157C> <9F90> <157D> <5EEC> <157E> <61F2> <157F> <61F7> <1580> <61F6> <1581> <61F5> <1582> <6500> <1583> <650F> <1584> <66E0> <1585> <66DD> <1586> <6AE5> <1587> <6ADD> <1588> <6ADA> <1589> <6AD3> <158A> <701B> <158B> <701F> <158C> <7028> <158D> <701A> <158E> <701D> <158F> <7015> <1590> <7018> <1591> <7206> <1592> <720D> <1593> <7258> <1594> <72A2> <1595> <7378> <1596> <737A> <1597> <74BD> <1598> <74CA> <1599> <74E3> <159A> <7587> <159B> <7586> <159C> <765F> <159D> <7661> <159E> <77C7> <159F> <7919> <15A0> <79B1> endbfchar 100 beginbfchar <15A1> <7A6B> <15A2> <7A69> <15A5> <7C38> <15A6> <7C3D> <15A7> <7C37> <15A8> <7C40> <15A9> <7E6B> <15AA> <7E6D> <15AB> <7E79> <15AE> <7E73> <15AF> <7F85> <15B0> <7FB6> <15B1> <7FB9> <15B2> <7FB8> <15B3> <81D8> <15B4> <85E9> <15B5> <85DD> <15B6> <85EA> <15B7> <85D5> <15BA> <85F7> <15BB> <87FB> <15BC> <8805> <15BD> <880D> <15BE> <87F9> <15BF> <87FE> <15C0> <8960> <15C1> <895F> <15C2> <8956> <15C3> <895E> <15C4> <8B41> <15C5> <8B5C> <15C6> <8B58> <15C7> <8B49> <15C8> <8B5A> <15CB> <8B46> <15CC> <8B59> <15CD> <8D08> <15CE> <8D0A> <15CF> <8E7C> <15D0> <8E72> <15D1> <8E87> <15D2> <8E76> <15D3> <8E6C> <15D4> <8E7A> <15D5> <8E74> <15D6> <8F54> <15D7> <8F4E> <15D8> <8FAD> <15DB> <91B1> <15DC> <91AE> <15DD> <93E1> <15DE> <93D1> <15DF> <93DF> <15E0> <93C3> <15E1> <93C8> <15E4> <93D6> <15E5> <93E2> <15E6> <93CD> <15E7> <93D8> <15E8> <93E4> <15E9> <93D7> <15EA> <93E8> <15EB> <95DC> <15EC> <96B4> <15ED> <96E3> <15EE> <972A> <15EF> <9727> <15F0> <9761> <15F1> <97DC> <15F2> <97FB> <15F3> <985E> <15F4> <9858> <15F5> <985B> <15F6> <98BC> <15F7> <9945> <15F8> <9949> <15F9> <9A16> <15FA> <9A19> <15FB> <9B0D> <15FC> <9BE8> <15FD> <9BE7> <15FE> <9BD6> <15FF> <9BDB> <1600> <9D89> <1601> <9D61> <1602> <9D72> <1603> <9D6A> <1604> <9D6C> <1605> <9E92> <1606> <9E97> <1607> <9E93> <1608> <9EB4> <1609> <52F8> <160A> <56B7> <160B> <56B6> <160C> <56B4> <160D> <56BC> <160E> <58E4> <160F> <5B40> <1610> <5B43> endbfchar 100 beginbfchar <1611> <5B7D> <1612> <5BF6> <1613> <5DC9> <1614> <61F8> <1615> <61FA> <1616> <6518> <1617> <6514> <1618> <6519> <1619> <66E6> <161A> <6727> <161B> <6AEC> <161C> <703E> <161D> <7030> <161E> <7032> <161F> <7210> <1620> <737B> <1621> <74CF> <1622> <7662> <1623> <7665> <1624> <7926> <1625> <792A> <1626> <792C> <1627> <792B> <1628> <7AC7> <1629> <7AF6> <162A> <7C4C> <162B> <7C43> <162C> <7C4D> <162F> <8FAE> <1630> <7E7D> <1631> <7E7C> <1632> <7E82> <1633> <7F4C> <1634> <8000> <1635> <81DA> <1636> <8266> <1637> <85FB> <1638> <85F9> <1639> <8611> <163A> <85FA> <163B> <8606> <163C> <860B> <163D> <8607> <163E> <860A> <1641> <8964> <1642> <89BA> <1643> <89F8> <1644> <8B70> <1645> <8B6C> <1646> <8B66> <1647> <8B6F> <1648> <8B5F> <1649> <8B6B> <164A> <8D0F> <164B> <8D0D> <164C> <8E89> <164D> <8E81> <164E> <8E85> <164F> <8E82> <1650> <91B4> <1651> <91CB> <1652> <9418> <1653> <9403> <1654> <93FD> <1655> <95E1> <1656> <9730> <1657> <98C4> <1658> <9952> <1659> <9951> <165A> <99A8> <165B> <9A2B> <165C> <9A30> <165D> <9A37> <165E> <9A35> <165F> <9C13> <1660> <9C0D> <1661> <9E79> <1662> <9EB5> <1663> <9EE8> <1664> <9F2F> <1665> <9F5F> <1666> <9F63> <1667> <9F61> <166A> <56C1> <166B> <56C0> <166C> <56C2> <166D> <5914> <166E> <5C6C> <166F> <5DCD> <1670> <61FC> <1671> <61FE> <1672> <651D> <1673> <651C> <1674> <6595> <1675> <66E9> <1676> <6AFB> <1677> <6B04> <1678> <6AFA> <1679> <6BB2> <167A> <704C> endbfchar 100 beginbfchar <167B> <721B> <167C> <72A7> <167D> <74D6> <167E> <74D4> <167F> <7669> <1680> <77D3> <1681> <7C50> <1682> <7E8F> <1683> <7E8C> <1684> <7FBC> <1685> <8617> <1686> <862D> <1687> <861A> <1688> <8823> <1689> <8822> <168A> <8821> <168B> <881F> <168C> <896A> <168D> <896C> <168E> <89BD> <168F> <8B74> <1690> <8B77> <1691> <8B7D> <1692> <8D13> <1693> <8E8A> <1694> <8E8D> <1695> <8E8B> <1696> <8F5F> <1697> <8FAF> <1698> <91BA> <1699> <942E> <169A> <9433> <169B> <9435> <169C> <943A> <169D> <9438> <169E> <9432> <169F> <942B> <16A0> <95E2> <16A3> <9732> <16A4> <97FF> <16A5> <9867> <16A6> <9865> <16A7> <9957> <16A8> <9A45> <16A9> <9A43> <16AA> <9A40> <16AB> <9A3E> <16AC> <9ACF> <16AD> <9B54> <16AE> <9B51> <16AF> <9C2D> <16B0> <9C25> <16B1> <9DAF> <16B2> <9DB4> <16B3> <9DC2> <16B4> <9DB8> <16B5> <9E9D> <16B6> <9EEF> <16B7> <9F19> <16B8> <9F5C> <16BB> <513C> <16BC> <513B> <16BD> <56C8> <16BE> <56CA> <16BF> <56C9> <16C0> <5B7F> <16C1> <5DD4> <16C2> <5DD2> <16C3> <5F4E> <16C4> <61FF> <16C5> <6524> <16C6> <6B0A> <16C7> <6B61> <16C8> <7051> <16C9> <7058> <16CA> <7380> <16CB> <74E4> <16CC> <758A> <16CD> <766E> <16CE> <766C> <16CF> <79B3> <16D0> <7C60> <16D1> <7C5F> <16D2> <807E> <16D3> <807D> <16D4> <81DF> <16D5> <8972> <16D6> <896F> <16D7> <89FC> <16D8> <8B80> <16DB> <8E91> <16DC> <8E93> <16DD> <8F61> <16DE> <9148> <16DF> <9444> <16E4> <97C3> <16E5> <97C1> <16E6> <986B> <16E7> <9955> <16E8> <9A55> endbfchar 100 beginbfchar <16E9> <9A4D> <16EA> <9AD2> <16EB> <9B1A> <16EC> <9C49> <16ED> <9C31> <16EE> <9C3E> <16EF> <9C3B> <16F0> <9DD3> <16F1> <9DD7> <16F2> <9F34> <16F3> <9F6C> <16F4> <9F6A> <16F5> <9F94> <16F6> <56CC> <16F7> <5DD6> <16F8> <6200> <16F9> <6523> <16FA> <652B> <16FB> <652A> <16FC> <66EC> <16FD> <6B10> <16FE> <74DA> <16FF> <7ACA> <1700> <7C64> <1701> <7C63> <1702> <7C65> <1703> <7E93> <1704> <7E96> <1705> <7E94> <1706> <81E2> <1707> <8638> <1708> <863F> <1709> <8831> <170A> <8B8A> <170B> <9090> <170C> <908F> <170D> <9463> <170E> <9460> <170F> <9464> <1710> <9768> <1711> <986F> <1712> <995C> <1715> <9A57> <1718> <9AD1> <1719> <9C54> <171A> <9C57> <171B> <9C56> <171C> <9DE5> <171D> <9E9F> <171E> <9EF4> <171F> <56D1> <1720> <58E9> <1721> <652C> <1722> <705E> <1725> <77D7> <1726> <7F50> <1727> <7F88> <1728> <8836> <1729> <8839> <172A> <8862> <172B> <8B93> <172C> <8B92> <172D> <8B96> <172E> <8277> <172F> <8D1B> <1730> <91C0> <1731> <946A> <1732> <9742> <1733> <9748> <1734> <9744> <1735> <97C6> <1736> <9870> <1737> <9A5F> <1738> <9B22> <1739> <9B58> <173A> <9C5F> <173F> <9F07> <1740> <9F77> <1741> <9F72> <1742> <5EF3> <1743> <6B16> <1744> <7063> <1745> <7C6C> <1746> <7C6E> <1747> <883B> <1748> <89C0> <1749> <8EA1> <174A> <91C1> <174B> <9472> <174C> <9470> <174D> <9871> <174E> <995E> <174F> <9AD6> <1750> <9B23> <1751> <9ECC> <1752> <7064> <1753> <77DA> <1754> <8B9A> <1755> <9477> <1756> <97C9> endbfchar 100 beginbfchar <1757> <9A62> <1758> <9A65> <1759> <7E9C> <175A> <8B9C> <175B> <8EAA> <175C> <91C5> <175F> <947C> <1762> <9EF7> <1763> <8C54> <1764> <947F> <1765> <9E1A> <1766> <7228> <1767> <9A6A> <1768> <9B31> <1769> <9E1B> <176A> <9E1E> <176B> <7C72> <176C> <4E42> <176D> <4E5C> <176E> <51F5> <176F> <531A> <1770> <5382> <1771> <4E07> <1772> <4E0C> <1773> <4E47> <1774> <4E8D> <1775> <56D7> <1776> <5C6E> <1777> <5F73> <1778> <4E0F> <1779> <5187> <177A> <4E0E> <177B> <4E2E> <177C> <4E93> <177D> <4EC2> <177E> <4EC9> <177F> <4EC8> <1780> <5198> <1781> <52FC> <1782> <536C> <1783> <53B9> <1784> <5720> <1785> <5903> <1786> <592C> <1787> <5C10> <1788> <5DFF> <1789> <65E1> <178A> <6BB3> <178B> <6BCC> <178C> <6C14> <178D> <723F> <178E> <4E31> <178F> <4E3C> <1790> <4EE8> <1791> <4EDC> <1792> <4EE9> <1793> <4EE1> <1794> <4EDD> <1795> <4EDA> <1796> <520C> <1797> <5209> <1798> <531C> <1799> <534C> <179C> <5917> <179D> <592F> <179E> <5B81> <179F> <5B84> <17A0> <5C12> <17A1> <5C3B> <17A2> <5C74> <17A3> <5C73> <17A4> <5E04> <17A5> <5E80> <17A6> <5E82> <17A7> <5FC9> <17A8> <6209> <17A9> <6250> <17AA> <6C15> <17AB> <6C36> <17AC> <6C43> <17AD> <6C3F> <17AE> <6C3B> <17AF> <72AE> <17B0> <72B0> <17B1> <738A> <17B2> <79B8> <17B3> <808A> <17B4> <961E> <17B5> <4F0E> <17B6> <4F18> <17B7> <4F2C> <17B8> <4EF5> <17B9> <4F14> <17BA> <4EF1> <17BB> <4F00> <17BC> <4EF7> <17BD> <4F08> <17BE> <4F1D> <17BF> <4F02> <17C0> <4F05> endbfchar 100 beginbfchar <17C1> <4F22> <17C2> <4F13> <17C3> <4F04> <17C4> <4EF4> <17C5> <4F12> <17C6> <51B1> <17C7> <5213> <17C8> <5210> <17C9> <52A6> <17CA> <5322> <17CB> <531F> <17CC> <534D> <17CD> <538A> <17CE> <5407> <17CF> <56E1> <17D0> <56DF> <17D1> <572E> <17D2> <572A> <17D3> <5734> <17D4> <593C> <17D5> <5980> <17D6> <597C> <17D7> <5985> <17D8> <597B> <17D9> <597E> <17DA> <5977> <17DB> <597F> <17DC> <5B56> <17DD> <5C15> <17DE> <5C25> <17DF> <5C7C> <17E2> <5C7E> <17E3> <5DDF> <17E4> <5E75> <17E5> <5E84> <17E6> <5F02> <17E7> <5F1A> <17E8> <5F74> <17E9> <5FD5> <17EA> <5FD4> <17EB> <5FCF> <17EC> <625C> <17ED> <625E> <17EE> <6264> <17EF> <6261> <17F0> <6266> <17F1> <6262> <17F2> <6259> <17F3> <6260> <17F4> <625A> <17F5> <6265> <17F6> <6537> <17F7> <65EF> <17F8> <65EE> <17F9> <673E> <17FA> <6739> <17FB> <6738> <17FC> <673B> <17FD> <673A> <17FE> <673F> <17FF> <673C> <1800> <6733> <1801> <6C18> <1802> <6C46> <1803> <6C52> <1804> <6C5C> <1805> <6C4F> <1806> <6C4A> <1807> <6C54> <180A> <7071> <180B> <725E> <180E> <738E> <180F> <752A> <1810> <767F> <1811> <7A75> <1812> <7F51> <1813> <8278> <1814> <827C> <1815> <8280> <1816> <827D> <1817> <827F> <1818> <864D> <1819> <897E> <181A> <9099> <181D> <909B> <181E> <9094> <181F> <9622> <1820> <9624> <1821> <9620> <1822> <9623> <1823> <4F56> <1824> <4F3B> <1825> <4F62> <1826> <4F49> <1827> <4F53> <1828> <4F64> <1829> <4F3E> <182A> <4F67> <182B> <4F52> <182C> <4F5F> endbfchar 100 beginbfchar <182D> <4F41> <182E> <4F58> <182F> <4F2D> <1830> <4F33> <1831> <4F3F> <1832> <4F61> <1833> <518F> <1834> <51B9> <1835> <521C> <1836> <521E> <1837> <5221> <183A> <5309> <183B> <5363> <183C> <5372> <183F> <5430> <1840> <5437> <1841> <542A> <1842> <5454> <1843> <5445> <1844> <5419> <1845> <541C> <1846> <5425> <1847> <5418> <1848> <543D> <1849> <544F> <184A> <5441> <184B> <5428> <184C> <5424> <184D> <5447> <184E> <56EE> <184F> <56E7> <1850> <56E5> <1851> <5741> <1852> <5745> <1853> <574C> <1854> <5749> <1855> <574B> <1856> <5752> <1857> <5906> <1858> <5940> <1859> <59A6> <185A> <5998> <185B> <59A0> <185C> <5997> <185D> <598E> <185E> <59A2> <185F> <5990> <1860> <598F> <1861> <59A7> <1862> <59A1> <1863> <5B8E> <1864> <5B92> <1865> <5C28> <1866> <5C2A> <1867> <5C8D> <1868> <5C8F> <1869> <5C88> <186A> <5C8B> <186B> <5C89> <186C> <5C92> <186D> <5C8A> <186E> <5C86> <186F> <5C93> <1870> <5C95> <1871> <5DE0> <1872> <5E0A> <1873> <5E0E> <1874> <5E8B> <1875> <5E89> <1876> <5E8C> <1877> <5E88> <1878> <5E8D> <1879> <5F05> <187A> <5F1D> <187B> <5F78> <187C> <5F76> <187D> <5FD2> <187E> <5FD1> <187F> <5FD0> <1880> <5FED> <1881> <5FE8> <1882> <5FEE> <1883> <5FF3> <1884> <5FE1> <1885> <5FE4> <1886> <5FE3> <1887> <5FFA> <1888> <5FEF> <1889> <5FF7> <188A> <5FFB> <188B> <6000> <188C> <5FF4> <188D> <623A> <188E> <6283> <188F> <628C> <1892> <6294> <1893> <6287> <1894> <6271> <1895> <627B> <1896> <627A> endbfchar 100 beginbfchar <1897> <6270> <1898> <6281> <1899> <6288> <189A> <6277> <189B> <627D> <189C> <6272> <189D> <6274> <189E> <65F0> <189F> <65F4> <18A0> <65F3> <18A1> <65F2> <18A2> <65F5> <18A3> <6745> <18A4> <6747> <18A5> <6759> <18A6> <6755> <18A7> <674C> <18A8> <6748> <18A9> <675D> <18AA> <674D> <18AB> <675A> <18AC> <674B> <18AD> <6BD0> <18B0> <6C78> <18B1> <6C67> <18B2> <6C6B> <18B3> <6C84> <18B4> <6C8B> <18B5> <6C8F> <18B6> <6C71> <18B7> <6C6F> <18B8> <6C69> <18B9> <6C9A> <18BA> <6C6D> <18BB> <6C87> <18BC> <6C95> <18BD> <6C9C> <18BE> <6C66> <18BF> <6C73> <18C0> <6C65> <18C1> <6C7B> <18C2> <6C8E> <18C3> <7074> <18C4> <707A> <18C5> <7263> <18C6> <72BF> <18C7> <72BD> <18C8> <72C3> <18C9> <72C6> <18CA> <72C1> <18CB> <72BA> <18CC> <72C5> <18CD> <7395> <18CE> <7397> <18D1> <7392> <18D2> <753A> <18D3> <7539> <18D6> <7681> <18D7> <793D> <18D8> <8034> <18D9> <8095> <18DA> <8099> <18DB> <8090> <18DC> <8092> <18DD> <809C> <18DE> <8290> <18DF> <828F> <18E0> <8285> <18E1> <828E> <18E2> <8291> <18E3> <8293> <18E4> <828A> <18E7> <8C78> <18E8> <8FC9> <18E9> <8FBF> <18EA> <909F> <18EB> <90A1> <18EC> <90A5> <18ED> <909E> <18EE> <90A7> <18EF> <90A0> <18F0> <9630> <18F1> <9628> <18F2> <962F> <18F3> <962D> <18F4> <4E33> <18F5> <4F98> <18F6> <4F7C> <18F7> <4F85> <18F8> <4F7D> <18F9> <4F80> <18FA> <4F87> <18FB> <4F76> <18FC> <4F74> <18FD> <4F89> <18FE> <4F84> <18FF> <4F77> <1900> <4F4C> <1901> <4F97> <1902> <4F6A> endbfchar 100 beginbfchar <1903> <4F9A> <1904> <4F79> <1905> <4F81> <1906> <4F78> <1907> <4F90> <1908> <4F9C> <1909> <4F94> <190A> <4F9E> <190B> <4F92> <190C> <4F82> <190D> <4F95> <190E> <4F6B> <190F> <4F6E> <1910> <519E> <1911> <51BC> <1912> <51BE> <1913> <5235> <1916> <5246> <1917> <5231> <1918> <52BC> <191B> <533C> <191C> <5392> <191D> <5394> <191E> <5487> <191F> <547F> <1920> <5481> <1921> <5491> <1922> <5482> <1923> <5488> <1924> <546B> <1925> <547A> <1926> <547E> <1927> <5465> <1928> <546C> <1929> <5474> <192A> <5466> <192B> <548D> <192C> <546F> <192D> <5461> <192E> <5460> <192F> <5498> <1930> <5463> <1931> <5467> <1932> <5464> <1933> <56F7> <1934> <56F9> <1935> <576F> <1936> <5772> <1937> <576D> <1938> <576B> <1939> <5771> <193A> <5770> <193B> <5776> <193C> <5780> <193D> <5775> <193E> <577B> <1941> <5762> <1942> <5768> <1943> <577D> <1944> <590C> <1945> <5945> <1946> <59B5> <1947> <59BA> <1948> <59CF> <1949> <59CE> <194A> <59B2> <194B> <59CC> <194C> <59C1> <194D> <59B6> <194E> <59BC> <194F> <59C3> <1950> <59D6> <1951> <59B1> <1952> <59BD> <1953> <59C0> <1954> <59C8> <1955> <59B4> <1956> <59C7> <1957> <5B62> <1958> <5B65> <1959> <5B93> <195A> <5B95> <195B> <5C44> <195C> <5C47> <195D> <5CAE> <195E> <5CA4> <195F> <5CA0> <1960> <5CB5> <1961> <5CAF> <1962> <5CA8> <1963> <5CAC> <1964> <5C9F> <1965> <5CA3> <1966> <5CAD> <1967> <5CA2> <1968> <5CAA> <1969> <5CA7> <196A> <5C9D> <196B> <5CA5> <196C> <5CB6> endbfchar 100 beginbfchar <196D> <5CB0> <196E> <5CA6> <196F> <5E17> <1970> <5E14> <1971> <5E19> <1972> <5F28> <1976> <5F54> <1977> <5F82> <1978> <5F7E> <1979> <5F7D> <197A> <5FDE> <197B> <5FE5> <197C> <602D> <197D> <6026> <197E> <6019> <197F> <6032> <1980> <600B> <1981> <6034> <1982> <600A> <1983> <6017> <1984> <6033> <1985> <601A> <1986> <601E> <1987> <602C> <1988> <6022> <1989> <600D> <198A> <6010> <198B> <602E> <198C> <6013> <198D> <6011> <198E> <600C> <198F> <6009> <1990> <601C> <1991> <6214> <1992> <623D> <1993> <62AD> <1994> <62B4> <1995> <62D1> <1996> <62BE> <1997> <62AA> <1998> <62B6> <1999> <62CA> <199A> <62AE> <199B> <62B3> <199C> <62AF> <199D> <62BB> <199E> <62A9> <199F> <62B0> <19A0> <62B8> <19A1> <653D> <19A2> <65A8> <19A3> <65BB> <19A4> <6609> <19A5> <65FC> <19A6> <6604> <19A7> <6612> <19A8> <6608> <19A9> <65FB> <19AA> <6603> <19AB> <660B> <19AC> <660D> <19AD> <6605> <19AE> <65FD> <19AF> <6611> <19B0> <6610> <19B1> <66F6> <19B2> <670A> <19B3> <6785> <19B4> <676C> <19B5> <678E> <19B6> <6792> <19B7> <6776> <19B8> <677B> <19B9> <6798> <19BA> <6786> <19BB> <6784> <19BC> <6774> <19BD> <678D> <19BE> <678C> <19BF> <677A> <19C0> <679F> <19C1> <6791> <19C2> <6799> <19C3> <6783> <19C4> <677D> <19C5> <6781> <19C8> <6794> <19C9> <6B25> <19CA> <6B80> <19CB> <6B7E> <19CC> <6BDE> <19CD> <6C1D> <19CE> <6C93> <19CF> <6CEC> <19D0> <6CEB> <19D1> <6CEE> <19D2> <6CD9> <19D3> <6CB6> <19D4> <6CD4> <19D5> <6CAD> endbfchar 100 beginbfchar <19D6> <6CE7> <19D7> <6CB7> <19D8> <6CD0> <19D9> <6CC2> <19DA> <6CBA> <19DB> <6CC3> <19DC> <6CC6> <19DD> <6CED> <19DE> <6CF2> <19DF> <6CD2> <19E0> <6CDD> <19E1> <6CB4> <19E2> <6C8A> <19E3> <6C9D> <19E4> <6C80> <19E5> <6CDE> <19E6> <6CC0> <19E7> <6D30> <19E8> <6CCD> <19E9> <6CC7> <19EA> <6CB0> <19EB> <6CF9> <19EC> <6CCF> <19ED> <6CE9> <19EE> <6CD1> <19EF> <7094> <19F0> <7098> <19F1> <7085> <19F2> <7093> <19F3> <7086> <19F4> <7084> <19F5> <7091> <19F6> <7096> <19F7> <7082> <19F8> <709A> <19F9> <7083> <19FA> <726A> <19FB> <72D6> <19FC> <72CB> <19FD> <72D8> <19FE> <72C9> <19FF> <72DC> <1A00> <72D2> <1A01> <72D4> <1A02> <72DA> <1A03> <72CC> <1A04> <72D1> <1A05> <73A4> <1A06> <73A1> <1A07> <73AD> <1A08> <73A6> <1A09> <73A2> <1A0A> <73A0> <1A0B> <73AC> <1A0C> <739D> <1A0D> <74DD> <1A0E> <74E8> <1A11> <753E> <1A12> <758C> <1A13> <7598> <1A14> <76AF> <1A15> <76F3> <1A16> <76F1> <1A17> <76F0> <1A18> <76F5> <1A19> <77F8> <1A1A> <77FC> <1A1B> <77F9> <1A1C> <77FB> <1A1D> <77FA> <1A1E> <77F7> <1A1F> <7942> <1A20> <793F> <1A21> <79C5> <1A22> <7A78> <1A23> <7A7B> <1A24> <7AFB> <1A25> <7C75> <1A26> <7CFD> <1A27> <8035> <1A28> <808F> <1A29> <80AE> <1A2A> <80A3> <1A2B> <80B8> <1A2C> <80B5> <1A2D> <80AD> <1A2E> <8220> <1A2F> <82A0> <1A30> <82C0> <1A31> <82AB> <1A32> <829A> <1A33> <8298> <1A34> <829B> <1A35> <82B5> <1A36> <82A7> <1A37> <82AE> <1A38> <82BC> <1A39> <829E> <1A3A> <82BA> <1A3B> <82B4> endbfchar 100 beginbfchar <1A3C> <82A8> <1A3D> <82A1> <1A3E> <82A9> <1A3F> <82C2> <1A40> <82A4> <1A41> <82C3> <1A42> <82B6> <1A43> <82A2> <1A44> <8670> <1A45> <866F> <1A48> <8C56> <1A49> <8FD2> <1A4A> <8FCB> <1A4B> <8FD3> <1A4C> <8FCD> <1A4D> <8FD6> <1A4E> <8FD5> <1A4F> <8FD7> <1A50> <90B2> <1A51> <90B4> <1A52> <90AF> <1A53> <90B3> <1A54> <90B0> <1A55> <9639> <1A56> <963D> <1A57> <963C> <1A58> <963A> <1A59> <9643> <1A5A> <4FCD> <1A5B> <4FC5> <1A5C> <4FD3> <1A5D> <4FB2> <1A5E> <4FC9> <1A5F> <4FCB> <1A60> <4FC1> <1A61> <4FD4> <1A62> <4FDC> <1A63> <4FD9> <1A64> <4FBB> <1A65> <4FB3> <1A66> <4FDB> <1A67> <4FC7> <1A68> <4FD6> <1A69> <4FBA> <1A6A> <4FC0> <1A6B> <4FB9> <1A6C> <4FEC> <1A6D> <5244> <1A6E> <5249> <1A6F> <52C0> <1A70> <52C2> <1A71> <533D> <1A72> <537C> <1A73> <5397> <1A74> <5396> <1A75> <5399> <1A76> <5398> <1A77> <54BA> <1A78> <54A1> <1A79> <54AD> <1A7A> <54A5> <1A7B> <54CF> <1A7C> <54C3> <1A7D> <830D> <1A7E> <54B7> <1A7F> <54AE> <1A80> <54D6> <1A81> <54B6> <1A84> <54A0> <1A85> <5470> <1A86> <54BC> <1A87> <54A2> <1A88> <54BE> <1A89> <5472> <1A8A> <54DE> <1A8B> <54B0> <1A8C> <57B5> <1A8F> <57A4> <1A90> <578C> <1A91> <5797> <1A92> <579D> <1A93> <579B> <1A94> <5794> <1A95> <5798> <1A96> <578F> <1A97> <5799> <1A98> <57A5> <1A99> <579A> <1A9A> <5795> <1A9B> <58F4> <1A9C> <590D> <1A9D> <5953> <1A9E> <59E1> <1A9F> <59DE> <1AA0> <59EE> <1AA1> <5A00> <1AA2> <59F1> <1AA3> <59DD> <1AA4> <59FA> <1AA5> <59FD> endbfchar 100 beginbfchar <1AA6> <59FC> <1AA7> <59F6> <1AA8> <59E4> <1AA9> <59F2> <1AAA> <59F7> <1AAB> <59DB> <1AAC> <59E9> <1AAD> <59F3> <1AAE> <59F5> <1AAF> <59E0> <1AB0> <59FE> <1AB1> <59F4> <1AB2> <59ED> <1AB3> <5BA8> <1AB4> <5C4C> <1AB5> <5CD0> <1AB6> <5CD8> <1AB7> <5CCC> <1AB8> <5CD7> <1AB9> <5CCB> <1ABA> <5CDB> <1ABB> <5CDE> <1ABC> <5CDA> <1ABD> <5CC9> <1ABE> <5CC7> <1ABF> <5CCA> <1AC0> <5CD6> <1AC3> <5CCF> <1AC4> <5CC8> <1AC5> <5CC6> <1AC6> <5CCE> <1AC7> <5CDF> <1AC8> <5CF8> <1AC9> <5DF9> <1ACD> <5E20> <1ACE> <5E24> <1ACF> <5EB0> <1AD0> <5EA4> <1AD1> <5EA2> <1AD2> <5E9B> <1AD3> <5EA3> <1AD4> <5EA5> <1AD5> <5F07> <1AD6> <5F2E> <1AD7> <5F56> <1AD8> <5F86> <1AD9> <6037> <1ADA> <6039> <1ADB> <6054> <1ADC> <6072> <1ADD> <605E> <1ADE> <6045> <1ADF> <6053> <1AE0> <6047> <1AE1> <6049> <1AE2> <605B> <1AE3> <604C> <1AE4> <6040> <1AE5> <6042> <1AE6> <605F> <1AE7> <6024> <1AE8> <6044> <1AE9> <6058> <1AEA> <6066> <1AEB> <606E> <1AEE> <62CF> <1AEF> <630D> <1AF0> <630B> <1AF1> <62F5> <1AF2> <630E> <1AF3> <6303> <1AF4> <62EB> <1AF5> <62F9> <1AF6> <630F> <1AF7> <630C> <1AF8> <62F8> <1AF9> <62F6> <1AFA> <6300> <1AFD> <62FA> <1AFE> <6315> <1AFF> <62FB> <1B00> <62F0> <1B01> <6541> <1B02> <6543> <1B03> <65AA> <1B04> <65BF> <1B05> <6636> <1B06> <6621> <1B07> <6632> <1B08> <6635> <1B09> <661C> <1B0A> <6626> <1B0B> <6622> <1B0C> <6633> <1B0D> <662B> <1B0E> <663A> <1B0F> <661D> <1B10> <6634> <1B11> <6639> <1B12> <662E> endbfchar 100 beginbfchar <1B15> <67C1> <1B16> <67F2> <1B17> <67C8> <1B18> <67BA> <1B19> <67DC> <1B1A> <67BB> <1B1B> <67F8> <1B1C> <67D8> <1B1D> <67C0> <1B1E> <67B7> <1B1F> <67C5> <1B20> <67EB> <1B21> <67E4> <1B22> <67DF> <1B23> <67B5> <1B24> <67CD> <1B25> <67B3> <1B26> <67F7> <1B27> <67F6> <1B28> <67EE> <1B29> <67E3> <1B2A> <67C2> <1B2B> <67B9> <1B2C> <67CE> <1B2D> <67E7> <1B2E> <67F0> <1B2F> <67B2> <1B30> <67FC> <1B31> <67C6> <1B32> <67ED> <1B33> <67CC> <1B34> <67AE> <1B35> <67E6> <1B36> <67DB> <1B37> <67FA> <1B3A> <67C3> <1B3B> <67EA> <1B3C> <67CB> <1B3D> <6B28> <1B3E> <6B82> <1B3F> <6B84> <1B40> <6BB6> <1B41> <6BD6> <1B42> <6BD8> <1B43> <6BE0> <1B46> <6D28> <1B47> <6D34> <1B48> <6D2D> <1B49> <6D1F> <1B4A> <6D3C> <1B4B> <6D3F> <1B4C> <6D12> <1B4D> <6D0A> <1B4E> <6CDA> <1B4F> <6D33> <1B50> <6D04> <1B51> <6D19> <1B52> <6D3A> <1B53> <6D1A> <1B54> <6D11> <1B55> <6D00> <1B56> <6D1D> <1B57> <6D42> <1B58> <6D01> <1B59> <6D18> <1B5A> <6D37> <1B5B> <6D03> <1B5C> <6D0F> <1B5D> <6D40> <1B5E> <6D07> <1B5F> <6D20> <1B60> <6D2C> <1B61> <6D08> <1B62> <6D22> <1B63> <6D09> <1B64> <6D10> <1B65> <70B7> <1B66> <709F> <1B67> <70BE> <1B68> <70B1> <1B69> <70B0> <1B6A> <70A1> <1B6D> <70A9> <1B6E> <7241> <1B71> <726C> <1B72> <7270> <1B73> <7273> <1B74> <726E> <1B75> <72CA> <1B76> <72E4> <1B77> <72E8> <1B78> <72EB> <1B79> <72DF> <1B7A> <72EA> <1B7B> <72E6> <1B7C> <72E3> <1B7D> <7385> <1B7E> <73CC> <1B7F> <73C2> <1B80> <73C8> endbfchar 100 beginbfchar <1B81> <73C5> <1B82> <73B9> <1B83> <73B6> <1B84> <73B5> <1B85> <73B4> <1B86> <73EB> <1B87> <73BF> <1B88> <73C7> <1B89> <73BE> <1B8A> <73C3> <1B8B> <73C6> <1B8C> <73B8> <1B8D> <73CB> <1B8E> <74EC> <1B8F> <74EE> <1B90> <752E> <1B93> <75A7> <1B94> <75AA> <1B95> <7679> <1B96> <76C4> <1B97> <7708> <1B9B> <770A> <1B9C> <76F7> <1B9D> <76FB> <1B9E> <76FA> <1BA1> <7806> <1BA4> <7805> <1BA5> <7810> <1BA6> <780F> <1BA7> <780E> <1BA8> <7809> <1BA9> <7803> <1BAA> <7813> <1BAB> <794A> <1BAC> <794C> <1BAD> <794B> <1BAE> <7945> <1BAF> <7944> <1BB0> <79D5> <1BB1> <79CD> <1BB2> <79CF> <1BB3> <79D6> <1BB4> <79CE> <1BB5> <7A80> <1BB6> <7A7E> <1BB7> <7AD1> <1BBA> <7C7A> <1BC0> <7D03> <1BC1> <7D08> <1BC2> <7D01> <1BC3> <7F58> <1BC4> <7F91> <1BC5> <7F8D> <1BC6> <7FBE> <1BC7> <8007> <1BCA> <8014> <1BCB> <8037> <1BCC> <80D8> <1BCD> <80C7> <1BCE> <80E0> <1BCF> <80D1> <1BD0> <80C8> <1BD1> <80C2> <1BD2> <80D0> <1BD3> <80C5> <1BD4> <80E3> <1BD5> <80D9> <1BD6> <80DC> <1BD7> <80CA> <1BD8> <80D5> <1BD9> <80C9> <1BDA> <80CF> <1BDB> <80D7> <1BDC> <80E6> <1BDD> <80CD> <1BDE> <81FF> <1BDF> <8221> <1BE0> <8294> <1BE1> <82D9> <1BE2> <82FE> <1BE3> <82F9> <1BE4> <8307> <1BE5> <82E8> <1BE6> <8300> <1BE7> <82D5> <1BE8> <833A> <1BE9> <82EB> <1BEA> <82D6> <1BEB> <82F4> <1BEC> <82EC> <1BED> <82E1> <1BEE> <82F2> <1BEF> <82F5> <1BF0> <830C> <1BF1> <82FB> <1BF2> <82F6> <1BF3> <82F0> <1BF4> <82EA> <1BF5> <82E4> <1BF6> <82E0> endbfchar 100 beginbfchar <1BF7> <82FA> <1BF8> <82F3> <1BF9> <82ED> <1BFA> <8677> <1BFB> <8674> <1BFC> <867C> <1BFD> <8673> <1BFE> <8841> <1BFF> <884E> <1C00> <8867> <1C01> <886A> <1C02> <8869> <1C03> <89D3> <1C04> <8A04> <1C05> <8A07> <1C06> <8D72> <1C07> <8FE3> <1C08> <8FE1> <1C09> <8FEE> <1C0A> <8FE0> <1C0B> <90F1> <1C0C> <90BD> <1C0D> <90BF> <1C0E> <90D5> <1C0F> <90C5> <1C10> <90BE> <1C11> <90C7> <1C12> <90CB> <1C13> <90C8> <1C14> <91D4> <1C15> <91D3> <1C16> <9654> <1C17> <964F> <1C18> <9651> <1C19> <9653> <1C1A> <964A> <1C1B> <964E> <1C1C> <501E> <1C1D> <5005> <1C1E> <5007> <1C1F> <5013> <1C20> <5022> <1C21> <5030> <1C22> <501B> <1C23> <4FF5> <1C24> <4FF4> <1C25> <5033> <1C26> <5037> <1C27> <502C> <1C2A> <5017> <1C2B> <501C> <1C2C> <5020> <1C2D> <5027> <1C2E> <5035> <1C2F> <502F> <1C30> <5031> <1C31> <500E> <1C32> <515A> <1C33> <5194> <1C34> <5193> <1C35> <51CA> <1C38> <51C8> <1C39> <51CE> <1C3A> <5261> <1C3B> <525A> <1C3C> <5252> <1C3F> <5255> <1C40> <5262> <1C41> <52CD> <1C42> <530E> <1C43> <539E> <1C44> <5526> <1C45> <54E2> <1C46> <5517> <1C47> <5512> <1C48> <54E7> <1C49> <54F3> <1C4A> <54E4> <1C4B> <551A> <1C4C> <54FF> <1C4D> <5504> <1C4E> <5508> <1C4F> <54EB> <1C50> <5511> <1C51> <5505> <1C52> <54F1> <1C53> <550A> <1C54> <54FB> <1C57> <54E0> <1C58> <550E> <1C59> <5503> <1C5A> <550B> <1C5D> <57CC> <1C5E> <5832> <1C5F> <57D5> <1C60> <57D2> <1C61> <57BA> <1C62> <57C6> <1C63> <57BD> <1C64> <57BC> endbfchar 100 beginbfchar <1C65> <57B8> <1C66> <57B6> <1C67> <57BF> <1C68> <57C7> <1C69> <57D0> <1C6A> <57B9> <1C6B> <57C1> <1C6C> <590E> <1C6D> <594A> <1C6E> <5A19> <1C6F> <5A16> <1C72> <5A15> <1C73> <5A0F> <1C74> <5A17> <1C75> <5A0A> <1C76> <5A1E> <1C77> <5A33> <1C78> <5B6C> <1C79> <5BA7> <1C7A> <5BAD> <1C7B> <5BAC> <1C7C> <5C03> <1C7D> <5C56> <1C7E> <5C54> <1C7F> <5CEC> <1C80> <5CFF> <1C81> <5CEE> <1C82> <5CF1> <1C83> <5CF7> <1C84> <5D00> <1C85> <5CF9> <1C86> <5E29> <1C87> <5E28> <1C88> <5EA8> <1C89> <5EAE> <1C8A> <5EAA> <1C8B> <5EAC> <1C8C> <5F33> <1C8D> <5F30> <1C8E> <5F67> <1C8F> <605D> <1C90> <605A> <1C91> <6067> <1C92> <6041> <1C93> <60A2> <1C94> <6088> <1C95> <6080> <1C96> <6092> <1C97> <6081> <1C98> <609D> <1C99> <6083> <1C9A> <6095> <1C9B> <609B> <1C9C> <6097> <1C9D> <6087> <1C9E> <609C> <1C9F> <608E> <1CA0> <6219> <1CA1> <6246> <1CA2> <62F2> <1CA3> <6310> <1CA4> <6356> <1CA5> <632C> <1CA8> <6336> <1CA9> <6343> <1CAA> <63E4> <1CAB> <6339> <1CAC> <634B> <1CAD> <634A> <1CAE> <633C> <1CAF> <6329> <1CB0> <6341> <1CB1> <6334> <1CB2> <6358> <1CB3> <6354> <1CB4> <6359> <1CB5> <632D> <1CB6> <6347> <1CB7> <6333> <1CB8> <635A> <1CB9> <6351> <1CBA> <6338> <1CBB> <6357> <1CBC> <6340> <1CBD> <6348> <1CBE> <654A> <1CBF> <6546> <1CC0> <65C6> <1CC3> <65C2> <1CC4> <664A> <1CC5> <665F> <1CC6> <6647> <1CC7> <6651> <1CCA> <681F> <1CCB> <681A> <1CCC> <6849> <1CCF> <683B> <1CD0> <684B> <1CD1> <684F> <1CD2> <6816> endbfchar 100 beginbfchar <1CD3> <6831> <1CD4> <681C> <1CD5> <6835> <1CD6> <682B> <1CD7> <682D> <1CD8> <682F> <1CD9> <684E> <1CDA> <6844> <1CDB> <6834> <1CDC> <681D> <1CDD> <6812> <1CDE> <6814> <1CDF> <6826> <1CE0> <6828> <1CE1> <682E> <1CE2> <684D> <1CE3> <683A> <1CE4> <6825> <1CE5> <6820> <1CE6> <6B2C> <1CE7> <6B2F> <1CE8> <6B2D> <1CE9> <6B31> <1CEA> <6B34> <1CEB> <6B6D> <1CEC> <8082> <1CED> <6B88> <1CEE> <6BE6> <1CEF> <6BE4> <1CF0> <6BE8> <1CF1> <6BE3> <1CF2> <6BE2> <1CF3> <6BE7> <1CF4> <6C25> <1CF5> <6D7A> <1CF8> <6D76> <1CF9> <6D0D> <1CFA> <6D61> <1CFB> <6D92> <1CFC> <6D58> <1CFD> <6D62> <1CFE> <6D6D> <1CFF> <6D6F> <1D00> <6D91> <1D01> <6D8D> <1D02> <6DEF> <1D03> <6D7F> <1D04> <6D86> <1D05> <6D5E> <1D06> <6D67> <1D07> <6D60> <1D08> <6D97> <1D09> <6D70> <1D0A> <6D7C> <1D0B> <6D5F> <1D0C> <6D82> <1D0D> <6D98> <1D0E> <6D2F> <1D0F> <6D68> <1D10> <6D8B> <1D11> <6D7E> <1D12> <6D80> <1D13> <6D84> <1D14> <6D16> <1D15> <6D83> <1D16> <6D7B> <1D17> <6D7D> <1D18> <6D75> <1D19> <6D90> <1D1A> <70DC> <1D1B> <70D3> <1D1C> <70D1> <1D1D> <70DD> <1D1E> <70CB> <1D1F> <7F39> <1D20> <70E2> <1D21> <70D7> <1D22> <70D2> <1D23> <70DE> <1D24> <70E0> <1D25> <70D4> <1D26> <70CD> <1D2A> <70DA> <1D2B> <70CE> <1D2C> <70E1> <1D2D> <7242> <1D2E> <7278> <1D2F> <7277> <1D30> <7276> <1D31> <7300> <1D32> <72FA> <1D33> <72F4> <1D34> <72FE> <1D35> <72F6> <1D36> <72F3> <1D37> <72FB> <1D38> <7301> <1D39> <73D3> <1D3A> <73D9> <1D3B> <73E5> endbfchar 100 beginbfchar <1D3C> <73D6> <1D3D> <73BC> <1D3E> <73E7> <1D3F> <73E3> <1D40> <73E9> <1D41> <73DC> <1D42> <73D2> <1D43> <73DB> <1D44> <73D4> <1D45> <73DD> <1D46> <73DA> <1D49> <73E8> <1D4E> <7521> <1D4F> <755B> <1D50> <755F> <1D51> <75B0> <1D52> <75C1> <1D53> <75BB> <1D54> <75C4> <1D55> <75C0> <1D56> <75BF> <1D57> <75B6> <1D58> <75BA> <1D59> <768A> <1D5A> <76C9> <1D5B> <771D> <1D5C> <771B> <1D5D> <7710> <1D5E> <7713> <1D5F> <7712> <1D60> <7723> <1D61> <7711> <1D62> <7715> <1D65> <7722> <1D66> <7727> <1D67> <7823> <1D68> <782C> <1D69> <7822> <1D6A> <7835> <1D6B> <782F> <1D6C> <7828> <1D6D> <782E> <1D6E> <782B> <1D6F> <7821> <1D70> <7829> <1D71> <7833> <1D72> <782A> <1D73> <7831> <1D74> <7954> <1D75> <795B> <1D76> <794F> <1D77> <795C> <1D78> <7953> <1D79> <7952> <1D7A> <7951> <1D7D> <79E0> <1D7E> <79EE> <1D7F> <79ED> <1D80> <79EA> <1D81> <79DC> <1D82> <79DE> <1D83> <79DD> <1D84> <7A86> <1D85> <7A89> <1D86> <7A85> <1D89> <7A8A> <1D8A> <7A87> <1D8B> <7AD8> <1D8C> <7B10> <1D8D> <7B04> <1D8E> <7B13> <1D8F> <7B05> <1D90> <7B0F> <1D91> <7B08> <1D92> <7B0A> <1D93> <7B0E> <1D94> <7B09> <1D95> <7B12> <1D96> <7C84> <1D97> <7C91> <1D98> <7C8A> <1D99> <7C8C> <1D9A> <7C88> <1D9B> <7C8D> <1D9C> <7C85> <1D9D> <7D1E> <1D9E> <7D1D> <1D9F> <7D11> <1DA0> <7D0E> <1DA1> <7D18> <1DA2> <7D16> <1DA3> <7D13> <1DA4> <7D1F> <1DA5> <7D12> <1DA6> <7D0F> <1DA7> <7D0C> <1DA8> <7F5C> <1DA9> <7F61> <1DAA> <7F5E> <1DAB> <7F60> endbfchar 100 beginbfchar <1DAC> <7F5D> <1DAD> <7F5B> <1DAE> <7F96> <1DAF> <7F92> <1DB0> <7FC3> <1DB1> <7FC2> <1DB2> <7FC0> <1DB3> <8016> <1DB4> <803E> <1DB5> <8039> <1DB6> <80FA> <1DB7> <80F2> <1DB8> <80F9> <1DB9> <80F5> <1DBA> <8101> <1DBB> <80FB> <1DBC> <8100> <1DBD> <8201> <1DBE> <822F> <1DBF> <8225> <1DC0> <8333> <1DC1> <832D> <1DC2> <8344> <1DC3> <8319> <1DC4> <8351> <1DC5> <8325> <1DC6> <8356> <1DC7> <833F> <1DC8> <8341> <1DC9> <8326> <1DCA> <831C> <1DCB> <8322> <1DCC> <8342> <1DCD> <834E> <1DCE> <831B> <1DCF> <832A> <1DD0> <8308> <1DD1> <833C> <1DD2> <834D> <1DD3> <8316> <1DD4> <8324> <1DD5> <8320> <1DD6> <8337> <1DD7> <832F> <1DD8> <8329> <1DD9> <8347> <1DDA> <8345> <1DDB> <834C> <1DDC> <8353> <1DDD> <831E> <1DDE> <832C> <1DDF> <834B> <1DE0> <8327> <1DE1> <8348> <1DE2> <8653> <1DE3> <8652> <1DE4> <86A2> <1DE5> <86A8> <1DE6> <8696> <1DE7> <868D> <1DE8> <8691> <1DE9> <869E> <1DEA> <8687> <1DEB> <8697> <1DEC> <8686> <1DED> <868B> <1DEE> <869A> <1DEF> <8685> <1DF0> <86A5> <1DF1> <8699> <1DF2> <86A1> <1DF3> <86A7> <1DF4> <8695> <1DF5> <8698> <1DF6> <868E> <1DF7> <869D> <1DF8> <8690> <1DF9> <8694> <1DFC> <886D> <1DFF> <8872> <1E00> <8880> <1E01> <8871> <1E02> <887F> <1E03> <886F> <1E04> <8883> <1E05> <887E> <1E06> <8874> <1E07> <887C> <1E08> <8A12> <1E09> <8C47> <1E0A> <8C57> <1E0B> <8C7B> <1E0C> <8CA4> <1E0D> <8CA3> <1E0E> <8D76> <1E0F> <8D78> <1E10> <8DB5> <1E11> <8DB7> <1E12> <8DB6> <1E13> <8ED1> endbfchar 100 beginbfchar <1E14> <8ED3> <1E15> <8FFE> <1E16> <8FF5> <1E17> <9002> <1E18> <8FFF> <1E19> <8FFB> <1E1A> <9004> <1E1B> <8FFC> <1E1C> <8FF6> <1E1D> <90D6> <1E1E> <90E0> <1E21> <90E3> <1E22> <90DF> <1E23> <90E5> <1E24> <90D8> <1E25> <90DB> <1E26> <90D7> <1E27> <90DC> <1E28> <90E4> <1E29> <9150> <1E2C> <91D5> <1E2D> <91E2> <1E2E> <91DA> <1E2F> <965C> <1E30> <965F> <1E31> <96BC> <1E32> <98E3> <1E33> <9ADF> <1E34> <9B2F> <1E35> <4E7F> <1E36> <5070> <1E37> <506A> <1E38> <5061> <1E39> <505E> <1E3A> <5060> <1E3B> <5053> <1E3C> <504B> <1E3D> <505D> <1E3E> <5072> <1E3F> <5048> <1E40> <504D> <1E41> <5041> <1E42> <505B> <1E43> <504A> <1E44> <5062> <1E45> <5015> <1E46> <5045> <1E47> <505F> <1E48> <5069> <1E49> <506B> <1E4C> <5046> <1E4D> <5040> <1E4E> <506E> <1E4F> <5073> <1E50> <5057> <1E51> <5051> <1E52> <51D0> <1E53> <526B> <1E54> <526D> <1E55> <526C> <1E56> <526E> <1E57> <52D6> <1E58> <52D3> <1E59> <532D> <1E5A> <539C> <1E5D> <553C> <1E5E> <554D> <1E5F> <5550> <1E60> <5534> <1E61> <552A> <1E62> <5551> <1E63> <5562> <1E64> <5536> <1E65> <5535> <1E66> <5530> <1E67> <5552> <1E68> <5545> <1E69> <550C> <1E6A> <5532> <1E6B> <5565> <1E6C> <554E> <1E6D> <5539> <1E6E> <5548> <1E6F> <552D> <1E70> <553B> <1E71> <5540> <1E72> <554B> <1E73> <570A> <1E74> <5707> <1E75> <57FB> <1E76> <5814> <1E77> <57E2> <1E78> <57F6> <1E79> <57DC> <1E7A> <57F4> <1E7B> <5800> <1E7C> <57ED> <1E7D> <57FD> <1E7E> <5808> <1E7F> <57F8> endbfchar 100 beginbfchar <1E80> <580B> <1E81> <57F3> <1E82> <57CF> <1E83> <5807> <1E84> <57EE> <1E85> <57E3> <1E86> <57F2> <1E87> <57E5> <1E88> <57EC> <1E89> <57E1> <1E8A> <580E> <1E8B> <57FC> <1E8C> <5810> <1E8D> <57E7> <1E8E> <5801> <1E8F> <580C> <1E90> <57F1> <1E91> <57E9> <1E92> <57F0> <1E93> <580D> <1E94> <5804> <1E95> <595C> <1E96> <5A60> <1E97> <5A58> <1E98> <5A55> <1E99> <5A67> <1E9A> <5A5E> <1E9B> <5A38> <1E9C> <5A35> <1E9D> <5A6D> <1E9E> <5A50> <1E9F> <5A5F> <1EA0> <5A65> <1EA1> <5A6C> <1EA2> <5A53> <1EA3> <5A64> <1EA4> <5A57> <1EA5> <5A43> <1EA6> <5A5D> <1EA7> <5A52> <1EA8> <5A44> <1EA9> <5A5B> <1EAA> <5A48> <1EAB> <5A8E> <1EAC> <5A3E> <1EAD> <5A4D> <1EAE> <5A39> <1EAF> <5A4C> <1EB0> <5A70> <1EB1> <5A69> <1EB2> <5A47> <1EB3> <5A51> <1EB4> <5A56> <1EB5> <5A42> <1EB6> <5A5C> <1EB7> <5B72> <1EB8> <5B6E> <1EB9> <5BC1> <1EBA> <5BC0> <1EBB> <5C59> <1EBC> <5D1E> <1EBD> <5D0B> <1EBE> <5D1D> <1EBF> <5D1A> <1EC0> <5D20> <1EC1> <5D0C> <1EC2> <5D28> <1EC3> <5D0D> <1EC4> <5D26> <1EC5> <5D25> <1EC6> <5D0F> <1EC7> <5D30> <1EC8> <5D12> <1EC9> <5D23> <1ECA> <5D1F> <1ECB> <5D2E> <1ECC> <5E3E> <1ECD> <5E34> <1ECE> <5EB1> <1ECF> <5EB4> <1ED0> <5EB9> <1ED3> <5F36> <1ED4> <5F38> <1ED5> <5F9B> <1ED6> <5F96> <1ED7> <5F9F> <1ED8> <608A> <1ED9> <6090> <1EDA> <6086> <1EDB> <60BE> <1EDC> <60B0> <1EDD> <60BA> <1EE0> <60CF> <1EE1> <60E4> <1EE2> <60D9> <1EE3> <60DD> <1EE4> <60C8> <1EE5> <60B1> <1EE6> <60DB> <1EE7> <60B7> endbfchar 100 beginbfchar <1EE8> <60CA> <1EE9> <60BF> <1EEA> <60C3> <1EEB> <60CD> <1EEC> <60C0> <1EED> <6332> <1EEE> <6365> <1EEF> <638A> <1EF0> <6382> <1EF1> <637D> <1EF2> <63BD> <1EF3> <639E> <1EF4> <63AD> <1EF5> <639D> <1EF6> <6397> <1EF7> <63AB> <1EF8> <638E> <1EF9> <636F> <1EFA> <6387> <1EFB> <6390> <1EFC> <636E> <1EFD> <63AF> <1EFE> <6375> <1EFF> <639C> <1F00> <636D> <1F01> <63AE> <1F02> <637C> <1F03> <63A4> <1F04> <633B> <1F05> <639F> <1F06> <6378> <1F07> <6385> <1F08> <6381> <1F09> <6391> <1F0A> <638D> <1F0B> <6370> <1F0C> <6553> <1F0D> <65CD> <1F0E> <6665> <1F0F> <6661> <1F10> <665B> <1F11> <6659> <1F12> <665C> <1F13> <6662> <1F14> <6718> <1F15> <6879> <1F16> <6887> <1F17> <6890> <1F18> <689C> <1F1B> <68AE> <1F1C> <68AB> <1F1D> <6956> <1F1E> <686F> <1F1F> <68A3> <1F20> <68AC> <1F21> <68A9> <1F22> <6875> <1F23> <6874> <1F24> <68B2> <1F25> <688F> <1F26> <6877> <1F27> <6892> <1F28> <687C> <1F29> <686B> <1F2A> <6872> <1F2B> <68AA> <1F2C> <6880> <1F2D> <6871> <1F2E> <687E> <1F2F> <689B> <1F30> <6896> <1F31> <688B> <1F32> <68A0> <1F33> <6889> <1F34> <68A4> <1F35> <6878> <1F36> <687B> <1F37> <6891> <1F38> <688C> <1F39> <688A> <1F3A> <687D> <1F3B> <6B36> <1F3C> <6B33> <1F3F> <6B91> <1F40> <6B8F> <1F43> <6B8C> <1F44> <6C2A> <1F45> <6DC0> <1F46> <6DAB> <1F47> <6DB4> <1F48> <6DB3> <1F49> <6E74> <1F4A> <6DAC> <1F4B> <6DE9> <1F4C> <6DE2> <1F4D> <6DB7> <1F4E> <6DF6> <1F4F> <6DD4> <1F50> <6E00> <1F51> <6DC8> endbfchar 100 beginbfchar <1F52> <6DE0> <1F53> <6DDF> <1F54> <6DD6> <1F55> <6DBE> <1F56> <6DE5> <1F59> <6DDB> <1F5A> <6DF4> <1F5B> <6DCA> <1F5C> <6DBD> <1F5D> <6DED> <1F5E> <6DF0> <1F5F> <6DBA> <1F60> <6DD5> <1F61> <6DC2> <1F62> <6DCF> <1F63> <6DC9> <1F64> <6DD0> <1F65> <6DF2> <1F66> <6DD3> <1F67> <6DFD> <1F68> <6DD7> <1F69> <6DCD> <1F6A> <6DE3> <1F6B> <6DBB> <1F6C> <70FA> <1F6D> <710D> <1F6E> <70F7> <1F6F> <7117> <1F70> <70F4> <1F71> <710C> <1F72> <70F0> <1F73> <7104> <1F74> <70F3> <1F75> <7110> <1F76> <70FC> <1F77> <70FF> <1F78> <7106> <1F79> <7113> <1F7A> <7100> <1F7B> <70F8> <1F7C> <70F6> <1F7D> <710B> <1F7E> <7102> <1F7F> <710E> <1F80> <727E> <1F83> <727F> <1F84> <731D> <1F85> <7317> <1F86> <7307> <1F87> <7311> <1F88> <7318> <1F89> <730A> <1F8A> <7308> <1F8B> <72FF> <1F8C> <730F> <1F8D> <731E> <1F8E> <7388> <1F8F> <73F6> <1F90> <73F8> <1F91> <73F5> <1F92> <7404> <1F93> <7401> <1F94> <73FD> <1F95> <7407> <1F96> <7400> <1F97> <73FA> <1F98> <73FC> <1F99> <73FF> <1F9A> <740C> <1F9B> <740B> <1F9C> <73F4> <1F9D> <7408> <1F9E> <7564> <1F9F> <7563> <1FA0> <75CE> <1FA1> <75D2> <1FA2> <75CF> <1FA5> <75D1> <1FA6> <75D0> <1FA7> <768F> <1FA8> <7689> <1FA9> <76D3> <1FAA> <7739> <1FAB> <772F> <1FAC> <772D> <1FAF> <7734> <1FB0> <7733> <1FB1> <773D> <1FB2> <7725> <1FB3> <773B> <1FB4> <7735> <1FB5> <7848> <1FB6> <7852> <1FB7> <7849> <1FB8> <784D> <1FB9> <784A> <1FBA> <784C> <1FBB> <7826> <1FBC> <7845> <1FBD> <7850> endbfchar 100 beginbfchar <1FBE> <7964> <1FBF> <7967> <1FC2> <7963> <1FC3> <796B> <1FC4> <7961> <1FC5> <79BB> <1FC6> <79FA> <1FC7> <79F8> <1FCA> <7A8F> <1FCB> <7A94> <1FCC> <7A90> <1FCD> <7B35> <1FCE> <7B3B> <1FCF> <7B34> <1FD0> <7B25> <1FD1> <7B30> <1FD2> <7B22> <1FD3> <7B24> <1FD4> <7B33> <1FD5> <7B18> <1FD6> <7B2A> <1FD7> <7B1D> <1FD8> <7B31> <1FD9> <7B2B> <1FDA> <7B2D> <1FDB> <7B2F> <1FDC> <7B32> <1FDD> <7B38> <1FDE> <7B1A> <1FDF> <7B23> <1FE0> <7C94> <1FE1> <7C98> <1FE2> <7C96> <1FE3> <7CA3> <1FE4> <7D35> <1FE5> <7D3D> <1FE6> <7D38> <1FE7> <7D36> <1FE8> <7D3A> <1FE9> <7D45> <1FEA> <7D2C> <1FEB> <7D29> <1FEC> <7D41> <1FED> <7D47> <1FF0> <7D4A> <1FF1> <7D3B> <1FF2> <7D28> <1FF3> <7F63> <1FF4> <7F95> <1FF7> <7F9B> <1FFA> <7FCD> <1FFD> <7FC7> <1FFE> <7FCF> <1FFF> <7FC9> <2000> <801F> <2001> <801E> <2002> <801B> <2003> <8047> <2004> <8043> <2005> <8048> <2006> <8118> <2007> <8125> <2008> <8119> <2009> <811B> <200A> <812D> <200B> <811F> <200C> <812C> <200D> <811E> <200E> <8121> <200F> <8115> <2010> <8127> <2011> <811D> <2012> <8122> <2013> <8211> <2014> <8238> <2015> <8233> <2016> <823A> <2017> <8234> <2018> <8232> <2019> <8274> <201A> <8390> <201B> <83A3> <201C> <83A8> <201D> <838D> <201E> <837A> <201F> <8373> <2020> <83A4> <2021> <8374> <2022> <838F> <2023> <8381> <2024> <8395> <2025> <8399> <2026> <8375> <2027> <8394> <2028> <83A9> <2029> <837D> <202A> <8383> <202B> <838C> <202C> <839D> <202D> <839B> endbfchar 100 beginbfchar <202E> <83AA> <202F> <838B> <2030> <837E> <2031> <83A5> <2032> <83AF> <2033> <8388> <2034> <8397> <2035> <83B0> <2036> <837F> <2037> <83A6> <2038> <8387> <2039> <83AE> <203A> <8376> <203B> <8659> <203C> <8656> <203D> <86BF> <203E> <86B7> <203F> <86C2> <2040> <86C1> <2041> <86C5> <2042> <86BA> <2043> <86B0> <2044> <86C8> <2045> <86B9> <2046> <86B3> <2047> <86B8> <2048> <86CC> <2049> <86B4> <204C> <86C3> <204F> <8852> <2050> <8889> <2051> <8895> <2052> <88A8> <2053> <88A2> <2054> <88AA> <2055> <889A> <2056> <8891> <2057> <88A1> <2058> <889F> <2059> <8898> <205A> <88A7> <205B> <8899> <205C> <889B> <205D> <8897> <205E> <88A4> <205F> <88AC> <2060> <888C> <2061> <8893> <2062> <888E> <2063> <8982> <2064> <89D6> <2065> <89D9> <2066> <89D5> <2067> <8A30> <2068> <8A27> <2069> <8A2C> <206A> <8A1E> <206B> <8C39> <206C> <8C3B> <206F> <8C7D> <2070> <8CA5> <2071> <8D7D> <2072> <8D7B> <2073> <8D79> <2074> <8DBC> <2075> <8DC2> <2076> <8DB9> <2077> <8DBF> <2078> <8DC1> <2079> <8ED8> <207A> <8EDE> <207B> <8EDD> <207C> <8EDC> <207D> <8ED7> <2080> <9024> <2081> <900B> <2082> <9011> <2083> <901C> <2084> <900C> <2085> <9021> <2086> <90EF> <2087> <90EA> <2088> <90F0> <2089> <90F4> <208C> <90D4> <208F> <90E9> <2090> <9156> <2091> <9158> <2092> <915A> <2093> <9153> <2094> <9155> <2095> <91EC> <2096> <91F4> <2097> <91F1> <2098> <91F3> <2099> <91F8> <209A> <91E4> <209B> <91F9> <209E> <91F7> <209F> <91E8> endbfchar 100 beginbfchar <20A0> <91EE> <20A1> <957A> <20A2> <9586> <20A3> <9588> <20A4> <967C> <20A5> <966D> <20A6> <966B> <20A7> <9671> <20A8> <966F> <20A9> <96BF> <20AA> <976A> <20AB> <9804> <20AC> <98E5> <20AD> <9997> <20AE> <509B> <20AF> <5095> <20B0> <5094> <20B1> <509E> <20B2> <508B> <20B3> <50A3> <20B4> <5083> <20B5> <508C> <20B6> <508E> <20B7> <509D> <20B8> <5068> <20B9> <509C> <20BA> <5092> <20BB> <5082> <20BC> <5087> <20BD> <515F> <20BE> <51D4> <20BF> <5312> <20C0> <5311> <20C1> <53A4> <20C2> <53A7> <20C3> <5591> <20C4> <55A8> <20C5> <55A5> <20C6> <55AD> <20C7> <5577> <20C8> <5645> <20C9> <55A2> <20CA> <5593> <20CB> <5588> <20CC> <558F> <20CD> <55B5> <20CE> <5581> <20CF> <55A3> <20D0> <5592> <20D1> <55A4> <20D2> <557D> <20D3> <558C> <20D4> <55A6> <20D5> <557F> <20D6> <5595> <20D7> <55A1> <20D8> <558E> <20D9> <570C> <20DA> <5829> <20DB> <5837> <20DC> <5819> <20DD> <581E> <20DE> <5827> <20DF> <5823> <20E0> <5828> <20E1> <57F5> <20E2> <5848> <20E3> <5825> <20E4> <581C> <20E5> <581B> <20E6> <5833> <20E7> <583F> <20E8> <5836> <20E9> <582E> <20EA> <5839> <20EB> <5838> <20EC> <582D> <20ED> <582C> <20EE> <583B> <20EF> <5961> <20F0> <5AAF> <20F1> <5A94> <20F2> <5A9F> <20F3> <5A7A> <20F4> <5AA2> <20F5> <5A9E> <20F6> <5A78> <20F7> <5AA6> <20F8> <5A7C> <20F9> <5AA5> <20FA> <5AAC> <20FB> <5A95> <20FC> <5AAE> <20FD> <5A37> <20FE> <5A84> <20FF> <5A8A> <2100> <5A97> <2101> <5A83> <2102> <5A8B> <2103> <5AA9> endbfchar 100 beginbfchar <2104> <5A7B> <2105> <5A7D> <2106> <5A8C> <2107> <5A9C> <2108> <5A8F> <2109> <5A93> <210A> <5A9D> <210B> <5BEA> <210C> <5BCD> <210D> <5BCB> <210E> <5BD4> <210F> <5BD1> <2110> <5BCA> <2111> <5BCE> <2112> <5C0C> <2113> <5C30> <2114> <5D37> <2115> <5D43> <2116> <5D6B> <2117> <5D41> <2118> <5D4B> <2119> <5D3F> <211A> <5D35> <211B> <5D51> <211C> <5D4E> <211D> <5D55> <211E> <5D33> <211F> <5D3A> <2120> <5D52> <2121> <5D3D> <2122> <5D31> <2123> <5D59> <2124> <5D42> <2125> <5D39> <2126> <5D49> <2127> <5D38> <2128> <5D3C> <2129> <5D32> <212A> <5D36> <212B> <5D40> <212C> <5D45> <212D> <5E44> <212E> <5E41> <212F> <5F58> <2130> <5FA6> <2131> <5FA5> <2132> <5FAB> <2133> <60C9> <2134> <60B9> <2135> <60CC> <2136> <60E2> <2137> <60CE> <2138> <60C4> <2139> <6114> <213A> <60F2> <213B> <610A> <213C> <6116> <213D> <6105> <213E> <60F5> <213F> <6113> <2140> <60F8> <2141> <60FC> <2142> <60FE> <2143> <60C1> <2144> <6103> <2145> <6118> <2146> <611D> <2147> <6110> <2148> <60FF> <2149> <6104> <214A> <610B> <214B> <624A> <214C> <6394> <214D> <63B1> <214E> <63B0> <214F> <63CE> <2150> <63E5> <2151> <63E8> <2152> <63EF> <2153> <63C3> <2154> <649D> <2155> <63F3> <2156> <63CA> <2157> <63E0> <2158> <63F6> <2159> <63D5> <215A> <63F2> <215B> <63F5> <215C> <6461> <215D> <63DF> <215E> <63BE> <215F> <63DD> <2160> <63DC> <2161> <63C4> <2162> <63D8> <2163> <63D3> <2164> <63C2> <2165> <63C7> <2166> <63CC> <2167> <63CB> endbfchar 100 beginbfchar <2168> <63C8> <2169> <63F0> <216A> <63D7> <216B> <63D9> <216C> <6532> <216D> <6567> <216E> <656A> <216F> <6564> <2170> <655C> <2171> <6568> <2172> <6565> <2173> <658C> <2176> <65AE> <2177> <65D0> <2178> <65D2> <2179> <667C> <217A> <666C> <217B> <667B> <217C> <6680> <217D> <6671> <217E> <6679> <217F> <666A> <2180> <6672> <2181> <6701> <2182> <690C> <2183> <68D3> <2184> <6904> <2185> <68DC> <2186> <692A> <2187> <68EC> <2188> <68EA> <2189> <68F1> <218A> <690F> <218B> <68D6> <218C> <68F7> <218D> <68EB> <218E> <68E4> <218F> <68F6> <2190> <6913> <2191> <6910> <2192> <68F3> <2193> <68E1> <2194> <6907> <2195> <68CC> <2196> <6908> <2197> <6970> <2198> <68B4> <2199> <6911> <219A> <68EF> <219B> <68C6> <219C> <6914> <219D> <68F8> <219E> <68D0> <219F> <68FD> <21A0> <68FC> <21A1> <68E8> <21A2> <690B> <21A3> <690A> <21A4> <6917> <21A5> <68CE> <21A6> <68C8> <21A9> <68E6> <21AA> <68F4> <21AB> <68D1> <21AC> <6906> <21AD> <68D4> <21AE> <68E9> <21AF> <6915> <21B0> <6925> <21B1> <68C7> <21B2> <6B39> <21B3> <6B3B> <21B4> <6B3F> <21B5> <6B3C> <21B6> <6B94> <21B7> <6B97> <21B8> <6B99> <21B9> <6B95> <21BA> <6BBD> <21BB> <6BF0> <21BE> <6C30> <21BF> <6DFC> <21C2> <6E1F> <21C3> <6E49> <21C4> <6E88> <21C7> <6E45> <21C8> <6E62> <21C9> <6E2B> <21CA> <6E3F> <21CB> <6E41> <21CC> <6E5D> <21CD> <6E73> <21CE> <6E1C> <21CF> <6E33> <21D0> <6E4B> <21D1> <6E40> <21D2> <6E51> <21D3> <6E3B> <21D4> <6E03> <21D5> <6E2E> endbfchar 100 beginbfchar <21D6> <6E5E> <21D7> <6E68> <21D8> <6E5C> <21D9> <6E61> <21DA> <6E31> <21DB> <6E28> <21DC> <6E60> <21DD> <6E71> <21DE> <6E6B> <21DF> <6E39> <21E0> <6E22> <21E1> <6E30> <21E2> <6E53> <21E3> <6E65> <21E4> <6E27> <21E5> <6E78> <21E6> <6E64> <21E7> <6E77> <21E8> <6E55> <21E9> <6E79> <21EA> <6E52> <21EB> <6E66> <21EE> <6E5A> <21EF> <7120> <21F0> <711E> <21F1> <712F> <21F2> <70FB> <21F3> <712E> <21F4> <7131> <21F5> <7123> <21F6> <7125> <21F7> <7122> <21F8> <7132> <21F9> <711F> <21FA> <7128> <21FB> <713A> <21FC> <711B> <21FD> <724B> <21FE> <725A> <21FF> <7288> <2200> <7289> <2201> <7286> <2202> <7285> <2203> <728B> <2204> <7312> <2205> <730B> <2206> <7330> <2207> <7322> <2208> <7331> <2209> <7333> <220A> <7327> <220B> <7332> <220C> <732D> <220D> <7326> <220E> <7323> <220F> <7335> <2210> <730C> <2211> <742E> <2212> <742C> <2213> <7430> <2214> <742B> <2215> <7416> <2216> <741A> <2217> <7421> <2218> <742D> <2219> <7431> <221A> <7424> <221B> <7423> <221C> <741D> <221D> <7429> <221E> <7420> <221F> <7432> <2220> <74FB> <2221> <752F> <2222> <756F> <2223> <756C> <2224> <75E7> <2225> <75DA> <2226> <75E1> <2227> <75E6> <2228> <75DD> <2229> <75DF> <222A> <75E4> <222B> <75D7> <222C> <7695> <222D> <7692> <222E> <76DA> <2231> <7744> <2232> <774D> <2233> <7745> <2234> <774A> <2235> <774E> <2238> <77DE> <2239> <77EC> <223A> <7860> <223D> <785C> <223E> <786D> <223F> <7871> <2240> <786A> <2241> <786E> endbfchar 100 beginbfchar <2242> <7870> <2243> <7869> <2244> <7868> <2245> <785E> <2246> <7862> <2247> <7974> <2248> <7973> <2249> <7972> <224A> <7970> <224B> <7A02> <224C> <7A0A> <224D> <7A03> <224E> <7A0C> <224F> <7A04> <2250> <7A99> <2251> <7AE6> <2252> <7AE4> <2253> <7B4A> <2254> <7B47> <2255> <7B44> <2256> <7B48> <2257> <7B4C> <2258> <7B4E> <2259> <7B40> <225A> <7B58> <225B> <7B45> <225C> <7CA2> <225D> <7C9E> <225E> <7CA8> <225F> <7CA1> <2260> <7D58> <2261> <7D6F> <2262> <7D63> <2263> <7D53> <2264> <7D56> <2265> <7D67> <2266> <7D6A> <2267> <7D4F> <2268> <7D6D> <2269> <7D5C> <226A> <7D6B> <226B> <7D52> <226C> <7D54> <226D> <7D69> <226E> <7D51> <226F> <7D5F> <2270> <7D4E> <2275> <7FA2> <2278> <7FD7> <2279> <8051> <227C> <80FE> <227D> <80D4> <227E> <8143> <227F> <814A> <2280> <8152> <2281> <814F> <2282> <8147> <2283> <813D> <2284> <814D> <2285> <813A> <2286> <81E6> <2287> <81EE> <228B> <8204> <228E> <823F> <228F> <8275> <2290> <833B> <2291> <83CF> <2292> <83F9> <2293> <8423> <2294> <83C0> <2295> <83E8> <2296> <8412> <2297> <83E7> <2298> <83E4> <2299> <83FC> <229A> <83F6> <229B> <8410> <229C> <83C6> <229D> <83C8> <229E> <83EB> <229F> <83E3> <22A0> <83BF> <22A1> <8401> <22A2> <83DD> <22A3> <83E5> <22A4> <83D8> <22A5> <83FF> <22A6> <83E1> <22A7> <83CB> <22A8> <83CE> <22A9> <83D6> <22AA> <83F5> <22AB> <83C9> <22AC> <8409> <22AD> <840F> <22AE> <83DE> <22AF> <8411> <22B0> <8406> <22B1> <83C2> <22B2> <83F3> endbfchar 100 beginbfchar <22B3> <83D5> <22B4> <83FA> <22B5> <83C7> <22B6> <83D1> <22B7> <83EA> <22B8> <8413> <22B9> <839A> <22BA> <83C3> <22BB> <83EC> <22BC> <83EE> <22BD> <83C4> <22BE> <83FB> <22BF> <83D7> <22C0> <83E2> <22C1> <841B> <22C2> <83DB> <22C3> <83FE> <22C4> <86D8> <22C5> <86E2> <22C6> <86E6> <22C7> <86D3> <22C8> <86E3> <22C9> <86DA> <22CA> <86EA> <22CB> <86DD> <22CC> <86EB> <22CD> <86DC> <22CE> <86EC> <22CF> <86E9> <22D0> <86D7> <22D1> <86E8> <22D2> <86D1> <22D3> <8848> <22D4> <8856> <22D5> <8855> <22D6> <88BA> <22D7> <88D7> <22D8> <88B9> <22D9> <88B8> <22DA> <88C0> <22DB> <88BE> <22DC> <88B6> <22DD> <88BC> <22DE> <88B7> <22DF> <88BD> <22E0> <88B2> <22E1> <8901> <22E2> <88C9> <22E3> <8995> <22E4> <8998> <22E5> <8997> <22E6> <89DD> <22E9> <8A4E> <22EA> <8A4D> <22EB> <8A39> <22EC> <8A59> <22ED> <8A40> <22F2> <8A52> <22F3> <8A48> <22F4> <8A51> <22F5> <8A4A> <22F6> <8A4C> <22F7> <8A4F> <22F8> <8C5F> <22F9> <8C81> <22FA> <8C80> <22FB> <8CBA> <22FC> <8CBE> <22FD> <8CB0> <22FE> <8CB9> <22FF> <8CB5> <2300> <8D84> <2301> <8D80> <2302> <8D89> <2303> <8DD8> <2304> <8DD3> <2305> <8DCD> <2306> <8DC7> <2307> <8DD6> <2308> <8DDC> <2309> <8DCF> <230A> <8DD5> <230B> <8DD9> <230C> <8DC8> <230D> <8DD7> <230E> <8DC5> <230F> <8EEF> <2310> <8EF7> <2311> <8EFA> <2312> <8EF9> <2313> <8EE6> <2314> <8EEE> <2315> <8EE5> <2316> <8EF5> <2319> <8EF6> <231A> <8EEB> <231B> <8EF1> <231C> <8EEC> <231D> <8EF4> <231E> <8EE9> endbfchar 100 beginbfchar <231F> <902D> <2320> <9034> <2321> <902F> <2322> <9106> <2323> <912C> <2324> <9104> <2325> <90FF> <2326> <90FC> <2327> <9108> <2328> <90F9> <2329> <90FB> <232A> <9101> <232B> <9100> <232C> <9107> <232D> <9105> <232E> <9103> <232F> <9161> <2330> <9164> <2331> <915F> <2332> <9162> <2333> <9160> <2334> <9201> <2335> <920A> <2336> <9225> <2337> <9203> <2338> <921A> <2339> <9226> <233A> <920F> <233B> <920C> <233C> <9200> <233D> <9212> <233E> <91FF> <233F> <91FD> <2340> <9206> <2341> <9204> <2342> <9227> <2343> <9202> <2344> <921C> <2345> <9224> <2346> <9219> <2347> <9217> <2348> <9205> <2349> <9216> <234A> <957B> <234B> <958D> <234C> <958C> <234D> <9590> <234E> <9687> <234F> <967E> <2352> <9683> <2353> <9680> <2354> <96C2> <2355> <96C8> <2356> <96C3> <2357> <96F1> <2358> <96F0> <2359> <976C> <235A> <9770> <235B> <976E> <235C> <9807> <235D> <98A9> <235E> <98EB> <235F> <9CE6> <2360> <9EF9> <2363> <4EB6> <2364> <50BD> <2365> <50BF> <2366> <50C6> <2367> <50AE> <2368> <50C4> <2369> <50CA> <236A> <50B4> <236B> <50C8> <236C> <50C2> <236D> <50B0> <236E> <50C1> <236F> <50BA> <2370> <50B1> <2371> <50CB> <2372> <50C9> <2373> <50B6> <2374> <50B8> <2375> <51D7> <2376> <527A> <2377> <5278> <237A> <55C3> <237B> <55DB> <237C> <55CC> <237D> <55D0> <237E> <55CB> <237F> <55CA> <2380> <55DD> <2381> <55C0> <2382> <55D4> <2383> <55C4> <2384> <55E9> <2385> <55BF> <2386> <55D2> <2387> <558D> <2388> <55CF> endbfchar 100 beginbfchar <2389> <55D5> <238A> <55E2> <238B> <55D6> <238C> <55C8> <238D> <55F2> <238E> <55CD> <238F> <55D9> <2390> <55C2> <2391> <5714> <2392> <5853> <2393> <5868> <2394> <5864> <2395> <584F> <2396> <584D> <2397> <5849> <2398> <586F> <2399> <5855> <239A> <584E> <239B> <585D> <239C> <5859> <239D> <5865> <239E> <585B> <239F> <583D> <23A0> <5863> <23A1> <5871> <23A2> <58FC> <23A3> <5AC7> <23A4> <5AC4> <23A5> <5ACB> <23A6> <5ABA> <23A7> <5AB8> <23A8> <5AB1> <23A9> <5AB5> <23AA> <5AB0> <23AB> <5ABF> <23AC> <5AC8> <23AD> <5ABB> <23AE> <5AC6> <23AF> <5AB7> <23B0> <5AC0> <23B1> <5ACA> <23B2> <5AB4> <23B3> <5AB6> <23B4> <5ACD> <23B5> <5AB9> <23B6> <5A90> <23B7> <5BD6> <23BA> <5C1F> <23BB> <5C33> <23BC> <5D71> <23BD> <5D63> <23BE> <5D4A> <23BF> <5D65> <23C0> <5D72> <23C1> <5D6C> <23C2> <5D5E> <23C3> <5D68> <23C4> <5D67> <23C5> <5D62> <23C6> <5DF0> <23C7> <5E4F> <23C8> <5E4E> <23C9> <5E4A> <23CA> <5E4D> <23CB> <5E4B> <23CC> <5EC5> <23CD> <5ECC> <23CE> <5EC6> <23CF> <5ECB> <23D0> <5EC7> <23D1> <5F40> <23D2> <5FAF> <23D3> <5FAD> <23D4> <60F7> <23D7> <612B> <23D8> <6145> <23D9> <6136> <23DA> <6132> <23DB> <612E> <23DC> <6146> <23DD> <612F> <23DE> <614F> <23DF> <6129> <23E0> <6140> <23E1> <6220> <23E2> <9168> <23E3> <6223> <23E4> <6225> <23E5> <6224> <23E6> <63C5> <23E7> <63F1> <23E8> <63EB> <23E9> <6410> <23EA> <6412> <23EB> <6409> <23EC> <6420> <23ED> <6424> <23EE> <6433> <23EF> <6443> <23F0> <641F> endbfchar 100 beginbfchar <23F1> <6415> <23F2> <6418> <23F3> <6439> <23F4> <6437> <23F7> <640C> <23F8> <6426> <23F9> <6430> <23FA> <6428> <23FB> <6441> <23FC> <6435> <23FD> <642F> <23FE> <640A> <23FF> <641A> <2400> <6440> <2401> <6425> <2402> <6427> <2403> <640B> <2404> <63E7> <2405> <641B> <2406> <642E> <2407> <6421> <2408> <640E> <2409> <656F> <240A> <6592> <240B> <65D3> <240C> <6686> <240D> <668C> <240E> <6695> <240F> <6690> <2410> <668B> <2411> <668A> <2412> <6699> <2413> <6694> <2414> <6678> <2415> <6720> <2416> <6966> <2417> <695F> <2418> <6938> <2419> <694E> <241A> <6962> <241B> <6971> <241C> <693F> <241D> <6945> <241E> <696A> <241F> <6939> <2420> <6942> <2421> <6957> <2422> <6959> <2423> <697A> <2426> <6935> <2427> <696C> <2428> <6933> <2429> <693D> <242A> <6965> <242B> <68F0> <242C> <6978> <242D> <6934> <242E> <6969> <242F> <6940> <2430> <696F> <2431> <6944> <2432> <6976> <2433> <6958> <2434> <6941> <2435> <6974> <2436> <694C> <2437> <693B> <2438> <694B> <2439> <6937> <243A> <695C> <243B> <694F> <243C> <6951> <243D> <6932> <243E> <6952> <243F> <692F> <2440> <697B> <2441> <693C> <2442> <6B46> <2443> <6B45> <2444> <6B43> <2445> <6B42> <2446> <6B48> <2447> <6B41> <2448> <6B9B> <244B> <6BF9> <244E> <6E9B> <244F> <6ED6> <2450> <6EC8> <2451> <6E8F> <2452> <6EC0> <2453> <6E9F> <2456> <6EA0> <2457> <6EB1> <2458> <6EB9> <2459> <6EC6> <245A> <6ED2> <245B> <6EBD> <245C> <6EC1> <245D> <6E9E> <245E> <6EC9> endbfchar 100 beginbfchar <245F> <6EB7> <2460> <6EB0> <2461> <6ECD> <2462> <6EA6> <2463> <6ECF> <2464> <6EB2> <2465> <6EBE> <2466> <6EC3> <2467> <6EDC> <2468> <6ED8> <2469> <6E99> <246A> <6E92> <246B> <6E8E> <246C> <6E8D> <246D> <6EA4> <246E> <6EA1> <246F> <6EBF> <2470> <6EB3> <2471> <6ED0> <2472> <6ECA> <2473> <6E97> <2474> <6EAE> <2475> <6EA3> <2476> <7147> <2477> <7154> <2478> <7152> <2479> <7163> <247A> <7160> <247B> <7141> <247C> <715D> <247D> <7162> <247E> <7172> <247F> <7178> <2480> <716A> <2481> <7161> <2482> <7142> <2483> <7158> <2484> <7143> <2485> <714B> <2486> <7170> <2487> <715F> <2488> <7150> <2489> <7153> <248A> <7144> <248B> <714D> <248C> <715A> <248D> <724F> <248E> <728D> <248F> <728C> <2490> <7291> <2491> <7290> <2492> <728E> <2493> <733C> <2494> <7342> <2495> <733B> <2496> <733A> <2497> <7340> <2498> <734A> <2499> <7349> <249A> <7444> <249D> <7452> <249E> <7451> <249F> <7457> <24A0> <7440> <24A3> <744E> <24A4> <7442> <24A5> <7446> <24A6> <744D> <24A7> <7454> <24A8> <74E1> <24A9> <74FF> <24AA> <74FE> <24AB> <74FD> <24AC> <751D> <24AD> <7579> <24AE> <7577> <24AF> <6983> <24B0> <75EF> <24B1> <760F> <24B2> <7603> <24B3> <75F7> <24B4> <75FE> <24B5> <75FC> <24B6> <75F9> <24B7> <75F8> <24B8> <7610> <24B9> <75FB> <24BA> <75F6> <24BB> <75ED> <24BC> <75F5> <24BD> <75FD> <24BE> <7699> <24BF> <76B5> <24C0> <76DD> <24C1> <7755> <24C4> <7752> <24C5> <7756> <24C6> <775A> <24C7> <7769> <24C8> <7767> endbfchar 100 beginbfchar <24C9> <7754> <24CA> <7759> <24CB> <776D> <24CC> <77E0> <24CD> <7887> <24CE> <789A> <24CF> <7894> <24D0> <788F> <24D1> <7884> <24D2> <7895> <24D5> <78A1> <24D6> <7883> <24D7> <7879> <24D8> <7899> <24D9> <7880> <24DA> <7896> <24DB> <787B> <24DC> <797C> <24DD> <7982> <24DE> <797D> <24DF> <7979> <24E0> <7A11> <24E3> <7A12> <24E4> <7A17> <24E5> <7A15> <24E6> <7A22> <24E7> <7A13> <24E8> <7A1B> <24E9> <7A10> <24EA> <7AA3> <24EB> <7AA2> <24EC> <7A9E> <24ED> <7AEB> <24EE> <7B66> <24EF> <7B64> <24F0> <7B6D> <24F1> <7B74> <24F2> <7B69> <24F3> <7B72> <24F4> <7B65> <24F5> <7B73> <24F6> <7B71> <24F7> <7B70> <24F8> <7B61> <24F9> <7B78> <24FA> <7B76> <24FB> <7B63> <24FC> <7CB2> <24FD> <7CB4> <24FE> <7CAF> <24FF> <7D88> <2500> <7D86> <2501> <7D80> <2502> <7D8D> <2503> <7D7F> <2504> <7D85> <2505> <7D7A> <2506> <7D8E> <2507> <7D7B> <2508> <7D83> <2509> <7D7C> <250A> <7D8C> <250B> <7D94> <250C> <7D84> <250D> <7D7D> <250E> <7D92> <250F> <7F6D> <2510> <7F6B> <2513> <7F6C> <2514> <7FA6> <2515> <7FA5> <2516> <7FA7> <2519> <8021> <251A> <8164> <251B> <8160> <251C> <8177> <251D> <815C> <251E> <8169> <251F> <815B> <2520> <8162> <2521> <8172> <2522> <6721> <2523> <815E> <2524> <8176> <2525> <8167> <2526> <816F> <2527> <8144> <2528> <8161> <2529> <821D> <252A> <8249> <252B> <8244> <252C> <8240> <252D> <8242> <252E> <8245> <252F> <84F1> <2530> <843F> <2531> <8456> <2532> <8476> <2533> <8479> <2534> <848F> endbfchar 100 beginbfchar <2535> <848D> <2536> <8465> <2537> <8451> <2538> <8440> <2539> <8486> <253A> <8467> <253B> <8430> <253C> <844D> <253D> <847D> <253E> <845A> <253F> <8459> <2540> <8474> <2541> <8473> <2542> <845D> <2543> <8507> <2544> <845E> <2545> <8437> <2546> <843A> <2547> <8434> <2548> <847A> <2549> <8443> <254A> <8478> <254B> <8432> <254C> <8445> <254D> <8429> <254E> <83D9> <254F> <844B> <2550> <842F> <2551> <8442> <2552> <842D> <2553> <845F> <2554> <8470> <2555> <8439> <2556> <844E> <2557> <844C> <2558> <8452> <2559> <846F> <255A> <84C5> <255B> <848E> <255C> <843B> <255D> <8447> <255E> <8436> <255F> <8433> <2560> <8468> <2561> <847E> <2562> <8444> <2563> <842B> <2564> <8460> <2565> <8454> <2566> <846E> <2567> <8450> <2568> <870B> <2569> <8704> <256A> <86F7> <256B> <870C> <256C> <86FA> <256D> <86D6> <256E> <86F5> <256F> <874D> <2570> <86F8> <2571> <870E> <2572> <8709> <2573> <8701> <2574> <86F6> <2575> <870D> <2576> <8705> <2577> <88D6> <2578> <88CB> <257B> <88DE> <257C> <88DB> <257D> <88DA> <257E> <88CC> <257F> <88D0> <2580> <8985> <2581> <899B> <2582> <89DF> <2583> <89E5> <2584> <89E4> <2585> <89E1> <2586> <89E0> <2587> <89E2> <2588> <89DC> <2589> <89E6> <258A> <8A76> <258B> <8A86> <258C> <8A7F> <258D> <8A61> <258E> <8A3F> <258F> <8A77> <2590> <8A82> <2591> <8A84> <2592> <8A75> <2593> <8A83> <2594> <8A81> <2595> <8A74> <2596> <8A7A> <2597> <8C3C> <2598> <8C4B> <2599> <8C4A> <259A> <8C65> endbfchar 100 beginbfchar <259B> <8C64> <259C> <8C66> <259D> <8C86> <25A0> <8CCC> <25A3> <8D91> <25A4> <8D8C> <25A7> <8D8D> <25AA> <8D90> <25AB> <8D92> <25AC> <8DF0> <25AD> <8DE0> <25AE> <8DEC> <25AF> <8DF1> <25B0> <8DEE> <25B1> <8DD0> <25B2> <8DE9> <25B3> <8DE3> <25B4> <8DE2> <25B5> <8DE7> <25B6> <8DF2> <25B7> <8DEB> <25B8> <8DF4> <25B9> <8F06> <25BA> <8EFF> <25BB> <8F01> <25BC> <8F00> <25BD> <8F05> <25C0> <8F02> <25C1> <8F0B> <25C2> <9052> <25C3> <903F> <25C4> <9044> <25C5> <9049> <25C6> <903D> <25C7> <9110> <25C8> <910D> <25C9> <910F> <25CA> <9111> <25CB> <9116> <25CC> <9114> <25CD> <910B> <25CE> <910E> <25D1> <9248> <25D2> <9252> <25D3> <9230> <25D4> <923A> <25D5> <9266> <25D6> <9233> <25D7> <9265> <25D8> <925E> <25D9> <9283> <25DA> <922E> <25DB> <924A> <25DC> <9246> <25DD> <926D> <25DE> <926C> <25DF> <924F> <25E0> <9260> <25E1> <9267> <25E2> <926F> <25E3> <9236> <25E4> <9261> <25E5> <9270> <25E6> <9231> <25E7> <9254> <25E8> <9263> <25E9> <9250> <25EA> <9272> <25EB> <924E> <25EC> <9253> <25ED> <924C> <25EE> <9256> <25EF> <9232> <25F0> <959F> <25F1> <959C> <25F2> <959E> <25F3> <959B> <25F6> <9691> <25F7> <9697> <25F8> <96CE> <25F9> <96FA> <25FA> <96FD> <25FB> <96F8> <25FC> <96F5> <25FD> <9773> <2600> <9772> <2601> <980F> <2604> <98AC> <2605> <98F6> <2606> <98F9> <2607> <99AF> <2608> <99B2> <2609> <99B0> <260A> <99B5> <260B> <9AAD> <260C> <9AAB> <260D> <9B5B> <260E> <9CEA> <260F> <9CED> <2610> <9CE7> endbfchar 100 beginbfchar <2611> <9E80> <2612> <9EFD> <2613> <50E6> <2614> <50D4> <2615> <50D7> <2616> <50E8> <2617> <50F3> <2618> <50DB> <2619> <50EA> <261A> <50DD> <261B> <50E4> <261C> <50D3> <261D> <50EC> <261E> <50F0> <261F> <50EF> <2620> <50E3> <2621> <50E0> <2622> <51D8> <2625> <52E9> <2626> <52EB> <2627> <5330> <2628> <53AC> <2629> <5627> <262A> <5615> <262B> <560C> <262C> <5612> <262D> <55FC> <262E> <560F> <262F> <561C> <2630> <5601> <2631> <5613> <2632> <5602> <2633> <55FA> <2634> <561D> <2635> <5604> <2636> <55FF> <2637> <55F9> <2638> <5889> <2639> <587C> <263A> <5890> <263B> <5898> <263C> <5886> <263D> <5881> <263E> <587F> <263F> <5874> <2640> <588B> <2641> <587A> <2642> <5887> <2643> <5891> <2644> <588E> <2645> <5876> <2646> <5882> <2647> <5888> <2648> <587B> <2649> <5894> <264A> <588F> <264B> <58FE> <264C> <596B> <264D> <5ADC> <264E> <5AEE> <264F> <5AE5> <2650> <5AD5> <2651> <5AEA> <2652> <5ADA> <2653> <5AED> <2654> <5AEB> <2655> <5AF3> <2656> <5AE2> <2657> <5AE0> <2658> <5ADB> <2659> <5AEC> <265A> <5ADE> <265B> <5ADD> <265C> <5AD9> <265D> <5AE8> <265E> <5ADF> <265F> <5B77> <2660> <5BE0> <2661> <5BE3> <2662> <5C63> <2663> <5D82> <2664> <5D80> <2665> <5D7D> <2666> <5D86> <2667> <5D7A> <2668> <5D81> <2669> <5D77> <266A> <5D8A> <266B> <5D89> <266C> <5D88> <266D> <5D7E> <266E> <5D7C> <266F> <5D8D> <2670> <5D79> <2671> <5D7F> <2674> <5E53> <2675> <5ED8> <2676> <5ED1> <2677> <5ED7> <2678> <5ECE> endbfchar 100 beginbfchar <2679> <5EDC> <267A> <5ED5> <267B> <5ED9> <267C> <5ED2> <267D> <5ED4> <267E> <5F44> <267F> <5F43> <2680> <5F6F> <2681> <5FB6> <2682> <612C> <2683> <6128> <2684> <6141> <2685> <615E> <2686> <6171> <2687> <6173> <268A> <6172> <268B> <616C> <268C> <6180> <268D> <6174> <268E> <6154> <268F> <617A> <2690> <615B> <2691> <6165> <2692> <613B> <2693> <616A> <2694> <6161> <2695> <6156> <2696> <6229> <2697> <6227> <2698> <622B> <2699> <642B> <269A> <644D> <269B> <645B> <269C> <645D> <269D> <6474> <269E> <6476> <26A1> <647D> <26A2> <6475> <26A3> <6466> <26A4> <64A6> <26A5> <644E> <26A6> <6482> <26A7> <645E> <26A8> <645C> <26A9> <644B> <26AA> <6453> <26AB> <6460> <26AC> <6450> <26AD> <647F> <26AE> <643F> <26AF> <646C> <26B0> <646B> <26B1> <6459> <26B2> <6465> <26B3> <6477> <26B4> <6573> <26B5> <65A0> <26B6> <66A1> <26B7> <66A0> <26B8> <669F> <26B9> <6705> <26BA> <6704> <26BB> <6722> <26BC> <69B1> <26BD> <69B6> <26BE> <69C9> <26BF> <69A0> <26C0> <69CE> <26C1> <6996> <26C2> <69B0> <26C3> <69AC> <26C4> <69BC> <26C5> <6991> <26C6> <6999> <26C7> <698E> <26C8> <69A7> <26C9> <698D> <26CA> <69A9> <26CB> <69BE> <26CC> <69AF> <26CD> <69BF> <26CE> <69C4> <26CF> <69BD> <26D0> <69A4> <26D1> <69D4> <26D2> <69B9> <26D3> <69CA> <26D4> <699A> <26D5> <69CF> <26D6> <69B3> <26D7> <6993> <26D8> <69AA> <26D9> <69A1> <26DA> <699E> <26DB> <69D9> <26DC> <6997> <26DD> <6990> <26DE> <69C2> <26DF> <69B5> <26E0> <69A5> endbfchar 100 beginbfchar <26E1> <69C6> <26E2> <6B4A> <26E3> <6B4D> <26E4> <6B4B> <26EA> <6BFE> <26EB> <6ECE> <26EC> <6EF5> <26ED> <6EF1> <26EE> <6F03> <26EF> <6F25> <26F0> <6EF8> <26F1> <6F37> <26F2> <6EFB> <26F3> <6F2E> <26F4> <6F09> <26F5> <6F4E> <26F8> <6F27> <26F9> <6F18> <26FA> <6F3B> <26FB> <6F12> <26FC> <6EED> <26FD> <6F0A> <26FE> <6F36> <26FF> <6F73> <2700> <6EF9> <2701> <6EEE> <2702> <6F2D> <2703> <6F40> <2704> <6F30> <2705> <6F3C> <2706> <6F35> <2707> <6EEB> <2708> <6F07> <2709> <6F0E> <270A> <6F43> <270B> <6F05> <270C> <6EFD> <270D> <6EF6> <270E> <6F39> <270F> <6F1C> <2710> <6EFC> <2711> <6F3A> <2712> <6F1F> <2713> <6F0D> <2714> <6F1E> <2715> <6F08> <2716> <6F21> <2717> <7187> <2718> <7190> <2719> <7189> <271A> <7180> <271B> <7185> <271C> <7182> <271D> <718F> <271E> <717B> <271F> <7186> <2720> <7181> <2721> <7197> <2722> <7244> <2723> <7253> <2724> <7297> <2725> <7295> <2726> <7293> <2727> <7343> <2728> <734D> <2729> <7351> <272A> <734C> <272B> <7462> <272C> <7473> <272D> <7471> <272E> <7475> <272F> <7472> <2730> <7467> <2731> <746E> <2732> <7500> <2735> <757D> <2736> <7590> <2737> <7616> <2738> <7608> <2739> <760C> <273A> <7615> <273B> <7611> <273C> <760A> <273D> <7614> <273E> <76B8> <273F> <7781> <2740> <777C> <2741> <7785> <2742> <7782> <2743> <776E> <2744> <7780> <2745> <776F> <2746> <777E> <2747> <7783> <2748> <78B2> <2749> <78AA> <274A> <78B4> <274B> <78AD> <274C> <78A8> <274D> <787E> endbfchar 100 beginbfchar <274E> <78AB> <274F> <789E> <2750> <78A5> <2751> <78A0> <2752> <78AC> <2753> <78A2> <2754> <78A4> <2755> <7998> <2758> <7996> <2759> <7995> <275A> <7994> <275B> <7993> <275C> <7997> <275D> <7988> <275E> <7992> <275F> <7990> <2760> <7A2B> <2761> <7A4A> <2762> <7A30> <2763> <7A2F> <2764> <7A28> <2765> <7A26> <2766> <7AA8> <2769> <7AEE> <276A> <7B88> <276B> <7B9C> <276C> <7B8A> <276D> <7B91> <276E> <7B90> <276F> <7B96> <2770> <7B8D> <2771> <7B8C> <2772> <7B9B> <2773> <7B8E> <2774> <7B85> <2775> <7B98> <2776> <5284> <2777> <7B99> <2778> <7BA4> <2779> <7B82> <277A> <7CBB> <277B> <7CBF> <277C> <7CBC> <277D> <7CBA> <277E> <7DA7> <277F> <7DB7> <2780> <7DC2> <2781> <7DA3> <2782> <7DAA> <2783> <7DC1> <2784> <7DC0> <2785> <7DC5> <2786> <7D9D> <2787> <7DCE> <2788> <7DC4> <2789> <7DC6> <278C> <7DAF> <278D> <7DB9> <278E> <7D96> <278F> <7DBC> <2790> <7D9F> <2791> <7DA6> <2792> <7DAE> <2793> <7DA9> <2794> <7DA1> <2795> <7DC9> <2796> <7F73> <2799> <7FE5> <279A> <7FDE> <279B> <8024> <279C> <805D> <279D> <805C> <279E> <8189> <279F> <8186> <27A0> <8183> <27A1> <8187> <27A2> <818D> <27A3> <818C> <27A4> <818B> <27A5> <8215> <27A6> <8497> <27A7> <84A4> <27A8> <84A1> <27A9> <849F> <27AA> <84BA> <27AB> <84CE> <27AC> <84C2> <27AD> <84AC> <27AE> <84AE> <27AF> <84AB> <27B0> <84B9> <27B1> <84B4> <27B2> <84C1> <27B3> <84CD> <27B4> <84AA> <27B5> <849A> <27B6> <84B1> <27B7> <84D0> <27B8> <849D> <27B9> <84A7> endbfchar 100 beginbfchar <27BA> <84BB> <27BB> <84A2> <27BC> <8494> <27BD> <84C7> <27BE> <84CC> <27BF> <849B> <27C0> <84A9> <27C1> <84AF> <27C2> <84A8> <27C3> <84D6> <27C4> <8498> <27C5> <84B6> <27C6> <84CF> <27C7> <84A0> <27C8> <84D7> <27C9> <84D4> <27CA> <84D2> <27CB> <84DB> <27CC> <84B0> <27CD> <8491> <27CE> <8661> <27CF> <8733> <27D0> <8723> <27D1> <8728> <27D2> <876B> <27D3> <8740> <27D4> <872E> <27D5> <871E> <27D6> <8721> <27D7> <8719> <27D8> <871B> <27D9> <8743> <27DA> <872C> <27DB> <8741> <27DC> <873E> <27DD> <8746> <27DE> <8720> <27DF> <8732> <27E0> <872A> <27E1> <872D> <27E2> <873C> <27E3> <8712> <27E4> <873A> <27E5> <8731> <27E6> <8735> <27E7> <8742> <27EA> <8738> <27EB> <8724> <27EC> <871A> <27ED> <8730> <27EE> <8711> <27EF> <88F7> <27F0> <88E7> <27F3> <88FA> <27F4> <88FE> <27F5> <88EE> <27F6> <88FC> <27F7> <88F6> <27F8> <88FB> <27F9> <88F0> <27FA> <88EC> <27FB> <88EB> <27FC> <899D> <27FD> <89A1> <27FE> <899F> <27FF> <899E> <2800> <89E9> <2801> <89EB> <2802> <89E8> <2803> <8AAB> <2804> <8A99> <2805> <8A8B> <2806> <8A92> <2807> <8A8F> <2808> <8A96> <2809> <8C3D> <280C> <8CD5> <280D> <8CCF> <280E> <8CD7> <280F> <8D96> <2810> <8E09> <2811> <8E02> <2812> <8DFF> <2813> <8E0D> <2814> <8DFD> <2815> <8E0A> <2816> <8E03> <2817> <8E07> <2818> <8E06> <2819> <8E05> <281A> <8DFE> <281B> <8E00> <281C> <8E04> <281F> <8F0E> <2820> <8F0D> <2821> <9123> <2822> <911C> <2823> <9120> <2824> <9122> <2825> <911F> endbfchar 100 beginbfchar <2826> <911D> <2827> <911A> <2828> <9124> <2829> <9121> <282A> <911B> <282B> <917A> <282C> <9172> <282D> <9179> <282E> <9173> <282F> <92A5> <2830> <92A4> <2831> <9276> <2832> <929B> <2833> <927A> <2834> <92A0> <2835> <9294> <2836> <92AA> <2837> <928D> <2838> <92A6> <2839> <929A> <283A> <92AB> <283B> <9279> <283C> <9297> <283D> <927F> <283E> <92A3> <283F> <92EE> <2840> <928E> <2841> <9282> <2842> <9295> <2843> <92A2> <2844> <927D> <2845> <9288> <2846> <92A1> <2847> <928A> <2848> <9286> <2849> <928C> <284A> <9299> <284B> <92A7> <284C> <927E> <284D> <9287> <284E> <92A9> <284F> <929D> <2850> <928B> <2851> <922D> <2852> <969E> <2853> <96A1> <2854> <96FF> <2855> <9758> <2856> <977D> <2857> <977A> <2858> <977E> <2859> <9783> <285A> <9780> <285B> <9782> <285C> <977B> <285D> <9784> <285E> <9781> <285F> <977F> <2860> <97CE> <2861> <97CD> <2862> <9816> <2865> <9902> <2866> <9900> <2867> <9907> <2868> <999D> <2869> <999C> <286A> <99C3> <286B> <99B9> <286C> <99BB> <286D> <99BA> <286E> <99C2> <286F> <99BD> <2870> <99C7> <2871> <9AB1> <2872> <9AE3> <2873> <9AE7> <2878> <9B5F> <287B> <9CF5> <287C> <9EA7> <287D> <50FF> <287E> <5103> <287F> <5130> <2880> <50F8> <2883> <50F6> <2884> <50FE> <2887> <50FD> <2888> <510A> <288B> <52F1> <288C> <52EF> <288D> <5648> <288E> <5642> <288F> <564C> <2890> <5635> <2891> <5641> <2892> <564A> <2893> <5649> <2894> <5646> <2895> <5658> <2896> <565A> <2897> <5640> endbfchar 100 beginbfchar <2898> <5633> <2899> <563D> <289A> <562C> <289B> <563E> <289C> <5638> <289D> <562A> <289E> <563A> <289F> <571A> <28A0> <58AB> <28A1> <589D> <28A2> <58B1> <28A3> <58A0> <28A4> <58A3> <28A5> <58AF> <28A6> <58AC> <28A7> <58A5> <28A8> <58A1> <28A9> <58FF> <28AA> <5AFF> <28AB> <5AF4> <28AC> <5AFD> <28AD> <5AF7> <28AE> <5AF6> <28AF> <5B03> <28B0> <5AF8> <28B1> <5B02> <28B2> <5AF9> <28B3> <5B01> <28B4> <5B07> <28B5> <5B05> <28B6> <5B0F> <28B7> <5C67> <28B8> <5D99> <28B9> <5D97> <28BA> <5D9F> <28BB> <5D92> <28BC> <5DA2> <28BD> <5D93> <28BE> <5D95> <28BF> <5DA0> <28C0> <5D9C> <28C1> <5DA1> <28C2> <5D9A> <28C3> <5D9E> <28C4> <5E69> <28C5> <5E5D> <28C6> <5E60> <28C7> <5E5C> <28C8> <7DF3> <28C9> <5EDB> <28CA> <5EDE> <28CB> <5EE1> <28CC> <5F49> <28CD> <5FB2> <28CE> <618B> <28CF> <6183> <28D0> <6179> <28D1> <61B1> <28D2> <61B0> <28D3> <61A2> <28D4> <6189> <28D5> <619B> <28D6> <6193> <28D7> <61AF> <28D8> <61AD> <28D9> <619F> <28DA> <6192> <28DB> <61AA> <28DC> <61A1> <28DD> <618D> <28DE> <6166> <28DF> <61B3> <28E0> <622D> <28E1> <646E> <28E2> <6470> <28E3> <6496> <28E4> <64A0> <28E5> <6485> <28E6> <6497> <28E7> <649C> <28E8> <648F> <28E9> <648B> <28EA> <648A> <28EB> <648C> <28EC> <64A3> <28ED> <649F> <28EE> <6468> <28EF> <64B1> <28F0> <6498> <28F1> <6576> <28F2> <657A> <28F3> <6579> <28F4> <657B> <28F7> <66B5> <28F8> <66B0> <28F9> <66A9> <28FA> <66B2> <28FB> <66B7> <28FC> <66AA> <28FD> <66AF> endbfchar 100 beginbfchar <28FE> <6A00> <28FF> <6A06> <2900> <6A17> <2901> <69E5> <2902> <69F8> <2903> <6A15> <2904> <69F1> <2905> <69E4> <2906> <6A20> <2907> <69FF> <2908> <69EC> <2909> <69E2> <290A> <6A1B> <290B> <6A1D> <290C> <69FE> <290D> <6A27> <290E> <69F2> <290F> <69EE> <2910> <6A14> <2911> <69F7> <2912> <69E7> <2913> <6A40> <2914> <6A08> <2915> <69E6> <2916> <69FB> <2917> <6A0D> <2918> <69FC> <2919> <69EB> <291A> <6A09> <291B> <6A04> <291C> <6A18> <291D> <6A25> <291E> <6A0F> <291F> <69F6> <2920> <6A26> <2921> <6A07> <2922> <69F4> <2923> <6A16> <2924> <6B51> <2925> <6BA5> <2926> <6BA3> <2927> <6BA2> <2928> <6BA6> <2929> <6C01> <292A> <6C00> <292B> <6BFF> <292C> <6C02> <292D> <6F41> <292E> <6F26> <292F> <6F7E> <2930> <6F87> <2931> <6FC6> <2932> <6F92> <2933> <6F8D> <2934> <6F89> <2935> <6F8C> <2936> <6F62> <2937> <6F4F> <2938> <6F85> <2939> <6F5A> <293A> <6F96> <293B> <6F76> <293C> <6F6C> <293D> <6F82> <293E> <6F55> <293F> <6F72> <2940> <6F52> <2941> <6F50> <2942> <6F57> <2943> <6F94> <2944> <6F93> <2945> <6F5D> <2946> <6F00> <2947> <6F61> <2948> <6F6B> <2949> <6F7D> <294A> <6F67> <294B> <6F90> <294C> <6F53> <294D> <6F8B> <294E> <6F69> <294F> <6F7F> <2950> <6F95> <2951> <6F63> <2952> <6F77> <2953> <6F6A> <2954> <6F7B> <2955> <71B2> <2956> <71AF> <2957> <719B> <2958> <71B0> <2959> <71A0> <295A> <719A> <295B> <71A9> <295C> <71B5> <295D> <719D> <295E> <71A5> <295F> <719E> <2960> <71A4> <2961> <71A1> endbfchar 100 beginbfchar <2962> <71AA> <2963> <719C> <2964> <71A7> <2965> <71B3> <2966> <7298> <2967> <729A> <2968> <7358> <2969> <7352> <296D> <735D> <296E> <735B> <296F> <7361> <2970> <735A> <2971> <7359> <2972> <7362> <2973> <7487> <2976> <7486> <2977> <7481> <2978> <747D> <2979> <7485> <297A> <7488> <297B> <747C> <297C> <7479> <297D> <7508> <297E> <7507> <297F> <757E> <2980> <7625> <2981> <761E> <2982> <7619> <2983> <761D> <2984> <761C> <2985> <7623> <2986> <761A> <2987> <7628> <2988> <761B> <298C> <769B> <298D> <778D> <298E> <778F> <298F> <7789> <2990> <7788> <2991> <78CD> <2992> <78BB> <2993> <78CF> <2994> <78CC> <2995> <78D1> <2996> <78CE> <2997> <78D4> <2998> <78C8> <299B> <78C9> <299C> <799A> <299D> <79A1> <299E> <79A0> <299F> <799C> <29A0> <79A2> <29A1> <799B> <29A2> <6B76> <29A3> <7A39> <29A4> <7AB2> <29A5> <7AB4> <29A6> <7AB3> <29A7> <7BB7> <29A8> <7BCB> <29A9> <7BBE> <29AA> <7BAC> <29AB> <7BCE> <29AC> <7BAF> <29AD> <7BB9> <29AE> <7BCA> <29AF> <7BB5> <29B0> <7CC5> <29B1> <7CC8> <29B2> <7CCC> <29B3> <7CCB> <29B4> <7DF7> <29B5> <7DDB> <29B6> <7DEA> <29B7> <7DE7> <29B8> <7DD7> <29B9> <7DE1> <29BA> <7E03> <29BB> <7DFA> <29BC> <7DE6> <29BD> <7DF6> <29BE> <7DF1> <29BF> <7DF0> <29C0> <7DEE> <29C1> <7DDF> <29C2> <7F76> <29C3> <7FAC> <29C4> <7FB0> <29C5> <7FAD> <29C6> <7FED> <29C7> <7FEB> <29C8> <7FEA> <29C9> <7FEC> <29CA> <7FE6> <29CB> <7FE8> <29CC> <8064> <29CD> <8067> <29CE> <81A3> <29CF> <819F> endbfchar 100 beginbfchar <29D0> <819E> <29D1> <8195> <29D2> <81A2> <29D3> <8199> <29D4> <8197> <29D5> <8216> <29D6> <824F> <29D7> <8253> <29D8> <8252> <29D9> <8250> <29DA> <824E> <29DB> <8251> <29DC> <8524> <29DD> <853B> <29DE> <850F> <29DF> <8500> <29E0> <8529> <29E1> <850E> <29E2> <8509> <29E3> <850D> <29E4> <851F> <29E5> <850A> <29E6> <8527> <29E7> <851C> <29E8> <84FB> <29E9> <852B> <29EA> <84FA> <29EB> <8508> <29EC> <850C> <29ED> <84F4> <29EE> <852A> <29EF> <84F2> <29F0> <8515> <29F1> <84F7> <29F2> <84EB> <29F3> <84F3> <29F4> <84FC> <29F5> <8512> <29F6> <84EA> <29F7> <84E9> <29F8> <8516> <29F9> <84FE> <29FA> <8528> <29FB> <851D> <29FC> <852E> <29FD> <8502> <29FE> <84FD> <29FF> <851E> <2A00> <84F6> <2A01> <8531> <2A02> <8526> <2A05> <84F0> <2A06> <84EF> <2A07> <84F9> <2A08> <8518> <2A09> <8520> <2A0A> <8530> <2A0B> <850B> <2A0C> <8519> <2A0D> <852F> <2A0E> <8662> <2A0F> <8756> <2A12> <8777> <2A13> <87E1> <2A14> <8773> <2A15> <8758> <2A16> <8754> <2A17> <875B> <2A18> <8752> <2A19> <8761> <2A1A> <875A> <2A1B> <8751> <2A1C> <875E> <2A1D> <876D> <2A1E> <876A> <2A1F> <8750> <2A20> <874E> <2A21> <875F> <2A22> <875D> <2A23> <876F> <2A24> <876C> <2A25> <877A> <2A26> <876E> <2A27> <875C> <2A28> <8765> <2A29> <874F> <2A2A> <877B> <2A2B> <8775> <2A2C> <8762> <2A2D> <8767> <2A2E> <8769> <2A2F> <885A> <2A30> <8905> <2A31> <890C> <2A32> <8914> <2A33> <890B> <2A37> <8906> <2A38> <8916> <2A39> <8911> <2A3A> <890E> endbfchar 100 beginbfchar <2A3B> <8909> <2A3C> <89A2> <2A3D> <89A4> <2A3E> <89A3> <2A3F> <89ED> <2A40> <89F0> <2A41> <89EC> <2A42> <8ACF> <2A43> <8AC6> <2A44> <8AB8> <2A45> <8AD3> <2A46> <8AD1> <2A49> <8ABB> <2A4A> <8AD7> <2A4B> <8ABE> <2A4C> <8AC0> <2A4D> <8AC5> <2A4E> <8AD8> <2A4F> <8AC3> <2A50> <8ABA> <2A51> <8ABD> <2A52> <8AD9> <2A53> <8C3E> <2A54> <8C4D> <2A55> <8C8F> <2A56> <8CE5> <2A57> <8CDF> <2A58> <8CD9> <2A59> <8CE8> <2A5A> <8CDA> <2A5B> <8CDD> <2A5C> <8CE7> <2A5D> <8DA0> <2A5E> <8D9C> <2A5F> <8DA1> <2A60> <8D9B> <2A61> <8E20> <2A62> <8E23> <2A63> <8E25> <2A64> <8E24> <2A65> <8E2E> <2A66> <8E15> <2A67> <8E1B> <2A68> <8E16> <2A69> <8E11> <2A6A> <8E19> <2A6D> <8E14> <2A6E> <8E12> <2A6F> <8E18> <2A70> <8E13> <2A71> <8E1C> <2A72> <8E17> <2A73> <8E1A> <2A74> <8F2C> <2A75> <8F24> <2A76> <8F18> <2A77> <8F1A> <2A78> <8F20> <2A79> <8F23> <2A7C> <9073> <2A7D> <9070> <2A7E> <906F> <2A7F> <9067> <2A80> <906B> <2A81> <912F> <2A82> <912B> <2A85> <9132> <2A86> <9126> <2A87> <912E> <2A8A> <918A> <2A8D> <9184> <2A8E> <9180> <2A8F> <92D0> <2A92> <92C0> <2A93> <92D9> <2A94> <92B6> <2A95> <92CF> <2A96> <92F1> <2A97> <92DF> <2A98> <92D8> <2A99> <92E9> <2A9A> <92D7> <2A9B> <92DD> <2A9C> <92CC> <2A9D> <92EF> <2A9E> <92C2> <2A9F> <92E8> <2AA0> <92CA> <2AA1> <92C8> <2AA2> <92CE> <2AA3> <92E6> <2AA4> <92CD> <2AA5> <92D5> <2AA6> <92C9> <2AA7> <92E0> <2AA8> <92DE> <2AA9> <92E7> <2AAA> <92D1> <2AAB> <92D3> <2AAC> <92B5> endbfchar 100 beginbfchar <2AAD> <92E1> <2AAE> <9325> <2AAF> <92C6> <2AB0> <92B4> <2AB1> <957C> <2AB2> <95AC> <2AB3> <95AB> <2AB4> <95AE> <2AB5> <95B0> <2AB6> <96A4> <2AB7> <96A2> <2AB8> <96D3> <2AB9> <9705> <2ABA> <9708> <2ABB> <9702> <2ABC> <975A> <2ABD> <978A> <2ABE> <978E> <2ABF> <9788> <2AC0> <97D0> <2AC1> <97CF> <2AC2> <981E> <2AC3> <981D> <2AC4> <9826> <2AC5> <9829> <2AC6> <9828> <2AC7> <9820> <2AC8> <981B> <2AC9> <9827> <2ACA> <98B2> <2ACB> <9908> <2ACC> <98FA> <2ACD> <9911> <2ACE> <9914> <2AD1> <9915> <2AD2> <99DC> <2AD3> <99CD> <2AD4> <99CF> <2AD7> <99CE> <2AD8> <99C9> <2AD9> <99D6> <2ADA> <99D8> <2ADB> <99CB> <2ADC> <99D7> <2ADD> <99CC> <2ADE> <9AB3> <2ADF> <9AEC> <2AE0> <9AEB> <2AE1> <9AF3> <2AE2> <9AF2> <2AE3> <9AF1> <2AE4> <9B46> <2AE5> <9B43> <2AE6> <9B67> <2AE7> <9B74> <2AE8> <9B71> <2AE9> <9B66> <2AEA> <9B76> <2AEB> <9B75> <2AEC> <9B70> <2AED> <9B68> <2AEE> <9B64> <2AEF> <9B6C> <2AF0> <9CFC> <2AF1> <9CFA> <2AF2> <9CFD> <2AF3> <9CFF> <2AF4> <9CF7> <2AF5> <9D07> <2AF6> <9D00> <2AF7> <9CF9> <2AF8> <9CFB> <2AF9> <9D08> <2AFA> <9D05> <2AFB> <9D04> <2AFC> <9E83> <2AFD> <9ED3> <2B00> <511C> <2B01> <5113> <2B02> <5117> <2B03> <511A> <2B04> <5111> <2B05> <51DE> <2B06> <5334> <2B07> <53E1> <2B08> <5670> <2B09> <5660> <2B0A> <566E> <2B0B> <5673> <2B0C> <5666> <2B0D> <5663> <2B0E> <566D> <2B0F> <5672> <2B10> <565E> <2B11> <5677> <2B12> <571C> <2B13> <571B> <2B14> <58C8> <2B15> <58BD> <2B16> <58C9> endbfchar 100 beginbfchar <2B17> <58BF> <2B18> <58BA> <2B19> <58C2> <2B1A> <58BC> <2B1B> <58C6> <2B1C> <5B17> <2B1D> <5B19> <2B1E> <5B1B> <2B1F> <5B21> <2B20> <5B14> <2B21> <5B13> <2B22> <5B10> <2B23> <5B16> <2B24> <5B28> <2B25> <5B1A> <2B26> <5B20> <2B27> <5B1E> <2B28> <5BEF> <2B29> <5DAC> <2B2A> <5DB1> <2B2B> <5DA9> <2B2C> <5DA7> <2B2D> <5DB5> <2B2E> <5DB0> <2B2F> <5DAE> <2B30> <5DAA> <2B31> <5DA8> <2B32> <5DB2> <2B33> <5DAD> <2B34> <5DAF> <2B35> <5DB4> <2B38> <5E66> <2B39> <5E6F> <2B3A> <5EE9> <2B3B> <5EE7> <2B3C> <5EE6> <2B3D> <5EE8> <2B3E> <5EE5> <2B3F> <5F4B> <2B40> <5FBC> <2B41> <5FBB> <2B42> <619D> <2B43> <61A8> <2B44> <6196> <2B45> <61C5> <2B46> <61B4> <2B47> <61C6> <2B48> <61C1> <2B49> <61CC> <2B4A> <61BA> <2B4B> <61BF> <2B4C> <61B8> <2B4D> <618C> <2B4E> <64D7> <2B4F> <64D6> <2B50> <64D0> <2B51> <64CF> <2B52> <64C9> <2B53> <64BD> <2B54> <6489> <2B55> <64C3> <2B56> <64DB> <2B57> <64F3> <2B58> <64D9> <2B59> <6533> <2B5A> <657F> <2B5B> <657C> <2B5C> <65A2> <2B5D> <66C8> <2B5E> <66BE> <2B5F> <66C0> <2B62> <66CF> <2B63> <66BD> <2B64> <66BB> <2B65> <66BA> <2B66> <66CC> <2B67> <6723> <2B68> <6A34> <2B69> <6A66> <2B6A> <6A49> <2B6B> <6A67> <2B6C> <6A32> <2B6D> <6A68> <2B6E> <6A3E> <2B6F> <6A5D> <2B70> <6A6D> <2B71> <6A76> <2B72> <6A5B> <2B73> <6A51> <2B74> <6A28> <2B75> <6A5A> <2B76> <6A3B> <2B77> <6A3F> <2B78> <6A41> <2B79> <6A6A> <2B7A> <6A64> <2B7B> <6A50> <2B7C> <6A4F> <2B7D> <6A54> <2B7E> <6A6F> endbfchar 100 beginbfchar <2B7F> <6A69> <2B80> <6A60> <2B81> <6A3C> <2B82> <6A5E> <2B83> <6A56> <2B84> <6A55> <2B87> <6A46> <2B88> <6B55> <2B89> <6B54> <2B8A> <6B56> <2B8B> <6BA7> <2B8E> <6BC8> <2B8F> <6BC7> <2B90> <6C04> <2B91> <6C03> <2B92> <6C06> <2B93> <6FAD> <2B94> <6FCB> <2B95> <6FA3> <2B96> <6FC7> <2B97> <6FBC> <2B98> <6FCE> <2B99> <6FC8> <2B9A> <6F5E> <2B9B> <6FC4> <2B9C> <6FBD> <2B9D> <6F9E> <2B9E> <6FCA> <2B9F> <6FA8> <2BA0> <7004> <2BA1> <6FA5> <2BA2> <6FAE> <2BA3> <6FBA> <2BA4> <6FAC> <2BA5> <6FAA> <2BA6> <6FCF> <2BA7> <6FBF> <2BA8> <6FB8> <2BA9> <6FA2> <2BAA> <6FC9> <2BAB> <6FAB> <2BAC> <6FCD> <2BAD> <6FAF> <2BAE> <6FB2> <2BAF> <6FB0> <2BB0> <71C5> <2BB1> <71C2> <2BB2> <71BF> <2BB3> <71B8> <2BB4> <71D6> <2BB7> <71CB> <2BB8> <71D4> <2BB9> <71CA> <2BBA> <71C7> <2BBB> <71CF> <2BBC> <71BD> <2BBD> <71D8> <2BBE> <71BC> <2BBF> <71C6> <2BC4> <7369> <2BC7> <736C> <2BC8> <7365> <2BC9> <736B> <2BCA> <736A> <2BCB> <747F> <2BCC> <749A> <2BCD> <74A0> <2BCE> <7494> <2BCF> <7492> <2BD0> <7495> <2BD1> <74A1> <2BD2> <750B> <2BD3> <7580> <2BD4> <762F> <2BD5> <762D> <2BD6> <7631> <2BD7> <763D> <2BD8> <7633> <2BD9> <763C> <2BDA> <7635> <2BDB> <7632> <2BDC> <7630> <2BDD> <76BB> <2BDE> <76E6> <2BDF> <779A> <2BE0> <779D> <2BE1> <77A1> <2BE2> <779C> <2BE3> <779B> <2BE6> <7795> <2BE7> <7799> <2BE8> <7797> <2BE9> <78DD> <2BEA> <78E9> <2BEB> <78E5> <2BEC> <78EA> <2BED> <78DE> <2BEE> <78E3> <2BEF> <78DB> <2BF2> <78ED> endbfchar 100 beginbfchar <2BF5> <79A4> <2BF6> <7A44> <2BF7> <7A48> <2BF8> <7A47> <2BF9> <7AB6> <2BFA> <7AB8> <2BFB> <7AB5> <2BFC> <7AB1> <2BFD> <7AB7> <2BFE> <7BDE> <2BFF> <7BE3> <2C00> <7BE7> <2C01> <7BDD> <2C02> <7BD5> <2C03> <7BE5> <2C04> <7BDA> <2C05> <7BE8> <2C06> <7BF9> <2C07> <7BD4> <2C08> <7BEA> <2C09> <7BE2> <2C0A> <7BDC> <2C0B> <7BEB> <2C0C> <7BD8> <2C0D> <7BDF> <2C0E> <7CD2> <2C0F> <7CD4> <2C10> <7CD7> <2C13> <7E12> <2C14> <7E21> <2C15> <7E17> <2C16> <7E0C> <2C19> <7E13> <2C1A> <7E0E> <2C1B> <7E1C> <2C1C> <7E15> <2C1D> <7E1A> <2C1E> <7E22> <2C1F> <7E0B> <2C20> <7E0F> <2C21> <7E16> <2C22> <7E0D> <2C23> <7E14> <2C24> <7E25> <2C25> <7E24> <2C26> <7F43> <2C29> <7F7A> <2C2A> <7FB1> <2C2B> <7FEF> <2C2C> <802A> <2C2D> <8029> <2C2E> <806C> <2C2F> <81B1> <2C30> <81A6> <2C31> <81AE> <2C32> <81B9> <2C33> <81B5> <2C34> <81AB> <2C35> <81B0> <2C36> <81AC> <2C37> <81B4> <2C38> <81B2> <2C39> <81B7> <2C3A> <81A7> <2C3B> <81F2> <2C3F> <8556> <2C40> <8545> <2C41> <856B> <2C42> <854D> <2C43> <8553> <2C44> <8561> <2C45> <8558> <2C46> <8540> <2C47> <8546> <2C48> <8564> <2C49> <8541> <2C4A> <8562> <2C4B> <8544> <2C4C> <8551> <2C4D> <8547> <2C4E> <8563> <2C4F> <853E> <2C50> <855B> <2C51> <8571> <2C52> <854E> <2C53> <856E> <2C54> <8575> <2C55> <8555> <2C56> <8567> <2C57> <8560> <2C58> <858C> <2C59> <8566> <2C5A> <855D> <2C5B> <8554> <2C5C> <8565> <2C5D> <856C> <2C5E> <8663> <2C5F> <8665> <2C60> <8664> <2C61> <87A4> endbfchar 100 beginbfchar <2C62> <879B> <2C63> <878F> <2C64> <8797> <2C65> <8793> <2C66> <8792> <2C67> <8788> <2C68> <8781> <2C69> <8796> <2C6A> <8798> <2C6B> <8779> <2C6C> <8787> <2C6D> <87A3> <2C6E> <8785> <2C71> <879D> <2C72> <8784> <2C73> <8794> <2C74> <879C> <2C75> <879A> <2C76> <8789> <2C77> <891E> <2C78> <8926> <2C79> <8930> <2C7C> <8927> <2C7D> <8931> <2C7E> <8922> <2C7F> <8929> <2C80> <8923> <2C81> <892F> <2C82> <892C> <2C83> <891F> <2C84> <89F1> <2C85> <8AE0> <2C86> <8AE2> <2C87> <8AF2> <2C8A> <8ADD> <2C8B> <8B14> <2C8C> <8AE4> <2C8D> <8ADF> <2C8E> <8AF0> <2C8F> <8AC8> <2C90> <8ADE> <2C91> <8AE1> <2C92> <8AE8> <2C93> <8AFF> <2C94> <8AEF> <2C95> <8AFB> <2C98> <8C90> <2C99> <8CF5> <2C9A> <8CEE> <2C9B> <8CF1> <2C9C> <8CF0> <2C9D> <8CF3> <2C9E> <8D6C> <2C9F> <8D6E> <2CA0> <8DA5> <2CA1> <8DA7> <2CA2> <8E33> <2CA3> <8E3E> <2CA4> <8E38> <2CA5> <8E40> <2CA6> <8E45> <2CA7> <8E36> <2CAA> <8E41> <2CAB> <8E30> <2CAC> <8E3F> <2CAD> <8EBD> <2CAE> <8F36> <2CAF> <8F2E> <2CB0> <8F35> <2CB1> <8F32> <2CB2> <8F39> <2CB3> <8F37> <2CB4> <8F34> <2CB5> <9076> <2CB6> <9079> <2CB7> <907B> <2CB8> <9086> <2CB9> <90FA> <2CBA> <9133> <2CBD> <9193> <2CC0> <918D> <2CC1> <918F> <2CC2> <9327> <2CC3> <931E> <2CC4> <9308> <2CC5> <931F> <2CC6> <9306> <2CC7> <930F> <2CC8> <937A> <2CC9> <9338> <2CCA> <933C> <2CCB> <931B> <2CCC> <9323> <2CCD> <9312> <2CCE> <9301> <2CCF> <9346> <2CD0> <932D> <2CD1> <930E> <2CD2> <930D> <2CD3> <92CB> endbfchar 100 beginbfchar <2CD4> <931D> <2CD5> <92FA> <2CD6> <9313> <2CD7> <92F9> <2CD8> <92F7> <2CD9> <9334> <2CDA> <9302> <2CDB> <9324> <2CDC> <92FF> <2CDD> <9329> <2CDE> <9339> <2CDF> <9335> <2CE0> <932A> <2CE1> <9314> <2CE2> <930C> <2CE3> <930B> <2CE4> <92FE> <2CE5> <9309> <2CE6> <9300> <2CE7> <92FB> <2CE8> <9316> <2CE9> <95BC> <2CEA> <95CD> <2CEB> <95BE> <2CEE> <95B6> <2CEF> <95BF> <2CF0> <95B5> <2CF1> <95BD> <2CF2> <96A9> <2CF3> <96D4> <2CF4> <970B> <2CF5> <9712> <2CF6> <9710> <2CF7> <9799> <2CF8> <9797> <2CF9> <9794> <2CFA> <97F0> <2CFB> <97F8> <2CFC> <9835> <2CFD> <982F> <2CFE> <9832> <2CFF> <9924> <2D00> <991F> <2D01> <9927> <2D02> <9929> <2D03> <999E> <2D04> <99EE> <2D05> <99EC> <2D06> <99E5> <2D07> <99E4> <2D08> <99F0> <2D09> <99E3> <2D0A> <99EA> <2D0B> <99E9> <2D0C> <99E7> <2D0D> <9AB9> <2D0E> <9ABF> <2D0F> <9AB4> <2D10> <9ABB> <2D11> <9AF6> <2D12> <9AFA> <2D13> <9AF9> <2D14> <9AF7> <2D15> <9B33> <2D16> <9B80> <2D17> <9B85> <2D18> <9B87> <2D19> <9B7C> <2D1A> <9B7E> <2D1B> <9B7B> <2D1C> <9B82> <2D1D> <9B93> <2D1E> <9B92> <2D1F> <9B90> <2D20> <9B7A> <2D21> <9B95> <2D22> <9B7D> <2D23> <9B88> <2D24> <9D25> <2D25> <9D17> <2D26> <9D20> <2D27> <9D1E> <2D28> <9D14> <2D29> <9D29> <2D2A> <9D1D> <2D2B> <9D18> <2D2C> <9D22> <2D2D> <9D10> <2D2E> <9D19> <2D2F> <9D1F> <2D30> <9E88> <2D33> <9EAE> <2D34> <9EAD> <2D37> <9EFA> <2D38> <9F12> <2D39> <9F3D> <2D3A> <5126> <2D3B> <5125> <2D3C> <5122> <2D3D> <5124> endbfchar 100 beginbfchar <2D3E> <5120> <2D3F> <5129> <2D40> <52F4> <2D41> <5693> <2D44> <5686> <2D45> <5684> <2D46> <5683> <2D47> <567E> <2D48> <5682> <2D49> <567F> <2D4A> <5681> <2D4B> <58D6> <2D4C> <58D4> <2D4D> <58CF> <2D4E> <58D2> <2D4F> <5B2D> <2D50> <5B25> <2D51> <5B32> <2D52> <5B23> <2D53> <5B2C> <2D54> <5B27> <2D55> <5B26> <2D56> <5B2F> <2D57> <5B2E> <2D58> <5B7B> <2D5B> <5DB7> <2D5C> <5E6C> <2D5D> <5E6A> <2D5E> <5FBE> <2D5F> <61C3> <2D60> <61B5> <2D61> <61BC> <2D62> <61E7> <2D63> <61E0> <2D64> <61E5> <2D65> <61E4> <2D66> <61E8> <2D67> <61DE> <2D68> <64EF> <2D69> <64E9> <2D6A> <64E3> <2D6B> <64EB> <2D6C> <64E4> <2D6D> <64E8> <2D6E> <6581> <2D6F> <6580> <2D70> <65B6> <2D71> <65DA> <2D72> <66D2> <2D73> <6A8D> <2D74> <6A96> <2D75> <6A81> <2D76> <6AA5> <2D77> <6A89> <2D78> <6A9F> <2D79> <6A9B> <2D7A> <6AA1> <2D7B> <6A9E> <2D7C> <6A87> <2D7D> <6A93> <2D7E> <6A8E> <2D7F> <6A95> <2D80> <6A83> <2D81> <6AA8> <2D82> <6AA4> <2D83> <6A91> <2D84> <6A7F> <2D85> <6AA6> <2D86> <6A9A> <2D87> <6A85> <2D88> <6A8C> <2D89> <6A92> <2D8A> <6B5B> <2D8B> <6BAD> <2D8C> <6C09> <2D8D> <6FCC> <2D8E> <6FA9> <2D8F> <6FF4> <2D90> <6FD4> <2D91> <6FE3> <2D92> <6FDC> <2D93> <6FED> <2D94> <6FE7> <2D95> <6FE6> <2D96> <6FDE> <2D97> <6FF2> <2D98> <6FDD> <2D99> <6FE2> <2D9A> <6FE8> <2D9B> <71E1> <2D9C> <71F1> <2D9D> <71E8> <2D9E> <71F2> <2D9F> <71E4> <2DA0> <71F0> <2DA1> <71E2> <2DA2> <7373> <2DA5> <7497> <2DA6> <74B2> <2DA7> <74AB> endbfchar 100 beginbfchar <2DA8> <7490> <2DA9> <74AA> <2DAA> <74AD> <2DAB> <74B1> <2DAC> <74A5> <2DAD> <74AF> <2DB1> <750F> <2DB2> <7584> <2DB3> <7643> <2DB6> <7647> <2DB7> <76A4> <2DB8> <76E9> <2DB9> <77B5> <2DBA> <77AB> <2DBB> <77B2> <2DBC> <77B7> <2DBD> <77B6> <2DBE> <77B4> <2DBF> <77B1> <2DC0> <77A8> <2DC1> <77F0> <2DC2> <78F3> <2DC3> <78FD> <2DC4> <7902> <2DC7> <78FF> <2DC8> <78F2> <2DC9> <7905> <2DCA> <78F9> <2DCB> <78FE> <2DCC> <7904> <2DCD> <79AB> <2DCE> <79A8> <2DCF> <7A5C> <2DD0> <7A5B> <2DD1> <7A56> <2DD2> <7A58> <2DD3> <7A54> <2DD4> <7A5A> <2DD5> <7ABE> <2DD8> <7C05> <2DD9> <7C0F> <2DDA> <7BF2> <2DDB> <7C00> <2DDC> <7BFF> <2DDD> <7BFB> <2DDE> <7C0E> <2DDF> <7BF4> <2DE0> <7C0B> <2DE1> <7BF3> <2DE2> <7C02> <2DE3> <7C09> <2DE4> <7C03> <2DE5> <7C01> <2DE6> <7BF8> <2DE7> <7BFD> <2DE8> <7C06> <2DEB> <7C10> <2DEC> <7C0A> <2DED> <7CE8> <2DEE> <7E2D> <2DEF> <7E3C> <2DF0> <7E42> <2DF1> <7E33> <2DF2> <9848> <2DF3> <7E38> <2DF4> <7E2A> <2DF5> <7E49> <2DF6> <7E40> <2DF7> <7E47> <2DF8> <7E29> <2DF9> <7E4C> <2DFA> <7E30> <2DFB> <7E3B> <2DFC> <7E36> <2DFD> <7E44> <2DFE> <7E3A> <2DFF> <7F45> <2E00> <7F7F> <2E01> <7F7E> <2E02> <7F7D> <2E03> <7FF4> <2E04> <7FF2> <2E05> <802C> <2E06> <81BB> <2E07> <81C4> <2E08> <81CC> <2E09> <81CA> <2E0A> <81C5> <2E0B> <81C7> <2E0C> <81BC> <2E0D> <81E9> <2E0E> <825B> <2E0F> <825A> <2E10> <825C> <2E11> <8583> <2E12> <8580> <2E13> <858F> <2E14> <85A7> <2E15> <8595> <2E16> <85A0> endbfchar 100 beginbfchar <2E17> <858B> <2E18> <85A3> <2E19> <857B> <2E1A> <85A4> <2E1B> <859A> <2E1C> <859E> <2E1D> <8577> <2E1E> <857C> <2E1F> <8589> <2E20> <85A1> <2E21> <857A> <2E22> <8578> <2E23> <8557> <2E24> <858E> <2E25> <8596> <2E26> <8586> <2E27> <858D> <2E28> <8599> <2E29> <859D> <2E2A> <8581> <2E2B> <85A2> <2E2C> <8582> <2E2D> <8588> <2E2E> <8585> <2E2F> <8579> <2E30> <8576> <2E31> <8598> <2E32> <8590> <2E33> <859F> <2E34> <8668> <2E35> <87BE> <2E36> <87AA> <2E37> <87AD> <2E38> <87C5> <2E39> <87B0> <2E3A> <87AC> <2E3B> <87B9> <2E3C> <87B5> <2E3D> <87BC> <2E3E> <87AE> <2E3F> <87C9> <2E40> <87C3> <2E41> <87C2> <2E42> <87CC> <2E43> <87B7> <2E44> <87AF> <2E45> <87C4> <2E46> <87CA> <2E47> <87B4> <2E48> <87B6> <2E49> <87BF> <2E4A> <87B8> <2E4B> <87BD> <2E4C> <87DE> <2E4D> <87B2> <2E4E> <8935> <2E4F> <8933> <2E50> <893C> <2E51> <893E> <2E52> <8941> <2E53> <8952> <2E54> <8937> <2E55> <8942> <2E56> <89AD> <2E57> <89AF> <2E58> <89AE> <2E5B> <8B1E> <2E5C> <8B18> <2E5D> <8B16> <2E5E> <8B11> <2E5F> <8B05> <2E60> <8B0B> <2E61> <8B22> <2E62> <8B0F> <2E63> <8B12> <2E64> <8B15> <2E65> <8B07> <2E66> <8B0D> <2E67> <8B08> <2E68> <8B06> <2E69> <8B1C> <2E6A> <8B13> <2E6B> <8B1A> <2E6C> <8C4F> <2E6D> <8C70> <2E6E> <8C72> <2E6F> <8C71> <2E70> <8C6F> <2E71> <8C95> <2E72> <8C94> <2E73> <8CF9> <2E74> <8D6F> <2E75> <8E4E> <2E76> <8E4D> <2E77> <8E53> <2E78> <8E50> <2E79> <8E4C> <2E7A> <8E47> <2E7B> <8F43> <2E7C> <8F40> endbfchar 100 beginbfchar <2E7D> <9085> <2E7E> <907E> <2E7F> <9138> <2E80> <919A> <2E81> <91A2> <2E82> <919B> <2E83> <9199> <2E84> <919F> <2E85> <91A1> <2E86> <919D> <2E87> <91A0> <2E88> <93A1> <2E89> <9383> <2E8A> <93AF> <2E8B> <9364> <2E8C> <9356> <2E8D> <9347> <2E8E> <937C> <2E8F> <9358> <2E90> <935C> <2E91> <9376> <2E92> <9349> <2E95> <9360> <2E96> <936D> <2E97> <938F> <2E98> <934C> <2E99> <936A> <2E9A> <9379> <2E9B> <9357> <2E9C> <9355> <2E9D> <9352> <2E9E> <934F> <2E9F> <9371> <2EA0> <9377> <2EA1> <937B> <2EA2> <9361> <2EA3> <935E> <2EA4> <9363> <2EA5> <9367> <2EA6> <934E> <2EA7> <9359> <2EA8> <95C7> <2EA9> <95C0> <2EAA> <95C9> <2EAB> <95C3> <2EAC> <95C5> <2EAD> <95B7> <2EAE> <96AE> <2EAF> <96B0> <2EB0> <96AC> <2EB1> <9720> <2EB2> <971F> <2EB3> <9718> <2EB4> <971D> <2EB5> <9719> <2EB6> <979A> <2EB7> <97A1> <2EB8> <979C> <2EB9> <979E> <2EBA> <979D> <2EBB> <97D5> <2EBC> <97D4> <2EBD> <97F1> <2EBE> <9841> <2EBF> <9844> <2EC0> <984A> <2EC1> <9849> <2EC2> <9845> <2EC3> <9843> <2EC4> <9925> <2EC7> <992A> <2EC8> <9933> <2EC9> <9932> <2ECA> <992F> <2ECB> <992D> <2ECC> <9931> <2ECD> <9930> <2ECE> <9998> <2ECF> <99A3> <2ED0> <99A1> <2ED1> <9A02> <2ED2> <99FA> <2ED3> <99F4> <2ED4> <99F7> <2ED5> <99F9> <2ED6> <99F8> <2ED7> <99F6> <2ED8> <99FB> <2EDB> <99FC> <2EDC> <9A03> <2EDD> <9ABE> <2EDE> <9AFE> <2EDF> <9AFD> <2EE0> <9B01> <2EE1> <9AFC> <2EE2> <9B48> <2EE3> <9B9A> <2EE4> <9BA8> <2EE5> <9B9E> <2EE6> <9B9B> endbfchar 100 beginbfchar <2EE7> <9BA6> <2EE8> <9BA1> <2EE9> <9BA5> <2EEA> <9BA4> <2EEB> <9B86> <2EEC> <9BA2> <2EED> <9BA0> <2EEE> <9BAF> <2EEF> <9D33> <2EF0> <9D41> <2EF1> <9D67> <2EF2> <9D36> <2EF5> <9D31> <2EF6> <9D38> <2EF7> <9D30> <2EF8> <9D45> <2EFB> <9D3E> <2EFC> <9D37> <2EFD> <9D40> <2EFE> <9D3D> <2EFF> <7FF5> <2F00> <9D2D> <2F01> <9E8A> <2F02> <9E89> <2F03> <9E8D> <2F04> <9EB0> <2F05> <9EC8> <2F06> <9EDA> <2F07> <9EFB> <2F08> <9EFF> <2F09> <9F24> <2F0A> <9F23> <2F0B> <9F22> <2F0C> <9F54> <2F0D> <9FA0> <2F0E> <5131> <2F11> <5698> <2F12> <569C> <2F13> <5697> <2F14> <569A> <2F15> <569D> <2F16> <5699> <2F17> <5970> <2F18> <5B3C> <2F1B> <5DC0> <2F1E> <61D8> <2F1F> <61DF> <2F22> <61F1> <2F23> <61EA> <2F24> <61F0> <2F25> <61EB> <2F26> <61D6> <2F27> <61E9> <2F28> <64FF> <2F29> <6504> <2F2A> <64FD> <2F2B> <64F8> <2F2C> <6501> <2F2D> <6503> <2F2E> <64FC> <2F2F> <6594> <2F30> <65DB> <2F33> <66D8> <2F34> <6AC5> <2F35> <6AB9> <2F36> <6ABD> <2F37> <6AE1> <2F38> <6AC6> <2F39> <6ABA> <2F3C> <6AC7> <2F3D> <6AB4> <2F3E> <6AAD> <2F3F> <6B5E> <2F40> <6BC9> <2F41> <6C0B> <2F42> <7007> <2F45> <7001> <2F46> <7005> <2F47> <7014> <2F48> <700E> <2F4B> <6FFB> <2F4C> <7026> <2F4D> <6FFC> <2F4E> <6FF7> <2F4F> <700A> <2F50> <7201> <2F51> <71FF> <2F52> <71F9> <2F53> <7203> <2F54> <71FD> <2F55> <7376> <2F56> <74B8> <2F57> <74C0> <2F58> <74B5> <2F59> <74C1> <2F5A> <74BE> <2F5B> <74B6> <2F5C> <74BB> <2F5D> <74C2> <2F5E> <7514> endbfchar 100 beginbfchar <2F5F> <7513> <2F60> <765C> <2F61> <7664> <2F62> <7659> <2F63> <7650> <2F64> <7653> <2F65> <7657> <2F66> <765A> <2F67> <76A6> <2F68> <76BD> <2F69> <76EC> <2F6A> <77C2> <2F6B> <77BA> <2F6C> <790C> <2F6F> <7909> <2F70> <7910> <2F71> <7912> <2F72> <7911> <2F73> <79AD> <2F74> <79AC> <2F75> <7A5F> <2F76> <7C1C> <2F77> <7C29> <2F78> <7C19> <2F79> <7C20> <2F7A> <7C1F> <2F7B> <7C2D> <2F7C> <7C1D> <2F7D> <7C26> <2F7E> <7C28> <2F7F> <7C22> <2F80> <7C25> <2F81> <7C30> <2F82> <7E5C> <2F83> <7E50> <2F84> <7E56> <2F85> <7E63> <2F86> <7E58> <2F87> <7E62> <2F88> <7E5F> <2F89> <7E51> <2F8A> <7E60> <2F8B> <7E57> <2F8C> <7E53> <2F8D> <7FB5> <2F8E> <7FB3> <2F91> <8075> <2F94> <81D0> <2F95> <825F> <2F96> <825E> <2F97> <85B4> <2F98> <85C6> <2F99> <85C0> <2F9A> <85C3> <2F9B> <85C2> <2F9C> <85B3> <2F9D> <85B5> <2F9E> <85BD> <2F9F> <85C7> <2FA0> <85C4> <2FA1> <85BF> <2FA2> <85CB> <2FA3> <85CE> <2FA4> <85C8> <2FA5> <85C5> <2FA6> <85B1> <2FA7> <85B6> <2FA8> <85D2> <2FA9> <8624> <2FAA> <85B8> <2FAB> <85B7> <2FAC> <85BE> <2FAD> <8669> <2FAE> <87E7> <2FAF> <87E6> <2FB0> <87E2> <2FB1> <87DB> <2FB2> <87EB> <2FB3> <87EA> <2FB4> <87E5> <2FB5> <87DF> <2FB6> <87F3> <2FB7> <87E4> <2FB8> <87D4> <2FB9> <87DC> <2FBA> <87D3> <2FBB> <87ED> <2FBC> <87D8> <2FBD> <87E3> <2FBE> <87D7> <2FBF> <87D9> <2FC0> <8801> <2FC1> <87F4> <2FC2> <87E8> <2FC3> <87DD> <2FC4> <8953> <2FC5> <894B> <2FC6> <894F> <2FC7> <894C> <2FC8> <8946> endbfchar 100 beginbfchar <2FCB> <8949> <2FCC> <8B2A> <2FCD> <8B27> <2FCE> <8B23> <2FCF> <8B33> <2FD0> <8B30> <2FD1> <8B35> <2FD2> <8B47> <2FD3> <8B2F> <2FD4> <8B3C> <2FD5> <8B3E> <2FD6> <8B31> <2FD7> <8B25> <2FD8> <8B37> <2FD9> <8B26> <2FDA> <8B36> <2FDB> <8B2E> <2FDC> <8B24> <2FDD> <8B3B> <2FDE> <8B3D> <2FDF> <8B3A> <2FE0> <8C42> <2FE1> <8C75> <2FE2> <8C99> <2FE3> <8C98> <2FE4> <8C97> <2FE5> <8CFE> <2FE6> <8D04> <2FE7> <8D02> <2FE8> <8D00> <2FE9> <8E5C> <2FEA> <8E62> <2FEB> <8E60> <2FEC> <8E57> <2FED> <8E56> <2FEE> <8E5E> <2FEF> <8E65> <2FF0> <8E67> <2FF1> <8E5B> <2FF2> <8E5A> <2FF3> <8E61> <2FF4> <8E5D> <2FF5> <8E69> <2FF6> <8E54> <2FFA> <8F4B> <2FFB> <9128> <2FFE> <913E> <2FFF> <91A8> <3000> <91A5> <3001> <91A7> <3002> <91AF> <3003> <91AA> <3004> <93B5> <3005> <938C> <3006> <9392> <3007> <93B7> <3008> <939B> <3009> <939D> <300A> <9389> <300B> <93A7> <300C> <938E> <300D> <93AA> <300E> <939E> <300F> <93A6> <3010> <9395> <3011> <9388> <3012> <9399> <3013> <939F> <3014> <9380> <3015> <938D> <3016> <93B1> <3017> <9391> <3018> <93B2> <3019> <93A4> <301A> <93A8> <301B> <93B4> <301C> <93A3> <301F> <95D1> <3020> <96B3> <3021> <96D7> <3022> <96DA> <3023> <5DC2> <3024> <96DF> <3025> <96D8> <3026> <96DD> <3027> <9723> <3028> <9722> <3029> <9725> <302A> <97AC> <302B> <97AE> <302C> <97A8> <302D> <97AB> <302E> <97A4> <302F> <97AA> <3030> <97A2> <3031> <97A5> <3032> <97D7> <3033> <97D9> <3034> <97D6> <3035> <97D8> endbfchar 100 beginbfchar <3036> <97FA> <303A> <98B8> <303B> <9941> <303C> <993C> <303D> <993A> <303E> <9A0F> <303F> <9A0B> <3040> <9A09> <3041> <9A0D> <3042> <9A04> <3043> <9A11> <3044> <9A0A> <3045> <9A05> <3046> <9A07> <3047> <9A06> <3048> <9AC0> <3049> <9ADC> <304A> <9B08> <304D> <9B29> <304E> <9B35> <304F> <9B4A> <3050> <9B4C> <3051> <9B4B> <3052> <9BC7> <3053> <9BC6> <3054> <9BC3> <3055> <9BBF> <3056> <9BC1> <3057> <9BB5> <3058> <9BB8> <3059> <9BD3> <305A> <9BB6> <305B> <9BC4> <305C> <9BB9> <305D> <9BBD> <305E> <9D5C> <305F> <9D53> <3060> <9D4F> <3061> <9D4A> <3062> <9D5B> <3063> <9D4B> <3064> <9D59> <3065> <9D56> <3066> <9D4C> <3067> <9D57> <3068> <9D52> <3069> <9D54> <306A> <9D5F> <306B> <9D58> <306C> <9D5A> <306D> <9E8E> <306E> <9E8C> <306F> <9EDF> <3070> <9F01> <3071> <9F00> <3072> <9F16> <3073> <9F25> <3074> <9F2B> <3075> <9F2A> <3076> <9F29> <3077> <9F28> <3078> <9F4C> <3079> <9F55> <307C> <5296> <307D> <52F7> <307E> <53B4> <307F> <56AB> <3080> <56AD> <3083> <56AA> <3084> <56AC> <3085> <58DA> <3086> <58DD> <3087> <58DB> <3088> <5912> <308C> <5DC3> <308D> <5E70> <308E> <5FBF> <308F> <61FB> <3090> <6507> <3091> <6510> <3092> <650D> <3093> <6509> <3094> <650C> <3095> <650E> <3096> <6584> <3097> <65DE> <3098> <65DD> <3099> <66DE> <309A> <6AE7> <309B> <6AE0> <309C> <6ACC> <309D> <6AD1> <309E> <6AD9> <309F> <6ACB> <30A0> <6ADF> <30A1> <6ADC> <30A2> <6AD0> <30A3> <6AEB> <30A4> <6ACF> <30A5> <6ACD> endbfchar 100 beginbfchar <30A6> <6ADE> <30A7> <6B60> <30A8> <6BB0> <30A9> <6C0C> <30AA> <7019> <30AB> <7027> <30AC> <7020> <30AD> <7016> <30AE> <702B> <30B2> <7029> <30B3> <7017> <30B4> <7024> <30B5> <701C> <30B6> <720C> <30B7> <720A> <30B8> <7207> <30B9> <7202> <30BA> <7205> <30BD> <72A4> <30BE> <72A3> <30BF> <72A1> <30C0> <74CB> <30C1> <74C5> <30C2> <74B7> <30C3> <74C3> <30C4> <7516> <30C5> <7660> <30C8> <77C4> <30C9> <77F1> <30CA> <791D> <30CB> <791B> <30CC> <7921> <30CD> <791C> <30CE> <7917> <30CF> <791E> <30D0> <79B0> <30D3> <7C33> <30D4> <7C3C> <30D5> <7C39> <30D6> <7C2C> <30D7> <7C3B> <30D8> <7CEC> <30D9> <7CEA> <30DA> <7E76> <30DB> <7E75> <30DC> <7E78> <30DD> <7E70> <30DE> <7E77> <30DF> <7E6F> <30E0> <7E7A> <30E1> <7E72> <30E2> <7E74> <30E3> <7E68> <30E4> <7F4B> <30E5> <7F4A> <30E6> <7F83> <30E7> <7F86> <30E8> <7FB7> <30EB> <8078> <30EC> <81D7> <30ED> <81D5> <30EE> <820B> <30EF> <8264> <30F0> <8261> <30F1> <8263> <30F2> <85EB> <30F3> <85F1> <30F4> <85ED> <30F5> <85D9> <30F6> <85E1> <30F7> <85E8> <30F8> <85DA> <30F9> <85D7> <30FA> <85EC> <30FB> <85F2> <30FC> <85F8> <30FD> <85D8> <30FE> <85DF> <30FF> <85E3> <3100> <85DC> <3101> <85D1> <3102> <85F0> <3103> <85E6> <3104> <85EF> <3105> <85DE> <3106> <85E2> <3107> <8800> <3108> <87FA> <3109> <8803> <310C> <8809> <310D> <880C> <310E> <880B> <310F> <8806> <3110> <87FC> <3111> <8808> <3112> <87FF> <3113> <880A> <3114> <8802> <3115> <8962> <3118> <8957> endbfchar 100 beginbfchar <3119> <8961> <311A> <895C> <311B> <8958> <311C> <895D> <311D> <8959> <311E> <8988> <311F> <89B7> <3120> <89B6> <3121> <89F6> <3122> <8B50> <3123> <8B48> <3124> <8B4A> <3125> <8B40> <3126> <8B53> <3127> <8B56> <3128> <8B54> <3129> <8B4B> <312A> <8B55> <312B> <8B51> <312C> <8B42> <312D> <8B52> <312E> <8B57> <312F> <8C43> <3130> <8C77> <3131> <8C76> <3132> <8C9A> <3135> <8D09> <3136> <8DAC> <3137> <8DAA> <3138> <8DAD> <3139> <8DAB> <313A> <8E6D> <313B> <8E78> <313C> <8E73> <313D> <8E6A> <313E> <8E6F> <313F> <8E7B> <3140> <8EC2> <3141> <8F52> <3142> <8F51> <3145> <8F53> <3146> <8FB4> <3147> <9140> <3148> <913F> <3149> <91B0> <314A> <91AD> <314B> <93DE> <314C> <93C7> <314D> <93CF> <314E> <93C2> <314F> <93DA> <3150> <93D0> <3151> <93F9> <3152> <93EC> <3153> <93CC> <3154> <93D9> <3155> <93A9> <3156> <93E6> <3157> <93CA> <3158> <93D4> <3159> <93EE> <315A> <93E3> <315B> <93D5> <315C> <93C4> <315D> <93CE> <315E> <93C0> <315F> <93D2> <3160> <93A5> <3161> <93E7> <3162> <957D> <3165> <96E1> <3166> <9729> <3169> <9728> <316A> <9726> <316B> <97B3> <316C> <97B7> <316D> <97B6> <3171> <985C> <3172> <9859> <3173> <985D> <3174> <9857> <3175> <98BF> <3176> <98BD> <3177> <98BB> <3178> <98BE> <3179> <9948> <317A> <9947> <317B> <9943> <317E> <9A1A> <317F> <9A15> <3180> <9A25> <3181> <9A1D> <3182> <9A24> <3183> <9A1B> <3184> <9A22> <3185> <9A20> <3186> <9A27> <3187> <9A23> <3188> <9A1E> <3189> <9A1C> endbfchar 100 beginbfchar <318A> <9A14> <318B> <9AC2> <318C> <9B0B> <318D> <9B0A> <318E> <9B0E> <318F> <9B0C> <3190> <9B37> <3193> <9BE0> <3194> <9BDE> <3195> <9BE4> <3196> <9BE6> <3197> <9BE2> <3198> <9BF0> <3199> <9BD4> <319A> <9BD7> <319B> <9BEC> <319C> <9BDC> <319D> <9BD9> <319E> <9BE5> <319F> <9BD5> <31A0> <9BE1> <31A1> <9BDA> <31A2> <9D77> <31A3> <9D81> <31A4> <9D8A> <31A5> <9D84> <31A6> <9D88> <31A7> <9D71> <31A8> <9D80> <31A9> <9D78> <31AA> <9D86> <31AD> <9D7D> <31AE> <9D6B> <31B1> <9D70> <31B2> <9D69> <31B3> <9D85> <31B4> <9D73> <31B5> <9D7B> <31B6> <9D82> <31B7> <9D6F> <31B8> <9D79> <31B9> <9D7F> <31BA> <9D87> <31BB> <9D68> <31BC> <9E94> <31BD> <9E91> <31BE> <9EC0> <31BF> <9EFC> <31C0> <9F2D> <31C3> <9F4D> <31C7> <5337> <31C8> <56B2> <31C9> <56B5> <31CA> <56B3> <31CB> <58E3> <31CC> <5B45> <31D3> <61F9> <31D4> <6517> <31D5> <6516> <31D6> <6515> <31D7> <6513> <31D8> <65DF> <31D9> <66E8> <31DC> <6AF3> <31DD> <6AF0> <31DE> <6AEA> <31DF> <6AE8> <31E0> <6AF9> <31E1> <6AF1> <31E4> <703C> <31E5> <7035> <31E6> <702F> <31E7> <7037> <31E8> <7034> <31E9> <7031> <31EA> <7042> <31EB> <7038> <31EC> <703F> <31ED> <703A> <31EE> <7039> <31EF> <702A> <31F0> <7040> <31F1> <703B> <31F2> <7033> <31F3> <7041> <31F6> <72A8> <31F7> <737D> <31F8> <737C> <31F9> <74BA> <31FA> <76AB> <31FB> <76AA> <31FC> <76BE> <31FD> <76ED> <31FE> <77CC> <31FF> <77CE> <3200> <77CF> <3201> <77CD> <3202> <77F2> <3203> <7925> <3204> <7923> endbfchar 100 beginbfchar <3207> <7924> <3208> <7929> <3209> <79B2> <320A> <7A6E> <320D> <7AF7> <320E> <7C49> <320F> <7C48> <3210> <7C4A> <3211> <7C47> <3212> <7C45> <3213> <7CEE> <3214> <7E7B> <3215> <7E7E> <3216> <7E81> <3217> <7E80> <3218> <7FBA> <3219> <7FFF> <321A> <8079> <321B> <81DB> <321C> <81D9> <321F> <8622> <3220> <85FF> <3221> <8601> <3222> <85FE> <3223> <861B> <3224> <8600> <3225> <85F6> <3226> <8604> <3227> <8609> <3228> <8605> <3229> <860C> <322A> <85FD> <322B> <8819> <322E> <8817> <322F> <8813> <3230> <8816> <3231> <8963> <3232> <8966> <3233> <89B9> <3234> <89F7> <3235> <8B60> <3236> <8B6A> <3237> <8B5D> <3238> <8B68> <3239> <8B63> <323A> <8B65> <323B> <8B67> <323C> <8B6D> <323D> <8DAE> <323E> <8E86> <323F> <8E88> <3240> <8E84> <3241> <8F59> <3244> <8F55> <3245> <8F58> <3246> <8F5A> <3247> <908D> <3248> <9143> <3249> <9141> <324A> <91B7> <324B> <91B5> <324E> <940B> <324F> <9413> <3250> <93FB> <3251> <9420> <3252> <940F> <3253> <9414> <3254> <93FE> <3255> <9415> <3256> <9410> <3257> <9428> <3258> <9419> <3259> <940D> <325A> <93F5> <325B> <9400> <325C> <93F7> <325D> <9407> <325E> <940E> <325F> <9416> <3260> <9412> <3261> <93FA> <3262> <9409> <3263> <93F8> <3264> <943C> <3265> <940A> <3266> <93FF> <3267> <93FC> <3268> <940C> <3269> <93F6> <326A> <9411> <326B> <9406> <326C> <95DE> <326D> <95E0> <326E> <95DF> <3271> <97B9> <3272> <97BB> <3275> <9860> <3278> <985F> <327B> <9950> <327C> <994E> endbfchar 100 beginbfchar <327D> <9959> <327E> <994C> <327F> <994B> <3280> <9953> <3281> <9A32> <3282> <9A34> <3283> <9A31> <3284> <9A2C> <3285> <9A2A> <3286> <9A36> <3287> <9A29> <3288> <9A2E> <3289> <9A38> <328A> <9A2D> <328B> <9AC7> <328C> <9ACA> <328D> <9AC6> <328E> <9B10> <328F> <9B12> <3290> <9B11> <3291> <9C0B> <3292> <9C08> <3293> <9BF7> <3294> <9C05> <3295> <9C12> <3296> <9BF8> <3297> <9C40> <3298> <9C07> <3299> <9C0E> <329A> <9C06> <329B> <9C17> <329C> <9C14> <329D> <9C09> <329E> <9D9F> <329F> <9D99> <32A0> <9DA4> <32A1> <9D9D> <32A2> <9D92> <32A3> <9D98> <32A4> <9D90> <32A5> <9D9B> <32A6> <9DA0> <32A7> <9D94> <32A8> <9D9C> <32A9> <9DAA> <32AA> <9D97> <32AB> <9DA1> <32AC> <9D9A> <32AD> <9DA2> <32AE> <9DA8> <32AF> <9D9E> <32B0> <9DA3> <32B1> <9DBF> <32B2> <9DA9> <32B3> <9D96> <32B6> <9E99> <32B7> <9E9B> <32B8> <9E9A> <32B9> <9EE5> <32BA> <9EE4> <32BB> <9EE7> <32BC> <9EE6> <32BD> <9F30> <32BE> <9F2E> <32BF> <9F5B> <32C0> <9F60> <32C1> <9F5E> <32C2> <9F5D> <32C3> <9F59> <32C4> <9F91> <32C5> <513A> <32C6> <5139> <32C7> <5298> <32C8> <5297> <32C9> <56C3> <32CC> <5B48> <32CD> <5B47> <32CE> <5DCB> <32CF> <5DCF> <32D0> <5EF1> <32D1> <61FD> <32D2> <651B> <32D3> <6B02> <32D4> <6AFC> <32D5> <6B03> <32D6> <6AF8> <32D7> <6B00> <32DA> <704A> <32DF> <721D> <32E0> <721A> <32E1> <7219> <32E2> <737E> <32E3> <7517> <32E4> <766A> <32E5> <77D0> <32E6> <792D> <32E7> <7931> <32E8> <792F> <32E9> <7C54> <32EA> <7C53> endbfchar 100 beginbfchar <32EB> <7CF2> <32EC> <7E8A> <32EF> <7E8B> <32F0> <7E86> <32F1> <7E8D> <32F2> <7F4D> <32F3> <7FBB> <32F4> <8030> <32F5> <81DD> <32F6> <8618> <32F7> <862A> <32F8> <8626> <32F9> <861F> <32FA> <8623> <32FB> <861C> <32FC> <8619> <32FD> <8627> <32FE> <862E> <32FF> <8621> <3300> <8620> <3301> <8629> <3302> <861E> <3303> <8625> <3304> <8829> <3305> <881D> <3306> <881B> <3307> <8820> <3308> <8824> <3309> <881C> <330A> <882B> <330B> <884A> <330C> <896D> <330D> <8969> <330E> <896E> <330F> <896B> <3310> <89FA> <3311> <8B79> <3312> <8B78> <3313> <8B45> <3316> <8D10> <3317> <8D14> <3318> <8DAF> <3319> <8E8E> <331A> <8E8C> <331B> <8F5E> <331C> <8F5B> <331D> <8F5D> <331E> <9146> <3321> <91B9> <3322> <943F> <3323> <943B> <3324> <9436> <3325> <9429> <3326> <943D> <3327> <9430> <3328> <9439> <3329> <942A> <332A> <9437> <332B> <942C> <332C> <9440> <332D> <9431> <332E> <95E5> <332F> <95E4> <3330> <95E3> <3331> <9735> <3332> <973A> <3333> <97BF> <3334> <97E1> <3335> <9864> <3336> <98C9> <3337> <98C6> <3338> <98C0> <3339> <9958> <333A> <9956> <333B> <9A39> <333C> <9A3D> <333D> <9A46> <333E> <9A44> <333F> <9A42> <3340> <9A41> <3341> <9A3A> <3342> <9A3F> <3343> <9ACD> <3344> <9B15> <3347> <9B16> <3348> <9B3A> <3349> <9B52> <334A> <9C2B> <334B> <9C1D> <334C> <9C1C> <334D> <9C2C> <334E> <9C23> <3351> <9C24> <3352> <9C21> <3353> <9DB7> <3354> <9DB6> <3355> <9DBC> <3356> <9DC1> <3357> <9DC7> <3358> <9DCA> endbfchar 100 beginbfchar <3359> <9DCF> <335A> <9DBE> <335B> <9DC5> <335C> <9DC3> <335D> <9DBB> <335E> <9DB5> <335F> <9DCE> <3362> <9DAC> <3363> <9DC8> <3364> <9DB1> <3365> <9DAD> <3366> <9DCC> <3367> <9DB3> <3368> <9DCD> <3369> <9DB2> <336A> <9E7A> <336B> <9E9C> <336C> <9EEB> <336D> <9EEE> <336E> <9EED> <336F> <9F1B> <3370> <9F18> <3371> <9F1A> <3372> <9F31> <3373> <9F4E> <3374> <9F65> <3375> <9F64> <3376> <9F92> <3377> <4EB9> <3378> <56C6> <3379> <56C5> <337A> <56CB> <337B> <5971> <337E> <5DD5> <337F> <5DD1> <3380> <5EF2> <3381> <6521> <3382> <6520> <3383> <6526> <3384> <6522> <3385> <6B0B> <3388> <6C0D> <338C> <7052> <338F> <72A9> <3390> <737F> <3391> <74D8> <3392> <74D5> <3393> <74D9> <3394> <74D7> <3395> <766D> <3396> <76AD> <3397> <7935> <3398> <79B4> <339B> <7C57> <339C> <7C5C> <339D> <7C59> <339E> <7C5B> <339F> <7C5A> <33A0> <7CF4> <33A1> <7CF1> <33A2> <7E91> <33A3> <7F4F> <33A4> <7F87> <33A5> <81DE> <33A6> <826B> <33A9> <8633> <33AA> <862C> <33AB> <8632> <33AC> <8636> <33AD> <882C> <33AE> <8828> <33AF> <8826> <33B0> <882A> <33B1> <8825> <33B2> <8971> <33B3> <89BF> <33B4> <89BE> <33B5> <89FB> <33B6> <8B7E> <33B7> <8B84> <33B8> <8B82> <33B9> <8B86> <33BA> <8B85> <33BB> <8B7F> <33BC> <8D15> <33BD> <8E95> <33BE> <8E94> <33BF> <8E9A> <33C0> <8E92> <33C1> <8E90> <33C4> <8F60> <33C5> <8F62> <33C6> <9147> <33C7> <944C> <33C8> <9450> <33CB> <944F> <33CC> <9447> <33CD> <9445> <33D0> <9446> <33D1> <973F> endbfchar 100 beginbfchar <33D2> <97E3> <33D3> <986A> <33D4> <9869> <33D5> <98CB> <33D6> <9954> <33D7> <995B> <33D8> <9A4E> <33DB> <9A4C> <33DC> <9A4F> <33DD> <9A48> <33DE> <9A4A> <33DF> <9A49> <33E0> <9A52> <33E1> <9A50> <33E2> <9AD0> <33E3> <9B19> <33E4> <9B2B> <33E5> <9B3B> <33E6> <9B56> <33E7> <9B55> <33E8> <9C46> <33E9> <9C48> <33EA> <9C3F> <33EB> <9C44> <33EC> <9C39> <33ED> <9C33> <33EE> <9C41> <33EF> <9C3C> <33F0> <9C37> <33F1> <9C34> <33F2> <9C32> <33F3> <9C3D> <33F4> <9C36> <33F5> <9DDB> <33F6> <9DD2> <33F7> <9DDE> <33F8> <9DDA> <33F9> <9DCB> <33FA> <9DD0> <33FB> <9DDC> <33FC> <9DD1> <33FD> <9DDF> <33FE> <9DE9> <33FF> <9DD9> <3400> <9DD8> <3401> <9DD6> <3402> <9DF5> <3403> <9DD5> <3404> <9DDD> <3405> <9EB6> <3406> <9EF0> <3407> <9F35> <3408> <9F33> <3409> <9F32> <340A> <9F42> <340B> <9F6B> <340C> <9F95> <340D> <9FA2> <340E> <513D> <340F> <5299> <3410> <58E8> <3411> <58E7> <3412> <5972> <3413> <5B4D> <3414> <5DD8> <3415> <882F> <3416> <5F4F> <3417> <6201> <341A> <6529> <341B> <6525> <341C> <6596> <341D> <66EB> <3420> <6B0F> <3421> <6BCA> <3422> <705B> <3423> <705A> <3424> <7222> <3425> <7382> <3426> <7381> <3427> <7383> <3428> <7670> <3429> <77D4> <342A> <7C67> <342B> <7C66> <342C> <7E95> <342D> <826C> <342E> <863A> <342F> <8640> <3430> <8639> <3431> <863C> <3432> <8631> <3433> <863B> <3434> <863E> <3435> <8830> <3436> <8832> <3437> <882E> <3438> <8833> <3439> <8976> <343A> <8974> <343B> <8973> endbfchar 100 beginbfchar <343C> <89FE> <343D> <8B8C> <343E> <8B8E> <343F> <8B8B> <3440> <8B88> <3441> <8C45> <3442> <8D19> <3443> <8E98> <3444> <8F64> <3445> <8F63> <3446> <91BC> <3447> <9462> <3448> <9455> <3449> <945D> <344A> <9457> <344B> <945E> <344E> <9800> <344F> <9A56> <3450> <9A59> <3454> <9C52> <3455> <9C58> <3456> <9C50> <3457> <9C4A> <3458> <9C4D> <3459> <9C4B> <345A> <9C55> <345B> <9C59> <345C> <9C4C> <345D> <9C4E> <345E> <9DFB> <345F> <9DF7> <3460> <9DEF> <3461> <9DE3> <3462> <9DEB> <3463> <9DF8> <3464> <9DE4> <3465> <9DF6> <3466> <9DE1> <3467> <9DEE> <3468> <9DE6> <3469> <9DF2> <346A> <9DF0> <346B> <9DE2> <346C> <9DEC> <346D> <9DF4> <346E> <9DF3> <346F> <9DE8> <3470> <9DED> <3471> <9EC2> <3472> <9ED0> <3475> <9F06> <3476> <9F1C> <3477> <9F38> <3478> <9F37> <3479> <9F36> <347A> <9F43> <347B> <9F4F> <347C> <9F71> <347D> <9F70> <3480> <56D3> <3481> <56CD> <3482> <5B4E> <3483> <5C6D> <3484> <652D> <3487> <6B13> <3488> <705F> <3489> <7061> <348A> <705D> <348B> <7060> <348C> <7223> <348D> <74DB> <348E> <74E5> <348F> <77D5> <3490> <7938> <3491> <79B7> <3492> <79B6> <3493> <7C6A> <3494> <7E97> <3495> <7F89> <3496> <826D> <3497> <8643> <3498> <8838> <3499> <8837> <349A> <8835> <349B> <884B> <34A1> <8E9D> <34A2> <91BE> <34A3> <91BD> <34A4> <91C2> <34A5> <946B> <34A8> <96E5> <34A9> <9746> <34AA> <9743> <34AB> <9747> <34AC> <97C7> <34AD> <97E5> <34AE> <9A5E> <34AF> <9AD5> <34B0> <9B59> <34B1> <9C63> endbfchar 100 beginbfchar <34B2> <9C67> <34B3> <9C66> <34B4> <9C62> <34B5> <9C5E> <34B6> <9C60> <34B7> <9E02> <34B8> <9DFE> <34B9> <9E07> <34BA> <9E03> <34BB> <9E06> <34BC> <9E05> <34BF> <9E09> <34C0> <9DFF> <34C1> <9DFD> <34C2> <9E04> <34C3> <9EA0> <34C4> <9F1E> <34C5> <9F46> <34C9> <56D4> <34CA> <652E> <34CB> <65B8> <34CE> <6B17> <34CF> <6B1A> <34D0> <7062> <34D1> <7226> <34D2> <72AA> <34D5> <7939> <34D6> <7C69> <34D7> <7C6B> <34D8> <7CF6> <34D9> <7E9A> <34DA> <7E98> <34DB> <7E9B> <34DC> <7E99> <34E4> <897C> <34E5> <897B> <34E6> <89FF> <34E9> <8EA5> <34EA> <8EA4> <34EB> <8EA3> <34EC> <946E> <34ED> <946D> <34EE> <946F> <34EF> <9471> <34F0> <9473> <34F1> <9749> <34F2> <9872> <34F3> <995F> <34F4> <9C68> <34F5> <9C6E> <34F6> <9C6D> <34F7> <9E0B> <34F8> <9E0D> <34F9> <9E10> <34FA> <9E0F> <34FB> <9E12> <34FC> <9E11> <34FD> <9EA1> <34FE> <9EF5> <34FF> <9F09> <3500> <9F47> <3501> <9F78> <3502> <9F7B> <3503> <9F7A> <3504> <9F79> <3505> <571E> <3506> <7066> <3507> <7C6F> <3508> <883C> <3509> <8DB2> <350A> <8EA6> <350B> <91C3> <350C> <9474> <350D> <9478> <350E> <9476> <350F> <9475> <3510> <9A60> <3511> <9B2E> <3512> <9C74> <3513> <9C73> <3514> <9C71> <3515> <9C75> <3516> <9E14> <3517> <9E13> <3518> <9EF6> <3519> <9F0A> <351A> <9FA4> <351B> <7068> <351C> <7065> <351D> <7CF7> <351E> <866A> <351F> <883E> <3520> <883D> <3521> <883F> <3522> <8B9E> <3523> <8C9C> <3524> <8EA9> <3525> <8EC9> <3526> <974B> <3529> <98CC> endbfchar 100 beginbfchar <352A> <9961> <352B> <99AB> <352C> <9A64> <352F> <9B24> <3530> <9E15> <3531> <9E17> <3532> <9F48> <3533> <6207> <3534> <6B1E> <3535> <7227> <3536> <864C> <3537> <8EA8> <3538> <9482> <353B> <9A69> <353C> <9A68> <353D> <9E19> <353E> <864B> <353F> <8B9F> <3540> <9483> <3541> <9C79> <3542> <9EB7> <3543> <7675> <3544> <9A6B> <3545> <9C7A> <3546> <9E1D> <3549> <7229> <354A> <9EA4> <354B> <9F7E> <354C> <9F49> <354D> <9F98> <354E> <22EF> <354F> <223C> <35AF> <FE33> <35B0> <FF3F> <35B1> <FE34> <35B2> <FE4F> <35B3> <0308> <35B4> <FF3E> <35BD> <30FC> <35BE> <FF3B> <35BF> <FF3D> <35C0> <273D> <3670> <0401> <3691> <0451> <36AC> <21E7> <36AF> <4E41> <36B0> <F7E6> <36B1> <4E5A> <36B2> <F7E8> <36B3> <5202> <36B6> <5188> <36E1> <00AC> <36E2> <FFE4> <36E3> <FF07> <36E4> <FF02> <36E5> <3231> <36E6> <2116> <36E7> <2121> <36E8> <7881> <36E9> <92B9> <36EA> <88CF> <36EB> <58BB> <36EC> <6052> <36ED> <7CA7> <36EE> <5AFA> <36EF> <2554> <36F0> <2566> <36F1> <2557> <36F2> <2560> <36F3> <256C> <36F4> <2563> <36F5> <255A> <36F6> <2569> <36F7> <255D> <36F8> <2552> <36F9> <2564> <36FA> <2555> <36FE> <2558> <36FF> <2567> <3700> <255B> <3701> <2553> <3702> <2565> <3703> <2556> <3704> <255F> <3705> <256B> <3706> <2562> <3707> <2559> <3708> <2568> <3709> <255C> <370A> <2551> <3710> <2593> <372B> <E311> <372C> <57BE> <372D> <E313> <372E> <713E> <372F> <E315> <3730> <69A2> <3731> <E318> <3732> <5B74> <3733> <7A49> endbfchar 100 beginbfchar <3736> <7A65> <3737> <7A7D> <3738> <E31F> <3739> <7ABB> <373A> <7AB0> <373D> <71D1> <373E> <E325> <373F> <41CA> <3740> <7ADA> <3741> <7ADD> <3742> <7AEA> <3743> <41EF> <3744> <54B2> <3745> <E32C> <3746> <7B0B> <3747> <7B55> <3748> <7B29> <374B> <7BA2> <374C> <7B6F> <374D> <839C> <3750> <7BD0> <3751> <8421> <3752> <7B92> <3754> <E33B> <3756> <8492> <3757> <7BFA> <3759> <7C35> <375A> <E342> <375B> <7C44> <375C> <7C83> <375D> <E345> <375E> <7CA6> <375F> <E348> <3760> <7CC9> <3761> <7CC7> <3762> <7CE6> <3764> <7CF3> <3765> <7CF5> <3766> <7E67> <3767> <451D> <3768> <E352> <3769> <7D5D> <376A> <E354> <376B> <7D89> <376C> <7DAB> <376D> <7135> <376E> <7DB3> <3772> <7DE4> <3773> <3D13> <3774> <7DF5> <3775> <E360> <3776> <7DE5> <3777> <E362> <377B> <7E6E> <377D> <432B> <377E> <946C> <377F> <7E27> <3782> <7F47> <3783> <7936> <3784> <E36F> <3785> <99E1> <3786> <7F97> <3787> <E372> <3788> <7FA3> <378B> <455C> <378C> <E377> <378D> <E379> <378E> <7FFA> <378F> <E37B> <3791> <8008> <3792> <801D> <3794> <802F> <3799> <8061> <379A> <E386> <379B> <4989> <379F> <6725> <37A0> <80A7> <37A1> <E38D> <37A2> <8107> <37A3> <811A> <37A4> <58B0> <37A5> <E391> <37A6> <6C7F> <37A7> <E393> <37A8> <64E7> <37A9> <E396> <37AA> <8218> <37AB> <E398> <37AC> <6A53> <37AF> <447A> <37B0> <8229> <37B3> <4FF9> <37B4> <E3A2> <37B5> <84E2> <37B6> <8362> <37BC> <82AA> <37BD> <691B> <37BE> <E3AC> <37BF> <41DB> <37C0> <854B> endbfchar 100 beginbfchar <37C1> <82D0> <37C2> <831A> <37C5> <36C1> <37C8> <827B> <37C9> <82E2> <37CA> <8318> <37D0> <3DBF> <37D1> <831D> <37D2> <55EC> <37D3> <8385> <37D4> <450B> <37D5> <E3C3> <37D6> <83AC> <37D8> <83D3> <37D9> <E3C8> <37DA> <6A57> <37DB> <855A> <37DC> <3496> <37DD> <E3CC> <37DE> <8458> <37DF> <E3CF> <37E0> <8471> <37E1> <3DD3> <37E2> <44E4> <37E3> <6AA7> <37E4> <844A> <37E5> <7958> <37EA> <84DE> <37EC> <8391> <37ED> <44A0> <37EE> <8493> <37EF> <84E4> <37F0> <E3E1> <37F1> <4240> <37F2> <E3E3> <37F3> <4543> <37F4> <8534> <37F5> <5AF2> <37F7> <4527> <37F8> <8573> <37F9> <4516> <37FA> <67BF> <37FB> <8616> <37FE> <85C1> <37FF> <E3F0> <3800> <8602> <3804> <456A> <3805> <8628> <3806> <3648> <3807> <E3F8> <3808> <53F7> <3809> <E3FA> <380A> <867E> <380C> <E3FD> <380D> <87EE> <380E> <E3FF> <380F> <87B1> <3810> <87DA> <3811> <880F> <3812> <5661> <3813> <866C> <3814> <6856> <3815> <460F> <381B> <885E> <381C> <889C> <381D> <465B> <3820> <88C5> <3821> <E414> <3822> <8987> <3826> <89A7> <3827> <89BC> <3828> <E41B> <3829> <89E7> <382C> <8A9C> <382D> <7793> <382E> <91FE> <382F> <8A90> <3830> <E423> <3831> <7AE9> <3832> <E425> <3833> <4713> <3834> <E428> <3835> <717C> <3836> <8B0C> <3837> <8B1F> <383A> <8B3F> <383C> <8B4D> <383D> <8AA9> <383E> <E432> <383F> <8B90> <3840> <8B9B> <3841> <8AAF> <3842> <E436> <3843> <4615> <3844> <884F> <3845> <8C9B> <3849> <3725> <384A> <E43E> <384B> <8CD6> <384E> <8D12> endbfchar 100 beginbfchar <384F> <8D03> <3850> <E444> <3851> <8CDB> <3852> <705C> <3853> <8D11> <3854> <3ED0> <3856> <8DA9> <385A> <3B7C> <385D> <7AE7> <385E> <8EAD> <385F> <8EB6> <3860> <8EC3> <3861> <92D4> <3862> <8F19> <3863> <8F2D> <3866> <8FA5> <3867> <9303> <386A> <8FB3> <386F> <5EF8> <3870> <E465> <3871> <8FF9> <3873> <E46A> <3874> <3980> <3875> <E46C> <3876> <9037> <3879> <9061> <387C> <90A8> <387D> <E474> <387E> <90C4> <387F> <E476> <3880> <90AE> <3882> <9167> <3883> <91A9> <3884> <91C4> <3885> <7CAC> <3888> <920E> <3889> <6C9F> <388A> <9241> <388B> <9262> <388C> <E484> <3892> <932C> <3893> <936B> <3896> <5AC3> <3899> <4965> <389A> <9244> <389E> <9373> <389F> <945B> <38A0> <8EBC> <38A1> <9585> <38A2> <95A6> <38A3> <9426> <38A4> <95A0> <38A5> <6FF6> <38A6> <42B9> <38AA> <49DF> <38AB> <6C1C> <38AC> <967B> <38AD> <9696> <38AE> <416C> <38AF> <96A3> <38B0> <E4AB> <38B1> <61DA> <38B2> <96B6> <38B3> <78F5> <38B4> <E4AF> <38B5> <96BD> <38B6> <53CC> <38B7> <49A1> <38C0> <9731> <38C1> <8642> <38C2> <9736> <38C3> <4A0F> <38C4> <453D> <38C5> <4585> <38C6> <E4C1> <38C7> <7075> <38C8> <5B41> <38C9> <971B> <38CB> <E4C6> <38CC> <9757> <38CD> <5B4A> <38CE> <E4C9> <38CF> <975F> <38D0> <9425> <38D1> <50D0> <38D4> <9789> <38D5> <979F> <38D6> <97B1> <38D7> <97BE> <38D8> <97C0> <38D9> <97D2> <38DA> <97E0> <38DB> <E4D6> <38DC> <97EE> <38DD> <741C> <38DE> <E4D9> <38E0> <97F5> <38E3> <4AD1> <38E4> <9834> <38E5> <9833> endbfchar 100 beginbfchar <38E6> <984B> <38E7> <9866> <38E8> <3B0E> <38E9> <E4E4> <38EA> <3D51> <38EE> <98CA> <38EF> <98B7> <38F0> <98C8> <38F1> <98C7> <38F2> <4AFF> <38F5> <55B0> <38F6> <98E1> <38F7> <98E6> <38F8> <98EC> <38F9> <9378> <38FA> <9939> <38FB> <E4F6> <38FC> <4B72> <38FF> <99F5> <3900> <9A0C> <3901> <9A3B> <3902> <9A10> <3903> <9A58> <3904> <E4FF> <3905> <36C4> <3908> <9AE0> <3909> <9AE2> <390A> <E505> <390B> <9AF4> <390C> <4C0E> <390D> <9B14> <390E> <9B2D> <390F> <E50A> <3910> <5034> <3911> <9B34> <3912> <38C3> <3913> <E50F> <3914> <9B50> <3915> <9B40> <3916> <E512> <3917> <5A45> <3918> <E514> <3919> <9B8E> <391A> <9C02> <391B> <9BFF> <391C> <9C0C> <391D> <E51A> <391E> <9DD4> <3925> <9D7E> <3926> <9D83> <3927> <E524> <3928> <9E0E> <3929> <9DC4> <392E> <9D39> <3931> <9E90> <3932> <9E95> <3933> <9E9E> <3934> <9EA2> <3935> <4D34> <3936> <9EAA> <3937> <9EAF> <3938> <E537> <3939> <9EC1> <393A> <3B60> <393B> <39E5> <393C> <3D1D> <393D> <4F32> <393E> <37BE> <393F> <E53E> <3940> <9F02> <3941> <9F08> <3942> <4B96> <3943> <9424> <3944> <E543> <3945> <9F17> <3947> <9F39> <3948> <569F> <3949> <568A> <394A> <9F45> <394B> <99B8> <394C> <E54B> <394D> <97F2> <394E> <847F> <3950> <9F69> <3951> <7ADC> <3952> <9F8E> <3953> <7216> <3954> <4BBE> <3957> <7177> <395B> <739E> <395E> <799F> <3961> <9369> <3962> <93F3> <3963> <E562> <3964> <92EC> <3965> <9381> <3966> <93CB> <3969> <7217> <396A> <3EEB> <396B> <7772> endbfchar 100 beginbfchar <396C> <7A43> <396D> <70D0> <3970> <717E> <3971> <E570> <3972> <70A3> <3975> <3EC7> <3979> <3722> <397C> <36E1> <3980> <3723> <3981> <E580> <3982> <575B> <3988> <8503> <3989> <E588> <398B> <8455> <3992> <44F4> <3996> <67F9> <3997> <3733> <3998> <3C15> <3999> <3DE7> <399A> <586C> <399B> <E59A> <399C> <6810> <399D> <4057> <39A3> <54CB> <39A4> <569E> <39A5> <E5A4> <39A6> <5692> <39AB> <E5AA> <39AC> <939C> <39AD> <4EF8> <39AE> <512B> <39AF> <3819> <39B0> <E5AF> <39B1> <4EBC> <39B2> <E5B1> <39B4> <4F4B> <39B5> <4F8A> <39B6> <E5B5> <39B7> <5A68> <39BA> <3999> <39BD> <3435> <39BE> <4F29> <39C2> <8ADA> <39C3> <E5C2> <39C4> <4E98> <39C5> <50CD> <39C6> <510D> <39C7> <4FA2> <39C8> <4F03> <39CB> <4F42> <39CC> <502E> <39CD> <506C> <39CE> <5081> <39CF> <4FCC> <39D0> <4FE5> <39D1> <5058> <39D2> <50FC> <39D3> <6E76> <39D7> <6D72> <39DA> <51A8> <39DB> <51C3> <39DC> <E5DF> <39DD> <44DD> <39E1> <8D7A> <39E4> <5259> <39E5> <52A4> <39E6> <E5E9> <39E7> <52E1> <39E9> <467A> <39EA> <718C> <39EF> <69D1> <39F0> <E5F3> <39F2> <3EDE> <39F3> <7499> <39F4> <7414> <39F5> <7456> <39F6> <7398> <39F7> <4B8E> <39FA> <53D0> <39FB> <3584> <39FC> <720F> <39FD> <E600> <39FE> <55B4> <39FF> <E602> <3A00> <54CD> <3A01> <E604> <3A02> <571D> <3A03> <925D> <3A04> <96F4> <3A05> <57DD> <3A06> <578D> <3A07> <577F> <3A08> <363E> <3A09> <58CB> <3A0A> <5A99> <3A0F> <5A2C> <3A10> <59B8> <3A11> <5A7E> <3A12> <5ACF> <3A13> <5A12> endbfchar 100 beginbfchar <3A18> <36F5> <3A19> <6D05> <3A1A> <7443> <3A1B> <5A21> <3A1C> <E621> <3A1D> <5A81> <3A20> <93E0> <3A21> <748C> <3A22> <E627> <3A23> <7105> <3A24> <4972> <3A25> <9408> <3A26> <E62B> <3A27> <93BD> <3A28> <37A0> <3A29> <5C1E> <3A2A> <5C9E> <3A2B> <5E5E> <3A2C> <5E48> <3A30> <5ECD> <3A31> <5B4F> <3A34> <3701> <3A35> <E63A> <3A36> <36DD> <3A37> <E63C> <3A38> <36D3> <3A39> <812A> <3A3E> <5F0C> <3A3F> <5F0E> <3A42> <5A6B> <3A43> <E648> <3A44> <5B44> <3A45> <E64B> <3A46> <8860> <3A47> <607E> <3A4A> <5FDB> <3A4B> <3EB8> <3A50> <61C0> <3A54> <6199> <3A55> <6198> <3A56> <6075> <3A5B> <6471> <3A5E> <3A29> <3A63> <6337> <3A64> <64B6> <3A65> <6331> <3A66> <63D1> <3A69> <62A4> <3A6A> <E671> <3A6B> <643B> <3A6C> <656B> <3A6D> <6972> <3A6E> <3BF4> <3A73> <550D> <3A77> <66CE> <3A7A> <3AE0> <3A81> <78EE> <3A85> <3464> <3A89> <668E> <3A8A> <E692> <3A8B> <666B> <3A8C> <4B93> <3A8D> <6630> <3A90> <6663> <3A93> <661E> <3A94> <E69C> <3A95> <38D1> <3A98> <3B99> <3A9B> <74D0> <3A9C> <3B96> <3A9D> <E6A6> <3A9E> <68B6> <3AA0> <3BC4> <3AA1> <6ABE> <3AA4> <6A33> <3AA5> <6A52> <3AA6> <6AC9> <3AA7> <6B05> <3AA8> <E6B2> <3AA9> <6511> <3AAA> <6898> <3AAB> <6A4C> <3AAC> <3BD7> <3AAD> <6A7A> <3AAE> <6B57> <3AB1> <93A0> <3AB2> <92F2> <3AB5> <9289> <3AB8> <9467> <3AB9> <6DA5> <3ABA> <6F0B> <3ABC> <E6C7> <3ABD> <3D8F> <3ABE> <6E04> <3ABF> <E6CA> <3AC0> <5A3D> <3AC1> <6E0A> <3AC2> <5847> <3AC3> <6D24> <3AC4> <7842> endbfchar 100 beginbfchar <3AC5> <713B> <3AC8> <70F1> <3AC9> <7250> <3ACA> <7287> <3ACB> <7294> <3ACE> <5179> <3AD1> <747A> <3AD7> <3F06> <3AD8> <3EB1> <3ADC> <60A7> <3ADD> <3EF3> <3ADE> <74CC> <3ADF> <743C> <3AE0> <9387> <3AE1> <7437> <3AE2> <449F> <3AE3> <E6EE> <3AE4> <4551> <3AE5> <7583> <3AE6> <3F63> <3AE9> <3F58> <3AEA> <7555> <3AEB> <7673> <3AEC> <E6F7> <3AEE> <7468> <3AF2> <3AFB> <3AF3> <3DCD> <3AF4> <E6FF> <3AF5> <3EFF> <3AF8> <91FA> <3AF9> <5732> <3AFA> <9342> <3AFD> <50DF> <3B00> <7778> <3B01> <E70C> <3B04> <777B> <3B07> <3A5E> <3B08> <E713> <3B09> <7438> <3B0A> <749B> <3B0B> <3EBF> <3B0E> <40C8> <3B11> <9307> <3B12> <E71D> <3B13> <781E> <3B14> <788D> <3B15> <7888> <3B16> <78D2> <3B17> <73D0> <3B18> <7959> <3B1B> <410E> <3B1E> <79A5> <3B1F> <6A2D> <3B20> <E72B> <3B21> <7A3A> <3B22> <79F4> <3B23> <416E> <3B24> <E72F> <3B25> <4132> <3B26> <9235> <3B27> <79F1> <3B2D> <3597> <3B2E> <556B> <3B2F> <3570> <3B30> <36AA> <3B33> <7AE2> <3B34> <5A59> <3B38> <5A0D> <3B39> <E744> <3B3A> <78F0> <3B3B> <5A2A> <3B3C> <E747> <3B3D> <7AFE> <3B3E> <41F9> <3B3F> <7C5D> <3B40> <7C6D> <3B41> <4211> <3B45> <7CCD> <3B48> <7C8E> <3B49> <7C7C> <3B4A> <7CAE> <3B4B> <6AB2> <3B4C> <7DDC> <3B4D> <7E07> <3B4E> <7DD3> <3B4F> <7F4E> <3B53> <7D97> <3B54> <E75F> <3B55> <426A> <3B58> <67D6> <3B5B> <57C4> <3B5E> <7FDD> <3B5F> <7B27> <3B63> <7B0C> <3B64> <E770> <3B65> <99E6> <3B66> <8645> <3B67> <9A63> <3B68> <6A1C> <3B69> <E775> endbfchar 100 beginbfchar <3B6C> <9A1F> <3B6D> <E77A> <3B71> <44EA> <3B72> <8137> <3B73> <4402> <3B74> <80C6> <3B75> <8109> <3B76> <8142> <3B77> <E784> <3B78> <98C3> <3B79> <E786> <3B7A> <8262> <3B7B> <8265> <3B7C> <E789> <3B7D> <8453> <3B7E> <E78B> <3B7F> <8610> <3B80> <E78D> <3B81> <5A86> <3B82> <417F> <3B83> <E790> <3B84> <5B2B> <3B85> <E792> <3B86> <5AE4> <3B87> <E794> <3B88> <86A0> <3B8B> <882D> <3B8C> <E799> <3B8D> <5A02> <3B8E> <886E> <3B8F> <4F45> <3B90> <8887> <3B91> <88BF> <3B92> <88E6> <3B93> <8965> <3B94> <894D> <3B95> <E7A2> <3B96> <8954> <3B9D> <3EAD> <3B9E> <84A3> <3B9F> <46F5> <3BA0> <46CF> <3BA1> <37F2> <3BA2> <8A3D> <3BA3> <8A1C> <3BA4> <E7B1> <3BA5> <5F4D> <3BA6> <922B> <3BA7> <E7B4> <3BA8> <65D4> <3BA9> <7129> <3BAA> <70C4> <3BAB> <E7B8> <3BAC> <9D6D> <3BAD> <8C9F> <3BAE> <8CE9> <3BAF> <E7BC> <3BB0> <599A> <3BB1> <77C3> <3BB2> <59F0> <3BB3> <36D4> <3BB4> <8E2A> <3BB5> <8EA7> <3BB6> <E7C4> <3BB7> <8F30> <3BB8> <8F4A> <3BB9> <42F4> <3BBA> <6C58> <3BBB> <6FBB> <3BBC> <E7CA> <3BBD> <489B> <3BBE> <6F79> <3BBF> <6E8B> <3BC0> <E7CE> <3BC1> <9BE9> <3BC2> <36B5> <3BC3> <E7D1> <3BC4> <90BB> <3BC6> <5571> <3BC7> <4906> <3BC8> <91BB> <3BC9> <9404> <3BCA> <E7D8> <3BCB> <4062> <3BCC> <E7DA> <3BCD> <9427> <3BD0> <84E5> <3BD1> <8A2B> <3BD2> <9599> <3BD3> <95A7> <3BD4> <9597> <3BD5> <9596> <3BD6> <E7E4> <3BD7> <7445> <3BD8> <3EC2> <3BDC> <3EE7> <3BDD> <E7EB> <3BDE> <968F> <3BE2> <3ECC> <3BE6> <7412> endbfchar 100 beginbfchar <3BE7> <746B> <3BE8> <3EFC> <3BE9> <9741> <3BEA> <E7F8> <3BEB> <6847> <3BEC> <4A1D> <3BF0> <9368> <3BF5> <92BA> <3BF6> <5B11> <3BF7> <8B69> <3BF8> <493C> <3BF9> <73F9> <3BFA> <E808> <3BFB> <979B> <3BFD> <9938> <3BFE> <E80C> <3BFF> <5DC1> <3C02> <981F> <3C03> <E811> <3C04> <92F6> <3C05> <E813> <3C06> <91E5> <3C07> <44C0> <3C0B> <98DC> <3C0C> <E81A> <3C0D> <3F00> <3C0E> <922A> <3C0F> <4925> <3C10> <8414> <3C11> <993B> <3C12> <994D> <3C13> <E821> <3C14> <3DFD> <3C16> <4B6F> <3C17> <99AA> <3C18> <9A5C> <3C1B> <6A8F> <3C1C> <9A21> <3C1D> <5AFE> <3C1E> <9A2F> <3C1F> <E82D> <3C20> <4B90> <3C21> <E82F> <3C22> <99BC> <3C23> <4BBD> <3C24> <4B97> <3C25> <937D> <3C26> <5872> <3C27> <E835> <3C28> <5822> <3C2B> <7844> <3C2E> <68C5> <3C2F> <3D7D> <3C30> <9458> <3C31> <3927> <3C32> <6150> <3C35> <6107> <3C36> <9C4F> <3C37> <9C53> <3C38> <9C7B> <3C39> <9C35> <3C3A> <9C10> <3C3B> <9B7F> <3C3C> <9BCF> <3C3D> <E84B> <3C3E> <9B9F> <3C41> <9D21> <3C42> <4CAE> <3C43> <E851> <3C44> <9E18> <3C45> <4CB0> <3C46> <9D0C> <3C4B> <9DA5> <3C4C> <84BD> <3C50> <85FC> <3C51> <4533> <3C55> <8420> <3C56> <85EE> <3C5A> <79E2> <3C5D> <E86C> <3C5E> <3D62> <3C5F> <93DB> <3C60> <92BE> <3C61> <9348> <3C62> <E871> <3C63> <78B9> <3C64> <9277> <3C65> <944D> <3C66> <4FE4> <3C67> <3440> <3C68> <9064> <3C69> <E878> <3C6A> <783D> <3C6B> <7854> <3C6C> <78B6> <3C6D> <784B> <3C71> <369A> <3C72> <4F72> <3C73> <6FDA> <3C74> <6FD9> endbfchar 100 beginbfchar <3C76> <701E> <3C77> <5414> <3C78> <E887> <3C79> <57BB> <3C7A> <58F3> <3C7B> <578A> <3C7C> <9D16> <3C7D> <57D7> <3C7E> <7134> <3C7F> <34AF> <3C80> <E88F> <3C81> <71EB> <3C87> <610C> <3C88> <5ACE> <3C89> <5A0B> <3C8A> <42BC> <3C8B> <E89A> <3C8C> <372C> <3C8D> <4B7B> <3C8E> <E89D> <3C8F> <93BB> <3C90> <93B8> <3C93> <8472> <3C99> <5994> <3C9C> <7DA8> <3CA2> <92E5> <3CA3> <73E2> <3CA4> <3EE9> <3CA5> <74B4> <3CA8> <3EE1> <3CA9> <E8B8> <3CAA> <6AD8> <3CAB> <73F3> <3CAC> <73FB> <3CAD> <3ED6> <3CB5> <7448> <3CB6> <E8C5> <3CB7> <70A5> <3CB8> <E8C7> <3CB9> <9284> <3CBA> <73E6> <3CBB> <935F> <3CBC> <E8CB> <3CBD> <9331> <3CC0> <9386> <3CC3> <4935> <3CC4> <E8D3> <3CC5> <716B> <3CC8> <56A4> <3CCC> <5502> <3CCD> <79C4> <3CCE> <E8DD> <3CCF> <7DFE> <3CD3> <452E> <3CD4> <9401> <3CD5> <370A> <3CD8> <59B0> <3CDC> <5AA1> <3CDD> <36E2> <3CDE> <E8ED> <3CDF> <36B0> <3CE0> <925F> <3CE1> <5A79> <3CE4> <9374> <3CE5> <3CCD> <3CE6> <E8F5> <3CE7> <4A96> <3CE8> <398A> <3CE9> <50F4> <3CEA> <3D69> <3CEB> <3D4C> <3CEC> <E8FB> <3CED> <7175> <3CEE> <42FB> <3CEF> <E8FE> <3CF0> <6E0F> <3CF1> <E900> <3CF2> <44EB> <3CF3> <6D57> <3CF4> <E903> <3CF5> <7067> <3CF6> <6CAF> <3CF7> <3CD6> <3CFA> <6E02> <3CFB> <6F0C> <3CFC> <3D6F> <3CFD> <E90C> <3CFE> <7551> <3CFF> <36BC> <3D00> <34C8> <3D01> <4680> <3D02> <3EDA> <3D03> <4871> <3D04> <59C4> <3D05> <926E> <3D06> <493E> <3D07> <8F41> <3D0A> <5812> <3D0B> <57C8> <3D0C> <36D6> endbfchar 100 beginbfchar <3D0D> <E91C> <3D0E> <70FE> <3D14> <68B9> <3D15> <6967> <3D1E> <6A1A> <3D21> <843E> <3D22> <44DF> <3D23> <44CE> <3D2A> <833D> <3D2B> <E93A> <3D2C> <83ED> <3D30> <5989> <3D31> <5A82> <3D32> <E941> <3D33> <5A61> <3D34> <5A71> <3D37> <372D> <3D38> <59EF> <3D39> <E948> <3D3A> <36C7> <3D3B> <718E> <3D3C> <9390> <3D3D> <669A> <3D3E> <E94D> <3D3F> <5A6E> <3D40> <5A2B> <3D41> <E950> <3D42> <6A2B> <3D47> <711D> <3D4A> <4FB0> <3D4B> <E95A> <3D4C> <5CC2> <3D50> <6A0C> <3D54> <7133> <3D55> <E964> <3D56> <3DA5> <3D57> <6CDF> <3D58> <E967> <3D59> <59EB> <3D5A> <5F5C> <3D5B> <E974> <3D5C> <7CD3> <3D5D> <E987> <3D5E> <E98A> <3D5F> <E98E> <3D60> <906C> <3D61> <81F6> <3D62> <770C> <3D63> <6CA2> <3D64> <56FD> <3D65> <5869> <3D66> <6761> <3D67> <5C5E> <3D68> <58F2> <3D69> <70B9> <3D6A> <6803> <3D6D> <4E21> <3D6E> <7B39> <3D6F> <3DCC> <3D70> <732A> <3D71> <7560> <3D72> <583A> <3D73> <82A6> <3D74> <698A> <3D75> <60E3> <3D76> <4EEE> <3D77> <99C4> <3D78> <9EBF> <3D79> <5301> <3D7A> <67A0> <3D7B> <60E8> <3D7C> <51B4> <3D7D> <7A83> <3D7E> <9C3A> <3D7F> <7AC8> <3D80> <691A> <3D81> <59AC> <3D82> <5840> <3D83> <546A> <3D84> <60E7> <3D85> <567A> <3D86> <6955> <3D87> <9C2F> <3D88> <87A5> <3D89> <5C20> <3D8A> <5E0B> <3D8B> <671E> <3D8C> <84AD> <3D8D> <8B81> <3D8E> <4E78> <3D8F> <62C3> <3D90> <6855> <3D92> <82FD> <3D93> <89A5> <3D94> <8FA0> <3D95> <97B8> <3D96> <9847> <3D97> <9ABD> <3D98> <5FB1> <3D99> <6648> endbfchar 100 beginbfchar <3D9A> <66BF> <3D9B> <EB3D> <3D9D> <EB41> <3DA0> <EB46> <3DA1> <670E> <3DA2> <6918> <3DA7> <48D0> <3DA8> <4AB8> <3DA9> <EB54> <3DAA> <EB57> <3DAD> <51D2> <3DAE> <EB5D> <3DAF> <599F> <3DB0> <EB5F> <3DB1> <3BBE> <3DB2> <EB61> <3DB3> <399B> <3DB6> <3762> <3DB7> <EB6B> <3DB8> <8B5E> <3DB9> <EB6D> <3DBB> <7209> <3DBC> <EB74> <3DBD> <EB78> <3DBE> <8EDA> <3DBF> <528F> <3DC0> <7171> <3DC3> <55BC> <3DC4> <EB85> <3DC5> <3473> <3DC6> <EB89> <3DC7> <4718> <3DC8> <EB8F> <3DC9> <5066> <3DCA> <34FB> <3DCB> <EB93> <3DCD> <477C> <3DCE> <EB97> <3DCF> <EB9B> <3DD1> <EBA0> <3DD2> <9056> <3DD3> <EBA3> <3DD4> <8B62> <3DD5> <5D5B> <3DD6> <EBA8> <3DD8> <EBAB> <3DD9> <8AEA> <3DDA> <EBAD> <3DDB> <EBAF> <3DDC> <4BC0> <3DDD> <EBB4> <3DDE> <9465> <3DDF> <EBB6> <3DE0> <6195> <3DE1> <5A27> <3DE2> <EBB9> <3DE4> <EBBC> <3DE5> <4E6A> <3DE6> <EBBF> <3DE7> <9656> <3DE8> <6D8F> <3DE9> <EBC2> <3DEA> <8977> <3DEB> <EBC7> <3DED> <7B42> <3DF1> <7A45> <3DF2> <9A26> <3DF3> <365F> <3DF6> <7983> <3DF7> <5D2C> <3DF8> <EBDD> <3DFA> <46D0> <3DFB> <753B> <3DFC> <8865> <3DFD> <58B6> <3DFE> <371C> <3DFF> <EBE7> <3E00> <3C54> <3E01> <9281> <3E02> <EBEE> <3E03> <9330> <3E04> <EBF2> <3E05> <6C39> <3E06> <EBF6> <3E07> <8827> <3E08> <88F5> <3E0C> <6EB8> <3E0F> <39A4> <3E12> <453F> <3E13> <66B6> <3E16> <8943> <3E17> <40DF> <3E18> <EC0C> <3E19> <39A1> <3E1D> <71AD> <3E1E> <8366> <3E1F> <EC14> <3E21> <4CB7> <3E24> <EC1D> <3E25> <7B43> endbfchar 100 beginbfchar <3E26> <797E> <3E27> <6FB5> <3E28> <EC22> <3E29> <6A03> <3E2A> <EC24> <3E2B> <53A2> <3E2C> <EC26> <3E2D> <93BF> <3E2E> <6836> <3E2F> <975D> <3E30> <EC2A> <3E34> <5D85> <3E35> <EC31> <3E36> <5715> <3E37> <9823> <3E38> <EC35> <3E39> <5DAB> <3E3A> <EC37> <3E3B> <65BE> <3E3C> <69D5> <3E3D> <53D2> <3E40> <3C11> <3E41> <6736> <3E42> <EC42> <3E43> <35CA> <3E44> <48FA> <3E46> <7808> <3E47> <9255> <3E48> <43F2> <3E49> <43DF> <3E4A> <59F8> <3E4C> <568B> <3E4D> <EC68> <3E4E> <9012> <3E4F> <55C1> <3E50> <4509> <3E51> <7E7F> <3E52> <6F56> <3E53> <6AB1> <3E54> <34E4> <3E55> <EC8E> <3E56> <373A> <3E58> <EC92> <3E59> <EC95> <3E5A> <3DEB> <3E5B> <EC99> <3E5C> <EC9E> <3E5D> <56BF> <3E5E> <8E0E> <3E5F> <5B6D> <3E60> <63DE> <3E62> <6530> <3E63> <562D> <3E64> <541A> <3E65> <ECAF> <3E66> <4C7D> <3E67> <5622> <3E68> <561E> <3E69> <7F49> <3E6A> <5975> <3E6B> <ECB6> <3E6C> <8770> <3E6D> <8117> <3E6E> <9D5E> <3E6F> <8D18> <3E70> <763B> <3E71> <9C45> <3E72> <764E> <3E73> <77B9> <3E74> <9345> <3E75> <5432> <3E76> <8148> <3E77> <82F7> <3E78> <5625> <3E79> <8132> <3E7A> <8418> <3E7B> <80BD> <3E7C> <55EA> <3E7D> <7962> <3E7E> <5643> <3E7F> <5416> <3E80> <ECCF> <3E81> <35CE> <3E82> <5605> <3E83> <55F1> <3E84> <66F1> <3E85> <ECD4> <3E86> <362D> <3E87> <7534> <3E88> <55F0> <3E89> <55BA> <3E8A> <5497> <3E8B> <5572> <3E8E> <5ED0> <3E92> <9EAB> <3E93> <7D5A> <3E95> <ECE5> <3E96> <629D> <3E97> <976D> <3E98> <5494> endbfchar 100 beginbfchar <3E99> <8CCD> <3E9A> <71F6> <3E9B> <9176> <3E9C> <63FC> <3E9D> <63B9> <3E9E> <63FE> <3E9F> <5569> <3EA0> <ECF0> <3EA1> <9C72> <3EA2> <ECF2> <3EA3> <519A> <3EA4> <34DF> <3EA5> <ECF5> <3EA6> <51A7> <3EA7> <544D> <3EA8> <551E> <3EA9> <5513> <3EAA> <7666> <3EAB> <8E2D> <3EAC> <ECFC> <3EAD> <75B1> <3EAE> <80B6> <3EAF> <8804> <3EB1> <88C7> <3EB2> <81B6> <3EB3> <841C> <3EB4> <44EC> <3EB5> <7304> <3EB6> <830B> <3EB7> <567B> <3EB8> <9170> <3EB9> <9208> <3EBA> <ED18> <3EBB> <7266> <3EBC> <474E> <3EBD> <ED1D> <3EBE> <40FA> <3EBF> <9C5D> <3EC0> <651F> <3EC1> <48F3> <3EC5> <ED29> <3EC7> <ED2C> <3EC8> <71A3> <3EC9> <7E8E> <3ECA> <9D50> <3ECB> <3577> <3ECC> <6CB2> <3ECD> <5367> <3ECE> <39DC> <3ECF> <ED3B> <3ED0> <822D> <3ED1> <544B> <3ED3> <3A52> <3ED4> <7374> <3ED5> <ED47> <3ED6> <4D09> <3ED7> <9BED> <3ED9> <4C5B> <3EDA> <ED4F> <3EDB> <845C> <3EDC> <ED52> <3EDD> <632E> <3EDE> <7D25> <3EDF> <3A2A> <3EE0> <9008> <3EE1> <52CC> <3EE2> <3E74> <3EE3> <367A> <3EE4> <45E9> <3EE5> <ED5F> <3EE6> <7640> <3EE7> <5AF0> <3EE8> <ED62> <3EE9> <787A> <3EEA> <47B6> <3EEB> <58A7> <3EEC> <40BF> <3EED> <567C> <3EEE> <9B8B> <3EEF> <5D74> <3EF0> <7654> <3EF1> <ED6B> <3EF2> <9E85> <3EF3> <4CE1> <3EF5> <37FB> <3EF6> <6119> <3EF7> <ED72> <3EF9> <565D> <3EFA> <ED78> <3EFB> <5234> <3EFC> <35AD> <3EFE> <9D7C> <3EFF> <7C56> <3F00> <9B39> <3F01> <57DE> <3F02> <5C53> <3F03> <64D3> <3F06> <86AD> <3F07> <ED88> <3F08> <ED8B> endbfchar 100 beginbfchar <3F0A> <51FE> <3F0B> <ED8E> <3F0C> <5D8E> <3F0D> <9703> <3F0E> <ED91> <3F0F> <9E81> <3F10> <904C> <3F11> <7B1F> <3F12> <9B02> <3F13> <5CD1> <3F14> <7BA3> <3F15> <6268> <3F16> <6335> <3F17> <9AFF> <3F18> <7BCF> <3F19> <9B2A> <3F1A> <7C7E> <3F1C> <7C42> <3F1D> <7C86> <3F1E> <9C15> <3F1F> <7BFC> <3F20> <9B09> <3F23> <9F5A> <3F24> <5573> <3F25> <5BC3> <3F26> <4FFD> <3F27> <9E98> <3F28> <4FF2> <3F29> <5260> <3F2A> <52D1> <3F2B> <5767> <3F2C> <5056> <3F2D> <59B7> <3F2E> <5E12> <3F2F> <97C8> <3F30> <9DAB> <3F31> <8F5C> <3F32> <5469> <3F33> <97B4> <3F34> <9940> <3F35> <97BA> <3F36> <532C> <3F37> <6130> <3F38> <692C> <3F39> <53DA> <3F3A> <9C0A> <3F3B> <9D02> <3F3C> <4C3B> <3F3D> <9641> <3F3E> <6980> <3F3F> <50A6> <3F40> <7546> <3F41> <EDC6> <3F42> <99DA> <3F43> <5273> <3F45> <9159> <3F46> <9681> <3F47> <915C> <3F49> <9151> <3F4A> <EDCF> <3F4B> <637F> <3F4C> <6ACA> <3F4D> <5611> <3F4E> <918E> <3F4F> <757A> <3F50> <6285> <3F51> <734F> <3F52> <7C70> <3F53> <EDDA> <3F55> <76D6> <3F56> <9B9D> <3F57> <4E2A> <3F58> <EDE1> <3F59> <83BE> <3F5A> <8842> <3F5C> <5C4A> <3F5D> <69C0> <3F60> <521F> <3F61> <5DF5> <3F62> <4ECE> <3F63> <6C31> <3F64> <EDED> <3F65> <4F39> <3F66> <549C> <3F68> <529A> <3F69> <8D82> <3F6A> <35FE> <3F6C> <35F3> <3F6E> <6B52> <3F6F> <917C> <3F70> <9FA5> <3F71> <9B97> <3F72> <982E> <3F73> <98B4> <3F74> <9ABA> <3F75> <9EA8> <3F76> <9E84> <3F77> <7B14> <3F79> <6BFA> <3F7A> <8818> endbfchar 100 beginbfchar <3F7B> <7F78> <3F7D> <5620> <3F7E> <EE08> <3F7F> <8E77> <3F80> <9F53> <3F82> <8DD4> <3F83> <8E4F> <3F84> <9E1C> <3F85> <8E01> <3F86> <6282> <3F87> <EE11> <3F88> <8E28> <3F89> <8E75> <3F8A> <7AD3> <3F8B> <7A3E> <3F8C> <78D8> <3F8D> <6CEA> <3F8E> <8A67> <3F8F> <7607> <3F90> <9F26> <3F91> <6CCE> <3F92> <87D6> <3F93> <75C3> <3F94> <EE20> <3F95> <7853> <3F96> <8D0C> <3F97> <72E2> <3F98> <7371> <3F99> <8B2D> <3F9A> <7302> <3F9B> <74F1> <3F9C> <8CEB> <3F9D> <EE2A> <3F9E> <862F> <3F9F> <5FBA> <3FA0> <88A0> <3FA1> <44B7> <3FA3> <EE31> <3FA5> <8A7E> <3FA6> <EE34> <3FA8> <60FD> <3FA9> <7667> <3FAA> <9AD7> <3FAB> <9D44> <3FAC> <936E> <3FAD> <9B8F> <3FAE> <87F5> <3FB1> <8CF7> <3FB2> <732C> <3FB3> <9721> <3FB4> <9BB0> <3FB5> <35D6> <3FB6> <72B2> <3FB7> <4C07> <3FB8> <7C51> <3FB9> <994A> <3FBA> <6159> <3FBB> <4C04> <3FBC> <9E96> <3FBD> <617D> <3FBF> <575F> <3FC0> <616F> <3FC1> <62A6> <3FC2> <6239> <3FC4> <3A5C> <3FC5> <61E2> <3FC6> <53AA> <3FC7> <6364> <3FC8> <6802> <3FC9> <35D2> <3FCA> <5D57> <3FCB> <8FDA> <3FCC> <EE5D> <3FCE> <50D9> <3FCF> <7906> <3FD0> <5332> <3FD1> <9638> <3FD2> <EE64> <3FD3> <4065> <3FD5> <77FE> <3FD7> <7CC2> <3FD8> <EE6A> <3FD9> <7CDA> <3FDA> <7A2D> <3FDB> <8066> <3FDC> <8063> <3FDD> <7D4D> <3FDE> <7505> <3FDF> <74F2> <3FE0> <8994> <3FE1> <821A> <3FE2> <670C> <3FE3> <8062> <3FE4> <EE76> <3FE5> <805B> <3FE6> <74F0> <3FE7> <8103> <3FE8> <7724> <3FE9> <8989> <3FEA> <EE7C> endbfchar 100 beginbfchar <3FEB> <7553> <3FEC> <87A9> <3FED> <87CE> <3FEE> <81C8> <3FEF> <878C> <3FF0> <8A49> <3FF1> <8CAD> <3FF2> <8B43> <3FF3> <772B> <3FF4> <74F8> <3FF5> <84DA> <3FF6> <69B2> <3FF7> <8DA6> <3FF9> <89A9> <3FFB> <6DB9> <3FFC> <87C1> <3FFD> <EE91> <3FFE> <74E7> <3FFF> <3DDB> <4000> <7176> <4001> <60A4> <4002> <619C> <4003> <3CD1> <4005> <6077> <4007> <7F71> <4009> <60E9> <400A> <4B7E> <400B> <E000> <400C> <92DB> <400F> <854C> <4010> <42B5> <4011> <73EF> <4012> <51B5> <4013> <3649> <4016> <9344> <4017> <E00C> <4018> <82EE> <4019> <E00E> <401A> <783C> <401B> <6744> <401C> <62DF> <4022> <4FAB> <4023> <E018> <4024> <5008> <402B> <E020> <402C> <5FA4> <402F> <6EDB> <4030> <E025> <4032> <5101> <4033> <347A> <4034> <510E> <4035> <986C> <4036> <3743> <4037> <8416> <403A> <5160> <403B> <E030> <403C> <516A> <4044> <5B82> <4045> <877D> <4048> <51B2> <4049> <51B8> <404A> <9D34> <404B> <51C9> <404C> <51CF> <404D> <51D1> <404E> <3CDC> <404F> <51D3> <4050> <E045> <4051> <51B3> <4054> <51ED> <4055> <83CD> <4056> <693E> <4057> <E04C> <4058> <5F7B> <4059> <520B> <405A> <5226> <405B> <523C> <405C> <52B5> <405D> <5257> <405E> <5294> <405F> <52B9> <4060> <52C5> <4061> <7C15> <4062> <8542> <4063> <52E0> <4064> <860D> <4065> <E05A> <4067> <E05C> <4068> <5549> <4069> <6ED9> <406D> <5333> <406F> <E064> <4070> <6CCB> <4071> <E066> <4072> <681B> <4073> <73D5> <4074> <604A> <4075> <3EAA> <4076> <38CC> <4077> <E06C> endbfchar 100 beginbfchar <4078> <71DD> <4079> <44A2> <407A> <536D> <407B> <5374> <407C> <E071> <407D> <537E> <4081> <77E6> <4082> <5393> <4083> <E078> <4084> <53A0> <4085> <53AB> <4086> <53AE> <4087> <73A7> <4088> <E07D> <4089> <3F59> <408A> <739C> <408B> <53C1> <408C> <53C5> <408D> <6C49> <408E> <4E49> <408F> <57FE> <4090> <53D9> <4091> <3AAB> <4092> <E087> <4093> <53E0> <4096> <53F6> <4097> <E08C> <4098> <5413> <4099> <7079> <409A> <552B> <409B> <6657> <409C> <6D5B> <409D> <546D> <40A0> <555D> <40A1> <548F> <40A2> <54A4> <40A3> <47A6> <40A6> <3DB4> <40AA> <5547> <40AB> <4CED> <40AC> <542F> <40AD> <7417> <40AE> <5586> <40AF> <55A9> <40B3> <4552> <40B4> <E0A9> <40B5> <66B3> <40B6> <E0AB> <40B7> <5637> <40B8> <66CD> <40B9> <E0AE> <40BA> <66A4> <40BC> <564D> <40BD> <564F> <40BE> <78F1> <40BF> <56F1> <40C0> <9787> <40C1> <53FE> <40C2> <5700> <40C3> <56EF> <40C4> <56ED> <40C5> <E0BA> <40C6> <3623> <40C7> <E0BC> <40C8> <5746> <40C9> <E0BE> <40CA> <6C6E> <40CB> <708B> <40CC> <5742> <40CD> <36B1> <40CE> <E0C3> <40CF> <57E6> <40D0> <E0C5> <40D1> <5803> <40D4> <5826> <40D5> <E0CA> <40D7> <58AA> <40D8> <3561> <40D9> <58E0> <40DA> <58DC> <40DB> <E0D0> <40DC> <58FB> <40DD> <5BFF> <40DE> <5743> <40E1> <93D3> <40E2> <35A1> <40E3> <591F> <40E4> <68A6> <40E5> <36C3> <40E6> <6E59> <40E7> <E0DC> <40E8> <5A24> <40EA> <E0DF> <40EB> <8505> <40EC> <59C9> <40F1> <59D9> <40F5> <6D71> <40F8> <59F9> <40F9> <E0EE> <40FA> <5AAB> endbfchar 100 beginbfchar <40FB> <5A63> <40FC> <36E6> <40FD> <E0F2> <40FF> <3708> <4100> <5A96> <4101> <7465> <4102> <5AD3> <4105> <E0FB> <4106> <3732> <4107> <E0FD> <4108> <5E83> <4109> <52D0> <410A> <5B76> <410B> <6588> <410C> <5B7C> <410D> <E103> <410E> <4004> <410F> <485D> <4110> <E106> <4111> <5BD5> <4115> <5BF3> <4116> <5B9D> <4117> <4D10> <4118> <5C05> <4119> <E110> <411A> <5C13> <411B> <73CE> <411C> <5C14> <411F> <5C49> <4120> <48DD> <4121> <5C85> <4122> <5CE9> <4123> <5CEF> <4124> <5D8B> <4127> <5D10> <4128> <5D18> <4129> <5D46> <412A> <E121> <412B> <5CBA> <412C> <5DD7> <412D> <82FC> <412E> <382D> <4132> <8287> <4133> <3836> <4134> <3BC2> <4135> <5E2E> <4136> <6A8A> <4138> <5E7A> <413B> <53A6> <413C> <4EB7> <413E> <53A8> <413F> <E136> <4140> <5E09> <4141> <5EF4> <4142> <E139> <4143> <5EF9> <4144> <5EFB> <4145> <38A0> <4146> <5EFC> <4147> <683E> <4148> <941B> <4149> <5F0D> <414C> <3ADE> <414D> <E145> <414E> <5F3A> <4151> <E14A> <4152> <5F63> <4153> <E14D> <4154> <5F72> <4155> <9340> <4156> <E150> <4157> <5FA7> <4158> <5DB6> <4159> <3D5F> <415E> <91D6> <4161> <6031> <4162> <6685> <4163> <3963> <4164> <3DC7> <4165> <3639> <4166> <5790> <4167> <E162> <4168> <7971> <4169> <3E40> <416A> <609E> <4170> <74A4> <4171> <50E1> <4172> <5AA0> <4173> <6164> <4174> <6142> <4177> <6181> <4178> <51F4> <4179> <E175> <417A> <6187> <417B> <5BAA> <417E> <61D3> <4181> <61D0> <4182> <3932> <4185> <6023> <4186> <615C> endbfchar 100 beginbfchar <4187> <651E> <4188> <638B> <4189> <E185> <418A> <62C5> <418B> <E187> <418C> <62D5> <418D> <E189> <418E> <636C> <418F> <E18B> <4190> <3A17> <4191> <6438> <4192> <63F8> <4195> <6F8A> <4196> <E193> <4198> <E196> <4199> <64E1> <419A> <64E5> <419B> <947B> <419C> <3A66> <419D> <643A> <419E> <3A57> <419F> <654D> <41A0> <6F16> <41A3> <6585> <41A4> <656D> <41A5> <655F> <41A7> <65B5> <41A8> <E1A6> <41A9> <4B37> <41AA> <65D1> <41AB> <40D8> <41AC> <E1AA> <41AD> <65E0> <41AE> <65E3> <41AF> <5FDF> <41B0> <E1AE> <41B1> <6618> <41B4> <6644> <41B7> <664B> <41B8> <E1B6> <41B9> <6667> <41BA> <E1B8> <41BB> <6673> <41C1> <77C5> <41C2> <E1C1> <41C3> <99A4> <41C4> <6702> <41C7> <69FA> <41C8> <E1C8> <41CA> <6767> <41CB> <6762> <41CE> <67D7> <41CF> <44E9> <41D0> <6822> <41D1> <6E50> <41D2> <923C> <41D3> <6801> <41D6> <685D> <41D7> <E1D7> <41D8> <69E1> <41D9> <6A0B> <41DA> <E1DA> <41DB> <6973> <41DC> <68C3> <41DD> <E1DD> <41DE> <6901> <41DF> <6900> <41E0> <3A01> <41E1> <E1E2> <41E2> <3B80> <41E3> <67AC> <41E4> <6961> <41E5> <E1E6> <41E6> <42FC> <41E7> <6936> <41E8> <6998> <41E9> <3BA1> <41EA> <E1EB> <41EB> <8363> <41EC> <5090> <41ED> <69F9> <41F0> <6A45> <41F1> <E1F2> <41F2> <6A9D> <41F3> <3BF3> <41F4> <67B1> <41F5> <6AC8> <41F6> <E1F7> <41F7> <3C0D> <41F8> <6B1D> <41F9> <E1FA> <41FA> <60DE> <41FB> <6B35> <41FC> <6B74> <41FD> <E1FE> <41FE> <6EB5> <41FF> <E200> <4201> <E202> <4202> <3740> <4203> <5421> endbfchar 100 beginbfchar <4204> <E205> <4205> <6BE1> <4206> <E207> <4207> <6BDC> <4208> <6C37> <420C> <6C5A> <420D> <8226> <420E> <6C79> <420F> <E210> <4210> <44C5> <4216> <36E5> <4217> <3CEB> <4218> <E219> <4219> <9B83> <421C> <7F8F> <421D> <6837> <4221> <6D96> <4222> <6D5C> <4223> <6E7C> <4224> <6F04> <4228> <8533> <4229> <E22A> <422A> <51C7> <422D> <842E> <422E> <E22F> <4230> <E231> <4231> <7453> <4232> <E233> <4233> <79CC> <4234> <6E4F> <4235> <5A91> <4236> <E237> <4237> <6FF8> <4238> <370D> <4239> <6F9D> <423A> <E23B> <423B> <6EFA> <423E> <4555> <423F> <93F0> <4240> <6F44> <4241> <6F5C> <4242> <3D4E> <4243> <6F74> <4244> <E245> <4245> <3D3B> <4246> <6F9F> <4247> <E248> <4248> <6FD3> <424F> <51DF> <4254> <704B> <4255> <707E> <4256> <70A7> <4258> <70CC> <425B> <70DF> <425C> <4104> <425D> <3DE8> <425E> <71B4> <425F> <7196> <4260> <E261> <4261> <712B> <4262> <7145> <4263> <5A88> <4264> <714A> <4266> <E268> <4267> <714F> <4268> <9362> <4269> <E26B> <426A> <712C> <426E> <71BA> <426F> <E271> <4270> <70BD> <4271> <720E> <4272> <9442> <4273> <7215> <4274> <5911> <4275> <9443> <4276> <7224> <4277> <9341> <4278> <E27A> <4279> <722E> <427A> <7240> <427B> <E27D> <427C> <68BD> <427D> <7255> <427E> <7257> <427F> <3E55> <4280> <E282> <4281> <680D> <4282> <6F3D> <4283> <7282> <4285> <732B> <4288> <48ED> <4289> <E28B> <428A> <7328> <428B> <732E> <428C> <73CF> <428D> <73AA> <4290> <73C9> <4291> <7449> <4295> <6623> endbfchar 100 beginbfchar <4296> <36C5> <429A> <73F7> <429B> <7415> <429C> <6903> <429D> <E29F> <429E> <7439> <429F> <3ED7> <42A1> <E2A4> <42A2> <7460> <42A3> <E2A6> <42A4> <7447> <42A5> <73E4> <42A6> <7476> <42A7> <83B9> <42A8> <746C> <42A9> <7474> <42AA> <93F1> <42AB> <6A2C> <42AC> <7482> <42AD> <4953> <42B2> <5B46> <42B5> <74C8> <42B6> <E2BA> <42B7> <750E> <42B8> <751E> <42BB> <5BD7> <42BC> <E2C1> <42BD> <9385> <42BE> <754D> <42BF> <754A> <42C0> <7567> <42C1> <756E> <42C2> <E2C7> <42C3> <3F04> <42C4> <E2C9> <42C5> <758E> <42C6> <745D> <42C7> <759E> <42C8> <75B4> <42C9> <7602> <42CA> <762C> <42CB> <7651> <42CC> <764F> <42CD> <766F> <42CE> <7676> <42CF> <E2D4> <42D0> <7690> <42D1> <81EF> <42D2> <37F8> <42D5> <76A1> <42D6> <76A5> <42D7> <76B7> <42D8> <76CC> <42D9> <E2DE> <42DA> <8462> <42DE> <771E> <42DF> <7726> <42E0> <7740> <42E1> <64AF> <42E2> <E2E7> <42E3> <7758> <42E4> <E2E9> <42E5> <77AF> <42E9> <77F4> <42EB> <68CA> <42EC> <78AF> <42ED> <78C7> <42EE> <78D3> <42EF> <96A5> <42F0> <792E> <42F1> <E2F8> <42F2> <78D7> <42F3> <7934> <42F4> <78B1> <42F5> <E2FC> <42F6> <8FB8> <42F7> <8884> <42F8> <E301> <42F9> <7986> <42FA> <8900> <42FB> <6902> <42FC> <7980> <42FD> <E306> <42FE> <799D> <42FF> <E308> <4300> <793C> <4301> <79A9> <4302> <6E2A> <4303> <E30C> <4304> <3EA8> <4305> <79C6> <4306> <E30F> <4307> <79D4> <4309> <5525> <430E> <5590> <430F> <F444> <4310> <39EC> <4311> <F446> <4312> <8E46> <4316> <F44B> endbfchar 100 beginbfchar <4317> <777A> <4318> <F44D> <4319> <3A34> <431A> <47D5> <431E> <64DD> <4323> <648D> <4324> <8E7E> <4325> <F45A> <432F> <47F4> <4332> <9AB2> <4333> <3A67> <4334> <F469> <4335> <3FED> <4336> <3506> <433A> <F46F> <433B> <9D6E> <433C> <9815> <433E> <43D9> <4340> <64B4> <4341> <54E3> <4343> <F478> <4345> <39FB> <434A> <64EA> <434D> <8E68> <4352> <480B> <4353> <F488> <4354> <3FFA> <4355> <5873> <4356> <F48B> <435D> <5579> <435F> <43BA> <4361> <4AB4> <4364> <81AA> <4365> <98F5> <4366> <F49B> <4367> <6379> <4368> <39FE> <4369> <F49E> <436A> <8DC0> <436B> <56A1> <436C> <647C> <436D> <3E43> <4376> <3992> <4377> <3A06> <4378> <F4AD> <4379> <3578> <4380> <34BC> <4381> <6C3D> <4382> <F4B7> <438E> <F4DF> <438F> <3A18> <4390> <F4E3> <4391> <F4E5> <4395> <95AA> <4397> <F4F2> <4398> <7140> <439A> <5156> <439C> <5088> <439E> <3493> <439F> <5186> <43A0> <5E42> <43A1> <5205> <43A2> <5227> <43A3> <5279> <43A5> <3553> <43A6> <53C2> <43A7> <535F> <43A9> <553F> <43AB> <55D8> <43AC> <35DD> <43AD> <5621> <43AF> <5654> <43B0> <EAF4> <43B2> <EAF9> <43B4> <EEA7> <43B7> <37B9> <43B8> <5CC1> <43B9> <5D15> <43BA> <5D56> <43BB> <3838> <43BC> <4E81> <43BD> <5EBD> <43BE> <3914> <43BF> <61B9> <43C0> <6290> <43C1> <6318> <43C2> <645A> <43C3> <6491> <43C4> <816D> <43C5> <8184> <43C6> <8193> <43C7> <6800> <43C8> <3BBC> <43C9> <728F> <43CA> <72CD> <43CC> <7339> <43CD> <7542> <43CE> <75DC> <43CF> <3FC0> <43D0> <EB76> endbfchar 100 beginbfchar <43D1> <3FD7> <43D4> <E9B0> <43D5> <40A8> <43D6> <7839> <43D7> <4103> <43D8> <7A91> <43D9> <7C1B> <43DA> <7CED> <43DB> <7F93> <43DC> <7FAE> <43DE> <82FF> <43DF> <585F> <43E0> <86B2> <43E2> <878B> <43E3> <8947> <43E5> <8A29> <43E7> <8E71> <43E8> <EC44> <43E9> <8EB0> <43EB> <915E> <43EC> <918C> <43ED> <990E> <43EE> <991C> <43F1> <9B81> <43F2> <9DC0> <43F3> <9D93> <43F4> <9EAC> <43F5> <4D91> <43F8> <9E7B> <43F9> <7089> <43FA> <7348> <43FC> <7999> <43FD> <8FB7> <43FF> <9942> <445F> <00A9> <4460> <2122> <4461> <2026> <44C1> <20AC> <44C2> <20AC> <44C3> <2110> <44C4> <20AC> <44C5> <20AC> <44C8> <2E80> <44DF> <4E28> <44E0> <5902> <44E3> <9751> <44E4> <F53D> <44E5> <4E5B> <44E6> <4EBB> <44E7> <353E> <44E8> <5C23> <44E9> <5F51> <44EA> <5FC4> <44EB> <38FA> <44EC> <624C> <44ED> <6535> <44EE> <6B7A> <44EF> <6C35> <44F0> <6C3A> <44F1> <706C> <44F2> <722B> <44F3> <4E2C> <44F4> <72AD> <44F5> <F54E> <44F6> <7F52> <44F7> <793B> <44F8> <7CF9> <44F9> <7F53> <44FA> <F553> <44FB> <34C1> <44FC> <F556> <44FD> <8002> <44FE> <8080> <44FF> <F559> <4500> <F55A> <4501> <535D> <4502> <8864> <4503> <89C1> <4504> <F55E> <4505> <8BA0> <4506> <8D1D> <4507> <9485> <4508> <9578> <4509> <957F> <450A> <95E8> <450B> <F565> <450C> <97E6> <450D> <9875> <450E> <98CE> <450F> <98DE> <4510> <9963> <4511> <F56B> <4512> <9C7C> <4513> <9E1F> <4514> <9EC4> <4515> <6B6F> <4516> <9F9C> <4517> <4E37> <4518> <F572> <4519> <961D> endbfchar 100 beginbfchar <451A> <6237> <451B> <94A2> <451C> <2E84> <4520> <2E8A> <4523> <2E95> <4524> <2E9C> <4525> <2EA5> <4526> <2EA7> <4527> <2EAA> <4528> <2EAC> <4529> <2EAE> <452A> <2EB6> <452B> <2EBC> <452C> <2EBE> <452D> <2ECA> <4530> <2ECF> <4533> <2EDE> <4536> <650A> <4537> <4E3D> <4538> <6EDD> <4539> <9D4E> <453A> <91DF> <453B> <F3AC> <453C> <4F1A> <453D> <4F28> <453E> <4FA8> <453F> <5174> <4540> <519C> <4541> <51E4> <4542> <52A1> <4543> <52A8> <4544> <533B> <4545> <534E> <4546> <53D1> <4547> <53D8> <4548> <56E2> <4549> <58F0> <454A> <5904> <454B> <5907> <454C> <5932> <454D> <5934> <454E> <5B66> <4551> <5C9A> <4552> <5E86> <4553> <603B> <4554> <6589> <4555> <67FE> <4556> <6804> <4557> <6865> <4558> <6D4E> <4559> <70BC> <455A> <7535> <455B> <7EA4> <455C> <7EAC> <455D> <7EBA> <455E> <7EC7> <455F> <7ECF> <4560> <7EDF> <4561> <7F06> <4562> <7F37> <4563> <827A> <4564> <82CF> <4565> <836F> <4566> <89C6> <4567> <8BBE> <4568> <8BE2> <456B> <8F6E> <456C> <7411> <456D> <7CFC> <456E> <7DCD> <456F> <6946> <4570> <7AC9> <4571> <78B8> <4572> <80BC> <4573> <8D0B> <4574> <80F6> <4575> <F3F0> <4576> <809F> <4577> <9EC7> <4578> <4CCD> <4579> <9DC9> <457A> <9E0C> <457B> <4C3E> <457E> <9E0A> <457F> <F3FC> <4580> <35C1> <4581> <6E9A> <4582> <823E> <4583> <7519> <4584> <4911> <4585> <9A6C> <4586> <9A8F> <4587> <9F99> <4588> <7987> <458D> <4E24> <458E> <4E80> <458F> <4E87> <4590> <4EBF> <4591> <4EEB> <4592> <4F37> endbfchar 100 beginbfchar <4593> <344C> <4594> <4FBD> <4595> <3E48> <4596> <5003> <4597> <347D> <4598> <34A5> <4599> <5905> <459A> <51DB> <459B> <51FC> <459C> <4E89> <459D> <5290> <459E> <5327> <459F> <35C7> <45A0> <53A9> <45A1> <3551> <45A2> <53B0> <45A3> <5423> <45A4> <356D> <45A5> <3572> <45A6> <3681> <45A7> <5493> <45A8> <54A3> <45A9> <54B4> <45AA> <54B9> <45AB> <54D0> <45AC> <54EF> <45AD> <5518> <45AE> <5523> <45AF> <5528> <45B0> <3598> <45B1> <35A5> <45B2> <35BF> <45B3> <55D7> <45B4> <35C5> <45B5> <F43D> <45B6> <4053> <45B7> <F457> <45B8> <F45B> <45B9> <F46E> <45BA> <F474> <45BB> <F477> <45BC> <F479> <45BD> <F47B> <45BE> <F483> <45BF> <F491> <45C0> <40BB> <45C1> <F4A7> <45C2> <5652> <45C3> <F4B2> <45C4> <F4C1> <45C8> <35FB> <45CD> <3F93> <45D7> <3FF9> <45D8> <F4D7> <45D9> <6432> <45DE> <F4E0> <45DF> <F4E2> <45E0> <F4E4> <45E1> <F4E6> <45E2> <54CC> <45E3> <82C4> <45E4> <55B9> <45E5> <F4EF> <45E6> <9C26> <45E7> <9AB6> <45E8> <F4F3> <45E9> <80EC> <45EA> <5C1C> <45EB> <F4F8> <45EC> <8134> <45ED> <3797> <45EE> <F4FC> <45EF> <91B6> <45F4> <F503> <45F5> <3609> <45F6> <F505> <45F7> <56AF> <4603> <5A54> <4608> <579C> <460F> <3703> <4618> <5899> <4619> <5268> <461A> <361A> <461B> <F52A> <461C> <7BB2> <461D> <5B68> <461E> <4800> <461F> <4B2C> <4620> <9F27> <4621> <49E7> <4622> <9C1F> <4623> <9B8D> <4626> <55FB> <4627> <35F2> <4628> <5689> <4629> <5D3E> <462A> <5D48> <462B> <3DFC> <462C> <380F> <462D> <5DA4> endbfchar 100 beginbfchar <462E> <5DB9> <462F> <3820> <4630> <5F25> <4631> <5F83> <4632> <3908> <4633> <393F> <4634> <394D> <4635> <60D7> <4636> <613D> <4637> <5CE5> <4638> <3989> <4639> <61B7> <463A> <61CF> <463B> <39B8> <463C> <622C> <463D> <62E5> <463E> <39F8> <463F> <56B1> <4640> <3A03> <4641> <63E2> <4642> <63FB> <4643> <6407> <4644> <3A4B> <4645> <64C0> <4646> <9F9F> <4647> <3A97> <4648> <6586> <4649> <3ABD> <464A> <65FF> <464B> <6653> <464C> <3AF2> <464D> <6692> <464E> <3B22> <464F> <6716> <4650> <3B42> <4651> <67A4> <4652> <3B58> <4653> <684A> <4654> <6884> <4655> <3B72> <4656> <3B71> <4657> <3B7B> <4658> <6909> <4659> <6943> <465A> <725C> <465B> <6964> <465C> <699F> <465D> <6985> <465E> <69D6> <465F> <3BDD> <4660> <6A65> <4661> <6A74> <4662> <6A71> <4663> <6A82> <4664> <3BEC> <4665> <6A99> <4666> <3BF2> <4667> <6AAB> <4668> <6AB5> <4669> <6AD4> <466A> <6AF6> <466B> <6B81> <466C> <6BC1> <466D> <6BEA> <466E> <6C75> <466F> <6CAA> <4670> <3CCB> <4671> <6D02> <4672> <6D06> <4673> <6D26> <4674> <6D81> <4675> <3CEF> <4676> <6DA4> <4677> <6DB1> <4678> <6E15> <4679> <6E18> <467A> <6E29> <467B> <6E86> <467C> <F694> <467D> <6EBB> <467E> <6EE2> <467F> <6EDA> <4680> <9F7F> <4683> <6F24> <4684> <6F34> <4685> <3D46> <4686> <F69E> <4687> <6F81> <4688> <6FBE> <4689> <3D6A> <468A> <3D75> <468B> <71B7> <468C> <5C99> <468D> <3D8A> <468E> <702C> <468F> <3D91> <4690> <7050> <4691> <7054> <4692> <706F> <4693> <707F> endbfchar 100 beginbfchar <4694> <F6AD> <4695> <43C1> <4696> <35F1> <4697> <F6B0> <4698> <364E> <4699> <3DAD> <469A> <E33D> <469B> <667D> <469C> <7C74> <469D> <748D> <469E> <7E92> <469F> <4503> <46A0> <E394> <46A1> <E39E> <46A2> <E3A5> <46A3> <347E> <46A4> <E3CD> <46A5> <E3D5> <46A6> <E3E7> <46A7> <8771> <46A8> <63C1> <46A9> <7777> <46AA> <898A> <46AB> <E426> <46AC> <8B4C> <46AD> <E448> <46AE> <492A> <46B2> <3AF0> <46B3> <708F> <46B4> <E4A1> <46B5> <E50D> <46B6> <E516> <46B7> <6888> <46B8> <E528> <46B9> <9366> <46BA> <93C6> <46BB> <E5B2> <46BD> <928F> <46BE> <8614> <46BF> <E66A> <46C0> <4190> <46C1> <678F> <46C2> <681E> <46C3> <3863> <46C4> <E6C5> <46C5> <3B19> <46C6> <8496> <46C7> <E769> <46C8> <39E2> <46C9> <8480> <46CA> <436E> <46CB> <9771> <46CC> <999B> <46CD> <492D> <46CE> <6F17> <46CF> <E938> <46D0> <70A6> <46D1> <E968> <46D2> <7E65> <46D3> <5D2F> <46D4> <3DF3> <46D7> <7DA4> <46D8> <8426> <46D9> <5485> <46DA> <E973> <46DB> <E975> <46DC> <577E> <46DF> <3FE5> <46E2> <7003> <46E3> <E97D> <46E4> <5D70> <46E5> <738F> <46E8> <4FC8> <46E9> <7FE7> <46EA> <7310> <46EB> <7338> <46EC> <7341> <46ED> <3EA9> <46EE> <71F5> <46EF> <E991> <46F0> <73E1> <46F1> <3ECA> <46F2> <3ED1> <46F3> <7419> <46F6> <3EE2> <46F7> <3EF0> <46F8> <3EF4> <46F9> <3EFA> <46FA> <74D3> <46FB> <3F0E> <46FC> <3F53> <46FD> <756D> <46FE> <7572> <46FF> <758D> <4700> <3F7C> <4701> <75C8> <4702> <764D> <4703> <7674> <4704> <3FDC> <4705> <767A> endbfchar 100 beginbfchar <4706> <7188> <4707> <5623> <4708> <8980> <4709> <401D> <470A> <7743> <470B> <4039> <470C> <4045> <470D> <35DB> <470E> <7798> <470F> <406A> <4710> <406F> <4711> <77BE> <4712> <77CB> <4713> <7818> <4714> <781C> <4715> <7847> <4716> <7851> <4717> <7866> <4718> <8448> <4719> <E9CB> <471A> <7933> <471B> <7932> <471C> <4109> <471D> <7991> <471E> <7A06> <471F> <4167> <4720> <41B2> <4721> <7ABC> <4722> <8279> <4723> <41C4> <4724> <7ACF> <4725> <7ADB> <4726> <41CF> <4727> <7B62> <4728> <7B6C> <4729> <7B7B> <472A> <7C12> <472B> <4260> <472C> <427A> <472D> <7C7B> <472E> <7C9C> <472F> <428C> <4730> <7CB8> <4731> <4294> <4732> <8F93> <4733> <70C0> <4734> <E9EF> <4735> <7DCF> <4736> <7DD4> <4737> <7DD0> <4738> <7DFD> <4739> <7FB4> <473A> <729F> <473B> <4397> <473C> <8020> <473D> <8025> <473E> <802E> <473F> <8031> <4740> <8054> <4741> <57B4> <4742> <70A0> <4743> <80B7> <4744> <80E9> <4745> <43ED> <4746> <810C> <4747> <810E> <4748> <8112> <4749> <8114> <474A> <4401> <474B> <3B39> <474C> <8156> <474F> <4413> <4750> <817C> <4751> <4425> <4752> <442D> <4753> <81A5> <4754> <57EF> <4755> <81C1> <4756> <81E4> <4757> <8254> <4758> <448F> <4759> <8276> <475A> <82CA> <475B> <82D8> <475C> <44B0> <475D> <8357> <475E> <9669> <475F> <8405> <4760> <70F5> <4761> <8464> <4762> <8488> <4763> <4504> <4764> <84BE> <4765> <84E1> <4766> <84F8> <4767> <8510> <4768> <8538> <4769> <8552> <476A> <453B> <476D> <85E0> endbfchar 100 beginbfchar <476E> <4577> <476F> <8672> <4770> <8692> <4771> <86EF> <4772> <9645> <4773> <4606> <4774> <4617> <4775> <88AE> <4776> <88FF> <4777> <8924> <4778> <8991> <4779> <EA43> <477A> <8A38> <477B> <8A94> <477C> <8AB4> <477D> <8C51> <477E> <8CD4> <477F> <8CF2> <4780> <8D1C> <4781> <4798> <4782> <8DC3> <4783> <47ED> <4784> <8E3A> <4785> <5754> <4786> <55F5> <4787> <4837> <4788> <8ECE> <4789> <8EE2> <478A> <8EE4> <478B> <8EED> <478C> <8EF2> <478D> <8FC1> <478E> <8FCA> <478F> <8FCC> <4790> <9033> <4791> <48AD> <4792> <98E0> <4793> <9213> <4794> <491E> <4795> <9228> <4796> <9258> <4797> <926B> <4798> <92B1> <4799> <92AE> <479A> <92BF> <479B> <92E3> <479C> <92EB> <479F> <92FD> <47A0> <9343> <47A1> <9384> <47A2> <93AD> <47A3> <4945> <47A4> <4951> <47A5> <9417> <47A6> <941D> <47A7> <942D> <47A8> <943E> <47A9> <496A> <47AA> <9454> <47AB> <9479> <47AC> <952D> <47AD> <95A2> <47AE> <49A7> <47AF> <95F4> <47B0> <9633> <47B1> <49E5> <47B2> <4A24> <47B3> <9740> <47B4> <4A35> <47B5> <97B2> <47B6> <97C2> <47B7> <4AE4> <47B8> <98B9> <47B9> <4B19> <47BA> <98F1> <47BB> <5844> <47BC> <9919> <47BD> <9937> <47BE> <995D> <47BF> <9962> <47C0> <4B70> <47C1> <99C5> <47C2> <4B9D> <47C3> <9A3C> <47C4> <9B0F> <47C5> <9B69> <47C6> <9BDD> <47C7> <9BF1> <47C8> <9BF4> <47C9> <4C6D> <47CA> <9C20> <47CB> <376F> <47CC> <EAA9> <47CD> <9D49> <47CE> <9EFE> <47CF> <5650> <47D0> <9DBD> <47D1> <9DFC> <47D2> <94F6> <47D3> <8FB6> endbfchar 100 beginbfchar <47D4> <9EB1> <47D5> <9EBD> <47D6> <9EC6> <47D7> <94DC> <47D8> <9EE2> <47D9> <9EF1> <47DA> <9EF8> <47DB> <9F44> <47DF> <94C3> <47E0> <EAC5> <47E1> <94C1> <47E6> <5757> <47E7> <7173> <47ED> <549E> <47F3> <EADC> <4800> <EAEE> <4806> <3647> <4807> <EAF8> <480A> <5364> <4812> <70BB> <481D> <7198> <481E> <EB15> <481F> <69E9> <4820> <36C8> <482A> <EB23> <482B> <EB25> <482C> <EB27> <482D> <EB2A> <4840> <58B5> <4841> <EB4A> <4844> <EB53> <484B> <5788> <484C> <EB65> <484D> <EB67> <4851> <EB73> <4852> <5965> <4853> <EB77> <4854> <EB7A> <4855> <573F> <485A> <EB88> <485B> <EB8A> <485F> <EB90> <4860> <EB95> <4864> <57A1> <4865> <7151> <4866> <EB9F> <4867> <EBA2> <486A> <EBAA> <486B> <EBAE> <486C> <EBB0> <486F> <56B9> <4870> <EBBD> <4871> <3618> <4874> <EBC8> <4875> <EBCA> <4876> <EBCE> <4877> <EBD0> <4878> <EBD3> <4879> <EBD5> <487C> <EBDF> <487D> <EBE1> <487E> <EBE4> <4883> <EBEF> <4884> <EBF1> <4885> <949F> <4886> <EBF5> <4887> <36B9> <488A> <56D6> <488B> <EC13> <4890> <EC20> <4891> <EC2B> <4892> <EC2F> <4893> <EC32> <4897> <EC43> <489F> <63E6> <48A0> <EC4F> <48A1> <EC52> <48A2> <EC54> <48A6> <EC5A> <48AB> <3DF7> <48AE> <8FD0> <48AF> <EC67> <48BB> <7E9F> <48BE> <4CA4> <48BF> <9547> <48C0> <EC79> <48C1> <71A2> <48C2> <EC7B> <48C3> <EC7E> <48C4> <4D9C> <48C5> <EC80> <48C6> <8FBE> <48C7> <8FBA> <48C8> <EC84> <48C9> <8FB9> <48CA> <EC86> <48CB> <4EEA> <48CC> <EC8D> <48CD> <8E80> <48CE> <EC91> endbfchar 100 beginbfchar <48D1> <EC96> <48D2> <EC98> <48D5> <4E9A> <48D6> <EC9D> <48D7> <ECA0> <48DC> <ECAB> <48DD> <ECAD> <48DE> <3DC6> <48DF> <ECB4> <48E0> <4E1C> <48E4> <ECDE> <48E5> <55DE> <48E6> <8786> <48E7> <ED04> <48E8> <ED07> <48E9> <5B90> <48EA> <ED0A> <48F1> <ED13> <48F5> <ED1A> <48F6> <ED1C> <48F7> <ED1E> <48F8> <ED22> <48FB> <ED2A> <48FC> <ED2D> <48FD> <4E1A> <48FE> <4E04> <48FF> <5B0D> <4900> <36AC> <4901> <537D> <4902> <36A5> <4903> <589A> <4904> <ED3D> <4905> <57AA> <4908> <ED45> <490D> <ED51> <4912> <ED71> <4913> <ED75> <4914> <57A7> <4915> <ED77> <4916> <ED7A> <4917> <ED81> <4918> <ED86> <491B> <9C1B> <491C> <EDA6> <491D> <3E06> <491E> <EDD1> <491F> <EDD7> <4920> <EDDB> <4921> <EDDD> <4922> <577A> <4923> <54DA> <4924> <717A> <4925> <EE15> <4926> <EE1B> <4927> <EE22> <4928> <EE30> <4929> <EE48> <492A> <EE56> <492B> <EE5B> <492C> <EE60> <492D> <EE7E> <492E> <3635> <492F> <EE9C> <4930> <5220> <4940> <4562> <4941> <5B1F> <4942> <EEB4> <4943> <9F50> <4944> <9EA6> <4945> <EEB7> <4946> <51E2> <4947> <5342> <4948> <66AD> <4949> <585C> <494A> <5553> <494B> <3D85> <494C> <6160> <494D> <48AE> <494E> <97BD> <494F> <E15D> <4950> <60B3> <4951> <8424> <4952> <9814> <4953> <E195> <4954> <E1A4> <4955> <E1BB> <4956> <3B2B> <4957> <3D32> <4958> <E201> <4959> <7081> <495A> <5C9C> <495B> <E2A1> <495C> <3730> <4961> <0100> <4962> <00C1> <4963> <01CD> <4964> <00C0> <4965> <0112> <4966> <00C9> <4967> <011A> endbfchar 52 beginbfchar <4968> <00C8> <4969> <014C> <496A> <00D3> <496B> <01D1> <496C> <00D2> <496D> <F325> <496E> <1EBE> <496F> <F327> <4970> <1EC0> <4971> <00CA> <4972> <0101> <4973> <00E1> <4974> <01CE> <4975> <00E0> <4976> <0251> <4977> <0113> <4978> <00E9> <4979> <011B> <497A> <00E8> <497B> <012B> <497C> <00ED> <497D> <01D0> <497E> <00EC> <497F> <014D> <4980> <00F3> <4981> <01D2> <4982> <00F2> <4983> <016B> <4984> <00FA> <4985> <01D4> <4986> <00F9> <4987> <01D6> <4988> <01D8> <4989> <01DA> <498A> <01DC> <498B> <00FC> <498C> <F344> <498D> <1EBF> <498E> <F346> <498F> <1EC1> <4990> <00EA> <4991> <0261> <4992> <0283> <4993> <0250> <4994> <025B> <4995> <0254> <4996> <0275> <4997> <0153> <4998> <00F8> <4999> <014B> <499A> <028A> <499B> <026A> endbfchar 100 beginbfrange <0001> <005F> <0020> <0065> <0066> <3001> <0070> <0072> <FE50> <0074> <0077> <FE54> <0080> <0081> <FF08> <0082> <0083> <FE35> <0086> <0087> <FE37> <0088> <0089> <3014> <008A> <008B> <FE39> <008C> <008D> <3010> <008E> <008F> <FE3B> <0090> <0091> <300A> <0092> <0093> <FE3D> <0094> <0095> <3008> <0096> <0097> <FE3F> <0098> <0099> <300C> <009A> <009B> <FE41> <009C> <009D> <300E> <009E> <009F> <FE43> <00A0> <00A5> <FE59> <00A6> <00A7> <2018> <00A8> <00A9> <201C> <00AA> <00AB> <301D> <00C7> <00C8> <FE49> <00C9> <00CA> <FE4D> <00CB> <00CC> <FE4B> <00CD> <00CF> <FE5F> <00D9> <00DA> <2266> <00DF> <00E3> <FE62> <00E5> <00E6> <2229> <00F9> <00FA> <2196> <0106> <0107> <00A2> <010C> <010E> <FE69> <0110> <0112> <339C> <0115> <0116> <338E> <0122> <0129> <2581> <013E> <013F> <256D> <0146> <0147> <25E2> <014A> <014C> <2571> <014D> <0156> <FF10> <0157> <0160> <2160> <0161> <0169> <3021> <016B> <016C> <5344> <016D> <0186> <FF21> <0187> <01A0> <FF41> <01A1> <01B1> <0391> <01B2> <01B8> <03A3> <01B9> <01C9> <03B1> <01CA> <01D0> <03C3> <01D1> <01F5> <3105> <01FA> <01FF> <2460> <0200> <0203> <2466> <0204> <020D> <2474> <020E> <0217> <2170> <0232> <0251> <2400> <0260> <0261> <5200> <027F> <0280> <5B50> <0289> <028B> <5DF1> <02A3> <02A4> <4EC6> <02A6> <02A7> <4ECA> <02AC> <02AD> <516D> <02B1> <02B3> <5206> <02B5> <02B6> <52FE> <02CE> <02CF> <5F14> <02FA> <02FD> <4ED4> <02FE> <02FF> <4EE3> <0304> <0305> <5189> <0307> <0308> <51F9> <030D> <030E> <5305> <0339> <033A> <5E02> <0342> <0343> <6253> <034A> <034B> <672A> <035C> <035D> <7528> <035E> <0361> <7530> <036E> <036F> <4E1E> <0370> <0371> <4E52> <037D> <037E> <4F10> <0391> <0392> <5211> <0399> <039A> <5370> <03B4> <03B5> <5919> <03B6> <03B7> <5937> <03BF> <03C0> <5B57> <03C1> <03C2> <5B87> <03D1> <03D2> <620C> <03DA> <03DB> <65EC> <03DC> <03DD> <66F2> <03EA> <03EB> <6C5F> <03F0> <03F1> <6C4D> <0403> <0404> <808B> <0420> <0421> <4F50> <0437> <0438> <51B6> <043B> <043C> <5229> <043F> <0440> <52A9> <0458> <0459> <5435> <047F> <0480> <5B5A> <0485> <0486> <5C40> <0489> <048A> <5C90> <04BD> <04C0> <674E> <04CF> <04D0> <6C88> <04E7> <04E8> <707C> endbfrange 100 beginbfrange <04F2> <04F3> <7537> <052E> <052F> <4EAB> <055C> <055E> <5377> <0583> <0584> <5947> <05A2> <05A3> <5C45> <05B5> <05B6> <5E95> <05B8> <05B9> <5F26> <05BB> <05BC> <5F80> <05DF> <05E0> <62D3> <05EE> <05EF> <62D6> <060E> <060F> <676F> <061B> <061C> <6B66> <0627> <0628> <6CBD> <0645> <0646> <722C> <0657> <0658> <7599> <0660> <0661> <7940> <06A4> <06A5> <4EAD> <0707> <0708> <5C4E> <071A> <071B> <5F8A> <077B> <077C> <6D3D> <0796> <0797> <72E0> <07A6> <07A7> <75A4> <07A8> <07A9> <75A2> <07AB> <07AD> <7686> <07BD> <07BE> <780C> <07C3> <07C4> <79B9> <07C5> <07C6> <79D1> <07DE> <07DF> <80C3> <0808> <0809> <8A02> <0823> <0825> <964B> <0833> <0834> <500C> <0853> <0854> <51A4> <0879> <087A> <5703> <0881> <0882> <5957> <08D1> <08D2> <632A> <08D6> <08D7> <6548> <08E4> <08E5> <6714> <0903> <0904> <6C27> <0939> <093A> <75B2> <0943> <0944> <76CD> <0946> <0947> <771F> <0998> <0999> <822A> <09BA> <09BB> <8881> <09CC> <09CD> <8CA1> <09EB> <09EC> <9662> <0A1B> <0A1C> <533F> <0A5C> <0A5D> <5C5C> <0A70> <0A71> <5EB7> <0A97> <0A98> <621A> <0AC5> <0AC6> <65CB> <0AE9> <0AEA> <6BEB> <0B13> <0B14> <7109> <0B27> <0B28> <74F6> <0B2B> <0B2C> <7565> <0B30> <0B31> <75D4> <0B84> <0B85> <837B> <0BD7> <0BD8> <9676> <0BDF> <0BE0> <9802> <0BF3> <0BF4> <5274> <0C1B> <0C1C> <5830> <0C20> <0C21> <58F9> <0C2F> <0C30> <5C0A> <0C3D> <0C3E> <5EC1> <0C42> <0C43> <5FA9> <0C67> <0C68> <63ED> <0C72> <0C73> <6562> <0C80> <0C81> <66FE> <0CA2> <0CA3> <6C2E> <0CC8> <0CC9> <7119> <0CDC> <0CDD> <7435> <0CE3> <0CE4> <7525> <0CEE> <0CEF> <767B> <0D1C> <0D1D> <7FD4> <0D52> <0D53> <88C1> <0D8F> <0D90> <9214> <0DA3> <0DA4> <9685> <0DAB> <0DAC> <96C6> <0DB0> <0DB1> <9805> <0DC1> <0DC2> <50B2> <0DD0> <0DD1> <52E2> <0DDB> <0DDC> <55E3> <0DE0> <0DE1> <55C5> <0DE4> <0DE5> <5712> <0E1A> <0E1B> <6221> <0E28> <0E29> <6416> <0E30> <0E31> <6687> <0E83> <0E84> <745B> <0E90> <0E91> <76DE> <0EA1> <0EA2> <7897> <0EB4> <0EB5> <7A9F> <0EC5> <0EC6> <7F69> <0ED6> <0ED7> <8179> <0EF6> <0EF7> <8702> <0F08> <0F09> <8A72> <0F1F> <0F20> <8CC7> <0F5E> <0F5F> <9694> <0F62> <0F63> <96C9> <0F6B> <0F6C> <9810> <0F73> <0F74> <98FD> <0F98> <0F99> <560D> endbfrange 100 beginbfrange <0FBB> <0FBC> <5BE5> <0FD4> <0FD5> <6162> <1044> <1045> <798E> <1059> <105A> <7CBD> <105E> <105F> <7DBD> <106F> <1070> <7FE0> <10B8> <10B9> <8CD1> <10E0> <10E1> <95A8> <10EE> <10EF> <9817> <10F7> <10F8> <9AAF> <10FA> <10FB> <9B41> <1108> <1109> <5108> <110C> <110E> <5287> <111F> <1120> <562F> <1134> <1135> <5C64> <116F> <1170> <6577> <1187> <1188> <6BC5> <11B1> <11B2> <7621> <11CF> <11D0> <7BC6> <11EA> <11EC> <819B> <11F4> <11F5> <852C> <120E> <120F> <8912> <122A> <122B> <8CEC> <122C> <122D> <8CE2> <1263> <1264> <9706> <127B> <127C> <9AEE> <12BB> <12BC> <64BB> <12F7> <12F8> <71C3> <1300> <1301> <750C> <1308> <1309> <779E> <1310> <1311> <7A4D> <131E> <131F> <7CD5> <132B> <132C> <7FF0> <1334> <1335> <8258> <1339> <133A> <8568> <1356> <1357> <8B01> <1386> <1387> <96A7> <1390> <1391> <975B> <13E1> <13E2> <6582> <13F6> <13F7> <6FDF> <1449> <144A> <8071> <1495> <1496> <9081> <14AA> <14AC> <95CA> <14C4> <14C5> <9EDC> <14D6> <14D7> <64FA> <14E2> <14E3> <6AAE> <14EE> <14EF> <71FB> <14FC> <14FD> <77BB> <1500> <1501> <7A61> <1503> <1504> <7AC4> <150C> <150D> <7E54> <153C> <153D> <91AB> <155E> <155F> <993E> <1578> <1579> <58DE> <15A3> <15A4> <7C3E> <15AC> <15AD> <7E69> <15B8> <15B9> <85E4> <15C9> <15CA> <8B4E> <15D9> <15DA> <908A> <15E2> <15E3> <93DC> <162D> <162E> <7CEF> <163F> <1640> <8814> <1668> <1669> <5137> <16A1> <16A2> <9738> <16B9> <16BA> <9F66> <16D9> <16DA> <8D16> <16E0> <16E1> <9451> <16E2> <16E3> <973D> <1713> <1714> <9A5A> <1716> <1717> <9AD3> <1723> <1724> <7671> <173B> <173C> <9DF9> <173D> <173E> <9E7C> <175D> <175E> <947D> <1760> <1761> <9C77> <179A> <179B> <5722> <17E0> <17E1> <5C7A> <1808> <1809> <6C4B> <180C> <180D> <72B4> <181B> <181C> <9097> <1838> <1839> <52AD> <183D> <183E> <538E> <1890> <1891> <628E> <18AE> <18AF> <6C19> <18CF> <18D0> <7393> <18D4> <18D5> <7594> <18E5> <18E6> <8283> <1914> <1915> <5232> <1919> <191A> <530A> <193F> <1940> <5773> <1973> <1975> <5F22> <19C6> <19C7> <6778> <1A0F> <1A10> <753F> <1A46> <1A47> <866D> <1A82> <1A83> <54C5> <1A8D> <1A8E> <579E> <1AC1> <1AC2> <5CD3> <1ACA> <1ACC> <5E21> <1AEC> <1AED> <6242> <1AFB> <1AFC> <6313> endbfrange 100 beginbfrange <1B13> <1B14> <670F> <1B38> <1B39> <67C9> <1B44> <1B45> <6C20> <1B6B> <1B6C> <70B4> <1B6F> <1B70> <7249> <1B91> <1B92> <7547> <1B98> <1B9A> <7703> <1B9F> <1BA0> <77E7> <1BA2> <1BA3> <7811> <1BB8> <1BB9> <7B00> <1BBB> <1BBC> <7C78> <1BBD> <1BBF> <7C7F> <1BC8> <1BC9> <800E> <1C28> <1C29> <4FF6> <1C36> <1C37> <51C4> <1C3D> <1C3E> <525E> <1C55> <1C56> <54F7> <1C5B> <1C5C> <5701> <1C70> <1C71> <5A2D> <1CA6> <1CA7> <6344> <1CC1> <1CC2> <65C3> <1CC8> <1CC9> <6712> <1CCD> <1CCE> <6832> <1CF6> <1CF7> <6D63> <1D27> <1D29> <70C5> <1D47> <1D48> <73D7> <1D4A> <1D4B> <74DE> <1D4C> <1D4D> <74F4> <1D63> <1D64> <7719> <1D7B> <1D7C> <79EB> <1D87> <1D88> <7A8B> <1DFA> <1DFB> <8843> <1DFD> <1DFE> <8875> <1E1F> <1E20> <90D9> <1E2A> <1E2B> <914E> <1E4A> <1E4B> <5063> <1E5B> <1E5C> <5575> <1ED1> <1ED2> <5EB2> <1EDE> <1EDF> <60D3> <1F19> <1F1A> <686D> <1F3D> <1F3E> <6B37> <1F41> <1F42> <6B8D> <1F57> <1F58> <6DDC> <1F81> <1F82> <727B> <1FA3> <1FA4> <75CB> <1FAD> <1FAE> <7731> <1FC0> <1FC1> <7969> <1FC8> <1FC9> <79F6> <1FEE> <1FEF> <7D3E> <1FF5> <1FF6> <7F9C> <1FF8> <1FF9> <7FCA> <1FFB> <1FFC> <7FD0> <204A> <204B> <86BB> <204D> <204E> <86BD> <206D> <206E> <8C5C> <207E> <207F> <8EE0> <208A> <208B> <90F2> <208D> <208E> <90EB> <209C> <209D> <91EA> <2174> <2175> <659D> <21A7> <21A8> <68DD> <21BC> <21BD> <6BF2> <21C0> <21C1> <6E46> <21C5> <21C6> <6E3C> <21EC> <21ED> <6E35> <222F> <2230> <7746> <2236> <2237> <774B> <223B> <223C> <7864> <2271> <2272> <7F3E> <2273> <2274> <7F65> <2276> <2277> <7FA0> <227A> <227B> <804F> <2288> <228A> <81F7> <228C> <228D> <823C> <22E7> <22E8> <89DA> <22EE> <22EF> <8A57> <22F0> <22F1> <8A44> <2317> <2318> <8EE7> <2350> <2351> <9688> <2361> <2362> <4E83> <2378> <2379> <527B> <23B8> <23B9> <5BD8> <23D5> <23D6> <6149> <23F5> <23F6> <6422> <2424> <2425> <6948> <2449> <244A> <6BFB> <244C> <244D> <6BF7> <2454> <2455> <6E93> <249B> <249C> <744A> <24A1> <24A2> <744F> <24C2> <24C3> <775F> <24D3> <24D4> <7885> <24E1> <24E2> <7A18> <2511> <2512> <7F67> <2517> <2518> <7FDB> <2579> <257A> <88CD> <259E> <259F> <8C84> <25A1> <25A2> <8D68> <25A5> <25A6> <8D8E> <25A8> <25A9> <8D93> endbfrange 100 beginbfrange <25BE> <25BF> <8F07> <25CF> <25D0> <916E> <25F4> <25F5> <9692> <25FE> <25FF> <9777> <2602> <2603> <980D> <2623> <2624> <5280> <2672> <2673> <5E58> <2688> <2689> <6152> <269F> <26A0> <6472> <26E5> <26E7> <6B9E> <26E8> <26E9> <6BC3> <26F6> <26F7> <6F19> <2733> <2734> <7502> <2756> <2757> <798A> <2767> <2768> <7AAB> <278A> <278B> <7DCB> <2797> <2798> <7FE2> <27E8> <27E9> <8726> <27F1> <27F2> <88F1> <280A> <280B> <8C68> <281D> <281E> <8F10> <2863> <2864> <98AD> <2874> <2875> <9B3E> <2876> <2877> <9B60> <2879> <287A> <9CF1> <2881> <2882> <5106> <2885> <2886> <510B> <2889> <288A> <528B> <28F5> <28F6> <65B2> <296A> <296C> <735E> <2974> <2975> <7489> <2989> <298B> <769C> <2999> <299A> <78C3> <2A03> <2A04> <84E7> <2A10> <2A11> <8763> <2A34> <2A36> <8917> <2A47> <2A48> <8AD4> <2A6B> <2A6C> <8E26> <2A7A> <2A7B> <8F16> <2A83> <2A84> <9129> <2A88> <2A89> <9185> <2A8B> <2A8C> <9181> <2A90> <2A91> <92C3> <2ACF> <2AD0> <9916> <2AD5> <2AD6> <99D3> <2AFE> <2AFF> <9F0F> <2B36> <2B37> <5E67> <2B60> <2B61> <66CA> <2B85> <2B86> <6A4D> <2B8C> <2B8D> <6BAA> <2BB5> <2BB6> <71C0> <2BC0> <2BC1> <71DA> <2BC2> <2BC3> <729D> <2BC5> <2BC6> <7366> <2BE4> <2BE5> <77A2> <2BF0> <2BF1> <78E1> <2BF3> <2BF4> <78DF> <2C11> <2C12> <7CD0> <2C17> <2C18> <7E1F> <2C27> <2C28> <7F7B> <2C3C> <2C3E> <8255> <2C6F> <2C70> <8790> <2C7A> <2C7B> <892D> <2C88> <2C89> <8AF4> <2C96> <2C97> <8C91> <2CA8> <2CA9> <8E3C> <2CBB> <2CBC> <9135> <2CBE> <2CBF> <9190> <2CEC> <2CED> <95B9> <2D31> <2D32> <9E86> <2D35> <2D36> <9ED5> <2D42> <2D43> <568C> <2D59> <2D5A> <5BF1> <2DA3> <2DA4> <736E> <2DAE> <2DB0> <7510> <2DB4> <2DB5> <7648> <2DC5> <2DC6> <78FB> <2DD6> <2DD7> <7AC0> <2DE9> <2DEA> <7BF0> <2E59> <2E5A> <89F2> <2E93> <2E94> <9350> <2EC5> <2EC6> <992B> <2ED9> <2EDA> <99FD> <2EF3> <2EF4> <9D2E> <2EF9> <2EFA> <9D42> <2F0F> <2F10> <512D> <2F19> <2F1A> <5C69> <2F1C> <2F1D> <5E6D> <2F20> <2F21> <61ED> <2F31> <2F32> <66DA> <2F3A> <2F3B> <6AB6> <2F43> <2F44> <700C> <2F49> <2F4A> <6FFF> <2F6D> <2F6E> <7913> <2F8F> <2F90> <7FF7> <2F92> <2F93> <81D1> <2FC9> <2FCA> <8950> <2FF7> <2FF9> <8F46> <2FFC> <2FFD> <913A> <301D> <301E> <95D2> endbfrange 100 beginbfrange <3037> <3039> <9850> <304B> <304C> <9B04> <307A> <307B> <5134> <3081> <3082> <56A6> <3089> <308B> <5B3D> <30AF> <30B1> <7021> <30BB> <30BC> <72A5> <30C6> <30C7> <77C9> <30D1> <30D2> <7A67> <30E9> <30EA> <7FFD> <310A> <310B> <87F6> <3116> <3117> <895A> <3133> <3134> <8D06> <3143> <3144> <8F4F> <3163> <3164> <95DA> <3167> <3168> <972B> <316E> <3170> <97DD> <317C> <317D> <99A6> <3191> <3192> <9BEA> <31AB> <31AC> <9D8B> <31AF> <31B0> <9D74> <31C1> <31C2> <9F40> <31C4> <31C6> <9F56> <31CD> <31CE> <5DC6> <31CF> <31D0> <5EEE> <31D1> <31D2> <5FC0> <31DA> <31DB> <66E3> <31E2> <31E3> <6AEE> <31F4> <31F5> <7213> <3205> <3206> <7927> <320B> <320C> <7A6C> <321D> <321E> <8268> <322C> <322D> <8810> <3242> <3243> <8F56> <324C> <324D> <91B2> <326F> <3270> <972E> <3273> <3274> <97FD> <3276> <3277> <9862> <3279> <327A> <98C1> <32B4> <32B5> <9DA6> <32CA> <32CB> <56BD> <32D8> <32D9> <7043> <32DB> <32DC> <7048> <32DD> <32DE> <7045> <32ED> <32EE> <7E87> <3314> <3315> <8B7A> <331F> <3320> <9144> <3345> <3346> <9B17> <334F> <3350> <9C28> <3360> <3361> <9DB9> <337C> <337D> <5B4B> <3386> <3387> <6B08> <3389> <338B> <7055> <338D> <338E> <721E> <3399> <339A> <7A70> <33A7> <33A8> <8634> <33C2> <33C3> <8E96> <33C9> <33CA> <944A> <33CE> <33CF> <9448> <33D9> <33DA> <9A53> <3418> <3419> <6203> <341E> <341F> <6B11> <344C> <344D> <97C4> <3451> <3453> <9B1E> <3473> <3474> <9EF2> <347E> <347F> <9F6E> <3485> <3486> <66ED> <349C> <349D> <8B94> <349E> <34A0> <8E9E> <34A6> <34A7> <9468> <34BD> <34BE> <9E00> <34C6> <34C8> <9F74> <34CC> <34CD> <6B18> <34D3> <34D4> <77D8> <34DD> <34DE> <81E0> <34DF> <34E1> <8646> <34E2> <34E3> <8979> <34E7> <34E8> <8B98> <3527> <3528> <9873> <352D> <352E> <9A66> <3539> <353A> <9480> <3547> <3548> <7069> <3550> <35AE> <0020> <35B5> <35B6> <30FD> <35B7> <35B8> <309D> <35BA> <35BC> <3005> <35C1> <35FF> <3041> <3600> <3613> <3080> <3614> <3669> <30A1> <366A> <366F> <0410> <3671> <3690> <0416> <3692> <36AB> <0436> <36AD> <36AE> <21B8> <36B4> <36B5> <F7EA> <36B7> <36B8> <F7ED> <3734> <3735> <E31B> <373B> <373C> <7AC2> <3749> <374A> <E330> <374E> <374F> <E335> <3770> <3771> <E35B> endbfrange 100 beginbfrange <3779> <377A> <E364> <3780> <3781> <7F40> <3789> <378A> <E374> <3795> <3796> <E381> <3797> <3798> <803B> <379C> <379E> <E388> <37AD> <37AE> <E39A> <37B1> <37B2> <E39F> <37B8> <37BB> <E3A6> <37C3> <37C4> <E3B1> <37C6> <37C7> <E3B4> <37CB> <37CF> <E3B9> <37E7> <37E9> <E3D8> <37FC> <37FD> <E3ED> <3801> <3803> <E3F2> <3816> <3817> <8845> <3818> <381A> <E409> <381E> <381F> <88B4> <382A> <382B> <E41D> <3838> <3839> <E42C> <3846> <3848> <E43A> <384C> <384D> <E440> <3857> <3859> <E44C> <385B> <385C> <E450> <3864> <3865> <E459> <3868> <3869> <E45D> <386C> <386E> <E461> <3877> <3878> <E46E> <387A> <387B> <E471> <3886> <3887> <E47E> <388D> <3891> <E486> <3894> <3895> <E48D> <3897> <3898> <E491> <389B> <389D> <E495> <38A7> <38A9> <E4A2> <38B8> <38BF> <E4B3> <38D2> <38D3> <E4CD> <38E1> <38E2> <E4DC> <38EB> <38ED> <E4E6> <38F3> <38F4> <E4EE> <38FD> <38FE> <E4F8> <3906> <3907> <E501> <391F> <3924> <E51C> <392A> <392D> <E529> <392F> <3930> <E52E> <3955> <3956> <E554> <3958> <395A> <E557> <395C> <395D> <E55B> <395F> <3960> <E55E> <3967> <3968> <E566> <396E> <396F> <E56D> <3973> <3974> <E572> <3976> <3978> <E575> <397A> <397B> <E579> <397D> <397F> <E57C> <3983> <3987> <E582> <398C> <3991> <E58B> <3993> <3995> <E592> <399E> <39A2> <E59D> <39A7> <39A9> <E5A6> <39B8> <39B9> <E5B7> <39BB> <39BC> <E5BA> <39BF> <39C1> <E5BE> <39C9> <39CA> <E5C8> <39D4> <39D6> <E5D7> <39D8> <39D9> <E5DB> <39DE> <39E0> <E5E1> <39E2> <39E3> <E5E5> <39EB> <39EE> <E5EE> <39F8> <39F9> <E5FB> <3A0B> <3A0E> <E60F> <3A14> <3A17> <E619> <3A1E> <3A1F> <E623> <3A2D> <3A2F> <E632> <3A32> <3A33> <E637> <3A3A> <3A3D> <E63F> <3A40> <3A41> <E645> <3A48> <3A49> <E64E> <3A4C> <3A4F> <E652> <3A51> <3A53> <E657> <3A57> <3A5A> <E65D> <3A5C> <3A5D> <E662> <3A5F> <3A62> <E665> <3A67> <3A68> <E66E> <3A6F> <3A72> <E676> <3A74> <3A76> <E67B> <3A78> <3A79> <E67F> <3A7B> <3A80> <E683> <3A82> <3A84> <E68A> <3A86> <3A88> <E68E> <3A8E> <3A8F> <E696> <3A91> <3A92> <E699> <3A96> <3A97> <E69E> <3A99> <3A9A> <E6A1> <3AA2> <3AA3> <E6AC> <3AAF> <3AB0> <E6B9> <3AB3> <3AB4> <E6BD> <3AB6> <3AB7> <E6C0> <3AC6> <3AC7> <E6D1> <3ACC> <3ACD> <E6D7> endbfrange 100 beginbfrange <3ACF> <3AD0> <E6DA> <3AD2> <3AD6> <E6DD> <3AD9> <3ADB> <E6E4> <3AE7> <3AE8> <E6F2> <3AEF> <3AF1> <E6FA> <3AF6> <3AF7> <E701> <3AFB> <3AFC> <E706> <3AFE> <3AFF> <E709> <3B02> <3B03> <770E> <3B05> <3B06> <E710> <3B0C> <3B0D> <E717> <3B0F> <3B10> <E71A> <3B19> <3B1A> <E724> <3B28> <3B2C> <E733> <3B31> <3B32> <E73C> <3B35> <3B37> <E740> <3B42> <3B44> <E74D> <3B46> <3B47> <E751> <3B50> <3B52> <E75B> <3B56> <3B57> <E761> <3B59> <3B5A> <E764> <3B5C> <3B5D> <E767> <3B60> <3B62> <E76C> <3B6A> <3B6B> <E777> <3B6F> <3B70> <E77C> <3B89> <3B8A> <E796> <3B97> <3B9C> <E7A4> <3BCE> <3BCF> <E7DC> <3BD9> <3BDB> <E7E7> <3BDF> <3BE1> <E7ED> <3BE3> <3BE5> <E7F1> <3BED> <3BEE> <E7FB> <3BF1> <3BF4> <E7FF> <3C00> <3C01> <E80E> <3C08> <3C0A> <E816> <3C19> <3C1A> <E827> <3C29> <3C2A> <E837> <3C2C> <3C2D> <E83A> <3C33> <3C34> <E841> <3C3F> <3C40> <E84D> <3C47> <3C4A> <E855> <3C4D> <3C4F> <E85B> <3C52> <3C54> <E860> <3C57> <3C59> <E865> <3C5B> <3C5C> <E869> <3C6E> <3C70> <E87D> <3C82> <3C83> <E891> <3C85> <3C86> <E894> <3C91> <3C92> <E8A0> <3C94> <3C98> <E8A3> <3C9A> <3C9B> <E8A9> <3C9D> <3CA1> <E8AC> <3CA6> <3CA7> <E8B5> <3CAE> <3CB4> <E8BD> <3CBE> <3CBF> <E8CD> <3CC1> <3CC2> <E8D0> <3CC6> <3CC7> <E8D5> <3CC9> <3CCB> <E8D8> <3CD0> <3CD2> <E8DF> <3CD6> <3CD7> <E8E5> <3CD9> <3CDB> <E8E8> <3CE2> <3CE3> <E8F1> <3CF8> <3CF9> <E907> <3D08> <3D09> <E917> <3D0F> <3D13> <E91E> <3D16> <3D1D> <E925> <3D1F> <3D20> <E92E> <3D24> <3D27> <E933> <3D2D> <3D2F> <E93C> <3D35> <3D36> <E944> <3D43> <3D46> <E952> <3D48> <3D49> <E957> <3D4D> <3D4F> <E95C> <3D51> <3D52> <E960> <3D6B> <3D6C> <8FBB> <3DA3> <3DA4> <EB4B> <3DA5> <3DA6> <EB4F> <3DAB> <3DAC> <EB5A> <3DB4> <3DB5> <EB68> <3DC1> <3DC2> <EB80> <3DEE> <3DEF> <EBCC> <3DF4> <3DF5> <EBD7> <3E09> <3E0B> <EBF9> <3E0D> <3E0E> <EBFD> <3E14> <3E15> <EC05> <3E1A> <3E1C> <EC0E> <3E22> <3E23> <EC17> <3E31> <3E33> <EC2C> <3E3E> <3E3F> <EC3B> <3E8C> <3E8D> <ECDB> <3E8F> <3E91> <ECDF> <3EC2> <3EC3> <ED24> <3F04> <3F05> <ED84> <400D> <400E> <E002> <4014> <4015> <E009> <401D> <4021> <E012> <4025> <4029> <E01A> <402D> <402E> <E022> <4038> <4039> <E02D> <403D> <4043> <E032> endbfrange 100 beginbfrange <4046> <4047> <E03B> <406A> <406C> <E05F> <407F> <4080> <E074> <4094> <4095> <E089> <409E> <409F> <E093> <40A4> <40A5> <E099> <40A7> <40A9> <E09C> <40B1> <40B2> <E0A6> <40D2> <40D3> <E0C7> <40DF> <40E0> <E0D4> <40ED> <40F0> <E0E2> <40F2> <40F4> <E0E7> <40F6> <40F7> <E0EB> <4103> <4104> <E0F8> <4112> <4114> <E109> <411D> <411E> <E114> <4125> <4126> <E11C> <412F> <4131> <E126> <4139> <413A> <E130> <414A> <414B> <E141> <414F> <4150> <E147> <415A> <415D> <E154> <415F> <4160> <E159> <416D> <416F> <E168> <4175> <4176> <E171> <417C> <417D> <E178> <417F> <4180> <E17B> <4183> <4184> <E17F> <4193> <4194> <E18F> <41A1> <41A2> <E19F> <41B2> <41B3> <E1B0> <41B5> <41B6> <E1B3> <41BD> <41C0> <E1BC> <41C5> <41C6> <E1C4> <41CC> <41CD> <E1CC> <41D4> <41D5> <E1D4> <41EE> <41EF> <E1EF> <4209> <420B> <E20A> <4211> <4215> <E212> <421A> <421B> <E21B> <421E> <4220> <E21F> <4225> <4227> <E226> <423C> <423D> <E23D> <4249> <424E> <E24A> <4250> <4253> <E251> <4259> <425A> <70D5> <426B> <426D> <E26D> <4286> <4287> <E288> <428E> <428F> <E290> <4292> <4294> <E294> <4297> <4299> <E299> <42AE> <42B1> <E2B2> <42B3> <42B4> <E2B7> <42B9> <42BA> <E2BE> <42D3> <42D4> <E2D8> <42DB> <42DD> <E2E0> <42E6> <42E8> <E2EB> <430B> <430D> <F440> <4313> <4314> <F448> <431B> <431D> <F450> <431F> <4321> <F454> <4327> <432A> <F45C> <432C> <432E> <F461> <4330> <4331> <F465> <4337> <4338> <F46C> <4347> <4349> <F47C> <434B> <434C> <F480> <434F> <4350> <F484> <4358> <435B> <F48D> <4362> <4363> <F497> <436F> <4371> <F4A4> <4374> <4375> <F4A9> <437A> <437B> <F4AF> <437E> <437F> <F4B3> <4385> <438B> <F4BA> <438C> <438D> <F4DB> <4392> <4394> <F4E7> <4400> <445E> <0020> <4462> <44C0> <0020> <44C6> <44C7> <309B> <44C9> <44DE> <F303> <44E1> <44E2> <F53A> <451D> <451F> <2E86> <4521> <4522> <2E8C> <452E> <452F> <2ECC> <4531> <4532> <2ED6> <4534> <4535> <F3A0> <454F> <4550> <5B9E> <4569> <456A> <8F66> <457C> <457D> <F3F9> <4589> <458C> <F408> <45C5> <45C7> <F4C3> <45C9> <45CC> <F4C7> <45CE> <45D1> <F4CC> <45D2> <45D6> <F4D1> <45DA> <45DB> <F4D9> <45DC> <45DD> <F4DD> <45F0> <45F3> <F4FE> <45F8> <45FF> <F507> <4600> <4602> <F50F> endbfrange 79 beginbfrange <4604> <4607> <F513> <4609> <460E> <F518> <4610> <4617> <F51F> <4624> <4625> <F533> <4681> <4682> <6EE8> <46AF> <46B1> <E467> <46D5> <46D6> <E96E> <46DD> <46DE> <E977> <46E0> <46E1> <E97A> <46E6> <46E7> <E981> <46F4> <46F5> <741E> <474D> <474E> <8159> <476B> <476C> <856F> <479D> <479E> <92F3> <47DC> <47DE> <EABF> <47E2> <47E5> <EAC9> <47E8> <47EA> <EACF> <47EB> <47EC> <EAD3> <47EE> <47F2> <EAD6> <47F4> <47F9> <EADE> <47FA> <47FF> <EAE7> <4801> <4803> <EAF0> <4804> <4805> <EAF5> <4808> <4809> <EAFA> <480B> <480D> <EAFE> <480E> <4811> <EB02> <4813> <481A> <EB08> <481B> <481C> <EB11> <4821> <4826> <EB18> <4827> <4829> <EB1F> <482E> <483B> <EB2C> <483C> <483D> <EB3E> <483E> <483F> <EB43> <4842> <4843> <EB4D> <4845> <4846> <EB55> <4847> <4848> <EB58> <4849> <484A> <EB62> <484E> <4850> <EB6F> <4856> <4857> <EB7E> <4858> <4859> <EB83> <485C> <485E> <EB8C> <4861> <4863> <EB98> <4868> <4869> <EBA5> <486D> <486E> <EBB2> <4872> <4873> <EBC5> <487A> <487B> <EBDA> <487F> <4880> <EBE8> <4881> <4882> <EBEB> <4888> <4889> <EC08> <488C> <488F> <EC19> <4894> <4896> <EC3F> <4898> <489C> <EC45> <489D> <489E> <EC4B> <48A3> <48A5> <EC56> <48A7> <48A8> <EC5C> <48A9> <48AA> <EC5F> <48AC> <48AD> <EC62> <48B0> <48BA> <EC69> <48BC> <48BD> <EC75> <48CF> <48D0> <EC93> <48D3> <48D4> <EC9A> <48D8> <48D9> <ECA3> <48DA> <48DB> <ECA7> <48E1> <48E3> <ECB9> <48EB> <48F0> <ED0C> <48F2> <48F4> <ED15> <48F9> <48FA> <ED26> <4906> <4907> <ED41> <4909> <490A> <ED4A> <490B> <490C> <ED4D> <490E> <490F> <ED53> <4910> <4911> <ED57> <4919> <491A> <ED89> <4931> <4936> <EEA1> <4937> <4939> <EEA8> <493A> <493F> <EEAC> <495D> <495E> <E2F0> <495F> <4960> <E2FF> <499C> <499D> <F34A> endbfrange endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF \ No newline at end of file
diff --git a/src/main/resources/Resources/cmap/Adobe-GB1-4 b/src/main/resources/Resources/cmap/Adobe-GB1-4
new file mode 100644
index 0000000..b761ba7
--- /dev/null
+++ b/src/main/resources/Resources/cmap/Adobe-GB1-4
@@ -0,0 +1 @@
+%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%IncludeResource: ProcSet (CIDInit) %%BeginResource: CMap (Identity) %%Title: (Identity Adobe GB1 4) %%Version: 1.001 %%Copyright: ----------------------------------------------------------- %%Copyright: Copyright 1990-2000 Adobe Systems Incorporated. %%Copyright: All Rights Reserved. %%Copyright: %%Copyright: Patents Pending %%Copyright: %%Copyright: NOTICE: All information contained herein is the property %%Copyright: of Adobe Systems Incorporated. %%Copyright: %%Copyright: Permission is granted for redistribution of this file %%Copyright: provided this copyright notice is maintained intact and %%Copyright: that the contents of this file are not altered in any %%Copyright: way from its original form. %%Copyright: %%Copyright: PostScript and Display PostScript are trademarks of %%Copyright: Adobe Systems Incorporated which may be registered in %%Copyright: certain jurisdictions. %%Copyright: ----------------------------------------------------------- %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo 3 dict dup begin /Registry (Adobe) def /Ordering (GB1) def /Supplement 4 def end def /CMapName /Adobe-GB1-4 def /CMapVersion 1.001 def /CMapType 1 def /XUID [1 10 25458] def /WMode 0 def /CIDCount 29064 def 1 begincodespacerange <0000> <71FF> endcodespacerange 100 begincidrange <0000> <00ff> 0 <0100> <01ff> 256 <0200> <02ff> 512 <0300> <03ff> 768 <0400> <04ff> 1024 <0500> <05ff> 1280 <0600> <06ff> 1536 <0700> <07ff> 1792 <0800> <08ff> 2048 <0900> <09ff> 2304 <0a00> <0aff> 2560 <0b00> <0bff> 2816 <0c00> <0cff> 3072 <0d00> <0dff> 3328 <0e00> <0eff> 3584 <0f00> <0fff> 3840 <1000> <10ff> 4096 <1100> <11ff> 4352 <1200> <12ff> 4608 <1300> <13ff> 4864 <1400> <14ff> 5120 <1500> <15ff> 5376 <1600> <16ff> 5632 <1700> <17ff> 5888 <1800> <18ff> 6144 <1900> <19ff> 6400 <1a00> <1aff> 6656 <1b00> <1bff> 6912 <1c00> <1cff> 7168 <1d00> <1dff> 7424 <1e00> <1eff> 7680 <1f00> <1fff> 7936 <2000> <20ff> 8192 <2100> <21ff> 8448 <2200> <22ff> 8704 <2300> <23ff> 8960 <2400> <24ff> 9216 <2500> <25ff> 9472 <2600> <26ff> 9728 <2700> <27ff> 9984 <2800> <28ff> 10240 <2900> <29ff> 10496 <2a00> <2aff> 10752 <2b00> <2bff> 11008 <2c00> <2cff> 11264 <2d00> <2dff> 11520 <2e00> <2eff> 11776 <2f00> <2fff> 12032 <3000> <30ff> 12288 <3100> <31ff> 12544 <3200> <32ff> 12800 <3300> <33ff> 13056 <3400> <34ff> 13312 <3500> <35ff> 13568 <3600> <36ff> 13824 <3700> <37ff> 14080 <3800> <38ff> 14336 <3900> <39ff> 14592 <3a00> <3aff> 14848 <3b00> <3bff> 15104 <3c00> <3cff> 15360 <3d00> <3dff> 15616 <3e00> <3eff> 15872 <3f00> <3fff> 16128 <4000> <40ff> 16384 <4100> <41ff> 16640 <4200> <42ff> 16896 <4300> <43ff> 17152 <4400> <44ff> 17408 <4500> <45ff> 17664 <4600> <46ff> 17920 <4700> <47ff> 18176 <4800> <48ff> 18432 <4900> <49ff> 18688 <4a00> <4aff> 18944 <4b00> <4bff> 19200 <4c00> <4cff> 19456 <4d00> <4dff> 19712 <4e00> <4eff> 19968 <4f00> <4fff> 20224 <5000> <50ff> 20480 <5100> <51ff> 20736 <5200> <52ff> 20992 <5300> <53ff> 21248 <5400> <54ff> 21504 <5500> <55ff> 21760 <5600> <56ff> 22016 <5700> <57ff> 22272 <5800> <58ff> 22528 <5900> <59ff> 22784 <5a00> <5aff> 23040 <5b00> <5bff> 23296 <5c00> <5cff> 23552 <5d00> <5dff> 23808 <5e00> <5eff> 24064 <5f00> <5fff> 24320 <6000> <60ff> 24576 <6100> <61ff> 24832 <6200> <62ff> 25088 <6300> <63ff> 25344 endcidrange 14 begincidrange <6400> <64ff> 25600 <6500> <65ff> 25856 <6600> <66ff> 26112 <6700> <67ff> 26368 <6800> <68ff> 26624 <6900> <69ff> 26880 <6a00> <6aff> 27136 <6b00> <6bff> 27392 <6c00> <6cff> 27648 <6d00> <6dff> 27904 <6e00> <6eff> 28160 <6f00> <6fff> 28416 <7000> <70ff> 28672 <7100> <7187> 28928 endcidrange endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF \ No newline at end of file
diff --git a/src/main/resources/Resources/cmap/Adobe-GB1-GBK-EUC b/src/main/resources/Resources/cmap/Adobe-GB1-GBK-EUC
new file mode 100644
index 0000000..66a532d
--- /dev/null
+++ b/src/main/resources/Resources/cmap/Adobe-GB1-GBK-EUC
@@ -0,0 +1,4333 @@
+%!PS-Adobe-3.0 Resource-CMap
+%%DocumentNeededResources: ProcSet (CIDInit)
+%%IncludeResource: ProcSet (CIDInit)
+%%BeginResource: CMap (Adobe-GB1-GBK-EUC)
+%%Title: (Adobe-GB1-GBK-EUC Adobe GBK-EUC 2)
+%%Version: 4.002
+%%Copyright: -----------------------------------------------------------
+%%Copyright: Copyright 1990-1999 Adobe Systems Incorporated.
+%%Copyright: All Rights Reserved.
+%%Copyright:
+%%Copyright: Patents Pending
+%%Copyright:
+%%Copyright: NOTICE: All information contained herein is the property
+%%Copyright: of Adobe Systems Incorporated.
+%%Copyright:
+%%Copyright: Permission is granted for redistribution of this file
+%%Copyright: provided this copyright notice is maintained intact and
+%%Copyright: that the contents of this file are not altered in any
+%%Copyright: way from its original form.
+%%Copyright:
+%%Copyright: PostScript and Display PostScript are trademarks of
+%%Copyright: Adobe Systems Incorporated which may be registered in
+%%Copyright: certain jurisdictions.
+%%Copyright: -----------------------------------------------------------
+%%EndComments
+
+/CIDInit /ProcSet findresource begin
+
+12 dict begin
+
+begincmap
+
+/CIDSystemInfo 3 dict dup begin
+/Registry (Adobe) def
+/Ordering (Adobe_GB1_GBK_EUC) def
+/Supplement 2 def
+end def
+
+/CMapName /Adobe-GB1-GBK-EUC def
+
+/CMapVersion 4.002 def
+/CMapType 1 def
+
+/XUID [1 10 25335 1212] def
+
+/WMode 0 def
+
+1 begincodespacerange
+<0000> <FFFF>
+endcodespacerange
+
+1 beginbfrange
+<0000> <0000> <20>
+endbfrange
+
+% Adobe-GB1-2
+% GBK-EUC (Windows)
+100 beginbfrange
+<0001> <005F> <20>
+<0060> <00BD> <A1A1>
+<00BE> <00EF> <A2B1>
+<00F0> <00F9> <A2E5>
+<00FA> <00FF> <A2F1>
+<0100> <0105> <A2F7>
+<0106> <0163> <A3A1>
+<0164> <01B6> <A4A1>
+<01B7> <01FF> <A5A1>
+<0200> <020C> <A5EA>
+<020D> <0224> <A6A1>
+<0225> <0259> <A6C1>
+<025A> <027A> <A7A1>
+<027B> <029B> <A7D1>
+<029C> <02BB> <A8A1>
+<02BC> <02E1> <A8C5>
+<02E2> <02FF> <A9A4>
+<0300> <032D> <A9C2>
+<032E> <038B> <21>
+<038C> <03AB> <ABA1>
+<03AC> <03FF> <B0A1>
+<0400> <0409> <B0F5>
+<040A> <0467> <B1A1>
+<0468> <04C5> <B2A1>
+<04C6> <04FF> <B3A1>
+<0500> <0523> <B3DB>
+<0524> <0581> <B4A1>
+<0582> <05DF> <B5A1>
+<05E0> <05FF> <B6A1>
+<0600> <063D> <B6C1>
+<063E> <069B> <B7A1>
+<069C> <06F9> <B8A1>
+<06FA> <06FF> <B9A1>
+<0700> <0757> <B9A7>
+<0758> <07B5> <BAA1>
+<07B6> <07FF> <BBA1>
+<0800> <0813> <BBEB>
+<0814> <0871> <BCA1>
+<0872> <08CF> <BDA1>
+<08D0> <08FF> <BEA1>
+<0900> <092D> <BED1>
+<092E> <098B> <BFA1>
+<098C> <09E9> <C0A1>
+<09EA> <09FF> <C1A1>
+<0A00> <0A47> <C1B7>
+<0A48> <0AA5> <C2A1>
+<0AA6> <0AFF> <C3A1>
+<0B00> <0B03> <C3FB>
+<0B04> <0B61> <C4A1>
+<0B62> <0BBF> <C5A1>
+<0BC0> <0BFF> <C6A1>
+<0C00> <0C1D> <C6E1>
+<0C1E> <0C7B> <C7A1>
+<0C7C> <0CD9> <C8A1>
+<0CDA> <0CFF> <C9A1>
+<0D00> <0D37> <C9C7>
+<0D38> <0D95> <CAA1>
+<0D96> <0DF3> <CBA1>
+<0DF4> <0DFF> <CCA1>
+<0E00> <0E51> <CCAD>
+<0E52> <0EAF> <CDA1>
+<0EB0> <0EFF> <CEA1>
+<0F00> <0F0D> <CEF1>
+<0F0E> <0F6B> <CFA1>
+<0F6C> <0FC9> <D0A1>
+<0FCA> <0FFF> <D1A1>
+<1000> <1027> <D1D7>
+<1028> <1085> <D2A1>
+<1086> <10E3> <D3A1>
+<10E4> <10FF> <D4A1>
+<1100> <1141> <D4BD>
+<1142> <119F> <D5A1>
+<11A0> <11FD> <D6A1>
+<11FE> <11FF> <D7A1>
+<1200> <1256> <D7A3>
+<1257> <12B4> <D8A1>
+<12B5> <12FF> <D9A1>
+<1300> <1312> <D9EC>
+<1313> <1370> <DAA1>
+<1371> <13CE> <DBA1>
+<13CF> <13FF> <DCA1>
+<1400> <142C> <DCD2>
+<142D> <148A> <DDA1>
+<148B> <14E8> <DEA1>
+<14E9> <14FF> <DFA1>
+<1500> <1546> <DFB8>
+<1547> <15A4> <E0A1>
+<15A5> <15FF> <E1A1>
+<1600> <1602> <E1FC>
+<1603> <1660> <E2A1>
+<1661> <16BE> <E3A1>
+<16BF> <16FF> <E4A1>
+<1700> <171C> <E4E2>
+<171D> <177A> <E5A1>
+<177B> <17D8> <E6A1>
+<17D9> <17FF> <E7A1>
+<1800> <1836> <E7C8>
+<1837> <1894> <E8A1>
+<1895> <18F2> <E9A1>
+<18F3> <18FF> <EAA1>
+endbfrange
+
+100 beginbfrange
+<1900> <1950> <EAAE>
+<1951> <19AE> <EBA1>
+<19AF> <19FF> <ECA1>
+<1A00> <1A0C> <ECF2>
+<1A0D> <1A6A> <EDA1>
+<1A6B> <1AC8> <EEA1>
+<1AC9> <1AFF> <EFA1>
+<1B00> <1B26> <EFD8>
+<1B27> <1B84> <F0A1>
+<1B85> <1BE2> <F1A1>
+<1BE3> <1BFF> <F2A1>
+<1C00> <1C40> <F2BE>
+<1C41> <1C9E> <F3A1>
+<1C9F> <1CFC> <F4A1>
+<1CFD> <1CFF> <F5A1>
+<1D00> <1D5A> <F5A4>
+<1D5B> <1DB8> <F6A1>
+<1DB9> <1DFF> <F7A1>
+<1E00> <1E16> <F7E8>
+<1E17> <1E17> <A996>
+<1E18> <1E19> <A1AB>
+<1E1A> <1E1A> <A1FE>
+<1E1B> <1E1B> <A3AE>
+<1E1C> <1E1C> <A3BD>
+<1E1D> <1E1D> <A3DB>
+<1E1E> <1E1E> <A3DD>
+<1E1F> <1E1F> <A3FE>
+<1E24> <1E24> <20>
+<1E25> <1E25> <B07D>
+<1E26> <1E26> <CC40>
+<1E27> <1E27> <B54B>
+<1E28> <1E28> <90DB>
+<1E29> <1E29> <F361>
+<1E2A> <1E2A> <D25C>
+<1E2B> <1E2B> <89CE>
+<1E2C> <1E2C> <C154>
+<1E2D> <1E2D> <945B>
+<1E2E> <1E2E> <94A1>
+<1E2F> <1E2F> <EE43>
+<1E30> <1E30> <DE6B>
+<1E31> <1E31> <BD4F>
+<1E32> <1E32> <8ECD>
+<1E33> <1E33> <BD89>
+<1E34> <1E34> <E65E>
+<1E35> <1E35> <D672>
+<1E36> <1E36> <EF96>
+<1E37> <1E37> <8C9A>
+<1E38> <1E38> <88F3>
+<1E39> <1E39> <F555>
+<1E3A> <1E3A> <DD85>
+<1E3B> <1E3B> <D890>
+<1E3C> <1E3C> <E45E>
+<1E3D> <1E3D> <AA4E>
+<1E3E> <1E3E> <82E4>
+<1E3F> <1E3F> <9176>
+<1E40> <1E40> <BE58>
+<1E41> <1E41> <B950>
+<1E42> <1E42> <AE85>
+<1E43> <1E43> <94C0>
+<1E44> <1E44> <8EC5>
+<1E45> <1E45> <E95D>
+<1E46> <1E46> <DF85>
+<1E47> <1E47> <BE8E>
+<1E48> <1E48> <D948>
+<1E49> <1E49> <D783>
+<1E4A> <1E4A> <DE71>
+<1E4B> <1E4B> <DE70>
+<1E4C> <1E4C> <98CB>
+<1E4D> <1E4D> <F74D>
+<1E4E> <1E4E> <B054>
+<1E4F> <1E4F> <9E6C>
+<1E50> <1E50> <9E49>
+<1E51> <1E51> <D965>
+<1E52> <1E52> <9450>
+<1E53> <1E53> <EF9E>
+<1E54> <1E54> <93DC>
+<1E55> <1E55> <E35C>
+<1E56> <1E56> <E34B>
+<1E57> <1E57> <F167>
+<1E58> <1E58> <D161>
+<1E59> <1E59> <D894>
+<1E5A> <1E5A> <85A2>
+<1E5B> <1E5B> <D051>
+<1E5C> <1E5C> <9A88>
+<1E5D> <1E5D> <914D>
+<1E5E> <1E5E> <914B>
+<1E5F> <1E5F> <A04E>
+<1E60> <1E60> <C96E>
+<1E61> <1E61> <C593>
+<1E62> <1E62> <827D>
+<1E63> <1E63> <9CE6>
+<1E64> <1E64> <858B>
+<1E65> <1E65> <82C8>
+<1E66> <1E66> <9C79>
+<1E67> <1E67> <8CD3>
+<1E68> <1E68> <D48C>
+<1E69> <1E69> <9476>
+<1E6A> <1E6A> <93BD>
+<1E6B> <1E6B> <CF73>
+<1E6C> <1E6C> <F092>
+endbfrange
+
+100 beginbfrange
+<1E6D> <1E6D> <D78B>
+<1E6E> <1E6E> <C070>
+<1E6F> <1E6F> <E750>
+<1E70> <1E70> <AE62>
+<1E71> <1E71> <EA55>
+<1E72> <1E72> <EE9D>
+<1E73> <1E73> <88F6>
+<1E74> <1E74> <874C>
+<1E75> <1E75> <E94C>
+<1E76> <1E76> <8394>
+<1E77> <1E77> <C463>
+<1E78> <1E78> <8F53>
+<1E79> <1E79> <95B3>
+<1E7A> <1E7A> <E26E>
+<1E7B> <1E7B> <DC87>
+<1E7C> <1E7C> <8FD8>
+<1E7D> <1E7D> <896D>
+<1E7E> <1E7E> <EA90>
+<1E7F> <1E7F> <D272>
+<1E80> <1E80> <B751>
+<1E81> <1E81> <91CD>
+<1E82> <1E82> <D55C>
+<1E83> <1E83> <F247>
+<1E84> <1E84> <DF74>
+<1E85> <1E85> <F159>
+<1E86> <1E86> <FD58>
+<1E87> <1E87> <9FEB>
+<1E88> <1E88> <D06E>
+<1E89> <1E89> <CF78>
+<1E8A> <1E8A> <8C99>
+<1E8B> <1E8B> <AEA0>
+<1E8C> <1E8C> <DC50>
+<1E8D> <1E8D> <BB49>
+<1E8E> <1E8E> <BE49>
+<1E8F> <1E8F> <E168>
+<1E90> <1E90> <E47A>
+<1E91> <1E91> <EB72>
+<1E92> <1E92> <B541>
+<1E93> <1E93> <83A6>
+<1E94> <1E94> <D37C>
+<1E95> <1E95> <CC8E>
+<1E96> <1E96> <82F7>
+<1E97> <1E97> <AF8F>
+<1E98> <1E98> <EA4A>
+<1E99> <1E99> <8493>
+<1E9A> <1E9A> <E54E>
+<1E9B> <1E9B> <BC83>
+<1E9C> <1E9C> <BE62>
+<1E9D> <1E9D> <DE6F>
+<1E9E> <1E9E> <D47E>
+<1E9F> <1E9F> <D96E>
+<1EA0> <1EA0> <C294>
+<1EA1> <1EA1> <8FC4>
+<1EA2> <1EA2> <85B2>
+<1EA3> <1EA3> <DC66>
+<1EA4> <1EA4> <B85A>
+<1EA5> <1EA5> <E565>
+<1EA6> <1EA6> <DF5F>
+<1EA7> <1EA7> <8EA7>
+<1EA8> <1EA8> <D94A>
+<1EA9> <1EA9> <93FA>
+<1EAA> <1EAA> <86CE>
+<1EAB> <1EAB> <E090>
+<1EAC> <1EAC> <93DB>
+<1EAD> <1EAD> <C491>
+<1EAE> <1EAE> <9184>
+<1EAF> <1EAF> <D551>
+<1EB0> <1EB0> <8F97>
+<1EB1> <1EB1> <AE94>
+<1EB2> <1EB2> <93F5>
+<1EB3> <1EB3> <FC68>
+<1EB4> <1EB4> <CA8E>
+<1EB5> <1EB5> <996E>
+<1EB6> <1EB6> <9376>
+<1EB7> <1EB7> <8D75>
+<1EB8> <1EB8> <B65C>
+<1EB9> <1EB9> <8CA7>
+<1EBA> <1EBA> <9FF4>
+<1EBB> <1EBB> <E087>
+<1EBC> <1EBC> <94B3>
+<1EBD> <1EBD> <9CEC>
+<1EBE> <1EBE> <DF66>
+<1EBF> <1EBF> <BE86>
+<1EC0> <1EC0> <EE8D>
+<1EC1> <1EC1> <FC63>
+<1EC2> <1EC2> <897C>
+<1EC3> <1EC3> <EB8A>
+<1EC4> <1EC4> <9DD5>
+<1EC5> <1EC5> <E19E>
+<1EC6> <1EC6> <D57B>
+<1EC7> <1EC7> <D599>
+<1EC8> <1EC8> <E194>
+<1EC9> <1EC9> <ED94>
+<1ECA> <1ECA> <E556>
+<1ECB> <1ECB> <D386>
+<1ECC> <1ECC> <967C>
+<1ECD> <1ECD> <84D3>
+<1ECE> <1ECE> <979D>
+<1ECF> <1ECF> <83F6>
+<1ED0> <1ED0> <F459>
+endbfrange
+
+100 beginbfrange
+<1ED1> <1ED1> <A0D9>
+<1ED2> <1ED2> <AA9A>
+<1ED3> <1ED3> <D778>
+<1ED4> <1ED4> <D980>
+<1ED5> <1ED5> <E583>
+<1ED6> <1ED6> <E591>
+<1ED7> <1ED7> <94E0>
+<1ED8> <1ED8> <BE84>
+<1ED9> <1ED9> <EAA0>
+<1EDA> <1EDA> <8CA6>
+<1EDB> <1EDB> <878D>
+<1EDC> <1EDC> <EE44>
+<1EDD> <1EDD> <E267>
+<1EDE> <1EDE> <8A5A>
+<1EDF> <1EDF> <8999>
+<1EE0> <1EE0> <F95A>
+<1EE1> <1EE1> <EE7E>
+<1EE2> <1EE2> <D39E>
+<1EE3> <1EE3> <90BA>
+<1EE4> <1EE4> <F049>
+<1EE5> <1EE5> <83BA>
+<1EE6> <1EE6> <A096>
+<1EE7> <1EE7> <F044>
+<1EE8> <1EE8> <D945>
+<1EE9> <1EE9> <B06C>
+<1EEA> <1EEA> <C150>
+<1EEB> <1EEB> <E979>
+<1EEC> <1EEC> <B55C>
+<1EED> <1EED> <E243>
+<1EEE> <1EEE> <9FA9>
+<1EEF> <1EEF> <B9A0>
+<1EF0> <1EF0> <D89C>
+<1EF1> <1EF1> <EF88>
+<1EF2> <1EF2> <D44C>
+<1EF3> <1EF3> <BC8F>
+<1EF4> <1EF4> <EF77>
+<1EF5> <1EF5> <D575>
+<1EF6> <1EF6> <8F55>
+<1EF7> <1EF7> <D94D>
+<1EF8> <1EF8> <BC8A>
+<1EF9> <1EF9> <899E>
+<1EFA> <1EFA> <8A5E>
+<1EFB> <1EFB> <918D>
+<1EFC> <1EFC> <BC53>
+<1EFD> <1EFD> <D853>
+<1EFE> <1EFE> <97F7>
+<1EFF> <1EFF> <E468>
+<1F00> <1F00> <EF4C>
+<1F01> <1F01> <AF82>
+<1F02> <1F02> <F154>
+<1F03> <1F03> <BF70>
+<1F04> <1F04> <D653>
+<1F05> <1F05> <F850>
+<1F06> <1F06> <C477>
+<1F07> <1F07> <DD97>
+<1F08> <1F08> <93E1>
+<1F09> <1F09> <DD6F>
+<1F0A> <1F0A> <D978>
+<1F0B> <1F0B> <8FCD>
+<1F0C> <1F0C> <D893>
+<1F0D> <1F0D> <D387>
+<1F0E> <1F0E> <8B44>
+<1F0F> <1F0F> <BF60>
+<1F10> <1F10> <D493>
+<1F11> <1F11> <E27D>
+<1F12> <1F12> <C977>
+<1F13> <1F13> <8ED6>
+<1F14> <1F14> <DA73>
+<1F15> <1F15> <DA4D>
+<1F16> <1F16> <8CF9>
+<1F17> <1F17> <8482>
+<1F18> <1F18> <E493>
+<1F19> <1F19> <BE56>
+<1F1A> <1F1A> <8D8F>
+<1F1B> <1F1B> <E680>
+<1F1C> <1F1C> <9452>
+<1F1D> <1F1D> <F89D>
+<1F1E> <1F1E> <E977>
+<1F1F> <1F1F> <E374>
+<1F20> <1F20> <8280>
+<1F21> <1F21> <BD6F>
+<1F22> <1F22> <FD8F>
+<1F23> <1F23> <EC96>
+<1F24> <1F24> <D895>
+<1F25> <1F25> <E268>
+<1F26> <1F26> <9CCF>
+<1F27> <1F27> <988B>
+<1F28> <1F28> <D98F>
+<1F29> <1F29> <D04D>
+<1F2A> <1F2A> <EE99>
+<1F2B> <1F2B> <848E>
+<1F2C> <1F2C> <EA50>
+<1F2D> <1F2D> <D35E>
+<1F2E> <1F2E> <F05E>
+<1F2F> <1F2F> <9154>
+<1F30> <1F30> <D89E>
+<1F31> <1F31> <8F56>
+<1F32> <1F32> <D28E>
+<1F33> <1F33> <9A77>
+<1F34> <1F34> <FD94>
+endbfrange
+
+100 beginbfrange
+<1F35> <1F35> <E97C>
+<1F36> <1F36> <DC89>
+<1F37> <1F37> <D48E>
+<1F38> <1F38> <9999>
+<1F39> <1F39> <D946>
+<1F3A> <1F3A> <84A3>
+<1F3B> <1F3B> <DD81>
+<1F3C> <1F3C> <E581>
+<1F3D> <1F3D> <87F8>
+<1F3E> <1F3E> <DF5E>
+<1F3F> <1F3F> <F194>
+<1F40> <1F40> <ED6E>
+<1F41> <1F41> <9D68>
+<1F42> <1F42> <CC96>
+<1F43> <1F43> <E975>
+<1F44> <1F44> <FA51>
+<1F45> <1F45> <D952>
+<1F46> <1F46> <DE5A>
+<1F47> <1F47> <F899>
+<1F48> <1F48> <BC74>
+<1F49> <1F49> <89D8>
+<1F4A> <1F4A> <D76F>
+<1F4B> <1F4B> <9CFB>
+<1F4C> <1F4C> <8757>
+<1F4D> <1F4D> <C841>
+<1F4E> <1F4E> <AE8B>
+<1F4F> <1F4F> <849D>
+<1F50> <1F50> <D492>
+<1F51> <1F51> <91D1>
+<1F52> <1F52> <89C4>
+<1F53> <1F53> <9A67>
+<1F54> <1F54> <AD68>
+<1F55> <1F55> <DF80>
+<1F56> <1F56> <BE8F>
+<1F57> <1F57> <D665>
+<1F58> <1F58> <935D>
+<1F59> <1F59> <DD78>
+<1F5A> <1F5A> <D956>
+<1F5B> <1F5B> <B778>
+<1F5C> <1F5C> <95FE>
+<1F5D> <1F5D> <A05A>
+<1F5E> <1F5E> <8552>
+<1F5F> <1F5F> <D64D>
+<1F60> <1F60> <D564>
+<1F61> <1F61> <C04C>
+<1F62> <1F62> <C89D>
+<1F63> <1F63> <9C86>
+<1F64> <1F64> <AB40>
+<1F65> <1F65> <D89B>
+<1F66> <1F66> <B59C>
+<1F67> <1F67> <93F4>
+<1F68> <1F68> <9943>
+<1F69> <1F69> <B765>
+<1F6A> <1F6A> <F087>
+<1F6B> <1F6B> <D749>
+<1F6C> <1F6C> <FA61>
+<1F6D> <1F6D> <BF83>
+<1F6E> <1F6E> <BE83>
+<1F6F> <1F6F> <984F>
+<1F70> <1F70> <DD8B>
+<1F71> <1F71> <BC89>
+<1F72> <1F72> <9444>
+<1F73> <1F73> <8ED7>
+<1F74> <1F74> <CB45>
+<1F75> <1F75> <84A9>
+<1F76> <1F76> <9DFA>
+<1F77> <1F77> <D38B>
+<1F78> <1F78> <D39B>
+<1F79> <1F79> <EB48>
+<1F7A> <1F7A> <C05E>
+<1F7B> <1F7B> <BC6F>
+<1F7C> <1F7C> <8A41>
+<1F7D> <1F7D> <C776>
+<1F7E> <1F7E> <EE61>
+<1F7F> <1F7F> <D95A>
+<1F80> <1F80> <E29B>
+<1F81> <1F81> <8372>
+<1F82> <1F82> <F17B>
+<1F83> <1F83> <9A9E>
+<1F84> <1F84> <B14F>
+<1F85> <1F85> <88D4>
+<1F86> <1F86> <B97B>
+<1F87> <1F87> <E967>
+<1F88> <1F88> <C644>
+<1F89> <1F89> <BE7D>
+<1F8A> <1F8A> <C04F>
+<1F8B> <1F8B> <997A>
+<1F8C> <1F8C> <FB7C>
+<1F8D> <1F8D> <92FE>
+<1F8E> <1F8E> <93EC>
+<1F8F> <1F8F> <BA86>
+<1F90> <1F90> <8380>
+<1F91> <1F91> <CB5D>
+<1F92> <1F92> <9991>
+<1F93> <1F93> <E862>
+<1F94> <1F94> <DB60>
+<1F95> <1F95> <D976>
+<1F96> <1F96> <D28A>
+<1F97> <1F97> <E649>
+<1F98> <1F98> <C59E>
+endbfrange
+
+100 beginbfrange
+<1F99> <1F99> <84A6>
+<1F9A> <1F9A> <F054>
+<1F9B> <1F9B> <9D75>
+<1F9C> <1F9C> <9E52>
+<1F9D> <1F9D> <9DBE>
+<1F9E> <1F9E> <8CA2>
+<1F9F> <1F9F> <9D7B>
+<1FA0> <1FA0> <CA59>
+<1FA1> <1FA1> <98AA>
+<1FA2> <1FA2> <8A5C>
+<1FA3> <1FA3> <D676>
+<1FA4> <1FA4> <E175>
+<1FA5> <1FA5> <C47A>
+<1FA6> <1FA6> <9DB2>
+<1FA7> <1FA7> <F29C>
+<1FA8> <1FA8> <8BC9>
+<1FA9> <1FA9> <9487>
+<1FAA> <1FAA> <E371>
+<1FAB> <1FAB> <B343>
+<1FAC> <1FAC> <8365>
+<1FAD> <1FAD> <EF9C>
+<1FAE> <1FAE> <C055>
+<1FAF> <1FAF> <BD67>
+<1FB0> <1FB0> <DE49>
+<1FB1> <1FB1> <DD5E>
+<1FB2> <1FB2> <EB41>
+<1FB3> <1FB3> <B99D>
+<1FB4> <1FB4> <9D8D>
+<1FB5> <1FB5> <BD59>
+<1FB6> <1FB6> <D55D>
+<1FB7> <1FB7> <BE6F>
+<1FB8> <1FB8> <E55C>
+<1FB9> <1FB9> <8348>
+<1FBA> <1FBA> <D694>
+<1FBB> <1FBB> <DF4D>
+<1FBC> <1FBC> <A061>
+<1FBD> <1FBD> <B14D>
+<1FBE> <1FBE> <84C5>
+<1FBF> <1FBF> <C76F>
+<1FC0> <1FC0> <F64C>
+<1FC1> <1FC1> <F340>
+<1FC2> <1FC2> <BD9B>
+<1FC3> <1FC3> <EE69>
+<1FC4> <1FC4> <E752>
+<1FC5> <1FC5> <8FBD>
+<1FC6> <1FC6> <AF64>
+<1FC7> <1FC7> <B882>
+<1FC8> <1FC8> <BC6D>
+<1FC9> <1FC9> <C566>
+<1FCA> <1FCA> <F178>
+<1FCB> <1FCB> <C565>
+<1FCC> <1FCC> <93FE>
+<1FCD> <1FCD> <E48F>
+<1FCE> <1FCE> <91D6>
+<1FCF> <1FCF> <84A1>
+<1FD0> <1FD0> <F94E>
+<1FD1> <1FD1> <BD81>
+<1FD2> <1FD2> <D358>
+<1FD3> <1FD3> <D445>
+<1FD4> <1FD4> <BD7E>
+<1FD5> <1FD5> <E278>
+<1FD6> <1FD6> <DC8A>
+<1FD7> <1FD7> <F245>
+<1FD8> <1FD8> <E95F>
+<1FD9> <1FD9> <8450>
+<1FDA> <1FDA> <EE77>
+<1FDB> <1FDB> <9AA3>
+<1FDC> <1FDC> <D56E>
+<1FDD> <1FDD> <89A8>
+<1FDE> <1FDE> <91A9>
+<1FDF> <1FDF> <93B8>
+<1FE0> <1FE0> <8EEC>
+<1FE1> <1FE1> <D19D>
+<1FE2> <1FE2> <D546>
+<1FE3> <1FE3> <894B>
+<1FE4> <1FE4> <837E>
+<1FE5> <1FE5> <8C92>
+<1FE6> <1FE6> <B556>
+<1FE7> <1FE7> <95E7>
+<1FE8> <1FE8> <CC9D>
+<1FE9> <1FE9> <8E68>
+<1FEA> <1FEA> <B851>
+<1FEB> <1FEB> <F081>
+<1FEC> <1FEC> <9DA2>
+<1FED> <1FED> <9455>
+<1FEE> <1FEE> <E99F>
+<1FEF> <1FEF> <CF9E>
+<1FF0> <1FF0> <C544>
+<1FF1> <1FF1> <C852>
+<1FF2> <1FF2> <81ED>
+<1FF3> <1FF3> <D987>
+<1FF4> <1FF4> <CB7B>
+<1FF5> <1FF5> <99DA>
+<1FF6> <1FF6> <9472>
+<1FF7> <1FF7> <BB40>
+<1FF8> <1FF8> <EA40>
+<1FF9> <1FF9> <CC6D>
+<1FFA> <1FFA> <9E91>
+<1FFB> <1FFB> <D78E>
+<1FFC> <1FFC> <9488>
+endbfrange
+
+100 beginbfrange
+<1FFD> <1FFD> <D35B>
+<1FFE> <1FFE> <91D0>
+<1FFF> <1FFF> <C07C>
+<2000> <2000> <A080>
+<2001> <2001> <9E45>
+<2002> <2002> <93C6>
+<2003> <2003> <84DA>
+<2004> <2004> <9DB3>
+<2005> <2005> <98B7>
+<2006> <2006> <E844>
+<2007> <2007> <89BE>
+<2008> <2008> <EE90>
+<2009> <2009> <BB68>
+<200A> <200A> <EB78>
+<200B> <200B> <9EA6>
+<200C> <200C> <D159>
+<200D> <200D> <F58E>
+<200E> <200E> <B659>
+<200F> <200F> <FB90>
+<2010> <2010> <8596>
+<2011> <2011> <84EE>
+<2012> <2012> <B55B>
+<2013> <2013> <9A76>
+<2014> <2014> <9E72>
+<2015> <2015> <EB60>
+<2016> <2016> <827A>
+<2017> <2017> <C293>
+<2018> <2018> <C98F>
+<2019> <2019> <DF42>
+<201A> <201A> <E7A0>
+<201B> <201B> <917A>
+<201C> <201C> <9D69>
+<201D> <201D> <BA9F>
+<201E> <201E> <94BF>
+<201F> <201F> <C498>
+<2020> <2020> <E69C>
+<2021> <2021> <91D9>
+<2022> <2022> <9F92>
+<2023> <2023> <BE9A>
+<2024> <2024> <BC5A>
+<2025> <2025> <83C9>
+<2026> <2026> <DD76>
+<2027> <2027> <D58F>
+<2028> <2028> <AF9F>
+<2029> <2029> <DF7C>
+<202A> <202A> <E782>
+<202B> <202B> <AB43>
+<202C> <202C> <C552>
+<202D> <202D> <E08F>
+<202E> <202E> <F75B>
+<202F> <202F> <D955>
+<2030> <2030> <FD67>
+<2031> <2031> <E28F>
+<2032> <2032> <EC60>
+<2033> <2033> <8E58>
+<2034> <2034> <EE49>
+<2035> <2035> <F073>
+<2036> <2036> <84A2>
+<2037> <2037> <FD88>
+<2038> <2038> <C340>
+<2039> <2039> <87B5>
+<203A> <203A> <BB5C>
+<203B> <203B> <89C5>
+<203C> <203C> <946E>
+<203D> <203D> <EB5D>
+<203E> <203E> <98C7>
+<203F> <203F> <8AE4>
+<2040> <2040> <93A7>
+<2041> <2041> <BA74>
+<2042> <2042> <CC4A>
+<2043> <2043> <B152>
+<2044> <2044> <EF42>
+<2045> <2045> <8F5D>
+<2046> <2046> <A074>
+<2047> <2047> <93EF>
+<2048> <2048> <9D46>
+<2049> <2049> <CC94>
+<204A> <204A> <F494>
+<204B> <204B> <D954>
+<204C> <204C> <E568>
+<204D> <204D> <EA91>
+<204E> <204E> <F348>
+<204F> <204F> <E458>
+<2050> <2050> <8CD2>
+<2051> <2051> <BF7C>
+<2052> <2052> <915D>
+<2053> <2053> <9E56>
+<2054> <2054> <BE76>
+<2055> <2055> <8E6E>
+<2056> <2056> <9481>
+<2057> <2057> <8C5C>
+<2058> <2058> <9EB4>
+<2059> <2059> <8179>
+<205A> <205A> <92E0>
+<205B> <205B> <DD86>
+<205C> <205C> <8290>
+<205D> <205D> <81F6>
+<205E> <205E> <9C53>
+<205F> <205F> <BE5D>
+<2060> <2060> <D593>
+endbfrange
+
+100 beginbfrange
+<2061> <2061> <CC7D>
+<2062> <2062> <C15F>
+<2063> <2063> <DF89>
+<2064> <2064> <E88C>
+<2065> <2065> <BB6A>
+<2066> <2066> <F285>
+<2067> <2067> <F198>
+<2068> <2068> <BD6A>
+<2069> <2069> <8B8C>
+<206A> <206A> <AC94>
+<206B> <206B> <B461>
+<206C> <206C> <CE9B>
+<206D> <206D> <F152>
+<206E> <206E> <F188>
+<206F> <206F> <86E1>
+<2070> <2070> <D949>
+<2071> <2071> <FB9C>
+<2072> <2072> <D975>
+<2073> <2073> <DF7E>
+<2074> <2074> <B26D>
+<2075> <2075> <F07A>
+<2076> <2076> <D055>
+<2077> <2077> <9D4D>
+<2078> <2078> <D699>
+<2079> <2079> <E55E>
+<207A> <207A> <E354>
+<207B> <207B> <D951>
+<207C> <207C> <E656>
+<207D> <207D> <E954>
+<207E> <207E> <909E>
+<207F> <207F> <8283>
+<2080> <2080> <E569>
+<2081> <2081> <89F4>
+<2082> <2082> <D669>
+<2083> <2083> <8F9B>
+<2084> <2084> <D292>
+<2085> <2085> <BE64>
+<2086> <2086> <BE92>
+<2087> <2087> <8F52>
+<2088> <2088> <9CE7>
+<2089> <2089> <9191>
+<208A> <208A> <E97D>
+<208B> <208B> <F851>
+<208C> <208C> <E391>
+<208D> <208D> <D687>
+<208E> <208E> <D65C>
+<208F> <208F> <AE80>
+<2090> <2090> <E263>
+<2091> <2091> <BC7B>
+<2092> <2092> <EB79>
+<2093> <2093> <93CF>
+<2094> <2094> <C458>
+<2095> <2095> <90C0>
+<2096> <2096> <F45B>
+<2097> <2097> <F048>
+<2098> <2098> <944D>
+<2099> <2099> <C481>
+<209A> <209A> <9466>
+<209B> <209B> <E184>
+<209C> <209C> <F842>
+<209D> <209D> <C299>
+<209E> <209E> <87A7>
+<209F> <209F> <E887>
+<20A0> <20A0> <E687>
+<20A1> <20A1> <998E>
+<20A2> <20A2> <AA9F>
+<20A3> <20A3> <8C8E>
+<20A4> <20A4> <9451>
+<20A5> <20A5> <9DF4>
+<20A6> <20A6> <E26F>
+<20A7> <20A7> <BC7E>
+<20A8> <20A8> <C493>
+<20A9> <20A9> <9DE2>
+<20AA> <20AA> <DE72>
+<20AB> <20AB> <AF91>
+<20AC> <20AC> <D65A>
+<20AD> <20AD> <9A57>
+<20AE> <20AE> <FA74>
+<20AF> <20AF> <9AAA>
+<20B0> <20B0> <8749>
+<20B1> <20B1> <9D61>
+<20B2> <20B2> <B150>
+<20B3> <20B3> <FD8B>
+<20B4> <20B4> <D972>
+<20B5> <20B5> <878A>
+<20B6> <20B6> <F969>
+<20B7> <20B7> <F25F>
+<20B8> <20B8> <EF68>
+<20B9> <20B9> <EE6C>
+<20BA> <20BA> <D89A>
+<20BB> <20BB> <CC4F>
+<20BC> <20BC> <917B>
+<20BD> <20BD> <D475>
+<20BE> <20BE> <9D8A>
+<20BF> <20BF> <EE48>
+<20C0> <20C0> <93E4>
+<20C1> <20C1> <E481>
+<20C2> <20C2> <8357>
+<20C3> <20C3> <98E3>
+<20C4> <20C4> <D756>
+endbfrange
+
+100 beginbfrange
+<20C5> <20C5> <C49A>
+<20C6> <20C6> <FD52>
+<20C7> <20C7> <F254>
+<20C8> <20C8> <D84D>
+<20C9> <20C9> <8699>
+<20CA> <20CA> <9AE2>
+<20CB> <20CB> <D399>
+<20CC> <20CC> <A0BF>
+<20CD> <20CD> <E254>
+<20CE> <20CE> <E355>
+<20CF> <20CF> <DF77>
+<20D0> <20D0> <BA9E>
+<20D1> <20D1> <D674>
+<20D2> <20D2> <E558>
+<20D3> <20D3> <E351>
+<20D4> <20D4> <9C5C>
+<20D5> <20D5> <D76C>
+<20D6> <20D6> <8971>
+<20D7> <20D7> <988C>
+<20D8> <20D8> <86DC>
+<20D9> <20D9> <89A6>
+<20DA> <20DA> <CB4E>
+<20DB> <20DB> <938C>
+<20DC> <20DC> <E640>
+<20DD> <20DD> <98F2>
+<20DE> <20DE> <86CC>
+<20DF> <20DF> <8353>
+<20E0> <20E0> <C24E>
+<20E1> <20E1> <B85B>
+<20E2> <20E2> <B860>
+<20E3> <20E3> <9A4A>
+<20E4> <20E4> <D348>
+<20E5> <20E5> <8C8B>
+<20E6> <20E6> <DD70>
+<20E7> <20E7> <9AE4>
+<20E8> <20E8> <8341>
+<20E9> <20E9> <ED95>
+<20EA> <20EA> <D588>
+<20EB> <20EB> <9163>
+<20EC> <20EC> <AD82>
+<20ED> <20ED> <B846>
+<20EE> <20EE> <DA85>
+<20EF> <20EF> <855E>
+<20F0> <20F0> <DC7C>
+<20F1> <20F1> <F28C>
+<20F2> <20F2> <FD78>
+<20F3> <20F3> <EF45>
+<20F4> <20F4> <99E0>
+<20F5> <20F5> <84F1>
+<20F6> <20F6> <F96F>
+<20F7> <20F7> <B45F>
+<20F8> <20F8> <D78C>
+<20F9> <20F9> <F088>
+<20FA> <20FA> <945F>
+<20FB> <20FB> <C040>
+<20FC> <20FC> <9FE1>
+<20FD> <20FD> <ED67>
+<20FE> <20FE> <D54A>
+<20FF> <20FF> <BC78>
+<2100> <2100> <9873>
+<2101> <2101> <BD71>
+<2102> <2102> <DC9B>
+<2103> <2103> <E484>
+<2104> <2104> <E963>
+<2105> <2105> <9D99>
+<2106> <2106> <9EA2>
+<2107> <2107> <CB5F>
+<2108> <2108> <F677>
+<2109> <2109> <D990>
+<210A> <210A> <82E3>
+<210B> <210B> <86CA>
+<210C> <210C> <F27D>
+<210D> <210D> <92DF>
+<210E> <210E> <9DAD>
+<210F> <210F> <9AA2>
+<2110> <2110> <BC86>
+<2111> <2111> <BA59>
+<2112> <2112> <95F1>
+<2113> <2113> <E957>
+<2114> <2114> <EA84>
+<2115> <2115> <D9A0>
+<2116> <2116> <BF98>
+<2117> <2117> <82FB>
+<2118> <2118> <D970>
+<2119> <2119> <9FFD>
+<211A> <211A> <BD42>
+<211B> <211B> <D964>
+<211C> <211C> <92CE>
+<211D> <211D> <947A>
+<211E> <211E> <91D8>
+<211F> <211F> <D44F>
+<2120> <2120> <BC9D>
+<2121> <2121> <8C8F>
+<2122> <2122> <8BF0>
+<2123> <2123> <C449>
+<2124> <2124> <9D42>
+<2125> <2125> <C295>
+<2126> <2126> <C04B>
+<2127> <2127> <84D9>
+<2128> <2128> <C27D>
+endbfrange
+
+100 beginbfrange
+<2129> <2129> <8E9F>
+<212A> <212A> <AA7B>
+<212B> <212B> <9DF1>
+<212C> <212C> <D48A>
+<212D> <212D> <9572>
+<212E> <212E> <CE67>
+<212F> <212F> <8C8D>
+<2130> <2130> <D752>
+<2131> <2131> <F182>
+<2132> <2132> <84DD>
+<2133> <2133> <DF6D>
+<2134> <2134> <E18C>
+<2135> <2135> <EF97>
+<2136> <2136> <D295>
+<2137> <2137> <D487>
+<2138> <2138> <89DB>
+<2139> <2139> <AB46>
+<213A> <213A> <98D0>
+<213B> <213B> <DD94>
+<213C> <213C> <95F8>
+<213D> <213D> <DA48>
+<213E> <213E> <8CD9>
+<213F> <213F> <D067>
+<2140> <2140> <98E4>
+<2141> <2141> <B877>
+<2142> <2142> <94B5>
+<2143> <2143> <8E9B>
+<2144> <2144> <EB70>
+<2145> <2145> <D56C>
+<2146> <2146> <ED98>
+<2147> <2147> <D568>
+<2148> <2148> <B454>
+<2149> <2149> <A071>
+<214A> <214A> <BD7A>
+<214B> <214B> <EF95>
+<214C> <214C> <F3A0>
+<214D> <214D> <C296>
+<214E> <214E> <915A>
+<214F> <214F> <ED9E>
+<2150> <2150> <D441>
+<2151> <2151> <D562>
+<2152> <2152> <945C>
+<2153> <2153> <CC4B>
+<2154> <2154> <D456>
+<2155> <2155> <C343>
+<2156> <2156> <EB6D>
+<2157> <2157> <EB53>
+<2158> <2158> <BD97>
+<2159> <2159> <9A71>
+<215A> <215A> <8C4F>
+<215B> <215B> <9370>
+<215C> <215C> <BF73>
+<215D> <215D> <AC8D>
+<215E> <215E> <E669>
+<215F> <215F> <AB48>
+<2160> <2160> <93E9>
+<2161> <2161> <C55F>
+<2162> <2162> <9142>
+<2163> <2163> <9482>
+<2164> <2164> <D89D>
+<2165> <2165> <B063>
+<2166> <2166> <9EA9>
+<2167> <2167> <89AF>
+<2168> <2168> <D754>
+<2169> <2169> <D584>
+<216A> <216A> <8740>
+<216B> <216B> <9CAB>
+<216C> <216C> <A043>
+<216D> <216D> <9DFD>
+<216E> <216E> <BF6C>
+<216F> <216F> <D391>
+<2170> <2170> <F276>
+<2171> <2171> <D660>
+<2172> <2172> <E452>
+<2173> <2173> <EE7D>
+<2174> <2174> <F377>
+<2175> <2175> <976C>
+<2176> <2176> <D94E>
+<2177> <2177> <E846>
+<2178> <2178> <8F64>
+<2179> <2179> <C2A0>
+<217A> <217A> <9F4E>
+<217B> <217B> <E37E>
+<217C> <217C> <BD79>
+<217D> <217D> <EE5E>
+<217E> <217E> <8844>
+<217F> <217F> <8954>
+<2180> <2180> <8846>
+<2181> <2181> <EE6E>
+<2182> <2182> <F872>
+<2183> <2183> <F157>
+<2184> <2184> <F184>
+<2185> <2185> <9945>
+<2186> <2186> <B844>
+<2187> <2187> <D26D>
+<2188> <2188> <8F9D>
+<2189> <2189> <9EB3>
+<218A> <218A> <EE42>
+<218B> <218B> <C866>
+<218C> <218C> <BE57>
+endbfrange
+
+100 beginbfrange
+<218D> <218D> <ED66>
+<218E> <218E> <DF60>
+<218F> <218F> <87FA>
+<2190> <2190> <A091>
+<2191> <2191> <9E48>
+<2192> <2192> <BE53>
+<2193> <2193> <C894>
+<2194> <2194> <82A5>
+<2195> <2195> <835E>
+<2196> <2196> <BE95>
+<2197> <2197> <D65E>
+<2198> <2198> <D06C>
+<2199> <2199> <C284>
+<219A> <219A> <BC79>
+<219B> <219B> <B780>
+<219C> <219C> <8696>
+<219D> <219D> <93EB>
+<219E> <219E> <CE81>
+<219F> <219F> <9C75>
+<21A0> <21A0> <B843>
+<21A1> <21A1> <86E8>
+<21A2> <21A2> <E675>
+<21A3> <21A3> <9EF5>
+<21A4> <21A4> <D55F>
+<21A5> <21A5> <9F6F>
+<21A6> <21A6> <CA8F>
+<21A7> <21A7> <895D>
+<21A8> <21A8> <EC46>
+<21A9> <21A9> <84D5>
+<21AA> <21AA> <D560>
+<21AB> <21AB> <E561>
+<21AC> <21AC> <A0DE>
+<21AD> <21AD> <D275>
+<21AE> <21AE> <C195>
+<21AF> <21AF> <E38A>
+<21B0> <21B0> <91F2>
+<21B1> <21B1> <BC9A>
+<21B2> <21B2> <CE72>
+<21B3> <21B3> <DDA0>
+<21B4> <21B4> <8D7B>
+<21B5> <21B5> <8262>
+<21B6> <21B6> <AA4D>
+<21B7> <21B7> <8798>
+<21B8> <21B8> <E576>
+<21B9> <21B9> <F572>
+<21BA> <21BA> <C077>
+<21BB> <21BB> <D974>
+<21BC> <21BC> <E395>
+<21BD> <21BD> <E965>
+<21BE> <21BE> <EF40>
+<21BF> <21BF> <EB55>
+<21C0> <21C0> <AC46>
+<21C1> <21C1> <AB49>
+<21C2> <21C2> <BF68>
+<21C3> <21C3> <F057>
+<21C4> <21C4> <9197>
+<21C5> <21C5> <BE51>
+<21C6> <21C6> <E882>
+<21C7> <21C7> <E06C>
+<21C8> <21C8> <D494>
+<21C9> <21C9> <ED91>
+<21CA> <21CA> <ED97>
+<21CB> <21CB> <CA92>
+<21CC> <21CC> <87CC>
+<21CD> <21CD> <E44E>
+<21CE> <21CE> <95D4>
+<21CF> <21CF> <875B>
+<21D0> <21D0> <8566>
+<21D1> <21D1> <92B6>
+<21D2> <21D2> <C37B>
+<21D3> <21D3> <D643>
+<21D4> <21D4> <8C91>
+<21D5> <21D5> <9E61>
+<21D6> <21D6> <D678>
+<21D7> <21D7> <E45C>
+<21D8> <21D8> <E185>
+<21D9> <21D9> <C564>
+<21DA> <21DA> <E450>
+<21DB> <21DB> <BD91>
+<21DC> <21DC> <ED9A>
+<21DD> <21DD> <D453>
+<21DE> <21DE> <BE77>
+<21DF> <21DF> <C06D>
+<21E0> <21E0> <DC8E>
+<21E1> <21E1> <91D2>
+<21E2> <21E2> <DF78>
+<21E3> <21E3> <B05F>
+<21E4> <21E4> <BD6B>
+<21E5> <21E5> <8C57>
+<21E6> <21E6> <84D7>
+<21E7> <21E7> <D483>
+<21E8> <21E8> <8CA4>
+<21E9> <21E9> <F15A>
+<21EA> <21EA> <D396>
+<21EB> <21EB> <D38D>
+<21EC> <21EC> <DF64>
+<21ED> <21ED> <89BA>
+<21EE> <21EE> <F866>
+<21EF> <21EF> <F886>
+<21F0> <21F0> <86A1>
+endbfrange
+
+100 beginbfrange
+<21F1> <21F1> <8186>
+<21F2> <21F2> <D3A0>
+<21F3> <21F3> <E98E>
+<21F4> <21F4> <FB7D>
+<21F5> <21F5> <87C0>
+<21F6> <21F6> <EE86>
+<21F7> <21F7> <E990>
+<21F8> <21F8> <C647>
+<21F9> <21F9> <8592>
+<21FA> <21FA> <B38E>
+<21FB> <21FB> <D656>
+<21FC> <21FC> <F29E>
+<21FD> <21FD> <F884>
+<21FE> <21FE> <97EE>
+<21FF> <21FF> <9350>
+<2200> <2200> <AF83>
+<2201> <2201> <EA96>
+<2202> <2202> <B057>
+<2203> <2203> <F042>
+<2204> <2204> <98D3>
+<2205> <2205> <88F2>
+<2206> <2206> <D67C>
+<2207> <2207> <CB8E>
+<2208> <2208> <A094>
+<2209> <2209> <ED93>
+<220A> <220A> <9849>
+<220B> <220B> <C87E>
+<220C> <220C> <E174>
+<220D> <220D> <E39E>
+<220E> <220E> <EE55>
+<220F> <220F> <DF7A>
+<2210> <2210> <8378>
+<2211> <2211> <CF81>
+<2212> <2212> <CB87>
+<2213> <2213> <837C>
+<2214> <2214> <919B>
+<2215> <2215> <C178>
+<2216> <2216> <D484>
+<2217> <2217> <D768>
+<2218> <2218> <D578>
+<2219> <2219> <D767>
+<221A> <221A> <C05B>
+<221B> <221B> <CA61>
+<221C> <221C> <EA8E>
+<221D> <221D> <E379>
+<221E> <221E> <EF8B>
+<221F> <221F> <EB5B>
+<2220> <2220> <99D1>
+<2221> <2221> <8BEB>
+<2222> <2222> <FA97>
+<2223> <2223> <91AA>
+<2224> <2224> <C074>
+<2225> <2225> <AC93>
+<2226> <2226> <CE9E>
+<2227> <2227> <A049>
+<2228> <2228> <9FC9>
+<2229> <2229> <CF89>
+<222A> <222A> <DA41>
+<222B> <222B> <B766>
+<222C> <222C> <86D1>
+<222D> <222D> <93ED>
+<222E> <222E> <82F2>
+<222F> <222F> <B062>
+<2230> <2230> <DB78>
+<2231> <2231> <839E>
+<2232> <2232> <916E>
+<2233> <2233> <E05D>
+<2234> <2234> <E299>
+<2235> <2235> <AA71>
+<2236> <2236> <D554>
+<2237> <2237> <DD9B>
+<2238> <2238> <F04E>
+<2239> <2239> <F47E>
+<223A> <223A> <9D4F>
+<223B> <223B> <C563>
+<223C> <223C> <8E5A>
+<223D> <223D> <D55A>
+<223E> <223E> <F464>
+<223F> <223F> <AA7A>
+<2240> <2240> <D775>
+<2241> <2241> <EE41>
+<2242> <2242> <F153>
+<2243> <2243> <F878>
+<2244> <2244> <9C59>
+<2245> <2245> <DE40>
+<2246> <2246> <8840>
+<2247> <2247> <8654>
+<2248> <2248> <8841>
+<2249> <2249> <BE89>
+<224A> <224A> <DF68>
+<224B> <224B> <EE8A>
+<224C> <224C> <BC73>
+<224D> <224D> <DC53>
+<224E> <224E> <E880>
+<224F> <224F> <E987>
+<2250> <2250> <EB85>
+<2251> <2251> <E079>
+<2252> <2252> <EB45>
+<2253> <2253> <DF5C>
+<2254> <2254> <CB9C>
+endbfrange
+
+100 beginbfrange
+<2255> <2255> <E164>
+<2256> <2256> <959E>
+<2257> <2257> <EB73>
+<2258> <2258> <DD64>
+<2259> <2259> <9480>
+<225A> <225A> <95BA>
+<225B> <225B> <D99D>
+<225C> <225C> <DA4E>
+<225D> <225D> <C54B>
+<225E> <225E> <E88F>
+<225F> <225F> <9797>
+<2260> <2260> <B85E>
+<2261> <2261> <D89F>
+<2262> <2262> <93F1>
+<2263> <2263> <8474>
+<2264> <2264> <9DC9>
+<2265> <2265> <D95C>
+<2266> <2266> <D99B>
+<2267> <2267> <DC88>
+<2268> <2268> <E58E>
+<2269> <2269> <E96C>
+<226A> <226A> <D470>
+<226B> <226B> <FD53>
+<226C> <226C> <82F9>
+<226D> <226D> <9AD6>
+<226E> <226E> <B14B>
+<226F> <226F> <94D8>
+<2270> <2270> <DD9A>
+<2271> <2271> <8DE4>
+<2272> <2272> <97A3>
+<2273> <2273> <91F0>
+<2274> <2274> <BE60>
+<2275> <2275> <8F88>
+<2276> <2276> <9D71>
+<2277> <2277> <8EA4>
+<2278> <2278> <D97E>
+<2279> <2279> <C39B>
+<227A> <227A> <DA77>
+<227B> <227B> <CF55>
+<227C> <227C> <DE48>
+<227D> <227D> <E64E>
+<227E> <227E> <DF40>
+<227F> <227F> <D891>
+<2280> <2280> <E198>
+<2281> <2281> <82C9>
+<2282> <2282> <D45C>
+<2283> <2283> <E682>
+<2284> <2284> <EA87>
+<2285> <2285> <8EAC>
+<2286> <2286> <B059>
+<2287> <2287> <E08D>
+<2288> <2288> <D743>
+<2289> <2289> <BF97>
+<228A> <228A> <C29A>
+<228B> <228B> <88CC>
+<228C> <228C> <D07D>
+<228D> <228D> <BC88>
+<228E> <228E> <93B4>
+<228F> <228F> <9453>
+<2290> <2290> <8EC3>
+<2291> <2291> <D97C>
+<2292> <2292> <9CFE>
+<2293> <2293> <E78A>
+<2294> <2294> <BD4B>
+<2295> <2295> <B74E>
+<2296> <2296> <C45B>
+<2297> <2297> <D05C>
+<2298> <2298> <D661>
+<2299> <2299> <DD53>
+<229A> <229A> <B099>
+<229B> <229B> <9583>
+<229C> <229C> <F345>
+<229D> <229D> <D654>
+<229E> <229E> <D544>
+<229F> <229F> <A054>
+<22A0> <22A0> <B29A>
+<22A1> <22A1> <87DA>
+<22A2> <22A2> <D941>
+<22A3> <22A3> <E854>
+<22A4> <22A4> <BA42>
+<22A5> <22A5> <F176>
+<22A6> <22A6> <8CA3>
+<22A7> <22A7> <B475>
+<22A8> <22A8> <DE44>
+<22A9> <22A9> <D98D>
+<22AA> <22AA> <98B6>
+<22AB> <22AB> <C766>
+<22AC> <22AC> <D162>
+<22AD> <22AD> <8A79>
+<22AE> <22AE> <89D1>
+<22AF> <22AF> <A0EE>
+<22B0> <22B0> <E546>
+<22B1> <22B1> <D998>
+<22B2> <22B2> <898B>
+<22B3> <22B3> <BE59>
+<22B4> <22B4> <D581>
+<22B5> <22B5> <9CCA>
+<22B6> <22B6> <9DE1>
+<22B7> <22B7> <D959>
+<22B8> <22B8> <9D6E>
+endbfrange
+
+100 beginbfrange
+<22B9> <22B9> <BE43>
+<22BA> <22BA> <BF82>
+<22BB> <22BB> <BF76>
+<22BC> <22BC> <E075>
+<22BD> <22BD> <D47B>
+<22BE> <22BE> <BD4D>
+<22BF> <22BF> <E88D>
+<22C0> <22C0> <86DD>
+<22C1> <22C1> <8587>
+<22C2> <22C2> <8598>
+<22C3> <22C3> <EC76>
+<22C4> <22C4> <D99E>
+<22C5> <22C5> <8551>
+<22C6> <22C6> <8554>
+<22C7> <22C7> <D991>
+<22C8> <22C8> <8471>
+<22C9> <22C9> <84A5>
+<22CA> <22CA> <8492>
+<22CB> <22CB> <82F8>
+<22CC> <22CC> <8274>
+<22CD> <22CD> <82E1>
+<22CE> <22CE> <838A>
+<22CF> <22CF> <837A>
+<22D0> <22D0> <8389>
+<22D1> <22D1> <83B0>
+<22D2> <22D2> <83AB>
+<22D3> <22D3> <8366>
+<22D4> <22D4> <8345>
+<22D5> <22D5> <83AF>
+<22D6> <22D6> <8386>
+<22D7> <22D7> <83AE>
+<22D8> <22D8> <834C>
+<22D9> <22D9> <BC65>
+<22DA> <22DA> <FC5A>
+<22DB> <22DB> <87CF>
+<22DC> <22DC> <F849>
+<22DD> <22DD> <D243>
+<22DE> <22DE> <C54C>
+<22DF> <22DF> <D385>
+<22E0> <22E0> <D393>
+<22E1> <22E1> <D38F>
+<22E2> <22E2> <D398>
+<22E3> <22E3> <D68E>
+<22E4> <22E4> <D46E>
+<22E5> <22E5> <D447>
+<22E6> <22E6> <D462>
+<22E7> <22E7> <D458>
+<22E8> <22E8> <D467>
+<22E9> <22E9> <D474>
+<22EA> <22EA> <D478>
+<22EB> <22EB> <D472>
+<22EC> <22EC> <D545>
+<22ED> <22ED> <D543>
+<22EE> <22EE> <D49F>
+<22EF> <22EF> <D491>
+<22F0> <22F0> <D49C>
+<22F1> <22F1> <D496>
+<22F2> <22F2> <D48D>
+<22F3> <22F3> <D48F>
+<22F4> <22F4> <D58A>
+<22F5> <22F5> <D59F>
+<22F6> <22F6> <D482>
+<22F7> <22F7> <D556>
+<22F8> <22F8> <D561>
+<22F9> <22FA> <D54E>
+<22FB> <22FB> <D58C>
+<22FC> <22FC> <D58E>
+<22FD> <22FD> <D586>
+<22FE> <22FE> <D598>
+<22FF> <22FF> <D594>
+<2300> <2300> <D57E>
+<2301> <2301> <D572>
+<2302> <2302> <D652>
+<2303> <2303> <D647>
+<2304> <2304> <D66F>
+<2305> <2305> <D65D>
+<2306> <2306> <D640>
+<2307> <2307> <D649>
+<2308> <2308> <D658>
+<2309> <2309> <D64F>
+<230A> <230A> <D642>
+<230B> <230B> <D64A>
+<230C> <230C> <D59B>
+<230D> <230D> <D683>
+<230E> <230E> <D795>
+<230F> <230F> <D671>
+<2310> <2310> <D675>
+<2311> <2311> <D66B>
+<2312> <2312> <D686>
+<2313> <2313> <D688>
+<2314> <2314> <D750>
+<2315> <2315> <D753>
+<2316> <2316> <D748>
+<2317> <2317> <D797>
+<2318> <2318> <D764>
+<2319> <2319> <D78F>
+<231A> <231A> <EA80>
+<231B> <231B> <E097>
+<231C> <231C> <E077>
+<231D> <231D> <E092>
+endbfrange
+
+100 beginbfrange
+<231E> <231E> <E050>
+<231F> <231F> <E094>
+<2320> <2320> <E069>
+<2321> <2321> <E142>
+<2322> <2322> <C663>
+<2323> <2323> <84EA>
+<2324> <2324> <8E80>
+<2325> <2325> <88D7>
+<2326> <2326> <89BF>
+<2327> <2327> <89C8>
+<2328> <2328> <89C6>
+<2329> <2329> <89C0>
+<232A> <232A> <88BA>
+<232B> <232B> <894E>
+<232C> <232C> <88DF>
+<232D> <232D> <8950>
+<232E> <232E> <88E5>
+<232F> <232F> <895F>
+<2330> <2330> <CB47>
+<2331> <2331> <CA7C>
+<2332> <2332> <CB9E>
+<2333> <2333> <C77B>
+<2334> <2334> <C84F>
+<2335> <2335> <C990>
+<2336> <2336> <C672>
+<2337> <2337> <CC64>
+<2338> <2338> <CA5C>
+<2339> <2339> <894C>
+<233A> <233A> <9FA6>
+<233B> <233B> <CA81>
+<233C> <233C> <C99C>
+<233D> <233D> <CA77>
+<233E> <233E> <CB43>
+<233F> <233F> <CB6A>
+<2340> <2340> <A0CE>
+<2341> <2341> <9CEE>
+<2342> <2342> <CA6E>
+<2343> <2343> <CB7C>
+<2344> <2344> <CA7B>
+<2345> <2345> <C970>
+<2346> <2346> <C887>
+<2347> <2347> <C892>
+<2348> <2348> <C950>
+<2349> <2349> <C86E>
+<234A> <234A> <CB57>
+<234B> <234B> <CA7E>
+<234C> <234C> <FA4C>
+<234D> <234D> <C94F>
+<234E> <234E> <BF4D>
+<234F> <234F> <CA72>
+<2350> <2350> <CA89>
+<2351> <2351> <CA56>
+<2352> <2352> <F287>
+<2353> <2353> <CC79>
+<2354> <2354> <E676>
+<2355> <2355> <CA9A>
+<2356> <2356> <CC60>
+<2357> <2357> <CC41>
+<2358> <2358> <CC49>
+<2359> <2359> <CB92>
+<235A> <235A> <CC5C>
+<235B> <235B> <8A59>
+<235C> <235C> <8CC0>
+<235D> <235D> <92D0>
+<235E> <235E> <93BB>
+<235F> <235F> <93D7>
+<2360> <2360> <939D>
+<2361> <2361> <93A5>
+<2362> <2362> <93E5>
+<2363> <2363> <9464>
+<2364> <2364> <9474>
+<2365> <2365> <9458>
+<2366> <2366> <945D>
+<2367> <2367> <9478>
+<2368> <2368> <875C>
+<2369> <2369> <8760>
+<236A> <236A> <87D2>
+<236B> <236B> <87B3>
+<236C> <236C> <8668>
+<236D> <236D> <864A>
+<236E> <236E> <8793>
+<236F> <236F> <877A>
+<2370> <2370> <877D>
+<2371> <2371> <875E>
+<2372> <2372> <86F4>
+<2373> <2373> <8782>
+<2374> <2374> <8788>
+<2375> <2375> <879D>
+<2376> <2376> <8781>
+<2377> <2377> <874F>
+<2378> <2378> <875A>
+<2379> <2379> <86EE>
+<237A> <237A> <874B>
+<237B> <237B> <87CA>
+<237C> <237C> <8744>
+<237D> <237D> <87BF>
+<237E> <237E> <87CB>
+<237F> <237F> <8786>
+<2380> <2380> <DE5C>
+<2381> <2381> <87C2>
+endbfrange
+
+100 beginbfrange
+<2382> <2382> <87A3>
+<2383> <2383> <87F7>
+<2384> <2384> <8EAE>
+<2385> <2385> <8ECE>
+<2386> <2386> <8EBE>
+<2387> <2387> <8EBD>
+<2388> <2388> <8DE7>
+<2389> <2389> <8D73>
+<238A> <238A> <8DB9>
+<238B> <238B> <8D9E>
+<238C> <238C> <8E46>
+<238D> <238D> <8DFE>
+<238E> <238E> <8DF7>
+<238F> <238F> <8D88>
+<2390> <2390> <8E56>
+<2391> <2391> <8DE2>
+<2392> <2392> <8E70>
+<2393> <2393> <8FC6>
+<2394> <2394> <AB45>
+<2395> <2395> <AA77>
+<2396> <2396> <AA9C>
+<2397> <2397> <AA73>
+<2398> <2398> <AA9D>
+<2399> <2399> <AB4D>
+<239A> <239A> <AB4A>
+<239B> <239B> <EF7A>
+<239C> <239C> <F068>
+<239D> <239D> <EF82>
+<239E> <239E> <F071>
+<239F> <23A0> <EF83>
+<23A1> <23A1> <EF86>
+<23A2> <23A2> <EF8D>
+<23A3> <23A3> <F041>
+<23A4> <23A4> <F047>
+<23A5> <23A5> <F051>
+<23A6> <23A6> <F06C>
+<23A7> <23A7> <F074>
+<23A8> <23A8> <F078>
+<23A9> <23AA> <F07D>
+<23AB> <23AB> <F080>
+<23AC> <23AC> <F082>
+<23AD> <23AD> <F096>
+<23AE> <23AE> <8F54>
+<23AF> <23AF> <D973>
+<23B0> <23B0> <91D4>
+<23B1> <23B1> <9193>
+<23B2> <23B2> <9159>
+<23B3> <23B3> <90F7>
+<23B4> <23B4> <909D>
+<23B5> <23B5> <90ED>
+<23B6> <23B6> <91AB>
+<23B7> <23B7> <9151>
+<23B8> <23B8> <91C3>
+<23B9> <23B9> <90C5>
+<23BA> <23BA> <90F0>
+<23BB> <23BB> <90C1>
+<23BC> <23BC> <9161>
+<23BD> <23BD> <90DC>
+<23BE> <23BE> <917C>
+<23BF> <23BF> <E956>
+<23C0> <23C0> <E95A>
+<23C1> <23C1> <E99D>
+<23C2> <23C2> <E962>
+<23C3> <23C3> <E968>
+<23C4> <23C4> <E960>
+<23C5> <23C5> <EA59>
+<23C6> <23C6> <E982>
+<23C7> <23C7> <E980>
+<23C8> <23C8> <F462>
+<23C9> <23C9> <E981>
+<23CA> <23CA> <E993>
+<23CB> <23CB> <E98B>
+<23CC> <23CC> <F45D>
+<23CD> <23CD> <E994>
+<23CE> <23CE> <E992>
+<23CF> <23CF> <E991>
+<23D0> <23D0> <E998>
+<23D1> <23D1> <E9A0>
+<23D2> <23D2> <EA48>
+<23D3> <23D3> <EA44>
+<23D4> <23D4> <EA49>
+<23D5> <23D5> <EA52>
+<23D6> <23D6> <9E96>
+<23D7> <23D7> <9D91>
+<23D8> <23D8> <9E7B>
+<23D9> <23D9> <9E6F>
+<23DA> <23DA> <9E54>
+<23DB> <23DB> <9BDC>
+<23DC> <23DC> <9BD1>
+<23DD> <23DD> <9C9D>
+<23DE> <23DE> <9DD2>
+<23DF> <23DF> <9E67>
+<23E0> <23E0> <9D47>
+<23E1> <23E1> <9DA1>
+<23E2> <23E2> <9C5A>
+<23E3> <23E3> <9DAC>
+<23E4> <23E4> <9E5E>
+<23E5> <23E5> <9DC6>
+<23E6> <23E6> <9E63>
+<23E7> <23E7> <9EB7>
+endbfrange
+
+100 beginbfrange
+<23E8> <23E8> <9E97>
+<23E9> <23E9> <9E5D>
+<23EA> <23EA> <9DA7>
+<23EB> <23EB> <9E75>
+<23EC> <23EC> <9E74>
+<23ED> <23ED> <9E87>
+<23EE> <23EE> <9E7C>
+<23EF> <23EF> <9EAE>
+<23F0> <23F0> <F271>
+<23F1> <23F1> <DF83>
+<23F2> <23F2> <DE9F>
+<23F3> <23F3> <DF8A>
+<23F4> <23F4> <8CD5>
+<23F5> <23F5> <8F86>
+<23F6> <23F6> <8BB3>
+<23F7> <23F7> <8B9E>
+<23F8> <23F8> <8BBE>
+<23F9> <23F9> <8B49>
+<23FA> <23FA> <8BC6>
+<23FB> <23FB> <8C44>
+<23FC> <23FC> <8B7A>
+<23FD> <23FD> <8BB9>
+<23FE> <23FE> <8BC8>
+<23FF> <23FF> <8BDC>
+<2400> <2400> <8BE5>
+<2401> <2401> <8BD4>
+<2402> <2402> <F17A>
+<2403> <2403> <F186>
+<2404> <2404> <F180>
+<2405> <2405> <F27C>
+<2406> <2406> <F341>
+<2407> <2407> <F177>
+<2408> <2408> <F17E>
+<2409> <2409> <F294>
+<240A> <240A> <F291>
+<240B> <240B> <F189>
+<240C> <240C> <F350>
+<240D> <240D> <F255>
+<240E> <240E> <F253>
+<240F> <240F> <F24B>
+<2410> <2410> <F289>
+<2411> <2411> <F273>
+<2412> <2412> <F25C>
+<2413> <2413> <F288>
+<2414> <2414> <F274>
+<2415> <2415> <F27E>
+<2416> <2417> <F28A>
+<2418> <2418> <F296>
+<2419> <2419> <F34B>
+<241A> <241A> <F34A>
+<241B> <241B> <BC69>
+<241C> <241C> <BC75>
+<241D> <241D> <BC71>
+<241E> <241F> <BC76>
+<2420> <2420> <C06B>
+<2421> <2421> <BC8B>
+<2422> <2422> <BC84>
+<2423> <2423> <BC82>
+<2424> <2424> <BD43>
+<2425> <2425> <BC9C>
+<2426> <2426> <BC9B>
+<2427> <2427> <BF55>
+<2428> <2428> <BD45>
+<2429> <2429> <BD49>
+<242A> <242A> <BD48>
+<242B> <242B> <BD66>
+<242C> <242C> <BD57>
+<242D> <242D> <BD7B>
+<242E> <242E> <BD8E>
+<242F> <242F> <BD8B>
+<2430> <2430> <BD90>
+<2431> <2431> <BE63>
+<2432> <2432> <BE5F>
+<2433> <2433> <BE70>
+<2434> <2434> <BE79>
+<2435> <2435> <BE69>
+<2436> <2436> <BE45>
+<2437> <2437> <BE52>
+<2438> <2438> <BE5E>
+<2439> <2439> <BE4A>
+<243A> <243A> <BE55>
+<243B> <243B> <BE6C>
+<243C> <243C> <BE7E>
+<243D> <243D> <BE7C>
+<243E> <243E> <BE9F>
+<243F> <243F> <BE98>
+<2440> <2440> <C044>
+<2441> <2441> <BE8C>
+<2442> <2442> <BE9C>
+<2443> <2443> <BE97>
+<2444> <2444> <BF50>
+<2445> <2445> <BE87>
+<2446> <2446> <BF4E>
+<2447> <2447> <BF62>
+<2448> <2448> <BF64>
+<2449> <2449> <BF63>
+<244A> <244A> <BF72>
+<244B> <244B> <BF4F>
+<244C> <244C> <BF56>
+<244D> <244D> <C05F>
+endbfrange
+
+100 beginbfrange
+<244E> <244E> <BF7E>
+<244F> <244F> <BF7A>
+<2450> <2450> <BF77>
+<2451> <2451> <BF8A>
+<2452> <2452> <BF89>
+<2453> <2453> <C069>
+<2454> <2454> <BF9D>
+<2455> <2455> <BF95>
+<2456> <2456> <C050>
+<2457> <2457> <C060>
+<2458> <2458> <C052>
+<2459> <2459> <C051>
+<245A> <245A> <C079>
+<245B> <245B> <AD5E>
+<245C> <245C> <AC7C>
+<245D> <245D> <AD87>
+<245E> <245E> <ED9C>
+<245F> <245F> <AD74>
+<2460> <2460> <AC71>
+<2461> <2461> <AD49>
+<2462> <2462> <AD61>
+<2463> <2463> <AD8B>
+<2464> <2464> <AD91>
+<2465> <2465> <ED74>
+<2466> <2466> <ED79>
+<2467> <2467> <ED77>
+<2468> <2468> <9871>
+<2469> <2469> <99C0>
+<246A> <246A> <9767>
+<246B> <246B> <9796>
+<246C> <246C> <98BA>
+<246D> <246D> <976E>
+<246E> <246E> <99B1>
+<246F> <246F> <99C9>
+<2470> <2470> <99BE>
+<2471> <2471> <99B5>
+<2472> <2472> <9966>
+<2473> <2473> <97BF>
+<2474> <2474> <98EF>
+<2475> <2475> <9845>
+<2476> <2476> <9881>
+<2477> <2477> <98E5>
+<2478> <2478> <9975>
+<2479> <2479> <99E8>
+<247A> <247A> <99F4>
+<247B> <247B> <99B3>
+<247C> <247C> <98A0>
+<247D> <247D> <99E5>
+<247E> <247E> <99EC>
+<247F> <247F> <99C2>
+<2480> <2480> <99B0>
+<2481> <2481> <99CE>
+<2482> <2482> <9989>
+<2483> <2483> <99BD>
+<2484> <2484> <997B>
+<2485> <2485> <99A9>
+<2486> <2486> <99B4>
+<2487> <2487> <9A91>
+<2488> <2488> <9A8C>
+<2489> <2489> <9A9A>
+<248A> <248A> <9A97>
+<248B> <248B> <9A9B>
+<248C> <248C> <DC90>
+<248D> <248D> <DC97>
+<248E> <248E> <DD4D>
+<248F> <248F> <DD56>
+<2490> <2490> <DE5F>
+<2491> <2491> <DD54>
+<2492> <2492> <DD57>
+<2493> <2493> <DD46>
+<2494> <2494> <DCA0>
+<2495> <2495> <DE5D>
+<2496> <2496> <DD55>
+<2497> <2497> <DD59>
+<2498> <2498> <DD65>
+<2499> <2499> <DD62>
+<249A> <249A> <DD60>
+<249B> <249B> <DD6D>
+<249C> <249C> <DD82>
+<249D> <249E> <DD79>
+<249F> <249F> <DD77>
+<24A0> <24A0> <DD8F>
+<24A1> <24A1> <DE41>
+<24A2> <24A2> <DE4F>
+<24A3> <24A3> <91E2>
+<24A4> <24A4> <91EA>
+<24A5> <24A5> <AE54>
+<24A6> <24A6> <95D2>
+<24A7> <24A7> <95CF>
+<24A8> <24A8> <959F>
+<24A9> <24A9> <95E1>
+<24AA> <24AA> <D953>
+<24AB> <24AB> <D942>
+<24AC> <24AC> <D94C>
+<24AD> <24AD> <D94F>
+<24AE> <24AE> <D997>
+<24AF> <24AF> <D944>
+<24B0> <24B0> <D957>
+<24B1> <24B1> <DA42>
+<24B2> <24B2> <D963>
+endbfrange
+
+100 beginbfrange
+<24B3> <24B3> <D96C>
+<24B4> <24B4> <D967>
+<24B5> <24B5> <D97D>
+<24B6> <24B6> <D979>
+<24B7> <24B7> <D98E>
+<24B8> <24B8> <D297>
+<24B9> <24B9> <D34A>
+<24BA> <24BA> <D2A0>
+<24BB> <24BB> <D35D>
+<24BC> <24BC> <D344>
+<24BD> <24BD> <D34D>
+<24BE> <24BE> <D350>
+<24BF> <24BF> <D355>
+<24C0> <24C0> <9AD0>
+<24C1> <24C1> <9ADA>
+<24C2> <24C2> <9AE5>
+<24C3> <24C3> <A0A9>
+<24C4> <24C4> <9656>
+<24C5> <24C5> <C44C>
+<24C6> <24C6> <C546>
+<24C7> <24C7> <C384>
+<24C8> <24C8> <C492>
+<24C9> <24C9> <C454>
+<24CA> <24CA> <C49C>
+<24CB> <24CB> <9A65>
+<24CC> <24CD> <EF52>
+<24CE> <24CE> <EF5A>
+<24CF> <24CF> <EF60>
+<24D0> <24D0> <EF6A>
+<24D1> <24D1> <EF6C>
+<24D2> <24D2> <DD9E>
+<24D3> <24D3> <FD57>
+<24D4> <24D4> <94CC>
+<24D5> <24D5> <9FAC>
+<24D6> <24D6> <9F98>
+<24D7> <24D7> <9FCD>
+<24D8> <24D8> <9FEE>
+<24D9> <24D9> <A046>
+<24DA> <24DA> <A063>
+<24DB> <24DB> <B65B>
+<24DC> <24DC> <B59D>
+<24DD> <24DD> <B655>
+<24DE> <24DE> <91BB>
+<24DF> <24DF> <9155>
+<24E0> <24E0> <91BF>
+<24E1> <24E1> <91DF>
+<24E2> <24E2> <9DCD>
+<24E3> <24E3> <B489>
+<24E4> <24E4> <B458>
+<24E5> <24E5> <B38C>
+<24E6> <24E6> <B45E>
+<24E7> <24E7> <B55A>
+<24E8> <24E8> <B561>
+<24E9> <24E9> <B388>
+<24EA> <24EA> <B493>
+<24EB> <24EB> <B483>
+<24EC> <24EC> <B47E>
+<24ED> <24ED> <FD90>
+<24EE> <24EE> <B267>
+<24EF> <24EF> <B241>
+<24F0> <24F0> <B280>
+<24F1> <24F1> <C160>
+<24F2> <24F2> <C162>
+<24F3> <24F5> <E18E>
+<24F6> <24F6> <E195>
+<24F7> <24F7> <E193>
+<24F8> <24F8> <E191>
+<24F9> <24F9> <E251>
+<24FA> <24FA> <E241>
+<24FB> <24FB> <E19F>
+<24FC> <24FC> <E57B>
+<24FD> <24FD> <E24F>
+<24FE> <24FE> <E253>
+<24FF> <24FF> <E262>
+<2500> <2500> <E281>
+<2501> <2501> <E2A0>
+<2502> <2502> <E26B>
+<2503> <2503> <E26A>
+<2504> <2504> <E25B>
+<2505> <2505> <E282>
+<2506> <2506> <E25E>
+<2507> <2507> <E280>
+<2508> <2508> <E25A>
+<2509> <2509> <E295>
+<250A> <250A> <E360>
+<250B> <250B> <E292>
+<250C> <250C> <E28E>
+<250D> <250D> <E34F>
+<250E> <250E> <E298>
+<250F> <250F> <E293>
+<2510> <2510> <E358>
+<2511> <2512> <E366>
+<2513> <2513> <E29A>
+<2514> <2514> <E870>
+<2515> <2515> <E28B>
+<2516> <2516> <E343>
+<2517> <2517> <E342>
+<2518> <2518> <E347>
+<2519> <2519> <E289>
+<251A> <251A> <E294>
+endbfrange
+
+100 beginbfrange
+<251B> <251B> <E849>
+<251C> <251C> <E444>
+<251D> <251D> <E399>
+<251E> <251E> <E373>
+<251F> <251F> <E442>
+<2520> <2520> <E485>
+<2521> <2521> <E465>
+<2522> <2522> <E774>
+<2523> <2523> <E479>
+<2524> <2524> <E84B>
+<2525> <2525> <E448>
+<2526> <2526> <E39F>
+<2527> <2527> <E67A>
+<2528> <2528> <E38F>
+<2529> <2529> <E462>
+<252A> <252A> <E441>
+<252B> <252B> <E766>
+<252C> <252C> <E38C>
+<252D> <252D> <E378>
+<252E> <252E> <E67C>
+<252F> <252F> <E393>
+<2530> <2530> <E550>
+<2531> <2531> <E443>
+<2532> <2532> <E37C>
+<2533> <2533> <E77C>
+<2534> <2534> <E440>
+<2535> <2535> <E39C>
+<2536> <2536> <E784>
+<2537> <2537> <E56E>
+<2538> <2538> <E488>
+<2539> <2539> <E748>
+<253A> <253A> <E47B>
+<253B> <253B> <E487>
+<253C> <253C> <E486>
+<253D> <253D> <E47E>
+<253E> <253E> <E453>
+<253F> <253F> <E473>
+<2540> <2540> <E48D>
+<2541> <2542> <E798>
+<2543> <2543> <E45A>
+<2544> <2544> <E475>
+<2545> <2545> <E47C>
+<2546> <2546> <E548>
+<2547> <2547> <E49D>
+<2548> <2548> <E59F>
+<2549> <2549> <E551>
+<254A> <254A> <E575>
+<254B> <254B> <E498>
+<254C> <254C> <E54B>
+<254D> <254D> <E564>
+<254E> <254E> <E578>
+<254F> <2550> <E49E>
+<2551> <2551> <E555>
+<2552> <2552> <E54F>
+<2553> <2553> <E59B>
+<2554> <2554> <E57C>
+<2555> <2555> <E64A>
+<2556> <2556> <E58A>
+<2557> <2557> <E59A>
+<2558> <2558> <E67D>
+<2559> <2559> <E644>
+<255A> <255A> <E658>
+<255B> <255B> <E755>
+<255C> <255C> <E749>
+<255D> <255D> <E79A>
+<255E> <255E> <E65B>
+<255F> <255F> <E69F>
+<2560> <2560> <E66B>
+<2561> <2561> <E68C>
+<2562> <2562> <E693>
+<2563> <2563> <E679>
+<2564> <2564> <E684>
+<2565> <2565> <E689>
+<2566> <2566> <E85C>
+<2567> <2567> <E753>
+<2568> <2569> <E74D>
+<256A> <256A> <E6A0>
+<256B> <256B> <E74F>
+<256C> <256C> <E697>
+<256D> <256D> <E69B>
+<256E> <256E> <E743>
+<256F> <256F> <E786>
+<2570> <2570> <E78F>
+<2571> <2571> <E768>
+<2572> <2572> <E875>
+<2573> <2573> <E785>
+<2574> <2574> <E87C>
+<2575> <2575> <E792>
+<2576> <2576> <E889>
+<2577> <2577> <E76A>
+<2578> <2578> <E78B>
+<2579> <2579> <E85A>
+<257A> <257A> <E843>
+<257B> <257B> <E84F>
+<257C> <257C> <E864>
+<257D> <257D> <E873>
+<257E> <257E> <E652>
+<257F> <257F> <B777>
+<2580> <2580> <F846>
+<2581> <2581> <F853>
+endbfrange
+
+100 beginbfrange
+<2582> <2582> <F864>
+<2583> <2583> <F863>
+<2584> <2584> <F881>
+<2585> <2585> <F985>
+<2586> <2586> <FB52>
+<2587> <2587> <F87A>
+<2588> <2588> <F87C>
+<2589> <2589> <FA83>
+<258A> <258A> <F88D>
+<258B> <258B> <FA76>
+<258C> <258C> <F88E>
+<258D> <258D> <F8A0>
+<258E> <258E> <FB5B>
+<258F> <258F> <F950>
+<2590> <2590> <FB5A>
+<2591> <2591> <F95D>
+<2592> <2592> <F94F>
+<2593> <2593> <FA91>
+<2594> <2594> <F959>
+<2595> <2595> <F95E>
+<2596> <2596> <F991>
+<2597> <2597> <F967>
+<2598> <2598> <F96C>
+<2599> <2599> <F987>
+<259A> <259A> <F996>
+<259B> <259B> <F998>
+<259C> <259C> <FA5D>
+<259D> <259D> <FA42>
+<259E> <259E> <FA46>
+<259F> <259F> <FA5F>
+<25A0> <25A0> <FA59>
+<25A1> <25A1> <FB57>
+<25A2> <25A2> <FA70>
+<25A3> <25A3> <FA77>
+<25A4> <25A4> <FA8D>
+<25A5> <25A5> <FA84>
+<25A6> <25A6> <FA90>
+<25A7> <25A7> <FA96>
+<25A8> <25A8> <FB49>
+<25A9> <25A9> <FA98>
+<25AA> <25AA> <FB58>
+<25AB> <25AB> <B058>
+<25AC> <25AC> <B04F>
+<25AD> <25AD> <B05B>
+<25AE> <25AE> <AF7B>
+<25AF> <25B0> <B041>
+<25B1> <25B1> <B044>
+<25B2> <25B2> <AF8E>
+<25B3> <25B3> <AF9C>
+<25B4> <25B5> <B060>
+<25B6> <25B6> <B05D>
+<25B7> <25B7> <B064>
+<25B8> <25B8> <B85D>
+<25B9> <25B9> <B84D>
+<25BA> <25BA> <D264>
+<25BB> <25BB> <D19E>
+<25BC> <25BC> <D263>
+<25BD> <25BD> <D24D>
+<25BE> <25BE> <D240>
+<25BF> <25BF> <D268>
+<25C0> <25C0> <B097>
+<25C1> <25C1> <C267>
+<25C2> <25C2> <C265>
+<25C3> <25C3> <C29C>
+<25C4> <25C4> <C298>
+<25C5> <25C5> <ED99>
+<25C6> <25C6> <EDA0>
+<25C7> <25C7> <EE40>
+<25C8> <25C8> <EE52>
+<25C9> <25C9> <EE4D>
+<25CA> <25CA> <9D7D>
+<25CB> <25CB> <EE57>
+<25CC> <25CC> <EE68>
+<25CD> <25CD> <EE80>
+<25CE> <25CE> <EE85>
+<25CF> <25CF> <EF44>
+<25D0> <25D0> <EE94>
+<25D1> <25D1> <EE8B>
+<25D2> <25D2> <EE97>
+<25D3> <25D3> <EE9E>
+<25D4> <25D4> <EF41>
+<25D5> <25D5> <CF6C>
+<25D6> <25D6> <CF8A>
+<25D7> <25D7> <CD98>
+<25D8> <25D8> <CFA0>
+<25D9> <25D9> <CF7C>
+<25DA> <25DA> <CD90>
+<25DB> <25DB> <CF75>
+<25DC> <25DC> <CE87>
+<25DD> <25DD> <CF93>
+<25DE> <25DE> <CF58>
+<25DF> <25DF> <CF94>
+<25E0> <25E0> <CF4E>
+<25E1> <25E1> <CF5C>
+<25E2> <25E2> <C09B>
+<25E3> <25E3> <BA56>
+<25E4> <25E4> <B961>
+<25E5> <25E5> <BB65>
+<25E6> <25E6> <BA60>
+<25E7> <25E7> <BA6A>
+endbfrange
+
+100 beginbfrange
+<25E8> <25E8> <BA44>
+<25E9> <25E9> <BB58>
+<25EA> <25EA> <BA84>
+<25EB> <25EB> <BA8D>
+<25EC> <25EC> <BA88>
+<25ED> <25ED> <BB66>
+<25EE> <25EE> <BB5B>
+<25EF> <25EF> <C59C>
+<25F0> <25F0> <C641>
+<25F1> <25F1> <D155>
+<25F2> <25F2> <C175>
+<25F3> <25F3> <BC63>
+<25F4> <25F4> <BC67>
+<25F5> <25F5> <BC52>
+<25F6> <25F6> <BF7B>
+<25F7> <25F7> <FB9F>
+<25F8> <25F8> <DA8E>
+<25F9> <25F9> <E189>
+<25FA> <25FA> <E187>
+<25FB> <25FB> <FB7A>
+<25FC> <25FC> <DC4F>
+<25FD> <25FD> <DB84>
+<25FE> <25FE> <DC56>
+<25FF> <25FF> <DC45>
+<2600> <2600> <DB8B>
+<2601> <2601> <DC5D>
+<2602> <2602> <DC51>
+<2603> <2603> <DC57>
+<2604> <2604> <DC55>
+<2605> <2605> <DC62>
+<2606> <2606> <DB98>
+<2607> <2607> <DC6B>
+<2608> <2608> <DC67>
+<2609> <2609> <D378>
+<260A> <260A> <D37A>
+<260B> <260B> <EC6E>
+<260C> <260C> <EC5A>
+<260D> <260D> <EC56>
+<260E> <260E> <EC5C>
+<260F> <260F> <FD5A>
+<2610> <2610> <FD65>
+<2611> <2611> <FD5F>
+<2612> <2612> <FD66>
+<2613> <2613> <FD62>
+<2614> <2614> <FD6C>
+<2615> <2615> <FD72>
+<2616> <2616> <FD70>
+<2617> <2617> <FD7D>
+<2618> <2619> <FC77>
+<261A> <261A> <FC83>
+<261B> <261B> <D787>
+<261C> <261C> <E88E>
+<261D> <261D> <E759>
+<261E> <261E> <F49C>
+<261F> <261F> <F499>
+<2620> <2620> <F545>
+<2621> <2621> <F547>
+<2622> <2622> <F552>
+<2623> <2623> <F77C>
+<2624> <2624> <B764>
+<2625> <2625> <F556>
+<2626> <2626> <F763>
+<2627> <2627> <F554>
+<2628> <2628> <F571>
+<2629> <2629> <F55E>
+<262A> <262A> <F56E>
+<262B> <262B> <F562>
+<262C> <262C> <F771>
+<262D> <262D> <F56F>
+<262E> <262E> <F561>
+<262F> <262F> <F75C>
+<2630> <2630> <F586>
+<2631> <2631> <F77E>
+<2632> <2632> <F696>
+<2633> <2633> <F69E>
+<2634> <2634> <F688>
+<2635> <2635> <F69C>
+<2636> <2636> <F585>
+<2637> <2637> <F58F>
+<2638> <2638> <F58C>
+<2639> <2639> <F661>
+<263A> <263A> <F59B>
+<263B> <263C> <F64E>
+<263D> <263D> <F645>
+<263E> <263E> <F648>
+<263F> <263F> <F64B>
+<2640> <2640> <F641>
+<2641> <2641> <F646>
+<2642> <2642> <F654>
+<2643> <2643> <F5A0>
+<2644> <2644> <F658>
+<2645> <2645> <F599>
+<2646> <2646> <F761>
+<2647> <2647> <F66C>
+<2648> <2648> <F674>
+<2649> <2649> <F671>
+<264A> <264A> <F676>
+<264B> <264B> <F66D>
+<264C> <264C> <F663>
+<264D> <264D> <F685>
+endbfrange
+
+100 beginbfrange
+<264E> <264E> <F697>
+<264F> <264F> <F692>
+<2650> <2650> <F68D>
+<2651> <2651> <F68A>
+<2652> <2652> <F68E>
+<2653> <2653> <F698>
+<2654> <2654> <F742>
+<2655> <2655> <F74C>
+<2656> <2656> <F6A0>
+<2657> <2657> <F69A>
+<2658> <2658> <F749>
+<2659> <2659> <F75A>
+<265A> <265A> <F758>
+<265B> <265B> <F756>
+<265C> <265C> <F76B>
+<265D> <265D> <ED5E>
+<265E> <265E> <ED58>
+<265F> <265F> <ED64>
+<2660> <2660> <FA58>
+<2661> <2661> <F374>
+<2662> <2662> <F379>
+<2663> <2663> <F378>
+<2664> <2664> <F47C>
+<2665> <2665> <F475>
+<2666> <2666> <F08B>
+<2667> <2667> <F090>
+<2668> <2668> <F457>
+<2669> <2669> <FC74>
+<266A> <266A> <FC6F>
+<266B> <266B> <D26F>
+<266C> <266C> <E99B>
+<266D> <266D> <E56C>
+<266E> <266E> <8F95>
+<266F> <266F> <CA4E>
+<2670> <2670> <C075>
+<2671> <2671> <FD69>
+<2672> <2672> <878E>
+<2673> <2673> <FC8A>
+<2674> <2674> <8766>
+<2675> <2675> <F38C>
+<2676> <2676> <D17D>
+<2677> <2677> <B759>
+<2678> <2678> <EF57>
+<2679> <2679> <E978>
+<267A> <267A> <F445>
+<267B> <267B> <DE92>
+<267C> <267C> <8FA1>
+<267D> <267D> <B782>
+<267E> <267E> <EF7C>
+<267F> <267F> <82ED>
+<2680> <2680> <CB4B>
+<2681> <2681> <838D>
+<2682> <2682> <92D4>
+<2683> <2683> <8477>
+<2684> <2684> <B197>
+<2685> <2685> <C06E>
+<2686> <2686> <95D1>
+<2687> <2687> <B274>
+<2688> <2688> <FB75>
+<2689> <2689> <87D3>
+<268A> <268A> <FC71>
+<268B> <268B> <9DF7>
+<268C> <268C> <91BA>
+<268D> <268D> <B289>
+<268E> <268E> <9E85>
+<268F> <268F> <FC49>
+<2690> <2690> <D060>
+<2691> <2691> <EA56>
+<2692> <2692> <ED61>
+<2693> <2693> <BB60>
+<2694> <2694> <BF79>
+<2695> <2695> <ED46>
+<2696> <2696> <FC44>
+<2697> <2697> <87D5>
+<2698> <2698> <EF55>
+<2699> <2699> <9985>
+<269A> <269A> <C09D>
+<269B> <269B> <BC61>
+<269C> <269C> <8253>
+<269D> <269D> <C04D>
+<269E> <269E> <FB79>
+<269F> <269F> <87BB>
+<26A0> <26A0> <F450>
+<26A1> <26A1> <C899>
+<26A2> <26A2> <B652>
+<26A3> <26A3> <BB6E>
+<26A4> <26A4> <F376>
+<26A5> <26A5> <EB62>
+<26A6> <26A6> <BF40>
+<26A7> <26A7> <D175>
+<26A8> <26A8> <B370>
+<26A9> <26B2> <A2A1>
+<26B3> <26F1> <A840>
+<26F2> <26FF> <A880>
+<2700> <2707> <A88E>
+<2708> <271F> <A940>
+<2720> <2721> <A959>
+<2722> <2722> <A95C>
+<2723> <2741> <A960>
+<2742> <2757> <A980>
+endbfrange
+
+100 beginbfrange
+<2758> <2790> <8140>
+<2791> <2795> <817A>
+<2796> <279B> <8180>
+<279C> <27FF> <8187>
+<2800> <2801> <81EB>
+<2802> <2809> <81EE>
+<280A> <2811> <81F7>
+<2812> <2824> <8240>
+<2825> <2832> <8254>
+<2833> <2843> <8263>
+<2844> <2848> <8275>
+<2849> <284A> <827B>
+<284B> <284B> <827E>
+<284C> <284D> <8281>
+<284E> <2859> <8284>
+<285A> <286D> <8291>
+<286E> <288F> <82A6>
+<2890> <28A6> <82CA>
+<28A7> <28A7> <82E2>
+<28A8> <28AF> <82E5>
+<28B0> <28B3> <82EE>
+<28B4> <28B7> <82F3>
+<28B8> <28B8> <82FA>
+<28B9> <28BB> <82FC>
+<28BC> <28BC> <8340>
+<28BD> <28BF> <8342>
+<28C0> <28C1> <8346>
+<28C2> <28C4> <8349>
+<28C5> <28CA> <834D>
+<28CB> <28CD> <8354>
+<28CE> <28D3> <8358>
+<28D4> <28D9> <835F>
+<28DA> <28E4> <8367>
+<28E5> <28E9> <8373>
+<28EA> <28EA> <8379>
+<28EB> <28EB> <837B>
+<28EC> <28EC> <837D>
+<28ED> <28F1> <8381>
+<28F2> <28F3> <8387>
+<28F4> <28F5> <838B>
+<28F6> <28FB> <838E>
+<28FC> <28FF> <8395>
+<2900> <2904> <8399>
+<2905> <290B> <839F>
+<290C> <290F> <83A7>
+<2910> <2911> <83AC>
+<2912> <291A> <83B1>
+<291B> <2928> <83BB>
+<2929> <2954> <83CA>
+<2955> <295C> <83F7>
+<295D> <296C> <8440>
+<296D> <298C> <8451>
+<298D> <298E> <8472>
+<298F> <2990> <8475>
+<2991> <2997> <8478>
+<2998> <2999> <8480>
+<299A> <29A4> <8483>
+<29A5> <29A7> <848F>
+<29A8> <29B0> <8494>
+<29B1> <29B3> <849E>
+<29B4> <29B4> <84A4>
+<29B5> <29B6> <84A7>
+<29B7> <29D1> <84AA>
+<29D2> <29DE> <84C6>
+<29DF> <29DF> <84D4>
+<29E0> <29E0> <84D6>
+<29E1> <29E1> <84D8>
+<29E2> <29E3> <84DB>
+<29E4> <29EF> <84DE>
+<29F0> <29F2> <84EB>
+<29F3> <29F4> <84EF>
+<29F5> <29FF> <84F2>
+<2A00> <2A01> <84FD>
+<2A02> <2A12> <8540>
+<2A13> <2A13> <8553>
+<2A14> <2A1C> <8555>
+<2A1D> <2A23> <855F>
+<2A24> <2A3B> <8567>
+<2A3C> <2A42> <8580>
+<2A43> <2A45> <8588>
+<2A46> <2A4B> <858C>
+<2A4C> <2A4E> <8593>
+<2A4F> <2A4F> <8597>
+<2A50> <2A58> <8599>
+<2A59> <2A67> <85A3>
+<2A68> <2AB3> <85B3>
+<2AB4> <2ABD> <8640>
+<2ABE> <2AC6> <864B>
+<2AC7> <2AD9> <8655>
+<2ADA> <2AEF> <8669>
+<2AF0> <2AFF> <8680>
+<2B00> <2B05> <8690>
+<2B06> <2B07> <8697>
+<2B08> <2B0E> <869A>
+<2B0F> <2B36> <86A2>
+<2B37> <2B37> <86CB>
+<2B38> <2B38> <86CD>
+<2B39> <2B3A> <86CF>
+<2B3B> <2B44> <86D2>
+<2B45> <2B47> <86DE>
+endbfrange
+
+100 beginbfrange
+<2B48> <2B4D> <86E2>
+<2B4E> <2B52> <86E9>
+<2B53> <2B57> <86EF>
+<2B58> <2B61> <86F5>
+<2B62> <2B64> <8741>
+<2B65> <2B68> <8745>
+<2B69> <2B69> <874A>
+<2B6A> <2B6B> <874D>
+<2B6C> <2B72> <8750>
+<2B73> <2B74> <8758>
+<2B75> <2B75> <875D>
+<2B76> <2B76> <875F>
+<2B77> <2B7B> <8761>
+<2B7C> <2B8E> <8767>
+<2B8F> <2B90> <877B>
+<2B91> <2B91> <877E>
+<2B92> <2B92> <8780>
+<2B93> <2B95> <8783>
+<2B96> <2B96> <8787>
+<2B97> <2B97> <8789>
+<2B98> <2B99> <878B>
+<2B9A> <2B9D> <878F>
+<2B9E> <2BA1> <8794>
+<2BA2> <2BA5> <8799>
+<2BA6> <2BAA> <879E>
+<2BAB> <2BAD> <87A4>
+<2BAE> <2BB8> <87A8>
+<2BB9> <2BB9> <87B4>
+<2BBA> <2BBE> <87B6>
+<2BBF> <2BC1> <87BC>
+<2BC2> <2BC2> <87C1>
+<2BC3> <2BC9> <87C3>
+<2BCA> <2BCB> <87CD>
+<2BCC> <2BCD> <87D0>
+<2BCE> <2BCE> <87D4>
+<2BCF> <2BD2> <87D6>
+<2BD3> <2BEE> <87DB>
+<2BEF> <2BEF> <87F9>
+<2BF0> <2BF3> <87FB>
+<2BF4> <2BF5> <8842>
+<2BF6> <2BF6> <8845>
+<2BF7> <2BFF> <8847>
+<2C00> <2C2E> <8850>
+<2C2F> <2C68> <8880>
+<2C69> <2C79> <88BB>
+<2C7A> <2C80> <88CD>
+<2C81> <2C82> <88D5>
+<2C83> <2C89> <88D8>
+<2C8A> <2C8E> <88E0>
+<2C8F> <2C9A> <88E6>
+<2C9B> <2C9C> <88F4>
+<2C9D> <2CA4> <88F7>
+<2CA5> <2CAF> <8940>
+<2CB0> <2CB0> <894D>
+<2CB1> <2CB1> <894F>
+<2CB2> <2CB4> <8951>
+<2CB5> <2CBC> <8955>
+<2CBD> <2CBD> <895E>
+<2CBE> <2CCA> <8960>
+<2CCB> <2CCD> <896E>
+<2CCE> <2CD7> <8972>
+<2CD8> <2CD9> <897D>
+<2CDA> <2CE4> <8980>
+<2CE5> <2CF1> <898C>
+<2CF2> <2CF5> <899A>
+<2CF6> <2CFC> <899F>
+<2CFD> <2CFD> <89A7>
+<2CFE> <2CFF> <89A9>
+<2D00> <2D03> <89AB>
+<2D04> <2D0D> <89B0>
+<2D0E> <2D10> <89BB>
+<2D11> <2D13> <89C1>
+<2D14> <2D14> <89C7>
+<2D15> <2D19> <89C9>
+<2D1A> <2D1B> <89CF>
+<2D1C> <2D21> <89D2>
+<2D22> <2D23> <89D9>
+<2D24> <2D3B> <89DC>
+<2D3C> <2D45> <89F5>
+<2D46> <2D46> <8A40>
+<2D47> <2D5D> <8A42>
+<2D5E> <2D5E> <8A5B>
+<2D5F> <2D5F> <8A5D>
+<2D60> <2D79> <8A5F>
+<2D7A> <2D7E> <8A7A>
+<2D7F> <2DE2> <8A80>
+<2DE3> <2DFC> <8AE5>
+<2DFD> <2DFF> <8B40>
+<2E00> <2E00> <8B43>
+<2E01> <2E04> <8B45>
+<2E05> <2E34> <8B4A>
+<2E35> <2E38> <8B7B>
+<2E39> <2E44> <8B80>
+<2E45> <2E55> <8B8D>
+<2E56> <2E69> <8B9F>
+<2E6A> <2E6E> <8BB4>
+<2E6F> <2E72> <8BBA>
+<2E73> <2E79> <8BBF>
+<2E7A> <2E7A> <8BC7>
+<2E7B> <2E84> <8BCA>
+endbfrange
+
+100 beginbfrange
+<2E85> <2E8B> <8BD5>
+<2E8C> <2E93> <8BDD>
+<2E94> <2E98> <8BE6>
+<2E99> <2E9C> <8BEC>
+<2E9D> <2EAA> <8BF1>
+<2EAB> <2EAE> <8C40>
+<2EAF> <2EB8> <8C45>
+<2EB9> <2EBF> <8C50>
+<2EC0> <2EC3> <8C58>
+<2EC4> <2EE5> <8C5D>
+<2EE6> <2EF0> <8C80>
+<2EF1> <2EF1> <8C8C>
+<2EF2> <2EF2> <8C90>
+<2EF3> <2EF8> <8C93>
+<2EF9> <2EFF> <8C9B>
+<2F00> <2F00> <8CA5>
+<2F01> <2F18> <8CA8>
+<2F19> <2F29> <8CC1>
+<2F2A> <2F2A> <8CD4>
+<2F2B> <2F2D> <8CD6>
+<2F2E> <2F4C> <8CDA>
+<2F4D> <2F51> <8CFA>
+<2F52> <2F84> <8D40>
+<2F85> <2F85> <8D74>
+<2F86> <2F8A> <8D76>
+<2F8B> <2F8D> <8D7C>
+<2F8E> <2F95> <8D80>
+<2F96> <2F9B> <8D89>
+<2F9C> <2FA9> <8D90>
+<2FAA> <2FC3> <8D9F>
+<2FC4> <2FEB> <8DBA>
+<2FEC> <2FEC> <8DE3>
+<2FED> <2FEE> <8DE5>
+<2FEF> <2FFD> <8DE8>
+<2FFE> <2FFF> <8DF8>
+<3000> <3003> <8DFA>
+<3004> <3009> <8E40>
+<300A> <3018> <8E47>
+<3019> <3019> <8E57>
+<301A> <301A> <8E59>
+<301B> <3027> <8E5B>
+<3028> <302C> <8E69>
+<302D> <302D> <8E6F>
+<302E> <303B> <8E71>
+<303C> <3055> <8E81>
+<3056> <3058> <8E9C>
+<3059> <305C> <8EA0>
+<305D> <305E> <8EA5>
+<305F> <3062> <8EA8>
+<3063> <3063> <8EAD>
+<3064> <3071> <8EAF>
+<3072> <3075> <8EBF>
+<3076> <3076> <8EC4>
+<3077> <307D> <8EC6>
+<307E> <3084> <8ECF>
+<3085> <3098> <8ED8>
+<3099> <30AA> <8EED>
+<30AB> <30BC> <8F40>
+<30BD> <30C2> <8F57>
+<30C3> <30C8> <8F5E>
+<30C9> <30E2> <8F65>
+<30E3> <30E8> <8F80>
+<30E9> <30E9> <8F87>
+<30EA> <30F5> <8F89>
+<30F6> <30F6> <8F96>
+<30F7> <30F9> <8F98>
+<30FA> <30FA> <8F9C>
+<30FB> <30FD> <8F9E>
+<30FE> <30FF> <8FA2>
+<3100> <3118> <8FA4>
+<3119> <311E> <8FBE>
+<311F> <311F> <8FC5>
+<3120> <3125> <8FC7>
+<3126> <312F> <8FCE>
+<3130> <3155> <8FD9>
+<3156> <3194> <9040>
+<3195> <31B1> <9080>
+<31B2> <31CC> <909F>
+<31CD> <31D1> <90BB>
+<31D2> <31D4> <90C2>
+<31D5> <31E9> <90C6>
+<31EA> <31F9> <90DD>
+<31FA> <31FB> <90EE>
+<31FC> <31FF> <90F1>
+<3200> <3201> <90F5>
+<3202> <3208> <90F8>
+<3209> <320A> <9140>
+<320B> <3212> <9143>
+<3213> <3213> <914C>
+<3214> <3216> <914E>
+<3217> <3218> <9152>
+<3219> <321B> <9156>
+<321C> <321D> <915B>
+<321E> <3220> <915E>
+<3221> <3221> <9162>
+<3222> <322B> <9164>
+<322C> <3232> <916F>
+<3233> <3235> <9177>
+<3236> <3237> <917D>
+<3238> <323B> <9180>
+endbfrange
+
+100 beginbfrange
+<323C> <3243> <9185>
+<3244> <3246> <918E>
+<3247> <3247> <9192>
+<3248> <324A> <9194>
+<324B> <324D> <9198>
+<324E> <325A> <919C>
+<325B> <3268> <91AC>
+<3269> <326B> <91BC>
+<326C> <326E> <91C0>
+<326F> <3277> <91C4>
+<3278> <3279> <91CE>
+<327A> <327A> <91D3>
+<327B> <327B> <91D5>
+<327C> <327C> <91D7>
+<327D> <3281> <91DA>
+<3282> <3283> <91E0>
+<3284> <328A> <91E3>
+<328B> <328F> <91EB>
+<3290> <3290> <91F1>
+<3291> <329C> <91F3>
+<329D> <32DB> <9240>
+<32DC> <32FF> <9280>
+<3300> <3311> <92A4>
+<3312> <3328> <92B7>
+<3329> <3329> <92CF>
+<332A> <332C> <92D1>
+<332D> <3336> <92D5>
+<3337> <3353> <92E1>
+<3354> <3363> <9340>
+<3364> <336F> <9351>
+<3370> <3381> <935E>
+<3382> <3386> <9371>
+<3387> <338E> <9377>
+<338F> <339A> <9380>
+<339B> <33AA> <938D>
+<33AB> <33B1> <939E>
+<33B2> <33B2> <93A6>
+<33B3> <33BE> <93A8>
+<33BF> <33C1> <93B5>
+<33C2> <33C3> <93B9>
+<33C4> <33C4> <93BC>
+<33C5> <33CC> <93BE>
+<33CD> <33D4> <93C7>
+<33D5> <33DB> <93D0>
+<33DC> <33DE> <93D8>
+<33DF> <33E2> <93DD>
+<33E3> <33E4> <93E2>
+<33E5> <33E7> <93E6>
+<33E8> <33E8> <93EA>
+<33E9> <33E9> <93EE>
+<33EA> <33EA> <93F0>
+<33EB> <33EC> <93F2>
+<33ED> <33F0> <93F6>
+<33F1> <33F3> <93FB>
+<33F4> <33F7> <9440>
+<33F8> <33FF> <9445>
+<3400> <3401> <944E>
+<3402> <3402> <9454>
+<3403> <3404> <9456>
+<3405> <3406> <9459>
+<3407> <3407> <945E>
+<3408> <340B> <9460>
+<340C> <340C> <9465>
+<340D> <3413> <9467>
+<3414> <3416> <946F>
+<3417> <3417> <9473>
+<3418> <3418> <9475>
+<3419> <3419> <9477>
+<341A> <341A> <9479>
+<341B> <341E> <947B>
+<341F> <3422> <9483>
+<3423> <343A> <9489>
+<343B> <344B> <94A2>
+<344C> <344C> <94B4>
+<344D> <3455> <94B6>
+<3456> <3460> <94C1>
+<3461> <346B> <94CD>
+<346C> <3472> <94D9>
+<3473> <3490> <94E1>
+<3491> <34C2> <9540>
+<34C3> <34CE> <9573>
+<34CF> <34D1> <9580>
+<34D2> <34EB> <9584>
+<34EC> <34FE> <95A0>
+<34FF> <34FF> <95B4>
+<3500> <3504> <95B5>
+<3505> <3518> <95BB>
+<3519> <3519> <95D0>
+<351A> <351A> <95D3>
+<351B> <3526> <95D5>
+<3527> <352B> <95E2>
+<352C> <3534> <95E8>
+<3535> <353A> <95F2>
+<353B> <353F> <95F9>
+<3540> <3555> <9640>
+<3556> <357A> <9657>
+<357B> <357C> <967D>
+<357D> <35FB> <9680>
+<35FC> <35FF> <9740>
+<3600> <3622> <9744>
+endbfrange
+
+100 beginbfrange
+<3623> <3626> <9768>
+<3627> <3627> <976D>
+<3628> <3637> <976F>
+<3638> <364D> <9780>
+<364E> <3652> <9798>
+<3653> <3657> <979E>
+<3658> <3672> <97A4>
+<3673> <36A0> <97C0>
+<36A1> <36A8> <97EF>
+<36A9> <36AF> <97F8>
+<36B0> <36B4> <9840>
+<36B5> <36B7> <9846>
+<36B8> <36BC> <984A>
+<36BD> <36DD> <9850>
+<36DE> <36DE> <9872>
+<36DF> <36E9> <9874>
+<36EA> <36EA> <9880>
+<36EB> <36F3> <9882>
+<36F4> <36FF> <988D>
+<3700> <3706> <9899>
+<3707> <370F> <98A1>
+<3710> <371A> <98AB>
+<371B> <371C> <98B8>
+<371D> <3728> <98BB>
+<3729> <372B> <98C8>
+<372C> <372F> <98CC>
+<3730> <3731> <98D1>
+<3732> <3740> <98D4>
+<3741> <3749> <98E6>
+<374A> <374B> <98F0>
+<374C> <3757> <98F3>
+<3758> <375A> <9940>
+<375B> <375B> <9944>
+<375C> <377B> <9946>
+<377C> <3782> <9967>
+<3783> <3788> <996F>
+<3789> <378C> <9976>
+<378D> <378F> <997C>
+<3790> <3794> <9980>
+<3795> <3797> <9986>
+<3798> <379B> <998A>
+<379C> <379D> <998F>
+<379E> <37A4> <9992>
+<37A5> <37B3> <999A>
+<37B4> <37B9> <99AA>
+<37BA> <37BA> <99B2>
+<37BB> <37C1> <99B6>
+<37C2> <37C2> <99BF>
+<37C3> <37C3> <99C1>
+<37C4> <37C9> <99C3>
+<37CA> <37CD> <99CA>
+<37CE> <37CF> <99CF>
+<37D0> <37D7> <99D2>
+<37D8> <37DC> <99DB>
+<37DD> <37E0> <99E1>
+<37E1> <37E2> <99E6>
+<37E3> <37E5> <99E9>
+<37E6> <37EC> <99ED>
+<37ED> <37F6> <99F5>
+<37F7> <37FF> <9A40>
+<3800> <3800> <9A49>
+<3801> <380C> <9A4B>
+<380D> <3819> <9A58>
+<381A> <381A> <9A66>
+<381B> <3823> <9A68>
+<3824> <3827> <9A72>
+<3828> <382E> <9A78>
+<382F> <3836> <9A80>
+<3837> <3839> <9A89>
+<383A> <383D> <9A8D>
+<383E> <3842> <9A92>
+<3843> <3844> <9A98>
+<3845> <3846> <9A9C>
+<3847> <3849> <9A9F>
+<384A> <384F> <9AA4>
+<3850> <3874> <9AAB>
+<3875> <3879> <9AD1>
+<387A> <387C> <9AD7>
+<387D> <3883> <9ADB>
+<3884> <3884> <9AE3>
+<3885> <389D> <9AE6>
+<389E> <38DC> <9B40>
+<38DD> <38FF> <9B80>
+<3900> <392D> <9BA3>
+<392E> <3937> <9BD2>
+<3938> <3959> <9BDD>
+<395A> <396C> <9C40>
+<396D> <3971> <9C54>
+<3972> <3972> <9C5B>
+<3973> <398A> <9C5D>
+<398B> <398D> <9C76>
+<398E> <3992> <9C7A>
+<3993> <3998> <9C80>
+<3999> <39AE> <9C87>
+<39AF> <39BB> <9C9E>
+<39BC> <39D9> <9CAC>
+<39DA> <39DD> <9CCB>
+<39DE> <39F3> <9CD0>
+<39F4> <39F7> <9CE8>
+<39F8> <39F8> <9CED>
+endbfrange
+
+100 beginbfrange
+<39F9> <39FF> <9CEF>
+<3A00> <3A04> <9CF6>
+<3A05> <3A06> <9CFC>
+<3A07> <3A08> <9D40>
+<3A09> <3A0B> <9D43>
+<3A0C> <3A10> <9D48>
+<3A11> <3A11> <9D4E>
+<3A12> <3A22> <9D50>
+<3A23> <3A28> <9D62>
+<3A29> <3A2C> <9D6A>
+<3A2D> <3A2E> <9D6F>
+<3A2F> <3A31> <9D72>
+<3A32> <3A36> <9D76>
+<3A37> <3A37> <9D7C>
+<3A38> <3A38> <9D7E>
+<3A39> <3A42> <9D80>
+<3A43> <3A44> <9D8B>
+<3A45> <3A47> <9D8E>
+<3A48> <3A4E> <9D92>
+<3A4F> <3A55> <9D9A>
+<3A56> <3A59> <9DA3>
+<3A5A> <3A5D> <9DA8>
+<3A5E> <3A61> <9DAE>
+<3A62> <3A6B> <9DB4>
+<3A6C> <3A72> <9DBF>
+<3A73> <3A74> <9DC7>
+<3A75> <3A77> <9DCA>
+<3A78> <3A7B> <9DCE>
+<3A7C> <3A7D> <9DD3>
+<3A7E> <3A88> <9DD6>
+<3A89> <3A96> <9DE3>
+<3A97> <3A98> <9DF2>
+<3A99> <3A9A> <9DF5>
+<3A9B> <3A9C> <9DF8>
+<3A9D> <3A9E> <9DFB>
+<3A9F> <3A9F> <9DFE>
+<3AA0> <3AA4> <9E40>
+<3AA5> <3AA6> <9E46>
+<3AA7> <3AAE> <9E4A>
+<3AAF> <3AAF> <9E53>
+<3AB0> <3AB0> <9E55>
+<3AB1> <3AB6> <9E57>
+<3AB7> <3AB8> <9E5F>
+<3AB9> <3AB9> <9E62>
+<3ABA> <3ABC> <9E64>
+<3ABD> <3AC0> <9E68>
+<3AC1> <3AC2> <9E6D>
+<3AC3> <3AC4> <9E70>
+<3AC5> <3AC5> <9E73>
+<3AC6> <3ACA> <9E76>
+<3ACB> <3ACC> <9E7D>
+<3ACD> <3AD1> <9E80>
+<3AD2> <3AD2> <9E86>
+<3AD3> <3ADB> <9E88>
+<3ADC> <3ADF> <9E92>
+<3AE0> <3AE9> <9E98>
+<3AEA> <3AEC> <9EA3>
+<3AED> <3AEE> <9EA7>
+<3AEF> <3AF2> <9EAA>
+<3AF3> <3AF6> <9EAF>
+<3AF7> <3AF8> <9EB5>
+<3AF9> <3AFF> <9EB8>
+<3B00> <3B35> <9EBF>
+<3B36> <3B3E> <9EF6>
+<3B3F> <3B4C> <9F40>
+<3B4D> <3B6C> <9F4F>
+<3B6D> <3B7B> <9F70>
+<3B7C> <3B8D> <9F80>
+<3B8E> <3B92> <9F93>
+<3B93> <3B9F> <9F99>
+<3BA0> <3BA1> <9FA7>
+<3BA2> <3BA3> <9FAA>
+<3BA4> <3BBF> <9FAD>
+<3BC0> <3BC2> <9FCA>
+<3BC3> <3BD5> <9FCE>
+<3BD6> <3BDE> <9FE2>
+<3BDF> <3BE0> <9FEC>
+<3BE1> <3BE5> <9FEF>
+<3BE6> <3BED> <9FF5>
+<3BEE> <3BEE> <9FFE>
+<3BEF> <3BF1> <A040>
+<3BF2> <3BF3> <A044>
+<3BF4> <3BF5> <A047>
+<3BF6> <3BF9> <A04A>
+<3BFA> <3BFE> <A04F>
+<3BFF> <3BFF> <A055>
+<3C00> <3C03> <A056>
+<3C04> <3C09> <A05B>
+<3C0A> <3C0A> <A062>
+<3C0B> <3C17> <A064>
+<3C18> <3C19> <A072>
+<3C1A> <3C23> <A075>
+<3C24> <3C33> <A081>
+<3C34> <3C35> <A092>
+<3C36> <3C36> <A095>
+<3C37> <3C48> <A097>
+<3C49> <3C5D> <A0AA>
+<3C5E> <3C6B> <A0C0>
+<3C6C> <3C75> <A0CF>
+<3C76> <3C79> <A0DA>
+endbfrange
+
+100 beginbfrange
+<3C7A> <3C88> <A0DF>
+<3C89> <3C98> <A0EF>
+<3C99> <3CA5> <AA40>
+<3CA6> <3CC7> <AA4F>
+<3CC8> <3CC8> <AA72>
+<3CC9> <3CCB> <AA74>
+<3CCC> <3CCD> <AA78>
+<3CCE> <3CD0> <AA7C>
+<3CD1> <3CEA> <AA80>
+<3CEB> <3CEB> <AA9B>
+<3CEC> <3CEC> <AA9E>
+<3CED> <3CED> <AAA0>
+<3CEE> <3CEF> <AB41>
+<3CF0> <3CF0> <AB44>
+<3CF1> <3CF1> <AB47>
+<3CF2> <3CF3> <AB4B>
+<3CF4> <3CFF> <AB4E>
+<3D00> <3D24> <AB5A>
+<3D25> <3D45> <AB80>
+<3D46> <3D4B> <AC40>
+<3D4C> <3D75> <AC47>
+<3D76> <3D7F> <AC72>
+<3D80> <3D81> <AC7D>
+<3D82> <3D8E> <AC80>
+<3D8F> <3D93> <AC8E>
+<3D94> <3D9F> <AC95>
+<3DA0> <3DA8> <AD40>
+<3DA9> <3DBC> <AD4A>
+<3DBD> <3DBE> <AD5F>
+<3DBF> <3DC4> <AD62>
+<3DC5> <3DCF> <AD69>
+<3DD0> <3DD9> <AD75>
+<3DDA> <3DDB> <AD80>
+<3DDC> <3DDF> <AD83>
+<3DE0> <3DE2> <AD88>
+<3DE3> <3DE7> <AD8C>
+<3DE8> <3DF6> <AD92>
+<3DF7> <3DFF> <AE40>
+<3E00> <3E0A> <AE49>
+<3E0B> <3E17> <AE55>
+<3E18> <3E33> <AE63>
+<3E34> <3E37> <AE81>
+<3E38> <3E3C> <AE86>
+<3E3D> <3E44> <AE8C>
+<3E45> <3E4F> <AE95>
+<3E50> <3E73> <AF40>
+<3E74> <3E89> <AF65>
+<3E8A> <3E8C> <AF7C>
+<3E8D> <3E8E> <AF80>
+<3E8F> <3E98> <AF84>
+<3E99> <3E99> <AF90>
+<3E9A> <3EA3> <AF92>
+<3EA4> <3EA5> <AF9D>
+<3EA6> <3EA6> <AFA0>
+<3EA7> <3EA7> <B040>
+<3EA8> <3EA8> <B043>
+<3EA9> <3EB2> <B045>
+<3EB3> <3EB6> <B050>
+<3EB7> <3EB8> <B055>
+<3EB9> <3EB9> <B05A>
+<3EBA> <3EBA> <B05C>
+<3EBB> <3EBB> <B05E>
+<3EBC> <3EC2> <B065>
+<3EC3> <3ED2> <B06D>
+<3ED3> <3ED3> <B07E>
+<3ED4> <3EEA> <B080>
+<3EEB> <3EEB> <B098>
+<3EEC> <3EF2> <B09A>
+<3EF3> <3EFD> <B140>
+<3EFE> <3EFE> <B14C>
+<3EFF> <3EFF> <B14E>
+<3F00> <3F00> <B151>
+<3F01> <3F2C> <B153>
+<3F2D> <3F43> <B180>
+<3F44> <3F4C> <B198>
+<3F4D> <3F4D> <B240>
+<3F4E> <3F72> <B242>
+<3F73> <3F77> <B268>
+<3F78> <3F7D> <B26E>
+<3F7E> <3F87> <B275>
+<3F88> <3F8F> <B281>
+<3F90> <3F9F> <B28A>
+<3FA0> <3FA5> <B29B>
+<3FA6> <3FA8> <B340>
+<3FA9> <3FD4> <B344>
+<3FD5> <3FE2> <B371>
+<3FE3> <3FEA> <B380>
+<3FEB> <3FED> <B389>
+<3FEE> <3FEE> <B38D>
+<3FEF> <3FFF> <B38F>
+<4000> <4000> <B3A0>
+<4001> <4014> <B440>
+<4015> <4017> <B455>
+<4018> <401C> <B459>
+<401D> <401D> <B460>
+<401E> <4030> <B462>
+<4031> <4038> <B476>
+<4039> <403B> <B480>
+<403C> <4040> <B484>
+<4041> <4049> <B48A>
+endbfrange
+
+100 beginbfrange
+<404A> <4056> <B494>
+<4057> <4057> <B540>
+<4058> <4060> <B542>
+<4061> <406A> <B54C>
+<406B> <406D> <B557>
+<406E> <4071> <B55D>
+<4072> <408E> <B562>
+<408F> <40AA> <B580>
+<40AB> <40AD> <B59E>
+<40AE> <40BF> <B640>
+<40C0> <40C1> <B653>
+<40C2> <40C4> <B656>
+<40C5> <40C5> <B65A>
+<40C6> <40E7> <B65D>
+<40E8> <40FF> <B680>
+<4100> <4108> <B698>
+<4109> <4116> <B740>
+<4117> <4118> <B74F>
+<4119> <411F> <B752>
+<4120> <4129> <B75A>
+<412A> <4139> <B767>
+<413A> <413F> <B779>
+<4140> <4140> <B781>
+<4141> <415E> <B783>
+<415F> <4161> <B840>
+<4162> <4162> <B845>
+<4163> <4168> <B847>
+<4169> <416B> <B84E>
+<416C> <4173> <B852>
+<4174> <4174> <B85C>
+<4175> <4175> <B85F>
+<4176> <418B> <B861>
+<418C> <4192> <B878>
+<4193> <4194> <B880>
+<4195> <41B2> <B883>
+<41B3> <41C2> <B940>
+<41C3> <41D2> <B951>
+<41D3> <41EB> <B962>
+<41EC> <41EE> <B97C>
+<41EF> <41FF> <B980>
+<4200> <420B> <B991>
+<420C> <420D> <B99E>
+<420E> <420F> <BA40>
+<4210> <4210> <BA43>
+<4211> <4221> <BA45>
+<4222> <4223> <BA57>
+<4224> <4229> <BA5A>
+<422A> <4232> <BA61>
+<4233> <423B> <BA6B>
+<423C> <4245> <BA75>
+<4246> <4249> <BA80>
+<424A> <424A> <BA85>
+<424B> <424B> <BA87>
+<424C> <424F> <BA89>
+<4250> <425F> <BA8E>
+<4260> <4260> <BAA0>
+<4261> <4268> <BB41>
+<4269> <4276> <BB4A>
+<4277> <4278> <BB59>
+<4279> <427B> <BB5D>
+<427C> <427F> <BB61>
+<4280> <4280> <BB67>
+<4281> <4281> <BB69>
+<4282> <4284> <BB6B>
+<4285> <4294> <BB6F>
+<4295> <42B5> <BB80>
+<42B6> <42C7> <BC40>
+<42C8> <42CD> <BC54>
+<42CE> <42D3> <BC5B>
+<42D4> <42D4> <BC62>
+<42D5> <42D5> <BC64>
+<42D6> <42D6> <BC66>
+<42D7> <42D7> <BC68>
+<42D8> <42DA> <BC6A>
+<42DB> <42DB> <BC6E>
+<42DC> <42DC> <BC70>
+<42DD> <42DD> <BC72>
+<42DE> <42DE> <BC7A>
+<42DF> <42E0> <BC7C>
+<42E1> <42E2> <BC80>
+<42E3> <42E3> <BC85>
+<42E4> <42E4> <BC87>
+<42E5> <42E7> <BC8C>
+<42E8> <42F1> <BC90>
+<42F2> <42F4> <BC9E>
+<42F5> <42F6> <BD40>
+<42F7> <42F7> <BD44>
+<42F8> <42F9> <BD46>
+<42FA> <42FA> <BD4A>
+<42FB> <42FB> <BD4C>
+<42FC> <42FC> <BD4E>
+<42FD> <42FF> <BD50>
+<4300> <4303> <BD53>
+<4304> <4304> <BD58>
+<4305> <4310> <BD5A>
+<4311> <4312> <BD68>
+<4313> <4315> <BD6C>
+<4316> <4316> <BD70>
+<4317> <431D> <BD72>
+<431E> <431F> <BD7C>
+endbfrange
+
+100 beginbfrange
+<4320> <4320> <BD80>
+<4321> <4327> <BD82>
+<4328> <4328> <BD8A>
+<4329> <432A> <BD8C>
+<432B> <432B> <BD8F>
+<432C> <4330> <BD92>
+<4331> <4333> <BD98>
+<4334> <4338> <BD9C>
+<4339> <433B> <BE40>
+<433C> <433C> <BE44>
+<433D> <433F> <BE46>
+<4340> <4345> <BE4B>
+<4346> <4346> <BE54>
+<4347> <4349> <BE5A>
+<434A> <434A> <BE61>
+<434B> <434E> <BE65>
+<434F> <4350> <BE6A>
+<4351> <4352> <BE6D>
+<4353> <4357> <BE71>
+<4358> <4358> <BE78>
+<4359> <435A> <BE7A>
+<435B> <435D> <BE80>
+<435E> <435E> <BE85>
+<435F> <435F> <BE88>
+<4360> <4361> <BE8A>
+<4362> <4362> <BE8D>
+<4363> <4364> <BE90>
+<4365> <4366> <BE93>
+<4367> <4367> <BE96>
+<4368> <4368> <BE99>
+<4369> <4369> <BE9B>
+<436A> <436B> <BE9D>
+<436C> <436C> <BEA0>
+<436D> <4378> <BF41>
+<4379> <437C> <BF51>
+<437D> <4385> <BF57>
+<4386> <4386> <BF61>
+<4387> <4389> <BF65>
+<438A> <438C> <BF69>
+<438D> <438F> <BF6D>
+<4390> <4390> <BF71>
+<4391> <4392> <BF74>
+<4393> <4393> <BF78>
+<4394> <4394> <BF7D>
+<4395> <4396> <BF80>
+<4397> <439B> <BF84>
+<439C> <43A5> <BF8B>
+<43A6> <43A6> <BF96>
+<43A7> <43AA> <BF99>
+<43AB> <43AD> <BF9E>
+<43AE> <43B0> <C041>
+<43B1> <43B6> <C045>
+<43B7> <43B7> <C04E>
+<43B8> <43B9> <C053>
+<43BA> <43BE> <C056>
+<43BF> <43C0> <C05C>
+<43C1> <43C8> <C061>
+<43C9> <43C9> <C06A>
+<43CA> <43CA> <C06C>
+<43CB> <43CB> <C06F>
+<43CC> <43CE> <C071>
+<43CF> <43CF> <C076>
+<43D0> <43D0> <C078>
+<43D1> <43D2> <C07A>
+<43D3> <43D4> <C07D>
+<43D5> <43EF> <C080>
+<43F0> <43F0> <C09C>
+<43F1> <43F3> <C09E>
+<43F4> <43FF> <C140>
+<4400> <4403> <C14C>
+<4404> <4406> <C151>
+<4407> <4410> <C155>
+<4411> <4411> <C161>
+<4412> <4423> <C163>
+<4424> <4425> <C176>
+<4426> <442B> <C179>
+<442C> <4440> <C180>
+<4441> <444B> <C196>
+<444C> <4459> <C240>
+<445A> <446F> <C24F>
+<4470> <4470> <C266>
+<4471> <4485> <C268>
+<4486> <4486> <C27E>
+<4487> <448A> <C280>
+<448B> <4498> <C285>
+<4499> <4499> <C297>
+<449A> <449A> <C29B>
+<449B> <449D> <C29D>
+<449E> <449F> <C341>
+<44A0> <44D6> <C344>
+<44D7> <44D9> <C37C>
+<44DA> <44DD> <C380>
+<44DE> <44F3> <C385>
+<44F4> <44F8> <C39C>
+<44F9> <44FF> <C440>
+<4500> <4501> <C447>
+<4502> <4503> <C44A>
+<4504> <450A> <C44D>
+<450B> <450D> <C455>
+<450E> <450F> <C459>
+endbfrange
+
+100 beginbfrange
+<4510> <4516> <C45C>
+<4517> <4529> <C464>
+<452A> <452B> <C478>
+<452C> <452F> <C47B>
+<4530> <4530> <C480>
+<4531> <453F> <C482>
+<4540> <4543> <C494>
+<4544> <4544> <C499>
+<4545> <4545> <C49B>
+<4546> <4549> <C49D>
+<454A> <454D> <C540>
+<454E> <454E> <C545>
+<454F> <4552> <C547>
+<4553> <4557> <C54D>
+<4558> <4563> <C553>
+<4564> <4566> <C560>
+<4567> <457E> <C567>
+<457F> <4591> <C580>
+<4592> <4599> <C594>
+<459A> <459A> <C59D>
+<459B> <459C> <C59F>
+<459D> <459D> <C640>
+<459E> <459F> <C642>
+<45A0> <45A1> <C645>
+<45A2> <45BC> <C648>
+<45BD> <45CA> <C664>
+<45CB> <45D6> <C673>
+<45D7> <45F7> <C680>
+<45F8> <45FF> <C740>
+<4600> <461D> <C748>
+<461E> <4625> <C767>
+<4626> <462B> <C770>
+<462C> <462F> <C777>
+<4630> <4632> <C77C>
+<4633> <4653> <C780>
+<4654> <4654> <C840>
+<4655> <4661> <C842>
+<4662> <4663> <C850>
+<4664> <4676> <C853>
+<4677> <467D> <C867>
+<467E> <468C> <C86F>
+<468D> <4693> <C880>
+<4694> <469D> <C888>
+<469E> <469E> <C893>
+<469F> <46A2> <C895>
+<46A3> <46A5> <C89A>
+<46A6> <46A8> <C89E>
+<46A9> <46B7> <C940>
+<46B8> <46D4> <C951>
+<46D5> <46D5> <C96F>
+<46D6> <46DB> <C971>
+<46DC> <46E2> <C978>
+<46E3> <46F1> <C980>
+<46F2> <46FC> <C991>
+<46FD> <46FF> <C99D>
+<4700> <4700> <C9A0>
+<4701> <470E> <CA40>
+<470F> <4715> <CA4F>
+<4716> <4717> <CA57>
+<4718> <4719> <CA5A>
+<471A> <471D> <CA5D>
+<471E> <4729> <CA62>
+<472A> <472C> <CA6F>
+<472D> <4730> <CA73>
+<4731> <4733> <CA78>
+<4734> <4734> <CA7D>
+<4735> <4735> <CA80>
+<4736> <473C> <CA82>
+<473D> <4740> <CA8A>
+<4741> <4742> <CA90>
+<4743> <4749> <CA93>
+<474A> <474F> <CA9B>
+<4750> <4752> <CB40>
+<4753> <4753> <CB44>
+<4754> <4754> <CB46>
+<4755> <4757> <CB48>
+<4758> <4759> <CB4C>
+<475A> <4761> <CB4F>
+<4762> <4766> <CB58>
+<4767> <4767> <CB5E>
+<4768> <4771> <CB60>
+<4772> <4781> <CB6B>
+<4782> <4783> <CB7D>
+<4784> <478A> <CB80>
+<478B> <4790> <CB88>
+<4791> <4793> <CB8F>
+<4794> <479C> <CB93>
+<479D> <479D> <CB9D>
+<479E> <479F> <CB9F>
+<47A0> <47A6> <CC42>
+<47A7> <47A9> <CC4C>
+<47AA> <47B5> <CC50>
+<47B6> <47B8> <CC5D>
+<47B9> <47BB> <CC61>
+<47BC> <47C3> <CC65>
+<47C4> <47CE> <CC6E>
+<47CF> <47D1> <CC7A>
+<47D2> <47D2> <CC7E>
+<47D3> <47E0> <CC80>
+<47E1> <47E5> <CC8F>
+endbfrange
+
+100 beginbfrange
+<47E6> <47E6> <CC95>
+<47E7> <47EC> <CC97>
+<47ED> <47EF> <CC9E>
+<47F0> <47FF> <CD40>
+<4800> <482E> <CD50>
+<482F> <483E> <CD80>
+<483F> <4845> <CD91>
+<4846> <484D> <CD99>
+<484E> <4874> <CE40>
+<4875> <487E> <CE68>
+<487F> <488A> <CE73>
+<488B> <488B> <CE80>
+<488C> <4890> <CE82>
+<4891> <48A3> <CE88>
+<48A4> <48A5> <CE9C>
+<48A6> <48A7> <CE9F>
+<48A8> <48B5> <CF40>
+<48B6> <48BB> <CF4F>
+<48BC> <48BD> <CF56>
+<48BE> <48C0> <CF59>
+<48C1> <48CF> <CF5D>
+<48D0> <48D5> <CF6D>
+<48D6> <48D6> <CF74>
+<48D7> <48D8> <CF76>
+<48D9> <48DB> <CF79>
+<48DC> <48DD> <CF7D>
+<48DE> <48DE> <CF80>
+<48DF> <48E5> <CF82>
+<48E6> <48ED> <CF8B>
+<48EE> <48F6> <CF95>
+<48F7> <48F7> <CF9F>
+<48F8> <48FF> <D040>
+<4900> <4904> <D048>
+<4905> <4907> <D04E>
+<4908> <490A> <D052>
+<490B> <4910> <D056>
+<4911> <4913> <D05D>
+<4914> <4919> <D061>
+<491A> <491D> <D068>
+<491E> <491E> <D06D>
+<491F> <492C> <D06F>
+<492D> <492D> <D07E>
+<492E> <494E> <D080>
+<494F> <4963> <D140>
+<4964> <4966> <D156>
+<4967> <496D> <D15A>
+<496E> <497F> <D163>
+<4980> <4986> <D176>
+<4987> <4987> <D17E>
+<4988> <49A4> <D180>
+<49A5> <49A6> <D19F>
+<49A7> <49A8> <D241>
+<49A9> <49B1> <D244>
+<49B2> <49BF> <D24E>
+<49C0> <49C5> <D25D>
+<49C6> <49C8> <D265>
+<49C9> <49CC> <D269>
+<49CD> <49CD> <D26E>
+<49CE> <49CF> <D270>
+<49D0> <49D1> <D273>
+<49D2> <49DA> <D276>
+<49DB> <49E4> <D280>
+<49E5> <49E7> <D28B>
+<49E8> <49EA> <D28F>
+<49EB> <49EC> <D293>
+<49ED> <49ED> <D296>
+<49EE> <49F5> <D298>
+<49F6> <49F9> <D340>
+<49FA> <49FC> <D345>
+<49FD> <49FD> <D349>
+<49FE> <49FF> <D34B>
+<4A00> <4A01> <D34E>
+<4A02> <4A05> <D351>
+<4A06> <4A07> <D356>
+<4A08> <4A09> <D359>
+<4A0A> <4A0A> <D35C>
+<4A0B> <4A23> <D35F>
+<4A24> <4A24> <D379>
+<4A25> <4A25> <D37B>
+<4A26> <4A27> <D37D>
+<4A28> <4A2C> <D380>
+<4A2D> <4A2F> <D388>
+<4A30> <4A30> <D38C>
+<4A31> <4A31> <D38E>
+<4A32> <4A32> <D390>
+<4A33> <4A33> <D392>
+<4A34> <4A35> <D394>
+<4A36> <4A36> <D397>
+<4A37> <4A37> <D39A>
+<4A38> <4A39> <D39C>
+<4A3A> <4A3A> <D39F>
+<4A3B> <4A3B> <D440>
+<4A3C> <4A3E> <D442>
+<4A3F> <4A3F> <D446>
+<4A40> <4A43> <D448>
+<4A44> <4A45> <D44D>
+<4A46> <4A48> <D450>
+<4A49> <4A4A> <D454>
+<4A4B> <4A4B> <D457>
+<4A4C> <4A4E> <D459>
+endbfrange
+
+100 beginbfrange
+<4A4F> <4A53> <D45D>
+<4A54> <4A57> <D463>
+<4A58> <4A5D> <D468>
+<4A5E> <4A5E> <D46F>
+<4A5F> <4A5F> <D471>
+<4A60> <4A60> <D473>
+<4A61> <4A62> <D476>
+<4A63> <4A64> <D479>
+<4A65> <4A66> <D47C>
+<4A67> <4A68> <D480>
+<4A69> <4A6A> <D485>
+<4A6B> <4A6C> <D488>
+<4A6D> <4A6D> <D48B>
+<4A6E> <4A6E> <D490>
+<4A6F> <4A6F> <D495>
+<4A70> <4A74> <D497>
+<4A75> <4A76> <D49D>
+<4A77> <4A77> <D4A0>
+<4A78> <4A7A> <D540>
+<4A7B> <4A7D> <D547>
+<4A7E> <4A80> <D54B>
+<4A81> <4A81> <D550>
+<4A82> <4A83> <D552>
+<4A84> <4A84> <D555>
+<4A85> <4A87> <D557>
+<4A88> <4A88> <D55B>
+<4A89> <4A89> <D55E>
+<4A8A> <4A8A> <D563>
+<4A8B> <4A8D> <D565>
+<4A8E> <4A90> <D569>
+<4A91> <4A91> <D56D>
+<4A92> <4A94> <D56F>
+<4A95> <4A96> <D573>
+<4A97> <4A98> <D576>
+<4A99> <4A9A> <D579>
+<4A9B> <4A9C> <D57C>
+<4A9D> <4A9D> <D580>
+<4A9E> <4A9F> <D582>
+<4AA0> <4AA0> <D585>
+<4AA1> <4AA1> <D587>
+<4AA2> <4AA2> <D589>
+<4AA3> <4AA3> <D58B>
+<4AA4> <4AA4> <D58D>
+<4AA5> <4AA7> <D590>
+<4AA8> <4AAA> <D595>
+<4AAB> <4AAB> <D59A>
+<4AAC> <4AAE> <D59C>
+<4AAF> <4AAF> <D5A0>
+<4AB0> <4AB0> <D641>
+<4AB1> <4AB3> <D644>
+<4AB4> <4AB4> <D648>
+<4AB5> <4AB6> <D64B>
+<4AB7> <4AB7> <D64E>
+<4AB8> <4AB9> <D650>
+<4ABA> <4ABA> <D655>
+<4ABB> <4ABB> <D657>
+<4ABC> <4ABC> <D659>
+<4ABD> <4ABD> <D65B>
+<4ABE> <4ABE> <D65F>
+<4ABF> <4AC1> <D662>
+<4AC2> <4AC4> <D666>
+<4AC5> <4AC5> <D66A>
+<4AC6> <4AC8> <D66C>
+<4AC9> <4AC9> <D670>
+<4ACA> <4ACA> <D673>
+<4ACB> <4ACB> <D677>
+<4ACC> <4ACE> <D679>
+<4ACF> <4AD0> <D67D>
+<4AD1> <4AD3> <D680>
+<4AD4> <4AD5> <D684>
+<4AD6> <4ADA> <D689>
+<4ADB> <4ADF> <D68F>
+<4AE0> <4AE3> <D695>
+<4AE4> <4AEA> <D69A>
+<4AEB> <4AED> <D740>
+<4AEE> <4AF1> <D744>
+<4AF2> <4AF7> <D74A>
+<4AF8> <4AF8> <D751>
+<4AF9> <4AF9> <D755>
+<4AFA> <4AFF> <D757>
+<4B00> <4B06> <D75D>
+<4B07> <4B08> <D765>
+<4B09> <4B0B> <D769>
+<4B0C> <4B0D> <D76D>
+<4B0E> <4B12> <D770>
+<4B13> <4B14> <D776>
+<4B15> <4B1A> <D779>
+<4B1B> <4B1D> <D780>
+<4B1E> <4B20> <D784>
+<4B21> <4B23> <D788>
+<4B24> <4B24> <D78D>
+<4B25> <4B29> <D790>
+<4B2A> <4B2A> <D796>
+<4B2B> <4B33> <D798>
+<4B34> <4B40> <D840>
+<4B41> <4B45> <D84E>
+<4B46> <4B70> <D854>
+<4B71> <4B80> <D880>
+<4B81> <4B81> <D892>
+<4B82> <4B85> <D896>
+endbfrange
+
+100 beginbfrange
+<4B86> <4B86> <D8A0>
+<4B87> <4B87> <D940>
+<4B88> <4B88> <D943>
+<4B89> <4B89> <D947>
+<4B8A> <4B8A> <D94B>
+<4B8B> <4B8B> <D950>
+<4B8C> <4B8C> <D958>
+<4B8D> <4B8D> <D95B>
+<4B8E> <4B93> <D95D>
+<4B94> <4B94> <D966>
+<4B95> <4B98> <D968>
+<4B99> <4B99> <D96D>
+<4B9A> <4B9A> <D96F>
+<4B9B> <4B9B> <D971>
+<4B9C> <4B9C> <D977>
+<4B9D> <4B9E> <D97A>
+<4B9F> <4BA4> <D981>
+<4BA5> <4BA9> <D988>
+<4BAA> <4BAE> <D992>
+<4BAF> <4BB0> <D999>
+<4BB1> <4BB1> <D99C>
+<4BB2> <4BB2> <D99F>
+<4BB3> <4BB3> <DA40>
+<4BB4> <4BB8> <DA43>
+<4BB9> <4BBC> <DA49>
+<4BBD> <4BE0> <DA4F>
+<4BE1> <4BE3> <DA74>
+<4BE4> <4BEA> <DA78>
+<4BEB> <4BEF> <DA80>
+<4BF0> <4BF7> <DA86>
+<4BF8> <4BFF> <DA8F>
+<4C00> <4C09> <DA97>
+<4C0A> <4C29> <DB40>
+<4C2A> <4C40> <DB61>
+<4C41> <4C46> <DB79>
+<4C47> <4C4A> <DB80>
+<4C4B> <4C50> <DB85>
+<4C51> <4C5C> <DB8C>
+<4C5D> <4C64> <DB99>
+<4C65> <4C69> <DC40>
+<4C6A> <4C72> <DC46>
+<4C73> <4C73> <DC52>
+<4C74> <4C74> <DC54>
+<4C75> <4C79> <DC58>
+<4C7A> <4C7D> <DC5E>
+<4C7E> <4C80> <DC63>
+<4C81> <4C83> <DC68>
+<4C84> <4C93> <DC6C>
+<4C94> <4C95> <DC7D>
+<4C96> <4C9C> <DC80>
+<4C9D> <4C9F> <DC8B>
+<4CA0> <4CA0> <DC8F>
+<4CA1> <4CA6> <DC91>
+<4CA7> <4CA9> <DC98>
+<4CAA> <4CAD> <DC9C>
+<4CAE> <4CB3> <DD40>
+<4CB4> <4CB9> <DD47>
+<4CBA> <4CBE> <DD4E>
+<4CBF> <4CBF> <DD58>
+<4CC0> <4CC3> <DD5A>
+<4CC4> <4CC4> <DD5F>
+<4CC5> <4CC5> <DD61>
+<4CC6> <4CC6> <DD63>
+<4CC7> <4CCD> <DD66>
+<4CCE> <4CCE> <DD6E>
+<4CCF> <4CD3> <DD71>
+<4CD4> <4CD7> <DD7B>
+<4CD8> <4CD8> <DD80>
+<4CD9> <4CDA> <DD83>
+<4CDB> <4CDE> <DD87>
+<4CDF> <4CE1> <DD8C>
+<4CE2> <4CE5> <DD90>
+<4CE6> <4CE7> <DD95>
+<4CE8> <4CE9> <DD98>
+<4CEA> <4CEB> <DD9C>
+<4CEC> <4CEC> <DD9F>
+<4CED> <4CEE> <DE42>
+<4CEF> <4CF1> <DE45>
+<4CF2> <4CF6> <DE4A>
+<4CF7> <4CFF> <DE50>
+<4D00> <4D00> <DE59>
+<4D01> <4D01> <DE5B>
+<4D02> <4D02> <DE5E>
+<4D03> <4D0D> <DE60>
+<4D0E> <4D10> <DE6C>
+<4D11> <4D1C> <DE73>
+<4D1D> <4D2E> <DE80>
+<4D2F> <4D3A> <DE93>
+<4D3B> <4D3B> <DEA0>
+<4D3C> <4D3C> <DF41>
+<4D3D> <4D46> <DF43>
+<4D47> <4D54> <DF4E>
+<4D55> <4D55> <DF5D>
+<4D56> <4D58> <DF61>
+<4D59> <4D59> <DF65>
+<4D5A> <4D5A> <DF67>
+<4D5B> <4D5E> <DF69>
+<4D5F> <4D64> <DF6E>
+<4D65> <4D66> <DF75>
+<4D67> <4D67> <DF79>
+endbfrange
+
+100 beginbfrange
+<4D68> <4D68> <DF7B>
+<4D69> <4D69> <DF7D>
+<4D6A> <4D6B> <DF81>
+<4D6C> <4D6C> <DF84>
+<4D6D> <4D6F> <DF86>
+<4D70> <4D85> <DF8B>
+<4D86> <4D95> <E040>
+<4D96> <4DA1> <E051>
+<4DA2> <4DAC> <E05E>
+<4DAD> <4DAE> <E06A>
+<4DAF> <4DB6> <E06D>
+<4DB7> <4DB7> <E076>
+<4DB8> <4DB8> <E078>
+<4DB9> <4DBD> <E07A>
+<4DBE> <4DC4> <E080>
+<4DC5> <4DC9> <E088>
+<4DCA> <4DCA> <E08E>
+<4DCB> <4DCB> <E091>
+<4DCC> <4DCC> <E093>
+<4DCD> <4DCE> <E095>
+<4DCF> <4DD7> <E098>
+<4DD8> <4DD9> <E140>
+<4DDA> <4DFA> <E143>
+<4DFB> <4DFD> <E165>
+<4DFE> <4DFF> <E169>
+<4E00> <4E08> <E16B>
+<4E09> <4E11> <E176>
+<4E12> <4E15> <E180>
+<4E16> <4E16> <E186>
+<4E17> <4E17> <E188>
+<4E18> <4E19> <E18A>
+<4E1A> <4E1A> <E18D>
+<4E1B> <4E1B> <E192>
+<4E1C> <4E1D> <E196>
+<4E1E> <4E22> <E199>
+<4E23> <4E23> <E1A0>
+<4E24> <4E24> <E240>
+<4E25> <4E25> <E242>
+<4E26> <4E30> <E244>
+<4E31> <4E31> <E250>
+<4E32> <4E32> <E252>
+<4E33> <4E37> <E255>
+<4E38> <4E39> <E25C>
+<4E3A> <4E3C> <E25F>
+<4E3D> <4E3F> <E264>
+<4E40> <4E40> <E269>
+<4E41> <4E42> <E26C>
+<4E43> <4E4A> <E270>
+<4E4B> <4E4E> <E279>
+<4E4F> <4E4F> <E27E>
+<4E50> <4E55> <E283>
+<4E56> <4E56> <E28A>
+<4E57> <4E58> <E28C>
+<4E59> <4E5A> <E290>
+<4E5B> <4E5C> <E296>
+<4E5D> <4E60> <E29C>
+<4E61> <4E62> <E340>
+<4E63> <4E65> <E344>
+<4E66> <4E68> <E348>
+<4E69> <4E6B> <E34C>
+<4E6C> <4E6C> <E350>
+<4E6D> <4E6E> <E352>
+<4E6F> <4E70> <E356>
+<4E71> <4E73> <E359>
+<4E74> <4E76> <E35D>
+<4E77> <4E7B> <E361>
+<4E7C> <4E84> <E368>
+<4E85> <4E85> <E372>
+<4E86> <4E88> <E375>
+<4E89> <4E8A> <E37A>
+<4E8B> <4E8B> <E37D>
+<4E8C> <4E95> <E380>
+<4E96> <4E96> <E38B>
+<4E97> <4E98> <E38D>
+<4E99> <4E99> <E390>
+<4E9A> <4E9A> <E392>
+<4E9B> <4E9B> <E394>
+<4E9C> <4E9E> <E396>
+<4E9F> <4EA0> <E39A>
+<4EA1> <4EA1> <E39D>
+<4EA2> <4EA2> <E3A0>
+<4EA3> <4EA5> <E445>
+<4EA6> <4EAA> <E449>
+<4EAB> <4EAB> <E44F>
+<4EAC> <4EAC> <E451>
+<4EAD> <4EB0> <E454>
+<4EB1> <4EB1> <E459>
+<4EB2> <4EB2> <E45B>
+<4EB3> <4EB3> <E45D>
+<4EB4> <4EB6> <E45F>
+<4EB7> <4EB8> <E463>
+<4EB9> <4EBA> <E466>
+<4EBB> <4EC4> <E469>
+<4EC5> <4EC5> <E474>
+<4EC6> <4EC8> <E476>
+<4EC9> <4EC9> <E47D>
+<4ECA> <4ECA> <E480>
+<4ECB> <4ECC> <E482>
+<4ECD> <4ED0> <E489>
+<4ED1> <4ED1> <E48E>
+endbfrange
+
+100 beginbfrange
+<4ED2> <4ED4> <E490>
+<4ED5> <4ED8> <E494>
+<4ED9> <4EDC> <E499>
+<4EDD> <4EDD> <E4A0>
+<4EDE> <4EE3> <E540>
+<4EE4> <4EE4> <E547>
+<4EE5> <4EE6> <E549>
+<4EE7> <4EE8> <E54C>
+<4EE9> <4EEB> <E552>
+<4EEC> <4EEC> <E557>
+<4EED> <4EEF> <E559>
+<4EF0> <4EF0> <E55D>
+<4EF1> <4EF2> <E55F>
+<4EF3> <4EF4> <E562>
+<4EF5> <4EF6> <E566>
+<4EF7> <4EF8> <E56A>
+<4EF9> <4EF9> <E56D>
+<4EFA> <4EFF> <E56F>
+<4F00> <4F00> <E577>
+<4F01> <4F02> <E579>
+<4F03> <4F04> <E57D>
+<4F05> <4F05> <E580>
+<4F06> <4F06> <E582>
+<4F07> <4F0C> <E584>
+<4F0D> <4F0F> <E58B>
+<4F10> <4F11> <E58F>
+<4F12> <4F19> <E592>
+<4F1A> <4F1C> <E59C>
+<4F1D> <4F1D> <E5A0>
+<4F1E> <4F20> <E641>
+<4F21> <4F24> <E645>
+<4F25> <4F27> <E64B>
+<4F28> <4F2A> <E64F>
+<4F2B> <4F2D> <E653>
+<4F2E> <4F2E> <E657>
+<4F2F> <4F30> <E659>
+<4F31> <4F32> <E65C>
+<4F33> <4F3C> <E65F>
+<4F3D> <4F3D> <E66A>
+<4F3E> <4F46> <E66C>
+<4F47> <4F48> <E677>
+<4F49> <4F49> <E67B>
+<4F4A> <4F4A> <E67E>
+<4F4B> <4F4B> <E681>
+<4F4C> <4F4C> <E683>
+<4F4D> <4F4E> <E685>
+<4F4F> <4F4F> <E688>
+<4F50> <4F51> <E68A>
+<4F52> <4F57> <E68D>
+<4F58> <4F5A> <E694>
+<4F5B> <4F5D> <E698>
+<4F5E> <4F5F> <E69D>
+<4F60> <4F62> <E740>
+<4F63> <4F66> <E744>
+<4F67> <4F69> <E74A>
+<4F6A> <4F6A> <E751>
+<4F6B> <4F6B> <E754>
+<4F6C> <4F6E> <E756>
+<4F6F> <4F7A> <E75A>
+<4F7B> <4F7B> <E767>
+<4F7C> <4F7C> <E769>
+<4F7D> <4F85> <E76B>
+<4F86> <4F8C> <E775>
+<4F8D> <4F8E> <E77D>
+<4F8F> <4F90> <E780>
+<4F91> <4F91> <E783>
+<4F92> <4F94> <E787>
+<4F95> <4F97> <E78C>
+<4F98> <4F99> <E790>
+<4F9A> <4F9E> <E793>
+<4F9F> <4FA3> <E79B>
+<4FA4> <4FA6> <E840>
+<4FA7> <4FA7> <E845>
+<4FA8> <4FA9> <E847>
+<4FAA> <4FAA> <E84A>
+<4FAB> <4FAD> <E84C>
+<4FAE> <4FB1> <E850>
+<4FB2> <4FB6> <E855>
+<4FB7> <4FB7> <E85B>
+<4FB8> <4FBC> <E85D>
+<4FBD> <4FBD> <E863>
+<4FBE> <4FC8> <E865>
+<4FC9> <4FCA> <E871>
+<4FCB> <4FCB> <E874>
+<4FCC> <4FD1> <E876>
+<4FD2> <4FD3> <E87D>
+<4FD4> <4FD4> <E881>
+<4FD5> <4FD8> <E883>
+<4FD9> <4FD9> <E888>
+<4FDA> <4FDB> <E88A>
+<4FDC> <4FEC> <E890>
+<4FED> <4FF8> <E940>
+<4FF9> <4FFF> <E94D>
+<5000> <5000> <E955>
+<5001> <5002> <E958>
+<5003> <5004> <E95B>
+<5005> <5005> <E95E>
+<5006> <5006> <E961>
+<5007> <5007> <E964>
+<5008> <5008> <E966>
+endbfrange
+
+100 beginbfrange
+<5009> <500B> <E969>
+<500C> <5013> <E96D>
+<5014> <5014> <E976>
+<5015> <5016> <E97A>
+<5017> <5017> <E97E>
+<5018> <501B> <E983>
+<501C> <501E> <E988>
+<501F> <5020> <E98C>
+<5021> <5021> <E98F>
+<5022> <5024> <E995>
+<5025> <5026> <E999>
+<5027> <5027> <E99C>
+<5028> <5028> <E99E>
+<5029> <502B> <EA41>
+<502C> <502E> <EA45>
+<502F> <5033> <EA4B>
+<5034> <5034> <EA51>
+<5035> <5036> <EA53>
+<5037> <5038> <EA57>
+<5039> <505D> <EA5A>
+<505E> <5060> <EA81>
+<5061> <5062> <EA85>
+<5063> <5068> <EA88>
+<5069> <5069> <EA8F>
+<506A> <506D> <EA92>
+<506E> <5076> <EA97>
+<5077> <5077> <EB40>
+<5078> <507A> <EB42>
+<507B> <507C> <EB46>
+<507D> <5086> <EB49>
+<5087> <5087> <EB54>
+<5088> <508C> <EB56>
+<508D> <508D> <EB5C>
+<508E> <508F> <EB5E>
+<5090> <5090> <EB61>
+<5091> <509A> <EB63>
+<509B> <509C> <EB6E>
+<509D> <509D> <EB71>
+<509E> <50A1> <EB74>
+<50A2> <50A6> <EB7A>
+<50A7> <50AB> <EB80>
+<50AC> <50AF> <EB86>
+<50B0> <50C5> <EB8B>
+<50C6> <50CB> <EC40>
+<50CC> <50DA> <EC47>
+<50DB> <50DD> <EC57>
+<50DE> <50DE> <EC5B>
+<50DF> <50E1> <EC5D>
+<50E2> <50EE> <EC61>
+<50EF> <50F5> <EC6F>
+<50F6> <50FD> <EC77>
+<50FE> <50FF> <EC80>
+<5100> <5113> <EC82>
+<5114> <511D> <EC97>
+<511E> <5123> <ED40>
+<5124> <5134> <ED47>
+<5135> <5139> <ED59>
+<513A> <513B> <ED5F>
+<513C> <513D> <ED62>
+<513E> <513E> <ED65>
+<513F> <5144> <ED68>
+<5145> <5149> <ED6F>
+<514A> <514B> <ED75>
+<514C> <514C> <ED78>
+<514D> <5151> <ED7A>
+<5152> <5162> <ED80>
+<5163> <5163> <ED92>
+<5164> <5164> <ED96>
+<5165> <5165> <ED9B>
+<5166> <5166> <ED9D>
+<5167> <5167> <ED9F>
+<5168> <516A> <EE45>
+<516B> <516D> <EE4A>
+<516E> <5171> <EE4E>
+<5172> <5173> <EE53>
+<5174> <5174> <EE56>
+<5175> <517A> <EE58>
+<517B> <517C> <EE5F>
+<517D> <5182> <EE62>
+<5183> <5184> <EE6A>
+<5185> <5185> <EE6D>
+<5186> <518D> <EE6F>
+<518E> <5192> <EE78>
+<5193> <5196> <EE81>
+<5197> <5199> <EE87>
+<519A> <519A> <EE8C>
+<519B> <519C> <EE8E>
+<519D> <519F> <EE91>
+<51A0> <51A1> <EE95>
+<51A2> <51A2> <EE98>
+<51A3> <51A5> <EE9A>
+<51A6> <51A7> <EE9F>
+<51A8> <51A8> <EF43>
+<51A9> <51AE> <EF46>
+<51AF> <51B3> <EF4D>
+<51B4> <51B4> <EF54>
+<51B5> <51B5> <EF56>
+<51B6> <51B7> <EF58>
+<51B8> <51BC> <EF5B>
+<51BD> <51C3> <EF61>
+endbfrange
+
+100 beginbfrange
+<51C4> <51C4> <EF69>
+<51C5> <51C5> <EF6B>
+<51C6> <51CF> <EF6D>
+<51D0> <51D1> <EF78>
+<51D2> <51D2> <EF7B>
+<51D3> <51D4> <EF7D>
+<51D5> <51D6> <EF80>
+<51D7> <51D7> <EF85>
+<51D8> <51D8> <EF87>
+<51D9> <51DA> <EF89>
+<51DB> <51DB> <EF8C>
+<51DC> <51E2> <EF8E>
+<51E3> <51E6> <EF98>
+<51E7> <51E7> <EF9D>
+<51E8> <51E9> <EF9F>
+<51EA> <51EA> <F040>
+<51EB> <51EB> <F043>
+<51EC> <51ED> <F045>
+<51EE> <51F1> <F04A>
+<51F2> <51F3> <F04F>
+<51F4> <51F5> <F052>
+<51F6> <51F7> <F055>
+<51F8> <51FD> <F058>
+<51FE> <51FF> <F05F>
+<5200> <5206> <F061>
+<5207> <5209> <F069>
+<520A> <520D> <F06D>
+<520E> <520E> <F072>
+<520F> <5211> <F075>
+<5212> <5212> <F079>
+<5213> <5214> <F07B>
+<5215> <5218> <F083>
+<5219> <521A> <F089>
+<521B> <521E> <F08C>
+<521F> <521F> <F091>
+<5220> <5222> <F093>
+<5223> <522C> <F097>
+<522D> <523E> <F140>
+<523F> <5240> <F155>
+<5241> <5241> <F158>
+<5242> <524D> <F15B>
+<524E> <525B> <F168>
+<525C> <525C> <F179>
+<525D> <525E> <F17C>
+<525F> <525F> <F181>
+<5260> <5260> <F183>
+<5261> <5261> <F185>
+<5262> <5262> <F187>
+<5263> <526C> <F18A>
+<526D> <526F> <F195>
+<5270> <5277> <F199>
+<5278> <527C> <F240>
+<527D> <527D> <F246>
+<527E> <5280> <F248>
+<5281> <5287> <F24C>
+<5288> <528D> <F256>
+<528E> <528F> <F25D>
+<5290> <52A0> <F260>
+<52A1> <52A1> <F272>
+<52A2> <52A2> <F275>
+<52A3> <52A7> <F277>
+<52A8> <52AC> <F280>
+<52AD> <52AD> <F286>
+<52AE> <52B1> <F28D>
+<52B2> <52B3> <F292>
+<52B4> <52B4> <F295>
+<52B5> <52B9> <F297>
+<52BA> <52BA> <F29D>
+<52BB> <52BC> <F29F>
+<52BD> <52BF> <F342>
+<52C0> <52C1> <F346>
+<52C2> <52C2> <F349>
+<52C3> <52C6> <F34C>
+<52C7> <52D6> <F351>
+<52D7> <52E8> <F362>
+<52E9> <52E9> <F375>
+<52EA> <52EE> <F37A>
+<52EF> <52FA> <F380>
+<52FB> <52FF> <F38D>
+<5300> <530D> <F392>
+<530E> <5312> <F440>
+<5313> <531C> <F446>
+<531D> <5322> <F451>
+<5323> <5323> <F458>
+<5324> <5324> <F45A>
+<5325> <5325> <F45C>
+<5326> <5329> <F45E>
+<532A> <532A> <F463>
+<532B> <533A> <F465>
+<533B> <5340> <F476>
+<5341> <5341> <F47D>
+<5342> <5355> <F480>
+<5356> <5359> <F495>
+<535A> <535B> <F49A>
+<535C> <535F> <F49D>
+<5360> <5364> <F540>
+<5365> <5365> <F546>
+<5366> <536F> <F548>
+<5370> <5370> <F553>
+<5371> <5377> <F557>
+endbfrange
+
+100 beginbfrange
+<5378> <5379> <F55F>
+<537A> <5384> <F563>
+<5385> <5385> <F570>
+<5386> <5391> <F573>
+<5392> <5396> <F580>
+<5397> <539B> <F587>
+<539C> <539C> <F58D>
+<539D> <53A5> <F590>
+<53A6> <53A6> <F59A>
+<53A7> <53AA> <F59C>
+<53AB> <53AB> <F640>
+<53AC> <53AE> <F642>
+<53AF> <53AF> <F647>
+<53B0> <53B1> <F649>
+<53B2> <53B2> <F64D>
+<53B3> <53B6> <F650>
+<53B7> <53B9> <F655>
+<53BA> <53C1> <F659>
+<53C2> <53C2> <F662>
+<53C3> <53CA> <F664>
+<53CB> <53CD> <F66E>
+<53CE> <53CF> <F672>
+<53D0> <53D0> <F675>
+<53D1> <53D7> <F678>
+<53D8> <53DC> <F680>
+<53DD> <53DE> <F686>
+<53DF> <53DF> <F689>
+<53E0> <53E1> <F68B>
+<53E2> <53E4> <F68F>
+<53E5> <53E7> <F693>
+<53E8> <53E8> <F699>
+<53E9> <53E9> <F69B>
+<53EA> <53EA> <F69D>
+<53EB> <53EB> <F69F>
+<53EC> <53ED> <F740>
+<53EE> <53F3> <F743>
+<53F4> <53F5> <F74A>
+<53F6> <53FD> <F74E>
+<53FE> <53FE> <F757>
+<53FF> <53FF> <F759>
+<5400> <5403> <F75D>
+<5404> <5404> <F762>
+<5405> <540B> <F764>
+<540C> <5410> <F76C>
+<5411> <541A> <F772>
+<541B> <541B> <F77D>
+<541C> <543C> <F780>
+<543D> <543E> <F840>
+<543F> <5441> <F843>
+<5442> <5443> <F847>
+<5444> <5449> <F84A>
+<544A> <544A> <F852>
+<544B> <5459> <F854>
+<545A> <545A> <F865>
+<545B> <5465> <F867>
+<5466> <546A> <F873>
+<546B> <546B> <F879>
+<546C> <546C> <F87B>
+<546D> <546E> <F87D>
+<546F> <546F> <F880>
+<5470> <5471> <F882>
+<5472> <5472> <F885>
+<5473> <5478> <F887>
+<5479> <5482> <F88F>
+<5483> <5485> <F89A>
+<5486> <5487> <F89E>
+<5488> <5495> <F940>
+<5496> <549D> <F951>
+<549E> <549F> <F95B>
+<54A0> <54A7> <F95F>
+<54A8> <54A8> <F968>
+<54A9> <54AA> <F96A>
+<54AB> <54AC> <F96D>
+<54AD> <54BB> <F970>
+<54BC> <54C0> <F980>
+<54C1> <54C1> <F986>
+<54C2> <54CA> <F988>
+<54CB> <54CE> <F992>
+<54CF> <54CF> <F997>
+<54D0> <54D7> <F999>
+<54D8> <54D9> <FA40>
+<54DA> <54DC> <FA43>
+<54DD> <54E1> <FA47>
+<54E2> <54E5> <FA4D>
+<54E6> <54EB> <FA52>
+<54EC> <54EE> <FA5A>
+<54EF> <54EF> <FA5E>
+<54F0> <54F0> <FA60>
+<54F1> <54FE> <FA62>
+<54FF> <54FF> <FA71>
+<5500> <5501> <FA72>
+<5502> <5502> <FA75>
+<5503> <5509> <FA78>
+<550A> <550C> <FA80>
+<550D> <5514> <FA85>
+<5515> <5516> <FA8E>
+<5517> <551A> <FA92>
+<551B> <5522> <FA99>
+<5523> <552B> <FB40>
+<552C> <5533> <FB4A>
+endbfrange
+
+43 beginbfrange
+<5534> <5537> <FB53>
+<5538> <5538> <FB59>
+<5539> <5551> <FB5C>
+<5552> <5554> <FB76>
+<5555> <5555> <FB7B>
+<5556> <5556> <FB7E>
+<5557> <5566> <FB80>
+<5567> <5571> <FB91>
+<5572> <5573> <FB9D>
+<5574> <5574> <FBA0>
+<5575> <5578> <FC40>
+<5579> <557C> <FC45>
+<557D> <558C> <FC4A>
+<558D> <5594> <FC5B>
+<5595> <5598> <FC64>
+<5599> <559E> <FC69>
+<559F> <559F> <FC70>
+<55A0> <55A1> <FC72>
+<55A2> <55A3> <FC75>
+<55A4> <55A9> <FC79>
+<55AA> <55AC> <FC80>
+<55AD> <55B2> <FC84>
+<55B3> <55C8> <FC8B>
+<55C9> <55DA> <FD40>
+<55DB> <55DD> <FD54>
+<55DE> <55DE> <FD59>
+<55DF> <55E2> <FD5B>
+<55E3> <55E4> <FD60>
+<55E5> <55E6> <FD63>
+<55E7> <55E7> <FD68>
+<55E8> <55E9> <FD6A>
+<55EA> <55EC> <FD6D>
+<55ED> <55ED> <FD71>
+<55EE> <55F2> <FD73>
+<55F3> <55F6> <FD79>
+<55F7> <55F7> <FD7E>
+<55F8> <55FF> <FD80>
+<5600> <5601> <FD89>
+<5602> <5604> <FD8C>
+<5605> <5607> <FD91>
+<5608> <560F> <FD95>
+<5610> <564D> <FE41>
+<564E> <566E> <FE80>
+endbfrange
+
+endcmap
+CMapName currentdict /CMap defineresource pop
+end
+end
+
+%%EndResource
+%%EOF
diff --git a/src/main/resources/Resources/cmap/Adobe-GB1-GBpc-EUC b/src/main/resources/Resources/cmap/Adobe-GB1-GBpc-EUC
new file mode 100644
index 0000000..0a218ec
--- /dev/null
+++ b/src/main/resources/Resources/cmap/Adobe-GB1-GBpc-EUC
@@ -0,0 +1,197 @@
+%!PS-Adobe-3.0 Resource-CMap
+%%DocumentNeededResources: ProcSet (CIDInit)
+%%IncludeResource: ProcSet (CIDInit)
+%%BeginResource: CMap (Adobe-GB1-GBpc-EUC)
+%%Title: (Adobe-GB1-GBpc-EUC Adobe GBpc-EUC 2)
+%%Version: 4.002
+%%Copyright: -----------------------------------------------------------
+%%Copyright: Copyright 1990-1996 Adobe Systems Incorporated.
+%%Copyright: All Rights Reserved.
+%%Copyright:
+%%Copyright: Patents Pending
+%%Copyright:
+%%Copyright: NOTICE: All information contained herein is the property
+%%Copyright: of Adobe Systems Incorporated.
+%%Copyright:
+%%Copyright: Permission is granted for redistribution of this file
+%%Copyright: provided this copyright notice is maintained intact and
+%%Copyright: that the contents of this file are not altered in any
+%%Copyright: way from its original form.
+%%Copyright:
+%%Copyright: PostScript and Display PostScript are trademarks of
+%%Copyright: Adobe Systems Incorporated which may be registered in
+%%Copyright: certain jurisdictions.
+%%Copyright: -----------------------------------------------------------
+%%EndComments
+
+/CIDInit /ProcSet findresource begin
+
+12 dict begin
+
+begincmap
+
+/CIDSystemInfo 3 dict dup begin
+/Registry (Adobe) def
+/Ordering (Adobe_GB1_GBpc_EUC) def
+/Supplement 2 def
+end def
+
+/CMapName /Adobe-GB1-GBpc-EUC def
+
+/CMapVersion 4.002 def
+/CMapType 1 def
+
+/XUID [1 10 25335 1212] def
+
+/WMode 0 def
+
+1 begincodespacerange
+<0000> <FFFF>
+endcodespacerange
+
+1 beginbfrange
+<0000> <0000> <20>
+endbfrange
+
+% Adobe-GB1-2
+% GBpc-EUC (Macintosh)
+100 beginbfrange
+<0001> <005F> <20>
+<0060> <00BD> <A1A1>
+<00BE> <00EF> <A2B1>
+<00F0> <00F9> <A2E5>
+<00FA> <00FF> <A2F1>
+<0100> <0105> <A2F7>
+<0106> <0163> <A3A1>
+<0164> <01B6> <A4A1>
+<01B7> <01FF> <A5A1>
+<0200> <020C> <A5EA>
+<020D> <0224> <A6A1>
+<0225> <0259> <A6C1>
+<025A> <027A> <A7A1>
+<027B> <029B> <A7D1>
+<029C> <02BB> <A8A1>
+<02BC> <02E1> <A8C5>
+<02E2> <02FF> <A9A4>
+<0300> <032D> <A9C2>
+<032E> <038B> <AAA1>
+<038C> <03AB> <ABA1>
+<03AC> <03FF> <B0A1>
+<0400> <0409> <B0F5>
+<040A> <0467> <B1A1>
+<0468> <04C5> <B2A1>
+<04C6> <04FF> <B3A1>
+<0500> <0523> <B3DB>
+<0524> <0581> <B4A1>
+<0582> <05DF> <B5A1>
+<05E0> <05FF> <B6A1>
+<0600> <063D> <B6C1>
+<063E> <069B> <B7A1>
+<069C> <06F9> <B8A1>
+<06FA> <06FF> <B9A1>
+<0700> <0757> <B9A7>
+<0758> <07B5> <BAA1>
+<07B6> <07FF> <BBA1>
+<0800> <0813> <BBEB>
+<0814> <0871> <BCA1>
+<0872> <08CF> <BDA1>
+<08D0> <08FF> <BEA1>
+<0900> <092D> <BED1>
+<092E> <098B> <BFA1>
+<098C> <09E9> <C0A1>
+<09EA> <09FF> <C1A1>
+<0A00> <0A47> <C1B7>
+<0A48> <0AA5> <C2A1>
+<0AA6> <0AFF> <C3A1>
+<0B00> <0B03> <C3FB>
+<0B04> <0B61> <C4A1>
+<0B62> <0BBF> <C5A1>
+<0BC0> <0BFF> <C6A1>
+<0C00> <0C1D> <C6E1>
+<0C1E> <0C7B> <C7A1>
+<0C7C> <0CD9> <C8A1>
+<0CDA> <0CFF> <C9A1>
+<0D00> <0D37> <C9C7>
+<0D38> <0D95> <CAA1>
+<0D96> <0DF3> <CBA1>
+<0DF4> <0DFF> <CCA1>
+<0E00> <0E51> <CCAD>
+<0E52> <0EAF> <CDA1>
+<0EB0> <0EFF> <CEA1>
+<0F00> <0F0D> <CEF1>
+<0F0E> <0F6B> <CFA1>
+<0F6C> <0FC9> <D0A1>
+<0FCA> <0FFF> <D1A1>
+<1000> <1027> <D1D7>
+<1028> <1085> <D2A1>
+<1086> <10E3> <D3A1>
+<10E4> <10FF> <D4A1>
+<1100> <1141> <D4BD>
+<1142> <119F> <D5A1>
+<11A0> <11FD> <D6A1>
+<11FE> <11FF> <D7A1>
+<1200> <1256> <D7A3>
+<1257> <12B4> <D8A1>
+<12B5> <12FF> <D9A1>
+<1300> <1312> <D9EC>
+<1313> <1370> <DAA1>
+<1371> <13CE> <DBA1>
+<13CF> <13FF> <DCA1>
+<1400> <142C> <DCD2>
+<142D> <148A> <DDA1>
+<148B> <14E8> <DEA1>
+<14E9> <14FF> <DFA1>
+<1500> <1546> <DFB8>
+<1547> <15A4> <E0A1>
+<15A5> <15FF> <E1A1>
+<1600> <1602> <E1FC>
+<1603> <1660> <E2A1>
+<1661> <16BE> <E3A1>
+<16BF> <16FF> <E4A1>
+<1700> <171C> <E4E2>
+<171D> <177A> <E5A1>
+<177B> <17D8> <E6A1>
+<17D9> <17FF> <E7A1>
+<1800> <1836> <E7C8>
+<1837> <1894> <E8A1>
+<1895> <18F2> <E9A1>
+<18F3> <18FF> <EAA1>
+endbfrange
+28 beginbfrange
+<1900> <1950> <EAAE>
+<1951> <19AE> <EBA1>
+<19AF> <19FF> <ECA1>
+<1A00> <1A0C> <ECF2>
+<1A0D> <1A6A> <EDA1>
+<1A6B> <1AC8> <EEA1>
+<1AC9> <1AFF> <EFA1>
+<1B00> <1B26> <EFD8>
+<1B27> <1B84> <F0A1>
+<1B85> <1BE2> <F1A1>
+<1BE3> <1BFF> <F2A1>
+<1C00> <1C40> <F2BE>
+<1C41> <1C9E> <F3A1>
+<1C9F> <1CFC> <F4A1>
+<1CFD> <1CFF> <F5A1>
+<1D00> <1D5A> <F5A4>
+<1D5B> <1DB8> <F6A1>
+<1DB9> <1DFF> <F7A1>
+<1E00> <1E16> <F7E8>
+<1E18> <1E19> <A1AB>
+<1E1A> <1E1A> <A1FE>
+<1E1B> <1E1B> <A3AE>
+<1E1C> <1E1C> <A3BD>
+<1E1D> <1E1D> <A3DB>
+<1E1E> <1E1E> <A3DD>
+<1E1F> <1E1F> <A3FE>
+<1E20> <1E20> <80>
+<1E21> <1E23> <FD>
+endbfrange
+
+endcmap
+CMapName currentdict /CMap defineresource pop
+end
+end
+
+%%EndResource
+%%EOF
diff --git a/src/main/resources/Resources/cmap/Adobe-GB1-H-CID b/src/main/resources/Resources/cmap/Adobe-GB1-H-CID
new file mode 100644
index 0000000..ddcea86
--- /dev/null
+++ b/src/main/resources/Resources/cmap/Adobe-GB1-H-CID
@@ -0,0 +1,94 @@
+%!PS-Adobe-3.0 Resource-CMap
+%%DocumentNeededResources: ProcSet (CIDInit)
+%%IncludeResource: ProcSet (CIDInit)
+%%BeginResource: CMap (Adobe-GB1-H-CID)
+%%Title: (Adobe-GB1-H-CID Adobe GB1 0)
+%%Version: 2.000
+%%Copyright: -----------------------------------------------------------
+%%Copyright: Copyright 1990-2000 Adobe Systems Incorporated.
+%%Copyright: All Rights Reserved.
+%%Copyright:
+%%Copyright: Patents Pending
+%%Copyright:
+%%Copyright: NOTICE: All information contained herein is the property
+%%Copyright: of Adobe Systems Incorporated.
+%%Copyright:
+%%Copyright: Permission is granted for redistribution of this file
+%%Copyright: provided this copyright notice is maintained intact and
+%%Copyright: that the contents of this file are not altered in any
+%%Copyright: way from its original form.
+%%Copyright:
+%%Copyright: PostScript and Display PostScript are trademarks of
+%%Copyright: Adobe Systems Incorporated which may be registered in
+%%Copyright: certain jurisdictions.
+%%Copyright: -----------------------------------------------------------
+%%EndComments
+
+/CIDInit /ProcSet findresource begin
+
+12 dict begin
+
+begincmap
+
+/CIDSystemInfo 3 dict dup begin
+ /Registry (Adobe) def
+ /Ordering (Adobe_GB1_H_CID) def
+ /Supplement 0 def
+end def
+
+/CMapName /Adobe-GB1-H-CID def
+/CMapVersion 2.000 def
+/CMapType 1 def
+
+/UIDOffset 0 def
+
+/WMode 0 def
+
+1 begincodespacerange
+ <0000> <FFFF>
+endcodespacerange
+
+0 usefont
+1 begincidrange
+<0000> <FFFF> 0
+endcidrange
+
+% Map CIDs 1 thru 95 to Ascii codes 0x20 - 0x7F in fontID 1.
+1 usefont
+1 beginbfrange
+<0001> <005F> <20>
+endbfrange
+
+% Map CIDs 7717 - 9896 to fontID 2 for Supplement 1
+2 usefont
+4 begincidrange
+<1E25> <1EFF> 7717
+<1F00> <1FFF> 7936
+<2000> <25FF> 8192
+<2600> <26A8> 9728
+endcidrange
+
+% Map CIDs 9897 - 22126 to fontID 3 for Supplement 2
+3 usefont
+3 begincidrange
+<26A9> <26FF> 9897
+<2700> <55FF> 9984
+<5600> <566E> 22016
+endcidrange
+
+% Map CIDs 22127 - 22352 to fontID 4 for Supplement 3
+% Also map CIDS upto 65535 to this fontID for any future supplements.
+4 usefont
+2 begincidrange
+<566F> <56FF> 22127
+<5700> <FFFF> 22272
+endcidrange
+
+
+endcmap
+CMapName currentdict /CMap defineresource pop
+end
+end
+
+%%EndResource
+%%EOF
diff --git a/src/main/resources/Resources/cmap/Adobe-GB1-H-Host b/src/main/resources/Resources/cmap/Adobe-GB1-H-Host
new file mode 100644
index 0000000..b4d60a2
--- /dev/null
+++ b/src/main/resources/Resources/cmap/Adobe-GB1-H-Host
@@ -0,0 +1,4358 @@
+%!PS-Adobe-3.0 Resource-CMap
+%%DocumentNeededResources: ProcSet (CIDInit)
+%%IncludeResource: ProcSet (CIDInit)
+%%BeginResource: CMap (Adobe-GB1-H-Host)
+%%Title: (Adobe-GB1-H-Host Adobe GBK-EUC 2)
+%%Version: 4.000
+%%Copyright: -----------------------------------------------------------
+%%Copyright: Copyright 1990-1999 Adobe Systems Incorporated.
+%%Copyright: All Rights Reserved.
+%%Copyright:
+%%Copyright: Patents Pending
+%%Copyright:
+%%Copyright: NOTICE: All information contained herein is the property
+%%Copyright: of Adobe Systems Incorporated.
+%%Copyright:
+%%Copyright: Permission is granted for redistribution of this file
+%%Copyright: provided this copyright notice is maintained intact and
+%%Copyright: that the contents of this file are not altered in any
+%%Copyright: way from its original form.
+%%Copyright:
+%%Copyright: PostScript and Display PostScript are trademarks of
+%%Copyright: Adobe Systems Incorporated which may be registered in
+%%Copyright: certain jurisdictions.
+%%Copyright: -----------------------------------------------------------
+%%EndComments
+
+/CIDInit /ProcSet findresource begin
+
+12 dict begin
+
+begincmap
+
+/CIDSystemInfo 3 dict dup begin
+/Registry (Adobe) def
+/Ordering (Adobe_GB1_H_Host) def
+/Supplement 2 def
+end def
+
+/CMapName /Adobe-GB1-H-Host def
+
+/CMapVersion 4.000 def
+/CMapType 1 def
+
+/WMode 0 def
+
+1 begincodespacerange
+<0000> <FFFF>
+endcodespacerange
+
+4 usefont % Subset Fonts
+1 begincidrange
+<0000> <FFFF> 0
+endcidrange
+
+1 usefont % Prop Roman
+1 beginbfrange
+<0001> <005F> <20>
+endbfrange
+
+2 usefont % Halfwidth Roman
+3 beginbfrange
+<032E> <0330> <21>
+<0332> <038A> <25>
+<1E24> <1E24> <20>
+endbfrange
+
+0 usefont % Windows TrueType Font
+100 beginbfrange
+<0060> <00BD> <A1A1>
+<00BE> <00EF> <A2B1>
+<00F0> <00F9> <A2E5>
+<00FA> <00FF> <A2F1>
+<0100> <0105> <A2F7>
+<0106> <0163> <A3A1>
+<0164> <01B6> <A4A1>
+<01B7> <01FF> <A5A1>
+<0200> <020C> <A5EA>
+<020D> <0224> <A6A1>
+<0225> <023C> <A6C1>
+<0259> <0259> <A6F5>
+<025A> <027A> <A7A1>
+<027B> <029B> <A7D1>
+<029C> <02BB> <A8A1>
+<02BC> <02E0> <A8C5>
+<02E2> <02FF> <A9A4>
+<0300> <032D> <A9C2>
+<03AC> <03FF> <B0A1>
+<0400> <0409> <B0F5>
+<040A> <0467> <B1A1>
+<0468> <04C5> <B2A1>
+<04C6> <04FF> <B3A1>
+<0500> <0523> <B3DB>
+<0524> <0581> <B4A1>
+<0582> <05DF> <B5A1>
+<05E0> <05FF> <B6A1>
+<0600> <063D> <B6C1>
+<063E> <069B> <B7A1>
+<069C> <06F9> <B8A1>
+<06FA> <06FF> <B9A1>
+<0700> <0757> <B9A7>
+<0758> <07B5> <BAA1>
+<07B6> <07FF> <BBA1>
+<0800> <0813> <BBEB>
+<0814> <0871> <BCA1>
+<0872> <08CF> <BDA1>
+<08D0> <08FF> <BEA1>
+<0900> <092D> <BED1>
+<092E> <098B> <BFA1>
+<098C> <09E9> <C0A1>
+<09EA> <09FF> <C1A1>
+<0A00> <0A47> <C1B7>
+<0A48> <0AA5> <C2A1>
+<0AA6> <0AFF> <C3A1>
+<0B00> <0B03> <C3FB>
+<0B04> <0B61> <C4A1>
+<0B62> <0BBF> <C5A1>
+<0BC0> <0BFF> <C6A1>
+<0C00> <0C1D> <C6E1>
+<0C1E> <0C7B> <C7A1>
+<0C7C> <0CD9> <C8A1>
+<0CDA> <0CFF> <C9A1>
+<0D00> <0D37> <C9C7>
+<0D38> <0D95> <CAA1>
+<0D96> <0DF3> <CBA1>
+<0DF4> <0DFF> <CCA1>
+<0E00> <0E51> <CCAD>
+<0E52> <0EAF> <CDA1>
+<0EB0> <0EFF> <CEA1>
+<0F00> <0F0D> <CEF1>
+<0F0E> <0F6B> <CFA1>
+<0F6C> <0FC9> <D0A1>
+<0FCA> <0FFF> <D1A1>
+<1000> <1027> <D1D7>
+<1028> <1085> <D2A1>
+<1086> <10E3> <D3A1>
+<10E4> <10FF> <D4A1>
+<1100> <1141> <D4BD>
+<1142> <119F> <D5A1>
+<11A0> <11FD> <D6A1>
+<11FE> <11FF> <D7A1>
+<1200> <1256> <D7A3>
+<1257> <12B4> <D8A1>
+<12B5> <12FF> <D9A1>
+<1300> <1312> <D9EC>
+<1313> <1370> <DAA1>
+<1371> <13CE> <DBA1>
+<13CF> <13FF> <DCA1>
+<1400> <142C> <DCD2>
+<142D> <148A> <DDA1>
+<148B> <14E8> <DEA1>
+<14E9> <14FF> <DFA1>
+<1500> <1546> <DFB8>
+<1547> <15A4> <E0A1>
+<15A5> <15FF> <E1A1>
+<1600> <1602> <E1FC>
+<1603> <1660> <E2A1>
+<1661> <16BE> <E3A1>
+<16BF> <16FF> <E4A1>
+<1700> <171C> <E4E2>
+<171D> <177A> <E5A1>
+<177B> <17D8> <E6A1>
+<17D9> <17FF> <E7A1>
+<1800> <1836> <E7C8>
+<1837> <1894> <E8A1>
+<1895> <18F2> <E9A1>
+<18F3> <18FF> <EAA1>
+<1900> <1950> <EAAE>
+<1951> <19AE> <EBA1>
+endbfrange
+
+100 beginbfrange
+<19AF> <19FF> <ECA1>
+<1A00> <1A0C> <ECF2>
+<1A0D> <1A6A> <EDA1>
+<1A6B> <1AC8> <EEA1>
+<1AC9> <1AFF> <EFA1>
+<1B00> <1B26> <EFD8>
+<1B27> <1B84> <F0A1>
+<1B85> <1BE2> <F1A1>
+<1BE3> <1BFF> <F2A1>
+<1C00> <1C40> <F2BE>
+<1C41> <1C9E> <F3A1>
+<1C9F> <1CFC> <F4A1>
+<1CFD> <1CFF> <F5A1>
+<1D00> <1D5A> <F5A4>
+<1D5B> <1DB8> <F6A1>
+<1DB9> <1DFF> <F7A1>
+<1E00> <1E16> <F7E8>
+<1E17> <1E17> <A996>
+<1E25> <1E25> <B07D>
+<1E26> <1E26> <CC40>
+<1E27> <1E27> <B54B>
+<1E28> <1E28> <90DB>
+<1E29> <1E29> <F361>
+<1E2A> <1E2A> <D25C>
+<1E2B> <1E2B> <89CE>
+<1E2C> <1E2C> <C154>
+<1E2D> <1E2D> <945B>
+<1E2E> <1E2E> <94A1>
+<1E2F> <1E2F> <EE43>
+<1E30> <1E30> <DE6B>
+<1E31> <1E31> <BD4F>
+<1E32> <1E32> <8ECD>
+<1E33> <1E33> <BD89>
+<1E34> <1E34> <E65E>
+<1E35> <1E35> <D672>
+<1E36> <1E36> <EF96>
+<1E37> <1E37> <8C9A>
+<1E38> <1E38> <88F3>
+<1E39> <1E39> <F555>
+<1E3A> <1E3A> <DD85>
+<1E3B> <1E3B> <D890>
+<1E3C> <1E3C> <E45E>
+<1E3D> <1E3D> <AA4E>
+<1E3E> <1E3E> <82E4>
+<1E3F> <1E3F> <9176>
+<1E40> <1E40> <BE58>
+<1E41> <1E41> <B950>
+<1E42> <1E42> <AE85>
+<1E43> <1E43> <94C0>
+<1E44> <1E44> <8EC5>
+<1E45> <1E45> <E95D>
+<1E46> <1E46> <DF85>
+<1E47> <1E47> <BE8E>
+<1E48> <1E48> <D948>
+<1E49> <1E49> <D783>
+<1E4A> <1E4A> <DE71>
+<1E4B> <1E4B> <DE70>
+<1E4C> <1E4C> <98CB>
+<1E4D> <1E4D> <F74D>
+<1E4E> <1E4E> <B054>
+<1E4F> <1E4F> <9E6C>
+<1E50> <1E50> <9E49>
+<1E51> <1E51> <D965>
+<1E52> <1E52> <9450>
+<1E53> <1E53> <EF9E>
+<1E54> <1E54> <93DC>
+<1E55> <1E55> <E35C>
+<1E56> <1E56> <E34B>
+<1E57> <1E57> <F167>
+<1E58> <1E58> <D161>
+<1E59> <1E59> <D894>
+<1E5A> <1E5A> <85A2>
+<1E5B> <1E5B> <D051>
+<1E5C> <1E5C> <9A88>
+<1E5D> <1E5D> <914D>
+<1E5E> <1E5E> <914B>
+<1E5F> <1E5F> <A04E>
+<1E60> <1E60> <C96E>
+<1E61> <1E61> <C593>
+<1E62> <1E62> <827D>
+<1E63> <1E63> <9CE6>
+<1E64> <1E64> <858B>
+<1E65> <1E65> <82C8>
+<1E66> <1E66> <9C79>
+<1E67> <1E67> <8CD3>
+<1E68> <1E68> <D48C>
+<1E69> <1E69> <9476>
+<1E6A> <1E6A> <93BD>
+<1E6B> <1E6B> <CF73>
+<1E6C> <1E6C> <F092>
+<1E6D> <1E6D> <D78B>
+<1E6E> <1E6E> <C070>
+<1E6F> <1E6F> <E750>
+<1E70> <1E70> <AE62>
+<1E71> <1E71> <EA55>
+<1E72> <1E72> <EE9D>
+<1E73> <1E73> <88F6>
+<1E74> <1E74> <874C>
+<1E75> <1E75> <E94C>
+<1E76> <1E76> <8394>
+endbfrange
+
+100 beginbfrange
+<1E77> <1E77> <C463>
+<1E78> <1E78> <8F53>
+<1E79> <1E79> <95B3>
+<1E7A> <1E7A> <E26E>
+<1E7B> <1E7B> <DC87>
+<1E7C> <1E7C> <8FD8>
+<1E7D> <1E7D> <896D>
+<1E7E> <1E7E> <EA90>
+<1E7F> <1E7F> <D272>
+<1E80> <1E80> <B751>
+<1E81> <1E81> <91CD>
+<1E82> <1E82> <D55C>
+<1E83> <1E83> <F247>
+<1E84> <1E84> <DF74>
+<1E85> <1E85> <F159>
+<1E86> <1E86> <FD58>
+<1E87> <1E87> <9FEB>
+<1E88> <1E88> <D06E>
+<1E89> <1E89> <CF78>
+<1E8A> <1E8A> <8C99>
+<1E8B> <1E8B> <AEA0>
+<1E8C> <1E8C> <DC50>
+<1E8D> <1E8D> <BB49>
+<1E8E> <1E8E> <BE49>
+<1E8F> <1E8F> <E168>
+<1E90> <1E90> <E47A>
+<1E91> <1E91> <EB72>
+<1E92> <1E92> <B541>
+<1E93> <1E93> <83A6>
+<1E94> <1E94> <D37C>
+<1E95> <1E95> <CC8E>
+<1E96> <1E96> <82F7>
+<1E97> <1E97> <AF8F>
+<1E98> <1E98> <EA4A>
+<1E99> <1E99> <8493>
+<1E9A> <1E9A> <E54E>
+<1E9B> <1E9B> <BC83>
+<1E9C> <1E9C> <BE62>
+<1E9D> <1E9D> <DE6F>
+<1E9E> <1E9E> <D47E>
+<1E9F> <1E9F> <D96E>
+<1EA0> <1EA0> <C294>
+<1EA1> <1EA1> <8FC4>
+<1EA2> <1EA2> <85B2>
+<1EA3> <1EA3> <DC66>
+<1EA4> <1EA4> <B85A>
+<1EA5> <1EA5> <E565>
+<1EA6> <1EA6> <DF5F>
+<1EA7> <1EA7> <8EA7>
+<1EA8> <1EA8> <D94A>
+<1EA9> <1EA9> <93FA>
+<1EAA> <1EAA> <86CE>
+<1EAB> <1EAB> <E090>
+<1EAC> <1EAC> <93DB>
+<1EAD> <1EAD> <C491>
+<1EAE> <1EAE> <9184>
+<1EAF> <1EAF> <D551>
+<1EB0> <1EB0> <8F97>
+<1EB1> <1EB1> <AE94>
+<1EB2> <1EB2> <93F5>
+<1EB3> <1EB3> <FC68>
+<1EB4> <1EB4> <CA8E>
+<1EB5> <1EB5> <996E>
+<1EB6> <1EB6> <9376>
+<1EB7> <1EB7> <8D75>
+<1EB8> <1EB8> <B65C>
+<1EB9> <1EB9> <8CA7>
+<1EBA> <1EBA> <9FF4>
+<1EBB> <1EBB> <E087>
+<1EBC> <1EBC> <94B3>
+<1EBD> <1EBD> <9CEC>
+<1EBE> <1EBE> <DF66>
+<1EBF> <1EBF> <BE86>
+<1EC0> <1EC0> <EE8D>
+<1EC1> <1EC1> <FC63>
+<1EC2> <1EC2> <897C>
+<1EC3> <1EC3> <EB8A>
+<1EC4> <1EC4> <9DD5>
+<1EC5> <1EC5> <E19E>
+<1EC6> <1EC6> <D57B>
+<1EC7> <1EC7> <D599>
+<1EC8> <1EC8> <E194>
+<1EC9> <1EC9> <ED94>
+<1ECA> <1ECA> <E556>
+<1ECB> <1ECB> <D386>
+<1ECC> <1ECC> <967C>
+<1ECD> <1ECD> <84D3>
+<1ECE> <1ECE> <979D>
+<1ECF> <1ECF> <83F6>
+<1ED0> <1ED0> <F459>
+<1ED1> <1ED1> <A0D9>
+<1ED2> <1ED2> <AA9A>
+<1ED3> <1ED3> <D778>
+<1ED4> <1ED4> <D980>
+<1ED5> <1ED5> <E583>
+<1ED6> <1ED6> <E591>
+<1ED7> <1ED7> <94E0>
+<1ED8> <1ED8> <BE84>
+<1ED9> <1ED9> <EAA0>
+<1EDA> <1EDA> <8CA6>
+endbfrange
+
+100 beginbfrange
+<1EDB> <1EDB> <878D>
+<1EDC> <1EDC> <EE44>
+<1EDD> <1EDD> <E267>
+<1EDE> <1EDE> <8A5A>
+<1EDF> <1EDF> <8999>
+<1EE0> <1EE0> <F95A>
+<1EE1> <1EE1> <EE7E>
+<1EE2> <1EE2> <D39E>
+<1EE3> <1EE3> <90BA>
+<1EE4> <1EE4> <F049>
+<1EE5> <1EE5> <83BA>
+<1EE6> <1EE6> <A096>
+<1EE7> <1EE7> <F044>
+<1EE8> <1EE8> <D945>
+<1EE9> <1EE9> <B06C>
+<1EEA> <1EEA> <C150>
+<1EEB> <1EEB> <E979>
+<1EEC> <1EEC> <B55C>
+<1EED> <1EED> <E243>
+<1EEE> <1EEE> <9FA9>
+<1EEF> <1EEF> <B9A0>
+<1EF0> <1EF0> <D89C>
+<1EF1> <1EF1> <EF88>
+<1EF2> <1EF2> <D44C>
+<1EF3> <1EF3> <BC8F>
+<1EF4> <1EF4> <EF77>
+<1EF5> <1EF5> <D575>
+<1EF6> <1EF6> <8F55>
+<1EF7> <1EF7> <D94D>
+<1EF8> <1EF8> <BC8A>
+<1EF9> <1EF9> <899E>
+<1EFA> <1EFA> <8A5E>
+<1EFB> <1EFB> <918D>
+<1EFC> <1EFC> <BC53>
+<1EFD> <1EFD> <D853>
+<1EFE> <1EFE> <97F7>
+<1EFF> <1EFF> <E468>
+<1F00> <1F00> <EF4C>
+<1F01> <1F01> <AF82>
+<1F02> <1F02> <F154>
+<1F03> <1F03> <BF70>
+<1F04> <1F04> <D653>
+<1F05> <1F05> <F850>
+<1F06> <1F06> <C477>
+<1F07> <1F07> <DD97>
+<1F08> <1F08> <93E1>
+<1F09> <1F09> <DD6F>
+<1F0A> <1F0A> <D978>
+<1F0B> <1F0B> <8FCD>
+<1F0C> <1F0C> <D893>
+<1F0D> <1F0D> <D387>
+<1F0E> <1F0E> <8B44>
+<1F0F> <1F0F> <BF60>
+<1F10> <1F10> <D493>
+<1F11> <1F11> <E27D>
+<1F12> <1F12> <C977>
+<1F13> <1F13> <8ED6>
+<1F14> <1F14> <DA73>
+<1F15> <1F15> <DA4D>
+<1F16> <1F16> <8CF9>
+<1F17> <1F17> <8482>
+<1F18> <1F18> <E493>
+<1F19> <1F19> <BE56>
+<1F1A> <1F1A> <8D8F>
+<1F1B> <1F1B> <E680>
+<1F1C> <1F1C> <9452>
+<1F1D> <1F1D> <F89D>
+<1F1E> <1F1E> <E977>
+<1F1F> <1F1F> <E374>
+<1F20> <1F20> <8280>
+<1F21> <1F21> <BD6F>
+<1F22> <1F22> <FD8F>
+<1F23> <1F23> <EC96>
+<1F24> <1F24> <D895>
+<1F25> <1F25> <E268>
+<1F26> <1F26> <9CCF>
+<1F27> <1F27> <988B>
+<1F28> <1F28> <D98F>
+<1F29> <1F29> <D04D>
+<1F2A> <1F2A> <EE99>
+<1F2B> <1F2B> <848E>
+<1F2C> <1F2C> <EA50>
+<1F2D> <1F2D> <D35E>
+<1F2E> <1F2E> <F05E>
+<1F2F> <1F2F> <9154>
+<1F30> <1F30> <D89E>
+<1F31> <1F31> <8F56>
+<1F32> <1F32> <D28E>
+<1F33> <1F33> <9A77>
+<1F34> <1F34> <FD94>
+<1F35> <1F35> <E97C>
+<1F36> <1F36> <DC89>
+<1F37> <1F37> <D48E>
+<1F38> <1F38> <9999>
+<1F39> <1F39> <D946>
+<1F3A> <1F3A> <84A3>
+<1F3B> <1F3B> <DD81>
+<1F3C> <1F3C> <E581>
+<1F3D> <1F3D> <87F8>
+<1F3E> <1F3E> <DF5E>
+endbfrange
+
+100 beginbfrange
+<1F3F> <1F3F> <F194>
+<1F40> <1F40> <ED6E>
+<1F41> <1F41> <9D68>
+<1F42> <1F42> <CC96>
+<1F43> <1F43> <E975>
+<1F44> <1F44> <FA51>
+<1F45> <1F45> <D952>
+<1F46> <1F46> <DE5A>
+<1F47> <1F47> <F899>
+<1F48> <1F48> <BC74>
+<1F49> <1F49> <89D8>
+<1F4A> <1F4A> <D76F>
+<1F4B> <1F4B> <9CFB>
+<1F4C> <1F4C> <8757>
+<1F4D> <1F4D> <C841>
+<1F4E> <1F4E> <AE8B>
+<1F4F> <1F4F> <849D>
+<1F50> <1F50> <D492>
+<1F51> <1F51> <91D1>
+<1F52> <1F52> <89C4>
+<1F53> <1F53> <9A67>
+<1F54> <1F54> <AD68>
+<1F55> <1F55> <DF80>
+<1F56> <1F56> <BE8F>
+<1F57> <1F57> <D665>
+<1F58> <1F58> <935D>
+<1F59> <1F59> <DD78>
+<1F5A> <1F5A> <D956>
+<1F5B> <1F5B> <B778>
+<1F5C> <1F5C> <95FE>
+<1F5D> <1F5D> <A05A>
+<1F5E> <1F5E> <8552>
+<1F5F> <1F5F> <D64D>
+<1F60> <1F60> <D564>
+<1F61> <1F61> <C04C>
+<1F62> <1F62> <C89D>
+<1F63> <1F63> <9C86>
+<1F64> <1F64> <AB40>
+<1F65> <1F65> <D89B>
+<1F66> <1F66> <B59C>
+<1F67> <1F67> <93F4>
+<1F68> <1F68> <9943>
+<1F69> <1F69> <B765>
+<1F6A> <1F6A> <F087>
+<1F6B> <1F6B> <D749>
+<1F6C> <1F6C> <FA61>
+<1F6D> <1F6D> <BF83>
+<1F6E> <1F6E> <BE83>
+<1F6F> <1F6F> <984F>
+<1F70> <1F70> <DD8B>
+<1F71> <1F71> <BC89>
+<1F72> <1F72> <9444>
+<1F73> <1F73> <8ED7>
+<1F74> <1F74> <CB45>
+<1F75> <1F75> <84A9>
+<1F76> <1F76> <9DFA>
+<1F77> <1F77> <D38B>
+<1F78> <1F78> <D39B>
+<1F79> <1F79> <EB48>
+<1F7A> <1F7A> <C05E>
+<1F7B> <1F7B> <BC6F>
+<1F7C> <1F7C> <8A41>
+<1F7D> <1F7D> <C776>
+<1F7E> <1F7E> <EE61>
+<1F7F> <1F7F> <D95A>
+<1F80> <1F80> <E29B>
+<1F81> <1F81> <8372>
+<1F82> <1F82> <F17B>
+<1F83> <1F83> <9A9E>
+<1F84> <1F84> <B14F>
+<1F85> <1F85> <88D4>
+<1F86> <1F86> <B97B>
+<1F87> <1F87> <E967>
+<1F88> <1F88> <C644>
+<1F89> <1F89> <BE7D>
+<1F8A> <1F8A> <C04F>
+<1F8B> <1F8B> <997A>
+<1F8C> <1F8C> <FB7C>
+<1F8D> <1F8D> <92FE>
+<1F8E> <1F8E> <93EC>
+<1F8F> <1F8F> <BA86>
+<1F90> <1F90> <8380>
+<1F91> <1F91> <CB5D>
+<1F92> <1F92> <9991>
+<1F93> <1F93> <E862>
+<1F94> <1F94> <DB60>
+<1F95> <1F95> <D976>
+<1F96> <1F96> <D28A>
+<1F97> <1F97> <E649>
+<1F98> <1F98> <C59E>
+<1F99> <1F99> <84A6>
+<1F9A> <1F9A> <F054>
+<1F9B> <1F9B> <9D75>
+<1F9C> <1F9C> <9E52>
+<1F9D> <1F9D> <9DBE>
+<1F9E> <1F9E> <8CA2>
+<1F9F> <1F9F> <9D7B>
+<1FA0> <1FA0> <CA59>
+<1FA1> <1FA1> <98AA>
+<1FA2> <1FA2> <8A5C>
+endbfrange
+
+100 beginbfrange
+<1FA3> <1FA3> <D676>
+<1FA4> <1FA4> <E175>
+<1FA5> <1FA5> <C47A>
+<1FA6> <1FA6> <9DB2>
+<1FA7> <1FA7> <F29C>
+<1FA8> <1FA8> <8BC9>
+<1FA9> <1FA9> <9487>
+<1FAA> <1FAA> <E371>
+<1FAB> <1FAB> <B343>
+<1FAC> <1FAC> <8365>
+<1FAD> <1FAD> <EF9C>
+<1FAE> <1FAE> <C055>
+<1FAF> <1FAF> <BD67>
+<1FB0> <1FB0> <DE49>
+<1FB1> <1FB1> <DD5E>
+<1FB2> <1FB2> <EB41>
+<1FB3> <1FB3> <B99D>
+<1FB4> <1FB4> <9D8D>
+<1FB5> <1FB5> <BD59>
+<1FB6> <1FB6> <D55D>
+<1FB7> <1FB7> <BE6F>
+<1FB8> <1FB8> <E55C>
+<1FB9> <1FB9> <8348>
+<1FBA> <1FBA> <D694>
+<1FBB> <1FBB> <DF4D>
+<1FBC> <1FBC> <A061>
+<1FBD> <1FBD> <B14D>
+<1FBE> <1FBE> <84C5>
+<1FBF> <1FBF> <C76F>
+<1FC0> <1FC0> <F64C>
+<1FC1> <1FC1> <F340>
+<1FC2> <1FC2> <BD9B>
+<1FC3> <1FC3> <EE69>
+<1FC4> <1FC4> <E752>
+<1FC5> <1FC5> <8FBD>
+<1FC6> <1FC6> <AF64>
+<1FC7> <1FC7> <B882>
+<1FC8> <1FC8> <BC6D>
+<1FC9> <1FC9> <C566>
+<1FCA> <1FCA> <F178>
+<1FCB> <1FCB> <C565>
+<1FCC> <1FCC> <93FE>
+<1FCD> <1FCD> <E48F>
+<1FCE> <1FCE> <91D6>
+<1FCF> <1FCF> <84A1>
+<1FD0> <1FD0> <F94E>
+<1FD1> <1FD1> <BD81>
+<1FD2> <1FD2> <D358>
+<1FD3> <1FD3> <D445>
+<1FD4> <1FD4> <BD7E>
+<1FD5> <1FD5> <E278>
+<1FD6> <1FD6> <DC8A>
+<1FD7> <1FD7> <F245>
+<1FD8> <1FD8> <E95F>
+<1FD9> <1FD9> <8450>
+<1FDA> <1FDA> <EE77>
+<1FDB> <1FDB> <9AA3>
+<1FDC> <1FDC> <D56E>
+<1FDD> <1FDD> <89A8>
+<1FDE> <1FDE> <91A9>
+<1FDF> <1FDF> <93B8>
+<1FE0> <1FE0> <8EEC>
+<1FE1> <1FE1> <D19D>
+<1FE2> <1FE2> <D546>
+<1FE3> <1FE3> <894B>
+<1FE4> <1FE4> <837E>
+<1FE5> <1FE5> <8C92>
+<1FE6> <1FE6> <B556>
+<1FE7> <1FE7> <95E7>
+<1FE8> <1FE8> <CC9D>
+<1FE9> <1FE9> <8E68>
+<1FEA> <1FEA> <B851>
+<1FEB> <1FEB> <F081>
+<1FEC> <1FEC> <9DA2>
+<1FED> <1FED> <9455>
+<1FEE> <1FEE> <E99F>
+<1FEF> <1FEF> <CF9E>
+<1FF0> <1FF0> <C544>
+<1FF1> <1FF1> <C852>
+<1FF2> <1FF2> <81ED>
+<1FF3> <1FF3> <D987>
+<1FF4> <1FF4> <CB7B>
+<1FF5> <1FF5> <99DA>
+<1FF6> <1FF6> <9472>
+<1FF7> <1FF7> <BB40>
+<1FF8> <1FF8> <EA40>
+<1FF9> <1FF9> <CC6D>
+<1FFA> <1FFA> <9E91>
+<1FFB> <1FFB> <D78E>
+<1FFC> <1FFC> <9488>
+<1FFD> <1FFD> <D35B>
+<1FFE> <1FFE> <91D0>
+<1FFF> <1FFF> <C07C>
+<2000> <2000> <A080>
+<2001> <2001> <9E45>
+<2002> <2002> <93C6>
+<2003> <2003> <84DA>
+<2004> <2004> <9DB3>
+<2005> <2005> <98B7>
+<2006> <2006> <E844>
+endbfrange
+
+100 beginbfrange
+<2007> <2007> <89BE>
+<2008> <2008> <EE90>
+<2009> <2009> <BB68>
+<200A> <200A> <EB78>
+<200B> <200B> <9EA6>
+<200C> <200C> <D159>
+<200D> <200D> <F58E>
+<200E> <200E> <B659>
+<200F> <200F> <FB90>
+<2010> <2010> <8596>
+<2011> <2011> <84EE>
+<2012> <2012> <B55B>
+<2013> <2013> <9A76>
+<2014> <2014> <9E72>
+<2015> <2015> <EB60>
+<2016> <2016> <827A>
+<2017> <2017> <C293>
+<2018> <2018> <C98F>
+<2019> <2019> <DF42>
+<201A> <201A> <E7A0>
+<201B> <201B> <917A>
+<201C> <201C> <9D69>
+<201D> <201D> <BA9F>
+<201E> <201E> <94BF>
+<201F> <201F> <C498>
+<2020> <2020> <E69C>
+<2021> <2021> <91D9>
+<2022> <2022> <9F92>
+<2023> <2023> <BE9A>
+<2024> <2024> <BC5A>
+<2025> <2025> <83C9>
+<2026> <2026> <DD76>
+<2027> <2027> <D58F>
+<2028> <2028> <AF9F>
+<2029> <2029> <DF7C>
+<202A> <202A> <E782>
+<202B> <202B> <AB43>
+<202C> <202C> <C552>
+<202D> <202D> <E08F>
+<202E> <202E> <F75B>
+<202F> <202F> <D955>
+<2030> <2030> <FD67>
+<2031> <2031> <E28F>
+<2032> <2032> <EC60>
+<2033> <2033> <8E58>
+<2034> <2034> <EE49>
+<2035> <2035> <F073>
+<2036> <2036> <84A2>
+<2037> <2037> <FD88>
+<2038> <2038> <C340>
+<2039> <2039> <87B5>
+<203A> <203A> <BB5C>
+<203B> <203B> <89C5>
+<203C> <203C> <946E>
+<203D> <203D> <EB5D>
+<203E> <203E> <98C7>
+<203F> <203F> <8AE4>
+<2040> <2040> <93A7>
+<2041> <2041> <BA74>
+<2042> <2042> <CC4A>
+<2043> <2043> <B152>
+<2044> <2044> <EF42>
+<2045> <2045> <8F5D>
+<2046> <2046> <A074>
+<2047> <2047> <93EF>
+<2048> <2048> <9D46>
+<2049> <2049> <CC94>
+<204A> <204A> <F494>
+<204B> <204B> <D954>
+<204C> <204C> <E568>
+<204D> <204D> <EA91>
+<204E> <204E> <F348>
+<204F> <204F> <E458>
+<2050> <2050> <8CD2>
+<2051> <2051> <BF7C>
+<2052> <2052> <915D>
+<2053> <2053> <9E56>
+<2054> <2054> <BE76>
+<2055> <2055> <8E6E>
+<2056> <2056> <9481>
+<2057> <2057> <8C5C>
+<2058> <2058> <9EB4>
+<2059> <2059> <8179>
+<205A> <205A> <92E0>
+<205B> <205B> <DD86>
+<205C> <205C> <8290>
+<205D> <205D> <81F6>
+<205E> <205E> <9C53>
+<205F> <205F> <BE5D>
+<2060> <2060> <D593>
+<2061> <2061> <CC7D>
+<2062> <2062> <C15F>
+<2063> <2063> <DF89>
+<2064> <2064> <E88C>
+<2065> <2065> <BB6A>
+<2066> <2066> <F285>
+<2067> <2067> <F198>
+<2068> <2068> <BD6A>
+<2069> <2069> <8B8C>
+<206A> <206A> <AC94>
+endbfrange
+
+100 beginbfrange
+<206B> <206B> <B461>
+<206C> <206C> <CE9B>
+<206D> <206D> <F152>
+<206E> <206E> <F188>
+<206F> <206F> <86E1>
+<2070> <2070> <D949>
+<2071> <2071> <FB9C>
+<2072> <2072> <D975>
+<2073> <2073> <DF7E>
+<2074> <2074> <B26D>
+<2075> <2075> <F07A>
+<2076> <2076> <D055>
+<2077> <2077> <9D4D>
+<2078> <2078> <D699>
+<2079> <2079> <E55E>
+<207A> <207A> <E354>
+<207B> <207B> <D951>
+<207C> <207C> <E656>
+<207D> <207D> <E954>
+<207E> <207E> <909E>
+<207F> <207F> <8283>
+<2080> <2080> <E569>
+<2081> <2081> <89F4>
+<2082> <2082> <D669>
+<2083> <2083> <8F9B>
+<2084> <2084> <D292>
+<2085> <2085> <BE64>
+<2086> <2086> <BE92>
+<2087> <2087> <8F52>
+<2088> <2088> <9CE7>
+<2089> <2089> <9191>
+<208A> <208A> <E97D>
+<208B> <208B> <F851>
+<208C> <208C> <E391>
+<208D> <208D> <D687>
+<208E> <208E> <D65C>
+<208F> <208F> <AE80>
+<2090> <2090> <E263>
+<2091> <2091> <BC7B>
+<2092> <2092> <EB79>
+<2093> <2093> <93CF>
+<2094> <2094> <C458>
+<2095> <2095> <90C0>
+<2096> <2096> <F45B>
+<2097> <2097> <F048>
+<2098> <2098> <944D>
+<2099> <2099> <C481>
+<209A> <209A> <9466>
+<209B> <209B> <E184>
+<209C> <209C> <F842>
+<209D> <209D> <C299>
+<209E> <209E> <87A7>
+<209F> <209F> <E887>
+<20A0> <20A0> <E687>
+<20A1> <20A1> <998E>
+<20A2> <20A2> <AA9F>
+<20A3> <20A3> <8C8E>
+<20A4> <20A4> <9451>
+<20A5> <20A5> <9DF4>
+<20A6> <20A6> <E26F>
+<20A7> <20A7> <BC7E>
+<20A8> <20A8> <C493>
+<20A9> <20A9> <9DE2>
+<20AA> <20AA> <DE72>
+<20AB> <20AB> <AF91>
+<20AC> <20AC> <D65A>
+<20AD> <20AD> <9A57>
+<20AE> <20AE> <FA74>
+<20AF> <20AF> <9AAA>
+<20B0> <20B0> <8749>
+<20B1> <20B1> <9D61>
+<20B2> <20B2> <B150>
+<20B3> <20B3> <FD8B>
+<20B4> <20B4> <D972>
+<20B5> <20B5> <878A>
+<20B6> <20B6> <F969>
+<20B7> <20B7> <F25F>
+<20B8> <20B8> <EF68>
+<20B9> <20B9> <EE6C>
+<20BA> <20BA> <D89A>
+<20BB> <20BB> <CC4F>
+<20BC> <20BC> <917B>
+<20BD> <20BD> <D475>
+<20BE> <20BE> <9D8A>
+<20BF> <20BF> <EE48>
+<20C0> <20C0> <93E4>
+<20C1> <20C1> <E481>
+<20C2> <20C2> <8357>
+<20C3> <20C3> <98E3>
+<20C4> <20C4> <D756>
+<20C5> <20C5> <C49A>
+<20C6> <20C6> <FD52>
+<20C7> <20C7> <F254>
+<20C8> <20C8> <D84D>
+<20C9> <20C9> <8699>
+<20CA> <20CA> <9AE2>
+<20CB> <20CB> <D399>
+<20CC> <20CC> <A0BF>
+<20CD> <20CD> <E254>
+<20CE> <20CE> <E355>
+endbfrange
+
+100 beginbfrange
+<20CF> <20CF> <DF77>
+<20D0> <20D0> <BA9E>
+<20D1> <20D1> <D674>
+<20D2> <20D2> <E558>
+<20D3> <20D3> <E351>
+<20D4> <20D4> <9C5C>
+<20D5> <20D5> <D76C>
+<20D6> <20D6> <8971>
+<20D7> <20D7> <988C>
+<20D8> <20D8> <86DC>
+<20D9> <20D9> <89A6>
+<20DA> <20DA> <CB4E>
+<20DB> <20DB> <938C>
+<20DC> <20DC> <E640>
+<20DD> <20DD> <98F2>
+<20DE> <20DE> <86CC>
+<20DF> <20DF> <8353>
+<20E0> <20E0> <C24E>
+<20E1> <20E1> <B85B>
+<20E2> <20E2> <B860>
+<20E3> <20E3> <9A4A>
+<20E4> <20E4> <D348>
+<20E5> <20E5> <8C8B>
+<20E6> <20E6> <DD70>
+<20E7> <20E7> <9AE4>
+<20E8> <20E8> <8341>
+<20E9> <20E9> <ED95>
+<20EA> <20EA> <D588>
+<20EB> <20EB> <9163>
+<20EC> <20EC> <AD82>
+<20ED> <20ED> <B846>
+<20EE> <20EE> <DA85>
+<20EF> <20EF> <855E>
+<20F0> <20F0> <DC7C>
+<20F1> <20F1> <F28C>
+<20F2> <20F2> <FD78>
+<20F3> <20F3> <EF45>
+<20F4> <20F4> <99E0>
+<20F5> <20F5> <84F1>
+<20F6> <20F6> <F96F>
+<20F7> <20F7> <B45F>
+<20F8> <20F8> <D78C>
+<20F9> <20F9> <F088>
+<20FA> <20FA> <945F>
+<20FB> <20FB> <C040>
+<20FC> <20FC> <9FE1>
+<20FD> <20FD> <ED67>
+<20FE> <20FE> <D54A>
+<20FF> <20FF> <BC78>
+<2100> <2100> <9873>
+<2101> <2101> <BD71>
+<2102> <2102> <DC9B>
+<2103> <2103> <E484>
+<2104> <2104> <E963>
+<2105> <2105> <9D99>
+<2106> <2106> <9EA2>
+<2107> <2107> <CB5F>
+<2108> <2108> <F677>
+<2109> <2109> <D990>
+<210A> <210A> <82E3>
+<210B> <210B> <86CA>
+<210C> <210C> <F27D>
+<210D> <210D> <92DF>
+<210E> <210E> <9DAD>
+<210F> <210F> <9AA2>
+<2110> <2110> <BC86>
+<2111> <2111> <BA59>
+<2112> <2112> <95F1>
+<2113> <2113> <E957>
+<2114> <2114> <EA84>
+<2115> <2115> <D9A0>
+<2116> <2116> <BF98>
+<2117> <2117> <82FB>
+<2118> <2118> <D970>
+<2119> <2119> <9FFD>
+<211A> <211A> <BD42>
+<211B> <211B> <D964>
+<211C> <211C> <92CE>
+<211D> <211D> <947A>
+<211E> <211E> <91D8>
+<211F> <211F> <D44F>
+<2120> <2120> <BC9D>
+<2121> <2121> <8C8F>
+<2122> <2122> <8BF0>
+<2123> <2123> <C449>
+<2124> <2124> <9D42>
+<2125> <2125> <C295>
+<2126> <2126> <C04B>
+<2127> <2127> <84D9>
+<2128> <2128> <C27D>
+<2129> <2129> <8E9F>
+<212A> <212A> <AA7B>
+<212B> <212B> <9DF1>
+<212C> <212C> <D48A>
+<212D> <212D> <9572>
+<212E> <212E> <CE67>
+<212F> <212F> <8C8D>
+<2130> <2130> <D752>
+<2131> <2131> <F182>
+<2132> <2132> <84DD>
+endbfrange
+
+100 beginbfrange
+<2133> <2133> <DF6D>
+<2134> <2134> <E18C>
+<2135> <2135> <EF97>
+<2136> <2136> <D295>
+<2137> <2137> <D487>
+<2138> <2138> <89DB>
+<2139> <2139> <AB46>
+<213A> <213A> <98D0>
+<213B> <213B> <DD94>
+<213C> <213C> <95F8>
+<213D> <213D> <DA48>
+<213E> <213E> <8CD9>
+<213F> <213F> <D067>
+<2140> <2140> <98E4>
+<2141> <2141> <B877>
+<2142> <2142> <94B5>
+<2143> <2143> <8E9B>
+<2144> <2144> <EB70>
+<2145> <2145> <D56C>
+<2146> <2146> <ED98>
+<2147> <2147> <D568>
+<2148> <2148> <B454>
+<2149> <2149> <A071>
+<214A> <214A> <BD7A>
+<214B> <214B> <EF95>
+<214C> <214C> <F3A0>
+<214D> <214D> <C296>
+<214E> <214E> <915A>
+<214F> <214F> <ED9E>
+<2150> <2150> <D441>
+<2151> <2151> <D562>
+<2152> <2152> <945C>
+<2153> <2153> <CC4B>
+<2154> <2154> <D456>
+<2155> <2155> <C343>
+<2156> <2156> <EB6D>
+<2157> <2157> <EB53>
+<2158> <2158> <BD97>
+<2159> <2159> <9A71>
+<215A> <215A> <8C4F>
+<215B> <215B> <9370>
+<215C> <215C> <BF73>
+<215D> <215D> <AC8D>
+<215E> <215E> <E669>
+<215F> <215F> <AB48>
+<2160> <2160> <93E9>
+<2161> <2161> <C55F>
+<2162> <2162> <9142>
+<2163> <2163> <9482>
+<2164> <2164> <D89D>
+<2165> <2165> <B063>
+<2166> <2166> <9EA9>
+<2167> <2167> <89AF>
+<2168> <2168> <D754>
+<2169> <2169> <D584>
+<216A> <216A> <8740>
+<216B> <216B> <9CAB>
+<216C> <216C> <A043>
+<216D> <216D> <9DFD>
+<216E> <216E> <BF6C>
+<216F> <216F> <D391>
+<2170> <2170> <F276>
+<2171> <2171> <D660>
+<2172> <2172> <E452>
+<2173> <2173> <EE7D>
+<2174> <2174> <F377>
+<2175> <2175> <976C>
+<2176> <2176> <D94E>
+<2177> <2177> <E846>
+<2178> <2178> <8F64>
+<2179> <2179> <C2A0>
+<217A> <217A> <9F4E>
+<217B> <217B> <E37E>
+<217C> <217C> <BD79>
+<217D> <217D> <EE5E>
+<217E> <217E> <8844>
+<217F> <217F> <8954>
+<2180> <2180> <8846>
+<2181> <2181> <EE6E>
+<2182> <2182> <F872>
+<2183> <2183> <F157>
+<2184> <2184> <F184>
+<2185> <2185> <9945>
+<2186> <2186> <B844>
+<2187> <2187> <D26D>
+<2188> <2188> <8F9D>
+<2189> <2189> <9EB3>
+<218A> <218A> <EE42>
+<218B> <218B> <C866>
+<218C> <218C> <BE57>
+<218D> <218D> <ED66>
+<218E> <218E> <DF60>
+<218F> <218F> <87FA>
+<2190> <2190> <A091>
+<2191> <2191> <9E48>
+<2192> <2192> <BE53>
+<2193> <2193> <C894>
+<2194> <2194> <82A5>
+<2195> <2195> <835E>
+<2196> <2196> <BE95>
+endbfrange
+
+100 beginbfrange
+<2197> <2197> <D65E>
+<2198> <2198> <D06C>
+<2199> <2199> <C284>
+<219A> <219A> <BC79>
+<219B> <219B> <B780>
+<219C> <219C> <8696>
+<219D> <219D> <93EB>
+<219E> <219E> <CE81>
+<219F> <219F> <9C75>
+<21A0> <21A0> <B843>
+<21A1> <21A1> <86E8>
+<21A2> <21A2> <E675>
+<21A3> <21A3> <9EF5>
+<21A4> <21A4> <D55F>
+<21A5> <21A5> <9F6F>
+<21A6> <21A6> <CA8F>
+<21A7> <21A7> <895D>
+<21A8> <21A8> <EC46>
+<21A9> <21A9> <84D5>
+<21AA> <21AA> <D560>
+<21AB> <21AB> <E561>
+<21AC> <21AC> <A0DE>
+<21AD> <21AD> <D275>
+<21AE> <21AE> <C195>
+<21AF> <21AF> <E38A>
+<21B0> <21B0> <91F2>
+<21B1> <21B1> <BC9A>
+<21B2> <21B2> <CE72>
+<21B3> <21B3> <DDA0>
+<21B4> <21B4> <8D7B>
+<21B5> <21B5> <8262>
+<21B6> <21B6> <AA4D>
+<21B7> <21B7> <8798>
+<21B8> <21B8> <E576>
+<21B9> <21B9> <F572>
+<21BA> <21BA> <C077>
+<21BB> <21BB> <D974>
+<21BC> <21BC> <E395>
+<21BD> <21BD> <E965>
+<21BE> <21BE> <EF40>
+<21BF> <21BF> <EB55>
+<21C0> <21C0> <AC46>
+<21C1> <21C1> <AB49>
+<21C2> <21C2> <BF68>
+<21C3> <21C3> <F057>
+<21C4> <21C4> <9197>
+<21C5> <21C5> <BE51>
+<21C6> <21C6> <E882>
+<21C7> <21C7> <E06C>
+<21C8> <21C8> <D494>
+<21C9> <21C9> <ED91>
+<21CA> <21CA> <ED97>
+<21CB> <21CB> <CA92>
+<21CC> <21CC> <87CC>
+<21CD> <21CD> <E44E>
+<21CE> <21CE> <95D4>
+<21CF> <21CF> <875B>
+<21D0> <21D0> <8566>
+<21D1> <21D1> <92B6>
+<21D2> <21D2> <C37B>
+<21D3> <21D3> <D643>
+<21D4> <21D4> <8C91>
+<21D5> <21D5> <9E61>
+<21D6> <21D6> <D678>
+<21D7> <21D7> <E45C>
+<21D8> <21D8> <E185>
+<21D9> <21D9> <C564>
+<21DA> <21DA> <E450>
+<21DB> <21DB> <BD91>
+<21DC> <21DC> <ED9A>
+<21DD> <21DD> <D453>
+<21DE> <21DE> <BE77>
+<21DF> <21DF> <C06D>
+<21E0> <21E0> <DC8E>
+<21E1> <21E1> <91D2>
+<21E2> <21E2> <DF78>
+<21E3> <21E3> <B05F>
+<21E4> <21E4> <BD6B>
+<21E5> <21E5> <8C57>
+<21E6> <21E6> <84D7>
+<21E7> <21E7> <D483>
+<21E8> <21E8> <8CA4>
+<21E9> <21E9> <F15A>
+<21EA> <21EA> <D396>
+<21EB> <21EB> <D38D>
+<21EC> <21EC> <DF64>
+<21ED> <21ED> <89BA>
+<21EE> <21EE> <F866>
+<21EF> <21EF> <F886>
+<21F0> <21F0> <86A1>
+<21F1> <21F1> <8186>
+<21F2> <21F2> <D3A0>
+<21F3> <21F3> <E98E>
+<21F4> <21F4> <FB7D>
+<21F5> <21F5> <87C0>
+<21F6> <21F6> <EE86>
+<21F7> <21F7> <E990>
+<21F8> <21F8> <C647>
+<21F9> <21F9> <8592>
+<21FA> <21FA> <B38E>
+endbfrange
+
+100 beginbfrange
+<21FB> <21FB> <D656>
+<21FC> <21FC> <F29E>
+<21FD> <21FD> <F884>
+<21FE> <21FE> <97EE>
+<21FF> <21FF> <9350>
+<2200> <2200> <AF83>
+<2201> <2201> <EA96>
+<2202> <2202> <B057>
+<2203> <2203> <F042>
+<2204> <2204> <98D3>
+<2205> <2205> <88F2>
+<2206> <2206> <D67C>
+<2207> <2207> <CB8E>
+<2208> <2208> <A094>
+<2209> <2209> <ED93>
+<220A> <220A> <9849>
+<220B> <220B> <C87E>
+<220C> <220C> <E174>
+<220D> <220D> <E39E>
+<220E> <220E> <EE55>
+<220F> <220F> <DF7A>
+<2210> <2210> <8378>
+<2211> <2211> <CF81>
+<2212> <2212> <CB87>
+<2213> <2213> <837C>
+<2214> <2214> <919B>
+<2215> <2215> <C178>
+<2216> <2216> <D484>
+<2217> <2217> <D768>
+<2218> <2218> <D578>
+<2219> <2219> <D767>
+<221A> <221A> <C05B>
+<221B> <221B> <CA61>
+<221C> <221C> <EA8E>
+<221D> <221D> <E379>
+<221E> <221E> <EF8B>
+<221F> <221F> <EB5B>
+<2220> <2220> <99D1>
+<2221> <2221> <8BEB>
+<2222> <2222> <FA97>
+<2223> <2223> <91AA>
+<2224> <2224> <C074>
+<2225> <2225> <AC93>
+<2226> <2226> <CE9E>
+<2227> <2227> <A049>
+<2228> <2228> <9FC9>
+<2229> <2229> <CF89>
+<222A> <222A> <DA41>
+<222B> <222B> <B766>
+<222C> <222C> <86D1>
+<222D> <222D> <93ED>
+<222E> <222E> <82F2>
+<222F> <222F> <B062>
+<2230> <2230> <DB78>
+<2231> <2231> <839E>
+<2232> <2232> <916E>
+<2233> <2233> <E05D>
+<2234> <2234> <E299>
+<2235> <2235> <AA71>
+<2236> <2236> <D554>
+<2237> <2237> <DD9B>
+<2238> <2238> <F04E>
+<2239> <2239> <F47E>
+<223A> <223A> <9D4F>
+<223B> <223B> <C563>
+<223C> <223C> <8E5A>
+<223D> <223D> <D55A>
+<223E> <223E> <F464>
+<223F> <223F> <AA7A>
+<2240> <2240> <D775>
+<2241> <2241> <EE41>
+<2242> <2242> <F153>
+<2243> <2243> <F878>
+<2244> <2244> <9C59>
+<2245> <2245> <DE40>
+<2246> <2246> <8840>
+<2247> <2247> <8654>
+<2248> <2248> <8841>
+<2249> <2249> <BE89>
+<224A> <224A> <DF68>
+<224B> <224B> <EE8A>
+<224C> <224C> <BC73>
+<224D> <224D> <DC53>
+<224E> <224E> <E880>
+<224F> <224F> <E987>
+<2250> <2250> <EB85>
+<2251> <2251> <E079>
+<2252> <2252> <EB45>
+<2253> <2253> <DF5C>
+<2254> <2254> <CB9C>
+<2255> <2255> <E164>
+<2256> <2256> <959E>
+<2257> <2257> <EB73>
+<2258> <2258> <DD64>
+<2259> <2259> <9480>
+<225A> <225A> <95BA>
+<225B> <225B> <D99D>
+<225C> <225C> <DA4E>
+<225D> <225D> <C54B>
+<225E> <225E> <E88F>
+endbfrange
+
+100 beginbfrange
+<225F> <225F> <9797>
+<2260> <2260> <B85E>
+<2261> <2261> <D89F>
+<2262> <2262> <93F1>
+<2263> <2263> <8474>
+<2264> <2264> <9DC9>
+<2265> <2265> <D95C>
+<2266> <2266> <D99B>
+<2267> <2267> <DC88>
+<2268> <2268> <E58E>
+<2269> <2269> <E96C>
+<226A> <226A> <D470>
+<226B> <226B> <FD53>
+<226C> <226C> <82F9>
+<226D> <226D> <9AD6>
+<226E> <226E> <B14B>
+<226F> <226F> <94D8>
+<2270> <2270> <DD9A>
+<2271> <2271> <8DE4>
+<2272> <2272> <97A3>
+<2273> <2273> <91F0>
+<2274> <2274> <BE60>
+<2275> <2275> <8F88>
+<2276> <2276> <9D71>
+<2277> <2277> <8EA4>
+<2278> <2278> <D97E>
+<2279> <2279> <C39B>
+<227A> <227A> <DA77>
+<227B> <227B> <CF55>
+<227C> <227C> <DE48>
+<227D> <227D> <E64E>
+<227E> <227E> <DF40>
+<227F> <227F> <D891>
+<2280> <2280> <E198>
+<2281> <2281> <82C9>
+<2282> <2282> <D45C>
+<2283> <2283> <E682>
+<2284> <2284> <EA87>
+<2285> <2285> <8EAC>
+<2286> <2286> <B059>
+<2287> <2287> <E08D>
+<2288> <2288> <D743>
+<2289> <2289> <BF97>
+<228A> <228A> <C29A>
+<228B> <228B> <88CC>
+<228C> <228C> <D07D>
+<228D> <228D> <BC88>
+<228E> <228E> <93B4>
+<228F> <228F> <9453>
+<2290> <2290> <8EC3>
+<2291> <2291> <D97C>
+<2292> <2292> <9CFE>
+<2293> <2293> <E78A>
+<2294> <2294> <BD4B>
+<2295> <2295> <B74E>
+<2296> <2296> <C45B>
+<2297> <2297> <D05C>
+<2298> <2298> <D661>
+<2299> <2299> <DD53>
+<229A> <229A> <B099>
+<229B> <229B> <9583>
+<229C> <229C> <F345>
+<229D> <229D> <D654>
+<229E> <229E> <D544>
+<229F> <229F> <A054>
+<22A0> <22A0> <B29A>
+<22A1> <22A1> <87DA>
+<22A2> <22A2> <D941>
+<22A3> <22A3> <E854>
+<22A4> <22A4> <BA42>
+<22A5> <22A5> <F176>
+<22A6> <22A6> <8CA3>
+<22A7> <22A7> <B475>
+<22A8> <22A8> <DE44>
+<22A9> <22A9> <D98D>
+<22AA> <22AA> <98B6>
+<22AB> <22AB> <C766>
+<22AC> <22AC> <D162>
+<22AD> <22AD> <8A79>
+<22AE> <22AE> <89D1>
+<22AF> <22AF> <A0EE>
+<22B0> <22B0> <E546>
+<22B1> <22B1> <D998>
+<22B2> <22B2> <898B>
+<22B3> <22B3> <BE59>
+<22B4> <22B4> <D581>
+<22B5> <22B5> <9CCA>
+<22B6> <22B6> <9DE1>
+<22B7> <22B7> <D959>
+<22B8> <22B8> <9D6E>
+<22B9> <22B9> <BE43>
+<22BA> <22BA> <BF82>
+<22BB> <22BB> <BF76>
+<22BC> <22BC> <E075>
+<22BD> <22BD> <D47B>
+<22BE> <22BE> <BD4D>
+<22BF> <22BF> <E88D>
+<22C0> <22C0> <86DD>
+<22C1> <22C1> <8587>
+<22C2> <22C2> <8598>
+endbfrange
+
+100 beginbfrange
+<22C3> <22C3> <EC76>
+<22C4> <22C4> <D99E>
+<22C5> <22C5> <8551>
+<22C6> <22C6> <8554>
+<22C7> <22C7> <D991>
+<22C8> <22C8> <8471>
+<22C9> <22C9> <84A5>
+<22CA> <22CA> <8492>
+<22CB> <22CB> <82F8>
+<22CC> <22CC> <8274>
+<22CD> <22CD> <82E1>
+<22CE> <22CE> <838A>
+<22CF> <22CF> <837A>
+<22D0> <22D0> <8389>
+<22D1> <22D1> <83B0>
+<22D2> <22D2> <83AB>
+<22D3> <22D3> <8366>
+<22D4> <22D4> <8345>
+<22D5> <22D5> <83AF>
+<22D6> <22D6> <8386>
+<22D7> <22D7> <83AE>
+<22D8> <22D8> <834C>
+<22D9> <22D9> <BC65>
+<22DA> <22DA> <FC5A>
+<22DB> <22DB> <87CF>
+<22DC> <22DC> <F849>
+<22DD> <22DD> <D243>
+<22DE> <22DE> <C54C>
+<22DF> <22DF> <D385>
+<22E0> <22E0> <D393>
+<22E1> <22E1> <D38F>
+<22E2> <22E2> <D398>
+<22E3> <22E3> <D68E>
+<22E4> <22E4> <D46E>
+<22E5> <22E5> <D447>
+<22E6> <22E6> <D462>
+<22E7> <22E7> <D458>
+<22E8> <22E8> <D467>
+<22E9> <22E9> <D474>
+<22EA> <22EA> <D478>
+<22EB> <22EB> <D472>
+<22EC> <22EC> <D545>
+<22ED> <22ED> <D543>
+<22EE> <22EE> <D49F>
+<22EF> <22EF> <D491>
+<22F0> <22F0> <D49C>
+<22F1> <22F1> <D496>
+<22F2> <22F2> <D48D>
+<22F3> <22F3> <D48F>
+<22F4> <22F4> <D58A>
+<22F5> <22F5> <D59F>
+<22F6> <22F6> <D482>
+<22F7> <22F7> <D556>
+<22F8> <22F8> <D561>
+<22F9> <22FA> <D54E>
+<22FB> <22FB> <D58C>
+<22FC> <22FC> <D58E>
+<22FD> <22FD> <D586>
+<22FE> <22FE> <D598>
+<22FF> <22FF> <D594>
+<2300> <2300> <D57E>
+<2301> <2301> <D572>
+<2302> <2302> <D652>
+<2303> <2303> <D647>
+<2304> <2304> <D66F>
+<2305> <2305> <D65D>
+<2306> <2306> <D640>
+<2307> <2307> <D649>
+<2308> <2308> <D658>
+<2309> <2309> <D64F>
+<230A> <230A> <D642>
+<230B> <230B> <D64A>
+<230C> <230C> <D59B>
+<230D> <230D> <D683>
+<230E> <230E> <D795>
+<230F> <230F> <D671>
+<2310> <2310> <D675>
+<2311> <2311> <D66B>
+<2312> <2312> <D686>
+<2313> <2313> <D688>
+<2314> <2314> <D750>
+<2315> <2315> <D753>
+<2316> <2316> <D748>
+<2317> <2317> <D797>
+<2318> <2318> <D764>
+<2319> <2319> <D78F>
+<231A> <231A> <EA80>
+<231B> <231B> <E097>
+<231C> <231C> <E077>
+<231D> <231D> <E092>
+<231E> <231E> <E050>
+<231F> <231F> <E094>
+<2320> <2320> <E069>
+<2321> <2321> <E142>
+<2322> <2322> <C663>
+<2323> <2323> <84EA>
+<2324> <2324> <8E80>
+<2325> <2325> <88D7>
+<2326> <2326> <89BF>
+<2327> <2327> <89C8>
+endbfrange
+
+100 beginbfrange
+<2328> <2328> <89C6>
+<2329> <2329> <89C0>
+<232A> <232A> <88BA>
+<232B> <232B> <894E>
+<232C> <232C> <88DF>
+<232D> <232D> <8950>
+<232E> <232E> <88E5>
+<232F> <232F> <895F>
+<2330> <2330> <CB47>
+<2331> <2331> <CA7C>
+<2332> <2332> <CB9E>
+<2333> <2333> <C77B>
+<2334> <2334> <C84F>
+<2335> <2335> <C990>
+<2336> <2336> <C672>
+<2337> <2337> <CC64>
+<2338> <2338> <CA5C>
+<2339> <2339> <894C>
+<233A> <233A> <9FA6>
+<233B> <233B> <CA81>
+<233C> <233C> <C99C>
+<233D> <233D> <CA77>
+<233E> <233E> <CB43>
+<233F> <233F> <CB6A>
+<2340> <2340> <A0CE>
+<2341> <2341> <9CEE>
+<2342> <2342> <CA6E>
+<2343> <2343> <CB7C>
+<2344> <2344> <CA7B>
+<2345> <2345> <C970>
+<2346> <2346> <C887>
+<2347> <2347> <C892>
+<2348> <2348> <C950>
+<2349> <2349> <C86E>
+<234A> <234A> <CB57>
+<234B> <234B> <CA7E>
+<234C> <234C> <FA4C>
+<234D> <234D> <C94F>
+<234E> <234E> <BF4D>
+<234F> <234F> <CA72>
+<2350> <2350> <CA89>
+<2351> <2351> <CA56>
+<2352> <2352> <F287>
+<2353> <2353> <CC79>
+<2354> <2354> <E676>
+<2355> <2355> <CA9A>
+<2356> <2356> <CC60>
+<2357> <2357> <CC41>
+<2358> <2358> <CC49>
+<2359> <2359> <CB92>
+<235A> <235A> <CC5C>
+<235B> <235B> <8A59>
+<235C> <235C> <8CC0>
+<235D> <235D> <92D0>
+<235E> <235E> <93BB>
+<235F> <235F> <93D7>
+<2360> <2360> <939D>
+<2361> <2361> <93A5>
+<2362> <2362> <93E5>
+<2363> <2363> <9464>
+<2364> <2364> <9474>
+<2365> <2365> <9458>
+<2366> <2366> <945D>
+<2367> <2367> <9478>
+<2368> <2368> <875C>
+<2369> <2369> <8760>
+<236A> <236A> <87D2>
+<236B> <236B> <87B3>
+<236C> <236C> <8668>
+<236D> <236D> <864A>
+<236E> <236E> <8793>
+<236F> <236F> <877A>
+<2370> <2370> <877D>
+<2371> <2371> <875E>
+<2372> <2372> <86F4>
+<2373> <2373> <8782>
+<2374> <2374> <8788>
+<2375> <2375> <879D>
+<2376> <2376> <8781>
+<2377> <2377> <874F>
+<2378> <2378> <875A>
+<2379> <2379> <86EE>
+<237A> <237A> <874B>
+<237B> <237B> <87CA>
+<237C> <237C> <8744>
+<237D> <237D> <87BF>
+<237E> <237E> <87CB>
+<237F> <237F> <8786>
+<2380> <2380> <DE5C>
+<2381> <2381> <87C2>
+<2382> <2382> <87A3>
+<2383> <2383> <87F7>
+<2384> <2384> <8EAE>
+<2385> <2385> <8ECE>
+<2386> <2386> <8EBE>
+<2387> <2387> <8EBD>
+<2388> <2388> <8DE7>
+<2389> <2389> <8D73>
+<238A> <238A> <8DB9>
+<238B> <238B> <8D9E>
+endbfrange
+
+100 beginbfrange
+<238C> <238C> <8E46>
+<238D> <238D> <8DFE>
+<238E> <238E> <8DF7>
+<238F> <238F> <8D88>
+<2390> <2390> <8E56>
+<2391> <2391> <8DE2>
+<2392> <2392> <8E70>
+<2393> <2393> <8FC6>
+<2394> <2394> <AB45>
+<2395> <2395> <AA77>
+<2396> <2396> <AA9C>
+<2397> <2397> <AA73>
+<2398> <2398> <AA9D>
+<2399> <2399> <AB4D>
+<239A> <239A> <AB4A>
+<239B> <239B> <EF7A>
+<239C> <239C> <F068>
+<239D> <239D> <EF82>
+<239E> <239E> <F071>
+<239F> <23A0> <EF83>
+<23A1> <23A1> <EF86>
+<23A2> <23A2> <EF8D>
+<23A3> <23A3> <F041>
+<23A4> <23A4> <F047>
+<23A5> <23A5> <F051>
+<23A6> <23A6> <F06C>
+<23A7> <23A7> <F074>
+<23A8> <23A8> <F078>
+<23A9> <23AA> <F07D>
+<23AB> <23AB> <F080>
+<23AC> <23AC> <F082>
+<23AD> <23AD> <F096>
+<23AE> <23AE> <8F54>
+<23AF> <23AF> <D973>
+<23B0> <23B0> <91D4>
+<23B1> <23B1> <9193>
+<23B2> <23B2> <9159>
+<23B3> <23B3> <90F7>
+<23B4> <23B4> <909D>
+<23B5> <23B5> <90ED>
+<23B6> <23B6> <91AB>
+<23B7> <23B7> <9151>
+<23B8> <23B8> <91C3>
+<23B9> <23B9> <90C5>
+<23BA> <23BA> <90F0>
+<23BB> <23BB> <90C1>
+<23BC> <23BC> <9161>
+<23BD> <23BD> <90DC>
+<23BE> <23BE> <917C>
+<23BF> <23BF> <E956>
+<23C0> <23C0> <E95A>
+<23C1> <23C1> <E99D>
+<23C2> <23C2> <E962>
+<23C3> <23C3> <E968>
+<23C4> <23C4> <E960>
+<23C5> <23C5> <EA59>
+<23C6> <23C6> <E982>
+<23C7> <23C7> <E980>
+<23C8> <23C8> <F462>
+<23C9> <23C9> <E981>
+<23CA> <23CA> <E993>
+<23CB> <23CB> <E98B>
+<23CC> <23CC> <F45D>
+<23CD> <23CD> <E994>
+<23CE> <23CE> <E992>
+<23CF> <23CF> <E991>
+<23D0> <23D0> <E998>
+<23D1> <23D1> <E9A0>
+<23D2> <23D2> <EA48>
+<23D3> <23D3> <EA44>
+<23D4> <23D4> <EA49>
+<23D5> <23D5> <EA52>
+<23D6> <23D6> <9E96>
+<23D7> <23D7> <9D91>
+<23D8> <23D8> <9E7B>
+<23D9> <23D9> <9E6F>
+<23DA> <23DA> <9E54>
+<23DB> <23DB> <9BDC>
+<23DC> <23DC> <9BD1>
+<23DD> <23DD> <9C9D>
+<23DE> <23DE> <9DD2>
+<23DF> <23DF> <9E67>
+<23E0> <23E0> <9D47>
+<23E1> <23E1> <9DA1>
+<23E2> <23E2> <9C5A>
+<23E3> <23E3> <9DAC>
+<23E4> <23E4> <9E5E>
+<23E5> <23E5> <9DC6>
+<23E6> <23E6> <9E63>
+<23E7> <23E7> <9EB7>
+<23E8> <23E8> <9E97>
+<23E9> <23E9> <9E5D>
+<23EA> <23EA> <9DA7>
+<23EB> <23EB> <9E75>
+<23EC> <23EC> <9E74>
+<23ED> <23ED> <9E87>
+<23EE> <23EE> <9E7C>
+<23EF> <23EF> <9EAE>
+<23F0> <23F0> <F271>
+<23F1> <23F1> <DF83>
+endbfrange
+
+100 beginbfrange
+<23F2> <23F2> <DE9F>
+<23F3> <23F3> <DF8A>
+<23F4> <23F4> <8CD5>
+<23F5> <23F5> <8F86>
+<23F6> <23F6> <8BB3>
+<23F7> <23F7> <8B9E>
+<23F8> <23F8> <8BBE>
+<23F9> <23F9> <8B49>
+<23FA> <23FA> <8BC6>
+<23FB> <23FB> <8C44>
+<23FC> <23FC> <8B7A>
+<23FD> <23FD> <8BB9>
+<23FE> <23FE> <8BC8>
+<23FF> <23FF> <8BDC>
+<2400> <2400> <8BE5>
+<2401> <2401> <8BD4>
+<2402> <2402> <F17A>
+<2403> <2403> <F186>
+<2404> <2404> <F180>
+<2405> <2405> <F27C>
+<2406> <2406> <F341>
+<2407> <2407> <F177>
+<2408> <2408> <F17E>
+<2409> <2409> <F294>
+<240A> <240A> <F291>
+<240B> <240B> <F189>
+<240C> <240C> <F350>
+<240D> <240D> <F255>
+<240E> <240E> <F253>
+<240F> <240F> <F24B>
+<2410> <2410> <F289>
+<2411> <2411> <F273>
+<2412> <2412> <F25C>
+<2413> <2413> <F288>
+<2414> <2414> <F274>
+<2415> <2415> <F27E>
+<2416> <2417> <F28A>
+<2418> <2418> <F296>
+<2419> <2419> <F34B>
+<241A> <241A> <F34A>
+<241B> <241B> <BC69>
+<241C> <241C> <BC75>
+<241D> <241D> <BC71>
+<241E> <241F> <BC76>
+<2420> <2420> <C06B>
+<2421> <2421> <BC8B>
+<2422> <2422> <BC84>
+<2423> <2423> <BC82>
+<2424> <2424> <BD43>
+<2425> <2425> <BC9C>
+<2426> <2426> <BC9B>
+<2427> <2427> <BF55>
+<2428> <2428> <BD45>
+<2429> <2429> <BD49>
+<242A> <242A> <BD48>
+<242B> <242B> <BD66>
+<242C> <242C> <BD57>
+<242D> <242D> <BD7B>
+<242E> <242E> <BD8E>
+<242F> <242F> <BD8B>
+<2430> <2430> <BD90>
+<2431> <2431> <BE63>
+<2432> <2432> <BE5F>
+<2433> <2433> <BE70>
+<2434> <2434> <BE79>
+<2435> <2435> <BE69>
+<2436> <2436> <BE45>
+<2437> <2437> <BE52>
+<2438> <2438> <BE5E>
+<2439> <2439> <BE4A>
+<243A> <243A> <BE55>
+<243B> <243B> <BE6C>
+<243C> <243C> <BE7E>
+<243D> <243D> <BE7C>
+<243E> <243E> <BE9F>
+<243F> <243F> <BE98>
+<2440> <2440> <C044>
+<2441> <2441> <BE8C>
+<2442> <2442> <BE9C>
+<2443> <2443> <BE97>
+<2444> <2444> <BF50>
+<2445> <2445> <BE87>
+<2446> <2446> <BF4E>
+<2447> <2447> <BF62>
+<2448> <2448> <BF64>
+<2449> <2449> <BF63>
+<244A> <244A> <BF72>
+<244B> <244B> <BF4F>
+<244C> <244C> <BF56>
+<244D> <244D> <C05F>
+<244E> <244E> <BF7E>
+<244F> <244F> <BF7A>
+<2450> <2450> <BF77>
+<2451> <2451> <BF8A>
+<2452> <2452> <BF89>
+<2453> <2453> <C069>
+<2454> <2454> <BF9D>
+<2455> <2455> <BF95>
+<2456> <2456> <C050>
+<2457> <2457> <C060>
+endbfrange
+
+100 beginbfrange
+<2458> <2458> <C052>
+<2459> <2459> <C051>
+<245A> <245A> <C079>
+<245B> <245B> <AD5E>
+<245C> <245C> <AC7C>
+<245D> <245D> <AD87>
+<245E> <245E> <ED9C>
+<245F> <245F> <AD74>
+<2460> <2460> <AC71>
+<2461> <2461> <AD49>
+<2462> <2462> <AD61>
+<2463> <2463> <AD8B>
+<2464> <2464> <AD91>
+<2465> <2465> <ED74>
+<2466> <2466> <ED79>
+<2467> <2467> <ED77>
+<2468> <2468> <9871>
+<2469> <2469> <99C0>
+<246A> <246A> <9767>
+<246B> <246B> <9796>
+<246C> <246C> <98BA>
+<246D> <246D> <976E>
+<246E> <246E> <99B1>
+<246F> <246F> <99C9>
+<2470> <2470> <99BE>
+<2471> <2471> <99B5>
+<2472> <2472> <9966>
+<2473> <2473> <97BF>
+<2474> <2474> <98EF>
+<2475> <2475> <9845>
+<2476> <2476> <9881>
+<2477> <2477> <98E5>
+<2478> <2478> <9975>
+<2479> <2479> <99E8>
+<247A> <247A> <99F4>
+<247B> <247B> <99B3>
+<247C> <247C> <98A0>
+<247D> <247D> <99E5>
+<247E> <247E> <99EC>
+<247F> <247F> <99C2>
+<2480> <2480> <99B0>
+<2481> <2481> <99CE>
+<2482> <2482> <9989>
+<2483> <2483> <99BD>
+<2484> <2484> <997B>
+<2485> <2485> <99A9>
+<2486> <2486> <99B4>
+<2487> <2487> <9A91>
+<2488> <2488> <9A8C>
+<2489> <2489> <9A9A>
+<248A> <248A> <9A97>
+<248B> <248B> <9A9B>
+<248C> <248C> <DC90>
+<248D> <248D> <DC97>
+<248E> <248E> <DD4D>
+<248F> <248F> <DD56>
+<2490> <2490> <DE5F>
+<2491> <2491> <DD54>
+<2492> <2492> <DD57>
+<2493> <2493> <DD46>
+<2494> <2494> <DCA0>
+<2495> <2495> <DE5D>
+<2496> <2496> <DD55>
+<2497> <2497> <DD59>
+<2498> <2498> <DD65>
+<2499> <2499> <DD62>
+<249A> <249A> <DD60>
+<249B> <249B> <DD6D>
+<249C> <249C> <DD82>
+<249D> <249E> <DD79>
+<249F> <249F> <DD77>
+<24A0> <24A0> <DD8F>
+<24A1> <24A1> <DE41>
+<24A2> <24A2> <DE4F>
+<24A3> <24A3> <91E2>
+<24A4> <24A4> <91EA>
+<24A5> <24A5> <AE54>
+<24A6> <24A6> <95D2>
+<24A7> <24A7> <95CF>
+<24A8> <24A8> <959F>
+<24A9> <24A9> <95E1>
+<24AA> <24AA> <D953>
+<24AB> <24AB> <D942>
+<24AC> <24AC> <D94C>
+<24AD> <24AD> <D94F>
+<24AE> <24AE> <D997>
+<24AF> <24AF> <D944>
+<24B0> <24B0> <D957>
+<24B1> <24B1> <DA42>
+<24B2> <24B2> <D963>
+<24B3> <24B3> <D96C>
+<24B4> <24B4> <D967>
+<24B5> <24B5> <D97D>
+<24B6> <24B6> <D979>
+<24B7> <24B7> <D98E>
+<24B8> <24B8> <D297>
+<24B9> <24B9> <D34A>
+<24BA> <24BA> <D2A0>
+<24BB> <24BB> <D35D>
+<24BC> <24BC> <D344>
+endbfrange
+
+100 beginbfrange
+<24BD> <24BD> <D34D>
+<24BE> <24BE> <D350>
+<24BF> <24BF> <D355>
+<24C0> <24C0> <9AD0>
+<24C1> <24C1> <9ADA>
+<24C2> <24C2> <9AE5>
+<24C3> <24C3> <A0A9>
+<24C4> <24C4> <9656>
+<24C5> <24C5> <C44C>
+<24C6> <24C6> <C546>
+<24C7> <24C7> <C384>
+<24C8> <24C8> <C492>
+<24C9> <24C9> <C454>
+<24CA> <24CA> <C49C>
+<24CB> <24CB> <9A65>
+<24CC> <24CD> <EF52>
+<24CE> <24CE> <EF5A>
+<24CF> <24CF> <EF60>
+<24D0> <24D0> <EF6A>
+<24D1> <24D1> <EF6C>
+<24D2> <24D2> <DD9E>
+<24D3> <24D3> <FD57>
+<24D4> <24D4> <94CC>
+<24D5> <24D5> <9FAC>
+<24D6> <24D6> <9F98>
+<24D7> <24D7> <9FCD>
+<24D8> <24D8> <9FEE>
+<24D9> <24D9> <A046>
+<24DA> <24DA> <A063>
+<24DB> <24DB> <B65B>
+<24DC> <24DC> <B59D>
+<24DD> <24DD> <B655>
+<24DE> <24DE> <91BB>
+<24DF> <24DF> <9155>
+<24E0> <24E0> <91BF>
+<24E1> <24E1> <91DF>
+<24E2> <24E2> <9DCD>
+<24E3> <24E3> <B489>
+<24E4> <24E4> <B458>
+<24E5> <24E5> <B38C>
+<24E6> <24E6> <B45E>
+<24E7> <24E7> <B55A>
+<24E8> <24E8> <B561>
+<24E9> <24E9> <B388>
+<24EA> <24EA> <B493>
+<24EB> <24EB> <B483>
+<24EC> <24EC> <B47E>
+<24ED> <24ED> <FD90>
+<24EE> <24EE> <B267>
+<24EF> <24EF> <B241>
+<24F0> <24F0> <B280>
+<24F1> <24F1> <C160>
+<24F2> <24F2> <C162>
+<24F3> <24F5> <E18E>
+<24F6> <24F6> <E195>
+<24F7> <24F7> <E193>
+<24F8> <24F8> <E191>
+<24F9> <24F9> <E251>
+<24FA> <24FA> <E241>
+<24FB> <24FB> <E19F>
+<24FC> <24FC> <E57B>
+<24FD> <24FD> <E24F>
+<24FE> <24FE> <E253>
+<24FF> <24FF> <E262>
+<2500> <2500> <E281>
+<2501> <2501> <E2A0>
+<2502> <2502> <E26B>
+<2503> <2503> <E26A>
+<2504> <2504> <E25B>
+<2505> <2505> <E282>
+<2506> <2506> <E25E>
+<2507> <2507> <E280>
+<2508> <2508> <E25A>
+<2509> <2509> <E295>
+<250A> <250A> <E360>
+<250B> <250B> <E292>
+<250C> <250C> <E28E>
+<250D> <250D> <E34F>
+<250E> <250E> <E298>
+<250F> <250F> <E293>
+<2510> <2510> <E358>
+<2511> <2512> <E366>
+<2513> <2513> <E29A>
+<2514> <2514> <E870>
+<2515> <2515> <E28B>
+<2516> <2516> <E343>
+<2517> <2517> <E342>
+<2518> <2518> <E347>
+<2519> <2519> <E289>
+<251A> <251A> <E294>
+<251B> <251B> <E849>
+<251C> <251C> <E444>
+<251D> <251D> <E399>
+<251E> <251E> <E373>
+<251F> <251F> <E442>
+<2520> <2520> <E485>
+<2521> <2521> <E465>
+<2522> <2522> <E774>
+<2523> <2523> <E479>
+<2524> <2524> <E84B>
+endbfrange
+
+100 beginbfrange
+<2525> <2525> <E448>
+<2526> <2526> <E39F>
+<2527> <2527> <E67A>
+<2528> <2528> <E38F>
+<2529> <2529> <E462>
+<252A> <252A> <E441>
+<252B> <252B> <E766>
+<252C> <252C> <E38C>
+<252D> <252D> <E378>
+<252E> <252E> <E67C>
+<252F> <252F> <E393>
+<2530> <2530> <E550>
+<2531> <2531> <E443>
+<2532> <2532> <E37C>
+<2533> <2533> <E77C>
+<2534> <2534> <E440>
+<2535> <2535> <E39C>
+<2536> <2536> <E784>
+<2537> <2537> <E56E>
+<2538> <2538> <E488>
+<2539> <2539> <E748>
+<253A> <253A> <E47B>
+<253B> <253B> <E487>
+<253C> <253C> <E486>
+<253D> <253D> <E47E>
+<253E> <253E> <E453>
+<253F> <253F> <E473>
+<2540> <2540> <E48D>
+<2541> <2542> <E798>
+<2543> <2543> <E45A>
+<2544> <2544> <E475>
+<2545> <2545> <E47C>
+<2546> <2546> <E548>
+<2547> <2547> <E49D>
+<2548> <2548> <E59F>
+<2549> <2549> <E551>
+<254A> <254A> <E575>
+<254B> <254B> <E498>
+<254C> <254C> <E54B>
+<254D> <254D> <E564>
+<254E> <254E> <E578>
+<254F> <2550> <E49E>
+<2551> <2551> <E555>
+<2552> <2552> <E54F>
+<2553> <2553> <E59B>
+<2554> <2554> <E57C>
+<2555> <2555> <E64A>
+<2556> <2556> <E58A>
+<2557> <2557> <E59A>
+<2558> <2558> <E67D>
+<2559> <2559> <E644>
+<255A> <255A> <E658>
+<255B> <255B> <E755>
+<255C> <255C> <E749>
+<255D> <255D> <E79A>
+<255E> <255E> <E65B>
+<255F> <255F> <E69F>
+<2560> <2560> <E66B>
+<2561> <2561> <E68C>
+<2562> <2562> <E693>
+<2563> <2563> <E679>
+<2564> <2564> <E684>
+<2565> <2565> <E689>
+<2566> <2566> <E85C>
+<2567> <2567> <E753>
+<2568> <2569> <E74D>
+<256A> <256A> <E6A0>
+<256B> <256B> <E74F>
+<256C> <256C> <E697>
+<256D> <256D> <E69B>
+<256E> <256E> <E743>
+<256F> <256F> <E786>
+<2570> <2570> <E78F>
+<2571> <2571> <E768>
+<2572> <2572> <E875>
+<2573> <2573> <E785>
+<2574> <2574> <E87C>
+<2575> <2575> <E792>
+<2576> <2576> <E889>
+<2577> <2577> <E76A>
+<2578> <2578> <E78B>
+<2579> <2579> <E85A>
+<257A> <257A> <E843>
+<257B> <257B> <E84F>
+<257C> <257C> <E864>
+<257D> <257D> <E873>
+<257E> <257E> <E652>
+<257F> <257F> <B777>
+<2580> <2580> <F846>
+<2581> <2581> <F853>
+<2582> <2582> <F864>
+<2583> <2583> <F863>
+<2584> <2584> <F881>
+<2585> <2585> <F985>
+<2586> <2586> <FB52>
+<2587> <2587> <F87A>
+<2588> <2588> <F87C>
+<2589> <2589> <FA83>
+<258A> <258A> <F88D>
+<258B> <258B> <FA76>
+endbfrange
+
+100 beginbfrange
+<258C> <258C> <F88E>
+<258D> <258D> <F8A0>
+<258E> <258E> <FB5B>
+<258F> <258F> <F950>
+<2590> <2590> <FB5A>
+<2591> <2591> <F95D>
+<2592> <2592> <F94F>
+<2593> <2593> <FA91>
+<2594> <2594> <F959>
+<2595> <2595> <F95E>
+<2596> <2596> <F991>
+<2597> <2597> <F967>
+<2598> <2598> <F96C>
+<2599> <2599> <F987>
+<259A> <259A> <F996>
+<259B> <259B> <F998>
+<259C> <259C> <FA5D>
+<259D> <259D> <FA42>
+<259E> <259E> <FA46>
+<259F> <259F> <FA5F>
+<25A0> <25A0> <FA59>
+<25A1> <25A1> <FB57>
+<25A2> <25A2> <FA70>
+<25A3> <25A3> <FA77>
+<25A4> <25A4> <FA8D>
+<25A5> <25A5> <FA84>
+<25A6> <25A6> <FA90>
+<25A7> <25A7> <FA96>
+<25A8> <25A8> <FB49>
+<25A9> <25A9> <FA98>
+<25AA> <25AA> <FB58>
+<25AB> <25AB> <B058>
+<25AC> <25AC> <B04F>
+<25AD> <25AD> <B05B>
+<25AE> <25AE> <AF7B>
+<25AF> <25B0> <B041>
+<25B1> <25B1> <B044>
+<25B2> <25B2> <AF8E>
+<25B3> <25B3> <AF9C>
+<25B4> <25B5> <B060>
+<25B6> <25B6> <B05D>
+<25B7> <25B7> <B064>
+<25B8> <25B8> <B85D>
+<25B9> <25B9> <B84D>
+<25BA> <25BA> <D264>
+<25BB> <25BB> <D19E>
+<25BC> <25BC> <D263>
+<25BD> <25BD> <D24D>
+<25BE> <25BE> <D240>
+<25BF> <25BF> <D268>
+<25C0> <25C0> <B097>
+<25C1> <25C1> <C267>
+<25C2> <25C2> <C265>
+<25C3> <25C3> <C29C>
+<25C4> <25C4> <C298>
+<25C5> <25C5> <ED99>
+<25C6> <25C6> <EDA0>
+<25C7> <25C7> <EE40>
+<25C8> <25C8> <EE52>
+<25C9> <25C9> <EE4D>
+<25CA> <25CA> <9D7D>
+<25CB> <25CB> <EE57>
+<25CC> <25CC> <EE68>
+<25CD> <25CD> <EE80>
+<25CE> <25CE> <EE85>
+<25CF> <25CF> <EF44>
+<25D0> <25D0> <EE94>
+<25D1> <25D1> <EE8B>
+<25D2> <25D2> <EE97>
+<25D3> <25D3> <EE9E>
+<25D4> <25D4> <EF41>
+<25D5> <25D5> <CF6C>
+<25D6> <25D6> <CF8A>
+<25D7> <25D7> <CD98>
+<25D8> <25D8> <CFA0>
+<25D9> <25D9> <CF7C>
+<25DA> <25DA> <CD90>
+<25DB> <25DB> <CF75>
+<25DC> <25DC> <CE87>
+<25DD> <25DD> <CF93>
+<25DE> <25DE> <CF58>
+<25DF> <25DF> <CF94>
+<25E0> <25E0> <CF4E>
+<25E1> <25E1> <CF5C>
+<25E2> <25E2> <C09B>
+<25E3> <25E3> <BA56>
+<25E4> <25E4> <B961>
+<25E5> <25E5> <BB65>
+<25E6> <25E6> <BA60>
+<25E7> <25E7> <BA6A>
+<25E8> <25E8> <BA44>
+<25E9> <25E9> <BB58>
+<25EA> <25EA> <BA84>
+<25EB> <25EB> <BA8D>
+<25EC> <25EC> <BA88>
+<25ED> <25ED> <BB66>
+<25EE> <25EE> <BB5B>
+<25EF> <25EF> <C59C>
+<25F0> <25F0> <C641>
+<25F1> <25F1> <D155>
+endbfrange
+
+100 beginbfrange
+<25F2> <25F2> <C175>
+<25F3> <25F3> <BC63>
+<25F4> <25F4> <BC67>
+<25F5> <25F5> <BC52>
+<25F6> <25F6> <BF7B>
+<25F7> <25F7> <FB9F>
+<25F8> <25F8> <DA8E>
+<25F9> <25F9> <E189>
+<25FA> <25FA> <E187>
+<25FB> <25FB> <FB7A>
+<25FC> <25FC> <DC4F>
+<25FD> <25FD> <DB84>
+<25FE> <25FE> <DC56>
+<25FF> <25FF> <DC45>
+<2600> <2600> <DB8B>
+<2601> <2601> <DC5D>
+<2602> <2602> <DC51>
+<2603> <2603> <DC57>
+<2604> <2604> <DC55>
+<2605> <2605> <DC62>
+<2606> <2606> <DB98>
+<2607> <2607> <DC6B>
+<2608> <2608> <DC67>
+<2609> <2609> <D378>
+<260A> <260A> <D37A>
+<260B> <260B> <EC6E>
+<260C> <260C> <EC5A>
+<260D> <260D> <EC56>
+<260E> <260E> <EC5C>
+<260F> <260F> <FD5A>
+<2610> <2610> <FD65>
+<2611> <2611> <FD5F>
+<2612> <2612> <FD66>
+<2613> <2613> <FD62>
+<2614> <2614> <FD6C>
+<2615> <2615> <FD72>
+<2616> <2616> <FD70>
+<2617> <2617> <FD7D>
+<2618> <2619> <FC77>
+<261A> <261A> <FC83>
+<261B> <261B> <D787>
+<261C> <261C> <E88E>
+<261D> <261D> <E759>
+<261E> <261E> <F49C>
+<261F> <261F> <F499>
+<2620> <2620> <F545>
+<2621> <2621> <F547>
+<2622> <2622> <F552>
+<2623> <2623> <F77C>
+<2624> <2624> <B764>
+<2625> <2625> <F556>
+<2626> <2626> <F763>
+<2627> <2627> <F554>
+<2628> <2628> <F571>
+<2629> <2629> <F55E>
+<262A> <262A> <F56E>
+<262B> <262B> <F562>
+<262C> <262C> <F771>
+<262D> <262D> <F56F>
+<262E> <262E> <F561>
+<262F> <262F> <F75C>
+<2630> <2630> <F586>
+<2631> <2631> <F77E>
+<2632> <2632> <F696>
+<2633> <2633> <F69E>
+<2634> <2634> <F688>
+<2635> <2635> <F69C>
+<2636> <2636> <F585>
+<2637> <2637> <F58F>
+<2638> <2638> <F58C>
+<2639> <2639> <F661>
+<263A> <263A> <F59B>
+<263B> <263C> <F64E>
+<263D> <263D> <F645>
+<263E> <263E> <F648>
+<263F> <263F> <F64B>
+<2640> <2640> <F641>
+<2641> <2641> <F646>
+<2642> <2642> <F654>
+<2643> <2643> <F5A0>
+<2644> <2644> <F658>
+<2645> <2645> <F599>
+<2646> <2646> <F761>
+<2647> <2647> <F66C>
+<2648> <2648> <F674>
+<2649> <2649> <F671>
+<264A> <264A> <F676>
+<264B> <264B> <F66D>
+<264C> <264C> <F663>
+<264D> <264D> <F685>
+<264E> <264E> <F697>
+<264F> <264F> <F692>
+<2650> <2650> <F68D>
+<2651> <2651> <F68A>
+<2652> <2652> <F68E>
+<2653> <2653> <F698>
+<2654> <2654> <F742>
+<2655> <2655> <F74C>
+<2656> <2656> <F6A0>
+<2657> <2657> <F69A>
+endbfrange
+
+100 beginbfrange
+<2658> <2658> <F749>
+<2659> <2659> <F75A>
+<265A> <265A> <F758>
+<265B> <265B> <F756>
+<265C> <265C> <F76B>
+<265D> <265D> <ED5E>
+<265E> <265E> <ED58>
+<265F> <265F> <ED64>
+<2660> <2660> <FA58>
+<2661> <2661> <F374>
+<2662> <2662> <F379>
+<2663> <2663> <F378>
+<2664> <2664> <F47C>
+<2665> <2665> <F475>
+<2666> <2666> <F08B>
+<2667> <2667> <F090>
+<2668> <2668> <F457>
+<2669> <2669> <FC74>
+<266A> <266A> <FC6F>
+<266B> <266B> <D26F>
+<266C> <266C> <E99B>
+<266D> <266D> <E56C>
+<266E> <266E> <8F95>
+<266F> <266F> <CA4E>
+<2670> <2670> <C075>
+<2671> <2671> <FD69>
+<2672> <2672> <878E>
+<2673> <2673> <FC8A>
+<2674> <2674> <8766>
+<2675> <2675> <F38C>
+<2676> <2676> <D17D>
+<2677> <2677> <B759>
+<2678> <2678> <EF57>
+<2679> <2679> <E978>
+<267A> <267A> <F445>
+<267B> <267B> <DE92>
+<267C> <267C> <8FA1>
+<267D> <267D> <B782>
+<267E> <267E> <EF7C>
+<267F> <267F> <82ED>
+<2680> <2680> <CB4B>
+<2681> <2681> <838D>
+<2682> <2682> <92D4>
+<2683> <2683> <8477>
+<2684> <2684> <B197>
+<2685> <2685> <C06E>
+<2686> <2686> <95D1>
+<2687> <2687> <B274>
+<2688> <2688> <FB75>
+<2689> <2689> <87D3>
+<268A> <268A> <FC71>
+<268B> <268B> <9DF7>
+<268C> <268C> <91BA>
+<268D> <268D> <B289>
+<268E> <268E> <9E85>
+<268F> <268F> <FC49>
+<2690> <2690> <D060>
+<2691> <2691> <EA56>
+<2692> <2692> <ED61>
+<2693> <2693> <BB60>
+<2694> <2694> <BF79>
+<2695> <2695> <ED46>
+<2696> <2696> <FC44>
+<2697> <2697> <87D5>
+<2698> <2698> <EF55>
+<2699> <2699> <9985>
+<269A> <269A> <C09D>
+<269B> <269B> <BC61>
+<269C> <269C> <8253>
+<269D> <269D> <C04D>
+<269E> <269E> <FB79>
+<269F> <269F> <87BB>
+<26A0> <26A0> <F450>
+<26A1> <26A1> <C899>
+<26A2> <26A2> <B652>
+<26A3> <26A3> <BB6E>
+<26A4> <26A4> <F376>
+<26A5> <26A5> <EB62>
+<26A6> <26A6> <BF40>
+<26A7> <26A7> <D175>
+<26A8> <26A8> <B370>
+<26A9> <26B2> <A2A1>
+<26B3> <26F1> <A840>
+<26F2> <26FF> <A880>
+<2700> <2707> <A88E>
+<2708> <271F> <A940>
+<2720> <2721> <A959>
+<2722> <2722> <A95C>
+<2723> <2741> <A960>
+<2742> <2757> <A980>
+<2758> <2790> <8140>
+<2791> <2795> <817A>
+<2796> <279B> <8180>
+<279C> <27FF> <8187>
+<2800> <2801> <81EB>
+<2802> <2809> <81EE>
+<280A> <2811> <81F7>
+<2812> <2824> <8240>
+<2825> <2832> <8254>
+<2833> <2843> <8263>
+endbfrange
+
+100 beginbfrange
+<2844> <2848> <8275>
+<2849> <284A> <827B>
+<284B> <284B> <827E>
+<284C> <284D> <8281>
+<284E> <2859> <8284>
+<285A> <286D> <8291>
+<286E> <288F> <82A6>
+<2890> <28A6> <82CA>
+<28A7> <28A7> <82E2>
+<28A8> <28AF> <82E5>
+<28B0> <28B3> <82EE>
+<28B4> <28B7> <82F3>
+<28B8> <28B8> <82FA>
+<28B9> <28BB> <82FC>
+<28BC> <28BC> <8340>
+<28BD> <28BF> <8342>
+<28C0> <28C1> <8346>
+<28C2> <28C4> <8349>
+<28C5> <28CA> <834D>
+<28CB> <28CD> <8354>
+<28CE> <28D3> <8358>
+<28D4> <28D9> <835F>
+<28DA> <28E4> <8367>
+<28E5> <28E9> <8373>
+<28EA> <28EA> <8379>
+<28EB> <28EB> <837B>
+<28EC> <28EC> <837D>
+<28ED> <28F1> <8381>
+<28F2> <28F3> <8387>
+<28F4> <28F5> <838B>
+<28F6> <28FB> <838E>
+<28FC> <28FF> <8395>
+<2900> <2904> <8399>
+<2905> <290B> <839F>
+<290C> <290F> <83A7>
+<2910> <2911> <83AC>
+<2912> <291A> <83B1>
+<291B> <2928> <83BB>
+<2929> <2954> <83CA>
+<2955> <295C> <83F7>
+<295D> <296C> <8440>
+<296D> <298C> <8451>
+<298D> <298E> <8472>
+<298F> <2990> <8475>
+<2991> <2997> <8478>
+<2998> <2999> <8480>
+<299A> <29A4> <8483>
+<29A5> <29A7> <848F>
+<29A8> <29B0> <8494>
+<29B1> <29B3> <849E>
+<29B4> <29B4> <84A4>
+<29B5> <29B6> <84A7>
+<29B7> <29D1> <84AA>
+<29D2> <29DE> <84C6>
+<29DF> <29DF> <84D4>
+<29E0> <29E0> <84D6>
+<29E1> <29E1> <84D8>
+<29E2> <29E3> <84DB>
+<29E4> <29EF> <84DE>
+<29F0> <29F2> <84EB>
+<29F3> <29F4> <84EF>
+<29F5> <29FF> <84F2>
+<2A00> <2A01> <84FD>
+<2A02> <2A12> <8540>
+<2A13> <2A13> <8553>
+<2A14> <2A1C> <8555>
+<2A1D> <2A23> <855F>
+<2A24> <2A3B> <8567>
+<2A3C> <2A42> <8580>
+<2A43> <2A45> <8588>
+<2A46> <2A4B> <858C>
+<2A4C> <2A4E> <8593>
+<2A4F> <2A4F> <8597>
+<2A50> <2A58> <8599>
+<2A59> <2A67> <85A3>
+<2A68> <2AB3> <85B3>
+<2AB4> <2ABD> <8640>
+<2ABE> <2AC6> <864B>
+<2AC7> <2AD9> <8655>
+<2ADA> <2AEF> <8669>
+<2AF0> <2AFF> <8680>
+<2B00> <2B05> <8690>
+<2B06> <2B07> <8697>
+<2B08> <2B0E> <869A>
+<2B0F> <2B36> <86A2>
+<2B37> <2B37> <86CB>
+<2B38> <2B38> <86CD>
+<2B39> <2B3A> <86CF>
+<2B3B> <2B44> <86D2>
+<2B45> <2B47> <86DE>
+<2B48> <2B4D> <86E2>
+<2B4E> <2B52> <86E9>
+<2B53> <2B57> <86EF>
+<2B58> <2B61> <86F5>
+<2B62> <2B64> <8741>
+<2B65> <2B68> <8745>
+<2B69> <2B69> <874A>
+<2B6A> <2B6B> <874D>
+<2B6C> <2B72> <8750>
+<2B73> <2B74> <8758>
+endbfrange
+
+100 beginbfrange
+<2B75> <2B75> <875D>
+<2B76> <2B76> <875F>
+<2B77> <2B7B> <8761>
+<2B7C> <2B8E> <8767>
+<2B8F> <2B90> <877B>
+<2B91> <2B91> <877E>
+<2B92> <2B92> <8780>
+<2B93> <2B95> <8783>
+<2B96> <2B96> <8787>
+<2B97> <2B97> <8789>
+<2B98> <2B99> <878B>
+<2B9A> <2B9D> <878F>
+<2B9E> <2BA1> <8794>
+<2BA2> <2BA5> <8799>
+<2BA6> <2BAA> <879E>
+<2BAB> <2BAD> <87A4>
+<2BAE> <2BB8> <87A8>
+<2BB9> <2BB9> <87B4>
+<2BBA> <2BBE> <87B6>
+<2BBF> <2BC1> <87BC>
+<2BC2> <2BC2> <87C1>
+<2BC3> <2BC9> <87C3>
+<2BCA> <2BCB> <87CD>
+<2BCC> <2BCD> <87D0>
+<2BCE> <2BCE> <87D4>
+<2BCF> <2BD2> <87D6>
+<2BD3> <2BEE> <87DB>
+<2BEF> <2BEF> <87F9>
+<2BF0> <2BF3> <87FB>
+<2BF4> <2BF5> <8842>
+<2BF6> <2BF6> <8845>
+<2BF7> <2BFF> <8847>
+<2C00> <2C2E> <8850>
+<2C2F> <2C68> <8880>
+<2C69> <2C79> <88BB>
+<2C7A> <2C80> <88CD>
+<2C81> <2C82> <88D5>
+<2C83> <2C89> <88D8>
+<2C8A> <2C8E> <88E0>
+<2C8F> <2C9A> <88E6>
+<2C9B> <2C9C> <88F4>
+<2C9D> <2CA4> <88F7>
+<2CA5> <2CAF> <8940>
+<2CB0> <2CB0> <894D>
+<2CB1> <2CB1> <894F>
+<2CB2> <2CB4> <8951>
+<2CB5> <2CBC> <8955>
+<2CBD> <2CBD> <895E>
+<2CBE> <2CCA> <8960>
+<2CCB> <2CCD> <896E>
+<2CCE> <2CD7> <8972>
+<2CD8> <2CD9> <897D>
+<2CDA> <2CE4> <8980>
+<2CE5> <2CF1> <898C>
+<2CF2> <2CF5> <899A>
+<2CF6> <2CFC> <899F>
+<2CFD> <2CFD> <89A7>
+<2CFE> <2CFF> <89A9>
+<2D00> <2D03> <89AB>
+<2D04> <2D0D> <89B0>
+<2D0E> <2D10> <89BB>
+<2D11> <2D13> <89C1>
+<2D14> <2D14> <89C7>
+<2D15> <2D19> <89C9>
+<2D1A> <2D1B> <89CF>
+<2D1C> <2D21> <89D2>
+<2D22> <2D23> <89D9>
+<2D24> <2D3B> <89DC>
+<2D3C> <2D45> <89F5>
+<2D46> <2D46> <8A40>
+<2D47> <2D5D> <8A42>
+<2D5E> <2D5E> <8A5B>
+<2D5F> <2D5F> <8A5D>
+<2D60> <2D79> <8A5F>
+<2D7A> <2D7E> <8A7A>
+<2D7F> <2DE2> <8A80>
+<2DE3> <2DFC> <8AE5>
+<2DFD> <2DFF> <8B40>
+<2E00> <2E00> <8B43>
+<2E01> <2E04> <8B45>
+<2E05> <2E34> <8B4A>
+<2E35> <2E38> <8B7B>
+<2E39> <2E44> <8B80>
+<2E45> <2E55> <8B8D>
+<2E56> <2E69> <8B9F>
+<2E6A> <2E6E> <8BB4>
+<2E6F> <2E72> <8BBA>
+<2E73> <2E79> <8BBF>
+<2E7A> <2E7A> <8BC7>
+<2E7B> <2E84> <8BCA>
+<2E85> <2E8B> <8BD5>
+<2E8C> <2E93> <8BDD>
+<2E94> <2E98> <8BE6>
+<2E99> <2E9C> <8BEC>
+<2E9D> <2EAA> <8BF1>
+<2EAB> <2EAE> <8C40>
+<2EAF> <2EB8> <8C45>
+<2EB9> <2EBF> <8C50>
+<2EC0> <2EC3> <8C58>
+<2EC4> <2EE5> <8C5D>
+endbfrange
+
+100 beginbfrange
+<2EE6> <2EF0> <8C80>
+<2EF1> <2EF1> <8C8C>
+<2EF2> <2EF2> <8C90>
+<2EF3> <2EF8> <8C93>
+<2EF9> <2EFF> <8C9B>
+<2F00> <2F00> <8CA5>
+<2F01> <2F18> <8CA8>
+<2F19> <2F29> <8CC1>
+<2F2A> <2F2A> <8CD4>
+<2F2B> <2F2D> <8CD6>
+<2F2E> <2F4C> <8CDA>
+<2F4D> <2F51> <8CFA>
+<2F52> <2F84> <8D40>
+<2F85> <2F85> <8D74>
+<2F86> <2F8A> <8D76>
+<2F8B> <2F8D> <8D7C>
+<2F8E> <2F95> <8D80>
+<2F96> <2F9B> <8D89>
+<2F9C> <2FA9> <8D90>
+<2FAA> <2FC3> <8D9F>
+<2FC4> <2FEB> <8DBA>
+<2FEC> <2FEC> <8DE3>
+<2FED> <2FEE> <8DE5>
+<2FEF> <2FFD> <8DE8>
+<2FFE> <2FFF> <8DF8>
+<3000> <3003> <8DFA>
+<3004> <3009> <8E40>
+<300A> <3018> <8E47>
+<3019> <3019> <8E57>
+<301A> <301A> <8E59>
+<301B> <3027> <8E5B>
+<3028> <302C> <8E69>
+<302D> <302D> <8E6F>
+<302E> <303B> <8E71>
+<303C> <3055> <8E81>
+<3056> <3058> <8E9C>
+<3059> <305C> <8EA0>
+<305D> <305E> <8EA5>
+<305F> <3062> <8EA8>
+<3063> <3063> <8EAD>
+<3064> <3071> <8EAF>
+<3072> <3075> <8EBF>
+<3076> <3076> <8EC4>
+<3077> <307D> <8EC6>
+<307E> <3084> <8ECF>
+<3085> <3098> <8ED8>
+<3099> <30AA> <8EED>
+<30AB> <30BC> <8F40>
+<30BD> <30C2> <8F57>
+<30C3> <30C8> <8F5E>
+<30C9> <30E2> <8F65>
+<30E3> <30E8> <8F80>
+<30E9> <30E9> <8F87>
+<30EA> <30F5> <8F89>
+<30F6> <30F6> <8F96>
+<30F7> <30F9> <8F98>
+<30FA> <30FA> <8F9C>
+<30FB> <30FD> <8F9E>
+<30FE> <30FF> <8FA2>
+<3100> <3118> <8FA4>
+<3119> <311E> <8FBE>
+<311F> <311F> <8FC5>
+<3120> <3125> <8FC7>
+<3126> <312F> <8FCE>
+<3130> <3155> <8FD9>
+<3156> <3194> <9040>
+<3195> <31B1> <9080>
+<31B2> <31CC> <909F>
+<31CD> <31D1> <90BB>
+<31D2> <31D4> <90C2>
+<31D5> <31E9> <90C6>
+<31EA> <31F9> <90DD>
+<31FA> <31FB> <90EE>
+<31FC> <31FF> <90F1>
+<3200> <3201> <90F5>
+<3202> <3208> <90F8>
+<3209> <320A> <9140>
+<320B> <3212> <9143>
+<3213> <3213> <914C>
+<3214> <3216> <914E>
+<3217> <3218> <9152>
+<3219> <321B> <9156>
+<321C> <321D> <915B>
+<321E> <3220> <915E>
+<3221> <3221> <9162>
+<3222> <322B> <9164>
+<322C> <3232> <916F>
+<3233> <3235> <9177>
+<3236> <3237> <917D>
+<3238> <323B> <9180>
+<323C> <3243> <9185>
+<3244> <3246> <918E>
+<3247> <3247> <9192>
+<3248> <324A> <9194>
+<324B> <324D> <9198>
+<324E> <325A> <919C>
+<325B> <3268> <91AC>
+<3269> <326B> <91BC>
+<326C> <326E> <91C0>
+<326F> <3277> <91C4>
+endbfrange
+
+100 beginbfrange
+<3278> <3279> <91CE>
+<327A> <327A> <91D3>
+<327B> <327B> <91D5>
+<327C> <327C> <91D7>
+<327D> <3281> <91DA>
+<3282> <3283> <91E0>
+<3284> <328A> <91E3>
+<328B> <328F> <91EB>
+<3290> <3290> <91F1>
+<3291> <329C> <91F3>
+<329D> <32DB> <9240>
+<32DC> <32FF> <9280>
+<3300> <3311> <92A4>
+<3312> <3328> <92B7>
+<3329> <3329> <92CF>
+<332A> <332C> <92D1>
+<332D> <3336> <92D5>
+<3337> <3353> <92E1>
+<3354> <3363> <9340>
+<3364> <336F> <9351>
+<3370> <3381> <935E>
+<3382> <3386> <9371>
+<3387> <338E> <9377>
+<338F> <339A> <9380>
+<339B> <33AA> <938D>
+<33AB> <33B1> <939E>
+<33B2> <33B2> <93A6>
+<33B3> <33BE> <93A8>
+<33BF> <33C1> <93B5>
+<33C2> <33C3> <93B9>
+<33C4> <33C4> <93BC>
+<33C5> <33CC> <93BE>
+<33CD> <33D4> <93C7>
+<33D5> <33DB> <93D0>
+<33DC> <33DE> <93D8>
+<33DF> <33E2> <93DD>
+<33E3> <33E4> <93E2>
+<33E5> <33E7> <93E6>
+<33E8> <33E8> <93EA>
+<33E9> <33E9> <93EE>
+<33EA> <33EA> <93F0>
+<33EB> <33EC> <93F2>
+<33ED> <33F0> <93F6>
+<33F1> <33F3> <93FB>
+<33F4> <33F7> <9440>
+<33F8> <33FF> <9445>
+<3400> <3401> <944E>
+<3402> <3402> <9454>
+<3403> <3404> <9456>
+<3405> <3406> <9459>
+<3407> <3407> <945E>
+<3408> <340B> <9460>
+<340C> <340C> <9465>
+<340D> <3413> <9467>
+<3414> <3416> <946F>
+<3417> <3417> <9473>
+<3418> <3418> <9475>
+<3419> <3419> <9477>
+<341A> <341A> <9479>
+<341B> <341E> <947B>
+<341F> <3422> <9483>
+<3423> <343A> <9489>
+<343B> <344B> <94A2>
+<344C> <344C> <94B4>
+<344D> <3455> <94B6>
+<3456> <3460> <94C1>
+<3461> <346B> <94CD>
+<346C> <3472> <94D9>
+<3473> <3490> <94E1>
+<3491> <34C2> <9540>
+<34C3> <34CE> <9573>
+<34CF> <34D1> <9580>
+<34D2> <34EB> <9584>
+<34EC> <34FE> <95A0>
+<34FF> <34FF> <95B4>
+<3500> <3504> <95B5>
+<3505> <3518> <95BB>
+<3519> <3519> <95D0>
+<351A> <351A> <95D3>
+<351B> <3526> <95D5>
+<3527> <352B> <95E2>
+<352C> <3534> <95E8>
+<3535> <353A> <95F2>
+<353B> <353F> <95F9>
+<3540> <3555> <9640>
+<3556> <357A> <9657>
+<357B> <357C> <967D>
+<357D> <35FB> <9680>
+<35FC> <35FF> <9740>
+<3600> <3622> <9744>
+<3623> <3626> <9768>
+<3627> <3627> <976D>
+<3628> <3637> <976F>
+<3638> <364D> <9780>
+<364E> <3652> <9798>
+<3653> <3657> <979E>
+<3658> <3672> <97A4>
+<3673> <36A0> <97C0>
+<36A1> <36A8> <97EF>
+<36A9> <36AF> <97F8>
+endbfrange
+
+100 beginbfrange
+<36B0> <36B4> <9840>
+<36B5> <36B7> <9846>
+<36B8> <36BC> <984A>
+<36BD> <36DD> <9850>
+<36DE> <36DE> <9872>
+<36DF> <36E9> <9874>
+<36EA> <36EA> <9880>
+<36EB> <36F3> <9882>
+<36F4> <36FF> <988D>
+<3700> <3706> <9899>
+<3707> <370F> <98A1>
+<3710> <371A> <98AB>
+<371B> <371C> <98B8>
+<371D> <3728> <98BB>
+<3729> <372B> <98C8>
+<372C> <372F> <98CC>
+<3730> <3731> <98D1>
+<3732> <3740> <98D4>
+<3741> <3749> <98E6>
+<374A> <374B> <98F0>
+<374C> <3757> <98F3>
+<3758> <375A> <9940>
+<375B> <375B> <9944>
+<375C> <377B> <9946>
+<377C> <3782> <9967>
+<3783> <3788> <996F>
+<3789> <378C> <9976>
+<378D> <378F> <997C>
+<3790> <3794> <9980>
+<3795> <3797> <9986>
+<3798> <379B> <998A>
+<379C> <379D> <998F>
+<379E> <37A4> <9992>
+<37A5> <37B3> <999A>
+<37B4> <37B9> <99AA>
+<37BA> <37BA> <99B2>
+<37BB> <37C1> <99B6>
+<37C2> <37C2> <99BF>
+<37C3> <37C3> <99C1>
+<37C4> <37C9> <99C3>
+<37CA> <37CD> <99CA>
+<37CE> <37CF> <99CF>
+<37D0> <37D7> <99D2>
+<37D8> <37DC> <99DB>
+<37DD> <37E0> <99E1>
+<37E1> <37E2> <99E6>
+<37E3> <37E5> <99E9>
+<37E6> <37EC> <99ED>
+<37ED> <37F6> <99F5>
+<37F7> <37FF> <9A40>
+<3800> <3800> <9A49>
+<3801> <380C> <9A4B>
+<380D> <3819> <9A58>
+<381A> <381A> <9A66>
+<381B> <3823> <9A68>
+<3824> <3827> <9A72>
+<3828> <382E> <9A78>
+<382F> <3836> <9A80>
+<3837> <3839> <9A89>
+<383A> <383D> <9A8D>
+<383E> <3842> <9A92>
+<3843> <3844> <9A98>
+<3845> <3846> <9A9C>
+<3847> <3849> <9A9F>
+<384A> <384F> <9AA4>
+<3850> <3874> <9AAB>
+<3875> <3879> <9AD1>
+<387A> <387C> <9AD7>
+<387D> <3883> <9ADB>
+<3884> <3884> <9AE3>
+<3885> <389D> <9AE6>
+<389E> <38DC> <9B40>
+<38DD> <38FF> <9B80>
+<3900> <392D> <9BA3>
+<392E> <3937> <9BD2>
+<3938> <3959> <9BDD>
+<395A> <396C> <9C40>
+<396D> <3971> <9C54>
+<3972> <3972> <9C5B>
+<3973> <398A> <9C5D>
+<398B> <398D> <9C76>
+<398E> <3992> <9C7A>
+<3993> <3998> <9C80>
+<3999> <39AE> <9C87>
+<39AF> <39BB> <9C9E>
+<39BC> <39D9> <9CAC>
+<39DA> <39DD> <9CCB>
+<39DE> <39F3> <9CD0>
+<39F4> <39F7> <9CE8>
+<39F8> <39F8> <9CED>
+<39F9> <39FF> <9CEF>
+<3A00> <3A04> <9CF6>
+<3A05> <3A06> <9CFC>
+<3A07> <3A08> <9D40>
+<3A09> <3A0B> <9D43>
+<3A0C> <3A10> <9D48>
+<3A11> <3A11> <9D4E>
+<3A12> <3A22> <9D50>
+<3A23> <3A28> <9D62>
+<3A29> <3A2C> <9D6A>
+endbfrange
+
+100 beginbfrange
+<3A2D> <3A2E> <9D6F>
+<3A2F> <3A31> <9D72>
+<3A32> <3A36> <9D76>
+<3A37> <3A37> <9D7C>
+<3A38> <3A38> <9D7E>
+<3A39> <3A42> <9D80>
+<3A43> <3A44> <9D8B>
+<3A45> <3A47> <9D8E>
+<3A48> <3A4E> <9D92>
+<3A4F> <3A55> <9D9A>
+<3A56> <3A59> <9DA3>
+<3A5A> <3A5D> <9DA8>
+<3A5E> <3A61> <9DAE>
+<3A62> <3A6B> <9DB4>
+<3A6C> <3A72> <9DBF>
+<3A73> <3A74> <9DC7>
+<3A75> <3A77> <9DCA>
+<3A78> <3A7B> <9DCE>
+<3A7C> <3A7D> <9DD3>
+<3A7E> <3A88> <9DD6>
+<3A89> <3A96> <9DE3>
+<3A97> <3A98> <9DF2>
+<3A99> <3A9A> <9DF5>
+<3A9B> <3A9C> <9DF8>
+<3A9D> <3A9E> <9DFB>
+<3A9F> <3A9F> <9DFE>
+<3AA0> <3AA4> <9E40>
+<3AA5> <3AA6> <9E46>
+<3AA7> <3AAE> <9E4A>
+<3AAF> <3AAF> <9E53>
+<3AB0> <3AB0> <9E55>
+<3AB1> <3AB6> <9E57>
+<3AB7> <3AB8> <9E5F>
+<3AB9> <3AB9> <9E62>
+<3ABA> <3ABC> <9E64>
+<3ABD> <3AC0> <9E68>
+<3AC1> <3AC2> <9E6D>
+<3AC3> <3AC4> <9E70>
+<3AC5> <3AC5> <9E73>
+<3AC6> <3ACA> <9E76>
+<3ACB> <3ACC> <9E7D>
+<3ACD> <3AD1> <9E80>
+<3AD2> <3AD2> <9E86>
+<3AD3> <3ADB> <9E88>
+<3ADC> <3ADF> <9E92>
+<3AE0> <3AE9> <9E98>
+<3AEA> <3AEC> <9EA3>
+<3AED> <3AEE> <9EA7>
+<3AEF> <3AF2> <9EAA>
+<3AF3> <3AF6> <9EAF>
+<3AF7> <3AF8> <9EB5>
+<3AF9> <3AFF> <9EB8>
+<3B00> <3B35> <9EBF>
+<3B36> <3B3E> <9EF6>
+<3B3F> <3B4C> <9F40>
+<3B4D> <3B6C> <9F4F>
+<3B6D> <3B7B> <9F70>
+<3B7C> <3B8D> <9F80>
+<3B8E> <3B92> <9F93>
+<3B93> <3B9F> <9F99>
+<3BA0> <3BA1> <9FA7>
+<3BA2> <3BA3> <9FAA>
+<3BA4> <3BBF> <9FAD>
+<3BC0> <3BC2> <9FCA>
+<3BC3> <3BD5> <9FCE>
+<3BD6> <3BDE> <9FE2>
+<3BDF> <3BE0> <9FEC>
+<3BE1> <3BE5> <9FEF>
+<3BE6> <3BED> <9FF5>
+<3BEE> <3BEE> <9FFE>
+<3BEF> <3BF1> <A040>
+<3BF2> <3BF3> <A044>
+<3BF4> <3BF5> <A047>
+<3BF6> <3BF9> <A04A>
+<3BFA> <3BFE> <A04F>
+<3BFF> <3BFF> <A055>
+<3C00> <3C03> <A056>
+<3C04> <3C09> <A05B>
+<3C0A> <3C0A> <A062>
+<3C0B> <3C17> <A064>
+<3C18> <3C19> <A072>
+<3C1A> <3C23> <A075>
+<3C24> <3C33> <A081>
+<3C34> <3C35> <A092>
+<3C36> <3C36> <A095>
+<3C37> <3C48> <A097>
+<3C49> <3C5D> <A0AA>
+<3C5E> <3C6B> <A0C0>
+<3C6C> <3C75> <A0CF>
+<3C76> <3C79> <A0DA>
+<3C7A> <3C88> <A0DF>
+<3C89> <3C98> <A0EF>
+<3C99> <3CA5> <AA40>
+<3CA6> <3CC7> <AA4F>
+<3CC8> <3CC8> <AA72>
+<3CC9> <3CCB> <AA74>
+<3CCC> <3CCD> <AA78>
+<3CCE> <3CD0> <AA7C>
+<3CD1> <3CEA> <AA80>
+<3CEB> <3CEB> <AA9B>
+endbfrange
+
+100 beginbfrange
+<3CEC> <3CEC> <AA9E>
+<3CED> <3CED> <AAA0>
+<3CEE> <3CEF> <AB41>
+<3CF0> <3CF0> <AB44>
+<3CF1> <3CF1> <AB47>
+<3CF2> <3CF3> <AB4B>
+<3CF4> <3CFF> <AB4E>
+<3D00> <3D24> <AB5A>
+<3D25> <3D45> <AB80>
+<3D46> <3D4B> <AC40>
+<3D4C> <3D75> <AC47>
+<3D76> <3D7F> <AC72>
+<3D80> <3D81> <AC7D>
+<3D82> <3D8E> <AC80>
+<3D8F> <3D93> <AC8E>
+<3D94> <3D9F> <AC95>
+<3DA0> <3DA8> <AD40>
+<3DA9> <3DBC> <AD4A>
+<3DBD> <3DBE> <AD5F>
+<3DBF> <3DC4> <AD62>
+<3DC5> <3DCF> <AD69>
+<3DD0> <3DD9> <AD75>
+<3DDA> <3DDB> <AD80>
+<3DDC> <3DDF> <AD83>
+<3DE0> <3DE2> <AD88>
+<3DE3> <3DE7> <AD8C>
+<3DE8> <3DF6> <AD92>
+<3DF7> <3DFF> <AE40>
+<3E00> <3E0A> <AE49>
+<3E0B> <3E17> <AE55>
+<3E18> <3E33> <AE63>
+<3E34> <3E37> <AE81>
+<3E38> <3E3C> <AE86>
+<3E3D> <3E44> <AE8C>
+<3E45> <3E4F> <AE95>
+<3E50> <3E73> <AF40>
+<3E74> <3E89> <AF65>
+<3E8A> <3E8C> <AF7C>
+<3E8D> <3E8E> <AF80>
+<3E8F> <3E98> <AF84>
+<3E99> <3E99> <AF90>
+<3E9A> <3EA3> <AF92>
+<3EA4> <3EA5> <AF9D>
+<3EA6> <3EA6> <AFA0>
+<3EA7> <3EA7> <B040>
+<3EA8> <3EA8> <B043>
+<3EA9> <3EB2> <B045>
+<3EB3> <3EB6> <B050>
+<3EB7> <3EB8> <B055>
+<3EB9> <3EB9> <B05A>
+<3EBA> <3EBA> <B05C>
+<3EBB> <3EBB> <B05E>
+<3EBC> <3EC2> <B065>
+<3EC3> <3ED2> <B06D>
+<3ED3> <3ED3> <B07E>
+<3ED4> <3EEA> <B080>
+<3EEB> <3EEB> <B098>
+<3EEC> <3EF2> <B09A>
+<3EF3> <3EFD> <B140>
+<3EFE> <3EFE> <B14C>
+<3EFF> <3EFF> <B14E>
+<3F00> <3F00> <B151>
+<3F01> <3F2C> <B153>
+<3F2D> <3F43> <B180>
+<3F44> <3F4C> <B198>
+<3F4D> <3F4D> <B240>
+<3F4E> <3F72> <B242>
+<3F73> <3F77> <B268>
+<3F78> <3F7D> <B26E>
+<3F7E> <3F87> <B275>
+<3F88> <3F8F> <B281>
+<3F90> <3F9F> <B28A>
+<3FA0> <3FA5> <B29B>
+<3FA6> <3FA8> <B340>
+<3FA9> <3FD4> <B344>
+<3FD5> <3FE2> <B371>
+<3FE3> <3FEA> <B380>
+<3FEB> <3FED> <B389>
+<3FEE> <3FEE> <B38D>
+<3FEF> <3FFF> <B38F>
+<4000> <4000> <B3A0>
+<4001> <4014> <B440>
+<4015> <4017> <B455>
+<4018> <401C> <B459>
+<401D> <401D> <B460>
+<401E> <4030> <B462>
+<4031> <4038> <B476>
+<4039> <403B> <B480>
+<403C> <4040> <B484>
+<4041> <4049> <B48A>
+<404A> <4056> <B494>
+<4057> <4057> <B540>
+<4058> <4060> <B542>
+<4061> <406A> <B54C>
+<406B> <406D> <B557>
+<406E> <4071> <B55D>
+<4072> <408E> <B562>
+<408F> <40AA> <B580>
+<40AB> <40AD> <B59E>
+<40AE> <40BF> <B640>
+endbfrange
+
+100 beginbfrange
+<40C0> <40C1> <B653>
+<40C2> <40C4> <B656>
+<40C5> <40C5> <B65A>
+<40C6> <40E7> <B65D>
+<40E8> <40FF> <B680>
+<4100> <4108> <B698>
+<4109> <4116> <B740>
+<4117> <4118> <B74F>
+<4119> <411F> <B752>
+<4120> <4129> <B75A>
+<412A> <4139> <B767>
+<413A> <413F> <B779>
+<4140> <4140> <B781>
+<4141> <415E> <B783>
+<415F> <4161> <B840>
+<4162> <4162> <B845>
+<4163> <4168> <B847>
+<4169> <416B> <B84E>
+<416C> <4173> <B852>
+<4174> <4174> <B85C>
+<4175> <4175> <B85F>
+<4176> <418B> <B861>
+<418C> <4192> <B878>
+<4193> <4194> <B880>
+<4195> <41B2> <B883>
+<41B3> <41C2> <B940>
+<41C3> <41D2> <B951>
+<41D3> <41EB> <B962>
+<41EC> <41EE> <B97C>
+<41EF> <41FF> <B980>
+<4200> <420B> <B991>
+<420C> <420D> <B99E>
+<420E> <420F> <BA40>
+<4210> <4210> <BA43>
+<4211> <4221> <BA45>
+<4222> <4223> <BA57>
+<4224> <4229> <BA5A>
+<422A> <4232> <BA61>
+<4233> <423B> <BA6B>
+<423C> <4245> <BA75>
+<4246> <4249> <BA80>
+<424A> <424A> <BA85>
+<424B> <424B> <BA87>
+<424C> <424F> <BA89>
+<4250> <425F> <BA8E>
+<4260> <4260> <BAA0>
+<4261> <4268> <BB41>
+<4269> <4276> <BB4A>
+<4277> <4278> <BB59>
+<4279> <427B> <BB5D>
+<427C> <427F> <BB61>
+<4280> <4280> <BB67>
+<4281> <4281> <BB69>
+<4282> <4284> <BB6B>
+<4285> <4294> <BB6F>
+<4295> <42B5> <BB80>
+<42B6> <42C7> <BC40>
+<42C8> <42CD> <BC54>
+<42CE> <42D3> <BC5B>
+<42D4> <42D4> <BC62>
+<42D5> <42D5> <BC64>
+<42D6> <42D6> <BC66>
+<42D7> <42D7> <BC68>
+<42D8> <42DA> <BC6A>
+<42DB> <42DB> <BC6E>
+<42DC> <42DC> <BC70>
+<42DD> <42DD> <BC72>
+<42DE> <42DE> <BC7A>
+<42DF> <42E0> <BC7C>
+<42E1> <42E2> <BC80>
+<42E3> <42E3> <BC85>
+<42E4> <42E4> <BC87>
+<42E5> <42E7> <BC8C>
+<42E8> <42F1> <BC90>
+<42F2> <42F4> <BC9E>
+<42F5> <42F6> <BD40>
+<42F7> <42F7> <BD44>
+<42F8> <42F9> <BD46>
+<42FA> <42FA> <BD4A>
+<42FB> <42FB> <BD4C>
+<42FC> <42FC> <BD4E>
+<42FD> <42FF> <BD50>
+<4300> <4303> <BD53>
+<4304> <4304> <BD58>
+<4305> <4310> <BD5A>
+<4311> <4312> <BD68>
+<4313> <4315> <BD6C>
+<4316> <4316> <BD70>
+<4317> <431D> <BD72>
+<431E> <431F> <BD7C>
+<4320> <4320> <BD80>
+<4321> <4327> <BD82>
+<4328> <4328> <BD8A>
+<4329> <432A> <BD8C>
+<432B> <432B> <BD8F>
+<432C> <4330> <BD92>
+<4331> <4333> <BD98>
+<4334> <4338> <BD9C>
+<4339> <433B> <BE40>
+<433C> <433C> <BE44>
+endbfrange
+
+100 beginbfrange
+<433D> <433F> <BE46>
+<4340> <4345> <BE4B>
+<4346> <4346> <BE54>
+<4347> <4349> <BE5A>
+<434A> <434A> <BE61>
+<434B> <434E> <BE65>
+<434F> <4350> <BE6A>
+<4351> <4352> <BE6D>
+<4353> <4357> <BE71>
+<4358> <4358> <BE78>
+<4359> <435A> <BE7A>
+<435B> <435D> <BE80>
+<435E> <435E> <BE85>
+<435F> <435F> <BE88>
+<4360> <4361> <BE8A>
+<4362> <4362> <BE8D>
+<4363> <4364> <BE90>
+<4365> <4366> <BE93>
+<4367> <4367> <BE96>
+<4368> <4368> <BE99>
+<4369> <4369> <BE9B>
+<436A> <436B> <BE9D>
+<436C> <436C> <BEA0>
+<436D> <4378> <BF41>
+<4379> <437C> <BF51>
+<437D> <4385> <BF57>
+<4386> <4386> <BF61>
+<4387> <4389> <BF65>
+<438A> <438C> <BF69>
+<438D> <438F> <BF6D>
+<4390> <4390> <BF71>
+<4391> <4392> <BF74>
+<4393> <4393> <BF78>
+<4394> <4394> <BF7D>
+<4395> <4396> <BF80>
+<4397> <439B> <BF84>
+<439C> <43A5> <BF8B>
+<43A6> <43A6> <BF96>
+<43A7> <43AA> <BF99>
+<43AB> <43AD> <BF9E>
+<43AE> <43B0> <C041>
+<43B1> <43B6> <C045>
+<43B7> <43B7> <C04E>
+<43B8> <43B9> <C053>
+<43BA> <43BE> <C056>
+<43BF> <43C0> <C05C>
+<43C1> <43C8> <C061>
+<43C9> <43C9> <C06A>
+<43CA> <43CA> <C06C>
+<43CB> <43CB> <C06F>
+<43CC> <43CE> <C071>
+<43CF> <43CF> <C076>
+<43D0> <43D0> <C078>
+<43D1> <43D2> <C07A>
+<43D3> <43D4> <C07D>
+<43D5> <43EF> <C080>
+<43F0> <43F0> <C09C>
+<43F1> <43F3> <C09E>
+<43F4> <43FF> <C140>
+<4400> <4403> <C14C>
+<4404> <4406> <C151>
+<4407> <4410> <C155>
+<4411> <4411> <C161>
+<4412> <4423> <C163>
+<4424> <4425> <C176>
+<4426> <442B> <C179>
+<442C> <4440> <C180>
+<4441> <444B> <C196>
+<444C> <4459> <C240>
+<445A> <446F> <C24F>
+<4470> <4470> <C266>
+<4471> <4485> <C268>
+<4486> <4486> <C27E>
+<4487> <448A> <C280>
+<448B> <4498> <C285>
+<4499> <4499> <C297>
+<449A> <449A> <C29B>
+<449B> <449D> <C29D>
+<449E> <449F> <C341>
+<44A0> <44D6> <C344>
+<44D7> <44D9> <C37C>
+<44DA> <44DD> <C380>
+<44DE> <44F3> <C385>
+<44F4> <44F8> <C39C>
+<44F9> <44FF> <C440>
+<4500> <4501> <C447>
+<4502> <4503> <C44A>
+<4504> <450A> <C44D>
+<450B> <450D> <C455>
+<450E> <450F> <C459>
+<4510> <4516> <C45C>
+<4517> <4529> <C464>
+<452A> <452B> <C478>
+<452C> <452F> <C47B>
+<4530> <4530> <C480>
+<4531> <453F> <C482>
+<4540> <4543> <C494>
+<4544> <4544> <C499>
+<4545> <4545> <C49B>
+<4546> <4549> <C49D>
+endbfrange
+
+100 beginbfrange
+<454A> <454D> <C540>
+<454E> <454E> <C545>
+<454F> <4552> <C547>
+<4553> <4557> <C54D>
+<4558> <4563> <C553>
+<4564> <4566> <C560>
+<4567> <457E> <C567>
+<457F> <4591> <C580>
+<4592> <4599> <C594>
+<459A> <459A> <C59D>
+<459B> <459C> <C59F>
+<459D> <459D> <C640>
+<459E> <459F> <C642>
+<45A0> <45A1> <C645>
+<45A2> <45BC> <C648>
+<45BD> <45CA> <C664>
+<45CB> <45D6> <C673>
+<45D7> <45F7> <C680>
+<45F8> <45FF> <C740>
+<4600> <461D> <C748>
+<461E> <4625> <C767>
+<4626> <462B> <C770>
+<462C> <462F> <C777>
+<4630> <4632> <C77C>
+<4633> <4653> <C780>
+<4654> <4654> <C840>
+<4655> <4661> <C842>
+<4662> <4663> <C850>
+<4664> <4676> <C853>
+<4677> <467D> <C867>
+<467E> <468C> <C86F>
+<468D> <4693> <C880>
+<4694> <469D> <C888>
+<469E> <469E> <C893>
+<469F> <46A2> <C895>
+<46A3> <46A5> <C89A>
+<46A6> <46A8> <C89E>
+<46A9> <46B7> <C940>
+<46B8> <46D4> <C951>
+<46D5> <46D5> <C96F>
+<46D6> <46DB> <C971>
+<46DC> <46E2> <C978>
+<46E3> <46F1> <C980>
+<46F2> <46FC> <C991>
+<46FD> <46FF> <C99D>
+<4700> <4700> <C9A0>
+<4701> <470E> <CA40>
+<470F> <4715> <CA4F>
+<4716> <4717> <CA57>
+<4718> <4719> <CA5A>
+<471A> <471D> <CA5D>
+<471E> <4729> <CA62>
+<472A> <472C> <CA6F>
+<472D> <4730> <CA73>
+<4731> <4733> <CA78>
+<4734> <4734> <CA7D>
+<4735> <4735> <CA80>
+<4736> <473C> <CA82>
+<473D> <4740> <CA8A>
+<4741> <4742> <CA90>
+<4743> <4749> <CA93>
+<474A> <474F> <CA9B>
+<4750> <4752> <CB40>
+<4753> <4753> <CB44>
+<4754> <4754> <CB46>
+<4755> <4757> <CB48>
+<4758> <4759> <CB4C>
+<475A> <4761> <CB4F>
+<4762> <4766> <CB58>
+<4767> <4767> <CB5E>
+<4768> <4771> <CB60>
+<4772> <4781> <CB6B>
+<4782> <4783> <CB7D>
+<4784> <478A> <CB80>
+<478B> <4790> <CB88>
+<4791> <4793> <CB8F>
+<4794> <479C> <CB93>
+<479D> <479D> <CB9D>
+<479E> <479F> <CB9F>
+<47A0> <47A6> <CC42>
+<47A7> <47A9> <CC4C>
+<47AA> <47B5> <CC50>
+<47B6> <47B8> <CC5D>
+<47B9> <47BB> <CC61>
+<47BC> <47C3> <CC65>
+<47C4> <47CE> <CC6E>
+<47CF> <47D1> <CC7A>
+<47D2> <47D2> <CC7E>
+<47D3> <47E0> <CC80>
+<47E1> <47E5> <CC8F>
+<47E6> <47E6> <CC95>
+<47E7> <47EC> <CC97>
+<47ED> <47EF> <CC9E>
+<47F0> <47FF> <CD40>
+<4800> <482E> <CD50>
+<482F> <483E> <CD80>
+<483F> <4845> <CD91>
+<4846> <484D> <CD99>
+<484E> <4874> <CE40>
+<4875> <487E> <CE68>
+endbfrange
+
+100 beginbfrange
+<487F> <488A> <CE73>
+<488B> <488B> <CE80>
+<488C> <4890> <CE82>
+<4891> <48A3> <CE88>
+<48A4> <48A5> <CE9C>
+<48A6> <48A7> <CE9F>
+<48A8> <48B5> <CF40>
+<48B6> <48BB> <CF4F>
+<48BC> <48BD> <CF56>
+<48BE> <48C0> <CF59>
+<48C1> <48CF> <CF5D>
+<48D0> <48D5> <CF6D>
+<48D6> <48D6> <CF74>
+<48D7> <48D8> <CF76>
+<48D9> <48DB> <CF79>
+<48DC> <48DD> <CF7D>
+<48DE> <48DE> <CF80>
+<48DF> <48E5> <CF82>
+<48E6> <48ED> <CF8B>
+<48EE> <48F6> <CF95>
+<48F7> <48F7> <CF9F>
+<48F8> <48FF> <D040>
+<4900> <4904> <D048>
+<4905> <4907> <D04E>
+<4908> <490A> <D052>
+<490B> <4910> <D056>
+<4911> <4913> <D05D>
+<4914> <4919> <D061>
+<491A> <491D> <D068>
+<491E> <491E> <D06D>
+<491F> <492C> <D06F>
+<492D> <492D> <D07E>
+<492E> <494E> <D080>
+<494F> <4963> <D140>
+<4964> <4966> <D156>
+<4967> <496D> <D15A>
+<496E> <497F> <D163>
+<4980> <4986> <D176>
+<4987> <4987> <D17E>
+<4988> <49A4> <D180>
+<49A5> <49A6> <D19F>
+<49A7> <49A8> <D241>
+<49A9> <49B1> <D244>
+<49B2> <49BF> <D24E>
+<49C0> <49C5> <D25D>
+<49C6> <49C8> <D265>
+<49C9> <49CC> <D269>
+<49CD> <49CD> <D26E>
+<49CE> <49CF> <D270>
+<49D0> <49D1> <D273>
+<49D2> <49DA> <D276>
+<49DB> <49E4> <D280>
+<49E5> <49E7> <D28B>
+<49E8> <49EA> <D28F>
+<49EB> <49EC> <D293>
+<49ED> <49ED> <D296>
+<49EE> <49F5> <D298>
+<49F6> <49F9> <D340>
+<49FA> <49FC> <D345>
+<49FD> <49FD> <D349>
+<49FE> <49FF> <D34B>
+<4A00> <4A01> <D34E>
+<4A02> <4A05> <D351>
+<4A06> <4A07> <D356>
+<4A08> <4A09> <D359>
+<4A0A> <4A0A> <D35C>
+<4A0B> <4A23> <D35F>
+<4A24> <4A24> <D379>
+<4A25> <4A25> <D37B>
+<4A26> <4A27> <D37D>
+<4A28> <4A2C> <D380>
+<4A2D> <4A2F> <D388>
+<4A30> <4A30> <D38C>
+<4A31> <4A31> <D38E>
+<4A32> <4A32> <D390>
+<4A33> <4A33> <D392>
+<4A34> <4A35> <D394>
+<4A36> <4A36> <D397>
+<4A37> <4A37> <D39A>
+<4A38> <4A39> <D39C>
+<4A3A> <4A3A> <D39F>
+<4A3B> <4A3B> <D440>
+<4A3C> <4A3E> <D442>
+<4A3F> <4A3F> <D446>
+<4A40> <4A43> <D448>
+<4A44> <4A45> <D44D>
+<4A46> <4A48> <D450>
+<4A49> <4A4A> <D454>
+<4A4B> <4A4B> <D457>
+<4A4C> <4A4E> <D459>
+<4A4F> <4A53> <D45D>
+<4A54> <4A57> <D463>
+<4A58> <4A5D> <D468>
+<4A5E> <4A5E> <D46F>
+<4A5F> <4A5F> <D471>
+<4A60> <4A60> <D473>
+<4A61> <4A62> <D476>
+<4A63> <4A64> <D479>
+<4A65> <4A66> <D47C>
+<4A67> <4A68> <D480>
+endbfrange
+
+100 beginbfrange
+<4A69> <4A6A> <D485>
+<4A6B> <4A6C> <D488>
+<4A6D> <4A6D> <D48B>
+<4A6E> <4A6E> <D490>
+<4A6F> <4A6F> <D495>
+<4A70> <4A74> <D497>
+<4A75> <4A76> <D49D>
+<4A77> <4A77> <D4A0>
+<4A78> <4A7A> <D540>
+<4A7B> <4A7D> <D547>
+<4A7E> <4A80> <D54B>
+<4A81> <4A81> <D550>
+<4A82> <4A83> <D552>
+<4A84> <4A84> <D555>
+<4A85> <4A87> <D557>
+<4A88> <4A88> <D55B>
+<4A89> <4A89> <D55E>
+<4A8A> <4A8A> <D563>
+<4A8B> <4A8D> <D565>
+<4A8E> <4A90> <D569>
+<4A91> <4A91> <D56D>
+<4A92> <4A94> <D56F>
+<4A95> <4A96> <D573>
+<4A97> <4A98> <D576>
+<4A99> <4A9A> <D579>
+<4A9B> <4A9C> <D57C>
+<4A9D> <4A9D> <D580>
+<4A9E> <4A9F> <D582>
+<4AA0> <4AA0> <D585>
+<4AA1> <4AA1> <D587>
+<4AA2> <4AA2> <D589>
+<4AA3> <4AA3> <D58B>
+<4AA4> <4AA4> <D58D>
+<4AA5> <4AA7> <D590>
+<4AA8> <4AAA> <D595>
+<4AAB> <4AAB> <D59A>
+<4AAC> <4AAE> <D59C>
+<4AAF> <4AAF> <D5A0>
+<4AB0> <4AB0> <D641>
+<4AB1> <4AB3> <D644>
+<4AB4> <4AB4> <D648>
+<4AB5> <4AB6> <D64B>
+<4AB7> <4AB7> <D64E>
+<4AB8> <4AB9> <D650>
+<4ABA> <4ABA> <D655>
+<4ABB> <4ABB> <D657>
+<4ABC> <4ABC> <D659>
+<4ABD> <4ABD> <D65B>
+<4ABE> <4ABE> <D65F>
+<4ABF> <4AC1> <D662>
+<4AC2> <4AC4> <D666>
+<4AC5> <4AC5> <D66A>
+<4AC6> <4AC8> <D66C>
+<4AC9> <4AC9> <D670>
+<4ACA> <4ACA> <D673>
+<4ACB> <4ACB> <D677>
+<4ACC> <4ACE> <D679>
+<4ACF> <4AD0> <D67D>
+<4AD1> <4AD3> <D680>
+<4AD4> <4AD5> <D684>
+<4AD6> <4ADA> <D689>
+<4ADB> <4ADF> <D68F>
+<4AE0> <4AE3> <D695>
+<4AE4> <4AEA> <D69A>
+<4AEB> <4AED> <D740>
+<4AEE> <4AF1> <D744>
+<4AF2> <4AF7> <D74A>
+<4AF8> <4AF8> <D751>
+<4AF9> <4AF9> <D755>
+<4AFA> <4AFF> <D757>
+<4B00> <4B06> <D75D>
+<4B07> <4B08> <D765>
+<4B09> <4B0B> <D769>
+<4B0C> <4B0D> <D76D>
+<4B0E> <4B12> <D770>
+<4B13> <4B14> <D776>
+<4B15> <4B1A> <D779>
+<4B1B> <4B1D> <D780>
+<4B1E> <4B20> <D784>
+<4B21> <4B23> <D788>
+<4B24> <4B24> <D78D>
+<4B25> <4B29> <D790>
+<4B2A> <4B2A> <D796>
+<4B2B> <4B33> <D798>
+<4B34> <4B40> <D840>
+<4B41> <4B45> <D84E>
+<4B46> <4B70> <D854>
+<4B71> <4B80> <D880>
+<4B81> <4B81> <D892>
+<4B82> <4B85> <D896>
+<4B86> <4B86> <D8A0>
+<4B87> <4B87> <D940>
+<4B88> <4B88> <D943>
+<4B89> <4B89> <D947>
+<4B8A> <4B8A> <D94B>
+<4B8B> <4B8B> <D950>
+<4B8C> <4B8C> <D958>
+<4B8D> <4B8D> <D95B>
+<4B8E> <4B93> <D95D>
+<4B94> <4B94> <D966>
+endbfrange
+
+100 beginbfrange
+<4B95> <4B98> <D968>
+<4B99> <4B99> <D96D>
+<4B9A> <4B9A> <D96F>
+<4B9B> <4B9B> <D971>
+<4B9C> <4B9C> <D977>
+<4B9D> <4B9E> <D97A>
+<4B9F> <4BA4> <D981>
+<4BA5> <4BA9> <D988>
+<4BAA> <4BAE> <D992>
+<4BAF> <4BB0> <D999>
+<4BB1> <4BB1> <D99C>
+<4BB2> <4BB2> <D99F>
+<4BB3> <4BB3> <DA40>
+<4BB4> <4BB8> <DA43>
+<4BB9> <4BBC> <DA49>
+<4BBD> <4BE0> <DA4F>
+<4BE1> <4BE3> <DA74>
+<4BE4> <4BEA> <DA78>
+<4BEB> <4BEF> <DA80>
+<4BF0> <4BF7> <DA86>
+<4BF8> <4BFF> <DA8F>
+<4C00> <4C09> <DA97>
+<4C0A> <4C29> <DB40>
+<4C2A> <4C40> <DB61>
+<4C41> <4C46> <DB79>
+<4C47> <4C4A> <DB80>
+<4C4B> <4C50> <DB85>
+<4C51> <4C5C> <DB8C>
+<4C5D> <4C64> <DB99>
+<4C65> <4C69> <DC40>
+<4C6A> <4C72> <DC46>
+<4C73> <4C73> <DC52>
+<4C74> <4C74> <DC54>
+<4C75> <4C79> <DC58>
+<4C7A> <4C7D> <DC5E>
+<4C7E> <4C80> <DC63>
+<4C81> <4C83> <DC68>
+<4C84> <4C93> <DC6C>
+<4C94> <4C95> <DC7D>
+<4C96> <4C9C> <DC80>
+<4C9D> <4C9F> <DC8B>
+<4CA0> <4CA0> <DC8F>
+<4CA1> <4CA6> <DC91>
+<4CA7> <4CA9> <DC98>
+<4CAA> <4CAD> <DC9C>
+<4CAE> <4CB3> <DD40>
+<4CB4> <4CB9> <DD47>
+<4CBA> <4CBE> <DD4E>
+<4CBF> <4CBF> <DD58>
+<4CC0> <4CC3> <DD5A>
+<4CC4> <4CC4> <DD5F>
+<4CC5> <4CC5> <DD61>
+<4CC6> <4CC6> <DD63>
+<4CC7> <4CCD> <DD66>
+<4CCE> <4CCE> <DD6E>
+<4CCF> <4CD3> <DD71>
+<4CD4> <4CD7> <DD7B>
+<4CD8> <4CD8> <DD80>
+<4CD9> <4CDA> <DD83>
+<4CDB> <4CDE> <DD87>
+<4CDF> <4CE1> <DD8C>
+<4CE2> <4CE5> <DD90>
+<4CE6> <4CE7> <DD95>
+<4CE8> <4CE9> <DD98>
+<4CEA> <4CEB> <DD9C>
+<4CEC> <4CEC> <DD9F>
+<4CED> <4CEE> <DE42>
+<4CEF> <4CF1> <DE45>
+<4CF2> <4CF6> <DE4A>
+<4CF7> <4CFF> <DE50>
+<4D00> <4D00> <DE59>
+<4D01> <4D01> <DE5B>
+<4D02> <4D02> <DE5E>
+<4D03> <4D0D> <DE60>
+<4D0E> <4D10> <DE6C>
+<4D11> <4D1C> <DE73>
+<4D1D> <4D2E> <DE80>
+<4D2F> <4D3A> <DE93>
+<4D3B> <4D3B> <DEA0>
+<4D3C> <4D3C> <DF41>
+<4D3D> <4D46> <DF43>
+<4D47> <4D54> <DF4E>
+<4D55> <4D55> <DF5D>
+<4D56> <4D58> <DF61>
+<4D59> <4D59> <DF65>
+<4D5A> <4D5A> <DF67>
+<4D5B> <4D5E> <DF69>
+<4D5F> <4D64> <DF6E>
+<4D65> <4D66> <DF75>
+<4D67> <4D67> <DF79>
+<4D68> <4D68> <DF7B>
+<4D69> <4D69> <DF7D>
+<4D6A> <4D6B> <DF81>
+<4D6C> <4D6C> <DF84>
+<4D6D> <4D6F> <DF86>
+<4D70> <4D85> <DF8B>
+<4D86> <4D95> <E040>
+<4D96> <4DA1> <E051>
+<4DA2> <4DAC> <E05E>
+<4DAD> <4DAE> <E06A>
+endbfrange
+
+100 beginbfrange
+<4DAF> <4DB6> <E06D>
+<4DB7> <4DB7> <E076>
+<4DB8> <4DB8> <E078>
+<4DB9> <4DBD> <E07A>
+<4DBE> <4DC4> <E080>
+<4DC5> <4DC9> <E088>
+<4DCA> <4DCA> <E08E>
+<4DCB> <4DCB> <E091>
+<4DCC> <4DCC> <E093>
+<4DCD> <4DCE> <E095>
+<4DCF> <4DD7> <E098>
+<4DD8> <4DD9> <E140>
+<4DDA> <4DFA> <E143>
+<4DFB> <4DFD> <E165>
+<4DFE> <4DFF> <E169>
+<4E00> <4E08> <E16B>
+<4E09> <4E11> <E176>
+<4E12> <4E15> <E180>
+<4E16> <4E16> <E186>
+<4E17> <4E17> <E188>
+<4E18> <4E19> <E18A>
+<4E1A> <4E1A> <E18D>
+<4E1B> <4E1B> <E192>
+<4E1C> <4E1D> <E196>
+<4E1E> <4E22> <E199>
+<4E23> <4E23> <E1A0>
+<4E24> <4E24> <E240>
+<4E25> <4E25> <E242>
+<4E26> <4E30> <E244>
+<4E31> <4E31> <E250>
+<4E32> <4E32> <E252>
+<4E33> <4E37> <E255>
+<4E38> <4E39> <E25C>
+<4E3A> <4E3C> <E25F>
+<4E3D> <4E3F> <E264>
+<4E40> <4E40> <E269>
+<4E41> <4E42> <E26C>
+<4E43> <4E4A> <E270>
+<4E4B> <4E4E> <E279>
+<4E4F> <4E4F> <E27E>
+<4E50> <4E55> <E283>
+<4E56> <4E56> <E28A>
+<4E57> <4E58> <E28C>
+<4E59> <4E5A> <E290>
+<4E5B> <4E5C> <E296>
+<4E5D> <4E60> <E29C>
+<4E61> <4E62> <E340>
+<4E63> <4E65> <E344>
+<4E66> <4E68> <E348>
+<4E69> <4E6B> <E34C>
+<4E6C> <4E6C> <E350>
+<4E6D> <4E6E> <E352>
+<4E6F> <4E70> <E356>
+<4E71> <4E73> <E359>
+<4E74> <4E76> <E35D>
+<4E77> <4E7B> <E361>
+<4E7C> <4E84> <E368>
+<4E85> <4E85> <E372>
+<4E86> <4E88> <E375>
+<4E89> <4E8A> <E37A>
+<4E8B> <4E8B> <E37D>
+<4E8C> <4E95> <E380>
+<4E96> <4E96> <E38B>
+<4E97> <4E98> <E38D>
+<4E99> <4E99> <E390>
+<4E9A> <4E9A> <E392>
+<4E9B> <4E9B> <E394>
+<4E9C> <4E9E> <E396>
+<4E9F> <4EA0> <E39A>
+<4EA1> <4EA1> <E39D>
+<4EA2> <4EA2> <E3A0>
+<4EA3> <4EA5> <E445>
+<4EA6> <4EAA> <E449>
+<4EAB> <4EAB> <E44F>
+<4EAC> <4EAC> <E451>
+<4EAD> <4EB0> <E454>
+<4EB1> <4EB1> <E459>
+<4EB2> <4EB2> <E45B>
+<4EB3> <4EB3> <E45D>
+<4EB4> <4EB6> <E45F>
+<4EB7> <4EB8> <E463>
+<4EB9> <4EBA> <E466>
+<4EBB> <4EC4> <E469>
+<4EC5> <4EC5> <E474>
+<4EC6> <4EC8> <E476>
+<4EC9> <4EC9> <E47D>
+<4ECA> <4ECA> <E480>
+<4ECB> <4ECC> <E482>
+<4ECD> <4ED0> <E489>
+<4ED1> <4ED1> <E48E>
+<4ED2> <4ED4> <E490>
+<4ED5> <4ED8> <E494>
+<4ED9> <4EDC> <E499>
+<4EDD> <4EDD> <E4A0>
+<4EDE> <4EE3> <E540>
+<4EE4> <4EE4> <E547>
+<4EE5> <4EE6> <E549>
+<4EE7> <4EE8> <E54C>
+<4EE9> <4EEB> <E552>
+<4EEC> <4EEC> <E557>
+endbfrange
+
+100 beginbfrange
+<4EED> <4EEF> <E559>
+<4EF0> <4EF0> <E55D>
+<4EF1> <4EF2> <E55F>
+<4EF3> <4EF4> <E562>
+<4EF5> <4EF6> <E566>
+<4EF7> <4EF8> <E56A>
+<4EF9> <4EF9> <E56D>
+<4EFA> <4EFF> <E56F>
+<4F00> <4F00> <E577>
+<4F01> <4F02> <E579>
+<4F03> <4F04> <E57D>
+<4F05> <4F05> <E580>
+<4F06> <4F06> <E582>
+<4F07> <4F0C> <E584>
+<4F0D> <4F0F> <E58B>
+<4F10> <4F11> <E58F>
+<4F12> <4F19> <E592>
+<4F1A> <4F1C> <E59C>
+<4F1D> <4F1D> <E5A0>
+<4F1E> <4F20> <E641>
+<4F21> <4F24> <E645>
+<4F25> <4F27> <E64B>
+<4F28> <4F2A> <E64F>
+<4F2B> <4F2D> <E653>
+<4F2E> <4F2E> <E657>
+<4F2F> <4F30> <E659>
+<4F31> <4F32> <E65C>
+<4F33> <4F3C> <E65F>
+<4F3D> <4F3D> <E66A>
+<4F3E> <4F46> <E66C>
+<4F47> <4F48> <E677>
+<4F49> <4F49> <E67B>
+<4F4A> <4F4A> <E67E>
+<4F4B> <4F4B> <E681>
+<4F4C> <4F4C> <E683>
+<4F4D> <4F4E> <E685>
+<4F4F> <4F4F> <E688>
+<4F50> <4F51> <E68A>
+<4F52> <4F57> <E68D>
+<4F58> <4F5A> <E694>
+<4F5B> <4F5D> <E698>
+<4F5E> <4F5F> <E69D>
+<4F60> <4F62> <E740>
+<4F63> <4F66> <E744>
+<4F67> <4F69> <E74A>
+<4F6A> <4F6A> <E751>
+<4F6B> <4F6B> <E754>
+<4F6C> <4F6E> <E756>
+<4F6F> <4F7A> <E75A>
+<4F7B> <4F7B> <E767>
+<4F7C> <4F7C> <E769>
+<4F7D> <4F85> <E76B>
+<4F86> <4F8C> <E775>
+<4F8D> <4F8E> <E77D>
+<4F8F> <4F90> <E780>
+<4F91> <4F91> <E783>
+<4F92> <4F94> <E787>
+<4F95> <4F97> <E78C>
+<4F98> <4F99> <E790>
+<4F9A> <4F9E> <E793>
+<4F9F> <4FA3> <E79B>
+<4FA4> <4FA6> <E840>
+<4FA7> <4FA7> <E845>
+<4FA8> <4FA9> <E847>
+<4FAA> <4FAA> <E84A>
+<4FAB> <4FAD> <E84C>
+<4FAE> <4FB1> <E850>
+<4FB2> <4FB6> <E855>
+<4FB7> <4FB7> <E85B>
+<4FB8> <4FBC> <E85D>
+<4FBD> <4FBD> <E863>
+<4FBE> <4FC8> <E865>
+<4FC9> <4FCA> <E871>
+<4FCB> <4FCB> <E874>
+<4FCC> <4FD1> <E876>
+<4FD2> <4FD3> <E87D>
+<4FD4> <4FD4> <E881>
+<4FD5> <4FD8> <E883>
+<4FD9> <4FD9> <E888>
+<4FDA> <4FDB> <E88A>
+<4FDC> <4FEC> <E890>
+<4FED> <4FF8> <E940>
+<4FF9> <4FFF> <E94D>
+<5000> <5000> <E955>
+<5001> <5002> <E958>
+<5003> <5004> <E95B>
+<5005> <5005> <E95E>
+<5006> <5006> <E961>
+<5007> <5007> <E964>
+<5008> <5008> <E966>
+<5009> <500B> <E969>
+<500C> <5013> <E96D>
+<5014> <5014> <E976>
+<5015> <5016> <E97A>
+<5017> <5017> <E97E>
+<5018> <501B> <E983>
+<501C> <501E> <E988>
+<501F> <5020> <E98C>
+<5021> <5021> <E98F>
+<5022> <5024> <E995>
+endbfrange
+
+100 beginbfrange
+<5025> <5026> <E999>
+<5027> <5027> <E99C>
+<5028> <5028> <E99E>
+<5029> <502B> <EA41>
+<502C> <502E> <EA45>
+<502F> <5033> <EA4B>
+<5034> <5034> <EA51>
+<5035> <5036> <EA53>
+<5037> <5038> <EA57>
+<5039> <505D> <EA5A>
+<505E> <5060> <EA81>
+<5061> <5062> <EA85>
+<5063> <5068> <EA88>
+<5069> <5069> <EA8F>
+<506A> <506D> <EA92>
+<506E> <5076> <EA97>
+<5077> <5077> <EB40>
+<5078> <507A> <EB42>
+<507B> <507C> <EB46>
+<507D> <5086> <EB49>
+<5087> <5087> <EB54>
+<5088> <508C> <EB56>
+<508D> <508D> <EB5C>
+<508E> <508F> <EB5E>
+<5090> <5090> <EB61>
+<5091> <509A> <EB63>
+<509B> <509C> <EB6E>
+<509D> <509D> <EB71>
+<509E> <50A1> <EB74>
+<50A2> <50A6> <EB7A>
+<50A7> <50AB> <EB80>
+<50AC> <50AF> <EB86>
+<50B0> <50C5> <EB8B>
+<50C6> <50CB> <EC40>
+<50CC> <50DA> <EC47>
+<50DB> <50DD> <EC57>
+<50DE> <50DE> <EC5B>
+<50DF> <50E1> <EC5D>
+<50E2> <50EE> <EC61>
+<50EF> <50F5> <EC6F>
+<50F6> <50FD> <EC77>
+<50FE> <50FF> <EC80>
+<5100> <5113> <EC82>
+<5114> <511D> <EC97>
+<511E> <5123> <ED40>
+<5124> <5134> <ED47>
+<5135> <5139> <ED59>
+<513A> <513B> <ED5F>
+<513C> <513D> <ED62>
+<513E> <513E> <ED65>
+<513F> <5144> <ED68>
+<5145> <5149> <ED6F>
+<514A> <514B> <ED75>
+<514C> <514C> <ED78>
+<514D> <5151> <ED7A>
+<5152> <5162> <ED80>
+<5163> <5163> <ED92>
+<5164> <5164> <ED96>
+<5165> <5165> <ED9B>
+<5166> <5166> <ED9D>
+<5167> <5167> <ED9F>
+<5168> <516A> <EE45>
+<516B> <516D> <EE4A>
+<516E> <5171> <EE4E>
+<5172> <5173> <EE53>
+<5174> <5174> <EE56>
+<5175> <517A> <EE58>
+<517B> <517C> <EE5F>
+<517D> <5182> <EE62>
+<5183> <5184> <EE6A>
+<5185> <5185> <EE6D>
+<5186> <518D> <EE6F>
+<518E> <5192> <EE78>
+<5193> <5196> <EE81>
+<5197> <5199> <EE87>
+<519A> <519A> <EE8C>
+<519B> <519C> <EE8E>
+<519D> <519F> <EE91>
+<51A0> <51A1> <EE95>
+<51A2> <51A2> <EE98>
+<51A3> <51A5> <EE9A>
+<51A6> <51A7> <EE9F>
+<51A8> <51A8> <EF43>
+<51A9> <51AE> <EF46>
+<51AF> <51B3> <EF4D>
+<51B4> <51B4> <EF54>
+<51B5> <51B5> <EF56>
+<51B6> <51B7> <EF58>
+<51B8> <51BC> <EF5B>
+<51BD> <51C3> <EF61>
+<51C4> <51C4> <EF69>
+<51C5> <51C5> <EF6B>
+<51C6> <51CF> <EF6D>
+<51D0> <51D1> <EF78>
+<51D2> <51D2> <EF7B>
+<51D3> <51D4> <EF7D>
+<51D5> <51D6> <EF80>
+<51D7> <51D7> <EF85>
+<51D8> <51D8> <EF87>
+<51D9> <51DA> <EF89>
+endbfrange
+
+100 beginbfrange
+<51DB> <51DB> <EF8C>
+<51DC> <51E2> <EF8E>
+<51E3> <51E6> <EF98>
+<51E7> <51E7> <EF9D>
+<51E8> <51E9> <EF9F>
+<51EA> <51EA> <F040>
+<51EB> <51EB> <F043>
+<51EC> <51ED> <F045>
+<51EE> <51F1> <F04A>
+<51F2> <51F3> <F04F>
+<51F4> <51F5> <F052>
+<51F6> <51F7> <F055>
+<51F8> <51FD> <F058>
+<51FE> <51FF> <F05F>
+<5200> <5206> <F061>
+<5207> <5209> <F069>
+<520A> <520D> <F06D>
+<520E> <520E> <F072>
+<520F> <5211> <F075>
+<5212> <5212> <F079>
+<5213> <5214> <F07B>
+<5215> <5218> <F083>
+<5219> <521A> <F089>
+<521B> <521E> <F08C>
+<521F> <521F> <F091>
+<5220> <5222> <F093>
+<5223> <522C> <F097>
+<522D> <523E> <F140>
+<523F> <5240> <F155>
+<5241> <5241> <F158>
+<5242> <524D> <F15B>
+<524E> <525B> <F168>
+<525C> <525C> <F179>
+<525D> <525E> <F17C>
+<525F> <525F> <F181>
+<5260> <5260> <F183>
+<5261> <5261> <F185>
+<5262> <5262> <F187>
+<5263> <526C> <F18A>
+<526D> <526F> <F195>
+<5270> <5277> <F199>
+<5278> <527C> <F240>
+<527D> <527D> <F246>
+<527E> <5280> <F248>
+<5281> <5287> <F24C>
+<5288> <528D> <F256>
+<528E> <528F> <F25D>
+<5290> <52A0> <F260>
+<52A1> <52A1> <F272>
+<52A2> <52A2> <F275>
+<52A3> <52A7> <F277>
+<52A8> <52AC> <F280>
+<52AD> <52AD> <F286>
+<52AE> <52B1> <F28D>
+<52B2> <52B3> <F292>
+<52B4> <52B4> <F295>
+<52B5> <52B9> <F297>
+<52BA> <52BA> <F29D>
+<52BB> <52BC> <F29F>
+<52BD> <52BF> <F342>
+<52C0> <52C1> <F346>
+<52C2> <52C2> <F349>
+<52C3> <52C6> <F34C>
+<52C7> <52D6> <F351>
+<52D7> <52E8> <F362>
+<52E9> <52E9> <F375>
+<52EA> <52EE> <F37A>
+<52EF> <52FA> <F380>
+<52FB> <52FF> <F38D>
+<5300> <530D> <F392>
+<530E> <5312> <F440>
+<5313> <531C> <F446>
+<531D> <5322> <F451>
+<5323> <5323> <F458>
+<5324> <5324> <F45A>
+<5325> <5325> <F45C>
+<5326> <5329> <F45E>
+<532A> <532A> <F463>
+<532B> <533A> <F465>
+<533B> <5340> <F476>
+<5341> <5341> <F47D>
+<5342> <5355> <F480>
+<5356> <5359> <F495>
+<535A> <535B> <F49A>
+<535C> <535F> <F49D>
+<5360> <5364> <F540>
+<5365> <5365> <F546>
+<5366> <536F> <F548>
+<5370> <5370> <F553>
+<5371> <5377> <F557>
+<5378> <5379> <F55F>
+<537A> <5384> <F563>
+<5385> <5385> <F570>
+<5386> <5391> <F573>
+<5392> <5396> <F580>
+<5397> <539B> <F587>
+<539C> <539C> <F58D>
+<539D> <53A5> <F590>
+<53A6> <53A6> <F59A>
+<53A7> <53AA> <F59C>
+endbfrange
+
+100 beginbfrange
+<53AB> <53AB> <F640>
+<53AC> <53AE> <F642>
+<53AF> <53AF> <F647>
+<53B0> <53B1> <F649>
+<53B2> <53B2> <F64D>
+<53B3> <53B6> <F650>
+<53B7> <53B9> <F655>
+<53BA> <53C1> <F659>
+<53C2> <53C2> <F662>
+<53C3> <53CA> <F664>
+<53CB> <53CD> <F66E>
+<53CE> <53CF> <F672>
+<53D0> <53D0> <F675>
+<53D1> <53D7> <F678>
+<53D8> <53DC> <F680>
+<53DD> <53DE> <F686>
+<53DF> <53DF> <F689>
+<53E0> <53E1> <F68B>
+<53E2> <53E4> <F68F>
+<53E5> <53E7> <F693>
+<53E8> <53E8> <F699>
+<53E9> <53E9> <F69B>
+<53EA> <53EA> <F69D>
+<53EB> <53EB> <F69F>
+<53EC> <53ED> <F740>
+<53EE> <53F3> <F743>
+<53F4> <53F5> <F74A>
+<53F6> <53FD> <F74E>
+<53FE> <53FE> <F757>
+<53FF> <53FF> <F759>
+<5400> <5403> <F75D>
+<5404> <5404> <F762>
+<5405> <540B> <F764>
+<540C> <5410> <F76C>
+<5411> <541A> <F772>
+<541B> <541B> <F77D>
+<541C> <543C> <F780>
+<543D> <543E> <F840>
+<543F> <5441> <F843>
+<5442> <5443> <F847>
+<5444> <5449> <F84A>
+<544A> <544A> <F852>
+<544B> <5459> <F854>
+<545A> <545A> <F865>
+<545B> <5465> <F867>
+<5466> <546A> <F873>
+<546B> <546B> <F879>
+<546C> <546C> <F87B>
+<546D> <546E> <F87D>
+<546F> <546F> <F880>
+<5470> <5471> <F882>
+<5472> <5472> <F885>
+<5473> <5478> <F887>
+<5479> <5482> <F88F>
+<5483> <5485> <F89A>
+<5486> <5487> <F89E>
+<5488> <5495> <F940>
+<5496> <549D> <F951>
+<549E> <549F> <F95B>
+<54A0> <54A7> <F95F>
+<54A8> <54A8> <F968>
+<54A9> <54AA> <F96A>
+<54AB> <54AC> <F96D>
+<54AD> <54BB> <F970>
+<54BC> <54C0> <F980>
+<54C1> <54C1> <F986>
+<54C2> <54CA> <F988>
+<54CB> <54CE> <F992>
+<54CF> <54CF> <F997>
+<54D0> <54D7> <F999>
+<54D8> <54D9> <FA40>
+<54DA> <54DC> <FA43>
+<54DD> <54E1> <FA47>
+<54E2> <54E5> <FA4D>
+<54E6> <54EB> <FA52>
+<54EC> <54EE> <FA5A>
+<54EF> <54EF> <FA5E>
+<54F0> <54F0> <FA60>
+<54F1> <54FE> <FA62>
+<54FF> <54FF> <FA71>
+<5500> <5501> <FA72>
+<5502> <5502> <FA75>
+<5503> <5509> <FA78>
+<550A> <550C> <FA80>
+<550D> <5514> <FA85>
+<5515> <5516> <FA8E>
+<5517> <551A> <FA92>
+<551B> <5522> <FA99>
+<5523> <552B> <FB40>
+<552C> <5533> <FB4A>
+<5534> <5537> <FB53>
+<5538> <5538> <FB59>
+<5539> <5551> <FB5C>
+<5552> <5554> <FB76>
+<5555> <5555> <FB7B>
+<5556> <5556> <FB7E>
+<5557> <5566> <FB80>
+<5567> <5571> <FB91>
+<5572> <5573> <FB9D>
+<5574> <5574> <FBA0>
+endbfrange
+
+34 beginbfrange
+<5575> <5578> <FC40>
+<5579> <557C> <FC45>
+<557D> <558C> <FC4A>
+<558D> <5594> <FC5B>
+<5595> <5598> <FC64>
+<5599> <559E> <FC69>
+<559F> <559F> <FC70>
+<55A0> <55A1> <FC72>
+<55A2> <55A3> <FC75>
+<55A4> <55A9> <FC79>
+<55AA> <55AC> <FC80>
+<55AD> <55B2> <FC84>
+<55B3> <55C8> <FC8B>
+<55C9> <55DA> <FD40>
+<55DB> <55DD> <FD54>
+<55DE> <55DE> <FD59>
+<55DF> <55E2> <FD5B>
+<55E3> <55E4> <FD60>
+<55E5> <55E6> <FD63>
+<55E7> <55E7> <FD68>
+<55E8> <55E9> <FD6A>
+<55EA> <55EC> <FD6D>
+<55ED> <55ED> <FD71>
+<55EE> <55F2> <FD73>
+<55F3> <55F6> <FD79>
+<55F7> <55F7> <FD7E>
+<55F8> <55FF> <FD80>
+<5600> <5601> <FD89>
+<5602> <5604> <FD8C>
+<5605> <5607> <FD91>
+<5608> <560F> <FD95>
+<5610> <564D> <FE41>
+<564E> <566E> <FE80>
+<02E1> <02E1> <A960>
+endbfrange
+
+3 usefont % Vertical Fonts
+20 beginbfrange
+<023D> <023D> <A3AC>
+<023E> <023E> <A1A3>
+<023F> <023F> <A1A2>
+<0240> <0241> <A3BA>
+<0242> <0242> <A3A1>
+<0243> <0243> <A3BF>
+<0244> <0245> <A3A8>
+<0246> <0253> <A1B2>
+<0254> <0254> <A3FB>
+<0255> <0255> <A3FD>
+<0256> <0256> <A1AA>
+<0257> <0257> <A1AD>
+<0258> <0258> <A3DF>
+<1E18> <1E19> <A1AB>
+<1E1A> <1E1A> <A1FE>
+<1E1B> <1E1B> <A3AE>
+<1E1C> <1E1C> <A3BD>
+<1E1D> <1E1D> <A3DB>
+<1E1E> <1E1E> <A3DD>
+<1E1F> <1E1F> <A3FE>
+endbfrange
+
+endcmap
+CMapName currentdict /CMap defineresource pop
+end
+end
+
+%%EndResource
+%%EOF
diff --git a/src/main/resources/Resources/cmap/Adobe-GB1-H-Mac b/src/main/resources/Resources/cmap/Adobe-GB1-H-Mac
new file mode 100644
index 0000000..f0788bc
--- /dev/null
+++ b/src/main/resources/Resources/cmap/Adobe-GB1-H-Mac
@@ -0,0 +1,194 @@
+%!PS-Adobe-3.0 Resource-CMap
+%%DocumentNeededResources: ProcSet (CIDInit)
+%%IncludeResource: ProcSet (CIDInit)
+%%BeginResource: CMap (Adobe-GB1-H-Mac)
+%%Title: (Adobe-GB1-H-Mac Adobe GB1 0)
+%%Version: 4.002
+%%Copyright: -----------------------------------------------------------
+%%Copyright: Copyright 1990-1996 Adobe Systems Incorporated.
+%%Copyright: All Rights Reserved.
+%%Copyright:
+%%Copyright: Patents Pending
+%%Copyright:
+%%Copyright: NOTICE: All information contained herein is the property
+%%Copyright: of Adobe Systems Incorporated.
+%%Copyright:
+%%Copyright: Permission is granted for redistribution of this file
+%%Copyright: provided this copyright notice is maintained intact and
+%%Copyright: that the contents of this file are not altered in any
+%%Copyright: way from its original form.
+%%Copyright:
+%%Copyright: PostScript and Display PostScript are trademarks of
+%%Copyright: Adobe Systems Incorporated which may be registered in
+%%Copyright: certain jurisdictions.
+%%Copyright: -----------------------------------------------------------
+%%EndComments
+
+/CIDInit /ProcSet findresource begin
+
+12 dict begin
+
+begincmap
+
+/CIDSystemInfo 3 dict dup begin
+/Registry (Adobe) def
+/Ordering (Adobe_GB1_H_Mac) def
+/Supplement 2 def
+end def
+
+/CMapName /Adobe-GB1-H-Mac def
+
+/CMapVersion 4.002 def
+/CMapType 1 def
+
+/WMode 0 def
+
+1 begincodespacerange
+<0000> <FFFF>
+endcodespacerange
+
+2 usefont
+1 begincidrange
+<0000> <FFFF> 0
+endcidrange
+
+1 usefont % Prop Roman
+1 beginbfrange
+<0001> <005F> <20>
+endbfrange
+
+0 usefont % Host Font
+100 beginbfrange
+<0060> <00BD> <A1A1>
+<00BE> <00EF> <A2B1>
+<00F0> <00F9> <A2E5>
+<00FA> <00FF> <A2F1>
+<0100> <0105> <A2F7>
+<0106> <0163> <A3A1>
+<0164> <01B6> <A4A1>
+<01B7> <01FF> <A5A1>
+<0200> <020C> <A5EA>
+<020D> <0224> <A6A1>
+<0225> <0259> <A6C1>
+<025A> <027A> <A7A1>
+<027B> <029B> <A7D1>
+<029C> <02BB> <A8A1>
+<02BC> <02E0> <A8C5>
+<02E2> <02FF> <A9A4>
+<0300> <032D> <A9C2>
+<03AC> <03FF> <B0A1>
+<0400> <0409> <B0F5>
+<040A> <0467> <B1A1>
+<0468> <04C5> <B2A1>
+<04C6> <04FF> <B3A1>
+<0500> <0523> <B3DB>
+<0524> <0581> <B4A1>
+<0582> <05DF> <B5A1>
+<05E0> <05FF> <B6A1>
+<0600> <063D> <B6C1>
+<063E> <069B> <B7A1>
+<069C> <06F9> <B8A1>
+<06FA> <06FF> <B9A1>
+<0700> <0757> <B9A7>
+<0758> <07B5> <BAA1>
+<07B6> <07FF> <BBA1>
+<0800> <0813> <BBEB>
+<0814> <0871> <BCA1>
+<0872> <08CF> <BDA1>
+<08D0> <08FF> <BEA1>
+<0900> <092D> <BED1>
+<092E> <098B> <BFA1>
+<098C> <09E9> <C0A1>
+<09EA> <09FF> <C1A1>
+<0A00> <0A47> <C1B7>
+<0A48> <0AA5> <C2A1>
+<0AA6> <0AFF> <C3A1>
+<0B00> <0B03> <C3FB>
+<0B04> <0B61> <C4A1>
+<0B62> <0BBF> <C5A1>
+<0BC0> <0BFF> <C6A1>
+<0C00> <0C1D> <C6E1>
+<0C1E> <0C7B> <C7A1>
+<0C7C> <0CD9> <C8A1>
+<0CDA> <0CFF> <C9A1>
+<0D00> <0D37> <C9C7>
+<0D38> <0D95> <CAA1>
+<0D96> <0DF3> <CBA1>
+<0DF4> <0DFF> <CCA1>
+<0E00> <0E51> <CCAD>
+<0E52> <0EAF> <CDA1>
+<0EB0> <0EFF> <CEA1>
+<0F00> <0F0D> <CEF1>
+<0F0E> <0F6B> <CFA1>
+<0F6C> <0FC9> <D0A1>
+<0FCA> <0FFF> <D1A1>
+<1000> <1027> <D1D7>
+<1028> <1085> <D2A1>
+<1086> <10E3> <D3A1>
+<10E4> <10FF> <D4A1>
+<1100> <1141> <D4BD>
+<1142> <119F> <D5A1>
+<11A0> <11FD> <D6A1>
+<11FE> <11FF> <D7A1>
+<1200> <1256> <D7A3>
+<1257> <12B4> <D8A1>
+<12B5> <12FF> <D9A1>
+<1300> <1312> <D9EC>
+<1313> <1370> <DAA1>
+<1371> <13CE> <DBA1>
+<13CF> <13FF> <DCA1>
+<1400> <142C> <DCD2>
+<142D> <148A> <DDA1>
+<148B> <14E8> <DEA1>
+<14E9> <14FF> <DFA1>
+<1500> <1546> <DFB8>
+<1547> <15A4> <E0A1>
+<15A5> <15FF> <E1A1>
+<1600> <1602> <E1FC>
+<1603> <1660> <E2A1>
+<1661> <16BE> <E3A1>
+<16BF> <16FF> <E4A1>
+<1700> <171C> <E4E2>
+<171D> <177A> <E5A1>
+<177B> <17D8> <E6A1>
+<17D9> <17FF> <E7A1>
+<1800> <1836> <E7C8>
+<1837> <1894> <E8A1>
+<1895> <18F2> <E9A1>
+<18F3> <18FF> <EAA1>
+<1900> <1950> <EAAE>
+<1951> <19AE> <EBA1>
+<19AF> <19FF> <ECA1>
+endbfrange
+18 beginbfrange
+<1A00> <1A0C> <ECF2>
+<1A0D> <1A6A> <EDA1>
+<1A6B> <1AC8> <EEA1>
+<1AC9> <1AFF> <EFA1>
+<1B00> <1B26> <EFD8>
+<1B27> <1B84> <F0A1>
+<1B85> <1BE2> <F1A1>
+<1BE3> <1BFF> <F2A1>
+<1C00> <1C40> <F2BE>
+<1C41> <1C9E> <F3A1>
+<1C9F> <1CFC> <F4A1>
+<1CFD> <1CFF> <F5A1>
+<1D00> <1D5A> <F5A4>
+<1D5B> <1DB8> <F6A1>
+<1DB9> <1DFF> <F7A1>
+<1E00> <1E16> <F7E8>
+<1E20> <1E20> <0080>
+<1E21> <1E23> <00FD>
+endbfrange
+2 beginbfrange
+<026F> <026F> <A7B7>
+<0270> <0270> <A7B6>
+endbfrange
+
+endcmap
+CMapName currentdict /CMap defineresource pop
+end
+end
+
+%%EndResource
+%%EOF
diff --git a/src/main/resources/Resources/cmap/Adobe-GB1-UCS2 b/src/main/resources/Resources/cmap/Adobe-GB1-UCS2
new file mode 100644
index 0000000..4611e4d
--- /dev/null
+++ b/src/main/resources/Resources/cmap/Adobe-GB1-UCS2
@@ -0,0 +1 @@
+%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%IncludeResource: ProcSet (CIDInit) %%BeginResource: CMap (Adobe-GB1-UCS2) %%Title: (Adobe-GB1-UCS2 Adobe GB1 4) %%Version: 6.001 %%Copyright: ----------------------------------------------------------- %%Copyright: Copyright 1990-2000 Adobe Systems Incorporated. %%Copyright: All Rights Reserved. %%Copyright: %%Copyright: Patents Pending %%Copyright: %%Copyright: NOTICE: All information contained herein is the property %%Copyright: of Adobe Systems Incorporated. %%Copyright: %%Copyright: Permission is granted for redistribution of this file %%Copyright: provided this copyright notice is maintained intact and %%Copyright: that the contents of this file are not altered in any %%Copyright: way from its original form. %%Copyright: %%Copyright: PostScript and Display PostScript are trademarks of %%Copyright: Adobe Systems Incorporated which may be registered in %%Copyright: certain jurisdictions. %%Copyright: ----------------------------------------------------------- %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo 3 dict dup begin /Registry (Adobe) def /Ordering (Adobe_GB1_UCS2) def /Supplement 4 def end def /CMapName /Adobe-GB1-UCS2 def /CMapVersion 6.001 def /CMapType 1 def /XUID [1 10 25335 1212] def /WMode 0 def 1 begincodespacerange <0000> <FFFF> endcodespacerange 100 beginbfchar <0000> <FFFD> <0063> <00B7> <0064> <02C9> <0065> <02C7> <0066> <00A8> <0067> <3003> <0068> <3005> <0069> <2014> <006A> <FF5E> <006B> <2016> <006C> <22EF> <007F> <00B1> <0080> <00D7> <0081> <00F7> <0082> <2236> <0085> <2211> <0086> <220F> <0087> <222A> <0088> <2229> <0089> <2208> <008A> <2237> <008B> <221A> <008C> <22A5> <008D> <2225> <008E> <2220> <008F> <2312> <0090> <2299> <0091> <222B> <0092> <222E> <0093> <2261> <0094> <224C> <0095> <2248> <0096> <223D> <0097> <221D> <0098> <2260> <009D> <221E> <009E> <2235> <009F> <2234> <00A0> <2642> <00A1> <2640> <00A2> <00B0> <00A5> <2103> <00A6> <FF04> <00A7> <00A4> <00AA> <2030> <00AB> <00A7> <00AC> <2116> <00AD> <2606> <00AE> <2605> <00AF> <25CB> <00B0> <25CF> <00B1> <25CE> <00B2> <25C7> <00B3> <25C6> <00B4> <25A1> <00B5> <25A0> <00B6> <25B3> <00B7> <25B2> <00B8> <203B> <00B9> <2192> <00BC> <2193> <00BD> <3013> <0109> <FFE5> <0163> <FFE3> <01F9> <02BA> <023D> <FF0C> <023E> <3002> <023F> <3001> <0242> <FF01> <0243> <FF1F> <0256> <FE31> <0257> <22EF> <0260> <0401> <0281> <0451> <029C> <0101> <029D> <00E1> <029E> <01CE> <029F> <00E0> <02A0> <0113> <02A1> <00E9> <02A2> <011B> <02A3> <00E8> <02A4> <012B> <02A5> <00ED> <02A6> <01D0> <02A7> <00EC> <02A8> <014D> <02A9> <00F3> <02AA> <01D2> <02AB> <00F2> <02AC> <016B> <02AD> <00FA> <02AE> <01D4> <02AF> <00F9> <02B0> <01D6> <02B1> <01D8> <02B2> <01DA> <02B3> <01DC> <02B4> <00FC> <02B5> <00EA> endbfchar 100 beginbfchar <02B6> <0251> <02B7> <1E3F> <02B8> <0144> <02B9> <0148> <02BA> <006E0300> <02BB> <0261> <02E1> <E7CD> <038C> <0101> <038D> <00E1> <038E> <01CE> <038F> <00E0> <0390> <0113> <0391> <00E9> <0392> <011B> <0393> <00E8> <0394> <012B> <0395> <00ED> <0396> <01D0> <0397> <00EC> <0398> <014D> <0399> <00F3> <039A> <01D2> <039B> <00F2> <039C> <016B> <039D> <00FA> <039E> <01D4> <039F> <00F9> <03A0> <01D6> <03A1> <01D8> <03A2> <01DA> <03A3> <01DC> <03A4> <00FC> <03A5> <00EA> <03A6> <0251> <03A7> <1E3F> <03A8> <0144> <03A9> <0148> <03AA> <006E0300> <03AB> <0261> <03AC> <554A> <03AD> <963F> <03AE> <57C3> <03AF> <6328> <03B0> <54CE> <03B1> <5509> <03B2> <54C0> <03B3> <7691> <03B4> <764C> <03B5> <853C> <03B6> <77EE> <03B7> <827E> <03B8> <788D> <03B9> <7231> <03BA> <9698> <03BB> <978D> <03BC> <6C28> <03BD> <5B89> <03BE> <4FFA> <03BF> <6309> <03C0> <6697> <03C1> <5CB8> <03C2> <80FA> <03C3> <6848> <03C4> <80AE> <03C5> <6602> <03C6> <76CE> <03C7> <51F9> <03C8> <6556> <03C9> <71AC> <03CA> <7FF1> <03CB> <8884> <03CC> <50B2> <03CD> <5965> <03CE> <61CA> <03CF> <6FB3> <03D0> <82AD> <03D1> <634C> <03D2> <6252> <03D3> <53ED> <03D4> <5427> <03D5> <7B06> <03D6> <516B> <03D7> <75A4> <03D8> <5DF4> <03D9> <62D4> <03DA> <8DCB> <03DB> <9776> <03DC> <628A> <03DD> <8019> <03DE> <575D> <03DF> <9738> <03E0> <7F62> <03E1> <7238> <03E2> <767D> <03E3> <67CF> <03E4> <767E> <03E5> <6446> <03E6> <4F70> <03E7> <8D25> <03E8> <62DC> endbfchar 100 beginbfchar <03E9> <7A17> <03EA> <6591> <03EB> <73ED> <03EC> <642C> <03ED> <6273> <03EE> <822C> <03EF> <9881> <03F0> <677F> <03F1> <7248> <03F2> <626E> <03F3> <62CC> <03F4> <4F34> <03F5> <74E3> <03F6> <534A> <03F7> <529E> <03F8> <7ECA> <03F9> <90A6> <03FA> <5E2E> <03FB> <6886> <03FC> <699C> <03FD> <8180> <03FE> <7ED1> <03FF> <68D2> <0400> <78C5> <0401> <868C> <0402> <9551> <0403> <508D> <0404> <8C24> <0405> <82DE> <0406> <80DE> <0407> <5305> <0408> <8912> <0409> <5265> <040A> <8584> <040B> <96F9> <040C> <4FDD> <040D> <5821> <040E> <9971> <040F> <5B9D> <0410> <62B1> <0411> <62A5> <0412> <66B4> <0413> <8C79> <0414> <9C8D> <0415> <7206> <0416> <676F> <0417> <7891> <0418> <60B2> <0419> <5351> <041A> <5317> <041B> <8F88> <041C> <80CC> <041D> <8D1D> <041E> <94A1> <041F> <500D> <0420> <72C8> <0421> <5907> <0422> <60EB> <0423> <7119> <0424> <88AB> <0425> <5954> <0426> <82EF> <0427> <672C> <0428> <7B28> <0429> <5D29> <042A> <7EF7> <042B> <752D> <042C> <6CF5> <042D> <8E66> <042E> <8FF8> <042F> <903C> <0430> <9F3B> <0431> <6BD4> <0432> <9119> <0433> <7B14> <0434> <5F7C> <0435> <78A7> <0436> <84D6> <0437> <853D> <0438> <6BD5> <0439> <6BD9> <043A> <6BD6> <043B> <5E01> <043C> <5E87> <043D> <75F9> <043E> <95ED> <043F> <655D> <0440> <5F0A> <0441> <5FC5> <0442> <8F9F> <0443> <58C1> <0444> <81C2> <0445> <907F> <0446> <965B> <0447> <97AD> <0448> <8FB9> <0449> <7F16> <044A> <8D2C> <044B> <6241> <044C> <4FBF> endbfchar 100 beginbfchar <044D> <53D8> <044E> <535E> <0451> <8FAB> <0452> <904D> <0453> <6807> <0454> <5F6A> <0455> <8198> <0456> <8868> <0457> <9CD6> <0458> <618B> <0459> <522B> <045A> <762A> <045B> <5F6C> <045C> <658C> <045D> <6FD2> <045E> <6EE8> <045F> <5BBE> <0460> <6448> <0461> <5175> <0462> <51B0> <0463> <67C4> <0464> <4E19> <0465> <79C9> <0466> <997C> <0467> <70B3> <0468> <75C5> <0469> <5E76> <046A> <73BB> <046B> <83E0> <046C> <64AD> <046D> <62E8> <046E> <94B5> <046F> <6CE2> <0470> <535A> <0471> <52C3> <0472> <640F> <0473> <94C2> <0474> <7B94> <0475> <4F2F> <0476> <5E1B> <0477> <8236> <0478> <8116> <0479> <818A> <047A> <6E24> <047B> <6CCA> <047C> <9A73> <047D> <6355> <047E> <535C> <047F> <54FA> <0480> <8865> <0481> <57E0> <0482> <4E0D> <0483> <5E03> <0484> <6B65> <0485> <7C3F> <0486> <90E8> <0487> <6016> <0488> <64E6> <0489> <731C> <048A> <88C1> <048B> <6750> <048C> <624D> <048D> <8D22> <048E> <776C> <048F> <8E29> <0490> <91C7> <0491> <5F69> <0492> <83DC> <0493> <8521> <0494> <9910> <0495> <53C2> <0496> <8695> <0497> <6B8B> <0498> <60ED> <0499> <60E8> <049A> <707F> <049B> <82CD> <049C> <8231> <049D> <4ED3> <049E> <6CA7> <049F> <85CF> <04A0> <64CD> <04A1> <7CD9> <04A2> <69FD> <04A3> <66F9> <04A4> <8349> <04A5> <5395> <04A6> <7B56> <04A7> <4FA7> <04A8> <518C> <04A9> <6D4B> <04AA> <5C42> <04AB> <8E6D> <04AC> <63D2> <04AD> <53C9> <04AE> <832C> <04AF> <8336> <04B0> <67E5> <04B1> <78B4> <04B2> <643D> endbfchar 100 beginbfchar <04B3> <5BDF> <04B4> <5C94> <04B5> <5DEE> <04B6> <8BE7> <04B7> <62C6> <04B8> <67F4> <04B9> <8C7A> <04BA> <6400> <04BB> <63BA> <04BC> <8749> <04BD> <998B> <04BE> <8C17> <04BF> <7F20> <04C0> <94F2> <04C1> <4EA7> <04C2> <9610> <04C3> <98A4> <04C4> <660C> <04C5> <7316> <04C6> <573A> <04C7> <5C1D> <04C8> <5E38> <04C9> <957F> <04CA> <507F> <04CB> <80A0> <04CC> <5382> <04CD> <655E> <04CE> <7545> <04CF> <5531> <04D0> <5021> <04D1> <8D85> <04D2> <6284> <04D3> <949E> <04D4> <671D> <04D5> <5632> <04D6> <6F6E> <04D7> <5DE2> <04D8> <5435> <04D9> <7092> <04DA> <8F66> <04DB> <626F> <04DC> <64A4> <04DD> <63A3> <04DE> <5F7B> <04DF> <6F88> <04E0> <90F4> <04E1> <81E3> <04E2> <8FB0> <04E3> <5C18> <04E4> <6668> <04E5> <5FF1> <04E6> <6C89> <04E7> <9648> <04E8> <8D81> <04E9> <886C> <04EA> <6491> <04EB> <79F0> <04EC> <57CE> <04ED> <6A59> <04EE> <6210> <04EF> <5448> <04F0> <4E58> <04F1> <7A0B> <04F2> <60E9> <04F3> <6F84> <04F4> <8BDA> <04F5> <627F> <04F6> <901E> <04F7> <9A8B> <04F8> <79E4> <04F9> <5403> <04FA> <75F4> <04FB> <6301> <04FC> <5319> <04FD> <6C60> <04FE> <8FDF> <04FF> <5F1B> <0500> <9A70> <0501> <803B> <0502> <9F7F> <0503> <4F88> <0504> <5C3A> <0505> <8D64> <0506> <7FC5> <0507> <65A5> <0508> <70BD> <0509> <5145> <050A> <51B2> <050B> <866B> <050C> <5D07> <050D> <5BA0> <050E> <62BD> <050F> <916C> <0510> <7574> <0511> <8E0C> <0512> <7A20> <0513> <6101> <0514> <7B79> <0515> <4EC7> <0516> <7EF8> endbfchar 100 beginbfchar <0517> <7785> <0518> <4E11> <0519> <81ED> <051A> <521D> <051B> <51FA> <051C> <6A71> <051D> <53A8> <051E> <8E87> <051F> <9504> <0520> <96CF> <0521> <6EC1> <0522> <9664> <0523> <695A> <0524> <7840> <0525> <50A8> <0526> <77D7> <0527> <6410> <0528> <89E6> <0529> <5904> <052A> <63E3> <052B> <5DDD> <052C> <7A7F> <052D> <693D> <052E> <4F20> <052F> <8239> <0530> <5598> <0531> <4E32> <0532> <75AE> <0533> <7A97> <0534> <5E62> <0535> <5E8A> <0536> <95EF> <0537> <521B> <0538> <5439> <0539> <708A> <053A> <6376> <053B> <9524> <053C> <5782> <053D> <6625> <053E> <693F> <053F> <9187> <0540> <5507> <0541> <6DF3> <0542> <7EAF> <0543> <8822> <0544> <6233> <0545> <7EF0> <0546> <75B5> <0547> <8328> <0548> <78C1> <0549> <96CC> <054A> <8F9E> <054B> <6148> <054C> <74F7> <054D> <8BCD> <054E> <6B64> <054F> <523A> <0550> <8D50> <0551> <6B21> <0552> <806A> <0553> <8471> <0554> <56F1> <0555> <5306> <0556> <4ECE> <0557> <4E1B> <0558> <51D1> <0559> <7C97> <055A> <918B> <055B> <7C07> <055C> <4FC3> <055D> <8E7F> <055E> <7BE1> <055F> <7A9C> <0560> <6467> <0561> <5D14> <0562> <50AC> <0563> <8106> <0564> <7601> <0565> <7CB9> <0566> <6DEC> <0567> <7FE0> <0568> <6751> <0569> <5B58> <056A> <5BF8> <056B> <78CB> <056C> <64AE> <056D> <6413> <056E> <63AA> <056F> <632B> <0570> <9519> <0571> <642D> <0572> <8FBE> <0573> <7B54> <0574> <7629> <0575> <6253> <0576> <5927> <0577> <5446> <0578> <6B79> <0579> <50A3> <057A> <6234> endbfchar 100 beginbfchar <057B> <5E26> <057C> <6B86> <057D> <4EE3> <057E> <8D37> <057F> <888B> <0580> <5F85> <0581> <902E> <0582> <6020> <0583> <803D> <0584> <62C5> <0585> <4E39> <0586> <5355> <0587> <90F8> <0588> <63B8> <0589> <80C6> <058A> <65E6> <058B> <6C2E> <058C> <4F46> <058D> <60EE> <058E> <6DE1> <058F> <8BDE> <0590> <5F39> <0591> <86CB> <0592> <5F53> <0593> <6321> <0594> <515A> <0595> <8361> <0596> <6863> <0597> <5200> <0598> <6363> <0599> <8E48> <059A> <5012> <059B> <5C9B> <059C> <7977> <059D> <5BFC> <059E> <5230> <059F> <7A3B> <05A0> <60BC> <05A1> <9053> <05A2> <76D7> <05A3> <5FB7> <05A4> <5F97> <05A5> <7684> <05A6> <8E6C> <05A7> <706F> <05A8> <767B> <05A9> <7B49> <05AA> <77AA> <05AB> <51F3> <05AC> <9093> <05AD> <5824> <05AE> <4F4E> <05AF> <6EF4> <05B0> <8FEA> <05B1> <654C> <05B2> <7B1B> <05B3> <72C4> <05B4> <6DA4> <05B5> <7FDF> <05B6> <5AE1> <05B7> <62B5> <05B8> <5E95> <05B9> <5730> <05BA> <8482> <05BB> <7B2C> <05BC> <5E1D> <05BD> <5F1F> <05BE> <9012> <05BF> <7F14> <05C0> <98A0> <05C1> <6382> <05C2> <6EC7> <05C3> <7898> <05C4> <70B9> <05C5> <5178> <05C6> <975B> <05C7> <57AB> <05C8> <7535> <05C9> <4F43> <05CA> <7538> <05CB> <5E97> <05CC> <60E6> <05CD> <5960> <05CE> <6DC0> <05CF> <6BBF> <05D0> <7889> <05D1> <53FC> <05D2> <96D5> <05D3> <51CB> <05D4> <5201> <05D5> <6389> <05D6> <540A> <05D7> <9493> <05D8> <8C03> <05D9> <8DCC> <05DA> <7239> <05DB> <789F> <05DC> <8776> <05DD> <8FED> <05DE> <8C0D> endbfchar 100 beginbfchar <05DF> <53E0> <05E0> <4E01> <05E1> <76EF> <05E2> <53EE> <05E3> <9489> <05E4> <9876> <05E5> <9F0E> <05E6> <952D> <05E7> <5B9A> <05E8> <8BA2> <05E9> <4E22> <05EA> <4E1C> <05EB> <51AC> <05EC> <8463> <05ED> <61C2> <05EE> <52A8> <05EF> <680B> <05F0> <4F97> <05F1> <606B> <05F2> <51BB> <05F3> <6D1E> <05F4> <515C> <05F5> <6296> <05F6> <6597> <05F7> <9661> <05F8> <8C46> <05F9> <9017> <05FA> <75D8> <05FB> <90FD> <05FC> <7763> <05FD> <6BD2> <05FE> <728A> <05FF> <72EC> <0600> <8BFB> <0601> <5835> <0602> <7779> <0603> <8D4C> <0604> <675C> <0605> <9540> <0606> <809A> <0607> <5EA6> <0608> <6E21> <0609> <5992> <060A> <7AEF> <060B> <77ED> <060C> <953B> <060D> <6BB5> <060E> <65AD> <060F> <7F0E> <0610> <5806> <0611> <5151> <0612> <961F> <0613> <5BF9> <0614> <58A9> <0615> <5428> <0616> <8E72> <0617> <6566> <0618> <987F> <0619> <56E4> <061A> <949D> <061B> <76FE> <061C> <9041> <061D> <6387> <061E> <54C6> <061F> <591A> <0620> <593A> <0621> <579B> <0622> <8EB2> <0623> <6735> <0624> <8DFA> <0625> <8235> <0626> <5241> <0627> <60F0> <0628> <5815> <0629> <86FE> <062A> <5CE8> <062B> <9E45> <062C> <4FC4> <062D> <989D> <062E> <8BB9> <062F> <5A25> <0630> <6076> <0631> <5384> <0632> <627C> <0633> <904F> <0634> <9102> <0635> <997F> <0636> <6069> <0637> <800C> <0638> <513F> <0639> <8033> <063A> <5C14> <063B> <9975> <063C> <6D31> <063D> <4E8C> <063E> <8D30> <063F> <53D1> <0640> <7F5A> <0641> <7B4F> <0642> <4F10> endbfchar 100 beginbfchar <0643> <4E4F> <0644> <9600> <0645> <6CD5> <0646> <73D0> <0647> <85E9> <0648> <5E06> <0649> <756A> <064A> <7FFB> <064B> <6A0A> <064C> <77FE> <064D> <9492> <064E> <7E41> <064F> <51E1> <0650> <70E6> <0651> <53CD> <0652> <8FD4> <0653> <8303> <0654> <8D29> <0655> <72AF> <0656> <996D> <0657> <6CDB> <0658> <574A> <0659> <82B3> <065A> <65B9> <065B> <80AA> <065C> <623F> <065D> <9632> <065E> <59A8> <065F> <4EFF> <0660> <8BBF> <0661> <7EBA> <0662> <653E> <0663> <83F2> <0664> <975E> <0665> <5561> <0666> <98DE> <0667> <80A5> <0668> <532A> <0669> <8BFD> <066A> <5420> <066B> <80BA> <066C> <5E9F> <066D> <6CB8> <066E> <8D39> <066F> <82AC> <0670> <915A> <0671> <5429> <0672> <6C1B> <0673> <5206> <0674> <7EB7> <0675> <575F> <0676> <711A> <0677> <6C7E> <0678> <7C89> <0679> <594B> <067A> <4EFD> <067B> <5FFF> <067C> <6124> <067D> <7CAA> <067E> <4E30> <067F> <5C01> <0680> <67AB> <0681> <8702> <0682> <5CF0> <0683> <950B> <0684> <98CE> <0685> <75AF> <0686> <70FD> <0687> <9022> <0688> <51AF> <0689> <7F1D> <068A> <8BBD> <068B> <5949> <068C> <51E4> <068D> <4F5B> <068E> <5426> <068F> <592B> <0690> <6577> <0691> <80A4> <0692> <5B75> <0693> <6276> <0694> <62C2> <0695> <8F90> <0696> <5E45> <0697> <6C1F> <0698> <7B26> <0699> <4F0F> <069A> <4FD8> <069B> <670D> <069C> <6D6E> <069D> <6DAA> <069E> <798F> <069F> <88B1> <06A0> <5F17> <06A1> <752B> <06A2> <629A> <06A3> <8F85> <06A4> <4FEF> <06A5> <91DC> <06A6> <65A7> endbfchar 100 beginbfchar <06A7> <812F> <06A8> <8151> <06A9> <5E9C> <06AA> <8150> <06AB> <8D74> <06AC> <526F> <06AD> <8986> <06AE> <8D4B> <06AF> <590D> <06B0> <5085> <06B1> <4ED8> <06B2> <961C> <06B3> <7236> <06B4> <8179> <06B5> <8D1F> <06B6> <5BCC> <06B7> <8BA3> <06B8> <9644> <06B9> <5987> <06BA> <7F1A> <06BB> <5490> <06BC> <5676> <06BD> <560E> <06BE> <8BE5> <06BF> <6539> <06C0> <6982> <06C1> <9499> <06C2> <76D6> <06C3> <6E89> <06C4> <5E72> <06C5> <7518> <06C6> <6746> <06C7> <67D1> <06C8> <7AFF> <06C9> <809D> <06CA> <8D76> <06CB> <611F> <06CC> <79C6> <06CD> <6562> <06CE> <8D63> <06CF> <5188> <06D0> <521A> <06D1> <94A2> <06D2> <7F38> <06D3> <809B> <06D4> <7EB2> <06D5> <5C97> <06D6> <6E2F> <06D7> <6760> <06D8> <7BD9> <06D9> <768B> <06DA> <9AD8> <06DB> <818F> <06DC> <7F94> <06DD> <7CD5> <06DE> <641E> <06DF> <9550> <06E0> <7A3F> <06E1> <544A> <06E2> <54E5> <06E3> <6B4C> <06E4> <6401> <06E5> <6208> <06E6> <9E3D> <06E7> <80F3> <06E8> <7599> <06E9> <5272> <06EA> <9769> <06EB> <845B> <06EC> <683C> <06ED> <86E4> <06EE> <9601> <06EF> <9694> <06F0> <94EC> <06F1> <4E2A> <06F2> <5404> <06F3> <7ED9> <06F4> <6839> <06F5> <8DDF> <06F6> <8015> <06F7> <66F4> <06F8> <5E9A> <06F9> <7FB9> <06FA> <57C2> <06FB> <803F> <06FC> <6897> <06FD> <5DE5> <06FE> <653B> <06FF> <529F> <0700> <606D> <0701> <9F9A> <0702> <4F9B> <0703> <8EAC> <0704> <516C> <0705> <5BAB> <0706> <5F13> <0707> <5DE9> <0708> <6C5E> <0709> <62F1> <070A> <8D21> endbfchar 100 beginbfchar <070B> <5171> <070C> <94A9> <070D> <52FE> <070E> <6C9F> <070F> <82DF> <0710> <72D7> <0711> <57A2> <0712> <6784> <0713> <8D2D> <0714> <591F> <0715> <8F9C> <0716> <83C7> <0717> <5495> <0718> <7B8D> <0719> <4F30> <071A> <6CBD> <071B> <5B64> <071C> <59D1> <071D> <9F13> <071E> <53E4> <071F> <86CA> <0720> <9AA8> <0721> <8C37> <0722> <80A1> <0723> <6545> <0724> <987E> <0725> <56FA> <0726> <96C7> <0727> <522E> <0728> <74DC> <0729> <5250> <072A> <5BE1> <072B> <6302> <072C> <8902> <072D> <4E56> <072E> <62D0> <072F> <602A> <0730> <68FA> <0731> <5173> <0732> <5B98> <0733> <51A0> <0734> <89C2> <0735> <7BA1> <0736> <9986> <0737> <7F50> <0738> <60EF> <0739> <704C> <073A> <8D2F> <073B> <5149> <073C> <5E7F> <073D> <901B> <073E> <7470> <073F> <89C4> <0740> <572D> <0741> <7845> <0742> <5F52> <0743> <9F9F> <0744> <95FA> <0745> <8F68> <0746> <9B3C> <0747> <8BE1> <0748> <7678> <0749> <6842> <074A> <67DC> <074B> <8DEA> <074C> <8D35> <074D> <523D> <074E> <8F8A> <074F> <6EDA> <0750> <68CD> <0751> <9505> <0752> <90ED> <0753> <56FD> <0754> <679C> <0755> <88F9> <0756> <8FC7> <0757> <54C8> <0758> <9AB8> <0759> <5B69> <075A> <6D77> <075B> <6C26> <075C> <4EA5> <075D> <5BB3> <075E> <9A87> <075F> <9163> <0760> <61A8> <0761> <90AF> <0762> <97E9> <0763> <542B> <0764> <6DB5> <0765> <5BD2> <0766> <51FD> <0767> <558A> <0768> <7F55> <0769> <7FF0> <076A> <64BC> <076B> <634D> <076C> <65F1> <076D> <61BE> <076E> <608D> endbfchar 100 beginbfchar <076F> <710A> <0770> <6C57> <0771> <6C49> <0772> <592F> <0773> <676D> <0774> <822A> <0775> <58D5> <0776> <568E> <0777> <8C6A> <0778> <6BEB> <0779> <90DD> <077A> <597D> <077B> <8017> <077C> <53F7> <077D> <6D69> <077E> <5475> <077F> <559D> <0780> <8377> <0781> <83CF> <0782> <6838> <0783> <79BE> <0784> <548C> <0785> <4F55> <0786> <5408> <0787> <76D2> <0788> <8C89> <0789> <9602> <078A> <6CB3> <078B> <6DB8> <078C> <8D6B> <078D> <8910> <078E> <9E64> <078F> <8D3A> <0790> <563F> <0791> <9ED1> <0792> <75D5> <0793> <5F88> <0794> <72E0> <0795> <6068> <0796> <54FC> <0797> <4EA8> <0798> <6A2A> <0799> <8861> <079A> <6052> <079B> <8F70> <079C> <54C4> <079D> <70D8> <079E> <8679> <079F> <9E3F> <07A0> <6D2A> <07A1> <5B8F> <07A2> <5F18> <07A3> <7EA2> <07A4> <5589> <07A5> <4FAF> <07A6> <7334> <07A7> <543C> <07A8> <539A> <07A9> <5019> <07AA> <540E> <07AB> <547C> <07AC> <4E4E> <07AD> <5FFD> <07AE> <745A> <07AF> <58F6> <07B0> <846B> <07B1> <80E1> <07B2> <8774> <07B3> <72D0> <07B4> <7CCA> <07B5> <6E56> <07B6> <5F27> <07B7> <864E> <07B8> <552C> <07B9> <62A4> <07BA> <4E92> <07BB> <6CAA> <07BC> <6237> <07BD> <82B1> <07BE> <54D7> <07BF> <534E> <07C0> <733E> <07C1> <6ED1> <07C2> <753B> <07C3> <5212> <07C4> <5316> <07C5> <8BDD> <07C6> <69D0> <07C7> <5F8A> <07C8> <6000> <07C9> <6DEE> <07CA> <574F> <07CB> <6B22> <07CC> <73AF> <07CD> <6853> <07CE> <8FD8> <07CF> <7F13> <07D0> <6362> <07D1> <60A3> <07D2> <5524> endbfchar 100 beginbfchar <07D3> <75EA> <07D4> <8C62> <07D5> <7115> <07D6> <6DA3> <07D7> <5BA6> <07D8> <5E7B> <07D9> <8352> <07DA> <614C> <07DB> <9EC4> <07DC> <78FA> <07DD> <8757> <07DE> <7C27> <07DF> <7687> <07E0> <51F0> <07E1> <60F6> <07E2> <714C> <07E3> <6643> <07E4> <5E4C> <07E5> <604D> <07E6> <8C0E> <07E7> <7070> <07E8> <6325> <07E9> <8F89> <07EA> <5FBD> <07EB> <6062> <07EC> <86D4> <07ED> <56DE> <07EE> <6BC1> <07EF> <6094> <07F0> <6167> <07F1> <5349> <07F2> <60E0> <07F3> <6666> <07F4> <8D3F> <07F5> <79FD> <07F6> <4F1A> <07F7> <70E9> <07F8> <6C47> <07F9> <8BB3> <07FA> <8BF2> <07FB> <7ED8> <07FC> <8364> <07FD> <660F> <07FE> <5A5A> <07FF> <9B42> <0800> <6D51> <0801> <6DF7> <0802> <8C41> <0803> <6D3B> <0804> <4F19> <0805> <706B> <0806> <83B7> <0807> <6216> <0808> <60D1> <0809> <970D> <080A> <8D27> <080B> <7978> <080C> <51FB> <080D> <573E> <080E> <57FA> <080F> <673A> <0810> <7578> <0811> <7A3D> <0812> <79EF> <0813> <7B95> <0814> <808C> <0815> <9965> <0816> <8FF9> <0817> <6FC0> <0818> <8BA5> <0819> <9E21> <081A> <59EC> <081B> <7EE9> <081C> <7F09> <081D> <5409> <081E> <6781> <081F> <68D8> <0820> <8F91> <0821> <7C4D> <0822> <96C6> <0823> <53CA> <0824> <6025> <0825> <75BE> <0826> <6C72> <0827> <5373> <0828> <5AC9> <0829> <7EA7> <082A> <6324> <082B> <51E0> <082C> <810A> <082D> <5DF1> <082E> <84DF> <082F> <6280> <0830> <5180> <0831> <5B63> <0832> <4F0E> <0833> <796D> <0834> <5242> <0835> <60B8> <0836> <6D4E> endbfchar 100 beginbfchar <0837> <5BC4> <0838> <5BC2> <0839> <8BA1> <083A> <8BB0> <083B> <65E2> <083C> <5FCC> <083D> <9645> <083E> <5993> <083F> <7EE7> <0840> <7EAA> <0841> <5609> <0842> <67B7> <0843> <5939> <0844> <4F73> <0845> <5BB6> <0846> <52A0> <0847> <835A> <0848> <988A> <0849> <8D3E> <084A> <7532> <084B> <94BE> <084C> <5047> <084D> <7A3C> <084E> <4EF7> <084F> <67B6> <0850> <9A7E> <0851> <5AC1> <0852> <6B7C> <0853> <76D1> <0854> <575A> <0855> <5C16> <0856> <7B3A> <0857> <95F4> <0858> <714E> <0859> <517C> <085A> <80A9> <085B> <8270> <085C> <5978> <085D> <7F04> <085E> <8327> <085F> <68C0> <0860> <67EC> <0861> <78B1> <0862> <7877> <0863> <62E3> <0864> <6361> <0865> <7B80> <0866> <4FED> <0867> <526A> <0868> <51CF> <0869> <8350> <086A> <69DB> <086B> <9274> <086C> <8DF5> <086D> <8D31> <086E> <89C1> <086F> <952E> <0870> <7BAD> <0871> <4EF6> <0872> <5065> <0873> <8230> <0874> <5251> <0875> <996F> <0876> <6E10> <0877> <6E85> <0878> <6DA7> <0879> <5EFA> <087A> <50F5> <087B> <59DC> <087C> <5C06> <087D> <6D46> <087E> <6C5F> <087F> <7586> <0880> <848B> <0881> <6868> <0882> <5956> <0883> <8BB2> <0884> <5320> <0885> <9171> <0886> <964D> <0887> <8549> <0888> <6912> <0889> <7901> <088A> <7126> <088B> <80F6> <088C> <4EA4> <088D> <90CA> <088E> <6D47> <088F> <9A84> <0890> <5A07> <0891> <56BC> <0892> <6405> <0893> <94F0> <0894> <77EB> <0895> <4FA5> <0896> <811A> <0897> <72E1> <0898> <89D2> <0899> <997A> <089A> <7F34> endbfchar 100 beginbfchar <089B> <7EDE> <089C> <527F> <089D> <6559> <089E> <9175> <089F> <8F7F> <08A0> <8F83> <08A1> <53EB> <08A2> <7A96> <08A3> <63ED> <08A4> <63A5> <08A5> <7686> <08A6> <79F8> <08A7> <8857> <08A8> <9636> <08A9> <622A> <08AA> <52AB> <08AB> <8282> <08AC> <6854> <08AD> <6770> <08AE> <6377> <08AF> <776B> <08B0> <7AED> <08B1> <6D01> <08B2> <7ED3> <08B3> <89E3> <08B4> <59D0> <08B5> <6212> <08B6> <85C9> <08B7> <82A5> <08B8> <754C> <08B9> <501F> <08BA> <4ECB> <08BB> <75A5> <08BC> <8BEB> <08BD> <5C4A> <08BE> <5DFE> <08BF> <7B4B> <08C0> <65A4> <08C1> <91D1> <08C2> <4ECA> <08C3> <6D25> <08C4> <895F> <08C5> <7D27> <08C6> <9526> <08C7> <4EC5> <08C8> <8C28> <08C9> <8FDB> <08CA> <9773> <08CB> <664B> <08CC> <7981> <08CD> <8FD1> <08CE> <70EC> <08CF> <6D78> <08D0> <5C3D> <08D1> <52B2> <08D2> <8346> <08D3> <5162> <08D4> <830E> <08D5> <775B> <08D6> <6676> <08D7> <9CB8> <08D8> <4EAC> <08D9> <60CA> <08DA> <7CBE> <08DB> <7CB3> <08DC> <7ECF> <08DD> <4E95> <08DE> <8B66> <08DF> <666F> <08E0> <9888> <08E1> <9759> <08E2> <5883> <08E3> <656C> <08E4> <955C> <08E5> <5F84> <08E6> <75C9> <08E7> <9756> <08E8> <7ADF> <08E9> <7ADE> <08EA> <51C0> <08EB> <70AF> <08EC> <7A98> <08ED> <63EA> <08EE> <7A76> <08EF> <7EA0> <08F0> <7396> <08F1> <97ED> <08F2> <4E45> <08F3> <7078> <08F4> <4E5D> <08F5> <9152> <08F6> <53A9> <08F7> <6551> <08F8> <65E7> <08F9> <81FC> <08FA> <8205> <08FB> <548E> <08FC> <5C31> <08FD> <759A> <08FE> <97A0> endbfchar 100 beginbfchar <08FF> <62D8> <0900> <72D9> <0901> <75BD> <0902> <5C45> <0903> <9A79> <0904> <83CA> <0905> <5C40> <0906> <5480> <0907> <77E9> <0908> <4E3E> <0909> <6CAE> <090A> <805A> <090B> <62D2> <090C> <636E> <090D> <5DE8> <090E> <5177> <090F> <8DDD> <0910> <8E1E> <0911> <952F> <0912> <4FF1> <0913> <53E5> <0914> <60E7> <0915> <70AC> <0916> <5267> <0917> <6350> <0918> <9E43> <0919> <5A1F> <091A> <5026> <091B> <7737> <091C> <5377> <091D> <7EE2> <091E> <6485> <091F> <652B> <0920> <6289> <0921> <6398> <0922> <5014> <0923> <7235> <0924> <89C9> <0925> <51B3> <0926> <8BC0> <0927> <7EDD> <0928> <5747> <0929> <83CC> <092A> <94A7> <092B> <519B> <092C> <541B> <092D> <5CFB> <092E> <4FCA> <092F> <7AE3> <0930> <6D5A> <0931> <90E1> <0932> <9A8F> <0933> <5580> <0934> <5496> <0935> <5361> <0936> <54AF> <0937> <5F00> <0938> <63E9> <0939> <6977> <093A> <51EF> <093B> <6168> <093C> <520A> <093D> <582A> <093E> <52D8> <093F> <574E> <0940> <780D> <0941> <770B> <0942> <5EB7> <0943> <6177> <0944> <7CE0> <0945> <625B> <0946> <6297> <0947> <4EA2> <0948> <7095> <0949> <8003> <094A> <62F7> <094B> <70E4> <094C> <9760> <094D> <5777> <094E> <82DB> <094F> <67EF> <0950> <68F5> <0951> <78D5> <0952> <9897> <0953> <79D1> <0954> <58F3> <0955> <54B3> <0956> <53EF> <0957> <6E34> <0958> <514B> <0959> <523B> <095A> <5BA2> <095B> <8BFE> <095C> <80AF> <095D> <5543> <095E> <57A6> <095F> <6073> <0960> <5751> <0961> <542D> <0962> <7A7A> endbfchar 100 beginbfchar <0963> <6050> <0964> <5B54> <0965> <63A7> <0966> <62A0> <0967> <53E3> <0968> <6263> <0969> <5BC7> <096A> <67AF> <096B> <54ED> <096C> <7A9F> <096D> <82E6> <096E> <9177> <096F> <5E93> <0970> <88E4> <0971> <5938> <0972> <57AE> <0973> <630E> <0974> <8DE8> <0975> <80EF> <0976> <5757> <0977> <7B77> <0978> <4FA9> <0979> <5FEB> <097A> <5BBD> <097B> <6B3E> <097C> <5321> <097D> <7B50> <097E> <72C2> <097F> <6846> <0980> <77FF> <0981> <7736> <0982> <65F7> <0983> <51B5> <0984> <4E8F> <0985> <76D4> <0986> <5CBF> <0987> <7AA5> <0988> <8475> <0989> <594E> <098A> <9B41> <098B> <5080> <098C> <9988> <098D> <6127> <098E> <6E83> <098F> <5764> <0990> <6606> <0991> <6346> <0992> <56F0> <0993> <62EC> <0994> <6269> <0995> <5ED3> <0996> <9614> <0997> <5783> <0998> <62C9> <0999> <5587> <099A> <8721> <099B> <814A> <099C> <8FA3> <099D> <5566> <099E> <83B1> <099F> <6765> <09A0> <8D56> <09A1> <84DD> <09A2> <5A6A> <09A3> <680F> <09A4> <62E6> <09A5> <7BEE> <09A6> <9611> <09A7> <5170> <09A8> <6F9C> <09A9> <8C30> <09AA> <63FD> <09AB> <89C8> <09AC> <61D2> <09AD> <7F06> <09AE> <70C2> <09AF> <6EE5> <09B0> <7405> <09B1> <6994> <09B2> <72FC> <09B3> <5ECA> <09B4> <90CE> <09B5> <6717> <09B6> <6D6A> <09B7> <635E> <09B8> <52B3> <09B9> <7262> <09BA> <8001> <09BB> <4F6C> <09BC> <59E5> <09BD> <916A> <09BE> <70D9> <09BF> <6D9D> <09C0> <52D2> <09C1> <4E50> <09C2> <96F7> <09C3> <956D> <09C4> <857E> <09C5> <78CA> <09C6> <7D2F> endbfchar 100 beginbfchar <09C7> <5121> <09C8> <5792> <09C9> <64C2> <09CA> <808B> <09CB> <7C7B> <09CC> <6CEA> <09CD> <68F1> <09CE> <695E> <09CF> <51B7> <09D0> <5398> <09D1> <68A8> <09D2> <7281> <09D3> <9ECE> <09D4> <7BF1> <09D5> <72F8> <09D6> <79BB> <09D7> <6F13> <09D8> <7406> <09D9> <674E> <09DA> <91CC> <09DB> <9CA4> <09DC> <793C> <09DD> <8389> <09DE> <8354> <09DF> <540F> <09E0> <6817> <09E1> <4E3D> <09E2> <5389> <09E3> <52B1> <09E4> <783E> <09E5> <5386> <09E6> <5229> <09E7> <5088> <09E8> <4F8B> <09E9> <4FD0> <09EA> <75E2> <09EB> <7ACB> <09EC> <7C92> <09ED> <6CA5> <09EE> <96B6> <09EF> <529B> <09F0> <7483> <09F1> <54E9> <09F2> <4FE9> <09F3> <8054> <09F4> <83B2> <09F5> <8FDE> <09F6> <9570> <09F7> <5EC9> <09F8> <601C> <09F9> <6D9F> <09FA> <5E18> <09FB> <655B> <09FC> <8138> <09FD> <94FE> <09FE> <604B> <09FF> <70BC> <0A00> <7EC3> <0A01> <7CAE> <0A02> <51C9> <0A03> <6881> <0A04> <7CB1> <0A05> <826F> <0A06> <4E24> <0A07> <8F86> <0A08> <91CF> <0A09> <667E> <0A0A> <4EAE> <0A0B> <8C05> <0A0C> <64A9> <0A0D> <804A> <0A0E> <50DA> <0A0F> <7597> <0A10> <71CE> <0A11> <5BE5> <0A12> <8FBD> <0A13> <6F66> <0A14> <4E86> <0A15> <6482> <0A16> <9563> <0A17> <5ED6> <0A18> <6599> <0A19> <5217> <0A1A> <88C2> <0A1B> <70C8> <0A1C> <52A3> <0A1D> <730E> <0A1E> <7433> <0A1F> <6797> <0A20> <78F7> <0A21> <9716> <0A22> <4E34> <0A23> <90BB> <0A24> <9CDE> <0A25> <6DCB> <0A26> <51DB> <0A27> <8D41> <0A28> <541D> <0A29> <62CE> <0A2A> <73B2> endbfchar 100 beginbfchar <0A2B> <83F1> <0A2C> <96F6> <0A2D> <9F84> <0A2E> <94C3> <0A2F> <4F36> <0A30> <7F9A> <0A31> <51CC> <0A32> <7075> <0A33> <9675> <0A34> <5CAD> <0A35> <9886> <0A36> <53E6> <0A37> <4EE4> <0A38> <6E9C> <0A39> <7409> <0A3A> <69B4> <0A3B> <786B> <0A3C> <998F> <0A3D> <7559> <0A3E> <5218> <0A3F> <7624> <0A40> <6D41> <0A41> <67F3> <0A42> <516D> <0A43> <9F99> <0A44> <804B> <0A45> <5499> <0A46> <7B3C> <0A47> <7ABF> <0A48> <9686> <0A49> <5784> <0A4A> <62E2> <0A4B> <9647> <0A4C> <697C> <0A4D> <5A04> <0A4E> <6402> <0A4F> <7BD3> <0A50> <6F0F> <0A51> <964B> <0A52> <82A6> <0A53> <5362> <0A54> <9885> <0A55> <5E90> <0A56> <7089> <0A57> <63B3> <0A58> <5364> <0A59> <864F> <0A5A> <9C81> <0A5B> <9E93> <0A5C> <788C> <0A5D> <9732> <0A5E> <8DEF> <0A5F> <8D42> <0A60> <9E7F> <0A61> <6F5E> <0A62> <7984> <0A63> <5F55> <0A64> <9646> <0A65> <622E> <0A66> <9A74> <0A67> <5415> <0A68> <94DD> <0A69> <4FA3> <0A6A> <65C5> <0A6B> <5C65> <0A6C> <5C61> <0A6D> <7F15> <0A6E> <8651> <0A6F> <6C2F> <0A70> <5F8B> <0A71> <7387> <0A72> <6EE4> <0A73> <7EFF> <0A74> <5CE6> <0A75> <631B> <0A76> <5B6A> <0A77> <6EE6> <0A78> <5375> <0A79> <4E71> <0A7A> <63A0> <0A7B> <7565> <0A7C> <62A1> <0A7D> <8F6E> <0A7E> <4F26> <0A7F> <4ED1> <0A80> <6CA6> <0A81> <7EB6> <0A82> <8BBA> <0A83> <841D> <0A84> <87BA> <0A85> <7F57> <0A86> <903B> <0A87> <9523> <0A88> <7BA9> <0A89> <9AA1> <0A8A> <88F8> <0A8B> <843D> <0A8C> <6D1B> <0A8D> <9A86> <0A8E> <7EDC> endbfchar 100 beginbfchar <0A8F> <5988> <0A90> <9EBB> <0A91> <739B> <0A92> <7801> <0A93> <8682> <0A94> <9A6C> <0A95> <9A82> <0A96> <561B> <0A97> <5417> <0A98> <57CB> <0A99> <4E70> <0A9A> <9EA6> <0A9B> <5356> <0A9C> <8FC8> <0A9D> <8109> <0A9E> <7792> <0A9F> <9992> <0AA0> <86EE> <0AA1> <6EE1> <0AA2> <8513> <0AA3> <66FC> <0AA4> <6162> <0AA5> <6F2B> <0AA6> <8C29> <0AA7> <8292> <0AA8> <832B> <0AA9> <76F2> <0AAA> <6C13> <0AAB> <5FD9> <0AAC> <83BD> <0AAD> <732B> <0AAE> <8305> <0AAF> <951A> <0AB0> <6BDB> <0AB1> <77DB> <0AB2> <94C6> <0AB3> <536F> <0AB4> <8302> <0AB5> <5192> <0AB6> <5E3D> <0AB7> <8C8C> <0AB8> <8D38> <0AB9> <4E48> <0ABA> <73AB> <0ABB> <679A> <0ABC> <6885> <0ABD> <9176> <0ABE> <9709> <0ABF> <7164> <0AC0> <6CA1> <0AC1> <7709> <0AC2> <5A92> <0AC3> <9541> <0AC4> <6BCF> <0AC5> <7F8E> <0AC6> <6627> <0AC7> <5BD0> <0AC8> <59B9> <0AC9> <5A9A> <0ACA> <95E8> <0ACB> <95F7> <0ACC> <4EEC> <0ACD> <840C> <0ACE> <8499> <0ACF> <6AAC> <0AD0> <76DF> <0AD1> <9530> <0AD2> <731B> <0AD3> <68A6> <0AD4> <5B5F> <0AD5> <772F> <0AD6> <919A> <0AD7> <9761> <0AD8> <7CDC> <0AD9> <8FF7> <0ADA> <8C1C> <0ADB> <5F25> <0ADC> <7C73> <0ADD> <79D8> <0ADE> <89C5> <0ADF> <6CCC> <0AE0> <871C> <0AE1> <5BC6> <0AE2> <5E42> <0AE3> <68C9> <0AE4> <7720> <0AE5> <7EF5> <0AE6> <5195> <0AE7> <514D> <0AE8> <52C9> <0AE9> <5A29> <0AEA> <7F05> <0AEB> <9762> <0AEC> <82D7> <0AED> <63CF> <0AEE> <7784> <0AEF> <85D0> <0AF0> <79D2> <0AF1> <6E3A> <0AF2> <5E99> endbfchar 100 beginbfchar <0AF3> <5999> <0AF4> <8511> <0AF5> <706D> <0AF6> <6C11> <0AF7> <62BF> <0AF8> <76BF> <0AF9> <654F> <0AFA> <60AF> <0AFB> <95FD> <0AFC> <660E> <0AFD> <879F> <0AFE> <9E23> <0AFF> <94ED> <0B00> <540D> <0B01> <547D> <0B02> <8C2C> <0B05> <8611> <0B06> <6A21> <0B07> <819C> <0B08> <78E8> <0B09> <6469> <0B0A> <9B54> <0B0B> <62B9> <0B0C> <672B> <0B0D> <83AB> <0B0E> <58A8> <0B0F> <9ED8> <0B10> <6CAB> <0B11> <6F20> <0B12> <5BDE> <0B13> <964C> <0B14> <8C0B> <0B15> <725F> <0B16> <67D0> <0B17> <62C7> <0B18> <7261> <0B19> <4EA9> <0B1A> <59C6> <0B1B> <6BCD> <0B1C> <5893> <0B1D> <66AE> <0B1E> <5E55> <0B1F> <52DF> <0B20> <6155> <0B21> <6728> <0B22> <76EE> <0B23> <7766> <0B24> <7267> <0B25> <7A46> <0B26> <62FF> <0B27> <54EA> <0B28> <5450> <0B29> <94A0> <0B2A> <90A3> <0B2B> <5A1C> <0B2C> <7EB3> <0B2D> <6C16> <0B2E> <4E43> <0B2F> <5976> <0B30> <8010> <0B31> <5948> <0B32> <5357> <0B33> <7537> <0B34> <96BE> <0B35> <56CA> <0B36> <6320> <0B37> <8111> <0B38> <607C> <0B39> <95F9> <0B3A> <6DD6> <0B3B> <5462> <0B3C> <9981> <0B3D> <5185> <0B3E> <5AE9> <0B3F> <80FD> <0B40> <59AE> <0B41> <9713> <0B42> <502A> <0B43> <6CE5> <0B44> <5C3C> <0B45> <62DF> <0B46> <4F60> <0B47> <533F> <0B48> <817B> <0B49> <9006> <0B4A> <6EBA> <0B4B> <852B> <0B4C> <62C8> <0B4D> <5E74> <0B4E> <78BE> <0B4F> <64B5> <0B50> <637B> <0B51> <5FF5> <0B52> <5A18> <0B53> <917F> <0B54> <9E1F> <0B55> <5C3F> <0B56> <634F> <0B57> <8042> <0B58> <5B7D> endbfchar 100 beginbfchar <0B59> <556E> <0B5A> <954A> <0B5B> <954D> <0B5C> <6D85> <0B5D> <60A8> <0B5E> <67E0> <0B5F> <72DE> <0B60> <51DD> <0B61> <5B81> <0B62> <62E7> <0B63> <6CDE> <0B64> <725B> <0B65> <626D> <0B66> <94AE> <0B67> <7EBD> <0B68> <8113> <0B69> <6D53> <0B6A> <519C> <0B6B> <5F04> <0B6C> <5974> <0B6D> <52AA> <0B6E> <6012> <0B6F> <5973> <0B70> <6696> <0B71> <8650> <0B72> <759F> <0B73> <632A> <0B74> <61E6> <0B75> <7CEF> <0B76> <8BFA> <0B77> <54E6> <0B78> <6B27> <0B79> <9E25> <0B7A> <6BB4> <0B7B> <85D5> <0B7C> <5455> <0B7D> <5076> <0B7E> <6CA4> <0B7F> <556A> <0B80> <8DB4> <0B81> <722C> <0B82> <5E15> <0B83> <6015> <0B84> <7436> <0B85> <62CD> <0B86> <6392> <0B87> <724C> <0B88> <5F98> <0B89> <6E43> <0B8A> <6D3E> <0B8B> <6500> <0B8C> <6F58> <0B8D> <76D8> <0B8E> <78D0> <0B8F> <76FC> <0B90> <7554> <0B91> <5224> <0B92> <53DB> <0B93> <4E53> <0B94> <5E9E> <0B95> <65C1> <0B96> <802A> <0B97> <80D6> <0B98> <629B> <0B99> <5486> <0B9A> <5228> <0B9B> <70AE> <0B9C> <888D> <0B9D> <8DD1> <0B9E> <6CE1> <0B9F> <5478> <0BA0> <80DA> <0BA1> <57F9> <0BA2> <88F4> <0BA3> <8D54> <0BA4> <966A> <0BA5> <914D> <0BA6> <4F69> <0BA7> <6C9B> <0BA8> <55B7> <0BA9> <76C6> <0BAA> <7830> <0BAB> <62A8> <0BAC> <70F9> <0BAD> <6F8E> <0BAE> <5F6D> <0BAF> <84EC> <0BB0> <68DA> <0BB1> <787C> <0BB2> <7BF7> <0BB3> <81A8> <0BB4> <670B> <0BB5> <9E4F> <0BB6> <6367> <0BB7> <78B0> <0BB8> <576F> <0BB9> <7812> <0BBA> <9739> <0BBB> <6279> <0BBC> <62AB> endbfchar 100 beginbfchar <0BBD> <5288> <0BBE> <7435> <0BBF> <6BD7> <0BC0> <5564> <0BC1> <813E> <0BC2> <75B2> <0BC3> <76AE> <0BC4> <5339> <0BC5> <75DE> <0BC6> <50FB> <0BC7> <5C41> <0BC8> <8B6C> <0BC9> <7BC7> <0BCA> <504F> <0BCB> <7247> <0BCC> <9A97> <0BCD> <98D8> <0BCE> <6F02> <0BCF> <74E2> <0BD0> <7968> <0BD1> <6487> <0BD2> <77A5> <0BD3> <62FC> <0BD4> <9891> <0BD5> <8D2B> <0BD6> <54C1> <0BD7> <8058> <0BD8> <4E52> <0BD9> <576A> <0BDA> <82F9> <0BDB> <840D> <0BDC> <5E73> <0BDD> <51ED> <0BDE> <74F6> <0BDF> <8BC4> <0BE0> <5C4F> <0BE1> <5761> <0BE2> <6CFC> <0BE3> <9887> <0BE4> <5A46> <0BE5> <7834> <0BE6> <9B44> <0BE7> <8FEB> <0BE8> <7C95> <0BE9> <5256> <0BEA> <6251> <0BEB> <94FA> <0BEC> <4EC6> <0BED> <8386> <0BEE> <8461> <0BEF> <83E9> <0BF0> <84B2> <0BF1> <57D4> <0BF2> <6734> <0BF3> <5703> <0BF4> <666E> <0BF5> <6D66> <0BF6> <8C31> <0BF7> <66DD> <0BF8> <7011> <0BF9> <671F> <0BFA> <6B3A> <0BFB> <6816> <0BFC> <621A> <0BFD> <59BB> <0BFE> <4E03> <0BFF> <51C4> <0C00> <6F06> <0C01> <67D2> <0C02> <6C8F> <0C03> <5176> <0C04> <68CB> <0C05> <5947> <0C06> <6B67> <0C07> <7566> <0C08> <5D0E> <0C09> <8110> <0C0A> <9F50> <0C0B> <65D7> <0C0C> <7948> <0C0D> <7941> <0C0E> <9A91> <0C0F> <8D77> <0C10> <5C82> <0C11> <4E5E> <0C12> <4F01> <0C13> <542F> <0C14> <5951> <0C15> <780C> <0C16> <5668> <0C17> <6C14> <0C18> <8FC4> <0C19> <5F03> <0C1A> <6C7D> <0C1B> <6CE3> <0C1C> <8BAB> <0C1D> <6390> <0C1E> <6070> <0C1F> <6D3D> <0C20> <7275> endbfchar 100 beginbfchar <0C21> <6266> <0C22> <948E> <0C23> <94C5> <0C24> <5343> <0C25> <8FC1> <0C26> <7B7E> <0C27> <4EDF> <0C28> <8C26> <0C29> <4E7E> <0C2A> <9ED4> <0C2B> <94B1> <0C2C> <94B3> <0C2D> <524D> <0C2E> <6F5C> <0C2F> <9063> <0C30> <6D45> <0C31> <8C34> <0C32> <5811> <0C33> <5D4C> <0C34> <6B20> <0C35> <6B49> <0C36> <67AA> <0C37> <545B> <0C38> <8154> <0C39> <7F8C> <0C3A> <5899> <0C3B> <8537> <0C3C> <5F3A> <0C3D> <62A2> <0C3E> <6A47> <0C3F> <9539> <0C40> <6572> <0C41> <6084> <0C42> <6865> <0C43> <77A7> <0C44> <4E54> <0C45> <4FA8> <0C46> <5DE7> <0C47> <9798> <0C48> <64AC> <0C49> <7FD8> <0C4A> <5CED> <0C4B> <4FCF> <0C4C> <7A8D> <0C4D> <5207> <0C4E> <8304> <0C4F> <4E14> <0C50> <602F> <0C51> <7A83> <0C52> <94A6> <0C53> <4FB5> <0C54> <4EB2> <0C55> <79E6> <0C56> <7434> <0C57> <52E4> <0C58> <82B9> <0C59> <64D2> <0C5A> <79BD> <0C5B> <5BDD> <0C5C> <6C81> <0C5D> <9752> <0C5E> <8F7B> <0C5F> <6C22> <0C60> <503E> <0C61> <537F> <0C62> <6E05> <0C63> <64CE> <0C64> <6674> <0C65> <6C30> <0C66> <60C5> <0C67> <9877> <0C68> <8BF7> <0C69> <5E86> <0C6A> <743C> <0C6B> <7A77> <0C6C> <79CB> <0C6D> <4E18> <0C6E> <90B1> <0C6F> <7403> <0C70> <6C42> <0C71> <56DA> <0C72> <914B> <0C73> <6CC5> <0C74> <8D8B> <0C75> <533A> <0C76> <86C6> <0C77> <66F2> <0C78> <8EAF> <0C79> <5C48> <0C7A> <9A71> <0C7B> <6E20> <0C7C> <53D6> <0C7D> <5A36> <0C7E> <9F8B> <0C7F> <8DA3> <0C80> <53BB> <0C81> <5708> <0C82> <98A7> <0C83> <6743> <0C84> <919B> endbfchar 100 beginbfchar <0C85> <6CC9> <0C86> <5168> <0C87> <75CA> <0C88> <62F3> <0C89> <72AC> <0C8A> <5238> <0C8B> <529D> <0C8C> <7F3A> <0C8D> <7094> <0C8E> <7638> <0C8F> <5374> <0C90> <9E4A> <0C91> <69B7> <0C92> <786E> <0C93> <96C0> <0C94> <88D9> <0C95> <7FA4> <0C96> <7136> <0C97> <71C3> <0C98> <5189> <0C99> <67D3> <0C9A> <74E4> <0C9B> <58E4> <0C9C> <6518> <0C9D> <56B7> <0C9E> <8BA9> <0C9F> <9976> <0CA0> <6270> <0CA1> <7ED5> <0CA2> <60F9> <0CA3> <70ED> <0CA4> <58EC> <0CA5> <4EC1> <0CA6> <4EBA> <0CA7> <5FCD> <0CA8> <97E7> <0CA9> <4EFB> <0CAA> <8BA4> <0CAB> <5203> <0CAC> <598A> <0CAD> <7EAB> <0CAE> <6254> <0CAF> <4ECD> <0CB0> <65E5> <0CB1> <620E> <0CB2> <8338> <0CB3> <84C9> <0CB4> <8363> <0CB5> <878D> <0CB6> <7194> <0CB7> <6EB6> <0CB8> <5BB9> <0CB9> <7ED2> <0CBA> <5197> <0CBB> <63C9> <0CBC> <67D4> <0CBD> <8089> <0CBE> <8339> <0CBF> <8815> <0CC0> <5112> <0CC1> <5B7A> <0CC2> <5982> <0CC3> <8FB1> <0CC4> <4E73> <0CC5> <6C5D> <0CC6> <5165> <0CC7> <8925> <0CC8> <8F6F> <0CC9> <962E> <0CCA> <854A> <0CCB> <745E> <0CCC> <9510> <0CCD> <95F0> <0CCE> <6DA6> <0CCF> <82E5> <0CD0> <5F31> <0CD1> <6492> <0CD2> <6D12> <0CD3> <8428> <0CD4> <816E> <0CD5> <9CC3> <0CD6> <585E> <0CD7> <8D5B> <0CD8> <4E09> <0CD9> <53C1> <0CDA> <4F1E> <0CDB> <6563> <0CDC> <6851> <0CDD> <55D3> <0CDE> <4E27> <0CDF> <6414> <0CE0> <9A9A> <0CE1> <626B> <0CE2> <5AC2> <0CE3> <745F> <0CE4> <8272> <0CE5> <6DA9> <0CE6> <68EE> <0CE7> <50E7> <0CE8> <838E> endbfchar 100 beginbfchar <0CE9> <7802> <0CEA> <6740> <0CEB> <5239> <0CEC> <6C99> <0CED> <7EB1> <0CEE> <50BB> <0CEF> <5565> <0CF0> <715E> <0CF1> <7B5B> <0CF2> <6652> <0CF3> <73CA> <0CF4> <82EB> <0CF5> <6749> <0CF6> <5C71> <0CF7> <5220> <0CF8> <717D> <0CF9> <886B> <0CFA> <95EA> <0CFB> <9655> <0CFC> <64C5> <0CFD> <8D61> <0CFE> <81B3> <0CFF> <5584> <0D00> <6C55> <0D01> <6247> <0D02> <7F2E> <0D03> <5892> <0D04> <4F24> <0D05> <5546> <0D06> <8D4F> <0D07> <664C> <0D08> <4E0A> <0D09> <5C1A> <0D0A> <88F3> <0D0B> <68A2> <0D0C> <634E> <0D0D> <7A0D> <0D0E> <70E7> <0D0F> <828D> <0D10> <52FA> <0D11> <97F6> <0D12> <5C11> <0D13> <54E8> <0D14> <90B5> <0D15> <7ECD> <0D16> <5962> <0D17> <8D4A> <0D18> <86C7> <0D1B> <8D66> <0D1C> <6444> <0D1D> <5C04> <0D1E> <6151> <0D1F> <6D89> <0D20> <793E> <0D21> <8BBE> <0D22> <7837> <0D23> <7533> <0D24> <547B> <0D25> <4F38> <0D26> <8EAB> <0D27> <6DF1> <0D28> <5A20> <0D29> <7EC5> <0D2A> <795E> <0D2B> <6C88> <0D2C> <5BA1> <0D2D> <5A76> <0D2E> <751A> <0D2F> <80BE> <0D30> <614E> <0D31> <6E17> <0D32> <58F0> <0D33> <751F> <0D34> <7525> <0D35> <7272> <0D36> <5347> <0D37> <7EF3> <0D38> <7701> <0D39> <76DB> <0D3A> <5269> <0D3B> <80DC> <0D3C> <5723> <0D3D> <5E08> <0D3E> <5931> <0D3F> <72EE> <0D40> <65BD> <0D41> <6E7F> <0D42> <8BD7> <0D43> <5C38> <0D44> <8671> <0D45> <5341> <0D46> <77F3> <0D47> <62FE> <0D48> <65F6> <0D49> <4EC0> <0D4A> <98DF> <0D4B> <8680> <0D4C> <5B9E> <0D4D> <8BC6> <0D4E> <53F2> endbfchar 100 beginbfchar <0D4F> <77E2> <0D50> <4F7F> <0D51> <5C4E> <0D52> <9A76> <0D53> <59CB> <0D54> <5F0F> <0D55> <793A> <0D56> <58EB> <0D57> <4E16> <0D58> <67FF> <0D59> <4E8B> <0D5A> <62ED> <0D5B> <8A93> <0D5C> <901D> <0D5D> <52BF> <0D5E> <662F> <0D5F> <55DC> <0D60> <566C> <0D61> <9002> <0D62> <4ED5> <0D63> <4F8D> <0D64> <91CA> <0D65> <9970> <0D66> <6C0F> <0D67> <5E02> <0D68> <6043> <0D69> <5BA4> <0D6A> <89C6> <0D6B> <8BD5> <0D6C> <6536> <0D6D> <624B> <0D6E> <9996> <0D6F> <5B88> <0D70> <5BFF> <0D71> <6388> <0D72> <552E> <0D73> <53D7> <0D74> <7626> <0D75> <517D> <0D76> <852C> <0D77> <67A2> <0D78> <68B3> <0D79> <6B8A> <0D7A> <6292> <0D7B> <8F93> <0D7C> <53D4> <0D7D> <8212> <0D7E> <6DD1> <0D7F> <758F> <0D80> <4E66> <0D81> <8D4E> <0D82> <5B70> <0D83> <719F> <0D84> <85AF> <0D85> <6691> <0D86> <66D9> <0D87> <7F72> <0D88> <8700> <0D89> <9ECD> <0D8A> <9F20> <0D8B> <5C5E> <0D8C> <672F> <0D8D> <8FF0> <0D8E> <6811> <0D8F> <675F> <0D90> <620D> <0D91> <7AD6> <0D92> <5885> <0D93> <5EB6> <0D94> <6570> <0D95> <6F31> <0D96> <6055> <0D97> <5237> <0D98> <800D> <0D99> <6454> <0D9A> <8870> <0D9B> <7529> <0D9C> <5E05> <0D9D> <6813> <0D9E> <62F4> <0D9F> <971C> <0DA0> <53CC> <0DA1> <723D> <0DA2> <8C01> <0DA3> <6C34> <0DA4> <7761> <0DA5> <7A0E> <0DA6> <542E> <0DA7> <77AC> <0DA8> <987A> <0DA9> <821C> <0DAA> <8BF4> <0DAB> <7855> <0DAC> <6714> <0DAD> <70C1> <0DAE> <65AF> <0DAF> <6495> <0DB0> <5636> <0DB1> <601D> <0DB2> <79C1> endbfchar 100 beginbfchar <0DB3> <53F8> <0DB4> <4E1D> <0DB5> <6B7B> <0DB6> <8086> <0DB7> <5BFA> <0DB8> <55E3> <0DB9> <56DB> <0DBA> <4F3A> <0DBB> <4F3C> <0DBC> <9972> <0DBD> <5DF3> <0DBE> <677E> <0DBF> <8038> <0DC0> <6002> <0DC1> <9882> <0DC2> <9001> <0DC3> <5B8B> <0DC4> <8BBC> <0DC5> <8BF5> <0DC6> <641C> <0DC7> <8258> <0DC8> <64DE> <0DC9> <55FD> <0DCA> <82CF> <0DCB> <9165> <0DCC> <4FD7> <0DCD> <7D20> <0DCE> <901F> <0DCF> <7C9F> <0DD0> <50F3> <0DD1> <5851> <0DD2> <6EAF> <0DD3> <5BBF> <0DD4> <8BC9> <0DD5> <8083> <0DD6> <9178> <0DD7> <849C> <0DD8> <7B97> <0DD9> <867D> <0DDA> <968B> <0DDB> <968F> <0DDC> <7EE5> <0DDD> <9AD3> <0DDE> <788E> <0DDF> <5C81> <0DE0> <7A57> <0DE1> <9042> <0DE2> <96A7> <0DE3> <795F> <0DE4> <5B59> <0DE5> <635F> <0DE6> <7B0B> <0DE7> <84D1> <0DE8> <68AD> <0DE9> <5506> <0DEA> <7F29> <0DEB> <7410> <0DEC> <7D22> <0DED> <9501> <0DEE> <6240> <0DEF> <584C> <0DF0> <4ED6> <0DF1> <5B83> <0DF2> <5979> <0DF3> <5854> <0DF4> <736D> <0DF5> <631E> <0DF6> <8E4B> <0DF7> <8E0F> <0DF8> <80CE> <0DF9> <82D4> <0DFA> <62AC> <0DFB> <53F0> <0DFC> <6CF0> <0DFD> <915E> <0DFE> <592A> <0DFF> <6001> <0E00> <6C70> <0E01> <574D> <0E02> <644A> <0E03> <8D2A> <0E04> <762B> <0E05> <6EE9> <0E06> <575B> <0E07> <6A80> <0E08> <75F0> <0E09> <6F6D> <0E0A> <8C2D> <0E0B> <8C08> <0E0C> <5766> <0E0D> <6BEF> <0E0E> <8892> <0E0F> <78B3> <0E10> <63A2> <0E11> <53F9> <0E12> <70AD> <0E13> <6C64> <0E14> <5858> <0E15> <642A> <0E16> <5802> endbfchar 100 beginbfchar <0E17> <68E0> <0E18> <819B> <0E19> <5510> <0E1A> <7CD6> <0E1B> <5018> <0E1C> <8EBA> <0E1D> <6DCC> <0E1E> <8D9F> <0E1F> <70EB> <0E20> <638F> <0E21> <6D9B> <0E22> <6ED4> <0E23> <7EE6> <0E24> <8404> <0E25> <6843> <0E26> <9003> <0E27> <6DD8> <0E28> <9676> <0E29> <8BA8> <0E2A> <5957> <0E2B> <7279> <0E2C> <85E4> <0E2D> <817E> <0E2E> <75BC> <0E2F> <8A8A> <0E30> <68AF> <0E31> <5254> <0E32> <8E22> <0E33> <9511> <0E34> <63D0> <0E35> <9898> <0E36> <8E44> <0E37> <557C> <0E38> <4F53> <0E39> <66FF> <0E3A> <568F> <0E3B> <60D5> <0E3C> <6D95> <0E3D> <5243> <0E3E> <5C49> <0E3F> <5929> <0E40> <6DFB> <0E41> <586B> <0E42> <7530> <0E43> <751C> <0E44> <606C> <0E45> <8214> <0E46> <8146> <0E47> <6311> <0E48> <6761> <0E49> <8FE2> <0E4A> <773A> <0E4B> <8DF3> <0E4C> <8D34> <0E4D> <94C1> <0E4E> <5E16> <0E4F> <5385> <0E50> <542C> <0E51> <70C3> <0E52> <6C40> <0E53> <5EF7> <0E54> <505C> <0E55> <4EAD> <0E56> <5EAD> <0E57> <633A> <0E58> <8247> <0E59> <901A> <0E5A> <6850> <0E5B> <916E> <0E5C> <77B3> <0E5D> <540C> <0E5E> <94DC> <0E5F> <5F64> <0E60> <7AE5> <0E61> <6876> <0E62> <6345> <0E63> <7B52> <0E64> <7EDF> <0E65> <75DB> <0E66> <5077> <0E67> <6295> <0E68> <5934> <0E69> <900F> <0E6A> <51F8> <0E6B> <79C3> <0E6C> <7A81> <0E6D> <56FE> <0E6E> <5F92> <0E6F> <9014> <0E70> <6D82> <0E71> <5C60> <0E72> <571F> <0E73> <5410> <0E74> <5154> <0E75> <6E4D> <0E76> <56E2> <0E77> <63A8> <0E78> <9893> <0E79> <817F> <0E7A> <8715> endbfchar 100 beginbfchar <0E7B> <892A> <0E7C> <9000> <0E7D> <541E> <0E7E> <5C6F> <0E7F> <81C0> <0E80> <62D6> <0E81> <6258> <0E82> <8131> <0E83> <9E35> <0E84> <9640> <0E85> <9A6E> <0E86> <9A7C> <0E87> <692D> <0E88> <59A5> <0E89> <62D3> <0E8A> <553E> <0E8B> <6316> <0E8C> <54C7> <0E8D> <86D9> <0E8E> <6D3C> <0E8F> <5A03> <0E90> <74E6> <0E91> <889C> <0E92> <6B6A> <0E93> <5916> <0E94> <8C4C> <0E95> <5F2F> <0E96> <6E7E> <0E97> <73A9> <0E98> <987D> <0E99> <4E38> <0E9A> <70F7> <0E9B> <5B8C> <0E9C> <7897> <0E9D> <633D> <0E9E> <665A> <0E9F> <7696> <0EA0> <60CB> <0EA1> <5B9B> <0EA2> <5A49> <0EA3> <4E07> <0EA4> <8155> <0EA5> <6C6A> <0EA6> <738B> <0EA7> <4EA1> <0EA8> <6789> <0EA9> <7F51> <0EAA> <5F80> <0EAB> <65FA> <0EAC> <671B> <0EAD> <5FD8> <0EAE> <5984> <0EAF> <5A01> <0EB0> <5DCD> <0EB1> <5FAE> <0EB2> <5371> <0EB3> <97E6> <0EB4> <8FDD> <0EB5> <6845> <0EB6> <56F4> <0EB7> <552F> <0EB8> <60DF> <0EB9> <4E3A> <0EBA> <6F4D> <0EBB> <7EF4> <0EBC> <82C7> <0EBD> <840E> <0EBE> <59D4> <0EBF> <4F1F> <0EC0> <4F2A> <0EC1> <5C3E> <0EC2> <7EAC> <0EC3> <672A> <0EC4> <851A> <0EC5> <5473> <0EC6> <754F> <0EC7> <80C3> <0EC8> <5582> <0EC9> <9B4F> <0ECA> <4F4D> <0ECB> <6E2D> <0ECC> <8C13> <0ECD> <5C09> <0ECE> <6170> <0ECF> <536B> <0ED0> <761F> <0ED1> <6E29> <0ED2> <868A> <0ED3> <6587> <0ED4> <95FB> <0ED5> <7EB9> <0ED6> <543B> <0ED7> <7A33> <0ED8> <7D0A> <0ED9> <95EE> <0EDA> <55E1> <0EDB> <7FC1> <0EDC> <74EE> <0EDD> <631D> <0EDE> <8717> endbfchar 100 beginbfchar <0EDF> <6DA1> <0EE0> <7A9D> <0EE1> <6211> <0EE2> <65A1> <0EE3> <5367> <0EE4> <63E1> <0EE5> <6C83> <0EE6> <5DEB> <0EE7> <545C> <0EE8> <94A8> <0EE9> <4E4C> <0EEA> <6C61> <0EEB> <8BEC> <0EEC> <5C4B> <0EED> <65E0> <0EEE> <829C> <0EEF> <68A7> <0EF0> <543E> <0EF1> <5434> <0EF2> <6BCB> <0EF3> <6B66> <0EF4> <4E94> <0EF5> <6342> <0EF6> <5348> <0EF7> <821E> <0EF8> <4F0D> <0EF9> <4FAE> <0EFA> <575E> <0EFB> <620A> <0EFC> <96FE> <0EFD> <6664> <0EFE> <7269> <0EFF> <52FF> <0F00> <52A1> <0F01> <609F> <0F02> <8BEF> <0F03> <6614> <0F04> <7199> <0F05> <6790> <0F06> <897F> <0F07> <7852> <0F08> <77FD> <0F09> <6670> <0F0A> <563B> <0F0B> <5438> <0F0C> <9521> <0F0D> <727A> <0F0E> <7A00> <0F0F> <606F> <0F10> <5E0C> <0F11> <6089> <0F12> <819D> <0F13> <5915> <0F14> <60DC> <0F15> <7184> <0F16> <70EF> <0F17> <6EAA> <0F18> <6C50> <0F19> <7280> <0F1A> <6A84> <0F1B> <88AD> <0F1C> <5E2D> <0F1D> <4E60> <0F1E> <5AB3> <0F1F> <559C> <0F20> <94E3> <0F21> <6D17> <0F22> <7CFB> <0F23> <9699> <0F24> <620F> <0F25> <7EC6> <0F26> <778E> <0F27> <867E> <0F28> <5323> <0F29> <971E> <0F2A> <8F96> <0F2B> <6687> <0F2C> <5CE1> <0F2D> <4FA0> <0F2E> <72ED> <0F2F> <4E0B> <0F30> <53A6> <0F31> <590F> <0F32> <5413> <0F33> <6380> <0F34> <9528> <0F35> <5148> <0F36> <4ED9> <0F37> <9C9C> <0F38> <7EA4> <0F39> <54B8> <0F3A> <8D24> <0F3B> <8854> <0F3C> <8237> <0F3D> <95F2> <0F3E> <6D8E> <0F3F> <5F26> <0F40> <5ACC> <0F41> <663E> <0F42> <9669> endbfchar 100 beginbfchar <0F43> <73B0> <0F44> <732E> <0F45> <53BF> <0F46> <817A> <0F47> <9985> <0F48> <7FA1> <0F49> <5BAA> <0F4A> <9677> <0F4B> <9650> <0F4C> <7EBF> <0F4D> <76F8> <0F4E> <53A2> <0F4F> <9576> <0F50> <9999> <0F51> <7BB1> <0F52> <8944> <0F53> <6E58> <0F54> <4E61> <0F55> <7FD4> <0F56> <7965> <0F57> <8BE6> <0F58> <60F3> <0F59> <54CD> <0F5A> <4EAB> <0F5B> <9879> <0F5C> <5DF7> <0F5D> <6A61> <0F5E> <50CF> <0F5F> <5411> <0F60> <8C61> <0F61> <8427> <0F62> <785D> <0F63> <9704> <0F64> <524A> <0F65> <54EE> <0F66> <56A3> <0F67> <9500> <0F68> <6D88> <0F69> <5BB5> <0F6A> <6DC6> <0F6B> <6653> <0F6C> <5C0F> <0F6D> <5B5D> <0F6E> <6821> <0F6F> <8096> <0F70> <5578> <0F71> <7B11> <0F72> <6548> <0F73> <6954> <0F74> <4E9B> <0F75> <6B47> <0F76> <874E> <0F77> <978B> <0F78> <534F> <0F79> <631F> <0F7A> <643A> <0F7B> <90AA> <0F7C> <659C> <0F7D> <80C1> <0F7E> <8C10> <0F7F> <5199> <0F80> <68B0> <0F81> <5378> <0F82> <87F9> <0F83> <61C8> <0F84> <6CC4> <0F85> <6CFB> <0F86> <8C22> <0F87> <5C51> <0F88> <85AA> <0F89> <82AF> <0F8A> <950C> <0F8B> <6B23> <0F8C> <8F9B> <0F8D> <65B0> <0F8E> <5FFB> <0F8F> <5FC3> <0F90> <4FE1> <0F91> <8845> <0F92> <661F> <0F93> <8165> <0F94> <7329> <0F95> <60FA> <0F96> <5174> <0F97> <5211> <0F98> <578B> <0F99> <5F62> <0F9A> <90A2> <0F9B> <884C> <0F9C> <9192> <0F9D> <5E78> <0F9E> <674F> <0F9F> <6027> <0FA0> <59D3> <0FA1> <5144> <0FA2> <51F6> <0FA3> <80F8> <0FA4> <5308> <0FA5> <6C79> <0FA6> <96C4> endbfchar 100 beginbfchar <0FA7> <718A> <0FA8> <4F11> <0FA9> <4FEE> <0FAA> <7F9E> <0FAB> <673D> <0FAC> <55C5> <0FAD> <9508> <0FAE> <79C0> <0FAF> <8896> <0FB0> <7EE3> <0FB1> <589F> <0FB2> <620C> <0FB3> <9700> <0FB4> <865A> <0FB5> <5618> <0FB6> <987B> <0FB7> <5F90> <0FB8> <8BB8> <0FB9> <84C4> <0FBA> <9157> <0FBB> <53D9> <0FBC> <65ED> <0FBD> <5E8F> <0FBE> <755C> <0FBF> <6064> <0FC0> <7D6E> <0FC1> <5A7F> <0FC2> <7EEA> <0FC3> <7EED> <0FC4> <8F69> <0FC5> <55A7> <0FC6> <5BA3> <0FC7> <60AC> <0FC8> <65CB> <0FC9> <7384> <0FCA> <9009> <0FCB> <7663> <0FCC> <7729> <0FCD> <7EDA> <0FCE> <9774> <0FCF> <859B> <0FD0> <5B66> <0FD1> <7A74> <0FD2> <96EA> <0FD3> <8840> <0FD4> <52CB> <0FD5> <718F> <0FD6> <5FAA> <0FD7> <65EC> <0FD8> <8BE2> <0FD9> <5BFB> <0FDA> <9A6F> <0FDB> <5DE1> <0FDC> <6B89> <0FDD> <6C5B> <0FDE> <8BAD> <0FDF> <8BAF> <0FE0> <900A> <0FE1> <8FC5> <0FE2> <538B> <0FE3> <62BC> <0FE4> <9E26> <0FE5> <9E2D> <0FE6> <5440> <0FE7> <4E2B> <0FE8> <82BD> <0FE9> <7259> <0FEA> <869C> <0FEB> <5D16> <0FEC> <8859> <0FED> <6DAF> <0FEE> <96C5> <0FEF> <54D1> <0FF0> <4E9A> <0FF1> <8BB6> <0FF2> <7109> <0FF3> <54BD> <0FF4> <9609> <0FF5> <70DF> <0FF6> <6DF9> <0FF7> <76D0> <0FF8> <4E25> <0FF9> <7814> <0FFA> <8712> <0FFB> <5CA9> <0FFC> <5EF6> <0FFD> <8A00> <0FFE> <989C> <0FFF> <960E> <1000> <708E> <1001> <6CBF> <1002> <5944> <1003> <63A9> <1004> <773C> <1005> <884D> <1006> <6F14> <1007> <8273> <1008> <5830> <1009> <71D5> <100A> <538C> endbfchar 100 beginbfchar <100B> <781A> <100C> <96C1> <100D> <5501> <100E> <5F66> <100F> <7130> <1010> <5BB4> <1011> <8C1A> <1012> <9A8C> <1013> <6B83> <1014> <592E> <1015> <9E2F> <1016> <79E7> <1017> <6768> <1018> <626C> <1019> <4F6F> <101A> <75A1> <101B> <7F8A> <101C> <6D0B> <101D> <9633> <101E> <6C27> <101F> <4EF0> <1020> <75D2> <1021> <517B> <1022> <6837> <1023> <6F3E> <1024> <9080> <1025> <8170> <1026> <5996> <1027> <7476> <1028> <6447> <1029> <5C27> <102A> <9065> <102B> <7A91> <102C> <8C23> <102D> <59DA> <102E> <54AC> <102F> <8200> <1030> <836F> <1031> <8981> <1032> <8000> <1033> <6930> <1034> <564E> <1035> <8036> <1036> <7237> <1037> <91CE> <1038> <51B6> <1039> <4E5F> <103A> <9875> <103B> <6396> <103C> <4E1A> <103D> <53F6> <103E> <66F3> <103F> <814B> <1040> <591C> <1041> <6DB2> <1042> <4E00> <1043> <58F9> <1044> <533B> <1045> <63D6> <1046> <94F1> <1047> <4F9D> <1048> <4F0A> <1049> <8863> <104A> <9890> <104B> <5937> <104C> <9057> <104D> <79FB> <104E> <4EEA> <104F> <80F0> <1050> <7591> <1051> <6C82> <1052> <5B9C> <1053> <59E8> <1054> <5F5D> <1055> <6905> <1056> <8681> <1057> <501A> <1058> <5DF2> <1059> <4E59> <105A> <77E3> <105B> <4EE5> <105C> <827A> <105D> <6291> <105E> <6613> <105F> <9091> <1060> <5C79> <1061> <4EBF> <1062> <5F79> <1063> <81C6> <1064> <9038> <1065> <8084> <1066> <75AB> <1067> <4EA6> <1068> <88D4> <1069> <610F> <106A> <6BC5> <106B> <5FC6> <106C> <4E49> <106D> <76CA> <106E> <6EA2> endbfchar 100 beginbfchar <106F> <8BE3> <1070> <8BAE> <1071> <8C0A> <1072> <8BD1> <1073> <5F02> <1074> <7FFC> <1075> <7FCC> <1076> <7ECE> <1077> <8335> <1078> <836B> <1079> <56E0> <107A> <6BB7> <107B> <97F3> <107C> <9634> <107D> <59FB> <107E> <541F> <107F> <94F6> <1080> <6DEB> <1081> <5BC5> <1082> <996E> <1083> <5C39> <1084> <5F15> <1085> <9690> <1086> <5370> <1087> <82F1> <1088> <6A31> <1089> <5A74> <108A> <9E70> <108B> <5E94> <108C> <7F28> <108D> <83B9> <1090> <8367> <1091> <8747> <1092> <8FCE> <1093> <8D62> <1094> <76C8> <1095> <5F71> <1096> <9896> <1097> <786C> <1098> <6620> <1099> <54DF> <109A> <62E5> <109B> <4F63> <109C> <81C3> <109D> <75C8> <109E> <5EB8> <109F> <96CD> <10A0> <8E0A> <10A1> <86F9> <10A2> <548F> <10A3> <6CF3> <10A4> <6D8C> <10A5> <6C38> <10A6> <607F> <10A7> <52C7> <10A8> <7528> <10A9> <5E7D> <10AA> <4F18> <10AB> <60A0> <10AC> <5FE7> <10AD> <5C24> <10AE> <7531> <10AF> <90AE> <10B0> <94C0> <10B1> <72B9> <10B2> <6CB9> <10B3> <6E38> <10B4> <9149> <10B5> <6709> <10B6> <53CB> <10B7> <53F3> <10B8> <4F51> <10B9> <91C9> <10BA> <8BF1> <10BB> <53C8> <10BC> <5E7C> <10BD> <8FC2> <10BE> <6DE4> <10BF> <4E8E> <10C0> <76C2> <10C1> <6986> <10C2> <865E> <10C3> <611A> <10C4> <8206> <10C5> <4F59> <10C6> <4FDE> <10C7> <903E> <10C8> <9C7C> <10C9> <6109> <10CA> <6E1D> <10CB> <6E14> <10CC> <9685> <10CD> <4E88> <10CE> <5A31> <10CF> <96E8> <10D0> <4E0E> <10D1> <5C7F> <10D2> <79B9> <10D3> <5B87> <10D4> <8BED> endbfchar 100 beginbfchar <10D5> <7FBD> <10D6> <7389> <10D7> <57DF> <10D8> <828B> <10D9> <90C1> <10DA> <5401> <10DB> <9047> <10DC> <55BB> <10DD> <5CEA> <10DE> <5FA1> <10DF> <6108> <10E0> <6B32> <10E1> <72F1> <10E2> <80B2> <10E3> <8A89> <10E4> <6D74> <10E5> <5BD3> <10E6> <88D5> <10E7> <9884> <10E8> <8C6B> <10E9> <9A6D> <10EA> <9E33> <10EB> <6E0A> <10EC> <51A4> <10ED> <5143> <10EE> <57A3> <10EF> <8881> <10F0> <539F> <10F1> <63F4> <10F2> <8F95> <10F3> <56ED> <10F4> <5458> <10F5> <5706> <10F6> <733F> <10F7> <6E90> <10F8> <7F18> <10F9> <8FDC> <10FA> <82D1> <10FB> <613F> <10FC> <6028> <10FD> <9662> <10FE> <66F0> <10FF> <7EA6> <1100> <8D8A> <1101> <8DC3> <1102> <94A5> <1103> <5CB3> <1104> <7CA4> <1105> <6708> <1106> <60A6> <1107> <9605> <1108> <8018> <1109> <4E91> <110A> <90E7> <110B> <5300> <110C> <9668> <110D> <5141> <110E> <8FD0> <110F> <8574> <1110> <915D> <1111> <6655> <1112> <97F5> <1113> <5B55> <1114> <531D> <1115> <7838> <1116> <6742> <1117> <683D> <1118> <54C9> <1119> <707E> <111A> <5BB0> <111B> <8F7D> <111C> <518D> <111D> <5728> <111E> <54B1> <111F> <6512> <1120> <6682> <1121> <8D5E> <1122> <8D43> <1123> <810F> <1124> <846C> <1125> <906D> <1126> <7CDF> <1127> <51FF> <1128> <85FB> <1129> <67A3> <112A> <65E9> <112B> <6FA1> <112C> <86A4> <112D> <8E81> <112E> <566A> <112F> <9020> <1130> <7682> <1131> <7076> <1132> <71E5> <1133> <8D23> <1134> <62E9> <1135> <5219> <1136> <6CFD> <1137> <8D3C> <1138> <600E> endbfchar 100 beginbfchar <1139> <589E> <113A> <618E> <113B> <66FE> <113C> <8D60> <113D> <624E> <113E> <55B3> <113F> <6E23> <1140> <672D> <1141> <8F67> <1142> <94E1> <1143> <95F8> <1144> <7728> <1145> <6805> <1146> <69A8> <1147> <548B> <1148> <4E4D> <1149> <70B8> <114A> <8BC8> <114B> <6458> <114C> <658B> <114D> <5B85> <114E> <7A84> <114F> <503A> <1150> <5BE8> <1151> <77BB> <1152> <6BE1> <1153> <8A79> <1154> <7C98> <1155> <6CBE> <1156> <76CF> <1157> <65A9> <1158> <8F97> <1159> <5D2D> <115A> <5C55> <115B> <8638> <115C> <6808> <115D> <5360> <115E> <6218> <115F> <7AD9> <1160> <6E5B> <1161> <7EFD> <1162> <6A1F> <1163> <7AE0> <1164> <5F70> <1165> <6F33> <1166> <5F20> <1167> <638C> <1168> <6DA8> <1169> <6756> <116A> <4E08> <116B> <5E10> <116C> <8D26> <116D> <4ED7> <116E> <80C0> <116F> <7634> <1170> <969C> <1171> <62DB> <1172> <662D> <1173> <627E> <1174> <6CBC> <1175> <8D75> <1176> <7167> <1177> <7F69> <1178> <5146> <1179> <8087> <117A> <53EC> <117B> <906E> <117C> <6298> <117D> <54F2> <117E> <86F0> <117F> <8F99> <1180> <8005> <1181> <9517> <1182> <8517> <1183> <8FD9> <1184> <6D59> <1185> <73CD> <1186> <659F> <1187> <771F> <1188> <7504> <1189> <7827> <118A> <81FB> <118B> <8D1E> <118C> <9488> <118D> <4FA6> <118E> <6795> <118F> <75B9> <1190> <8BCA> <1191> <9707> <1192> <632F> <1193> <9547> <1194> <9635> <1195> <84B8> <1196> <6323> <1197> <7741> <1198> <5F81> <1199> <72F0> <119A> <4E89> <119B> <6014> <119C> <6574> endbfchar 100 beginbfchar <119D> <62EF> <119E> <6B63> <119F> <653F> <11A0> <5E27> <11A1> <75C7> <11A2> <90D1> <11A3> <8BC1> <11A4> <829D> <11A5> <679D> <11A6> <652F> <11A7> <5431> <11A8> <8718> <11A9> <77E5> <11AA> <80A2> <11AB> <8102> <11AC> <6C41> <11AD> <4E4B> <11AE> <7EC7> <11AF> <804C> <11B0> <76F4> <11B1> <690D> <11B2> <6B96> <11B3> <6267> <11B4> <503C> <11B5> <4F84> <11B6> <5740> <11B7> <6307> <11B8> <6B62> <11B9> <8DBE> <11BA> <53EA> <11BB> <65E8> <11BC> <7EB8> <11BD> <5FD7> <11BE> <631A> <11BF> <63B7> <11C2> <7F6E> <11C3> <5E1C> <11C4> <5CD9> <11C5> <5236> <11C6> <667A> <11C7> <79E9> <11C8> <7A1A> <11C9> <8D28> <11CA> <7099> <11CB> <75D4> <11CC> <6EDE> <11CD> <6CBB> <11CE> <7A92> <11CF> <4E2D> <11D0> <76C5> <11D1> <5FE0> <11D2> <949F> <11D3> <8877> <11D4> <7EC8> <11D5> <79CD> <11D6> <80BF> <11D7> <91CD> <11D8> <4EF2> <11D9> <4F17> <11DA> <821F> <11DB> <5468> <11DC> <5DDE> <11DD> <6D32> <11DE> <8BCC> <11DF> <7CA5> <11E0> <8F74> <11E1> <8098> <11E2> <5E1A> <11E3> <5492> <11E4> <76B1> <11E5> <5B99> <11E6> <663C> <11E7> <9AA4> <11E8> <73E0> <11E9> <682A> <11EA> <86DB> <11EB> <6731> <11EC> <732A> <11ED> <8BF8> <11EE> <8BDB> <11EF> <9010> <11F0> <7AF9> <11F1> <70DB> <11F2> <716E> <11F3> <62C4> <11F4> <77A9> <11F5> <5631> <11F6> <4E3B> <11F7> <8457> <11F8> <67F1> <11F9> <52A9> <11FA> <86C0> <11FB> <8D2E> <11FC> <94F8> <11FD> <7B51> <11FE> <4F4F> <11FF> <6CE8> <1200> <795D> <1201> <9A7B> <1202> <6293> endbfchar 100 beginbfchar <1203> <722A> <1204> <62FD> <1205> <4E13> <1206> <7816> <1207> <8F6C> <1208> <64B0> <1209> <8D5A> <120A> <7BC6> <120B> <6869> <120C> <5E84> <120D> <88C5> <120E> <5986> <120F> <649E> <1210> <58EE> <1211> <72B6> <1212> <690E> <1213> <9525> <1214> <8FFD> <1215> <8D58> <1216> <5760> <1217> <7F00> <1218> <8C06> <1219> <51C6> <121A> <6349> <121B> <62D9> <121C> <5353> <121D> <684C> <121E> <7422> <121F> <8301> <1220> <914C> <1221> <5544> <1222> <7740> <1223> <707C> <1224> <6D4A> <1225> <5179> <1226> <54A8> <1227> <8D44> <1228> <59FF> <1229> <6ECB> <122A> <6DC4> <122B> <5B5C> <122C> <7D2B> <122D> <4ED4> <122E> <7C7D> <122F> <6ED3> <1230> <5B50> <1231> <81EA> <1232> <6E0D> <1233> <5B57> <1234> <9B03> <1235> <68D5> <1236> <8E2A> <1237> <5B97> <1238> <7EFC> <1239> <603B> <123A> <7EB5> <123B> <90B9> <123C> <8D70> <123D> <594F> <123E> <63CD> <123F> <79DF> <1240> <8DB3> <1241> <5352> <1242> <65CF> <1243> <7956> <1244> <8BC5> <1245> <963B> <1246> <7EC4> <1247> <94BB> <1248> <7E82> <1249> <5634> <124A> <9189> <124B> <6700> <124C> <7F6A> <124D> <5C0A> <124E> <9075> <124F> <6628> <1250> <5DE6> <1251> <4F50> <1252> <67DE> <1253> <505A> <1254> <4F5C> <1255> <5750> <1256> <5EA7> <1257> <4E8D> <1258> <4E0C> <1259> <5140> <125A> <4E10> <125B> <5EFF> <125C> <5345> <125D> <4E15> <125E> <4E98> <125F> <4E1E> <1260> <9B32> <1261> <5B6C> <1262> <5669> <1263> <4E28> <1264> <79BA> <1265> <4E3F> <1266> <5315> endbfchar 100 beginbfchar <1267> <4E47> <1268> <592D> <1269> <723B> <126A> <536E> <126B> <6C10> <126C> <56DF> <126D> <80E4> <126E> <9997> <126F> <6BD3> <1270> <777E> <1271> <9F17> <1272> <4E36> <1273> <4E9F> <1274> <9F10> <1275> <4E5C> <1276> <4E69> <1277> <4E93> <1278> <8288> <1279> <5B5B> <127A> <556C> <127B> <560F> <127C> <4EC4> <127D> <538D> <127E> <539D> <127F> <53A3> <1280> <53A5> <1281> <53AE> <1282> <9765> <1283> <8D5D> <1284> <531A> <1285> <53F5> <1286> <5326> <1287> <532E> <1288> <533E> <1289> <8D5C> <128A> <5366> <128B> <5363> <128C> <5202> <128D> <5208> <128E> <520E> <128F> <522D> <1290> <5233> <1293> <524C> <1294> <525E> <1295> <5261> <1296> <525C> <1297> <84AF> <1298> <527D> <1299> <5282> <129A> <5281> <129B> <5290> <129C> <5293> <129D> <5182> <129E> <7F54> <129F> <4EBB> <12A0> <4EC3> <12A1> <4EC9> <12A2> <4EC2> <12A3> <4EE8> <12A4> <4EE1> <12A5> <4EEB> <12A6> <4EDE> <12A7> <4F1B> <12A8> <4EF3> <12A9> <4F22> <12AA> <4F64> <12AB> <4EF5> <12AC> <4F25> <12AD> <4F27> <12AE> <4F09> <12AF> <4F2B> <12B0> <4F5E> <12B1> <4F67> <12B2> <6538> <12B3> <4F5A> <12B4> <4F5D> <12B5> <4F5F> <12B6> <4F57> <12B7> <4F32> <12B8> <4F3D> <12B9> <4F76> <12BA> <4F74> <12BB> <4F91> <12BC> <4F89> <12BD> <4F83> <12BE> <4F8F> <12BF> <4F7E> <12C0> <4F7B> <12C1> <4FAA> <12C2> <4F7C> <12C3> <4FAC> <12C4> <4F94> <12C5> <4FE6> <12C6> <4FE8> <12C7> <4FEA> <12C8> <4FC5> <12C9> <4FDA> <12CA> <4FE3> <12CB> <4FDC> <12CC> <4FD1> endbfchar 100 beginbfchar <12CD> <4FDF> <12CE> <4FF8> <12CF> <5029> <12D0> <504C> <12D1> <4FF3> <12D2> <502C> <12D3> <500F> <12D4> <502E> <12D5> <502D> <12D6> <4FFE> <12D7> <501C> <12D8> <500C> <12D9> <5025> <12DA> <5028> <12DB> <507E> <12DC> <5043> <12DD> <5055> <12DE> <5048> <12DF> <504E> <12E0> <506C> <12E1> <507B> <12E2> <50A5> <12E3> <50A7> <12E4> <50A9> <12E5> <50BA> <12E6> <50D6> <12E7> <5106> <12E8> <50ED> <12E9> <50EC> <12EA> <50E6> <12EB> <50EE> <12EC> <5107> <12ED> <510B> <12EE> <4EDD> <12EF> <6C3D> <12F0> <4F58> <12F1> <4F65> <12F2> <4FCE> <12F3> <9FA0> <12F4> <6C46> <12F5> <7C74> <12F6> <516E> <12F7> <5DFD> <12F8> <9EC9> <12F9> <9998> <12FA> <5181> <12FB> <5914> <12FC> <52F9> <12FD> <530D> <12FE> <8A07> <12FF> <5310> <1300> <51EB> <1301> <5919> <1302> <5155> <1303> <4EA0> <1304> <5156> <1305> <4EB3> <1306> <886E> <1307> <88A4> <1308> <4EB5> <1309> <8114> <130A> <88D2> <130B> <7980> <130C> <5B34> <130D> <8803> <130E> <7FB8> <130F> <51AB> <1310> <51B1> <1311> <51BD> <1312> <51BC> <1313> <51C7> <1314> <5196> <1315> <51A2> <1316> <51A5> <1317> <8BA0> <131A> <8BAA> <131D> <8BB7> <1320> <8BCB> <1321> <8BCF> <1322> <8BCE> <1326> <8BD6> <1329> <8BDC> <132C> <8BE4> <132F> <8BEE> <1330> <8BF0> <1331> <8BF3> <1332> <8BF6> <1333> <8BF9> <1334> <8BFC> <1337> <8C02> <1338> <8C04> <1339> <8C07> <133A> <8C0C> <133B> <8C0F> <1341> <8C19> <1342> <8C1B> <1343> <8C18> <1344> <8C1D> <1348> <8C25> <1349> <8C27> endbfchar 100 beginbfchar <1352> <5369> <1353> <537A> <1354> <961D> <1355> <9622> <1356> <9621> <1357> <9631> <1358> <962A> <1359> <963D> <135A> <963C> <135B> <9642> <135C> <9649> <135D> <9654> <135E> <965F> <135F> <9667> <1360> <966C> <1361> <9672> <1362> <9674> <1363> <9688> <1364> <968D> <1365> <9697> <1366> <96B0> <1367> <9097> <1368> <909B> <1369> <909D> <136A> <9099> <136B> <90AC> <136C> <90A1> <136D> <90B4> <136E> <90B3> <136F> <90B6> <1370> <90BA> <1371> <90B8> <1372> <90B0> <1373> <90CF> <1374> <90C5> <1375> <90BE> <1376> <90D0> <1377> <90C4> <1378> <90C7> <1379> <90D3> <137A> <90E6> <137B> <90E2> <137C> <90DC> <137D> <90D7> <137E> <90DB> <137F> <90EB> <1380> <90EF> <1381> <90FE> <1382> <9104> <1383> <9122> <1384> <911E> <1385> <9123> <1386> <9131> <1387> <912F> <1388> <9139> <1389> <9143> <138A> <9146> <138B> <520D> <138C> <5942> <138D> <52A2> <1390> <52BE> <1391> <54FF> <1392> <52D0> <1393> <52D6> <1394> <52F0> <1395> <53DF> <1396> <71EE> <1397> <77CD> <1398> <5EF4> <1399> <51F5> <139A> <51FC> <139B> <9B2F> <139C> <53B6> <139D> <5F01> <139E> <755A> <139F> <5DEF> <13A0> <574C> <13A1> <57A9> <13A2> <57A1> <13A3> <587E> <13A4> <58BC> <13A5> <58C5> <13A6> <58D1> <13A7> <5729> <13A8> <572C> <13A9> <572A> <13AA> <5733> <13AB> <5739> <13AE> <575C> <13AF> <573B> <13B0> <5742> <13B1> <5769> <13B2> <5785> <13B3> <576B> <13B4> <5786> <13B5> <577C> <13B6> <577B> <13B7> <5768> <13B8> <576D> <13B9> <5776> endbfchar 100 beginbfchar <13BA> <5773> <13BB> <57AD> <13BC> <57A4> <13BD> <578C> <13BE> <57B2> <13BF> <57CF> <13C0> <57A7> <13C1> <57B4> <13C2> <5793> <13C3> <57A0> <13C4> <57D5> <13C5> <57D8> <13C6> <57DA> <13C7> <57D9> <13C8> <57D2> <13C9> <57B8> <13CA> <57F4> <13CB> <57EF> <13CC> <57F8> <13CD> <57E4> <13CE> <57DD> <13CF> <580B> <13D0> <580D> <13D1> <57FD> <13D2> <57ED> <13D3> <5800> <13D4> <581E> <13D5> <5819> <13D6> <5844> <13D7> <5820> <13D8> <5865> <13D9> <586C> <13DA> <5881> <13DB> <5889> <13DC> <589A> <13DD> <5880> <13DE> <99A8> <13DF> <9F19> <13E0> <61FF> <13E1> <8279> <13E2> <827D> <13E3> <827F> <13E4> <828F> <13E5> <828A> <13E6> <82A8> <13E7> <8284> <13E8> <828E> <13E9> <8291> <13EA> <8297> <13EB> <8299> <13EC> <82AB> <13ED> <82B8> <13EE> <82BE> <13EF> <82B0> <13F0> <82C8> <13F1> <82CA> <13F2> <82E3> <13F3> <8298> <13F4> <82B7> <13F5> <82AE> <13F8> <82C1> <13F9> <82A9> <13FA> <82B4> <13FB> <82A1> <13FC> <82AA> <13FD> <829F> <13FE> <82C4> <13FF> <82CE> <1400> <82A4> <1401> <82E1> <1402> <8309> <1403> <82F7> <1404> <82E4> <1405> <830F> <1406> <8307> <1407> <82DC> <1408> <82F4> <1409> <82D2> <140A> <82D8> <140B> <830C> <140C> <82FB> <140D> <82D3> <140E> <8311> <140F> <831A> <1410> <8306> <1413> <82E0> <1414> <82D5> <1415> <831C> <1416> <8351> <1419> <8308> <141A> <8392> <141B> <833C> <141C> <8334> <141D> <8331> <141E> <839B> <141F> <835E> <1420> <832F> <1421> <834F> <1422> <8347> <1423> <8343> endbfchar 100 beginbfchar <1424> <835F> <1425> <8340> <1426> <8317> <1427> <8360> <1428> <832D> <1429> <833A> <142A> <8333> <142B> <8366> <142C> <8365> <142D> <8368> <142E> <831B> <142F> <8369> <1430> <836C> <1431> <836A> <1434> <83B0> <1435> <8378> <1438> <83A0> <1439> <83AA> <143A> <8393> <143B> <839C> <143C> <8385> <143D> <837C> <143E> <83B6> <143F> <83A9> <1440> <837D> <1441> <83B8> <1442> <837B> <1443> <8398> <1444> <839E> <1445> <83A8> <1446> <83BA> <1447> <83BC> <1448> <83C1> <1449> <8401> <144A> <83E5> <144B> <83D8> <144C> <5807> <144D> <8418> <144E> <840B> <144F> <83DD> <1450> <83FD> <1451> <83D6> <1452> <841C> <1453> <8438> <1454> <8411> <1455> <8406> <1456> <83D4> <1457> <83DF> <1458> <840F> <1459> <8403> <145C> <83EA> <145D> <83C5> <145E> <83C0> <145F> <8426> <1460> <83F0> <1461> <83E1> <1462> <845C> <1463> <8451> <1464> <845A> <1465> <8459> <1466> <8473> <1469> <847A> <146A> <8489> <146B> <8478> <146C> <843C> <146D> <8446> <146E> <8469> <146F> <8476> <1470> <848C> <1471> <848E> <1472> <8431> <1473> <846D> <1474> <84C1> <1475> <84CD> <1476> <84D0> <1477> <84E6> <1478> <84BD> <1479> <84D3> <147A> <84CA> <147B> <84BF> <147C> <84BA> <147D> <84E0> <147E> <84A1> <147F> <84B9> <1480> <84B4> <1481> <8497> <1482> <84E5> <1483> <84E3> <1484> <850C> <1485> <750D> <1486> <8538> <1487> <84F0> <1488> <8539> <1489> <851F> <148A> <853A> <148B> <8556> <148C> <853B> <148D> <84FF> <148E> <84FC> <148F> <8559> endbfchar 100 beginbfchar <1490> <8548> <1491> <8568> <1492> <8564> <1493> <855E> <1494> <857A> <1495> <77A2> <1496> <8543> <1497> <8572> <1498> <857B> <1499> <85A4> <149A> <85A8> <149B> <8587> <149C> <858F> <149D> <8579> <149E> <85AE> <149F> <859C> <14A0> <8585> <14A1> <85B9> <14A2> <85B7> <14A3> <85B0> <14A4> <85D3> <14A5> <85C1> <14A6> <85DC> <14A7> <85FF> <14A8> <8627> <14A9> <8605> <14AA> <8629> <14AB> <8616> <14AC> <863C> <14AD> <5EFE> <14AE> <5F08> <14AF> <593C> <14B0> <5941> <14B1> <8037> <14B2> <5955> <14B3> <595A> <14B4> <5958> <14B5> <530F> <14B6> <5C22> <14B7> <5C25> <14B8> <5C2C> <14B9> <5C34> <14BA> <624C> <14BB> <626A> <14BC> <629F> <14BD> <62BB> <14BE> <62CA> <14BF> <62DA> <14C0> <62D7> <14C1> <62EE> <14C2> <6322> <14C3> <62F6> <14C4> <6339> <14C5> <634B> <14C6> <6343> <14C7> <63AD> <14C8> <63F6> <14C9> <6371> <14CA> <637A> <14CB> <638E> <14CC> <63B4> <14CD> <636D> <14CE> <63AC> <14CF> <638A> <14D0> <6369> <14D1> <63AE> <14D2> <63BC> <14D3> <63F2> <14D4> <63F8> <14D5> <63E0> <14D6> <63FF> <14D7> <63C4> <14D8> <63DE> <14D9> <63CE> <14DA> <6452> <14DB> <63C6> <14DC> <63BE> <14DD> <6445> <14DE> <6441> <14DF> <640B> <14E0> <641B> <14E1> <6420> <14E2> <640C> <14E3> <6426> <14E4> <6421> <14E5> <645E> <14E6> <6484> <14E7> <646D> <14E8> <6496> <14E9> <647A> <14EC> <6499> <14ED> <64BA> <14EE> <64C0> <14EF> <64D0> <14F0> <64D7> <14F1> <64E4> <14F2> <64E2> <14F3> <6509> <14F4> <6525> <14F5> <652E> endbfchar 100 beginbfchar <14F6> <5F0B> <14F7> <5FD2> <14F8> <7519> <14F9> <5F11> <14FA> <535F> <14FB> <53F1> <14FC> <53FD> <14FD> <53E9> <14FE> <53E8> <14FF> <53FB> <1500> <5412> <1501> <5416> <1502> <5406> <1503> <544B> <1507> <5456> <1508> <5443> <1509> <5421> <150A> <5457> <150B> <5459> <150C> <5423> <150D> <5432> <150E> <5482> <150F> <5494> <1510> <5477> <1511> <5471> <1512> <5464> <1515> <5484> <1516> <5476> <1517> <5466> <1518> <549D> <1519> <54D0> <151A> <54AD> <151B> <54C2> <151C> <54B4> <151D> <54D2> <151E> <54A7> <151F> <54A6> <1522> <5472> <1523> <54A3> <1524> <54D5> <1525> <54BB> <1526> <54BF> <1527> <54CC> <152A> <54DC> <152D> <54A4> <152E> <54DD> <152F> <54CF> <1530> <54DE> <1531> <551B> <1532> <54E7> <1533> <5520> <1534> <54FD> <1535> <5514> <1536> <54F3> <1539> <550F> <153A> <5511> <153B> <5527> <153C> <552A> <153D> <5567> <153E> <558F> <153F> <55B5> <1540> <5549> <1541> <556D> <1542> <5541> <1543> <5555> <1544> <553F> <1545> <5550> <1546> <553C> <1547> <5537> <1548> <5556> <154C> <5533> <154D> <5530> <154E> <555C> <154F> <558B> <1550> <55D2> <1551> <5583> <1552> <55B1> <1553> <55B9> <1554> <5588> <1555> <5581> <1556> <559F> <1557> <557E> <1558> <55D6> <1559> <5591> <155A> <557B> <155B> <55DF> <155E> <5594> <155F> <5599> <1560> <55EA> <1561> <55F7> <1562> <55C9> <1563> <561F> <1564> <55D1> <1567> <55D4> <1568> <55E6> <1569> <55DD> <156A> <55C4> <156B> <55EF> <156C> <55E5> <1571> <55E8> endbfchar 100 beginbfchar <1572> <55F5> <1573> <55E4> <1574> <8F94> <1575> <561E> <1576> <5608> <1577> <560C> <1578> <5601> <1579> <5624> <157A> <5623> <157B> <55FE> <157C> <5600> <157D> <5627> <157E> <562D> <157F> <5658> <1580> <5639> <1581> <5657> <1582> <562C> <1583> <564D> <1584> <5662> <1585> <5659> <1586> <565C> <1587> <564C> <1588> <5654> <1589> <5686> <158A> <5664> <158B> <5671> <158C> <566B> <158F> <5685> <1590> <5693> <1591> <56AF> <1592> <56D4> <1593> <56D7> <1594> <56DD> <1595> <56E1> <1596> <56F5> <1597> <56EB> <1598> <56F9> <1599> <56FF> <159A> <5704> <159B> <570A> <159C> <5709> <159D> <571C> <159E> <5E0F> <159F> <5E19> <15A0> <5E14> <15A1> <5E11> <15A2> <5E31> <15A5> <5E37> <15A6> <5E44> <15A7> <5E54> <15A8> <5E5B> <15A9> <5E5E> <15AA> <5E61> <15AB> <5C8C> <15AC> <5C7A> <15AD> <5C8D> <15AE> <5C90> <15AF> <5C96> <15B0> <5C88> <15B3> <5C91> <15B4> <5C9A> <15B5> <5C9C> <15B6> <5CB5> <15B7> <5CA2> <15B8> <5CBD> <15B9> <5CAC> <15BA> <5CAB> <15BB> <5CB1> <15BC> <5CA3> <15BD> <5CC1> <15BE> <5CB7> <15BF> <5CC4> <15C0> <5CD2> <15C1> <5CE4> <15C2> <5CCB> <15C3> <5CE5> <15C6> <5D27> <15C7> <5D26> <15C8> <5D2E> <15C9> <5D24> <15CA> <5D1E> <15CB> <5D06> <15CC> <5D1B> <15CD> <5D58> <15CE> <5D3E> <15CF> <5D34> <15D0> <5D3D> <15D1> <5D6C> <15D2> <5D5B> <15D3> <5D6F> <15D4> <5D5D> <15D5> <5D6B> <15D6> <5D4B> <15D7> <5D4A> <15D8> <5D69> <15D9> <5D74> <15DA> <5D82> <15DB> <5D99> <15DC> <5D9D> <15DD> <8C73> endbfchar 100 beginbfchar <15DE> <5DB7> <15DF> <5DC5> <15E0> <5F73> <15E1> <5F77> <15E2> <5F82> <15E3> <5F87> <15E4> <5F89> <15E5> <5F8C> <15E6> <5F95> <15E7> <5F99> <15E8> <5F9C> <15E9> <5FA8> <15EA> <5FAD> <15EB> <5FB5> <15EC> <5FBC> <15ED> <8862> <15EE> <5F61> <15EF> <72AD> <15F0> <72B0> <15F1> <72B4> <15F4> <72C3> <15F5> <72C1> <15F6> <72CE> <15F7> <72CD> <15F8> <72D2> <15F9> <72E8> <15FA> <72EF> <15FB> <72E9> <15FC> <72F2> <15FD> <72F4> <15FE> <72F7> <15FF> <7301> <1600> <72F3> <1601> <7303> <1604> <7317> <1605> <7313> <1606> <7321> <1607> <730A> <1608> <731E> <1609> <731D> <160A> <7315> <160B> <7322> <160C> <7339> <160D> <7325> <160E> <732C> <160F> <7338> <1610> <7331> <1611> <7350> <1612> <734D> <1613> <7357> <1614> <7360> <1615> <736C> <1616> <736F> <1617> <737E> <1618> <821B> <1619> <5925> <161A> <98E7> <161B> <5924> <161C> <5902> <161D> <9963> <1624> <9974> <1625> <9977> <1626> <997D> <1627> <9980> <1628> <9984> <1629> <9987> <162A> <998A> <162B> <998D> <1631> <5E80> <1632> <5E91> <1633> <5E8B> <1634> <5E96> <1635> <5EA5> <1636> <5EA0> <1637> <5EB9> <1638> <5EB5> <1639> <5EBE> <163A> <5EB3> <163B> <8D53> <163C> <5ED2> <163D> <5ED1> <163E> <5EDB> <163F> <5EE8> <1640> <5EEA> <1641> <81BA> <1642> <5FC4> <1643> <5FC9> <1644> <5FD6> <1645> <5FCF> <1646> <6003> <1647> <5FEE> <1648> <6004> <1649> <5FE1> <164A> <5FE4> <164B> <5FFE> <164E> <5FEA> <164F> <5FED> <1650> <5FF8> <1651> <6019> <1652> <6035> endbfchar 100 beginbfchar <1653> <6026> <1654> <601B> <1655> <600F> <1656> <600D> <1657> <6029> <1658> <602B> <1659> <600A> <165A> <603F> <165B> <6021> <165E> <607B> <165F> <607A> <1660> <6042> <1661> <606A> <1662> <607D> <1663> <6096> <1664> <609A> <1665> <60AD> <1666> <609D> <1667> <6083> <1668> <6092> <1669> <608C> <166A> <609B> <166B> <60EC> <166C> <60BB> <166D> <60B1> <166E> <60DD> <166F> <60D8> <1670> <60C6> <1671> <60DA> <1672> <60B4> <1673> <6120> <1674> <6126> <1675> <6115> <1676> <6123> <1677> <60F4> <1678> <6100> <1679> <610E> <167A> <612B> <167B> <614A> <167C> <6175> <167D> <61AC> <167E> <6194> <167F> <61A7> <1680> <61B7> <1681> <61D4> <1682> <61F5> <1683> <5FDD> <1684> <96B3> <1685> <95E9> <1686> <95EB> <1687> <95F1> <1688> <95F3> <168B> <95FC> <168C> <95FE> <168F> <9606> <1690> <9608> <1695> <960F> <1696> <9612> <169C> <4E2C> <169D> <723F> <169E> <6215> <169F> <6C35> <16A0> <6C54> <16A1> <6C5C> <16A2> <6C4A> <16A3> <6CA3> <16A4> <6C85> <16A5> <6C90> <16A6> <6C94> <16A7> <6C8C> <16AA> <6C74> <16AB> <6C76> <16AC> <6C86> <16AD> <6CA9> <16AE> <6CD0> <16AF> <6CD4> <16B0> <6CAD> <16B3> <6CF1> <16B4> <6CD7> <16B5> <6CB2> <16B6> <6CE0> <16B7> <6CD6> <16B8> <6CFA> <16B9> <6CEB> <16BA> <6CEE> <16BB> <6CB1> <16BC> <6CD3> <16BD> <6CEF> <16BE> <6CFE> <16BF> <6D39> <16C0> <6D27> <16C1> <6D0C> <16C2> <6D43> <16C3> <6D48> <16C4> <6D07> <16C5> <6D04> <16C6> <6D19> <16C7> <6D0E> <16C8> <6D2B> <16C9> <6D4D> endbfchar 100 beginbfchar <16CA> <6D2E> <16CB> <6D35> <16CC> <6D1A> <16CD> <6D4F> <16CE> <6D52> <16CF> <6D54> <16D0> <6D33> <16D1> <6D91> <16D2> <6D6F> <16D3> <6D9E> <16D4> <6DA0> <16D5> <6D5E> <16D8> <6D5C> <16D9> <6D60> <16DA> <6D7C> <16DB> <6D63> <16DC> <6E1A> <16DD> <6DC7> <16DE> <6DC5> <16DF> <6DDE> <16E0> <6E0E> <16E1> <6DBF> <16E2> <6DE0> <16E3> <6E11> <16E4> <6DE6> <16E5> <6DDD> <16E6> <6DD9> <16E7> <6E16> <16E8> <6DAB> <16E9> <6E0C> <16EA> <6DAE> <16EB> <6E2B> <16EC> <6E6E> <16ED> <6E4E> <16EE> <6E6B> <16EF> <6EB2> <16F0> <6E5F> <16F1> <6E86> <16F4> <6E32> <16F5> <6E25> <16F6> <6E44> <16F7> <6EDF> <16F8> <6EB1> <16F9> <6E98> <16FA> <6EE0> <16FB> <6F2D> <16FC> <6EE2> <16FD> <6EA5> <16FE> <6EA7> <16FF> <6EBD> <1700> <6EBB> <1701> <6EB7> <1702> <6ED7> <1703> <6EB4> <1704> <6ECF> <1705> <6E8F> <1706> <6EC2> <1707> <6E9F> <1708> <6F62> <170B> <6F24> <170C> <6F15> <170D> <6EF9> <170E> <6F2F> <170F> <6F36> <1710> <6F4B> <1711> <6F74> <1712> <6F2A> <1713> <6F09> <1714> <6F29> <1715> <6F89> <1716> <6F8D> <1717> <6F8C> <1718> <6F78> <1719> <6F72> <171A> <6F7C> <171B> <6F7A> <171C> <6FD1> <171D> <6FC9> <171E> <6FA7> <171F> <6FB9> <1720> <6FB6> <1721> <6FC2> <1722> <6FE1> <1723> <6FEE> <1724> <6FDE> <1725> <6FE0> <1726> <6FEF> <1727> <701A> <1728> <7023> <1729> <701B> <172A> <7039> <172B> <7035> <172C> <704F> <172D> <705E> <172E> <5B80> <172F> <5B84> <1730> <5B95> <1731> <5B93> <1732> <5BA5> <1733> <5BB8> endbfchar 100 beginbfchar <1734> <752F> <1735> <9A9E> <1736> <6434> <1737> <5BE4> <1738> <5BEE> <1739> <8930> <173A> <5BF0> <173B> <8E47> <173C> <8B07> <173D> <8FB6> <173E> <8FD3> <173F> <8FD5> <1740> <8FE5> <1741> <8FEE> <1742> <8FE4> <1743> <8FE9> <1744> <8FE6> <1745> <8FF3> <1746> <8FE8> <1747> <9005> <1748> <9004> <1749> <900B> <174A> <9026> <174B> <9011> <174C> <900D> <174D> <9016> <174E> <9021> <1751> <902D> <1752> <902F> <1753> <9044> <1756> <9050> <1757> <9068> <1758> <9058> <1759> <9062> <175A> <905B> <175B> <66B9> <175C> <9074> <175D> <907D> <175E> <9082> <175F> <9088> <1760> <9083> <1761> <908B> <1762> <5F50> <1763> <5F57> <1764> <5F56> <1765> <5F58> <1766> <5C3B> <1767> <54AB> <1768> <5C50> <1769> <5C59> <176A> <5B71> <176B> <5C63> <176C> <5C66> <176D> <7FBC> <176E> <5F2A> <176F> <5F29> <1770> <5F2D> <1771> <8274> <1772> <5F3C> <1773> <9B3B> <1774> <5C6E> <1775> <5981> <1776> <5983> <1777> <598D> <177A> <59A3> <177B> <5997> <177C> <59CA> <177D> <59AB> <177E> <599E> <177F> <59A4> <1780> <59D2> <1781> <59B2> <1782> <59AF> <1783> <59D7> <1784> <59BE> <1787> <59DD> <1788> <5A08> <1789> <59E3> <178A> <59D8> <178B> <59F9> <178C> <5A0C> <178D> <5A09> <178E> <5A32> <178F> <5A34> <1790> <5A11> <1791> <5A23> <1792> <5A13> <1793> <5A40> <1794> <5A67> <1795> <5A4A> <1796> <5A55> <1797> <5A3C> <1798> <5A62> <1799> <5A75> <179A> <80EC> <179B> <5AAA> <179C> <5A9B> <179D> <5A77> <179E> <5A7A> <179F> <5ABE> endbfchar 100 beginbfchar <17A0> <5AEB> <17A1> <5AB2> <17A2> <5AD2> <17A3> <5AD4> <17A4> <5AB8> <17A5> <5AE0> <17A6> <5AE3> <17A7> <5AF1> <17A8> <5AD6> <17A9> <5AE6> <17AA> <5AD8> <17AB> <5ADC> <17AC> <5B09> <17AD> <5B17> <17AE> <5B16> <17AF> <5B32> <17B0> <5B37> <17B1> <5B40> <17B2> <5C15> <17B3> <5C1C> <17B4> <5B5A> <17B5> <5B65> <17B6> <5B73> <17B7> <5B51> <17B8> <5B53> <17B9> <5B62> <17BA> <9A75> <17BD> <9A7A> <17BE> <9A7F> <17BF> <9A7D> <17C2> <9A85> <17C3> <9A88> <17C4> <9A8A> <17C5> <9A90> <17C8> <9A96> <17C9> <9A98> <17D1> <9AA5> <17D2> <9AA7> <17D3> <7E9F> <17D4> <7EA1> <17D5> <7EA3> <17D6> <7EA5> <17D9> <7EAD> <17DA> <7EB0> <17DB> <7EBE> <17DF> <7EC9> <17E2> <7ED0> <17E3> <7ED4> <17E4> <7ED7> <17E5> <7EDB> <17E8> <7EE8> <17E9> <7EEB> <17EE> <7F0D> <17EF> <7EF6> <17F2> <7EFE> <17FA> <7F0F> <17FD> <7F17> <17FE> <7F19> <17FF> <7F1C> <1800> <7F1B> <1801> <7F1F> <1812> <7F35> <1813> <5E7A> <1814> <757F> <1815> <5DDB> <1816> <753E> <1817> <9095> <1818> <738E> <1819> <7391> <181A> <73AE> <181B> <73A2> <181C> <739F> <181D> <73CF> <181E> <73C2> <181F> <73D1> <1820> <73B7> <1821> <73B3> <1822> <73C0> <1823> <73C9> <1824> <73C8> <1825> <73E5> <1826> <73D9> <1827> <987C> <1828> <740A> <1829> <73E9> <182A> <73E7> <182B> <73DE> <182C> <73BA> <182D> <73F2> <182E> <740F> <182F> <742A> <1830> <745B> <1831> <7426> <1832> <7425> <1833> <7428> <1834> <7430> <1835> <742E> <1836> <742C> <1837> <741B> <1838> <741A> endbfchar 100 beginbfchar <1839> <7441> <183A> <745C> <183B> <7457> <183C> <7455> <183D> <7459> <183E> <7477> <183F> <746D> <1840> <747E> <1841> <749C> <1842> <748E> <1845> <7487> <1846> <748B> <1847> <749E> <184A> <7490> <184B> <74A7> <184C> <74D2> <184D> <74BA> <1851> <674C> <1852> <6753> <1853> <675E> <1854> <6748> <1855> <6769> <1856> <67A5> <1857> <6787> <1858> <676A> <1859> <6773> <185A> <6798> <185B> <67A7> <185C> <6775> <185D> <67A8> <185E> <679E> <185F> <67AD> <1860> <678B> <1861> <6777> <1862> <677C> <1863> <67F0> <1864> <6809> <1865> <67D8> <1866> <680A> <1867> <67E9> <1868> <67B0> <1869> <680C> <186A> <67D9> <186B> <67B5> <186C> <67DA> <186D> <67B3> <186E> <67DD> <186F> <6800> <1870> <67C3> <1871> <67B8> <1872> <67E2> <1873> <680E> <1874> <67C1> <1875> <67FD> <187A> <684E> <187B> <6862> <187C> <6844> <187D> <6864> <187E> <6883> <187F> <681D> <1880> <6855> <1881> <6866> <1882> <6841> <1883> <6867> <1884> <6840> <1885> <683E> <1886> <684A> <1887> <6849> <1888> <6829> <1889> <68B5> <188A> <688F> <188B> <6874> <188C> <6877> <188D> <6893> <188E> <686B> <188F> <68C2> <1890> <696E> <1891> <68FC> <1894> <68F9> <1895> <6924> <1896> <68F0> <1897> <690B> <1898> <6901> <1899> <6957> <189A> <68E3> <189B> <6910> <189C> <6971> <189D> <6939> <189E> <6960> <189F> <6942> <18A0> <695D> <18A1> <6984> <18A2> <696B> <18A3> <6980> <18A4> <6998> <18A5> <6978> <18A6> <6934> <18A7> <69CC> <18AA> <69CE> <18AB> <6989> endbfchar 100 beginbfchar <18AC> <6966> <18AD> <6963> <18AE> <6979> <18AF> <699B> <18B0> <69A7> <18B1> <69BB> <18B2> <69AB> <18B3> <69AD> <18B4> <69D4> <18B5> <69B1> <18B6> <69C1> <18B7> <69CA> <18B8> <69DF> <18B9> <6995> <18BA> <69E0> <18BB> <698D> <18BC> <69FF> <18BD> <6A2F> <18BE> <69ED> <18C1> <6A65> <18C2> <69F2> <18C3> <6A44> <18C4> <6A3E> <18C5> <6AA0> <18C6> <6A50> <18C7> <6A5B> <18C8> <6A35> <18C9> <6A8E> <18CA> <6A79> <18CB> <6A3D> <18CC> <6A28> <18CD> <6A58> <18CE> <6A7C> <18CF> <6A91> <18D0> <6A90> <18D1> <6AA9> <18D2> <6A97> <18D3> <6AAB> <18D4> <7337> <18D5> <7352> <18D8> <6B87> <18D9> <6B84> <18DC> <6B8D> <18DF> <6BA1> <18E0> <6BAA> <18E1> <8F6B> <18E2> <8F6D> <18E8> <8F78> <18E9> <8F77> <18EC> <8F7C> <18ED> <8F7E> <18F0> <8F84> <18F1> <8F87> <18F2> <8F8B> <18F6> <8F98> <18F7> <8F9A> <18F8> <8ECE> <18F9> <620B> <18FA> <6217> <18FB> <621B> <18FC> <621F> <18FD> <6222> <18FE> <6221> <18FF> <6225> <1900> <6224> <1901> <622C> <1902> <81E7> <1903> <74EF> <1904> <74F4> <1905> <74FF> <1906> <750F> <1907> <7511> <1908> <7513> <1909> <6534> <190D> <660A> <190E> <6619> <190F> <6772> <1910> <6603> <1911> <6615> <1912> <6600> <1913> <7085> <1914> <66F7> <1915> <661D> <1916> <6634> <1917> <6631> <1918> <6636> <1919> <6635> <191A> <8006> <191B> <665F> <191C> <6654> <191D> <6641> <191E> <664F> <191F> <6656> <1920> <6661> <1921> <6657> <1922> <6677> <1923> <6684> <1924> <668C> <1925> <66A7> <1926> <669D> endbfchar 100 beginbfchar <1927> <66BE> <192A> <66E6> <192B> <66E9> <192E> <8D36> <192F> <8D3B> <1930> <8D3D> <1931> <8D40> <1936> <8D47> <1937> <8D4D> <1938> <8D55> <1939> <8D59> <193A> <89C7> <1942> <726E> <1943> <729F> <1944> <725D> <1945> <7266> <1946> <726F> <1949> <7284> <194A> <728B> <194B> <728D> <194C> <728F> <194D> <7292> <194E> <6308> <194F> <6332> <1950> <63B0> <1951> <643F> <1952> <64D8> <1953> <8004> <1954> <6BEA> <1955> <6BF3> <1956> <6BFD> <1957> <6BF5> <1958> <6BF9> <1959> <6C05> <195A> <6C07> <195B> <6C06> <195C> <6C0D> <195D> <6C15> <1961> <6C21> <1962> <6C29> <1963> <6C24> <1964> <6C2A> <1965> <6C32> <1966> <6535> <1967> <6555> <1968> <656B> <1969> <724D> <196A> <7252> <196B> <7256> <196C> <7230> <196D> <8662> <196E> <5216> <196F> <809F> <1970> <809C> <1971> <8093> <1972> <80BC> <1973> <670A> <1974> <80BD> <1975> <80B1> <1976> <80AB> <1977> <80AD> <1978> <80B4> <1979> <80B7> <197E> <80DB> <197F> <80C2> <1980> <80C4> <1981> <80D9> <1982> <80CD> <1983> <80D7> <1984> <6710> <1985> <80DD> <1986> <80EB> <1987> <80F1> <1988> <80F4> <1989> <80ED> <198C> <80F2> <198D> <80FC> <198E> <6715> <198F> <8112> <1990> <8C5A> <1991> <8136> <1992> <811E> <1993> <812C> <1994> <8118> <1995> <8132> <1996> <8148> <1997> <814C> <1998> <8153> <1999> <8174> <199C> <8171> <199D> <8160> <199E> <8169> <19A1> <816D> <19A2> <8167> <19A3> <584D> <19A4> <5AB5> <19A5> <8188> <19A6> <8182> <19A7> <8191> <19A8> <6ED5> endbfchar 100 beginbfchar <19A9> <81A3> <19AA> <81AA> <19AB> <81CC> <19AC> <6726> <19AD> <81CA> <19AE> <81BB> <19AF> <81C1> <19B0> <81A6> <19B1> <6B24> <19B2> <6B37> <19B3> <6B39> <19B4> <6B43> <19B5> <6B46> <19B6> <6B59> <19BA> <98D5> <19BD> <6BB3> <19BE> <5F40> <19BF> <6BC2> <19C0> <89F3> <19C1> <6590> <19C2> <9F51> <19C3> <6593> <19C4> <65BC> <19C5> <65C6> <19C6> <65C4> <19C7> <65C3> <19C8> <65CC> <19C9> <65CE> <19CA> <65D2> <19CB> <65D6> <19CC> <7080> <19CD> <709C> <19CE> <7096> <19CF> <709D> <19D0> <70BB> <19D1> <70C0> <19D2> <70B7> <19D3> <70AB> <19D4> <70B1> <19D5> <70E8> <19D6> <70CA> <19D7> <7110> <19D8> <7113> <19D9> <7116> <19DA> <712F> <19DB> <7131> <19DC> <7173> <19DD> <715C> <19DE> <7168> <19DF> <7145> <19E0> <7172> <19E1> <714A> <19E2> <7178> <19E3> <717A> <19E4> <7198> <19E5> <71B3> <19E6> <71B5> <19E7> <71A8> <19E8> <71A0> <19E9> <71E0> <19EA> <71D4> <19EB> <71E7> <19EC> <71F9> <19ED> <721D> <19EE> <7228> <19EF> <706C> <19F0> <7118> <19F1> <7166> <19F2> <71B9> <19F3> <623E> <19F4> <623D> <19F5> <6243> <19F8> <793B> <19F9> <7940> <19FA> <7946> <19FB> <7949> <19FE> <7953> <19FF> <795A> <1A00> <7962> <1A01> <7957> <1A02> <7960> <1A03> <796F> <1A04> <7967> <1A05> <797A> <1A06> <7985> <1A07> <798A> <1A08> <799A> <1A09> <79A7> <1A0A> <79B3> <1A0B> <5FD1> <1A0C> <5FD0> <1A0D> <603C> <1A0E> <605D> <1A0F> <605A> <1A10> <6067> <1A11> <6041> <1A12> <6059> <1A13> <6063> <1A14> <60AB> <1A15> <6106> endbfchar 100 beginbfchar <1A16> <610D> <1A17> <615D> <1A18> <61A9> <1A19> <619D> <1A1A> <61CB> <1A1B> <61D1> <1A1C> <6206> <1A1D> <8080> <1A1E> <807F> <1A1F> <6C93> <1A20> <6CF6> <1A21> <6DFC> <1A22> <77F6> <1A23> <77F8> <1A24> <7800> <1A25> <7809> <1A28> <7811> <1A29> <65AB> <1A2A> <782D> <1A30> <781F> <1A31> <783C> <1A32> <7825> <1A33> <782C> <1A34> <7823> <1A35> <7829> <1A36> <784E> <1A37> <786D> <1A3A> <7826> <1A3B> <7850> <1A3C> <7847> <1A3D> <784C> <1A3E> <786A> <1A3F> <789B> <1A40> <7893> <1A41> <789A> <1A42> <7887> <1A43> <789C> <1A44> <78A1> <1A45> <78A3> <1A46> <78B2> <1A47> <78B9> <1A48> <78A5> <1A49> <78D4> <1A4A> <78D9> <1A4B> <78C9> <1A4C> <78EC> <1A4D> <78F2> <1A4E> <7905> <1A4F> <78F4> <1A50> <7913> <1A51> <7924> <1A52> <791E> <1A53> <7934> <1A54> <9F9B> <1A55> <9EF9> <1A58> <76F1> <1A59> <7704> <1A5A> <770D> <1A5B> <76F9> <1A5E> <771A> <1A5F> <7722> <1A60> <7719> <1A61> <772D> <1A62> <7726> <1A63> <7735> <1A64> <7738> <1A67> <7747> <1A68> <7743> <1A69> <775A> <1A6A> <7768> <1A6B> <7762> <1A6C> <7765> <1A6D> <777F> <1A6E> <778D> <1A6F> <777D> <1A70> <7780> <1A71> <778C> <1A72> <7791> <1A75> <77B0> <1A76> <77B5> <1A77> <77BD> <1A78> <753A> <1A79> <7540> <1A7A> <754E> <1A7B> <754B> <1A7C> <7548> <1A7D> <755B> <1A7E> <7572> <1A7F> <7579> <1A80> <7583> <1A81> <7F58> <1A82> <7F61> <1A83> <7F5F> <1A84> <8A48> <1A85> <7F68> <1A86> <7F74> <1A87> <7F71> <1A88> <7F79> <1A89> <7F81> <1A8A> <7F7E> endbfchar 100 beginbfchar <1A8B> <76CD> <1A8C> <76E5> <1A8D> <8832> <1A91> <948B> <1A92> <948A> <1A97> <9494> <1A98> <9497> <1A99> <9495> <1A9F> <94AB> <1AA0> <94AA> <1AA1> <94AD> <1AA2> <94AC> <1AA5> <94B2> <1AA6> <94B4> <1AAE> <94BF> <1AAF> <94C4> <1ABD> <94D9> <1ABE> <94D8> <1ABF> <94DB> <1AC3> <94E2> <1AC8> <94EA> <1AC9> <94E9> <1ACA> <94EB> <1AD0> <94F7> <1AD1> <94F9> <1AD4> <94FF> <1AD5> <9503> <1AD6> <9502> <1AE3> <9518> <1AE4> <951B> <1AE8> <9522> <1AEB> <9529> <1AEC> <952C> <1AEF> <9534> <1AF3> <953C> <1AF6> <9542> <1AF7> <9535> <1AFB> <9549> <1AFC> <954C> <1AFF> <9552> <1B06> <955B> <1B09> <955D> <1B15> <956F> <1B19> <953A> <1B1A> <77E7> <1B1B> <77EC> <1B1C> <96C9> <1B1D> <79D5> <1B1E> <79ED> <1B1F> <79E3> <1B20> <79EB> <1B21> <7A06> <1B22> <5D47> <1B23> <7A03> <1B24> <7A02> <1B25> <7A1E> <1B26> <7A14> <1B27> <7A39> <1B28> <7A37> <1B29> <7A51> <1B2A> <9ECF> <1B2B> <99A5> <1B2C> <7A70> <1B2D> <7688> <1B2E> <768E> <1B2F> <7693> <1B30> <7699> <1B31> <76A4> <1B32> <74DE> <1B33> <74E0> <1B34> <752C> <1B35> <9E20> <1B36> <9E22> <1B3C> <9E32> <1B3D> <9E31> <1B3E> <9E36> <1B3F> <9E38> <1B40> <9E37> <1B43> <9E3E> <1B46> <9E44> <1B4D> <9E4E> <1B4E> <9E51> <1B4F> <9E55> <1B50> <9E57> <1B54> <9E5E> <1B55> <9E63> <1B5D> <9E71> <1B5E> <9E6D> <1B5F> <9E73> <1B60> <7592> <1B61> <7594> <1B62> <7596> <1B63> <75A0> <1B64> <759D> <1B65> <75AC> <1B66> <75A3> <1B69> <75B8> <1B6A> <75C4> <1B6B> <75B1> <1B6C> <75B0> endbfchar 100 beginbfchar <1B6D> <75C3> <1B6E> <75C2> <1B6F> <75D6> <1B70> <75CD> <1B71> <75E3> <1B72> <75E8> <1B73> <75E6> <1B74> <75E4> <1B75> <75EB> <1B76> <75E7> <1B77> <7603> <1B78> <75F1> <1B79> <75FC> <1B7A> <75FF> <1B7B> <7610> <1B7C> <7600> <1B7D> <7605> <1B7E> <760C> <1B7F> <7617> <1B80> <760A> <1B81> <7625> <1B82> <7618> <1B83> <7615> <1B84> <7619> <1B85> <761B> <1B86> <763C> <1B87> <7622> <1B88> <7620> <1B89> <7640> <1B8A> <762D> <1B8B> <7630> <1B8C> <763F> <1B8D> <7635> <1B8E> <7643> <1B8F> <763E> <1B90> <7633> <1B91> <764D> <1B92> <765E> <1B93> <7654> <1B94> <765C> <1B95> <7656> <1B96> <766B> <1B97> <766F> <1B98> <7FCA> <1B99> <7AE6> <1B9C> <7A80> <1B9D> <7A86> <1B9E> <7A88> <1B9F> <7A95> <1BA0> <7AA6> <1BA1> <7AA0> <1BA2> <7AAC> <1BA3> <7AA8> <1BA4> <7AAD> <1BA5> <7AB3> <1BA6> <8864> <1BA7> <8869> <1BA8> <8872> <1BA9> <887D> <1BAA> <887F> <1BAB> <8882> <1BAC> <88A2> <1BAD> <88C6> <1BAE> <88B7> <1BAF> <88BC> <1BB0> <88C9> <1BB1> <88E2> <1BB2> <88CE> <1BB3> <88E3> <1BB4> <88E5> <1BB5> <88F1> <1BB6> <891A> <1BB7> <88FC> <1BB8> <88E8> <1BB9> <88FE> <1BBA> <88F0> <1BBB> <8921> <1BBC> <8919> <1BBD> <8913> <1BBE> <891B> <1BBF> <890A> <1BC0> <8934> <1BC1> <892B> <1BC2> <8936> <1BC3> <8941> <1BC4> <8966> <1BC5> <897B> <1BC6> <758B> <1BC7> <80E5> <1BC8> <76B2> <1BC9> <76B4> <1BCA> <77DC> <1BCB> <8012> <1BCC> <8014> <1BCD> <8016> <1BCE> <801C> <1BCF> <8020> <1BD0> <8022> <1BD4> <8029> <1BD5> <8028> endbfchar 100 beginbfchar <1BD6> <8031> <1BD7> <800B> <1BD8> <8035> <1BD9> <8043> <1BDA> <8046> <1BDB> <804D> <1BDC> <8052> <1BDD> <8069> <1BDE> <8071> <1BDF> <8983> <1BE0> <9878> <1BE1> <9880> <1BE2> <9883> <1BE3> <9889> <1BE6> <988F> <1BE7> <9894> <1BF0> <864D> <1BF1> <8654> <1BF2> <866C> <1BF3> <866E> <1BF4> <867F> <1BF5> <867A> <1BF6> <867C> <1BF7> <867B> <1BF8> <86A8> <1BF9> <868D> <1BFA> <868B> <1BFB> <86AC> <1BFC> <869D> <1BFD> <86A7> <1BFE> <86A3> <1BFF> <86AA> <1C00> <8693> <1C01> <86A9> <1C02> <86B6> <1C03> <86C4> <1C04> <86B5> <1C05> <86CE> <1C06> <86B0> <1C07> <86BA> <1C08> <86B1> <1C09> <86AF> <1C0A> <86C9> <1C0B> <86CF> <1C0C> <86B4> <1C0D> <86E9> <1C10> <86ED> <1C11> <86F3> <1C12> <86D0> <1C13> <8713> <1C14> <86DE> <1C15> <86F4> <1C16> <86DF> <1C17> <86D8> <1C18> <86D1> <1C19> <8703> <1C1A> <8707> <1C1B> <86F8> <1C1C> <8708> <1C1D> <870A> <1C1E> <870D> <1C1F> <8709> <1C20> <8723> <1C21> <873B> <1C22> <871E> <1C23> <8725> <1C24> <872E> <1C25> <871A> <1C26> <873E> <1C27> <8748> <1C28> <8734> <1C29> <8731> <1C2A> <8729> <1C2B> <8737> <1C2C> <873F> <1C2D> <8782> <1C2E> <8722> <1C31> <877B> <1C32> <8760> <1C33> <8770> <1C34> <874C> <1C35> <876E> <1C36> <878B> <1C37> <8753> <1C38> <8763> <1C39> <877C> <1C3A> <8764> <1C3B> <8759> <1C3C> <8765> <1C3D> <8793> <1C3E> <87AF> <1C3F> <87A8> <1C40> <87D2> <1C41> <87C6> <1C42> <8788> <1C43> <8785> <1C44> <87AD> <1C45> <8797> <1C46> <8783> <1C47> <87AB> endbfchar 100 beginbfchar <1C48> <87E5> <1C49> <87AC> <1C4A> <87B5> <1C4B> <87B3> <1C4C> <87CB> <1C4D> <87D3> <1C4E> <87BD> <1C4F> <87D1> <1C50> <87C0> <1C51> <87CA> <1C52> <87DB> <1C53> <87EA> <1C54> <87E0> <1C55> <87EE> <1C56> <8816> <1C57> <8813> <1C58> <87FE> <1C59> <880A> <1C5A> <881B> <1C5B> <8821> <1C5C> <8839> <1C5D> <883C> <1C5E> <7F36> <1C5F> <7F42> <1C62> <8210> <1C63> <7AFA> <1C64> <7AFD> <1C65> <7B08> <1C68> <7B15> <1C69> <7B0A> <1C6A> <7B2B> <1C6B> <7B0F> <1C6C> <7B47> <1C6D> <7B38> <1C6E> <7B2A> <1C6F> <7B19> <1C70> <7B2E> <1C71> <7B31> <1C72> <7B20> <1C73> <7B25> <1C74> <7B24> <1C75> <7B33> <1C76> <7B3E> <1C77> <7B1E> <1C78> <7B58> <1C79> <7B5A> <1C7A> <7B45> <1C7B> <7B75> <1C7C> <7B4C> <1C7D> <7B5D> <1C7E> <7B60> <1C7F> <7B6E> <1C80> <7B7B> <1C81> <7B62> <1C82> <7B72> <1C83> <7B71> <1C84> <7B90> <1C87> <7BB8> <1C88> <7BAC> <1C89> <7B9D> <1C8A> <7BA8> <1C8B> <7B85> <1C8C> <7BAA> <1C8D> <7B9C> <1C8E> <7BA2> <1C8F> <7BAB> <1C90> <7BB4> <1C91> <7BD1> <1C92> <7BC1> <1C93> <7BCC> <1C94> <7BDD> <1C95> <7BDA> <1C98> <7BEA> <1C99> <7C0C> <1C9A> <7BFE> <1C9B> <7BFC> <1C9C> <7C0F> <1C9D> <7C16> <1C9E> <7C0B> <1C9F> <7C1F> <1CA0> <7C2A> <1CA1> <7C26> <1CA2> <7C38> <1CA3> <7C41> <1CA4> <7C40> <1CA5> <81FE> <1CA8> <8204> <1CA9> <81EC> <1CAA> <8844> <1CAE> <822D> <1CAF> <822F> <1CB0> <8228> <1CB1> <822B> <1CB2> <8238> <1CB3> <823B> <1CB6> <823E> <1CB7> <8244> <1CB8> <8249> <1CB9> <824B> <1CBA> <824F> endbfchar 100 beginbfchar <1CBB> <825A> <1CBC> <825F> <1CBD> <8268> <1CBE> <887E> <1CBF> <8885> <1CC0> <8888> <1CC1> <88D8> <1CC2> <88DF> <1CC3> <895E> <1CC4> <7F9D> <1CC5> <7F9F> <1CC6> <7FA7> <1CC9> <7FB2> <1CCA> <7C7C> <1CCB> <6549> <1CCC> <7C91> <1CCD> <7C9D> <1CCE> <7C9C> <1CCF> <7C9E> <1CD0> <7CA2> <1CD1> <7CB2> <1CD4> <7CC1> <1CD5> <7CC7> <1CD8> <7CC8> <1CD9> <7CC5> <1CDA> <7CD7> <1CDB> <7CE8> <1CDC> <826E> <1CDD> <66A8> <1CDE> <7FBF> <1CDF> <7FCE> <1CE0> <7FD5> <1CE1> <7FE5> <1CE2> <7FE1> <1CE3> <7FE6> <1CE4> <7FE9> <1CE5> <7FEE> <1CE6> <7FF3> <1CE7> <7CF8> <1CE8> <7D77> <1CE9> <7DA6> <1CEA> <7DAE> <1CEB> <7E47> <1CEC> <7E9B> <1CED> <9EB8> <1CEE> <9EB4> <1CEF> <8D73> <1CF0> <8D84> <1CF1> <8D94> <1CF2> <8D91> <1CF3> <8DB1> <1CF4> <8D67> <1CF5> <8D6D> <1CF6> <8C47> <1CF7> <8C49> <1CF8> <914A> <1CF9> <9150> <1CFC> <9164> <1CFD> <9162> <1CFE> <9161> <1CFF> <9170> <1D00> <9169> <1D01> <916F> <1D04> <9172> <1D05> <9174> <1D06> <9179> <1D07> <918C> <1D08> <9185> <1D09> <9190> <1D0A> <918D> <1D0B> <9191> <1D0E> <91AA> <1D12> <91B5> <1D13> <91B4> <1D14> <91BA> <1D15> <8C55> <1D16> <9E7E> <1D17> <8DB8> <1D18> <8DEB> <1D19> <8E05> <1D1A> <8E59> <1D1B> <8E69> <1D1C> <8DB5> <1D1D> <8DBF> <1D1E> <8DBC> <1D1F> <8DBA> <1D20> <8DC4> <1D23> <8DDA> <1D24> <8DDE> <1D27> <8DDB> <1D28> <8DC6> <1D29> <8DEC> <1D2C> <8DE3> <1D2D> <8DF9> <1D2E> <8DFB> <1D2F> <8DE4> <1D30> <8E09> <1D31> <8DFD> <1D32> <8E14> <1D33> <8E1D> endbfchar 100 beginbfchar <1D34> <8E1F> <1D35> <8E2C> <1D36> <8E2E> <1D37> <8E23> <1D38> <8E2F> <1D39> <8E3A> <1D3A> <8E40> <1D3B> <8E39> <1D3C> <8E35> <1D3D> <8E3D> <1D3E> <8E31> <1D3F> <8E49> <1D44> <8E4A> <1D45> <8E70> <1D46> <8E76> <1D47> <8E7C> <1D48> <8E6F> <1D49> <8E74> <1D4A> <8E85> <1D4B> <8E8F> <1D4C> <8E94> <1D4D> <8E90> <1D4E> <8E9C> <1D4F> <8E9E> <1D50> <8C78> <1D51> <8C82> <1D52> <8C8A> <1D53> <8C85> <1D54> <8C98> <1D55> <8C94> <1D56> <659B> <1D57> <89D6> <1D58> <89DE> <1D59> <89DA> <1D5A> <89DC> <1D5B> <89E5> <1D5C> <89EB> <1D5D> <89EF> <1D5E> <8A3E> <1D5F> <8B26> <1D60> <9753> <1D61> <96E9> <1D62> <96F3> <1D63> <96EF> <1D64> <9706> <1D65> <9701> <1D66> <9708> <1D67> <970F> <1D68> <970E> <1D69> <972A> <1D6A> <972D> <1D6B> <9730> <1D6C> <973E> <1D6D> <9F80> <1D6E> <9F83> <1D75> <9F8C> <1D76> <9EFE> <1D77> <9F0B> <1D78> <9F0D> <1D79> <96B9> <1D7C> <96CE> <1D7D> <96D2> <1D7E> <77BF> <1D7F> <96E0> <1D80> <928E> <1D81> <92AE> <1D82> <92C8> <1D83> <933E> <1D84> <936A> <1D85> <93CA> <1D86> <938F> <1D87> <943E> <1D88> <946B> <1D89> <9C7F> <1D8A> <9C82> <1D8F> <7A23> <1D90> <9C8B> <1D91> <9C8E> <1DA4> <9CAB> <1DC6> <9CDF> <1DC7> <9CE2> <1DC8> <977C> <1DC9> <9785> <1DCC> <9794> <1DCD> <97AF> <1DCE> <97AB> <1DCF> <97A3> <1DD0> <97B2> <1DD1> <97B4> <1DD2> <9AB1> <1DD3> <9AB0> <1DD4> <9AB7> <1DD5> <9E58> <1DD6> <9AB6> <1DD7> <9ABA> <1DD8> <9ABC> <1DD9> <9AC1> <1DDA> <9AC0> <1DDB> <9AC5> <1DDC> <9AC2> endbfchar 100 beginbfchar <1DDF> <9AD1> <1DE0> <9B45> <1DE1> <9B43> <1DE2> <9B47> <1DE3> <9B49> <1DE4> <9B48> <1DE5> <9B4D> <1DE6> <9B51> <1DE7> <98E8> <1DE8> <990D> <1DE9> <992E> <1DEA> <9955> <1DEB> <9954> <1DEC> <9ADF> <1DED> <9AE1> <1DEE> <9AE6> <1DEF> <9AEF> <1DF0> <9AEB> <1DF1> <9AFB> <1DF2> <9AED> <1DF3> <9AF9> <1DF4> <9B08> <1DF5> <9B0F> <1DF6> <9B13> <1DF7> <9B1F> <1DF8> <9B23> <1DFB> <7E3B> <1DFC> <9E82> <1DFF> <9E8B> <1E00> <9E92> <1E01> <93D6> <1E02> <9E9D> <1E03> <9E9F> <1E07> <9EE0> <1E08> <9EDF> <1E09> <9EE2> <1E0A> <9EE9> <1E0B> <9EE7> <1E0C> <9EE5> <1E0D> <9EEA> <1E0E> <9EEF> <1E0F> <9F22> <1E10> <9F2C> <1E11> <9F2F> <1E12> <9F39> <1E13> <9F37> <1E16> <9F44> <1E17> <3007> <1E18> <FF5E> <1E19> <2016> <1E1A> <3013> <1E1B> <FF0E> <1E1C> <FF1D> <1E1D> <FF3B> <1E1E> <FF3D> <1E1F> <FFE3> <1E20> <00FC> <1E21> <00A9> <1E22> <2122> <1E23> <2026> <1E24> <0020> <1E25> <769A> <1E26> <85F9> <1E27> <7919> <1E28> <611B> <1E29> <9AAF> <1E2A> <8956> <1E2B> <58E9> <1E2C> <7F77> <1E2D> <64FA> <1E2E> <6557> <1E2F> <9812> <1E30> <8FA6> <1E31> <7D46> <1E32> <5E6B> <1E33> <7D81> <1E34> <938A> <1E35> <8B17> <1E36> <98FD> <1E37> <5BF6> <1E38> <5831> <1E39> <9B91> <1E3A> <8F29> <1E3B> <8C9D> <1E3C> <92C7> <1E3D> <72FD> <1E3E> <5099> <1E3F> <618A> <1E40> <7DB3> <1E41> <7B46> <1E42> <7562> <1E43> <6583> <1E44> <5E63> <1E45> <9589> <1E46> <908A> <1E47> <7DE8> <1E48> <8CB6> <1E49> <8B8A> <1E4A> <8FAF> <1E4B> <8FAE> endbfchar 100 beginbfchar <1E4C> <6A19> <1E4D> <9C49> <1E4E> <765F> <1E4F> <7015> <1E50> <6FF1> <1E51> <8CD3> <1E52> <64EF> <1E53> <9905> <1E54> <64A5> <1E55> <9262> <1E56> <9251> <1E57> <99C1> <1E58> <88DC> <1E59> <8CA1> <1E5A> <53C3> <1E5B> <8836> <1E5C> <6B98> <1E5D> <615A> <1E5E> <6158> <1E5F> <71E6> <1E60> <84BC> <1E61> <8259> <1E62> <5009> <1E63> <6EC4> <1E64> <53A0> <1E65> <5074> <1E66> <6E2C> <1E67> <5C64> <1E68> <8A6B> <1E69> <6519> <1E6A> <647B> <1E6B> <87EC> <1E6C> <995E> <1E6D> <8B92> <1E6E> <7E8F> <1E6F> <93DF> <1E70> <7523> <1E71> <95E1> <1E72> <986B> <1E73> <5834> <1E74> <5617> <1E75> <9577> <1E76> <511F> <1E77> <8178> <1E78> <5EE0> <1E79> <66A2> <1E7A> <9214> <1E7B> <8ECA> <1E7C> <5FB9> <1E7D> <5875> <1E7E> <9673> <1E7F> <896F> <1E80> <7A31> <1E81> <61F2> <1E82> <8AA0> <1E83> <9A01> <1E84> <9072> <1E85> <99B3> <1E86> <9F52> <1E87> <71BE> <1E88> <885D> <1E89> <87F2> <1E8A> <5BF5> <1E8B> <7587> <1E8C> <8E8A> <1E8D> <7C4C> <1E8E> <7DA2> <1E8F> <919C> <1E90> <92E4> <1E91> <96DB> <1E92> <790E> <1E93> <5132> <1E94> <89F8> <1E95> <8655> <1E96> <50B3> <1E97> <7621> <1E98> <95D6> <1E99> <5275> <1E9A> <9318> <1E9B> <7D14> <1E9C> <7DBD> <1E9D> <8FAD> <1E9E> <8A5E> <1E9F> <8CDC> <1EA0> <8070> <1EA1> <5F9E> <1EA2> <53E2> <1EA3> <8EA5> <1EA4> <7AC4> <1EA5> <932F> <1EA6> <9054> <1EA7> <5E36> <1EA8> <8CB8> <1EA9> <64D4> <1EAA> <55AE> <1EAB> <9132> <1EAC> <64A3> <1EAD> <81BD> <1EAE> <619A> <1EAF> <8A95> endbfchar 100 beginbfchar <1EB0> <5F48> <1EB1> <7576> <1EB2> <64CB> <1EB3> <9EE8> <1EB4> <8569> <1EB5> <6A94> <1EB6> <6417> <1EB7> <5CF6> <1EB8> <79B1> <1EB9> <5C0E> <1EBA> <71C8> <1EBB> <9127> <1EBC> <6575> <1EBD> <6ECC> <1EBE> <905E> <1EBF> <7DE0> <1EC0> <985B> <1EC1> <9EDE> <1EC2> <588A> <1EC3> <96FB> <1EC4> <6FB1> <1EC5> <91E3> <1EC6> <8ABF> <1EC7> <8ADC> <1EC8> <91D8> <1EC9> <9802> <1ECA> <9320> <1ECB> <8A02> <1ECC> <6771> <1ECD> <52D5> <1ECE> <68DF> <1ECF> <51CD> <1ED0> <9B25> <1ED1> <72A2> <1ED2> <7368> <1ED3> <8B80> <1ED4> <8CED> <1ED5> <934D> <1ED6> <935B> <1ED7> <65B7> <1ED8> <7DDE> <1ED9> <968A> <1EDA> <5C0D> <1EDB> <5678> <1EDC> <9813> <1EDD> <920D> <1EDE> <596A> <1EDF> <58AE> <1EE0> <9D5D> <1EE1> <984D> <1EE2> <8A1B> <1EE3> <60E1> <1EE4> <9913> <1EE5> <5152> <1EE6> <723E> <1EE7> <990C> <1EE8> <8CB3> <1EE9> <767C> <1EEA> <7F70> <1EEB> <95A5> <1EEC> <792C> <1EED> <91E9> <1EEE> <7169> <1EEF> <7BC4> <1EF0> <8CA9> <1EF1> <98EF> <1EF2> <8A2A> <1EF3> <7D21> <1EF4> <98DB> <1EF5> <8AB9> <1EF6> <5EE2> <1EF7> <8CBB> <1EF8> <7D1B> <1EF9> <58B3> <1EFA> <596E> <1EFB> <61A4> <1EFC> <7CDE> <1EFD> <8C50> <1EFE> <6953> <1EFF> <92D2> <1F00> <98A8> <1F01> <760B> <1F02> <99AE> <1F03> <7E2B> <1F04> <8AF7> <1F05> <9CF3> <1F06> <819A> <1F07> <8F3B> <1F08> <64AB> <1F09> <8F14> <1F0A> <8CE6> <1F0B> <5FA9> <1F0C> <8CA0> <1F0D> <8A03> <1F0E> <5A66> <1F0F> <7E1B> <1F10> <8A72> <1F11> <9223> <1F12> <84CB> <1F13> <5E79> endbfchar 100 beginbfchar <1F14> <8D95> <1F15> <8D1B> <1F16> <5CA1> <1F17> <525B> <1F18> <92FC> <1F19> <7DB1> <1F1A> <5D17> <1F1B> <93AC> <1F1C> <64F1> <1F1D> <9D3F> <1F1E> <95A3> <1F1F> <927B> <1F20> <500B> <1F21> <7D66> <1F22> <9F94> <1F23> <978F> <1F24> <8CA2> <1F25> <920E> <1F26> <6E9D> <1F27> <69CB> <1F28> <8CFC> <1F29> <8831> <1F2A> <9867> <1F2B> <526E> <1F2C> <95DC> <1F2D> <89C0> <1F2E> <9928> <1F2F> <6163> <1F30> <8CAB> <1F31> <5EE3> <1F32> <898F> <1F33> <6B78> <1F34> <9F9C> <1F35> <95A8> <1F36> <8ECC> <1F37> <8A6D> <1F38> <6AC3> <1F39> <8CB4> <1F3A> <528A> <1F3B> <8F25> <1F3C> <934B> <1F3D> <570B> <1F3E> <904E> <1F3F> <99ED> <1F40> <97D3> <1F41> <6F22> <1F42> <865F> <1F43> <95A1> <1F44> <9DB4> <1F45> <8CC0> <1F46> <8F5F> <1F47> <9D3B> <1F48> <7D05> <1F49> <58FA> <1F4A> <8B77> <1F4B> <6EEC> <1F4C> <5629> <1F4D> <83EF> <1F4E> <756B> <1F4F> <5283> <1F50> <8A71> <1F51> <61F7> <1F52> <58DE> <1F53> <6B61> <1F54> <74B0> <1F55> <9084> <1F56> <7DE9> <1F57> <8B0A> <1F58> <63EE> <1F59> <8F1D> <1F5A> <8CC4> <1F5B> <7A62> <1F5C> <6703> <1F5D> <71F4> <1F5E> <532F> <1F5F> <8AF1> <1F60> <8AA8> <1F61> <7E6A> <1F62> <8477> <1F63> <6E3E> <1F64> <7372> <1F65> <8CA8> <1F66> <798D> <1F67> <64CA> <1F68> <6A5F> <1F69> <7A4D> <1F6A> <9951> <1F6B> <8B4F> <1F6C> <9DC4> <1F6D> <7E3E> <1F6E> <7DDD> <1F6F> <6975> <1F70> <8F2F> <1F71> <7D1A> <1F72> <64E0> <1F73> <5E7E> <1F74> <858A> <1F75> <5291> <1F76> <6FDF> <1F77> <8A08> endbfchar 100 beginbfchar <1F78> <8A18> <1F79> <969B> <1F7A> <7E7C> <1F7B> <7D00> <1F7C> <593E> <1F7D> <83A2> <1F7E> <9830> <1F7F> <8CC8> <1F80> <9240> <1F81> <50F9> <1F82> <99D5> <1F83> <6BB2> <1F84> <76E3> <1F85> <5805> <1F86> <7B8B> <1F87> <9593> <1F88> <8271> <1F89> <7DD8> <1F8A> <7E6D> <1F8B> <6AA2> <1F8C> <9E7C> <1F8D> <63C0> <1F8E> <64BF> <1F8F> <7C21> <1F90> <5109> <1F91> <85A6> <1F92> <6ABB> <1F93> <9452> <1F94> <8E10> <1F95> <8CE4> <1F96> <898B> <1F97> <9375> <1F98> <8266> <1F99> <528D> <1F9A> <991E> <1F9B> <6F38> <1F9C> <6FFA> <1F9D> <6F97> <1F9E> <5C07> <1F9F> <6F3F> <1FA0> <8523> <1FA1> <69F3> <1FA2> <596C> <1FA3> <8B1B> <1FA4> <91AC> <1FA5> <81A0> <1FA6> <6F86> <1FA7> <9A55> <1FA8> <5B0C> <1FA9> <652A> <1FAA> <9278> <1FAB> <77EF> <1FAC> <50E5> <1FAD> <9903> <1FAE> <7E73> <1FAF> <7D5E> <1FB0> <8F4E> <1FB1> <8F03> <1FB2> <968E> <1FB3> <7BC0> <1FB4> <6F54> <1FB5> <7D50> <1FB6> <8AA1> <1FB7> <7DCA> <1FB8> <9326> <1FB9> <50C5> <1FBA> <8B39> <1FBB> <9032> <1FBC> <71FC> <1FBD> <76E1> <1FBE> <52C1> <1FBF> <8396> <1FC0> <9BE8> <1FC1> <9A5A> <1FC2> <7D93> <1FC3> <9838> <1FC4> <93E1> <1FC5> <5F91> <1FC6> <75D9> <1FC7> <7AF6> <1FC8> <7CFE> <1FC9> <820A> <1FCA> <99D2> <1FCB> <8209> <1FCC> <64DA> <1FCD> <92F8> <1FCE> <61FC> <1FCF> <5287> <1FD0> <9D51> <1FD1> <7D79> <1FD2> <89BA> <1FD3> <8A23> <1FD4> <7D76> <1FD5> <921E> <1FD6> <8ECD> <1FD7> <99FF> <1FD8> <958B> <1FD9> <51F1> <1FDA> <9846> <1FDB> <6BBB> endbfchar 100 beginbfchar <1FDC> <8AB2> <1FDD> <58BE> <1FDE> <61C7> <1FDF> <6473> <1FE0> <5EAB> <1FE1> <8932> <1FE2> <8A87> <1FE3> <584A> <1FE4> <5108> <1FE5> <5BEC> <1FE6> <7926> <1FE7> <66E0> <1FE8> <8667> <1FE9> <5DCB> <1FEA> <7ABA> <1FEB> <994B> <1FEC> <6F70> <1FED> <64F4> <1FEE> <95CA> <1FEF> <881F> <1FF0> <81D8> <1FF1> <840A> <1FF2> <4F86> <1FF3> <8CF4> <1FF4> <85CD> <1FF5> <6B04> <1FF6> <6514> <1FF7> <7C43> <1FF8> <95CC> <1FF9> <862D> <1FFA> <703E> <1FFB> <8B95> <1FFC> <652C> <1FFD> <89BD> <1FFE> <61F6> <1FFF> <7E9C> <2000> <721B> <2001> <6FEB> <2002> <6488> <2003> <52DE> <2004> <6F87> <2005> <6A02> <2006> <9433> <2007> <58D8> <2008> <985E> <2009> <7C6C> <200A> <96E2> <200B> <7055> <200C> <88CF> <200D> <9BC9> <200E> <79AE> <200F> <9E97> <2010> <53B2> <2011> <52F5> <2012> <792B> <2013> <6B77> <2014> <701D> <2015> <96B8> <2016> <5006> <2017> <806F> <2018> <84EE> <2019> <9023> <201A> <942E> <201B> <6190> <201C> <6F23> <201D> <7C3E> <201E> <6582> <201F> <81C9> <2020> <93C8> <2021> <6200> <2022> <7149> <2023> <7DF4> <2024> <7CE7> <2025> <5169> <2026> <8F1B> <2027> <8AD2> <2028> <7642> <2029> <907C> <202A> <9410> <202B> <7375> <202C> <81E8> <202D> <9130> <202E> <9C57> <202F> <8CC3> <2030> <9F61> <2031> <9234> <2032> <9748> <2033> <5DBA> <2034> <9818> <2035> <993E> <2036> <5289> <2037> <9F8D> <2038> <807E> <2039> <56A8> <203A> <7C60> <203B> <58DF> <203C> <650F> <203D> <96B4> <203E> <6A13> <203F> <5A41> endbfchar 100 beginbfchar <2040> <645F> <2041> <7C0D> <2042> <8606> <2043> <76E7> <2044> <9871> <2045> <5EEC> <2046> <7210> <2047> <64C4> <2048> <6EF7> <2049> <865C> <204A> <9B6F> <204B> <8CC2> <204C> <9332> <204D> <9678> <204E> <9A62> <204F> <92C1> <2050> <5C62> <2051> <7E37> <2052> <616E> <2053> <6FFE> <2054> <7DD1> <2055> <5DD2> <2056> <6523> <2057> <5B7F> <2058> <7064> <2059> <4E82> <205A> <6384> <205B> <8F2A> <205C> <502B> <205D> <4F96> <205E> <6DEA> <205F> <7DB8> <2060> <8AD6> <2061> <863F> <2062> <7F85> <2063> <908F> <2064> <947C> <2065> <7C6E> <2066> <9A3E> <2067> <99F1> <2068> <7D61> <2069> <5ABD> <206A> <746A> <206B> <78BC> <206C> <879E> <206D> <99AC> <206E> <99E1> <206F> <55CE> <2070> <8CB7> <2071> <9EA5> <2072> <8CE3> <2073> <9081> <2074> <779E> <2075> <9945> <2076> <883B> <2077> <6EFF> <2078> <8B3E> <2079> <9328> <207A> <925A> <207B> <8CBF> <207C> <9382> <207D> <9580> <207E> <60B6> <207F> <5011> <2080> <9333> <2081> <5922> <2082> <8B0E> <2083> <5F4C> <2084> <8993> <2085> <7DBF> <2086> <7DEC> <2087> <5EDF> <2088> <6EC5> <2089> <61AB> <208A> <95A9> <208B> <9CF4> <208C> <9298> <208D> <8B2C> <208E> <8B00> <208F> <755D> <2090> <9209> <2091> <7D0D> <2092> <96E3> <2093> <6493> <2094> <8166> <2095> <60F1> <2096> <9B27> <2097> <9912> <2098> <64EC> <2099> <81A9> <209A> <6506> <209B> <91C0> <209C> <9CE5> <209D> <8076> <209E> <5699> <209F> <9477> <20A0> <93B3> <20A1> <6AB8> <20A2> <7370> <20A3> <5BE7> endbfchar 100 beginbfchar <20A4> <64F0> <20A5> <6FD8> <20A6> <9215> <20A7> <7D10> <20A8> <81BF> <20A9> <6FC3> <20AA> <8FB2> <20AB> <7627> <20AC> <8AFE> <20AD> <6B50> <20AE> <9DD7> <20AF> <6BC6> <20B0> <5614> <20B1> <6F1A> <20B2> <76E4> <20B3> <9F90> <20B4> <8CE0> <20B5> <5674> <20B6> <9D6C> <20B7> <9A19> <20B8> <98C4> <20B9> <983B> <20BA> <8CA7> <20BB> <860B> <20BC> <6191> <20BD> <8A55> <20BE> <6F51> <20BF> <9817> <20C0> <64B2> <20C1> <92EA> <20C2> <50D5> <20C3> <6A38> <20C4> <8B5C> <20C5> <81CD> <20C6> <9F4A> <20C7> <9A0E> <20C8> <8C48> <20C9> <5553> <20CA> <6C23> <20CB> <8A16> <20CC> <727D> <20CD> <91FA> <20CE> <925B> <20CF> <9077> <20D0> <7C3D> <20D1> <8B19> <20D2> <9322> <20D3> <9257> <20D4> <6DFA> <20D5> <8B74> <20D6> <5879> <20D7> <69CD> <20D8> <55C6> <20D9> <58BB> <20DA> <8594> <20DB> <6436> <20DC> <936C> <20DD> <6A4B> <20DE> <55AC> <20DF> <50D1> <20E0> <7FF9> <20E1> <7AC5> <20E2> <7ACA> <20E3> <6B3D> <20E4> <89AA> <20E5> <5BE2> <20E6> <8F15> <20E7> <6C2B> <20E8> <50BE> <20E9> <9803> <20EA> <8ACB> <20EB> <6176> <20EC> <74CA> <20ED> <7AAE> <20EE> <8DA8> <20EF> <5340> <20F0> <8EC0> <20F1> <9A45> <20F2> <9F72> <20F3> <9874> <20F4> <6B0A> <20F5> <52F8> <20F6> <9D72> <20F7> <78BA> <20F8> <8B93> <20F9> <9952> <20FA> <64FE> <20FB> <7E5E> <20FC> <71B1> <20FD> <97CC> <20FE> <8A8D> <20FF> <7D09> <2100> <69AE> <2101> <7D68> <2102> <8EDF> <2103> <92ED> <2104> <958F> <2105> <6F64> <2106> <7051> <2107> <85A9> endbfchar 100 beginbfchar <2108> <9C13> <2109> <8CFD> <210A> <5098> <210B> <55AA> <210C> <9A37> <210D> <6383> <210E> <6F80> <210F> <6BBA> <2110> <7D17> <2111> <7BE9> <2112> <66EC> <2113> <9583> <2114> <965D> <2115> <8D0D> <2116> <7E55> <2117> <50B7> <2118> <8CDE> <2119> <71D2> <211A> <7D39> <211B> <8CD2> <211C> <6368> <211D> <651D> <211E> <61FE> <211F> <8A2D> <2120> <7D33> <2121> <5BE9> <2122> <5B38> <2123> <814E> <2124> <6EF2> <2125> <8072> <2126> <7E69> <2127> <52DD> <2128> <8056> <2129> <5E2B> <212A> <7345> <212B> <6FD5> <212C> <8A69> <212D> <6642> <212E> <8755> <212F> <5BE6> <2130> <8B58> <2131> <99DB> <2132> <52E2> <2133> <9069> <2134> <91CB> <2135> <98FE> <2136> <8996> <2137> <8A66> <2138> <58FD> <2139> <7378> <213A> <6A1E> <213B> <8F38> <213C> <66F8> <213D> <8D16> <213E> <5C6C> <213F> <8853> <2140> <6A39> <2141> <7AEA> <2142> <6578> <2143> <5E25> <2144> <96D9> <2145> <8AB0> <2146> <9806> <2147> <8AAC> <2148> <78A9> <2149> <720D> <214A> <7D72> <214B> <98FC> <214C> <9B06> <214D> <8073> <214E> <616B> <214F> <980C> <2150> <8A1F> <2151> <8AA6> <2152> <64FB> <2153> <8607> <2154> <8A34> <2155> <8085> <2156> <96D6> <2157> <96A8> <2158> <7D8F> <2159> <6B72> <215A> <5B6B> <215B> <640D> <215C> <7E2E> <215D> <7463> <215E> <9396> <215F> <737A> <2160> <64BB> <2161> <81FA> <2162> <614B> <2163> <6524> <2164> <8CAA> <2165> <7671> <2166> <7058> <2167> <58C7> <2168> <8B5A> <2169> <8AC7> <216A> <5606> <216B> <6E6F> endbfchar 100 beginbfchar <216C> <71D9> <216D> <6FE4> <216E> <7E27> <216F> <8A0E> <2170> <9A30> <2171> <8B04> <2172> <92BB> <2173> <984C> <2174> <9AD4> <2175> <689D> <2176> <8CBC> <2177> <9435> <2178> <5EF3> <2179> <807D> <217A> <70F4> <217B> <9285> <217C> <7D71> <217D> <982D> <217E> <5716> <217F> <5857> <2180> <5718> <2181> <983D> <2182> <9D15> <2183> <99B1> <2184> <99DD> <2185> <6A62> <2186> <7AAA> <2187> <896A> <2188> <5F4E> <2189> <7063> <218A> <9811> <218B> <842C> <218C> <7DB2> <218D> <97CB> <218E> <9055> <218F> <570D> <2190> <7232> <2191> <6FF0> <2192> <7DAD> <2193> <8466> <2194> <5049> <2195> <50DE> <2196> <7DEF> <2197> <8B02> <2198> <885B> <2199> <805E> <219A> <7D0B> <219B> <7A69> <219C> <554F> <219D> <64BE> <219E> <8778> <219F> <6E26> <21A0> <7AA9> <21A1> <55DA> <21A2> <93A2> <21A3> <70CF> <21A4> <8AA3> <21A5> <7121> <21A6> <856A> <21A7> <5862> <21A8> <9727> <21A9> <52D9> <21AA> <8AA4> <21AB> <932B> <21AC> <72A7> <21AD> <8972> <21AE> <7FD2> <21AF> <9291> <21B0> <6232> <21B1> <7D30> <21B2> <8766> <21B3> <8F44> <21B4> <5CFD> <21B5> <4FE0> <21B6> <72F9> <21B7> <5687> <21B8> <9341> <21B9> <9BAE> <21BA> <7E96> <21BB> <8CE2> <21BC> <929C> <21BD> <9591> <21BE> <986F> <21BF> <96AA> <21C0> <73FE> <21C1> <737B> <21C2> <7E23> <21C3> <9921> <21C4> <61B2> <21C5> <7DAB> <21C6> <9472> <21C7> <9109> <21C8> <8A73> <21C9> <97FF> <21CA> <9805> <21CB> <856D> <21CC> <56C2> <21CD> <92B7> <21CE> <66C9> <21CF> <562F> endbfchar 100 beginbfchar <21D0> <5354> <21D1> <633E> <21D2> <8105> <21D3> <8AE7> <21D4> <5BEB> <21D5> <7009> <21D6> <8B1D> <21D7> <92C5> <21D8> <91C1> <21D9> <8208> <21DA> <92B9> <21DB> <7D89> <21DC> <9808> <21DD> <8A31> <21DE> <7DD2> <21DF> <7E8C> <21E0> <8ED2> <21E1> <61F8> <21E2> <9078> <21E3> <766C> <21E4> <7D62> <21E5> <5B78> <21E6> <52DB> <21E7> <8A62> <21E8> <5C0B> <21E9> <99B4> <21EA> <8A13> <21EB> <8A0A> <21EC> <905C> <21ED> <58D3> <21EE> <9D09> <21EF> <9D28> <21F0> <555E> <21F1> <4E9E> <21F2> <8A1D> <21F3> <95B9> <21F4> <9E7D> <21F5> <56B4> <21F6> <9854> <21F7> <95BB> <21F8> <8277> <21F9> <53AD> <21FA> <786F> <21FB> <8AFA> <21FC> <9A57> <21FD> <9D26> <21FE> <694A> <21FF> <63DA> <2200> <760D> <2201> <967D> <2202> <7662> <2203> <990A> <2204> <6A23> <2205> <582F> <2206> <8B21> <2207> <85E5> <2208> <723A> <2209> <9801> <220A> <696D> <220B> <8449> <220C> <91AB> <220D> <92A5> <220E> <9824> <220F> <907A> <2210> <5100> <2211> <87FB> <2212> <85DD> <2213> <5104> <2214> <61B6> <2215> <7FA9> <2216> <8A63> <2217> <8B70> <2218> <8ABC> <2219> <8B6F> <221A> <7E79> <221B> <852D> <221C> <9670> <221D> <9280> <221E> <98F2> <221F> <96B1> <2220> <6AFB> <2221> <5B30> <2222> <9DF9> <2223> <61C9> <2224> <7E93> <2225> <7469> <2226> <87A2> <2227> <71DF> <2228> <7192> <2229> <8805> <222A> <8D0F> <222B> <7A4E> <222C> <55B2> <222D> <64C1> <222E> <50AD> <222F> <7670> <2230> <8E34> <2231> <512A> <2232> <6182> <2233> <90F5> endbfchar 100 beginbfchar <2234> <923E> <2235> <7336> <2236> <8A98> <2237> <8F3F> <2238> <9918> <2239> <9B5A> <223A> <6F01> <223B> <8207> <223C> <5DBC> <223D> <8A9E> <223E> <9B31> <223F> <7344> <2240> <8B7D> <2241> <9810> <2242> <99AD> <2243> <9D1B> <2244> <6DF5> <2245> <8F45> <2246> <5712> <2247> <54E1> <2248> <5713> <2249> <7DE3> <224A> <9060> <224B> <9858> <224C> <7D04> <224D> <8E8D> <224E> <9470> <224F> <95B2> <2250> <96F2> <2251> <9116> <2252> <9695> <2253> <904B> <2254> <85F4> <2255> <9196> <2256> <6688> <2257> <96DC> <2258> <8F09> <2259> <6522> <225A> <66AB> <225B> <8D0A> <225C> <8D1C> <225D> <81DF> <225E> <947F> <225F> <68D7> <2260> <7AC8> <2261> <8CAC> <2262> <64C7> <2263> <5247> <2264> <6FA4> <2265> <8CCA> <2266> <8D08> <2267> <8ECB> <2268> <9358> <2269> <9598> <226A> <8A50> <226B> <9F4B> <226C> <50B5> <226D> <6C08> <226E> <76DE> <226F> <65AC> <2270> <8F3E> <2271> <5D84> <2272> <68E7> <2273> <6230> <2274> <7DBB> <2275> <5F35> <2276> <6F32> <2277> <5E33> <2278> <8CEC> <2279> <8139> <227A> <8D99> <227B> <87C4> <227C> <8F4D> <227D> <937A> <227E> <9019> <227F> <8C9E> <2280> <91DD> <2281> <5075> <2282> <8A3A> <2283> <93AE> <2284> <9663> <2285> <5E40> <2286> <7665> <2287> <912D> <2288> <8B49> <2289> <7E54> <228A> <8077> <228B> <57F7> <228C> <8879> <228D> <7D19> <228E> <646F> <228F> <64F2> <2290> <5E5F> <2291> <8CEA> <2292> <6EEF> <2293> <9418> <2294> <7D42> <2295> <7A2E> <2296> <816B> <2297> <8846> endbfchar 100 beginbfchar <2298> <8B05> <2299> <8EF8> <229A> <76BA> <229B> <665D> <229C> <9A5F> <229D> <8AF8> <229E> <8A85> <229F> <71ED> <22A0> <77DA> <22A1> <56D1> <22A2> <8CAF> <22A3> <9444> <22A4> <7BC9> <22A5> <99D0> <22A6> <5C08> <22A7> <78DA> <22A8> <8F49> <22A9> <8CFA> <22AA> <6A01> <22AB> <838A> <22AC> <88DD> <22AD> <599D> <22AE> <58EF> <22AF> <72C0> <22B0> <9310> <22B1> <8D05> <22B2> <589C> <22B3> <7DB4> <22B4> <8AC4> <22B5> <6E96> <22B6> <6FC1> <22B7> <8CC7> <22B8> <6F2C> <22B9> <7D9C> <22BA> <7E3D> <22BB> <7E31> <22BC> <9112> <22BD> <8A5B> <22BE> <7D44> <22BF> <947D> <22C0> <55C7> <22C1> <5399> <22C2> <53B4> <22C3> <9768> <22C4> <8D0B> <22C5> <532D> <22C6> <5331> <22C7> <8CFE> <22C8> <5244> <22C9> <528C> <22CA> <5274> <22CB> <50B4> <22CC> <5000> <22CD> <5096> <22CE> <5115> <22CF> <5102> <22D0> <5114> <22D1> <513C> <22D2> <5137> <22D3> <50E8> <22D4> <50C2> <22D5> <513B> <22D6> <5110> <22D7> <513A> <22D8> <50C9> <22D9> <7CF4> <22DA> <9ECC> <22DB> <56C5> <22DC> <9CEC> <22DD> <893B> <22DE> <81E0> <22DF> <8A01> <22E0> <8A10> <22E1> <8A0C> <22E2> <8A15> <22E3> <8B33> <22E4> <8A4E> <22E5> <8A25> <22E6> <8A41> <22E7> <8A36> <22E8> <8A46> <22E9> <8A54> <22EA> <8A58> <22EB> <8A52> <22EC> <8A86> <22ED> <8A84> <22EE> <8A7F> <22EF> <8A70> <22F0> <8A7C> <22F1> <8A75> <22F2> <8A6C> <22F3> <8A6E> <22F4> <8ACD> <22F5> <8AE2> <22F6> <8A61> <22F7> <8A9A> <22F8> <8AA5> <22FB> <8ACF> <22FC> <8AD1> <22FD> <8AC9> endbfchar 100 beginbfchar <22FE> <8ADB> <22FF> <8AD7> <2300> <8AC2> <2301> <8AB6> <2302> <8AF6> <2303> <8AEB> <2304> <8B14> <2305> <8B01> <2306> <8AE4> <2307> <8AED> <2308> <8AFC> <2309> <8AF3> <230A> <8AE6> <230B> <8AEE> <230C> <8ADE> <230D> <8B28> <230E> <8B9C> <230F> <8B16> <2310> <8B1A> <2311> <8B10> <2312> <8B2B> <2313> <8B2D> <2314> <8B56> <2315> <8B59> <2316> <8B4E> <2317> <8B9E> <2318> <8B6B> <2319> <8B96> <231A> <9658> <231B> <913A> <231C> <9114> <231D> <9134> <231E> <90DF> <231F> <9136> <2320> <9106> <2321> <9148> <2322> <82BB> <2323> <52F1> <2324> <5DF0> <2325> <580A> <2326> <58D9> <2327> <58E2> <2328> <58E0> <2329> <58DA> <232A> <57E1> <232B> <584F> <232C> <5816> <232D> <5852> <232E> <581D> <232F> <5864> <2330> <858C> <2331> <8553> <2332> <85F6> <2333> <83A7> <2334> <8407> <2335> <84EF> <2336> <82E7> <2337> <8622> <2338> <8526> <2339> <584B> <233A> <7162> <233B> <8558> <233C> <84FD> <233D> <854E> <233E> <8588> <233F> <85BA> <2340> <7296> <2341> <6ECE> <2342> <8541> <2343> <85CE> <2344> <8552> <2345> <84C0> <2346> <8452> <2347> <8464> <2348> <8494> <2349> <8435> <234A> <859F> <234B> <8555> <234C> <9DAF> <234D> <8493> <234E> <7E08> <234F> <8546> <2350> <8562> <2351> <851E> <2352> <9A40> <2353> <863A> <2354> <93A3> <2355> <8577> <2356> <861E> <2357> <85FA> <2358> <8604> <2359> <85EA> <235A> <861A> <235B> <5969> <235C> <5C37> <235D> <636B> <235E> <6476> <235F> <649F> <2360> <6451> <2361> <645C> endbfchar 100 beginbfchar <2362> <64B3> <2363> <6504> <2364> <6516> <2365> <64F7> <2366> <64FC> <2367> <651B> <2368> <5630> <2369> <5638> <236A> <56C8> <236B> <56A6> <236C> <5504> <236D> <54BC> <236E> <5680> <236F> <565D> <2370> <5660> <2371> <5635> <2372> <55F6> <2373> <5666> <2374> <5672> <2375> <568C> <2376> <5665> <2377> <561C> <2378> <562E> <2379> <55E9> <237A> <5616> <237B> <56C0> <237C> <560D> <237D> <56B3> <237E> <56C1> <237F> <566F> <2380> <8F61> <2381> <56B6> <2382> <5695> <2383> <5707> <2384> <5E43> <2385> <5E6C> <2386> <5E58> <2387> <5E57> <2388> <5D87> <2389> <5CF4> <238A> <5D50> <238B> <5D2C> <238C> <5DA7> <238D> <5DA0> <238E> <5D97> <238F> <5D0D> <2390> <5DB8> <2391> <5D81> <2392> <5DD4> <2393> <5FA0> <2394> <7377> <2395> <7341> <2396> <736A> <2397> <733B> <2398> <736B> <2399> <7380> <239A> <737C> <239B> <98E0> <239C> <9933> <239D> <98E9> <239E> <993C> <23A1> <98ED> <23A2> <98F4> <23A3> <9909> <23A4> <9911> <23A5> <991B> <23A6> <9937> <23A7> <993F> <23A8> <9943> <23AC> <994C> <23AD> <9962> <23AE> <5EE1> <23AF> <8CE1> <23B0> <61FA> <23B1> <61AE> <23B2> <616A> <23B3> <613E> <23B4> <60B5> <23B5> <6134> <23B6> <61CC> <23B7> <615F> <23B8> <61E8> <23B9> <60FB> <23BA> <6137> <23BB> <60F2> <23BC> <6173> <23BD> <611C> <23BE> <6192> <23BF> <9582> <23C0> <9586> <23C1> <95C8> <23C2> <958E> <23C3> <9594> <23C4> <958C> <23C5> <95E5> <23C6> <95AD> <23C7> <95AB> <23C8> <9B2E> <23C9> <95AC> <23CA> <95BE> endbfchar 100 beginbfchar <23CB> <95B6> <23CC> <9B29> <23CD> <95BF> <23CE> <95BD> <23CF> <95BC> <23D0> <95C3> <23D1> <95CB> <23D2> <95D4> <23D3> <95D0> <23D4> <95D5> <23D5> <95DE> <23D6> <7043> <23D7> <6F59> <23D8> <7027> <23D9> <7018> <23DA> <6FFC> <23DB> <6D87> <23DC> <6D79> <23DD> <6E5E> <23DE> <6FAE> <23DF> <700F> <23E0> <6EF8> <23E1> <6F6F> <23E2> <6DF6> <23E3> <6F7F> <23E4> <7006> <23E5> <6FA0> <23E6> <700B> <23E7> <7067> <23E8> <7044> <23E9> <7005> <23EA> <6F77> <23EB> <7020> <23EC> <701F> <23ED> <7032> <23EE> <7028> <23EF> <705D> <23F0> <9A2B> <23F1> <9087> <23F2> <9015> <23F3> <9090> <23F4> <5C68> <23F5> <5F33> <23F6> <5AF5> <23F7> <5AD7> <23F8> <5B00> <23F9> <5A6D> <23FA> <5B08> <23FB> <5B4C> <23FC> <5AA7> <23FD> <5AFB> <23FE> <5B0B> <23FF> <5B21> <2400> <5B2A> <2401> <5B19> <2402> <99D4> <2403> <99DF> <2404> <99D9> <2405> <9A36> <2406> <9A5B> <2407> <99D1> <2408> <99D8> <2409> <9A4D> <240A> <9A4A> <240B> <99E2> <240C> <9A6A> <240D> <9A0F> <240E> <9A0D> <240F> <9A05> <2410> <9A42> <2411> <9A2D> <2412> <9A16> <2413> <9A41> <2414> <9A2E> <2415> <9A38> <2418> <9A4F> <2419> <9A65> <241A> <9A64> <241B> <7CF9> <241C> <7D06> <241D> <7D02> <2420> <7E8A> <2421> <7D1C> <2422> <7D15> <2423> <7D13> <2424> <7D3A> <2425> <7D32> <2426> <7D31> <2427> <7E10> <2428> <7D3C> <2429> <7D40> <242A> <7D3F> <242B> <7D5D> <242C> <7D4E> <242D> <7D73> <242E> <7D86> <242F> <7D83> <2430> <7D88> <2431> <7DBE> <2432> <7DBA> endbfchar 100 beginbfchar <2433> <7DCB> <2434> <7DD4> <2435> <7DC4> <2436> <7D9E> <2437> <7DAC> <2438> <7DB9> <2439> <7DA3> <243A> <7DB0> <243B> <7DC7> <243C> <7DD9> <243D> <7DD7> <243E> <7DF9> <243F> <7DF2> <2440> <7E62> <2441> <7DE6> <2442> <7DF6> <2443> <7DF1> <2444> <7E0B> <2445> <7DE1> <2446> <7E09> <2447> <7E1D> <2448> <7E1F> <2449> <7E1E> <244A> <7E2D> <244B> <7E0A> <244C> <7E11> <244D> <7E7D> <244E> <7E39> <244F> <7E35> <2450> <7E32> <2451> <7E46> <2452> <7E45> <2453> <7E88> <2454> <7E5A> <2455> <7E52> <2456> <7E6E> <2457> <7E7E> <2458> <7E70> <2459> <7E6F> <245A> <7E98> <245B> <74A3> <245C> <744B> <245D> <74CF> <245E> <980A> <245F> <74BD> <2460> <743F> <2461> <7489> <2462> <74A6> <2463> <74D4> <2464> <74DA> <2465> <97D9> <2466> <97DE> <2467> <97DC> <2468> <69AA> <2469> <6AEA> <246A> <6898> <246B> <68D6> <246C> <6A05> <246D> <689F> <246E> <6ADB> <246F> <6AF3> <2470> <6AE8> <2471> <6ADF> <2472> <6A89> <2473> <690F> <2474> <6A48> <2475> <6968> <2476> <69BF> <2477> <6A3A> <2478> <6A9C> <2479> <6B12> <247A> <6B1E> <247B> <6ADD> <247C> <69E7> <247D> <6B0F> <247E> <6B16> <247F> <6AEC> <2480> <6ADA> <2481> <6AF8> <2482> <6AB3> <2483> <6AE7> <2484> <6AA3> <2485> <6AD3> <2486> <6ADE> <2487> <6BA4> <2488> <6B9E> <2489> <6BAE> <248A> <6BAB> <248B> <6BAF> <248C> <8ED4> <248D> <8EDB> <248E> <8EF2> <248F> <8EFB> <2490> <8F64> <2491> <8EF9> <2492> <8EFC> <2493> <8EEB> <2494> <8EE4> <2495> <8F62> <2496> <8EFA> endbfchar 100 beginbfchar <2497> <8EFE> <2498> <8F0A> <2499> <8F07> <249A> <8F05> <249B> <8F12> <249C> <8F26> <249F> <8F1C> <24A0> <8F33> <24A1> <8F46> <24A2> <8F54> <24A3> <6214> <24A4> <6227> <24A5> <750C> <24A6> <66C7> <24A7> <66C4> <24A8> <6689> <24A9> <66D6> <24AA> <8CC1> <24AB> <8CB0> <24AC> <8CBA> <24AD> <8CBD> <24AE> <8D04> <24AF> <8CB2> <24B0> <8CC5> <24B1> <8D10> <24B2> <8CD1> <24B3> <8CDA> <24B4> <8CD5> <24B5> <8CEB> <24B6> <8CE7> <24B7> <8CFB> <24B8> <8998> <24B9> <89AC> <24BA> <89A1> <24BB> <89BF> <24BC> <89A6> <24BD> <89AF> <24BE> <89B2> <24BF> <89B7> <24C0> <6BFF> <24C1> <6C0C> <24C2> <6C2C> <24C3> <7258> <24C4> <6727> <24C5> <8156> <24C6> <81DA> <24C7> <811B> <24C8> <81BE> <24C9> <8161> <24CA> <81CF> <24CB> <6B5F> <24CE> <98B6> <24CF> <98BC> <24D0> <98C6> <24D1> <98C8> <24D2> <8F42> <24D3> <9F4F> <24D4> <6595> <24D5> <716C> <24D6> <7152> <24D7> <7197> <24D8> <71C1> <24D9> <71DC> <24DA> <71FE> <24DB> <79B0> <24DC> <798E> <24DD> <79AA> <24DE> <61DF> <24DF> <6164> <24E0> <61E3> <24E1> <6207> <24E2> <6FA9> <24E3> <78EF> <24E4> <78AD> <24E5> <7868> <24E6> <78B8> <24E7> <792A> <24E8> <7931> <24E9> <7864> <24EA> <78FD> <24EB> <78E7> <24EC> <78E3> <24ED> <9F95> <24EE> <7798> <24EF> <775E> <24F0> <77BC> <24F1> <7F86> <24F2> <7F88> <24F6> <91D9> <24F7> <91D7> <24F8> <91D5> <24F9> <91F7> <24FA> <91E7> <24FB> <91E4> <24FC> <9346> <24FD> <91F5> <24FE> <91F9> <24FF> <9208> <2500> <9226> <2501> <9245> endbfchar 100 beginbfchar <2502> <9211> <2503> <9210> <2504> <9201> <2505> <9227> <2506> <9204> <2507> <9225> <2508> <9200> <2509> <923A> <250A> <9266> <250B> <9237> <250C> <9233> <250D> <9255> <250E> <923D> <250F> <9238> <2510> <925E> <2513> <923F> <2514> <9460> <2515> <9230> <2516> <9249> <2517> <9248> <2518> <924D> <2519> <922E> <251A> <9239> <251B> <9438> <251C> <92AC> <251D> <92A0> <251E> <927A> <251F> <92AA> <2520> <92EE> <2521> <92CF> <2522> <9403> <2523> <92E3> <2524> <943A> <2525> <92B1> <2526> <92A6> <2527> <93A7> <2528> <9296> <2529> <92CC> <252A> <92A9> <252B> <93F5> <252C> <9293> <252D> <927F> <252E> <93A9> <252F> <929A> <2530> <931A> <2531> <92AB> <2532> <9283> <2533> <940B> <2534> <92A8> <2535> <92A3> <2536> <9412> <2537> <9338> <2538> <92F1> <2539> <93D7> <253A> <92E5> <253B> <92F0> <253C> <92EF> <253D> <92E8> <253E> <92BC> <253F> <92DD> <2540> <92F6> <2543> <92C3> <2544> <92DF> <2545> <92E6> <2546> <9312> <2547> <9306> <2548> <9369> <2549> <931B> <254A> <9340> <254B> <9301> <254C> <9315> <254D> <932E> <254E> <9343> <2551> <931F> <2552> <9319> <2553> <9365> <2554> <9347> <2555> <9376> <2556> <9354> <2557> <9364> <2558> <93AA> <2559> <9370> <255A> <9384> <255B> <93E4> <255C> <93D8> <255D> <9428> <255E> <9387> <255F> <93CC> <2560> <9398> <2561> <93B8> <2562> <93BF> <2563> <93A6> <2564> <93B0> <2565> <93B5> <2566> <944C> <2567> <93E2> <256A> <93CD> <256B> <93DE> <256C> <93C3> <256D> <93C7> endbfchar 100 beginbfchar <256E> <93D1> <256F> <9414> <2570> <941D> <2571> <93F7> <2572> <9465> <2573> <9413> <2574> <946D> <2575> <9420> <2576> <9479> <2577> <93F9> <2578> <9419> <2579> <944A> <257A> <9432> <257B> <943F> <257C> <9454> <257D> <9463> <257E> <937E> <257F> <7A61> <2580> <9CE9> <2581> <9CF6> <2582> <9D07> <2583> <9D06> <2584> <9D23> <2585> <9D87> <2586> <9E15> <2587> <9D1D> <2588> <9D1F> <2589> <9DE5> <258A> <9D2F> <258B> <9DD9> <258C> <9D30> <258D> <9D42> <258E> <9E1E> <258F> <9D53> <2590> <9E1D> <2591> <9D60> <2592> <9D52> <2593> <9DF3> <2594> <9D5C> <2595> <9D61> <2596> <9D93> <2597> <9D6A> <2598> <9D6F> <2599> <9D89> <259A> <9D98> <259B> <9D9A> <259C> <9DC0> <259D> <9DA5> <259E> <9DA9> <259F> <9DC2> <25A0> <9DBC> <25A1> <9E1A> <25A2> <9DD3> <25A3> <9DDA> <25A4> <9DEF> <25A5> <9DE6> <25A6> <9DF2> <25A7> <9DF8> <25A8> <9E0C> <25A9> <9DFA> <25AA> <9E1B> <25AB> <7664> <25AC> <7658> <25AD> <7667> <25AE> <7602> <25B1> <7649> <25B2> <761E> <25B3> <763B> <25B6> <7669> <25B7> <7672> <25B8> <7AC7> <25B9> <7AB6> <25BA> <8960> <25BB> <8933> <25BC> <895D> <25BD> <8947> <25BE> <8938> <25BF> <8964> <25C0> <76B8> <25C1> <802E> <25C2> <802C> <25C3> <8079> <25C4> <8075> <25C5> <9807> <25C8> <9821> <25C9> <981C> <25CA> <6F41> <25CB> <9826> <25CC> <9837> <25CD> <984E> <25CE> <9853> <25CF> <9873> <25D0> <9862> <25D1> <9859> <25D2> <9865> <25D3> <986C> <25D4> <9870> <25D5> <87E3> <25D6> <8806> <25D7> <8706> endbfchar 100 beginbfchar <25D8> <8823> <25D9> <87F6> <25DA> <86FA> <25DB> <87EF> <25DC> <8784> <25DD> <8810> <25DE> <87C8> <25DF> <8811> <25E0> <87BB> <25E1> <87CE> <25E2> <7F4C> <25E3> <7BE4> <25E4> <7B67> <25E5> <7C69> <25E6> <7BF3> <25E7> <7C00> <25E8> <7BCB> <25E9> <7C5C> <25EA> <7C1E> <25EB> <7C2B> <25EC> <7C23> <25ED> <7C6A> <25EE> <7C5F> <25EF> <8264> <25F0> <826B> <25F1> <88CA> <25F2> <7FA5> <25F3> <7CF2> <25F4> <7CF6> <25F5> <7CDD> <25F6> <7E36> <25F7> <9EA9> <25F8> <8DB2> <25F9> <91C5> <25FA> <91C3> <25FB> <9E7A> <25FC> <8E89> <25FD> <8E4C> <25FE> <8E92> <25FF> <8E7A> <2600> <8E55> <2601> <8E9A> <2602> <8E8B> <2603> <8E93> <2604> <8E91> <2605> <8EA1> <2606> <8E63> <2607> <8EAA> <2608> <8EA6> <2609> <89F4> <260A> <89F6> <260B> <975A> <260C> <9742> <260D> <973D> <260E> <9744> <260F> <9F54> <2610> <9F5F> <2611> <9F59> <2612> <9F60> <2613> <9F5C> <2614> <9F66> <2615> <9F6C> <2616> <9F6A> <2617> <9F77> <2618> <9EFD> <2619> <9EFF> <261A> <9F09> <261B> <8B8E> <261C> <947E> <261D> <93E8> <261E> <9B77> <261F> <9B74> <2620> <9B81> <2621> <9B83> <2622> <9B8E> <2623> <9C78> <2624> <7A4C> <2625> <9B92> <2626> <9C5F> <2627> <9B90> <2628> <9BAD> <2629> <9B9A> <262A> <9BAA> <262B> <9B9E> <262C> <9C6D> <262D> <9BAB> <262E> <9B9D> <262F> <9C58> <2630> <9BC1> <2631> <9C7A> <2632> <9C31> <2633> <9C39> <2634> <9C23> <2635> <9C37> <2636> <9BC0> <2637> <9BCA> <2638> <9BC7> <2639> <9BFD> <263A> <9BD6> <263D> <9BE1> endbfchar 100 beginbfchar <263E> <9BE4> <263F> <9BE7> <2640> <9BDD> <2641> <9BE2> <2642> <9BF0> <2643> <9BDB> <2644> <9BF4> <2645> <9BD4> <2646> <9C5D> <2647> <9C08> <2648> <9C10> <2649> <9C0D> <264A> <9C12> <264B> <9C09> <264C> <9BFF> <264D> <9C20> <264E> <9C32> <264F> <9C2D> <2650> <9C28> <2651> <9C25> <2652> <9C29> <2653> <9C33> <2654> <9C3E> <2655> <9C48> <2656> <9C3B> <2657> <9C35> <2658> <9C45> <2659> <9C56> <265A> <9C54> <265B> <9C52> <265C> <9C67> <265D> <97C3> <265E> <97BD> <265F> <97C9> <2660> <9DBB> <2661> <9ACF> <2662> <9AD6> <2663> <9AD5> <2664> <9B58> <2665> <9B4E> <2666> <9957> <2667> <995C> <2668> <9B22> <2669> <9EF7> <266A> <9EF2> <266B> <896C> <266C> <95C6> <266D> <9336> <266E> <5F46> <266F> <8514> <2670> <7E94> <2671> <9F63> <2672> <5679> <2673> <9F15> <2674> <5641> <2675> <9AEE> <2676> <8907> <2677> <7A40> <2678> <98B3> <2679> <95A4> <267A> <9B0D> <267B> <8FF4> <267C> <5F59> <267D> <7A6B> <267E> <98E2> <267F> <50A2> <2680> <8591> <2681> <5118> <2682> <6372> <2683> <524B> <2684> <774F> <2685> <7E8D> <2686> <66C6> <2687> <77AD> <2688> <9E75> <2689> <56C9> <268A> <9EF4> <268B> <6FDB> <268C> <61DE> <268D> <77C7> <268E> <7030> <268F> <9EB5> <2690> <884A> <2691> <95E2> <2692> <97C6> <2693> <7C64> <2694> <7E34> <2695> <97A6> <2696> <9EAF> <2697> <56CC> <2698> <98B1> <2699> <6AAF> <269A> <7F4E> <269B> <7CF0> <269C> <4FC2> <269D> <7E6B> <269E> <9E79> <269F> <56AE> <26A0> <9B1A> <26A1> <846F> endbfchar 100 beginbfchar <26A2> <79A6> <26A3> <7C72> <26A4> <9AD2> <26A5> <96BB> <26A6> <7DFB> <26A7> <88FD> <26A8> <7843> <26B5> <02D9> <26B6> <2013> <26B7> <2015> <26B8> <2025> <26B9> <2035> <26BA> <2105> <26BB> <2109> <26C0> <2215> <26C1> <221F> <26C2> <2223> <26C3> <2252> <26C6> <22BF> <26FF> <25E2> <2703> <2609> <2704> <2295> <2705> <3012> <2711> <32A3> <2717> <33A1> <2718> <33C4> <2719> <33CE> <271C> <33D5> <271D> <FE30> <271E> <FFE2> <271F> <FFE4> <2720> <2121> <2721> <3231> <2722> <2010> <2723> <30FC> <2728> <3006> <2758> <4E02> <275C> <4E0F> <275D> <4E12> <275E> <4E17> <2762> <4E23> <2763> <4E26> <2764> <4E29> <2767> <4E31> <2768> <4E33> <2769> <4E35> <276A> <4E37> <276B> <4E3C> <276F> <4E44> <2770> <4E46> <2771> <4E4A> <2772> <4E51> <2773> <4E55> <2774> <4E57> <2783> <4E72> <2794> <4E87> <2795> <4E8A> <2796> <4E90> <2799> <4E99> <279C> <4EA3> <279D> <4EAA> <27A1> <4EB4> <27A9> <4EC8> <27AA> <4ECC> <27AD> <4ED2> <27B1> <4EE0> <27B2> <4EE2> <27B5> <4EE9> <27B9> <4EF1> <27BA> <4EF4> <27BE> <4EFC> <27BF> <4EFE> <27C0> <4F00> <27D1> <4F21> <27D2> <4F23> <27D8> <4F31> <27D9> <4F33> <27DA> <4F35> <27DB> <4F37> <27DC> <4F39> <27DD> <4F3B> <27EB> <4F52> <27EC> <4F54> <27ED> <4F56> <27F0> <4F66> <27F1> <4F68> <27F8> <4F75> <27FD> <4F7D> <2800> <4F82> <2801> <4F85> <2802> <4F87> <2803> <4F8A> <2804> <4F8C> <2805> <4F8E> <2806> <4F90> <2809> <4F95> <280D> <4F9C> <2812> <4FA4> <2813> <4FAB> <2814> <4FAD> endbfchar 100 beginbfchar <2831> <4FD9> <2832> <4FDB> <2833> <4FE2> <2836> <4FE7> <2839> <4FF0> <283A> <4FF2> <283F> <4FF9> <2843> <4FFF> <284B> <500A> <284C> <500E> <284D> <5010> <284E> <5013> <2852> <501B> <2855> <5020> <2859> <5027> <2865> <503B> <2866> <503D> <2870> <504D> <287A> <505B> <28A7> <5097> <28B0> <50A4> <28B1> <50A6> <28B8> <50B6> <28CA> <50D0> <28E1> <50F4> <28E5> <50FA> <28EA> <5101> <28EB> <5103> <28EC> <5105> <28ED> <510A> <28F2> <5111> <28F3> <5113> <28FC> <5120> <2914> <5142> <2915> <5147> <2916> <514A> <2917> <514C> <291B> <5153> <291F> <515B> <2929> <516A> <292A> <516F> <292B> <5172> <292C> <517A> <293B> <5198> <293C> <519A> <2940> <51A1> <2941> <51A3> <2949> <51B4> <2952> <51C5> <2953> <51C8> <2954> <51CA> <2955> <51CE> <2956> <51D0> <2960> <51DC> <296B> <51EC> <296C> <51EE> <296D> <51F2> <296E> <51F4> <296F> <51F7> <2970> <51FE> <2973> <5209> <297B> <521C> <2984> <522A> <2985> <522C> <2986> <522F> <298B> <523C> <298C> <523E> <2995> <5255> <299A> <525D> <29A0> <5266> <29A1> <5268> <29A7> <5273> <29AF> <527E> <29B0> <5280> <29B4> <528B> <29B7> <5292> <29BF> <529C> <29D1> <52C0> <29D2> <52C2> <29D6> <52C8> <29D7> <52CA> <29DC> <52D1> <29DF> <52D7> <29E0> <52DA> <29E1> <52DC> <29E4> <52E3> <29FC> <5307> <2A00> <530C> <2A01> <530E> <2A06> <5318> <2A0B> <5322> <2A13> <5330> <2A1D> <5342> <2A1E> <5344> <2A1F> <5346> <2A23> <5350> <2A26> <535B> <2A27> <535D> <2A28> <5365> <2A29> <5368> endbfchar 100 beginbfchar <2A2A> <536A> <2A2D> <5372> <2A2E> <5376> <2A2F> <5379> <2A36> <5383> <2A39> <538A> <2A45> <539E> <2A46> <53A1> <2A47> <53A4> <2A48> <53A7> <2A4F> <53B3> <2A50> <53B5> <2A58> <53C0> <2A62> <53D5> <2A63> <53DA> <2A67> <53E1> <2A68> <53E7> <2A69> <53F4> <2A6A> <53FA> <2A6E> <5402> <2A6F> <5405> <2A70> <5407> <2A71> <540B> <2A72> <5414> <2A76> <541C> <2A77> <5422> <2A7A> <542A> <2A7B> <5430> <2A7C> <5433> <2A7F> <543A> <2A80> <543D> <2A81> <543F> <2A86> <5447> <2A87> <5449> <2A8C> <5451> <2A8D> <545A> <2A93> <5463> <2A94> <5465> <2A95> <5467> <2A9E> <5474> <2AA3> <5481> <2AA4> <5483> <2AA5> <5485> <2AAA> <548D> <2AAB> <5491> <2AAC> <5493> <2AAF> <549C> <2AB5> <54A5> <2AB6> <54AE> <2AB7> <54B0> <2AB8> <54B2> <2ABE> <54BE> <2ABF> <54C3> <2AC0> <54C5> <2AC3> <54D6> <2AC4> <54D8> <2AC5> <54DB> <2AC6> <54E0> <2AD5> <54FB> <2AD6> <54FE> <2AD7> <5500> <2ADA> <5505> <2ADB> <5508> <2AED> <5521> <2AF2> <552B> <2AF3> <552D> <2AF4> <5532> <2AFC> <553D> <2AFD> <5540> <2AFE> <5542> <2AFF> <5545> <2B08> <5554> <2B0E> <555D> <2B15> <556B> <2B1E> <557D> <2B1F> <557F> <2B25> <5590> <2B2D> <559E> <2B37> <55AB> <2B38> <55AD> <2B3B> <55B4> <2B3C> <55B6> <2B3D> <55B8> <2B3E> <55BA> <2B3F> <55BC> <2B45> <55C8> <2B4A> <55D5> <2B4E> <55DB> <2B4F> <55DE> <2B50> <55E0> <2B51> <55E2> <2B52> <55E7> <2B57> <55F4> <2B5D> <55FF> <2B62> <5607> <2B69> <5615> <2B6C> <561D> <2B72> <5628> <2B75> <5633> <2B76> <5637> endbfchar 100 beginbfchar <2B77> <563A> <2B7B> <5640> <2B91> <5661> <2B92> <5663> <2B93> <5667> <2B96> <5670> <2B97> <5673> <2B98> <5675> <2B99> <5677> <2B9A> <567A> <2BA6> <568D> <2BAA> <5694> <2BB9> <56A7> <2BC2> <56B5> <2BCE> <56CB> <2BD9> <56DC> <2BDA> <56E3> <2BE1> <56EC> <2BEE> <5705> <2BEF> <570C> <2BF6> <5717> <2BFF> <5724> <2C03> <572B> <2C0D> <573F> <2C0E> <5741> <2C15> <574B> <2C1F> <5765> <2C20> <5767> <2C21> <576C> <2C22> <576E> <2C44> <57A5> <2C45> <57A8> <2C46> <57AA> <2C47> <57AC> <2C4B> <57B3> <2C63> <57D3> <2C68> <57DE> <2C73> <57EE> <2C7E> <5801> <2C83> <580C> <2C8F> <581F> <2CB0> <584E> <2CB1> <5850> <2CB2> <5853> <2CBD> <5863> <2CD2> <587F> <2CD3> <5882> <2CD4> <5884> <2CE4> <589B> <2CE5> <589D> <2CFD> <58BD> <2D03> <58C6> <2D0D> <58D2> <2D0E> <58D4> <2D14> <58E1> <2D15> <58E3> <2D1A> <58EA> <2D1B> <58ED> <2D28> <5903> <2D30> <590E> <2D37> <591B> <2D3C> <5923> <2D3D> <5926> <2D3E> <5928> <2D3F> <592C> <2D40> <5930> <2D45> <593B> <2D46> <593D> <2D49> <5943> <2D4C> <594A> <2D4F> <5950> <2D52> <5959> <2D58> <5961> <2D5E> <596B> <2D5F> <596D> <2D64> <5975> <2D65> <5977> <2D6C> <5985> <2D6D> <5989> <2D76> <5998> <2D8A> <59BA> <2D9D> <59D9> <2D9E> <59DB> <2DA4> <59E4> <2DB6> <59FA> <2DBA> <5A00> <2DBB> <5A02> <2DC2> <5A12> <2DCE> <5A24> <2DD9> <5A33> <2DDA> <5A35> <2E00> <5A65> <2E3E> <5AB4> <2E54> <5AD3> <2E55> <5AD5> <2E5C> <5AE2> <2E61> <5AEA> <2E7A> <5B0A> <2E81> <561F> <2E84> <5623> endbfchar 100 beginbfchar <2E84> <5B18> <2E88> <5626> <2E8B> <5627> <2E8C> <562C> <2E97> <562D> <2E99> <5B31> <2E9A> <5B33> <2EA7> <563A> <2EAA> <563D> <2EAE> <5640> <2EB2> <5B52> <2EB3> <5642> <2EB3> <5B56> <2EB4> <5B5E> <2EBB> <5648> <2EBC> <5B72> <2EBD> <5B74> <2EC0> <5B79> <2EC3> <5B7E> <2EC4> <5B82> <2EC5> <5B86> <2EC6> <5B8A> <2ECA> <5652> <2ECC> <5B94> <2ECD> <5B96> <2ECE> <5B9F> <2ED8> <5BB7> <2EDE> <5BC3> <2EE6> <5BD1> <2EF0> <5BE0> <2EF1> <5BE3> <2EF2> <5BEA> <2EF3> <5BED> <2EF4> <5BEF> <2EF9> <5BF7> <2EFC> <5C00> <2EFF> <5C05> <2F00> <5C0C> <2F01> <5C10> <2F04> <5C17> <2F05> <5C19> <2F06> <5C1B> <2F0B> <5C23> <2F0C> <5C26> <2F29> <5C5F> <2F2A> <5C67> <2F2E> <5C6D> <2F2F> <5C70> <2F3B> <5C80> <2F48> <5C95> <2F52> <5CAA> <2F56> <5CB2> <2F57> <5CB4> <2F58> <5CB6> <2F5D> <5CBE> <2F5E> <5CC0> <2F7C> <5CE7> <2F7D> <5CE9> <2F85> <5CF5> <2F8A> <5CFC> <2F9B> <5D15> <2FA6> <5D25> <2FA7> <5D28> <2FCD> <5D5C> <2FD9> <5D6A> <2FEC> <5D83> <2FFE> <5D98> <2FFF> <5D9A> <3019> <5DB9> <301A> <5DBB> <3028> <5DCC> <302D> <5DD3> <3034> <5DDC> <3039> <5DEA> <303E> <274B> <3045> <5E04> <3046> <5E07> <304E> <5E17> <3059> <5E2C> <305C> <5E32> <3063> <5E41> <3071> <5E56> <3076> <5E60> <3083> <5E75> <3084> <5E77> <3088> <5E85> <308E> <5E92> <308F> <5E98> <3090> <5E9B> <3091> <5E9D> <3099> <5EAC> <309F> <5EB4> <30C1> <5EE9> <30C2> <5EEB> <30C9> <5EF5> <30D2> <5F09> <30D6> <5F10> <30D7> <5F12> <30D8> <5F14> <30D9> <5F16> endbfchar 100 beginbfchar <30E3> <5F28> <30E6> <5F2E> <30E7> <5F30> <30E8> <5F32> <30E9> <5F34> <30ED> <5F3B> <30F6> <5F47> <30FA> <5F4D> <30FB> <5F4F> <30FC> <5F51> <30FD> <5F54> <3100> <5F5C> <3104> <5F63> <3105> <5F65> <3108> <5F6B> <310B> <5F72> <310F> <5F78> <3110> <5F7A> <3114> <5F83> <3115> <5F86> <311B> <5F96> <311E> <5F9D> <311F> <5F9F> <312E> <5FB6> <312F> <5FB8> <313B> <5FCE> <314A> <5FEC> <3154> <5FFC> <315C> <6013> <315F> <601A> <3174> <6040> <317C> <604C> <317F> <6051> <318D> <606E> <3192> <6077> <3193> <607E> <31A1> <6093> <31A2> <6095> <31A6> <609C> <31A7> <609E> <31AC> <60A7> <31AF> <60AE> <31B0> <60B0> <31B1> <60B3> <31B2> <60B7> <31CA> <60D9> <31CB> <60DB> <31CC> <60DE> <31D1> <60EA> <31D2> <60F5> <31DD> <6107> <31EE> <6125> <320A> <6149> <320B> <614D> <3213> <6159> <3216> <615E> <321B> <6169> <321E> <616F> <3221> <6174> <3235> <618F> <3236> <6193> <3246> <61AA> <3247> <61AD> <325F> <61D3> <326E> <61E7> <327A> <61F9> <327B> <61FB> <327C> <61FD> <3282> <6209> <3283> <6213> <3284> <6219> <3288> <6220> <3289> <6223> <328A> <6226> <328D> <622B> <328E> <622D> <328F> <622F> <3290> <6231> <3298> <6242> <329C> <624A> <32AD> <6268> <32B6> <627D> <32C4> <6294> <32C5> <6299> <32C9> <62A3> <32D8> <62BA> <32D9> <62BE> <32DC> <62C3> <32DD> <62CB> <32DE> <62CF> <32DF> <62D1> <32E0> <62D5> <32E5> <62E4> <32E8> <62F0> <32E9> <62F2> <32EA> <62F5> <32EF> <6300> <3300> <6319> <3301> <631C> <3304> <6329> endbfchar 100 beginbfchar <3315> <6344> <3318> <634A> <3325> <6360> <3329> <636A> <332A> <636C> <3336> <6381> <3339> <638B> <333A> <638D> <333B> <6391> <333F> <6397> <3347> <63A1> <3348> <63A4> <3349> <63A6> <334A> <63AB> <334B> <63AF> <3350> <63B9> <3351> <63BB> <3352> <63BD> <3353> <63BF> <3357> <63C5> <335D> <63D1> <3367> <63DF> <3368> <63E2> <3373> <63F3> <3374> <63F5> <3375> <63F7> <337A> <63FE> <3382> <640E> <338A> <641D> <338B> <641F> <3393> <642B> <339A> <6435> <33A0> <643E> <33A1> <6440> <33A4> <6449> <33AB> <6453> <33B2> <645D> <33BA> <6468> <33BE> <646E> <33C4> <6477> <33CB> <6483> <33CC> <6486> <33D5> <6494> <33E2> <64AA> <33E3> <64AF> <33E4> <64B1> <33E5> <64B4> <33E6> <64B6> <33E7> <64B9> <33E8> <64BD> <33E9> <64C3> <33EA> <64C6> <33ED> <64CC> <33EE> <64CF> <33EF> <64D1> <33F0> <64D3> <33F3> <64D9> <33F7> <64DF> <33F8> <64E1> <33F9> <64E3> <33FA> <64E5> <3402> <64F3> <3407> <64FD> <3408> <64FF> <340C> <6505> <3416> <6513> <3417> <6515> <3418> <6517> <3419> <651A> <341A> <651C> <3423> <652D> <3428> <6537> <3429> <653A> <3437> <6550> <343B> <6558> <343C> <655A> <343D> <655C> <3447> <5625> <344A> <6571> <344B> <6573> <344C> <6576> <345F> <6592> <3460> <6594> <3461> <6596> <3462> <6598> <3463> <659A> <3466> <65A0> <3469> <65A6> <346A> <65A8> <346B> <65AA> <346C> <65AE> <3473> <5624> <3473> <65B8> <3479> <65C2> <347E> <65CD> <348C> <65E1> <349C> <6601> <34A2> <660B> <34A3> <660D> <34AD> <661E> endbfchar 100 beginbfchar <34B2> <6626> <34B7> <662E> <34B8> <6630> <34C0> <663D> <34D2> <665E> <34D3> <6660> <34D6> <6665> <34D7> <6667> <34E0> <6675> <34E9> <6683> <34FF> <66A3> <3519> <66C5> <351A> <66C8> <3529> <66DA> <3538> <66F1> <353D> <66FD> <3544> <670C> <354A> <6716> <354E> <671C> <354F> <671E> <3556> <6729> <3557> <672E> <3558> <6730> <3563> <6741> <3566> <6747> <3569> <674D> <356A> <6752> <3572> <675D> <357A> <676E> <357B> <6774> <357C> <6776> <3581> <677D> <3582> <6780> <3587> <6788> <3588> <678A> <3591> <6796> <3592> <6799> <3593> <679B> <3597> <67A4> <3598> <67A6> <3599> <67A9> <359A> <67AC> <359B> <67AE> <359E> <5629> <359E> <67B4> <35A7> <67C2> <35B5> <67DB> <35B6> <67DF> <35B7> <67E1> <35C1> <67F2> <35CA> <67FE> <35CF> <6806> <35D0> <680D> <35D1> <6810> <35D2> <6812> <35F0> <683F> <35F1> <6847> <35F2> <684B> <35F3> <684D> <35F4> <684F> <35F5> <6852> <3600> <686A> <3609> <6875> <360E> <562B> <3613> <6882> <3614> <6884> <361A> <562A> <3627> <689E> <3631> <68AE> <3634> <68B4> <363F> <68C1> <3646> <68CA> <3647> <68CC> <364E> <68D9> <365E> <68EF> <3665> <68FB> <3672> <690C> <3673> <6911> <3697> <693E> <36AF> <695F> <36B4> <6967> <36B7> <696C> <36BD> <6976> <36C3> <6981> <36C4> <6983> <36C5> <6985> <36DD> <69A9> <36DE> <69AC> <36EB> <69C0> <36F4> <69CF> <3700> <69DE> <3719> <69FE> <371A> <6A00> <3730> <6A20> <3731> <6A22> <3736> <6A29> <373B> <6A30> <3757> <6A5A> <375B> <6A60> <3780> <6A8F> endbfchar 100 beginbfchar <378C> <6AA1> <3792> <6AAA> <37BA> <6ADC> <37C2> <6AE9> <37C3> <6AEB> <37ED> <6B1F> <37FE> <6B38> <37FF> <6B3B> <3800> <6B3C> <3807> <6B48> <381A> <6B60> <3828> <6B7A> <382D> <6B85> <382E> <6B88> <382F> <6B8C> <3836> <6B97> <3837> <6B99> <3847> <6BB6> <384D> <6BC0> <3854> <6BCC> <3855> <6BCE> <3858> <6BD8> <3859> <6BDA> <386D> <6BF4> <3874> <6BFE> <387D> <6C0E> <387E> <6C12> <387F> <6C17> <3883> <6C20> <3884> <6C25> <3885> <6C2D> <3886> <6C31> <3887> <6C33> <3893> <6C48> <389C> <6C56> <38AA> <6C71> <38AB> <6C73> <38AC> <6C75> <38B4> <6C84> <38B5> <6C87> <38C0> <6C9A> <38C4> <6CA0> <38C5> <6CA2> <38C6> <6CA8> <38C7> <6CAC> <38CE> <6CBA> <38D6> <6CCB> <38E1> <6CDF> <38E2> <6CE4> <38E5> <6CE9> <38E8> <6CF2> <38E9> <6CF4> <38EA> <6CF9> <38F4> <6D0D> <38FC> <6D18> <38FF> <6D1F> <3905> <6D26> <390C> <6D34> <3910> <6D3A> <3913> <6D42> <3914> <6D44> <3915> <6D49> <3916> <6D4C> <3917> <6D50> <3918> <562F> <391C> <6D5B> <391D> <6D5D> <391E> <6D5F> <3937> <6D86> <393A> <6D8D> <393D> <6D92> <3943> <6D9C> <3944> <6DA2> <3945> <6DA5> <3962> <6DD7> <3966> <6DDF> <3969> <6DE5> <396D> <6DED> <396E> <562E> <3970> <6DF2> <3971> <6DF4> <3972> <6DF8> <397F> <6E0B> <3980> <6E0F> <3983> <6E15> <398A> <6E22> <398D> <6E2A> <398E> <6E2E> <3991> <6E33> <3995> <6E39> <39A9> <6E55> <39AA> <6E57> <39CD> <6E84> <39CF> <5631> <39D0> <5634> <39DA> <6E97> <39DE> <6E9E> <39DF> <5632> <39E3> <6EA6> <39EA> <6EB0> endbfchar 100 beginbfchar <39EB> <6EB3> <39EC> <6EB5> <39EF> <6EBC> <39F3> <6EC3> <39F4> <6EC6> <39F8> <6ECD> <39F9> <6ED0> <39FA> <6ED2> <39FB> <6ED6> <3A00> <6EDD> <3A01> <6EE3> <3A02> <6EE7> <3A09> <6EF3> <3A11> <6F00> <3A28> <6F21> <3A2D> <6F2E> <3A2E> <6F30> <3A31> <6F37> <3A37> <6F40> <3A3F> <6F4C> <3A4A> <6F5D> <3A4E> <6F63> <3A4F> <6F65> <3A56> <6F71> <3A57> <6F73> <3A5A> <6F79> <3A5B> <6F7B> <3A61> <6F85> <3A73> <5633> <3A77> <6FA8> <3A7E> <6FB2> <3AAF> <6FFB> <3AB0> <6FFD> <3AB9> <700A> <3ABD> <7010> <3AC3> <7019> <3AC4> <701C> <3AC5> <701E> <3AD2> <7031> <3AE9> <7050> <3AFC> <706E> <3B00> <7074> <3B01> <7077> <3B05> <707D> <3B13> <7093> <3B25> <70B0> <3B26> <70B2> <3B2A> <70BA> <3B31> <70C9> <3B3E> <70DA> <3B46> <70E5> <3B47> <70EA> <3B48> <70EE> <3B4E> <5637> <3B4F> <70F8> <3B65> <7114> <3B66> <7117> <3B8E> <714B> <3B8F> <714D> <3B9C> <715D> <3BA0> <7163> <3BA1> <7165> <3BA4> <716D> <3BAC> <7179> <3BC0> <7193> <3BD6> <71B2> <3BD7> <71B4> <3BE1> <71C2> <3BEE> <71D3> <3BFF> <71EF> <3C0A> <71FD> <3C24> <721C> <3C2F> <7229> <3C30> <722B> <3C36> <723C> <3C48> <7257> <3C49> <725A> <3C4A> <725C> <3C4B> <725E> <3C4C> <7260> <3C50> <7268> <3C65> <728C> <3C66> <728E> <3C6E> <5638> <3C7E> <72AE> <3C82> <72B5> <3C90> <72CF> <3C91> <72D1> <3C96> <72D8> <3C9B> <72DF> <3CA9> <7302> <3CB7> <7314> <3CC2> <732D> <3CC7> <7335> <3CC8> <733A> <3CCB> <7340> <3CD7> <7351> <3CE0> <5639> <3CEB> <7369> <3CEC> <736E> endbfchar 100 beginbfchar <3CED> <7371> <3CF0> <7376> <3CF1> <7379> <3CF2> <737D> <3CF3> <737F> <3CF9> <7388> <3CFA> <738A> <3CFF> <7392> <3D12> <73AA> <3D15> <73B1> <3D1F> <73C1> <3D27> <73CE> <3D33> <73DF> <3D38> <73E6> <3D39> <73E8> <3D50> <7404> <3D68> <7427> <3D69> <7429> <3D6A> <742B> <3D6B> <742D> <3D6C> <742F> <3D76> <7440> <3D89> <7456> <3D8A> <7458> <3D8B> <745D> <3DA3> <747F> <3DA4> <7482> <3DA8> <7488> <3DA9> <748A> <3DAC> <748F> <3DB8> <749D> <3DE2> <74D3> <3DE8> <74DB> <3DE9> <74DD> <3DEA> <74DF> <3DEB> <74E1> <3DEC> <74E5> <3DF8> <74F5> <3E0B> <750E> <3E0C> <7510> <3E0D> <7512> <3E12> <751B> <3E18> <7524> <3E1B> <752A> <3E1C> <752E> <3E1D> <7534> <3E1E> <7536> <3E1F> <7539> <3E22> <753F> <3E2B> <754D> <3E43> <7573> <3E44> <7575> <3E45> <7577> <3E56> <7590> <3E57> <7593> <3E58> <7595> <3E59> <7598> <3E5C> <759E> <3E5D> <75A2> <3E63> <75AD> <3E6B> <75C6> <3E72> <75D3> <3E73> <75D7> <3E74> <75DA> <3E7A> <75E5> <3E7B> <75E9> <3E8A> <7604> <3E95> <7616> <3E96> <761A> <3E99> <7623> <3E9A> <7628> <3E9B> <762C> <3EA4> <763D> <3EA5> <7641> <3EA8> <7648> <3EB1> <7655> <3EB2> <7657> <3EB6> <765D> <3EB9> <7666> <3EBA> <7668> <3EBB> <766A> <3EC6> <7683> <3EC7> <7685> <3ECE> <7692> <3EE7> <76B3> <3EEB> <76B9> <3EF4> <76C7> <3EF5> <76C9> <3EF8> <76D3> <3EF9> <76D5> <3EFE> <76E0> <3EFF> <76E2> <3F00> <76E6> <3F07> <76F0> <3F08> <76F3> <3F0E> <76FD> <3F15> <770A> <3F16> <770C> <3F26> <7721> <3F2A> <7727> endbfchar 100 beginbfchar <3F2E> <772E> <3F34> <7739> <3F35> <773B> <3F39> <7742> <3F50> <7764> <3F51> <7767> <3F78> <77A1> <3F7B> <77A6> <3F7C> <77A8> <3F7D> <77AB> <3F82> <77B4> <3F88> <77BE> <3FA5> <77E4> <3FA6> <77E6> <3FA7> <77E8> <3FA8> <77EA> <3FAE> <77F7> <3FBE> <7813> <3FBF> <7815> <3FC0> <7819> <3FC1> <781B> <3FC2> <781E> <3FC6> <7824> <3FC7> <7828> <3FD1> <783D> <3FD2> <783F> <3FD5> <7844> <3FD6> <7846> <3FDB> <784D> <3FDC> <784F> <3FDD> <7851> <3FEE> <7869> <4004> <7888> <4009> <7892> <400D> <7899> <4010> <78A0> <4011> <78A2> <4012> <78A4> <4013> <78A6> <4014> <78A8> <401D> <78BB> <401E> <78BD> <4043> <78F3> <4056> <563E> <406A> <7925> <4079> <793D> <407A> <793F> <407F> <7947> <408D> <7961> <4090> <7966> <4095> <796E> <409D> <7979> <40C5> <79AF> <40C6> <79B2> <40CC> <79BC> <40CD> <79BF> <40CE> <79C2> <40D3> <79CA> <40D4> <79CC> <40E5> <79E5> <40E6> <79E8> <40E7> <79EA> <40E8> <79EC> <40E9> <79EE> <40F3> <79FC> <40F6> <7A01> <40FD> <7A0C> <410A> <7A1F> <4119> <7A32> <411D> <7A38> <411E> <7A3A> <411F> <7A3E> <4140> <7A6A> <4148> <7A75> <414D> <7A82> <414E> <7A85> <414F> <7A87> <415C> <7A9E> <415F> <563F> <4161> <7AA7> <4162> <7AAB> <4174> <7AC6> <4175> <7AC9> <4188> <7AE4> <418E> <7AEE> <4199> <7AFE> <419D> <7B05> <419E> <7B07> <419F> <7B09> <41A3> <7B10> <41A9> <7B1A> <41AC> <7B1F> <41B0> <7B27> <41B1> <7B29> <41B2> <7B2D> <41B5> <7B32> <41BA> <7B39> <41BB> <7B3B> <41BC> <7B3D> <41C3> <7B48> endbfchar 100 beginbfchar <41C4> <7B4A> <41C7> <7B53> <41C8> <7B55> <41C9> <7B57> <41CA> <7B59> <41CB> <7B5C> <41CE> <7B61> <41DD> <7B76> <41DE> <7B78> <41DF> <7B7A> <41E2> <7B7F> <41EC> <7B8C> <41F2> <7B96> <420E> <7BC5> <420F> <7BC8> <4210> <7BCA> <4215> <7BD2> <4229> <7BF2> <4231> <7BFD> <4232> <7BFF> <423C> <7C0E> <424A> <7C20> <424B> <7C22> <4260> <7C42> <4280> <7C6B> <4281> <7C6D> <429F> <7C96> <42A5> <7CA3> <42BB> <7CC6> <42BC> <7CC9> <42BD> <7CCB> <42C5> <7CD8> <42D4> <7CF1> <42D5> <7CF3> <42D6> <7CF5> <42D7> <7CF7> <42D8> <7CFA> <42DB> <7CFF> <42DC> <7D01> <42DD> <7D03> <42DE> <7D0C> <42E3> <7D16> <42E4> <7D18> <42F7> <7D3B> <42FA> <7D41> <42FB> <7D43> <42FC> <7D45> <4304> <7D4F> <4316> <7D67> <4320> <7D78> <4328> <7D82> <432B> <7D87> <433C> <7D9D> <433F> <672F> <4346> <7DAF> <434A> <7DBC> <4358> <7DD3> <435E> <7DDF> <435F> <7DE2> <4362> <7DE7> <4367> <7DF0> <4368> <7DF3> <4369> <7DF5> <436C> <7DFA> <4386> <7E1C> <4390> <7E2C> <4393> <7E33> <4394> <7E38> <4395> <7E3A> <4396> <7E3C> <43A6> <7E53> <43AC> <5647> <43B1> <5646> <43B7> <7E6C> <43C9> <7E89> <43CA> <7E8B> <43CB> <7E8E> <43CF> <7E95> <43D0> <7E97> <43D5> <7EAE> <43D6> <7EB4> <43D9> <7ED6> <43DA> <7EE4> <43DB> <7EEC> <43DC> <7EF9> <43DD> <5649> <43DD> <7F0A> <43DE> <7F10> <43DF> <7F1E> <43E0> <7F37> <43E1> <7F39> <43E9> <7F43> <43F0> <7F4D> <43F1> <7F4F> <43F4> <7F56> <43F5> <7F59> <43FA> <7F60> <4403> <7F6F> <4404> <7F73> <4407> <7F78> endbfchar 100 beginbfchar <4411> <7F87> <4412> <7F89> <4413> <7F8B> <4414> <7F8D> <4421> <7FA0> <4424> <7FA6> <4425> <7FA8> <442B> <7FB1> <4433> <7FBE> <4434> <7FC0> <443C> <7FCB> <443D> <7FCD> <4441> <7FD3> <4453> <7FEF> <4454> <7FF2> <445A> <7FFA> <445E> <8002> <4465> <8011> <4466> <8013> <446C> <8021> <446F> <802B> <4470> <802D> <4473> <8032> <4474> <8034> <4477> <803C> <4478> <803E> <4484> <8053> <4485> <8055> <4486> <8057> <4487> <8059> <4499> <8074> <449A> <8078> <44A0> <8088> <44A1> <808A> <44AA> <8097> <44AB> <8099> <44AC> <809E> <44AD> <80A3> <44B1> <80AC> <44B2> <80B0> <44B3> <80B3> <44B8> <80BB> <44B9> <80C5> <44C6> <80D8> <44CB> <80E6> <44CC> <80EE> <44CD> <80F5> <44CE> <80F7> <44CF> <80F9> <44D0> <80FB> <44D6> <564A> <44DB> <8115> <44DC> <8117> <44DD> <8119> <44EF> <8130> <44F3> <8137> <44FF> <8147> <4500> <8149> <4501> <814D> <4502> <814F> <4503> <8152> <450E> <8168> <450F> <816A> <4510> <816C> <4511> <816F> <4517> <8181> <451D> <8189> <4522> <8190> <4529> <8199> <4530> <81A7> <453F> <81BC> <4544> <81CB> <4545> <81CE> <454E> <81D9> <4558> <81E9> <4559> <81EB> <4564> <81FD> <4565> <81FF> <4566> <8203> <4567> <820B> <456A> <8211> <456B> <8213> <4572> <821D> <4573> <8220> <4578> <8229> <4579> <822E> <457A> <8232> <457B> <823A> <4585> <8248> <4586> <824A> <459A> <8265> <459B> <8267> <45A2> <8278> <45A7> <8283> <45AB> <8289> <45AC> <828C> <45AD> <8290> <45B4> <829E> <45B5> <82A0> <45B8> <82A7> endbfchar 100 beginbfchar <45B9> <82B2> <45BC> <82BA> <45BD> <82BC> <45C4> <82C9> <45C5> <82D0> <45C6> <82D6> <45C9> <82DD> <45CA> <82E2> <45D1> <82F0> <45D6> <82F8> <45D7> <82FA> <45DF> <830D> <45E0> <8310> <45E3> <8316> <45F2> <832E> <45F3> <8330> <45F4> <8332> <45F5> <8337> <45F6> <833B> <45FE> <8348> <45FF> <834A> <4604> <8353> <460A> <835D> <460B> <8362> <4626> <8397> <4629> <839D> <462A> <839F> <462B> <83A1> <4634> <83B5> <4635> <83BB> <463B> <83C6> <463E> <83CB> <4645> <83D5> <4646> <83D7> <464A> <83DE> <464C> <564C> <4660> <8402> <4661> <564B> <4661> <8405> <4664> <8410> <4698> <8458> <469D> <8462> <469E> <8465> <46A1> <846A> <46A2> <846E> <46A3> <8470> <46A4> <8472> <46A5> <8474> <46A6> <8479> <46B2> <848A> <46B3> <848D> <46BA> <8498> <46D0> <84B3> <46D4> <84BB> <46D5> <84BE> <46DC> <84CC> <46DF> <84D2> <46E8> <84DE> <46EB> <84E4> <46F1> <84ED> <46FD> <84FE> <470E> <8512> <4716> <8520> <4717> <8522> <4723> <564E> <4729> <564F> <472A> <8542> <472D> <8547> <4734> <8554> <4735> <8557> <473D> <8563> <4747> <8573> <474A> <8578> <4752> <8586> <4753> <8589> <4754> <858B> <4757> <8590> <4766> <85A5> <4767> <85A7> <4771> <85B8> <477C> <5650> <4784> <85D4> <478D> <5651> <479D> <85F5> <47C0> <8628> <47CE> <8639> <47CF> <863B> <47E5> <865B> <47E6> <865D> <47F0> <866D> <4800> <8689> <4806> <8694> <4814> <86AB> <4824> <86C5> <4825> <86C8> <482D> <86DA> <483B> <86EF> <4842> <86FF> <4843> <8701> <484C> <8714> endbfchar 100 beginbfchar <484D> <8716> <484E> <8719> <484F> <871B> <4850> <871D> <4853> <8724> <486F> <874D> <4874> <8754> <4875> <8756> <4876> <8758> <4886> <876F> <488A> <8775> <488B> <8777> <4895> <878C> <48AD> <87AE> <48B1> <87B4> <48B6> <87BC> <48BC> <87C5> <48BD> <87C7> <48BE> <87C9> <48D0> <87E4> <48D5> <87EB> <48D6> <87ED> <48DE> <87FA> <48E5> <8804> <48EE> <8812> <48EF> <8814> <48F7> <8820> <490A> <883A> <4914> <884B> <491C> <8858> <491D> <885A> <491E> <885C> <4924> <886A> <4925> <886D> <4926> <886F> <4927> <8871> <492C> <8878> <4930> <8880> <4931> <8883> <4936> <888C> <4947> <5653> <4948> <88A3> <494F> <88AC> <4969> <88D3> <496E> <88DE> <497A> <5654> <497A> <88F2> <497D> <5655> <498E> <8911> <499B> <565B> <499F> <565A> <49A4> <8931> <49A5> <8935> <49A6> <8937> <49B6> <565D> <49B7> <565C> <49C9> <8965> <49CD> <896B> <49DD> <8980> <49DE> <8982> <49ED> <8997> <49FD> <89AB> <4A0A> <89BE> <4A0B> <89C3> <4A0C> <89CD> <4A13> <89DB> <4A14> <89DD> <4A19> <89E4> <4A24> <89F5> <4A25> <89F7> <4A30> <8A09> <4A31> <8A0B> <4A32> <8A0D> <4A33> <8A0F> <4A36> <8A14> <4A37> <8A17> <4A3A> <8A1C> <4A3B> <8A1E> <4A3F> <8A24> <4A4B> <8A35> <4A58> <8A47> <4A5E> <8A4F> <4A5F> <8A51> <4A60> <8A53> <4A6D> <8A6A> <4A6E> <8A6F> <4A6F> <8A74> <4A7B> <8A88> <4A81> <8A94> <4A84> <8A99> <4A88> <8A9F> <4A89> <8AA2> <4A8A> <8AA7> <4A91> <8AB1> <4A9D> <8AC3> <4AA0> <8AC8> <4AA1> <8ACA> <4AA2> <8ACC> <4AA3> <8ACE> <4AA4> <8AD0> endbfchar 100 beginbfchar <4AAB> <8ADD> <4AAF> <8AE3> <4AB0> <8AE5> <4AB4> <8AEC> <4AB7> <8AF2> <4ABA> <8AF9> <4ABB> <8AFB> <4ABC> <8AFD> <4ABD> <8AFF> <4ABE> <8B03> <4ABF> <8B06> <4AC5> <8B0F> <4AC9> <8B15> <4ACA> <8B18> <4ACB> <8B1C> <4AD3> <8B27> <4AF8> <8B57> <4AF9> <8B5B> <4B24> <8B94> <4B2A> <8B9D> <4B2B> <8B9F> <4B2C> <8BAC> <4B2D> <8BB1> <4B2E> <8BBB> <4B2F> <8BC7> <4B30> <8BD0> <4B31> <8BEA> <4B32> <8C09> <4B33> <8C1E> <4B72> <8C8B> <4B81> <8C9F> <4B88> <8CB1> <4B89> <8CB5> <4B8A> <8CB9> <4B8B> <8CBE> <4B8C> <8CC6> <4B8D> <8CC9> <4B94> <8CD4> <4B99> <8CDB> <4B9A> <8CDD> <4B9B> <8CDF> <4B9C> <8CE5> <4BB1> <8D09> <4BB2> <8D0C> <4BB3> <8D0E> <4BBD> <8D20> <4BC0> <8D57> <4BC1> <8D5F> <4BC2> <8D65> <4BC6> <8D6C> <4BFA> <8DB9> <4BFB> <8DBB> <4BFC> <8DBD> <4C00> <8DC5> <4C05> <8DCD> <4C06> <8DD0> <4C0D> <8DDC> <4C14> <8DE9> <4C1A> <8DF4> <4C1B> <8DF6> <4C1C> <8DFC> <4C27> <8E0B> <4C3C> <8E2B> <4C3D> <8E2D> <4C3E> <8E30> <4C48> <8E43> <4C63> <8E6E> <4C64> <8E71> <4C65> <8E73> <4C66> <8E75> <4C6A> <8E7B> <4C6D> <8E80> <4C71> <8E86> <4C72> <8E88> <4C73> <8E8C> <4C74> <8E8E> <4C77> <5664> <4C7A> <8E9B> <4C7B> <8E9D> <4CA0> <8ED3> <4CA1> <5663> <4CA2> <5665> <4CA3> <5660> <4CBF> <8EFD> <4CC4> <8F04> <4CC5> <8F06> <4CC6> <8F08> <4CCE> <8F13> <4CEC> <8F43> <4D00> <8F5E> <4D01> <8F60> <4D02> <8F63> <4D03> <8F65> <4D04> <8F6A> <4D05> <8F80> <4D06> <8F8C> <4D07> <8F92> <4D08> <8F9D> <4D0E> <8FA7> <4D0F> <8FAA> endbfchar 100 beginbfchar <4D10> <8FAC> <4D1B> <8FC3> <4D1C> <8FC6> <4D22> <8FCF> <4D23> <8FD2> <4D26> <8FDA> <4D29> <8FE3> <4D2A> <8FE7> <4D2B> <8FEC> <4D2C> <8FEF> <4D38> <900C> <4D39> <900E> <4D3A> <9013> <4D3B> <9018> <4D3C> <901C> <4D49> <9037> <4D4C> <903D> <4D4F> <9043> <4D55> <904C> <4D56> <9056> <4D59> <905D> <4D5A> <905F> <4D5B> <9061> <4D5C> <9064> <4D65> <9073> <4D66> <9076> <4D67> <9079> <4D68> <907B> <4D69> <907E> <4D6C> <9089> <4D70> <9092> <4D71> <9094> <4D72> <9096> <4D73> <9098> <4D74> <909A> <4D75> <909C> <4D7E> <90AB> <4D7F> <90AD> <4D80> <90B2> <4D81> <90B7> <4D88> <90C6> <4D8E> <90D2> <4D95> <90DE> <4D96> <90E0> <4D9C> <90EC> <4D9D> <90EE> <4DAB> <9103> <4DAC> <9105> <4DAE> <566D> <4DB7> <9113> <4DB8> <9115> <4DCA> <912E> <4DCB> <9133> <4DCC> <9135> <4DD9> <9147> <4DDA> <9151> <4DE8> <916B> <4DE9> <916D> <4DEA> <9173> <4DF3> <9186> <4DF4> <9188> <4DF5> <918A> <4E16> <91C2> <4E17> <91C4> <4E18> <91C6> <4E19> <91C8> <4E1A> <91D0> <4E1B> <91D6> <4E25> <91E8> <4E31> <91F6> <4E32> <91F8> <4E40> <920F> <4E4F> <9224> <4E56> <922F> <4E6C> <9256> <4E85> <9279> <4E8B> <9284> <4E96> <9292> <4E99> <9297> <4E9A> <9299> <4E9B> <929B> <4EA1> <92A4> <4EA2> <92A7> <4EA3> <92AD> <4EAB> <92B8> <4EAC> <92BA> <4EB1> <92C2> <4EB2> <92C4> <4EB3> <92C6> <4EC5> <92DE> <4EC9> <92E7> <4ECA> <92E9> <4ED1> <92F7> <4EE4> <9311> <4EEC> <9321> <4EF0> <9327> <4EF9> <9337> <4EFF> <933F> <4F00> <9342> <4F06> <934C> endbfchar 100 beginbfchar <4F1D> <936B> <4F2E> <9383> <4F3D> <9397> <4F49> <93A8> <4F4A> <93AB> <4F4B> <93AD> <4F4C> <93AF> <4F4F> <93B4> <4F5E> <93C9> <4F5F> <93CB> <4F6A> <93E0> <4F6B> <93E3> <4F7B> <93F6> <4F7C> <93F8> <4F91> <9411> <4FA7> <9434> <4FAA> <9439> <4FB7> <944B> <4FBD> <9453> <4FCB> <9464> <4FD1> <946C> <4FD4> <9471> <4FD9> <9478> <4FE1> <9491> <4FE2> <9496> <4FE3> <9498> <4FE4> <94C7> <4FE5> <94CF> <4FE8> <94DA> <4FE9> <94E6> <4FEA> <94FB> <4FEB> <951C> <4FEC> <9520> <4FED> <9527> <4FEE> <9533> <4FEF> <953D> <4FF0> <9543> <4FF1> <9548> <4FF2> <954B> <4FF3> <9555> <4FF4> <955A> <4FF5> <9560> <4FF6> <956E> <5000> <9581> <5005> <958A> <5006> <958D> <5007> <9590> <5008> <9592> <5014> <95A2> <5017> <95AA> <5021> <95BA> <5027> <95C7> <5028> <95C9> <5034> <95DD> <503B> <95EC> <503C> <95FF> <503D> <9607> <503E> <9613> <503F> <9618> <5040> <961B> <5041> <961E> <5042> <9620> <5053> <963E> <5054> <9641> <5055> <9643> <5056> <964A> <5060> <965C> <5061> <965E> <5062> <9660> <5065> <966B> <5069> <9671> <5075> <9687> <5076> <9689> <5077> <968C> <507B> <9696> <507C> <969A> <5087> <96A9> <508D> <96B2> <508E> <96B5> <508F> <96B7> <5090> <96BA> <5091> <96BF> <5094> <96C8> <509D> <96DA> <50A1> <96E1> <50AE> <96F8> <50AF> <96FA> <50B2> <96FF> <50B5> <9705> <50C3> <971D> <50D2> <9731> <50DE> <9743> <50F1> <975F> <50FF> <9775> <5112> <978C> <5113> <978E> <5114> <9790> <5115> <9793> <5128> <97AC> <5129> <97AE> endbfchar 100 beginbfchar <512C> <97B3> <513E> <97CA> <514C> <97DD> <5154> <97E8> <515A> <97F4> <5163> <9800> <5164> <9804> <5165> <9809> <5166> <980B> <5167> <980D> <5174> <9825> <5185> <983C> <519A> <985A> <51A2> <9866> <51A8> <9872> <51A9> <988B> <51AA> <988E> <51AB> <9892> <51AC> <9895> <51AD> <9899> <51AE> <98A3> <51B4> <98B0> <51B5> <98B2> <51C4> <98C5> <51C5> <98C7> <51CD> <98D4> <51D2> <98E1> <51D7> <98EC> <51D8> <98EE> <51DB> <98F3> <51E7> <9904> <51EB> <990B> <520E> <993D> <5212> <9944> <5219> <9953> <521A> <9956> <521F> <995D> <5223> <9964> <5224> <9966> <5225> <9973> <5228> <997B> <5229> <997E> <522C> <9989> <522D> <998C> <522E> <998E> <5241> <99B2> <525C> <99D3> <525F> <99DA> <5260> <99DC> <5261> <99DE> <5262> <99E0> <527D> <9A00> <52A1> <9A2C> <52A2> <9A2F> <52AD> <9A3F> <52B4> <9A4E> <52BA> <9A56> <52C2> <9A63> <52C7> <9A6B> <52C8> <9A72> <52C9> <9A83> <52CA> <9A89> <52CF> <9A99> <52D0> <9AA6> <52DB> <9AB9> <52DC> <9ABB> <52E9> <9AD0> <52EA> <9AD7> <52F1> <9AE0> <52FA> <9AEC> <5304> <9AFA> <530E> <9B07> <5313> <9B0E> <5323> <9B24> <5324> <9B26> <5325> <9B28> <532A> <9B30> <5337> <9B46> <533B> <9B50> <5341> <9B59> <5365> <9B82> <5370> <9B8F> <5385> <9BAC> <539C> <9BC8> <53A6> <9BD5> <53AB> <9BDC> <53AF> <9BE3> <53B2> <9BE9> <53C2> <9BFE> <53D0> <9C11> <53DF> <9C24> <53E8> <9C34> <53E9> <9C36> <53EA> <9C38> <53EB> <9C3A> <53FE> <9C53> <53FF> <9C55> <5404> <9C5E> <541B> <9C79> <541C> <9C7B> endbfchar 100 beginbfchar <541F> <9C80> <5424> <9C8C> <5425> <9C8F> <5426> <9C93> <542B> <9C9D> <542C> <9CAA> <542D> <9CAC> <542E> <9CAF> <542F> <9CB9> <544A> <9CF5> <545A> <9D08> <546B> <9D1C> <546C> <9D1E> <5472> <9D27> <54A8> <9D6B> <54C1> <9D88> <54CF> <9D99> <54EF> <9DC1> <54F0> <9DC3> <54FF> <9DD4> <5502> <9DD8> <5538> <9E1C> <5539> <9E24> <553A> <9E27> <553B> <9E2E> <553C> <9E30> <553D> <9E34> <5540> <9E40> <5541> <9E4D> <5542> <9E50> <5546> <9E56> <5547> <9E59> <5548> <9E5D> <554D> <9E65> <5550> <9E72> <5551> <9E74> <5555> <9E7B> <556C> <9E9E> <5581> <9EBC> <558D> <9ED0> <5595> <9EE1> <5598> <9EE6> <559F> <9EF3> <55A2> <9EF8> <55A3> <9EFA> <55AD> <9F0A> <55AE> <9F0C> <55AF> <9F0F> <55B2> <9F14> <55B3> <9F16> <55B4> <9F18> <55BB> <9F21> <55CE> <9F38> <55CF> <9F3A> <55D0> <9F3C> <55DE> <9F53> <55E7> <9F62> <55ED> <9F6B> <560F> <F92C> <5613> <FA11> <5616> <FA18> <56CE> <00FC> <56CF> <00A9> <56D0> <2122> <56D1> <2026> <5730> <0101> <5731> <00E1> <5732> <01CE> <5733> <00E0> <5734> <0113> <5735> <00E9> <5736> <011B> <5737> <00E8> <5738> <012B> <5739> <00ED> <573A> <01D0> <573B> <00EC> <573C> <014D> <573D> <00F3> <573E> <01D2> <573F> <00F2> <5740> <016B> <5741> <00FA> <5742> <01D4> <5743> <00F9> <5744> <01D6> <5745> <01D8> <5746> <01DA> <5747> <01DC> <5748> <00FC> <5749> <00EA> <574A> <0251> <574B> <1E3F> <574C> <0144> <574D> <0148> <574E> <006E0300> <574F> <0261> <5750> <0020> <5751> <20AC> <5752> <00A5> endbfchar 42 beginbfchar <5753> <20AC> <5754> <0024> <5755> <303F> <5756> <20AC> <5757> <3041> <5758> <3047> <5759> <3043> <575A> <304B> <575B> <304B> <575C> <3051> <575D> <3051> <575E> <3053> <575F> <3053> <5760> <3049> <5761> <3064> <5762> <3045> <5763> <308E> <5764> <3083> <5765> <3087> <5766> <3085> <5767> <3094> <5768> <30A1> <5769> <30A7> <576A> <30A3> <576D> <30B3> <576E> <30B3> <576F> <30A9> <5770> <30C3> <5771> <30A5> <5772> <30EE> <5773> <30E3> <5774> <30E7> <5775> <30E5> <577A> <30FC> <579C> <2E80> <5800> <2EF3> <6D65> <4984> <7183> <20AC> <7184> <00A5> <7185> <20AC> <7186> <0024> <7187> <303F> endbfchar 100 beginbfrange <0001> <005F> <0020> <0060> <0062> <3000> <006D> <006E> <2018> <006F> <0070> <201C> <0071> <0072> <3014> <0073> <007A> <3008> <007B> <007C> <3016> <007D> <007E> <3010> <0083> <0084> <2227> <0099> <009A> <226E> <009B> <009C> <2264> <00A3> <00A4> <2032> <00A8> <00A9> <FFE0> <00BA> <00BB> <2190> <00BE> <00D1> <2488> <00D2> <00E5> <2474> <00E6> <00EF> <2460> <00F0> <00F9> <3220> <00FA> <00FF> <2160> <0100> <0105> <2166> <0106> <0108> <FF01> <010A> <0162> <FF05> <0164> <01B6> <3041> <01B7> <01FF> <30A1> <0200> <020C> <30EA> <020D> <021D> <0391> <021E> <0224> <03A3> <0225> <0235> <03B1> <0236> <023C> <03C3> <0240> <0241> <FF1A> <0244> <0245> <FE35> <0246> <0247> <FE39> <0248> <0249> <FE3F> <024A> <024B> <FE3D> <024C> <024F> <FE41> <0250> <0251> <3016> <0252> <0253> <FE3B> <0254> <0255> <FE37> <0258> <0259> <FE33> <025A> <025F> <0410> <0261> <0280> <0416> <0282> <029B> <0436> <02BC> <02E0> <3105> <02E2> <02FF> <2500> <0300> <032D> <251E> <032E> <038B> <0021> <044F> <0450> <8FA8> <0B03> <0B04> <6478> <0D19> <0D1A> <820C> <108E> <108F> <8424> <11C0> <11C1> <81F3> <1291> <1292> <523F> <1318> <1319> <8BA6> <131B> <131C> <8BB4> <131E> <131F> <8BC2> <1323> <1325> <8BD2> <1327> <1328> <8BD8> <132A> <132B> <8BDF> <132D> <132E> <8BE8> <1335> <1336> <8BFF> <133C> <133D> <8C11> <133E> <1340> <8C14> <1345> <1347> <8C1F> <134A> <134B> <8C2A> <134C> <134D> <8C2E> <134E> <134F> <8C32> <1350> <1351> <8C35> <138E> <138F> <52AC> <13AC> <13AD> <572E> <13F6> <13F7> <82CB> <1411> <1412> <8314> <1417> <1418> <835B> <1432> <1433> <836D> <1436> <1437> <83B3> <145A> <145B> <83F8> <1467> <1468> <8487> <14EA> <14EB> <64B7> <1504> <1506> <5452> <1513> <1514> <549A> <1520> <1521> <54D3> <1528> <1529> <54D9> <152B> <152C> <54A9> <1537> <1538> <5522> <1549> <154B> <5575> <155C> <155D> <55BD> <1565> <1566> <55EB> <156D> <156E> <55F2> <156F> <1570> <55CC> <158D> <158E> <567B> <15A3> <15A4> <5E3B> <15B1> <15B2> <5C98> <15C4> <15C5> <5D02> <15F2> <15F3> <72B7> <1602> <1603> <72FA> <161E> <1623> <9967> <162C> <162D> <9990> <162E> <1630> <9993> <164C> <164D> <6005> <165C> <165D> <6078> <1689> <168A> <95F5> endbfrange 100 beginbfrange <168D> <168E> <9603> <1691> <1694> <960A> <1697> <1699> <9615> <169A> <169B> <9619> <16A8> <16A9> <6C68> <16B1> <16B2> <6CF7> <16D6> <16D7> <6D93> <16F2> <16F3> <6E53> <1709> <170A> <6F46> <174F> <1750> <9035> <1754> <1755> <9051> <1778> <1779> <59A9> <1785> <1786> <5A05> <17BB> <17BC> <9A77> <17C0> <17C1> <9A80> <17C6> <17C7> <9A92> <17CA> <17CC> <9A9B> <17CD> <17CE> <9A9F> <17CF> <17D0> <9AA2> <17D7> <17D8> <7EA8> <17DC> <17DE> <7EC0> <17E0> <17E1> <7ECB> <17E6> <17E7> <7EE0> <17EA> <17EB> <7EEE> <17EC> <17ED> <7EF1> <17F0> <17F1> <7EFA> <17F3> <17F5> <7F01> <17F6> <17F7> <7F07> <17F8> <17F9> <7F0B> <17FB> <17FC> <7F11> <1802> <1808> <7F21> <1809> <180C> <7F2A> <180D> <1811> <7F2F> <1843> <1844> <7480> <1848> <1849> <74A8> <184E> <1850> <97EA> <1876> <1877> <6832> <1878> <1879> <6860> <1892> <1893> <691F> <18A8> <18A9> <6987> <18BF> <18C0> <6A17> <18D6> <18D7> <6B81> <18DA> <18DB> <6B92> <18DD> <18DE> <6B9A> <18E3> <18E5> <8F71> <18E6> <18E7> <8F75> <18EA> <18EB> <8F79> <18EE> <18EF> <8F81> <18F3> <18F5> <8F8D> <190A> <190C> <65EE> <1928> <1929> <66DB> <192C> <192D> <8D32> <1932> <1933> <8D45> <1934> <1935> <8D48> <193B> <193D> <89CA> <193E> <1941> <89CE> <1947> <1948> <727E> <195E> <1960> <6C18> <197A> <197D> <80E7> <198A> <198B> <810D> <199A> <199B> <8159> <199F> <19A0> <817C> <19B7> <19B9> <98D1> <19BB> <19BC> <98D9> <19F6> <19F7> <6248> <19FC> <19FD> <795B> <1A26> <1A27> <7817> <1A2B> <1A2C> <781C> <1A2D> <1A2F> <7839> <1A38> <1A39> <7856> <1A56> <1A57> <9EFB> <1A5C> <1A5D> <7707> <1A65> <1A66> <7750> <1A73> <1A74> <779F> <1A8E> <1A90> <9485> <1A93> <1A94> <948C> <1A95> <1A96> <948F> <1A9A> <1A9C> <949A> <1A9D> <1A9E> <94A3> <1AA3> <1AA4> <94AF> <1AA7> <1AAB> <94B6> <1AAC> <1AAD> <94BC> <1AB0> <1AB6> <94C8> <1AB7> <1AB9> <94D0> <1ABA> <1ABC> <94D5> <1AC0> <1AC2> <94DE> <1AC4> <1AC5> <94E4> <1AC6> <1AC7> <94E7> <1ACB> <1ACC> <94EE> <1ACD> <1ACF> <94F3> <1AD2> <1AD3> <94FC> <1AD7> <1AD8> <9506> <1AD9> <1ADA> <9509> <1ADB> <1ADD> <950D> <1ADE> <1AE2> <9512> <1AE5> <1AE7> <951D> <1AE9> <1AEA> <952A> <1AED> <1AEE> <9531> <1AF0> <1AF2> <9536> <1AF4> <1AF5> <953E> endbfrange 100 beginbfrange <1AF8> <1AFA> <9544> <1AFD> <1AFE> <954E> <1B00> <1B01> <9553> <1B02> <1B05> <9556> <1B07> <1B08> <955E> <1B0A> <1B0B> <9561> <1B0C> <1B14> <9564> <1B16> <1B18> <9571> <1B37> <1B3B> <9E28> <1B41> <1B42> <9E39> <1B44> <1B45> <9E41> <1B47> <1B4A> <9E46> <1B4B> <1B4C> <9E4B> <1B51> <1B53> <9E5A> <1B56> <1B5C> <9E66> <1B67> <1B68> <75B3> <1B9A> <1B9B> <7A78> <1BD1> <1BD3> <8025> <1BE4> <1BE5> <988C> <1BE8> <1BE9> <989A> <1BEA> <1BEB> <989E> <1BEC> <1BED> <98A1> <1BEE> <1BEF> <98A5> <1C0E> <1C0F> <86F1> <1C2F> <1C30> <877D> <1C60> <1C61> <7F44> <1C66> <1C67> <7B03> <1C85> <1C86> <7BA6> <1C96> <1C97> <7BE5> <1CA6> <1CA7> <8201> <1CAB> <1CAD> <8221> <1CB4> <1CB5> <8233> <1CC7> <1CC8> <7FAF> <1CD2> <1CD3> <7CBC> <1CD6> <1CD7> <7CCC> <1CFA> <1CFB> <914E> <1D02> <1D03> <917D> <1D0C> <1D0D> <91A2> <1D0F> <1D11> <91AD> <1D21> <1D22> <8DD6> <1D25> <1D26> <8DCE> <1D2A> <1D2B> <8DF7> <1D40> <1D41> <8E41> <1D42> <1D43> <8E51> <1D6F> <1D74> <9F85> <1D7A> <1D7B> <96BC> <1D8B> <1D8E> <9C85> <1D92> <1D94> <9C90> <1D95> <1D96> <9C94> <1D97> <1D98> <9C9A> <1D99> <1D9E> <9C9E> <1D9F> <1DA3> <9CA5> <1DA5> <1DA6> <9CAD> <1DA7> <1DAE> <9CB0> <1DAF> <1DB2> <9CBA> <1DB3> <1DB6> <9CC4> <1DB7> <1DBD> <9CCA> <1DBE> <1DC0> <9CD3> <1DC1> <1DC3> <9CD7> <1DC4> <1DC5> <9CDC> <1DCA> <1DCB> <9791> <1DDD> <1DDE> <9ACB> <1DF9> <1DFA> <9EBD> <1DFD> <1DFE> <9E87> <1E04> <1E06> <9EDB> <1E14> <1E15> <9F3D> <22F9> <22FA> <8A91> <239F> <23A0> <98EA> <23A9> <23AB> <9948> <2416> <2417> <9A43> <241E> <241F> <7D07> <249D> <249E> <8F1E> <24CC> <24CD> <98AE> <24F3> <24F5> <91D2> <2511> <2512> <926C> <2541> <2542> <9426> <254F> <2550> <9307> <2568> <2569> <93DC> <25AF> <25B0> <7646> <25B4> <25B5> <766D> <25C6> <25C7> <980E> <263B> <263C> <9BEA> <26A9> <26B2> <2170> <26B3> <26B4> <02CA> <26BC> <26BF> <2196> <26C4> <26C5> <2266> <26C7> <26EA> <2550> <26EB> <26F9> <2581> <26FA> <26FC> <2593> <26FD> <26FE> <25BC> <2700> <2702> <25E3> <2706> <2707> <301D> <2708> <2710> <3021> <2712> <2713> <338E> <2714> <2716> <339C> <271A> <271B> <33D1> <2724> <2725> <309B> <2726> <2727> <30FD> <2729> <272A> <309D> <272B> <2734> <FE49> endbfrange 100 beginbfrange <2735> <2738> <FE54> <2739> <2746> <FE59> <2747> <274A> <FE68> <274B> <2757> <E7E7> <2759> <275B> <4E04> <275F> <2761> <4E1F> <2765> <2766> <4E2E> <276C> <276E> <4E40> <2775> <2776> <4E5A> <2777> <277A> <4E62> <277B> <277C> <4E67> <277D> <2782> <4E6A> <2784> <278D> <4E74> <278E> <2790> <4E7F> <2791> <2793> <4E83> <2797> <2798> <4E96> <279A> <279B> <4E9C> <279E> <27A0> <4EAF> <27A2> <27A5> <4EB6> <27A6> <27A8> <4EBC> <27AB> <27AC> <4ECF> <27AE> <27B0> <4EDA> <27B3> <27B4> <4EE6> <27B6> <27B8> <4EED> <27BB> <27BD> <4EF8> <27C1> <27C7> <4F02> <27C8> <27C9> <4F0B> <27CA> <27CE> <4F12> <27CF> <27D0> <4F1C> <27D3> <27D4> <4F28> <27D5> <27D7> <4F2C> <27DE> <27E2> <4F3E> <27E3> <27E4> <4F44> <27E5> <27EA> <4F47> <27EE> <27EF> <4F61> <27F2> <27F3> <4F6A> <27F4> <27F5> <4F6D> <27F6> <27F7> <4F71> <27F9> <27FC> <4F77> <27FE> <27FF> <4F80> <2807> <2808> <4F92> <280A> <280C> <4F98> <280E> <280F> <4F9E> <2810> <2811> <4FA1> <2815> <2819> <4FB0> <281A> <2822> <4FB6> <2823> <2824> <4FC0> <2825> <2828> <4FC6> <2829> <282B> <4FCB> <282C> <2830> <4FD2> <2834> <2835> <4FE4> <2837> <2838> <4FEB> <283B> <283E> <4FF4> <2840> <2842> <4FFB> <2844> <2848> <5001> <2849> <284A> <5007> <284F> <2851> <5015> <2853> <2854> <501D> <2856> <2858> <5022> <285A> <2864> <502F> <2867> <286A> <503F> <286B> <286D> <5044> <286E> <286F> <504A> <2871> <2875> <5050> <2876> <2879> <5056> <287B> <2882> <505D> <2883> <2888> <5066> <2889> <288F> <506D> <2890> <2892> <5078> <2893> <2894> <507C> <2895> <2898> <5081> <2899> <289A> <5086> <289B> <289E> <5089> <289F> <28A6> <508E> <28A8> <28AF> <509A> <28B2> <28B3> <50AA> <28B4> <28B7> <50AE> <28B9> <28BA> <50B8> <28BB> <28BC> <50BC> <28BD> <28BF> <50BF> <28C0> <28C1> <50C3> <28C2> <28C4> <50C6> <28C5> <28C9> <50CA> <28CB> <28CD> <50D2> <28CE> <28D0> <50D7> <28D1> <28D3> <50DB> <28D4> <28D9> <50DF> <28DA> <28DC> <50E9> <28DD> <28E0> <50EF> <28E2> <28E4> <50F6> <28E6> <28E9> <50FC> <28EE> <28F1> <510C> <28F4> <28F5> <5116> <28F6> <28FB> <5119> <28FD> <28FF> <5122> <2900> <2904> <5125> <2905> <290B> <512B> <290C> <290F> <5133> <2910> <2911> <5138> <2912> <2913> <513D> endbfrange 100 beginbfrange <2918> <291A> <514E> <291C> <291E> <5157> <2920> <2924> <515D> <2925> <2926> <5163> <2927> <2928> <5166> <292D> <292E> <517E> <292F> <2930> <5183> <2931> <2932> <5186> <2933> <2934> <518A> <2935> <2938> <518E> <2939> <293A> <5193> <293D> <293F> <519D> <2942> <2946> <51A6> <2947> <2948> <51AD> <294A> <294C> <51B8> <294D> <294E> <51BE> <294F> <2951> <51C1> <2957> <295F> <51D2> <2961> <2962> <51DE> <2963> <2964> <51E2> <2965> <296A> <51E5> <2971> <2972> <5204> <2974> <2975> <520B> <2976> <2977> <520F> <2978> <297A> <5213> <297C> <297D> <521E> <297E> <2980> <5221> <2981> <2983> <5225> <2987> <2988> <5231> <2989> <298A> <5234> <298D> <298E> <5245> <298F> <2990> <5248> <2991> <2992> <524E> <2993> <2994> <5252> <2996> <2999> <5257> <299B> <299C> <525F> <299D> <299F> <5262> <29A2> <29A4> <526B> <29A5> <29A6> <5270> <29A8> <29AE> <5276> <29B1> <29B3> <5284> <29B5> <29B6> <528E> <29B8> <29BE> <5294> <29C0> <29C3> <52A4> <29C4> <29C6> <52AE> <29C7> <29D0> <52B4> <29D3> <29D5> <52C4> <29D8> <29DB> <52CC> <29DD> <29DE> <52D3> <29E2> <29E3> <52E0> <29E5> <29EF> <52E5> <29F0> <29F2> <52F2> <29F3> <29F4> <52F6> <29F5> <29F7> <52FB> <29F8> <29FB> <5301> <29FD> <29FF> <5309> <2A02> <2A05> <5311> <2A07> <2A08> <531B> <2A09> <2A0A> <531E> <2A0C> <2A0D> <5324> <2A0E> <2A10> <5327> <2A11> <2A12> <532B> <2A14> <2A1A> <5332> <2A1B> <2A1C> <533C> <2A20> <2A22> <534B> <2A24> <2A25> <5358> <2A2B> <2A2C> <536C> <2A30> <2A33> <537B> <2A34> <2A35> <5380> <2A37> <2A38> <5387> <2A3A> <2A40> <538E> <2A41> <2A42> <5396> <2A43> <2A44> <539B> <2A49> <2A4B> <53AA> <2A4C> <2A4E> <53AF> <2A51> <2A54> <53B7> <2A55> <2A57> <53BC> <2A59> <2A5C> <53C4> <2A5D> <2A5F> <53CE> <2A60> <2A61> <53D2> <2A64> <2A66> <53DC> <2A6B> <2A6D> <53FE> <2A73> <2A75> <5418> <2A78> <2A79> <5424> <2A7D> <2A7E> <5436> <2A82> <2A83> <5441> <2A84> <2A85> <5444> <2A88> <2A8B> <544C> <2A8E> <2A92> <545D> <2A96> <2A9D> <5469> <2A9F> <2AA0> <5479> <2AA1> <2AA2> <547E> <2AA6> <2AA9> <5487> <2AAD> <2AAE> <5497> <2AB0> <2AB4> <549E> <2AB9> <2ABB> <54B5> <2ABC> <2ABD> <54B9> <2AC1> <2AC2> <54CA> <2AC7> <2AC9> <54E2> <2ACA> <2ACB> <54EB> endbfrange 100 beginbfrange <2ACC> <2ACE> <54EF> <2ACF> <2AD4> <54F4> <2AD8> <2AD9> <5502> <2ADC> <2AE0> <550A> <2AE1> <2AE2> <5512> <2AE3> <2AE8> <5515> <2AE9> <2AEC> <551C> <2AEE> <2AEF> <5525> <2AF0> <2AF1> <5528> <2AF5> <2AF7> <5534> <2AF8> <2AFB> <5538> <2B00> <2B01> <5547> <2B02> <2B05> <554B> <2B06> <2B07> <5551> <2B09> <2B0D> <5557> <2B0F> <2B10> <555F> <2B11> <2B12> <5562> <2B13> <2B14> <5568> <2B16> <2B1B> <556F> <2B1C> <2B1D> <5579> <2B20> <2B21> <5585> <2B22> <2B24> <558C> <2B26> <2B27> <5592> <2B28> <2B2A> <5595> <2B2B> <2B2C> <559A> <2B2E> <2B34> <55A0> <2B35> <2B36> <55A8> <2B39> <2B3A> <55AF> <2B40> <2B44> <55BF> <2B46> <2B47> <55CA> <2B48> <2B49> <55CF> <2B4B> <2B4D> <55D7> <2B53> <2B54> <55ED> <2B55> <2B56> <55F0> <2B58> <2B5C> <55F8> <2B5E> <2B61> <5602> <2B63> <2B64> <560A> <2B65> <2B68> <5610> <2B6A> <2B6B> <5619> <2B6D> <2B6F> <5620> <2B70> <2B71> <5625> <2B73> <2B74> <562A> <2B78> <2B7A> <563C> <2B7C> <2B85> <5642> <2B86> <2B8A> <564F> <2B8B> <2B8C> <5655> <2B8D> <2B8E> <565A> <2B8F> <2B90> <565E> <2B94> <2B95> <566D> <2B9B> <2B9D> <567D> <2B9E> <2BA1> <5681> <2BA2> <2BA5> <5688> <2BA7> <2BA9> <5690> <2BAB> <2BAD> <5696> <2BAE> <2BB6> <569A> <2BB7> <2BB8> <56A4> <2BBA> <2BBE> <56A9> <2BBF> <2BC1> <56B0> <2BC3> <2BC6> <56B8> <2BC7> <2BC9> <56BD> <2BCA> <2BCB> <56C3> <2BCC> <2BCD> <56C6> <2BCF> <2BD2> <56CD> <2BD3> <2BD4> <56D2> <2BD5> <2BD6> <56D5> <2BD7> <2BD8> <56D8> <2BDB> <2BE0> <56E5> <2BE2> <2BE3> <56EE> <2BE4> <2BE5> <56F2> <2BE6> <2BE8> <56F6> <2BE9> <2BEA> <56FB> <2BEB> <2BED> <5700> <2BF0> <2BF3> <570E> <2BF4> <2BF5> <5714> <2BF7> <2BF9> <5719> <2BFA> <2BFB> <571D> <2BFC> <2BFE> <5720> <2C00> <2C02> <5725> <2C04> <2C05> <5731> <2C06> <2C0A> <5734> <2C0B> <2C0C> <573C> <2C0F> <2C12> <5743> <2C13> <2C14> <5748> <2C16> <2C1A> <5752> <2C1B> <2C1C> <5758> <2C1D> <2C1E> <5762> <2C23> <2C25> <5770> <2C26> <2C27> <5774> <2C28> <2C2A> <5778> <2C2B> <2C2F> <577D> <2C30> <2C33> <5787> <2C34> <2C38> <578D> <2C39> <2C3F> <5794> <2C40> <2C43> <579C> <2C48> <2C4A> <57AF> <2C4C> <2C4E> <57B5> <2C4F> <2C57> <57B9> <2C58> <2C5E> <57C4> <2C5F> <2C60> <57CC> <2C61> <2C62> <57D0> endbfrange 100 beginbfrange <2C64> <2C65> <57D6> <2C66> <2C67> <57DB> <2C69> <2C6A> <57E2> <2C6B> <2C72> <57E5> <2C74> <2C77> <57F0> <2C78> <2C79> <57F5> <2C7A> <2C7B> <57FB> <2C7C> <2C7D> <57FE> <2C7F> <2C80> <5803> <2C81> <2C82> <5808> <2C84> <2C86> <580E> <2C87> <2C89> <5812> <2C8A> <2C8B> <5817> <2C8C> <2C8E> <581A> <2C90> <2C91> <5822> <2C92> <2C96> <5825> <2C97> <2C9A> <582B> <2C9B> <2C9C> <5832> <2C9D> <2CAA> <5836> <2CAB> <2CAF> <5845> <2CB3> <2CB4> <5855> <2CB5> <2CB9> <5859> <2CBA> <2CBC> <585F> <2CBE> <2CC2> <5866> <2CC3> <2CCA> <586D> <2CCB> <2CCD> <5876> <2CCE> <2CD1> <587A> <2CD5> <2CD7> <5886> <2CD8> <2CDE> <588B> <2CDF> <2CE3> <5894> <2CE6> <2CED> <58A0> <2CEE> <2CF1> <58AA> <2CF2> <2CF5> <58AF> <2CF6> <2CFC> <58B4> <2CFE> <2CFF> <58BF> <2D00> <2D02> <58C2> <2D04> <2D0C> <58C8> <2D0F> <2D10> <58D6> <2D11> <2D13> <58DB> <2D16> <2D19> <58E5> <2D1C> <2D1D> <58F1> <2D1E> <2D1F> <58F4> <2D20> <2D21> <58F7> <2D22> <2D23> <58FB> <2D24> <2D27> <58FE> <2D29> <2D2A> <5905> <2D2B> <2D2F> <5908> <2D31> <2D34> <5910> <2D35> <2D36> <5917> <2D38> <2D39> <591D> <2D3A> <2D3B> <5920> <2D41> <2D42> <5932> <2D43> <2D44> <5935> <2D47> <2D48> <593F> <2D4A> <2D4B> <5945> <2D4D> <2D4E> <594C> <2D50> <2D51> <5952> <2D53> <2D57> <595B> <2D59> <2D5A> <5963> <2D5B> <2D5D> <5966> <2D60> <2D63> <596F> <2D66> <2D68> <597A> <2D69> <2D6B> <597E> <2D6E> <2D6F> <598B> <2D70> <2D73> <598E> <2D74> <2D75> <5994> <2D77> <2D79> <599A> <2D7A> <2D7D> <599F> <2D7E> <2D7F> <59A6> <2D80> <2D81> <59AC> <2D82> <2D83> <59B0> <2D84> <2D89> <59B3> <2D8B> <2D8C> <59BC> <2D8D> <2D93> <59BF> <2D94> <2D96> <59C7> <2D97> <2D9A> <59CC> <2D9B> <2D9C> <59D5> <2D9F> <2DA3> <59DE> <2DA5> <2DA6> <59E6> <2DA7> <2DA9> <59E9> <2DAA> <2DB5> <59ED> <2DB7> <2DB9> <59FC> <2DBC> <2DBD> <5A0A> <2DBE> <2DC1> <5A0D> <2DC3> <2DC6> <5A14> <2DC7> <2DC9> <5A19> <2DCA> <2DCB> <5A1D> <2DCC> <2DCD> <5A21> <2DCF> <2DD1> <5A26> <2DD2> <2DD8> <5A2A> <2DDB> <2DDF> <5A37> <2DE0> <2DE2> <5A3D> <2DE3> <2DE6> <5A42> <2DE7> <2DE8> <5A47> <2DE9> <2DF2> <5A4B> <2DF3> <2DF6> <5A56> <2DF7> <2DFD> <5A5B> <2DFE> <2DFF> <5A63> <2E01> <2E02> <5A68> <2E03> <2E04> <5A6B> endbfrange 100 beginbfrange <2E05> <2E0A> <5A6E> <2E0B> <2E0C> <5A78> <2E0D> <2E10> <5A7B> <2E11> <2E22> <5A80> <2E23> <2E29> <5A93> <2E2A> <2E34> <5A9C> <2E35> <2E36> <5AA8> <2E37> <2E3D> <5AAB> <2E3F> <2E40> <5AB6> <2E41> <2E44> <5AB9> <2E45> <2E46> <5ABF> <2E47> <2E4C> <5AC3> <2E4D> <2E4E> <5ACA> <2E4F> <2E53> <5ACD> <2E56> <2E58> <5AD9> <2E59> <2E5B> <5ADD> <2E5D> <2E5E> <5AE4> <2E5F> <2E60> <5AE7> <2E62> <2E66> <5AEC> <2E67> <2E69> <5AF2> <2E6A> <2E6E> <5AF6> <2E6F> <2E72> <5AFC> <2E73> <2E79> <5B01> <2E7B> <2E83> <5B0D> <2E85> <2E8B> <5B1A> <2E8C> <2E93> <5B22> <2E94> <2E98> <5B2B> <2E9B> <2E9C> <5B35> <2E9D> <2EA3> <5B39> <2EA4> <2EAE> <5B41> <2EAF> <2EB1> <5B4D> <2EB5> <2EB6> <5B60> <2EB6> <2EB7> <5643> <2EB7> <2EB8> <5B67> <2EB9> <2EBB> <5B6D> <2EBE> <2EBF> <5B76> <2EC1> <2EC2> <5B7B> <2EC7> <2EC8> <5B8D> <2EC9> <2ECB> <5B90> <2ECF> <2ED1> <5BA7> <2ED2> <2ED5> <5BAC> <2ED6> <2ED7> <5BB1> <2ED9> <2EDB> <5BBA> <2EDC> <2EDD> <5BC0> <2EDF> <2EE2> <5BC8> <2EE3> <2EE5> <5BCD> <2EE7> <2EEF> <5BD4> <2EF5> <2EF8> <5BF1> <2EFA> <2EFB> <5BFD> <2EFD> <2EFE> <5C02> <2F02> <2F03> <5C12> <2F07> <2F0A> <5C1E> <2F0D> <2F10> <5C28> <2F11> <2F14> <5C2D> <2F15> <2F16> <5C32> <2F17> <2F18> <5C35> <2F19> <2F1A> <5C43> <2F1B> <2F1C> <5C46> <2F1D> <2F1E> <5C4C> <2F1F> <2F21> <5C52> <2F22> <2F24> <5C56> <2F25> <2F28> <5C5A> <2F2B> <2F2D> <5C69> <2F30> <2F36> <5C72> <2F37> <2F3A> <5C7B> <2F3C> <2F40> <5C83> <2F41> <2F43> <5C89> <2F44> <2F45> <5C8E> <2F46> <2F47> <5C92> <2F49> <2F4C> <5C9D> <2F4D> <2F51> <5CA4> <2F53> <2F55> <5CAE> <2F59> <2F5C> <5CB9> <2F5F> <2F60> <5CC2> <2F61> <2F66> <5CC5> <2F67> <2F6C> <5CCC> <2F6D> <2F72> <5CD3> <2F73> <2F79> <5CDA> <2F7A> <2F7B> <5CE2> <2F7E> <2F7F> <5CEB> <2F80> <2F81> <5CEE> <2F82> <2F84> <5CF1> <2F86> <2F89> <5CF7> <2F8B> <2F8E> <5CFE> <2F8F> <2F90> <5D04> <2F91> <2F95> <5D08> <2F96> <2F9A> <5D0F> <2F9C> <2F9E> <5D18> <2F9F> <2FA0> <5D1C> <2FA1> <2FA5> <5D1F> <2FA8> <2FA9> <5D2A> <2FAA> <2FAE> <5D2F> <2FAF> <2FB6> <5D35> <2FB7> <2FBE> <5D3F> <2FBF> <2FC0> <5D48> <2FC1> <2FC3> <5D4D> <2FC4> <2FCA> <5D51> <2FCB> <2FCC> <5D59> <2FCE> <2FD8> <5D5E> <2FDA> <2FDB> <5D6D> endbfrange 100 beginbfrange <2FDC> <2FDF> <5D70> <2FE0> <2FEB> <5D75> <2FED> <2FEE> <5D85> <2FEF> <2FFD> <5D88> <2FF0> <2FFB> <274C> <3000> <3001> <5D9B> <3002> <3003> <5D9E> <3004> <3009> <5DA1> <300A> <3018> <5DA8> <301B> <3022> <5DBD> <3023> <3027> <5DC6> <3029> <302C> <5DCE> <302E> <3033> <5DD5> <3035> <3036> <5DDF> <3037> <3038> <5DE3> <303A> <303B> <5DEC> <303C> <303D> <5DF5> <303E> <3042> <5DF8> <3043> <3044> <5DFF> <3047> <3049> <5E09> <304A> <304B> <5E0D> <304C> <304D> <5E12> <304F> <3055> <5E1E> <3056> <3058> <5E28> <305A> <305B> <5E2F> <305D> <305E> <5E34> <305F> <3060> <5E39> <3061> <3062> <5E3E> <3064> <3069> <5E46> <306A> <3070> <5E4D> <3072> <3073> <5E59> <3074> <3075> <5E5C> <3077> <307D> <5E64> <307E> <3082> <5E6D> <3085> <3087> <5E81> <3089> <308A> <5E88> <308B> <308D> <5E8C> <3092> <3095> <5EA1> <3096> <3098> <5EA8> <309A> <309E> <5EAE> <30A0> <30A3> <5EBA> <30A4> <30AD> <5EBF> <30AE> <30B3> <5ECB> <30B4> <30B5> <5ED4> <30B6> <30B9> <5ED7> <30BA> <30BC> <5EDC> <30BD> <30C0> <5EE4> <30C3> <30C8> <5EED> <30CA> <30CB> <5EF8> <30CC> <30CE> <5EFB> <30CF> <30D1> <5F05> <30D3> <30D5> <5F0C> <30DA> <30DB> <5F19> <30DC> <30DE> <5F1C> <30DF> <30E2> <5F21> <30E4> <30E5> <5F2B> <30EA> <30EC> <5F36> <30EE> <30F0> <5F3D> <30F1> <30F5> <5F41> <30F7> <30F9> <5F49> <30FE> <30FF> <5F5A> <3101> <3103> <5F5E> <3106> <3107> <5F67> <3109> <310A> <5F6E> <310C> <310E> <5F74> <3111> <3113> <5F7D> <3116> <3118> <5F8D> <3119> <311A> <5F93> <311C> <311D> <5F9A> <3120> <3125> <5FA2> <3126> <3127> <5FAB> <3128> <312D> <5FAF> <3130> <3131> <5FBA> <3132> <3136> <5FBE> <3137> <3138> <5FC7> <3139> <313A> <5FCA> <313C> <313E> <5FD3> <313F> <3141> <5FDA> <3142> <3143> <5FDE> <3144> <3145> <5FE2> <3146> <3147> <5FE5> <3148> <3149> <5FE8> <314B> <314C> <5FEF> <314D> <314F> <5FF2> <3150> <3151> <5FF6> <3152> <3153> <5FF9> <3155> <3157> <6007> <3158> <3159> <600B> <315A> <315B> <6010> <315D> <315E> <6017> <3160> <3161> <601E> <3162> <3164> <6022> <3165> <3167> <602C> <3168> <316C> <6030> <316D> <3171> <6036> <3172> <3173> <603D> <3175> <317B> <6044> <317D> <317E> <604E> <3180> <3181> <6053> <3182> <3184> <6056> endbfrange 100 beginbfrange <3185> <3186> <605B> <3187> <318A> <605E> <318B> <318C> <6065> <318E> <318F> <6071> <3190> <3191> <6074> <3194> <3196> <6080> <3197> <319A> <6085> <319B> <319C> <608A> <319D> <31A0> <608E> <31A3> <31A5> <6097> <31A8> <31A9> <60A1> <31AA> <31AB> <60A4> <31AD> <31AE> <60A9> <31B3> <31B4> <60B9> <31B5> <31BC> <60BD> <31BD> <31BF> <60C7> <31C0> <31C4> <60CC> <31C5> <31C7> <60D2> <31C8> <31C9> <60D6> <31CD> <31D0> <60E2> <31D3> <31D4> <60F7> <31D5> <31D8> <60FC> <31D9> <31DC> <6102> <31DE> <31E0> <610A> <31E1> <31E5> <6110> <31E6> <31E9> <6116> <31EA> <31EB> <611D> <31EC> <31ED> <6121> <31EF> <31F1> <6128> <31F2> <31F9> <612C> <31FA> <31FB> <6135> <31FC> <31FF> <6138> <3200> <3201> <613C> <3202> <3209> <6140> <320C> <320D> <614F> <320E> <3210> <6152> <3211> <3212> <6156> <3214> <3215> <615B> <3217> <3218> <6160> <3219> <321A> <6165> <321C> <321D> <616C> <321F> <3220> <6171> <3222> <322B> <6178> <322C> <3232> <6183> <3233> <3234> <618C> <3237> <323B> <6195> <323C> <323D> <619B> <323E> <3243> <619E> <3244> <3245> <61A5> <3248> <324A> <61AF> <324B> <324D> <61B3> <324E> <3253> <61B8> <3254> <3256> <61BF> <3257> <325A> <61C3> <325B> <325E> <61CD> <3260> <3268> <61D5> <3269> <326B> <61E0> <326C> <326D> <61E4> <326F> <3277> <61E9> <3278> <3279> <61F3> <327D> <3281> <6201> <3285> <3287> <621C> <328B> <328C> <6228> <3291> <3292> <6235> <3293> <3297> <6238> <3299> <329B> <6244> <329D> <329E> <624F> <329F> <32A1> <6255> <32A2> <32A3> <6259> <32A4> <32AA> <625C> <32AB> <32AC> <6264> <32AE> <32AF> <6271> <32B0> <32B1> <6274> <32B2> <32B3> <6277> <32B4> <32B5> <627A> <32B7> <32B9> <6281> <32BA> <32BD> <6285> <32BE> <32C3> <628B> <32C6> <32C8> <629C> <32CA> <32CB> <62A6> <32CC> <32CD> <62A9> <32CE> <32D1> <62AD> <32D2> <32D4> <62B2> <32D5> <32D7> <62B6> <32DA> <32DB> <62C0> <32E1> <32E2> <62DD> <32E3> <32E4> <62E0> <32E6> <32E7> <62EA> <32EB> <32EE> <62F8> <32F0> <32F3> <6303> <32F4> <32F7> <630A> <32F8> <32F9> <630F> <32FA> <32FD> <6312> <32FE> <32FF> <6317> <3302> <3303> <6326> <3305> <3307> <632C> <3308> <3309> <6330> <330A> <330F> <6333> <3310> <3311> <633B> <3312> <3314> <633F> endbfrange 100 beginbfrange <3316> <3317> <6347> <3319> <331C> <6351> <331D> <3324> <6356> <3326> <3328> <6364> <332B> <332C> <636F> <332D> <332F> <6373> <3330> <3331> <6378> <3332> <3335> <637C> <3337> <3338> <6385> <333C> <333E> <6393> <3340> <3346> <6399> <334C> <334D> <63B1> <334E> <334F> <63B5> <3354> <3356> <63C1> <3358> <3359> <63C7> <335A> <335C> <63CA> <335E> <3360> <63D3> <3361> <3363> <63D7> <3364> <3366> <63DB> <3369> <336D> <63E4> <336E> <336F> <63EB> <3370> <3372> <63EF> <3376> <3379> <63F9> <337B> <337C> <6403> <337D> <3381> <6406> <3383> <3384> <6411> <3385> <3386> <6415> <3387> <3389> <6418> <338C> <338F> <6422> <3390> <3392> <6427> <3394> <3399> <642E> <339B> <339D> <6437> <339E> <339F> <643B> <33A2> <33A3> <6442> <33A5> <33AA> <644B> <33AC> <33AE> <6455> <33AF> <33B1> <6459> <33B3> <33B9> <6460> <33BB> <33BD> <646A> <33BF> <33C1> <6470> <33C2> <33C3> <6474> <33C5> <33CA> <647C> <33CD> <33D4> <6489> <33D6> <33D7> <6497> <33D8> <33DB> <649A> <33DC> <33DE> <64A0> <33DF> <33E1> <64A6> <33EB> <33EC> <64C8> <33F1> <33F2> <64D5> <33F4> <33F6> <64DB> <33FB> <33FF> <64E7> <3400> <3401> <64ED> <3403> <3404> <64F5> <3405> <3406> <64F8> <3409> <340B> <6501> <340D> <340E> <6507> <340F> <3413> <650A> <3414> <3415> <6510> <341B> <341E> <651E> <341F> <3422> <6526> <3424> <3427> <6530> <342A> <342B> <653C> <342C> <3430> <6540> <3431> <3432> <6546> <3433> <3434> <654A> <3435> <3436> <654D> <3438> <343A> <6552> <343E> <3440> <655F> <3441> <3442> <6564> <3443> <3446> <6567> <3447> <3449> <656D> <344D> <3455> <6579> <3456> <3458> <6584> <3459> <345B> <6588> <345C> <345E> <658D> <3464> <3465> <659D> <3467> <3468> <65A2> <346D> <3472> <65B1> <3474> <3475> <65BA> <3476> <3478> <65BE> <347A> <347D> <65C7> <347F> <3480> <65D0> <3481> <3483> <65D3> <3484> <348B> <65D8> <348D> <348E> <65E3> <348F> <3490> <65EA> <3491> <3494> <65F2> <3495> <3496> <65F8> <3497> <349B> <65FB> <349D> <349E> <6604> <349F> <34A1> <6607> <34A4> <34A6> <6610> <34A7> <34A9> <6616> <34AA> <34AC> <661A> <34AE> <34B1> <6621> <34B3> <34B6> <6629> <34B9> <34BA> <6632> <34BB> <34BF> <6637> <34C1> <34C2> <663F> <34C3> <34C9> <6644> endbfrange 100 beginbfrange <34CA> <34CB> <664D> <34CC> <34CD> <6650> <34CE> <34CF> <6658> <34D0> <34D1> <665B> <34D4> <34D5> <6662> <34D8> <34DC> <6669> <34DD> <34DF> <6671> <34E1> <34E2> <6678> <34E3> <34E5> <667B> <34E6> <34E8> <667F> <34EA> <34EB> <6685> <34EC> <34ED> <668A> <34EE> <34F1> <668D> <34F2> <34F5> <6692> <34F6> <34FA> <6698> <34FB> <34FE> <669E> <3500> <3502> <66A4> <3503> <3504> <66A9> <3505> <3506> <66AC> <3507> <350B> <66AF> <350C> <350F> <66B5> <3510> <3513> <66BA> <3514> <3518> <66BF> <351B> <3526> <66CA> <3527> <3528> <66D7> <352A> <352B> <66DE> <352C> <3530> <66E1> <3531> <3532> <66E7> <3533> <3534> <66EA> <3535> <3537> <66ED> <3539> <353A> <66F5> <353B> <353C> <66FA> <353E> <353F> <6701> <3540> <3543> <6704> <3545> <3546> <670E> <3547> <3549> <6711> <354B> <354D> <6718> <3550> <3555> <6720> <3559> <355A> <6732> <355B> <355E> <6736> <355F> <3560> <673B> <3561> <3562> <673E> <3564> <3565> <6744> <3567> <3568> <674A> <356B> <356C> <6754> <356D> <3571> <6757> <3573> <3575> <6762> <3576> <3577> <6766> <3578> <3579> <676B> <357D> <3580> <6778> <3583> <3584> <6782> <3585> <3586> <6785> <3589> <358C> <678C> <358D> <3590> <6791> <3594> <3596> <679F> <359C> <359D> <67B1> <359F> <35A6> <67B9> <35A8> <35B1> <67C5> <35B2> <35B4> <67D5> <35B8> <35B9> <67E3> <35BA> <35BC> <67E6> <35BD> <35BE> <67EA> <35BF> <35C0> <67ED> <35C2> <35C9> <67F5> <35CB> <35CE> <6801> <35D3> <35D4> <6814> <35D5> <35D9> <6818> <35DA> <35DC> <681E> <35DD> <35E3> <6822> <35E4> <35EA> <682B> <35EB> <35ED> <6834> <35EE> <35EF> <683A> <35F6> <35FF> <6856> <3601> <3608> <686C> <360A> <3612> <6878> <3615> <361C> <6887> <361D> <361F> <6890> <3620> <3622> <6894> <3623> <3626> <6899> <3628> <3629> <68A0> <362A> <362C> <68A3> <362D> <3630> <68A9> <3632> <3633> <68B1> <3635> <363E> <68B6> <3640> <3645> <68C3> <3648> <364B> <68CE> <364C> <364D> <68D3> <364F> <3652> <68DB> <3653> <3654> <68E1> <3655> <3657> <68E4> <3658> <365D> <68E8> <365F> <3661> <68F2> <3662> <3664> <68F6> <3666> <3669> <68FD> <366A> <366C> <6902> <366D> <3671> <6906> <3674> <367F> <6913> <3680> <3682> <6921> <3683> <368A> <6925> <368B> <368C> <692E> endbfrange 100 beginbfrange <368D> <368F> <6931> <3690> <3693> <6935> <3694> <3696> <693A> <3698> <3699> <6940> <369A> <36A0> <6943> <36A1> <36A8> <694B> <36A9> <36AA> <6955> <36AB> <36AC> <6958> <36AD> <36AE> <695B> <36B0> <36B1> <6961> <36B2> <36B3> <6964> <36B5> <36B6> <6969> <36B8> <36B9> <696F> <36BA> <36BC> <6972> <36BE> <36BF> <697A> <36C0> <36C2> <697D> <36C6> <36C8> <698A> <36C9> <36CE> <698E> <36CF> <36D0> <6996> <36D1> <36D2> <6999> <36D3> <36DC> <699D> <36DF> <36E0> <69AF> <36E1> <36E2> <69B2> <36E3> <36E4> <69B5> <36E5> <36E7> <69B8> <36E8> <36EA> <69BC> <36EC> <36F3> <69C2> <36F5> <36F7> <69D1> <36F8> <36FD> <69D5> <36FE> <36FF> <69DC> <3701> <3706> <69E1> <3707> <370B> <69E8> <370C> <370F> <69EE> <3710> <3718> <69F4> <371B> <371C> <6A03> <371D> <3720> <6A06> <3721> <3728> <6A0B> <3729> <372B> <6A14> <372C> <372F> <6A1A> <3732> <3735> <6A24> <3737> <373A> <6A2B> <373C> <373E> <6A32> <373F> <3740> <6A36> <3741> <3742> <6A3B> <3743> <3747> <6A3F> <3748> <3749> <6A45> <374A> <374B> <6A49> <374C> <374F> <6A4C> <3750> <3756> <6A51> <3758> <375A> <6A5C> <375C> <375D> <6A63> <375E> <3768> <6A66> <3769> <376F> <6A72> <3770> <3771> <6A7A> <3772> <3774> <6A7D> <3775> <3777> <6A81> <3778> <377B> <6A85> <377C> <377F> <6A8A> <3781> <3782> <6A92> <3783> <3784> <6A95> <3785> <3788> <6A98> <3789> <378B> <6A9D> <378D> <3791> <6AA4> <3793> <3794> <6AAD> <3795> <3797> <6AB0> <3798> <379B> <6AB4> <379C> <379D> <6AB9> <379E> <37A4> <6ABC> <37A5> <37B3> <6AC4> <37B4> <37B9> <6AD4> <37BB> <37C1> <6AE0> <37C4> <37C9> <6AED> <37CA> <37CD> <6AF4> <37CE> <37CF> <6AF9> <37D0> <37D7> <6AFC> <37D8> <37DC> <6B05> <37DD> <37E0> <6B0B> <37E1> <37E2> <6B10> <37E3> <37E5> <6B13> <37E6> <37EC> <6B17> <37EE> <37EF> <6B25> <37F0> <37F9> <6B28> <37FA> <37FD> <6B33> <3801> <3804> <6B3F> <3805> <3806> <6B44> <3808> <3809> <6B4A> <380A> <380C> <6B4D> <380D> <3814> <6B51> <3815> <3819> <6B5A> <381B> <381C> <6B68> <381D> <3823> <6B6B> <3824> <3827> <6B73> <3829> <382C> <6B7D> <3830> <3833> <6B8E> <3834> <3835> <6B94> <3838> <3839> <6B9C> <383A> <383B> <6B9F> <383C> <383D> <6BA2> <383E> <3842> <6BA5> <3843> <3844> <6BAC> endbfrange 100 beginbfrange <3845> <3846> <6BB0> <3848> <3849> <6BB8> <384A> <384C> <6BBC> <384E> <384F> <6BC3> <3850> <3853> <6BC7> <3856> <3857> <6BD0> <385A> <385E> <6BDC> <385F> <3866> <6BE2> <3867> <3869> <6BEC> <386A> <386C> <6BF0> <386E> <3870> <6BF6> <3871> <3873> <6BFA> <3875> <3879> <6C00> <387A> <387C> <6C09> <3880> <3882> <6C1C> <3888> <3889> <6C36> <388A> <388D> <6C39> <388E> <388F> <6C3E> <3890> <3892> <6C43> <3894> <3898> <6C4B> <3899> <389B> <6C51> <389D> <389F> <6C58> <38A0> <38A1> <6C62> <38A2> <38A4> <6C65> <38A5> <38A9> <6C6B> <38AD> <38AE> <6C77> <38AF> <38B1> <6C7A> <38B2> <38B3> <6C7F> <38B6> <38B7> <6C8A> <38B8> <38B9> <6C8D> <38BA> <38BB> <6C91> <38BC> <38BF> <6C95> <38C1> <38C3> <6C9C> <38C8> <38C9> <6CAF> <38CA> <38CD> <6CB4> <38CF> <38D2> <6CC0> <38D3> <38D5> <6CC6> <38D7> <38D9> <6CCD> <38DA> <38DB> <6CD1> <38DC> <38DE> <6CD8> <38DF> <38E0> <6CDC> <38E3> <38E4> <6CE6> <38E6> <38E7> <6CEC> <38EB> <38EC> <6CFF> <38ED> <38EE> <6D02> <38EF> <38F0> <6D05> <38F1> <38F3> <6D08> <38F5> <38F7> <6D0F> <38F8> <38FB> <6D13> <38FD> <38FE> <6D1C> <3900> <3904> <6D20> <3906> <3907> <6D28> <3908> <3909> <6D2C> <390A> <390B> <6D2F> <390D> <390F> <6D36> <3911> <3912> <6D3F> <3918> <391B> <6D55> <391F> <3920> <6D61> <3921> <3922> <6D64> <3923> <3924> <6D67> <3925> <3927> <6D6B> <3928> <392B> <6D70> <392C> <392D> <6D75> <392E> <392F> <6D7A> <3930> <3934> <6D7D> <3935> <3936> <6D83> <3938> <3939> <6D8A> <393B> <393C> <6D8F> <393E> <3942> <6D96> <3946> <3947> <6DAC> <3948> <3949> <6DB0> <394A> <394B> <6DB3> <394C> <394D> <6DB6> <394E> <3953> <6DB9> <3954> <3956> <6DC1> <3957> <3959> <6DC8> <395A> <395D> <6DCD> <395E> <3961> <6DD2> <3963> <3965> <6DDA> <3967> <3968> <6DE2> <396A> <396C> <6DE7> <396E> <396F> <6DEF> <3973> <397A> <6DFD> <397B> <397E> <6E06> <3981> <3982> <6E12> <3984> <3985> <6E18> <3986> <3987> <6E1B> <3988> <3989> <6E1E> <398B> <398C> <6E27> <398F> <3990> <6E30> <3992> <3994> <6E35> <3996> <3998> <6E3B> <3999> <399C> <6E3F> <399D> <39A4> <6E45> <39A5> <39A8> <6E4F> <39AB> <39AC> <6E59> <39AD> <39AE> <6E5C> <39AF> <39B9> <6E60> <39BA> <39BB> <6E6C> <39BC> <39C9> <6E70> endbfrange 100 beginbfrange <39CA> <39CC> <6E80> <39CE> <39CF> <6E87> <39D0> <39D4> <6E8A> <39D5> <39D9> <6E91> <39DB> <39DD> <6E99> <39DF> <39E0> <6EA0> <39E1> <39E2> <6EA3> <39E4> <39E5> <6EA8> <39E6> <39E9> <6EAB> <39ED> <39EE> <6EB8> <39F0> <39F2> <6EBE> <39F5> <39F7> <6EC8> <39FC> <39FD> <6ED8> <39FE> <39FF> <6EDB> <3A03> <3A04> <6EEA> <3A05> <3A06> <6EED> <3A07> <3A08> <6EF0> <3A0A> <3A0B> <6EF5> <3A0C> <3A10> <6EFA> <3A12> <3A14> <6F03> <3A15> <3A16> <6F07> <3A17> <3A1B> <6F0A> <3A1C> <3A1E> <6F10> <3A1F> <3A22> <6F16> <3A23> <3A27> <6F1B> <3A29> <3A2C> <6F25> <3A2F> <3A30> <6F34> <3A32> <3A36> <6F39> <3A38> <3A3B> <6F42> <3A3C> <3A3E> <6F48> <3A40> <3A42> <6F4E> <3A43> <3A44> <6F52> <3A45> <3A47> <6F55> <3A48> <3A49> <6F5A> <3A4B> <3A4D> <6F5F> <3A50> <3A55> <6F67> <3A58> <3A59> <6F75> <3A5C> <3A5D> <6F7D> <3A5E> <3A60> <6F81> <3A62> <3A63> <6F8A> <3A64> <3A6B> <6F8F> <3A6C> <3A6F> <6F98> <3A70> <3A72> <6F9D> <3A73> <3A74> <6FA2> <3A75> <3A76> <6FA5> <3A78> <3A7B> <6FAA> <3A7C> <3A7D> <6FAF> <3A7F> <3A80> <6FB4> <3A81> <3A82> <6FB7> <3A83> <3A88> <6FBA> <3A89> <3A8D> <6FC4> <3A8E> <3A94> <6FCA> <3A95> <3A96> <6FD3> <3A97> <3A98> <6FD6> <3A99> <3A9A> <6FD9> <3A9B> <3A9C> <6FDC> <3A9D> <3A9E> <6FE2> <3A9F> <3AA4> <6FE5> <3AA5> <3AA6> <6FEC> <3AA7> <3AAE> <6FF2> <3AB1> <3AB6> <6FFF> <3AB7> <3AB8> <7007> <3ABA> <3ABC> <700C> <3ABE> <3AC0> <7012> <3AC1> <3AC2> <7016> <3AC6> <3AC7> <7021> <3AC8> <3ACA> <7024> <3ACB> <3AD1> <7029> <3AD3> <3AD4> <7033> <3AD5> <3AD7> <7036> <3AD8> <3ADB> <703A> <3ADC> <3ADF> <703F> <3AE0> <3AE6> <7045> <3AE7> <3AE8> <704D> <3AEA> <3AEC> <7052> <3AED> <3AEE> <7056> <3AEF> <3AF2> <7059> <3AF3> <3AF6> <705F> <3AF7> <3AF8> <7065> <3AF9> <3AFB> <7068> <3AFD> <3AFF> <7071> <3B02> <3B04> <7079> <3B06> <3B09> <7081> <3B0A> <3B0C> <7086> <3B0D> <3B0F> <708B> <3B10> <3B12> <708F> <3B14> <3B15> <7097> <3B16> <3B17> <709A> <3B18> <3B24> <709E> <3B27> <3B29> <70B4> <3B2B> <3B2C> <70BE> <3B2D> <3B30> <70C4> <3B32> <3B35> <70CB> <3B36> <3B3D> <70D0> <3B3F> <3B41> <70DC> <3B42> <3B45> <70E0> <3B49> <3B4C> <70F0> <3B4D> <3B4E> <70F5> <3B50> <3B52> <70FA> <3B53> <3B5D> <70FE> endbfrange 100 beginbfrange <3B5E> <3B62> <710B> <3B63> <3B64> <7111> <3B67> <3B6C> <711B> <3B6D> <3B70> <7122> <3B71> <3B78> <7127> <3B79> <3B7C> <7132> <3B7D> <3B8A> <7137> <3B8B> <3B8D> <7146> <3B90> <3B92> <714F> <3B93> <3B9B> <7153> <3B9D> <3B9F> <715F> <3BA2> <3BA3> <716A> <3BA5> <3BA7> <716F> <3BA8> <3BAB> <7174> <3BAD> <3BAE> <717B> <3BAF> <3BB4> <717E> <3BB5> <3BB9> <7185> <3BBA> <3BBD> <718B> <3BBE> <3BBF> <7190> <3BC1> <3BC2> <7195> <3BC3> <3BC7> <719A> <3BC8> <3BCE> <71A1> <3BCF> <3BD1> <71A9> <3BD2> <3BD5> <71AD> <3BD8> <3BDA> <71B6> <3BDB> <3BDE> <71BA> <3BDF> <3BE0> <71BF> <3BE2> <3BE5> <71C4> <3BE6> <3BEA> <71C9> <3BEB> <3BED> <71CF> <3BEF> <3BF1> <71D6> <3BF2> <3BF3> <71DA> <3BF4> <3BF5> <71DD> <3BF6> <3BF9> <71E1> <3BFA> <3BFE> <71E8> <3C00> <3C03> <71F0> <3C04> <3C07> <71F5> <3C08> <3C09> <71FA> <3C0B> <3C11> <71FF> <3C12> <3C17> <7207> <3C18> <3C19> <720E> <3C1A> <3C23> <7211> <3C25> <3C2E> <721E> <3C31> <3C33> <722D> <3C34> <3C35> <7233> <3C37> <3C3D> <7240> <3C3E> <3C40> <7249> <3C41> <3C44> <724E> <3C45> <3C47> <7253> <3C4D> <3C4F> <7263> <3C51> <3C54> <726A> <3C55> <3C56> <7270> <3C57> <3C58> <7273> <3C59> <3C5B> <7276> <3C5C> <3C5D> <727B> <3C5E> <3C5F> <7282> <3C60> <3C64> <7285> <3C67> <3C68> <7290> <3C69> <3C6B> <7293> <3C6C> <3C73> <7297> <3C74> <3C75> <72A0> <3C76> <3C79> <72A3> <3C7A> <3C7D> <72A8> <3C7F> <3C81> <72B1> <3C83> <3C88> <72BA> <3C89> <3C8B> <72C5> <3C8C> <3C8F> <72C9> <3C92> <3C95> <72D3> <3C97> <3C9A> <72DA> <3C9C> <3CA1> <72E2> <3CA2> <3CA3> <72EA> <3CA4> <3CA5> <72F5> <3CA6> <3CA8> <72FE> <3CAA> <3CAF> <7304> <3CB0> <3CB2> <730B> <3CB3> <3CB6> <730F> <3CB8> <3CBA> <7318> <3CBB> <3CBC> <731F> <3CBD> <3CBE> <7323> <3CBF> <3CC1> <7326> <3CC3> <3CC4> <732F> <3CC5> <3CC6> <7332> <3CC9> <3CCA> <733C> <3CCC> <3CCD> <7342> <3CCE> <3CD4> <7346> <3CD5> <3CD6> <734E> <3CD8> <3CDB> <7353> <3CDC> <3CE3> <7358> <3CE4> <3CEA> <7361> <3CEE> <3CEF> <7373> <3CF4> <3CF6> <7381> <3CF7> <3CF8> <7385> <3CFB> <3CFC> <738C> <3CFD> <3CFE> <738F> <3D00> <3D02> <7393> <3D03> <3D06> <7397> <3D07> <3D09> <739C> <3D0A> <3D0B> <73A0> <3D0C> <3D11> <73A3> <3D13> <3D14> <73AC> endbfrange 100 beginbfrange <3D16> <3D18> <73B4> <3D19> <3D1A> <73B8> <3D1B> <3D1E> <73BC> <3D20> <3D24> <73C3> <3D25> <3D26> <73CB> <3D28> <3D2E> <73D2> <3D2F> <3D32> <73DA> <3D34> <3D37> <73E1> <3D3A> <3D3C> <73EA> <3D3D> <3D40> <73EE> <3D41> <3D4B> <73F3> <3D4C> <3D4F> <73FF> <3D51> <3D52> <7407> <3D53> <3D56> <740B> <3D57> <3D5F> <7411> <3D60> <3D65> <741C> <3D66> <3D67> <7423> <3D6D> <3D6E> <7431> <3D6F> <3D73> <7437> <3D74> <3D75> <743D> <3D77> <3D7F> <7442> <3D80> <3D88> <744C> <3D8C> <3D8E> <7460> <3D8F> <3D93> <7464> <3D94> <3D95> <746B> <3D96> <3D97> <746E> <3D98> <3D9C> <7471> <3D9D> <3DA2> <7478> <3DA5> <3DA7> <7484> <3DAA> <3DAB> <748C> <3DAD> <3DB7> <7491> <3DB9> <3DBC> <749F> <3DBD> <3DBE> <74A4> <3DBF> <3DC4> <74AA> <3DC5> <3DCD> <74B1> <3DCE> <3DCF> <74BB> <3DD0> <3DDB> <74BE> <3DDC> <3DDF> <74CB> <3DE0> <3DE1> <74D0> <3DE3> <3DE7> <74D5> <3DED> <3DF3> <74E7> <3DF4> <3DF7> <74F0> <3DF9> <3DFF> <74F8> <3E00> <3E03> <7500> <3E04> <3E0A> <7505> <3E0E> <3E11> <7514> <3E13> <3E14> <751D> <3E15> <3E17> <7520> <3E19> <3E1A> <7526> <3E20> <3E21> <753C> <3E23> <3E26> <7541> <3E27> <3E28> <7546> <3E29> <3E2A> <7549> <3E2C> <3E2F> <7550> <3E30> <3E33> <7555> <3E34> <3E37> <755E> <3E38> <3E39> <7563> <3E3A> <3E3C> <7567> <3E3D> <3E42> <756C> <3E46> <3E4A> <757A> <3E4B> <3E4D> <7580> <3E4E> <3E4F> <7584> <3E50> <3E52> <7588> <3E53> <3E55> <758C> <3E5A> <3E5B> <759B> <3E5E> <3E62> <75A6> <3E64> <3E65> <75B6> <3E66> <3E67> <75BA> <3E68> <3E6A> <75BF> <3E6C> <3E6D> <75CB> <3E6E> <3E71> <75CE> <3E75> <3E76> <75DC> <3E77> <3E79> <75DF> <3E7C> <3E7F> <75EC> <3E80> <3E81> <75F2> <3E82> <3E85> <75F5> <3E86> <3E87> <75FA> <3E88> <3E89> <75FD> <3E8B> <3E8E> <7606> <3E8F> <3E90> <760E> <3E91> <3E94> <7611> <3E97> <3E98> <761C> <3E9C> <3E9D> <762E> <3E9E> <3E9F> <7631> <3EA0> <3EA1> <7636> <3EA2> <3EA3> <7639> <3EA6> <3EA7> <7644> <3EA9> <3EAA> <764A> <3EAB> <3EB0> <764E> <3EB3> <3EB5> <7659> <3EB7> <3EB8> <7660> <3EBC> <3EC0> <7673> <3EC1> <3EC2> <7679> <3EC3> <3EC5> <767F> <3EC8> <3EC9> <7689> <3ECA> <3ECB> <768C> <3ECC> <3ECD> <768F> <3ECF> <3ED0> <7694> <3ED1> <3ED2> <7697> <3ED3> <3EDB> <769B> endbfrange 100 beginbfrange <3EDC> <3EE4> <76A5> <3EE5> <3EE6> <76AF> <3EE8> <3EEA> <76B5> <3EEC> <3EEF> <76BB> <3EF0> <3EF1> <76C0> <3EF2> <3EF3> <76C3> <3EF6> <3EF7> <76CB> <3EFA> <3EFB> <76D9> <3EFC> <3EFD> <76DC> <3F01> <3F06> <76E8> <3F09> <3F0B> <76F5> <3F0C> <3F0D> <76FA> <3F0F> <3F10> <76FF> <3F11> <3F12> <7702> <3F13> <3F14> <7705> <3F17> <3F21> <770E> <3F22> <3F25> <771B> <3F27> <3F29> <7723> <3F2B> <3F2D> <772A> <3F2F> <3F33> <7730> <3F36> <3F38> <773D> <3F3A> <3F3C> <7744> <3F3D> <3F43> <7748> <3F44> <3F4B> <7752> <3F4C> <3F4D> <775C> <3F4E> <3F4F> <775F> <3F52> <3F53> <7769> <3F54> <3F5F> <776D> <3F60> <3F62> <777A> <3F63> <3F65> <7781> <3F66> <3F6B> <7786> <3F6C> <3F6D> <778F> <3F6E> <3F72> <7793> <3F73> <3F77> <7799> <3F79> <3F7A> <77A3> <3F7E> <3F7F> <77AE> <3F80> <3F81> <77B1> <3F83> <3F87> <77B6> <3F89> <3F8F> <77C0> <3F90> <3F94> <77C8> <3F95> <3F9D> <77CE> <3F9E> <3F9F> <77D8> <3FA0> <3FA4> <77DD> <3FA9> <3FAB> <77F0> <3FAC> <3FAD> <77F4> <3FAF> <3FB2> <77F9> <3FB3> <3FB8> <7803> <3FB9> <3FBA> <780A> <3FBB> <3FBD> <780E> <3FC3> <3FC5> <7820> <3FC8> <3FC9> <782A> <3FCA> <3FCB> <782E> <3FCC> <3FCE> <7831> <3FCF> <3FD0> <7835> <3FD3> <3FD4> <7841> <3FD7> <3FDA> <7848> <3FDE> <3FDF> <7853> <3FE0> <3FE4> <7858> <3FE5> <3FEA> <785E> <3FEB> <3FED> <7865> <3FEF> <3FF5> <7870> <3FF6> <3FF9> <7878> <3FFA> <3FFF> <787D> <4000> <4003> <7883> <4005> <4006> <788A> <4007> <4008> <788F> <400A> <400C> <7894> <400E> <400F> <789D> <4015> <4017> <78AA> <4018> <4019> <78AE> <401A> <401C> <78B5> <401F> <4020> <78BF> <4021> <4023> <78C2> <4024> <4026> <78C6> <4027> <402A> <78CC> <402B> <402D> <78D1> <402E> <4030> <78D6> <4031> <4038> <78DB> <4039> <403B> <78E4> <403C> <403E> <78E9> <403F> <4040> <78ED> <4041> <4042> <78F0> <4044> <4045> <78F5> <4046> <4047> <78F8> <4048> <4049> <78FB> <404A> <404C> <78FE> <404D> <404F> <7902> <4050> <4057> <7906> <4058> <405B> <790F> <405C> <4060> <7914> <4061> <4064> <791A> <4065> <4069> <791F> <406B> <406D> <7927> <406E> <4071> <792D> <4072> <4073> <7932> <4074> <4078> <7935> <407B> <407E> <7942> <4080> <4088> <794A> <4089> <408A> <7954> <408B> <408C> <7958> endbfrange 100 beginbfrange <408E> <408F> <7963> <4091> <4094> <7969> <4096> <409C> <7970> <409E> <40A2> <797B> <40A3> <40A4> <7982> <40A5> <40A8> <7986> <40A9> <40AA> <798B> <40AB> <40B4> <7990> <40B5> <40BF> <799B> <40C0> <40C1> <79A8> <40C2> <40C4> <79AB> <40C7> <40CB> <79B4> <40CF> <40D0> <79C4> <40D1> <40D2> <79C7> <40D5> <40D7> <79CE> <40D8> <40D9> <79D3> <40DA> <40DB> <79D6> <40DC> <40E1> <79D9> <40E2> <40E4> <79E0> <40EA> <40F0> <79F1> <40F1> <40F2> <79F9> <40F4> <40F5> <79FE> <40F7> <40F8> <7A04> <40F9> <40FC> <7A07> <40FE> <40FF> <7A0F> <4100> <4102> <7A11> <4103> <4104> <7A15> <4105> <4106> <7A18> <4107> <4109> <7A1B> <410B> <410C> <7A21> <410D> <4116> <7A24> <4117> <4118> <7A2F> <411A> <411C> <7A34> <4120> <4124> <7A41> <4125> <4129> <7A47> <412A> <412B> <7A4F> <412C> <4130> <7A52> <4131> <4139> <7A58> <413A> <413F> <7A63> <4141> <4144> <7A6C> <4145> <4147> <7A71> <4149> <414C> <7A7B> <4150> <4153> <7A89> <4154> <4156> <7A8E> <4157> <4158> <7A93> <4159> <415B> <7A99> <415D> <4160> <7AA1> <4163> <4166> <7AAF> <4167> <4168> <7AB4> <4169> <416B> <7AB7> <416C> <416F> <7ABB> <4170> <4173> <7AC0> <4176> <417F> <7ACC> <4180> <4181> <7AD7> <4182> <4185> <7ADA> <4186> <4187> <7AE1> <4189> <418B> <7AE7> <418C> <418D> <7AEB> <418F> <4194> <7AF0> <4195> <4196> <7AF7> <4197> <4198> <7AFB> <419A> <419C> <7B00> <41A0> <41A2> <7B0C> <41A4> <41A5> <7B12> <41A6> <41A8> <7B16> <41AA> <41AB> <7B1C> <41AD> <41AF> <7B21> <41B3> <41B4> <7B2F> <41B6> <41B9> <7B34> <41BD> <41C2> <7B3F> <41C5> <41C6> <7B4D> <41CC> <41CD> <7B5E> <41CF> <41D2> <7B63> <41D3> <41D8> <7B68> <41D9> <41DA> <7B6F> <41DB> <41DC> <7B73> <41E0> <41E1> <7B7C> <41E3> <41E6> <7B81> <41E7> <41EB> <7B86> <41ED> <41EE> <7B8E> <41EF> <41F1> <7B91> <41F3> <41F6> <7B98> <41F7> <41F9> <7B9E> <41FA> <41FC> <7BA3> <41FD> <41FF> <7BAE> <4200> <4201> <7BB2> <4202> <4204> <7BB5> <4205> <420B> <7BB9> <420C> <420D> <7BC2> <4211> <4214> <7BCD> <4216> <421A> <7BD4> <421B> <421C> <7BDB> <421D> <421F> <7BDE> <4220> <4221> <7BE2> <4222> <4223> <7BE7> <4224> <4226> <7BEB> <4227> <4228> <7BEF> <422A> <422C> <7BF4> <422D> <4230> <7BF8> <4233> <4238> <7C01> endbfrange 100 beginbfrange <4239> <423B> <7C08> <423D> <4242> <7C10> <4243> <4249> <7C17> <424C> <424D> <7C24> <424E> <424F> <7C28> <4250> <425B> <7C2C> <425C> <425F> <7C39> <4261> <4268> <7C44> <4269> <4276> <7C4E> <4277> <4278> <7C5D> <4279> <427B> <7C61> <427C> <427F> <7C65> <4282> <4284> <7C6F> <4285> <428A> <7C75> <428B> <4295> <7C7E> <4296> <429C> <7C8A> <429D> <429E> <7C93> <42A0> <42A2> <7C99> <42A3> <42A4> <7CA0> <42A6> <42A9> <7CA6> <42AA> <42AC> <7CAB> <42AD> <42AE> <7CAF> <42AF> <42B3> <7CB4> <42B4> <42B5> <7CBA> <42B6> <42B7> <7CBF> <42B8> <42BA> <7CC2> <42BE> <42C4> <7CCE> <42C6> <42C7> <7CDA> <42C8> <42CD> <7CE1> <42CE> <42D3> <7CE9> <42D9> <42DA> <7CFC> <42DF> <42E0> <7D0E> <42E1> <42E2> <7D11> <42E5> <42E7> <7D1D> <42E8> <42EB> <7D23> <42EC> <42EE> <7D28> <42EF> <42F1> <7D2C> <42F2> <42F6> <7D34> <42F8> <42F9> <7D3D> <42FD> <42FF> <7D47> <4300> <4303> <7D4A> <4305> <4310> <7D51> <4311> <4312> <7D5F> <4313> <4315> <7D63> <4317> <431B> <7D69> <431C> <431D> <7D6F> <431E> <431F> <7D74> <4321> <4327> <7D7A> <4329> <432A> <7D84> <432C> <4330> <7D8A> <4331> <4333> <7D90> <4334> <433B> <7D94> <433D> <433F> <7D9F> <4340> <4341> <7DA4> <4342> <4345> <7DA7> <4347> <4349> <7DB5> <434B> <434E> <7DC0> <434F> <4350> <7DC5> <4351> <4352> <7DC8> <4353> <4357> <7DCC> <4359> <435A> <7DD5> <435B> <435D> <7DDA> <4360> <4361> <7DE4> <4363> <4364> <7DEA> <4365> <4366> <7DED> <436A> <436B> <7DF7> <436D> <4378> <7DFC> <4379> <437C> <7E0C> <437D> <4385> <7E12> <4387> <4389> <7E20> <438A> <438C> <7E24> <438D> <438F> <7E28> <4391> <4392> <7E2F> <4397> <4398> <7E3F> <4399> <439B> <7E42> <439C> <43A5> <7E48> <43A7> <43AA> <7E56> <43AB> <43AD> <7E5B> <43AE> <43B0> <7E5F> <43B1> <43B6> <7E63> <43B8> <43B9> <7E71> <43BA> <43BE> <7E74> <43BF> <43C0> <7E7A> <43C1> <43C3> <7E7F> <43C4> <43C8> <7E83> <43CC> <43CE> <7E90> <43D1> <43D2> <7E99> <43D3> <43D4> <7E9D> <43D7> <43D8> <7EBB> <43E2> <43E8> <7F3B> <43EA> <43EF> <7F46> <43F2> <43F3> <7F52> <43F6> <43F9> <7F5B> <43FB> <43FF> <7F63> <4400> <4402> <7F6B> <4405> <4406> <7F75> <4408> <440B> <7F7A> <440C> <440D> <7F7F> <440E> <4410> <7F82> <4415> <4419> <7F8F> endbfrange 100 beginbfrange <441A> <441E> <7F95> <441F> <4420> <7F9B> <4422> <4423> <7FA2> <4426> <442A> <7FAA> <442C> <4430> <7FB3> <4431> <4432> <7FBA> <4435> <4437> <7FC2> <4438> <443B> <7FC6> <443E> <4440> <7FCF> <4442> <4443> <7FD6> <4444> <4449> <7FD9> <444A> <444C> <7FE2> <444D> <444E> <7FE7> <444F> <4452> <7FEA> <4455> <4459> <7FF4> <445B> <445D> <7FFD> <445F> <4462> <8007> <4463> <4464> <800E> <4467> <4468> <801A> <4469> <446B> <801D> <446D> <446E> <8023> <4471> <4472> <802F> <4475> <4476> <8039> <4479> <447A> <8040> <447B> <447C> <8044> <447D> <447F> <8047> <4480> <4483> <804E> <4488> <448A> <805B> <448B> <4494> <805F> <4495> <4498> <806B> <449B> <449D> <807A> <449E> <449F> <8081> <44A2> <44A7> <808D> <44A8> <44A9> <8094> <44AE> <44B0> <80A6> <44B4> <44B5> <80B5> <44B6> <44B7> <80B8> <44BA> <44BE> <80C7> <44BF> <44C5> <80CF> <44C7> <44C8> <80DF> <44C9> <44CA> <80E2> <44D1> <44D4> <80FE> <44D5> <44D6> <8103> <44D7> <44D8> <8107> <44D9> <44DA> <810B> <44DE> <44DF> <811C> <44E0> <44EC> <811F> <44ED> <44EE> <812D> <44F0> <44F2> <8133> <44F4> <44F7> <813A> <44F8> <44FE> <813F> <4504> <4505> <8157> <4506> <450A> <815B> <450B> <450D> <8162> <4512> <4513> <8172> <4514> <4516> <8175> <4518> <451C> <8183> <451E> <4521> <818B> <4523> <4528> <8192> <452A> <452B> <819E> <452C> <452D> <81A1> <452E> <452F> <81A4> <4531> <4538> <81AB> <4539> <453E> <81B4> <4540> <4541> <81C4> <4542> <4543> <81C7> <4546> <454D> <81D0> <454F> <4552> <81DB> <4553> <4554> <81E1> <4555> <4557> <81E4> <455A> <455E> <81EE> <455F> <4563> <81F5> <4568> <4569> <820E> <456C> <4571> <8215> <4574> <4577> <8224> <457C> <457D> <823C> <457E> <4582> <823F> <4583> <4584> <8245> <4587> <4589> <824C> <458A> <4591> <8250> <4592> <4595> <825B> <4596> <4599> <8260> <459C> <459D> <8269> <459E> <459F> <826C> <45A0> <45A1> <8275> <45A3> <45A4> <827B> <45A5> <45A6> <8280> <45A8> <45AA> <8285> <45AE> <45B1> <8293> <45B2> <45B3> <829A> <45B6> <45B7> <82A2> <45BA> <45BB> <82B5> <45BE> <45BF> <82BF> <45C0> <45C1> <82C2> <45C2> <45C3> <82C5> <45C7> <45C8> <82D9> <45CB> <45CD> <82E8> <45CE> <45D0> <82EC> <45D2> <45D3> <82F2> <45D4> <45D5> <82F5> endbfrange 100 beginbfrange <45D8> <45DC> <82FC> <45DD> <45DE> <830A> <45E1> <45E2> <8312> <45E4> <45E5> <8318> <45E6> <45EF> <831D> <45F0> <45F1> <8329> <45F7> <45F9> <833D> <45FA> <45FB> <8341> <45FC> <45FD> <8344> <4600> <4603> <834B> <4605> <4609> <8355> <460C> <4612> <8370> <4613> <4614> <8379> <4615> <461B> <837E> <461C> <461D> <8387> <461E> <4620> <838B> <4621> <4623> <838F> <4624> <4625> <8394> <4627> <4628> <8399> <462C> <462F> <83A3> <4630> <4633> <83AC> <4636> <4637> <83BE> <4638> <463A> <83C2> <463C> <463D> <83C8> <463F> <4640> <83CD> <4641> <4644> <83D0> <4647> <4649> <83D9> <464B> <464D> <83E2> <464E> <4650> <83E6> <4651> <4654> <83EB> <4655> <4659> <83F3> <465A> <465C> <83FA> <465D> <465F> <83FE> <4662> <4663> <8408> <4665> <466A> <8412> <466B> <466D> <8419> <466E> <4673> <841E> <4674> <4676> <8429> <4677> <467A> <842D> <467B> <467D> <8432> <467E> <467F> <8436> <4680> <4682> <8439> <4683> <468A> <843E> <468B> <468C> <8447> <468D> <4693> <844A> <4694> <4697> <8453> <4699> <469C> <845D> <469F> <46A0> <8467> <46A7> <46AD> <847B> <46AE> <46B1> <8483> <46B4> <46B7> <848F> <46B8> <46B9> <8495> <46BB> <46BC> <849A> <46BD> <46C0> <849D> <46C1> <46CD> <84A2> <46CE> <46CF> <84B0> <46D1> <46D3> <84B5> <46D6> <46D7> <84C2> <46D8> <46DB> <84C5> <46DD> <46DE> <84CE> <46E0> <46E1> <84D4> <46E2> <46E7> <84D7> <46E9> <46EA> <84E1> <46EC> <46F0> <84E7> <46F2> <46FC> <84F1> <46FE> <46FF> <8500> <4700> <4709> <8502> <470A> <470D> <850D> <470F> <4710> <8515> <4711> <4712> <8518> <4713> <4715> <851B> <4718> <4719> <8524> <471A> <471D> <8527> <471E> <4726> <852E> <4727> <4729> <853E> <472B> <472C> <8544> <472E> <4730> <854B> <4731> <4733> <854F> <4736> <4739> <855A> <473A> <473C> <855F> <473E> <4740> <8565> <4741> <4742> <856B> <4743> <4746> <856E> <4748> <4749> <8575> <474B> <474C> <857C> <474D> <4751> <857F> <4755> <4756> <858D> <4758> <4759> <8592> <475A> <475F> <8595> <4760> <4761> <859D> <4762> <4765> <85A0> <4768> <476A> <85AB> <476B> <4770> <85B1> <4772> <4777> <85BB> <4778> <477E> <85C2> <477F> <4781> <85CA> <4782> <4783> <85D1> <4785> <478A> <85D6> <478B> <4790> <85DE> <4791> <4793> <85E6> endbfrange 100 beginbfrange <4794> <479C> <85EB> <479E> <479F> <85F7> <47A0> <47A2> <85FC> <47A3> <47A6> <8600> <47A7> <47A9> <8608> <47AA> <47AE> <860C> <47AF> <47B2> <8612> <47B3> <47B5> <8617> <47B6> <47B8> <861B> <47B9> <47BB> <861F> <47BC> <47BF> <8623> <47C1> <47C3> <862A> <47C4> <47CD> <862E> <47D0> <47D1> <863D> <47D2> <47DE> <8640> <47DF> <47E0> <8652> <47E1> <47E4> <8656> <47E7> <47E8> <8660> <47E9> <47EC> <8663> <47ED> <47EF> <8668> <47F1> <47F2> <866F> <47F3> <47F9> <8672> <47FA> <47FF> <8683> <4801> <4805> <868E> <4807> <480C> <8696> <480D> <4811> <869E> <4812> <4813> <86A5> <4815> <4816> <86AD> <4817> <4818> <86B2> <4819> <481B> <86B7> <481C> <4820> <86BB> <4821> <4823> <86C1> <4826> <4827> <86CC> <4828> <4829> <86D2> <482A> <482C> <86D5> <482E> <482F> <86DC> <4830> <4833> <86E0> <4834> <4837> <86E5> <4838> <483A> <86EA> <483C> <483E> <86F5> <483F> <4841> <86FB> <4844> <4845> <8704> <4846> <4847> <870B> <4848> <484B> <870E> <4851> <4852> <871F> <4854> <4856> <8726> <4857> <485A> <872A> <485B> <485C> <872F> <485D> <485E> <8732> <485F> <4860> <8735> <4861> <4863> <8738> <4864> <4865> <873C> <4866> <486C> <8740> <486D> <486E> <874A> <4870> <4873> <874F> <4877> <487C> <875A> <487D> <487E> <8761> <487F> <4885> <8767> <4887> <4889> <8771> <488C> <488D> <8779> <488E> <4890> <877F> <4891> <4892> <8786> <4893> <4894> <8789> <4896> <489A> <878E> <489B> <489D> <8794> <489E> <48A3> <8798> <48A4> <48A5> <87A0> <48A6> <48AA> <87A3> <48AB> <48AC> <87A9> <48AE> <48B0> <87B0> <48B2> <48B5> <87B6> <48B7> <48B8> <87BE> <48B9> <48BB> <87C1> <48BF> <48C0> <87CC> <48C1> <48C2> <87CF> <48C3> <48C9> <87D4> <48CA> <48CD> <87DC> <48CE> <48CF> <87E1> <48D1> <48D4> <87E6> <48D7> <48D8> <87F0> <48D9> <48DB> <87F3> <48DC> <48DD> <87F7> <48DF> <48E0> <87FC> <48E1> <48E4> <87FF> <48E6> <48E8> <8807> <48E9> <48ED> <880B> <48F0> <48F3> <8817> <48F4> <48F6> <881C> <48F8> <48FF> <8824> <4900> <4904> <882C> <4905> <4907> <8833> <4908> <4909> <8837> <490B> <490D> <883D> <490E> <4910> <8841> <4911> <4913> <8847> <4915> <4919> <884E> <491A> <491B> <8855> <491F> <4921> <885E> <4922> <4923> <8866> <4928> <492B> <8873> endbfrange 100 beginbfrange <492D> <492F> <887A> <4932> <4933> <8886> <4934> <4935> <8889> <4937> <493A> <888E> <493B> <493D> <8893> <493E> <4942> <8897> <4943> <4947> <889D> <4949> <494E> <88A5> <4950> <4952> <88AE> <4953> <4957> <88B2> <4958> <495B> <88B8> <495C> <495F> <88BD> <4960> <4961> <88C3> <4962> <4963> <88C7> <4964> <4966> <88CB> <4967> <4968> <88D0> <496A> <496B> <88D6> <496C> <496D> <88DA> <496F> <4970> <88E0> <4971> <4972> <88E6> <4973> <4979> <88E9> <497B> <497D> <88F5> <497E> <497F> <88FA> <4980> <4982> <88FF> <4982> <4983> <5656> <4983> <4986> <8903> <4985> <4986> <5658> <4987> <4988> <8908> <4989> <498D> <890B> <498F> <4993> <8914> <4994> <4998> <891C> <4999> <499B> <8922> <499C> <499F> <8926> <49A0> <49A3> <892C> <49A7> <49A8> <8939> <49A9> <49AD> <893C> <49AE> <49AF> <8942> <49B0> <49B1> <8945> <49B2> <49BF> <8948> <49C0> <49C5> <8957> <49C6> <49C8> <8961> <49CA> <49CC> <8967> <49CE> <49CF> <896D> <49D0> <49D1> <8970> <49D2> <49D9> <8973> <49DA> <49DC> <897C> <49DF> <49E0> <8984> <49E1> <49E4> <8987> <49E5> <49E7> <898C> <49E8> <49EA> <8990> <49EB> <49EC> <8994> <49EE> <49F5> <8999> <49F6> <49F9> <89A2> <49FA> <49FC> <89A7> <49FE> <49FF> <89AD> <4A00> <4A01> <89B0> <4A02> <4A05> <89B3> <4A06> <4A07> <89B8> <4A08> <4A09> <89BB> <4A0D> <4A0F> <89D3> <4A10> <4A12> <89D7> <4A15> <4A18> <89DF> <4A1A> <4A1D> <89E7> <4A1E> <4A20> <89EC> <4A21> <4A23> <89F0> <4A26> <4A2C> <89F9> <4A2D> <4A2F> <8A04> <4A34> <4A35> <8A11> <4A38> <4A39> <8A19> <4A3C> <4A3E> <8A20> <4A40> <4A43> <8A26> <4A44> <4A45> <8A2B> <4A46> <4A48> <8A2E> <4A49> <4A4A> <8A32> <4A4C> <4A4E> <8A37> <4A4F> <4A51> <8A3B> <4A52> <4A53> <8A3F> <4A54> <4A57> <8A42> <4A59> <4A5D> <8A49> <4A61> <4A62> <8A56> <4A63> <4A64> <8A59> <4A65> <4A66> <8A5C> <4A67> <4A68> <8A5F> <4A69> <4A6A> <8A64> <4A6B> <4A6C> <8A67> <4A70> <4A72> <8A76> <4A73> <4A74> <8A7A> <4A75> <4A76> <8A7D> <4A77> <4A7A> <8A80> <4A7C> <4A7D> <8A8B> <4A7E> <4A80> <8A8E> <4A82> <4A83> <8A96> <4A85> <4A87> <8A9B> <4A8B> <4A8D> <8AA9> <4A8E> <4A90> <8AAD> <4A92> <4A94> <8AB3> <4A95> <4A96> <8AB7> <4A97> <4A98> <8ABA> <4A99> <4A9A> <8ABD> <4A9B> <4A9C> <8AC0> endbfrange 100 beginbfrange <4A9E> <4A9F> <8AC5> <4AA5> <4AA7> <8AD3> <4AA8> <4AAA> <8AD8> <4AAC> <4AAE> <8ADF> <4AB1> <4AB3> <8AE8> <4AB5> <4AB6> <8AEF> <4AB8> <4AB9> <8AF4> <4AC0> <4AC1> <8B08> <4AC2> <4AC4> <8B0B> <4AC6> <4AC8> <8B11> <4ACC> <4ACE> <8B1E> <4ACF> <4AD2> <8B22> <4AD4> <4AD5> <8B29> <4AD6> <4ADA> <8B2E> <4ADB> <4ADF> <8B34> <4AE0> <4AE3> <8B3A> <4AE4> <4AED> <8B3F> <4AEE> <4AF1> <8B4A> <4AF2> <4AF7> <8B50> <4AFA> <4AFF> <8B5D> <4B00> <4B02> <8B63> <4B03> <4B06> <8B67> <4B07> <4B08> <8B6D> <4B09> <4B0B> <8B71> <4B0C> <4B0D> <8B75> <4B0E> <4B12> <8B78> <4B13> <4B14> <8B7E> <4B15> <4B1D> <8B81> <4B1E> <4B20> <8B8B> <4B21> <4B23> <8B8F> <4B25> <4B29> <8B97> <4B34> <4B3C> <8C38> <4B3D> <4B40> <8C42> <4B41> <4B42> <8C4A> <4B43> <4B45> <8C4D> <4B46> <4B49> <8C51> <4B4A> <4B4D> <8C56> <4B4E> <4B53> <8C5B> <4B54> <4B5A> <8C63> <4B5B> <4B61> <8C6C> <4B62> <4B65> <8C74> <4B66> <4B6C> <8C7B> <4B6D> <4B6E> <8C83> <4B6F> <4B71> <8C86> <4B73> <4B79> <8C8D> <4B7A> <4B7C> <8C95> <4B7D> <4B80> <8C99> <4B82> <4B85> <8CA3> <4B86> <4B87> <8CAD> <4B8E> <4B93> <8CCB> <4B95> <4B98> <8CD6> <4B9D> <4B9E> <8CE8> <4B9F> <4BA4> <8CEE> <4BA5> <4BA9> <8CF5> <4BAA> <4BAE> <8CFF> <4BAF> <4BB0> <8D06> <4BB4> <4BB8> <8D11> <4BB9> <4BBC> <8D17> <4BBE> <4BBF> <8D51> <4BC3> <4BC5> <8D68> <4BC7> <4BC8> <8D6E> <4BC9> <4BCA> <8D71> <4BCB> <4BD3> <8D78> <4BD4> <4BD5> <8D82> <4BD6> <4BD9> <8D86> <4BDA> <4BDE> <8D8C> <4BDF> <4BE0> <8D92> <4BE1> <4BE3> <8D96> <4BE4> <4BE8> <8D9A> <4BE9> <4BEB> <8DA0> <4BEC> <4BEF> <8DA4> <4BF0> <4BF7> <8DA9> <4BF8> <4BF9> <8DB6> <4BFD> <4BFF> <8DC0> <4C01> <4C04> <8DC7> <4C07> <4C0A> <8DD2> <4C0B> <4C0C> <8DD8> <4C0E> <4C10> <8DE0> <4C11> <4C13> <8DE5> <4C15> <4C16> <8DED> <4C17> <4C19> <8DF0> <4C1D> <4C23> <8DFE> <4C24> <4C26> <8E06> <4C28> <4C29> <8E0D> <4C2A> <4C2C> <8E11> <4C2D> <4C34> <8E15> <4C35> <4C36> <8E20> <4C37> <4C3B> <8E24> <4C3F> <4C40> <8E32> <4C41> <4C43> <8E36> <4C44> <4C45> <8E3B> <4C46> <4C47> <8E3E> <4C49> <4C4A> <8E45> <4C4B> <4C4E> <8E4D> <4C4F> <4C50> <8E53> <4C51> <4C53> <8E56> <4C54> <4C5C> <8E5A> <4C5D> <4C5E> <8E64> <4C5F> <4C60> <8E67> <4C61> <4C62> <8E6A> endbfrange 100 beginbfrange <4C67> <4C69> <8E77> <4C6B> <4C6C> <8E7D> <4C6E> <4C70> <8E82> <4C75> <4C79> <8E95> <4C7C> <4C7D> <8E9F> <4C7E> <4C80> <8EA2> <4C81> <4C83> <8EA7> <4C84> <4C85> <8EAD> <4C86> <4C87> <8EB0> <4C88> <4C8E> <8EB3> <4C8F> <4C93> <8EBB> <4C94> <4C9C> <8EC1> <4C9D> <4C9F> <8ECF> <4C9F> <4CA0> <5661> <4CA1> <4CA6> <8ED5> <4CA7> <4CA9> <8EDC> <4CAA> <4CAD> <8EE0> <4CAE> <4CB3> <8EE5> <4CB4> <4CB9> <8EEC> <4CBA> <4CBE> <8EF3> <4CC0> <4CC3> <8EFF> <4CC7> <4CCD> <8F0B> <4CCF> <4CD3> <8F16> <4CD4> <4CD8> <8F20> <4CD9> <4CDA> <8F27> <4CDB> <4CDE> <8F2B> <4CDF> <4CE1> <8F30> <4CE2> <4CE5> <8F34> <4CE6> <4CE7> <8F39> <4CE8> <4CE9> <8F3C> <4CEA> <4CEB> <8F40> <4CED> <4CEE> <8F47> <4CEF> <4CF1> <8F4A> <4CF2> <4CF6> <8F4F> <4CF7> <4CFF> <8F55> <4D09> <4D0B> <8FA0> <4D0C> <4D0D> <8FA4> <4D11> <4D13> <8FB3> <4D13> <4D14> <5666> <4D14> <4D15> <8FB7> <4D15> <4D16> <5668> <4D16> <4D18> <8FBA> <4D17> <4D19> <566A> <4D19> <4D1A> <8FBF> <4D1D> <4D21> <8FC9> <4D24> <4D25> <8FD6> <4D27> <4D28> <8FE0> <4D2D> <4D2E> <8FF1> <4D2F> <4D30> <8FF5> <4D31> <4D33> <8FFA> <4D34> <4D35> <8FFE> <4D36> <4D37> <9007> <4D3D> <4D3E> <9024> <4D3F> <4D44> <9027> <4D45> <4D46> <9030> <4D47> <4D48> <9033> <4D4A> <4D4B> <9039> <4D4D> <4D4E> <903F> <4D50> <4D51> <9045> <4D52> <4D54> <9048> <4D57> <4D58> <9059> <4D5D> <4D5E> <9066> <4D5F> <4D61> <906A> <4D62> <4D64> <906F> <4D6A> <4D6B> <9085> <4D6D> <4D6F> <908C> <4D76> <4D78> <909E> <4D79> <4D7A> <90A4> <4D7B> <4D7D> <90A7> <4D82> <4D83> <90BC> <4D84> <4D85> <90BF> <4D86> <4D87> <90C2> <4D89> <4D8A> <90C8> <4D8B> <4D8D> <90CB> <4D8F> <4D91> <90D4> <4D92> <4D94> <90D8> <4D97> <4D99> <90E3> <4D9A> <4D9B> <90E9> <4D9E> <4DA1> <90F0> <4DA2> <4DA3> <90F6> <4DA4> <4DA7> <90F9> <4DA8> <4DAA> <90FF> <4DAD> <4DAE> <9107> <4DAF> <4DB6> <910A> <4DB9> <4DBA> <9117> <4DBB> <4DBE> <911A> <4DBF> <4DC1> <911F> <4DC2> <4DC4> <9124> <4DC5> <4DC9> <9128> <4DCD> <4DCE> <9137> <4DCF> <4DD6> <913B> <4DD7> <4DD8> <9144> <4DDB> <4DDE> <9153> <4DDF> <4DE0> <9158> <4DE1> <4DE2> <915B> <4DE3> <4DE4> <915F> <4DE5> <4DE7> <9166> <4DEB> <4DED> <917A> <4DEE> <4DF2> <9180> <4DF6> <4DF7> <918E> endbfrange 100 beginbfrange <4DF8> <4DFA> <9193> <4DFB> <4DFD> <9197> <4DFE> <4DFF> <919D> <4E00> <4E02> <919F> <4E03> <4E08> <91A4> <4E09> <4E0C> <91B0> <4E0D> <4E10> <91B6> <4E11> <4E15> <91BB> <4E1C> <4E1D> <91DA> <4E1E> <4E22> <91DE> <4E23> <4E24> <91E5> <4E26> <4E30> <91EA> <4E33> <4E37> <91FB> <4E38> <4E39> <9202> <4E3A> <4E3C> <9205> <4E3D> <4E3F> <920A> <4E41> <4E42> <9212> <4E43> <4E4A> <9216> <4E4B> <4E4E> <921F> <4E50> <4E55> <9228> <4E57> <4E58> <9231> <4E59> <4E5A> <9235> <4E5B> <4E5C> <923B> <4E5D> <4E60> <9241> <4E61> <4E62> <9246> <4E63> <4E65> <924A> <4E66> <4E68> <924E> <4E69> <4E6B> <9252> <4E6D> <4E6E> <9258> <4E6F> <4E70> <925C> <4E71> <4E73> <925F> <4E74> <4E76> <9263> <4E77> <4E7B> <9267> <4E7C> <4E81> <926E> <4E82> <4E84> <9275> <4E86> <4E88> <927C> <4E89> <4E8A> <9281> <4E8C> <4E93> <9286> <4E94> <4E95> <928F> <4E97> <4E98> <9294> <4E9C> <4E9E> <929D> <4E9F> <4EA0> <92A1> <4EA4> <4EA5> <92AF> <4EA6> <4EAA> <92B2> <4EAD> <4EB0> <92BD> <4EB4> <4EB6> <92C9> <4EB7> <4EB8> <92CD> <4EB9> <4EBA> <92D0> <4EBB> <4EC4> <92D3> <4EC6> <4EC8> <92E0> <4ECB> <4ECC> <92EB> <4ECD> <4ED0> <92F2> <4ED2> <4ED4> <92F9> <4ED5> <4ED8> <92FD> <4ED9> <4EDC> <9302> <4EDD> <4EE3> <9309> <4EE5> <4EE6> <9313> <4EE7> <4EE8> <9316> <4EE9> <4EEB> <931C> <4EED> <4EEF> <9323> <4EF1> <4EF2> <9329> <4EF3> <4EF4> <932C> <4EF5> <4EF6> <9330> <4EF7> <4EF8> <9334> <4EFA> <4EFE> <9339> <4F01> <4F02> <9344> <4F03> <4F05> <9348> <4F07> <4F0C> <934E> <4F0D> <4F0F> <9355> <4F10> <4F11> <9359> <4F12> <4F19> <935C> <4F1A> <4F1C> <9366> <4F1E> <4F20> <936D> <4F21> <4F24> <9371> <4F25> <4F27> <9377> <4F28> <4F2A> <937B> <4F2B> <4F2D> <937F> <4F2F> <4F30> <9385> <4F31> <4F32> <9388> <4F33> <4F36> <938B> <4F37> <4F3C> <9390> <4F3E> <4F46> <9399> <4F47> <4F48> <93A4> <4F4D> <4F4E> <93B1> <4F50> <4F51> <93B6> <4F52> <4F57> <93B9> <4F58> <4F5A> <93C0> <4F5B> <4F5D> <93C4> <4F60> <4F62> <93CE> <4F63> <4F66> <93D2> <4F67> <4F69> <93D9> <4F6C> <4F6E> <93E5> <4F6F> <4F7A> <93E9> <4F7D> <4F85> <93FA> <4F86> <4F8C> <9404> <4F8D> <4F90> <940C> <4F92> <4F94> <9415> <4F95> <4F97> <941A> <4F98> <4F99> <941E> <4F9A> <4F9E> <9421> endbfrange 100 beginbfrange <4F9F> <4FA3> <9429> <4FA4> <4FA6> <942F> <4FA8> <4FA9> <9436> <4FAB> <4FAD> <943B> <4FAE> <4FB1> <9440> <4FB2> <4FB6> <9445> <4FB8> <4FBC> <944D> <4FBE> <4FC8> <9455> <4FC9> <4FCA> <9461> <4FCC> <4FD0> <9466> <4FD2> <4FD3> <946E> <4FD5> <4FD8> <9473> <4FDA> <4FDB> <947A> <4FDC> <4FE0> <9480> <4FE6> <4FE7> <94D3> <4FF7> <4FF8> <9574> <4FF9> <4FFF> <9578> <5001> <5002> <9584> <5003> <5004> <9587> <5009> <500B> <9595> <500C> <5013> <9599> <5015> <5016> <95A6> <5018> <501B> <95AE> <501C> <501E> <95B3> <501F> <5020> <95B7> <5022> <5024> <95C0> <5025> <5026> <95C4> <5029> <502B> <95CD> <502C> <502E> <95D1> <502F> <5033> <95D7> <5035> <5036> <95DF> <5037> <5038> <95E3> <5039> <503A> <95E6> <5043> <5049> <9623> <504A> <504C> <962B> <504D> <504E> <962F> <504F> <5052> <9637> <5057> <5058> <964E> <5059> <505B> <9651> <505C> <505D> <9656> <505E> <505F> <9659> <5063> <5064> <9665> <5066> <5068> <966D> <506A> <506D> <9679> <506E> <5074> <967E> <5078> <507A> <9691> <507D> <5086> <969D> <5088> <508C> <96AB> <5092> <5093> <96C2> <5095> <5096> <96CA> <5097> <5098> <96D0> <5099> <509A> <96D3> <509B> <509C> <96D7> <509E> <50A0> <96DD> <50A2> <50A5> <96E4> <50A6> <50A9> <96EB> <50AA> <50AB> <96F0> <50AC> <50AD> <96F4> <50B0> <50B1> <96FC> <50B3> <50B4> <9702> <50B6> <50B8> <970A> <50B9> <50BB> <9710> <50BC> <50BD> <9714> <50BE> <50C2> <9717> <50C4> <50CB> <971F> <50CC> <50CD> <9728> <50CE> <50CF> <972B> <50D0> <50D1> <972E> <50D3> <50D7> <9733> <50D8> <50DA> <973A> <50DB> <50DD> <973F> <50DF> <50E1> <9745> <50E2> <50EA> <9749> <50EB> <50EC> <9754> <50ED> <50EE> <9757> <50EF> <50F0> <975C> <50F2> <50F3> <9763> <50F4> <50F5> <9766> <50F6> <50FE> <976A> <5100> <5104> <9777> <5105> <510C> <977D> <510D> <5111> <9786> <5116> <5118> <9795> <5119> <511F> <9799> <5120> <5121> <97A1> <5122> <5123> <97A4> <5124> <5127> <97A7> <512A> <512B> <97B0> <512D> <5134> <97B5> <5135> <5139> <97BE> <513A> <513B> <97C4> <513C> <513D> <97C7> <513F> <5144> <97CD> <5145> <5149> <97D4> <514A> <514B> <97DA> <514D> <5153> <97DF> <5155> <5159> <97EE> <515B> <5162> <97F7> <5168> <516A> <9814> <516B> <516D> <9819> endbfrange 100 beginbfrange <516E> <5171> <981D> <5172> <5173> <9822> <5175> <517A> <9827> <517B> <517C> <982E> <517D> <5182> <9831> <5183> <5184> <9839> <5186> <518D> <983E> <518E> <5192> <9847> <5193> <5196> <984F> <5197> <5199> <9855> <519B> <519C> <985C> <519D> <519F> <985F> <51A0> <51A1> <9863> <51A3> <51A5> <9868> <51A6> <51A7> <986D> <51AF> <51B3> <98A9> <51B6> <51B7> <98B4> <51B8> <51BC> <98B7> <51BD> <51C3> <98BD> <51C6> <51CA> <98C9> <51CB> <51CC> <98CF> <51CE> <51CF> <98D6> <51D0> <51D1> <98DC> <51D3> <51D6> <98E3> <51D9> <51DA> <98F0> <51DC> <51E2> <98F5> <51E3> <51E6> <98FF> <51E8> <51EA> <9906> <51EC> <51ED> <990E> <51EE> <51F1> <9914> <51F2> <51F3> <9919> <51F4> <51F5> <991C> <51F6> <51F7> <991F> <51F8> <51FD> <9922> <51FE> <51FF> <9929> <5200> <5202> <992B> <5203> <5206> <992F> <5207> <5209> <9934> <520A> <520D> <9938> <520F> <5211> <9940> <5213> <5214> <9946> <5215> <5218> <994D> <521B> <521E> <9958> <5220> <5222> <995F> <5226> <5227> <9978> <522A> <522B> <9982> <522F> <5239> <999A> <523A> <523B> <99A6> <523C> <523E> <99A9> <523F> <5240> <99AF> <5242> <524D> <99B5> <524E> <525B> <99C2> <525D> <525E> <99D6> <5263> <526C> <99E3> <526D> <526F> <99EE> <5270> <527C> <99F2> <527E> <5280> <9A02> <5281> <5287> <9A06> <5288> <528D> <9A10> <528E> <528F> <9A17> <5290> <52A0> <9A1A> <52A3> <52A7> <9A31> <52A8> <52AC> <9A39> <52AE> <52B1> <9A46> <52B2> <52B3> <9A4B> <52B5> <52B9> <9A50> <52BB> <52BC> <9A58> <52BD> <52BF> <9A5C> <52C0> <52C1> <9A60> <52C3> <52C6> <9A66> <52CB> <52CC> <9A8D> <52CD> <52CE> <9A94> <52D1> <52D6> <9AA9> <52D7> <52DA> <9AB2> <52DD> <52DF> <9ABD> <52E0> <52E1> <9AC3> <52E2> <52E6> <9AC6> <52E7> <52E8> <9ACD> <52EB> <52F0> <9AD9> <52F2> <52F5> <9AE2> <52F6> <52F9> <9AE7> <52FB> <52FF> <9AF0> <5300> <5303> <9AF5> <5305> <530B> <9AFC> <530C> <530D> <9B04> <530F> <5312> <9B09> <5314> <5316> <9B10> <5317> <531C> <9B14> <531D> <5320> <9B1B> <5321> <5322> <9B20> <5326> <5329> <9B2A> <532B> <5332> <9B33> <5333> <5336> <9B3D> <5338> <533A> <9B4A> <533C> <533D> <9B52> <533E> <5340> <9B55> <5342> <5355> <9B5B> <5356> <5359> <9B70> <535A> <535B> <9B75> <535C> <5364> <9B78> endbfrange 100 beginbfrange <5366> <536F> <9B84> <5371> <5377> <9B93> <5378> <5379> <9B9B> <537A> <5384> <9B9F> <5386> <5396> <9BAF> <5397> <539B> <9BC2> <539D> <53A5> <9BCB> <53A7> <53AA> <9BD7> <53AC> <53AE> <9BDE> <53B0> <53B1> <9BE5> <53B3> <53B6> <9BEC> <53B7> <53B9> <9BF1> <53BA> <53C1> <9BF5> <53C3> <53CA> <9C00> <53CB> <53CD> <9C0A> <53CE> <53CF> <9C0E> <53D1> <53DC> <9C14> <53DD> <53DE> <9C21> <53E0> <53E1> <9C26> <53E2> <53E4> <9C2A> <53E5> <53E7> <9C2E> <53EC> <53ED> <9C3C> <53EE> <53F3> <9C3F> <53F4> <53F5> <9C46> <53F6> <53FD> <9C4A> <5400> <5403> <9C59> <5405> <540B> <9C60> <540C> <5410> <9C68> <5411> <541A> <9C6E> <541D> <541E> <9C7D> <5420> <5421> <9C83> <5422> <5423> <9C89> <5427> <542A> <9C96> <5430> <5434> <9CBE> <5435> <5436> <9CC8> <5437> <5438> <9CD1> <5439> <543A> <9CDA> <543B> <543C> <9CE0> <543D> <543E> <9CE3> <543F> <5441> <9CE6> <5442> <5443> <9CEA> <5444> <5449> <9CED> <544B> <5459> <9CF7> <545B> <5465> <9D0A> <5466> <546A> <9D16> <546D> <546F> <9D20> <5470> <5471> <9D24> <5473> <5478> <9D29> <5479> <5482> <9D31> <5483> <5485> <9D3C> <5486> <5487> <9D40> <5488> <5495> <9D43> <5496> <549D> <9D54> <549E> <549F> <9D5E> <54A0> <54A7> <9D62> <54A9> <54AA> <9D6D> <54AB> <54AC> <9D70> <54AD> <54C0> <9D73> <54C2> <54CA> <9D8A> <54CB> <54CE> <9D94> <54D0> <54D9> <9D9B> <54DA> <54DC> <9DA6> <54DD> <54E1> <9DAA> <54E2> <54E5> <9DB0> <54E6> <54EB> <9DB5> <54EC> <54EE> <9DBD> <54F1> <54FE> <9DC5> <5500> <5501> <9DD5> <5503> <550C> <9DDB> <550D> <5514> <9DE7> <5515> <5516> <9DF0> <5517> <551A> <9DF4> <551B> <552B> <9DFB> <552C> <5533> <9E0D> <5534> <5537> <9E16> <553E> <553F> <9E3B> <5543> <5545> <9E52> <5549> <554C> <9E5F> <554E> <554F> <9E6E> <5552> <5554> <9E76> <5556> <5557> <9E80> <5558> <555B> <9E83> <555C> <555D> <9E89> <555E> <5563> <9E8C> <5564> <5566> <9E94> <5567> <556B> <9E98> <556D> <5571> <9EA0> <5572> <5573> <9EA7> <5574> <5578> <9EAA> <5579> <557C> <9EB0> <557D> <557E> <9EB6> <557F> <5580> <9EB9> <5582> <5586> <9EBF> <5587> <558A> <9EC5> <558B> <558C> <9ECA> <558E> <558F> <9ED2> <5590> <5592> <9ED5> <5593> <5594> <9ED9> <5596> <5597> <9EE3> <5599> <559C> <9EEB> endbfrange 100 beginbfrange <559D> <559E> <9EF0> <55A0> <55A1> <9EF5> <55A4> <55AC> <9F00> <55B0> <55B1> <9F11> <55B5> <55BA> <9F1A> <55BC> <55C4> <9F23> <55C5> <55C6> <9F2D> <55C7> <55CD> <9F30> <55D1> <55D5> <9F3F> <55D6> <55DA> <9F45> <55DB> <55DD> <9F4C> <55DF> <55E2> <9F55> <55E3> <55E4> <9F5A> <55E5> <55E6> <9F5D> <55E8> <55E9> <9F64> <55EA> <55EC> <9F67> <55EE> <55F2> <9F6D> <55F3> <55F6> <9F73> <55F7> <55FD> <9F78> <55FE> <55FF> <9F81> <5600> <5601> <9F8E> <5602> <5604> <9F91> <5605> <5607> <9F96> <5608> <5609> <9F9D> <560A> <560E> <9FA1> <5610> <5612> <FA0D> <5614> <5615> <FA13> <5617> <5619> <FA1F> <561A> <561B> <FA23> <561C> <561E> <FA27> <561F> <566E> <E815> <566F> <56CD> <0020> <56D2> <56FF> <0021> <5700> <572F> <004F> <576B> <576C> <30F5> <5776> <5779> <30F7> <577B> <577D> <3033> <577E> <5780> <3038> <5781> <5783> <312A> <5784> <579B> <31A0> <579D> <579E> <2E82> <579F> <57A1> <2E85> <57A2> <57A3> <2E89> <57A4> <57AD> <2E8D> <57AE> <57AF> <2E98> <57B0> <57BB> <2E9B> <57BC> <57BD> <2EA8> <57BE> <57C0> <2EAB> <57C1> <57C4> <2EAF> <57C5> <57C6> <2EB4> <57C7> <57C9> <2EB8> <57CA> <57D7> <2EBC> <57D8> <57FF> <2ECB> <5801> <5847> <3400> <5848> <5872> <3448> <5873> <58FF> <3474> <5900> <599C> <3501> <599D> <59FF> <359F> <5A00> <5A0B> <3602> <5A0C> <5A16> <360F> <5A17> <5AFF> <361B> <5B00> <5BFF> <3704> <5C00> <5CFF> <3804> <5D00> <5D13> <3904> <5D14> <5D68> <3919> <5D69> <5DC8> <396F> <5DC9> <5DD6> <39D1> <5DD7> <5DFF> <39E0> <5E00> <5E69> <3A09> <5E6A> <5EFF> <3A74> <5F00> <5F43> <3B0A> <5F44> <5FFF> <3B4F> <6000> <6062> <3C0B> <6063> <60D3> <3C6F> <60D4> <60FF> <3CE1> <6100> <61FF> <3D0D> <6200> <62FF> <3E0D> <6300> <63FF> <3F0D> <6400> <6448> <400D> <6449> <64FF> <4057> <6500> <6550> <410E> <6551> <65FF> <4160> <6600> <66FF> <420F> <6700> <6727> <430F> <6728> <679B> <4338> <679C> <679F> <43AD> <67A0> <67CA> <43B2> <67CB> <67FF> <43DE> <6800> <68C2> <4413> <68C3> <68FF> <44D7> <6900> <69FF> <4514> <6A00> <6A37> <4614> <6A38> <6A4B> <464D> <6A4C> <6AFF> <4662> <6B00> <6B0C> <4716> <6B0D> <6B11> <4724> <6B12> <6B63> <472A> <6B64> <6B73> <477D> <6B74> <6BFF> <478E> <6C00> <6CFF> <481A> endbfrange 16 beginbfrange <6D00> <6D2C> <491A> <6D2D> <6D5E> <4948> <6D5F> <6D60> <497B> <6D61> <6D64> <497E> <6D66> <6D79> <4987> <6D7A> <6D7C> <499C> <6D7D> <6D92> <49A0> <6D93> <6DFF> <49B8> <6E00> <6EFF> <4A25> <6F00> <6FFF> <4B25> <7000> <7051> <4C25> <7052> <7078> <4C78> <7079> <70E7> <4CA4> <70E8> <70FF> <4D1A> <7100> <717B> <4D32> <717C> <7182> <4DAF> endbfrange endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF \ No newline at end of file
diff --git a/src/main/resources/Resources/cmap/Adobe-Japan1-0 b/src/main/resources/Resources/cmap/Adobe-Japan1-0
new file mode 100644
index 0000000..16b7be8
--- /dev/null
+++ b/src/main/resources/Resources/cmap/Adobe-Japan1-0
@@ -0,0 +1,95 @@
+%!PS-Adobe-3.0 Resource-CMap
+%%DocumentNeededResources: ProcSet (CIDInit)
+%%IncludeResource: ProcSet (CIDInit)
+%%BeginResource: CMap (Identity)
+%%Title: (Identity Adobe Japan1 0)
+%%Version: 6.001
+%%Copyright: -----------------------------------------------------------
+%%Copyright: Copyright 1990-1997 Adobe Systems Incorporated.
+%%Copyright: All Rights Reserved.
+%%Copyright:
+%%Copyright: Patents Pending
+%%Copyright:
+%%Copyright: NOTICE: All information contained herein is the property
+%%Copyright: of Adobe Systems Incorporated.
+%%Copyright:
+%%Copyright: Permission is granted for redistribution of this file
+%%Copyright: provided this copyright notice is maintained intact and
+%%Copyright: that the contents of this file are not altered in any
+%%Copyright: way from its original form.
+%%Copyright:
+%%Copyright: PostScript and Display PostScript are trademarks of
+%%Copyright: Adobe Systems Incorporated which may be registered in
+%%Copyright: certain jurisdictions.
+%%Copyright: -----------------------------------------------------------
+%%EndComments
+
+/CIDInit /ProcSet findresource begin
+
+12 dict begin
+
+begincmap
+
+/CIDSystemInfo 3 dict dup begin
+ /Registry (Adobe) def
+ /Ordering (Japan1) def
+ /Supplement 0 def
+end def
+
+/CMapName /Adobe-Japan1-0 def
+/CMapVersion 6.001 def
+/CMapType 1 def
+
+/UIDOffset 480 def
+/XUID [1 10 25358] def
+
+/WMode 0 def
+
+/CIDCount 8284 def
+
+1 begincodespacerange
+ <0000> <20FF>
+endcodespacerange
+
+33 begincidrange
+<0000> <00ff> 0
+<0100> <01ff> 256
+<0200> <02ff> 512
+<0300> <03ff> 768
+<0400> <04ff> 1024
+<0500> <05ff> 1280
+<0600> <06ff> 1536
+<0700> <07ff> 1792
+<0800> <08ff> 2048
+<0900> <09ff> 2304
+<0a00> <0aff> 2560
+<0b00> <0bff> 2816
+<0c00> <0cff> 3072
+<0d00> <0dff> 3328
+<0e00> <0eff> 3584
+<0f00> <0fff> 3840
+<1000> <10ff> 4096
+<1100> <11ff> 4352
+<1200> <12ff> 4608
+<1300> <13ff> 4864
+<1400> <14ff> 5120
+<1500> <15ff> 5376
+<1600> <16ff> 5632
+<1700> <17ff> 5888
+<1800> <18ff> 6144
+<1900> <19ff> 6400
+<1a00> <1aff> 6656
+<1b00> <1bff> 6912
+<1c00> <1cff> 7168
+<1d00> <1dff> 7424
+<1e00> <1eff> 7680
+<1f00> <1fff> 7936
+<2000> <205b> 8192
+endcidrange
+endcmap
+CMapName currentdict /CMap defineresource pop
+end
+end
+
+%%EndResource
+%%EOF
diff --git a/src/main/resources/Resources/cmap/Adobe-Japan1-1 b/src/main/resources/Resources/cmap/Adobe-Japan1-1
new file mode 100644
index 0000000..a47ad7a
--- /dev/null
+++ b/src/main/resources/Resources/cmap/Adobe-Japan1-1
@@ -0,0 +1,95 @@
+%!PS-Adobe-3.0 Resource-CMap
+%%DocumentNeededResources: ProcSet (CIDInit)
+%%IncludeResource: ProcSet (CIDInit)
+%%BeginResource: CMap (Identity)
+%%Title: (Identity Adobe Japan1 1)
+%%Version: 5.008
+%%Copyright: -----------------------------------------------------------
+%%Copyright: Copyright 1990-1996 Adobe Systems Incorporated.
+%%Copyright: All Rights Reserved.
+%%Copyright:
+%%Copyright: Patents Pending
+%%Copyright:
+%%Copyright: NOTICE: All information contained herein is the property
+%%Copyright: of Adobe Systems Incorporated.
+%%Copyright:
+%%Copyright: Permission is granted for redistribution of this file
+%%Copyright: provided this copyright notice is maintained intact and
+%%Copyright: that the contents of this file are not altered in any
+%%Copyright: way from its original form.
+%%Copyright:
+%%Copyright: PostScript and Display PostScript are trademarks of
+%%Copyright: Adobe Systems Incorporated which may be registered in
+%%Copyright: certain jurisdictions.
+%%Copyright: -----------------------------------------------------------
+%%EndComments
+
+/CIDInit /ProcSet findresource begin
+
+12 dict begin
+
+begincmap
+
+/CIDSystemInfo 3 dict dup begin
+ /Registry (Adobe) def
+ /Ordering (Japan1) def
+ /Supplement 1 def
+end def
+
+/CMapName /Adobe-Japan1-1 def
+/CMapVersion 5.008 def
+/CMapType 1 def
+
+/UIDOffset 480 def
+/XUID [1 10 25358] def
+
+/WMode 0 def
+
+/CIDCount 8359 def
+
+1 begincodespacerange
+ <0000> <20FF>
+endcodespacerange
+
+33 begincidrange
+<0000> <00ff> 0
+<0100> <01ff> 256
+<0200> <02ff> 512
+<0300> <03ff> 768
+<0400> <04ff> 1024
+<0500> <05ff> 1280
+<0600> <06ff> 1536
+<0700> <07ff> 1792
+<0800> <08ff> 2048
+<0900> <09ff> 2304
+<0a00> <0aff> 2560
+<0b00> <0bff> 2816
+<0c00> <0cff> 3072
+<0d00> <0dff> 3328
+<0e00> <0eff> 3584
+<0f00> <0fff> 3840
+<1000> <10ff> 4096
+<1100> <11ff> 4352
+<1200> <12ff> 4608
+<1300> <13ff> 4864
+<1400> <14ff> 5120
+<1500> <15ff> 5376
+<1600> <16ff> 5632
+<1700> <17ff> 5888
+<1800> <18ff> 6144
+<1900> <19ff> 6400
+<1a00> <1aff> 6656
+<1b00> <1bff> 6912
+<1c00> <1cff> 7168
+<1d00> <1dff> 7424
+<1e00> <1eff> 7680
+<1f00> <1fff> 7936
+<2000> <20a6> 8192
+endcidrange
+endcmap
+CMapName currentdict /CMap defineresource pop
+end
+end
+
+%%EndResource
+%%EOF
diff --git a/src/main/resources/Resources/cmap/Adobe-Japan1-2 b/src/main/resources/Resources/cmap/Adobe-Japan1-2
new file mode 100644
index 0000000..fca913f
--- /dev/null
+++ b/src/main/resources/Resources/cmap/Adobe-Japan1-2
@@ -0,0 +1,97 @@
+%!PS-Adobe-3.0 Resource-CMap
+%%DocumentNeededResources: ProcSet (CIDInit)
+%%IncludeResource: ProcSet (CIDInit)
+%%BeginResource: CMap (Identity)
+%%Title: (Identity Adobe Japan1 2)
+%%Version: 6.001
+%%Copyright: -----------------------------------------------------------
+%%Copyright: Copyright 1990-1997 Adobe Systems Incorporated.
+%%Copyright: All Rights Reserved.
+%%Copyright:
+%%Copyright: Patents Pending
+%%Copyright:
+%%Copyright: NOTICE: All information contained herein is the property
+%%Copyright: of Adobe Systems Incorporated.
+%%Copyright:
+%%Copyright: Permission is granted for redistribution of this file
+%%Copyright: provided this copyright notice is maintained intact and
+%%Copyright: that the contents of this file are not altered in any
+%%Copyright: way from its original form.
+%%Copyright:
+%%Copyright: PostScript and Display PostScript are trademarks of
+%%Copyright: Adobe Systems Incorporated which may be registered in
+%%Copyright: certain jurisdictions.
+%%Copyright: -----------------------------------------------------------
+%%EndComments
+
+/CIDInit /ProcSet findresource begin
+
+12 dict begin
+
+begincmap
+
+/CIDSystemInfo 3 dict dup begin
+ /Registry (Adobe) def
+ /Ordering (Japan1) def
+ /Supplement 2 def
+end def
+
+/CMapName /Adobe-Japan1-2 def
+/CMapVersion 6.001 def
+/CMapType 1 def
+
+/UIDOffset 480 def
+/XUID [1 10 25358] def
+
+/WMode 0 def
+
+/CIDCount 8720 def
+
+1 begincodespacerange
+ <0000> <22FF>
+endcodespacerange
+
+35 begincidrange
+<0000> <00ff> 0
+<0100> <01ff> 256
+<0200> <02ff> 512
+<0300> <03ff> 768
+<0400> <04ff> 1024
+<0500> <05ff> 1280
+<0600> <06ff> 1536
+<0700> <07ff> 1792
+<0800> <08ff> 2048
+<0900> <09ff> 2304
+<0a00> <0aff> 2560
+<0b00> <0bff> 2816
+<0c00> <0cff> 3072
+<0d00> <0dff> 3328
+<0e00> <0eff> 3584
+<0f00> <0fff> 3840
+<1000> <10ff> 4096
+<1100> <11ff> 4352
+<1200> <12ff> 4608
+<1300> <13ff> 4864
+<1400> <14ff> 5120
+<1500> <15ff> 5376
+<1600> <16ff> 5632
+<1700> <17ff> 5888
+<1800> <18ff> 6144
+<1900> <19ff> 6400
+<1a00> <1aff> 6656
+<1b00> <1bff> 6912
+<1c00> <1cff> 7168
+<1d00> <1dff> 7424
+<1e00> <1eff> 7680
+<1f00> <1fff> 7936
+<2000> <20ff> 8192
+<2100> <21ff> 8448
+<2200> <220f> 8704
+endcidrange
+endcmap
+CMapName currentdict /CMap defineresource pop
+end
+end
+
+%%EndResource
+%%EOF
diff --git a/src/main/resources/Resources/cmap/Adobe-Japan1-4 b/src/main/resources/Resources/cmap/Adobe-Japan1-4
new file mode 100644
index 0000000..0bae599
--- /dev/null
+++ b/src/main/resources/Resources/cmap/Adobe-Japan1-4
@@ -0,0 +1 @@
+%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%IncludeResource: ProcSet (CIDInit) %%BeginResource: CMap (Identity) %%Title: (Identity Adobe Japan1 4) %%Version: 1.000 %%Copyright: ----------------------------------------------------------- %%Copyright: Copyright 1990-2000 Adobe Systems Incorporated. %%Copyright: All Rights Reserved. %%Copyright: %%Copyright: Patents Pending %%Copyright: %%Copyright: NOTICE: All information contained herein is the property %%Copyright: of Adobe Systems Incorporated. %%Copyright: %%Copyright: Permission is granted for redistribution of this file %%Copyright: provided this copyright notice is maintained intact and %%Copyright: that the contents of this file are not altered in any %%Copyright: way from its original form. %%Copyright: %%Copyright: PostScript and Display PostScript are trademarks of %%Copyright: Adobe Systems Incorporated which may be registered in %%Copyright: certain jurisdictions. %%Copyright: ----------------------------------------------------------- %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo 3 dict dup begin /Registry (Adobe) def /Ordering (Japan1) def /Supplement 4 def end def /CMapName /Adobe-Japan1-4 def /CMapVersion 1.000 def /CMapType 1 def /XUID [1 10 25537] def /WMode 0 def /CIDCount 15444 def 1 begincodespacerange <0000> <3CFF> endcodespacerange 61 begincidrange <0000> <00ff> 0 <0100> <01ff> 256 <0200> <02ff> 512 <0300> <03ff> 768 <0400> <04ff> 1024 <0500> <05ff> 1280 <0600> <06ff> 1536 <0700> <07ff> 1792 <0800> <08ff> 2048 <0900> <09ff> 2304 <0a00> <0aff> 2560 <0b00> <0bff> 2816 <0c00> <0cff> 3072 <0d00> <0dff> 3328 <0e00> <0eff> 3584 <0f00> <0fff> 3840 <1000> <10ff> 4096 <1100> <11ff> 4352 <1200> <12ff> 4608 <1300> <13ff> 4864 <1400> <14ff> 5120 <1500> <15ff> 5376 <1600> <16ff> 5632 <1700> <17ff> 5888 <1800> <18ff> 6144 <1900> <19ff> 6400 <1a00> <1aff> 6656 <1b00> <1bff> 6912 <1c00> <1cff> 7168 <1d00> <1dff> 7424 <1e00> <1eff> 7680 <1f00> <1fff> 7936 <2000> <20ff> 8192 <2100> <21ff> 8448 <2200> <22ff> 8704 <2300> <23ff> 8960 <2400> <24ff> 9216 <2500> <25ff> 9472 <2600> <26ff> 9728 <2700> <27ff> 9984 <2800> <28ff> 10240 <2900> <29ff> 10496 <2a00> <2aff> 10752 <2b00> <2bff> 11008 <2c00> <2cff> 11264 <2d00> <2dff> 11520 <2e00> <2eff> 11776 <2f00> <2fff> 12032 <3000> <30ff> 12288 <3100> <31ff> 12544 <3200> <32ff> 12800 <3300> <33ff> 13056 <3400> <34ff> 13312 <3500> <35ff> 13568 <3600> <36ff> 13824 <3700> <37ff> 14080 <3800> <38ff> 14336 <3900> <39ff> 14592 <3a00> <3aff> 14848 <3b00> <3bff> 15104 <3c00> <3c53> 15360 endcidrange endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF \ No newline at end of file
diff --git a/src/main/resources/Resources/cmap/Adobe-Japan1-90ms-RKSJ b/src/main/resources/Resources/cmap/Adobe-Japan1-90ms-RKSJ
new file mode 100644
index 0000000..a5086e7
--- /dev/null
+++ b/src/main/resources/Resources/cmap/Adobe-Japan1-90ms-RKSJ
@@ -0,0 +1,291 @@
+%!PS-Adobe-3.0 Resource-CMap
+%%DocumentNeededResources: ProcSet (CIDInit)
+%%IncludeResource: ProcSet (CIDInit)
+%%BeginResource: CMap (Adobe-Japan1-90ms-RKSJ)
+%%Title: (Adobe-Japan1-90ms-RKSJ Adobe 90ms-RKSJ 0)
+%%Version: 4.002
+%%Copyright: -----------------------------------------------------------
+%%Copyright: Copyright 1990-1996 Adobe Systems Incorporated.
+%%Copyright: All Rights Reserved.
+%%Copyright:
+%%Copyright: Patents Pending
+%%Copyright:
+%%Copyright: NOTICE: All information contained herein is the property
+%%Copyright: of Adobe Systems Incorporated.
+%%Copyright:
+%%Copyright: Permission is granted for redistribution of this file
+%%Copyright: provided this copyright notice is maintained intact and
+%%Copyright: that the contents of this file are not altered in any
+%%Copyright: way from its original form.
+%%Copyright:
+%%Copyright: PostScript and Display PostScript are trademarks of
+%%Copyright: Adobe Systems Incorporated which may be registered in
+%%Copyright: certain jurisdictions.
+%%Copyright: -----------------------------------------------------------
+%%EndComments
+
+/CIDInit /ProcSet findresource begin
+
+12 dict begin
+
+begincmap
+
+/CIDSystemInfo 3 dict dup begin
+/Registry (Adobe) def
+/Ordering (Adobe_Japan1_90ms_RKSJ) def
+/Supplement 0 def
+end def
+
+/CMapName /Adobe-Japan1-90ms-RKSJ def
+
+/CMapVersion 4.002 def
+/CMapType 1 def
+
+/XUID [1 10 25335 1212] def
+
+/WMode 0 def
+
+1 begincodespacerange
+<0000> <FFFF>
+endcodespacerange
+
+% Max CID: 8719 0x220f
+% Range Count: 225
+100 beginbfrange
+<0000> <0000> <20>
+<0001> <005f> <20>
+<00e7> <00ff> <20>
+<0100> <0144> <39>
+<0146> <0185> <a0>
+<0277> <0277> <7e>
+<0279> <02b7> <8140>
+<02b8> <02e4> <8180>
+<02e5> <02ec> <81b8>
+<02ed> <02f3> <81c8>
+<02f4> <02ff> <81da>
+<0300> <0302> <81e6>
+<0303> <030a> <81f0>
+<030b> <030b> <81fc>
+<030c> <0315> <824f>
+<0316> <032f> <8260>
+<0330> <0349> <8281>
+<034a> <039c> <829f>
+<039d> <03db> <8340>
+<03dc> <03f2> <8380>
+<03f3> <03ff> <839f>
+<0400> <040a> <83ac>
+<040b> <0422> <83bf>
+<0423> <0443> <8440>
+<0444> <0452> <8470>
+<0453> <0464> <8480>
+<0465> <04c2> <889f>
+<04c3> <04ff> <8940>
+<0500> <0501> <897d>
+<0502> <057e> <8980>
+<057f> <05bd> <8a40>
+<05be> <05ff> <8a80>
+<0600> <063a> <8ac2>
+<063b> <0679> <8b40>
+<067a> <06f6> <8b80>
+<06f7> <06ff> <8c40>
+<0700> <0735> <8c49>
+<0736> <07b2> <8c80>
+<07b3> <07f1> <8d40>
+<07f2> <07ff> <8d80>
+<0800> <086e> <8d8e>
+<086f> <08ad> <8e40>
+<08ae> <08ff> <8e80>
+<0900> <092a> <8ed2>
+<092b> <0969> <8f40>
+<096a> <09e6> <8f80>
+<09e7> <09ff> <9040>
+<0a00> <0a25> <9059>
+<0a26> <0aa2> <9080>
+<0aa3> <0ae1> <9140>
+<0ae2> <0aff> <9180>
+<0b00> <0b5e> <919e>
+<0b5f> <0b9d> <9240>
+<0b9e> <0bff> <9280>
+<0c00> <0c1a> <92e2>
+<0c1b> <0c59> <9340>
+<0c5a> <0cd6> <9380>
+<0cd7> <0cff> <9440>
+<0d00> <0d15> <9469>
+<0d16> <0d92> <9480>
+<0d93> <0dd1> <9540>
+<0dd2> <0dff> <9580>
+<0e00> <0e4e> <95ae>
+<0e4f> <0e8d> <9640>
+<0e8e> <0eff> <9680>
+<0f00> <0f0a> <96f2>
+<0f0b> <0f49> <9740>
+<0f4a> <0fc6> <9780>
+<0fc7> <0ff9> <9840>
+<0ffa> <0fff> <989f>
+<1000> <1057> <98a5>
+<1058> <1096> <9940>
+<1097> <10ff> <9980>
+<1100> <1113> <99e9>
+<1114> <1152> <9a40>
+<1153> <11cf> <9a80>
+<11d0> <11ff> <9b40>
+<1200> <120e> <9b70>
+<120f> <128b> <9b80>
+<128c> <12ca> <9c40>
+<12cb> <12ff> <9c80>
+<1300> <1347> <9cb5>
+<1348> <1386> <9d40>
+<1387> <13ff> <9d80>
+<1400> <1403> <9df9>
+<1404> <1442> <9e40>
+<1443> <14bf> <9e80>
+<14c0> <14fe> <9f40>
+<14ff> <14ff> <9f80>
+<1500> <157b> <9f81>
+<157c> <15ba> <e040>
+<15bb> <15ff> <e080>
+<1600> <1637> <e0c5>
+<1638> <1676> <e140>
+<1677> <16f3> <e180>
+<16f4> <16ff> <e240>
+<1700> <1732> <e24c>
+<1733> <17af> <e280>
+<17b0> <17ee> <e340>
+<17ef> <17ff> <e380>
+endbfrange
+100 beginbfrange
+<1800> <186b> <e391>
+<186c> <18aa> <e440>
+<18ab> <18ff> <e480>
+<1900> <1927> <e4d5>
+<1928> <1966> <e540>
+<1967> <19e3> <e580>
+<19e4> <19ff> <e640>
+<1a00> <1a22> <e65c>
+<1a23> <1a9f> <e680>
+<1aa0> <1ade> <e740>
+<1adf> <1aff> <e780>
+<1b00> <1b5b> <e7a1>
+<1b5c> <1b9a> <e840>
+<1b9b> <1bff> <e880>
+<1c00> <1c17> <e8e5>
+<1c18> <1c56> <e940>
+<1c57> <1cd3> <e980>
+<1cd4> <1cff> <ea40>
+<1d00> <1d12> <ea6c>
+<1d13> <1d35> <ea80>
+<1d37> <1d37> <849f>
+<1d38> <1d38> <84aa>
+<1d39> <1d39> <84a0>
+<1d3a> <1d3a> <84ab>
+<1d43> <1d43> <84a1>
+<1d46> <1d46> <84ac>
+<1d47> <1d47> <84a2>
+<1d4a> <1d4a> <84ad>
+<1d4b> <1d4b> <84a4>
+<1d4e> <1d4e> <84af>
+<1d4f> <1d4f> <84a3>
+<1d52> <1d52> <84ae>
+<1d53> <1d53> <84a5>
+<1d54> <1d54> <84ba>
+<1d57> <1d57> <84b5>
+<1d5a> <1d5a> <84b0>
+<1d5b> <1d5b> <84a7>
+<1d5c> <1d5c> <84bc>
+<1d5f> <1d5f> <84b7>
+<1d62> <1d62> <84b2>
+<1d63> <1d63> <84a6>
+<1d66> <1d66> <84b6>
+<1d67> <1d67> <84bb>
+<1d6a> <1d6a> <84b1>
+<1d6b> <1d6b> <84a8>
+<1d6e> <1d6e> <84b8>
+<1d6f> <1d6f> <84bd>
+<1d72> <1d72> <84b3>
+<1d73> <1d73> <84a9>
+<1d76> <1d76> <84b9>
+<1d79> <1d79> <84be>
+<1d82> <1d82> <84b4>
+<1d83> <1da0> <8740>
+<1da1> <1da2> <875f>
+<1da4> <1da4> <8762>
+<1da6> <1da6> <8764>
+<1da8> <1da9> <8766>
+<1dab> <1dac> <8769>
+<1dae> <1daf> <876c>
+<1db1> <1db7> <876f>
+<1db8> <1dbb> <8780>
+<1dbd> <1dc7> <8785>
+<1dc8> <1dce> <8793>
+<1dcf> <1dd0> <879b>
+<1ecf> <1ed0> <8141>
+<1ed1> <1ed2> <8150>
+<1ed3> <1ed5> <815b>
+<1ed6> <1eda> <8160>
+<1edb> <1eec> <8169>
+<1eed> <1eed> <8181>
+<1eee> <1eee> <829f>
+<1eef> <1eef> <82a1>
+<1ef0> <1ef0> <82a3>
+<1ef1> <1ef1> <82a5>
+<1ef2> <1ef2> <82a7>
+<1ef3> <1ef3> <82c1>
+<1ef4> <1ef4> <82e1>
+<1ef5> <1ef5> <82e3>
+<1ef6> <1ef6> <82e5>
+<1ef7> <1ef7> <82ec>
+<1ef8> <1ef8> <8340>
+<1ef9> <1ef9> <8342>
+<1efa> <1efa> <8344>
+<1efb> <1efb> <8346>
+<1efc> <1efc> <8348>
+<1efd> <1efd> <8362>
+<1efe> <1efe> <8383>
+<1eff> <1eff> <8385>
+<1f00> <1f00> <8387>
+<1f01> <1f01> <838e>
+<1f02> <1f03> <8395>
+<1f04> <1f05> <875f>
+<1f07> <1f07> <8762>
+<1f09> <1f09> <8764>
+<1f0b> <1f0c> <8766>
+<1f0e> <1f0f> <8769>
+<1f11> <1f12> <876c>
+<1f14> <1f15> <8780>
+<1f45> <1f47> <eefa>
+<1f66> <1f66> <8761>
+endbfrange
+25 beginbfrange
+<1f68> <1f68> <8763>
+<1f6a> <1f6a> <8765>
+<1f6b> <1f6b> <876b>
+<1f6c> <1f6c> <8768>
+<1f6f> <1f6f> <876e>
+<1f77> <1f77> <8784>
+<1f9c> <1fa5> <eeef>
+<204c> <204c> <8143>
+<204e> <204e> <81ac>
+<2052> <2052> <8144>
+<205c> <205d> <eaa3>
+<2083> <2083> <877e>
+<2089> <2089> <8761>
+<2092> <2092> <8765>
+<2093> <2093> <8763>
+<2098> <2098> <8768>
+<209c> <209c> <876b>
+<209d> <209d> <876e>
+<20a7> <20e5> <ed40>
+<20e6> <20ff> <ed80>
+<2100> <2119> <ed9a>
+<211a> <2161> <edb5>
+<2162> <21a0> <ee40>
+<21a1> <21ff> <ee80>
+<2200> <220d> <eedf>
+endbfrange
+endcmap
+CMapName currentdict /CMap defineresource pop
+end
+end
+
+%%EndResource
+%%EOF
diff --git a/src/main/resources/Resources/cmap/Adobe-Japan1-90pv-RKSJ b/src/main/resources/Resources/cmap/Adobe-Japan1-90pv-RKSJ
new file mode 100644
index 0000000..532f05d
--- /dev/null
+++ b/src/main/resources/Resources/cmap/Adobe-Japan1-90pv-RKSJ
@@ -0,0 +1,389 @@
+%!PS-Adobe-3.0 Resource-CMap
+%%DocumentNeededResources: ProcSet (CIDInit)
+%%IncludeResource: ProcSet (CIDInit)
+%%BeginResource: CMap (Adobe-Japan1-90pv-RKSJ)
+%%Title: (Adobe-Japan1-90pv Adobe Japan1 2)
+%%Version: 4.002
+%%Copyright: -----------------------------------------------------------
+%%Copyright: Copyright 1990-1996 Adobe Systems Incorporated.
+%%Copyright: All Rights Reserved.
+%%Copyright:
+%%Copyright: Patents Pending
+%%Copyright:
+%%Copyright: NOTICE: All information contained herein is the property
+%%Copyright: of Adobe Systems Incorporated.
+%%Copyright:
+%%Copyright: Permission is granted for redistribution of this file
+%%Copyright: provided this copyright notice is maintained intact and
+%%Copyright: that the contents of this file are not altered in any
+%%Copyright: way from its original form.
+%%Copyright:
+%%Copyright: PostScript and Display PostScript are trademarks of
+%%Copyright: Adobe Systems Incorporated which may be registered in
+%%Copyright: certain jurisdictions.
+%%Copyright: -----------------------------------------------------------
+%%EndComments
+
+/CIDInit /ProcSet findresource begin
+
+12 dict begin
+
+begincmap
+
+/CIDSystemInfo 3 dict dup begin
+/Registry (Adobe) def
+/Ordering (Adobe_Japan1_90pv_RKSJ) def
+/Supplement 2 def
+end def
+
+/CMapName /Adobe-Japan1-90pv-RKSJ def
+
+/CMapVersion 4.002 def
+/CMapType 1 def
+
+/XUID [1 10 25335 1212] def
+
+/WMode 0 def
+
+1 begincodespacerange
+<0000> <FFFF>
+endcodespacerange
+
+% Halfwidth Roman
+2 beginbfrange
+<00e7> <00ff> <20>
+<0100> <0145> <39>
+endbfrange
+
+% Max CID: 8358 0x20a6
+% Range Count: 315
+100 beginbfrange
+<0000> <0000> <20>
+<0001> <005f> <20>
+<0061> <0061> <80>
+<007c> <007c> <ff>
+<0098> <0098> <fd>
+<00e4> <00e4> <fe>
+<0146> <0185> <a0>
+<0279> <02b7> <8140>
+<02b8> <02e4> <8180>
+<02e5> <02ec> <81b8>
+<02ed> <02f3> <81c8>
+<02f4> <02ff> <81da>
+<0300> <0302> <81e6>
+<0303> <030a> <81f0>
+<030b> <030b> <81fc>
+<030c> <0315> <824f>
+<0316> <032f> <8260>
+<0330> <0349> <8281>
+<034a> <039c> <829f>
+<039d> <03db> <8340>
+<03dc> <03f2> <8380>
+<03f3> <03ff> <839f>
+<0400> <040a> <83ac>
+<040b> <0422> <83bf>
+<0423> <0443> <8440>
+<0444> <0452> <8470>
+<0453> <0464> <8480>
+<0465> <04c2> <889f>
+<04c3> <04ff> <8940>
+<0500> <0501> <897d>
+<0502> <057e> <8980>
+<057f> <05bd> <8a40>
+<05be> <05ff> <8a80>
+<0600> <063a> <8ac2>
+<063b> <0679> <8b40>
+<067a> <06f6> <8b80>
+<06f7> <06ff> <8c40>
+<0700> <0735> <8c49>
+<0736> <07b2> <8c80>
+<07b3> <07f1> <8d40>
+<07f2> <07ff> <8d80>
+<0800> <086e> <8d8e>
+<086f> <08ad> <8e40>
+<08ae> <08ff> <8e80>
+<0900> <092a> <8ed2>
+<092b> <0969> <8f40>
+<096a> <09e6> <8f80>
+<09e7> <09ff> <9040>
+<0a00> <0a25> <9059>
+<0a26> <0aa2> <9080>
+<0aa3> <0ae1> <9140>
+<0ae2> <0aff> <9180>
+<0b00> <0b5e> <919e>
+<0b5f> <0b9d> <9240>
+<0b9e> <0bff> <9280>
+<0c00> <0c1a> <92e2>
+<0c1b> <0c59> <9340>
+<0c5a> <0cd6> <9380>
+<0cd7> <0cff> <9440>
+<0d00> <0d15> <9469>
+<0d16> <0d92> <9480>
+<0d93> <0dd1> <9540>
+<0dd2> <0dff> <9580>
+<0e00> <0e4e> <95ae>
+<0e4f> <0e8d> <9640>
+<0e8e> <0eff> <9680>
+<0f00> <0f0a> <96f2>
+<0f0b> <0f49> <9740>
+<0f4a> <0fc6> <9780>
+<0fc7> <0ff9> <9840>
+<0ffa> <0fff> <989f>
+<1000> <1057> <98a5>
+<1058> <1096> <9940>
+<1097> <10ff> <9980>
+<1100> <1113> <99e9>
+<1114> <1152> <9a40>
+<1153> <11cf> <9a80>
+<11d0> <11ff> <9b40>
+<1200> <120e> <9b70>
+<120f> <128b> <9b80>
+<128c> <12ca> <9c40>
+<12cb> <12ff> <9c80>
+<1300> <1347> <9cb5>
+<1348> <1386> <9d40>
+<1387> <13ff> <9d80>
+<1400> <1403> <9df9>
+<1404> <1442> <9e40>
+<1443> <14bf> <9e80>
+<14c0> <14fe> <9f40>
+<14ff> <14ff> <9f80>
+<1500> <157b> <9f81>
+<157c> <15ba> <e040>
+<15bb> <15ff> <e080>
+<1600> <1637> <e0c5>
+<1638> <1676> <e140>
+<1677> <16f3> <e180>
+<16f4> <16ff> <e240>
+<1700> <1732> <e24c>
+<1733> <17af> <e280>
+<17b0> <17ee> <e340>
+endbfrange
+100 beginbfrange
+<17ef> <17ff> <e380>
+<1800> <186b> <e391>
+<186c> <18aa> <e440>
+<18ab> <18ff> <e480>
+<1900> <1927> <e4d5>
+<1928> <1966> <e540>
+<1967> <19e3> <e580>
+<19e4> <19ff> <e640>
+<1a00> <1a22> <e65c>
+<1a23> <1a9f> <e680>
+<1aa0> <1ade> <e740>
+<1adf> <1aff> <e780>
+<1b00> <1b5b> <e7a1>
+<1b5c> <1b9a> <e840>
+<1b9b> <1bff> <e880>
+<1c00> <1c17> <e8e5>
+<1c18> <1c56> <e940>
+<1c57> <1cd3> <e980>
+<1cd4> <1cff> <ea40>
+<1d00> <1d12> <ea6c>
+<1d13> <1d35> <ea80>
+<1d37> <1d37> <849f>
+<1d38> <1d38> <84aa>
+<1d39> <1d39> <84a0>
+<1d3a> <1d3a> <84ab>
+<1d43> <1d43> <84a1>
+<1d46> <1d46> <84ac>
+<1d47> <1d47> <84a2>
+<1d4a> <1d4a> <84ad>
+<1d4b> <1d4b> <84a4>
+<1d4e> <1d4e> <84af>
+<1d4f> <1d4f> <84a3>
+<1d52> <1d52> <84ae>
+<1d53> <1d53> <84a5>
+<1d54> <1d54> <84ba>
+<1d57> <1d57> <84b5>
+<1d5a> <1d5a> <84b0>
+<1d5b> <1d5b> <84a7>
+<1d5c> <1d5c> <84bc>
+<1d5f> <1d5f> <84b7>
+<1d62> <1d62> <84b2>
+<1d63> <1d63> <84a6>
+<1d66> <1d66> <84b6>
+<1d67> <1d67> <84bb>
+<1d6a> <1d6a> <84b1>
+<1d6b> <1d6b> <84a8>
+<1d6e> <1d6e> <84b8>
+<1d6f> <1d6f> <84bd>
+<1d72> <1d72> <84b3>
+<1d73> <1d73> <84a9>
+<1d76> <1d76> <84b9>
+<1d79> <1d79> <84be>
+<1d82> <1d82> <84b4>
+<1d83> <1d96> <8540>
+<1d97> <1da0> <859f>
+<1da1> <1da1> <879f>
+<1da2> <1da2> <87a2>
+<1da4> <1da4> <87a1>
+<1da6> <1da6> <87ab>
+<1da8> <1da8> <87a8>
+<1da9> <1da9> <87ac>
+<1dab> <1dab> <87b0>
+<1dac> <1dac> <87b3>
+<1dae> <1dae> <87b5>
+<1daf> <1daf> <87ad>
+<1db1> <1db1> <8640>
+<1db2> <1db2> <8642>
+<1db3> <1db3> <8648>
+<1db4> <1db4> <864a>
+<1db5> <1db6> <864c>
+<1db7> <1db7> <8646>
+<1db8> <1db9> <8854>
+<1dba> <1dbc> <869b>
+<1dbd> <1dc1> <8793>
+<1dc2> <1dc2> <874d>
+<1dc3> <1dc3> <8750>
+<1dc4> <1dc4> <874b>
+<1dc5> <1dc7> <87e5>
+<1dc8> <1dc8> <8840>
+<1dcd> <1dce> <8841>
+<1ecf> <1ed0> <8141>
+<1ed1> <1ed2> <8150>
+<1ed3> <1ed5> <815b>
+<1ed6> <1eda> <8160>
+<1edb> <1eec> <8169>
+<1eed> <1eed> <8181>
+<1eee> <1eee> <829f>
+<1eef> <1eef> <82a1>
+<1ef0> <1ef0> <82a3>
+<1ef1> <1ef1> <82a5>
+<1ef2> <1ef2> <82a7>
+<1ef3> <1ef3> <82c1>
+<1ef4> <1ef4> <82e1>
+<1ef5> <1ef5> <82e3>
+<1ef6> <1ef6> <82e5>
+<1ef7> <1ef7> <82ec>
+<1ef8> <1ef8> <8340>
+<1ef9> <1ef9> <8342>
+<1efa> <1efa> <8344>
+<1efb> <1efb> <8346>
+endbfrange
+100 beginbfrange
+<1efc> <1efc> <8348>
+<1efd> <1efd> <8362>
+<1efe> <1efe> <8383>
+<1eff> <1eff> <8385>
+<1f00> <1f00> <8387>
+<1f01> <1f01> <838e>
+<1f02> <1f03> <8395>
+<1f04> <1f04> <879f>
+<1f05> <1f05> <87a2>
+<1f07> <1f07> <87a1>
+<1f09> <1f09> <87ab>
+<1f0b> <1f0b> <87a8>
+<1f0c> <1f0c> <87ac>
+<1f0e> <1f0e> <87b0>
+<1f0f> <1f0f> <87b3>
+<1f11> <1f11> <87b5>
+<1f12> <1f12> <87ad>
+<1f16> <1f16> <8868>
+<1f4b> <1f4b> <86d2>
+<1f4c> <1f4c> <86d1>
+<1f4d> <1f4d> <86d0>
+<1f4e> <1f4e> <86cf>
+<1f50> <1f51> <86a0>
+<1f52> <1f52> <869f>
+<1f53> <1f53> <86a2>
+<1f54> <1f54> <8643>
+<1f55> <1f55> <8649>
+<1f56> <1f56> <8644>
+<1f57> <1f57> <8647>
+<1f58> <1f5e> <864f>
+<1f5f> <1f61> <865a>
+<1f62> <1f63> <8658>
+<1f64> <1f64> <8657>
+<1f65> <1f65> <864e>
+<1f66> <1f66> <87a0>
+<1f67> <1f67> <87a3>
+<1f68> <1f69> <87a9>
+<1f6a> <1f6a> <87a7>
+<1f6b> <1f6b> <87b2>
+<1f6c> <1f6c> <87af>
+<1f6d> <1f6d> <87b1>
+<1f6e> <1f6e> <87ae>
+<1f6f> <1f6f> <87b4>
+<1f70> <1f70> <87bd>
+<1f71> <1f72> <87c0>
+<1f73> <1f74> <87be>
+<1f76> <1f76> <87fa>
+<1f78> <1f78> <86b4>
+<1f7a> <1f7a> <86b3>
+<1f7d> <1f86> <8591>
+<1f87> <1f9a> <855e>
+<1f9c> <1fa5> <85b3>
+<1fb0> <1fc9> <85db>
+<1fca> <1fca> <874a>
+<1fcb> <1fcc> <8756>
+<1fcd> <1fcd> <874f>
+<1fce> <1fce> <8758>
+<1fcf> <1fcf> <8753>
+<1fd0> <1fd0> <8755>
+<1fd1> <1fd1> <8749>
+<1fd2> <1fd2> <874e>
+<1fd3> <1fd3> <8752>
+<1fd4> <1fd4> <8754>
+<1fd5> <1fd5> <8751>
+<1fd6> <1fd6> <8747>
+<1fd7> <1fd7> <874c>
+<1fda> <1fda> <8798>
+<1fde> <1fde> <879b>
+<1fe5> <1fe5> <8799>
+<1ff7> <1ff7> <87a4>
+<1ffa> <1ffa> <8641>
+<1fff> <1fff> <879c>
+<2005> <200b> <8740>
+<200c> <200c> <8748>
+<200e> <2011> <86d3>
+<2013> <2013> <86a3>
+<2014> <2014> <86a5>
+<2015> <2015> <86a4>
+<2016> <2016> <86a6>
+<201b> <201e> <86c7>
+<201f> <201f> <879e>
+<2021> <2022> <85a9>
+<205c> <205d> <eaa3>
+<205e> <2060> <857c>
+<2061> <2066> <8580>
+<2067> <2069> <85ab>
+<206a> <206e> <85bd>
+<206f> <206f> <8645>
+<2070> <2070> <864b>
+<2071> <2071> <8656>
+<2072> <2072> <865d>
+<2073> <2073> <869e>
+<2074> <2074> <86b5>
+<2075> <2078> <86cb>
+<2079> <207c> <886a>
+<207d> <207e> <8791>
+<207f> <207f> <879a>
+<2080> <2080> <879d>
+<2081> <2082> <87fb>
+<2083> <2083> <87e8>
+endbfrange
+15 beginbfrange
+<2084> <2086> <87fa>
+<2087> <2088> <87a5>
+<2089> <2089> <87a0>
+<208a> <208a> <87a3>
+<208d> <208e> <87a4>
+<2091> <2092> <87a6>
+<2093> <2094> <87a9>
+<2097> <2098> <87ae>
+<209b> <209c> <87b1>
+<209d> <209d> <87b4>
+<209e> <209e> <87bd>
+<20a1> <20a1> <87be>
+<20a4> <20a4> <87bf>
+<20a5> <20a5> <87c1>
+<20a6> <20a6> <87c0>
+endbfrange
+endcmap
+CMapName currentdict /CMap defineresource pop
+end
+end
+
+%%EndResource
+%%EOF
diff --git a/src/main/resources/Resources/cmap/Adobe-Japan1-H-CID b/src/main/resources/Resources/cmap/Adobe-Japan1-H-CID
new file mode 100644
index 0000000..5db11a2
--- /dev/null
+++ b/src/main/resources/Resources/cmap/Adobe-Japan1-H-CID
@@ -0,0 +1,101 @@
+%!PS-Adobe-3.0 Resource-CMap
+%%DocumentNeededResources: ProcSet (CIDInit)
+%%IncludeResource: ProcSet (CIDInit)
+%%BeginResource: CMap (Adobe-Japan1-H-CID)
+%%Title: (Adobe-Japan1-H-CID Identity Japan1 2)
+%%Version: 2.000
+%%Copyright: -----------------------------------------------------------
+%%Copyright: Copyright 1990-2000 Adobe Systems Incorporated.
+%%Copyright: All Rights Reserved.
+%%Copyright:
+%%Copyright: Patents Pending
+%%Copyright:
+%%Copyright: NOTICE: All information contained herein is the property
+%%Copyright: of Adobe Systems Incorporated.
+%%Copyright:
+%%Copyright: Permission is granted for redistribution of this file
+%%Copyright: provided this copyright notice is maintained intact and
+%%Copyright: that the contents of this file are not altered in any
+%%Copyright: way from its original form.
+%%Copyright:
+%%Copyright: PostScript and Display PostScript are trademarks of
+%%Copyright: Adobe Systems Incorporated which may be registered in
+%%Copyright: certain jurisdictions.
+%%Copyright: -----------------------------------------------------------
+%%EndComments
+
+/CIDInit /ProcSet findresource begin
+
+12 dict begin
+
+begincmap
+
+/CIDSystemInfo 3 dict dup begin
+ /Registry (Adobe) def
+ /Ordering (Adobe_Japan1_H_CID) def
+ /Supplement 2 def
+end def
+
+/CMapName /Adobe-Japan1-H-CID def
+/CMapVersion 2.000 def
+/CMapType 1 def
+
+/UIDOffset 0 def
+/XUID [1 10 25404 99996] def
+
+/WMode 0 def
+
+1 begincodespacerange
+ <0000> <FFFF>
+endcodespacerange
+
+0 usefont
+1 begincidrange
+<0000> <FFFF> 0
+endcidrange
+
+% Map CIDs 1 thru 95 to Ascii codes 0x20 - 0x7F in fontID 1.
+% leave 3d, yen in font 0
+1 usefont
+2 beginbfrange
+<0001> <003c> <20>
+<003e> <005f> <5d>
+endbfrange
+
+% Map CIDs 8284 to 8358 to fontID 2. Supplement 1
+2 usefont
+1 begincidrange
+<205C> <20A6> 8284
+endcidrange
+
+% Map CIDs 8359 to 8719 to fontID 3. Supplement 2
+3 usefont
+3 begincidrange
+<20A7> <20FF> 8359
+<2100> <21FF> 8448
+<2200> <220F> 8704
+endcidrange
+
+% Map CIDs 8720 to 9353 to fontID 4. Supplement 3
+4 usefont
+3 begincidrange
+<2210> <22FF> 8720
+<2300> <23FF> 8960
+<2400> <2489> 9216
+endcidrange
+
+% Map CIDs 9354 to 15443 to fontID 5. Supplement 4
+% Also map the remaining CIDs up to 65535 to this fontID
+5 usefont
+2 begincidrange
+<248A> <24FF> 9354
+<2500> <FFFF> 9472
+endcidrange
+
+endcmap
+CMapName currentdict /CMap defineresource pop
+end
+end
+
+%%EndResource
+%%EOF
diff --git a/src/main/resources/Resources/cmap/Adobe-Japan1-H-Host b/src/main/resources/Resources/cmap/Adobe-Japan1-H-Host
new file mode 100644
index 0000000..18e6ca2
--- /dev/null
+++ b/src/main/resources/Resources/cmap/Adobe-Japan1-H-Host
@@ -0,0 +1,311 @@
+%!PS-Adobe-3.0 Resource-CMap
+%%DocumentNeededResources: ProcSet (CIDInit)
+%%IncludeResource: ProcSet (CIDInit)
+%%BeginResource: CMap (Adobe-Japan1-H-Host)
+%%Title: (Adobe-Japan1-H-Host Adobe 90ms-RKSJ 0)
+%%Version: 5.000
+%%Copyright: -----------------------------------------------------------
+%%Copyright: Copyright 1990-2000 Adobe Systems Incorporated.
+%%Copyright: All Rights Reserved.
+%%Copyright:
+%%Copyright: Patents Pending
+%%Copyright:
+%%Copyright: NOTICE: All information contained herein is the property
+%%Copyright: of Adobe Systems Incorporated.
+%%Copyright:
+%%Copyright: Permission is granted for redistribution of this file
+%%Copyright: provided this copyright notice is maintained intact and
+%%Copyright: that the contents of this file are not altered in any
+%%Copyright: way from its original form.
+%%Copyright:
+%%Copyright: PostScript and Display PostScript are trademarks of
+%%Copyright: Adobe Systems Incorporated which may be registered in
+%%Copyright: certain jurisdictions.
+%%Copyright: -----------------------------------------------------------
+%%EndComments
+
+/CIDInit /ProcSet findresource begin
+
+12 dict begin
+
+begincmap
+
+/CIDSystemInfo 3 dict dup begin
+/Registry (Adobe) def
+/Ordering (Adobe_Japan1_H_Host) def
+/Supplement 0 def
+end def
+
+/CMapName /Adobe-Japan1-H-Host def
+
+/CMapVersion 5.000 def
+/CMapType 1 def
+
+/WMode 0 def
+
+1 begincodespacerange
+<0000> <FFFF>
+endcodespacerange
+
+% Max CID: 8719 0x220f
+% Range Count: 225
+4 usefont
+1 begincidrange
+<0000> <FFFF> 0
+endcidrange
+
+% Halfwidth characters
+2 usefont
+5 beginbfrange
+<00e7> <00ff> <20>
+<0100> <0144> <39>
+<0146> <0185> <a0>
+<0186> <0186> <60>
+<0277> <0277> <7e>
+endbfrange
+
+0 usefont
+100 beginbfrange
+<0000> <0000> <8140>
+<0279> <02B7> <8140>
+<02B8> <02DF> <8180>
+<02E5> <02EC> <81B8>
+<02ED> <02F3> <81C8>
+<02F4> <02FF> <81DA>
+<0300> <0302> <81E6>
+<0303> <030A> <81F0>
+<030B> <030B> <81FC>
+<030C> <0315> <824F>
+<0316> <032F> <8260>
+<0330> <0349> <8281>
+<034A> <039C> <829F>
+<039D> <03DB> <8340>
+<03DC> <03F2> <8380>
+<03F3> <03FF> <839F>
+<0400> <040A> <83AC>
+<040B> <0422> <83BF>
+<0423> <0443> <8440>
+<0444> <0452> <8470>
+<0453> <0464> <8480>
+<0465> <04C2> <889F>
+<04C3> <04FF> <8940>
+<0500> <0501> <897D>
+<0502> <057E> <8980>
+<057F> <05BD> <8A40>
+<05BE> <05FF> <8A80>
+<0600> <063A> <8AC2>
+<063B> <0679> <8B40>
+<067A> <06F6> <8B80>
+<06F7> <06FF> <8C40>
+<0700> <0735> <8C49>
+<0736> <07B2> <8C80>
+<07B3> <07F1> <8D40>
+<07F2> <07FF> <8D80>
+<0800> <086E> <8D8E>
+<086F> <08AD> <8E40>
+<08AE> <08FF> <8E80>
+<0900> <092A> <8ED2>
+<092B> <0969> <8F40>
+<096A> <09E6> <8F80>
+<09E7> <09FF> <9040>
+<0A00> <0A25> <9059>
+<0A26> <0AA2> <9080>
+<0AA3> <0AE1> <9140>
+<0AE2> <0AFF> <9180>
+<0B00> <0B5E> <919E>
+<0B5F> <0B9D> <9240>
+<0B9E> <0BFF> <9280>
+<0C00> <0C1A> <92E2>
+<0C1B> <0C59> <9340>
+<0C5A> <0CD6> <9380>
+<0CD7> <0CFF> <9440>
+<0D00> <0D15> <9469>
+<0D16> <0D92> <9480>
+<0D93> <0DD1> <9540>
+<0DD2> <0DFF> <9580>
+<0E00> <0E4E> <95AE>
+<0E4F> <0E8D> <9640>
+<0E8E> <0EFF> <9680>
+<0F00> <0F0A> <96F2>
+<0F0B> <0F49> <9740>
+<0F4A> <0FC6> <9780>
+<0FC7> <0FF9> <9840>
+<0FFA> <0FFF> <989F>
+<1000> <1057> <98A5>
+<1058> <1096> <9940>
+<1097> <10FF> <9980>
+<1100> <1113> <99E9>
+<1114> <1152> <9A40>
+<1153> <11CF> <9A80>
+<11D0> <11FF> <9B40>
+<1200> <120E> <9B70>
+<120F> <128B> <9B80>
+<128C> <12CA> <9C40>
+<12CB> <12FF> <9C80>
+<1300> <1347> <9CB5>
+<1348> <1386> <9D40>
+<1387> <13FF> <9D80>
+<1400> <1403> <9DF9>
+<1404> <1442> <9E40>
+<1443> <14BF> <9E80>
+<14C0> <14FE> <9F40>
+<14FF> <14FF> <9F80>
+<1500> <157B> <9F81>
+<157C> <15BA> <E040>
+<15BB> <15FF> <E080>
+<1600> <1637> <E0C5>
+<1638> <1676> <E140>
+<1677> <16F3> <E180>
+<16F4> <16FF> <E240>
+<1700> <1732> <E24C>
+<1733> <17AF> <E280>
+<17B0> <17EE> <E340>
+<17EF> <17FF> <E380>
+<1800> <186B> <E391>
+<186C> <18AA> <E440>
+<18AB> <18FF> <E480>
+<1900> <1927> <E4D5>
+<1928> <1966> <E540>
+endbfrange
+84 beginbfrange
+<1967> <19E3> <E580>
+<19E4> <19FF> <E640>
+<1A00> <1A22> <E65C>
+<1A23> <1A9F> <E680>
+<1AA0> <1ADE> <E740>
+<1ADF> <1AFF> <E780>
+<1B00> <1B5B> <E7A1>
+<1B5C> <1B9A> <E840>
+<1B9B> <1BFF> <E880>
+<1C00> <1C17> <E8E5>
+<1C18> <1C56> <E940>
+<1C57> <1CD3> <E980>
+<1CD4> <1CFF> <EA40>
+<1D00> <1D12> <EA6C>
+<1D13> <1D35> <EA80>
+<1D73> <1D73> <84A9>
+<1D82> <1D82> <84B4>
+<1D83> <1DA0> <8740>
+<1DA1> <1DA2> <875F>
+<1DA4> <1DA4> <8762>
+<1DA6> <1DA6> <8764>
+<1DA8> <1DA9> <8766>
+<1DAB> <1DAC> <8769>
+<1DAE> <1DAF> <876C>
+<1DB1> <1DB7> <876F>
+<1DB8> <1DBB> <8780>
+<1DBD> <1DC7> <8785>
+<1DC8> <1DCE> <8793>
+<1ECF> <1ED0> <8141>
+<1ED1> <1ED2> <8150>
+<1ED3> <1ED5> <815B>
+<1ED6> <1EDA> <8160>
+<1EDB> <1EEC> <8169>
+<1EED> <1EED> <8181>
+<1EEE> <1EEE> <829F>
+<1EEF> <1EEF> <82A1>
+<1EF0> <1EF0> <82A3>
+<1EF1> <1EF1> <82A5>
+<1EF2> <1EF2> <82A7>
+<1EF3> <1EF3> <82C1>
+<1EF4> <1EF4> <82E1>
+<1EF5> <1EF5> <82E3>
+<1EF6> <1EF6> <82E5>
+<1EF7> <1EF7> <82EC>
+<1EF8> <1EF8> <8340>
+<1EF9> <1EF9> <8342>
+<1EFA> <1EFA> <8344>
+<1EFB> <1EFB> <8346>
+<1EFC> <1EFC> <8348>
+<1EFD> <1EFD> <8362>
+<1EFE> <1EFE> <8383>
+<1EFF> <1EFF> <8385>
+<1F00> <1F00> <8387>
+<1F01> <1F01> <838E>
+<1F02> <1F03> <8395>
+<1F09> <1F09> <8764>
+<1F0B> <1F0C> <8766>
+<1F0E> <1F0F> <8769>
+<1F11> <1F12> <876C>
+<1F14> <1F15> <8780>
+<1F45> <1F47> <EEFA>
+<1F66> <1F66> <8761>
+<1F68> <1F68> <8763>
+<1F6A> <1F6A> <8765>
+<1F6B> <1F6B> <876B>
+<1F6C> <1F6C> <8768>
+<1F6F> <1F6F> <876E>
+<1F77> <1F77> <8784>
+<1F9C> <1FA5> <EEEF>
+<204E> <204E> <81AC>
+<205C> <205D> <EAA3>
+<2083> <2083> <877E>
+<2092> <2092> <8765>
+<2093> <2093> <8763>
+<2098> <2098> <8768>
+<209C> <209C> <876B>
+<209D> <209D> <876E>
+<20A7> <20E5> <ED40>
+<20E6> <20FF> <ED80>
+<2100> <2119> <ED9A>
+<211A> <2161> <EDB5>
+<2162> <21A0> <EE40>
+<21A1> <21FF> <EE80>
+<2200> <220D> <EEDF>
+endbfrange
+
+1 usefont % Proportional Roman characters
+1 beginbfrange
+<0001> <005f> <20>
+endbfrange
+
+3 usefont % vertical characters
+38 beginbfrange
+<1ecf> <1ed0> <8141>
+<1ed1> <1ed2> <8150>
+<1ed3> <1ed5> <815b>
+<1ed6> <1eda> <8160>
+<1edb> <1eec> <8169>
+<1eed> <1eed> <8181>
+<1eee> <1eee> <829f>
+<1eef> <1eef> <82a1>
+<1ef0> <1ef0> <82a3>
+<1ef1> <1ef1> <82a5>
+<1ef2> <1ef2> <82a7>
+<1ef3> <1ef3> <82c1>
+<1ef4> <1ef4> <82e1>
+<1ef5> <1ef5> <82e3>
+<1ef6> <1ef6> <82e5>
+<1ef7> <1ef7> <82ec>
+<1ef8> <1ef8> <8340>
+<1ef9> <1ef9> <8342>
+<1efa> <1efa> <8344>
+<1efb> <1efb> <8346>
+<1efc> <1efc> <8348>
+<1efd> <1efd> <8362>
+<1efe> <1efe> <8383>
+<1eff> <1eff> <8385>
+<1f00> <1f00> <8387>
+<1f01> <1f01> <838e>
+<1f02> <1f03> <8395>
+<1f09> <1f09> <8764>
+<1f0b> <1f0c> <8766>
+<1f0e> <1f0f> <8769>
+<1f11> <1f12> <876c>
+<1f14> <1f15> <8780>
+<204e> <204e> <81ac>
+<2092> <2092> <8765>
+<2093> <2093> <8763>
+<2098> <2098> <8768>
+<209c> <209c> <876b>
+<209d> <209d> <876e>
+endbfrange
+
+
+endcmap
+CMapName currentdict /CMap defineresource pop
+end
+end
+
+%%EndResource
+%%EOF
diff --git a/src/main/resources/Resources/cmap/Adobe-Japan1-H-Mac b/src/main/resources/Resources/cmap/Adobe-Japan1-H-Mac
new file mode 100644
index 0000000..2d5a817
--- /dev/null
+++ b/src/main/resources/Resources/cmap/Adobe-Japan1-H-Mac
@@ -0,0 +1,249 @@
+%!PS-Adobe-3.0 Resource-CMap
+%%DocumentNeededResources: ProcSet (CIDInit)
+%%IncludeResource: ProcSet (CIDInit)
+%%BeginResource: CMap (Adobe-Japan1-H-Mac)
+%%Title: (Adobe-Japan1-H-Mac Adobe Japan1 2)
+%%Version: 4.002
+%%Copyright: -----------------------------------------------------------
+%%Copyright: Copyright 1990-1996 Adobe Systems Incorporated.
+%%Copyright: All Rights Reserved.
+%%Copyright:
+%%Copyright: Patents Pending
+%%Copyright:
+%%Copyright: NOTICE: All information contained herein is the property
+%%Copyright: of Adobe Systems Incorporated.
+%%Copyright:
+%%Copyright: Permission is granted for redistribution of this file
+%%Copyright: provided this copyright notice is maintained intact and
+%%Copyright: that the contents of this file are not altered in any
+%%Copyright: way from its original form.
+%%Copyright:
+%%Copyright: PostScript and Display PostScript are trademarks of
+%%Copyright: Adobe Systems Incorporated which may be registered in
+%%Copyright: certain jurisdictions.
+%%Copyright: -----------------------------------------------------------
+%%EndComments
+
+/CIDInit /ProcSet findresource begin
+
+12 dict begin
+
+begincmap
+
+/CIDSystemInfo 3 dict dup begin
+/Registry (Adobe) def
+/Ordering (Adobe_Japan1_H_Mac) def
+/Supplement 2 def
+end def
+
+/CMapName /Adobe-Japan1-H-Mac def
+
+/CMapVersion 4.002 def
+/CMapType 1 def
+
+/WMode 0 def
+
+1 begincodespacerange
+<0000> <FFFF>
+endcodespacerange
+
+2 usefont
+1 begincidrange
+<0000> <FFFF> 0
+endcidrange
+
+1 usefont % Prop Roman
+1 beginbfrange
+<0001> <005f> <20> % proportional yen to prop backslash
+endbfrange
+
+0 usefont % System font
+100 beginbfrange
+<0061> <0061> <80>
+<007c> <007c> <ff>
+<0098> <0098> <fd>
+<00e4> <00e4> <fe>
+<0146> <0185> <a0>
+<0279> <02b7> <8140>
+<02b8> <02e4> <8180>
+<02e5> <02ec> <81b8>
+<02ed> <02f3> <81c8>
+<02f4> <02ff> <81da>
+<0300> <0302> <81e6>
+<0303> <030a> <81f0>
+<030b> <030b> <81fc>
+<030c> <0315> <824f>
+<0316> <032f> <8260>
+<0330> <0349> <8281>
+<034a> <039c> <829f>
+<039d> <03db> <8340>
+<03dc> <03f2> <8380>
+<03f3> <03ff> <839f>
+<0400> <040a> <83ac>
+<040b> <0422> <83bf>
+<0423> <0443> <8440>
+<0444> <0452> <8470>
+<0453> <0464> <8480>
+<0465> <04c2> <889f>
+<04c3> <04ff> <8940>
+<0500> <0501> <897d>
+<0502> <057e> <8980>
+<057f> <05bd> <8a40>
+<05be> <05ff> <8a80>
+<0600> <063a> <8ac2>
+<063b> <0679> <8b40>
+<067a> <06f6> <8b80>
+<06f7> <06ff> <8c40>
+<0700> <0735> <8c49>
+<0736> <07b2> <8c80>
+<07b3> <07f1> <8d40>
+<07f2> <07ff> <8d80>
+<0800> <086e> <8d8e>
+<086f> <08ad> <8e40>
+<08ae> <08ff> <8e80>
+<0900> <092a> <8ed2>
+<092b> <0969> <8f40>
+<096a> <09e6> <8f80>
+<09e7> <09ff> <9040>
+<0a00> <0a25> <9059>
+<0a26> <0aa2> <9080>
+<0aa3> <0ae1> <9140>
+<0ae2> <0aff> <9180>
+<0b00> <0b5e> <919e>
+<0b5f> <0b9d> <9240>
+<0b9e> <0bff> <9280>
+<0c00> <0c1a> <92e2>
+<0c1b> <0c59> <9340>
+<0c5a> <0cd6> <9380>
+<0cd7> <0cff> <9440>
+<0d00> <0d15> <9469>
+<0d16> <0d92> <9480>
+<0d93> <0dd1> <9540>
+<0dd2> <0dff> <9580>
+<0e00> <0e4e> <95ae>
+<0e4f> <0e8d> <9640>
+<0e8e> <0eff> <9680>
+<0f00> <0f0a> <96f2>
+<0f0b> <0f49> <9740>
+<0f4a> <0fc6> <9780>
+<0fc7> <0ff9> <9840>
+<0ffa> <0fff> <989f>
+<1000> <1057> <98a5>
+<1058> <1096> <9940>
+<1097> <10ff> <9980>
+<1100> <1113> <99e9>
+<1114> <1152> <9a40>
+<1153> <11cf> <9a80>
+<11d0> <11ff> <9b40>
+<1200> <120e> <9b70>
+<120f> <128b> <9b80>
+<128c> <12ca> <9c40>
+<12cb> <12ff> <9c80>
+<1300> <1347> <9cb5>
+<1348> <1386> <9d40>
+<1387> <13ff> <9d80>
+<1400> <1403> <9df9>
+<1404> <1442> <9e40>
+<1443> <14bf> <9e80>
+<14c0> <14fe> <9f40>
+<14ff> <14ff> <9f80>
+<1500> <157b> <9f81>
+<157c> <15ba> <e040>
+<15bb> <15ff> <e080>
+<1600> <1637> <e0c5>
+<1638> <1676> <e140>
+<1677> <16f3> <e180>
+<16f4> <16ff> <e240>
+<1700> <1732> <e24c>
+<1733> <17af> <e280>
+<17b0> <17ee> <e340>
+<17ef> <17ff> <e380>
+<1800> <186b> <e391>
+endbfrange
+78 beginbfrange
+<186c> <18aa> <e440>
+<18ab> <18ff> <e480>
+<1900> <1927> <e4d5>
+<1928> <1966> <e540>
+<1967> <19e3> <e580>
+<19e4> <19ff> <e640>
+<1a00> <1a22> <e65c>
+<1a23> <1a9f> <e680>
+<1aa0> <1ade> <e740>
+<1adf> <1aff> <e780>
+<1b00> <1b5b> <e7a1>
+<1b5c> <1b9a> <e840>
+<1b9b> <1bff> <e880>
+<1c00> <1c17> <e8e5>
+<1c18> <1c56> <e940>
+<1c57> <1cd3> <e980>
+<1cd4> <1cff> <ea40>
+<1d00> <1d12> <ea6c>
+<1d13> <1d35> <ea80>
+<1d37> <1d37> <849f>
+<1d38> <1d38> <84aa>
+<1d39> <1d39> <84a0>
+<1d3a> <1d3a> <84ab>
+<1d43> <1d43> <84a1>
+<1d46> <1d46> <84ac>
+<1d47> <1d47> <84a2>
+<1d4a> <1d4a> <84ad>
+<1d4b> <1d4b> <84a4>
+<1d4e> <1d4e> <84af>
+<1d4f> <1d4f> <84a3>
+<1d52> <1d52> <84ae>
+<1d53> <1d53> <84a5>
+<1d54> <1d54> <84ba>
+<1d57> <1d57> <84b5>
+<1d5a> <1d5a> <84b0>
+<1d5b> <1d5b> <84a7>
+<1d5c> <1d5c> <84bc>
+<1d5f> <1d5f> <84b7>
+<1d62> <1d62> <84b2>
+<1d63> <1d63> <84a6>
+<1d66> <1d66> <84b6>
+<1d67> <1d67> <84bb>
+<1d6a> <1d6a> <84b1>
+<1d6b> <1d6b> <84a8>
+<1d6e> <1d6e> <84b8>
+<1d6f> <1d6f> <84bd>
+<1d72> <1d72> <84b3>
+<1d73> <1d73> <84a9>
+<1d76> <1d76> <84b9>
+<1d79> <1d79> <84be>
+<1d82> <1d82> <84b4>
+<1ecf> <1ed0> <eb41>
+<1ed1> <1ed2> <eb50>
+<1ed3> <1ed5> <eb5b>
+<1ed6> <1eda> <eb60>
+<1edb> <1eec> <eb69>
+<1eed> <1eed> <eb81>
+<1eee> <1eee> <ec9f>
+<1eef> <1eef> <eca1>
+<1ef0> <1ef0> <eca3>
+<1ef1> <1ef1> <eca5>
+<1ef2> <1ef2> <eca7>
+<1ef3> <1ef3> <ecc1>
+<1ef4> <1ef4> <ece1>
+<1ef5> <1ef5> <ece3>
+<1ef6> <1ef6> <ece5>
+<1ef7> <1ef7> <ecec>
+<1ef8> <1ef8> <ed40>
+<1ef9> <1ef9> <ed42>
+<1efa> <1efa> <ed44>
+<1efb> <1efb> <ed46>
+<1efc> <1efc> <ed48>
+<1efd> <1efd> <ed62>
+<1efe> <1efe> <ed83>
+<1eff> <1eff> <ed85>
+<1f00> <1f00> <ed87>
+<1f01> <1f01> <ed8e>
+<1f02> <1f03> <ed95>
+endbfrange
+endcmap
+CMapName currentdict /CMap defineresource pop
+end
+end
+
+%%EndResource
+%%EOF
diff --git a/src/main/resources/Resources/cmap/Adobe-Japan1-PS-H b/src/main/resources/Resources/cmap/Adobe-Japan1-PS-H
new file mode 100644
index 0000000..556ec1c
--- /dev/null
+++ b/src/main/resources/Resources/cmap/Adobe-Japan1-PS-H
@@ -0,0 +1,1062 @@
+%!PS-Adobe-3.0 Resource-CMap
+%%DocumentNeededResources: ProcSet (CIDInit)
+%%IncludeResource: ProcSet (CIDInit)
+%%BeginResource: CMap (Adobe-Japan1-PS-H)
+%%Title: (Adobe-Japan1-PS-H Adobe Japan1 2)
+%%Version: 7.001
+%%Copyright: -----------------------------------------------------------
+%%Copyright: Copyright 1990-1997 Adobe Systems Incorporated.
+%%Copyright: All Rights Reserved.
+%%Copyright:
+%%Copyright: Patents Pending
+%%Copyright:
+%%Copyright: NOTICE: All information contained herein is the property
+%%Copyright: of Adobe Systems Incorporated.
+%%Copyright:
+%%Copyright: Permission is granted for redistribution of this file
+%%Copyright: provided this copyright notice is maintained intact and
+%%Copyright: that the contents of this file are not altered in any
+%%Copyright: way from its original form.
+%%Copyright:
+%%Copyright: PostScript and Display PostScript are trademarks of
+%%Copyright: Adobe Systems Incorporated which may be registered in
+%%Copyright: certain jurisdictions.
+%%Copyright: -----------------------------------------------------------
+%%EndComments
+
+% This CMap is used for mapping from CIDs to encodings that are available
+% on a Japanese PostScript Printer for horizontal fonts.
+% The ranges in the CMap maps CIDs to following font numbers
+%
+% font 0 - character codes in 83pv-RKSJ-H
+% font 1 - proportional roman ascii codes
+% font 2 - character codes in Ext-RKSJ-H (and not in 83pv-RKSJ-H)
+% font 3 - CIDs that are not in 83pv-RKSJ-H or Ext-RKSJ-H
+%
+
+/CIDInit /ProcSet findresource begin
+
+12 dict begin
+
+begincmap
+
+/CIDSystemInfo 3 dict dup begin
+ /Registry (Adobe) def
+ /Ordering (Adobe_Japan1_PS_H) def
+ /Supplement 2 def
+end def
+
+/CMapName /Adobe-Japan1-PS-H def
+
+/CMapVersion 7.001 def
+/CMapType 1 def
+
+/XUID [1 10 25335 1212] def
+
+/WMode 0 def
+
+1 begincodespacerange
+ <0000> <FFFF>
+endcodespacerange
+
+3 usefont
+
+1 beginbfrange
+<0000> <ffff> <0000>
+endbfrange
+
+0 usefont % Common RKSJ font
+
+% Max CID: 7632 0x1dd0
+% Range Count: 389
+99 beginbfrange
+<0146> <0185> <a0>
+<0186> <0186> <8580>
+<0187> <01a5> <85de>
+<01a6> <01e4> <8640>
+<01e5> <01f6> <8680>
+<01f7> <01ff> <8693>
+<0200> <0202> <869c>
+<0279> <02b7> <8140>
+<02b8> <02c0> <8180>
+<02c2> <02e4> <818a>
+<030c> <0315> <824f>
+<0316> <032f> <8260>
+<0330> <0349> <8281>
+<034a> <039c> <829f>
+<039d> <03db> <8340>
+<03dc> <03f2> <8380>
+<03f3> <03ff> <839f>
+<0400> <040a> <83ac>
+<040b> <0422> <83bf>
+<0423> <0443> <8440>
+<0444> <0452> <8470>
+<0453> <0464> <8480>
+<0465> <0465> <889f>
+<0467> <0476> <88a1>
+<0478> <047e> <88b2>
+<0480> <04b1> <88ba>
+<04b3> <04b6> <88ed>
+<04b8> <04bf> <88f2>
+<04c1> <04c2> <88fb>
+<04c3> <04cb> <8940>
+<04cd> <04d6> <894a>
+<04d8> <04da> <8955>
+<04dc> <04dd> <8959>
+<04e0> <04e3> <895d>
+<04e5> <04ff> <8962>
+<0500> <0501> <897d>
+<0502> <050c> <8980>
+<050e> <0527> <898c>
+<052b> <055f> <89a9>
+<0561> <0579> <89df>
+<057b> <057c> <89f9>
+<057e> <057e> <89fc>
+<057f> <057f> <8a40>
+<0581> <059f> <8a42>
+<05a1> <05a6> <8a62>
+<05a8> <05bd> <8a69>
+<05be> <05c2> <8a80>
+<05c4> <05c8> <8a86>
+<05ca> <05d0> <8a8c>
+<05d2> <05d3> <8a94>
+<05d5> <05d7> <8a97>
+<05d9> <05fd> <8a9b>
+<0600> <0608> <8ac2>
+<060a> <060d> <8acc>
+<060f> <0620> <8ad1>
+<0622> <063a> <8ae4>
+<063b> <0644> <8b40>
+<0646> <0659> <8b4b>
+<065b> <0679> <8b60>
+<067a> <0699> <8b80>
+<069b> <06a1> <8ba1>
+<06a3> <06bd> <8ba9>
+<06bf> <06c6> <8bc5>
+<06c8> <06e4> <8bce>
+<06e6> <06eb> <8bec>
+<06ed> <06f2> <8bf3>
+<06f4> <06f4> <8bfa>
+<06f6> <06f6> <8bfc>
+<06f7> <06f9> <8c40>
+<06fb> <06ff> <8c44>
+<0700> <070c> <8c49>
+<070e> <071a> <8c57>
+<071c> <0723> <8c65>
+<0725> <0727> <8c6e>
+<0729> <072a> <8c72>
+<072c> <0730> <8c75>
+<0732> <0735> <8c7b>
+<0736> <0739> <8c80>
+<073b> <0746> <8c85>
+<0748> <074e> <8c92>
+<0750> <0753> <8c9a>
+<0755> <0767> <8c9f>
+<0769> <0774> <8cb3>
+<0776> <07b2> <8cc0>
+<07b3> <07bc> <8d40>
+<07be> <07c8> <8d4b>
+<07ca> <07d3> <8d57>
+<07d5> <07ed> <8d62>
+<07ef> <07f1> <8d7c>
+<07f2> <07fe> <8d80>
+<0800> <0805> <8d8e>
+<0807> <080a> <8d95>
+<080c> <0842> <8d9a>
+<0844> <0856> <8dd2>
+<0858> <0863> <8de6>
+<0865> <086e> <8df3>
+<086f> <0874> <8e40>
+<0876> <0877> <8e47>
+<0879> <0879> <8e4a>
+endbfrange
+
+100 beginbfrange
+<087b> <0886> <8e4c>
+<0888> <08ad> <8e59>
+<08ae> <08e3> <8e80>
+<08e5> <08f3> <8eb7>
+<08f6> <08ff> <8ec8>
+<0900> <0902> <8ed2>
+<0904> <0908> <8ed6>
+<090b> <092a> <8edd>
+<092b> <0934> <8f40>
+<0936> <093f> <8f4b>
+<0941> <0969> <8f56>
+<096a> <0975> <8f80>
+<0978> <097b> <8f8e>
+<097e> <098c> <8f94>
+<098e> <099a> <8fa4>
+<099c> <09a6> <8fb2>
+<09a8> <09bc> <8fbe>
+<09be> <09c6> <8fd4>
+<09c8> <09cb> <8fde>
+<09cd> <09e6> <8fe3>
+<09e7> <09ef> <9040>
+<09f1> <09ff> <904a>
+<0a00> <0a1e> <9059>
+<0a20> <0a25> <9079>
+<0a27> <0a2e> <9081>
+<0a30> <0a45> <908a>
+<0a47> <0a65> <90a1>
+<0a67> <0a89> <90c1>
+<0a8b> <0a94> <90e5>
+<0a97> <0a9c> <90f1>
+<0a9f> <0aa2> <90f9>
+<0aa3> <0aa8> <9140>
+<0aab> <0aba> <9148>
+<0abc> <0acd> <9159>
+<0acf> <0ad0> <916c>
+<0ad2> <0ae0> <916f>
+<0ae2> <0aea> <9180>
+<0aec> <0aff> <918a>
+<0b00> <0b1c> <919e>
+<0b1e> <0b2c> <91bc>
+<0b2e> <0b3b> <91cc>
+<0b3d> <0b42> <91db>
+<0b44> <0b4e> <91e2>
+<0b50> <0b54> <91ee>
+<0b57> <0b5c> <91f5>
+<0b5e> <0b5e> <91fc>
+<0b5f> <0b64> <9240>
+<0b66> <0b66> <9247>
+<0b69> <0b6a> <924a>
+<0b6d> <0b7a> <924e>
+<0b7c> <0b9d> <925d>
+<0b9e> <0bad> <9280>
+<0baf> <0bb2> <9291>
+<0bb4> <0bb9> <9296>
+<0bbb> <0bd8> <929d>
+<0bda> <0be3> <92bc>
+<0be5> <0be5> <92c7>
+<0be7> <0be8> <92c9>
+<0bea> <0bea> <92cc>
+<0bec> <0bf6> <92ce>
+<0bf8> <0bff> <92da>
+<0c00> <0c1a> <92e2>
+<0c1b> <0c1b> <9340>
+<0c1d> <0c20> <9342>
+<0c22> <0c27> <9347>
+<0c29> <0c2f> <934e>
+<0c31> <0c38> <9356>
+<0c3a> <0c41> <935f>
+<0c43> <0c44> <9368>
+<0c46> <0c4a> <936b>
+<0c4d> <0c50> <9372>
+<0c52> <0c59> <9377>
+<0c5a> <0c5d> <9380>
+<0c5f> <0c67> <9385>
+<0c69> <0c6c> <938f>
+<0c6e> <0c71> <9394>
+<0c73> <0c95> <9399>
+<0c97> <0c99> <93bd>
+<0c9b> <0cab> <93c1>
+<0cae> <0cb2> <93d4>
+<0cb5> <0cb8> <93db>
+<0cba> <0cbd> <93e0>
+<0cc0> <0cc1> <93e6>
+<0cc3> <0ccd> <93e9>
+<0ccf> <0cd6> <93f5>
+<0cd7> <0cde> <9440>
+<0ce0> <0cee> <9449>
+<0cf0> <0cff> <9459>
+<0d00> <0d0c> <9469>
+<0d0e> <0d15> <9477>
+<0d16> <0d1c> <9480>
+<0d20> <0d22> <948a>
+<0d24> <0d37> <948e>
+<0d39> <0d41> <94a3>
+<0d43> <0d43> <94ad>
+<0d45> <0d67> <94af>
+<0d69> <0d75> <94d3>
+<0d77> <0d88> <94e1>
+<0d8a> <0d92> <94f4>
+<0d93> <0d93> <9540>
+endbfrange
+
+100 beginbfrange
+<0d96> <0da0> <9543>
+<0da3> <0da3> <9550>
+<0da5> <0da6> <9552>
+<0da8> <0db1> <9555>
+<0db3> <0dbf> <9560>
+<0dc1> <0dc2> <956e>
+<0dc4> <0dd1> <9571>
+<0dd2> <0dff> <9580>
+<0e00> <0e12> <95ae>
+<0e14> <0e1c> <95c2>
+<0e1e> <0e29> <95cc>
+<0e2b> <0e48> <95d9>
+<0e4a> <0e4e> <95f8>
+<0e4f> <0e4f> <9640>
+<0e51> <0e56> <9642>
+<0e58> <0e78> <9649>
+<0e7a> <0e8d> <966b>
+<0e8e> <0e97> <9680>
+<0e99> <0e9d> <968b>
+<0e9f> <0ea6> <9691>
+<0ea8> <0ed8> <969a>
+<0eda> <0ee4> <96cc>
+<0ee6> <0eea> <96d8>
+<0eec> <0eed> <96de>
+<0eef> <0eff> <96e1>
+<0f00> <0f04> <96f2>
+<0f07> <0f07> <96f9>
+<0f09> <0f09> <96fb>
+<0f0b> <0f1b> <9740>
+<0f1d> <0f39> <9752>
+<0f3b> <0f3d> <9770>
+<0f3f> <0f43> <9774>
+<0f45> <0f49> <977a>
+<0f4a> <0f52> <9780>
+<0f54> <0f92> <978a>
+<0f94> <0fc1> <97ca>
+<0fc4> <0fc6> <97fa>
+<0fc8> <0fd6> <9841>
+<0fd8> <0fdb> <9851>
+<0fdd> <0fde> <9856>
+<0fe0> <0ff9> <9859>
+<0ffa> <0fff> <989f>
+<1000> <102e> <98a5>
+<1030> <1057> <98d5>
+<1058> <1073> <9940>
+<1075> <107d> <995d>
+<107f> <1081> <9967>
+<1083> <1083> <996b>
+<1085> <1096> <996d>
+<1097> <10ff> <9980>
+<1100> <1113> <99e9>
+<1114> <1122> <9a40>
+<1124> <112c> <9a50>
+<112e> <1142> <9a5a>
+<1144> <1150> <9a70>
+<1152> <1152> <9a7e>
+<1153> <115d> <9a80>
+<115f> <1194> <9a8c>
+<1196> <11b4> <9ac3>
+<11b6> <11cf> <9ae3>
+<11d0> <11eb> <9b40>
+<11ed> <11ff> <9b5d>
+<1200> <120e> <9b70>
+<120f> <1211> <9b80>
+<1213> <122e> <9b84>
+<1230> <127e> <9ba1>
+<1280> <128b> <9bf1>
+<128c> <12ca> <9c40>
+<12cb> <12ec> <9c80>
+<12ee> <12ff> <9ca3>
+<1300> <1347> <9cb5>
+<1348> <1386> <9d40>
+<1388> <1392> <9d81>
+<1394> <139e> <9d8d>
+<13a0> <13bd> <9d99>
+<13bf> <13d1> <9db8>
+<13d3> <13ff> <9dcc>
+<1400> <1403> <9df9>
+<1404> <1427> <9e40>
+<1429> <142c> <9e65>
+<142e> <143a> <9e6a>
+<143c> <1442> <9e78>
+<1443> <144d> <9e80>
+<144f> <144f> <9e8c>
+<1451> <1456> <9e8e>
+<1458> <14bf> <9e95>
+<14c0> <14fe> <9f40>
+<14ff> <14ff> <9f80>
+<1500> <1535> <9f81>
+<1537> <154c> <9fb8>
+<154e> <1571> <9fcf>
+<1573> <157b> <9ff4>
+<157c> <15ba> <e040>
+<15bb> <15cd> <e080>
+<15cf> <15de> <e094>
+<15e0> <15ff> <e0a5>
+<1600> <1617> <e0c5>
+<1619> <162e> <e0de>
+<1630> <1637> <e0f5>
+<1638> <1641> <e140>
+endbfrange
+
+89 beginbfrange
+<1643> <1646> <e14b>
+<1649> <1676> <e151>
+<1677> <169f> <e180>
+<16a1> <16dc> <e1aa>
+<16de> <16de> <e1e7>
+<16e0> <16e3> <e1e9>
+<16e5> <16f3> <e1ee>
+<16f4> <16ff> <e240>
+<1700> <171c> <e24c>
+<171e> <1726> <e26a>
+<1728> <1730> <e274>
+<1732> <1732> <e27e>
+<1733> <1769> <e280>
+<176b> <1776> <e2b8>
+<1778> <1794> <e2c5>
+<1796> <179e> <e2e3>
+<17a0> <17af> <e2ed>
+<17b0> <17c7> <e340>
+<17c9> <17c9> <e359>
+<17cb> <17d4> <e35b>
+<17d6> <17ee> <e366>
+<17ef> <17ff> <e380>
+<1800> <1832> <e391>
+<1834> <186b> <e3c5>
+<186c> <18aa> <e440>
+<18ab> <18ae> <e480>
+<18b0> <18b3> <e485>
+<18b5> <18bc> <e48a>
+<18be> <18dc> <e493>
+<18de> <18e3> <e4b3>
+<18e5> <18ff> <e4ba>
+<1900> <191c> <e4d5>
+<191e> <1927> <e4f3>
+<1928> <1928> <e540>
+<192a> <1934> <e542>
+<1936> <1942> <e54e>
+<1944> <1960> <e55c>
+<1962> <1966> <e57a>
+<1967> <1988> <e580>
+<198a> <198b> <e5a3>
+<198d> <19a1> <e5a6>
+<19a3> <19d3> <e5bc>
+<19d5> <19e3> <e5ee>
+<19e4> <19f4> <e640>
+<19f6> <19ff> <e652>
+<1a00> <1a1f> <e65c>
+<1a21> <1a22> <e67d>
+<1a23> <1a28> <e680>
+<1a2a> <1a38> <e687>
+<1a3a> <1a6d> <e697>
+<1a6f> <1a89> <e6cc>
+<1a8b> <1a94> <e6e8>
+<1a96> <1a9f> <e6f3>
+<1aa0> <1acc> <e740>
+<1ace> <1ade> <e76e>
+<1adf> <1aea> <e780>
+<1aec> <1aec> <e78d>
+<1aee> <1aff> <e78f>
+<1b00> <1b05> <e7a1>
+<1b07> <1b19> <e7a8>
+<1b1b> <1b33> <e7bc>
+<1b35> <1b5b> <e7d6>
+<1b5c> <1b9a> <e840>
+<1b9b> <1b9f> <e880>
+<1ba1> <1bcb> <e886>
+<1bcd> <1bdd> <e8b2>
+<1bdf> <1be9> <e8c4>
+<1beb> <1bef> <e8d0>
+<1bf1> <1bff> <e8d6>
+<1c00> <1c0c> <e8e5>
+<1c0f> <1c17> <e8f4>
+<1c18> <1c56> <e940>
+<1c57> <1c81> <e980>
+<1c83> <1c90> <e9ac>
+<1c92> <1ca1> <e9bb>
+<1ca4> <1cc8> <e9cd>
+<1cca> <1cd3> <e9f3>
+<1cd4> <1cff> <ea40>
+<1d00> <1d03> <ea6c>
+<1d05> <1d12> <ea71>
+<1d13> <1d2f> <ea80>
+<1d31> <1d31> <ea9e>
+<1d37> <1d38> <86a2>
+<1d3a> <1d82> <86a5>
+<1d83> <1da0> <8740>
+<1da1> <1db7> <875f>
+<1db8> <1dc7> <8780>
+<1dc8> <1dce> <8793>
+<1dcf> <1dd0> <879b>
+endbfrange
+
+1 usefont
+1 beginbfrange
+<0001> <005f> <20>
+endbfrange
+
+0 usefont
+
+% Max CID: 8285 0x205d
+% Range Count: 317
+95 beginbfrange
+<0145> <0145> <859e>
+<02c1> <02c1> <8189>
+<02e5> <02ec> <81b8>
+<02ed> <02f3> <81c8>
+<02f4> <02ff> <81da>
+<0300> <0302> <81e6>
+<0303> <030a> <81f0>
+<030b> <030b> <81fc>
+<0466> <0466> <88a0>
+<0477> <0477> <88b1>
+<047f> <047f> <88b9>
+<04b2> <04b2> <88ec>
+<04b7> <04b7> <88f1>
+<04c0> <04c0> <88fa>
+<04cc> <04cc> <8949>
+<04d7> <04d7> <8954>
+<04db> <04db> <8958>
+<04de> <04df> <895b>
+<04e4> <04e4> <8961>
+<050d> <050d> <898b>
+<0528> <052a> <89a6>
+<0560> <0560> <89de>
+<057a> <057a> <89f8>
+<057d> <057d> <89fb>
+<0580> <0580> <8a41>
+<05a0> <05a0> <8a61>
+<05a7> <05a7> <8a68>
+<05c3> <05c3> <8a85>
+<05c9> <05c9> <8a8b>
+<05d1> <05d1> <8a93>
+<05d4> <05d4> <8a96>
+<05d8> <05d8> <8a9a>
+<05fe> <05ff> <8ac0>
+<0609> <0609> <8acb>
+<060e> <060e> <8ad0>
+<0621> <0621> <8ae3>
+<0645> <0645> <8b4a>
+<065a> <065a> <8b5f>
+<069a> <069a> <8ba0>
+<06a2> <06a2> <8ba8>
+<06be> <06be> <8bc4>
+<06c7> <06c7> <8bcd>
+<06e5> <06e5> <8beb>
+<06ec> <06ec> <8bf2>
+<06f3> <06f3> <8bf9>
+<06f5> <06f5> <8bfb>
+<06fa> <06fa> <8c43>
+<070d> <070d> <8c56>
+<071b> <071b> <8c64>
+<0724> <0724> <8c6d>
+<0728> <0728> <8c71>
+<072b> <072b> <8c74>
+<0731> <0731> <8c7a>
+<073a> <073a> <8c84>
+<0747> <0747> <8c91>
+<074f> <074f> <8c99>
+<0754> <0754> <8c9e>
+<0768> <0768> <8cb2>
+<0775> <0775> <8cbf>
+<07bd> <07bd> <8d4a>
+<07c9> <07c9> <8d56>
+<07d4> <07d4> <8d61>
+<07ee> <07ee> <8d7b>
+<07ff> <07ff> <8d8d>
+<0806> <0806> <8d94>
+<080b> <080b> <8d99>
+<0843> <0843> <8dd1>
+<0857> <0857> <8de5>
+<0864> <0864> <8df2>
+<0875> <0875> <8e46>
+<0878> <0878> <8e49>
+<087a> <087a> <8e4b>
+<0887> <0887> <8e58>
+<08e4> <08e4> <8eb6>
+<08f4> <08f5> <8ec6>
+<0903> <0903> <8ed5>
+<0909> <090a> <8edb>
+<0935> <0935> <8f4a>
+<0940> <0940> <8f55>
+<0976> <0977> <8f8c>
+<097c> <097d> <8f92>
+<098d> <098d> <8fa3>
+<099b> <099b> <8fb1>
+<09a7> <09a7> <8fbd>
+<09bd> <09bd> <8fd3>
+<09c7> <09c7> <8fdd>
+<09cc> <09cc> <8fe2>
+<09f0> <09f0> <9049>
+<0a1f> <0a1f> <9078>
+<0a26> <0a26> <9080>
+<0a2f> <0a2f> <9089>
+<0a46> <0a46> <90a0>
+<0a66> <0a66> <90c0>
+<0a8a> <0a8a> <90e4>
+<0a95> <0a96> <90ef>
+endbfrange
+
+100 beginbfrange
+<0a9d> <0a9e> <90f7>
+<0aa9> <0aaa> <9146>
+<0abb> <0abb> <9158>
+<0ace> <0ace> <916b>
+<0ad1> <0ad1> <916e>
+<0ae1> <0ae1> <917e>
+<0aeb> <0aeb> <9189>
+<0b1d> <0b1d> <91bb>
+<0b2d> <0b2d> <91cb>
+<0b3c> <0b3c> <91da>
+<0b43> <0b43> <91e1>
+<0b4f> <0b4f> <91ed>
+<0b55> <0b56> <91f3>
+<0b5d> <0b5d> <91fb>
+<0b65> <0b65> <9246>
+<0b67> <0b68> <9248>
+<0b6b> <0b6c> <924c>
+<0b7b> <0b7b> <925c>
+<0bae> <0bae> <9290>
+<0bb3> <0bb3> <9295>
+<0bba> <0bba> <929c>
+<0bd9> <0bd9> <92bb>
+<0be4> <0be4> <92c6>
+<0be6> <0be6> <92c8>
+<0be9> <0be9> <92cb>
+<0beb> <0beb> <92cd>
+<0bf7> <0bf7> <92d9>
+<0c1c> <0c1c> <9341>
+<0c21> <0c21> <9346>
+<0c28> <0c28> <934d>
+<0c30> <0c30> <9355>
+<0c39> <0c39> <935e>
+<0c42> <0c42> <9367>
+<0c45> <0c45> <936a>
+<0c4b> <0c4c> <9370>
+<0c51> <0c51> <9376>
+<0c5e> <0c5e> <9384>
+<0c68> <0c68> <938e>
+<0c6d> <0c6d> <9393>
+<0c72> <0c72> <9398>
+<0c96> <0c96> <93bc>
+<0c9a> <0c9a> <93c0>
+<0cac> <0cad> <93d2>
+<0cb3> <0cb4> <93d9>
+<0cb9> <0cb9> <93df>
+<0cbe> <0cbf> <93e4>
+<0cc2> <0cc2> <93e8>
+<0cce> <0cce> <93f4>
+<0cdf> <0cdf> <9448>
+<0cef> <0cef> <9458>
+<0d0d> <0d0d> <9476>
+<0d1d> <0d1f> <9487>
+<0d23> <0d23> <948d>
+<0d38> <0d38> <94a2>
+<0d42> <0d42> <94ac>
+<0d44> <0d44> <94ae>
+<0d68> <0d68> <94d2>
+<0d76> <0d76> <94e0>
+<0d89> <0d89> <94f3>
+<0d94> <0d95> <9541>
+<0da1> <0da2> <954e>
+<0da4> <0da4> <9551>
+<0da7> <0da7> <9554>
+<0db2> <0db2> <955f>
+<0dc0> <0dc0> <956d>
+<0dc3> <0dc3> <9570>
+<0e13> <0e13> <95c1>
+<0e1d> <0e1d> <95cb>
+<0e2a> <0e2a> <95d8>
+<0e49> <0e49> <95f7>
+<0e50> <0e50> <9641>
+<0e57> <0e57> <9648>
+<0e79> <0e79> <966a>
+<0e98> <0e98> <968a>
+<0e9e> <0e9e> <9690>
+<0ea7> <0ea7> <9699>
+<0ed9> <0ed9> <96cb>
+<0ee5> <0ee5> <96d7>
+<0eeb> <0eeb> <96dd>
+<0eee> <0eee> <96e0>
+<0f05> <0f06> <96f7>
+<0f08> <0f08> <96fa>
+<0f0a> <0f0a> <96fc>
+<0f1c> <0f1c> <9751>
+<0f3a> <0f3a> <976f>
+<0f3e> <0f3e> <9773>
+<0f44> <0f44> <9779>
+<0f53> <0f53> <9789>
+<0f93> <0f93> <97c9>
+<0fc2> <0fc3> <97f8>
+<0fc7> <0fc7> <9840>
+<0fd7> <0fd7> <9850>
+<0fdc> <0fdc> <9855>
+<0fdf> <0fdf> <9858>
+<102f> <102f> <98d4>
+<1074> <1074> <995c>
+<107e> <107e> <9966>
+<1082> <1082> <996a>
+<1084> <1084> <996c>
+<1123> <1123> <9a4f>
+endbfrange
+
+100 beginbfrange
+<112d> <112d> <9a59>
+<1143> <1143> <9a6f>
+<1151> <1151> <9a7d>
+<115e> <115e> <9a8b>
+<1195> <1195> <9ac2>
+<11b5> <11b5> <9ae2>
+<11ec> <11ec> <9b5c>
+<1212> <1212> <9b83>
+<122f> <122f> <9ba0>
+<127f> <127f> <9bf0>
+<12ed> <12ed> <9ca2>
+<1387> <1387> <9d80>
+<1393> <1393> <9d8c>
+<139f> <139f> <9d98>
+<13be> <13be> <9db7>
+<13d2> <13d2> <9dcb>
+<1428> <1428> <9e64>
+<142d> <142d> <9e69>
+<143b> <143b> <9e77>
+<144e> <144e> <9e8b>
+<1450> <1450> <9e8d>
+<1457> <1457> <9e94>
+<1536> <1536> <9fb7>
+<154d> <154d> <9fce>
+<1572> <1572> <9ff3>
+<15ce> <15ce> <e093>
+<15df> <15df> <e0a4>
+<1618> <1618> <e0dd>
+<162f> <162f> <e0f4>
+<1642> <1642> <e14a>
+<1647> <1648> <e14f>
+<16a0> <16a0> <e1a9>
+<16dd> <16dd> <e1e6>
+<16df> <16df> <e1e8>
+<16e4> <16e4> <e1ed>
+<171d> <171d> <e269>
+<1727> <1727> <e273>
+<1731> <1731> <e27d>
+<176a> <176a> <e2b7>
+<1777> <1777> <e2c4>
+<1795> <1795> <e2e2>
+<179f> <179f> <e2ec>
+<17c8> <17c8> <e358>
+<17ca> <17ca> <e35a>
+<17d5> <17d5> <e365>
+<1833> <1833> <e3c4>
+<18af> <18af> <e484>
+<18b4> <18b4> <e489>
+<18bd> <18bd> <e492>
+<18dd> <18dd> <e4b2>
+<18e4> <18e4> <e4b9>
+<191d> <191d> <e4f2>
+<1929> <1929> <e541>
+<1935> <1935> <e54d>
+<1943> <1943> <e55b>
+<1961> <1961> <e579>
+<1989> <1989> <e5a2>
+<198c> <198c> <e5a5>
+<19a2> <19a2> <e5bb>
+<19d4> <19d4> <e5ed>
+<19f5> <19f5> <e651>
+<1a20> <1a20> <e67c>
+<1a29> <1a29> <e686>
+<1a39> <1a39> <e696>
+<1a6e> <1a6e> <e6cb>
+<1a8a> <1a8a> <e6e7>
+<1a95> <1a95> <e6f2>
+<1acd> <1acd> <e76d>
+<1aeb> <1aeb> <e78c>
+<1aed> <1aed> <e78e>
+<1b06> <1b06> <e7a7>
+<1b1a> <1b1a> <e7bb>
+<1b34> <1b34> <e7d5>
+<1ba0> <1ba0> <e885>
+<1bcc> <1bcc> <e8b1>
+<1bde> <1bde> <e8c3>
+<1bea> <1bea> <e8cf>
+<1bf0> <1bf0> <e8d5>
+<1c0d> <1c0e> <e8f2>
+<1c82> <1c82> <e9ab>
+<1c91> <1c91> <e9ba>
+<1ca2> <1ca3> <e9cb>
+<1cc9> <1cc9> <e9f2>
+<1d04> <1d04> <ea70>
+<1d30> <1d30> <ea9d>
+<1d32> <1d35> <ea9f>
+<1d39> <1d39> <84a0>
+<1ecf> <1ed0> <eb41>
+<1ed1> <1ed2> <eb50>
+<1ed3> <1ed5> <eb5b>
+<1ed6> <1eda> <eb60>
+<1edb> <1eec> <eb69>
+<1eed> <1eed> <eb81>
+<1eee> <1eee> <ec9f>
+<1eef> <1eef> <eca1>
+<1ef0> <1ef0> <eca3>
+<1ef1> <1ef1> <eca5>
+<1ef2> <1ef2> <eca7>
+<1ef3> <1ef3> <ecc1>
+<1ef4> <1ef4> <ece1>
+endbfrange
+
+16 beginbfrange
+<1ef5> <1ef5> <ece3>
+<1ef6> <1ef6> <ece5>
+<1ef7> <1ef7> <ecec>
+<1ef8> <1ef8> <ed40>
+<1ef9> <1ef9> <ed42>
+<1efa> <1efa> <ed44>
+<1efb> <1efb> <ed46>
+<1efc> <1efc> <ed48>
+<1efd> <1efd> <ed62>
+<1efe> <1efe> <ed83>
+<1eff> <1eff> <ed85>
+<1f00> <1f00> <ed87>
+<1f01> <1f01> <ed8e>
+<1f02> <1f03> <ed95>
+<1f04> <1f13> <ee5f>
+<1f14> <1f15> <ee80>
+endbfrange
+
+2 usefont
+
+% Max CID: 8717 0x220d
+% Range Count: 264
+98 beginbfrange
+<00e7> <00ff> <20>
+<0100> <0144> <39>
+<1d36> <1d36> <8189>
+<1dd2> <1dd2> <88b9>
+<1dd3> <1dd3> <88ec>
+<1dd4> <1dd4> <88f1>
+<1dd5> <1dd5> <88fa>
+<1dd6> <1dd6> <8949>
+<1dd7> <1dd7> <8954>
+<1dd8> <1dd8> <8958>
+<1dd9> <1dda> <895b>
+<1ddb> <1ddb> <8961>
+<1ddc> <1ddc> <898b>
+<1ddd> <1ddd> <89a6>
+<1dde> <1dde> <89a8>
+<1ddf> <1ddf> <89de>
+<1de0> <1de0> <89f8>
+<1de1> <1de1> <89fb>
+<1de2> <1de2> <8a41>
+<1de3> <1de3> <8a85>
+<1de4> <1de4> <8a8b>
+<1de5> <1de5> <8a93>
+<1de6> <1de6> <8a9a>
+<1de7> <1de7> <8ac0>
+<1de8> <1de8> <8acb>
+<1de9> <1de9> <8ae3>
+<1dea> <1dea> <8b4a>
+<1deb> <1deb> <8b5f>
+<1dec> <1dec> <8ba0>
+<1ded> <1ded> <8ba8>
+<1dee> <1dee> <8bcd>
+<1def> <1def> <8beb>
+<1df0> <1df0> <8bf2>
+<1df1> <1df1> <8bf9>
+<1df2> <1df2> <8bfb>
+<1df3> <1df3> <8c43>
+<1df4> <1df4> <8c56>
+<1df5> <1df5> <8c64>
+<1df6> <1df6> <8c6d>
+<1df7> <1df7> <8c71>
+<1df8> <1df8> <8c74>
+<1df9> <1df9> <8c84>
+<1dfa> <1dfa> <8c91>
+<1dfb> <1dfb> <8c99>
+<1dfc> <1dfc> <8c9e>
+<1dfd> <1dfd> <8cb2>
+<1dfe> <1dfe> <8cbf>
+<1dff> <1dff> <8d4a>
+<1e00> <1e00> <8d56>
+<1e01> <1e01> <8d61>
+<1e02> <1e02> <8d8d>
+<1e03> <1e03> <8d94>
+<1e04> <1e04> <8d99>
+<1e05> <1e05> <8dd1>
+<1e06> <1e06> <8de5>
+<1e07> <1e07> <8df2>
+<1e08> <1e08> <8e46>
+<1e09> <1e09> <8e49>
+<1e0a> <1e0a> <8e4b>
+<1e0b> <1e0b> <8e58>
+<1e0c> <1e0c> <8eb6>
+<1e0d> <1e0d> <8ec6>
+<1e0e> <1e0e> <8ed5>
+<1e0f> <1e10> <8edb>
+<1e11> <1e11> <8f4a>
+<1e12> <1e12> <8f55>
+<1e13> <1e14> <8f8c>
+<1e15> <1e16> <8f92>
+<1e17> <1e17> <8fa3>
+<1e18> <1e18> <8fb1>
+<1e19> <1e19> <8fbd>
+<1e1a> <1e1a> <8fd3>
+<1e1b> <1e1b> <8fdd>
+<1e1c> <1e1c> <8fe2>
+<1e1d> <1e1d> <9049>
+<1e1e> <1e1e> <9078>
+<1e1f> <1e1f> <9080>
+<1e20> <1e20> <9089>
+<1e21> <1e21> <90a0>
+<1e22> <1e22> <90c0>
+<1e23> <1e23> <90e4>
+<1e24> <1e25> <90ef>
+<1e26> <1e27> <90f7>
+<1e28> <1e28> <9146>
+<1e29> <1e29> <9158>
+<1e2a> <1e2a> <916b>
+<1e2b> <1e2b> <916e>
+<1e2c> <1e2c> <917e>
+<1e2d> <1e2d> <9189>
+<1e2e> <1e2e> <91bb>
+<1e2f> <1e2f> <91cb>
+<1e30> <1e30> <91da>
+<1e31> <1e31> <91e1>
+<1e32> <1e32> <91ed>
+<1e33> <1e34> <91f3>
+<1e35> <1e35> <91fb>
+<1e36> <1e36> <9246>
+<1e37> <1e38> <9248>
+endbfrange
+
+100 beginbfrange
+<1e39> <1e3a> <924c>
+<1e3b> <1e3b> <925c>
+<1e3c> <1e3c> <9290>
+<1e3d> <1e3d> <9295>
+<1e3e> <1e3e> <929c>
+<1e3f> <1e3f> <92bb>
+<1e40> <1e40> <92c6>
+<1e41> <1e41> <92c8>
+<1e42> <1e42> <92cb>
+<1e43> <1e43> <92cd>
+<1e44> <1e44> <9341>
+<1e45> <1e45> <9346>
+<1e46> <1e46> <934d>
+<1e47> <1e47> <9355>
+<1e48> <1e48> <935e>
+<1e49> <1e49> <9367>
+<1e4a> <1e4a> <936a>
+<1e4b> <1e4c> <9370>
+<1e4d> <1e4d> <9384>
+<1e4e> <1e4e> <9398>
+<1e4f> <1e4f> <93bc>
+<1e50> <1e50> <93c0>
+<1e51> <1e52> <93d2>
+<1e53> <1e54> <93d9>
+<1e55> <1e55> <93df>
+<1e56> <1e57> <93e4>
+<1e58> <1e58> <93e8>
+<1e59> <1e59> <9448>
+<1e5a> <1e5a> <9458>
+<1e5b> <1e5b> <9476>
+<1e5c> <1e5c> <9487>
+<1e5d> <1e5d> <9489>
+<1e5e> <1e5e> <948d>
+<1e5f> <1e5f> <94a2>
+<1e60> <1e60> <94ac>
+<1e61> <1e61> <94ae>
+<1e62> <1e62> <94d2>
+<1e63> <1e63> <94e0>
+<1e64> <1e64> <94f3>
+<1e65> <1e66> <9541>
+<1e67> <1e67> <954e>
+<1e68> <1e68> <9551>
+<1e69> <1e69> <9554>
+<1e6a> <1e6a> <955f>
+<1e6b> <1e6b> <956d>
+<1e6c> <1e6c> <9570>
+<1e6d> <1e6d> <95c1>
+<1e6e> <1e6e> <95cb>
+<1e6f> <1e6f> <95d8>
+<1e70> <1e70> <95f7>
+<1e71> <1e71> <9641>
+<1e72> <1e72> <9648>
+<1e73> <1e73> <966a>
+<1e74> <1e74> <9690>
+<1e75> <1e75> <96cb>
+<1e76> <1e76> <96d7>
+<1e77> <1e77> <96dd>
+<1e78> <1e78> <96e0>
+<1e79> <1e79> <96f8>
+<1e7a> <1e7a> <96fa>
+<1e7b> <1e7b> <96fc>
+<1e7c> <1e7c> <9751>
+<1e7d> <1e7d> <976f>
+<1e7e> <1e7e> <9773>
+<1e7f> <1e7f> <9789>
+<1e80> <1e80> <97c9>
+<1e81> <1e82> <97f8>
+<1e83> <1e83> <9840>
+<1e84> <1e84> <9850>
+<1e85> <1e85> <9858>
+<1e86> <1e86> <995c>
+<1e87> <1e87> <9966>
+<1e88> <1e88> <996a>
+<1e89> <1e89> <996c>
+<1e8a> <1e8a> <9a4f>
+<1e8b> <1e8b> <9a59>
+<1e8c> <1e8c> <9a6f>
+<1e8d> <1e8d> <9a7d>
+<1e8e> <1e8e> <9a8b>
+<1e8f> <1e8f> <9ac2>
+<1e90> <1e90> <9b5c>
+<1e91> <1e91> <9b83>
+<1e92> <1e92> <9ba0>
+<1e93> <1e93> <9bf0>
+<1e94> <1e94> <9ca2>
+<1e95> <1e95> <9d80>
+<1e96> <1e96> <9d8c>
+<1e97> <1e97> <9db7>
+<1e98> <1e98> <9dcb>
+<1e99> <1e99> <9e64>
+<1e9a> <1e9a> <9e69>
+<1e9b> <1e9b> <9e8b>
+<1e9c> <1e9c> <9e94>
+<1e9d> <1e9d> <9fce>
+<1e9e> <1e9e> <e093>
+<1e9f> <1e9f> <e0a4>
+<1ea0> <1ea0> <e0dd>
+<1ea1> <1ea1> <e14a>
+<1ea2> <1ea3> <e14f>
+<1ea4> <1ea4> <e1a9>
+endbfrange
+
+42 beginbfrange
+<1ea5> <1ea5> <e1ed>
+<1ea6> <1ea6> <e269>
+<1ea7> <1ea7> <e273>
+<1ea8> <1ea8> <e2b7>
+<1ea9> <1ea9> <e2e2>
+<1eaa> <1eaa> <e2ec>
+<1eab> <1eab> <e358>
+<1eac> <1eac> <e35a>
+<1ead> <1ead> <e365>
+<1eae> <1eae> <e3c4>
+<1eaf> <1eaf> <e484>
+<1eb0> <1eb0> <e489>
+<1eb1> <1eb1> <e492>
+<1eb2> <1eb2> <e4b2>
+<1eb3> <1eb3> <e4b9>
+<1eb4> <1eb4> <e4f2>
+<1eb5> <1eb5> <e55b>
+<1eb6> <1eb6> <e5a5>
+<1eb7> <1eb7> <e5bb>
+<1eb8> <1eb8> <e5ed>
+<1eb9> <1eb9> <e651>
+<1eba> <1eba> <e686>
+<1ebb> <1ebb> <e696>
+<1ebc> <1ebc> <e6e7>
+<1ebd> <1ebd> <e6f2>
+<1ebe> <1ebe> <e76d>
+<1ebf> <1ebf> <e78c>
+<1ec0> <1ec0> <e78e>
+<1ec1> <1ec1> <e7a7>
+<1ec2> <1ec2> <e7bb>
+<1ec3> <1ec3> <e7d5>
+<1ec4> <1ec4> <e885>
+<1ec5> <1ec5> <e8b1>
+<1ec6> <1ec6> <e8c3>
+<1ec7> <1ec7> <e8cf>
+<1ec8> <1ec8> <e8d5>
+<1ec9> <1ec9> <e8f3>
+<1eca> <1eca> <e9ab>
+<1ecb> <1ecb> <e9ba>
+<1ecc> <1ecc> <e9cc>
+<1ecd> <1ecd> <ea70>
+<1ece> <1ece> <ea9d>
+endbfrange
+endcmap
+CMapName currentdict /CMap defineresource pop
+end
+end
+
+%%EndResource
+%%EOF
diff --git a/src/main/resources/Resources/cmap/Adobe-Japan1-PS-V b/src/main/resources/Resources/cmap/Adobe-Japan1-PS-V
new file mode 100644
index 0000000..edc6d27
--- /dev/null
+++ b/src/main/resources/Resources/cmap/Adobe-Japan1-PS-V
@@ -0,0 +1,606 @@
+%!PS-Adobe-3.0 Resource-CMap
+%%DocumentNeededResources: ProcSet (CIDInit)
+%%IncludeResource: ProcSet (CIDInit)
+%%BeginResource: CMap (Adobe-Japan1-PS-V)
+%%Title: (Adobe-Japan1-PS-V Adobe Japan1 2)
+%%Version: 7.001
+%%Copyright: -----------------------------------------------------------
+%%Copyright: Copyright 1990-1997 Adobe Systems Incorporated.
+%%Copyright: All Rights Reserved.
+%%Copyright:
+%%Copyright: Patents Pending
+%%Copyright:
+%%Copyright: NOTICE: All information contained herein is the property
+%%Copyright: of Adobe Systems Incorporated.
+%%Copyright:
+%%Copyright: Permission is granted for redistribution of this file
+%%Copyright: provided this copyright notice is maintained intact and
+%%Copyright: that the contents of this file are not altered in any
+%%Copyright: way from its original form.
+%%Copyright:
+%%Copyright: PostScript and Display PostScript are trademarks of
+%%Copyright: Adobe Systems Incorporated which may be registered in
+%%Copyright: certain jurisdictions.
+%%Copyright: -----------------------------------------------------------
+%%EndComments
+
+% This CMap is used for mapping from CIDs to encodings that are available
+% on a Japanese PostScript Printer for vertical fonts.
+% The ranges in the CMap maps CIDs to following font numbers
+%
+% font 0 - character codes in RKSJ-V
+% font 1 - proportional roman ascii codes *****
+% font 2 - character codes in Ext-RKSJ-V only (not in RKSJ-V)
+% font 3 - CIDs that are not in RKSJ-V or Ext-RKSJ-V
+% font 4 - CIDs that horizontal glyphs in RSKJ-V
+
+/CIDInit /ProcSet findresource begin
+
+12 dict begin
+
+begincmap
+
+/CIDSystemInfo 3 dict dup begin
+ /Registry (Adobe) def
+ /Ordering (Adobe_Japan1_PS_V) def
+ /Supplement 2 def
+end def
+
+/CMapName /Adobe-Japan1-PS-V def
+
+/CMapVersion 7.001 def
+/CMapType 1 def
+
+/XUID [1 10 25335 1212] def
+
+/WMode 0 def
+
+1 begincodespacerange
+ <0000> <FFFF>
+endcodespacerange
+
+3 usefont % Subset font
+%Use Identity mapping
+1 beginbfrange
+<0000> <ffff> <0000>
+endbfrange
+
+0 usefont % RKSJ-V
+101 beginbfrange
+<0000> <0000> <8140>
+<00E7> <00FF> <20>
+<0100> <0145> <39>
+<0146> <0185> <A0>
+<0279> <0279> <8140>
+<027C> <0288> <8143>
+<028B> <0293> <8152>
+<0297> <0298> <815E>
+<029E> <02A1> <8165>
+<02B4> <02B7> <817B>
+<02B8> <02B8> <8180>
+<02BA> <02E4> <8182>
+<02E5> <02EC> <81B8>
+<02ED> <02F3> <81C8>
+<02F4> <02FF> <81DA>
+<0300> <0302> <81E6>
+<0303> <030A> <81F0>
+<030B> <030B> <81FC>
+<030C> <0315> <824F>
+<0316> <032F> <8260>
+<0330> <0349> <8281>
+<034B> <034B> <82A0>
+<034D> <034D> <82A2>
+<034F> <034F> <82A4>
+<0351> <0351> <82A6>
+<0353> <036B> <82A8>
+<036D> <038B> <82C2>
+<038D> <038D> <82E2>
+<038F> <038F> <82E4>
+<0391> <0396> <82E6>
+<0398> <039C> <82ED>
+<039E> <039E> <8341>
+<03A0> <03A0> <8343>
+<03A2> <03A2> <8345>
+<03A4> <03A4> <8347>
+<03A6> <03BE> <8349>
+<03C0> <03DB> <8363>
+<03DC> <03DE> <8380>
+<03E0> <03E0> <8384>
+<03E2> <03E2> <8386>
+<03E4> <03E9> <8388>
+<03EB> <03F0> <838F>
+<03F3> <03FF> <839F>
+<0400> <040A> <83AC>
+<040B> <0422> <83BF>
+<0423> <0443> <8440>
+<0444> <0452> <8470>
+<0453> <0464> <8480>
+<0465> <04C2> <889F>
+<04C3> <04FF> <8940>
+<0500> <0501> <897D>
+<0502> <057E> <8980>
+<057F> <05BD> <8A40>
+<05BE> <05FF> <8A80>
+<0600> <063A> <8AC2>
+<063B> <0679> <8B40>
+<067A> <06F6> <8B80>
+<06F7> <06FF> <8C40>
+<0700> <0735> <8C49>
+<0736> <07B2> <8C80>
+<07B3> <07F1> <8D40>
+<07F2> <07FF> <8D80>
+<0800> <086E> <8D8E>
+<086F> <08AD> <8E40>
+<08AE> <08FF> <8E80>
+<0900> <092A> <8ED2>
+<092B> <0969> <8F40>
+<096A> <09E6> <8F80>
+<09E7> <09FF> <9040>
+<0A00> <0A25> <9059>
+<0A26> <0AA2> <9080>
+<0AA3> <0AE1> <9140>
+<0AE2> <0AFF> <9180>
+<0B00> <0B5E> <919E>
+<0B5F> <0B9D> <9240>
+<0B9E> <0BFF> <9280>
+<0C00> <0C1A> <92E2>
+<0C1B> <0C59> <9340>
+<0C5A> <0CD6> <9380>
+<0CD7> <0CFF> <9440>
+<0D00> <0D15> <9469>
+<0D16> <0D92> <9480>
+<0D93> <0DD1> <9540>
+<0DD2> <0DFF> <9580>
+<0E00> <0E4E> <95AE>
+<0E4F> <0E8D> <9640>
+<0E8E> <0EFF> <9680>
+<0F00> <0F0A> <96F2>
+<0F0B> <0F49> <9740>
+<0F4A> <0FC6> <9780>
+<0FC7> <0FF9> <9840>
+<0FFA> <0FFF> <989F>
+<1000> <1057> <98A5>
+<1058> <1096> <9940>
+<1097> <10FF> <9980>
+<1100> <1113> <99E9>
+<1114> <1152> <9A40>
+<1153> <11CF> <9A80>
+<11D0> <11FF> <9B40>
+<1200> <120E> <9B70>
+<120F> <128B> <9B80>
+endbfrange
+100 beginbfrange
+<128C> <12CA> <9C40>
+<12CB> <12FF> <9C80>
+<1300> <1347> <9CB5>
+<1348> <1386> <9D40>
+<1387> <13FF> <9D80>
+<1400> <1403> <9DF9>
+<1404> <1442> <9E40>
+<1443> <14BF> <9E80>
+<14C0> <14FE> <9F40>
+<14FF> <14FF> <9F80>
+<1500> <157B> <9F81>
+<157C> <15BA> <E040>
+<15BB> <15FF> <E080>
+<1600> <1637> <E0C5>
+<1638> <1676> <E140>
+<1677> <16F3> <E180>
+<16F4> <16FF> <E240>
+<1700> <1732> <E24C>
+<1733> <17AF> <E280>
+<17B0> <17EE> <E340>
+<17EF> <17FF> <E380>
+<1800> <186B> <E391>
+<186C> <18AA> <E440>
+<18AB> <18FF> <E480>
+<1900> <1927> <E4D5>
+<1928> <1966> <E540>
+<1967> <19E3> <E580>
+<19E4> <19FF> <E640>
+<1A00> <1A22> <E65C>
+<1A23> <1A9F> <E680>
+<1AA0> <1ADE> <E740>
+<1ADF> <1AFF> <E780>
+<1B00> <1B5B> <E7A1>
+<1B5C> <1B9A> <E840>
+<1B9B> <1BFF> <E880>
+<1C00> <1C17> <E8E5>
+<1C18> <1C56> <E940>
+<1C57> <1CD3> <E980>
+<1CD4> <1CFF> <EA40>
+<1D00> <1D12> <EA6C>
+<1D13> <1D35> <EA80>
+<1D37> <1D37> <849F>
+<1D38> <1D38> <84AA>
+<1D39> <1D39> <84A0>
+<1D3A> <1D3A> <84AB>
+<1D43> <1D43> <84A1>
+<1D46> <1D46> <84AC>
+<1D47> <1D47> <84A2>
+<1D4A> <1D4A> <84AD>
+<1D4B> <1D4B> <84A4>
+<1D4E> <1D4E> <84AF>
+<1D4F> <1D4F> <84A3>
+<1D52> <1D52> <84AE>
+<1D53> <1D53> <84A5>
+<1D54> <1D54> <84BA>
+<1D57> <1D57> <84B5>
+<1D5A> <1D5A> <84B0>
+<1D5B> <1D5B> <84A7>
+<1D5C> <1D5C> <84BC>
+<1D5F> <1D5F> <84B7>
+<1D62> <1D62> <84B2>
+<1D63> <1D63> <84A6>
+<1D66> <1D66> <84B6>
+<1D67> <1D67> <84BB>
+<1D6A> <1D6A> <84B1>
+<1D6B> <1D6B> <84A8>
+<1D6E> <1D6E> <84B8>
+<1D6F> <1D6F> <84BD>
+<1D72> <1D72> <84B3>
+<1D73> <1D73> <84A9>
+<1D76> <1D76> <84B9>
+<1D79> <1D79> <84BE>
+<1D82> <1D82> <84B4>
+<1ECF> <1ED0> <8141>
+<1ED1> <1ED2> <8150>
+<1ED3> <1ED5> <815B>
+<1ED6> <1EDA> <8160>
+<1EDB> <1EEC> <8169>
+<1EED> <1EED> <8181>
+<1EEE> <1EEE> <829F>
+<1EEF> <1EEF> <82A1>
+<1EF0> <1EF0> <82A3>
+<1EF1> <1EF1> <82A5>
+<1EF2> <1EF2> <82A7>
+<1EF3> <1EF3> <82C1>
+<1EF4> <1EF4> <82E1>
+<1EF5> <1EF5> <82E3>
+<1EF6> <1EF6> <82E5>
+<1EF7> <1EF7> <82EC>
+<1EF8> <1EF8> <8340>
+<1EF9> <1EF9> <8342>
+<1EFA> <1EFA> <8344>
+<1EFB> <1EFB> <8346>
+<1EFC> <1EFC> <8348>
+<1EFD> <1EFD> <8362>
+<1EFE> <1EFE> <8383>
+<1EFF> <1EFF> <8385>
+<1F00> <1F00> <8387>
+<1F01> <1F01> <838E>
+<1F02> <1F03> <8395>
+endbfrange
+
+1 usefont % proportional roman
+1 beginbfrange
+<0001> <005f> <20>
+endbfrange
+
+2 usefont % Ext-RKSJ-V Only
+
+100 beginbfrange
+<0186> <0186> <8580>
+<0187> <01A5> <85DE>
+<01A6> <01E4> <8640>
+<01E5> <01F6> <8680>
+<01F7> <01FF> <8693>
+<0200> <0202> <869C>
+<1D36> <1D36> <8189>
+<1D3B> <1D42> <86A6>
+<1D44> <1D45> <86AF>
+<1D48> <1D49> <86B3>
+<1D4C> <1D4D> <86B7>
+<1D50> <1D51> <86BB>
+<1D55> <1D56> <86C0>
+<1D58> <1D59> <86C3>
+<1D5D> <1D5E> <86C8>
+<1D60> <1D61> <86CB>
+<1D64> <1D65> <86CF>
+<1D68> <1D69> <86D3>
+<1D6C> <1D6D> <86D7>
+<1D70> <1D71> <86DB>
+<1D74> <1D75> <86DF>
+<1D77> <1D78> <86E2>
+<1D7A> <1D81> <86E5>
+<1D83> <1DA0> <8740>
+<1DB1> <1DB7> <876F>
+<1DBA> <1DC7> <8782>
+<1DC8> <1DCE> <8793>
+<1DCF> <1DD0> <879B>
+<1DD1> <1DD1> <88A0>
+<1DD2> <1DD2> <88B9>
+<1DD3> <1DD3> <88EC>
+<1DD4> <1DD4> <88F1>
+<1DD5> <1DD5> <88FA>
+<1DD6> <1DD6> <8949>
+<1DD7> <1DD7> <8954>
+<1DD8> <1DD8> <8958>
+<1DD9> <1DDA> <895B>
+<1DDB> <1DDB> <8961>
+<1DDC> <1DDC> <898B>
+<1DDD> <1DDD> <89A6>
+<1DDE> <1DDE> <89A8>
+<1DDF> <1DDF> <89DE>
+<1DE0> <1DE0> <89F8>
+<1DE1> <1DE1> <89FB>
+<1DE2> <1DE2> <8A41>
+<1DE3> <1DE3> <8A85>
+<1DE4> <1DE4> <8A8B>
+<1DE5> <1DE5> <8A93>
+<1DE6> <1DE6> <8A9A>
+<1DE7> <1DE7> <8AC0>
+<1DE8> <1DE8> <8ACB>
+<1DE9> <1DE9> <8AE3>
+<1DEA> <1DEA> <8B4A>
+<1DEB> <1DEB> <8B5F>
+<1DEC> <1DEC> <8BA0>
+<1DED> <1DED> <8BA8>
+<1DEE> <1DEE> <8BCD>
+<1DEF> <1DEF> <8BEB>
+<1DF0> <1DF0> <8BF2>
+<1DF1> <1DF1> <8BF9>
+<1DF2> <1DF2> <8BFB>
+<1DF3> <1DF3> <8C43>
+<1DF4> <1DF4> <8C56>
+<1DF5> <1DF5> <8C64>
+<1DF6> <1DF6> <8C6D>
+<1DF7> <1DF7> <8C71>
+<1DF8> <1DF8> <8C74>
+<1DF9> <1DF9> <8C84>
+<1DFA> <1DFA> <8C91>
+<1DFB> <1DFB> <8C99>
+<1DFC> <1DFC> <8C9E>
+<1DFD> <1DFD> <8CB2>
+<1DFE> <1DFE> <8CBF>
+<1DFF> <1DFF> <8D4A>
+<1E00> <1E00> <8D56>
+<1E01> <1E01> <8D61>
+<1E02> <1E02> <8D8D>
+<1E03> <1E03> <8D94>
+<1E04> <1E04> <8D99>
+<1E05> <1E05> <8DD1>
+<1E06> <1E06> <8DE5>
+<1E07> <1E07> <8DF2>
+<1E08> <1E08> <8E46>
+<1E09> <1E09> <8E49>
+<1E0A> <1E0A> <8E4B>
+<1E0B> <1E0B> <8E58>
+<1E0C> <1E0C> <8EB6>
+<1E0D> <1E0D> <8EC6>
+<1E0E> <1E0E> <8ED5>
+<1E0F> <1E10> <8EDB>
+<1E11> <1E11> <8F4A>
+<1E12> <1E12> <8F55>
+<1E13> <1E14> <8F8C>
+<1E15> <1E16> <8F92>
+<1E17> <1E17> <8FA3>
+<1E18> <1E18> <8FB1>
+<1E19> <1E19> <8FBD>
+<1E1A> <1E1A> <8FD3>
+<1E1B> <1E1B> <8FDD>
+<1E1C> <1E1C> <8FE2>
+endbfrange
+100 beginbfrange
+<1E1D> <1E1D> <9049>
+<1E1E> <1E1E> <9078>
+<1E1F> <1E1F> <9080>
+<1E20> <1E20> <9089>
+<1E21> <1E21> <90A0>
+<1E22> <1E22> <90C0>
+<1E23> <1E23> <90E4>
+<1E24> <1E25> <90EF>
+<1E26> <1E27> <90F7>
+<1E28> <1E28> <9146>
+<1E29> <1E29> <9158>
+<1E2A> <1E2A> <916B>
+<1E2B> <1E2B> <916E>
+<1E2C> <1E2C> <917E>
+<1E2D> <1E2D> <9189>
+<1E2E> <1E2E> <91BB>
+<1E2F> <1E2F> <91CB>
+<1E30> <1E30> <91DA>
+<1E31> <1E31> <91E1>
+<1E32> <1E32> <91ED>
+<1E33> <1E34> <91F3>
+<1E35> <1E35> <91FB>
+<1E36> <1E36> <9246>
+<1E37> <1E38> <9248>
+<1E39> <1E3A> <924C>
+<1E3B> <1E3B> <925C>
+<1E3C> <1E3C> <9290>
+<1E3D> <1E3D> <9295>
+<1E3E> <1E3E> <929C>
+<1E3F> <1E3F> <92BB>
+<1E40> <1E40> <92C6>
+<1E41> <1E41> <92C8>
+<1E42> <1E42> <92CB>
+<1E43> <1E43> <92CD>
+<1E44> <1E44> <9341>
+<1E45> <1E45> <9346>
+<1E46> <1E46> <934D>
+<1E47> <1E47> <9355>
+<1E48> <1E48> <935E>
+<1E49> <1E49> <9367>
+<1E4A> <1E4A> <936A>
+<1E4B> <1E4C> <9370>
+<1E4D> <1E4D> <9384>
+<1E4E> <1E4E> <9398>
+<1E4F> <1E4F> <93BC>
+<1E50> <1E50> <93C0>
+<1E51> <1E52> <93D2>
+<1E53> <1E54> <93D9>
+<1E55> <1E55> <93DF>
+<1E56> <1E57> <93E4>
+<1E58> <1E58> <93E8>
+<1E59> <1E59> <9448>
+<1E5A> <1E5A> <9458>
+<1E5B> <1E5B> <9476>
+<1E5C> <1E5C> <9487>
+<1E5D> <1E5D> <9489>
+<1E5E> <1E5E> <948D>
+<1E5F> <1E5F> <94A2>
+<1E60> <1E60> <94AC>
+<1E61> <1E61> <94AE>
+<1E62> <1E62> <94D2>
+<1E63> <1E63> <94E0>
+<1E64> <1E64> <94F3>
+<1E65> <1E66> <9541>
+<1E67> <1E67> <954E>
+<1E68> <1E68> <9551>
+<1E69> <1E69> <9554>
+<1E6A> <1E6A> <955F>
+<1E6B> <1E6B> <956D>
+<1E6C> <1E6C> <9570>
+<1E6D> <1E6D> <95C1>
+<1E6E> <1E6E> <95CB>
+<1E6F> <1E6F> <95D8>
+<1E70> <1E70> <95F7>
+<1E71> <1E71> <9641>
+<1E72> <1E72> <9648>
+<1E73> <1E73> <966A>
+<1E74> <1E74> <9690>
+<1E75> <1E75> <96CB>
+<1E76> <1E76> <96D7>
+<1E77> <1E77> <96DD>
+<1E78> <1E78> <96E0>
+<1E79> <1E79> <96F8>
+<1E7A> <1E7A> <96FA>
+<1E7B> <1E7B> <96FC>
+<1E7C> <1E7C> <9751>
+<1E7D> <1E7D> <976F>
+<1E7E> <1E7E> <9773>
+<1E7F> <1E7F> <9789>
+<1E80> <1E80> <97C9>
+<1E81> <1E82> <97F8>
+<1E83> <1E83> <9840>
+<1E84> <1E84> <9850>
+<1E85> <1E85> <9858>
+<1E86> <1E86> <995C>
+<1E87> <1E87> <9966>
+<1E88> <1E88> <996A>
+<1E89> <1E89> <996C>
+<1E8A> <1E8A> <9A4F>
+<1E8B> <1E8B> <9A59>
+endbfrange
+80 beginbfrange
+<1E8C> <1E8C> <9A6F>
+<1E8D> <1E8D> <9A7D>
+<1E8E> <1E8E> <9A8B>
+<1E8F> <1E8F> <9AC2>
+<1E90> <1E90> <9B5C>
+<1E91> <1E91> <9B83>
+<1E92> <1E92> <9BA0>
+<1E93> <1E93> <9BF0>
+<1E94> <1E94> <9CA2>
+<1E95> <1E95> <9D80>
+<1E96> <1E96> <9D8C>
+<1E97> <1E97> <9DB7>
+<1E98> <1E98> <9DCB>
+<1E99> <1E99> <9E64>
+<1E9A> <1E9A> <9E69>
+<1E9B> <1E9B> <9E8B>
+<1E9C> <1E9C> <9E94>
+<1E9D> <1E9D> <9FCE>
+<1E9E> <1E9E> <E093>
+<1E9F> <1E9F> <E0A4>
+<1EA0> <1EA0> <E0DD>
+<1EA1> <1EA1> <E14A>
+<1EA2> <1EA3> <E14F>
+<1EA4> <1EA4> <E1A9>
+<1EA5> <1EA5> <E1ED>
+<1EA6> <1EA6> <E269>
+<1EA7> <1EA7> <E273>
+<1EA8> <1EA8> <E2B7>
+<1EA9> <1EA9> <E2E2>
+<1EAA> <1EAA> <E2EC>
+<1EAB> <1EAB> <E358>
+<1EAC> <1EAC> <E35A>
+<1EAD> <1EAD> <E365>
+<1EAE> <1EAE> <E3C4>
+<1EAF> <1EAF> <E484>
+<1EB0> <1EB0> <E489>
+<1EB1> <1EB1> <E492>
+<1EB2> <1EB2> <E4B2>
+<1EB3> <1EB3> <E4B9>
+<1EB4> <1EB4> <E4F2>
+<1EB5> <1EB5> <E55B>
+<1EB6> <1EB6> <E5A5>
+<1EB7> <1EB7> <E5BB>
+<1EB8> <1EB8> <E5ED>
+<1EB9> <1EB9> <E651>
+<1EBA> <1EBA> <E686>
+<1EBB> <1EBB> <E696>
+<1EBC> <1EBC> <E6E7>
+<1EBD> <1EBD> <E6F2>
+<1EBE> <1EBE> <E76D>
+<1EBF> <1EBF> <E78C>
+<1EC0> <1EC0> <E78E>
+<1EC1> <1EC1> <E7A7>
+<1EC2> <1EC2> <E7BB>
+<1EC3> <1EC3> <E7D5>
+<1EC4> <1EC4> <E885>
+<1EC5> <1EC5> <E8B1>
+<1EC6> <1EC6> <E8C3>
+<1EC7> <1EC7> <E8CF>
+<1EC8> <1EC8> <E8D5>
+<1EC9> <1EC9> <E8F3>
+<1ECA> <1ECA> <E9AB>
+<1ECB> <1ECB> <E9BA>
+<1ECC> <1ECC> <E9CC>
+<1ECD> <1ECD> <EA70>
+<1ECE> <1ECE> <EA9D>
+<1F04> <1F13> <875F>
+<1F14> <1F15> <8780>
+<204C> <204C> <8143>
+<204D> <204D> <818B>
+<204E> <204E> <81AC>
+<204F> <204F> <814B>
+<2050> <2050> <814A>
+<2051> <2051> <818C>
+<2052> <2052> <8144>
+<2054> <2054> <8166>
+<2056> <2056> <8168>
+<2057> <2057> <8167>
+<2059> <2059> <8165>
+<205B> <205B> <818D>
+endbfrange
+
+4 usefont % codes in RKSJ-H
+27 beginbfrange
+<027A> <027B> <8141>
+<0289> <028A> <8150>
+<0294> <0296> <815B>
+<0299> <029D> <8160>
+<02A2> <02B3> <8169>
+<02B9> <02B9> <8181>
+<034A> <034A> <829F>
+<034C> <034C> <82A1>
+<034E> <034E> <82A3>
+<0350> <0350> <82A5>
+<0352> <0352> <82A7>
+<036C> <036C> <82C1>
+<038C> <038C> <82E1>
+<038E> <038E> <82E3>
+<0390> <0390> <82E5>
+<0397> <0397> <82EC>
+<039D> <039D> <8340>
+<039F> <039F> <8342>
+<03A1> <03A1> <8344>
+<03A3> <03A3> <8346>
+<03A5> <03A5> <8348>
+<03BF> <03BF> <8362>
+<03DF> <03DF> <8383>
+<03E1> <03E1> <8385>
+<03E3> <03E3> <8387>
+<03EA> <03EA> <838E>
+<03F1> <03F2> <8395>
+endbfrange
+
+endcmap
+CMapName currentdict /CMap defineresource pop
+end
+end
+
+%%EndResource
+%%EOF
diff --git a/src/main/resources/Resources/cmap/Adobe-Japan1-UCS2 b/src/main/resources/Resources/cmap/Adobe-Japan1-UCS2
new file mode 100644
index 0000000..7410fb9
--- /dev/null
+++ b/src/main/resources/Resources/cmap/Adobe-Japan1-UCS2
@@ -0,0 +1 @@
+%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%IncludeResource: ProcSet (CIDInit) %%BeginResource: CMap (Adobe-Japan1-UCS2) %%Title: (Adobe-Japan1-UCS2 Adobe Japan1 4) %%Version: 5.001 %%Copyright: ----------------------------------------------------------- %%Copyright: Copyright 1990-2000 Adobe Systems Incorporated. %%Copyright: All Rights Reserved. %%Copyright: %%Copyright: Patents Pending %%Copyright: %%Copyright: NOTICE: All information contained herein is the property %%Copyright: of Adobe Systems Incorporated. %%Copyright: %%Copyright: Permission is granted for redistribution of this file %%Copyright: provided this copyright notice is maintained intact and %%Copyright: that the contents of this file are not altered in any %%Copyright: way from its original form. %%Copyright: %%Copyright: PostScript and Display PostScript are trademarks of %%Copyright: Adobe Systems Incorporated which may be registered in %%Copyright: certain jurisdictions. %%Copyright: ----------------------------------------------------------- %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo 3 dict dup begin /Registry (Adobe) def /Ordering (Adobe_Japan1_UCS2) def /Supplement 4 def end def /CMapName /Adobe-Japan1-UCS2 def /CMapVersion 5.001 def /CMapType 1 def /XUID [1 10 25335 1212] def /WMode 0 def 1 begincodespacerange <0000> <FFFF> endcodespacerange 100 beginbfchar <0000> <FFFD> <003D> <00A5> <005D> <00A6> <005E> <007D> <005F> <0303> <0060> <02BC> <0061> <005C> <0062> <02BB> <0063> <007C> <0064> <007E> <0068> <2044> <0069> <0192> <006A> <00A7> <006B> <00A4> <006C> <201C> <006D> <00AB> <0072> <2012> <0075> <00B7> <0076> <00B6> <0077> <2022> <0078> <201A> <0079> <201E> <007A> <201D> <007B> <00BB> <007C> <2026> <007D> <2030> <007E> <00BF> <0081> <00AF> <0085> <030A> <0086> <00B8> <0087> <030B> <0088> <0328> <0089> <030C> <008A> <0336> <008B> <00C6> <008C> <00AA> <008D> <0141> <008E> <00D8> <008F> <0152> <0090> <00BA> <0091> <00E6> <0092> <0131> <0093> <0142> <0094> <00F8> <0095> <0153> <0096> <00DF> <0097> <002D> <0098> <00A9> <0099> <00AC> <009A> <00AE> <009F> <00B5> <00A0> <00B9> <00DF> <0160> <00E0> <0178> <00E1> <017D> <00E2> <0305> <00E3> <0161> <00E4> <2122> <00E5> <017E> <00E6> <0030> <00E7> <2002> <0123> <00A5> <0145> <203E> <0186> <FFFD> <0189> <30EE> <018A> <30AB> <018B> <30B1> <018C> <FFFD> <018D> <30AC> <018E> <30AE> <018F> <30B0> <0190> <30B2> <0191> <30B4> <0192> <30B6> <0193> <30B8> <0194> <30BA> <0195> <30BC> <0196> <30BE> <0197> <30C0> <0198> <30C2> <0199> <30C5> <019A> <30C7> <019B> <30C9> <01A6> <FF60> <01A7> <FF9E> <01A8> <FFFD> <01F5> <2032> <01F6> <FFFD> <01F7> <2036> <01F8> <005B> <01F9> <005D> <01FA> <FFFD> <01FB> <FFFD> <01FC> <FFFD> <01FD> <FFFD> <0200> <FFFD> <0201> <FFFD> <0202> <2012> <0203> <FF60> <0204> <3092> endbfchar 100 beginbfchar <0205> <3041> <0206> <3043> <0207> <3045> <0208> <3047> <0209> <3049> <020A> <3083> <020B> <3085> <020C> <3087> <020D> <3063> <020E> <3042> <020F> <3044> <0210> <3046> <0211> <3048> <0214> <304D> <0215> <304F> <0216> <3051> <0217> <3053> <0218> <3055> <0219> <3057> <021A> <3059> <021B> <305B> <021C> <305D> <021D> <305F> <021E> <3061> <021F> <3064> <0220> <3066> <0221> <3068> <0228> <3072> <0229> <3075> <022A> <3078> <022B> <307B> <0231> <3084> <0232> <3086> <0239> <308F> <023A> <3093> <023D> <308E> <023E> <304C> <023F> <304E> <0240> <3050> <0241> <3052> <0242> <3054> <0243> <3056> <0244> <3068> <0245> <305A> <0246> <305C> <0247> <305E> <0248> <3060> <0249> <3062> <024A> <3065> <024B> <3067> <024C> <3069> <0257> <00C4> <0258> <00F9> <0259> <00E9> <025A> <00ED> <025B> <00DF> <025C> <00E7> <025D> <00C7> <025E> <FFFD> <025F> <FFFD> <0262> <00F3> <0263> <00FA> <0264> <00A1> <0265> <00BF> <0266> <00BD> <0267> <00D6> <0268> <00DC> <0269> <00E4> <026A> <00EB> <026B> <00EF> <026C> <00F6> <026D> <00DC> <026E> <00E2> <026F> <00EA> <0270> <00EE> <0271> <00F4> <0272> <00FC> <0273> <00E0> <0274> <00E9> <0275> <25B2> <0276> <00E1> <0277> <007E> <0278> <FFFD> <027C> <FF0C> <027D> <FF0E> <027E> <30FB> <0281> <FF1F> <0282> <FF01> <0285> <00B4> <0286> <FF40> <0287> <00A8> <0288> <FF3E> <0289> <203E> <028A> <FF3F> <028F> <3003> <0290> <4EDD> <0294> <30FC> <0295> <2015> <0296> <2010> <0297> <FF0F> endbfchar 100 beginbfchar <0298> <FF3C> <0299> <FF5E> <029A> <2016> <029B> <FF5C> <029C> <2026> <029D> <2025> <02A6> <FF3B> <02A7> <FF3D> <02A8> <FF5B> <02A9> <FF5D> <02B4> <FF0B> <02B5> <FF0D> <02B6> <00B1> <02B7> <00D7> <02B8> <00F7> <02B9> <FF1D> <02BA> <2260> <02BB> <FF1C> <02BC> <FF1E> <02BF> <221E> <02C0> <2234> <02C1> <2642> <02C2> <2640> <02C3> <00B0> <02C6> <2103> <02C7> <FFE5> <02C8> <FF04> <02CB> <FF05> <02CC> <FF03> <02CD> <FF06> <02CE> <FF0A> <02CF> <FF20> <02D0> <00A7> <02D1> <2606> <02D2> <2605> <02D3> <25CB> <02D4> <25CF> <02D5> <25CE> <02D6> <25C7> <02D7> <25C6> <02D8> <25A1> <02D9> <25A0> <02DA> <25B3> <02DB> <25B2> <02DC> <25BD> <02DD> <25BC> <02DE> <203B> <02DF> <3012> <02E0> <2192> <02E3> <2193> <02E4> <3013> <02E5> <2208> <02E6> <220B> <02EB> <222A> <02EC> <2229> <02EF> <00AC> <02F0> <21D2> <02F1> <21D4> <02F2> <2200> <02F3> <2203> <02F4> <2220> <02F5> <22A5> <02F6> <2312> <02F7> <2202> <02F8> <2207> <02F9> <2261> <02FA> <2252> <02FD> <221A> <02FE> <223D> <02FF> <221D> <0300> <2235> <0303> <212B> <0304> <2030> <0305> <266F> <0306> <266D> <0307> <266A> <030A> <00B6> <030B> <25EF> <0429> <0401> <044A> <0451> <0465> <4E9C> <0466> <5516> <0467> <5A03> <0468> <963F> <0469> <54C0> <046A> <611B> <046B> <6328> <046C> <59F6> <046D> <9022> <046E> <8475> <046F> <831C> <0470> <7A50> <0471> <60AA> <0472> <63E1> <0473> <6E25> <0474> <65ED> <0475> <8466> <0476> <82A6> <0477> <9BF5> <0478> <6893> endbfchar 100 beginbfchar <0479> <5727> <047A> <65A1> <047B> <6271> <047C> <5B9B> <047D> <59D0> <047E> <867B> <047F> <98F4> <0480> <7D62> <0481> <7DBE> <0482> <9B8E> <0483> <6216> <0484> <7C9F> <0485> <88B7> <0486> <5B89> <0487> <5EB5> <0488> <6309> <0489> <6697> <048A> <6848> <048B> <95C7> <048C> <978D> <048D> <674F> <048E> <4EE5> <048F> <4F0A> <0490> <4F4D> <0491> <4F9D> <0492> <5049> <0493> <56F2> <0494> <5937> <0495> <59D4> <0496> <5A01> <0497> <5C09> <0498> <60DF> <0499> <610F> <049A> <6170> <049B> <6613> <049C> <6905> <049D> <70BA> <049E> <754F> <049F> <7570> <04A0> <79FB> <04A1> <7DAD> <04A2> <7DEF> <04A3> <80C3> <04A4> <840E> <04A5> <8863> <04A6> <8B02> <04A7> <9055> <04A8> <907A> <04A9> <533B> <04AA> <4E95> <04AB> <4EA5> <04AC> <57DF> <04AD> <80B2> <04AE> <90C1> <04AF> <78EF> <04B0> <4E00> <04B1> <58F1> <04B2> <6EA2> <04B3> <9038> <04B4> <7A32> <04B5> <8328> <04B6> <828B> <04B7> <9C2F> <04B8> <5141> <04B9> <5370> <04BA> <54BD> <04BB> <54E1> <04BC> <56E0> <04BD> <59FB> <04BE> <5F15> <04BF> <98F2> <04C0> <6DEB> <04C1> <80E4> <04C2> <852D> <04C3> <9662> <04C4> <9670> <04C5> <96A0> <04C6> <97FB> <04C7> <540B> <04C8> <53F3> <04C9> <5B87> <04CA> <70CF> <04CB> <7FBD> <04CC> <8FC2> <04CD> <96E8> <04CE> <536F> <04CF> <9D5C> <04D0> <7ABA> <04D1> <4E11> <04D2> <7893> <04D3> <81FC> <04D4> <6E26> <04D5> <5618> <04D6> <5504> <04D7> <6B1D> <04D8> <851A> <04D9> <9C3B> <04DA> <59E5> <04DB> <53A9> <04DC> <6D66> endbfchar 100 beginbfchar <04DD> <74DC> <04DE> <958F> <04DF> <5642> <04E0> <4E91> <04E1> <904B> <04E2> <96F2> <04E3> <834F> <04E4> <990C> <04E5> <53E1> <04E6> <55B6> <04E7> <5B30> <04E8> <5F71> <04E9> <6620> <04EA> <66F3> <04EB> <6804> <04EC> <6C38> <04ED> <6CF3> <04EE> <6D29> <04EF> <745B> <04F0> <76C8> <04F1> <7A4E> <04F2> <9834> <04F3> <82F1> <04F4> <885B> <04F5> <8A60> <04F6> <92ED> <04F7> <6DB2> <04F8> <75AB> <04F9> <76CA> <04FA> <99C5> <04FB> <60A6> <04FC> <8B01> <04FD> <8D8A> <04FE> <95B2> <04FF> <698E> <0500> <53AD> <0501> <5186> <0502> <5712> <0503> <5830> <0504> <5944> <0505> <5BB4> <0506> <5EF6> <0507> <6028> <0508> <63A9> <0509> <63F4> <050A> <6CBF> <050B> <6F14> <050C> <708E> <050D> <7114> <050E> <7159> <050F> <71D5> <0510> <733F> <0511> <7E01> <0512> <8276> <0513> <82D1> <0514> <8597> <0515> <9060> <0516> <925B> <0517> <9D1B> <0518> <5869> <0519> <65BC> <051A> <6C5A> <051B> <7525> <051C> <51F9> <051D> <592E> <051E> <5965> <051F> <5F80> <0520> <5FDC> <0521> <62BC> <0522> <65FA> <0523> <6A2A> <0524> <6B27> <0525> <6BB4> <0526> <738B> <0527> <7FC1> <0528> <8956> <0529> <9D2C> <052A> <9D0E> <052B> <9EC4> <052C> <5CA1> <052D> <6C96> <052E> <837B> <052F> <5104> <0530> <5C4B> <0531> <61B6> <0532> <81C6> <0533> <6876> <0534> <7261> <0535> <4E59> <0536> <4FFA> <0537> <5378> <0538> <6069> <0539> <6E29> <053A> <7A4F> <053B> <97F3> <053C> <4E0B> <053D> <5316> <053E> <4EEE> <053F> <4F55> <0540> <4F3D> endbfchar 100 beginbfchar <0541> <4FA1> <0542> <4F73> <0543> <52A0> <0544> <53EF> <0545> <5609> <0546> <590F> <0547> <5AC1> <0548> <5BB6> <0549> <5BE1> <054A> <79D1> <054B> <6687> <054C> <679C> <054D> <67B6> <054E> <6B4C> <054F> <6CB3> <0550> <706B> <0551> <73C2> <0552> <798D> <0553> <79BE> <0554> <7A3C> <0555> <7B87> <0556> <82B1> <0557> <82DB> <0558> <8304> <0559> <8377> <055A> <83EF> <055B> <83D3> <055C> <8766> <055D> <8AB2> <055E> <5629> <055F> <8CA8> <0560> <8FE6> <0561> <904E> <0562> <971E> <0563> <868A> <0564> <4FC4> <0565> <5CE8> <0566> <6211> <0567> <7259> <0568> <753B> <0569> <81E5> <056A> <82BD> <056B> <86FE> <056C> <8CC0> <056D> <96C5> <056E> <9913> <056F> <99D5> <0570> <4ECB> <0571> <4F1A> <0572> <89E3> <0573> <56DE> <0574> <584A> <0575> <58CA> <0576> <5EFB> <0577> <5FEB> <0578> <602A> <0579> <6094> <057A> <6062> <057B> <61D0> <057C> <6212> <057D> <62D0> <057E> <6539> <057F> <9B41> <0580> <6666> <0581> <68B0> <0582> <6D77> <0583> <7070> <0584> <754C> <0585> <7686> <0586> <7D75> <0587> <82A5> <0588> <87F9> <0589> <958B> <058A> <968E> <058B> <8C9D> <058C> <51F1> <058D> <52BE> <058E> <5916> <058F> <54B3> <0590> <5BB3> <0591> <5D16> <0592> <6168> <0593> <6982> <0594> <6DAF> <0595> <788D> <0596> <84CB> <0597> <8857> <0598> <8A72> <0599> <93A7> <059A> <9AB8> <059B> <6D6C> <059C> <99A8> <059D> <86D9> <059E> <57A3> <059F> <67FF> <05A0> <86CE> <05A1> <920E> <05A2> <5283> <05A3> <5687> <05A4> <5404> endbfchar 100 beginbfchar <05A5> <5ED3> <05A6> <62E1> <05A7> <64B9> <05A8> <683C> <05A9> <6838> <05AA> <6BBB> <05AB> <7372> <05AC> <78BA> <05AD> <7A6B> <05AE> <899A> <05AF> <89D2> <05B0> <8D6B> <05B1> <8F03> <05B2> <90ED> <05B3> <95A3> <05B4> <9694> <05B5> <9769> <05B6> <5B66> <05B7> <5CB3> <05B8> <697D> <05BB> <639B> <05BC> <7B20> <05BD> <6A2B> <05BE> <6A7F> <05BF> <68B6> <05C0> <9C0D> <05C1> <6F5F> <05C2> <5272> <05C3> <559D> <05C4> <6070> <05C5> <62EC> <05C6> <6D3B> <05C7> <6E07> <05C8> <6ED1> <05C9> <845B> <05CA> <8910> <05CB> <8F44> <05CC> <4E14> <05CD> <9C39> <05CE> <53F6> <05CF> <691B> <05D0> <6A3A> <05D1> <9784> <05D2> <682A> <05D3> <515C> <05D4> <7AC3> <05D5> <84B2> <05D6> <91DC> <05D7> <938C> <05D8> <565B> <05D9> <9D28> <05DA> <6822> <05DB> <8305> <05DC> <8431> <05DD> <7CA5> <05DE> <5208> <05DF> <82C5> <05E0> <74E6> <05E1> <4E7E> <05E2> <4F83> <05E3> <51A0> <05E4> <5BD2> <05E5> <520A> <05E6> <52D8> <05E7> <52E7> <05E8> <5DFB> <05E9> <559A> <05EA> <582A> <05EB> <59E6> <05EC> <5B8C> <05ED> <5B98> <05EE> <5BDB> <05EF> <5E72> <05F0> <5E79> <05F1> <60A3> <05F2> <611F> <05F3> <6163> <05F4> <61BE> <05F5> <63DB> <05F6> <6562> <05F7> <67D1> <05F8> <6853> <05F9> <68FA> <05FA> <6B3E> <05FB> <6B53> <05FC> <6C57> <05FD> <6F22> <05FE> <6F97> <05FF> <6F45> <0600> <74B0> <0601> <7518> <0602> <76E3> <0603> <770B> <0604> <7AFF> <0605> <7BA1> <0606> <7C21> <0607> <7DE9> <0608> <7F36> <0609> <7FF0> <060A> <809D> endbfchar 100 beginbfchar <060B> <8266> <060C> <839E> <060D> <89B3> <060E> <8ACC> <060F> <8CAB> <0610> <9084> <0611> <9451> <0612> <9593> <0613> <9591> <0614> <95A2> <0615> <9665> <0616> <97D3> <0617> <9928> <0618> <8218> <0619> <4E38> <061A> <542B> <061B> <5CB8> <061C> <5DCC> <061D> <73A9> <061E> <764C> <061F> <773C> <0620> <5CA9> <0621> <7FEB> <0622> <8D0B> <0623> <96C1> <0624> <9811> <0625> <9854> <0626> <9858> <0627> <4F01> <0628> <4F0E> <0629> <5371> <062A> <559C> <062B> <5668> <062C> <57FA> <062D> <5947> <062E> <5B09> <062F> <5BC4> <0630> <5C90> <0631> <5E0C> <0632> <5E7E> <0633> <5FCC> <0634> <63EE> <0635> <673A> <0636> <65D7> <0637> <65E2> <0638> <671F> <0639> <68CB> <063A> <68C4> <063B> <6A5F> <063C> <5E30> <063D> <6BC5> <063E> <6C17> <063F> <6C7D> <0640> <757F> <0641> <7948> <0642> <5B63> <0643> <7A00> <0644> <7D00> <0645> <5FBD> <0646> <898F> <0647> <8A18> <0648> <8CB4> <0649> <8D77> <064A> <8ECC> <064B> <8F1D> <064C> <98E2> <064D> <9A0E> <064E> <9B3C> <064F> <4E80> <0650> <507D> <0651> <5100> <0652> <5993> <0653> <5B9C> <0654> <622F> <0655> <6280> <0656> <64EC> <0657> <6B3A> <0658> <72A0> <0659> <7591> <065A> <7947> <065B> <7FA9> <065C> <87FB> <065D> <8ABC> <065E> <8B70> <065F> <63AC> <0660> <83CA> <0661> <97A0> <0662> <5409> <0663> <5403> <0664> <55AB> <0665> <6854> <0666> <6A58> <0667> <8A70> <0668> <7827> <0669> <6775> <066A> <9ECD> <066B> <5374> <066C> <5BA2> <066D> <811A> <066E> <8650> endbfchar 100 beginbfchar <066F> <9006> <0670> <4E18> <0671> <4E45> <0672> <4EC7> <0673> <4F11> <0674> <53CA> <0675> <5438> <0676> <5BAE> <0677> <5F13> <0678> <6025> <0679> <6551> <067A> <673D> <067B> <6C42> <067C> <6C72> <067D> <6CE3> <067E> <7078> <067F> <7403> <0680> <7A76> <0681> <7AAE> <0682> <7B08> <0683> <7D1A> <0684> <7CFE> <0685> <7D66> <0686> <65E7> <0687> <725B> <0688> <53BB> <0689> <5C45> <068A> <5DE8> <068B> <62D2> <068C> <62E0> <068D> <6319> <068E> <6E20> <068F> <865A> <0690> <8A31> <0691> <8DDD> <0692> <92F8> <0693> <6F01> <0694> <79A6> <0695> <9B5A> <0696> <4EA8> <0699> <4F9B> <069A> <4FA0> <069B> <50D1> <069C> <5147> <069D> <7AF6> <069E> <5171> <069F> <51F6> <06A0> <5354> <06A1> <5321> <06A2> <537F> <06A3> <53EB> <06A4> <55AC> <06A5> <5883> <06A6> <5CE1> <06A7> <5F37> <06A8> <5F4A> <06A9> <602F> <06AA> <6050> <06AB> <606D> <06AC> <631F> <06AD> <6559> <06AE> <6A4B> <06AF> <6CC1> <06B0> <72C2> <06B1> <72ED> <06B2> <77EF> <06B3> <80F8> <06B4> <8105> <06B5> <8208> <06B6> <854E> <06B7> <90F7> <06B8> <93E1> <06B9> <97FF> <06BA> <9957> <06BB> <9A5A> <06BC> <4EF0> <06BD> <51DD> <06BE> <5C2D> <06BF> <6681> <06C0> <696D> <06C1> <5C40> <06C2> <66F2> <06C3> <6975> <06C4> <7389> <06C5> <6850> <06C6> <7C81> <06C7> <50C5> <06C8> <52E4> <06C9> <5747> <06CA> <5DFE> <06CB> <9326> <06CC> <65A4> <06CD> <6B23> <06CE> <6B3D> <06CF> <7434> <06D0> <7981> <06D1> <79BD> <06D2> <7B4B> <06D3> <7DCA> <06D4> <82B9> endbfchar 100 beginbfchar <06D5> <83CC> <06D6> <887F> <06D7> <895F> <06D8> <8B39> <06D9> <8FD1> <06DA> <91D1> <06DB> <541F> <06DC> <9280> <06DD> <4E5D> <06DE> <5036> <06DF> <53E5> <06E0> <533A> <06E1> <72D7> <06E2> <7396> <06E3> <77E9> <06E4> <82E6> <06E5> <8EAF> <06E6> <99C6> <06E7> <99C8> <06E8> <99D2> <06E9> <5177> <06EA> <611A> <06EB> <865E> <06EC> <55B0> <06ED> <7A7A> <06EE> <5076> <06EF> <5BD3> <06F0> <9047> <06F1> <9685> <06F2> <4E32> <06F3> <6ADB> <06F4> <91E7> <06F5> <5C51> <06F6> <5C48> <06F7> <6398> <06F8> <7A9F> <06F9> <6C93> <06FA> <9774> <06FB> <8F61> <06FC> <7AAA> <06FD> <718A> <06FE> <9688> <06FF> <7C82> <0700> <6817> <0701> <7E70> <0702> <6851> <0703> <936C> <0704> <52F2> <0705> <541B> <0706> <85AB> <0707> <8A13> <0708> <7FA4> <0709> <8ECD> <070A> <90E1> <070B> <5366> <070C> <8888> <070D> <7941> <070E> <4FC2> <070F> <50BE> <0710> <5211> <0711> <5144> <0712> <5553> <0713> <572D> <0714> <73EA> <0715> <578B> <0716> <5951> <0717> <5F62> <0718> <5F84> <0719> <6075> <071A> <6176> <071B> <6167> <071C> <61A9> <071D> <63B2> <071E> <643A> <071F> <656C> <0720> <666F> <0721> <6842> <0722> <6E13> <0723> <7566> <0724> <7A3D> <0725> <7CFB> <0726> <7D4C> <0727> <7D99> <0728> <7E4B> <0729> <7F6B> <072A> <830E> <072B> <834A> <072C> <86CD> <072D> <8A08> <072E> <8A63> <072F> <8B66> <0730> <8EFD> <0731> <981A> <0732> <9D8F> <0733> <82B8> <0734> <8FCE> <0735> <9BE8> <0736> <5287> <0737> <621F> <0738> <6483> endbfchar 100 beginbfchar <0739> <6FC0> <073A> <9699> <073B> <6841> <073C> <5091> <073D> <6B20> <073E> <6C7A> <073F> <6F54> <0740> <7A74> <0741> <7D50> <0742> <8840> <0743> <8A23> <0744> <6708> <0745> <4EF6> <0746> <5039> <0747> <5026> <0748> <5065> <0749> <517C> <074A> <5238> <074B> <5263> <074C> <55A7> <074D> <570F> <074E> <5805> <074F> <5ACC> <0750> <5EFA> <0751> <61B2> <0752> <61F8> <0753> <62F3> <0754> <6372> <0755> <691C> <0756> <6A29> <0757> <727D> <0758> <72AC> <0759> <732E> <075A> <7814> <075B> <786F> <075C> <7D79> <075D> <770C> <075E> <80A9> <075F> <898B> <0760> <8B19> <0761> <8CE2> <0762> <8ED2> <0763> <9063> <0764> <9375> <0765> <967A> <0766> <9855> <0767> <9A13> <0768> <9E78> <0769> <5143> <076A> <539F> <076B> <53B3> <076C> <5E7B> <076D> <5F26> <076E> <6E1B> <076F> <6E90> <0770> <7384> <0771> <73FE> <0772> <7D43> <0773> <8237> <0774> <8A00> <0775> <8AFA> <0776> <9650> <0777> <4E4E> <0778> <500B> <0779> <53E4> <077A> <547C> <077B> <56FA> <077C> <59D1> <077D> <5B64> <077E> <5DF1> <077F> <5EAB> <0780> <5F27> <0781> <6238> <0782> <6545> <0783> <67AF> <0784> <6E56> <0785> <72D0> <0786> <7CCA> <0787> <88B4> <0788> <80A1> <0789> <80E1> <078A> <83F0> <078B> <864E> <078C> <8A87> <078D> <8DE8> <078E> <9237> <078F> <96C7> <0790> <9867> <0791> <9F13> <0792> <4E94> <0793> <4E92> <0794> <4F0D> <0795> <5348> <0796> <5449> <0797> <543E> <0798> <5A2F> <0799> <5F8C> <079A> <5FA1> <079B> <609F> <079C> <68A7> endbfchar 100 beginbfchar <079D> <6A8E> <079E> <745A> <079F> <7881> <07A0> <8A9E> <07A1> <8AA4> <07A2> <8B77> <07A3> <9190> <07A4> <4E5E> <07A5> <9BC9> <07A6> <4EA4> <07A7> <4F7C> <07A8> <4FAF> <07A9> <5019> <07AA> <5016> <07AB> <5149> <07AC> <516C> <07AD> <529F> <07AE> <52B9> <07AF> <52FE> <07B0> <539A> <07B1> <53E3> <07B2> <5411> <07B3> <540E> <07B4> <5589> <07B5> <5751> <07B6> <57A2> <07B7> <597D> <07B8> <5B54> <07B9> <5B5D> <07BA> <5B8F> <07BB> <5DE5> <07BC> <5DE7> <07BD> <5DF7> <07BE> <5E78> <07BF> <5E83> <07C0> <5E9A> <07C1> <5EB7> <07C2> <5F18> <07C3> <6052> <07C4> <614C> <07C5> <6297> <07C6> <62D8> <07C7> <63A7> <07C8> <653B> <07C9> <6602> <07CA> <6643> <07CB> <66F4> <07CC> <676D> <07CD> <6821> <07CE> <6897> <07CF> <69CB> <07D0> <6C5F> <07D1> <6D2A> <07D2> <6D69> <07D3> <6E2F> <07D4> <6E9D> <07D5> <7532> <07D6> <7687> <07D7> <786C> <07D8> <7A3F> <07D9> <7CE0> <07DA> <7D05> <07DB> <7D18> <07DC> <7D5E> <07DD> <7DB1> <07DE> <8015> <07DF> <8003> <07E0> <80AF> <07E1> <80B1> <07E2> <8154> <07E3> <818F> <07E4> <822A> <07E5> <8352> <07E6> <884C> <07E7> <8861> <07E8> <8B1B> <07E9> <8CA2> <07EA> <8CFC> <07EB> <90CA> <07EC> <9175> <07ED> <9271> <07EE> <783F> <07EF> <92FC> <07F0> <95A4> <07F1> <964D> <07F2> <9805> <07F3> <9999> <07F4> <9AD8> <07F5> <9D3B> <07F6> <525B> <07F7> <52AB> <07F8> <53F7> <07F9> <5408> <07FA> <58D5> <07FB> <62F7> <07FC> <6FE0> <07FD> <8C6A> <07FE> <8F5F> <07FF> <9EB9> <0800> <514B> endbfchar 100 beginbfchar <0801> <523B> <0802> <544A> <0803> <56FD> <0804> <7A40> <0805> <9177> <0806> <9D60> <0807> <9ED2> <0808> <7344> <0809> <6F09> <080A> <8170> <080B> <7511> <080C> <5FFD> <080D> <60DA> <080E> <9AA8> <080F> <72DB> <0810> <8FBC> <0811> <6B64> <0812> <9803> <0813> <4ECA> <0814> <56F0> <0815> <5764> <0816> <58BE> <0817> <5A5A> <0818> <6068> <0819> <61C7> <081A> <660F> <081B> <6606> <081C> <6839> <081D> <68B1> <081E> <6DF7> <081F> <75D5> <0820> <7D3A> <0821> <826E> <0822> <9B42> <0823> <4E9B> <0824> <4F50> <0825> <53C9> <0826> <5506> <0827> <5D6F> <0828> <5DE6> <0829> <5DEE> <082A> <67FB> <082B> <6C99> <082C> <7473> <082D> <7802> <082E> <8A50> <082F> <9396> <0830> <88DF> <0831> <5750> <0832> <5EA7> <0833> <632B> <0834> <50B5> <0835> <50AC> <0836> <518D> <0837> <6700> <0838> <54C9> <0839> <585E> <083A> <59BB> <083B> <5BB0> <083C> <5F69> <083D> <624D> <083E> <63A1> <083F> <683D> <0840> <6B73> <0841> <6E08> <0842> <707D> <0843> <91C7> <0844> <7280> <0845> <7815> <0846> <7826> <0847> <796D> <0848> <658E> <0849> <7D30> <084A> <83DC> <084B> <88C1> <084C> <8F09> <084D> <969B> <084E> <5264> <084F> <5728> <0850> <6750> <0851> <7F6A> <0852> <8CA1> <0853> <51B4> <0854> <5742> <0855> <962A> <0856> <583A> <0857> <698A> <0858> <80B4> <0859> <54B2> <085A> <5D0E> <085B> <57FC> <085C> <7895> <085D> <9DFA> <085E> <4F5C> <085F> <524A> <0860> <548B> <0861> <643E> <0862> <6628> <0863> <6714> <0864> <67F5> endbfchar 100 beginbfchar <0865> <7A84> <0866> <7B56> <0867> <7D22> <0868> <932F> <0869> <685C> <086A> <9BAD> <086B> <7B39> <086C> <5319> <086D> <518A> <086E> <5237> <086F> <5BDF> <0870> <62F6> <0871> <64AE> <0872> <64E6> <0873> <672D> <0874> <6BBA> <0875> <85A9> <0876> <96D1> <0877> <7690> <0878> <9BD6> <0879> <634C> <087A> <9306> <087B> <9BAB> <087C> <76BF> <087D> <6652> <087E> <4E09> <087F> <5098> <0880> <53C2> <0881> <5C71> <0882> <60E8> <0883> <6492> <0884> <6563> <0885> <685F> <0886> <71E6> <0887> <73CA> <0888> <7523> <0889> <7B97> <088A> <7E82> <088B> <8695> <088C> <8B83> <088D> <8CDB> <088E> <9178> <088F> <9910> <0890> <65AC> <0891> <66AB> <0892> <6B8B> <0893> <4ED5> <0894> <4ED4> <0895> <4F3A> <0896> <4F7F> <0897> <523A> <0898> <53F8> <0899> <53F2> <089A> <55E3> <089B> <56DB> <089C> <58EB> <089D> <59CB> <089E> <59C9> <089F> <59FF> <08A0> <5B50> <08A1> <5C4D> <08A2> <5E02> <08A3> <5E2B> <08A4> <5FD7> <08A5> <601D> <08A6> <6307> <08A7> <652F> <08A8> <5B5C> <08A9> <65AF> <08AA> <65BD> <08AB> <65E8> <08AC> <679D> <08AD> <6B62> <08AE> <6B7B> <08AF> <6C0F> <08B0> <7345> <08B1> <7949> <08B2> <79C1> <08B3> <7CF8> <08B4> <7D19> <08B5> <7D2B> <08B6> <80A2> <08B7> <8102> <08B8> <81F3> <08B9> <8996> <08BA> <8A5E> <08BB> <8A69> <08BC> <8A66> <08BD> <8A8C> <08BE> <8AEE> <08BF> <8CC7> <08C0> <8CDC> <08C1> <96CC> <08C2> <98FC> <08C3> <6B6F> <08C4> <4E8B> <08C5> <4F3C> <08C6> <4F8D> <08C7> <5150> <08C8> <5B57> endbfchar 100 beginbfchar <08C9> <5BFA> <08CA> <6148> <08CB> <6301> <08CC> <6642> <08CD> <6B21> <08CE> <6ECB> <08CF> <6CBB> <08D0> <723E> <08D1> <74BD> <08D2> <75D4> <08D3> <78C1> <08D4> <793A> <08D5> <800C> <08D6> <8033> <08D7> <81EA> <08D8> <8494> <08D9> <8F9E> <08DA> <6C50> <08DB> <9E7F> <08DC> <5F0F> <08DD> <8B58> <08DE> <9D2B> <08DF> <7AFA> <08E0> <8EF8> <08E1> <5B8D> <08E2> <96EB> <08E3> <4E03> <08E4> <53F1> <08E5> <57F7> <08E6> <5931> <08E7> <5AC9> <08E8> <5BA4> <08E9> <6089> <08EA> <6E7F> <08EB> <6F06> <08EC> <75BE> <08ED> <8CEA> <08EE> <5B9F> <08EF> <8500> <08F0> <7BE0> <08F1> <5072> <08F2> <67F4> <08F3> <829D> <08F4> <5C61> <08F5> <854A> <08F6> <7E1E> <08F7> <820E> <08F8> <5199> <08F9> <5C04> <08FA> <6368> <08FB> <8D66> <08FC> <659C> <08FD> <716E> <08FE> <793E> <08FF> <7D17> <0900> <8005> <0901> <8B1D> <0902> <8ECA> <0903> <906E> <0904> <86C7> <0905> <90AA> <0906> <501F> <0907> <52FA> <0908> <5C3A> <0909> <6753> <090A> <707C> <090B> <7235> <090C> <914C> <090D> <91C8> <090E> <932B> <090F> <82E5> <0910> <5BC2> <0911> <5F31> <0912> <60F9> <0913> <4E3B> <0914> <53D6> <0915> <5B88> <0916> <624B> <0917> <6731> <0918> <6B8A> <0919> <72E9> <091A> <73E0> <091B> <7A2E> <091C> <816B> <091D> <8DA3> <091E> <9152> <091F> <9996> <0920> <5112> <0921> <53D7> <0922> <546A> <0923> <5BFF> <0924> <6388> <0925> <6A39> <0926> <7DAC> <0927> <9700> <0928> <56DA> <0929> <53CE> <092A> <5468> <092B> <5B97> <092C> <5C31> endbfchar 100 beginbfchar <092D> <5DDE> <092E> <4FEE> <092F> <6101> <0930> <62FE> <0931> <6D32> <0932> <79C0> <0933> <79CB> <0934> <7D42> <0935> <7E4D> <0936> <7FD2> <0937> <81ED> <0938> <821F> <0939> <8490> <093A> <8846> <093B> <8972> <093C> <8B90> <093D> <8E74> <093E> <8F2F> <093F> <9031> <0940> <914B> <0941> <916C> <0942> <96C6> <0943> <919C> <0944> <4EC0> <0945> <4F4F> <0946> <5145> <0947> <5341> <0948> <5F93> <0949> <620E> <094A> <67D4> <094B> <6C41> <094C> <6E0B> <094D> <7363> <094E> <7E26> <094F> <91CD> <0950> <9283> <0951> <53D4> <0952> <5919> <0953> <5BBF> <0954> <6DD1> <0955> <795D> <0956> <7E2E> <0957> <7C9B> <0958> <587E> <0959> <719F> <095A> <51FA> <095B> <8853> <095C> <8FF0> <095D> <4FCA> <095E> <5CFB> <095F> <6625> <0960> <77AC> <0961> <7AE3> <0962> <821C> <0963> <99FF> <0964> <51C6> <0965> <5FAA> <0966> <65EC> <0967> <696F> <0968> <6B89> <0969> <6DF3> <096A> <6E96> <096B> <6F64> <096C> <76FE> <096D> <7D14> <096E> <5DE1> <096F> <9075> <0970> <9187> <0971> <9806> <0972> <51E6> <0973> <521D> <0974> <6240> <0975> <6691> <0976> <66D9> <0977> <6E1A> <0978> <5EB6> <0979> <7DD2> <097A> <7F72> <097B> <66F8> <097C> <85AF> <097D> <85F7> <097E> <8AF8> <097F> <52A9> <0980> <53D9> <0981> <5973> <0982> <5E8F> <0983> <5F90> <0984> <6055> <0985> <92E4> <0986> <9664> <0987> <50B7> <0988> <511F> <0989> <52DD> <098A> <5320> <098B> <5347> <098C> <53EC> <098D> <54E8> <098E> <5546> <098F> <5531> <0990> <5617> endbfchar 100 beginbfchar <0991> <5968> <0992> <59BE> <0993> <5A3C> <0994> <5BB5> <0995> <5C06> <0996> <5C0F> <0997> <5C11> <0998> <5C1A> <0999> <5E84> <099A> <5E8A> <099B> <5EE0> <099C> <5F70> <099D> <627F> <099E> <6284> <099F> <62DB> <09A0> <638C> <09A1> <6377> <09A2> <6607> <09A3> <660C> <09A4> <662D> <09A5> <6676> <09A6> <677E> <09A7> <68A2> <09A8> <6A1F> <09A9> <6A35> <09AA> <6CBC> <09AB> <6D88> <09AC> <6E09> <09AD> <6E58> <09AE> <713C> <09AF> <7126> <09B0> <7167> <09B1> <75C7> <09B2> <7701> <09B3> <785D> <09B4> <7901> <09B5> <7965> <09B6> <79F0> <09B7> <7AE0> <09B8> <7B11> <09B9> <7CA7> <09BA> <7D39> <09BB> <8096> <09BC> <83D6> <09BD> <848B> <09BE> <8549> <09BF> <885D> <09C0> <88F3> <09C1> <8A1F> <09C2> <8A3C> <09C3> <8A54> <09C4> <8A73> <09C5> <8C61> <09C6> <8CDE> <09C7> <91A4> <09C8> <9266> <09C9> <937E> <09CA> <9418> <09CB> <969C> <09CC> <9798> <09CD> <4E0A> <09CE> <4E08> <09CF> <4E1E> <09D0> <4E57> <09D1> <5197> <09D2> <5270> <09D3> <57CE> <09D4> <5834> <09D5> <58CC> <09D6> <5B22> <09D7> <5E38> <09D8> <60C5> <09D9> <64FE> <09DA> <6761> <09DB> <6756> <09DC> <6D44> <09DD> <72B6> <09DE> <7573> <09DF> <7A63> <09E0> <84B8> <09E1> <8B72> <09E2> <91B8> <09E3> <9320> <09E4> <5631> <09E5> <57F4> <09E6> <98FE> <09E7> <62ED> <09E8> <690D> <09E9> <6B96> <09EA> <71ED> <09EB> <7E54> <09EC> <8077> <09ED> <8272> <09EE> <89E6> <09EF> <98DF> <09F0> <8755> <09F1> <8FB1> <09F2> <5C3B> <09F3> <4F38> <09F4> <4FE1> endbfchar 100 beginbfchar <09F5> <4FB5> <09F6> <5507> <09F7> <5A20> <09F8> <5BDD> <09F9> <5BE9> <09FA> <5FC3> <09FB> <614E> <09FC> <632F> <09FD> <65B0> <09FE> <664B> <09FF> <68EE> <0A00> <699B> <0A01> <6D78> <0A02> <6DF1> <0A03> <7533> <0A04> <75B9> <0A05> <771F> <0A06> <795E> <0A07> <79E6> <0A08> <7D33> <0A09> <81E3> <0A0A> <82AF> <0A0B> <85AA> <0A0C> <89AA> <0A0D> <8A3A> <0A0E> <8EAB> <0A0F> <8F9B> <0A10> <9032> <0A11> <91DD> <0A12> <9707> <0A13> <4EBA> <0A14> <4EC1> <0A15> <5203> <0A16> <5875> <0A17> <58EC> <0A18> <5C0B> <0A19> <751A> <0A1A> <5C3D> <0A1B> <814E> <0A1C> <8A0A> <0A1D> <8FC5> <0A1E> <9663> <0A1F> <976D> <0A20> <7B25> <0A21> <8ACF> <0A22> <9808> <0A23> <9162> <0A24> <56F3> <0A25> <53A8> <0A26> <9017> <0A27> <5439> <0A28> <5782> <0A29> <5E25> <0A2A> <63A8> <0A2B> <6C34> <0A2C> <708A> <0A2D> <7761> <0A2E> <7C8B> <0A2F> <7FE0> <0A30> <8870> <0A31> <9042> <0A32> <9154> <0A33> <9310> <0A34> <9318> <0A35> <968F> <0A36> <745E> <0A37> <9AC4> <0A38> <5D07> <0A39> <5D69> <0A3A> <6570> <0A3B> <67A2> <0A3C> <8DA8> <0A3D> <96DB> <0A3E> <636E> <0A3F> <6749> <0A40> <6919> <0A41> <83C5> <0A42> <9817> <0A43> <96C0> <0A44> <88FE> <0A45> <6F84> <0A46> <647A> <0A47> <5BF8> <0A48> <4E16> <0A49> <702C> <0A4A> <755D> <0A4B> <662F> <0A4C> <51C4> <0A4D> <5236> <0A4E> <52E2> <0A4F> <59D3> <0A50> <5F81> <0A51> <6027> <0A52> <6210> <0A53> <653F> <0A54> <6574> <0A55> <661F> <0A56> <6674> <0A57> <68F2> <0A58> <6816> endbfchar 100 beginbfchar <0A59> <6B63> <0A5A> <6E05> <0A5B> <7272> <0A5C> <751F> <0A5D> <76DB> <0A5E> <7CBE> <0A5F> <8056> <0A60> <58F0> <0A61> <88FD> <0A62> <897F> <0A63> <8AA0> <0A64> <8A93> <0A65> <8ACB> <0A66> <901D> <0A67> <9192> <0A68> <9752> <0A69> <9759> <0A6A> <6589> <0A6B> <7A0E> <0A6C> <8106> <0A6D> <96BB> <0A6E> <5E2D> <0A6F> <60DC> <0A70> <621A> <0A71> <65A5> <0A72> <6614> <0A73> <6790> <0A74> <77F3> <0A75> <7A4D> <0A76> <7C4D> <0A77> <7E3E> <0A78> <810A> <0A79> <8CAC> <0A7A> <8D64> <0A7B> <8DE1> <0A7C> <8E5F> <0A7D> <78A9> <0A7E> <5207> <0A7F> <62D9> <0A80> <63A5> <0A81> <6442> <0A82> <6298> <0A83> <8A2D> <0A84> <7A83> <0A85> <7BC0> <0A86> <8AAC> <0A87> <96EA> <0A88> <7D76> <0A89> <820C> <0A8A> <8749> <0A8B> <4ED9> <0A8C> <5148> <0A8D> <5343> <0A8E> <5360> <0A8F> <5BA3> <0A90> <5C02> <0A91> <5C16> <0A92> <5DDD> <0A93> <6226> <0A94> <6247> <0A95> <64B0> <0A96> <6813> <0A97> <6834> <0A98> <6CC9> <0A99> <6D45> <0A9A> <6D17> <0A9B> <67D3> <0A9C> <6F5C> <0A9D> <714E> <0A9E> <717D> <0A9F> <65CB> <0AA0> <7A7F> <0AA1> <7BAD> <0AA2> <7DDA> <0AA3> <7E4A> <0AA4> <7FA8> <0AA5> <817A> <0AA6> <821B> <0AA7> <8239> <0AA8> <85A6> <0AA9> <8A6E> <0AAA> <8CCE> <0AAB> <8DF5> <0AAC> <9078> <0AAD> <9077> <0AAE> <92AD> <0AAF> <9291> <0AB0> <9583> <0AB1> <9BAE> <0AB2> <524D> <0AB3> <5584> <0AB4> <6F38> <0AB5> <7136> <0AB6> <5168> <0AB7> <7985> <0AB8> <7E55> <0AB9> <81B3> <0ABA> <7CCE> <0ABB> <564C> <0ABC> <5851> endbfchar 100 beginbfchar <0ABD> <5CA8> <0ABE> <63AA> <0ABF> <66FE> <0AC0> <66FD> <0AC1> <695A> <0AC2> <72D9> <0AC3> <758F> <0AC4> <758E> <0AC5> <790E> <0AC6> <7956> <0AC7> <79DF> <0AC8> <7C97> <0AC9> <7D20> <0ACA> <7D44> <0ACB> <8607> <0ACC> <8A34> <0ACD> <963B> <0ACE> <9061> <0ACF> <9F20> <0AD0> <50E7> <0AD1> <5275> <0AD2> <53CC> <0AD3> <53E2> <0AD4> <5009> <0AD5> <55AA> <0AD6> <58EE> <0AD7> <594F> <0AD8> <723D> <0AD9> <5B8B> <0ADA> <5C64> <0ADB> <531D> <0ADC> <60E3> <0ADD> <60F3> <0ADE> <635C> <0ADF> <6383> <0AE0> <633F> <0AE1> <63BB> <0AE2> <64CD> <0AE3> <65E9> <0AE4> <66F9> <0AE5> <5DE3> <0AE6> <69CD> <0AE7> <69FD> <0AE8> <6F15> <0AE9> <71E5> <0AEA> <4E89> <0AEB> <75E9> <0AEC> <76F8> <0AED> <7A93> <0AEE> <7CDF> <0AEF> <7DCF> <0AF0> <7D9C> <0AF1> <8061> <0AF2> <8349> <0AF3> <8358> <0AF4> <846C> <0AF5> <84BC> <0AF6> <85FB> <0AF7> <88C5> <0AF8> <8D70> <0AF9> <9001> <0AFA> <906D> <0AFB> <9397> <0AFC> <971C> <0AFD> <9A12> <0AFE> <50CF> <0AFF> <5897> <0B00> <618E> <0B01> <81D3> <0B02> <8535> <0B03> <8D08> <0B04> <9020> <0B05> <4FC3> <0B06> <5074> <0B07> <5247> <0B08> <5373> <0B09> <606F> <0B0A> <6349> <0B0B> <675F> <0B0C> <6E2C> <0B0D> <8DB3> <0B0E> <901F> <0B0F> <4FD7> <0B10> <5C5E> <0B11> <8CCA> <0B12> <65CF> <0B13> <7D9A> <0B14> <5352> <0B15> <8896> <0B16> <5176> <0B17> <63C3> <0B18> <5B58> <0B19> <5B6B> <0B1A> <5C0A> <0B1B> <640D> <0B1C> <6751> <0B1D> <905C> <0B1E> <4ED6> <0B1F> <591A> <0B20> <592A> endbfchar 100 beginbfchar <0B21> <6C70> <0B22> <8A51> <0B23> <553E> <0B24> <5815> <0B25> <59A5> <0B26> <60F0> <0B27> <6253> <0B28> <67C1> <0B29> <8235> <0B2A> <6955> <0B2B> <9640> <0B2C> <99C4> <0B2D> <9A28> <0B2E> <4F53> <0B2F> <5806> <0B30> <5BFE> <0B31> <8010> <0B32> <5CB1> <0B33> <5E2F> <0B34> <5F85> <0B35> <6020> <0B36> <614B> <0B37> <6234> <0B38> <66FF> <0B39> <6CF0> <0B3A> <6EDE> <0B3B> <80CE> <0B3C> <817F> <0B3D> <82D4> <0B3E> <888B> <0B3F> <8CB8> <0B40> <9000> <0B41> <902E> <0B42> <968A> <0B43> <9EDB> <0B44> <9BDB> <0B45> <4EE3> <0B46> <53F0> <0B47> <5927> <0B48> <7B2C> <0B49> <918D> <0B4A> <984C> <0B4B> <9DF9> <0B4C> <6EDD> <0B4D> <7027> <0B4E> <5353> <0B4F> <5544> <0B50> <5B85> <0B51> <6258> <0B52> <629E> <0B53> <62D3> <0B54> <6CA2> <0B55> <6FEF> <0B56> <7422> <0B57> <8A17> <0B58> <9438> <0B59> <6FC1> <0B5A> <8AFE> <0B5B> <8338> <0B5C> <51E7> <0B5D> <86F8> <0B5E> <53EA> <0B5F> <53E9> <0B60> <4F46> <0B61> <9054> <0B62> <8FB0> <0B63> <596A> <0B64> <8131> <0B65> <5DFD> <0B66> <7AEA> <0B67> <8FBF> <0B68> <68DA> <0B69> <8C37> <0B6A> <72F8> <0B6B> <9C48> <0B6C> <6A3D> <0B6D> <8AB0> <0B6E> <4E39> <0B6F> <5358> <0B70> <5606> <0B71> <5766> <0B72> <62C5> <0B73> <63A2> <0B74> <65E6> <0B75> <6B4E> <0B76> <6DE1> <0B77> <6E5B> <0B78> <70AD> <0B79> <77ED> <0B7A> <7AEF> <0B7B> <7BAA> <0B7C> <7DBB> <0B7D> <803D> <0B7E> <80C6> <0B7F> <86CB> <0B80> <8A95> <0B81> <935B> <0B82> <56E3> <0B83> <58C7> <0B84> <5F3E> endbfchar 100 beginbfchar <0B85> <65AD> <0B86> <6696> <0B87> <6A80> <0B88> <6BB5> <0B89> <7537> <0B8A> <8AC7> <0B8B> <5024> <0B8C> <77E5> <0B8D> <5730> <0B8E> <5F1B> <0B8F> <6065> <0B90> <667A> <0B91> <6C60> <0B92> <75F4> <0B93> <7A1A> <0B94> <7F6E> <0B95> <81F4> <0B96> <8718> <0B97> <9045> <0B98> <99B3> <0B99> <7BC9> <0B9A> <755C> <0B9B> <7AF9> <0B9C> <7B51> <0B9D> <84C4> <0B9E> <9010> <0B9F> <79E9> <0BA0> <7A92> <0BA1> <8336> <0BA2> <5AE1> <0BA3> <7740> <0BA4> <4E2D> <0BA5> <4EF2> <0BA6> <5B99> <0BA7> <5FE0> <0BA8> <62BD> <0BA9> <663C> <0BAA> <67F1> <0BAB> <6CE8> <0BAC> <866B> <0BAD> <8877> <0BAE> <8A3B> <0BAF> <914E> <0BB0> <92F3> <0BB1> <99D0> <0BB2> <6A17> <0BB3> <7026> <0BB4> <732A> <0BB5> <82E7> <0BB6> <8457> <0BB7> <8CAF> <0BB8> <4E01> <0BB9> <5146> <0BBA> <51CB> <0BBB> <558B> <0BBC> <5BF5> <0BBD> <5E16> <0BBE> <5E33> <0BBF> <5E81> <0BC0> <5F14> <0BC1> <5F35> <0BC2> <5F6B> <0BC3> <5FB4> <0BC4> <61F2> <0BC5> <6311> <0BC6> <66A2> <0BC7> <671D> <0BC8> <6F6E> <0BC9> <7252> <0BCA> <753A> <0BCB> <773A> <0BCC> <8074> <0BCD> <8139> <0BCE> <8178> <0BCF> <8776> <0BD0> <8ABF> <0BD1> <8ADC> <0BD2> <8D85> <0BD3> <8DF3> <0BD4> <929A> <0BD5> <9577> <0BD6> <9802> <0BD7> <9CE5> <0BD8> <52C5> <0BD9> <6357> <0BDA> <76F4> <0BDB> <6715> <0BDC> <6C88> <0BDD> <73CD> <0BDE> <8CC3> <0BDF> <93AE> <0BE0> <9673> <0BE1> <6D25> <0BE2> <589C> <0BE3> <690E> <0BE4> <69CC> <0BE5> <8FFD> <0BE6> <939A> <0BE7> <75DB> <0BE8> <901A> endbfchar 100 beginbfchar <0BE9> <585A> <0BEA> <6802> <0BEB> <63B4> <0BEC> <69FB> <0BED> <4F43> <0BEE> <6F2C> <0BEF> <67D8> <0BF0> <8FBB> <0BF1> <8526> <0BF2> <7DB4> <0BF3> <9354> <0BF4> <693F> <0BF5> <6F70> <0BF6> <576A> <0BF7> <58F7> <0BF8> <5B2C> <0BF9> <7D2C> <0BFA> <722A> <0BFB> <540A> <0BFC> <91E3> <0BFD> <9DB4> <0BFE> <4EAD> <0BFF> <4F4E> <0C00> <505C> <0C01> <5075> <0C02> <5243> <0C03> <8C9E> <0C04> <5448> <0C05> <5824> <0C06> <5B9A> <0C07> <5E1D> <0C08> <5E95> <0C09> <5EAD> <0C0A> <5EF7> <0C0B> <5F1F> <0C0C> <608C> <0C0D> <62B5> <0C0E> <633A> <0C0F> <63D0> <0C10> <68AF> <0C11> <6C40> <0C12> <7887> <0C13> <798E> <0C14> <7A0B> <0C15> <7DE0> <0C16> <8247> <0C17> <8A02> <0C18> <8AE6> <0C19> <8E44> <0C1A> <9013> <0C1B> <90B8> <0C1C> <912D> <0C1D> <91D8> <0C1E> <9F0E> <0C1F> <6CE5> <0C20> <6458> <0C21> <64E2> <0C22> <6575> <0C23> <6EF4> <0C24> <7684> <0C25> <7B1B> <0C26> <9069> <0C27> <93D1> <0C28> <6EBA> <0C29> <54F2> <0C2A> <5FB9> <0C2B> <64A4> <0C2C> <8F4D> <0C2D> <8FED> <0C2E> <9244> <0C2F> <5178> <0C30> <586B> <0C31> <5929> <0C32> <5C55> <0C33> <5E97> <0C34> <6DFB> <0C35> <7E8F> <0C36> <751C> <0C37> <8CBC> <0C38> <8EE2> <0C39> <985B> <0C3A> <70B9> <0C3B> <4F1D> <0C3C> <6BBF> <0C3D> <6FB1> <0C3E> <7530> <0C3F> <96FB> <0C40> <514E> <0C41> <5410> <0C42> <5835> <0C43> <5857> <0C44> <59AC> <0C45> <5C60> <0C46> <5F92> <0C47> <6597> <0C48> <675C> <0C49> <6E21> <0C4A> <767B> <0C4B> <83DF> <0C4C> <8CED> endbfchar 100 beginbfchar <0C4D> <9014> <0C4E> <90FD> <0C4F> <934D> <0C50> <7825> <0C51> <783A> <0C52> <52AA> <0C53> <5EA6> <0C54> <571F> <0C55> <5974> <0C56> <6012> <0C57> <5012> <0C58> <515A> <0C59> <51AC> <0C5A> <51CD> <0C5B> <5200> <0C5C> <5510> <0C5D> <5854> <0C5E> <5858> <0C5F> <5957> <0C60> <5B95> <0C61> <5CF6> <0C62> <5D8B> <0C63> <60BC> <0C64> <6295> <0C65> <642D> <0C66> <6771> <0C67> <6843> <0C68> <68BC> <0C69> <68DF> <0C6A> <76D7> <0C6B> <6DD8> <0C6C> <6E6F> <0C6D> <6D9B> <0C6E> <706F> <0C6F> <71C8> <0C70> <5F53> <0C71> <75D8> <0C72> <7977> <0C73> <7B49> <0C74> <7B54> <0C75> <7B52> <0C76> <7CD6> <0C77> <7D71> <0C78> <5230> <0C79> <8463> <0C7A> <8569> <0C7B> <85E4> <0C7C> <8A0E> <0C7D> <8B04> <0C7E> <8C46> <0C7F> <8E0F> <0C80> <9003> <0C81> <900F> <0C82> <9419> <0C83> <9676> <0C84> <982D> <0C85> <9A30> <0C86> <95D8> <0C87> <50CD> <0C88> <52D5> <0C89> <540C> <0C8A> <5802> <0C8B> <5C0E> <0C8C> <61A7> <0C8D> <649E> <0C8E> <6D1E> <0C8F> <77B3> <0C90> <7AE5> <0C91> <80F4> <0C92> <8404> <0C93> <9053> <0C94> <9285> <0C95> <5CE0> <0C96> <9D07> <0C97> <533F> <0C98> <5F97> <0C99> <5FB3> <0C9A> <6D9C> <0C9B> <7279> <0C9C> <7763> <0C9D> <79BF> <0C9E> <7BE4> <0C9F> <6BD2> <0CA0> <72EC> <0CA1> <8AAD> <0CA2> <6803> <0CA3> <6A61> <0CA4> <51F8> <0CA5> <7A81> <0CA6> <6934> <0CA7> <5C4A> <0CA8> <9CF6> <0CA9> <82EB> <0CAA> <5BC5> <0CAB> <9149> <0CAC> <701E> <0CAD> <5678> <0CAE> <5C6F> <0CAF> <60C7> <0CB0> <6566> endbfchar 100 beginbfchar <0CB1> <6C8C> <0CB2> <8C5A> <0CB3> <9041> <0CB4> <9813> <0CB5> <5451> <0CB6> <66C7> <0CB7> <920D> <0CB8> <5948> <0CB9> <90A3> <0CBA> <5185> <0CBB> <4E4D> <0CBC> <51EA> <0CBD> <8599> <0CBE> <8B0E> <0CBF> <7058> <0CC0> <637A> <0CC1> <934B> <0CC2> <6962> <0CC3> <99B4> <0CC4> <7E04> <0CC5> <7577> <0CC6> <5357> <0CC7> <6960> <0CC8> <8EDF> <0CC9> <96E3> <0CCA> <6C5D> <0CCB> <4E8C> <0CCC> <5C3C> <0CCD> <5F10> <0CCE> <8FE9> <0CCF> <5302> <0CD0> <8CD1> <0CD1> <8089> <0CD2> <8679> <0CD3> <5EFF> <0CD4> <65E5> <0CD5> <4E73> <0CD6> <5165> <0CD7> <5982> <0CD8> <5C3F> <0CD9> <97EE> <0CDA> <4EFB> <0CDB> <598A> <0CDC> <5FCD> <0CDD> <8A8D> <0CDE> <6FE1> <0CDF> <79B0> <0CE0> <7962> <0CE1> <5BE7> <0CE2> <8471> <0CE3> <732B> <0CE4> <71B1> <0CE5> <5E74> <0CE6> <5FF5> <0CE7> <637B> <0CE8> <649A> <0CE9> <71C3> <0CEA> <7C98> <0CEB> <4E43> <0CEC> <5EFC> <0CED> <4E4B> <0CEE> <57DC> <0CEF> <56A2> <0CF0> <60A9> <0CF1> <6FC3> <0CF2> <7D0D> <0CF3> <80FD> <0CF4> <8133> <0CF5> <81BF> <0CF6> <8FB2> <0CF7> <8997> <0CF8> <86A4> <0CF9> <5DF4> <0CFA> <628A> <0CFB> <64AD> <0CFC> <8987> <0CFD> <6777> <0CFE> <6CE2> <0CFF> <6D3E> <0D00> <7436> <0D01> <7834> <0D02> <5A46> <0D03> <7F75> <0D04> <82AD> <0D05> <99AC> <0D06> <4FF3> <0D07> <5EC3> <0D08> <62DD> <0D09> <6392> <0D0A> <6557> <0D0B> <676F> <0D0C> <76C3> <0D0D> <724C> <0D0E> <80CC> <0D0F> <80BA> <0D10> <8F29> <0D11> <914D> <0D12> <500D> <0D13> <57F9> <0D14> <5A92> endbfchar 100 beginbfchar <0D15> <6885> <0D16> <6973> <0D17> <7164> <0D18> <72FD> <0D19> <8CB7> <0D1A> <58F2> <0D1B> <8CE0> <0D1C> <966A> <0D1D> <9019> <0D1E> <877F> <0D1F> <79E4> <0D20> <77E7> <0D21> <8429> <0D22> <4F2F> <0D23> <5265> <0D24> <535A> <0D25> <62CD> <0D26> <67CF> <0D27> <6CCA> <0D28> <767D> <0D29> <7B94> <0D2A> <7C95> <0D2B> <8236> <0D2C> <8584> <0D2D> <8FEB> <0D2E> <66DD> <0D2F> <6F20> <0D30> <7206> <0D31> <7E1B> <0D32> <83AB> <0D33> <99C1> <0D34> <9EA6> <0D35> <51FD> <0D36> <7BB1> <0D37> <7872> <0D38> <7BB8> <0D39> <8087> <0D3A> <7B48> <0D3B> <6AE8> <0D3C> <5E61> <0D3D> <808C> <0D3E> <7551> <0D3F> <7560> <0D40> <516B> <0D41> <9262> <0D42> <6E8C> <0D43> <767A> <0D44> <9197> <0D45> <9AEA> <0D46> <4F10> <0D47> <7F70> <0D48> <629C> <0D49> <7B4F> <0D4A> <95A5> <0D4B> <9CE9> <0D4C> <567A> <0D4D> <5859> <0D4E> <86E4> <0D4F> <96BC> <0D50> <4F34> <0D51> <5224> <0D52> <534A> <0D53> <53CD> <0D54> <53DB> <0D55> <5E06> <0D56> <642C> <0D57> <6591> <0D58> <677F> <0D59> <6C3E> <0D5A> <6C4E> <0D5B> <7248> <0D5C> <72AF> <0D5D> <73ED> <0D5E> <7554> <0D5F> <7E41> <0D60> <822C> <0D61> <85E9> <0D62> <8CA9> <0D63> <7BC4> <0D64> <91C6> <0D65> <7169> <0D66> <9812> <0D67> <98EF> <0D68> <633D> <0D69> <6669> <0D6A> <756A> <0D6B> <76E4> <0D6C> <78D0> <0D6D> <8543> <0D6E> <86EE> <0D6F> <532A> <0D70> <5351> <0D71> <5426> <0D72> <5983> <0D73> <5E87> <0D74> <5F7C> <0D75> <60B2> <0D76> <6249> <0D77> <6279> <0D78> <62AB> endbfchar 100 beginbfchar <0D79> <6590> <0D7A> <6BD4> <0D7B> <6CCC> <0D7C> <75B2> <0D7D> <76AE> <0D7E> <7891> <0D7F> <79D8> <0D80> <7DCB> <0D81> <7F77> <0D82> <80A5> <0D83> <88AB> <0D84> <8AB9> <0D85> <8CBB> <0D86> <907F> <0D87> <975E> <0D88> <98DB> <0D89> <6A0B> <0D8A> <7C38> <0D8B> <5099> <0D8C> <5C3E> <0D8D> <5FAE> <0D8E> <6787> <0D8F> <6BD8> <0D90> <7435> <0D91> <7709> <0D92> <7F8E> <0D93> <9F3B> <0D94> <67CA> <0D95> <7A17> <0D96> <5339> <0D97> <758B> <0D98> <9AED> <0D99> <5F66> <0D9A> <819D> <0D9B> <83F1> <0D9C> <8098> <0D9D> <5F3C> <0D9E> <5FC5> <0D9F> <7562> <0DA0> <7B46> <0DA1> <903C> <0DA2> <6867> <0DA3> <59EB> <0DA4> <5A9B> <0DA5> <7D10> <0DA6> <767E> <0DA7> <8B2C> <0DA8> <4FF5> <0DA9> <5F6A> <0DAA> <6A19> <0DAB> <6C37> <0DAC> <6F02> <0DAD> <74E2> <0DAE> <7968> <0DAF> <8868> <0DB0> <8A55> <0DB1> <8C79> <0DB2> <5EDF> <0DB3> <63CF> <0DB4> <75C5> <0DB5> <79D2> <0DB6> <82D7> <0DB7> <9328> <0DB8> <92F2> <0DB9> <849C> <0DBA> <86ED> <0DBB> <9C2D> <0DBC> <54C1> <0DBD> <5F6C> <0DBE> <658C> <0DBF> <6D5C> <0DC0> <7015> <0DC1> <8CA7> <0DC2> <8CD3> <0DC3> <983B> <0DC4> <654F> <0DC5> <74F6> <0DC6> <4E0D> <0DC7> <4ED8> <0DC8> <57E0> <0DC9> <592B> <0DCA> <5A66> <0DCB> <5BCC> <0DCC> <51A8> <0DCD> <5E03> <0DCE> <5E9C> <0DCF> <6016> <0DD0> <6276> <0DD1> <6577> <0DD2> <65A7> <0DD3> <666E> <0DD4> <6D6E> <0DD5> <7236> <0DD6> <7B26> <0DD7> <8150> <0DD8> <819A> <0DD9> <8299> <0DDA> <8B5C> <0DDB> <8CA0> <0DDC> <8CE6> endbfchar 100 beginbfchar <0DDD> <8D74> <0DDE> <961C> <0DDF> <9644> <0DE0> <4FAE> <0DE1> <64AB> <0DE2> <6B66> <0DE3> <821E> <0DE4> <8461> <0DE5> <856A> <0DE6> <90E8> <0DE7> <5C01> <0DE8> <6953> <0DE9> <98A8> <0DEA> <847A> <0DEB> <8557> <0DEC> <4F0F> <0DED> <526F> <0DEE> <5FA9> <0DEF> <5E45> <0DF0> <670D> <0DF1> <798F> <0DF2> <8179> <0DF3> <8907> <0DF4> <8986> <0DF5> <6DF5> <0DF6> <5F17> <0DF7> <6255> <0DF8> <6CB8> <0DF9> <4ECF> <0DFA> <7269> <0DFB> <9B92> <0DFC> <5206> <0DFD> <543B> <0DFE> <5674> <0DFF> <58B3> <0E00> <61A4> <0E01> <626E> <0E02> <711A> <0E03> <596E> <0E04> <7C89> <0E05> <7CDE> <0E06> <7D1B> <0E07> <96F0> <0E08> <6587> <0E09> <805E> <0E0A> <4E19> <0E0B> <4F75> <0E0C> <5175> <0E0D> <5840> <0E0E> <5E63> <0E0F> <5E73> <0E10> <5F0A> <0E11> <67C4> <0E12> <4E26> <0E13> <853D> <0E14> <9589> <0E15> <965B> <0E16> <7C73> <0E17> <9801> <0E18> <50FB> <0E19> <58C1> <0E1A> <7656> <0E1B> <78A7> <0E1C> <5225> <0E1D> <77A5> <0E1E> <8511> <0E1F> <7B86> <0E20> <504F> <0E21> <5909> <0E22> <7247> <0E23> <7BC7> <0E24> <7DE8> <0E25> <8FBA> <0E26> <8FD4> <0E27> <904D> <0E28> <4FBF> <0E29> <52C9> <0E2A> <5A29> <0E2B> <5F01> <0E2C> <97AD> <0E2D> <4FDD> <0E2E> <8217> <0E2F> <92EA> <0E30> <5703> <0E31> <6355> <0E32> <6B69> <0E33> <752B> <0E34> <88DC> <0E35> <8F14> <0E36> <7A42> <0E37> <52DF> <0E38> <5893> <0E39> <6155> <0E3A> <620A> <0E3B> <66AE> <0E3C> <6BCD> <0E3D> <7C3F> <0E3E> <83E9> <0E3F> <5023> <0E40> <4FF8> endbfchar 100 beginbfchar <0E41> <5305> <0E42> <5446> <0E43> <5831> <0E44> <5949> <0E45> <5B9D> <0E46> <5CF0> <0E47> <5CEF> <0E48> <5D29> <0E49> <5E96> <0E4A> <62B1> <0E4B> <6367> <0E4C> <653E> <0E4D> <65B9> <0E4E> <670B> <0E4F> <6CD5> <0E50> <6CE1> <0E51> <70F9> <0E52> <7832> <0E53> <7E2B> <0E54> <80DE> <0E55> <82B3> <0E56> <840C> <0E57> <84EC> <0E58> <8702> <0E59> <8912> <0E5A> <8A2A> <0E5B> <8C4A> <0E5C> <90A6> <0E5D> <92D2> <0E5E> <98FD> <0E5F> <9CF3> <0E60> <9D6C> <0E61> <4E4F> <0E62> <4EA1> <0E63> <508D> <0E64> <5256> <0E65> <574A> <0E66> <59A8> <0E67> <5E3D> <0E6A> <623F> <0E6B> <66B4> <0E6C> <671B> <0E6D> <67D0> <0E6E> <68D2> <0E6F> <5192> <0E70> <7D21> <0E71> <80AA> <0E72> <81A8> <0E73> <8B00> <0E74> <8C8C> <0E75> <8CBF> <0E76> <927E> <0E77> <9632> <0E78> <5420> <0E79> <982C> <0E7A> <5317> <0E7B> <50D5> <0E7C> <535C> <0E7D> <58A8> <0E7E> <64B2> <0E7F> <6734> <0E80> <7267> <0E81> <7766> <0E82> <7A46> <0E83> <91E6> <0E84> <52C3> <0E85> <6CA1> <0E86> <6B86> <0E87> <5800> <0E88> <5E4C> <0E89> <5954> <0E8A> <672C> <0E8B> <7FFB> <0E8C> <51E1> <0E8D> <76C6> <0E8E> <6469> <0E8F> <78E8> <0E90> <9B54> <0E91> <9EBB> <0E92> <57CB> <0E93> <59B9> <0E94> <6627> <0E95> <679A> <0E96> <6BCE> <0E97> <54E9> <0E98> <69D9> <0E99> <5E55> <0E9A> <819C> <0E9B> <6795> <0E9C> <9BAA> <0E9D> <67FE> <0E9E> <9C52> <0E9F> <685D> <0EA0> <4EA6> <0EA1> <4FE3> <0EA2> <53C8> <0EA3> <62B9> <0EA4> <672B> <0EA5> <6CAB> <0EA6> <8FC4> endbfchar 100 beginbfchar <0EA7> <4FAD> <0EA8> <7E6D> <0EA9> <9EBF> <0EAA> <4E07> <0EAB> <6162> <0EAC> <6E80> <0EAD> <6F2B> <0EAE> <8513> <0EAF> <5473> <0EB0> <672A> <0EB1> <9B45> <0EB2> <5DF3> <0EB3> <7B95> <0EB4> <5CAC> <0EB5> <5BC6> <0EB6> <871C> <0EB7> <6E4A> <0EB8> <84D1> <0EB9> <7A14> <0EBA> <8108> <0EBB> <5999> <0EBC> <7C8D> <0EBD> <6C11> <0EBE> <7720> <0EBF> <52D9> <0EC0> <5922> <0EC1> <7121> <0EC2> <725F> <0EC3> <77DB> <0EC4> <9727> <0EC5> <9D61> <0EC6> <690B> <0EC7> <5A7F> <0EC8> <5A18> <0EC9> <51A5> <0ECA> <540D> <0ECB> <547D> <0ECC> <660E> <0ECD> <76DF> <0ECE> <8FF7> <0ECF> <9298> <0ED0> <9CF4> <0ED1> <59EA> <0ED2> <725D> <0ED3> <6EC5> <0ED4> <514D> <0ED5> <68C9> <0ED6> <7DBF> <0ED7> <7DEC> <0ED8> <9762> <0ED9> <9EBA> <0EDA> <6478> <0EDB> <6A21> <0EDC> <8302> <0EDD> <5984> <0EDE> <5B5F> <0EDF> <6BDB> <0EE0> <731B> <0EE1> <76F2> <0EE2> <7DB2> <0EE3> <8017> <0EE4> <8499> <0EE5> <5132> <0EE6> <6728> <0EE7> <9ED9> <0EE8> <76EE> <0EE9> <6762> <0EEA> <52FF> <0EEB> <9905> <0EEC> <5C24> <0EED> <623B> <0EEE> <7C7E> <0EEF> <8CB0> <0EF0> <554F> <0EF1> <60B6> <0EF2> <7D0B> <0EF3> <9580> <0EF4> <5301> <0EF5> <4E5F> <0EF6> <51B6> <0EF7> <591C> <0EF8> <723A> <0EF9> <8036> <0EFA> <91CE> <0EFB> <5F25> <0EFC> <77E2> <0EFD> <5384> <0EFE> <5F79> <0EFF> <7D04> <0F00> <85AC> <0F01> <8A33> <0F02> <8E8D> <0F03> <9756> <0F04> <67F3> <0F05> <85AE> <0F06> <9453> <0F07> <6109> <0F08> <6108> <0F09> <6CB9> <0F0A> <7652> endbfchar 100 beginbfchar <0F0B> <8AED> <0F0C> <8F38> <0F0D> <552F> <0F0E> <4F51> <0F0F> <512A> <0F10> <52C7> <0F11> <53CB> <0F12> <5BA5> <0F13> <5E7D> <0F14> <60A0> <0F15> <6182> <0F16> <63D6> <0F17> <6709> <0F18> <67DA> <0F19> <6E67> <0F1A> <6D8C> <0F1D> <7531> <0F1E> <7950> <0F1F> <88D5> <0F20> <8A98> <0F21> <904A> <0F22> <9091> <0F23> <90F5> <0F24> <96C4> <0F25> <878D> <0F26> <5915> <0F27> <4E88> <0F28> <4F59> <0F29> <4E0E> <0F2A> <8A89> <0F2B> <8F3F> <0F2C> <9810> <0F2D> <50AD> <0F2E> <5E7C> <0F2F> <5996> <0F30> <5BB9> <0F31> <5EB8> <0F32> <63DA> <0F33> <63FA> <0F34> <64C1> <0F35> <66DC> <0F36> <694A> <0F37> <69D8> <0F38> <6D0B> <0F39> <6EB6> <0F3A> <7194> <0F3B> <7528> <0F3C> <7AAF> <0F3D> <7F8A> <0F3E> <8000> <0F3F> <8449> <0F40> <84C9> <0F41> <8981> <0F42> <8B21> <0F43> <8E0A> <0F44> <9065> <0F45> <967D> <0F46> <990A> <0F47> <617E> <0F48> <6291> <0F49> <6B32> <0F4A> <6C83> <0F4B> <6D74> <0F4C> <7FCC> <0F4D> <7FFC> <0F4E> <6DC0> <0F4F> <7F85> <0F50> <87BA> <0F51> <88F8> <0F52> <6765> <0F53> <83B1> <0F54> <983C> <0F55> <96F7> <0F56> <6D1B> <0F57> <7D61> <0F58> <843D> <0F59> <916A> <0F5A> <4E71> <0F5B> <5375> <0F5C> <5D50> <0F5D> <6B04> <0F5E> <6FEB> <0F5F> <85CD> <0F60> <862D> <0F61> <89A7> <0F62> <5229> <0F63> <540F> <0F64> <5C65> <0F65> <674E> <0F66> <68A8> <0F67> <7406> <0F68> <7483> <0F69> <75E2> <0F6A> <88CF> <0F6B> <88E1> <0F6C> <91CC> <0F6D> <96E2> <0F6E> <9678> <0F6F> <5F8B> <0F70> <7387> endbfchar 100 beginbfchar <0F71> <7ACB> <0F72> <844E> <0F73> <63A0> <0F74> <7565> <0F75> <5289> <0F76> <6D41> <0F77> <6E9C> <0F78> <7409> <0F79> <7559> <0F7A> <786B> <0F7B> <7C92> <0F7C> <9686> <0F7D> <7ADC> <0F7E> <9F8D> <0F7F> <4FB6> <0F80> <616E> <0F81> <65C5> <0F82> <865C> <0F83> <4E86> <0F84> <4EAE> <0F85> <50DA> <0F86> <4E21> <0F87> <51CC> <0F88> <5BEE> <0F89> <6599> <0F8A> <6881> <0F8B> <6DBC> <0F8C> <731F> <0F8D> <7642> <0F8E> <77AD> <0F8F> <7A1C> <0F90> <7CE7> <0F91> <826F> <0F92> <8AD2> <0F93> <907C> <0F94> <91CF> <0F95> <9675> <0F96> <9818> <0F97> <529B> <0F98> <7DD1> <0F99> <502B> <0F9A> <5398> <0F9B> <6797> <0F9C> <6DCB> <0F9D> <71D0> <0F9E> <7433> <0F9F> <81E8> <0FA0> <8F2A> <0FA1> <96A3> <0FA2> <9C57> <0FA3> <9E9F> <0FA4> <7460> <0FA5> <5841> <0FA6> <6D99> <0FA7> <7D2F> <0FA8> <985E> <0FA9> <4EE4> <0FAA> <4F36> <0FAB> <4F8B> <0FAC> <51B7> <0FAD> <52B1> <0FAE> <5DBA> <0FAF> <601C> <0FB0> <73B2> <0FB1> <793C> <0FB2> <82D3> <0FB3> <9234> <0FB4> <96B7> <0FB5> <96F6> <0FB6> <970A> <0FB7> <9E97> <0FB8> <9F62> <0FB9> <66A6> <0FBA> <6B74> <0FBB> <5217> <0FBC> <52A3> <0FBD> <70C8> <0FBE> <88C2> <0FBF> <5EC9> <0FC0> <604B> <0FC1> <6190> <0FC2> <6F23> <0FC3> <7149> <0FC4> <7C3E> <0FC5> <7DF4> <0FC6> <806F> <0FC7> <84EE> <0FC8> <9023> <0FC9> <932C> <0FCA> <5442> <0FCB> <9B6F> <0FCC> <6AD3> <0FCD> <7089> <0FCE> <8CC2> <0FCF> <8DEF> <0FD0> <9732> <0FD1> <52B4> <0FD2> <5A41> <0FD3> <5ECA> <0FD4> <5F04> endbfchar 100 beginbfchar <0FD5> <6717> <0FD6> <697C> <0FD7> <6994> <0FD8> <6D6A> <0FD9> <6F0F> <0FDA> <7262> <0FDB> <72FC> <0FDC> <7BED> <0FDD> <8001> <0FDE> <807E> <0FDF> <874B> <0FE0> <90CE> <0FE1> <516D> <0FE2> <9E93> <0FE3> <7984> <0FE4> <808B> <0FE5> <9332> <0FE6> <8AD6> <0FE7> <502D> <0FE8> <548C> <0FE9> <8A71> <0FEA> <6B6A> <0FEB> <8CC4> <0FEC> <8107> <0FED> <60D1> <0FEE> <67A0> <0FEF> <9DF2> <0FF0> <4E99> <0FF1> <4E98> <0FF2> <9C10> <0FF3> <8A6B> <0FF4> <85C1> <0FF5> <8568> <0FF6> <6900> <0FF7> <6E7E> <0FF8> <7897> <0FF9> <8155> <0FFA> <5F0C> <0FFB> <4E10> <0FFC> <4E15> <0FFD> <4E2A> <0FFE> <4E31> <0FFF> <4E36> <1000> <4E3C> <1001> <4E3F> <1002> <4E42> <1003> <4E56> <1004> <4E58> <1005> <4E82> <1006> <4E85> <1007> <8C6B> <1008> <4E8A> <1009> <8212> <100A> <5F0D> <100B> <4E8E> <100F> <4EA2> <1010> <4EB0> <1011> <4EB3> <1012> <4EB6> <1013> <4ECE> <1014> <4ECD> <1015> <4EC4> <1016> <4EC6> <1017> <4EC2> <1018> <4ED7> <1019> <4EDE> <101A> <4EED> <101B> <4EDF> <101C> <4EF7> <101D> <4F09> <101E> <4F5A> <101F> <4F30> <1020> <4F5B> <1021> <4F5D> <1022> <4F57> <1023> <4F47> <1024> <4F76> <1025> <4F88> <1026> <4F8F> <1027> <4F98> <1028> <4F7B> <1029> <4F69> <102A> <4F70> <102B> <4F91> <102C> <4F6F> <102D> <4F86> <102E> <4F96> <102F> <5118> <1030> <4FD4> <1031> <4FDF> <1032> <4FCE> <1033> <4FD8> <1034> <4FDB> <1035> <4FD1> <1036> <4FDA> <1037> <4FD0> <103A> <501A> <103B> <5028> <103C> <5014> <103D> <502A> endbfchar 100 beginbfchar <103E> <5025> <103F> <5005> <1040> <4F1C> <1041> <4FF6> <1042> <5021> <1043> <5029> <1044> <502C> <1045> <4FFE> <1046> <4FEF> <1047> <5011> <1048> <5006> <1049> <5043> <104A> <5047> <104B> <6703> <104C> <5055> <104D> <5050> <104E> <5048> <104F> <505A> <1050> <5056> <1051> <506C> <1052> <5078> <1053> <5080> <1054> <509A> <1055> <5085> <1056> <50B4> <1057> <50B2> <105A> <50B3> <105B> <50C2> <105C> <50D6> <105D> <50DE> <105E> <50E5> <105F> <50ED> <1060> <50E3> <1061> <50EE> <1062> <50F9> <1063> <50F5> <1064> <5109> <1067> <5116> <1068> <5115> <1069> <5114> <106A> <511A> <106B> <5121> <106C> <513A> <106D> <5137> <106E> <513C> <106F> <513B> <1072> <5152> <1073> <514C> <1074> <5154> <1075> <5162> <1076> <7AF8> <1079> <516E> <107A> <5180> <107B> <5182> <107C> <56D8> <107D> <518C> <107E> <5189> <107F> <518F> <1080> <5191> <1081> <5193> <1084> <51A4> <1085> <51A6> <1086> <51A2> <108A> <51B3> <108D> <51B0> <108E> <51B5> <108F> <51BD> <1090> <51C5> <1091> <51C9> <1092> <51DB> <1093> <51E0> <1094> <8655> <1095> <51E9> <1096> <51ED> <1097> <51F0> <1098> <51F5> <1099> <51FE> <109A> <5204> <109B> <520B> <109C> <5214> <109D> <520E> <109E> <5227> <109F> <522A> <10A0> <522E> <10A1> <5233> <10A2> <5239> <10A3> <524F> <10A4> <5244> <10A7> <525E> <10A8> <5254> <10A9> <526A> <10AA> <5274> <10AB> <5269> <10AC> <5273> <10AD> <527F> <10AE> <527D> <10AF> <528D> <10B0> <5294> <10B1> <5292> <10B2> <5271> endbfchar 100 beginbfchar <10B3> <5288> <10B4> <5291> <10B5> <8FA8> <10B6> <8FA7> <10B9> <52BC> <10BA> <52B5> <10BB> <52C1> <10BC> <52CD> <10BD> <52D7> <10BE> <52DE> <10BF> <52E3> <10C0> <52E6> <10C1> <98ED> <10C2> <52E0> <10C3> <52F3> <10C4> <52F5> <10C7> <5306> <10C8> <5308> <10C9> <7538> <10CA> <530D> <10CB> <5310> <10CC> <530F> <10CD> <5315> <10CE> <531A> <10CF> <5323> <10D0> <532F> <10D1> <5331> <10D2> <5333> <10D3> <5338> <10D4> <5340> <10D5> <5346> <10D6> <5345> <10D7> <4E17> <10D8> <5349> <10D9> <534D> <10DA> <51D6> <10DB> <535E> <10DC> <5369> <10DD> <536E> <10DE> <5918> <10DF> <537B> <10E0> <5377> <10E1> <5382> <10E2> <5396> <10E3> <53A0> <10E4> <53A6> <10E5> <53A5> <10E6> <53AE> <10E7> <53B0> <10E8> <53B6> <10E9> <53C3> <10EA> <7C12> <10EB> <96D9> <10EC> <53DF> <10ED> <66FC> <10EE> <71EE> <10EF> <53EE> <10F0> <53E8> <10F1> <53ED> <10F2> <53FA> <10F3> <5401> <10F4> <543D> <10F5> <5440> <10F8> <543C> <10F9> <542E> <10FA> <5436> <10FB> <5429> <10FC> <541D> <10FD> <544E> <10FE> <548F> <10FF> <5475> <1100> <548E> <1101> <545F> <1102> <5471> <1103> <5477> <1104> <5470> <1105> <5492> <1106> <547B> <1107> <5480> <1108> <5476> <1109> <5484> <110A> <5490> <110B> <5486> <110C> <54C7> <110D> <54A2> <110E> <54B8> <110F> <54A5> <1110> <54AC> <1111> <54C4> <1112> <54C8> <1113> <54A8> <1114> <54AB> <1115> <54C2> <1116> <54A4> <1117> <54BE> <1118> <54BC> <1119> <54D8> <111C> <550F> <111D> <5514> <111E> <54FD> endbfchar 100 beginbfchar <111F> <54EE> <1120> <54ED> <1121> <54FA> <1122> <54E2> <1123> <5539> <1124> <5540> <1125> <5563> <1126> <554C> <1127> <552E> <1128> <555C> <1129> <5545> <112C> <5538> <112D> <5533> <112E> <555D> <112F> <5599> <1130> <5580> <1131> <54AF> <1132> <558A> <1133> <559F> <1134> <557B> <1135> <557E> <1136> <5598> <1137> <559E> <1138> <55AE> <1139> <557C> <113A> <5583> <113B> <55A9> <113C> <5587> <113D> <55A8> <113E> <55DA> <113F> <55C5> <1140> <55DF> <1141> <55C4> <1142> <55DC> <1143> <55E4> <1144> <55D4> <1145> <5614> <1146> <55F7> <1147> <5616> <1148> <55FE> <1149> <55FD> <114A> <561B> <114B> <55F9> <114C> <564E> <114D> <5650> <114E> <71DF> <114F> <5634> <1150> <5636> <1151> <5632> <1152> <5638> <1153> <566B> <1154> <5664> <1155> <562F> <1156> <566C> <1157> <566A> <1158> <5686> <1159> <5680> <115A> <568A> <115B> <56A0> <115C> <5694> <115D> <568F> <115E> <56A5> <115F> <56AE> <1160> <56B6> <1161> <56B4> <1162> <56C2> <1163> <56BC> <1164> <56C1> <1165> <56C3> <1166> <56C0> <1167> <56C8> <1168> <56CE> <1169> <56D1> <116A> <56D3> <116B> <56D7> <116C> <56EE> <116D> <56F9> <116E> <5700> <116F> <56FF> <1170> <5704> <1171> <5709> <1172> <5708> <1173> <570B> <1174> <570D> <1175> <5713> <1176> <5718> <1177> <5716> <1178> <55C7> <1179> <571C> <117A> <5726> <117D> <574E> <117E> <573B> <117F> <5740> <1180> <574F> <1181> <5769> <1182> <57C0> <1183> <5788> <1184> <5761> <1185> <577F> <1186> <5789> endbfchar 100 beginbfchar <1187> <5793> <1188> <57A0> <1189> <57B3> <118A> <57A4> <118B> <57AA> <118C> <57B0> <118D> <57C3> <118E> <57C6> <118F> <57D4> <1192> <580A> <1193> <57D6> <1194> <57E3> <1195> <580B> <1196> <5819> <1197> <581D> <1198> <5872> <1199> <5821> <119A> <5862> <119B> <584B> <119C> <5870> <119D> <6BC0> <119E> <5852> <119F> <583D> <11A0> <5879> <11A1> <5885> <11A2> <58B9> <11A3> <589F> <11A4> <58AB> <11A5> <58BA> <11A6> <58DE> <11A7> <58BB> <11A8> <58B8> <11A9> <58AE> <11AA> <58C5> <11AB> <58D3> <11AC> <58D1> <11AD> <58D7> <11AE> <58D9> <11AF> <58D8> <11B0> <58E5> <11B1> <58DC> <11B2> <58E4> <11B3> <58DF> <11B4> <58EF> <11B5> <58FA> <11B6> <58F9> <11BA> <5902> <11BB> <590A> <11BC> <5910> <11BD> <591B> <11BE> <68A6> <11BF> <5925> <11C2> <5932> <11C3> <5938> <11C4> <593E> <11C5> <7AD2> <11C6> <5955> <11C7> <5950> <11C8> <594E> <11C9> <595A> <11CA> <5958> <11CB> <5962> <11CC> <5960> <11CD> <5967> <11CE> <596C> <11CF> <5969> <11D0> <5978> <11D1> <5981> <11D2> <599D> <11D3> <4F5E> <11D4> <4FAB> <11D5> <59A3> <11D6> <59B2> <11D7> <59C6> <11D8> <59E8> <11D9> <59DC> <11DA> <598D> <11DD> <5A25> <11DE> <5A1F> <11DF> <5A11> <11E0> <5A1C> <11E1> <5A09> <11E2> <5A1A> <11E3> <5A40> <11E4> <5A6C> <11E5> <5A49> <11E8> <5A62> <11E9> <5A6A> <11EA> <5A9A> <11EB> <5ABC> <11EC> <5ABE> <11ED> <5ACB> <11EE> <5AC2> <11EF> <5ABD> <11F0> <5AE3> <11F1> <5AD7> <11F2> <5AE6> <11F3> <5AE9> <11F4> <5AD6> <11F7> <5B0C> endbfchar 100 beginbfchar <11F8> <5B0B> <11F9> <5B16> <11FA> <5B32> <11FB> <5AD0> <11FC> <5B2A> <11FD> <5B36> <11FE> <5B3E> <11FF> <5B43> <1200> <5B45> <1201> <5B40> <1202> <5B51> <1203> <5B55> <1206> <5B65> <1207> <5B69> <1208> <5B70> <1209> <5B73> <120A> <5B75> <120B> <5B78> <120C> <6588> <120D> <5B7A> <120E> <5B80> <120F> <5B83> <1210> <5BA6> <1211> <5BB8> <1212> <5BC3> <1213> <5BC7> <1214> <5BC9> <1215> <5BD4> <1216> <5BD0> <1217> <5BE4> <1218> <5BE6> <1219> <5BE2> <121A> <5BDE> <121B> <5BE5> <121C> <5BEB> <121D> <5BF0> <121E> <5BF6> <121F> <5BF3> <1220> <5C05> <1223> <5C0D> <1224> <5C13> <1225> <5C20> <1226> <5C22> <1227> <5C28> <122A> <5C41> <122B> <5C46> <122C> <5C4E> <122D> <5C53> <122E> <5C50> <122F> <5C4F> <1230> <5B71> <1231> <5C6C> <1232> <5C6E> <1233> <4E62> <1234> <5C76> <1235> <5C79> <1236> <5C8C> <1237> <5C91> <1238> <5C94> <1239> <599B> <123A> <5CAB> <123B> <5CBB> <123C> <5CB6> <123D> <5CBC> <123E> <5CB7> <123F> <5CC5> <1240> <5CBE> <1241> <5CC7> <1242> <5CD9> <1243> <5CE9> <1244> <5CFD> <1245> <5CFA> <1246> <5CED> <1247> <5D8C> <1248> <5CEA> <1249> <5D0B> <124A> <5D15> <124B> <5D17> <124C> <5D5C> <124D> <5D1F> <124E> <5D1B> <124F> <5D11> <1250> <5D14> <1251> <5D22> <1252> <5D1A> <1253> <5D19> <1254> <5D18> <1255> <5D4C> <1256> <5D52> <1257> <5D4E> <1258> <5D4B> <1259> <5D6C> <125A> <5D73> <125B> <5D76> <125C> <5D87> <125D> <5D84> <125E> <5D82> <125F> <5DA2> <1260> <5D9D> <1261> <5DAC> endbfchar 100 beginbfchar <1262> <5DAE> <1263> <5DBD> <1264> <5D90> <1265> <5DB7> <1266> <5DBC> <1267> <5DC9> <1268> <5DCD> <1269> <5DD3> <126A> <5DD2> <126B> <5DD6> <126C> <5DDB> <126D> <5DEB> <126E> <5DF2> <126F> <5DF5> <1270> <5E0B> <1271> <5E1A> <1272> <5E19> <1273> <5E11> <1274> <5E1B> <1277> <5E44> <1278> <5E43> <1279> <5E40> <127A> <5E4E> <127B> <5E57> <127C> <5E54> <127D> <5E5F> <127E> <5E62> <127F> <5E64> <1280> <5E47> <1283> <5E7A> <1284> <9EBC> <1285> <5E7F> <1286> <5EA0> <1289> <5EC8> <128A> <5ED0> <128B> <5ECF> <128C> <5ED6> <128D> <5EE3> <128E> <5EDD> <1291> <5EE2> <1292> <5EE1> <1295> <5EEC> <1296> <5EF1> <1297> <5EF3> <1298> <5EF0> <1299> <5EF4> <129A> <5EF8> <129B> <5EFE> <129C> <5F03> <129D> <5F09> <129E> <5F5D> <129F> <5F5C> <12A0> <5F0B> <12A1> <5F11> <12A2> <5F16> <12A3> <5F29> <12A4> <5F2D> <12A5> <5F38> <12A6> <5F41> <12A7> <5F48> <12A8> <5F4C> <12A9> <5F4E> <12AA> <5F2F> <12AB> <5F51> <12AE> <5F59> <12AF> <5F61> <12B0> <5F6D> <12B1> <5F73> <12B2> <5F77> <12B3> <5F83> <12B4> <5F82> <12B5> <5F7F> <12B6> <5F8A> <12B7> <5F88> <12B8> <5F91> <12B9> <5F87> <12BA> <5F9E> <12BB> <5F99> <12BC> <5F98> <12BD> <5FA0> <12BE> <5FA8> <12BF> <5FAD> <12C0> <5FBC> <12C1> <5FD6> <12C2> <5FFB> <12C3> <5FE4> <12C4> <5FF8> <12C5> <5FF1> <12C6> <5FDD> <12C7> <60B3> <12C8> <5FFF> <12C9> <6021> <12CA> <6060> <12CB> <6019> <12CC> <6010> <12CD> <6029> <12CE> <600E> <12CF> <6031> <12D0> <601B> <12D1> <6015> endbfchar 100 beginbfchar <12D2> <602B> <12D3> <6026> <12D4> <600F> <12D5> <603A> <12D6> <605A> <12D7> <6041> <12D8> <606A> <12D9> <6077> <12DA> <605F> <12DB> <604A> <12DC> <6046> <12DD> <604D> <12DE> <6063> <12DF> <6043> <12E0> <6064> <12E1> <6042> <12E2> <606C> <12E3> <606B> <12E4> <6059> <12E5> <6081> <12E6> <608D> <12E7> <60E7> <12E8> <6083> <12E9> <609A> <12EA> <6084> <12EB> <609B> <12EE> <6092> <12EF> <60A7> <12F0> <608B> <12F1> <60E1> <12F2> <60B8> <12F3> <60E0> <12F4> <60D3> <12F5> <60B4> <12F6> <5FF0> <12F7> <60BD> <12F8> <60C6> <12F9> <60B5> <12FA> <60D8> <12FB> <614D> <12FC> <6115> <12FD> <6106> <1300> <6100> <1301> <60F4> <1302> <60FA> <1303> <6103> <1304> <6121> <1305> <60FB> <1306> <60F1> <1309> <6147> <130A> <613E> <130B> <6128> <130C> <6127> <130D> <614A> <130E> <613F> <130F> <613C> <1310> <612C> <1311> <6134> <1312> <613D> <1313> <6142> <1314> <6144> <1315> <6173> <1316> <6177> <131A> <616B> <131B> <6174> <131C> <616F> <131D> <6165> <131E> <6171> <131F> <615F> <1320> <615D> <1321> <6153> <1322> <6175> <1323> <6199> <1324> <6196> <1325> <6187> <1326> <61AC> <1327> <6194> <1328> <619A> <1329> <618A> <132A> <6191> <132B> <61AB> <132C> <61AE> <132D> <61CC> <132E> <61CA> <132F> <61C9> <1330> <61F7> <1331> <61C8> <1332> <61C3> <1333> <61C6> <1334> <61BA> <1335> <61CB> <1336> <7F79> <1337> <61CD> <1338> <61E6> <1339> <61E3> <133A> <61F6> <133B> <61FA> <133C> <61F4> <133D> <61FF> <133E> <61FD> endbfchar 100 beginbfchar <133F> <61FC> <1340> <61FE> <1341> <6200> <1344> <620D> <1345> <620C> <1346> <6214> <1347> <621B> <1348> <621E> <1349> <6221> <134A> <622A> <134B> <622E> <134C> <6230> <134F> <6241> <1350> <624E> <1351> <625E> <1352> <6263> <1353> <625B> <1354> <6260> <1355> <6268> <1356> <627C> <1357> <6282> <1358> <6289> <1359> <627E> <135C> <6296> <135D> <62D4> <135E> <6283> <135F> <6294> <1360> <62D7> <1361> <62D1> <1362> <62BB> <1363> <62CF> <1364> <62FF> <1365> <62C6> <1366> <64D4> <1367> <62C8> <1368> <62DC> <1369> <62CC> <136A> <62CA> <136B> <62C2> <136C> <62C7> <136D> <629B> <136E> <62C9> <136F> <630C> <1370> <62EE> <1371> <62F1> <1372> <6327> <1373> <6302> <1374> <6308> <1375> <62EF> <1376> <62F5> <1377> <6350> <1378> <633E> <1379> <634D> <137A> <641C> <137B> <634F> <137C> <6396> <137D> <638E> <137E> <6380> <137F> <63AB> <1380> <6376> <1381> <63A3> <1382> <638F> <1383> <6389> <1384> <639F> <1385> <63B5> <1386> <636B> <1387> <6369> <1388> <63BE> <1389> <63E9> <138A> <63C0> <138B> <63C6> <138C> <63E3> <138D> <63C9> <138E> <63D2> <138F> <63F6> <1390> <63C4> <1391> <6416> <1392> <6434> <1393> <6406> <1394> <6413> <1395> <6426> <1396> <6436> <1397> <651D> <1398> <6417> <1399> <6428> <139A> <640F> <139B> <6467> <139C> <646F> <139D> <6476> <139E> <644E> <139F> <652A> <13A0> <6495> <13A1> <6493> <13A2> <64A5> <13A3> <64A9> <13A4> <6488> <13A5> <64BC> <13A6> <64DA> <13A7> <64D2> <13A8> <64C5> endbfchar 100 beginbfchar <13A9> <64C7> <13AA> <64BB> <13AB> <64D8> <13AC> <64C2> <13AD> <64F1> <13AE> <64E7> <13AF> <8209> <13B2> <62AC> <13B3> <64E3> <13B4> <64EF> <13B5> <652C> <13B6> <64F6> <13B7> <64F4> <13B8> <64F2> <13B9> <64FA> <13BA> <6500> <13BB> <64FD> <13BC> <6518> <13BD> <651C> <13BE> <6505> <13BF> <6524> <13C0> <6523> <13C1> <652B> <13C4> <6537> <13C5> <6536> <13C6> <6538> <13C7> <754B> <13C8> <6548> <13C9> <6556> <13CA> <6555> <13CB> <654D> <13CC> <6558> <13CD> <655E> <13CE> <655D> <13CF> <6572> <13D0> <6578> <13D3> <8B8A> <13D4> <659B> <13D5> <659F> <13D6> <65AB> <13D7> <65B7> <13D8> <65C3> <13D9> <65C6> <13DA> <65C1> <13DB> <65C4> <13DC> <65CC> <13DD> <65D2> <13DE> <65DB> <13DF> <65D9> <13E2> <65F1> <13E3> <6772> <13E4> <660A> <13E5> <6603> <13E6> <65FB> <13E7> <6773> <13EA> <6634> <13EB> <661C> <13EC> <664F> <13ED> <6644> <13EE> <6649> <13EF> <6641> <13F0> <665E> <13F1> <665D> <13F2> <6664> <13F5> <665F> <13F6> <6662> <13F7> <6670> <13F8> <6683> <13F9> <6688> <13FA> <668E> <13FB> <6689> <13FC> <6684> <13FD> <6698> <13FE> <669D> <13FF> <66C1> <1400> <66B9> <1401> <66C9> <1402> <66BE> <1403> <66BC> <1404> <66C4> <1405> <66B8> <1406> <66D6> <1407> <66DA> <1408> <66E0> <1409> <663F> <140A> <66E6> <140B> <66E9> <140C> <66F0> <140D> <66F5> <140E> <66F7> <140F> <670F> <1410> <6716> <1411> <671E> <1414> <9738> <1415> <672E> <1416> <673F> <1417> <6736> <1418> <6741> <1419> <6738> <141A> <6737> endbfchar 100 beginbfchar <141B> <6746> <141C> <675E> <141D> <6760> <141E> <6759> <1421> <6789> <1422> <6770> <1423> <67A9> <1424> <677C> <1425> <676A> <1426> <678C> <1427> <678B> <1428> <67A6> <1429> <67A1> <142A> <6785> <142B> <67B7> <142C> <67EF> <142D> <67B4> <142E> <67EC> <142F> <67B3> <1430> <67E9> <1431> <67B8> <1432> <67E4> <1433> <67DE> <1434> <67DD> <1435> <67E2> <1436> <67EE> <1437> <67B9> <1438> <67CE> <1439> <67C6> <143A> <67E7> <143B> <6A9C> <143C> <681E> <143D> <6846> <143E> <6829> <143F> <6840> <1440> <684D> <1441> <6832> <1442> <684E> <1443> <68B3> <1444> <682B> <1445> <6859> <1446> <6863> <1447> <6877> <1448> <687F> <1449> <689F> <144A> <688F> <144B> <68AD> <144C> <6894> <144D> <689D> <144E> <689B> <144F> <6883> <1450> <6AAE> <1451> <68B9> <1452> <6874> <1453> <68B5> <1454> <68A0> <1455> <68BA> <1456> <690F> <1457> <688D> <1458> <687E> <1459> <6901> <145A> <68CA> <145B> <6908> <145C> <68D8> <145D> <6922> <145E> <6926> <145F> <68E1> <1460> <690C> <1461> <68CD> <1462> <68D4> <1463> <68E7> <1464> <68D5> <1465> <6936> <1466> <6912> <1467> <6904> <1468> <68D7> <1469> <68E3> <146A> <6925> <146B> <68F9> <146C> <68E0> <146D> <68EF> <146E> <6928> <146F> <692A> <1470> <691A> <1471> <6923> <1472> <6921> <1473> <68C6> <1474> <6979> <1475> <6977> <1476> <695C> <1477> <6978> <1478> <696B> <1479> <6954> <147A> <697E> <147B> <696E> <147C> <6939> <147D> <6974> <147E> <693D> <147F> <6959> <1480> <6930> endbfchar 100 beginbfchar <1481> <6961> <1482> <695E> <1483> <695D> <1484> <6981> <1485> <696A> <1486> <69B2> <1487> <69AE> <1488> <69D0> <1489> <69BF> <148A> <69C1> <148B> <69D3> <148C> <69BE> <148D> <69CE> <148E> <5BE8> <148F> <69CA> <1490> <69DD> <1491> <69BB> <1492> <69C3> <1493> <69A7> <1494> <6A2E> <1495> <6991> <1496> <69A0> <1497> <699C> <1498> <6995> <1499> <69B4> <149A> <69DE> <149B> <69E8> <149C> <6A02> <149D> <6A1B> <149E> <69FF> <149F> <6B0A> <14A0> <69F9> <14A1> <69F2> <14A2> <69E7> <14A3> <6A05> <14A4> <69B1> <14A5> <6A1E> <14A6> <69ED> <14A7> <6A14> <14A8> <69EB> <14A9> <6A0A> <14AA> <6A12> <14AB> <6AC1> <14AC> <6A23> <14AD> <6A13> <14AE> <6A44> <14AF> <6A0C> <14B0> <6A72> <14B1> <6A36> <14B2> <6A78> <14B3> <6A47> <14B4> <6A62> <14B5> <6A59> <14B6> <6A66> <14B7> <6A48> <14B8> <6A38> <14B9> <6A22> <14BA> <6A90> <14BB> <6A8D> <14BC> <6AA0> <14BD> <6A84> <14C0> <6A97> <14C1> <8617> <14C2> <6ABB> <14C3> <6AC3> <14C4> <6AC2> <14C5> <6AB8> <14C6> <6AB3> <14C7> <6AAC> <14C8> <6ADE> <14C9> <6AD1> <14CA> <6ADF> <14CB> <6AAA> <14CC> <6ADA> <14CD> <6AEA> <14CE> <6AFB> <14CF> <6B05> <14D0> <8616> <14D1> <6AFA> <14D2> <6B12> <14D3> <6B16> <14D4> <9B31> <14D5> <6B1F> <14D6> <6B38> <14D7> <6B37> <14D8> <76DC> <14D9> <6B39> <14DA> <98EE> <14DB> <6B47> <14DC> <6B43> <14DD> <6B49> <14DE> <6B50> <14DF> <6B59> <14E0> <6B54> <14E1> <6B5B> <14E2> <6B5F> <14E3> <6B61> <14E8> <6B84> <14E9> <6B83> <14EA> <6B8D> endbfchar 100 beginbfchar <14EB> <6B98> <14EC> <6B95> <14ED> <6B9E> <14EE> <6BA4> <14F1> <6BAF> <14F2> <6BB2> <14F3> <6BB1> <14F4> <6BB3> <14F5> <6BB7> <14F6> <6BBC> <14F7> <6BC6> <14F8> <6BCB> <14F9> <6BD3> <14FA> <6BDF> <14FB> <6BEC> <14FC> <6BEB> <14FD> <6BF3> <14FE> <6BEF> <14FF> <9EBE> <1500> <6C08> <1503> <6C1B> <1504> <6C24> <1505> <6C23> <1506> <6C5E> <1507> <6C55> <1508> <6C62> <1509> <6C6A> <150A> <6C82> <150B> <6C8D> <150C> <6C9A> <150D> <6C81> <150E> <6C9B> <150F> <6C7E> <1510> <6C68> <1511> <6C73> <1512> <6C92> <1513> <6C90> <1514> <6CC4> <1515> <6CF1> <1516> <6CD3> <1517> <6CBD> <1518> <6CD7> <1519> <6CC5> <151A> <6CDD> <151B> <6CAE> <151C> <6CB1> <151D> <6CBE> <151E> <6CBA> <151F> <6CDB> <1520> <6CEF> <1521> <6CD9> <1522> <6CEA> <1523> <6D1F> <1524> <884D> <1525> <6D36> <1526> <6D2B> <1527> <6D3D> <1528> <6D38> <1529> <6D19> <152A> <6D35> <152B> <6D33> <152C> <6D12> <152D> <6D0C> <152E> <6D63> <152F> <6D93> <1530> <6D64> <1531> <6D5A> <1532> <6D79> <1533> <6D59> <1534> <6D8E> <1535> <6D95> <1536> <6FE4> <1537> <6D85> <1538> <6DF9> <1539> <6E15> <153A> <6E0A> <153B> <6DB5> <153C> <6DC7> <153D> <6DE6> <153E> <6DB8> <153F> <6DC6> <1540> <6DEC> <1541> <6DDE> <1542> <6DCC> <1543> <6DE8> <1544> <6DD2> <1545> <6DC5> <1546> <6DFA> <1547> <6DD9> <1548> <6DE4> <1549> <6DD5> <154A> <6DEA> <154B> <6DEE> <154C> <6E2D> <154D> <6E6E> <154E> <6E2E> <154F> <6E19> <1550> <6E72> <1551> <6E5F> <1552> <6E3E> endbfchar 100 beginbfchar <1553> <6E23> <1554> <6E6B> <1555> <6E2B> <1556> <6E76> <1557> <6E4D> <1558> <6E1F> <1559> <6E43> <155A> <6E3A> <155B> <6E4E> <155C> <6E24> <155D> <6EFF> <155E> <6E1D> <155F> <6E38> <1560> <6E82> <1561> <6EAA> <1562> <6E98> <1563> <6EC9> <1564> <6EB7> <1565> <6ED3> <1566> <6EBD> <1567> <6EAF> <1568> <6EC4> <1569> <6EB2> <156C> <6E8F> <156D> <6EA5> <156E> <6EC2> <156F> <6E9F> <1570> <6F41> <1571> <6F11> <1572> <704C> <1573> <6EEC> <1574> <6EF8> <1575> <6EFE> <1576> <6F3F> <1577> <6EF2> <1578> <6F31> <1579> <6EEF> <157A> <6F32> <157B> <6ECC> <157C> <6F3E> <157D> <6F13> <157E> <6EF7> <157F> <6F86> <1580> <6F7A> <1581> <6F78> <1582> <6F81> <1583> <6F80> <1584> <6F6F> <1585> <6F5B> <1586> <6FF3> <1587> <6F6D> <1588> <6F82> <1589> <6F7C> <158A> <6F58> <158B> <6F8E> <158C> <6F91> <158D> <6FC2> <158E> <6F66> <158F> <6FB3> <1590> <6FA3> <1591> <6FA1> <1592> <6FA4> <1593> <6FB9> <1594> <6FC6> <1595> <6FAA> <1596> <6FDF> <1597> <6FD5> <1598> <6FEC> <1599> <6FD4> <159A> <6FD8> <159B> <6FF1> <159C> <6FEE> <159D> <6FDB> <159E> <7009> <159F> <700B> <15A0> <6FFA> <15A1> <7011> <15A2> <7001> <15A3> <700F> <15A4> <6FFE> <15A5> <701B> <15A6> <701A> <15A7> <6F74> <15A8> <701D> <15A9> <7018> <15AA> <701F> <15AB> <7030> <15AC> <703E> <15AD> <7032> <15AE> <7051> <15AF> <7063> <15B0> <7099> <15B1> <7092> <15B2> <70AF> <15B3> <70F1> <15B4> <70AC> <15B5> <70B8> <15B6> <70B3> <15B7> <70AE> <15B8> <70DF> endbfchar 100 beginbfchar <15B9> <70CB> <15BA> <70DD> <15BB> <70D9> <15BC> <7109> <15BD> <70FD> <15BE> <711C> <15BF> <7119> <15C0> <7165> <15C1> <7155> <15C2> <7188> <15C3> <7166> <15C4> <7162> <15C5> <714C> <15C6> <7156> <15C7> <716C> <15C8> <718F> <15C9> <71FB> <15CA> <7184> <15CB> <7195> <15CC> <71A8> <15CD> <71AC> <15CE> <71D7> <15CF> <71B9> <15D0> <71BE> <15D1> <71D2> <15D2> <71C9> <15D3> <71D4> <15D4> <71CE> <15D5> <71E0> <15D6> <71EC> <15D7> <71E7> <15D8> <71F5> <15D9> <71FC> <15DA> <71F9> <15DB> <71FF> <15DC> <720D> <15DD> <7210> <15DE> <721B> <15DF> <7228> <15E0> <722D> <15E1> <722C> <15E2> <7230> <15E3> <7232> <15E8> <7246> <15E9> <724B> <15EA> <7258> <15EB> <7274> <15EC> <727E> <15ED> <7282> <15EE> <7281> <15EF> <7287> <15F0> <7292> <15F1> <7296> <15F2> <72A2> <15F3> <72A7> <15F4> <72B9> <15F5> <72B2> <15F6> <72C3> <15F7> <72C6> <15F8> <72C4> <15F9> <72CE> <15FA> <72D2> <15FB> <72E2> <15FE> <72F9> <15FF> <72F7> <1600> <500F> <1601> <7317> <1602> <730A> <1603> <731C> <1604> <7316> <1605> <731D> <1606> <7334> <1607> <732F> <1608> <7329> <1609> <7325> <160A> <733E> <160D> <9ED8> <160E> <7357> <160F> <736A> <1610> <7368> <1611> <7370> <1612> <7378> <1613> <7375> <1614> <737B> <1615> <737A> <1616> <73C8> <1617> <73B3> <1618> <73CE> <1619> <73BB> <161A> <73C0> <161B> <73E5> <161C> <73EE> <161D> <73DE> <161E> <74A2> <161F> <7405> <1620> <746F> <1621> <7425> <1622> <73F8> <1623> <7432> <1624> <743A> endbfchar 100 beginbfchar <1625> <7455> <1626> <743F> <1627> <745F> <1628> <7459> <1629> <7441> <162A> <745C> <162B> <7469> <162C> <7470> <162D> <7463> <162E> <746A> <162F> <7476> <1630> <747E> <1631> <748B> <1632> <749E> <1633> <74A7> <1634> <74CA> <1635> <74CF> <1636> <74D4> <1637> <73F1> <1638> <74E0> <1639> <74E3> <163A> <74E7> <163B> <74E9> <163C> <74EE> <163D> <74F2> <1640> <74F8> <1641> <74F7> <1642> <7504> <1643> <7503> <1644> <7505> <1645> <750C> <1646> <750E> <1647> <750D> <1648> <7515> <1649> <7513> <164A> <751E> <164B> <7526> <164C> <752C> <164D> <753C> <164E> <7544> <164F> <754D> <1650> <754A> <1651> <7549> <1652> <755B> <1653> <7546> <1654> <755A> <1655> <7569> <1656> <7564> <1657> <7567> <1658> <756B> <1659> <756D> <165A> <7578> <165B> <7576> <165E> <7574> <165F> <758A> <1660> <7589> <1661> <7582> <1662> <7594> <1663> <759A> <1664> <759D> <1665> <75A5> <1666> <75A3> <1667> <75C2> <1668> <75B3> <1669> <75C3> <166A> <75B5> <166B> <75BD> <166C> <75B8> <166D> <75BC> <166E> <75B1> <166F> <75CD> <1670> <75CA> <1671> <75D2> <1672> <75D9> <1673> <75E3> <1674> <75DE> <1677> <75FC> <1678> <7601> <1679> <75F0> <167A> <75FA> <167D> <760B> <167E> <760D> <167F> <7609> <1680> <761F> <1681> <7627> <1685> <7624> <1686> <7634> <1687> <7630> <1688> <763B> <168B> <7646> <168C> <765C> <168D> <7658> <1693> <7667> <1694> <766C> <1695> <7670> <1696> <7672> <1697> <7676> <1698> <7678> <1699> <767C> <169A> <7680> endbfchar 100 beginbfchar <169B> <7683> <169C> <7688> <169D> <768B> <169E> <768E> <169F> <7696> <16A0> <7693> <16A3> <76B0> <16A4> <76B4> <16A8> <76C2> <16A9> <76CD> <16AA> <76D6> <16AB> <76D2> <16AC> <76DE> <16AD> <76E1> <16AE> <76E5> <16AF> <76E7> <16B0> <76EA> <16B1> <862F> <16B2> <76FB> <16B3> <7708> <16B4> <7707> <16B5> <7704> <16B6> <7729> <16B7> <7724> <16B8> <771E> <16BB> <771B> <16BE> <7747> <16BF> <775A> <16C0> <7768> <16C1> <776B> <16C2> <775B> <16C3> <7765> <16C4> <777F> <16C5> <777E> <16C6> <7779> <16C7> <778E> <16C8> <778B> <16C9> <7791> <16CA> <77A0> <16CB> <779E> <16CC> <77B0> <16CD> <77B6> <16CE> <77B9> <16CF> <77BF> <16D2> <77BB> <16D3> <77C7> <16D4> <77CD> <16D5> <77D7> <16D6> <77DA> <16D7> <77DC> <16D8> <77E3> <16D9> <77EE> <16DA> <77FC> <16DB> <780C> <16DC> <7812> <16DD> <7926> <16DE> <7820> <16DF> <792A> <16E0> <7845> <16E1> <788E> <16E2> <7874> <16E3> <7886> <16E4> <787C> <16E5> <789A> <16E6> <788C> <16E7> <78A3> <16E8> <78B5> <16E9> <78AA> <16EA> <78AF> <16EB> <78D1> <16EC> <78C6> <16ED> <78CB> <16EE> <78D4> <16EF> <78BE> <16F0> <78BC> <16F1> <78C5> <16F2> <78CA> <16F3> <78EC> <16F4> <78E7> <16F5> <78DA> <16F6> <78FD> <16F7> <78F4> <16F8> <7907> <16F9> <7912> <16FA> <7911> <16FB> <7919> <16FC> <792C> <16FD> <792B> <16FE> <7940> <16FF> <7960> <1700> <7957> <1701> <795F> <1702> <795A> <1703> <7955> <1704> <7953> <1705> <797A> <1706> <797F> <1707> <798A> <1708> <799D> <1709> <79A7> endbfchar 100 beginbfchar <170A> <9F4B> <170B> <79AA> <170C> <79AE> <170D> <79B3> <1710> <79C9> <1711> <79D5> <1712> <79E7> <1713> <79EC> <1714> <79E1> <1715> <79E3> <1716> <7A08> <1717> <7A0D> <171A> <7A20> <171B> <7A1F> <171C> <7980> <171D> <7A31> <171E> <7A3B> <171F> <7A3E> <1720> <7A37> <1721> <7A43> <1722> <7A57> <1723> <7A49> <1726> <7A69> <1727> <9F9D> <1728> <7A70> <1729> <7A79> <172A> <7A7D> <172B> <7A88> <172C> <7A97> <172D> <7A95> <172E> <7A98> <172F> <7A96> <1730> <7AA9> <1731> <7AC8> <1732> <7AB0> <1733> <7AB6> <1734> <7AC5> <1735> <7AC4> <1736> <7ABF> <1737> <9083> <1738> <7AC7> <1739> <7ACA> <173A> <7ACD> <173B> <7ACF> <173C> <7AD5> <173D> <7AD3> <1740> <7ADD> <1743> <7AE6> <1744> <7AED> <1745> <7AF0> <1746> <7B02> <1747> <7B0F> <1748> <7B0A> <1749> <7B06> <174A> <7B33> <174D> <7B1E> <174E> <7B35> <174F> <7B28> <1750> <7B36> <1751> <7B50> <1752> <7B7A> <1753> <7B04> <1754> <7B4D> <1755> <7B0B> <1756> <7B4C> <1757> <7B45> <1758> <7B75> <1759> <7B65> <175A> <7B74> <175B> <7B67> <175E> <7B6C> <175F> <7B6E> <1760> <7B9D> <1761> <7B98> <1762> <7B9F> <1763> <7B8D> <1764> <7B9C> <1765> <7B9A> <1766> <7B8B> <1767> <7B92> <1768> <7B8F> <1769> <7B5D> <176A> <7B99> <176B> <7BCB> <176C> <7BC1> <176D> <7BCC> <176E> <7BCF> <176F> <7BB4> <1770> <7BC6> <1771> <7BDD> <1772> <7BE9> <1773> <7C11> <1774> <7C14> <1775> <7BE6> <1776> <7BE5> <1777> <7C60> <1778> <7C00> <1779> <7C07> <177A> <7C13> <177B> <7BF3> endbfchar 100 beginbfchar <177C> <7BF7> <177D> <7C17> <177E> <7C0D> <177F> <7BF6> <1780> <7C23> <1781> <7C27> <1782> <7C2A> <1783> <7C1F> <1784> <7C37> <1785> <7C2B> <1786> <7C3D> <1787> <7C4C> <1788> <7C43> <1789> <7C54> <178A> <7C4F> <178B> <7C40> <178C> <7C50> <178D> <7C58> <178E> <7C5F> <178F> <7C64> <1790> <7C56> <1791> <7C65> <1792> <7C6C> <1793> <7C75> <1794> <7C83> <1795> <7C90> <1796> <7CA4> <1797> <7CAD> <1798> <7CA2> <1799> <7CAB> <179A> <7CA1> <179B> <7CA8> <179C> <7CB3> <179D> <7CB2> <179E> <7CB1> <179F> <7CAE> <17A0> <7CB9> <17A1> <7CBD> <17A2> <7CC0> <17A3> <7CC5> <17A4> <7CC2> <17A5> <7CD8> <17A6> <7CD2> <17A7> <7CDC> <17A8> <7CE2> <17A9> <9B3B> <17AA> <7CEF> <17AB> <7CF2> <17AC> <7CF4> <17AD> <7CF6> <17AE> <7CFA> <17AF> <7D06> <17B0> <7D02> <17B1> <7D1C> <17B2> <7D15> <17B3> <7D0A> <17B4> <7D45> <17B5> <7D4B> <17B6> <7D2E> <17B7> <7D32> <17B8> <7D3F> <17B9> <7D35> <17BA> <7D46> <17BB> <7D73> <17BC> <7D56> <17BD> <7D4E> <17BE> <7D72> <17BF> <7D68> <17C0> <7D6E> <17C1> <7D4F> <17C2> <7D63> <17C3> <7D93> <17C4> <7D89> <17C5> <7D5B> <17C6> <7D8F> <17C7> <7D7D> <17C8> <7D9B> <17C9> <7DBA> <17CA> <7DAE> <17CB> <7DA3> <17CC> <7DB5> <17CD> <7DC7> <17CE> <7DBD> <17CF> <7DAB> <17D0> <7E3D> <17D1> <7DA2> <17D2> <7DAF> <17D3> <7DDC> <17D4> <7DB8> <17D5> <7D9F> <17D6> <7DB0> <17D7> <7DD8> <17D8> <7DDD> <17D9> <7DE4> <17DA> <7DDE> <17DB> <7DFB> <17DC> <7DF2> <17DD> <7DE1> <17DE> <7E05> <17DF> <7E0A> endbfchar 100 beginbfchar <17E0> <7E23> <17E1> <7E21> <17E2> <7E12> <17E3> <7E31> <17E4> <7E1F> <17E5> <7E09> <17E6> <7E0B> <17E7> <7E22> <17E8> <7E46> <17E9> <7E66> <17EA> <7E3B> <17EB> <7E35> <17EC> <7E39> <17ED> <7E43> <17EE> <7E37> <17EF> <7E32> <17F0> <7E3A> <17F1> <7E67> <17F2> <7E5D> <17F3> <7E56> <17F4> <7E5E> <17F7> <7E79> <17F8> <7E6A> <17F9> <7E69> <17FA> <7E7C> <17FB> <7E7B> <17FC> <7E83> <17FD> <7DD5> <17FE> <7E7D> <17FF> <8FAE> <1800> <7E7F> <1803> <7E8C> <1804> <7E92> <1805> <7E90> <1808> <7E96> <1809> <7E8E> <180C> <7F38> <180D> <7F3A> <180E> <7F45> <1814> <7F55> <1815> <7F54> <1816> <7F58> <181B> <7F67> <181C> <7F78> <181D> <7F82> <181E> <7F86> <181F> <7F83> <1820> <7F88> <1821> <7F87> <1822> <7F8C> <1823> <7F94> <1824> <7F9E> <1825> <7F9D> <1826> <7F9A> <1827> <7FA3> <1828> <7FAF> <1829> <7FB2> <182A> <7FB9> <182B> <7FAE> <182C> <7FB6> <182D> <7FB8> <182E> <8B71> <1831> <7FCA> <1832> <7FD5> <1833> <7FD4> <1834> <7FE1> <1835> <7FE6> <1836> <7FE9> <1837> <7FF3> <1838> <7FF9> <1839> <98DC> <183A> <8006> <183B> <8004> <183C> <800B> <183D> <8012> <1840> <801C> <1841> <8021> <1842> <8028> <1843> <803F> <1844> <803B> <1845> <804A> <1846> <8046> <1847> <8052> <1848> <8058> <1849> <805A> <184A> <805F> <184B> <8062> <184C> <8068> <184D> <8073> <184E> <8072> <184F> <8070> <1850> <8076> <1851> <8079> <1852> <807D> <1853> <807F> <1854> <8084> <1855> <8086> <1856> <8085> <1857> <809B> <1858> <8093> endbfchar 100 beginbfchar <1859> <809A> <185A> <80AD> <185B> <5190> <185C> <80AC> <185D> <80DB> <185E> <80E5> <185F> <80D9> <1860> <80DD> <1861> <80C4> <1862> <80DA> <1863> <80D6> <1864> <8109> <1865> <80EF> <1866> <80F1> <1867> <811B> <1868> <8129> <1869> <8123> <186A> <812F> <186B> <814B> <186C> <968B> <186D> <8146> <186E> <813E> <186F> <8153> <1870> <8151> <1871> <80FC> <1872> <8171> <1873> <816E> <1876> <8174> <1877> <8183> <1878> <8188> <1879> <818A> <187A> <8180> <187B> <8182> <187C> <81A0> <187D> <8195> <187E> <81A4> <187F> <81A3> <1880> <815F> <1881> <8193> <1882> <81A9> <1883> <81B0> <1884> <81B5> <1885> <81BE> <1886> <81B8> <1887> <81BD> <1888> <81C0> <1889> <81C2> <188A> <81BA> <188B> <81C9> <188C> <81CD> <188D> <81D1> <188E> <81D9> <188F> <81D8> <1890> <81C8> <1891> <81DA> <1894> <81E7> <1897> <81FE> <189A> <8205> <189B> <8207> <189C> <820A> <189D> <820D> <189E> <8210> <189F> <8216> <18A0> <8229> <18A1> <822B> <18A2> <8238> <18A3> <8233> <18A4> <8240> <18A5> <8259> <18A6> <8258> <18A7> <825D> <18A8> <825A> <18A9> <825F> <18AA> <8264> <18AB> <8262> <18AC> <8268> <18AF> <822E> <18B0> <8271> <18B3> <827E> <18B4> <828D> <18B5> <8292> <18B6> <82AB> <18B7> <829F> <18B8> <82BB> <18B9> <82AC> <18BA> <82E1> <18BB> <82E3> <18BC> <82DF> <18BD> <82D2> <18BE> <82F4> <18BF> <82F3> <18C0> <82FA> <18C1> <8393> <18C2> <8303> <18C3> <82FB> <18C4> <82F9> <18C5> <82DE> <18C6> <8306> <18C7> <82DC> <18C8> <8309> endbfchar 100 beginbfchar <18C9> <82D9> <18CA> <8335> <18CB> <8334> <18CC> <8316> <18CD> <8332> <18CE> <8331> <18CF> <8340> <18D0> <8339> <18D1> <8350> <18D2> <8345> <18D3> <832F> <18D4> <832B> <18D7> <8385> <18D8> <839A> <18D9> <83AA> <18DA> <839F> <18DB> <83A2> <18DC> <8396> <18DD> <8323> <18DE> <838E> <18DF> <8387> <18E0> <838A> <18E1> <837C> <18E2> <83B5> <18E3> <8373> <18E4> <8375> <18E5> <83A0> <18E6> <8389> <18E7> <83A8> <18E8> <83F4> <18E9> <8413> <18EA> <83EB> <18EB> <83CE> <18EC> <83FD> <18ED> <8403> <18EE> <83D8> <18EF> <840B> <18F0> <83C1> <18F1> <83F7> <18F2> <8407> <18F3> <83E0> <18F4> <83F2> <18F5> <840D> <18F6> <8422> <18F7> <8420> <18F8> <83BD> <18F9> <8438> <18FA> <8506> <18FB> <83FB> <18FC> <846D> <18FD> <842A> <18FE> <843C> <18FF> <855A> <1900> <8484> <1901> <8477> <1902> <846B> <1903> <84AD> <1904> <846E> <1905> <8482> <1906> <8469> <1907> <8446> <1908> <842C> <1909> <846F> <190A> <8479> <190B> <8435> <190C> <84CA> <190D> <8462> <190E> <84B9> <190F> <84BF> <1910> <849F> <1911> <84D9> <1912> <84CD> <1913> <84BB> <1914> <84DA> <1915> <84D0> <1916> <84C1> <1917> <84C6> <1918> <84D6> <1919> <84A1> <191A> <8521> <191B> <84FF> <191C> <84F4> <191F> <852C> <1920> <851F> <1921> <8515> <1922> <8514> <1923> <84FC> <1924> <8540> <1925> <8563> <1926> <8558> <1927> <8548> <1928> <8541> <1929> <8602> <192A> <854B> <192B> <8555> <192C> <8580> <192D> <85A4> <192E> <8588> <192F> <8591> <1930> <858A> endbfchar 100 beginbfchar <1931> <85A8> <1932> <856D> <1933> <8594> <1934> <859B> <1935> <85EA> <1936> <8587> <1937> <859C> <1938> <8577> <1939> <857E> <193A> <8590> <193B> <85C9> <193C> <85BA> <193D> <85CF> <193E> <85B9> <193F> <85D0> <1940> <85D5> <1941> <85DD> <1942> <85E5> <1943> <85DC> <1944> <85F9> <1945> <860A> <1946> <8613> <1947> <860B> <1948> <85FE> <1949> <85FA> <194A> <8606> <194B> <8622> <194C> <861A> <194D> <8630> <194E> <863F> <194F> <864D> <1950> <4E55> <1951> <8654> <1952> <865F> <1953> <8667> <1954> <8671> <1955> <8693> <1956> <86A3> <195B> <86B6> <195C> <86AF> <195D> <86C4> <195E> <86C6> <195F> <86B0> <1960> <86C9> <1961> <8823> <1962> <86AB> <1963> <86D4> <1964> <86DE> <1965> <86E9> <1966> <86EC> <1967> <86DF> <1968> <86DB> <1969> <86EF> <196A> <8712> <196B> <8706> <196C> <8708> <196D> <8700> <196E> <8703> <196F> <86FB> <1970> <8711> <1971> <8709> <1972> <870D> <1973> <86F9> <1974> <870A> <1975> <8734> <1976> <873F> <1977> <8737> <1978> <873B> <1979> <8725> <197A> <8729> <197B> <871A> <197C> <8760> <197D> <875F> <197E> <8778> <197F> <874C> <1980> <874E> <1981> <8774> <1982> <8757> <1983> <8768> <1984> <876E> <1985> <8759> <1986> <8753> <1987> <8763> <1988> <876A> <1989> <8805> <198A> <87A2> <198B> <879F> <198C> <8782> <198D> <87AF> <198E> <87CB> <198F> <87BD> <1990> <87C0> <1991> <87D0> <1992> <96D6> <1993> <87AB> <1994> <87C4> <1995> <87B3> <1996> <87C7> <1997> <87C6> <1998> <87BB> endbfchar 100 beginbfchar <1999> <87EF> <199A> <87F2> <199B> <87E0> <199C> <880F> <199D> <880D> <199E> <87FE> <19A1> <880E> <19A2> <87D2> <19A3> <8811> <19A4> <8816> <19A5> <8815> <19A6> <8822> <19A7> <8821> <19A8> <8831> <19A9> <8836> <19AA> <8839> <19AB> <8827> <19AC> <883B> <19AD> <8844> <19AE> <8842> <19AF> <8852> <19B0> <8859> <19B1> <885E> <19B2> <8862> <19B3> <886B> <19B4> <8881> <19B5> <887E> <19B6> <889E> <19B7> <8875> <19B8> <887D> <19B9> <88B5> <19BA> <8872> <19BB> <8882> <19BC> <8897> <19BD> <8892> <19BE> <88AE> <19BF> <8899> <19C0> <88A2> <19C1> <888D> <19C2> <88A4> <19C3> <88B0> <19C4> <88BF> <19C5> <88B1> <19C8> <88D4> <19CB> <88DD> <19CC> <88F9> <19CD> <8902> <19CE> <88FC> <19CF> <88F4> <19D0> <88E8> <19D1> <88F2> <19D2> <8904> <19D3> <890C> <19D4> <890A> <19D5> <8913> <19D6> <8943> <19D7> <891E> <19D8> <8925> <19DB> <8941> <19DC> <8944> <19DD> <893B> <19DE> <8936> <19DF> <8938> <19E0> <894C> <19E1> <891D> <19E2> <8960> <19E3> <895E> <19E4> <8966> <19E5> <8964> <19E6> <896D> <19E7> <896A> <19E8> <896F> <19E9> <8974> <19EA> <8977> <19EB> <897E> <19EC> <8983> <19ED> <8988> <19EE> <898A> <19EF> <8993> <19F0> <8998> <19F1> <89A1> <19F2> <89A9> <19F3> <89A6> <19F4> <89AC> <19F5> <89AF> <19F6> <89B2> <19F7> <89BA> <19F8> <89BD> <19FB> <89DA> <19FE> <89E7> <19FF> <89F4> <1A00> <89F8> <1A01> <8A03> <1A02> <8A16> <1A03> <8A10> <1A04> <8A0C> <1A05> <8A1B> <1A06> <8A1D> <1A07> <8A25> <1A08> <8A36> endbfchar 100 beginbfchar <1A09> <8A41> <1A0A> <8A5B> <1A0B> <8A52> <1A0C> <8A46> <1A0D> <8A48> <1A0E> <8A7C> <1A0F> <8A6D> <1A10> <8A6C> <1A11> <8A62> <1A12> <8A85> <1A13> <8A82> <1A14> <8A84> <1A15> <8AA8> <1A16> <8AA1> <1A17> <8A91> <1A1A> <8A9A> <1A1B> <8AA3> <1A1C> <8AC4> <1A1D> <8ACD> <1A1E> <8AC2> <1A1F> <8ADA> <1A20> <8AEB> <1A21> <8AF3> <1A22> <8AE7> <1A23> <8AE4> <1A24> <8AF1> <1A25> <8B14> <1A26> <8AE0> <1A27> <8AE2> <1A28> <8AF7> <1A29> <8ADE> <1A2A> <8ADB> <1A2B> <8B0C> <1A2C> <8B07> <1A2D> <8B1A> <1A2E> <8AE1> <1A2F> <8B16> <1A30> <8B10> <1A31> <8B17> <1A32> <8B20> <1A33> <8B33> <1A34> <97AB> <1A35> <8B26> <1A36> <8B2B> <1A37> <8B3E> <1A38> <8B28> <1A39> <8B41> <1A3A> <8B4C> <1A3B> <8B4F> <1A3C> <8B4E> <1A3D> <8B49> <1A3E> <8B56> <1A3F> <8B5B> <1A40> <8B5A> <1A41> <8B6B> <1A42> <8B5F> <1A43> <8B6C> <1A44> <8B6F> <1A45> <8B74> <1A46> <8B7D> <1A47> <8B80> <1A48> <8B8C> <1A49> <8B8E> <1A4C> <8B96> <1A4F> <8C3A> <1A50> <8C41> <1A51> <8C3F> <1A52> <8C48> <1A53> <8C4C> <1A54> <8C4E> <1A55> <8C50> <1A56> <8C55> <1A57> <8C62> <1A58> <8C6C> <1A59> <8C78> <1A5A> <8C7A> <1A5B> <8C82> <1A5C> <8C89> <1A5D> <8C85> <1A5E> <8C8A> <1A61> <8C94> <1A62> <8C7C> <1A63> <8C98> <1A64> <621D> <1A65> <8CAD> <1A66> <8CAA> <1A67> <8CBD> <1A6A> <8CAE> <1A6B> <8CB6> <1A6C> <8CC8> <1A6D> <8CC1> <1A6E> <8CE4> <1A6F> <8CE3> <1A70> <8CDA> <1A71> <8CFD> <1A76> <8D0A> <1A77> <8D07> <1A78> <8D0F> <1A79> <8D0D> <1A7A> <8D10> endbfchar 100 beginbfchar <1A7B> <9F4E> <1A7C> <8D13> <1A7D> <8CCD> <1A7E> <8D14> <1A7F> <8D16> <1A80> <8D67> <1A81> <8D6D> <1A82> <8D71> <1A83> <8D73> <1A84> <8D81> <1A85> <8D99> <1A86> <8DC2> <1A87> <8DBE> <1A88> <8DBA> <1A89> <8DCF> <1A8A> <8DDA> <1A8B> <8DD6> <1A8C> <8DCC> <1A8D> <8DDB> <1A8E> <8DCB> <1A91> <8DDF> <1A92> <8DE3> <1A93> <8DFC> <1A96> <8DFF> <1A99> <8E10> <1A9A> <8E1F> <1A9B> <8E42> <1A9C> <8E35> <1A9D> <8E30> <1A9E> <8E34> <1A9F> <8E4A> <1AA0> <8E47> <1AA1> <8E49> <1AA2> <8E4C> <1AA3> <8E50> <1AA4> <8E48> <1AA5> <8E59> <1AA6> <8E64> <1AA7> <8E60> <1AA8> <8E2A> <1AA9> <8E63> <1AAA> <8E55> <1AAB> <8E76> <1AAC> <8E72> <1AAD> <8E7C> <1AAE> <8E81> <1AAF> <8E87> <1AB0> <8E85> <1AB1> <8E84> <1AB2> <8E8B> <1AB3> <8E8A> <1AB4> <8E93> <1AB5> <8E91> <1AB6> <8E94> <1AB7> <8E99> <1AB8> <8EAA> <1AB9> <8EA1> <1ABA> <8EAC> <1ABB> <8EB0> <1ABC> <8EC6> <1ABD> <8EB1> <1ABE> <8EBE> <1ABF> <8EC5> <1AC0> <8EC8> <1AC1> <8ECB> <1AC2> <8EDB> <1AC3> <8EE3> <1AC4> <8EFC> <1AC5> <8EFB> <1AC6> <8EEB> <1AC7> <8EFE> <1AC8> <8F0A> <1AC9> <8F05> <1ACA> <8F15> <1ACB> <8F12> <1ACC> <8F19> <1ACD> <8F13> <1ACE> <8F1C> <1ACF> <8F1F> <1AD0> <8F1B> <1AD1> <8F0C> <1AD2> <8F26> <1AD3> <8F33> <1AD4> <8F3B> <1AD5> <8F39> <1AD6> <8F45> <1AD7> <8F42> <1AD8> <8F3E> <1AD9> <8F4C> <1ADA> <8F49> <1ADB> <8F46> <1ADC> <8F4E> <1ADD> <8F57> <1ADE> <8F5C> <1AE2> <8F9C> <1AE3> <8F9F> <1AE4> <8FA3> <1AE5> <8FAD> <1AE6> <8FAF> <1AE7> <8FB7> endbfchar 100 beginbfchar <1AE8> <8FDA> <1AE9> <8FE5> <1AEA> <8FE2> <1AEB> <8FEA> <1AEC> <8FEF> <1AED> <9087> <1AEE> <8FF4> <1AEF> <9005> <1AF2> <9011> <1AF3> <9015> <1AF4> <9021> <1AF5> <900D> <1AF6> <901E> <1AF7> <9016> <1AF8> <900B> <1AF9> <9027> <1AFA> <9036> <1AFB> <9035> <1AFC> <9039> <1AFD> <8FF8> <1B02> <900E> <1B03> <9049> <1B04> <903E> <1B05> <9056> <1B06> <9058> <1B07> <905E> <1B08> <9068> <1B09> <906F> <1B0A> <9076> <1B0B> <96A8> <1B0C> <9072> <1B0D> <9082> <1B0E> <907D> <1B0F> <9081> <1B10> <9080> <1B11> <908A> <1B12> <9089> <1B13> <908F> <1B14> <90A8> <1B15> <90AF> <1B16> <90B1> <1B17> <90B5> <1B18> <90E2> <1B19> <90E4> <1B1A> <6248> <1B1B> <90DB> <1B1C> <9102> <1B1D> <9112> <1B1E> <9119> <1B1F> <9132> <1B20> <9130> <1B21> <914A> <1B22> <9156> <1B23> <9158> <1B24> <9163> <1B25> <9165> <1B26> <9169> <1B27> <9173> <1B28> <9172> <1B29> <918B> <1B2A> <9189> <1B2B> <9182> <1B2C> <91A2> <1B2D> <91AB> <1B2E> <91AF> <1B2F> <91AA> <1B30> <91B5> <1B31> <91B4> <1B32> <91BA> <1B35> <91C9> <1B36> <91CB> <1B37> <91D0> <1B38> <91D6> <1B39> <91DF> <1B3A> <91E1> <1B3B> <91DB> <1B3C> <91FC> <1B3F> <921E> <1B40> <91FF> <1B41> <9214> <1B42> <922C> <1B43> <9215> <1B44> <9211> <1B45> <925E> <1B46> <9257> <1B47> <9245> <1B48> <9249> <1B49> <9264> <1B4A> <9248> <1B4B> <9295> <1B4C> <923F> <1B4D> <924B> <1B4E> <9250> <1B4F> <929C> <1B50> <9296> <1B51> <9293> <1B52> <929B> <1B53> <925A> <1B54> <92CF> <1B55> <92B9> endbfchar 100 beginbfchar <1B56> <92B7> <1B57> <92E9> <1B58> <930F> <1B59> <92FA> <1B5A> <9344> <1B5B> <932E> <1B5C> <9319> <1B5D> <9322> <1B5E> <931A> <1B5F> <9323> <1B60> <933A> <1B61> <9335> <1B62> <933B> <1B63> <935C> <1B64> <9360> <1B65> <937C> <1B66> <936E> <1B67> <9356> <1B68> <93B0> <1B6B> <9394> <1B6C> <93B9> <1B6F> <93E8> <1B70> <93E5> <1B71> <93D8> <1B72> <93C3> <1B73> <93DD> <1B74> <93D0> <1B75> <93C8> <1B76> <93E4> <1B77> <941A> <1B78> <9414> <1B79> <9413> <1B7A> <9403> <1B7B> <9407> <1B7C> <9410> <1B7D> <9436> <1B7E> <942B> <1B7F> <9435> <1B80> <9421> <1B81> <943A> <1B82> <9441> <1B83> <9452> <1B84> <9444> <1B85> <945B> <1B86> <9460> <1B87> <9462> <1B88> <945E> <1B89> <946A> <1B8A> <9229> <1B8B> <9470> <1B8C> <9475> <1B8D> <9477> <1B8E> <947D> <1B8F> <945A> <1B90> <947C> <1B91> <947E> <1B92> <9481> <1B93> <947F> <1B94> <9582> <1B95> <9587> <1B96> <958A> <1B97> <9594> <1B98> <9596> <1B9B> <95A0> <1B9C> <95A8> <1B9D> <95A7> <1B9E> <95AD> <1B9F> <95BC> <1BA0> <95BB> <1BA1> <95B9> <1BA2> <95BE> <1BA3> <95CA> <1BA4> <6FF6> <1BA5> <95C3> <1BA6> <95CD> <1BA7> <95CC> <1BA8> <95D5> <1BA9> <95D4> <1BAA> <95D6> <1BAB> <95DC> <1BAC> <95E1> <1BAD> <95E5> <1BAE> <95E2> <1BAF> <9621> <1BB0> <9628> <1BB3> <9642> <1BB4> <964C> <1BB5> <964F> <1BB6> <964B> <1BB7> <9677> <1BB8> <965C> <1BB9> <965E> <1BBA> <965D> <1BBB> <965F> <1BBC> <9666> <1BBD> <9672> <1BBE> <966C> <1BBF> <968D> <1BC0> <9698> <1BC1> <9695> endbfchar 100 beginbfchar <1BC2> <9697> <1BC3> <96AA> <1BC4> <96A7> <1BC7> <96B0> <1BC8> <96B4> <1BC9> <96B6> <1BCC> <96CE> <1BCD> <96CB> <1BCE> <96C9> <1BCF> <96CD> <1BD0> <894D> <1BD1> <96DC> <1BD2> <970D> <1BD3> <96D5> <1BD4> <96F9> <1BD5> <9704> <1BD6> <9706> <1BD7> <9708> <1BD8> <9713> <1BD9> <970E> <1BDA> <9711> <1BDB> <970F> <1BDC> <9716> <1BDD> <9719> <1BDE> <9724> <1BDF> <972A> <1BE0> <9730> <1BE1> <9739> <1BE4> <9744> <1BE5> <9746> <1BE6> <9748> <1BE7> <9742> <1BE8> <9749> <1BE9> <975C> <1BEA> <9760> <1BEB> <9764> <1BEC> <9766> <1BED> <9768> <1BEE> <52D2> <1BEF> <976B> <1BF0> <9771> <1BF1> <9779> <1BF2> <9785> <1BF3> <977C> <1BF4> <9781> <1BF5> <977A> <1BF6> <9786> <1BF7> <978B> <1BFA> <979C> <1BFB> <97A8> <1BFC> <97A6> <1BFD> <97A3> <1C00> <97C3> <1C01> <97C6> <1C02> <97C8> <1C03> <97CB> <1C04> <97DC> <1C05> <97ED> <1C06> <9F4F> <1C07> <97F2> <1C08> <7ADF> <1C09> <97F6> <1C0A> <97F5> <1C0B> <980F> <1C0C> <980C> <1C0D> <9838> <1C0E> <9824> <1C0F> <9821> <1C10> <9837> <1C11> <983D> <1C12> <9846> <1C13> <984F> <1C14> <984B> <1C15> <986B> <1C19> <9874> <1C1A> <9873> <1C1B> <98AA> <1C1C> <98AF> <1C1D> <98B1> <1C1E> <98B6> <1C1F> <98C4> <1C20> <98C3> <1C21> <98C6> <1C22> <98E9> <1C23> <98EB> <1C24> <9903> <1C25> <9909> <1C26> <9912> <1C27> <9914> <1C28> <9918> <1C29> <9921> <1C2C> <9924> <1C2D> <9920> <1C2E> <992C> <1C2F> <992E> <1C32> <9942> <1C33> <9949> <1C34> <9945> <1C35> <9950> <1C36> <994B> endbfchar 100 beginbfchar <1C39> <994C> <1C3A> <9955> <1C3D> <99A5> <1C40> <99BC> <1C41> <99DF> <1C42> <99DB> <1C43> <99DD> <1C44> <99D8> <1C45> <99D1> <1C4A> <99FB> <1C4B> <99F8> <1C4C> <9A01> <1C4D> <9A0F> <1C4E> <9A05> <1C4F> <99E2> <1C50> <9A19> <1C51> <9A2B> <1C52> <9A37> <1C53> <9A45> <1C54> <9A42> <1C55> <9A40> <1C56> <9A43> <1C57> <9A3E> <1C58> <9A55> <1C59> <9A4D> <1C5A> <9A5B> <1C5B> <9A57> <1C5C> <9A5F> <1C5D> <9A62> <1C5E> <9A65> <1C5F> <9A64> <1C60> <9A69> <1C61> <9A6B> <1C62> <9A6A> <1C63> <9AAD> <1C64> <9AB0> <1C65> <9ABC> <1C66> <9AC0> <1C67> <9ACF> <1C68> <9AD1> <1C6F> <9AE6> <1C70> <9AEF> <1C71> <9AEB> <1C72> <9AEE> <1C73> <9AF4> <1C74> <9AF1> <1C75> <9AF7> <1C76> <9AFB> <1C77> <9B06> <1C78> <9B18> <1C79> <9B1A> <1C7A> <9B1F> <1C7D> <9B25> <1C84> <9B32> <1C85> <9B44> <1C86> <9B43> <1C87> <9B4F> <1C8A> <9B51> <1C8B> <9B58> <1C8C> <9B74> <1C8D> <9B93> <1C8E> <9B83> <1C8F> <9B91> <1C94> <9BA8> <1C95> <9BB4> <1C96> <9BC0> <1C97> <9BCA> <1C98> <9BB9> <1C99> <9BC6> <1C9A> <9BCF> <1C9D> <9BE3> <1C9E> <9BE2> <1C9F> <9BE4> <1CA0> <9BD4> <1CA1> <9BE1> <1CA2> <9C3A> <1CA3> <9BF2> <1CA4> <9BF1> <1CA5> <9BF0> <1CA6> <9C15> <1CA7> <9C14> <1CA8> <9C09> <1CA9> <9C13> <1CAA> <9C0C> <1CAB> <9C06> <1CAC> <9C08> <1CAD> <9C12> <1CAE> <9C0A> <1CAF> <9C04> <1CB0> <9C2E> <1CB1> <9C1B> <1CB2> <9C25> <1CB3> <9C24> <1CB4> <9C21> <1CB5> <9C30> <1CB6> <9C47> <1CB7> <9C32> <1CB8> <9C46> <1CB9> <9C3E> <1CBA> <9C5A> endbfchar 100 beginbfchar <1CBB> <9C60> <1CBC> <9C67> <1CBD> <9C76> <1CBE> <9C78> <1CBF> <9CE7> <1CC0> <9CEC> <1CC1> <9CF0> <1CC2> <9D09> <1CC3> <9D08> <1CC4> <9CEB> <1CC5> <9D03> <1CC6> <9D06> <1CC7> <9D2A> <1CC8> <9D26> <1CC9> <9DAF> <1CCA> <9D23> <1CCB> <9D1F> <1CCC> <9D44> <1CCD> <9D15> <1CCE> <9D12> <1CCF> <9D41> <1CD0> <9D3F> <1CD1> <9D3E> <1CD2> <9D46> <1CD3> <9D48> <1CD6> <9D64> <1CD7> <9D51> <1CD8> <9D50> <1CD9> <9D59> <1CDA> <9D72> <1CDB> <9D89> <1CDC> <9D87> <1CDD> <9DAB> <1CDE> <9D6F> <1CDF> <9D7A> <1CE0> <9D9A> <1CE1> <9DA4> <1CE2> <9DA9> <1CE3> <9DB2> <1CE4> <9DC4> <1CE5> <9DC1> <1CE6> <9DBB> <1CE7> <9DB8> <1CE8> <9DBA> <1CE9> <9DC6> <1CEA> <9DCF> <1CEB> <9DC2> <1CEC> <9DD9> <1CED> <9DD3> <1CEE> <9DF8> <1CEF> <9DE6> <1CF0> <9DED> <1CF1> <9DEF> <1CF2> <9DFD> <1CF5> <9E1E> <1CF6> <9E75> <1CF7> <9E79> <1CF8> <9E7D> <1CF9> <9E81> <1CFA> <9E88> <1CFD> <9E92> <1CFE> <9E95> <1CFF> <9E91> <1D00> <9E9D> <1D01> <9EA5> <1D02> <9EA9> <1D03> <9EB8> <1D04> <9EAA> <1D05> <9EAD> <1D06> <9761> <1D07> <9ECC> <1D0B> <9ED4> <1D0C> <9EDC> <1D0D> <9EDE> <1D0E> <9EDD> <1D0F> <9EE0> <1D10> <9EE5> <1D11> <9EE8> <1D12> <9EEF> <1D13> <9EF4> <1D16> <9EF9> <1D1C> <76B7> <1D1D> <9F15> <1D1E> <9F21> <1D1F> <9F2C> <1D20> <9F3E> <1D21> <9F4A> <1D22> <9F52> <1D23> <9F54> <1D24> <9F63> <1D2A> <9F6C> <1D2B> <9F6A> <1D2C> <9F77> <1D2D> <9F72> <1D2E> <9F76> <1D2F> <9F95> <1D30> <9F9C> <1D31> <9FA0> <1D32> <582F> <1D33> <69C7> endbfchar 100 beginbfchar <1D34> <9059> <1D35> <7464> <1D36> <FFFD> <1DA1> <3349> <1DA2> <3314> <1DA3> <3322> <1DA4> <334D> <1DA5> <3318> <1DA6> <3327> <1DA7> <3303> <1DA8> <3336> <1DA9> <3351> <1DAA> <3357> <1DAB> <330D> <1DAC> <3326> <1DAD> <3323> <1DAE> <332B> <1DAF> <334A> <1DB0> <333B> <1DB6> <33C4> <1DB7> <33A1> <1DB8> <301D> <1DB9> <301F> <1DBA> <2116> <1DBB> <33CD> <1DBC> <2121> <1DC4> <3239> <1DC5> <337E> <1DC6> <337D> <1DC7> <337C> <1DC8> <222E> <1DC9> <2211> <1DCA> <221A> <1DCB> <22A5> <1DCC> <2220> <1DCD> <221F> <1DCE> <22BF> <1DD1> <555E> <1DD2> <98F4> <1DD3> <6EA2> <1DD4> <9C2F> <1DD5> <6DEB> <1DD6> <8FC2> <1DD7> <6B1D> <1DD8> <53A9> <1DD9> <958F> <1DDA> <5642> <1DDB> <990C> <1DDC> <7130> <1DDD> <8956> <1DDE> <9DD7> <1DDF> <8FE6> <1DE0> <6062> <1DE1> <62D0> <1DE2> <6666> <1DE3> <559D> <1DE4> <845B> <1DE5> <9784> <1DE6> <5699> <1DE7> <6F97> <1DE8> <7FF0> <1DE9> <7FEB> <1DEA> <5FBD> <1DEB> <7947> <1DEC> <4FE0> <1DED> <537F> <1DEE> <50C5> <1DEF> <8EC0> <1DF0> <55B0> <1DF1> <6ADB> <1DF2> <5C51> <1DF3> <9774> <1DF4> <7941> <1DF5> <6167> <1DF6> <7A3D> <1DF7> <7E6B> <1DF8> <834A> <1DF9> <9699> <1DFA> <5026> <1DFB> <5ACC> <1DFC> <6372> <1DFD> <9E7C> <1DFE> <8AFA> <1DFF> <5DF7> <1E00> <663B> <1E01> <6E9D> <1E02> <9EB4> <1E03> <9D60> <1E04> <7511> <1E05> <91C7> <1E06> <698A> <1E07> <6805> <1E08> <85A9> <1E09> <9BD6> <1E0A> <9306> <1E0B> <73CA> <1E0C> <53F1> <1E0D> <5C62> <1E0E> <906E> <1E0F> <6753> endbfchar 100 beginbfchar <1E10> <707C> <1E11> <7E61> <1E12> <914B> <1E13> <66D9> <1E14> <6E1A> <1E15> <85AF> <1E16> <85F7> <1E17> <54E8> <1E18> <5EE0> <1E19> <68A2> <1E1A> <8523> <1E1B> <91AC> <1E1C> <9798> <1E1D> <8755> <1E1E> <9771> <1E1F> <9017> <1E20> <7FE0> <1E21> <647A> <1E22> <901D> <1E23> <87EC> <1E24> <64B0> <1E25> <6813> <1E26> <714E> <1E27> <717D> <1E28> <8A6E> <1E29> <564C> <1E2A> <9061> <1E2B> <5275> <1E2C> <6414> <1E2D> <7626> <1E2E> <905C> <1E2F> <9A52> <1E30> <817F> <1E31> <9EDB> <1E32> <5544> <1E33> <6FEF> <1E34> <7422> <1E35> <86F8> <1E36> <5DFD> <1E37> <8FBF> <1E38> <68DA> <1E39> <9C48> <1E3A> <6A3D> <1E3B> <7C1E> <1E3C> <8A3B> <1E3D> <7026> <1E3E> <51CB> <1E3F> <6357> <1E40> <69CC> <1E41> <939A> <1E42> <585A> <1E43> <6451> <1E44> <912D> <1E45> <64E2> <1E46> <6EBA> <1E47> <5861> <1E48> <985A> <1E49> <5835> <1E4A> <5C60> <1E4B> <83DF> <1E4C> <8CED> <1E4D> <5858> <1E4E> <79B1> <1E4F> <9D07> <1E50> <7006> <1E51> <701E> <1E52> <5678> <1E53> <9041> <1E54> <9813> <1E55> <90A3> <1E56> <8B0E> <1E57> <7058> <1E58> <6962> <1E59> <79B0> <1E5A> <56CA> <1E5B> <724C> <1E5C> <9019> <1E5D> <79E4> <1E5E> <525D> <1E5F> <7BB8> <1E60> <6F51> <1E61> <91B1> <1E62> <633D> <1E63> <6249> <1E64> <6A0B> <1E65> <67CA> <1E66> <7A17> <1E67> <903C> <1E68> <5A9B> <1E69> <8B2C> <1E6A> <5EDF> <1E6B> <7015> <1E6C> <983B> <1E6D> <853D> <1E6E> <77A5> <1E6F> <5A29> <1E70> <5E96> <1E71> <6CE1> <1E72> <84EC> <1E73> <9830> endbfchar 100 beginbfchar <1E74> <9C52> <1E75> <9EB5> <1E76> <5132> <1E77> <9905> <1E78> <7C7E> <1E79> <9453> <1E7A> <6108> <1E7B> <7652> <1E7C> <7337> <1E7D> <7194> <1E7E> <8000> <1E7F> <840A> <1E80> <907C> <1E81> <6F23> <1E82> <7149> <1E83> <84EE> <1E84> <6994> <1E85> <881F> <1E86> <5154> <1E87> <5189> <1E88> <5195> <1E89> <51A4> <1E8A> <5539> <1E8B> <5533> <1E8C> <55E4> <1E8D> <5632> <1E8E> <56A5> <1E8F> <580B> <1E90> <5ABE> <1E91> <5BC3> <1E92> <5C5B> <1E93> <5E64> <1E94> <6097> <1E95> <6369> <1E96> <6406> <1E97> <6522> <1E98> <6583> <1E99> <67A6> <1E9A> <67B4> <1E9B> <689B> <1E9C> <688E> <1E9D> <6E6E> <1E9E> <71D7> <1E9F> <7228> <1EA0> <73CE> <1EA1> <7504> <1EA2> <750D> <1EA3> <7515> <1EA4> <7693> <1EA5> <787C> <1EA6> <7A31> <1EA7> <9F9D> <1EA8> <7B99> <1EA9> <7C90> <1EAA> <7CAE> <1EAB> <7D9B> <1EAC> <7DAE> <1EAD> <7D9F> <1EAE> <7FD4> <1EAF> <822E> <1EB0> <828D> <1EB1> <82D2> <1EB2> <8323> <1EB3> <8375> <1EB4> <8517> <1EB5> <853E> <1EB6> <8782> <1EB7> <87D2> <1EB8> <890A> <1EB9> <89AF> <1EBA> <8ADE> <1EBB> <8B41> <1EBC> <8DDA> <1EBD> <8E09> <1EBE> <8F13> <1EBF> <8FEA> <1EC0> <8FE9> <1EC1> <9058> <1EC2> <6248> <1EC3> <91C1> <1EC4> <95BB> <1EC5> <7762> <1EC6> <9724> <1EC7> <9760> <1EC8> <976D> <1EC9> <9824> <1ECA> <9B2E> <1ECB> <9B97> <1ECC> <9BF2> <1ECD> <9EAA> <1ECE> <9F9C> <1ED1> <203E> <1ED2> <FF3F> <1ED3> <30FC> <1ED4> <2015> <1ED5> <2010> <1ED6> <301C> <1ED7> <2016> <1ED8> <FF5C> <1ED9> <2026> endbfchar 100 beginbfchar <1EDA> <2025> <1EDF> <FF3B> <1EE0> <FF3D> <1EE1> <FF5B> <1EE2> <FF5D> <1EED> <FF1D> <1EEE> <3041> <1EEF> <3043> <1EF0> <3045> <1EF1> <3047> <1EF2> <3049> <1EF3> <3063> <1EF4> <3083> <1EF5> <3085> <1EF6> <3087> <1EF7> <308E> <1EF8> <30A1> <1EF9> <30A3> <1EFA> <30A5> <1EFB> <30A7> <1EFC> <30A9> <1EFD> <30C3> <1EFE> <30E3> <1EFF> <30E5> <1F00> <30E7> <1F01> <30EE> <1F04> <3349> <1F05> <3314> <1F06> <3322> <1F07> <334D> <1F08> <3318> <1F09> <3327> <1F0A> <3303> <1F0B> <3336> <1F0C> <3351> <1F0D> <3357> <1F0E> <330D> <1F0F> <3326> <1F10> <3323> <1F11> <332B> <1F12> <334A> <1F13> <333B> <1F16> <3094> <1F17> <304B> <1F18> <3051> <1F19> <82A6> <1F1A> <8328> <1F1B> <5653> <1F1C> <53A9> <1F1D> <7259> <1F1E> <6C72> <1F1F> <7B08> <1F20> <9957> <1F21> <62F3> <1F22> <9910> <1F23> <976D> <1F24> <717D> <1F25> <7A7F> <1F26> <7BAD> <1F27> <63C3> <1F28> <83DF> <1F29> <7962> <1F2A> <53DB> <1F2B> <7BC7> <1F2C> <8FC4> <1F2D> <7C3E> <1F2E> <50CA> <1F2F> <5315> <1F30> <55A9> <1F31> <56AE> <1F32> <5819> <1F33> <591B> <1F34> <5C28> <1F35> <5ED0> <1F36> <5ECF> <1F37> <6241> <1F38> <66C1> <1F39> <6C08> <1F3A> <6E23> <1F3B> <6EEC> <1F3C> <7A97> <1F3D> <7BDD> <1F3E> <7FE9> <1F3F> <8422> <1F40> <8759> <1F41> <880E> <1F42> <87D2> <1F43> <9A19> <1F44> <9EAD> <1F45> <FFE4> <1F46> <FF07> <1F47> <FF02> <1F48> <11A8> <1F49> <25C1> <1F4A> <25B7> <1F4B> <21E9> <1F4C> <21E7> <1F4D> <21E6> <1F4E> <21E8> <1F4F> <25A2> endbfchar 100 beginbfchar <1F50> <2667> <1F51> <2661> <1F52> <2664> <1F53> <2662> <1F54> <33A0> <1F55> <33A2> <1F58> <3397> <1F59> <2113> <1F5A> <3398> <1F5B> <33B3> <1F5C> <33B2> <1F5D> <33B1> <1F5E> <33B0> <1F62> <33CB> <1F63> <3390> <1F64> <33D4> <1F65> <3396> <1F66> <3322> <1F67> <3316> <1F68> <3318> <1F69> <3315> <1F6A> <3303> <1F6B> <3323> <1F6C> <3357> <1F6D> <3342> <1F6E> <3339> <1F6F> <333B> <1F70> <3300> <1F71> <3331> <1F72> <3347> <1F73> <331E> <1F74> <332A> <1F75> <FFFD> <1F76> <337F> <1F77> <2121> <1F78> <260E> <1F79> <3036> <1F7A> <3020> <1F7B> <FFFD> <1F7C> <FFFD> <1F7D> <0030002E> <1F9B> <FFFD> <1FA6> <FFFD> <1FA7> <FFFD> <1FA8> <FFFD> <1FA9> <FFFD> <1FAA> <FFFD> <1FAB> <FFFD> <1FAC> <FFFD> <1FAD> <FFFD> <1FAE> <FFFD> <1FAF> <FFFD> <1FCA> <3243> <1FCB> <323D> <1FCC> <323F> <1FCD> <3234> <1FCE> <3238> <1FCF> <3233> <1FD0> <323C> <1FD1> <3242> <1FD2> <323E> <1FD3> <3236> <1FD4> <3235> <1FD5> <323B> <1FD6> <3240> <1FD7> <323A> <1FD8> <32B0> <1FD9> <32AD> <1FDA> <32A9> <1FDB> <32AF> <1FDC> <3294> <1FDD> <32AA> <1FDE> <3298> <1FDF> <32AB> <1FE0> <3292> <1FE1> <3291> <1FE2> <3293> <1FE3> <32AC> <1FE4> <32AE> <1FE5> <3296> <1FE6> <FFFD> <1FE7> <FE37> <1FE8> <FFFD> <1FE9> <FE38> <1FEA> <FFFD> <1FEB> <FFFD> <1FEC> <FFFD> <1FED> <FFFD> <1FEE> <FFFD> <1FEF> <FFFD> <1FF0> <FFFD> <1FF1> <FFFD> <1FF2> <FFFD> <1FF3> <FFFD> <1FF4> <FFFD> <1FF5> <FFFD> <1FF6> <33CC> <1FF7> <3305> <1FF8> <00BD> <1FF9> <00BC> endbfchar 100 beginbfchar <1FFA> <339F> <1FFB> <33A3> <1FFC> <33A6> <1FFD> <FFFD> <1FFE> <FFFD> <1FFF> <329E> <2002> <33C8> <2003> <222D> <2004> <FFFD> <2005> <3230> <200C> <3237> <200D> <3241> <200E> <27A1> <2011> <21E9> <2012> <25C9> <2013> <2660> <2014> <2665> <2015> <2663> <2016> <2666> <201B> <261E> <201E> <261F> <201F> <3299> <2020> <24EA> <2023> <FFFD> <2024> <FFFD> <2025> <FFFD> <202E> <258F> <202F> <258E> <2030> <258D> <2031> <258C> <2032> <258B> <2033> <258A> <2034> <2589> <2039> <2570> <203A> <256F> <203B> <2550> <203C> <255E> <203D> <256A> <203E> <2561> <2041> <25E5> <2042> <25E4> <2043> <25CF> <2044> <0ED0> <2048> <304B> <2049> <3051> <204A> <9022> <204B> <8FBB> <204C> <FF0C> <204D> <FFFD> <204E> <3013> <204F> <FFFD> <2050> <FFFD> <2051> <02CF> <2052> <FF0E> <2057> <201C> <2058> <201E> <2059> <2018> <205A> <201A> <205B> <02BA> <205C> <51DC> <205D> <7199> <2067> <0058004900490049> <2068> <005800490056> <2069> <00580056> <206C> <0078006900690069> <206D> <007800690076> <206E> <00780076> <206F> <217F> <2070> <210A> <2071> <2109> <2072> <00540042> <2073> <004600410058> <2074> <3004> <2075> <21C6> <2078> <21932191> <207D> <5927> <207E> <5C0F> <207F> <329D> <2080> <63A7> <2081> <670996504F1A793E> <2082> <8CA156E36CD54EBA> <2083> <337B> <2084> <337F> <2085> <670996504F1A793E> <2086> <8CA156E36CD54EBA> <2087> <3333> <2088> <334E> <2089> <3322> <208A> <3316> <208B> <3305> <208C> <3305> <208D> <3305> <208E> <3333> <208F> <334E> <2090> <334E> <2091> <334E> <2092> <3303> <2093> <3318> <2094> <3315> <2095> <3339> endbfchar 100 beginbfchar <2096> <3339> <2097> <3339> <2098> <3357> <2099> <3342> <209A> <3342> <209B> <3342> <209C> <3323> <209D> <333B> <209E> <3300> <209F> <331E> <20A0> <331E> <20A1> <331E> <20A2> <332A> <20A3> <332A> <20A4> <332A> <20A5> <3347> <20A6> <3331> <20A7> <7E8A> <20A8> <891C> <20A9> <9348> <20AA> <9288> <20AB> <84DC> <20AC> <4FC9> <20AD> <70BB> <20AE> <6631> <20AF> <68C8> <20B0> <92F9> <20B1> <66FB> <20B2> <5F45> <20B3> <4E28> <20B4> <4EE1> <20B5> <4EFC> <20B6> <4F00> <20B7> <4F03> <20B8> <4F39> <20B9> <4F56> <20BA> <4F92> <20BB> <4F8A> <20BC> <4F9A> <20BD> <4F94> <20BE> <4FCD> <20BF> <5040> <20C0> <5022> <20C1> <4FFF> <20C2> <501E> <20C3> <5046> <20C4> <5070> <20C5> <5042> <20C6> <5094> <20C7> <50F4> <20C8> <50D8> <20C9> <514A> <20CA> <5164> <20CB> <519D> <20CC> <51BE> <20CD> <51EC> <20CE> <5215> <20CF> <529C> <20D0> <52A6> <20D1> <52C0> <20D2> <52DB> <20D3> <5300> <20D4> <5307> <20D5> <5324> <20D6> <5372> <20D7> <5393> <20D8> <53B2> <20D9> <53DD> <20DA> <FA0E> <20DB> <549C> <20DC> <548A> <20DD> <54A9> <20DE> <54FF> <20DF> <5586> <20E0> <5759> <20E1> <5765> <20E2> <57AC> <20E3> <57C8> <20E4> <57C7> <20E7> <589E> <20E8> <58B2> <20E9> <590B> <20EA> <5953> <20EB> <595B> <20EC> <595D> <20ED> <5963> <20EE> <59A4> <20EF> <59BA> <20F0> <5B56> <20F1> <5BC0> <20F2> <752F> <20F3> <5BD8> <20F4> <5BEC> <20F5> <5C1E> <20F6> <5CA6> <20F7> <5CBA> <20F8> <5CF5> <20F9> <5D27> <20FA> <5D53> <20FB> <FA11> endbfchar 100 beginbfchar <20FC> <5D42> <20FD> <5D6D> <2100> <5DD0> <2101> <5F21> <2102> <5F34> <2103> <5F67> <2104> <5FB7> <2105> <5FDE> <2106> <605D> <2107> <6085> <2108> <608A> <2109> <60DE> <210A> <60D5> <210B> <6120> <210C> <60F2> <210D> <6111> <210E> <6137> <210F> <6130> <2110> <6198> <2111> <6213> <2112> <62A6> <2113> <63F5> <2114> <6460> <2115> <649D> <2116> <64CE> <2117> <654E> <2118> <6600> <2119> <6615> <211A> <6609> <211B> <662E> <211C> <661E> <211D> <6624> <211E> <6665> <211F> <6657> <2120> <6659> <2121> <FA12> <2122> <6673> <2123> <6699> <2124> <66A0> <2125> <66B2> <2126> <66BF> <2127> <66FA> <2128> <670E> <2129> <F929> <212A> <6766> <212B> <67BB> <212C> <6852> <212D> <67C0> <212E> <6801> <212F> <6844> <2130> <68CF> <2131> <FA13> <2132> <6968> <2133> <FA14> <2134> <6998> <2135> <69E2> <2136> <6A30> <2137> <6A6B> <2138> <6A46> <2139> <6A73> <213A> <6A7E> <213B> <6AE2> <213C> <6AE4> <213D> <6BD6> <213E> <6C3F> <213F> <6C5C> <2140> <6C86> <2141> <6C6F> <2142> <6CDA> <2143> <6D04> <2144> <6D87> <2145> <6D6F> <2146> <6D96> <2147> <6DAC> <2148> <6DCF> <2149> <6DF8> <214A> <6DF2> <214B> <6DFC> <214C> <6E39> <214D> <6E5C> <214E> <6E27> <214F> <6E3C> <2150> <6EBF> <2151> <6F88> <2152> <6FB5> <2153> <6FF5> <2154> <7005> <2155> <7007> <2156> <7028> <2157> <7085> <2158> <70AB> <2159> <710F> <215A> <7104> <215B> <715C> <215E> <FA15> <215F> <71C1> <2160> <71FE> <2161> <72B1> <2162> <72BE> <2163> <7324> endbfchar 100 beginbfchar <2164> <FA16> <2165> <7377> <2166> <73BD> <2167> <73C9> <2168> <73D6> <2169> <73E3> <216A> <73D2> <216B> <7407> <216C> <73F5> <216D> <7426> <216E> <742A> <216F> <7429> <2170> <742E> <2171> <7462> <2172> <7489> <2173> <749F> <2174> <7501> <2175> <756F> <2176> <7682> <2177> <769C> <2178> <769E> <2179> <769B> <217A> <76A6> <217B> <FA17> <217C> <7746> <217D> <52AF> <217E> <7821> <217F> <784E> <2180> <7864> <2181> <787A> <2182> <7930> <2186> <7994> <2187> <FA1B> <2188> <799B> <2189> <7AD1> <218A> <7AE7> <218B> <FA1C> <218C> <7AEB> <218D> <7B9E> <218E> <FA1D> <218F> <7D48> <2190> <7D5C> <2191> <7DB7> <2192> <7DA0> <2193> <7DD6> <2194> <7E52> <2195> <7F47> <2196> <7FA1> <2197> <FA1E> <2198> <8301> <2199> <8362> <219A> <837F> <219B> <83C7> <219C> <83F6> <219D> <8448> <219E> <84B4> <219F> <8553> <21A0> <8559> <21A1> <856B> <21A2> <FA1F> <21A3> <85B0> <21A6> <8807> <21A7> <88F5> <21A8> <8A12> <21A9> <8A37> <21AA> <8A79> <21AB> <8AA7> <21AC> <8ABE> <21AD> <8ADF> <21AE> <FA22> <21AF> <8AF6> <21B0> <8B53> <21B1> <8B7F> <21B2> <8CF0> <21B3> <8CF4> <21B4> <8D12> <21B5> <8D76> <21B6> <FA23> <21B7> <8ECF> <21BA> <9067> <21BB> <90DE> <21BC> <FA26> <21BD> <9115> <21BE> <9127> <21BF> <91DA> <21C0> <91D7> <21C1> <91DE> <21C6> <9206> <21C7> <9210> <21C8> <920A> <21C9> <923A> <21CA> <9240> <21CB> <923C> <21CC> <924E> <21CD> <9259> <21CE> <9251> <21CF> <9239> <21D0> <9267> <21D1> <92A7> <21D4> <92E7> endbfchar 100 beginbfchar <21D5> <92D7> <21D6> <92D9> <21D7> <92D0> <21D8> <FA27> <21D9> <92D5> <21DA> <92E0> <21DB> <92D3> <21DC> <9325> <21DD> <9321> <21DE> <92FB> <21DF> <FA28> <21E0> <931E> <21E1> <92FF> <21E2> <931D> <21E3> <9302> <21E4> <9370> <21E5> <9357> <21E6> <93A4> <21E7> <93C6> <21E8> <93DE> <21E9> <93F8> <21EA> <9431> <21EB> <9445> <21EC> <9448> <21ED> <9592> <21EE> <F9DC> <21EF> <FA29> <21F0> <969D> <21F1> <96AF> <21F2> <9733> <21F3> <973B> <21F4> <9743> <21F5> <974D> <21F6> <974F> <21F7> <9751> <21F8> <9755> <21F9> <9857> <21FA> <9865> <21FD> <9927> <21FE> <FA2C> <21FF> <999E> <2200> <9A4E> <2201> <9AD9> <2202> <9ADC> <2203> <9B75> <2204> <9B72> <2205> <9B8F> <2206> <9BB1> <2207> <9BBB> <2208> <9C00> <2209> <9D70> <220A> <9D6B> <220B> <FA2D> <220C> <9E19> <220D> <9ED1> <220E> <FFFD> <220F> <005C> <224C> <00A5> <226C> <00A6> <226D> <007D> <226E> <0303> <226F> <02BC> <2270> <005C> <2271> <02BB> <2272> <007C> <2273> <007E> <2277> <2044> <2278> <0192> <2279> <00A7> <227A> <00A4> <227B> <201C> <227C> <00AB> <2281> <2012> <2284> <00B7> <2285> <00B6> <2286> <2022> <2287> <201A> <2288> <201E> <2289> <201D> <228A> <00BB> <228B> <2026> <228C> <2030> <228D> <00BF> <2290> <00AF> <2294> <030A> <2295> <00B8> <2296> <030B> <2297> <0328> <2298> <030C> <2299> <0336> <229A> <00C6> <229B> <00AA> <229C> <0141> <229D> <00D8> <229E> <0152> <229F> <00BA> <22A0> <00E6> <22A1> <0131> <22A2> <0142> <22A3> <00F8> endbfchar 100 beginbfchar <22A4> <0153> <22A5> <00DF> <22A6> <002D> <22A7> <00A9> <22A8> <00AC> <22A9> <00AE> <22AE> <00B5> <22AF> <00B9> <22EE> <0160> <22EF> <0178> <22F0> <017D> <22F1> <0305> <22F2> <0161> <22F3> <2122> <22F4> <017E> <22F5> <0030> <22F6> <2002> <2332> <00A5> <2354> <203E> <2355> <FFFD> <2356> <2032> <2357> <FFFD> <2358> <2036> <2359> <00C4> <235A> <00F9> <235B> <00E9> <235C> <00ED> <235D> <00DF> <235E> <00E7> <235F> <00C7> <2360> <FFFD> <2361> <FFFD> <2364> <00F3> <2365> <00FA> <2366> <00A1> <2367> <00BF> <2368> <00BD> <2369> <00D6> <236A> <00DC> <236B> <00E4> <236C> <00EB> <236D> <00EF> <236E> <00F6> <236F> <00DC> <2370> <00E2> <2371> <00EA> <2372> <00EE> <2373> <00F4> <2374> <00FC> <2375> <00E0> <2376> <00E9> <2377> <00E1> <2378> <007E> <2379> <FFFD> <237A> <FFFD> <237B> <005C> <23BE> <30EE> <23BF> <30AB> <23C0> <30B1> <23C1> <FFFD> <23C2> <30AC> <23C3> <30AE> <23C4> <30B0> <23C5> <30B2> <23C6> <30B4> <23C7> <30B6> <23C8> <30B8> <23C9> <30BA> <23CA> <30BC> <23CB> <30BE> <23CC> <30C0> <23CD> <30C2> <23CE> <30C5> <23CF> <30C7> <23D0> <30C9> <23DB> <FF60> <23DC> <3092> <23DD> <3041> <23DE> <3043> <23DF> <3045> <23E0> <3047> <23E1> <3049> <23E2> <3083> <23E3> <3085> <23E4> <3087> <23E5> <3063> <23E6> <3042> <23E7> <3044> <23E8> <3046> <23E9> <3048> <23EC> <304D> <23ED> <304F> <23EE> <3051> <23EF> <3053> <23F0> <3055> <23F1> <3057> <23F2> <3059> <23F3> <305B> <23F4> <305D> <23F5> <305F> endbfchar 100 beginbfchar <23F6> <3061> <23F7> <3064> <23F8> <3066> <23F9> <3068> <2400> <3072> <2401> <3075> <2402> <3078> <2403> <307B> <2409> <3084> <240A> <3086> <2411> <308F> <2412> <3093> <2415> <308E> <2416> <304C> <2417> <304E> <2418> <3050> <2419> <3052> <241A> <3054> <241B> <3056> <241C> <3068> <241D> <305A> <241E> <305C> <241F> <305E> <2420> <3060> <2421> <3062> <2422> <3065> <2423> <3067> <2424> <3069> <242F> <FF9E> <2430> <FFFD> <2431> <005B> <2432> <005D> <2433> <FFFD> <2434> <FFFD> <2435> <FFFD> <2436> <FFFD> <2439> <FFFD> <243A> <FFFD> <243B> <2012> <243C> <FF60> <2489> <25B2> <248A> <20AC> <248B> <2126> <248E> <FB00> <2491> <0101> <2492> <012B> <2493> <016B> <2494> <0113> <2495> <014D> <2496> <0100> <2497> <012A> <2498> <016A> <2499> <0112> <249A> <014C> <24A1> <2070> <24B2> <01CD> <24B3> <011A> <24B4> <0045030A> <24B5> <0EBC> <24B6> <01CF> <24B7> <0049030A> <24B8> <0128> <24B9> <01D1> <24BA> <004F030A> <24BB> <01D3> <24BC> <016E> <24BD> <0168> <24BE> <01CE> <24BF> <011B> <24C0> <0065030A> <24C1> <0EBD> <24C2> <01D0> <24C3> <0131030A> <24C4> <0129> <24C5> <01D2> <24C6> <006F030A> <24C7> <01D4> <24C8> <016F> <24C9> <0169> <24CA> <0251> <24CB> <0251> <24CC> <0251> <24CD> <01FD> <24CE> <00E6> <24CF> <0254> <24D0> <0254> <24D1> <0254> <24D2> <0259> <24D3> <0259> <24D6> <025A> <24D9> <025B> <24DA> <025B> <24DB> <006A> <24DC> <014B> <24DD> <0275> <24DE> <028C> <24DF> <028C> <24E0> <028C> <24E1> <0292> <24E2> <0283> endbfchar 100 beginbfchar <24E3> <02D0> <2520> <00A5> <2540> <00A6> <2541> <007D> <2542> <0303> <2543> <02BC> <2544> <005C> <2545> <02BB> <2546> <007C> <2547> <007E> <254B> <2044> <254C> <0192> <254D> <00A7> <254E> <00A4> <254F> <201C> <2550> <00AB> <2555> <2012> <2558> <00B7> <2559> <00B6> <255A> <2022> <255B> <201A> <255C> <201E> <255D> <201D> <255E> <00BB> <255F> <2026> <2560> <2030> <2561> <00BF> <2564> <00AF> <2568> <030A> <2569> <00B8> <256A> <030B> <256B> <0328> <256C> <030C> <256D> <0336> <256E> <00C6> <256F> <00AA> <2570> <0141> <2571> <00D8> <2572> <0152> <2573> <00BA> <2574> <00E6> <2575> <0131> <2576> <0142> <2577> <00F8> <2578> <0153> <2579> <00DF> <257A> <002D> <257B> <00A9> <257C> <00AC> <257D> <00AE> <2582> <00B5> <2583> <00B9> <25C2> <0160> <25C3> <0178> <25C4> <017D> <25C5> <0305> <25C6> <0161> <25C7> <2122> <25C8> <017E> <25C9> <0030> <25CA> <20AC> <25CB> <2126> <25CE> <FB00> <25D1> <0101> <25D2> <012B> <25D3> <016B> <25D4> <0113> <25D5> <014D> <25D6> <0100> <25D7> <012A> <25D8> <016A> <25D9> <0112> <25DA> <014C> <25E1> <2070> <25F2> <01CD> <25F3> <011A> <25F4> <0045030A> <25F5> <0EBC> <25F6> <01CF> <25F7> <0049030A> <25F8> <0128> <25F9> <01D1> <25FA> <004F030A> <25FB> <01D3> <25FC> <016E> <25FD> <0168> <25FE> <01CE> <25FF> <011B> <2600> <0065030A> <2601> <0EBD> <2602> <01D0> <2603> <0131030A> <2604> <0129> <2605> <01D2> <2606> <006F030A> <2607> <01D4> <2608> <016F> <2609> <0169> <2614> <0336> <2615> <002D> endbfchar 100 beginbfchar <2616> <003D> <2617> <002C> <2628> <0336> <2629> <002D> <262A> <003D> <262B> <002C> <2632> <00B7> <2633> <20AC> <2634> <0030002F0033> <2637> <00BE> <263E> <0031002F0037> <263F> <0032002F0037> <2640> <0033002F0037> <2641> <0034002F0037> <2642> <0035002F0037> <2643> <0036002F0037> <2648> <0031002F0039> <2649> <0032002F0039> <264A> <0034002F0039> <264B> <0035002F0039> <264C> <0037002F0039> <264D> <0038002F0039> <264E> <0031002F00310030> <264F> <0033002F00310030> <2650> <0037002F00310030> <2651> <0039002F00310030> <2652> <0031002F00310031> <2653> <0032002F00310031> <2654> <0033002F00310031> <2655> <0034002F00310031> <2656> <0035002F00310031> <2657> <0036002F00310031> <2658> <0037002F00310031> <2659> <0038002F00310031> <265A> <0039002F00310031> <265B> <00310030002F00310031> <265C> <0031002F00310032> <265D> <0035002F00310032> <265E> <0037002F00310032> <265F> <00310031002F00310032> <2660> <0031002F003100300030> <2661> <0030002F0033> <2662> <0031002F0032> <2663> <0031002F0033> <2664> <0032002F0033> <2665> <0031002F0034> <2666> <0033002F0034> <2667> <0031002F0035> <2668> <0032002F0035> <2669> <0033002F0035> <266A> <0034002F0035> <266B> <0031002F0036> <266C> <0035002F0036> <266D> <0031002F0037> <266E> <0032002F0037> <266F> <0033002F0037> <2670> <0034002F0037> <2671> <0035002F0037> <2672> <0036002F0037> <2673> <0031002F0038> <2674> <0033002F0038> <2675> <0035002F0038> <2676> <0037002F0038> <2677> <0031002F0039> <2678> <0032002F0039> <2679> <0034002F0039> <267A> <0035002F0039> <267B> <0037002F0039> <267C> <0038002F0039> <267D> <0031002F00310030> <267E> <0033002F00310030> <267F> <0037002F00310030> <2680> <0039002F00310030> <2681> <0031002F00310031> <2682> <0032002F00310031> <2683> <0033002F00310031> <2684> <0034002F00310031> <2685> <0035002F00310031> <2686> <0036002F00310031> <2687> <0037002F00310031> <2688> <0038002F00310031> <2689> <0039002F00310031> <268A> <00310030002F00310031> <268B> <0031002F00310032> <268C> <0035002F00310032> <268D> <0037002F00310032> <268E> <00310031002F00310032> <268F> <0031002F003100300030> <269A> <0030> <269B> <2163> <269C> <00300030> <269D> <00300031> <269E> <00300032> <269F> <00300033> <26A0> <00300034> <26A1> <00300035> <26A2> <00300036> <26A3> <00300037> <26A4> <00300038> <26A5> <00300039> endbfchar 100 beginbfchar <26A6> <00320031> <26A7> <00320032> <26A8> <00320033> <26A9> <00320034> <26AA> <00320035> <26AB> <00320036> <26AC> <00320037> <26AD> <00320038> <26AE> <00320039> <26AF> <00330030> <26B0> <00330031> <26B1> <00330032> <26B2> <00330033> <26B3> <00330034> <26B4> <00330035> <26B5> <00330036> <26B6> <00330037> <26B7> <00330038> <26B8> <00330039> <26B9> <00340030> <26BA> <00340031> <26BB> <00340032> <26BC> <00340033> <26BD> <00340034> <26BE> <00340035> <26BF> <00340036> <26C0> <00340037> <26C1> <00340038> <26C2> <00340039> <26C3> <00350030> <26C4> <00350031> <26C5> <00350032> <26C6> <00350033> <26C7> <00350034> <26C8> <00350035> <26C9> <00350036> <26CA> <00350037> <26CB> <00350038> <26CC> <00350039> <26CD> <00360030> <26CE> <00360031> <26CF> <00360032> <26D0> <00360033> <26D1> <00360034> <26D2> <00360035> <26D3> <00360036> <26D4> <00360037> <26D5> <00360038> <26D6> <00360039> <26D7> <00370030> <26D8> <00370031> <26D9> <00370032> <26DA> <00370033> <26DB> <00370034> <26DC> <00370035> <26DD> <00370036> <26DE> <00370037> <26DF> <00370038> <26E0> <00370039> <26E1> <00380030> <26E2> <00380031> <26E3> <00380032> <26E4> <00380033> <26E5> <00380034> <26E6> <00380035> <26E7> <00380036> <26E8> <00380037> <26E9> <00380038> <26EA> <00380039> <26EB> <00390030> <26EC> <00390031> <26ED> <00390032> <26EE> <00390033> <26EF> <00390034> <26F0> <00390035> <26F1> <00390036> <26F2> <00390037> <26F3> <00390038> <26F4> <00390039> <26F5> <003100300030> <2702> <0078006900690069> <2703> <007800690076> <2704> <00780076> <2711> <0058004900490049> <2712> <005800490056> <2713> <00580056> <272E> <3042> <272F> <3044> <2730> <3046> <2731> <3048> <2734> <304D> <2735> <304F> <2736> <3051> <2737> <3053> <2738> <3055> <2739> <3057> <273A> <3059> <273B> <305B> <273C> <305D> <273D> <305F> endbfchar 100 beginbfchar <273E> <3061> <273F> <3064> <2740> <3066> <2741> <3068> <2748> <3072> <2749> <3075> <274A> <3078> <274B> <307B> <2751> <3084> <2752> <3086> <275E> <30A2> <275F> <30A4> <2760> <30A6> <2761> <30A8> <2764> <30AD> <2765> <30AF> <2766> <30B1> <2767> <30B3> <2768> <30B5> <2769> <30B7> <276A> <30B9> <276B> <30BB> <276C> <30BD> <276D> <30BF> <276E> <30C1> <276F> <30C4> <2770> <30C6> <2771> <30C8> <2778> <30D2> <2779> <30D5> <277A> <30D8> <277B> <30DB> <2781> <30E4> <2782> <30E6> <2798> <53414E00> <2799> <53414E8C> <279A> <53414E09> <279B> <534156DB> <279C> <53414E94> <279D> <5341516D> <279E> <53414E03> <279F> <5341516B> <27A0> <53414E5D> <27A1> <4E8C5341> <27A2> <55B6> <27A3> <5408> <27A4> <6CEB> <27A5> <554F> <27A6> <7B54> <27A7> <4F8B> <27BC> <3063> <27BD> <624D> <27BE> <3007> <27BF> <4E00> <27C0> <4E8C> <27C1> <4E09> <27C2> <56DB> <27C3> <4E94> <27C4> <516D> <27C5> <4E03> <27C6> <516B> <27C7> <4E5D> <27C8> <5341> <27C9> <3007> <27CA> <4E00> <27CB> <4E8C> <27CC> <4E09> <27CD> <56DB> <27CE> <4E94> <27CF> <516D> <27D0> <4E03> <27D1> <516B> <27D2> <4E5D> <27D3> <5341> <27D4> <3007> <27D5> <4E00> <27D6> <4E8C> <27D7> <4E09> <27D8> <56DB> <27D9> <4E94> <27DA> <516D> <27DB> <4E03> <27DC> <516B> <27DD> <4E5D> <27DE> <3064> <27DF> <624D> <27E0> <4E00> <27E1> <4E8C> <27E2> <4E09> <27E3> <56DB> <27E4> <4E94> <27E5> <516D> <27E6> <4E03> <27E7> <516B> <27E8> <4E5D> <27E9> <5341> <27EA> <3007> <27EB> <4E00> <27EC> <4E8C> <27ED> <4E09> endbfchar 100 beginbfchar <27EE> <56DB> <27EF> <4E94> <27F0> <516D> <27F1> <4E03> <27F2> <516B> <27F3> <4E5D> <27F4> <5341> <27F5> <30B3> <27F6> <3063> <27F7> <30C3> <27F8> <30A9> <27F9> <00280029> <27FA> <00300030> <2804> <00330032> <2805> <00330033> <2806> <00330034> <2807> <00330035> <2808> <00330036> <2809> <00330037> <280A> <00330038> <280B> <00330039> <280C> <00340030> <280D> <00340031> <280E> <00340032> <280F> <00340033> <2810> <00340034> <2811> <00340035> <2812> <00340036> <2813> <00340037> <2814> <00340038> <2815> <00340039> <2816> <00350030> <2817> <00350031> <2818> <00350032> <2819> <00350033> <281A> <00350034> <281B> <00350035> <281C> <00350036> <281D> <00350037> <281E> <00350038> <281F> <00350039> <2820> <00360030> <2821> <00360031> <2822> <00360032> <2823> <00360033> <2824> <00360034> <2825> <00360035> <2826> <00360036> <2827> <00360037> <2828> <00360038> <2829> <00360039> <282A> <00370030> <282B> <00370031> <282C> <00370032> <282D> <00370033> <282E> <00370034> <282F> <00370035> <2830> <00370036> <2831> <00370037> <2832> <00370038> <2833> <00370039> <2834> <00380030> <2835> <00380031> <2836> <00380032> <2837> <00380033> <2838> <00380034> <2839> <00380035> <283A> <00380036> <283B> <00380037> <283C> <00380038> <283D> <00380039> <283E> <00390030> <283F> <00390031> <2840> <00390032> <2841> <00390033> <2842> <00390034> <2843> <00390035> <2844> <00390036> <2845> <00390037> <2846> <00390038> <2847> <00390039> <2848> <003100300030> <287D> <3042> <287E> <3044> <287F> <3046> <2880> <3048> <2883> <304D> <2884> <304F> <2885> <3051> <2886> <3053> <2887> <3055> <2888> <3057> <2889> <3059> <288A> <305B> <288B> <305D> <288C> <305F> <288D> <3061> <288E> <3064> <288F> <3066> <2890> <3068> endbfchar 100 beginbfchar <2897> <3072> <2898> <3075> <2899> <3078> <289A> <307B> <28A0> <3084> <28A1> <3086> <28DC> <30F3> <28E7> <3290> <28EE> <8ABF> <28EF> <329F> <28F0> <526F> <28F1> <6E1B> <28F2> <6A19> <28F3> <6B20> <28F4> <57FA> <28F5> <7981> <28F8> <329B> <28F9> <329A> <28FA> <32A3> <28FB> <32A2> <28FC> <3297> <28FD> <51FA> <28FE> <329C> <28FF> <3295> <2900> <6E08> <2901> <5897> <2902> <554F> <2903> <7B54> <2904> <4F8B> <2905> <96FB> <2906> <25CC> <2907> <0030> <2908> <00300030> <2909> <00300031> <290A> <00300032> <290B> <00300033> <290C> <00300034> <290D> <00300035> <290E> <00300036> <290F> <00300037> <2910> <00300038> <2911> <00300039> <2912> <00310030> <2913> <00310031> <2914> <00310032> <2915> <00310033> <2916> <00310034> <2917> <00310035> <2918> <00310036> <2919> <00310037> <291A> <00310038> <291B> <00310039> <291C> <00320030> <291D> <00320031> <291E> <00320032> <291F> <00320033> <2920> <00320034> <2921> <00320035> <2922> <00320036> <2923> <00320037> <2924> <00320038> <2925> <00320039> <2926> <00330030> <2927> <00330031> <2928> <00330032> <2929> <00330033> <292A> <00330034> <292B> <00330035> <292C> <00330036> <292D> <00330037> <292E> <00330038> <292F> <00330039> <2930> <00340030> <2931> <00340031> <2932> <00340032> <2933> <00340033> <2934> <00340034> <2935> <00340035> <2936> <00340036> <2937> <00340037> <2938> <00340038> <2939> <00340039> <293A> <00350030> <293B> <00350031> <293C> <00350032> <293D> <00350033> <293E> <00350034> <293F> <00350035> <2940> <00350036> <2941> <00350037> <2942> <00350038> <2943> <00350039> <2944> <00360030> <2945> <00360031> <2946> <00360032> <2947> <00360033> <2948> <00360034> <2949> <00360035> <294A> <00360036> <294B> <00360037> endbfchar 100 beginbfchar <294C> <00360038> <294D> <00360039> <294E> <00370030> <294F> <00370031> <2950> <00370032> <2951> <00370033> <2952> <00370034> <2953> <00370035> <2954> <00370036> <2955> <00370037> <2956> <00370038> <2957> <00370039> <2958> <00380030> <2959> <00380031> <295A> <00380032> <295B> <00380033> <295C> <00380034> <295D> <00380035> <295E> <00380036> <295F> <00380037> <2960> <00380038> <2961> <00380039> <2962> <00390030> <2963> <00390031> <2964> <00390032> <2965> <00390033> <2966> <00390034> <2967> <00390035> <2968> <00390036> <2969> <00390037> <296A> <00390038> <296B> <00390039> <296C> <003100300030> <29A1> <3042> <29A2> <3044> <29A3> <3046> <29A4> <3048> <29A7> <304D> <29A8> <304F> <29A9> <3051> <29AA> <3053> <29AB> <3055> <29AC> <3057> <29AD> <3059> <29AE> <305B> <29AF> <305D> <29B0> <305F> <29B1> <3061> <29B2> <3064> <29B3> <3066> <29B4> <3068> <29BB> <3072> <29BC> <3075> <29BD> <3078> <29BE> <307B> <29C4> <3084> <29C5> <3086> <29D1> <30A2> <29D2> <30A4> <29D3> <30A6> <29D4> <30A8> <29D7> <30AD> <29D8> <30AF> <29D9> <30B1> <29DA> <30B3> <29DB> <30B5> <29DC> <30B7> <29DD> <30B9> <29DE> <30BB> <29DF> <30BD> <29E0> <30BF> <29E1> <30C1> <29E2> <30C4> <29E3> <30C6> <29E4> <30C8> <29EB> <30D2> <29EC> <30D5> <29ED> <30D8> <29EE> <30DB> <29F4> <30E4> <29F5> <30E6> <2A00> <30F3> <2A01> <65E5> <2A02> <6708> <2A03> <706B> <2A04> <6C34> <2A05> <6728> <2A06> <91D1> <2A07> <571F> <2A08> <554F> <2A09> <7B54> <2A0A> <4F8B> <2A0B> <25CF> <2A0C> <0030> <2A0D> <00300030> <2A0E> <0031> <2A0F> <00300031> <2A10> <0032> <2A11> <00300032> <2A12> <0033> endbfchar 100 beginbfchar <2A13> <00300033> <2A14> <0034> <2A15> <00300034> <2A16> <0035> <2A17> <00300035> <2A18> <0036> <2A19> <00300036> <2A1A> <0037> <2A1B> <00300037> <2A1C> <0038> <2A1D> <00300038> <2A1E> <0039> <2A1F> <00300039> <2A20> <00310030> <2A21> <00310031> <2A22> <00310032> <2A23> <00310033> <2A24> <00310034> <2A25> <00310035> <2A26> <00310036> <2A27> <00310037> <2A28> <00310038> <2A29> <00310039> <2A2A> <00320030> <2A2B> <00320031> <2A2C> <00320032> <2A2D> <00320033> <2A2E> <00320034> <2A2F> <00320035> <2A30> <00320036> <2A31> <00320037> <2A32> <00320038> <2A33> <00320039> <2A34> <00330030> <2A35> <00330031> <2A36> <00330032> <2A37> <00330033> <2A38> <00330034> <2A39> <00330035> <2A3A> <00330036> <2A3B> <00330037> <2A3C> <00330038> <2A3D> <00330039> <2A3E> <00340030> <2A3F> <00340031> <2A40> <00340032> <2A41> <00340033> <2A42> <00340034> <2A43> <00340035> <2A44> <00340036> <2A45> <00340037> <2A46> <00340038> <2A47> <00340039> <2A48> <00350030> <2A49> <00350031> <2A4A> <00350032> <2A4B> <00350033> <2A4C> <00350034> <2A4D> <00350035> <2A4E> <00350036> <2A4F> <00350037> <2A50> <00350038> <2A51> <00350039> <2A52> <00360030> <2A53> <00360031> <2A54> <00360032> <2A55> <00360033> <2A56> <00360034> <2A57> <00360035> <2A58> <00360036> <2A59> <00360037> <2A5A> <00360038> <2A5B> <00360039> <2A5C> <00370030> <2A5D> <00370031> <2A5E> <00370032> <2A5F> <00370033> <2A60> <00370034> <2A61> <00370035> <2A62> <00370036> <2A63> <00370037> <2A64> <00370038> <2A65> <00370039> <2A66> <00380030> <2A67> <00380031> <2A68> <00380032> <2A69> <00380033> <2A6A> <00380034> <2A6B> <00380035> <2A6C> <00380036> <2A6D> <00380037> <2A6E> <00380038> <2A6F> <00380039> <2A70> <00390030> <2A71> <00390031> <2A72> <00390032> <2A73> <00390033> <2A74> <00390034> <2A75> <00390035> <2A76> <00390036> endbfchar 100 beginbfchar <2A77> <00390037> <2A78> <00390038> <2A79> <00390039> <2A7A> <003100300030> <2AAF> <3042> <2AB0> <3044> <2AB1> <3046> <2AB2> <3048> <2AB5> <304D> <2AB6> <304F> <2AB7> <3051> <2AB8> <3053> <2AB9> <3055> <2ABA> <3057> <2ABB> <3059> <2ABC> <305B> <2ABD> <305D> <2ABE> <305F> <2ABF> <3061> <2AC0> <3064> <2AC1> <3066> <2AC2> <3068> <2AC9> <3072> <2ACA> <3075> <2ACB> <3078> <2ACC> <307B> <2AD2> <3084> <2AD3> <3086> <2ADF> <30A2> <2AE0> <30A4> <2AE1> <30A6> <2AE2> <30A8> <2AE5> <30AD> <2AE6> <30AF> <2AE7> <30B1> <2AE8> <30B3> <2AE9> <30B5> <2AEA> <30B7> <2AEB> <30B9> <2AEC> <30BB> <2AED> <30BD> <2AEE> <30BF> <2AEF> <30C1> <2AF0> <30C4> <2AF1> <30C6> <2AF2> <30C8> <2AF9> <30D2> <2AFA> <30D5> <2AFB> <30D8> <2AFC> <30DB> <2B02> <30E4> <2B03> <30E6> <2B0F> <65E5> <2B10> <6708> <2B11> <706B> <2B12> <6C34> <2B13> <6728> <2B14> <91D1> <2B15> <571F> <2B16> <8CA0> <2B17> <52DD> <2B18> <554F> <2B19> <7B54> <2B1A> <4F8B> <2B1B> <25A1> <2B1C> <25A1> <2B1D> <0030> <2B1E> <00300030> <2B1F> <0031> <2B20> <00300031> <2B21> <0032> <2B22> <00300032> <2B23> <0033> <2B24> <00300033> <2B25> <0034> <2B26> <00300034> <2B27> <0035> <2B28> <00300035> <2B29> <0036> <2B2A> <00300036> <2B2B> <0037> <2B2C> <00300037> <2B2D> <0038> <2B2E> <00300038> <2B2F> <0039> <2B30> <00300039> <2B31> <00310030> <2B32> <00310031> <2B33> <00310032> <2B34> <00310033> <2B35> <00310034> <2B36> <00310035> <2B37> <00310036> <2B38> <00310037> <2B39> <00310038> <2B3A> <00310039> <2B3B> <00320030> <2B3C> <00320031> <2B3D> <00320032> <2B3E> <00320033> endbfchar 100 beginbfchar <2B3F> <00320034> <2B40> <00320035> <2B41> <00320036> <2B42> <00320037> <2B43> <00320038> <2B44> <00320039> <2B45> <00330030> <2B46> <00330031> <2B47> <00330032> <2B48> <00330033> <2B49> <00330034> <2B4A> <00330035> <2B4B> <00330036> <2B4C> <00330037> <2B4D> <00330038> <2B4E> <00330039> <2B4F> <00340030> <2B50> <00340031> <2B51> <00340032> <2B52> <00340033> <2B53> <00340034> <2B54> <00340035> <2B55> <00340036> <2B56> <00340037> <2B57> <00340038> <2B58> <00340039> <2B59> <00350030> <2B5A> <00350031> <2B5B> <00350032> <2B5C> <00350033> <2B5D> <00350034> <2B5E> <00350035> <2B5F> <00350036> <2B60> <00350037> <2B61> <00350038> <2B62> <00350039> <2B63> <00360030> <2B64> <00360031> <2B65> <00360032> <2B66> <00360033> <2B67> <00360034> <2B68> <00360035> <2B69> <00360036> <2B6A> <00360037> <2B6B> <00360038> <2B6C> <00360039> <2B6D> <00370030> <2B6E> <00370031> <2B6F> <00370032> <2B70> <00370033> <2B71> <00370034> <2B72> <00370035> <2B73> <00370036> <2B74> <00370037> <2B75> <00370038> <2B76> <00370039> <2B77> <00380030> <2B78> <00380031> <2B79> <00380032> <2B7A> <00380033> <2B7B> <00380034> <2B7C> <00380035> <2B7D> <00380036> <2B7E> <00380037> <2B7F> <00380038> <2B80> <00380039> <2B81> <00390030> <2B82> <00390031> <2B83> <00390032> <2B84> <00390033> <2B85> <00390034> <2B86> <00390035> <2B87> <00390036> <2B88> <00390037> <2B89> <00390038> <2B8A> <00390039> <2B8B> <003100300030> <2BC0> <3042> <2BC1> <3044> <2BC2> <3046> <2BC3> <3048> <2BC6> <304D> <2BC7> <304F> <2BC8> <3051> <2BC9> <3053> <2BCA> <3055> <2BCB> <3057> <2BCC> <3059> <2BCD> <305B> <2BCE> <305D> <2BCF> <305F> <2BD0> <3061> <2BD1> <3064> <2BD2> <3066> <2BD3> <3068> <2BDA> <3072> <2BDB> <3075> <2BDC> <3078> <2BDD> <307B> <2BE3> <3084> endbfchar 100 beginbfchar <2BE4> <3086> <2BF0> <30A2> <2BF1> <30A4> <2BF2> <30A6> <2BF3> <30A8> <2BF6> <30AD> <2BF7> <30AF> <2BF8> <30B1> <2BF9> <30B3> <2BFA> <30B5> <2BFB> <30B7> <2BFC> <30B9> <2BFD> <30BB> <2BFE> <30BD> <2BFF> <30BF> <2C00> <30C1> <2C01> <30C4> <2C02> <30C6> <2C03> <30C8> <2C0A> <30D2> <2C0B> <30D5> <2C0C> <30D8> <2C0D> <30DB> <2C13> <30E4> <2C14> <30E6> <2C20> <65E5> <2C21> <6708> <2C22> <706B> <2C23> <6C34> <2C24> <6728> <2C25> <91D1> <2C26> <571F> <2C27> <554F> <2C28> <7B54> <2C29> <4F8B> <2C2A> <25A0> <2C2B> <0030> <2C2C> <00300030> <2C2D> <0031> <2C2E> <00300031> <2C2F> <0032> <2C30> <00300032> <2C31> <0033> <2C32> <00300033> <2C33> <0034> <2C34> <00300034> <2C35> <0035> <2C36> <00300035> <2C37> <0036> <2C38> <00300036> <2C39> <0037> <2C3A> <00300037> <2C3B> <0038> <2C3C> <00300038> <2C3D> <0039> <2C3E> <00300039> <2C3F> <00310030> <2C40> <00310031> <2C41> <00310032> <2C42> <00310033> <2C43> <00310034> <2C44> <00310035> <2C45> <00310036> <2C46> <00310037> <2C47> <00310038> <2C48> <00310039> <2C49> <00320030> <2C4A> <00320031> <2C4B> <00320032> <2C4C> <00320033> <2C4D> <00320034> <2C4E> <00320035> <2C4F> <00320036> <2C50> <00320037> <2C51> <00320038> <2C52> <00320039> <2C53> <00330030> <2C54> <00330031> <2C55> <00330032> <2C56> <00330033> <2C57> <00330034> <2C58> <00330035> <2C59> <00330036> <2C5A> <00330037> <2C5B> <00330038> <2C5C> <00330039> <2C5D> <00340030> <2C5E> <00340031> <2C5F> <00340032> <2C60> <00340033> <2C61> <00340034> <2C62> <00340035> <2C63> <00340036> <2C64> <00340037> <2C65> <00340038> <2C66> <00340039> <2C67> <00350030> <2C68> <00350031> <2C69> <00350032> <2C6A> <00350033> endbfchar 100 beginbfchar <2C6B> <00350034> <2C6C> <00350035> <2C6D> <00350036> <2C6E> <00350037> <2C6F> <00350038> <2C70> <00350039> <2C71> <00360030> <2C72> <00360031> <2C73> <00360032> <2C74> <00360033> <2C75> <00360034> <2C76> <00360035> <2C77> <00360036> <2C78> <00360037> <2C79> <00360038> <2C7A> <00360039> <2C7B> <00370030> <2C7C> <00370031> <2C7D> <00370032> <2C7E> <00370033> <2C7F> <00370034> <2C80> <00370035> <2C81> <00370036> <2C82> <00370037> <2C83> <00370038> <2C84> <00370039> <2C85> <00380030> <2C86> <00380031> <2C87> <00380032> <2C88> <00380033> <2C89> <00380034> <2C8A> <00380035> <2C8B> <00380036> <2C8C> <00380037> <2C8D> <00380038> <2C8E> <00380039> <2C8F> <00390030> <2C90> <00390031> <2C91> <00390032> <2C92> <00390033> <2C93> <00390034> <2C94> <00390035> <2C95> <00390036> <2C96> <00390037> <2C97> <00390038> <2C98> <00390039> <2C99> <003100300030> <2CCE> <3042> <2CCF> <3044> <2CD0> <3046> <2CD1> <3048> <2CD4> <304D> <2CD5> <304F> <2CD6> <3051> <2CD7> <3053> <2CD8> <3055> <2CD9> <3057> <2CDA> <3059> <2CDB> <305B> <2CDC> <305D> <2CDD> <305F> <2CDE> <3061> <2CDF> <3064> <2CE0> <3066> <2CE1> <3068> <2CE8> <3072> <2CE9> <3075> <2CEA> <3078> <2CEB> <307B> <2CF1> <3084> <2CF2> <3086> <2CFE> <30A2> <2CFF> <30A4> <2D00> <30A6> <2D01> <30A8> <2D04> <30AD> <2D05> <30AF> <2D06> <30B1> <2D07> <30B3> <2D08> <30B5> <2D09> <30B7> <2D0A> <30B9> <2D0B> <30BB> <2D0C> <30BD> <2D0D> <30BF> <2D0E> <30C1> <2D0F> <30C4> <2D10> <30C6> <2D11> <30C8> <2D18> <30D2> <2D19> <30D5> <2D1A> <30D8> <2D1B> <30DB> <2D21> <30E4> <2D22> <30E6> <2D2E> <65E5> <2D2F> <6708> <2D30> <706B> <2D31> <6C34> <2D32> <6728> endbfchar 100 beginbfchar <2D33> <91D1> <2D34> <571F> <2D35> <554F> <2D36> <7B54> <2D37> <4F8B> <2D38> <0030> <2D39> <00300030> <2D3A> <0031> <2D3B> <00300031> <2D3C> <0032> <2D3D> <00300032> <2D3E> <0033> <2D3F> <00300033> <2D40> <0034> <2D41> <00300034> <2D42> <0035> <2D43> <00300035> <2D44> <0036> <2D45> <00300036> <2D46> <0037> <2D47> <00300037> <2D48> <0038> <2D49> <00300038> <2D4A> <0039> <2D4B> <00300039> <2D4C> <00310030> <2D4D> <00310031> <2D4E> <00310032> <2D4F> <00310033> <2D50> <00310034> <2D51> <00310035> <2D52> <00310036> <2D53> <00310037> <2D54> <00310038> <2D55> <00310039> <2D56> <00320030> <2D57> <00320031> <2D58> <00320032> <2D59> <00320033> <2D5A> <00320034> <2D5B> <00320035> <2D5C> <00320036> <2D5D> <00320037> <2D5E> <00320038> <2D5F> <00320039> <2D60> <00330030> <2D61> <00330031> <2D62> <00330032> <2D63> <00330033> <2D64> <00330034> <2D65> <00330035> <2D66> <00330036> <2D67> <00330037> <2D68> <00330038> <2D69> <00330039> <2D6A> <00340030> <2D6B> <00340031> <2D6C> <00340032> <2D6D> <00340033> <2D6E> <00340034> <2D6F> <00340035> <2D70> <00340036> <2D71> <00340037> <2D72> <00340038> <2D73> <00340039> <2D74> <00350030> <2D75> <00350031> <2D76> <00350032> <2D77> <00350033> <2D78> <00350034> <2D79> <00350035> <2D7A> <00350036> <2D7B> <00350037> <2D7C> <00350038> <2D7D> <00350039> <2D7E> <00360030> <2D7F> <00360031> <2D80> <00360032> <2D81> <00360033> <2D82> <00360034> <2D83> <00360035> <2D84> <00360036> <2D85> <00360037> <2D86> <00360038> <2D87> <00360039> <2D88> <00370030> <2D89> <00370031> <2D8A> <00370032> <2D8B> <00370033> <2D8C> <00370034> <2D8D> <00370035> <2D8E> <00370036> <2D8F> <00370037> <2D90> <00370038> <2D91> <00370039> <2D92> <00380030> <2D93> <00380031> <2D94> <00380032> <2D95> <00380033> <2D96> <00380034> endbfchar 100 beginbfchar <2D97> <00380035> <2D98> <00380036> <2D99> <00380037> <2D9A> <00380038> <2D9B> <00380039> <2D9C> <00390030> <2D9D> <00390031> <2D9E> <00390032> <2D9F> <00390033> <2DA0> <00390034> <2DA1> <00390035> <2DA2> <00390036> <2DA3> <00390037> <2DA4> <00390038> <2DA5> <00390039> <2DA6> <003100300030> <2DDB> <3042> <2DDC> <3044> <2DDD> <3046> <2DDE> <3048> <2DE1> <304D> <2DE2> <304F> <2DE3> <3051> <2DE4> <3053> <2DE5> <3055> <2DE6> <3057> <2DE7> <3059> <2DE8> <305B> <2DE9> <305D> <2DEA> <305F> <2DEB> <3061> <2DEC> <3064> <2DED> <3066> <2DEE> <3068> <2DF5> <3072> <2DF6> <3075> <2DF7> <3078> <2DF8> <307B> <2DFE> <3084> <2DFF> <3086> <2E0B> <30A2> <2E0C> <30A4> <2E0D> <30A6> <2E0E> <30A8> <2E11> <30AD> <2E12> <30AF> <2E13> <30B1> <2E14> <30B3> <2E15> <30B5> <2E16> <30B7> <2E17> <30B9> <2E18> <30BB> <2E19> <30BD> <2E1A> <30BF> <2E1B> <30C1> <2E1C> <30C4> <2E1D> <30C6> <2E1E> <30C8> <2E25> <30D2> <2E26> <30D5> <2E27> <30D8> <2E28> <30DB> <2E2E> <30E4> <2E2F> <30E6> <2E3B> <65E5> <2E3C> <6708> <2E3D> <706B> <2E3E> <6C34> <2E3F> <6728> <2E40> <91D1> <2E41> <571F> <2E42> <554F> <2E43> <7B54> <2E44> <4F8B> <2E45> <25A0> <2E46> <33C2> <2E47> <33CD> <2E48> <2116> <2E49> <00500048> <2E4A> <33D8> <2E4B> <33DA> <2E4E> <00560053> <2E4F> <2100> <2E50> <33C2> <2E51> <0063002F0063> <2E52> <33C4> <2E53> <2105> <2E54> <3397> <2E55> <3371> <2E56> <3398> <2E57> <2113> <2E58> <338D> <2E59> <339B> <2E5A> <3396> <2E5B> <006D002F006D> <2E5C> <006E002F006D> <2E5F> <30553058> <2E60> <30553058> <2E61> <30A230C8> <2E64> <3304> endbfchar 100 beginbfchar <2E65> <3306> <2E66> <30A630EB30B7> <2E67> <3308> <2E68> <30A830AF30B5> <2E69> <3307> <2E6A> <330A> <2E6B> <30AA30F330B030B930C830ED30FC30E0> <2E6C> <3309> <2E6D> <30AA30F330C830ED> <2E6E> <330B> <2E6F> <30AB30C330D7> <2E70> <330C> <2E77> <30AD30ED30EA30C330C830EB> <2E78> <3317> <2E79> <30B030B930FC30E0> <2E7A> <3319> <2E7B> <30AF30EB30B630FC30C9> <2E83> <3324> <2E84> <30C730AB> <2E85> <3325> <2E86> <30C630E9> <2E87> <30C930E930AF30DE> <2E8A> <30D030FC30C4> <2E8B> <332D> <2E8C> <30D130B930AB30EB> <2E8D> <30D030EC30EB> <2E91> <3332> <2E92> <30D530A130E930C9> <2E93> <30D530A730E030C8> <2E96> <333C> <2E97> <30D830AF30C8> <2E98> <30D830AF30C830D130B930AB30EB> <2E99> <30DA30BB30BF> <2E9A> <3337> <2E9B> <30DA30BF> <2E9C> <3338> <2E9D> <333A> <2E9E> <333D> <2E9F> <3341> <2EA7> <3348> <2EAC> <30E630FC30ED> <2EAD> <30E930C9> <2EAE> <3352> <2EAF> <3354> <2EB0> <30EB30AF30B9> <2EB1> <30EB30D430A2> <2EB2> <3353> <2EB5> <30A230C8> <2EB8> <3304> <2EB9> <3306> <2EBA> <30A630EB30B7> <2EBB> <3308> <2EBC> <30A830AF30B5> <2EBD> <3307> <2EBE> <330A> <2EBF> <30AA30F330B030B930C830ED30FC30E0> <2EC0> <3309> <2EC1> <30AA30F330C830ED> <2EC2> <330B> <2EC3> <30AB30C330D7> <2EC4> <330C> <2ECB> <30AD30ED30EA30C430C830EB> <2ECC> <3317> <2ECD> <30B030B930FC30E0> <2ECE> <3319> <2ECF> <30AF30EB30B630CF30C9> <2ED7> <3324> <2ED8> <30C730AB> <2ED9> <3325> <2EDA> <30C630E9> <2EDB> <30C930E930AF30DE> <2EDE> <30D030FC30C4> <2EDF> <332D> <2EE0> <30D130B930AB30EB> <2EE1> <30D030EC30EB> <2EE5> <3332> <2EE6> <30D530A130E930C9> <2EE7> <30D530A730E030C8> <2EEA> <333C> <2EEB> <30D830AF30C8> <2EEC> <30D830AF30C830D130B930AB30EB> <2EED> <30DA30BB30BF> <2EEE> <3337> <2EEF> <30DA30BF> <2EF0> <3338> <2EF1> <333A> <2EF2> <333D> <2EF3> <3341> <2EFB> <3348> <2F00> <30E630FC30ED> <2F01> <30E930C9> <2F02> <3352> <2F03> <3354> <2F04> <30EB30AF30B9> <2F05> <30EB30D430A2> <2F06> <3353> <2F09> <337E> <2F0A> <337D> <2F0B> <337C> <2F0C> <337B> endbfchar 100 beginbfchar <2F0D> <533B76426CD54EBA> <2F0E> <5B6668216CD54EBA> <2F0F> <5171540C7D445408> <2F10> <5354540C7D445408> <2F11> <54088CC74F1A793E> <2F12> <5408540D4F1A793E> <2F13> <793E56E36CD54EBA> <2F14> <5B9765596CD54EBA> <2F15> <90F54FBF756A53F7> <2F16> <533B76426CD54EBA> <2F17> <5B6668216CD54EBA> <2F18> <5171540C7D445408> <2F19> <5354540C7D445408> <2F1A> <54088CC74F1A793E> <2F1B> <5408540D4F1A793E> <2F1C> <793E56E36CD54EBA> <2F1D> <5B9765596CD54EBA> <2F1E> <90F54FBF756A53F7> <2F1F> <002D> <2F20> <003D> <2F21> <2103> <2F22> <2640> <2F23> <2642> <2F24> <3013> <2F25> <3012> <2F2E> <FFFD> <2F2F> <FFFD> <2F36> <0027> <2F37> <0022> <2F38> <004A00410053> <2F39> <2135> <2F3A> <03D0> <2F3B> <220A> <2F3C> <210F> <2F3D> <00B5> <2F3E> <03C6> <2F3F> <03DB> <2F40> <03D1> <2F41> <FFFD> <2F44> <266C> <2F45> <FF1A> <2F46> <00A9> <2F47> <00A9> <2F48> <00AE> <2F49> <00AE> <2F4A> <FFFD> <2F4B> <FFFD> <2F4F> <203C> <2F50> <2049> <2F51> <0021> <2F52> <203C> <2F53> <2049> <2F54> <244A> <2F55> <005C005C> <2F56> <2213> <2F57> <2260> <2F58> <2243> <2F63> <FFFD> <2F64> <FFFD> <2F6D> <FFFD> <2F6E> <FFFD> <2F6F> <FFFD> <2F70> <FFFD> <2F71> <FFFD> <2F72> <FFFD> <2F73> <FFFD> <2F74> <FFFD> <2F75> <FFFD> <2F76> <FFFD> <2F77> <FFFD> <2F78> <FFFD> <2F79> <FFFD> <2F7A> <FFFD> <2F7B> <FFFD> <2F7C> <FFFD> <2F7D> <FFFD> <2F7E> <FFFD> <2F7F> <FFFD> <2F80> <FFFD> <2F81> <FFFD> <2F82> <FFFD> <2F83> <FFFD> <2F84> <FFFD> <2F85> <FFFD> <2F86> <FFFD> <2F87> <FFFD> <2F88> <FFFD> <2F8B> <FFFD> <2F8C> <FFFD> <2F8D> <FFFD> <2F8E> <FFFD> <2F8F> <2702> <2F90> <2702> <2F91> <2702> <2F92> <2702> <2F93> <FFFD> <2F94> <3012> <2F95> <3088308A> <2F96> <534D> <2F97> <2207> endbfchar 100 beginbfchar <2F98> <2205> <2F99> <22A0> <2F9A> <2296> <2F9B> <2298> <2F9C> <2295> <2F9D> <2297> <2F9E> <229E> <2F9F> <2295> <2FA0> <0021> <2FA1> <25B3> <2FA2> <25C0> <2FA3> <25B6> <2FA4> <21E6> <2FA5> <21E8> <2FA6> <21E7> <2FA7> <21E9> <2FA8> <21D0> <2FA9> <2194> <2FAE> <21CC> <2FAF> <21C6> <2FB2> <2190> <2FB3> <2192> <2FB4> <2191> <2FB8> <2504> <2FB9> <2506> <2FBA> <3030> <2FBB> <2307> <2FBC> <FFFD> <2FBD> <FFFD> <2FBE> <FFFD> <2FBF> <FFFD> <2FC0> <FFFD> <2FC1> <FFFD> <2FC2> <FFFD> <2FC3> <FFFD> <2FC4> <FFFD> <2FC5> <FFFD> <2FC6> <FFFD> <2FC7> <FFFD> <2FC8> <FFFD> <2FC9> <FFFD> <2FCA> <FFFD> <2FCB> <FFFD> <2FCC> <25A1> <2FCD> <25AB> <2FCE> <25A0> <2FCF> <25AA> <2FD0> <FFFD> <2FD1> <271A> <2FD2> <FFFD> <2FD3> <FFFD> <2FD4> <FFFD> <2FD5> <FFFD> <2FD6> <FFFD> <2FD7> <25C7> <2FD8> <FFFD> <2FD9> <25C6> <2FDA> <FFFD> <2FDB> <25CE> <2FDC> <25C9> <2FDD> <25CB> <2FDE> <25E6> <2FDF> <25CF> <2FE0> <2022> <2FE1> <FFFD> <2FE2> <FFFD> <2FE3> <2756> <2FE4> <FFFD> <2FED> <3053> <2FEE> <3053> <2FEF> <30B3> <2FF0> <30B3> <304C> <30FC> <3057> <30F5> <305E> <30F6> <3100> <3094> <3103> <30FC> <310E> <30F5> <3115> <30F6> <3161> <30FB> <3162> <FF0A> <3163> <203B> <3164> <25CB> <3165> <25CE> <3166> <25C9> <3167> <25B3> <3168> <25B2> <31D5> <3041> <31D6> <3043> <31D7> <3045> <31D8> <3047> <31D9> <3049> <31DA> <304B> <31DB> <3051> <31DC> <3063> <31DD> <3083> <31DE> <3085> <31DF> <3087> <31E0> <308E> <31EC> <30F5> endbfchar 100 beginbfchar <31F3> <30F6> <3237> <30A1> <3238> <30A3> <3239> <30A5> <323A> <30A7> <323B> <30A9> <323E> <30C3> <323F> <30E3> <3240> <30E5> <3241> <30E7> <3242> <30EE> <3243> <30FC> <3244> <30FC> <3245> <6CE8> <3246> <20AC> <3247> <2126> <324A> <FB00> <324D> <0101> <324E> <012B> <324F> <016B> <3250> <0113> <3251> <014D> <3252> <0100> <3253> <012A> <3254> <016A> <3255> <0112> <3256> <014C> <325D> <2070> <326E> <01CD> <326F> <011A> <3270> <0045030A> <3271> <0EBC> <3272> <01CF> <3273> <0049030A> <3274> <0128> <3275> <01D1> <3276> <004F030A> <3277> <01D3> <3278> <016E> <3279> <0168> <327A> <01CE> <327B> <011B> <327C> <0065030A> <327D> <0EBD> <327E> <01D0> <327F> <0131030A> <3280> <0129> <3281> <01D2> <3282> <006F030A> <3283> <01D4> <3284> <016F> <3285> <0169> <3286> <0251> <3287> <0251> <3288> <0251> <3289> <01FD> <328A> <00E6> <328B> <0254> <328C> <0254> <328D> <0254> <328E> <0259> <328F> <0259> <3292> <025A> <3295> <025B> <3296> <025B> <3297> <006A> <3298> <014B> <3299> <0275> <329A> <028C> <329B> <028C> <329C> <028C> <329D> <0292> <329E> <0283> <329F> <02D0> <32DC> <00A5> <32FC> <00A6> <32FD> <007D> <32FE> <0303> <32FF> <02BC> <3300> <005C> <3301> <02BB> <3302> <007C> <3303> <007E> <3307> <2044> <3308> <0192> <3309> <00A7> <330A> <00A4> <330B> <201C> <330C> <00AB> <3311> <2012> <3314> <00B7> <3315> <00B6> <3316> <2022> <3317> <201A> <3318> <201E> <3319> <201D> <331A> <00BB> <331B> <2026> <331C> <2030> <331D> <00BF> endbfchar 100 beginbfchar <3320> <00AF> <3324> <030A> <3325> <00B8> <3326> <030B> <3327> <0328> <3328> <030C> <3329> <0336> <332A> <00C6> <332B> <00AA> <332C> <0141> <332D> <00D8> <332E> <0152> <332F> <00BA> <3330> <00E6> <3331> <0131> <3332> <0142> <3333> <00F8> <3334> <0153> <3335> <00DF> <3336> <002D> <3337> <00A9> <3338> <00AC> <3339> <00AE> <333E> <00B5> <333F> <00B9> <337E> <0160> <337F> <0178> <3380> <017D> <3381> <0305> <3382> <0161> <3383> <2122> <3384> <017E> <3385> <0030> <3386> <20AC> <3387> <2126> <338A> <FB00> <338D> <0101> <338E> <012B> <338F> <016B> <3390> <0113> <3391> <014D> <3392> <0100> <3393> <012A> <3394> <016A> <3395> <0112> <3396> <014C> <339D> <2070> <33AE> <01CD> <33AF> <011A> <33B0> <0045030A> <33B1> <0EBC> <33B2> <01CF> <33B3> <0049030A> <33B4> <0128> <33B5> <01D1> <33B6> <004F030A> <33B7> <01D3> <33B8> <016E> <33B9> <0168> <33BA> <01CE> <33BB> <011B> <33BC> <0065030A> <33BD> <0EBD> <33BE> <01D0> <33BF> <0131030A> <33C0> <0129> <33C1> <01D2> <33C2> <006F030A> <33C3> <01D4> <33C4> <016F> <33C5> <0169> <33D0> <0336> <33D1> <002D> <33D2> <003D> <33D3> <002C> <33E4> <0336> <33E5> <002D> <33E6> <003D> <33E7> <002C> <33EE> <00B7> <33EF> <002D> <33F0> <003D> <33F1> <2103> <33F2> <2640> <33F3> <2642> <33F4> <3013> <33F5> <3012> <33FE> <FFFD> <33FF> <FFFD> <3406> <0027> <3407> <0022> <3408> <9038> <3409> <8B01> <340A> <7DE3> <340B> <9EC3> <340C> <6EAB> <340D> <798D> <340E> <6094> <340F> <6D77> <3410> <6168> endbfchar 100 beginbfchar <3411> <6982> <3412> <6E34> <3413> <8910> <3414> <6F22> <3415> <5668> <3416> <65E2> <3417> <7948> <3418> <865B> <3419> <97FF> <341A> <52E4> <341B> <8B39> <341C> <63ED> <341D> <64CA> <341E> <784F> <341F> <7A40> <3420> <6BBA> <3421> <7949> <3422> <8996> <3423> <716E> <3424> <793E> <3425> <8005> <3426> <81ED> <3427> <795D> <3428> <6691> <3429> <7F72> <342A> <6D89> <342B> <72C0> <342C> <613C> <342D> <771E> <342E> <7BC0> <342F> <7956> <3430> <50E7> <3431> <5C64> <3432> <5DE2> <3433> <618E> <3434> <8D08> <3435> <537D> <3436> <5606> <3437> <8457> <3438> <5FB5> <3439> <61F2> <343A> <93AD> <343B> <798E> <343C> <9B2D> <343D> <7A81> <343E> <96E3> <343F> <6885> <3440> <7E41> <3441> <6669> <3442> <5351> <3443> <7891> <3444> <8CD3> <3445> <654F> <3446> <4FAE> <3447> <5002> <3448> <5840> <3449> <52C9> <344A> <6B65> <344B> <58A8> <344C> <6BCF> <344D> <514D> <344E> <623E> <344F> <7950> <3450> <6B04> <3451> <9686> <3452> <865C> <3453> <6DDA> <3454> <985E> <3455> <66C6> <3456> <6B77> <3457> <7DF4> <3458> <934A> <3459> <5ECA> <345A> <9304> <345B> <6982> <345C> <51B4> <345D> <634C> <345E> <86DB> <345F> <9089> <3460> <9022> <3461> <5049> <3462> <7DEF> <3463> <9055> <3464> <53A9> <3465> <990C> <3466> <885B> <3467> <5EF6> <3468> <6CBF> <3469> <925B> <346A> <7FC1> <346B> <82BD> <346C> <96C5> <346D> <5BB3> <346E> <6168> <346F> <6982> <3470> <6BBB> <3471> <6562> <3472> <8CAB> <3473> <5DCC> <3474> <9811> endbfchar 100 beginbfchar <3475> <5E30> <3476> <8ECC> <3477> <7AAE> <3478> <5747> <3479> <5091> <347A> <7A74> <347B> <5065> <347C> <5EFA> <347D> <9237> <347E> <6A8E> <347F> <4EA4> <3480> <516C> <3481> <66F4> <3482> <6821> <3483> <786C> <3484> <7D5E> <3485> <8003> <3486> <8CFC> <3487> <964D> <3488> <62F7> <3489> <7F6A> <348A> <4F7F> <348B> <53F2> <348C> <59C9> <348D> <8B1D> <348E> <90AA> <348F> <53CE> <3490> <8F2F> <3491> <67D4> <3492> <77AC> <3493> <821C> <3494> <696F> <3495> <677E> <3496> <8A1F> <3497> <4E08> <3498> <57F4> <3499> <690D> <349A> <8077> <349B> <89AA> <349C> <9042> <349D> <636E> <349E> <6442> <349F> <8239> <34A0> <7DCF> <34A1> <8061> <34A2> <50CF> <34A3> <8A95> <34A4> <6065> <34A5> <5146> <34A6> <773A> <34A7> <8074> <34A8> <8DF3> <34A9> <5EAD> <34AA> <5EF7> <34AB> <8247> <34AC> <6843> <34AD> <9003> <34AE> <6D3E> <34AF> <6392> <34B0> <8F29> <34B1> <73ED> <34B2> <9812> <34B3> <60B2> <34B4> <6249> <34B5> <6590> <34B6> <7DCB> <34B7> <8AB9> <34B8> <8CA7> <34B9> <7236> <34BA> <847A> <34BB> <5206> <34BC> <5674> <34BD> <61A4> <34BE> <7C89> <34BF> <7D1B> <34C0> <96F0> <34C1> <853D> <34C2> <4FBF> <34C3> <6367> <34C4> <76C6> <34C5> <685D> <34C6> <8108> <34C7> <8036> <34C8> <7FFC> <34C9> <540F> <34CA> <96A3> <34CB> <9E9F> <34CC> <9E97> <34CD> <806F> <34CE> <807E> <34CF> <6E7E> <34D0> <5085> <34D1> <5193> <34D2> <51DB> <34D3> <5315> <34D4> <5340> <34D5> <96D9> <34D6> <55A9> <34D7> <56C1> <34D8> <570D> endbfchar 100 beginbfchar <34D9> <58AB> <34DA> <59DA> <34DB> <5A36> <34DC> <5ABE> <34DD> <5D4E> <34DE> <5D87> <34DF> <5DC9> <34E0> <5DD3> <34E1> <5F2D> <34E2> <5F98> <34E3> <60D8> <34E4> <613D> <34E5> <61FE> <34E6> <6268> <34E7> <62CF> <34E8> <651D> <34E9> <640F> <34EA> <64F2> <34EB> <655D> <34EC> <665F> <34ED> <67A9> <34EE> <67E7> <34EF> <696B> <34F0> <6930> <34F1> <69A7> <34F2> <6A44> <34F3> <6A90> <34F4> <6C08> <34F5> <6C13> <34F6> <6E23> <34F7> <6F11> <34F8> <6EFE> <34F9> <6F3E> <34FA> <71FF> <34FB> <73E5> <34FC> <7432> <34FD> <745F> <34FE> <74E0> <34FF> <750C> <3500> <7672> <3501> <792A> <3502> <78D4> <3503> <79BA> <3504> <7A19> <3505> <7A95> <3506> <7CF2> <3507> <7D73> <3508> <7DDD> <3509> <7E35> <350A> <7FAE> <350B> <7FE1> <350C> <805A> <350D> <805F> <350E> <8073> <350F> <8070> <3510> <8076> <3511> <8153> <3512> <818A> <3513> <81B5> <3514> <81CD> <3515> <83F2> <3516> <8555> <3517> <85D5> <3518> <871A> <3519> <8836> <351A> <889E> <351B> <88D8> <351C> <88F4> <351D> <892B> <351E> <893B> <351F> <896A> <3520> <896F> <3521> <8A1D> <3522> <8D05> <3523> <8D0F> <3524> <9F4E> <3525> <8E91> <3526> <8EA1> <3527> <9052> <3528> <900E> <3529> <9130> <352A> <9156> <352B> <9158> <352C> <9165> <352D> <9173> <352E> <9172> <352F> <91A2> <3530> <91AF> <3531> <91AA> <3532> <91B4> <3533> <91BA> <3534> <9477> <3535> <9698> <3536> <973D> <3537> <9760> <3538> <9771> <3539> <980C> <353A> <9873> <353B> <98C3> <353C> <9A45> endbfchar 100 beginbfchar <353D> <9B4D> <353E> <9B58> <353F> <9BC6> <3540> <9BE1> <3541> <9BF1> <3542> <9D48> <3543> <9DCF> <3544> <9F08> <3545> <6271> <3546> <6697> <3547> <610F> <3548> <8863> <3549> <9055> <354A> <907A> <354B> <78EF> <354C> <54E1> <354D> <2ED7> <354E> <2EBD> <354F> <53A9> <3550> <74DC> <3551> <904B> <3552> <990C> <3553> <885E> <3554> <92B3> <3555> <95B1> <3556> <5EF6> <3557> <63F4> <3558> <6CBF> <3559> <7159> <355A> <9060> <355B> <925B> <355C> <65BC> <355D> <5F80> <355E> <7FC1> <355F> <5378> <3560> <97F3> <3561> <5316> <3562> <82B1> <3563> <83D3> <3564> <8CA8> <3565> <904E> <3566> <82BD> <3567> <96C5> <3568> <9913> <3569> <5EFB> <356A> <7070> <356B> <5BB3> <356C> <6168> <356D> <6168> <356E> <6168> <356F> <69EA> <3570> <6982> <3571> <676E> <3572> <89D2> <3573> <9694> <3574> <5272> <3575> <8F44> <3576> <938C> <3577> <82C5> <3578> <5BD2> <3579> <74B0> <357A> <7DE9> <357B> <7F36> <357C> <9084> <357D> <9592> <357E> <97D3> <357F> <8218> <3580> <5371> <3581> <559C> <3582> <3402> <3583> <3402> <3584> <5E7E> <3585> <65E3> <3586> <671F> <3587> <6A5F> <3588> <8D77> <3589> <98E2> <358A> <5409> <358B> <55AB> <358C> <8650> <358D> <9006> <358E> <53CA> <358F> <5438> <3590> <6025> <3591> <7D1A> <3592> <5DE8> <3593> <62D2> <3594> <8DDD> <3595> <9B5A> <3596> <9B5A> <3597> <537F> <3598> <5F3A> <3599> <6050> <359A> <69C1> <359B> <6A4B> <359C> <6A4B> <359D> <9115> <359E> <97FF> <359F> <9957> <35A0> <6681> endbfchar 100 beginbfchar <35A1> <2EA9> <35A2> <8FD1> <35A3> <5036> <35A4> <77E9> <35A5> <5177> <35A6> <865E> <35A7> <7A7A> <35A8> <9047> <35A9> <6ADB> <35AA> <5553> <35AB> <5951> <35AC> <6075> <35AD> <6167> <35AE> <8FCE> <35AF> <5091> <35B0> <6F54> <35B1> <7A74> <35B2> <2EBC> <35B3> <2EBC> <35B4> <517C> <35B5> <5238> <35B6> <61B2> <35B7> <6743> <35B8> <80A9> <35B9> <8B19> <35BA> <9063> <35BB> <539F> <35BC> <8A01> <35BD> <6236> <35BE> <96C7> <35BF> <9867> <35C0> <5433> <35C1> <5A1B> <35C2> <8AA4> <35C3> <5DE5> <35C4> <614C> <35C5> <6285> <35C6> <63A7> <35C7> <69CB> <35C8> <6D69> <35C9> <6E2F> <35CA> <8015> <35CB> <8154> <35CC> <8352> <35CD> <8B1B> <35CE> <8CFC> <35CF> <543F> <35D0> <9177> <35D1> <8170> <35D2> <7511> <35D3> <8FBC> <35D4> <4ECA> <35D5> <9396> <35D6> <5EA7> <35D7> <5F69> <35D8> <63A1> <35D9> <6B72> <35DA> <83DC> <35DB> <51B4> <35DC> <54B2> <35DD> <524A> <35DE> <7522> <35DF> <9910> <35E0> <59FF> <35E1> <59FF> <35E2> <5DFF> <35E3> <8AEE> <35E4> <8AEE> <35E5> <8CC7> <35E6> <8CC7> <35E7> <6B21> <35E8> <6B21> <35E9> <6ECB> <35EA> <73BA> <35EB> <53F1> <35EC> <6368> <35ED> <659C> <35EE> <90AA> <35EF> <52FA> <35F0> <7235> <35F1> <7235> <35F2> <914C> <35F3> <5F31> <35F4> <4E3B> <35F5> <53D7> <35F6> <6388> <35F7> <5468> <35F8> <7D42> <35F9> <7FD2> <35FA> <8846> <35FB> <9031> <35FC> <4F4F> <35FD> <8853> <35FE> <8FF0> <35FF> <5DE1> <3600> <9075> <3601> <9075> <3602> <6240> <3603> <66F8> <3604> <5973> endbfchar 100 beginbfchar <3605> <52DD> <3606> <5546> <3607> <5BB5> <3608> <5C06> <360B> <5C19> <360C> <6D88> <360D> <785D> <360E> <8096> <360F> <4E08> <3610> <5B82> <3611> <57CE> <3612> <60C5> <3613> <57F4> <3614> <98FE> <3615> <690D> <3616> <6B96> <3619> <2EDE> <361A> <378D> <361B> <4FB5> <361C> <2E97> <361D> <6D78> <361E> <771F> <361F> <9032> <3620> <4EBB> <3621> <4EBA> <3622> <5203> <3623> <5C0B> <3624> <8A0A> <3625> <8A0A> <3626> <8FC5> <3627> <8870> <3628> <9042> <3629> <351F> <362A> <52E2> <362B> <6210> <362C> <76DB> <362D> <8056> <362E> <8980> <362F> <8AA0> <3630> <8ACB> <3631> <975C> <3632> <975C> <3633> <7A05> <3634> <8106> <3635> <96BB> <3636> <7C4D> <3637> <7BC0> <3638> <8AAA> <3639> <96EA> <363A> <7D76> <363B> <6247> <363C> <6F98> <363D> <7FA1> <363E> <8239> <363F> <9078> <3640> <9077> <3641> <524D> <3642> <5168> <3643> <6383> <3644> <63F7> <3645> <7626> <3646> <8D70> <3647> <9001> <3648> <906D> <3649> <9020> <364A> <2ECA> <364B> <901F> <364C> <8CCA> <364D> <5C0A> <364E> <5C0A> <364F> <59A5> <3650> <6CF0> <3651> <9000> <3652> <902E> <3653> <968A> <3654> <9BDB> <3655> <5927> <3656> <3427> <3657> <7027> <3658> <9054> <3659> <812B> <365A> <4E39> <365B> <6B4E> <365C> <70AD> <365D> <8A95> <365E> <6696> <365F> <5024> <3660> <7F6E> <3661> <7BC9> <3662> <2EAE> <3663> <7B51> <3664> <9010> <3665> <67F1> <3666> <6CE8> <3667> <99D0> <3668> <5F6B> <3669> <5FB5> <366A> <61F2> <366B> <671D> <366C> <6F6E> endbfchar 100 beginbfchar <366D> <8ABF> <366E> <76F4> <366F> <6715> <3670> <6715> <3671> <589C> <3672> <8FFD> <3673> <901A> <3674> <576A> <3675> <91E3> <3676> <5448> <3677> <5E1D> <3678> <7A0B> <3679> <7684> <367A> <9069> <367B> <8FED> <367C> <6DFB> <367D> <514E> <367E> <9014> <367F> <783A> <3680> <5721> <3681> <571F> <3682> <51AC> <3683> <5510> <3684> <7CD6> <3685> <85E4> <3686> <8B04> <3687> <9003> <3688> <900F> <3689> <9A30> <368A> <5C0E> <368B> <9053> <368C> <5451> <368D> <3B88> <368E> <5167> <368F> <8089> <3690> <4E73> <3691> <5FCD> <3692> <8A8D> <3693> <5BE7> <3694> <7D0D> <3695> <8987> <3696> <6D3E> <3697> <80BA> <3698> <535A> <3699> <8584> <369A> <8FEB> <369B> <7E1B> <369C> <8087> <369D> <4E37> <369E> <6F51> <369F> <91B1> <36A0> <4F34> <36A1> <5224> <36A2> <534A> <36A3> <5E06> <36A4> <7554> <36A5> <6669> <36A6> <8543> <36A7> <907F> <36A8> <5FAE> <36A9> <9F3B> <36AA> <5339> <36AB> <2EAA> <36AC> <5F65> <36AD> <59EC> <36AE> <59EB> <36AF> <8A55> <36B0> <5E99> <36B1> <75C5> <36B2> <5A66> <36B3> <6577> <36B4> <6D6E> <36B5> <8CA0> <36B6> <8CA0> <36B7> <670D> <36B8> <8986> <36B9> <4E19> <36BA> <5E63> <36BB> <5E73> <36BC> <5F0A> <36BD> <8511> <36BE> <504F> <36BF> <7DE8> <36C0> <8FD4> <36C1> <904D> <36C2> <7C3F> <36C3> <5305> <36C4> <5D29> <36C5> <62B1> <36C6> <670B> <36C7> <7832> <36C8> <7E2B> <36C9> <80DE> <36CA> <840C> <36CB> <90A6> <36CC> <90A6> <36CD> <98FD> <36CE> <9D6C> <36CF> <4EA1> <36D0> <5E3D> endbfchar 100 beginbfchar <36D3> <623F> <36D4> <671B> <36D5> <671B> <36D6> <5192> <36D7> <6469> <36D8> <7FFB> <36D9> <51E1> <36DA> <78E8> <36DB> <9B54> <36DC> <2FC7> <36DD> <69D9> <36DE> <685D> <36DF> <4FE3> <36E0> <53C8> <36E1> <7E6D> <36E2> <9EBF> <36E3> <8108> <36E4> <660E> <36E5> <76DF> <36E6> <8FF7> <36E7> <5984> <36E8> <52D0> <36E9> <76F2> <36EA> <8017> <36EB> <623E> <36EC> <7D0B> <36ED> <9580> <36EE> <7D04> <36EF> <8E8D> <36F0> <687A> <36F1> <687A> <36F2> <6801> <36F3> <6109> <36F4> <8AED> <36F5> <8F38> <36F6> <52C7> <36F7> <6709> <36F8> <7336> <36FB> <88D5> <36FC> <904A> <36FD> <66DC> <36FE> <2EB7> <36FF> <8981> <3700> <990A> <3701> <7FCC> <3702> <7FFC> <3703> <8EB6> <3704> <862D> <3705> <7387> <3706> <9F8D> <3707> <9F8D> <3708> <65C5> <3709> <6881> <370A> <71D0> <370B> <96A3> <370C> <9C57> <370D> <9E9F> <370E> <7C7B> <370F> <5EC9> <3710> <6190> <3711> <9023> <3712> <6717> <3713> <8002> <3714> <8107> <3715> <50CA> <3716> <511A> <3717> <5154> <3718> <5195> <3719> <2E87> <371A> <528D> <371B> <52D7> <371C> <52F9> <371D> <5349> <371E> <353E> <371F> <53DF> <3720> <66FC> <3721> <5533> <3722> <55E4> <3723> <5455> <3724> <56C0> <3725> <5939> <3726> <5A1C> <3727> <5AC2> <3728> <5B73> <3729> <5BC3> <372A> <5C14> <372B> <37E2> <372C> <5CE6> <372D> <5E54> <372E> <4E48> <372F> <5EE3> <3730> <6097> <3731> <62D4> <3732> <62CC> <3733> <641C> <3734> <63C6> <3735> <6428> <3736> <8209> <3737> <631B> <3738> <665F> endbfchar 100 beginbfchar <3739> <665F> <373A> <6663> <373B> <66F5> <373C> <675E> <373D> <689D> <373E> <688D> <373F> <69F6> <3740> <6961> <3741> <5BE8> <3742> <5BE8> <3743> <69BB> <3744> <6BCC> <3745> <6F11> <3746> <6E17> <3747> <6F98> <3748> <6CAA> <3749> <6CAA> <374A> <701B> <374B> <7162> <374C> <723B> <374D> <4E2C> <374E> <731C> <374F> <74CA> <3750> <74EF> <3751> <7575> <3752> <75EC> <3753> <764E> <3754> <3FB1> <3755> <776A> <3756> <77A9> <3757> <7940> <3758> <7953> <3759> <7953> <375A> <9F4B> <375B> <79AE> <375C> <9083> <375D> <7B53> <375E> <7C11> <375F> <7C14> <3760> <4264> <3761> <7C50> <3762> <7C58> <3763> <7D46> <3764> <7D63> <3765> <7E22> <3766> <7E22> <3767> <7E48> <3768> <7E35> <3769> <7E43> <376A> <7E8C> <376D> <7F51> <376E> <7F51> <3771> <7FE9> <3772> <8141> <3773> <4453> <3774> <8258> <3775> <8279> <3778> <82E3> <3779> <5179> <377A> <83A2> <377B> <8420> <377C> <83BD> <377D> <84F4> <377E> <856D> <377F> <8587> <3780> <85F4> <3781> <4E55> <3782> <8737> <3783> <873B> <3784> <8805> <3785> <87BD> <3786> <867D> <3787> <8836> <3788> <8944> <3789> <88C6> <378A> <89BD> <378B> <8ADB> <378C> <8B3E> <378D> <8B5A> <378E> <8D73> <378F> <8D99> <3790> <8DCB> <3791> <8E34> <3792> <8E4A> <3793> <8FEF> <3794> <9087> <3795> <8FFA> <3796> <901E> <3797> <9035> <3798> <9050> <3799> <8FC8> <379A> <9081> <379B> <908A> <379C> <908A> <379D> <908A> <379E> <908A> <379F> <908A> <37A0> <908A> <37A1> <9089> <37A2> <9089> endbfchar 100 beginbfchar <37A3> <9089> <37A4> <9089> <37A5> <9089> <37A6> <9089> <37A7> <9089> <37A8> <9089> <37A9> <9089> <37AA> <9089> <37AB> <9089> <37AC> <9089> <37AD> <92CF> <37AE> <93DD> <37AF> <95BC> <37B0> <9621> <37B1> <96B2> <37B2> <975C> <37B3> <9839> <37B4> <98EB> <37B5> <9903> <37B6> <9909> <37B7> <9945> <37B8> <9945> <37B9> <994B> <37BA> <9A08> <37BB> <9A5F> <37BC> <9A65> <37BD> <9AEF> <37BE> <9B18> <37BF> <9BDF> <37C0> <9D09> <37C1> <9D08> <37C2> <9EA5> <37C3> <9ECC> <37C4> <9F08> <37C5> <9F4A> <37C6> <9F63> <37C7> <9F67> <37C8> <9F6C> <37C9> <7199> <37CA> <7199> <37CB> <891C> <37CC> <68C8> <37CD> <66FB> <37CE> <5F45> <37CF> <5300> <37D0> <5389> <37D1> <5953> <37D2> <FA11> <37D3> <6852> <37D4> <6A73> <37D5> <6D87> <37D6> <FA15> <37D7> <8A12> <37DA> <4E1F> <37DB> <4E2B> <37E0> <4E44> <37E1> <4E5A> <37E2> <4E7F> <37E3> <4E8D> <37E4> <4E96> <37E5> <4EB9> <37E6> <4ED0> <37E7> <4EE0> <37E8> <4EFD> <37E9> <4EFF> <37EA> <4F0B> <37EB> <4F15> <37EC> <4F60> <37ED> <4F3B> <37EE> <4F49> <37EF> <4F54> <37F0> <4F7A> <37F3> <4F97> <37F4> <4FBE> <37F5> <4FCF> <37F6> <4FFD> <37F9> <5010> <37FA> <501B> <37FB> <5027> <37FC> <502E> <37FD> <5057> <37FE> <5066> <37FF> <506A> <3800> <503B> <3801> <508F> <3802> <5096> <3803> <509C> <3804> <50CC> <3805> <50E6> <3806> <50E9> <3807> <50EF> <3808> <5108> <3809> <510B> <380A> <5110> <380B> <511B> <380C> <511E> <380D> <515F> <380E> <51A1> <380F> <51BC> <3810> <51DE> endbfchar 100 beginbfchar <3811> <51EE> <3812> <51F4> <3815> <5213> <3816> <5249> <3817> <5261> <3818> <5266> <3819> <5293> <381A> <52C8> <381B> <52F0> <381E> <533E> <381F> <534C> <3820> <534B> <3821> <5361> <3822> <536C> <3823> <53AB> <3824> <53DA> <3825> <53E6> <3826> <53F5> <3827> <5427> <3828> <544D> <3829> <5466> <382A> <546B> <382B> <5474> <382C> <548D> <382D> <5496> <382E> <54A1> <382F> <54AD> <3830> <54B9> <3831> <54BF> <3832> <54C6> <3833> <54CD> <3834> <550E> <3835> <552B> <3836> <5535> <3837> <554A> <383A> <5588> <383B> <558E> <383C> <5608> <383F> <5637> <3840> <563F> <3841> <5649> <3842> <564B> <3843> <564F> <3844> <5666> <3845> <5669> <3846> <566F> <3849> <5695> <384A> <569A> <384D> <56B1> <384E> <56C9> <384F> <56DD> <3850> <56E4> <3851> <570A> <3852> <5715> <3853> <5723> <3854> <572F> <3857> <574C> <3858> <5770> <3859> <578C> <385A> <579C> <385B> <57B8> <385C> <57E6> <385D> <57ED> <3860> <57FF> <3861> <5809> <3862> <5820> <3863> <5832> <3864> <587C> <3865> <5880> <3866> <58A9> <3867> <58CE> <3868> <58D0> <3869> <58D4> <386A> <58DA> <386B> <58E9> <386C> <590C> <386D> <5924> <386E> <592F> <386F> <5961> <3870> <596D> <3871> <59CA> <3872> <59D2> <3873> <59DD> <3876> <5A04> <3877> <5A0C> <3878> <5A23> <3879> <5A47> <387A> <5A55> <387B> <5A63> <387C> <5A6D> <387D> <5A7E> <387E> <5A9E> <387F> <5AA7> <3880> <5AAC> <3881> <5AB3> <3882> <5AE0> <3883> <5B00> <3884> <5B19> <3885> <5B25> <3886> <5B2D> endbfchar 100 beginbfchar <3887> <5B41> <3888> <5B7C> <388B> <5B8A> <388C> <5C23> <388D> <5C2B> <388E> <5C30> <388F> <5C63> <3890> <5C69> <3891> <5C7C> <3892> <5CCB> <3893> <5CD2> <3894> <5CF4> <3895> <5D24> <3896> <5D26> <3897> <5D43> <3898> <5D46> <3899> <5D4A> <389A> <5D92> <389B> <5D94> <389C> <5D99> <389D> <5DA0> <389E> <5DD8> <389F> <5DE0> <38A0> <5DF8> <38A1> <5E00> <38A2> <5E12> <38A5> <5E18> <38A6> <5E2E> <38A7> <5E58> <38AA> <5EA8> <38AB> <5EAA> <38AE> <5ECB> <38AF> <5ED2> <38B0> <5F07> <38B1> <5F0E> <38B4> <5F22> <38B5> <5F28> <38B6> <5F36> <38B7> <5F3B> <38B8> <5F40> <38B9> <5F50> <38BA> <5F58> <38BB> <5F64> <38BC> <5F89> <38BD> <5F9C> <38BE> <5FA7> <38BF> <5FA4> <38C0> <5FAF> <38C1> <5FB8> <38C2> <5FC4> <38C3> <5FC9> <38C4> <5FE1> <38C5> <5FE9> <38C6> <5FED> <38C7> <5FFC> <38C8> <6017> <38C9> <601A> <38CA> <6033> <38CB> <6061> <38CC> <607F> <38CD> <609E> <38CE> <60A4> <38CF> <60B0> <38D0> <60CB> <38D1> <60DB> <38D2> <60F8> <38D6> <611C> <38D7> <617C> <38D8> <618D> <38D9> <619F> <38DA> <61A8> <38DB> <61C2> <38DC> <61DF> <38DD> <6215> <38DE> <6229> <38DF> <6243> <38E0> <6246> <38E1> <624C> <38E2> <6251> <38E3> <6256> <38E4> <62C4> <38E5> <62FC> <38E6> <630A> <38E7> <630D> <38E8> <6318> <38E9> <6339> <38EC> <6365> <38ED> <6374> <38EE> <637D> <38EF> <6384> <38F0> <6387> <38F1> <6390> <38F2> <639E> <38F3> <63D1> <38F4> <63DC> <38F5> <6409> <38F6> <6410> <38F7> <6422> <38F8> <6454> <38F9> <645B> endbfchar 100 beginbfchar <38FA> <646D> <38FB> <647B> <38FE> <64E5> <38FF> <64F7> <3900> <64FB> <3901> <6504> <3902> <6516> <3903> <6519> <3904> <6547> <3905> <6567> <3906> <6581> <3907> <6585> <3908> <65C2> <3909> <65F0> <390A> <65F2> <390B> <662C> <390C> <664C> <390F> <6661> <3910> <666B> <3911> <6677> <3912> <66A4> <3913> <66C8> <3914> <66EC> <3915> <6705> <3916> <6713> <3917> <6733> <3918> <6748> <3919> <674C> <391A> <6776> <391B> <677B> <391C> <67B0> <391D> <67B2> <391E> <67F9> <391F> <67D7> <3920> <67D9> <3921> <67F0> <3922> <682C> <3925> <685B> <3926> <6872> <3927> <6875> <3928> <687A> <3929> <6884> <392A> <68A5> <392B> <68B2> <392C> <68D0> <392D> <68D6> <392E> <68E8> <392F> <68ED> <3932> <68FC> <3933> <6911> <3934> <6913> <3935> <6935> <3936> <693B> <3937> <6957> <3938> <6963> <3939> <6972> <393C> <69A6> <393D> <69AD> <393E> <69B7> <3941> <6A01> <3942> <6A0F> <3943> <6A15> <3944> <6A28> <3945> <6A34> <3946> <6A3E> <3947> <6A45> <394A> <6A56> <394B> <6A5B> <394C> <6A83> <394D> <6A89> <394E> <6A91> <3952> <6ADC> <3953> <6AE7> <3954> <6AEC> <3955> <6B1E> <3956> <6B24> <3957> <6B35> <3958> <6B46> <3959> <6B56> <395A> <6B60> <395B> <6B82> <395C> <6BBE> <395D> <6BE1> <395E> <6BF1> <395F> <6C10> <3960> <6C33> <3961> <6C35> <3962> <6C3A> <3963> <6C59> <3964> <6C76> <3965> <6C7B> <3966> <6C85> <3967> <6C95> <3968> <6C9C> <3969> <6CD0> <396A> <6CD4> <396B> <6CD6> <396C> <6CE0> <396F> <6CEE> <3970> <6D0A> endbfchar 100 beginbfchar <3971> <6D0E> <3972> <6D11> <3973> <6D2E> <3974> <6D57> <3975> <6D5E> <3976> <6D65> <3977> <6D82> <3978> <6DBF> <3979> <6DC4> <397A> <6DCA> <397B> <6DD6> <397C> <6DE9> <397D> <6E22> <397E> <6E51> <397F> <6EC7> <3980> <6ECA> <3981> <6ECE> <3982> <6EFD> <3983> <6F1A> <3984> <6F2A> <3985> <6F2F> <3986> <6F33> <3987> <6F5A> <3988> <6F5E> <3989> <6F62> <398A> <6F7D> <398B> <6F8B> <398C> <6F8D> <398D> <6F92> <398E> <6F94> <398F> <6F9A> <3992> <6FB6> <3993> <6FDA> <3994> <6FDE> <3995> <6FF9> <3996> <7039> <3997> <703C> <3998> <704A> <3999> <7054> <399C> <7064> <399D> <706C> <399E> <707E> <399F> <7081> <39A0> <7095> <39A1> <70B7> <39A4> <70D8> <39A5> <70DC> <39A6> <7107> <39A7> <7120> <39A8> <7131> <39A9> <714A> <39AA> <7152> <39AB> <7160> <39AC> <7179> <39AD> <7192> <39AE> <71B3> <39AF> <71CB> <39B0> <71D3> <39B1> <71D6> <39B2> <7200> <39B3> <721D> <39B4> <722B> <39B5> <7238> <39B6> <7241> <39B7> <7253> <39BA> <725C> <39BB> <728D> <39BC> <72AD> <39BD> <72B4> <39BE> <72C7> <39BF> <72FB> <39C2> <7328> <39C3> <7331> <39C4> <7343> <39C5> <736C> <39C6> <737C> <39C7> <7383> <39CA> <7395> <39CE> <73A6> <39CF> <73AB> <39D0> <73B5> <39D1> <73B7> <39D2> <73BC> <39D3> <73CF> <39D4> <73D9> <39D5> <73E9> <39D6> <73F4> <39D7> <73FD> <39D8> <7404> <39D9> <740A> <39DC> <7424> <39DD> <7428> <39DE> <742C> <39E2> <7439> <39E3> <7444> <39E4> <7447> <39E5> <744B> <39E6> <744D> <39E7> <7451> <39E8> <7457> endbfchar 100 beginbfchar <39E9> <7466> <39EA> <746B> <39EB> <7471> <39EC> <7480> <39F0> <7490> <39F1> <7498> <39F2> <749C> <39F3> <74A0> <39F4> <74A3> <39F5> <74A8> <39F6> <74AB> <39F7> <74B5> <39F8> <74BF> <39F9> <74C8> <39FA> <74DA> <39FB> <74DE> <39FC> <754E> <39FD> <7579> <39FE> <7581> <39FF> <7590> <3A02> <75B4> <3A03> <75E4> <3A04> <75F9> <3A05> <7600> <3A06> <760A> <3A09> <7619> <3A0A> <761E> <3A0B> <762D> <3A0C> <7635> <3A0D> <7643> <3A0E> <764B> <3A0F> <7665> <3A10> <766D> <3A11> <766F> <3A12> <7671> <3A13> <7674> <3A16> <76C5> <3A17> <76CC> <3A18> <76EC> <3A19> <76FC> <3A1A> <7734> <3A1B> <7736> <3A1C> <775C> <3A1F> <7772> <3A20> <777D> <3A21> <7795> <3A22> <77AA> <3A23> <77E6> <3A24> <77F0> <3A25> <77F4> <3A26> <7806> <3A27> <7822> <3A2A> <7830> <3A2B> <7835> <3A2C> <7868> <3A2D> <789E> <3A2E> <78C8> <3A2F> <78CC> <3A30> <78CE> <3A31> <78E4> <3A34> <78F2> <3A35> <78F7> <3A36> <78FB> <3A37> <7931> <3A38> <7934> <3A39> <793B> <3A3A> <793D> <3A3B> <7945> <3A3E> <798B> <3A3F> <7996> <3A40> <7998> <3A41> <79B8> <3A42> <79BB> <3A43> <79CA> <3A44> <79DA> <3A45> <7A03> <3A46> <7A09> <3A47> <7A11> <3A48> <7A1E> <3A49> <7A2D> <3A4A> <7A39> <3A4B> <7A45> <3A4C> <7A4C> <3A4D> <7A5D> <3A4E> <7A60> <3A4F> <7A6D> <3A50> <7A78> <3A51> <7AA0> <3A52> <7AA3> <3A53> <7AB3> <3A56> <7AC6> <3A57> <7B07> <3A58> <7B14> <3A59> <7B27> <3A5A> <7B31> <3A5B> <7B47> <3A5C> <7B4E> <3A5D> <7B60> <3A5E> <7B69> <3A5F> <7B6D> endbfchar 100 beginbfchar <3A60> <7B72> <3A61> <7B91> <3A62> <7BAF> <3A63> <7BD7> <3A64> <7BD9> <3A65> <7C0B> <3A66> <7C0F> <3A67> <7C20> <3A68> <7C26> <3A69> <7C31> <3A6A> <7C36> <3A6B> <7C51> <3A6C> <7C59> <3A6D> <7C67> <3A6E> <7C6E> <3A6F> <7C70> <3A70> <7CBC> <3A71> <7CBF> <3A74> <7CD7> <3A75> <7CD9> <3A76> <7CDD> <3A77> <7CEB> <3A7B> <7D13> <3A7C> <7D1D> <3A7D> <7D23> <3A7E> <7D41> <3A7F> <7D53> <3A80> <7D59> <3A81> <7D5D> <3A82> <7D7A> <3A83> <7D86> <3A86> <7DCC> <3A87> <7DEB> <3A88> <7DF1> <3A89> <7DF9> <3A8A> <7E08> <3A8B> <7E11> <3A8C> <7E15> <3A8D> <7E20> <3A8E> <7E47> <3A8F> <7E62> <3A90> <7E6E> <3A91> <7E73> <3A92> <7E8D> <3A93> <7E91> <3A94> <7E98> <3A95> <7F44> <3A96> <7F4F> <3A99> <7F61> <3A9A> <7F91> <3A9B> <7FBF> <3A9C> <7FCE> <3A9D> <7FDF> <3A9E> <7FE5> <3A9F> <7FEC> <3AA2> <7FFA> <3AA3> <800E> <3AA4> <8011> <3AA5> <8014> <3AA6> <8024> <3AA7> <8026> <3AA8> <803A> <3AA9> <803C> <3AAA> <8060> <3AAB> <8071> <3AAC> <8075> <3AAD> <809E> <3AAE> <80A6> <3AAF> <80AB> <3AB2> <8116> <3AB3> <8118> <3AB4> <813A> <3AB5> <814A> <3AB6> <814C> <3AB7> <8181> <3AB8> <8184> <3AB9> <81B4> <3ABA> <81CF> <3ABB> <81F9> <3ABC> <8203> <3ABD> <8221> <3ABE> <8232> <3ABF> <8234> <3AC0> <8246> <3AC1> <824B> <3AC2> <824F> <3AC3> <828E> <3AC4> <82AE> <3AC5> <82B7> <3AC6> <82BE> <3AC7> <82C6> <3AC8> <82FE> <3AC9> <8343> <3ACA> <8351> <3ACB> <8355> <3ACC> <8386> <3ACD> <838D> <3ACE> <8392> <3ACF> <8398> <3AD0> <83A9> endbfchar 100 beginbfchar <3AD3> <83EA> <3AD4> <840F> <3AD5> <8411> <3AD6> <844A> <3AD7> <8476> <3AD8> <84A8> <3AD9> <84AF> <3ADA> <84C0> <3ADB> <84C2> <3ADC> <84F0> <3ADD> <84FD> <3ADE> <850C> <3ADF> <8534> <3AE0> <855E> <3AE1> <858F> <3AE2> <85B7> <3AE3> <85CE> <3AE4> <85AD> <3AE5> <8612> <3AE6> <8629> <3AE7> <8652> <3AE8> <8663> <3AE9> <866C> <3AEA> <866F> <3AEB> <867A> <3AEC> <868D> <3AED> <8691> <3AEE> <8698> <3AF1> <86FA> <3AF2> <86FD> <3AF3> <870B> <3AF4> <8713> <3AF5> <8719> <3AF6> <871E> <3AF7> <8728> <3AF8> <873E> <3AF9> <8771> <3AFA> <8788> <3AFB> <8799> <3AFE> <87B5> <3AFF> <87D6> <3B00> <87EB> <3B01> <87ED> <3B02> <8801> <3B03> <8803> <3B04> <8806> <3B05> <880B> <3B06> <8814> <3B07> <881C> <3B08> <8856> <3B09> <885F> <3B0A> <8864> <3B0B> <8898> <3B0C> <88AA> <3B0F> <88CA> <3B10> <88D2> <3B11> <88DB> <3B14> <8906> <3B18> <8927> <3B19> <8930> <3B1A> <893E> <3B1B> <897B> <3B1C> <89D4> <3B1D> <89D6> <3B1E> <89E5> <3B1F> <89F1> <3B20> <8A07> <3B21> <8A0F> <3B22> <8A15> <3B23> <8A22> <3B24> <8A4E> <3B25> <8A7F> <3B26> <8AF4> <3B27> <8B1F> <3B28> <8B37> <3B2B> <8B54> <3B2C> <8B9C> <3B2D> <8B9E> <3B2E> <8C47> <3B2F> <8C54> <3B30> <8C73> <3B31> <8CA4> <3B32> <8CD9> <3B33> <8CE1> <3B34> <8CF8> <3B35> <8CFE> <3B36> <8D1B> <3B37> <8D69> <3B38> <8D6C> <3B39> <8D84> <3B3A> <8D8D> <3B3B> <8D95> <3B3C> <8DA6> <3B3D> <8DC6> <3B3E> <8DCE> <3B3F> <8DE4> <3B40> <8DEC> <3B41> <8E20> <3B42> <8E4B> <3B43> <8E6C> endbfchar 100 beginbfchar <3B44> <8E70> <3B45> <8E7A> <3B46> <8E92> <3B47> <8EAE> <3B48> <8EB3> <3B49> <8ED1> <3B4A> <8ED4> <3B4B> <8EF9> <3B4C> <8F17> <3B4D> <8F36> <3B4E> <8FA6> <3B51> <8FC6> <3B52> <8FE0> <3B53> <8FE4> <3B54> <8FF6> <3B55> <9002> <3B56> <902C> <3B57> <9044> <3B58> <9088> <3B59> <9095> <3B5A> <9099> <3B5B> <909B> <3B5C> <90A2> <3B5D> <90B4> <3B5E> <90D7> <3B5F> <90DD> <3B60> <90F4> <3B61> <9117> <3B62> <911C> <3B63> <9131> <3B64> <913A> <3B65> <913D> <3B66> <9148> <3B67> <915B> <3B68> <9161> <3B69> <9164> <3B6A> <918E> <3B6B> <919E> <3B6C> <91A8> <3B6F> <91B2> <3B70> <91BC> <3B71> <91F0> <3B72> <91F7> <3B73> <91FB> <3B74> <9207> <3B75> <9228> <3B76> <9233> <3B77> <9238> <3B78> <9243> <3B79> <9247> <3B7A> <924F> <3B7B> <9260> <3B7C> <92C2> <3B7F> <92DF> <3B80> <930D> <3B81> <9315> <3B82> <931F> <3B83> <9327> <3B84> <9347> <3B85> <9352> <3B86> <9365> <3B87> <936A> <3B88> <936D> <3B89> <939B> <3B8A> <93BA> <3B8B> <93A9> <3B8C> <93C1> <3B8D> <93CA> <3B8E> <93E2> <3B8F> <93FA> <3B90> <93FD> <3B91> <940F> <3B92> <9434> <3B93> <943F> <3B94> <9455> <3B95> <946B> <3B96> <9472> <3B97> <9578> <3B98> <95A6> <3B99> <95A9> <3B9A> <95AB> <3B9B> <95B4> <3B9C> <95BD> <3B9D> <95DA> <3B9E> <961D> <3B9F> <9641> <3BA0> <9658> <3BA1> <9684> <3BA2> <96A4> <3BA3> <96A9> <3BA4> <96D2> <3BA5> <5DB2> <3BA6> <96DE> <3BA7> <96E9> <3BA8> <96F1> <3BA9> <9702> <3BAA> <9709> <3BAB> <975A> <3BAC> <9763> <3BAD> <976E> endbfchar 100 beginbfchar <3BAE> <9773> <3BAF> <979A> <3BB0> <97A2> <3BB3> <97D9> <3BB4> <97DE> <3BB5> <97F4> <3BB6> <980A> <3BB7> <980E> <3BB8> <981E> <3BB9> <9823> <3BBA> <982B> <3BBB> <983E> <3BBE> <9859> <3BBF> <986C> <3BC0> <98B8> <3BC1> <98BA> <3BC2> <98BF> <3BC3> <98C8> <3BC4> <98E5> <3BC7> <9940> <3BC8> <994D> <3BC9> <995C> <3BCA> <995F> <3BCB> <99B1> <3BCE> <99C9> <3BCF> <9A02> <3BD0> <9A16> <3BD1> <9A24> <3BD2> <9A27> <3BD5> <9A36> <3BD6> <9A38> <3BD7> <9A4A> <3BD8> <9A56> <3BDB> <9AF9> <3BDC> <9B03> <3BDD> <9B20> <3BE0> <9B73> <3BE1> <9B79> <3BE2> <9BA7> <3BE3> <9BC1> <3BE4> <9BC7> <3BE5> <9BD7> <3BE6> <9BE7> <3BE7> <9BEB> <3BE8> <9BF7> <3BE9> <9BFA> <3BEA> <9BFD> <3BEB> <9C0B> <3BEC> <9C27> <3BED> <9C2A> <3BEE> <9C36> <3BEF> <9C41> <3BF0> <9C53> <3BF1> <9C63> <3BF2> <9C6A> <3BF3> <9C77> <3BF4> <9D02> <3BF5> <9D42> <3BF6> <9D47> <3BF7> <9D63> <3BF8> <9D69> <3BF9> <9D7C> <3BFA> <9D7E> <3BFB> <9D8D> <3BFC> <9DB1> <3BFD> <9DC3> <3BFE> <9DC7> <3BFF> <9DD6> <3C00> <9DDF> <3C01> <9DEB> <3C02> <9DF4> <3C03> <9E15> <3C04> <9E1D> <3C05> <9EA4> <3C06> <9EA8> <3C07> <9EAC> <3C08> <9EE7> <3C09> <9EEE> <3C0A> <9F10> <3C0B> <9F12> <3C0C> <9F17> <3C0D> <9F19> <3C0E> <9F2F> <3C0F> <9F37> <3C10> <9F39> <3C11> <9F41> <3C12> <9F45> <3C13> <9F57> <3C14> <9F68> <3C15> <9F71> <3C16> <9F75> <3C17> <9F90> <3C18> <9F94> <3C19> <9FA2> <3C1A> <4E30> <3C1B> <3405> <3C1C> <4F60> <3C1D> <5620> <3C1E> <5ECB> <3C1F> <2E95> endbfchar 52 beginbfchar <3C20> <60A4> <3C21> <69D7> <3C22> <6B24> <3C23> <6FF9> <3C24> <6EE6> <3C25> <71B3> <3C26> <2EA4> <3C27> <7AC6> <3C28> <7F61> <3C29> <8071> <3C2A> <809E> <3C2B> <2ECC> <3C2C> <91F0> <3C2D> <5DB2> <3C2E> <97DE> <3C2F> <4FD3> <3C30> <50D9> <3C31> <50F0> <3C32> <51C3> <3C33> <5676> <3C34> <6A54> <3C35> <6D01> <3C36> <6DD0> <3C37> <6E42> <3C38> <6ED9> <3C39> <73E4> <3C3A> <7421> <3C3B> <756C> <3C3C> <7851> <3C3D> <87F5> <3C3E> <FFFD> <3C3F> <73A8> <3C40> <3AF3> <3C41> <34DB> <3C42> <440C> <3C43> <3E8A> <3C44> <FFFD> <3C45> <FFFD> <3C46> <4BE8> <3C47> <FFFD> <3C48> <3EDA> <3C49> <3B22> <3C4A> <FFFD> <3C4B> <457A> <3C4C> <4093> <3C4D> <FFFD> <3C4E> <4665> <3C4F> <4103> <3C50> <4293> <3C51> <46AE> <3C52> <3488> <3C53> <FFFD> endbfchar 100 beginbfrange <0001> <003C> <0020> <003E> <005C> <005D> <0065> <0067> <00A1> <006E> <006F> <2039> <0070> <0071> <FB01> <0073> <0074> <2020> <007F> <0080> <0301> <0082> <0084> <0306> <009B> <009E> <00B0> <00A1> <00A3> <00BC> <00A4> <00A9> <00C0> <00AA> <00BA> <00C7> <00BB> <00C0> <00D9> <00C1> <00C6> <00E0> <00C7> <00D7> <00E7> <00D8> <00DE> <00F9> <00E8> <00FF> <0021> <0100> <0122> <0039> <0124> <0144> <005D> <0146> <0185> <FF60> <0187> <0188> <30F0> <019C> <019D> <30D0> <019E> <019F> <30D3> <01A0> <01A1> <30D6> <01A2> <01A3> <30D9> <01A4> <01A5> <30DC> <01A9> <01F4> <2500> <01FE> <01FF> <300E> <0212> <0213> <304A> <0222> <0227> <306A> <022C> <0230> <307E> <0233> <0238> <3088> <023B> <023C> <3090> <024D> <024E> <3070> <024F> <0250> <3073> <0251> <0252> <3076> <0253> <0254> <3079> <0255> <0256> <307C> <0260> <0261> <00A2> <0279> <027B> <3000> <027F> <0280> <FF1A> <0283> <0284> <309B> <028B> <028C> <30FD> <028D> <028E> <309D> <0291> <0293> <3005> <029E> <029F> <2018> <02A0> <02A1> <201C> <02A2> <02A3> <FF08> <02A4> <02A5> <3014> <02AA> <02B3> <3008> <02BD> <02BE> <2266> <02C4> <02C5> <2032> <02C9> <02CA> <00A2> <02E1> <02E2> <2190> <02E7> <02E8> <2286> <02E9> <02EA> <2282> <02ED> <02EE> <2227> <02FB> <02FC> <226A> <0301> <0302> <222B> <0308> <0309> <2020> <030C> <0315> <FF10> <0316> <032F> <FF21> <0330> <0349> <FF41> <034A> <039C> <3041> <039D> <03F2> <30A1> <03F3> <03FF> <0391> <0400> <0403> <039E> <0404> <040A> <03A3> <040B> <041B> <03B1> <041C> <0422> <03C3> <0423> <0428> <0410> <042A> <0449> <0416> <044B> <0464> <0436> <05B9> <05BA> <984D> <0697> <0698> <4EAB> <0E68> <0E69> <5FD8> <0F1B> <0F1C> <7336> <100C> <100E> <4E9E> <1038> <1039> <4FE4> <1058> <1059> <50C9> <1065> <1066> <5101> <1070> <1071> <513F> <1077> <1078> <5169> <1082> <1083> <5195> <1087> <1089> <51A9> <108B> <108C> <51B1> <10A5> <10A6> <524B> <10B7> <10B8> <52AC> <10C5> <10C6> <52F8> <10F6> <10F7> <542C> <111A> <111B> <54E5> <112A> <112B> <5556> <117B> <117C> <5737> <1190> <1191> <57D2> <11B7> <11B9> <58FB> <11C0> <11C1> <592C> <11DB> <11DC> <59D9> <11E6> <11E7> <5A35> <11F5> <11F6> <5AFA> <1204> <1205> <5B5A> endbfrange 100 beginbfrange <1221> <1222> <5C07> <1228> <1229> <5C38> <1275> <1276> <5E36> <1281> <1282> <5E75> <1287> <1288> <5EC1> <128F> <1290> <5EDA> <1293> <1294> <5EE8> <12AC> <12AD> <5F56> <12EC> <12ED> <6096> <12FE> <12FF> <60F6> <1307> <1308> <610D> <1317> <1319> <6158> <1342> <1343> <6208> <134D> <134E> <6232> <135A> <135B> <6292> <13B0> <13B1> <64E0> <13C2> <13C3> <6534> <13D1> <13D2> <6582> <13E0> <13E1> <65E0> <13E8> <13E9> <6635> <13F3> <13F4> <6667> <1412> <1413> <6726> <141F> <1420> <6763> <14BE> <14BF> <6AA2> <14E4> <14E5> <6B78> <14E6> <14E7> <6B7F> <14EF> <14F0> <6BAA> <1501> <1502> <6C13> <156A> <156B> <6ED4> <15E4> <15E5> <723B> <15E6> <15E7> <723F> <15FC> <15FD> <72E0> <160B> <160C> <734E> <163E> <163F> <74F0> <165C> <165D> <7586> <1675> <1676> <75FE> <167B> <167C> <75F2> <1682> <1684> <7620> <1689> <168A> <7647> <168E> <168F> <7661> <1690> <1692> <7668> <16A1> <16A2> <7699> <16A5> <16A7> <76B8> <16B9> <16BA> <7725> <16BC> <16BD> <7737> <16D0> <16D1> <77BC> <170E> <170F> <79B9> <1718> <1719> <7A18> <1724> <1725> <7A61> <173E> <173F> <7AD9> <1741> <1742> <7AE1> <174B> <174C> <7B18> <175C> <175D> <7B70> <17F5> <17F6> <7E59> <1801> <1802> <7E88> <1806> <1807> <7E93> <180A> <180B> <7E9B> <180F> <1811> <7F4C> <1812> <1813> <7F50> <1817> <1818> <7F5F> <1819> <181A> <7F68> <182F> <1830> <7FC5> <183E> <183F> <8018> <1874> <1875> <8165> <1892> <1893> <81DF> <1895> <1896> <81FA> <1898> <1899> <8201> <18AD> <18AE> <826A> <18B1> <18B2> <8277> <18D5> <18D6> <8317> <191D> <191E> <8517> <1957> <1958> <86A9> <1959> <195A> <868B> <199F> <19A0> <87F6> <19C6> <19C7> <88C3> <19C9> <19CA> <88D8> <19D9> <19DA> <892A> <19F9> <19FA> <89BF> <19FC> <19FD> <89DC> <1A18> <1A19> <8AA5> <1A4A> <1A4B> <8B92> <1A4D> <1A4E> <8B99> <1A5F> <1A60> <8C8D> <1A68> <1A69> <8CB2> <1A72> <1A73> <8CFA> <1A74> <1A75> <8D04> <1A8F> <1A90> <8DEA> <1A94> <1A95> <8E08> <1A97> <1A98> <8E1D> <1ADF> <1AE1> <8F62> <1AF0> <1AF1> <8FF9> <1AFE> <1AFF> <904F> <1B00> <1B01> <9051> <1B33> <1B34> <91C0> <1B3D> <1B3E> <91F5> <1B69> <1B6A> <93AC> <1B6D> <1B6E> <93D6> <1B99> <1B9A> <9598> <1BB1> <1BB2> <962E> <1BC5> <1BC6> <96B1> endbfrange 100 beginbfrange <1BCA> <1BCB> <96B8> <1BE2> <1BE3> <973D> <1BF8> <1BF9> <978F> <1BFE> <1BFF> <97B3> <1C16> <1C18> <986F> <1C2A> <1C2B> <991D> <1C30> <1C31> <993D> <1C37> <1C38> <9951> <1C3B> <1C3C> <9997> <1C3E> <1C3F> <99AD> <1C46> <1C47> <99ED> <1C48> <1C49> <99F1> <1C69> <1C6A> <9AD3> <1C6B> <1C6C> <9ADE> <1C6D> <1C6E> <9AE2> <1C7B> <1C7C> <9B22> <1C7E> <1C81> <9B27> <1C82> <1C83> <9B2E> <1C88> <1C89> <9B4D> <1C90> <1C91> <9B96> <1C92> <1C93> <9B9F> <1C9B> <1C9C> <9BD1> <1CD4> <1CD5> <9D5D> <1CF3> <1CF4> <9E1A> <1CFB> <1CFC> <9E8B> <1D08> <1D0A> <9ECE> <1D14> <1D15> <9EF6> <1D17> <1D19> <9EFB> <1D1A> <1D1B> <9F07> <1D25> <1D27> <9F5F> <1D28> <1D29> <9F66> <1D37> <1D82> <2500> <1D83> <1D96> <2460> <1D97> <1DA0> <2160> <1DB1> <1DB3> <339C> <1DB4> <1DB5> <338E> <1DBD> <1DC1> <32A4> <1DC2> <1DC3> <3231> <1DCF> <1DD0> <2229> <1ECF> <1ED0> <3001> <1EDB> <1EDC> <FF08> <1EDD> <1EDE> <3014> <1EE3> <1EEC> <3008> <1F02> <1F03> <30F5> <1F14> <1F15> <301D> <1F56> <1F57> <33A4> <1F5F> <1F61> <3385> <1F7E> <1F86> <2488> <1F87> <1F9A> <2474> <1F9C> <1FA5> <2170> <1FB0> <1FC9> <249C> <2000> <2001> <3388> <2006> <200B> <322A> <200F> <2010> <21E6> <2017> <201A> <2600> <201C> <201D> <261C> <2021> <2022> <216A> <2026> <202D> <2581> <2035> <2036> <2594> <2037> <2038> <256D> <203F> <2040> <25E2> <2045> <2047> <2571> <2053> <2054> <2018> <2055> <2056> <201C> <205E> <2066> <2776> <206A> <206B> <217A> <2076> <2077> <21C4> <2079> <207C> <30F7> <20E5> <20E6> <FA0F> <20FE> <20FF> <5DB8> <215C> <215D> <7146> <2183> <2185> <FA18> <21A4> <21A5> <FA20> <21B8> <21B9> <FA24> <21C2> <21C3> <91ED> <21C4> <21C5> <91E4> <21D2> <21D3> <9277> <21FB> <21FC> <FA2A> <2210> <224B> <0020> <224D> <226B> <005D> <2274> <2276> <00A1> <227D> <227E> <2039> <227F> <2280> <FB01> <2282> <2283> <2020> <228E> <228F> <0301> <2291> <2293> <0306> <22AA> <22AD> <00B0> <22B0> <22B2> <00BC> <22B3> <22B8> <00C0> <22B9> <22C9> <00C7> <22CA> <22CF> <00D9> <22D0> <22D5> <00E0> <22D6> <22E6> <00E7> <22E7> <22ED> <00F9> <22F7> <22FF> <0021> <2300> <2331> <002A> <2333> <2353> <005D> <2362> <2363> <00A2> <237C> <23BB> <FF60> <23BC> <23BD> <30F0> endbfrange 100 beginbfrange <23D1> <23D2> <30D0> <23D3> <23D4> <30D3> <23D5> <23D6> <30D6> <23D7> <23D8> <30D9> <23D9> <23DA> <30DC> <23EA> <23EB> <304A> <23FA> <23FF> <306A> <2404> <2408> <307E> <240B> <2410> <3088> <2413> <2414> <3090> <2425> <2426> <3070> <2427> <2428> <3073> <2429> <242A> <3076> <242B> <242C> <3079> <242D> <242E> <307C> <2437> <2438> <300E> <243D> <2488> <2500> <248C> <248D> <2032> <248F> <2490> <FB03> <249B> <249E> <215B> <249F> <24A0> <2153> <24A2> <24A7> <2074> <24A8> <24B1> <2080> <24D4> <24D5> <0259> <24D7> <24D8> <025A> <24E4> <24FF> <0020> <2500> <251F> <003C> <2521> <253F> <005D> <2548> <254A> <00A1> <2551> <2552> <2039> <2553> <2554> <FB01> <2556> <2557> <2020> <2562> <2563> <0301> <2565> <2567> <0306> <257E> <2581> <00B0> <2584> <2586> <00BC> <2587> <258C> <00C0> <258D> <259D> <00C7> <259E> <25A3> <00D9> <25A4> <25A9> <00E0> <25AA> <25BA> <00E7> <25BB> <25C1> <00F9> <25CC> <25CD> <2032> <25CF> <25D0> <FB03> <25DB> <25DE> <215B> <25DF> <25E0> <2153> <25E2> <25E7> <2074> <25E8> <25F1> <2080> <260A> <2613> <0030> <2618> <2619> <0028> <261A> <261B> <002E> <261C> <261D> <003A> <261E> <2627> <0030> <262C> <262D> <0028> <262E> <262F> <002E> <2630> <2631> <003A> <2635> <2636> <2153> <2638> <263D> <2155> <2644> <2647> <215B> <2690> <2699> <0030> <26F6> <26FF> <2170> <2700> <2701> <217A> <2705> <2710> <2160> <2714> <272D> <0041> <2732> <2733> <304A> <2742> <2747> <306A> <274C> <2750> <307E> <2753> <2758> <3088> <2759> <275D> <308F> <2762> <2763> <30AA> <2772> <2777> <30CA> <277C> <2780> <30DE> <2783> <2788> <30E8> <2789> <278D> <30EF> <278E> <2797> <3220> <27A8> <27B1> <0030> <27B2> <27BB> <0030> <27FB> <27FF> <2460> <2800> <2803> <2465> <2849> <2862> <24D0> <2863> <287C> <24B6> <2881> <2882> <304A> <2891> <2896> <306A> <289B> <289F> <307E> <28A2> <28A7> <3088> <28A8> <28AC> <308F> <28AD> <28DB> <32D0> <28DD> <28E6> <3280> <28E8> <28ED> <328A> <28F6> <28F7> <32A0> <296D> <2986> <0061> <2987> <29A0> <0041> <29A5> <29A6> <304A> <29B5> <29BA> <306A> <29BF> <29C3> <307E> <29C6> <29CB> <3088> <29CC> <29D0> <308F> <29D5> <29D6> <30AA> <29E5> <29EA> <30CA> <29EF> <29F3> <30DE> endbfrange 100 beginbfrange <29F6> <29FB> <30E8> <29FC> <29FF> <30EF> <2A7B> <2A94> <0061> <2A95> <2AAE> <0041> <2AB3> <2AB4> <304A> <2AC3> <2AC8> <306A> <2ACD> <2AD1> <307E> <2AD4> <2AD9> <3088> <2ADA> <2ADE> <308F> <2AE3> <2AE4> <30AA> <2AF3> <2AF8> <30CA> <2AFD> <2AFF> <30DE> <2B00> <2B01> <30E1> <2B04> <2B09> <30E8> <2B0A> <2B0E> <30EF> <2B8C> <2BA5> <0061> <2BA6> <2BBF> <0041> <2BC4> <2BC5> <304A> <2BD4> <2BD9> <306A> <2BDE> <2BE2> <307E> <2BE5> <2BEA> <3088> <2BEB> <2BEF> <308F> <2BF4> <2BF5> <30AA> <2C04> <2C09> <30CA> <2C0E> <2C12> <30DE> <2C15> <2C1A> <30E8> <2C1B> <2C1F> <30EF> <2C9A> <2CB3> <0061> <2CB4> <2CCD> <0041> <2CD2> <2CD3> <304A> <2CE2> <2CE7> <306A> <2CEC> <2CF0> <307E> <2CF3> <2CF8> <3088> <2CF9> <2CFD> <308F> <2D02> <2D03> <30AA> <2D12> <2D17> <30CA> <2D1C> <2D20> <30DE> <2D23> <2D28> <30E8> <2D29> <2D2D> <30EF> <2DA7> <2DC0> <0061> <2DC1> <2DDA> <0041> <2DDF> <2DE0> <304A> <2DEF> <2DF4> <306A> <2DF9> <2DFD> <307E> <2E00> <2E05> <3088> <2E06> <2E0A> <308F> <2E0F> <2E10> <30AA> <2E1F> <2E24> <30CA> <2E29> <2E2D> <30DE> <2E30> <2E35> <30E8> <2E36> <2E3A> <30EF> <2E4C> <2E4D> <2121> <2E5D> <2E5E> <33D7> <2E62> <2E63> <3301> <2E71> <2E76> <330E> <2E7C> <2E7F> <331A> <2E80> <2E82> <331F> <2E88> <2E89> <3328> <2E8E> <2E90> <332E> <2E94> <2E95> <3334> <2EA0> <2EA2> <333E> <2EA3> <2EA6> <3343> <2EA8> <2EA9> <334B> <2EAA> <2EAB> <334F> <2EB3> <2EB4> <3355> <2EB6> <2EB7> <3301> <2EC5> <2ECA> <330E> <2ED0> <2ED3> <331A> <2ED4> <2ED6> <331F> <2EDC> <2EDD> <3328> <2EE2> <2EE4> <332E> <2EE8> <2EE9> <3334> <2EF4> <2EF6> <333E> <2EF7> <2EFA> <3343> <2EFC> <2EFD> <334B> <2EFE> <2EFF> <334F> <2F07> <2F08> <3355> <2F26> <2F29> <300C> <2F2A> <2F2B> <301A> <2F2C> <2F2D> <3018> <2F30> <2F31> <301D> <2F32> <2F33> <2018> <2F34> <2F35> <201C> <2F42> <2F43> <2668> <2F4C> <2F4E> <3033> <2F59> <2F5A> <2272> <2F5B> <2F5E> <300C> <2F5F> <2F60> <301A> <2F61> <2F62> <3018> <2F65> <2F68> <300C> <2F69> <2F6A> <301A> <2F6B> <2F6C> <3018> <2F89> <2F8A> <301D> <2FAA> <2FAB> <2198> <2FAC> <2FAD> <2196> <2FB0> <2FB1> <21C4> <2FB5> <2FB7> <2193> <2FE5> <2FE6> <3008> <2FE7> <2FEA> <3008> <2FEB> <2FEC> <300A> endbfrange 100 beginbfrange <2FF1> <2FF2> <309D> <2FF3> <2FFD> <3041> <2FFE> <2FFF> <304B> <3000> <3004> <304D> <3005> <3007> <3051> <3008> <3049> <3053> <304A> <304B> <30FD> <304D> <3056> <30A1> <3058> <305D> <30AB> <305F> <3061> <30B1> <3062> <30A3> <30B3> <30A4> <30A7> <30F7> <30A8> <30A9> <309D> <30AA> <30B4> <3041> <30B5> <30BB> <304B> <30BC> <30BE> <3051> <30BF> <30FF> <3053> <3101> <3102> <30FD> <3104> <310D> <30A1> <310F> <3114> <30AB> <3116> <3118> <30B1> <3119> <315A> <30B3> <315B> <315E> <30F7> <315F> <3160> <3001> <3169> <316A> <30FD> <316B> <316C> <309D> <316D> <316E> <FF08> <316F> <3170> <3014> <3171> <3172> <FF08> <3173> <3174> <3014> <3175> <317E> <0030> <317F> <3189> <3041> <318A> <3190> <304B> <3191> <31D4> <3051> <31E1> <31EB> <30A1> <31ED> <31F2> <30AC> <31F4> <31FF> <30B2> <3200> <3236> <30BE> <323C> <323D> <30F5> <3248> <3249> <2032> <324B> <324C> <FB03> <3257> <325A> <215B> <325B> <325C> <2153> <325E> <3263> <2074> <3264> <326D> <2080> <3290> <3291> <0259> <3293> <3294> <025A> <32A0> <32DB> <0020> <32DD> <32FB> <005D> <3304> <3306> <00A1> <330D> <330E> <2039> <330F> <3310> <FB01> <3312> <3313> <2020> <331E> <331F> <0301> <3321> <3323> <0306> <333A> <333D> <00B0> <3340> <3342> <00BC> <3343> <3348> <00C0> <3349> <3359> <00C7> <335A> <335F> <00D9> <3360> <3365> <00E0> <3366> <3376> <00E7> <3377> <337D> <00F9> <3388> <3389> <2032> <338B> <338C> <FB03> <3397> <339A> <215B> <339B> <339C> <2153> <339E> <33A3> <2074> <33A4> <33AD> <2080> <33C6> <33CF> <0030> <33D4> <33D5> <0028> <33D6> <33D7> <002E> <33D8> <33D9> <003A> <33DA> <33E3> <0030> <33E8> <33E9> <0028> <33EA> <33EB> <002E> <33EC> <33ED> <003A> <33F6> <33F9> <300C> <33FA> <33FB> <301A> <33FC> <33FD> <3018> <3400> <3401> <301D> <3402> <3403> <2018> <3404> <3405> <201C> <3609> <360A> <2E8C> <3617> <3618> <98DF> <36D1> <36D2> <5FD8> <36F9> <36FA> <7336> <376B> <376C> <7F50> <376F> <3770> <7FC5> <3776> <3777> <2EBF> <37D8> <37D9> <4E04> <37DC> <37DD> <4E2F> <37DE> <37DF> <4E40> <37F1> <37F2> <4F7D> <37F7> <37F8> <5000> <3813> <3814> <5201> <381C> <381D> <530A> <3838> <3839> <5560> <383D> <383E> <560E> <3847> <3848> <5671> endbfrange 61 beginbfrange <384B> <384C> <56AC> <3855> <3856> <5733> <385E> <385F> <57F5> <3874> <3875> <59E3> <3889> <388A> <5B7E> <38A3> <38A4> <5E14> <38A8> <38A9> <5E6B> <38AC> <38AD> <5EBE> <38B2> <38B3> <5F1C> <38D3> <38D5> <6112> <38EA> <38EB> <6342> <38FC> <38FD> <64BE> <390D> <390E> <665B> <3923> <3924> <6830> <3930> <3931> <68F0> <393A> <393B> <697F> <393F> <3940> <69D6> <3948> <3949> <6A50> <394F> <3951> <6A9D> <396D> <396E> <6CEB> <3990> <3991> <6FA7> <399A> <399B> <705D> <39A2> <39A3> <70D3> <39B8> <39B9> <7255> <39C0> <39C1> <7304> <39C8> <39C9> <7385> <39CB> <39CD> <739E> <39DA> <39DB> <741A> <39DF> <39E1> <742F> <39ED> <39EF> <7485> <3A00> <3A01> <7592> <3A07> <3A08> <7615> <3A14> <3A15> <76A4> <3A1D> <3A1E> <775F> <3A28> <3A29> <782D> <3A32> <3A33> <78E0> <3A3C> <3A3D> <795B> <3A54> <3A55> <7ABB> <3A72> <3A73> <7CC8> <3A78> <3A7A> <7D07> <3A84> <3A85> <7D8B> <3A97> <3A98> <7F52> <3AA0> <3AA1> <7FEE> <3AB0> <3AB1> <80D7> <3AD1> <3AD2> <83BF> <3AEF> <3AF0> <86A7> <3AFC> <3AFD> <87AC> <3B0D> <3B0E> <88BD> <3B12> <3B13> <88F0> <3B15> <3B17> <8918> <3B29> <3B2A> <8B43> <3B4F> <3B50> <8FB5> <3B6D> <3B6E> <91AD> <3B7D> <3B7E> <92CB> <3BB1> <3BB2> <97B5> <3BBC> <3BBD> <9852> <3BC5> <3BC6> <9932> <3BCC> <3BCD> <99B9> <3BD3> <3BD4> <9A2D> <3BD9> <3BDA> <9AB5> <3BDE> <3BDF> <9B33> endbfrange endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF \ No newline at end of file
diff --git a/src/main/resources/Resources/cmap/Adobe-Korea1-2 b/src/main/resources/Resources/cmap/Adobe-Korea1-2
new file mode 100644
index 0000000..bc69bca
--- /dev/null
+++ b/src/main/resources/Resources/cmap/Adobe-Korea1-2
@@ -0,0 +1 @@
+%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%IncludeResource: ProcSet (CIDInit) %%BeginResource: CMap (Identity) %%Title: (Identity Adobe Korea1 2) %%Version: 1.000 %%Copyright: ----------------------------------------------------------- %%Copyright: Copyright 1990-2000 Adobe Systems Incorporated. %%Copyright: All Rights Reserved. %%Copyright: %%Copyright: Patents Pending %%Copyright: %%Copyright: NOTICE: All information contained herein is the property %%Copyright: of Adobe Systems Incorporated. %%Copyright: %%Copyright: Permission is granted for redistribution of this file %%Copyright: provided this copyright notice is maintained intact and %%Copyright: that the contents of this file are not altered in any %%Copyright: way from its original form. %%Copyright: %%Copyright: PostScript and Display PostScript are trademarks of %%Copyright: Adobe Systems Incorporated which may be registered in %%Copyright: certain jurisdictions. %%Copyright: ----------------------------------------------------------- %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo 3 dict dup begin /Registry (Adobe) def /Ordering (Korea1) def /Supplement 2 def end def /CMapName /Adobe-Korea1-2 def /CMapVersion 1.000 def /CMapType 1 def /XUID [1 10 25541] def /WMode 0 def /CIDCount 18352 def 1 begincodespacerange <0000> <47FF> endcodespacerange 72 begincidrange <0000> <00ff> 0 <0100> <01ff> 256 <0200> <02ff> 512 <0300> <03ff> 768 <0400> <04ff> 1024 <0500> <05ff> 1280 <0600> <06ff> 1536 <0700> <07ff> 1792 <0800> <08ff> 2048 <0900> <09ff> 2304 <0a00> <0aff> 2560 <0b00> <0bff> 2816 <0c00> <0cff> 3072 <0d00> <0dff> 3328 <0e00> <0eff> 3584 <0f00> <0fff> 3840 <1000> <10ff> 4096 <1100> <11ff> 4352 <1200> <12ff> 4608 <1300> <13ff> 4864 <1400> <14ff> 5120 <1500> <15ff> 5376 <1600> <16ff> 5632 <1700> <17ff> 5888 <1800> <18ff> 6144 <1900> <19ff> 6400 <1a00> <1aff> 6656 <1b00> <1bff> 6912 <1c00> <1cff> 7168 <1d00> <1dff> 7424 <1e00> <1eff> 7680 <1f00> <1fff> 7936 <2000> <20ff> 8192 <2100> <21ff> 8448 <2200> <22ff> 8704 <2300> <23ff> 8960 <2400> <24ff> 9216 <2500> <25ff> 9472 <2600> <26ff> 9728 <2700> <27ff> 9984 <2800> <28ff> 10240 <2900> <29ff> 10496 <2a00> <2aff> 10752 <2b00> <2bff> 11008 <2c00> <2cff> 11264 <2d00> <2dff> 11520 <2e00> <2eff> 11776 <2f00> <2fff> 12032 <3000> <30ff> 12288 <3100> <31ff> 12544 <3200> <32ff> 12800 <3300> <33ff> 13056 <3400> <34ff> 13312 <3500> <35ff> 13568 <3600> <36ff> 13824 <3700> <37ff> 14080 <3800> <38ff> 14336 <3900> <39ff> 14592 <3a00> <3aff> 14848 <3b00> <3bff> 15104 <3c00> <3cff> 15360 <3d00> <3dff> 15616 <3e00> <3eff> 15872 <3f00> <3fff> 16128 <4000> <40ff> 16384 <4100> <41ff> 16640 <4200> <42ff> 16896 <4300> <43ff> 17152 <4400> <44ff> 17408 <4500> <45ff> 17664 <4600> <46ff> 17920 <4700> <47af> 18176 endcidrange endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF \ No newline at end of file
diff --git a/src/main/resources/Resources/cmap/Adobe-Korea1-H-CID b/src/main/resources/Resources/cmap/Adobe-Korea1-H-CID
new file mode 100644
index 0000000..905cdfe
--- /dev/null
+++ b/src/main/resources/Resources/cmap/Adobe-Korea1-H-CID
@@ -0,0 +1,76 @@
+%!PS-Adobe-3.0 Resource-CMap
+%%DocumentNeededResources: ProcSet (CIDInit)
+%%IncludeResource: ProcSet (CIDInit)
+%%BeginResource: CMap (Adobe-Korea1-H-CID)
+%%Title: (Adobe-Korea1-H-CID Adobe Korea1 0)
+%%Version: 2.000
+%%Copyright: -----------------------------------------------------------
+%%Copyright: Copyright 1990-2000 Adobe Systems Incorporated.
+%%Copyright: All Rights Reserved.
+%%Copyright:
+%%Copyright: Patents Pending
+%%Copyright:
+%%Copyright: NOTICE: All information contained herein is the property
+%%Copyright: of Adobe Systems Incorporated.
+%%Copyright:
+%%Copyright: Permission is granted for redistribution of this file
+%%Copyright: provided this copyright notice is maintained intact and
+%%Copyright: that the contents of this file are not altered in any
+%%Copyright: way from its original form.
+%%Copyright:
+%%Copyright: PostScript and Display PostScript are trademarks of
+%%Copyright: Adobe Systems Incorporated which may be registered in
+%%Copyright: certain jurisdictions.
+%%Copyright: -----------------------------------------------------------
+%%EndComments
+
+/CIDInit /ProcSet findresource begin
+
+12 dict begin
+
+begincmap
+
+/CIDSystemInfo 3 dict dup begin
+ /Registry (Adobe) def
+ /Ordering (Adobe_Korea1_H_CID) def
+ /Supplement 0 def
+end def
+
+/CMapName /Adobe-Korea1-H-CID def
+/CMapVersion 2.000 def
+/CMapType 1 def
+
+/UIDOffset 0 def
+
+/WMode 0 def
+
+1 begincodespacerange
+ <0000> <FFFF>
+endcodespacerange
+
+0 usefont
+1 begincidrange
+<0000> <FFFF> 0
+endcidrange
+
+% Map CIDs 1 thru 95 to Ascii codes 0x20 - 0x7F in fontID 1.
+1 usefont
+1 beginbfrange
+<0001> <005F> <20>
+endbfrange
+
+% Map CIDs 9333 - 18154 to FontID 2 for Supplement 1
+% Also map CIDs upto 65536 to this fontID.
+2 usefont
+2 begincidrange
+<2475> <24FF> 9333
+<2500> <FFFF> 9472
+endcidrange
+
+endcmap
+CMapName currentdict /CMap defineresource pop
+end
+end
+
+%%EndResource
+%%EOF
diff --git a/src/main/resources/Resources/cmap/Adobe-Korea1-H-Host b/src/main/resources/Resources/cmap/Adobe-Korea1-H-Host
new file mode 100644
index 0000000..eb4b7e6
--- /dev/null
+++ b/src/main/resources/Resources/cmap/Adobe-Korea1-H-Host
@@ -0,0 +1,735 @@
+%!PS-Adobe-3.0 Resource-CMap
+%%DocumentNeededResources: ProcSet (CIDInit)
+%%IncludeResource: ProcSet (CIDInit)
+%%BeginResource: CMap (Adobe-Korea1-H-Host)
+%%Title: (Adobe-Korea1-H-Host Adobe KSCms-UHC 0)
+%%Version: 4.000
+%%Copyright: -----------------------------------------------------------
+%%Copyright: Copyright 1990-1996 Adobe Systems Incorporated.
+%%Copyright: All Rights Reserved.
+%%Copyright:
+%%Copyright: Patents Pending
+%%Copyright:
+%%Copyright: NOTICE: All information contained herein is the property
+%%Copyright: of Adobe Systems Incorporated.
+%%Copyright:
+%%Copyright: Permission is granted for redistribution of this file
+%%Copyright: provided this copyright notice is maintained intact and
+%%Copyright: that the contents of this file are not altered in any
+%%Copyright: way from its original form.
+%%Copyright:
+%%Copyright: PostScript and Display PostScript are trademarks of
+%%Copyright: Adobe Systems Incorporated which may be registered in
+%%Copyright: certain jurisdictions.
+%%Copyright: -----------------------------------------------------------
+%%EndComments
+
+/CIDInit /ProcSet findresource begin
+
+12 dict begin
+
+begincmap
+
+/CIDSystemInfo 3 dict dup begin
+/Registry (Adobe) def
+/Ordering (Adobe_Korea1_H_Host) def
+/Supplement 0 def
+end def
+
+/CMapName /Adobe-Korea1-H-Host def
+
+/CMapVersion 4.000 def
+/CMapType 1 def
+
+/WMode 0 def
+
+1 begincodespacerange
+<0000> <FFFF>
+endcodespacerange
+
+4 usefont % Subset Fonts
+1 begincidrange
+<0000> <FFFF> 0
+endcidrange
+
+1 usefont % Prop Roman
+1 beginbfrange
+<0001> <005F> <20>
+endbfrange
+
+2 usefont % Halfwidth Roman
+1 beginbfrange
+<1F9E> <1FFB> <20>
+endbfrange
+
+0 usefont % Windows TrueType Font
+100 beginbfrange
+<0065> <00C2> <A1A1>
+<00C3> <00FF> <A2A1>
+<0100> <0107> <A2DE>
+<0108> <0165> <A3A1>
+<0166> <0198> <A4A1>
+<0199> <01C2> <A4D5>
+<01C3> <01CC> <A5A1>
+<01CD> <01D6> <A5B0>
+<01D7> <01EE> <A5C1>
+<01EF> <01FF> <A5E1>
+<0200> <0206> <A5F2>
+<0207> <024A> <A6A1>
+<024B> <0299> <A7A1>
+<029A> <029D> <A8A1>
+<029E> <029E> <A8A6>
+<029F> <02A6> <A8A8>
+<02A7> <02F4> <A8B1>
+<02F5> <02FF> <A9A1>
+<0300> <0352> <A9AC>
+<0353> <03A5> <AAA1>
+<03A6> <03FB> <ABA1>
+<03FC> <03FF> <ACA1>
+<0400> <041C> <ACA5>
+<041D> <043D> <ACD1>
+<043E> <049B> <B0A1>
+<049C> <04F9> <B1A1>
+<04FA> <04FF> <B2A1>
+<0500> <0557> <B2A7>
+<0558> <05B5> <B3A1>
+<05B6> <05FF> <B4A1>
+<0600> <0613> <B4EB>
+<0614> <0671> <B5A1>
+<0672> <06CF> <B6A1>
+<06D0> <06FF> <B7A1>
+<0700> <072D> <B7D1>
+<072E> <078B> <B8A1>
+<078C> <07E9> <B9A1>
+<07EA> <07FF> <BAA1>
+<0800> <0847> <BAB7>
+<0848> <08A5> <BBA1>
+<08A6> <08FF> <BCA1>
+<0900> <0903> <BCFB>
+<0904> <0961> <BDA1>
+<0962> <09BF> <BEA1>
+<09C0> <09FF> <BFA1>
+<0A00> <0A1D> <BFE1>
+<0A1E> <0A7B> <C0A1>
+<0A7C> <0AD9> <C1A1>
+<0ADA> <0AFF> <C2A1>
+<0B00> <0B37> <C2C7>
+<0B38> <0B95> <C3A1>
+<0B96> <0BF3> <C4A1>
+<0BF4> <0BFF> <C5A1>
+<0C00> <0C51> <C5AD>
+<0C52> <0CAF> <C6A1>
+<0CB0> <0CFF> <C7A1>
+<0D00> <0D0D> <C7F1>
+<0D0E> <0D6B> <C8A1>
+<0D6C> <0DC9> <CAA1>
+<0DCA> <0DF8> <CBA1>
+<0DF9> <0DFD> <CBD1>
+<0DFE> <0DFF> <CBD7>
+<0E00> <0E0D> <CBD9>
+<0E0E> <0E24> <CBE8>
+<0E25> <0E5D> <CCA1>
+<0E5E> <0E5E> <CBD6>
+<0E5F> <0E82> <CCDB>
+<0E83> <0EB0> <CDA1>
+<0EB1> <0EC8> <CDD0>
+<0EC9> <0EDE> <CDE9>
+<0EDF> <0EEA> <CEA1>
+<0EEB> <0EFF> <CEAE>
+<0F00> <0F3B> <CEC3>
+<0F3C> <0F95> <CFA1>
+<0F96> <0F98> <CFFC>
+<0F99> <0F99> <D0A1>
+<0F9A> <0FAE> <D0A3>
+<0FAF> <0FC5> <D0B9>
+<0FC6> <0FD1> <D0D1>
+<0FD2> <0FF2> <D0DE>
+<0FF3> <0FFF> <D1A1>
+<1000> <1013> <D1AE>
+<1014> <1014> <CBD0>
+<1015> <1022> <D1C3>
+<1023> <1023> <D0DD>
+<1024> <1025> <D1D2>
+<1026> <1027> <D1D6>
+<1028> <1029> <D1D9>
+<102A> <102A> <D1E1>
+<102B> <102B> <D1E7>
+<102C> <102C> <D1EC>
+<102D> <102D> <D1EE>
+<102E> <102E> <D1F1>
+<102F> <1031> <D1F3>
+<1032> <1034> <D1F7>
+<1035> <1035> <D1FB>
+<1036> <1036> <D2A1>
+<1037> <1039> <D2A4>
+<103A> <103A> <D2AC>
+<103B> <103B> <D2AE>
+endbfrange
+100 beginbfrange
+<103C> <103C> <D1D5>
+<103D> <103E> <D2B0>
+<103F> <1049> <D2B3>
+<104A> <104C> <D2BF>
+<104D> <104D> <D2C5>
+<104E> <104E> <D2CC>
+<104F> <104F> <D2D8>
+<1050> <1052> <D2DB>
+<1053> <1053> <D2E0>
+<1054> <1054> <D2E3>
+<1055> <1058> <D2EC>
+<1059> <1059> <D2F6>
+<105A> <105F> <D2F9>
+<1060> <10BD> <D3A1>
+<10BE> <10FF> <D4A1>
+<1100> <1102> <D4E3>
+<1103> <1115> <D4E7>
+<1116> <1116> <D1D4>
+<1117> <1117> <D1D8>
+<1118> <111D> <D1DB>
+<111E> <1120> <D1E3>
+<1121> <1121> <D5A9>
+<1122> <1122> <D1E6>
+<1123> <1126> <D1E8>
+<1127> <1127> <D1ED>
+<1128> <1129> <D5B2>
+<112A> <112B> <D1EF>
+<112C> <112C> <D1F2>
+<112D> <112E> <D5B7>
+<112F> <112F> <D1F6>
+<1130> <1132> <D5BA>
+<1133> <1133> <D1FA>
+<1134> <1135> <D5BE>
+<1136> <1137> <D1FC>
+<1138> <1138> <D5C2>
+<1139> <1139> <D1FE>
+<113A> <113B> <D2A2>
+<113C> <113F> <D2A7>
+<1140> <1142> <D5CA>
+<1143> <1143> <D2AB>
+<1144> <1144> <D2AD>
+<1145> <1147> <D5CF>
+<1148> <1148> <D2B2>
+<1149> <1174> <D5D3>
+<1175> <118B> <D6A1>
+<118C> <119E> <D6B9>
+<119F> <119F> <D2BE>
+<11A0> <11A0> <D6CE>
+<11A1> <11A2> <D2C2>
+<11A3> <11A4> <D6D1>
+<11A5> <11A5> <D2C4>
+<11A6> <11AA> <D2C6>
+<11AB> <11AB> <D6D9>
+<11AC> <11AC> <D2CB>
+<11AD> <11AE> <D2CD>
+<11AF> <11AF> <D6DD>
+<11B0> <11B5> <D2CF>
+<11B6> <11B6> <D6E4>
+<11B7> <11B9> <D2D5>
+<11BA> <11BC> <D6E8>
+<11BD> <11BE> <D2D9>
+<11BF> <11C0> <D6ED>
+<11C1> <11C2> <D2DE>
+<11C3> <11C3> <D2E1>
+<11C4> <11C5> <D6F2>
+<11C6> <11C6> <D2E2>
+<11C7> <11D0> <D6F5>
+<11D1> <11D3> <D7A1>
+<11D4> <11D4> <D2E4>
+<11D5> <11D5> <D7A5>
+<11D6> <11D9> <D2E5>
+<11DA> <11DA> <D7AA>
+<11DB> <11DC> <D2E9>
+<11DD> <11DF> <D7AD>
+<11E0> <11E0> <D2EB>
+<11E1> <11FA> <D7B1>
+<11FB> <11FB> <D7CC>
+<11FC> <11FF> <D2F0>
+<1200> <1200> <D7D1>
+<1201> <1202> <D2F4>
+<1203> <1204> <D2F7>
+<1205> <1212> <D7D6>
+<1213> <122C> <D7E5>
+<122D> <128A> <D8A1>
+<128B> <12E8> <D9A1>
+<12E9> <12FF> <DAA1>
+<1300> <1346> <DAB8>
+<1347> <136A> <DBA1>
+<136B> <1388> <DBC6>
+<1389> <13A2> <DBE5>
+<13A3> <13A6> <DCA1>
+<13A7> <13FF> <DCA6>
+<1400> <1403> <DDA1>
+<1404> <141E> <DDA6>
+<141F> <141F> <DBC5>
+<1420> <1432> <DDC2>
+<1433> <1450> <DDD6>
+<1451> <145A> <DDF5>
+<145B> <14B5> <DEA1>
+<14B6> <14B6> <DEFD>
+endbfrange
+100 beginbfrange
+<14B7> <14C8> <DFA1>
+<14C9> <14F5> <DFB4>
+<14F6> <14F6> <DFE2>
+<14F7> <14F7> <DEFE>
+<14F8> <14FB> <DFE4>
+<14FC> <14FF> <DFE9>
+<1500> <1511> <DFED>
+<1512> <1561> <E0A1>
+<1562> <156C> <E0F2>
+<156D> <156D> <DFE8>
+<156E> <156E> <E0FE>
+<156F> <157A> <E1A1>
+<157B> <15AF> <E1AE>
+<15B0> <15B0> <D7CB>
+<15B1> <15B9> <E1E4>
+<15BA> <15CA> <E1EE>
+<15CB> <15CF> <E2A1>
+<15D0> <15D0> <DEFC>
+<15D1> <15FF> <E2A7>
+<1600> <1628> <E2D6>
+<1629> <167C> <E3A1>
+<167D> <1685> <E3F6>
+<1686> <168C> <E4A2>
+<168D> <16A7> <E4AA>
+<16A8> <16A8> <D1E2>
+<16A9> <16E1> <E4C6>
+<16E2> <16EE> <E5A1>
+<16EF> <16F0> <E5AF>
+<16F1> <16F1> <E5B3>
+<16F2> <16F2> <E5AE>
+<16F3> <16F6> <E5B5>
+<16F7> <16F7> <E5BA>
+<16F8> <16FE> <E5BD>
+<16FF> <16FF> <E5C5>
+<1700> <1707> <E5C6>
+<1708> <1708> <E5CF>
+<1709> <1709> <E5D1>
+<170A> <170C> <E5D3>
+<170D> <172F> <E5D7>
+<1730> <1730> <E5FD>
+<1731> <1732> <E6A2>
+<1733> <1734> <E6A5>
+<1735> <1739> <E6A8>
+<173A> <173A> <E6AE>
+<173B> <173B> <E6B2>
+<173C> <173E> <E6B4>
+<173F> <1741> <E6B9>
+<1742> <1748> <E6BD>
+<1749> <1749> <E6C5>
+<174A> <174B> <E6C8>
+<174C> <1752> <E6CB>
+<1753> <1755> <E6D3>
+<1756> <1757> <E6D7>
+<1758> <1759> <E6DA>
+<175A> <175B> <E6DD>
+<175C> <175C> <E6E0>
+<175D> <175E> <E6E2>
+<175F> <175F> <E6E7>
+<1760> <1760> <E6E9>
+<1761> <1762> <E6ED>
+<1763> <1763> <E6F0>
+<1764> <1765> <E6F3>
+<1766> <1766> <E6F8>
+<1767> <176B> <E6FA>
+<176C> <176F> <E7A2>
+<1770> <1770> <E7A7>
+<1771> <1771> <E0F1>
+<1772> <1772> <E7AB>
+<1773> <1774> <E7AE>
+<1775> <1782> <E7B1>
+<1783> <1783> <E7C0>
+<1784> <1787> <E7C2>
+<1788> <178A> <E7C8>
+<178B> <178B> <E7CC>
+<178C> <178C> <E7CE>
+<178D> <178E> <E7D1>
+<178F> <1799> <E7D4>
+<179A> <179D> <E7E0>
+<179E> <179E> <E7E5>
+<179F> <17AE> <E7E7>
+<17AF> <17B5> <E7F8>
+<17B6> <17FB> <E8A1>
+<17FC> <17FF> <E8E9>
+<1800> <1802> <E8ED>
+<1803> <1807> <E8F2>
+<1808> <1808> <E8F8>
+<1809> <1809> <E8FA>
+<180A> <180B> <E8FC>
+<180C> <1811> <E9A1>
+<1812> <1815> <E9A8>
+<1816> <1834> <E9AD>
+<1835> <185E> <E9CD>
+<185F> <1865> <E9F8>
+<1866> <1885> <EAA1>
+<1886> <18A8> <EAC2>
+<18A9> <18B6> <EAE6>
+<18B7> <18B8> <EAF5>
+<18B9> <18BC> <EAF8>
+<18BD> <18BD> <EAFD>
+<18BE> <18C0> <EBA1>
+endbfrange
+100 beginbfrange
+<18C1> <18C2> <EBA5>
+<18C3> <18C3> <EBA8>
+<18C4> <18D2> <EBAB>
+<18D3> <18D3> <EBBC>
+<18D4> <18D6> <EBBE>
+<18D7> <18D9> <EBC3>
+<18DA> <18DD> <EBC8>
+<18DE> <18DF> <EBCD>
+<18E0> <18E4> <EBD3>
+<18E5> <18FF> <EBD9>
+<1900> <190A> <EBF4>
+<190B> <190F> <ECA1>
+<1910> <1911> <ECA8>
+<1912> <1915> <ECAB>
+<1916> <1917> <ECB3>
+<1918> <1918> <D7E4>
+<1919> <1919> <ECB7>
+<191A> <191A> <ECB9>
+<191B> <191F> <ECBB>
+<1920> <1922> <ECC2>
+<1923> <1924> <ECC7>
+<1925> <192E> <ECCB>
+<192F> <192F> <E6EC>
+<1930> <1935> <ECD7>
+<1936> <1937> <ECDF>
+<1938> <1939> <ECE2>
+<193A> <193B> <ECE5>
+<193C> <1949> <ECE9>
+<194A> <194A> <ECF9>
+<194B> <194E> <ECFB>
+<194F> <1998> <EDA4>
+<1999> <19A8> <EDEF>
+<19A9> <19E2> <EEA1>
+<19E3> <19FF> <EEDC>
+<1A00> <1A05> <EEF9>
+<1A06> <1A63> <EFA1>
+<1A64> <1AC1> <F0A1>
+<1AC2> <1AFF> <F1A1>
+<1B00> <1B1F> <F1DF>
+<1B20> <1B3B> <F2A1>
+<1B3C> <1B60> <F2BE>
+<1B61> <1B61> <E3F5>
+<1B62> <1B77> <F2E4>
+<1B78> <1B7B> <F2FB>
+<1B7C> <1B8B> <F3A1>
+<1B8C> <1B8C> <F3B2>
+<1B8D> <1B8D> <CBE7>
+<1B8E> <1BAA> <F3B4>
+<1BAB> <1BAB> <DFB3>
+<1BAC> <1BD8> <F3D2>
+<1BD9> <1BDE> <F4A1>
+<1BDF> <1BFF> <F4A8>
+<1C00> <1C24> <F4C9>
+<1C25> <1C34> <F4EF>
+<1C35> <1C92> <F5A1>
+<1C93> <1CC9> <F6A1>
+<1CCA> <1CCA> <E4A1>
+<1CCB> <1CE5> <F6D9>
+<1CE6> <1CE6> <F6F5>
+<1CE7> <1CEE> <F6F7>
+<1CEF> <1CFF> <F7A1>
+<1D00> <1D05> <F7B2>
+<1D06> <1D14> <F7B9>
+<1D15> <1D1E> <F7C9>
+<1D1F> <1D49> <F7D4>
+<1D4A> <1D5D> <F8A1>
+<1D5E> <1D5E> <DCA5>
+<1D5F> <1D83> <F8B6>
+<1D84> <1D93> <F8DC>
+<1D94> <1D94> <F8DB>
+<1D95> <1D97> <F8ED>
+<1D98> <1DA5> <F8F1>
+<1DA6> <1DB6> <F9A1>
+<1DB7> <1DB7> <DDF4>
+<1DB8> <1DFF> <F9B3>
+<1E00> <1E03> <F9FB>
+<1E04> <1E1C> <FAA3>
+<1E1D> <1E1D> <FAA1>
+<1E1E> <1E46> <FABD>
+<1E47> <1E5E> <FAE7>
+<1E5F> <1E66> <FBA1>
+<1E67> <1E67> <E7C1>
+<1E68> <1EBC> <FBAA>
+<1EBD> <1EC4> <FCA1>
+<1EC5> <1EDB> <FCAA>
+<1EDC> <1EDC> <CDE8>
+<1EDD> <1EFF> <FCC2>
+<1F00> <1F19> <FCE5>
+<1F1A> <1F33> <FDA1>
+<1F34> <1F34> <E9F7>
+<1F35> <1F77> <FDBC>
+<2475> <248E> <8141>
+<248F> <24A8> <8161>
+<24A9> <24FF> <8181>
+<2500> <2526> <81D8>
+<2527> <2540> <8241>
+<2541> <255A> <8261>
+<255B> <25D8> <8281>
+<25D9> <25F2> <8341>
+<25F3> <25FF> <8361>
+endbfrange
+100 beginbfrange
+<2600> <260C> <836E>
+<260D> <268A> <8381>
+<268B> <26A4> <8441>
+<26A5> <26BE> <8461>
+<26BF> <26FF> <8481>
+<2700> <273C> <84C2>
+<273D> <2756> <8541>
+<2757> <2770> <8561>
+<2771> <27EE> <8581>
+<27EF> <27FF> <8641>
+<2800> <2808> <8652>
+<2809> <2822> <8661>
+<2823> <28A0> <8681>
+<28A1> <28BA> <8741>
+<28BB> <28D4> <8761>
+<28D5> <28FF> <8781>
+<2900> <2952> <87AC>
+<2953> <296C> <8841>
+<296D> <2986> <8861>
+<2987> <29FF> <8881>
+<2A00> <2A04> <88FA>
+<2A05> <2A1E> <8941>
+<2A1F> <2A38> <8961>
+<2A39> <2AB6> <8981>
+<2AB7> <2AD0> <8A41>
+<2AD1> <2AEA> <8A61>
+<2AEB> <2AFF> <8A81>
+<2B00> <2B68> <8A96>
+<2B69> <2B82> <8B41>
+<2B83> <2B9C> <8B61>
+<2B9D> <2BFF> <8B81>
+<2C00> <2C1A> <8BE4>
+<2C1B> <2C34> <8C41>
+<2C35> <2C4E> <8C61>
+<2C4F> <2CCC> <8C81>
+<2CCD> <2CE6> <8D41>
+<2CE7> <2CFF> <8D61>
+<2D00> <2D00> <8D7A>
+<2D01> <2D7E> <8D81>
+<2D7F> <2D98> <8E41>
+<2D99> <2DB2> <8E61>
+<2DB3> <2DFF> <8E81>
+<2E00> <2E30> <8ECE>
+<2E31> <2E4A> <8F41>
+<2E4B> <2E64> <8F61>
+<2E65> <2EE2> <8F81>
+<2EE3> <2EFC> <9041>
+<2EFD> <2EFF> <9061>
+<2F00> <2F16> <9064>
+<2F17> <2F94> <9081>
+<2F95> <2FAE> <9141>
+<2FAF> <2FC8> <9161>
+<2FC9> <2FFF> <9181>
+<3000> <3046> <91B8>
+<3047> <3060> <9241>
+<3061> <307A> <9261>
+<307B> <30F8> <9281>
+<30F9> <30FF> <9341>
+<3100> <3112> <9348>
+<3113> <312C> <9361>
+<312D> <31AA> <9381>
+<31AB> <31C4> <9441>
+<31C5> <31DE> <9461>
+<31DF> <31FF> <9481>
+<3200> <325C> <94A2>
+<325D> <3276> <9541>
+<3277> <3290> <9561>
+<3291> <32FF> <9581>
+<3300> <330E> <95F0>
+<330F> <3328> <9641>
+<3329> <3342> <9661>
+<3343> <33C0> <9681>
+<33C1> <33DA> <9741>
+<33DB> <33F4> <9761>
+<33F5> <33FF> <9781>
+<3400> <3472> <978C>
+<3473> <348C> <9841>
+<348D> <34A6> <9861>
+<34A7> <34FF> <9881>
+<3500> <3524> <98DA>
+<3525> <353E> <9941>
+<353F> <3558> <9961>
+<3559> <35D6> <9981>
+<35D7> <35F0> <9A41>
+<35F1> <35FF> <9A61>
+<3600> <360A> <9A70>
+<360B> <3688> <9A81>
+<3689> <36A2> <9B41>
+<36A3> <36BC> <9B61>
+<36BD> <36FF> <9B81>
+<3700> <373A> <9BC4>
+<373B> <3754> <9C41>
+<3755> <376E> <9C61>
+<376F> <37EC> <9C81>
+<37ED> <37FF> <9D41>
+<3800> <3806> <9D54>
+<3807> <3820> <9D61>
+<3821> <389E> <9D81>
+<389F> <38B8> <9E41>
+<38B9> <38D2> <9E61>
+endbfrange
+100 beginbfrange
+<38D3> <38FF> <9E81>
+<3900> <3950> <9EAE>
+<3951> <396A> <9F41>
+<396B> <3984> <9F61>
+<3985> <39FF> <9F81>
+<3A00> <3A02> <9FFC>
+<3A03> <3A1C> <A041>
+<3A1D> <3A36> <A061>
+<3A37> <3AB4> <A081>
+<3AB5> <3ACE> <A141>
+<3ACF> <3AE8> <A161>
+<3AE9> <3AFF> <A181>
+<3B00> <3B08> <A198>
+<3B09> <3B22> <A241>
+<3B23> <3B3C> <A261>
+<3B3D> <3B5C> <A281>
+<3B5D> <3B76> <A341>
+<3B77> <3B90> <A361>
+<3B91> <3BB0> <A381>
+<3BB1> <3BCA> <A441>
+<3BCB> <3BE4> <A461>
+<3BE5> <3BFF> <A481>
+<3C00> <3C04> <A49C>
+<3C05> <3C1E> <A541>
+<3C1F> <3C38> <A561>
+<3C39> <3C58> <A581>
+<3C59> <3C72> <A641>
+<3C73> <3C8C> <A661>
+<3C8D> <3CAC> <A681>
+<3CAD> <3CC6> <A741>
+<3CC7> <3CE0> <A761>
+<3CE1> <3CFF> <A781>
+<3D00> <3D00> <A7A0>
+<3D01> <3D1A> <A841>
+<3D1B> <3D34> <A861>
+<3D35> <3D54> <A881>
+<3D55> <3D6E> <A941>
+<3D6F> <3D88> <A961>
+<3D89> <3DA8> <A981>
+<3DA9> <3DC2> <AA41>
+<3DC3> <3DDC> <AA61>
+<3DDD> <3DFC> <AA81>
+<3DFD> <3DFF> <AB41>
+<3E00> <3E16> <AB44>
+<3E17> <3E30> <AB61>
+<3E31> <3E50> <AB81>
+<3E51> <3E6A> <AC41>
+<3E6B> <3E84> <AC61>
+<3E85> <3EA4> <AC81>
+<3EA5> <3EBE> <AD41>
+<3EBF> <3ED8> <AD61>
+<3ED9> <3EF8> <AD81>
+<3EF9> <3EFF> <AE41>
+<3F00> <3F12> <AE48>
+<3F13> <3F2C> <AE61>
+<3F2D> <3F4C> <AE81>
+<3F4D> <3F66> <AF41>
+<3F67> <3F80> <AF61>
+<3F81> <3FA0> <AF81>
+<3FA1> <3FBA> <B041>
+<3FBB> <3FD4> <B061>
+<3FD5> <3FF4> <B081>
+<3FF5> <3FFF> <B141>
+<4000> <400E> <B14C>
+<400F> <4028> <B161>
+<4029> <4048> <B181>
+<4049> <4062> <B241>
+<4063> <407C> <B261>
+<407D> <409C> <B281>
+<409D> <40B6> <B341>
+<40B7> <40D0> <B361>
+<40D1> <40F0> <B381>
+<40F1> <40FF> <B441>
+<4100> <410A> <B450>
+<410B> <4124> <B461>
+<4125> <4144> <B481>
+<4145> <415E> <B541>
+<415F> <4178> <B561>
+<4179> <4198> <B581>
+<4199> <41B2> <B641>
+<41B3> <41CC> <B661>
+<41CD> <41EC> <B681>
+<41ED> <41FF> <B741>
+<4200> <4206> <B754>
+<4207> <4220> <B761>
+<4221> <4240> <B781>
+<4241> <425A> <B841>
+<425B> <4274> <B861>
+<4275> <4294> <B881>
+<4295> <42AE> <B941>
+<42AF> <42C8> <B961>
+<42C9> <42E8> <B981>
+<42E9> <42FF> <BA41>
+<4300> <4302> <BA58>
+<4303> <431C> <BA61>
+<431D> <433C> <BA81>
+<433D> <4356> <BB41>
+<4357> <4370> <BB61>
+<4371> <4390> <BB81>
+<4391> <43AA> <BC41>
+endbfrange
+33 beginbfrange
+<43AB> <43C4> <BC61>
+<43C5> <43E4> <BC81>
+<43E5> <43FE> <BD41>
+<43FF> <43FF> <BD61>
+<4400> <4418> <BD62>
+<4419> <4438> <BD81>
+<4439> <4452> <BE41>
+<4453> <446C> <BE61>
+<446D> <448C> <BE81>
+<448D> <44A6> <BF41>
+<44A7> <44C0> <BF61>
+<44C1> <44E0> <BF81>
+<44E1> <44FA> <C041>
+<44FB> <44FF> <C061>
+<4500> <4514> <C066>
+<4515> <4534> <C081>
+<4535> <454E> <C141>
+<454F> <4568> <C161>
+<4569> <4588> <C181>
+<4589> <45A2> <C241>
+<45A3> <45BC> <C261>
+<45BD> <45DC> <C281>
+<45DD> <45F6> <C341>
+<45F7> <45FF> <C361>
+<4600> <4610> <C36A>
+<4611> <4630> <C381>
+<4631> <464A> <C441>
+<464B> <4664> <C461>
+<4665> <4684> <C481>
+<4685> <469E> <C541>
+<469F> <46B8> <C561>
+<46B9> <46D8> <C581>
+<46D9> <46EA> <C641>
+endbfrange
+
+3 usefont % Vertical Fonts
+11 beginbfrange
+<1F78> <1F79> <A1A2>
+<1F7A> <1F7A> <A1A5>
+<1F7E> <1F7E> <A1AD>
+<1F7F> <1F8A> <A1B2>
+<1F8C> <1F8C> <A3A1>
+<1F8F> <1F8F> <A3AC>
+<1F90> <1F90> <A3AE>
+<1F97> <1F97> <A3DB>
+<1F98> <1F98> <A3DD>
+<1F9A> <1F9A> <A3FB>
+<1F9C> <1F9C> <A3FD>
+endbfrange
+
+endcmap
+CMapName currentdict /CMap defineresource pop
+end
+end
+
+%%EndResource
+%%EOF
diff --git a/src/main/resources/Resources/cmap/Adobe-Korea1-KSCms-UHC b/src/main/resources/Resources/cmap/Adobe-Korea1-KSCms-UHC
new file mode 100644
index 0000000..1da0af9
--- /dev/null
+++ b/src/main/resources/Resources/cmap/Adobe-Korea1-KSCms-UHC
@@ -0,0 +1,727 @@
+%!PS-Adobe-3.0 Resource-CMap
+%%DocumentNeededResources: ProcSet (CIDInit)
+%%IncludeResource: ProcSet (CIDInit)
+%%BeginResource: CMap (Adobe-Korea1-KSCms-UHC)
+%%Title: (Adobe-Korea1-KSCms-UHC Adobe KSCms-UHC 1)
+%%Version: 4.002
+%%Copyright: -----------------------------------------------------------
+%%Copyright: Copyright 1990-1996 Adobe Systems Incorporated.
+%%Copyright: All Rights Reserved.
+%%Copyright:
+%%Copyright: Patents Pending
+%%Copyright:
+%%Copyright: NOTICE: All information contained herein is the property
+%%Copyright: of Adobe Systems Incorporated.
+%%Copyright:
+%%Copyright: Permission is granted for redistribution of this file
+%%Copyright: provided this copyright notice is maintained intact and
+%%Copyright: that the contents of this file are not altered in any
+%%Copyright: way from its original form.
+%%Copyright:
+%%Copyright: PostScript and Display PostScript are trademarks of
+%%Copyright: Adobe Systems Incorporated which may be registered in
+%%Copyright: certain jurisdictions.
+%%Copyright: -----------------------------------------------------------
+%%EndComments
+
+/CIDInit /ProcSet findresource begin
+
+12 dict begin
+
+begincmap
+
+/CIDSystemInfo 3 dict dup begin
+/Registry (Adobe) def
+/Ordering (Adobe_Korea1_KSCms_UHC) def
+/Supplement 1 def
+end def
+
+/CMapName /Adobe-Korea1-KSCms-UHC def
+
+/CMapVersion 4.002 def
+/CMapType 1 def
+
+/XUID [1 10 25335 1212] def
+
+/WMode 0 def
+
+1 begincodespacerange
+<0000> <FFFF>
+endcodespacerange
+
+1 beginbfrange
+<0000> <0000> <20>
+endbfrange
+100 beginbfrange
+<0001> <005F> <20>
+<0065> <00C2> <A1A1>
+<00C3> <00FF> <A2A1>
+<0100> <0107> <A2DE>
+<0108> <0165> <A3A1>
+<0166> <0198> <A4A1>
+<0199> <01C2> <A4D5>
+<01C3> <01CC> <A5A1>
+<01CD> <01D6> <A5B0>
+<01D7> <01EE> <A5C1>
+<01EF> <01FF> <A5E1>
+<0200> <0206> <A5F2>
+<0207> <024A> <A6A1>
+<024B> <0299> <A7A1>
+<029A> <029D> <A8A1>
+<029E> <029E> <A8A6>
+<029F> <02A6> <A8A8>
+<02A7> <02F4> <A8B1>
+<02F5> <02FF> <A9A1>
+<0300> <0352> <A9AC>
+<0353> <03A5> <AAA1>
+<03A6> <03FB> <ABA1>
+<03FC> <03FF> <ACA1>
+<0400> <041C> <ACA5>
+<041D> <043D> <ACD1>
+<043E> <049B> <B0A1>
+<049C> <04F9> <B1A1>
+<04FA> <04FF> <B2A1>
+<0500> <0557> <B2A7>
+<0558> <05B5> <B3A1>
+<05B6> <05FF> <B4A1>
+<0600> <0613> <B4EB>
+<0614> <0671> <B5A1>
+<0672> <06CF> <B6A1>
+<06D0> <06FF> <B7A1>
+<0700> <072D> <B7D1>
+<072E> <078B> <B8A1>
+<078C> <07E9> <B9A1>
+<07EA> <07FF> <BAA1>
+<0800> <0847> <BAB7>
+<0848> <08A5> <BBA1>
+<08A6> <08FF> <BCA1>
+<0900> <0903> <BCFB>
+<0904> <0961> <BDA1>
+<0962> <09BF> <BEA1>
+<09C0> <09FF> <BFA1>
+<0A00> <0A1D> <BFE1>
+<0A1E> <0A7B> <C0A1>
+<0A7C> <0AD9> <C1A1>
+<0ADA> <0AFF> <C2A1>
+<0B00> <0B37> <C2C7>
+<0B38> <0B95> <C3A1>
+<0B96> <0BF3> <C4A1>
+<0BF4> <0BFF> <C5A1>
+<0C00> <0C51> <C5AD>
+<0C52> <0CAF> <C6A1>
+<0CB0> <0CFF> <C7A1>
+<0D00> <0D0D> <C7F1>
+<0D0E> <0D6B> <C8A1>
+<0D6C> <0DC9> <CAA1>
+<0DCA> <0DF8> <CBA1>
+<0DF9> <0DFD> <CBD1>
+<0DFE> <0DFF> <CBD7>
+<0E00> <0E0D> <CBD9>
+<0E0E> <0E24> <CBE8>
+<0E25> <0E5D> <CCA1>
+<0E5E> <0E5E> <CBD6>
+<0E5F> <0E82> <CCDB>
+<0E83> <0EB0> <CDA1>
+<0EB1> <0EC8> <CDD0>
+<0EC9> <0EDE> <CDE9>
+<0EDF> <0EEA> <CEA1>
+<0EEB> <0EFF> <CEAE>
+<0F00> <0F3B> <CEC3>
+<0F3C> <0F95> <CFA1>
+<0F96> <0F98> <CFFC>
+<0F99> <0F99> <D0A1>
+<0F9A> <0FAE> <D0A3>
+<0FAF> <0FC5> <D0B9>
+<0FC6> <0FD1> <D0D1>
+<0FD2> <0FF2> <D0DE>
+<0FF3> <0FFF> <D1A1>
+<1000> <1013> <D1AE>
+<1014> <1014> <CBD0>
+<1015> <1022> <D1C3>
+<1023> <1023> <D0DD>
+<1024> <1025> <D1D2>
+<1026> <1027> <D1D6>
+<1028> <1029> <D1D9>
+<102A> <102A> <D1E1>
+<102B> <102B> <D1E7>
+<102C> <102C> <D1EC>
+<102D> <102D> <D1EE>
+<102E> <102E> <D1F1>
+<102F> <1031> <D1F3>
+<1032> <1034> <D1F7>
+<1035> <1035> <D1FB>
+<1036> <1036> <D2A1>
+<1037> <1039> <D2A4>
+<103A> <103A> <D2AC>
+endbfrange
+100 beginbfrange
+<103B> <103B> <D2AE>
+<103C> <103C> <D1D5>
+<103D> <103E> <D2B0>
+<103F> <1049> <D2B3>
+<104A> <104C> <D2BF>
+<104D> <104D> <D2C5>
+<104E> <104E> <D2CC>
+<104F> <104F> <D2D8>
+<1050> <1052> <D2DB>
+<1053> <1053> <D2E0>
+<1054> <1054> <D2E3>
+<1055> <1058> <D2EC>
+<1059> <1059> <D2F6>
+<105A> <105F> <D2F9>
+<1060> <10BD> <D3A1>
+<10BE> <10FF> <D4A1>
+<1100> <1102> <D4E3>
+<1103> <1115> <D4E7>
+<1116> <1116> <D1D4>
+<1117> <1117> <D1D8>
+<1118> <111D> <D1DB>
+<111E> <1120> <D1E3>
+<1121> <1121> <D5A9>
+<1122> <1122> <D1E6>
+<1123> <1126> <D1E8>
+<1127> <1127> <D1ED>
+<1128> <1129> <D5B2>
+<112A> <112B> <D1EF>
+<112C> <112C> <D1F2>
+<112D> <112E> <D5B7>
+<112F> <112F> <D1F6>
+<1130> <1132> <D5BA>
+<1133> <1133> <D1FA>
+<1134> <1135> <D5BE>
+<1136> <1137> <D1FC>
+<1138> <1138> <D5C2>
+<1139> <1139> <D1FE>
+<113A> <113B> <D2A2>
+<113C> <113F> <D2A7>
+<1140> <1142> <D5CA>
+<1143> <1143> <D2AB>
+<1144> <1144> <D2AD>
+<1145> <1147> <D5CF>
+<1148> <1148> <D2B2>
+<1149> <1174> <D5D3>
+<1175> <118B> <D6A1>
+<118C> <119E> <D6B9>
+<119F> <119F> <D2BE>
+<11A0> <11A0> <D6CE>
+<11A1> <11A2> <D2C2>
+<11A3> <11A4> <D6D1>
+<11A5> <11A5> <D2C4>
+<11A6> <11AA> <D2C6>
+<11AB> <11AB> <D6D9>
+<11AC> <11AC> <D2CB>
+<11AD> <11AE> <D2CD>
+<11AF> <11AF> <D6DD>
+<11B0> <11B5> <D2CF>
+<11B6> <11B6> <D6E4>
+<11B7> <11B9> <D2D5>
+<11BA> <11BC> <D6E8>
+<11BD> <11BE> <D2D9>
+<11BF> <11C0> <D6ED>
+<11C1> <11C2> <D2DE>
+<11C3> <11C3> <D2E1>
+<11C4> <11C5> <D6F2>
+<11C6> <11C6> <D2E2>
+<11C7> <11D0> <D6F5>
+<11D1> <11D3> <D7A1>
+<11D4> <11D4> <D2E4>
+<11D5> <11D5> <D7A5>
+<11D6> <11D9> <D2E5>
+<11DA> <11DA> <D7AA>
+<11DB> <11DC> <D2E9>
+<11DD> <11DF> <D7AD>
+<11E0> <11E0> <D2EB>
+<11E1> <11FA> <D7B1>
+<11FB> <11FB> <D7CC>
+<11FC> <11FF> <D2F0>
+<1200> <1200> <D7D1>
+<1201> <1202> <D2F4>
+<1203> <1204> <D2F7>
+<1205> <1212> <D7D6>
+<1213> <122C> <D7E5>
+<122D> <128A> <D8A1>
+<128B> <12E8> <D9A1>
+<12E9> <12FF> <DAA1>
+<1300> <1346> <DAB8>
+<1347> <136A> <DBA1>
+<136B> <1388> <DBC6>
+<1389> <13A2> <DBE5>
+<13A3> <13A6> <DCA1>
+<13A7> <13FF> <DCA6>
+<1400> <1403> <DDA1>
+<1404> <141E> <DDA6>
+<141F> <141F> <DBC5>
+<1420> <1432> <DDC2>
+<1433> <1450> <DDD6>
+<1451> <145A> <DDF5>
+<145B> <14B5> <DEA1>
+endbfrange
+100 beginbfrange
+<14B6> <14B6> <DEFD>
+<14B7> <14C8> <DFA1>
+<14C9> <14F5> <DFB4>
+<14F6> <14F6> <DFE2>
+<14F7> <14F7> <DEFE>
+<14F8> <14FB> <DFE4>
+<14FC> <14FF> <DFE9>
+<1500> <1511> <DFED>
+<1512> <1561> <E0A1>
+<1562> <156C> <E0F2>
+<156D> <156D> <DFE8>
+<156E> <156E> <E0FE>
+<156F> <157A> <E1A1>
+<157B> <15AF> <E1AE>
+<15B0> <15B0> <D7CB>
+<15B1> <15B9> <E1E4>
+<15BA> <15CA> <E1EE>
+<15CB> <15CF> <E2A1>
+<15D0> <15D0> <DEFC>
+<15D1> <15FF> <E2A7>
+<1600> <1628> <E2D6>
+<1629> <167C> <E3A1>
+<167D> <1685> <E3F6>
+<1686> <168C> <E4A2>
+<168D> <16A7> <E4AA>
+<16A8> <16A8> <D1E2>
+<16A9> <16E1> <E4C6>
+<16E2> <16EE> <E5A1>
+<16EF> <16F0> <E5AF>
+<16F1> <16F1> <E5B3>
+<16F2> <16F2> <E5AE>
+<16F3> <16F6> <E5B5>
+<16F7> <16F7> <E5BA>
+<16F8> <16FE> <E5BD>
+<16FF> <16FF> <E5C5>
+<1700> <1707> <E5C6>
+<1708> <1708> <E5CF>
+<1709> <1709> <E5D1>
+<170A> <170C> <E5D3>
+<170D> <172F> <E5D7>
+<1730> <1730> <E5FD>
+<1731> <1732> <E6A2>
+<1733> <1734> <E6A5>
+<1735> <1739> <E6A8>
+<173A> <173A> <E6AE>
+<173B> <173B> <E6B2>
+<173C> <173E> <E6B4>
+<173F> <1741> <E6B9>
+<1742> <1748> <E6BD>
+<1749> <1749> <E6C5>
+<174A> <174B> <E6C8>
+<174C> <1752> <E6CB>
+<1753> <1755> <E6D3>
+<1756> <1757> <E6D7>
+<1758> <1759> <E6DA>
+<175A> <175B> <E6DD>
+<175C> <175C> <E6E0>
+<175D> <175E> <E6E2>
+<175F> <175F> <E6E7>
+<1760> <1760> <E6E9>
+<1761> <1762> <E6ED>
+<1763> <1763> <E6F0>
+<1764> <1765> <E6F3>
+<1766> <1766> <E6F8>
+<1767> <176B> <E6FA>
+<176C> <176F> <E7A2>
+<1770> <1770> <E7A7>
+<1771> <1771> <E0F1>
+<1772> <1772> <E7AB>
+<1773> <1774> <E7AE>
+<1775> <1782> <E7B1>
+<1783> <1783> <E7C0>
+<1784> <1787> <E7C2>
+<1788> <178A> <E7C8>
+<178B> <178B> <E7CC>
+<178C> <178C> <E7CE>
+<178D> <178E> <E7D1>
+<178F> <1799> <E7D4>
+<179A> <179D> <E7E0>
+<179E> <179E> <E7E5>
+<179F> <17AE> <E7E7>
+<17AF> <17B5> <E7F8>
+<17B6> <17FB> <E8A1>
+<17FC> <17FF> <E8E9>
+<1800> <1802> <E8ED>
+<1803> <1807> <E8F2>
+<1808> <1808> <E8F8>
+<1809> <1809> <E8FA>
+<180A> <180B> <E8FC>
+<180C> <1811> <E9A1>
+<1812> <1815> <E9A8>
+<1816> <1834> <E9AD>
+<1835> <185E> <E9CD>
+<185F> <1865> <E9F8>
+<1866> <1885> <EAA1>
+<1886> <18A8> <EAC2>
+<18A9> <18B6> <EAE6>
+<18B7> <18B8> <EAF5>
+<18B9> <18BC> <EAF8>
+<18BD> <18BD> <EAFD>
+endbfrange
+100 beginbfrange
+<18BE> <18C0> <EBA1>
+<18C1> <18C2> <EBA5>
+<18C3> <18C3> <EBA8>
+<18C4> <18D2> <EBAB>
+<18D3> <18D3> <EBBC>
+<18D4> <18D6> <EBBE>
+<18D7> <18D9> <EBC3>
+<18DA> <18DD> <EBC8>
+<18DE> <18DF> <EBCD>
+<18E0> <18E4> <EBD3>
+<18E5> <18FF> <EBD9>
+<1900> <190A> <EBF4>
+<190B> <190F> <ECA1>
+<1910> <1911> <ECA8>
+<1912> <1915> <ECAB>
+<1916> <1917> <ECB3>
+<1918> <1918> <D7E4>
+<1919> <1919> <ECB7>
+<191A> <191A> <ECB9>
+<191B> <191F> <ECBB>
+<1920> <1922> <ECC2>
+<1923> <1924> <ECC7>
+<1925> <192E> <ECCB>
+<192F> <192F> <E6EC>
+<1930> <1935> <ECD7>
+<1936> <1937> <ECDF>
+<1938> <1939> <ECE2>
+<193A> <193B> <ECE5>
+<193C> <1949> <ECE9>
+<194A> <194A> <ECF9>
+<194B> <194E> <ECFB>
+<194F> <1998> <EDA4>
+<1999> <19A8> <EDEF>
+<19A9> <19E2> <EEA1>
+<19E3> <19FF> <EEDC>
+<1A00> <1A05> <EEF9>
+<1A06> <1A63> <EFA1>
+<1A64> <1AC1> <F0A1>
+<1AC2> <1AFF> <F1A1>
+<1B00> <1B1F> <F1DF>
+<1B20> <1B3B> <F2A1>
+<1B3C> <1B60> <F2BE>
+<1B61> <1B61> <E3F5>
+<1B62> <1B77> <F2E4>
+<1B78> <1B7B> <F2FB>
+<1B7C> <1B8B> <F3A1>
+<1B8C> <1B8C> <F3B2>
+<1B8D> <1B8D> <CBE7>
+<1B8E> <1BAA> <F3B4>
+<1BAB> <1BAB> <DFB3>
+<1BAC> <1BD8> <F3D2>
+<1BD9> <1BDE> <F4A1>
+<1BDF> <1BFF> <F4A8>
+<1C00> <1C24> <F4C9>
+<1C25> <1C34> <F4EF>
+<1C35> <1C92> <F5A1>
+<1C93> <1CC9> <F6A1>
+<1CCA> <1CCA> <E4A1>
+<1CCB> <1CE5> <F6D9>
+<1CE6> <1CE6> <F6F5>
+<1CE7> <1CEE> <F6F7>
+<1CEF> <1CFF> <F7A1>
+<1D00> <1D05> <F7B2>
+<1D06> <1D14> <F7B9>
+<1D15> <1D1E> <F7C9>
+<1D1F> <1D49> <F7D4>
+<1D4A> <1D5D> <F8A1>
+<1D5E> <1D5E> <DCA5>
+<1D5F> <1D83> <F8B6>
+<1D84> <1D93> <F8DC>
+<1D94> <1D94> <F8DB>
+<1D95> <1D97> <F8ED>
+<1D98> <1DA5> <F8F1>
+<1DA6> <1DB6> <F9A1>
+<1DB7> <1DB7> <DDF4>
+<1DB8> <1DFF> <F9B3>
+<1E00> <1E03> <F9FB>
+<1E04> <1E1C> <FAA3>
+<1E1D> <1E1D> <FAA1>
+<1E1E> <1E46> <FABD>
+<1E47> <1E5E> <FAE7>
+<1E5F> <1E66> <FBA1>
+<1E67> <1E67> <E7C1>
+<1E68> <1EBC> <FBAA>
+<1EBD> <1EC4> <FCA1>
+<1EC5> <1EDB> <FCAA>
+<1EDC> <1EDC> <CDE8>
+<1EDD> <1EFF> <FCC2>
+<1F00> <1F19> <FCE5>
+<1F1A> <1F33> <FDA1>
+<1F34> <1F34> <E9F7>
+<1F35> <1F77> <FDBC>
+<1F78> <1F79> <A1A2>
+<1F7A> <1F7A> <A1A5>
+<1F7B> <1F7D> <A1A9>
+<1F7E> <1F7E> <A1AD>
+<1F7F> <1F8A> <A1B2>
+<1F8B> <1F8B> <A1EB>
+<1F8C> <1F8C> <A3A1>
+<1F8D> <1F8E> <A3A8>
+endbfrange
+100 beginbfrange
+<1F8F> <1F8F> <A3AC>
+<1F90> <1F90> <A3AE>
+<1F91> <1F96> <A3BA>
+<1F97> <1F97> <A3DB>
+<1F98> <1F98> <A3DD>
+<1F99> <1F99> <A3DF>
+<1F9A> <1F9D> <A3FB>
+<1F9E> <1FFC> <20>
+<2080> <2080> <A1A6>
+<2475> <248E> <8141>
+<248F> <24A8> <8161>
+<24A9> <24FF> <8181>
+<2500> <2526> <81D8>
+<2527> <2540> <8241>
+<2541> <255A> <8261>
+<255B> <25D8> <8281>
+<25D9> <25F2> <8341>
+<25F3> <25FF> <8361>
+<2600> <260C> <836E>
+<260D> <268A> <8381>
+<268B> <26A4> <8441>
+<26A5> <26BE> <8461>
+<26BF> <26FF> <8481>
+<2700> <273C> <84C2>
+<273D> <2756> <8541>
+<2757> <2770> <8561>
+<2771> <27EE> <8581>
+<27EF> <27FF> <8641>
+<2800> <2808> <8652>
+<2809> <2822> <8661>
+<2823> <28A0> <8681>
+<28A1> <28BA> <8741>
+<28BB> <28D4> <8761>
+<28D5> <28FF> <8781>
+<2900> <2952> <87AC>
+<2953> <296C> <8841>
+<296D> <2986> <8861>
+<2987> <29FF> <8881>
+<2A00> <2A04> <88FA>
+<2A05> <2A1E> <8941>
+<2A1F> <2A38> <8961>
+<2A39> <2AB6> <8981>
+<2AB7> <2AD0> <8A41>
+<2AD1> <2AEA> <8A61>
+<2AEB> <2AFF> <8A81>
+<2B00> <2B68> <8A96>
+<2B69> <2B82> <8B41>
+<2B83> <2B9C> <8B61>
+<2B9D> <2BFF> <8B81>
+<2C00> <2C1A> <8BE4>
+<2C1B> <2C34> <8C41>
+<2C35> <2C4E> <8C61>
+<2C4F> <2CCC> <8C81>
+<2CCD> <2CE6> <8D41>
+<2CE7> <2CFF> <8D61>
+<2D00> <2D00> <8D7A>
+<2D01> <2D7E> <8D81>
+<2D7F> <2D98> <8E41>
+<2D99> <2DB2> <8E61>
+<2DB3> <2DFF> <8E81>
+<2E00> <2E30> <8ECE>
+<2E31> <2E4A> <8F41>
+<2E4B> <2E64> <8F61>
+<2E65> <2EE2> <8F81>
+<2EE3> <2EFC> <9041>
+<2EFD> <2EFF> <9061>
+<2F00> <2F16> <9064>
+<2F17> <2F94> <9081>
+<2F95> <2FAE> <9141>
+<2FAF> <2FC8> <9161>
+<2FC9> <2FFF> <9181>
+<3000> <3046> <91B8>
+<3047> <3060> <9241>
+<3061> <307A> <9261>
+<307B> <30F8> <9281>
+<30F9> <30FF> <9341>
+<3100> <3112> <9348>
+<3113> <312C> <9361>
+<312D> <31AA> <9381>
+<31AB> <31C4> <9441>
+<31C5> <31DE> <9461>
+<31DF> <31FF> <9481>
+<3200> <325C> <94A2>
+<325D> <3276> <9541>
+<3277> <3290> <9561>
+<3291> <32FF> <9581>
+<3300> <330E> <95F0>
+<330F> <3328> <9641>
+<3329> <3342> <9661>
+<3343> <33C0> <9681>
+<33C1> <33DA> <9741>
+<33DB> <33F4> <9761>
+<33F5> <33FF> <9781>
+<3400> <3472> <978C>
+<3473> <348C> <9841>
+<348D> <34A6> <9861>
+<34A7> <34FF> <9881>
+<3500> <3524> <98DA>
+<3525> <353E> <9941>
+<353F> <3558> <9961>
+endbfrange
+100 beginbfrange
+<3559> <35D6> <9981>
+<35D7> <35F0> <9A41>
+<35F1> <35FF> <9A61>
+<3600> <360A> <9A70>
+<360B> <3688> <9A81>
+<3689> <36A2> <9B41>
+<36A3> <36BC> <9B61>
+<36BD> <36FF> <9B81>
+<3700> <373A> <9BC4>
+<373B> <3754> <9C41>
+<3755> <376E> <9C61>
+<376F> <37EC> <9C81>
+<37ED> <37FF> <9D41>
+<3800> <3806> <9D54>
+<3807> <3820> <9D61>
+<3821> <389E> <9D81>
+<389F> <38B8> <9E41>
+<38B9> <38D2> <9E61>
+<38D3> <38FF> <9E81>
+<3900> <3950> <9EAE>
+<3951> <396A> <9F41>
+<396B> <3984> <9F61>
+<3985> <39FF> <9F81>
+<3A00> <3A02> <9FFC>
+<3A03> <3A1C> <A041>
+<3A1D> <3A36> <A061>
+<3A37> <3AB4> <A081>
+<3AB5> <3ACE> <A141>
+<3ACF> <3AE8> <A161>
+<3AE9> <3AFF> <A181>
+<3B00> <3B08> <A198>
+<3B09> <3B22> <A241>
+<3B23> <3B3C> <A261>
+<3B3D> <3B5C> <A281>
+<3B5D> <3B76> <A341>
+<3B77> <3B90> <A361>
+<3B91> <3BB0> <A381>
+<3BB1> <3BCA> <A441>
+<3BCB> <3BE4> <A461>
+<3BE5> <3BFF> <A481>
+<3C00> <3C04> <A49C>
+<3C05> <3C1E> <A541>
+<3C1F> <3C38> <A561>
+<3C39> <3C58> <A581>
+<3C59> <3C72> <A641>
+<3C73> <3C8C> <A661>
+<3C8D> <3CAC> <A681>
+<3CAD> <3CC6> <A741>
+<3CC7> <3CE0> <A761>
+<3CE1> <3CFF> <A781>
+<3D00> <3D00> <A7A0>
+<3D01> <3D1A> <A841>
+<3D1B> <3D34> <A861>
+<3D35> <3D54> <A881>
+<3D55> <3D6E> <A941>
+<3D6F> <3D88> <A961>
+<3D89> <3DA8> <A981>
+<3DA9> <3DC2> <AA41>
+<3DC3> <3DDC> <AA61>
+<3DDD> <3DFC> <AA81>
+<3DFD> <3DFF> <AB41>
+<3E00> <3E16> <AB44>
+<3E17> <3E30> <AB61>
+<3E31> <3E50> <AB81>
+<3E51> <3E6A> <AC41>
+<3E6B> <3E84> <AC61>
+<3E85> <3EA4> <AC81>
+<3EA5> <3EBE> <AD41>
+<3EBF> <3ED8> <AD61>
+<3ED9> <3EF8> <AD81>
+<3EF9> <3EFF> <AE41>
+<3F00> <3F12> <AE48>
+<3F13> <3F2C> <AE61>
+<3F2D> <3F4C> <AE81>
+<3F4D> <3F66> <AF41>
+<3F67> <3F80> <AF61>
+<3F81> <3FA0> <AF81>
+<3FA1> <3FBA> <B041>
+<3FBB> <3FD4> <B061>
+<3FD5> <3FF4> <B081>
+<3FF5> <3FFF> <B141>
+<4000> <400E> <B14C>
+<400F> <4028> <B161>
+<4029> <4048> <B181>
+<4049> <4062> <B241>
+<4063> <407C> <B261>
+<407D> <409C> <B281>
+<409D> <40B6> <B341>
+<40B7> <40D0> <B361>
+<40D1> <40F0> <B381>
+<40F1> <40FF> <B441>
+<4100> <410A> <B450>
+<410B> <4124> <B461>
+<4125> <4144> <B481>
+<4145> <415E> <B541>
+<415F> <4178> <B561>
+<4179> <4198> <B581>
+<4199> <41B2> <B641>
+<41B3> <41CC> <B661>
+<41CD> <41EC> <B681>
+endbfrange
+51 beginbfrange
+<41ED> <41FF> <B741>
+<4200> <4206> <B754>
+<4207> <4220> <B761>
+<4221> <4240> <B781>
+<4241> <425A> <B841>
+<425B> <4274> <B861>
+<4275> <4294> <B881>
+<4295> <42AE> <B941>
+<42AF> <42C8> <B961>
+<42C9> <42E8> <B981>
+<42E9> <42FF> <BA41>
+<4300> <4302> <BA58>
+<4303> <431C> <BA61>
+<431D> <433C> <BA81>
+<433D> <4356> <BB41>
+<4357> <4370> <BB61>
+<4371> <4390> <BB81>
+<4391> <43AA> <BC41>
+<43AB> <43C4> <BC61>
+<43C5> <43E4> <BC81>
+<43E5> <43FE> <BD41>
+<43FF> <43FF> <BD61>
+<4400> <4418> <BD62>
+<4419> <4438> <BD81>
+<4439> <4452> <BE41>
+<4453> <446C> <BE61>
+<446D> <448C> <BE81>
+<448D> <44A6> <BF41>
+<44A7> <44C0> <BF61>
+<44C1> <44E0> <BF81>
+<44E1> <44FA> <C041>
+<44FB> <44FF> <C061>
+<4500> <4514> <C066>
+<4515> <4534> <C081>
+<4535> <454E> <C141>
+<454F> <4568> <C161>
+<4569> <4588> <C181>
+<4589> <45A2> <C241>
+<45A3> <45BC> <C261>
+<45BD> <45DC> <C281>
+<45DD> <45F6> <C341>
+<45F7> <45FF> <C361>
+<4600> <4610> <C36A>
+<4611> <4630> <C381>
+<4631> <464A> <C441>
+<464B> <4664> <C461>
+<4665> <4684> <C481>
+<4685> <469E> <C541>
+<469F> <46B8> <C561>
+<46B9> <46D8> <C581>
+<46D9> <46EA> <C641>
+endbfrange
+
+endcmap
+CMapName currentdict /CMap defineresource pop
+end
+end
+
+%%EndResource
+%%EOF
diff --git a/src/main/resources/Resources/cmap/Adobe-Korea1-KSCpc-EUC b/src/main/resources/Resources/cmap/Adobe-Korea1-KSCpc-EUC
new file mode 100644
index 0000000..66f7cad
--- /dev/null
+++ b/src/main/resources/Resources/cmap/Adobe-Korea1-KSCpc-EUC
@@ -0,0 +1,529 @@
+%!PS-Adobe-3.0 Resource-CMap
+%%DocumentNeededResources: ProcSet (CIDInit)
+%%IncludeResource: ProcSet (CIDInit)
+%%BeginResource: CMap (Adobe-Korea1-KSCpc-EUC)
+%%Title: (Adobe-Korea1-KSCpc-EUC Adobe KSCpc-EUC 1)
+%%Version: 4.002
+%%Copyright: -----------------------------------------------------------
+%%Copyright: Copyright 1990-1999 Adobe Systems Incorporated.
+%%Copyright: All Rights Reserved.
+%%Copyright:
+%%Copyright: Patents Pending
+%%Copyright:
+%%Copyright: NOTICE: All information contained herein is the property
+%%Copyright: of Adobe Systems Incorporated.
+%%Copyright:
+%%Copyright: Permission is granted for redistribution of this file
+%%Copyright: provided this copyright notice is maintained intact and
+%%Copyright: that the contents of this file are not altered in any
+%%Copyright: way from its original form.
+%%Copyright:
+%%Copyright: PostScript and Display PostScript are trademarks of
+%%Copyright: Adobe Systems Incorporated which may be registered in
+%%Copyright: certain jurisdictions.
+%%Copyright: -----------------------------------------------------------
+%%EndComments
+
+/CIDInit /ProcSet findresource begin
+
+12 dict begin
+
+begincmap
+
+/CIDSystemInfo 3 dict dup begin
+/Registry (Adobe) def
+/Ordering (Adobe_Korea1_KSCpc_EUC) def
+/Supplement 1 def
+end def
+
+/CMapName /Adobe-Korea1-KSCpc-EUC def
+
+/CMapVersion 4.002 def
+/CMapType 1 def
+
+/XUID [1 10 25335 1212] def
+
+/WMode 0 def
+
+1 begincodespacerange
+<0000> <FFFF>
+endcodespacerange
+
+1 beginbfrange
+<0000> <0000> <20>
+endbfrange
+
+% Adobe-Korea1
+% KSCpc-EUC (Macintosh)
+100 beginbfrange
+<0001> <005F> <20>
+<0060> <0062> <81>
+<0063> <0064> <FE>
+<0065> <0065> <A1A1>
+<0068> <00C2> <A1A4>
+<00C3> <00FF> <A2A1>
+<0100> <0107> <A2DE>
+<0108> <0165> <A3A1>
+<0166> <0198> <A4A1>
+<0199> <01C2> <A4D5>
+<01C3> <01CC> <A5A1>
+<01CD> <01D6> <A5B0>
+<01D7> <01EE> <A5C1>
+<01EF> <01FF> <A5E1>
+<0200> <0206> <A5F2>
+<0207> <024A> <A6A1>
+<024B> <0299> <A7A1>
+<029A> <029D> <A8A1>
+<029E> <029E> <A8A6>
+<029F> <02A6> <A8A8>
+<02A7> <02F4> <A8B1>
+<02F5> <02FF> <A9A1>
+<0300> <0352> <A9AC>
+<0353> <03A5> <AAA1>
+<03A6> <03FB> <ABA1>
+<03FC> <03FF> <ACA1>
+<0400> <041C> <ACA5>
+<041D> <043D> <ACD1>
+<043E> <049B> <B0A1>
+<049C> <04F9> <B1A1>
+<04FA> <04FF> <B2A1>
+<0500> <0557> <B2A7>
+<0558> <05B5> <B3A1>
+<05B6> <05FF> <B4A1>
+<0600> <0613> <B4EB>
+<0614> <0671> <B5A1>
+<0672> <06CF> <B6A1>
+<06D0> <06FF> <B7A1>
+<0700> <072D> <B7D1>
+<072E> <078B> <B8A1>
+<078C> <07E9> <B9A1>
+<07EA> <07FF> <BAA1>
+<0800> <0847> <BAB7>
+<0848> <08A5> <BBA1>
+<08A6> <08FF> <BCA1>
+<0900> <0903> <BCFB>
+<0904> <0961> <BDA1>
+<0962> <09BF> <BEA1>
+<09C0> <09FF> <BFA1>
+<0A00> <0A1D> <BFE1>
+<0A1E> <0A7B> <C0A1>
+<0A7C> <0AD9> <C1A1>
+<0ADA> <0AFF> <C2A1>
+<0B00> <0B37> <C2C7>
+<0B38> <0B95> <C3A1>
+<0B96> <0BF3> <C4A1>
+<0BF4> <0BFF> <C5A1>
+<0C00> <0C51> <C5AD>
+<0C52> <0CAF> <C6A1>
+<0CB0> <0CFF> <C7A1>
+<0D00> <0D0D> <C7F1>
+<0D0E> <0D6B> <C8A1>
+<0D6C> <0DC9> <CAA1>
+<0DCA> <0DF8> <CBA1>
+<0DF9> <0DFD> <CBD1>
+<0DFE> <0DFF> <CBD7>
+<0E00> <0E0D> <CBD9>
+<0E0E> <0E24> <CBE8>
+<0E25> <0E5D> <CCA1>
+<0E5E> <0E5E> <CBD6>
+<0E5F> <0E82> <CCDB>
+<0E83> <0EB0> <CDA1>
+<0EB1> <0EC8> <CDD0>
+<0EC9> <0EDE> <CDE9>
+<0EDF> <0EEA> <CEA1>
+<0EEB> <0EFF> <CEAE>
+<0F00> <0F3B> <CEC3>
+<0F3C> <0F95> <CFA1>
+<0F96> <0F98> <CFFC>
+<0F99> <0F99> <D0A1>
+<0F9A> <0FAE> <D0A3>
+<0FAF> <0FC5> <D0B9>
+<0FC6> <0FD1> <D0D1>
+<0FD2> <0FF2> <D0DE>
+<0FF3> <0FFF> <D1A1>
+<1000> <1013> <D1AE>
+<1014> <1014> <CBD0>
+<1015> <1022> <D1C3>
+<1023> <1023> <D0DD>
+<1024> <1025> <D1D2>
+<1026> <1027> <D1D6>
+<1028> <1029> <D1D9>
+<102A> <102A> <D1E1>
+<102B> <102B> <D1E7>
+<102C> <102C> <D1EC>
+<102D> <102D> <D1EE>
+<102E> <102E> <D1F1>
+<102F> <1031> <D1F3>
+<1032> <1034> <D1F7>
+<1035> <1035> <D1FB>
+endbfrange
+100 beginbfrange
+<1036> <1036> <D2A1>
+<1037> <1039> <D2A4>
+<103A> <103A> <D2AC>
+<103B> <103B> <D2AE>
+<103C> <103C> <D1D5>
+<103D> <103E> <D2B0>
+<103F> <1049> <D2B3>
+<104A> <104C> <D2BF>
+<104D> <104D> <D2C5>
+<104E> <104E> <D2CC>
+<104F> <104F> <D2D8>
+<1050> <1052> <D2DB>
+<1053> <1053> <D2E0>
+<1054> <1054> <D2E3>
+<1055> <1058> <D2EC>
+<1059> <1059> <D2F6>
+<105A> <105F> <D2F9>
+<1060> <10BD> <D3A1>
+<10BE> <10FF> <D4A1>
+<1100> <1102> <D4E3>
+<1103> <1115> <D4E7>
+<1116> <1116> <D1D4>
+<1117> <1117> <D1D8>
+<1118> <111D> <D1DB>
+<111E> <1120> <D1E3>
+<1121> <1121> <D5A9>
+<1122> <1122> <D1E6>
+<1123> <1126> <D1E8>
+<1127> <1127> <D1ED>
+<1128> <1129> <D5B2>
+<112A> <112B> <D1EF>
+<112C> <112C> <D1F2>
+<112D> <112E> <D5B7>
+<112F> <112F> <D1F6>
+<1130> <1132> <D5BA>
+<1133> <1133> <D1FA>
+<1134> <1135> <D5BE>
+<1136> <1137> <D1FC>
+<1138> <1138> <D5C2>
+<1139> <1139> <D1FE>
+<113A> <113B> <D2A2>
+<113C> <113F> <D2A7>
+<1140> <1142> <D5CA>
+<1143> <1143> <D2AB>
+<1144> <1144> <D2AD>
+<1145> <1147> <D5CF>
+<1148> <1148> <D2B2>
+<1149> <1174> <D5D3>
+<1175> <118B> <D6A1>
+<118C> <119E> <D6B9>
+<119F> <119F> <D2BE>
+<11A0> <11A0> <D6CE>
+<11A1> <11A2> <D2C2>
+<11A3> <11A4> <D6D1>
+<11A5> <11A5> <D2C4>
+<11A6> <11AA> <D2C6>
+<11AB> <11AB> <D6D9>
+<11AC> <11AC> <D2CB>
+<11AD> <11AE> <D2CD>
+<11AF> <11AF> <D6DD>
+<11B0> <11B5> <D2CF>
+<11B6> <11B6> <D6E4>
+<11B7> <11B9> <D2D5>
+<11BA> <11BC> <D6E8>
+<11BD> <11BE> <D2D9>
+<11BF> <11C0> <D6ED>
+<11C1> <11C2> <D2DE>
+<11C3> <11C3> <D2E1>
+<11C4> <11C5> <D6F2>
+<11C6> <11C6> <D2E2>
+<11C7> <11D0> <D6F5>
+<11D1> <11D3> <D7A1>
+<11D4> <11D4> <D2E4>
+<11D5> <11D5> <D7A5>
+<11D6> <11D9> <D2E5>
+<11DA> <11DA> <D7AA>
+<11DB> <11DC> <D2E9>
+<11DD> <11DF> <D7AD>
+<11E0> <11E0> <D2EB>
+<11E1> <11FA> <D7B1>
+<11FB> <11FB> <D7CC>
+<11FC> <11FF> <D2F0>
+<1200> <1200> <D7D1>
+<1201> <1202> <D2F4>
+<1203> <1204> <D2F7>
+<1205> <1212> <D7D6>
+<1213> <122C> <D7E5>
+<122D> <128A> <D8A1>
+<128B> <12E8> <D9A1>
+<12E9> <12FF> <DAA1>
+<1300> <1346> <DAB8>
+<1347> <136A> <DBA1>
+<136B> <1388> <DBC6>
+<1389> <13A2> <DBE5>
+<13A3> <13A6> <DCA1>
+<13A7> <13FF> <DCA6>
+<1400> <1403> <DDA1>
+<1404> <141E> <DDA6>
+<141F> <141F> <DBC5>
+<1420> <1432> <DDC2>
+endbfrange
+100 beginbfrange
+<1433> <1450> <DDD6>
+<1451> <145A> <DDF5>
+<145B> <14B5> <DEA1>
+<14B6> <14B6> <DEFD>
+<14B7> <14C8> <DFA1>
+<14C9> <14F5> <DFB4>
+<14F6> <14F6> <DFE2>
+<14F7> <14F7> <DEFE>
+<14F8> <14FB> <DFE4>
+<14FC> <14FF> <DFE9>
+<1500> <1511> <DFED>
+<1512> <1561> <E0A1>
+<1562> <156C> <E0F2>
+<156D> <156D> <DFE8>
+<156E> <156E> <E0FE>
+<156F> <157A> <E1A1>
+<157B> <15AF> <E1AE>
+<15B0> <15B0> <D7CB>
+<15B1> <15B9> <E1E4>
+<15BA> <15CA> <E1EE>
+<15CB> <15CF> <E2A1>
+<15D0> <15D0> <DEFC>
+<15D1> <15FF> <E2A7>
+<1600> <1628> <E2D6>
+<1629> <167C> <E3A1>
+<167D> <1685> <E3F6>
+<1686> <168C> <E4A2>
+<168D> <16A7> <E4AA>
+<16A8> <16A8> <D1E2>
+<16A9> <16E1> <E4C6>
+<16E2> <16EE> <E5A1>
+<16EF> <16F0> <E5AF>
+<16F1> <16F1> <E5B3>
+<16F2> <16F2> <E5AE>
+<16F3> <16F6> <E5B5>
+<16F7> <16F7> <E5BA>
+<16F8> <16FE> <E5BD>
+<16FF> <16FF> <E5C5>
+<1700> <1707> <E5C6>
+<1708> <1708> <E5CF>
+<1709> <1709> <E5D1>
+<170A> <170C> <E5D3>
+<170D> <172F> <E5D7>
+<1730> <1730> <E5FD>
+<1731> <1732> <E6A2>
+<1733> <1734> <E6A5>
+<1735> <1739> <E6A8>
+<173A> <173A> <E6AE>
+<173B> <173B> <E6B2>
+<173C> <173E> <E6B4>
+<173F> <1741> <E6B9>
+<1742> <1748> <E6BD>
+<1749> <1749> <E6C5>
+<174A> <174B> <E6C8>
+<174C> <1752> <E6CB>
+<1753> <1755> <E6D3>
+<1756> <1757> <E6D7>
+<1758> <1759> <E6DA>
+<175A> <175B> <E6DD>
+<175C> <175C> <E6E0>
+<175D> <175E> <E6E2>
+<175F> <175F> <E6E7>
+<1760> <1760> <E6E9>
+<1761> <1762> <E6ED>
+<1763> <1763> <E6F0>
+<1764> <1765> <E6F3>
+<1766> <1766> <E6F8>
+<1767> <176B> <E6FA>
+<176C> <176F> <E7A2>
+<1770> <1770> <E7A7>
+<1771> <1771> <E0F1>
+<1772> <1772> <E7AB>
+<1773> <1774> <E7AE>
+<1775> <1782> <E7B1>
+<1783> <1783> <E7C0>
+<1784> <1787> <E7C2>
+<1788> <178A> <E7C8>
+<178B> <178B> <E7CC>
+<178C> <178C> <E7CE>
+<178D> <178E> <E7D1>
+<178F> <1799> <E7D4>
+<179A> <179D> <E7E0>
+<179E> <179E> <E7E5>
+<179F> <17AE> <E7E7>
+<17AF> <17B5> <E7F8>
+<17B6> <17FB> <E8A1>
+<17FC> <17FF> <E8E9>
+<1800> <1802> <E8ED>
+<1803> <1807> <E8F2>
+<1808> <1808> <E8F8>
+<1809> <1809> <E8FA>
+<180A> <180B> <E8FC>
+<180C> <1811> <E9A1>
+<1812> <1815> <E9A8>
+<1816> <1834> <E9AD>
+<1835> <185E> <E9CD>
+<185F> <1865> <E9F8>
+<1866> <1885> <EAA1>
+<1886> <18A8> <EAC2>
+<18A9> <18B6> <EAE6>
+endbfrange
+100 beginbfrange
+<18B7> <18B8> <EAF5>
+<18B9> <18BC> <EAF8>
+<18BD> <18BD> <EAFD>
+<18BE> <18C0> <EBA1>
+<18C1> <18C2> <EBA5>
+<18C3> <18C3> <EBA8>
+<18C4> <18D2> <EBAB>
+<18D3> <18D3> <EBBC>
+<18D4> <18D6> <EBBE>
+<18D7> <18D9> <EBC3>
+<18DA> <18DD> <EBC8>
+<18DE> <18DF> <EBCD>
+<18E0> <18E4> <EBD3>
+<18E5> <18FF> <EBD9>
+<1900> <190A> <EBF4>
+<190B> <190F> <ECA1>
+<1910> <1911> <ECA8>
+<1912> <1915> <ECAB>
+<1916> <1917> <ECB3>
+<1918> <1918> <D7E4>
+<1919> <1919> <ECB7>
+<191A> <191A> <ECB9>
+<191B> <191F> <ECBB>
+<1920> <1922> <ECC2>
+<1923> <1924> <ECC7>
+<1925> <192E> <ECCB>
+<192F> <192F> <E6EC>
+<1930> <1935> <ECD7>
+<1936> <1937> <ECDF>
+<1938> <1939> <ECE2>
+<193A> <193B> <ECE5>
+<193C> <1949> <ECE9>
+<194A> <194A> <ECF9>
+<194B> <194E> <ECFB>
+<194F> <1998> <EDA4>
+<1999> <19A8> <EDEF>
+<19A9> <19E2> <EEA1>
+<19E3> <19FF> <EEDC>
+<1A00> <1A05> <EEF9>
+<1A06> <1A63> <EFA1>
+<1A64> <1AC1> <F0A1>
+<1AC2> <1AFF> <F1A1>
+<1B00> <1B1F> <F1DF>
+<1B20> <1B3B> <F2A1>
+<1B3C> <1B60> <F2BE>
+<1B61> <1B61> <E3F5>
+<1B62> <1B77> <F2E4>
+<1B78> <1B7B> <F2FB>
+<1B7C> <1B8B> <F3A1>
+<1B8C> <1B8C> <F3B2>
+<1B8D> <1B8D> <CBE7>
+<1B8E> <1BAA> <F3B4>
+<1BAB> <1BAB> <DFB3>
+<1BAC> <1BD8> <F3D2>
+<1BD9> <1BDE> <F4A1>
+<1BDF> <1BFF> <F4A8>
+<1C00> <1C24> <F4C9>
+<1C25> <1C34> <F4EF>
+<1C35> <1C92> <F5A1>
+<1C93> <1CC9> <F6A1>
+<1CCA> <1CCA> <E4A1>
+<1CCB> <1CE5> <F6D9>
+<1CE6> <1CE6> <F6F5>
+<1CE7> <1CEE> <F6F7>
+<1CEF> <1CFF> <F7A1>
+<1D00> <1D05> <F7B2>
+<1D06> <1D14> <F7B9>
+<1D15> <1D1E> <F7C9>
+<1D1F> <1D49> <F7D4>
+<1D4A> <1D5D> <F8A1>
+<1D5E> <1D5E> <DCA5>
+<1D5F> <1D83> <F8B6>
+<1D84> <1D93> <F8DC>
+<1D94> <1D94> <F8DB>
+<1D95> <1D97> <F8ED>
+<1D98> <1DA5> <F8F1>
+<1DA6> <1DB6> <F9A1>
+<1DB7> <1DB7> <DDF4>
+<1DB8> <1DFF> <F9B3>
+<1E00> <1E03> <F9FB>
+<1E04> <1E1C> <FAA3>
+<1E1D> <1E1D> <FAA1>
+<1E1E> <1E46> <FABD>
+<1E47> <1E5E> <FAE7>
+<1E5F> <1E66> <FBA1>
+<1E67> <1E67> <E7C1>
+<1E68> <1EBC> <FBAA>
+<1EBD> <1EC4> <FCA1>
+<1EC5> <1EDB> <FCAA>
+<1EDC> <1EDC> <CDE8>
+<1EDD> <1EFF> <FCC2>
+<1F00> <1F19> <FCE5>
+<1F1A> <1F33> <FDA1>
+<1F34> <1F34> <E9F7>
+<1F35> <1F77> <FDBC>
+<1F78> <1F79> <A1A2>
+<1F7A> <1F7A> <A1A5>
+<1F7B> <1F7D> <A1A9>
+<1F7E> <1F7E> <A1AD>
+<1F7F> <1F8A> <A1B2>
+endbfrange
+54 beginbfrange
+<1F8B> <1F8B> <A1EB>
+<1F8C> <1F8C> <A3A1>
+<1F8D> <1F8E> <A3A8>
+<1F8F> <1F8F> <A3AC>
+<1F90> <1F90> <A3AE>
+<1F91> <1F96> <A3BA>
+<1F97> <1F97> <A3DB>
+<1F98> <1F98> <A3DD>
+<1F99> <1F99> <A3DF>
+<1F9A> <1F9D> <A3FB>
+<1FFF> <1FFF> <A141>
+<2000> <203B> <A142>
+<203C> <2055> <A181>
+<2056> <205A> <A19C>
+<205B> <205C> <A1A2>
+<205D> <2068> <A241>
+<2069> <2081> <A2E6>
+<2082> <20BE> <A341>
+<20BF> <20DD> <A381>
+<20DE> <20FF> <A441>
+<2100> <211A> <A463>
+<211B> <2139> <A481>
+<213A> <2176> <A541>
+<2177> <2181> <A581>
+<2182> <2186> <A5DA>
+<2187> <218A> <A5F9>
+<218B> <21C7> <A641>
+<21C8> <21D1> <A681>
+<21D2> <21D8> <A68D>
+<21D9> <21DE> <A696>
+<21DF> <21E0> <A69E>
+<21E1> <21FA> <A6E5>
+<21FB> <21FF> <A741>
+<2200> <2237> <A746>
+<2238> <2256> <A781>
+<2257> <2265> <A7F0>
+<2266> <22A2> <A841>
+<22A3> <22C1> <A881>
+<22C2> <22F5> <A941>
+<22F6> <22FF> <AA41>
+<2300> <2332> <AA4B>
+<2333> <2351> <AA81>
+<2352> <235C> <AAF4>
+<235D> <2399> <AB41>
+<239A> <23B8> <AB81>
+<23B9> <23BC> <ABF7>
+<23BD> <23F9> <AC41>
+<23FA> <23FF> <AC81>
+<2400> <2410> <AC87>
+<2411> <241F> <ACC2>
+<2420> <2424> <ACF2>
+<2425> <2461> <AD41>
+<2462> <2471> <ADA1>
+<2472> <2474> <ABFB>
+endbfrange
+
+endcmap
+CMapName currentdict /CMap defineresource pop
+end
+end
+
+%%EndResource
+%%EOF
diff --git a/src/main/resources/Resources/cmap/Adobe-Korea1-UCS2 b/src/main/resources/Resources/cmap/Adobe-Korea1-UCS2
new file mode 100644
index 0000000..cf15d61
--- /dev/null
+++ b/src/main/resources/Resources/cmap/Adobe-Korea1-UCS2
@@ -0,0 +1 @@
+%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%IncludeResource: ProcSet (CIDInit) %%BeginResource: CMap (Adobe-Korea1-UCS2) %%Title: (Adobe-Korea1-UCS2 Adobe Korea1 2) %%Version: 5.000 %%Copyright: ----------------------------------------------------------- %%Copyright: Copyright 1990-2000 Adobe Systems Incorporated. %%Copyright: All Rights Reserved. %%Copyright: %%Copyright: Patents Pending %%Copyright: %%Copyright: NOTICE: All information contained herein is the property %%Copyright: of Adobe Systems Incorporated. %%Copyright: %%Copyright: Permission is granted for redistribution of this file %%Copyright: provided this copyright notice is maintained intact and %%Copyright: that the contents of this file are not altered in any %%Copyright: way from its original form. %%Copyright: %%Copyright: PostScript and Display PostScript are trademarks of %%Copyright: Adobe Systems Incorporated which may be registered in %%Copyright: certain jurisdictions. %%Copyright: ----------------------------------------------------------- %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo 3 dict dup begin /Registry (Adobe) def /Ordering (Adobe_Korea1_UCS2) def /Supplement 2 def end def /CMapName /Adobe-Korea1-UCS2 def /CMapVersion 5.000 def /CMapType 1 def /XUID [1 10 25335 1212] def /WMode 0 def 1 begincodespacerange <0000> <FFFF> endcodespacerange 100 beginbfchar <0000> <FFFD> <0060> <20A9> <0061> <2010> <0062> <00A9> <0063> <2122> <0064> <22EF> <0068> <00B7> <006B> <00A8> <006C> <3003> <006F> <2016> <0070> <FF3C> <0071> <223C> <0082> <00B1> <0083> <00D7> <0084> <00F7> <0085> <2260> <0088> <221E> <0089> <2234> <008A> <00B0> <008D> <2103> <008E> <212B> <0091> <FFE5> <0092> <2642> <0093> <2640> <0094> <2220> <0095> <22A5> <0096> <2312> <0097> <2202> <0098> <2207> <0099> <2261> <009A> <2252> <009B> <00A7> <009C> <203B> <009D> <2606> <009E> <2605> <009F> <25CB> <00A0> <25CF> <00A1> <25CE> <00A2> <25C7> <00A3> <25C6> <00A4> <25A1> <00A5> <25A0> <00A6> <25B3> <00A7> <25B2> <00A8> <25BD> <00A9> <25BC> <00AA> <2192> <00AF> <3013> <00B2> <221A> <00B3> <223D> <00B4> <221D> <00B5> <2235> <00B8> <2208> <00B9> <220B> <00BE> <222A> <00BF> <2229> <00C2> <FFE2> <00C3> <21D2> <00C4> <21D4> <00C5> <2200> <00C6> <2203> <00C7> <00B4> <00C8> <02DC> <00C9> <02C7> <00CA> <02D8> <00CB> <02DD> <00CC> <02DA> <00CD> <02D9> <00CE> <00B8> <00CF> <02DB> <00D0> <00A1> <00D1> <00BF> <00D2> <2236> <00D3> <222E> <00D4> <2211> <00D5> <220F> <00D6> <00A4> <00D7> <2109> <00D8> <2030> <00D9> <25C1> <00DA> <25C0> <00DB> <25B7> <00DC> <25B6> <00DD> <2664> <00E0> <2665> <00E1> <2667> <00E2> <2663> <00E3> <2299> <00E4> <25C8> <00E5> <25A3> <00E8> <2592> <00EB> <25A8> <00EC> <25A7> <00ED> <25A6> <00EE> <25A9> <00EF> <2668> <00F0> <260F> <00F1> <260E> <00F2> <261C> <00F3> <261E> endbfchar 100 beginbfchar <00F4> <00B6> <00F7> <2195> <00F8> <2197> <00F9> <2199> <00FA> <2196> <00FB> <2198> <00FC> <266D> <00FF> <266C> <0100> <327F> <0101> <321C> <0102> <2116> <0103> <33C7> <0104> <2122> <0105> <33C2> <0106> <33D8> <0107> <2121> <0143> <FFE6> <0165> <FFE3> <0207> <2500> <0208> <2502> <0209> <250C> <020A> <2510> <020B> <2518> <020C> <2514> <020D> <251C> <020E> <252C> <020F> <2524> <0210> <2534> <0211> <253C> <0212> <2501> <0213> <2503> <0214> <250F> <0215> <2513> <0216> <251B> <0217> <2517> <0218> <2523> <0219> <2533> <021A> <252B> <021B> <253B> <021C> <254B> <021D> <2520> <021E> <252F> <021F> <2528> <0220> <2537> <0221> <253F> <0222> <251D> <0223> <2530> <0224> <2525> <0225> <2538> <0226> <2542> <0227> <2512> <0228> <2511> <0229> <251A> <022A> <2519> <022B> <2516> <022C> <2515> <022D> <250E> <022E> <250D> <024E> <2113> <024F> <3398> <0250> <33C4> <025F> <33CA> <0263> <33CF> <0266> <33C8> <0283> <2126> <0289> <33D6> <028A> <33C5> <028E> <33DB> <0293> <33DD> <0294> <33D0> <0295> <33D3> <0296> <33C3> <0297> <33C9> <0298> <33DC> <0299> <33C6> <029A> <00C6> <029B> <00D0> <029C> <00AA> <029D> <0126> <029E> <0132> <029F> <013F> <02A0> <0141> <02A1> <00D8> <02A2> <0152> <02A3> <00BA> <02A4> <00DE> <02A5> <0166> <02A6> <014A> <02EC> <00BD> <02EF> <00BC> <02F0> <00BE> <02F5> <00E6> <02F6> <0111> <02F7> <00F0> <02F8> <0127> <02F9> <0131> <02FA> <0133> <02FB> <0138> <02FC> <0140> <02FD> <0142> endbfchar 100 beginbfchar <02FE> <00F8> <02FF> <0153> <0300> <00DF> <0301> <00FE> <0302> <0167> <0303> <014B> <0304> <0149> <034A> <00B9> <034D> <2074> <034E> <207F> <0402> <0401> <0423> <0451> <0440> <AC04> <0452> <AC20> <0453> <AC24> <045B> <AC3C> <045C> <AC40> <045D> <AC4B> <045E> <AC4D> <045F> <AC54> <0460> <AC58> <0461> <AC5C> <0464> <AC74> <0467> <AC7A> <0472> <AC90> <0473> <AC94> <047C> <ACAC> <0484> <ACC1> <0485> <ACC4> <0486> <ACC8> <0487> <ACCC> <0488> <ACD5> <0489> <ACD7> <048C> <ACE4> <048F> <ACEA> <0490> <ACEC> <0494> <ACF3> <0499> <AD00> <049A> <AD04> <049B> <AD06> <049E> <AD0F> <049F> <AD11> <04A0> <AD18> <04A1> <AD1C> <04A2> <AD20> <04A3> <AD29> <04A8> <AD38> <04A9> <AD3C> <04AC> <AD47> <04AD> <AD49> <04AE> <AD50> <04AF> <AD54> <04B0> <AD58> <04B1> <AD61> <04B2> <AD63> <04B5> <AD70> <04BD> <AD7F> <04C2> <AD8C> <04C3> <AD90> <04C6> <ADA4> <04C7> <ADB7> <04CA> <ADC4> <04CB> <ADC8> <04CE> <ADD3> <04CF> <ADDC> <04D0> <ADE0> <04D1> <ADE4> <04D4> <ADFC> <04DA> <AE0B> <04DB> <AE0D> <04DC> <AE14> <04DF> <AE34> <04E2> <AE3A> <04E5> <AE43> <04E8> <AE4A> <04EC> <AE50> <04ED> <AE54> <04EE> <AE56> <04F4> <AE65> <04F7> <AE6C> <04F8> <AE70> <0500> <AE8C> <0504> <AEC0> <0505> <AEC4> <050D> <AEDC> <050E> <AEE8> <050F> <AEEB> <0510> <AEED> <0511> <AEF4> <0512> <AEF8> <0513> <AEFC> <0516> <AF0D> <0517> <AF10> <051A> <AF30> <051B> <AF32> <051C> <AF34> <051F> <AF3F> <0525> <AF50> <052A> <AF79> <052B> <AF80> endbfchar 100 beginbfchar <052C> <AF84> <052D> <AF88> <0530> <AF95> <0531> <AF9C> <0534> <AFBC> <0535> <AFC0> <0539> <AFCB> <053C> <AFD4> <053D> <AFDC> <0542> <AFF4> <0543> <AFF8> <0546> <B004> <0547> <B00C> <0548> <B010> <0549> <B014> <054C> <B028> <054F> <B048> <0550> <B04A> <0551> <B04C> <0552> <B04E> <0556> <B057> <0557> <B059> <0558> <B05D> <055B> <B080> <055C> <B084> <055F> <B08F> <0560> <B091> <0564> <B09C> <0570> <B0B1> <0574> <B0B8> <0575> <B0BC> <057D> <B0D4> <057E> <B0D8> <057F> <B0E0> <0580> <B0E5> <0585> <B110> <0590> <B128> <0591> <B12C> <0599> <B144> <059A> <B148> <059F> <B158> <05A0> <B15C> <05A1> <B160> <05A4> <B17C> <05A5> <B180> <05A6> <B182> <05A9> <B18B> <05AA> <B18D> <05AE> <B198> <05AF> <B19C> <05B0> <B1A8> <05B1> <B1CC> <05B2> <B1D0> <05B3> <B1D4> <05B6> <B1DF> <05B9> <B1EC> <05BA> <B1F0> <05BB> <B1F9> <05BC> <B1FB> <05BD> <B1FD> <05C0> <B208> <05C5> <B217> <05C6> <B219> <05C7> <B220> <05C8> <B234> <05C9> <B23C> <05CA> <B258> <05CB> <B25C> <05CC> <B260> <05D1> <B27C> <05D4> <B289> <05D7> <B294> <05DD> <B2A3> <05E0> <B2AA> <05E1> <B2AC> <05E2> <B2B0> <05E3> <B2B4> <05E6> <B2CC> <05E7> <B2D0> <05E8> <B2D2> <05EB> <B2DB> <05EC> <B2DD> <05ED> <B2E2> <05F1> <B2E8> <05FF> <B2FF> <0602> <B304> <0603> <B308> <0609> <B31C> <060D> <B358> <0614> <B367> <0615> <B369> <0616> <B36B> <0617> <B36E> <061A> <B374> <061B> <B378> <0621> <B38C> <0622> <B390> <0623> <B394> <0626> <B3A8> <0627> <B3AC> endbfchar 100 beginbfchar <062A> <B3C8> <062D> <B3CE> <062E> <B3D0> <0631> <B3D7> <0632> <B3D9> <0633> <B3DB> <0634> <B3DD> <0635> <B3E0> <0636> <B3E4> <0637> <B3E8> <0638> <B3FC> <0639> <B410> <063A> <B418> <063B> <B41C> <063C> <B420> <063F> <B42B> <0640> <B434> <0643> <B454> <0644> <B458> <0647> <B463> <0648> <B465> <0649> <B46C> <064A> <B480> <064B> <B488> <064C> <B49D> <064D> <B4A4> <064E> <B4A8> <064F> <B4AC> <0650> <B4B5> <0651> <B4B7> <0652> <B4B9> <0653> <B4C0> <0654> <B4C4> <0655> <B4C8> <0656> <B4D0> <0657> <B4D5> <065A> <B4E0> <065D> <B4E6> <0660> <B4EF> <0661> <B4F1> <0662> <B4F8> <0665> <B518> <0670> <B534> <0671> <B538> <067A> <B550> <067B> <B554> <0683> <B5A4> <0684> <B5A8> <068F> <B5C0> <0690> <B5C4> <0696> <B5D8> <0697> <B5EC> <069A> <B614> <069B> <B618> <069C> <B625> <069D> <B62C> <069E> <B634> <069F> <B648> <06A0> <B664> <06A1> <B668> <06A4> <B6A0> <06A5> <B6A4> <06A8> <B6B1> <06A9> <B6D4> <06AA> <B6F0> <06AB> <B6F4> <06AC> <B6F8> <06AF> <B705> <06B2> <B72C> <06B7> <B73B> <06B8> <B744> <06B9> <B748> <06BA> <B74C> <06BD> <B760> <06BE> <B764> <06BF> <B768> <06C2> <B773> <06C3> <B775> <06C6> <B780> <06C7> <B784> <06D2> <B79C> <06D3> <B7A0> <06DB> <B7B8> <06DC> <B7C7> <06DD> <B7C9> <06E0> <B7F0> <06E1> <B7F4> <06EA> <B80C> <06EB> <B810> <06EE> <B81B> <06EF> <B81D> <06F2> <B828> <06F3> <B82C> <06F9> <B840> <06FA> <B844> <06FB> <B851> <06FC> <B853> <06FF> <B860> <0700> <B864> <0703> <B86F> endbfchar 100 beginbfchar <0704> <B871> <0705> <B878> <0706> <B87C> <0707> <B88D> <0708> <B8A8> <0709> <B8B0> <070A> <B8B4> <070B> <B8B8> <070E> <B8C3> <070F> <B8C5> <0710> <B8CC> <0711> <B8D0> <0712> <B8D4> <0713> <B8DD> <0714> <B8DF> <0715> <B8E1> <0718> <B8EC> <0719> <B8F0> <071C> <B8FB> <071D> <B8FD> <071E> <B904> <071F> <B918> <0720> <B920> <0723> <B940> <0724> <B944> <0725> <B94C> <0726> <B94F> <0727> <B951> <072A> <B95C> <072B> <B960> <072E> <B96B> <072F> <B96D> <0732> <B978> <0733> <B97C> <0736> <B987> <073D> <B9B0> <073E> <B9B4> <0741> <B9BF> <0742> <B9C1> <0745> <B9CC> <074D> <B9DB> <0750> <B9E1> <0754> <B9E8> <0755> <B9EC> <075E> <BA08> <075F> <BA15> <0762> <BA3C> <0763> <BA40> <0764> <BA42> <0767> <BA4B> <076D> <BA58> <076E> <BA5C> <0776> <BA74> <0777> <BA78> <077B> <BA87> <077C> <BA8C> <0781> <BAB0> <0782> <BAB2> <0785> <BABB> <0786> <BABD> <0787> <BAC4> <0788> <BAC8> <078B> <BAFC> <078C> <BB00> <078D> <BB04> <078E> <BB0D> <078F> <BB0F> <0790> <BB11> <0791> <BB18> <0792> <BB1C> <0793> <BB20> <0794> <BB29> <0795> <BB2B> <0799> <BB38> <07A0> <BB47> <07A1> <BB49> <07A2> <BB4D> <07A5> <BB54> <07A6> <BB58> <07A7> <BB61> <07A8> <BB63> <07A9> <BB6C> <07AA> <BB88> <07AB> <BB8C> <07AC> <BB90> <07AD> <BBA4> <07AE> <BBA8> <07AF> <BBAC> <07B0> <BBB4> <07B1> <BBB7> <07B2> <BBC0> <07B3> <BBC4> <07B4> <BBC8> <07B5> <BBD0> <07B6> <BBD3> <07B9> <BBFC> <07BC> <BC02> <07C2> <BC0F> <07C3> <BC11> <07D0> <BC27> endbfchar 100 beginbfchar <07D1> <BC29> <07D2> <BC2D> <07D5> <BC34> <07D6> <BC38> <07DC> <BC49> <07DF> <BC50> <07E0> <BC5D> <07E3> <BC88> <07E6> <BC8E> <07E9> <BC97> <07EE> <BCA4> <07F8> <BCC0> <07F9> <BCC4> <07FA> <BCCD> <07FE> <BCD5> <07FF> <BCD8> <0800> <BCDC> <0804> <BCF8> <0805> <BCFC> <0808> <BD07> <0809> <BD09> <080A> <BD10> <080B> <BD14> <080C> <BD24> <080D> <BD2C> <080E> <BD40> <0811> <BD4C> <0812> <BD50> <0815> <BD64> <0816> <BD68> <0819> <BD84> <0820> <BD93> <0821> <BD95> <0824> <BD9C> <0825> <BDA4> <0826> <BDB0> <0827> <BDB8> <082A> <BDD8> <082B> <BDDC> <082C> <BDE9> <082D> <BDF0> <082E> <BDF4> <082F> <BDF8> <0830> <BE00> <0831> <BE03> <0832> <BE05> <0835> <BE10> <0836> <BE14> <0839> <BE1F> <083C> <BE48> <083D> <BE4C> <083E> <BE4E> <0841> <BE57> <0847> <BE64> <0848> <BE68> <0849> <BE6A> <0852> <BE80> <0853> <BE84> <085B> <BEA8> <085E> <BED4> <0861> <BEE0> <0865> <BEEC> <0866> <BF01> <0870> <BF44> <0871> <BF48> <0874> <BF55> <0875> <BF94> <0876> <BFB0> <0877> <BFC5> <087A> <BFD0> <087B> <BFD4> <087C> <BFDC> <087D> <BFDF> <087E> <BFE1> <087F> <C03C> <0880> <C051> <0881> <C058> <0882> <C05C> <0883> <C060> <0888> <C094> <0889> <C098> <088C> <C0A3> <088D> <C0A5> <089B> <C0C5> <089E> <C0CC> <089F> <C0D0> <08A7> <C0E8> <08A8> <C0EC> <08AB> <C0F7> <08AC> <C0F9> <08AD> <C100> <08AE> <C104> <08AF> <C108> <08B0> <C110> <08B1> <C115> <08C0> <C136> <08C3> <C13C> <08C4> <C140> <08CC> <C158> <08CD> <C15C> endbfchar 100 beginbfchar <08D3> <C170> <08D4> <C174> <08D5> <C178> <08D6> <C185> <08DA> <C190> <08DB> <C194> <08DC> <C196> <08DF> <C19F> <08E0> <C1A1> <08E1> <C1A5> <08E4> <C1AC> <08E5> <C1B0> <08E6> <C1BD> <08E7> <C1C4> <08E8> <C1C8> <08E9> <C1CC> <08EA> <C1D4> <08ED> <C1E0> <08EE> <C1E4> <08EF> <C1E8> <08F2> <C1F3> <08F5> <C200> <08F6> <C204> <08F9> <C20F> <08FA> <C211> <08FD> <C21C> <0902> <C22B> <0903> <C22D> <0904> <C22F> <0907> <C234> <0908> <C248> <090B> <C254> <090C> <C258> <090D> <C260> <090E> <C265> <0911> <C270> <0912> <C274> <0915> <C27F> <0916> <C281> <0919> <C290> <091A> <C298> <091B> <C29B> <091C> <C29D> <091F> <C2A8> <0924> <C2B7> <0925> <C2B9> <0928> <C2E0> <092E> <C2EF> <092F> <C2F1> <0930> <C2F6> <0935> <C300> <093D> <C318> <093E> <C31C> <0943> <C345> <0946> <C36C> <0947> <C370> <0948> <C372> <094D> <C384> <094E> <C388> <094F> <C38C> <0950> <C3C0> <0953> <C3DC> <0956> <C3E2> <0959> <C3ED> <095C> <C3F8> <095D> <C408> <095E> <C410> <095F> <C424> <0960> <C42C> <0961> <C430> <0962> <C434> <0965> <C448> <0968> <C468> <0969> <C46C> <096C> <C479> <096D> <C480> <096E> <C494> <096F> <C49C> <0970> <C4B8> <0971> <C4BC> <0972> <C4E9> <0975> <C4F4> <0976> <C4F8> <0977> <C4FA> <097B> <C50C> <097C> <C510> <097D> <C514> <097E> <C51C> <0981> <C52C> <0982> <C530> <0985> <C53B> <0986> <C53D> <0999> <C564> <099A> <C568> <09A2> <C580> <09A3> <C584> <09A4> <C587> <09A7> <C58F> <09A8> <C591> <09A9> <C595> endbfchar 100 beginbfchar <09AC> <C59C> <09AD> <C5A0> <09AE> <C5A9> <09BE> <C5CC> <09BF> <C5CE> <09C2> <C5D4> <09C3> <C5D8> <09C6> <C5E3> <09C7> <C5E5> <09CB> <C5F0> <09CC> <C5F4> <09D9> <C60C> <09DA> <C610> <09E1> <C628> <09E5> <C630> <09E9> <C637> <09EA> <C639> <09EB> <C63B> <09EE> <C644> <09EF> <C648> <09F7> <C660> <09F8> <C66C> <09F9> <C66F> <09FA> <C671> <09FD> <C67C> <09FE> <C680> <09FF> <C688> <0A00> <C689> <0A01> <C68B> <0A02> <C68D> <0A05> <C698> <0A06> <C69C> <0A09> <C6A7> <0A0A> <C6A9> <0A0D> <C6B4> <0A13> <C6C3> <0A14> <C6C5> <0A17> <C6D0> <0A18> <C6D4> <0A1F> <C6EC> <0A20> <C6F0> <0A23> <C6FD> <0A26> <C708> <0A27> <C70C> <0A2A> <C717> <0A2B> <C719> <0A2E> <C724> <0A2F> <C728> <0A32> <C733> <0A33> <C735> <0A34> <C737> <0A37> <C740> <0A38> <C744> <0A39> <C74A> <0A3C> <C74F> <0A45> <C75C> <0A46> <C760> <0A47> <C768> <0A48> <C76B> <0A4B> <C778> <0A56> <C78E> <0A59> <C794> <0A5D> <C79A> <0A66> <C7B0> <0A67> <C7B4> <0A6F> <C7CC> <0A70> <C7CE> <0A71> <C7D0> <0A72> <C7D8> <0A73> <C7DD> <0A74> <C7E4> <0A75> <C7E8> <0A76> <C7EC> <0A79> <C804> <0A7A> <C808> <0A7B> <C80A> <0A7E> <C813> <0A83> <C820> <0A84> <C824> <0A87> <C82F> <0A88> <C831> <0A89> <C838> <0A8A> <C83C> <0A8B> <C840> <0A90> <C854> <0A93> <C874> <0A94> <C878> <0A95> <C87A> <0A98> <C883> <0A9F> <C894> <0AA0> <C89D> <0AA1> <C89F> <0AA2> <C8A1> <0AA3> <C8A8> <0AA6> <C8C4> <0AA7> <C8C8> <0AA8> <C8CC> <0AAB> <C8D7> <0AAC> <C8D9> <0AAF> <C8E4> endbfchar 100 beginbfchar <0AB0> <C8F5> <0AB3> <C900> <0AB9> <C90F> <0ABA> <C911> <0ABB> <C918> <0ABC> <C92C> <0ABD> <C934> <0AC0> <C954> <0AC1> <C958> <0AC4> <C963> <0AC5> <C96C> <0AC6> <C970> <0AC7> <C974> <0AC8> <C97C> <0ACB> <C98C> <0ACC> <C990> <0ACF> <C99B> <0AD0> <C99D> <0AD3> <C9C4> <0AD6> <C9CA> <0AD9> <C9D3> <0AE0> <C9E0> <0AE1> <C9E2> <0AE2> <C9E4> <0AE3> <C9E7> <0AEB> <C9FC> <0AEC> <CA00> <0AF2> <CA14> <0AF3> <CA18> <0AF4> <CA29> <0AF7> <CA50> <0AF8> <CA54> <0AFE> <CA68> <0AFF> <CA7D> <0B00> <CA84> <0B01> <CA98> <0B04> <CAC0> <0B05> <CAC4> <0B08> <CACF> <0B09> <CAD1> <0B0A> <CAD3> <0B0D> <CAE0> <0B0E> <CAEC> <0B0F> <CAF4> <0B10> <CB08> <0B11> <CB10> <0B12> <CB14> <0B13> <CB18> <0B16> <CB41> <0B19> <CB4C> <0B1A> <CB50> <0B1D> <CB5D> <0B1E> <CB64> <0B21> <CB9C> <0B22> <CBB8> <0B23> <CBD4> <0B24> <CBE4> <0B25> <CBE7> <0B26> <CBE9> <0B29> <CC10> <0B2A> <CC14> <0B32> <CC2C> <0B33> <CC2E> <0B34> <CC30> <0B3D> <CC48> <0B3E> <CC4C> <0B44> <CC60> <0B45> <CC64> <0B46> <CC66> <0B47> <CC68> <0B48> <CC70> <0B49> <CC75> <0B4C> <CC9C> <0B4D> <CCA0> <0B55> <CCB8> <0B56> <CCBC> <0B59> <CCC7> <0B5A> <CCC9> <0B5B> <CCD0> <0B5C> <CCD4> <0B5D> <CCE4> <0B5E> <CCEC> <0B5F> <CCF0> <0B60> <CD01> <0B63> <CD0C> <0B64> <CD10> <0B67> <CD1B> <0B68> <CD1D> <0B69> <CD24> <0B6A> <CD28> <0B6B> <CD2C> <0B6C> <CD39> <0B6D> <CD5C> <0B6E> <CD60> <0B6F> <CD64> <0B72> <CD6F> <0B73> <CD71> <0B74> <CD78> <0B75> <CD88> <0B78> <CD98> endbfchar 100 beginbfchar <0B79> <CD9C> <0B7C> <CDA7> <0B7D> <CDA9> <0B7E> <CDB0> <0B7F> <CDC4> <0B80> <CDCC> <0B81> <CDD0> <0B82> <CDE8> <0B83> <CDEC> <0B84> <CDF0> <0B87> <CDFB> <0B88> <CDFD> <0B89> <CE04> <0B8A> <CE08> <0B8B> <CE0C> <0B8C> <CE14> <0B8D> <CE19> <0B90> <CE24> <0B91> <CE28> <0B94> <CE33> <0B95> <CE35> <0B98> <CE5C> <0B9E> <CE6B> <0B9F> <CE6D> <0BA2> <CE78> <0BA3> <CE7C> <0BA6> <CE87> <0BA7> <CE89> <0BAA> <CE94> <0BAB> <CE98> <0BB3> <CEC1> <0BB6> <CEE8> <0BC0> <CF04> <0BC1> <CF08> <0BC4> <CF13> <0BC5> <CF15> <0BC6> <CF1C> <0BC7> <CF20> <0BC8> <CF24> <0BCE> <CF38> <0BD1> <CF58> <0BD2> <CF5C> <0BD5> <CF67> <0BD6> <CF69> <0BD9> <CF74> <0BDA> <CF78> <0BDB> <CF80> <0BDC> <CF85> <0BDD> <CF8C> <0BDE> <CFA1> <0BDF> <CFA8> <0BE0> <CFB0> <0BE1> <CFC4> <0BE4> <CFE4> <0BE5> <CFE8> <0BE8> <CFF3> <0BE9> <CFF5> <0BEA> <CFFC> <0BEB> <D000> <0BEC> <D004> <0BED> <D011> <0BEE> <D018> <0BEF> <D02D> <0BF2> <D038> <0BF3> <D03C> <0BF6> <D047> <0BF7> <D049> <0BF8> <D050> <0BF9> <D054> <0BFA> <D058> <0BFB> <D060> <0BFE> <D070> <0BFF> <D074> <0C02> <D081> <0C05> <D0A8> <0C06> <D0AC> <0C09> <D0B7> <0C0A> <D0B9> <0C0D> <D0C4> <0C17> <D0E0> <0C18> <D0E4> <0C1E> <D0F8> <0C1F> <D10D> <0C22> <D134> <0C23> <D138> <0C24> <D13A> <0C2C> <D150> <0C2D> <D154> <0C30> <D15F> <0C31> <D161> <0C32> <D168> <0C33> <D16C> <0C34> <D17C> <0C35> <D184> <0C36> <D188> <0C39> <D1A4> <0C3A> <D1A8> <0C3D> <D1B3> <0C3E> <D1B5> <0C3F> <D1BA> endbfchar 100 beginbfchar <0C40> <D1BC> <0C41> <D1C0> <0C42> <D1D8> <0C43> <D1F4> <0C44> <D1F8> <0C45> <D207> <0C46> <D209> <0C47> <D210> <0C4A> <D230> <0C4B> <D234> <0C4E> <D23F> <0C4F> <D241> <0C50> <D248> <0C51> <D25C> <0C52> <D264> <0C55> <D284> <0C56> <D288> <0C59> <D295> <0C5A> <D29C> <0C5B> <D2A0> <0C5C> <D2A4> <0C5D> <D2AC> <0C5E> <D2B1> <0C61> <D2BC> <0C64> <D2C2> <0C67> <D2CB> <0C68> <D2D4> <0C69> <D2D8> <0C6A> <D2DC> <0C6F> <D2F4> <0C70> <D2F8> <0C73> <D303> <0C74> <D305> <0C78> <D310> <0C79> <D314> <0C7A> <D316> <0C80> <D325> <0C83> <D32C> <0C84> <D330> <0C8E> <D380> <0C8F> <D384> <0C97> <D39C> <0C98> <D3A0> <0C9B> <D3AB> <0C9C> <D3AD> <0C9D> <D3B4> <0C9E> <D3B8> <0C9F> <D3BC> <0CA4> <D3D0> <0CA5> <D3D8> <0CA6> <D3E1> <0CA7> <D3E3> <0CAA> <D3F0> <0CAB> <D3F4> <0CAE> <D3FF> <0CAF> <D401> <0CB0> <D408> <0CB1> <D41D> <0CB2> <D440> <0CB3> <D444> <0CB4> <D45C> <0CB5> <D460> <0CB6> <D464> <0CB7> <D46D> <0CB8> <D46F> <0CBB> <D47C> <0CBE> <D482> <0CC1> <D48B> <0CC2> <D48D> <0CC3> <D494> <0CC4> <D4A9> <0CC5> <D4CC> <0CC6> <D4D0> <0CC7> <D4D4> <0CC8> <D4DC> <0CC9> <D4DF> <0CCA> <D4E8> <0CCB> <D4EC> <0CCC> <D4F0> <0CCD> <D4F8> <0CCE> <D4FB> <0CCF> <D4FD> <0CD0> <D504> <0CD1> <D508> <0CD2> <D50C> <0CD5> <D517> <0CD8> <D540> <0CD9> <D544> <0CDC> <D54F> <0CDD> <D551> <0CE0> <D55C> <0CE1> <D560> <0CE2> <D565> <0CE5> <D56B> <0CE6> <D56D> <0CE9> <D578> <0CEA> <D57C> <0CF0> <D590> <0CF1> <D5A5> <0CF4> <D5CC> endbfchar 100 beginbfchar <0CF5> <D5D0> <0CF6> <D5D2> <0CF9> <D5DB> <0CFA> <D5DD> <0CFD> <D5E8> <0CFE> <D5EC> <0CFF> <D5F4> <0D00> <D5F5> <0D01> <D5F7> <0D02> <D5F9> <0D05> <D604> <0D06> <D608> <0D0C> <D61C> <0D0D> <D620> <0D0E> <D624> <0D0F> <D62D> <0D12> <D63C> <0D13> <D640> <0D14> <D645> <0D17> <D64B> <0D18> <D64D> <0D19> <D651> <0D1C> <D658> <0D1D> <D65C> <0D1E> <D667> <0D1F> <D669> <0D22> <D674> <0D23> <D683> <0D24> <D685> <0D27> <D690> <0D28> <D694> <0D29> <D69D> <0D2A> <D69F> <0D2B> <D6A1> <0D2C> <D6A8> <0D2D> <D6AC> <0D2E> <D6B0> <0D2F> <D6B9> <0D30> <D6BB> <0D33> <D6C8> <0D34> <D6CC> <0D35> <D6D1> <0D36> <D6D4> <0D37> <D6D7> <0D38> <D6D9> <0D39> <D6E0> <0D3A> <D6E4> <0D3B> <D6E8> <0D3C> <D6F0> <0D3D> <D6F5> <0D40> <D700> <0D41> <D704> <0D42> <D711> <0D45> <D71C> <0D46> <D720> <0D49> <D72B> <0D4A> <D72D> <0D4D> <D738> <0D4E> <D73C> <0D4F> <D744> <0D50> <D747> <0D51> <D749> <0D54> <D754> <0D5B> <D763> <0D5C> <D765> <0D5D> <D769> <0D5E> <D76C> <0D5F> <D770> <0D60> <D774> <0D63> <D781> <0D66> <D78C> <0D67> <D790> <0D6A> <D79B> <0D6B> <D79D> <0D6C> <4F3D> <0D6D> <4F73> <0D6E> <5047> <0D6F> <50F9> <0D70> <52A0> <0D71> <53EF> <0D72> <5475> <0D73> <54E5> <0D74> <5609> <0D75> <5AC1> <0D76> <5BB6> <0D77> <6687> <0D7A> <67EF> <0D7B> <6B4C> <0D7C> <73C2> <0D7D> <75C2> <0D7E> <7A3C> <0D7F> <82DB> <0D80> <8304> <0D81> <8857> <0D82> <8888> <0D83> <8A36> <0D84> <8CC8> <0D85> <8DCF> <0D86> <8EFB> <0D87> <8FE6> endbfchar 100 beginbfchar <0D88> <99D5> <0D89> <523B> <0D8A> <5374> <0D8B> <5404> <0D8C> <606A> <0D8D> <6164> <0D8E> <6BBC> <0D8F> <73CF> <0D90> <811A> <0D91> <89BA> <0D92> <89D2> <0D93> <95A3> <0D94> <4F83> <0D95> <520A> <0D96> <58BE> <0D97> <5978> <0D98> <59E6> <0D99> <5E72> <0D9A> <5E79> <0D9B> <61C7> <0D9C> <63C0> <0D9D> <6746> <0D9E> <67EC> <0D9F> <687F> <0DA0> <6F97> <0DA1> <764E> <0DA2> <770B> <0DA3> <78F5> <0DA4> <7A08> <0DA5> <7AFF> <0DA6> <7C21> <0DA7> <809D> <0DA8> <826E> <0DA9> <8271> <0DAA> <8AEB> <0DAB> <9593> <0DAC> <4E6B> <0DAD> <559D> <0DAE> <66F7> <0DAF> <6E34> <0DB0> <78A3> <0DB1> <7AED> <0DB2> <845B> <0DB3> <8910> <0DB4> <874E> <0DB5> <97A8> <0DB6> <52D8> <0DB7> <574E> <0DB8> <582A> <0DB9> <5D4C> <0DBA> <611F> <0DBB> <61BE> <0DBC> <6221> <0DBD> <6562> <0DBE> <67D1> <0DBF> <6A44> <0DC0> <6E1B> <0DC1> <7518> <0DC2> <75B3> <0DC3> <76E3> <0DC4> <77B0> <0DC5> <7D3A> <0DC6> <90AF> <0DC9> <9F95> <0DCA> <5323> <0DCB> <5CAC> <0DCC> <7532> <0DCD> <80DB> <0DCE> <9240> <0DCF> <9598> <0DD0> <525B> <0DD1> <5808> <0DD2> <59DC> <0DD3> <5CA1> <0DD4> <5D17> <0DD5> <5EB7> <0DD6> <5F3A> <0DD7> <5F4A> <0DD8> <6177> <0DD9> <6C5F> <0DDA> <757A> <0DDB> <7586> <0DDC> <7CE0> <0DDD> <7D73> <0DDE> <7DB1> <0DDF> <7F8C> <0DE0> <8154> <0DE1> <8221> <0DE2> <8591> <0DE3> <8941> <0DE4> <8B1B> <0DE5> <92FC> <0DE6> <964D> <0DE7> <9C47> <0DE8> <4ECB> <0DE9> <4EF7> <0DEA> <500B> <0DEB> <51F1> <0DEC> <584F> <0DED> <6137> endbfchar 100 beginbfchar <0DEE> <613E> <0DEF> <6168> <0DF0> <6539> <0DF1> <69EA> <0DF2> <6F11> <0DF3> <75A5> <0DF4> <7686> <0DF5> <76D6> <0DF6> <7B87> <0DF7> <82A5> <0DF8> <84CB> <0DF9> <93A7> <0DFA> <958B> <0DFB> <5580> <0DFC> <5BA2> <0DFD> <5751> <0DFE> <7CB3> <0DFF> <7FB9> <0E00> <91B5> <0E01> <5028> <0E02> <53BB> <0E03> <5C45> <0E04> <5DE8> <0E05> <62D2> <0E06> <636E> <0E07> <64DA> <0E08> <64E7> <0E09> <6E20> <0E0A> <70AC> <0E0B> <795B> <0E0C> <8DDD> <0E0D> <8E1E> <0E0E> <907D> <0E0F> <9245> <0E10> <92F8> <0E11> <4E7E> <0E12> <4EF6> <0E13> <5065> <0E14> <5DFE> <0E15> <5EFA> <0E16> <6106> <0E17> <6957> <0E18> <8171> <0E19> <8654> <0E1A> <8E47> <0E1B> <9375> <0E1C> <9A2B> <0E1D> <4E5E> <0E1E> <5091> <0E1F> <6770> <0E20> <6840> <0E21> <5109> <0E22> <528D> <0E23> <5292> <0E24> <6AA2> <0E25> <77BC> <0E26> <9210> <0E27> <9ED4> <0E28> <52AB> <0E29> <602F> <0E2A> <8FF2> <0E2B> <5048> <0E2C> <61A9> <0E2D> <63ED> <0E2E> <64CA> <0E2F> <683C> <0E30> <6A84> <0E31> <6FC0> <0E32> <8188> <0E33> <89A1> <0E34> <9694> <0E35> <5805> <0E36> <727D> <0E37> <72AC> <0E38> <7504> <0E39> <7D79> <0E3A> <7E6D> <0E3B> <80A9> <0E3C> <898B> <0E3D> <8B74> <0E3E> <9063> <0E3F> <9D51> <0E40> <6289> <0E41> <6C7A> <0E42> <6F54> <0E43> <7D50> <0E44> <7F3A> <0E45> <8A23> <0E46> <517C> <0E47> <614A> <0E48> <7B9D> <0E49> <8B19> <0E4A> <9257> <0E4B> <938C> <0E4C> <4EAC> <0E4D> <4FD3> <0E4E> <501E> <0E4F> <50BE> <0E50> <5106> <0E51> <52C1> endbfchar 100 beginbfchar <0E52> <52CD> <0E53> <537F> <0E54> <5770> <0E55> <5883> <0E56> <5E9A> <0E57> <5F91> <0E58> <6176> <0E59> <61AC> <0E5A> <64CE> <0E5B> <656C> <0E5C> <666F> <0E5D> <66BB> <0E5E> <66F4> <0E5F> <6897> <0E60> <6D87> <0E61> <7085> <0E62> <70F1> <0E63> <749F> <0E64> <74A5> <0E65> <74CA> <0E66> <75D9> <0E67> <786C> <0E68> <78EC> <0E69> <7ADF> <0E6A> <7AF6> <0E6B> <7D45> <0E6C> <7D93> <0E6D> <8015> <0E6E> <803F> <0E6F> <811B> <0E70> <8396> <0E71> <8B66> <0E72> <8F15> <0E73> <9015> <0E74> <93E1> <0E75> <9803> <0E76> <9838> <0E77> <9A5A> <0E78> <9BE8> <0E79> <4FC2> <0E7A> <5553> <0E7B> <583A> <0E7C> <5951> <0E7D> <5B63> <0E7E> <5C46> <0E7F> <60B8> <0E80> <6212> <0E81> <6842> <0E82> <68B0> <0E83> <68E8> <0E84> <6EAA> <0E85> <754C> <0E86> <7678> <0E87> <78CE> <0E88> <7A3D> <0E89> <7CFB> <0E8A> <7E6B> <0E8B> <7E7C> <0E8C> <8A08> <0E8D> <8AA1> <0E8E> <8C3F> <0E8F> <968E> <0E90> <9DC4> <0E91> <53E4> <0E92> <53E9> <0E93> <544A> <0E94> <5471> <0E95> <56FA> <0E96> <59D1> <0E97> <5B64> <0E98> <5C3B> <0E99> <5EAB> <0E9A> <62F7> <0E9B> <6537> <0E9C> <6545> <0E9D> <6572> <0E9E> <66A0> <0E9F> <67AF> <0EA0> <69C1> <0EA1> <6CBD> <0EA2> <75FC> <0EA3> <7690> <0EA4> <777E> <0EA5> <7A3F> <0EA6> <7F94> <0EA7> <8003> <0EA8> <80A1> <0EA9> <818F> <0EAA> <82E6> <0EAB> <82FD> <0EAC> <83F0> <0EAD> <85C1> <0EAE> <8831> <0EAF> <88B4> <0EB0> <8AA5> <0EB1> <8F9C> <0EB2> <932E> <0EB3> <96C7> <0EB4> <9867> <0EB5> <9AD8> endbfchar 100 beginbfchar <0EB6> <9F13> <0EB7> <54ED> <0EB8> <659B> <0EB9> <66F2> <0EBA> <688F> <0EBB> <7A40> <0EBC> <8C37> <0EBD> <9D60> <0EBE> <56F0> <0EBF> <5764> <0EC0> <5D11> <0EC1> <6606> <0EC2> <68B1> <0EC3> <68CD> <0EC4> <6EFE> <0EC5> <7428> <0EC6> <889E> <0EC7> <9BE4> <0EC8> <6C68> <0EC9> <9AA8> <0ECA> <4F9B> <0ECB> <516C> <0ECC> <5171> <0ECD> <529F> <0ECE> <5B54> <0ECF> <5DE5> <0ED0> <6050> <0ED1> <606D> <0ED2> <62F1> <0ED3> <63A7> <0ED4> <653B> <0ED5> <73D9> <0ED6> <7A7A> <0ED7> <86A3> <0ED8> <8CA2> <0ED9> <978F> <0EDA> <4E32> <0EDB> <5BE1> <0EDC> <6208> <0EDD> <679C> <0EDE> <74DC> <0EDF> <79D1> <0EE0> <83D3> <0EE1> <8A87> <0EE2> <8AB2> <0EE3> <8DE8> <0EE4> <904E> <0EE5> <934B> <0EE6> <9846> <0EE7> <5ED3> <0EE8> <69E8> <0EE9> <85FF> <0EEA> <90ED> <0EEB> <51A0> <0EEC> <5B98> <0EED> <5BEC> <0EEE> <6163> <0EEF> <68FA> <0EF0> <6B3E> <0EF1> <704C> <0EF2> <742F> <0EF3> <74D8> <0EF4> <7BA1> <0EF5> <7F50> <0EF6> <83C5> <0EF7> <89C0> <0EF8> <8CAB> <0EF9> <95DC> <0EFA> <9928> <0EFB> <522E> <0EFC> <605D> <0EFD> <62EC> <0EFE> <9002> <0EFF> <4F8A> <0F00> <5149> <0F01> <5321> <0F02> <58D9> <0F03> <5EE3> <0F04> <66E0> <0F05> <6D38> <0F06> <709A> <0F07> <72C2> <0F08> <73D6> <0F09> <7B50> <0F0A> <80F1> <0F0B> <945B> <0F0C> <5366> <0F0D> <639B> <0F0E> <7F6B> <0F0F> <4E56> <0F10> <5080> <0F11> <584A> <0F12> <58DE> <0F13> <602A> <0F14> <6127> <0F15> <62D0> <0F16> <69D0> <0F17> <9B41> <0F18> <5B8F> <0F19> <7D18> endbfchar 100 beginbfchar <0F1A> <80B1> <0F1B> <8F5F> <0F1C> <4EA4> <0F1D> <50D1> <0F1E> <54AC> <0F1F> <55AC> <0F20> <5B0C> <0F21> <5DA0> <0F22> <5DE7> <0F23> <652A> <0F24> <654E> <0F25> <6821> <0F26> <6A4B> <0F27> <72E1> <0F28> <768E> <0F29> <77EF> <0F2A> <7D5E> <0F2B> <7FF9> <0F2C> <81A0> <0F2D> <854E> <0F2E> <86DF> <0F2F> <8F03> <0F30> <8F4E> <0F31> <90CA> <0F32> <9903> <0F33> <9A55> <0F34> <9BAB> <0F35> <4E18> <0F36> <4E45> <0F37> <4E5D> <0F38> <4EC7> <0F39> <4FF1> <0F3A> <5177> <0F3B> <52FE> <0F3C> <5340> <0F3D> <53E3> <0F3E> <53E5> <0F3F> <548E> <0F40> <5614> <0F41> <5775> <0F42> <57A2> <0F43> <5BC7> <0F44> <5D87> <0F45> <5ED0> <0F46> <61FC> <0F47> <62D8> <0F48> <6551> <0F49> <67B8> <0F4A> <67E9> <0F4B> <69CB> <0F4C> <6B50> <0F4D> <6BC6> <0F4E> <6BEC> <0F4F> <6C42> <0F50> <6E9D> <0F51> <7078> <0F52> <72D7> <0F53> <7396> <0F54> <7403> <0F55> <77BF> <0F56> <77E9> <0F57> <7A76> <0F58> <7D7F> <0F59> <8009> <0F5A> <81FC> <0F5B> <8205> <0F5C> <820A> <0F5D> <82DF> <0F5E> <8862> <0F5F> <8B33> <0F60> <8CFC> <0F61> <8EC0> <0F62> <9011> <0F63> <90B1> <0F64> <9264> <0F65> <92B6> <0F66> <99D2> <0F67> <9A45> <0F68> <9CE9> <0F69> <9DD7> <0F6A> <9F9C> <0F6B> <570B> <0F6C> <5C40> <0F6D> <83CA> <0F6E> <97A0> <0F6F> <97AB> <0F70> <9EB4> <0F71> <541B> <0F72> <7A98> <0F73> <7FA4> <0F74> <88D9> <0F75> <8ECD> <0F76> <90E1> <0F77> <5800> <0F78> <5C48> <0F79> <6398> <0F7A> <7A9F> <0F7B> <5BAE> <0F7C> <5F13> <0F7D> <7A79> endbfchar 100 beginbfchar <0F7E> <7AAE> <0F7F> <828E> <0F80> <8EAC> <0F81> <5026> <0F82> <5238> <0F83> <52F8> <0F84> <5377> <0F85> <5708> <0F86> <62F3> <0F87> <6372> <0F88> <6B0A> <0F89> <6DC3> <0F8A> <7737> <0F8B> <53A5> <0F8C> <7357> <0F8D> <8568> <0F8E> <8E76> <0F8F> <95D5> <0F90> <673A> <0F91> <6AC3> <0F92> <6F70> <0F93> <8A6D> <0F94> <8ECC> <0F95> <994B> <0F96> <6677> <0F97> <6B78> <0F98> <8CB4> <0F99> <9B3C> <0F9A> <53EB> <0F9B> <572D> <0F9C> <594E> <0F9D> <63C6> <0F9E> <69FB> <0F9F> <73EA> <0FA0> <7845> <0FA1> <7ABA> <0FA2> <7AC5> <0FA3> <7CFE> <0FA4> <8475> <0FA5> <898F> <0FA6> <8D73> <0FA7> <9035> <0FA8> <95A8> <0FA9> <52FB> <0FAA> <5747> <0FAB> <7547> <0FAC> <7B60> <0FAD> <83CC> <0FAE> <921E> <0FAF> <6A58> <0FB0> <514B> <0FB1> <524B> <0FB2> <5287> <0FB3> <621F> <0FB4> <68D8> <0FB5> <6975> <0FB6> <9699> <0FB7> <50C5> <0FB8> <52A4> <0FB9> <52E4> <0FBA> <61C3> <0FBB> <65A4> <0FBC> <6839> <0FBD> <69FF> <0FBE> <747E> <0FBF> <7B4B> <0FC0> <82B9> <0FC1> <83EB> <0FC2> <89B2> <0FC3> <8B39> <0FC4> <8FD1> <0FC5> <9949> <0FC6> <4ECA> <0FC7> <5997> <0FC8> <64D2> <0FC9> <6611> <0FCA> <6A8E> <0FCB> <7434> <0FCC> <7981> <0FCD> <79BD> <0FCE> <82A9> <0FD1> <895F> <0FD2> <9326> <0FD3> <4F0B> <0FD4> <53CA> <0FD5> <6025> <0FD6> <6271> <0FD7> <6C72> <0FD8> <7D1A> <0FD9> <7D66> <0FDA> <4E98> <0FDB> <5162> <0FDC> <77DC> <0FDD> <80AF> <0FDE> <4F01> <0FDF> <4F0E> <0FE0> <5176> <0FE1> <5180> <0FE2> <55DC> <0FE3> <5668> endbfchar 100 beginbfchar <0FE4> <573B> <0FE5> <57FA> <0FE6> <57FC> <0FE7> <5914> <0FE8> <5947> <0FE9> <5993> <0FEA> <5BC4> <0FEB> <5C90> <0FEC> <5D0E> <0FED> <5DF1> <0FEE> <5E7E> <0FEF> <5FCC> <0FF0> <6280> <0FF1> <65D7> <0FF2> <65E3> <0FF5> <675E> <0FF6> <68CB> <0FF7> <68C4> <0FF8> <6A5F> <0FF9> <6B3A> <0FFA> <6C23> <0FFB> <6C7D> <0FFC> <6C82> <0FFD> <6DC7> <0FFE> <7398> <0FFF> <7426> <1000> <742A> <1001> <7482> <1002> <74A3> <1003> <7578> <1004> <757F> <1005> <7881> <1006> <78EF> <1007> <7941> <100A> <797A> <100B> <7B95> <100C> <7D00> <100D> <7DBA> <100E> <7F88> <100F> <8006> <1010> <802D> <1011> <808C> <1012> <8A18> <1013> <8B4F> <1014> <8C48> <1015> <8D77> <1016> <9321> <1017> <9324> <1018> <98E2> <1019> <9951> <101C> <9A65> <101D> <9E92> <101E> <7DCA> <101F> <4F76> <1020> <5409> <1021> <62EE> <1022> <6854> <1023> <91D1> <1024> <55AB> <1025> <513A> <1026> <5A1C> <1027> <61E6> <1028> <62CF> <1029> <62FF> <102A> <90A3> <102B> <8AFE> <102C> <6696> <102D> <7156> <102E> <96E3> <102F> <634F> <1030> <637A> <1031> <5357> <1032> <678F> <1033> <6960> <1034> <6E73> <1035> <7537> <1036> <7D0D> <1037> <8872> <1038> <56CA> <1039> <5A18> <103A> <4E43> <103B> <5167> <103C> <5948> <103D> <67F0> <103E> <8010> <103F> <5973> <1040> <5E74> <1041> <649A> <1042> <79CA> <1043> <5FF5> <1044> <606C> <1045> <62C8> <1046> <637B> <1047> <5BE7> <1048> <5BD7> <1049> <52AA> <104A> <5974> <104B> <5F29> <104C> <6012> <104D> <7459> endbfchar 100 beginbfchar <104E> <99D1> <104F> <6FC3> <1050> <81BF> <1051> <8FB2> <1052> <60F1> <1053> <8166> <1054> <5C3F> <1055> <5AE9> <1056> <8A25> <1057> <677B> <1058> <7D10> <1059> <80FD> <105A> <5C3C> <105B> <6CE5> <105C> <533F> <105D> <6EBA> <105E> <591A> <105F> <8336> <1060> <4E39> <1061> <4EB6> <1062> <4F46> <1063> <55AE> <1064> <5718> <1065> <58C7> <1066> <5F56> <1067> <65B7> <1068> <65E6> <1069> <6A80> <106A> <6BB5> <106B> <6E4D> <106C> <77ED> <106D> <7AEF> <106E> <7C1E> <106F> <7DDE> <1070> <86CB> <1071> <8892> <1072> <9132> <1073> <935B> <1074> <64BB> <1075> <6FBE> <1076> <737A> <1077> <75B8> <1078> <9054> <1079> <5556> <107A> <574D> <107B> <61BA> <107C> <64D4> <107D> <66C7> <107E> <6DE1> <107F> <6E5B> <1080> <6F6D> <1081> <6FB9> <1082> <75F0> <1083> <8043> <1084> <81BD> <1085> <8541> <1086> <8983> <1087> <8AC7> <1088> <8B5A> <1089> <931F> <108A> <6C93> <108B> <7553> <108C> <7B54> <108D> <8E0F> <108E> <905D> <108F> <5510> <1090> <5802> <1091> <5858> <1092> <5E62> <1093> <6207> <1094> <649E> <1095> <68E0> <1096> <7576> <1097> <7CD6> <1098> <87B3> <1099> <9EE8> <109A> <4EE3> <109B> <5788> <109C> <576E> <109D> <5927> <109E> <5C0D> <109F> <5CB1> <10A0> <5E36> <10A1> <5F85> <10A2> <6234> <10A3> <64E1> <10A4> <73B3> <10A5> <81FA> <10A6> <888B> <10A7> <8CB8> <10A8> <968A> <10A9> <9EDB> <10AA> <5B85> <10AB> <5FB7> <10AC> <60B3> <10AD> <5012> <10AE> <5200> <10AF> <5230> <10B0> <5716> <10B1> <5835> endbfchar 100 beginbfchar <10B2> <5857> <10B3> <5C0E> <10B4> <5C60> <10B5> <5CF6> <10B6> <5D8B> <10B7> <5EA6> <10B8> <5F92> <10B9> <60BC> <10BA> <6311> <10BB> <6389> <10BC> <6417> <10BD> <6843> <10BE> <68F9> <10BF> <6AC2> <10C0> <6DD8> <10C1> <6E21> <10C2> <6ED4> <10C3> <6FE4> <10C4> <71FE> <10C5> <76DC> <10C6> <7779> <10C7> <79B1> <10C8> <7A3B> <10C9> <8404> <10CA> <89A9> <10CB> <8CED> <10CC> <8DF3> <10CD> <8E48> <10CE> <9003> <10CF> <9014> <10D0> <9053> <10D1> <90FD> <10D2> <934D> <10D3> <9676> <10D4> <97DC> <10D5> <6BD2> <10D6> <7006> <10D7> <7258> <10D8> <72A2> <10D9> <7368> <10DA> <7763> <10DB> <79BF> <10DC> <7BE4> <10DD> <7E9B> <10DE> <8B80> <10DF> <58A9> <10E0> <60C7> <10E1> <6566> <10E2> <65FD> <10E3> <66BE> <10E4> <6C8C> <10E5> <711E> <10E6> <71C9> <10E7> <8C5A> <10E8> <9813> <10E9> <4E6D> <10EA> <7A81> <10EB> <4EDD> <10EC> <51AC> <10ED> <51CD> <10EE> <52D5> <10EF> <540C> <10F0> <61A7> <10F1> <6771> <10F2> <6850> <10F3> <68DF> <10F4> <6D1E> <10F5> <6F7C> <10F6> <75BC> <10F7> <77B3> <10F8> <7AE5> <10F9> <80F4> <10FA> <8463> <10FB> <9285> <10FC> <515C> <10FD> <6597> <10FE> <675C> <10FF> <6793> <1100> <75D8> <1101> <7AC7> <1102> <8373> <1103> <8C46> <1104> <9017> <1105> <982D> <1106> <5C6F> <1107> <81C0> <1108> <829A> <1109> <9041> <110A> <906F> <110B> <920D> <110C> <5F97> <110D> <5D9D> <110E> <6A59> <110F> <71C8> <1110> <767B> <1111> <7B49> <1112> <85E4> <1113> <8B04> <1114> <9127> <1115> <9A30> endbfchar 100 beginbfchar <1116> <5587> <1117> <61F6> <1118> <7669> <1119> <7F85> <111A> <863F> <111B> <87BA> <111C> <88F8> <111D> <908F> <111E> <6D1B> <111F> <70D9> <1120> <73DE> <1121> <7D61> <1122> <843D> <1123> <916A> <1124> <99F1> <1125> <4E82> <1126> <5375> <1127> <6B04> <1128> <6B12> <1129> <703E> <112A> <721B> <112B> <862D> <112C> <9E1E> <112D> <524C> <112E> <8FA3> <112F> <5D50> <1130> <64E5> <1131> <652C> <1132> <6B16> <1133> <6FEB> <1134> <7C43> <1135> <7E9C> <1136> <85CD> <1137> <8964> <1138> <89BD> <1139> <62C9> <113A> <81D8> <113B> <881F> <113C> <5ECA> <113D> <6717> <113E> <6D6A> <113F> <72FC> <1140> <7405> <1141> <746F> <1142> <8782> <1143> <90DE> <1144> <4F86> <1145> <5D0D> <1146> <5FA0> <1147> <840A> <1148> <51B7> <1149> <63A0> <114A> <7565> <114B> <4EAE> <114C> <5006> <114D> <5169> <114E> <51C9> <114F> <6881> <1150> <6A11> <1151> <7CAE> <1152> <7CB1> <1153> <7CE7> <1154> <826F> <1155> <8AD2> <1156> <8F1B> <1157> <91CF> <1158> <4FB6> <1159> <5137> <115A> <52F5> <115B> <5442> <115C> <5EEC> <115D> <616E> <115E> <623E> <115F> <65C5> <1160> <6ADA> <1161> <6FFE> <1162> <792A> <1163> <85DC> <1164> <8823> <1165> <95AD> <1166> <9A62> <1167> <9A6A> <1168> <9E97> <1169> <9ECE> <116A> <529B> <116B> <66C6> <116C> <6B77> <116D> <701D> <116E> <792B> <116F> <8F62> <1170> <9742> <1171> <6190> <1172> <6200> <1173> <6523> <1174> <6F23> <1175> <7149> <1176> <7489> <1177> <7DF4> <1178> <806F> <1179> <84EE> endbfchar 100 beginbfchar <117A> <8F26> <117B> <9023> <117C> <934A> <117D> <51BD> <117E> <5217> <117F> <52A3> <1180> <6D0C> <1181> <70C8> <1182> <88C2> <1183> <5EC9> <1184> <6582> <1185> <6BAE> <1186> <6FC2> <1187> <7C3E> <1188> <7375> <1189> <4EE4> <118A> <4F36> <118B> <56F9> <118C> <5CBA> <118D> <5DBA> <118E> <601C> <118F> <73B2> <1190> <7B2D> <1191> <7F9A> <1192> <7FCE> <1193> <8046> <1194> <901E> <1195> <9234> <1196> <96F6> <1197> <9748> <1198> <9818> <1199> <9F61> <119A> <4F8B> <119B> <6FA7> <119C> <79AE> <119D> <91B4> <119E> <96B7> <119F> <52DE> <11A0> <6488> <11A1> <64C4> <11A2> <6AD3> <11A3> <6F5E> <11A4> <7018> <11A5> <7210> <11A6> <76E7> <11A7> <8001> <11A8> <8606> <11A9> <865C> <11AA> <8DEF> <11AB> <8F05> <11AC> <9732> <11AD> <9B6F> <11AE> <9DFA> <11AF> <9E75> <11B0> <788C> <11B1> <797F> <11B2> <7DA0> <11B3> <83C9> <11B4> <9304> <11B5> <9E7F> <11B6> <9E93> <11B7> <8AD6> <11B8> <58DF> <11B9> <5F04> <11BA> <6727> <11BB> <7027> <11BC> <74CF> <11BD> <7C60> <11BE> <807E> <11BF> <5121> <11C0> <7028> <11C1> <7262> <11C2> <78CA> <11C3> <8CC2> <11C4> <8CDA> <11C5> <8CF4> <11C6> <96F7> <11C7> <4E86> <11C8> <50DA> <11C9> <5BEE> <11CA> <5ED6> <11CB> <6599> <11CC> <71CE> <11CD> <7642> <11CE> <77AD> <11CF> <804A> <11D0> <84FC> <11D1> <907C> <11D2> <9B27> <11D3> <9F8D> <11D4> <58D8> <11D5> <5A41> <11D6> <5C62> <11D7> <6A13> <11D8> <6DDA> <11D9> <6F0F> <11DA> <763B> <11DB> <7D2F> <11DC> <7E37> <11DD> <851E> endbfchar 100 beginbfchar <11DE> <8938> <11DF> <93E4> <11E0> <964B> <11E1> <5289> <11E2> <65D2> <11E3> <67F3> <11E4> <69B4> <11E5> <6D41> <11E6> <6E9C> <11E7> <700F> <11E8> <7409> <11E9> <7460> <11EA> <7559> <11EB> <7624> <11EC> <786B> <11ED> <8B2C> <11EE> <985E> <11EF> <516D> <11F0> <622E> <11F1> <9678> <11F2> <4F96> <11F3> <502B> <11F4> <5D19> <11F5> <6DEA> <11F6> <7DB8> <11F7> <8F2A> <11F8> <5F8B> <11F9> <6144> <11FA> <6817> <11FB> <9686> <11FC> <52D2> <11FD> <808B> <11FE> <51DC> <11FF> <51CC> <1200> <695E> <1201> <7A1C> <1202> <7DBE> <1203> <83F1> <1204> <9675> <1205> <4FDA> <1206> <5229> <1207> <5398> <1208> <540F> <1209> <550E> <120A> <5C65> <120B> <60A7> <120C> <674E> <120D> <68A8> <120E> <6D6C> <120F> <7281> <1210> <72F8> <1211> <7406> <1212> <7483> <1213> <75E2> <1214> <7C6C> <1215> <7F79> <1216> <7FB8> <1217> <8389> <1218> <88CF> <1219> <88E1> <121A> <91CC> <121B> <91D0> <121C> <96E2> <121D> <9BC9> <121E> <541D> <121F> <6F7E> <1220> <71D0> <1221> <7498> <1222> <85FA> <1223> <8EAA> <1224> <96A3> <1225> <9C57> <1226> <9E9F> <1227> <6797> <1228> <6DCB> <1229> <7433> <122A> <81E8> <122B> <9716> <122C> <782C> <122D> <7ACB> <122E> <7B20> <122F> <7C92> <1230> <6469> <1231> <746A> <1232> <75F2> <1233> <78BC> <1234> <78E8> <1235> <99AC> <1236> <9B54> <1237> <9EBB> <1238> <5BDE> <1239> <5E55> <123A> <6F20> <123B> <819C> <123C> <83AB> <123D> <9088> <123E> <4E07> <123F> <534D> <1240> <5A29> <1241> <5DD2> endbfchar 100 beginbfchar <1242> <5F4E> <1243> <6162> <1244> <633D> <1245> <6669> <1246> <66FC> <1247> <6EFF> <1248> <6F2B> <1249> <7063> <124A> <779E> <124B> <842C> <124C> <8513> <124D> <883B> <124E> <8F13> <124F> <9945> <1250> <9C3B> <1251> <551C> <1252> <62B9> <1253> <672B> <1254> <6CAB> <1255> <8309> <1256> <896A> <1257> <977A> <1258> <4EA1> <1259> <5984> <125C> <671B> <125D> <7DB2> <125E> <7F54> <125F> <8292> <1260> <832B> <1261> <83BD> <1262> <8F1E> <1263> <9099> <1264> <57CB> <1265> <59B9> <1266> <5A92> <1267> <5BD0> <1268> <6627> <1269> <679A> <126A> <6885> <126B> <6BCF> <126C> <7164> <126D> <7F75> <126E> <8CB7> <126F> <8CE3> <1270> <9081> <1271> <9B45> <1272> <8108> <1273> <8C8A> <1274> <964C> <1275> <9A40> <1276> <9EA5> <1277> <5B5F> <1278> <6C13> <1279> <731B> <127A> <76F2> <127B> <76DF> <127C> <840C> <127D> <51AA> <127E> <8993> <127F> <514D> <1280> <5195> <1281> <52C9> <1282> <68C9> <1283> <6C94> <1284> <7704> <1285> <7720> <1286> <7DBF> <1287> <7DEC> <1288> <9762> <1289> <9EB5> <128A> <6EC5> <128B> <8511> <128C> <51A5> <128D> <540D> <128E> <547D> <128F> <660E> <1290> <669D> <1291> <6927> <1292> <6E9F> <1293> <76BF> <1294> <7791> <1295> <8317> <1296> <84C2> <1297> <879F> <1298> <9169> <1299> <9298> <129A> <9CF4> <129B> <8882> <129C> <4FAE> <129D> <5192> <129E> <52DF> <129F> <59C6> <12A0> <5E3D> <12A1> <6155> <12A4> <66AE> <12A5> <67D0> <12A6> <6A21> <12A7> <6BCD> <12A8> <6BDB> <12A9> <725F> endbfchar 100 beginbfchar <12AA> <7261> <12AB> <7441> <12AC> <7738> <12AD> <77DB> <12AE> <8017> <12AF> <82BC> <12B0> <8305> <12B1> <8B00> <12B2> <8B28> <12B3> <8C8C> <12B4> <6728> <12B5> <6C90> <12B6> <7267> <12B7> <76EE> <12B8> <7766> <12B9> <7A46> <12BA> <9DA9> <12BB> <6B7F> <12BC> <6C92> <12BD> <5922> <12BE> <6726> <12BF> <8499> <12C0> <536F> <12C1> <5893> <12C2> <5999> <12C3> <5EDF> <12C4> <63CF> <12C5> <6634> <12C6> <6773> <12C7> <6E3A> <12C8> <732B> <12C9> <7AD7> <12CA> <82D7> <12CB> <9328> <12CC> <52D9> <12CD> <5DEB> <12CE> <61AE> <12CF> <61CB> <12D0> <620A> <12D1> <62C7> <12D2> <64AB> <12D3> <65E0> <12D4> <6959> <12D5> <6B66> <12D6> <6BCB> <12D7> <7121> <12D8> <73F7> <12D9> <755D> <12DA> <7E46> <12DB> <821E> <12DC> <8302> <12DD> <856A> <12DE> <8AA3> <12DF> <8CBF> <12E0> <9727> <12E1> <9D61> <12E2> <58A8> <12E3> <9ED8> <12E4> <5011> <12E5> <520E> <12E6> <543B> <12E7> <554F> <12E8> <6587> <12E9> <6C76> <12EC> <805E> <12ED> <868A> <12EE> <9580> <12EF> <96EF> <12F0> <52FF> <12F1> <6C95> <12F2> <7269> <12F3> <5473> <12F4> <5A9A> <12F5> <5C3E> <12F6> <5D4B> <12F7> <5F4C> <12F8> <5FAE> <12F9> <672A> <12FA> <68B6> <12FB> <6963> <12FC> <6E3C> <12FD> <6E44> <12FE> <7709> <12FF> <7C73> <1300> <7F8E> <1301> <8587> <1302> <8B0E> <1303> <8FF7> <1304> <9761> <1305> <9EF4> <1306> <5CB7> <1307> <60B6> <1308> <610D> <1309> <61AB> <130A> <654F> <130D> <6C11> <130E> <6CEF> <130F> <739F> <1310> <73C9> <1311> <7DE1> endbfchar 100 beginbfchar <1312> <9594> <1313> <5BC6> <1314> <871C> <1315> <8B10> <1316> <525D> <1317> <535A> <1318> <62CD> <1319> <640F> <131A> <64B2> <131B> <6734> <131C> <6A38> <131D> <6CCA> <131E> <73C0> <131F> <749E> <1320> <7B94> <1321> <7C95> <1322> <7E1B> <1323> <818A> <1324> <8236> <1325> <8584> <1326> <8FEB> <1327> <96F9> <1328> <99C1> <1329> <4F34> <132A> <534A> <132B> <53CD> <132C> <53DB> <132D> <62CC> <132E> <642C> <132F> <6500> <1330> <6591> <1331> <69C3> <1332> <6CEE> <1333> <6F58> <1334> <73ED> <1335> <7554> <1336> <7622> <1337> <76E4> <1338> <76FC> <1339> <78D0> <133A> <78FB> <133B> <792C> <133C> <7D46> <133D> <822C> <133E> <87E0> <133F> <8FD4> <1340> <9812> <1341> <98EF> <1342> <52C3> <1343> <62D4> <1344> <64A5> <1345> <6E24> <1346> <6F51> <1347> <767C> <1348> <8DCB> <1349> <91B1> <134A> <9262> <134B> <9AEE> <134C> <9B43> <134D> <5023> <134E> <508D> <134F> <574A> <1350> <59A8> <1351> <5C28> <1352> <5E47> <1353> <5F77> <1354> <623F> <1355> <653E> <1356> <65B9> <1357> <65C1> <1358> <6609> <1359> <678B> <135A> <699C> <135B> <6EC2> <135C> <78C5> <135D> <7D21> <135E> <80AA> <135F> <8180> <1360> <822B> <1361> <82B3> <1362> <84A1> <1363> <868C> <1364> <8A2A> <1365> <8B17> <1366> <90A6> <1367> <9632> <1368> <9F90> <1369> <500D> <136A> <4FF3> <136B> <57F9> <136C> <5F98> <136D> <62DC> <136E> <6392> <136F> <676F> <1370> <6E43> <1371> <7119> <1372> <76C3> <1373> <80CC> <1374> <80DA> <1377> <8919> endbfchar 100 beginbfchar <1378> <8CE0> <1379> <8F29> <137A> <914D> <137B> <966A> <137C> <4F2F> <137D> <4F70> <137E> <5E1B> <137F> <67CF> <1380> <6822> <1383> <9B44> <1384> <5E61> <1385> <6A0A> <1386> <7169> <1387> <71D4> <1388> <756A> <1389> <7E41> <138A> <8543> <138B> <85E9> <138C> <98DC> <138D> <4F10> <138E> <7B4F> <138F> <7F70> <1390> <95A5> <1391> <51E1> <1392> <5E06> <1393> <68B5> <1394> <6C3E> <1395> <6C4E> <1396> <6CDB> <1397> <72AF> <1398> <7BC4> <1399> <8303> <139A> <6CD5> <139B> <743A> <139C> <50FB> <139D> <5288> <139E> <58C1> <139F> <64D8> <13A0> <6A97> <13A1> <74A7> <13A2> <7656> <13A3> <78A7> <13A4> <8617> <13A5> <95E2> <13A6> <9739> <13A7> <535E> <13A8> <5F01> <13A9> <8B8A> <13AA> <8FA8> <13AB> <8FAF> <13AC> <908A> <13AD> <5225> <13AE> <77A5> <13AF> <9C49> <13B0> <9F08> <13B1> <4E19> <13B2> <5002> <13B3> <5175> <13B4> <5C5B> <13B5> <5E77> <13B6> <661E> <13B7> <663A> <13B8> <67C4> <13B9> <68C5> <13BA> <70B3> <13BB> <7501> <13BC> <75C5> <13BD> <79C9> <13BE> <7ADD> <13BF> <8F27> <13C0> <9920> <13C1> <9A08> <13C2> <4FDD> <13C3> <5821> <13C4> <5831> <13C5> <5BF6> <13C6> <666E> <13C7> <6B65> <13C8> <6D11> <13C9> <6E7A> <13CA> <6F7D> <13CB> <73E4> <13CC> <752B> <13CD> <83E9> <13CE> <88DC> <13CF> <8913> <13D0> <8B5C> <13D1> <8F14> <13D2> <4F0F> <13D3> <50D5> <13D4> <5310> <13D5> <535C> <13D6> <5B93> <13D7> <5FA9> <13D8> <670D> <13D9> <798F> <13DA> <8179> <13DB> <832F> <13DC> <8514> <13DD> <8907> endbfchar 100 beginbfchar <13DE> <8986> <13DF> <8F39> <13E0> <8F3B> <13E1> <99A5> <13E2> <9C12> <13E3> <672C> <13E4> <4E76> <13E5> <4FF8> <13E6> <5949> <13E7> <5C01> <13EA> <6367> <13EB> <68D2> <13EC> <70FD> <13ED> <71A2> <13EE> <742B> <13EF> <7E2B> <13F0> <84EC> <13F1> <8702> <13F2> <9022> <13F3> <92D2> <13F4> <9CF3> <13F5> <4E0D> <13F6> <4ED8> <13F7> <4FEF> <13F8> <5085> <13F9> <5256> <13FA> <526F> <13FB> <5426> <13FC> <5490> <13FD> <57E0> <13FE> <592B> <13FF> <5A66> <1400> <5B5A> <1401> <5B75> <1402> <5BCC> <1403> <5E9C> <1404> <6276> <1405> <6577> <1406> <65A7> <1407> <6D6E> <1408> <6EA5> <1409> <7236> <140A> <7B26> <140B> <7C3F> <140C> <7F36> <140F> <819A> <1410> <8240> <1411> <8299> <1412> <83A9> <1413> <8A03> <1414> <8CA0> <1415> <8CE6> <1416> <8CFB> <1417> <8D74> <1418> <8DBA> <1419> <90E8> <141A> <91DC> <141B> <961C> <141C> <9644> <141D> <99D9> <141E> <9CE7> <141F> <5317> <1420> <5206> <1421> <5429> <1422> <5674> <1423> <58B3> <1424> <5954> <1425> <596E> <1426> <5FFF> <1427> <61A4> <1428> <626E> <1429> <6610> <142A> <6C7E> <142B> <711A> <142C> <76C6> <142D> <7C89> <142E> <7CDE> <142F> <7D1B> <1430> <82AC> <1431> <8CC1> <1432> <96F0> <1433> <4F5B> <1434> <5F17> <1435> <5F7F> <1436> <62C2> <1437> <5D29> <1438> <670B> <1439> <68DA> <143A> <787C> <143B> <7E43> <143C> <9D6C> <143D> <4E15> <143E> <5099> <143F> <5315> <1440> <532A> <1441> <5351> <1442> <5983> <1443> <5A62> <1444> <5E87> <1445> <60B2> endbfchar 100 beginbfchar <1446> <618A> <1447> <6249> <1448> <6279> <1449> <6590> <144A> <6787> <144B> <69A7> <144C> <6BD4> <1450> <6CB8> <1451> <7435> <1452> <75FA> <1453> <7812> <1454> <7891> <1455> <79D5> <1456> <79D8> <1457> <7C83> <1458> <7DCB> <1459> <7FE1> <145A> <80A5> <145B> <813E> <145C> <81C2> <145D> <83F2> <145E> <871A> <145F> <88E8> <1460> <8AB9> <1461> <8B6C> <1462> <8CBB> <1463> <9119> <1464> <975E> <1465> <98DB> <1466> <9F3B> <1467> <56AC> <1468> <5B2A> <1469> <5F6C> <146A> <658C> <146B> <6AB3> <146C> <6BAF> <146D> <6D5C> <146E> <6FF1> <146F> <7015> <1470> <725D> <1471> <73AD> <1472> <8CA7> <1473> <8CD3> <1474> <983B> <1475> <6191> <1476> <6C37> <1477> <8058> <1478> <9A01> <1479> <4E4D> <147A> <4E8B> <147B> <4E9B> <147C> <4ED5> <147D> <4F3A> <147E> <4F3C> <147F> <4F7F> <1480> <4FDF> <1481> <50FF> <1482> <53F2> <1483> <53F8> <1484> <5506> <1485> <55E3> <1486> <56DB> <1487> <58EB> <1488> <5962> <1489> <5A11> <148A> <5BEB> <148B> <5BFA> <148C> <5C04> <148D> <5DF3> <148E> <5E2B> <148F> <5F99> <1490> <601D> <1491> <6368> <1492> <659C> <1493> <65AF> <1494> <67F6> <1495> <67FB> <1496> <68AD> <1497> <6B7B> <1498> <6C99> <1499> <6CD7> <149A> <6E23> <149B> <7009> <149C> <7345> <149D> <7802> <149E> <793E> <149F> <7940> <14A0> <7960> <14A1> <79C1> <14A2> <7BE9> <14A3> <7D17> <14A4> <7D72> <14A5> <8086> <14A6> <820D> <14A7> <838E> <14A8> <84D1> <14A9> <86C7> <14AA> <88DF> <14AB> <8A50> <14AC> <8A5E> endbfchar 100 beginbfchar <14AD> <8B1D> <14AE> <8CDC> <14AF> <8D66> <14B0> <8FAD> <14B1> <90AA> <14B2> <98FC> <14B3> <99DF> <14B4> <9E9D> <14B5> <524A> <14B6> <6714> <14B7> <5098> <14B8> <522A> <14B9> <5C71> <14BA> <6563> <14BB> <6C55> <14BC> <73CA> <14BD> <7523> <14BE> <759D> <14BF> <7B97> <14C0> <849C> <14C1> <9178> <14C2> <9730> <14C3> <4E77> <14C4> <6492> <14C5> <6BBA> <14C6> <715E> <14C7> <85A9> <14C8> <4E09> <14C9> <6749> <14CA> <68EE> <14CB> <6E17> <14CC> <829F> <14CD> <8518> <14CE> <886B> <14CF> <63F7> <14D0> <6F81> <14D1> <9212> <14D2> <98AF> <14D3> <4E0A> <14D4> <50B7> <14D5> <50CF> <14D6> <511F> <14D7> <5546> <14D8> <55AA> <14D9> <5617> <14DA> <5B40> <14DB> <5C19> <14DC> <5CE0> <14DD> <5E38> <14DE> <5E8A> <14DF> <5EA0> <14E0> <5EC2> <14E1> <60F3> <14E2> <6851> <14E3> <6A61> <14E4> <6E58> <14E5> <723D> <14E6> <7240> <14E7> <72C0> <14E8> <76F8> <14E9> <7965> <14EA> <7BB1> <14EB> <7FD4> <14EC> <88F3> <14ED> <89F4> <14EE> <8A73> <14EF> <8C61> <14F0> <8CDE> <14F1> <971C> <14F2> <585E> <14F3> <74BD> <14F4> <8CFD> <14F5> <55C7> <14F6> <7A61> <14F7> <7D22> <14F8> <8272> <14F9> <7272> <14FA> <751F> <14FB> <7525> <14FC> <7B19> <14FD> <5885> <14FE> <58FB> <14FF> <5DBC> <1500> <5E8F> <1501> <5EB6> <1502> <5F90> <1503> <6055> <1504> <6292> <1505> <637F> <1506> <654D> <1507> <6691> <1508> <66D9> <1509> <66F8> <150A> <6816> <150B> <68F2> <150C> <7280> <150D> <745E> <150E> <7B6E> <150F> <7D6E> <1510> <7DD6> endbfchar 100 beginbfchar <1511> <7F72> <1512> <80E5> <1513> <8212> <1514> <85AF> <1515> <897F> <1516> <8A93> <1517> <901D> <1518> <92E4> <1519> <9ECD> <151A> <9F20> <151B> <5915> <151C> <596D> <151D> <5E2D> <151E> <60DC> <151F> <6614> <1520> <6673> <1521> <6790> <1522> <6C50> <1523> <6DC5> <1524> <6F5F> <1525> <77F3> <1526> <78A9> <1527> <84C6> <1528> <91CB> <1529> <932B> <152A> <4ED9> <152B> <50CA> <152C> <5148> <152D> <5584> <152E> <5B0B> <152F> <5BA3> <1530> <6247> <1531> <657E> <1532> <65CB> <1533> <6E32> <1534> <717D> <1535> <7401> <1536> <7444> <1537> <7487> <1538> <74BF> <1539> <766C> <153A> <79AA> <153B> <7DDA> <153C> <7E55> <153D> <7FA8> <153E> <817A> <153F> <81B3> <1540> <8239> <1541> <861A> <1542> <87EC> <1543> <8A75> <1544> <8DE3> <1545> <9078> <1546> <9291> <1547> <9425> <1548> <994D> <1549> <9BAE> <154A> <5368> <154B> <5C51> <154C> <6954> <154D> <6CC4> <154E> <6D29> <154F> <6E2B> <1550> <820C> <1551> <859B> <1552> <893B> <1553> <8A2D> <1554> <8AAA> <1555> <96EA> <1556> <9F67> <1557> <5261> <1558> <66B9> <1559> <6BB2> <155A> <7E96> <155B> <87FE> <155C> <8D0D> <155D> <9583> <155E> <965D> <155F> <651D> <1560> <6D89> <1561> <71EE> <1562> <57CE> <1563> <59D3> <1564> <5BAC> <1565> <6027> <1566> <60FA> <1567> <6210> <1568> <661F> <1569> <665F> <156A> <7329> <156B> <73F9> <156C> <76DB> <156D> <7701> <156E> <7B6C> <156F> <8056> <1570> <8072> <1571> <8165> <1572> <8AA0> <1573> <9192> <1574> <4E16> endbfchar 100 beginbfchar <1575> <52E2> <1576> <6B72> <1577> <6D17> <1578> <7A05> <1579> <7B39> <157A> <7D30> <157B> <8CB0> <157C> <53EC> <157D> <562F> <157E> <5851> <157F> <5BB5> <1580> <5C0F> <1581> <5C11> <1582> <5DE2> <1583> <6240> <1584> <6383> <1585> <6414> <1586> <662D> <1587> <68B3> <1588> <6CBC> <1589> <6D88> <158A> <6EAF> <158B> <701F> <158C> <70A4> <158D> <71D2> <158E> <7526> <158F> <758F> <1590> <758E> <1591> <7619> <1592> <7B11> <1593> <7BE0> <1594> <7C2B> <1595> <7D20> <1596> <7D39> <1597> <852C> <1598> <856D> <1599> <8607> <159A> <8A34> <159B> <900D> <159C> <9061> <159D> <90B5> <159E> <92B7> <159F> <97F6> <15A0> <9A37> <15A1> <4FD7> <15A2> <5C6C> <15A3> <675F> <15A4> <6D91> <15A5> <7C9F> <15A6> <7E8C> <15A7> <8B16> <15A8> <8D16> <15A9> <901F> <15AA> <5B6B> <15AB> <5DFD> <15AC> <640D> <15AD> <84C0> <15AE> <905C> <15AF> <98E1> <15B0> <7387> <15B1> <5B8B> <15B2> <609A> <15B3> <677E> <15B4> <6DDE> <15B5> <8A1F> <15B6> <8AA6> <15B7> <9001> <15B8> <980C> <15B9> <5237> <15BA> <7051> <15BB> <788E> <15BC> <9396> <15BD> <8870> <15BE> <91D7> <15BF> <4FEE> <15C0> <53D7> <15C1> <55FD> <15C2> <56DA> <15C3> <5782> <15C4> <58FD> <15C5> <5AC2> <15C6> <5B88> <15C7> <5CAB> <15C8> <5CC0> <15C9> <5E25> <15CA> <6101> <15CB> <620D> <15CC> <624B> <15CD> <6388> <15CE> <641C> <15CF> <6536> <15D0> <6578> <15D1> <6A39> <15D2> <6B8A> <15D3> <6C34> <15D4> <6D19> <15D5> <6F31> <15D6> <71E7> <15D7> <72E9> <15D8> <7378> endbfchar 100 beginbfchar <15D9> <7407> <15DA> <74B2> <15DB> <7626> <15DC> <7761> <15DD> <79C0> <15DE> <7A57> <15DF> <7AEA> <15E0> <7CB9> <15E1> <7D8F> <15E2> <7DAC> <15E3> <7E61> <15E4> <7F9E> <15E5> <8129> <15E6> <8331> <15E7> <8490> <15E8> <84DA> <15E9> <85EA> <15EA> <8896> <15EB> <8AB0> <15EC> <8B90> <15ED> <8F38> <15EE> <9042> <15EF> <9083> <15F0> <916C> <15F1> <9296> <15F2> <92B9> <15F3> <968B> <15F6> <96D6> <15F7> <9700> <15F8> <9808> <15F9> <9996> <15FA> <9AD3> <15FB> <9B1A> <15FC> <53D4> <15FD> <587E> <15FE> <5919> <15FF> <5B70> <1600> <5BBF> <1601> <6DD1> <1602> <6F5A> <1603> <719F> <1604> <7421> <1605> <74B9> <1606> <8085> <1607> <83FD> <1608> <5DE1> <1609> <5F87> <160A> <5FAA> <160B> <6042> <160C> <65EC> <160D> <6812> <160E> <696F> <160F> <6A53> <1610> <6B89> <1611> <6D35> <1612> <6DF3> <1613> <73E3> <1614> <76FE> <1615> <77AC> <1616> <7B4D> <1617> <7D14> <1618> <8123> <1619> <821C> <161A> <8340> <161B> <84F4> <161C> <8563> <161D> <8A62> <161E> <8AC4> <161F> <9187> <1620> <931E> <1621> <9806> <1622> <99B4> <1623> <620C> <1624> <8853> <1625> <8FF0> <1626> <9265> <1627> <5D07> <1628> <5D27> <1629> <5D69> <162A> <745F> <162B> <819D> <162C> <8768> <162D> <6FD5> <162E> <62FE> <162F> <7FD2> <1630> <8936> <1631> <8972> <1632> <4E1E> <1633> <4E58> <1634> <50E7> <1635> <52DD> <1636> <5347> <1637> <627F> <1638> <6607> <1639> <7E69> <163A> <8805> <163B> <965E> <163C> <4F8D> <163D> <5319> <163E> <5636> endbfchar 100 beginbfchar <163F> <59CB> <1640> <5AA4> <1641> <5C38> <1642> <5C4E> <1643> <5C4D> <1644> <5E02> <1645> <5F11> <1646> <6043> <1647> <65BD> <1648> <662F> <1649> <6642> <164A> <67BE> <164B> <67F4> <164C> <731C> <164D> <77E2> <164E> <793A> <164F> <7FC5> <1650> <8494> <1651> <84CD> <1652> <8996> <1653> <8A66> <1654> <8A69> <1655> <8AE1> <1656> <8C55> <1657> <8C7A> <1658> <57F4> <1659> <5BD4> <165A> <5F0F> <165B> <606F> <165C> <62ED> <165D> <690D> <165E> <6B96> <165F> <6E5C> <1660> <7184> <1661> <7BD2> <1662> <8755> <1663> <8B58> <1664> <8EFE> <1665> <98DF> <1666> <98FE> <1667> <4F38> <1668> <4F81> <1669> <4FE1> <166A> <547B> <166B> <5A20> <166C> <5BB8> <166D> <613C> <166E> <65B0> <166F> <6668> <1670> <71FC> <1671> <7533> <1672> <795E> <1673> <7D33> <1674> <814E> <1675> <81E3> <1676> <8398> <1677> <85AA> <1678> <85CE> <1679> <8703> <167A> <8A0A> <167B> <8EAB> <167C> <8F9B> <167D> <8FC5> <167E> <5931> <167F> <5BA4> <1680> <5BE6> <1681> <6089> <1682> <5BE9> <1683> <5C0B> <1684> <5FC3> <1685> <6C81> <1686> <6DF1> <1687> <700B> <1688> <751A> <1689> <82AF> <168A> <8AF6> <168B> <4EC0> <168C> <5341> <168D> <96D9> <168E> <6C0F> <168F> <4E9E> <1690> <4FC4> <1691> <5152> <1692> <555E> <1693> <5A25> <1694> <5CE8> <1695> <6211> <1696> <7259> <1697> <82BD> <1698> <83AA> <1699> <86FE> <169A> <8859> <169B> <8A1D> <169C> <963F> <169D> <96C5> <169E> <9913> <169F> <9D09> <16A0> <9D5D> <16A1> <580A> <16A2> <5CB3> endbfchar 100 beginbfchar <16A3> <5DBD> <16A4> <5E44> <16A5> <60E1> <16A6> <6115> <16A7> <63E1> <16A8> <6A02> <16A9> <6E25> <16AA> <9102> <16AB> <9354> <16AC> <984E> <16AD> <9C10> <16AE> <9F77> <16AF> <5B89> <16B0> <5CB8> <16B1> <6309> <16B2> <664F> <16B3> <6848> <16B4> <773C> <16B5> <96C1> <16B6> <978D> <16B7> <9854> <16B8> <9B9F> <16B9> <65A1> <16BA> <8B01> <16BB> <8ECB> <16BC> <95BC> <16BD> <5535> <16BE> <5CA9> <16BF> <5DD6> <16C0> <5EB5> <16C1> <6697> <16C2> <764C> <16C3> <83F4> <16C4> <95C7> <16C5> <58D3> <16C6> <62BC> <16C7> <72CE> <16C8> <9D28> <16C9> <4EF0> <16CA> <592E> <16CB> <600F> <16CC> <663B> <16CD> <6B83> <16CE> <79E7> <16CF> <9D26> <16D0> <5393> <16D1> <54C0> <16D2> <57C3> <16D3> <5D16> <16D4> <611B> <16D5> <66D6> <16D6> <6DAF> <16D7> <788D> <16D8> <827E> <16D9> <9698> <16DA> <9744> <16DB> <5384> <16DC> <627C> <16DD> <6396> <16DE> <6DB2> <16DF> <7E0A> <16E0> <814B> <16E1> <984D> <16E2> <6AFB> <16E3> <7F4C> <16E4> <9DAF> <16E5> <9E1A> <16E6> <4E5F> <16E7> <503B> <16E8> <51B6> <16E9> <591C> <16EA> <60F9> <16EB> <63F6> <16EC> <6930> <16ED> <723A> <16EE> <8036> <16EF> <91CE> <16F0> <5F31> <16F1> <7D04> <16F2> <82E5> <16F3> <846F> <16F4> <84BB> <16F5> <85E5> <16F6> <8E8D> <16F7> <4F6F> <16F8> <58E4> <16F9> <5B43> <16FA> <6059> <16FB> <63DA> <16FC> <6518> <16FD> <656D> <16FE> <6698> <16FF> <694A> <1700> <6A23> <1701> <6D0B> <1702> <7001> <1703> <716C> <1704> <75D2> <1705> <760D> <1706> <79B3> endbfchar 100 beginbfchar <1707> <7A70> <1708> <7F8A> <1709> <8944> <170A> <8B93> <170B> <91C0> <170C> <967D> <170D> <990A> <170E> <5704> <170F> <5FA1> <1710> <65BC> <1711> <6F01> <1712> <7600> <1713> <79A6> <1714> <8A9E> <1715> <99AD> <1716> <9B5A> <1717> <9F6C> <1718> <5104> <1719> <61B6> <171A> <6291> <171B> <6A8D> <171C> <81C6> <171D> <5043> <171E> <5830> <171F> <5F66> <1720> <7109> <1721> <8A00> <1722> <8AFA> <1723> <5B7C> <1724> <8616> <1725> <4FFA> <1726> <513C> <1727> <56B4> <1728> <5944> <1729> <63A9> <172A> <6DF9> <172B> <5DAA> <172C> <696D> <172D> <5186> <172E> <4E88> <172F> <4F59> <1730> <5982> <1731> <6B5F> <1732> <6C5D> <1733> <74B5> <1734> <7916> <1735> <8207> <1736> <8245> <1737> <8339> <1738> <8F3F> <1739> <8F5D> <173A> <9918> <173B> <4EA6> <173C> <57DF> <173D> <5F79> <173E> <6613> <173F> <75AB> <1740> <7E79> <1741> <8B6F> <1742> <9006> <1743> <9A5B> <1744> <56A5> <1745> <5827> <1746> <59F8> <1747> <5A1F> <1748> <5BB4> <1749> <5EF6> <174A> <6350> <174B> <633B> <174C> <693D> <174D> <6C87> <174E> <6CBF> <174F> <6D8E> <1750> <6D93> <1751> <6DF5> <1752> <6F14> <1753> <70DF> <1754> <7136> <1755> <7159> <1756> <71C3> <1757> <71D5> <1758> <784F> <1759> <786F> <175A> <7B75> <175B> <7DE3> <175C> <7E2F> <175D> <884D> <175E> <8EDF> <175F> <925B> <1760> <9CF6> <1761> <6085> <1762> <6D85> <1763> <71B1> <1764> <95B1> <1765> <53AD> <1766> <67D3> <1767> <708E> <1768> <7130> <1769> <7430> <176A> <8276> endbfchar 100 beginbfchar <176B> <82D2> <176C> <95BB> <176D> <9AE5> <176E> <9E7D> <176F> <66C4> <1770> <71C1> <1771> <8449> <1772> <584B> <1773> <5DB8> <1774> <5F71> <1775> <6620> <1776> <668E> <1777> <6979> <1778> <69AE> <1779> <6C38> <177A> <6CF3> <177B> <6E36> <177C> <6F41> <177D> <6FDA> <177E> <701B> <177F> <702F> <1780> <7150> <1781> <71DF> <1782> <7370> <1783> <745B> <1784> <74D4> <1785> <76C8> <1786> <7A4E> <1787> <7E93> <1788> <82F1> <1789> <8A60> <178A> <8FCE> <178B> <9348> <178C> <9719> <178D> <4E42> <178E> <502A> <178F> <5208> <1790> <53E1> <1791> <66F3> <1792> <6C6D> <1793> <6FCA> <1794> <730A> <1795> <777F> <1796> <7A62> <1797> <82AE> <1798> <85DD> <1799> <8602> <179A> <88D4> <179B> <8A63> <179C> <8B7D> <179D> <8C6B> <179E> <92B3> <179F> <9713> <17A0> <9810> <17A1> <4E94> <17A2> <4F0D> <17A3> <4FC9> <17A4> <50B2> <17A5> <5348> <17A6> <543E> <17A7> <5433> <17A8> <55DA> <17A9> <5862> <17AA> <58BA> <17AB> <5967> <17AC> <5A1B> <17AD> <5BE4> <17AE> <609F> <17AF> <61CA> <17B0> <6556> <17B1> <65FF> <17B2> <6664> <17B3> <68A7> <17B4> <6C5A> <17B5> <6FB3> <17B6> <70CF> <17B7> <71AC> <17B8> <7352> <17B9> <7B7D> <17BA> <8708> <17BB> <8AA4> <17BC> <9C32> <17BD> <9F07> <17BE> <5C4B> <17BF> <6C83> <17C0> <7344> <17C1> <7389> <17C2> <923A> <17C3> <6EAB> <17C4> <7465> <17C5> <761F> <17C6> <7A69> <17C7> <7E15> <17C8> <860A> <17C9> <5140> <17CA> <58C5> <17CB> <64C1> <17CC> <74EE> <17CD> <7515> <17CE> <7670> endbfchar 100 beginbfchar <17CF> <7FC1> <17D0> <9095> <17D1> <96CD> <17D2> <9954> <17D3> <6E26> <17D4> <74E6> <17D7> <81E5> <17D8> <86D9> <17D9> <8778> <17DA> <8A1B> <17DB> <5A49> <17DC> <5B8C> <17DD> <5B9B> <17DE> <68A1> <17DF> <6900> <17E0> <6D63> <17E1> <73A9> <17E2> <7413> <17E3> <742C> <17E4> <7897> <17E5> <7DE9> <17E6> <7FEB> <17E7> <8118> <17E8> <8155> <17E9> <839E> <17EA> <8C4C> <17EB> <962E> <17EC> <9811> <17ED> <66F0> <17EE> <5F80> <17EF> <65FA> <17F0> <6789> <17F1> <6C6A> <17F2> <738B> <17F3> <502D> <17F4> <5A03> <17F5> <6B6A> <17F6> <77EE> <17F7> <5916> <17F8> <5D6C> <17F9> <5DCD> <17FA> <7325> <17FB> <754F> <17FC> <50E5> <17FD> <51F9> <17FE> <582F> <17FF> <592D> <1800> <5996> <1801> <59DA> <1802> <5BE5> <1803> <5DA2> <1804> <62D7> <1805> <6416> <1806> <6493> <1807> <64FE> <1808> <66DC> <1809> <6A48> <180A> <71FF> <180B> <7464> <180C> <7A88> <180D> <7AAF> <180E> <7E47> <180F> <7E5E> <1810> <8000> <1811> <8170> <1812> <87EF> <1813> <8981> <1814> <8B20> <1815> <9059> <1816> <9080> <1817> <9952> <1818> <617E> <1819> <6B32> <181A> <6D74> <181B> <7E1F> <181C> <8925> <181D> <8FB1> <181E> <4FD1> <181F> <50AD> <1820> <5197> <1821> <52C7> <1822> <57C7> <1823> <5889> <1824> <5BB9> <1825> <5EB8> <1826> <6142> <1827> <6995> <1828> <6D8C> <1829> <6E67> <182A> <6EB6> <182B> <7194> <182C> <7462> <182D> <7528> <182E> <752C> <182F> <8073> <1830> <8338> <1831> <84C9> <1832> <8E0A> <1833> <9394> <1834> <93DE> endbfchar 100 beginbfchar <1835> <4E8E> <1836> <4F51> <1837> <5076> <1838> <512A> <1839> <53C8> <183A> <53CB> <183B> <53F3> <183C> <5B87> <183D> <5BD3> <183E> <5C24> <183F> <611A> <1840> <6182> <1841> <65F4> <1842> <725B> <1843> <7397> <1844> <7440> <1845> <76C2> <1846> <7950> <1847> <7991> <1848> <79B9> <1849> <7D06> <184A> <7FBD> <184B> <828B> <184C> <85D5> <184D> <865E> <184E> <8FC2> <184F> <9047> <1850> <90F5> <1851> <91EA> <1852> <9685> <1855> <52D6> <1856> <5F67> <1857> <65ED> <1858> <6631> <1859> <682F> <185A> <715C> <185B> <7A36> <185C> <90C1> <185D> <980A> <185E> <4E91> <185F> <6A52> <1860> <6B9E> <1861> <6F90> <1862> <7189> <1863> <8018> <1864> <82B8> <1865> <8553> <1866> <904B> <1867> <9695> <1868> <96F2> <1869> <97FB> <186A> <851A> <186B> <9B31> <186C> <4E90> <186D> <718A> <186E> <96C4> <186F> <5143> <1870> <539F> <1871> <54E1> <1872> <5713> <1873> <5712> <1874> <57A3> <1875> <5A9B> <1876> <5AC4> <1877> <5BC3> <1878> <6028> <1879> <613F> <187A> <63F4> <187B> <6C85> <187C> <6D39> <187D> <6E72> <187E> <6E90> <187F> <7230> <1880> <733F> <1881> <7457> <1882> <82D1> <1883> <8881> <1884> <8F45> <1885> <9060> <1886> <9662> <1887> <9858> <1888> <9D1B> <1889> <6708> <188A> <8D8A> <188B> <925E> <188C> <4F4D> <188D> <5049> <188E> <50DE> <188F> <5371> <1890> <570D> <1891> <59D4> <1892> <5A01> <1893> <5C09> <1894> <6170> <1895> <6690> <1896> <6E2D> <1897> <7232> <1898> <744B> <1899> <7DEF> <189A> <80C3> endbfchar 100 beginbfchar <189B> <840E> <189C> <8466> <189D> <853F> <189E> <875F> <189F> <885B> <18A0> <8918> <18A1> <8B02> <18A2> <9055> <18A3> <97CB> <18A4> <9B4F> <18A5> <4E73> <18A6> <4F91> <18A7> <5112> <18A8> <516A> <18A9> <552F> <18AA> <55A9> <18AB> <5B7A> <18AC> <5BA5> <18AF> <5EBE> <18B0> <60A0> <18B1> <60DF> <18B4> <63C4> <18B5> <6538> <18B6> <6709> <18B7> <67D4> <18B8> <67DA> <18BB> <6CB9> <18BC> <6D27> <18BD> <6E38> <18BE> <6FE1> <18C1> <745C> <18C2> <7531> <18C3> <7652> <18C4> <7DAD> <18C5> <81FE> <18C6> <8438> <18C7> <88D5> <18C8> <8A98> <18C9> <8ADB> <18CA> <8AED> <18CB> <8E30> <18CC> <8E42> <18CD> <904A> <18CE> <903E> <18CF> <907A> <18D0> <9149> <18D1> <91C9> <18D2> <936E> <18D3> <5809> <18D4> <6BD3> <18D5> <8089> <18D6> <80B2> <18D7> <5141> <18D8> <596B> <18D9> <5C39> <18DA> <6F64> <18DB> <73A7> <18DC> <80E4> <18DD> <8D07> <18DE> <9217> <18DF> <958F> <18E0> <807F> <18E1> <620E> <18E2> <701C> <18E3> <7D68> <18E4> <878D> <18E5> <57A0> <18E6> <6069> <18E7> <6147> <18E8> <6BB7> <18E9> <8ABE> <18EA> <9280> <18EB> <96B1> <18EC> <4E59> <18ED> <541F> <18EE> <6DEB> <18EF> <852D> <18F0> <9670> <18F1> <97F3> <18F2> <98EE> <18F3> <63D6> <18F4> <6CE3> <18F5> <9091> <18F6> <51DD> <18F7> <61C9> <18F8> <81BA> <18F9> <9DF9> <18FA> <4F9D> <18FB> <501A> <18FC> <5100> <18FD> <5B9C> <18FE> <610F> <18FF> <61FF> <1900> <64EC> <1901> <6905> <1902> <6BC5> <1903> <7591> <1904> <77E3> <1905> <7FA9> <1906> <8264> endbfchar 100 beginbfchar <1907> <858F> <1908> <87FB> <1909> <8863> <190A> <8ABC> <190B> <8B70> <190C> <91AB> <190D> <4E8C> <190E> <4EE5> <190F> <4F0A> <1910> <5937> <1911> <59E8> <1912> <5DF2> <1913> <5F1B> <1914> <5F5B> <1915> <6021> <1916> <723E> <1917> <73E5> <1918> <7570> <1919> <75CD> <191A> <79FB> <191B> <800C> <191C> <8033> <191D> <8084> <191E> <82E1> <191F> <8351> <1920> <8CBD> <1921> <8CB3> <1922> <9087> <1923> <98F4> <1924> <990C> <1925> <7037> <1926> <76CA> <1927> <7FCA> <1928> <7FCC> <1929> <7FFC> <192A> <8B1A> <192B> <4EBA> <192C> <4EC1> <192D> <5203> <192E> <5370> <192F> <54BD> <1930> <56E0> <1931> <59FB> <1932> <5BC5> <1933> <5F15> <1934> <5FCD> <1935> <6E6E> <1936> <7D6A> <1937> <8335> <1938> <8693> <1939> <8A8D> <193A> <976D> <193B> <9777> <193C> <4E00> <193D> <4F5A> <193E> <4F7E> <193F> <58F9> <1940> <65E5> <1941> <6EA2> <1942> <9038> <1943> <93B0> <1944> <99B9> <1945> <4EFB> <1946> <58EC> <1947> <598A> <1948> <59D9> <1949> <6041> <194A> <7A14> <194B> <834F> <194C> <8CC3> <194D> <5165> <194E> <5344> <194F> <4ECD> <1950> <5269> <1951> <5B55> <1952> <82BF> <1953> <4ED4> <1954> <523A> <1955> <54A8> <1956> <59C9> <1957> <59FF> <1958> <5B50> <1959> <5B57> <195A> <5B5C> <195B> <6063> <195C> <6148> <195D> <6ECB> <195E> <7099> <195F> <716E> <1960> <7386> <1961> <74F7> <1962> <75B5> <1963> <78C1> <1964> <7D2B> <1965> <8005> <1966> <81EA> <1967> <8328> <1968> <8517> <1969> <85C9> <196A> <8AEE> endbfchar 100 beginbfchar <196B> <8CC7> <196C> <96CC> <196D> <4F5C> <196E> <52FA> <196F> <56BC> <1970> <65AB> <1971> <6628> <1972> <707C> <1973> <70B8> <1974> <7235> <1975> <7DBD> <1976> <828D> <1977> <914C> <1978> <96C0> <1979> <9D72> <197A> <5B71> <197B> <68E7> <197C> <6B98> <197D> <6F7A> <197E> <76DE> <197F> <5C91> <1980> <66AB> <1981> <6F5B> <1982> <7BB4> <1983> <7C2A> <1984> <8836> <1985> <96DC> <1986> <4E08> <1987> <4ED7> <1988> <5320> <1989> <5834> <198A> <58BB> <198B> <58EF> <198C> <596C> <198D> <5C07> <198E> <5E33> <198F> <5E84> <1990> <5F35> <1991> <638C> <1992> <66B2> <1993> <6756> <1994> <6A1F> <1995> <6AA3> <1996> <6B0C> <1997> <6F3F> <1998> <7246> <1999> <7350> <199A> <748B> <199B> <7AE0> <199C> <7CA7> <199D> <8178> <199E> <81DF> <199F> <81E7> <19A0> <838A> <19A1> <846C> <19A2> <8523> <19A3> <8594> <19A4> <85CF> <19A5> <88DD> <19A6> <8D13> <19A7> <91AC> <19A8> <9577> <19A9> <969C> <19AA> <518D> <19AB> <54C9> <19AC> <5728> <19AD> <5BB0> <19AE> <624D> <19AF> <6750> <19B0> <683D> <19B1> <6893> <19B2> <6E3D> <19B3> <6ED3> <19B4> <707D> <19B5> <7E21> <19B6> <88C1> <19B7> <8CA1> <19B8> <8F09> <19B9> <9F4B> <19BA> <9F4E> <19BB> <722D> <19BC> <7B8F> <19BD> <8ACD> <19BE> <931A> <19BF> <4F47> <19C0> <4F4E> <19C1> <5132> <19C2> <5480> <19C3> <59D0> <19C4> <5E95> <19C5> <62B5> <19C6> <6775> <19C7> <696E> <19C8> <6A17> <19C9> <6CAE> <19CA> <6E1A> <19CB> <72D9> <19CC> <732A> <19CD> <75BD> <19CE> <7BB8> endbfchar 100 beginbfchar <19CF> <7D35> <19D0> <82E7> <19D1> <83F9> <19D2> <8457> <19D3> <85F7> <19D4> <8A5B> <19D5> <8CAF> <19D6> <8E87> <19D7> <9019> <19D8> <90B8> <19D9> <96CE> <19DA> <9F5F> <19DB> <52E3> <19DC> <540A> <19DD> <5AE1> <19DE> <5BC2> <19DF> <6458> <19E0> <6575> <19E1> <6EF4> <19E2> <72C4> <19E3> <7684> <19E4> <7A4D> <19E5> <7B1B> <19E6> <7C4D> <19E7> <7E3E> <19E8> <7FDF> <19E9> <837B> <19EA> <8B2B> <19EB> <8CCA> <19EC> <8D64> <19ED> <8DE1> <19EE> <8E5F> <19EF> <8FEA> <19F0> <8FF9> <19F1> <9069> <19F2> <93D1> <19F3> <4F43> <19F4> <4F7A> <19F5> <50B3> <19F6> <5168> <19F7> <5178> <19F8> <524D> <19F9> <526A> <19FA> <5861> <19FB> <587C> <19FC> <5960> <19FD> <5C08> <19FE> <5C55> <19FF> <5EDB> <1A00> <609B> <1A01> <6230> <1A02> <6813> <1A03> <6BBF> <1A04> <6C08> <1A05> <6FB1> <1A06> <714E> <1A07> <7420> <1A08> <7530> <1A09> <7538> <1A0A> <7551> <1A0B> <7672> <1A0C> <7B4C> <1A0D> <7B8B> <1A0E> <7BAD> <1A0F> <7BC6> <1A10> <7E8F> <1A11> <8A6E> <1A12> <8F3E> <1A13> <8F49> <1A14> <923F> <1A15> <9293> <1A16> <9322> <1A17> <942B> <1A18> <96FB> <1A19> <985A> <1A1A> <986B> <1A1B> <991E> <1A1C> <5207> <1A1D> <622A> <1A1E> <6298> <1A1F> <6D59> <1A20> <7664> <1A21> <7ACA> <1A22> <7BC0> <1A23> <7D76> <1A24> <5360> <1A25> <5CBE> <1A26> <5E97> <1A27> <6F38> <1A28> <70B9> <1A29> <7C98> <1A2A> <9711> <1A2B> <9B8E> <1A2C> <9EDE> <1A2D> <63A5> <1A2E> <647A> <1A2F> <8776> <1A30> <4E01> <1A31> <4E95> <1A32> <4EAD> endbfchar 100 beginbfchar <1A33> <505C> <1A34> <5075> <1A35> <5448> <1A36> <59C3> <1A37> <5B9A> <1A38> <5E40> <1A39> <5EAD> <1A3A> <5EF7> <1A3B> <5F81> <1A3C> <60C5> <1A3D> <633A> <1A3E> <653F> <1A3F> <6574> <1A40> <65CC> <1A41> <6676> <1A42> <6678> <1A43> <67FE> <1A44> <6968> <1A45> <6A89> <1A46> <6B63> <1A47> <6C40> <1A48> <6DC0> <1A49> <6DE8> <1A4A> <6E1F> <1A4B> <6E5E> <1A4C> <701E> <1A4D> <70A1> <1A4E> <738E> <1A4F> <73FD> <1A50> <753A> <1A51> <775B> <1A52> <7887> <1A53> <798E> <1A54> <7A0B> <1A55> <7A7D> <1A56> <7CBE> <1A57> <7D8E> <1A58> <8247> <1A59> <8A02> <1A5A> <8AEA> <1A5B> <8C9E> <1A5C> <912D> <1A5D> <914A> <1A5E> <91D8> <1A5F> <9266> <1A60> <92CC> <1A61> <9320> <1A62> <9706> <1A63> <9756> <1A64> <975C> <1A65> <9802> <1A66> <9F0E> <1A67> <5236> <1A68> <5291> <1A69> <557C> <1A6A> <5824> <1A6B> <5E1D> <1A6C> <5F1F> <1A6D> <608C> <1A6E> <63D0> <1A6F> <68AF> <1A70> <6FDF> <1A71> <796D> <1A72> <7B2C> <1A73> <81CD> <1A74> <85BA> <1A75> <88FD> <1A76> <8AF8> <1A77> <8E44> <1A78> <918D> <1A79> <9664> <1A7A> <969B> <1A7B> <973D> <1A7C> <984C> <1A7D> <9F4A> <1A7E> <4FCE> <1A7F> <5146> <1A80> <51CB> <1A81> <52A9> <1A82> <5632> <1A83> <5F14> <1A84> <5F6B> <1A85> <63AA> <1A86> <64CD> <1A87> <65E9> <1A88> <6641> <1A89> <66FA> <1A8A> <66F9> <1A8B> <671D> <1A8C> <689D> <1A8D> <68D7> <1A8E> <69FD> <1A8F> <6F15> <1A90> <6F6E> <1A91> <7167> <1A92> <71E5> <1A93> <722A> <1A94> <74AA> <1A95> <773A> <1A96> <7956> endbfchar 100 beginbfchar <1A97> <795A> <1A98> <79DF> <1A99> <7A20> <1A9A> <7A95> <1A9B> <7C97> <1A9C> <7CDF> <1A9D> <7D44> <1A9E> <7E70> <1A9F> <8087> <1AA0> <85FB> <1AA1> <86A4> <1AA2> <8A54> <1AA3> <8ABF> <1AA4> <8D99> <1AA5> <8E81> <1AA6> <9020> <1AA7> <906D> <1AA8> <91E3> <1AA9> <963B> <1AAA> <96D5> <1AAB> <9CE5> <1AAC> <65CF> <1AAD> <7C07> <1AAE> <8DB3> <1AAF> <93C3> <1AB0> <5B58> <1AB1> <5C0A> <1AB2> <5352> <1AB3> <62D9> <1AB4> <731D> <1AB5> <5027> <1AB6> <5B97> <1AB7> <5F9E> <1AB8> <60B0> <1AB9> <616B> <1ABA> <68D5> <1ABB> <6DD9> <1ABC> <742E> <1ABD> <7A2E> <1ABE> <7D42> <1ABF> <7D9C> <1AC0> <7E31> <1AC1> <816B> <1AC2> <8E2A> <1AC3> <8E35> <1AC4> <937E> <1AC5> <9418> <1AC6> <4F50> <1AC7> <5750> <1AC8> <5DE6> <1AC9> <5EA7> <1ACA> <632B> <1ACB> <7F6A> <1ACC> <4E3B> <1ACD> <4F4F> <1ACE> <4F8F> <1ACF> <505A> <1AD0> <59DD> <1AD1> <80C4> <1AD2> <546A> <1AD3> <5468> <1AD4> <55FE> <1AD5> <594F> <1AD6> <5B99> <1AD7> <5DDE> <1AD8> <5EDA> <1AD9> <665D> <1ADA> <6731> <1ADB> <67F1> <1ADC> <682A> <1ADD> <6CE8> <1ADE> <6D32> <1ADF> <6E4A> <1AE0> <6F8D> <1AE1> <70B7> <1AE2> <73E0> <1AE3> <7587> <1AE4> <7C4C> <1AE5> <7D02> <1AE6> <7D2C> <1AE7> <7DA2> <1AE8> <821F> <1AE9> <86DB> <1AEA> <8A3B> <1AEB> <8A85> <1AEC> <8D70> <1AED> <8E8A> <1AEE> <8F33> <1AEF> <9031> <1AF0> <914E> <1AF1> <9152> <1AF2> <9444> <1AF3> <99D0> <1AF4> <7AF9> <1AF5> <7CA5> <1AF6> <4FCA> <1AF7> <5101> <1AF8> <51C6> <1AF9> <57C8> <1AFA> <5BEF> endbfchar 100 beginbfchar <1AFB> <5CFB> <1AFC> <6659> <1AFD> <6A3D> <1AFE> <6D5A> <1AFF> <6E96> <1B00> <6FEC> <1B01> <710C> <1B02> <756F> <1B03> <7AE3> <1B04> <8822> <1B05> <9021> <1B06> <9075> <1B07> <96CB> <1B08> <99FF> <1B09> <8301> <1B0A> <4E2D> <1B0B> <4EF2> <1B0C> <8846> <1B0D> <91CD> <1B0E> <537D> <1B0F> <6ADB> <1B10> <696B> <1B11> <6C41> <1B12> <847A> <1B13> <589E> <1B14> <618E> <1B15> <66FE> <1B16> <62EF> <1B17> <70DD> <1B18> <7511> <1B19> <75C7> <1B1A> <7E52> <1B1B> <84B8> <1B1C> <8B49> <1B1D> <8D08> <1B1E> <4E4B> <1B1F> <53EA> <1B20> <54AB> <1B21> <5730> <1B22> <5740> <1B23> <5FD7> <1B24> <6301> <1B25> <6307> <1B26> <646F> <1B27> <652F> <1B28> <65E8> <1B29> <667A> <1B2A> <679D> <1B2B> <67B3> <1B2C> <6B62> <1B2D> <6C60> <1B2E> <6C9A> <1B2F> <6F2C> <1B30> <77E5> <1B31> <7825> <1B32> <7949> <1B33> <7957> <1B34> <7D19> <1B35> <80A2> <1B36> <8102> <1B37> <81F3> <1B38> <829D> <1B39> <82B7> <1B3A> <8718> <1B3B> <8A8C> <1B3C> <8D04> <1B3D> <8DBE> <1B3E> <9072> <1B3F> <76F4> <1B40> <7A19> <1B41> <7A37> <1B42> <7E54> <1B43> <8077> <1B44> <5507> <1B45> <55D4> <1B46> <5875> <1B47> <632F> <1B48> <6422> <1B49> <6649> <1B4A> <664B> <1B4B> <686D> <1B4C> <699B> <1B4D> <6B84> <1B4E> <6D25> <1B4F> <6EB1> <1B50> <73CD> <1B51> <7468> <1B52> <74A1> <1B53> <755B> <1B54> <75B9> <1B55> <76E1> <1B56> <771E> <1B57> <778B> <1B58> <79E6> <1B59> <7E09> <1B5A> <7E1D> <1B5B> <81FB> <1B5C> <852F> <1B5D> <8897> <1B5E> <8A3A> endbfchar 100 beginbfchar <1B5F> <8CD1> <1B60> <8EEB> <1B61> <8FB0> <1B62> <9032> <1B63> <93AD> <1B64> <9663> <1B65> <9673> <1B66> <9707> <1B67> <4F84> <1B68> <53F1> <1B69> <59EA> <1B6A> <5AC9> <1B6B> <5E19> <1B6C> <684E> <1B6D> <74C6> <1B6E> <75BE> <1B6F> <79E9> <1B70> <7A92> <1B71> <81A3> <1B72> <86ED> <1B73> <8CEA> <1B74> <8DCC> <1B75> <8FED> <1B76> <659F> <1B77> <6715> <1B78> <57F7> <1B79> <6F57> <1B7A> <7DDD> <1B7B> <8F2F> <1B7C> <93F6> <1B7D> <96C6> <1B7E> <5FB5> <1B7F> <61F2> <1B80> <6F84> <1B81> <4E14> <1B82> <4F98> <1B83> <501F> <1B84> <53C9> <1B85> <55DF> <1B86> <5D6F> <1B87> <5DEE> <1B88> <6B21> <1B89> <6B64> <1B8A> <78CB> <1B8B> <7B9A> <1B8C> <8E49> <1B8D> <8ECA> <1B8E> <906E> <1B8F> <6349> <1B90> <643E> <1B91> <7740> <1B92> <7A84> <1B93> <932F> <1B94> <947F> <1B95> <9F6A> <1B96> <64B0> <1B97> <6FAF> <1B98> <71E6> <1B99> <74A8> <1B9A> <74DA> <1B9B> <7AC4> <1B9C> <7C12> <1B9D> <7E82> <1B9E> <7CB2> <1B9F> <7E98> <1BA0> <8B9A> <1BA1> <8D0A> <1BA2> <947D> <1BA3> <9910> <1BA4> <994C> <1BA5> <5239> <1BA6> <5BDF> <1BA7> <64E6> <1BA8> <672D> <1BA9> <7D2E> <1BAA> <50ED> <1BAB> <53C3> <1BAC> <5879> <1BAF> <61FA> <1BB0> <65AC> <1BB1> <7AD9> <1BB2> <8B92> <1BB3> <8B96> <1BB4> <5009> <1BB5> <5021> <1BB6> <5275> <1BB7> <5531> <1BB8> <5A3C> <1BB9> <5EE0> <1BBA> <5F70> <1BBB> <6134> <1BBC> <655E> <1BBD> <660C> <1BBE> <6636> <1BBF> <66A2> <1BC0> <69CD> <1BC1> <6EC4> <1BC2> <6F32> <1BC3> <7316> <1BC4> <7621> endbfchar 100 beginbfchar <1BC5> <7A93> <1BC6> <8139> <1BC7> <8259> <1BC8> <83D6> <1BC9> <84BC> <1BCA> <50B5> <1BCB> <57F0> <1BCC> <5BC0> <1BCD> <5BE8> <1BCE> <5F69> <1BCF> <63A1> <1BD0> <7826> <1BD1> <7DB5> <1BD2> <83DC> <1BD3> <8521> <1BD4> <91C7> <1BD5> <91F5> <1BD6> <518A> <1BD7> <67F5> <1BD8> <7B56> <1BD9> <8CAC> <1BDA> <51C4> <1BDB> <59BB> <1BDC> <60BD> <1BDD> <8655> <1BDE> <501C> <1BDF> <5254> <1BE0> <5C3A> <1BE1> <617D> <1BE2> <621A> <1BE3> <62D3> <1BE4> <64F2> <1BE5> <65A5> <1BE6> <6ECC> <1BE7> <7620> <1BE8> <810A> <1BE9> <8E60> <1BEA> <965F> <1BEB> <96BB> <1BEC> <4EDF> <1BED> <5343> <1BEE> <5598> <1BEF> <5929> <1BF0> <5DDD> <1BF1> <64C5> <1BF2> <6CC9> <1BF3> <6DFA> <1BF4> <7394> <1BF5> <7A7F> <1BF6> <821B> <1BF7> <85A6> <1BF8> <8CE4> <1BF9> <8E10> <1BFA> <9077> <1BFB> <91E7> <1BFC> <95E1> <1BFD> <9621> <1BFE> <97C6> <1BFF> <51F8> <1C00> <54F2> <1C01> <5586> <1C02> <5FB9> <1C03> <64A4> <1C04> <6F88> <1C05> <7DB4> <1C06> <8F1F> <1C07> <8F4D> <1C08> <9435> <1C09> <50C9> <1C0A> <5C16> <1C0B> <6CBE> <1C0C> <6DFB> <1C0D> <751B> <1C0E> <77BB> <1C0F> <7C3D> <1C10> <7C64> <1C11> <8A79> <1C12> <8AC2> <1C13> <581E> <1C14> <59BE> <1C15> <5E16> <1C16> <6377> <1C17> <7252> <1C18> <758A> <1C19> <776B> <1C1A> <8ADC> <1C1B> <8CBC> <1C1C> <8F12> <1C1D> <5EF3> <1C1E> <6674> <1C1F> <6DF8> <1C20> <807D> <1C21> <83C1> <1C22> <8ACB> <1C23> <9751> <1C24> <9BD6> <1C25> <5243> <1C26> <66FF> <1C27> <6D95> <1C28> <6EEF> endbfchar 100 beginbfchar <1C29> <7DE0> <1C2A> <8AE6> <1C2B> <902E> <1C2C> <905E> <1C2D> <9AD4> <1C2E> <521D> <1C2F> <527F> <1C30> <54E8> <1C31> <6194> <1C32> <6284> <1C33> <62DB> <1C34> <68A2> <1C35> <6912> <1C36> <695A> <1C37> <6A35> <1C38> <7092> <1C39> <7126> <1C3A> <785D> <1C3B> <7901> <1C3C> <790E> <1C3D> <79D2> <1C3E> <7A0D> <1C3F> <8096> <1C40> <8278> <1C41> <82D5> <1C42> <8349> <1C43> <8549> <1C44> <8C82> <1C45> <8D85> <1C46> <9162> <1C47> <918B> <1C48> <91AE> <1C49> <4FC3> <1C4A> <56D1> <1C4B> <71ED> <1C4C> <77D7> <1C4D> <8700> <1C4E> <89F8> <1C4F> <5BF8> <1C50> <5FD6> <1C51> <6751> <1C52> <90A8> <1C53> <53E2> <1C54> <585A> <1C55> <5BF5> <1C56> <60A4> <1C57> <6181> <1C58> <6460> <1C59> <7E3D> <1C5A> <8070> <1C5B> <8525> <1C5C> <9283> <1C5D> <64AE> <1C5E> <50AC> <1C5F> <5D14> <1C60> <6700> <1C61> <589C> <1C62> <62BD> <1C63> <63A8> <1C64> <690E> <1C65> <6978> <1C66> <6A1E> <1C67> <6E6B> <1C68> <76BA> <1C69> <79CB> <1C6A> <82BB> <1C6B> <8429> <1C6C> <8ACF> <1C6D> <8DA8> <1C6E> <8FFD> <1C6F> <9112> <1C70> <914B> <1C71> <919C> <1C72> <9310> <1C73> <9318> <1C74> <939A> <1C75> <96DB> <1C76> <9A36> <1C77> <9C0D> <1C78> <4E11> <1C79> <755C> <1C7A> <795D> <1C7B> <7AFA> <1C7C> <7B51> <1C7D> <7BC9> <1C7E> <7E2E> <1C7F> <84C4> <1C80> <8E59> <1C81> <8E74> <1C82> <8EF8> <1C83> <9010> <1C84> <6625> <1C85> <693F> <1C86> <7443> <1C87> <51FA> <1C88> <672E> <1C89> <9EDC> <1C8A> <5145> <1C8B> <5FE0> <1C8C> <6C96> endbfchar 100 beginbfchar <1C8D> <87F2> <1C8E> <885D> <1C8F> <8877> <1C90> <60B4> <1C91> <81B5> <1C92> <8403> <1C93> <8D05> <1C94> <53D6> <1C95> <5439> <1C96> <5634> <1C97> <5A36> <1C98> <5C31> <1C99> <708A> <1C9A> <7FE0> <1C9B> <805A> <1C9C> <8106> <1C9D> <81ED> <1C9E> <8DA3> <1C9F> <9189> <1CA0> <9A5F> <1CA1> <9DF2> <1CA2> <5074> <1CA3> <4EC4> <1CA4> <53A0> <1CA5> <60FB> <1CA6> <6E2C> <1CA7> <5C64> <1CA8> <4F88> <1CA9> <5024> <1CAA> <55E4> <1CAB> <5CD9> <1CAC> <5E5F> <1CAD> <6065> <1CAE> <6894> <1CAF> <6CBB> <1CB0> <6DC4> <1CB1> <71BE> <1CB2> <75D4> <1CB3> <75F4> <1CB4> <7661> <1CB5> <7A1A> <1CB6> <7A49> <1CB7> <7DC7> <1CB8> <7DFB> <1CB9> <7F6E> <1CBA> <81F4> <1CBB> <86A9> <1CBC> <8F1C> <1CBD> <96C9> <1CBE> <99B3> <1CBF> <9F52> <1CC0> <5247> <1CC1> <52C5> <1CC2> <98ED> <1CC3> <89AA> <1CC4> <4E03> <1CC5> <67D2> <1CC6> <6F06> <1CC7> <4FB5> <1CC8> <5BE2> <1CC9> <6795> <1CCA> <6C88> <1CCB> <6D78> <1CCC> <741B> <1CCD> <7827> <1CCE> <91DD> <1CCF> <937C> <1CD0> <87C4> <1CD1> <79E4> <1CD2> <7A31> <1CD3> <5FEB> <1CD4> <4ED6> <1CD5> <54A4> <1CD6> <553E> <1CD7> <58AE> <1CD8> <59A5> <1CD9> <60F0> <1CDA> <6253> <1CDB> <62D6> <1CDC> <6736> <1CDD> <6955> <1CDE> <8235> <1CDF> <9640> <1CE0> <99B1> <1CE1> <99DD> <1CE2> <502C> <1CE3> <5353> <1CE4> <5544> <1CE5> <577C> <1CE6> <6258> <1CE7> <64E2> <1CE8> <666B> <1CE9> <67DD> <1CEA> <6FC1> <1CEB> <6FEF> <1CEC> <7422> <1CED> <7438> <1CEE> <8A17> <1CEF> <9438> <1CF0> <5451> endbfchar 100 beginbfchar <1CF1> <5606> <1CF2> <5766> <1CF3> <5F48> <1CF4> <619A> <1CF5> <6B4E> <1CF6> <7058> <1CF7> <70AD> <1CF8> <7DBB> <1CF9> <8A95> <1CFA> <596A> <1CFB> <812B> <1CFC> <63A2> <1CFD> <7708> <1CFE> <803D> <1CFF> <8CAA> <1D00> <5854> <1D01> <642D> <1D02> <69BB> <1D03> <5B95> <1D04> <5E11> <1D05> <6E6F> <1D06> <8569> <1D07> <514C> <1D08> <53F0> <1D09> <592A> <1D0A> <6020> <1D0B> <614B> <1D0C> <6B86> <1D0D> <6C70> <1D0E> <6CF0> <1D0F> <7B1E> <1D10> <80CE> <1D11> <82D4> <1D12> <8DC6> <1D13> <90B0> <1D14> <98B1> <1D15> <64C7> <1D16> <6FA4> <1D17> <6491> <1D18> <6504> <1D19> <514E> <1D1A> <5410> <1D1B> <571F> <1D1C> <8A0E> <1D1D> <615F> <1D1E> <6876> <1D1F> <75DB> <1D20> <7B52> <1D21> <7D71> <1D22> <901A> <1D23> <5806> <1D24> <69CC> <1D25> <817F> <1D26> <892A> <1D27> <9000> <1D28> <9839> <1D29> <5078> <1D2A> <5957> <1D2B> <59AC> <1D2C> <6295> <1D2D> <900F> <1D2E> <9B2A> <1D2F> <615D> <1D30> <7279> <1D31> <95D6> <1D32> <5761> <1D33> <5A46> <1D34> <5DF4> <1D35> <628A> <1D36> <64AD> <1D37> <64FA> <1D38> <6777> <1D39> <6CE2> <1D3A> <6D3E> <1D3B> <722C> <1D3C> <7436> <1D3D> <7834> <1D3E> <7F77> <1D3F> <82AD> <1D40> <8DDB> <1D41> <9817> <1D42> <5224> <1D43> <5742> <1D44> <677F> <1D45> <7248> <1D46> <74E3> <1D47> <8CA9> <1D48> <8FA6> <1D49> <9211> <1D4A> <962A> <1D4B> <516B> <1D4C> <53ED> <1D4D> <634C> <1D4E> <4F69> <1D4F> <5504> <1D50> <6096> <1D51> <6557> <1D52> <6C9B> <1D53> <6D7F> <1D54> <724C> endbfchar 100 beginbfchar <1D55> <72FD> <1D56> <7A17> <1D57> <8987> <1D58> <8C9D> <1D59> <5F6D> <1D5A> <6F8E> <1D5B> <70F9> <1D5C> <81A8> <1D5D> <610E> <1D5E> <4FBF> <1D5F> <504F> <1D60> <6241> <1D61> <7247> <1D62> <7BC7> <1D63> <7DE8> <1D64> <7FE9> <1D65> <904D> <1D66> <97AD> <1D67> <9A19> <1D68> <8CB6> <1D69> <576A> <1D6A> <5E73> <1D6B> <67B0> <1D6C> <840D> <1D6D> <8A55> <1D6E> <5420> <1D6F> <5B16> <1D70> <5E63> <1D71> <5EE2> <1D72> <5F0A> <1D73> <6583> <1D74> <80BA> <1D75> <853D> <1D76> <9589> <1D77> <965B> <1D78> <4F48> <1D79> <5305> <1D7A> <530D> <1D7B> <530F> <1D7C> <5486> <1D7D> <54FA> <1D7E> <5703> <1D7F> <5E03> <1D80> <6016> <1D81> <629B> <1D82> <62B1> <1D83> <6355> <1D84> <6CE1> <1D85> <6D66> <1D86> <75B1> <1D87> <7832> <1D88> <80DE> <1D89> <812F> <1D8A> <82DE> <1D8B> <8461> <1D8C> <84B2> <1D8D> <888D> <1D8E> <8912> <1D8F> <900B> <1D90> <92EA> <1D91> <98FD> <1D92> <9B91> <1D93> <5E45> <1D94> <66B4> <1D95> <66DD> <1D96> <7011> <1D97> <7206> <1D98> <4FF5> <1D99> <527D> <1D9A> <5F6A> <1D9B> <6153> <1D9C> <6753> <1D9D> <6A19> <1D9E> <6F02> <1D9F> <74E2> <1DA0> <7968> <1DA1> <8868> <1DA2> <8C79> <1DA3> <98C7> <1DA4> <98C4> <1DA5> <9A43> <1DA6> <54C1> <1DA7> <7A1F> <1DA8> <6953> <1DA9> <8AF7> <1DAA> <8C4A> <1DAB> <98A8> <1DAC> <99AE> <1DAD> <5F7C> <1DAE> <62AB> <1DAF> <75B2> <1DB0> <76AE> <1DB1> <88AB> <1DB2> <907F> <1DB3> <9642> <1DB4> <5339> <1DB5> <5F3C> <1DB6> <5FC5> <1DB7> <6CCC> <1DB8> <73CC> endbfchar 100 beginbfchar <1DB9> <7562> <1DBA> <758B> <1DBB> <7B46> <1DBC> <82FE> <1DBD> <999D> <1DBE> <4E4F> <1DBF> <903C> <1DC0> <4E0B> <1DC1> <4F55> <1DC2> <53A6> <1DC3> <590F> <1DC4> <5EC8> <1DC5> <6630> <1DC6> <6CB3> <1DC7> <7455> <1DC8> <8377> <1DC9> <8766> <1DCA> <8CC0> <1DCB> <9050> <1DCC> <971E> <1DCD> <9C15> <1DCE> <58D1> <1DCF> <5B78> <1DD0> <8650> <1DD1> <8B14> <1DD2> <9DB4> <1DD3> <5BD2> <1DD4> <6068> <1DD5> <608D> <1DD6> <65F1> <1DD7> <6C57> <1DD8> <6F22> <1DD9> <6FA3> <1DDA> <701A> <1DDB> <7F55> <1DDC> <7FF0> <1DDF> <9650> <1DE0> <97D3> <1DE1> <5272> <1DE2> <8F44> <1DE3> <51FD> <1DE4> <542B> <1DE5> <54B8> <1DE6> <5563> <1DE7> <558A> <1DE8> <6ABB> <1DE9> <6DB5> <1DEA> <7DD8> <1DEB> <8266> <1DEC> <929C> <1DED> <9677> <1DEE> <9E79> <1DEF> <5408> <1DF0> <54C8> <1DF1> <76D2> <1DF2> <86E4> <1DF3> <95A4> <1DF4> <95D4> <1DF5> <965C> <1DF6> <4EA2> <1DF7> <4F09> <1DF8> <59EE> <1DF9> <5AE6> <1DFA> <5DF7> <1DFB> <6052> <1DFC> <6297> <1DFD> <676D> <1DFE> <6841> <1DFF> <6C86> <1E00> <6E2F> <1E01> <7F38> <1E02> <809B> <1E03> <822A> <1E04> <9805> <1E05> <4EA5> <1E06> <5055> <1E07> <54B3> <1E08> <5793> <1E09> <595A> <1E0A> <5B69> <1E0B> <5BB3> <1E0C> <61C8> <1E0D> <6977> <1E0E> <6D77> <1E0F> <7023> <1E10> <87F9> <1E11> <89E3> <1E12> <8A72> <1E13> <8AE7> <1E14> <9082> <1E15> <99ED> <1E16> <9AB8> <1E17> <52BE> <1E18> <6838> <1E19> <5016> <1E1A> <5E78> <1E1B> <674F> <1E1C> <8347> <1E1D> <884C> <1E1E> <4EAB> endbfchar 100 beginbfchar <1E1F> <5411> <1E20> <56AE> <1E21> <73E6> <1E22> <9115> <1E23> <97FF> <1E24> <9909> <1E25> <9957> <1E26> <9999> <1E27> <5653> <1E28> <589F> <1E29> <865B> <1E2A> <8A31> <1E2B> <61B2> <1E2C> <6AF6> <1E2D> <737B> <1E2E> <8ED2> <1E2F> <6B47> <1E30> <96AA> <1E31> <9A57> <1E32> <5955> <1E33> <7200> <1E34> <8D6B> <1E35> <9769> <1E36> <4FD4> <1E37> <5CF4> <1E38> <5F26> <1E39> <61F8> <1E3A> <665B> <1E3B> <6CEB> <1E3C> <70AB> <1E3D> <7384> <1E3E> <73B9> <1E3F> <73FE> <1E40> <7729> <1E41> <774D> <1E42> <7D43> <1E43> <7D62> <1E44> <7E23> <1E45> <8237> <1E46> <8852> <1E47> <8CE2> <1E48> <9249> <1E49> <986F> <1E4A> <5B51> <1E4B> <7A74> <1E4C> <8840> <1E4D> <9801> <1E4E> <5ACC> <1E4F> <4FE0> <1E50> <5354> <1E51> <593E> <1E52> <5CFD> <1E53> <633E> <1E54> <6D79> <1E55> <72F9> <1E56> <8105> <1E57> <8107> <1E58> <83A2> <1E59> <92CF> <1E5A> <9830> <1E5B> <4EA8> <1E5C> <5144> <1E5D> <5211> <1E5E> <578B> <1E5F> <5F62> <1E60> <6CC2> <1E61> <6ECE> <1E62> <7005> <1E63> <7050> <1E64> <70AF> <1E65> <7192> <1E66> <73E9> <1E67> <7469> <1E68> <834A> <1E69> <87A2> <1E6A> <8861> <1E6B> <9008> <1E6C> <90A2> <1E6D> <93A3> <1E6E> <99A8> <1E6F> <516E> <1E70> <5F57> <1E71> <60E0> <1E72> <6167> <1E73> <66B3> <1E74> <8559> <1E75> <8E4A> <1E76> <91AF> <1E77> <978B> <1E78> <4E4E> <1E79> <4E92> <1E7A> <547C> <1E7B> <58D5> <1E7C> <58FA> <1E7D> <597D> <1E7E> <5CB5> <1E7F> <5F27> <1E80> <6236> <1E81> <6248> <1E82> <660A> endbfchar 100 beginbfchar <1E83> <6667> <1E84> <6BEB> <1E85> <6D69> <1E86> <6DCF> <1E87> <6E56> <1E88> <6EF8> <1E89> <6F94> <1E8A> <6FE0> <1E8B> <6FE9> <1E8C> <705D> <1E8D> <72D0> <1E8E> <7425> <1E8F> <745A> <1E90> <74E0> <1E91> <7693> <1E92> <795C> <1E93> <7CCA> <1E94> <7E1E> <1E95> <80E1> <1E96> <82A6> <1E97> <846B> <1E98> <84BF> <1E99> <864E> <1E9A> <865F> <1E9B> <8774> <1E9C> <8B77> <1E9D> <8C6A> <1E9E> <93AC> <1E9F> <9800> <1EA0> <9865> <1EA1> <60D1> <1EA2> <6216> <1EA3> <9177> <1EA4> <5A5A> <1EA5> <660F> <1EA6> <6DF7> <1EA7> <6E3E> <1EA8> <743F> <1EA9> <9B42> <1EAA> <5FFD> <1EAB> <60DA> <1EAC> <7B0F> <1EAD> <54C4> <1EAE> <5F18> <1EAF> <6C5E> <1EB0> <6CD3> <1EB1> <6D2A> <1EB2> <70D8> <1EB3> <7D05> <1EB4> <8679> <1EB5> <8A0C> <1EB6> <9D3B> <1EB7> <5316> <1EB8> <548C> <1EB9> <5B05> <1EBA> <6A3A> <1EBB> <706B> <1EBC> <7575> <1EBD> <798D> <1EBE> <79BE> <1EBF> <82B1> <1EC0> <83EF> <1EC1> <8A71> <1EC2> <8B41> <1EC3> <8CA8> <1EC4> <9774> <1EC5> <64F4> <1EC6> <652B> <1EC9> <7A6B> <1ECA> <4E38> <1ECB> <559A> <1ECC> <5950> <1ECD> <5BA6> <1ECE> <5E7B> <1ECF> <60A3> <1ED0> <63DB> <1ED1> <6B61> <1ED2> <6665> <1ED3> <6853> <1ED4> <6E19> <1ED5> <7165> <1ED6> <74B0> <1ED7> <7D08> <1ED8> <9084> <1ED9> <9A69> <1EDA> <9C25> <1EDB> <6D3B> <1EDC> <6ED1> <1EDD> <733E> <1EDE> <8C41> <1EDF> <95CA> <1EE0> <51F0> <1EE1> <5E4C> <1EE2> <5FA8> <1EE3> <604D> <1EE4> <60F6> <1EE5> <6130> <1EE6> <614C> <1EE9> <69A5> <1EEA> <6CC1> endbfchar 100 beginbfchar <1EEB> <6E5F> <1EEC> <6EC9> <1EED> <6F62> <1EEE> <714C> <1EEF> <749C> <1EF0> <7687> <1EF1> <7BC1> <1EF2> <7C27> <1EF3> <8352> <1EF4> <8757> <1EF5> <9051> <1EF6> <968D> <1EF7> <9EC3> <1EF8> <532F> <1EF9> <56DE> <1EFA> <5EFB> <1EFB> <5F8A> <1EFC> <6062> <1EFD> <6094> <1EFE> <61F7> <1EFF> <6666> <1F00> <6703> <1F01> <6A9C> <1F02> <6DEE> <1F03> <6FAE> <1F04> <7070> <1F05> <736A> <1F06> <7E6A> <1F07> <81BE> <1F08> <8334> <1F09> <86D4> <1F0A> <8AA8> <1F0B> <8CC4> <1F0C> <5283> <1F0D> <7372> <1F0E> <5B96> <1F0F> <6A6B> <1F10> <9404> <1F11> <54EE> <1F12> <5686> <1F13> <5B5D> <1F14> <6548> <1F15> <6585> <1F16> <66C9> <1F17> <689F> <1F18> <6D8D> <1F19> <6DC6> <1F1A> <723B> <1F1B> <80B4> <1F1C> <9175> <1F1D> <9A4D> <1F1E> <4FAF> <1F1F> <5019> <1F20> <539A> <1F21> <540E> <1F22> <543C> <1F23> <5589> <1F24> <55C5> <1F25> <5E3F> <1F26> <5F8C> <1F27> <673D> <1F28> <7166> <1F29> <73DD> <1F2A> <9005> <1F2B> <52DB> <1F2C> <52F3> <1F2D> <5864> <1F2E> <58CE> <1F2F> <7104> <1F30> <718F> <1F31> <71FB> <1F32> <85B0> <1F33> <8A13> <1F34> <6688> <1F35> <85A8> <1F36> <55A7> <1F37> <6684> <1F38> <714A> <1F39> <8431> <1F3A> <5349> <1F3B> <5599> <1F3C> <6BC1> <1F3D> <5F59> <1F3E> <5FBD> <1F3F> <63EE> <1F40> <6689> <1F41> <7147> <1F42> <8AF1> <1F43> <8F1D> <1F44> <9EBE> <1F45> <4F11> <1F46> <643A> <1F47> <70CB> <1F48> <7566> <1F49> <8667> <1F4A> <6064> <1F4B> <8B4E> <1F4C> <9DF8> <1F4D> <5147> <1F4E> <51F6> endbfchar 100 beginbfchar <1F4F> <5308> <1F50> <6D36> <1F51> <80F8> <1F52> <9ED1> <1F53> <6615> <1F54> <6B23> <1F55> <7098> <1F56> <75D5> <1F57> <5403> <1F58> <5C79> <1F59> <7D07> <1F5A> <8A16> <1F5B> <6B20> <1F5C> <6B3D> <1F5D> <6B46> <1F5E> <5438> <1F5F> <6070> <1F60> <6D3D> <1F61> <7FD5> <1F62> <8208> <1F63> <50D6> <1F64> <51DE> <1F65> <559C> <1F66> <566B> <1F67> <56CD> <1F68> <59EC> <1F69> <5B09> <1F6A> <5E0C> <1F6B> <6199> <1F6C> <6198> <1F6D> <6231> <1F6E> <665E> <1F6F> <66E6> <1F70> <7199> <1F73> <72A7> <1F74> <79A7> <1F75> <7A00> <1F76> <7FB2> <1F77> <8A70> <1F7A> <2025> <1F7B> <00AD> <1F7C> <2015> <1F7D> <2225> <1F7E> <FF5E> <1F8B> <3013> <1F8C> <FF01> <1F8F> <FF0C> <1F90> <FF0E> <1F97> <FF3B> <1F98> <FF3D> <1F99> <FF3F> <1FFC> <203E> <1FFD> <007E> <1FFE> <005C> <1FFF> <231C> <2000> <231F> <200F> <00280028> <2010> <00290029> <2011> <00280028> <2012> <00290029> <201F> <005B> <2020> <005D> <2023> <263E> <2024> <263D> <2025> <2021> <2026> <2021> <202A> <2217> <202D> <201F> <202E> <201B> <2031> <00D7> <2032> <221E> <2034> <00B1> <2035> <2213> <2036> <003E> <2039> <2260> <203C> <007B> <203D> <007D> <2042> <2282> <2043> <2208> <2044> <03A3> <2045> <0021> <204D> <4E03> <2050> <5341> <2053> <0027> <2056> <002A> <2058> <2217> <2059> <002A> <205A> <CDCDCDCD> <205D> <00280028> <205E> <00290029> <205F> <00280028> <2060> <00290029> <2069> <003120DE> <206A> <003220DE> <206B> <003320DE> <206C> <003420DE> <206D> <003520DE> <206E> <003620DE> <206F> <003720DE> <2070> <003820DE> endbfchar 100 beginbfchar <2071> <003920DE> <2072> <005B00310030005D> <2073> <005B00310031005D> <2074> <005B00310032005D> <2075> <005B00310033005D> <2076> <005B00310034005D> <2077> <005B00310035005D> <2078> <005B00310036005D> <2079> <005B00310037005D> <207A> <005B00310038005D> <207B> <005B00310039005D> <207C> <005B00320030005D> <207D> <00B6> <2080> <22EF> <2081> <2237> <2082> <003120DE> <2083> <003220DE> <2084> <003320DE> <2085> <003420DE> <2086> <003520DE> <2087> <003620DE> <2088> <003720DE> <2089> <003820DE> <208A> <003920DE> <208B> <005B00310030005D> <208C> <005B00310031005D> <208D> <005B00310032005D> <208E> <005B00310033005D> <208F> <005B00310034005D> <2090> <005B00310035005D> <2091> <005B00310036005D> <2092> <005B00310037005D> <2093> <005B00310038005D> <2094> <005B00310039005D> <2095> <005B00320030005D> <20AA> <002800410029> <20AB> <002800420029> <20AC> <002800430029> <20AD> <002800440029> <20AE> <002800450029> <20AF> <002800460029> <20B0> <002800470029> <20B1> <002800480029> <20B2> <002800490029> <20B3> <0028004A0029> <20B4> <0028004B0029> <20B5> <0028004C0029> <20B6> <0028004D0029> <20B7> <0028004E0029> <20B8> <0028004F0029> <20B9> <002800500029> <20BA> <002800510029> <20BB> <002800520029> <20BC> <002800530029> <20BD> <002800540029> <20BE> <002800550029> <20BF> <002800560029> <20C0> <002800570029> <20C1> <002800580029> <20C2> <002800590029> <20C3> <0028005A0029> <20DE> <003120DE> <20DF> <003220DE> <20E0> <003320DE> <20E1> <003420DE> <20E2> <003520DE> <20E3> <003620DE> <20E4> <003720DE> <20E5> <003820DE> <20E6> <003920DE> <20E7> <005B00310030005D> <20E8> <005B00310031005D> <20E9> <005B00310032005D> <20EA> <005B00310033005D> <20EB> <005B00310034005D> <20EC> <005B00310035005D> <20ED> <005B00310036005D> <20EE> <005B00310037005D> <20EF> <005B00310038005D> <20F0> <005B00310039005D> <20F1> <005B00320030005D> <20F2> <003120DE> <20F3> <003220DE> <20F4> <003320DE> <20F5> <003420DE> <20F6> <003520DE> <20F7> <003620DE> <20F8> <003720DE> <20F9> <003820DE> <20FA> <003920DE> <20FB> <005B00310030005D> <20FC> <005B00310031005D> <20FD> <005B00310032005D> <20FE> <005B00310033005D> <20FF> <005B00310034005D> <2100> <005B00310035005D> <2101> <005B00310036005D> <2102> <005B00310037005D> <2103> <005B00310038005D> <2104> <005B00310039005D> endbfchar 100 beginbfchar <2105> <005B00320030005D> <211B> <22CF> <211E> <22CE> <2126> <228A> <2128> <228B> <212B> <2279> <2132> <2221> <2133> <2245> <2134> <2243> <2135> <2248> <2137> <22A4> <2138> <22AB> <213A> <003020DE> <213B> <003120DE> <213C> <003220DE> <213D> <003320DE> <213E> <003420DE> <213F> <003520DE> <2140> <003620DE> <2141> <003720DE> <2142> <003820DE> <2143> <003920DE> <214E> <00410029> <214F> <00420029> <2150> <00430029> <2151> <00440029> <2152> <00450029> <2153> <00460029> <2154> <00470029> <2155> <00480029> <2156> <00490029> <2157> <004A0029> <2158> <004B0029> <2159> <004C0029> <215A> <004D0029> <215B> <004E0029> <215C> <004F0029> <215D> <00500029> <215E> <00510029> <215F> <00520029> <2160> <00530029> <2161> <00540029> <2162> <00550029> <2163> <00560029> <2164> <00570029> <2165> <00580029> <2166> <00590029> <2167> <005A0029> <2168> <00610029> <2169> <00620029> <216A> <00630029> <216B> <00640029> <216C> <00650029> <216D> <00660029> <216E> <00670029> <216F> <00680029> <2170> <00690029> <2171> <006A0029> <2172> <006B0029> <2173> <006C0029> <2174> <006D0029> <2175> <006E0029> <2176> <006F0029> <2177> <00700029> <2178> <00710029> <2179> <00720029> <217A> <00730029> <217B> <00740029> <217C> <00750029> <217D> <00760029> <217E> <00770029> <217F> <00780029> <2180> <00790029> <2181> <007A0029> <2182> <0021> <2183> <00B0> <2184> <0027> <2185> <0022> <2186> <2034> <2187> <0028003200370029> <2188> <0028003200380029> <2189> <0028003200390029> <218A> <0028003300300029> <218D> <2020> <218E> <20202020> <218F> <20212021> <2190> <202020202020> <2191> <00A7> <2192> <0023> <2193> <002A> <2194> <002A> <2197> <2042> <2198> <002A> <219B> <2042> <219C> <002A> <219F> <2022> <21A0> <25A020DF> <21A1> <25C720DF> <21A3> <25A120DF> <21A8> <261C> endbfchar 100 beginbfchar <21A9> <261E> <21AC> <25C720DE> <21AE> <25A120DE> <21AF> <25C620DE> <21B4> <25B320DD> <21B5> <25B220DD> <21B6> <271A> <21B7> <2716> <21B9> <25EF> <21BF> <25CC> <21D5> <20A9> <21D8> <262F> <21DA> <262F> <21DB> <262F> <21DF> <3020> <21F5> <0028003200310029> <21F6> <0028003200320029> <21F7> <0028003200330029> <21F8> <0028003200340029> <21F9> <0028003200350029> <21FA> <0028003200360029> <21FB> <2642> <21FC> <22A9> <21FD> <3036> <21FE> <25CB> <21FF> <25D3> <2200> <25A1> <2201> <2302> <2203> <25AD> <2204> <25AD> <2208> <25C7> <220B> <2206> <220C> <22BF> <220D> <231E> <2212> <2253> <2213> <2251> <2216> <2213> <221A> <00F720DD> <221B> <2314> <221E> <2262> <2220> <25B1> <2222> <2222> <2223> <2250> <2224> <00D8> <2225> <234A> <2226> <22A3> <2227> <22A50338> <222B> <2285> <222C> <2284> <222D> <2209> <222E> <220C> <222F> <22BB> <2230> <0016> <2231> <225A> <2232> <2306> <2233> <0024> <2239> <329E> <223B> <203C> <223C> <0021003F> <223E> <003F003F> <223F> <22C4> <2240> <25C7> <2241> <22C4> <2242> <25C6> <2243> <25AB> <2244> <25A1> <2245> <25AB> <2246> <25A0> <2247> <25E6> <2248> <25CB> <2249> <25E6> <224A> <25CF> <224B> <25BD> <224C> <25B3> <224D> <25B7> <224E> <25C1> <224F> <2726> <2250> <25CF> <2251> <25A0> <2253> <25CA> <2254> <3231> <2255> <3239> <2256> <33CB> <2257> <2483> <225C> <0028003200310029> <225D> <0028003200320029> <225E> <0028003200330029> <225F> <0028003200340029> <2260> <0028003200350029> <2261> <0028003200360029> <2262> <0028003200370029> <2263> <0028003200380029> <2264> <0028003200390029> <2265> <0028003300300029> <2266> <2192> <2269> <2193> <226E> <21D0> <226F> <21CF> <2270> <21CD> <2271> <21D4> endbfchar 100 beginbfchar <2279> <2794> <2285> <279C> <2291> <27BA> <2296> <21D1> <2297> <21D3> <2299> <279E> <229D> <279E> <22A0> <21B5> <22A1> <21B1> <22A3> <21B4> <22A4> <21B0> <22A5> <21B3> <22B0> <21E6> <22B1> <21E8> <22B2> <21E7> <22B3> <21E9> <22B4> <21BC> <22B5> <21C0> <22BA> <21C0> <22BB> <21BC> <22C2> <0041002E> <22C3> <0042002E> <22C4> <0043002E> <22C5> <0044002E> <22C6> <0045002E> <22C7> <0046002E> <22C8> <0047002E> <22C9> <0048002E> <22CA> <0049002E> <22CB> <004A002E> <22CC> <004B002E> <22CD> <004C002E> <22CE> <004D002E> <22CF> <004E002E> <22D0> <004F002E> <22D1> <0050002E> <22D2> <0051002E> <22D3> <0052002E> <22D4> <0053002E> <22D5> <0054002E> <22D6> <0055002E> <22D7> <0056002E> <22D8> <0057002E> <22D9> <0058002E> <22DA> <0059002E> <22DB> <005A002E> <22DC> <0061002E> <22DD> <0062002E> <22DE> <0063002E> <22DF> <0064002E> <22E0> <0065002E> <22E1> <0066002E> <22E2> <0067002E> <22E3> <0068002E> <22E4> <0069002E> <22E5> <006A002E> <22E6> <006B002E> <22E7> <006C002E> <22E8> <006D002E> <22E9> <006E002E> <22EA> <006F002E> <22EB> <0070002E> <22EC> <0071002E> <22ED> <0072002E> <22EE> <0073002E> <22EF> <0074002E> <22F0> <0075002E> <22F1> <0076002E> <22F2> <0077002E> <22F3> <0078002E> <22F4> <0079002E> <22F5> <007A002E> <22F6> <C6B420DE> <22F7> <B2F520DE> <22F8> <C8FC20DE> <22F9> <BA8520DE> <22FA> <B30020DE> <22FB> <D61520DE> <22FC> <BD8020DE> <22FD> <C80420DE> <22FE> <C81120DE> <22FF> <C21820DE> <2300> <B3D920DE> <2301> <BE4420DE> <2302> <BC1820DE> <2303> <C79020DE> <2304> <D0C020DE> <2305> <AC1020DE> <2306> <C57D20DE> <2307> <C77820DE> <2308> <B73B20DE> <2309> <537020DE> <230A> <8A3B20DE> <230B> <C60820DE> <230C> <611F20DE> <230D> <51A020DE> <230E> <7B5420DE> <230F> <4EE320DE> <2310> <982D20DE> <2311> <52D520DE> endbfchar 100 beginbfchar <2312> <540D20DE> <2313> <76EE20DE> <2314> <53CD20DE> <2315> <88DC20DE> <2316> <672C20DE> <2317> <526F20DE> <2318> <5E8F20DE> <2319> <902320DE> <231A> <5F7120DE> <231B> <4F8B20DE> <231C> <6E9020DE> <231D> <5B5020DE> <231E> <524D20DE> <231F> <7BC020DE> <2320> <63A520DE> <2321> <52A920DE> <2322> <630720DE> <2323> <4ED620DE> <2324> <6D3E20DE> <2325> <5F6220DE> <2326> <C87020DE> <2327> <BB3820DE> <2328> <B2F520DE> <2329> <C8FC20DE> <232A> <B73B20DE> <232B> <8A3B20DE> <232C> <AD5020DE> <232D> <C5ED20DE> <232E> <C74C20DE> <232F> <C81520DE> <2330> <D57420DE> <2331> <C60820DE> <2332> <C87420DD> <2333> <B77C20DD> <2334> <B9C820DD> <2335> <BC1420DD> <2336> <C0AC20DD> <2337> <C54420DD> <2338> <C79020DD> <2339> <CC2820DD> <233A> <CE7420DD> <233B> <D0C020DD> <233C> <D30C20DD> <233D> <B19220DD> <233E> <B0AE20DD> <233F> <BA8520DD> <2340> <B30020DD> <2341> <D61520DD> <2342> <BD8020DD> <2343> <C80420DD> <2344> <C81120DD> <2345> <C21820DD> <2346> <B3D920DD> <2347> <BE4420DD> <2348> <AC8C20DD> <2349> <BC1820DD> <234A> <C18D20DD> <234B> <C77820DD> <234C> <BCF820DD> <234D> <C57D20DD> <234E> <C21920DD> <234F> <C72020DD> <2350> <AD0020DD> <2351> <51A020DD> <2357> <0028003200310029> <2358> <0028003200320029> <2359> <0028003200330029> <235A> <0028003200340029> <235B> <0028003200350029> <235C> <0028003200360029> <235D> <C87020DD> <235E> <AD6D20DD> <235F> <AC1020DD> <2360> <537020DD> <2361> <886320DD> <2362> <672B20DD> <2363> <AC7020DD> <2364> <B2F520DD> <2365> <BCC020DD> <2366> <C0C120DD> <2367> <C13C20DD> <2368> <C2E020DD> <2369> <C5EC20DD> <236A> <C60820DD> <236B> <C6D020DD> <236C> <C79120DD> <236D> <C90020DD> <236E> <D0B920DD> <236F> <C67820DD> <2370> <D65C20DD> <2371> <AC0420DD> <2372> <AC1920DD> <2373> <C2E420DD> <2374> <611F20DD> <2375> <616320DD> <2376> <4EE320DD> <2377> <52D520DD> <2378> <3294> <2379> <53CD20DD> <237A> <526F20DD> endbfchar 100 beginbfchar <237B> <81EA20DD> <237C> <524D20DD> <237D> <96FB20DD> <237E> <63A520DD> <237F> <52A920DD> <2380> <6CE820DD> <2381> <53C320DD> <2382> <672C20DD> <2383> <65B020DD> <2384> <73FE20DD> <2385> <5F6220DD> <2386> <959320DD> <2387> <570B20DD> <2388> <32A5> <2389> <4ED620DD> <238A> <BE6020DD> <238B> <C2DC20DD> <238C> <C78520DD> <238D> <C73C20DD> <238E> <C74C20DD> <238F> <C9C120DD> <2390> <D45C20DD> <2391> <AC0020DD> <2392> <B09820DD> <2393> <B2E420DD> <2394> <D55820DD> <2395> <B9C820DD> <2396> <BC1420DD> <2397> <C0AC20DD> <2398> <C54420DD> <2399> <C79020DD> <239A> <CC2820DD> <239B> <CE7420DD> <239C> <D0C020DD> <239D> <D30C20DD> <239E> <D55820DD> <239F> <BE4420DD> <23A0> <B2F520DD> <23A1> <BE6020DD> <23A2> <BCF820DD> <23A3> <B2E820DD> <23A4> <C13C20DD> <23A5> <C2DC20DD> <23A6> <C5EC20DD> <23A7> <C60820DD> <23A8> <C73C20DD> <23A9> <C74C20DD> <23AA> <C78520DD> <23AB> <C81C20DD> <23AC> <C87420DD> <23AD> <C90020DD> <23AE> <D45C20DD> <23AF> <D57420DD> <23B0> <B29020DD> <23B1> <B19220DD> <23B2> <B0AE20DD> <23B3> <BC1820DD> <23B4> <AC0020DD> <23B5> <B09820DD> <23B6> <B2E420DD> <23B7> <B77C20DD> <23B8> <C67820DD> <23B9> <0028003200370029> <23BA> <0028003200380029> <23BB> <0028003200390029> <23BC> <0028003300300029> <23DA> <2794> <23EB> <27A1> <23EE> <21E6> <23EF> <21E8> <23F0> <21E7> <23F1> <21E9> <2406> <261D> <2407> <261F> <240A> <B2E820DD> <240B> <CC3820DD> <240C> <C18C20DD> <240D> <C91120DD> <240E> <C77C20DD> <240F> <C77420DD> <2410> <D73420DD> <2411> <003120DE> <2412> <003220DE> <2413> <003320DE> <2414> <003420DE> <2415> <003520DE> <2416> <003620DE> <2417> <003720DE> <2418> <003820DE> <2419> <003920DE> <241A> <005B00310030005D> <241B> <005B00310031005D> <241C> <005B00310032005D> <241D> <005B00310033005D> <241E> <005B00310034005D> <241F> <005B00310035005D> <2420> <005B00310036005D> <2421> <005B00310037005D> <2422> <005B00310038005D> <2423> <005B00310039005D> endbfchar 100 beginbfchar <2424> <005B00320030005D> <2425> <4E0020DE> <2426> <4E8C20DE> <2427> <4E0920DE> <2428> <56DB20DE> <2429> <4E9420DE> <242A> <516D20DE> <242B> <4E0320DE> <242C> <516B20DE> <242D> <4E5D20DE> <242E> <534120DE> <242F> <005B53414E00005D> <2430> <005B53414E8C005D> <2431> <005B53414E09005D> <2432> <005B534156DB005D> <2433> <005B53414E94005D> <2434> <005B5341516D005D> <2435> <005B53414E03005D> <2436> <005B5341516B005D> <2437> <005B53414E5D005D> <2438> <005B4E8C5341005D> <2439> <4E0020DE> <243A> <4E8C20DE> <243B> <4E0920DE> <243C> <56DB20DE> <243D> <4E9420DE> <243E> <516D20DE> <243F> <4E0320DE> <2440> <516B20DE> <2441> <4E5D20DE> <2442> <534120DE> <2443> <005B53414E00005D> <2444> <005B53414E8C005D> <2445> <005B53414E09005D> <2446> <005B534156DB005D> <2447> <005B53414E94005D> <2448> <005B5341516D005D> <2449> <005B53414E03005D> <244A> <005B5341516B005D> <244B> <005B53414E5D005D> <244C> <005B4E8C5341005D> <244D> <65E520DE> <244E> <670820DE> <244F> <706B20DE> <2450> <6C3420DE> <2451> <672820DE> <2452> <91D120DE> <2453> <571F20DE> <2454> <3290> <245B> <65E520DE> <245C> <670820DE> <245D> <706B20DE> <245E> <6C3420DE> <245F> <672820DE> <2460> <91D120DE> <2461> <571F20DE> <2466> <21E8> <2469> <21E9> <246A> <0022> <246B> <301F> <246C> <301D> <246D> <2036> <246E> <0060> <246F> <3001> <2471> <0021> <2472> <3021> <2473> <002C> <2474> <3002> <247E> <AC18> <248B> <AC2E> <24A1> <AC4C> <24C5> <AC79> <24CB> <AC82> <24DB> <AC9E> <24E2> <ACAB> <24EC> <ACBA> <2500> <ACD6> <250D> <ACE9> <250E> <ACEB> <2511> <ACF2> <2512> <ACF4> <251D> <AD05> <2523> <AD0E> <2524> <AD10> <254D> <AD46> <254E> <AD48> <2563> <AD62> <2574> <AD7E> <2575> <AD80> <25B7> <ADD2> <25E3> <AE0A> <25E4> <AE0C> <260A> <AE39> <2610> <AE42> <2611> <AE44> <2615> <AE4B> <2616> <AE4F> <261A> <AE55> <2620> <AE5E> <2632> <AE7A> endbfchar 100 beginbfchar <266E> <AEBF> <2679> <AECE> <268F> <AEEC> <26C9> <AF31> <26CA> <AF33> <26D2> <AF3E> <26D3> <AF40> <2744> <AFCA> <2745> <AFCC> <27AC> <B049> <27AD> <B04B> <27AE> <B04D> <27B3> <B056> <27B4> <B058> <27E2> <B08E> <27E3> <B090> <27EA> <B09B> <27F2> <B0AA> <27F3> <B0B0> <27F4> <B0B2> <2800> <B0C3> <2801> <B0C6> <283A> <B10A> <283E> <B111> <2843> <B11A> <2855> <B136> <288E> <B181> <2894> <B18A> <2895> <B18C> <28DB> <B1DE> <28F1> <B1FA> <28F2> <B1FC> <2904> <B216> <2905> <B218> <2978> <B2A2> <2979> <B2A4> <297D> <B2AB> <299C> <B2D1> <29A2> <B2DA> <29A3> <B2DC> <29A8> <B2E3> <29A9> <B2E7> <29AF> <B2F6> <29BF> <B312> <29FD> <B357> <2A00> <B35D> <2A05> <B366> <2A06> <B368> <2A07> <B36A> <2A0A> <B36F> <2A17> <B382> <2A53> <B3CD> <2A54> <B3CF> <2A58> <B3D6> <2A59> <B3D8> <2A5A> <B3DA> <2A5B> <B3DC> <2A9E> <B42A> <2ACE> <B462> <2ACF> <B464> <2B18> <B4B6> <2B19> <B4B8> <2B3B> <B4E5> <2B41> <B4EE> <2B42> <B4F0> <2B6F> <B526> <2B81> <B542> <2B93> <B55E> <2BD7> <B5A9> <2BDC> <B5B2> <2BEE> <B5CE> <2CFF> <B6F9> <2D36> <B73A> <2D63> <B772> <2D64> <B774> <2D77> <B78E> <2D87> <B7AA> <2D9E> <B7C8> <2DCD> <B7FE> <2DDF> <B81A> <2DE0> <B81C> <2DF3> <B836> <2E09> <B852> <2E1E> <B86E> <2E1F> <B870> <2E67> <B8C2> <2E68> <B8C4> <2E7D> <B8DE> <2E7E> <B8E0> <2E91> <B8FA> <2E92> <B8FC> <2EDC> <B950> <2EEF> <B96A> <2EF0> <B96C> <2F03> <B986> <2F04> <B988> <2F30> <B9BE> <2F31> <B9C0> <2F3A> <B9CD> <2F40> <B9DA> endbfchar 100 beginbfchar <2F41> <B9DC> <2F44> <B9E2> <2F51> <B9F6> <2F90> <BA41> <2F96> <BA4A> <2F97> <BA4C> <2FA8> <BA66> <2FBE> <BA86> <2FDE> <BAAA> <2FE2> <BAB1> <2FE8> <BABA> <2FE9> <BABC> <3032> <BB0E> <3033> <BB10> <3048> <BB2A> <3051> <BB37> <3059> <BB46> <305A> <BB48> <305E> <BB4E> <306D> <BB62> <30F8> <BC01> <30FE> <BC0A> <30FF> <BC0E> <3100> <BC10> <3109> <BC26> <310A> <BC28> <311C> <BC42> <315A> <BC8D> <3160> <BC96> <3161> <BC98> <3172> <BCB2> <3186> <BCCE> <31A6> <BCF7> <31B1> <BD06> <31B2> <BD08> <3225> <BD92> <3226> <BD94> <322A> <BD9B> <3285> <BE04> <3298> <BE1E> <32C2> <BE4D> <32C8> <BE56> <32C9> <BE58> <32D3> <BE69> <32D9> <BE72> <32EB> <BE8E> <3362> <BF1A> <3400> <BFC4> <3415> <BFE0> <34C9> <C0A2> <34CA> <C0A4> <34D1> <C0AE> <34D9> <C0BE> <34EB> <C0DA> <34FE> <C0F6> <34FF> <C0F8> <351F> <C125> <3524> <C12E> <3529> <C137> <3536> <C14A> <3549> <C166> <3568> <C18F> <356C> <C195> <3572> <C19E> <3573> <C1A0> <35B3> <C1F2> <35C8> <C20E> <35C9> <C210> <35DB> <C22A> <35DC> <C22C> <35DD> <C22E> <35DE> <C230> <35DF> <C233> <35FF> <C259> <361C> <C27E> <361D> <C280> <3633> <C29C> <3645> <C2B6> <3646> <C2B8> <3673> <C2EE> <3674> <C2F0> <3679> <C2F7> <367A> <C2FA> <36DC> <C371> <373E> <C3E1> <3835> <C4F9> <3868> <C53A> <3869> <C53C> <3872> <C54B> <3877> <C556> <387B> <C55F> <3888> <C572> <389A> <C58E> <389B> <C590> <389F> <C596> <38BA> <C5BA> <38C0> <C5CB> <38C1> <C5CD> <38C2> <C5CF> <38CF> <C5E2> endbfchar 100 beginbfchar <38D0> <C5E4> <38D7> <C5EF> <38DB> <C5F5> <38F0> <C61A> <38FD> <C62F> <3900> <C636> <3901> <C638> <3902> <C63A> <3913> <C652> <3929> <C670> <393C> <C68A> <393D> <C68C> <3950> <C6A6> <3951> <C6A8> <3962> <C6C2> <3963> <C6C4> <399F> <C716> <39A0> <C718> <39B3> <C732> <39B4> <C734> <39B5> <C736> <39C4> <C74B> <39C5> <C74E> <39C6> <C750> <39E7> <C786> <39EB> <C78F> <39EE> <C795> <39EF> <C799> <39F5> <C7A2> <3A07> <C7BE> <3A10> <C7CD> <3A11> <C7CF> <3A41> <C809> <3A47> <C812> <3A48> <C814> <3A5A> <C82E> <3A5B> <C830> <3A97> <C879> <3A9D> <C882> <3A9E> <C884> <3AB0> <C89E> <3AB1> <C8A0> <3ADE> <C8D6> <3ADF> <C8D8> <3B08> <C90E> <3B09> <C910> <3B51> <C962> <3B7E> <C99A> <3B7F> <C99C> <3BA6> <C9C9> <3BAC> <C9D2> <3BAD> <C9D4> <3BB0> <C9DB> <3BB3> <C9E1> <3BB4> <C9E3> <3BBB> <C9EE> <3BCE> <CA0A> <3C16> <CA5E> <3C79> <CACE> <3C7A> <CAD0> <3C7B> <CAD2> <3D75> <CBE8> <3DAD> <CC2D> <3DAE> <CC2F> <3DB6> <CC3A> <3DC8> <CC56> <3DD2> <CC65> <3DD3> <CC67> <3E00> <CC97> <3E0D> <CCAA> <3E20> <CCC6> <3E21> <CCC8> <3E66> <CD1A> <3E67> <CD1C> <3EAF> <CD6E> <3EB0> <CD70> <3EDD> <CDA6> <3EDE> <CDA8> <3EFF> <CDCD> <3F26> <CDFA> <3F27> <CDFC> <3F51> <CE32> <3F52> <CE34> <3F7F> <CE6A> <3F80> <CE6C> <3F93> <CE86> <3F94> <CE88> <3FA7> <CEA2> <3FEE> <CEF6> <4000> <CF0F> <4001> <CF12> <4002> <CF14> <4016> <CF2E> <4044> <CF66> <4045> <CF68> <40BD> <CFF2> <40BE> <CFF4> <4103> <D046> <4104> <D048> <4160> <D0B6> endbfchar 68 beginbfchar <4161> <D0B8> <4173> <D0D2> <4186> <D0EE> <41C8> <D139> <41CE> <D142> <41E1> <D15E> <41E2> <D160> <4228> <D1B2> <4229> <D1B4> <422E> <D1BB> <4275> <D208> <42A3> <D23E> <42A4> <D240> <4310> <D2C1> <4316> <D2CA> <4342> <D302> <4343> <D304> <434A> <D30F> <434E> <D315> <4354> <D31E> <4366> <D33A> <43AF> <D38E> <43C2> <D3AA> <43C3> <D3AC> <43EE> <D3E2> <4403> <D3FE> <4404> <D400> <4469> <D46E> <4476> <D481> <447C> <D48A> <447D> <D48C> <44E0> <D4FC> <44F4> <D516> <4525> <D54E> <4526> <D550> <4538> <D56A> <4539> <D56C> <454C> <D586> <458E> <D5D1> <4594> <D5DA> <4595> <D5DC> <45A8> <D5F6> <45A9> <D5F8> <45BC> <D612> <45E6> <D64A> <45E7> <D64C> <45FC> <D668> <4613> <D684> <4627> <D69E> <4628> <D6A0> <463D> <D6BA> <4653> <D6D8> <4694> <D72A> <4695> <D72C> <46AA> <D748> <46B3> <D755> <46BA> <D762> <46BB> <D764> <46E3> <D79A> <46E4> <D79C> <474A> <20A9> <474B> <2010> <474C> <00A9> <474D> <2122> <474E> <22EF> <47AD> <203E> <47AE> <007E> <47AF> <005C> endbfchar 100 beginbfrange <0001> <005F> <0020> <0065> <0067> <3000> <0069> <006A> <2025> <006D> <006E> <2013> <0072> <0073> <2018> <0074> <0075> <201C> <0076> <0077> <3014> <0078> <0081> <3008> <0086> <0087> <2264> <008B> <008C> <2032> <008F> <0090> <FFE0> <00AB> <00AC> <2190> <00AD> <00AE> <2193> <00B0> <00B1> <226A> <00B6> <00B7> <222B> <00BA> <00BB> <2286> <00BC> <00BD> <2282> <00C0> <00C1> <2227> <00DE> <00DF> <2660> <00E6> <00E7> <25D0> <00E9> <00EA> <25A4> <00F5> <00F6> <2020> <00FD> <00FE> <2669> <0108> <0142> <FF01> <0144> <0164> <FF3D> <0166> <0198> <3131> <0199> <01C2> <3165> <01C3> <01CC> <2170> <01CD> <01D6> <2160> <01D7> <01E7> <0391> <01E8> <01EE> <03A3> <01EF> <01FF> <03B1> <0200> <0206> <03C3> <022F> <0230> <251E> <0231> <0232> <2521> <0233> <0234> <2526> <0235> <0236> <2529> <0237> <0238> <252D> <0239> <023A> <2531> <023B> <023C> <2535> <023D> <023E> <2539> <023F> <0240> <253D> <0241> <0242> <2540> <0243> <024A> <2543> <024B> <024D> <3395> <0251> <0254> <33A3> <0255> <025E> <3399> <0260> <0262> <338D> <0264> <0265> <3388> <0267> <0268> <33A7> <0269> <0272> <33B0> <0273> <0277> <3380> <0278> <027D> <33BA> <027E> <0282> <3390> <0284> <0285> <33C0> <0286> <0288> <338A> <028B> <028D> <33AD> <028F> <0292> <33A9> <02A7> <02C2> <3260> <02C3> <02DC> <24D0> <02DD> <02EB> <2460> <02ED> <02EE> <2153> <02F1> <02F4> <215B> <0305> <0320> <3200> <0321> <033A> <249C> <033B> <0349> <2474> <034B> <034C> <00B2> <034F> <0352> <2081> <0353> <03A5> <3041> <03A6> <03FB> <30A1> <03FC> <03FF> <0410> <0400> <0401> <0414> <0403> <0422> <0416> <0424> <043D> <0436> <043E> <043F> <AC00> <0441> <0444> <AC07> <0445> <044C> <AC10> <044D> <0451> <AC19> <0454> <0455> <AC2C> <0456> <0458> <AC2F> <0459> <045A> <AC38> <0462> <0463> <AC70> <0465> <0466> <AC77> <0468> <0469> <AC80> <046A> <046D> <AC83> <046E> <0471> <AC89> <0474> <0475> <AC9C> <0476> <0478> <AC9F> <0479> <047B> <ACA8> <047D> <047E> <ACAF> <047F> <0480> <ACB8> <0481> <0483> <ACBB> <048A> <048B> <ACE0> <048D> <048E> <ACE7> <0491> <0493> <ACEF> <0495> <0496> <ACF5> <0497> <0498> <ACFC> <049C> <049D> <AD0C> <04A4> <04A5> <AD2C> <04A6> <04A7> <AD34> endbfrange 100 beginbfrange <04AA> <04AB> <AD44> <04B3> <04B4> <AD6C> <04B6> <04B9> <AD73> <04BA> <04BC> <AD7B> <04BE> <04BF> <AD81> <04C0> <04C1> <AD88> <04C4> <04C5> <AD9C> <04C8> <04C9> <ADC0> <04CC> <04CD> <ADD0> <04D2> <04D3> <ADF8> <04D5> <04D7> <ADFF> <04D8> <04D9> <AE08> <04DD> <04DE> <AE30> <04E0> <04E1> <AE37> <04E3> <04E4> <AE40> <04E6> <04E7> <AE45> <04E9> <04EB> <AE4C> <04EF> <04F0> <AE5C> <04F1> <04F3> <AE5F> <04F5> <04F6> <AE68> <04F9> <04FA> <AE78> <04FB> <04FD> <AE7B> <04FE> <04FF> <AE84> <0501> <0503> <AEBC> <0506> <0507> <AECC> <0508> <050A> <AECF> <050B> <050C> <AED8> <0514> <0515> <AF07> <0518> <0519> <AF2C> <051D> <051E> <AF3C> <0520> <0522> <AF41> <0523> <0524> <AF48> <0526> <0527> <AF5C> <0528> <0529> <AF64> <052E> <052F> <AF90> <0532> <0533> <AFB8> <0536> <0538> <AFC7> <053A> <053B> <AFCD> <053E> <053F> <AFE8> <0540> <0541> <AFF0> <0544> <0545> <B000> <054A> <054B> <B01C> <054D> <054E> <B044> <0553> <0555> <B053> <0559> <055A> <B07C> <055D> <055E> <B08C> <0561> <0563> <B098> <0565> <0568> <B09F> <0569> <056A> <B0A8> <056B> <056F> <B0AB> <0571> <0573> <B0B3> <0576> <0577> <B0C4> <0578> <057A> <B0C7> <057B> <057C> <B0D0> <0581> <0582> <B108> <0583> <0584> <B10B> <0586> <0587> <B112> <0588> <0589> <B118> <058A> <058C> <B11B> <058D> <058F> <B123> <0592> <0593> <B134> <0594> <0596> <B137> <0597> <0598> <B140> <059B> <059C> <B150> <059D> <059E> <B154> <05A2> <05A3> <B178> <05A7> <05A8> <B188> <05AB> <05AD> <B192> <05B4> <05B5> <B1DC> <05B7> <05B8> <B1E8> <05BE> <05BF> <B204> <05C1> <05C2> <B20B> <05C3> <05C4> <B214> <05CD> <05CE> <B268> <05CF> <05D0> <B274> <05D2> <05D3> <B284> <05D5> <05D6> <B290> <05D8> <05DA> <B298> <05DB> <05DC> <B2A0> <05DE> <05DF> <B2A5> <05E4> <05E5> <B2C8> <05E9> <05EA> <B2D8> <05EE> <05F0> <B2E4> <05F2> <05F6> <B2EB> <05F7> <05F9> <B2F3> <05FA> <05FE> <B2F7> <0600> <0601> <B300> <0604> <0605> <B310> <0606> <0608> <B313> <060A> <060C> <B354> <060E> <060F> <B35B> <0610> <0611> <B35E> <0612> <0613> <B364> <0618> <0619> <B370> <061C> <061D> <B380> <061E> <0620> <B383> <0624> <0625> <B3A0> <0628> <0629> <B3C4> <062B> <062C> <B3CB> <062F> <0630> <B3D4> endbfrange 100 beginbfrange <063D> <063E> <B428> <0641> <0642> <B450> <0645> <0646> <B460> <0658> <0659> <B4DC> <065B> <065C> <B4E3> <065E> <065F> <B4EC> <0663> <0664> <B514> <0666> <0667> <B51B> <0668> <0669> <B524> <066A> <066D> <B527> <066E> <066F> <B530> <0672> <0673> <B540> <0674> <0676> <B543> <0677> <0679> <B54B> <067C> <067D> <B55C> <067E> <0680> <B55F> <0681> <0682> <B5A0> <0685> <0686> <B5AA> <0687> <0688> <B5B0> <0689> <068B> <B5B3> <068C> <068E> <B5BB> <0691> <0692> <B5CC> <0693> <0695> <B5CF> <0698> <0699> <B610> <06A2> <06A3> <B69C> <06A6> <06A7> <B6AB> <06AD> <06AE> <B700> <06B0> <06B1> <B728> <06B3> <06B4> <B72F> <06B5> <06B6> <B738> <06BB> <06BC> <B754> <06C0> <06C1> <B770> <06C4> <06C5> <B77C> <06C8> <06C9> <B78C> <06CA> <06CD> <B78F> <06CE> <06D1> <B796> <06D4> <06D5> <B7A8> <06D6> <06D8> <B7AB> <06D9> <06DA> <B7B4> <06DE> <06DF> <B7EC> <06E2> <06E3> <B7FC> <06E4> <06E6> <B7FF> <06E7> <06E9> <B807> <06EC> <06ED> <B818> <06F0> <06F1> <B824> <06F4> <06F5> <B834> <06F6> <06F8> <B837> <06FD> <06FE> <B85C> <0701> <0702> <B86C> <070C> <070D> <B8C0> <0716> <0717> <B8E8> <071A> <071B> <B8F8> <0721> <0722> <B93C> <0728> <0729> <B958> <072C> <072D> <B968> <0730> <0731> <B974> <0734> <0735> <B984> <0737> <0738> <B989> <0739> <073A> <B98D> <073B> <073C> <B9AC> <073F> <0740> <B9BC> <0743> <0744> <B9C8> <0746> <074A> <B9CE> <074B> <074C> <B9D8> <074E> <074F> <B9DD> <0751> <0753> <B9E3> <0756> <0757> <B9F4> <0758> <075B> <B9F7> <075C> <075D> <BA00> <0760> <0761> <BA38> <0765> <0766> <BA48> <0768> <0769> <BA4D> <076A> <076C> <BA53> <076F> <0770> <BA64> <0771> <0773> <BA67> <0774> <0775> <BA70> <0778> <077A> <BA83> <077D> <077E> <BAA8> <077F> <0780> <BAAB> <0783> <0784> <BAB8> <0789> <078A> <BAD8> <0796> <0798> <BB34> <079A> <079D> <BB3B> <079E> <079F> <BB44> <07A3> <07A4> <BB4F> <07B7> <07B8> <BBF8> <07BA> <07BB> <BBFF> <07BD> <07BE> <BC08> <07BF> <07C1> <BC0B> <07C4> <07C8> <BC14> <07C9> <07CD> <BC1B> <07CE> <07CF> <BC24> <07D3> <07D4> <BC30> <07D7> <07D8> <BC40> <07D9> <07DB> <BC43> <07DD> <07DE> <BC4C> <07E1> <07E2> <BC84> <07E4> <07E5> <BC8B> <07E7> <07E8> <BC94> <07EA> <07EB> <BC99> endbfrange 100 beginbfrange <07EC> <07ED> <BCA0> <07EF> <07F0> <BCA7> <07F1> <07F2> <BCB0> <07F3> <07F5> <BCB3> <07F6> <07F7> <BCBC> <07FB> <07FD> <BCCF> <0801> <0803> <BCF4> <0806> <0807> <BD04> <080F> <0810> <BD48> <0813> <0814> <BD58> <0817> <0818> <BD80> <081A> <081D> <BD87> <081E> <081F> <BD90> <0822> <0823> <BD99> <0828> <0829> <BDD4> <0833> <0834> <BE0C> <0837> <0838> <BE1C> <083A> <083B> <BE44> <083F> <0840> <BE54> <0842> <0844> <BE59> <0845> <0846> <BE60> <084A> <084B> <BE70> <084C> <084E> <BE73> <084F> <0851> <BE7B> <0854> <0855> <BE8C> <0856> <0858> <BE8F> <0859> <085A> <BE98> <085C> <085D> <BED0> <085F> <0860> <BED7> <0862> <0864> <BEE3> <0867> <0868> <BF08> <0869> <086A> <BF18> <086B> <086D> <BF1B> <086E> <086F> <BF40> <0872> <0873> <BF50> <0878> <0879> <BFCC> <0884> <0885> <C068> <0886> <0887> <C090> <088A> <088B> <C0A0> <088E> <088F> <C0AC> <0890> <0891> <C0AF> <0892> <0895> <C0B3> <0896> <0897> <C0BC> <0898> <089A> <C0BF> <089C> <089D> <C0C8> <08A0> <08A1> <C0D8> <08A2> <08A4> <C0DB> <08A5> <08A6> <C0E4> <08A9> <08AA> <C0F4> <08B2> <08B6> <C11C> <08B7> <08B8> <C123> <08B9> <08BA> <C126> <08BB> <08BC> <C12C> <08BD> <08BF> <C12F> <08C1> <08C2> <C138> <08C5> <08C6> <C148> <08C7> <08C9> <C14B> <08CA> <08CB> <C154> <08CE> <08CF> <C164> <08D0> <08D2> <C167> <08D7> <08D9> <C18C> <08DD> <08DE> <C19C> <08E2> <08E3> <C1A8> <08EB> <08EC> <C1D7> <08F0> <08F1> <C1F0> <08F3> <08F4> <C1FC> <08F7> <08F8> <C20C> <08FB> <08FC> <C218> <08FE> <08FF> <C21F> <0900> <0901> <C228> <0905> <0906> <C231> <0909> <090A> <C250> <090F> <0910> <C26C> <0913> <0914> <C27C> <0917> <0918> <C288> <091D> <091E> <C2A4> <0920> <0921> <C2AC> <0922> <0923> <C2B4> <0926> <0927> <C2DC> <0929> <092A> <C2E3> <092B> <092D> <C2EB> <0931> <0932> <C2F8> <0933> <0934> <C2FB> <0936> <0937> <C308> <0938> <0939> <C30C> <093A> <093C> <C313> <093F> <0940> <C324> <0941> <0942> <C328> <0944> <0945> <C368> <0949> <094A> <C378> <094B> <094C> <C37C> <0951> <0952> <C3D8> <0954> <0955> <C3DF> <0957> <0958> <C3E8> <095A> <095B> <C3F4> <0963> <0964> <C43C> <0966> <0967> <C464> <096A> <096B> <C474> <0973> <0974> <C4F0> <0978> <097A> <C4FF> endbfrange 100 beginbfrange <097F> <0980> <C528> <0983> <0984> <C538> <0987> <0988> <C544> <0989> <098B> <C548> <098C> <098E> <C54C> <098F> <0991> <C553> <0992> <0994> <C557> <0995> <0996> <C55D> <0997> <0998> <C560> <099B> <099C> <C570> <099D> <099F> <C573> <09A0> <09A1> <C57C> <09A5> <09A6> <C58C> <09AA> <09AB> <C597> <09AF> <09B0> <C5B4> <09B1> <09B2> <C5B8> <09B3> <09B6> <C5BB> <09B7> <09BD> <C5C4> <09C0> <09C1> <C5D0> <09C4> <09C5> <C5E0> <09C8> <09CA> <C5EC> <09CD> <09CE> <C5F6> <09CF> <09D4> <C5FC> <09D5> <09D8> <C605> <09DB> <09DC> <C618> <09DD> <09DE> <C61B> <09DF> <09E0> <C624> <09E2> <09E4> <C62C> <09E6> <09E8> <C633> <09EC> <09ED> <C640> <09F0> <09F1> <C650> <09F2> <09F4> <C653> <09F5> <09F6> <C65C> <09FB> <09FC> <C678> <0A03> <0A04> <C694> <0A07> <0A08> <C6A4> <0A0B> <0A0C> <C6B0> <0A0E> <0A10> <C6B8> <0A11> <0A12> <C6C0> <0A15> <0A16> <C6CC> <0A19> <0A1A> <C6DC> <0A1B> <0A1C> <C6E0> <0A1D> <0A1E> <C6E8> <0A21> <0A22> <C6F8> <0A24> <0A25> <C704> <0A28> <0A29> <C714> <0A2C> <0A2D> <C720> <0A30> <0A31> <C730> <0A35> <0A36> <C73C> <0A3A> <0A3B> <C74C> <0A3D> <0A44> <C751> <0A49> <0A4A> <C774> <0A4C> <0A4E> <C77C> <0A4F> <0A51> <C783> <0A52> <0A55> <C787> <0A57> <0A58> <C790> <0A5A> <0A5C> <C796> <0A5E> <0A5F> <C7A0> <0A60> <0A63> <C7A3> <0A64> <0A65> <C7AC> <0A68> <0A69> <C7BC> <0A6A> <0A6C> <C7BF> <0A6D> <0A6E> <C7C8> <0A77> <0A78> <C800> <0A7C> <0A7D> <C810> <0A7F> <0A80> <C815> <0A81> <0A82> <C81C> <0A85> <0A86> <C82C> <0A8C> <0A8D> <C848> <0A8E> <0A8F> <C84C> <0A91> <0A92> <C870> <0A96> <0A97> <C880> <0A99> <0A9B> <C885> <0A9C> <0A9E> <C88B> <0AA4> <0AA5> <C8BC> <0AA9> <0AAA> <C8D4> <0AAD> <0AAE> <C8E0> <0AB1> <0AB2> <C8FC> <0AB4> <0AB6> <C904> <0AB7> <0AB8> <C90C> <0ABE> <0ABF> <C950> <0AC2> <0AC3> <C960> <0AC9> <0ACA> <C988> <0ACD> <0ACE> <C998> <0AD1> <0AD2> <C9C0> <0AD4> <0AD5> <C9C7> <0AD7> <0AD8> <C9D0> <0ADA> <0ADB> <C9D5> <0ADC> <0ADD> <C9D9> <0ADE> <0ADF> <C9DC> <0AE4> <0AE5> <C9EC> <0AE6> <0AE8> <C9EF> <0AE9> <0AEA> <C9F8> <0AED> <0AEE> <CA08> <0AEF> <0AF1> <CA0B> <0AF5> <0AF6> <CA4C> <0AF9> <0AFA> <CA5C> <0AFB> <0AFD> <CA5F> <0B02> <0B03> <CABC> <0B06> <0B07> <CACC> endbfrange 100 beginbfrange <0B0B> <0B0C> <CAD8> <0B14> <0B15> <CB20> <0B17> <0B18> <CB48> <0B1B> <0B1C> <CB58> <0B1F> <0B20> <CB78> <0B27> <0B28> <CC0C> <0B2B> <0B2C> <CC1C> <0B2D> <0B2E> <CC21> <0B2F> <0B31> <CC27> <0B35> <0B36> <CC38> <0B37> <0B3A> <CC3B> <0B3B> <0B3C> <CC44> <0B3F> <0B40> <CC54> <0B41> <0B43> <CC57> <0B4A> <0B4B> <CC98> <0B4E> <0B4F> <CCA8> <0B50> <0B52> <CCAB> <0B53> <0B54> <CCB4> <0B57> <0B58> <CCC4> <0B61> <0B62> <CD08> <0B65> <0B66> <CD18> <0B70> <0B71> <CD6C> <0B76> <0B77> <CD94> <0B7A> <0B7B> <CDA4> <0B85> <0B86> <CDF8> <0B8E> <0B8F> <CE20> <0B92> <0B93> <CE30> <0B96> <0B97> <CE58> <0B99> <0B9B> <CE5F> <0B9C> <0B9D> <CE68> <0BA0> <0BA1> <CE74> <0BA4> <0BA5> <CE84> <0BA8> <0BA9> <CE90> <0BAC> <0BAD> <CEA0> <0BAE> <0BB0> <CEA3> <0BB1> <0BB2> <CEAC> <0BB4> <0BB5> <CEE4> <0BB7> <0BB8> <CEEB> <0BB9> <0BBA> <CEF4> <0BBB> <0BBD> <CEF7> <0BBE> <0BBF> <CF00> <0BC2> <0BC3> <CF10> <0BC9> <0BCA> <CF2C> <0BCB> <0BCD> <CF2F> <0BCF> <0BD0> <CF54> <0BD3> <0BD4> <CF64> <0BD7> <0BD8> <CF70> <0BE2> <0BE3> <CFE0> <0BE6> <0BE7> <CFF0> <0BF0> <0BF1> <D034> <0BF4> <0BF5> <D044> <0BFC> <0BFD> <D06C> <0C00> <0C01> <D07C> <0C03> <0C04> <D0A4> <0C07> <0C08> <D0B4> <0C0B> <0C0C> <D0C0> <0C0E> <0C0F> <D0C8> <0C10> <0C11> <D0D0> <0C12> <0C14> <D0D3> <0C15> <0C16> <D0DC> <0C19> <0C1A> <D0EC> <0C1B> <0C1D> <D0EF> <0C20> <0C21> <D130> <0C25> <0C26> <D140> <0C27> <0C29> <D143> <0C2A> <0C2B> <D14C> <0C2E> <0C2F> <D15C> <0C37> <0C38> <D1A0> <0C3B> <0C3C> <D1B0> <0C48> <0C49> <D22C> <0C4C> <0C4D> <D23C> <0C53> <0C54> <D280> <0C57> <0C58> <D290> <0C5F> <0C60> <D2B8> <0C62> <0C63> <D2BF> <0C65> <0C66> <D2C8> <0C6B> <0C6C> <D2E4> <0C6D> <0C6E> <D2F0> <0C71> <0C72> <D300> <0C75> <0C77> <D30C> <0C7B> <0C7C> <D31C> <0C7D> <0C7F> <D31F> <0C81> <0C82> <D328> <0C85> <0C86> <D338> <0C87> <0C89> <D33B> <0C8A> <0C8B> <D344> <0C8C> <0C8D> <D37C> <0C90> <0C91> <D38C> <0C92> <0C94> <D38F> <0C95> <0C96> <D398> <0C99> <0C9A> <D3A8> <0CA0> <0CA1> <D3C4> <0CA2> <0CA3> <D3C8> <0CA8> <0CA9> <D3EC> <0CAC> <0CAD> <D3FC> <0CB9> <0CBA> <D478> <0CBC> <0CBD> <D47F> <0CBF> <0CC0> <D488> <0CD3> <0CD4> <D514> <0CD6> <0CD7> <D53C> endbfrange 100 beginbfrange <0CDA> <0CDB> <D54C> <0CDE> <0CDF> <D558> <0CE3> <0CE4> <D568> <0CE7> <0CE8> <D574> <0CEB> <0CEC> <D584> <0CED> <0CEF> <D587> <0CF2> <0CF3> <D5C8> <0CF7> <0CF8> <D5D8> <0CFB> <0CFC> <D5E4> <0D03> <0D04> <D600> <0D07> <0D08> <D610> <0D09> <0D0B> <D613> <0D10> <0D11> <D638> <0D15> <0D16> <D648> <0D1A> <0D1B> <D654> <0D20> <0D21> <D670> <0D25> <0D26> <D68C> <0D31> <0D32> <D6C4> <0D3E> <0D3F> <D6FC> <0D43> <0D44> <D718> <0D47> <0D48> <D728> <0D4B> <0D4C> <D734> <0D52> <0D53> <D750> <0D55> <0D58> <D756> <0D59> <0D5A> <D760> <0D61> <0D62> <D77C> <0D64> <0D65> <D788> <0D68> <0D69> <D798> <0D78> <0D79> <67B6> <0DC7> <0DC8> <9451> <0FCF> <0FD0> <887E> <0FF3> <0FF4> <671E> <1008> <1009> <7947> <101A> <101B> <9A0E> <125A> <125B> <5FD8> <12A2> <12A3> <6478> <12EA> <12EB> <7D0A> <130B> <130C> <65FB> <1375> <1376> <88F4> <1381> <1382> <767D> <13E8> <13E9> <5CEF> <140D> <140E> <8150> <144D> <144F> <6BD6> <15F4> <15F5> <96A7> <17D5> <17D6> <7AA9> <1853> <1854> <96E8> <18AD> <18AE> <5E7C> <18B2> <18B3> <6108> <18B9> <18BA> <6961> <18BF> <18C0> <7336> <1BAD> <1BAE> <6158> <1DDD> <1DDE> <9591> <1EC7> <1EC8> <78BA> <1EE7> <1EE8> <6643> <1F71> <1F72> <71B9> <1F78> <1F79> <3001> <1F7F> <1F80> <3014> <1F81> <1F8A> <3008> <1F8D> <1F8E> <FF08> <1F91> <1F96> <FF1A> <1F9A> <1F9D> <FF5B> <1F9E> <1FFB> <0020> <2005> <2006> <300E> <2007> <2008> <300A> <2009> <200A> <3008> <200B> <200C> <0028> <2015> <2016> <0028> <2019> <201A> <3016> <201B> <201E> <3016> <2027> <2028> <2020> <202F> <2030> <02D6> <2037> <2038> <003C> <203A> <203B> <207D> <2040> <2041> <2229> <2047> <2049> <3021> <2054> <2055> <3014> <205B> <205C> <3001> <2061> <2062> <0028> <2063> <2064> <3016> <2065> <2066> <3010> <2096> <209F> <278A> <20C4> <20DD> <24B6> <211C> <211D> <22CE> <211F> <2120> <2280> <2121> <2124> <2270> <2129> <212A> <2276> <212C> <212D> <22DA> <2145> <214D> <2460> <21A4> <21A7> <3008> <21E1> <21EA> <2776> <220F> <2210> <2225> <2214> <2215> <2266> <2217> <2219> <2295> <2229> <222A> <226E> <2258> <225B> <2494> <2267> <2268> <2190> <226A> <226D> <2196> <22C0> <22C1> <21C4> <2352> <2356> <2483> <23E6> <23E9> <21E0> endbfrange 100 beginbfrange <2455> <245A> <328A> <2462> <2465> <300C> <2467> <2468> <21E6> <2475> <2476> <AC02> <2477> <2478> <AC05> <2479> <247D> <AC0B> <247F> <2480> <AC1E> <2481> <2483> <AC21> <2484> <248A> <AC25> <248C> <2491> <AC32> <2492> <2493> <AC3A> <2494> <2496> <AC3D> <2497> <24A0> <AC41> <24A2> <24A7> <AC4E> <24A8> <24AA> <AC55> <24AB> <24AD> <AC59> <24AE> <24C0> <AC5D> <24C1> <24C2> <AC72> <24C3> <24C4> <AC75> <24C6> <24CA> <AC7B> <24CC> <24CD> <AC87> <24CE> <24D0> <AC8D> <24D1> <24D3> <AC91> <24D4> <24DA> <AC95> <24DC> <24E1> <ACA2> <24E3> <24E4> <ACAD> <24E5> <24EB> <ACB1> <24ED> <24EF> <ACBE> <24F0> <24F1> <ACC2> <24F2> <24F4> <ACC5> <24F5> <24F7> <ACC9> <24F8> <24FF> <ACCD> <2501> <2508> <ACD8> <2509> <250A> <ACE2> <250B> <250C> <ACE5> <250F> <2510> <ACED> <2513> <2517> <ACF7> <2518> <2519> <ACFE> <251A> <251C> <AD01> <251E> <2522> <AD07> <2525> <252A> <AD12> <252B> <252D> <AD19> <252E> <2530> <AD1D> <2531> <2538> <AD21> <2539> <253A> <AD2A> <253B> <2540> <AD2E> <2541> <2542> <AD36> <2543> <2545> <AD39> <2546> <254C> <AD3D> <254F> <2554> <AD4A> <2555> <2557> <AD51> <2558> <255A> <AD55> <255B> <2562> <AD59> <2564> <256B> <AD64> <256C> <256D> <AD6E> <256E> <256F> <AD71> <2570> <2573> <AD77> <2576> <257A> <AD83> <257B> <257C> <AD8A> <257D> <257F> <AD8D> <2580> <258A> <AD91> <258B> <2590> <AD9E> <2591> <25A2> <ADA5> <25A3> <25AA> <ADB8> <25AB> <25AC> <ADC2> <25AD> <25AF> <ADC5> <25B0> <25B6> <ADC9> <25B8> <25BF> <ADD4> <25C0> <25C2> <ADDD> <25C3> <25C5> <ADE1> <25C6> <25D8> <ADE5> <25D9> <25DA> <ADFA> <25DB> <25DC> <ADFD> <25DD> <25E2> <AE02> <25E5> <25EA> <AE0E> <25EB> <25FF> <AE15> <2600> <2605> <AE2A> <2606> <2607> <AE32> <2608> <2609> <AE35> <260B> <260F> <AE3B> <2612> <2614> <AE47> <2617> <2619> <AE51> <261B> <261F> <AE57> <2621> <2623> <AE62> <2624> <2625> <AE66> <2626> <2627> <AE6A> <2628> <262A> <AE6D> <262B> <2631> <AE71> <2633> <2638> <AE7E> <2639> <263E> <AE86> <263F> <266D> <AE8D> <266F> <2671> <AEC1> <2672> <2678> <AEC5> <267A> <267F> <AED2> <2680> <2681> <AEDA> <2682> <268C> <AEDD> <268D> <268E> <AEE9> <2690> <2695> <AEEE> <2696> <2698> <AEF5> <2699> <269B> <AEF9> endbfrange 100 beginbfrange <269C> <26A5> <AEFD> <26A6> <26A9> <AF09> <26AA> <26AB> <AF0E> <26AC> <26C6> <AF11> <26C7> <26C8> <AF2E> <26CB> <26D1> <AF35> <26D4> <26D7> <AF44> <26D8> <26DD> <AF4A> <26DE> <26E8> <AF51> <26E9> <26EE> <AF5E> <26EF> <26FF> <AF66> <2700> <2701> <AF77> <2702> <2707> <AF7A> <2708> <270A> <AF81> <270B> <270D> <AF85> <270E> <2714> <AF89> <2715> <2717> <AF92> <2718> <271D> <AF96> <271E> <2738> <AF9D> <2739> <273A> <AFBA> <273B> <273D> <AFBD> <273E> <2743> <AFC1> <2746> <274A> <AFCF> <274B> <2751> <AFD5> <2752> <275C> <AFDD> <275D> <2762> <AFEA> <2763> <2764> <AFF2> <2765> <2767> <AFF5> <2768> <276E> <AFF9> <276F> <2770> <B002> <2771> <2777> <B005> <2778> <277A> <B00D> <277B> <277D> <B011> <277E> <2784> <B015> <2785> <278E> <B01E> <278F> <27A9> <B029> <27AA> <27AB> <B046> <27AF> <27B2> <B04F> <27B5> <27B7> <B05A> <27B8> <27D5> <B05E> <27D6> <27D7> <B07E> <27D8> <27DA> <B081> <27DB> <27E1> <B085> <27E4> <27E9> <B092> <27EB> <27EC> <B09D> <27ED> <27F1> <B0A3> <27F5> <27F6> <B0B6> <27F7> <27F9> <B0B9> <27FA> <27FF> <B0BD> <2802> <2807> <B0CA> <2808> <2809> <B0D2> <280A> <280C> <B0D5> <280D> <2813> <B0D9> <2814> <2817> <B0E1> <2818> <2839> <B0E6> <283B> <283D> <B10D> <283F> <2842> <B114> <2844> <2848> <B11E> <2849> <284A> <B126> <284B> <284D> <B129> <284E> <2854> <B12D> <2856> <285B> <B13A> <285C> <285D> <B142> <285E> <2860> <B145> <2861> <2867> <B149> <2868> <2869> <B152> <286A> <286B> <B156> <286C> <286E> <B159> <286F> <2871> <B15D> <2872> <2888> <B161> <2889> <288A> <B17A> <288B> <288D> <B17D> <288F> <2893> <B183> <2896> <2899> <B18E> <289A> <289C> <B195> <289D> <289F> <B199> <28A0> <28AA> <B19D> <28AB> <28CD> <B1A9> <28CE> <28D0> <B1CD> <28D1> <28D3> <B1D1> <28D4> <28DA> <B1D5> <28DC> <28E3> <B1E0> <28E4> <28E5> <B1EA> <28E6> <28E8> <B1ED> <28E9> <28F0> <B1F1> <28F3> <28F8> <B1FE> <28F9> <28FA> <B206> <28FB> <28FC> <B209> <28FD> <28FF> <B20D> <2900> <2903> <B210> <2906> <290B> <B21A> <290C> <291E> <B221> <291F> <2925> <B235> <2926> <2940> <B23D> <2941> <2943> <B259> <2944> <2946> <B25D> <2947> <294D> <B261> <294E> <2957> <B26A> <2958> <295D> <B276> <295E> <2964> <B27D> endbfrange 100 beginbfrange <2965> <2967> <B286> <2968> <296D> <B28A> <296E> <296F> <B292> <2970> <2972> <B295> <2973> <2977> <B29B> <297A> <297C> <B2A7> <297E> <2980> <B2AD> <2981> <2983> <B2B1> <2984> <2996> <B2B5> <2997> <2998> <B2CA> <2999> <299B> <B2CD> <299D> <29A1> <B2D3> <29A4> <29A7> <B2DE> <29AA> <29AB> <B2E9> <29AC> <29AE> <B2F0> <29B0> <29B2> <B2FC> <29B3> <29B4> <B302> <29B5> <29B7> <B305> <29B8> <29BE> <B309> <29C0> <29C5> <B316> <29C6> <29FC> <B31D> <29FE> <29FF> <B359> <2A01> <2A04> <B360> <2A08> <2A09> <B36C> <2A0B> <2A0C> <B372> <2A0D> <2A0F> <B375> <2A10> <2A16> <B379> <2A18> <2A1D> <B386> <2A1E> <2A20> <B38D> <2A21> <2A23> <B391> <2A24> <2A2E> <B395> <2A2F> <2A34> <B3A2> <2A35> <2A37> <B3A9> <2A38> <2A4E> <B3AD> <2A4F> <2A50> <B3C6> <2A51> <2A52> <B3C9> <2A55> <2A57> <B3D1> <2A5C> <2A5D> <B3DE> <2A5E> <2A60> <B3E1> <2A61> <2A63> <B3E5> <2A64> <2A76> <B3E9> <2A77> <2A89> <B3FD> <2A8A> <2A90> <B411> <2A91> <2A93> <B419> <2A94> <2A96> <B41D> <2A97> <2A9D> <B421> <2A9F> <2AA6> <B42C> <2AA7> <2AC1> <B435> <2AC2> <2AC3> <B452> <2AC4> <2AC6> <B455> <2AC7> <2ACD> <B459> <2AD0> <2AD5> <B466> <2AD6> <2AE8> <B46D> <2AE9> <2AEF> <B481> <2AF0> <2AFF> <B489> <2B00> <2B03> <B499> <2B04> <2B09> <B49E> <2B0A> <2B0C> <B4A5> <2B0D> <2B0F> <B4A9> <2B10> <2B17> <B4AD> <2B1A> <2B1F> <B4BA> <2B20> <2B22> <B4C1> <2B23> <2B25> <B4C5> <2B26> <2B2C> <B4C9> <2B2D> <2B30> <B4D1> <2B31> <2B36> <B4D6> <2B37> <2B38> <B4DE> <2B39> <2B3A> <B4E1> <2B3C> <2B40> <B4E7> <2B43> <2B48> <B4F2> <2B49> <2B63> <B4F9> <2B64> <2B65> <B516> <2B66> <2B67> <B519> <2B68> <2B6E> <B51D> <2B70> <2B74> <B52B> <2B75> <2B76> <B532> <2B77> <2B79> <B535> <2B7A> <2B80> <B539> <2B82> <2B86> <B546> <2B87> <2B88> <B54E> <2B89> <2B8B> <B551> <2B8C> <2B92> <B555> <2B94> <2BD1> <B562> <2BD2> <2BD3> <B5A2> <2BD4> <2BD6> <B5A5> <2BD8> <2BDB> <B5AC> <2BDD> <2BE1> <B5B6> <2BE2> <2BE3> <B5BE> <2BE4> <2BE6> <B5C1> <2BE7> <2BED> <B5C5> <2BEF> <2BF4> <B5D2> <2BF5> <2BFF> <B5D9> <2C00> <2C07> <B5E4> <2C08> <2C2A> <B5ED> <2C2B> <2C2C> <B612> <2C2D> <2C2F> <B615> <2C30> <2C3B> <B619> <2C3C> <2C41> <B626> <2C42> <2C48> <B62D> <2C49> <2C5B> <B635> endbfrange 100 beginbfrange <2C5C> <2C76> <B649> <2C77> <2C79> <B665> <2C7A> <2CAC> <B669> <2CAD> <2CAE> <B69E> <2CAF> <2CB1> <B6A1> <2CB2> <2CB7> <B6A5> <2CB8> <2CBB> <B6AD> <2CBC> <2CDD> <B6B2> <2CDE> <2CF8> <B6D5> <2CF9> <2CFB> <B6F1> <2CFC> <2CFE> <B6F5> <2D00> <2D05> <B6FA> <2D06> <2D08> <B702> <2D09> <2D2A> <B706> <2D2B> <2D2C> <B72A> <2D2D> <2D2E> <B72D> <2D2F> <2D35> <B731> <2D37> <2D3E> <B73C> <2D3F> <2D41> <B745> <2D42> <2D44> <B749> <2D45> <2D4B> <B74D> <2D4C> <2D55> <B756> <2D56> <2D58> <B761> <2D59> <2D5B> <B765> <2D5C> <2D62> <B769> <2D65> <2D6A> <B776> <2D6B> <2D6C> <B77E> <2D6D> <2D6F> <B781> <2D70> <2D76> <B785> <2D78> <2D7A> <B793> <2D7B> <2D7C> <B79A> <2D7D> <2D7F> <B79D> <2D80> <2D86> <B7A1> <2D88> <2D8D> <B7AE> <2D8E> <2D8F> <B7B6> <2D90> <2D9D> <B7B9> <2D9F> <2DC0> <B7CA> <2DC1> <2DC2> <B7EE> <2DC3> <2DC5> <B7F1> <2DC6> <2DCC> <B7F5> <2DCE> <2DD2> <B802> <2DD3> <2DD4> <B80A> <2DD5> <2DD7> <B80D> <2DD8> <2DDE> <B811> <2DE1> <2DE6> <B81E> <2DE7> <2DE8> <B826> <2DE9> <2DEB> <B829> <2DEC> <2DF2> <B82D> <2DF4> <2DF9> <B83A> <2DFA> <2DFC> <B841> <2DFD> <2DFF> <B845> <2E00> <2E08> <B848> <2E0A> <2E11> <B854> <2E12> <2E13> <B85E> <2E14> <2E16> <B861> <2E17> <2E1D> <B865> <2E20> <2E25> <B872> <2E26> <2E28> <B879> <2E29> <2E38> <B87D> <2E39> <2E52> <B88E> <2E53> <2E59> <B8A9> <2E5A> <2E5C> <B8B1> <2E5D> <2E5F> <B8B5> <2E60> <2E66> <B8B9> <2E69> <2E6E> <B8C6> <2E6F> <2E71> <B8CD> <2E72> <2E74> <B8D1> <2E75> <2E7C> <B8D5> <2E7F> <2E84> <B8E2> <2E85> <2E86> <B8EA> <2E87> <2E89> <B8ED> <2E8A> <2E90> <B8F1> <2E93> <2E98> <B8FE> <2E99> <2EAB> <B905> <2EAC> <2EB2> <B919> <2EB3> <2ECD> <B921> <2ECE> <2ECF> <B93E> <2ED0> <2ED2> <B941> <2ED3> <2ED9> <B945> <2EDA> <2EDB> <B94D> <2EDD> <2EE2> <B952> <2EE3> <2EE4> <B95A> <2EE5> <2EE7> <B95D> <2EE8> <2EEE> <B961> <2EF1> <2EF6> <B96E> <2EF7> <2EF8> <B976> <2EF9> <2EFB> <B979> <2EFC> <2EFF> <B97D> <2F00> <2F02> <B981> <2F05> <2F06> <B98B> <2F07> <2F23> <B98F> <2F24> <2F25> <B9AE> <2F26> <2F28> <B9B1> <2F29> <2F2F> <B9B5> <2F32> <2F37> <B9C2> <2F38> <2F39> <B9CA> <2F3B> <2F3F> <B9D3> <2F42> <2F43> <B9DF> <2F45> <2F46> <B9E6> <2F47> <2F49> <B9E9> endbfrange 100 beginbfrange <2F4A> <2F50> <B9ED> <2F52> <2F56> <B9FB> <2F57> <2F5C> <BA02> <2F5D> <2F68> <BA09> <2F69> <2F8A> <BA16> <2F8B> <2F8C> <BA3A> <2F8D> <2F8F> <BA3D> <2F91> <2F95> <BA43> <2F98> <2F9B> <BA4F> <2F9C> <2F9D> <BA56> <2F9E> <2FA0> <BA59> <2FA1> <2FA7> <BA5D> <2FA9> <2FAE> <BA6A> <2FAF> <2FB0> <BA72> <2FB1> <2FB3> <BA75> <2FB4> <2FBD> <BA79> <2FBF> <2FC2> <BA88> <2FC3> <2FDD> <BA8D> <2FDF> <2FE1> <BAAD> <2FE3> <2FE7> <BAB3> <2FEA> <2FEF> <BABE> <2FF0> <2FF2> <BAC5> <2FF3> <2FFF> <BAC9> <3000> <3001> <BAD6> <3002> <3023> <BADA> <3024> <3026> <BAFD> <3027> <3029> <BB01> <302A> <3031> <BB05> <3034> <3039> <BB12> <303A> <303C> <BB19> <303D> <303F> <BB1D> <3040> <3047> <BB21> <3049> <3050> <BB2C> <3052> <3053> <BB39> <3054> <3058> <BB3F> <305B> <305D> <BB4A> <305F> <3061> <BB51> <3062> <3064> <BB55> <3065> <306C> <BB59> <306E> <3075> <BB64> <3076> <3090> <BB6D> <3091> <3093> <BB89> <3094> <3096> <BB8D> <3097> <30A9> <BB91> <30AA> <30AC> <BBA5> <30AD> <30AF> <BBA9> <30B0> <30B6> <BBAD> <30B7> <30B8> <BBB5> <30B9> <30C0> <BBB8> <30C1> <30C3> <BBC1> <30C4> <30C6> <BBC5> <30C7> <30CD> <BBC9> <30CE> <30CF> <BBD1> <30D0> <30F3> <BBD4> <30F4> <30F5> <BBFA> <30F6> <30F7> <BBFD> <30F9> <30FD> <BC03> <3101> <3102> <BC12> <3103> <3104> <BC19> <3105> <3108> <BC20> <310B> <310D> <BC2A> <310E> <310F> <BC2E> <3110> <3111> <BC32> <3112> <3114> <BC35> <3115> <311B> <BC39> <311D> <311F> <BC46> <3120> <3121> <BC4A> <3122> <3123> <BC4E> <3124> <312F> <BC51> <3130> <3155> <BC5E> <3156> <3157> <BC86> <3158> <3159> <BC89> <315B> <315F> <BC8F> <3162> <3166> <BC9B> <3167> <3168> <BCA2> <3169> <316A> <BCA5> <316B> <3171> <BCA9> <3173> <3178> <BCB6> <3179> <317A> <BCBE> <317B> <317D> <BCC1> <317E> <3185> <BCC5> <3187> <3189> <BCD2> <318A> <318B> <BCD6> <318C> <318E> <BCD9> <318F> <31A5> <BCDD> <31A7> <31A9> <BCF9> <31AA> <31B0> <BCFD> <31B3> <31B8> <BD0A> <31B9> <31BB> <BD11> <31BC> <31CA> <BD15> <31CB> <31D1> <BD25> <31D2> <31E4> <BD2D> <31E5> <31EB> <BD41> <31EC> <31ED> <BD4A> <31EE> <31F0> <BD4D> <31F1> <31F7> <BD51> <31F8> <31FF> <BD5A> <3200> <3201> <BD62> <3202> <3204> <BD65> <3205> <321B> <BD69> endbfrange 100 beginbfrange <321C> <321D> <BD82> <321E> <321F> <BD85> <3220> <3224> <BD8B> <3227> <3229> <BD96> <322B> <3231> <BD9D> <3232> <323C> <BDA5> <323D> <3243> <BDB1> <3244> <325E> <BDB9> <325F> <3260> <BDD6> <3261> <3263> <BDD9> <3264> <326F> <BDDD> <3270> <3275> <BDEA> <3276> <3278> <BDF1> <3279> <327B> <BDF5> <327C> <3282> <BDF9> <3283> <3284> <BE01> <3286> <328B> <BE06> <328C> <328D> <BE0E> <328E> <3290> <BE11> <3291> <3297> <BE15> <3299> <32BC> <BE20> <32BD> <32BE> <BE46> <32BF> <32C1> <BE49> <32C3> <32C7> <BE4F> <32CA> <32CD> <BE5C> <32CE> <32CF> <BE62> <32D0> <32D2> <BE65> <32D4> <32D8> <BE6B> <32DA> <32DE> <BE76> <32DF> <32E0> <BE7E> <32E1> <32E3> <BE81> <32E4> <32EA> <BE85> <32EC> <32F1> <BE92> <32F2> <32FF> <BE9A> <3300> <3326> <BEA9> <3327> <3328> <BED2> <3329> <332A> <BED5> <332B> <3331> <BED9> <3332> <3333> <BEE1> <3334> <3339> <BEE6> <333A> <334D> <BEED> <334E> <3353> <BF02> <3354> <3361> <BF0A> <3363> <3384> <BF1E> <3385> <3386> <BF42> <3387> <3389> <BF45> <338A> <3390> <BF49> <3391> <3393> <BF52> <3394> <33D1> <BF56> <33D2> <33EC> <BF95> <33ED> <33FF> <BFB1> <3401> <3406> <BFC6> <3407> <3408> <BFCE> <3409> <340B> <BFD1> <340C> <3412> <BFD5> <3413> <3414> <BFDD> <3416> <346F> <BFE2> <3470> <3483> <C03D> <3484> <3489> <C052> <348A> <348C> <C059> <348D> <348F> <C05D> <3490> <3496> <C061> <3497> <34BC> <C06A> <34BD> <34BE> <C092> <34BF> <34C1> <C095> <34C2> <34C8> <C099> <34CB> <34D0> <C0A6> <34D2> <34D3> <C0B1> <34D4> <34D8> <C0B7> <34DA> <34DC> <C0C2> <34DD> <34DE> <C0C6> <34DF> <34E0> <C0CA> <34E1> <34E3> <C0CD> <34E4> <34EA> <C0D1> <34EC> <34F1> <C0DE> <34F2> <34F3> <C0E6> <34F4> <34F6> <C0E9> <34F7> <34FD> <C0ED> <3500> <3505> <C0FA> <3506> <3508> <C101> <3509> <350B> <C105> <350C> <3512> <C109> <3513> <3516> <C111> <3517> <351C> <C116> <351D> <351E> <C121> <3520> <3523> <C128> <3525> <3528> <C132> <352A> <352B> <C13A> <352C> <352E> <C13D> <352F> <3535> <C141> <3537> <353C> <C14E> <353D> <353E> <C156> <353F> <3541> <C159> <3542> <3548> <C15D> <354A> <354F> <C16A> <3550> <3552> <C171> <3553> <3555> <C175> <3556> <3561> <C179> <3562> <3567> <C186> <3569> <356B> <C191> endbfrange 100 beginbfrange <356D> <3571> <C197> <3574> <3576> <C1A2> <3577> <3578> <C1A6> <3579> <357A> <C1AA> <357B> <357D> <C1AD> <357E> <3589> <C1B1> <358A> <358F> <C1BE> <3590> <3592> <C1C5> <3593> <3595> <C1C9> <3596> <359C> <C1CD> <359D> <359E> <C1D5> <359F> <35A5> <C1D9> <35A6> <35A8> <C1E1> <35A9> <35AB> <C1E5> <35AC> <35B2> <C1E9> <35B4> <35BB> <C1F4> <35BC> <35BD> <C1FE> <35BE> <35C0> <C201> <35C1> <35C7> <C205> <35CA> <35CF> <C212> <35D0> <35D1> <C21A> <35D2> <35D3> <C21D> <35D4> <35DA> <C221> <35E0> <35F2> <C235> <35F3> <35F9> <C249> <35FA> <35FB> <C252> <35FC> <35FE> <C255> <3600> <3605> <C25A> <3606> <3609> <C261> <360A> <360F> <C266> <3610> <3611> <C26E> <3612> <3614> <C271> <3615> <361B> <C275> <361E> <3623> <C282> <3624> <3629> <C28A> <362A> <3630> <C291> <3631> <3632> <C299> <3634> <3639> <C29E> <363A> <363B> <C2A6> <363C> <363E> <C2A9> <363F> <3644> <C2AE> <3647> <3668> <C2BA> <3669> <366A> <C2DE> <366B> <366C> <C2E1> <366D> <3672> <C2E5> <3675> <3678> <C2F2> <367B> <367D> <C2FD> <367E> <3684> <C301> <3685> <3686> <C30A> <3687> <368B> <C30E> <368C> <368D> <C316> <368E> <3690> <C319> <3691> <3697> <C31D> <3698> <3699> <C326> <369A> <36B4> <C32A> <36B5> <36D6> <C346> <36D7> <36D8> <C36A> <36D9> <36DB> <C36D> <36DD> <36E1> <C373> <36E2> <36E3> <C37A> <36E4> <36E9> <C37E> <36EA> <36EC> <C385> <36ED> <36EF> <C389> <36F0> <36FF> <C38D> <3700> <3722> <C39D> <3723> <3739> <C3C1> <373A> <373B> <C3DA> <373C> <373D> <C3DD> <373F> <3743> <C3E3> <3744> <3746> <C3EA> <3747> <374C> <C3EE> <374D> <374E> <C3F6> <374F> <375D> <C3F9> <375E> <3764> <C409> <3765> <3777> <C411> <3778> <377E> <C425> <377F> <3781> <C42D> <3782> <3784> <C431> <3785> <378B> <C435> <378C> <3795> <C43E> <3796> <37B0> <C449> <37B1> <37B2> <C466> <37B3> <37B5> <C469> <37B6> <37BC> <C46D> <37BD> <37BF> <C476> <37C0> <37C5> <C47A> <37C6> <37D8> <C481> <37D9> <37DF> <C495> <37E0> <37FA> <C49D> <37FB> <37FD> <C4B9> <37FE> <37FF> <C4BD> <3800> <3829> <C4BF> <382A> <382F> <C4EA> <3830> <3831> <C4F2> <3832> <3834> <C4F5> <3836> <3839> <C4FB> <383A> <3843> <C502> <3844> <3846> <C50D> <3847> <3849> <C511> <384A> <3850> <C515> endbfrange 100 beginbfrange <3851> <385B> <C51D> <385C> <385D> <C52A> <385E> <3860> <C52D> <3861> <3867> <C531> <386A> <386F> <C53E> <3870> <3871> <C546> <3873> <3876> <C54F> <3878> <387A> <C55A> <387C> <387D> <C562> <387E> <3880> <C565> <3881> <3887> <C569> <3889> <388E> <C576> <388F> <3890> <C57E> <3891> <3893> <C581> <3894> <3895> <C585> <3896> <3899> <C588> <389C> <389E> <C592> <38A0> <38A2> <C599> <38A3> <38A5> <C59D> <38A6> <38AD> <C5A1> <38AE> <38B7> <C5AA> <38B8> <38B9> <C5B6> <38BB> <38BF> <C5BF> <38C3> <38C4> <C5D2> <38C5> <38C7> <C5D5> <38C8> <38CE> <C5D9> <38D1> <38D6> <C5E6> <38D8> <38DA> <C5F1> <38DC> <38DF> <C5F8> <38E0> <38E2> <C602> <38E3> <38E5> <C609> <38E6> <38E8> <C60D> <38E9> <38EF> <C611> <38F1> <38F7> <C61D> <38F8> <38F9> <C626> <38FA> <38FC> <C629> <38FE> <38FF> <C631> <3903> <3906> <C63C> <3907> <3908> <C642> <3909> <390B> <C645> <390C> <3912> <C649> <3914> <3919> <C656> <391A> <391B> <C65E> <391C> <3926> <C661> <3927> <3928> <C66D> <392A> <392F> <C672> <3930> <3931> <C67A> <3932> <3934> <C67D> <3935> <393B> <C681> <393E> <3943> <C68E> <3944> <3945> <C696> <3946> <3948> <C699> <3949> <394F> <C69D> <3952> <3957> <C6AA> <3958> <3959> <C6B2> <395A> <395C> <C6B5> <395D> <3961> <C6BB> <3964> <3969> <C6C6> <396A> <396B> <C6CE> <396C> <396E> <C6D1> <396F> <3975> <C6D5> <3976> <3977> <C6DE> <3978> <397D> <C6E2> <397E> <397F> <C6EA> <3980> <3982> <C6ED> <3983> <3989> <C6F1> <398A> <398C> <C6FA> <398D> <3992> <C6FE> <3993> <3994> <C706> <3995> <3997> <C709> <3998> <399E> <C70D> <39A1> <39A6> <C71A> <39A7> <39A8> <C722> <39A9> <39AB> <C725> <39AC> <39B2> <C729> <39B6> <39B9> <C738> <39BA> <39BB> <C73E> <39BC> <39BE> <C741> <39BF> <39C3> <C745> <39C7> <39C9> <C759> <39CA> <39CC> <C75D> <39CD> <39D3> <C761> <39D4> <39D5> <C769> <39D6> <39DD> <C76C> <39DE> <39DF> <C776> <39E0> <39E2> <C779> <39E3> <39E6> <C77F> <39E8> <39EA> <C78B> <39EC> <39ED> <C792> <39F0> <39F4> <C79B> <39F6> <39FA> <C7A7> <39FB> <39FC> <C7AE> <39FD> <39FF> <C7B1> <3A00> <3A06> <C7B5> <3A08> <3A0D> <C7C2> <3A0E> <3A0F> <C7CA> <3A12> <3A18> <C7D1> <3A19> <3A1C> <C7D9> <3A1D> <3A22> <C7DE> <3A23> <3A25> <C7E5> endbfrange 100 beginbfrange <3A26> <3A28> <C7E9> <3A29> <3A3B> <C7ED> <3A3C> <3A3D> <C802> <3A3E> <3A40> <C805> <3A42> <3A46> <C80B> <3A49> <3A4D> <C817> <3A4E> <3A4F> <C81E> <3A50> <3A52> <C821> <3A53> <3A59> <C825> <3A5C> <3A61> <C832> <3A62> <3A64> <C839> <3A65> <3A67> <C83D> <3A68> <3A6E> <C841> <3A6F> <3A70> <C84A> <3A71> <3A76> <C84E> <3A77> <3A91> <C855> <3A92> <3A93> <C872> <3A94> <3A96> <C875> <3A98> <3A9C> <C87B> <3A9F> <3AA1> <C888> <3AA2> <3AA7> <C88E> <3AA8> <3AAF> <C895> <3AB2> <3AB7> <C8A2> <3AB8> <3ACA> <C8A9> <3ACB> <3AD0> <C8BE> <3AD1> <3AD3> <C8C5> <3AD4> <3AD6> <C8C9> <3AD7> <3ADD> <C8CD> <3AE0> <3AE5> <C8DA> <3AE6> <3AE7> <C8E2> <3AE8> <3AF7> <C8E5> <3AF8> <3AFD> <C8F6> <3AFE> <3AFF> <C8FE> <3B00> <3B02> <C901> <3B03> <3B07> <C907> <3B0A> <3B0F> <C912> <3B10> <3B22> <C919> <3B23> <3B29> <C92D> <3B2A> <3B44> <C935> <3B45> <3B46> <C952> <3B47> <3B49> <C955> <3B4A> <3B50> <C959> <3B52> <3B59> <C964> <3B5A> <3B5C> <C96D> <3B5D> <3B5F> <C971> <3B60> <3B66> <C975> <3B67> <3B71> <C97D> <3B72> <3B73> <C98A> <3B74> <3B76> <C98D> <3B77> <3B7D> <C991> <3B80> <3BA1> <C99E> <3BA2> <3BA3> <C9C2> <3BA4> <3BA5> <C9C5> <3BA7> <3BAB> <C9CB> <3BAE> <3BAF> <C9D7> <3BB1> <3BB2> <C9DE> <3BB5> <3BB6> <C9E5> <3BB7> <3BBA> <C9E8> <3BBC> <3BC1> <C9F2> <3BC2> <3BC3> <C9FA> <3BC4> <3BC6> <C9FD> <3BC7> <3BCD> <CA01> <3BCF> <3BD4> <CA0E> <3BD5> <3BD7> <CA15> <3BD8> <3BE7> <CA19> <3BE8> <3BFF> <CA2A> <3C00> <3C09> <CA42> <3C0A> <3C0B> <CA4E> <3C0C> <3C0E> <CA51> <3C0F> <3C15> <CA55> <3C17> <3C1C> <CA62> <3C1D> <3C30> <CA69> <3C31> <3C36> <CA7E> <3C37> <3C49> <CA85> <3C4A> <3C6C> <CA99> <3C6D> <3C6E> <CABE> <3C6F> <3C71> <CAC1> <3C72> <3C78> <CAC5> <3C7C> <3C7F> <CAD4> <3C80> <3C85> <CADA> <3C86> <3C90> <CAE1> <3C91> <3C97> <CAED> <3C98> <3CAA> <CAF5> <3CAB> <3CB1> <CB09> <3CB2> <3CB4> <CB11> <3CB5> <3CB7> <CB15> <3CB8> <3CBE> <CB19> <3CBF> <3CDD> <CB22> <3CDE> <3CE3> <CB42> <3CE4> <3CE5> <CB4A> <3CE6> <3CE8> <CB4D> <3CE9> <3CEF> <CB51> <3CF0> <3CF2> <CB5A> <3CF3> <3CF8> <CB5E> <3CF9> <3CFF> <CB65> <3D00> <3D0B> <CB6C> <3D0C> <3D2D> <CB7A> <3D2E> <3D48> <CB9D> <3D49> <3D63> <CBB9> <3D64> <3D72> <CBD5> endbfrange 100 beginbfrange <3D73> <3D74> <CBE5> <3D76> <3D97> <CBEA> <3D98> <3D99> <CC0E> <3D9A> <3D9C> <CC11> <3D9D> <3DA3> <CC15> <3DA4> <3DA6> <CC1E> <3DA7> <3DAA> <CC23> <3DAB> <3DAC> <CC2A> <3DAF> <3DB5> <CC31> <3DB7> <3DBB> <CC3F> <3DBC> <3DBD> <CC46> <3DBE> <3DC0> <CC49> <3DC1> <3DC7> <CC4D> <3DC9> <3DCE> <CC5A> <3DCF> <3DD1> <CC61> <3DD4> <3DDA> <CC69> <3DDB> <3DDE> <CC71> <3DDF> <3DFF> <CC76> <3E01> <3E02> <CC9A> <3E03> <3E05> <CC9D> <3E06> <3E0C> <CCA1> <3E0E> <3E13> <CCAE> <3E14> <3E15> <CCB6> <3E16> <3E18> <CCB9> <3E19> <3E1F> <CCBD> <3E22> <3E27> <CCCA> <3E28> <3E2A> <CCD1> <3E2B> <3E39> <CCD5> <3E3A> <3E40> <CCE5> <3E41> <3E43> <CCED> <3E44> <3E53> <CCF1> <3E54> <3E59> <CD02> <3E5A> <3E5B> <CD0A> <3E5C> <3E5E> <CD0D> <3E5F> <3E65> <CD11> <3E68> <3E6D> <CD1E> <3E6E> <3E70> <CD25> <3E71> <3E73> <CD29> <3E74> <3E7F> <CD2D> <3E80> <3EA1> <CD3A> <3EA2> <3EA4> <CD5D> <3EA5> <3EA7> <CD61> <3EA8> <3EAE> <CD65> <3EB1> <3EB6> <CD72> <3EB7> <3EC5> <CD79> <3EC6> <3ED0> <CD89> <3ED1> <3ED2> <CD96> <3ED3> <3ED5> <CD99> <3ED6> <3EDC> <CD9D> <3EDF> <3EE4> <CDAA> <3EE5> <3EF7> <CDB1> <3EF8> <3EFE> <CDC5> <3F00> <3F01> <CDCE> <3F02> <3F18> <CDD1> <3F19> <3F1B> <CDE9> <3F1C> <3F1E> <CDED> <3F1F> <3F25> <CDF1> <3F28> <3F2D> <CDFE> <3F2E> <3F30> <CE05> <3F31> <3F33> <CE09> <3F34> <3F3A> <CE0D> <3F3B> <3F3E> <CE15> <3F3F> <3F44> <CE1A> <3F45> <3F46> <CE22> <3F47> <3F49> <CE25> <3F4A> <3F50> <CE29> <3F53> <3F74> <CE36> <3F75> <3F76> <CE5A> <3F77> <3F78> <CE5D> <3F79> <3F7E> <CE62> <3F81> <3F86> <CE6E> <3F87> <3F88> <CE76> <3F89> <3F8B> <CE79> <3F8C> <3F92> <CE7D> <3F95> <3F9A> <CE8A> <3F9B> <3F9C> <CE92> <3F9D> <3F9F> <CE95> <3FA0> <3FA6> <CE99> <3FA8> <3FAD> <CEA6> <3FAE> <3FC0> <CEAE> <3FC1> <3FE2> <CEC2> <3FE3> <3FE4> <CEE6> <3FE5> <3FE6> <CEE9> <3FE7> <3FED> <CEED> <3FEF> <3FF4> <CEFA> <3FF5> <3FF6> <CF02> <3FF7> <3FF9> <CF05> <3FFA> <3FFF> <CF09> <4003> <4008> <CF16> <4009> <400B> <CF1D> <400C> <400E> <CF21> <400F> <4015> <CF25> <4017> <401C> <CF32> <401D> <4037> <CF39> <4038> <4039> <CF56> <403A> <403C> <CF59> <403D> <4043> <CF5D> <4046> <404B> <CF6A> <404C> <404D> <CF72> <404E> <4050> <CF75> endbfrange 100 beginbfrange <4051> <4057> <CF79> <4058> <405B> <CF81> <405C> <4061> <CF86> <4062> <4075> <CF8D> <4076> <407B> <CFA2> <407C> <4082> <CFA9> <4083> <4095> <CFB1> <4096> <40B0> <CFC5> <40B1> <40B2> <CFE2> <40B3> <40B5> <CFE5> <40B6> <40BC> <CFE9> <40BF> <40C4> <CFF6> <40C5> <40C7> <CFFD> <40C8> <40CA> <D001> <40CB> <40D6> <D005> <40D7> <40DC> <D012> <40DD> <40F0> <D019> <40F1> <40F6> <D02E> <40F7> <40F8> <D036> <40F9> <40FB> <D039> <40FC> <40FF> <D03D> <4100> <4102> <D041> <4105> <410A> <D04A> <410B> <410D> <D051> <410E> <4110> <D055> <4111> <4117> <D059> <4118> <4122> <D061> <4123> <4124> <D06E> <4125> <4127> <D071> <4128> <412E> <D075> <412F> <4131> <D07E> <4132> <4153> <D082> <4154> <4155> <D0A6> <4156> <4158> <D0A9> <4159> <415F> <D0AD> <4162> <4167> <D0BA> <4168> <4169> <D0C2> <416A> <416C> <D0C5> <416D> <4172> <D0CA> <4174> <4179> <D0D6> <417A> <417B> <D0DE> <417C> <417E> <D0E1> <417F> <4185> <D0E5> <4187> <418C> <D0F2> <418D> <41A0> <D0F9> <41A1> <41C2> <D10E> <41C3> <41C4> <D132> <41C5> <41C7> <D135> <41C9> <41CD> <D13B> <41CF> <41D4> <D146> <41D5> <41D6> <D14E> <41D7> <41D9> <D151> <41DA> <41E0> <D155> <41E3> <41E8> <D162> <41E9> <41EB> <D169> <41EC> <41FA> <D16D> <41FB> <41FF> <D17D> <4200> <4201> <D182> <4202> <4204> <D185> <4205> <421B> <D189> <421C> <421D> <D1A2> <421E> <4220> <D1A5> <4221> <4227> <D1A9> <422A> <422D> <D1B6> <422F> <4231> <D1BD> <4232> <4248> <D1C1> <4249> <4263> <D1D9> <4264> <4266> <D1F5> <4267> <4274> <D1F9> <4276> <427B> <D20A> <427C> <4296> <D211> <4297> <4298> <D22E> <4299> <429B> <D231> <429C> <42A2> <D235> <42A5> <42AA> <D242> <42AB> <42BD> <D249> <42BE> <42C4> <D25D> <42C5> <42DF> <D265> <42E0> <42E1> <D282> <42E2> <42E4> <D285> <42E5> <42EB> <D289> <42EC> <42EE> <D292> <42EF> <42F4> <D296> <42F5> <42F7> <D29D> <42F8> <42FA> <D2A1> <42FB> <42FF> <D2A5> <4300> <4301> <D2AA> <4302> <4305> <D2AD> <4306> <430B> <D2B2> <430C> <430D> <D2BA> <430E> <430F> <D2BD> <4311> <4315> <D2C3> <4317> <431E> <D2CC> <431F> <4321> <D2D5> <4322> <4324> <D2D9> <4325> <432B> <D2DD> <432C> <4335> <D2E6> <4336> <4337> <D2F2> <4338> <433A> <D2F5> <433B> <4341> <D2F9> endbfrange 100 beginbfrange <4344> <4349> <D306> <434B> <434D> <D311> <434F> <4353> <D317> <4355> <4357> <D322> <4358> <4359> <D326> <435A> <435B> <D32A> <435C> <435E> <D32D> <435F> <4365> <D331> <4367> <436C> <D33E> <436D> <43A2> <D346> <43A3> <43A4> <D37E> <43A5> <43A7> <D381> <43A8> <43AE> <D385> <43B0> <43B5> <D392> <43B6> <43B7> <D39A> <43B8> <43BA> <D39D> <43BB> <43C1> <D3A1> <43C4> <43C9> <D3AE> <43CA> <43CC> <D3B5> <43CD> <43CF> <D3B9> <43D0> <43D6> <D3BD> <43D7> <43D8> <D3C6> <43D9> <43DE> <D3CA> <43DF> <43E5> <D3D1> <43E6> <43ED> <D3D9> <43EF> <43F6> <D3E4> <43F7> <43F8> <D3EE> <43F9> <43FB> <D3F1> <43FC> <43FF> <D3F5> <4400> <4402> <D3F9> <4405> <440A> <D402> <440B> <441E> <D409> <441F> <4440> <D41E> <4441> <4443> <D441> <4444> <445A> <D445> <445B> <445D> <D45D> <445E> <4460> <D461> <4461> <4468> <D465> <446A> <4471> <D470> <4472> <4473> <D47A> <4474> <4475> <D47D> <4477> <447B> <D483> <447E> <4483> <D48E> <4484> <4497> <D495> <4498> <44B9> <D4AA> <44BA> <44BC> <D4CD> <44BD> <44BF> <D4D1> <44C0> <44C6> <D4D5> <44C7> <44C8> <D4DD> <44C9> <44D0> <D4E0> <44D1> <44D3> <D4E9> <44D4> <44D6> <D4ED> <44D7> <44DD> <D4F1> <44DE> <44DF> <D4F9> <44E1> <44E6> <D4FE> <44E7> <44E9> <D505> <44EA> <44EC> <D509> <44ED> <44F3> <D50D> <44F5> <44FF> <D518> <4500> <4518> <D523> <4519> <451A> <D53E> <451B> <451D> <D541> <451E> <4524> <D545> <4527> <452C> <D552> <452D> <452E> <D55A> <452F> <4531> <D55D> <4532> <4535> <D561> <4536> <4537> <D566> <453A> <453F> <D56E> <4540> <4541> <D576> <4542> <4544> <D579> <4545> <454B> <D57D> <454D> <4552> <D58A> <4553> <4566> <D591> <4567> <4588> <D5A6> <4589> <458A> <D5CA> <458B> <458D> <D5CD> <458F> <4593> <D5D3> <4596> <459B> <D5DE> <459C> <459D> <D5E6> <459E> <45A0> <D5E9> <45A1> <45A7> <D5ED> <45AA> <45AF> <D5FA> <45B0> <45B1> <D602> <45B2> <45B4> <D605> <45B5> <45BB> <D609> <45BD> <45C2> <D616> <45C3> <45C5> <D61D> <45C6> <45C8> <D621> <45C9> <45D0> <D625> <45D1> <45DA> <D62E> <45DB> <45DC> <D63A> <45DD> <45DF> <D63D> <45E0> <45E3> <D641> <45E4> <45E5> <D646> <45E8> <45EA> <D64E> <45EB> <45EC> <D652> <45ED> <45EE> <D656> <45EF> <45F1> <D659> <45F2> <45FB> <D65D> endbfrange 53 beginbfrange <45FD> <45FF> <D66A> <4600> <4602> <D66D> <4603> <4604> <D672> <4605> <4612> <D675> <4614> <4619> <D686> <461A> <461B> <D68E> <461C> <461E> <D691> <461F> <4626> <D695> <4629> <462E> <D6A2> <462F> <4631> <D6A9> <4632> <4634> <D6AD> <4635> <463C> <D6B1> <463E> <4645> <D6BC> <4646> <4647> <D6C6> <4648> <464A> <D6C9> <464B> <464E> <D6CD> <464F> <4650> <D6D2> <4651> <4652> <D6D5> <4654> <4659> <D6DA> <465A> <465C> <D6E1> <465D> <465F> <D6E5> <4660> <4666> <D6E9> <4667> <466A> <D6F1> <466B> <4670> <D6F6> <4671> <4672> <D6FE> <4673> <4675> <D701> <4676> <4681> <D705> <4682> <4687> <D712> <4688> <4689> <D71A> <468A> <468C> <D71D> <468D> <4693> <D721> <4696> <469B> <D72E> <469C> <469D> <D736> <469E> <46A0> <D739> <46A1> <46A7> <D73D> <46A8> <46A9> <D745> <46AB> <46B0> <D74A> <46B1> <46B2> <D752> <46B4> <46B9> <D75A> <46BC> <46BE> <D766> <46BF> <46C0> <D76A> <46C1> <46C3> <D76D> <46C4> <46C6> <D771> <46C7> <46CD> <D775> <46CE> <46D0> <D77E> <46D1> <46D6> <D782> <46D7> <46D8> <D78A> <46D9> <46DB> <D78D> <46DC> <46E2> <D791> <46E5> <46EA> <D79E> <46EB> <46FF> <0020> <4700> <4749> <0035> <474F> <47AC> <0020> endbfrange endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF \ No newline at end of file
diff --git a/src/main/resources/Resources/cmap/B5pc-H b/src/main/resources/Resources/cmap/B5pc-H
new file mode 100644
index 0000000..45c6bf3
--- /dev/null
+++ b/src/main/resources/Resources/cmap/B5pc-H
@@ -0,0 +1 @@
+%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%IncludeResource: ProcSet (CIDInit) %%BeginResource: CMap (B5pc-H) %%Title: (B5pc-H Adobe CNS1 0) %%Version: 10.001 %%Copyright: ----------------------------------------------------------- %%Copyright: Copyright 1990-1999 Adobe Systems Incorporated. %%Copyright: All Rights Reserved. %%Copyright: %%Copyright: Patents Pending %%Copyright: %%Copyright: NOTICE: All information contained herein is the property %%Copyright: of Adobe Systems Incorporated. %%Copyright: %%Copyright: Permission is granted for redistribution of this file %%Copyright: provided this copyright notice is maintained intact and %%Copyright: that the contents of this file are not altered in any %%Copyright: way from its original form. %%Copyright: %%Copyright: PostScript and Display PostScript are trademarks of %%Copyright: Adobe Systems Incorporated which may be registered in %%Copyright: certain jurisdictions. %%Copyright: ----------------------------------------------------------- %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo 3 dict dup begin /Registry (Adobe) def /Ordering (CNS1) def /Supplement 0 def end def /CMapName /B5pc-H def /CMapVersion 10.001 def /CMapType 1 def /UIDOffset 0 def /XUID [1 10 25382] def /WMode 0 def 3 begincodespacerange <00> <80> <A140> <FCFE> <FD> <FF> endcodespacerange 1 beginnotdefrange <00> <1f> 1 endnotdefrange 100 begincidrange <20> <7e> 1 <80> <80> 61 <a140> <a158> 99 <a159> <a15c> 13743 <a15d> <a17e> 128 <a1a1> <a1f5> 162 <a1f6> <a1f6> 248 <a1f7> <a1f7> 247 <a1f8> <a1fe> 249 <a240> <a27e> 256 <a2a1> <a2fe> 319 <a340> <a37e> 413 <a3a1> <a3bb> 476 <a3bd> <a3bf> 503 <a3c0> <a3e0> 562 <a440> <a47e> 595 <a4a1> <a4fe> 658 <a540> <a57e> 752 <a5a1> <a5fe> 815 <a640> <a67e> 909 <a6a1> <a6fe> 972 <a740> <a77e> 1066 <a7a1> <a7fe> 1129 <a840> <a87e> 1223 <a8a1> <a8fe> 1286 <a940> <a97e> 1380 <a9a1> <a9fe> 1443 <aa40> <aa7e> 1537 <aaa1> <aafe> 1600 <ab40> <ab7e> 1694 <aba1> <abfe> 1757 <ac40> <ac7e> 1851 <aca1> <acfd> 1914 <acfe> <acfe> 2431 <ad40> <ad7e> 2007 <ada1> <adfe> 2070 <ae40> <ae7e> 2164 <aea1> <aefe> 2227 <af40> <af7e> 2321 <afa1> <afcf> 2384 <afd0> <affe> 2432 <b040> <b07e> 2479 <b0a1> <b0fe> 2542 <b140> <b17e> 2636 <b1a1> <b1fe> 2699 <b240> <b27e> 2793 <b2a1> <b2fe> 2856 <b340> <b37e> 2950 <b3a1> <b3fe> 3013 <b440> <b47e> 3107 <b4a1> <b4fe> 3170 <b540> <b57e> 3264 <b5a1> <b5fe> 3327 <b640> <b67e> 3421 <b6a1> <b6fe> 3484 <b740> <b77e> 3578 <b7a1> <b7fe> 3641 <b840> <b87e> 3735 <b8a1> <b8fe> 3798 <b940> <b97e> 3892 <b9a1> <b9fe> 3955 <ba40> <ba7e> 4049 <baa1> <bafe> 4112 <bb40> <bb7e> 4206 <bba1> <bbc7> 4269 <bbc8> <bbfe> 4309 <bc40> <bc7e> 4364 <bca1> <bcfe> 4427 <bd40> <bd7e> 4521 <bda1> <bdfe> 4584 <be40> <be51> 4678 <be52> <be52> 4308 <be53> <be7e> 4696 <bea1> <befe> 4740 <bf40> <bf7e> 4834 <bfa1> <bffe> 4897 <c040> <c07e> 4991 <c0a1> <c0fe> 5054 <c140> <c17e> 5148 <c1a1> <c1aa> 5211 <c1ab> <c1fe> 5222 <c240> <c27e> 5306 <c2a1> <c2ca> 5369 <c2cb> <c2cb> 5221 <c2cc> <c2fe> 5411 <c340> <c360> 5462 <c361> <c37e> 5496 <c3a1> <c3b8> 5526 <c3b9> <c3b9> 5551 <c3ba> <c3ba> 5550 <c3bb> <c3fe> 5552 <c440> <c455> 5620 <c456> <c456> 5495 <c457> <c47e> 5642 <c4a1> <c4fe> 5682 <c540> <c57e> 5776 <c5a1> <c5fe> 5839 <c640> <c67e> 5933 <c940> <c949> 5996 <c94a> <c94a> 628 endcidrange 100 begincidrange <c94b> <c96b> 6006 <c96c> <c97e> 6040 <c9a1> <c9bd> 6059 <c9be> <c9be> 6039 <c9bf> <c9ec> 6088 <c9ed> <c9fe> 6135 <ca40> <ca7e> 6153 <caa1> <caf6> 6216 <caf7> <caf7> 6134 <caf8> <cafe> 6302 <cb40> <cb7e> 6309 <cba1> <cbfe> 6372 <cc40> <cc7e> 6466 <cca1> <ccfe> 6529 <cd40> <cd7e> 6623 <cda1> <cdfe> 6686 <ce40> <ce7e> 6780 <cea1> <cefe> 6843 <cf40> <cf7e> 6937 <cfa1> <cffe> 7000 <d040> <d07e> 7094 <d0a1> <d0fe> 7157 <d140> <d17e> 7251 <d1a1> <d1fe> 7314 <d240> <d27e> 7408 <d2a1> <d2fe> 7471 <d340> <d37e> 7565 <d3a1> <d3fe> 7628 <d440> <d47e> 7722 <d4a1> <d4fe> 7785 <d540> <d57e> 7879 <d5a1> <d5fe> 7942 <d640> <d67e> 8036 <d6a1> <d6cb> 8099 <d6cc> <d6cc> 8788 <d6cd> <d6fe> 8143 <d740> <d779> 8193 <d77a> <d77a> 8889 <d77b> <d77e> 8251 <d7a1> <d7fe> 8255 <d840> <d87e> 8349 <d8a1> <d8fe> 8412 <d940> <d97e> 8506 <d9a1> <d9fe> 8569 <da40> <da7e> 8663 <daa1> <dade> 8726 <dadf> <dadf> 8142 <dae0> <dafe> 8789 <db40> <db7e> 8820 <dba1> <dba6> 8883 <dba7> <dbfe> 8890 <dc40> <dc7e> 8978 <dca1> <dcfe> 9041 <dd40> <dd7e> 9135 <dda1> <ddfb> 9198 <ddfc> <ddfc> 9089 <ddfd> <ddfe> 9289 <de40> <de7e> 9291 <dea1> <defe> 9354 <df40> <df7e> 9448 <dfa1> <dffe> 9511 <e040> <e07e> 9605 <e0a1> <e0fe> 9668 <e140> <e17e> 9762 <e1a1> <e1fe> 9825 <e240> <e27e> 9919 <e2a1> <e2fe> 9982 <e340> <e37e> 10076 <e3a1> <e3fe> 10139 <e440> <e47e> 10233 <e4a1> <e4fe> 10296 <e540> <e57e> 10390 <e5a1> <e5fe> 10453 <e640> <e67e> 10547 <e6a1> <e6fe> 10610 <e740> <e77e> 10704 <e7a1> <e7fe> 10767 <e840> <e87e> 10861 <e8a1> <e8a2> 10924 <e8a3> <e8fe> 10927 <e940> <e975> 11019 <e976> <e97e> 11074 <e9a1> <e9fe> 11083 <ea40> <ea7e> 11177 <eaa1> <eafe> 11240 <eb40> <eb5a> 11334 <eb5b> <eb7e> 11362 <eba1> <ebf0> 11398 <ebf1> <ebf1> 10926 <ebf2> <ebfe> 11478 <ec40> <ec7e> 11491 <eca1> <ecdd> 11554 <ecde> <ecde> 11073 <ecdf> <ecfe> 11615 <ed40> <ed7e> 11647 <eda1> <eda9> 11710 <edaa> <edfe> 11720 <ee40> <ee7e> 11805 <eea1> <eeea> 11868 <eeeb> <eeeb> 12308 endcidrange 47 begincidrange <eeec> <eefe> 11942 <ef40> <ef7e> 11961 <efa1> <effe> 12024 <f040> <f055> 12118 <f056> <f056> 11719 <f057> <f07e> 12140 <f0a1> <f0ca> 12180 <f0cb> <f0cb> 11361 <f0cc> <f0fe> 12222 <f140> <f162> 12273 <f163> <f16a> 12309 <f16b> <f16b> 12640 <f16c> <f17e> 12317 <f1a1> <f1fe> 12336 <f240> <f267> 12430 <f268> <f268> 12783 <f269> <f27e> 12470 <f2a1> <f2c2> 12492 <f2c3> <f2fe> 12527 <f340> <f374> 12587 <f375> <f37e> 12641 <f3a1> <f3fe> 12651 <f440> <f465> 12745 <f466> <f47e> 12784 <f4a1> <f4b4> 12809 <f4b5> <f4b5> 12526 <f4b6> <f4fc> 12829 <f4fd> <f4fe> 12901 <f540> <f57e> 12903 <f5a1> <f5fe> 12966 <f640> <f662> 13060 <f663> <f663> 12900 <f664> <f67e> 13095 <f6a1> <f6fe> 13122 <f740> <f77e> 13216 <f7a1> <f7fe> 13279 <f840> <f87e> 13373 <f8a1> <f8fe> 13436 <f940> <f976> 13530 <f977> <f97e> 13586 <f9a1> <f9c3> 13594 <f9c4> <f9c4> 13585 <f9c5> <f9c5> 13629 <f9c6> <f9c6> 13641 <f9c7> <f9d1> 13630 <f9d2> <f9d5> 13642 <fd> <ff> 96 endcidrange endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF \ No newline at end of file
diff --git a/src/main/resources/Resources/cmap/B5pc-UCS2 b/src/main/resources/Resources/cmap/B5pc-UCS2
new file mode 100644
index 0000000..206affe
--- /dev/null
+++ b/src/main/resources/Resources/cmap/B5pc-UCS2
@@ -0,0 +1 @@
+%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%DocumentNeededResources: CMap (B5pc-UCS2) %%IncludeResource: ProcSet (CIDInit) %%IncludeResource: CMap (B5pc-UCS2C) %%BeginResource: CMap (B5pc-UCS2) %%Title: (B5pc-UCS2) %%Version: 4.002 %%Copyright: ----------------------------------------------------------- %%Copyright: Copyright 1990-1997 Adobe Systems Incorporated. %%Copyright: All Rights Reserved. %%Copyright: %%Copyright: Patents Pending %%Copyright: %%Copyright: NOTICE: All information contained herein is the property %%Copyright: of Adobe Systems Incorporated. %%Copyright: %%Copyright: Permission is granted for redistribution of this file %%Copyright: provided this copyright notice is maintained intact and %%Copyright: that the contents of this file are not altered in any %%Copyright: way from its original form. %%Copyright: %%Copyright: PostScript and Display PostScript are trademarks of %%Copyright: Adobe Systems Incorporated which may be registered in %%Copyright: certain jurisdictions. %%Copyright: ----------------------------------------------------------- %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /B5pc-UCS2C usecmap /CIDSystemInfo 3 dict dup begin /Registry (Adobe) def /Ordering (B5pc_UCS2) def /Supplement 0 def end def /CMapName /B5pc-UCS2 def /CMapVersion 4.002 def /CMapType 1 def /WMode 0 def endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF \ No newline at end of file
diff --git a/src/main/resources/Resources/cmap/B5pc-UCS2C b/src/main/resources/Resources/cmap/B5pc-UCS2C
new file mode 100644
index 0000000..703ad29
--- /dev/null
+++ b/src/main/resources/Resources/cmap/B5pc-UCS2C
@@ -0,0 +1 @@
+%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%IncludeResource: ProcSet (CIDInit) %%BeginResource: CMap (B5pc-UCS2C) %%Title: (B5pc-UCS2C) %%Version: 4.002 %%Copyright: ----------------------------------------------------------- %%Copyright: Copyright 1990-1999 Adobe Systems Incorporated. %%Copyright: All Rights Reserved. %%Copyright: %%Copyright: Patents Pending %%Copyright: %%Copyright: NOTICE: All information contained herein is the property %%Copyright: of Adobe Systems Incorporated. %%Copyright: %%Copyright: Permission is granted for redistribution of this file %%Copyright: provided this copyright notice is maintained intact and %%Copyright: that the contents of this file are not altered in any %%Copyright: way from its original form. %%Copyright: %%Copyright: PostScript and Display PostScript are trademarks of %%Copyright: Adobe Systems Incorporated which may be registered in %%Copyright: certain jurisdictions. %%Copyright: ----------------------------------------------------------- %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo 3 dict dup begin /Registry (Adobe) def /Ordering (B5pc_UCS2C) def /Supplement 0 def end def /CMapName /B5pc-UCS2C def /CMapVersion 4.002 def /CMapType 1 def /WMode 0 def 4 begincodespacerange <00> <80> <83> <A0> <A140> <FCFE> <FD> <FF> endcodespacerange 100 beginbfrange <00> <7F> <0000> <80> <80> <005C> <83> <A0> <0083> <FD> <FD> <00A9> <FE> <FE> <2122> <FF> <FF> <2026> <A140> <A140> <3000> <A141> <A141> <FF0C> <A142> <A143> <3001> <A144> <A144> <FF0E> <A145> <A145> <2022> <A146> <A146> <FF1B> <A147> <A147> <FF1A> <A148> <A148> <FF1F> <A149> <A149> <FF01> <A14A> <A14A> <FE30> <A14B> <A14B> <22EF> <A14C> <A14C> <2025> <A14D> <A14D> <FE50> <A14E> <A14E> <FE51> <A14F> <A14F> <FE52> <A150> <A150> <00B7> <A151> <A154> <FE54> <A155> <A155> <FF5C> <A156> <A156> <2013> <A157> <A157> <FE31> <A158> <A158> <2014> <A159> <A159> <FE33> <A15A> <A15A> <FF3F> <A15B> <A15B> <FE34> <A15C> <A15C> <FE4F> <A15D> <A15E> <FF08> <A15F> <A160> <FE35> <A161> <A161> <FF5B> <A162> <A162> <FF5D> <A163> <A164> <FE37> <A165> <A166> <3014> <A167> <A168> <FE39> <A169> <A16A> <3010> <A16B> <A16C> <FE3B> <A16D> <A16E> <300A> <A16F> <A170> <FE3D> <A171> <A172> <3008> <A173> <A174> <FE3F> <A175> <A176> <300C> <A177> <A178> <FE41> <A179> <A17A> <300E> <A17B> <A17C> <FE43> <A17D> <A17E> <FE59> <A1A1> <A1A4> <FE5B> <A1A5> <A1A6> <2018> <A1A7> <A1A8> <201C> <A1A9> <A1AA> <301D> <A1AB> <A1AB> <2035> <A1AC> <A1AC> <2032> <A1AD> <A1AD> <FF03> <A1AE> <A1AE> <FF06> <A1AF> <A1AF> <FF0A> <A1B0> <A1B0> <203B> <A1B1> <A1B1> <00A7> <A1B2> <A1B2> <3003> <A1B3> <A1B3> <25CB> <A1B4> <A1B4> <25CF> <A1B5> <A1B5> <25B3> <A1B6> <A1B6> <25B2> <A1B7> <A1B7> <25CE> <A1B8> <A1B8> <2606> <A1B9> <A1B9> <2605> <A1BA> <A1BA> <25C7> <A1BB> <A1BB> <25C6> <A1BC> <A1BC> <25A1> <A1BD> <A1BD> <25A0> <A1BE> <A1BE> <25BD> <A1BF> <A1BF> <25BC> <A1C0> <A1C0> <32A3> <A1C1> <A1C1> <2105> <A1C2> <A1C2> <203E> <A1C3> <A1C3> <203E> <A1C4> <A1C4> <FF3F> <A1C5> <A1C5> <FF3F> <A1C6> <A1C7> <FE49> <A1C8> <A1C9> <FE4D> <A1CA> <A1CB> <FE4B> <A1CC> <A1CE> <FE5F> <A1CF> <A1CF> <FF0B> <A1D0> <A1D0> <FF0D> <A1D1> <A1D1> <00D7> <A1D2> <A1D2> <00F7> <A1D3> <A1D3> <00B1> <A1D4> <A1D4> <221A> <A1D5> <A1D5> <FF1C> <A1D6> <A1D6> <FF1E> <A1D7> <A1D7> <FF1D> <A1D8> <A1D9> <2266> <A1DA> <A1DA> <2260> <A1DB> <A1DB> <221E> <A1DC> <A1DC> <2252> <A1DD> <A1DD> <2261> <A1DE> <A1E2> <FE62> <A1E3> <A1E3> <223C> endbfrange 100 beginbfrange <A1E4> <A1E5> <2229> <A1E6> <A1E6> <22A5> <A1E7> <A1E7> <2220> <A1E8> <A1E8> <221F> <A1E9> <A1E9> <22BF> <A1EA> <A1EA> <33D2> <A1EB> <A1EB> <33D1> <A1EC> <A1EC> <222B> <A1ED> <A1ED> <222E> <A1EE> <A1EE> <2235> <A1EF> <A1EF> <2234> <A1F0> <A1F0> <2640> <A1F1> <A1F1> <2642> <A1F2> <A1F2> <2295> <A1F3> <A1F3> <2609> <A1F4> <A1F4> <2191> <A1F5> <A1F5> <2193> <A1F6> <A1F6> <2190> <A1F7> <A1F7> <2192> <A1F8> <A1F9> <2196> <A1FA> <A1FA> <2199> <A1FB> <A1FB> <2198> <A1FC> <A1FC> <2225> <A1FD> <A1FD> <2223> <A1FE> <A1FE> <FF0F> <A240> <A240> <FF3C> <A241> <A241> <FF0F> <A242> <A242> <FF3C> <A243> <A243> <FF04> <A244> <A244> <00A5> <A245> <A245> <3012> <A246> <A247> <00A2> <A248> <A248> <FF05> <A249> <A249> <FF20> <A24A> <A24A> <2103> <A24B> <A24B> <2109> <A24C> <A24E> <FE69> <A24F> <A24F> <33D5> <A250> <A252> <339C> <A253> <A253> <33CE> <A254> <A254> <33A1> <A255> <A256> <338E> <A257> <A257> <33C4> <A258> <A258> <00B0> <A259> <A259> <5159> <A25A> <A25A> <515B> <A25B> <A25B> <515E> <A25C> <A25C> <515D> <A25D> <A25D> <5161> <A25E> <A25E> <5163> <A25F> <A25F> <55E7> <A260> <A260> <74E9> <A261> <A261> <7CCE> <A262> <A269> <2581> <A26A> <A26A> <258F> <A26B> <A26B> <258E> <A26C> <A26C> <258D> <A26D> <A26D> <258C> <A26E> <A26E> <258B> <A26F> <A26F> <258A> <A270> <A270> <2589> <A271> <A271> <253C> <A272> <A272> <2534> <A273> <A273> <252C> <A274> <A274> <2524> <A275> <A275> <251C> <A276> <A276> <2594> <A277> <A277> <2500> <A278> <A278> <2502> <A279> <A279> <2595> <A27A> <A27A> <250C> <A27B> <A27B> <2510> <A27C> <A27C> <2514> <A27D> <A27D> <2518> <A27E> <A27E> <256D> <A2A1> <A2A1> <256E> <A2A2> <A2A2> <2570> <A2A3> <A2A3> <256F> <A2A4> <A2A4> <2550> <A2A5> <A2A5> <255E> <A2A6> <A2A6> <256A> <A2A7> <A2A7> <2561> <A2A8> <A2A9> <25E2> <A2AA> <A2AA> <25E5> <A2AB> <A2AB> <25E4> <A2AC> <A2AE> <2571> <A2AF> <A2B8> <FF10> <A2B9> <A2C2> <2160> <A2C3> <A2CB> <3021> <A2CC> <A2CC> <5341> <A2CD> <A2CE> <5344> <A2CF> <A2E8> <FF21> <A2E9> <A2FE> <FF41> <A340> <A343> <FF57> <A344> <A354> <0391> <A355> <A35B> <03A3> <A35C> <A36C> <03B1> <A36D> <A373> <03C3> <A374> <A37E> <3105> <A3A1> <A3BA> <3110> endbfrange 100 beginbfrange <A3BB> <A3BB> <02D9> <A3BC> <A3BD> <02C9> <A3BE> <A3BE> <02C7> <A3BF> <A3BF> <02CB> <A440> <A440> <4E00> <A441> <A441> <4E59> <A442> <A442> <4E01> <A443> <A443> <4E03> <A444> <A444> <4E43> <A445> <A445> <4E5D> <A446> <A446> <4E86> <A447> <A447> <4E8C> <A448> <A448> <4EBA> <A449> <A449> <513F> <A44A> <A44A> <5165> <A44B> <A44B> <516B> <A44C> <A44C> <51E0> <A44D> <A44E> <5200> <A44F> <A44F> <529B> <A450> <A450> <5315> <A451> <A451> <5341> <A452> <A452> <535C> <A453> <A453> <53C8> <A454> <A454> <4E09> <A455> <A455> <4E0B> <A456> <A456> <4E08> <A457> <A457> <4E0A> <A458> <A458> <4E2B> <A459> <A459> <4E38> <A45A> <A45A> <51E1> <A45B> <A45B> <4E45> <A45C> <A45C> <4E48> <A45D> <A45D> <4E5F> <A45E> <A45E> <4E5E> <A45F> <A45F> <4E8E> <A460> <A460> <4EA1> <A461> <A461> <5140> <A462> <A462> <5203> <A463> <A463> <52FA> <A464> <A464> <5343> <A465> <A465> <53C9> <A466> <A466> <53E3> <A467> <A467> <571F> <A468> <A468> <58EB> <A469> <A469> <5915> <A46A> <A46A> <5927> <A46B> <A46B> <5973> <A46C> <A46D> <5B50> <A46E> <A46E> <5B53> <A46F> <A46F> <5BF8> <A470> <A470> <5C0F> <A471> <A471> <5C22> <A472> <A472> <5C38> <A473> <A473> <5C71> <A474> <A474> <5DDD> <A475> <A475> <5DE5> <A476> <A478> <5DF1> <A479> <A479> <5DFE> <A47A> <A47A> <5E72> <A47B> <A47B> <5EFE> <A47C> <A47C> <5F0B> <A47D> <A47D> <5F13> <A47E> <A47E> <624D> <A4A1> <A4A1> <4E11> <A4A2> <A4A2> <4E10> <A4A3> <A4A3> <4E0D> <A4A4> <A4A4> <4E2D> <A4A5> <A4A5> <4E30> <A4A6> <A4A6> <4E39> <A4A7> <A4A7> <4E4B> <A4A8> <A4A8> <5C39> <A4A9> <A4A9> <4E88> <A4AA> <A4AA> <4E91> <A4AB> <A4AB> <4E95> <A4AC> <A4AC> <4E92> <A4AD> <A4AD> <4E94> <A4AE> <A4AE> <4EA2> <A4AF> <A4AF> <4EC1> <A4B0> <A4B0> <4EC0> <A4B1> <A4B1> <4EC3> <A4B2> <A4B3> <4EC6> <A4B4> <A4B4> <4ECD> <A4B5> <A4B6> <4ECA> <A4B7> <A4B7> <4EC4> <A4B8> <A4B8> <5143> <A4B9> <A4B9> <5141> <A4BA> <A4BA> <5167> <A4BB> <A4BC> <516D> <A4BD> <A4BD> <516C> <A4BE> <A4BE> <5197> <A4BF> <A4BF> <51F6> <A4C0> <A4C2> <5206> <A4C3> <A4C3> <52FB> <A4C4> <A4C5> <52FE> <A4C6> <A4C6> <5316> <A4C7> <A4C7> <5339> <A4C8> <A4C8> <5348> <A4C9> <A4C9> <5347> <A4CA> <A4CA> <5345> <A4CB> <A4CB> <535E> endbfrange 100 beginbfrange <A4CC> <A4CC> <5384> <A4CD> <A4CD> <53CB> <A4CE> <A4CE> <53CA> <A4CF> <A4CF> <53CD> <A4D0> <A4D0> <58EC> <A4D1> <A4D1> <5929> <A4D2> <A4D2> <592B> <A4D3> <A4D3> <592A> <A4D4> <A4D4> <592D> <A4D5> <A4D5> <5B54> <A4D6> <A4D6> <5C11> <A4D7> <A4D7> <5C24> <A4D8> <A4D8> <5C3A> <A4D9> <A4D9> <5C6F> <A4DA> <A4DA> <5DF4> <A4DB> <A4DB> <5E7B> <A4DC> <A4DC> <5EFF> <A4DD> <A4DE> <5F14> <A4DF> <A4DF> <5FC3> <A4E0> <A4E0> <6208> <A4E1> <A4E1> <6236> <A4E2> <A4E2> <624B> <A4E3> <A4E3> <624E> <A4E4> <A4E4> <652F> <A4E5> <A4E5> <6587> <A4E6> <A4E6> <6597> <A4E7> <A4E7> <65A4> <A4E8> <A4E8> <65B9> <A4E9> <A4E9> <65E5> <A4EA> <A4EA> <66F0> <A4EB> <A4EB> <6708> <A4EC> <A4EC> <6728> <A4ED> <A4ED> <6B20> <A4EE> <A4EE> <6B62> <A4EF> <A4EF> <6B79> <A4F0> <A4F0> <6BCB> <A4F1> <A4F1> <6BD4> <A4F2> <A4F2> <6BDB> <A4F3> <A4F3> <6C0F> <A4F4> <A4F4> <6C34> <A4F5> <A4F5> <706B> <A4F6> <A4F6> <722A> <A4F7> <A4F7> <7236> <A4F8> <A4F8> <723B> <A4F9> <A4F9> <7247> <A4FA> <A4FA> <7259> <A4FB> <A4FB> <725B> <A4FC> <A4FC> <72AC> <A4FD> <A4FD> <738B> <A4FE> <A4FE> <4E19> <A540> <A540> <4E16> <A541> <A541> <4E15> <A542> <A542> <4E14> <A543> <A543> <4E18> <A544> <A544> <4E3B> <A545> <A545> <4E4D> <A546> <A546> <4E4F> <A547> <A547> <4E4E> <A548> <A548> <4EE5> <A549> <A549> <4ED8> <A54A> <A54D> <4ED4> <A54E> <A54F> <4EE3> <A550> <A550> <4ED9> <A551> <A551> <4EDE> <A552> <A552> <5145> <A553> <A553> <5144> <A554> <A555> <5189> <A556> <A556> <51AC> <A557> <A558> <51F9> <A559> <A559> <51F8> <A55A> <A55A> <520A> <A55B> <A55B> <52A0> <A55C> <A55C> <529F> <A55D> <A55E> <5305> <A55F> <A55F> <5317> <A560> <A560> <531D> <A561> <A561> <4EDF> <A562> <A562> <534A> <A563> <A563> <5349> <A564> <A564> <5361> <A565> <A565> <5360> <A566> <A566> <536F> <A567> <A567> <536E> <A568> <A568> <53BB> <A569> <A569> <53EF> <A56A> <A56A> <53E4> <A56B> <A56B> <53F3> <A56C> <A56C> <53EC> <A56D> <A56D> <53EE> <A56E> <A56E> <53E9> <A56F> <A56F> <53E8> <A570> <A570> <53FC> <A571> <A571> <53F8> <A572> <A572> <53F5> <A573> <A573> <53EB> <A574> <A574> <53E6> <A575> <A575> <53EA> <A576> <A576> <53F2> <A577> <A577> <53F1> <A578> <A578> <53F0> endbfrange 100 beginbfrange <A579> <A579> <53E5> <A57A> <A57A> <53ED> <A57B> <A57B> <53FB> <A57C> <A57C> <56DB> <A57D> <A57D> <56DA> <A57E> <A57E> <5916> <A5A1> <A5A1> <592E> <A5A2> <A5A2> <5931> <A5A3> <A5A3> <5974> <A5A4> <A5A4> <5976> <A5A5> <A5A5> <5B55> <A5A6> <A5A6> <5B83> <A5A7> <A5A7> <5C3C> <A5A8> <A5A8> <5DE8> <A5A9> <A5A9> <5DE7> <A5AA> <A5AA> <5DE6> <A5AB> <A5AC> <5E02> <A5AD> <A5AD> <5E73> <A5AE> <A5AE> <5E7C> <A5AF> <A5AF> <5F01> <A5B0> <A5B0> <5F18> <A5B1> <A5B1> <5F17> <A5B2> <A5B2> <5FC5> <A5B3> <A5B3> <620A> <A5B4> <A5B5> <6253> <A5B6> <A5B6> <6252> <A5B7> <A5B7> <6251> <A5B8> <A5B8> <65A5> <A5B9> <A5B9> <65E6> <A5BA> <A5BA> <672E> <A5BB> <A5BB> <672C> <A5BC> <A5BD> <672A> <A5BE> <A5BE> <672D> <A5BF> <A5BF> <6B63> <A5C0> <A5C0> <6BCD> <A5C1> <A5C1> <6C11> <A5C2> <A5C2> <6C10> <A5C3> <A5C3> <6C38> <A5C4> <A5C4> <6C41> <A5C5> <A5C5> <6C40> <A5C6> <A5C6> <6C3E> <A5C7> <A5C7> <72AF> <A5C8> <A5C8> <7384> <A5C9> <A5C9> <7389> <A5CA> <A5CA> <74DC> <A5CB> <A5CB> <74E6> <A5CC> <A5CC> <7518> <A5CD> <A5CD> <751F> <A5CE> <A5CF> <7528> <A5D0> <A5D3> <7530> <A5D4> <A5D4> <758B> <A5D5> <A5D5> <767D> <A5D6> <A5D6> <76AE> <A5D7> <A5D7> <76BF> <A5D8> <A5D8> <76EE> <A5D9> <A5D9> <77DB> <A5DA> <A5DA> <77E2> <A5DB> <A5DB> <77F3> <A5DC> <A5DC> <793A> <A5DD> <A5DD> <79BE> <A5DE> <A5DE> <7A74> <A5DF> <A5DF> <7ACB> <A5E0> <A5E1> <4E1E> <A5E2> <A5E3> <4E52> <A5E4> <A5E4> <4E69> <A5E5> <A5E5> <4E99> <A5E6> <A5E6> <4EA4> <A5E7> <A5E7> <4EA6> <A5E8> <A5E8> <4EA5> <A5E9> <A5E9> <4EFF> <A5EA> <A5EA> <4F09> <A5EB> <A5EB> <4F19> <A5EC> <A5EC> <4F0A> <A5ED> <A5ED> <4F15> <A5EE> <A5EE> <4F0D> <A5EF> <A5F0> <4F10> <A5F1> <A5F1> <4F0F> <A5F2> <A5F2> <4EF2> <A5F3> <A5F3> <4EF6> <A5F4> <A5F4> <4EFB> <A5F5> <A5F5> <4EF0> <A5F6> <A5F6> <4EF3> <A5F7> <A5F7> <4EFD> <A5F8> <A5F8> <4F01> <A5F9> <A5F9> <4F0B> <A5FA> <A5FA> <5149> <A5FB> <A5FB> <5147> <A5FC> <A5FC> <5146> <A5FD> <A5FD> <5148> <A5FE> <A5FE> <5168> <A640> <A640> <5171> <A641> <A641> <518D> <A642> <A642> <51B0> <A643> <A643> <5217> <A644> <A645> <5211> <A646> <A646> <520E> <A647> <A647> <5216> <A648> <A648> <52A3> <A649> <A649> <5308> <A64A> <A64A> <5321> endbfrange 100 beginbfrange <A64B> <A64B> <5320> <A64C> <A64D> <5370> <A64E> <A64E> <5409> <A64F> <A64F> <540F> <A650> <A650> <540C> <A651> <A651> <540A> <A652> <A652> <5410> <A653> <A653> <5401> <A654> <A654> <540B> <A655> <A655> <5404> <A656> <A656> <5411> <A657> <A657> <540D> <A658> <A658> <5408> <A659> <A659> <5403> <A65A> <A65A> <540E> <A65B> <A65B> <5406> <A65C> <A65C> <5412> <A65D> <A65D> <56E0> <A65E> <A65E> <56DE> <A65F> <A65F> <56DD> <A660> <A660> <5733> <A661> <A661> <5730> <A662> <A662> <5728> <A663> <A663> <572D> <A664> <A664> <572C> <A665> <A665> <572F> <A666> <A666> <5729> <A667> <A668> <5919> <A669> <A66A> <5937> <A66B> <A66B> <5984> <A66C> <A66C> <5978> <A66D> <A66D> <5983> <A66E> <A66E> <597D> <A66F> <A66F> <5979> <A670> <A670> <5982> <A671> <A671> <5981> <A672> <A673> <5B57> <A674> <A675> <5B87> <A676> <A676> <5B85> <A677> <A677> <5B89> <A678> <A678> <5BFA> <A679> <A679> <5C16> <A67A> <A67A> <5C79> <A67B> <A67B> <5DDE> <A67C> <A67C> <5E06> <A67D> <A67D> <5E76> <A67E> <A67E> <5E74> <A6A1> <A6A1> <5F0F> <A6A2> <A6A2> <5F1B> <A6A3> <A6A3> <5FD9> <A6A4> <A6A4> <5FD6> <A6A5> <A6A5> <620E> <A6A6> <A6A7> <620C> <A6A8> <A6A8> <6210> <A6A9> <A6A9> <6263> <A6AA> <A6AA> <625B> <A6AB> <A6AB> <6258> <A6AC> <A6AC> <6536> <A6AD> <A6AD> <65E9> <A6AE> <A6AE> <65E8> <A6AF> <A6B0> <65EC> <A6B1> <A6B2> <66F2> <A6B3> <A6B3> <6709> <A6B4> <A6B4> <673D> <A6B5> <A6B5> <6734> <A6B6> <A6B6> <6731> <A6B7> <A6B7> <6735> <A6B8> <A6B8> <6B21> <A6B9> <A6B9> <6B64> <A6BA> <A6BA> <6B7B> <A6BB> <A6BB> <6C16> <A6BC> <A6BC> <6C5D> <A6BD> <A6BD> <6C57> <A6BE> <A6BE> <6C59> <A6BF> <A6C0> <6C5F> <A6C1> <A6C1> <6C50> <A6C2> <A6C2> <6C55> <A6C3> <A6C3> <6C61> <A6C4> <A6C4> <6C5B> <A6C5> <A6C6> <6C4D> <A6C7> <A6C7> <7070> <A6C8> <A6C8> <725F> <A6C9> <A6C9> <725D> <A6CA> <A6CA> <767E> <A6CB> <A6CB> <7AF9> <A6CC> <A6CC> <7C73> <A6CD> <A6CD> <7CF8> <A6CE> <A6CE> <7F36> <A6CF> <A6CF> <7F8A> <A6D0> <A6D0> <7FBD> <A6D1> <A6D1> <8001> <A6D2> <A6D2> <8003> <A6D3> <A6D3> <800C> <A6D4> <A6D4> <8012> <A6D5> <A6D5> <8033> <A6D6> <A6D6> <807F> <A6D7> <A6D7> <8089> <A6D8> <A6D9> <808B> <A6DA> <A6DA> <81E3> <A6DB> <A6DB> <81EA> endbfrange 100 beginbfrange <A6DC> <A6DC> <81F3> <A6DD> <A6DD> <81FC> <A6DE> <A6DE> <820C> <A6DF> <A6DF> <821B> <A6E0> <A6E0> <821F> <A6E1> <A6E1> <826E> <A6E2> <A6E2> <8272> <A6E3> <A6E3> <827E> <A6E4> <A6E4> <866B> <A6E5> <A6E5> <8840> <A6E6> <A6E6> <884C> <A6E7> <A6E7> <8863> <A6E8> <A6E8> <897F> <A6E9> <A6E9> <9621> <A6EA> <A6EA> <4E32> <A6EB> <A6EB> <4EA8> <A6EC> <A6EC> <4F4D> <A6ED> <A6ED> <4F4F> <A6EE> <A6EE> <4F47> <A6EF> <A6EF> <4F57> <A6F0> <A6F0> <4F5E> <A6F1> <A6F1> <4F34> <A6F2> <A6F2> <4F5B> <A6F3> <A6F3> <4F55> <A6F4> <A6F4> <4F30> <A6F5> <A6F6> <4F50> <A6F7> <A6F7> <4F3D> <A6F8> <A6F8> <4F3A> <A6F9> <A6F9> <4F38> <A6FA> <A6FA> <4F43> <A6FB> <A6FB> <4F54> <A6FC> <A6FC> <4F3C> <A6FD> <A6FD> <4F46> <A6FE> <A6FE> <4F63> <A740> <A740> <4F5C> <A741> <A741> <4F60> <A742> <A742> <4F2F> <A743> <A743> <4F4E> <A744> <A744> <4F36> <A745> <A745> <4F59> <A746> <A746> <4F5D> <A747> <A747> <4F48> <A748> <A748> <4F5A> <A749> <A749> <514C> <A74A> <A74A> <514B> <A74B> <A74B> <514D> <A74C> <A74C> <5175> <A74D> <A74E> <51B6> <A74F> <A74F> <5225> <A750> <A750> <5224> <A751> <A752> <5229> <A753> <A753> <5228> <A754> <A754> <52AB> <A755> <A756> <52A9> <A757> <A757> <52AC> <A758> <A758> <5323> <A759> <A759> <5373> <A75A> <A75A> <5375> <A75B> <A75B> <541D> <A75C> <A75C> <542D> <A75D> <A75D> <541E> <A75E> <A75E> <543E> <A75F> <A75F> <5426> <A760> <A760> <544E> <A761> <A761> <5427> <A762> <A762> <5446> <A763> <A763> <5443> <A764> <A764> <5433> <A765> <A765> <5448> <A766> <A766> <5442> <A767> <A767> <541B> <A768> <A768> <5429> <A769> <A769> <544A> <A76A> <A76A> <5439> <A76B> <A76B> <543B> <A76C> <A76C> <5438> <A76D> <A76D> <542E> <A76E> <A76F> <5435> <A770> <A770> <5420> <A771> <A771> <543C> <A772> <A772> <5440> <A773> <A773> <5431> <A774> <A774> <542B> <A775> <A775> <541F> <A776> <A776> <542C> <A777> <A777> <56EA> <A778> <A778> <56F0> <A779> <A779> <56E4> <A77A> <A77A> <56EB> <A77B> <A77B> <574A> <A77C> <A77C> <5751> <A77D> <A77D> <5740> <A77E> <A77E> <574D> <A7A1> <A7A1> <5747> <A7A2> <A7A2> <574E> <A7A3> <A7A3> <573E> <A7A4> <A7A4> <5750> <A7A5> <A7A5> <574F> <A7A6> <A7A6> <573B> <A7A7> <A7A7> <58EF> endbfrange 100 beginbfrange <A7A8> <A7A8> <593E> <A7A9> <A7A9> <599D> <A7AA> <A7AA> <5992> <A7AB> <A7AB> <59A8> <A7AC> <A7AC> <599E> <A7AD> <A7AD> <59A3> <A7AE> <A7AE> <5999> <A7AF> <A7AF> <5996> <A7B0> <A7B0> <598D> <A7B1> <A7B1> <59A4> <A7B2> <A7B2> <5993> <A7B3> <A7B3> <598A> <A7B4> <A7B4> <59A5> <A7B5> <A7B5> <5B5D> <A7B6> <A7B6> <5B5C> <A7B7> <A7B8> <5B5A> <A7B9> <A7B9> <5B8C> <A7BA> <A7BA> <5B8B> <A7BB> <A7BB> <5B8F> <A7BC> <A7BC> <5C2C> <A7BD> <A7BE> <5C40> <A7BF> <A7BF> <5C3F> <A7C0> <A7C0> <5C3E> <A7C1> <A7C2> <5C90> <A7C3> <A7C3> <5C94> <A7C4> <A7C4> <5C8C> <A7C5> <A7C5> <5DEB> <A7C6> <A7C6> <5E0C> <A7C7> <A7C7> <5E8F> <A7C8> <A7C8> <5E87> <A7C9> <A7C9> <5E8A> <A7CA> <A7CA> <5EF7> <A7CB> <A7CB> <5F04> <A7CC> <A7CC> <5F1F> <A7CD> <A7CD> <5F64> <A7CE> <A7CE> <5F62> <A7CF> <A7CF> <5F77> <A7D0> <A7D0> <5F79> <A7D1> <A7D1> <5FD8> <A7D2> <A7D2> <5FCC> <A7D3> <A7D3> <5FD7> <A7D4> <A7D4> <5FCD> <A7D5> <A7D5> <5FF1> <A7D6> <A7D6> <5FEB> <A7D7> <A7D7> <5FF8> <A7D8> <A7D8> <5FEA> <A7D9> <A7D9> <6212> <A7DA> <A7DA> <6211> <A7DB> <A7DB> <6284> <A7DC> <A7DC> <6297> <A7DD> <A7DD> <6296> <A7DE> <A7DE> <6280> <A7DF> <A7DF> <6276> <A7E0> <A7E0> <6289> <A7E1> <A7E1> <626D> <A7E2> <A7E2> <628A> <A7E3> <A7E3> <627C> <A7E4> <A7E4> <627E> <A7E5> <A7E5> <6279> <A7E6> <A7E6> <6273> <A7E7> <A7E7> <6292> <A7E8> <A7E8> <626F> <A7E9> <A7E9> <6298> <A7EA> <A7EA> <626E> <A7EB> <A7EB> <6295> <A7EC> <A7EC> <6293> <A7ED> <A7ED> <6291> <A7EE> <A7EE> <6286> <A7EF> <A7EF> <6539> <A7F0> <A7F0> <653B> <A7F1> <A7F1> <6538> <A7F2> <A7F2> <65F1> <A7F3> <A7F3> <66F4> <A7F4> <A7F4> <675F> <A7F5> <A7F8> <674E> <A7F9> <A7F9> <675C> <A7FA> <A7FA> <6756> <A7FB> <A7FB> <675E> <A7FC> <A7FC> <6749> <A7FD> <A7FD> <6746> <A7FE> <A7FE> <6760> <A840> <A840> <6753> <A841> <A841> <6757> <A842> <A842> <6B65> <A843> <A843> <6BCF> <A844> <A844> <6C42> <A845> <A845> <6C5E> <A846> <A846> <6C99> <A847> <A847> <6C81> <A848> <A849> <6C88> <A84A> <A84A> <6C85> <A84B> <A84B> <6C9B> <A84C> <A84C> <6C6A> <A84D> <A84D> <6C7A> <A84E> <A84E> <6C90> <A84F> <A84F> <6C70> <A850> <A850> <6C8C> <A851> <A851> <6C68> <A852> <A852> <6C96> <A853> <A853> <6C92> endbfrange 100 beginbfrange <A854> <A854> <6C7D> <A855> <A855> <6C83> <A856> <A856> <6C72> <A857> <A857> <6C7E> <A858> <A858> <6C74> <A859> <A859> <6C86> <A85A> <A85A> <6C76> <A85B> <A85B> <6C8D> <A85C> <A85C> <6C94> <A85D> <A85D> <6C98> <A85E> <A85E> <6C82> <A85F> <A85F> <7076> <A860> <A861> <707C> <A862> <A862> <7078> <A863> <A863> <7262> <A864> <A864> <7261> <A865> <A865> <7260> <A866> <A866> <72C4> <A867> <A867> <72C2> <A868> <A868> <7396> <A869> <A869> <752C> <A86A> <A86A> <752B> <A86B> <A86C> <7537> <A86D> <A86D> <7682> <A86E> <A86E> <76EF> <A86F> <A86F> <77E3> <A870> <A870> <79C1> <A871> <A871> <79C0> <A872> <A872> <79BF> <A873> <A873> <7A76> <A874> <A874> <7CFB> <A875> <A875> <7F55> <A876> <A876> <8096> <A877> <A877> <8093> <A878> <A878> <809D> <A879> <A879> <8098> <A87A> <A87A> <809B> <A87B> <A87B> <809A> <A87C> <A87C> <80B2> <A87D> <A87D> <826F> <A87E> <A87E> <8292> <A8A1> <A8A1> <828B> <A8A2> <A8A2> <828D> <A8A3> <A8A3> <898B> <A8A4> <A8A4> <89D2> <A8A5> <A8A5> <8A00> <A8A6> <A8A6> <8C37> <A8A7> <A8A7> <8C46> <A8A8> <A8A8> <8C55> <A8A9> <A8A9> <8C9D> <A8AA> <A8AA> <8D64> <A8AB> <A8AB> <8D70> <A8AC> <A8AC> <8DB3> <A8AD> <A8AD> <8EAB> <A8AE> <A8AE> <8ECA> <A8AF> <A8AF> <8F9B> <A8B0> <A8B0> <8FB0> <A8B1> <A8B1> <8FC2> <A8B2> <A8B2> <8FC6> <A8B3> <A8B3> <8FC5> <A8B4> <A8B4> <8FC4> <A8B5> <A8B5> <5DE1> <A8B6> <A8B6> <9091> <A8B7> <A8B7> <90A2> <A8B8> <A8B8> <90AA> <A8B9> <A8B9> <90A6> <A8BA> <A8BA> <90A3> <A8BB> <A8BB> <9149> <A8BC> <A8BC> <91C6> <A8BD> <A8BD> <91CC> <A8BE> <A8BE> <9632> <A8BF> <A8BF> <962E> <A8C0> <A8C0> <9631> <A8C1> <A8C1> <962A> <A8C2> <A8C2> <962C> <A8C3> <A8C3> <4E26> <A8C4> <A8C4> <4E56> <A8C5> <A8C5> <4E73> <A8C6> <A8C6> <4E8B> <A8C7> <A8C7> <4E9B> <A8C8> <A8C8> <4E9E> <A8C9> <A8CA> <4EAB> <A8CB> <A8CB> <4F6F> <A8CC> <A8CC> <4F9D> <A8CD> <A8CD> <4F8D> <A8CE> <A8CE> <4F73> <A8CF> <A8CF> <4F7F> <A8D0> <A8D0> <4F6C> <A8D1> <A8D1> <4F9B> <A8D2> <A8D2> <4F8B> <A8D3> <A8D3> <4F86> <A8D4> <A8D4> <4F83> <A8D5> <A8D5> <4F70> <A8D6> <A8D6> <4F75> <A8D7> <A8D7> <4F88> <A8D8> <A8D8> <4F69> <A8D9> <A8D9> <4F7B> <A8DA> <A8DA> <4F96> <A8DB> <A8DB> <4F7E> <A8DC> <A8DC> <4F8F> endbfrange 100 beginbfrange <A8DD> <A8DD> <4F91> <A8DE> <A8DE> <4F7A> <A8DF> <A8DF> <5154> <A8E0> <A8E0> <5152> <A8E1> <A8E1> <5155> <A8E2> <A8E2> <5169> <A8E3> <A8E3> <5177> <A8E4> <A8E4> <5176> <A8E5> <A8E5> <5178> <A8E6> <A8E6> <51BD> <A8E7> <A8E7> <51FD> <A8E8> <A8E8> <523B> <A8E9> <A8E9> <5238> <A8EA> <A8EA> <5237> <A8EB> <A8EB> <523A> <A8EC> <A8EC> <5230> <A8ED> <A8ED> <522E> <A8EE> <A8EE> <5236> <A8EF> <A8EF> <5241> <A8F0> <A8F0> <52BE> <A8F1> <A8F1> <52BB> <A8F2> <A8F2> <5352> <A8F3> <A8F3> <5354> <A8F4> <A8F4> <5353> <A8F5> <A8F5> <5351> <A8F6> <A8F6> <5366> <A8F7> <A8F9> <5377> <A8FA> <A8FA> <53D6> <A8FB> <A8FB> <53D4> <A8FC> <A8FC> <53D7> <A8FD> <A8FD> <5473> <A8FE> <A8FE> <5475> <A940> <A940> <5496> <A941> <A941> <5478> <A942> <A942> <5495> <A943> <A943> <5480> <A944> <A944> <547B> <A945> <A945> <5477> <A946> <A946> <5484> <A947> <A947> <5492> <A948> <A948> <5486> <A949> <A949> <547C> <A94A> <A94A> <5490> <A94B> <A94B> <5471> <A94C> <A94C> <5476> <A94D> <A94D> <548C> <A94E> <A94E> <549A> <A94F> <A94F> <5462> <A950> <A950> <5468> <A951> <A951> <548B> <A952> <A952> <547D> <A953> <A953> <548E> <A954> <A954> <56FA> <A955> <A955> <5783> <A956> <A956> <5777> <A957> <A957> <576A> <A958> <A958> <5769> <A959> <A959> <5761> <A95A> <A95A> <5766> <A95B> <A95B> <5764> <A95C> <A95C> <577C> <A95D> <A95D> <591C> <A95E> <A95E> <5949> <A95F> <A960> <5947> <A961> <A961> <5944> <A962> <A962> <5954> <A963> <A963> <59BE> <A964> <A964> <59BB> <A965> <A965> <59D4> <A966> <A966> <59B9> <A967> <A967> <59AE> <A968> <A968> <59D1> <A969> <A969> <59C6> <A96A> <A96A> <59D0> <A96B> <A96B> <59CD> <A96C> <A96C> <59CB> <A96D> <A96D> <59D3> <A96E> <A96E> <59CA> <A96F> <A96F> <59AF> <A970> <A970> <59B3> <A971> <A971> <59D2> <A972> <A972> <59C5> <A973> <A973> <5B5F> <A974> <A974> <5B64> <A975> <A975> <5B63> <A976> <A976> <5B97> <A977> <A977> <5B9A> <A978> <A978> <5B98> <A979> <A979> <5B9C> <A97A> <A97A> <5B99> <A97B> <A97B> <5B9B> <A97C> <A97C> <5C1A> <A97D> <A97D> <5C48> <A97E> <A97E> <5C45> <A9A1> <A9A1> <5C46> <A9A2> <A9A2> <5CB7> <A9A3> <A9A3> <5CA1> <A9A4> <A9A4> <5CB8> <A9A5> <A9A5> <5CA9> <A9A6> <A9A6> <5CAB> endbfrange 100 beginbfrange <A9A7> <A9A7> <5CB1> <A9A8> <A9A8> <5CB3> <A9A9> <A9A9> <5E18> <A9AA> <A9AA> <5E1A> <A9AB> <A9AB> <5E16> <A9AC> <A9AC> <5E15> <A9AD> <A9AD> <5E1B> <A9AE> <A9AE> <5E11> <A9AF> <A9AF> <5E78> <A9B0> <A9B0> <5E9A> <A9B1> <A9B1> <5E97> <A9B2> <A9B2> <5E9C> <A9B3> <A9B4> <5E95> <A9B5> <A9B5> <5EF6> <A9B6> <A9B7> <5F26> <A9B8> <A9B8> <5F29> <A9B9> <A9BA> <5F80> <A9BB> <A9BB> <5F7F> <A9BC> <A9BC> <5F7C> <A9BD> <A9BD> <5FDD> <A9BE> <A9BE> <5FE0> <A9BF> <A9BF> <5FFD> <A9C0> <A9C0> <5FF5> <A9C1> <A9C1> <5FFF> <A9C2> <A9C2> <600F> <A9C3> <A9C3> <6014> <A9C4> <A9C4> <602F> <A9C5> <A9C5> <6035> <A9C6> <A9C6> <6016> <A9C7> <A9C7> <602A> <A9C8> <A9C8> <6015> <A9C9> <A9C9> <6021> <A9CA> <A9CA> <6027> <A9CB> <A9CB> <6029> <A9CC> <A9CC> <602B> <A9CD> <A9CD> <601B> <A9CE> <A9CE> <6216> <A9CF> <A9CF> <6215> <A9D0> <A9D0> <623F> <A9D1> <A9D1> <623E> <A9D2> <A9D2> <6240> <A9D3> <A9D3> <627F> <A9D4> <A9D4> <62C9> <A9D5> <A9D5> <62CC> <A9D6> <A9D6> <62C4> <A9D7> <A9D7> <62BF> <A9D8> <A9D8> <62C2> <A9D9> <A9D9> <62B9> <A9DA> <A9DA> <62D2> <A9DB> <A9DB> <62DB> <A9DC> <A9DC> <62AB> <A9DD> <A9DE> <62D3> <A9DF> <A9DF> <62CB> <A9E0> <A9E0> <62C8> <A9E1> <A9E1> <62A8> <A9E2> <A9E2> <62BD> <A9E3> <A9E3> <62BC> <A9E4> <A9E4> <62D0> <A9E5> <A9E5> <62D9> <A9E6> <A9E6> <62C7> <A9E7> <A9E7> <62CD> <A9E8> <A9E8> <62B5> <A9E9> <A9E9> <62DA> <A9EA> <A9EA> <62B1> <A9EB> <A9EB> <62D8> <A9EC> <A9ED> <62D6> <A9EE> <A9EE> <62C6> <A9EF> <A9EF> <62AC> <A9F0> <A9F0> <62CE> <A9F1> <A9F1> <653E> <A9F2> <A9F2> <65A7> <A9F3> <A9F3> <65BC> <A9F4> <A9F4> <65FA> <A9F5> <A9F5> <6614> <A9F6> <A9F6> <6613> <A9F7> <A9F7> <660C> <A9F8> <A9F8> <6606> <A9F9> <A9F9> <6602> <A9FA> <A9FA> <660E> <A9FB> <A9FB> <6600> <A9FC> <A9FC> <660F> <A9FD> <A9FD> <6615> <A9FE> <A9FE> <660A> <AA40> <AA40> <6607> <AA41> <AA41> <670D> <AA42> <AA42> <670B> <AA43> <AA43> <676D> <AA44> <AA44> <678B> <AA45> <AA45> <6795> <AA46> <AA46> <6771> <AA47> <AA47> <679C> <AA48> <AA48> <6773> <AA49> <AA49> <6777> <AA4A> <AA4A> <6787> <AA4B> <AA4B> <679D> <AA4C> <AA4C> <6797> <AA4D> <AA4E> <676F> <AA4F> <AA4F> <677F> <AA50> <AA50> <6789> <AA51> <AA51> <677E> endbfrange 100 beginbfrange <AA52> <AA52> <6790> <AA53> <AA53> <6775> <AA54> <AA54> <679A> <AA55> <AA55> <6793> <AA56> <AA56> <677C> <AA57> <AA57> <676A> <AA58> <AA58> <6772> <AA59> <AA59> <6B23> <AA5A> <AA5B> <6B66> <AA5C> <AA5C> <6B7F> <AA5D> <AA5D> <6C13> <AA5E> <AA5E> <6C1B> <AA5F> <AA5F> <6CE3> <AA60> <AA60> <6CE8> <AA61> <AA61> <6CF3> <AA62> <AA62> <6CB1> <AA63> <AA63> <6CCC> <AA64> <AA64> <6CE5> <AA65> <AA65> <6CB3> <AA66> <AA67> <6CBD> <AA68> <AA68> <6CBC> <AA69> <AA69> <6CE2> <AA6A> <AA6A> <6CAB> <AA6B> <AA6B> <6CD5> <AA6C> <AA6C> <6CD3> <AA6D> <AA6D> <6CB8> <AA6E> <AA6E> <6CC4> <AA6F> <AA6F> <6CB9> <AA70> <AA70> <6CC1> <AA71> <AA71> <6CAE> <AA72> <AA72> <6CD7> <AA73> <AA73> <6CC5> <AA74> <AA74> <6CF1> <AA75> <AA75> <6CBF> <AA76> <AA76> <6CBB> <AA77> <AA77> <6CE1> <AA78> <AA78> <6CDB> <AA79> <AA79> <6CCA> <AA7A> <AA7A> <6CAC> <AA7B> <AA7B> <6CEF> <AA7C> <AA7C> <6CDC> <AA7D> <AA7D> <6CD6> <AA7E> <AA7E> <6CE0> <AAA1> <AAA1> <7095> <AAA2> <AAA2> <708E> <AAA3> <AAA3> <7092> <AAA4> <AAA4> <708A> <AAA5> <AAA5> <7099> <AAA6> <AAA7> <722C> <AAA8> <AAA8> <7238> <AAA9> <AAA9> <7248> <AAAA> <AAAA> <7267> <AAAB> <AAAB> <7269> <AAAC> <AAAC> <72C0> <AAAD> <AAAD> <72CE> <AAAE> <AAAE> <72D9> <AAAF> <AAAF> <72D7> <AAB0> <AAB0> <72D0> <AAB1> <AAB1> <73A9> <AAB2> <AAB2> <73A8> <AAB3> <AAB3> <739F> <AAB4> <AAB4> <73AB> <AAB5> <AAB5> <73A5> <AAB6> <AAB6> <753D> <AAB7> <AAB7> <759D> <AAB8> <AAB9> <7599> <AABA> <AABA> <7684> <AABB> <AABB> <76C2> <AABC> <AABC> <76F2> <AABD> <AABD> <76F4> <AABE> <AABE> <77E5> <AABF> <AABF> <77FD> <AAC0> <AAC0> <793E> <AAC1> <AAC2> <7940> <AAC3> <AAC3> <79C9> <AAC4> <AAC4> <79C8> <AAC5> <AAC5> <7A7A> <AAC6> <AAC6> <7A79> <AAC7> <AAC7> <7AFA> <AAC8> <AAC8> <7CFE> <AAC9> <AAC9> <7F54> <AACA> <AACA> <7F8C> <AACB> <AACB> <7F8B> <AACC> <AACC> <8005> <AACD> <AACD> <80BA> <AACE> <AACE> <80A5> <AACF> <AACF> <80A2> <AAD0> <AAD0> <80B1> <AAD1> <AAD1> <80A1> <AAD2> <AAD2> <80AB> <AAD3> <AAD3> <80A9> <AAD4> <AAD4> <80B4> <AAD5> <AAD5> <80AA> <AAD6> <AAD6> <80AF> <AAD7> <AAD7> <81E5> <AAD8> <AAD8> <81FE> <AAD9> <AAD9> <820D> <AADA> <AADA> <82B3> <AADB> <AADB> <829D> <AADC> <AADC> <8299> endbfrange 100 beginbfrange <AADD> <AADD> <82AD> <AADE> <AADE> <82BD> <AADF> <AADF> <829F> <AAE0> <AAE0> <82B9> <AAE1> <AAE1> <82B1> <AAE2> <AAE2> <82AC> <AAE3> <AAE3> <82A5> <AAE4> <AAE4> <82AF> <AAE5> <AAE5> <82B8> <AAE6> <AAE6> <82A3> <AAE7> <AAE7> <82B0> <AAE8> <AAE8> <82BE> <AAE9> <AAE9> <82B7> <AAEA> <AAEA> <864E> <AAEB> <AAEB> <8671> <AAEC> <AAEC> <521D> <AAED> <AAED> <8868> <AAEE> <AAEE> <8ECB> <AAEF> <AAEF> <8FCE> <AAF0> <AAF0> <8FD4> <AAF1> <AAF1> <8FD1> <AAF2> <AAF2> <90B5> <AAF3> <AAF3> <90B8> <AAF4> <AAF4> <90B1> <AAF5> <AAF5> <90B6> <AAF6> <AAF6> <91C7> <AAF7> <AAF7> <91D1> <AAF8> <AAF8> <9577> <AAF9> <AAF9> <9580> <AAFA> <AAFA> <961C> <AAFB> <AAFB> <9640> <AAFC> <AAFC> <963F> <AAFD> <AAFD> <963B> <AAFE> <AAFE> <9644> <AB40> <AB40> <9642> <AB41> <AB41> <96B9> <AB42> <AB42> <96E8> <AB43> <AB43> <9752> <AB44> <AB44> <975E> <AB45> <AB45> <4E9F> <AB46> <AB47> <4EAD> <AB48> <AB48> <4FE1> <AB49> <AB49> <4FB5> <AB4A> <AB4A> <4FAF> <AB4B> <AB4B> <4FBF> <AB4C> <AB4C> <4FE0> <AB4D> <AB4D> <4FD1> <AB4E> <AB4E> <4FCF> <AB4F> <AB4F> <4FDD> <AB50> <AB50> <4FC3> <AB51> <AB51> <4FB6> <AB52> <AB52> <4FD8> <AB53> <AB53> <4FDF> <AB54> <AB54> <4FCA> <AB55> <AB55> <4FD7> <AB56> <AB56> <4FAE> <AB57> <AB57> <4FD0> <AB58> <AB58> <4FC4> <AB59> <AB59> <4FC2> <AB5A> <AB5A> <4FDA> <AB5B> <AB5B> <4FCE> <AB5C> <AB5C> <4FDE> <AB5D> <AB5D> <4FB7> <AB5E> <AB5E> <5157> <AB5F> <AB5F> <5192> <AB60> <AB60> <5191> <AB61> <AB61> <51A0> <AB62> <AB62> <524E> <AB63> <AB63> <5243> <AB64> <AB64> <524A> <AB65> <AB65> <524D> <AB66> <AB66> <524C> <AB67> <AB67> <524B> <AB68> <AB68> <5247> <AB69> <AB69> <52C7> <AB6A> <AB6A> <52C9> <AB6B> <AB6B> <52C3> <AB6C> <AB6C> <52C1> <AB6D> <AB6D> <530D> <AB6E> <AB6E> <5357> <AB6F> <AB6F> <537B> <AB70> <AB70> <539A> <AB71> <AB71> <53DB> <AB72> <AB72> <54AC> <AB73> <AB73> <54C0> <AB74> <AB74> <54A8> <AB75> <AB75> <54CE> <AB76> <AB76> <54C9> <AB77> <AB77> <54B8> <AB78> <AB78> <54A6> <AB79> <AB79> <54B3> <AB7A> <AB7A> <54C7> <AB7B> <AB7B> <54C2> <AB7C> <AB7C> <54BD> <AB7D> <AB7D> <54AA> <AB7E> <AB7E> <54C1> <ABA1> <ABA1> <54C4> <ABA2> <ABA2> <54C8> <ABA3> <ABA3> <54AF> <ABA4> <ABA4> <54AB> endbfrange 100 beginbfrange <ABA5> <ABA5> <54B1> <ABA6> <ABA6> <54BB> <ABA7> <ABA7> <54A9> <ABA8> <ABA8> <54A7> <ABA9> <ABA9> <54BF> <ABAA> <ABAA> <56FF> <ABAB> <ABAB> <5782> <ABAC> <ABAC> <578B> <ABAD> <ABAD> <57A0> <ABAE> <ABAE> <57A3> <ABAF> <ABAF> <57A2> <ABB0> <ABB0> <57CE> <ABB1> <ABB1> <57AE> <ABB2> <ABB2> <5793> <ABB3> <ABB3> <5955> <ABB4> <ABB4> <5951> <ABB5> <ABB5> <594F> <ABB6> <ABB6> <594E> <ABB7> <ABB7> <5950> <ABB8> <ABB8> <59DC> <ABB9> <ABB9> <59D8> <ABBA> <ABBA> <59FF> <ABBB> <ABBB> <59E3> <ABBC> <ABBC> <59E8> <ABBD> <ABBD> <5A03> <ABBE> <ABBE> <59E5> <ABBF> <ABBF> <59EA> <ABC0> <ABC0> <59DA> <ABC1> <ABC1> <59E6> <ABC2> <ABC2> <5A01> <ABC3> <ABC3> <59FB> <ABC4> <ABC4> <5B69> <ABC5> <ABC5> <5BA3> <ABC6> <ABC6> <5BA6> <ABC7> <ABC7> <5BA4> <ABC8> <ABC8> <5BA2> <ABC9> <ABC9> <5BA5> <ABCA> <ABCA> <5C01> <ABCB> <ABCC> <5C4E> <ABCD> <ABCD> <5C4D> <ABCE> <ABCE> <5C4B> <ABCF> <ABCF> <5CD9> <ABD0> <ABD0> <5CD2> <ABD1> <ABD1> <5DF7> <ABD2> <ABD2> <5E1D> <ABD3> <ABD3> <5E25> <ABD4> <ABD4> <5E1F> <ABD5> <ABD5> <5E7D> <ABD6> <ABD6> <5EA0> <ABD7> <ABD7> <5EA6> <ABD8> <ABD8> <5EFA> <ABD9> <ABD9> <5F08> <ABDA> <ABDA> <5F2D> <ABDB> <ABDB> <5F65> <ABDC> <ABDC> <5F88> <ABDD> <ABDD> <5F85> <ABDE> <ABDF> <5F8A> <ABE0> <ABE0> <5F87> <ABE1> <ABE1> <5F8C> <ABE2> <ABE2> <5F89> <ABE3> <ABE3> <6012> <ABE4> <ABE4> <601D> <ABE5> <ABE5> <6020> <ABE6> <ABE6> <6025> <ABE7> <ABE7> <600E> <ABE8> <ABE8> <6028> <ABE9> <ABE9> <604D> <ABEA> <ABEA> <6070> <ABEB> <ABEB> <6068> <ABEC> <ABEC> <6062> <ABED> <ABED> <6046> <ABEE> <ABEE> <6043> <ABEF> <ABEF> <606C> <ABF0> <ABF0> <606B> <ABF1> <ABF1> <606A> <ABF2> <ABF2> <6064> <ABF3> <ABF3> <6241> <ABF4> <ABF4> <62DC> <ABF5> <ABF5> <6316> <ABF6> <ABF6> <6309> <ABF7> <ABF7> <62FC> <ABF8> <ABF8> <62ED> <ABF9> <ABF9> <6301> <ABFA> <ABFA> <62EE> <ABFB> <ABFB> <62FD> <ABFC> <ABFC> <6307> <ABFD> <ABFD> <62F1> <ABFE> <ABFE> <62F7> <AC40> <AC40> <62EF> <AC41> <AC41> <62EC> <AC42> <AC42> <62FE> <AC43> <AC43> <62F4> <AC44> <AC44> <6311> <AC45> <AC45> <6302> <AC46> <AC46> <653F> <AC47> <AC47> <6545> <AC48> <AC48> <65AB> <AC49> <AC49> <65BD> <AC4A> <AC4A> <65E2> <AC4B> <AC4B> <6625> endbfrange 100 beginbfrange <AC4C> <AC4C> <662D> <AC4D> <AC4D> <6620> <AC4E> <AC4E> <6627> <AC4F> <AC4F> <662F> <AC50> <AC50> <661F> <AC51> <AC51> <6628> <AC52> <AC52> <6631> <AC53> <AC53> <6624> <AC54> <AC54> <66F7> <AC55> <AC55> <67FF> <AC56> <AC56> <67D3> <AC57> <AC57> <67F1> <AC58> <AC58> <67D4> <AC59> <AC59> <67D0> <AC5A> <AC5A> <67EC> <AC5B> <AC5B> <67B6> <AC5C> <AC5C> <67AF> <AC5D> <AC5D> <67F5> <AC5E> <AC5E> <67E9> <AC5F> <AC5F> <67EF> <AC60> <AC60> <67C4> <AC61> <AC61> <67D1> <AC62> <AC62> <67B4> <AC63> <AC63> <67DA> <AC64> <AC64> <67E5> <AC65> <AC65> <67B8> <AC66> <AC66> <67CF> <AC67> <AC67> <67DE> <AC68> <AC68> <67F3> <AC69> <AC69> <67B0> <AC6A> <AC6A> <67D9> <AC6B> <AC6B> <67E2> <AC6C> <AC6C> <67DD> <AC6D> <AC6D> <67D2> <AC6E> <AC6E> <6B6A> <AC6F> <AC6F> <6B83> <AC70> <AC70> <6B86> <AC71> <AC71> <6BB5> <AC72> <AC72> <6BD2> <AC73> <AC73> <6BD7> <AC74> <AC74> <6C1F> <AC75> <AC75> <6CC9> <AC76> <AC76> <6D0B> <AC77> <AC77> <6D32> <AC78> <AC78> <6D2A> <AC79> <AC79> <6D41> <AC7A> <AC7A> <6D25> <AC7B> <AC7B> <6D0C> <AC7C> <AC7C> <6D31> <AC7D> <AC7D> <6D1E> <AC7E> <AC7E> <6D17> <ACA1> <ACA1> <6D3B> <ACA2> <ACA3> <6D3D> <ACA4> <ACA4> <6D36> <ACA5> <ACA5> <6D1B> <ACA6> <ACA6> <6CF5> <ACA7> <ACA7> <6D39> <ACA8> <ACA8> <6D27> <ACA9> <ACA9> <6D38> <ACAA> <ACAA> <6D29> <ACAB> <ACAB> <6D2E> <ACAC> <ACAC> <6D35> <ACAD> <ACAD> <6D0E> <ACAE> <ACAE> <6D2B> <ACAF> <ACAF> <70AB> <ACB0> <ACB0> <70BA> <ACB1> <ACB1> <70B3> <ACB2> <ACB2> <70AC> <ACB3> <ACB3> <70AF> <ACB4> <ACB4> <70AD> <ACB5> <ACB5> <70B8> <ACB6> <ACB6> <70AE> <ACB7> <ACB7> <70A4> <ACB8> <ACB8> <7230> <ACB9> <ACB9> <7272> <ACBA> <ACBA> <726F> <ACBB> <ACBB> <7274> <ACBC> <ACBC> <72E9> <ACBD> <ACBE> <72E0> <ACBF> <ACBF> <73B7> <ACC0> <ACC0> <73CA> <ACC1> <ACC1> <73BB> <ACC2> <ACC2> <73B2> <ACC3> <ACC3> <73CD> <ACC4> <ACC4> <73C0> <ACC5> <ACC5> <73B3> <ACC6> <ACC6> <751A> <ACC7> <ACC7> <752D> <ACC8> <ACC8> <754F> <ACC9> <ACC9> <754C> <ACCA> <ACCA> <754E> <ACCB> <ACCB> <754B> <ACCC> <ACCC> <75AB> <ACCD> <ACCE> <75A4> <ACCF> <ACD0> <75A2> <ACD1> <ACD1> <7678> <ACD2> <ACD4> <7686> <ACD5> <ACD5> <76C8> <ACD6> <ACD6> <76C6> <ACD7> <ACD7> <76C3> endbfrange 100 beginbfrange <ACD8> <ACD8> <76C5> <ACD9> <ACD9> <7701> <ACDA> <ACDA> <76F9> <ACDB> <ACDB> <76F8> <ACDC> <ACDC> <7709> <ACDD> <ACDD> <770B> <ACDE> <ACDE> <76FE> <ACDF> <ACDF> <76FC> <ACE0> <ACE0> <7707> <ACE1> <ACE1> <77DC> <ACE2> <ACE2> <7802> <ACE3> <ACE3> <7814> <ACE4> <ACE5> <780C> <ACE6> <ACE6> <7946> <ACE7> <ACE7> <7949> <ACE8> <ACE8> <7948> <ACE9> <ACE9> <7947> <ACEA> <ACEB> <79B9> <ACEC> <ACED> <79D1> <ACEE> <ACEE> <79CB> <ACEF> <ACEF> <7A7F> <ACF0> <ACF0> <7A81> <ACF1> <ACF1> <7AFF> <ACF2> <ACF2> <7AFD> <ACF3> <ACF3> <7C7D> <ACF4> <ACF4> <7D02> <ACF5> <ACF5> <7D05> <ACF6> <ACF6> <7D00> <ACF7> <ACF7> <7D09> <ACF8> <ACF8> <7D07> <ACF9> <ACF9> <7D04> <ACFA> <ACFA> <7D06> <ACFB> <ACFB> <7F38> <ACFC> <ACFC> <7F8E> <ACFD> <ACFD> <7FBF> <ACFE> <ACFE> <8004> <AD40> <AD40> <8010> <AD41> <AD41> <800D> <AD42> <AD42> <8011> <AD43> <AD43> <8036> <AD44> <AD44> <80D6> <AD45> <AD45> <80E5> <AD46> <AD46> <80DA> <AD47> <AD48> <80C3> <AD49> <AD49> <80CC> <AD4A> <AD4A> <80E1> <AD4B> <AD4B> <80DB> <AD4C> <AD4C> <80CE> <AD4D> <AD4D> <80DE> <AD4E> <AD4E> <80E4> <AD4F> <AD4F> <80DD> <AD50> <AD50> <81F4> <AD51> <AD51> <8222> <AD52> <AD52> <82E7> <AD53> <AD53> <8303> <AD54> <AD54> <8305> <AD55> <AD55> <82E3> <AD56> <AD56> <82DB> <AD57> <AD57> <82E6> <AD58> <AD58> <8304> <AD59> <AD59> <82E5> <AD5A> <AD5A> <8302> <AD5B> <AD5B> <8309> <AD5C> <AD5C> <82D2> <AD5D> <AD5D> <82D7> <AD5E> <AD5E> <82F1> <AD5F> <AD5F> <8301> <AD60> <AD60> <82DC> <AD61> <AD61> <82D4> <AD62> <AD62> <82D1> <AD63> <AD63> <82DE> <AD64> <AD64> <82D3> <AD65> <AD65> <82DF> <AD66> <AD66> <82EF> <AD67> <AD67> <8306> <AD68> <AD68> <8650> <AD69> <AD69> <8679> <AD6A> <AD6A> <867B> <AD6B> <AD6B> <867A> <AD6C> <AD6C> <884D> <AD6D> <AD6D> <886B> <AD6E> <AD6E> <8981> <AD6F> <AD6F> <89D4> <AD70> <AD70> <8A08> <AD71> <AD72> <8A02> <AD73> <AD73> <8C9E> <AD74> <AD74> <8CA0> <AD75> <AD75> <8D74> <AD76> <AD76> <8D73> <AD77> <AD77> <8DB4> <AD78> <AD78> <8ECD> <AD79> <AD79> <8ECC> <AD7A> <AD7A> <8FF0> <AD7B> <AD7B> <8FE6> <AD7C> <AD7C> <8FE2> <AD7D> <AD7D> <8FEA> <AD7E> <AD7E> <8FE5> <ADA1> <ADA1> <8FED> <ADA2> <ADA2> <8FEB> <ADA3> <ADA3> <8FE4> endbfrange 100 beginbfrange <ADA4> <ADA4> <8FE8> <ADA5> <ADA5> <90CA> <ADA6> <ADA6> <90CE> <ADA7> <ADA7> <90C1> <ADA8> <ADA8> <90C3> <ADA9> <ADA9> <914B> <ADAA> <ADAA> <914A> <ADAB> <ADAB> <91CD> <ADAC> <ADAC> <9582> <ADAD> <ADAD> <9650> <ADAE> <ADB0> <964B> <ADB1> <ADB1> <9762> <ADB2> <ADB2> <9769> <ADB3> <ADB3> <97CB> <ADB4> <ADB4> <97ED> <ADB5> <ADB5> <97F3> <ADB6> <ADB6> <9801> <ADB7> <ADB7> <98A8> <ADB8> <ADB8> <98DB> <ADB9> <ADB9> <98DF> <ADBA> <ADBA> <9996> <ADBB> <ADBB> <9999> <ADBC> <ADBC> <4E58> <ADBD> <ADBD> <4EB3> <ADBE> <ADBF> <500C> <ADC0> <ADC0> <5023> <ADC1> <ADC1> <4FEF> <ADC2> <ADC2> <5026> <ADC3> <ADC3> <5025> <ADC4> <ADC4> <4FF8> <ADC5> <ADC5> <5029> <ADC6> <ADC6> <5016> <ADC7> <ADC7> <5006> <ADC8> <ADC8> <503C> <ADC9> <ADC9> <501F> <ADCA> <ADCA> <501A> <ADCB> <ADCB> <5012> <ADCC> <ADCC> <5011> <ADCD> <ADCD> <4FFA> <ADCE> <ADCE> <5000> <ADCF> <ADCF> <5014> <ADD0> <ADD0> <5028> <ADD1> <ADD1> <4FF1> <ADD2> <ADD2> <5021> <ADD3> <ADD3> <500B> <ADD4> <ADD4> <5019> <ADD5> <ADD5> <5018> <ADD6> <ADD6> <4FF3> <ADD7> <ADD7> <4FEE> <ADD8> <ADD8> <502D> <ADD9> <ADD9> <502A> <ADDA> <ADDA> <4FFE> <ADDB> <ADDB> <502B> <ADDC> <ADDC> <5009> <ADDD> <ADDD> <517C> <ADDE> <ADDF> <51A4> <ADE0> <ADE0> <51A2> <ADE1> <ADE1> <51CD> <ADE2> <ADE2> <51CC> <ADE3> <ADE3> <51C6> <ADE4> <ADE4> <51CB> <ADE5> <ADE5> <5256> <ADE6> <ADE6> <525C> <ADE7> <ADE7> <5254> <ADE8> <ADE8> <525B> <ADE9> <ADE9> <525D> <ADEA> <ADEA> <532A> <ADEB> <ADEB> <537F> <ADEC> <ADEC> <539F> <ADED> <ADED> <539D> <ADEE> <ADEE> <53DF> <ADEF> <ADEF> <54E8> <ADF0> <ADF0> <5510> <ADF1> <ADF1> <5501> <ADF2> <ADF2> <5537> <ADF3> <ADF3> <54FC> <ADF4> <ADF4> <54E5> <ADF5> <ADF5> <54F2> <ADF6> <ADF6> <5506> <ADF7> <ADF7> <54FA> <ADF8> <ADF8> <5514> <ADF9> <ADF9> <54E9> <ADFA> <ADFA> <54ED> <ADFB> <ADFB> <54E1> <ADFC> <ADFC> <5509> <ADFD> <ADFD> <54EE> <ADFE> <ADFE> <54EA> <AE40> <AE40> <54E6> <AE41> <AE41> <5527> <AE42> <AE42> <5507> <AE43> <AE43> <54FD> <AE44> <AE44> <550F> <AE45> <AE46> <5703> <AE47> <AE47> <57C2> <AE48> <AE48> <57D4> <AE49> <AE49> <57CB> <AE4A> <AE4A> <57C3> <AE4B> <AE4B> <5809> <AE4C> <AE4C> <590F> <AE4D> <AE4E> <5957> endbfrange 100 beginbfrange <AE4F> <AE4F> <595A> <AE50> <AE50> <5A11> <AE51> <AE51> <5A18> <AE52> <AE52> <5A1C> <AE53> <AE53> <5A1F> <AE54> <AE54> <5A1B> <AE55> <AE55> <5A13> <AE56> <AE56> <59EC> <AE57> <AE57> <5A20> <AE58> <AE58> <5A23> <AE59> <AE59> <5A29> <AE5A> <AE5A> <5A25> <AE5B> <AE5B> <5A0C> <AE5C> <AE5C> <5A09> <AE5D> <AE5D> <5B6B> <AE5E> <AE5E> <5C58> <AE5F> <AE5F> <5BB0> <AE60> <AE60> <5BB3> <AE61> <AE61> <5BB6> <AE62> <AE62> <5BB4> <AE63> <AE63> <5BAE> <AE64> <AE64> <5BB5> <AE65> <AE65> <5BB9> <AE66> <AE66> <5BB8> <AE67> <AE67> <5C04> <AE68> <AE68> <5C51> <AE69> <AE69> <5C55> <AE6A> <AE6A> <5C50> <AE6B> <AE6B> <5CED> <AE6C> <AE6C> <5CFD> <AE6D> <AE6D> <5CFB> <AE6E> <AE6E> <5CEA> <AE6F> <AE6F> <5CE8> <AE70> <AE70> <5CF0> <AE71> <AE71> <5CF6> <AE72> <AE72> <5D01> <AE73> <AE73> <5CF4> <AE74> <AE74> <5DEE> <AE75> <AE75> <5E2D> <AE76> <AE76> <5E2B> <AE77> <AE77> <5EAB> <AE78> <AE78> <5EAD> <AE79> <AE79> <5EA7> <AE7A> <AE7A> <5F31> <AE7B> <AE7B> <5F92> <AE7C> <AE7C> <5F91> <AE7D> <AE7D> <5F90> <AE7E> <AE7E> <6059> <AEA1> <AEA1> <6063> <AEA2> <AEA2> <6065> <AEA3> <AEA3> <6050> <AEA4> <AEA4> <6055> <AEA5> <AEA5> <606D> <AEA6> <AEA6> <6069> <AEA7> <AEA7> <606F> <AEA8> <AEA8> <6084> <AEA9> <AEA9> <609F> <AEAA> <AEAA> <609A> <AEAB> <AEAB> <608D> <AEAC> <AEAC> <6094> <AEAD> <AEAD> <608C> <AEAE> <AEAE> <6085> <AEAF> <AEAF> <6096> <AEB0> <AEB0> <6247> <AEB1> <AEB1> <62F3> <AEB2> <AEB2> <6308> <AEB3> <AEB3> <62FF> <AEB4> <AEB4> <634E> <AEB5> <AEB5> <633E> <AEB6> <AEB6> <632F> <AEB7> <AEB7> <6355> <AEB8> <AEB8> <6342> <AEB9> <AEB9> <6346> <AEBA> <AEBA> <634F> <AEBB> <AEBB> <6349> <AEBC> <AEBC> <633A> <AEBD> <AEBD> <6350> <AEBE> <AEBE> <633D> <AEBF> <AEC0> <632A> <AEC1> <AEC1> <6328> <AEC2> <AEC2> <634D> <AEC3> <AEC3> <634C> <AEC4> <AEC5> <6548> <AEC6> <AEC6> <6599> <AEC7> <AEC7> <65C1> <AEC8> <AEC8> <65C5> <AEC9> <AEC9> <6642> <AECA> <AECA> <6649> <AECB> <AECB> <664F> <AECC> <AECC> <6643> <AECD> <AECD> <6652> <AECE> <AECE> <664C> <AECF> <AECF> <6645> <AED0> <AED0> <6641> <AED1> <AED1> <66F8> <AED2> <AED3> <6714> <AED4> <AED4> <6717> <AED5> <AED5> <6821> <AED6> <AED6> <6838> <AED7> <AED7> <6848> endbfrange 100 beginbfrange <AED8> <AED8> <6846> <AED9> <AED9> <6853> <AEDA> <AEDA> <6839> <AEDB> <AEDB> <6842> <AEDC> <AEDC> <6854> <AEDD> <AEDD> <6829> <AEDE> <AEDE> <68B3> <AEDF> <AEDF> <6817> <AEE0> <AEE0> <684C> <AEE1> <AEE1> <6851> <AEE2> <AEE2> <683D> <AEE3> <AEE3> <67F4> <AEE4> <AEE4> <6850> <AEE5> <AEE5> <6840> <AEE6> <AEE6> <683C> <AEE7> <AEE7> <6843> <AEE8> <AEE8> <682A> <AEE9> <AEE9> <6845> <AEEA> <AEEA> <6813> <AEEB> <AEEB> <6818> <AEEC> <AEEC> <6841> <AEED> <AEED> <6B8A> <AEEE> <AEEE> <6B89> <AEEF> <AEEF> <6BB7> <AEF0> <AEF0> <6C23> <AEF1> <AEF2> <6C27> <AEF3> <AEF3> <6C26> <AEF4> <AEF4> <6C24> <AEF5> <AEF5> <6CF0> <AEF6> <AEF6> <6D6A> <AEF7> <AEF7> <6D95> <AEF8> <AEF8> <6D88> <AEF9> <AEF9> <6D87> <AEFA> <AEFA> <6D66> <AEFB> <AEFB> <6D78> <AEFC> <AEFC> <6D77> <AEFD> <AEFD> <6D59> <AEFE> <AEFE> <6D93> <AF40> <AF40> <6D6C> <AF41> <AF41> <6D89> <AF42> <AF42> <6D6E> <AF43> <AF43> <6D5A> <AF44> <AF44> <6D74> <AF45> <AF45> <6D69> <AF46> <AF46> <6D8C> <AF47> <AF47> <6D8A> <AF48> <AF48> <6D79> <AF49> <AF49> <6D85> <AF4A> <AF4A> <6D65> <AF4B> <AF4B> <6D94> <AF4C> <AF4C> <70CA> <AF4D> <AF4D> <70D8> <AF4E> <AF4E> <70E4> <AF4F> <AF4F> <70D9> <AF50> <AF50> <70C8> <AF51> <AF51> <70CF> <AF52> <AF52> <7239> <AF53> <AF53> <7279> <AF54> <AF54> <72FC> <AF55> <AF55> <72F9> <AF56> <AF56> <72FD> <AF57> <AF57> <72F8> <AF58> <AF58> <72F7> <AF59> <AF59> <7386> <AF5A> <AF5A> <73ED> <AF5B> <AF5B> <7409> <AF5C> <AF5C> <73EE> <AF5D> <AF5D> <73E0> <AF5E> <AF5E> <73EA> <AF5F> <AF5F> <73DE> <AF60> <AF60> <7554> <AF61> <AF61> <755D> <AF62> <AF62> <755C> <AF63> <AF63> <755A> <AF64> <AF64> <7559> <AF65> <AF65> <75BE> <AF66> <AF66> <75C5> <AF67> <AF67> <75C7> <AF68> <AF69> <75B2> <AF6A> <AF6A> <75BD> <AF6B> <AF6B> <75BC> <AF6C> <AF6C> <75B9> <AF6D> <AF6D> <75C2> <AF6E> <AF6E> <75B8> <AF6F> <AF6F> <768B> <AF70> <AF70> <76B0> <AF71> <AF71> <76CA> <AF72> <AF73> <76CD> <AF74> <AF74> <7729> <AF75> <AF76> <771F> <AF77> <AF77> <7728> <AF78> <AF78> <77E9> <AF79> <AF79> <7830> <AF7A> <AF7A> <7827> <AF7B> <AF7B> <7838> <AF7C> <AF7C> <781D> <AF7D> <AF7D> <7834> <AF7E> <AF7E> <7837> <AFA1> <AFA1> <7825> <AFA2> <AFA2> <782D> endbfrange 100 beginbfrange <AFA3> <AFA3> <7820> <AFA4> <AFA4> <781F> <AFA5> <AFA5> <7832> <AFA6> <AFA6> <7955> <AFA7> <AFA7> <7950> <AFA8> <AFA8> <7960> <AFA9> <AFA9> <795F> <AFAA> <AFAA> <7956> <AFAB> <AFAB> <795E> <AFAC> <AFAC> <795D> <AFAD> <AFAD> <7957> <AFAE> <AFAE> <795A> <AFAF> <AFAF> <79E4> <AFB0> <AFB0> <79E3> <AFB1> <AFB1> <79E7> <AFB2> <AFB2> <79DF> <AFB3> <AFB3> <79E6> <AFB4> <AFB4> <79E9> <AFB5> <AFB5> <79D8> <AFB6> <AFB6> <7A84> <AFB7> <AFB7> <7A88> <AFB8> <AFB8> <7AD9> <AFB9> <AFB9> <7B06> <AFBA> <AFBA> <7B11> <AFBB> <AFBB> <7C89> <AFBC> <AFBC> <7D21> <AFBD> <AFBD> <7D17> <AFBE> <AFBE> <7D0B> <AFBF> <AFBF> <7D0A> <AFC0> <AFC0> <7D20> <AFC1> <AFC1> <7D22> <AFC2> <AFC2> <7D14> <AFC3> <AFC3> <7D10> <AFC4> <AFC4> <7D15> <AFC5> <AFC5> <7D1A> <AFC6> <AFC6> <7D1C> <AFC7> <AFC7> <7D0D> <AFC8> <AFC8> <7D19> <AFC9> <AFC9> <7D1B> <AFCA> <AFCA> <7F3A> <AFCB> <AFCB> <7F5F> <AFCC> <AFCC> <7F94> <AFCD> <AFCD> <7FC5> <AFCE> <AFCE> <7FC1> <AFCF> <AFCF> <8006> <AFD0> <AFD0> <8018> <AFD1> <AFD1> <8015> <AFD2> <AFD2> <8019> <AFD3> <AFD3> <8017> <AFD4> <AFD4> <803D> <AFD5> <AFD5> <803F> <AFD6> <AFD6> <80F1> <AFD7> <AFD7> <8102> <AFD8> <AFD8> <80F0> <AFD9> <AFD9> <8105> <AFDA> <AFDA> <80ED> <AFDB> <AFDB> <80F4> <AFDC> <AFDC> <8106> <AFDD> <AFDD> <80F8> <AFDE> <AFDE> <80F3> <AFDF> <AFDF> <8108> <AFE0> <AFE0> <80FD> <AFE1> <AFE1> <810A> <AFE2> <AFE2> <80FC> <AFE3> <AFE3> <80EF> <AFE4> <AFE4> <81ED> <AFE5> <AFE5> <81EC> <AFE6> <AFE6> <8200> <AFE7> <AFE7> <8210> <AFE8> <AFE9> <822A> <AFEA> <AFEA> <8228> <AFEB> <AFEB> <822C> <AFEC> <AFEC> <82BB> <AFED> <AFED> <832B> <AFEE> <AFEE> <8352> <AFEF> <AFEF> <8354> <AFF0> <AFF0> <834A> <AFF1> <AFF1> <8338> <AFF2> <AFF2> <8350> <AFF3> <AFF3> <8349> <AFF4> <AFF4> <8335> <AFF5> <AFF5> <8334> <AFF6> <AFF6> <834F> <AFF7> <AFF7> <8332> <AFF8> <AFF8> <8339> <AFF9> <AFF9> <8336> <AFFA> <AFFA> <8317> <AFFB> <AFFB> <8340> <AFFC> <AFFC> <8331> <AFFD> <AFFD> <8328> <AFFE> <AFFE> <8343> <B040> <B040> <8654> <B041> <B041> <868A> <B042> <B042> <86AA> <B043> <B043> <8693> <B044> <B044> <86A4> <B045> <B045> <86A9> <B046> <B046> <868C> <B047> <B047> <86A3> <B048> <B048> <869C> endbfrange 100 beginbfrange <B049> <B049> <8870> <B04A> <B04A> <8877> <B04B> <B04C> <8881> <B04D> <B04D> <887D> <B04E> <B04E> <8879> <B04F> <B04F> <8A18> <B050> <B050> <8A10> <B051> <B051> <8A0E> <B052> <B052> <8A0C> <B053> <B053> <8A15> <B054> <B054> <8A0A> <B055> <B055> <8A17> <B056> <B056> <8A13> <B057> <B057> <8A16> <B058> <B058> <8A0F> <B059> <B059> <8A11> <B05A> <B05A> <8C48> <B05B> <B05B> <8C7A> <B05C> <B05C> <8C79> <B05D> <B05E> <8CA1> <B05F> <B05F> <8D77> <B060> <B060> <8EAC> <B061> <B061> <8ED2> <B062> <B062> <8ED4> <B063> <B063> <8ECF> <B064> <B064> <8FB1> <B065> <B065> <9001> <B066> <B066> <9006> <B067> <B067> <8FF7> <B068> <B068> <9000> <B069> <B069> <8FFA> <B06A> <B06A> <8FF4> <B06B> <B06B> <9003> <B06C> <B06C> <8FFD> <B06D> <B06D> <9005> <B06E> <B06E> <8FF8> <B06F> <B06F> <9095> <B070> <B070> <90E1> <B071> <B071> <90DD> <B072> <B072> <90E2> <B073> <B073> <9152> <B074> <B074> <914D> <B075> <B075> <914C> <B076> <B076> <91D8> <B077> <B077> <91DD> <B078> <B078> <91D7> <B079> <B079> <91DC> <B07A> <B07A> <91D9> <B07B> <B07B> <9583> <B07C> <B07D> <9662> <B07E> <B07E> <9661> <B0A1> <B0A1> <965B> <B0A2> <B0A2> <965D> <B0A3> <B0A3> <9664> <B0A4> <B0A4> <9658> <B0A5> <B0A5> <965E> <B0A6> <B0A6> <96BB> <B0A7> <B0A7> <98E2> <B0A8> <B0A8> <99AC> <B0A9> <B0A9> <9AA8> <B0AA> <B0AA> <9AD8> <B0AB> <B0AB> <9B25> <B0AC> <B0AC> <9B32> <B0AD> <B0AD> <9B3C> <B0AE> <B0AE> <4E7E> <B0AF> <B0AF> <507A> <B0B0> <B0B0> <507D> <B0B1> <B0B1> <505C> <B0B2> <B0B2> <5047> <B0B3> <B0B3> <5043> <B0B4> <B0B4> <504C> <B0B5> <B0B5> <505A> <B0B6> <B0B6> <5049> <B0B7> <B0B7> <5065> <B0B8> <B0B8> <5076> <B0B9> <B0B9> <504E> <B0BA> <B0BA> <5055> <B0BB> <B0BB> <5075> <B0BC> <B0BC> <5074> <B0BD> <B0BD> <5077> <B0BE> <B0BE> <504F> <B0BF> <B0BF> <500F> <B0C0> <B0C0> <506F> <B0C1> <B0C1> <506D> <B0C2> <B0C2> <515C> <B0C3> <B0C3> <5195> <B0C4> <B0C4> <51F0> <B0C5> <B0C5> <526A> <B0C6> <B0C6> <526F> <B0C7> <B0C7> <52D2> <B0C8> <B0C8> <52D9> <B0C9> <B0C9> <52D8> <B0CA> <B0CA> <52D5> <B0CB> <B0CB> <5310> <B0CC> <B0CC> <530F> <B0CD> <B0CD> <5319> <B0CE> <B0CF> <533F> <B0D0> <B0D0> <533E> <B0D1> <B0D1> <53C3> <B0D2> <B0D2> <66FC> endbfrange 100 beginbfrange <B0D3> <B0D3> <5546> <B0D4> <B0D4> <556A> <B0D5> <B0D5> <5566> <B0D6> <B0D6> <5544> <B0D7> <B0D7> <555E> <B0D8> <B0D8> <5561> <B0D9> <B0D9> <5543> <B0DA> <B0DA> <554A> <B0DB> <B0DB> <5531> <B0DC> <B0DC> <5556> <B0DD> <B0DD> <554F> <B0DE> <B0DE> <5555> <B0DF> <B0DF> <552F> <B0E0> <B0E0> <5564> <B0E1> <B0E1> <5538> <B0E2> <B0E2> <552E> <B0E3> <B0E3> <555C> <B0E4> <B0E4> <552C> <B0E5> <B0E5> <5563> <B0E6> <B0E6> <5533> <B0E7> <B0E7> <5541> <B0E8> <B0E8> <5557> <B0E9> <B0E9> <5708> <B0EA> <B0EA> <570B> <B0EB> <B0EB> <5709> <B0EC> <B0EC> <57DF> <B0ED> <B0ED> <5805> <B0EE> <B0EE> <580A> <B0EF> <B0EF> <5806> <B0F0> <B0F0> <57E0> <B0F1> <B0F1> <57E4> <B0F2> <B0F2> <57FA> <B0F3> <B0F3> <5802> <B0F4> <B0F4> <5835> <B0F5> <B0F5> <57F7> <B0F6> <B0F6> <57F9> <B0F7> <B0F7> <5920> <B0F8> <B0F8> <5962> <B0F9> <B0F9> <5A36> <B0FA> <B0FA> <5A41> <B0FB> <B0FB> <5A49> <B0FC> <B0FC> <5A66> <B0FD> <B0FD> <5A6A> <B0FE> <B0FE> <5A40> <B140> <B140> <5A3C> <B141> <B141> <5A62> <B142> <B142> <5A5A> <B143> <B143> <5A46> <B144> <B144> <5A4A> <B145> <B145> <5B70> <B146> <B146> <5BC7> <B147> <B147> <5BC5> <B148> <B148> <5BC4> <B149> <B149> <5BC2> <B14A> <B14A> <5BBF> <B14B> <B14B> <5BC6> <B14C> <B14C> <5C09> <B14D> <B14D> <5C08> <B14E> <B14E> <5C07> <B14F> <B14F> <5C60> <B150> <B151> <5C5C> <B152> <B152> <5D07> <B153> <B153> <5D06> <B154> <B154> <5D0E> <B155> <B155> <5D1B> <B156> <B156> <5D16> <B157> <B157> <5D22> <B158> <B158> <5D11> <B159> <B159> <5D29> <B15A> <B15A> <5D14> <B15B> <B15B> <5D19> <B15C> <B15C> <5D24> <B15D> <B15D> <5D27> <B15E> <B15E> <5D17> <B15F> <B15F> <5DE2> <B160> <B160> <5E38> <B161> <B161> <5E36> <B162> <B162> <5E33> <B163> <B163> <5E37> <B164> <B165> <5EB7> <B166> <B166> <5EB6> <B167> <B167> <5EB5> <B168> <B168> <5EBE> <B169> <B169> <5F35> <B16A> <B16A> <5F37> <B16B> <B16B> <5F57> <B16C> <B16C> <5F6C> <B16D> <B16D> <5F69> <B16E> <B16E> <5F6B> <B16F> <B16F> <5F97> <B170> <B170> <5F99> <B171> <B171> <5F9E> <B172> <B172> <5F98> <B173> <B173> <5FA1> <B174> <B174> <5FA0> <B175> <B175> <5F9C> <B176> <B176> <607F> <B177> <B177> <60A3> <B178> <B178> <6089> <B179> <B179> <60A0> endbfrange 100 beginbfrange <B17A> <B17A> <60A8> <B17B> <B17B> <60CB> <B17C> <B17C> <60B4> <B17D> <B17D> <60E6> <B17E> <B17E> <60BD> <B1A1> <B1A1> <60C5> <B1A2> <B1A2> <60BB> <B1A3> <B1A3> <60B5> <B1A4> <B1A4> <60DC> <B1A5> <B1A5> <60BC> <B1A6> <B1A6> <60D8> <B1A7> <B1A7> <60D5> <B1A8> <B1A8> <60C6> <B1A9> <B1A9> <60DF> <B1AA> <B1AA> <60B8> <B1AB> <B1AB> <60DA> <B1AC> <B1AC> <60C7> <B1AD> <B1AE> <621A> <B1AF> <B1AF> <6248> <B1B0> <B1B0> <63A0> <B1B1> <B1B1> <63A7> <B1B2> <B1B2> <6372> <B1B3> <B1B3> <6396> <B1B4> <B1B4> <63A2> <B1B5> <B1B5> <63A5> <B1B6> <B1B6> <6377> <B1B7> <B1B7> <6367> <B1B8> <B1B8> <6398> <B1B9> <B1B9> <63AA> <B1BA> <B1BA> <6371> <B1BB> <B1BB> <63A9> <B1BC> <B1BC> <6389> <B1BD> <B1BD> <6383> <B1BE> <B1BE> <639B> <B1BF> <B1BF> <636B> <B1C0> <B1C0> <63A8> <B1C1> <B1C1> <6384> <B1C2> <B1C2> <6388> <B1C3> <B1C3> <6399> <B1C4> <B1C4> <63A1> <B1C5> <B1C5> <63AC> <B1C6> <B1C6> <6392> <B1C7> <B1C7> <638F> <B1C8> <B1C8> <6380> <B1C9> <B1C9> <637B> <B1CA> <B1CA> <6369> <B1CB> <B1CB> <6368> <B1CC> <B1CC> <637A> <B1CD> <B1CD> <655D> <B1CE> <B1CE> <6556> <B1CF> <B1CF> <6551> <B1D0> <B1D0> <6559> <B1D1> <B1D1> <6557> <B1D2> <B1D2> <555F> <B1D3> <B1D3> <654F> <B1D4> <B1D4> <6558> <B1D5> <B1D5> <6555> <B1D6> <B1D6> <6554> <B1D7> <B1D7> <659C> <B1D8> <B1D8> <659B> <B1D9> <B1D9> <65AC> <B1DA> <B1DA> <65CF> <B1DB> <B1DC> <65CB> <B1DD> <B1DD> <65CE> <B1DE> <B1DE> <665D> <B1DF> <B1DF> <665A> <B1E0> <B1E0> <6664> <B1E1> <B1E1> <6668> <B1E2> <B1E2> <6666> <B1E3> <B1E3> <665E> <B1E4> <B1E4> <66F9> <B1E5> <B1E5> <52D7> <B1E6> <B1E6> <671B> <B1E7> <B1E7> <6881> <B1E8> <B1E8> <68AF> <B1E9> <B1E9> <68A2> <B1EA> <B1EA> <6893> <B1EB> <B1EB> <68B5> <B1EC> <B1EC> <687F> <B1ED> <B1ED> <6876> <B1EE> <B1EE> <68B1> <B1EF> <B1EF> <68A7> <B1F0> <B1F0> <6897> <B1F1> <B1F1> <68B0> <B1F2> <B1F2> <6883> <B1F3> <B1F3> <68C4> <B1F4> <B1F4> <68AD> <B1F5> <B1F5> <6886> <B1F6> <B1F6> <6885> <B1F7> <B1F7> <6894> <B1F8> <B1F8> <689D> <B1F9> <B1F9> <68A8> <B1FA> <B1FA> <689F> <B1FB> <B1FB> <68A1> <B1FC> <B1FC> <6882> <B1FD> <B1FD> <6B32> <B1FE> <B1FE> <6BBA> <B240> <B241> <6BEB> <B242> <B242> <6C2B> <B243> <B243> <6D8E> endbfrange 100 beginbfrange <B244> <B244> <6DBC> <B245> <B245> <6DF3> <B246> <B246> <6DD9> <B247> <B247> <6DB2> <B248> <B248> <6DE1> <B249> <B249> <6DCC> <B24A> <B24A> <6DE4> <B24B> <B24B> <6DFB> <B24C> <B24C> <6DFA> <B24D> <B24D> <6E05> <B24E> <B24E> <6DC7> <B24F> <B24F> <6DCB> <B250> <B250> <6DAF> <B251> <B251> <6DD1> <B252> <B252> <6DAE> <B253> <B253> <6DDE> <B254> <B254> <6DF9> <B255> <B255> <6DB8> <B256> <B256> <6DF7> <B257> <B257> <6DF5> <B258> <B258> <6DC5> <B259> <B259> <6DD2> <B25A> <B25A> <6E1A> <B25B> <B25B> <6DB5> <B25C> <B25C> <6DDA> <B25D> <B25D> <6DEB> <B25E> <B25E> <6DD8> <B25F> <B25F> <6DEA> <B260> <B260> <6DF1> <B261> <B261> <6DEE> <B262> <B262> <6DE8> <B263> <B263> <6DC6> <B264> <B264> <6DC4> <B265> <B265> <6DAA> <B266> <B266> <6DEC> <B267> <B267> <6DBF> <B268> <B268> <6DE6> <B269> <B269> <70F9> <B26A> <B26B> <7109> <B26C> <B26C> <70FD> <B26D> <B26D> <70EF> <B26E> <B26E> <723D> <B26F> <B26F> <727D> <B270> <B270> <7281> <B271> <B271> <731C> <B272> <B272> <731B> <B273> <B273> <7316> <B274> <B274> <7313> <B275> <B275> <7319> <B276> <B276> <7387> <B277> <B277> <7405> <B278> <B278> <740A> <B279> <B279> <7403> <B27A> <B27A> <7406> <B27B> <B27B> <73FE> <B27C> <B27C> <740D> <B27D> <B27D> <74E0> <B27E> <B27E> <74F6> <B2A1> <B2A1> <74F7> <B2A2> <B2A2> <751C> <B2A3> <B2A3> <7522> <B2A4> <B2A5> <7565> <B2A6> <B2A6> <7562> <B2A7> <B2A7> <7570> <B2A8> <B2A8> <758F> <B2A9> <B2AA> <75D4> <B2AB> <B2AB> <75B5> <B2AC> <B2AC> <75CA> <B2AD> <B2AD> <75CD> <B2AE> <B2AE> <768E> <B2AF> <B2AF> <76D4> <B2B0> <B2B0> <76D2> <B2B1> <B2B1> <76DB> <B2B2> <B2B2> <7737> <B2B3> <B2B3> <773E> <B2B4> <B2B4> <773C> <B2B5> <B2B5> <7736> <B2B6> <B2B6> <7738> <B2B7> <B2B7> <773A> <B2B8> <B2B8> <786B> <B2B9> <B2B9> <7843> <B2BA> <B2BA> <784E> <B2BB> <B2BB> <7965> <B2BC> <B2BC> <7968> <B2BD> <B2BD> <796D> <B2BE> <B2BE> <79FB> <B2BF> <B2BF> <7A92> <B2C0> <B2C0> <7A95> <B2C1> <B2C1> <7B20> <B2C2> <B2C2> <7B28> <B2C3> <B2C3> <7B1B> <B2C4> <B2C4> <7B2C> <B2C5> <B2C5> <7B26> <B2C6> <B2C6> <7B19> <B2C7> <B2C7> <7B1E> <B2C8> <B2C8> <7B2E> <B2C9> <B2C9> <7C92> <B2CA> <B2CA> <7C97> <B2CB> <B2CB> <7C95> <B2CC> <B2CC> <7D46> endbfrange 100 beginbfrange <B2CD> <B2CD> <7D43> <B2CE> <B2CE> <7D71> <B2CF> <B2CF> <7D2E> <B2D0> <B2D0> <7D39> <B2D1> <B2D1> <7D3C> <B2D2> <B2D2> <7D40> <B2D3> <B2D3> <7D30> <B2D4> <B2D4> <7D33> <B2D5> <B2D5> <7D44> <B2D6> <B2D6> <7D2F> <B2D7> <B2D7> <7D42> <B2D8> <B2D8> <7D32> <B2D9> <B2D9> <7D31> <B2DA> <B2DA> <7F3D> <B2DB> <B2DB> <7F9E> <B2DC> <B2DC> <7F9A> <B2DD> <B2DD> <7FCC> <B2DE> <B2DE> <7FCE> <B2DF> <B2DF> <7FD2> <B2E0> <B2E0> <801C> <B2E1> <B2E1> <804A> <B2E2> <B2E2> <8046> <B2E3> <B2E3> <812F> <B2E4> <B2E4> <8116> <B2E5> <B2E5> <8123> <B2E6> <B2E6> <812B> <B2E7> <B2E7> <8129> <B2E8> <B2E8> <8130> <B2E9> <B2E9> <8124> <B2EA> <B2EA> <8202> <B2EB> <B2EB> <8235> <B2EC> <B2EC> <8237> <B2ED> <B2ED> <8236> <B2EE> <B2EE> <8239> <B2EF> <B2EF> <838E> <B2F0> <B2F0> <839E> <B2F1> <B2F1> <8398> <B2F2> <B2F2> <8378> <B2F3> <B2F3> <83A2> <B2F4> <B2F4> <8396> <B2F5> <B2F5> <83BD> <B2F6> <B2F6> <83AB> <B2F7> <B2F7> <8392> <B2F8> <B2F8> <838A> <B2F9> <B2F9> <8393> <B2FA> <B2FA> <8389> <B2FB> <B2FB> <83A0> <B2FC> <B2FC> <8377> <B2FD> <B2FE> <837B> <B340> <B340> <8386> <B341> <B341> <83A7> <B342> <B342> <8655> <B343> <B343> <5F6A> <B344> <B344> <86C7> <B345> <B345> <86C0> <B346> <B346> <86B6> <B347> <B347> <86C4> <B348> <B348> <86B5> <B349> <B349> <86C6> <B34A> <B34A> <86CB> <B34B> <B34B> <86B1> <B34C> <B34C> <86AF> <B34D> <B34D> <86C9> <B34E> <B34E> <8853> <B34F> <B34F> <889E> <B350> <B350> <8888> <B351> <B351> <88AB> <B352> <B352> <8892> <B353> <B353> <8896> <B354> <B354> <888D> <B355> <B355> <888B> <B356> <B356> <8993> <B357> <B357> <898F> <B358> <B358> <8A2A> <B359> <B359> <8A1D> <B35A> <B35A> <8A23> <B35B> <B35B> <8A25> <B35C> <B35C> <8A31> <B35D> <B35D> <8A2D> <B35E> <B35E> <8A1F> <B35F> <B35F> <8A1B> <B360> <B360> <8A22> <B361> <B361> <8C49> <B362> <B362> <8C5A> <B363> <B363> <8CA9> <B364> <B364> <8CAC> <B365> <B365> <8CAB> <B366> <B366> <8CA8> <B367> <B367> <8CAA> <B368> <B368> <8CA7> <B369> <B369> <8D67> <B36A> <B36A> <8D66> <B36B> <B36B> <8DBE> <B36C> <B36C> <8DBA> <B36D> <B36D> <8EDB> <B36E> <B36E> <8EDF> <B36F> <B36F> <9019> <B370> <B370> <900D> <B371> <B371> <901A> <B372> <B372> <9017> endbfrange 100 beginbfrange <B373> <B373> <9023> <B374> <B374> <901F> <B375> <B375> <901D> <B376> <B376> <9010> <B377> <B377> <9015> <B378> <B378> <901E> <B379> <B379> <9020> <B37A> <B37A> <900F> <B37B> <B37B> <9022> <B37C> <B37C> <9016> <B37D> <B37D> <901B> <B37E> <B37E> <9014> <B3A1> <B3A1> <90E8> <B3A2> <B3A2> <90ED> <B3A3> <B3A3> <90FD> <B3A4> <B3A4> <9157> <B3A5> <B3A5> <91CE> <B3A6> <B3A6> <91F5> <B3A7> <B3A7> <91E6> <B3A8> <B3A8> <91E3> <B3A9> <B3A9> <91E7> <B3AA> <B3AA> <91ED> <B3AB> <B3AB> <91E9> <B3AC> <B3AC> <9589> <B3AD> <B3AD> <966A> <B3AE> <B3AE> <9675> <B3AF> <B3AF> <9673> <B3B0> <B3B0> <9678> <B3B1> <B3B1> <9670> <B3B2> <B3B2> <9674> <B3B3> <B3B4> <9676> <B3B5> <B3B5> <966C> <B3B6> <B3B6> <96C0> <B3B7> <B3B7> <96EA> <B3B8> <B3B8> <96E9> <B3B9> <B3B9> <7AE0> <B3BA> <B3BA> <7ADF> <B3BB> <B3BC> <9802> <B3BD> <B3BD> <9B5A> <B3BE> <B3BE> <9CE5> <B3BF> <B3BF> <9E75> <B3C0> <B3C0> <9E7F> <B3C1> <B3C1> <9EA5> <B3C2> <B3C2> <9EBB> <B3C3> <B3C3> <50A2> <B3C4> <B3C4> <508D> <B3C5> <B3C5> <5085> <B3C6> <B3C6> <5099> <B3C7> <B3C7> <5091> <B3C8> <B3C8> <5080> <B3C9> <B3C9> <5096> <B3CA> <B3CA> <5098> <B3CB> <B3CB> <509A> <B3CC> <B3CC> <6700> <B3CD> <B3CD> <51F1> <B3CE> <B3CE> <5272> <B3CF> <B3D0> <5274> <B3D1> <B3D1> <5269> <B3D2> <B3D2> <52DE> <B3D3> <B3D3> <52DD> <B3D4> <B3D4> <52DB> <B3D5> <B3D5> <535A> <B3D6> <B3D6> <53A5> <B3D7> <B3D7> <557B> <B3D8> <B3D8> <5580> <B3D9> <B3D9> <55A7> <B3DA> <B3DA> <557C> <B3DB> <B3DB> <558A> <B3DC> <B3DC> <559D> <B3DD> <B3DD> <5598> <B3DE> <B3DE> <5582> <B3DF> <B3DF> <559C> <B3E0> <B3E0> <55AA> <B3E1> <B3E1> <5594> <B3E2> <B3E2> <5587> <B3E3> <B3E3> <558B> <B3E4> <B3E4> <5583> <B3E5> <B3E5> <55B3> <B3E6> <B3E6> <55AE> <B3E7> <B3E7> <559F> <B3E8> <B3E8> <553E> <B3E9> <B3E9> <55B2> <B3EA> <B3EA> <559A> <B3EB> <B3EB> <55BB> <B3EC> <B3EC> <55AC> <B3ED> <B3ED> <55B1> <B3EE> <B3EE> <557E> <B3EF> <B3EF> <5589> <B3F0> <B3F0> <55AB> <B3F1> <B3F1> <5599> <B3F2> <B3F2> <570D> <B3F3> <B3F3> <582F> <B3F4> <B3F4> <582A> <B3F5> <B3F5> <5834> <B3F6> <B3F6> <5824> <B3F7> <B3F8> <5830> <B3F9> <B3F9> <5821> <B3FA> <B3FA> <581D> <B3FB> <B3FB> <5820> <B3FC> <B3FD> <58F9> endbfrange 100 beginbfrange <B3FE> <B3FE> <5960> <B440> <B440> <5A77> <B441> <B441> <5A9A> <B442> <B442> <5A7F> <B443> <B443> <5A92> <B444> <B444> <5A9B> <B445> <B445> <5AA7> <B446> <B446> <5B73> <B447> <B447> <5B71> <B448> <B448> <5BD2> <B449> <B449> <5BCC> <B44A> <B44A> <5BD3> <B44B> <B44B> <5BD0> <B44C> <B44D> <5C0A> <B44E> <B44E> <5C31> <B44F> <B44F> <5D4C> <B450> <B450> <5D50> <B451> <B451> <5D34> <B452> <B452> <5D47> <B453> <B453> <5DFD> <B454> <B454> <5E45> <B455> <B455> <5E3D> <B456> <B456> <5E40> <B457> <B457> <5E43> <B458> <B458> <5E7E> <B459> <B459> <5ECA> <B45A> <B45B> <5EC1> <B45C> <B45C> <5EC4> <B45D> <B45D> <5F3C> <B45E> <B45E> <5F6D> <B45F> <B460> <5FA9> <B461> <B461> <5FA8> <B462> <B462> <60D1> <B463> <B463> <60E1> <B464> <B464> <60B2> <B465> <B465> <60B6> <B466> <B466> <60E0> <B467> <B467> <611C> <B468> <B468> <6123> <B469> <B469> <60FA> <B46A> <B46A> <6115> <B46B> <B46B> <60F0> <B46C> <B46C> <60FB> <B46D> <B46D> <60F4> <B46E> <B46E> <6168> <B46F> <B46F> <60F1> <B470> <B470> <610E> <B471> <B471> <60F6> <B472> <B472> <6109> <B473> <B473> <6100> <B474> <B474> <6112> <B475> <B475> <621F> <B476> <B476> <6249> <B477> <B477> <63A3> <B478> <B478> <638C> <B479> <B479> <63CF> <B47A> <B47A> <63C0> <B47B> <B47B> <63E9> <B47C> <B47C> <63C9> <B47D> <B47D> <63C6> <B47E> <B47E> <63CD> <B4A1> <B4A1> <63D2> <B4A2> <B4A2> <63E3> <B4A3> <B4A3> <63D0> <B4A4> <B4A4> <63E1> <B4A5> <B4A5> <63D6> <B4A6> <B4A7> <63ED> <B4A8> <B4A8> <6376> <B4A9> <B4A9> <63F4> <B4AA> <B4AA> <63EA> <B4AB> <B4AB> <63DB> <B4AC> <B4AC> <6452> <B4AD> <B4AD> <63DA> <B4AE> <B4AE> <63F9> <B4AF> <B4AF> <655E> <B4B0> <B4B0> <6566> <B4B1> <B4B2> <6562> <B4B3> <B4B3> <6591> <B4B4> <B4B4> <6590> <B4B5> <B4B5> <65AF> <B4B6> <B4B6> <666E> <B4B7> <B4B7> <6670> <B4B8> <B4B8> <6674> <B4B9> <B4B9> <6676> <B4BA> <B4BA> <666F> <B4BB> <B4BB> <6691> <B4BC> <B4BC> <667A> <B4BD> <B4BD> <667E> <B4BE> <B4BE> <6677> <B4BF> <B4C0> <66FE> <B4C1> <B4C1> <671F> <B4C2> <B4C2> <671D> <B4C3> <B4C3> <68FA> <B4C4> <B4C4> <68D5> <B4C5> <B4C5> <68E0> <B4C6> <B4C6> <68D8> <B4C7> <B4C7> <68D7> <B4C8> <B4C8> <6905> <B4C9> <B4C9> <68DF> <B4CA> <B4CA> <68F5> endbfrange 100 beginbfrange <B4CB> <B4CB> <68EE> <B4CC> <B4CC> <68E7> <B4CD> <B4CD> <68F9> <B4CE> <B4CE> <68D2> <B4CF> <B4CF> <68F2> <B4D0> <B4D0> <68E3> <B4D1> <B4D1> <68CB> <B4D2> <B4D2> <68CD> <B4D3> <B4D3> <690D> <B4D4> <B4D4> <6912> <B4D5> <B4D5> <690E> <B4D6> <B4D6> <68C9> <B4D7> <B4D7> <68DA> <B4D8> <B4D8> <696E> <B4D9> <B4D9> <68FB> <B4DA> <B4DA> <6B3E> <B4DB> <B4DB> <6B3A> <B4DC> <B4DC> <6B3D> <B4DD> <B4DD> <6B98> <B4DE> <B4DE> <6B96> <B4DF> <B4DF> <6BBC> <B4E0> <B4E0> <6BEF> <B4E1> <B4E2> <6C2E> <B4E3> <B4E3> <6C2C> <B4E4> <B4E4> <6E2F> <B4E5> <B4E5> <6E38> <B4E6> <B4E6> <6E54> <B4E7> <B4E7> <6E21> <B4E8> <B4E8> <6E32> <B4E9> <B4E9> <6E67> <B4EA> <B4EA> <6E4A> <B4EB> <B4EB> <6E20> <B4EC> <B4EC> <6E25> <B4ED> <B4ED> <6E23> <B4EE> <B4EE> <6E1B> <B4EF> <B4EF> <6E5B> <B4F0> <B4F0> <6E58> <B4F1> <B4F1> <6E24> <B4F2> <B4F2> <6E56> <B4F3> <B4F3> <6E6E> <B4F4> <B4F4> <6E2D> <B4F5> <B4F5> <6E26> <B4F6> <B4F6> <6E6F> <B4F7> <B4F7> <6E34> <B4F8> <B4F8> <6E4D> <B4F9> <B4F9> <6E3A> <B4FA> <B4FA> <6E2C> <B4FB> <B4FB> <6E43> <B4FC> <B4FC> <6E1D> <B4FD> <B4FD> <6E3E> <B4FE> <B4FE> <6ECB> <B540> <B540> <6E89> <B541> <B541> <6E19> <B542> <B542> <6E4E> <B543> <B543> <6E63> <B544> <B544> <6E44> <B545> <B545> <6E72> <B546> <B546> <6E69> <B547> <B547> <6E5F> <B548> <B549> <7119> <B54A> <B54A> <7126> <B54B> <B54B> <7130> <B54C> <B54C> <7121> <B54D> <B54D> <7136> <B54E> <B54E> <716E> <B54F> <B54F> <711C> <B550> <B550> <724C> <B551> <B551> <7284> <B552> <B552> <7280> <B553> <B553> <7336> <B554> <B554> <7325> <B555> <B555> <7334> <B556> <B556> <7329> <B557> <B557> <743A> <B558> <B558> <742A> <B559> <B559> <7433> <B55A> <B55A> <7422> <B55B> <B55B> <7425> <B55C> <B55D> <7435> <B55E> <B55E> <7434> <B55F> <B55F> <742F> <B560> <B560> <741B> <B561> <B561> <7426> <B562> <B562> <7428> <B563> <B564> <7525> <B565> <B565> <756B> <B566> <B566> <756A> <B567> <B567> <75E2> <B568> <B568> <75DB> <B569> <B569> <75E3> <B56A> <B56A> <75D9> <B56B> <B56B> <75D8> <B56C> <B56C> <75DE> <B56D> <B56D> <75E0> <B56E> <B56F> <767B> <B570> <B570> <7696> <B571> <B571> <7693> <B572> <B572> <76B4> <B573> <B573> <76DC> <B574> <B574> <774F> endbfrange 100 beginbfrange <B575> <B575> <77ED> <B576> <B576> <785D> <B577> <B577> <786C> <B578> <B578> <786F> <B579> <B579> <7A0D> <B57A> <B57A> <7A08> <B57B> <B57B> <7A0B> <B57C> <B57C> <7A05> <B57D> <B57D> <7A00> <B57E> <B57E> <7A98> <B5A1> <B5A1> <7A97> <B5A2> <B5A2> <7A96> <B5A3> <B5A3> <7AE5> <B5A4> <B5A4> <7AE3> <B5A5> <B5A5> <7B49> <B5A6> <B5A6> <7B56> <B5A7> <B5A7> <7B46> <B5A8> <B5A8> <7B50> <B5A9> <B5A9> <7B52> <B5AA> <B5AA> <7B54> <B5AB> <B5AB> <7B4D> <B5AC> <B5AC> <7B4B> <B5AD> <B5AD> <7B4F> <B5AE> <B5AE> <7B51> <B5AF> <B5AF> <7C9F> <B5B0> <B5B0> <7CA5> <B5B1> <B5B1> <7D5E> <B5B2> <B5B2> <7D50> <B5B3> <B5B3> <7D68> <B5B4> <B5B4> <7D55> <B5B5> <B5B5> <7D2B> <B5B6> <B5B6> <7D6E> <B5B7> <B5B7> <7D72> <B5B8> <B5B8> <7D61> <B5B9> <B5B9> <7D66> <B5BA> <B5BA> <7D62> <B5BB> <B5BB> <7D70> <B5BC> <B5BC> <7D73> <B5BD> <B5BD> <5584> <B5BE> <B5BF> <7FD4> <B5C0> <B5C0> <800B> <B5C1> <B5C1> <8052> <B5C2> <B5C2> <8085> <B5C3> <B5C3> <8155> <B5C4> <B5C4> <8154> <B5C5> <B5C5> <814B> <B5C6> <B5C6> <8151> <B5C7> <B5C7> <814E> <B5C8> <B5C8> <8139> <B5C9> <B5C9> <8146> <B5CA> <B5CA> <813E> <B5CB> <B5CB> <814C> <B5CC> <B5CC> <8153> <B5CD> <B5CD> <8174> <B5CE> <B5CE> <8212> <B5CF> <B5CF> <821C> <B5D0> <B5D0> <83E9> <B5D1> <B5D1> <8403> <B5D2> <B5D2> <83F8> <B5D3> <B5D3> <840D> <B5D4> <B5D4> <83E0> <B5D5> <B5D5> <83C5> <B5D6> <B5D6> <840B> <B5D7> <B5D7> <83C1> <B5D8> <B5D8> <83EF> <B5D9> <B5D9> <83F1> <B5DA> <B5DA> <83F4> <B5DB> <B5DB> <8457> <B5DC> <B5DC> <840A> <B5DD> <B5DD> <83F0> <B5DE> <B5DE> <840C> <B5DF> <B5DF> <83CC> <B5E0> <B5E0> <83FD> <B5E1> <B5E1> <83F2> <B5E2> <B5E2> <83CA> <B5E3> <B5E3> <8438> <B5E4> <B5E4> <840E> <B5E5> <B5E5> <8404> <B5E6> <B5E6> <83DC> <B5E7> <B5E7> <8407> <B5E8> <B5E8> <83D4> <B5E9> <B5E9> <83DF> <B5EA> <B5EA> <865B> <B5EB> <B5EB> <86DF> <B5EC> <B5EC> <86D9> <B5ED> <B5ED> <86ED> <B5EE> <B5EE> <86D4> <B5EF> <B5EF> <86DB> <B5F0> <B5F0> <86E4> <B5F1> <B5F1> <86D0> <B5F2> <B5F2> <86DE> <B5F3> <B5F3> <8857> <B5F4> <B5F5> <88C1> <B5F6> <B5F6> <88B1> <B5F7> <B5F7> <8983> <B5F8> <B5F8> <8996> <B5F9> <B5F9> <8A3B> <B5FA> <B5FA> <8A60> <B5FB> <B5FB> <8A55> <B5FC> <B5FC> <8A5E> endbfrange 100 beginbfrange <B5FD> <B5FD> <8A3C> <B5FE> <B5FE> <8A41> <B640> <B640> <8A54> <B641> <B641> <8A5B> <B642> <B642> <8A50> <B643> <B643> <8A46> <B644> <B644> <8A34> <B645> <B645> <8A3A> <B646> <B646> <8A36> <B647> <B647> <8A56> <B648> <B648> <8C61> <B649> <B649> <8C82> <B64A> <B64A> <8CAF> <B64B> <B64B> <8CBC> <B64C> <B64C> <8CB3> <B64D> <B64D> <8CBD> <B64E> <B64E> <8CC1> <B64F> <B64F> <8CBB> <B650> <B650> <8CC0> <B651> <B651> <8CB4> <B652> <B652> <8CB7> <B653> <B653> <8CB6> <B654> <B654> <8CBF> <B655> <B655> <8CB8> <B656> <B656> <8D8A> <B657> <B657> <8D85> <B658> <B658> <8D81> <B659> <B659> <8DCE> <B65A> <B65A> <8DDD> <B65B> <B65B> <8DCB> <B65C> <B65C> <8DDA> <B65D> <B65D> <8DD1> <B65E> <B65E> <8DCC> <B65F> <B65F> <8DDB> <B660> <B660> <8DC6> <B661> <B661> <8EFB> <B662> <B662> <8EF8> <B663> <B663> <8EFC> <B664> <B664> <8F9C> <B665> <B665> <902E> <B666> <B666> <9035> <B667> <B667> <9031> <B668> <B668> <9038> <B669> <B669> <9032> <B66A> <B66A> <9036> <B66B> <B66B> <9102> <B66C> <B66C> <90F5> <B66D> <B66D> <9109> <B66E> <B66E> <90FE> <B66F> <B66F> <9163> <B670> <B670> <9165> <B671> <B671> <91CF> <B672> <B673> <9214> <B674> <B674> <9223> <B675> <B675> <9209> <B676> <B676> <921E> <B677> <B677> <920D> <B678> <B678> <9210> <B679> <B679> <9207> <B67A> <B67A> <9211> <B67B> <B67B> <9594> <B67C> <B67C> <958F> <B67D> <B67D> <958B> <B67E> <B67E> <9591> <B6A1> <B6A1> <9593> <B6A2> <B6A2> <9592> <B6A3> <B6A3> <958E> <B6A4> <B6A4> <968A> <B6A5> <B6A5> <968E> <B6A6> <B6A6> <968B> <B6A7> <B6A7> <967D> <B6A8> <B6A9> <9685> <B6AA> <B6AA> <968D> <B6AB> <B6AB> <9672> <B6AC> <B6AC> <9684> <B6AD> <B6AD> <96C1> <B6AE> <B6AE> <96C5> <B6AF> <B6AF> <96C4> <B6B0> <B6B1> <96C6> <B6B2> <B6B2> <96EF> <B6B3> <B6B3> <96F2> <B6B4> <B6B4> <97CC> <B6B5> <B6B6> <9805> <B6B7> <B6B7> <9808> <B6B8> <B6B8> <98E7> <B6B9> <B6B9> <98EA> <B6BA> <B6BA> <98EF> <B6BB> <B6BB> <98E9> <B6BC> <B6BC> <98F2> <B6BD> <B6BD> <98ED> <B6BE> <B6BE> <99AE> <B6BF> <B6BF> <99AD> <B6C0> <B6C0> <9EC3> <B6C1> <B6C1> <9ECD> <B6C2> <B6C2> <9ED1> <B6C3> <B6C3> <4E82> <B6C4> <B6C4> <50AD> <B6C5> <B6C5> <50B5> <B6C6> <B6C7> <50B2> <B6C8> <B6C8> <50C5> endbfrange 100 beginbfrange <B6C9> <B6C9> <50BE> <B6CA> <B6CA> <50AC> <B6CB> <B6CB> <50B7> <B6CC> <B6CC> <50BB> <B6CD> <B6CD> <50AF> <B6CE> <B6CE> <50C7> <B6CF> <B6CF> <527F> <B6D0> <B6D0> <5277> <B6D1> <B6D1> <527D> <B6D2> <B6D2> <52DF> <B6D3> <B6D3> <52E6> <B6D4> <B6D4> <52E4> <B6D5> <B6D6> <52E2> <B6D7> <B6D7> <532F> <B6D8> <B6D8> <55DF> <B6D9> <B6D9> <55E8> <B6DA> <B6DA> <55D3> <B6DB> <B6DB> <55E6> <B6DC> <B6DC> <55CE> <B6DD> <B6DD> <55DC> <B6DE> <B6DE> <55C7> <B6DF> <B6DF> <55D1> <B6E0> <B6E1> <55E3> <B6E2> <B6E2> <55EF> <B6E3> <B6E3> <55DA> <B6E4> <B6E4> <55E1> <B6E5> <B6E6> <55C5> <B6E7> <B6E7> <55E5> <B6E8> <B6E8> <55C9> <B6E9> <B6EA> <5712> <B6EB> <B6EB> <585E> <B6EC> <B6EC> <5851> <B6ED> <B6ED> <5858> <B6EE> <B6EE> <5857> <B6EF> <B6EF> <585A> <B6F0> <B6F0> <5854> <B6F1> <B6F1> <586B> <B6F2> <B6F2> <584C> <B6F3> <B6F3> <586D> <B6F4> <B6F4> <584A> <B6F5> <B6F5> <5862> <B6F6> <B6F6> <5852> <B6F7> <B6F7> <584B> <B6F8> <B6F8> <5967> <B6F9> <B6F9> <5AC1> <B6FA> <B6FA> <5AC9> <B6FB> <B6FB> <5ACC> <B6FC> <B6FC> <5ABE> <B6FD> <B6FD> <5ABD> <B6FE> <B6FE> <5ABC> <B740> <B740> <5AB3> <B741> <B741> <5AC2> <B742> <B742> <5AB2> <B743> <B743> <5D69> <B744> <B744> <5D6F> <B745> <B745> <5E4C> <B746> <B746> <5E79> <B747> <B747> <5EC9> <B748> <B748> <5EC8> <B749> <B749> <5F12> <B74A> <B74A> <5F59> <B74B> <B74B> <5FAC> <B74C> <B74C> <5FAE> <B74D> <B74D> <611A> <B74E> <B74E> <610F> <B74F> <B74F> <6148> <B750> <B750> <611F> <B751> <B751> <60F3> <B752> <B752> <611B> <B753> <B753> <60F9> <B754> <B754> <6101> <B755> <B755> <6108> <B756> <B756> <614E> <B757> <B757> <614C> <B758> <B758> <6144> <B759> <B759> <614D> <B75A> <B75A> <613E> <B75B> <B75B> <6134> <B75C> <B75C> <6127> <B75D> <B75D> <610D> <B75E> <B75E> <6106> <B75F> <B75F> <6137> <B760> <B761> <6221> <B762> <B762> <6413> <B763> <B763> <643E> <B764> <B764> <641E> <B765> <B765> <642A> <B766> <B766> <642D> <B767> <B767> <643D> <B768> <B768> <642C> <B769> <B769> <640F> <B76A> <B76A> <641C> <B76B> <B76B> <6414> <B76C> <B76C> <640D> <B76D> <B76D> <6436> <B76E> <B76F> <6416> <B770> <B770> <6406> <B771> <B771> <656C> <B772> <B772> <659F> <B773> <B773> <65B0> endbfrange 100 beginbfrange <B774> <B774> <6697> <B775> <B775> <6689> <B776> <B777> <6687> <B778> <B778> <6696> <B779> <B779> <6684> <B77A> <B77A> <6698> <B77B> <B77B> <668D> <B77C> <B77C> <6703> <B77D> <B77D> <6994> <B77E> <B77E> <696D> <B7A1> <B7A1> <695A> <B7A2> <B7A2> <6977> <B7A3> <B7A3> <6960> <B7A4> <B7A4> <6954> <B7A5> <B7A5> <6975> <B7A6> <B7A6> <6930> <B7A7> <B7A7> <6982> <B7A8> <B7A8> <694A> <B7A9> <B7A9> <6968> <B7AA> <B7AA> <696B> <B7AB> <B7AB> <695E> <B7AC> <B7AC> <6953> <B7AD> <B7AD> <6979> <B7AE> <B7AE> <6986> <B7AF> <B7AF> <695D> <B7B0> <B7B0> <6963> <B7B1> <B7B1> <695B> <B7B2> <B7B2> <6B47> <B7B3> <B7B3> <6B72> <B7B4> <B7B4> <6BC0> <B7B5> <B7B5> <6BBF> <B7B6> <B7B6> <6BD3> <B7B7> <B7B7> <6BFD> <B7B8> <B7B8> <6EA2> <B7B9> <B7B9> <6EAF> <B7BA> <B7BA> <6ED3> <B7BB> <B7BB> <6EB6> <B7BC> <B7BC> <6EC2> <B7BD> <B7BD> <6E90> <B7BE> <B7BE> <6E9D> <B7BF> <B7BF> <6EC7> <B7C0> <B7C0> <6EC5> <B7C1> <B7C1> <6EA5> <B7C2> <B7C2> <6E98> <B7C3> <B7C3> <6EBC> <B7C4> <B7C4> <6EBA> <B7C5> <B7C5> <6EAB> <B7C6> <B7C6> <6ED1> <B7C7> <B7C7> <6E96> <B7C8> <B7C8> <6E9C> <B7C9> <B7C9> <6EC4> <B7CA> <B7CA> <6ED4> <B7CB> <B7CB> <6EAA> <B7CC> <B7CC> <6EA7> <B7CD> <B7CD> <6EB4> <B7CE> <B7CE> <714E> <B7CF> <B7CF> <7159> <B7D0> <B7D0> <7169> <B7D1> <B7D1> <7164> <B7D2> <B7D2> <7149> <B7D3> <B7D3> <7167> <B7D4> <B7D4> <715C> <B7D5> <B7D5> <716C> <B7D6> <B7D6> <7166> <B7D7> <B7D7> <714C> <B7D8> <B7D8> <7165> <B7D9> <B7D9> <715E> <B7DA> <B7DA> <7146> <B7DB> <B7DB> <7168> <B7DC> <B7DC> <7156> <B7DD> <B7DD> <723A> <B7DE> <B7DE> <7252> <B7DF> <B7DF> <7337> <B7E0> <B7E0> <7345> <B7E1> <B7E1> <733F> <B7E2> <B7E2> <733E> <B7E3> <B7E3> <746F> <B7E4> <B7E4> <745A> <B7E5> <B7E5> <7455> <B7E6> <B7E6> <745F> <B7E7> <B7E7> <745E> <B7E8> <B7E8> <7441> <B7E9> <B7E9> <743F> <B7EA> <B7EA> <7459> <B7EB> <B7EC> <745B> <B7ED> <B7ED> <7576> <B7EE> <B7EE> <7578> <B7EF> <B7EF> <7600> <B7F0> <B7F0> <75F0> <B7F1> <B7F1> <7601> <B7F2> <B7F2> <75F2> <B7F3> <B7F3> <75F1> <B7F4> <B7F4> <75FA> <B7F5> <B7F5> <75FF> <B7F6> <B7F6> <75F4> <B7F7> <B7F7> <75F3> <B7F8> <B7F9> <76DE> <B7FA> <B7FA> <775B> <B7FB> <B7FB> <776B> <B7FC> <B7FC> <7766> endbfrange 100 beginbfrange <B7FD> <B7FD> <775E> <B7FE> <B7FE> <7763> <B840> <B840> <7779> <B841> <B841> <776A> <B842> <B842> <776C> <B843> <B843> <775C> <B844> <B844> <7765> <B845> <B845> <7768> <B846> <B846> <7762> <B847> <B847> <77EE> <B848> <B848> <788E> <B849> <B849> <78B0> <B84A> <B84B> <7897> <B84C> <B84C> <788C> <B84D> <B84D> <7889> <B84E> <B84E> <787C> <B84F> <B84F> <7891> <B850> <B850> <7893> <B851> <B851> <787F> <B852> <B852> <797A> <B853> <B853> <797F> <B854> <B854> <7981> <B855> <B855> <842C> <B856> <B856> <79BD> <B857> <B857> <7A1C> <B858> <B858> <7A1A> <B859> <B859> <7A20> <B85A> <B85A> <7A14> <B85B> <B85B> <7A1F> <B85C> <B85C> <7A1E> <B85D> <B85E> <7A9F> <B85F> <B85F> <7B77> <B860> <B860> <7BC0> <B861> <B861> <7B60> <B862> <B862> <7B6E> <B863> <B863> <7B67> <B864> <B864> <7CB1> <B865> <B865> <7CB3> <B866> <B866> <7CB5> <B867> <B867> <7D93> <B868> <B868> <7D79> <B869> <B869> <7D91> <B86A> <B86A> <7D81> <B86B> <B86B> <7D8F> <B86C> <B86C> <7D5B> <B86D> <B86D> <7F6E> <B86E> <B86F> <7F69> <B870> <B870> <7F72> <B871> <B871> <7FA9> <B872> <B872> <7FA8> <B873> <B873> <7FA4> <B874> <B874> <8056> <B875> <B875> <8058> <B876> <B876> <8086> <B877> <B877> <8084> <B878> <B878> <8171> <B879> <B879> <8170> <B87A> <B87A> <8178> <B87B> <B87B> <8165> <B87C> <B87C> <816E> <B87D> <B87D> <8173> <B87E> <B87E> <816B> <B8A1> <B8A2> <8179> <B8A3> <B8A3> <8166> <B8A4> <B8A4> <8205> <B8A5> <B8A5> <8247> <B8A6> <B8A6> <8482> <B8A7> <B8A7> <8477> <B8A8> <B8A8> <843D> <B8A9> <B8A9> <8431> <B8AA> <B8AA> <8475> <B8AB> <B8AB> <8466> <B8AC> <B8AC> <846B> <B8AD> <B8AD> <8449> <B8AE> <B8AE> <846C> <B8AF> <B8AF> <845B> <B8B0> <B8B0> <843C> <B8B1> <B8B1> <8435> <B8B2> <B8B2> <8461> <B8B3> <B8B3> <8463> <B8B4> <B8B4> <8469> <B8B5> <B8B5> <846D> <B8B6> <B8B6> <8446> <B8B7> <B8B7> <865E> <B8B8> <B8B8> <865C> <B8B9> <B8B9> <865F> <B8BA> <B8BA> <86F9> <B8BB> <B8BB> <8713> <B8BC> <B8BC> <8708> <B8BD> <B8BD> <8707> <B8BE> <B8BE> <8700> <B8BF> <B8BF> <86FE> <B8C0> <B8C0> <86FB> <B8C1> <B8C2> <8702> <B8C3> <B8C3> <8706> <B8C4> <B8C4> <870A> <B8C5> <B8C5> <8859> <B8C6> <B8C6> <88DF> <B8C7> <B8C7> <88D4> <B8C8> <B8C8> <88D9> endbfrange 100 beginbfrange <B8C9> <B8C9> <88DC> <B8CA> <B8CA> <88D8> <B8CB> <B8CB> <88DD> <B8CC> <B8CC> <88E1> <B8CD> <B8CD> <88CA> <B8CE> <B8CE> <88D5> <B8CF> <B8CF> <88D2> <B8D0> <B8D0> <899C> <B8D1> <B8D1> <89E3> <B8D2> <B8D2> <8A6B> <B8D3> <B8D4> <8A72> <B8D5> <B8D5> <8A66> <B8D6> <B8D6> <8A69> <B8D7> <B8D7> <8A70> <B8D8> <B8D8> <8A87> <B8D9> <B8D9> <8A7C> <B8DA> <B8DA> <8A63> <B8DB> <B8DB> <8AA0> <B8DC> <B8DC> <8A71> <B8DD> <B8DD> <8A85> <B8DE> <B8DE> <8A6D> <B8DF> <B8DF> <8A62> <B8E0> <B8E0> <8A6E> <B8E1> <B8E1> <8A6C> <B8E2> <B8E2> <8A79> <B8E3> <B8E3> <8A7B> <B8E4> <B8E4> <8A3E> <B8E5> <B8E5> <8A68> <B8E6> <B8E6> <8C62> <B8E7> <B8E7> <8C8A> <B8E8> <B8E8> <8C89> <B8E9> <B8E9> <8CCA> <B8EA> <B8EB> <8CC7> <B8EC> <B8EC> <8CC4> <B8ED> <B8ED> <8CB2> <B8EE> <B8EE> <8CC3> <B8EF> <B8EF> <8CC2> <B8F0> <B8F0> <8CC5> <B8F1> <B8F1> <8DE1> <B8F2> <B8F2> <8DDF> <B8F3> <B8F3> <8DE8> <B8F4> <B8F4> <8DEF> <B8F5> <B8F5> <8DF3> <B8F6> <B8F6> <8DFA> <B8F7> <B8F7> <8DEA> <B8F8> <B8F8> <8DE4> <B8F9> <B8F9> <8DE6> <B8FA> <B8FA> <8EB2> <B8FB> <B8FB> <8F03> <B8FC> <B8FC> <8F09> <B8FD> <B8FD> <8EFE> <B8FE> <B8FE> <8F0A> <B940> <B940> <8F9F> <B941> <B941> <8FB2> <B942> <B942> <904B> <B943> <B943> <904A> <B944> <B944> <9053> <B945> <B945> <9042> <B946> <B946> <9054> <B947> <B947> <903C> <B948> <B948> <9055> <B949> <B949> <9050> <B94A> <B94A> <9047> <B94B> <B94B> <904F> <B94C> <B94C> <904E> <B94D> <B94D> <904D> <B94E> <B94E> <9051> <B94F> <B94F> <903E> <B950> <B950> <9041> <B951> <B951> <9112> <B952> <B952> <9117> <B953> <B953> <916C> <B954> <B954> <916A> <B955> <B955> <9169> <B956> <B956> <91C9> <B957> <B957> <9237> <B958> <B958> <9257> <B959> <B959> <9238> <B95A> <B95A> <923D> <B95B> <B95B> <9240> <B95C> <B95C> <923E> <B95D> <B95D> <925B> <B95E> <B95E> <924B> <B95F> <B95F> <9264> <B960> <B960> <9251> <B961> <B961> <9234> <B962> <B962> <9249> <B963> <B963> <924D> <B964> <B964> <9245> <B965> <B965> <9239> <B966> <B966> <923F> <B967> <B967> <925A> <B968> <B968> <9598> <B969> <B969> <9698> <B96A> <B96B> <9694> <B96C> <B96C> <96CD> <B96D> <B96D> <96CB> <B96E> <B96F> <96C9> <B970> <B970> <96F7> <B971> <B971> <96FB> endbfrange 100 beginbfrange <B972> <B972> <96F9> <B973> <B973> <96F6> <B974> <B974> <9756> <B975> <B975> <9774> <B976> <B976> <9776> <B977> <B978> <9810> <B979> <B979> <9813> <B97A> <B97A> <980A> <B97B> <B97B> <9812> <B97C> <B97C> <980C> <B97D> <B97D> <98FC> <B97E> <B97E> <98F4> <B9A1> <B9A2> <98FD> <B9A3> <B9A3> <99B3> <B9A4> <B9A4> <99B1> <B9A5> <B9A5> <99B4> <B9A6> <B9A6> <9AE1> <B9A7> <B9A7> <9CE9> <B9A8> <B9A8> <9E82> <B9A9> <B9A9> <9F0E> <B9AA> <B9AA> <9F13> <B9AB> <B9AB> <9F20> <B9AC> <B9AC> <50E7> <B9AD> <B9AD> <50EE> <B9AE> <B9AE> <50E5> <B9AF> <B9AF> <50D6> <B9B0> <B9B0> <50ED> <B9B1> <B9B1> <50DA> <B9B2> <B9B2> <50D5> <B9B3> <B9B3> <50CF> <B9B4> <B9B4> <50D1> <B9B5> <B9B5> <50F1> <B9B6> <B9B6> <50CE> <B9B7> <B9B7> <50E9> <B9B8> <B9B8> <5162> <B9B9> <B9B9> <51F3> <B9BA> <B9BA> <5283> <B9BB> <B9BB> <5282> <B9BC> <B9BC> <5331> <B9BD> <B9BD> <53AD> <B9BE> <B9BE> <55FE> <B9BF> <B9BF> <5600> <B9C0> <B9C0> <561B> <B9C1> <B9C1> <5617> <B9C2> <B9C2> <55FD> <B9C3> <B9C3> <5614> <B9C4> <B9C4> <5606> <B9C5> <B9C5> <5609> <B9C6> <B9C7> <560D> <B9C8> <B9C8> <55F7> <B9C9> <B9C9> <5616> <B9CA> <B9CA> <561F> <B9CB> <B9CB> <5608> <B9CC> <B9CC> <5610> <B9CD> <B9CD> <55F6> <B9CE> <B9CE> <5718> <B9CF> <B9CF> <5716> <B9D0> <B9D0> <5875> <B9D1> <B9D1> <587E> <B9D2> <B9D2> <5883> <B9D3> <B9D3> <5893> <B9D4> <B9D4> <588A> <B9D5> <B9D5> <5879> <B9D6> <B9D6> <5885> <B9D7> <B9D7> <587D> <B9D8> <B9D8> <58FD> <B9D9> <B9D9> <5925> <B9DA> <B9DA> <5922> <B9DB> <B9DB> <5924> <B9DC> <B9DC> <596A> <B9DD> <B9DD> <5969> <B9DE> <B9DE> <5AE1> <B9DF> <B9DF> <5AE6> <B9E0> <B9E0> <5AE9> <B9E1> <B9E1> <5AD7> <B9E2> <B9E2> <5AD6> <B9E3> <B9E3> <5AD8> <B9E4> <B9E4> <5AE3> <B9E5> <B9E5> <5B75> <B9E6> <B9E6> <5BDE> <B9E7> <B9E7> <5BE7> <B9E8> <B9E8> <5BE1> <B9E9> <B9EA> <5BE5> <B9EB> <B9EB> <5BE8> <B9EC> <B9EC> <5BE2> <B9ED> <B9ED> <5BE4> <B9EE> <B9EE> <5BDF> <B9EF> <B9EF> <5C0D> <B9F0> <B9F0> <5C62> <B9F1> <B9F1> <5D84> <B9F2> <B9F2> <5D87> <B9F3> <B9F3> <5E5B> <B9F4> <B9F4> <5E63> <B9F5> <B9F5> <5E55> <B9F6> <B9F6> <5E57> <B9F7> <B9F7> <5E54> <B9F8> <B9F8> <5ED3> <B9F9> <B9F9> <5ED6> <B9FA> <B9FA> <5F0A> <B9FB> <B9FB> <5F46> endbfrange 100 beginbfrange <B9FC> <B9FC> <5F70> <B9FD> <B9FD> <5FB9> <B9FE> <B9FE> <6147> <BA40> <BA40> <613F> <BA41> <BA41> <614B> <BA42> <BA42> <6177> <BA43> <BA44> <6162> <BA45> <BA45> <615F> <BA46> <BA46> <615A> <BA47> <BA47> <6158> <BA48> <BA48> <6175> <BA49> <BA49> <622A> <BA4A> <BA4A> <6487> <BA4B> <BA4B> <6458> <BA4C> <BA4C> <6454> <BA4D> <BA4D> <64A4> <BA4E> <BA4E> <6478> <BA4F> <BA4F> <645F> <BA50> <BA50> <647A> <BA51> <BA51> <6451> <BA52> <BA52> <6467> <BA53> <BA53> <6434> <BA54> <BA54> <646D> <BA55> <BA55> <647B> <BA56> <BA56> <6572> <BA57> <BA57> <65A1> <BA58> <BA58> <65D7> <BA59> <BA59> <65D6> <BA5A> <BA5A> <66A2> <BA5B> <BA5B> <66A8> <BA5C> <BA5C> <669D> <BA5D> <BA5D> <699C> <BA5E> <BA5E> <69A8> <BA5F> <BA5F> <6995> <BA60> <BA60> <69C1> <BA61> <BA61> <69AE> <BA62> <BA62> <69D3> <BA63> <BA63> <69CB> <BA64> <BA64> <699B> <BA65> <BA65> <69B7> <BA66> <BA66> <69BB> <BA67> <BA67> <69AB> <BA68> <BA68> <69B4> <BA69> <BA69> <69D0> <BA6A> <BA6A> <69CD> <BA6B> <BA6B> <69AD> <BA6C> <BA6C> <69CC> <BA6D> <BA6D> <69A6> <BA6E> <BA6E> <69C3> <BA6F> <BA6F> <69A3> <BA70> <BA70> <6B49> <BA71> <BA71> <6B4C> <BA72> <BA72> <6C33> <BA73> <BA73> <6F33> <BA74> <BA74> <6F14> <BA75> <BA75> <6EFE> <BA76> <BA76> <6F13> <BA77> <BA77> <6EF4> <BA78> <BA78> <6F29> <BA79> <BA79> <6F3E> <BA7A> <BA7A> <6F20> <BA7B> <BA7B> <6F2C> <BA7C> <BA7C> <6F0F> <BA7D> <BA7D> <6F02> <BA7E> <BA7E> <6F22> <BAA1> <BAA1> <6EFF> <BAA2> <BAA2> <6EEF> <BAA3> <BAA3> <6F06> <BAA4> <BAA4> <6F31> <BAA5> <BAA5> <6F38> <BAA6> <BAA6> <6F32> <BAA7> <BAA7> <6F23> <BAA8> <BAA8> <6F15> <BAA9> <BAA9> <6F2B> <BAAA> <BAAA> <6F2F> <BAAB> <BAAB> <6F88> <BAAC> <BAAC> <6F2A> <BAAD> <BAAD> <6EEC> <BAAE> <BAAE> <6F01> <BAAF> <BAAF> <6EF2> <BAB0> <BAB0> <6ECC> <BAB1> <BAB1> <6EF7> <BAB2> <BAB2> <7194> <BAB3> <BAB3> <7199> <BAB4> <BAB4> <717D> <BAB5> <BAB5> <718A> <BAB6> <BAB6> <7184> <BAB7> <BAB7> <7192> <BAB8> <BAB8> <723E> <BAB9> <BAB9> <7292> <BABA> <BABA> <7296> <BABB> <BABB> <7344> <BABC> <BABC> <7350> <BABD> <BABD> <7464> <BABE> <BABE> <7463> <BABF> <BABF> <746A> <BAC0> <BAC0> <7470> <BAC1> <BAC1> <746D> <BAC2> <BAC2> <7504> <BAC3> <BAC3> <7591> endbfrange 100 beginbfrange <BAC4> <BAC4> <7627> <BAC5> <BAC5> <760D> <BAC6> <BAC6> <760B> <BAC7> <BAC7> <7609> <BAC8> <BAC8> <7613> <BAC9> <BAC9> <76E1> <BACA> <BACA> <76E3> <BACB> <BACB> <7784> <BACC> <BACC> <777D> <BACD> <BACD> <777F> <BACE> <BACE> <7761> <BACF> <BACF> <78C1> <BAD0> <BAD0> <789F> <BAD1> <BAD1> <78A7> <BAD2> <BAD2> <78B3> <BAD3> <BAD3> <78A9> <BAD4> <BAD4> <78A3> <BAD5> <BAD6> <798E> <BAD7> <BAD7> <798D> <BAD8> <BAD8> <7A2E> <BAD9> <BAD9> <7A31> <BADA> <BADA> <7AAA> <BADB> <BADB> <7AA9> <BADC> <BADC> <7AED> <BADD> <BADD> <7AEF> <BADE> <BADE> <7BA1> <BADF> <BADF> <7B95> <BAE0> <BAE0> <7B8B> <BAE1> <BAE1> <7B75> <BAE2> <BAE2> <7B97> <BAE3> <BAE3> <7B9D> <BAE4> <BAE4> <7B94> <BAE5> <BAE5> <7B8F> <BAE6> <BAE6> <7BB8> <BAE7> <BAE7> <7B87> <BAE8> <BAE8> <7B84> <BAE9> <BAE9> <7CB9> <BAEA> <BAEB> <7CBD> <BAEC> <BAEC> <7DBB> <BAED> <BAED> <7DB0> <BAEE> <BAEE> <7D9C> <BAEF> <BAF0> <7DBD> <BAF1> <BAF1> <7DA0> <BAF2> <BAF2> <7DCA> <BAF3> <BAF3> <7DB4> <BAF4> <BAF4> <7DB2> <BAF5> <BAF5> <7DB1> <BAF6> <BAF6> <7DBA> <BAF7> <BAF7> <7DA2> <BAF8> <BAF8> <7DBF> <BAF9> <BAF9> <7DB5> <BAFA> <BAFA> <7DB8> <BAFB> <BAFB> <7DAD> <BAFC> <BAFC> <7DD2> <BAFD> <BAFD> <7DC7> <BAFE> <BAFE> <7DAC> <BB40> <BB40> <7F70> <BB41> <BB42> <7FE0> <BB43> <BB43> <7FDF> <BB44> <BB44> <805E> <BB45> <BB45> <805A> <BB46> <BB46> <8087> <BB47> <BB47> <8150> <BB48> <BB48> <8180> <BB49> <BB49> <818F> <BB4A> <BB4A> <8188> <BB4B> <BB4B> <818A> <BB4C> <BB4C> <817F> <BB4D> <BB4D> <8182> <BB4E> <BB4E> <81E7> <BB4F> <BB4F> <81FA> <BB50> <BB50> <8207> <BB51> <BB51> <8214> <BB52> <BB52> <821E> <BB53> <BB53> <824B> <BB54> <BB54> <84C9> <BB55> <BB55> <84BF> <BB56> <BB56> <84C6> <BB57> <BB57> <84C4> <BB58> <BB58> <8499> <BB59> <BB59> <849E> <BB5A> <BB5A> <84B2> <BB5B> <BB5B> <849C> <BB5C> <BB5C> <84CB> <BB5D> <BB5D> <84B8> <BB5E> <BB5E> <84C0> <BB5F> <BB5F> <84D3> <BB60> <BB60> <8490> <BB61> <BB61> <84BC> <BB62> <BB62> <84D1> <BB63> <BB63> <84CA> <BB64> <BB64> <873F> <BB65> <BB65> <871C> <BB66> <BB66> <873B> <BB67> <BB67> <8722> <BB68> <BB68> <8725> <BB69> <BB69> <8734> <BB6A> <BB6A> <8718> <BB6B> <BB6B> <8755> <BB6C> <BB6C> <8737> endbfrange 100 beginbfrange <BB6D> <BB6D> <8729> <BB6E> <BB6E> <88F3> <BB6F> <BB6F> <8902> <BB70> <BB70> <88F4> <BB71> <BB71> <88F9> <BB72> <BB72> <88F8> <BB73> <BB73> <88FD> <BB74> <BB74> <88E8> <BB75> <BB75> <891A> <BB76> <BB76> <88EF> <BB77> <BB77> <8AA6> <BB78> <BB78> <8A8C> <BB79> <BB79> <8A9E> <BB7A> <BB7A> <8AA3> <BB7B> <BB7B> <8A8D> <BB7C> <BB7C> <8AA1> <BB7D> <BB7D> <8A93> <BB7E> <BB7E> <8AA4> <BBA1> <BBA1> <8AAA> <BBA2> <BBA2> <8AA5> <BBA3> <BBA3> <8AA8> <BBA4> <BBA4> <8A98> <BBA5> <BBA5> <8A91> <BBA6> <BBA6> <8A9A> <BBA7> <BBA7> <8AA7> <BBA8> <BBA8> <8C6A> <BBA9> <BBA9> <8C8D> <BBAA> <BBAA> <8C8C> <BBAB> <BBAB> <8CD3> <BBAC> <BBAD> <8CD1> <BBAE> <BBAE> <8D6B> <BBAF> <BBAF> <8D99> <BBB0> <BBB0> <8D95> <BBB1> <BBB1> <8DFC> <BBB2> <BBB2> <8F14> <BBB3> <BBB3> <8F12> <BBB4> <BBB4> <8F15> <BBB5> <BBB5> <8F13> <BBB6> <BBB6> <8FA3> <BBB7> <BBB7> <9060> <BBB8> <BBB8> <9058> <BBB9> <BBB9> <905C> <BBBA> <BBBA> <9063> <BBBB> <BBBB> <9059> <BBBC> <BBBC> <905E> <BBBD> <BBBD> <9062> <BBBE> <BBBE> <905D> <BBBF> <BBBF> <905B> <BBC0> <BBC0> <9119> <BBC1> <BBC1> <9118> <BBC2> <BBC2> <911E> <BBC3> <BBC3> <9175> <BBC4> <BBC4> <9178> <BBC5> <BBC5> <9177> <BBC6> <BBC6> <9174> <BBC7> <BBC7> <9278> <BBC8> <BBC8> <9280> <BBC9> <BBC9> <9285> <BBCA> <BBCA> <9298> <BBCB> <BBCB> <9296> <BBCC> <BBCC> <927B> <BBCD> <BBCD> <9293> <BBCE> <BBCE> <929C> <BBCF> <BBCF> <92A8> <BBD0> <BBD0> <927C> <BBD1> <BBD1> <9291> <BBD2> <BBD2> <95A1> <BBD3> <BBD4> <95A8> <BBD5> <BBD5> <95A3> <BBD6> <BBD6> <95A5> <BBD7> <BBD7> <95A4> <BBD8> <BBD8> <9699> <BBD9> <BBD9> <969C> <BBDA> <BBDA> <969B> <BBDB> <BBDB> <96CC> <BBDC> <BBDC> <96D2> <BBDD> <BBDD> <9700> <BBDE> <BBDE> <977C> <BBDF> <BBDF> <9785> <BBE0> <BBE0> <97F6> <BBE1> <BBE2> <9817> <BBE3> <BBE3> <98AF> <BBE4> <BBE4> <98B1> <BBE5> <BBE5> <9903> <BBE6> <BBE6> <9905> <BBE7> <BBE7> <990C> <BBE8> <BBE8> <9909> <BBE9> <BBE9> <99C1> <BBEA> <BBEB> <9AAF> <BBEC> <BBEC> <9AE6> <BBED> <BBEE> <9B41> <BBEF> <BBEF> <9CF4> <BBF0> <BBF0> <9CF6> <BBF1> <BBF1> <9CF3> <BBF2> <BBF2> <9EBC> <BBF3> <BBF3> <9F3B> <BBF4> <BBF4> <9F4A> <BBF5> <BBF5> <5104> <BBF6> <BBF6> <5100> <BBF7> <BBF7> <50FB> endbfrange 100 beginbfrange <BBF8> <BBF8> <50F5> <BBF9> <BBF9> <50F9> <BBFA> <BBFA> <5102> <BBFB> <BBFC> <5108> <BBFD> <BBFD> <5105> <BBFE> <BBFE> <51DC> <BC40> <BC42> <5287> <BC43> <BC43> <528D> <BC44> <BC44> <528A> <BC45> <BC45> <52F0> <BC46> <BC46> <53B2> <BC47> <BC47> <562E> <BC48> <BC48> <563B> <BC49> <BC49> <5639> <BC4A> <BC4A> <5632> <BC4B> <BC4B> <563F> <BC4C> <BC4C> <5634> <BC4D> <BC4D> <5629> <BC4E> <BC4E> <5653> <BC4F> <BC4F> <564E> <BC50> <BC50> <5657> <BC51> <BC51> <5674> <BC52> <BC52> <5636> <BC53> <BC54> <562F> <BC55> <BC55> <5880> <BC56> <BC56> <589F> <BC57> <BC57> <589E> <BC58> <BC58> <58B3> <BC59> <BC59> <589C> <BC5A> <BC5A> <58AE> <BC5B> <BC5B> <58A9> <BC5C> <BC5C> <58A6> <BC5D> <BC5D> <596D> <BC5E> <BC5E> <5B09> <BC5F> <BC5F> <5AFB> <BC60> <BC60> <5B0B> <BC61> <BC61> <5AF5> <BC62> <BC62> <5B0C> <BC63> <BC63> <5B08> <BC64> <BC64> <5BEE> <BC65> <BC65> <5BEC> <BC66> <BC66> <5BE9> <BC67> <BC67> <5BEB> <BC68> <BC69> <5C64> <BC6A> <BC6A> <5D9D> <BC6B> <BC6B> <5D94> <BC6C> <BC6C> <5E62> <BC6D> <BC6D> <5E5F> <BC6E> <BC6E> <5E61> <BC6F> <BC6F> <5EE2> <BC70> <BC70> <5EDA> <BC71> <BC71> <5EDF> <BC72> <BC72> <5EDD> <BC73> <BC73> <5EE3> <BC74> <BC74> <5EE0> <BC75> <BC75> <5F48> <BC76> <BC76> <5F71> <BC77> <BC77> <5FB7> <BC78> <BC78> <5FB5> <BC79> <BC79> <6176> <BC7A> <BC7A> <6167> <BC7B> <BC7B> <616E> <BC7C> <BC7C> <615D> <BC7D> <BC7D> <6155> <BC7E> <BC7E> <6182> <BCA1> <BCA1> <617C> <BCA2> <BCA2> <6170> <BCA3> <BCA3> <616B> <BCA4> <BCA4> <617E> <BCA5> <BCA5> <61A7> <BCA6> <BCA6> <6190> <BCA7> <BCA7> <61AB> <BCA8> <BCA8> <618E> <BCA9> <BCA9> <61AC> <BCAA> <BCAA> <619A> <BCAB> <BCAB> <61A4> <BCAC> <BCAC> <6194> <BCAD> <BCAD> <61AE> <BCAE> <BCAE> <622E> <BCAF> <BCAF> <6469> <BCB0> <BCB0> <646F> <BCB1> <BCB1> <6479> <BCB2> <BCB2> <649E> <BCB3> <BCB3> <64B2> <BCB4> <BCB4> <6488> <BCB5> <BCB5> <6490> <BCB6> <BCB6> <64B0> <BCB7> <BCB7> <64A5> <BCB8> <BCB8> <6493> <BCB9> <BCB9> <6495> <BCBA> <BCBA> <64A9> <BCBB> <BCBB> <6492> <BCBC> <BCBC> <64AE> <BCBD> <BCBD> <64AD> <BCBE> <BCBE> <64AB> <BCBF> <BCBF> <649A> <BCC0> <BCC0> <64AC> <BCC1> <BCC1> <6499> <BCC2> <BCC2> <64A2> <BCC3> <BCC3> <64B3> endbfrange 100 beginbfrange <BCC4> <BCC4> <6575> <BCC5> <BCC6> <6577> <BCC7> <BCC7> <66AE> <BCC8> <BCC8> <66AB> <BCC9> <BCC9> <66B4> <BCCA> <BCCA> <66B1> <BCCB> <BCCB> <6A23> <BCCC> <BCCC> <6A1F> <BCCD> <BCCD> <69E8> <BCCE> <BCCE> <6A01> <BCCF> <BCCF> <6A1E> <BCD0> <BCD0> <6A19> <BCD1> <BCD1> <69FD> <BCD2> <BCD2> <6A21> <BCD3> <BCD3> <6A13> <BCD4> <BCD4> <6A0A> <BCD5> <BCD5> <69F3> <BCD6> <BCD6> <6A02> <BCD7> <BCD7> <6A05> <BCD8> <BCD8> <69ED> <BCD9> <BCD9> <6A11> <BCDA> <BCDA> <6B50> <BCDB> <BCDB> <6B4E> <BCDC> <BCDC> <6BA4> <BCDD> <BCDE> <6BC5> <BCDF> <BCDF> <6F3F> <BCE0> <BCE0> <6F7C> <BCE1> <BCE1> <6F84> <BCE2> <BCE2> <6F51> <BCE3> <BCE3> <6F66> <BCE4> <BCE4> <6F54> <BCE5> <BCE5> <6F86> <BCE6> <BCE6> <6F6D> <BCE7> <BCE7> <6F5B> <BCE8> <BCE8> <6F78> <BCE9> <BCE9> <6F6E> <BCEA> <BCEA> <6F8E> <BCEB> <BCEB> <6F7A> <BCEC> <BCEC> <6F70> <BCED> <BCED> <6F64> <BCEE> <BCEE> <6F97> <BCEF> <BCEF> <6F58> <BCF0> <BCF0> <6ED5> <BCF1> <BCF1> <6F6F> <BCF2> <BCF2> <6F60> <BCF3> <BCF3> <6F5F> <BCF4> <BCF4> <719F> <BCF5> <BCF5> <71AC> <BCF6> <BCF6> <71B1> <BCF7> <BCF7> <71A8> <BCF8> <BCF8> <7256> <BCF9> <BCF9> <729B> <BCFA> <BCFA> <734E> <BCFB> <BCFB> <7357> <BCFC> <BCFC> <7469> <BCFD> <BCFD> <748B> <BCFE> <BCFE> <7483> <BD40> <BD40> <747E> <BD41> <BD41> <7480> <BD42> <BD42> <757F> <BD43> <BD43> <7620> <BD44> <BD44> <7629> <BD45> <BD45> <761F> <BD46> <BD46> <7624> <BD47> <BD47> <7626> <BD48> <BD49> <7621> <BD4A> <BD4A> <769A> <BD4B> <BD4B> <76BA> <BD4C> <BD4C> <76E4> <BD4D> <BD4D> <778E> <BD4E> <BD4E> <7787> <BD4F> <BD4F> <778C> <BD50> <BD50> <7791> <BD51> <BD51> <778B> <BD52> <BD52> <78CB> <BD53> <BD53> <78C5> <BD54> <BD54> <78BA> <BD55> <BD55> <78CA> <BD56> <BD56> <78BE> <BD57> <BD57> <78D5> <BD58> <BD58> <78BC> <BD59> <BD59> <78D0> <BD5A> <BD5A> <7A3F> <BD5B> <BD5B> <7A3C> <BD5C> <BD5C> <7A40> <BD5D> <BD5D> <7A3D> <BD5E> <BD5E> <7A37> <BD5F> <BD5F> <7A3B> <BD60> <BD60> <7AAF> <BD61> <BD61> <7AAE> <BD62> <BD62> <7BAD> <BD63> <BD63> <7BB1> <BD64> <BD64> <7BC4> <BD65> <BD65> <7BB4> <BD66> <BD67> <7BC6> <BD68> <BD68> <7BC1> <BD69> <BD69> <7BA0> <BD6A> <BD6A> <7BCC> <BD6B> <BD6B> <7CCA> <BD6C> <BD6C> <7DE0> endbfrange 100 beginbfrange <BD6D> <BD6D> <7DF4> <BD6E> <BD6E> <7DEF> <BD6F> <BD6F> <7DFB> <BD70> <BD70> <7DD8> <BD71> <BD71> <7DEC> <BD72> <BD72> <7DDD> <BD73> <BD73> <7DE8> <BD74> <BD74> <7DE3> <BD75> <BD75> <7DDA> <BD76> <BD76> <7DDE> <BD77> <BD77> <7DE9> <BD78> <BD78> <7D9E> <BD79> <BD79> <7DD9> <BD7A> <BD7A> <7DF2> <BD7B> <BD7B> <7DF9> <BD7C> <BD7C> <7F75> <BD7D> <BD7D> <7F77> <BD7E> <BD7E> <7FAF> <BDA1> <BDA1> <7FE9> <BDA2> <BDA2> <8026> <BDA3> <BDA5> <819B> <BDA6> <BDA6> <81A0> <BDA7> <BDA7> <819A> <BDA8> <BDA8> <8198> <BDA9> <BDA9> <8517> <BDAA> <BDAA> <853D> <BDAB> <BDAB> <851A> <BDAC> <BDAC> <84EE> <BDAD> <BDAE> <852C> <BDAF> <BDAF> <8513> <BDB0> <BDB0> <8511> <BDB1> <BDB1> <8523> <BDB2> <BDB2> <8521> <BDB3> <BDB3> <8514> <BDB4> <BDB4> <84EC> <BDB5> <BDB5> <8525> <BDB6> <BDB6> <84FF> <BDB7> <BDB7> <8506> <BDB8> <BDB8> <8782> <BDB9> <BDB9> <8774> <BDBA> <BDBA> <8776> <BDBB> <BDBB> <8760> <BDBC> <BDBC> <8766> <BDBD> <BDBD> <8778> <BDBE> <BDBE> <8768> <BDBF> <BDBF> <8759> <BDC0> <BDC0> <8757> <BDC1> <BDC1> <874C> <BDC2> <BDC2> <8753> <BDC3> <BDC3> <885B> <BDC4> <BDC4> <885D> <BDC5> <BDC5> <8910> <BDC6> <BDC6> <8907> <BDC7> <BDC8> <8912> <BDC9> <BDC9> <8915> <BDCA> <BDCA> <890A> <BDCB> <BDCB> <8ABC> <BDCC> <BDCC> <8AD2> <BDCD> <BDCD> <8AC7> <BDCE> <BDCE> <8AC4> <BDCF> <BDCF> <8A95> <BDD0> <BDD0> <8ACB> <BDD1> <BDD1> <8AF8> <BDD2> <BDD2> <8AB2> <BDD3> <BDD3> <8AC9> <BDD4> <BDD4> <8AC2> <BDD5> <BDD5> <8ABF> <BDD6> <BDD6> <8AB0> <BDD7> <BDD7> <8AD6> <BDD8> <BDD8> <8ACD> <BDD9> <BDD9> <8AB6> <BDDA> <BDDA> <8AB9> <BDDB> <BDDB> <8ADB> <BDDC> <BDDC> <8C4C> <BDDD> <BDDD> <8C4E> <BDDE> <BDDE> <8C6C> <BDDF> <BDDF> <8CE0> <BDE0> <BDE0> <8CDE> <BDE1> <BDE1> <8CE6> <BDE2> <BDE2> <8CE4> <BDE3> <BDE4> <8CEC> <BDE5> <BDE6> <8CE2> <BDE7> <BDE7> <8CDC> <BDE8> <BDE8> <8CEA> <BDE9> <BDE9> <8CE1> <BDEA> <BDEA> <8D6D> <BDEB> <BDEB> <8D9F> <BDEC> <BDEC> <8DA3> <BDED> <BDED> <8E2B> <BDEE> <BDEE> <8E10> <BDEF> <BDEF> <8E1D> <BDF0> <BDF0> <8E22> <BDF1> <BDF1> <8E0F> <BDF2> <BDF2> <8E29> <BDF3> <BDF3> <8E1F> <BDF4> <BDF4> <8E21> <BDF5> <BDF5> <8E1E> <BDF6> <BDF6> <8EBA> <BDF7> <BDF7> <8F1D> <BDF8> <BDF8> <8F1B> endbfrange 100 beginbfrange <BDF9> <BDF9> <8F1F> <BDFA> <BDFA> <8F29> <BDFB> <BDFB> <8F26> <BDFC> <BDFC> <8F2A> <BDFD> <BDFD> <8F1C> <BDFE> <BDFE> <8F1E> <BE40> <BE40> <8F25> <BE41> <BE41> <9069> <BE42> <BE42> <906E> <BE43> <BE43> <9068> <BE44> <BE44> <906D> <BE45> <BE45> <9077> <BE46> <BE46> <9130> <BE47> <BE47> <912D> <BE48> <BE48> <9127> <BE49> <BE49> <9131> <BE4A> <BE4A> <9187> <BE4B> <BE4B> <9189> <BE4C> <BE4C> <918B> <BE4D> <BE4D> <9183> <BE4E> <BE4E> <92C5> <BE4F> <BE4F> <92BB> <BE50> <BE50> <92B7> <BE51> <BE51> <92EA> <BE52> <BE52> <92AC> <BE53> <BE53> <92E4> <BE54> <BE54> <92C1> <BE55> <BE55> <92B3> <BE56> <BE56> <92BC> <BE57> <BE57> <92D2> <BE58> <BE58> <92C7> <BE59> <BE59> <92F0> <BE5A> <BE5A> <92B2> <BE5B> <BE5B> <95AD> <BE5C> <BE5C> <95B1> <BE5D> <BE5D> <9704> <BE5E> <BE5F> <9706> <BE60> <BE60> <9709> <BE61> <BE61> <9760> <BE62> <BE62> <978D> <BE63> <BE63> <978B> <BE64> <BE64> <978F> <BE65> <BE65> <9821> <BE66> <BE66> <982B> <BE67> <BE67> <981C> <BE68> <BE68> <98B3> <BE69> <BE69> <990A> <BE6A> <BE6A> <9913> <BE6B> <BE6B> <9912> <BE6C> <BE6C> <9918> <BE6D> <BE6D> <99DD> <BE6E> <BE6E> <99D0> <BE6F> <BE6F> <99DF> <BE70> <BE70> <99DB> <BE71> <BE71> <99D1> <BE72> <BE72> <99D5> <BE73> <BE73> <99D2> <BE74> <BE74> <99D9> <BE75> <BE75> <9AB7> <BE76> <BE77> <9AEE> <BE78> <BE78> <9B27> <BE79> <BE79> <9B45> <BE7A> <BE7A> <9B44> <BE7B> <BE7B> <9B77> <BE7C> <BE7C> <9B6F> <BE7D> <BE7D> <9D06> <BE7E> <BE7E> <9D09> <BEA1> <BEA1> <9D03> <BEA2> <BEA2> <9EA9> <BEA3> <BEA3> <9EBE> <BEA4> <BEA4> <9ECE> <BEA5> <BEA5> <58A8> <BEA6> <BEA6> <9F52> <BEA7> <BEA7> <5112> <BEA8> <BEA8> <5118> <BEA9> <BEA9> <5114> <BEAA> <BEAA> <5110> <BEAB> <BEAB> <5115> <BEAC> <BEAC> <5180> <BEAD> <BEAD> <51AA> <BEAE> <BEAE> <51DD> <BEAF> <BEAF> <5291> <BEB0> <BEB0> <5293> <BEB1> <BEB1> <52F3> <BEB2> <BEB2> <5659> <BEB3> <BEB3> <566B> <BEB4> <BEB4> <5679> <BEB5> <BEB5> <5669> <BEB6> <BEB6> <5664> <BEB7> <BEB7> <5678> <BEB8> <BEB8> <566A> <BEB9> <BEB9> <5668> <BEBA> <BEBA> <5665> <BEBB> <BEBB> <5671> <BEBC> <BEBC> <566F> <BEBD> <BEBD> <566C> <BEBE> <BEBE> <5662> <BEBF> <BEBF> <5676> <BEC0> <BEC0> <58C1> <BEC1> <BEC1> <58BE> endbfrange 100 beginbfrange <BEC2> <BEC2> <58C7> <BEC3> <BEC3> <58C5> <BEC4> <BEC4> <596E> <BEC5> <BEC5> <5B1D> <BEC6> <BEC6> <5B34> <BEC7> <BEC7> <5B78> <BEC8> <BEC8> <5BF0> <BEC9> <BEC9> <5C0E> <BECA> <BECA> <5F4A> <BECB> <BECB> <61B2> <BECC> <BECC> <6191> <BECD> <BECD> <61A9> <BECE> <BECE> <618A> <BECF> <BECF> <61CD> <BED0> <BED0> <61B6> <BED1> <BED1> <61BE> <BED2> <BED2> <61CA> <BED3> <BED3> <61C8> <BED4> <BED4> <6230> <BED5> <BED5> <64C5> <BED6> <BED6> <64C1> <BED7> <BED7> <64CB> <BED8> <BED9> <64BB> <BEDA> <BEDA> <64DA> <BEDB> <BEDB> <64C4> <BEDC> <BEDC> <64C7> <BEDD> <BEDD> <64C2> <BEDE> <BEDE> <64CD> <BEDF> <BEDF> <64BF> <BEE0> <BEE0> <64D2> <BEE1> <BEE1> <64D4> <BEE2> <BEE2> <64BE> <BEE3> <BEE3> <6574> <BEE4> <BEE4> <66C6> <BEE5> <BEE5> <66C9> <BEE6> <BEE6> <66B9> <BEE7> <BEE7> <66C4> <BEE8> <BEE8> <66C7> <BEE9> <BEE9> <66B8> <BEEA> <BEEA> <6A3D> <BEEB> <BEEB> <6A38> <BEEC> <BEEC> <6A3A> <BEED> <BEED> <6A59> <BEEE> <BEEE> <6A6B> <BEEF> <BEEF> <6A58> <BEF0> <BEF0> <6A39> <BEF1> <BEF1> <6A44> <BEF2> <BEF2> <6A62> <BEF3> <BEF3> <6A61> <BEF4> <BEF4> <6A4B> <BEF5> <BEF5> <6A47> <BEF6> <BEF6> <6A35> <BEF7> <BEF7> <6A5F> <BEF8> <BEF8> <6A48> <BEF9> <BEF9> <6B59> <BEFA> <BEFA> <6B77> <BEFB> <BEFB> <6C05> <BEFC> <BEFC> <6FC2> <BEFD> <BEFD> <6FB1> <BEFE> <BEFE> <6FA1> <BF40> <BF40> <6FC3> <BF41> <BF41> <6FA4> <BF42> <BF42> <6FC1> <BF43> <BF43> <6FA7> <BF44> <BF44> <6FB3> <BF45> <BF45> <6FC0> <BF46> <BF46> <6FB9> <BF47> <BF47> <6FB6> <BF48> <BF48> <6FA6> <BF49> <BF49> <6FA0> <BF4A> <BF4A> <6FB4> <BF4B> <BF4B> <71BE> <BF4C> <BF4C> <71C9> <BF4D> <BF4D> <71D0> <BF4E> <BF4E> <71D2> <BF4F> <BF4F> <71C8> <BF50> <BF50> <71D5> <BF51> <BF51> <71B9> <BF52> <BF52> <71CE> <BF53> <BF53> <71D9> <BF54> <BF54> <71DC> <BF55> <BF56> <71C3> <BF57> <BF57> <7368> <BF58> <BF58> <749C> <BF59> <BF59> <74A3> <BF5A> <BF5A> <7498> <BF5B> <BF5B> <749F> <BF5C> <BF5C> <749E> <BF5D> <BF5D> <74E2> <BF5E> <BF5F> <750C> <BF60> <BF60> <7634> <BF61> <BF61> <7638> <BF62> <BF62> <763A> <BF63> <BF63> <76E7> <BF64> <BF64> <76E5> <BF65> <BF65> <77A0> <BF66> <BF67> <779E> <BF68> <BF68> <77A5> <BF69> <BF69> <78E8> <BF6A> <BF6A> <78DA> endbfrange 100 beginbfrange <BF6B> <BF6B> <78EC> <BF6C> <BF6C> <78E7> <BF6D> <BF6D> <79A6> <BF6E> <BF6F> <7A4D> <BF70> <BF70> <7A46> <BF71> <BF71> <7A4C> <BF72> <BF72> <7A4B> <BF73> <BF73> <7ABA> <BF74> <BF74> <7BD9> <BF75> <BF75> <7C11> <BF76> <BF76> <7BC9> <BF77> <BF77> <7BE4> <BF78> <BF78> <7BDB> <BF79> <BF79> <7BE1> <BF7A> <BF7A> <7BE9> <BF7B> <BF7B> <7BE6> <BF7C> <BF7D> <7CD5> <BF7E> <BF7E> <7E0A> <BFA1> <BFA1> <7E11> <BFA2> <BFA2> <7E08> <BFA3> <BFA3> <7E1B> <BFA4> <BFA4> <7E23> <BFA5> <BFA5> <7E1E> <BFA6> <BFA6> <7E1D> <BFA7> <BFA7> <7E09> <BFA8> <BFA8> <7E10> <BFA9> <BFA9> <7F79> <BFAA> <BFAA> <7FB2> <BFAB> <BFAC> <7FF0> <BFAD> <BFAD> <7FEE> <BFAE> <BFAE> <8028> <BFAF> <BFAF> <81B3> <BFB0> <BFB0> <81A9> <BFB1> <BFB1> <81A8> <BFB2> <BFB2> <81FB> <BFB3> <BFB3> <8208> <BFB4> <BFB5> <8258> <BFB6> <BFB6> <854A> <BFB7> <BFB7> <8559> <BFB8> <BFB8> <8548> <BFB9> <BFBA> <8568> <BFBB> <BFBB> <8543> <BFBC> <BFBC> <8549> <BFBD> <BFBD> <856D> <BFBE> <BFBE> <856A> <BFBF> <BFBF> <855E> <BFC0> <BFC0> <8783> <BFC1> <BFC1> <879F> <BFC2> <BFC2> <879E> <BFC3> <BFC3> <87A2> <BFC4> <BFC4> <878D> <BFC5> <BFC5> <8861> <BFC6> <BFC6> <892A> <BFC7> <BFC7> <8932> <BFC8> <BFC8> <8925> <BFC9> <BFC9> <892B> <BFCA> <BFCA> <8921> <BFCB> <BFCB> <89AA> <BFCC> <BFCC> <89A6> <BFCD> <BFCD> <8AE6> <BFCE> <BFCE> <8AFA> <BFCF> <BFCF> <8AEB> <BFD0> <BFD0> <8AF1> <BFD1> <BFD1> <8B00> <BFD2> <BFD2> <8ADC> <BFD3> <BFD3> <8AE7> <BFD4> <BFD4> <8AEE> <BFD5> <BFD5> <8AFE> <BFD6> <BFD7> <8B01> <BFD8> <BFD8> <8AF7> <BFD9> <BFD9> <8AED> <BFDA> <BFDA> <8AF3> <BFDB> <BFDB> <8AF6> <BFDC> <BFDC> <8AFC> <BFDD> <BFDD> <8C6B> <BFDE> <BFDE> <8C6D> <BFDF> <BFDF> <8C93> <BFE0> <BFE0> <8CF4> <BFE1> <BFE1> <8E44> <BFE2> <BFE2> <8E31> <BFE3> <BFE3> <8E34> <BFE4> <BFE4> <8E42> <BFE5> <BFE5> <8E39> <BFE6> <BFE6> <8E35> <BFE7> <BFE7> <8F3B> <BFE8> <BFE8> <8F2F> <BFE9> <BFE9> <8F38> <BFEA> <BFEA> <8F33> <BFEB> <BFEB> <8FA8> <BFEC> <BFEC> <8FA6> <BFED> <BFED> <9075> <BFEE> <BFEE> <9074> <BFEF> <BFEF> <9078> <BFF0> <BFF0> <9072> <BFF1> <BFF1> <907C> <BFF2> <BFF2> <907A> <BFF3> <BFF3> <9134> <BFF4> <BFF4> <9192> <BFF5> <BFF5> <9320> <BFF6> <BFF6> <9336> endbfrange 100 beginbfrange <BFF7> <BFF7> <92F8> <BFF8> <BFF8> <9333> <BFF9> <BFF9> <932F> <BFFA> <BFFA> <9322> <BFFB> <BFFB> <92FC> <BFFC> <BFFC> <932B> <BFFD> <BFFD> <9304> <BFFE> <BFFE> <931A> <C040> <C040> <9310> <C041> <C041> <9326> <C042> <C042> <9321> <C043> <C043> <9315> <C044> <C044> <932E> <C045> <C045> <9319> <C046> <C046> <95BB> <C047> <C048> <96A7> <C049> <C049> <96AA> <C04A> <C04A> <96D5> <C04B> <C04B> <970E> <C04C> <C04C> <9711> <C04D> <C04D> <9716> <C04E> <C04E> <970D> <C04F> <C04F> <9713> <C050> <C050> <970F> <C051> <C052> <975B> <C053> <C053> <9766> <C054> <C054> <9798> <C055> <C055> <9830> <C056> <C056> <9838> <C057> <C057> <983B> <C058> <C058> <9837> <C059> <C059> <982D> <C05A> <C05A> <9839> <C05B> <C05B> <9824> <C05C> <C05C> <9910> <C05D> <C05D> <9928> <C05E> <C05E> <991E> <C05F> <C05F> <991B> <C060> <C060> <9921> <C061> <C061> <991A> <C062> <C062> <99ED> <C063> <C063> <99E2> <C064> <C064> <99F1> <C065> <C065> <9AB8> <C066> <C066> <9ABC> <C067> <C067> <9AFB> <C068> <C068> <9AED> <C069> <C069> <9B28> <C06A> <C06A> <9B91> <C06B> <C06B> <9D15> <C06C> <C06C> <9D23> <C06D> <C06D> <9D26> <C06E> <C06E> <9D28> <C06F> <C06F> <9D12> <C070> <C070> <9D1B> <C071> <C071> <9ED8> <C072> <C072> <9ED4> <C073> <C073> <9F8D> <C074> <C074> <9F9C> <C075> <C075> <512A> <C076> <C076> <511F> <C077> <C077> <5121> <C078> <C078> <5132> <C079> <C079> <52F5> <C07A> <C07A> <568E> <C07B> <C07B> <5680> <C07C> <C07C> <5690> <C07D> <C07D> <5685> <C07E> <C07E> <5687> <C0A1> <C0A1> <568F> <C0A2> <C0A2> <58D5> <C0A3> <C0A3> <58D3> <C0A4> <C0A4> <58D1> <C0A5> <C0A5> <58CE> <C0A6> <C0A6> <5B30> <C0A7> <C0A7> <5B2A> <C0A8> <C0A8> <5B24> <C0A9> <C0A9> <5B7A> <C0AA> <C0AA> <5C37> <C0AB> <C0AB> <5C68> <C0AC> <C0AC> <5DBC> <C0AD> <C0AD> <5DBA> <C0AE> <C0AE> <5DBD> <C0AF> <C0AF> <5DB8> <C0B0> <C0B0> <5E6B> <C0B1> <C0B1> <5F4C> <C0B2> <C0B2> <5FBD> <C0B3> <C0B3> <61C9> <C0B4> <C0B4> <61C2> <C0B5> <C0B5> <61C7> <C0B6> <C0B6> <61E6> <C0B7> <C0B7> <61CB> <C0B8> <C0B8> <6232> <C0B9> <C0B9> <6234> <C0BA> <C0BA> <64CE> <C0BB> <C0BB> <64CA> <C0BC> <C0BC> <64D8> <C0BD> <C0BD> <64E0> <C0BE> <C0BE> <64F0> <C0BF> <C0BF> <64E6> endbfrange 100 beginbfrange <C0C0> <C0C0> <64EC> <C0C1> <C0C1> <64F1> <C0C2> <C0C2> <64E2> <C0C3> <C0C3> <64ED> <C0C4> <C0C5> <6582> <C0C6> <C0C6> <66D9> <C0C7> <C0C7> <66D6> <C0C8> <C0C8> <6A80> <C0C9> <C0C9> <6A94> <C0CA> <C0CA> <6A84> <C0CB> <C0CB> <6AA2> <C0CC> <C0CC> <6A9C> <C0CD> <C0CD> <6ADB> <C0CE> <C0CE> <6AA3> <C0CF> <C0CF> <6A7E> <C0D0> <C0D0> <6A97> <C0D1> <C0D1> <6A90> <C0D2> <C0D2> <6AA0> <C0D3> <C0D3> <6B5C> <C0D4> <C0D4> <6BAE> <C0D5> <C0D5> <6BDA> <C0D6> <C0D6> <6C08> <C0D7> <C0D7> <6FD8> <C0D8> <C0D8> <6FF1> <C0D9> <C0DA> <6FDF> <C0DB> <C0DB> <6FDB> <C0DC> <C0DC> <6FE4> <C0DD> <C0DD> <6FEB> <C0DE> <C0DE> <6FEF> <C0DF> <C0DF> <6F80> <C0E0> <C0E0> <6FEC> <C0E1> <C0E1> <6FE1> <C0E2> <C0E2> <6FE9> <C0E3> <C0E3> <6FD5> <C0E4> <C0E4> <6FEE> <C0E5> <C0E5> <6FF0> <C0E6> <C0E6> <71E7> <C0E7> <C0E7> <71DF> <C0E8> <C0E8> <71EE> <C0E9> <C0E9> <71E6> <C0EA> <C0EA> <71E5> <C0EB> <C0EB> <71ED> <C0EC> <C0EC> <71EC> <C0ED> <C0ED> <71F4> <C0EE> <C0EE> <71E0> <C0EF> <C0EF> <7235> <C0F0> <C0F0> <7246> <C0F1> <C0F1> <7370> <C0F2> <C0F2> <7372> <C0F3> <C0F3> <74A9> <C0F4> <C0F4> <74B0> <C0F5> <C0F5> <74A6> <C0F6> <C0F6> <74A8> <C0F7> <C0F7> <7646> <C0F8> <C0F8> <7642> <C0F9> <C0F9> <764C> <C0FA> <C0FA> <76EA> <C0FB> <C0FB> <77B3> <C0FC> <C0FC> <77AA> <C0FD> <C0FD> <77B0> <C0FE> <C0FE> <77AC> <C140> <C140> <77A7> <C141> <C141> <77AD> <C142> <C142> <77EF> <C143> <C143> <78F7> <C144> <C144> <78FA> <C145> <C145> <78F4> <C146> <C146> <78EF> <C147> <C147> <7901> <C148> <C148> <79A7> <C149> <C149> <79AA> <C14A> <C14A> <7A57> <C14B> <C14B> <7ABF> <C14C> <C14C> <7C07> <C14D> <C14D> <7C0D> <C14E> <C14E> <7BFE> <C14F> <C14F> <7BF7> <C150> <C150> <7C0C> <C151> <C151> <7BE0> <C152> <C152> <7CE0> <C153> <C153> <7CDC> <C154> <C154> <7CDE> <C155> <C155> <7CE2> <C156> <C156> <7CDF> <C157> <C157> <7CD9> <C158> <C158> <7CDD> <C159> <C159> <7E2E> <C15A> <C15A> <7E3E> <C15B> <C15B> <7E46> <C15C> <C15C> <7E37> <C15D> <C15D> <7E32> <C15E> <C15E> <7E43> <C15F> <C15F> <7E2B> <C160> <C160> <7E3D> <C161> <C161> <7E31> <C162> <C162> <7E45> <C163> <C163> <7E41> <C164> <C164> <7E34> <C165> <C165> <7E39> <C166> <C166> <7E48> endbfrange 100 beginbfrange <C167> <C167> <7E35> <C168> <C168> <7E3F> <C169> <C169> <7E2F> <C16A> <C16A> <7F44> <C16B> <C16B> <7FF3> <C16C> <C16C> <7FFC> <C16D> <C16E> <8071> <C16F> <C16F> <8070> <C170> <C170> <806F> <C171> <C171> <8073> <C172> <C172> <81C6> <C173> <C173> <81C3> <C174> <C174> <81BA> <C175> <C175> <81C2> <C176> <C176> <81C0> <C177> <C177> <81BF> <C178> <C178> <81BD> <C179> <C179> <81C9> <C17A> <C17A> <81BE> <C17B> <C17B> <81E8> <C17C> <C17C> <8209> <C17D> <C17D> <8271> <C17E> <C17E> <85AA> <C1A1> <C1A1> <8584> <C1A2> <C1A2> <857E> <C1A3> <C1A3> <859C> <C1A4> <C1A4> <8591> <C1A5> <C1A5> <8594> <C1A6> <C1A6> <85AF> <C1A7> <C1A7> <859B> <C1A8> <C1A8> <8587> <C1A9> <C1A9> <85A8> <C1AA> <C1AA> <858A> <C1AB> <C1AB> <8667> <C1AC> <C1AC> <87C0> <C1AD> <C1AD> <87D1> <C1AE> <C1AE> <87B3> <C1AF> <C1AF> <87D2> <C1B0> <C1B0> <87C6> <C1B1> <C1B1> <87AB> <C1B2> <C1B2> <87BB> <C1B3> <C1B3> <87BA> <C1B4> <C1B4> <87C8> <C1B5> <C1B5> <87CB> <C1B6> <C1B6> <893B> <C1B7> <C1B7> <8936> <C1B8> <C1B8> <8944> <C1B9> <C1B9> <8938> <C1BA> <C1BA> <893D> <C1BB> <C1BB> <89AC> <C1BC> <C1BC> <8B0E> <C1BD> <C1BD> <8B17> <C1BE> <C1BE> <8B19> <C1BF> <C1BF> <8B1B> <C1C0> <C1C0> <8B0A> <C1C1> <C1C1> <8B20> <C1C2> <C1C2> <8B1D> <C1C3> <C1C3> <8B04> <C1C4> <C1C4> <8B10> <C1C5> <C1C5> <8C41> <C1C6> <C1C6> <8C3F> <C1C7> <C1C7> <8C73> <C1C8> <C1C8> <8CFA> <C1C9> <C1C9> <8CFD> <C1CA> <C1CA> <8CFC> <C1CB> <C1CB> <8CF8> <C1CC> <C1CC> <8CFB> <C1CD> <C1CD> <8DA8> <C1CE> <C1CE> <8E49> <C1CF> <C1CF> <8E4B> <C1D0> <C1D0> <8E48> <C1D1> <C1D1> <8E4A> <C1D2> <C1D2> <8F44> <C1D3> <C1D3> <8F3E> <C1D4> <C1D4> <8F42> <C1D5> <C1D5> <8F45> <C1D6> <C1D6> <8F3F> <C1D7> <C1D7> <907F> <C1D8> <C1D8> <907D> <C1D9> <C1D9> <9084> <C1DA> <C1DB> <9081> <C1DC> <C1DC> <9080> <C1DD> <C1DD> <9139> <C1DE> <C1DE> <91A3> <C1DF> <C1DF> <919E> <C1E0> <C1E0> <919C> <C1E1> <C1E1> <934D> <C1E2> <C1E2> <9382> <C1E3> <C1E3> <9328> <C1E4> <C1E4> <9375> <C1E5> <C1E5> <934A> <C1E6> <C1E6> <9365> <C1E7> <C1E7> <934B> <C1E8> <C1E8> <9318> <C1E9> <C1E9> <937E> <C1EA> <C1EA> <936C> <C1EB> <C1EB> <935B> <C1EC> <C1EC> <9370> <C1ED> <C1ED> <935A> <C1EE> <C1EE> <9354> endbfrange 100 beginbfrange <C1EF> <C1F1> <95CA> <C1F2> <C1F2> <95C8> <C1F3> <C1F3> <95C6> <C1F4> <C1F4> <96B1> <C1F5> <C1F5> <96B8> <C1F6> <C1F6> <96D6> <C1F7> <C1F7> <971C> <C1F8> <C1F8> <971E> <C1F9> <C1F9> <97A0> <C1FA> <C1FA> <97D3> <C1FB> <C1FB> <9846> <C1FC> <C1FC> <98B6> <C1FD> <C1FD> <9935> <C1FE> <C1FE> <9A01> <C240> <C240> <99FF> <C241> <C241> <9BAE> <C242> <C242> <9BAB> <C243> <C243> <9BAA> <C244> <C244> <9BAD> <C245> <C245> <9D3B> <C246> <C246> <9D3F> <C247> <C247> <9E8B> <C248> <C248> <9ECF> <C249> <C249> <9EDE> <C24A> <C24B> <9EDC> <C24C> <C24C> <9EDB> <C24D> <C24D> <9F3E> <C24E> <C24E> <9F4B> <C24F> <C24F> <53E2> <C250> <C250> <5695> <C251> <C251> <56AE> <C252> <C252> <58D9> <C253> <C253> <58D8> <C254> <C254> <5B38> <C255> <C255> <5F5D> <C256> <C256> <61E3> <C257> <C257> <6233> <C258> <C258> <64F4> <C259> <C259> <64F2> <C25A> <C25A> <64FE> <C25B> <C25B> <6506> <C25C> <C25D> <64FA> <C25E> <C25E> <64F7> <C25F> <C25F> <65B7> <C260> <C260> <66DC> <C261> <C261> <6726> <C262> <C262> <6AB3> <C263> <C263> <6AAC> <C264> <C264> <6AC3> <C265> <C265> <6ABB> <C266> <C266> <6AB8> <C267> <C267> <6AC2> <C268> <C269> <6AAE> <C26A> <C26A> <6B5F> <C26B> <C26B> <6B78> <C26C> <C26C> <6BAF> <C26D> <C26D> <7009> <C26E> <C26E> <700B> <C26F> <C26F> <6FFE> <C270> <C270> <7006> <C271> <C271> <6FFA> <C272> <C272> <7011> <C273> <C273> <700F> <C274> <C275> <71FB> <C276> <C276> <71FE> <C277> <C277> <71F8> <C278> <C278> <7377> <C279> <C279> <7375> <C27A> <C27A> <74A7> <C27B> <C27B> <74BF> <C27C> <C27C> <7515> <C27D> <C27D> <7656> <C27E> <C27E> <7658> <C2A1> <C2A1> <7652> <C2A2> <C2A2> <77BD> <C2A3> <C2A3> <77BF> <C2A4> <C2A5> <77BB> <C2A6> <C2A6> <790E> <C2A7> <C2A7> <79AE> <C2A8> <C2A9> <7A61> <C2AA> <C2AA> <7A60> <C2AB> <C2AC> <7AC4> <C2AD> <C2AD> <7C2B> <C2AE> <C2AE> <7C27> <C2AF> <C2AF> <7C2A> <C2B0> <C2B0> <7C1E> <C2B1> <C2B1> <7C23> <C2B2> <C2B2> <7C21> <C2B3> <C2B3> <7CE7> <C2B4> <C2B5> <7E54> <C2B6> <C2B6> <7E5E> <C2B7> <C2B7> <7E5A> <C2B8> <C2B8> <7E61> <C2B9> <C2B9> <7E52> <C2BA> <C2BA> <7E59> <C2BB> <C2BB> <7F48> <C2BC> <C2BC> <7FF9> <C2BD> <C2BD> <7FFB> <C2BE> <C2BE> <8077> <C2BF> <C2BF> <8076> endbfrange 100 beginbfrange <C2C0> <C2C0> <81CD> <C2C1> <C2C1> <81CF> <C2C2> <C2C2> <820A> <C2C3> <C2C3> <85CF> <C2C4> <C2C4> <85A9> <C2C5> <C2C5> <85CD> <C2C6> <C2C6> <85D0> <C2C7> <C2C7> <85C9> <C2C8> <C2C8> <85B0> <C2C9> <C2C9> <85BA> <C2CA> <C2CA> <85B9> <C2CB> <C2CB> <85A6> <C2CC> <C2CC> <87EF> <C2CD> <C2CD> <87EC> <C2CE> <C2CE> <87F2> <C2CF> <C2CF> <87E0> <C2D0> <C2D0> <8986> <C2D1> <C2D1> <89B2> <C2D2> <C2D2> <89F4> <C2D3> <C2D3> <8B28> <C2D4> <C2D4> <8B39> <C2D5> <C2D5> <8B2C> <C2D6> <C2D6> <8B2B> <C2D7> <C2D7> <8C50> <C2D8> <C2D8> <8D05> <C2D9> <C2D9> <8E59> <C2DA> <C2DA> <8E63> <C2DB> <C2DB> <8E66> <C2DC> <C2DC> <8E64> <C2DD> <C2DD> <8E5F> <C2DE> <C2DE> <8E55> <C2DF> <C2DF> <8EC0> <C2E0> <C2E0> <8F49> <C2E1> <C2E1> <8F4D> <C2E2> <C2E2> <9087> <C2E3> <C2E3> <9083> <C2E4> <C2E4> <9088> <C2E5> <C2E6> <91AB> <C2E7> <C2E7> <91D0> <C2E8> <C2E8> <9394> <C2E9> <C2E9> <938A> <C2EA> <C2EA> <9396> <C2EB> <C2EB> <93A2> <C2EC> <C2EC> <93B3> <C2ED> <C2ED> <93AE> <C2EE> <C2EE> <93AC> <C2EF> <C2EF> <93B0> <C2F0> <C2F0> <9398> <C2F1> <C2F1> <939A> <C2F2> <C2F2> <9397> <C2F3> <C2F3> <95D4> <C2F4> <C2F4> <95D6> <C2F5> <C2F5> <95D0> <C2F6> <C2F6> <95D5> <C2F7> <C2F7> <96E2> <C2F8> <C2F8> <96DC> <C2F9> <C2F9> <96D9> <C2FA> <C2FA> <96DB> <C2FB> <C2FB> <96DE> <C2FC> <C2FC> <9724> <C2FD> <C2FD> <97A3> <C2FE> <C2FE> <97A6> <C340> <C340> <97AD> <C341> <C341> <97F9> <C342> <C342> <984D> <C343> <C343> <984F> <C344> <C344> <984C> <C345> <C345> <984E> <C346> <C346> <9853> <C347> <C347> <98BA> <C348> <C349> <993E> <C34A> <C34A> <993D> <C34B> <C34B> <992E> <C34C> <C34C> <99A5> <C34D> <C34D> <9A0E> <C34E> <C34E> <9AC1> <C34F> <C34F> <9B03> <C350> <C350> <9B06> <C351> <C351> <9B4F> <C352> <C352> <9B4E> <C353> <C353> <9B4D> <C354> <C354> <9BCA> <C355> <C355> <9BC9> <C356> <C356> <9BFD> <C357> <C357> <9BC8> <C358> <C358> <9BC0> <C359> <C359> <9D51> <C35A> <C35A> <9D5D> <C35B> <C35B> <9D60> <C35C> <C35C> <9EE0> <C35D> <C35D> <9F15> <C35E> <C35E> <9F2C> <C35F> <C35F> <5133> <C360> <C360> <56A5> <C361> <C362> <58DE> <C363> <C363> <58E2> <C364> <C364> <5BF5> <C365> <C365> <9F90> <C366> <C366> <5EEC> <C367> <C367> <61F2> endbfrange 100 beginbfrange <C368> <C368> <61F7> <C369> <C369> <61F6> <C36A> <C36A> <61F5> <C36B> <C36B> <6500> <C36C> <C36C> <650F> <C36D> <C36D> <66E0> <C36E> <C36E> <66DD> <C36F> <C36F> <6AE5> <C370> <C370> <6ADD> <C371> <C371> <6ADA> <C372> <C372> <6AD3> <C373> <C373> <701B> <C374> <C374> <701F> <C375> <C375> <7028> <C376> <C376> <701A> <C377> <C377> <701D> <C378> <C378> <7015> <C379> <C379> <7018> <C37A> <C37A> <7206> <C37B> <C37B> <720D> <C37C> <C37C> <7258> <C37D> <C37D> <72A2> <C37E> <C37E> <7378> <C3A1> <C3A1> <737A> <C3A2> <C3A2> <74BD> <C3A3> <C3A3> <74CA> <C3A4> <C3A4> <74E3> <C3A5> <C3A5> <7587> <C3A6> <C3A6> <7586> <C3A7> <C3A7> <765F> <C3A8> <C3A8> <7661> <C3A9> <C3A9> <77C7> <C3AA> <C3AA> <7919> <C3AB> <C3AB> <79B1> <C3AC> <C3AC> <7A6B> <C3AD> <C3AD> <7A69> <C3AE> <C3AF> <7C3E> <C3B0> <C3B0> <7C38> <C3B1> <C3B1> <7C3D> <C3B2> <C3B2> <7C37> <C3B3> <C3B3> <7C40> <C3B4> <C3B4> <7E6B> <C3B5> <C3B5> <7E6D> <C3B6> <C3B6> <7E79> <C3B7> <C3B8> <7E69> <C3B9> <C3B9> <7F85> <C3BA> <C3BA> <7E73> <C3BB> <C3BB> <7FB6> <C3BC> <C3BC> <7FB9> <C3BD> <C3BD> <7FB8> <C3BE> <C3BE> <81D8> <C3BF> <C3BF> <85E9> <C3C0> <C3C0> <85DD> <C3C1> <C3C1> <85EA> <C3C2> <C3C2> <85D5> <C3C3> <C3C4> <85E4> <C3C5> <C3C5> <85F7> <C3C6> <C3C6> <87FB> <C3C7> <C3C7> <8805> <C3C8> <C3C8> <880D> <C3C9> <C3C9> <87F9> <C3CA> <C3CA> <87FE> <C3CB> <C3CB> <8960> <C3CC> <C3CC> <895F> <C3CD> <C3CD> <8956> <C3CE> <C3CE> <895E> <C3CF> <C3CF> <8B41> <C3D0> <C3D0> <8B5C> <C3D1> <C3D1> <8B58> <C3D2> <C3D2> <8B49> <C3D3> <C3D3> <8B5A> <C3D4> <C3D5> <8B4E> <C3D6> <C3D6> <8B46> <C3D7> <C3D7> <8B59> <C3D8> <C3D8> <8D08> <C3D9> <C3D9> <8D0A> <C3DA> <C3DA> <8E7C> <C3DB> <C3DB> <8E72> <C3DC> <C3DC> <8E87> <C3DD> <C3DD> <8E76> <C3DE> <C3DE> <8E6C> <C3DF> <C3DF> <8E7A> <C3E0> <C3E0> <8E74> <C3E1> <C3E1> <8F54> <C3E2> <C3E2> <8F4E> <C3E3> <C3E3> <8FAD> <C3E4> <C3E5> <908A> <C3E6> <C3E6> <91B1> <C3E7> <C3E7> <91AE> <C3E8> <C3E8> <93E1> <C3E9> <C3E9> <93D1> <C3EA> <C3EA> <93DF> <C3EB> <C3EB> <93C3> <C3EC> <C3EC> <93C8> <C3ED> <C3EE> <93DC> <C3EF> <C3EF> <93D6> <C3F0> <C3F0> <93E2> <C3F1> <C3F1> <93CD> <C3F2> <C3F2> <93D8> <C3F3> <C3F3> <93E4> endbfrange 100 beginbfrange <C3F4> <C3F4> <93D7> <C3F5> <C3F5> <93E8> <C3F6> <C3F6> <95DC> <C3F7> <C3F7> <96B4> <C3F8> <C3F8> <96E3> <C3F9> <C3F9> <972A> <C3FA> <C3FA> <9727> <C3FB> <C3FB> <9761> <C3FC> <C3FC> <97DC> <C3FD> <C3FD> <97FB> <C3FE> <C3FE> <985E> <C440> <C440> <9858> <C441> <C441> <985B> <C442> <C442> <98BC> <C443> <C443> <9945> <C444> <C444> <9949> <C445> <C445> <9A16> <C446> <C446> <9A19> <C447> <C447> <9B0D> <C448> <C448> <9BE8> <C449> <C449> <9BE7> <C44A> <C44A> <9BD6> <C44B> <C44B> <9BDB> <C44C> <C44C> <9D89> <C44D> <C44D> <9D61> <C44E> <C44E> <9D72> <C44F> <C44F> <9D6A> <C450> <C450> <9D6C> <C451> <C451> <9E92> <C452> <C452> <9E97> <C453> <C453> <9E93> <C454> <C454> <9EB4> <C455> <C455> <52F8> <C456> <C456> <56A8> <C457> <C457> <56B7> <C458> <C458> <56B6> <C459> <C459> <56B4> <C45A> <C45A> <56BC> <C45B> <C45B> <58E4> <C45C> <C45C> <5B40> <C45D> <C45D> <5B43> <C45E> <C45E> <5B7D> <C45F> <C45F> <5BF6> <C460> <C460> <5DC9> <C461> <C461> <61F8> <C462> <C462> <61FA> <C463> <C463> <6518> <C464> <C464> <6514> <C465> <C465> <6519> <C466> <C466> <66E6> <C467> <C467> <6727> <C468> <C468> <6AEC> <C469> <C469> <703E> <C46A> <C46A> <7030> <C46B> <C46B> <7032> <C46C> <C46C> <7210> <C46D> <C46D> <737B> <C46E> <C46E> <74CF> <C46F> <C46F> <7662> <C470> <C470> <7665> <C471> <C471> <7926> <C472> <C472> <792A> <C473> <C473> <792C> <C474> <C474> <792B> <C475> <C475> <7AC7> <C476> <C476> <7AF6> <C477> <C477> <7C4C> <C478> <C478> <7C43> <C479> <C479> <7C4D> <C47A> <C47B> <7CEF> <C47C> <C47C> <8FAE> <C47D> <C47D> <7E7D> <C47E> <C47E> <7E7C> <C4A1> <C4A1> <7E82> <C4A2> <C4A2> <7F4C> <C4A3> <C4A3> <8000> <C4A4> <C4A4> <81DA> <C4A5> <C4A5> <8266> <C4A6> <C4A6> <85FB> <C4A7> <C4A7> <85F9> <C4A8> <C4A8> <8611> <C4A9> <C4A9> <85FA> <C4AA> <C4AA> <8606> <C4AB> <C4AB> <860B> <C4AC> <C4AC> <8607> <C4AD> <C4AD> <860A> <C4AE> <C4AF> <8814> <C4B0> <C4B0> <8964> <C4B1> <C4B1> <89BA> <C4B2> <C4B2> <89F8> <C4B3> <C4B3> <8B70> <C4B4> <C4B4> <8B6C> <C4B5> <C4B5> <8B66> <C4B6> <C4B6> <8B6F> <C4B7> <C4B7> <8B5F> <C4B8> <C4B8> <8B6B> <C4B9> <C4B9> <8D0F> <C4BA> <C4BA> <8D0D> <C4BB> <C4BB> <8E89> <C4BC> <C4BC> <8E81> endbfrange 100 beginbfrange <C4BD> <C4BD> <8E85> <C4BE> <C4BE> <8E82> <C4BF> <C4BF> <91B4> <C4C0> <C4C0> <91CB> <C4C1> <C4C1> <9418> <C4C2> <C4C2> <9403> <C4C3> <C4C3> <93FD> <C4C4> <C4C4> <95E1> <C4C5> <C4C5> <9730> <C4C6> <C4C6> <98C4> <C4C7> <C4C7> <9952> <C4C8> <C4C8> <9951> <C4C9> <C4C9> <99A8> <C4CA> <C4CA> <9A2B> <C4CB> <C4CB> <9A30> <C4CC> <C4CC> <9A37> <C4CD> <C4CD> <9A35> <C4CE> <C4CE> <9C13> <C4CF> <C4CF> <9C0D> <C4D0> <C4D0> <9E79> <C4D1> <C4D1> <9EB5> <C4D2> <C4D2> <9EE8> <C4D3> <C4D3> <9F2F> <C4D4> <C4D4> <9F5F> <C4D5> <C4D5> <9F63> <C4D6> <C4D6> <9F61> <C4D7> <C4D8> <5137> <C4D9> <C4D9> <56C1> <C4DA> <C4DA> <56C0> <C4DB> <C4DB> <56C2> <C4DC> <C4DC> <5914> <C4DD> <C4DD> <5C6C> <C4DE> <C4DE> <5DCD> <C4DF> <C4DF> <61FC> <C4E0> <C4E0> <61FE> <C4E1> <C4E1> <651D> <C4E2> <C4E2> <651C> <C4E3> <C4E3> <6595> <C4E4> <C4E4> <66E9> <C4E5> <C4E5> <6AFB> <C4E6> <C4E6> <6B04> <C4E7> <C4E7> <6AFA> <C4E8> <C4E8> <6BB2> <C4E9> <C4E9> <704C> <C4EA> <C4EA> <721B> <C4EB> <C4EB> <72A7> <C4EC> <C4EC> <74D6> <C4ED> <C4ED> <74D4> <C4EE> <C4EE> <7669> <C4EF> <C4EF> <77D3> <C4F0> <C4F0> <7C50> <C4F1> <C4F1> <7E8F> <C4F2> <C4F2> <7E8C> <C4F3> <C4F3> <7FBC> <C4F4> <C4F4> <8617> <C4F5> <C4F5> <862D> <C4F6> <C4F6> <861A> <C4F7> <C4F7> <8823> <C4F8> <C4F8> <8822> <C4F9> <C4F9> <8821> <C4FA> <C4FA> <881F> <C4FB> <C4FB> <896A> <C4FC> <C4FC> <896C> <C4FD> <C4FD> <89BD> <C4FE> <C4FE> <8B74> <C540> <C540> <8B77> <C541> <C541> <8B7D> <C542> <C542> <8D13> <C543> <C543> <8E8A> <C544> <C544> <8E8D> <C545> <C545> <8E8B> <C546> <C546> <8F5F> <C547> <C547> <8FAF> <C548> <C548> <91BA> <C549> <C549> <942E> <C54A> <C54A> <9433> <C54B> <C54B> <9435> <C54C> <C54C> <943A> <C54D> <C54D> <9438> <C54E> <C54E> <9432> <C54F> <C54F> <942B> <C550> <C550> <95E2> <C551> <C552> <9738> <C553> <C553> <9732> <C554> <C554> <97FF> <C555> <C555> <9867> <C556> <C556> <9865> <C557> <C557> <9957> <C558> <C558> <9A45> <C559> <C559> <9A43> <C55A> <C55A> <9A40> <C55B> <C55B> <9A3E> <C55C> <C55C> <9ACF> <C55D> <C55D> <9B54> <C55E> <C55E> <9B51> <C55F> <C55F> <9C2D> <C560> <C560> <9C25> <C561> <C561> <9DAF> <C562> <C562> <9DB4> <C563> <C563> <9DC2> endbfrange 100 beginbfrange <C564> <C564> <9DB8> <C565> <C565> <9E9D> <C566> <C566> <9EEF> <C567> <C567> <9F19> <C568> <C568> <9F5C> <C569> <C56A> <9F66> <C56B> <C56B> <513C> <C56C> <C56C> <513B> <C56D> <C56D> <56C8> <C56E> <C56E> <56CA> <C56F> <C56F> <56C9> <C570> <C570> <5B7F> <C571> <C571> <5DD4> <C572> <C572> <5DD2> <C573> <C573> <5F4E> <C574> <C574> <61FF> <C575> <C575> <6524> <C576> <C576> <6B0A> <C577> <C577> <6B61> <C578> <C578> <7051> <C579> <C579> <7058> <C57A> <C57A> <7380> <C57B> <C57B> <74E4> <C57C> <C57C> <758A> <C57D> <C57D> <766E> <C57E> <C57E> <766C> <C5A1> <C5A1> <79B3> <C5A2> <C5A2> <7C60> <C5A3> <C5A3> <7C5F> <C5A4> <C5A4> <807E> <C5A5> <C5A5> <807D> <C5A6> <C5A6> <81DF> <C5A7> <C5A7> <8972> <C5A8> <C5A8> <896F> <C5A9> <C5A9> <89FC> <C5AA> <C5AA> <8B80> <C5AB> <C5AC> <8D16> <C5AD> <C5AD> <8E91> <C5AE> <C5AE> <8E93> <C5AF> <C5AF> <8F61> <C5B0> <C5B0> <9148> <C5B1> <C5B1> <9444> <C5B2> <C5B3> <9451> <C5B4> <C5B5> <973D> <C5B6> <C5B6> <97C3> <C5B7> <C5B7> <97C1> <C5B8> <C5B8> <986B> <C5B9> <C5B9> <9955> <C5BA> <C5BA> <9A55> <C5BB> <C5BB> <9A4D> <C5BC> <C5BC> <9AD2> <C5BD> <C5BD> <9B1A> <C5BE> <C5BE> <9C49> <C5BF> <C5BF> <9C31> <C5C0> <C5C0> <9C3E> <C5C1> <C5C1> <9C3B> <C5C2> <C5C2> <9DD3> <C5C3> <C5C3> <9DD7> <C5C4> <C5C4> <9F34> <C5C5> <C5C5> <9F6C> <C5C6> <C5C6> <9F6A> <C5C7> <C5C7> <9F94> <C5C8> <C5C8> <56CC> <C5C9> <C5C9> <5DD6> <C5CA> <C5CA> <6200> <C5CB> <C5CB> <6523> <C5CC> <C5CC> <652B> <C5CD> <C5CD> <652A> <C5CE> <C5CE> <66EC> <C5CF> <C5CF> <6B10> <C5D0> <C5D0> <74DA> <C5D1> <C5D1> <7ACA> <C5D2> <C5D2> <7C64> <C5D3> <C5D3> <7C63> <C5D4> <C5D4> <7C65> <C5D5> <C5D5> <7E93> <C5D6> <C5D6> <7E96> <C5D7> <C5D7> <7E94> <C5D8> <C5D8> <81E2> <C5D9> <C5D9> <8638> <C5DA> <C5DA> <863F> <C5DB> <C5DB> <8831> <C5DC> <C5DC> <8B8A> <C5DD> <C5DD> <9090> <C5DE> <C5DE> <908F> <C5DF> <C5DF> <9463> <C5E0> <C5E0> <9460> <C5E1> <C5E1> <9464> <C5E2> <C5E2> <9768> <C5E3> <C5E3> <986F> <C5E4> <C5E4> <995C> <C5E5> <C5E6> <9A5A> <C5E7> <C5E7> <9A57> <C5E8> <C5E9> <9AD3> <C5EA> <C5EA> <9AD1> <C5EB> <C5EB> <9C54> <C5EC> <C5EC> <9C57> <C5ED> <C5ED> <9C56> <C5EE> <C5EE> <9DE5> <C5EF> <C5EF> <9E9F> endbfrange 100 beginbfrange <C5F0> <C5F0> <9EF4> <C5F1> <C5F1> <56D1> <C5F2> <C5F2> <58E9> <C5F3> <C5F3> <652C> <C5F4> <C5F4> <705E> <C5F5> <C5F6> <7671> <C5F7> <C5F7> <77D7> <C5F8> <C5F8> <7F50> <C5F9> <C5F9> <7F88> <C5FA> <C5FA> <8836> <C5FB> <C5FB> <8839> <C5FC> <C5FC> <8862> <C5FD> <C5FD> <8B93> <C5FE> <C5FE> <8B92> <C640> <C640> <8B96> <C641> <C641> <8277> <C642> <C642> <8D1B> <C643> <C643> <91C0> <C644> <C644> <946A> <C645> <C645> <9742> <C646> <C646> <9748> <C647> <C647> <9744> <C648> <C648> <97C6> <C649> <C649> <9870> <C64A> <C64A> <9A5F> <C64B> <C64B> <9B22> <C64C> <C64C> <9B58> <C64D> <C64D> <9C5F> <C64E> <C64F> <9DF9> <C650> <C651> <9E7C> <C652> <C652> <9F07> <C653> <C653> <9F77> <C654> <C654> <9F72> <C655> <C655> <5EF3> <C656> <C656> <6B16> <C657> <C657> <7063> <C658> <C658> <7C6C> <C659> <C659> <7C6E> <C65A> <C65A> <883B> <C65B> <C65B> <89C0> <C65C> <C65C> <8EA1> <C65D> <C65D> <91C1> <C65E> <C65E> <9472> <C65F> <C65F> <9470> <C660> <C660> <9871> <C661> <C661> <995E> <C662> <C662> <9AD6> <C663> <C663> <9B23> <C664> <C664> <9ECC> <C665> <C665> <7064> <C666> <C666> <77DA> <C667> <C667> <8B9A> <C668> <C668> <9477> <C669> <C669> <97C9> <C66A> <C66A> <9A62> <C66B> <C66B> <9A65> <C66C> <C66C> <7E9C> <C66D> <C66D> <8B9C> <C66E> <C66E> <8EAA> <C66F> <C66F> <91C5> <C670> <C671> <947D> <C672> <C672> <947C> <C673> <C674> <9C77> <C675> <C675> <9EF7> <C676> <C676> <8C54> <C677> <C677> <947F> <C678> <C678> <9E1A> <C679> <C679> <7228> <C67A> <C67A> <9A6A> <C67B> <C67B> <9B31> <C67C> <C67C> <9E1B> <C67D> <C67D> <9E1E> <C67E> <C67E> <7C72> <C940> <C940> <4E42> <C941> <C941> <4E5C> <C942> <C942> <51F5> <C943> <C943> <531A> <C944> <C944> <5382> <C945> <C945> <4E07> <C946> <C946> <4E0C> <C947> <C947> <4E47> <C948> <C948> <4E8D> <C949> <C949> <56D7> <C94A> <C94A> <FA0C> <C94B> <C94B> <5C6E> <C94C> <C94C> <5F73> <C94D> <C94D> <4E0F> <C94E> <C94E> <5187> <C94F> <C94F> <4E0E> <C950> <C950> <4E2E> <C951> <C951> <4E93> <C952> <C952> <4EC2> <C953> <C953> <4EC9> <C954> <C954> <4EC8> <C955> <C955> <5198> <C956> <C956> <52FC> <C957> <C957> <536C> <C958> <C958> <53B9> <C959> <C959> <5720> <C95A> <C95A> <5903> endbfrange 100 beginbfrange <C95B> <C95B> <592C> <C95C> <C95C> <5C10> <C95D> <C95D> <5DFF> <C95E> <C95E> <65E1> <C95F> <C95F> <6BB3> <C960> <C960> <6BCC> <C961> <C961> <6C14> <C962> <C962> <723F> <C963> <C963> <4E31> <C964> <C964> <4E3C> <C965> <C965> <4EE8> <C966> <C966> <4EDC> <C967> <C967> <4EE9> <C968> <C968> <4EE1> <C969> <C969> <4EDD> <C96A> <C96A> <4EDA> <C96B> <C96B> <520C> <C96C> <C96C> <531C> <C96D> <C96D> <534C> <C96E> <C96F> <5722> <C970> <C970> <5917> <C971> <C971> <592F> <C972> <C972> <5B81> <C973> <C973> <5B84> <C974> <C974> <5C12> <C975> <C975> <5C3B> <C976> <C976> <5C74> <C977> <C977> <5C73> <C978> <C978> <5E04> <C979> <C979> <5E80> <C97A> <C97A> <5E82> <C97B> <C97B> <5FC9> <C97C> <C97C> <6209> <C97D> <C97D> <6250> <C97E> <C97E> <6C15> <C9A1> <C9A1> <6C36> <C9A2> <C9A2> <6C43> <C9A3> <C9A3> <6C3F> <C9A4> <C9A4> <6C3B> <C9A5> <C9A5> <72AE> <C9A6> <C9A6> <72B0> <C9A7> <C9A7> <738A> <C9A8> <C9A8> <79B8> <C9A9> <C9A9> <808A> <C9AA> <C9AA> <961E> <C9AB> <C9AB> <4F0E> <C9AC> <C9AC> <4F18> <C9AD> <C9AD> <4F2C> <C9AE> <C9AE> <4EF5> <C9AF> <C9AF> <4F14> <C9B0> <C9B0> <4EF1> <C9B1> <C9B1> <4F00> <C9B2> <C9B2> <4EF7> <C9B3> <C9B3> <4F08> <C9B4> <C9B4> <4F1D> <C9B5> <C9B5> <4F02> <C9B6> <C9B6> <4F05> <C9B7> <C9B7> <4F22> <C9B8> <C9B8> <4F13> <C9B9> <C9B9> <4F04> <C9BA> <C9BA> <4EF4> <C9BB> <C9BB> <4F12> <C9BC> <C9BC> <51B1> <C9BD> <C9BD> <5213> <C9BE> <C9BE> <5209> <C9BF> <C9BF> <5210> <C9C0> <C9C0> <52A6> <C9C1> <C9C1> <5322> <C9C2> <C9C2> <531F> <C9C3> <C9C3> <534D> <C9C4> <C9C4> <538A> <C9C5> <C9C5> <5407> <C9C6> <C9C6> <56E1> <C9C7> <C9C7> <56DF> <C9C8> <C9C8> <572E> <C9C9> <C9C9> <572A> <C9CA> <C9CA> <5734> <C9CB> <C9CB> <593C> <C9CC> <C9CC> <5980> <C9CD> <C9CD> <597C> <C9CE> <C9CE> <5985> <C9CF> <C9CF> <597B> <C9D0> <C9D0> <597E> <C9D1> <C9D1> <5977> <C9D2> <C9D2> <597F> <C9D3> <C9D3> <5B56> <C9D4> <C9D4> <5C15> <C9D5> <C9D5> <5C25> <C9D6> <C9D6> <5C7C> <C9D7> <C9D8> <5C7A> <C9D9> <C9D9> <5C7E> <C9DA> <C9DA> <5DDF> <C9DB> <C9DB> <5E75> <C9DC> <C9DC> <5E84> <C9DD> <C9DD> <5F02> <C9DE> <C9DE> <5F1A> <C9DF> <C9DF> <5F74> <C9E0> <C9E0> <5FD5> <C9E1> <C9E1> <5FD4> <C9E2> <C9E2> <5FCF> endbfrange 100 beginbfrange <C9E3> <C9E3> <625C> <C9E4> <C9E4> <625E> <C9E5> <C9E5> <6264> <C9E6> <C9E6> <6261> <C9E7> <C9E7> <6266> <C9E8> <C9E8> <6262> <C9E9> <C9E9> <6259> <C9EA> <C9EA> <6260> <C9EB> <C9EB> <625A> <C9EC> <C9EC> <6265> <C9ED> <C9ED> <65EF> <C9EE> <C9EE> <65EE> <C9EF> <C9EF> <673E> <C9F0> <C9F0> <6739> <C9F1> <C9F1> <6738> <C9F2> <C9F2> <673B> <C9F3> <C9F3> <673A> <C9F4> <C9F4> <673F> <C9F5> <C9F5> <673C> <C9F6> <C9F6> <6733> <C9F7> <C9F7> <6C18> <C9F8> <C9F8> <6C46> <C9F9> <C9F9> <6C52> <C9FA> <C9FA> <6C5C> <C9FB> <C9FB> <6C4F> <C9FC> <C9FC> <6C4A> <C9FD> <C9FD> <6C54> <C9FE> <C9FE> <6C4B> <CA40> <CA40> <6C4C> <CA41> <CA41> <7071> <CA42> <CA42> <725E> <CA43> <CA44> <72B4> <CA45> <CA45> <738E> <CA46> <CA46> <752A> <CA47> <CA47> <767F> <CA48> <CA48> <7A75> <CA49> <CA49> <7F51> <CA4A> <CA4A> <8278> <CA4B> <CA4B> <827C> <CA4C> <CA4C> <8280> <CA4D> <CA4D> <827D> <CA4E> <CA4E> <827F> <CA4F> <CA4F> <864D> <CA50> <CA50> <897E> <CA51> <CA51> <9099> <CA52> <CA53> <9097> <CA54> <CA54> <909B> <CA55> <CA55> <9094> <CA56> <CA56> <9622> <CA57> <CA57> <9624> <CA58> <CA58> <9620> <CA59> <CA59> <9623> <CA5A> <CA5A> <4F56> <CA5B> <CA5B> <4F3B> <CA5C> <CA5C> <4F62> <CA5D> <CA5D> <4F49> <CA5E> <CA5E> <4F53> <CA5F> <CA5F> <4F64> <CA60> <CA60> <4F3E> <CA61> <CA61> <4F67> <CA62> <CA62> <4F52> <CA63> <CA63> <4F5F> <CA64> <CA64> <4F41> <CA65> <CA65> <4F58> <CA66> <CA66> <4F2D> <CA67> <CA67> <4F33> <CA68> <CA68> <4F3F> <CA69> <CA69> <4F61> <CA6A> <CA6A> <518F> <CA6B> <CA6B> <51B9> <CA6C> <CA6C> <521C> <CA6D> <CA6D> <521E> <CA6E> <CA6E> <5221> <CA6F> <CA70> <52AD> <CA71> <CA71> <5309> <CA72> <CA72> <5363> <CA73> <CA73> <5372> <CA74> <CA75> <538E> <CA76> <CA76> <5430> <CA77> <CA77> <5437> <CA78> <CA78> <542A> <CA79> <CA79> <5454> <CA7A> <CA7A> <5445> <CA7B> <CA7B> <5419> <CA7C> <CA7C> <541C> <CA7D> <CA7D> <5425> <CA7E> <CA7E> <5418> <CAA1> <CAA1> <543D> <CAA2> <CAA2> <544F> <CAA3> <CAA3> <5441> <CAA4> <CAA4> <5428> <CAA5> <CAA5> <5424> <CAA6> <CAA6> <5447> <CAA7> <CAA7> <56EE> <CAA8> <CAA8> <56E7> <CAA9> <CAA9> <56E5> <CAAA> <CAAA> <5741> <CAAB> <CAAB> <5745> <CAAC> <CAAC> <574C> <CAAD> <CAAD> <5749> endbfrange 100 beginbfrange <CAAE> <CAAE> <574B> <CAAF> <CAAF> <5752> <CAB0> <CAB0> <5906> <CAB1> <CAB1> <5940> <CAB2> <CAB2> <59A6> <CAB3> <CAB3> <5998> <CAB4> <CAB4> <59A0> <CAB5> <CAB5> <5997> <CAB6> <CAB6> <598E> <CAB7> <CAB7> <59A2> <CAB8> <CAB8> <5990> <CAB9> <CAB9> <598F> <CABA> <CABA> <59A7> <CABB> <CABB> <59A1> <CABC> <CABC> <5B8E> <CABD> <CABD> <5B92> <CABE> <CABE> <5C28> <CABF> <CABF> <5C2A> <CAC0> <CAC0> <5C8D> <CAC1> <CAC1> <5C8F> <CAC2> <CAC2> <5C88> <CAC3> <CAC3> <5C8B> <CAC4> <CAC4> <5C89> <CAC5> <CAC5> <5C92> <CAC6> <CAC6> <5C8A> <CAC7> <CAC7> <5C86> <CAC8> <CAC8> <5C93> <CAC9> <CAC9> <5C95> <CACA> <CACA> <5DE0> <CACB> <CACB> <5E0A> <CACC> <CACC> <5E0E> <CACD> <CACD> <5E8B> <CACE> <CACE> <5E89> <CACF> <CACF> <5E8C> <CAD0> <CAD0> <5E88> <CAD1> <CAD1> <5E8D> <CAD2> <CAD2> <5F05> <CAD3> <CAD3> <5F1D> <CAD4> <CAD4> <5F78> <CAD5> <CAD5> <5F76> <CAD6> <CAD6> <5FD2> <CAD7> <CAD7> <5FD1> <CAD8> <CAD8> <5FD0> <CAD9> <CAD9> <5FED> <CADA> <CADA> <5FE8> <CADB> <CADB> <5FEE> <CADC> <CADC> <5FF3> <CADD> <CADD> <5FE1> <CADE> <CADE> <5FE4> <CADF> <CADF> <5FE3> <CAE0> <CAE0> <5FFA> <CAE1> <CAE1> <5FEF> <CAE2> <CAE2> <5FF7> <CAE3> <CAE3> <5FFB> <CAE4> <CAE4> <6000> <CAE5> <CAE5> <5FF4> <CAE6> <CAE6> <623A> <CAE7> <CAE7> <6283> <CAE8> <CAE8> <628C> <CAE9> <CAEA> <628E> <CAEB> <CAEB> <6294> <CAEC> <CAEC> <6287> <CAED> <CAED> <6271> <CAEE> <CAEE> <627B> <CAEF> <CAEF> <627A> <CAF0> <CAF0> <6270> <CAF1> <CAF1> <6281> <CAF2> <CAF2> <6288> <CAF3> <CAF3> <6277> <CAF4> <CAF4> <627D> <CAF5> <CAF5> <6272> <CAF6> <CAF6> <6274> <CAF7> <CAF7> <6537> <CAF8> <CAF8> <65F0> <CAF9> <CAF9> <65F4> <CAFA> <CAFA> <65F3> <CAFB> <CAFB> <65F2> <CAFC> <CAFC> <65F5> <CAFD> <CAFD> <6745> <CAFE> <CAFE> <6747> <CB40> <CB40> <6759> <CB41> <CB41> <6755> <CB42> <CB42> <674C> <CB43> <CB43> <6748> <CB44> <CB44> <675D> <CB45> <CB45> <674D> <CB46> <CB46> <675A> <CB47> <CB47> <674B> <CB48> <CB48> <6BD0> <CB49> <CB4A> <6C19> <CB4B> <CB4B> <6C78> <CB4C> <CB4C> <6C67> <CB4D> <CB4D> <6C6B> <CB4E> <CB4E> <6C84> <CB4F> <CB4F> <6C8B> <CB50> <CB50> <6C8F> <CB51> <CB51> <6C71> <CB52> <CB52> <6C6F> <CB53> <CB53> <6C69> <CB54> <CB54> <6C9A> endbfrange 100 beginbfrange <CB55> <CB55> <6C6D> <CB56> <CB56> <6C87> <CB57> <CB57> <6C95> <CB58> <CB58> <6C9C> <CB59> <CB59> <6C66> <CB5A> <CB5A> <6C73> <CB5B> <CB5B> <6C65> <CB5C> <CB5C> <6C7B> <CB5D> <CB5D> <6C8E> <CB5E> <CB5E> <7074> <CB5F> <CB5F> <707A> <CB60> <CB60> <7263> <CB61> <CB61> <72BF> <CB62> <CB62> <72BD> <CB63> <CB63> <72C3> <CB64> <CB64> <72C6> <CB65> <CB65> <72C1> <CB66> <CB66> <72BA> <CB67> <CB67> <72C5> <CB68> <CB68> <7395> <CB69> <CB69> <7397> <CB6A> <CB6B> <7393> <CB6C> <CB6C> <7392> <CB6D> <CB6D> <753A> <CB6E> <CB6E> <7539> <CB6F> <CB70> <7594> <CB71> <CB71> <7681> <CB72> <CB72> <793D> <CB73> <CB73> <8034> <CB74> <CB74> <8095> <CB75> <CB75> <8099> <CB76> <CB76> <8090> <CB77> <CB77> <8092> <CB78> <CB78> <809C> <CB79> <CB79> <8290> <CB7A> <CB7A> <828F> <CB7B> <CB7B> <8285> <CB7C> <CB7C> <828E> <CB7D> <CB7D> <8291> <CB7E> <CB7E> <8293> <CBA1> <CBA1> <828A> <CBA2> <CBA3> <8283> <CBA4> <CBA4> <8C78> <CBA5> <CBA5> <8FC9> <CBA6> <CBA6> <8FBF> <CBA7> <CBA7> <909F> <CBA8> <CBA8> <90A1> <CBA9> <CBA9> <90A5> <CBAA> <CBAA> <909E> <CBAB> <CBAB> <90A7> <CBAC> <CBAC> <90A0> <CBAD> <CBAD> <9630> <CBAE> <CBAE> <9628> <CBAF> <CBAF> <962F> <CBB0> <CBB0> <962D> <CBB1> <CBB1> <4E33> <CBB2> <CBB2> <4F98> <CBB3> <CBB3> <4F7C> <CBB4> <CBB4> <4F85> <CBB5> <CBB5> <4F7D> <CBB6> <CBB6> <4F80> <CBB7> <CBB7> <4F87> <CBB8> <CBB8> <4F76> <CBB9> <CBB9> <4F74> <CBBA> <CBBA> <4F89> <CBBB> <CBBB> <4F84> <CBBC> <CBBC> <4F77> <CBBD> <CBBD> <4F4C> <CBBE> <CBBE> <4F97> <CBBF> <CBBF> <4F6A> <CBC0> <CBC0> <4F9A> <CBC1> <CBC1> <4F79> <CBC2> <CBC2> <4F81> <CBC3> <CBC3> <4F78> <CBC4> <CBC4> <4F90> <CBC5> <CBC5> <4F9C> <CBC6> <CBC6> <4F94> <CBC7> <CBC7> <4F9E> <CBC8> <CBC8> <4F92> <CBC9> <CBC9> <4F82> <CBCA> <CBCA> <4F95> <CBCB> <CBCB> <4F6B> <CBCC> <CBCC> <4F6E> <CBCD> <CBCD> <519E> <CBCE> <CBCE> <51BC> <CBCF> <CBCF> <51BE> <CBD0> <CBD0> <5235> <CBD1> <CBD2> <5232> <CBD3> <CBD3> <5246> <CBD4> <CBD4> <5231> <CBD5> <CBD5> <52BC> <CBD6> <CBD7> <530A> <CBD8> <CBD8> <533C> <CBD9> <CBD9> <5392> <CBDA> <CBDA> <5394> <CBDB> <CBDB> <5487> <CBDC> <CBDC> <547F> <CBDD> <CBDD> <5481> <CBDE> <CBDE> <5491> <CBDF> <CBDF> <5482> endbfrange 100 beginbfrange <CBE0> <CBE0> <5488> <CBE1> <CBE1> <546B> <CBE2> <CBE2> <547A> <CBE3> <CBE3> <547E> <CBE4> <CBE4> <5465> <CBE5> <CBE5> <546C> <CBE6> <CBE6> <5474> <CBE7> <CBE7> <5466> <CBE8> <CBE8> <548D> <CBE9> <CBE9> <546F> <CBEA> <CBEA> <5461> <CBEB> <CBEB> <5460> <CBEC> <CBEC> <5498> <CBED> <CBED> <5463> <CBEE> <CBEE> <5467> <CBEF> <CBEF> <5464> <CBF0> <CBF0> <56F7> <CBF1> <CBF1> <56F9> <CBF2> <CBF2> <576F> <CBF3> <CBF3> <5772> <CBF4> <CBF4> <576D> <CBF5> <CBF5> <576B> <CBF6> <CBF6> <5771> <CBF7> <CBF7> <5770> <CBF8> <CBF8> <5776> <CBF9> <CBF9> <5780> <CBFA> <CBFA> <5775> <CBFB> <CBFB> <577B> <CBFC> <CBFD> <5773> <CBFE> <CBFE> <5762> <CC40> <CC40> <5768> <CC41> <CC41> <577D> <CC42> <CC42> <590C> <CC43> <CC43> <5945> <CC44> <CC44> <59B5> <CC45> <CC45> <59BA> <CC46> <CC46> <59CF> <CC47> <CC47> <59CE> <CC48> <CC48> <59B2> <CC49> <CC49> <59CC> <CC4A> <CC4A> <59C1> <CC4B> <CC4B> <59B6> <CC4C> <CC4C> <59BC> <CC4D> <CC4D> <59C3> <CC4E> <CC4E> <59D6> <CC4F> <CC4F> <59B1> <CC50> <CC50> <59BD> <CC51> <CC51> <59C0> <CC52> <CC52> <59C8> <CC53> <CC53> <59B4> <CC54> <CC54> <59C7> <CC55> <CC55> <5B62> <CC56> <CC56> <5B65> <CC57> <CC57> <5B93> <CC58> <CC58> <5B95> <CC59> <CC59> <5C44> <CC5A> <CC5A> <5C47> <CC5B> <CC5B> <5CAE> <CC5C> <CC5C> <5CA4> <CC5D> <CC5D> <5CA0> <CC5E> <CC5E> <5CB5> <CC5F> <CC5F> <5CAF> <CC60> <CC60> <5CA8> <CC61> <CC61> <5CAC> <CC62> <CC62> <5C9F> <CC63> <CC63> <5CA3> <CC64> <CC64> <5CAD> <CC65> <CC65> <5CA2> <CC66> <CC66> <5CAA> <CC67> <CC67> <5CA7> <CC68> <CC68> <5C9D> <CC69> <CC69> <5CA5> <CC6A> <CC6A> <5CB6> <CC6B> <CC6B> <5CB0> <CC6C> <CC6C> <5CA6> <CC6D> <CC6D> <5E17> <CC6E> <CC6E> <5E14> <CC6F> <CC6F> <5E19> <CC70> <CC70> <5F28> <CC71> <CC73> <5F22> <CC74> <CC74> <5F54> <CC75> <CC75> <5F82> <CC76> <CC76> <5F7E> <CC77> <CC77> <5F7D> <CC78> <CC78> <5FDE> <CC79> <CC79> <5FE5> <CC7A> <CC7A> <602D> <CC7B> <CC7B> <6026> <CC7C> <CC7C> <6019> <CC7D> <CC7D> <6032> <CC7E> <CC7E> <600B> <CCA1> <CCA1> <6034> <CCA2> <CCA2> <600A> <CCA3> <CCA3> <6017> <CCA4> <CCA4> <6033> <CCA5> <CCA5> <601A> <CCA6> <CCA6> <601E> <CCA7> <CCA7> <602C> <CCA8> <CCA8> <6022> <CCA9> <CCA9> <600D> endbfrange 100 beginbfrange <CCAA> <CCAA> <6010> <CCAB> <CCAB> <602E> <CCAC> <CCAC> <6013> <CCAD> <CCAD> <6011> <CCAE> <CCAE> <600C> <CCAF> <CCAF> <6009> <CCB0> <CCB0> <601C> <CCB1> <CCB1> <6214> <CCB2> <CCB2> <623D> <CCB3> <CCB3> <62AD> <CCB4> <CCB4> <62B4> <CCB5> <CCB5> <62D1> <CCB6> <CCB6> <62BE> <CCB7> <CCB7> <62AA> <CCB8> <CCB8> <62B6> <CCB9> <CCB9> <62CA> <CCBA> <CCBA> <62AE> <CCBB> <CCBB> <62B3> <CCBC> <CCBC> <62AF> <CCBD> <CCBD> <62BB> <CCBE> <CCBE> <62A9> <CCBF> <CCBF> <62B0> <CCC0> <CCC0> <62B8> <CCC1> <CCC1> <653D> <CCC2> <CCC2> <65A8> <CCC3> <CCC3> <65BB> <CCC4> <CCC4> <6609> <CCC5> <CCC5> <65FC> <CCC6> <CCC6> <6604> <CCC7> <CCC7> <6612> <CCC8> <CCC8> <6608> <CCC9> <CCC9> <65FB> <CCCA> <CCCA> <6603> <CCCB> <CCCB> <660B> <CCCC> <CCCC> <660D> <CCCD> <CCCD> <6605> <CCCE> <CCCE> <65FD> <CCCF> <CCCF> <6611> <CCD0> <CCD0> <6610> <CCD1> <CCD1> <66F6> <CCD2> <CCD2> <670A> <CCD3> <CCD3> <6785> <CCD4> <CCD4> <676C> <CCD5> <CCD5> <678E> <CCD6> <CCD6> <6792> <CCD7> <CCD7> <6776> <CCD8> <CCD8> <677B> <CCD9> <CCD9> <6798> <CCDA> <CCDA> <6786> <CCDB> <CCDB> <6784> <CCDC> <CCDC> <6774> <CCDD> <CCDD> <678D> <CCDE> <CCDE> <678C> <CCDF> <CCDF> <677A> <CCE0> <CCE0> <679F> <CCE1> <CCE1> <6791> <CCE2> <CCE2> <6799> <CCE3> <CCE3> <6783> <CCE4> <CCE4> <677D> <CCE5> <CCE5> <6781> <CCE6> <CCE7> <6778> <CCE8> <CCE8> <6794> <CCE9> <CCE9> <6B25> <CCEA> <CCEA> <6B80> <CCEB> <CCEB> <6B7E> <CCEC> <CCEC> <6BDE> <CCED> <CCED> <6C1D> <CCEE> <CCEE> <6C93> <CCEF> <CCEF> <6CEC> <CCF0> <CCF0> <6CEB> <CCF1> <CCF1> <6CEE> <CCF2> <CCF2> <6CD9> <CCF3> <CCF3> <6CB6> <CCF4> <CCF4> <6CD4> <CCF5> <CCF5> <6CAD> <CCF6> <CCF6> <6CE7> <CCF7> <CCF7> <6CB7> <CCF8> <CCF8> <6CD0> <CCF9> <CCF9> <6CC2> <CCFA> <CCFA> <6CBA> <CCFB> <CCFB> <6CC3> <CCFC> <CCFC> <6CC6> <CCFD> <CCFD> <6CED> <CCFE> <CCFE> <6CF2> <CD40> <CD40> <6CD2> <CD41> <CD41> <6CDD> <CD42> <CD42> <6CB4> <CD43> <CD43> <6C8A> <CD44> <CD44> <6C9D> <CD45> <CD45> <6C80> <CD46> <CD46> <6CDE> <CD47> <CD47> <6CC0> <CD48> <CD48> <6D30> <CD49> <CD49> <6CCD> <CD4A> <CD4A> <6CC7> <CD4B> <CD4B> <6CB0> <CD4C> <CD4C> <6CF9> <CD4D> <CD4D> <6CCF> <CD4E> <CD4E> <6CE9> <CD4F> <CD4F> <6CD1> endbfrange 100 beginbfrange <CD50> <CD50> <7094> <CD51> <CD51> <7098> <CD52> <CD52> <7085> <CD53> <CD53> <7093> <CD54> <CD54> <7086> <CD55> <CD55> <7084> <CD56> <CD56> <7091> <CD57> <CD57> <7096> <CD58> <CD58> <7082> <CD59> <CD59> <709A> <CD5A> <CD5A> <7083> <CD5B> <CD5B> <726A> <CD5C> <CD5C> <72D6> <CD5D> <CD5D> <72CB> <CD5E> <CD5E> <72D8> <CD5F> <CD5F> <72C9> <CD60> <CD60> <72DC> <CD61> <CD61> <72D2> <CD62> <CD62> <72D4> <CD63> <CD63> <72DA> <CD64> <CD64> <72CC> <CD65> <CD65> <72D1> <CD66> <CD66> <73A4> <CD67> <CD67> <73A1> <CD68> <CD68> <73AD> <CD69> <CD69> <73A6> <CD6A> <CD6A> <73A2> <CD6B> <CD6B> <73A0> <CD6C> <CD6C> <73AC> <CD6D> <CD6D> <739D> <CD6E> <CD6E> <74DD> <CD6F> <CD6F> <74E8> <CD70> <CD71> <753F> <CD72> <CD72> <753E> <CD73> <CD73> <758C> <CD74> <CD74> <7598> <CD75> <CD75> <76AF> <CD76> <CD76> <76F3> <CD77> <CD77> <76F1> <CD78> <CD78> <76F0> <CD79> <CD79> <76F5> <CD7A> <CD7A> <77F8> <CD7B> <CD7B> <77FC> <CD7C> <CD7C> <77F9> <CD7D> <CD7D> <77FB> <CD7E> <CD7E> <77FA> <CDA1> <CDA1> <77F7> <CDA2> <CDA2> <7942> <CDA3> <CDA3> <793F> <CDA4> <CDA4> <79C5> <CDA5> <CDA5> <7A78> <CDA6> <CDA6> <7A7B> <CDA7> <CDA7> <7AFB> <CDA8> <CDA8> <7C75> <CDA9> <CDA9> <7CFD> <CDAA> <CDAA> <8035> <CDAB> <CDAB> <808F> <CDAC> <CDAC> <80AE> <CDAD> <CDAD> <80A3> <CDAE> <CDAE> <80B8> <CDAF> <CDAF> <80B5> <CDB0> <CDB0> <80AD> <CDB1> <CDB1> <8220> <CDB2> <CDB2> <82A0> <CDB3> <CDB3> <82C0> <CDB4> <CDB4> <82AB> <CDB5> <CDB5> <829A> <CDB6> <CDB6> <8298> <CDB7> <CDB7> <829B> <CDB8> <CDB8> <82B5> <CDB9> <CDB9> <82A7> <CDBA> <CDBA> <82AE> <CDBB> <CDBB> <82BC> <CDBC> <CDBC> <829E> <CDBD> <CDBD> <82BA> <CDBE> <CDBE> <82B4> <CDBF> <CDBF> <82A8> <CDC0> <CDC0> <82A1> <CDC1> <CDC1> <82A9> <CDC2> <CDC2> <82C2> <CDC3> <CDC3> <82A4> <CDC4> <CDC4> <82C3> <CDC5> <CDC5> <82B6> <CDC6> <CDC6> <82A2> <CDC7> <CDC7> <8670> <CDC8> <CDC8> <866F> <CDC9> <CDCA> <866D> <CDCB> <CDCB> <8C56> <CDCC> <CDCC> <8FD2> <CDCD> <CDCD> <8FCB> <CDCE> <CDCE> <8FD3> <CDCF> <CDCF> <8FCD> <CDD0> <CDD0> <8FD6> <CDD1> <CDD1> <8FD5> <CDD2> <CDD2> <8FD7> <CDD3> <CDD3> <90B2> <CDD4> <CDD4> <90B4> <CDD5> <CDD5> <90AF> <CDD6> <CDD6> <90B3> <CDD7> <CDD7> <90B0> endbfrange 100 beginbfrange <CDD8> <CDD8> <9639> <CDD9> <CDD9> <963D> <CDDA> <CDDA> <963C> <CDDB> <CDDB> <963A> <CDDC> <CDDC> <9643> <CDDD> <CDDD> <4FCD> <CDDE> <CDDE> <4FC5> <CDDF> <CDDF> <4FD3> <CDE0> <CDE0> <4FB2> <CDE1> <CDE1> <4FC9> <CDE2> <CDE2> <4FCB> <CDE3> <CDE3> <4FC1> <CDE4> <CDE4> <4FD4> <CDE5> <CDE5> <4FDC> <CDE6> <CDE6> <4FD9> <CDE7> <CDE7> <4FBB> <CDE8> <CDE8> <4FB3> <CDE9> <CDE9> <4FDB> <CDEA> <CDEA> <4FC7> <CDEB> <CDEB> <4FD6> <CDEC> <CDEC> <4FBA> <CDED> <CDED> <4FC0> <CDEE> <CDEE> <4FB9> <CDEF> <CDEF> <4FEC> <CDF0> <CDF0> <5244> <CDF1> <CDF1> <5249> <CDF2> <CDF2> <52C0> <CDF3> <CDF3> <52C2> <CDF4> <CDF4> <533D> <CDF5> <CDF5> <537C> <CDF6> <CDF6> <5397> <CDF7> <CDF7> <5396> <CDF8> <CDF8> <5399> <CDF9> <CDF9> <5398> <CDFA> <CDFA> <54BA> <CDFB> <CDFB> <54A1> <CDFC> <CDFC> <54AD> <CDFD> <CDFD> <54A5> <CDFE> <CDFE> <54CF> <CE40> <CE40> <54C3> <CE41> <CE41> <830D> <CE42> <CE42> <54B7> <CE43> <CE43> <54AE> <CE44> <CE44> <54D6> <CE45> <CE45> <54B6> <CE46> <CE47> <54C5> <CE48> <CE48> <54A0> <CE49> <CE49> <5470> <CE4A> <CE4A> <54BC> <CE4B> <CE4B> <54A2> <CE4C> <CE4C> <54BE> <CE4D> <CE4D> <5472> <CE4E> <CE4E> <54DE> <CE4F> <CE4F> <54B0> <CE50> <CE50> <57B5> <CE51> <CE52> <579E> <CE53> <CE53> <57A4> <CE54> <CE54> <578C> <CE55> <CE55> <5797> <CE56> <CE56> <579D> <CE57> <CE57> <579B> <CE58> <CE58> <5794> <CE59> <CE59> <5798> <CE5A> <CE5A> <578F> <CE5B> <CE5B> <5799> <CE5C> <CE5C> <57A5> <CE5D> <CE5D> <579A> <CE5E> <CE5E> <5795> <CE5F> <CE5F> <58F4> <CE60> <CE60> <590D> <CE61> <CE61> <5953> <CE62> <CE62> <59E1> <CE63> <CE63> <59DE> <CE64> <CE64> <59EE> <CE65> <CE65> <5A00> <CE66> <CE66> <59F1> <CE67> <CE67> <59DD> <CE68> <CE68> <59FA> <CE69> <CE69> <59FD> <CE6A> <CE6A> <59FC> <CE6B> <CE6B> <59F6> <CE6C> <CE6C> <59E4> <CE6D> <CE6D> <59F2> <CE6E> <CE6E> <59F7> <CE6F> <CE6F> <59DB> <CE70> <CE70> <59E9> <CE71> <CE71> <59F3> <CE72> <CE72> <59F5> <CE73> <CE73> <59E0> <CE74> <CE74> <59FE> <CE75> <CE75> <59F4> <CE76> <CE76> <59ED> <CE77> <CE77> <5BA8> <CE78> <CE78> <5C4C> <CE79> <CE79> <5CD0> <CE7A> <CE7A> <5CD8> <CE7B> <CE7B> <5CCC> <CE7C> <CE7C> <5CD7> <CE7D> <CE7D> <5CCB> <CE7E> <CE7E> <5CDB> endbfrange 100 beginbfrange <CEA1> <CEA1> <5CDE> <CEA2> <CEA2> <5CDA> <CEA3> <CEA3> <5CC9> <CEA4> <CEA4> <5CC7> <CEA5> <CEA5> <5CCA> <CEA6> <CEA6> <5CD6> <CEA7> <CEA8> <5CD3> <CEA9> <CEA9> <5CCF> <CEAA> <CEAA> <5CC8> <CEAB> <CEAB> <5CC6> <CEAC> <CEAC> <5CCE> <CEAD> <CEAD> <5CDF> <CEAE> <CEAE> <5CF8> <CEAF> <CEAF> <5DF9> <CEB0> <CEB2> <5E21> <CEB3> <CEB3> <5E20> <CEB4> <CEB4> <5E24> <CEB5> <CEB5> <5EB0> <CEB6> <CEB6> <5EA4> <CEB7> <CEB7> <5EA2> <CEB8> <CEB8> <5E9B> <CEB9> <CEB9> <5EA3> <CEBA> <CEBA> <5EA5> <CEBB> <CEBB> <5F07> <CEBC> <CEBC> <5F2E> <CEBD> <CEBD> <5F56> <CEBE> <CEBE> <5F86> <CEBF> <CEBF> <6037> <CEC0> <CEC0> <6039> <CEC1> <CEC1> <6054> <CEC2> <CEC2> <6072> <CEC3> <CEC3> <605E> <CEC4> <CEC4> <6045> <CEC5> <CEC5> <6053> <CEC6> <CEC6> <6047> <CEC7> <CEC7> <6049> <CEC8> <CEC8> <605B> <CEC9> <CEC9> <604C> <CECA> <CECA> <6040> <CECB> <CECB> <6042> <CECC> <CECC> <605F> <CECD> <CECD> <6024> <CECE> <CECE> <6044> <CECF> <CECF> <6058> <CED0> <CED0> <6066> <CED1> <CED1> <606E> <CED2> <CED3> <6242> <CED4> <CED4> <62CF> <CED5> <CED5> <630D> <CED6> <CED6> <630B> <CED7> <CED7> <62F5> <CED8> <CED8> <630E> <CED9> <CED9> <6303> <CEDA> <CEDA> <62EB> <CEDB> <CEDB> <62F9> <CEDC> <CEDC> <630F> <CEDD> <CEDD> <630C> <CEDE> <CEDE> <62F8> <CEDF> <CEDF> <62F6> <CEE0> <CEE0> <6300> <CEE1> <CEE2> <6313> <CEE3> <CEE3> <62FA> <CEE4> <CEE4> <6315> <CEE5> <CEE5> <62FB> <CEE6> <CEE6> <62F0> <CEE7> <CEE7> <6541> <CEE8> <CEE8> <6543> <CEE9> <CEE9> <65AA> <CEEA> <CEEA> <65BF> <CEEB> <CEEB> <6636> <CEEC> <CEEC> <6621> <CEED> <CEED> <6632> <CEEE> <CEEE> <6635> <CEEF> <CEEF> <661C> <CEF0> <CEF0> <6626> <CEF1> <CEF1> <6622> <CEF2> <CEF2> <6633> <CEF3> <CEF3> <662B> <CEF4> <CEF4> <663A> <CEF5> <CEF5> <661D> <CEF6> <CEF6> <6634> <CEF7> <CEF7> <6639> <CEF8> <CEF8> <662E> <CEF9> <CEFA> <670F> <CEFB> <CEFB> <67C1> <CEFC> <CEFC> <67F2> <CEFD> <CEFD> <67C8> <CEFE> <CEFE> <67BA> <CF40> <CF40> <67DC> <CF41> <CF41> <67BB> <CF42> <CF42> <67F8> <CF43> <CF43> <67D8> <CF44> <CF44> <67C0> <CF45> <CF45> <67B7> <CF46> <CF46> <67C5> <CF47> <CF47> <67EB> <CF48> <CF48> <67E4> <CF49> <CF49> <67DF> <CF4A> <CF4A> <67B5> <CF4B> <CF4B> <67CD> endbfrange 100 beginbfrange <CF4C> <CF4C> <67B3> <CF4D> <CF4D> <67F7> <CF4E> <CF4E> <67F6> <CF4F> <CF4F> <67EE> <CF50> <CF50> <67E3> <CF51> <CF51> <67C2> <CF52> <CF52> <67B9> <CF53> <CF53> <67CE> <CF54> <CF54> <67E7> <CF55> <CF55> <67F0> <CF56> <CF56> <67B2> <CF57> <CF57> <67FC> <CF58> <CF58> <67C6> <CF59> <CF59> <67ED> <CF5A> <CF5A> <67CC> <CF5B> <CF5B> <67AE> <CF5C> <CF5C> <67E6> <CF5D> <CF5D> <67DB> <CF5E> <CF5E> <67FA> <CF5F> <CF60> <67C9> <CF61> <CF61> <67C3> <CF62> <CF62> <67EA> <CF63> <CF63> <67CB> <CF64> <CF64> <6B28> <CF65> <CF65> <6B82> <CF66> <CF66> <6B84> <CF67> <CF67> <6BB6> <CF68> <CF68> <6BD6> <CF69> <CF69> <6BD8> <CF6A> <CF6A> <6BE0> <CF6B> <CF6C> <6C20> <CF6D> <CF6D> <6D28> <CF6E> <CF6E> <6D34> <CF6F> <CF6F> <6D2D> <CF70> <CF70> <6D1F> <CF71> <CF71> <6D3C> <CF72> <CF72> <6D3F> <CF73> <CF73> <6D12> <CF74> <CF74> <6D0A> <CF75> <CF75> <6CDA> <CF76> <CF76> <6D33> <CF77> <CF77> <6D04> <CF78> <CF78> <6D19> <CF79> <CF79> <6D3A> <CF7A> <CF7A> <6D1A> <CF7B> <CF7B> <6D11> <CF7C> <CF7C> <6D00> <CF7D> <CF7D> <6D1D> <CF7E> <CF7E> <6D42> <CFA1> <CFA1> <6D01> <CFA2> <CFA2> <6D18> <CFA3> <CFA3> <6D37> <CFA4> <CFA4> <6D03> <CFA5> <CFA5> <6D0F> <CFA6> <CFA6> <6D40> <CFA7> <CFA7> <6D07> <CFA8> <CFA8> <6D20> <CFA9> <CFA9> <6D2C> <CFAA> <CFAA> <6D08> <CFAB> <CFAB> <6D22> <CFAC> <CFAC> <6D09> <CFAD> <CFAD> <6D10> <CFAE> <CFAE> <70B7> <CFAF> <CFAF> <709F> <CFB0> <CFB0> <70BE> <CFB1> <CFB1> <70B1> <CFB2> <CFB2> <70B0> <CFB3> <CFB3> <70A1> <CFB4> <CFB5> <70B4> <CFB6> <CFB6> <70A9> <CFB7> <CFB7> <7241> <CFB8> <CFB9> <7249> <CFBA> <CFBA> <726C> <CFBB> <CFBB> <7270> <CFBC> <CFBC> <7273> <CFBD> <CFBD> <726E> <CFBE> <CFBE> <72CA> <CFBF> <CFBF> <72E4> <CFC0> <CFC0> <72E8> <CFC1> <CFC1> <72EB> <CFC2> <CFC2> <72DF> <CFC3> <CFC3> <72EA> <CFC4> <CFC4> <72E6> <CFC5> <CFC5> <72E3> <CFC6> <CFC6> <7385> <CFC7> <CFC7> <73CC> <CFC8> <CFC8> <73C2> <CFC9> <CFC9> <73C8> <CFCA> <CFCA> <73C5> <CFCB> <CFCB> <73B9> <CFCC> <CFCC> <73B6> <CFCD> <CFCD> <73B5> <CFCE> <CFCE> <73B4> <CFCF> <CFCF> <73EB> <CFD0> <CFD0> <73BF> <CFD1> <CFD1> <73C7> <CFD2> <CFD2> <73BE> <CFD3> <CFD3> <73C3> <CFD4> <CFD4> <73C6> <CFD5> <CFD5> <73B8> endbfrange 100 beginbfrange <CFD6> <CFD6> <73CB> <CFD7> <CFD7> <74EC> <CFD8> <CFD8> <74EE> <CFD9> <CFD9> <752E> <CFDA> <CFDB> <7547> <CFDC> <CFDC> <75A7> <CFDD> <CFDD> <75AA> <CFDE> <CFDE> <7679> <CFDF> <CFDF> <76C4> <CFE0> <CFE0> <7708> <CFE1> <CFE3> <7703> <CFE4> <CFE4> <770A> <CFE5> <CFE5> <76F7> <CFE6> <CFE6> <76FB> <CFE7> <CFE7> <76FA> <CFE8> <CFE9> <77E7> <CFEA> <CFEA> <7806> <CFEB> <CFEC> <7811> <CFED> <CFED> <7805> <CFEE> <CFEE> <7810> <CFEF> <CFEF> <780F> <CFF0> <CFF0> <780E> <CFF1> <CFF1> <7809> <CFF2> <CFF2> <7803> <CFF3> <CFF3> <7813> <CFF4> <CFF4> <794A> <CFF5> <CFF5> <794C> <CFF6> <CFF6> <794B> <CFF7> <CFF7> <7945> <CFF8> <CFF8> <7944> <CFF9> <CFF9> <79D5> <CFFA> <CFFA> <79CD> <CFFB> <CFFB> <79CF> <CFFC> <CFFC> <79D6> <CFFD> <CFFD> <79CE> <CFFE> <CFFE> <7A80> <D040> <D040> <7A7E> <D041> <D041> <7AD1> <D042> <D043> <7B00> <D044> <D044> <7C7A> <D045> <D046> <7C78> <D047> <D049> <7C7F> <D04A> <D04A> <7D03> <D04B> <D04B> <7D08> <D04C> <D04C> <7D01> <D04D> <D04D> <7F58> <D04E> <D04E> <7F91> <D04F> <D04F> <7F8D> <D050> <D050> <7FBE> <D051> <D051> <8007> <D052> <D053> <800E> <D054> <D054> <8014> <D055> <D055> <8037> <D056> <D056> <80D8> <D057> <D057> <80C7> <D058> <D058> <80E0> <D059> <D059> <80D1> <D05A> <D05A> <80C8> <D05B> <D05B> <80C2> <D05C> <D05C> <80D0> <D05D> <D05D> <80C5> <D05E> <D05E> <80E3> <D05F> <D05F> <80D9> <D060> <D060> <80DC> <D061> <D061> <80CA> <D062> <D062> <80D5> <D063> <D063> <80C9> <D064> <D064> <80CF> <D065> <D065> <80D7> <D066> <D066> <80E6> <D067> <D067> <80CD> <D068> <D068> <81FF> <D069> <D069> <8221> <D06A> <D06A> <8294> <D06B> <D06B> <82D9> <D06C> <D06C> <82FE> <D06D> <D06D> <82F9> <D06E> <D06E> <8307> <D06F> <D06F> <82E8> <D070> <D070> <8300> <D071> <D071> <82D5> <D072> <D072> <833A> <D073> <D073> <82EB> <D074> <D074> <82D6> <D075> <D075> <82F4> <D076> <D076> <82EC> <D077> <D077> <82E1> <D078> <D078> <82F2> <D079> <D079> <82F5> <D07A> <D07A> <830C> <D07B> <D07B> <82FB> <D07C> <D07C> <82F6> <D07D> <D07D> <82F0> <D07E> <D07E> <82EA> <D0A1> <D0A1> <82E4> <D0A2> <D0A2> <82E0> <D0A3> <D0A3> <82FA> <D0A4> <D0A4> <82F3> <D0A5> <D0A5> <82ED> <D0A6> <D0A6> <8677> endbfrange 100 beginbfrange <D0A7> <D0A7> <8674> <D0A8> <D0A8> <867C> <D0A9> <D0A9> <8673> <D0AA> <D0AA> <8841> <D0AB> <D0AB> <884E> <D0AC> <D0AC> <8867> <D0AD> <D0AD> <886A> <D0AE> <D0AE> <8869> <D0AF> <D0AF> <89D3> <D0B0> <D0B0> <8A04> <D0B1> <D0B1> <8A07> <D0B2> <D0B2> <8D72> <D0B3> <D0B3> <8FE3> <D0B4> <D0B4> <8FE1> <D0B5> <D0B5> <8FEE> <D0B6> <D0B6> <8FE0> <D0B7> <D0B7> <90F1> <D0B8> <D0B8> <90BD> <D0B9> <D0B9> <90BF> <D0BA> <D0BA> <90D5> <D0BB> <D0BB> <90C5> <D0BC> <D0BC> <90BE> <D0BD> <D0BD> <90C7> <D0BE> <D0BE> <90CB> <D0BF> <D0BF> <90C8> <D0C0> <D0C0> <91D4> <D0C1> <D0C1> <91D3> <D0C2> <D0C2> <9654> <D0C3> <D0C3> <964F> <D0C4> <D0C4> <9651> <D0C5> <D0C5> <9653> <D0C6> <D0C6> <964A> <D0C7> <D0C7> <964E> <D0C8> <D0C8> <501E> <D0C9> <D0C9> <5005> <D0CA> <D0CA> <5007> <D0CB> <D0CB> <5013> <D0CC> <D0CC> <5022> <D0CD> <D0CD> <5030> <D0CE> <D0CE> <501B> <D0CF> <D0CF> <4FF5> <D0D0> <D0D0> <4FF4> <D0D1> <D0D1> <5033> <D0D2> <D0D2> <5037> <D0D3> <D0D3> <502C> <D0D4> <D0D5> <4FF6> <D0D6> <D0D6> <5017> <D0D7> <D0D7> <501C> <D0D8> <D0D8> <5020> <D0D9> <D0D9> <5027> <D0DA> <D0DA> <5035> <D0DB> <D0DB> <502F> <D0DC> <D0DC> <5031> <D0DD> <D0DD> <500E> <D0DE> <D0DE> <515A> <D0DF> <D0DF> <5194> <D0E0> <D0E0> <5193> <D0E1> <D0E1> <51CA> <D0E2> <D0E3> <51C4> <D0E4> <D0E4> <51C8> <D0E5> <D0E5> <51CE> <D0E6> <D0E6> <5261> <D0E7> <D0E7> <525A> <D0E8> <D0E8> <5252> <D0E9> <D0EA> <525E> <D0EB> <D0EB> <5255> <D0EC> <D0EC> <5262> <D0ED> <D0ED> <52CD> <D0EE> <D0EE> <530E> <D0EF> <D0EF> <539E> <D0F0> <D0F0> <5526> <D0F1> <D0F1> <54E2> <D0F2> <D0F2> <5517> <D0F3> <D0F3> <5512> <D0F4> <D0F4> <54E7> <D0F5> <D0F5> <54F3> <D0F6> <D0F6> <54E4> <D0F7> <D0F7> <551A> <D0F8> <D0F8> <54FF> <D0F9> <D0F9> <5504> <D0FA> <D0FA> <5508> <D0FB> <D0FB> <54EB> <D0FC> <D0FC> <5511> <D0FD> <D0FD> <5505> <D0FE> <D0FE> <54F1> <D140> <D140> <550A> <D141> <D141> <54FB> <D142> <D143> <54F7> <D144> <D144> <54E0> <D145> <D145> <550E> <D146> <D146> <5503> <D147> <D147> <550B> <D148> <D149> <5701> <D14A> <D14A> <57CC> <D14B> <D14B> <5832> <D14C> <D14C> <57D5> <D14D> <D14D> <57D2> <D14E> <D14E> <57BA> <D14F> <D14F> <57C6> <D150> <D150> <57BD> endbfrange 100 beginbfrange <D151> <D151> <57BC> <D152> <D152> <57B8> <D153> <D153> <57B6> <D154> <D154> <57BF> <D155> <D155> <57C7> <D156> <D156> <57D0> <D157> <D157> <57B9> <D158> <D158> <57C1> <D159> <D159> <590E> <D15A> <D15A> <594A> <D15B> <D15B> <5A19> <D15C> <D15C> <5A16> <D15D> <D15E> <5A2D> <D15F> <D15F> <5A15> <D160> <D160> <5A0F> <D161> <D161> <5A17> <D162> <D162> <5A0A> <D163> <D163> <5A1E> <D164> <D164> <5A33> <D165> <D165> <5B6C> <D166> <D166> <5BA7> <D167> <D167> <5BAD> <D168> <D168> <5BAC> <D169> <D169> <5C03> <D16A> <D16A> <5C56> <D16B> <D16B> <5C54> <D16C> <D16C> <5CEC> <D16D> <D16D> <5CFF> <D16E> <D16E> <5CEE> <D16F> <D16F> <5CF1> <D170> <D170> <5CF7> <D171> <D171> <5D00> <D172> <D172> <5CF9> <D173> <D173> <5E29> <D174> <D174> <5E28> <D175> <D175> <5EA8> <D176> <D176> <5EAE> <D177> <D177> <5EAA> <D178> <D178> <5EAC> <D179> <D179> <5F33> <D17A> <D17A> <5F30> <D17B> <D17B> <5F67> <D17C> <D17C> <605D> <D17D> <D17D> <605A> <D17E> <D17E> <6067> <D1A1> <D1A1> <6041> <D1A2> <D1A2> <60A2> <D1A3> <D1A3> <6088> <D1A4> <D1A4> <6080> <D1A5> <D1A5> <6092> <D1A6> <D1A6> <6081> <D1A7> <D1A7> <609D> <D1A8> <D1A8> <6083> <D1A9> <D1A9> <6095> <D1AA> <D1AA> <609B> <D1AB> <D1AB> <6097> <D1AC> <D1AC> <6087> <D1AD> <D1AD> <609C> <D1AE> <D1AE> <608E> <D1AF> <D1AF> <6219> <D1B0> <D1B0> <6246> <D1B1> <D1B1> <62F2> <D1B2> <D1B2> <6310> <D1B3> <D1B3> <6356> <D1B4> <D1B4> <632C> <D1B5> <D1B6> <6344> <D1B7> <D1B7> <6336> <D1B8> <D1B8> <6343> <D1B9> <D1B9> <63E4> <D1BA> <D1BA> <6339> <D1BB> <D1BB> <634B> <D1BC> <D1BC> <634A> <D1BD> <D1BD> <633C> <D1BE> <D1BE> <6329> <D1BF> <D1BF> <6341> <D1C0> <D1C0> <6334> <D1C1> <D1C1> <6358> <D1C2> <D1C2> <6354> <D1C3> <D1C3> <6359> <D1C4> <D1C4> <632D> <D1C5> <D1C5> <6347> <D1C6> <D1C6> <6333> <D1C7> <D1C7> <635A> <D1C8> <D1C8> <6351> <D1C9> <D1C9> <6338> <D1CA> <D1CA> <6357> <D1CB> <D1CB> <6340> <D1CC> <D1CC> <6348> <D1CD> <D1CD> <654A> <D1CE> <D1CE> <6546> <D1CF> <D1CF> <65C6> <D1D0> <D1D1> <65C3> <D1D2> <D1D2> <65C2> <D1D3> <D1D3> <664A> <D1D4> <D1D4> <665F> <D1D5> <D1D5> <6647> <D1D6> <D1D6> <6651> <D1D7> <D1D8> <6712> <D1D9> <D1D9> <681F> <D1DA> <D1DA> <681A> endbfrange 100 beginbfrange <D1DB> <D1DB> <6849> <D1DC> <D1DD> <6832> <D1DE> <D1DE> <683B> <D1DF> <D1DF> <684B> <D1E0> <D1E0> <684F> <D1E1> <D1E1> <6816> <D1E2> <D1E2> <6831> <D1E3> <D1E3> <681C> <D1E4> <D1E4> <6835> <D1E5> <D1E5> <682B> <D1E6> <D1E6> <682D> <D1E7> <D1E7> <682F> <D1E8> <D1E8> <684E> <D1E9> <D1E9> <6844> <D1EA> <D1EA> <6834> <D1EB> <D1EB> <681D> <D1EC> <D1EC> <6812> <D1ED> <D1ED> <6814> <D1EE> <D1EE> <6826> <D1EF> <D1EF> <6828> <D1F0> <D1F0> <682E> <D1F1> <D1F1> <684D> <D1F2> <D1F2> <683A> <D1F3> <D1F3> <6825> <D1F4> <D1F4> <6820> <D1F5> <D1F5> <6B2C> <D1F6> <D1F6> <6B2F> <D1F7> <D1F7> <6B2D> <D1F8> <D1F8> <6B31> <D1F9> <D1F9> <6B34> <D1FA> <D1FA> <6B6D> <D1FB> <D1FB> <8082> <D1FC> <D1FC> <6B88> <D1FD> <D1FD> <6BE6> <D1FE> <D1FE> <6BE4> <D240> <D240> <6BE8> <D241> <D241> <6BE3> <D242> <D242> <6BE2> <D243> <D243> <6BE7> <D244> <D244> <6C25> <D245> <D245> <6D7A> <D246> <D247> <6D63> <D248> <D248> <6D76> <D249> <D249> <6D0D> <D24A> <D24A> <6D61> <D24B> <D24B> <6D92> <D24C> <D24C> <6D58> <D24D> <D24D> <6D62> <D24E> <D24E> <6D6D> <D24F> <D24F> <6D6F> <D250> <D250> <6D91> <D251> <D251> <6D8D> <D252> <D252> <6DEF> <D253> <D253> <6D7F> <D254> <D254> <6D86> <D255> <D255> <6D5E> <D256> <D256> <6D67> <D257> <D257> <6D60> <D258> <D258> <6D97> <D259> <D259> <6D70> <D25A> <D25A> <6D7C> <D25B> <D25B> <6D5F> <D25C> <D25C> <6D82> <D25D> <D25D> <6D98> <D25E> <D25E> <6D2F> <D25F> <D25F> <6D68> <D260> <D260> <6D8B> <D261> <D261> <6D7E> <D262> <D262> <6D80> <D263> <D263> <6D84> <D264> <D264> <6D16> <D265> <D265> <6D83> <D266> <D266> <6D7B> <D267> <D267> <6D7D> <D268> <D268> <6D75> <D269> <D269> <6D90> <D26A> <D26A> <70DC> <D26B> <D26B> <70D3> <D26C> <D26C> <70D1> <D26D> <D26D> <70DD> <D26E> <D26E> <70CB> <D26F> <D26F> <7F39> <D270> <D270> <70E2> <D271> <D271> <70D7> <D272> <D272> <70D2> <D273> <D273> <70DE> <D274> <D274> <70E0> <D275> <D275> <70D4> <D276> <D276> <70CD> <D277> <D279> <70C5> <D27A> <D27A> <70DA> <D27B> <D27B> <70CE> <D27C> <D27C> <70E1> <D27D> <D27D> <7242> <D27E> <D27E> <7278> <D2A1> <D2A1> <7277> <D2A2> <D2A2> <7276> <D2A3> <D2A3> <7300> <D2A4> <D2A4> <72FA> <D2A5> <D2A5> <72F4> endbfrange 100 beginbfrange <D2A6> <D2A6> <72FE> <D2A7> <D2A7> <72F6> <D2A8> <D2A8> <72F3> <D2A9> <D2A9> <72FB> <D2AA> <D2AA> <7301> <D2AB> <D2AB> <73D3> <D2AC> <D2AC> <73D9> <D2AD> <D2AD> <73E5> <D2AE> <D2AE> <73D6> <D2AF> <D2AF> <73BC> <D2B0> <D2B0> <73E7> <D2B1> <D2B1> <73E3> <D2B2> <D2B2> <73E9> <D2B3> <D2B3> <73DC> <D2B4> <D2B4> <73D2> <D2B5> <D2B5> <73DB> <D2B6> <D2B6> <73D4> <D2B7> <D2B7> <73DD> <D2B8> <D2B8> <73DA> <D2B9> <D2BA> <73D7> <D2BB> <D2BB> <73E8> <D2BC> <D2BD> <74DE> <D2BE> <D2BF> <74F4> <D2C0> <D2C0> <7521> <D2C1> <D2C1> <755B> <D2C2> <D2C2> <755F> <D2C3> <D2C3> <75B0> <D2C4> <D2C4> <75C1> <D2C5> <D2C5> <75BB> <D2C6> <D2C6> <75C4> <D2C7> <D2C7> <75C0> <D2C8> <D2C8> <75BF> <D2C9> <D2C9> <75B6> <D2CA> <D2CA> <75BA> <D2CB> <D2CB> <768A> <D2CC> <D2CC> <76C9> <D2CD> <D2CD> <771D> <D2CE> <D2CE> <771B> <D2CF> <D2CF> <7710> <D2D0> <D2D0> <7713> <D2D1> <D2D1> <7712> <D2D2> <D2D2> <7723> <D2D3> <D2D3> <7711> <D2D4> <D2D4> <7715> <D2D5> <D2D6> <7719> <D2D7> <D2D7> <7722> <D2D8> <D2D8> <7727> <D2D9> <D2D9> <7823> <D2DA> <D2DA> <782C> <D2DB> <D2DB> <7822> <D2DC> <D2DC> <7835> <D2DD> <D2DD> <782F> <D2DE> <D2DE> <7828> <D2DF> <D2DF> <782E> <D2E0> <D2E0> <782B> <D2E1> <D2E1> <7821> <D2E2> <D2E2> <7829> <D2E3> <D2E3> <7833> <D2E4> <D2E4> <782A> <D2E5> <D2E5> <7831> <D2E6> <D2E6> <7954> <D2E7> <D2E7> <795B> <D2E8> <D2E8> <794F> <D2E9> <D2E9> <795C> <D2EA> <D2EA> <7953> <D2EB> <D2EB> <7952> <D2EC> <D2EC> <7951> <D2ED> <D2EE> <79EB> <D2EF> <D2EF> <79E0> <D2F0> <D2F0> <79EE> <D2F1> <D2F1> <79ED> <D2F2> <D2F2> <79EA> <D2F3> <D2F3> <79DC> <D2F4> <D2F4> <79DE> <D2F5> <D2F5> <79DD> <D2F6> <D2F6> <7A86> <D2F7> <D2F7> <7A89> <D2F8> <D2F8> <7A85> <D2F9> <D2FA> <7A8B> <D2FB> <D2FB> <7A8A> <D2FC> <D2FC> <7A87> <D2FD> <D2FD> <7AD8> <D2FE> <D2FE> <7B10> <D340> <D340> <7B04> <D341> <D341> <7B13> <D342> <D342> <7B05> <D343> <D343> <7B0F> <D344> <D344> <7B08> <D345> <D345> <7B0A> <D346> <D346> <7B0E> <D347> <D347> <7B09> <D348> <D348> <7B12> <D349> <D349> <7C84> <D34A> <D34A> <7C91> <D34B> <D34B> <7C8A> <D34C> <D34C> <7C8C> <D34D> <D34D> <7C88> <D34E> <D34E> <7C8D> <D34F> <D34F> <7C85> <D350> <D350> <7D1E> endbfrange 100 beginbfrange <D351> <D351> <7D1D> <D352> <D352> <7D11> <D353> <D353> <7D0E> <D354> <D354> <7D18> <D355> <D355> <7D16> <D356> <D356> <7D13> <D357> <D357> <7D1F> <D358> <D358> <7D12> <D359> <D359> <7D0F> <D35A> <D35A> <7D0C> <D35B> <D35B> <7F5C> <D35C> <D35C> <7F61> <D35D> <D35D> <7F5E> <D35E> <D35E> <7F60> <D35F> <D35F> <7F5D> <D360> <D360> <7F5B> <D361> <D361> <7F96> <D362> <D362> <7F92> <D363> <D363> <7FC3> <D364> <D364> <7FC2> <D365> <D365> <7FC0> <D366> <D366> <8016> <D367> <D367> <803E> <D368> <D368> <8039> <D369> <D369> <80FA> <D36A> <D36A> <80F2> <D36B> <D36B> <80F9> <D36C> <D36C> <80F5> <D36D> <D36D> <8101> <D36E> <D36E> <80FB> <D36F> <D36F> <8100> <D370> <D370> <8201> <D371> <D371> <822F> <D372> <D372> <8225> <D373> <D373> <8333> <D374> <D374> <832D> <D375> <D375> <8344> <D376> <D376> <8319> <D377> <D377> <8351> <D378> <D378> <8325> <D379> <D379> <8356> <D37A> <D37A> <833F> <D37B> <D37B> <8341> <D37C> <D37C> <8326> <D37D> <D37D> <831C> <D37E> <D37E> <8322> <D3A1> <D3A1> <8342> <D3A2> <D3A2> <834E> <D3A3> <D3A3> <831B> <D3A4> <D3A4> <832A> <D3A5> <D3A5> <8308> <D3A6> <D3A6> <833C> <D3A7> <D3A7> <834D> <D3A8> <D3A8> <8316> <D3A9> <D3A9> <8324> <D3AA> <D3AA> <8320> <D3AB> <D3AB> <8337> <D3AC> <D3AC> <832F> <D3AD> <D3AD> <8329> <D3AE> <D3AE> <8347> <D3AF> <D3AF> <8345> <D3B0> <D3B0> <834C> <D3B1> <D3B1> <8353> <D3B2> <D3B2> <831E> <D3B3> <D3B3> <832C> <D3B4> <D3B4> <834B> <D3B5> <D3B5> <8327> <D3B6> <D3B6> <8348> <D3B7> <D3B7> <8653> <D3B8> <D3B8> <8652> <D3B9> <D3B9> <86A2> <D3BA> <D3BA> <86A8> <D3BB> <D3BB> <8696> <D3BC> <D3BC> <868D> <D3BD> <D3BD> <8691> <D3BE> <D3BE> <869E> <D3BF> <D3BF> <8687> <D3C0> <D3C0> <8697> <D3C1> <D3C1> <8686> <D3C2> <D3C2> <868B> <D3C3> <D3C3> <869A> <D3C4> <D3C4> <8685> <D3C5> <D3C5> <86A5> <D3C6> <D3C6> <8699> <D3C7> <D3C7> <86A1> <D3C8> <D3C8> <86A7> <D3C9> <D3C9> <8695> <D3CA> <D3CA> <8698> <D3CB> <D3CB> <868E> <D3CC> <D3CC> <869D> <D3CD> <D3CD> <8690> <D3CE> <D3CE> <8694> <D3CF> <D3D0> <8843> <D3D1> <D3D1> <886D> <D3D2> <D3D3> <8875> <D3D4> <D3D4> <8872> <D3D5> <D3D5> <8880> <D3D6> <D3D6> <8871> <D3D7> <D3D7> <887F> <D3D8> <D3D8> <886F> endbfrange 100 beginbfrange <D3D9> <D3D9> <8883> <D3DA> <D3DA> <887E> <D3DB> <D3DB> <8874> <D3DC> <D3DC> <887C> <D3DD> <D3DD> <8A12> <D3DE> <D3DE> <8C47> <D3DF> <D3DF> <8C57> <D3E0> <D3E0> <8C7B> <D3E1> <D3E1> <8CA4> <D3E2> <D3E2> <8CA3> <D3E3> <D3E3> <8D76> <D3E4> <D3E4> <8D78> <D3E5> <D3E5> <8DB5> <D3E6> <D3E6> <8DB7> <D3E7> <D3E7> <8DB6> <D3E8> <D3E8> <8ED1> <D3E9> <D3E9> <8ED3> <D3EA> <D3EA> <8FFE> <D3EB> <D3EB> <8FF5> <D3EC> <D3EC> <9002> <D3ED> <D3ED> <8FFF> <D3EE> <D3EE> <8FFB> <D3EF> <D3EF> <9004> <D3F0> <D3F0> <8FFC> <D3F1> <D3F1> <8FF6> <D3F2> <D3F2> <90D6> <D3F3> <D3F3> <90E0> <D3F4> <D3F5> <90D9> <D3F6> <D3F6> <90E3> <D3F7> <D3F7> <90DF> <D3F8> <D3F8> <90E5> <D3F9> <D3F9> <90D8> <D3FA> <D3FA> <90DB> <D3FB> <D3FB> <90D7> <D3FC> <D3FC> <90DC> <D3FD> <D3FD> <90E4> <D3FE> <D3FE> <9150> <D440> <D441> <914E> <D442> <D442> <91D5> <D443> <D443> <91E2> <D444> <D444> <91DA> <D445> <D445> <965C> <D446> <D446> <965F> <D447> <D447> <96BC> <D448> <D448> <98E3> <D449> <D449> <9ADF> <D44A> <D44A> <9B2F> <D44B> <D44B> <4E7F> <D44C> <D44C> <5070> <D44D> <D44D> <506A> <D44E> <D44E> <5061> <D44F> <D44F> <505E> <D450> <D450> <5060> <D451> <D451> <5053> <D452> <D452> <504B> <D453> <D453> <505D> <D454> <D454> <5072> <D455> <D455> <5048> <D456> <D456> <504D> <D457> <D457> <5041> <D458> <D458> <505B> <D459> <D459> <504A> <D45A> <D45A> <5062> <D45B> <D45B> <5015> <D45C> <D45C> <5045> <D45D> <D45D> <505F> <D45E> <D45E> <5069> <D45F> <D45F> <506B> <D460> <D461> <5063> <D462> <D462> <5046> <D463> <D463> <5040> <D464> <D464> <506E> <D465> <D465> <5073> <D466> <D466> <5057> <D467> <D467> <5051> <D468> <D468> <51D0> <D469> <D469> <526B> <D46A> <D46A> <526D> <D46B> <D46B> <526C> <D46C> <D46C> <526E> <D46D> <D46D> <52D6> <D46E> <D46E> <52D3> <D46F> <D46F> <532D> <D470> <D470> <539C> <D471> <D472> <5575> <D473> <D473> <553C> <D474> <D474> <554D> <D475> <D475> <5550> <D476> <D476> <5534> <D477> <D477> <552A> <D478> <D478> <5551> <D479> <D479> <5562> <D47A> <D47A> <5536> <D47B> <D47B> <5535> <D47C> <D47C> <5530> <D47D> <D47D> <5552> <D47E> <D47E> <5545> <D4A1> <D4A1> <550C> <D4A2> <D4A2> <5532> <D4A3> <D4A3> <5565> endbfrange 100 beginbfrange <D4A4> <D4A4> <554E> <D4A5> <D4A5> <5539> <D4A6> <D4A6> <5548> <D4A7> <D4A7> <552D> <D4A8> <D4A8> <553B> <D4A9> <D4A9> <5540> <D4AA> <D4AA> <554B> <D4AB> <D4AB> <570A> <D4AC> <D4AC> <5707> <D4AD> <D4AD> <57FB> <D4AE> <D4AE> <5814> <D4AF> <D4AF> <57E2> <D4B0> <D4B0> <57F6> <D4B1> <D4B1> <57DC> <D4B2> <D4B2> <57F4> <D4B3> <D4B3> <5800> <D4B4> <D4B4> <57ED> <D4B5> <D4B5> <57FD> <D4B6> <D4B6> <5808> <D4B7> <D4B7> <57F8> <D4B8> <D4B8> <580B> <D4B9> <D4B9> <57F3> <D4BA> <D4BA> <57CF> <D4BB> <D4BB> <5807> <D4BC> <D4BC> <57EE> <D4BD> <D4BD> <57E3> <D4BE> <D4BE> <57F2> <D4BF> <D4BF> <57E5> <D4C0> <D4C0> <57EC> <D4C1> <D4C1> <57E1> <D4C2> <D4C2> <580E> <D4C3> <D4C3> <57FC> <D4C4> <D4C4> <5810> <D4C5> <D4C5> <57E7> <D4C6> <D4C6> <5801> <D4C7> <D4C7> <580C> <D4C8> <D4C8> <57F1> <D4C9> <D4C9> <57E9> <D4CA> <D4CA> <57F0> <D4CB> <D4CB> <580D> <D4CC> <D4CC> <5804> <D4CD> <D4CD> <595C> <D4CE> <D4CE> <5A60> <D4CF> <D4CF> <5A58> <D4D0> <D4D0> <5A55> <D4D1> <D4D1> <5A67> <D4D2> <D4D2> <5A5E> <D4D3> <D4D3> <5A38> <D4D4> <D4D4> <5A35> <D4D5> <D4D5> <5A6D> <D4D6> <D4D6> <5A50> <D4D7> <D4D7> <5A5F> <D4D8> <D4D8> <5A65> <D4D9> <D4D9> <5A6C> <D4DA> <D4DA> <5A53> <D4DB> <D4DB> <5A64> <D4DC> <D4DC> <5A57> <D4DD> <D4DD> <5A43> <D4DE> <D4DE> <5A5D> <D4DF> <D4DF> <5A52> <D4E0> <D4E0> <5A44> <D4E1> <D4E1> <5A5B> <D4E2> <D4E2> <5A48> <D4E3> <D4E3> <5A8E> <D4E4> <D4E4> <5A3E> <D4E5> <D4E5> <5A4D> <D4E6> <D4E6> <5A39> <D4E7> <D4E7> <5A4C> <D4E8> <D4E8> <5A70> <D4E9> <D4E9> <5A69> <D4EA> <D4EA> <5A47> <D4EB> <D4EB> <5A51> <D4EC> <D4EC> <5A56> <D4ED> <D4ED> <5A42> <D4EE> <D4EE> <5A5C> <D4EF> <D4EF> <5B72> <D4F0> <D4F0> <5B6E> <D4F1> <D4F1> <5BC1> <D4F2> <D4F2> <5BC0> <D4F3> <D4F3> <5C59> <D4F4> <D4F4> <5D1E> <D4F5> <D4F5> <5D0B> <D4F6> <D4F6> <5D1D> <D4F7> <D4F7> <5D1A> <D4F8> <D4F8> <5D20> <D4F9> <D4F9> <5D0C> <D4FA> <D4FA> <5D28> <D4FB> <D4FB> <5D0D> <D4FC> <D4FC> <5D26> <D4FD> <D4FD> <5D25> <D4FE> <D4FE> <5D0F> <D540> <D540> <5D30> <D541> <D541> <5D12> <D542> <D542> <5D23> <D543> <D543> <5D1F> <D544> <D544> <5D2E> <D545> <D545> <5E3E> <D546> <D546> <5E34> <D547> <D547> <5EB1> <D548> <D548> <5EB4> endbfrange 100 beginbfrange <D549> <D549> <5EB9> <D54A> <D54B> <5EB2> <D54C> <D54C> <5F36> <D54D> <D54D> <5F38> <D54E> <D54E> <5F9B> <D54F> <D54F> <5F96> <D550> <D550> <5F9F> <D551> <D551> <608A> <D552> <D552> <6090> <D553> <D553> <6086> <D554> <D554> <60BE> <D555> <D555> <60B0> <D556> <D556> <60BA> <D557> <D558> <60D3> <D559> <D559> <60CF> <D55A> <D55A> <60E4> <D55B> <D55B> <60D9> <D55C> <D55C> <60DD> <D55D> <D55D> <60C8> <D55E> <D55E> <60B1> <D55F> <D55F> <60DB> <D560> <D560> <60B7> <D561> <D561> <60CA> <D562> <D562> <60BF> <D563> <D563> <60C3> <D564> <D564> <60CD> <D565> <D565> <60C0> <D566> <D566> <6332> <D567> <D567> <6365> <D568> <D568> <638A> <D569> <D569> <6382> <D56A> <D56A> <637D> <D56B> <D56B> <63BD> <D56C> <D56C> <639E> <D56D> <D56D> <63AD> <D56E> <D56E> <639D> <D56F> <D56F> <6397> <D570> <D570> <63AB> <D571> <D571> <638E> <D572> <D572> <636F> <D573> <D573> <6387> <D574> <D574> <6390> <D575> <D575> <636E> <D576> <D576> <63AF> <D577> <D577> <6375> <D578> <D578> <639C> <D579> <D579> <636D> <D57A> <D57A> <63AE> <D57B> <D57B> <637C> <D57C> <D57C> <63A4> <D57D> <D57D> <633B> <D57E> <D57E> <639F> <D5A1> <D5A1> <6378> <D5A2> <D5A2> <6385> <D5A3> <D5A3> <6381> <D5A4> <D5A4> <6391> <D5A5> <D5A5> <638D> <D5A6> <D5A6> <6370> <D5A7> <D5A7> <6553> <D5A8> <D5A8> <65CD> <D5A9> <D5A9> <6665> <D5AA> <D5AA> <6661> <D5AB> <D5AB> <665B> <D5AC> <D5AC> <6659> <D5AD> <D5AD> <665C> <D5AE> <D5AE> <6662> <D5AF> <D5AF> <6718> <D5B0> <D5B0> <6879> <D5B1> <D5B1> <6887> <D5B2> <D5B2> <6890> <D5B3> <D5B3> <689C> <D5B4> <D5B5> <686D> <D5B6> <D5B6> <68AE> <D5B7> <D5B7> <68AB> <D5B8> <D5B8> <6956> <D5B9> <D5B9> <686F> <D5BA> <D5BA> <68A3> <D5BB> <D5BB> <68AC> <D5BC> <D5BC> <68A9> <D5BD> <D5BD> <6875> <D5BE> <D5BE> <6874> <D5BF> <D5BF> <68B2> <D5C0> <D5C0> <688F> <D5C1> <D5C1> <6877> <D5C2> <D5C2> <6892> <D5C3> <D5C3> <687C> <D5C4> <D5C4> <686B> <D5C5> <D5C5> <6872> <D5C6> <D5C6> <68AA> <D5C7> <D5C7> <6880> <D5C8> <D5C8> <6871> <D5C9> <D5C9> <687E> <D5CA> <D5CA> <689B> <D5CB> <D5CB> <6896> <D5CC> <D5CC> <688B> <D5CD> <D5CD> <68A0> <D5CE> <D5CE> <6889> <D5CF> <D5CF> <68A4> <D5D0> <D5D0> <6878> <D5D1> <D5D1> <687B> endbfrange 100 beginbfrange <D5D2> <D5D2> <6891> <D5D3> <D5D3> <688C> <D5D4> <D5D4> <688A> <D5D5> <D5D5> <687D> <D5D6> <D5D6> <6B36> <D5D7> <D5D7> <6B33> <D5D8> <D5D9> <6B37> <D5DA> <D5DA> <6B91> <D5DB> <D5DB> <6B8F> <D5DC> <D5DD> <6B8D> <D5DE> <D5DE> <6B8C> <D5DF> <D5DF> <6C2A> <D5E0> <D5E0> <6DC0> <D5E1> <D5E1> <6DAB> <D5E2> <D5E2> <6DB4> <D5E3> <D5E3> <6DB3> <D5E4> <D5E4> <6E74> <D5E5> <D5E5> <6DAC> <D5E6> <D5E6> <6DE9> <D5E7> <D5E7> <6DE2> <D5E8> <D5E8> <6DB7> <D5E9> <D5E9> <6DF6> <D5EA> <D5EA> <6DD4> <D5EB> <D5EB> <6E00> <D5EC> <D5EC> <6DC8> <D5ED> <D5ED> <6DE0> <D5EE> <D5EE> <6DDF> <D5EF> <D5EF> <6DD6> <D5F0> <D5F0> <6DBE> <D5F1> <D5F1> <6DE5> <D5F2> <D5F3> <6DDC> <D5F4> <D5F4> <6DDB> <D5F5> <D5F5> <6DF4> <D5F6> <D5F6> <6DCA> <D5F7> <D5F7> <6DBD> <D5F8> <D5F8> <6DED> <D5F9> <D5F9> <6DF0> <D5FA> <D5FA> <6DBA> <D5FB> <D5FB> <6DD5> <D5FC> <D5FC> <6DC2> <D5FD> <D5FD> <6DCF> <D5FE> <D5FE> <6DC9> <D640> <D640> <6DD0> <D641> <D641> <6DF2> <D642> <D642> <6DD3> <D643> <D643> <6DFD> <D644> <D644> <6DD7> <D645> <D645> <6DCD> <D646> <D646> <6DE3> <D647> <D647> <6DBB> <D648> <D648> <70FA> <D649> <D649> <710D> <D64A> <D64A> <70F7> <D64B> <D64B> <7117> <D64C> <D64C> <70F4> <D64D> <D64D> <710C> <D64E> <D64E> <70F0> <D64F> <D64F> <7104> <D650> <D650> <70F3> <D651> <D651> <7110> <D652> <D652> <70FC> <D653> <D653> <70FF> <D654> <D654> <7106> <D655> <D655> <7113> <D656> <D656> <7100> <D657> <D657> <70F8> <D658> <D658> <70F6> <D659> <D659> <710B> <D65A> <D65A> <7102> <D65B> <D65B> <710E> <D65C> <D65C> <727E> <D65D> <D65E> <727B> <D65F> <D65F> <727F> <D660> <D660> <731D> <D661> <D661> <7317> <D662> <D662> <7307> <D663> <D663> <7311> <D664> <D664> <7318> <D665> <D665> <730A> <D666> <D666> <7308> <D667> <D667> <72FF> <D668> <D668> <730F> <D669> <D669> <731E> <D66A> <D66A> <7388> <D66B> <D66B> <73F6> <D66C> <D66C> <73F8> <D66D> <D66D> <73F5> <D66E> <D66E> <7404> <D66F> <D66F> <7401> <D670> <D670> <73FD> <D671> <D671> <7407> <D672> <D672> <7400> <D673> <D673> <73FA> <D674> <D674> <73FC> <D675> <D675> <73FF> <D676> <D676> <740C> <D677> <D677> <740B> <D678> <D678> <73F4> <D679> <D679> <7408> <D67A> <D67A> <7564> endbfrange 100 beginbfrange <D67B> <D67B> <7563> <D67C> <D67C> <75CE> <D67D> <D67D> <75D2> <D67E> <D67E> <75CF> <D6A1> <D6A2> <75CB> <D6A3> <D6A3> <75D1> <D6A4> <D6A4> <75D0> <D6A5> <D6A5> <768F> <D6A6> <D6A6> <7689> <D6A7> <D6A7> <76D3> <D6A8> <D6A8> <7739> <D6A9> <D6A9> <772F> <D6AA> <D6AA> <772D> <D6AB> <D6AC> <7731> <D6AD> <D6AD> <7734> <D6AE> <D6AE> <7733> <D6AF> <D6AF> <773D> <D6B0> <D6B0> <7725> <D6B1> <D6B1> <773B> <D6B2> <D6B2> <7735> <D6B3> <D6B3> <7848> <D6B4> <D6B4> <7852> <D6B5> <D6B5> <7849> <D6B6> <D6B6> <784D> <D6B7> <D6B7> <784A> <D6B8> <D6B8> <784C> <D6B9> <D6B9> <7826> <D6BA> <D6BA> <7845> <D6BB> <D6BB> <7850> <D6BC> <D6BC> <7964> <D6BD> <D6BD> <7967> <D6BE> <D6BF> <7969> <D6C0> <D6C0> <7963> <D6C1> <D6C1> <796B> <D6C2> <D6C2> <7961> <D6C3> <D6C3> <79BB> <D6C4> <D6C4> <79FA> <D6C5> <D6C5> <79F8> <D6C6> <D6C7> <79F6> <D6C8> <D6C8> <7A8F> <D6C9> <D6C9> <7A94> <D6CA> <D6CA> <7A90> <D6CB> <D6CB> <7B35> <D6CC> <D6CC> <7B47> <D6CD> <D6CD> <7B34> <D6CE> <D6CE> <7B25> <D6CF> <D6CF> <7B30> <D6D0> <D6D0> <7B22> <D6D1> <D6D1> <7B24> <D6D2> <D6D2> <7B33> <D6D3> <D6D3> <7B18> <D6D4> <D6D4> <7B2A> <D6D5> <D6D5> <7B1D> <D6D6> <D6D6> <7B31> <D6D7> <D6D7> <7B2B> <D6D8> <D6D8> <7B2D> <D6D9> <D6D9> <7B2F> <D6DA> <D6DA> <7B32> <D6DB> <D6DB> <7B38> <D6DC> <D6DC> <7B1A> <D6DD> <D6DD> <7B23> <D6DE> <D6DE> <7C94> <D6DF> <D6DF> <7C98> <D6E0> <D6E0> <7C96> <D6E1> <D6E1> <7CA3> <D6E2> <D6E2> <7D35> <D6E3> <D6E3> <7D3D> <D6E4> <D6E4> <7D38> <D6E5> <D6E5> <7D36> <D6E6> <D6E6> <7D3A> <D6E7> <D6E7> <7D45> <D6E8> <D6E8> <7D2C> <D6E9> <D6E9> <7D29> <D6EA> <D6EA> <7D41> <D6EB> <D6EB> <7D47> <D6EC> <D6ED> <7D3E> <D6EE> <D6EE> <7D4A> <D6EF> <D6EF> <7D3B> <D6F0> <D6F0> <7D28> <D6F1> <D6F1> <7F63> <D6F2> <D6F2> <7F95> <D6F3> <D6F4> <7F9C> <D6F5> <D6F5> <7F9B> <D6F6> <D6F7> <7FCA> <D6F8> <D6F8> <7FCD> <D6F9> <D6FA> <7FD0> <D6FB> <D6FB> <7FC7> <D6FC> <D6FC> <7FCF> <D6FD> <D6FD> <7FC9> <D6FE> <D6FE> <801F> <D740> <D740> <801E> <D741> <D741> <801B> <D742> <D742> <8047> <D743> <D743> <8043> <D744> <D744> <8048> <D745> <D745> <8118> <D746> <D746> <8125> <D747> <D747> <8119> <D748> <D748> <811B> <D749> <D749> <812D> endbfrange 100 beginbfrange <D74A> <D74A> <811F> <D74B> <D74B> <812C> <D74C> <D74C> <811E> <D74D> <D74D> <8121> <D74E> <D74E> <8115> <D74F> <D74F> <8127> <D750> <D750> <811D> <D751> <D751> <8122> <D752> <D752> <8211> <D753> <D753> <8238> <D754> <D754> <8233> <D755> <D755> <823A> <D756> <D756> <8234> <D757> <D757> <8232> <D758> <D758> <8274> <D759> <D759> <8390> <D75A> <D75A> <83A3> <D75B> <D75B> <83A8> <D75C> <D75C> <838D> <D75D> <D75D> <837A> <D75E> <D75E> <8373> <D75F> <D75F> <83A4> <D760> <D760> <8374> <D761> <D761> <838F> <D762> <D762> <8381> <D763> <D763> <8395> <D764> <D764> <8399> <D765> <D765> <8375> <D766> <D766> <8394> <D767> <D767> <83A9> <D768> <D768> <837D> <D769> <D769> <8383> <D76A> <D76A> <838C> <D76B> <D76B> <839D> <D76C> <D76C> <839B> <D76D> <D76D> <83AA> <D76E> <D76E> <838B> <D76F> <D76F> <837E> <D770> <D770> <83A5> <D771> <D771> <83AF> <D772> <D772> <8388> <D773> <D773> <8397> <D774> <D774> <83B0> <D775> <D775> <837F> <D776> <D776> <83A6> <D777> <D777> <8387> <D778> <D778> <83AE> <D779> <D779> <8376> <D77A> <D77A> <839A> <D77B> <D77B> <8659> <D77C> <D77C> <8656> <D77D> <D77D> <86BF> <D77E> <D77E> <86B7> <D7A1> <D7A1> <86C2> <D7A2> <D7A2> <86C1> <D7A3> <D7A3> <86C5> <D7A4> <D7A4> <86BA> <D7A5> <D7A5> <86B0> <D7A6> <D7A6> <86C8> <D7A7> <D7A7> <86B9> <D7A8> <D7A8> <86B3> <D7A9> <D7A9> <86B8> <D7AA> <D7AA> <86CC> <D7AB> <D7AB> <86B4> <D7AC> <D7AD> <86BB> <D7AE> <D7AE> <86C3> <D7AF> <D7B0> <86BD> <D7B1> <D7B1> <8852> <D7B2> <D7B2> <8889> <D7B3> <D7B3> <8895> <D7B4> <D7B4> <88A8> <D7B5> <D7B5> <88A2> <D7B6> <D7B6> <88AA> <D7B7> <D7B7> <889A> <D7B8> <D7B8> <8891> <D7B9> <D7B9> <88A1> <D7BA> <D7BA> <889F> <D7BB> <D7BB> <8898> <D7BC> <D7BC> <88A7> <D7BD> <D7BD> <8899> <D7BE> <D7BE> <889B> <D7BF> <D7BF> <8897> <D7C0> <D7C0> <88A4> <D7C1> <D7C1> <88AC> <D7C2> <D7C2> <888C> <D7C3> <D7C3> <8893> <D7C4> <D7C4> <888E> <D7C5> <D7C5> <8982> <D7C6> <D7C6> <89D6> <D7C7> <D7C7> <89D9> <D7C8> <D7C8> <89D5> <D7C9> <D7C9> <8A30> <D7CA> <D7CA> <8A27> <D7CB> <D7CB> <8A2C> <D7CC> <D7CC> <8A1E> <D7CD> <D7CD> <8C39> <D7CE> <D7CE> <8C3B> <D7CF> <D7D0> <8C5C> <D7D1> <D7D1> <8C7D> <D7D2> <D7D2> <8CA5> endbfrange 100 beginbfrange <D7D3> <D7D3> <8D7D> <D7D4> <D7D4> <8D7B> <D7D5> <D7D5> <8D79> <D7D6> <D7D6> <8DBC> <D7D7> <D7D7> <8DC2> <D7D8> <D7D8> <8DB9> <D7D9> <D7D9> <8DBF> <D7DA> <D7DA> <8DC1> <D7DB> <D7DB> <8ED8> <D7DC> <D7DC> <8EDE> <D7DD> <D7DD> <8EDD> <D7DE> <D7DE> <8EDC> <D7DF> <D7DF> <8ED7> <D7E0> <D7E1> <8EE0> <D7E2> <D7E2> <9024> <D7E3> <D7E3> <900B> <D7E4> <D7E4> <9011> <D7E5> <D7E5> <901C> <D7E6> <D7E6> <900C> <D7E7> <D7E7> <9021> <D7E8> <D7E8> <90EF> <D7E9> <D7E9> <90EA> <D7EA> <D7EA> <90F0> <D7EB> <D7EB> <90F4> <D7EC> <D7ED> <90F2> <D7EE> <D7EE> <90D4> <D7EF> <D7F0> <90EB> <D7F1> <D7F1> <90E9> <D7F2> <D7F2> <9156> <D7F3> <D7F3> <9158> <D7F4> <D7F4> <915A> <D7F5> <D7F5> <9153> <D7F6> <D7F6> <9155> <D7F7> <D7F7> <91EC> <D7F8> <D7F8> <91F4> <D7F9> <D7F9> <91F1> <D7FA> <D7FA> <91F3> <D7FB> <D7FB> <91F8> <D7FC> <D7FC> <91E4> <D7FD> <D7FD> <91F9> <D7FE> <D7FE> <91EA> <D840> <D840> <91EB> <D841> <D841> <91F7> <D842> <D842> <91E8> <D843> <D843> <91EE> <D844> <D844> <957A> <D845> <D845> <9586> <D846> <D846> <9588> <D847> <D847> <967C> <D848> <D848> <966D> <D849> <D849> <966B> <D84A> <D84A> <9671> <D84B> <D84B> <966F> <D84C> <D84C> <96BF> <D84D> <D84D> <976A> <D84E> <D84E> <9804> <D84F> <D84F> <98E5> <D850> <D850> <9997> <D851> <D851> <509B> <D852> <D852> <5095> <D853> <D853> <5094> <D854> <D854> <509E> <D855> <D855> <508B> <D856> <D856> <50A3> <D857> <D857> <5083> <D858> <D858> <508C> <D859> <D859> <508E> <D85A> <D85A> <509D> <D85B> <D85B> <5068> <D85C> <D85C> <509C> <D85D> <D85D> <5092> <D85E> <D85E> <5082> <D85F> <D85F> <5087> <D860> <D860> <515F> <D861> <D861> <51D4> <D862> <D862> <5312> <D863> <D863> <5311> <D864> <D864> <53A4> <D865> <D865> <53A7> <D866> <D866> <5591> <D867> <D867> <55A8> <D868> <D868> <55A5> <D869> <D869> <55AD> <D86A> <D86A> <5577> <D86B> <D86B> <5645> <D86C> <D86C> <55A2> <D86D> <D86D> <5593> <D86E> <D86E> <5588> <D86F> <D86F> <558F> <D870> <D870> <55B5> <D871> <D871> <5581> <D872> <D872> <55A3> <D873> <D873> <5592> <D874> <D874> <55A4> <D875> <D875> <557D> <D876> <D876> <558C> <D877> <D877> <55A6> <D878> <D878> <557F> <D879> <D879> <5595> <D87A> <D87A> <55A1> endbfrange 100 beginbfrange <D87B> <D87B> <558E> <D87C> <D87C> <570C> <D87D> <D87D> <5829> <D87E> <D87E> <5837> <D8A1> <D8A1> <5819> <D8A2> <D8A2> <581E> <D8A3> <D8A3> <5827> <D8A4> <D8A4> <5823> <D8A5> <D8A5> <5828> <D8A6> <D8A6> <57F5> <D8A7> <D8A7> <5848> <D8A8> <D8A8> <5825> <D8A9> <D8A9> <581C> <D8AA> <D8AA> <581B> <D8AB> <D8AB> <5833> <D8AC> <D8AC> <583F> <D8AD> <D8AD> <5836> <D8AE> <D8AE> <582E> <D8AF> <D8AF> <5839> <D8B0> <D8B0> <5838> <D8B1> <D8B1> <582D> <D8B2> <D8B2> <582C> <D8B3> <D8B3> <583B> <D8B4> <D8B4> <5961> <D8B5> <D8B5> <5AAF> <D8B6> <D8B6> <5A94> <D8B7> <D8B7> <5A9F> <D8B8> <D8B8> <5A7A> <D8B9> <D8B9> <5AA2> <D8BA> <D8BA> <5A9E> <D8BB> <D8BB> <5A78> <D8BC> <D8BC> <5AA6> <D8BD> <D8BD> <5A7C> <D8BE> <D8BE> <5AA5> <D8BF> <D8BF> <5AAC> <D8C0> <D8C0> <5A95> <D8C1> <D8C1> <5AAE> <D8C2> <D8C2> <5A37> <D8C3> <D8C3> <5A84> <D8C4> <D8C4> <5A8A> <D8C5> <D8C5> <5A97> <D8C6> <D8C6> <5A83> <D8C7> <D8C7> <5A8B> <D8C8> <D8C8> <5AA9> <D8C9> <D8C9> <5A7B> <D8CA> <D8CA> <5A7D> <D8CB> <D8CB> <5A8C> <D8CC> <D8CC> <5A9C> <D8CD> <D8CD> <5A8F> <D8CE> <D8CE> <5A93> <D8CF> <D8CF> <5A9D> <D8D0> <D8D0> <5BEA> <D8D1> <D8D1> <5BCD> <D8D2> <D8D2> <5BCB> <D8D3> <D8D3> <5BD4> <D8D4> <D8D4> <5BD1> <D8D5> <D8D5> <5BCA> <D8D6> <D8D6> <5BCE> <D8D7> <D8D7> <5C0C> <D8D8> <D8D8> <5C30> <D8D9> <D8D9> <5D37> <D8DA> <D8DA> <5D43> <D8DB> <D8DB> <5D6B> <D8DC> <D8DC> <5D41> <D8DD> <D8DD> <5D4B> <D8DE> <D8DE> <5D3F> <D8DF> <D8DF> <5D35> <D8E0> <D8E0> <5D51> <D8E1> <D8E1> <5D4E> <D8E2> <D8E2> <5D55> <D8E3> <D8E3> <5D33> <D8E4> <D8E4> <5D3A> <D8E5> <D8E5> <5D52> <D8E6> <D8E6> <5D3D> <D8E7> <D8E7> <5D31> <D8E8> <D8E8> <5D59> <D8E9> <D8E9> <5D42> <D8EA> <D8EA> <5D39> <D8EB> <D8EB> <5D49> <D8EC> <D8EC> <5D38> <D8ED> <D8ED> <5D3C> <D8EE> <D8EE> <5D32> <D8EF> <D8EF> <5D36> <D8F0> <D8F0> <5D40> <D8F1> <D8F1> <5D45> <D8F2> <D8F2> <5E44> <D8F3> <D8F3> <5E41> <D8F4> <D8F4> <5F58> <D8F5> <D8F5> <5FA6> <D8F6> <D8F6> <5FA5> <D8F7> <D8F7> <5FAB> <D8F8> <D8F8> <60C9> <D8F9> <D8F9> <60B9> <D8FA> <D8FA> <60CC> <D8FB> <D8FB> <60E2> <D8FC> <D8FC> <60CE> <D8FD> <D8FD> <60C4> <D8FE> <D8FE> <6114> <D940> <D940> <60F2> <D941> <D941> <610A> endbfrange 100 beginbfrange <D942> <D942> <6116> <D943> <D943> <6105> <D944> <D944> <60F5> <D945> <D945> <6113> <D946> <D946> <60F8> <D947> <D947> <60FC> <D948> <D948> <60FE> <D949> <D949> <60C1> <D94A> <D94A> <6103> <D94B> <D94B> <6118> <D94C> <D94C> <611D> <D94D> <D94D> <6110> <D94E> <D94E> <60FF> <D94F> <D94F> <6104> <D950> <D950> <610B> <D951> <D951> <624A> <D952> <D952> <6394> <D953> <D953> <63B1> <D954> <D954> <63B0> <D955> <D955> <63CE> <D956> <D956> <63E5> <D957> <D957> <63E8> <D958> <D958> <63EF> <D959> <D959> <63C3> <D95A> <D95A> <649D> <D95B> <D95B> <63F3> <D95C> <D95C> <63CA> <D95D> <D95D> <63E0> <D95E> <D95E> <63F6> <D95F> <D95F> <63D5> <D960> <D960> <63F2> <D961> <D961> <63F5> <D962> <D962> <6461> <D963> <D963> <63DF> <D964> <D964> <63BE> <D965> <D965> <63DD> <D966> <D966> <63DC> <D967> <D967> <63C4> <D968> <D968> <63D8> <D969> <D969> <63D3> <D96A> <D96A> <63C2> <D96B> <D96B> <63C7> <D96C> <D96C> <63CC> <D96D> <D96D> <63CB> <D96E> <D96E> <63C8> <D96F> <D96F> <63F0> <D970> <D970> <63D7> <D971> <D971> <63D9> <D972> <D972> <6532> <D973> <D973> <6567> <D974> <D974> <656A> <D975> <D975> <6564> <D976> <D976> <655C> <D977> <D977> <6568> <D978> <D978> <6565> <D979> <D979> <658C> <D97A> <D97B> <659D> <D97C> <D97C> <65AE> <D97D> <D97D> <65D0> <D97E> <D97E> <65D2> <D9A1> <D9A1> <667C> <D9A2> <D9A2> <666C> <D9A3> <D9A3> <667B> <D9A4> <D9A4> <6680> <D9A5> <D9A5> <6671> <D9A6> <D9A6> <6679> <D9A7> <D9A7> <666A> <D9A8> <D9A8> <6672> <D9A9> <D9A9> <6701> <D9AA> <D9AA> <690C> <D9AB> <D9AB> <68D3> <D9AC> <D9AC> <6904> <D9AD> <D9AD> <68DC> <D9AE> <D9AE> <692A> <D9AF> <D9AF> <68EC> <D9B0> <D9B0> <68EA> <D9B1> <D9B1> <68F1> <D9B2> <D9B2> <690F> <D9B3> <D9B3> <68D6> <D9B4> <D9B4> <68F7> <D9B5> <D9B5> <68EB> <D9B6> <D9B6> <68E4> <D9B7> <D9B7> <68F6> <D9B8> <D9B8> <6913> <D9B9> <D9B9> <6910> <D9BA> <D9BA> <68F3> <D9BB> <D9BB> <68E1> <D9BC> <D9BC> <6907> <D9BD> <D9BD> <68CC> <D9BE> <D9BE> <6908> <D9BF> <D9BF> <6970> <D9C0> <D9C0> <68B4> <D9C1> <D9C1> <6911> <D9C2> <D9C2> <68EF> <D9C3> <D9C3> <68C6> <D9C4> <D9C4> <6914> <D9C5> <D9C5> <68F8> <D9C6> <D9C6> <68D0> <D9C7> <D9C7> <68FD> <D9C8> <D9C8> <68FC> endbfrange 100 beginbfrange <D9C9> <D9C9> <68E8> <D9CA> <D9CA> <690B> <D9CB> <D9CB> <690A> <D9CC> <D9CC> <6917> <D9CD> <D9CD> <68CE> <D9CE> <D9CE> <68C8> <D9CF> <D9D0> <68DD> <D9D1> <D9D1> <68E6> <D9D2> <D9D2> <68F4> <D9D3> <D9D3> <68D1> <D9D4> <D9D4> <6906> <D9D5> <D9D5> <68D4> <D9D6> <D9D6> <68E9> <D9D7> <D9D7> <6915> <D9D8> <D9D8> <6925> <D9D9> <D9D9> <68C7> <D9DA> <D9DA> <6B39> <D9DB> <D9DB> <6B3B> <D9DC> <D9DC> <6B3F> <D9DD> <D9DD> <6B3C> <D9DE> <D9DE> <6B94> <D9DF> <D9DF> <6B97> <D9E0> <D9E0> <6B99> <D9E1> <D9E1> <6B95> <D9E2> <D9E2> <6BBD> <D9E3> <D9E3> <6BF0> <D9E4> <D9E5> <6BF2> <D9E6> <D9E6> <6C30> <D9E7> <D9E7> <6DFC> <D9E8> <D9E9> <6E46> <D9EA> <D9EA> <6E1F> <D9EB> <D9EB> <6E49> <D9EC> <D9EC> <6E88> <D9ED> <D9EE> <6E3C> <D9EF> <D9EF> <6E45> <D9F0> <D9F0> <6E62> <D9F1> <D9F1> <6E2B> <D9F2> <D9F2> <6E3F> <D9F3> <D9F3> <6E41> <D9F4> <D9F4> <6E5D> <D9F5> <D9F5> <6E73> <D9F6> <D9F6> <6E1C> <D9F7> <D9F7> <6E33> <D9F8> <D9F8> <6E4B> <D9F9> <D9F9> <6E40> <D9FA> <D9FA> <6E51> <D9FB> <D9FB> <6E3B> <D9FC> <D9FC> <6E03> <D9FD> <D9FD> <6E2E> <D9FE> <D9FE> <6E5E> <DA40> <DA40> <6E68> <DA41> <DA41> <6E5C> <DA42> <DA42> <6E61> <DA43> <DA43> <6E31> <DA44> <DA44> <6E28> <DA45> <DA45> <6E60> <DA46> <DA46> <6E71> <DA47> <DA47> <6E6B> <DA48> <DA48> <6E39> <DA49> <DA49> <6E22> <DA4A> <DA4A> <6E30> <DA4B> <DA4B> <6E53> <DA4C> <DA4C> <6E65> <DA4D> <DA4D> <6E27> <DA4E> <DA4E> <6E78> <DA4F> <DA4F> <6E64> <DA50> <DA50> <6E77> <DA51> <DA51> <6E55> <DA52> <DA52> <6E79> <DA53> <DA53> <6E52> <DA54> <DA54> <6E66> <DA55> <DA56> <6E35> <DA57> <DA57> <6E5A> <DA58> <DA58> <7120> <DA59> <DA59> <711E> <DA5A> <DA5A> <712F> <DA5B> <DA5B> <70FB> <DA5C> <DA5C> <712E> <DA5D> <DA5D> <7131> <DA5E> <DA5E> <7123> <DA5F> <DA5F> <7125> <DA60> <DA60> <7122> <DA61> <DA61> <7132> <DA62> <DA62> <711F> <DA63> <DA63> <7128> <DA64> <DA64> <713A> <DA65> <DA65> <711B> <DA66> <DA66> <724B> <DA67> <DA67> <725A> <DA68> <DA69> <7288> <DA6A> <DA6A> <7286> <DA6B> <DA6B> <7285> <DA6C> <DA6C> <728B> <DA6D> <DA6D> <7312> <DA6E> <DA6E> <730B> <DA6F> <DA6F> <7330> <DA70> <DA70> <7322> <DA71> <DA71> <7331> <DA72> <DA72> <7333> <DA73> <DA73> <7327> endbfrange 100 beginbfrange <DA74> <DA74> <7332> <DA75> <DA75> <732D> <DA76> <DA76> <7326> <DA77> <DA77> <7323> <DA78> <DA78> <7335> <DA79> <DA79> <730C> <DA7A> <DA7A> <742E> <DA7B> <DA7B> <742C> <DA7C> <DA7C> <7430> <DA7D> <DA7D> <742B> <DA7E> <DA7E> <7416> <DAA1> <DAA1> <741A> <DAA2> <DAA2> <7421> <DAA3> <DAA3> <742D> <DAA4> <DAA4> <7431> <DAA5> <DAA5> <7424> <DAA6> <DAA6> <7423> <DAA7> <DAA7> <741D> <DAA8> <DAA8> <7429> <DAA9> <DAA9> <7420> <DAAA> <DAAA> <7432> <DAAB> <DAAB> <74FB> <DAAC> <DAAC> <752F> <DAAD> <DAAD> <756F> <DAAE> <DAAE> <756C> <DAAF> <DAAF> <75E7> <DAB0> <DAB0> <75DA> <DAB1> <DAB1> <75E1> <DAB2> <DAB2> <75E6> <DAB3> <DAB3> <75DD> <DAB4> <DAB4> <75DF> <DAB5> <DAB5> <75E4> <DAB6> <DAB6> <75D7> <DAB7> <DAB7> <7695> <DAB8> <DAB8> <7692> <DAB9> <DAB9> <76DA> <DABA> <DABB> <7746> <DABC> <DABC> <7744> <DABD> <DABD> <774D> <DABE> <DABE> <7745> <DABF> <DABF> <774A> <DAC0> <DAC0> <774E> <DAC1> <DAC2> <774B> <DAC3> <DAC3> <77DE> <DAC4> <DAC4> <77EC> <DAC5> <DAC5> <7860> <DAC6> <DAC7> <7864> <DAC8> <DAC8> <785C> <DAC9> <DAC9> <786D> <DACA> <DACA> <7871> <DACB> <DACB> <786A> <DACC> <DACC> <786E> <DACD> <DACD> <7870> <DACE> <DACE> <7869> <DACF> <DACF> <7868> <DAD0> <DAD0> <785E> <DAD1> <DAD1> <7862> <DAD2> <DAD2> <7974> <DAD3> <DAD3> <7973> <DAD4> <DAD4> <7972> <DAD5> <DAD5> <7970> <DAD6> <DAD6> <7A02> <DAD7> <DAD7> <7A0A> <DAD8> <DAD8> <7A03> <DAD9> <DAD9> <7A0C> <DADA> <DADA> <7A04> <DADB> <DADB> <7A99> <DADC> <DADC> <7AE6> <DADD> <DADD> <7AE4> <DADE> <DADE> <7B4A> <DADF> <DADF> <7B3B> <DAE0> <DAE0> <7B44> <DAE1> <DAE1> <7B48> <DAE2> <DAE2> <7B4C> <DAE3> <DAE3> <7B4E> <DAE4> <DAE4> <7B40> <DAE5> <DAE5> <7B58> <DAE6> <DAE6> <7B45> <DAE7> <DAE7> <7CA2> <DAE8> <DAE8> <7C9E> <DAE9> <DAE9> <7CA8> <DAEA> <DAEA> <7CA1> <DAEB> <DAEB> <7D58> <DAEC> <DAEC> <7D6F> <DAED> <DAED> <7D63> <DAEE> <DAEE> <7D53> <DAEF> <DAEF> <7D56> <DAF0> <DAF0> <7D67> <DAF1> <DAF1> <7D6A> <DAF2> <DAF2> <7D4F> <DAF3> <DAF3> <7D6D> <DAF4> <DAF4> <7D5C> <DAF5> <DAF5> <7D6B> <DAF6> <DAF6> <7D52> <DAF7> <DAF7> <7D54> <DAF8> <DAF8> <7D69> <DAF9> <DAF9> <7D51> <DAFA> <DAFA> <7D5F> <DAFB> <DAFB> <7D4E> <DAFC> <DAFD> <7F3E> endbfrange 100 beginbfrange <DAFE> <DAFE> <7F65> <DB40> <DB40> <7F66> <DB41> <DB41> <7FA2> <DB42> <DB43> <7FA0> <DB44> <DB44> <7FD7> <DB45> <DB45> <8051> <DB46> <DB47> <804F> <DB48> <DB48> <80FE> <DB49> <DB49> <80D4> <DB4A> <DB4A> <8143> <DB4B> <DB4B> <814A> <DB4C> <DB4C> <8152> <DB4D> <DB4D> <814F> <DB4E> <DB4E> <8147> <DB4F> <DB4F> <813D> <DB50> <DB50> <814D> <DB51> <DB51> <813A> <DB52> <DB52> <81E6> <DB53> <DB53> <81EE> <DB54> <DB56> <81F7> <DB57> <DB57> <8204> <DB58> <DB59> <823C> <DB5A> <DB5A> <823F> <DB5B> <DB5B> <8275> <DB5C> <DB5C> <833B> <DB5D> <DB5D> <83CF> <DB5E> <DB5E> <83F9> <DB5F> <DB5F> <8423> <DB60> <DB60> <83C0> <DB61> <DB61> <83E8> <DB62> <DB62> <8412> <DB63> <DB63> <83E7> <DB64> <DB64> <83E4> <DB65> <DB65> <83FC> <DB66> <DB66> <83F6> <DB67> <DB67> <8410> <DB68> <DB68> <83C6> <DB69> <DB69> <83C8> <DB6A> <DB6A> <83EB> <DB6B> <DB6B> <83E3> <DB6C> <DB6C> <83BF> <DB6D> <DB6D> <8401> <DB6E> <DB6E> <83DD> <DB6F> <DB6F> <83E5> <DB70> <DB70> <83D8> <DB71> <DB71> <83FF> <DB72> <DB72> <83E1> <DB73> <DB73> <83CB> <DB74> <DB74> <83CE> <DB75> <DB75> <83D6> <DB76> <DB76> <83F5> <DB77> <DB77> <83C9> <DB78> <DB78> <8409> <DB79> <DB79> <840F> <DB7A> <DB7A> <83DE> <DB7B> <DB7B> <8411> <DB7C> <DB7C> <8406> <DB7D> <DB7D> <83C2> <DB7E> <DB7E> <83F3> <DBA1> <DBA1> <83D5> <DBA2> <DBA2> <83FA> <DBA3> <DBA3> <83C7> <DBA4> <DBA4> <83D1> <DBA5> <DBA5> <83EA> <DBA6> <DBA6> <8413> <DBA7> <DBA7> <83C3> <DBA8> <DBA8> <83EC> <DBA9> <DBA9> <83EE> <DBAA> <DBAA> <83C4> <DBAB> <DBAB> <83FB> <DBAC> <DBAC> <83D7> <DBAD> <DBAD> <83E2> <DBAE> <DBAE> <841B> <DBAF> <DBAF> <83DB> <DBB0> <DBB0> <83FE> <DBB1> <DBB1> <86D8> <DBB2> <DBB2> <86E2> <DBB3> <DBB3> <86E6> <DBB4> <DBB4> <86D3> <DBB5> <DBB5> <86E3> <DBB6> <DBB6> <86DA> <DBB7> <DBB7> <86EA> <DBB8> <DBB8> <86DD> <DBB9> <DBB9> <86EB> <DBBA> <DBBA> <86DC> <DBBB> <DBBB> <86EC> <DBBC> <DBBC> <86E9> <DBBD> <DBBD> <86D7> <DBBE> <DBBE> <86E8> <DBBF> <DBBF> <86D1> <DBC0> <DBC0> <8848> <DBC1> <DBC1> <8856> <DBC2> <DBC2> <8855> <DBC3> <DBC3> <88BA> <DBC4> <DBC4> <88D7> <DBC5> <DBC5> <88B9> <DBC6> <DBC6> <88B8> <DBC7> <DBC7> <88C0> <DBC8> <DBC8> <88BE> <DBC9> <DBC9> <88B6> endbfrange 100 beginbfrange <DBCA> <DBCA> <88BC> <DBCB> <DBCB> <88B7> <DBCC> <DBCC> <88BD> <DBCD> <DBCD> <88B2> <DBCE> <DBCE> <8901> <DBCF> <DBCF> <88C9> <DBD0> <DBD0> <8995> <DBD1> <DBD1> <8998> <DBD2> <DBD2> <8997> <DBD3> <DBD3> <89DD> <DBD4> <DBD5> <89DA> <DBD6> <DBD6> <8A4E> <DBD7> <DBD7> <8A4D> <DBD8> <DBD8> <8A39> <DBD9> <DBD9> <8A59> <DBDA> <DBDA> <8A40> <DBDB> <DBDC> <8A57> <DBDD> <DBDE> <8A44> <DBDF> <DBDF> <8A52> <DBE0> <DBE0> <8A48> <DBE1> <DBE1> <8A51> <DBE2> <DBE2> <8A4A> <DBE3> <DBE3> <8A4C> <DBE4> <DBE4> <8A4F> <DBE5> <DBE5> <8C5F> <DBE6> <DBE6> <8C81> <DBE7> <DBE7> <8C80> <DBE8> <DBE8> <8CBA> <DBE9> <DBE9> <8CBE> <DBEA> <DBEA> <8CB0> <DBEB> <DBEB> <8CB9> <DBEC> <DBEC> <8CB5> <DBED> <DBED> <8D84> <DBEE> <DBEE> <8D80> <DBEF> <DBEF> <8D89> <DBF0> <DBF0> <8DD8> <DBF1> <DBF1> <8DD3> <DBF2> <DBF2> <8DCD> <DBF3> <DBF3> <8DC7> <DBF4> <DBF4> <8DD6> <DBF5> <DBF5> <8DDC> <DBF6> <DBF6> <8DCF> <DBF7> <DBF7> <8DD5> <DBF8> <DBF8> <8DD9> <DBF9> <DBF9> <8DC8> <DBFA> <DBFA> <8DD7> <DBFB> <DBFB> <8DC5> <DBFC> <DBFC> <8EEF> <DBFD> <DBFD> <8EF7> <DBFE> <DBFE> <8EFA> <DC40> <DC40> <8EF9> <DC41> <DC41> <8EE6> <DC42> <DC42> <8EEE> <DC43> <DC43> <8EE5> <DC44> <DC44> <8EF5> <DC45> <DC46> <8EE7> <DC47> <DC47> <8EF6> <DC48> <DC48> <8EEB> <DC49> <DC49> <8EF1> <DC4A> <DC4A> <8EEC> <DC4B> <DC4B> <8EF4> <DC4C> <DC4C> <8EE9> <DC4D> <DC4D> <902D> <DC4E> <DC4E> <9034> <DC4F> <DC4F> <902F> <DC50> <DC50> <9106> <DC51> <DC51> <912C> <DC52> <DC52> <9104> <DC53> <DC53> <90FF> <DC54> <DC54> <90FC> <DC55> <DC55> <9108> <DC56> <DC56> <90F9> <DC57> <DC57> <90FB> <DC58> <DC58> <9101> <DC59> <DC59> <9100> <DC5A> <DC5A> <9107> <DC5B> <DC5B> <9105> <DC5C> <DC5C> <9103> <DC5D> <DC5D> <9161> <DC5E> <DC5E> <9164> <DC5F> <DC5F> <915F> <DC60> <DC60> <9162> <DC61> <DC61> <9160> <DC62> <DC62> <9201> <DC63> <DC63> <920A> <DC64> <DC64> <9225> <DC65> <DC65> <9203> <DC66> <DC66> <921A> <DC67> <DC67> <9226> <DC68> <DC68> <920F> <DC69> <DC69> <920C> <DC6A> <DC6A> <9200> <DC6B> <DC6B> <9212> <DC6C> <DC6C> <91FF> <DC6D> <DC6D> <91FD> <DC6E> <DC6E> <9206> <DC6F> <DC6F> <9204> <DC70> <DC70> <9227> <DC71> <DC71> <9202> <DC72> <DC72> <921C> endbfrange 100 beginbfrange <DC73> <DC73> <9224> <DC74> <DC74> <9219> <DC75> <DC75> <9217> <DC76> <DC76> <9205> <DC77> <DC77> <9216> <DC78> <DC78> <957B> <DC79> <DC79> <958D> <DC7A> <DC7A> <958C> <DC7B> <DC7B> <9590> <DC7C> <DC7C> <9687> <DC7D> <DC7D> <967E> <DC7E> <DC7E> <9688> <DCA1> <DCA1> <9689> <DCA2> <DCA2> <9683> <DCA3> <DCA3> <9680> <DCA4> <DCA4> <96C2> <DCA5> <DCA5> <96C8> <DCA6> <DCA6> <96C3> <DCA7> <DCA7> <96F1> <DCA8> <DCA8> <96F0> <DCA9> <DCA9> <976C> <DCAA> <DCAA> <9770> <DCAB> <DCAB> <976E> <DCAC> <DCAC> <9807> <DCAD> <DCAD> <98A9> <DCAE> <DCAE> <98EB> <DCAF> <DCAF> <9CE6> <DCB0> <DCB0> <9EF9> <DCB1> <DCB2> <4E83> <DCB3> <DCB3> <4EB6> <DCB4> <DCB4> <50BD> <DCB5> <DCB5> <50BF> <DCB6> <DCB6> <50C6> <DCB7> <DCB7> <50AE> <DCB8> <DCB8> <50C4> <DCB9> <DCB9> <50CA> <DCBA> <DCBA> <50B4> <DCBB> <DCBB> <50C8> <DCBC> <DCBC> <50C2> <DCBD> <DCBD> <50B0> <DCBE> <DCBE> <50C1> <DCBF> <DCBF> <50BA> <DCC0> <DCC0> <50B1> <DCC1> <DCC1> <50CB> <DCC2> <DCC2> <50C9> <DCC3> <DCC3> <50B6> <DCC4> <DCC4> <50B8> <DCC5> <DCC5> <51D7> <DCC6> <DCC6> <527A> <DCC7> <DCC7> <5278> <DCC8> <DCC9> <527B> <DCCA> <DCCA> <55C3> <DCCB> <DCCB> <55DB> <DCCC> <DCCC> <55CC> <DCCD> <DCCD> <55D0> <DCCE> <DCCE> <55CB> <DCCF> <DCCF> <55CA> <DCD0> <DCD0> <55DD> <DCD1> <DCD1> <55C0> <DCD2> <DCD2> <55D4> <DCD3> <DCD3> <55C4> <DCD4> <DCD4> <55E9> <DCD5> <DCD5> <55BF> <DCD6> <DCD6> <55D2> <DCD7> <DCD7> <558D> <DCD8> <DCD8> <55CF> <DCD9> <DCD9> <55D5> <DCDA> <DCDA> <55E2> <DCDB> <DCDB> <55D6> <DCDC> <DCDC> <55C8> <DCDD> <DCDD> <55F2> <DCDE> <DCDE> <55CD> <DCDF> <DCDF> <55D9> <DCE0> <DCE0> <55C2> <DCE1> <DCE1> <5714> <DCE2> <DCE2> <5853> <DCE3> <DCE3> <5868> <DCE4> <DCE4> <5864> <DCE5> <DCE5> <584F> <DCE6> <DCE6> <584D> <DCE7> <DCE7> <5849> <DCE8> <DCE8> <586F> <DCE9> <DCE9> <5855> <DCEA> <DCEA> <584E> <DCEB> <DCEB> <585D> <DCEC> <DCEC> <5859> <DCED> <DCED> <5865> <DCEE> <DCEE> <585B> <DCEF> <DCEF> <583D> <DCF0> <DCF0> <5863> <DCF1> <DCF1> <5871> <DCF2> <DCF2> <58FC> <DCF3> <DCF3> <5AC7> <DCF4> <DCF4> <5AC4> <DCF5> <DCF5> <5ACB> <DCF6> <DCF6> <5ABA> <DCF7> <DCF7> <5AB8> <DCF8> <DCF8> <5AB1> <DCF9> <DCF9> <5AB5> <DCFA> <DCFA> <5AB0> endbfrange 100 beginbfrange <DCFB> <DCFB> <5ABF> <DCFC> <DCFC> <5AC8> <DCFD> <DCFD> <5ABB> <DCFE> <DCFE> <5AC6> <DD40> <DD40> <5AB7> <DD41> <DD41> <5AC0> <DD42> <DD42> <5ACA> <DD43> <DD43> <5AB4> <DD44> <DD44> <5AB6> <DD45> <DD45> <5ACD> <DD46> <DD46> <5AB9> <DD47> <DD47> <5A90> <DD48> <DD48> <5BD6> <DD49> <DD4A> <5BD8> <DD4B> <DD4B> <5C1F> <DD4C> <DD4C> <5C33> <DD4D> <DD4D> <5D71> <DD4E> <DD4E> <5D63> <DD4F> <DD4F> <5D4A> <DD50> <DD50> <5D65> <DD51> <DD51> <5D72> <DD52> <DD52> <5D6C> <DD53> <DD53> <5D5E> <DD54> <DD54> <5D68> <DD55> <DD55> <5D67> <DD56> <DD56> <5D62> <DD57> <DD57> <5DF0> <DD58> <DD58> <5E4F> <DD59> <DD59> <5E4E> <DD5A> <DD5A> <5E4A> <DD5B> <DD5B> <5E4D> <DD5C> <DD5C> <5E4B> <DD5D> <DD5D> <5EC5> <DD5E> <DD5E> <5ECC> <DD5F> <DD5F> <5EC6> <DD60> <DD60> <5ECB> <DD61> <DD61> <5EC7> <DD62> <DD62> <5F40> <DD63> <DD63> <5FAF> <DD64> <DD64> <5FAD> <DD65> <DD65> <60F7> <DD66> <DD67> <6149> <DD68> <DD68> <612B> <DD69> <DD69> <6145> <DD6A> <DD6A> <6136> <DD6B> <DD6B> <6132> <DD6C> <DD6C> <612E> <DD6D> <DD6D> <6146> <DD6E> <DD6E> <612F> <DD6F> <DD6F> <614F> <DD70> <DD70> <6129> <DD71> <DD71> <6140> <DD72> <DD72> <6220> <DD73> <DD73> <9168> <DD74> <DD74> <6223> <DD75> <DD75> <6225> <DD76> <DD76> <6224> <DD77> <DD77> <63C5> <DD78> <DD78> <63F1> <DD79> <DD79> <63EB> <DD7A> <DD7A> <6410> <DD7B> <DD7B> <6412> <DD7C> <DD7C> <6409> <DD7D> <DD7D> <6420> <DD7E> <DD7E> <6424> <DDA1> <DDA1> <6433> <DDA2> <DDA2> <6443> <DDA3> <DDA3> <641F> <DDA4> <DDA4> <6415> <DDA5> <DDA5> <6418> <DDA6> <DDA6> <6439> <DDA7> <DDA7> <6437> <DDA8> <DDA9> <6422> <DDAA> <DDAA> <640C> <DDAB> <DDAB> <6426> <DDAC> <DDAC> <6430> <DDAD> <DDAD> <6428> <DDAE> <DDAE> <6441> <DDAF> <DDAF> <6435> <DDB0> <DDB0> <642F> <DDB1> <DDB1> <640A> <DDB2> <DDB2> <641A> <DDB3> <DDB3> <6440> <DDB4> <DDB4> <6425> <DDB5> <DDB5> <6427> <DDB6> <DDB6> <640B> <DDB7> <DDB7> <63E7> <DDB8> <DDB8> <641B> <DDB9> <DDB9> <642E> <DDBA> <DDBA> <6421> <DDBB> <DDBB> <640E> <DDBC> <DDBC> <656F> <DDBD> <DDBD> <6592> <DDBE> <DDBE> <65D3> <DDBF> <DDBF> <6686> <DDC0> <DDC0> <668C> <DDC1> <DDC1> <6695> <DDC2> <DDC2> <6690> <DDC3> <DDC3> <668B> <DDC4> <DDC4> <668A> endbfrange 100 beginbfrange <DDC5> <DDC5> <6699> <DDC6> <DDC6> <6694> <DDC7> <DDC7> <6678> <DDC8> <DDC8> <6720> <DDC9> <DDC9> <6966> <DDCA> <DDCA> <695F> <DDCB> <DDCB> <6938> <DDCC> <DDCC> <694E> <DDCD> <DDCD> <6962> <DDCE> <DDCE> <6971> <DDCF> <DDCF> <693F> <DDD0> <DDD0> <6945> <DDD1> <DDD1> <696A> <DDD2> <DDD2> <6939> <DDD3> <DDD3> <6942> <DDD4> <DDD4> <6957> <DDD5> <DDD5> <6959> <DDD6> <DDD6> <697A> <DDD7> <DDD8> <6948> <DDD9> <DDD9> <6935> <DDDA> <DDDA> <696C> <DDDB> <DDDB> <6933> <DDDC> <DDDC> <693D> <DDDD> <DDDD> <6965> <DDDE> <DDDE> <68F0> <DDDF> <DDDF> <6978> <DDE0> <DDE0> <6934> <DDE1> <DDE1> <6969> <DDE2> <DDE2> <6940> <DDE3> <DDE3> <696F> <DDE4> <DDE4> <6944> <DDE5> <DDE5> <6976> <DDE6> <DDE6> <6958> <DDE7> <DDE7> <6941> <DDE8> <DDE8> <6974> <DDE9> <DDE9> <694C> <DDEA> <DDEA> <693B> <DDEB> <DDEB> <694B> <DDEC> <DDEC> <6937> <DDED> <DDED> <695C> <DDEE> <DDEE> <694F> <DDEF> <DDEF> <6951> <DDF0> <DDF0> <6932> <DDF1> <DDF1> <6952> <DDF2> <DDF2> <692F> <DDF3> <DDF3> <697B> <DDF4> <DDF4> <693C> <DDF5> <DDF5> <6B46> <DDF6> <DDF6> <6B45> <DDF7> <DDF7> <6B43> <DDF8> <DDF8> <6B42> <DDF9> <DDF9> <6B48> <DDFA> <DDFA> <6B41> <DDFB> <DDFB> <6B9B> <DDFC> <DDFC> <FA0D> <DDFD> <DDFE> <6BFB> <DE40> <DE40> <6BF9> <DE41> <DE42> <6BF7> <DE43> <DE43> <6E9B> <DE44> <DE44> <6ED6> <DE45> <DE45> <6EC8> <DE46> <DE46> <6E8F> <DE47> <DE47> <6EC0> <DE48> <DE48> <6E9F> <DE49> <DE4A> <6E93> <DE4B> <DE4B> <6EA0> <DE4C> <DE4C> <6EB1> <DE4D> <DE4D> <6EB9> <DE4E> <DE4E> <6EC6> <DE4F> <DE4F> <6ED2> <DE50> <DE50> <6EBD> <DE51> <DE51> <6EC1> <DE52> <DE52> <6E9E> <DE53> <DE53> <6EC9> <DE54> <DE54> <6EB7> <DE55> <DE55> <6EB0> <DE56> <DE56> <6ECD> <DE57> <DE57> <6EA6> <DE58> <DE58> <6ECF> <DE59> <DE59> <6EB2> <DE5A> <DE5A> <6EBE> <DE5B> <DE5B> <6EC3> <DE5C> <DE5C> <6EDC> <DE5D> <DE5D> <6ED8> <DE5E> <DE5E> <6E99> <DE5F> <DE5F> <6E92> <DE60> <DE60> <6E8E> <DE61> <DE61> <6E8D> <DE62> <DE62> <6EA4> <DE63> <DE63> <6EA1> <DE64> <DE64> <6EBF> <DE65> <DE65> <6EB3> <DE66> <DE66> <6ED0> <DE67> <DE67> <6ECA> <DE68> <DE68> <6E97> <DE69> <DE69> <6EAE> <DE6A> <DE6A> <6EA3> <DE6B> <DE6B> <7147> <DE6C> <DE6C> <7154> <DE6D> <DE6D> <7152> endbfrange 100 beginbfrange <DE6E> <DE6E> <7163> <DE6F> <DE6F> <7160> <DE70> <DE70> <7141> <DE71> <DE71> <715D> <DE72> <DE72> <7162> <DE73> <DE73> <7172> <DE74> <DE74> <7178> <DE75> <DE75> <716A> <DE76> <DE76> <7161> <DE77> <DE77> <7142> <DE78> <DE78> <7158> <DE79> <DE79> <7143> <DE7A> <DE7A> <714B> <DE7B> <DE7B> <7170> <DE7C> <DE7C> <715F> <DE7D> <DE7D> <7150> <DE7E> <DE7E> <7153> <DEA1> <DEA1> <7144> <DEA2> <DEA2> <714D> <DEA3> <DEA3> <715A> <DEA4> <DEA4> <724F> <DEA5> <DEA5> <728D> <DEA6> <DEA6> <728C> <DEA7> <DEA7> <7291> <DEA8> <DEA8> <7290> <DEA9> <DEA9> <728E> <DEAA> <DEAA> <733C> <DEAB> <DEAB> <7342> <DEAC> <DEAC> <733B> <DEAD> <DEAD> <733A> <DEAE> <DEAE> <7340> <DEAF> <DEAF> <734A> <DEB0> <DEB0> <7349> <DEB1> <DEB1> <7444> <DEB2> <DEB3> <744A> <DEB4> <DEB4> <7452> <DEB5> <DEB5> <7451> <DEB6> <DEB6> <7457> <DEB7> <DEB7> <7440> <DEB8> <DEB9> <744F> <DEBA> <DEBA> <744E> <DEBB> <DEBB> <7442> <DEBC> <DEBC> <7446> <DEBD> <DEBD> <744D> <DEBE> <DEBE> <7454> <DEBF> <DEBF> <74E1> <DEC0> <DEC0> <74FF> <DEC1> <DEC1> <74FE> <DEC2> <DEC2> <74FD> <DEC3> <DEC3> <751D> <DEC4> <DEC4> <7579> <DEC5> <DEC5> <7577> <DEC6> <DEC6> <6983> <DEC7> <DEC7> <75EF> <DEC8> <DEC8> <760F> <DEC9> <DEC9> <7603> <DECA> <DECA> <75F7> <DECB> <DECB> <75FE> <DECC> <DECC> <75FC> <DECD> <DECD> <75F9> <DECE> <DECE> <75F8> <DECF> <DECF> <7610> <DED0> <DED0> <75FB> <DED1> <DED1> <75F6> <DED2> <DED2> <75ED> <DED3> <DED3> <75F5> <DED4> <DED4> <75FD> <DED5> <DED5> <7699> <DED6> <DED6> <76B5> <DED7> <DED7> <76DD> <DED8> <DED8> <7755> <DED9> <DEDA> <775F> <DEDB> <DEDB> <7752> <DEDC> <DEDC> <7756> <DEDD> <DEDD> <775A> <DEDE> <DEDE> <7769> <DEDF> <DEDF> <7767> <DEE0> <DEE0> <7754> <DEE1> <DEE1> <7759> <DEE2> <DEE2> <776D> <DEE3> <DEE3> <77E0> <DEE4> <DEE4> <7887> <DEE5> <DEE5> <789A> <DEE6> <DEE6> <7894> <DEE7> <DEE7> <788F> <DEE8> <DEE8> <7884> <DEE9> <DEE9> <7895> <DEEA> <DEEB> <7885> <DEEC> <DEEC> <78A1> <DEED> <DEED> <7883> <DEEE> <DEEE> <7879> <DEEF> <DEEF> <7899> <DEF0> <DEF0> <7880> <DEF1> <DEF1> <7896> <DEF2> <DEF2> <787B> <DEF3> <DEF3> <797C> <DEF4> <DEF4> <7982> <DEF5> <DEF5> <797D> <DEF6> <DEF6> <7979> <DEF7> <DEF7> <7A11> endbfrange 100 beginbfrange <DEF8> <DEF9> <7A18> <DEFA> <DEFA> <7A12> <DEFB> <DEFB> <7A17> <DEFC> <DEFC> <7A15> <DEFD> <DEFD> <7A22> <DEFE> <DEFE> <7A13> <DF40> <DF40> <7A1B> <DF41> <DF41> <7A10> <DF42> <DF42> <7AA3> <DF43> <DF43> <7AA2> <DF44> <DF44> <7A9E> <DF45> <DF45> <7AEB> <DF46> <DF46> <7B66> <DF47> <DF47> <7B64> <DF48> <DF48> <7B6D> <DF49> <DF49> <7B74> <DF4A> <DF4A> <7B69> <DF4B> <DF4B> <7B72> <DF4C> <DF4C> <7B65> <DF4D> <DF4D> <7B73> <DF4E> <DF4E> <7B71> <DF4F> <DF4F> <7B70> <DF50> <DF50> <7B61> <DF51> <DF51> <7B78> <DF52> <DF52> <7B76> <DF53> <DF53> <7B63> <DF54> <DF54> <7CB2> <DF55> <DF55> <7CB4> <DF56> <DF56> <7CAF> <DF57> <DF57> <7D88> <DF58> <DF58> <7D86> <DF59> <DF59> <7D80> <DF5A> <DF5A> <7D8D> <DF5B> <DF5B> <7D7F> <DF5C> <DF5C> <7D85> <DF5D> <DF5D> <7D7A> <DF5E> <DF5E> <7D8E> <DF5F> <DF5F> <7D7B> <DF60> <DF60> <7D83> <DF61> <DF61> <7D7C> <DF62> <DF62> <7D8C> <DF63> <DF63> <7D94> <DF64> <DF64> <7D84> <DF65> <DF65> <7D7D> <DF66> <DF66> <7D92> <DF67> <DF67> <7F6D> <DF68> <DF68> <7F6B> <DF69> <DF6A> <7F67> <DF6B> <DF6B> <7F6C> <DF6C> <DF6C> <7FA6> <DF6D> <DF6D> <7FA5> <DF6E> <DF6E> <7FA7> <DF6F> <DF70> <7FDB> <DF71> <DF71> <8021> <DF72> <DF72> <8164> <DF73> <DF73> <8160> <DF74> <DF74> <8177> <DF75> <DF75> <815C> <DF76> <DF76> <8169> <DF77> <DF77> <815B> <DF78> <DF78> <8162> <DF79> <DF79> <8172> <DF7A> <DF7A> <6721> <DF7B> <DF7B> <815E> <DF7C> <DF7C> <8176> <DF7D> <DF7D> <8167> <DF7E> <DF7E> <816F> <DFA1> <DFA1> <8144> <DFA2> <DFA2> <8161> <DFA3> <DFA3> <821D> <DFA4> <DFA4> <8249> <DFA5> <DFA5> <8244> <DFA6> <DFA6> <8240> <DFA7> <DFA7> <8242> <DFA8> <DFA8> <8245> <DFA9> <DFA9> <84F1> <DFAA> <DFAA> <843F> <DFAB> <DFAB> <8456> <DFAC> <DFAC> <8476> <DFAD> <DFAD> <8479> <DFAE> <DFAE> <848F> <DFAF> <DFAF> <848D> <DFB0> <DFB0> <8465> <DFB1> <DFB1> <8451> <DFB2> <DFB2> <8440> <DFB3> <DFB3> <8486> <DFB4> <DFB4> <8467> <DFB5> <DFB5> <8430> <DFB6> <DFB6> <844D> <DFB7> <DFB7> <847D> <DFB8> <DFB8> <845A> <DFB9> <DFB9> <8459> <DFBA> <DFBA> <8474> <DFBB> <DFBB> <8473> <DFBC> <DFBC> <845D> <DFBD> <DFBD> <8507> <DFBE> <DFBE> <845E> <DFBF> <DFBF> <8437> <DFC0> <DFC0> <843A> <DFC1> <DFC1> <8434> endbfrange 100 beginbfrange <DFC2> <DFC2> <847A> <DFC3> <DFC3> <8443> <DFC4> <DFC4> <8478> <DFC5> <DFC5> <8432> <DFC6> <DFC6> <8445> <DFC7> <DFC7> <8429> <DFC8> <DFC8> <83D9> <DFC9> <DFC9> <844B> <DFCA> <DFCA> <842F> <DFCB> <DFCB> <8442> <DFCC> <DFCC> <842D> <DFCD> <DFCD> <845F> <DFCE> <DFCE> <8470> <DFCF> <DFCF> <8439> <DFD0> <DFD0> <844E> <DFD1> <DFD1> <844C> <DFD2> <DFD2> <8452> <DFD3> <DFD3> <846F> <DFD4> <DFD4> <84C5> <DFD5> <DFD5> <848E> <DFD6> <DFD6> <843B> <DFD7> <DFD7> <8447> <DFD8> <DFD8> <8436> <DFD9> <DFD9> <8433> <DFDA> <DFDA> <8468> <DFDB> <DFDB> <847E> <DFDC> <DFDC> <8444> <DFDD> <DFDD> <842B> <DFDE> <DFDE> <8460> <DFDF> <DFDF> <8454> <DFE0> <DFE0> <846E> <DFE1> <DFE1> <8450> <DFE2> <DFE2> <870B> <DFE3> <DFE3> <8704> <DFE4> <DFE4> <86F7> <DFE5> <DFE5> <870C> <DFE6> <DFE6> <86FA> <DFE7> <DFE7> <86D6> <DFE8> <DFE8> <86F5> <DFE9> <DFE9> <874D> <DFEA> <DFEA> <86F8> <DFEB> <DFEB> <870E> <DFEC> <DFEC> <8709> <DFED> <DFED> <8701> <DFEE> <DFEE> <86F6> <DFEF> <DFEF> <870D> <DFF0> <DFF0> <8705> <DFF1> <DFF1> <88D6> <DFF2> <DFF2> <88CB> <DFF3> <DFF4> <88CD> <DFF5> <DFF5> <88DE> <DFF6> <DFF6> <88DB> <DFF7> <DFF7> <88DA> <DFF8> <DFF8> <88CC> <DFF9> <DFF9> <88D0> <DFFA> <DFFA> <8985> <DFFB> <DFFB> <899B> <DFFC> <DFFC> <89DF> <DFFD> <DFFD> <89E5> <DFFE> <DFFE> <89E4> <E040> <E040> <89E1> <E041> <E041> <89E0> <E042> <E042> <89E2> <E043> <E043> <89DC> <E044> <E044> <89E6> <E045> <E045> <8A76> <E046> <E046> <8A86> <E047> <E047> <8A7F> <E048> <E048> <8A61> <E049> <E049> <8A3F> <E04A> <E04A> <8A77> <E04B> <E04B> <8A82> <E04C> <E04C> <8A84> <E04D> <E04D> <8A75> <E04E> <E04E> <8A83> <E04F> <E04F> <8A81> <E050> <E050> <8A74> <E051> <E051> <8A7A> <E052> <E052> <8C3C> <E053> <E053> <8C4B> <E054> <E054> <8C4A> <E055> <E055> <8C65> <E056> <E056> <8C64> <E057> <E057> <8C66> <E058> <E058> <8C86> <E059> <E05A> <8C84> <E05B> <E05B> <8CCC> <E05C> <E05D> <8D68> <E05E> <E05E> <8D91> <E05F> <E05F> <8D8C> <E060> <E061> <8D8E> <E062> <E062> <8D8D> <E063> <E064> <8D93> <E065> <E065> <8D90> <E066> <E066> <8D92> <E067> <E067> <8DF0> <E068> <E068> <8DE0> <E069> <E069> <8DEC> <E06A> <E06A> <8DF1> <E06B> <E06B> <8DEE> endbfrange 100 beginbfrange <E06C> <E06C> <8DD0> <E06D> <E06D> <8DE9> <E06E> <E06E> <8DE3> <E06F> <E06F> <8DE2> <E070> <E070> <8DE7> <E071> <E071> <8DF2> <E072> <E072> <8DEB> <E073> <E073> <8DF4> <E074> <E074> <8F06> <E075> <E075> <8EFF> <E076> <E076> <8F01> <E077> <E077> <8F00> <E078> <E078> <8F05> <E079> <E07A> <8F07> <E07B> <E07B> <8F02> <E07C> <E07C> <8F0B> <E07D> <E07D> <9052> <E07E> <E07E> <903F> <E0A1> <E0A1> <9044> <E0A2> <E0A2> <9049> <E0A3> <E0A3> <903D> <E0A4> <E0A4> <9110> <E0A5> <E0A5> <910D> <E0A6> <E0A6> <910F> <E0A7> <E0A7> <9111> <E0A8> <E0A8> <9116> <E0A9> <E0A9> <9114> <E0AA> <E0AA> <910B> <E0AB> <E0AB> <910E> <E0AC> <E0AD> <916E> <E0AE> <E0AE> <9248> <E0AF> <E0AF> <9252> <E0B0> <E0B0> <9230> <E0B1> <E0B1> <923A> <E0B2> <E0B2> <9266> <E0B3> <E0B3> <9233> <E0B4> <E0B4> <9265> <E0B5> <E0B5> <925E> <E0B6> <E0B6> <9283> <E0B7> <E0B7> <922E> <E0B8> <E0B8> <924A> <E0B9> <E0B9> <9246> <E0BA> <E0BA> <926D> <E0BB> <E0BB> <926C> <E0BC> <E0BC> <924F> <E0BD> <E0BD> <9260> <E0BE> <E0BE> <9267> <E0BF> <E0BF> <926F> <E0C0> <E0C0> <9236> <E0C1> <E0C1> <9261> <E0C2> <E0C2> <9270> <E0C3> <E0C3> <9231> <E0C4> <E0C4> <9254> <E0C5> <E0C5> <9263> <E0C6> <E0C6> <9250> <E0C7> <E0C7> <9272> <E0C8> <E0C8> <924E> <E0C9> <E0C9> <9253> <E0CA> <E0CA> <924C> <E0CB> <E0CB> <9256> <E0CC> <E0CC> <9232> <E0CD> <E0CD> <959F> <E0CE> <E0CE> <959C> <E0CF> <E0CF> <959E> <E0D0> <E0D0> <959B> <E0D1> <E0D2> <9692> <E0D3> <E0D3> <9691> <E0D4> <E0D4> <9697> <E0D5> <E0D5> <96CE> <E0D6> <E0D6> <96FA> <E0D7> <E0D7> <96FD> <E0D8> <E0D8> <96F8> <E0D9> <E0D9> <96F5> <E0DA> <E0DA> <9773> <E0DB> <E0DC> <9777> <E0DD> <E0DD> <9772> <E0DE> <E0DE> <980F> <E0DF> <E0E0> <980D> <E0E1> <E0E1> <98AC> <E0E2> <E0E2> <98F6> <E0E3> <E0E3> <98F9> <E0E4> <E0E4> <99AF> <E0E5> <E0E5> <99B2> <E0E6> <E0E6> <99B0> <E0E7> <E0E7> <99B5> <E0E8> <E0E8> <9AAD> <E0E9> <E0E9> <9AAB> <E0EA> <E0EA> <9B5B> <E0EB> <E0EB> <9CEA> <E0EC> <E0EC> <9CED> <E0ED> <E0ED> <9CE7> <E0EE> <E0EE> <9E80> <E0EF> <E0EF> <9EFD> <E0F0> <E0F0> <50E6> <E0F1> <E0F1> <50D4> <E0F2> <E0F2> <50D7> <E0F3> <E0F3> <50E8> <E0F4> <E0F4> <50F3> <E0F5> <E0F5> <50DB> <E0F6> <E0F6> <50EA> endbfrange 100 beginbfrange <E0F7> <E0F7> <50DD> <E0F8> <E0F8> <50E4> <E0F9> <E0F9> <50D3> <E0FA> <E0FA> <50EC> <E0FB> <E0FB> <50F0> <E0FC> <E0FC> <50EF> <E0FD> <E0FD> <50E3> <E0FE> <E0FE> <50E0> <E140> <E140> <51D8> <E141> <E142> <5280> <E143> <E143> <52E9> <E144> <E144> <52EB> <E145> <E145> <5330> <E146> <E146> <53AC> <E147> <E147> <5627> <E148> <E148> <5615> <E149> <E149> <560C> <E14A> <E14A> <5612> <E14B> <E14B> <55FC> <E14C> <E14C> <560F> <E14D> <E14D> <561C> <E14E> <E14E> <5601> <E14F> <E14F> <5613> <E150> <E150> <5602> <E151> <E151> <55FA> <E152> <E152> <561D> <E153> <E153> <5604> <E154> <E154> <55FF> <E155> <E155> <55F9> <E156> <E156> <5889> <E157> <E157> <587C> <E158> <E158> <5890> <E159> <E159> <5898> <E15A> <E15A> <5886> <E15B> <E15B> <5881> <E15C> <E15C> <587F> <E15D> <E15D> <5874> <E15E> <E15E> <588B> <E15F> <E15F> <587A> <E160> <E160> <5887> <E161> <E161> <5891> <E162> <E162> <588E> <E163> <E163> <5876> <E164> <E164> <5882> <E165> <E165> <5888> <E166> <E166> <587B> <E167> <E167> <5894> <E168> <E168> <588F> <E169> <E169> <58FE> <E16A> <E16A> <596B> <E16B> <E16B> <5ADC> <E16C> <E16C> <5AEE> <E16D> <E16D> <5AE5> <E16E> <E16E> <5AD5> <E16F> <E16F> <5AEA> <E170> <E170> <5ADA> <E171> <E171> <5AED> <E172> <E172> <5AEB> <E173> <E173> <5AF3> <E174> <E174> <5AE2> <E175> <E175> <5AE0> <E176> <E176> <5ADB> <E177> <E177> <5AEC> <E178> <E178> <5ADE> <E179> <E179> <5ADD> <E17A> <E17A> <5AD9> <E17B> <E17B> <5AE8> <E17C> <E17C> <5ADF> <E17D> <E17D> <5B77> <E17E> <E17E> <5BE0> <E1A1> <E1A1> <5BE3> <E1A2> <E1A2> <5C63> <E1A3> <E1A3> <5D82> <E1A4> <E1A4> <5D80> <E1A5> <E1A5> <5D7D> <E1A6> <E1A6> <5D86> <E1A7> <E1A7> <5D7A> <E1A8> <E1A8> <5D81> <E1A9> <E1A9> <5D77> <E1AA> <E1AA> <5D8A> <E1AB> <E1AB> <5D89> <E1AC> <E1AC> <5D88> <E1AD> <E1AD> <5D7E> <E1AE> <E1AE> <5D7C> <E1AF> <E1AF> <5D8D> <E1B0> <E1B0> <5D79> <E1B1> <E1B1> <5D7F> <E1B2> <E1B3> <5E58> <E1B4> <E1B4> <5E53> <E1B5> <E1B5> <5ED8> <E1B6> <E1B6> <5ED1> <E1B7> <E1B7> <5ED7> <E1B8> <E1B8> <5ECE> <E1B9> <E1B9> <5EDC> <E1BA> <E1BA> <5ED5> <E1BB> <E1BB> <5ED9> <E1BC> <E1BC> <5ED2> <E1BD> <E1BD> <5ED4> <E1BE> <E1BE> <5F44> <E1BF> <E1BF> <5F43> endbfrange 100 beginbfrange <E1C0> <E1C0> <5F6F> <E1C1> <E1C1> <5FB6> <E1C2> <E1C2> <612C> <E1C3> <E1C3> <6128> <E1C4> <E1C4> <6141> <E1C5> <E1C5> <615E> <E1C6> <E1C6> <6171> <E1C7> <E1C7> <6173> <E1C8> <E1C9> <6152> <E1CA> <E1CA> <6172> <E1CB> <E1CB> <616C> <E1CC> <E1CC> <6180> <E1CD> <E1CD> <6174> <E1CE> <E1CE> <6154> <E1CF> <E1CF> <617A> <E1D0> <E1D0> <615B> <E1D1> <E1D1> <6165> <E1D2> <E1D2> <613B> <E1D3> <E1D3> <616A> <E1D4> <E1D4> <6161> <E1D5> <E1D5> <6156> <E1D6> <E1D6> <6229> <E1D7> <E1D7> <6227> <E1D8> <E1D8> <622B> <E1D9> <E1D9> <642B> <E1DA> <E1DA> <644D> <E1DB> <E1DB> <645B> <E1DC> <E1DC> <645D> <E1DD> <E1DD> <6474> <E1DE> <E1DE> <6476> <E1DF> <E1E0> <6472> <E1E1> <E1E1> <647D> <E1E2> <E1E2> <6475> <E1E3> <E1E3> <6466> <E1E4> <E1E4> <64A6> <E1E5> <E1E5> <644E> <E1E6> <E1E6> <6482> <E1E7> <E1E7> <645E> <E1E8> <E1E8> <645C> <E1E9> <E1E9> <644B> <E1EA> <E1EA> <6453> <E1EB> <E1EB> <6460> <E1EC> <E1EC> <6450> <E1ED> <E1ED> <647F> <E1EE> <E1EE> <643F> <E1EF> <E1EF> <646C> <E1F0> <E1F0> <646B> <E1F1> <E1F1> <6459> <E1F2> <E1F2> <6465> <E1F3> <E1F3> <6477> <E1F4> <E1F4> <6573> <E1F5> <E1F5> <65A0> <E1F6> <E1F6> <66A1> <E1F7> <E1F7> <66A0> <E1F8> <E1F8> <669F> <E1F9> <E1F9> <6705> <E1FA> <E1FA> <6704> <E1FB> <E1FB> <6722> <E1FC> <E1FC> <69B1> <E1FD> <E1FD> <69B6> <E1FE> <E1FE> <69C9> <E240> <E240> <69A0> <E241> <E241> <69CE> <E242> <E242> <6996> <E243> <E243> <69B0> <E244> <E244> <69AC> <E245> <E245> <69BC> <E246> <E246> <6991> <E247> <E247> <6999> <E248> <E248> <698E> <E249> <E249> <69A7> <E24A> <E24A> <698D> <E24B> <E24B> <69A9> <E24C> <E24C> <69BE> <E24D> <E24D> <69AF> <E24E> <E24E> <69BF> <E24F> <E24F> <69C4> <E250> <E250> <69BD> <E251> <E251> <69A4> <E252> <E252> <69D4> <E253> <E253> <69B9> <E254> <E254> <69CA> <E255> <E255> <699A> <E256> <E256> <69CF> <E257> <E257> <69B3> <E258> <E258> <6993> <E259> <E259> <69AA> <E25A> <E25A> <69A1> <E25B> <E25B> <699E> <E25C> <E25C> <69D9> <E25D> <E25D> <6997> <E25E> <E25E> <6990> <E25F> <E25F> <69C2> <E260> <E260> <69B5> <E261> <E261> <69A5> <E262> <E262> <69C6> <E263> <E263> <6B4A> <E264> <E264> <6B4D> <E265> <E265> <6B4B> <E266> <E268> <6B9E> endbfrange 100 beginbfrange <E269> <E26A> <6BC3> <E26B> <E26B> <6BFE> <E26C> <E26C> <6ECE> <E26D> <E26D> <6EF5> <E26E> <E26E> <6EF1> <E26F> <E26F> <6F03> <E270> <E270> <6F25> <E271> <E271> <6EF8> <E272> <E272> <6F37> <E273> <E273> <6EFB> <E274> <E274> <6F2E> <E275> <E275> <6F09> <E276> <E276> <6F4E> <E277> <E278> <6F19> <E279> <E279> <6F27> <E27A> <E27A> <6F18> <E27B> <E27B> <6F3B> <E27C> <E27C> <6F12> <E27D> <E27D> <6EED> <E27E> <E27E> <6F0A> <E2A1> <E2A1> <6F36> <E2A2> <E2A2> <6F73> <E2A3> <E2A3> <6EF9> <E2A4> <E2A4> <6EEE> <E2A5> <E2A5> <6F2D> <E2A6> <E2A6> <6F40> <E2A7> <E2A7> <6F30> <E2A8> <E2A8> <6F3C> <E2A9> <E2A9> <6F35> <E2AA> <E2AA> <6EEB> <E2AB> <E2AB> <6F07> <E2AC> <E2AC> <6F0E> <E2AD> <E2AD> <6F43> <E2AE> <E2AE> <6F05> <E2AF> <E2AF> <6EFD> <E2B0> <E2B0> <6EF6> <E2B1> <E2B1> <6F39> <E2B2> <E2B2> <6F1C> <E2B3> <E2B3> <6EFC> <E2B4> <E2B4> <6F3A> <E2B5> <E2B5> <6F1F> <E2B6> <E2B6> <6F0D> <E2B7> <E2B7> <6F1E> <E2B8> <E2B8> <6F08> <E2B9> <E2B9> <6F21> <E2BA> <E2BA> <7187> <E2BB> <E2BB> <7190> <E2BC> <E2BC> <7189> <E2BD> <E2BD> <7180> <E2BE> <E2BE> <7185> <E2BF> <E2BF> <7182> <E2C0> <E2C0> <718F> <E2C1> <E2C1> <717B> <E2C2> <E2C2> <7186> <E2C3> <E2C3> <7181> <E2C4> <E2C4> <7197> <E2C5> <E2C5> <7244> <E2C6> <E2C6> <7253> <E2C7> <E2C7> <7297> <E2C8> <E2C8> <7295> <E2C9> <E2C9> <7293> <E2CA> <E2CA> <7343> <E2CB> <E2CB> <734D> <E2CC> <E2CC> <7351> <E2CD> <E2CD> <734C> <E2CE> <E2CE> <7462> <E2CF> <E2CF> <7473> <E2D0> <E2D0> <7471> <E2D1> <E2D1> <7475> <E2D2> <E2D2> <7472> <E2D3> <E2D3> <7467> <E2D4> <E2D4> <746E> <E2D5> <E2D5> <7500> <E2D6> <E2D7> <7502> <E2D8> <E2D8> <757D> <E2D9> <E2D9> <7590> <E2DA> <E2DA> <7616> <E2DB> <E2DB> <7608> <E2DC> <E2DC> <760C> <E2DD> <E2DD> <7615> <E2DE> <E2DE> <7611> <E2DF> <E2DF> <760A> <E2E0> <E2E0> <7614> <E2E1> <E2E1> <76B8> <E2E2> <E2E2> <7781> <E2E3> <E2E3> <777C> <E2E4> <E2E4> <7785> <E2E5> <E2E5> <7782> <E2E6> <E2E6> <776E> <E2E7> <E2E7> <7780> <E2E8> <E2E8> <776F> <E2E9> <E2E9> <777E> <E2EA> <E2EA> <7783> <E2EB> <E2EB> <78B2> <E2EC> <E2EC> <78AA> <E2ED> <E2ED> <78B4> <E2EE> <E2EE> <78AD> <E2EF> <E2EF> <78A8> <E2F0> <E2F0> <787E> <E2F1> <E2F1> <78AB> endbfrange 100 beginbfrange <E2F2> <E2F2> <789E> <E2F3> <E2F3> <78A5> <E2F4> <E2F4> <78A0> <E2F5> <E2F5> <78AC> <E2F6> <E2F6> <78A2> <E2F7> <E2F7> <78A4> <E2F8> <E2F8> <7998> <E2F9> <E2FA> <798A> <E2FB> <E2FB> <7996> <E2FC> <E2FC> <7995> <E2FD> <E2FD> <7994> <E2FE> <E2FE> <7993> <E340> <E340> <7997> <E341> <E341> <7988> <E342> <E342> <7992> <E343> <E343> <7990> <E344> <E344> <7A2B> <E345> <E345> <7A4A> <E346> <E346> <7A30> <E347> <E347> <7A2F> <E348> <E348> <7A28> <E349> <E349> <7A26> <E34A> <E34A> <7AA8> <E34B> <E34C> <7AAB> <E34D> <E34D> <7AEE> <E34E> <E34E> <7B88> <E34F> <E34F> <7B9C> <E350> <E350> <7B8A> <E351> <E351> <7B91> <E352> <E352> <7B90> <E353> <E353> <7B96> <E354> <E354> <7B8D> <E355> <E355> <7B8C> <E356> <E356> <7B9B> <E357> <E357> <7B8E> <E358> <E358> <7B85> <E359> <E359> <7B98> <E35A> <E35A> <5284> <E35B> <E35B> <7B99> <E35C> <E35C> <7BA4> <E35D> <E35D> <7B82> <E35E> <E35E> <7CBB> <E35F> <E35F> <7CBF> <E360> <E360> <7CBC> <E361> <E361> <7CBA> <E362> <E362> <7DA7> <E363> <E363> <7DB7> <E364> <E364> <7DC2> <E365> <E365> <7DA3> <E366> <E366> <7DAA> <E367> <E367> <7DC1> <E368> <E368> <7DC0> <E369> <E369> <7DC5> <E36A> <E36A> <7D9D> <E36B> <E36B> <7DCE> <E36C> <E36C> <7DC4> <E36D> <E36D> <7DC6> <E36E> <E36F> <7DCB> <E370> <E370> <7DAF> <E371> <E371> <7DB9> <E372> <E372> <7D96> <E373> <E373> <7DBC> <E374> <E374> <7D9F> <E375> <E375> <7DA6> <E376> <E376> <7DAE> <E377> <E377> <7DA9> <E378> <E378> <7DA1> <E379> <E379> <7DC9> <E37A> <E37A> <7F73> <E37B> <E37C> <7FE2> <E37D> <E37D> <7FE5> <E37E> <E37E> <7FDE> <E3A1> <E3A1> <8024> <E3A2> <E3A2> <805D> <E3A3> <E3A3> <805C> <E3A4> <E3A4> <8189> <E3A5> <E3A5> <8186> <E3A6> <E3A6> <8183> <E3A7> <E3A7> <8187> <E3A8> <E3A8> <818D> <E3A9> <E3A9> <818C> <E3AA> <E3AA> <818B> <E3AB> <E3AB> <8215> <E3AC> <E3AC> <8497> <E3AD> <E3AD> <84A4> <E3AE> <E3AE> <84A1> <E3AF> <E3AF> <849F> <E3B0> <E3B0> <84BA> <E3B1> <E3B1> <84CE> <E3B2> <E3B2> <84C2> <E3B3> <E3B3> <84AC> <E3B4> <E3B4> <84AE> <E3B5> <E3B5> <84AB> <E3B6> <E3B6> <84B9> <E3B7> <E3B7> <84B4> <E3B8> <E3B8> <84C1> <E3B9> <E3B9> <84CD> <E3BA> <E3BA> <84AA> <E3BB> <E3BB> <849A> <E3BC> <E3BC> <84B1> endbfrange 100 beginbfrange <E3BD> <E3BD> <84D0> <E3BE> <E3BE> <849D> <E3BF> <E3BF> <84A7> <E3C0> <E3C0> <84BB> <E3C1> <E3C1> <84A2> <E3C2> <E3C2> <8494> <E3C3> <E3C3> <84C7> <E3C4> <E3C4> <84CC> <E3C5> <E3C5> <849B> <E3C6> <E3C6> <84A9> <E3C7> <E3C7> <84AF> <E3C8> <E3C8> <84A8> <E3C9> <E3C9> <84D6> <E3CA> <E3CA> <8498> <E3CB> <E3CB> <84B6> <E3CC> <E3CC> <84CF> <E3CD> <E3CD> <84A0> <E3CE> <E3CE> <84D7> <E3CF> <E3CF> <84D4> <E3D0> <E3D0> <84D2> <E3D1> <E3D1> <84DB> <E3D2> <E3D2> <84B0> <E3D3> <E3D3> <8491> <E3D4> <E3D4> <8661> <E3D5> <E3D5> <8733> <E3D6> <E3D6> <8723> <E3D7> <E3D7> <8728> <E3D8> <E3D8> <876B> <E3D9> <E3D9> <8740> <E3DA> <E3DA> <872E> <E3DB> <E3DB> <871E> <E3DC> <E3DC> <8721> <E3DD> <E3DD> <8719> <E3DE> <E3DE> <871B> <E3DF> <E3DF> <8743> <E3E0> <E3E0> <872C> <E3E1> <E3E1> <8741> <E3E2> <E3E2> <873E> <E3E3> <E3E3> <8746> <E3E4> <E3E4> <8720> <E3E5> <E3E5> <8732> <E3E6> <E3E6> <872A> <E3E7> <E3E7> <872D> <E3E8> <E3E8> <873C> <E3E9> <E3E9> <8712> <E3EA> <E3EA> <873A> <E3EB> <E3EB> <8731> <E3EC> <E3EC> <8735> <E3ED> <E3ED> <8742> <E3EE> <E3EF> <8726> <E3F0> <E3F0> <8738> <E3F1> <E3F1> <8724> <E3F2> <E3F2> <871A> <E3F3> <E3F3> <8730> <E3F4> <E3F4> <8711> <E3F5> <E3F5> <88F7> <E3F6> <E3F6> <88E7> <E3F7> <E3F8> <88F1> <E3F9> <E3F9> <88FA> <E3FA> <E3FA> <88FE> <E3FB> <E3FB> <88EE> <E3FC> <E3FC> <88FC> <E3FD> <E3FD> <88F6> <E3FE> <E3FE> <88FB> <E440> <E440> <88F0> <E441> <E441> <88EC> <E442> <E442> <88EB> <E443> <E443> <899D> <E444> <E444> <89A1> <E445> <E445> <899F> <E446> <E446> <899E> <E447> <E447> <89E9> <E448> <E448> <89EB> <E449> <E449> <89E8> <E44A> <E44A> <8AAB> <E44B> <E44B> <8A99> <E44C> <E44C> <8A8B> <E44D> <E44D> <8A92> <E44E> <E44E> <8A8F> <E44F> <E44F> <8A96> <E450> <E450> <8C3D> <E451> <E452> <8C68> <E453> <E453> <8CD5> <E454> <E454> <8CCF> <E455> <E455> <8CD7> <E456> <E456> <8D96> <E457> <E457> <8E09> <E458> <E458> <8E02> <E459> <E459> <8DFF> <E45A> <E45A> <8E0D> <E45B> <E45B> <8DFD> <E45C> <E45C> <8E0A> <E45D> <E45D> <8E03> <E45E> <E45E> <8E07> <E45F> <E45F> <8E06> <E460> <E460> <8E05> <E461> <E461> <8DFE> <E462> <E462> <8E00> <E463> <E463> <8E04> <E464> <E465> <8F10> endbfrange 100 beginbfrange <E466> <E466> <8F0E> <E467> <E467> <8F0D> <E468> <E468> <9123> <E469> <E469> <911C> <E46A> <E46A> <9120> <E46B> <E46B> <9122> <E46C> <E46C> <911F> <E46D> <E46D> <911D> <E46E> <E46E> <911A> <E46F> <E46F> <9124> <E470> <E470> <9121> <E471> <E471> <911B> <E472> <E472> <917A> <E473> <E473> <9172> <E474> <E474> <9179> <E475> <E475> <9173> <E476> <E476> <92A5> <E477> <E477> <92A4> <E478> <E478> <9276> <E479> <E479> <929B> <E47A> <E47A> <927A> <E47B> <E47B> <92A0> <E47C> <E47C> <9294> <E47D> <E47D> <92AA> <E47E> <E47E> <928D> <E4A1> <E4A1> <92A6> <E4A2> <E4A2> <929A> <E4A3> <E4A3> <92AB> <E4A4> <E4A4> <9279> <E4A5> <E4A5> <9297> <E4A6> <E4A6> <927F> <E4A7> <E4A7> <92A3> <E4A8> <E4A8> <92EE> <E4A9> <E4A9> <928E> <E4AA> <E4AA> <9282> <E4AB> <E4AB> <9295> <E4AC> <E4AC> <92A2> <E4AD> <E4AD> <927D> <E4AE> <E4AE> <9288> <E4AF> <E4AF> <92A1> <E4B0> <E4B0> <928A> <E4B1> <E4B1> <9286> <E4B2> <E4B2> <928C> <E4B3> <E4B3> <9299> <E4B4> <E4B4> <92A7> <E4B5> <E4B5> <927E> <E4B6> <E4B6> <9287> <E4B7> <E4B7> <92A9> <E4B8> <E4B8> <929D> <E4B9> <E4B9> <928B> <E4BA> <E4BA> <922D> <E4BB> <E4BB> <969E> <E4BC> <E4BC> <96A1> <E4BD> <E4BD> <96FF> <E4BE> <E4BE> <9758> <E4BF> <E4BF> <977D> <E4C0> <E4C0> <977A> <E4C1> <E4C1> <977E> <E4C2> <E4C2> <9783> <E4C3> <E4C3> <9780> <E4C4> <E4C4> <9782> <E4C5> <E4C5> <977B> <E4C6> <E4C6> <9784> <E4C7> <E4C7> <9781> <E4C8> <E4C8> <977F> <E4C9> <E4C9> <97CE> <E4CA> <E4CA> <97CD> <E4CB> <E4CB> <9816> <E4CC> <E4CD> <98AD> <E4CE> <E4CE> <9902> <E4CF> <E4CF> <9900> <E4D0> <E4D0> <9907> <E4D1> <E4D1> <999D> <E4D2> <E4D2> <999C> <E4D3> <E4D3> <99C3> <E4D4> <E4D4> <99B9> <E4D5> <E4D5> <99BB> <E4D6> <E4D6> <99BA> <E4D7> <E4D7> <99C2> <E4D8> <E4D8> <99BD> <E4D9> <E4D9> <99C7> <E4DA> <E4DA> <9AB1> <E4DB> <E4DB> <9AE3> <E4DC> <E4DC> <9AE7> <E4DD> <E4DE> <9B3E> <E4DF> <E4E0> <9B60> <E4E1> <E4E1> <9B5F> <E4E2> <E4E3> <9CF1> <E4E4> <E4E4> <9CF5> <E4E5> <E4E5> <9EA7> <E4E6> <E4E6> <50FF> <E4E7> <E4E7> <5103> <E4E8> <E4E8> <5130> <E4E9> <E4E9> <50F8> <E4EA> <E4EB> <5106> <E4EC> <E4EC> <50F6> <E4ED> <E4ED> <50FE> <E4EE> <E4EF> <510B> <E4F0> <E4F0> <50FD> <E4F1> <E4F1> <510A> endbfrange 100 beginbfrange <E4F2> <E4F3> <528B> <E4F4> <E4F4> <52F1> <E4F5> <E4F5> <52EF> <E4F6> <E4F6> <5648> <E4F7> <E4F7> <5642> <E4F8> <E4F8> <564C> <E4F9> <E4F9> <5635> <E4FA> <E4FA> <5641> <E4FB> <E4FB> <564A> <E4FC> <E4FC> <5649> <E4FD> <E4FD> <5646> <E4FE> <E4FE> <5658> <E540> <E540> <565A> <E541> <E541> <5640> <E542> <E542> <5633> <E543> <E543> <563D> <E544> <E544> <562C> <E545> <E545> <563E> <E546> <E546> <5638> <E547> <E547> <562A> <E548> <E548> <563A> <E549> <E549> <571A> <E54A> <E54A> <58AB> <E54B> <E54B> <589D> <E54C> <E54C> <58B1> <E54D> <E54D> <58A0> <E54E> <E54E> <58A3> <E54F> <E54F> <58AF> <E550> <E550> <58AC> <E551> <E551> <58A5> <E552> <E552> <58A1> <E553> <E553> <58FF> <E554> <E554> <5AFF> <E555> <E555> <5AF4> <E556> <E556> <5AFD> <E557> <E557> <5AF7> <E558> <E558> <5AF6> <E559> <E559> <5B03> <E55A> <E55A> <5AF8> <E55B> <E55B> <5B02> <E55C> <E55C> <5AF9> <E55D> <E55D> <5B01> <E55E> <E55E> <5B07> <E55F> <E55F> <5B05> <E560> <E560> <5B0F> <E561> <E561> <5C67> <E562> <E562> <5D99> <E563> <E563> <5D97> <E564> <E564> <5D9F> <E565> <E565> <5D92> <E566> <E566> <5DA2> <E567> <E567> <5D93> <E568> <E568> <5D95> <E569> <E569> <5DA0> <E56A> <E56A> <5D9C> <E56B> <E56B> <5DA1> <E56C> <E56C> <5D9A> <E56D> <E56D> <5D9E> <E56E> <E56E> <5E69> <E56F> <E56F> <5E5D> <E570> <E570> <5E60> <E571> <E571> <5E5C> <E572> <E572> <7DF3> <E573> <E573> <5EDB> <E574> <E574> <5EDE> <E575> <E575> <5EE1> <E576> <E576> <5F49> <E577> <E577> <5FB2> <E578> <E578> <618B> <E579> <E579> <6183> <E57A> <E57A> <6179> <E57B> <E57B> <61B1> <E57C> <E57C> <61B0> <E57D> <E57D> <61A2> <E57E> <E57E> <6189> <E5A1> <E5A1> <619B> <E5A2> <E5A2> <6193> <E5A3> <E5A3> <61AF> <E5A4> <E5A4> <61AD> <E5A5> <E5A5> <619F> <E5A6> <E5A6> <6192> <E5A7> <E5A7> <61AA> <E5A8> <E5A8> <61A1> <E5A9> <E5A9> <618D> <E5AA> <E5AA> <6166> <E5AB> <E5AB> <61B3> <E5AC> <E5AC> <622D> <E5AD> <E5AD> <646E> <E5AE> <E5AE> <6470> <E5AF> <E5AF> <6496> <E5B0> <E5B0> <64A0> <E5B1> <E5B1> <6485> <E5B2> <E5B2> <6497> <E5B3> <E5B3> <649C> <E5B4> <E5B4> <648F> <E5B5> <E5B5> <648B> <E5B6> <E5B6> <648A> <E5B7> <E5B7> <648C> <E5B8> <E5B8> <64A3> <E5B9> <E5B9> <649F> endbfrange 100 beginbfrange <E5BA> <E5BA> <6468> <E5BB> <E5BB> <64B1> <E5BC> <E5BC> <6498> <E5BD> <E5BD> <6576> <E5BE> <E5BE> <657A> <E5BF> <E5BF> <6579> <E5C0> <E5C0> <657B> <E5C1> <E5C2> <65B2> <E5C3> <E5C3> <66B5> <E5C4> <E5C4> <66B0> <E5C5> <E5C5> <66A9> <E5C6> <E5C6> <66B2> <E5C7> <E5C7> <66B7> <E5C8> <E5C8> <66AA> <E5C9> <E5C9> <66AF> <E5CA> <E5CA> <6A00> <E5CB> <E5CB> <6A06> <E5CC> <E5CC> <6A17> <E5CD> <E5CD> <69E5> <E5CE> <E5CE> <69F8> <E5CF> <E5CF> <6A15> <E5D0> <E5D0> <69F1> <E5D1> <E5D1> <69E4> <E5D2> <E5D2> <6A20> <E5D3> <E5D3> <69FF> <E5D4> <E5D4> <69EC> <E5D5> <E5D5> <69E2> <E5D6> <E5D6> <6A1B> <E5D7> <E5D7> <6A1D> <E5D8> <E5D8> <69FE> <E5D9> <E5D9> <6A27> <E5DA> <E5DA> <69F2> <E5DB> <E5DB> <69EE> <E5DC> <E5DC> <6A14> <E5DD> <E5DD> <69F7> <E5DE> <E5DE> <69E7> <E5DF> <E5DF> <6A40> <E5E0> <E5E0> <6A08> <E5E1> <E5E1> <69E6> <E5E2> <E5E2> <69FB> <E5E3> <E5E3> <6A0D> <E5E4> <E5E4> <69FC> <E5E5> <E5E5> <69EB> <E5E6> <E5E6> <6A09> <E5E7> <E5E7> <6A04> <E5E8> <E5E8> <6A18> <E5E9> <E5E9> <6A25> <E5EA> <E5EA> <6A0F> <E5EB> <E5EB> <69F6> <E5EC> <E5EC> <6A26> <E5ED> <E5ED> <6A07> <E5EE> <E5EE> <69F4> <E5EF> <E5EF> <6A16> <E5F0> <E5F0> <6B51> <E5F1> <E5F1> <6BA5> <E5F2> <E5F2> <6BA3> <E5F3> <E5F3> <6BA2> <E5F4> <E5F4> <6BA6> <E5F5> <E5F5> <6C01> <E5F6> <E5F6> <6C00> <E5F7> <E5F7> <6BFF> <E5F8> <E5F8> <6C02> <E5F9> <E5F9> <6F41> <E5FA> <E5FA> <6F26> <E5FB> <E5FB> <6F7E> <E5FC> <E5FC> <6F87> <E5FD> <E5FD> <6FC6> <E5FE> <E5FE> <6F92> <E640> <E640> <6F8D> <E641> <E641> <6F89> <E642> <E642> <6F8C> <E643> <E643> <6F62> <E644> <E644> <6F4F> <E645> <E645> <6F85> <E646> <E646> <6F5A> <E647> <E647> <6F96> <E648> <E648> <6F76> <E649> <E649> <6F6C> <E64A> <E64A> <6F82> <E64B> <E64B> <6F55> <E64C> <E64C> <6F72> <E64D> <E64D> <6F52> <E64E> <E64E> <6F50> <E64F> <E64F> <6F57> <E650> <E650> <6F94> <E651> <E651> <6F93> <E652> <E652> <6F5D> <E653> <E653> <6F00> <E654> <E654> <6F61> <E655> <E655> <6F6B> <E656> <E656> <6F7D> <E657> <E657> <6F67> <E658> <E658> <6F90> <E659> <E659> <6F53> <E65A> <E65A> <6F8B> <E65B> <E65B> <6F69> <E65C> <E65C> <6F7F> <E65D> <E65D> <6F95> <E65E> <E65E> <6F63> <E65F> <E65F> <6F77> endbfrange 100 beginbfrange <E660> <E660> <6F6A> <E661> <E661> <6F7B> <E662> <E662> <71B2> <E663> <E663> <71AF> <E664> <E664> <719B> <E665> <E665> <71B0> <E666> <E666> <71A0> <E667> <E667> <719A> <E668> <E668> <71A9> <E669> <E669> <71B5> <E66A> <E66A> <719D> <E66B> <E66B> <71A5> <E66C> <E66C> <719E> <E66D> <E66D> <71A4> <E66E> <E66E> <71A1> <E66F> <E66F> <71AA> <E670> <E670> <719C> <E671> <E671> <71A7> <E672> <E672> <71B3> <E673> <E673> <7298> <E674> <E674> <729A> <E675> <E675> <7358> <E676> <E676> <7352> <E677> <E679> <735E> <E67A> <E67A> <735D> <E67B> <E67B> <735B> <E67C> <E67C> <7361> <E67D> <E67D> <735A> <E67E> <E67E> <7359> <E6A1> <E6A1> <7362> <E6A2> <E6A2> <7487> <E6A3> <E6A4> <7489> <E6A5> <E6A5> <7486> <E6A6> <E6A6> <7481> <E6A7> <E6A7> <747D> <E6A8> <E6A8> <7485> <E6A9> <E6A9> <7488> <E6AA> <E6AA> <747C> <E6AB> <E6AB> <7479> <E6AC> <E6AC> <7508> <E6AD> <E6AD> <7507> <E6AE> <E6AE> <757E> <E6AF> <E6AF> <7625> <E6B0> <E6B0> <761E> <E6B1> <E6B1> <7619> <E6B2> <E6B2> <761D> <E6B3> <E6B3> <761C> <E6B4> <E6B4> <7623> <E6B5> <E6B5> <761A> <E6B6> <E6B6> <7628> <E6B7> <E6B7> <761B> <E6B8> <E6BA> <769C> <E6BB> <E6BB> <769B> <E6BC> <E6BC> <778D> <E6BD> <E6BD> <778F> <E6BE> <E6BE> <7789> <E6BF> <E6BF> <7788> <E6C0> <E6C0> <78CD> <E6C1> <E6C1> <78BB> <E6C2> <E6C2> <78CF> <E6C3> <E6C3> <78CC> <E6C4> <E6C4> <78D1> <E6C5> <E6C5> <78CE> <E6C6> <E6C6> <78D4> <E6C7> <E6C7> <78C8> <E6C8> <E6C9> <78C3> <E6CA> <E6CA> <78C9> <E6CB> <E6CB> <799A> <E6CC> <E6CC> <79A1> <E6CD> <E6CD> <79A0> <E6CE> <E6CE> <799C> <E6CF> <E6CF> <79A2> <E6D0> <E6D0> <799B> <E6D1> <E6D1> <6B76> <E6D2> <E6D2> <7A39> <E6D3> <E6D3> <7AB2> <E6D4> <E6D4> <7AB4> <E6D5> <E6D5> <7AB3> <E6D6> <E6D6> <7BB7> <E6D7> <E6D7> <7BCB> <E6D8> <E6D8> <7BBE> <E6D9> <E6D9> <7BAC> <E6DA> <E6DA> <7BCE> <E6DB> <E6DB> <7BAF> <E6DC> <E6DC> <7BB9> <E6DD> <E6DD> <7BCA> <E6DE> <E6DE> <7BB5> <E6DF> <E6DF> <7CC5> <E6E0> <E6E0> <7CC8> <E6E1> <E6E1> <7CCC> <E6E2> <E6E2> <7CCB> <E6E3> <E6E3> <7DF7> <E6E4> <E6E4> <7DDB> <E6E5> <E6E5> <7DEA> <E6E6> <E6E6> <7DE7> <E6E7> <E6E7> <7DD7> <E6E8> <E6E8> <7DE1> <E6E9> <E6E9> <7E03> <E6EA> <E6EA> <7DFA> <E6EB> <E6EB> <7DE6> endbfrange 100 beginbfrange <E6EC> <E6EC> <7DF6> <E6ED> <E6ED> <7DF1> <E6EE> <E6EE> <7DF0> <E6EF> <E6EF> <7DEE> <E6F0> <E6F0> <7DDF> <E6F1> <E6F1> <7F76> <E6F2> <E6F2> <7FAC> <E6F3> <E6F3> <7FB0> <E6F4> <E6F4> <7FAD> <E6F5> <E6F5> <7FED> <E6F6> <E6F6> <7FEB> <E6F7> <E6F7> <7FEA> <E6F8> <E6F8> <7FEC> <E6F9> <E6F9> <7FE6> <E6FA> <E6FA> <7FE8> <E6FB> <E6FB> <8064> <E6FC> <E6FC> <8067> <E6FD> <E6FD> <81A3> <E6FE> <E6FE> <819F> <E740> <E740> <819E> <E741> <E741> <8195> <E742> <E742> <81A2> <E743> <E743> <8199> <E744> <E744> <8197> <E745> <E745> <8216> <E746> <E746> <824F> <E747> <E747> <8253> <E748> <E748> <8252> <E749> <E749> <8250> <E74A> <E74A> <824E> <E74B> <E74B> <8251> <E74C> <E74C> <8524> <E74D> <E74D> <853B> <E74E> <E74E> <850F> <E74F> <E74F> <8500> <E750> <E750> <8529> <E751> <E751> <850E> <E752> <E752> <8509> <E753> <E753> <850D> <E754> <E754> <851F> <E755> <E755> <850A> <E756> <E756> <8527> <E757> <E757> <851C> <E758> <E758> <84FB> <E759> <E759> <852B> <E75A> <E75A> <84FA> <E75B> <E75B> <8508> <E75C> <E75C> <850C> <E75D> <E75D> <84F4> <E75E> <E75E> <852A> <E75F> <E75F> <84F2> <E760> <E760> <8515> <E761> <E761> <84F7> <E762> <E762> <84EB> <E763> <E763> <84F3> <E764> <E764> <84FC> <E765> <E765> <8512> <E766> <E766> <84EA> <E767> <E767> <84E9> <E768> <E768> <8516> <E769> <E769> <84FE> <E76A> <E76A> <8528> <E76B> <E76B> <851D> <E76C> <E76C> <852E> <E76D> <E76D> <8502> <E76E> <E76E> <84FD> <E76F> <E76F> <851E> <E770> <E770> <84F6> <E771> <E771> <8531> <E772> <E772> <8526> <E773> <E774> <84E7> <E775> <E775> <84F0> <E776> <E776> <84EF> <E777> <E777> <84F9> <E778> <E778> <8518> <E779> <E779> <8520> <E77A> <E77A> <8530> <E77B> <E77B> <850B> <E77C> <E77C> <8519> <E77D> <E77D> <852F> <E77E> <E77E> <8662> <E7A1> <E7A1> <8756> <E7A2> <E7A3> <8763> <E7A4> <E7A4> <8777> <E7A5> <E7A5> <87E1> <E7A6> <E7A6> <8773> <E7A7> <E7A7> <8758> <E7A8> <E7A8> <8754> <E7A9> <E7A9> <875B> <E7AA> <E7AA> <8752> <E7AB> <E7AB> <8761> <E7AC> <E7AC> <875A> <E7AD> <E7AD> <8751> <E7AE> <E7AE> <875E> <E7AF> <E7AF> <876D> <E7B0> <E7B0> <876A> <E7B1> <E7B1> <8750> <E7B2> <E7B2> <874E> <E7B3> <E7B3> <875F> <E7B4> <E7B4> <875D> endbfrange 100 beginbfrange <E7B5> <E7B5> <876F> <E7B6> <E7B6> <876C> <E7B7> <E7B7> <877A> <E7B8> <E7B8> <876E> <E7B9> <E7B9> <875C> <E7BA> <E7BA> <8765> <E7BB> <E7BB> <874F> <E7BC> <E7BC> <877B> <E7BD> <E7BD> <8775> <E7BE> <E7BE> <8762> <E7BF> <E7BF> <8767> <E7C0> <E7C0> <8769> <E7C1> <E7C1> <885A> <E7C2> <E7C2> <8905> <E7C3> <E7C3> <890C> <E7C4> <E7C4> <8914> <E7C5> <E7C5> <890B> <E7C6> <E7C8> <8917> <E7C9> <E7C9> <8906> <E7CA> <E7CA> <8916> <E7CB> <E7CB> <8911> <E7CC> <E7CC> <890E> <E7CD> <E7CD> <8909> <E7CE> <E7CE> <89A2> <E7CF> <E7CF> <89A4> <E7D0> <E7D0> <89A3> <E7D1> <E7D1> <89ED> <E7D2> <E7D2> <89F0> <E7D3> <E7D3> <89EC> <E7D4> <E7D4> <8ACF> <E7D5> <E7D5> <8AC6> <E7D6> <E7D6> <8AB8> <E7D7> <E7D7> <8AD3> <E7D8> <E7D8> <8AD1> <E7D9> <E7DA> <8AD4> <E7DB> <E7DB> <8ABB> <E7DC> <E7DC> <8AD7> <E7DD> <E7DD> <8ABE> <E7DE> <E7DE> <8AC0> <E7DF> <E7DF> <8AC5> <E7E0> <E7E0> <8AD8> <E7E1> <E7E1> <8AC3> <E7E2> <E7E2> <8ABA> <E7E3> <E7E3> <8ABD> <E7E4> <E7E4> <8AD9> <E7E5> <E7E5> <8C3E> <E7E6> <E7E6> <8C4D> <E7E7> <E7E7> <8C8F> <E7E8> <E7E8> <8CE5> <E7E9> <E7E9> <8CDF> <E7EA> <E7EA> <8CD9> <E7EB> <E7EB> <8CE8> <E7EC> <E7EC> <8CDA> <E7ED> <E7ED> <8CDD> <E7EE> <E7EE> <8CE7> <E7EF> <E7EF> <8DA0> <E7F0> <E7F0> <8D9C> <E7F1> <E7F1> <8DA1> <E7F2> <E7F2> <8D9B> <E7F3> <E7F3> <8E20> <E7F4> <E7F4> <8E23> <E7F5> <E7F5> <8E25> <E7F6> <E7F6> <8E24> <E7F7> <E7F7> <8E2E> <E7F8> <E7F8> <8E15> <E7F9> <E7F9> <8E1B> <E7FA> <E7FA> <8E16> <E7FB> <E7FB> <8E11> <E7FC> <E7FC> <8E19> <E7FD> <E7FE> <8E26> <E840> <E840> <8E14> <E841> <E841> <8E12> <E842> <E842> <8E18> <E843> <E843> <8E13> <E844> <E844> <8E1C> <E845> <E845> <8E17> <E846> <E846> <8E1A> <E847> <E847> <8F2C> <E848> <E848> <8F24> <E849> <E849> <8F18> <E84A> <E84A> <8F1A> <E84B> <E84B> <8F20> <E84C> <E84C> <8F23> <E84D> <E84E> <8F16> <E84F> <E84F> <9073> <E850> <E850> <9070> <E851> <E851> <906F> <E852> <E852> <9067> <E853> <E853> <906B> <E854> <E854> <912F> <E855> <E855> <912B> <E856> <E857> <9129> <E858> <E858> <9132> <E859> <E859> <9126> <E85A> <E85A> <912E> <E85B> <E85C> <9185> <E85D> <E85D> <918A> <E85E> <E85F> <9181> <E860> <E860> <9184> <E861> <E861> <9180> endbfrange 100 beginbfrange <E862> <E862> <92D0> <E863> <E864> <92C3> <E865> <E865> <92C0> <E866> <E866> <92D9> <E867> <E867> <92B6> <E868> <E868> <92CF> <E869> <E869> <92F1> <E86A> <E86A> <92DF> <E86B> <E86B> <92D8> <E86C> <E86C> <92E9> <E86D> <E86D> <92D7> <E86E> <E86E> <92DD> <E86F> <E86F> <92CC> <E870> <E870> <92EF> <E871> <E871> <92C2> <E872> <E872> <92E8> <E873> <E873> <92CA> <E874> <E874> <92C8> <E875> <E875> <92CE> <E876> <E876> <92E6> <E877> <E877> <92CD> <E878> <E878> <92D5> <E879> <E879> <92C9> <E87A> <E87A> <92E0> <E87B> <E87B> <92DE> <E87C> <E87C> <92E7> <E87D> <E87D> <92D1> <E87E> <E87E> <92D3> <E8A1> <E8A1> <92B5> <E8A2> <E8A2> <92E1> <E8A3> <E8A3> <92C6> <E8A4> <E8A4> <92B4> <E8A5> <E8A5> <957C> <E8A6> <E8A6> <95AC> <E8A7> <E8A7> <95AB> <E8A8> <E8A8> <95AE> <E8A9> <E8A9> <95B0> <E8AA> <E8AA> <96A4> <E8AB> <E8AB> <96A2> <E8AC> <E8AC> <96D3> <E8AD> <E8AD> <9705> <E8AE> <E8AE> <9708> <E8AF> <E8AF> <9702> <E8B0> <E8B0> <975A> <E8B1> <E8B1> <978A> <E8B2> <E8B2> <978E> <E8B3> <E8B3> <9788> <E8B4> <E8B4> <97D0> <E8B5> <E8B5> <97CF> <E8B6> <E8B6> <981E> <E8B7> <E8B7> <981D> <E8B8> <E8B8> <9826> <E8B9> <E8B9> <9829> <E8BA> <E8BA> <9828> <E8BB> <E8BB> <9820> <E8BC> <E8BC> <981B> <E8BD> <E8BD> <9827> <E8BE> <E8BE> <98B2> <E8BF> <E8BF> <9908> <E8C0> <E8C0> <98FA> <E8C1> <E8C1> <9911> <E8C2> <E8C2> <9914> <E8C3> <E8C4> <9916> <E8C5> <E8C5> <9915> <E8C6> <E8C6> <99DC> <E8C7> <E8C7> <99CD> <E8C8> <E8C8> <99CF> <E8C9> <E8CA> <99D3> <E8CB> <E8CB> <99CE> <E8CC> <E8CC> <99C9> <E8CD> <E8CD> <99D6> <E8CE> <E8CE> <99D8> <E8CF> <E8CF> <99CB> <E8D0> <E8D0> <99D7> <E8D1> <E8D1> <99CC> <E8D2> <E8D2> <9AB3> <E8D3> <E8D3> <9AEC> <E8D4> <E8D4> <9AEB> <E8D5> <E8D5> <9AF3> <E8D6> <E8D6> <9AF2> <E8D7> <E8D7> <9AF1> <E8D8> <E8D8> <9B46> <E8D9> <E8D9> <9B43> <E8DA> <E8DA> <9B67> <E8DB> <E8DB> <9B74> <E8DC> <E8DC> <9B71> <E8DD> <E8DD> <9B66> <E8DE> <E8DE> <9B76> <E8DF> <E8DF> <9B75> <E8E0> <E8E0> <9B70> <E8E1> <E8E1> <9B68> <E8E2> <E8E2> <9B64> <E8E3> <E8E3> <9B6C> <E8E4> <E8E4> <9CFC> <E8E5> <E8E5> <9CFA> <E8E6> <E8E6> <9CFD> <E8E7> <E8E7> <9CFF> <E8E8> <E8E8> <9CF7> <E8E9> <E8E9> <9D07> <E8EA> <E8EA> <9D00> endbfrange 100 beginbfrange <E8EB> <E8EB> <9CF9> <E8EC> <E8EC> <9CFB> <E8ED> <E8ED> <9D08> <E8EE> <E8EE> <9D05> <E8EF> <E8EF> <9D04> <E8F0> <E8F0> <9E83> <E8F1> <E8F1> <9ED3> <E8F2> <E8F3> <9F0F> <E8F4> <E8F4> <511C> <E8F5> <E8F5> <5113> <E8F6> <E8F6> <5117> <E8F7> <E8F7> <511A> <E8F8> <E8F8> <5111> <E8F9> <E8F9> <51DE> <E8FA> <E8FA> <5334> <E8FB> <E8FB> <53E1> <E8FC> <E8FC> <5670> <E8FD> <E8FD> <5660> <E8FE> <E8FE> <566E> <E940> <E940> <5673> <E941> <E941> <5666> <E942> <E942> <5663> <E943> <E943> <566D> <E944> <E944> <5672> <E945> <E945> <565E> <E946> <E946> <5677> <E947> <E947> <571C> <E948> <E948> <571B> <E949> <E949> <58C8> <E94A> <E94A> <58BD> <E94B> <E94B> <58C9> <E94C> <E94C> <58BF> <E94D> <E94D> <58BA> <E94E> <E94E> <58C2> <E94F> <E94F> <58BC> <E950> <E950> <58C6> <E951> <E951> <5B17> <E952> <E952> <5B19> <E953> <E953> <5B1B> <E954> <E954> <5B21> <E955> <E955> <5B14> <E956> <E956> <5B13> <E957> <E957> <5B10> <E958> <E958> <5B16> <E959> <E959> <5B28> <E95A> <E95A> <5B1A> <E95B> <E95B> <5B20> <E95C> <E95C> <5B1E> <E95D> <E95D> <5BEF> <E95E> <E95E> <5DAC> <E95F> <E95F> <5DB1> <E960> <E960> <5DA9> <E961> <E961> <5DA7> <E962> <E962> <5DB5> <E963> <E963> <5DB0> <E964> <E964> <5DAE> <E965> <E965> <5DAA> <E966> <E966> <5DA8> <E967> <E967> <5DB2> <E968> <E968> <5DAD> <E969> <E969> <5DAF> <E96A> <E96A> <5DB4> <E96B> <E96C> <5E67> <E96D> <E96D> <5E66> <E96E> <E96E> <5E6F> <E96F> <E96F> <5EE9> <E970> <E970> <5EE7> <E971> <E971> <5EE6> <E972> <E972> <5EE8> <E973> <E973> <5EE5> <E974> <E974> <5F4B> <E975> <E975> <5FBC> <E976> <E976> <619D> <E977> <E977> <61A8> <E978> <E978> <6196> <E979> <E979> <61C5> <E97A> <E97A> <61B4> <E97B> <E97B> <61C6> <E97C> <E97C> <61C1> <E97D> <E97D> <61CC> <E97E> <E97E> <61BA> <E9A1> <E9A1> <61BF> <E9A2> <E9A2> <61B8> <E9A3> <E9A3> <618C> <E9A4> <E9A4> <64D7> <E9A5> <E9A5> <64D6> <E9A6> <E9A6> <64D0> <E9A7> <E9A7> <64CF> <E9A8> <E9A8> <64C9> <E9A9> <E9A9> <64BD> <E9AA> <E9AA> <6489> <E9AB> <E9AB> <64C3> <E9AC> <E9AC> <64DB> <E9AD> <E9AD> <64F3> <E9AE> <E9AE> <64D9> <E9AF> <E9AF> <6533> <E9B0> <E9B0> <657F> <E9B1> <E9B1> <657C> <E9B2> <E9B2> <65A2> <E9B3> <E9B3> <66C8> endbfrange 100 beginbfrange <E9B4> <E9B4> <66BE> <E9B5> <E9B5> <66C0> <E9B6> <E9B7> <66CA> <E9B8> <E9B8> <66CF> <E9B9> <E9B9> <66BD> <E9BA> <E9BA> <66BB> <E9BB> <E9BB> <66BA> <E9BC> <E9BC> <66CC> <E9BD> <E9BD> <6723> <E9BE> <E9BE> <6A34> <E9BF> <E9BF> <6A66> <E9C0> <E9C0> <6A49> <E9C1> <E9C1> <6A67> <E9C2> <E9C2> <6A32> <E9C3> <E9C3> <6A68> <E9C4> <E9C4> <6A3E> <E9C5> <E9C5> <6A5D> <E9C6> <E9C6> <6A6D> <E9C7> <E9C7> <6A76> <E9C8> <E9C8> <6A5B> <E9C9> <E9C9> <6A51> <E9CA> <E9CA> <6A28> <E9CB> <E9CB> <6A5A> <E9CC> <E9CC> <6A3B> <E9CD> <E9CD> <6A3F> <E9CE> <E9CE> <6A41> <E9CF> <E9CF> <6A6A> <E9D0> <E9D0> <6A64> <E9D1> <E9D1> <6A50> <E9D2> <E9D2> <6A4F> <E9D3> <E9D3> <6A54> <E9D4> <E9D4> <6A6F> <E9D5> <E9D5> <6A69> <E9D6> <E9D6> <6A60> <E9D7> <E9D7> <6A3C> <E9D8> <E9D8> <6A5E> <E9D9> <E9D9> <6A56> <E9DA> <E9DA> <6A55> <E9DB> <E9DC> <6A4D> <E9DD> <E9DD> <6A46> <E9DE> <E9DE> <6B55> <E9DF> <E9DF> <6B54> <E9E0> <E9E0> <6B56> <E9E1> <E9E1> <6BA7> <E9E2> <E9E3> <6BAA> <E9E4> <E9E4> <6BC8> <E9E5> <E9E5> <6BC7> <E9E6> <E9E6> <6C04> <E9E7> <E9E7> <6C03> <E9E8> <E9E8> <6C06> <E9E9> <E9E9> <6FAD> <E9EA> <E9EA> <6FCB> <E9EB> <E9EB> <6FA3> <E9EC> <E9EC> <6FC7> <E9ED> <E9ED> <6FBC> <E9EE> <E9EE> <6FCE> <E9EF> <E9EF> <6FC8> <E9F0> <E9F0> <6F5E> <E9F1> <E9F1> <6FC4> <E9F2> <E9F2> <6FBD> <E9F3> <E9F3> <6F9E> <E9F4> <E9F4> <6FCA> <E9F5> <E9F5> <6FA8> <E9F6> <E9F6> <7004> <E9F7> <E9F7> <6FA5> <E9F8> <E9F8> <6FAE> <E9F9> <E9F9> <6FBA> <E9FA> <E9FA> <6FAC> <E9FB> <E9FB> <6FAA> <E9FC> <E9FC> <6FCF> <E9FD> <E9FD> <6FBF> <E9FE> <E9FE> <6FB8> <EA40> <EA40> <6FA2> <EA41> <EA41> <6FC9> <EA42> <EA42> <6FAB> <EA43> <EA43> <6FCD> <EA44> <EA44> <6FAF> <EA45> <EA45> <6FB2> <EA46> <EA46> <6FB0> <EA47> <EA47> <71C5> <EA48> <EA48> <71C2> <EA49> <EA49> <71BF> <EA4A> <EA4A> <71B8> <EA4B> <EA4B> <71D6> <EA4C> <EA4D> <71C0> <EA4E> <EA4E> <71CB> <EA4F> <EA4F> <71D4> <EA50> <EA50> <71CA> <EA51> <EA51> <71C7> <EA52> <EA52> <71CF> <EA53> <EA53> <71BD> <EA54> <EA54> <71D8> <EA55> <EA55> <71BC> <EA56> <EA56> <71C6> <EA57> <EA58> <71DA> <EA59> <EA5A> <729D> <EA5B> <EA5B> <7369> <EA5C> <EA5D> <7366> <EA5E> <EA5E> <736C> <EA5F> <EA5F> <7365> endbfrange 100 beginbfrange <EA60> <EA60> <736B> <EA61> <EA61> <736A> <EA62> <EA62> <747F> <EA63> <EA63> <749A> <EA64> <EA64> <74A0> <EA65> <EA65> <7494> <EA66> <EA66> <7492> <EA67> <EA67> <7495> <EA68> <EA68> <74A1> <EA69> <EA69> <750B> <EA6A> <EA6A> <7580> <EA6B> <EA6B> <762F> <EA6C> <EA6C> <762D> <EA6D> <EA6D> <7631> <EA6E> <EA6E> <763D> <EA6F> <EA6F> <7633> <EA70> <EA70> <763C> <EA71> <EA71> <7635> <EA72> <EA72> <7632> <EA73> <EA73> <7630> <EA74> <EA74> <76BB> <EA75> <EA75> <76E6> <EA76> <EA76> <779A> <EA77> <EA77> <779D> <EA78> <EA78> <77A1> <EA79> <EA79> <779C> <EA7A> <EA7A> <779B> <EA7B> <EA7C> <77A2> <EA7D> <EA7D> <7795> <EA7E> <EA7E> <7799> <EAA1> <EAA1> <7797> <EAA2> <EAA2> <78DD> <EAA3> <EAA3> <78E9> <EAA4> <EAA4> <78E5> <EAA5> <EAA5> <78EA> <EAA6> <EAA6> <78DE> <EAA7> <EAA7> <78E3> <EAA8> <EAA8> <78DB> <EAA9> <EAAA> <78E1> <EAAB> <EAAB> <78ED> <EAAC> <EAAD> <78DF> <EAAE> <EAAE> <79A4> <EAAF> <EAAF> <7A44> <EAB0> <EAB0> <7A48> <EAB1> <EAB1> <7A47> <EAB2> <EAB2> <7AB6> <EAB3> <EAB3> <7AB8> <EAB4> <EAB4> <7AB5> <EAB5> <EAB5> <7AB1> <EAB6> <EAB6> <7AB7> <EAB7> <EAB7> <7BDE> <EAB8> <EAB8> <7BE3> <EAB9> <EAB9> <7BE7> <EABA> <EABA> <7BDD> <EABB> <EABB> <7BD5> <EABC> <EABC> <7BE5> <EABD> <EABD> <7BDA> <EABE> <EABE> <7BE8> <EABF> <EABF> <7BF9> <EAC0> <EAC0> <7BD4> <EAC1> <EAC1> <7BEA> <EAC2> <EAC2> <7BE2> <EAC3> <EAC3> <7BDC> <EAC4> <EAC4> <7BEB> <EAC5> <EAC5> <7BD8> <EAC6> <EAC6> <7BDF> <EAC7> <EAC7> <7CD2> <EAC8> <EAC8> <7CD4> <EAC9> <EAC9> <7CD7> <EACA> <EACB> <7CD0> <EACC> <EACC> <7E12> <EACD> <EACD> <7E21> <EACE> <EACE> <7E17> <EACF> <EACF> <7E0C> <EAD0> <EAD1> <7E1F> <EAD2> <EAD2> <7E13> <EAD3> <EAD3> <7E0E> <EAD4> <EAD4> <7E1C> <EAD5> <EAD5> <7E15> <EAD6> <EAD6> <7E1A> <EAD7> <EAD7> <7E22> <EAD8> <EAD8> <7E0B> <EAD9> <EAD9> <7E0F> <EADA> <EADA> <7E16> <EADB> <EADB> <7E0D> <EADC> <EADC> <7E14> <EADD> <EADD> <7E25> <EADE> <EADE> <7E24> <EADF> <EADF> <7F43> <EAE0> <EAE1> <7F7B> <EAE2> <EAE2> <7F7A> <EAE3> <EAE3> <7FB1> <EAE4> <EAE4> <7FEF> <EAE5> <EAE5> <802A> <EAE6> <EAE6> <8029> <EAE7> <EAE7> <806C> <EAE8> <EAE8> <81B1> <EAE9> <EAE9> <81A6> <EAEA> <EAEA> <81AE> <EAEB> <EAEB> <81B9> endbfrange 100 beginbfrange <EAEC> <EAEC> <81B5> <EAED> <EAED> <81AB> <EAEE> <EAEE> <81B0> <EAEF> <EAEF> <81AC> <EAF0> <EAF0> <81B4> <EAF1> <EAF1> <81B2> <EAF2> <EAF2> <81B7> <EAF3> <EAF3> <81A7> <EAF4> <EAF4> <81F2> <EAF5> <EAF7> <8255> <EAF8> <EAF8> <8556> <EAF9> <EAF9> <8545> <EAFA> <EAFA> <856B> <EAFB> <EAFB> <854D> <EAFC> <EAFC> <8553> <EAFD> <EAFD> <8561> <EAFE> <EAFE> <8558> <EB40> <EB40> <8540> <EB41> <EB41> <8546> <EB42> <EB42> <8564> <EB43> <EB43> <8541> <EB44> <EB44> <8562> <EB45> <EB45> <8544> <EB46> <EB46> <8551> <EB47> <EB47> <8547> <EB48> <EB48> <8563> <EB49> <EB49> <853E> <EB4A> <EB4A> <855B> <EB4B> <EB4B> <8571> <EB4C> <EB4C> <854E> <EB4D> <EB4D> <856E> <EB4E> <EB4E> <8575> <EB4F> <EB4F> <8555> <EB50> <EB50> <8567> <EB51> <EB51> <8560> <EB52> <EB52> <858C> <EB53> <EB53> <8566> <EB54> <EB54> <855D> <EB55> <EB55> <8554> <EB56> <EB56> <8565> <EB57> <EB57> <856C> <EB58> <EB58> <8663> <EB59> <EB59> <8665> <EB5A> <EB5A> <8664> <EB5B> <EB5B> <879B> <EB5C> <EB5C> <878F> <EB5D> <EB5D> <8797> <EB5E> <EB5E> <8793> <EB5F> <EB5F> <8792> <EB60> <EB60> <8788> <EB61> <EB61> <8781> <EB62> <EB62> <8796> <EB63> <EB63> <8798> <EB64> <EB64> <8779> <EB65> <EB65> <8787> <EB66> <EB66> <87A3> <EB67> <EB67> <8785> <EB68> <EB69> <8790> <EB6A> <EB6A> <879D> <EB6B> <EB6B> <8784> <EB6C> <EB6C> <8794> <EB6D> <EB6D> <879C> <EB6E> <EB6E> <879A> <EB6F> <EB6F> <8789> <EB70> <EB70> <891E> <EB71> <EB71> <8926> <EB72> <EB72> <8930> <EB73> <EB74> <892D> <EB75> <EB75> <8927> <EB76> <EB76> <8931> <EB77> <EB77> <8922> <EB78> <EB78> <8929> <EB79> <EB79> <8923> <EB7A> <EB7A> <892F> <EB7B> <EB7B> <892C> <EB7C> <EB7C> <891F> <EB7D> <EB7D> <89F1> <EB7E> <EB7E> <8AE0> <EBA1> <EBA1> <8AE2> <EBA2> <EBA2> <8AF2> <EBA3> <EBA4> <8AF4> <EBA5> <EBA5> <8ADD> <EBA6> <EBA6> <8B14> <EBA7> <EBA7> <8AE4> <EBA8> <EBA8> <8ADF> <EBA9> <EBA9> <8AF0> <EBAA> <EBAA> <8AC8> <EBAB> <EBAB> <8ADE> <EBAC> <EBAC> <8AE1> <EBAD> <EBAD> <8AE8> <EBAE> <EBAE> <8AFF> <EBAF> <EBAF> <8AEF> <EBB0> <EBB0> <8AFB> <EBB1> <EBB2> <8C91> <EBB3> <EBB3> <8C90> <EBB4> <EBB4> <8CF5> <EBB5> <EBB5> <8CEE> <EBB6> <EBB6> <8CF1> <EBB7> <EBB7> <8CF0> <EBB8> <EBB8> <8CF3> endbfrange 100 beginbfrange <EBB9> <EBB9> <8D6C> <EBBA> <EBBA> <8D6E> <EBBB> <EBBB> <8DA5> <EBBC> <EBBC> <8DA7> <EBBD> <EBBD> <8E33> <EBBE> <EBBE> <8E3E> <EBBF> <EBBF> <8E38> <EBC0> <EBC0> <8E40> <EBC1> <EBC1> <8E45> <EBC2> <EBC2> <8E36> <EBC3> <EBC4> <8E3C> <EBC5> <EBC5> <8E41> <EBC6> <EBC6> <8E30> <EBC7> <EBC7> <8E3F> <EBC8> <EBC8> <8EBD> <EBC9> <EBC9> <8F36> <EBCA> <EBCA> <8F2E> <EBCB> <EBCB> <8F35> <EBCC> <EBCC> <8F32> <EBCD> <EBCD> <8F39> <EBCE> <EBCE> <8F37> <EBCF> <EBCF> <8F34> <EBD0> <EBD0> <9076> <EBD1> <EBD1> <9079> <EBD2> <EBD2> <907B> <EBD3> <EBD3> <9086> <EBD4> <EBD4> <90FA> <EBD5> <EBD5> <9133> <EBD6> <EBD7> <9135> <EBD8> <EBD8> <9193> <EBD9> <EBDA> <9190> <EBDB> <EBDB> <918D> <EBDC> <EBDC> <918F> <EBDD> <EBDD> <9327> <EBDE> <EBDE> <931E> <EBDF> <EBDF> <9308> <EBE0> <EBE0> <931F> <EBE1> <EBE1> <9306> <EBE2> <EBE2> <930F> <EBE3> <EBE3> <937A> <EBE4> <EBE4> <9338> <EBE5> <EBE5> <933C> <EBE6> <EBE6> <931B> <EBE7> <EBE7> <9323> <EBE8> <EBE8> <9312> <EBE9> <EBE9> <9301> <EBEA> <EBEA> <9346> <EBEB> <EBEB> <932D> <EBEC> <EBEC> <930E> <EBED> <EBED> <930D> <EBEE> <EBEE> <92CB> <EBEF> <EBEF> <931D> <EBF0> <EBF0> <92FA> <EBF1> <EBF1> <9325> <EBF2> <EBF2> <9313> <EBF3> <EBF3> <92F9> <EBF4> <EBF4> <92F7> <EBF5> <EBF5> <9334> <EBF6> <EBF6> <9302> <EBF7> <EBF7> <9324> <EBF8> <EBF8> <92FF> <EBF9> <EBF9> <9329> <EBFA> <EBFA> <9339> <EBFB> <EBFB> <9335> <EBFC> <EBFC> <932A> <EBFD> <EBFD> <9314> <EBFE> <EBFE> <930C> <EC40> <EC40> <930B> <EC41> <EC41> <92FE> <EC42> <EC42> <9309> <EC43> <EC43> <9300> <EC44> <EC44> <92FB> <EC45> <EC45> <9316> <EC46> <EC46> <95BC> <EC47> <EC47> <95CD> <EC48> <EC48> <95BE> <EC49> <EC4A> <95B9> <EC4B> <EC4B> <95B6> <EC4C> <EC4C> <95BF> <EC4D> <EC4D> <95B5> <EC4E> <EC4E> <95BD> <EC4F> <EC4F> <96A9> <EC50> <EC50> <96D4> <EC51> <EC51> <970B> <EC52> <EC52> <9712> <EC53> <EC53> <9710> <EC54> <EC54> <9799> <EC55> <EC55> <9797> <EC56> <EC56> <9794> <EC57> <EC57> <97F0> <EC58> <EC58> <97F8> <EC59> <EC59> <9835> <EC5A> <EC5A> <982F> <EC5B> <EC5B> <9832> <EC5C> <EC5C> <9924> <EC5D> <EC5D> <991F> <EC5E> <EC5E> <9927> <EC5F> <EC5F> <9929> <EC60> <EC60> <999E> <EC61> <EC61> <99EE> endbfrange 100 beginbfrange <EC62> <EC62> <99EC> <EC63> <EC63> <99E5> <EC64> <EC64> <99E4> <EC65> <EC65> <99F0> <EC66> <EC66> <99E3> <EC67> <EC67> <99EA> <EC68> <EC68> <99E9> <EC69> <EC69> <99E7> <EC6A> <EC6A> <9AB9> <EC6B> <EC6B> <9ABF> <EC6C> <EC6C> <9AB4> <EC6D> <EC6D> <9ABB> <EC6E> <EC6E> <9AF6> <EC6F> <EC6F> <9AFA> <EC70> <EC70> <9AF9> <EC71> <EC71> <9AF7> <EC72> <EC72> <9B33> <EC73> <EC73> <9B80> <EC74> <EC74> <9B85> <EC75> <EC75> <9B87> <EC76> <EC76> <9B7C> <EC77> <EC77> <9B7E> <EC78> <EC78> <9B7B> <EC79> <EC79> <9B82> <EC7A> <EC7A> <9B93> <EC7B> <EC7B> <9B92> <EC7C> <EC7C> <9B90> <EC7D> <EC7D> <9B7A> <EC7E> <EC7E> <9B95> <ECA1> <ECA1> <9B7D> <ECA2> <ECA2> <9B88> <ECA3> <ECA3> <9D25> <ECA4> <ECA4> <9D17> <ECA5> <ECA5> <9D20> <ECA6> <ECA6> <9D1E> <ECA7> <ECA7> <9D14> <ECA8> <ECA8> <9D29> <ECA9> <ECA9> <9D1D> <ECAA> <ECAA> <9D18> <ECAB> <ECAB> <9D22> <ECAC> <ECAC> <9D10> <ECAD> <ECAD> <9D19> <ECAE> <ECAE> <9D1F> <ECAF> <ECAF> <9E88> <ECB0> <ECB1> <9E86> <ECB2> <ECB2> <9EAE> <ECB3> <ECB3> <9EAD> <ECB4> <ECB5> <9ED5> <ECB6> <ECB6> <9EFA> <ECB7> <ECB7> <9F12> <ECB8> <ECB8> <9F3D> <ECB9> <ECB9> <5126> <ECBA> <ECBA> <5125> <ECBB> <ECBB> <5122> <ECBC> <ECBC> <5124> <ECBD> <ECBD> <5120> <ECBE> <ECBE> <5129> <ECBF> <ECBF> <52F4> <ECC0> <ECC0> <5693> <ECC1> <ECC2> <568C> <ECC3> <ECC3> <5686> <ECC4> <ECC4> <5684> <ECC5> <ECC5> <5683> <ECC6> <ECC6> <567E> <ECC7> <ECC7> <5682> <ECC8> <ECC8> <567F> <ECC9> <ECC9> <5681> <ECCA> <ECCA> <58D6> <ECCB> <ECCB> <58D4> <ECCC> <ECCC> <58CF> <ECCD> <ECCD> <58D2> <ECCE> <ECCE> <5B2D> <ECCF> <ECCF> <5B25> <ECD0> <ECD0> <5B32> <ECD1> <ECD1> <5B23> <ECD2> <ECD2> <5B2C> <ECD3> <ECD3> <5B27> <ECD4> <ECD4> <5B26> <ECD5> <ECD5> <5B2F> <ECD6> <ECD6> <5B2E> <ECD7> <ECD7> <5B7B> <ECD8> <ECD9> <5BF1> <ECDA> <ECDA> <5DB7> <ECDB> <ECDB> <5E6C> <ECDC> <ECDC> <5E6A> <ECDD> <ECDD> <5FBE> <ECDE> <ECDE> <5FBB> <ECDF> <ECDF> <61C3> <ECE0> <ECE0> <61B5> <ECE1> <ECE1> <61BC> <ECE2> <ECE2> <61E7> <ECE3> <ECE3> <61E0> <ECE4> <ECE4> <61E5> <ECE5> <ECE5> <61E4> <ECE6> <ECE6> <61E8> <ECE7> <ECE7> <61DE> <ECE8> <ECE8> <64EF> <ECE9> <ECE9> <64E9> <ECEA> <ECEA> <64E3> <ECEB> <ECEB> <64EB> endbfrange 100 beginbfrange <ECEC> <ECEC> <64E4> <ECED> <ECED> <64E8> <ECEE> <ECEE> <6581> <ECEF> <ECEF> <6580> <ECF0> <ECF0> <65B6> <ECF1> <ECF1> <65DA> <ECF2> <ECF2> <66D2> <ECF3> <ECF3> <6A8D> <ECF4> <ECF4> <6A96> <ECF5> <ECF5> <6A81> <ECF6> <ECF6> <6AA5> <ECF7> <ECF7> <6A89> <ECF8> <ECF8> <6A9F> <ECF9> <ECF9> <6A9B> <ECFA> <ECFA> <6AA1> <ECFB> <ECFB> <6A9E> <ECFC> <ECFC> <6A87> <ECFD> <ECFD> <6A93> <ECFE> <ECFE> <6A8E> <ED40> <ED40> <6A95> <ED41> <ED41> <6A83> <ED42> <ED42> <6AA8> <ED43> <ED43> <6AA4> <ED44> <ED44> <6A91> <ED45> <ED45> <6A7F> <ED46> <ED46> <6AA6> <ED47> <ED47> <6A9A> <ED48> <ED48> <6A85> <ED49> <ED49> <6A8C> <ED4A> <ED4A> <6A92> <ED4B> <ED4B> <6B5B> <ED4C> <ED4C> <6BAD> <ED4D> <ED4D> <6C09> <ED4E> <ED4E> <6FCC> <ED4F> <ED4F> <6FA9> <ED50> <ED50> <6FF4> <ED51> <ED51> <6FD4> <ED52> <ED52> <6FE3> <ED53> <ED53> <6FDC> <ED54> <ED54> <6FED> <ED55> <ED55> <6FE7> <ED56> <ED56> <6FE6> <ED57> <ED57> <6FDE> <ED58> <ED58> <6FF2> <ED59> <ED59> <6FDD> <ED5A> <ED5A> <6FE2> <ED5B> <ED5B> <6FE8> <ED5C> <ED5C> <71E1> <ED5D> <ED5D> <71F1> <ED5E> <ED5E> <71E8> <ED5F> <ED5F> <71F2> <ED60> <ED60> <71E4> <ED61> <ED61> <71F0> <ED62> <ED62> <71E2> <ED63> <ED63> <7373> <ED64> <ED65> <736E> <ED66> <ED66> <7497> <ED67> <ED67> <74B2> <ED68> <ED68> <74AB> <ED69> <ED69> <7490> <ED6A> <ED6A> <74AA> <ED6B> <ED6B> <74AD> <ED6C> <ED6C> <74B1> <ED6D> <ED6D> <74A5> <ED6E> <ED6E> <74AF> <ED6F> <ED71> <7510> <ED72> <ED72> <750F> <ED73> <ED73> <7584> <ED74> <ED74> <7643> <ED75> <ED76> <7648> <ED77> <ED77> <7647> <ED78> <ED78> <76A4> <ED79> <ED79> <76E9> <ED7A> <ED7A> <77B5> <ED7B> <ED7B> <77AB> <ED7C> <ED7C> <77B2> <ED7D> <ED7D> <77B7> <ED7E> <ED7E> <77B6> <EDA1> <EDA1> <77B4> <EDA2> <EDA2> <77B1> <EDA3> <EDA3> <77A8> <EDA4> <EDA4> <77F0> <EDA5> <EDA5> <78F3> <EDA6> <EDA6> <78FD> <EDA7> <EDA7> <7902> <EDA8> <EDA9> <78FB> <EDAA> <EDAA> <78F2> <EDAB> <EDAB> <7905> <EDAC> <EDAC> <78F9> <EDAD> <EDAD> <78FE> <EDAE> <EDAE> <7904> <EDAF> <EDAF> <79AB> <EDB0> <EDB0> <79A8> <EDB1> <EDB1> <7A5C> <EDB2> <EDB2> <7A5B> <EDB3> <EDB3> <7A56> <EDB4> <EDB4> <7A58> <EDB5> <EDB5> <7A54> <EDB6> <EDB6> <7A5A> <EDB7> <EDB7> <7ABE> endbfrange 100 beginbfrange <EDB8> <EDB9> <7AC0> <EDBA> <EDBA> <7C05> <EDBB> <EDBB> <7C0F> <EDBC> <EDBC> <7BF2> <EDBD> <EDBD> <7C00> <EDBE> <EDBE> <7BFF> <EDBF> <EDBF> <7BFB> <EDC0> <EDC0> <7C0E> <EDC1> <EDC1> <7BF4> <EDC2> <EDC2> <7C0B> <EDC3> <EDC3> <7BF3> <EDC4> <EDC4> <7C02> <EDC5> <EDC5> <7C09> <EDC6> <EDC6> <7C03> <EDC7> <EDC7> <7C01> <EDC8> <EDC8> <7BF8> <EDC9> <EDC9> <7BFD> <EDCA> <EDCA> <7C06> <EDCB> <EDCC> <7BF0> <EDCD> <EDCD> <7C10> <EDCE> <EDCE> <7C0A> <EDCF> <EDCF> <7CE8> <EDD0> <EDD0> <7E2D> <EDD1> <EDD1> <7E3C> <EDD2> <EDD2> <7E42> <EDD3> <EDD3> <7E33> <EDD4> <EDD4> <9848> <EDD5> <EDD5> <7E38> <EDD6> <EDD6> <7E2A> <EDD7> <EDD7> <7E49> <EDD8> <EDD8> <7E40> <EDD9> <EDD9> <7E47> <EDDA> <EDDA> <7E29> <EDDB> <EDDB> <7E4C> <EDDC> <EDDC> <7E30> <EDDD> <EDDD> <7E3B> <EDDE> <EDDE> <7E36> <EDDF> <EDDF> <7E44> <EDE0> <EDE0> <7E3A> <EDE1> <EDE1> <7F45> <EDE2> <EDE2> <7F7F> <EDE3> <EDE3> <7F7E> <EDE4> <EDE4> <7F7D> <EDE5> <EDE5> <7FF4> <EDE6> <EDE6> <7FF2> <EDE7> <EDE7> <802C> <EDE8> <EDE8> <81BB> <EDE9> <EDE9> <81C4> <EDEA> <EDEA> <81CC> <EDEB> <EDEB> <81CA> <EDEC> <EDEC> <81C5> <EDED> <EDED> <81C7> <EDEE> <EDEE> <81BC> <EDEF> <EDEF> <81E9> <EDF0> <EDF0> <825B> <EDF1> <EDF1> <825A> <EDF2> <EDF2> <825C> <EDF3> <EDF3> <8583> <EDF4> <EDF4> <8580> <EDF5> <EDF5> <858F> <EDF6> <EDF6> <85A7> <EDF7> <EDF7> <8595> <EDF8> <EDF8> <85A0> <EDF9> <EDF9> <858B> <EDFA> <EDFA> <85A3> <EDFB> <EDFB> <857B> <EDFC> <EDFC> <85A4> <EDFD> <EDFD> <859A> <EDFE> <EDFE> <859E> <EE40> <EE40> <8577> <EE41> <EE41> <857C> <EE42> <EE42> <8589> <EE43> <EE43> <85A1> <EE44> <EE44> <857A> <EE45> <EE45> <8578> <EE46> <EE46> <8557> <EE47> <EE47> <858E> <EE48> <EE48> <8596> <EE49> <EE49> <8586> <EE4A> <EE4A> <858D> <EE4B> <EE4B> <8599> <EE4C> <EE4C> <859D> <EE4D> <EE4D> <8581> <EE4E> <EE4E> <85A2> <EE4F> <EE4F> <8582> <EE50> <EE50> <8588> <EE51> <EE51> <8585> <EE52> <EE52> <8579> <EE53> <EE53> <8576> <EE54> <EE54> <8598> <EE55> <EE55> <8590> <EE56> <EE56> <859F> <EE57> <EE57> <8668> <EE58> <EE58> <87BE> <EE59> <EE59> <87AA> <EE5A> <EE5A> <87AD> <EE5B> <EE5B> <87C5> <EE5C> <EE5C> <87B0> <EE5D> <EE5D> <87AC> <EE5E> <EE5E> <87B9> endbfrange 100 beginbfrange <EE5F> <EE5F> <87B5> <EE60> <EE60> <87BC> <EE61> <EE61> <87AE> <EE62> <EE62> <87C9> <EE63> <EE63> <87C3> <EE64> <EE64> <87C2> <EE65> <EE65> <87CC> <EE66> <EE66> <87B7> <EE67> <EE67> <87AF> <EE68> <EE68> <87C4> <EE69> <EE69> <87CA> <EE6A> <EE6A> <87B4> <EE6B> <EE6B> <87B6> <EE6C> <EE6C> <87BF> <EE6D> <EE6D> <87B8> <EE6E> <EE6E> <87BD> <EE6F> <EE6F> <87DE> <EE70> <EE70> <87B2> <EE71> <EE71> <8935> <EE72> <EE72> <8933> <EE73> <EE73> <893C> <EE74> <EE74> <893E> <EE75> <EE75> <8941> <EE76> <EE76> <8952> <EE77> <EE77> <8937> <EE78> <EE78> <8942> <EE79> <EE79> <89AD> <EE7A> <EE7A> <89AF> <EE7B> <EE7B> <89AE> <EE7C> <EE7D> <89F2> <EE7E> <EE7E> <8B1E> <EEA1> <EEA1> <8B18> <EEA2> <EEA2> <8B16> <EEA3> <EEA3> <8B11> <EEA4> <EEA4> <8B05> <EEA5> <EEA5> <8B0B> <EEA6> <EEA6> <8B22> <EEA7> <EEA7> <8B0F> <EEA8> <EEA8> <8B12> <EEA9> <EEA9> <8B15> <EEAA> <EEAA> <8B07> <EEAB> <EEAB> <8B0D> <EEAC> <EEAC> <8B08> <EEAD> <EEAD> <8B06> <EEAE> <EEAE> <8B1C> <EEAF> <EEAF> <8B13> <EEB0> <EEB0> <8B1A> <EEB1> <EEB1> <8C4F> <EEB2> <EEB2> <8C70> <EEB3> <EEB3> <8C72> <EEB4> <EEB4> <8C71> <EEB5> <EEB5> <8C6F> <EEB6> <EEB6> <8C95> <EEB7> <EEB7> <8C94> <EEB8> <EEB8> <8CF9> <EEB9> <EEB9> <8D6F> <EEBA> <EEBA> <8E4E> <EEBB> <EEBB> <8E4D> <EEBC> <EEBC> <8E53> <EEBD> <EEBD> <8E50> <EEBE> <EEBE> <8E4C> <EEBF> <EEBF> <8E47> <EEC0> <EEC0> <8F43> <EEC1> <EEC1> <8F40> <EEC2> <EEC2> <9085> <EEC3> <EEC3> <907E> <EEC4> <EEC4> <9138> <EEC5> <EEC5> <919A> <EEC6> <EEC6> <91A2> <EEC7> <EEC7> <919B> <EEC8> <EEC8> <9199> <EEC9> <EEC9> <919F> <EECA> <EECA> <91A1> <EECB> <EECB> <919D> <EECC> <EECC> <91A0> <EECD> <EECD> <93A1> <EECE> <EECE> <9383> <EECF> <EECF> <93AF> <EED0> <EED0> <9364> <EED1> <EED1> <9356> <EED2> <EED2> <9347> <EED3> <EED3> <937C> <EED4> <EED4> <9358> <EED5> <EED5> <935C> <EED6> <EED6> <9376> <EED7> <EED7> <9349> <EED8> <EED9> <9350> <EEDA> <EEDA> <9360> <EEDB> <EEDB> <936D> <EEDC> <EEDC> <938F> <EEDD> <EEDD> <934C> <EEDE> <EEDE> <936A> <EEDF> <EEDF> <9379> <EEE0> <EEE0> <9357> <EEE1> <EEE1> <9355> <EEE2> <EEE2> <9352> <EEE3> <EEE3> <934F> <EEE4> <EEE4> <9371> <EEE5> <EEE5> <9377> <EEE6> <EEE6> <937B> endbfrange 100 beginbfrange <EEE7> <EEE7> <9361> <EEE8> <EEE8> <935E> <EEE9> <EEE9> <9363> <EEEA> <EEEA> <9367> <EEEB> <EEEB> <9380> <EEEC> <EEEC> <934E> <EEED> <EEED> <9359> <EEEE> <EEEE> <95C7> <EEEF> <EEEF> <95C0> <EEF0> <EEF0> <95C9> <EEF1> <EEF1> <95C3> <EEF2> <EEF2> <95C5> <EEF3> <EEF3> <95B7> <EEF4> <EEF4> <96AE> <EEF5> <EEF5> <96B0> <EEF6> <EEF6> <96AC> <EEF7> <EEF7> <9720> <EEF8> <EEF8> <971F> <EEF9> <EEF9> <9718> <EEFA> <EEFA> <971D> <EEFB> <EEFB> <9719> <EEFC> <EEFC> <979A> <EEFD> <EEFD> <97A1> <EEFE> <EEFE> <979C> <EF40> <EF40> <979E> <EF41> <EF41> <979D> <EF42> <EF42> <97D5> <EF43> <EF43> <97D4> <EF44> <EF44> <97F1> <EF45> <EF45> <9841> <EF46> <EF46> <9844> <EF47> <EF47> <984A> <EF48> <EF48> <9849> <EF49> <EF49> <9845> <EF4A> <EF4A> <9843> <EF4B> <EF4B> <9925> <EF4C> <EF4D> <992B> <EF4E> <EF4E> <992A> <EF4F> <EF4F> <9933> <EF50> <EF50> <9932> <EF51> <EF51> <992F> <EF52> <EF52> <992D> <EF53> <EF53> <9931> <EF54> <EF54> <9930> <EF55> <EF55> <9998> <EF56> <EF56> <99A3> <EF57> <EF57> <99A1> <EF58> <EF58> <9A02> <EF59> <EF59> <99FA> <EF5A> <EF5A> <99F4> <EF5B> <EF5B> <99F7> <EF5C> <EF5C> <99F9> <EF5D> <EF5D> <99F8> <EF5E> <EF5E> <99F6> <EF5F> <EF5F> <99FB> <EF60> <EF61> <99FD> <EF62> <EF62> <99FC> <EF63> <EF63> <9A03> <EF64> <EF64> <9ABE> <EF65> <EF65> <9AFE> <EF66> <EF66> <9AFD> <EF67> <EF67> <9B01> <EF68> <EF68> <9AFC> <EF69> <EF69> <9B48> <EF6A> <EF6A> <9B9A> <EF6B> <EF6B> <9BA8> <EF6C> <EF6C> <9B9E> <EF6D> <EF6D> <9B9B> <EF6E> <EF6E> <9BA6> <EF6F> <EF6F> <9BA1> <EF70> <EF70> <9BA5> <EF71> <EF71> <9BA4> <EF72> <EF72> <9B86> <EF73> <EF73> <9BA2> <EF74> <EF74> <9BA0> <EF75> <EF75> <9BAF> <EF76> <EF76> <9D33> <EF77> <EF77> <9D41> <EF78> <EF78> <9D67> <EF79> <EF79> <9D36> <EF7A> <EF7B> <9D2E> <EF7C> <EF7C> <9D31> <EF7D> <EF7D> <9D38> <EF7E> <EF7E> <9D30> <EFA1> <EFA1> <9D45> <EFA2> <EFA3> <9D42> <EFA4> <EFA4> <9D3E> <EFA5> <EFA5> <9D37> <EFA6> <EFA6> <9D40> <EFA7> <EFA7> <9D3D> <EFA8> <EFA8> <7FF5> <EFA9> <EFA9> <9D2D> <EFAA> <EFAA> <9E8A> <EFAB> <EFAB> <9E89> <EFAC> <EFAC> <9E8D> <EFAD> <EFAD> <9EB0> <EFAE> <EFAE> <9EC8> <EFAF> <EFAF> <9EDA> <EFB0> <EFB0> <9EFB> <EFB1> <EFB1> <9EFF> endbfrange 100 beginbfrange <EFB2> <EFB2> <9F24> <EFB3> <EFB3> <9F23> <EFB4> <EFB4> <9F22> <EFB5> <EFB5> <9F54> <EFB6> <EFB6> <9FA0> <EFB7> <EFB7> <5131> <EFB8> <EFB9> <512D> <EFBA> <EFBA> <5698> <EFBB> <EFBB> <569C> <EFBC> <EFBC> <5697> <EFBD> <EFBD> <569A> <EFBE> <EFBE> <569D> <EFBF> <EFBF> <5699> <EFC0> <EFC0> <5970> <EFC1> <EFC1> <5B3C> <EFC2> <EFC3> <5C69> <EFC4> <EFC4> <5DC0> <EFC5> <EFC6> <5E6D> <EFC7> <EFC7> <61D8> <EFC8> <EFC8> <61DF> <EFC9> <EFCA> <61ED> <EFCB> <EFCB> <61F1> <EFCC> <EFCC> <61EA> <EFCD> <EFCD> <61F0> <EFCE> <EFCE> <61EB> <EFCF> <EFCF> <61D6> <EFD0> <EFD0> <61E9> <EFD1> <EFD1> <64FF> <EFD2> <EFD2> <6504> <EFD3> <EFD3> <64FD> <EFD4> <EFD4> <64F8> <EFD5> <EFD5> <6501> <EFD6> <EFD6> <6503> <EFD7> <EFD7> <64FC> <EFD8> <EFD8> <6594> <EFD9> <EFD9> <65DB> <EFDA> <EFDB> <66DA> <EFDC> <EFDC> <66D8> <EFDD> <EFDD> <6AC5> <EFDE> <EFDE> <6AB9> <EFDF> <EFDF> <6ABD> <EFE0> <EFE0> <6AE1> <EFE1> <EFE1> <6AC6> <EFE2> <EFE2> <6ABA> <EFE3> <EFE4> <6AB6> <EFE5> <EFE5> <6AC7> <EFE6> <EFE6> <6AB4> <EFE7> <EFE7> <6AAD> <EFE8> <EFE8> <6B5E> <EFE9> <EFE9> <6BC9> <EFEA> <EFEA> <6C0B> <EFEB> <EFEB> <7007> <EFEC> <EFED> <700C> <EFEE> <EFEE> <7001> <EFEF> <EFEF> <7005> <EFF0> <EFF0> <7014> <EFF1> <EFF1> <700E> <EFF2> <EFF3> <6FFF> <EFF4> <EFF4> <6FFB> <EFF5> <EFF5> <7026> <EFF6> <EFF6> <6FFC> <EFF7> <EFF7> <6FF7> <EFF8> <EFF8> <700A> <EFF9> <EFF9> <7201> <EFFA> <EFFA> <71FF> <EFFB> <EFFB> <71F9> <EFFC> <EFFC> <7203> <EFFD> <EFFD> <71FD> <EFFE> <EFFE> <7376> <F040> <F040> <74B8> <F041> <F041> <74C0> <F042> <F042> <74B5> <F043> <F043> <74C1> <F044> <F044> <74BE> <F045> <F045> <74B6> <F046> <F046> <74BB> <F047> <F047> <74C2> <F048> <F048> <7514> <F049> <F049> <7513> <F04A> <F04A> <765C> <F04B> <F04B> <7664> <F04C> <F04C> <7659> <F04D> <F04D> <7650> <F04E> <F04E> <7653> <F04F> <F04F> <7657> <F050> <F050> <765A> <F051> <F051> <76A6> <F052> <F052> <76BD> <F053> <F053> <76EC> <F054> <F054> <77C2> <F055> <F055> <77BA> <F056> <F056> <78FF> <F057> <F057> <790C> <F058> <F059> <7913> <F05A> <F05A> <7909> <F05B> <F05B> <7910> <F05C> <F05C> <7912> <F05D> <F05D> <7911> <F05E> <F05E> <79AD> <F05F> <F05F> <79AC> endbfrange 100 beginbfrange <F060> <F060> <7A5F> <F061> <F061> <7C1C> <F062> <F062> <7C29> <F063> <F063> <7C19> <F064> <F064> <7C20> <F065> <F065> <7C1F> <F066> <F066> <7C2D> <F067> <F067> <7C1D> <F068> <F068> <7C26> <F069> <F069> <7C28> <F06A> <F06A> <7C22> <F06B> <F06B> <7C25> <F06C> <F06C> <7C30> <F06D> <F06D> <7E5C> <F06E> <F06E> <7E50> <F06F> <F06F> <7E56> <F070> <F070> <7E63> <F071> <F071> <7E58> <F072> <F072> <7E62> <F073> <F073> <7E5F> <F074> <F074> <7E51> <F075> <F075> <7E60> <F076> <F076> <7E57> <F077> <F077> <7E53> <F078> <F078> <7FB5> <F079> <F079> <7FB3> <F07A> <F07B> <7FF7> <F07C> <F07C> <8075> <F07D> <F07E> <81D1> <F0A1> <F0A1> <81D0> <F0A2> <F0A2> <825F> <F0A3> <F0A3> <825E> <F0A4> <F0A4> <85B4> <F0A5> <F0A5> <85C6> <F0A6> <F0A6> <85C0> <F0A7> <F0A7> <85C3> <F0A8> <F0A8> <85C2> <F0A9> <F0A9> <85B3> <F0AA> <F0AA> <85B5> <F0AB> <F0AB> <85BD> <F0AC> <F0AC> <85C7> <F0AD> <F0AD> <85C4> <F0AE> <F0AE> <85BF> <F0AF> <F0AF> <85CB> <F0B0> <F0B0> <85CE> <F0B1> <F0B1> <85C8> <F0B2> <F0B2> <85C5> <F0B3> <F0B3> <85B1> <F0B4> <F0B4> <85B6> <F0B5> <F0B5> <85D2> <F0B6> <F0B6> <8624> <F0B7> <F0B7> <85B8> <F0B8> <F0B8> <85B7> <F0B9> <F0B9> <85BE> <F0BA> <F0BA> <8669> <F0BB> <F0BB> <87E7> <F0BC> <F0BC> <87E6> <F0BD> <F0BD> <87E2> <F0BE> <F0BE> <87DB> <F0BF> <F0BF> <87EB> <F0C0> <F0C0> <87EA> <F0C1> <F0C1> <87E5> <F0C2> <F0C2> <87DF> <F0C3> <F0C3> <87F3> <F0C4> <F0C4> <87E4> <F0C5> <F0C5> <87D4> <F0C6> <F0C6> <87DC> <F0C7> <F0C7> <87D3> <F0C8> <F0C8> <87ED> <F0C9> <F0C9> <87D8> <F0CA> <F0CA> <87E3> <F0CB> <F0CB> <87A4> <F0CC> <F0CC> <87D7> <F0CD> <F0CD> <87D9> <F0CE> <F0CE> <8801> <F0CF> <F0CF> <87F4> <F0D0> <F0D0> <87E8> <F0D1> <F0D1> <87DD> <F0D2> <F0D2> <8953> <F0D3> <F0D3> <894B> <F0D4> <F0D4> <894F> <F0D5> <F0D5> <894C> <F0D6> <F0D6> <8946> <F0D7> <F0D8> <8950> <F0D9> <F0D9> <8949> <F0DA> <F0DA> <8B2A> <F0DB> <F0DB> <8B27> <F0DC> <F0DC> <8B23> <F0DD> <F0DD> <8B33> <F0DE> <F0DE> <8B30> <F0DF> <F0DF> <8B35> <F0E0> <F0E0> <8B47> <F0E1> <F0E1> <8B2F> <F0E2> <F0E2> <8B3C> <F0E3> <F0E3> <8B3E> <F0E4> <F0E4> <8B31> <F0E5> <F0E5> <8B25> <F0E6> <F0E6> <8B37> <F0E7> <F0E7> <8B26> <F0E8> <F0E8> <8B36> endbfrange 100 beginbfrange <F0E9> <F0E9> <8B2E> <F0EA> <F0EA> <8B24> <F0EB> <F0EB> <8B3B> <F0EC> <F0EC> <8B3D> <F0ED> <F0ED> <8B3A> <F0EE> <F0EE> <8C42> <F0EF> <F0EF> <8C75> <F0F0> <F0F0> <8C99> <F0F1> <F0F1> <8C98> <F0F2> <F0F2> <8C97> <F0F3> <F0F3> <8CFE> <F0F4> <F0F4> <8D04> <F0F5> <F0F5> <8D02> <F0F6> <F0F6> <8D00> <F0F7> <F0F7> <8E5C> <F0F8> <F0F8> <8E62> <F0F9> <F0F9> <8E60> <F0FA> <F0FA> <8E57> <F0FB> <F0FB> <8E56> <F0FC> <F0FC> <8E5E> <F0FD> <F0FD> <8E65> <F0FE> <F0FE> <8E67> <F140> <F140> <8E5B> <F141> <F141> <8E5A> <F142> <F142> <8E61> <F143> <F143> <8E5D> <F144> <F144> <8E69> <F145> <F145> <8E54> <F146> <F148> <8F46> <F149> <F149> <8F4B> <F14A> <F14A> <9128> <F14B> <F14C> <913A> <F14D> <F14D> <913E> <F14E> <F14E> <91A8> <F14F> <F14F> <91A5> <F150> <F150> <91A7> <F151> <F151> <91AF> <F152> <F152> <91AA> <F153> <F153> <93B5> <F154> <F154> <938C> <F155> <F155> <9392> <F156> <F156> <93B7> <F157> <F157> <939B> <F158> <F158> <939D> <F159> <F159> <9389> <F15A> <F15A> <93A7> <F15B> <F15B> <938E> <F15C> <F15C> <93AA> <F15D> <F15D> <939E> <F15E> <F15E> <93A6> <F15F> <F15F> <9395> <F160> <F160> <9388> <F161> <F161> <9399> <F162> <F162> <939F> <F163> <F163> <938D> <F164> <F164> <93B1> <F165> <F165> <9391> <F166> <F166> <93B2> <F167> <F167> <93A4> <F168> <F168> <93A8> <F169> <F169> <93B4> <F16A> <F16A> <93A3> <F16B> <F16B> <93A5> <F16C> <F16D> <95D2> <F16E> <F16E> <95D1> <F16F> <F16F> <96B3> <F170> <F170> <96D7> <F171> <F171> <96DA> <F172> <F172> <5DC2> <F173> <F173> <96DF> <F174> <F174> <96D8> <F175> <F175> <96DD> <F176> <F176> <9723> <F177> <F177> <9722> <F178> <F178> <9725> <F179> <F179> <97AC> <F17A> <F17A> <97AE> <F17B> <F17B> <97A8> <F17C> <F17C> <97AB> <F17D> <F17D> <97A4> <F17E> <F17E> <97AA> <F1A1> <F1A1> <97A2> <F1A2> <F1A2> <97A5> <F1A3> <F1A3> <97D7> <F1A4> <F1A4> <97D9> <F1A5> <F1A5> <97D6> <F1A6> <F1A6> <97D8> <F1A7> <F1A7> <97FA> <F1A8> <F1AA> <9850> <F1AB> <F1AB> <98B8> <F1AC> <F1AC> <9941> <F1AD> <F1AD> <993C> <F1AE> <F1AE> <993A> <F1AF> <F1AF> <9A0F> <F1B0> <F1B0> <9A0B> <F1B1> <F1B1> <9A09> <F1B2> <F1B2> <9A0D> <F1B3> <F1B3> <9A04> <F1B4> <F1B4> <9A11> <F1B5> <F1B5> <9A0A> endbfrange 100 beginbfrange <F1B6> <F1B6> <9A05> <F1B7> <F1B7> <9A07> <F1B8> <F1B8> <9A06> <F1B9> <F1B9> <9AC0> <F1BA> <F1BA> <9ADC> <F1BB> <F1BB> <9B08> <F1BC> <F1BD> <9B04> <F1BE> <F1BE> <9B29> <F1BF> <F1BF> <9B35> <F1C0> <F1C0> <9B4A> <F1C1> <F1C1> <9B4C> <F1C2> <F1C2> <9B4B> <F1C3> <F1C3> <9BC7> <F1C4> <F1C4> <9BC6> <F1C5> <F1C5> <9BC3> <F1C6> <F1C6> <9BBF> <F1C7> <F1C7> <9BC1> <F1C8> <F1C8> <9BB5> <F1C9> <F1C9> <9BB8> <F1CA> <F1CA> <9BD3> <F1CB> <F1CB> <9BB6> <F1CC> <F1CC> <9BC4> <F1CD> <F1CD> <9BB9> <F1CE> <F1CE> <9BBD> <F1CF> <F1CF> <9D5C> <F1D0> <F1D0> <9D53> <F1D1> <F1D1> <9D4F> <F1D2> <F1D2> <9D4A> <F1D3> <F1D3> <9D5B> <F1D4> <F1D4> <9D4B> <F1D5> <F1D5> <9D59> <F1D6> <F1D6> <9D56> <F1D7> <F1D7> <9D4C> <F1D8> <F1D8> <9D57> <F1D9> <F1D9> <9D52> <F1DA> <F1DA> <9D54> <F1DB> <F1DB> <9D5F> <F1DC> <F1DC> <9D58> <F1DD> <F1DD> <9D5A> <F1DE> <F1DE> <9E8E> <F1DF> <F1DF> <9E8C> <F1E0> <F1E0> <9EDF> <F1E1> <F1E1> <9F01> <F1E2> <F1E2> <9F00> <F1E3> <F1E3> <9F16> <F1E4> <F1E4> <9F25> <F1E5> <F1E5> <9F2B> <F1E6> <F1E6> <9F2A> <F1E7> <F1E7> <9F29> <F1E8> <F1E8> <9F28> <F1E9> <F1E9> <9F4C> <F1EA> <F1EA> <9F55> <F1EB> <F1EC> <5134> <F1ED> <F1ED> <5296> <F1EE> <F1EE> <52F7> <F1EF> <F1EF> <53B4> <F1F0> <F1F0> <56AB> <F1F1> <F1F1> <56AD> <F1F2> <F1F3> <56A6> <F1F4> <F1F4> <56AA> <F1F5> <F1F5> <56AC> <F1F6> <F1F6> <58DA> <F1F7> <F1F7> <58DD> <F1F8> <F1F8> <58DB> <F1F9> <F1F9> <5912> <F1FA> <F1FC> <5B3D> <F1FD> <F1FD> <5DC3> <F1FE> <F1FE> <5E70> <F240> <F240> <5FBF> <F241> <F241> <61FB> <F242> <F242> <6507> <F243> <F243> <6510> <F244> <F244> <650D> <F245> <F245> <6509> <F246> <F246> <650C> <F247> <F247> <650E> <F248> <F248> <6584> <F249> <F249> <65DE> <F24A> <F24A> <65DD> <F24B> <F24B> <66DE> <F24C> <F24C> <6AE7> <F24D> <F24D> <6AE0> <F24E> <F24E> <6ACC> <F24F> <F24F> <6AD1> <F250> <F250> <6AD9> <F251> <F251> <6ACB> <F252> <F252> <6ADF> <F253> <F253> <6ADC> <F254> <F254> <6AD0> <F255> <F255> <6AEB> <F256> <F256> <6ACF> <F257> <F257> <6ACD> <F258> <F258> <6ADE> <F259> <F259> <6B60> <F25A> <F25A> <6BB0> <F25B> <F25B> <6C0C> <F25C> <F25C> <7019> <F25D> <F25D> <7027> <F25E> <F25E> <7020> <F25F> <F25F> <7016> endbfrange 100 beginbfrange <F260> <F260> <702B> <F261> <F263> <7021> <F264> <F264> <7029> <F265> <F265> <7017> <F266> <F266> <7024> <F267> <F267> <701C> <F268> <F268> <702A> <F269> <F269> <720C> <F26A> <F26A> <720A> <F26B> <F26B> <7207> <F26C> <F26C> <7202> <F26D> <F26D> <7205> <F26E> <F26F> <72A5> <F270> <F270> <72A4> <F271> <F271> <72A3> <F272> <F272> <72A1> <F273> <F273> <74CB> <F274> <F274> <74C5> <F275> <F275> <74B7> <F276> <F276> <74C3> <F277> <F277> <7516> <F278> <F278> <7660> <F279> <F27A> <77C9> <F27B> <F27B> <77C4> <F27C> <F27C> <77F1> <F27D> <F27D> <791D> <F27E> <F27E> <791B> <F2A1> <F2A1> <7921> <F2A2> <F2A2> <791C> <F2A3> <F2A3> <7917> <F2A4> <F2A4> <791E> <F2A5> <F2A5> <79B0> <F2A6> <F2A7> <7A67> <F2A8> <F2A8> <7C33> <F2A9> <F2A9> <7C3C> <F2AA> <F2AA> <7C39> <F2AB> <F2AB> <7C2C> <F2AC> <F2AC> <7C3B> <F2AD> <F2AD> <7CEC> <F2AE> <F2AE> <7CEA> <F2AF> <F2AF> <7E76> <F2B0> <F2B0> <7E75> <F2B1> <F2B1> <7E78> <F2B2> <F2B2> <7E70> <F2B3> <F2B3> <7E77> <F2B4> <F2B4> <7E6F> <F2B5> <F2B5> <7E7A> <F2B6> <F2B6> <7E72> <F2B7> <F2B7> <7E74> <F2B8> <F2B8> <7E68> <F2B9> <F2B9> <7F4B> <F2BA> <F2BA> <7F4A> <F2BB> <F2BB> <7F83> <F2BC> <F2BC> <7F86> <F2BD> <F2BD> <7FB7> <F2BE> <F2BF> <7FFD> <F2C0> <F2C0> <8078> <F2C1> <F2C1> <81D7> <F2C2> <F2C2> <81D5> <F2C3> <F2C3> <8264> <F2C4> <F2C4> <8261> <F2C5> <F2C5> <8263> <F2C6> <F2C6> <85EB> <F2C7> <F2C7> <85F1> <F2C8> <F2C8> <85ED> <F2C9> <F2C9> <85D9> <F2CA> <F2CA> <85E1> <F2CB> <F2CB> <85E8> <F2CC> <F2CC> <85DA> <F2CD> <F2CD> <85D7> <F2CE> <F2CE> <85EC> <F2CF> <F2CF> <85F2> <F2D0> <F2D0> <85F8> <F2D1> <F2D1> <85D8> <F2D2> <F2D2> <85DF> <F2D3> <F2D3> <85E3> <F2D4> <F2D4> <85DC> <F2D5> <F2D5> <85D1> <F2D6> <F2D6> <85F0> <F2D7> <F2D7> <85E6> <F2D8> <F2D8> <85EF> <F2D9> <F2D9> <85DE> <F2DA> <F2DA> <85E2> <F2DB> <F2DB> <8800> <F2DC> <F2DC> <87FA> <F2DD> <F2DD> <8803> <F2DE> <F2DF> <87F6> <F2E0> <F2E0> <8809> <F2E1> <F2E1> <880C> <F2E2> <F2E2> <880B> <F2E3> <F2E3> <8806> <F2E4> <F2E4> <87FC> <F2E5> <F2E5> <8808> <F2E6> <F2E6> <87FF> <F2E7> <F2E7> <880A> <F2E8> <F2E8> <8802> <F2E9> <F2E9> <8962> <F2EA> <F2EB> <895A> <F2EC> <F2EC> <8957> <F2ED> <F2ED> <8961> endbfrange 100 beginbfrange <F2EE> <F2EE> <895C> <F2EF> <F2EF> <8958> <F2F0> <F2F0> <895D> <F2F1> <F2F1> <8959> <F2F2> <F2F2> <8988> <F2F3> <F2F3> <89B7> <F2F4> <F2F4> <89B6> <F2F5> <F2F5> <89F6> <F2F6> <F2F6> <8B50> <F2F7> <F2F7> <8B48> <F2F8> <F2F8> <8B4A> <F2F9> <F2F9> <8B40> <F2FA> <F2FA> <8B53> <F2FB> <F2FB> <8B56> <F2FC> <F2FC> <8B54> <F2FD> <F2FD> <8B4B> <F2FE> <F2FE> <8B55> <F340> <F340> <8B51> <F341> <F341> <8B42> <F342> <F342> <8B52> <F343> <F343> <8B57> <F344> <F344> <8C43> <F345> <F345> <8C77> <F346> <F346> <8C76> <F347> <F347> <8C9A> <F348> <F349> <8D06> <F34A> <F34A> <8D09> <F34B> <F34B> <8DAC> <F34C> <F34C> <8DAA> <F34D> <F34D> <8DAD> <F34E> <F34E> <8DAB> <F34F> <F34F> <8E6D> <F350> <F350> <8E78> <F351> <F351> <8E73> <F352> <F352> <8E6A> <F353> <F353> <8E6F> <F354> <F354> <8E7B> <F355> <F355> <8EC2> <F356> <F356> <8F52> <F357> <F357> <8F51> <F358> <F359> <8F4F> <F35A> <F35A> <8F53> <F35B> <F35B> <8FB4> <F35C> <F35C> <9140> <F35D> <F35D> <913F> <F35E> <F35E> <91B0> <F35F> <F35F> <91AD> <F360> <F360> <93DE> <F361> <F361> <93C7> <F362> <F362> <93CF> <F363> <F363> <93C2> <F364> <F364> <93DA> <F365> <F365> <93D0> <F366> <F366> <93F9> <F367> <F367> <93EC> <F368> <F368> <93CC> <F369> <F369> <93D9> <F36A> <F36A> <93A9> <F36B> <F36B> <93E6> <F36C> <F36C> <93CA> <F36D> <F36D> <93D4> <F36E> <F36E> <93EE> <F36F> <F36F> <93E3> <F370> <F370> <93D5> <F371> <F371> <93C4> <F372> <F372> <93CE> <F373> <F373> <93C0> <F374> <F374> <93D2> <F375> <F375> <93E7> <F376> <F376> <957D> <F377> <F378> <95DA> <F379> <F379> <96E1> <F37A> <F37A> <9729> <F37B> <F37C> <972B> <F37D> <F37D> <9728> <F37E> <F37E> <9726> <F3A1> <F3A1> <97B3> <F3A2> <F3A2> <97B7> <F3A3> <F3A3> <97B6> <F3A4> <F3A6> <97DD> <F3A7> <F3A7> <985C> <F3A8> <F3A8> <9859> <F3A9> <F3A9> <985D> <F3AA> <F3AA> <9857> <F3AB> <F3AB> <98BF> <F3AC> <F3AC> <98BD> <F3AD> <F3AD> <98BB> <F3AE> <F3AE> <98BE> <F3AF> <F3AF> <9948> <F3B0> <F3B0> <9947> <F3B1> <F3B1> <9943> <F3B2> <F3B3> <99A6> <F3B4> <F3B4> <9A1A> <F3B5> <F3B5> <9A15> <F3B6> <F3B6> <9A25> <F3B7> <F3B7> <9A1D> <F3B8> <F3B8> <9A24> <F3B9> <F3B9> <9A1B> <F3BA> <F3BA> <9A22> <F3BB> <F3BB> <9A20> endbfrange 100 beginbfrange <F3BC> <F3BC> <9A27> <F3BD> <F3BD> <9A23> <F3BE> <F3BE> <9A1E> <F3BF> <F3BF> <9A1C> <F3C0> <F3C0> <9A14> <F3C1> <F3C1> <9AC2> <F3C2> <F3C2> <9B0B> <F3C3> <F3C3> <9B0A> <F3C4> <F3C4> <9B0E> <F3C5> <F3C5> <9B0C> <F3C6> <F3C6> <9B37> <F3C7> <F3C8> <9BEA> <F3C9> <F3C9> <9BE0> <F3CA> <F3CA> <9BDE> <F3CB> <F3CB> <9BE4> <F3CC> <F3CC> <9BE6> <F3CD> <F3CD> <9BE2> <F3CE> <F3CE> <9BF0> <F3CF> <F3CF> <9BD4> <F3D0> <F3D0> <9BD7> <F3D1> <F3D1> <9BEC> <F3D2> <F3D2> <9BDC> <F3D3> <F3D3> <9BD9> <F3D4> <F3D4> <9BE5> <F3D5> <F3D5> <9BD5> <F3D6> <F3D6> <9BE1> <F3D7> <F3D7> <9BDA> <F3D8> <F3D8> <9D77> <F3D9> <F3D9> <9D81> <F3DA> <F3DA> <9D8A> <F3DB> <F3DB> <9D84> <F3DC> <F3DC> <9D88> <F3DD> <F3DD> <9D71> <F3DE> <F3DE> <9D80> <F3DF> <F3DF> <9D78> <F3E0> <F3E0> <9D86> <F3E1> <F3E2> <9D8B> <F3E3> <F3E3> <9D7D> <F3E4> <F3E4> <9D6B> <F3E5> <F3E6> <9D74> <F3E7> <F3E7> <9D70> <F3E8> <F3E8> <9D69> <F3E9> <F3E9> <9D85> <F3EA> <F3EA> <9D73> <F3EB> <F3EB> <9D7B> <F3EC> <F3EC> <9D82> <F3ED> <F3ED> <9D6F> <F3EE> <F3EE> <9D79> <F3EF> <F3EF> <9D7F> <F3F0> <F3F0> <9D87> <F3F1> <F3F1> <9D68> <F3F2> <F3F2> <9E94> <F3F3> <F3F3> <9E91> <F3F4> <F3F4> <9EC0> <F3F5> <F3F5> <9EFC> <F3F6> <F3F6> <9F2D> <F3F7> <F3F8> <9F40> <F3F9> <F3F9> <9F4D> <F3FA> <F3FC> <9F56> <F3FD> <F3FD> <5337> <F3FE> <F3FE> <56B2> <F440> <F440> <56B5> <F441> <F441> <56B3> <F442> <F442> <58E3> <F443> <F443> <5B45> <F444> <F445> <5DC6> <F446> <F447> <5EEE> <F448> <F449> <5FC0> <F44A> <F44A> <61F9> <F44B> <F44B> <6517> <F44C> <F44C> <6516> <F44D> <F44D> <6515> <F44E> <F44E> <6513> <F44F> <F44F> <65DF> <F450> <F450> <66E8> <F451> <F452> <66E3> <F453> <F453> <6AF3> <F454> <F454> <6AF0> <F455> <F455> <6AEA> <F456> <F456> <6AE8> <F457> <F457> <6AF9> <F458> <F458> <6AF1> <F459> <F45A> <6AEE> <F45B> <F45B> <703C> <F45C> <F45C> <7035> <F45D> <F45D> <702F> <F45E> <F45E> <7037> <F45F> <F45F> <7034> <F460> <F460> <7031> <F461> <F461> <7042> <F462> <F462> <7038> <F463> <F463> <703F> <F464> <F464> <703A> <F465> <F465> <7039> <F466> <F466> <7040> <F467> <F467> <703B> <F468> <F468> <7033> <F469> <F469> <7041> <F46A> <F46B> <7213> <F46C> <F46C> <72A8> endbfrange 100 beginbfrange <F46D> <F46D> <737D> <F46E> <F46E> <737C> <F46F> <F46F> <74BA> <F470> <F470> <76AB> <F471> <F471> <76AA> <F472> <F472> <76BE> <F473> <F473> <76ED> <F474> <F474> <77CC> <F475> <F476> <77CE> <F477> <F477> <77CD> <F478> <F478> <77F2> <F479> <F479> <7925> <F47A> <F47A> <7923> <F47B> <F47C> <7927> <F47D> <F47D> <7924> <F47E> <F47E> <7929> <F4A1> <F4A1> <79B2> <F4A2> <F4A2> <7A6E> <F4A3> <F4A4> <7A6C> <F4A5> <F4A5> <7AF7> <F4A6> <F4A6> <7C49> <F4A7> <F4A7> <7C48> <F4A8> <F4A8> <7C4A> <F4A9> <F4A9> <7C47> <F4AA> <F4AA> <7C45> <F4AB> <F4AB> <7CEE> <F4AC> <F4AC> <7E7B> <F4AD> <F4AD> <7E7E> <F4AE> <F4AE> <7E81> <F4AF> <F4AF> <7E80> <F4B0> <F4B0> <7FBA> <F4B1> <F4B1> <7FFF> <F4B2> <F4B2> <8079> <F4B3> <F4B3> <81DB> <F4B4> <F4B4> <81D9> <F4B5> <F4B5> <820B> <F4B6> <F4B7> <8268> <F4B8> <F4B8> <8622> <F4B9> <F4B9> <85FF> <F4BA> <F4BA> <8601> <F4BB> <F4BB> <85FE> <F4BC> <F4BC> <861B> <F4BD> <F4BD> <8600> <F4BE> <F4BE> <85F6> <F4BF> <F4BF> <8604> <F4C0> <F4C0> <8609> <F4C1> <F4C1> <8605> <F4C2> <F4C2> <860C> <F4C3> <F4C3> <85FD> <F4C4> <F4C4> <8819> <F4C5> <F4C6> <8810> <F4C7> <F4C7> <8817> <F4C8> <F4C8> <8813> <F4C9> <F4C9> <8816> <F4CA> <F4CA> <8963> <F4CB> <F4CB> <8966> <F4CC> <F4CC> <89B9> <F4CD> <F4CD> <89F7> <F4CE> <F4CE> <8B60> <F4CF> <F4CF> <8B6A> <F4D0> <F4D0> <8B5D> <F4D1> <F4D1> <8B68> <F4D2> <F4D2> <8B63> <F4D3> <F4D3> <8B65> <F4D4> <F4D4> <8B67> <F4D5> <F4D5> <8B6D> <F4D6> <F4D6> <8DAE> <F4D7> <F4D7> <8E86> <F4D8> <F4D8> <8E88> <F4D9> <F4D9> <8E84> <F4DA> <F4DA> <8F59> <F4DB> <F4DC> <8F56> <F4DD> <F4DD> <8F55> <F4DE> <F4DE> <8F58> <F4DF> <F4DF> <8F5A> <F4E0> <F4E0> <908D> <F4E1> <F4E1> <9143> <F4E2> <F4E2> <9141> <F4E3> <F4E3> <91B7> <F4E4> <F4E4> <91B5> <F4E5> <F4E6> <91B2> <F4E7> <F4E7> <940B> <F4E8> <F4E8> <9413> <F4E9> <F4E9> <93FB> <F4EA> <F4EA> <9420> <F4EB> <F4EB> <940F> <F4EC> <F4EC> <9414> <F4ED> <F4ED> <93FE> <F4EE> <F4EE> <9415> <F4EF> <F4EF> <9410> <F4F0> <F4F0> <9428> <F4F1> <F4F1> <9419> <F4F2> <F4F2> <940D> <F4F3> <F4F3> <93F5> <F4F4> <F4F4> <9400> <F4F5> <F4F5> <93F7> <F4F6> <F4F6> <9407> <F4F7> <F4F7> <940E> <F4F8> <F4F8> <9416> <F4F9> <F4F9> <9412> endbfrange 100 beginbfrange <F4FA> <F4FA> <93FA> <F4FB> <F4FB> <9409> <F4FC> <F4FC> <93F8> <F4FD> <F4FD> <940A> <F4FE> <F4FE> <93FF> <F540> <F540> <93FC> <F541> <F541> <940C> <F542> <F542> <93F6> <F543> <F543> <9411> <F544> <F544> <9406> <F545> <F545> <95DE> <F546> <F546> <95E0> <F547> <F547> <95DF> <F548> <F549> <972E> <F54A> <F54A> <97B9> <F54B> <F54B> <97BB> <F54C> <F54D> <97FD> <F54E> <F54E> <9860> <F54F> <F550> <9862> <F551> <F551> <985F> <F552> <F553> <98C1> <F554> <F554> <9950> <F555> <F555> <994E> <F556> <F556> <9959> <F557> <F557> <994C> <F558> <F558> <994B> <F559> <F559> <9953> <F55A> <F55A> <9A32> <F55B> <F55B> <9A34> <F55C> <F55C> <9A31> <F55D> <F55D> <9A2C> <F55E> <F55E> <9A2A> <F55F> <F55F> <9A36> <F560> <F560> <9A29> <F561> <F561> <9A2E> <F562> <F562> <9A38> <F563> <F563> <9A2D> <F564> <F564> <9AC7> <F565> <F565> <9ACA> <F566> <F566> <9AC6> <F567> <F567> <9B10> <F568> <F568> <9B12> <F569> <F569> <9B11> <F56A> <F56A> <9C0B> <F56B> <F56B> <9C08> <F56C> <F56C> <9BF7> <F56D> <F56D> <9C05> <F56E> <F56E> <9C12> <F56F> <F56F> <9BF8> <F570> <F570> <9C40> <F571> <F571> <9C07> <F572> <F572> <9C0E> <F573> <F573> <9C06> <F574> <F574> <9C17> <F575> <F575> <9C14> <F576> <F576> <9C09> <F577> <F577> <9D9F> <F578> <F578> <9D99> <F579> <F579> <9DA4> <F57A> <F57A> <9D9D> <F57B> <F57B> <9D92> <F57C> <F57C> <9D98> <F57D> <F57D> <9D90> <F57E> <F57E> <9D9B> <F5A1> <F5A1> <9DA0> <F5A2> <F5A2> <9D94> <F5A3> <F5A3> <9D9C> <F5A4> <F5A4> <9DAA> <F5A5> <F5A5> <9D97> <F5A6> <F5A6> <9DA1> <F5A7> <F5A7> <9D9A> <F5A8> <F5A8> <9DA2> <F5A9> <F5A9> <9DA8> <F5AA> <F5AA> <9D9E> <F5AB> <F5AB> <9DA3> <F5AC> <F5AC> <9DBF> <F5AD> <F5AD> <9DA9> <F5AE> <F5AE> <9D96> <F5AF> <F5B0> <9DA6> <F5B1> <F5B1> <9E99> <F5B2> <F5B2> <9E9B> <F5B3> <F5B3> <9E9A> <F5B4> <F5B4> <9EE5> <F5B5> <F5B5> <9EE4> <F5B6> <F5B6> <9EE7> <F5B7> <F5B7> <9EE6> <F5B8> <F5B8> <9F30> <F5B9> <F5B9> <9F2E> <F5BA> <F5BA> <9F5B> <F5BB> <F5BB> <9F60> <F5BC> <F5BC> <9F5E> <F5BD> <F5BD> <9F5D> <F5BE> <F5BE> <9F59> <F5BF> <F5BF> <9F91> <F5C0> <F5C0> <513A> <F5C1> <F5C1> <5139> <F5C2> <F5C2> <5298> <F5C3> <F5C3> <5297> <F5C4> <F5C4> <56C3> <F5C5> <F5C6> <56BD> endbfrange 100 beginbfrange <F5C7> <F5C7> <5B48> <F5C8> <F5C8> <5B47> <F5C9> <F5C9> <5DCB> <F5CA> <F5CA> <5DCF> <F5CB> <F5CB> <5EF1> <F5CC> <F5CC> <61FD> <F5CD> <F5CD> <651B> <F5CE> <F5CE> <6B02> <F5CF> <F5CF> <6AFC> <F5D0> <F5D0> <6B03> <F5D1> <F5D1> <6AF8> <F5D2> <F5D2> <6B00> <F5D3> <F5D4> <7043> <F5D5> <F5D5> <704A> <F5D6> <F5D7> <7048> <F5D8> <F5D9> <7045> <F5DA> <F5DA> <721D> <F5DB> <F5DB> <721A> <F5DC> <F5DC> <7219> <F5DD> <F5DD> <737E> <F5DE> <F5DE> <7517> <F5DF> <F5DF> <766A> <F5E0> <F5E0> <77D0> <F5E1> <F5E1> <792D> <F5E2> <F5E2> <7931> <F5E3> <F5E3> <792F> <F5E4> <F5E4> <7C54> <F5E5> <F5E5> <7C53> <F5E6> <F5E6> <7CF2> <F5E7> <F5E7> <7E8A> <F5E8> <F5E9> <7E87> <F5EA> <F5EA> <7E8B> <F5EB> <F5EB> <7E86> <F5EC> <F5EC> <7E8D> <F5ED> <F5ED> <7F4D> <F5EE> <F5EE> <7FBB> <F5EF> <F5EF> <8030> <F5F0> <F5F0> <81DD> <F5F1> <F5F1> <8618> <F5F2> <F5F2> <862A> <F5F3> <F5F3> <8626> <F5F4> <F5F4> <861F> <F5F5> <F5F5> <8623> <F5F6> <F5F6> <861C> <F5F7> <F5F7> <8619> <F5F8> <F5F8> <8627> <F5F9> <F5F9> <862E> <F5FA> <F5FA> <8621> <F5FB> <F5FB> <8620> <F5FC> <F5FC> <8629> <F5FD> <F5FD> <861E> <F5FE> <F5FE> <8625> <F640> <F640> <8829> <F641> <F641> <881D> <F642> <F642> <881B> <F643> <F643> <8820> <F644> <F644> <8824> <F645> <F645> <881C> <F646> <F646> <882B> <F647> <F647> <884A> <F648> <F648> <896D> <F649> <F649> <8969> <F64A> <F64A> <896E> <F64B> <F64B> <896B> <F64C> <F64C> <89FA> <F64D> <F64D> <8B79> <F64E> <F64E> <8B78> <F64F> <F64F> <8B45> <F650> <F651> <8B7A> <F652> <F652> <8D10> <F653> <F653> <8D14> <F654> <F654> <8DAF> <F655> <F655> <8E8E> <F656> <F656> <8E8C> <F657> <F657> <8F5E> <F658> <F658> <8F5B> <F659> <F659> <8F5D> <F65A> <F65A> <9146> <F65B> <F65C> <9144> <F65D> <F65D> <91B9> <F65E> <F65E> <943F> <F65F> <F65F> <943B> <F660> <F660> <9436> <F661> <F661> <9429> <F662> <F662> <943D> <F663> <F663> <943C> <F664> <F664> <9430> <F665> <F665> <9439> <F666> <F666> <942A> <F667> <F667> <9437> <F668> <F668> <942C> <F669> <F669> <9440> <F66A> <F66A> <9431> <F66B> <F66B> <95E5> <F66C> <F66C> <95E4> <F66D> <F66D> <95E3> <F66E> <F66E> <9735> <F66F> <F66F> <973A> <F670> <F670> <97BF> <F671> <F671> <97E1> endbfrange 100 beginbfrange <F672> <F672> <9864> <F673> <F673> <98C9> <F674> <F674> <98C6> <F675> <F675> <98C0> <F676> <F676> <9958> <F677> <F677> <9956> <F678> <F678> <9A39> <F679> <F679> <9A3D> <F67A> <F67A> <9A46> <F67B> <F67B> <9A44> <F67C> <F67C> <9A42> <F67D> <F67D> <9A41> <F67E> <F67E> <9A3A> <F6A1> <F6A1> <9A3F> <F6A2> <F6A2> <9ACD> <F6A3> <F6A3> <9B15> <F6A4> <F6A5> <9B17> <F6A6> <F6A6> <9B16> <F6A7> <F6A7> <9B3A> <F6A8> <F6A8> <9B52> <F6A9> <F6A9> <9C2B> <F6AA> <F6AA> <9C1D> <F6AB> <F6AB> <9C1C> <F6AC> <F6AC> <9C2C> <F6AD> <F6AD> <9C23> <F6AE> <F6AF> <9C28> <F6B0> <F6B0> <9C24> <F6B1> <F6B1> <9C21> <F6B2> <F6B2> <9DB7> <F6B3> <F6B3> <9DB6> <F6B4> <F6B4> <9DBC> <F6B5> <F6B5> <9DC1> <F6B6> <F6B6> <9DC7> <F6B7> <F6B7> <9DCA> <F6B8> <F6B8> <9DCF> <F6B9> <F6B9> <9DBE> <F6BA> <F6BA> <9DC5> <F6BB> <F6BB> <9DC3> <F6BC> <F6BC> <9DBB> <F6BD> <F6BD> <9DB5> <F6BE> <F6BE> <9DCE> <F6BF> <F6C0> <9DB9> <F6C1> <F6C1> <9DAC> <F6C2> <F6C2> <9DC8> <F6C3> <F6C3> <9DB1> <F6C4> <F6C4> <9DAD> <F6C5> <F6C5> <9DCC> <F6C6> <F6C6> <9DB3> <F6C7> <F6C7> <9DCD> <F6C8> <F6C8> <9DB2> <F6C9> <F6C9> <9E7A> <F6CA> <F6CA> <9E9C> <F6CB> <F6CB> <9EEB> <F6CC> <F6CC> <9EEE> <F6CD> <F6CD> <9EED> <F6CE> <F6CE> <9F1B> <F6CF> <F6CF> <9F18> <F6D0> <F6D0> <9F1A> <F6D1> <F6D1> <9F31> <F6D2> <F6D2> <9F4E> <F6D3> <F6D3> <9F65> <F6D4> <F6D4> <9F64> <F6D5> <F6D5> <9F92> <F6D6> <F6D6> <4EB9> <F6D7> <F6D7> <56C6> <F6D8> <F6D8> <56C5> <F6D9> <F6D9> <56CB> <F6DA> <F6DA> <5971> <F6DB> <F6DC> <5B4B> <F6DD> <F6DD> <5DD5> <F6DE> <F6DE> <5DD1> <F6DF> <F6DF> <5EF2> <F6E0> <F6E0> <6521> <F6E1> <F6E1> <6520> <F6E2> <F6E2> <6526> <F6E3> <F6E3> <6522> <F6E4> <F6E4> <6B0B> <F6E5> <F6E6> <6B08> <F6E7> <F6E7> <6C0D> <F6E8> <F6EA> <7055> <F6EB> <F6EB> <7052> <F6EC> <F6ED> <721E> <F6EE> <F6EE> <72A9> <F6EF> <F6EF> <737F> <F6F0> <F6F0> <74D8> <F6F1> <F6F1> <74D5> <F6F2> <F6F2> <74D9> <F6F3> <F6F3> <74D7> <F6F4> <F6F4> <766D> <F6F5> <F6F5> <76AD> <F6F6> <F6F6> <7935> <F6F7> <F6F7> <79B4> <F6F8> <F6F9> <7A70> <F6FA> <F6FA> <7C57> <F6FB> <F6FB> <7C5C> <F6FC> <F6FC> <7C59> <F6FD> <F6FD> <7C5B> <F6FE> <F6FE> <7C5A> <F740> <F740> <7CF4> <F741> <F741> <7CF1> endbfrange 100 beginbfrange <F742> <F742> <7E91> <F743> <F743> <7F4F> <F744> <F744> <7F87> <F745> <F745> <81DE> <F746> <F746> <826B> <F747> <F748> <8634> <F749> <F749> <8633> <F74A> <F74A> <862C> <F74B> <F74B> <8632> <F74C> <F74C> <8636> <F74D> <F74D> <882C> <F74E> <F74E> <8828> <F74F> <F74F> <8826> <F750> <F750> <882A> <F751> <F751> <8825> <F752> <F752> <8971> <F753> <F753> <89BF> <F754> <F754> <89BE> <F755> <F755> <89FB> <F756> <F756> <8B7E> <F757> <F757> <8B84> <F758> <F758> <8B82> <F759> <F759> <8B86> <F75A> <F75A> <8B85> <F75B> <F75B> <8B7F> <F75C> <F75C> <8D15> <F75D> <F75D> <8E95> <F75E> <F75E> <8E94> <F75F> <F75F> <8E9A> <F760> <F760> <8E92> <F761> <F761> <8E90> <F762> <F763> <8E96> <F764> <F764> <8F60> <F765> <F765> <8F62> <F766> <F766> <9147> <F767> <F767> <944C> <F768> <F768> <9450> <F769> <F76A> <944A> <F76B> <F76B> <944F> <F76C> <F76C> <9447> <F76D> <F76D> <9445> <F76E> <F76F> <9448> <F770> <F770> <9446> <F771> <F771> <973F> <F772> <F772> <97E3> <F773> <F773> <986A> <F774> <F774> <9869> <F775> <F775> <98CB> <F776> <F776> <9954> <F777> <F777> <995B> <F778> <F778> <9A4E> <F779> <F77A> <9A53> <F77B> <F77B> <9A4C> <F77C> <F77C> <9A4F> <F77D> <F77D> <9A48> <F77E> <F77E> <9A4A> <F7A1> <F7A1> <9A49> <F7A2> <F7A2> <9A52> <F7A3> <F7A3> <9A50> <F7A4> <F7A4> <9AD0> <F7A5> <F7A5> <9B19> <F7A6> <F7A6> <9B2B> <F7A7> <F7A7> <9B3B> <F7A8> <F7A8> <9B56> <F7A9> <F7A9> <9B55> <F7AA> <F7AA> <9C46> <F7AB> <F7AB> <9C48> <F7AC> <F7AC> <9C3F> <F7AD> <F7AD> <9C44> <F7AE> <F7AE> <9C39> <F7AF> <F7AF> <9C33> <F7B0> <F7B0> <9C41> <F7B1> <F7B1> <9C3C> <F7B2> <F7B2> <9C37> <F7B3> <F7B3> <9C34> <F7B4> <F7B4> <9C32> <F7B5> <F7B5> <9C3D> <F7B6> <F7B6> <9C36> <F7B7> <F7B7> <9DDB> <F7B8> <F7B8> <9DD2> <F7B9> <F7B9> <9DDE> <F7BA> <F7BA> <9DDA> <F7BB> <F7BB> <9DCB> <F7BC> <F7BC> <9DD0> <F7BD> <F7BD> <9DDC> <F7BE> <F7BE> <9DD1> <F7BF> <F7BF> <9DDF> <F7C0> <F7C0> <9DE9> <F7C1> <F7C1> <9DD9> <F7C2> <F7C2> <9DD8> <F7C3> <F7C3> <9DD6> <F7C4> <F7C4> <9DF5> <F7C5> <F7C5> <9DD5> <F7C6> <F7C6> <9DDD> <F7C7> <F7C7> <9EB6> <F7C8> <F7C8> <9EF0> <F7C9> <F7C9> <9F35> <F7CA> <F7CA> <9F33> <F7CB> <F7CB> <9F32> <F7CC> <F7CC> <9F42> endbfrange 100 beginbfrange <F7CD> <F7CD> <9F6B> <F7CE> <F7CE> <9F95> <F7CF> <F7CF> <9FA2> <F7D0> <F7D0> <513D> <F7D1> <F7D1> <5299> <F7D2> <F7D2> <58E8> <F7D3> <F7D3> <58E7> <F7D4> <F7D4> <5972> <F7D5> <F7D5> <5B4D> <F7D6> <F7D6> <5DD8> <F7D7> <F7D7> <882F> <F7D8> <F7D8> <5F4F> <F7D9> <F7D9> <6201> <F7DA> <F7DB> <6203> <F7DC> <F7DC> <6529> <F7DD> <F7DD> <6525> <F7DE> <F7DE> <6596> <F7DF> <F7DF> <66EB> <F7E0> <F7E1> <6B11> <F7E2> <F7E2> <6B0F> <F7E3> <F7E3> <6BCA> <F7E4> <F7E4> <705B> <F7E5> <F7E5> <705A> <F7E6> <F7E6> <7222> <F7E7> <F7E7> <7382> <F7E8> <F7E8> <7381> <F7E9> <F7E9> <7383> <F7EA> <F7EA> <7670> <F7EB> <F7EB> <77D4> <F7EC> <F7EC> <7C67> <F7ED> <F7ED> <7C66> <F7EE> <F7EE> <7E95> <F7EF> <F7EF> <826C> <F7F0> <F7F0> <863A> <F7F1> <F7F1> <8640> <F7F2> <F7F2> <8639> <F7F3> <F7F3> <863C> <F7F4> <F7F4> <8631> <F7F5> <F7F5> <863B> <F7F6> <F7F6> <863E> <F7F7> <F7F7> <8830> <F7F8> <F7F8> <8832> <F7F9> <F7F9> <882E> <F7FA> <F7FA> <8833> <F7FB> <F7FB> <8976> <F7FC> <F7FC> <8974> <F7FD> <F7FD> <8973> <F7FE> <F7FE> <89FE> <F840> <F840> <8B8C> <F841> <F841> <8B8E> <F842> <F842> <8B8B> <F843> <F843> <8B88> <F844> <F844> <8C45> <F845> <F845> <8D19> <F846> <F846> <8E98> <F847> <F847> <8F64> <F848> <F848> <8F63> <F849> <F849> <91BC> <F84A> <F84A> <9462> <F84B> <F84B> <9455> <F84C> <F84C> <945D> <F84D> <F84D> <9457> <F84E> <F84E> <945E> <F84F> <F850> <97C4> <F851> <F851> <9800> <F852> <F852> <9A56> <F853> <F853> <9A59> <F854> <F856> <9B1E> <F857> <F857> <9C52> <F858> <F858> <9C58> <F859> <F859> <9C50> <F85A> <F85A> <9C4A> <F85B> <F85B> <9C4D> <F85C> <F85C> <9C4B> <F85D> <F85D> <9C55> <F85E> <F85E> <9C59> <F85F> <F85F> <9C4C> <F860> <F860> <9C4E> <F861> <F861> <9DFB> <F862> <F862> <9DF7> <F863> <F863> <9DEF> <F864> <F864> <9DE3> <F865> <F865> <9DEB> <F866> <F866> <9DF8> <F867> <F867> <9DE4> <F868> <F868> <9DF6> <F869> <F869> <9DE1> <F86A> <F86A> <9DEE> <F86B> <F86B> <9DE6> <F86C> <F86C> <9DF2> <F86D> <F86D> <9DF0> <F86E> <F86E> <9DE2> <F86F> <F86F> <9DEC> <F870> <F870> <9DF4> <F871> <F871> <9DF3> <F872> <F872> <9DE8> <F873> <F873> <9DED> <F874> <F874> <9EC2> <F875> <F875> <9ED0> <F876> <F877> <9EF2> endbfrange 100 beginbfrange <F878> <F878> <9F06> <F879> <F879> <9F1C> <F87A> <F87A> <9F38> <F87B> <F87B> <9F37> <F87C> <F87C> <9F36> <F87D> <F87D> <9F43> <F87E> <F87E> <9F4F> <F8A1> <F8A1> <9F71> <F8A2> <F8A2> <9F70> <F8A3> <F8A4> <9F6E> <F8A5> <F8A5> <56D3> <F8A6> <F8A6> <56CD> <F8A7> <F8A7> <5B4E> <F8A8> <F8A8> <5C6D> <F8A9> <F8A9> <652D> <F8AA> <F8AB> <66ED> <F8AC> <F8AC> <6B13> <F8AD> <F8AD> <705F> <F8AE> <F8AE> <7061> <F8AF> <F8AF> <705D> <F8B0> <F8B0> <7060> <F8B1> <F8B1> <7223> <F8B2> <F8B2> <74DB> <F8B3> <F8B3> <74E5> <F8B4> <F8B4> <77D5> <F8B5> <F8B5> <7938> <F8B6> <F8B6> <79B7> <F8B7> <F8B7> <79B6> <F8B8> <F8B8> <7C6A> <F8B9> <F8B9> <7E97> <F8BA> <F8BA> <7F89> <F8BB> <F8BB> <826D> <F8BC> <F8BC> <8643> <F8BD> <F8BD> <8838> <F8BE> <F8BE> <8837> <F8BF> <F8BF> <8835> <F8C0> <F8C0> <884B> <F8C1> <F8C2> <8B94> <F8C3> <F8C5> <8E9E> <F8C6> <F8C6> <8E9D> <F8C7> <F8C7> <91BE> <F8C8> <F8C8> <91BD> <F8C9> <F8C9> <91C2> <F8CA> <F8CA> <946B> <F8CB> <F8CC> <9468> <F8CD> <F8CD> <96E5> <F8CE> <F8CE> <9746> <F8CF> <F8CF> <9743> <F8D0> <F8D0> <9747> <F8D1> <F8D1> <97C7> <F8D2> <F8D2> <97E5> <F8D3> <F8D3> <9A5E> <F8D4> <F8D4> <9AD5> <F8D5> <F8D5> <9B59> <F8D6> <F8D6> <9C63> <F8D7> <F8D7> <9C67> <F8D8> <F8D8> <9C66> <F8D9> <F8D9> <9C62> <F8DA> <F8DA> <9C5E> <F8DB> <F8DB> <9C60> <F8DC> <F8DC> <9E02> <F8DD> <F8DD> <9DFE> <F8DE> <F8DE> <9E07> <F8DF> <F8DF> <9E03> <F8E0> <F8E0> <9E06> <F8E1> <F8E1> <9E05> <F8E2> <F8E3> <9E00> <F8E4> <F8E4> <9E09> <F8E5> <F8E5> <9DFF> <F8E6> <F8E6> <9DFD> <F8E7> <F8E7> <9E04> <F8E8> <F8E8> <9EA0> <F8E9> <F8E9> <9F1E> <F8EA> <F8EA> <9F46> <F8EB> <F8ED> <9F74> <F8EE> <F8EE> <56D4> <F8EF> <F8EF> <652E> <F8F0> <F8F0> <65B8> <F8F1> <F8F2> <6B18> <F8F3> <F8F3> <6B17> <F8F4> <F8F4> <6B1A> <F8F5> <F8F5> <7062> <F8F6> <F8F6> <7226> <F8F7> <F8F7> <72AA> <F8F8> <F8F9> <77D8> <F8FA> <F8FA> <7939> <F8FB> <F8FB> <7C69> <F8FC> <F8FC> <7C6B> <F8FD> <F8FD> <7CF6> <F8FE> <F8FE> <7E9A> <F940> <F940> <7E98> <F941> <F941> <7E9B> <F942> <F942> <7E99> <F943> <F944> <81E0> <F945> <F947> <8646> <F948> <F949> <8979> <F94A> <F94A> <897C> <F94B> <F94B> <897B> <F94C> <F94C> <89FF> <F94D> <F94E> <8B98> endbfrange 97 beginbfrange <F94F> <F94F> <8EA5> <F950> <F950> <8EA4> <F951> <F951> <8EA3> <F952> <F952> <946E> <F953> <F953> <946D> <F954> <F954> <946F> <F955> <F955> <9471> <F956> <F956> <9473> <F957> <F957> <9749> <F958> <F958> <9872> <F959> <F959> <995F> <F95A> <F95A> <9C68> <F95B> <F95B> <9C6E> <F95C> <F95C> <9C6D> <F95D> <F95D> <9E0B> <F95E> <F95E> <9E0D> <F95F> <F95F> <9E10> <F960> <F960> <9E0F> <F961> <F961> <9E12> <F962> <F962> <9E11> <F963> <F963> <9EA1> <F964> <F964> <9EF5> <F965> <F965> <9F09> <F966> <F966> <9F47> <F967> <F967> <9F78> <F968> <F968> <9F7B> <F969> <F969> <9F7A> <F96A> <F96A> <9F79> <F96B> <F96B> <571E> <F96C> <F96C> <7066> <F96D> <F96D> <7C6F> <F96E> <F96E> <883C> <F96F> <F96F> <8DB2> <F970> <F970> <8EA6> <F971> <F971> <91C3> <F972> <F972> <9474> <F973> <F973> <9478> <F974> <F974> <9476> <F975> <F975> <9475> <F976> <F976> <9A60> <F977> <F977> <9C74> <F978> <F978> <9C73> <F979> <F979> <9C71> <F97A> <F97A> <9C75> <F97B> <F97B> <9E14> <F97C> <F97C> <9E13> <F97D> <F97D> <9EF6> <F97E> <F97E> <9F0A> <F9A1> <F9A1> <9FA4> <F9A2> <F9A2> <7068> <F9A3> <F9A3> <7065> <F9A4> <F9A4> <7CF7> <F9A5> <F9A5> <866A> <F9A6> <F9A6> <883E> <F9A7> <F9A7> <883D> <F9A8> <F9A8> <883F> <F9A9> <F9A9> <8B9E> <F9AA> <F9AA> <8C9C> <F9AB> <F9AB> <8EA9> <F9AC> <F9AC> <8EC9> <F9AD> <F9AD> <974B> <F9AE> <F9AF> <9873> <F9B0> <F9B0> <98CC> <F9B1> <F9B1> <9961> <F9B2> <F9B2> <99AB> <F9B3> <F9B3> <9A64> <F9B4> <F9B5> <9A66> <F9B6> <F9B6> <9B24> <F9B7> <F9B7> <9E15> <F9B8> <F9B8> <9E17> <F9B9> <F9B9> <9F48> <F9BA> <F9BA> <6207> <F9BB> <F9BB> <6B1E> <F9BC> <F9BC> <7227> <F9BD> <F9BD> <864C> <F9BE> <F9BE> <8EA8> <F9BF> <F9BF> <9482> <F9C0> <F9C1> <9480> <F9C2> <F9C2> <9A69> <F9C3> <F9C3> <9A68> <F9C4> <F9C4> <9B2E> <F9C5> <F9C5> <9E19> <F9C6> <F9C6> <7229> <F9C7> <F9C7> <864B> <F9C8> <F9C8> <8B9F> <F9C9> <F9C9> <9483> <F9CA> <F9CA> <9C79> <F9CB> <F9CB> <9EB7> <F9CC> <F9CC> <7675> <F9CD> <F9CD> <9A6B> <F9CE> <F9CE> <9C7A> <F9CF> <F9CF> <9E1D> <F9D0> <F9D1> <7069> <F9D2> <F9D2> <9EA4> <F9D3> <F9D3> <9F7E> <F9D4> <F9D4> <9F49> <F9D5> <F9D5> <9F98> endbfrange endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF \ No newline at end of file
diff --git a/src/main/resources/Resources/cmap/B5pc-V b/src/main/resources/Resources/cmap/B5pc-V
new file mode 100644
index 0000000..9bbef3e
--- /dev/null
+++ b/src/main/resources/Resources/cmap/B5pc-V
@@ -0,0 +1 @@
+%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%DocumentNeededResources: CMap (B5pc-H) %%IncludeResource: ProcSet (CIDInit) %%IncludeResource: CMap (B5pc-H) %%BeginResource: CMap (B5pc-V) %%Title: (B5pc-V Adobe CNS1 0) %%Version: 10.001 %%Copyright: ----------------------------------------------------------- %%Copyright: Copyright 1990-1999 Adobe Systems Incorporated. %%Copyright: All Rights Reserved. %%Copyright: %%Copyright: Patents Pending %%Copyright: %%Copyright: NOTICE: All information contained herein is the property %%Copyright: of Adobe Systems Incorporated. %%Copyright: %%Copyright: Permission is granted for redistribution of this file %%Copyright: provided this copyright notice is maintained intact and %%Copyright: that the contents of this file are not altered in any %%Copyright: way from its original form. %%Copyright: %%Copyright: PostScript and Display PostScript are trademarks of %%Copyright: Adobe Systems Incorporated which may be registered in %%Copyright: certain jurisdictions. %%Copyright: ----------------------------------------------------------- %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /B5pc-H usecmap /CIDSystemInfo 3 dict dup begin /Registry (Adobe) def /Ordering (CNS1) def /Supplement 0 def end def /CMapName /B5pc-V def /CMapVersion 10.001 def /CMapType 1 def /UIDOffset 900 def /XUID [1 10 25383] def /WMode 1 def 12 begincidrange <a14b> <a14b> 13646 <a15a> <a15a> 13743 <a15c> <a15c> 13745 <a15d> <a15e> 130 <a161> <a162> 134 <a165> <a166> 138 <a169> <a16a> 142 <a16d> <a16e> 146 <a171> <a172> 150 <a175> <a176> 154 <a179> <a17a> 158 <a1e3> <a1e3> 13647 endcidrange endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF \ No newline at end of file
diff --git a/src/main/resources/Resources/cmap/CNS-EUC-H b/src/main/resources/Resources/cmap/CNS-EUC-H
new file mode 100644
index 0000000..48ca416
--- /dev/null
+++ b/src/main/resources/Resources/cmap/CNS-EUC-H
@@ -0,0 +1 @@
+%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%IncludeResource: ProcSet (CIDInit) %%BeginResource: CMap (CNS-EUC-H) %%Title: (CNS-EUC-H Adobe CNS1 0) %%Version: 10.001 %%Copyright: ----------------------------------------------------------- %%Copyright: Copyright 1990-1999 Adobe Systems Incorporated. %%Copyright: All Rights Reserved. %%Copyright: %%Copyright: Patents Pending %%Copyright: %%Copyright: NOTICE: All information contained herein is the property %%Copyright: of Adobe Systems Incorporated. %%Copyright: %%Copyright: Permission is granted for redistribution of this file %%Copyright: provided this copyright notice is maintained intact and %%Copyright: that the contents of this file are not altered in any %%Copyright: way from its original form. %%Copyright: %%Copyright: PostScript and Display PostScript are trademarks of %%Copyright: Adobe Systems Incorporated which may be registered in %%Copyright: certain jurisdictions. %%Copyright: ----------------------------------------------------------- %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo 3 dict dup begin /Registry (Adobe) def /Ordering (CNS1) def /Supplement 0 def end def /CMapName /CNS-EUC-H def /CMapVersion 10.001 def /CMapType 1 def /UIDOffset 300 def /XUID [1 10 25388] def /WMode 0 def 5 begincodespacerange <00> <80> <8EA1A1A1> <8EA1FEFE> <8EA2A1A1> <8EA2FEFE> <8EA3A1A1> <8EA3FEFE> <A1A1> <FEFE> endcodespacerange 1 beginnotdefrange <00> <1f> 13648 endnotdefrange 100 begincidrange <20> <7e> 13648 <8ea1a1a1> <8ea1a1fe> 99 <8ea1a2a1> <8ea1a2fe> 193 <8ea1a3a1> <8ea1a3ce> 287 <8ea1a4a1> <8ea1a4fe> 333 <8ea1a5a1> <8ea1a5ec> 427 <8ea1a5ee> <8ea1a5f0> 503 <8ea1a6a1> <8ea1a6be> 506 <8ea1a7a1> <8ea1a7a1> 595 <8ea1a7a2> <8ea1a7a4> 536 <8ea1a7a5> <8ea1a7a5> 596 <8ea1a7a6> <8ea1a7a6> 539 <8ea1a7a7> <8ea1a7a7> 602 <8ea1a7a8> <8ea1a7a8> 540 <8ea1a7a9> <8ea1a7ac> 603 <8ea1a7ad> <8ea1a7af> 541 <8ea1a7b0> <8ea1a7b0> 607 <8ea1a7b1> <8ea1a7b1> 5998 <8ea1a7b2> <8ea1a7b2> 608 <8ea1a7b3> <8ea1a7b3> 610 <8ea1a7b4> <8ea1a7b4> 544 <8ea1a7b5> <8ea1a7b5> 611 <8ea1a7b6> <8ea1a7b6> 5999 <8ea1a7b7> <8ea1a7b7> 545 <8ea1a7b8> <8ea1a7b9> 612 <8ea1a7ba> <8ea1a7ba> 546 <8ea1a7bb> <8ea1a7bb> 6000 <8ea1a7bc> <8ea1a7bc> 547 <8ea1a7bd> <8ea1a7bd> 614 <8ea1a7be> <8ea1a7be> 633 <8ea1a7bf> <8ea1a7bf> 6005 <8ea1a7c0> <8ea1a7c1> 634 <8ea1a7c2> <8ea1a7c2> 548 <8ea1a7c3> <8ea1a7c6> 636 <8ea1a7c7> <8ea1a7c7> 549 <8ea1a7c8> <8ea1a7cb> 642 <8ea1a7cc> <8ea1a7cc> 6006 <8ea1a7cd> <8ea1a7cd> 646 <8ea1a7ce> <8ea1a7ce> 550 <8ea1a7cf> <8ea1a7d0> 648 <8ea1a7d1> <8ea1a7d2> 652 <8ea1a7d3> <8ea1a7d5> 551 <8ea1a7d6> <8ea1a7d8> 654 <8ea1a7d9> <8ea1a7da> 554 <8ea1a7db> <8ea1a7db> 6007 <8ea1a7dc> <8ea1a7df> 720 <8ea1a7e0> <8ea1a7e0> 725 <8ea1a7e1> <8ea1a7e1> 556 <8ea1a7e2> <8ea1a7e5> 726 <8ea1a7e6> <8ea1a7e6> 557 <8ea1a7e7> <8ea1a7ed> 730 <8ea1a7ee> <8ea1a7ee> 6026 <8ea1a7ef> <8ea1a7f2> 737 <8ea1a7f3> <8ea1a7f3> 6028 <8ea1a7f4> <8ea1a7f8> 741 <8ea1a7f9> <8ea1a7f9> 6029 <8ea1a7fa> <8ea1a7fd> 746 <8ea1a7fe> <8ea1a7fe> 854 <8ea1a8a1> <8ea1a8a6> 855 <8ea1a8a7> <8ea1a8a7> 862 <8ea1a8a8> <8ea1a8a8> 866 <8ea1a8a9> <8ea1a8aa> 558 <8ea1a8ab> <8ea1a8b2> 867 <8ea1a8b3> <8ea1a8b3> 6066 <8ea1a8b4> <8ea1a8b6> 875 <8ea1a8b7> <8ea1a8ba> 1014 <8ea1a8bb> <8ea1a8bb> 6162 <8ea1a8bc> <8ea1a8be> 1018 <8ea1a8bf> <8ea1a8c3> 1022 <8ea1a8c4> <8ea1a8cc> 1029 <8ea1a8cd> <8ea1a8cd> 6163 <8ea1a8ce> <8ea1a8ce> 6168 <8ea1a8cf> <8ea1a8d2> 1039 <8ea1a8d3> <8ea1a8d3> 6169 <8ea1a8d4> <8ea1a8d9> 1288 <8ea1a8da> <8ea1a8da> 6375 <8ea1a8db> <8ea1a8e2> 1294 <8ea1a8e3> <8ea1a8e3> 560 <8ea1a8e4> <8ea1a8e4> 1307 <8ea1a8e5> <8ea1a8e7> 1312 <8ea1a8e8> <8ea1a8eb> 1686 <8ea1a8ec> <8ea1a8ec> 561 <8ea1a8ed> <8ea1a8f0> 1695 <8ea1a8f1> <8ea1a8fb> 2086 <8ea1a8fc> <8ea1a8fe> 2549 <8ea1a9a1> <8ea1a9a1> 7731 <8ea1a9a2> <8ea1a9a2> 2552 <8ea1a9a3> <8ea1a9a3> 7732 <8ea1a9a4> <8ea1a9a5> 2553 <8ea1a9a6> <8ea1a9ab> 3041 <8ea1a9ac> <8ea1a9ae> 3515 <8ea1a9af> <8ea1a9af> 9056 <8ea1a9b0> <8ea1a9b0> 9746 <8ea1a9b1> <8ea1a9b3> 3963 <8ea1a9b4> <8ea1a9b5> 4352 <8ea1a9b6> <8ea1a9b6> 4745 <8ea1a9b7> <8ea1a9b8> 5042 <8ea1a9b9> <8ea1a9b9> 12045 <8ea1c2a1> <8ea1c2c1> 562 <8ea1c4a1> <8ea1c4fe> 595 endcidrange 100 begincidrange <8ea1c5a1> <8ea1c5fe> 689 <8ea1c6a1> <8ea1c6fe> 783 <8ea1c7a1> <8ea1c7fe> 877 <8ea1c8a1> <8ea1c8fe> 971 <8ea1c9a1> <8ea1c9fe> 1065 <8ea1caa1> <8ea1cafe> 1159 <8ea1cba1> <8ea1cbfe> 1253 <8ea1cca1> <8ea1ccfe> 1347 <8ea1cda1> <8ea1cdfe> 1441 <8ea1cea1> <8ea1cefe> 1535 <8ea1cfa1> <8ea1cffe> 1629 <8ea1d0a1> <8ea1d0fe> 1723 <8ea1d1a1> <8ea1d1fe> 1817 <8ea1d2a1> <8ea1d2fe> 1911 <8ea1d3a1> <8ea1d3fe> 2005 <8ea1d4a1> <8ea1d4fe> 2099 <8ea1d5a1> <8ea1d5fe> 2193 <8ea1d6a1> <8ea1d6fe> 2287 <8ea1d7a1> <8ea1d7fe> 2381 <8ea1d8a1> <8ea1d8fe> 2475 <8ea1d9a1> <8ea1d9fe> 2569 <8ea1daa1> <8ea1dafe> 2663 <8ea1dba1> <8ea1dbfe> 2757 <8ea1dca1> <8ea1dcfe> 2851 <8ea1dda1> <8ea1ddfe> 2945 <8ea1dea1> <8ea1defe> 3039 <8ea1dfa1> <8ea1dffe> 3133 <8ea1e0a1> <8ea1e0fe> 3227 <8ea1e1a1> <8ea1e1fe> 3321 <8ea1e2a1> <8ea1e2fe> 3415 <8ea1e3a1> <8ea1e3fe> 3509 <8ea1e4a1> <8ea1e4fe> 3603 <8ea1e5a1> <8ea1e5fe> 3697 <8ea1e6a1> <8ea1e6fe> 3791 <8ea1e7a1> <8ea1e7fe> 3885 <8ea1e8a1> <8ea1e8fe> 3979 <8ea1e9a1> <8ea1e9fe> 4073 <8ea1eaa1> <8ea1eafe> 4167 <8ea1eba1> <8ea1ebfe> 4261 <8ea1eca1> <8ea1ecfe> 4355 <8ea1eda1> <8ea1edfe> 4449 <8ea1eea1> <8ea1eefe> 4543 <8ea1efa1> <8ea1effe> 4637 <8ea1f0a1> <8ea1f0fe> 4731 <8ea1f1a1> <8ea1f1fe> 4825 <8ea1f2a1> <8ea1f2fe> 4919 <8ea1f3a1> <8ea1f3fe> 5013 <8ea1f4a1> <8ea1f4fe> 5107 <8ea1f5a1> <8ea1f5fe> 5201 <8ea1f6a1> <8ea1f6fe> 5295 <8ea1f7a1> <8ea1f7fe> 5389 <8ea1f8a1> <8ea1f8fe> 5483 <8ea1f9a1> <8ea1f9fe> 5577 <8ea1faa1> <8ea1fafe> 5671 <8ea1fba1> <8ea1fbfe> 5765 <8ea1fca1> <8ea1fcfe> 5859 <8ea1fda1> <8ea1fdcb> 5953 <8ea2a1a1> <8ea2a1fe> 5996 <8ea2a2a1> <8ea2a2fe> 6090 <8ea2a3a1> <8ea2a3fe> 6184 <8ea2a4a1> <8ea2a4fe> 6278 <8ea2a5a1> <8ea2a5fe> 6372 <8ea2a6a1> <8ea2a6fe> 6466 <8ea2a7a1> <8ea2a7fe> 6560 <8ea2a8a1> <8ea2a8fe> 6654 <8ea2a9a1> <8ea2a9fe> 6748 <8ea2aaa1> <8ea2aafe> 6842 <8ea2aba1> <8ea2abfe> 6936 <8ea2aca1> <8ea2acfe> 7030 <8ea2ada1> <8ea2adfe> 7124 <8ea2aea1> <8ea2aefe> 7218 <8ea2afa1> <8ea2affe> 7312 <8ea2b0a1> <8ea2b0fe> 7406 <8ea2b1a1> <8ea2b1fe> 7500 <8ea2b2a1> <8ea2b2fe> 7594 <8ea2b3a1> <8ea2b3fe> 7688 <8ea2b4a1> <8ea2b4fe> 7782 <8ea2b5a1> <8ea2b5fe> 7876 <8ea2b6a1> <8ea2b6fe> 7970 <8ea2b7a1> <8ea2b7fe> 8064 <8ea2b8a1> <8ea2b8fe> 8158 <8ea2b9a1> <8ea2b9fe> 8252 <8ea2baa1> <8ea2bafe> 8346 <8ea2bba1> <8ea2bbfe> 8440 <8ea2bca1> <8ea2bcfe> 8534 <8ea2bda1> <8ea2bdfe> 8628 <8ea2bea1> <8ea2befe> 8722 <8ea2bfa1> <8ea2bffe> 8816 <8ea2c0a1> <8ea2c0fe> 8910 <8ea2c1a1> <8ea2c1fe> 9004 <8ea2c2a1> <8ea2c2fe> 9098 <8ea2c3a1> <8ea2c3fe> 9192 <8ea2c4a1> <8ea2c4fe> 9286 <8ea2c5a1> <8ea2c5fe> 9380 <8ea2c6a1> <8ea2c6fe> 9474 <8ea2c7a1> <8ea2c7fe> 9568 <8ea2c8a1> <8ea2c8fe> 9662 <8ea2c9a1> <8ea2c9fe> 9756 <8ea2caa1> <8ea2cafe> 9850 <8ea2cba1> <8ea2cbfe> 9944 endcidrange 100 begincidrange <8ea2cca1> <8ea2ccfe> 10038 <8ea2cda1> <8ea2cdfe> 10132 <8ea2cea1> <8ea2cefe> 10226 <8ea2cfa1> <8ea2cffe> 10320 <8ea2d0a1> <8ea2d0fe> 10414 <8ea2d1a1> <8ea2d1fe> 10508 <8ea2d2a1> <8ea2d2fe> 10602 <8ea2d3a1> <8ea2d3fe> 10696 <8ea2d4a1> <8ea2d4fe> 10790 <8ea2d5a1> <8ea2d5fe> 10884 <8ea2d6a1> <8ea2d6fe> 10978 <8ea2d7a1> <8ea2d7fe> 11072 <8ea2d8a1> <8ea2d8fe> 11166 <8ea2d9a1> <8ea2d9fe> 11260 <8ea2daa1> <8ea2dafe> 11354 <8ea2dba1> <8ea2dbfe> 11448 <8ea2dca1> <8ea2dcfe> 11542 <8ea2dda1> <8ea2ddfe> 11636 <8ea2dea1> <8ea2defe> 11730 <8ea2dfa1> <8ea2dffe> 11824 <8ea2e0a1> <8ea2e0fe> 11918 <8ea2e1a1> <8ea2e1fe> 12012 <8ea2e2a1> <8ea2e2fe> 12106 <8ea2e3a1> <8ea2e3fe> 12200 <8ea2e4a1> <8ea2e4fe> 12294 <8ea2e5a1> <8ea2e5fe> 12388 <8ea2e6a1> <8ea2e6fe> 12482 <8ea2e7a1> <8ea2e7fe> 12576 <8ea2e8a1> <8ea2e8fe> 12670 <8ea2e9a1> <8ea2e9fe> 12764 <8ea2eaa1> <8ea2eafe> 12858 <8ea2eba1> <8ea2ebfe> 12952 <8ea2eca1> <8ea2ecfe> 13046 <8ea2eda1> <8ea2edfe> 13140 <8ea2eea1> <8ea2eefe> 13234 <8ea2efa1> <8ea2effe> 13328 <8ea2f0a1> <8ea2f0fe> 13422 <8ea2f1a1> <8ea2f1fe> 13516 <8ea2f2a1> <8ea2f2c4> 13610 <a1a1> <a1fe> 99 <a2a1> <a2fe> 193 <a3a1> <a3ce> 287 <a4a1> <a4fe> 333 <a5a1> <a5ec> 427 <a5ee> <a5f0> 503 <a6a1> <a6be> 506 <a7a1> <a7a1> 595 <a7a2> <a7a4> 536 <a7a5> <a7a5> 596 <a7a6> <a7a6> 539 <a7a7> <a7a7> 602 <a7a8> <a7a8> 540 <a7a9> <a7ac> 603 <a7ad> <a7af> 541 <a7b0> <a7b0> 607 <a7b1> <a7b1> 5998 <a7b2> <a7b2> 608 <a7b3> <a7b3> 610 <a7b4> <a7b4> 544 <a7b5> <a7b5> 611 <a7b6> <a7b6> 5999 <a7b7> <a7b7> 545 <a7b8> <a7b9> 612 <a7ba> <a7ba> 546 <a7bb> <a7bb> 6000 <a7bc> <a7bc> 547 <a7bd> <a7bd> 614 <a7be> <a7be> 633 <a7bf> <a7bf> 6005 <a7c0> <a7c1> 634 <a7c2> <a7c2> 548 <a7c3> <a7c6> 636 <a7c7> <a7c7> 549 <a7c8> <a7cb> 642 <a7cc> <a7cc> 6006 <a7cd> <a7cd> 646 <a7ce> <a7ce> 550 <a7cf> <a7d0> 648 <a7d1> <a7d2> 652 <a7d3> <a7d5> 551 <a7d6> <a7d8> 654 <a7d9> <a7da> 554 <a7db> <a7db> 6007 <a7dc> <a7df> 720 <a7e0> <a7e0> 725 <a7e1> <a7e1> 556 <a7e2> <a7e5> 726 <a7e6> <a7e6> 557 <a7e7> <a7ed> 730 <a7ee> <a7ee> 6026 <a7ef> <a7f2> 737 <a7f3> <a7f3> 6028 <a7f4> <a7f8> 741 <a7f9> <a7f9> 6029 <a7fa> <a7fd> 746 <a7fe> <a7fe> 854 <a8a1> <a8a6> 855 <a8a7> <a8a7> 862 <a8a8> <a8a8> 866 <a8a9> <a8aa> 558 endcidrange 95 begincidrange <a8ab> <a8b2> 867 <a8b3> <a8b3> 6066 <a8b4> <a8b6> 875 <a8b7> <a8ba> 1014 <a8bb> <a8bb> 6162 <a8bc> <a8be> 1018 <a8bf> <a8c3> 1022 <a8c4> <a8cc> 1029 <a8cd> <a8cd> 6163 <a8ce> <a8ce> 6168 <a8cf> <a8d2> 1039 <a8d3> <a8d3> 6169 <a8d4> <a8d9> 1288 <a8da> <a8da> 6375 <a8db> <a8e2> 1294 <a8e3> <a8e3> 560 <a8e4> <a8e4> 1307 <a8e5> <a8e7> 1312 <a8e8> <a8eb> 1686 <a8ec> <a8ec> 561 <a8ed> <a8f0> 1695 <a8f1> <a8fb> 2086 <a8fc> <a8fe> 2549 <a9a1> <a9a1> 7731 <a9a2> <a9a2> 2552 <a9a3> <a9a3> 7732 <a9a4> <a9a5> 2553 <a9a6> <a9ab> 3041 <a9ac> <a9ae> 3515 <a9af> <a9af> 9056 <a9b0> <a9b0> 9746 <a9b1> <a9b3> 3963 <a9b4> <a9b5> 4352 <a9b6> <a9b6> 4745 <a9b7> <a9b8> 5042 <a9b9> <a9b9> 12045 <c2a1> <c2c1> 562 <c4a1> <c4fe> 595 <c5a1> <c5fe> 689 <c6a1> <c6fe> 783 <c7a1> <c7fe> 877 <c8a1> <c8fe> 971 <c9a1> <c9fe> 1065 <caa1> <cafe> 1159 <cba1> <cbfe> 1253 <cca1> <ccfe> 1347 <cda1> <cdfe> 1441 <cea1> <cefe> 1535 <cfa1> <cffe> 1629 <d0a1> <d0fe> 1723 <d1a1> <d1fe> 1817 <d2a1> <d2fe> 1911 <d3a1> <d3fe> 2005 <d4a1> <d4fe> 2099 <d5a1> <d5fe> 2193 <d6a1> <d6fe> 2287 <d7a1> <d7fe> 2381 <d8a1> <d8fe> 2475 <d9a1> <d9fe> 2569 <daa1> <dafe> 2663 <dba1> <dbfe> 2757 <dca1> <dcfe> 2851 <dda1> <ddfe> 2945 <dea1> <defe> 3039 <dfa1> <dffe> 3133 <e0a1> <e0fe> 3227 <e1a1> <e1fe> 3321 <e2a1> <e2fe> 3415 <e3a1> <e3fe> 3509 <e4a1> <e4fe> 3603 <e5a1> <e5fe> 3697 <e6a1> <e6fe> 3791 <e7a1> <e7fe> 3885 <e8a1> <e8fe> 3979 <e9a1> <e9fe> 4073 <eaa1> <eafe> 4167 <eba1> <ebfe> 4261 <eca1> <ecfe> 4355 <eda1> <edfe> 4449 <eea1> <eefe> 4543 <efa1> <effe> 4637 <f0a1> <f0fe> 4731 <f1a1> <f1fe> 4825 <f2a1> <f2fe> 4919 <f3a1> <f3fe> 5013 <f4a1> <f4fe> 5107 <f5a1> <f5fe> 5201 <f6a1> <f6fe> 5295 <f7a1> <f7fe> 5389 <f8a1> <f8fe> 5483 <f9a1> <f9fe> 5577 <faa1> <fafe> 5671 <fba1> <fbfe> 5765 <fca1> <fcfe> 5859 <fda1> <fdcb> 5953 endcidrange endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF \ No newline at end of file
diff --git a/src/main/resources/Resources/cmap/CNS-EUC-V b/src/main/resources/Resources/cmap/CNS-EUC-V
new file mode 100644
index 0000000..ae667da
--- /dev/null
+++ b/src/main/resources/Resources/cmap/CNS-EUC-V
@@ -0,0 +1 @@
+%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%IncludeResource: ProcSet (CIDInit) %%BeginResource: CMap (CNS-EUC-V) %%Title: (CNS-EUC-V Adobe CNS1 0) %%Version: 10.001 %%Copyright: ----------------------------------------------------------- %%Copyright: Copyright 1990-1999 Adobe Systems Incorporated. %%Copyright: All Rights Reserved. %%Copyright: %%Copyright: Patents Pending %%Copyright: %%Copyright: NOTICE: All information contained herein is the property %%Copyright: of Adobe Systems Incorporated. %%Copyright: %%Copyright: Permission is granted for redistribution of this file %%Copyright: provided this copyright notice is maintained intact and %%Copyright: that the contents of this file are not altered in any %%Copyright: way from its original form. %%Copyright: %%Copyright: PostScript and Display PostScript are trademarks of %%Copyright: Adobe Systems Incorporated which may be registered in %%Copyright: certain jurisdictions. %%Copyright: ----------------------------------------------------------- %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo 3 dict dup begin /Registry (Adobe) def /Ordering (CNS1) def /Supplement 0 def end def /CMapName /CNS-EUC-V def /CMapVersion 10.001 def /CMapType 1 def /XUID [1 10 25389] def /WMode 1 def 5 begincodespacerange <00> <80> <8EA1A1A1> <8EA1FEFE> <8EA2A1A1> <8EA2FEFE> <8EA3A1A1> <8EA3FEFE> <A1A1> <FEFE> endcodespacerange 1 beginnotdefrange <00> <1f> 13648 endnotdefrange 100 begincidrange <20> <7e> 13648 <8ea1a1a1> <8ea1a1ab> 99 <8ea1a1ac> <8ea1a1ac> 13646 <8ea1a1ad> <8ea1a1ba> 111 <8ea1a1bb> <8ea1a1bb> 124 <8ea1a1bc> <8ea1a1bc> 126 <8ea1a1bd> <8ea1a1bd> 126 <8ea1a1be> <8ea1a1bf> 130 <8ea1a1c0> <8ea1a1c1> 130 <8ea1a1c2> <8ea1a1c3> 134 <8ea1a1c4> <8ea1a1c5> 134 <8ea1a1c6> <8ea1a1c7> 138 <8ea1a1c8> <8ea1a1c9> 138 <8ea1a1ca> <8ea1a1cb> 142 <8ea1a1cc> <8ea1a1cd> 142 <8ea1a1ce> <8ea1a1cf> 146 <8ea1a1d0> <8ea1a1d1> 146 <8ea1a1d2> <8ea1a1d3> 150 <8ea1a1d4> <8ea1a1d5> 150 <8ea1a1d6> <8ea1a1d7> 154 <8ea1a1d8> <8ea1a1d9> 154 <8ea1a1da> <8ea1a1db> 158 <8ea1a1dc> <8ea1a1fe> 158 <8ea1a2a1> <8ea1a2c3> 193 <8ea1a2c4> <8ea1a2c4> 13647 <8ea1a2c5> <8ea1a2fe> 229 <8ea1a3a1> <8ea1a3ce> 287 <8ea1a4a1> <8ea1a4fe> 333 <8ea1a5a1> <8ea1a5ec> 427 <8ea1a5ee> <8ea1a5f0> 503 <8ea1a6a1> <8ea1a6be> 506 <8ea1a7a1> <8ea1a7a1> 595 <8ea1a7a2> <8ea1a7a4> 536 <8ea1a7a5> <8ea1a7a5> 596 <8ea1a7a6> <8ea1a7a6> 539 <8ea1a7a7> <8ea1a7a7> 602 <8ea1a7a8> <8ea1a7a8> 540 <8ea1a7a9> <8ea1a7ac> 603 <8ea1a7ad> <8ea1a7af> 541 <8ea1a7b0> <8ea1a7b0> 607 <8ea1a7b1> <8ea1a7b1> 5998 <8ea1a7b2> <8ea1a7b2> 608 <8ea1a7b3> <8ea1a7b3> 610 <8ea1a7b4> <8ea1a7b4> 544 <8ea1a7b5> <8ea1a7b5> 611 <8ea1a7b6> <8ea1a7b6> 5999 <8ea1a7b7> <8ea1a7b7> 545 <8ea1a7b8> <8ea1a7b9> 612 <8ea1a7ba> <8ea1a7ba> 546 <8ea1a7bb> <8ea1a7bb> 6000 <8ea1a7bc> <8ea1a7bc> 547 <8ea1a7bd> <8ea1a7bd> 614 <8ea1a7be> <8ea1a7be> 633 <8ea1a7bf> <8ea1a7bf> 6005 <8ea1a7c0> <8ea1a7c1> 634 <8ea1a7c2> <8ea1a7c2> 548 <8ea1a7c3> <8ea1a7c6> 636 <8ea1a7c7> <8ea1a7c7> 549 <8ea1a7c8> <8ea1a7cb> 642 <8ea1a7cc> <8ea1a7cc> 6006 <8ea1a7cd> <8ea1a7cd> 646 <8ea1a7ce> <8ea1a7ce> 550 <8ea1a7cf> <8ea1a7d0> 648 <8ea1a7d1> <8ea1a7d2> 652 <8ea1a7d3> <8ea1a7d5> 551 <8ea1a7d6> <8ea1a7d8> 654 <8ea1a7d9> <8ea1a7da> 554 <8ea1a7db> <8ea1a7db> 6007 <8ea1a7dc> <8ea1a7df> 720 <8ea1a7e0> <8ea1a7e0> 725 <8ea1a7e1> <8ea1a7e1> 556 <8ea1a7e2> <8ea1a7e5> 726 <8ea1a7e6> <8ea1a7e6> 557 <8ea1a7e7> <8ea1a7ed> 730 <8ea1a7ee> <8ea1a7ee> 6026 <8ea1a7ef> <8ea1a7f2> 737 <8ea1a7f3> <8ea1a7f3> 6028 <8ea1a7f4> <8ea1a7f8> 741 <8ea1a7f9> <8ea1a7f9> 6029 <8ea1a7fa> <8ea1a7fd> 746 <8ea1a7fe> <8ea1a7fe> 854 <8ea1a8a1> <8ea1a8a6> 855 <8ea1a8a7> <8ea1a8a7> 862 <8ea1a8a8> <8ea1a8a8> 866 <8ea1a8a9> <8ea1a8aa> 558 <8ea1a8ab> <8ea1a8b2> 867 <8ea1a8b3> <8ea1a8b3> 6066 <8ea1a8b4> <8ea1a8b6> 875 <8ea1a8b7> <8ea1a8ba> 1014 <8ea1a8bb> <8ea1a8bb> 6162 <8ea1a8bc> <8ea1a8be> 1018 <8ea1a8bf> <8ea1a8c3> 1022 <8ea1a8c4> <8ea1a8cc> 1029 <8ea1a8cd> <8ea1a8cd> 6163 <8ea1a8ce> <8ea1a8ce> 6168 <8ea1a8cf> <8ea1a8d2> 1039 <8ea1a8d3> <8ea1a8d3> 6169 <8ea1a8d4> <8ea1a8d9> 1288 <8ea1a8da> <8ea1a8da> 6375 <8ea1a8db> <8ea1a8e2> 1294 endcidrange 100 begincidrange <8ea1a8e3> <8ea1a8e3> 560 <8ea1a8e4> <8ea1a8e4> 1307 <8ea1a8e5> <8ea1a8e7> 1312 <8ea1a8e8> <8ea1a8eb> 1686 <8ea1a8ec> <8ea1a8ec> 561 <8ea1a8ed> <8ea1a8f0> 1695 <8ea1a8f1> <8ea1a8fb> 2086 <8ea1a8fc> <8ea1a8fe> 2549 <8ea1a9a1> <8ea1a9a1> 7731 <8ea1a9a2> <8ea1a9a2> 2552 <8ea1a9a3> <8ea1a9a3> 7732 <8ea1a9a4> <8ea1a9a5> 2553 <8ea1a9a6> <8ea1a9ab> 3041 <8ea1a9ac> <8ea1a9ae> 3515 <8ea1a9af> <8ea1a9af> 9056 <8ea1a9b0> <8ea1a9b0> 9746 <8ea1a9b1> <8ea1a9b3> 3963 <8ea1a9b4> <8ea1a9b5> 4352 <8ea1a9b6> <8ea1a9b6> 4745 <8ea1a9b7> <8ea1a9b8> 5042 <8ea1a9b9> <8ea1a9b9> 12045 <8ea1c2a1> <8ea1c2c1> 562 <8ea1c4a1> <8ea1c4fe> 595 <8ea1c5a1> <8ea1c5fe> 689 <8ea1c6a1> <8ea1c6fe> 783 <8ea1c7a1> <8ea1c7fe> 877 <8ea1c8a1> <8ea1c8fe> 971 <8ea1c9a1> <8ea1c9fe> 1065 <8ea1caa1> <8ea1cafe> 1159 <8ea1cba1> <8ea1cbfe> 1253 <8ea1cca1> <8ea1ccfe> 1347 <8ea1cda1> <8ea1cdfe> 1441 <8ea1cea1> <8ea1cefe> 1535 <8ea1cfa1> <8ea1cffe> 1629 <8ea1d0a1> <8ea1d0fe> 1723 <8ea1d1a1> <8ea1d1fe> 1817 <8ea1d2a1> <8ea1d2fe> 1911 <8ea1d3a1> <8ea1d3fe> 2005 <8ea1d4a1> <8ea1d4fe> 2099 <8ea1d5a1> <8ea1d5fe> 2193 <8ea1d6a1> <8ea1d6fe> 2287 <8ea1d7a1> <8ea1d7fe> 2381 <8ea1d8a1> <8ea1d8fe> 2475 <8ea1d9a1> <8ea1d9fe> 2569 <8ea1daa1> <8ea1dafe> 2663 <8ea1dba1> <8ea1dbfe> 2757 <8ea1dca1> <8ea1dcfe> 2851 <8ea1dda1> <8ea1ddfe> 2945 <8ea1dea1> <8ea1defe> 3039 <8ea1dfa1> <8ea1dffe> 3133 <8ea1e0a1> <8ea1e0fe> 3227 <8ea1e1a1> <8ea1e1fe> 3321 <8ea1e2a1> <8ea1e2fe> 3415 <8ea1e3a1> <8ea1e3fe> 3509 <8ea1e4a1> <8ea1e4fe> 3603 <8ea1e5a1> <8ea1e5fe> 3697 <8ea1e6a1> <8ea1e6fe> 3791 <8ea1e7a1> <8ea1e7fe> 3885 <8ea1e8a1> <8ea1e8fe> 3979 <8ea1e9a1> <8ea1e9fe> 4073 <8ea1eaa1> <8ea1eafe> 4167 <8ea1eba1> <8ea1ebfe> 4261 <8ea1eca1> <8ea1ecfe> 4355 <8ea1eda1> <8ea1edfe> 4449 <8ea1eea1> <8ea1eefe> 4543 <8ea1efa1> <8ea1effe> 4637 <8ea1f0a1> <8ea1f0fe> 4731 <8ea1f1a1> <8ea1f1fe> 4825 <8ea1f2a1> <8ea1f2fe> 4919 <8ea1f3a1> <8ea1f3fe> 5013 <8ea1f4a1> <8ea1f4fe> 5107 <8ea1f5a1> <8ea1f5fe> 5201 <8ea1f6a1> <8ea1f6fe> 5295 <8ea1f7a1> <8ea1f7fe> 5389 <8ea1f8a1> <8ea1f8fe> 5483 <8ea1f9a1> <8ea1f9fe> 5577 <8ea1faa1> <8ea1fafe> 5671 <8ea1fba1> <8ea1fbfe> 5765 <8ea1fca1> <8ea1fcfe> 5859 <8ea1fda1> <8ea1fdcb> 5953 <8ea2a1a1> <8ea2a1fe> 5996 <8ea2a2a1> <8ea2a2fe> 6090 <8ea2a3a1> <8ea2a3fe> 6184 <8ea2a4a1> <8ea2a4fe> 6278 <8ea2a5a1> <8ea2a5fe> 6372 <8ea2a6a1> <8ea2a6fe> 6466 <8ea2a7a1> <8ea2a7fe> 6560 <8ea2a8a1> <8ea2a8fe> 6654 <8ea2a9a1> <8ea2a9fe> 6748 <8ea2aaa1> <8ea2aafe> 6842 <8ea2aba1> <8ea2abfe> 6936 <8ea2aca1> <8ea2acfe> 7030 <8ea2ada1> <8ea2adfe> 7124 <8ea2aea1> <8ea2aefe> 7218 <8ea2afa1> <8ea2affe> 7312 <8ea2b0a1> <8ea2b0fe> 7406 <8ea2b1a1> <8ea2b1fe> 7500 <8ea2b2a1> <8ea2b2fe> 7594 <8ea2b3a1> <8ea2b3fe> 7688 <8ea2b4a1> <8ea2b4fe> 7782 endcidrange 100 begincidrange <8ea2b5a1> <8ea2b5fe> 7876 <8ea2b6a1> <8ea2b6fe> 7970 <8ea2b7a1> <8ea2b7fe> 8064 <8ea2b8a1> <8ea2b8fe> 8158 <8ea2b9a1> <8ea2b9fe> 8252 <8ea2baa1> <8ea2bafe> 8346 <8ea2bba1> <8ea2bbfe> 8440 <8ea2bca1> <8ea2bcfe> 8534 <8ea2bda1> <8ea2bdfe> 8628 <8ea2bea1> <8ea2befe> 8722 <8ea2bfa1> <8ea2bffe> 8816 <8ea2c0a1> <8ea2c0fe> 8910 <8ea2c1a1> <8ea2c1fe> 9004 <8ea2c2a1> <8ea2c2fe> 9098 <8ea2c3a1> <8ea2c3fe> 9192 <8ea2c4a1> <8ea2c4fe> 9286 <8ea2c5a1> <8ea2c5fe> 9380 <8ea2c6a1> <8ea2c6fe> 9474 <8ea2c7a1> <8ea2c7fe> 9568 <8ea2c8a1> <8ea2c8fe> 9662 <8ea2c9a1> <8ea2c9fe> 9756 <8ea2caa1> <8ea2cafe> 9850 <8ea2cba1> <8ea2cbfe> 9944 <8ea2cca1> <8ea2ccfe> 10038 <8ea2cda1> <8ea2cdfe> 10132 <8ea2cea1> <8ea2cefe> 10226 <8ea2cfa1> <8ea2cffe> 10320 <8ea2d0a1> <8ea2d0fe> 10414 <8ea2d1a1> <8ea2d1fe> 10508 <8ea2d2a1> <8ea2d2fe> 10602 <8ea2d3a1> <8ea2d3fe> 10696 <8ea2d4a1> <8ea2d4fe> 10790 <8ea2d5a1> <8ea2d5fe> 10884 <8ea2d6a1> <8ea2d6fe> 10978 <8ea2d7a1> <8ea2d7fe> 11072 <8ea2d8a1> <8ea2d8fe> 11166 <8ea2d9a1> <8ea2d9fe> 11260 <8ea2daa1> <8ea2dafe> 11354 <8ea2dba1> <8ea2dbfe> 11448 <8ea2dca1> <8ea2dcfe> 11542 <8ea2dda1> <8ea2ddfe> 11636 <8ea2dea1> <8ea2defe> 11730 <8ea2dfa1> <8ea2dffe> 11824 <8ea2e0a1> <8ea2e0fe> 11918 <8ea2e1a1> <8ea2e1fe> 12012 <8ea2e2a1> <8ea2e2fe> 12106 <8ea2e3a1> <8ea2e3fe> 12200 <8ea2e4a1> <8ea2e4fe> 12294 <8ea2e5a1> <8ea2e5fe> 12388 <8ea2e6a1> <8ea2e6fe> 12482 <8ea2e7a1> <8ea2e7fe> 12576 <8ea2e8a1> <8ea2e8fe> 12670 <8ea2e9a1> <8ea2e9fe> 12764 <8ea2eaa1> <8ea2eafe> 12858 <8ea2eba1> <8ea2ebfe> 12952 <8ea2eca1> <8ea2ecfe> 13046 <8ea2eda1> <8ea2edfe> 13140 <8ea2eea1> <8ea2eefe> 13234 <8ea2efa1> <8ea2effe> 13328 <8ea2f0a1> <8ea2f0fe> 13422 <8ea2f1a1> <8ea2f1fe> 13516 <8ea2f2a1> <8ea2f2c4> 13610 <a1a1> <a1ab> 99 <a1ac> <a1ac> 13646 <a1ad> <a1ba> 111 <a1bb> <a1bb> 124 <a1bc> <a1bc> 126 <a1bd> <a1bd> 126 <a1be> <a1bf> 130 <a1c0> <a1c1> 130 <a1c2> <a1c3> 134 <a1c4> <a1c5> 134 <a1c6> <a1c7> 138 <a1c8> <a1c9> 138 <a1ca> <a1cb> 142 <a1cc> <a1cd> 142 <a1ce> <a1cf> 146 <a1d0> <a1d1> 146 <a1d2> <a1d3> 150 <a1d4> <a1d5> 150 <a1d6> <a1d7> 154 <a1d8> <a1d9> 154 <a1da> <a1db> 158 <a1dc> <a1fe> 158 <a2a1> <a2c3> 193 <a2c4> <a2c4> 13647 <a2c5> <a2fe> 229 <a3a1> <a3ce> 287 <a4a1> <a4fe> 333 <a5a1> <a5ec> 427 <a5ee> <a5f0> 503 <a6a1> <a6be> 506 <a7a1> <a7a1> 595 <a7a2> <a7a4> 536 <a7a5> <a7a5> 596 <a7a6> <a7a6> 539 <a7a7> <a7a7> 602 <a7a8> <a7a8> 540 <a7a9> <a7ac> 603 <a7ad> <a7af> 541 endcidrange 100 begincidrange <a7b0> <a7b0> 607 <a7b1> <a7b1> 5998 <a7b2> <a7b2> 608 <a7b3> <a7b3> 610 <a7b4> <a7b4> 544 <a7b5> <a7b5> 611 <a7b6> <a7b6> 5999 <a7b7> <a7b7> 545 <a7b8> <a7b9> 612 <a7ba> <a7ba> 546 <a7bb> <a7bb> 6000 <a7bc> <a7bc> 547 <a7bd> <a7bd> 614 <a7be> <a7be> 633 <a7bf> <a7bf> 6005 <a7c0> <a7c1> 634 <a7c2> <a7c2> 548 <a7c3> <a7c6> 636 <a7c7> <a7c7> 549 <a7c8> <a7cb> 642 <a7cc> <a7cc> 6006 <a7cd> <a7cd> 646 <a7ce> <a7ce> 550 <a7cf> <a7d0> 648 <a7d1> <a7d2> 652 <a7d3> <a7d5> 551 <a7d6> <a7d8> 654 <a7d9> <a7da> 554 <a7db> <a7db> 6007 <a7dc> <a7df> 720 <a7e0> <a7e0> 725 <a7e1> <a7e1> 556 <a7e2> <a7e5> 726 <a7e6> <a7e6> 557 <a7e7> <a7ed> 730 <a7ee> <a7ee> 6026 <a7ef> <a7f2> 737 <a7f3> <a7f3> 6028 <a7f4> <a7f8> 741 <a7f9> <a7f9> 6029 <a7fa> <a7fd> 746 <a7fe> <a7fe> 854 <a8a1> <a8a6> 855 <a8a7> <a8a7> 862 <a8a8> <a8a8> 866 <a8a9> <a8aa> 558 <a8ab> <a8b2> 867 <a8b3> <a8b3> 6066 <a8b4> <a8b6> 875 <a8b7> <a8ba> 1014 <a8bb> <a8bb> 6162 <a8bc> <a8be> 1018 <a8bf> <a8c3> 1022 <a8c4> <a8cc> 1029 <a8cd> <a8cd> 6163 <a8ce> <a8ce> 6168 <a8cf> <a8d2> 1039 <a8d3> <a8d3> 6169 <a8d4> <a8d9> 1288 <a8da> <a8da> 6375 <a8db> <a8e2> 1294 <a8e3> <a8e3> 560 <a8e4> <a8e4> 1307 <a8e5> <a8e7> 1312 <a8e8> <a8eb> 1686 <a8ec> <a8ec> 561 <a8ed> <a8f0> 1695 <a8f1> <a8fb> 2086 <a8fc> <a8fe> 2549 <a9a1> <a9a1> 7731 <a9a2> <a9a2> 2552 <a9a3> <a9a3> 7732 <a9a4> <a9a5> 2553 <a9a6> <a9ab> 3041 <a9ac> <a9ae> 3515 <a9af> <a9af> 9056 <a9b0> <a9b0> 9746 <a9b1> <a9b3> 3963 <a9b4> <a9b5> 4352 <a9b6> <a9b6> 4745 <a9b7> <a9b8> 5042 <a9b9> <a9b9> 12045 <c2a1> <c2c1> 562 <c4a1> <c4fe> 595 <c5a1> <c5fe> 689 <c6a1> <c6fe> 783 <c7a1> <c7fe> 877 <c8a1> <c8fe> 971 <c9a1> <c9fe> 1065 <caa1> <cafe> 1159 <cba1> <cbfe> 1253 <cca1> <ccfe> 1347 <cda1> <cdfe> 1441 <cea1> <cefe> 1535 <cfa1> <cffe> 1629 <d0a1> <d0fe> 1723 <d1a1> <d1fe> 1817 <d2a1> <d2fe> 1911 <d3a1> <d3fe> 2005 <d4a1> <d4fe> 2099 endcidrange 41 begincidrange <d5a1> <d5fe> 2193 <d6a1> <d6fe> 2287 <d7a1> <d7fe> 2381 <d8a1> <d8fe> 2475 <d9a1> <d9fe> 2569 <daa1> <dafe> 2663 <dba1> <dbfe> 2757 <dca1> <dcfe> 2851 <dda1> <ddfe> 2945 <dea1> <defe> 3039 <dfa1> <dffe> 3133 <e0a1> <e0fe> 3227 <e1a1> <e1fe> 3321 <e2a1> <e2fe> 3415 <e3a1> <e3fe> 3509 <e4a1> <e4fe> 3603 <e5a1> <e5fe> 3697 <e6a1> <e6fe> 3791 <e7a1> <e7fe> 3885 <e8a1> <e8fe> 3979 <e9a1> <e9fe> 4073 <eaa1> <eafe> 4167 <eba1> <ebfe> 4261 <eca1> <ecfe> 4355 <eda1> <edfe> 4449 <eea1> <eefe> 4543 <efa1> <effe> 4637 <f0a1> <f0fe> 4731 <f1a1> <f1fe> 4825 <f2a1> <f2fe> 4919 <f3a1> <f3fe> 5013 <f4a1> <f4fe> 5107 <f5a1> <f5fe> 5201 <f6a1> <f6fe> 5295 <f7a1> <f7fe> 5389 <f8a1> <f8fe> 5483 <f9a1> <f9fe> 5577 <faa1> <fafe> 5671 <fba1> <fbfe> 5765 <fca1> <fcfe> 5859 <fda1> <fdcb> 5953 endcidrange endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF \ No newline at end of file
diff --git a/src/main/resources/Resources/cmap/ETHK-B5-H b/src/main/resources/Resources/cmap/ETHK-B5-H
new file mode 100644
index 0000000..23c33d3
--- /dev/null
+++ b/src/main/resources/Resources/cmap/ETHK-B5-H
@@ -0,0 +1,1222 @@
+%!PS-Adobe-3.0 Resource-CMap
+%%DocumentNeededResources: ProcSet (CIDInit)
+%%IncludeResource: ProcSet (CIDInit)
+%%BeginResource: CMap (ETHK-B5-H)
+%%Title: (ETHK-B5-H Adobe CNS1 3)
+%%Version: 1.001
+%%Copyright: -----------------------------------------------------------
+%%Copyright: Copyright 1990-2000 Adobe Systems Incorporated.
+%%Copyright: All Rights Reserved.
+%%Copyright:
+%%Copyright: Patents Pending
+%%Copyright:
+%%Copyright: NOTICE: All information contained herein is the property
+%%Copyright: of Adobe Systems Incorporated.
+%%Copyright:
+%%Copyright: Permission is granted for redistribution of this file
+%%Copyright: provided this copyright notice is maintained intact and
+%%Copyright: that the contents of this file are not altered in any
+%%Copyright: way from its original form.
+%%Copyright:
+%%Copyright: PostScript and Display PostScript are trademarks of
+%%Copyright: Adobe Systems Incorporated which may be registered in
+%%Copyright: certain jurisdictions.
+%%Copyright: -----------------------------------------------------------
+%%EndComments
+
+/CIDInit /ProcSet findresource begin
+
+12 dict begin
+
+begincmap
+
+/CIDSystemInfo 3 dict dup begin
+ /Registry (Adobe) def
+ /Ordering (CNS1) def
+ /Supplement 3 def
+end def
+
+/CMapName /ETHK-B5-H def
+/CMapVersion 1.001 def
+/CMapType 1 def
+
+/XUID [1 10 25582] def
+
+/WMode 0 def
+
+2 begincodespacerange
+ <00> <80>
+ <8840> <FEFE>
+endcodespacerange
+
+1 beginnotdefrange
+<00> <1f> 1
+endnotdefrange
+
+100 begincidrange
+<20> <7e> 1
+<8840> <8855> 17609
+<8856> <887e> 18785
+<88a1> <88a8> 18826
+<88a9> <88aa> 18844
+<8940> <8941> 17716
+<8943> <8943> 17718
+<8946> <8949> 17719
+<894c> <894c> 17723
+<894d> <894d> 17347
+<894e> <8950> 17724
+<8951> <8951> 17306
+<8952> <897e> 17727
+<89a1> <89a5> 17772
+<89a6> <89a6> 17314
+<89ab> <89ab> 17388
+<89ac> <89ac> 17777
+<89ad> <89ad> 17387
+<89ae> <89ae> 17778
+<89b0> <89b2> 17779
+<89b5> <89bf> 17782
+<89c1> <89c3> 17793
+<89c5> <89ce> 17796
+<89cf> <89cf> 17340
+<89d0> <89d8> 17806
+<89d9> <89d9> 17308
+<89da> <89da> 17815
+<89db> <89db> 17310
+<89dc> <89dc> 17816
+<89dd> <89dd> 17311
+<89de> <89e0> 17817
+<89e1> <89e1> 17313
+<89e2> <89e2> 17820
+<89e3> <89e3> 17315
+<89e4> <89e9> 17821
+<89ea> <89eb> 17317
+<89ec> <89f9> 17827
+<89fa> <89fa> 17321
+<89fb> <89fe> 17841
+<8a40> <8a40> 17845
+<8a41> <8a41> 17161
+<8a43> <8a4c> 17163
+<8a4d> <8a4d> 17846
+<8a4e> <8a59> 17174
+<8a5a> <8a5a> 17847
+<8a5b> <8a5d> 17187
+<8a5e> <8a5e> 17848
+<8a5f> <8a62> 17191
+<8a64> <8a70> 17196
+<8a71> <8a71> 17849
+<8a72> <8a74> 17210
+<8a76> <8a76> 17214
+<8a77> <8a77> 17850
+<8a78> <8a79> 17216
+<8a7a> <8a7a> 17851
+<8a7b> <8a7b> 17219
+<8a7c> <8a7c> 17852
+<8a7d> <8a7d> 17221
+<8a7e> <8a7e> 17853
+<8aa1> <8aa7> 17223
+<8aa8> <8aa8> 17854
+<8aa9> <8aaa> 17231
+<8aac> <8ab0> 17234
+<8ab2> <8ab5> 17240
+<8ab6> <8ab6> 17855
+<8ab7> <8ab7> 17245
+<8ab8> <8ab8> 17856
+<8ab9> <8ab9> 17247
+<8abb> <8ac7> 17249
+<8ac9> <8acb> 17263
+<8acc> <8acc> 17857
+<8ace> <8ad5> 17268
+<8ad6> <8ad7> 17858
+<8ad8> <8adc> 17278
+<8adf> <8ae5> 17285
+<8ae6> <8ae6> 17860
+<8ae7> <8ae7> 17371
+<8ae8> <8af4> 17861
+<8af6> <8afe> 17874
+<8b40> <8b40> 17883
+<8b41> <8b42> 17292
+<8b43> <8b44> 17884
+<8b45> <8b45> 17294
+<8b46> <8b46> 17886
+<8b47> <8b47> 17295
+<8b48> <8b48> 17887
+<8b49> <8b49> 17296
+<8b4a> <8b4a> 17888
+<8b4b> <8b4b> 17297
+<8b4c> <8b4c> 17889
+<8b4d> <8b50> 17298
+<8b51> <8b53> 17890
+<8b55> <8b57> 17893
+<8b58> <8b58> 17303
+<8b59> <8b59> 17896
+<8b5a> <8b5a> 17304
+<8b5b> <8b5b> 17348
+<8b5c> <8b60> 17897
+<8b61> <8b61> 17319
+<8b62> <8b67> 17902
+endcidrange
+
+100 begincidrange
+<8b68> <8b68> 17324
+<8b69> <8b7e> 17908
+<8ba1> <8bbf> 17930
+<8bc0> <8bdc> 17631
+<8bde> <8bfd> 17660
+<8d60> <8d61> 17961
+<8d62> <8d62> 17338
+<8d63> <8d67> 17963
+<8d68> <8d68> 17339
+<8d69> <8d69> 17312
+<8d6a> <8d6a> 17341
+<8d6b> <8d6d> 17968
+<8d6e> <8d6e> 17342
+<8d6f> <8d75> 17971
+<8d76> <8d76> 17343
+<8d77> <8d79> 17978
+<8d7a> <8d7a> 17344
+<8d7b> <8d7b> 17981
+<8d7c> <8d7c> 17345
+<8d7d> <8d7e> 17982
+<8da1> <8da4> 17984
+<8da5> <8da5> 17346
+<8da6> <8da7> 17988
+<8da8> <8da8> 17337
+<8da9> <8da9> 17325
+<8daa> <8db5> 17990
+<8db6> <8db6> 17351
+<8db7> <8dc2> 18002
+<8dc3> <8dc3> 17352
+<8dc4> <8df9> 18014
+<8dfa> <8dfa> 17401
+<8dfb> <8dfe> 18068
+<8e40> <8e44> 14123
+<8e45> <8e45> 18072
+<8e46> <8e68> 14128
+<8e6a> <8e6a> 14164
+<8e6b> <8e6c> 18073
+<8e6d> <8e6e> 14166
+<8e70> <8e75> 14169
+<8e76> <8e76> 18075
+<8e77> <8e7a> 14175
+<8e7b> <8e7b> 18076
+<8e7c> <8e7d> 14180
+<8ea1> <8ea5> 14182
+<8ea6> <8ea6> 18077
+<8ea7> <8eaa> 14187
+<8eac> <8eb3> 14192
+<8eb5> <8eb7> 14201
+<8eb8> <8eb8> 18078
+<8eb9> <8ec8> 14205
+<8ec9> <8ec9> 18079
+<8eca> <8ecc> 14221
+<8ece> <8ecf> 14225
+<8ed1> <8ee4> 14228
+<8ee5> <8ee5> 18080
+<8ee6> <8eee> 14248
+<8eef> <8eef> 18081
+<8ef0> <8ef5> 14257
+<8ef6> <8ef6> 18082
+<8ef7> <8efe> 14264
+<8f40> <8f56> 14272
+<8f58> <8f58> 14296
+<8f59> <8f59> 18083
+<8f5a> <8f5e> 14297
+<8f5f> <8f5f> 18084
+<8f60> <8f66> 14302
+<8f67> <8f67> 18085
+<8f68> <8f68> 14309
+<8f6a> <8f6d> 14311
+<8f6f> <8f78> 14316
+<8f79> <8f79> 18086
+<8f7a> <8f7e> 14327
+<8fa1> <8faf> 14332
+<8fb0> <8fb0> 18087
+<8fb1> <8fc4> 14348
+<8fc5> <8fc5> 18088
+<8fc6> <8fc6> 14368
+<8fc7> <8fc7> 18089
+<8fc8> <8fc9> 14369
+<8fca> <8fca> 18090
+<8fcd> <8fd9> 14374
+<8fda> <8fda> 18091
+<8fdb> <8fe2> 14387
+<8fe3> <8fe3> 18092
+<8fe4> <8ffb> 14396
+<8ffc> <8ffc> 18093
+<8ffd> <8ffd> 14420
+<9040> <9054> 14422
+<9055> <9055> 18094
+<9056> <905b> 14444
+<905c> <905e> 18095
+<905f> <906c> 14451
+<906e> <906e> 14466
+<906f> <906f> 18098
+<9070> <9079> 14467
+<907b> <907e> 14477
+<90a1> <90a5> 14481
+<90a6> <90a6> 18099
+<90a7> <90b7> 14486
+<90b8> <90b8> 18100
+endcidrange
+
+100 begincidrange
+<90b9> <90db> 14503
+<90dd> <90f0> 14539
+<90f2> <90fe> 14560
+<9140> <9164> 14573
+<9165> <9165> 18101
+<9166> <916d> 14610
+<916e> <916e> 18102
+<916f> <917d> 14618
+<917e> <917e> 18103
+<91a1> <91a1> 14633
+<91a2> <91a2> 18104
+<91a3> <91be> 14634
+<91c0> <91c7> 14663
+<91c8> <91c8> 18105
+<91c9> <91fe> 14672
+<9240> <9243> 14726
+<9245> <9263> 14731
+<9264> <9264> 18106
+<9265> <926c> 14763
+<926d> <926d> 18107
+<926e> <927e> 14772
+<92a1> <92ae> 14789
+<92b3> <92c7> 14803
+<92c9> <92d0> 14825
+<92d2> <92e4> 14834
+<92e5> <92e5> 18108
+<92e6> <92f1> 14853
+<92f2> <92f2> 18109
+<92f3> <92fe> 14865
+<9340> <9367> 14877
+<9368> <9368> 18110
+<9369> <937e> 14917
+<93a1> <93a9> 14939
+<93aa> <93aa> 18111
+<93ab> <93c1> 14948
+<93c2> <93c2> 18112
+<93c3> <93e4> 14971
+<93e5> <93e5> 18113
+<93e6> <93e7> 15005
+<93e8> <93e8> 18114
+<93e9> <93ea> 15008
+<93eb> <93eb> 18115
+<93ec> <93fe> 15010
+<9440> <9445> 15029
+<9446> <9446> 18116
+<9448> <9478> 15036
+<9479> <9479> 18117
+<947a> <947e> 15086
+<94a1> <94c9> 15091
+<94cb> <94cb> 18118
+<94cc> <94fe> 15134
+<9540> <954c> 15185
+<954d> <954d> 18119
+<954e> <9559> 15198
+<955a> <955a> 18120
+<955b> <955e> 15210
+<955f> <955f> 18121
+<9560> <957e> 15215
+<95a1> <95c5> 15246
+<95c6> <95c6> 18122
+<95c7> <95d8> 15283
+<95da> <95fe> 15302
+<9640> <9643> 15339
+<9645> <9650> 15344
+<9651> <9651> 18123
+<9652> <9669> 15357
+<966a> <966a> 18124
+<966b> <967e> 15382
+<96a1> <96d3> 15402
+<96d4> <96d4> 18125
+<96d5> <96ec> 15453
+<96ee> <96fb> 15478
+<96fd> <96fe> 15493
+<9740> <977e> 15495
+<97a1> <97fe> 15558
+<9840> <9843> 15652
+<9844> <9845> 18126
+<9846> <986e> 15658
+<986f> <986f> 18128
+<9870> <9874> 15700
+<9875> <9876> 18129
+<9877> <9877> 15705
+<9878> <9879> 18131
+<987a> <987a> 15706
+<987b> <987e> 18133
+<98a1> <98a2> 18137
+<98a3> <98a3> 15707
+<98a4> <98ae> 18139
+<98af> <98af> 15708
+<98b0> <98b3> 18150
+<98b4> <98b4> 17354
+<98b5> <98b5> 18154
+<98b6> <98b6> 15709
+<98b7> <98b7> 18155
+<98b8> <98b8> 17356
+<98b9> <98b9> 15710
+<98ba> <98ba> 18156
+<98bb> <98bb> 17402
+<98bc> <98bc> 18157
+<98bd> <98be> 15711
+endcidrange
+
+100 begincidrange
+<98bf> <98c1> 18158
+<98c2> <98c2> 15713
+<98c3> <98c3> 18161
+<98c4> <98c4> 15714
+<98c5> <98c5> 18162
+<98c6> <98c7> 15715
+<98c8> <98d1> 18163
+<98d2> <98d2> 17357
+<98d3> <98d7> 18173
+<98d8> <98d9> 17358
+<98da> <98da> 18178
+<98db> <98db> 17361
+<98dc> <98de> 18179
+<98df> <98df> 17364
+<98e0> <98e2> 18182
+<98e3> <98e3> 15717
+<98e4> <98e6> 18185
+<98e7> <98e7> 15718
+<98e8> <98ec> 18188
+<98ed> <98ed> 15719
+<98ee> <98ef> 18193
+<98f0> <98f0> 15720
+<98f1> <98f1> 18195
+<98f2> <98f2> 15721
+<98f3> <98f3> 18196
+<98f4> <98f5> 17365
+<98f6> <98fb> 18197
+<98fc> <98fc> 15722
+<98fd> <98fd> 18203
+<98fe> <98fe> 17367
+<9940> <9941> 18204
+<9942> <9942> 17404
+<9943> <9943> 15723
+<9944> <9944> 18206
+<9945> <9945> 15724
+<9946> <9946> 18207
+<9947> <9947> 17368
+<9948> <994e> 18208
+<994f> <994f> 15725
+<9950> <9953> 18215
+<9954> <9954> 17369
+<9955> <995b> 18219
+<995c> <995c> 17370
+<995d> <9963> 18226
+<9964> <9964> 17372
+<9965> <9969> 18233
+<996a> <996a> 15726
+<996b> <996d> 18238
+<996e> <996e> 15727
+<996f> <9974> 18241
+<9975> <9975> 15728
+<9976> <9977> 18247
+<9978> <9978> 15729
+<9979> <997e> 18249
+<99a1> <99a1> 18255
+<99a2> <99a2> 15730
+<99a3> <99a3> 18256
+<99a4> <99a4> 17349
+<99a5> <99a5> 18257
+<99a6> <99a6> 17350
+<99a7> <99ad> 18258
+<99ae> <99ae> 15731
+<99af> <99b1> 18265
+<99b2> <99b2> 17374
+<99b3> <99b5> 18268
+<99b6> <99b6> 15732
+<99b7> <99b9> 18271
+<99ba> <99ba> 15733
+<99bb> <99c9> 18274
+<99ca> <99ca> 17376
+<99cb> <99cc> 18289
+<99cd> <99cd> 17378
+<99ce> <99d2> 18291
+<99d3> <99d3> 17379
+<99d4> <99d5> 18296
+<99d6> <99d6> 17381
+<99d7> <99de> 18298
+<99df> <99df> 17375
+<99e0> <99e1> 18306
+<99e2> <99e2> 15734
+<99e3> <99e3> 18308
+<99e4> <99e4> 17323
+<99e5> <99e5> 18309
+<99e6> <99e6> 17383
+<99e7> <99e7> 18310
+<99e8> <99e8> 17385
+<99e9> <99ee> 18311
+<99ef> <99ef> 17405
+<99f0> <99f3> 18317
+<99f4> <99f4> 15735
+<99f5> <99fe> 18321
+<9a40> <9a49> 18331
+<9a4a> <9a4a> 15736
+<9a4b> <9a4b> 18341
+<9a4c> <9a4c> 15737
+<9a4d> <9a58> 18342
+<9a59> <9a59> 15738
+<9a5a> <9a5e> 18354
+<9a5f> <9a5f> 17327
+<9a60> <9a60> 18359
+endcidrange
+
+100 begincidrange
+<9a61> <9a61> 15739
+<9a62> <9a65> 18360
+<9a66> <9a66> 17389
+<9a67> <9a67> 18364
+<9a68> <9a68> 15740
+<9a69> <9a69> 17390
+<9a6a> <9a6a> 18365
+<9a6b> <9a6b> 17407
+<9a6c> <9a72> 18366
+<9a73> <9a73> 15741
+<9a74> <9a74> 18373
+<9a75> <9a75> 17393
+<9a76> <9a7d> 18374
+<9a7e> <9a7e> 15742
+<9aa1> <9aa2> 18382
+<9aa3> <9aa3> 17395
+<9aa4> <9aa4> 18384
+<9aa5> <9aa5> 17394
+<9aa6> <9aa8> 18385
+<9aa9> <9aa9> 17400
+<9aaa> <9aaa> 17396
+<9aab> <9ab1> 18388
+<9ab2> <9ab2> 15743
+<9ab3> <9ab6> 18395
+<9ab7> <9ab7> 15744
+<9ab8> <9ab8> 18399
+<9ab9> <9ab9> 15745
+<9aba> <9aba> 18400
+<9abb> <9abb> 15746
+<9abc> <9abc> 18401
+<9abd> <9abd> 17335
+<9abe> <9ac6> 18402
+<9ac7> <9ac7> 15747
+<9ac8> <9acf> 18411
+<9ad0> <9ad0> 15748
+<9ad1> <9ad1> 18419
+<9ad2> <9ad2> 15749
+<9ad3> <9ad8> 18420
+<9ad9> <9adb> 15750
+<9adc> <9ae1> 18426
+<9ae2> <9ae2> 15753
+<9ae3> <9ae3> 18432
+<9ae4> <9ae4> 15754
+<9ae5> <9ae7> 18433
+<9ae8> <9ae8> 15755
+<9ae9> <9ae9> 17328
+<9aea> <9aed> 18436
+<9aee> <9aee> 17330
+<9aef> <9af1> 18440
+<9af2> <9af2> 15756
+<9af3> <9af5> 18443
+<9af6> <9af6> 15757
+<9af7> <9afa> 18446
+<9afb> <9afb> 15758
+<9afc> <9afe> 18450
+<9b40> <9b45> 18453
+<9b46> <9b46> 15759
+<9b47> <9b49> 18459
+<9b4a> <9b4a> 15760
+<9b4b> <9b53> 18462
+<9b54> <9b54> 15762
+<9b55> <9b57> 18471
+<9b58> <9b58> 15763
+<9b59> <9b59> 18474
+<9b5a> <9b5a> 15764
+<9b5b> <9b5b> 18475
+<9b5c> <9b5c> 15765
+<9b5d> <9b5d> 18476
+<9b5e> <9b5f> 15766
+<9b60> <9b60> 18477
+<9b62> <9b6f> 18478
+<9b70> <9b73> 15768
+<9b74> <9b75> 18492
+<9b77> <9b77> 15773
+<9b79> <9b7a> 18494
+<9b7c> <9b7c> 15776
+<9b7d> <9b7d> 18496
+<9b7e> <9b7e> 15777
+<9ba1> <9ba1> 15778
+<9ba2> <9ba2> 18497
+<9ba3> <9ba4> 15779
+<9ba5> <9ba6> 18498
+<9ba7> <9baa> 15781
+<9bab> <9bab> 18500
+<9bac> <9bac> 15785
+<9bad> <9bae> 18501
+<9baf> <9baf> 15786
+<9bb0> <9bb1> 18503
+<9bb2> <9bb9> 15787
+<9bba> <9bbd> 18505
+<9bbe> <9bbe> 15795
+<9bbf> <9bbf> 18509
+<9bc0> <9bc5> 15796
+<9bc7> <9bc9> 18510
+<9bca> <9bca> 15803
+<9bcb> <9bcb> 18513
+<9bcc> <9bcc> 15804
+<9bcd> <9bcd> 18514
+<9bce> <9bce> 17360
+<9bcf> <9bcf> 18515
+endcidrange
+
+100 begincidrange
+<9bd0> <9bd1> 15805
+<9bd2> <9bd2> 18516
+<9bd3> <9bd3> 15807
+<9bd4> <9bd4> 18517
+<9bd5> <9bd5> 15808
+<9bd6> <9bd7> 18518
+<9bd8> <9bda> 15809
+<9bdb> <9bdc> 18520
+<9bdd> <9bdd> 15812
+<9bdf> <9bdf> 15813
+<9be0> <9be0> 18522
+<9be1> <9be1> 15814
+<9be2> <9be2> 18523
+<9be3> <9be3> 15815
+<9be4> <9be6> 18524
+<9be7> <9be7> 15816
+<9be8> <9be8> 18527
+<9be9> <9beb> 15817
+<9bed> <9bed> 18528
+<9bee> <9bef> 15821
+<9bf0> <9bf2> 18529
+<9bf3> <9bf3> 15823
+<9bf4> <9bf5> 18532
+<9bf7> <9bf7> 18534
+<9bf8> <9bf9> 15825
+<9bfa> <9bfa> 18535
+<9bfb> <9bfc> 15827
+<9bfd> <9bfe> 18536
+<9c40> <9c41> 15829
+<9c43> <9c43> 18538
+<9c44> <9c46> 15832
+<9c47> <9c47> 18539
+<9c48> <9c48> 15835
+<9c49> <9c49> 18540
+<9c4a> <9c4a> 15836
+<9c4b> <9c4c> 18541
+<9c4d> <9c52> 15837
+<9c54> <9c54> 18543
+<9c55> <9c55> 15844
+<9c56> <9c56> 18544
+<9c57> <9c5b> 15845
+<9c5c> <9c5c> 18545
+<9c5d> <9c5d> 15850
+<9c5e> <9c5f> 18546
+<9c60> <9c60> 15851
+<9c61> <9c61> 18548
+<9c63> <9c63> 18549
+<9c64> <9c66> 15853
+<9c67> <9c67> 18550
+<9c69> <9c69> 18551
+<9c6a> <9c6a> 15857
+<9c6c> <9c6c> 18552
+<9c6d> <9c6d> 15858
+<9c6e> <9c6e> 18553
+<9c6f> <9c72> 15859
+<9c73> <9c74> 18554
+<9c75> <9c76> 15863
+<9c78> <9c78> 18556
+<9c79> <9c79> 15866
+<9c7a> <9c7a> 18557
+<9c7b> <9c7c> 15867
+<9c7d> <9c7d> 18558
+<9c7e> <9c7e> 15869
+<9ca1> <9ca2> 15870
+<9ca3> <9ca4> 18559
+<9ca5> <9ca5> 15872
+<9ca6> <9ca7> 18561
+<9ca8> <9ca9> 15873
+<9caa> <9caa> 18563
+<9cab> <9cab> 15875
+<9cac> <9cac> 18564
+<9cad> <9cae> 15876
+<9caf> <9cb0> 18565
+<9cb1> <9cba> 15878
+<9cbb> <9cbb> 18567
+<9cbe> <9cc2> 15890
+<9cc3> <9cc5> 18568
+<9cc6> <9ccd> 15895
+<9cce> <9cce> 18571
+<9ccf> <9ccf> 15903
+<9cd1> <9cd3> 15905
+<9cd4> <9cd7> 18572
+<9cd8> <9cda> 15908
+<9cdb> <9cdb> 18576
+<9cdc> <9ce5> 15911
+<9ce6> <9ce6> 18577
+<9ce7> <9ce9> 15921
+<9cea> <9cea> 18578
+<9ceb> <9cec> 15924
+<9ced> <9ced> 18579
+<9cee> <9cf9> 15926
+<9cfa> <9cfc> 18580
+<9cfd> <9cfd> 15938
+<9cfe> <9cfe> 18583
+<9d40> <9d40> 17384
+<9d41> <9d45> 18584
+<9d46> <9d46> 15939
+<9d47> <9d48> 18589
+<9d49> <9d49> 15940
+<9d4a> <9d4b> 18591
+endcidrange
+
+100 begincidrange
+<9d4c> <9d4d> 15942
+<9d4e> <9d4e> 18593
+<9d4f> <9d4f> 15944
+<9d50> <9d50> 18594
+<9d51> <9d51> 15945
+<9d52> <9d54> 18595
+<9d55> <9d55> 15946
+<9d56> <9d56> 18598
+<9d58> <9d59> 18599
+<9d5b> <9d60> 18601
+<9d61> <9d61> 17353
+<9d62> <9d62> 15948
+<9d63> <9d63> 18607
+<9d64> <9d64> 15949
+<9d65> <9d77> 18608
+<9d78> <9d78> 17397
+<9d79> <9d79> 15950
+<9d7a> <9d7d> 18627
+<9d7e> <9d7e> 15951
+<9da1> <9da4> 18631
+<9da5> <9da8> 15952
+<9da9> <9da9> 18635
+<9daa> <9daa> 15956
+<9dab> <9dab> 18636
+<9dac> <9dad> 15957
+<9dae> <9daf> 18637
+<9db0> <9db0> 15960
+<9db1> <9db2> 18639
+<9db3> <9db3> 15961
+<9db4> <9db4> 18641
+<9db5> <9db5> 15962
+<9db6> <9db6> 18642
+<9db7> <9db7> 15963
+<9db8> <9dbb> 18643
+<9dbc> <9dbd> 15964
+<9dbe> <9dbe> 18647
+<9dbf> <9dc0> 15966
+<9dc1> <9dc2> 18648
+<9dc3> <9dc3> 15968
+<9dc5> <9dc6> 18650
+<9dc7> <9dc8> 15970
+<9dc9> <9dc9> 18652
+<9dca> <9dca> 15972
+<9dcb> <9dcc> 18653
+<9dcd> <9dd1> 15973
+<9dd2> <9dd2> 18655
+<9dd3> <9dd5> 15978
+<9dd6> <9dd9> 18656
+<9dda> <9dfb> 15981
+<9dfc> <9dfc> 18660
+<9dfd> <9dfe> 16015
+<9e40> <9e42> 16017
+<9e43> <9e43> 18661
+<9e44> <9e5e> 16021
+<9e5f> <9e5f> 18662
+<9e60> <9e62> 16049
+<9e63> <9e63> 18663
+<9e64> <9e65> 16052
+<9e66> <9e67> 18664
+<9e68> <9e68> 16054
+<9e69> <9e69> 18666
+<9e6a> <9e6a> 16055
+<9e6b> <9e70> 18667
+<9e71> <9e71> 16056
+<9e72> <9e72> 18673
+<9e73> <9e73> 16057
+<9e74> <9e76> 18674
+<9e77> <9e78> 16058
+<9e79> <9e79> 18677
+<9e7a> <9e7a> 16060
+<9e7b> <9e7b> 18678
+<9e7c> <9e7c> 16061
+<9e7d> <9e7d> 18679
+<9e7e> <9e7e> 16062
+<9ea1> <9ea2> 16063
+<9ea3> <9ea3> 18680
+<9ea4> <9ea6> 16065
+<9ea7> <9ea8> 18681
+<9eaa> <9eaa> 16069
+<9eab> <9eab> 18683
+<9ead> <9ead> 16071
+<9eae> <9eae> 18684
+<9eaf> <9eb1> 16072
+<9eb2> <9eb3> 18685
+<9eb4> <9eb4> 16075
+<9eb5> <9eb5> 18687
+<9eb6> <9eb7> 16076
+<9eb8> <9eb8> 18688
+<9eb9> <9eb9> 16078
+<9eba> <9ebb> 18689
+<9ebc> <9ebc> 16079
+<9ebd> <9ebe> 18691
+<9ebf> <9ec0> 16080
+<9ec1> <9ec3> 18693
+<9ec5> <9ec5> 16083
+<9ec6> <9ec6> 18696
+<9ec7> <9eca> 16084
+<9ecb> <9ecc> 18697
+<9ecd> <9ecd> 16089
+<9ece> <9ecf> 18699
+endcidrange
+
+100 begincidrange
+<9ed0> <9ed1> 16090
+<9ed2> <9ed2> 18701
+<9ed3> <9ed3> 16092
+<9ed4> <9ed5> 18702
+<9ed6> <9ed7> 16093
+<9ed8> <9ed9> 18704
+<9eda> <9eee> 16095
+<9ef0> <9ef1> 16117
+<9ef2> <9ef2> 18706
+<9ef3> <9ef3> 16119
+<9ef5> <9ef5> 16121
+<9ef6> <9ef8> 18707
+<9ef9> <9efa> 16122
+<9efb> <9efb> 18710
+<9efc> <9efc> 16124
+<9efe> <9efe> 16126
+<9f40> <9f42> 16127
+<9f43> <9f43> 18711
+<9f44> <9f47> 16130
+<9f48> <9f48> 18712
+<9f49> <9f4a> 16134
+<9f4b> <9f4c> 18713
+<9f4d> <9f4d> 16136
+<9f4f> <9f5f> 16138
+<9f61> <9f65> 16156
+<9f67> <9f68> 18715
+<9f69> <9f6f> 16163
+<9f70> <9f70> 18717
+<9f71> <9f7e> 16170
+<9fa1> <9fac> 16184
+<9fae> <9fb0> 16197
+<9fb2> <9fb4> 16201
+<9fb5> <9fb5> 18718
+<9fb6> <9fba> 16204
+<9fbb> <9fbb> 18719
+<9fbc> <9fbe> 16209
+<9fbf> <9fbf> 18720
+<9fc1> <9fc1> 18721
+<9fc2> <9fc7> 16213
+<9fc9> <9fca> 16220
+<9fcc> <9fcc> 18722
+<9fcd> <9fd3> 16224
+<9fd4> <9fd4> 18723
+<9fd5> <9fd7> 16232
+<9fd9> <9fd9> 16236
+<9fdb> <9fe3> 16238
+<9fe4> <9fe4> 18724
+<9fe5> <9fe5> 16247
+<9fe7> <9fe9> 16249
+<9feb> <9fee> 16253
+<9ff0> <9ff8> 16258
+<9ff9> <9ff9> 18725
+<9ffa> <9ffe> 16267
+<a040> <a040> 18726
+<a041> <a046> 16272
+<a047> <a047> 18727
+<a048> <a053> 16278
+<a055> <a055> 18728
+<a056> <a056> 16291
+<a058> <a059> 16293
+<a05b> <a061> 16296
+<a064> <a06c> 16305
+<a06d> <a06d> 18729
+<a06e> <a071> 16314
+<a073> <a076> 16319
+<a078> <a07a> 16324
+<a07b> <a07b> 18730
+<a07c> <a07e> 16327
+<a0a1> <a0a1> 16330
+<a0a2> <a0a2> 18731
+<a0a3> <a0a4> 16331
+<a0a6> <a0a6> 16334
+<a0a7> <a0a7> 18732
+<a0a8> <a0ac> 16335
+<a0ae> <a0ae> 16341
+<a0b0> <a0c4> 16343
+<a0c5> <a0c5> 18733
+<a0c6> <a0cf> 16364
+<a0d0> <a0d0> 18734
+<a0d1> <a0d2> 16374
+<a0d4> <a0d4> 16377
+<a0d6> <a0de> 16379
+<a0e0> <a0e0> 16389
+<a0e2> <a0e2> 16391
+<a0e3> <a0e3> 18735
+<a0e5> <a0e6> 16393
+<a0e7> <a0ed> 18736
+<a0ee> <a0ee> 17332
+<a0ef> <a0f1> 18743
+<a0f2> <a0f2> 17336
+<a0f3> <a0fe> 18746
+<a140> <a158> 99
+<a159> <a15c> 13743
+<a15d> <a17e> 128
+<a1a1> <a1f5> 162
+<a1f6> <a1f6> 248
+<a1f7> <a1f7> 247
+<a1f8> <a1fe> 249
+<a240> <a27e> 256
+<a2a1> <a2fe> 319
+endcidrange
+
+100 begincidrange
+<a340> <a37e> 413
+<a3a1> <a3bb> 476
+<a3bd> <a3bf> 503
+<a440> <a47e> 595
+<a4a1> <a4fe> 658
+<a540> <a57e> 752
+<a5a1> <a5fe> 815
+<a640> <a67e> 909
+<a6a1> <a6fe> 972
+<a740> <a77e> 1066
+<a7a1> <a7fe> 1129
+<a840> <a87e> 1223
+<a8a1> <a8fe> 1286
+<a940> <a97e> 1380
+<a9a1> <a9fe> 1443
+<aa40> <aa7e> 1537
+<aaa1> <aafe> 1600
+<ab40> <ab7e> 1694
+<aba1> <abfe> 1757
+<ac40> <ac7e> 1851
+<aca1> <acfd> 1914
+<acfe> <acfe> 2431
+<ad40> <ad7e> 2007
+<ada1> <adfe> 2070
+<ae40> <ae7e> 2164
+<aea1> <aefe> 2227
+<af40> <af7e> 2321
+<afa1> <afcf> 2384
+<afd0> <affe> 2432
+<b040> <b07e> 2479
+<b0a1> <b0fe> 2542
+<b140> <b17e> 2636
+<b1a1> <b1fe> 2699
+<b240> <b27e> 2793
+<b2a1> <b2fe> 2856
+<b340> <b37e> 2950
+<b3a1> <b3fe> 3013
+<b440> <b47e> 3107
+<b4a1> <b4fe> 3170
+<b540> <b57e> 3264
+<b5a1> <b5fe> 3327
+<b640> <b67e> 3421
+<b6a1> <b6fe> 3484
+<b740> <b77e> 3578
+<b7a1> <b7fe> 3641
+<b840> <b87e> 3735
+<b8a1> <b8fe> 3798
+<b940> <b97e> 3892
+<b9a1> <b9fe> 3955
+<ba40> <ba7e> 4049
+<baa1> <bafe> 4112
+<bb40> <bb7e> 4206
+<bba1> <bbc7> 4269
+<bbc8> <bbfe> 4309
+<bc40> <bc7e> 4364
+<bca1> <bcfe> 4427
+<bd40> <bd7e> 4521
+<bda1> <bdfe> 4584
+<be40> <be51> 4678
+<be52> <be52> 4308
+<be53> <be7e> 4696
+<bea1> <befe> 4740
+<bf40> <bf7e> 4834
+<bfa1> <bffe> 4897
+<c040> <c07e> 4991
+<c0a1> <c0fe> 5054
+<c140> <c17e> 5148
+<c1a1> <c1aa> 5211
+<c1ab> <c1fe> 5222
+<c240> <c27e> 5306
+<c2a1> <c2ca> 5369
+<c2cb> <c2cb> 5221
+<c2cc> <c2fe> 5411
+<c340> <c360> 5462
+<c361> <c37e> 5496
+<c3a1> <c3b8> 5526
+<c3b9> <c3b9> 5551
+<c3ba> <c3ba> 5550
+<c3bb> <c3fe> 5552
+<c440> <c455> 5620
+<c456> <c456> 5495
+<c457> <c47e> 5642
+<c4a1> <c4fe> 5682
+<c540> <c57e> 5776
+<c5a1> <c5fe> 5839
+<c640> <c67e> 5933
+<c6a1> <c6be> 506
+<c6bf> <c6d7> 537
+<c6d8> <c6de> 13747
+<c6df> <c6df> 6036
+<c6e0> <c6fe> 13754
+<c740> <c77e> 13785
+<c7a1> <c7fe> 13848
+<c840> <c87e> 13942
+<c8a1> <c8d3> 14005
+<c8d4> <c8d6> 17606
+<c8d7> <c8df> 17692
+<c8e0> <c8e0> 732
+<c8e1> <c8e8> 17701
+<c8e9> <c8e9> 1289
+endcidrange
+
+100 begincidrange
+<c8ea> <c8f0> 17709
+<c8f1> <c8f1> 2550
+<c8f5> <c8fe> 18834
+<c940> <c949> 5996
+<c94a> <c94a> 628
+<c94b> <c96b> 6006
+<c96c> <c97e> 6040
+<c9a1> <c9bd> 6059
+<c9be> <c9be> 6039
+<c9bf> <c9ec> 6088
+<c9ed> <c9fe> 6135
+<ca40> <ca7e> 6153
+<caa1> <caf6> 6216
+<caf7> <caf7> 6134
+<caf8> <cafe> 6302
+<cb40> <cb7e> 6309
+<cba1> <cbfe> 6372
+<cc40> <cc7e> 6466
+<cca1> <ccfe> 6529
+<cd40> <cd7e> 6623
+<cda1> <cdfe> 6686
+<ce40> <ce7e> 6780
+<cea1> <cefe> 6843
+<cf40> <cf7e> 6937
+<cfa1> <cffe> 7000
+<d040> <d07e> 7094
+<d0a1> <d0fe> 7157
+<d140> <d17e> 7251
+<d1a1> <d1fe> 7314
+<d240> <d27e> 7408
+<d2a1> <d2fe> 7471
+<d340> <d37e> 7565
+<d3a1> <d3fe> 7628
+<d440> <d47e> 7722
+<d4a1> <d4fe> 7785
+<d540> <d57e> 7879
+<d5a1> <d5fe> 7942
+<d640> <d67e> 8036
+<d6a1> <d6cb> 8099
+<d6cc> <d6cc> 8788
+<d6cd> <d6fe> 8143
+<d740> <d779> 8193
+<d77a> <d77a> 8889
+<d77b> <d77e> 8251
+<d7a1> <d7fe> 8255
+<d840> <d87e> 8349
+<d8a1> <d8fe> 8412
+<d940> <d97e> 8506
+<d9a1> <d9fe> 8569
+<da40> <da7e> 8663
+<daa1> <dade> 8726
+<dadf> <dadf> 8142
+<dae0> <dafe> 8789
+<db40> <db7e> 8820
+<dba1> <dba6> 8883
+<dba7> <dbfe> 8890
+<dc40> <dc7e> 8978
+<dca1> <dcfe> 9041
+<dd40> <dd7e> 9135
+<dda1> <ddfb> 9198
+<ddfc> <ddfc> 9089
+<ddfd> <ddfe> 9289
+<de40> <de7e> 9291
+<dea1> <defe> 9354
+<df40> <df7e> 9448
+<dfa1> <dffe> 9511
+<e040> <e07e> 9605
+<e0a1> <e0fe> 9668
+<e140> <e17e> 9762
+<e1a1> <e1fe> 9825
+<e240> <e27e> 9919
+<e2a1> <e2fe> 9982
+<e340> <e37e> 10076
+<e3a1> <e3fe> 10139
+<e440> <e47e> 10233
+<e4a1> <e4fe> 10296
+<e540> <e57e> 10390
+<e5a1> <e5fe> 10453
+<e640> <e67e> 10547
+<e6a1> <e6fe> 10610
+<e740> <e77e> 10704
+<e7a1> <e7fe> 10767
+<e840> <e87e> 10861
+<e8a1> <e8a2> 10924
+<e8a3> <e8fe> 10927
+<e940> <e975> 11019
+<e976> <e97e> 11074
+<e9a1> <e9fe> 11083
+<ea40> <ea7e> 11177
+<eaa1> <eafe> 11240
+<eb40> <eb5a> 11334
+<eb5b> <eb7e> 11362
+<eba1> <ebf0> 11398
+<ebf1> <ebf1> 10926
+<ebf2> <ebfe> 11478
+<ec40> <ec7e> 11491
+<eca1> <ecdd> 11554
+<ecde> <ecde> 11073
+<ecdf> <ecfe> 11615
+<ed40> <ed7e> 11647
+endcidrange
+
+100 begincidrange
+<eda1> <eda9> 11710
+<edaa> <edfe> 11720
+<ee40> <ee7e> 11805
+<eea1> <eeea> 11868
+<eeeb> <eeeb> 12308
+<eeec> <eefe> 11942
+<ef40> <ef7e> 11961
+<efa1> <effe> 12024
+<f040> <f055> 12118
+<f056> <f056> 11719
+<f057> <f07e> 12140
+<f0a1> <f0ca> 12180
+<f0cb> <f0cb> 11361
+<f0cc> <f0fe> 12222
+<f140> <f162> 12273
+<f163> <f16a> 12309
+<f16b> <f16b> 12640
+<f16c> <f17e> 12317
+<f1a1> <f1fe> 12336
+<f240> <f267> 12430
+<f268> <f268> 12783
+<f269> <f27e> 12470
+<f2a1> <f2c2> 12492
+<f2c3> <f2fe> 12527
+<f340> <f374> 12587
+<f375> <f37e> 12641
+<f3a1> <f3fe> 12651
+<f440> <f465> 12745
+<f466> <f47e> 12784
+<f4a1> <f4b4> 12809
+<f4b5> <f4b5> 12526
+<f4b6> <f4fc> 12829
+<f4fd> <f4fe> 12901
+<f540> <f57e> 12903
+<f5a1> <f5fe> 12966
+<f640> <f662> 13060
+<f663> <f663> 12900
+<f664> <f67e> 13095
+<f6a1> <f6fe> 13122
+<f740> <f77e> 13216
+<f7a1> <f7fe> 13279
+<f840> <f87e> 13373
+<f8a1> <f8fe> 13436
+<f940> <f976> 13530
+<f977> <f97e> 13586
+<f9a1> <f9c3> 13594
+<f9c4> <f9c4> 13585
+<f9c5> <f9c5> 13629
+<f9c6> <f9c6> 13641
+<f9c7> <f9d1> 13630
+<f9d2> <f9d5> 13642
+<f9d6> <f9fe> 14056
+<fa40> <fa5e> 16395
+<fa60> <fa65> 16427
+<fa67> <fa7e> 16434
+<faa1> <faa8> 16458
+<faa9> <faaa> 18758
+<faab> <fabc> 16468
+<fabe> <fac4> 16487
+<fac6> <fad4> 16495
+<fad6> <fafe> 16511
+<fb40> <fb47> 16552
+<fb49> <fb52> 16561
+<fb53> <fb53> 18760
+<fb54> <fb6d> 16572
+<fb6e> <fb6e> 18761
+<fb6f> <fb7e> 16599
+<fba1> <fba2> 16615
+<fba3> <fba3> 18762
+<fba4> <fbb7> 16618
+<fbb9> <fbbe> 16639
+<fbbf> <fbbf> 18763
+<fbc0> <fbcc> 16645
+<fbcd> <fbcd> 18764
+<fbce> <fbf2> 16658
+<fbf4> <fbf8> 16696
+<fbfa> <fbfe> 16702
+<fc40> <fc49> 16707
+<fc4a> <fc4a> 18765
+<fc4b> <fc4e> 16717
+<fc50> <fc51> 16721
+<fc52> <fc52> 18766
+<fc53> <fc62> 16723
+<fc63> <fc63> 18767
+<fc64> <fc6b> 16739
+<fc6d> <fc6d> 18768
+<fc6e> <fc74> 16749
+<fc75> <fc75> 18769
+<fc76> <fc7e> 16756
+<fca1> <fcb8> 16765
+<fcba> <fcbb> 16789
+<fcbc> <fcbd> 18770
+<fcbe> <fccb> 16792
+<fccc> <fccc> 18772
+<fccd> <fce1> 16807
+<fce3> <fce3> 18773
+<fce4> <fced> 16829
+<fcee> <fcee> 18774
+<fcef> <fcf0> 16839
+<fcf2> <fcfe> 16842
+endcidrange
+
+25 begincidrange
+<fd40> <fd48> 16855
+<fd49> <fd49> 18775
+<fd4a> <fd69> 16864
+<fd6a> <fd6a> 18776
+<fd6b> <fd7e> 16897
+<fda1> <fdb6> 16917
+<fdb9> <fdba> 16941
+<fdbc> <fde2> 16944
+<fde3> <fde3> 18777
+<fde4> <fdf0> 16984
+<fdf2> <fdf2> 18778
+<fdf3> <fdfe> 16998
+<fe40> <fe51> 17010
+<fe53> <fe6c> 17029
+<fe6d> <fe6d> 18779
+<fe6e> <fe6e> 17055
+<fe70> <fe77> 17057
+<fe78> <fe78> 18780
+<fe79> <fe7e> 17065
+<fea1> <fea9> 17071
+<feab> <fedc> 17080
+<fede> <fedf> 18781
+<fee0> <feec> 17131
+<feed> <feee> 18783
+<feef> <fefe> 17144
+endcidrange
+endcmap
+CMapName currentdict /CMap defineresource pop
+end
+end
+
+%%EndResource
+%%EOF
diff --git a/src/main/resources/Resources/cmap/ETHK-B5-V b/src/main/resources/Resources/cmap/ETHK-B5-V
new file mode 100644
index 0000000..3920674
--- /dev/null
+++ b/src/main/resources/Resources/cmap/ETHK-B5-V
@@ -0,0 +1,72 @@
+%!PS-Adobe-3.0 Resource-CMap
+%%DocumentNeededResources: ProcSet (CIDInit)
+%%DocumentNeededResources: CMap (ETHK-B5-H)
+%%IncludeResource: ProcSet (CIDInit)
+%%IncludeResource: CMap (ETHK-B5-H)
+%%BeginResource: CMap (ETHK-B5-V)
+%%Title: (ETHK-B5-V Adobe CNS1 0)
+%%Version: 1.001
+%%Copyright: -----------------------------------------------------------
+%%Copyright: Copyright 1990-2000 Adobe Systems Incorporated.
+%%Copyright: All Rights Reserved.
+%%Copyright:
+%%Copyright: Patents Pending
+%%Copyright:
+%%Copyright: NOTICE: All information contained herein is the property
+%%Copyright: of Adobe Systems Incorporated.
+%%Copyright:
+%%Copyright: Permission is granted for redistribution of this file
+%%Copyright: provided this copyright notice is maintained intact and
+%%Copyright: that the contents of this file are not altered in any
+%%Copyright: way from its original form.
+%%Copyright:
+%%Copyright: PostScript and Display PostScript are trademarks of
+%%Copyright: Adobe Systems Incorporated which may be registered in
+%%Copyright: certain jurisdictions.
+%%Copyright: -----------------------------------------------------------
+%%EndComments
+
+/CIDInit /ProcSet findresource begin
+
+12 dict begin
+
+begincmap
+
+/ETHK-B5-H usecmap
+
+/CIDSystemInfo 3 dict dup begin
+ /Registry (Adobe) def
+ /Ordering (CNS1) def
+ /Supplement 0 def
+end def
+
+/CMapName /ETHK-B5-V def
+/CMapVersion 1.001 def
+/CMapType 1 def
+
+/XUID [1 10 25583] def
+
+/WMode 1 def
+
+13 begincidrange
+<a14b> <a14b> 13646
+<a15a> <a15a> 13743
+<a15c> <a15c> 13745
+<a15d> <a15e> 130
+<a161> <a162> 134
+<a165> <a166> 138
+<a169> <a16a> 142
+<a16d> <a16e> 146
+<a171> <a172> 150
+<a175> <a176> 154
+<a179> <a17a> 158
+<a1e3> <a1e3> 13647
+<c6e4> <c6e5> 14097
+endcidrange
+endcmap
+CMapName currentdict /CMap defineresource pop
+end
+end
+
+%%EndResource
+%%EOF
diff --git a/src/main/resources/Resources/cmap/ETen-B5-H b/src/main/resources/Resources/cmap/ETen-B5-H
new file mode 100644
index 0000000..f6f8bcc
--- /dev/null
+++ b/src/main/resources/Resources/cmap/ETen-B5-H
@@ -0,0 +1 @@
+%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%IncludeResource: ProcSet (CIDInit) %%BeginResource: CMap (ETen-B5-H) %%Title: (ETen-B5-H Adobe CNS1 0) %%Version: 10.001 %%Copyright: ----------------------------------------------------------- %%Copyright: Copyright 1990-1999 Adobe Systems Incorporated. %%Copyright: All Rights Reserved. %%Copyright: %%Copyright: Patents Pending %%Copyright: %%Copyright: NOTICE: All information contained herein is the property %%Copyright: of Adobe Systems Incorporated. %%Copyright: %%Copyright: Permission is granted for redistribution of this file %%Copyright: provided this copyright notice is maintained intact and %%Copyright: that the contents of this file are not altered in any %%Copyright: way from its original form. %%Copyright: %%Copyright: PostScript and Display PostScript are trademarks of %%Copyright: Adobe Systems Incorporated which may be registered in %%Copyright: certain jurisdictions. %%Copyright: ----------------------------------------------------------- %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo 3 dict dup begin /Registry (Adobe) def /Ordering (CNS1) def /Supplement 0 def end def /CMapName /ETen-B5-H def /CMapVersion 10.001 def /CMapType 1 def /UIDOffset 200 def /XUID [1 10 25390] def /WMode 0 def 2 begincodespacerange <00> <80> <A140> <FEFE> endcodespacerange 1 beginnotdefrange <00> <1f> 13648 endnotdefrange 100 begincidrange <20> <7e> 13648 <a140> <a158> 99 <a159> <a15c> 13743 <a15d> <a17e> 128 <a1a1> <a1f5> 162 <a1f6> <a1f6> 248 <a1f7> <a1f7> 247 <a1f8> <a1fe> 249 <a240> <a27e> 256 <a2a1> <a2fe> 319 <a340> <a37e> 413 <a3a1> <a3bb> 476 <a3bd> <a3bf> 503 <a440> <a47e> 595 <a4a1> <a4fe> 658 <a540> <a57e> 752 <a5a1> <a5fe> 815 <a640> <a67e> 909 <a6a1> <a6fe> 972 <a740> <a77e> 1066 <a7a1> <a7fe> 1129 <a840> <a87e> 1223 <a8a1> <a8fe> 1286 <a940> <a97e> 1380 <a9a1> <a9fe> 1443 <aa40> <aa7e> 1537 <aaa1> <aafe> 1600 <ab40> <ab7e> 1694 <aba1> <abfe> 1757 <ac40> <ac7e> 1851 <aca1> <acfd> 1914 <acfe> <acfe> 2431 <ad40> <ad7e> 2007 <ada1> <adfe> 2070 <ae40> <ae7e> 2164 <aea1> <aefe> 2227 <af40> <af7e> 2321 <afa1> <afcf> 2384 <afd0> <affe> 2432 <b040> <b07e> 2479 <b0a1> <b0fe> 2542 <b140> <b17e> 2636 <b1a1> <b1fe> 2699 <b240> <b27e> 2793 <b2a1> <b2fe> 2856 <b340> <b37e> 2950 <b3a1> <b3fe> 3013 <b440> <b47e> 3107 <b4a1> <b4fe> 3170 <b540> <b57e> 3264 <b5a1> <b5fe> 3327 <b640> <b67e> 3421 <b6a1> <b6fe> 3484 <b740> <b77e> 3578 <b7a1> <b7fe> 3641 <b840> <b87e> 3735 <b8a1> <b8fe> 3798 <b940> <b97e> 3892 <b9a1> <b9fe> 3955 <ba40> <ba7e> 4049 <baa1> <bafe> 4112 <bb40> <bb7e> 4206 <bba1> <bbc7> 4269 <bbc8> <bbfe> 4309 <bc40> <bc7e> 4364 <bca1> <bcfe> 4427 <bd40> <bd7e> 4521 <bda1> <bdfe> 4584 <be40> <be51> 4678 <be52> <be52> 4308 <be53> <be7e> 4696 <bea1> <befe> 4740 <bf40> <bf7e> 4834 <bfa1> <bffe> 4897 <c040> <c07e> 4991 <c0a1> <c0fe> 5054 <c140> <c17e> 5148 <c1a1> <c1aa> 5211 <c1ab> <c1fe> 5222 <c240> <c27e> 5306 <c2a1> <c2ca> 5369 <c2cb> <c2cb> 5221 <c2cc> <c2fe> 5411 <c340> <c360> 5462 <c361> <c37e> 5496 <c3a1> <c3b8> 5526 <c3b9> <c3b9> 5551 <c3ba> <c3ba> 5550 <c3bb> <c3fe> 5552 <c440> <c455> 5620 <c456> <c456> 5495 <c457> <c47e> 5642 <c4a1> <c4fe> 5682 <c540> <c57e> 5776 <c5a1> <c5fe> 5839 <c640> <c67e> 5933 <c6a1> <c6be> 506 <c6bf> <c6d7> 537 <c6d8> <c6de> 13747 <c6df> <c6df> 6036 endcidrange 100 begincidrange <c6e0> <c6fe> 13754 <c740> <c77e> 13785 <c7a1> <c7fe> 13848 <c840> <c87e> 13942 <c8a1> <c8d3> 14005 <c940> <c949> 5996 <c94a> <c94a> 628 <c94b> <c96b> 6006 <c96c> <c97e> 6040 <c9a1> <c9bd> 6059 <c9be> <c9be> 6039 <c9bf> <c9ec> 6088 <c9ed> <c9fe> 6135 <ca40> <ca7e> 6153 <caa1> <caf6> 6216 <caf7> <caf7> 6134 <caf8> <cafe> 6302 <cb40> <cb7e> 6309 <cba1> <cbfe> 6372 <cc40> <cc7e> 6466 <cca1> <ccfe> 6529 <cd40> <cd7e> 6623 <cda1> <cdfe> 6686 <ce40> <ce7e> 6780 <cea1> <cefe> 6843 <cf40> <cf7e> 6937 <cfa1> <cffe> 7000 <d040> <d07e> 7094 <d0a1> <d0fe> 7157 <d140> <d17e> 7251 <d1a1> <d1fe> 7314 <d240> <d27e> 7408 <d2a1> <d2fe> 7471 <d340> <d37e> 7565 <d3a1> <d3fe> 7628 <d440> <d47e> 7722 <d4a1> <d4fe> 7785 <d540> <d57e> 7879 <d5a1> <d5fe> 7942 <d640> <d67e> 8036 <d6a1> <d6cb> 8099 <d6cc> <d6cc> 8788 <d6cd> <d6fe> 8143 <d740> <d779> 8193 <d77a> <d77a> 8889 <d77b> <d77e> 8251 <d7a1> <d7fe> 8255 <d840> <d87e> 8349 <d8a1> <d8fe> 8412 <d940> <d97e> 8506 <d9a1> <d9fe> 8569 <da40> <da7e> 8663 <daa1> <dade> 8726 <dadf> <dadf> 8142 <dae0> <dafe> 8789 <db40> <db7e> 8820 <dba1> <dba6> 8883 <dba7> <dbfe> 8890 <dc40> <dc7e> 8978 <dca1> <dcfe> 9041 <dd40> <dd7e> 9135 <dda1> <ddfb> 9198 <ddfc> <ddfc> 9089 <ddfd> <ddfe> 9289 <de40> <de7e> 9291 <dea1> <defe> 9354 <df40> <df7e> 9448 <dfa1> <dffe> 9511 <e040> <e07e> 9605 <e0a1> <e0fe> 9668 <e140> <e17e> 9762 <e1a1> <e1fe> 9825 <e240> <e27e> 9919 <e2a1> <e2fe> 9982 <e340> <e37e> 10076 <e3a1> <e3fe> 10139 <e440> <e47e> 10233 <e4a1> <e4fe> 10296 <e540> <e57e> 10390 <e5a1> <e5fe> 10453 <e640> <e67e> 10547 <e6a1> <e6fe> 10610 <e740> <e77e> 10704 <e7a1> <e7fe> 10767 <e840> <e87e> 10861 <e8a1> <e8a2> 10924 <e8a3> <e8fe> 10927 <e940> <e975> 11019 <e976> <e97e> 11074 <e9a1> <e9fe> 11083 <ea40> <ea7e> 11177 <eaa1> <eafe> 11240 <eb40> <eb5a> 11334 <eb5b> <eb7e> 11362 <eba1> <ebf0> 11398 <ebf1> <ebf1> 10926 <ebf2> <ebfe> 11478 <ec40> <ec7e> 11491 <eca1> <ecdd> 11554 <ecde> <ecde> 11073 endcidrange 54 begincidrange <ecdf> <ecfe> 11615 <ed40> <ed7e> 11647 <eda1> <eda9> 11710 <edaa> <edfe> 11720 <ee40> <ee7e> 11805 <eea1> <eeea> 11868 <eeeb> <eeeb> 12308 <eeec> <eefe> 11942 <ef40> <ef7e> 11961 <efa1> <effe> 12024 <f040> <f055> 12118 <f056> <f056> 11719 <f057> <f07e> 12140 <f0a1> <f0ca> 12180 <f0cb> <f0cb> 11361 <f0cc> <f0fe> 12222 <f140> <f162> 12273 <f163> <f16a> 12309 <f16b> <f16b> 12640 <f16c> <f17e> 12317 <f1a1> <f1fe> 12336 <f240> <f267> 12430 <f268> <f268> 12783 <f269> <f27e> 12470 <f2a1> <f2c2> 12492 <f2c3> <f2fe> 12527 <f340> <f374> 12587 <f375> <f37e> 12641 <f3a1> <f3fe> 12651 <f440> <f465> 12745 <f466> <f47e> 12784 <f4a1> <f4b4> 12809 <f4b5> <f4b5> 12526 <f4b6> <f4fc> 12829 <f4fd> <f4fe> 12901 <f540> <f57e> 12903 <f5a1> <f5fe> 12966 <f640> <f662> 13060 <f663> <f663> 12900 <f664> <f67e> 13095 <f6a1> <f6fe> 13122 <f740> <f77e> 13216 <f7a1> <f7fe> 13279 <f840> <f87e> 13373 <f8a1> <f8fe> 13436 <f940> <f976> 13530 <f977> <f97e> 13586 <f9a1> <f9c3> 13594 <f9c4> <f9c4> 13585 <f9c5> <f9c5> 13629 <f9c6> <f9c6> 13641 <f9c7> <f9d1> 13630 <f9d2> <f9d5> 13642 <f9d6> <f9fe> 14056 endcidrange endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF \ No newline at end of file
diff --git a/src/main/resources/Resources/cmap/ETen-B5-UCS2 b/src/main/resources/Resources/cmap/ETen-B5-UCS2
new file mode 100644
index 0000000..03dbc24
--- /dev/null
+++ b/src/main/resources/Resources/cmap/ETen-B5-UCS2
@@ -0,0 +1 @@
+%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%IncludeResource: ProcSet (CIDInit) %%BeginResource: CMap (ETen-B5-UCS2) %%Title: (ETen-B5-UCS2) %%Version: 4.002 %%Copyright: ----------------------------------------------------------- %%Copyright: Copyright 1990-1999 Adobe Systems Incorporated. %%Copyright: All Rights Reserved. %%Copyright: %%Copyright: Patents Pending %%Copyright: %%Copyright: NOTICE: All information contained herein is the property %%Copyright: of Adobe Systems Incorporated. %%Copyright: %%Copyright: Permission is granted for redistribution of this file %%Copyright: provided this copyright notice is maintained intact and %%Copyright: that the contents of this file are not altered in any %%Copyright: way from its original form. %%Copyright: %%Copyright: PostScript and Display PostScript are trademarks of %%Copyright: Adobe Systems Incorporated which may be registered in %%Copyright: certain jurisdictions. %%Copyright: ----------------------------------------------------------- %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo 3 dict dup begin /Registry (Adobe) def /Ordering (ETen_B5_UCS2) def /Supplement 0 def end def /CMapName /ETen-B5-UCS2 def /CMapVersion 4.002 def /CMapType 1 def /WMode 0 def 3 begincodespacerange <00> <80> <A140> <FEFE> <FF> <FF> endcodespacerange 100 beginbfrange <00> <80> <0000> <FF> <FF> <F8F8> <8140> <817E> <EEB8> <81A1> <81FE> <EEF7> <8240> <827E> <EF55> <82A1> <82FE> <EF94> <8340> <837E> <EFF2> <83A1> <83FE> <F031> <8440> <847E> <F08F> <84A1> <84FE> <F0CE> <8540> <857E> <F12C> <85A1> <85FE> <F16B> <8640> <867E> <F1C9> <86A1> <86FE> <F208> <8740> <877E> <F266> <87A1> <87FE> <F2A5> <8840> <887E> <F303> <88A1> <88FE> <F342> <8940> <897E> <F3A0> <89A1> <89FE> <F3DF> <8A40> <8A7E> <F43D> <8AA1> <8AFE> <F47C> <8B40> <8B7E> <F4DA> <8BA1> <8BFE> <F519> <8C40> <8C7E> <F577> <8CA1> <8CFE> <F5B6> <8D40> <8D7E> <F614> <8DA1> <8DFE> <F653> <8E40> <8E7E> <E311> <8EA1> <8EFE> <E350> <8F40> <8F7E> <E3AE> <8FA1> <8FFE> <E3ED> <9040> <907E> <E44B> <90A1> <90FE> <E48A> <9140> <917E> <E4E8> <91A1> <91FE> <E527> <9240> <927E> <E585> <92A1> <92FE> <E5C4> <9340> <937E> <E622> <93A1> <93FE> <E661> <9440> <947E> <E6BF> <94A1> <94FE> <E6FE> <9540> <957E> <E75C> <95A1> <95FE> <E79B> <9640> <967E> <E7F9> <96A1> <96FE> <E838> <9740> <977E> <E896> <97A1> <97FE> <E8D5> <9840> <987E> <E933> <98A1> <98FE> <E972> <9940> <997E> <E9D0> <99A1> <99FE> <EA0F> <9A40> <9A7E> <EA6D> <9AA1> <9AFE> <EAAC> <9B40> <9B7E> <EB0A> <9BA1> <9BFE> <EB49> <9C40> <9C7E> <EBA7> <9CA1> <9CFE> <EBE6> <9D40> <9D7E> <EC44> <9DA1> <9DFE> <EC83> <9E40> <9E7E> <ECE1> <9EA1> <9EFE> <ED20> <9F40> <9F7E> <ED7E> <9FA1> <9FFE> <EDBD> <A040> <A07E> <EE1B> <A0A1> <A0FE> <EE5A> <A140> <A140> <3000> <A141> <A141> <FF0C> <A142> <A143> <3001> <A144> <A144> <FF0E> <A145> <A145> <2027> <A146> <A146> <FF1B> <A147> <A147> <FF1A> <A148> <A148> <FF1F> <A149> <A149> <FF01> <A14A> <A14A> <FE30> <A14B> <A14B> <2026> <A14C> <A14C> <2025> <A14D> <A14F> <FE50> <A150> <A150> <00B7> <A151> <A154> <FE54> <A155> <A155> <FF5C> <A156> <A156> <2013> <A157> <A157> <FE31> <A158> <A158> <2014> <A159> <A159> <FE33> <A15A> <A15A> <2574> <A15B> <A15B> <FE34> <A15C> <A15C> <FE4F> <A15D> <A15E> <FF08> <A15F> <A160> <FE35> <A161> <A161> <FF5B> <A162> <A162> <FF5D> <A163> <A164> <FE37> <A165> <A166> <3014> <A167> <A168> <FE39> <A169> <A16A> <3010> <A16B> <A16C> <FE3B> <A16D> <A16E> <300A> <A16F> <A170> <FE3D> endbfrange 100 beginbfrange <A171> <A172> <3008> <A173> <A174> <FE3F> <A175> <A176> <300C> <A177> <A178> <FE41> <A179> <A17A> <300E> <A17B> <A17C> <FE43> <A17D> <A17E> <FE59> <A1A1> <A1A4> <FE5B> <A1A5> <A1A6> <2018> <A1A7> <A1A8> <201C> <A1A9> <A1AA> <301D> <A1AB> <A1AB> <2035> <A1AC> <A1AC> <2032> <A1AD> <A1AD> <FF03> <A1AE> <A1AE> <FF06> <A1AF> <A1AF> <FF0A> <A1B0> <A1B0> <203B> <A1B1> <A1B1> <00A7> <A1B2> <A1B2> <3003> <A1B3> <A1B3> <25CB> <A1B4> <A1B4> <25CF> <A1B5> <A1B5> <25B3> <A1B6> <A1B6> <25B2> <A1B7> <A1B7> <25CE> <A1B8> <A1B8> <2606> <A1B9> <A1B9> <2605> <A1BA> <A1BA> <25C7> <A1BB> <A1BB> <25C6> <A1BC> <A1BC> <25A1> <A1BD> <A1BD> <25A0> <A1BE> <A1BE> <25BD> <A1BF> <A1BF> <25BC> <A1C0> <A1C0> <32A3> <A1C1> <A1C1> <2105> <A1C2> <A1C2> <00AF> <A1C3> <A1C3> <FFE3> <A1C4> <A1C4> <FF3F> <A1C5> <A1C5> <02CD> <A1C6> <A1C7> <FE49> <A1C8> <A1C9> <FE4D> <A1CA> <A1CB> <FE4B> <A1CC> <A1CE> <FE5F> <A1CF> <A1CF> <FF0B> <A1D0> <A1D0> <FF0D> <A1D1> <A1D1> <00D7> <A1D2> <A1D2> <00F7> <A1D3> <A1D3> <00B1> <A1D4> <A1D4> <221A> <A1D5> <A1D5> <FF1C> <A1D6> <A1D6> <FF1E> <A1D7> <A1D7> <FF1D> <A1D8> <A1D9> <2266> <A1DA> <A1DA> <2260> <A1DB> <A1DB> <221E> <A1DC> <A1DC> <2252> <A1DD> <A1DD> <2261> <A1DE> <A1E2> <FE62> <A1E3> <A1E3> <223C> <A1E4> <A1E5> <2229> <A1E6> <A1E6> <22A5> <A1E7> <A1E7> <2220> <A1E8> <A1E8> <221F> <A1E9> <A1E9> <22BF> <A1EA> <A1EA> <33D2> <A1EB> <A1EB> <33D1> <A1EC> <A1EC> <222B> <A1ED> <A1ED> <222E> <A1EE> <A1EE> <2235> <A1EF> <A1EF> <2234> <A1F0> <A1F0> <2640> <A1F1> <A1F1> <2642> <A1F2> <A1F2> <2295> <A1F3> <A1F3> <2299> <A1F4> <A1F4> <2191> <A1F5> <A1F5> <2193> <A1F6> <A1F6> <2190> <A1F7> <A1F7> <2192> <A1F8> <A1F9> <2196> <A1FA> <A1FA> <2199> <A1FB> <A1FB> <2198> <A1FC> <A1FC> <2225> <A1FD> <A1FD> <2223> <A1FE> <A1FE> <FF0F> <A240> <A240> <FF3C> <A241> <A241> <2215> <A242> <A242> <FE68> <A243> <A243> <FF04> <A244> <A244> <FFE5> <A245> <A245> <3012> <A246> <A247> <FFE0> <A248> <A248> <FF05> <A249> <A249> <FF20> <A24A> <A24A> <2103> <A24B> <A24B> <2109> <A24C> <A24E> <FE69> <A24F> <A24F> <33D5> <A250> <A252> <339C> <A253> <A253> <33CE> <A254> <A254> <33A1> <A255> <A256> <338E> endbfrange 100 beginbfrange <A257> <A257> <33C4> <A258> <A258> <00B0> <A259> <A259> <5159> <A25A> <A25A> <515B> <A25B> <A25B> <515E> <A25C> <A25C> <515D> <A25D> <A25D> <5161> <A25E> <A25E> <5163> <A25F> <A25F> <55E7> <A260> <A260> <74E9> <A261> <A261> <7CCE> <A262> <A269> <2581> <A26A> <A26A> <258F> <A26B> <A26B> <258E> <A26C> <A26C> <258D> <A26D> <A26D> <258C> <A26E> <A26E> <258B> <A26F> <A26F> <258A> <A270> <A270> <2589> <A271> <A271> <253C> <A272> <A272> <2534> <A273> <A273> <252C> <A274> <A274> <2524> <A275> <A275> <251C> <A276> <A276> <2594> <A277> <A277> <2500> <A278> <A278> <2502> <A279> <A279> <2595> <A27A> <A27A> <250C> <A27B> <A27B> <2510> <A27C> <A27C> <2514> <A27D> <A27D> <2518> <A27E> <A27E> <256D> <A2A1> <A2A1> <256E> <A2A2> <A2A2> <2570> <A2A3> <A2A3> <256F> <A2A4> <A2A4> <2550> <A2A5> <A2A5> <255E> <A2A6> <A2A6> <256A> <A2A7> <A2A7> <2561> <A2A8> <A2A9> <25E2> <A2AA> <A2AA> <25E5> <A2AB> <A2AB> <25E4> <A2AC> <A2AE> <2571> <A2AF> <A2B8> <FF10> <A2B9> <A2C2> <2160> <A2C3> <A2CB> <3021> <A2CC> <A2CC> <5341> <A2CD> <A2CE> <5344> <A2CF> <A2E8> <FF21> <A2E9> <A2FE> <FF41> <A340> <A343> <FF57> <A344> <A354> <0391> <A355> <A35B> <03A3> <A35C> <A36C> <03B1> <A36D> <A373> <03C3> <A374> <A37E> <3105> <A3A1> <A3BA> <3110> <A3BB> <A3BB> <02D9> <A3BC> <A3BD> <02C9> <A3BE> <A3BE> <02C7> <A3BF> <A3BF> <02CB> <A440> <A440> <4E00> <A441> <A441> <4E59> <A442> <A442> <4E01> <A443> <A443> <4E03> <A444> <A444> <4E43> <A445> <A445> <4E5D> <A446> <A446> <4E86> <A447> <A447> <4E8C> <A448> <A448> <4EBA> <A449> <A449> <513F> <A44A> <A44A> <5165> <A44B> <A44B> <516B> <A44C> <A44C> <51E0> <A44D> <A44E> <5200> <A44F> <A44F> <529B> <A450> <A450> <5315> <A451> <A451> <5341> <A452> <A452> <535C> <A453> <A453> <53C8> <A454> <A454> <4E09> <A455> <A455> <4E0B> <A456> <A456> <4E08> <A457> <A457> <4E0A> <A458> <A458> <4E2B> <A459> <A459> <4E38> <A45A> <A45A> <51E1> <A45B> <A45B> <4E45> <A45C> <A45C> <4E48> <A45D> <A45D> <4E5F> <A45E> <A45E> <4E5E> <A45F> <A45F> <4E8E> <A460> <A460> <4EA1> <A461> <A461> <5140> <A462> <A462> <5203> <A463> <A463> <52FA> <A464> <A464> <5343> <A465> <A465> <53C9> <A466> <A466> <53E3> endbfrange 100 beginbfrange <A467> <A467> <571F> <A468> <A468> <58EB> <A469> <A469> <5915> <A46A> <A46A> <5927> <A46B> <A46B> <5973> <A46C> <A46D> <5B50> <A46E> <A46E> <5B53> <A46F> <A46F> <5BF8> <A470> <A470> <5C0F> <A471> <A471> <5C22> <A472> <A472> <5C38> <A473> <A473> <5C71> <A474> <A474> <5DDD> <A475> <A475> <5DE5> <A476> <A478> <5DF1> <A479> <A479> <5DFE> <A47A> <A47A> <5E72> <A47B> <A47B> <5EFE> <A47C> <A47C> <5F0B> <A47D> <A47D> <5F13> <A47E> <A47E> <624D> <A4A1> <A4A1> <4E11> <A4A2> <A4A2> <4E10> <A4A3> <A4A3> <4E0D> <A4A4> <A4A4> <4E2D> <A4A5> <A4A5> <4E30> <A4A6> <A4A6> <4E39> <A4A7> <A4A7> <4E4B> <A4A8> <A4A8> <5C39> <A4A9> <A4A9> <4E88> <A4AA> <A4AA> <4E91> <A4AB> <A4AB> <4E95> <A4AC> <A4AC> <4E92> <A4AD> <A4AD> <4E94> <A4AE> <A4AE> <4EA2> <A4AF> <A4AF> <4EC1> <A4B0> <A4B0> <4EC0> <A4B1> <A4B1> <4EC3> <A4B2> <A4B3> <4EC6> <A4B4> <A4B4> <4ECD> <A4B5> <A4B6> <4ECA> <A4B7> <A4B7> <4EC4> <A4B8> <A4B8> <5143> <A4B9> <A4B9> <5141> <A4BA> <A4BA> <5167> <A4BB> <A4BC> <516D> <A4BD> <A4BD> <516C> <A4BE> <A4BE> <5197> <A4BF> <A4BF> <51F6> <A4C0> <A4C2> <5206> <A4C3> <A4C3> <52FB> <A4C4> <A4C5> <52FE> <A4C6> <A4C6> <5316> <A4C7> <A4C7> <5339> <A4C8> <A4C8> <5348> <A4C9> <A4C9> <5347> <A4CA> <A4CA> <5345> <A4CB> <A4CB> <535E> <A4CC> <A4CC> <5384> <A4CD> <A4CD> <53CB> <A4CE> <A4CE> <53CA> <A4CF> <A4CF> <53CD> <A4D0> <A4D0> <58EC> <A4D1> <A4D1> <5929> <A4D2> <A4D2> <592B> <A4D3> <A4D3> <592A> <A4D4> <A4D4> <592D> <A4D5> <A4D5> <5B54> <A4D6> <A4D6> <5C11> <A4D7> <A4D7> <5C24> <A4D8> <A4D8> <5C3A> <A4D9> <A4D9> <5C6F> <A4DA> <A4DA> <5DF4> <A4DB> <A4DB> <5E7B> <A4DC> <A4DC> <5EFF> <A4DD> <A4DE> <5F14> <A4DF> <A4DF> <5FC3> <A4E0> <A4E0> <6208> <A4E1> <A4E1> <6236> <A4E2> <A4E2> <624B> <A4E3> <A4E3> <624E> <A4E4> <A4E4> <652F> <A4E5> <A4E5> <6587> <A4E6> <A4E6> <6597> <A4E7> <A4E7> <65A4> <A4E8> <A4E8> <65B9> <A4E9> <A4E9> <65E5> <A4EA> <A4EA> <66F0> <A4EB> <A4EB> <6708> <A4EC> <A4EC> <6728> <A4ED> <A4ED> <6B20> <A4EE> <A4EE> <6B62> <A4EF> <A4EF> <6B79> <A4F0> <A4F0> <6BCB> <A4F1> <A4F1> <6BD4> <A4F2> <A4F2> <6BDB> <A4F3> <A4F3> <6C0F> <A4F4> <A4F4> <6C34> <A4F5> <A4F5> <706B> <A4F6> <A4F6> <722A> endbfrange 100 beginbfrange <A4F7> <A4F7> <7236> <A4F8> <A4F8> <723B> <A4F9> <A4F9> <7247> <A4FA> <A4FA> <7259> <A4FB> <A4FB> <725B> <A4FC> <A4FC> <72AC> <A4FD> <A4FD> <738B> <A4FE> <A4FE> <4E19> <A540> <A540> <4E16> <A541> <A541> <4E15> <A542> <A542> <4E14> <A543> <A543> <4E18> <A544> <A544> <4E3B> <A545> <A545> <4E4D> <A546> <A546> <4E4F> <A547> <A547> <4E4E> <A548> <A548> <4EE5> <A549> <A549> <4ED8> <A54A> <A54D> <4ED4> <A54E> <A54F> <4EE3> <A550> <A550> <4ED9> <A551> <A551> <4EDE> <A552> <A552> <5145> <A553> <A553> <5144> <A554> <A555> <5189> <A556> <A556> <51AC> <A557> <A558> <51F9> <A559> <A559> <51F8> <A55A> <A55A> <520A> <A55B> <A55B> <52A0> <A55C> <A55C> <529F> <A55D> <A55E> <5305> <A55F> <A55F> <5317> <A560> <A560> <531D> <A561> <A561> <4EDF> <A562> <A562> <534A> <A563> <A563> <5349> <A564> <A564> <5361> <A565> <A565> <5360> <A566> <A566> <536F> <A567> <A567> <536E> <A568> <A568> <53BB> <A569> <A569> <53EF> <A56A> <A56A> <53E4> <A56B> <A56B> <53F3> <A56C> <A56C> <53EC> <A56D> <A56D> <53EE> <A56E> <A56E> <53E9> <A56F> <A56F> <53E8> <A570> <A570> <53FC> <A571> <A571> <53F8> <A572> <A572> <53F5> <A573> <A573> <53EB> <A574> <A574> <53E6> <A575> <A575> <53EA> <A576> <A576> <53F2> <A577> <A577> <53F1> <A578> <A578> <53F0> <A579> <A579> <53E5> <A57A> <A57A> <53ED> <A57B> <A57B> <53FB> <A57C> <A57C> <56DB> <A57D> <A57D> <56DA> <A57E> <A57E> <5916> <A5A1> <A5A1> <592E> <A5A2> <A5A2> <5931> <A5A3> <A5A3> <5974> <A5A4> <A5A4> <5976> <A5A5> <A5A5> <5B55> <A5A6> <A5A6> <5B83> <A5A7> <A5A7> <5C3C> <A5A8> <A5A8> <5DE8> <A5A9> <A5A9> <5DE7> <A5AA> <A5AA> <5DE6> <A5AB> <A5AC> <5E02> <A5AD> <A5AD> <5E73> <A5AE> <A5AE> <5E7C> <A5AF> <A5AF> <5F01> <A5B0> <A5B0> <5F18> <A5B1> <A5B1> <5F17> <A5B2> <A5B2> <5FC5> <A5B3> <A5B3> <620A> <A5B4> <A5B5> <6253> <A5B6> <A5B6> <6252> <A5B7> <A5B7> <6251> <A5B8> <A5B8> <65A5> <A5B9> <A5B9> <65E6> <A5BA> <A5BA> <672E> <A5BB> <A5BB> <672C> <A5BC> <A5BD> <672A> <A5BE> <A5BE> <672D> <A5BF> <A5BF> <6B63> <A5C0> <A5C0> <6BCD> <A5C1> <A5C1> <6C11> <A5C2> <A5C2> <6C10> <A5C3> <A5C3> <6C38> <A5C4> <A5C4> <6C41> <A5C5> <A5C5> <6C40> <A5C6> <A5C6> <6C3E> <A5C7> <A5C7> <72AF> endbfrange 100 beginbfrange <A5C8> <A5C8> <7384> <A5C9> <A5C9> <7389> <A5CA> <A5CA> <74DC> <A5CB> <A5CB> <74E6> <A5CC> <A5CC> <7518> <A5CD> <A5CD> <751F> <A5CE> <A5CF> <7528> <A5D0> <A5D3> <7530> <A5D4> <A5D4> <758B> <A5D5> <A5D5> <767D> <A5D6> <A5D6> <76AE> <A5D7> <A5D7> <76BF> <A5D8> <A5D8> <76EE> <A5D9> <A5D9> <77DB> <A5DA> <A5DA> <77E2> <A5DB> <A5DB> <77F3> <A5DC> <A5DC> <793A> <A5DD> <A5DD> <79BE> <A5DE> <A5DE> <7A74> <A5DF> <A5DF> <7ACB> <A5E0> <A5E1> <4E1E> <A5E2> <A5E3> <4E52> <A5E4> <A5E4> <4E69> <A5E5> <A5E5> <4E99> <A5E6> <A5E6> <4EA4> <A5E7> <A5E7> <4EA6> <A5E8> <A5E8> <4EA5> <A5E9> <A5E9> <4EFF> <A5EA> <A5EA> <4F09> <A5EB> <A5EB> <4F19> <A5EC> <A5EC> <4F0A> <A5ED> <A5ED> <4F15> <A5EE> <A5EE> <4F0D> <A5EF> <A5F0> <4F10> <A5F1> <A5F1> <4F0F> <A5F2> <A5F2> <4EF2> <A5F3> <A5F3> <4EF6> <A5F4> <A5F4> <4EFB> <A5F5> <A5F5> <4EF0> <A5F6> <A5F6> <4EF3> <A5F7> <A5F7> <4EFD> <A5F8> <A5F8> <4F01> <A5F9> <A5F9> <4F0B> <A5FA> <A5FA> <5149> <A5FB> <A5FB> <5147> <A5FC> <A5FC> <5146> <A5FD> <A5FD> <5148> <A5FE> <A5FE> <5168> <A640> <A640> <5171> <A641> <A641> <518D> <A642> <A642> <51B0> <A643> <A643> <5217> <A644> <A645> <5211> <A646> <A646> <520E> <A647> <A647> <5216> <A648> <A648> <52A3> <A649> <A649> <5308> <A64A> <A64A> <5321> <A64B> <A64B> <5320> <A64C> <A64D> <5370> <A64E> <A64E> <5409> <A64F> <A64F> <540F> <A650> <A650> <540C> <A651> <A651> <540A> <A652> <A652> <5410> <A653> <A653> <5401> <A654> <A654> <540B> <A655> <A655> <5404> <A656> <A656> <5411> <A657> <A657> <540D> <A658> <A658> <5408> <A659> <A659> <5403> <A65A> <A65A> <540E> <A65B> <A65B> <5406> <A65C> <A65C> <5412> <A65D> <A65D> <56E0> <A65E> <A65E> <56DE> <A65F> <A65F> <56DD> <A660> <A660> <5733> <A661> <A661> <5730> <A662> <A662> <5728> <A663> <A663> <572D> <A664> <A664> <572C> <A665> <A665> <572F> <A666> <A666> <5729> <A667> <A668> <5919> <A669> <A66A> <5937> <A66B> <A66B> <5984> <A66C> <A66C> <5978> <A66D> <A66D> <5983> <A66E> <A66E> <597D> <A66F> <A66F> <5979> <A670> <A670> <5982> <A671> <A671> <5981> <A672> <A673> <5B57> <A674> <A675> <5B87> <A676> <A676> <5B85> <A677> <A677> <5B89> <A678> <A678> <5BFA> <A679> <A679> <5C16> endbfrange 100 beginbfrange <A67A> <A67A> <5C79> <A67B> <A67B> <5DDE> <A67C> <A67C> <5E06> <A67D> <A67D> <5E76> <A67E> <A67E> <5E74> <A6A1> <A6A1> <5F0F> <A6A2> <A6A2> <5F1B> <A6A3> <A6A3> <5FD9> <A6A4> <A6A4> <5FD6> <A6A5> <A6A5> <620E> <A6A6> <A6A7> <620C> <A6A8> <A6A8> <6210> <A6A9> <A6A9> <6263> <A6AA> <A6AA> <625B> <A6AB> <A6AB> <6258> <A6AC> <A6AC> <6536> <A6AD> <A6AD> <65E9> <A6AE> <A6AE> <65E8> <A6AF> <A6B0> <65EC> <A6B1> <A6B2> <66F2> <A6B3> <A6B3> <6709> <A6B4> <A6B4> <673D> <A6B5> <A6B5> <6734> <A6B6> <A6B6> <6731> <A6B7> <A6B7> <6735> <A6B8> <A6B8> <6B21> <A6B9> <A6B9> <6B64> <A6BA> <A6BA> <6B7B> <A6BB> <A6BB> <6C16> <A6BC> <A6BC> <6C5D> <A6BD> <A6BD> <6C57> <A6BE> <A6BE> <6C59> <A6BF> <A6C0> <6C5F> <A6C1> <A6C1> <6C50> <A6C2> <A6C2> <6C55> <A6C3> <A6C3> <6C61> <A6C4> <A6C4> <6C5B> <A6C5> <A6C6> <6C4D> <A6C7> <A6C7> <7070> <A6C8> <A6C8> <725F> <A6C9> <A6C9> <725D> <A6CA> <A6CA> <767E> <A6CB> <A6CB> <7AF9> <A6CC> <A6CC> <7C73> <A6CD> <A6CD> <7CF8> <A6CE> <A6CE> <7F36> <A6CF> <A6CF> <7F8A> <A6D0> <A6D0> <7FBD> <A6D1> <A6D1> <8001> <A6D2> <A6D2> <8003> <A6D3> <A6D3> <800C> <A6D4> <A6D4> <8012> <A6D5> <A6D5> <8033> <A6D6> <A6D6> <807F> <A6D7> <A6D7> <8089> <A6D8> <A6D9> <808B> <A6DA> <A6DA> <81E3> <A6DB> <A6DB> <81EA> <A6DC> <A6DC> <81F3> <A6DD> <A6DD> <81FC> <A6DE> <A6DE> <820C> <A6DF> <A6DF> <821B> <A6E0> <A6E0> <821F> <A6E1> <A6E1> <826E> <A6E2> <A6E2> <8272> <A6E3> <A6E3> <827E> <A6E4> <A6E4> <866B> <A6E5> <A6E5> <8840> <A6E6> <A6E6> <884C> <A6E7> <A6E7> <8863> <A6E8> <A6E8> <897F> <A6E9> <A6E9> <9621> <A6EA> <A6EA> <4E32> <A6EB> <A6EB> <4EA8> <A6EC> <A6EC> <4F4D> <A6ED> <A6ED> <4F4F> <A6EE> <A6EE> <4F47> <A6EF> <A6EF> <4F57> <A6F0> <A6F0> <4F5E> <A6F1> <A6F1> <4F34> <A6F2> <A6F2> <4F5B> <A6F3> <A6F3> <4F55> <A6F4> <A6F4> <4F30> <A6F5> <A6F6> <4F50> <A6F7> <A6F7> <4F3D> <A6F8> <A6F8> <4F3A> <A6F9> <A6F9> <4F38> <A6FA> <A6FA> <4F43> <A6FB> <A6FB> <4F54> <A6FC> <A6FC> <4F3C> <A6FD> <A6FD> <4F46> <A6FE> <A6FE> <4F63> <A740> <A740> <4F5C> <A741> <A741> <4F60> <A742> <A742> <4F2F> <A743> <A743> <4F4E> <A744> <A744> <4F36> <A745> <A745> <4F59> <A746> <A746> <4F5D> <A747> <A747> <4F48> endbfrange 100 beginbfrange <A748> <A748> <4F5A> <A749> <A749> <514C> <A74A> <A74A> <514B> <A74B> <A74B> <514D> <A74C> <A74C> <5175> <A74D> <A74E> <51B6> <A74F> <A74F> <5225> <A750> <A750> <5224> <A751> <A752> <5229> <A753> <A753> <5228> <A754> <A754> <52AB> <A755> <A756> <52A9> <A757> <A757> <52AC> <A758> <A758> <5323> <A759> <A759> <5373> <A75A> <A75A> <5375> <A75B> <A75B> <541D> <A75C> <A75C> <542D> <A75D> <A75D> <541E> <A75E> <A75E> <543E> <A75F> <A75F> <5426> <A760> <A760> <544E> <A761> <A761> <5427> <A762> <A762> <5446> <A763> <A763> <5443> <A764> <A764> <5433> <A765> <A765> <5448> <A766> <A766> <5442> <A767> <A767> <541B> <A768> <A768> <5429> <A769> <A769> <544A> <A76A> <A76A> <5439> <A76B> <A76B> <543B> <A76C> <A76C> <5438> <A76D> <A76D> <542E> <A76E> <A76F> <5435> <A770> <A770> <5420> <A771> <A771> <543C> <A772> <A772> <5440> <A773> <A773> <5431> <A774> <A774> <542B> <A775> <A775> <541F> <A776> <A776> <542C> <A777> <A777> <56EA> <A778> <A778> <56F0> <A779> <A779> <56E4> <A77A> <A77A> <56EB> <A77B> <A77B> <574A> <A77C> <A77C> <5751> <A77D> <A77D> <5740> <A77E> <A77E> <574D> <A7A1> <A7A1> <5747> <A7A2> <A7A2> <574E> <A7A3> <A7A3> <573E> <A7A4> <A7A4> <5750> <A7A5> <A7A5> <574F> <A7A6> <A7A6> <573B> <A7A7> <A7A7> <58EF> <A7A8> <A7A8> <593E> <A7A9> <A7A9> <599D> <A7AA> <A7AA> <5992> <A7AB> <A7AB> <59A8> <A7AC> <A7AC> <599E> <A7AD> <A7AD> <59A3> <A7AE> <A7AE> <5999> <A7AF> <A7AF> <5996> <A7B0> <A7B0> <598D> <A7B1> <A7B1> <59A4> <A7B2> <A7B2> <5993> <A7B3> <A7B3> <598A> <A7B4> <A7B4> <59A5> <A7B5> <A7B5> <5B5D> <A7B6> <A7B6> <5B5C> <A7B7> <A7B8> <5B5A> <A7B9> <A7B9> <5B8C> <A7BA> <A7BA> <5B8B> <A7BB> <A7BB> <5B8F> <A7BC> <A7BC> <5C2C> <A7BD> <A7BE> <5C40> <A7BF> <A7BF> <5C3F> <A7C0> <A7C0> <5C3E> <A7C1> <A7C2> <5C90> <A7C3> <A7C3> <5C94> <A7C4> <A7C4> <5C8C> <A7C5> <A7C5> <5DEB> <A7C6> <A7C6> <5E0C> <A7C7> <A7C7> <5E8F> <A7C8> <A7C8> <5E87> <A7C9> <A7C9> <5E8A> <A7CA> <A7CA> <5EF7> <A7CB> <A7CB> <5F04> <A7CC> <A7CC> <5F1F> <A7CD> <A7CD> <5F64> <A7CE> <A7CE> <5F62> <A7CF> <A7CF> <5F77> <A7D0> <A7D0> <5F79> <A7D1> <A7D1> <5FD8> <A7D2> <A7D2> <5FCC> <A7D3> <A7D3> <5FD7> <A7D4> <A7D4> <5FCD> endbfrange 100 beginbfrange <A7D5> <A7D5> <5FF1> <A7D6> <A7D6> <5FEB> <A7D7> <A7D7> <5FF8> <A7D8> <A7D8> <5FEA> <A7D9> <A7D9> <6212> <A7DA> <A7DA> <6211> <A7DB> <A7DB> <6284> <A7DC> <A7DC> <6297> <A7DD> <A7DD> <6296> <A7DE> <A7DE> <6280> <A7DF> <A7DF> <6276> <A7E0> <A7E0> <6289> <A7E1> <A7E1> <626D> <A7E2> <A7E2> <628A> <A7E3> <A7E3> <627C> <A7E4> <A7E4> <627E> <A7E5> <A7E5> <6279> <A7E6> <A7E6> <6273> <A7E7> <A7E7> <6292> <A7E8> <A7E8> <626F> <A7E9> <A7E9> <6298> <A7EA> <A7EA> <626E> <A7EB> <A7EB> <6295> <A7EC> <A7EC> <6293> <A7ED> <A7ED> <6291> <A7EE> <A7EE> <6286> <A7EF> <A7EF> <6539> <A7F0> <A7F0> <653B> <A7F1> <A7F1> <6538> <A7F2> <A7F2> <65F1> <A7F3> <A7F3> <66F4> <A7F4> <A7F4> <675F> <A7F5> <A7F8> <674E> <A7F9> <A7F9> <675C> <A7FA> <A7FA> <6756> <A7FB> <A7FB> <675E> <A7FC> <A7FC> <6749> <A7FD> <A7FD> <6746> <A7FE> <A7FE> <6760> <A840> <A840> <6753> <A841> <A841> <6757> <A842> <A842> <6B65> <A843> <A843> <6BCF> <A844> <A844> <6C42> <A845> <A845> <6C5E> <A846> <A846> <6C99> <A847> <A847> <6C81> <A848> <A849> <6C88> <A84A> <A84A> <6C85> <A84B> <A84B> <6C9B> <A84C> <A84C> <6C6A> <A84D> <A84D> <6C7A> <A84E> <A84E> <6C90> <A84F> <A84F> <6C70> <A850> <A850> <6C8C> <A851> <A851> <6C68> <A852> <A852> <6C96> <A853> <A853> <6C92> <A854> <A854> <6C7D> <A855> <A855> <6C83> <A856> <A856> <6C72> <A857> <A857> <6C7E> <A858> <A858> <6C74> <A859> <A859> <6C86> <A85A> <A85A> <6C76> <A85B> <A85B> <6C8D> <A85C> <A85C> <6C94> <A85D> <A85D> <6C98> <A85E> <A85E> <6C82> <A85F> <A85F> <7076> <A860> <A861> <707C> <A862> <A862> <7078> <A863> <A863> <7262> <A864> <A864> <7261> <A865> <A865> <7260> <A866> <A866> <72C4> <A867> <A867> <72C2> <A868> <A868> <7396> <A869> <A869> <752C> <A86A> <A86A> <752B> <A86B> <A86C> <7537> <A86D> <A86D> <7682> <A86E> <A86E> <76EF> <A86F> <A86F> <77E3> <A870> <A870> <79C1> <A871> <A871> <79C0> <A872> <A872> <79BF> <A873> <A873> <7A76> <A874> <A874> <7CFB> <A875> <A875> <7F55> <A876> <A876> <8096> <A877> <A877> <8093> <A878> <A878> <809D> <A879> <A879> <8098> <A87A> <A87A> <809B> <A87B> <A87B> <809A> <A87C> <A87C> <80B2> <A87D> <A87D> <826F> <A87E> <A87E> <8292> <A8A1> <A8A1> <828B> endbfrange 100 beginbfrange <A8A2> <A8A2> <828D> <A8A3> <A8A3> <898B> <A8A4> <A8A4> <89D2> <A8A5> <A8A5> <8A00> <A8A6> <A8A6> <8C37> <A8A7> <A8A7> <8C46> <A8A8> <A8A8> <8C55> <A8A9> <A8A9> <8C9D> <A8AA> <A8AA> <8D64> <A8AB> <A8AB> <8D70> <A8AC> <A8AC> <8DB3> <A8AD> <A8AD> <8EAB> <A8AE> <A8AE> <8ECA> <A8AF> <A8AF> <8F9B> <A8B0> <A8B0> <8FB0> <A8B1> <A8B1> <8FC2> <A8B2> <A8B2> <8FC6> <A8B3> <A8B3> <8FC5> <A8B4> <A8B4> <8FC4> <A8B5> <A8B5> <5DE1> <A8B6> <A8B6> <9091> <A8B7> <A8B7> <90A2> <A8B8> <A8B8> <90AA> <A8B9> <A8B9> <90A6> <A8BA> <A8BA> <90A3> <A8BB> <A8BB> <9149> <A8BC> <A8BC> <91C6> <A8BD> <A8BD> <91CC> <A8BE> <A8BE> <9632> <A8BF> <A8BF> <962E> <A8C0> <A8C0> <9631> <A8C1> <A8C1> <962A> <A8C2> <A8C2> <962C> <A8C3> <A8C3> <4E26> <A8C4> <A8C4> <4E56> <A8C5> <A8C5> <4E73> <A8C6> <A8C6> <4E8B> <A8C7> <A8C7> <4E9B> <A8C8> <A8C8> <4E9E> <A8C9> <A8CA> <4EAB> <A8CB> <A8CB> <4F6F> <A8CC> <A8CC> <4F9D> <A8CD> <A8CD> <4F8D> <A8CE> <A8CE> <4F73> <A8CF> <A8CF> <4F7F> <A8D0> <A8D0> <4F6C> <A8D1> <A8D1> <4F9B> <A8D2> <A8D2> <4F8B> <A8D3> <A8D3> <4F86> <A8D4> <A8D4> <4F83> <A8D5> <A8D5> <4F70> <A8D6> <A8D6> <4F75> <A8D7> <A8D7> <4F88> <A8D8> <A8D8> <4F69> <A8D9> <A8D9> <4F7B> <A8DA> <A8DA> <4F96> <A8DB> <A8DB> <4F7E> <A8DC> <A8DC> <4F8F> <A8DD> <A8DD> <4F91> <A8DE> <A8DE> <4F7A> <A8DF> <A8DF> <5154> <A8E0> <A8E0> <5152> <A8E1> <A8E1> <5155> <A8E2> <A8E2> <5169> <A8E3> <A8E3> <5177> <A8E4> <A8E4> <5176> <A8E5> <A8E5> <5178> <A8E6> <A8E6> <51BD> <A8E7> <A8E7> <51FD> <A8E8> <A8E8> <523B> <A8E9> <A8E9> <5238> <A8EA> <A8EA> <5237> <A8EB> <A8EB> <523A> <A8EC> <A8EC> <5230> <A8ED> <A8ED> <522E> <A8EE> <A8EE> <5236> <A8EF> <A8EF> <5241> <A8F0> <A8F0> <52BE> <A8F1> <A8F1> <52BB> <A8F2> <A8F2> <5352> <A8F3> <A8F3> <5354> <A8F4> <A8F4> <5353> <A8F5> <A8F5> <5351> <A8F6> <A8F6> <5366> <A8F7> <A8F9> <5377> <A8FA> <A8FA> <53D6> <A8FB> <A8FB> <53D4> <A8FC> <A8FC> <53D7> <A8FD> <A8FD> <5473> <A8FE> <A8FE> <5475> <A940> <A940> <5496> <A941> <A941> <5478> <A942> <A942> <5495> <A943> <A943> <5480> <A944> <A944> <547B> <A945> <A945> <5477> <A946> <A946> <5484> <A947> <A947> <5492> <A948> <A948> <5486> <A949> <A949> <547C> endbfrange 100 beginbfrange <A94A> <A94A> <5490> <A94B> <A94B> <5471> <A94C> <A94C> <5476> <A94D> <A94D> <548C> <A94E> <A94E> <549A> <A94F> <A94F> <5462> <A950> <A950> <5468> <A951> <A951> <548B> <A952> <A952> <547D> <A953> <A953> <548E> <A954> <A954> <56FA> <A955> <A955> <5783> <A956> <A956> <5777> <A957> <A957> <576A> <A958> <A958> <5769> <A959> <A959> <5761> <A95A> <A95A> <5766> <A95B> <A95B> <5764> <A95C> <A95C> <577C> <A95D> <A95D> <591C> <A95E> <A95E> <5949> <A95F> <A960> <5947> <A961> <A961> <5944> <A962> <A962> <5954> <A963> <A963> <59BE> <A964> <A964> <59BB> <A965> <A965> <59D4> <A966> <A966> <59B9> <A967> <A967> <59AE> <A968> <A968> <59D1> <A969> <A969> <59C6> <A96A> <A96A> <59D0> <A96B> <A96B> <59CD> <A96C> <A96C> <59CB> <A96D> <A96D> <59D3> <A96E> <A96E> <59CA> <A96F> <A96F> <59AF> <A970> <A970> <59B3> <A971> <A971> <59D2> <A972> <A972> <59C5> <A973> <A973> <5B5F> <A974> <A974> <5B64> <A975> <A975> <5B63> <A976> <A976> <5B97> <A977> <A977> <5B9A> <A978> <A978> <5B98> <A979> <A979> <5B9C> <A97A> <A97A> <5B99> <A97B> <A97B> <5B9B> <A97C> <A97C> <5C1A> <A97D> <A97D> <5C48> <A97E> <A97E> <5C45> <A9A1> <A9A1> <5C46> <A9A2> <A9A2> <5CB7> <A9A3> <A9A3> <5CA1> <A9A4> <A9A4> <5CB8> <A9A5> <A9A5> <5CA9> <A9A6> <A9A6> <5CAB> <A9A7> <A9A7> <5CB1> <A9A8> <A9A8> <5CB3> <A9A9> <A9A9> <5E18> <A9AA> <A9AA> <5E1A> <A9AB> <A9AB> <5E16> <A9AC> <A9AC> <5E15> <A9AD> <A9AD> <5E1B> <A9AE> <A9AE> <5E11> <A9AF> <A9AF> <5E78> <A9B0> <A9B0> <5E9A> <A9B1> <A9B1> <5E97> <A9B2> <A9B2> <5E9C> <A9B3> <A9B4> <5E95> <A9B5> <A9B5> <5EF6> <A9B6> <A9B7> <5F26> <A9B8> <A9B8> <5F29> <A9B9> <A9BA> <5F80> <A9BB> <A9BB> <5F7F> <A9BC> <A9BC> <5F7C> <A9BD> <A9BD> <5FDD> <A9BE> <A9BE> <5FE0> <A9BF> <A9BF> <5FFD> <A9C0> <A9C0> <5FF5> <A9C1> <A9C1> <5FFF> <A9C2> <A9C2> <600F> <A9C3> <A9C3> <6014> <A9C4> <A9C4> <602F> <A9C5> <A9C5> <6035> <A9C6> <A9C6> <6016> <A9C7> <A9C7> <602A> <A9C8> <A9C8> <6015> <A9C9> <A9C9> <6021> <A9CA> <A9CA> <6027> <A9CB> <A9CB> <6029> <A9CC> <A9CC> <602B> <A9CD> <A9CD> <601B> <A9CE> <A9CE> <6216> <A9CF> <A9CF> <6215> <A9D0> <A9D0> <623F> <A9D1> <A9D1> <623E> <A9D2> <A9D2> <6240> <A9D3> <A9D3> <627F> endbfrange 100 beginbfrange <A9D4> <A9D4> <62C9> <A9D5> <A9D5> <62CC> <A9D6> <A9D6> <62C4> <A9D7> <A9D7> <62BF> <A9D8> <A9D8> <62C2> <A9D9> <A9D9> <62B9> <A9DA> <A9DA> <62D2> <A9DB> <A9DB> <62DB> <A9DC> <A9DC> <62AB> <A9DD> <A9DE> <62D3> <A9DF> <A9DF> <62CB> <A9E0> <A9E0> <62C8> <A9E1> <A9E1> <62A8> <A9E2> <A9E2> <62BD> <A9E3> <A9E3> <62BC> <A9E4> <A9E4> <62D0> <A9E5> <A9E5> <62D9> <A9E6> <A9E6> <62C7> <A9E7> <A9E7> <62CD> <A9E8> <A9E8> <62B5> <A9E9> <A9E9> <62DA> <A9EA> <A9EA> <62B1> <A9EB> <A9EB> <62D8> <A9EC> <A9ED> <62D6> <A9EE> <A9EE> <62C6> <A9EF> <A9EF> <62AC> <A9F0> <A9F0> <62CE> <A9F1> <A9F1> <653E> <A9F2> <A9F2> <65A7> <A9F3> <A9F3> <65BC> <A9F4> <A9F4> <65FA> <A9F5> <A9F5> <6614> <A9F6> <A9F6> <6613> <A9F7> <A9F7> <660C> <A9F8> <A9F8> <6606> <A9F9> <A9F9> <6602> <A9FA> <A9FA> <660E> <A9FB> <A9FB> <6600> <A9FC> <A9FC> <660F> <A9FD> <A9FD> <6615> <A9FE> <A9FE> <660A> <AA40> <AA40> <6607> <AA41> <AA41> <670D> <AA42> <AA42> <670B> <AA43> <AA43> <676D> <AA44> <AA44> <678B> <AA45> <AA45> <6795> <AA46> <AA46> <6771> <AA47> <AA47> <679C> <AA48> <AA48> <6773> <AA49> <AA49> <6777> <AA4A> <AA4A> <6787> <AA4B> <AA4B> <679D> <AA4C> <AA4C> <6797> <AA4D> <AA4E> <676F> <AA4F> <AA4F> <677F> <AA50> <AA50> <6789> <AA51> <AA51> <677E> <AA52> <AA52> <6790> <AA53> <AA53> <6775> <AA54> <AA54> <679A> <AA55> <AA55> <6793> <AA56> <AA56> <677C> <AA57> <AA57> <676A> <AA58> <AA58> <6772> <AA59> <AA59> <6B23> <AA5A> <AA5B> <6B66> <AA5C> <AA5C> <6B7F> <AA5D> <AA5D> <6C13> <AA5E> <AA5E> <6C1B> <AA5F> <AA5F> <6CE3> <AA60> <AA60> <6CE8> <AA61> <AA61> <6CF3> <AA62> <AA62> <6CB1> <AA63> <AA63> <6CCC> <AA64> <AA64> <6CE5> <AA65> <AA65> <6CB3> <AA66> <AA67> <6CBD> <AA68> <AA68> <6CBC> <AA69> <AA69> <6CE2> <AA6A> <AA6A> <6CAB> <AA6B> <AA6B> <6CD5> <AA6C> <AA6C> <6CD3> <AA6D> <AA6D> <6CB8> <AA6E> <AA6E> <6CC4> <AA6F> <AA6F> <6CB9> <AA70> <AA70> <6CC1> <AA71> <AA71> <6CAE> <AA72> <AA72> <6CD7> <AA73> <AA73> <6CC5> <AA74> <AA74> <6CF1> <AA75> <AA75> <6CBF> <AA76> <AA76> <6CBB> <AA77> <AA77> <6CE1> <AA78> <AA78> <6CDB> <AA79> <AA79> <6CCA> <AA7A> <AA7A> <6CAC> <AA7B> <AA7B> <6CEF> <AA7C> <AA7C> <6CDC> <AA7D> <AA7D> <6CD6> endbfrange 100 beginbfrange <AA7E> <AA7E> <6CE0> <AAA1> <AAA1> <7095> <AAA2> <AAA2> <708E> <AAA3> <AAA3> <7092> <AAA4> <AAA4> <708A> <AAA5> <AAA5> <7099> <AAA6> <AAA7> <722C> <AAA8> <AAA8> <7238> <AAA9> <AAA9> <7248> <AAAA> <AAAA> <7267> <AAAB> <AAAB> <7269> <AAAC> <AAAC> <72C0> <AAAD> <AAAD> <72CE> <AAAE> <AAAE> <72D9> <AAAF> <AAAF> <72D7> <AAB0> <AAB0> <72D0> <AAB1> <AAB1> <73A9> <AAB2> <AAB2> <73A8> <AAB3> <AAB3> <739F> <AAB4> <AAB4> <73AB> <AAB5> <AAB5> <73A5> <AAB6> <AAB6> <753D> <AAB7> <AAB7> <759D> <AAB8> <AAB9> <7599> <AABA> <AABA> <7684> <AABB> <AABB> <76C2> <AABC> <AABC> <76F2> <AABD> <AABD> <76F4> <AABE> <AABE> <77E5> <AABF> <AABF> <77FD> <AAC0> <AAC0> <793E> <AAC1> <AAC2> <7940> <AAC3> <AAC3> <79C9> <AAC4> <AAC4> <79C8> <AAC5> <AAC5> <7A7A> <AAC6> <AAC6> <7A79> <AAC7> <AAC7> <7AFA> <AAC8> <AAC8> <7CFE> <AAC9> <AAC9> <7F54> <AACA> <AACA> <7F8C> <AACB> <AACB> <7F8B> <AACC> <AACC> <8005> <AACD> <AACD> <80BA> <AACE> <AACE> <80A5> <AACF> <AACF> <80A2> <AAD0> <AAD0> <80B1> <AAD1> <AAD1> <80A1> <AAD2> <AAD2> <80AB> <AAD3> <AAD3> <80A9> <AAD4> <AAD4> <80B4> <AAD5> <AAD5> <80AA> <AAD6> <AAD6> <80AF> <AAD7> <AAD7> <81E5> <AAD8> <AAD8> <81FE> <AAD9> <AAD9> <820D> <AADA> <AADA> <82B3> <AADB> <AADB> <829D> <AADC> <AADC> <8299> <AADD> <AADD> <82AD> <AADE> <AADE> <82BD> <AADF> <AADF> <829F> <AAE0> <AAE0> <82B9> <AAE1> <AAE1> <82B1> <AAE2> <AAE2> <82AC> <AAE3> <AAE3> <82A5> <AAE4> <AAE4> <82AF> <AAE5> <AAE5> <82B8> <AAE6> <AAE6> <82A3> <AAE7> <AAE7> <82B0> <AAE8> <AAE8> <82BE> <AAE9> <AAE9> <82B7> <AAEA> <AAEA> <864E> <AAEB> <AAEB> <8671> <AAEC> <AAEC> <521D> <AAED> <AAED> <8868> <AAEE> <AAEE> <8ECB> <AAEF> <AAEF> <8FCE> <AAF0> <AAF0> <8FD4> <AAF1> <AAF1> <8FD1> <AAF2> <AAF2> <90B5> <AAF3> <AAF3> <90B8> <AAF4> <AAF4> <90B1> <AAF5> <AAF5> <90B6> <AAF6> <AAF6> <91C7> <AAF7> <AAF7> <91D1> <AAF8> <AAF8> <9577> <AAF9> <AAF9> <9580> <AAFA> <AAFA> <961C> <AAFB> <AAFB> <9640> <AAFC> <AAFC> <963F> <AAFD> <AAFD> <963B> <AAFE> <AAFE> <9644> <AB40> <AB40> <9642> <AB41> <AB41> <96B9> <AB42> <AB42> <96E8> <AB43> <AB43> <9752> <AB44> <AB44> <975E> <AB45> <AB45> <4E9F> <AB46> <AB47> <4EAD> <AB48> <AB48> <4FE1> endbfrange 100 beginbfrange <AB49> <AB49> <4FB5> <AB4A> <AB4A> <4FAF> <AB4B> <AB4B> <4FBF> <AB4C> <AB4C> <4FE0> <AB4D> <AB4D> <4FD1> <AB4E> <AB4E> <4FCF> <AB4F> <AB4F> <4FDD> <AB50> <AB50> <4FC3> <AB51> <AB51> <4FB6> <AB52> <AB52> <4FD8> <AB53> <AB53> <4FDF> <AB54> <AB54> <4FCA> <AB55> <AB55> <4FD7> <AB56> <AB56> <4FAE> <AB57> <AB57> <4FD0> <AB58> <AB58> <4FC4> <AB59> <AB59> <4FC2> <AB5A> <AB5A> <4FDA> <AB5B> <AB5B> <4FCE> <AB5C> <AB5C> <4FDE> <AB5D> <AB5D> <4FB7> <AB5E> <AB5E> <5157> <AB5F> <AB5F> <5192> <AB60> <AB60> <5191> <AB61> <AB61> <51A0> <AB62> <AB62> <524E> <AB63> <AB63> <5243> <AB64> <AB64> <524A> <AB65> <AB65> <524D> <AB66> <AB66> <524C> <AB67> <AB67> <524B> <AB68> <AB68> <5247> <AB69> <AB69> <52C7> <AB6A> <AB6A> <52C9> <AB6B> <AB6B> <52C3> <AB6C> <AB6C> <52C1> <AB6D> <AB6D> <530D> <AB6E> <AB6E> <5357> <AB6F> <AB6F> <537B> <AB70> <AB70> <539A> <AB71> <AB71> <53DB> <AB72> <AB72> <54AC> <AB73> <AB73> <54C0> <AB74> <AB74> <54A8> <AB75> <AB75> <54CE> <AB76> <AB76> <54C9> <AB77> <AB77> <54B8> <AB78> <AB78> <54A6> <AB79> <AB79> <54B3> <AB7A> <AB7A> <54C7> <AB7B> <AB7B> <54C2> <AB7C> <AB7C> <54BD> <AB7D> <AB7D> <54AA> <AB7E> <AB7E> <54C1> <ABA1> <ABA1> <54C4> <ABA2> <ABA2> <54C8> <ABA3> <ABA3> <54AF> <ABA4> <ABA4> <54AB> <ABA5> <ABA5> <54B1> <ABA6> <ABA6> <54BB> <ABA7> <ABA7> <54A9> <ABA8> <ABA8> <54A7> <ABA9> <ABA9> <54BF> <ABAA> <ABAA> <56FF> <ABAB> <ABAB> <5782> <ABAC> <ABAC> <578B> <ABAD> <ABAD> <57A0> <ABAE> <ABAE> <57A3> <ABAF> <ABAF> <57A2> <ABB0> <ABB0> <57CE> <ABB1> <ABB1> <57AE> <ABB2> <ABB2> <5793> <ABB3> <ABB3> <5955> <ABB4> <ABB4> <5951> <ABB5> <ABB5> <594F> <ABB6> <ABB6> <594E> <ABB7> <ABB7> <5950> <ABB8> <ABB8> <59DC> <ABB9> <ABB9> <59D8> <ABBA> <ABBA> <59FF> <ABBB> <ABBB> <59E3> <ABBC> <ABBC> <59E8> <ABBD> <ABBD> <5A03> <ABBE> <ABBE> <59E5> <ABBF> <ABBF> <59EA> <ABC0> <ABC0> <59DA> <ABC1> <ABC1> <59E6> <ABC2> <ABC2> <5A01> <ABC3> <ABC3> <59FB> <ABC4> <ABC4> <5B69> <ABC5> <ABC5> <5BA3> <ABC6> <ABC6> <5BA6> <ABC7> <ABC7> <5BA4> <ABC8> <ABC8> <5BA2> <ABC9> <ABC9> <5BA5> <ABCA> <ABCA> <5C01> <ABCB> <ABCC> <5C4E> <ABCD> <ABCD> <5C4D> <ABCE> <ABCE> <5C4B> <ABCF> <ABCF> <5CD9> endbfrange 100 beginbfrange <ABD0> <ABD0> <5CD2> <ABD1> <ABD1> <5DF7> <ABD2> <ABD2> <5E1D> <ABD3> <ABD3> <5E25> <ABD4> <ABD4> <5E1F> <ABD5> <ABD5> <5E7D> <ABD6> <ABD6> <5EA0> <ABD7> <ABD7> <5EA6> <ABD8> <ABD8> <5EFA> <ABD9> <ABD9> <5F08> <ABDA> <ABDA> <5F2D> <ABDB> <ABDB> <5F65> <ABDC> <ABDC> <5F88> <ABDD> <ABDD> <5F85> <ABDE> <ABDF> <5F8A> <ABE0> <ABE0> <5F87> <ABE1> <ABE1> <5F8C> <ABE2> <ABE2> <5F89> <ABE3> <ABE3> <6012> <ABE4> <ABE4> <601D> <ABE5> <ABE5> <6020> <ABE6> <ABE6> <6025> <ABE7> <ABE7> <600E> <ABE8> <ABE8> <6028> <ABE9> <ABE9> <604D> <ABEA> <ABEA> <6070> <ABEB> <ABEB> <6068> <ABEC> <ABEC> <6062> <ABED> <ABED> <6046> <ABEE> <ABEE> <6043> <ABEF> <ABEF> <606C> <ABF0> <ABF0> <606B> <ABF1> <ABF1> <606A> <ABF2> <ABF2> <6064> <ABF3> <ABF3> <6241> <ABF4> <ABF4> <62DC> <ABF5> <ABF5> <6316> <ABF6> <ABF6> <6309> <ABF7> <ABF7> <62FC> <ABF8> <ABF8> <62ED> <ABF9> <ABF9> <6301> <ABFA> <ABFA> <62EE> <ABFB> <ABFB> <62FD> <ABFC> <ABFC> <6307> <ABFD> <ABFD> <62F1> <ABFE> <ABFE> <62F7> <AC40> <AC40> <62EF> <AC41> <AC41> <62EC> <AC42> <AC42> <62FE> <AC43> <AC43> <62F4> <AC44> <AC44> <6311> <AC45> <AC45> <6302> <AC46> <AC46> <653F> <AC47> <AC47> <6545> <AC48> <AC48> <65AB> <AC49> <AC49> <65BD> <AC4A> <AC4A> <65E2> <AC4B> <AC4B> <6625> <AC4C> <AC4C> <662D> <AC4D> <AC4D> <6620> <AC4E> <AC4E> <6627> <AC4F> <AC4F> <662F> <AC50> <AC50> <661F> <AC51> <AC51> <6628> <AC52> <AC52> <6631> <AC53> <AC53> <6624> <AC54> <AC54> <66F7> <AC55> <AC55> <67FF> <AC56> <AC56> <67D3> <AC57> <AC57> <67F1> <AC58> <AC58> <67D4> <AC59> <AC59> <67D0> <AC5A> <AC5A> <67EC> <AC5B> <AC5B> <67B6> <AC5C> <AC5C> <67AF> <AC5D> <AC5D> <67F5> <AC5E> <AC5E> <67E9> <AC5F> <AC5F> <67EF> <AC60> <AC60> <67C4> <AC61> <AC61> <67D1> <AC62> <AC62> <67B4> <AC63> <AC63> <67DA> <AC64> <AC64> <67E5> <AC65> <AC65> <67B8> <AC66> <AC66> <67CF> <AC67> <AC67> <67DE> <AC68> <AC68> <67F3> <AC69> <AC69> <67B0> <AC6A> <AC6A> <67D9> <AC6B> <AC6B> <67E2> <AC6C> <AC6C> <67DD> <AC6D> <AC6D> <67D2> <AC6E> <AC6E> <6B6A> <AC6F> <AC6F> <6B83> <AC70> <AC70> <6B86> <AC71> <AC71> <6BB5> <AC72> <AC72> <6BD2> <AC73> <AC73> <6BD7> <AC74> <AC74> <6C1F> <AC75> <AC75> <6CC9> endbfrange 100 beginbfrange <AC76> <AC76> <6D0B> <AC77> <AC77> <6D32> <AC78> <AC78> <6D2A> <AC79> <AC79> <6D41> <AC7A> <AC7A> <6D25> <AC7B> <AC7B> <6D0C> <AC7C> <AC7C> <6D31> <AC7D> <AC7D> <6D1E> <AC7E> <AC7E> <6D17> <ACA1> <ACA1> <6D3B> <ACA2> <ACA3> <6D3D> <ACA4> <ACA4> <6D36> <ACA5> <ACA5> <6D1B> <ACA6> <ACA6> <6CF5> <ACA7> <ACA7> <6D39> <ACA8> <ACA8> <6D27> <ACA9> <ACA9> <6D38> <ACAA> <ACAA> <6D29> <ACAB> <ACAB> <6D2E> <ACAC> <ACAC> <6D35> <ACAD> <ACAD> <6D0E> <ACAE> <ACAE> <6D2B> <ACAF> <ACAF> <70AB> <ACB0> <ACB0> <70BA> <ACB1> <ACB1> <70B3> <ACB2> <ACB2> <70AC> <ACB3> <ACB3> <70AF> <ACB4> <ACB4> <70AD> <ACB5> <ACB5> <70B8> <ACB6> <ACB6> <70AE> <ACB7> <ACB7> <70A4> <ACB8> <ACB8> <7230> <ACB9> <ACB9> <7272> <ACBA> <ACBA> <726F> <ACBB> <ACBB> <7274> <ACBC> <ACBC> <72E9> <ACBD> <ACBE> <72E0> <ACBF> <ACBF> <73B7> <ACC0> <ACC0> <73CA> <ACC1> <ACC1> <73BB> <ACC2> <ACC2> <73B2> <ACC3> <ACC3> <73CD> <ACC4> <ACC4> <73C0> <ACC5> <ACC5> <73B3> <ACC6> <ACC6> <751A> <ACC7> <ACC7> <752D> <ACC8> <ACC8> <754F> <ACC9> <ACC9> <754C> <ACCA> <ACCA> <754E> <ACCB> <ACCB> <754B> <ACCC> <ACCC> <75AB> <ACCD> <ACCE> <75A4> <ACCF> <ACD0> <75A2> <ACD1> <ACD1> <7678> <ACD2> <ACD4> <7686> <ACD5> <ACD5> <76C8> <ACD6> <ACD6> <76C6> <ACD7> <ACD7> <76C3> <ACD8> <ACD8> <76C5> <ACD9> <ACD9> <7701> <ACDA> <ACDA> <76F9> <ACDB> <ACDB> <76F8> <ACDC> <ACDC> <7709> <ACDD> <ACDD> <770B> <ACDE> <ACDE> <76FE> <ACDF> <ACDF> <76FC> <ACE0> <ACE0> <7707> <ACE1> <ACE1> <77DC> <ACE2> <ACE2> <7802> <ACE3> <ACE3> <7814> <ACE4> <ACE5> <780C> <ACE6> <ACE6> <7946> <ACE7> <ACE7> <7949> <ACE8> <ACE8> <7948> <ACE9> <ACE9> <7947> <ACEA> <ACEB> <79B9> <ACEC> <ACED> <79D1> <ACEE> <ACEE> <79CB> <ACEF> <ACEF> <7A7F> <ACF0> <ACF0> <7A81> <ACF1> <ACF1> <7AFF> <ACF2> <ACF2> <7AFD> <ACF3> <ACF3> <7C7D> <ACF4> <ACF4> <7D02> <ACF5> <ACF5> <7D05> <ACF6> <ACF6> <7D00> <ACF7> <ACF7> <7D09> <ACF8> <ACF8> <7D07> <ACF9> <ACF9> <7D04> <ACFA> <ACFA> <7D06> <ACFB> <ACFB> <7F38> <ACFC> <ACFC> <7F8E> <ACFD> <ACFD> <7FBF> <ACFE> <ACFE> <8004> <AD40> <AD40> <8010> <AD41> <AD41> <800D> <AD42> <AD42> <8011> <AD43> <AD43> <8036> <AD44> <AD44> <80D6> <AD45> <AD45> <80E5> endbfrange 100 beginbfrange <AD46> <AD46> <80DA> <AD47> <AD48> <80C3> <AD49> <AD49> <80CC> <AD4A> <AD4A> <80E1> <AD4B> <AD4B> <80DB> <AD4C> <AD4C> <80CE> <AD4D> <AD4D> <80DE> <AD4E> <AD4E> <80E4> <AD4F> <AD4F> <80DD> <AD50> <AD50> <81F4> <AD51> <AD51> <8222> <AD52> <AD52> <82E7> <AD53> <AD53> <8303> <AD54> <AD54> <8305> <AD55> <AD55> <82E3> <AD56> <AD56> <82DB> <AD57> <AD57> <82E6> <AD58> <AD58> <8304> <AD59> <AD59> <82E5> <AD5A> <AD5A> <8302> <AD5B> <AD5B> <8309> <AD5C> <AD5C> <82D2> <AD5D> <AD5D> <82D7> <AD5E> <AD5E> <82F1> <AD5F> <AD5F> <8301> <AD60> <AD60> <82DC> <AD61> <AD61> <82D4> <AD62> <AD62> <82D1> <AD63> <AD63> <82DE> <AD64> <AD64> <82D3> <AD65> <AD65> <82DF> <AD66> <AD66> <82EF> <AD67> <AD67> <8306> <AD68> <AD68> <8650> <AD69> <AD69> <8679> <AD6A> <AD6A> <867B> <AD6B> <AD6B> <867A> <AD6C> <AD6C> <884D> <AD6D> <AD6D> <886B> <AD6E> <AD6E> <8981> <AD6F> <AD6F> <89D4> <AD70> <AD70> <8A08> <AD71> <AD72> <8A02> <AD73> <AD73> <8C9E> <AD74> <AD74> <8CA0> <AD75> <AD75> <8D74> <AD76> <AD76> <8D73> <AD77> <AD77> <8DB4> <AD78> <AD78> <8ECD> <AD79> <AD79> <8ECC> <AD7A> <AD7A> <8FF0> <AD7B> <AD7B> <8FE6> <AD7C> <AD7C> <8FE2> <AD7D> <AD7D> <8FEA> <AD7E> <AD7E> <8FE5> <ADA1> <ADA1> <8FED> <ADA2> <ADA2> <8FEB> <ADA3> <ADA3> <8FE4> <ADA4> <ADA4> <8FE8> <ADA5> <ADA5> <90CA> <ADA6> <ADA6> <90CE> <ADA7> <ADA7> <90C1> <ADA8> <ADA8> <90C3> <ADA9> <ADA9> <914B> <ADAA> <ADAA> <914A> <ADAB> <ADAB> <91CD> <ADAC> <ADAC> <9582> <ADAD> <ADAD> <9650> <ADAE> <ADB0> <964B> <ADB1> <ADB1> <9762> <ADB2> <ADB2> <9769> <ADB3> <ADB3> <97CB> <ADB4> <ADB4> <97ED> <ADB5> <ADB5> <97F3> <ADB6> <ADB6> <9801> <ADB7> <ADB7> <98A8> <ADB8> <ADB8> <98DB> <ADB9> <ADB9> <98DF> <ADBA> <ADBA> <9996> <ADBB> <ADBB> <9999> <ADBC> <ADBC> <4E58> <ADBD> <ADBD> <4EB3> <ADBE> <ADBF> <500C> <ADC0> <ADC0> <5023> <ADC1> <ADC1> <4FEF> <ADC2> <ADC2> <5026> <ADC3> <ADC3> <5025> <ADC4> <ADC4> <4FF8> <ADC5> <ADC5> <5029> <ADC6> <ADC6> <5016> <ADC7> <ADC7> <5006> <ADC8> <ADC8> <503C> <ADC9> <ADC9> <501F> <ADCA> <ADCA> <501A> <ADCB> <ADCB> <5012> <ADCC> <ADCC> <5011> <ADCD> <ADCD> <4FFA> <ADCE> <ADCE> <5000> <ADCF> <ADCF> <5014> <ADD0> <ADD0> <5028> endbfrange 100 beginbfrange <ADD1> <ADD1> <4FF1> <ADD2> <ADD2> <5021> <ADD3> <ADD3> <500B> <ADD4> <ADD4> <5019> <ADD5> <ADD5> <5018> <ADD6> <ADD6> <4FF3> <ADD7> <ADD7> <4FEE> <ADD8> <ADD8> <502D> <ADD9> <ADD9> <502A> <ADDA> <ADDA> <4FFE> <ADDB> <ADDB> <502B> <ADDC> <ADDC> <5009> <ADDD> <ADDD> <517C> <ADDE> <ADDF> <51A4> <ADE0> <ADE0> <51A2> <ADE1> <ADE1> <51CD> <ADE2> <ADE2> <51CC> <ADE3> <ADE3> <51C6> <ADE4> <ADE4> <51CB> <ADE5> <ADE5> <5256> <ADE6> <ADE6> <525C> <ADE7> <ADE7> <5254> <ADE8> <ADE8> <525B> <ADE9> <ADE9> <525D> <ADEA> <ADEA> <532A> <ADEB> <ADEB> <537F> <ADEC> <ADEC> <539F> <ADED> <ADED> <539D> <ADEE> <ADEE> <53DF> <ADEF> <ADEF> <54E8> <ADF0> <ADF0> <5510> <ADF1> <ADF1> <5501> <ADF2> <ADF2> <5537> <ADF3> <ADF3> <54FC> <ADF4> <ADF4> <54E5> <ADF5> <ADF5> <54F2> <ADF6> <ADF6> <5506> <ADF7> <ADF7> <54FA> <ADF8> <ADF8> <5514> <ADF9> <ADF9> <54E9> <ADFA> <ADFA> <54ED> <ADFB> <ADFB> <54E1> <ADFC> <ADFC> <5509> <ADFD> <ADFD> <54EE> <ADFE> <ADFE> <54EA> <AE40> <AE40> <54E6> <AE41> <AE41> <5527> <AE42> <AE42> <5507> <AE43> <AE43> <54FD> <AE44> <AE44> <550F> <AE45> <AE46> <5703> <AE47> <AE47> <57C2> <AE48> <AE48> <57D4> <AE49> <AE49> <57CB> <AE4A> <AE4A> <57C3> <AE4B> <AE4B> <5809> <AE4C> <AE4C> <590F> <AE4D> <AE4E> <5957> <AE4F> <AE4F> <595A> <AE50> <AE50> <5A11> <AE51> <AE51> <5A18> <AE52> <AE52> <5A1C> <AE53> <AE53> <5A1F> <AE54> <AE54> <5A1B> <AE55> <AE55> <5A13> <AE56> <AE56> <59EC> <AE57> <AE57> <5A20> <AE58> <AE58> <5A23> <AE59> <AE59> <5A29> <AE5A> <AE5A> <5A25> <AE5B> <AE5B> <5A0C> <AE5C> <AE5C> <5A09> <AE5D> <AE5D> <5B6B> <AE5E> <AE5E> <5C58> <AE5F> <AE5F> <5BB0> <AE60> <AE60> <5BB3> <AE61> <AE61> <5BB6> <AE62> <AE62> <5BB4> <AE63> <AE63> <5BAE> <AE64> <AE64> <5BB5> <AE65> <AE65> <5BB9> <AE66> <AE66> <5BB8> <AE67> <AE67> <5C04> <AE68> <AE68> <5C51> <AE69> <AE69> <5C55> <AE6A> <AE6A> <5C50> <AE6B> <AE6B> <5CED> <AE6C> <AE6C> <5CFD> <AE6D> <AE6D> <5CFB> <AE6E> <AE6E> <5CEA> <AE6F> <AE6F> <5CE8> <AE70> <AE70> <5CF0> <AE71> <AE71> <5CF6> <AE72> <AE72> <5D01> <AE73> <AE73> <5CF4> <AE74> <AE74> <5DEE> <AE75> <AE75> <5E2D> <AE76> <AE76> <5E2B> <AE77> <AE77> <5EAB> <AE78> <AE78> <5EAD> endbfrange 100 beginbfrange <AE79> <AE79> <5EA7> <AE7A> <AE7A> <5F31> <AE7B> <AE7B> <5F92> <AE7C> <AE7C> <5F91> <AE7D> <AE7D> <5F90> <AE7E> <AE7E> <6059> <AEA1> <AEA1> <6063> <AEA2> <AEA2> <6065> <AEA3> <AEA3> <6050> <AEA4> <AEA4> <6055> <AEA5> <AEA5> <606D> <AEA6> <AEA6> <6069> <AEA7> <AEA7> <606F> <AEA8> <AEA8> <6084> <AEA9> <AEA9> <609F> <AEAA> <AEAA> <609A> <AEAB> <AEAB> <608D> <AEAC> <AEAC> <6094> <AEAD> <AEAD> <608C> <AEAE> <AEAE> <6085> <AEAF> <AEAF> <6096> <AEB0> <AEB0> <6247> <AEB1> <AEB1> <62F3> <AEB2> <AEB2> <6308> <AEB3> <AEB3> <62FF> <AEB4> <AEB4> <634E> <AEB5> <AEB5> <633E> <AEB6> <AEB6> <632F> <AEB7> <AEB7> <6355> <AEB8> <AEB8> <6342> <AEB9> <AEB9> <6346> <AEBA> <AEBA> <634F> <AEBB> <AEBB> <6349> <AEBC> <AEBC> <633A> <AEBD> <AEBD> <6350> <AEBE> <AEBE> <633D> <AEBF> <AEC0> <632A> <AEC1> <AEC1> <6328> <AEC2> <AEC2> <634D> <AEC3> <AEC3> <634C> <AEC4> <AEC5> <6548> <AEC6> <AEC6> <6599> <AEC7> <AEC7> <65C1> <AEC8> <AEC8> <65C5> <AEC9> <AEC9> <6642> <AECA> <AECA> <6649> <AECB> <AECB> <664F> <AECC> <AECC> <6643> <AECD> <AECD> <6652> <AECE> <AECE> <664C> <AECF> <AECF> <6645> <AED0> <AED0> <6641> <AED1> <AED1> <66F8> <AED2> <AED3> <6714> <AED4> <AED4> <6717> <AED5> <AED5> <6821> <AED6> <AED6> <6838> <AED7> <AED7> <6848> <AED8> <AED8> <6846> <AED9> <AED9> <6853> <AEDA> <AEDA> <6839> <AEDB> <AEDB> <6842> <AEDC> <AEDC> <6854> <AEDD> <AEDD> <6829> <AEDE> <AEDE> <68B3> <AEDF> <AEDF> <6817> <AEE0> <AEE0> <684C> <AEE1> <AEE1> <6851> <AEE2> <AEE2> <683D> <AEE3> <AEE3> <67F4> <AEE4> <AEE4> <6850> <AEE5> <AEE5> <6840> <AEE6> <AEE6> <683C> <AEE7> <AEE7> <6843> <AEE8> <AEE8> <682A> <AEE9> <AEE9> <6845> <AEEA> <AEEA> <6813> <AEEB> <AEEB> <6818> <AEEC> <AEEC> <6841> <AEED> <AEED> <6B8A> <AEEE> <AEEE> <6B89> <AEEF> <AEEF> <6BB7> <AEF0> <AEF0> <6C23> <AEF1> <AEF2> <6C27> <AEF3> <AEF3> <6C26> <AEF4> <AEF4> <6C24> <AEF5> <AEF5> <6CF0> <AEF6> <AEF6> <6D6A> <AEF7> <AEF7> <6D95> <AEF8> <AEF8> <6D88> <AEF9> <AEF9> <6D87> <AEFA> <AEFA> <6D66> <AEFB> <AEFB> <6D78> <AEFC> <AEFC> <6D77> <AEFD> <AEFD> <6D59> <AEFE> <AEFE> <6D93> <AF40> <AF40> <6D6C> <AF41> <AF41> <6D89> <AF42> <AF42> <6D6E> <AF43> <AF43> <6D5A> endbfrange 100 beginbfrange <AF44> <AF44> <6D74> <AF45> <AF45> <6D69> <AF46> <AF46> <6D8C> <AF47> <AF47> <6D8A> <AF48> <AF48> <6D79> <AF49> <AF49> <6D85> <AF4A> <AF4A> <6D65> <AF4B> <AF4B> <6D94> <AF4C> <AF4C> <70CA> <AF4D> <AF4D> <70D8> <AF4E> <AF4E> <70E4> <AF4F> <AF4F> <70D9> <AF50> <AF50> <70C8> <AF51> <AF51> <70CF> <AF52> <AF52> <7239> <AF53> <AF53> <7279> <AF54> <AF54> <72FC> <AF55> <AF55> <72F9> <AF56> <AF56> <72FD> <AF57> <AF57> <72F8> <AF58> <AF58> <72F7> <AF59> <AF59> <7386> <AF5A> <AF5A> <73ED> <AF5B> <AF5B> <7409> <AF5C> <AF5C> <73EE> <AF5D> <AF5D> <73E0> <AF5E> <AF5E> <73EA> <AF5F> <AF5F> <73DE> <AF60> <AF60> <7554> <AF61> <AF61> <755D> <AF62> <AF62> <755C> <AF63> <AF63> <755A> <AF64> <AF64> <7559> <AF65> <AF65> <75BE> <AF66> <AF66> <75C5> <AF67> <AF67> <75C7> <AF68> <AF69> <75B2> <AF6A> <AF6A> <75BD> <AF6B> <AF6B> <75BC> <AF6C> <AF6C> <75B9> <AF6D> <AF6D> <75C2> <AF6E> <AF6E> <75B8> <AF6F> <AF6F> <768B> <AF70> <AF70> <76B0> <AF71> <AF71> <76CA> <AF72> <AF73> <76CD> <AF74> <AF74> <7729> <AF75> <AF76> <771F> <AF77> <AF77> <7728> <AF78> <AF78> <77E9> <AF79> <AF79> <7830> <AF7A> <AF7A> <7827> <AF7B> <AF7B> <7838> <AF7C> <AF7C> <781D> <AF7D> <AF7D> <7834> <AF7E> <AF7E> <7837> <AFA1> <AFA1> <7825> <AFA2> <AFA2> <782D> <AFA3> <AFA3> <7820> <AFA4> <AFA4> <781F> <AFA5> <AFA5> <7832> <AFA6> <AFA6> <7955> <AFA7> <AFA7> <7950> <AFA8> <AFA8> <7960> <AFA9> <AFA9> <795F> <AFAA> <AFAA> <7956> <AFAB> <AFAB> <795E> <AFAC> <AFAC> <795D> <AFAD> <AFAD> <7957> <AFAE> <AFAE> <795A> <AFAF> <AFAF> <79E4> <AFB0> <AFB0> <79E3> <AFB1> <AFB1> <79E7> <AFB2> <AFB2> <79DF> <AFB3> <AFB3> <79E6> <AFB4> <AFB4> <79E9> <AFB5> <AFB5> <79D8> <AFB6> <AFB6> <7A84> <AFB7> <AFB7> <7A88> <AFB8> <AFB8> <7AD9> <AFB9> <AFB9> <7B06> <AFBA> <AFBA> <7B11> <AFBB> <AFBB> <7C89> <AFBC> <AFBC> <7D21> <AFBD> <AFBD> <7D17> <AFBE> <AFBE> <7D0B> <AFBF> <AFBF> <7D0A> <AFC0> <AFC0> <7D20> <AFC1> <AFC1> <7D22> <AFC2> <AFC2> <7D14> <AFC3> <AFC3> <7D10> <AFC4> <AFC4> <7D15> <AFC5> <AFC5> <7D1A> <AFC6> <AFC6> <7D1C> <AFC7> <AFC7> <7D0D> <AFC8> <AFC8> <7D19> <AFC9> <AFC9> <7D1B> <AFCA> <AFCA> <7F3A> <AFCB> <AFCB> <7F5F> <AFCC> <AFCC> <7F94> endbfrange 100 beginbfrange <AFCD> <AFCD> <7FC5> <AFCE> <AFCE> <7FC1> <AFCF> <AFCF> <8006> <AFD0> <AFD0> <8018> <AFD1> <AFD1> <8015> <AFD2> <AFD2> <8019> <AFD3> <AFD3> <8017> <AFD4> <AFD4> <803D> <AFD5> <AFD5> <803F> <AFD6> <AFD6> <80F1> <AFD7> <AFD7> <8102> <AFD8> <AFD8> <80F0> <AFD9> <AFD9> <8105> <AFDA> <AFDA> <80ED> <AFDB> <AFDB> <80F4> <AFDC> <AFDC> <8106> <AFDD> <AFDD> <80F8> <AFDE> <AFDE> <80F3> <AFDF> <AFDF> <8108> <AFE0> <AFE0> <80FD> <AFE1> <AFE1> <810A> <AFE2> <AFE2> <80FC> <AFE3> <AFE3> <80EF> <AFE4> <AFE4> <81ED> <AFE5> <AFE5> <81EC> <AFE6> <AFE6> <8200> <AFE7> <AFE7> <8210> <AFE8> <AFE9> <822A> <AFEA> <AFEA> <8228> <AFEB> <AFEB> <822C> <AFEC> <AFEC> <82BB> <AFED> <AFED> <832B> <AFEE> <AFEE> <8352> <AFEF> <AFEF> <8354> <AFF0> <AFF0> <834A> <AFF1> <AFF1> <8338> <AFF2> <AFF2> <8350> <AFF3> <AFF3> <8349> <AFF4> <AFF4> <8335> <AFF5> <AFF5> <8334> <AFF6> <AFF6> <834F> <AFF7> <AFF7> <8332> <AFF8> <AFF8> <8339> <AFF9> <AFF9> <8336> <AFFA> <AFFA> <8317> <AFFB> <AFFB> <8340> <AFFC> <AFFC> <8331> <AFFD> <AFFD> <8328> <AFFE> <AFFE> <8343> <B040> <B040> <8654> <B041> <B041> <868A> <B042> <B042> <86AA> <B043> <B043> <8693> <B044> <B044> <86A4> <B045> <B045> <86A9> <B046> <B046> <868C> <B047> <B047> <86A3> <B048> <B048> <869C> <B049> <B049> <8870> <B04A> <B04A> <8877> <B04B> <B04C> <8881> <B04D> <B04D> <887D> <B04E> <B04E> <8879> <B04F> <B04F> <8A18> <B050> <B050> <8A10> <B051> <B051> <8A0E> <B052> <B052> <8A0C> <B053> <B053> <8A15> <B054> <B054> <8A0A> <B055> <B055> <8A17> <B056> <B056> <8A13> <B057> <B057> <8A16> <B058> <B058> <8A0F> <B059> <B059> <8A11> <B05A> <B05A> <8C48> <B05B> <B05B> <8C7A> <B05C> <B05C> <8C79> <B05D> <B05E> <8CA1> <B05F> <B05F> <8D77> <B060> <B060> <8EAC> <B061> <B061> <8ED2> <B062> <B062> <8ED4> <B063> <B063> <8ECF> <B064> <B064> <8FB1> <B065> <B065> <9001> <B066> <B066> <9006> <B067> <B067> <8FF7> <B068> <B068> <9000> <B069> <B069> <8FFA> <B06A> <B06A> <8FF4> <B06B> <B06B> <9003> <B06C> <B06C> <8FFD> <B06D> <B06D> <9005> <B06E> <B06E> <8FF8> <B06F> <B06F> <9095> <B070> <B070> <90E1> <B071> <B071> <90DD> <B072> <B072> <90E2> <B073> <B073> <9152> <B074> <B074> <914D> endbfrange 100 beginbfrange <B075> <B075> <914C> <B076> <B076> <91D8> <B077> <B077> <91DD> <B078> <B078> <91D7> <B079> <B079> <91DC> <B07A> <B07A> <91D9> <B07B> <B07B> <9583> <B07C> <B07D> <9662> <B07E> <B07E> <9661> <B0A1> <B0A1> <965B> <B0A2> <B0A2> <965D> <B0A3> <B0A3> <9664> <B0A4> <B0A4> <9658> <B0A5> <B0A5> <965E> <B0A6> <B0A6> <96BB> <B0A7> <B0A7> <98E2> <B0A8> <B0A8> <99AC> <B0A9> <B0A9> <9AA8> <B0AA> <B0AA> <9AD8> <B0AB> <B0AB> <9B25> <B0AC> <B0AC> <9B32> <B0AD> <B0AD> <9B3C> <B0AE> <B0AE> <4E7E> <B0AF> <B0AF> <507A> <B0B0> <B0B0> <507D> <B0B1> <B0B1> <505C> <B0B2> <B0B2> <5047> <B0B3> <B0B3> <5043> <B0B4> <B0B4> <504C> <B0B5> <B0B5> <505A> <B0B6> <B0B6> <5049> <B0B7> <B0B7> <5065> <B0B8> <B0B8> <5076> <B0B9> <B0B9> <504E> <B0BA> <B0BA> <5055> <B0BB> <B0BB> <5075> <B0BC> <B0BC> <5074> <B0BD> <B0BD> <5077> <B0BE> <B0BE> <504F> <B0BF> <B0BF> <500F> <B0C0> <B0C0> <506F> <B0C1> <B0C1> <506D> <B0C2> <B0C2> <515C> <B0C3> <B0C3> <5195> <B0C4> <B0C4> <51F0> <B0C5> <B0C5> <526A> <B0C6> <B0C6> <526F> <B0C7> <B0C7> <52D2> <B0C8> <B0C8> <52D9> <B0C9> <B0C9> <52D8> <B0CA> <B0CA> <52D5> <B0CB> <B0CB> <5310> <B0CC> <B0CC> <530F> <B0CD> <B0CD> <5319> <B0CE> <B0CF> <533F> <B0D0> <B0D0> <533E> <B0D1> <B0D1> <53C3> <B0D2> <B0D2> <66FC> <B0D3> <B0D3> <5546> <B0D4> <B0D4> <556A> <B0D5> <B0D5> <5566> <B0D6> <B0D6> <5544> <B0D7> <B0D7> <555E> <B0D8> <B0D8> <5561> <B0D9> <B0D9> <5543> <B0DA> <B0DA> <554A> <B0DB> <B0DB> <5531> <B0DC> <B0DC> <5556> <B0DD> <B0DD> <554F> <B0DE> <B0DE> <5555> <B0DF> <B0DF> <552F> <B0E0> <B0E0> <5564> <B0E1> <B0E1> <5538> <B0E2> <B0E2> <552E> <B0E3> <B0E3> <555C> <B0E4> <B0E4> <552C> <B0E5> <B0E5> <5563> <B0E6> <B0E6> <5533> <B0E7> <B0E7> <5541> <B0E8> <B0E8> <5557> <B0E9> <B0E9> <5708> <B0EA> <B0EA> <570B> <B0EB> <B0EB> <5709> <B0EC> <B0EC> <57DF> <B0ED> <B0ED> <5805> <B0EE> <B0EE> <580A> <B0EF> <B0EF> <5806> <B0F0> <B0F0> <57E0> <B0F1> <B0F1> <57E4> <B0F2> <B0F2> <57FA> <B0F3> <B0F3> <5802> <B0F4> <B0F4> <5835> <B0F5> <B0F5> <57F7> <B0F6> <B0F6> <57F9> <B0F7> <B0F7> <5920> <B0F8> <B0F8> <5962> <B0F9> <B0F9> <5A36> <B0FA> <B0FA> <5A41> <B0FB> <B0FB> <5A49> <B0FC> <B0FC> <5A66> endbfrange 100 beginbfrange <B0FD> <B0FD> <5A6A> <B0FE> <B0FE> <5A40> <B140> <B140> <5A3C> <B141> <B141> <5A62> <B142> <B142> <5A5A> <B143> <B143> <5A46> <B144> <B144> <5A4A> <B145> <B145> <5B70> <B146> <B146> <5BC7> <B147> <B147> <5BC5> <B148> <B148> <5BC4> <B149> <B149> <5BC2> <B14A> <B14A> <5BBF> <B14B> <B14B> <5BC6> <B14C> <B14C> <5C09> <B14D> <B14D> <5C08> <B14E> <B14E> <5C07> <B14F> <B14F> <5C60> <B150> <B151> <5C5C> <B152> <B152> <5D07> <B153> <B153> <5D06> <B154> <B154> <5D0E> <B155> <B155> <5D1B> <B156> <B156> <5D16> <B157> <B157> <5D22> <B158> <B158> <5D11> <B159> <B159> <5D29> <B15A> <B15A> <5D14> <B15B> <B15B> <5D19> <B15C> <B15C> <5D24> <B15D> <B15D> <5D27> <B15E> <B15E> <5D17> <B15F> <B15F> <5DE2> <B160> <B160> <5E38> <B161> <B161> <5E36> <B162> <B162> <5E33> <B163> <B163> <5E37> <B164> <B165> <5EB7> <B166> <B166> <5EB6> <B167> <B167> <5EB5> <B168> <B168> <5EBE> <B169> <B169> <5F35> <B16A> <B16A> <5F37> <B16B> <B16B> <5F57> <B16C> <B16C> <5F6C> <B16D> <B16D> <5F69> <B16E> <B16E> <5F6B> <B16F> <B16F> <5F97> <B170> <B170> <5F99> <B171> <B171> <5F9E> <B172> <B172> <5F98> <B173> <B173> <5FA1> <B174> <B174> <5FA0> <B175> <B175> <5F9C> <B176> <B176> <607F> <B177> <B177> <60A3> <B178> <B178> <6089> <B179> <B179> <60A0> <B17A> <B17A> <60A8> <B17B> <B17B> <60CB> <B17C> <B17C> <60B4> <B17D> <B17D> <60E6> <B17E> <B17E> <60BD> <B1A1> <B1A1> <60C5> <B1A2> <B1A2> <60BB> <B1A3> <B1A3> <60B5> <B1A4> <B1A4> <60DC> <B1A5> <B1A5> <60BC> <B1A6> <B1A6> <60D8> <B1A7> <B1A7> <60D5> <B1A8> <B1A8> <60C6> <B1A9> <B1A9> <60DF> <B1AA> <B1AA> <60B8> <B1AB> <B1AB> <60DA> <B1AC> <B1AC> <60C7> <B1AD> <B1AE> <621A> <B1AF> <B1AF> <6248> <B1B0> <B1B0> <63A0> <B1B1> <B1B1> <63A7> <B1B2> <B1B2> <6372> <B1B3> <B1B3> <6396> <B1B4> <B1B4> <63A2> <B1B5> <B1B5> <63A5> <B1B6> <B1B6> <6377> <B1B7> <B1B7> <6367> <B1B8> <B1B8> <6398> <B1B9> <B1B9> <63AA> <B1BA> <B1BA> <6371> <B1BB> <B1BB> <63A9> <B1BC> <B1BC> <6389> <B1BD> <B1BD> <6383> <B1BE> <B1BE> <639B> <B1BF> <B1BF> <636B> <B1C0> <B1C0> <63A8> <B1C1> <B1C1> <6384> <B1C2> <B1C2> <6388> <B1C3> <B1C3> <6399> <B1C4> <B1C4> <63A1> <B1C5> <B1C5> <63AC> <B1C6> <B1C6> <6392> endbfrange 100 beginbfrange <B1C7> <B1C7> <638F> <B1C8> <B1C8> <6380> <B1C9> <B1C9> <637B> <B1CA> <B1CA> <6369> <B1CB> <B1CB> <6368> <B1CC> <B1CC> <637A> <B1CD> <B1CD> <655D> <B1CE> <B1CE> <6556> <B1CF> <B1CF> <6551> <B1D0> <B1D0> <6559> <B1D1> <B1D1> <6557> <B1D2> <B1D2> <555F> <B1D3> <B1D3> <654F> <B1D4> <B1D4> <6558> <B1D5> <B1D5> <6555> <B1D6> <B1D6> <6554> <B1D7> <B1D7> <659C> <B1D8> <B1D8> <659B> <B1D9> <B1D9> <65AC> <B1DA> <B1DA> <65CF> <B1DB> <B1DC> <65CB> <B1DD> <B1DD> <65CE> <B1DE> <B1DE> <665D> <B1DF> <B1DF> <665A> <B1E0> <B1E0> <6664> <B1E1> <B1E1> <6668> <B1E2> <B1E2> <6666> <B1E3> <B1E3> <665E> <B1E4> <B1E4> <66F9> <B1E5> <B1E5> <52D7> <B1E6> <B1E6> <671B> <B1E7> <B1E7> <6881> <B1E8> <B1E8> <68AF> <B1E9> <B1E9> <68A2> <B1EA> <B1EA> <6893> <B1EB> <B1EB> <68B5> <B1EC> <B1EC> <687F> <B1ED> <B1ED> <6876> <B1EE> <B1EE> <68B1> <B1EF> <B1EF> <68A7> <B1F0> <B1F0> <6897> <B1F1> <B1F1> <68B0> <B1F2> <B1F2> <6883> <B1F3> <B1F3> <68C4> <B1F4> <B1F4> <68AD> <B1F5> <B1F5> <6886> <B1F6> <B1F6> <6885> <B1F7> <B1F7> <6894> <B1F8> <B1F8> <689D> <B1F9> <B1F9> <68A8> <B1FA> <B1FA> <689F> <B1FB> <B1FB> <68A1> <B1FC> <B1FC> <6882> <B1FD> <B1FD> <6B32> <B1FE> <B1FE> <6BBA> <B240> <B241> <6BEB> <B242> <B242> <6C2B> <B243> <B243> <6D8E> <B244> <B244> <6DBC> <B245> <B245> <6DF3> <B246> <B246> <6DD9> <B247> <B247> <6DB2> <B248> <B248> <6DE1> <B249> <B249> <6DCC> <B24A> <B24A> <6DE4> <B24B> <B24B> <6DFB> <B24C> <B24C> <6DFA> <B24D> <B24D> <6E05> <B24E> <B24E> <6DC7> <B24F> <B24F> <6DCB> <B250> <B250> <6DAF> <B251> <B251> <6DD1> <B252> <B252> <6DAE> <B253> <B253> <6DDE> <B254> <B254> <6DF9> <B255> <B255> <6DB8> <B256> <B256> <6DF7> <B257> <B257> <6DF5> <B258> <B258> <6DC5> <B259> <B259> <6DD2> <B25A> <B25A> <6E1A> <B25B> <B25B> <6DB5> <B25C> <B25C> <6DDA> <B25D> <B25D> <6DEB> <B25E> <B25E> <6DD8> <B25F> <B25F> <6DEA> <B260> <B260> <6DF1> <B261> <B261> <6DEE> <B262> <B262> <6DE8> <B263> <B263> <6DC6> <B264> <B264> <6DC4> <B265> <B265> <6DAA> <B266> <B266> <6DEC> <B267> <B267> <6DBF> <B268> <B268> <6DE6> <B269> <B269> <70F9> <B26A> <B26B> <7109> <B26C> <B26C> <70FD> <B26D> <B26D> <70EF> <B26E> <B26E> <723D> endbfrange 100 beginbfrange <B26F> <B26F> <727D> <B270> <B270> <7281> <B271> <B271> <731C> <B272> <B272> <731B> <B273> <B273> <7316> <B274> <B274> <7313> <B275> <B275> <7319> <B276> <B276> <7387> <B277> <B277> <7405> <B278> <B278> <740A> <B279> <B279> <7403> <B27A> <B27A> <7406> <B27B> <B27B> <73FE> <B27C> <B27C> <740D> <B27D> <B27D> <74E0> <B27E> <B27E> <74F6> <B2A1> <B2A1> <74F7> <B2A2> <B2A2> <751C> <B2A3> <B2A3> <7522> <B2A4> <B2A5> <7565> <B2A6> <B2A6> <7562> <B2A7> <B2A7> <7570> <B2A8> <B2A8> <758F> <B2A9> <B2AA> <75D4> <B2AB> <B2AB> <75B5> <B2AC> <B2AC> <75CA> <B2AD> <B2AD> <75CD> <B2AE> <B2AE> <768E> <B2AF> <B2AF> <76D4> <B2B0> <B2B0> <76D2> <B2B1> <B2B1> <76DB> <B2B2> <B2B2> <7737> <B2B3> <B2B3> <773E> <B2B4> <B2B4> <773C> <B2B5> <B2B5> <7736> <B2B6> <B2B6> <7738> <B2B7> <B2B7> <773A> <B2B8> <B2B8> <786B> <B2B9> <B2B9> <7843> <B2BA> <B2BA> <784E> <B2BB> <B2BB> <7965> <B2BC> <B2BC> <7968> <B2BD> <B2BD> <796D> <B2BE> <B2BE> <79FB> <B2BF> <B2BF> <7A92> <B2C0> <B2C0> <7A95> <B2C1> <B2C1> <7B20> <B2C2> <B2C2> <7B28> <B2C3> <B2C3> <7B1B> <B2C4> <B2C4> <7B2C> <B2C5> <B2C5> <7B26> <B2C6> <B2C6> <7B19> <B2C7> <B2C7> <7B1E> <B2C8> <B2C8> <7B2E> <B2C9> <B2C9> <7C92> <B2CA> <B2CA> <7C97> <B2CB> <B2CB> <7C95> <B2CC> <B2CC> <7D46> <B2CD> <B2CD> <7D43> <B2CE> <B2CE> <7D71> <B2CF> <B2CF> <7D2E> <B2D0> <B2D0> <7D39> <B2D1> <B2D1> <7D3C> <B2D2> <B2D2> <7D40> <B2D3> <B2D3> <7D30> <B2D4> <B2D4> <7D33> <B2D5> <B2D5> <7D44> <B2D6> <B2D6> <7D2F> <B2D7> <B2D7> <7D42> <B2D8> <B2D8> <7D32> <B2D9> <B2D9> <7D31> <B2DA> <B2DA> <7F3D> <B2DB> <B2DB> <7F9E> <B2DC> <B2DC> <7F9A> <B2DD> <B2DD> <7FCC> <B2DE> <B2DE> <7FCE> <B2DF> <B2DF> <7FD2> <B2E0> <B2E0> <801C> <B2E1> <B2E1> <804A> <B2E2> <B2E2> <8046> <B2E3> <B2E3> <812F> <B2E4> <B2E4> <8116> <B2E5> <B2E5> <8123> <B2E6> <B2E6> <812B> <B2E7> <B2E7> <8129> <B2E8> <B2E8> <8130> <B2E9> <B2E9> <8124> <B2EA> <B2EA> <8202> <B2EB> <B2EB> <8235> <B2EC> <B2EC> <8237> <B2ED> <B2ED> <8236> <B2EE> <B2EE> <8239> <B2EF> <B2EF> <838E> <B2F0> <B2F0> <839E> <B2F1> <B2F1> <8398> <B2F2> <B2F2> <8378> <B2F3> <B2F3> <83A2> <B2F4> <B2F4> <8396> <B2F5> <B2F5> <83BD> <B2F6> <B2F6> <83AB> endbfrange 100 beginbfrange <B2F7> <B2F7> <8392> <B2F8> <B2F8> <838A> <B2F9> <B2F9> <8393> <B2FA> <B2FA> <8389> <B2FB> <B2FB> <83A0> <B2FC> <B2FC> <8377> <B2FD> <B2FE> <837B> <B340> <B340> <8386> <B341> <B341> <83A7> <B342> <B342> <8655> <B343> <B343> <5F6A> <B344> <B344> <86C7> <B345> <B345> <86C0> <B346> <B346> <86B6> <B347> <B347> <86C4> <B348> <B348> <86B5> <B349> <B349> <86C6> <B34A> <B34A> <86CB> <B34B> <B34B> <86B1> <B34C> <B34C> <86AF> <B34D> <B34D> <86C9> <B34E> <B34E> <8853> <B34F> <B34F> <889E> <B350> <B350> <8888> <B351> <B351> <88AB> <B352> <B352> <8892> <B353> <B353> <8896> <B354> <B354> <888D> <B355> <B355> <888B> <B356> <B356> <8993> <B357> <B357> <898F> <B358> <B358> <8A2A> <B359> <B359> <8A1D> <B35A> <B35A> <8A23> <B35B> <B35B> <8A25> <B35C> <B35C> <8A31> <B35D> <B35D> <8A2D> <B35E> <B35E> <8A1F> <B35F> <B35F> <8A1B> <B360> <B360> <8A22> <B361> <B361> <8C49> <B362> <B362> <8C5A> <B363> <B363> <8CA9> <B364> <B364> <8CAC> <B365> <B365> <8CAB> <B366> <B366> <8CA8> <B367> <B367> <8CAA> <B368> <B368> <8CA7> <B369> <B369> <8D67> <B36A> <B36A> <8D66> <B36B> <B36B> <8DBE> <B36C> <B36C> <8DBA> <B36D> <B36D> <8EDB> <B36E> <B36E> <8EDF> <B36F> <B36F> <9019> <B370> <B370> <900D> <B371> <B371> <901A> <B372> <B372> <9017> <B373> <B373> <9023> <B374> <B374> <901F> <B375> <B375> <901D> <B376> <B376> <9010> <B377> <B377> <9015> <B378> <B378> <901E> <B379> <B379> <9020> <B37A> <B37A> <900F> <B37B> <B37B> <9022> <B37C> <B37C> <9016> <B37D> <B37D> <901B> <B37E> <B37E> <9014> <B3A1> <B3A1> <90E8> <B3A2> <B3A2> <90ED> <B3A3> <B3A3> <90FD> <B3A4> <B3A4> <9157> <B3A5> <B3A5> <91CE> <B3A6> <B3A6> <91F5> <B3A7> <B3A7> <91E6> <B3A8> <B3A8> <91E3> <B3A9> <B3A9> <91E7> <B3AA> <B3AA> <91ED> <B3AB> <B3AB> <91E9> <B3AC> <B3AC> <9589> <B3AD> <B3AD> <966A> <B3AE> <B3AE> <9675> <B3AF> <B3AF> <9673> <B3B0> <B3B0> <9678> <B3B1> <B3B1> <9670> <B3B2> <B3B2> <9674> <B3B3> <B3B4> <9676> <B3B5> <B3B5> <966C> <B3B6> <B3B6> <96C0> <B3B7> <B3B7> <96EA> <B3B8> <B3B8> <96E9> <B3B9> <B3B9> <7AE0> <B3BA> <B3BA> <7ADF> <B3BB> <B3BC> <9802> <B3BD> <B3BD> <9B5A> <B3BE> <B3BE> <9CE5> <B3BF> <B3BF> <9E75> <B3C0> <B3C0> <9E7F> endbfrange 100 beginbfrange <B3C1> <B3C1> <9EA5> <B3C2> <B3C2> <9EBB> <B3C3> <B3C3> <50A2> <B3C4> <B3C4> <508D> <B3C5> <B3C5> <5085> <B3C6> <B3C6> <5099> <B3C7> <B3C7> <5091> <B3C8> <B3C8> <5080> <B3C9> <B3C9> <5096> <B3CA> <B3CA> <5098> <B3CB> <B3CB> <509A> <B3CC> <B3CC> <6700> <B3CD> <B3CD> <51F1> <B3CE> <B3CE> <5272> <B3CF> <B3D0> <5274> <B3D1> <B3D1> <5269> <B3D2> <B3D2> <52DE> <B3D3> <B3D3> <52DD> <B3D4> <B3D4> <52DB> <B3D5> <B3D5> <535A> <B3D6> <B3D6> <53A5> <B3D7> <B3D7> <557B> <B3D8> <B3D8> <5580> <B3D9> <B3D9> <55A7> <B3DA> <B3DA> <557C> <B3DB> <B3DB> <558A> <B3DC> <B3DC> <559D> <B3DD> <B3DD> <5598> <B3DE> <B3DE> <5582> <B3DF> <B3DF> <559C> <B3E0> <B3E0> <55AA> <B3E1> <B3E1> <5594> <B3E2> <B3E2> <5587> <B3E3> <B3E3> <558B> <B3E4> <B3E4> <5583> <B3E5> <B3E5> <55B3> <B3E6> <B3E6> <55AE> <B3E7> <B3E7> <559F> <B3E8> <B3E8> <553E> <B3E9> <B3E9> <55B2> <B3EA> <B3EA> <559A> <B3EB> <B3EB> <55BB> <B3EC> <B3EC> <55AC> <B3ED> <B3ED> <55B1> <B3EE> <B3EE> <557E> <B3EF> <B3EF> <5589> <B3F0> <B3F0> <55AB> <B3F1> <B3F1> <5599> <B3F2> <B3F2> <570D> <B3F3> <B3F3> <582F> <B3F4> <B3F4> <582A> <B3F5> <B3F5> <5834> <B3F6> <B3F6> <5824> <B3F7> <B3F8> <5830> <B3F9> <B3F9> <5821> <B3FA> <B3FA> <581D> <B3FB> <B3FB> <5820> <B3FC> <B3FD> <58F9> <B3FE> <B3FE> <5960> <B440> <B440> <5A77> <B441> <B441> <5A9A> <B442> <B442> <5A7F> <B443> <B443> <5A92> <B444> <B444> <5A9B> <B445> <B445> <5AA7> <B446> <B446> <5B73> <B447> <B447> <5B71> <B448> <B448> <5BD2> <B449> <B449> <5BCC> <B44A> <B44A> <5BD3> <B44B> <B44B> <5BD0> <B44C> <B44D> <5C0A> <B44E> <B44E> <5C31> <B44F> <B44F> <5D4C> <B450> <B450> <5D50> <B451> <B451> <5D34> <B452> <B452> <5D47> <B453> <B453> <5DFD> <B454> <B454> <5E45> <B455> <B455> <5E3D> <B456> <B456> <5E40> <B457> <B457> <5E43> <B458> <B458> <5E7E> <B459> <B459> <5ECA> <B45A> <B45B> <5EC1> <B45C> <B45C> <5EC4> <B45D> <B45D> <5F3C> <B45E> <B45E> <5F6D> <B45F> <B460> <5FA9> <B461> <B461> <5FA8> <B462> <B462> <60D1> <B463> <B463> <60E1> <B464> <B464> <60B2> <B465> <B465> <60B6> <B466> <B466> <60E0> <B467> <B467> <611C> <B468> <B468> <6123> <B469> <B469> <60FA> <B46A> <B46A> <6115> <B46B> <B46B> <60F0> endbfrange 100 beginbfrange <B46C> <B46C> <60FB> <B46D> <B46D> <60F4> <B46E> <B46E> <6168> <B46F> <B46F> <60F1> <B470> <B470> <610E> <B471> <B471> <60F6> <B472> <B472> <6109> <B473> <B473> <6100> <B474> <B474> <6112> <B475> <B475> <621F> <B476> <B476> <6249> <B477> <B477> <63A3> <B478> <B478> <638C> <B479> <B479> <63CF> <B47A> <B47A> <63C0> <B47B> <B47B> <63E9> <B47C> <B47C> <63C9> <B47D> <B47D> <63C6> <B47E> <B47E> <63CD> <B4A1> <B4A1> <63D2> <B4A2> <B4A2> <63E3> <B4A3> <B4A3> <63D0> <B4A4> <B4A4> <63E1> <B4A5> <B4A5> <63D6> <B4A6> <B4A7> <63ED> <B4A8> <B4A8> <6376> <B4A9> <B4A9> <63F4> <B4AA> <B4AA> <63EA> <B4AB> <B4AB> <63DB> <B4AC> <B4AC> <6452> <B4AD> <B4AD> <63DA> <B4AE> <B4AE> <63F9> <B4AF> <B4AF> <655E> <B4B0> <B4B0> <6566> <B4B1> <B4B2> <6562> <B4B3> <B4B3> <6591> <B4B4> <B4B4> <6590> <B4B5> <B4B5> <65AF> <B4B6> <B4B6> <666E> <B4B7> <B4B7> <6670> <B4B8> <B4B8> <6674> <B4B9> <B4B9> <6676> <B4BA> <B4BA> <666F> <B4BB> <B4BB> <6691> <B4BC> <B4BC> <667A> <B4BD> <B4BD> <667E> <B4BE> <B4BE> <6677> <B4BF> <B4C0> <66FE> <B4C1> <B4C1> <671F> <B4C2> <B4C2> <671D> <B4C3> <B4C3> <68FA> <B4C4> <B4C4> <68D5> <B4C5> <B4C5> <68E0> <B4C6> <B4C6> <68D8> <B4C7> <B4C7> <68D7> <B4C8> <B4C8> <6905> <B4C9> <B4C9> <68DF> <B4CA> <B4CA> <68F5> <B4CB> <B4CB> <68EE> <B4CC> <B4CC> <68E7> <B4CD> <B4CD> <68F9> <B4CE> <B4CE> <68D2> <B4CF> <B4CF> <68F2> <B4D0> <B4D0> <68E3> <B4D1> <B4D1> <68CB> <B4D2> <B4D2> <68CD> <B4D3> <B4D3> <690D> <B4D4> <B4D4> <6912> <B4D5> <B4D5> <690E> <B4D6> <B4D6> <68C9> <B4D7> <B4D7> <68DA> <B4D8> <B4D8> <696E> <B4D9> <B4D9> <68FB> <B4DA> <B4DA> <6B3E> <B4DB> <B4DB> <6B3A> <B4DC> <B4DC> <6B3D> <B4DD> <B4DD> <6B98> <B4DE> <B4DE> <6B96> <B4DF> <B4DF> <6BBC> <B4E0> <B4E0> <6BEF> <B4E1> <B4E2> <6C2E> <B4E3> <B4E3> <6C2C> <B4E4> <B4E4> <6E2F> <B4E5> <B4E5> <6E38> <B4E6> <B4E6> <6E54> <B4E7> <B4E7> <6E21> <B4E8> <B4E8> <6E32> <B4E9> <B4E9> <6E67> <B4EA> <B4EA> <6E4A> <B4EB> <B4EB> <6E20> <B4EC> <B4EC> <6E25> <B4ED> <B4ED> <6E23> <B4EE> <B4EE> <6E1B> <B4EF> <B4EF> <6E5B> <B4F0> <B4F0> <6E58> <B4F1> <B4F1> <6E24> <B4F2> <B4F2> <6E56> <B4F3> <B4F3> <6E6E> <B4F4> <B4F4> <6E2D> <B4F5> <B4F5> <6E26> endbfrange 100 beginbfrange <B4F6> <B4F6> <6E6F> <B4F7> <B4F7> <6E34> <B4F8> <B4F8> <6E4D> <B4F9> <B4F9> <6E3A> <B4FA> <B4FA> <6E2C> <B4FB> <B4FB> <6E43> <B4FC> <B4FC> <6E1D> <B4FD> <B4FD> <6E3E> <B4FE> <B4FE> <6ECB> <B540> <B540> <6E89> <B541> <B541> <6E19> <B542> <B542> <6E4E> <B543> <B543> <6E63> <B544> <B544> <6E44> <B545> <B545> <6E72> <B546> <B546> <6E69> <B547> <B547> <6E5F> <B548> <B549> <7119> <B54A> <B54A> <7126> <B54B> <B54B> <7130> <B54C> <B54C> <7121> <B54D> <B54D> <7136> <B54E> <B54E> <716E> <B54F> <B54F> <711C> <B550> <B550> <724C> <B551> <B551> <7284> <B552> <B552> <7280> <B553> <B553> <7336> <B554> <B554> <7325> <B555> <B555> <7334> <B556> <B556> <7329> <B557> <B557> <743A> <B558> <B558> <742A> <B559> <B559> <7433> <B55A> <B55A> <7422> <B55B> <B55B> <7425> <B55C> <B55D> <7435> <B55E> <B55E> <7434> <B55F> <B55F> <742F> <B560> <B560> <741B> <B561> <B561> <7426> <B562> <B562> <7428> <B563> <B564> <7525> <B565> <B565> <756B> <B566> <B566> <756A> <B567> <B567> <75E2> <B568> <B568> <75DB> <B569> <B569> <75E3> <B56A> <B56A> <75D9> <B56B> <B56B> <75D8> <B56C> <B56C> <75DE> <B56D> <B56D> <75E0> <B56E> <B56F> <767B> <B570> <B570> <7696> <B571> <B571> <7693> <B572> <B572> <76B4> <B573> <B573> <76DC> <B574> <B574> <774F> <B575> <B575> <77ED> <B576> <B576> <785D> <B577> <B577> <786C> <B578> <B578> <786F> <B579> <B579> <7A0D> <B57A> <B57A> <7A08> <B57B> <B57B> <7A0B> <B57C> <B57C> <7A05> <B57D> <B57D> <7A00> <B57E> <B57E> <7A98> <B5A1> <B5A1> <7A97> <B5A2> <B5A2> <7A96> <B5A3> <B5A3> <7AE5> <B5A4> <B5A4> <7AE3> <B5A5> <B5A5> <7B49> <B5A6> <B5A6> <7B56> <B5A7> <B5A7> <7B46> <B5A8> <B5A8> <7B50> <B5A9> <B5A9> <7B52> <B5AA> <B5AA> <7B54> <B5AB> <B5AB> <7B4D> <B5AC> <B5AC> <7B4B> <B5AD> <B5AD> <7B4F> <B5AE> <B5AE> <7B51> <B5AF> <B5AF> <7C9F> <B5B0> <B5B0> <7CA5> <B5B1> <B5B1> <7D5E> <B5B2> <B5B2> <7D50> <B5B3> <B5B3> <7D68> <B5B4> <B5B4> <7D55> <B5B5> <B5B5> <7D2B> <B5B6> <B5B6> <7D6E> <B5B7> <B5B7> <7D72> <B5B8> <B5B8> <7D61> <B5B9> <B5B9> <7D66> <B5BA> <B5BA> <7D62> <B5BB> <B5BB> <7D70> <B5BC> <B5BC> <7D73> <B5BD> <B5BD> <5584> <B5BE> <B5BF> <7FD4> <B5C0> <B5C0> <800B> <B5C1> <B5C1> <8052> endbfrange 100 beginbfrange <B5C2> <B5C2> <8085> <B5C3> <B5C3> <8155> <B5C4> <B5C4> <8154> <B5C5> <B5C5> <814B> <B5C6> <B5C6> <8151> <B5C7> <B5C7> <814E> <B5C8> <B5C8> <8139> <B5C9> <B5C9> <8146> <B5CA> <B5CA> <813E> <B5CB> <B5CB> <814C> <B5CC> <B5CC> <8153> <B5CD> <B5CD> <8174> <B5CE> <B5CE> <8212> <B5CF> <B5CF> <821C> <B5D0> <B5D0> <83E9> <B5D1> <B5D1> <8403> <B5D2> <B5D2> <83F8> <B5D3> <B5D3> <840D> <B5D4> <B5D4> <83E0> <B5D5> <B5D5> <83C5> <B5D6> <B5D6> <840B> <B5D7> <B5D7> <83C1> <B5D8> <B5D8> <83EF> <B5D9> <B5D9> <83F1> <B5DA> <B5DA> <83F4> <B5DB> <B5DB> <8457> <B5DC> <B5DC> <840A> <B5DD> <B5DD> <83F0> <B5DE> <B5DE> <840C> <B5DF> <B5DF> <83CC> <B5E0> <B5E0> <83FD> <B5E1> <B5E1> <83F2> <B5E2> <B5E2> <83CA> <B5E3> <B5E3> <8438> <B5E4> <B5E4> <840E> <B5E5> <B5E5> <8404> <B5E6> <B5E6> <83DC> <B5E7> <B5E7> <8407> <B5E8> <B5E8> <83D4> <B5E9> <B5E9> <83DF> <B5EA> <B5EA> <865B> <B5EB> <B5EB> <86DF> <B5EC> <B5EC> <86D9> <B5ED> <B5ED> <86ED> <B5EE> <B5EE> <86D4> <B5EF> <B5EF> <86DB> <B5F0> <B5F0> <86E4> <B5F1> <B5F1> <86D0> <B5F2> <B5F2> <86DE> <B5F3> <B5F3> <8857> <B5F4> <B5F5> <88C1> <B5F6> <B5F6> <88B1> <B5F7> <B5F7> <8983> <B5F8> <B5F8> <8996> <B5F9> <B5F9> <8A3B> <B5FA> <B5FA> <8A60> <B5FB> <B5FB> <8A55> <B5FC> <B5FC> <8A5E> <B5FD> <B5FD> <8A3C> <B5FE> <B5FE> <8A41> <B640> <B640> <8A54> <B641> <B641> <8A5B> <B642> <B642> <8A50> <B643> <B643> <8A46> <B644> <B644> <8A34> <B645> <B645> <8A3A> <B646> <B646> <8A36> <B647> <B647> <8A56> <B648> <B648> <8C61> <B649> <B649> <8C82> <B64A> <B64A> <8CAF> <B64B> <B64B> <8CBC> <B64C> <B64C> <8CB3> <B64D> <B64D> <8CBD> <B64E> <B64E> <8CC1> <B64F> <B64F> <8CBB> <B650> <B650> <8CC0> <B651> <B651> <8CB4> <B652> <B652> <8CB7> <B653> <B653> <8CB6> <B654> <B654> <8CBF> <B655> <B655> <8CB8> <B656> <B656> <8D8A> <B657> <B657> <8D85> <B658> <B658> <8D81> <B659> <B659> <8DCE> <B65A> <B65A> <8DDD> <B65B> <B65B> <8DCB> <B65C> <B65C> <8DDA> <B65D> <B65D> <8DD1> <B65E> <B65E> <8DCC> <B65F> <B65F> <8DDB> <B660> <B660> <8DC6> <B661> <B661> <8EFB> <B662> <B662> <8EF8> <B663> <B663> <8EFC> <B664> <B664> <8F9C> <B665> <B665> <902E> <B666> <B666> <9035> <B667> <B667> <9031> endbfrange 100 beginbfrange <B668> <B668> <9038> <B669> <B669> <9032> <B66A> <B66A> <9036> <B66B> <B66B> <9102> <B66C> <B66C> <90F5> <B66D> <B66D> <9109> <B66E> <B66E> <90FE> <B66F> <B66F> <9163> <B670> <B670> <9165> <B671> <B671> <91CF> <B672> <B673> <9214> <B674> <B674> <9223> <B675> <B675> <9209> <B676> <B676> <921E> <B677> <B677> <920D> <B678> <B678> <9210> <B679> <B679> <9207> <B67A> <B67A> <9211> <B67B> <B67B> <9594> <B67C> <B67C> <958F> <B67D> <B67D> <958B> <B67E> <B67E> <9591> <B6A1> <B6A1> <9593> <B6A2> <B6A2> <9592> <B6A3> <B6A3> <958E> <B6A4> <B6A4> <968A> <B6A5> <B6A5> <968E> <B6A6> <B6A6> <968B> <B6A7> <B6A7> <967D> <B6A8> <B6A9> <9685> <B6AA> <B6AA> <968D> <B6AB> <B6AB> <9672> <B6AC> <B6AC> <9684> <B6AD> <B6AD> <96C1> <B6AE> <B6AE> <96C5> <B6AF> <B6AF> <96C4> <B6B0> <B6B1> <96C6> <B6B2> <B6B2> <96EF> <B6B3> <B6B3> <96F2> <B6B4> <B6B4> <97CC> <B6B5> <B6B6> <9805> <B6B7> <B6B7> <9808> <B6B8> <B6B8> <98E7> <B6B9> <B6B9> <98EA> <B6BA> <B6BA> <98EF> <B6BB> <B6BB> <98E9> <B6BC> <B6BC> <98F2> <B6BD> <B6BD> <98ED> <B6BE> <B6BE> <99AE> <B6BF> <B6BF> <99AD> <B6C0> <B6C0> <9EC3> <B6C1> <B6C1> <9ECD> <B6C2> <B6C2> <9ED1> <B6C3> <B6C3> <4E82> <B6C4> <B6C4> <50AD> <B6C5> <B6C5> <50B5> <B6C6> <B6C7> <50B2> <B6C8> <B6C8> <50C5> <B6C9> <B6C9> <50BE> <B6CA> <B6CA> <50AC> <B6CB> <B6CB> <50B7> <B6CC> <B6CC> <50BB> <B6CD> <B6CD> <50AF> <B6CE> <B6CE> <50C7> <B6CF> <B6CF> <527F> <B6D0> <B6D0> <5277> <B6D1> <B6D1> <527D> <B6D2> <B6D2> <52DF> <B6D3> <B6D3> <52E6> <B6D4> <B6D4> <52E4> <B6D5> <B6D6> <52E2> <B6D7> <B6D7> <532F> <B6D8> <B6D8> <55DF> <B6D9> <B6D9> <55E8> <B6DA> <B6DA> <55D3> <B6DB> <B6DB> <55E6> <B6DC> <B6DC> <55CE> <B6DD> <B6DD> <55DC> <B6DE> <B6DE> <55C7> <B6DF> <B6DF> <55D1> <B6E0> <B6E1> <55E3> <B6E2> <B6E2> <55EF> <B6E3> <B6E3> <55DA> <B6E4> <B6E4> <55E1> <B6E5> <B6E6> <55C5> <B6E7> <B6E7> <55E5> <B6E8> <B6E8> <55C9> <B6E9> <B6EA> <5712> <B6EB> <B6EB> <585E> <B6EC> <B6EC> <5851> <B6ED> <B6ED> <5858> <B6EE> <B6EE> <5857> <B6EF> <B6EF> <585A> <B6F0> <B6F0> <5854> <B6F1> <B6F1> <586B> <B6F2> <B6F2> <584C> <B6F3> <B6F3> <586D> <B6F4> <B6F4> <584A> <B6F5> <B6F5> <5862> <B6F6> <B6F6> <5852> endbfrange 100 beginbfrange <B6F7> <B6F7> <584B> <B6F8> <B6F8> <5967> <B6F9> <B6F9> <5AC1> <B6FA> <B6FA> <5AC9> <B6FB> <B6FB> <5ACC> <B6FC> <B6FC> <5ABE> <B6FD> <B6FD> <5ABD> <B6FE> <B6FE> <5ABC> <B740> <B740> <5AB3> <B741> <B741> <5AC2> <B742> <B742> <5AB2> <B743> <B743> <5D69> <B744> <B744> <5D6F> <B745> <B745> <5E4C> <B746> <B746> <5E79> <B747> <B747> <5EC9> <B748> <B748> <5EC8> <B749> <B749> <5F12> <B74A> <B74A> <5F59> <B74B> <B74B> <5FAC> <B74C> <B74C> <5FAE> <B74D> <B74D> <611A> <B74E> <B74E> <610F> <B74F> <B74F> <6148> <B750> <B750> <611F> <B751> <B751> <60F3> <B752> <B752> <611B> <B753> <B753> <60F9> <B754> <B754> <6101> <B755> <B755> <6108> <B756> <B756> <614E> <B757> <B757> <614C> <B758> <B758> <6144> <B759> <B759> <614D> <B75A> <B75A> <613E> <B75B> <B75B> <6134> <B75C> <B75C> <6127> <B75D> <B75D> <610D> <B75E> <B75E> <6106> <B75F> <B75F> <6137> <B760> <B761> <6221> <B762> <B762> <6413> <B763> <B763> <643E> <B764> <B764> <641E> <B765> <B765> <642A> <B766> <B766> <642D> <B767> <B767> <643D> <B768> <B768> <642C> <B769> <B769> <640F> <B76A> <B76A> <641C> <B76B> <B76B> <6414> <B76C> <B76C> <640D> <B76D> <B76D> <6436> <B76E> <B76F> <6416> <B770> <B770> <6406> <B771> <B771> <656C> <B772> <B772> <659F> <B773> <B773> <65B0> <B774> <B774> <6697> <B775> <B775> <6689> <B776> <B777> <6687> <B778> <B778> <6696> <B779> <B779> <6684> <B77A> <B77A> <6698> <B77B> <B77B> <668D> <B77C> <B77C> <6703> <B77D> <B77D> <6994> <B77E> <B77E> <696D> <B7A1> <B7A1> <695A> <B7A2> <B7A2> <6977> <B7A3> <B7A3> <6960> <B7A4> <B7A4> <6954> <B7A5> <B7A5> <6975> <B7A6> <B7A6> <6930> <B7A7> <B7A7> <6982> <B7A8> <B7A8> <694A> <B7A9> <B7A9> <6968> <B7AA> <B7AA> <696B> <B7AB> <B7AB> <695E> <B7AC> <B7AC> <6953> <B7AD> <B7AD> <6979> <B7AE> <B7AE> <6986> <B7AF> <B7AF> <695D> <B7B0> <B7B0> <6963> <B7B1> <B7B1> <695B> <B7B2> <B7B2> <6B47> <B7B3> <B7B3> <6B72> <B7B4> <B7B4> <6BC0> <B7B5> <B7B5> <6BBF> <B7B6> <B7B6> <6BD3> <B7B7> <B7B7> <6BFD> <B7B8> <B7B8> <6EA2> <B7B9> <B7B9> <6EAF> <B7BA> <B7BA> <6ED3> <B7BB> <B7BB> <6EB6> <B7BC> <B7BC> <6EC2> <B7BD> <B7BD> <6E90> <B7BE> <B7BE> <6E9D> <B7BF> <B7BF> <6EC7> <B7C0> <B7C0> <6EC5> endbfrange 100 beginbfrange <B7C1> <B7C1> <6EA5> <B7C2> <B7C2> <6E98> <B7C3> <B7C3> <6EBC> <B7C4> <B7C4> <6EBA> <B7C5> <B7C5> <6EAB> <B7C6> <B7C6> <6ED1> <B7C7> <B7C7> <6E96> <B7C8> <B7C8> <6E9C> <B7C9> <B7C9> <6EC4> <B7CA> <B7CA> <6ED4> <B7CB> <B7CB> <6EAA> <B7CC> <B7CC> <6EA7> <B7CD> <B7CD> <6EB4> <B7CE> <B7CE> <714E> <B7CF> <B7CF> <7159> <B7D0> <B7D0> <7169> <B7D1> <B7D1> <7164> <B7D2> <B7D2> <7149> <B7D3> <B7D3> <7167> <B7D4> <B7D4> <715C> <B7D5> <B7D5> <716C> <B7D6> <B7D6> <7166> <B7D7> <B7D7> <714C> <B7D8> <B7D8> <7165> <B7D9> <B7D9> <715E> <B7DA> <B7DA> <7146> <B7DB> <B7DB> <7168> <B7DC> <B7DC> <7156> <B7DD> <B7DD> <723A> <B7DE> <B7DE> <7252> <B7DF> <B7DF> <7337> <B7E0> <B7E0> <7345> <B7E1> <B7E1> <733F> <B7E2> <B7E2> <733E> <B7E3> <B7E3> <746F> <B7E4> <B7E4> <745A> <B7E5> <B7E5> <7455> <B7E6> <B7E6> <745F> <B7E7> <B7E7> <745E> <B7E8> <B7E8> <7441> <B7E9> <B7E9> <743F> <B7EA> <B7EA> <7459> <B7EB> <B7EC> <745B> <B7ED> <B7ED> <7576> <B7EE> <B7EE> <7578> <B7EF> <B7EF> <7600> <B7F0> <B7F0> <75F0> <B7F1> <B7F1> <7601> <B7F2> <B7F2> <75F2> <B7F3> <B7F3> <75F1> <B7F4> <B7F4> <75FA> <B7F5> <B7F5> <75FF> <B7F6> <B7F6> <75F4> <B7F7> <B7F7> <75F3> <B7F8> <B7F9> <76DE> <B7FA> <B7FA> <775B> <B7FB> <B7FB> <776B> <B7FC> <B7FC> <7766> <B7FD> <B7FD> <775E> <B7FE> <B7FE> <7763> <B840> <B840> <7779> <B841> <B841> <776A> <B842> <B842> <776C> <B843> <B843> <775C> <B844> <B844> <7765> <B845> <B845> <7768> <B846> <B846> <7762> <B847> <B847> <77EE> <B848> <B848> <788E> <B849> <B849> <78B0> <B84A> <B84B> <7897> <B84C> <B84C> <788C> <B84D> <B84D> <7889> <B84E> <B84E> <787C> <B84F> <B84F> <7891> <B850> <B850> <7893> <B851> <B851> <787F> <B852> <B852> <797A> <B853> <B853> <797F> <B854> <B854> <7981> <B855> <B855> <842C> <B856> <B856> <79BD> <B857> <B857> <7A1C> <B858> <B858> <7A1A> <B859> <B859> <7A20> <B85A> <B85A> <7A14> <B85B> <B85B> <7A1F> <B85C> <B85C> <7A1E> <B85D> <B85E> <7A9F> <B85F> <B85F> <7B77> <B860> <B860> <7BC0> <B861> <B861> <7B60> <B862> <B862> <7B6E> <B863> <B863> <7B67> <B864> <B864> <7CB1> <B865> <B865> <7CB3> <B866> <B866> <7CB5> <B867> <B867> <7D93> <B868> <B868> <7D79> <B869> <B869> <7D91> endbfrange 100 beginbfrange <B86A> <B86A> <7D81> <B86B> <B86B> <7D8F> <B86C> <B86C> <7D5B> <B86D> <B86D> <7F6E> <B86E> <B86F> <7F69> <B870> <B870> <7F72> <B871> <B871> <7FA9> <B872> <B872> <7FA8> <B873> <B873> <7FA4> <B874> <B874> <8056> <B875> <B875> <8058> <B876> <B876> <8086> <B877> <B877> <8084> <B878> <B878> <8171> <B879> <B879> <8170> <B87A> <B87A> <8178> <B87B> <B87B> <8165> <B87C> <B87C> <816E> <B87D> <B87D> <8173> <B87E> <B87E> <816B> <B8A1> <B8A2> <8179> <B8A3> <B8A3> <8166> <B8A4> <B8A4> <8205> <B8A5> <B8A5> <8247> <B8A6> <B8A6> <8482> <B8A7> <B8A7> <8477> <B8A8> <B8A8> <843D> <B8A9> <B8A9> <8431> <B8AA> <B8AA> <8475> <B8AB> <B8AB> <8466> <B8AC> <B8AC> <846B> <B8AD> <B8AD> <8449> <B8AE> <B8AE> <846C> <B8AF> <B8AF> <845B> <B8B0> <B8B0> <843C> <B8B1> <B8B1> <8435> <B8B2> <B8B2> <8461> <B8B3> <B8B3> <8463> <B8B4> <B8B4> <8469> <B8B5> <B8B5> <846D> <B8B6> <B8B6> <8446> <B8B7> <B8B7> <865E> <B8B8> <B8B8> <865C> <B8B9> <B8B9> <865F> <B8BA> <B8BA> <86F9> <B8BB> <B8BB> <8713> <B8BC> <B8BC> <8708> <B8BD> <B8BD> <8707> <B8BE> <B8BE> <8700> <B8BF> <B8BF> <86FE> <B8C0> <B8C0> <86FB> <B8C1> <B8C2> <8702> <B8C3> <B8C3> <8706> <B8C4> <B8C4> <870A> <B8C5> <B8C5> <8859> <B8C6> <B8C6> <88DF> <B8C7> <B8C7> <88D4> <B8C8> <B8C8> <88D9> <B8C9> <B8C9> <88DC> <B8CA> <B8CA> <88D8> <B8CB> <B8CB> <88DD> <B8CC> <B8CC> <88E1> <B8CD> <B8CD> <88CA> <B8CE> <B8CE> <88D5> <B8CF> <B8CF> <88D2> <B8D0> <B8D0> <899C> <B8D1> <B8D1> <89E3> <B8D2> <B8D2> <8A6B> <B8D3> <B8D4> <8A72> <B8D5> <B8D5> <8A66> <B8D6> <B8D6> <8A69> <B8D7> <B8D7> <8A70> <B8D8> <B8D8> <8A87> <B8D9> <B8D9> <8A7C> <B8DA> <B8DA> <8A63> <B8DB> <B8DB> <8AA0> <B8DC> <B8DC> <8A71> <B8DD> <B8DD> <8A85> <B8DE> <B8DE> <8A6D> <B8DF> <B8DF> <8A62> <B8E0> <B8E0> <8A6E> <B8E1> <B8E1> <8A6C> <B8E2> <B8E2> <8A79> <B8E3> <B8E3> <8A7B> <B8E4> <B8E4> <8A3E> <B8E5> <B8E5> <8A68> <B8E6> <B8E6> <8C62> <B8E7> <B8E7> <8C8A> <B8E8> <B8E8> <8C89> <B8E9> <B8E9> <8CCA> <B8EA> <B8EB> <8CC7> <B8EC> <B8EC> <8CC4> <B8ED> <B8ED> <8CB2> <B8EE> <B8EE> <8CC3> <B8EF> <B8EF> <8CC2> <B8F0> <B8F0> <8CC5> <B8F1> <B8F1> <8DE1> <B8F2> <B8F2> <8DDF> <B8F3> <B8F3> <8DE8> <B8F4> <B8F4> <8DEF> endbfrange 100 beginbfrange <B8F5> <B8F5> <8DF3> <B8F6> <B8F6> <8DFA> <B8F7> <B8F7> <8DEA> <B8F8> <B8F8> <8DE4> <B8F9> <B8F9> <8DE6> <B8FA> <B8FA> <8EB2> <B8FB> <B8FB> <8F03> <B8FC> <B8FC> <8F09> <B8FD> <B8FD> <8EFE> <B8FE> <B8FE> <8F0A> <B940> <B940> <8F9F> <B941> <B941> <8FB2> <B942> <B942> <904B> <B943> <B943> <904A> <B944> <B944> <9053> <B945> <B945> <9042> <B946> <B946> <9054> <B947> <B947> <903C> <B948> <B948> <9055> <B949> <B949> <9050> <B94A> <B94A> <9047> <B94B> <B94B> <904F> <B94C> <B94C> <904E> <B94D> <B94D> <904D> <B94E> <B94E> <9051> <B94F> <B94F> <903E> <B950> <B950> <9041> <B951> <B951> <9112> <B952> <B952> <9117> <B953> <B953> <916C> <B954> <B954> <916A> <B955> <B955> <9169> <B956> <B956> <91C9> <B957> <B957> <9237> <B958> <B958> <9257> <B959> <B959> <9238> <B95A> <B95A> <923D> <B95B> <B95B> <9240> <B95C> <B95C> <923E> <B95D> <B95D> <925B> <B95E> <B95E> <924B> <B95F> <B95F> <9264> <B960> <B960> <9251> <B961> <B961> <9234> <B962> <B962> <9249> <B963> <B963> <924D> <B964> <B964> <9245> <B965> <B965> <9239> <B966> <B966> <923F> <B967> <B967> <925A> <B968> <B968> <9598> <B969> <B969> <9698> <B96A> <B96B> <9694> <B96C> <B96C> <96CD> <B96D> <B96D> <96CB> <B96E> <B96F> <96C9> <B970> <B970> <96F7> <B971> <B971> <96FB> <B972> <B972> <96F9> <B973> <B973> <96F6> <B974> <B974> <9756> <B975> <B975> <9774> <B976> <B976> <9776> <B977> <B978> <9810> <B979> <B979> <9813> <B97A> <B97A> <980A> <B97B> <B97B> <9812> <B97C> <B97C> <980C> <B97D> <B97D> <98FC> <B97E> <B97E> <98F4> <B9A1> <B9A2> <98FD> <B9A3> <B9A3> <99B3> <B9A4> <B9A4> <99B1> <B9A5> <B9A5> <99B4> <B9A6> <B9A6> <9AE1> <B9A7> <B9A7> <9CE9> <B9A8> <B9A8> <9E82> <B9A9> <B9A9> <9F0E> <B9AA> <B9AA> <9F13> <B9AB> <B9AB> <9F20> <B9AC> <B9AC> <50E7> <B9AD> <B9AD> <50EE> <B9AE> <B9AE> <50E5> <B9AF> <B9AF> <50D6> <B9B0> <B9B0> <50ED> <B9B1> <B9B1> <50DA> <B9B2> <B9B2> <50D5> <B9B3> <B9B3> <50CF> <B9B4> <B9B4> <50D1> <B9B5> <B9B5> <50F1> <B9B6> <B9B6> <50CE> <B9B7> <B9B7> <50E9> <B9B8> <B9B8> <5162> <B9B9> <B9B9> <51F3> <B9BA> <B9BA> <5283> <B9BB> <B9BB> <5282> <B9BC> <B9BC> <5331> <B9BD> <B9BD> <53AD> <B9BE> <B9BE> <55FE> <B9BF> <B9BF> <5600> endbfrange 100 beginbfrange <B9C0> <B9C0> <561B> <B9C1> <B9C1> <5617> <B9C2> <B9C2> <55FD> <B9C3> <B9C3> <5614> <B9C4> <B9C4> <5606> <B9C5> <B9C5> <5609> <B9C6> <B9C7> <560D> <B9C8> <B9C8> <55F7> <B9C9> <B9C9> <5616> <B9CA> <B9CA> <561F> <B9CB> <B9CB> <5608> <B9CC> <B9CC> <5610> <B9CD> <B9CD> <55F6> <B9CE> <B9CE> <5718> <B9CF> <B9CF> <5716> <B9D0> <B9D0> <5875> <B9D1> <B9D1> <587E> <B9D2> <B9D2> <5883> <B9D3> <B9D3> <5893> <B9D4> <B9D4> <588A> <B9D5> <B9D5> <5879> <B9D6> <B9D6> <5885> <B9D7> <B9D7> <587D> <B9D8> <B9D8> <58FD> <B9D9> <B9D9> <5925> <B9DA> <B9DA> <5922> <B9DB> <B9DB> <5924> <B9DC> <B9DC> <596A> <B9DD> <B9DD> <5969> <B9DE> <B9DE> <5AE1> <B9DF> <B9DF> <5AE6> <B9E0> <B9E0> <5AE9> <B9E1> <B9E1> <5AD7> <B9E2> <B9E2> <5AD6> <B9E3> <B9E3> <5AD8> <B9E4> <B9E4> <5AE3> <B9E5> <B9E5> <5B75> <B9E6> <B9E6> <5BDE> <B9E7> <B9E7> <5BE7> <B9E8> <B9E8> <5BE1> <B9E9> <B9EA> <5BE5> <B9EB> <B9EB> <5BE8> <B9EC> <B9EC> <5BE2> <B9ED> <B9ED> <5BE4> <B9EE> <B9EE> <5BDF> <B9EF> <B9EF> <5C0D> <B9F0> <B9F0> <5C62> <B9F1> <B9F1> <5D84> <B9F2> <B9F2> <5D87> <B9F3> <B9F3> <5E5B> <B9F4> <B9F4> <5E63> <B9F5> <B9F5> <5E55> <B9F6> <B9F6> <5E57> <B9F7> <B9F7> <5E54> <B9F8> <B9F8> <5ED3> <B9F9> <B9F9> <5ED6> <B9FA> <B9FA> <5F0A> <B9FB> <B9FB> <5F46> <B9FC> <B9FC> <5F70> <B9FD> <B9FD> <5FB9> <B9FE> <B9FE> <6147> <BA40> <BA40> <613F> <BA41> <BA41> <614B> <BA42> <BA42> <6177> <BA43> <BA44> <6162> <BA45> <BA45> <615F> <BA46> <BA46> <615A> <BA47> <BA47> <6158> <BA48> <BA48> <6175> <BA49> <BA49> <622A> <BA4A> <BA4A> <6487> <BA4B> <BA4B> <6458> <BA4C> <BA4C> <6454> <BA4D> <BA4D> <64A4> <BA4E> <BA4E> <6478> <BA4F> <BA4F> <645F> <BA50> <BA50> <647A> <BA51> <BA51> <6451> <BA52> <BA52> <6467> <BA53> <BA53> <6434> <BA54> <BA54> <646D> <BA55> <BA55> <647B> <BA56> <BA56> <6572> <BA57> <BA57> <65A1> <BA58> <BA58> <65D7> <BA59> <BA59> <65D6> <BA5A> <BA5A> <66A2> <BA5B> <BA5B> <66A8> <BA5C> <BA5C> <669D> <BA5D> <BA5D> <699C> <BA5E> <BA5E> <69A8> <BA5F> <BA5F> <6995> <BA60> <BA60> <69C1> <BA61> <BA61> <69AE> <BA62> <BA62> <69D3> <BA63> <BA63> <69CB> <BA64> <BA64> <699B> <BA65> <BA65> <69B7> <BA66> <BA66> <69BB> <BA67> <BA67> <69AB> endbfrange 100 beginbfrange <BA68> <BA68> <69B4> <BA69> <BA69> <69D0> <BA6A> <BA6A> <69CD> <BA6B> <BA6B> <69AD> <BA6C> <BA6C> <69CC> <BA6D> <BA6D> <69A6> <BA6E> <BA6E> <69C3> <BA6F> <BA6F> <69A3> <BA70> <BA70> <6B49> <BA71> <BA71> <6B4C> <BA72> <BA72> <6C33> <BA73> <BA73> <6F33> <BA74> <BA74> <6F14> <BA75> <BA75> <6EFE> <BA76> <BA76> <6F13> <BA77> <BA77> <6EF4> <BA78> <BA78> <6F29> <BA79> <BA79> <6F3E> <BA7A> <BA7A> <6F20> <BA7B> <BA7B> <6F2C> <BA7C> <BA7C> <6F0F> <BA7D> <BA7D> <6F02> <BA7E> <BA7E> <6F22> <BAA1> <BAA1> <6EFF> <BAA2> <BAA2> <6EEF> <BAA3> <BAA3> <6F06> <BAA4> <BAA4> <6F31> <BAA5> <BAA5> <6F38> <BAA6> <BAA6> <6F32> <BAA7> <BAA7> <6F23> <BAA8> <BAA8> <6F15> <BAA9> <BAA9> <6F2B> <BAAA> <BAAA> <6F2F> <BAAB> <BAAB> <6F88> <BAAC> <BAAC> <6F2A> <BAAD> <BAAD> <6EEC> <BAAE> <BAAE> <6F01> <BAAF> <BAAF> <6EF2> <BAB0> <BAB0> <6ECC> <BAB1> <BAB1> <6EF7> <BAB2> <BAB2> <7194> <BAB3> <BAB3> <7199> <BAB4> <BAB4> <717D> <BAB5> <BAB5> <718A> <BAB6> <BAB6> <7184> <BAB7> <BAB7> <7192> <BAB8> <BAB8> <723E> <BAB9> <BAB9> <7292> <BABA> <BABA> <7296> <BABB> <BABB> <7344> <BABC> <BABC> <7350> <BABD> <BABD> <7464> <BABE> <BABE> <7463> <BABF> <BABF> <746A> <BAC0> <BAC0> <7470> <BAC1> <BAC1> <746D> <BAC2> <BAC2> <7504> <BAC3> <BAC3> <7591> <BAC4> <BAC4> <7627> <BAC5> <BAC5> <760D> <BAC6> <BAC6> <760B> <BAC7> <BAC7> <7609> <BAC8> <BAC8> <7613> <BAC9> <BAC9> <76E1> <BACA> <BACA> <76E3> <BACB> <BACB> <7784> <BACC> <BACC> <777D> <BACD> <BACD> <777F> <BACE> <BACE> <7761> <BACF> <BACF> <78C1> <BAD0> <BAD0> <789F> <BAD1> <BAD1> <78A7> <BAD2> <BAD2> <78B3> <BAD3> <BAD3> <78A9> <BAD4> <BAD4> <78A3> <BAD5> <BAD6> <798E> <BAD7> <BAD7> <798D> <BAD8> <BAD8> <7A2E> <BAD9> <BAD9> <7A31> <BADA> <BADA> <7AAA> <BADB> <BADB> <7AA9> <BADC> <BADC> <7AED> <BADD> <BADD> <7AEF> <BADE> <BADE> <7BA1> <BADF> <BADF> <7B95> <BAE0> <BAE0> <7B8B> <BAE1> <BAE1> <7B75> <BAE2> <BAE2> <7B97> <BAE3> <BAE3> <7B9D> <BAE4> <BAE4> <7B94> <BAE5> <BAE5> <7B8F> <BAE6> <BAE6> <7BB8> <BAE7> <BAE7> <7B87> <BAE8> <BAE8> <7B84> <BAE9> <BAE9> <7CB9> <BAEA> <BAEB> <7CBD> <BAEC> <BAEC> <7DBB> <BAED> <BAED> <7DB0> <BAEE> <BAEE> <7D9C> <BAEF> <BAF0> <7DBD> endbfrange 100 beginbfrange <BAF1> <BAF1> <7DA0> <BAF2> <BAF2> <7DCA> <BAF3> <BAF3> <7DB4> <BAF4> <BAF4> <7DB2> <BAF5> <BAF5> <7DB1> <BAF6> <BAF6> <7DBA> <BAF7> <BAF7> <7DA2> <BAF8> <BAF8> <7DBF> <BAF9> <BAF9> <7DB5> <BAFA> <BAFA> <7DB8> <BAFB> <BAFB> <7DAD> <BAFC> <BAFC> <7DD2> <BAFD> <BAFD> <7DC7> <BAFE> <BAFE> <7DAC> <BB40> <BB40> <7F70> <BB41> <BB42> <7FE0> <BB43> <BB43> <7FDF> <BB44> <BB44> <805E> <BB45> <BB45> <805A> <BB46> <BB46> <8087> <BB47> <BB47> <8150> <BB48> <BB48> <8180> <BB49> <BB49> <818F> <BB4A> <BB4A> <8188> <BB4B> <BB4B> <818A> <BB4C> <BB4C> <817F> <BB4D> <BB4D> <8182> <BB4E> <BB4E> <81E7> <BB4F> <BB4F> <81FA> <BB50> <BB50> <8207> <BB51> <BB51> <8214> <BB52> <BB52> <821E> <BB53> <BB53> <824B> <BB54> <BB54> <84C9> <BB55> <BB55> <84BF> <BB56> <BB56> <84C6> <BB57> <BB57> <84C4> <BB58> <BB58> <8499> <BB59> <BB59> <849E> <BB5A> <BB5A> <84B2> <BB5B> <BB5B> <849C> <BB5C> <BB5C> <84CB> <BB5D> <BB5D> <84B8> <BB5E> <BB5E> <84C0> <BB5F> <BB5F> <84D3> <BB60> <BB60> <8490> <BB61> <BB61> <84BC> <BB62> <BB62> <84D1> <BB63> <BB63> <84CA> <BB64> <BB64> <873F> <BB65> <BB65> <871C> <BB66> <BB66> <873B> <BB67> <BB67> <8722> <BB68> <BB68> <8725> <BB69> <BB69> <8734> <BB6A> <BB6A> <8718> <BB6B> <BB6B> <8755> <BB6C> <BB6C> <8737> <BB6D> <BB6D> <8729> <BB6E> <BB6E> <88F3> <BB6F> <BB6F> <8902> <BB70> <BB70> <88F4> <BB71> <BB71> <88F9> <BB72> <BB72> <88F8> <BB73> <BB73> <88FD> <BB74> <BB74> <88E8> <BB75> <BB75> <891A> <BB76> <BB76> <88EF> <BB77> <BB77> <8AA6> <BB78> <BB78> <8A8C> <BB79> <BB79> <8A9E> <BB7A> <BB7A> <8AA3> <BB7B> <BB7B> <8A8D> <BB7C> <BB7C> <8AA1> <BB7D> <BB7D> <8A93> <BB7E> <BB7E> <8AA4> <BBA1> <BBA1> <8AAA> <BBA2> <BBA2> <8AA5> <BBA3> <BBA3> <8AA8> <BBA4> <BBA4> <8A98> <BBA5> <BBA5> <8A91> <BBA6> <BBA6> <8A9A> <BBA7> <BBA7> <8AA7> <BBA8> <BBA8> <8C6A> <BBA9> <BBA9> <8C8D> <BBAA> <BBAA> <8C8C> <BBAB> <BBAB> <8CD3> <BBAC> <BBAD> <8CD1> <BBAE> <BBAE> <8D6B> <BBAF> <BBAF> <8D99> <BBB0> <BBB0> <8D95> <BBB1> <BBB1> <8DFC> <BBB2> <BBB2> <8F14> <BBB3> <BBB3> <8F12> <BBB4> <BBB4> <8F15> <BBB5> <BBB5> <8F13> <BBB6> <BBB6> <8FA3> <BBB7> <BBB7> <9060> <BBB8> <BBB8> <9058> <BBB9> <BBB9> <905C> endbfrange 100 beginbfrange <BBBA> <BBBA> <9063> <BBBB> <BBBB> <9059> <BBBC> <BBBC> <905E> <BBBD> <BBBD> <9062> <BBBE> <BBBE> <905D> <BBBF> <BBBF> <905B> <BBC0> <BBC0> <9119> <BBC1> <BBC1> <9118> <BBC2> <BBC2> <911E> <BBC3> <BBC3> <9175> <BBC4> <BBC4> <9178> <BBC5> <BBC5> <9177> <BBC6> <BBC6> <9174> <BBC7> <BBC7> <9278> <BBC8> <BBC8> <9280> <BBC9> <BBC9> <9285> <BBCA> <BBCA> <9298> <BBCB> <BBCB> <9296> <BBCC> <BBCC> <927B> <BBCD> <BBCD> <9293> <BBCE> <BBCE> <929C> <BBCF> <BBCF> <92A8> <BBD0> <BBD0> <927C> <BBD1> <BBD1> <9291> <BBD2> <BBD2> <95A1> <BBD3> <BBD4> <95A8> <BBD5> <BBD5> <95A3> <BBD6> <BBD6> <95A5> <BBD7> <BBD7> <95A4> <BBD8> <BBD8> <9699> <BBD9> <BBD9> <969C> <BBDA> <BBDA> <969B> <BBDB> <BBDB> <96CC> <BBDC> <BBDC> <96D2> <BBDD> <BBDD> <9700> <BBDE> <BBDE> <977C> <BBDF> <BBDF> <9785> <BBE0> <BBE0> <97F6> <BBE1> <BBE2> <9817> <BBE3> <BBE3> <98AF> <BBE4> <BBE4> <98B1> <BBE5> <BBE5> <9903> <BBE6> <BBE6> <9905> <BBE7> <BBE7> <990C> <BBE8> <BBE8> <9909> <BBE9> <BBE9> <99C1> <BBEA> <BBEB> <9AAF> <BBEC> <BBEC> <9AE6> <BBED> <BBEE> <9B41> <BBEF> <BBEF> <9CF4> <BBF0> <BBF0> <9CF6> <BBF1> <BBF1> <9CF3> <BBF2> <BBF2> <9EBC> <BBF3> <BBF3> <9F3B> <BBF4> <BBF4> <9F4A> <BBF5> <BBF5> <5104> <BBF6> <BBF6> <5100> <BBF7> <BBF7> <50FB> <BBF8> <BBF8> <50F5> <BBF9> <BBF9> <50F9> <BBFA> <BBFA> <5102> <BBFB> <BBFC> <5108> <BBFD> <BBFD> <5105> <BBFE> <BBFE> <51DC> <BC40> <BC42> <5287> <BC43> <BC43> <528D> <BC44> <BC44> <528A> <BC45> <BC45> <52F0> <BC46> <BC46> <53B2> <BC47> <BC47> <562E> <BC48> <BC48> <563B> <BC49> <BC49> <5639> <BC4A> <BC4A> <5632> <BC4B> <BC4B> <563F> <BC4C> <BC4C> <5634> <BC4D> <BC4D> <5629> <BC4E> <BC4E> <5653> <BC4F> <BC4F> <564E> <BC50> <BC50> <5657> <BC51> <BC51> <5674> <BC52> <BC52> <5636> <BC53> <BC54> <562F> <BC55> <BC55> <5880> <BC56> <BC56> <589F> <BC57> <BC57> <589E> <BC58> <BC58> <58B3> <BC59> <BC59> <589C> <BC5A> <BC5A> <58AE> <BC5B> <BC5B> <58A9> <BC5C> <BC5C> <58A6> <BC5D> <BC5D> <596D> <BC5E> <BC5E> <5B09> <BC5F> <BC5F> <5AFB> <BC60> <BC60> <5B0B> <BC61> <BC61> <5AF5> <BC62> <BC62> <5B0C> <BC63> <BC63> <5B08> <BC64> <BC64> <5BEE> <BC65> <BC65> <5BEC> <BC66> <BC66> <5BE9> endbfrange 100 beginbfrange <BC67> <BC67> <5BEB> <BC68> <BC69> <5C64> <BC6A> <BC6A> <5D9D> <BC6B> <BC6B> <5D94> <BC6C> <BC6C> <5E62> <BC6D> <BC6D> <5E5F> <BC6E> <BC6E> <5E61> <BC6F> <BC6F> <5EE2> <BC70> <BC70> <5EDA> <BC71> <BC71> <5EDF> <BC72> <BC72> <5EDD> <BC73> <BC73> <5EE3> <BC74> <BC74> <5EE0> <BC75> <BC75> <5F48> <BC76> <BC76> <5F71> <BC77> <BC77> <5FB7> <BC78> <BC78> <5FB5> <BC79> <BC79> <6176> <BC7A> <BC7A> <6167> <BC7B> <BC7B> <616E> <BC7C> <BC7C> <615D> <BC7D> <BC7D> <6155> <BC7E> <BC7E> <6182> <BCA1> <BCA1> <617C> <BCA2> <BCA2> <6170> <BCA3> <BCA3> <616B> <BCA4> <BCA4> <617E> <BCA5> <BCA5> <61A7> <BCA6> <BCA6> <6190> <BCA7> <BCA7> <61AB> <BCA8> <BCA8> <618E> <BCA9> <BCA9> <61AC> <BCAA> <BCAA> <619A> <BCAB> <BCAB> <61A4> <BCAC> <BCAC> <6194> <BCAD> <BCAD> <61AE> <BCAE> <BCAE> <622E> <BCAF> <BCAF> <6469> <BCB0> <BCB0> <646F> <BCB1> <BCB1> <6479> <BCB2> <BCB2> <649E> <BCB3> <BCB3> <64B2> <BCB4> <BCB4> <6488> <BCB5> <BCB5> <6490> <BCB6> <BCB6> <64B0> <BCB7> <BCB7> <64A5> <BCB8> <BCB8> <6493> <BCB9> <BCB9> <6495> <BCBA> <BCBA> <64A9> <BCBB> <BCBB> <6492> <BCBC> <BCBC> <64AE> <BCBD> <BCBD> <64AD> <BCBE> <BCBE> <64AB> <BCBF> <BCBF> <649A> <BCC0> <BCC0> <64AC> <BCC1> <BCC1> <6499> <BCC2> <BCC2> <64A2> <BCC3> <BCC3> <64B3> <BCC4> <BCC4> <6575> <BCC5> <BCC6> <6577> <BCC7> <BCC7> <66AE> <BCC8> <BCC8> <66AB> <BCC9> <BCC9> <66B4> <BCCA> <BCCA> <66B1> <BCCB> <BCCB> <6A23> <BCCC> <BCCC> <6A1F> <BCCD> <BCCD> <69E8> <BCCE> <BCCE> <6A01> <BCCF> <BCCF> <6A1E> <BCD0> <BCD0> <6A19> <BCD1> <BCD1> <69FD> <BCD2> <BCD2> <6A21> <BCD3> <BCD3> <6A13> <BCD4> <BCD4> <6A0A> <BCD5> <BCD5> <69F3> <BCD6> <BCD6> <6A02> <BCD7> <BCD7> <6A05> <BCD8> <BCD8> <69ED> <BCD9> <BCD9> <6A11> <BCDA> <BCDA> <6B50> <BCDB> <BCDB> <6B4E> <BCDC> <BCDC> <6BA4> <BCDD> <BCDE> <6BC5> <BCDF> <BCDF> <6F3F> <BCE0> <BCE0> <6F7C> <BCE1> <BCE1> <6F84> <BCE2> <BCE2> <6F51> <BCE3> <BCE3> <6F66> <BCE4> <BCE4> <6F54> <BCE5> <BCE5> <6F86> <BCE6> <BCE6> <6F6D> <BCE7> <BCE7> <6F5B> <BCE8> <BCE8> <6F78> <BCE9> <BCE9> <6F6E> <BCEA> <BCEA> <6F8E> <BCEB> <BCEB> <6F7A> <BCEC> <BCEC> <6F70> <BCED> <BCED> <6F64> <BCEE> <BCEE> <6F97> <BCEF> <BCEF> <6F58> endbfrange 100 beginbfrange <BCF0> <BCF0> <6ED5> <BCF1> <BCF1> <6F6F> <BCF2> <BCF2> <6F60> <BCF3> <BCF3> <6F5F> <BCF4> <BCF4> <719F> <BCF5> <BCF5> <71AC> <BCF6> <BCF6> <71B1> <BCF7> <BCF7> <71A8> <BCF8> <BCF8> <7256> <BCF9> <BCF9> <729B> <BCFA> <BCFA> <734E> <BCFB> <BCFB> <7357> <BCFC> <BCFC> <7469> <BCFD> <BCFD> <748B> <BCFE> <BCFE> <7483> <BD40> <BD40> <747E> <BD41> <BD41> <7480> <BD42> <BD42> <757F> <BD43> <BD43> <7620> <BD44> <BD44> <7629> <BD45> <BD45> <761F> <BD46> <BD46> <7624> <BD47> <BD47> <7626> <BD48> <BD49> <7621> <BD4A> <BD4A> <769A> <BD4B> <BD4B> <76BA> <BD4C> <BD4C> <76E4> <BD4D> <BD4D> <778E> <BD4E> <BD4E> <7787> <BD4F> <BD4F> <778C> <BD50> <BD50> <7791> <BD51> <BD51> <778B> <BD52> <BD52> <78CB> <BD53> <BD53> <78C5> <BD54> <BD54> <78BA> <BD55> <BD55> <78CA> <BD56> <BD56> <78BE> <BD57> <BD57> <78D5> <BD58> <BD58> <78BC> <BD59> <BD59> <78D0> <BD5A> <BD5A> <7A3F> <BD5B> <BD5B> <7A3C> <BD5C> <BD5C> <7A40> <BD5D> <BD5D> <7A3D> <BD5E> <BD5E> <7A37> <BD5F> <BD5F> <7A3B> <BD60> <BD60> <7AAF> <BD61> <BD61> <7AAE> <BD62> <BD62> <7BAD> <BD63> <BD63> <7BB1> <BD64> <BD64> <7BC4> <BD65> <BD65> <7BB4> <BD66> <BD67> <7BC6> <BD68> <BD68> <7BC1> <BD69> <BD69> <7BA0> <BD6A> <BD6A> <7BCC> <BD6B> <BD6B> <7CCA> <BD6C> <BD6C> <7DE0> <BD6D> <BD6D> <7DF4> <BD6E> <BD6E> <7DEF> <BD6F> <BD6F> <7DFB> <BD70> <BD70> <7DD8> <BD71> <BD71> <7DEC> <BD72> <BD72> <7DDD> <BD73> <BD73> <7DE8> <BD74> <BD74> <7DE3> <BD75> <BD75> <7DDA> <BD76> <BD76> <7DDE> <BD77> <BD77> <7DE9> <BD78> <BD78> <7D9E> <BD79> <BD79> <7DD9> <BD7A> <BD7A> <7DF2> <BD7B> <BD7B> <7DF9> <BD7C> <BD7C> <7F75> <BD7D> <BD7D> <7F77> <BD7E> <BD7E> <7FAF> <BDA1> <BDA1> <7FE9> <BDA2> <BDA2> <8026> <BDA3> <BDA5> <819B> <BDA6> <BDA6> <81A0> <BDA7> <BDA7> <819A> <BDA8> <BDA8> <8198> <BDA9> <BDA9> <8517> <BDAA> <BDAA> <853D> <BDAB> <BDAB> <851A> <BDAC> <BDAC> <84EE> <BDAD> <BDAE> <852C> <BDAF> <BDAF> <8513> <BDB0> <BDB0> <8511> <BDB1> <BDB1> <8523> <BDB2> <BDB2> <8521> <BDB3> <BDB3> <8514> <BDB4> <BDB4> <84EC> <BDB5> <BDB5> <8525> <BDB6> <BDB6> <84FF> <BDB7> <BDB7> <8506> <BDB8> <BDB8> <8782> <BDB9> <BDB9> <8774> <BDBA> <BDBA> <8776> <BDBB> <BDBB> <8760> endbfrange 100 beginbfrange <BDBC> <BDBC> <8766> <BDBD> <BDBD> <8778> <BDBE> <BDBE> <8768> <BDBF> <BDBF> <8759> <BDC0> <BDC0> <8757> <BDC1> <BDC1> <874C> <BDC2> <BDC2> <8753> <BDC3> <BDC3> <885B> <BDC4> <BDC4> <885D> <BDC5> <BDC5> <8910> <BDC6> <BDC6> <8907> <BDC7> <BDC8> <8912> <BDC9> <BDC9> <8915> <BDCA> <BDCA> <890A> <BDCB> <BDCB> <8ABC> <BDCC> <BDCC> <8AD2> <BDCD> <BDCD> <8AC7> <BDCE> <BDCE> <8AC4> <BDCF> <BDCF> <8A95> <BDD0> <BDD0> <8ACB> <BDD1> <BDD1> <8AF8> <BDD2> <BDD2> <8AB2> <BDD3> <BDD3> <8AC9> <BDD4> <BDD4> <8AC2> <BDD5> <BDD5> <8ABF> <BDD6> <BDD6> <8AB0> <BDD7> <BDD7> <8AD6> <BDD8> <BDD8> <8ACD> <BDD9> <BDD9> <8AB6> <BDDA> <BDDA> <8AB9> <BDDB> <BDDB> <8ADB> <BDDC> <BDDC> <8C4C> <BDDD> <BDDD> <8C4E> <BDDE> <BDDE> <8C6C> <BDDF> <BDDF> <8CE0> <BDE0> <BDE0> <8CDE> <BDE1> <BDE1> <8CE6> <BDE2> <BDE2> <8CE4> <BDE3> <BDE4> <8CEC> <BDE5> <BDE6> <8CE2> <BDE7> <BDE7> <8CDC> <BDE8> <BDE8> <8CEA> <BDE9> <BDE9> <8CE1> <BDEA> <BDEA> <8D6D> <BDEB> <BDEB> <8D9F> <BDEC> <BDEC> <8DA3> <BDED> <BDED> <8E2B> <BDEE> <BDEE> <8E10> <BDEF> <BDEF> <8E1D> <BDF0> <BDF0> <8E22> <BDF1> <BDF1> <8E0F> <BDF2> <BDF2> <8E29> <BDF3> <BDF3> <8E1F> <BDF4> <BDF4> <8E21> <BDF5> <BDF5> <8E1E> <BDF6> <BDF6> <8EBA> <BDF7> <BDF7> <8F1D> <BDF8> <BDF8> <8F1B> <BDF9> <BDF9> <8F1F> <BDFA> <BDFA> <8F29> <BDFB> <BDFB> <8F26> <BDFC> <BDFC> <8F2A> <BDFD> <BDFD> <8F1C> <BDFE> <BDFE> <8F1E> <BE40> <BE40> <8F25> <BE41> <BE41> <9069> <BE42> <BE42> <906E> <BE43> <BE43> <9068> <BE44> <BE44> <906D> <BE45> <BE45> <9077> <BE46> <BE46> <9130> <BE47> <BE47> <912D> <BE48> <BE48> <9127> <BE49> <BE49> <9131> <BE4A> <BE4A> <9187> <BE4B> <BE4B> <9189> <BE4C> <BE4C> <918B> <BE4D> <BE4D> <9183> <BE4E> <BE4E> <92C5> <BE4F> <BE4F> <92BB> <BE50> <BE50> <92B7> <BE51> <BE51> <92EA> <BE52> <BE52> <92AC> <BE53> <BE53> <92E4> <BE54> <BE54> <92C1> <BE55> <BE55> <92B3> <BE56> <BE56> <92BC> <BE57> <BE57> <92D2> <BE58> <BE58> <92C7> <BE59> <BE59> <92F0> <BE5A> <BE5A> <92B2> <BE5B> <BE5B> <95AD> <BE5C> <BE5C> <95B1> <BE5D> <BE5D> <9704> <BE5E> <BE5F> <9706> <BE60> <BE60> <9709> <BE61> <BE61> <9760> <BE62> <BE62> <978D> <BE63> <BE63> <978B> <BE64> <BE64> <978F> endbfrange 100 beginbfrange <BE65> <BE65> <9821> <BE66> <BE66> <982B> <BE67> <BE67> <981C> <BE68> <BE68> <98B3> <BE69> <BE69> <990A> <BE6A> <BE6A> <9913> <BE6B> <BE6B> <9912> <BE6C> <BE6C> <9918> <BE6D> <BE6D> <99DD> <BE6E> <BE6E> <99D0> <BE6F> <BE6F> <99DF> <BE70> <BE70> <99DB> <BE71> <BE71> <99D1> <BE72> <BE72> <99D5> <BE73> <BE73> <99D2> <BE74> <BE74> <99D9> <BE75> <BE75> <9AB7> <BE76> <BE77> <9AEE> <BE78> <BE78> <9B27> <BE79> <BE79> <9B45> <BE7A> <BE7A> <9B44> <BE7B> <BE7B> <9B77> <BE7C> <BE7C> <9B6F> <BE7D> <BE7D> <9D06> <BE7E> <BE7E> <9D09> <BEA1> <BEA1> <9D03> <BEA2> <BEA2> <9EA9> <BEA3> <BEA3> <9EBE> <BEA4> <BEA4> <9ECE> <BEA5> <BEA5> <58A8> <BEA6> <BEA6> <9F52> <BEA7> <BEA7> <5112> <BEA8> <BEA8> <5118> <BEA9> <BEA9> <5114> <BEAA> <BEAA> <5110> <BEAB> <BEAB> <5115> <BEAC> <BEAC> <5180> <BEAD> <BEAD> <51AA> <BEAE> <BEAE> <51DD> <BEAF> <BEAF> <5291> <BEB0> <BEB0> <5293> <BEB1> <BEB1> <52F3> <BEB2> <BEB2> <5659> <BEB3> <BEB3> <566B> <BEB4> <BEB4> <5679> <BEB5> <BEB5> <5669> <BEB6> <BEB6> <5664> <BEB7> <BEB7> <5678> <BEB8> <BEB8> <566A> <BEB9> <BEB9> <5668> <BEBA> <BEBA> <5665> <BEBB> <BEBB> <5671> <BEBC> <BEBC> <566F> <BEBD> <BEBD> <566C> <BEBE> <BEBE> <5662> <BEBF> <BEBF> <5676> <BEC0> <BEC0> <58C1> <BEC1> <BEC1> <58BE> <BEC2> <BEC2> <58C7> <BEC3> <BEC3> <58C5> <BEC4> <BEC4> <596E> <BEC5> <BEC5> <5B1D> <BEC6> <BEC6> <5B34> <BEC7> <BEC7> <5B78> <BEC8> <BEC8> <5BF0> <BEC9> <BEC9> <5C0E> <BECA> <BECA> <5F4A> <BECB> <BECB> <61B2> <BECC> <BECC> <6191> <BECD> <BECD> <61A9> <BECE> <BECE> <618A> <BECF> <BECF> <61CD> <BED0> <BED0> <61B6> <BED1> <BED1> <61BE> <BED2> <BED2> <61CA> <BED3> <BED3> <61C8> <BED4> <BED4> <6230> <BED5> <BED5> <64C5> <BED6> <BED6> <64C1> <BED7> <BED7> <64CB> <BED8> <BED9> <64BB> <BEDA> <BEDA> <64DA> <BEDB> <BEDB> <64C4> <BEDC> <BEDC> <64C7> <BEDD> <BEDD> <64C2> <BEDE> <BEDE> <64CD> <BEDF> <BEDF> <64BF> <BEE0> <BEE0> <64D2> <BEE1> <BEE1> <64D4> <BEE2> <BEE2> <64BE> <BEE3> <BEE3> <6574> <BEE4> <BEE4> <66C6> <BEE5> <BEE5> <66C9> <BEE6> <BEE6> <66B9> <BEE7> <BEE7> <66C4> <BEE8> <BEE8> <66C7> <BEE9> <BEE9> <66B8> <BEEA> <BEEA> <6A3D> <BEEB> <BEEB> <6A38> <BEEC> <BEEC> <6A3A> endbfrange 100 beginbfrange <BEED> <BEED> <6A59> <BEEE> <BEEE> <6A6B> <BEEF> <BEEF> <6A58> <BEF0> <BEF0> <6A39> <BEF1> <BEF1> <6A44> <BEF2> <BEF2> <6A62> <BEF3> <BEF3> <6A61> <BEF4> <BEF4> <6A4B> <BEF5> <BEF5> <6A47> <BEF6> <BEF6> <6A35> <BEF7> <BEF7> <6A5F> <BEF8> <BEF8> <6A48> <BEF9> <BEF9> <6B59> <BEFA> <BEFA> <6B77> <BEFB> <BEFB> <6C05> <BEFC> <BEFC> <6FC2> <BEFD> <BEFD> <6FB1> <BEFE> <BEFE> <6FA1> <BF40> <BF40> <6FC3> <BF41> <BF41> <6FA4> <BF42> <BF42> <6FC1> <BF43> <BF43> <6FA7> <BF44> <BF44> <6FB3> <BF45> <BF45> <6FC0> <BF46> <BF46> <6FB9> <BF47> <BF47> <6FB6> <BF48> <BF48> <6FA6> <BF49> <BF49> <6FA0> <BF4A> <BF4A> <6FB4> <BF4B> <BF4B> <71BE> <BF4C> <BF4C> <71C9> <BF4D> <BF4D> <71D0> <BF4E> <BF4E> <71D2> <BF4F> <BF4F> <71C8> <BF50> <BF50> <71D5> <BF51> <BF51> <71B9> <BF52> <BF52> <71CE> <BF53> <BF53> <71D9> <BF54> <BF54> <71DC> <BF55> <BF56> <71C3> <BF57> <BF57> <7368> <BF58> <BF58> <749C> <BF59> <BF59> <74A3> <BF5A> <BF5A> <7498> <BF5B> <BF5B> <749F> <BF5C> <BF5C> <749E> <BF5D> <BF5D> <74E2> <BF5E> <BF5F> <750C> <BF60> <BF60> <7634> <BF61> <BF61> <7638> <BF62> <BF62> <763A> <BF63> <BF63> <76E7> <BF64> <BF64> <76E5> <BF65> <BF65> <77A0> <BF66> <BF67> <779E> <BF68> <BF68> <77A5> <BF69> <BF69> <78E8> <BF6A> <BF6A> <78DA> <BF6B> <BF6B> <78EC> <BF6C> <BF6C> <78E7> <BF6D> <BF6D> <79A6> <BF6E> <BF6F> <7A4D> <BF70> <BF70> <7A46> <BF71> <BF71> <7A4C> <BF72> <BF72> <7A4B> <BF73> <BF73> <7ABA> <BF74> <BF74> <7BD9> <BF75> <BF75> <7C11> <BF76> <BF76> <7BC9> <BF77> <BF77> <7BE4> <BF78> <BF78> <7BDB> <BF79> <BF79> <7BE1> <BF7A> <BF7A> <7BE9> <BF7B> <BF7B> <7BE6> <BF7C> <BF7D> <7CD5> <BF7E> <BF7E> <7E0A> <BFA1> <BFA1> <7E11> <BFA2> <BFA2> <7E08> <BFA3> <BFA3> <7E1B> <BFA4> <BFA4> <7E23> <BFA5> <BFA5> <7E1E> <BFA6> <BFA6> <7E1D> <BFA7> <BFA7> <7E09> <BFA8> <BFA8> <7E10> <BFA9> <BFA9> <7F79> <BFAA> <BFAA> <7FB2> <BFAB> <BFAC> <7FF0> <BFAD> <BFAD> <7FEE> <BFAE> <BFAE> <8028> <BFAF> <BFAF> <81B3> <BFB0> <BFB0> <81A9> <BFB1> <BFB1> <81A8> <BFB2> <BFB2> <81FB> <BFB3> <BFB3> <8208> <BFB4> <BFB5> <8258> <BFB6> <BFB6> <854A> <BFB7> <BFB7> <8559> <BFB8> <BFB8> <8548> <BFB9> <BFBA> <8568> <BFBB> <BFBB> <8543> endbfrange 100 beginbfrange <BFBC> <BFBC> <8549> <BFBD> <BFBD> <856D> <BFBE> <BFBE> <856A> <BFBF> <BFBF> <855E> <BFC0> <BFC0> <8783> <BFC1> <BFC1> <879F> <BFC2> <BFC2> <879E> <BFC3> <BFC3> <87A2> <BFC4> <BFC4> <878D> <BFC5> <BFC5> <8861> <BFC6> <BFC6> <892A> <BFC7> <BFC7> <8932> <BFC8> <BFC8> <8925> <BFC9> <BFC9> <892B> <BFCA> <BFCA> <8921> <BFCB> <BFCB> <89AA> <BFCC> <BFCC> <89A6> <BFCD> <BFCD> <8AE6> <BFCE> <BFCE> <8AFA> <BFCF> <BFCF> <8AEB> <BFD0> <BFD0> <8AF1> <BFD1> <BFD1> <8B00> <BFD2> <BFD2> <8ADC> <BFD3> <BFD3> <8AE7> <BFD4> <BFD4> <8AEE> <BFD5> <BFD5> <8AFE> <BFD6> <BFD7> <8B01> <BFD8> <BFD8> <8AF7> <BFD9> <BFD9> <8AED> <BFDA> <BFDA> <8AF3> <BFDB> <BFDB> <8AF6> <BFDC> <BFDC> <8AFC> <BFDD> <BFDD> <8C6B> <BFDE> <BFDE> <8C6D> <BFDF> <BFDF> <8C93> <BFE0> <BFE0> <8CF4> <BFE1> <BFE1> <8E44> <BFE2> <BFE2> <8E31> <BFE3> <BFE3> <8E34> <BFE4> <BFE4> <8E42> <BFE5> <BFE5> <8E39> <BFE6> <BFE6> <8E35> <BFE7> <BFE7> <8F3B> <BFE8> <BFE8> <8F2F> <BFE9> <BFE9> <8F38> <BFEA> <BFEA> <8F33> <BFEB> <BFEB> <8FA8> <BFEC> <BFEC> <8FA6> <BFED> <BFED> <9075> <BFEE> <BFEE> <9074> <BFEF> <BFEF> <9078> <BFF0> <BFF0> <9072> <BFF1> <BFF1> <907C> <BFF2> <BFF2> <907A> <BFF3> <BFF3> <9134> <BFF4> <BFF4> <9192> <BFF5> <BFF5> <9320> <BFF6> <BFF6> <9336> <BFF7> <BFF7> <92F8> <BFF8> <BFF8> <9333> <BFF9> <BFF9> <932F> <BFFA> <BFFA> <9322> <BFFB> <BFFB> <92FC> <BFFC> <BFFC> <932B> <BFFD> <BFFD> <9304> <BFFE> <BFFE> <931A> <C040> <C040> <9310> <C041> <C041> <9326> <C042> <C042> <9321> <C043> <C043> <9315> <C044> <C044> <932E> <C045> <C045> <9319> <C046> <C046> <95BB> <C047> <C048> <96A7> <C049> <C049> <96AA> <C04A> <C04A> <96D5> <C04B> <C04B> <970E> <C04C> <C04C> <9711> <C04D> <C04D> <9716> <C04E> <C04E> <970D> <C04F> <C04F> <9713> <C050> <C050> <970F> <C051> <C052> <975B> <C053> <C053> <9766> <C054> <C054> <9798> <C055> <C055> <9830> <C056> <C056> <9838> <C057> <C057> <983B> <C058> <C058> <9837> <C059> <C059> <982D> <C05A> <C05A> <9839> <C05B> <C05B> <9824> <C05C> <C05C> <9910> <C05D> <C05D> <9928> <C05E> <C05E> <991E> <C05F> <C05F> <991B> <C060> <C060> <9921> <C061> <C061> <991A> <C062> <C062> <99ED> <C063> <C063> <99E2> endbfrange 100 beginbfrange <C064> <C064> <99F1> <C065> <C065> <9AB8> <C066> <C066> <9ABC> <C067> <C067> <9AFB> <C068> <C068> <9AED> <C069> <C069> <9B28> <C06A> <C06A> <9B91> <C06B> <C06B> <9D15> <C06C> <C06C> <9D23> <C06D> <C06D> <9D26> <C06E> <C06E> <9D28> <C06F> <C06F> <9D12> <C070> <C070> <9D1B> <C071> <C071> <9ED8> <C072> <C072> <9ED4> <C073> <C073> <9F8D> <C074> <C074> <9F9C> <C075> <C075> <512A> <C076> <C076> <511F> <C077> <C077> <5121> <C078> <C078> <5132> <C079> <C079> <52F5> <C07A> <C07A> <568E> <C07B> <C07B> <5680> <C07C> <C07C> <5690> <C07D> <C07D> <5685> <C07E> <C07E> <5687> <C0A1> <C0A1> <568F> <C0A2> <C0A2> <58D5> <C0A3> <C0A3> <58D3> <C0A4> <C0A4> <58D1> <C0A5> <C0A5> <58CE> <C0A6> <C0A6> <5B30> <C0A7> <C0A7> <5B2A> <C0A8> <C0A8> <5B24> <C0A9> <C0A9> <5B7A> <C0AA> <C0AA> <5C37> <C0AB> <C0AB> <5C68> <C0AC> <C0AC> <5DBC> <C0AD> <C0AD> <5DBA> <C0AE> <C0AE> <5DBD> <C0AF> <C0AF> <5DB8> <C0B0> <C0B0> <5E6B> <C0B1> <C0B1> <5F4C> <C0B2> <C0B2> <5FBD> <C0B3> <C0B3> <61C9> <C0B4> <C0B4> <61C2> <C0B5> <C0B5> <61C7> <C0B6> <C0B6> <61E6> <C0B7> <C0B7> <61CB> <C0B8> <C0B8> <6232> <C0B9> <C0B9> <6234> <C0BA> <C0BA> <64CE> <C0BB> <C0BB> <64CA> <C0BC> <C0BC> <64D8> <C0BD> <C0BD> <64E0> <C0BE> <C0BE> <64F0> <C0BF> <C0BF> <64E6> <C0C0> <C0C0> <64EC> <C0C1> <C0C1> <64F1> <C0C2> <C0C2> <64E2> <C0C3> <C0C3> <64ED> <C0C4> <C0C5> <6582> <C0C6> <C0C6> <66D9> <C0C7> <C0C7> <66D6> <C0C8> <C0C8> <6A80> <C0C9> <C0C9> <6A94> <C0CA> <C0CA> <6A84> <C0CB> <C0CB> <6AA2> <C0CC> <C0CC> <6A9C> <C0CD> <C0CD> <6ADB> <C0CE> <C0CE> <6AA3> <C0CF> <C0CF> <6A7E> <C0D0> <C0D0> <6A97> <C0D1> <C0D1> <6A90> <C0D2> <C0D2> <6AA0> <C0D3> <C0D3> <6B5C> <C0D4> <C0D4> <6BAE> <C0D5> <C0D5> <6BDA> <C0D6> <C0D6> <6C08> <C0D7> <C0D7> <6FD8> <C0D8> <C0D8> <6FF1> <C0D9> <C0DA> <6FDF> <C0DB> <C0DB> <6FDB> <C0DC> <C0DC> <6FE4> <C0DD> <C0DD> <6FEB> <C0DE> <C0DE> <6FEF> <C0DF> <C0DF> <6F80> <C0E0> <C0E0> <6FEC> <C0E1> <C0E1> <6FE1> <C0E2> <C0E2> <6FE9> <C0E3> <C0E3> <6FD5> <C0E4> <C0E4> <6FEE> <C0E5> <C0E5> <6FF0> <C0E6> <C0E6> <71E7> <C0E7> <C0E7> <71DF> <C0E8> <C0E8> <71EE> <C0E9> <C0E9> <71E6> <C0EA> <C0EA> <71E5> <C0EB> <C0EB> <71ED> endbfrange 100 beginbfrange <C0EC> <C0EC> <71EC> <C0ED> <C0ED> <71F4> <C0EE> <C0EE> <71E0> <C0EF> <C0EF> <7235> <C0F0> <C0F0> <7246> <C0F1> <C0F1> <7370> <C0F2> <C0F2> <7372> <C0F3> <C0F3> <74A9> <C0F4> <C0F4> <74B0> <C0F5> <C0F5> <74A6> <C0F6> <C0F6> <74A8> <C0F7> <C0F7> <7646> <C0F8> <C0F8> <7642> <C0F9> <C0F9> <764C> <C0FA> <C0FA> <76EA> <C0FB> <C0FB> <77B3> <C0FC> <C0FC> <77AA> <C0FD> <C0FD> <77B0> <C0FE> <C0FE> <77AC> <C140> <C140> <77A7> <C141> <C141> <77AD> <C142> <C142> <77EF> <C143> <C143> <78F7> <C144> <C144> <78FA> <C145> <C145> <78F4> <C146> <C146> <78EF> <C147> <C147> <7901> <C148> <C148> <79A7> <C149> <C149> <79AA> <C14A> <C14A> <7A57> <C14B> <C14B> <7ABF> <C14C> <C14C> <7C07> <C14D> <C14D> <7C0D> <C14E> <C14E> <7BFE> <C14F> <C14F> <7BF7> <C150> <C150> <7C0C> <C151> <C151> <7BE0> <C152> <C152> <7CE0> <C153> <C153> <7CDC> <C154> <C154> <7CDE> <C155> <C155> <7CE2> <C156> <C156> <7CDF> <C157> <C157> <7CD9> <C158> <C158> <7CDD> <C159> <C159> <7E2E> <C15A> <C15A> <7E3E> <C15B> <C15B> <7E46> <C15C> <C15C> <7E37> <C15D> <C15D> <7E32> <C15E> <C15E> <7E43> <C15F> <C15F> <7E2B> <C160> <C160> <7E3D> <C161> <C161> <7E31> <C162> <C162> <7E45> <C163> <C163> <7E41> <C164> <C164> <7E34> <C165> <C165> <7E39> <C166> <C166> <7E48> <C167> <C167> <7E35> <C168> <C168> <7E3F> <C169> <C169> <7E2F> <C16A> <C16A> <7F44> <C16B> <C16B> <7FF3> <C16C> <C16C> <7FFC> <C16D> <C16E> <8071> <C16F> <C16F> <8070> <C170> <C170> <806F> <C171> <C171> <8073> <C172> <C172> <81C6> <C173> <C173> <81C3> <C174> <C174> <81BA> <C175> <C175> <81C2> <C176> <C176> <81C0> <C177> <C177> <81BF> <C178> <C178> <81BD> <C179> <C179> <81C9> <C17A> <C17A> <81BE> <C17B> <C17B> <81E8> <C17C> <C17C> <8209> <C17D> <C17D> <8271> <C17E> <C17E> <85AA> <C1A1> <C1A1> <8584> <C1A2> <C1A2> <857E> <C1A3> <C1A3> <859C> <C1A4> <C1A4> <8591> <C1A5> <C1A5> <8594> <C1A6> <C1A6> <85AF> <C1A7> <C1A7> <859B> <C1A8> <C1A8> <8587> <C1A9> <C1A9> <85A8> <C1AA> <C1AA> <858A> <C1AB> <C1AB> <8667> <C1AC> <C1AC> <87C0> <C1AD> <C1AD> <87D1> <C1AE> <C1AE> <87B3> <C1AF> <C1AF> <87D2> <C1B0> <C1B0> <87C6> <C1B1> <C1B1> <87AB> <C1B2> <C1B2> <87BB> <C1B3> <C1B3> <87BA> endbfrange 100 beginbfrange <C1B4> <C1B4> <87C8> <C1B5> <C1B5> <87CB> <C1B6> <C1B6> <893B> <C1B7> <C1B7> <8936> <C1B8> <C1B8> <8944> <C1B9> <C1B9> <8938> <C1BA> <C1BA> <893D> <C1BB> <C1BB> <89AC> <C1BC> <C1BC> <8B0E> <C1BD> <C1BD> <8B17> <C1BE> <C1BE> <8B19> <C1BF> <C1BF> <8B1B> <C1C0> <C1C0> <8B0A> <C1C1> <C1C1> <8B20> <C1C2> <C1C2> <8B1D> <C1C3> <C1C3> <8B04> <C1C4> <C1C4> <8B10> <C1C5> <C1C5> <8C41> <C1C6> <C1C6> <8C3F> <C1C7> <C1C7> <8C73> <C1C8> <C1C8> <8CFA> <C1C9> <C1C9> <8CFD> <C1CA> <C1CA> <8CFC> <C1CB> <C1CB> <8CF8> <C1CC> <C1CC> <8CFB> <C1CD> <C1CD> <8DA8> <C1CE> <C1CE> <8E49> <C1CF> <C1CF> <8E4B> <C1D0> <C1D0> <8E48> <C1D1> <C1D1> <8E4A> <C1D2> <C1D2> <8F44> <C1D3> <C1D3> <8F3E> <C1D4> <C1D4> <8F42> <C1D5> <C1D5> <8F45> <C1D6> <C1D6> <8F3F> <C1D7> <C1D7> <907F> <C1D8> <C1D8> <907D> <C1D9> <C1D9> <9084> <C1DA> <C1DB> <9081> <C1DC> <C1DC> <9080> <C1DD> <C1DD> <9139> <C1DE> <C1DE> <91A3> <C1DF> <C1DF> <919E> <C1E0> <C1E0> <919C> <C1E1> <C1E1> <934D> <C1E2> <C1E2> <9382> <C1E3> <C1E3> <9328> <C1E4> <C1E4> <9375> <C1E5> <C1E5> <934A> <C1E6> <C1E6> <9365> <C1E7> <C1E7> <934B> <C1E8> <C1E8> <9318> <C1E9> <C1E9> <937E> <C1EA> <C1EA> <936C> <C1EB> <C1EB> <935B> <C1EC> <C1EC> <9370> <C1ED> <C1ED> <935A> <C1EE> <C1EE> <9354> <C1EF> <C1F1> <95CA> <C1F2> <C1F2> <95C8> <C1F3> <C1F3> <95C6> <C1F4> <C1F4> <96B1> <C1F5> <C1F5> <96B8> <C1F6> <C1F6> <96D6> <C1F7> <C1F7> <971C> <C1F8> <C1F8> <971E> <C1F9> <C1F9> <97A0> <C1FA> <C1FA> <97D3> <C1FB> <C1FB> <9846> <C1FC> <C1FC> <98B6> <C1FD> <C1FD> <9935> <C1FE> <C1FE> <9A01> <C240> <C240> <99FF> <C241> <C241> <9BAE> <C242> <C242> <9BAB> <C243> <C243> <9BAA> <C244> <C244> <9BAD> <C245> <C245> <9D3B> <C246> <C246> <9D3F> <C247> <C247> <9E8B> <C248> <C248> <9ECF> <C249> <C249> <9EDE> <C24A> <C24B> <9EDC> <C24C> <C24C> <9EDB> <C24D> <C24D> <9F3E> <C24E> <C24E> <9F4B> <C24F> <C24F> <53E2> <C250> <C250> <5695> <C251> <C251> <56AE> <C252> <C252> <58D9> <C253> <C253> <58D8> <C254> <C254> <5B38> <C255> <C255> <5F5D> <C256> <C256> <61E3> <C257> <C257> <6233> <C258> <C258> <64F4> <C259> <C259> <64F2> <C25A> <C25A> <64FE> <C25B> <C25B> <6506> <C25C> <C25D> <64FA> endbfrange 100 beginbfrange <C25E> <C25E> <64F7> <C25F> <C25F> <65B7> <C260> <C260> <66DC> <C261> <C261> <6726> <C262> <C262> <6AB3> <C263> <C263> <6AAC> <C264> <C264> <6AC3> <C265> <C265> <6ABB> <C266> <C266> <6AB8> <C267> <C267> <6AC2> <C268> <C269> <6AAE> <C26A> <C26A> <6B5F> <C26B> <C26B> <6B78> <C26C> <C26C> <6BAF> <C26D> <C26D> <7009> <C26E> <C26E> <700B> <C26F> <C26F> <6FFE> <C270> <C270> <7006> <C271> <C271> <6FFA> <C272> <C272> <7011> <C273> <C273> <700F> <C274> <C275> <71FB> <C276> <C276> <71FE> <C277> <C277> <71F8> <C278> <C278> <7377> <C279> <C279> <7375> <C27A> <C27A> <74A7> <C27B> <C27B> <74BF> <C27C> <C27C> <7515> <C27D> <C27D> <7656> <C27E> <C27E> <7658> <C2A1> <C2A1> <7652> <C2A2> <C2A2> <77BD> <C2A3> <C2A3> <77BF> <C2A4> <C2A5> <77BB> <C2A6> <C2A6> <790E> <C2A7> <C2A7> <79AE> <C2A8> <C2A9> <7A61> <C2AA> <C2AA> <7A60> <C2AB> <C2AC> <7AC4> <C2AD> <C2AD> <7C2B> <C2AE> <C2AE> <7C27> <C2AF> <C2AF> <7C2A> <C2B0> <C2B0> <7C1E> <C2B1> <C2B1> <7C23> <C2B2> <C2B2> <7C21> <C2B3> <C2B3> <7CE7> <C2B4> <C2B5> <7E54> <C2B6> <C2B6> <7E5E> <C2B7> <C2B7> <7E5A> <C2B8> <C2B8> <7E61> <C2B9> <C2B9> <7E52> <C2BA> <C2BA> <7E59> <C2BB> <C2BB> <7F48> <C2BC> <C2BC> <7FF9> <C2BD> <C2BD> <7FFB> <C2BE> <C2BE> <8077> <C2BF> <C2BF> <8076> <C2C0> <C2C0> <81CD> <C2C1> <C2C1> <81CF> <C2C2> <C2C2> <820A> <C2C3> <C2C3> <85CF> <C2C4> <C2C4> <85A9> <C2C5> <C2C5> <85CD> <C2C6> <C2C6> <85D0> <C2C7> <C2C7> <85C9> <C2C8> <C2C8> <85B0> <C2C9> <C2C9> <85BA> <C2CA> <C2CA> <85B9> <C2CB> <C2CB> <85A6> <C2CC> <C2CC> <87EF> <C2CD> <C2CD> <87EC> <C2CE> <C2CE> <87F2> <C2CF> <C2CF> <87E0> <C2D0> <C2D0> <8986> <C2D1> <C2D1> <89B2> <C2D2> <C2D2> <89F4> <C2D3> <C2D3> <8B28> <C2D4> <C2D4> <8B39> <C2D5> <C2D5> <8B2C> <C2D6> <C2D6> <8B2B> <C2D7> <C2D7> <8C50> <C2D8> <C2D8> <8D05> <C2D9> <C2D9> <8E59> <C2DA> <C2DA> <8E63> <C2DB> <C2DB> <8E66> <C2DC> <C2DC> <8E64> <C2DD> <C2DD> <8E5F> <C2DE> <C2DE> <8E55> <C2DF> <C2DF> <8EC0> <C2E0> <C2E0> <8F49> <C2E1> <C2E1> <8F4D> <C2E2> <C2E2> <9087> <C2E3> <C2E3> <9083> <C2E4> <C2E4> <9088> <C2E5> <C2E6> <91AB> <C2E7> <C2E7> <91D0> <C2E8> <C2E8> <9394> <C2E9> <C2E9> <938A> <C2EA> <C2EA> <9396> endbfrange 100 beginbfrange <C2EB> <C2EB> <93A2> <C2EC> <C2EC> <93B3> <C2ED> <C2ED> <93AE> <C2EE> <C2EE> <93AC> <C2EF> <C2EF> <93B0> <C2F0> <C2F0> <9398> <C2F1> <C2F1> <939A> <C2F2> <C2F2> <9397> <C2F3> <C2F3> <95D4> <C2F4> <C2F4> <95D6> <C2F5> <C2F5> <95D0> <C2F6> <C2F6> <95D5> <C2F7> <C2F7> <96E2> <C2F8> <C2F8> <96DC> <C2F9> <C2F9> <96D9> <C2FA> <C2FA> <96DB> <C2FB> <C2FB> <96DE> <C2FC> <C2FC> <9724> <C2FD> <C2FD> <97A3> <C2FE> <C2FE> <97A6> <C340> <C340> <97AD> <C341> <C341> <97F9> <C342> <C342> <984D> <C343> <C343> <984F> <C344> <C344> <984C> <C345> <C345> <984E> <C346> <C346> <9853> <C347> <C347> <98BA> <C348> <C349> <993E> <C34A> <C34A> <993D> <C34B> <C34B> <992E> <C34C> <C34C> <99A5> <C34D> <C34D> <9A0E> <C34E> <C34E> <9AC1> <C34F> <C34F> <9B03> <C350> <C350> <9B06> <C351> <C351> <9B4F> <C352> <C352> <9B4E> <C353> <C353> <9B4D> <C354> <C354> <9BCA> <C355> <C355> <9BC9> <C356> <C356> <9BFD> <C357> <C357> <9BC8> <C358> <C358> <9BC0> <C359> <C359> <9D51> <C35A> <C35A> <9D5D> <C35B> <C35B> <9D60> <C35C> <C35C> <9EE0> <C35D> <C35D> <9F15> <C35E> <C35E> <9F2C> <C35F> <C35F> <5133> <C360> <C360> <56A5> <C361> <C362> <58DE> <C363> <C363> <58E2> <C364> <C364> <5BF5> <C365> <C365> <9F90> <C366> <C366> <5EEC> <C367> <C367> <61F2> <C368> <C368> <61F7> <C369> <C369> <61F6> <C36A> <C36A> <61F5> <C36B> <C36B> <6500> <C36C> <C36C> <650F> <C36D> <C36D> <66E0> <C36E> <C36E> <66DD> <C36F> <C36F> <6AE5> <C370> <C370> <6ADD> <C371> <C371> <6ADA> <C372> <C372> <6AD3> <C373> <C373> <701B> <C374> <C374> <701F> <C375> <C375> <7028> <C376> <C376> <701A> <C377> <C377> <701D> <C378> <C378> <7015> <C379> <C379> <7018> <C37A> <C37A> <7206> <C37B> <C37B> <720D> <C37C> <C37C> <7258> <C37D> <C37D> <72A2> <C37E> <C37E> <7378> <C3A1> <C3A1> <737A> <C3A2> <C3A2> <74BD> <C3A3> <C3A3> <74CA> <C3A4> <C3A4> <74E3> <C3A5> <C3A5> <7587> <C3A6> <C3A6> <7586> <C3A7> <C3A7> <765F> <C3A8> <C3A8> <7661> <C3A9> <C3A9> <77C7> <C3AA> <C3AA> <7919> <C3AB> <C3AB> <79B1> <C3AC> <C3AC> <7A6B> <C3AD> <C3AD> <7A69> <C3AE> <C3AF> <7C3E> <C3B0> <C3B0> <7C38> <C3B1> <C3B1> <7C3D> <C3B2> <C3B2> <7C37> <C3B3> <C3B3> <7C40> <C3B4> <C3B4> <7E6B> endbfrange 100 beginbfrange <C3B5> <C3B5> <7E6D> <C3B6> <C3B6> <7E79> <C3B7> <C3B8> <7E69> <C3B9> <C3B9> <7F85> <C3BA> <C3BA> <7E73> <C3BB> <C3BB> <7FB6> <C3BC> <C3BC> <7FB9> <C3BD> <C3BD> <7FB8> <C3BE> <C3BE> <81D8> <C3BF> <C3BF> <85E9> <C3C0> <C3C0> <85DD> <C3C1> <C3C1> <85EA> <C3C2> <C3C2> <85D5> <C3C3> <C3C4> <85E4> <C3C5> <C3C5> <85F7> <C3C6> <C3C6> <87FB> <C3C7> <C3C7> <8805> <C3C8> <C3C8> <880D> <C3C9> <C3C9> <87F9> <C3CA> <C3CA> <87FE> <C3CB> <C3CB> <8960> <C3CC> <C3CC> <895F> <C3CD> <C3CD> <8956> <C3CE> <C3CE> <895E> <C3CF> <C3CF> <8B41> <C3D0> <C3D0> <8B5C> <C3D1> <C3D1> <8B58> <C3D2> <C3D2> <8B49> <C3D3> <C3D3> <8B5A> <C3D4> <C3D5> <8B4E> <C3D6> <C3D6> <8B46> <C3D7> <C3D7> <8B59> <C3D8> <C3D8> <8D08> <C3D9> <C3D9> <8D0A> <C3DA> <C3DA> <8E7C> <C3DB> <C3DB> <8E72> <C3DC> <C3DC> <8E87> <C3DD> <C3DD> <8E76> <C3DE> <C3DE> <8E6C> <C3DF> <C3DF> <8E7A> <C3E0> <C3E0> <8E74> <C3E1> <C3E1> <8F54> <C3E2> <C3E2> <8F4E> <C3E3> <C3E3> <8FAD> <C3E4> <C3E5> <908A> <C3E6> <C3E6> <91B1> <C3E7> <C3E7> <91AE> <C3E8> <C3E8> <93E1> <C3E9> <C3E9> <93D1> <C3EA> <C3EA> <93DF> <C3EB> <C3EB> <93C3> <C3EC> <C3EC> <93C8> <C3ED> <C3EE> <93DC> <C3EF> <C3EF> <93D6> <C3F0> <C3F0> <93E2> <C3F1> <C3F1> <93CD> <C3F2> <C3F2> <93D8> <C3F3> <C3F3> <93E4> <C3F4> <C3F4> <93D7> <C3F5> <C3F5> <93E8> <C3F6> <C3F6> <95DC> <C3F7> <C3F7> <96B4> <C3F8> <C3F8> <96E3> <C3F9> <C3F9> <972A> <C3FA> <C3FA> <9727> <C3FB> <C3FB> <9761> <C3FC> <C3FC> <97DC> <C3FD> <C3FD> <97FB> <C3FE> <C3FE> <985E> <C440> <C440> <9858> <C441> <C441> <985B> <C442> <C442> <98BC> <C443> <C443> <9945> <C444> <C444> <9949> <C445> <C445> <9A16> <C446> <C446> <9A19> <C447> <C447> <9B0D> <C448> <C448> <9BE8> <C449> <C449> <9BE7> <C44A> <C44A> <9BD6> <C44B> <C44B> <9BDB> <C44C> <C44C> <9D89> <C44D> <C44D> <9D61> <C44E> <C44E> <9D72> <C44F> <C44F> <9D6A> <C450> <C450> <9D6C> <C451> <C451> <9E92> <C452> <C452> <9E97> <C453> <C453> <9E93> <C454> <C454> <9EB4> <C455> <C455> <52F8> <C456> <C456> <56A8> <C457> <C457> <56B7> <C458> <C458> <56B6> <C459> <C459> <56B4> <C45A> <C45A> <56BC> <C45B> <C45B> <58E4> <C45C> <C45C> <5B40> <C45D> <C45D> <5B43> <C45E> <C45E> <5B7D> endbfrange 100 beginbfrange <C45F> <C45F> <5BF6> <C460> <C460> <5DC9> <C461> <C461> <61F8> <C462> <C462> <61FA> <C463> <C463> <6518> <C464> <C464> <6514> <C465> <C465> <6519> <C466> <C466> <66E6> <C467> <C467> <6727> <C468> <C468> <6AEC> <C469> <C469> <703E> <C46A> <C46A> <7030> <C46B> <C46B> <7032> <C46C> <C46C> <7210> <C46D> <C46D> <737B> <C46E> <C46E> <74CF> <C46F> <C46F> <7662> <C470> <C470> <7665> <C471> <C471> <7926> <C472> <C472> <792A> <C473> <C473> <792C> <C474> <C474> <792B> <C475> <C475> <7AC7> <C476> <C476> <7AF6> <C477> <C477> <7C4C> <C478> <C478> <7C43> <C479> <C479> <7C4D> <C47A> <C47B> <7CEF> <C47C> <C47C> <8FAE> <C47D> <C47D> <7E7D> <C47E> <C47E> <7E7C> <C4A1> <C4A1> <7E82> <C4A2> <C4A2> <7F4C> <C4A3> <C4A3> <8000> <C4A4> <C4A4> <81DA> <C4A5> <C4A5> <8266> <C4A6> <C4A6> <85FB> <C4A7> <C4A7> <85F9> <C4A8> <C4A8> <8611> <C4A9> <C4A9> <85FA> <C4AA> <C4AA> <8606> <C4AB> <C4AB> <860B> <C4AC> <C4AC> <8607> <C4AD> <C4AD> <860A> <C4AE> <C4AF> <8814> <C4B0> <C4B0> <8964> <C4B1> <C4B1> <89BA> <C4B2> <C4B2> <89F8> <C4B3> <C4B3> <8B70> <C4B4> <C4B4> <8B6C> <C4B5> <C4B5> <8B66> <C4B6> <C4B6> <8B6F> <C4B7> <C4B7> <8B5F> <C4B8> <C4B8> <8B6B> <C4B9> <C4B9> <8D0F> <C4BA> <C4BA> <8D0D> <C4BB> <C4BB> <8E89> <C4BC> <C4BC> <8E81> <C4BD> <C4BD> <8E85> <C4BE> <C4BE> <8E82> <C4BF> <C4BF> <91B4> <C4C0> <C4C0> <91CB> <C4C1> <C4C1> <9418> <C4C2> <C4C2> <9403> <C4C3> <C4C3> <93FD> <C4C4> <C4C4> <95E1> <C4C5> <C4C5> <9730> <C4C6> <C4C6> <98C4> <C4C7> <C4C7> <9952> <C4C8> <C4C8> <9951> <C4C9> <C4C9> <99A8> <C4CA> <C4CA> <9A2B> <C4CB> <C4CB> <9A30> <C4CC> <C4CC> <9A37> <C4CD> <C4CD> <9A35> <C4CE> <C4CE> <9C13> <C4CF> <C4CF> <9C0D> <C4D0> <C4D0> <9E79> <C4D1> <C4D1> <9EB5> <C4D2> <C4D2> <9EE8> <C4D3> <C4D3> <9F2F> <C4D4> <C4D4> <9F5F> <C4D5> <C4D5> <9F63> <C4D6> <C4D6> <9F61> <C4D7> <C4D8> <5137> <C4D9> <C4D9> <56C1> <C4DA> <C4DA> <56C0> <C4DB> <C4DB> <56C2> <C4DC> <C4DC> <5914> <C4DD> <C4DD> <5C6C> <C4DE> <C4DE> <5DCD> <C4DF> <C4DF> <61FC> <C4E0> <C4E0> <61FE> <C4E1> <C4E1> <651D> <C4E2> <C4E2> <651C> <C4E3> <C4E3> <6595> <C4E4> <C4E4> <66E9> <C4E5> <C4E5> <6AFB> <C4E6> <C4E6> <6B04> <C4E7> <C4E7> <6AFA> endbfrange 100 beginbfrange <C4E8> <C4E8> <6BB2> <C4E9> <C4E9> <704C> <C4EA> <C4EA> <721B> <C4EB> <C4EB> <72A7> <C4EC> <C4EC> <74D6> <C4ED> <C4ED> <74D4> <C4EE> <C4EE> <7669> <C4EF> <C4EF> <77D3> <C4F0> <C4F0> <7C50> <C4F1> <C4F1> <7E8F> <C4F2> <C4F2> <7E8C> <C4F3> <C4F3> <7FBC> <C4F4> <C4F4> <8617> <C4F5> <C4F5> <862D> <C4F6> <C4F6> <861A> <C4F7> <C4F7> <8823> <C4F8> <C4F8> <8822> <C4F9> <C4F9> <8821> <C4FA> <C4FA> <881F> <C4FB> <C4FB> <896A> <C4FC> <C4FC> <896C> <C4FD> <C4FD> <89BD> <C4FE> <C4FE> <8B74> <C540> <C540> <8B77> <C541> <C541> <8B7D> <C542> <C542> <8D13> <C543> <C543> <8E8A> <C544> <C544> <8E8D> <C545> <C545> <8E8B> <C546> <C546> <8F5F> <C547> <C547> <8FAF> <C548> <C548> <91BA> <C549> <C549> <942E> <C54A> <C54A> <9433> <C54B> <C54B> <9435> <C54C> <C54C> <943A> <C54D> <C54D> <9438> <C54E> <C54E> <9432> <C54F> <C54F> <942B> <C550> <C550> <95E2> <C551> <C552> <9738> <C553> <C553> <9732> <C554> <C554> <97FF> <C555> <C555> <9867> <C556> <C556> <9865> <C557> <C557> <9957> <C558> <C558> <9A45> <C559> <C559> <9A43> <C55A> <C55A> <9A40> <C55B> <C55B> <9A3E> <C55C> <C55C> <9ACF> <C55D> <C55D> <9B54> <C55E> <C55E> <9B51> <C55F> <C55F> <9C2D> <C560> <C560> <9C25> <C561> <C561> <9DAF> <C562> <C562> <9DB4> <C563> <C563> <9DC2> <C564> <C564> <9DB8> <C565> <C565> <9E9D> <C566> <C566> <9EEF> <C567> <C567> <9F19> <C568> <C568> <9F5C> <C569> <C56A> <9F66> <C56B> <C56B> <513C> <C56C> <C56C> <513B> <C56D> <C56D> <56C8> <C56E> <C56E> <56CA> <C56F> <C56F> <56C9> <C570> <C570> <5B7F> <C571> <C571> <5DD4> <C572> <C572> <5DD2> <C573> <C573> <5F4E> <C574> <C574> <61FF> <C575> <C575> <6524> <C576> <C576> <6B0A> <C577> <C577> <6B61> <C578> <C578> <7051> <C579> <C579> <7058> <C57A> <C57A> <7380> <C57B> <C57B> <74E4> <C57C> <C57C> <758A> <C57D> <C57D> <766E> <C57E> <C57E> <766C> <C5A1> <C5A1> <79B3> <C5A2> <C5A2> <7C60> <C5A3> <C5A3> <7C5F> <C5A4> <C5A4> <807E> <C5A5> <C5A5> <807D> <C5A6> <C5A6> <81DF> <C5A7> <C5A7> <8972> <C5A8> <C5A8> <896F> <C5A9> <C5A9> <89FC> <C5AA> <C5AA> <8B80> <C5AB> <C5AC> <8D16> <C5AD> <C5AD> <8E91> <C5AE> <C5AE> <8E93> <C5AF> <C5AF> <8F61> <C5B0> <C5B0> <9148> <C5B1> <C5B1> <9444> endbfrange 100 beginbfrange <C5B2> <C5B3> <9451> <C5B4> <C5B5> <973D> <C5B6> <C5B6> <97C3> <C5B7> <C5B7> <97C1> <C5B8> <C5B8> <986B> <C5B9> <C5B9> <9955> <C5BA> <C5BA> <9A55> <C5BB> <C5BB> <9A4D> <C5BC> <C5BC> <9AD2> <C5BD> <C5BD> <9B1A> <C5BE> <C5BE> <9C49> <C5BF> <C5BF> <9C31> <C5C0> <C5C0> <9C3E> <C5C1> <C5C1> <9C3B> <C5C2> <C5C2> <9DD3> <C5C3> <C5C3> <9DD7> <C5C4> <C5C4> <9F34> <C5C5> <C5C5> <9F6C> <C5C6> <C5C6> <9F6A> <C5C7> <C5C7> <9F94> <C5C8> <C5C8> <56CC> <C5C9> <C5C9> <5DD6> <C5CA> <C5CA> <6200> <C5CB> <C5CB> <6523> <C5CC> <C5CC> <652B> <C5CD> <C5CD> <652A> <C5CE> <C5CE> <66EC> <C5CF> <C5CF> <6B10> <C5D0> <C5D0> <74DA> <C5D1> <C5D1> <7ACA> <C5D2> <C5D2> <7C64> <C5D3> <C5D3> <7C63> <C5D4> <C5D4> <7C65> <C5D5> <C5D5> <7E93> <C5D6> <C5D6> <7E96> <C5D7> <C5D7> <7E94> <C5D8> <C5D8> <81E2> <C5D9> <C5D9> <8638> <C5DA> <C5DA> <863F> <C5DB> <C5DB> <8831> <C5DC> <C5DC> <8B8A> <C5DD> <C5DD> <9090> <C5DE> <C5DE> <908F> <C5DF> <C5DF> <9463> <C5E0> <C5E0> <9460> <C5E1> <C5E1> <9464> <C5E2> <C5E2> <9768> <C5E3> <C5E3> <986F> <C5E4> <C5E4> <995C> <C5E5> <C5E6> <9A5A> <C5E7> <C5E7> <9A57> <C5E8> <C5E9> <9AD3> <C5EA> <C5EA> <9AD1> <C5EB> <C5EB> <9C54> <C5EC> <C5EC> <9C57> <C5ED> <C5ED> <9C56> <C5EE> <C5EE> <9DE5> <C5EF> <C5EF> <9E9F> <C5F0> <C5F0> <9EF4> <C5F1> <C5F1> <56D1> <C5F2> <C5F2> <58E9> <C5F3> <C5F3> <652C> <C5F4> <C5F4> <705E> <C5F5> <C5F6> <7671> <C5F7> <C5F7> <77D7> <C5F8> <C5F8> <7F50> <C5F9> <C5F9> <7F88> <C5FA> <C5FA> <8836> <C5FB> <C5FB> <8839> <C5FC> <C5FC> <8862> <C5FD> <C5FD> <8B93> <C5FE> <C5FE> <8B92> <C640> <C640> <8B96> <C641> <C641> <8277> <C642> <C642> <8D1B> <C643> <C643> <91C0> <C644> <C644> <946A> <C645> <C645> <9742> <C646> <C646> <9748> <C647> <C647> <9744> <C648> <C648> <97C6> <C649> <C649> <9870> <C64A> <C64A> <9A5F> <C64B> <C64B> <9B22> <C64C> <C64C> <9B58> <C64D> <C64D> <9C5F> <C64E> <C64F> <9DF9> <C650> <C651> <9E7C> <C652> <C652> <9F07> <C653> <C653> <9F77> <C654> <C654> <9F72> <C655> <C655> <5EF3> <C656> <C656> <6B16> <C657> <C657> <7063> <C658> <C658> <7C6C> <C659> <C659> <7C6E> <C65A> <C65A> <883B> <C65B> <C65B> <89C0> <C65C> <C65C> <8EA1> <C65D> <C65D> <91C1> endbfrange 100 beginbfrange <C65E> <C65E> <9472> <C65F> <C65F> <9470> <C660> <C660> <9871> <C661> <C661> <995E> <C662> <C662> <9AD6> <C663> <C663> <9B23> <C664> <C664> <9ECC> <C665> <C665> <7064> <C666> <C666> <77DA> <C667> <C667> <8B9A> <C668> <C668> <9477> <C669> <C669> <97C9> <C66A> <C66A> <9A62> <C66B> <C66B> <9A65> <C66C> <C66C> <7E9C> <C66D> <C66D> <8B9C> <C66E> <C66E> <8EAA> <C66F> <C66F> <91C5> <C670> <C671> <947D> <C672> <C672> <947C> <C673> <C674> <9C77> <C675> <C675> <9EF7> <C676> <C676> <8C54> <C677> <C677> <947F> <C678> <C678> <9E1A> <C679> <C679> <7228> <C67A> <C67A> <9A6A> <C67B> <C67B> <9B31> <C67C> <C67C> <9E1B> <C67D> <C67D> <9E1E> <C67E> <C67E> <7C72> <C6A1> <C6AA> <2460> <C6AB> <C6B4> <2474> <C6B5> <C6BE> <2170> <C6BF> <C6BF> <4E36> <C6C0> <C6C0> <4E3F> <C6C1> <C6C1> <4E85> <C6C2> <C6C2> <4EA0> <C6C3> <C6C3> <5182> <C6C4> <C6C4> <5196> <C6C5> <C6C5> <51AB> <C6C6> <C6C6> <52F9> <C6C7> <C6C7> <5338> <C6C8> <C6C8> <5369> <C6C9> <C6C9> <53B6> <C6CA> <C6CA> <5902> <C6CB> <C6CB> <5B80> <C6CC> <C6CC> <5DDB> <C6CD> <C6CD> <5E7A> <C6CE> <C6CE> <5E7F> <C6CF> <C6CF> <5EF4> <C6D0> <C6D0> <5F50> <C6D1> <C6D1> <5F61> <C6D2> <C6D2> <6534> <C6D3> <C6D3> <65E0> <C6D4> <C6D4> <7592> <C6D5> <C6D5> <7676> <C6D6> <C6D6> <8FB5> <C6D7> <C6D7> <96B6> <C6D8> <C6DE> <F6E8> <C6DF> <C6DF> <4EDD> <C6E0> <C6E2> <3005> <C6E3> <C6E3> <30FC> <C6E4> <C6E4> <FF3B> <C6E5> <C6E5> <FF3D> <C6E6> <C6E6> <F6F6> <C6E7> <C6FE> <3041> <C740> <C77A> <3059> <C77B> <C77E> <30A1> <C7A1> <C7F2> <30A5> <C7F3> <C7F8> <0410> <C7F9> <C7F9> <0401> <C7FA> <C7FE> <0416> <C840> <C85A> <041B> <C85B> <C85B> <0451> <C85C> <C875> <0436> <C876> <C876> <21E7> <C877> <C878> <21B8> <C879> <C879> <4E41> <C87A> <C87A> <F7E6> <C87B> <C87B> <4E5A> <C87C> <C87C> <F7E8> <C87D> <C87D> <5202> <C87E> <C87E> <F7EA> <C8A1> <C8A1> <F7EB> <C8A2> <C8A2> <5188> <C8A3> <C8CC> <F7ED> <C8CD> <C8CD> <00AC> <C8CE> <C8CE> <FFE4> <C8CF> <C8CF> <FF07> <C8D0> <C8D0> <FF02> <C8D1> <C8D1> <3231> <C8D2> <C8D2> <2116> <C8D3> <C8D3> <2121> <C8D4> <C8FE> <F81E> <C940> <C940> <4E42> <C941> <C941> <4E5C> <C942> <C942> <51F5> <C943> <C943> <531A> <C944> <C944> <5382> endbfrange 100 beginbfrange <C945> <C945> <4E07> <C946> <C946> <4E0C> <C947> <C947> <4E47> <C948> <C948> <4E8D> <C949> <C949> <56D7> <C94A> <C94A> <FA0C> <C94B> <C94B> <5C6E> <C94C> <C94C> <5F73> <C94D> <C94D> <4E0F> <C94E> <C94E> <5187> <C94F> <C94F> <4E0E> <C950> <C950> <4E2E> <C951> <C951> <4E93> <C952> <C952> <4EC2> <C953> <C953> <4EC9> <C954> <C954> <4EC8> <C955> <C955> <5198> <C956> <C956> <52FC> <C957> <C957> <536C> <C958> <C958> <53B9> <C959> <C959> <5720> <C95A> <C95A> <5903> <C95B> <C95B> <592C> <C95C> <C95C> <5C10> <C95D> <C95D> <5DFF> <C95E> <C95E> <65E1> <C95F> <C95F> <6BB3> <C960> <C960> <6BCC> <C961> <C961> <6C14> <C962> <C962> <723F> <C963> <C963> <4E31> <C964> <C964> <4E3C> <C965> <C965> <4EE8> <C966> <C966> <4EDC> <C967> <C967> <4EE9> <C968> <C968> <4EE1> <C969> <C969> <4EDD> <C96A> <C96A> <4EDA> <C96B> <C96B> <520C> <C96C> <C96C> <531C> <C96D> <C96D> <534C> <C96E> <C96F> <5722> <C970> <C970> <5917> <C971> <C971> <592F> <C972> <C972> <5B81> <C973> <C973> <5B84> <C974> <C974> <5C12> <C975> <C975> <5C3B> <C976> <C976> <5C74> <C977> <C977> <5C73> <C978> <C978> <5E04> <C979> <C979> <5E80> <C97A> <C97A> <5E82> <C97B> <C97B> <5FC9> <C97C> <C97C> <6209> <C97D> <C97D> <6250> <C97E> <C97E> <6C15> <C9A1> <C9A1> <6C36> <C9A2> <C9A2> <6C43> <C9A3> <C9A3> <6C3F> <C9A4> <C9A4> <6C3B> <C9A5> <C9A5> <72AE> <C9A6> <C9A6> <72B0> <C9A7> <C9A7> <738A> <C9A8> <C9A8> <79B8> <C9A9> <C9A9> <808A> <C9AA> <C9AA> <961E> <C9AB> <C9AB> <4F0E> <C9AC> <C9AC> <4F18> <C9AD> <C9AD> <4F2C> <C9AE> <C9AE> <4EF5> <C9AF> <C9AF> <4F14> <C9B0> <C9B0> <4EF1> <C9B1> <C9B1> <4F00> <C9B2> <C9B2> <4EF7> <C9B3> <C9B3> <4F08> <C9B4> <C9B4> <4F1D> <C9B5> <C9B5> <4F02> <C9B6> <C9B6> <4F05> <C9B7> <C9B7> <4F22> <C9B8> <C9B8> <4F13> <C9B9> <C9B9> <4F04> <C9BA> <C9BA> <4EF4> <C9BB> <C9BB> <4F12> <C9BC> <C9BC> <51B1> <C9BD> <C9BD> <5213> <C9BE> <C9BE> <5209> <C9BF> <C9BF> <5210> <C9C0> <C9C0> <52A6> <C9C1> <C9C1> <5322> <C9C2> <C9C2> <531F> <C9C3> <C9C3> <534D> <C9C4> <C9C4> <538A> <C9C5> <C9C5> <5407> <C9C6> <C9C6> <56E1> <C9C7> <C9C7> <56DF> <C9C8> <C9C8> <572E> <C9C9> <C9C9> <572A> <C9CA> <C9CA> <5734> <C9CB> <C9CB> <593C> endbfrange 100 beginbfrange <C9CC> <C9CC> <5980> <C9CD> <C9CD> <597C> <C9CE> <C9CE> <5985> <C9CF> <C9CF> <597B> <C9D0> <C9D0> <597E> <C9D1> <C9D1> <5977> <C9D2> <C9D2> <597F> <C9D3> <C9D3> <5B56> <C9D4> <C9D4> <5C15> <C9D5> <C9D5> <5C25> <C9D6> <C9D6> <5C7C> <C9D7> <C9D8> <5C7A> <C9D9> <C9D9> <5C7E> <C9DA> <C9DA> <5DDF> <C9DB> <C9DB> <5E75> <C9DC> <C9DC> <5E84> <C9DD> <C9DD> <5F02> <C9DE> <C9DE> <5F1A> <C9DF> <C9DF> <5F74> <C9E0> <C9E0> <5FD5> <C9E1> <C9E1> <5FD4> <C9E2> <C9E2> <5FCF> <C9E3> <C9E3> <625C> <C9E4> <C9E4> <625E> <C9E5> <C9E5> <6264> <C9E6> <C9E6> <6261> <C9E7> <C9E7> <6266> <C9E8> <C9E8> <6262> <C9E9> <C9E9> <6259> <C9EA> <C9EA> <6260> <C9EB> <C9EB> <625A> <C9EC> <C9EC> <6265> <C9ED> <C9ED> <65EF> <C9EE> <C9EE> <65EE> <C9EF> <C9EF> <673E> <C9F0> <C9F0> <6739> <C9F1> <C9F1> <6738> <C9F2> <C9F2> <673B> <C9F3> <C9F3> <673A> <C9F4> <C9F4> <673F> <C9F5> <C9F5> <673C> <C9F6> <C9F6> <6733> <C9F7> <C9F7> <6C18> <C9F8> <C9F8> <6C46> <C9F9> <C9F9> <6C52> <C9FA> <C9FA> <6C5C> <C9FB> <C9FB> <6C4F> <C9FC> <C9FC> <6C4A> <C9FD> <C9FD> <6C54> <C9FE> <C9FE> <6C4B> <CA40> <CA40> <6C4C> <CA41> <CA41> <7071> <CA42> <CA42> <725E> <CA43> <CA44> <72B4> <CA45> <CA45> <738E> <CA46> <CA46> <752A> <CA47> <CA47> <767F> <CA48> <CA48> <7A75> <CA49> <CA49> <7F51> <CA4A> <CA4A> <8278> <CA4B> <CA4B> <827C> <CA4C> <CA4C> <8280> <CA4D> <CA4D> <827D> <CA4E> <CA4E> <827F> <CA4F> <CA4F> <864D> <CA50> <CA50> <897E> <CA51> <CA51> <9099> <CA52> <CA53> <9097> <CA54> <CA54> <909B> <CA55> <CA55> <9094> <CA56> <CA56> <9622> <CA57> <CA57> <9624> <CA58> <CA58> <9620> <CA59> <CA59> <9623> <CA5A> <CA5A> <4F56> <CA5B> <CA5B> <4F3B> <CA5C> <CA5C> <4F62> <CA5D> <CA5D> <4F49> <CA5E> <CA5E> <4F53> <CA5F> <CA5F> <4F64> <CA60> <CA60> <4F3E> <CA61> <CA61> <4F67> <CA62> <CA62> <4F52> <CA63> <CA63> <4F5F> <CA64> <CA64> <4F41> <CA65> <CA65> <4F58> <CA66> <CA66> <4F2D> <CA67> <CA67> <4F33> <CA68> <CA68> <4F3F> <CA69> <CA69> <4F61> <CA6A> <CA6A> <518F> <CA6B> <CA6B> <51B9> <CA6C> <CA6C> <521C> <CA6D> <CA6D> <521E> <CA6E> <CA6E> <5221> <CA6F> <CA70> <52AD> <CA71> <CA71> <5309> <CA72> <CA72> <5363> <CA73> <CA73> <5372> <CA74> <CA75> <538E> endbfrange 100 beginbfrange <CA76> <CA76> <5430> <CA77> <CA77> <5437> <CA78> <CA78> <542A> <CA79> <CA79> <5454> <CA7A> <CA7A> <5445> <CA7B> <CA7B> <5419> <CA7C> <CA7C> <541C> <CA7D> <CA7D> <5425> <CA7E> <CA7E> <5418> <CAA1> <CAA1> <543D> <CAA2> <CAA2> <544F> <CAA3> <CAA3> <5441> <CAA4> <CAA4> <5428> <CAA5> <CAA5> <5424> <CAA6> <CAA6> <5447> <CAA7> <CAA7> <56EE> <CAA8> <CAA8> <56E7> <CAA9> <CAA9> <56E5> <CAAA> <CAAA> <5741> <CAAB> <CAAB> <5745> <CAAC> <CAAC> <574C> <CAAD> <CAAD> <5749> <CAAE> <CAAE> <574B> <CAAF> <CAAF> <5752> <CAB0> <CAB0> <5906> <CAB1> <CAB1> <5940> <CAB2> <CAB2> <59A6> <CAB3> <CAB3> <5998> <CAB4> <CAB4> <59A0> <CAB5> <CAB5> <5997> <CAB6> <CAB6> <598E> <CAB7> <CAB7> <59A2> <CAB8> <CAB8> <5990> <CAB9> <CAB9> <598F> <CABA> <CABA> <59A7> <CABB> <CABB> <59A1> <CABC> <CABC> <5B8E> <CABD> <CABD> <5B92> <CABE> <CABE> <5C28> <CABF> <CABF> <5C2A> <CAC0> <CAC0> <5C8D> <CAC1> <CAC1> <5C8F> <CAC2> <CAC2> <5C88> <CAC3> <CAC3> <5C8B> <CAC4> <CAC4> <5C89> <CAC5> <CAC5> <5C92> <CAC6> <CAC6> <5C8A> <CAC7> <CAC7> <5C86> <CAC8> <CAC8> <5C93> <CAC9> <CAC9> <5C95> <CACA> <CACA> <5DE0> <CACB> <CACB> <5E0A> <CACC> <CACC> <5E0E> <CACD> <CACD> <5E8B> <CACE> <CACE> <5E89> <CACF> <CACF> <5E8C> <CAD0> <CAD0> <5E88> <CAD1> <CAD1> <5E8D> <CAD2> <CAD2> <5F05> <CAD3> <CAD3> <5F1D> <CAD4> <CAD4> <5F78> <CAD5> <CAD5> <5F76> <CAD6> <CAD6> <5FD2> <CAD7> <CAD7> <5FD1> <CAD8> <CAD8> <5FD0> <CAD9> <CAD9> <5FED> <CADA> <CADA> <5FE8> <CADB> <CADB> <5FEE> <CADC> <CADC> <5FF3> <CADD> <CADD> <5FE1> <CADE> <CADE> <5FE4> <CADF> <CADF> <5FE3> <CAE0> <CAE0> <5FFA> <CAE1> <CAE1> <5FEF> <CAE2> <CAE2> <5FF7> <CAE3> <CAE3> <5FFB> <CAE4> <CAE4> <6000> <CAE5> <CAE5> <5FF4> <CAE6> <CAE6> <623A> <CAE7> <CAE7> <6283> <CAE8> <CAE8> <628C> <CAE9> <CAEA> <628E> <CAEB> <CAEB> <6294> <CAEC> <CAEC> <6287> <CAED> <CAED> <6271> <CAEE> <CAEE> <627B> <CAEF> <CAEF> <627A> <CAF0> <CAF0> <6270> <CAF1> <CAF1> <6281> <CAF2> <CAF2> <6288> <CAF3> <CAF3> <6277> <CAF4> <CAF4> <627D> <CAF5> <CAF5> <6272> <CAF6> <CAF6> <6274> <CAF7> <CAF7> <6537> <CAF8> <CAF8> <65F0> <CAF9> <CAF9> <65F4> <CAFA> <CAFA> <65F3> <CAFB> <CAFB> <65F2> <CAFC> <CAFC> <65F5> endbfrange 100 beginbfrange <CAFD> <CAFD> <6745> <CAFE> <CAFE> <6747> <CB40> <CB40> <6759> <CB41> <CB41> <6755> <CB42> <CB42> <674C> <CB43> <CB43> <6748> <CB44> <CB44> <675D> <CB45> <CB45> <674D> <CB46> <CB46> <675A> <CB47> <CB47> <674B> <CB48> <CB48> <6BD0> <CB49> <CB4A> <6C19> <CB4B> <CB4B> <6C78> <CB4C> <CB4C> <6C67> <CB4D> <CB4D> <6C6B> <CB4E> <CB4E> <6C84> <CB4F> <CB4F> <6C8B> <CB50> <CB50> <6C8F> <CB51> <CB51> <6C71> <CB52> <CB52> <6C6F> <CB53> <CB53> <6C69> <CB54> <CB54> <6C9A> <CB55> <CB55> <6C6D> <CB56> <CB56> <6C87> <CB57> <CB57> <6C95> <CB58> <CB58> <6C9C> <CB59> <CB59> <6C66> <CB5A> <CB5A> <6C73> <CB5B> <CB5B> <6C65> <CB5C> <CB5C> <6C7B> <CB5D> <CB5D> <6C8E> <CB5E> <CB5E> <7074> <CB5F> <CB5F> <707A> <CB60> <CB60> <7263> <CB61> <CB61> <72BF> <CB62> <CB62> <72BD> <CB63> <CB63> <72C3> <CB64> <CB64> <72C6> <CB65> <CB65> <72C1> <CB66> <CB66> <72BA> <CB67> <CB67> <72C5> <CB68> <CB68> <7395> <CB69> <CB69> <7397> <CB6A> <CB6B> <7393> <CB6C> <CB6C> <7392> <CB6D> <CB6D> <753A> <CB6E> <CB6E> <7539> <CB6F> <CB70> <7594> <CB71> <CB71> <7681> <CB72> <CB72> <793D> <CB73> <CB73> <8034> <CB74> <CB74> <8095> <CB75> <CB75> <8099> <CB76> <CB76> <8090> <CB77> <CB77> <8092> <CB78> <CB78> <809C> <CB79> <CB79> <8290> <CB7A> <CB7A> <828F> <CB7B> <CB7B> <8285> <CB7C> <CB7C> <828E> <CB7D> <CB7D> <8291> <CB7E> <CB7E> <8293> <CBA1> <CBA1> <828A> <CBA2> <CBA3> <8283> <CBA4> <CBA4> <8C78> <CBA5> <CBA5> <8FC9> <CBA6> <CBA6> <8FBF> <CBA7> <CBA7> <909F> <CBA8> <CBA8> <90A1> <CBA9> <CBA9> <90A5> <CBAA> <CBAA> <909E> <CBAB> <CBAB> <90A7> <CBAC> <CBAC> <90A0> <CBAD> <CBAD> <9630> <CBAE> <CBAE> <9628> <CBAF> <CBAF> <962F> <CBB0> <CBB0> <962D> <CBB1> <CBB1> <4E33> <CBB2> <CBB2> <4F98> <CBB3> <CBB3> <4F7C> <CBB4> <CBB4> <4F85> <CBB5> <CBB5> <4F7D> <CBB6> <CBB6> <4F80> <CBB7> <CBB7> <4F87> <CBB8> <CBB8> <4F76> <CBB9> <CBB9> <4F74> <CBBA> <CBBA> <4F89> <CBBB> <CBBB> <4F84> <CBBC> <CBBC> <4F77> <CBBD> <CBBD> <4F4C> <CBBE> <CBBE> <4F97> <CBBF> <CBBF> <4F6A> <CBC0> <CBC0> <4F9A> <CBC1> <CBC1> <4F79> <CBC2> <CBC2> <4F81> <CBC3> <CBC3> <4F78> <CBC4> <CBC4> <4F90> <CBC5> <CBC5> <4F9C> <CBC6> <CBC6> <4F94> <CBC7> <CBC7> <4F9E> endbfrange 100 beginbfrange <CBC8> <CBC8> <4F92> <CBC9> <CBC9> <4F82> <CBCA> <CBCA> <4F95> <CBCB> <CBCB> <4F6B> <CBCC> <CBCC> <4F6E> <CBCD> <CBCD> <519E> <CBCE> <CBCE> <51BC> <CBCF> <CBCF> <51BE> <CBD0> <CBD0> <5235> <CBD1> <CBD2> <5232> <CBD3> <CBD3> <5246> <CBD4> <CBD4> <5231> <CBD5> <CBD5> <52BC> <CBD6> <CBD7> <530A> <CBD8> <CBD8> <533C> <CBD9> <CBD9> <5392> <CBDA> <CBDA> <5394> <CBDB> <CBDB> <5487> <CBDC> <CBDC> <547F> <CBDD> <CBDD> <5481> <CBDE> <CBDE> <5491> <CBDF> <CBDF> <5482> <CBE0> <CBE0> <5488> <CBE1> <CBE1> <546B> <CBE2> <CBE2> <547A> <CBE3> <CBE3> <547E> <CBE4> <CBE4> <5465> <CBE5> <CBE5> <546C> <CBE6> <CBE6> <5474> <CBE7> <CBE7> <5466> <CBE8> <CBE8> <548D> <CBE9> <CBE9> <546F> <CBEA> <CBEA> <5461> <CBEB> <CBEB> <5460> <CBEC> <CBEC> <5498> <CBED> <CBED> <5463> <CBEE> <CBEE> <5467> <CBEF> <CBEF> <5464> <CBF0> <CBF0> <56F7> <CBF1> <CBF1> <56F9> <CBF2> <CBF2> <576F> <CBF3> <CBF3> <5772> <CBF4> <CBF4> <576D> <CBF5> <CBF5> <576B> <CBF6> <CBF6> <5771> <CBF7> <CBF7> <5770> <CBF8> <CBF8> <5776> <CBF9> <CBF9> <5780> <CBFA> <CBFA> <5775> <CBFB> <CBFB> <577B> <CBFC> <CBFD> <5773> <CBFE> <CBFE> <5762> <CC40> <CC40> <5768> <CC41> <CC41> <577D> <CC42> <CC42> <590C> <CC43> <CC43> <5945> <CC44> <CC44> <59B5> <CC45> <CC45> <59BA> <CC46> <CC46> <59CF> <CC47> <CC47> <59CE> <CC48> <CC48> <59B2> <CC49> <CC49> <59CC> <CC4A> <CC4A> <59C1> <CC4B> <CC4B> <59B6> <CC4C> <CC4C> <59BC> <CC4D> <CC4D> <59C3> <CC4E> <CC4E> <59D6> <CC4F> <CC4F> <59B1> <CC50> <CC50> <59BD> <CC51> <CC51> <59C0> <CC52> <CC52> <59C8> <CC53> <CC53> <59B4> <CC54> <CC54> <59C7> <CC55> <CC55> <5B62> <CC56> <CC56> <5B65> <CC57> <CC57> <5B93> <CC58> <CC58> <5B95> <CC59> <CC59> <5C44> <CC5A> <CC5A> <5C47> <CC5B> <CC5B> <5CAE> <CC5C> <CC5C> <5CA4> <CC5D> <CC5D> <5CA0> <CC5E> <CC5E> <5CB5> <CC5F> <CC5F> <5CAF> <CC60> <CC60> <5CA8> <CC61> <CC61> <5CAC> <CC62> <CC62> <5C9F> <CC63> <CC63> <5CA3> <CC64> <CC64> <5CAD> <CC65> <CC65> <5CA2> <CC66> <CC66> <5CAA> <CC67> <CC67> <5CA7> <CC68> <CC68> <5C9D> <CC69> <CC69> <5CA5> <CC6A> <CC6A> <5CB6> <CC6B> <CC6B> <5CB0> <CC6C> <CC6C> <5CA6> <CC6D> <CC6D> <5E17> <CC6E> <CC6E> <5E14> <CC6F> <CC6F> <5E19> endbfrange 100 beginbfrange <CC70> <CC70> <5F28> <CC71> <CC73> <5F22> <CC74> <CC74> <5F54> <CC75> <CC75> <5F82> <CC76> <CC76> <5F7E> <CC77> <CC77> <5F7D> <CC78> <CC78> <5FDE> <CC79> <CC79> <5FE5> <CC7A> <CC7A> <602D> <CC7B> <CC7B> <6026> <CC7C> <CC7C> <6019> <CC7D> <CC7D> <6032> <CC7E> <CC7E> <600B> <CCA1> <CCA1> <6034> <CCA2> <CCA2> <600A> <CCA3> <CCA3> <6017> <CCA4> <CCA4> <6033> <CCA5> <CCA5> <601A> <CCA6> <CCA6> <601E> <CCA7> <CCA7> <602C> <CCA8> <CCA8> <6022> <CCA9> <CCA9> <600D> <CCAA> <CCAA> <6010> <CCAB> <CCAB> <602E> <CCAC> <CCAC> <6013> <CCAD> <CCAD> <6011> <CCAE> <CCAE> <600C> <CCAF> <CCAF> <6009> <CCB0> <CCB0> <601C> <CCB1> <CCB1> <6214> <CCB2> <CCB2> <623D> <CCB3> <CCB3> <62AD> <CCB4> <CCB4> <62B4> <CCB5> <CCB5> <62D1> <CCB6> <CCB6> <62BE> <CCB7> <CCB7> <62AA> <CCB8> <CCB8> <62B6> <CCB9> <CCB9> <62CA> <CCBA> <CCBA> <62AE> <CCBB> <CCBB> <62B3> <CCBC> <CCBC> <62AF> <CCBD> <CCBD> <62BB> <CCBE> <CCBE> <62A9> <CCBF> <CCBF> <62B0> <CCC0> <CCC0> <62B8> <CCC1> <CCC1> <653D> <CCC2> <CCC2> <65A8> <CCC3> <CCC3> <65BB> <CCC4> <CCC4> <6609> <CCC5> <CCC5> <65FC> <CCC6> <CCC6> <6604> <CCC7> <CCC7> <6612> <CCC8> <CCC8> <6608> <CCC9> <CCC9> <65FB> <CCCA> <CCCA> <6603> <CCCB> <CCCB> <660B> <CCCC> <CCCC> <660D> <CCCD> <CCCD> <6605> <CCCE> <CCCE> <65FD> <CCCF> <CCCF> <6611> <CCD0> <CCD0> <6610> <CCD1> <CCD1> <66F6> <CCD2> <CCD2> <670A> <CCD3> <CCD3> <6785> <CCD4> <CCD4> <676C> <CCD5> <CCD5> <678E> <CCD6> <CCD6> <6792> <CCD7> <CCD7> <6776> <CCD8> <CCD8> <677B> <CCD9> <CCD9> <6798> <CCDA> <CCDA> <6786> <CCDB> <CCDB> <6784> <CCDC> <CCDC> <6774> <CCDD> <CCDD> <678D> <CCDE> <CCDE> <678C> <CCDF> <CCDF> <677A> <CCE0> <CCE0> <679F> <CCE1> <CCE1> <6791> <CCE2> <CCE2> <6799> <CCE3> <CCE3> <6783> <CCE4> <CCE4> <677D> <CCE5> <CCE5> <6781> <CCE6> <CCE7> <6778> <CCE8> <CCE8> <6794> <CCE9> <CCE9> <6B25> <CCEA> <CCEA> <6B80> <CCEB> <CCEB> <6B7E> <CCEC> <CCEC> <6BDE> <CCED> <CCED> <6C1D> <CCEE> <CCEE> <6C93> <CCEF> <CCEF> <6CEC> <CCF0> <CCF0> <6CEB> <CCF1> <CCF1> <6CEE> <CCF2> <CCF2> <6CD9> <CCF3> <CCF3> <6CB6> <CCF4> <CCF4> <6CD4> <CCF5> <CCF5> <6CAD> <CCF6> <CCF6> <6CE7> <CCF7> <CCF7> <6CB7> <CCF8> <CCF8> <6CD0> endbfrange 100 beginbfrange <CCF9> <CCF9> <6CC2> <CCFA> <CCFA> <6CBA> <CCFB> <CCFB> <6CC3> <CCFC> <CCFC> <6CC6> <CCFD> <CCFD> <6CED> <CCFE> <CCFE> <6CF2> <CD40> <CD40> <6CD2> <CD41> <CD41> <6CDD> <CD42> <CD42> <6CB4> <CD43> <CD43> <6C8A> <CD44> <CD44> <6C9D> <CD45> <CD45> <6C80> <CD46> <CD46> <6CDE> <CD47> <CD47> <6CC0> <CD48> <CD48> <6D30> <CD49> <CD49> <6CCD> <CD4A> <CD4A> <6CC7> <CD4B> <CD4B> <6CB0> <CD4C> <CD4C> <6CF9> <CD4D> <CD4D> <6CCF> <CD4E> <CD4E> <6CE9> <CD4F> <CD4F> <6CD1> <CD50> <CD50> <7094> <CD51> <CD51> <7098> <CD52> <CD52> <7085> <CD53> <CD53> <7093> <CD54> <CD54> <7086> <CD55> <CD55> <7084> <CD56> <CD56> <7091> <CD57> <CD57> <7096> <CD58> <CD58> <7082> <CD59> <CD59> <709A> <CD5A> <CD5A> <7083> <CD5B> <CD5B> <726A> <CD5C> <CD5C> <72D6> <CD5D> <CD5D> <72CB> <CD5E> <CD5E> <72D8> <CD5F> <CD5F> <72C9> <CD60> <CD60> <72DC> <CD61> <CD61> <72D2> <CD62> <CD62> <72D4> <CD63> <CD63> <72DA> <CD64> <CD64> <72CC> <CD65> <CD65> <72D1> <CD66> <CD66> <73A4> <CD67> <CD67> <73A1> <CD68> <CD68> <73AD> <CD69> <CD69> <73A6> <CD6A> <CD6A> <73A2> <CD6B> <CD6B> <73A0> <CD6C> <CD6C> <73AC> <CD6D> <CD6D> <739D> <CD6E> <CD6E> <74DD> <CD6F> <CD6F> <74E8> <CD70> <CD71> <753F> <CD72> <CD72> <753E> <CD73> <CD73> <758C> <CD74> <CD74> <7598> <CD75> <CD75> <76AF> <CD76> <CD76> <76F3> <CD77> <CD77> <76F1> <CD78> <CD78> <76F0> <CD79> <CD79> <76F5> <CD7A> <CD7A> <77F8> <CD7B> <CD7B> <77FC> <CD7C> <CD7C> <77F9> <CD7D> <CD7D> <77FB> <CD7E> <CD7E> <77FA> <CDA1> <CDA1> <77F7> <CDA2> <CDA2> <7942> <CDA3> <CDA3> <793F> <CDA4> <CDA4> <79C5> <CDA5> <CDA5> <7A78> <CDA6> <CDA6> <7A7B> <CDA7> <CDA7> <7AFB> <CDA8> <CDA8> <7C75> <CDA9> <CDA9> <7CFD> <CDAA> <CDAA> <8035> <CDAB> <CDAB> <808F> <CDAC> <CDAC> <80AE> <CDAD> <CDAD> <80A3> <CDAE> <CDAE> <80B8> <CDAF> <CDAF> <80B5> <CDB0> <CDB0> <80AD> <CDB1> <CDB1> <8220> <CDB2> <CDB2> <82A0> <CDB3> <CDB3> <82C0> <CDB4> <CDB4> <82AB> <CDB5> <CDB5> <829A> <CDB6> <CDB6> <8298> <CDB7> <CDB7> <829B> <CDB8> <CDB8> <82B5> <CDB9> <CDB9> <82A7> <CDBA> <CDBA> <82AE> <CDBB> <CDBB> <82BC> <CDBC> <CDBC> <829E> <CDBD> <CDBD> <82BA> <CDBE> <CDBE> <82B4> <CDBF> <CDBF> <82A8> <CDC0> <CDC0> <82A1> endbfrange 100 beginbfrange <CDC1> <CDC1> <82A9> <CDC2> <CDC2> <82C2> <CDC3> <CDC3> <82A4> <CDC4> <CDC4> <82C3> <CDC5> <CDC5> <82B6> <CDC6> <CDC6> <82A2> <CDC7> <CDC7> <8670> <CDC8> <CDC8> <866F> <CDC9> <CDCA> <866D> <CDCB> <CDCB> <8C56> <CDCC> <CDCC> <8FD2> <CDCD> <CDCD> <8FCB> <CDCE> <CDCE> <8FD3> <CDCF> <CDCF> <8FCD> <CDD0> <CDD0> <8FD6> <CDD1> <CDD1> <8FD5> <CDD2> <CDD2> <8FD7> <CDD3> <CDD3> <90B2> <CDD4> <CDD4> <90B4> <CDD5> <CDD5> <90AF> <CDD6> <CDD6> <90B3> <CDD7> <CDD7> <90B0> <CDD8> <CDD8> <9639> <CDD9> <CDD9> <963D> <CDDA> <CDDA> <963C> <CDDB> <CDDB> <963A> <CDDC> <CDDC> <9643> <CDDD> <CDDD> <4FCD> <CDDE> <CDDE> <4FC5> <CDDF> <CDDF> <4FD3> <CDE0> <CDE0> <4FB2> <CDE1> <CDE1> <4FC9> <CDE2> <CDE2> <4FCB> <CDE3> <CDE3> <4FC1> <CDE4> <CDE4> <4FD4> <CDE5> <CDE5> <4FDC> <CDE6> <CDE6> <4FD9> <CDE7> <CDE7> <4FBB> <CDE8> <CDE8> <4FB3> <CDE9> <CDE9> <4FDB> <CDEA> <CDEA> <4FC7> <CDEB> <CDEB> <4FD6> <CDEC> <CDEC> <4FBA> <CDED> <CDED> <4FC0> <CDEE> <CDEE> <4FB9> <CDEF> <CDEF> <4FEC> <CDF0> <CDF0> <5244> <CDF1> <CDF1> <5249> <CDF2> <CDF2> <52C0> <CDF3> <CDF3> <52C2> <CDF4> <CDF4> <533D> <CDF5> <CDF5> <537C> <CDF6> <CDF6> <5397> <CDF7> <CDF7> <5396> <CDF8> <CDF8> <5399> <CDF9> <CDF9> <5398> <CDFA> <CDFA> <54BA> <CDFB> <CDFB> <54A1> <CDFC> <CDFC> <54AD> <CDFD> <CDFD> <54A5> <CDFE> <CDFE> <54CF> <CE40> <CE40> <54C3> <CE41> <CE41> <830D> <CE42> <CE42> <54B7> <CE43> <CE43> <54AE> <CE44> <CE44> <54D6> <CE45> <CE45> <54B6> <CE46> <CE47> <54C5> <CE48> <CE48> <54A0> <CE49> <CE49> <5470> <CE4A> <CE4A> <54BC> <CE4B> <CE4B> <54A2> <CE4C> <CE4C> <54BE> <CE4D> <CE4D> <5472> <CE4E> <CE4E> <54DE> <CE4F> <CE4F> <54B0> <CE50> <CE50> <57B5> <CE51> <CE52> <579E> <CE53> <CE53> <57A4> <CE54> <CE54> <578C> <CE55> <CE55> <5797> <CE56> <CE56> <579D> <CE57> <CE57> <579B> <CE58> <CE58> <5794> <CE59> <CE59> <5798> <CE5A> <CE5A> <578F> <CE5B> <CE5B> <5799> <CE5C> <CE5C> <57A5> <CE5D> <CE5D> <579A> <CE5E> <CE5E> <5795> <CE5F> <CE5F> <58F4> <CE60> <CE60> <590D> <CE61> <CE61> <5953> <CE62> <CE62> <59E1> <CE63> <CE63> <59DE> <CE64> <CE64> <59EE> <CE65> <CE65> <5A00> <CE66> <CE66> <59F1> <CE67> <CE67> <59DD> <CE68> <CE68> <59FA> endbfrange 100 beginbfrange <CE69> <CE69> <59FD> <CE6A> <CE6A> <59FC> <CE6B> <CE6B> <59F6> <CE6C> <CE6C> <59E4> <CE6D> <CE6D> <59F2> <CE6E> <CE6E> <59F7> <CE6F> <CE6F> <59DB> <CE70> <CE70> <59E9> <CE71> <CE71> <59F3> <CE72> <CE72> <59F5> <CE73> <CE73> <59E0> <CE74> <CE74> <59FE> <CE75> <CE75> <59F4> <CE76> <CE76> <59ED> <CE77> <CE77> <5BA8> <CE78> <CE78> <5C4C> <CE79> <CE79> <5CD0> <CE7A> <CE7A> <5CD8> <CE7B> <CE7B> <5CCC> <CE7C> <CE7C> <5CD7> <CE7D> <CE7D> <5CCB> <CE7E> <CE7E> <5CDB> <CEA1> <CEA1> <5CDE> <CEA2> <CEA2> <5CDA> <CEA3> <CEA3> <5CC9> <CEA4> <CEA4> <5CC7> <CEA5> <CEA5> <5CCA> <CEA6> <CEA6> <5CD6> <CEA7> <CEA8> <5CD3> <CEA9> <CEA9> <5CCF> <CEAA> <CEAA> <5CC8> <CEAB> <CEAB> <5CC6> <CEAC> <CEAC> <5CCE> <CEAD> <CEAD> <5CDF> <CEAE> <CEAE> <5CF8> <CEAF> <CEAF> <5DF9> <CEB0> <CEB2> <5E21> <CEB3> <CEB3> <5E20> <CEB4> <CEB4> <5E24> <CEB5> <CEB5> <5EB0> <CEB6> <CEB6> <5EA4> <CEB7> <CEB7> <5EA2> <CEB8> <CEB8> <5E9B> <CEB9> <CEB9> <5EA3> <CEBA> <CEBA> <5EA5> <CEBB> <CEBB> <5F07> <CEBC> <CEBC> <5F2E> <CEBD> <CEBD> <5F56> <CEBE> <CEBE> <5F86> <CEBF> <CEBF> <6037> <CEC0> <CEC0> <6039> <CEC1> <CEC1> <6054> <CEC2> <CEC2> <6072> <CEC3> <CEC3> <605E> <CEC4> <CEC4> <6045> <CEC5> <CEC5> <6053> <CEC6> <CEC6> <6047> <CEC7> <CEC7> <6049> <CEC8> <CEC8> <605B> <CEC9> <CEC9> <604C> <CECA> <CECA> <6040> <CECB> <CECB> <6042> <CECC> <CECC> <605F> <CECD> <CECD> <6024> <CECE> <CECE> <6044> <CECF> <CECF> <6058> <CED0> <CED0> <6066> <CED1> <CED1> <606E> <CED2> <CED3> <6242> <CED4> <CED4> <62CF> <CED5> <CED5> <630D> <CED6> <CED6> <630B> <CED7> <CED7> <62F5> <CED8> <CED8> <630E> <CED9> <CED9> <6303> <CEDA> <CEDA> <62EB> <CEDB> <CEDB> <62F9> <CEDC> <CEDC> <630F> <CEDD> <CEDD> <630C> <CEDE> <CEDE> <62F8> <CEDF> <CEDF> <62F6> <CEE0> <CEE0> <6300> <CEE1> <CEE2> <6313> <CEE3> <CEE3> <62FA> <CEE4> <CEE4> <6315> <CEE5> <CEE5> <62FB> <CEE6> <CEE6> <62F0> <CEE7> <CEE7> <6541> <CEE8> <CEE8> <6543> <CEE9> <CEE9> <65AA> <CEEA> <CEEA> <65BF> <CEEB> <CEEB> <6636> <CEEC> <CEEC> <6621> <CEED> <CEED> <6632> <CEEE> <CEEE> <6635> <CEEF> <CEEF> <661C> <CEF0> <CEF0> <6626> <CEF1> <CEF1> <6622> <CEF2> <CEF2> <6633> <CEF3> <CEF3> <662B> endbfrange 100 beginbfrange <CEF4> <CEF4> <663A> <CEF5> <CEF5> <661D> <CEF6> <CEF6> <6634> <CEF7> <CEF7> <6639> <CEF8> <CEF8> <662E> <CEF9> <CEFA> <670F> <CEFB> <CEFB> <67C1> <CEFC> <CEFC> <67F2> <CEFD> <CEFD> <67C8> <CEFE> <CEFE> <67BA> <CF40> <CF40> <67DC> <CF41> <CF41> <67BB> <CF42> <CF42> <67F8> <CF43> <CF43> <67D8> <CF44> <CF44> <67C0> <CF45> <CF45> <67B7> <CF46> <CF46> <67C5> <CF47> <CF47> <67EB> <CF48> <CF48> <67E4> <CF49> <CF49> <67DF> <CF4A> <CF4A> <67B5> <CF4B> <CF4B> <67CD> <CF4C> <CF4C> <67B3> <CF4D> <CF4D> <67F7> <CF4E> <CF4E> <67F6> <CF4F> <CF4F> <67EE> <CF50> <CF50> <67E3> <CF51> <CF51> <67C2> <CF52> <CF52> <67B9> <CF53> <CF53> <67CE> <CF54> <CF54> <67E7> <CF55> <CF55> <67F0> <CF56> <CF56> <67B2> <CF57> <CF57> <67FC> <CF58> <CF58> <67C6> <CF59> <CF59> <67ED> <CF5A> <CF5A> <67CC> <CF5B> <CF5B> <67AE> <CF5C> <CF5C> <67E6> <CF5D> <CF5D> <67DB> <CF5E> <CF5E> <67FA> <CF5F> <CF60> <67C9> <CF61> <CF61> <67C3> <CF62> <CF62> <67EA> <CF63> <CF63> <67CB> <CF64> <CF64> <6B28> <CF65> <CF65> <6B82> <CF66> <CF66> <6B84> <CF67> <CF67> <6BB6> <CF68> <CF68> <6BD6> <CF69> <CF69> <6BD8> <CF6A> <CF6A> <6BE0> <CF6B> <CF6C> <6C20> <CF6D> <CF6D> <6D28> <CF6E> <CF6E> <6D34> <CF6F> <CF6F> <6D2D> <CF70> <CF70> <6D1F> <CF71> <CF71> <6D3C> <CF72> <CF72> <6D3F> <CF73> <CF73> <6D12> <CF74> <CF74> <6D0A> <CF75> <CF75> <6CDA> <CF76> <CF76> <6D33> <CF77> <CF77> <6D04> <CF78> <CF78> <6D19> <CF79> <CF79> <6D3A> <CF7A> <CF7A> <6D1A> <CF7B> <CF7B> <6D11> <CF7C> <CF7C> <6D00> <CF7D> <CF7D> <6D1D> <CF7E> <CF7E> <6D42> <CFA1> <CFA1> <6D01> <CFA2> <CFA2> <6D18> <CFA3> <CFA3> <6D37> <CFA4> <CFA4> <6D03> <CFA5> <CFA5> <6D0F> <CFA6> <CFA6> <6D40> <CFA7> <CFA7> <6D07> <CFA8> <CFA8> <6D20> <CFA9> <CFA9> <6D2C> <CFAA> <CFAA> <6D08> <CFAB> <CFAB> <6D22> <CFAC> <CFAC> <6D09> <CFAD> <CFAD> <6D10> <CFAE> <CFAE> <70B7> <CFAF> <CFAF> <709F> <CFB0> <CFB0> <70BE> <CFB1> <CFB1> <70B1> <CFB2> <CFB2> <70B0> <CFB3> <CFB3> <70A1> <CFB4> <CFB5> <70B4> <CFB6> <CFB6> <70A9> <CFB7> <CFB7> <7241> <CFB8> <CFB9> <7249> <CFBA> <CFBA> <726C> <CFBB> <CFBB> <7270> <CFBC> <CFBC> <7273> <CFBD> <CFBD> <726E> <CFBE> <CFBE> <72CA> <CFBF> <CFBF> <72E4> endbfrange 100 beginbfrange <CFC0> <CFC0> <72E8> <CFC1> <CFC1> <72EB> <CFC2> <CFC2> <72DF> <CFC3> <CFC3> <72EA> <CFC4> <CFC4> <72E6> <CFC5> <CFC5> <72E3> <CFC6> <CFC6> <7385> <CFC7> <CFC7> <73CC> <CFC8> <CFC8> <73C2> <CFC9> <CFC9> <73C8> <CFCA> <CFCA> <73C5> <CFCB> <CFCB> <73B9> <CFCC> <CFCC> <73B6> <CFCD> <CFCD> <73B5> <CFCE> <CFCE> <73B4> <CFCF> <CFCF> <73EB> <CFD0> <CFD0> <73BF> <CFD1> <CFD1> <73C7> <CFD2> <CFD2> <73BE> <CFD3> <CFD3> <73C3> <CFD4> <CFD4> <73C6> <CFD5> <CFD5> <73B8> <CFD6> <CFD6> <73CB> <CFD7> <CFD7> <74EC> <CFD8> <CFD8> <74EE> <CFD9> <CFD9> <752E> <CFDA> <CFDB> <7547> <CFDC> <CFDC> <75A7> <CFDD> <CFDD> <75AA> <CFDE> <CFDE> <7679> <CFDF> <CFDF> <76C4> <CFE0> <CFE0> <7708> <CFE1> <CFE3> <7703> <CFE4> <CFE4> <770A> <CFE5> <CFE5> <76F7> <CFE6> <CFE6> <76FB> <CFE7> <CFE7> <76FA> <CFE8> <CFE9> <77E7> <CFEA> <CFEA> <7806> <CFEB> <CFEC> <7811> <CFED> <CFED> <7805> <CFEE> <CFEE> <7810> <CFEF> <CFEF> <780F> <CFF0> <CFF0> <780E> <CFF1> <CFF1> <7809> <CFF2> <CFF2> <7803> <CFF3> <CFF3> <7813> <CFF4> <CFF4> <794A> <CFF5> <CFF5> <794C> <CFF6> <CFF6> <794B> <CFF7> <CFF7> <7945> <CFF8> <CFF8> <7944> <CFF9> <CFF9> <79D5> <CFFA> <CFFA> <79CD> <CFFB> <CFFB> <79CF> <CFFC> <CFFC> <79D6> <CFFD> <CFFD> <79CE> <CFFE> <CFFE> <7A80> <D040> <D040> <7A7E> <D041> <D041> <7AD1> <D042> <D043> <7B00> <D044> <D044> <7C7A> <D045> <D046> <7C78> <D047> <D049> <7C7F> <D04A> <D04A> <7D03> <D04B> <D04B> <7D08> <D04C> <D04C> <7D01> <D04D> <D04D> <7F58> <D04E> <D04E> <7F91> <D04F> <D04F> <7F8D> <D050> <D050> <7FBE> <D051> <D051> <8007> <D052> <D053> <800E> <D054> <D054> <8014> <D055> <D055> <8037> <D056> <D056> <80D8> <D057> <D057> <80C7> <D058> <D058> <80E0> <D059> <D059> <80D1> <D05A> <D05A> <80C8> <D05B> <D05B> <80C2> <D05C> <D05C> <80D0> <D05D> <D05D> <80C5> <D05E> <D05E> <80E3> <D05F> <D05F> <80D9> <D060> <D060> <80DC> <D061> <D061> <80CA> <D062> <D062> <80D5> <D063> <D063> <80C9> <D064> <D064> <80CF> <D065> <D065> <80D7> <D066> <D066> <80E6> <D067> <D067> <80CD> <D068> <D068> <81FF> <D069> <D069> <8221> <D06A> <D06A> <8294> <D06B> <D06B> <82D9> <D06C> <D06C> <82FE> <D06D> <D06D> <82F9> <D06E> <D06E> <8307> endbfrange 100 beginbfrange <D06F> <D06F> <82E8> <D070> <D070> <8300> <D071> <D071> <82D5> <D072> <D072> <833A> <D073> <D073> <82EB> <D074> <D074> <82D6> <D075> <D075> <82F4> <D076> <D076> <82EC> <D077> <D077> <82E1> <D078> <D078> <82F2> <D079> <D079> <82F5> <D07A> <D07A> <830C> <D07B> <D07B> <82FB> <D07C> <D07C> <82F6> <D07D> <D07D> <82F0> <D07E> <D07E> <82EA> <D0A1> <D0A1> <82E4> <D0A2> <D0A2> <82E0> <D0A3> <D0A3> <82FA> <D0A4> <D0A4> <82F3> <D0A5> <D0A5> <82ED> <D0A6> <D0A6> <8677> <D0A7> <D0A7> <8674> <D0A8> <D0A8> <867C> <D0A9> <D0A9> <8673> <D0AA> <D0AA> <8841> <D0AB> <D0AB> <884E> <D0AC> <D0AC> <8867> <D0AD> <D0AD> <886A> <D0AE> <D0AE> <8869> <D0AF> <D0AF> <89D3> <D0B0> <D0B0> <8A04> <D0B1> <D0B1> <8A07> <D0B2> <D0B2> <8D72> <D0B3> <D0B3> <8FE3> <D0B4> <D0B4> <8FE1> <D0B5> <D0B5> <8FEE> <D0B6> <D0B6> <8FE0> <D0B7> <D0B7> <90F1> <D0B8> <D0B8> <90BD> <D0B9> <D0B9> <90BF> <D0BA> <D0BA> <90D5> <D0BB> <D0BB> <90C5> <D0BC> <D0BC> <90BE> <D0BD> <D0BD> <90C7> <D0BE> <D0BE> <90CB> <D0BF> <D0BF> <90C8> <D0C0> <D0C0> <91D4> <D0C1> <D0C1> <91D3> <D0C2> <D0C2> <9654> <D0C3> <D0C3> <964F> <D0C4> <D0C4> <9651> <D0C5> <D0C5> <9653> <D0C6> <D0C6> <964A> <D0C7> <D0C7> <964E> <D0C8> <D0C8> <501E> <D0C9> <D0C9> <5005> <D0CA> <D0CA> <5007> <D0CB> <D0CB> <5013> <D0CC> <D0CC> <5022> <D0CD> <D0CD> <5030> <D0CE> <D0CE> <501B> <D0CF> <D0CF> <4FF5> <D0D0> <D0D0> <4FF4> <D0D1> <D0D1> <5033> <D0D2> <D0D2> <5037> <D0D3> <D0D3> <502C> <D0D4> <D0D5> <4FF6> <D0D6> <D0D6> <5017> <D0D7> <D0D7> <501C> <D0D8> <D0D8> <5020> <D0D9> <D0D9> <5027> <D0DA> <D0DA> <5035> <D0DB> <D0DB> <502F> <D0DC> <D0DC> <5031> <D0DD> <D0DD> <500E> <D0DE> <D0DE> <515A> <D0DF> <D0DF> <5194> <D0E0> <D0E0> <5193> <D0E1> <D0E1> <51CA> <D0E2> <D0E3> <51C4> <D0E4> <D0E4> <51C8> <D0E5> <D0E5> <51CE> <D0E6> <D0E6> <5261> <D0E7> <D0E7> <525A> <D0E8> <D0E8> <5252> <D0E9> <D0EA> <525E> <D0EB> <D0EB> <5255> <D0EC> <D0EC> <5262> <D0ED> <D0ED> <52CD> <D0EE> <D0EE> <530E> <D0EF> <D0EF> <539E> <D0F0> <D0F0> <5526> <D0F1> <D0F1> <54E2> <D0F2> <D0F2> <5517> <D0F3> <D0F3> <5512> <D0F4> <D0F4> <54E7> <D0F5> <D0F5> <54F3> <D0F6> <D0F6> <54E4> <D0F7> <D0F7> <551A> endbfrange 100 beginbfrange <D0F8> <D0F8> <54FF> <D0F9> <D0F9> <5504> <D0FA> <D0FA> <5508> <D0FB> <D0FB> <54EB> <D0FC> <D0FC> <5511> <D0FD> <D0FD> <5505> <D0FE> <D0FE> <54F1> <D140> <D140> <550A> <D141> <D141> <54FB> <D142> <D143> <54F7> <D144> <D144> <54E0> <D145> <D145> <550E> <D146> <D146> <5503> <D147> <D147> <550B> <D148> <D149> <5701> <D14A> <D14A> <57CC> <D14B> <D14B> <5832> <D14C> <D14C> <57D5> <D14D> <D14D> <57D2> <D14E> <D14E> <57BA> <D14F> <D14F> <57C6> <D150> <D150> <57BD> <D151> <D151> <57BC> <D152> <D152> <57B8> <D153> <D153> <57B6> <D154> <D154> <57BF> <D155> <D155> <57C7> <D156> <D156> <57D0> <D157> <D157> <57B9> <D158> <D158> <57C1> <D159> <D159> <590E> <D15A> <D15A> <594A> <D15B> <D15B> <5A19> <D15C> <D15C> <5A16> <D15D> <D15E> <5A2D> <D15F> <D15F> <5A15> <D160> <D160> <5A0F> <D161> <D161> <5A17> <D162> <D162> <5A0A> <D163> <D163> <5A1E> <D164> <D164> <5A33> <D165> <D165> <5B6C> <D166> <D166> <5BA7> <D167> <D167> <5BAD> <D168> <D168> <5BAC> <D169> <D169> <5C03> <D16A> <D16A> <5C56> <D16B> <D16B> <5C54> <D16C> <D16C> <5CEC> <D16D> <D16D> <5CFF> <D16E> <D16E> <5CEE> <D16F> <D16F> <5CF1> <D170> <D170> <5CF7> <D171> <D171> <5D00> <D172> <D172> <5CF9> <D173> <D173> <5E29> <D174> <D174> <5E28> <D175> <D175> <5EA8> <D176> <D176> <5EAE> <D177> <D177> <5EAA> <D178> <D178> <5EAC> <D179> <D179> <5F33> <D17A> <D17A> <5F30> <D17B> <D17B> <5F67> <D17C> <D17C> <605D> <D17D> <D17D> <605A> <D17E> <D17E> <6067> <D1A1> <D1A1> <6041> <D1A2> <D1A2> <60A2> <D1A3> <D1A3> <6088> <D1A4> <D1A4> <6080> <D1A5> <D1A5> <6092> <D1A6> <D1A6> <6081> <D1A7> <D1A7> <609D> <D1A8> <D1A8> <6083> <D1A9> <D1A9> <6095> <D1AA> <D1AA> <609B> <D1AB> <D1AB> <6097> <D1AC> <D1AC> <6087> <D1AD> <D1AD> <609C> <D1AE> <D1AE> <608E> <D1AF> <D1AF> <6219> <D1B0> <D1B0> <6246> <D1B1> <D1B1> <62F2> <D1B2> <D1B2> <6310> <D1B3> <D1B3> <6356> <D1B4> <D1B4> <632C> <D1B5> <D1B6> <6344> <D1B7> <D1B7> <6336> <D1B8> <D1B8> <6343> <D1B9> <D1B9> <63E4> <D1BA> <D1BA> <6339> <D1BB> <D1BB> <634B> <D1BC> <D1BC> <634A> <D1BD> <D1BD> <633C> <D1BE> <D1BE> <6329> <D1BF> <D1BF> <6341> <D1C0> <D1C0> <6334> <D1C1> <D1C1> <6358> <D1C2> <D1C2> <6354> endbfrange 100 beginbfrange <D1C3> <D1C3> <6359> <D1C4> <D1C4> <632D> <D1C5> <D1C5> <6347> <D1C6> <D1C6> <6333> <D1C7> <D1C7> <635A> <D1C8> <D1C8> <6351> <D1C9> <D1C9> <6338> <D1CA> <D1CA> <6357> <D1CB> <D1CB> <6340> <D1CC> <D1CC> <6348> <D1CD> <D1CD> <654A> <D1CE> <D1CE> <6546> <D1CF> <D1CF> <65C6> <D1D0> <D1D1> <65C3> <D1D2> <D1D2> <65C2> <D1D3> <D1D3> <664A> <D1D4> <D1D4> <665F> <D1D5> <D1D5> <6647> <D1D6> <D1D6> <6651> <D1D7> <D1D8> <6712> <D1D9> <D1D9> <681F> <D1DA> <D1DA> <681A> <D1DB> <D1DB> <6849> <D1DC> <D1DD> <6832> <D1DE> <D1DE> <683B> <D1DF> <D1DF> <684B> <D1E0> <D1E0> <684F> <D1E1> <D1E1> <6816> <D1E2> <D1E2> <6831> <D1E3> <D1E3> <681C> <D1E4> <D1E4> <6835> <D1E5> <D1E5> <682B> <D1E6> <D1E6> <682D> <D1E7> <D1E7> <682F> <D1E8> <D1E8> <684E> <D1E9> <D1E9> <6844> <D1EA> <D1EA> <6834> <D1EB> <D1EB> <681D> <D1EC> <D1EC> <6812> <D1ED> <D1ED> <6814> <D1EE> <D1EE> <6826> <D1EF> <D1EF> <6828> <D1F0> <D1F0> <682E> <D1F1> <D1F1> <684D> <D1F2> <D1F2> <683A> <D1F3> <D1F3> <6825> <D1F4> <D1F4> <6820> <D1F5> <D1F5> <6B2C> <D1F6> <D1F6> <6B2F> <D1F7> <D1F7> <6B2D> <D1F8> <D1F8> <6B31> <D1F9> <D1F9> <6B34> <D1FA> <D1FA> <6B6D> <D1FB> <D1FB> <8082> <D1FC> <D1FC> <6B88> <D1FD> <D1FD> <6BE6> <D1FE> <D1FE> <6BE4> <D240> <D240> <6BE8> <D241> <D241> <6BE3> <D242> <D242> <6BE2> <D243> <D243> <6BE7> <D244> <D244> <6C25> <D245> <D245> <6D7A> <D246> <D247> <6D63> <D248> <D248> <6D76> <D249> <D249> <6D0D> <D24A> <D24A> <6D61> <D24B> <D24B> <6D92> <D24C> <D24C> <6D58> <D24D> <D24D> <6D62> <D24E> <D24E> <6D6D> <D24F> <D24F> <6D6F> <D250> <D250> <6D91> <D251> <D251> <6D8D> <D252> <D252> <6DEF> <D253> <D253> <6D7F> <D254> <D254> <6D86> <D255> <D255> <6D5E> <D256> <D256> <6D67> <D257> <D257> <6D60> <D258> <D258> <6D97> <D259> <D259> <6D70> <D25A> <D25A> <6D7C> <D25B> <D25B> <6D5F> <D25C> <D25C> <6D82> <D25D> <D25D> <6D98> <D25E> <D25E> <6D2F> <D25F> <D25F> <6D68> <D260> <D260> <6D8B> <D261> <D261> <6D7E> <D262> <D262> <6D80> <D263> <D263> <6D84> <D264> <D264> <6D16> <D265> <D265> <6D83> <D266> <D266> <6D7B> <D267> <D267> <6D7D> <D268> <D268> <6D75> <D269> <D269> <6D90> <D26A> <D26A> <70DC> <D26B> <D26B> <70D3> endbfrange 100 beginbfrange <D26C> <D26C> <70D1> <D26D> <D26D> <70DD> <D26E> <D26E> <70CB> <D26F> <D26F> <7F39> <D270> <D270> <70E2> <D271> <D271> <70D7> <D272> <D272> <70D2> <D273> <D273> <70DE> <D274> <D274> <70E0> <D275> <D275> <70D4> <D276> <D276> <70CD> <D277> <D279> <70C5> <D27A> <D27A> <70DA> <D27B> <D27B> <70CE> <D27C> <D27C> <70E1> <D27D> <D27D> <7242> <D27E> <D27E> <7278> <D2A1> <D2A1> <7277> <D2A2> <D2A2> <7276> <D2A3> <D2A3> <7300> <D2A4> <D2A4> <72FA> <D2A5> <D2A5> <72F4> <D2A6> <D2A6> <72FE> <D2A7> <D2A7> <72F6> <D2A8> <D2A8> <72F3> <D2A9> <D2A9> <72FB> <D2AA> <D2AA> <7301> <D2AB> <D2AB> <73D3> <D2AC> <D2AC> <73D9> <D2AD> <D2AD> <73E5> <D2AE> <D2AE> <73D6> <D2AF> <D2AF> <73BC> <D2B0> <D2B0> <73E7> <D2B1> <D2B1> <73E3> <D2B2> <D2B2> <73E9> <D2B3> <D2B3> <73DC> <D2B4> <D2B4> <73D2> <D2B5> <D2B5> <73DB> <D2B6> <D2B6> <73D4> <D2B7> <D2B7> <73DD> <D2B8> <D2B8> <73DA> <D2B9> <D2BA> <73D7> <D2BB> <D2BB> <73E8> <D2BC> <D2BD> <74DE> <D2BE> <D2BF> <74F4> <D2C0> <D2C0> <7521> <D2C1> <D2C1> <755B> <D2C2> <D2C2> <755F> <D2C3> <D2C3> <75B0> <D2C4> <D2C4> <75C1> <D2C5> <D2C5> <75BB> <D2C6> <D2C6> <75C4> <D2C7> <D2C7> <75C0> <D2C8> <D2C8> <75BF> <D2C9> <D2C9> <75B6> <D2CA> <D2CA> <75BA> <D2CB> <D2CB> <768A> <D2CC> <D2CC> <76C9> <D2CD> <D2CD> <771D> <D2CE> <D2CE> <771B> <D2CF> <D2CF> <7710> <D2D0> <D2D0> <7713> <D2D1> <D2D1> <7712> <D2D2> <D2D2> <7723> <D2D3> <D2D3> <7711> <D2D4> <D2D4> <7715> <D2D5> <D2D6> <7719> <D2D7> <D2D7> <7722> <D2D8> <D2D8> <7727> <D2D9> <D2D9> <7823> <D2DA> <D2DA> <782C> <D2DB> <D2DB> <7822> <D2DC> <D2DC> <7835> <D2DD> <D2DD> <782F> <D2DE> <D2DE> <7828> <D2DF> <D2DF> <782E> <D2E0> <D2E0> <782B> <D2E1> <D2E1> <7821> <D2E2> <D2E2> <7829> <D2E3> <D2E3> <7833> <D2E4> <D2E4> <782A> <D2E5> <D2E5> <7831> <D2E6> <D2E6> <7954> <D2E7> <D2E7> <795B> <D2E8> <D2E8> <794F> <D2E9> <D2E9> <795C> <D2EA> <D2EA> <7953> <D2EB> <D2EB> <7952> <D2EC> <D2EC> <7951> <D2ED> <D2EE> <79EB> <D2EF> <D2EF> <79E0> <D2F0> <D2F0> <79EE> <D2F1> <D2F1> <79ED> <D2F2> <D2F2> <79EA> <D2F3> <D2F3> <79DC> <D2F4> <D2F4> <79DE> <D2F5> <D2F5> <79DD> <D2F6> <D2F6> <7A86> <D2F7> <D2F7> <7A89> <D2F8> <D2F8> <7A85> endbfrange 100 beginbfrange <D2F9> <D2FA> <7A8B> <D2FB> <D2FB> <7A8A> <D2FC> <D2FC> <7A87> <D2FD> <D2FD> <7AD8> <D2FE> <D2FE> <7B10> <D340> <D340> <7B04> <D341> <D341> <7B13> <D342> <D342> <7B05> <D343> <D343> <7B0F> <D344> <D344> <7B08> <D345> <D345> <7B0A> <D346> <D346> <7B0E> <D347> <D347> <7B09> <D348> <D348> <7B12> <D349> <D349> <7C84> <D34A> <D34A> <7C91> <D34B> <D34B> <7C8A> <D34C> <D34C> <7C8C> <D34D> <D34D> <7C88> <D34E> <D34E> <7C8D> <D34F> <D34F> <7C85> <D350> <D350> <7D1E> <D351> <D351> <7D1D> <D352> <D352> <7D11> <D353> <D353> <7D0E> <D354> <D354> <7D18> <D355> <D355> <7D16> <D356> <D356> <7D13> <D357> <D357> <7D1F> <D358> <D358> <7D12> <D359> <D359> <7D0F> <D35A> <D35A> <7D0C> <D35B> <D35B> <7F5C> <D35C> <D35C> <7F61> <D35D> <D35D> <7F5E> <D35E> <D35E> <7F60> <D35F> <D35F> <7F5D> <D360> <D360> <7F5B> <D361> <D361> <7F96> <D362> <D362> <7F92> <D363> <D363> <7FC3> <D364> <D364> <7FC2> <D365> <D365> <7FC0> <D366> <D366> <8016> <D367> <D367> <803E> <D368> <D368> <8039> <D369> <D369> <80FA> <D36A> <D36A> <80F2> <D36B> <D36B> <80F9> <D36C> <D36C> <80F5> <D36D> <D36D> <8101> <D36E> <D36E> <80FB> <D36F> <D36F> <8100> <D370> <D370> <8201> <D371> <D371> <822F> <D372> <D372> <8225> <D373> <D373> <8333> <D374> <D374> <832D> <D375> <D375> <8344> <D376> <D376> <8319> <D377> <D377> <8351> <D378> <D378> <8325> <D379> <D379> <8356> <D37A> <D37A> <833F> <D37B> <D37B> <8341> <D37C> <D37C> <8326> <D37D> <D37D> <831C> <D37E> <D37E> <8322> <D3A1> <D3A1> <8342> <D3A2> <D3A2> <834E> <D3A3> <D3A3> <831B> <D3A4> <D3A4> <832A> <D3A5> <D3A5> <8308> <D3A6> <D3A6> <833C> <D3A7> <D3A7> <834D> <D3A8> <D3A8> <8316> <D3A9> <D3A9> <8324> <D3AA> <D3AA> <8320> <D3AB> <D3AB> <8337> <D3AC> <D3AC> <832F> <D3AD> <D3AD> <8329> <D3AE> <D3AE> <8347> <D3AF> <D3AF> <8345> <D3B0> <D3B0> <834C> <D3B1> <D3B1> <8353> <D3B2> <D3B2> <831E> <D3B3> <D3B3> <832C> <D3B4> <D3B4> <834B> <D3B5> <D3B5> <8327> <D3B6> <D3B6> <8348> <D3B7> <D3B7> <8653> <D3B8> <D3B8> <8652> <D3B9> <D3B9> <86A2> <D3BA> <D3BA> <86A8> <D3BB> <D3BB> <8696> <D3BC> <D3BC> <868D> <D3BD> <D3BD> <8691> <D3BE> <D3BE> <869E> <D3BF> <D3BF> <8687> <D3C0> <D3C0> <8697> endbfrange 100 beginbfrange <D3C1> <D3C1> <8686> <D3C2> <D3C2> <868B> <D3C3> <D3C3> <869A> <D3C4> <D3C4> <8685> <D3C5> <D3C5> <86A5> <D3C6> <D3C6> <8699> <D3C7> <D3C7> <86A1> <D3C8> <D3C8> <86A7> <D3C9> <D3C9> <8695> <D3CA> <D3CA> <8698> <D3CB> <D3CB> <868E> <D3CC> <D3CC> <869D> <D3CD> <D3CD> <8690> <D3CE> <D3CE> <8694> <D3CF> <D3D0> <8843> <D3D1> <D3D1> <886D> <D3D2> <D3D3> <8875> <D3D4> <D3D4> <8872> <D3D5> <D3D5> <8880> <D3D6> <D3D6> <8871> <D3D7> <D3D7> <887F> <D3D8> <D3D8> <886F> <D3D9> <D3D9> <8883> <D3DA> <D3DA> <887E> <D3DB> <D3DB> <8874> <D3DC> <D3DC> <887C> <D3DD> <D3DD> <8A12> <D3DE> <D3DE> <8C47> <D3DF> <D3DF> <8C57> <D3E0> <D3E0> <8C7B> <D3E1> <D3E1> <8CA4> <D3E2> <D3E2> <8CA3> <D3E3> <D3E3> <8D76> <D3E4> <D3E4> <8D78> <D3E5> <D3E5> <8DB5> <D3E6> <D3E6> <8DB7> <D3E7> <D3E7> <8DB6> <D3E8> <D3E8> <8ED1> <D3E9> <D3E9> <8ED3> <D3EA> <D3EA> <8FFE> <D3EB> <D3EB> <8FF5> <D3EC> <D3EC> <9002> <D3ED> <D3ED> <8FFF> <D3EE> <D3EE> <8FFB> <D3EF> <D3EF> <9004> <D3F0> <D3F0> <8FFC> <D3F1> <D3F1> <8FF6> <D3F2> <D3F2> <90D6> <D3F3> <D3F3> <90E0> <D3F4> <D3F5> <90D9> <D3F6> <D3F6> <90E3> <D3F7> <D3F7> <90DF> <D3F8> <D3F8> <90E5> <D3F9> <D3F9> <90D8> <D3FA> <D3FA> <90DB> <D3FB> <D3FB> <90D7> <D3FC> <D3FC> <90DC> <D3FD> <D3FD> <90E4> <D3FE> <D3FE> <9150> <D440> <D441> <914E> <D442> <D442> <91D5> <D443> <D443> <91E2> <D444> <D444> <91DA> <D445> <D445> <965C> <D446> <D446> <965F> <D447> <D447> <96BC> <D448> <D448> <98E3> <D449> <D449> <9ADF> <D44A> <D44A> <9B2F> <D44B> <D44B> <4E7F> <D44C> <D44C> <5070> <D44D> <D44D> <506A> <D44E> <D44E> <5061> <D44F> <D44F> <505E> <D450> <D450> <5060> <D451> <D451> <5053> <D452> <D452> <504B> <D453> <D453> <505D> <D454> <D454> <5072> <D455> <D455> <5048> <D456> <D456> <504D> <D457> <D457> <5041> <D458> <D458> <505B> <D459> <D459> <504A> <D45A> <D45A> <5062> <D45B> <D45B> <5015> <D45C> <D45C> <5045> <D45D> <D45D> <505F> <D45E> <D45E> <5069> <D45F> <D45F> <506B> <D460> <D461> <5063> <D462> <D462> <5046> <D463> <D463> <5040> <D464> <D464> <506E> <D465> <D465> <5073> <D466> <D466> <5057> <D467> <D467> <5051> <D468> <D468> <51D0> <D469> <D469> <526B> <D46A> <D46A> <526D> endbfrange 100 beginbfrange <D46B> <D46B> <526C> <D46C> <D46C> <526E> <D46D> <D46D> <52D6> <D46E> <D46E> <52D3> <D46F> <D46F> <532D> <D470> <D470> <539C> <D471> <D472> <5575> <D473> <D473> <553C> <D474> <D474> <554D> <D475> <D475> <5550> <D476> <D476> <5534> <D477> <D477> <552A> <D478> <D478> <5551> <D479> <D479> <5562> <D47A> <D47A> <5536> <D47B> <D47B> <5535> <D47C> <D47C> <5530> <D47D> <D47D> <5552> <D47E> <D47E> <5545> <D4A1> <D4A1> <550C> <D4A2> <D4A2> <5532> <D4A3> <D4A3> <5565> <D4A4> <D4A4> <554E> <D4A5> <D4A5> <5539> <D4A6> <D4A6> <5548> <D4A7> <D4A7> <552D> <D4A8> <D4A8> <553B> <D4A9> <D4A9> <5540> <D4AA> <D4AA> <554B> <D4AB> <D4AB> <570A> <D4AC> <D4AC> <5707> <D4AD> <D4AD> <57FB> <D4AE> <D4AE> <5814> <D4AF> <D4AF> <57E2> <D4B0> <D4B0> <57F6> <D4B1> <D4B1> <57DC> <D4B2> <D4B2> <57F4> <D4B3> <D4B3> <5800> <D4B4> <D4B4> <57ED> <D4B5> <D4B5> <57FD> <D4B6> <D4B6> <5808> <D4B7> <D4B7> <57F8> <D4B8> <D4B8> <580B> <D4B9> <D4B9> <57F3> <D4BA> <D4BA> <57CF> <D4BB> <D4BB> <5807> <D4BC> <D4BC> <57EE> <D4BD> <D4BD> <57E3> <D4BE> <D4BE> <57F2> <D4BF> <D4BF> <57E5> <D4C0> <D4C0> <57EC> <D4C1> <D4C1> <57E1> <D4C2> <D4C2> <580E> <D4C3> <D4C3> <57FC> <D4C4> <D4C4> <5810> <D4C5> <D4C5> <57E7> <D4C6> <D4C6> <5801> <D4C7> <D4C7> <580C> <D4C8> <D4C8> <57F1> <D4C9> <D4C9> <57E9> <D4CA> <D4CA> <57F0> <D4CB> <D4CB> <580D> <D4CC> <D4CC> <5804> <D4CD> <D4CD> <595C> <D4CE> <D4CE> <5A60> <D4CF> <D4CF> <5A58> <D4D0> <D4D0> <5A55> <D4D1> <D4D1> <5A67> <D4D2> <D4D2> <5A5E> <D4D3> <D4D3> <5A38> <D4D4> <D4D4> <5A35> <D4D5> <D4D5> <5A6D> <D4D6> <D4D6> <5A50> <D4D7> <D4D7> <5A5F> <D4D8> <D4D8> <5A65> <D4D9> <D4D9> <5A6C> <D4DA> <D4DA> <5A53> <D4DB> <D4DB> <5A64> <D4DC> <D4DC> <5A57> <D4DD> <D4DD> <5A43> <D4DE> <D4DE> <5A5D> <D4DF> <D4DF> <5A52> <D4E0> <D4E0> <5A44> <D4E1> <D4E1> <5A5B> <D4E2> <D4E2> <5A48> <D4E3> <D4E3> <5A8E> <D4E4> <D4E4> <5A3E> <D4E5> <D4E5> <5A4D> <D4E6> <D4E6> <5A39> <D4E7> <D4E7> <5A4C> <D4E8> <D4E8> <5A70> <D4E9> <D4E9> <5A69> <D4EA> <D4EA> <5A47> <D4EB> <D4EB> <5A51> <D4EC> <D4EC> <5A56> <D4ED> <D4ED> <5A42> <D4EE> <D4EE> <5A5C> <D4EF> <D4EF> <5B72> <D4F0> <D4F0> <5B6E> <D4F1> <D4F1> <5BC1> endbfrange 100 beginbfrange <D4F2> <D4F2> <5BC0> <D4F3> <D4F3> <5C59> <D4F4> <D4F4> <5D1E> <D4F5> <D4F5> <5D0B> <D4F6> <D4F6> <5D1D> <D4F7> <D4F7> <5D1A> <D4F8> <D4F8> <5D20> <D4F9> <D4F9> <5D0C> <D4FA> <D4FA> <5D28> <D4FB> <D4FB> <5D0D> <D4FC> <D4FC> <5D26> <D4FD> <D4FD> <5D25> <D4FE> <D4FE> <5D0F> <D540> <D540> <5D30> <D541> <D541> <5D12> <D542> <D542> <5D23> <D543> <D543> <5D1F> <D544> <D544> <5D2E> <D545> <D545> <5E3E> <D546> <D546> <5E34> <D547> <D547> <5EB1> <D548> <D548> <5EB4> <D549> <D549> <5EB9> <D54A> <D54B> <5EB2> <D54C> <D54C> <5F36> <D54D> <D54D> <5F38> <D54E> <D54E> <5F9B> <D54F> <D54F> <5F96> <D550> <D550> <5F9F> <D551> <D551> <608A> <D552> <D552> <6090> <D553> <D553> <6086> <D554> <D554> <60BE> <D555> <D555> <60B0> <D556> <D556> <60BA> <D557> <D558> <60D3> <D559> <D559> <60CF> <D55A> <D55A> <60E4> <D55B> <D55B> <60D9> <D55C> <D55C> <60DD> <D55D> <D55D> <60C8> <D55E> <D55E> <60B1> <D55F> <D55F> <60DB> <D560> <D560> <60B7> <D561> <D561> <60CA> <D562> <D562> <60BF> <D563> <D563> <60C3> <D564> <D564> <60CD> <D565> <D565> <60C0> <D566> <D566> <6332> <D567> <D567> <6365> <D568> <D568> <638A> <D569> <D569> <6382> <D56A> <D56A> <637D> <D56B> <D56B> <63BD> <D56C> <D56C> <639E> <D56D> <D56D> <63AD> <D56E> <D56E> <639D> <D56F> <D56F> <6397> <D570> <D570> <63AB> <D571> <D571> <638E> <D572> <D572> <636F> <D573> <D573> <6387> <D574> <D574> <6390> <D575> <D575> <636E> <D576> <D576> <63AF> <D577> <D577> <6375> <D578> <D578> <639C> <D579> <D579> <636D> <D57A> <D57A> <63AE> <D57B> <D57B> <637C> <D57C> <D57C> <63A4> <D57D> <D57D> <633B> <D57E> <D57E> <639F> <D5A1> <D5A1> <6378> <D5A2> <D5A2> <6385> <D5A3> <D5A3> <6381> <D5A4> <D5A4> <6391> <D5A5> <D5A5> <638D> <D5A6> <D5A6> <6370> <D5A7> <D5A7> <6553> <D5A8> <D5A8> <65CD> <D5A9> <D5A9> <6665> <D5AA> <D5AA> <6661> <D5AB> <D5AB> <665B> <D5AC> <D5AC> <6659> <D5AD> <D5AD> <665C> <D5AE> <D5AE> <6662> <D5AF> <D5AF> <6718> <D5B0> <D5B0> <6879> <D5B1> <D5B1> <6887> <D5B2> <D5B2> <6890> <D5B3> <D5B3> <689C> <D5B4> <D5B5> <686D> <D5B6> <D5B6> <68AE> <D5B7> <D5B7> <68AB> <D5B8> <D5B8> <6956> <D5B9> <D5B9> <686F> <D5BA> <D5BA> <68A3> <D5BB> <D5BB> <68AC> endbfrange 100 beginbfrange <D5BC> <D5BC> <68A9> <D5BD> <D5BD> <6875> <D5BE> <D5BE> <6874> <D5BF> <D5BF> <68B2> <D5C0> <D5C0> <688F> <D5C1> <D5C1> <6877> <D5C2> <D5C2> <6892> <D5C3> <D5C3> <687C> <D5C4> <D5C4> <686B> <D5C5> <D5C5> <6872> <D5C6> <D5C6> <68AA> <D5C7> <D5C7> <6880> <D5C8> <D5C8> <6871> <D5C9> <D5C9> <687E> <D5CA> <D5CA> <689B> <D5CB> <D5CB> <6896> <D5CC> <D5CC> <688B> <D5CD> <D5CD> <68A0> <D5CE> <D5CE> <6889> <D5CF> <D5CF> <68A4> <D5D0> <D5D0> <6878> <D5D1> <D5D1> <687B> <D5D2> <D5D2> <6891> <D5D3> <D5D3> <688C> <D5D4> <D5D4> <688A> <D5D5> <D5D5> <687D> <D5D6> <D5D6> <6B36> <D5D7> <D5D7> <6B33> <D5D8> <D5D9> <6B37> <D5DA> <D5DA> <6B91> <D5DB> <D5DB> <6B8F> <D5DC> <D5DD> <6B8D> <D5DE> <D5DE> <6B8C> <D5DF> <D5DF> <6C2A> <D5E0> <D5E0> <6DC0> <D5E1> <D5E1> <6DAB> <D5E2> <D5E2> <6DB4> <D5E3> <D5E3> <6DB3> <D5E4> <D5E4> <6E74> <D5E5> <D5E5> <6DAC> <D5E6> <D5E6> <6DE9> <D5E7> <D5E7> <6DE2> <D5E8> <D5E8> <6DB7> <D5E9> <D5E9> <6DF6> <D5EA> <D5EA> <6DD4> <D5EB> <D5EB> <6E00> <D5EC> <D5EC> <6DC8> <D5ED> <D5ED> <6DE0> <D5EE> <D5EE> <6DDF> <D5EF> <D5EF> <6DD6> <D5F0> <D5F0> <6DBE> <D5F1> <D5F1> <6DE5> <D5F2> <D5F3> <6DDC> <D5F4> <D5F4> <6DDB> <D5F5> <D5F5> <6DF4> <D5F6> <D5F6> <6DCA> <D5F7> <D5F7> <6DBD> <D5F8> <D5F8> <6DED> <D5F9> <D5F9> <6DF0> <D5FA> <D5FA> <6DBA> <D5FB> <D5FB> <6DD5> <D5FC> <D5FC> <6DC2> <D5FD> <D5FD> <6DCF> <D5FE> <D5FE> <6DC9> <D640> <D640> <6DD0> <D641> <D641> <6DF2> <D642> <D642> <6DD3> <D643> <D643> <6DFD> <D644> <D644> <6DD7> <D645> <D645> <6DCD> <D646> <D646> <6DE3> <D647> <D647> <6DBB> <D648> <D648> <70FA> <D649> <D649> <710D> <D64A> <D64A> <70F7> <D64B> <D64B> <7117> <D64C> <D64C> <70F4> <D64D> <D64D> <710C> <D64E> <D64E> <70F0> <D64F> <D64F> <7104> <D650> <D650> <70F3> <D651> <D651> <7110> <D652> <D652> <70FC> <D653> <D653> <70FF> <D654> <D654> <7106> <D655> <D655> <7113> <D656> <D656> <7100> <D657> <D657> <70F8> <D658> <D658> <70F6> <D659> <D659> <710B> <D65A> <D65A> <7102> <D65B> <D65B> <710E> <D65C> <D65C> <727E> <D65D> <D65E> <727B> <D65F> <D65F> <727F> <D660> <D660> <731D> <D661> <D661> <7317> <D662> <D662> <7307> <D663> <D663> <7311> <D664> <D664> <7318> endbfrange 100 beginbfrange <D665> <D665> <730A> <D666> <D666> <7308> <D667> <D667> <72FF> <D668> <D668> <730F> <D669> <D669> <731E> <D66A> <D66A> <7388> <D66B> <D66B> <73F6> <D66C> <D66C> <73F8> <D66D> <D66D> <73F5> <D66E> <D66E> <7404> <D66F> <D66F> <7401> <D670> <D670> <73FD> <D671> <D671> <7407> <D672> <D672> <7400> <D673> <D673> <73FA> <D674> <D674> <73FC> <D675> <D675> <73FF> <D676> <D676> <740C> <D677> <D677> <740B> <D678> <D678> <73F4> <D679> <D679> <7408> <D67A> <D67A> <7564> <D67B> <D67B> <7563> <D67C> <D67C> <75CE> <D67D> <D67D> <75D2> <D67E> <D67E> <75CF> <D6A1> <D6A2> <75CB> <D6A3> <D6A3> <75D1> <D6A4> <D6A4> <75D0> <D6A5> <D6A5> <768F> <D6A6> <D6A6> <7689> <D6A7> <D6A7> <76D3> <D6A8> <D6A8> <7739> <D6A9> <D6A9> <772F> <D6AA> <D6AA> <772D> <D6AB> <D6AC> <7731> <D6AD> <D6AD> <7734> <D6AE> <D6AE> <7733> <D6AF> <D6AF> <773D> <D6B0> <D6B0> <7725> <D6B1> <D6B1> <773B> <D6B2> <D6B2> <7735> <D6B3> <D6B3> <7848> <D6B4> <D6B4> <7852> <D6B5> <D6B5> <7849> <D6B6> <D6B6> <784D> <D6B7> <D6B7> <784A> <D6B8> <D6B8> <784C> <D6B9> <D6B9> <7826> <D6BA> <D6BA> <7845> <D6BB> <D6BB> <7850> <D6BC> <D6BC> <7964> <D6BD> <D6BD> <7967> <D6BE> <D6BF> <7969> <D6C0> <D6C0> <7963> <D6C1> <D6C1> <796B> <D6C2> <D6C2> <7961> <D6C3> <D6C3> <79BB> <D6C4> <D6C4> <79FA> <D6C5> <D6C5> <79F8> <D6C6> <D6C7> <79F6> <D6C8> <D6C8> <7A8F> <D6C9> <D6C9> <7A94> <D6CA> <D6CA> <7A90> <D6CB> <D6CB> <7B35> <D6CC> <D6CC> <7B47> <D6CD> <D6CD> <7B34> <D6CE> <D6CE> <7B25> <D6CF> <D6CF> <7B30> <D6D0> <D6D0> <7B22> <D6D1> <D6D1> <7B24> <D6D2> <D6D2> <7B33> <D6D3> <D6D3> <7B18> <D6D4> <D6D4> <7B2A> <D6D5> <D6D5> <7B1D> <D6D6> <D6D6> <7B31> <D6D7> <D6D7> <7B2B> <D6D8> <D6D8> <7B2D> <D6D9> <D6D9> <7B2F> <D6DA> <D6DA> <7B32> <D6DB> <D6DB> <7B38> <D6DC> <D6DC> <7B1A> <D6DD> <D6DD> <7B23> <D6DE> <D6DE> <7C94> <D6DF> <D6DF> <7C98> <D6E0> <D6E0> <7C96> <D6E1> <D6E1> <7CA3> <D6E2> <D6E2> <7D35> <D6E3> <D6E3> <7D3D> <D6E4> <D6E4> <7D38> <D6E5> <D6E5> <7D36> <D6E6> <D6E6> <7D3A> <D6E7> <D6E7> <7D45> <D6E8> <D6E8> <7D2C> <D6E9> <D6E9> <7D29> <D6EA> <D6EA> <7D41> <D6EB> <D6EB> <7D47> <D6EC> <D6ED> <7D3E> <D6EE> <D6EE> <7D4A> <D6EF> <D6EF> <7D3B> endbfrange 100 beginbfrange <D6F0> <D6F0> <7D28> <D6F1> <D6F1> <7F63> <D6F2> <D6F2> <7F95> <D6F3> <D6F4> <7F9C> <D6F5> <D6F5> <7F9B> <D6F6> <D6F7> <7FCA> <D6F8> <D6F8> <7FCD> <D6F9> <D6FA> <7FD0> <D6FB> <D6FB> <7FC7> <D6FC> <D6FC> <7FCF> <D6FD> <D6FD> <7FC9> <D6FE> <D6FE> <801F> <D740> <D740> <801E> <D741> <D741> <801B> <D742> <D742> <8047> <D743> <D743> <8043> <D744> <D744> <8048> <D745> <D745> <8118> <D746> <D746> <8125> <D747> <D747> <8119> <D748> <D748> <811B> <D749> <D749> <812D> <D74A> <D74A> <811F> <D74B> <D74B> <812C> <D74C> <D74C> <811E> <D74D> <D74D> <8121> <D74E> <D74E> <8115> <D74F> <D74F> <8127> <D750> <D750> <811D> <D751> <D751> <8122> <D752> <D752> <8211> <D753> <D753> <8238> <D754> <D754> <8233> <D755> <D755> <823A> <D756> <D756> <8234> <D757> <D757> <8232> <D758> <D758> <8274> <D759> <D759> <8390> <D75A> <D75A> <83A3> <D75B> <D75B> <83A8> <D75C> <D75C> <838D> <D75D> <D75D> <837A> <D75E> <D75E> <8373> <D75F> <D75F> <83A4> <D760> <D760> <8374> <D761> <D761> <838F> <D762> <D762> <8381> <D763> <D763> <8395> <D764> <D764> <8399> <D765> <D765> <8375> <D766> <D766> <8394> <D767> <D767> <83A9> <D768> <D768> <837D> <D769> <D769> <8383> <D76A> <D76A> <838C> <D76B> <D76B> <839D> <D76C> <D76C> <839B> <D76D> <D76D> <83AA> <D76E> <D76E> <838B> <D76F> <D76F> <837E> <D770> <D770> <83A5> <D771> <D771> <83AF> <D772> <D772> <8388> <D773> <D773> <8397> <D774> <D774> <83B0> <D775> <D775> <837F> <D776> <D776> <83A6> <D777> <D777> <8387> <D778> <D778> <83AE> <D779> <D779> <8376> <D77A> <D77A> <839A> <D77B> <D77B> <8659> <D77C> <D77C> <8656> <D77D> <D77D> <86BF> <D77E> <D77E> <86B7> <D7A1> <D7A1> <86C2> <D7A2> <D7A2> <86C1> <D7A3> <D7A3> <86C5> <D7A4> <D7A4> <86BA> <D7A5> <D7A5> <86B0> <D7A6> <D7A6> <86C8> <D7A7> <D7A7> <86B9> <D7A8> <D7A8> <86B3> <D7A9> <D7A9> <86B8> <D7AA> <D7AA> <86CC> <D7AB> <D7AB> <86B4> <D7AC> <D7AD> <86BB> <D7AE> <D7AE> <86C3> <D7AF> <D7B0> <86BD> <D7B1> <D7B1> <8852> <D7B2> <D7B2> <8889> <D7B3> <D7B3> <8895> <D7B4> <D7B4> <88A8> <D7B5> <D7B5> <88A2> <D7B6> <D7B6> <88AA> <D7B7> <D7B7> <889A> <D7B8> <D7B8> <8891> <D7B9> <D7B9> <88A1> <D7BA> <D7BA> <889F> <D7BB> <D7BB> <8898> endbfrange 100 beginbfrange <D7BC> <D7BC> <88A7> <D7BD> <D7BD> <8899> <D7BE> <D7BE> <889B> <D7BF> <D7BF> <8897> <D7C0> <D7C0> <88A4> <D7C1> <D7C1> <88AC> <D7C2> <D7C2> <888C> <D7C3> <D7C3> <8893> <D7C4> <D7C4> <888E> <D7C5> <D7C5> <8982> <D7C6> <D7C6> <89D6> <D7C7> <D7C7> <89D9> <D7C8> <D7C8> <89D5> <D7C9> <D7C9> <8A30> <D7CA> <D7CA> <8A27> <D7CB> <D7CB> <8A2C> <D7CC> <D7CC> <8A1E> <D7CD> <D7CD> <8C39> <D7CE> <D7CE> <8C3B> <D7CF> <D7D0> <8C5C> <D7D1> <D7D1> <8C7D> <D7D2> <D7D2> <8CA5> <D7D3> <D7D3> <8D7D> <D7D4> <D7D4> <8D7B> <D7D5> <D7D5> <8D79> <D7D6> <D7D6> <8DBC> <D7D7> <D7D7> <8DC2> <D7D8> <D7D8> <8DB9> <D7D9> <D7D9> <8DBF> <D7DA> <D7DA> <8DC1> <D7DB> <D7DB> <8ED8> <D7DC> <D7DC> <8EDE> <D7DD> <D7DD> <8EDD> <D7DE> <D7DE> <8EDC> <D7DF> <D7DF> <8ED7> <D7E0> <D7E1> <8EE0> <D7E2> <D7E2> <9024> <D7E3> <D7E3> <900B> <D7E4> <D7E4> <9011> <D7E5> <D7E5> <901C> <D7E6> <D7E6> <900C> <D7E7> <D7E7> <9021> <D7E8> <D7E8> <90EF> <D7E9> <D7E9> <90EA> <D7EA> <D7EA> <90F0> <D7EB> <D7EB> <90F4> <D7EC> <D7ED> <90F2> <D7EE> <D7EE> <90D4> <D7EF> <D7F0> <90EB> <D7F1> <D7F1> <90E9> <D7F2> <D7F2> <9156> <D7F3> <D7F3> <9158> <D7F4> <D7F4> <915A> <D7F5> <D7F5> <9153> <D7F6> <D7F6> <9155> <D7F7> <D7F7> <91EC> <D7F8> <D7F8> <91F4> <D7F9> <D7F9> <91F1> <D7FA> <D7FA> <91F3> <D7FB> <D7FB> <91F8> <D7FC> <D7FC> <91E4> <D7FD> <D7FD> <91F9> <D7FE> <D7FE> <91EA> <D840> <D840> <91EB> <D841> <D841> <91F7> <D842> <D842> <91E8> <D843> <D843> <91EE> <D844> <D844> <957A> <D845> <D845> <9586> <D846> <D846> <9588> <D847> <D847> <967C> <D848> <D848> <966D> <D849> <D849> <966B> <D84A> <D84A> <9671> <D84B> <D84B> <966F> <D84C> <D84C> <96BF> <D84D> <D84D> <976A> <D84E> <D84E> <9804> <D84F> <D84F> <98E5> <D850> <D850> <9997> <D851> <D851> <509B> <D852> <D852> <5095> <D853> <D853> <5094> <D854> <D854> <509E> <D855> <D855> <508B> <D856> <D856> <50A3> <D857> <D857> <5083> <D858> <D858> <508C> <D859> <D859> <508E> <D85A> <D85A> <509D> <D85B> <D85B> <5068> <D85C> <D85C> <509C> <D85D> <D85D> <5092> <D85E> <D85E> <5082> <D85F> <D85F> <5087> <D860> <D860> <515F> <D861> <D861> <51D4> <D862> <D862> <5312> <D863> <D863> <5311> <D864> <D864> <53A4> endbfrange 100 beginbfrange <D865> <D865> <53A7> <D866> <D866> <5591> <D867> <D867> <55A8> <D868> <D868> <55A5> <D869> <D869> <55AD> <D86A> <D86A> <5577> <D86B> <D86B> <5645> <D86C> <D86C> <55A2> <D86D> <D86D> <5593> <D86E> <D86E> <5588> <D86F> <D86F> <558F> <D870> <D870> <55B5> <D871> <D871> <5581> <D872> <D872> <55A3> <D873> <D873> <5592> <D874> <D874> <55A4> <D875> <D875> <557D> <D876> <D876> <558C> <D877> <D877> <55A6> <D878> <D878> <557F> <D879> <D879> <5595> <D87A> <D87A> <55A1> <D87B> <D87B> <558E> <D87C> <D87C> <570C> <D87D> <D87D> <5829> <D87E> <D87E> <5837> <D8A1> <D8A1> <5819> <D8A2> <D8A2> <581E> <D8A3> <D8A3> <5827> <D8A4> <D8A4> <5823> <D8A5> <D8A5> <5828> <D8A6> <D8A6> <57F5> <D8A7> <D8A7> <5848> <D8A8> <D8A8> <5825> <D8A9> <D8A9> <581C> <D8AA> <D8AA> <581B> <D8AB> <D8AB> <5833> <D8AC> <D8AC> <583F> <D8AD> <D8AD> <5836> <D8AE> <D8AE> <582E> <D8AF> <D8AF> <5839> <D8B0> <D8B0> <5838> <D8B1> <D8B1> <582D> <D8B2> <D8B2> <582C> <D8B3> <D8B3> <583B> <D8B4> <D8B4> <5961> <D8B5> <D8B5> <5AAF> <D8B6> <D8B6> <5A94> <D8B7> <D8B7> <5A9F> <D8B8> <D8B8> <5A7A> <D8B9> <D8B9> <5AA2> <D8BA> <D8BA> <5A9E> <D8BB> <D8BB> <5A78> <D8BC> <D8BC> <5AA6> <D8BD> <D8BD> <5A7C> <D8BE> <D8BE> <5AA5> <D8BF> <D8BF> <5AAC> <D8C0> <D8C0> <5A95> <D8C1> <D8C1> <5AAE> <D8C2> <D8C2> <5A37> <D8C3> <D8C3> <5A84> <D8C4> <D8C4> <5A8A> <D8C5> <D8C5> <5A97> <D8C6> <D8C6> <5A83> <D8C7> <D8C7> <5A8B> <D8C8> <D8C8> <5AA9> <D8C9> <D8C9> <5A7B> <D8CA> <D8CA> <5A7D> <D8CB> <D8CB> <5A8C> <D8CC> <D8CC> <5A9C> <D8CD> <D8CD> <5A8F> <D8CE> <D8CE> <5A93> <D8CF> <D8CF> <5A9D> <D8D0> <D8D0> <5BEA> <D8D1> <D8D1> <5BCD> <D8D2> <D8D2> <5BCB> <D8D3> <D8D3> <5BD4> <D8D4> <D8D4> <5BD1> <D8D5> <D8D5> <5BCA> <D8D6> <D8D6> <5BCE> <D8D7> <D8D7> <5C0C> <D8D8> <D8D8> <5C30> <D8D9> <D8D9> <5D37> <D8DA> <D8DA> <5D43> <D8DB> <D8DB> <5D6B> <D8DC> <D8DC> <5D41> <D8DD> <D8DD> <5D4B> <D8DE> <D8DE> <5D3F> <D8DF> <D8DF> <5D35> <D8E0> <D8E0> <5D51> <D8E1> <D8E1> <5D4E> <D8E2> <D8E2> <5D55> <D8E3> <D8E3> <5D33> <D8E4> <D8E4> <5D3A> <D8E5> <D8E5> <5D52> <D8E6> <D8E6> <5D3D> <D8E7> <D8E7> <5D31> <D8E8> <D8E8> <5D59> <D8E9> <D8E9> <5D42> <D8EA> <D8EA> <5D39> endbfrange 100 beginbfrange <D8EB> <D8EB> <5D49> <D8EC> <D8EC> <5D38> <D8ED> <D8ED> <5D3C> <D8EE> <D8EE> <5D32> <D8EF> <D8EF> <5D36> <D8F0> <D8F0> <5D40> <D8F1> <D8F1> <5D45> <D8F2> <D8F2> <5E44> <D8F3> <D8F3> <5E41> <D8F4> <D8F4> <5F58> <D8F5> <D8F5> <5FA6> <D8F6> <D8F6> <5FA5> <D8F7> <D8F7> <5FAB> <D8F8> <D8F8> <60C9> <D8F9> <D8F9> <60B9> <D8FA> <D8FA> <60CC> <D8FB> <D8FB> <60E2> <D8FC> <D8FC> <60CE> <D8FD> <D8FD> <60C4> <D8FE> <D8FE> <6114> <D940> <D940> <60F2> <D941> <D941> <610A> <D942> <D942> <6116> <D943> <D943> <6105> <D944> <D944> <60F5> <D945> <D945> <6113> <D946> <D946> <60F8> <D947> <D947> <60FC> <D948> <D948> <60FE> <D949> <D949> <60C1> <D94A> <D94A> <6103> <D94B> <D94B> <6118> <D94C> <D94C> <611D> <D94D> <D94D> <6110> <D94E> <D94E> <60FF> <D94F> <D94F> <6104> <D950> <D950> <610B> <D951> <D951> <624A> <D952> <D952> <6394> <D953> <D953> <63B1> <D954> <D954> <63B0> <D955> <D955> <63CE> <D956> <D956> <63E5> <D957> <D957> <63E8> <D958> <D958> <63EF> <D959> <D959> <63C3> <D95A> <D95A> <649D> <D95B> <D95B> <63F3> <D95C> <D95C> <63CA> <D95D> <D95D> <63E0> <D95E> <D95E> <63F6> <D95F> <D95F> <63D5> <D960> <D960> <63F2> <D961> <D961> <63F5> <D962> <D962> <6461> <D963> <D963> <63DF> <D964> <D964> <63BE> <D965> <D965> <63DD> <D966> <D966> <63DC> <D967> <D967> <63C4> <D968> <D968> <63D8> <D969> <D969> <63D3> <D96A> <D96A> <63C2> <D96B> <D96B> <63C7> <D96C> <D96C> <63CC> <D96D> <D96D> <63CB> <D96E> <D96E> <63C8> <D96F> <D96F> <63F0> <D970> <D970> <63D7> <D971> <D971> <63D9> <D972> <D972> <6532> <D973> <D973> <6567> <D974> <D974> <656A> <D975> <D975> <6564> <D976> <D976> <655C> <D977> <D977> <6568> <D978> <D978> <6565> <D979> <D979> <658C> <D97A> <D97B> <659D> <D97C> <D97C> <65AE> <D97D> <D97D> <65D0> <D97E> <D97E> <65D2> <D9A1> <D9A1> <667C> <D9A2> <D9A2> <666C> <D9A3> <D9A3> <667B> <D9A4> <D9A4> <6680> <D9A5> <D9A5> <6671> <D9A6> <D9A6> <6679> <D9A7> <D9A7> <666A> <D9A8> <D9A8> <6672> <D9A9> <D9A9> <6701> <D9AA> <D9AA> <690C> <D9AB> <D9AB> <68D3> <D9AC> <D9AC> <6904> <D9AD> <D9AD> <68DC> <D9AE> <D9AE> <692A> <D9AF> <D9AF> <68EC> <D9B0> <D9B0> <68EA> <D9B1> <D9B1> <68F1> <D9B2> <D9B2> <690F> endbfrange 100 beginbfrange <D9B3> <D9B3> <68D6> <D9B4> <D9B4> <68F7> <D9B5> <D9B5> <68EB> <D9B6> <D9B6> <68E4> <D9B7> <D9B7> <68F6> <D9B8> <D9B8> <6913> <D9B9> <D9B9> <6910> <D9BA> <D9BA> <68F3> <D9BB> <D9BB> <68E1> <D9BC> <D9BC> <6907> <D9BD> <D9BD> <68CC> <D9BE> <D9BE> <6908> <D9BF> <D9BF> <6970> <D9C0> <D9C0> <68B4> <D9C1> <D9C1> <6911> <D9C2> <D9C2> <68EF> <D9C3> <D9C3> <68C6> <D9C4> <D9C4> <6914> <D9C5> <D9C5> <68F8> <D9C6> <D9C6> <68D0> <D9C7> <D9C7> <68FD> <D9C8> <D9C8> <68FC> <D9C9> <D9C9> <68E8> <D9CA> <D9CA> <690B> <D9CB> <D9CB> <690A> <D9CC> <D9CC> <6917> <D9CD> <D9CD> <68CE> <D9CE> <D9CE> <68C8> <D9CF> <D9D0> <68DD> <D9D1> <D9D1> <68E6> <D9D2> <D9D2> <68F4> <D9D3> <D9D3> <68D1> <D9D4> <D9D4> <6906> <D9D5> <D9D5> <68D4> <D9D6> <D9D6> <68E9> <D9D7> <D9D7> <6915> <D9D8> <D9D8> <6925> <D9D9> <D9D9> <68C7> <D9DA> <D9DA> <6B39> <D9DB> <D9DB> <6B3B> <D9DC> <D9DC> <6B3F> <D9DD> <D9DD> <6B3C> <D9DE> <D9DE> <6B94> <D9DF> <D9DF> <6B97> <D9E0> <D9E0> <6B99> <D9E1> <D9E1> <6B95> <D9E2> <D9E2> <6BBD> <D9E3> <D9E3> <6BF0> <D9E4> <D9E5> <6BF2> <D9E6> <D9E6> <6C30> <D9E7> <D9E7> <6DFC> <D9E8> <D9E9> <6E46> <D9EA> <D9EA> <6E1F> <D9EB> <D9EB> <6E49> <D9EC> <D9EC> <6E88> <D9ED> <D9EE> <6E3C> <D9EF> <D9EF> <6E45> <D9F0> <D9F0> <6E62> <D9F1> <D9F1> <6E2B> <D9F2> <D9F2> <6E3F> <D9F3> <D9F3> <6E41> <D9F4> <D9F4> <6E5D> <D9F5> <D9F5> <6E73> <D9F6> <D9F6> <6E1C> <D9F7> <D9F7> <6E33> <D9F8> <D9F8> <6E4B> <D9F9> <D9F9> <6E40> <D9FA> <D9FA> <6E51> <D9FB> <D9FB> <6E3B> <D9FC> <D9FC> <6E03> <D9FD> <D9FD> <6E2E> <D9FE> <D9FE> <6E5E> <DA40> <DA40> <6E68> <DA41> <DA41> <6E5C> <DA42> <DA42> <6E61> <DA43> <DA43> <6E31> <DA44> <DA44> <6E28> <DA45> <DA45> <6E60> <DA46> <DA46> <6E71> <DA47> <DA47> <6E6B> <DA48> <DA48> <6E39> <DA49> <DA49> <6E22> <DA4A> <DA4A> <6E30> <DA4B> <DA4B> <6E53> <DA4C> <DA4C> <6E65> <DA4D> <DA4D> <6E27> <DA4E> <DA4E> <6E78> <DA4F> <DA4F> <6E64> <DA50> <DA50> <6E77> <DA51> <DA51> <6E55> <DA52> <DA52> <6E79> <DA53> <DA53> <6E52> <DA54> <DA54> <6E66> <DA55> <DA56> <6E35> <DA57> <DA57> <6E5A> <DA58> <DA58> <7120> <DA59> <DA59> <711E> <DA5A> <DA5A> <712F> <DA5B> <DA5B> <70FB> <DA5C> <DA5C> <712E> endbfrange 100 beginbfrange <DA5D> <DA5D> <7131> <DA5E> <DA5E> <7123> <DA5F> <DA5F> <7125> <DA60> <DA60> <7122> <DA61> <DA61> <7132> <DA62> <DA62> <711F> <DA63> <DA63> <7128> <DA64> <DA64> <713A> <DA65> <DA65> <711B> <DA66> <DA66> <724B> <DA67> <DA67> <725A> <DA68> <DA69> <7288> <DA6A> <DA6A> <7286> <DA6B> <DA6B> <7285> <DA6C> <DA6C> <728B> <DA6D> <DA6D> <7312> <DA6E> <DA6E> <730B> <DA6F> <DA6F> <7330> <DA70> <DA70> <7322> <DA71> <DA71> <7331> <DA72> <DA72> <7333> <DA73> <DA73> <7327> <DA74> <DA74> <7332> <DA75> <DA75> <732D> <DA76> <DA76> <7326> <DA77> <DA77> <7323> <DA78> <DA78> <7335> <DA79> <DA79> <730C> <DA7A> <DA7A> <742E> <DA7B> <DA7B> <742C> <DA7C> <DA7C> <7430> <DA7D> <DA7D> <742B> <DA7E> <DA7E> <7416> <DAA1> <DAA1> <741A> <DAA2> <DAA2> <7421> <DAA3> <DAA3> <742D> <DAA4> <DAA4> <7431> <DAA5> <DAA5> <7424> <DAA6> <DAA6> <7423> <DAA7> <DAA7> <741D> <DAA8> <DAA8> <7429> <DAA9> <DAA9> <7420> <DAAA> <DAAA> <7432> <DAAB> <DAAB> <74FB> <DAAC> <DAAC> <752F> <DAAD> <DAAD> <756F> <DAAE> <DAAE> <756C> <DAAF> <DAAF> <75E7> <DAB0> <DAB0> <75DA> <DAB1> <DAB1> <75E1> <DAB2> <DAB2> <75E6> <DAB3> <DAB3> <75DD> <DAB4> <DAB4> <75DF> <DAB5> <DAB5> <75E4> <DAB6> <DAB6> <75D7> <DAB7> <DAB7> <7695> <DAB8> <DAB8> <7692> <DAB9> <DAB9> <76DA> <DABA> <DABB> <7746> <DABC> <DABC> <7744> <DABD> <DABD> <774D> <DABE> <DABE> <7745> <DABF> <DABF> <774A> <DAC0> <DAC0> <774E> <DAC1> <DAC2> <774B> <DAC3> <DAC3> <77DE> <DAC4> <DAC4> <77EC> <DAC5> <DAC5> <7860> <DAC6> <DAC7> <7864> <DAC8> <DAC8> <785C> <DAC9> <DAC9> <786D> <DACA> <DACA> <7871> <DACB> <DACB> <786A> <DACC> <DACC> <786E> <DACD> <DACD> <7870> <DACE> <DACE> <7869> <DACF> <DACF> <7868> <DAD0> <DAD0> <785E> <DAD1> <DAD1> <7862> <DAD2> <DAD2> <7974> <DAD3> <DAD3> <7973> <DAD4> <DAD4> <7972> <DAD5> <DAD5> <7970> <DAD6> <DAD6> <7A02> <DAD7> <DAD7> <7A0A> <DAD8> <DAD8> <7A03> <DAD9> <DAD9> <7A0C> <DADA> <DADA> <7A04> <DADB> <DADB> <7A99> <DADC> <DADC> <7AE6> <DADD> <DADD> <7AE4> <DADE> <DADE> <7B4A> <DADF> <DADF> <7B3B> <DAE0> <DAE0> <7B44> <DAE1> <DAE1> <7B48> <DAE2> <DAE2> <7B4C> <DAE3> <DAE3> <7B4E> <DAE4> <DAE4> <7B40> <DAE5> <DAE5> <7B58> <DAE6> <DAE6> <7B45> endbfrange 100 beginbfrange <DAE7> <DAE7> <7CA2> <DAE8> <DAE8> <7C9E> <DAE9> <DAE9> <7CA8> <DAEA> <DAEA> <7CA1> <DAEB> <DAEB> <7D58> <DAEC> <DAEC> <7D6F> <DAED> <DAED> <7D63> <DAEE> <DAEE> <7D53> <DAEF> <DAEF> <7D56> <DAF0> <DAF0> <7D67> <DAF1> <DAF1> <7D6A> <DAF2> <DAF2> <7D4F> <DAF3> <DAF3> <7D6D> <DAF4> <DAF4> <7D5C> <DAF5> <DAF5> <7D6B> <DAF6> <DAF6> <7D52> <DAF7> <DAF7> <7D54> <DAF8> <DAF8> <7D69> <DAF9> <DAF9> <7D51> <DAFA> <DAFA> <7D5F> <DAFB> <DAFB> <7D4E> <DAFC> <DAFD> <7F3E> <DAFE> <DAFE> <7F65> <DB40> <DB40> <7F66> <DB41> <DB41> <7FA2> <DB42> <DB43> <7FA0> <DB44> <DB44> <7FD7> <DB45> <DB45> <8051> <DB46> <DB47> <804F> <DB48> <DB48> <80FE> <DB49> <DB49> <80D4> <DB4A> <DB4A> <8143> <DB4B> <DB4B> <814A> <DB4C> <DB4C> <8152> <DB4D> <DB4D> <814F> <DB4E> <DB4E> <8147> <DB4F> <DB4F> <813D> <DB50> <DB50> <814D> <DB51> <DB51> <813A> <DB52> <DB52> <81E6> <DB53> <DB53> <81EE> <DB54> <DB56> <81F7> <DB57> <DB57> <8204> <DB58> <DB59> <823C> <DB5A> <DB5A> <823F> <DB5B> <DB5B> <8275> <DB5C> <DB5C> <833B> <DB5D> <DB5D> <83CF> <DB5E> <DB5E> <83F9> <DB5F> <DB5F> <8423> <DB60> <DB60> <83C0> <DB61> <DB61> <83E8> <DB62> <DB62> <8412> <DB63> <DB63> <83E7> <DB64> <DB64> <83E4> <DB65> <DB65> <83FC> <DB66> <DB66> <83F6> <DB67> <DB67> <8410> <DB68> <DB68> <83C6> <DB69> <DB69> <83C8> <DB6A> <DB6A> <83EB> <DB6B> <DB6B> <83E3> <DB6C> <DB6C> <83BF> <DB6D> <DB6D> <8401> <DB6E> <DB6E> <83DD> <DB6F> <DB6F> <83E5> <DB70> <DB70> <83D8> <DB71> <DB71> <83FF> <DB72> <DB72> <83E1> <DB73> <DB73> <83CB> <DB74> <DB74> <83CE> <DB75> <DB75> <83D6> <DB76> <DB76> <83F5> <DB77> <DB77> <83C9> <DB78> <DB78> <8409> <DB79> <DB79> <840F> <DB7A> <DB7A> <83DE> <DB7B> <DB7B> <8411> <DB7C> <DB7C> <8406> <DB7D> <DB7D> <83C2> <DB7E> <DB7E> <83F3> <DBA1> <DBA1> <83D5> <DBA2> <DBA2> <83FA> <DBA3> <DBA3> <83C7> <DBA4> <DBA4> <83D1> <DBA5> <DBA5> <83EA> <DBA6> <DBA6> <8413> <DBA7> <DBA7> <83C3> <DBA8> <DBA8> <83EC> <DBA9> <DBA9> <83EE> <DBAA> <DBAA> <83C4> <DBAB> <DBAB> <83FB> <DBAC> <DBAC> <83D7> <DBAD> <DBAD> <83E2> <DBAE> <DBAE> <841B> <DBAF> <DBAF> <83DB> <DBB0> <DBB0> <83FE> <DBB1> <DBB1> <86D8> <DBB2> <DBB2> <86E2> <DBB3> <DBB3> <86E6> endbfrange 100 beginbfrange <DBB4> <DBB4> <86D3> <DBB5> <DBB5> <86E3> <DBB6> <DBB6> <86DA> <DBB7> <DBB7> <86EA> <DBB8> <DBB8> <86DD> <DBB9> <DBB9> <86EB> <DBBA> <DBBA> <86DC> <DBBB> <DBBB> <86EC> <DBBC> <DBBC> <86E9> <DBBD> <DBBD> <86D7> <DBBE> <DBBE> <86E8> <DBBF> <DBBF> <86D1> <DBC0> <DBC0> <8848> <DBC1> <DBC1> <8856> <DBC2> <DBC2> <8855> <DBC3> <DBC3> <88BA> <DBC4> <DBC4> <88D7> <DBC5> <DBC5> <88B9> <DBC6> <DBC6> <88B8> <DBC7> <DBC7> <88C0> <DBC8> <DBC8> <88BE> <DBC9> <DBC9> <88B6> <DBCA> <DBCA> <88BC> <DBCB> <DBCB> <88B7> <DBCC> <DBCC> <88BD> <DBCD> <DBCD> <88B2> <DBCE> <DBCE> <8901> <DBCF> <DBCF> <88C9> <DBD0> <DBD0> <8995> <DBD1> <DBD1> <8998> <DBD2> <DBD2> <8997> <DBD3> <DBD3> <89DD> <DBD4> <DBD5> <89DA> <DBD6> <DBD6> <8A4E> <DBD7> <DBD7> <8A4D> <DBD8> <DBD8> <8A39> <DBD9> <DBD9> <8A59> <DBDA> <DBDA> <8A40> <DBDB> <DBDC> <8A57> <DBDD> <DBDE> <8A44> <DBDF> <DBDF> <8A52> <DBE0> <DBE0> <8A48> <DBE1> <DBE1> <8A51> <DBE2> <DBE2> <8A4A> <DBE3> <DBE3> <8A4C> <DBE4> <DBE4> <8A4F> <DBE5> <DBE5> <8C5F> <DBE6> <DBE6> <8C81> <DBE7> <DBE7> <8C80> <DBE8> <DBE8> <8CBA> <DBE9> <DBE9> <8CBE> <DBEA> <DBEA> <8CB0> <DBEB> <DBEB> <8CB9> <DBEC> <DBEC> <8CB5> <DBED> <DBED> <8D84> <DBEE> <DBEE> <8D80> <DBEF> <DBEF> <8D89> <DBF0> <DBF0> <8DD8> <DBF1> <DBF1> <8DD3> <DBF2> <DBF2> <8DCD> <DBF3> <DBF3> <8DC7> <DBF4> <DBF4> <8DD6> <DBF5> <DBF5> <8DDC> <DBF6> <DBF6> <8DCF> <DBF7> <DBF7> <8DD5> <DBF8> <DBF8> <8DD9> <DBF9> <DBF9> <8DC8> <DBFA> <DBFA> <8DD7> <DBFB> <DBFB> <8DC5> <DBFC> <DBFC> <8EEF> <DBFD> <DBFD> <8EF7> <DBFE> <DBFE> <8EFA> <DC40> <DC40> <8EF9> <DC41> <DC41> <8EE6> <DC42> <DC42> <8EEE> <DC43> <DC43> <8EE5> <DC44> <DC44> <8EF5> <DC45> <DC46> <8EE7> <DC47> <DC47> <8EF6> <DC48> <DC48> <8EEB> <DC49> <DC49> <8EF1> <DC4A> <DC4A> <8EEC> <DC4B> <DC4B> <8EF4> <DC4C> <DC4C> <8EE9> <DC4D> <DC4D> <902D> <DC4E> <DC4E> <9034> <DC4F> <DC4F> <902F> <DC50> <DC50> <9106> <DC51> <DC51> <912C> <DC52> <DC52> <9104> <DC53> <DC53> <90FF> <DC54> <DC54> <90FC> <DC55> <DC55> <9108> <DC56> <DC56> <90F9> <DC57> <DC57> <90FB> <DC58> <DC58> <9101> <DC59> <DC59> <9100> <DC5A> <DC5A> <9107> <DC5B> <DC5B> <9105> <DC5C> <DC5C> <9103> endbfrange 100 beginbfrange <DC5D> <DC5D> <9161> <DC5E> <DC5E> <9164> <DC5F> <DC5F> <915F> <DC60> <DC60> <9162> <DC61> <DC61> <9160> <DC62> <DC62> <9201> <DC63> <DC63> <920A> <DC64> <DC64> <9225> <DC65> <DC65> <9203> <DC66> <DC66> <921A> <DC67> <DC67> <9226> <DC68> <DC68> <920F> <DC69> <DC69> <920C> <DC6A> <DC6A> <9200> <DC6B> <DC6B> <9212> <DC6C> <DC6C> <91FF> <DC6D> <DC6D> <91FD> <DC6E> <DC6E> <9206> <DC6F> <DC6F> <9204> <DC70> <DC70> <9227> <DC71> <DC71> <9202> <DC72> <DC72> <921C> <DC73> <DC73> <9224> <DC74> <DC74> <9219> <DC75> <DC75> <9217> <DC76> <DC76> <9205> <DC77> <DC77> <9216> <DC78> <DC78> <957B> <DC79> <DC79> <958D> <DC7A> <DC7A> <958C> <DC7B> <DC7B> <9590> <DC7C> <DC7C> <9687> <DC7D> <DC7D> <967E> <DC7E> <DC7E> <9688> <DCA1> <DCA1> <9689> <DCA2> <DCA2> <9683> <DCA3> <DCA3> <9680> <DCA4> <DCA4> <96C2> <DCA5> <DCA5> <96C8> <DCA6> <DCA6> <96C3> <DCA7> <DCA7> <96F1> <DCA8> <DCA8> <96F0> <DCA9> <DCA9> <976C> <DCAA> <DCAA> <9770> <DCAB> <DCAB> <976E> <DCAC> <DCAC> <9807> <DCAD> <DCAD> <98A9> <DCAE> <DCAE> <98EB> <DCAF> <DCAF> <9CE6> <DCB0> <DCB0> <9EF9> <DCB1> <DCB2> <4E83> <DCB3> <DCB3> <4EB6> <DCB4> <DCB4> <50BD> <DCB5> <DCB5> <50BF> <DCB6> <DCB6> <50C6> <DCB7> <DCB7> <50AE> <DCB8> <DCB8> <50C4> <DCB9> <DCB9> <50CA> <DCBA> <DCBA> <50B4> <DCBB> <DCBB> <50C8> <DCBC> <DCBC> <50C2> <DCBD> <DCBD> <50B0> <DCBE> <DCBE> <50C1> <DCBF> <DCBF> <50BA> <DCC0> <DCC0> <50B1> <DCC1> <DCC1> <50CB> <DCC2> <DCC2> <50C9> <DCC3> <DCC3> <50B6> <DCC4> <DCC4> <50B8> <DCC5> <DCC5> <51D7> <DCC6> <DCC6> <527A> <DCC7> <DCC7> <5278> <DCC8> <DCC9> <527B> <DCCA> <DCCA> <55C3> <DCCB> <DCCB> <55DB> <DCCC> <DCCC> <55CC> <DCCD> <DCCD> <55D0> <DCCE> <DCCE> <55CB> <DCCF> <DCCF> <55CA> <DCD0> <DCD0> <55DD> <DCD1> <DCD1> <55C0> <DCD2> <DCD2> <55D4> <DCD3> <DCD3> <55C4> <DCD4> <DCD4> <55E9> <DCD5> <DCD5> <55BF> <DCD6> <DCD6> <55D2> <DCD7> <DCD7> <558D> <DCD8> <DCD8> <55CF> <DCD9> <DCD9> <55D5> <DCDA> <DCDA> <55E2> <DCDB> <DCDB> <55D6> <DCDC> <DCDC> <55C8> <DCDD> <DCDD> <55F2> <DCDE> <DCDE> <55CD> <DCDF> <DCDF> <55D9> <DCE0> <DCE0> <55C2> <DCE1> <DCE1> <5714> <DCE2> <DCE2> <5853> <DCE3> <DCE3> <5868> <DCE4> <DCE4> <5864> endbfrange 100 beginbfrange <DCE5> <DCE5> <584F> <DCE6> <DCE6> <584D> <DCE7> <DCE7> <5849> <DCE8> <DCE8> <586F> <DCE9> <DCE9> <5855> <DCEA> <DCEA> <584E> <DCEB> <DCEB> <585D> <DCEC> <DCEC> <5859> <DCED> <DCED> <5865> <DCEE> <DCEE> <585B> <DCEF> <DCEF> <583D> <DCF0> <DCF0> <5863> <DCF1> <DCF1> <5871> <DCF2> <DCF2> <58FC> <DCF3> <DCF3> <5AC7> <DCF4> <DCF4> <5AC4> <DCF5> <DCF5> <5ACB> <DCF6> <DCF6> <5ABA> <DCF7> <DCF7> <5AB8> <DCF8> <DCF8> <5AB1> <DCF9> <DCF9> <5AB5> <DCFA> <DCFA> <5AB0> <DCFB> <DCFB> <5ABF> <DCFC> <DCFC> <5AC8> <DCFD> <DCFD> <5ABB> <DCFE> <DCFE> <5AC6> <DD40> <DD40> <5AB7> <DD41> <DD41> <5AC0> <DD42> <DD42> <5ACA> <DD43> <DD43> <5AB4> <DD44> <DD44> <5AB6> <DD45> <DD45> <5ACD> <DD46> <DD46> <5AB9> <DD47> <DD47> <5A90> <DD48> <DD48> <5BD6> <DD49> <DD4A> <5BD8> <DD4B> <DD4B> <5C1F> <DD4C> <DD4C> <5C33> <DD4D> <DD4D> <5D71> <DD4E> <DD4E> <5D63> <DD4F> <DD4F> <5D4A> <DD50> <DD50> <5D65> <DD51> <DD51> <5D72> <DD52> <DD52> <5D6C> <DD53> <DD53> <5D5E> <DD54> <DD54> <5D68> <DD55> <DD55> <5D67> <DD56> <DD56> <5D62> <DD57> <DD57> <5DF0> <DD58> <DD58> <5E4F> <DD59> <DD59> <5E4E> <DD5A> <DD5A> <5E4A> <DD5B> <DD5B> <5E4D> <DD5C> <DD5C> <5E4B> <DD5D> <DD5D> <5EC5> <DD5E> <DD5E> <5ECC> <DD5F> <DD5F> <5EC6> <DD60> <DD60> <5ECB> <DD61> <DD61> <5EC7> <DD62> <DD62> <5F40> <DD63> <DD63> <5FAF> <DD64> <DD64> <5FAD> <DD65> <DD65> <60F7> <DD66> <DD67> <6149> <DD68> <DD68> <612B> <DD69> <DD69> <6145> <DD6A> <DD6A> <6136> <DD6B> <DD6B> <6132> <DD6C> <DD6C> <612E> <DD6D> <DD6D> <6146> <DD6E> <DD6E> <612F> <DD6F> <DD6F> <614F> <DD70> <DD70> <6129> <DD71> <DD71> <6140> <DD72> <DD72> <6220> <DD73> <DD73> <9168> <DD74> <DD74> <6223> <DD75> <DD75> <6225> <DD76> <DD76> <6224> <DD77> <DD77> <63C5> <DD78> <DD78> <63F1> <DD79> <DD79> <63EB> <DD7A> <DD7A> <6410> <DD7B> <DD7B> <6412> <DD7C> <DD7C> <6409> <DD7D> <DD7D> <6420> <DD7E> <DD7E> <6424> <DDA1> <DDA1> <6433> <DDA2> <DDA2> <6443> <DDA3> <DDA3> <641F> <DDA4> <DDA4> <6415> <DDA5> <DDA5> <6418> <DDA6> <DDA6> <6439> <DDA7> <DDA7> <6437> <DDA8> <DDA9> <6422> <DDAA> <DDAA> <640C> <DDAB> <DDAB> <6426> <DDAC> <DDAC> <6430> <DDAD> <DDAD> <6428> <DDAE> <DDAE> <6441> endbfrange 100 beginbfrange <DDAF> <DDAF> <6435> <DDB0> <DDB0> <642F> <DDB1> <DDB1> <640A> <DDB2> <DDB2> <641A> <DDB3> <DDB3> <6440> <DDB4> <DDB4> <6425> <DDB5> <DDB5> <6427> <DDB6> <DDB6> <640B> <DDB7> <DDB7> <63E7> <DDB8> <DDB8> <641B> <DDB9> <DDB9> <642E> <DDBA> <DDBA> <6421> <DDBB> <DDBB> <640E> <DDBC> <DDBC> <656F> <DDBD> <DDBD> <6592> <DDBE> <DDBE> <65D3> <DDBF> <DDBF> <6686> <DDC0> <DDC0> <668C> <DDC1> <DDC1> <6695> <DDC2> <DDC2> <6690> <DDC3> <DDC3> <668B> <DDC4> <DDC4> <668A> <DDC5> <DDC5> <6699> <DDC6> <DDC6> <6694> <DDC7> <DDC7> <6678> <DDC8> <DDC8> <6720> <DDC9> <DDC9> <6966> <DDCA> <DDCA> <695F> <DDCB> <DDCB> <6938> <DDCC> <DDCC> <694E> <DDCD> <DDCD> <6962> <DDCE> <DDCE> <6971> <DDCF> <DDCF> <693F> <DDD0> <DDD0> <6945> <DDD1> <DDD1> <696A> <DDD2> <DDD2> <6939> <DDD3> <DDD3> <6942> <DDD4> <DDD4> <6957> <DDD5> <DDD5> <6959> <DDD6> <DDD6> <697A> <DDD7> <DDD8> <6948> <DDD9> <DDD9> <6935> <DDDA> <DDDA> <696C> <DDDB> <DDDB> <6933> <DDDC> <DDDC> <693D> <DDDD> <DDDD> <6965> <DDDE> <DDDE> <68F0> <DDDF> <DDDF> <6978> <DDE0> <DDE0> <6934> <DDE1> <DDE1> <6969> <DDE2> <DDE2> <6940> <DDE3> <DDE3> <696F> <DDE4> <DDE4> <6944> <DDE5> <DDE5> <6976> <DDE6> <DDE6> <6958> <DDE7> <DDE7> <6941> <DDE8> <DDE8> <6974> <DDE9> <DDE9> <694C> <DDEA> <DDEA> <693B> <DDEB> <DDEB> <694B> <DDEC> <DDEC> <6937> <DDED> <DDED> <695C> <DDEE> <DDEE> <694F> <DDEF> <DDEF> <6951> <DDF0> <DDF0> <6932> <DDF1> <DDF1> <6952> <DDF2> <DDF2> <692F> <DDF3> <DDF3> <697B> <DDF4> <DDF4> <693C> <DDF5> <DDF5> <6B46> <DDF6> <DDF6> <6B45> <DDF7> <DDF7> <6B43> <DDF8> <DDF8> <6B42> <DDF9> <DDF9> <6B48> <DDFA> <DDFA> <6B41> <DDFB> <DDFB> <6B9B> <DDFC> <DDFC> <FA0D> <DDFD> <DDFE> <6BFB> <DE40> <DE40> <6BF9> <DE41> <DE42> <6BF7> <DE43> <DE43> <6E9B> <DE44> <DE44> <6ED6> <DE45> <DE45> <6EC8> <DE46> <DE46> <6E8F> <DE47> <DE47> <6EC0> <DE48> <DE48> <6E9F> <DE49> <DE4A> <6E93> <DE4B> <DE4B> <6EA0> <DE4C> <DE4C> <6EB1> <DE4D> <DE4D> <6EB9> <DE4E> <DE4E> <6EC6> <DE4F> <DE4F> <6ED2> <DE50> <DE50> <6EBD> <DE51> <DE51> <6EC1> <DE52> <DE52> <6E9E> <DE53> <DE53> <6EC9> <DE54> <DE54> <6EB7> <DE55> <DE55> <6EB0> <DE56> <DE56> <6ECD> <DE57> <DE57> <6EA6> endbfrange 100 beginbfrange <DE58> <DE58> <6ECF> <DE59> <DE59> <6EB2> <DE5A> <DE5A> <6EBE> <DE5B> <DE5B> <6EC3> <DE5C> <DE5C> <6EDC> <DE5D> <DE5D> <6ED8> <DE5E> <DE5E> <6E99> <DE5F> <DE5F> <6E92> <DE60> <DE60> <6E8E> <DE61> <DE61> <6E8D> <DE62> <DE62> <6EA4> <DE63> <DE63> <6EA1> <DE64> <DE64> <6EBF> <DE65> <DE65> <6EB3> <DE66> <DE66> <6ED0> <DE67> <DE67> <6ECA> <DE68> <DE68> <6E97> <DE69> <DE69> <6EAE> <DE6A> <DE6A> <6EA3> <DE6B> <DE6B> <7147> <DE6C> <DE6C> <7154> <DE6D> <DE6D> <7152> <DE6E> <DE6E> <7163> <DE6F> <DE6F> <7160> <DE70> <DE70> <7141> <DE71> <DE71> <715D> <DE72> <DE72> <7162> <DE73> <DE73> <7172> <DE74> <DE74> <7178> <DE75> <DE75> <716A> <DE76> <DE76> <7161> <DE77> <DE77> <7142> <DE78> <DE78> <7158> <DE79> <DE79> <7143> <DE7A> <DE7A> <714B> <DE7B> <DE7B> <7170> <DE7C> <DE7C> <715F> <DE7D> <DE7D> <7150> <DE7E> <DE7E> <7153> <DEA1> <DEA1> <7144> <DEA2> <DEA2> <714D> <DEA3> <DEA3> <715A> <DEA4> <DEA4> <724F> <DEA5> <DEA5> <728D> <DEA6> <DEA6> <728C> <DEA7> <DEA7> <7291> <DEA8> <DEA8> <7290> <DEA9> <DEA9> <728E> <DEAA> <DEAA> <733C> <DEAB> <DEAB> <7342> <DEAC> <DEAC> <733B> <DEAD> <DEAD> <733A> <DEAE> <DEAE> <7340> <DEAF> <DEAF> <734A> <DEB0> <DEB0> <7349> <DEB1> <DEB1> <7444> <DEB2> <DEB3> <744A> <DEB4> <DEB4> <7452> <DEB5> <DEB5> <7451> <DEB6> <DEB6> <7457> <DEB7> <DEB7> <7440> <DEB8> <DEB9> <744F> <DEBA> <DEBA> <744E> <DEBB> <DEBB> <7442> <DEBC> <DEBC> <7446> <DEBD> <DEBD> <744D> <DEBE> <DEBE> <7454> <DEBF> <DEBF> <74E1> <DEC0> <DEC0> <74FF> <DEC1> <DEC1> <74FE> <DEC2> <DEC2> <74FD> <DEC3> <DEC3> <751D> <DEC4> <DEC4> <7579> <DEC5> <DEC5> <7577> <DEC6> <DEC6> <6983> <DEC7> <DEC7> <75EF> <DEC8> <DEC8> <760F> <DEC9> <DEC9> <7603> <DECA> <DECA> <75F7> <DECB> <DECB> <75FE> <DECC> <DECC> <75FC> <DECD> <DECD> <75F9> <DECE> <DECE> <75F8> <DECF> <DECF> <7610> <DED0> <DED0> <75FB> <DED1> <DED1> <75F6> <DED2> <DED2> <75ED> <DED3> <DED3> <75F5> <DED4> <DED4> <75FD> <DED5> <DED5> <7699> <DED6> <DED6> <76B5> <DED7> <DED7> <76DD> <DED8> <DED8> <7755> <DED9> <DEDA> <775F> <DEDB> <DEDB> <7752> <DEDC> <DEDC> <7756> <DEDD> <DEDD> <775A> <DEDE> <DEDE> <7769> <DEDF> <DEDF> <7767> <DEE0> <DEE0> <7754> endbfrange 100 beginbfrange <DEE1> <DEE1> <7759> <DEE2> <DEE2> <776D> <DEE3> <DEE3> <77E0> <DEE4> <DEE4> <7887> <DEE5> <DEE5> <789A> <DEE6> <DEE6> <7894> <DEE7> <DEE7> <788F> <DEE8> <DEE8> <7884> <DEE9> <DEE9> <7895> <DEEA> <DEEB> <7885> <DEEC> <DEEC> <78A1> <DEED> <DEED> <7883> <DEEE> <DEEE> <7879> <DEEF> <DEEF> <7899> <DEF0> <DEF0> <7880> <DEF1> <DEF1> <7896> <DEF2> <DEF2> <787B> <DEF3> <DEF3> <797C> <DEF4> <DEF4> <7982> <DEF5> <DEF5> <797D> <DEF6> <DEF6> <7979> <DEF7> <DEF7> <7A11> <DEF8> <DEF9> <7A18> <DEFA> <DEFA> <7A12> <DEFB> <DEFB> <7A17> <DEFC> <DEFC> <7A15> <DEFD> <DEFD> <7A22> <DEFE> <DEFE> <7A13> <DF40> <DF40> <7A1B> <DF41> <DF41> <7A10> <DF42> <DF42> <7AA3> <DF43> <DF43> <7AA2> <DF44> <DF44> <7A9E> <DF45> <DF45> <7AEB> <DF46> <DF46> <7B66> <DF47> <DF47> <7B64> <DF48> <DF48> <7B6D> <DF49> <DF49> <7B74> <DF4A> <DF4A> <7B69> <DF4B> <DF4B> <7B72> <DF4C> <DF4C> <7B65> <DF4D> <DF4D> <7B73> <DF4E> <DF4E> <7B71> <DF4F> <DF4F> <7B70> <DF50> <DF50> <7B61> <DF51> <DF51> <7B78> <DF52> <DF52> <7B76> <DF53> <DF53> <7B63> <DF54> <DF54> <7CB2> <DF55> <DF55> <7CB4> <DF56> <DF56> <7CAF> <DF57> <DF57> <7D88> <DF58> <DF58> <7D86> <DF59> <DF59> <7D80> <DF5A> <DF5A> <7D8D> <DF5B> <DF5B> <7D7F> <DF5C> <DF5C> <7D85> <DF5D> <DF5D> <7D7A> <DF5E> <DF5E> <7D8E> <DF5F> <DF5F> <7D7B> <DF60> <DF60> <7D83> <DF61> <DF61> <7D7C> <DF62> <DF62> <7D8C> <DF63> <DF63> <7D94> <DF64> <DF64> <7D84> <DF65> <DF65> <7D7D> <DF66> <DF66> <7D92> <DF67> <DF67> <7F6D> <DF68> <DF68> <7F6B> <DF69> <DF6A> <7F67> <DF6B> <DF6B> <7F6C> <DF6C> <DF6C> <7FA6> <DF6D> <DF6D> <7FA5> <DF6E> <DF6E> <7FA7> <DF6F> <DF70> <7FDB> <DF71> <DF71> <8021> <DF72> <DF72> <8164> <DF73> <DF73> <8160> <DF74> <DF74> <8177> <DF75> <DF75> <815C> <DF76> <DF76> <8169> <DF77> <DF77> <815B> <DF78> <DF78> <8162> <DF79> <DF79> <8172> <DF7A> <DF7A> <6721> <DF7B> <DF7B> <815E> <DF7C> <DF7C> <8176> <DF7D> <DF7D> <8167> <DF7E> <DF7E> <816F> <DFA1> <DFA1> <8144> <DFA2> <DFA2> <8161> <DFA3> <DFA3> <821D> <DFA4> <DFA4> <8249> <DFA5> <DFA5> <8244> <DFA6> <DFA6> <8240> <DFA7> <DFA7> <8242> <DFA8> <DFA8> <8245> <DFA9> <DFA9> <84F1> <DFAA> <DFAA> <843F> <DFAB> <DFAB> <8456> endbfrange 100 beginbfrange <DFAC> <DFAC> <8476> <DFAD> <DFAD> <8479> <DFAE> <DFAE> <848F> <DFAF> <DFAF> <848D> <DFB0> <DFB0> <8465> <DFB1> <DFB1> <8451> <DFB2> <DFB2> <8440> <DFB3> <DFB3> <8486> <DFB4> <DFB4> <8467> <DFB5> <DFB5> <8430> <DFB6> <DFB6> <844D> <DFB7> <DFB7> <847D> <DFB8> <DFB8> <845A> <DFB9> <DFB9> <8459> <DFBA> <DFBA> <8474> <DFBB> <DFBB> <8473> <DFBC> <DFBC> <845D> <DFBD> <DFBD> <8507> <DFBE> <DFBE> <845E> <DFBF> <DFBF> <8437> <DFC0> <DFC0> <843A> <DFC1> <DFC1> <8434> <DFC2> <DFC2> <847A> <DFC3> <DFC3> <8443> <DFC4> <DFC4> <8478> <DFC5> <DFC5> <8432> <DFC6> <DFC6> <8445> <DFC7> <DFC7> <8429> <DFC8> <DFC8> <83D9> <DFC9> <DFC9> <844B> <DFCA> <DFCA> <842F> <DFCB> <DFCB> <8442> <DFCC> <DFCC> <842D> <DFCD> <DFCD> <845F> <DFCE> <DFCE> <8470> <DFCF> <DFCF> <8439> <DFD0> <DFD0> <844E> <DFD1> <DFD1> <844C> <DFD2> <DFD2> <8452> <DFD3> <DFD3> <846F> <DFD4> <DFD4> <84C5> <DFD5> <DFD5> <848E> <DFD6> <DFD6> <843B> <DFD7> <DFD7> <8447> <DFD8> <DFD8> <8436> <DFD9> <DFD9> <8433> <DFDA> <DFDA> <8468> <DFDB> <DFDB> <847E> <DFDC> <DFDC> <8444> <DFDD> <DFDD> <842B> <DFDE> <DFDE> <8460> <DFDF> <DFDF> <8454> <DFE0> <DFE0> <846E> <DFE1> <DFE1> <8450> <DFE2> <DFE2> <870B> <DFE3> <DFE3> <8704> <DFE4> <DFE4> <86F7> <DFE5> <DFE5> <870C> <DFE6> <DFE6> <86FA> <DFE7> <DFE7> <86D6> <DFE8> <DFE8> <86F5> <DFE9> <DFE9> <874D> <DFEA> <DFEA> <86F8> <DFEB> <DFEB> <870E> <DFEC> <DFEC> <8709> <DFED> <DFED> <8701> <DFEE> <DFEE> <86F6> <DFEF> <DFEF> <870D> <DFF0> <DFF0> <8705> <DFF1> <DFF1> <88D6> <DFF2> <DFF2> <88CB> <DFF3> <DFF4> <88CD> <DFF5> <DFF5> <88DE> <DFF6> <DFF6> <88DB> <DFF7> <DFF7> <88DA> <DFF8> <DFF8> <88CC> <DFF9> <DFF9> <88D0> <DFFA> <DFFA> <8985> <DFFB> <DFFB> <899B> <DFFC> <DFFC> <89DF> <DFFD> <DFFD> <89E5> <DFFE> <DFFE> <89E4> <E040> <E040> <89E1> <E041> <E041> <89E0> <E042> <E042> <89E2> <E043> <E043> <89DC> <E044> <E044> <89E6> <E045> <E045> <8A76> <E046> <E046> <8A86> <E047> <E047> <8A7F> <E048> <E048> <8A61> <E049> <E049> <8A3F> <E04A> <E04A> <8A77> <E04B> <E04B> <8A82> <E04C> <E04C> <8A84> <E04D> <E04D> <8A75> <E04E> <E04E> <8A83> <E04F> <E04F> <8A81> <E050> <E050> <8A74> <E051> <E051> <8A7A> endbfrange 100 beginbfrange <E052> <E052> <8C3C> <E053> <E053> <8C4B> <E054> <E054> <8C4A> <E055> <E055> <8C65> <E056> <E056> <8C64> <E057> <E057> <8C66> <E058> <E058> <8C86> <E059> <E05A> <8C84> <E05B> <E05B> <8CCC> <E05C> <E05D> <8D68> <E05E> <E05E> <8D91> <E05F> <E05F> <8D8C> <E060> <E061> <8D8E> <E062> <E062> <8D8D> <E063> <E064> <8D93> <E065> <E065> <8D90> <E066> <E066> <8D92> <E067> <E067> <8DF0> <E068> <E068> <8DE0> <E069> <E069> <8DEC> <E06A> <E06A> <8DF1> <E06B> <E06B> <8DEE> <E06C> <E06C> <8DD0> <E06D> <E06D> <8DE9> <E06E> <E06E> <8DE3> <E06F> <E06F> <8DE2> <E070> <E070> <8DE7> <E071> <E071> <8DF2> <E072> <E072> <8DEB> <E073> <E073> <8DF4> <E074> <E074> <8F06> <E075> <E075> <8EFF> <E076> <E076> <8F01> <E077> <E077> <8F00> <E078> <E078> <8F05> <E079> <E07A> <8F07> <E07B> <E07B> <8F02> <E07C> <E07C> <8F0B> <E07D> <E07D> <9052> <E07E> <E07E> <903F> <E0A1> <E0A1> <9044> <E0A2> <E0A2> <9049> <E0A3> <E0A3> <903D> <E0A4> <E0A4> <9110> <E0A5> <E0A5> <910D> <E0A6> <E0A6> <910F> <E0A7> <E0A7> <9111> <E0A8> <E0A8> <9116> <E0A9> <E0A9> <9114> <E0AA> <E0AA> <910B> <E0AB> <E0AB> <910E> <E0AC> <E0AD> <916E> <E0AE> <E0AE> <9248> <E0AF> <E0AF> <9252> <E0B0> <E0B0> <9230> <E0B1> <E0B1> <923A> <E0B2> <E0B2> <9266> <E0B3> <E0B3> <9233> <E0B4> <E0B4> <9265> <E0B5> <E0B5> <925E> <E0B6> <E0B6> <9283> <E0B7> <E0B7> <922E> <E0B8> <E0B8> <924A> <E0B9> <E0B9> <9246> <E0BA> <E0BA> <926D> <E0BB> <E0BB> <926C> <E0BC> <E0BC> <924F> <E0BD> <E0BD> <9260> <E0BE> <E0BE> <9267> <E0BF> <E0BF> <926F> <E0C0> <E0C0> <9236> <E0C1> <E0C1> <9261> <E0C2> <E0C2> <9270> <E0C3> <E0C3> <9231> <E0C4> <E0C4> <9254> <E0C5> <E0C5> <9263> <E0C6> <E0C6> <9250> <E0C7> <E0C7> <9272> <E0C8> <E0C8> <924E> <E0C9> <E0C9> <9253> <E0CA> <E0CA> <924C> <E0CB> <E0CB> <9256> <E0CC> <E0CC> <9232> <E0CD> <E0CD> <959F> <E0CE> <E0CE> <959C> <E0CF> <E0CF> <959E> <E0D0> <E0D0> <959B> <E0D1> <E0D2> <9692> <E0D3> <E0D3> <9691> <E0D4> <E0D4> <9697> <E0D5> <E0D5> <96CE> <E0D6> <E0D6> <96FA> <E0D7> <E0D7> <96FD> <E0D8> <E0D8> <96F8> <E0D9> <E0D9> <96F5> <E0DA> <E0DA> <9773> <E0DB> <E0DC> <9777> <E0DD> <E0DD> <9772> <E0DE> <E0DE> <980F> <E0DF> <E0E0> <980D> endbfrange 100 beginbfrange <E0E1> <E0E1> <98AC> <E0E2> <E0E2> <98F6> <E0E3> <E0E3> <98F9> <E0E4> <E0E4> <99AF> <E0E5> <E0E5> <99B2> <E0E6> <E0E6> <99B0> <E0E7> <E0E7> <99B5> <E0E8> <E0E8> <9AAD> <E0E9> <E0E9> <9AAB> <E0EA> <E0EA> <9B5B> <E0EB> <E0EB> <9CEA> <E0EC> <E0EC> <9CED> <E0ED> <E0ED> <9CE7> <E0EE> <E0EE> <9E80> <E0EF> <E0EF> <9EFD> <E0F0> <E0F0> <50E6> <E0F1> <E0F1> <50D4> <E0F2> <E0F2> <50D7> <E0F3> <E0F3> <50E8> <E0F4> <E0F4> <50F3> <E0F5> <E0F5> <50DB> <E0F6> <E0F6> <50EA> <E0F7> <E0F7> <50DD> <E0F8> <E0F8> <50E4> <E0F9> <E0F9> <50D3> <E0FA> <E0FA> <50EC> <E0FB> <E0FB> <50F0> <E0FC> <E0FC> <50EF> <E0FD> <E0FD> <50E3> <E0FE> <E0FE> <50E0> <E140> <E140> <51D8> <E141> <E142> <5280> <E143> <E143> <52E9> <E144> <E144> <52EB> <E145> <E145> <5330> <E146> <E146> <53AC> <E147> <E147> <5627> <E148> <E148> <5615> <E149> <E149> <560C> <E14A> <E14A> <5612> <E14B> <E14B> <55FC> <E14C> <E14C> <560F> <E14D> <E14D> <561C> <E14E> <E14E> <5601> <E14F> <E14F> <5613> <E150> <E150> <5602> <E151> <E151> <55FA> <E152> <E152> <561D> <E153> <E153> <5604> <E154> <E154> <55FF> <E155> <E155> <55F9> <E156> <E156> <5889> <E157> <E157> <587C> <E158> <E158> <5890> <E159> <E159> <5898> <E15A> <E15A> <5886> <E15B> <E15B> <5881> <E15C> <E15C> <587F> <E15D> <E15D> <5874> <E15E> <E15E> <588B> <E15F> <E15F> <587A> <E160> <E160> <5887> <E161> <E161> <5891> <E162> <E162> <588E> <E163> <E163> <5876> <E164> <E164> <5882> <E165> <E165> <5888> <E166> <E166> <587B> <E167> <E167> <5894> <E168> <E168> <588F> <E169> <E169> <58FE> <E16A> <E16A> <596B> <E16B> <E16B> <5ADC> <E16C> <E16C> <5AEE> <E16D> <E16D> <5AE5> <E16E> <E16E> <5AD5> <E16F> <E16F> <5AEA> <E170> <E170> <5ADA> <E171> <E171> <5AED> <E172> <E172> <5AEB> <E173> <E173> <5AF3> <E174> <E174> <5AE2> <E175> <E175> <5AE0> <E176> <E176> <5ADB> <E177> <E177> <5AEC> <E178> <E178> <5ADE> <E179> <E179> <5ADD> <E17A> <E17A> <5AD9> <E17B> <E17B> <5AE8> <E17C> <E17C> <5ADF> <E17D> <E17D> <5B77> <E17E> <E17E> <5BE0> <E1A1> <E1A1> <5BE3> <E1A2> <E1A2> <5C63> <E1A3> <E1A3> <5D82> <E1A4> <E1A4> <5D80> <E1A5> <E1A5> <5D7D> <E1A6> <E1A6> <5D86> <E1A7> <E1A7> <5D7A> <E1A8> <E1A8> <5D81> endbfrange 100 beginbfrange <E1A9> <E1A9> <5D77> <E1AA> <E1AA> <5D8A> <E1AB> <E1AB> <5D89> <E1AC> <E1AC> <5D88> <E1AD> <E1AD> <5D7E> <E1AE> <E1AE> <5D7C> <E1AF> <E1AF> <5D8D> <E1B0> <E1B0> <5D79> <E1B1> <E1B1> <5D7F> <E1B2> <E1B3> <5E58> <E1B4> <E1B4> <5E53> <E1B5> <E1B5> <5ED8> <E1B6> <E1B6> <5ED1> <E1B7> <E1B7> <5ED7> <E1B8> <E1B8> <5ECE> <E1B9> <E1B9> <5EDC> <E1BA> <E1BA> <5ED5> <E1BB> <E1BB> <5ED9> <E1BC> <E1BC> <5ED2> <E1BD> <E1BD> <5ED4> <E1BE> <E1BE> <5F44> <E1BF> <E1BF> <5F43> <E1C0> <E1C0> <5F6F> <E1C1> <E1C1> <5FB6> <E1C2> <E1C2> <612C> <E1C3> <E1C3> <6128> <E1C4> <E1C4> <6141> <E1C5> <E1C5> <615E> <E1C6> <E1C6> <6171> <E1C7> <E1C7> <6173> <E1C8> <E1C9> <6152> <E1CA> <E1CA> <6172> <E1CB> <E1CB> <616C> <E1CC> <E1CC> <6180> <E1CD> <E1CD> <6174> <E1CE> <E1CE> <6154> <E1CF> <E1CF> <617A> <E1D0> <E1D0> <615B> <E1D1> <E1D1> <6165> <E1D2> <E1D2> <613B> <E1D3> <E1D3> <616A> <E1D4> <E1D4> <6161> <E1D5> <E1D5> <6156> <E1D6> <E1D6> <6229> <E1D7> <E1D7> <6227> <E1D8> <E1D8> <622B> <E1D9> <E1D9> <642B> <E1DA> <E1DA> <644D> <E1DB> <E1DB> <645B> <E1DC> <E1DC> <645D> <E1DD> <E1DD> <6474> <E1DE> <E1DE> <6476> <E1DF> <E1E0> <6472> <E1E1> <E1E1> <647D> <E1E2> <E1E2> <6475> <E1E3> <E1E3> <6466> <E1E4> <E1E4> <64A6> <E1E5> <E1E5> <644E> <E1E6> <E1E6> <6482> <E1E7> <E1E7> <645E> <E1E8> <E1E8> <645C> <E1E9> <E1E9> <644B> <E1EA> <E1EA> <6453> <E1EB> <E1EB> <6460> <E1EC> <E1EC> <6450> <E1ED> <E1ED> <647F> <E1EE> <E1EE> <643F> <E1EF> <E1EF> <646C> <E1F0> <E1F0> <646B> <E1F1> <E1F1> <6459> <E1F2> <E1F2> <6465> <E1F3> <E1F3> <6477> <E1F4> <E1F4> <6573> <E1F5> <E1F5> <65A0> <E1F6> <E1F6> <66A1> <E1F7> <E1F7> <66A0> <E1F8> <E1F8> <669F> <E1F9> <E1F9> <6705> <E1FA> <E1FA> <6704> <E1FB> <E1FB> <6722> <E1FC> <E1FC> <69B1> <E1FD> <E1FD> <69B6> <E1FE> <E1FE> <69C9> <E240> <E240> <69A0> <E241> <E241> <69CE> <E242> <E242> <6996> <E243> <E243> <69B0> <E244> <E244> <69AC> <E245> <E245> <69BC> <E246> <E246> <6991> <E247> <E247> <6999> <E248> <E248> <698E> <E249> <E249> <69A7> <E24A> <E24A> <698D> <E24B> <E24B> <69A9> <E24C> <E24C> <69BE> <E24D> <E24D> <69AF> <E24E> <E24E> <69BF> <E24F> <E24F> <69C4> <E250> <E250> <69BD> endbfrange 100 beginbfrange <E251> <E251> <69A4> <E252> <E252> <69D4> <E253> <E253> <69B9> <E254> <E254> <69CA> <E255> <E255> <699A> <E256> <E256> <69CF> <E257> <E257> <69B3> <E258> <E258> <6993> <E259> <E259> <69AA> <E25A> <E25A> <69A1> <E25B> <E25B> <699E> <E25C> <E25C> <69D9> <E25D> <E25D> <6997> <E25E> <E25E> <6990> <E25F> <E25F> <69C2> <E260> <E260> <69B5> <E261> <E261> <69A5> <E262> <E262> <69C6> <E263> <E263> <6B4A> <E264> <E264> <6B4D> <E265> <E265> <6B4B> <E266> <E268> <6B9E> <E269> <E26A> <6BC3> <E26B> <E26B> <6BFE> <E26C> <E26C> <6ECE> <E26D> <E26D> <6EF5> <E26E> <E26E> <6EF1> <E26F> <E26F> <6F03> <E270> <E270> <6F25> <E271> <E271> <6EF8> <E272> <E272> <6F37> <E273> <E273> <6EFB> <E274> <E274> <6F2E> <E275> <E275> <6F09> <E276> <E276> <6F4E> <E277> <E278> <6F19> <E279> <E279> <6F27> <E27A> <E27A> <6F18> <E27B> <E27B> <6F3B> <E27C> <E27C> <6F12> <E27D> <E27D> <6EED> <E27E> <E27E> <6F0A> <E2A1> <E2A1> <6F36> <E2A2> <E2A2> <6F73> <E2A3> <E2A3> <6EF9> <E2A4> <E2A4> <6EEE> <E2A5> <E2A5> <6F2D> <E2A6> <E2A6> <6F40> <E2A7> <E2A7> <6F30> <E2A8> <E2A8> <6F3C> <E2A9> <E2A9> <6F35> <E2AA> <E2AA> <6EEB> <E2AB> <E2AB> <6F07> <E2AC> <E2AC> <6F0E> <E2AD> <E2AD> <6F43> <E2AE> <E2AE> <6F05> <E2AF> <E2AF> <6EFD> <E2B0> <E2B0> <6EF6> <E2B1> <E2B1> <6F39> <E2B2> <E2B2> <6F1C> <E2B3> <E2B3> <6EFC> <E2B4> <E2B4> <6F3A> <E2B5> <E2B5> <6F1F> <E2B6> <E2B6> <6F0D> <E2B7> <E2B7> <6F1E> <E2B8> <E2B8> <6F08> <E2B9> <E2B9> <6F21> <E2BA> <E2BA> <7187> <E2BB> <E2BB> <7190> <E2BC> <E2BC> <7189> <E2BD> <E2BD> <7180> <E2BE> <E2BE> <7185> <E2BF> <E2BF> <7182> <E2C0> <E2C0> <718F> <E2C1> <E2C1> <717B> <E2C2> <E2C2> <7186> <E2C3> <E2C3> <7181> <E2C4> <E2C4> <7197> <E2C5> <E2C5> <7244> <E2C6> <E2C6> <7253> <E2C7> <E2C7> <7297> <E2C8> <E2C8> <7295> <E2C9> <E2C9> <7293> <E2CA> <E2CA> <7343> <E2CB> <E2CB> <734D> <E2CC> <E2CC> <7351> <E2CD> <E2CD> <734C> <E2CE> <E2CE> <7462> <E2CF> <E2CF> <7473> <E2D0> <E2D0> <7471> <E2D1> <E2D1> <7475> <E2D2> <E2D2> <7472> <E2D3> <E2D3> <7467> <E2D4> <E2D4> <746E> <E2D5> <E2D5> <7500> <E2D6> <E2D7> <7502> <E2D8> <E2D8> <757D> <E2D9> <E2D9> <7590> <E2DA> <E2DA> <7616> <E2DB> <E2DB> <7608> endbfrange 100 beginbfrange <E2DC> <E2DC> <760C> <E2DD> <E2DD> <7615> <E2DE> <E2DE> <7611> <E2DF> <E2DF> <760A> <E2E0> <E2E0> <7614> <E2E1> <E2E1> <76B8> <E2E2> <E2E2> <7781> <E2E3> <E2E3> <777C> <E2E4> <E2E4> <7785> <E2E5> <E2E5> <7782> <E2E6> <E2E6> <776E> <E2E7> <E2E7> <7780> <E2E8> <E2E8> <776F> <E2E9> <E2E9> <777E> <E2EA> <E2EA> <7783> <E2EB> <E2EB> <78B2> <E2EC> <E2EC> <78AA> <E2ED> <E2ED> <78B4> <E2EE> <E2EE> <78AD> <E2EF> <E2EF> <78A8> <E2F0> <E2F0> <787E> <E2F1> <E2F1> <78AB> <E2F2> <E2F2> <789E> <E2F3> <E2F3> <78A5> <E2F4> <E2F4> <78A0> <E2F5> <E2F5> <78AC> <E2F6> <E2F6> <78A2> <E2F7> <E2F7> <78A4> <E2F8> <E2F8> <7998> <E2F9> <E2FA> <798A> <E2FB> <E2FB> <7996> <E2FC> <E2FC> <7995> <E2FD> <E2FD> <7994> <E2FE> <E2FE> <7993> <E340> <E340> <7997> <E341> <E341> <7988> <E342> <E342> <7992> <E343> <E343> <7990> <E344> <E344> <7A2B> <E345> <E345> <7A4A> <E346> <E346> <7A30> <E347> <E347> <7A2F> <E348> <E348> <7A28> <E349> <E349> <7A26> <E34A> <E34A> <7AA8> <E34B> <E34C> <7AAB> <E34D> <E34D> <7AEE> <E34E> <E34E> <7B88> <E34F> <E34F> <7B9C> <E350> <E350> <7B8A> <E351> <E351> <7B91> <E352> <E352> <7B90> <E353> <E353> <7B96> <E354> <E354> <7B8D> <E355> <E355> <7B8C> <E356> <E356> <7B9B> <E357> <E357> <7B8E> <E358> <E358> <7B85> <E359> <E359> <7B98> <E35A> <E35A> <5284> <E35B> <E35B> <7B99> <E35C> <E35C> <7BA4> <E35D> <E35D> <7B82> <E35E> <E35E> <7CBB> <E35F> <E35F> <7CBF> <E360> <E360> <7CBC> <E361> <E361> <7CBA> <E362> <E362> <7DA7> <E363> <E363> <7DB7> <E364> <E364> <7DC2> <E365> <E365> <7DA3> <E366> <E366> <7DAA> <E367> <E367> <7DC1> <E368> <E368> <7DC0> <E369> <E369> <7DC5> <E36A> <E36A> <7D9D> <E36B> <E36B> <7DCE> <E36C> <E36C> <7DC4> <E36D> <E36D> <7DC6> <E36E> <E36F> <7DCB> <E370> <E370> <7DAF> <E371> <E371> <7DB9> <E372> <E372> <7D96> <E373> <E373> <7DBC> <E374> <E374> <7D9F> <E375> <E375> <7DA6> <E376> <E376> <7DAE> <E377> <E377> <7DA9> <E378> <E378> <7DA1> <E379> <E379> <7DC9> <E37A> <E37A> <7F73> <E37B> <E37C> <7FE2> <E37D> <E37D> <7FE5> <E37E> <E37E> <7FDE> <E3A1> <E3A1> <8024> <E3A2> <E3A2> <805D> <E3A3> <E3A3> <805C> <E3A4> <E3A4> <8189> <E3A5> <E3A5> <8186> <E3A6> <E3A6> <8183> endbfrange 100 beginbfrange <E3A7> <E3A7> <8187> <E3A8> <E3A8> <818D> <E3A9> <E3A9> <818C> <E3AA> <E3AA> <818B> <E3AB> <E3AB> <8215> <E3AC> <E3AC> <8497> <E3AD> <E3AD> <84A4> <E3AE> <E3AE> <84A1> <E3AF> <E3AF> <849F> <E3B0> <E3B0> <84BA> <E3B1> <E3B1> <84CE> <E3B2> <E3B2> <84C2> <E3B3> <E3B3> <84AC> <E3B4> <E3B4> <84AE> <E3B5> <E3B5> <84AB> <E3B6> <E3B6> <84B9> <E3B7> <E3B7> <84B4> <E3B8> <E3B8> <84C1> <E3B9> <E3B9> <84CD> <E3BA> <E3BA> <84AA> <E3BB> <E3BB> <849A> <E3BC> <E3BC> <84B1> <E3BD> <E3BD> <84D0> <E3BE> <E3BE> <849D> <E3BF> <E3BF> <84A7> <E3C0> <E3C0> <84BB> <E3C1> <E3C1> <84A2> <E3C2> <E3C2> <8494> <E3C3> <E3C3> <84C7> <E3C4> <E3C4> <84CC> <E3C5> <E3C5> <849B> <E3C6> <E3C6> <84A9> <E3C7> <E3C7> <84AF> <E3C8> <E3C8> <84A8> <E3C9> <E3C9> <84D6> <E3CA> <E3CA> <8498> <E3CB> <E3CB> <84B6> <E3CC> <E3CC> <84CF> <E3CD> <E3CD> <84A0> <E3CE> <E3CE> <84D7> <E3CF> <E3CF> <84D4> <E3D0> <E3D0> <84D2> <E3D1> <E3D1> <84DB> <E3D2> <E3D2> <84B0> <E3D3> <E3D3> <8491> <E3D4> <E3D4> <8661> <E3D5> <E3D5> <8733> <E3D6> <E3D6> <8723> <E3D7> <E3D7> <8728> <E3D8> <E3D8> <876B> <E3D9> <E3D9> <8740> <E3DA> <E3DA> <872E> <E3DB> <E3DB> <871E> <E3DC> <E3DC> <8721> <E3DD> <E3DD> <8719> <E3DE> <E3DE> <871B> <E3DF> <E3DF> <8743> <E3E0> <E3E0> <872C> <E3E1> <E3E1> <8741> <E3E2> <E3E2> <873E> <E3E3> <E3E3> <8746> <E3E4> <E3E4> <8720> <E3E5> <E3E5> <8732> <E3E6> <E3E6> <872A> <E3E7> <E3E7> <872D> <E3E8> <E3E8> <873C> <E3E9> <E3E9> <8712> <E3EA> <E3EA> <873A> <E3EB> <E3EB> <8731> <E3EC> <E3EC> <8735> <E3ED> <E3ED> <8742> <E3EE> <E3EF> <8726> <E3F0> <E3F0> <8738> <E3F1> <E3F1> <8724> <E3F2> <E3F2> <871A> <E3F3> <E3F3> <8730> <E3F4> <E3F4> <8711> <E3F5> <E3F5> <88F7> <E3F6> <E3F6> <88E7> <E3F7> <E3F8> <88F1> <E3F9> <E3F9> <88FA> <E3FA> <E3FA> <88FE> <E3FB> <E3FB> <88EE> <E3FC> <E3FC> <88FC> <E3FD> <E3FD> <88F6> <E3FE> <E3FE> <88FB> <E440> <E440> <88F0> <E441> <E441> <88EC> <E442> <E442> <88EB> <E443> <E443> <899D> <E444> <E444> <89A1> <E445> <E445> <899F> <E446> <E446> <899E> <E447> <E447> <89E9> <E448> <E448> <89EB> <E449> <E449> <89E8> <E44A> <E44A> <8AAB> <E44B> <E44B> <8A99> <E44C> <E44C> <8A8B> <E44D> <E44D> <8A92> endbfrange 100 beginbfrange <E44E> <E44E> <8A8F> <E44F> <E44F> <8A96> <E450> <E450> <8C3D> <E451> <E452> <8C68> <E453> <E453> <8CD5> <E454> <E454> <8CCF> <E455> <E455> <8CD7> <E456> <E456> <8D96> <E457> <E457> <8E09> <E458> <E458> <8E02> <E459> <E459> <8DFF> <E45A> <E45A> <8E0D> <E45B> <E45B> <8DFD> <E45C> <E45C> <8E0A> <E45D> <E45D> <8E03> <E45E> <E45E> <8E07> <E45F> <E45F> <8E06> <E460> <E460> <8E05> <E461> <E461> <8DFE> <E462> <E462> <8E00> <E463> <E463> <8E04> <E464> <E465> <8F10> <E466> <E466> <8F0E> <E467> <E467> <8F0D> <E468> <E468> <9123> <E469> <E469> <911C> <E46A> <E46A> <9120> <E46B> <E46B> <9122> <E46C> <E46C> <911F> <E46D> <E46D> <911D> <E46E> <E46E> <911A> <E46F> <E46F> <9124> <E470> <E470> <9121> <E471> <E471> <911B> <E472> <E472> <917A> <E473> <E473> <9172> <E474> <E474> <9179> <E475> <E475> <9173> <E476> <E476> <92A5> <E477> <E477> <92A4> <E478> <E478> <9276> <E479> <E479> <929B> <E47A> <E47A> <927A> <E47B> <E47B> <92A0> <E47C> <E47C> <9294> <E47D> <E47D> <92AA> <E47E> <E47E> <928D> <E4A1> <E4A1> <92A6> <E4A2> <E4A2> <929A> <E4A3> <E4A3> <92AB> <E4A4> <E4A4> <9279> <E4A5> <E4A5> <9297> <E4A6> <E4A6> <927F> <E4A7> <E4A7> <92A3> <E4A8> <E4A8> <92EE> <E4A9> <E4A9> <928E> <E4AA> <E4AA> <9282> <E4AB> <E4AB> <9295> <E4AC> <E4AC> <92A2> <E4AD> <E4AD> <927D> <E4AE> <E4AE> <9288> <E4AF> <E4AF> <92A1> <E4B0> <E4B0> <928A> <E4B1> <E4B1> <9286> <E4B2> <E4B2> <928C> <E4B3> <E4B3> <9299> <E4B4> <E4B4> <92A7> <E4B5> <E4B5> <927E> <E4B6> <E4B6> <9287> <E4B7> <E4B7> <92A9> <E4B8> <E4B8> <929D> <E4B9> <E4B9> <928B> <E4BA> <E4BA> <922D> <E4BB> <E4BB> <969E> <E4BC> <E4BC> <96A1> <E4BD> <E4BD> <96FF> <E4BE> <E4BE> <9758> <E4BF> <E4BF> <977D> <E4C0> <E4C0> <977A> <E4C1> <E4C1> <977E> <E4C2> <E4C2> <9783> <E4C3> <E4C3> <9780> <E4C4> <E4C4> <9782> <E4C5> <E4C5> <977B> <E4C6> <E4C6> <9784> <E4C7> <E4C7> <9781> <E4C8> <E4C8> <977F> <E4C9> <E4C9> <97CE> <E4CA> <E4CA> <97CD> <E4CB> <E4CB> <9816> <E4CC> <E4CD> <98AD> <E4CE> <E4CE> <9902> <E4CF> <E4CF> <9900> <E4D0> <E4D0> <9907> <E4D1> <E4D1> <999D> <E4D2> <E4D2> <999C> <E4D3> <E4D3> <99C3> <E4D4> <E4D4> <99B9> <E4D5> <E4D5> <99BB> <E4D6> <E4D6> <99BA> endbfrange 100 beginbfrange <E4D7> <E4D7> <99C2> <E4D8> <E4D8> <99BD> <E4D9> <E4D9> <99C7> <E4DA> <E4DA> <9AB1> <E4DB> <E4DB> <9AE3> <E4DC> <E4DC> <9AE7> <E4DD> <E4DE> <9B3E> <E4DF> <E4E0> <9B60> <E4E1> <E4E1> <9B5F> <E4E2> <E4E3> <9CF1> <E4E4> <E4E4> <9CF5> <E4E5> <E4E5> <9EA7> <E4E6> <E4E6> <50FF> <E4E7> <E4E7> <5103> <E4E8> <E4E8> <5130> <E4E9> <E4E9> <50F8> <E4EA> <E4EB> <5106> <E4EC> <E4EC> <50F6> <E4ED> <E4ED> <50FE> <E4EE> <E4EF> <510B> <E4F0> <E4F0> <50FD> <E4F1> <E4F1> <510A> <E4F2> <E4F3> <528B> <E4F4> <E4F4> <52F1> <E4F5> <E4F5> <52EF> <E4F6> <E4F6> <5648> <E4F7> <E4F7> <5642> <E4F8> <E4F8> <564C> <E4F9> <E4F9> <5635> <E4FA> <E4FA> <5641> <E4FB> <E4FB> <564A> <E4FC> <E4FC> <5649> <E4FD> <E4FD> <5646> <E4FE> <E4FE> <5658> <E540> <E540> <565A> <E541> <E541> <5640> <E542> <E542> <5633> <E543> <E543> <563D> <E544> <E544> <562C> <E545> <E545> <563E> <E546> <E546> <5638> <E547> <E547> <562A> <E548> <E548> <563A> <E549> <E549> <571A> <E54A> <E54A> <58AB> <E54B> <E54B> <589D> <E54C> <E54C> <58B1> <E54D> <E54D> <58A0> <E54E> <E54E> <58A3> <E54F> <E54F> <58AF> <E550> <E550> <58AC> <E551> <E551> <58A5> <E552> <E552> <58A1> <E553> <E553> <58FF> <E554> <E554> <5AFF> <E555> <E555> <5AF4> <E556> <E556> <5AFD> <E557> <E557> <5AF7> <E558> <E558> <5AF6> <E559> <E559> <5B03> <E55A> <E55A> <5AF8> <E55B> <E55B> <5B02> <E55C> <E55C> <5AF9> <E55D> <E55D> <5B01> <E55E> <E55E> <5B07> <E55F> <E55F> <5B05> <E560> <E560> <5B0F> <E561> <E561> <5C67> <E562> <E562> <5D99> <E563> <E563> <5D97> <E564> <E564> <5D9F> <E565> <E565> <5D92> <E566> <E566> <5DA2> <E567> <E567> <5D93> <E568> <E568> <5D95> <E569> <E569> <5DA0> <E56A> <E56A> <5D9C> <E56B> <E56B> <5DA1> <E56C> <E56C> <5D9A> <E56D> <E56D> <5D9E> <E56E> <E56E> <5E69> <E56F> <E56F> <5E5D> <E570> <E570> <5E60> <E571> <E571> <5E5C> <E572> <E572> <7DF3> <E573> <E573> <5EDB> <E574> <E574> <5EDE> <E575> <E575> <5EE1> <E576> <E576> <5F49> <E577> <E577> <5FB2> <E578> <E578> <618B> <E579> <E579> <6183> <E57A> <E57A> <6179> <E57B> <E57B> <61B1> <E57C> <E57C> <61B0> <E57D> <E57D> <61A2> <E57E> <E57E> <6189> <E5A1> <E5A1> <619B> <E5A2> <E5A2> <6193> <E5A3> <E5A3> <61AF> endbfrange 100 beginbfrange <E5A4> <E5A4> <61AD> <E5A5> <E5A5> <619F> <E5A6> <E5A6> <6192> <E5A7> <E5A7> <61AA> <E5A8> <E5A8> <61A1> <E5A9> <E5A9> <618D> <E5AA> <E5AA> <6166> <E5AB> <E5AB> <61B3> <E5AC> <E5AC> <622D> <E5AD> <E5AD> <646E> <E5AE> <E5AE> <6470> <E5AF> <E5AF> <6496> <E5B0> <E5B0> <64A0> <E5B1> <E5B1> <6485> <E5B2> <E5B2> <6497> <E5B3> <E5B3> <649C> <E5B4> <E5B4> <648F> <E5B5> <E5B5> <648B> <E5B6> <E5B6> <648A> <E5B7> <E5B7> <648C> <E5B8> <E5B8> <64A3> <E5B9> <E5B9> <649F> <E5BA> <E5BA> <6468> <E5BB> <E5BB> <64B1> <E5BC> <E5BC> <6498> <E5BD> <E5BD> <6576> <E5BE> <E5BE> <657A> <E5BF> <E5BF> <6579> <E5C0> <E5C0> <657B> <E5C1> <E5C2> <65B2> <E5C3> <E5C3> <66B5> <E5C4> <E5C4> <66B0> <E5C5> <E5C5> <66A9> <E5C6> <E5C6> <66B2> <E5C7> <E5C7> <66B7> <E5C8> <E5C8> <66AA> <E5C9> <E5C9> <66AF> <E5CA> <E5CA> <6A00> <E5CB> <E5CB> <6A06> <E5CC> <E5CC> <6A17> <E5CD> <E5CD> <69E5> <E5CE> <E5CE> <69F8> <E5CF> <E5CF> <6A15> <E5D0> <E5D0> <69F1> <E5D1> <E5D1> <69E4> <E5D2> <E5D2> <6A20> <E5D3> <E5D3> <69FF> <E5D4> <E5D4> <69EC> <E5D5> <E5D5> <69E2> <E5D6> <E5D6> <6A1B> <E5D7> <E5D7> <6A1D> <E5D8> <E5D8> <69FE> <E5D9> <E5D9> <6A27> <E5DA> <E5DA> <69F2> <E5DB> <E5DB> <69EE> <E5DC> <E5DC> <6A14> <E5DD> <E5DD> <69F7> <E5DE> <E5DE> <69E7> <E5DF> <E5DF> <6A40> <E5E0> <E5E0> <6A08> <E5E1> <E5E1> <69E6> <E5E2> <E5E2> <69FB> <E5E3> <E5E3> <6A0D> <E5E4> <E5E4> <69FC> <E5E5> <E5E5> <69EB> <E5E6> <E5E6> <6A09> <E5E7> <E5E7> <6A04> <E5E8> <E5E8> <6A18> <E5E9> <E5E9> <6A25> <E5EA> <E5EA> <6A0F> <E5EB> <E5EB> <69F6> <E5EC> <E5EC> <6A26> <E5ED> <E5ED> <6A07> <E5EE> <E5EE> <69F4> <E5EF> <E5EF> <6A16> <E5F0> <E5F0> <6B51> <E5F1> <E5F1> <6BA5> <E5F2> <E5F2> <6BA3> <E5F3> <E5F3> <6BA2> <E5F4> <E5F4> <6BA6> <E5F5> <E5F5> <6C01> <E5F6> <E5F6> <6C00> <E5F7> <E5F7> <6BFF> <E5F8> <E5F8> <6C02> <E5F9> <E5F9> <6F41> <E5FA> <E5FA> <6F26> <E5FB> <E5FB> <6F7E> <E5FC> <E5FC> <6F87> <E5FD> <E5FD> <6FC6> <E5FE> <E5FE> <6F92> <E640> <E640> <6F8D> <E641> <E641> <6F89> <E642> <E642> <6F8C> <E643> <E643> <6F62> <E644> <E644> <6F4F> <E645> <E645> <6F85> <E646> <E646> <6F5A> <E647> <E647> <6F96> <E648> <E648> <6F76> <E649> <E649> <6F6C> endbfrange 100 beginbfrange <E64A> <E64A> <6F82> <E64B> <E64B> <6F55> <E64C> <E64C> <6F72> <E64D> <E64D> <6F52> <E64E> <E64E> <6F50> <E64F> <E64F> <6F57> <E650> <E650> <6F94> <E651> <E651> <6F93> <E652> <E652> <6F5D> <E653> <E653> <6F00> <E654> <E654> <6F61> <E655> <E655> <6F6B> <E656> <E656> <6F7D> <E657> <E657> <6F67> <E658> <E658> <6F90> <E659> <E659> <6F53> <E65A> <E65A> <6F8B> <E65B> <E65B> <6F69> <E65C> <E65C> <6F7F> <E65D> <E65D> <6F95> <E65E> <E65E> <6F63> <E65F> <E65F> <6F77> <E660> <E660> <6F6A> <E661> <E661> <6F7B> <E662> <E662> <71B2> <E663> <E663> <71AF> <E664> <E664> <719B> <E665> <E665> <71B0> <E666> <E666> <71A0> <E667> <E667> <719A> <E668> <E668> <71A9> <E669> <E669> <71B5> <E66A> <E66A> <719D> <E66B> <E66B> <71A5> <E66C> <E66C> <719E> <E66D> <E66D> <71A4> <E66E> <E66E> <71A1> <E66F> <E66F> <71AA> <E670> <E670> <719C> <E671> <E671> <71A7> <E672> <E672> <71B3> <E673> <E673> <7298> <E674> <E674> <729A> <E675> <E675> <7358> <E676> <E676> <7352> <E677> <E679> <735E> <E67A> <E67A> <735D> <E67B> <E67B> <735B> <E67C> <E67C> <7361> <E67D> <E67D> <735A> <E67E> <E67E> <7359> <E6A1> <E6A1> <7362> <E6A2> <E6A2> <7487> <E6A3> <E6A4> <7489> <E6A5> <E6A5> <7486> <E6A6> <E6A6> <7481> <E6A7> <E6A7> <747D> <E6A8> <E6A8> <7485> <E6A9> <E6A9> <7488> <E6AA> <E6AA> <747C> <E6AB> <E6AB> <7479> <E6AC> <E6AC> <7508> <E6AD> <E6AD> <7507> <E6AE> <E6AE> <757E> <E6AF> <E6AF> <7625> <E6B0> <E6B0> <761E> <E6B1> <E6B1> <7619> <E6B2> <E6B2> <761D> <E6B3> <E6B3> <761C> <E6B4> <E6B4> <7623> <E6B5> <E6B5> <761A> <E6B6> <E6B6> <7628> <E6B7> <E6B7> <761B> <E6B8> <E6BA> <769C> <E6BB> <E6BB> <769B> <E6BC> <E6BC> <778D> <E6BD> <E6BD> <778F> <E6BE> <E6BE> <7789> <E6BF> <E6BF> <7788> <E6C0> <E6C0> <78CD> <E6C1> <E6C1> <78BB> <E6C2> <E6C2> <78CF> <E6C3> <E6C3> <78CC> <E6C4> <E6C4> <78D1> <E6C5> <E6C5> <78CE> <E6C6> <E6C6> <78D4> <E6C7> <E6C7> <78C8> <E6C8> <E6C9> <78C3> <E6CA> <E6CA> <78C9> <E6CB> <E6CB> <799A> <E6CC> <E6CC> <79A1> <E6CD> <E6CD> <79A0> <E6CE> <E6CE> <799C> <E6CF> <E6CF> <79A2> <E6D0> <E6D0> <799B> <E6D1> <E6D1> <6B76> <E6D2> <E6D2> <7A39> <E6D3> <E6D3> <7AB2> <E6D4> <E6D4> <7AB4> <E6D5> <E6D5> <7AB3> endbfrange 100 beginbfrange <E6D6> <E6D6> <7BB7> <E6D7> <E6D7> <7BCB> <E6D8> <E6D8> <7BBE> <E6D9> <E6D9> <7BAC> <E6DA> <E6DA> <7BCE> <E6DB> <E6DB> <7BAF> <E6DC> <E6DC> <7BB9> <E6DD> <E6DD> <7BCA> <E6DE> <E6DE> <7BB5> <E6DF> <E6DF> <7CC5> <E6E0> <E6E0> <7CC8> <E6E1> <E6E1> <7CCC> <E6E2> <E6E2> <7CCB> <E6E3> <E6E3> <7DF7> <E6E4> <E6E4> <7DDB> <E6E5> <E6E5> <7DEA> <E6E6> <E6E6> <7DE7> <E6E7> <E6E7> <7DD7> <E6E8> <E6E8> <7DE1> <E6E9> <E6E9> <7E03> <E6EA> <E6EA> <7DFA> <E6EB> <E6EB> <7DE6> <E6EC> <E6EC> <7DF6> <E6ED> <E6ED> <7DF1> <E6EE> <E6EE> <7DF0> <E6EF> <E6EF> <7DEE> <E6F0> <E6F0> <7DDF> <E6F1> <E6F1> <7F76> <E6F2> <E6F2> <7FAC> <E6F3> <E6F3> <7FB0> <E6F4> <E6F4> <7FAD> <E6F5> <E6F5> <7FED> <E6F6> <E6F6> <7FEB> <E6F7> <E6F7> <7FEA> <E6F8> <E6F8> <7FEC> <E6F9> <E6F9> <7FE6> <E6FA> <E6FA> <7FE8> <E6FB> <E6FB> <8064> <E6FC> <E6FC> <8067> <E6FD> <E6FD> <81A3> <E6FE> <E6FE> <819F> <E740> <E740> <819E> <E741> <E741> <8195> <E742> <E742> <81A2> <E743> <E743> <8199> <E744> <E744> <8197> <E745> <E745> <8216> <E746> <E746> <824F> <E747> <E747> <8253> <E748> <E748> <8252> <E749> <E749> <8250> <E74A> <E74A> <824E> <E74B> <E74B> <8251> <E74C> <E74C> <8524> <E74D> <E74D> <853B> <E74E> <E74E> <850F> <E74F> <E74F> <8500> <E750> <E750> <8529> <E751> <E751> <850E> <E752> <E752> <8509> <E753> <E753> <850D> <E754> <E754> <851F> <E755> <E755> <850A> <E756> <E756> <8527> <E757> <E757> <851C> <E758> <E758> <84FB> <E759> <E759> <852B> <E75A> <E75A> <84FA> <E75B> <E75B> <8508> <E75C> <E75C> <850C> <E75D> <E75D> <84F4> <E75E> <E75E> <852A> <E75F> <E75F> <84F2> <E760> <E760> <8515> <E761> <E761> <84F7> <E762> <E762> <84EB> <E763> <E763> <84F3> <E764> <E764> <84FC> <E765> <E765> <8512> <E766> <E766> <84EA> <E767> <E767> <84E9> <E768> <E768> <8516> <E769> <E769> <84FE> <E76A> <E76A> <8528> <E76B> <E76B> <851D> <E76C> <E76C> <852E> <E76D> <E76D> <8502> <E76E> <E76E> <84FD> <E76F> <E76F> <851E> <E770> <E770> <84F6> <E771> <E771> <8531> <E772> <E772> <8526> <E773> <E774> <84E7> <E775> <E775> <84F0> <E776> <E776> <84EF> <E777> <E777> <84F9> <E778> <E778> <8518> <E779> <E779> <8520> <E77A> <E77A> <8530> <E77B> <E77B> <850B> endbfrange 100 beginbfrange <E77C> <E77C> <8519> <E77D> <E77D> <852F> <E77E> <E77E> <8662> <E7A1> <E7A1> <8756> <E7A2> <E7A3> <8763> <E7A4> <E7A4> <8777> <E7A5> <E7A5> <87E1> <E7A6> <E7A6> <8773> <E7A7> <E7A7> <8758> <E7A8> <E7A8> <8754> <E7A9> <E7A9> <875B> <E7AA> <E7AA> <8752> <E7AB> <E7AB> <8761> <E7AC> <E7AC> <875A> <E7AD> <E7AD> <8751> <E7AE> <E7AE> <875E> <E7AF> <E7AF> <876D> <E7B0> <E7B0> <876A> <E7B1> <E7B1> <8750> <E7B2> <E7B2> <874E> <E7B3> <E7B3> <875F> <E7B4> <E7B4> <875D> <E7B5> <E7B5> <876F> <E7B6> <E7B6> <876C> <E7B7> <E7B7> <877A> <E7B8> <E7B8> <876E> <E7B9> <E7B9> <875C> <E7BA> <E7BA> <8765> <E7BB> <E7BB> <874F> <E7BC> <E7BC> <877B> <E7BD> <E7BD> <8775> <E7BE> <E7BE> <8762> <E7BF> <E7BF> <8767> <E7C0> <E7C0> <8769> <E7C1> <E7C1> <885A> <E7C2> <E7C2> <8905> <E7C3> <E7C3> <890C> <E7C4> <E7C4> <8914> <E7C5> <E7C5> <890B> <E7C6> <E7C8> <8917> <E7C9> <E7C9> <8906> <E7CA> <E7CA> <8916> <E7CB> <E7CB> <8911> <E7CC> <E7CC> <890E> <E7CD> <E7CD> <8909> <E7CE> <E7CE> <89A2> <E7CF> <E7CF> <89A4> <E7D0> <E7D0> <89A3> <E7D1> <E7D1> <89ED> <E7D2> <E7D2> <89F0> <E7D3> <E7D3> <89EC> <E7D4> <E7D4> <8ACF> <E7D5> <E7D5> <8AC6> <E7D6> <E7D6> <8AB8> <E7D7> <E7D7> <8AD3> <E7D8> <E7D8> <8AD1> <E7D9> <E7DA> <8AD4> <E7DB> <E7DB> <8ABB> <E7DC> <E7DC> <8AD7> <E7DD> <E7DD> <8ABE> <E7DE> <E7DE> <8AC0> <E7DF> <E7DF> <8AC5> <E7E0> <E7E0> <8AD8> <E7E1> <E7E1> <8AC3> <E7E2> <E7E2> <8ABA> <E7E3> <E7E3> <8ABD> <E7E4> <E7E4> <8AD9> <E7E5> <E7E5> <8C3E> <E7E6> <E7E6> <8C4D> <E7E7> <E7E7> <8C8F> <E7E8> <E7E8> <8CE5> <E7E9> <E7E9> <8CDF> <E7EA> <E7EA> <8CD9> <E7EB> <E7EB> <8CE8> <E7EC> <E7EC> <8CDA> <E7ED> <E7ED> <8CDD> <E7EE> <E7EE> <8CE7> <E7EF> <E7EF> <8DA0> <E7F0> <E7F0> <8D9C> <E7F1> <E7F1> <8DA1> <E7F2> <E7F2> <8D9B> <E7F3> <E7F3> <8E20> <E7F4> <E7F4> <8E23> <E7F5> <E7F5> <8E25> <E7F6> <E7F6> <8E24> <E7F7> <E7F7> <8E2E> <E7F8> <E7F8> <8E15> <E7F9> <E7F9> <8E1B> <E7FA> <E7FA> <8E16> <E7FB> <E7FB> <8E11> <E7FC> <E7FC> <8E19> <E7FD> <E7FE> <8E26> <E840> <E840> <8E14> <E841> <E841> <8E12> <E842> <E842> <8E18> <E843> <E843> <8E13> <E844> <E844> <8E1C> <E845> <E845> <8E17> <E846> <E846> <8E1A> <E847> <E847> <8F2C> endbfrange 100 beginbfrange <E848> <E848> <8F24> <E849> <E849> <8F18> <E84A> <E84A> <8F1A> <E84B> <E84B> <8F20> <E84C> <E84C> <8F23> <E84D> <E84E> <8F16> <E84F> <E84F> <9073> <E850> <E850> <9070> <E851> <E851> <906F> <E852> <E852> <9067> <E853> <E853> <906B> <E854> <E854> <912F> <E855> <E855> <912B> <E856> <E857> <9129> <E858> <E858> <9132> <E859> <E859> <9126> <E85A> <E85A> <912E> <E85B> <E85C> <9185> <E85D> <E85D> <918A> <E85E> <E85F> <9181> <E860> <E860> <9184> <E861> <E861> <9180> <E862> <E862> <92D0> <E863> <E864> <92C3> <E865> <E865> <92C0> <E866> <E866> <92D9> <E867> <E867> <92B6> <E868> <E868> <92CF> <E869> <E869> <92F1> <E86A> <E86A> <92DF> <E86B> <E86B> <92D8> <E86C> <E86C> <92E9> <E86D> <E86D> <92D7> <E86E> <E86E> <92DD> <E86F> <E86F> <92CC> <E870> <E870> <92EF> <E871> <E871> <92C2> <E872> <E872> <92E8> <E873> <E873> <92CA> <E874> <E874> <92C8> <E875> <E875> <92CE> <E876> <E876> <92E6> <E877> <E877> <92CD> <E878> <E878> <92D5> <E879> <E879> <92C9> <E87A> <E87A> <92E0> <E87B> <E87B> <92DE> <E87C> <E87C> <92E7> <E87D> <E87D> <92D1> <E87E> <E87E> <92D3> <E8A1> <E8A1> <92B5> <E8A2> <E8A2> <92E1> <E8A3> <E8A3> <92C6> <E8A4> <E8A4> <92B4> <E8A5> <E8A5> <957C> <E8A6> <E8A6> <95AC> <E8A7> <E8A7> <95AB> <E8A8> <E8A8> <95AE> <E8A9> <E8A9> <95B0> <E8AA> <E8AA> <96A4> <E8AB> <E8AB> <96A2> <E8AC> <E8AC> <96D3> <E8AD> <E8AD> <9705> <E8AE> <E8AE> <9708> <E8AF> <E8AF> <9702> <E8B0> <E8B0> <975A> <E8B1> <E8B1> <978A> <E8B2> <E8B2> <978E> <E8B3> <E8B3> <9788> <E8B4> <E8B4> <97D0> <E8B5> <E8B5> <97CF> <E8B6> <E8B6> <981E> <E8B7> <E8B7> <981D> <E8B8> <E8B8> <9826> <E8B9> <E8B9> <9829> <E8BA> <E8BA> <9828> <E8BB> <E8BB> <9820> <E8BC> <E8BC> <981B> <E8BD> <E8BD> <9827> <E8BE> <E8BE> <98B2> <E8BF> <E8BF> <9908> <E8C0> <E8C0> <98FA> <E8C1> <E8C1> <9911> <E8C2> <E8C2> <9914> <E8C3> <E8C4> <9916> <E8C5> <E8C5> <9915> <E8C6> <E8C6> <99DC> <E8C7> <E8C7> <99CD> <E8C8> <E8C8> <99CF> <E8C9> <E8CA> <99D3> <E8CB> <E8CB> <99CE> <E8CC> <E8CC> <99C9> <E8CD> <E8CD> <99D6> <E8CE> <E8CE> <99D8> <E8CF> <E8CF> <99CB> <E8D0> <E8D0> <99D7> <E8D1> <E8D1> <99CC> <E8D2> <E8D2> <9AB3> <E8D3> <E8D3> <9AEC> <E8D4> <E8D4> <9AEB> endbfrange 100 beginbfrange <E8D5> <E8D5> <9AF3> <E8D6> <E8D6> <9AF2> <E8D7> <E8D7> <9AF1> <E8D8> <E8D8> <9B46> <E8D9> <E8D9> <9B43> <E8DA> <E8DA> <9B67> <E8DB> <E8DB> <9B74> <E8DC> <E8DC> <9B71> <E8DD> <E8DD> <9B66> <E8DE> <E8DE> <9B76> <E8DF> <E8DF> <9B75> <E8E0> <E8E0> <9B70> <E8E1> <E8E1> <9B68> <E8E2> <E8E2> <9B64> <E8E3> <E8E3> <9B6C> <E8E4> <E8E4> <9CFC> <E8E5> <E8E5> <9CFA> <E8E6> <E8E6> <9CFD> <E8E7> <E8E7> <9CFF> <E8E8> <E8E8> <9CF7> <E8E9> <E8E9> <9D07> <E8EA> <E8EA> <9D00> <E8EB> <E8EB> <9CF9> <E8EC> <E8EC> <9CFB> <E8ED> <E8ED> <9D08> <E8EE> <E8EE> <9D05> <E8EF> <E8EF> <9D04> <E8F0> <E8F0> <9E83> <E8F1> <E8F1> <9ED3> <E8F2> <E8F3> <9F0F> <E8F4> <E8F4> <511C> <E8F5> <E8F5> <5113> <E8F6> <E8F6> <5117> <E8F7> <E8F7> <511A> <E8F8> <E8F8> <5111> <E8F9> <E8F9> <51DE> <E8FA> <E8FA> <5334> <E8FB> <E8FB> <53E1> <E8FC> <E8FC> <5670> <E8FD> <E8FD> <5660> <E8FE> <E8FE> <566E> <E940> <E940> <5673> <E941> <E941> <5666> <E942> <E942> <5663> <E943> <E943> <566D> <E944> <E944> <5672> <E945> <E945> <565E> <E946> <E946> <5677> <E947> <E947> <571C> <E948> <E948> <571B> <E949> <E949> <58C8> <E94A> <E94A> <58BD> <E94B> <E94B> <58C9> <E94C> <E94C> <58BF> <E94D> <E94D> <58BA> <E94E> <E94E> <58C2> <E94F> <E94F> <58BC> <E950> <E950> <58C6> <E951> <E951> <5B17> <E952> <E952> <5B19> <E953> <E953> <5B1B> <E954> <E954> <5B21> <E955> <E955> <5B14> <E956> <E956> <5B13> <E957> <E957> <5B10> <E958> <E958> <5B16> <E959> <E959> <5B28> <E95A> <E95A> <5B1A> <E95B> <E95B> <5B20> <E95C> <E95C> <5B1E> <E95D> <E95D> <5BEF> <E95E> <E95E> <5DAC> <E95F> <E95F> <5DB1> <E960> <E960> <5DA9> <E961> <E961> <5DA7> <E962> <E962> <5DB5> <E963> <E963> <5DB0> <E964> <E964> <5DAE> <E965> <E965> <5DAA> <E966> <E966> <5DA8> <E967> <E967> <5DB2> <E968> <E968> <5DAD> <E969> <E969> <5DAF> <E96A> <E96A> <5DB4> <E96B> <E96C> <5E67> <E96D> <E96D> <5E66> <E96E> <E96E> <5E6F> <E96F> <E96F> <5EE9> <E970> <E970> <5EE7> <E971> <E971> <5EE6> <E972> <E972> <5EE8> <E973> <E973> <5EE5> <E974> <E974> <5F4B> <E975> <E975> <5FBC> <E976> <E976> <619D> <E977> <E977> <61A8> <E978> <E978> <6196> <E979> <E979> <61C5> <E97A> <E97A> <61B4> <E97B> <E97B> <61C6> endbfrange 100 beginbfrange <E97C> <E97C> <61C1> <E97D> <E97D> <61CC> <E97E> <E97E> <61BA> <E9A1> <E9A1> <61BF> <E9A2> <E9A2> <61B8> <E9A3> <E9A3> <618C> <E9A4> <E9A4> <64D7> <E9A5> <E9A5> <64D6> <E9A6> <E9A6> <64D0> <E9A7> <E9A7> <64CF> <E9A8> <E9A8> <64C9> <E9A9> <E9A9> <64BD> <E9AA> <E9AA> <6489> <E9AB> <E9AB> <64C3> <E9AC> <E9AC> <64DB> <E9AD> <E9AD> <64F3> <E9AE> <E9AE> <64D9> <E9AF> <E9AF> <6533> <E9B0> <E9B0> <657F> <E9B1> <E9B1> <657C> <E9B2> <E9B2> <65A2> <E9B3> <E9B3> <66C8> <E9B4> <E9B4> <66BE> <E9B5> <E9B5> <66C0> <E9B6> <E9B7> <66CA> <E9B8> <E9B8> <66CF> <E9B9> <E9B9> <66BD> <E9BA> <E9BA> <66BB> <E9BB> <E9BB> <66BA> <E9BC> <E9BC> <66CC> <E9BD> <E9BD> <6723> <E9BE> <E9BE> <6A34> <E9BF> <E9BF> <6A66> <E9C0> <E9C0> <6A49> <E9C1> <E9C1> <6A67> <E9C2> <E9C2> <6A32> <E9C3> <E9C3> <6A68> <E9C4> <E9C4> <6A3E> <E9C5> <E9C5> <6A5D> <E9C6> <E9C6> <6A6D> <E9C7> <E9C7> <6A76> <E9C8> <E9C8> <6A5B> <E9C9> <E9C9> <6A51> <E9CA> <E9CA> <6A28> <E9CB> <E9CB> <6A5A> <E9CC> <E9CC> <6A3B> <E9CD> <E9CD> <6A3F> <E9CE> <E9CE> <6A41> <E9CF> <E9CF> <6A6A> <E9D0> <E9D0> <6A64> <E9D1> <E9D1> <6A50> <E9D2> <E9D2> <6A4F> <E9D3> <E9D3> <6A54> <E9D4> <E9D4> <6A6F> <E9D5> <E9D5> <6A69> <E9D6> <E9D6> <6A60> <E9D7> <E9D7> <6A3C> <E9D8> <E9D8> <6A5E> <E9D9> <E9D9> <6A56> <E9DA> <E9DA> <6A55> <E9DB> <E9DC> <6A4D> <E9DD> <E9DD> <6A46> <E9DE> <E9DE> <6B55> <E9DF> <E9DF> <6B54> <E9E0> <E9E0> <6B56> <E9E1> <E9E1> <6BA7> <E9E2> <E9E3> <6BAA> <E9E4> <E9E4> <6BC8> <E9E5> <E9E5> <6BC7> <E9E6> <E9E6> <6C04> <E9E7> <E9E7> <6C03> <E9E8> <E9E8> <6C06> <E9E9> <E9E9> <6FAD> <E9EA> <E9EA> <6FCB> <E9EB> <E9EB> <6FA3> <E9EC> <E9EC> <6FC7> <E9ED> <E9ED> <6FBC> <E9EE> <E9EE> <6FCE> <E9EF> <E9EF> <6FC8> <E9F0> <E9F0> <6F5E> <E9F1> <E9F1> <6FC4> <E9F2> <E9F2> <6FBD> <E9F3> <E9F3> <6F9E> <E9F4> <E9F4> <6FCA> <E9F5> <E9F5> <6FA8> <E9F6> <E9F6> <7004> <E9F7> <E9F7> <6FA5> <E9F8> <E9F8> <6FAE> <E9F9> <E9F9> <6FBA> <E9FA> <E9FA> <6FAC> <E9FB> <E9FB> <6FAA> <E9FC> <E9FC> <6FCF> <E9FD> <E9FD> <6FBF> <E9FE> <E9FE> <6FB8> <EA40> <EA40> <6FA2> <EA41> <EA41> <6FC9> <EA42> <EA42> <6FAB> <EA43> <EA43> <6FCD> <EA44> <EA44> <6FAF> <EA45> <EA45> <6FB2> endbfrange 100 beginbfrange <EA46> <EA46> <6FB0> <EA47> <EA47> <71C5> <EA48> <EA48> <71C2> <EA49> <EA49> <71BF> <EA4A> <EA4A> <71B8> <EA4B> <EA4B> <71D6> <EA4C> <EA4D> <71C0> <EA4E> <EA4E> <71CB> <EA4F> <EA4F> <71D4> <EA50> <EA50> <71CA> <EA51> <EA51> <71C7> <EA52> <EA52> <71CF> <EA53> <EA53> <71BD> <EA54> <EA54> <71D8> <EA55> <EA55> <71BC> <EA56> <EA56> <71C6> <EA57> <EA58> <71DA> <EA59> <EA5A> <729D> <EA5B> <EA5B> <7369> <EA5C> <EA5D> <7366> <EA5E> <EA5E> <736C> <EA5F> <EA5F> <7365> <EA60> <EA60> <736B> <EA61> <EA61> <736A> <EA62> <EA62> <747F> <EA63> <EA63> <749A> <EA64> <EA64> <74A0> <EA65> <EA65> <7494> <EA66> <EA66> <7492> <EA67> <EA67> <7495> <EA68> <EA68> <74A1> <EA69> <EA69> <750B> <EA6A> <EA6A> <7580> <EA6B> <EA6B> <762F> <EA6C> <EA6C> <762D> <EA6D> <EA6D> <7631> <EA6E> <EA6E> <763D> <EA6F> <EA6F> <7633> <EA70> <EA70> <763C> <EA71> <EA71> <7635> <EA72> <EA72> <7632> <EA73> <EA73> <7630> <EA74> <EA74> <76BB> <EA75> <EA75> <76E6> <EA76> <EA76> <779A> <EA77> <EA77> <779D> <EA78> <EA78> <77A1> <EA79> <EA79> <779C> <EA7A> <EA7A> <779B> <EA7B> <EA7C> <77A2> <EA7D> <EA7D> <7795> <EA7E> <EA7E> <7799> <EAA1> <EAA1> <7797> <EAA2> <EAA2> <78DD> <EAA3> <EAA3> <78E9> <EAA4> <EAA4> <78E5> <EAA5> <EAA5> <78EA> <EAA6> <EAA6> <78DE> <EAA7> <EAA7> <78E3> <EAA8> <EAA8> <78DB> <EAA9> <EAAA> <78E1> <EAAB> <EAAB> <78ED> <EAAC> <EAAD> <78DF> <EAAE> <EAAE> <79A4> <EAAF> <EAAF> <7A44> <EAB0> <EAB0> <7A48> <EAB1> <EAB1> <7A47> <EAB2> <EAB2> <7AB6> <EAB3> <EAB3> <7AB8> <EAB4> <EAB4> <7AB5> <EAB5> <EAB5> <7AB1> <EAB6> <EAB6> <7AB7> <EAB7> <EAB7> <7BDE> <EAB8> <EAB8> <7BE3> <EAB9> <EAB9> <7BE7> <EABA> <EABA> <7BDD> <EABB> <EABB> <7BD5> <EABC> <EABC> <7BE5> <EABD> <EABD> <7BDA> <EABE> <EABE> <7BE8> <EABF> <EABF> <7BF9> <EAC0> <EAC0> <7BD4> <EAC1> <EAC1> <7BEA> <EAC2> <EAC2> <7BE2> <EAC3> <EAC3> <7BDC> <EAC4> <EAC4> <7BEB> <EAC5> <EAC5> <7BD8> <EAC6> <EAC6> <7BDF> <EAC7> <EAC7> <7CD2> <EAC8> <EAC8> <7CD4> <EAC9> <EAC9> <7CD7> <EACA> <EACB> <7CD0> <EACC> <EACC> <7E12> <EACD> <EACD> <7E21> <EACE> <EACE> <7E17> <EACF> <EACF> <7E0C> <EAD0> <EAD1> <7E1F> <EAD2> <EAD2> <7E13> <EAD3> <EAD3> <7E0E> <EAD4> <EAD4> <7E1C> endbfrange 100 beginbfrange <EAD5> <EAD5> <7E15> <EAD6> <EAD6> <7E1A> <EAD7> <EAD7> <7E22> <EAD8> <EAD8> <7E0B> <EAD9> <EAD9> <7E0F> <EADA> <EADA> <7E16> <EADB> <EADB> <7E0D> <EADC> <EADC> <7E14> <EADD> <EADD> <7E25> <EADE> <EADE> <7E24> <EADF> <EADF> <7F43> <EAE0> <EAE1> <7F7B> <EAE2> <EAE2> <7F7A> <EAE3> <EAE3> <7FB1> <EAE4> <EAE4> <7FEF> <EAE5> <EAE5> <802A> <EAE6> <EAE6> <8029> <EAE7> <EAE7> <806C> <EAE8> <EAE8> <81B1> <EAE9> <EAE9> <81A6> <EAEA> <EAEA> <81AE> <EAEB> <EAEB> <81B9> <EAEC> <EAEC> <81B5> <EAED> <EAED> <81AB> <EAEE> <EAEE> <81B0> <EAEF> <EAEF> <81AC> <EAF0> <EAF0> <81B4> <EAF1> <EAF1> <81B2> <EAF2> <EAF2> <81B7> <EAF3> <EAF3> <81A7> <EAF4> <EAF4> <81F2> <EAF5> <EAF7> <8255> <EAF8> <EAF8> <8556> <EAF9> <EAF9> <8545> <EAFA> <EAFA> <856B> <EAFB> <EAFB> <854D> <EAFC> <EAFC> <8553> <EAFD> <EAFD> <8561> <EAFE> <EAFE> <8558> <EB40> <EB40> <8540> <EB41> <EB41> <8546> <EB42> <EB42> <8564> <EB43> <EB43> <8541> <EB44> <EB44> <8562> <EB45> <EB45> <8544> <EB46> <EB46> <8551> <EB47> <EB47> <8547> <EB48> <EB48> <8563> <EB49> <EB49> <853E> <EB4A> <EB4A> <855B> <EB4B> <EB4B> <8571> <EB4C> <EB4C> <854E> <EB4D> <EB4D> <856E> <EB4E> <EB4E> <8575> <EB4F> <EB4F> <8555> <EB50> <EB50> <8567> <EB51> <EB51> <8560> <EB52> <EB52> <858C> <EB53> <EB53> <8566> <EB54> <EB54> <855D> <EB55> <EB55> <8554> <EB56> <EB56> <8565> <EB57> <EB57> <856C> <EB58> <EB58> <8663> <EB59> <EB59> <8665> <EB5A> <EB5A> <8664> <EB5B> <EB5B> <879B> <EB5C> <EB5C> <878F> <EB5D> <EB5D> <8797> <EB5E> <EB5E> <8793> <EB5F> <EB5F> <8792> <EB60> <EB60> <8788> <EB61> <EB61> <8781> <EB62> <EB62> <8796> <EB63> <EB63> <8798> <EB64> <EB64> <8779> <EB65> <EB65> <8787> <EB66> <EB66> <87A3> <EB67> <EB67> <8785> <EB68> <EB69> <8790> <EB6A> <EB6A> <879D> <EB6B> <EB6B> <8784> <EB6C> <EB6C> <8794> <EB6D> <EB6D> <879C> <EB6E> <EB6E> <879A> <EB6F> <EB6F> <8789> <EB70> <EB70> <891E> <EB71> <EB71> <8926> <EB72> <EB72> <8930> <EB73> <EB74> <892D> <EB75> <EB75> <8927> <EB76> <EB76> <8931> <EB77> <EB77> <8922> <EB78> <EB78> <8929> <EB79> <EB79> <8923> <EB7A> <EB7A> <892F> <EB7B> <EB7B> <892C> <EB7C> <EB7C> <891F> <EB7D> <EB7D> <89F1> <EB7E> <EB7E> <8AE0> endbfrange 100 beginbfrange <EBA1> <EBA1> <8AE2> <EBA2> <EBA2> <8AF2> <EBA3> <EBA4> <8AF4> <EBA5> <EBA5> <8ADD> <EBA6> <EBA6> <8B14> <EBA7> <EBA7> <8AE4> <EBA8> <EBA8> <8ADF> <EBA9> <EBA9> <8AF0> <EBAA> <EBAA> <8AC8> <EBAB> <EBAB> <8ADE> <EBAC> <EBAC> <8AE1> <EBAD> <EBAD> <8AE8> <EBAE> <EBAE> <8AFF> <EBAF> <EBAF> <8AEF> <EBB0> <EBB0> <8AFB> <EBB1> <EBB2> <8C91> <EBB3> <EBB3> <8C90> <EBB4> <EBB4> <8CF5> <EBB5> <EBB5> <8CEE> <EBB6> <EBB6> <8CF1> <EBB7> <EBB7> <8CF0> <EBB8> <EBB8> <8CF3> <EBB9> <EBB9> <8D6C> <EBBA> <EBBA> <8D6E> <EBBB> <EBBB> <8DA5> <EBBC> <EBBC> <8DA7> <EBBD> <EBBD> <8E33> <EBBE> <EBBE> <8E3E> <EBBF> <EBBF> <8E38> <EBC0> <EBC0> <8E40> <EBC1> <EBC1> <8E45> <EBC2> <EBC2> <8E36> <EBC3> <EBC4> <8E3C> <EBC5> <EBC5> <8E41> <EBC6> <EBC6> <8E30> <EBC7> <EBC7> <8E3F> <EBC8> <EBC8> <8EBD> <EBC9> <EBC9> <8F36> <EBCA> <EBCA> <8F2E> <EBCB> <EBCB> <8F35> <EBCC> <EBCC> <8F32> <EBCD> <EBCD> <8F39> <EBCE> <EBCE> <8F37> <EBCF> <EBCF> <8F34> <EBD0> <EBD0> <9076> <EBD1> <EBD1> <9079> <EBD2> <EBD2> <907B> <EBD3> <EBD3> <9086> <EBD4> <EBD4> <90FA> <EBD5> <EBD5> <9133> <EBD6> <EBD7> <9135> <EBD8> <EBD8> <9193> <EBD9> <EBDA> <9190> <EBDB> <EBDB> <918D> <EBDC> <EBDC> <918F> <EBDD> <EBDD> <9327> <EBDE> <EBDE> <931E> <EBDF> <EBDF> <9308> <EBE0> <EBE0> <931F> <EBE1> <EBE1> <9306> <EBE2> <EBE2> <930F> <EBE3> <EBE3> <937A> <EBE4> <EBE4> <9338> <EBE5> <EBE5> <933C> <EBE6> <EBE6> <931B> <EBE7> <EBE7> <9323> <EBE8> <EBE8> <9312> <EBE9> <EBE9> <9301> <EBEA> <EBEA> <9346> <EBEB> <EBEB> <932D> <EBEC> <EBEC> <930E> <EBED> <EBED> <930D> <EBEE> <EBEE> <92CB> <EBEF> <EBEF> <931D> <EBF0> <EBF0> <92FA> <EBF1> <EBF1> <9325> <EBF2> <EBF2> <9313> <EBF3> <EBF3> <92F9> <EBF4> <EBF4> <92F7> <EBF5> <EBF5> <9334> <EBF6> <EBF6> <9302> <EBF7> <EBF7> <9324> <EBF8> <EBF8> <92FF> <EBF9> <EBF9> <9329> <EBFA> <EBFA> <9339> <EBFB> <EBFB> <9335> <EBFC> <EBFC> <932A> <EBFD> <EBFD> <9314> <EBFE> <EBFE> <930C> <EC40> <EC40> <930B> <EC41> <EC41> <92FE> <EC42> <EC42> <9309> <EC43> <EC43> <9300> <EC44> <EC44> <92FB> <EC45> <EC45> <9316> <EC46> <EC46> <95BC> <EC47> <EC47> <95CD> <EC48> <EC48> <95BE> <EC49> <EC4A> <95B9> <EC4B> <EC4B> <95B6> endbfrange 100 beginbfrange <EC4C> <EC4C> <95BF> <EC4D> <EC4D> <95B5> <EC4E> <EC4E> <95BD> <EC4F> <EC4F> <96A9> <EC50> <EC50> <96D4> <EC51> <EC51> <970B> <EC52> <EC52> <9712> <EC53> <EC53> <9710> <EC54> <EC54> <9799> <EC55> <EC55> <9797> <EC56> <EC56> <9794> <EC57> <EC57> <97F0> <EC58> <EC58> <97F8> <EC59> <EC59> <9835> <EC5A> <EC5A> <982F> <EC5B> <EC5B> <9832> <EC5C> <EC5C> <9924> <EC5D> <EC5D> <991F> <EC5E> <EC5E> <9927> <EC5F> <EC5F> <9929> <EC60> <EC60> <999E> <EC61> <EC61> <99EE> <EC62> <EC62> <99EC> <EC63> <EC63> <99E5> <EC64> <EC64> <99E4> <EC65> <EC65> <99F0> <EC66> <EC66> <99E3> <EC67> <EC67> <99EA> <EC68> <EC68> <99E9> <EC69> <EC69> <99E7> <EC6A> <EC6A> <9AB9> <EC6B> <EC6B> <9ABF> <EC6C> <EC6C> <9AB4> <EC6D> <EC6D> <9ABB> <EC6E> <EC6E> <9AF6> <EC6F> <EC6F> <9AFA> <EC70> <EC70> <9AF9> <EC71> <EC71> <9AF7> <EC72> <EC72> <9B33> <EC73> <EC73> <9B80> <EC74> <EC74> <9B85> <EC75> <EC75> <9B87> <EC76> <EC76> <9B7C> <EC77> <EC77> <9B7E> <EC78> <EC78> <9B7B> <EC79> <EC79> <9B82> <EC7A> <EC7A> <9B93> <EC7B> <EC7B> <9B92> <EC7C> <EC7C> <9B90> <EC7D> <EC7D> <9B7A> <EC7E> <EC7E> <9B95> <ECA1> <ECA1> <9B7D> <ECA2> <ECA2> <9B88> <ECA3> <ECA3> <9D25> <ECA4> <ECA4> <9D17> <ECA5> <ECA5> <9D20> <ECA6> <ECA6> <9D1E> <ECA7> <ECA7> <9D14> <ECA8> <ECA8> <9D29> <ECA9> <ECA9> <9D1D> <ECAA> <ECAA> <9D18> <ECAB> <ECAB> <9D22> <ECAC> <ECAC> <9D10> <ECAD> <ECAD> <9D19> <ECAE> <ECAE> <9D1F> <ECAF> <ECAF> <9E88> <ECB0> <ECB1> <9E86> <ECB2> <ECB2> <9EAE> <ECB3> <ECB3> <9EAD> <ECB4> <ECB5> <9ED5> <ECB6> <ECB6> <9EFA> <ECB7> <ECB7> <9F12> <ECB8> <ECB8> <9F3D> <ECB9> <ECB9> <5126> <ECBA> <ECBA> <5125> <ECBB> <ECBB> <5122> <ECBC> <ECBC> <5124> <ECBD> <ECBD> <5120> <ECBE> <ECBE> <5129> <ECBF> <ECBF> <52F4> <ECC0> <ECC0> <5693> <ECC1> <ECC2> <568C> <ECC3> <ECC3> <5686> <ECC4> <ECC4> <5684> <ECC5> <ECC5> <5683> <ECC6> <ECC6> <567E> <ECC7> <ECC7> <5682> <ECC8> <ECC8> <567F> <ECC9> <ECC9> <5681> <ECCA> <ECCA> <58D6> <ECCB> <ECCB> <58D4> <ECCC> <ECCC> <58CF> <ECCD> <ECCD> <58D2> <ECCE> <ECCE> <5B2D> <ECCF> <ECCF> <5B25> <ECD0> <ECD0> <5B32> <ECD1> <ECD1> <5B23> <ECD2> <ECD2> <5B2C> <ECD3> <ECD3> <5B27> <ECD4> <ECD4> <5B26> endbfrange 100 beginbfrange <ECD5> <ECD5> <5B2F> <ECD6> <ECD6> <5B2E> <ECD7> <ECD7> <5B7B> <ECD8> <ECD9> <5BF1> <ECDA> <ECDA> <5DB7> <ECDB> <ECDB> <5E6C> <ECDC> <ECDC> <5E6A> <ECDD> <ECDD> <5FBE> <ECDE> <ECDE> <5FBB> <ECDF> <ECDF> <61C3> <ECE0> <ECE0> <61B5> <ECE1> <ECE1> <61BC> <ECE2> <ECE2> <61E7> <ECE3> <ECE3> <61E0> <ECE4> <ECE4> <61E5> <ECE5> <ECE5> <61E4> <ECE6> <ECE6> <61E8> <ECE7> <ECE7> <61DE> <ECE8> <ECE8> <64EF> <ECE9> <ECE9> <64E9> <ECEA> <ECEA> <64E3> <ECEB> <ECEB> <64EB> <ECEC> <ECEC> <64E4> <ECED> <ECED> <64E8> <ECEE> <ECEE> <6581> <ECEF> <ECEF> <6580> <ECF0> <ECF0> <65B6> <ECF1> <ECF1> <65DA> <ECF2> <ECF2> <66D2> <ECF3> <ECF3> <6A8D> <ECF4> <ECF4> <6A96> <ECF5> <ECF5> <6A81> <ECF6> <ECF6> <6AA5> <ECF7> <ECF7> <6A89> <ECF8> <ECF8> <6A9F> <ECF9> <ECF9> <6A9B> <ECFA> <ECFA> <6AA1> <ECFB> <ECFB> <6A9E> <ECFC> <ECFC> <6A87> <ECFD> <ECFD> <6A93> <ECFE> <ECFE> <6A8E> <ED40> <ED40> <6A95> <ED41> <ED41> <6A83> <ED42> <ED42> <6AA8> <ED43> <ED43> <6AA4> <ED44> <ED44> <6A91> <ED45> <ED45> <6A7F> <ED46> <ED46> <6AA6> <ED47> <ED47> <6A9A> <ED48> <ED48> <6A85> <ED49> <ED49> <6A8C> <ED4A> <ED4A> <6A92> <ED4B> <ED4B> <6B5B> <ED4C> <ED4C> <6BAD> <ED4D> <ED4D> <6C09> <ED4E> <ED4E> <6FCC> <ED4F> <ED4F> <6FA9> <ED50> <ED50> <6FF4> <ED51> <ED51> <6FD4> <ED52> <ED52> <6FE3> <ED53> <ED53> <6FDC> <ED54> <ED54> <6FED> <ED55> <ED55> <6FE7> <ED56> <ED56> <6FE6> <ED57> <ED57> <6FDE> <ED58> <ED58> <6FF2> <ED59> <ED59> <6FDD> <ED5A> <ED5A> <6FE2> <ED5B> <ED5B> <6FE8> <ED5C> <ED5C> <71E1> <ED5D> <ED5D> <71F1> <ED5E> <ED5E> <71E8> <ED5F> <ED5F> <71F2> <ED60> <ED60> <71E4> <ED61> <ED61> <71F0> <ED62> <ED62> <71E2> <ED63> <ED63> <7373> <ED64> <ED65> <736E> <ED66> <ED66> <7497> <ED67> <ED67> <74B2> <ED68> <ED68> <74AB> <ED69> <ED69> <7490> <ED6A> <ED6A> <74AA> <ED6B> <ED6B> <74AD> <ED6C> <ED6C> <74B1> <ED6D> <ED6D> <74A5> <ED6E> <ED6E> <74AF> <ED6F> <ED71> <7510> <ED72> <ED72> <750F> <ED73> <ED73> <7584> <ED74> <ED74> <7643> <ED75> <ED76> <7648> <ED77> <ED77> <7647> <ED78> <ED78> <76A4> <ED79> <ED79> <76E9> <ED7A> <ED7A> <77B5> <ED7B> <ED7B> <77AB> <ED7C> <ED7C> <77B2> <ED7D> <ED7D> <77B7> <ED7E> <ED7E> <77B6> endbfrange 100 beginbfrange <EDA1> <EDA1> <77B4> <EDA2> <EDA2> <77B1> <EDA3> <EDA3> <77A8> <EDA4> <EDA4> <77F0> <EDA5> <EDA5> <78F3> <EDA6> <EDA6> <78FD> <EDA7> <EDA7> <7902> <EDA8> <EDA9> <78FB> <EDAA> <EDAA> <78F2> <EDAB> <EDAB> <7905> <EDAC> <EDAC> <78F9> <EDAD> <EDAD> <78FE> <EDAE> <EDAE> <7904> <EDAF> <EDAF> <79AB> <EDB0> <EDB0> <79A8> <EDB1> <EDB1> <7A5C> <EDB2> <EDB2> <7A5B> <EDB3> <EDB3> <7A56> <EDB4> <EDB4> <7A58> <EDB5> <EDB5> <7A54> <EDB6> <EDB6> <7A5A> <EDB7> <EDB7> <7ABE> <EDB8> <EDB9> <7AC0> <EDBA> <EDBA> <7C05> <EDBB> <EDBB> <7C0F> <EDBC> <EDBC> <7BF2> <EDBD> <EDBD> <7C00> <EDBE> <EDBE> <7BFF> <EDBF> <EDBF> <7BFB> <EDC0> <EDC0> <7C0E> <EDC1> <EDC1> <7BF4> <EDC2> <EDC2> <7C0B> <EDC3> <EDC3> <7BF3> <EDC4> <EDC4> <7C02> <EDC5> <EDC5> <7C09> <EDC6> <EDC6> <7C03> <EDC7> <EDC7> <7C01> <EDC8> <EDC8> <7BF8> <EDC9> <EDC9> <7BFD> <EDCA> <EDCA> <7C06> <EDCB> <EDCC> <7BF0> <EDCD> <EDCD> <7C10> <EDCE> <EDCE> <7C0A> <EDCF> <EDCF> <7CE8> <EDD0> <EDD0> <7E2D> <EDD1> <EDD1> <7E3C> <EDD2> <EDD2> <7E42> <EDD3> <EDD3> <7E33> <EDD4> <EDD4> <9848> <EDD5> <EDD5> <7E38> <EDD6> <EDD6> <7E2A> <EDD7> <EDD7> <7E49> <EDD8> <EDD8> <7E40> <EDD9> <EDD9> <7E47> <EDDA> <EDDA> <7E29> <EDDB> <EDDB> <7E4C> <EDDC> <EDDC> <7E30> <EDDD> <EDDD> <7E3B> <EDDE> <EDDE> <7E36> <EDDF> <EDDF> <7E44> <EDE0> <EDE0> <7E3A> <EDE1> <EDE1> <7F45> <EDE2> <EDE2> <7F7F> <EDE3> <EDE3> <7F7E> <EDE4> <EDE4> <7F7D> <EDE5> <EDE5> <7FF4> <EDE6> <EDE6> <7FF2> <EDE7> <EDE7> <802C> <EDE8> <EDE8> <81BB> <EDE9> <EDE9> <81C4> <EDEA> <EDEA> <81CC> <EDEB> <EDEB> <81CA> <EDEC> <EDEC> <81C5> <EDED> <EDED> <81C7> <EDEE> <EDEE> <81BC> <EDEF> <EDEF> <81E9> <EDF0> <EDF0> <825B> <EDF1> <EDF1> <825A> <EDF2> <EDF2> <825C> <EDF3> <EDF3> <8583> <EDF4> <EDF4> <8580> <EDF5> <EDF5> <858F> <EDF6> <EDF6> <85A7> <EDF7> <EDF7> <8595> <EDF8> <EDF8> <85A0> <EDF9> <EDF9> <858B> <EDFA> <EDFA> <85A3> <EDFB> <EDFB> <857B> <EDFC> <EDFC> <85A4> <EDFD> <EDFD> <859A> <EDFE> <EDFE> <859E> <EE40> <EE40> <8577> <EE41> <EE41> <857C> <EE42> <EE42> <8589> <EE43> <EE43> <85A1> <EE44> <EE44> <857A> <EE45> <EE45> <8578> <EE46> <EE46> <8557> <EE47> <EE47> <858E> <EE48> <EE48> <8596> endbfrange 100 beginbfrange <EE49> <EE49> <8586> <EE4A> <EE4A> <858D> <EE4B> <EE4B> <8599> <EE4C> <EE4C> <859D> <EE4D> <EE4D> <8581> <EE4E> <EE4E> <85A2> <EE4F> <EE4F> <8582> <EE50> <EE50> <8588> <EE51> <EE51> <8585> <EE52> <EE52> <8579> <EE53> <EE53> <8576> <EE54> <EE54> <8598> <EE55> <EE55> <8590> <EE56> <EE56> <859F> <EE57> <EE57> <8668> <EE58> <EE58> <87BE> <EE59> <EE59> <87AA> <EE5A> <EE5A> <87AD> <EE5B> <EE5B> <87C5> <EE5C> <EE5C> <87B0> <EE5D> <EE5D> <87AC> <EE5E> <EE5E> <87B9> <EE5F> <EE5F> <87B5> <EE60> <EE60> <87BC> <EE61> <EE61> <87AE> <EE62> <EE62> <87C9> <EE63> <EE63> <87C3> <EE64> <EE64> <87C2> <EE65> <EE65> <87CC> <EE66> <EE66> <87B7> <EE67> <EE67> <87AF> <EE68> <EE68> <87C4> <EE69> <EE69> <87CA> <EE6A> <EE6A> <87B4> <EE6B> <EE6B> <87B6> <EE6C> <EE6C> <87BF> <EE6D> <EE6D> <87B8> <EE6E> <EE6E> <87BD> <EE6F> <EE6F> <87DE> <EE70> <EE70> <87B2> <EE71> <EE71> <8935> <EE72> <EE72> <8933> <EE73> <EE73> <893C> <EE74> <EE74> <893E> <EE75> <EE75> <8941> <EE76> <EE76> <8952> <EE77> <EE77> <8937> <EE78> <EE78> <8942> <EE79> <EE79> <89AD> <EE7A> <EE7A> <89AF> <EE7B> <EE7B> <89AE> <EE7C> <EE7D> <89F2> <EE7E> <EE7E> <8B1E> <EEA1> <EEA1> <8B18> <EEA2> <EEA2> <8B16> <EEA3> <EEA3> <8B11> <EEA4> <EEA4> <8B05> <EEA5> <EEA5> <8B0B> <EEA6> <EEA6> <8B22> <EEA7> <EEA7> <8B0F> <EEA8> <EEA8> <8B12> <EEA9> <EEA9> <8B15> <EEAA> <EEAA> <8B07> <EEAB> <EEAB> <8B0D> <EEAC> <EEAC> <8B08> <EEAD> <EEAD> <8B06> <EEAE> <EEAE> <8B1C> <EEAF> <EEAF> <8B13> <EEB0> <EEB0> <8B1A> <EEB1> <EEB1> <8C4F> <EEB2> <EEB2> <8C70> <EEB3> <EEB3> <8C72> <EEB4> <EEB4> <8C71> <EEB5> <EEB5> <8C6F> <EEB6> <EEB6> <8C95> <EEB7> <EEB7> <8C94> <EEB8> <EEB8> <8CF9> <EEB9> <EEB9> <8D6F> <EEBA> <EEBA> <8E4E> <EEBB> <EEBB> <8E4D> <EEBC> <EEBC> <8E53> <EEBD> <EEBD> <8E50> <EEBE> <EEBE> <8E4C> <EEBF> <EEBF> <8E47> <EEC0> <EEC0> <8F43> <EEC1> <EEC1> <8F40> <EEC2> <EEC2> <9085> <EEC3> <EEC3> <907E> <EEC4> <EEC4> <9138> <EEC5> <EEC5> <919A> <EEC6> <EEC6> <91A2> <EEC7> <EEC7> <919B> <EEC8> <EEC8> <9199> <EEC9> <EEC9> <919F> <EECA> <EECA> <91A1> <EECB> <EECB> <919D> <EECC> <EECC> <91A0> <EECD> <EECD> <93A1> <EECE> <EECE> <9383> <EECF> <EECF> <93AF> endbfrange 100 beginbfrange <EED0> <EED0> <9364> <EED1> <EED1> <9356> <EED2> <EED2> <9347> <EED3> <EED3> <937C> <EED4> <EED4> <9358> <EED5> <EED5> <935C> <EED6> <EED6> <9376> <EED7> <EED7> <9349> <EED8> <EED9> <9350> <EEDA> <EEDA> <9360> <EEDB> <EEDB> <936D> <EEDC> <EEDC> <938F> <EEDD> <EEDD> <934C> <EEDE> <EEDE> <936A> <EEDF> <EEDF> <9379> <EEE0> <EEE0> <9357> <EEE1> <EEE1> <9355> <EEE2> <EEE2> <9352> <EEE3> <EEE3> <934F> <EEE4> <EEE4> <9371> <EEE5> <EEE5> <9377> <EEE6> <EEE6> <937B> <EEE7> <EEE7> <9361> <EEE8> <EEE8> <935E> <EEE9> <EEE9> <9363> <EEEA> <EEEA> <9367> <EEEB> <EEEB> <9380> <EEEC> <EEEC> <934E> <EEED> <EEED> <9359> <EEEE> <EEEE> <95C7> <EEEF> <EEEF> <95C0> <EEF0> <EEF0> <95C9> <EEF1> <EEF1> <95C3> <EEF2> <EEF2> <95C5> <EEF3> <EEF3> <95B7> <EEF4> <EEF4> <96AE> <EEF5> <EEF5> <96B0> <EEF6> <EEF6> <96AC> <EEF7> <EEF7> <9720> <EEF8> <EEF8> <971F> <EEF9> <EEF9> <9718> <EEFA> <EEFA> <971D> <EEFB> <EEFB> <9719> <EEFC> <EEFC> <979A> <EEFD> <EEFD> <97A1> <EEFE> <EEFE> <979C> <EF40> <EF40> <979E> <EF41> <EF41> <979D> <EF42> <EF42> <97D5> <EF43> <EF43> <97D4> <EF44> <EF44> <97F1> <EF45> <EF45> <9841> <EF46> <EF46> <9844> <EF47> <EF47> <984A> <EF48> <EF48> <9849> <EF49> <EF49> <9845> <EF4A> <EF4A> <9843> <EF4B> <EF4B> <9925> <EF4C> <EF4D> <992B> <EF4E> <EF4E> <992A> <EF4F> <EF4F> <9933> <EF50> <EF50> <9932> <EF51> <EF51> <992F> <EF52> <EF52> <992D> <EF53> <EF53> <9931> <EF54> <EF54> <9930> <EF55> <EF55> <9998> <EF56> <EF56> <99A3> <EF57> <EF57> <99A1> <EF58> <EF58> <9A02> <EF59> <EF59> <99FA> <EF5A> <EF5A> <99F4> <EF5B> <EF5B> <99F7> <EF5C> <EF5C> <99F9> <EF5D> <EF5D> <99F8> <EF5E> <EF5E> <99F6> <EF5F> <EF5F> <99FB> <EF60> <EF61> <99FD> <EF62> <EF62> <99FC> <EF63> <EF63> <9A03> <EF64> <EF64> <9ABE> <EF65> <EF65> <9AFE> <EF66> <EF66> <9AFD> <EF67> <EF67> <9B01> <EF68> <EF68> <9AFC> <EF69> <EF69> <9B48> <EF6A> <EF6A> <9B9A> <EF6B> <EF6B> <9BA8> <EF6C> <EF6C> <9B9E> <EF6D> <EF6D> <9B9B> <EF6E> <EF6E> <9BA6> <EF6F> <EF6F> <9BA1> <EF70> <EF70> <9BA5> <EF71> <EF71> <9BA4> <EF72> <EF72> <9B86> <EF73> <EF73> <9BA2> <EF74> <EF74> <9BA0> <EF75> <EF75> <9BAF> <EF76> <EF76> <9D33> <EF77> <EF77> <9D41> endbfrange 100 beginbfrange <EF78> <EF78> <9D67> <EF79> <EF79> <9D36> <EF7A> <EF7B> <9D2E> <EF7C> <EF7C> <9D31> <EF7D> <EF7D> <9D38> <EF7E> <EF7E> <9D30> <EFA1> <EFA1> <9D45> <EFA2> <EFA3> <9D42> <EFA4> <EFA4> <9D3E> <EFA5> <EFA5> <9D37> <EFA6> <EFA6> <9D40> <EFA7> <EFA7> <9D3D> <EFA8> <EFA8> <7FF5> <EFA9> <EFA9> <9D2D> <EFAA> <EFAA> <9E8A> <EFAB> <EFAB> <9E89> <EFAC> <EFAC> <9E8D> <EFAD> <EFAD> <9EB0> <EFAE> <EFAE> <9EC8> <EFAF> <EFAF> <9EDA> <EFB0> <EFB0> <9EFB> <EFB1> <EFB1> <9EFF> <EFB2> <EFB2> <9F24> <EFB3> <EFB3> <9F23> <EFB4> <EFB4> <9F22> <EFB5> <EFB5> <9F54> <EFB6> <EFB6> <9FA0> <EFB7> <EFB7> <5131> <EFB8> <EFB9> <512D> <EFBA> <EFBA> <5698> <EFBB> <EFBB> <569C> <EFBC> <EFBC> <5697> <EFBD> <EFBD> <569A> <EFBE> <EFBE> <569D> <EFBF> <EFBF> <5699> <EFC0> <EFC0> <5970> <EFC1> <EFC1> <5B3C> <EFC2> <EFC3> <5C69> <EFC4> <EFC4> <5DC0> <EFC5> <EFC6> <5E6D> <EFC7> <EFC7> <61D8> <EFC8> <EFC8> <61DF> <EFC9> <EFCA> <61ED> <EFCB> <EFCB> <61F1> <EFCC> <EFCC> <61EA> <EFCD> <EFCD> <61F0> <EFCE> <EFCE> <61EB> <EFCF> <EFCF> <61D6> <EFD0> <EFD0> <61E9> <EFD1> <EFD1> <64FF> <EFD2> <EFD2> <6504> <EFD3> <EFD3> <64FD> <EFD4> <EFD4> <64F8> <EFD5> <EFD5> <6501> <EFD6> <EFD6> <6503> <EFD7> <EFD7> <64FC> <EFD8> <EFD8> <6594> <EFD9> <EFD9> <65DB> <EFDA> <EFDB> <66DA> <EFDC> <EFDC> <66D8> <EFDD> <EFDD> <6AC5> <EFDE> <EFDE> <6AB9> <EFDF> <EFDF> <6ABD> <EFE0> <EFE0> <6AE1> <EFE1> <EFE1> <6AC6> <EFE2> <EFE2> <6ABA> <EFE3> <EFE4> <6AB6> <EFE5> <EFE5> <6AC7> <EFE6> <EFE6> <6AB4> <EFE7> <EFE7> <6AAD> <EFE8> <EFE8> <6B5E> <EFE9> <EFE9> <6BC9> <EFEA> <EFEA> <6C0B> <EFEB> <EFEB> <7007> <EFEC> <EFED> <700C> <EFEE> <EFEE> <7001> <EFEF> <EFEF> <7005> <EFF0> <EFF0> <7014> <EFF1> <EFF1> <700E> <EFF2> <EFF3> <6FFF> <EFF4> <EFF4> <6FFB> <EFF5> <EFF5> <7026> <EFF6> <EFF6> <6FFC> <EFF7> <EFF7> <6FF7> <EFF8> <EFF8> <700A> <EFF9> <EFF9> <7201> <EFFA> <EFFA> <71FF> <EFFB> <EFFB> <71F9> <EFFC> <EFFC> <7203> <EFFD> <EFFD> <71FD> <EFFE> <EFFE> <7376> <F040> <F040> <74B8> <F041> <F041> <74C0> <F042> <F042> <74B5> <F043> <F043> <74C1> <F044> <F044> <74BE> <F045> <F045> <74B6> <F046> <F046> <74BB> <F047> <F047> <74C2> <F048> <F048> <7514> endbfrange 100 beginbfrange <F049> <F049> <7513> <F04A> <F04A> <765C> <F04B> <F04B> <7664> <F04C> <F04C> <7659> <F04D> <F04D> <7650> <F04E> <F04E> <7653> <F04F> <F04F> <7657> <F050> <F050> <765A> <F051> <F051> <76A6> <F052> <F052> <76BD> <F053> <F053> <76EC> <F054> <F054> <77C2> <F055> <F055> <77BA> <F056> <F056> <78FF> <F057> <F057> <790C> <F058> <F059> <7913> <F05A> <F05A> <7909> <F05B> <F05B> <7910> <F05C> <F05C> <7912> <F05D> <F05D> <7911> <F05E> <F05E> <79AD> <F05F> <F05F> <79AC> <F060> <F060> <7A5F> <F061> <F061> <7C1C> <F062> <F062> <7C29> <F063> <F063> <7C19> <F064> <F064> <7C20> <F065> <F065> <7C1F> <F066> <F066> <7C2D> <F067> <F067> <7C1D> <F068> <F068> <7C26> <F069> <F069> <7C28> <F06A> <F06A> <7C22> <F06B> <F06B> <7C25> <F06C> <F06C> <7C30> <F06D> <F06D> <7E5C> <F06E> <F06E> <7E50> <F06F> <F06F> <7E56> <F070> <F070> <7E63> <F071> <F071> <7E58> <F072> <F072> <7E62> <F073> <F073> <7E5F> <F074> <F074> <7E51> <F075> <F075> <7E60> <F076> <F076> <7E57> <F077> <F077> <7E53> <F078> <F078> <7FB5> <F079> <F079> <7FB3> <F07A> <F07B> <7FF7> <F07C> <F07C> <8075> <F07D> <F07E> <81D1> <F0A1> <F0A1> <81D0> <F0A2> <F0A2> <825F> <F0A3> <F0A3> <825E> <F0A4> <F0A4> <85B4> <F0A5> <F0A5> <85C6> <F0A6> <F0A6> <85C0> <F0A7> <F0A7> <85C3> <F0A8> <F0A8> <85C2> <F0A9> <F0A9> <85B3> <F0AA> <F0AA> <85B5> <F0AB> <F0AB> <85BD> <F0AC> <F0AC> <85C7> <F0AD> <F0AD> <85C4> <F0AE> <F0AE> <85BF> <F0AF> <F0AF> <85CB> <F0B0> <F0B0> <85CE> <F0B1> <F0B1> <85C8> <F0B2> <F0B2> <85C5> <F0B3> <F0B3> <85B1> <F0B4> <F0B4> <85B6> <F0B5> <F0B5> <85D2> <F0B6> <F0B6> <8624> <F0B7> <F0B7> <85B8> <F0B8> <F0B8> <85B7> <F0B9> <F0B9> <85BE> <F0BA> <F0BA> <8669> <F0BB> <F0BB> <87E7> <F0BC> <F0BC> <87E6> <F0BD> <F0BD> <87E2> <F0BE> <F0BE> <87DB> <F0BF> <F0BF> <87EB> <F0C0> <F0C0> <87EA> <F0C1> <F0C1> <87E5> <F0C2> <F0C2> <87DF> <F0C3> <F0C3> <87F3> <F0C4> <F0C4> <87E4> <F0C5> <F0C5> <87D4> <F0C6> <F0C6> <87DC> <F0C7> <F0C7> <87D3> <F0C8> <F0C8> <87ED> <F0C9> <F0C9> <87D8> <F0CA> <F0CA> <87E3> <F0CB> <F0CB> <87A4> <F0CC> <F0CC> <87D7> <F0CD> <F0CD> <87D9> <F0CE> <F0CE> <8801> <F0CF> <F0CF> <87F4> <F0D0> <F0D0> <87E8> <F0D1> <F0D1> <87DD> endbfrange 100 beginbfrange <F0D2> <F0D2> <8953> <F0D3> <F0D3> <894B> <F0D4> <F0D4> <894F> <F0D5> <F0D5> <894C> <F0D6> <F0D6> <8946> <F0D7> <F0D8> <8950> <F0D9> <F0D9> <8949> <F0DA> <F0DA> <8B2A> <F0DB> <F0DB> <8B27> <F0DC> <F0DC> <8B23> <F0DD> <F0DD> <8B33> <F0DE> <F0DE> <8B30> <F0DF> <F0DF> <8B35> <F0E0> <F0E0> <8B47> <F0E1> <F0E1> <8B2F> <F0E2> <F0E2> <8B3C> <F0E3> <F0E3> <8B3E> <F0E4> <F0E4> <8B31> <F0E5> <F0E5> <8B25> <F0E6> <F0E6> <8B37> <F0E7> <F0E7> <8B26> <F0E8> <F0E8> <8B36> <F0E9> <F0E9> <8B2E> <F0EA> <F0EA> <8B24> <F0EB> <F0EB> <8B3B> <F0EC> <F0EC> <8B3D> <F0ED> <F0ED> <8B3A> <F0EE> <F0EE> <8C42> <F0EF> <F0EF> <8C75> <F0F0> <F0F0> <8C99> <F0F1> <F0F1> <8C98> <F0F2> <F0F2> <8C97> <F0F3> <F0F3> <8CFE> <F0F4> <F0F4> <8D04> <F0F5> <F0F5> <8D02> <F0F6> <F0F6> <8D00> <F0F7> <F0F7> <8E5C> <F0F8> <F0F8> <8E62> <F0F9> <F0F9> <8E60> <F0FA> <F0FA> <8E57> <F0FB> <F0FB> <8E56> <F0FC> <F0FC> <8E5E> <F0FD> <F0FD> <8E65> <F0FE> <F0FE> <8E67> <F140> <F140> <8E5B> <F141> <F141> <8E5A> <F142> <F142> <8E61> <F143> <F143> <8E5D> <F144> <F144> <8E69> <F145> <F145> <8E54> <F146> <F148> <8F46> <F149> <F149> <8F4B> <F14A> <F14A> <9128> <F14B> <F14C> <913A> <F14D> <F14D> <913E> <F14E> <F14E> <91A8> <F14F> <F14F> <91A5> <F150> <F150> <91A7> <F151> <F151> <91AF> <F152> <F152> <91AA> <F153> <F153> <93B5> <F154> <F154> <938C> <F155> <F155> <9392> <F156> <F156> <93B7> <F157> <F157> <939B> <F158> <F158> <939D> <F159> <F159> <9389> <F15A> <F15A> <93A7> <F15B> <F15B> <938E> <F15C> <F15C> <93AA> <F15D> <F15D> <939E> <F15E> <F15E> <93A6> <F15F> <F15F> <9395> <F160> <F160> <9388> <F161> <F161> <9399> <F162> <F162> <939F> <F163> <F163> <938D> <F164> <F164> <93B1> <F165> <F165> <9391> <F166> <F166> <93B2> <F167> <F167> <93A4> <F168> <F168> <93A8> <F169> <F169> <93B4> <F16A> <F16A> <93A3> <F16B> <F16B> <93A5> <F16C> <F16D> <95D2> <F16E> <F16E> <95D1> <F16F> <F16F> <96B3> <F170> <F170> <96D7> <F171> <F171> <96DA> <F172> <F172> <5DC2> <F173> <F173> <96DF> <F174> <F174> <96D8> <F175> <F175> <96DD> <F176> <F176> <9723> <F177> <F177> <9722> <F178> <F178> <9725> <F179> <F179> <97AC> <F17A> <F17A> <97AE> <F17B> <F17B> <97A8> endbfrange 100 beginbfrange <F17C> <F17C> <97AB> <F17D> <F17D> <97A4> <F17E> <F17E> <97AA> <F1A1> <F1A1> <97A2> <F1A2> <F1A2> <97A5> <F1A3> <F1A3> <97D7> <F1A4> <F1A4> <97D9> <F1A5> <F1A5> <97D6> <F1A6> <F1A6> <97D8> <F1A7> <F1A7> <97FA> <F1A8> <F1AA> <9850> <F1AB> <F1AB> <98B8> <F1AC> <F1AC> <9941> <F1AD> <F1AD> <993C> <F1AE> <F1AE> <993A> <F1AF> <F1AF> <9A0F> <F1B0> <F1B0> <9A0B> <F1B1> <F1B1> <9A09> <F1B2> <F1B2> <9A0D> <F1B3> <F1B3> <9A04> <F1B4> <F1B4> <9A11> <F1B5> <F1B5> <9A0A> <F1B6> <F1B6> <9A05> <F1B7> <F1B7> <9A07> <F1B8> <F1B8> <9A06> <F1B9> <F1B9> <9AC0> <F1BA> <F1BA> <9ADC> <F1BB> <F1BB> <9B08> <F1BC> <F1BD> <9B04> <F1BE> <F1BE> <9B29> <F1BF> <F1BF> <9B35> <F1C0> <F1C0> <9B4A> <F1C1> <F1C1> <9B4C> <F1C2> <F1C2> <9B4B> <F1C3> <F1C3> <9BC7> <F1C4> <F1C4> <9BC6> <F1C5> <F1C5> <9BC3> <F1C6> <F1C6> <9BBF> <F1C7> <F1C7> <9BC1> <F1C8> <F1C8> <9BB5> <F1C9> <F1C9> <9BB8> <F1CA> <F1CA> <9BD3> <F1CB> <F1CB> <9BB6> <F1CC> <F1CC> <9BC4> <F1CD> <F1CD> <9BB9> <F1CE> <F1CE> <9BBD> <F1CF> <F1CF> <9D5C> <F1D0> <F1D0> <9D53> <F1D1> <F1D1> <9D4F> <F1D2> <F1D2> <9D4A> <F1D3> <F1D3> <9D5B> <F1D4> <F1D4> <9D4B> <F1D5> <F1D5> <9D59> <F1D6> <F1D6> <9D56> <F1D7> <F1D7> <9D4C> <F1D8> <F1D8> <9D57> <F1D9> <F1D9> <9D52> <F1DA> <F1DA> <9D54> <F1DB> <F1DB> <9D5F> <F1DC> <F1DC> <9D58> <F1DD> <F1DD> <9D5A> <F1DE> <F1DE> <9E8E> <F1DF> <F1DF> <9E8C> <F1E0> <F1E0> <9EDF> <F1E1> <F1E1> <9F01> <F1E2> <F1E2> <9F00> <F1E3> <F1E3> <9F16> <F1E4> <F1E4> <9F25> <F1E5> <F1E5> <9F2B> <F1E6> <F1E6> <9F2A> <F1E7> <F1E7> <9F29> <F1E8> <F1E8> <9F28> <F1E9> <F1E9> <9F4C> <F1EA> <F1EA> <9F55> <F1EB> <F1EC> <5134> <F1ED> <F1ED> <5296> <F1EE> <F1EE> <52F7> <F1EF> <F1EF> <53B4> <F1F0> <F1F0> <56AB> <F1F1> <F1F1> <56AD> <F1F2> <F1F3> <56A6> <F1F4> <F1F4> <56AA> <F1F5> <F1F5> <56AC> <F1F6> <F1F6> <58DA> <F1F7> <F1F7> <58DD> <F1F8> <F1F8> <58DB> <F1F9> <F1F9> <5912> <F1FA> <F1FC> <5B3D> <F1FD> <F1FD> <5DC3> <F1FE> <F1FE> <5E70> <F240> <F240> <5FBF> <F241> <F241> <61FB> <F242> <F242> <6507> <F243> <F243> <6510> <F244> <F244> <650D> <F245> <F245> <6509> <F246> <F246> <650C> <F247> <F247> <650E> <F248> <F248> <6584> <F249> <F249> <65DE> endbfrange 100 beginbfrange <F24A> <F24A> <65DD> <F24B> <F24B> <66DE> <F24C> <F24C> <6AE7> <F24D> <F24D> <6AE0> <F24E> <F24E> <6ACC> <F24F> <F24F> <6AD1> <F250> <F250> <6AD9> <F251> <F251> <6ACB> <F252> <F252> <6ADF> <F253> <F253> <6ADC> <F254> <F254> <6AD0> <F255> <F255> <6AEB> <F256> <F256> <6ACF> <F257> <F257> <6ACD> <F258> <F258> <6ADE> <F259> <F259> <6B60> <F25A> <F25A> <6BB0> <F25B> <F25B> <6C0C> <F25C> <F25C> <7019> <F25D> <F25D> <7027> <F25E> <F25E> <7020> <F25F> <F25F> <7016> <F260> <F260> <702B> <F261> <F263> <7021> <F264> <F264> <7029> <F265> <F265> <7017> <F266> <F266> <7024> <F267> <F267> <701C> <F268> <F268> <702A> <F269> <F269> <720C> <F26A> <F26A> <720A> <F26B> <F26B> <7207> <F26C> <F26C> <7202> <F26D> <F26D> <7205> <F26E> <F26F> <72A5> <F270> <F270> <72A4> <F271> <F271> <72A3> <F272> <F272> <72A1> <F273> <F273> <74CB> <F274> <F274> <74C5> <F275> <F275> <74B7> <F276> <F276> <74C3> <F277> <F277> <7516> <F278> <F278> <7660> <F279> <F27A> <77C9> <F27B> <F27B> <77C4> <F27C> <F27C> <77F1> <F27D> <F27D> <791D> <F27E> <F27E> <791B> <F2A1> <F2A1> <7921> <F2A2> <F2A2> <791C> <F2A3> <F2A3> <7917> <F2A4> <F2A4> <791E> <F2A5> <F2A5> <79B0> <F2A6> <F2A7> <7A67> <F2A8> <F2A8> <7C33> <F2A9> <F2A9> <7C3C> <F2AA> <F2AA> <7C39> <F2AB> <F2AB> <7C2C> <F2AC> <F2AC> <7C3B> <F2AD> <F2AD> <7CEC> <F2AE> <F2AE> <7CEA> <F2AF> <F2AF> <7E76> <F2B0> <F2B0> <7E75> <F2B1> <F2B1> <7E78> <F2B2> <F2B2> <7E70> <F2B3> <F2B3> <7E77> <F2B4> <F2B4> <7E6F> <F2B5> <F2B5> <7E7A> <F2B6> <F2B6> <7E72> <F2B7> <F2B7> <7E74> <F2B8> <F2B8> <7E68> <F2B9> <F2B9> <7F4B> <F2BA> <F2BA> <7F4A> <F2BB> <F2BB> <7F83> <F2BC> <F2BC> <7F86> <F2BD> <F2BD> <7FB7> <F2BE> <F2BF> <7FFD> <F2C0> <F2C0> <8078> <F2C1> <F2C1> <81D7> <F2C2> <F2C2> <81D5> <F2C3> <F2C3> <8264> <F2C4> <F2C4> <8261> <F2C5> <F2C5> <8263> <F2C6> <F2C6> <85EB> <F2C7> <F2C7> <85F1> <F2C8> <F2C8> <85ED> <F2C9> <F2C9> <85D9> <F2CA> <F2CA> <85E1> <F2CB> <F2CB> <85E8> <F2CC> <F2CC> <85DA> <F2CD> <F2CD> <85D7> <F2CE> <F2CE> <85EC> <F2CF> <F2CF> <85F2> <F2D0> <F2D0> <85F8> <F2D1> <F2D1> <85D8> <F2D2> <F2D2> <85DF> <F2D3> <F2D3> <85E3> <F2D4> <F2D4> <85DC> <F2D5> <F2D5> <85D1> endbfrange 100 beginbfrange <F2D6> <F2D6> <85F0> <F2D7> <F2D7> <85E6> <F2D8> <F2D8> <85EF> <F2D9> <F2D9> <85DE> <F2DA> <F2DA> <85E2> <F2DB> <F2DB> <8800> <F2DC> <F2DC> <87FA> <F2DD> <F2DD> <8803> <F2DE> <F2DF> <87F6> <F2E0> <F2E0> <8809> <F2E1> <F2E1> <880C> <F2E2> <F2E2> <880B> <F2E3> <F2E3> <8806> <F2E4> <F2E4> <87FC> <F2E5> <F2E5> <8808> <F2E6> <F2E6> <87FF> <F2E7> <F2E7> <880A> <F2E8> <F2E8> <8802> <F2E9> <F2E9> <8962> <F2EA> <F2EB> <895A> <F2EC> <F2EC> <8957> <F2ED> <F2ED> <8961> <F2EE> <F2EE> <895C> <F2EF> <F2EF> <8958> <F2F0> <F2F0> <895D> <F2F1> <F2F1> <8959> <F2F2> <F2F2> <8988> <F2F3> <F2F3> <89B7> <F2F4> <F2F4> <89B6> <F2F5> <F2F5> <89F6> <F2F6> <F2F6> <8B50> <F2F7> <F2F7> <8B48> <F2F8> <F2F8> <8B4A> <F2F9> <F2F9> <8B40> <F2FA> <F2FA> <8B53> <F2FB> <F2FB> <8B56> <F2FC> <F2FC> <8B54> <F2FD> <F2FD> <8B4B> <F2FE> <F2FE> <8B55> <F340> <F340> <8B51> <F341> <F341> <8B42> <F342> <F342> <8B52> <F343> <F343> <8B57> <F344> <F344> <8C43> <F345> <F345> <8C77> <F346> <F346> <8C76> <F347> <F347> <8C9A> <F348> <F349> <8D06> <F34A> <F34A> <8D09> <F34B> <F34B> <8DAC> <F34C> <F34C> <8DAA> <F34D> <F34D> <8DAD> <F34E> <F34E> <8DAB> <F34F> <F34F> <8E6D> <F350> <F350> <8E78> <F351> <F351> <8E73> <F352> <F352> <8E6A> <F353> <F353> <8E6F> <F354> <F354> <8E7B> <F355> <F355> <8EC2> <F356> <F356> <8F52> <F357> <F357> <8F51> <F358> <F359> <8F4F> <F35A> <F35A> <8F53> <F35B> <F35B> <8FB4> <F35C> <F35C> <9140> <F35D> <F35D> <913F> <F35E> <F35E> <91B0> <F35F> <F35F> <91AD> <F360> <F360> <93DE> <F361> <F361> <93C7> <F362> <F362> <93CF> <F363> <F363> <93C2> <F364> <F364> <93DA> <F365> <F365> <93D0> <F366> <F366> <93F9> <F367> <F367> <93EC> <F368> <F368> <93CC> <F369> <F369> <93D9> <F36A> <F36A> <93A9> <F36B> <F36B> <93E6> <F36C> <F36C> <93CA> <F36D> <F36D> <93D4> <F36E> <F36E> <93EE> <F36F> <F36F> <93E3> <F370> <F370> <93D5> <F371> <F371> <93C4> <F372> <F372> <93CE> <F373> <F373> <93C0> <F374> <F374> <93D2> <F375> <F375> <93E7> <F376> <F376> <957D> <F377> <F378> <95DA> <F379> <F379> <96E1> <F37A> <F37A> <9729> <F37B> <F37C> <972B> <F37D> <F37D> <9728> <F37E> <F37E> <9726> <F3A1> <F3A1> <97B3> <F3A2> <F3A2> <97B7> endbfrange 100 beginbfrange <F3A3> <F3A3> <97B6> <F3A4> <F3A6> <97DD> <F3A7> <F3A7> <985C> <F3A8> <F3A8> <9859> <F3A9> <F3A9> <985D> <F3AA> <F3AA> <9857> <F3AB> <F3AB> <98BF> <F3AC> <F3AC> <98BD> <F3AD> <F3AD> <98BB> <F3AE> <F3AE> <98BE> <F3AF> <F3AF> <9948> <F3B0> <F3B0> <9947> <F3B1> <F3B1> <9943> <F3B2> <F3B3> <99A6> <F3B4> <F3B4> <9A1A> <F3B5> <F3B5> <9A15> <F3B6> <F3B6> <9A25> <F3B7> <F3B7> <9A1D> <F3B8> <F3B8> <9A24> <F3B9> <F3B9> <9A1B> <F3BA> <F3BA> <9A22> <F3BB> <F3BB> <9A20> <F3BC> <F3BC> <9A27> <F3BD> <F3BD> <9A23> <F3BE> <F3BE> <9A1E> <F3BF> <F3BF> <9A1C> <F3C0> <F3C0> <9A14> <F3C1> <F3C1> <9AC2> <F3C2> <F3C2> <9B0B> <F3C3> <F3C3> <9B0A> <F3C4> <F3C4> <9B0E> <F3C5> <F3C5> <9B0C> <F3C6> <F3C6> <9B37> <F3C7> <F3C8> <9BEA> <F3C9> <F3C9> <9BE0> <F3CA> <F3CA> <9BDE> <F3CB> <F3CB> <9BE4> <F3CC> <F3CC> <9BE6> <F3CD> <F3CD> <9BE2> <F3CE> <F3CE> <9BF0> <F3CF> <F3CF> <9BD4> <F3D0> <F3D0> <9BD7> <F3D1> <F3D1> <9BEC> <F3D2> <F3D2> <9BDC> <F3D3> <F3D3> <9BD9> <F3D4> <F3D4> <9BE5> <F3D5> <F3D5> <9BD5> <F3D6> <F3D6> <9BE1> <F3D7> <F3D7> <9BDA> <F3D8> <F3D8> <9D77> <F3D9> <F3D9> <9D81> <F3DA> <F3DA> <9D8A> <F3DB> <F3DB> <9D84> <F3DC> <F3DC> <9D88> <F3DD> <F3DD> <9D71> <F3DE> <F3DE> <9D80> <F3DF> <F3DF> <9D78> <F3E0> <F3E0> <9D86> <F3E1> <F3E2> <9D8B> <F3E3> <F3E3> <9D7D> <F3E4> <F3E4> <9D6B> <F3E5> <F3E6> <9D74> <F3E7> <F3E7> <9D70> <F3E8> <F3E8> <9D69> <F3E9> <F3E9> <9D85> <F3EA> <F3EA> <9D73> <F3EB> <F3EB> <9D7B> <F3EC> <F3EC> <9D82> <F3ED> <F3ED> <9D6F> <F3EE> <F3EE> <9D79> <F3EF> <F3EF> <9D7F> <F3F0> <F3F0> <9D87> <F3F1> <F3F1> <9D68> <F3F2> <F3F2> <9E94> <F3F3> <F3F3> <9E91> <F3F4> <F3F4> <9EC0> <F3F5> <F3F5> <9EFC> <F3F6> <F3F6> <9F2D> <F3F7> <F3F8> <9F40> <F3F9> <F3F9> <9F4D> <F3FA> <F3FC> <9F56> <F3FD> <F3FD> <5337> <F3FE> <F3FE> <56B2> <F440> <F440> <56B5> <F441> <F441> <56B3> <F442> <F442> <58E3> <F443> <F443> <5B45> <F444> <F445> <5DC6> <F446> <F447> <5EEE> <F448> <F449> <5FC0> <F44A> <F44A> <61F9> <F44B> <F44B> <6517> <F44C> <F44C> <6516> <F44D> <F44D> <6515> <F44E> <F44E> <6513> <F44F> <F44F> <65DF> <F450> <F450> <66E8> <F451> <F452> <66E3> <F453> <F453> <6AF3> <F454> <F454> <6AF0> endbfrange 100 beginbfrange <F455> <F455> <6AEA> <F456> <F456> <6AE8> <F457> <F457> <6AF9> <F458> <F458> <6AF1> <F459> <F45A> <6AEE> <F45B> <F45B> <703C> <F45C> <F45C> <7035> <F45D> <F45D> <702F> <F45E> <F45E> <7037> <F45F> <F45F> <7034> <F460> <F460> <7031> <F461> <F461> <7042> <F462> <F462> <7038> <F463> <F463> <703F> <F464> <F464> <703A> <F465> <F465> <7039> <F466> <F466> <7040> <F467> <F467> <703B> <F468> <F468> <7033> <F469> <F469> <7041> <F46A> <F46B> <7213> <F46C> <F46C> <72A8> <F46D> <F46D> <737D> <F46E> <F46E> <737C> <F46F> <F46F> <74BA> <F470> <F470> <76AB> <F471> <F471> <76AA> <F472> <F472> <76BE> <F473> <F473> <76ED> <F474> <F474> <77CC> <F475> <F476> <77CE> <F477> <F477> <77CD> <F478> <F478> <77F2> <F479> <F479> <7925> <F47A> <F47A> <7923> <F47B> <F47C> <7927> <F47D> <F47D> <7924> <F47E> <F47E> <7929> <F4A1> <F4A1> <79B2> <F4A2> <F4A2> <7A6E> <F4A3> <F4A4> <7A6C> <F4A5> <F4A5> <7AF7> <F4A6> <F4A6> <7C49> <F4A7> <F4A7> <7C48> <F4A8> <F4A8> <7C4A> <F4A9> <F4A9> <7C47> <F4AA> <F4AA> <7C45> <F4AB> <F4AB> <7CEE> <F4AC> <F4AC> <7E7B> <F4AD> <F4AD> <7E7E> <F4AE> <F4AE> <7E81> <F4AF> <F4AF> <7E80> <F4B0> <F4B0> <7FBA> <F4B1> <F4B1> <7FFF> <F4B2> <F4B2> <8079> <F4B3> <F4B3> <81DB> <F4B4> <F4B4> <81D9> <F4B5> <F4B5> <820B> <F4B6> <F4B7> <8268> <F4B8> <F4B8> <8622> <F4B9> <F4B9> <85FF> <F4BA> <F4BA> <8601> <F4BB> <F4BB> <85FE> <F4BC> <F4BC> <861B> <F4BD> <F4BD> <8600> <F4BE> <F4BE> <85F6> <F4BF> <F4BF> <8604> <F4C0> <F4C0> <8609> <F4C1> <F4C1> <8605> <F4C2> <F4C2> <860C> <F4C3> <F4C3> <85FD> <F4C4> <F4C4> <8819> <F4C5> <F4C6> <8810> <F4C7> <F4C7> <8817> <F4C8> <F4C8> <8813> <F4C9> <F4C9> <8816> <F4CA> <F4CA> <8963> <F4CB> <F4CB> <8966> <F4CC> <F4CC> <89B9> <F4CD> <F4CD> <89F7> <F4CE> <F4CE> <8B60> <F4CF> <F4CF> <8B6A> <F4D0> <F4D0> <8B5D> <F4D1> <F4D1> <8B68> <F4D2> <F4D2> <8B63> <F4D3> <F4D3> <8B65> <F4D4> <F4D4> <8B67> <F4D5> <F4D5> <8B6D> <F4D6> <F4D6> <8DAE> <F4D7> <F4D7> <8E86> <F4D8> <F4D8> <8E88> <F4D9> <F4D9> <8E84> <F4DA> <F4DA> <8F59> <F4DB> <F4DC> <8F56> <F4DD> <F4DD> <8F55> <F4DE> <F4DE> <8F58> <F4DF> <F4DF> <8F5A> <F4E0> <F4E0> <908D> <F4E1> <F4E1> <9143> <F4E2> <F4E2> <9141> endbfrange 100 beginbfrange <F4E3> <F4E3> <91B7> <F4E4> <F4E4> <91B5> <F4E5> <F4E6> <91B2> <F4E7> <F4E7> <940B> <F4E8> <F4E8> <9413> <F4E9> <F4E9> <93FB> <F4EA> <F4EA> <9420> <F4EB> <F4EB> <940F> <F4EC> <F4EC> <9414> <F4ED> <F4ED> <93FE> <F4EE> <F4EE> <9415> <F4EF> <F4EF> <9410> <F4F0> <F4F0> <9428> <F4F1> <F4F1> <9419> <F4F2> <F4F2> <940D> <F4F3> <F4F3> <93F5> <F4F4> <F4F4> <9400> <F4F5> <F4F5> <93F7> <F4F6> <F4F6> <9407> <F4F7> <F4F7> <940E> <F4F8> <F4F8> <9416> <F4F9> <F4F9> <9412> <F4FA> <F4FA> <93FA> <F4FB> <F4FB> <9409> <F4FC> <F4FC> <93F8> <F4FD> <F4FD> <940A> <F4FE> <F4FE> <93FF> <F540> <F540> <93FC> <F541> <F541> <940C> <F542> <F542> <93F6> <F543> <F543> <9411> <F544> <F544> <9406> <F545> <F545> <95DE> <F546> <F546> <95E0> <F547> <F547> <95DF> <F548> <F549> <972E> <F54A> <F54A> <97B9> <F54B> <F54B> <97BB> <F54C> <F54D> <97FD> <F54E> <F54E> <9860> <F54F> <F550> <9862> <F551> <F551> <985F> <F552> <F553> <98C1> <F554> <F554> <9950> <F555> <F555> <994E> <F556> <F556> <9959> <F557> <F557> <994C> <F558> <F558> <994B> <F559> <F559> <9953> <F55A> <F55A> <9A32> <F55B> <F55B> <9A34> <F55C> <F55C> <9A31> <F55D> <F55D> <9A2C> <F55E> <F55E> <9A2A> <F55F> <F55F> <9A36> <F560> <F560> <9A29> <F561> <F561> <9A2E> <F562> <F562> <9A38> <F563> <F563> <9A2D> <F564> <F564> <9AC7> <F565> <F565> <9ACA> <F566> <F566> <9AC6> <F567> <F567> <9B10> <F568> <F568> <9B12> <F569> <F569> <9B11> <F56A> <F56A> <9C0B> <F56B> <F56B> <9C08> <F56C> <F56C> <9BF7> <F56D> <F56D> <9C05> <F56E> <F56E> <9C12> <F56F> <F56F> <9BF8> <F570> <F570> <9C40> <F571> <F571> <9C07> <F572> <F572> <9C0E> <F573> <F573> <9C06> <F574> <F574> <9C17> <F575> <F575> <9C14> <F576> <F576> <9C09> <F577> <F577> <9D9F> <F578> <F578> <9D99> <F579> <F579> <9DA4> <F57A> <F57A> <9D9D> <F57B> <F57B> <9D92> <F57C> <F57C> <9D98> <F57D> <F57D> <9D90> <F57E> <F57E> <9D9B> <F5A1> <F5A1> <9DA0> <F5A2> <F5A2> <9D94> <F5A3> <F5A3> <9D9C> <F5A4> <F5A4> <9DAA> <F5A5> <F5A5> <9D97> <F5A6> <F5A6> <9DA1> <F5A7> <F5A7> <9D9A> <F5A8> <F5A8> <9DA2> <F5A9> <F5A9> <9DA8> <F5AA> <F5AA> <9D9E> <F5AB> <F5AB> <9DA3> <F5AC> <F5AC> <9DBF> <F5AD> <F5AD> <9DA9> <F5AE> <F5AE> <9D96> endbfrange 100 beginbfrange <F5AF> <F5B0> <9DA6> <F5B1> <F5B1> <9E99> <F5B2> <F5B2> <9E9B> <F5B3> <F5B3> <9E9A> <F5B4> <F5B4> <9EE5> <F5B5> <F5B5> <9EE4> <F5B6> <F5B6> <9EE7> <F5B7> <F5B7> <9EE6> <F5B8> <F5B8> <9F30> <F5B9> <F5B9> <9F2E> <F5BA> <F5BA> <9F5B> <F5BB> <F5BB> <9F60> <F5BC> <F5BC> <9F5E> <F5BD> <F5BD> <9F5D> <F5BE> <F5BE> <9F59> <F5BF> <F5BF> <9F91> <F5C0> <F5C0> <513A> <F5C1> <F5C1> <5139> <F5C2> <F5C2> <5298> <F5C3> <F5C3> <5297> <F5C4> <F5C4> <56C3> <F5C5> <F5C6> <56BD> <F5C7> <F5C7> <5B48> <F5C8> <F5C8> <5B47> <F5C9> <F5C9> <5DCB> <F5CA> <F5CA> <5DCF> <F5CB> <F5CB> <5EF1> <F5CC> <F5CC> <61FD> <F5CD> <F5CD> <651B> <F5CE> <F5CE> <6B02> <F5CF> <F5CF> <6AFC> <F5D0> <F5D0> <6B03> <F5D1> <F5D1> <6AF8> <F5D2> <F5D2> <6B00> <F5D3> <F5D4> <7043> <F5D5> <F5D5> <704A> <F5D6> <F5D7> <7048> <F5D8> <F5D9> <7045> <F5DA> <F5DA> <721D> <F5DB> <F5DB> <721A> <F5DC> <F5DC> <7219> <F5DD> <F5DD> <737E> <F5DE> <F5DE> <7517> <F5DF> <F5DF> <766A> <F5E0> <F5E0> <77D0> <F5E1> <F5E1> <792D> <F5E2> <F5E2> <7931> <F5E3> <F5E3> <792F> <F5E4> <F5E4> <7C54> <F5E5> <F5E5> <7C53> <F5E6> <F5E6> <7CF2> <F5E7> <F5E7> <7E8A> <F5E8> <F5E9> <7E87> <F5EA> <F5EA> <7E8B> <F5EB> <F5EB> <7E86> <F5EC> <F5EC> <7E8D> <F5ED> <F5ED> <7F4D> <F5EE> <F5EE> <7FBB> <F5EF> <F5EF> <8030> <F5F0> <F5F0> <81DD> <F5F1> <F5F1> <8618> <F5F2> <F5F2> <862A> <F5F3> <F5F3> <8626> <F5F4> <F5F4> <861F> <F5F5> <F5F5> <8623> <F5F6> <F5F6> <861C> <F5F7> <F5F7> <8619> <F5F8> <F5F8> <8627> <F5F9> <F5F9> <862E> <F5FA> <F5FA> <8621> <F5FB> <F5FB> <8620> <F5FC> <F5FC> <8629> <F5FD> <F5FD> <861E> <F5FE> <F5FE> <8625> <F640> <F640> <8829> <F641> <F641> <881D> <F642> <F642> <881B> <F643> <F643> <8820> <F644> <F644> <8824> <F645> <F645> <881C> <F646> <F646> <882B> <F647> <F647> <884A> <F648> <F648> <896D> <F649> <F649> <8969> <F64A> <F64A> <896E> <F64B> <F64B> <896B> <F64C> <F64C> <89FA> <F64D> <F64D> <8B79> <F64E> <F64E> <8B78> <F64F> <F64F> <8B45> <F650> <F651> <8B7A> <F652> <F652> <8D10> <F653> <F653> <8D14> <F654> <F654> <8DAF> <F655> <F655> <8E8E> <F656> <F656> <8E8C> <F657> <F657> <8F5E> <F658> <F658> <8F5B> <F659> <F659> <8F5D> <F65A> <F65A> <9146> endbfrange 100 beginbfrange <F65B> <F65C> <9144> <F65D> <F65D> <91B9> <F65E> <F65E> <943F> <F65F> <F65F> <943B> <F660> <F660> <9436> <F661> <F661> <9429> <F662> <F662> <943D> <F663> <F663> <943C> <F664> <F664> <9430> <F665> <F665> <9439> <F666> <F666> <942A> <F667> <F667> <9437> <F668> <F668> <942C> <F669> <F669> <9440> <F66A> <F66A> <9431> <F66B> <F66B> <95E5> <F66C> <F66C> <95E4> <F66D> <F66D> <95E3> <F66E> <F66E> <9735> <F66F> <F66F> <973A> <F670> <F670> <97BF> <F671> <F671> <97E1> <F672> <F672> <9864> <F673> <F673> <98C9> <F674> <F674> <98C6> <F675> <F675> <98C0> <F676> <F676> <9958> <F677> <F677> <9956> <F678> <F678> <9A39> <F679> <F679> <9A3D> <F67A> <F67A> <9A46> <F67B> <F67B> <9A44> <F67C> <F67C> <9A42> <F67D> <F67D> <9A41> <F67E> <F67E> <9A3A> <F6A1> <F6A1> <9A3F> <F6A2> <F6A2> <9ACD> <F6A3> <F6A3> <9B15> <F6A4> <F6A5> <9B17> <F6A6> <F6A6> <9B16> <F6A7> <F6A7> <9B3A> <F6A8> <F6A8> <9B52> <F6A9> <F6A9> <9C2B> <F6AA> <F6AA> <9C1D> <F6AB> <F6AB> <9C1C> <F6AC> <F6AC> <9C2C> <F6AD> <F6AD> <9C23> <F6AE> <F6AF> <9C28> <F6B0> <F6B0> <9C24> <F6B1> <F6B1> <9C21> <F6B2> <F6B2> <9DB7> <F6B3> <F6B3> <9DB6> <F6B4> <F6B4> <9DBC> <F6B5> <F6B5> <9DC1> <F6B6> <F6B6> <9DC7> <F6B7> <F6B7> <9DCA> <F6B8> <F6B8> <9DCF> <F6B9> <F6B9> <9DBE> <F6BA> <F6BA> <9DC5> <F6BB> <F6BB> <9DC3> <F6BC> <F6BC> <9DBB> <F6BD> <F6BD> <9DB5> <F6BE> <F6BE> <9DCE> <F6BF> <F6C0> <9DB9> <F6C1> <F6C1> <9DAC> <F6C2> <F6C2> <9DC8> <F6C3> <F6C3> <9DB1> <F6C4> <F6C4> <9DAD> <F6C5> <F6C5> <9DCC> <F6C6> <F6C6> <9DB3> <F6C7> <F6C7> <9DCD> <F6C8> <F6C8> <9DB2> <F6C9> <F6C9> <9E7A> <F6CA> <F6CA> <9E9C> <F6CB> <F6CB> <9EEB> <F6CC> <F6CC> <9EEE> <F6CD> <F6CD> <9EED> <F6CE> <F6CE> <9F1B> <F6CF> <F6CF> <9F18> <F6D0> <F6D0> <9F1A> <F6D1> <F6D1> <9F31> <F6D2> <F6D2> <9F4E> <F6D3> <F6D3> <9F65> <F6D4> <F6D4> <9F64> <F6D5> <F6D5> <9F92> <F6D6> <F6D6> <4EB9> <F6D7> <F6D7> <56C6> <F6D8> <F6D8> <56C5> <F6D9> <F6D9> <56CB> <F6DA> <F6DA> <5971> <F6DB> <F6DC> <5B4B> <F6DD> <F6DD> <5DD5> <F6DE> <F6DE> <5DD1> <F6DF> <F6DF> <5EF2> <F6E0> <F6E0> <6521> <F6E1> <F6E1> <6520> <F6E2> <F6E2> <6526> <F6E3> <F6E3> <6522> <F6E4> <F6E4> <6B0B> <F6E5> <F6E6> <6B08> endbfrange 100 beginbfrange <F6E7> <F6E7> <6C0D> <F6E8> <F6EA> <7055> <F6EB> <F6EB> <7052> <F6EC> <F6ED> <721E> <F6EE> <F6EE> <72A9> <F6EF> <F6EF> <737F> <F6F0> <F6F0> <74D8> <F6F1> <F6F1> <74D5> <F6F2> <F6F2> <74D9> <F6F3> <F6F3> <74D7> <F6F4> <F6F4> <766D> <F6F5> <F6F5> <76AD> <F6F6> <F6F6> <7935> <F6F7> <F6F7> <79B4> <F6F8> <F6F9> <7A70> <F6FA> <F6FA> <7C57> <F6FB> <F6FB> <7C5C> <F6FC> <F6FC> <7C59> <F6FD> <F6FD> <7C5B> <F6FE> <F6FE> <7C5A> <F740> <F740> <7CF4> <F741> <F741> <7CF1> <F742> <F742> <7E91> <F743> <F743> <7F4F> <F744> <F744> <7F87> <F745> <F745> <81DE> <F746> <F746> <826B> <F747> <F748> <8634> <F749> <F749> <8633> <F74A> <F74A> <862C> <F74B> <F74B> <8632> <F74C> <F74C> <8636> <F74D> <F74D> <882C> <F74E> <F74E> <8828> <F74F> <F74F> <8826> <F750> <F750> <882A> <F751> <F751> <8825> <F752> <F752> <8971> <F753> <F753> <89BF> <F754> <F754> <89BE> <F755> <F755> <89FB> <F756> <F756> <8B7E> <F757> <F757> <8B84> <F758> <F758> <8B82> <F759> <F759> <8B86> <F75A> <F75A> <8B85> <F75B> <F75B> <8B7F> <F75C> <F75C> <8D15> <F75D> <F75D> <8E95> <F75E> <F75E> <8E94> <F75F> <F75F> <8E9A> <F760> <F760> <8E92> <F761> <F761> <8E90> <F762> <F763> <8E96> <F764> <F764> <8F60> <F765> <F765> <8F62> <F766> <F766> <9147> <F767> <F767> <944C> <F768> <F768> <9450> <F769> <F76A> <944A> <F76B> <F76B> <944F> <F76C> <F76C> <9447> <F76D> <F76D> <9445> <F76E> <F76F> <9448> <F770> <F770> <9446> <F771> <F771> <973F> <F772> <F772> <97E3> <F773> <F773> <986A> <F774> <F774> <9869> <F775> <F775> <98CB> <F776> <F776> <9954> <F777> <F777> <995B> <F778> <F778> <9A4E> <F779> <F77A> <9A53> <F77B> <F77B> <9A4C> <F77C> <F77C> <9A4F> <F77D> <F77D> <9A48> <F77E> <F77E> <9A4A> <F7A1> <F7A1> <9A49> <F7A2> <F7A2> <9A52> <F7A3> <F7A3> <9A50> <F7A4> <F7A4> <9AD0> <F7A5> <F7A5> <9B19> <F7A6> <F7A6> <9B2B> <F7A7> <F7A7> <9B3B> <F7A8> <F7A8> <9B56> <F7A9> <F7A9> <9B55> <F7AA> <F7AA> <9C46> <F7AB> <F7AB> <9C48> <F7AC> <F7AC> <9C3F> <F7AD> <F7AD> <9C44> <F7AE> <F7AE> <9C39> <F7AF> <F7AF> <9C33> <F7B0> <F7B0> <9C41> <F7B1> <F7B1> <9C3C> <F7B2> <F7B2> <9C37> <F7B3> <F7B3> <9C34> <F7B4> <F7B4> <9C32> <F7B5> <F7B5> <9C3D> <F7B6> <F7B6> <9C36> endbfrange 100 beginbfrange <F7B7> <F7B7> <9DDB> <F7B8> <F7B8> <9DD2> <F7B9> <F7B9> <9DDE> <F7BA> <F7BA> <9DDA> <F7BB> <F7BB> <9DCB> <F7BC> <F7BC> <9DD0> <F7BD> <F7BD> <9DDC> <F7BE> <F7BE> <9DD1> <F7BF> <F7BF> <9DDF> <F7C0> <F7C0> <9DE9> <F7C1> <F7C1> <9DD9> <F7C2> <F7C2> <9DD8> <F7C3> <F7C3> <9DD6> <F7C4> <F7C4> <9DF5> <F7C5> <F7C5> <9DD5> <F7C6> <F7C6> <9DDD> <F7C7> <F7C7> <9EB6> <F7C8> <F7C8> <9EF0> <F7C9> <F7C9> <9F35> <F7CA> <F7CA> <9F33> <F7CB> <F7CB> <9F32> <F7CC> <F7CC> <9F42> <F7CD> <F7CD> <9F6B> <F7CE> <F7CE> <9F95> <F7CF> <F7CF> <9FA2> <F7D0> <F7D0> <513D> <F7D1> <F7D1> <5299> <F7D2> <F7D2> <58E8> <F7D3> <F7D3> <58E7> <F7D4> <F7D4> <5972> <F7D5> <F7D5> <5B4D> <F7D6> <F7D6> <5DD8> <F7D7> <F7D7> <882F> <F7D8> <F7D8> <5F4F> <F7D9> <F7D9> <6201> <F7DA> <F7DB> <6203> <F7DC> <F7DC> <6529> <F7DD> <F7DD> <6525> <F7DE> <F7DE> <6596> <F7DF> <F7DF> <66EB> <F7E0> <F7E1> <6B11> <F7E2> <F7E2> <6B0F> <F7E3> <F7E3> <6BCA> <F7E4> <F7E4> <705B> <F7E5> <F7E5> <705A> <F7E6> <F7E6> <7222> <F7E7> <F7E7> <7382> <F7E8> <F7E8> <7381> <F7E9> <F7E9> <7383> <F7EA> <F7EA> <7670> <F7EB> <F7EB> <77D4> <F7EC> <F7EC> <7C67> <F7ED> <F7ED> <7C66> <F7EE> <F7EE> <7E95> <F7EF> <F7EF> <826C> <F7F0> <F7F0> <863A> <F7F1> <F7F1> <8640> <F7F2> <F7F2> <8639> <F7F3> <F7F3> <863C> <F7F4> <F7F4> <8631> <F7F5> <F7F5> <863B> <F7F6> <F7F6> <863E> <F7F7> <F7F7> <8830> <F7F8> <F7F8> <8832> <F7F9> <F7F9> <882E> <F7FA> <F7FA> <8833> <F7FB> <F7FB> <8976> <F7FC> <F7FC> <8974> <F7FD> <F7FD> <8973> <F7FE> <F7FE> <89FE> <F840> <F840> <8B8C> <F841> <F841> <8B8E> <F842> <F842> <8B8B> <F843> <F843> <8B88> <F844> <F844> <8C45> <F845> <F845> <8D19> <F846> <F846> <8E98> <F847> <F847> <8F64> <F848> <F848> <8F63> <F849> <F849> <91BC> <F84A> <F84A> <9462> <F84B> <F84B> <9455> <F84C> <F84C> <945D> <F84D> <F84D> <9457> <F84E> <F84E> <945E> <F84F> <F850> <97C4> <F851> <F851> <9800> <F852> <F852> <9A56> <F853> <F853> <9A59> <F854> <F856> <9B1E> <F857> <F857> <9C52> <F858> <F858> <9C58> <F859> <F859> <9C50> <F85A> <F85A> <9C4A> <F85B> <F85B> <9C4D> <F85C> <F85C> <9C4B> <F85D> <F85D> <9C55> <F85E> <F85E> <9C59> <F85F> <F85F> <9C4C> <F860> <F860> <9C4E> endbfrange 100 beginbfrange <F861> <F861> <9DFB> <F862> <F862> <9DF7> <F863> <F863> <9DEF> <F864> <F864> <9DE3> <F865> <F865> <9DEB> <F866> <F866> <9DF8> <F867> <F867> <9DE4> <F868> <F868> <9DF6> <F869> <F869> <9DE1> <F86A> <F86A> <9DEE> <F86B> <F86B> <9DE6> <F86C> <F86C> <9DF2> <F86D> <F86D> <9DF0> <F86E> <F86E> <9DE2> <F86F> <F86F> <9DEC> <F870> <F870> <9DF4> <F871> <F871> <9DF3> <F872> <F872> <9DE8> <F873> <F873> <9DED> <F874> <F874> <9EC2> <F875> <F875> <9ED0> <F876> <F877> <9EF2> <F878> <F878> <9F06> <F879> <F879> <9F1C> <F87A> <F87A> <9F38> <F87B> <F87B> <9F37> <F87C> <F87C> <9F36> <F87D> <F87D> <9F43> <F87E> <F87E> <9F4F> <F8A1> <F8A1> <9F71> <F8A2> <F8A2> <9F70> <F8A3> <F8A4> <9F6E> <F8A5> <F8A5> <56D3> <F8A6> <F8A6> <56CD> <F8A7> <F8A7> <5B4E> <F8A8> <F8A8> <5C6D> <F8A9> <F8A9> <652D> <F8AA> <F8AB> <66ED> <F8AC> <F8AC> <6B13> <F8AD> <F8AD> <705F> <F8AE> <F8AE> <7061> <F8AF> <F8AF> <705D> <F8B0> <F8B0> <7060> <F8B1> <F8B1> <7223> <F8B2> <F8B2> <74DB> <F8B3> <F8B3> <74E5> <F8B4> <F8B4> <77D5> <F8B5> <F8B5> <7938> <F8B6> <F8B6> <79B7> <F8B7> <F8B7> <79B6> <F8B8> <F8B8> <7C6A> <F8B9> <F8B9> <7E97> <F8BA> <F8BA> <7F89> <F8BB> <F8BB> <826D> <F8BC> <F8BC> <8643> <F8BD> <F8BD> <8838> <F8BE> <F8BE> <8837> <F8BF> <F8BF> <8835> <F8C0> <F8C0> <884B> <F8C1> <F8C2> <8B94> <F8C3> <F8C5> <8E9E> <F8C6> <F8C6> <8E9D> <F8C7> <F8C7> <91BE> <F8C8> <F8C8> <91BD> <F8C9> <F8C9> <91C2> <F8CA> <F8CA> <946B> <F8CB> <F8CC> <9468> <F8CD> <F8CD> <96E5> <F8CE> <F8CE> <9746> <F8CF> <F8CF> <9743> <F8D0> <F8D0> <9747> <F8D1> <F8D1> <97C7> <F8D2> <F8D2> <97E5> <F8D3> <F8D3> <9A5E> <F8D4> <F8D4> <9AD5> <F8D5> <F8D5> <9B59> <F8D6> <F8D6> <9C63> <F8D7> <F8D7> <9C67> <F8D8> <F8D8> <9C66> <F8D9> <F8D9> <9C62> <F8DA> <F8DA> <9C5E> <F8DB> <F8DB> <9C60> <F8DC> <F8DC> <9E02> <F8DD> <F8DD> <9DFE> <F8DE> <F8DE> <9E07> <F8DF> <F8DF> <9E03> <F8E0> <F8E0> <9E06> <F8E1> <F8E1> <9E05> <F8E2> <F8E3> <9E00> <F8E4> <F8E4> <9E09> <F8E5> <F8E5> <9DFF> <F8E6> <F8E6> <9DFD> <F8E7> <F8E7> <9E04> <F8E8> <F8E8> <9EA0> <F8E9> <F8E9> <9F1E> <F8EA> <F8EA> <9F46> <F8EB> <F8ED> <9F74> <F8EE> <F8EE> <56D4> <F8EF> <F8EF> <652E> <F8F0> <F8F0> <65B8> endbfrange 100 beginbfrange <F8F1> <F8F2> <6B18> <F8F3> <F8F3> <6B17> <F8F4> <F8F4> <6B1A> <F8F5> <F8F5> <7062> <F8F6> <F8F6> <7226> <F8F7> <F8F7> <72AA> <F8F8> <F8F9> <77D8> <F8FA> <F8FA> <7939> <F8FB> <F8FB> <7C69> <F8FC> <F8FC> <7C6B> <F8FD> <F8FD> <7CF6> <F8FE> <F8FE> <7E9A> <F940> <F940> <7E98> <F941> <F941> <7E9B> <F942> <F942> <7E99> <F943> <F944> <81E0> <F945> <F947> <8646> <F948> <F949> <8979> <F94A> <F94A> <897C> <F94B> <F94B> <897B> <F94C> <F94C> <89FF> <F94D> <F94E> <8B98> <F94F> <F94F> <8EA5> <F950> <F950> <8EA4> <F951> <F951> <8EA3> <F952> <F952> <946E> <F953> <F953> <946D> <F954> <F954> <946F> <F955> <F955> <9471> <F956> <F956> <9473> <F957> <F957> <9749> <F958> <F958> <9872> <F959> <F959> <995F> <F95A> <F95A> <9C68> <F95B> <F95B> <9C6E> <F95C> <F95C> <9C6D> <F95D> <F95D> <9E0B> <F95E> <F95E> <9E0D> <F95F> <F95F> <9E10> <F960> <F960> <9E0F> <F961> <F961> <9E12> <F962> <F962> <9E11> <F963> <F963> <9EA1> <F964> <F964> <9EF5> <F965> <F965> <9F09> <F966> <F966> <9F47> <F967> <F967> <9F78> <F968> <F968> <9F7B> <F969> <F969> <9F7A> <F96A> <F96A> <9F79> <F96B> <F96B> <571E> <F96C> <F96C> <7066> <F96D> <F96D> <7C6F> <F96E> <F96E> <883C> <F96F> <F96F> <8DB2> <F970> <F970> <8EA6> <F971> <F971> <91C3> <F972> <F972> <9474> <F973> <F973> <9478> <F974> <F974> <9476> <F975> <F975> <9475> <F976> <F976> <9A60> <F977> <F977> <9C74> <F978> <F978> <9C73> <F979> <F979> <9C71> <F97A> <F97A> <9C75> <F97B> <F97B> <9E14> <F97C> <F97C> <9E13> <F97D> <F97D> <9EF6> <F97E> <F97E> <9F0A> <F9A1> <F9A1> <9FA4> <F9A2> <F9A2> <7068> <F9A3> <F9A3> <7065> <F9A4> <F9A4> <7CF7> <F9A5> <F9A5> <866A> <F9A6> <F9A6> <883E> <F9A7> <F9A7> <883D> <F9A8> <F9A8> <883F> <F9A9> <F9A9> <8B9E> <F9AA> <F9AA> <8C9C> <F9AB> <F9AB> <8EA9> <F9AC> <F9AC> <8EC9> <F9AD> <F9AD> <974B> <F9AE> <F9AF> <9873> <F9B0> <F9B0> <98CC> <F9B1> <F9B1> <9961> <F9B2> <F9B2> <99AB> <F9B3> <F9B3> <9A64> <F9B4> <F9B5> <9A66> <F9B6> <F9B6> <9B24> <F9B7> <F9B7> <9E15> <F9B8> <F9B8> <9E17> <F9B9> <F9B9> <9F48> <F9BA> <F9BA> <6207> <F9BB> <F9BB> <6B1E> <F9BC> <F9BC> <7227> <F9BD> <F9BD> <864C> <F9BE> <F9BE> <8EA8> <F9BF> <F9BF> <9482> <F9C0> <F9C1> <9480> endbfrange 69 beginbfrange <F9C2> <F9C2> <9A69> <F9C3> <F9C3> <9A68> <F9C4> <F9C4> <9B2E> <F9C5> <F9C5> <9E19> <F9C6> <F9C6> <7229> <F9C7> <F9C7> <864B> <F9C8> <F9C8> <8B9F> <F9C9> <F9C9> <9483> <F9CA> <F9CA> <9C79> <F9CB> <F9CB> <9EB7> <F9CC> <F9CC> <7675> <F9CD> <F9CD> <9A6B> <F9CE> <F9CE> <9C7A> <F9CF> <F9CF> <9E1D> <F9D0> <F9D1> <7069> <F9D2> <F9D2> <9EA4> <F9D3> <F9D3> <9F7E> <F9D4> <F9D4> <9F49> <F9D5> <F9D5> <9F98> <F9D6> <F9D6> <7881> <F9D7> <F9D7> <92B9> <F9D8> <F9D8> <88CF> <F9D9> <F9D9> <58BB> <F9DA> <F9DA> <6052> <F9DB> <F9DB> <7CA7> <F9DC> <F9DC> <5AFA> <F9DD> <F9DD> <2554> <F9DE> <F9DE> <2566> <F9DF> <F9DF> <2557> <F9E0> <F9E0> <2560> <F9E1> <F9E1> <256C> <F9E2> <F9E2> <2563> <F9E3> <F9E3> <255A> <F9E4> <F9E4> <2569> <F9E5> <F9E5> <255D> <F9E6> <F9E6> <2552> <F9E7> <F9E7> <2564> <F9E8> <F9E8> <2555> <F9E9> <F9E9> <255E> <F9EA> <F9EA> <256A> <F9EB> <F9EB> <2561> <F9EC> <F9EC> <2558> <F9ED> <F9ED> <2567> <F9EE> <F9EE> <255B> <F9EF> <F9EF> <2553> <F9F0> <F9F0> <2565> <F9F1> <F9F1> <2556> <F9F2> <F9F2> <255F> <F9F3> <F9F3> <256B> <F9F4> <F9F4> <2562> <F9F5> <F9F5> <2559> <F9F6> <F9F6> <2568> <F9F7> <F9F7> <255C> <F9F8> <F9F8> <2551> <F9F9> <F9F9> <2550> <F9FA> <F9FB> <256D> <F9FC> <F9FC> <2570> <F9FD> <F9FD> <256F> <F9FE> <F9FE> <2593> <FA40> <FA7E> <E000> <FAA1> <FAFE> <E03F> <FB40> <FB7E> <E09D> <FBA1> <FBFE> <E0DC> <FC40> <FC7E> <E13A> <FCA1> <FCFE> <E179> <FD40> <FD7E> <E1D7> <FDA1> <FDFE> <E216> <FE40> <FE7E> <E274> <FEA1> <FEFE> <E2B3> endbfrange endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF \ No newline at end of file
diff --git a/src/main/resources/Resources/cmap/ETen-B5-V b/src/main/resources/Resources/cmap/ETen-B5-V
new file mode 100644
index 0000000..5c714a2
--- /dev/null
+++ b/src/main/resources/Resources/cmap/ETen-B5-V
@@ -0,0 +1 @@
+%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%DocumentNeededResources: CMap (ETen-B5-H) %%IncludeResource: ProcSet (CIDInit) %%IncludeResource: CMap (ETen-B5-H) %%BeginResource: CMap (ETen-B5-V) %%Title: (ETen-B5-V Adobe CNS1 0) %%Version: 10.001 %%Copyright: ----------------------------------------------------------- %%Copyright: Copyright 1990-1999 Adobe Systems Incorporated. %%Copyright: All Rights Reserved. %%Copyright: %%Copyright: Patents Pending %%Copyright: %%Copyright: NOTICE: All information contained herein is the property %%Copyright: of Adobe Systems Incorporated. %%Copyright: %%Copyright: Permission is granted for redistribution of this file %%Copyright: provided this copyright notice is maintained intact and %%Copyright: that the contents of this file are not altered in any %%Copyright: way from its original form. %%Copyright: %%Copyright: PostScript and Display PostScript are trademarks of %%Copyright: Adobe Systems Incorporated which may be registered in %%Copyright: certain jurisdictions. %%Copyright: ----------------------------------------------------------- %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /ETen-B5-H usecmap /CIDSystemInfo 3 dict dup begin /Registry (Adobe) def /Ordering (CNS1) def /Supplement 0 def end def /CMapName /ETen-B5-V def /CMapVersion 10.001 def /CMapType 1 def /UIDOffset 920 def /XUID [1 10 25391] def /WMode 1 def 13 begincidrange <a14b> <a14b> 13646 <a15a> <a15a> 13743 <a15c> <a15c> 13745 <a15d> <a15e> 130 <a161> <a162> 134 <a165> <a166> 138 <a169> <a16a> 142 <a16d> <a16e> 146 <a171> <a172> 150 <a175> <a176> 154 <a179> <a17a> 158 <a1e3> <a1e3> 13647 <c6e4> <c6e5> 14097 endcidrange endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF \ No newline at end of file
diff --git a/src/main/resources/Resources/cmap/ETenms-B5-H b/src/main/resources/Resources/cmap/ETenms-B5-H
new file mode 100644
index 0000000..aba976e
--- /dev/null
+++ b/src/main/resources/Resources/cmap/ETenms-B5-H
@@ -0,0 +1,55 @@
+%!PS-Adobe-3.0 Resource-CMap
+%%DocumentNeededResources: ProcSet (CIDInit)
+%%IncludeResource: ProcSet (CIDInit)
+%%BeginResource: CMap (ETenms-B5-H)
+%%Title: (ETenms-B5-H Adobe CNS1 0)
+%%Version: 7.001
+%%Copyright: -----------------------------------------------------------
+%%Copyright: Copyright 1990-1997 Adobe Systems Incorporated.
+%%Copyright: All Rights Reserved.
+%%Copyright:
+%%Copyright: Patents Pending
+%%Copyright:
+%%Copyright: NOTICE: All information contained herein is the property
+%%Copyright: of Adobe Systems Incorporated.
+%%Copyright:
+%%Copyright: Permission is granted for redistribution of this file
+%%Copyright: provided this copyright notice is maintained intact and
+%%Copyright: that the contents of this file are not altered in any
+%%Copyright: way from its original form.
+%%Copyright:
+%%Copyright: PostScript and Display PostScript are trademarks of
+%%Copyright: Adobe Systems Incorporated which may be registered in
+%%Copyright: certain jurisdictions.
+%%Copyright: -----------------------------------------------------------
+%%EndComments
+
+/CIDInit /ProcSet findresource begin
+
+12 dict begin
+
+begincmap
+
+/ETen-B5-H usecmap
+
+/CIDSystemInfo 3 dict dup begin
+ /Registry (Adobe) def
+ /Ordering (CNS1) def
+ /Supplement 0 def
+end def
+
+/CMapName /ETenms-B5-H def
+/CMapVersion 7.001 def
+/CMapType 1 def
+/WMode 0 def
+
+1 begincidrange
+<20> <7e> 1
+endcidrange
+
+endcmap
+CMapName currentdict /CMap defineresource pop
+end
+end
+%%EndResource
+%%EOF
diff --git a/src/main/resources/Resources/cmap/ETenms-B5-V b/src/main/resources/Resources/cmap/ETenms-B5-V
new file mode 100644
index 0000000..976ab11
--- /dev/null
+++ b/src/main/resources/Resources/cmap/ETenms-B5-V
@@ -0,0 +1,75 @@
+%!PS-Adobe-3.0 Resource-CMap
+%%DocumentNeededResources: ProcSet (CIDInit)
+%%DocumentNeededResources: CMap (ETenms-B5-H)
+%%IncludeResource: ProcSet (CIDInit)
+%%IncludeResource: CMap (ETenms-B5-H)
+%%BeginResource: CMap (ETenms-B5-V)
+%%Title: (ETenms-B5-V Adobe CNS1 0)
+%%Version: 7.001
+%%Copyright: -----------------------------------------------------------
+%%Copyright: Copyright 1990-1997 Adobe Systems Incorporated.
+%%Copyright: All Rights Reserved.
+%%Copyright:
+%%Copyright: Patents Pending
+%%Copyright:
+%%Copyright: NOTICE: All information contained herein is the property
+%%Copyright: of Adobe Systems Incorporated.
+%%Copyright:
+%%Copyright: Permission is granted for redistribution of this file
+%%Copyright: provided this copyright notice is maintained intact and
+%%Copyright: that the contents of this file are not altered in any
+%%Copyright: way from its original form.
+%%Copyright:
+%%Copyright: PostScript and Display PostScript are trademarks of
+%%Copyright: Adobe Systems Incorporated which may be registered in
+%%Copyright: certain jurisdictions.
+%%Copyright: -----------------------------------------------------------
+%%EndComments
+
+/CIDInit /ProcSet findresource begin
+
+12 dict begin
+
+begincmap
+
+/ETenms-B5-H usecmap
+
+/CIDSystemInfo 3 dict dup begin
+ /Registry (Adobe) def
+ /Ordering (CNS1) def
+ /Supplement 0 def
+end def
+
+/CMapName /ETenms-B5-V def
+/CMapVersion 7.001 def
+/CMapType 1 def
+/WMode 1 def
+
+
+18 begincidrange
+<a14b> <a14b> 13646
+<a14c> <a14c> 109
+<a156> <a156> 312
+<a158> <a158> 122
+<a15a> <a15a> 13743
+<a15c> <a15c> 13745
+<a15d> <a15e> 130
+<a161> <a162> 134
+<a165> <a166> 138
+<a169> <a16a> 142
+<a16d> <a16e> 146
+<a171> <a172> 150
+<a175> <a176> 154
+<a179> <a17a> 158
+<a17d> <a17e> 130
+<a1a1> <a1a2> 134
+<a1a3> <a1a4> 138
+<c6e4> <c6e5> 14097
+endcidrange
+
+endcmap
+CMapName currentdict /CMap defineresource pop
+end
+end
+%%EndResource
+%%EOF
diff --git a/src/main/resources/Resources/cmap/EUC-H b/src/main/resources/Resources/cmap/EUC-H
new file mode 100644
index 0000000..6bde89a
--- /dev/null
+++ b/src/main/resources/Resources/cmap/EUC-H
@@ -0,0 +1 @@
+%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%IncludeResource: ProcSet (CIDInit) %%BeginResource: CMap (EUC-H) %%Title: (EUC-H Adobe Japan1 1) %%Version: 10.001 %%Copyright: ----------------------------------------------------------- %%Copyright: Copyright 1990-1998 Adobe Systems Incorporated. %%Copyright: All Rights Reserved. %%Copyright: %%Copyright: Patents Pending %%Copyright: %%Copyright: NOTICE: All information contained herein is the property %%Copyright: of Adobe Systems Incorporated. %%Copyright: %%Copyright: Permission is granted for redistribution of this file %%Copyright: provided this copyright notice is maintained intact and %%Copyright: that the contents of this file are not altered in any %%Copyright: way from its original form. %%Copyright: %%Copyright: PostScript and Display PostScript are trademarks of %%Copyright: Adobe Systems Incorporated which may be registered in %%Copyright: certain jurisdictions. %%Copyright: ----------------------------------------------------------- %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo 3 dict dup begin /Registry (Adobe) def /Ordering (Japan1) def /Supplement 1 def end def /CMapName /EUC-H def /CMapVersion 10.001 def /CMapType 1 def /UIDOffset 680 def /XUID [1 10 25329] def /WMode 0 def 3 begincodespacerange <00> <80> <8EA0> <8EDF> <A1A1> <FEFE> endcodespacerange 1 beginnotdefrange <00> <1f> 231 endnotdefrange 100 begincidrange <20> <7e> 231 <8ea0> <8edf> 326 <a1a1> <a1fe> 633 <a2a1> <a2ae> 727 <a2ba> <a2c1> 741 <a2ca> <a2d0> 749 <a2dc> <a2ea> 756 <a2f2> <a2f9> 771 <a2fe> <a2fe> 779 <a3b0> <a3b9> 780 <a3c1> <a3da> 790 <a3e1> <a3fa> 816 <a4a1> <a4f3> 842 <a5a1> <a5f6> 925 <a6a1> <a6b8> 1011 <a6c1> <a6d8> 1035 <a7a1> <a7c1> 1059 <a7d1> <a7f1> 1092 <a8a1> <a8a1> 7479 <a8a2> <a8a2> 7481 <a8a3> <a8a3> 7491 <a8a4> <a8a4> 7495 <a8a5> <a8a5> 7503 <a8a6> <a8a6> 7499 <a8a7> <a8a7> 7507 <a8a8> <a8a8> 7523 <a8a9> <a8a9> 7515 <a8aa> <a8aa> 7531 <a8ab> <a8ab> 7539 <a8ac> <a8ac> 7480 <a8ad> <a8ad> 7482 <a8ae> <a8ae> 7494 <a8af> <a8af> 7498 <a8b0> <a8b0> 7506 <a8b1> <a8b1> 7502 <a8b2> <a8b2> 7514 <a8b3> <a8b3> 7530 <a8b4> <a8b4> 7522 <a8b5> <a8b5> 7538 <a8b6> <a8b6> 7554 <a8b7> <a8b7> 7511 <a8b8> <a8b8> 7526 <a8b9> <a8b9> 7519 <a8ba> <a8ba> 7534 <a8bb> <a8bb> 7542 <a8bc> <a8bc> 7508 <a8bd> <a8bd> 7527 <a8be> <a8be> 7516 <a8bf> <a8bf> 7535 <a8c0> <a8c0> 7545 <b0a1> <b0fe> 1125 <b1a1> <b1fe> 1219 <b2a1> <b2fe> 1313 <b3a1> <b3fe> 1407 <b4a1> <b4fe> 1501 <b5a1> <b5fe> 1595 <b6a1> <b6fe> 1689 <b7a1> <b7fe> 1783 <b8a1> <b8fe> 1877 <b9a1> <b9fe> 1971 <baa1> <bafe> 2065 <bba1> <bbfe> 2159 <bca1> <bcfe> 2253 <bda1> <bdfe> 2347 <bea1> <befe> 2441 <bfa1> <bffe> 2535 <c0a1> <c0fe> 2629 <c1a1> <c1fe> 2723 <c2a1> <c2fe> 2817 <c3a1> <c3fe> 2911 <c4a1> <c4fe> 3005 <c5a1> <c5fe> 3099 <c6a1> <c6fe> 3193 <c7a1> <c7fe> 3287 <c8a1> <c8fe> 3381 <c9a1> <c9fe> 3475 <caa1> <cafe> 3569 <cba1> <cbfe> 3663 <cca1> <ccfe> 3757 <cda1> <cdfe> 3851 <cea1> <cefe> 3945 <cfa1> <cfd3> 4039 <d0a1> <d0fe> 4090 <d1a1> <d1fe> 4184 <d2a1> <d2fe> 4278 <d3a1> <d3fe> 4372 <d4a1> <d4fe> 4466 <d5a1> <d5fe> 4560 <d6a1> <d6fe> 4654 <d7a1> <d7fe> 4748 <d8a1> <d8fe> 4842 <d9a1> <d9fe> 4936 <daa1> <dafe> 5030 <dba1> <dbfe> 5124 <dca1> <dcfe> 5218 <dda1> <ddfe> 5312 <dea1> <defe> 5406 <dfa1> <dffe> 5500 <e0a1> <e0fe> 5594 <e1a1> <e1fe> 5688 endcidrange 20 begincidrange <e2a1> <e2fe> 5782 <e3a1> <e3fe> 5876 <e4a1> <e4fe> 5970 <e5a1> <e5fe> 6064 <e6a1> <e6fe> 6158 <e7a1> <e7fe> 6252 <e8a1> <e8fe> 6346 <e9a1> <e9fe> 6440 <eaa1> <eafe> 6534 <eba1> <ebfe> 6628 <eca1> <ecfe> 6722 <eda1> <edfe> 6816 <eea1> <eefe> 6910 <efa1> <effe> 7004 <f0a1> <f0fe> 7098 <f1a1> <f1fe> 7192 <f2a1> <f2fe> 7286 <f3a1> <f3fe> 7380 <f4a1> <f4a4> 7474 <f4a5> <f4a6> 8284 endcidrange endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF \ No newline at end of file
diff --git a/src/main/resources/Resources/cmap/EUC-V b/src/main/resources/Resources/cmap/EUC-V
new file mode 100644
index 0000000..e90e0ce
--- /dev/null
+++ b/src/main/resources/Resources/cmap/EUC-V
@@ -0,0 +1 @@
+%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%DocumentNeededResources: CMap (EUC-H) %%IncludeResource: ProcSet (CIDInit) %%IncludeResource: CMap (EUC-H) %%BeginResource: CMap (EUC-V) %%Title: (EUC-V Adobe Japan1 0) %%Version: 10.001 %%Copyright: ----------------------------------------------------------- %%Copyright: Copyright 1990-1998 Adobe Systems Incorporated. %%Copyright: All Rights Reserved. %%Copyright: %%Copyright: Patents Pending %%Copyright: %%Copyright: NOTICE: All information contained herein is the property %%Copyright: of Adobe Systems Incorporated. %%Copyright: %%Copyright: Permission is granted for redistribution of this file %%Copyright: provided this copyright notice is maintained intact and %%Copyright: that the contents of this file are not altered in any %%Copyright: way from its original form. %%Copyright: %%Copyright: PostScript and Display PostScript are trademarks of %%Copyright: Adobe Systems Incorporated which may be registered in %%Copyright: certain jurisdictions. %%Copyright: ----------------------------------------------------------- %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /EUC-H usecmap /CIDSystemInfo 3 dict dup begin /Registry (Adobe) def /Ordering (Japan1) def /Supplement 0 def end def /CMapName /EUC-V def /CMapVersion 10.001 def /CMapType 1 def /UIDOffset 800 def /XUID [1 10 25330] def /WMode 1 def 27 begincidrange <a1a2> <a1a3> 7887 <a1b1> <a1b2> 7889 <a1bc> <a1be> 7891 <a1c1> <a1c5> 7894 <a1ca> <a1db> 7899 <a1e1> <a1e1> 7917 <a4a1> <a4a1> 7918 <a4a3> <a4a3> 7919 <a4a5> <a4a5> 7920 <a4a7> <a4a7> 7921 <a4a9> <a4a9> 7922 <a4c3> <a4c3> 7923 <a4e3> <a4e3> 7924 <a4e5> <a4e5> 7925 <a4e7> <a4e7> 7926 <a4ee> <a4ee> 7927 <a5a1> <a5a1> 7928 <a5a3> <a5a3> 7929 <a5a5> <a5a5> 7930 <a5a7> <a5a7> 7931 <a5a9> <a5a9> 7932 <a5c3> <a5c3> 7933 <a5e3> <a5e3> 7934 <a5e5> <a5e5> 7935 <a5e7> <a5e7> 7936 <a5ee> <a5ee> 7937 <a5f5> <a5f6> 7938 endcidrange endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF \ No newline at end of file
diff --git a/src/main/resources/Resources/cmap/Ext-H b/src/main/resources/Resources/cmap/Ext-H
new file mode 100644
index 0000000..671f3d1
--- /dev/null
+++ b/src/main/resources/Resources/cmap/Ext-H
@@ -0,0 +1,739 @@
+%!PS-Adobe-3.0 Resource-CMap
+%%DocumentNeededResources: ProcSet (CIDInit)
+%%IncludeResource: ProcSet (CIDInit)
+%%BeginResource: CMap (Ext-H)
+%%Title: (Ext-H Adobe Japan1 2)
+%%Version: 6.001
+%%Copyright: -----------------------------------------------------------
+%%Copyright: Copyright 1990-1997 Adobe Systems Incorporated.
+%%Copyright: All Rights Reserved.
+%%Copyright:
+%%Copyright: Patents Pending
+%%Copyright:
+%%Copyright: NOTICE: All information contained herein is the property
+%%Copyright: of Adobe Systems Incorporated.
+%%Copyright:
+%%Copyright: Permission is granted for redistribution of this file
+%%Copyright: provided this copyright notice is maintained intact and
+%%Copyright: that the contents of this file are not altered in any
+%%Copyright: way from its original form.
+%%Copyright:
+%%Copyright: PostScript and Display PostScript are trademarks of
+%%Copyright: Adobe Systems Incorporated which may be registered in
+%%Copyright: certain jurisdictions.
+%%Copyright: -----------------------------------------------------------
+%%EndComments
+
+/CIDInit /ProcSet findresource begin
+
+12 dict begin
+
+begincmap
+
+/CIDSystemInfo 3 dict dup begin
+ /Registry (Adobe) def
+ /Ordering (Japan1) def
+ /Supplement 2 def
+end def
+
+/CMapName /Ext-H def
+/CMapVersion 6.001 def
+/CMapType 1 def
+
+/UIDOffset 380 def
+/XUID [1 10 25331] def
+
+/WMode 0 def
+
+1 begincodespacerange
+ <2121> <7E7E>
+endcodespacerange
+
+100 begincidrange
+<2121> <2168> 633
+<2169> <2169> 7478
+<216a> <217e> 706
+<2221> <222e> 727
+<2330> <2339> 780
+<2341> <235a> 790
+<2361> <237a> 816
+<2421> <2473> 842
+<2521> <2576> 925
+<2621> <2638> 1011
+<2641> <2658> 1035
+<2721> <2741> 1059
+<2751> <2771> 1092
+<2921> <295f> 232
+<2960> <2960> 390
+<2961> <297e> 296
+<2a21> <2a5f> 327
+<2a60> <2a7e> 391
+<2b21> <2b71> 422
+<2b72> <2b72> 295
+<2b73> <2b7e> 503
+<2c24> <2c6f> 7479
+<2d21> <2d3e> 7555
+<2d40> <2d56> 7585
+<2d5f> <2d5f> 8323
+<2d60> <2d6f> 7608
+<2d70> <2d70> 762
+<2d71> <2d71> 761
+<2d72> <2d72> 769
+<2d73> <2d79> 7624
+<2d7a> <2d7a> 768
+<2d7b> <2d7c> 7631
+<3021> <3021> 1125
+<3022> <3022> 7633
+<3023> <3032> 1127
+<3033> <3033> 7330
+<3034> <303a> 1144
+<303b> <303b> 7634
+<303c> <306d> 1152
+<306e> <306e> 7635
+<306f> <3072> 1203
+<3073> <3073> 7636
+<3074> <307b> 1208
+<307c> <307c> 7637
+<307d> <307e> 1217
+<3121> <3129> 1219
+<312a> <312a> 7638
+<312b> <3134> 1229
+<3135> <3135> 7639
+<3136> <3138> 1240
+<3139> <3139> 7640
+<313a> <313b> 1244
+<313c> <313d> 7641
+<313e> <3141> 1248
+<3142> <3142> 7643
+<3143> <316a> 1253
+<316b> <316b> 7644
+<316c> <317e> 1294
+<3221> <3227> 1313
+<3228> <3228> 7645
+<3229> <3229> 7369
+<322a> <322a> 7646
+<322b> <325f> 1323
+<3260> <3260> 7647
+<3261> <3279> 1377
+<327a> <327a> 7648
+<327b> <327c> 1403
+<327d> <327d> 7649
+<327e> <327e> 1406
+<3321> <3321> 1407
+<3322> <3322> 7650
+<3323> <3341> 1409
+<3342> <3342> 6497
+<3343> <3348> 1441
+<3349> <3349> 5023
+<334a> <3364> 1448
+<3365> <3365> 7651
+<3366> <336a> 1476
+<336b> <336b> 7652
+<336c> <3372> 1482
+<3373> <3373> 7653
+<3374> <3375> 1490
+<3376> <3376> 5937
+<3377> <3379> 1493
+<337a> <337a> 7654
+<337b> <337e> 1497
+<3421> <3441> 1501
+<3442> <3442> 7655
+<3443> <3443> 5490
+<3444> <344c> 1536
+<344d> <344d> 7656
+<344e> <3451> 1546
+<3452> <3452> 6688
+<3453> <3464> 1551
+<3465> <3465> 7657
+<3466> <347e> 1570
+<3521> <352a> 1595
+<352b> <352b> 7658
+<352c> <353f> 1606
+<3540> <3540> 7659
+endcidrange
+
+100 begincidrange
+<3541> <357e> 1627
+<3621> <3621> 1689
+<3622> <3622> 7660
+<3623> <3629> 1691
+<362a> <362a> 7661
+<362b> <3645> 1699
+<3646> <3646> 7474
+<3647> <364e> 1727
+<364f> <364f> 7662
+<3650> <366c> 1736
+<366d> <366d> 7663
+<366e> <3673> 1766
+<3674> <3674> 7664
+<3675> <367a> 1773
+<367b> <367b> 7665
+<367c> <367c> 1780
+<367d> <367d> 7666
+<367e> <367e> 1782
+<3721> <3723> 1783
+<3724> <3724> 7667
+<3725> <3736> 1787
+<3737> <3737> 7668
+<3738> <3744> 1806
+<3745> <3745> 7669
+<3746> <374d> 1820
+<374e> <374e> 7670
+<374f> <3751> 1829
+<3752> <3752> 7671
+<3753> <3754> 1833
+<3755> <3755> 7672
+<3756> <375a> 1836
+<375b> <375b> 7181
+<375c> <3763> 1842
+<3764> <3764> 7673
+<3765> <3770> 1851
+<3771> <3771> 7674
+<3772> <3778> 1864
+<3779> <3779> 7675
+<377a> <377d> 1872
+<377e> <377e> 7676
+<3821> <3833> 1877
+<3834> <3834> 7677
+<3835> <3840> 1897
+<3841> <3841> 7678
+<3842> <387e> 1910
+<3921> <392a> 1971
+<392b> <392b> 7679
+<392c> <3936> 1982
+<3937> <3937> 7680
+<3938> <3941> 1994
+<3942> <3942> 7681
+<3943> <395b> 2005
+<395c> <395c> 5853
+<395d> <396c> 2031
+<396d> <396d> 7682
+<396e> <3973> 2048
+<3974> <3974> 7683
+<3975> <3978> 2055
+<3979> <3979> 7684
+<397a> <397e> 2060
+<3a21> <3a52> 2065
+<3a53> <3a53> 7685
+<3a54> <3a66> 2116
+<3a67> <3a67> 7686
+<3a68> <3a73> 2136
+<3a74> <3a74> 7687
+<3a75> <3a7e> 2149
+<3b21> <3b26> 2159
+<3b27> <3b27> 7688
+<3b28> <3b29> 2166
+<3b2a> <3b2a> 7689
+<3b2b> <3b2b> 2169
+<3b2c> <3b2c> 7690
+<3b2d> <3b38> 2171
+<3b39> <3b39> 7691
+<3b3a> <3b7e> 2184
+<3c21> <3c37> 2253
+<3c38> <3c38> 7692
+<3c39> <3c47> 2277
+<3c48> <3c48> 7693
+<3c49> <3c49> 6441
+<3c4a> <3c56> 2294
+<3c57> <3c57> 7694
+<3c58> <3c5c> 2308
+<3c5d> <3c5e> 7695
+<3c5f> <3c7e> 2315
+<3d21> <3d2a> 2347
+<3d2b> <3d2b> 7697
+<3d2c> <3d35> 2358
+<3d36> <3d36> 7698
+<3d37> <3d6b> 2369
+<3d6c> <3d6d> 7699
+<3d6e> <3d71> 2424
+<3d72> <3d73> 7701
+<3d74> <3d7e> 2430
+<3e21> <3e24> 2441
+<3e25> <3e25> 7703
+<3e26> <3e32> 2446
+<3e33> <3e33> 7704
+<3e34> <3e3e> 2460
+endcidrange
+
+100 begincidrange
+<3e3f> <3e3f> 7705
+<3e40> <3e54> 2472
+<3e55> <3e55> 7706
+<3e56> <3e5e> 2494
+<3e5f> <3e5f> 7707
+<3e60> <3e63> 2504
+<3e64> <3e64> 7708
+<3e65> <3e7e> 2509
+<3f21> <3f29> 2535
+<3f2a> <3f2a> 7709
+<3f2b> <3f58> 2545
+<3f59> <3f59> 7710
+<3f5a> <3f5f> 2592
+<3f60> <3f60> 7711
+<3f61> <3f68> 2599
+<3f69> <3f69> 7712
+<3f6a> <3f7e> 2608
+<4021> <4021> 2629
+<4022> <4022> 7713
+<4023> <4041> 2631
+<4042> <4042> 7714
+<4043> <4065> 2663
+<4066> <4066> 7715
+<4067> <4070> 2699
+<4071> <4072> 7716
+<4073> <4078> 2711
+<4079> <407a> 7718
+<407b> <407e> 2719
+<4121> <4126> 2723
+<4127> <4127> 7720
+<4128> <4128> 6766
+<4129> <4138> 2731
+<4139> <4139> 7721
+<413a> <414b> 2748
+<414c> <414c> 7722
+<414d> <414e> 2767
+<414f> <414f> 7723
+<4150> <415e> 2770
+<415f> <415f> 7724
+<4160> <4168> 2786
+<4169> <4169> 7725
+<416a> <417e> 2796
+<4221> <423c> 2817
+<423d> <423d> 7726
+<423e> <424c> 2846
+<424d> <424d> 7727
+<424e> <425b> 2862
+<425c> <425c> 7728
+<425d> <4262> 2877
+<4263> <4263> 7729
+<4264> <426e> 2884
+<426f> <426f> 7730
+<4270> <4274> 2896
+<4275> <4276> 7731
+<4277> <427c> 2903
+<427d> <427d> 7733
+<427e> <427e> 2910
+<4321> <4326> 2911
+<4327> <4327> 7734
+<4328> <4328> 2918
+<4329> <432a> 7735
+<432b> <432c> 2921
+<432d> <432e> 7737
+<432f> <433c> 2925
+<433d> <433d> 7739
+<433e> <436f> 2940
+<4370> <4370> 7740
+<4371> <4374> 2991
+<4375> <4375> 7741
+<4376> <437b> 2996
+<437c> <437c> 7742
+<437d> <437e> 3003
+<4421> <443c> 3005
+<443d> <443d> 7743
+<443e> <4447> 3034
+<4448> <4448> 7744
+<4449> <4449> 3045
+<444a> <444a> 7745
+<444b> <444c> 3047
+<444d> <444d> 7746
+<444e> <444e> 3050
+<444f> <444f> 7747
+<4450> <445a> 3052
+<445b> <445b> 4533
+<445c> <447e> 3064
+<4521> <4521> 3099
+<4522> <4522> 7748
+<4523> <4526> 3101
+<4527> <4527> 7749
+<4528> <452d> 3106
+<452e> <452e> 7750
+<452f> <4535> 3113
+<4536> <4536> 7751
+<4537> <453e> 3121
+<453f> <453f> 7752
+<4540> <4547> 3130
+<4548> <4548> 7753
+<4549> <454a> 3139
+<454b> <454b> 7754
+<454c> <4550> 3142
+endcidrange
+
+100 begincidrange
+<4551> <4552> 7755
+<4553> <4556> 3149
+<4557> <4557> 5855
+<4558> <4563> 3154
+<4564> <4564> 7757
+<4565> <456d> 3167
+<456e> <456e> 5200
+<456f> <4572> 3177
+<4573> <4573> 5430
+<4574> <4577> 3182
+<4578> <4578> 7758
+<4579> <457e> 3187
+<4621> <463d> 3193
+<463e> <463e> 7759
+<463f> <4641> 3223
+<4642> <4642> 7760
+<4643> <4653> 3227
+<4654> <4655> 7761
+<4656> <465a> 3246
+<465b> <465c> 7763
+<465d> <4660> 3253
+<4661> <4661> 7765
+<4662> <4665> 3258
+<4666> <4667> 7766
+<4668> <4669> 3264
+<466a> <466a> 7768
+<466b> <4675> 3267
+<4676> <4676> 6893
+<4677> <467e> 3279
+<4721> <4728> 3287
+<4729> <4729> 7769
+<472a> <4738> 3296
+<4739> <4739> 7770
+<473a> <4756> 3312
+<4757> <4757> 7771
+<4758> <4766> 3342
+<4767> <4767> 7772
+<4768> <4768> 6537
+<4769> <4769> 7773
+<476a> <476c> 3360
+<476d> <476d> 7774
+<476e> <477e> 3364
+<4821> <4823> 3381
+<4824> <4824> 7775
+<4825> <482d> 3385
+<482e> <482e> 7776
+<482f> <482f> 3395
+<4830> <4830> 7777
+<4831> <4853> 3397
+<4854> <4854> 7778
+<4855> <4861> 3433
+<4862> <4862> 7779
+<4863> <4874> 3447
+<4875> <4875> 7780
+<4876> <487e> 3466
+<4921> <4921> 3475
+<4922> <4923> 7781
+<4924> <492e> 3478
+<492f> <492f> 7783
+<4930> <4930> 5179
+<4931> <4931> 3491
+<4932> <4932> 7784
+<4933> <4934> 3493
+<4935> <4935> 7785
+<4936> <493f> 3496
+<4940> <4940> 7786
+<4941> <494d> 3507
+<494e> <494e> 7787
+<494f> <4950> 3521
+<4951> <4951> 7788
+<4952> <497e> 3524
+<4a21> <4a42> 3569
+<4a43> <4a43> 7789
+<4a44> <4a4c> 3604
+<4a4d> <4a4d> 7790
+<4a4e> <4a59> 3614
+<4a5a> <4a5a> 7791
+<4a5b> <4a78> 3627
+<4a79> <4a79> 7792
+<4a7a> <4a7e> 3658
+<4b21> <4b21> 3663
+<4b22> <4b22> 7793
+<4b23> <4b28> 3665
+<4b29> <4b29> 7794
+<4b2a> <4b4a> 3672
+<4b4b> <4b4b> 7795
+<4b4c> <4b69> 3706
+<4b6a> <4b6a> 7475
+<4b6b> <4b6f> 3737
+<4b70> <4b70> 7796
+<4b71> <4b78> 3743
+<4b79> <4b79> 4143
+<4b7a> <4b7e> 3752
+<4c21> <4c4c> 3757
+<4c4d> <4c4d> 7797
+<4c4e> <4c58> 3802
+<4c59> <4c59> 7798
+<4c5a> <4c5e> 3814
+<4c5f> <4c5f> 7799
+<4c60> <4c61> 3820
+endcidrange
+
+100 begincidrange
+<4c62> <4c62> 7800
+<4c63> <4c78> 3823
+<4c79> <4c79> 6453
+<4c7a> <4c7a> 7801
+<4c7b> <4c7b> 3847
+<4c7c> <4c7c> 7802
+<4c7d> <4c7d> 3849
+<4c7e> <4c7e> 7803
+<4d21> <4d31> 3851
+<4d32> <4d32> 7804
+<4d33> <4d4f> 3869
+<4d50> <4d50> 7805
+<4d51> <4d53> 3899
+<4d54> <4d54> 7806
+<4d55> <4d59> 3903
+<4d5a> <4d5a> 7476
+<4d5b> <4d68> 3909
+<4d69> <4d69> 7807
+<4d6a> <4d7e> 3924
+<4e21> <4e4a> 3945
+<4e4b> <4e4b> 7808
+<4e4c> <4e79> 3988
+<4e7a> <4e7b> 7809
+<4e7c> <4e7e> 4036
+<4f21> <4f21> 7811
+<4f22> <4f30> 4040
+<4f31> <4f31> 7812
+<4f32> <4f35> 4056
+<4f36> <4f36> 6007
+<4f37> <4f38> 4061
+<4f39> <4f39> 7813
+<4f3a> <4f53> 4064
+<5021> <5055> 4090
+<5056> <5056> 3751
+<5057> <507e> 4144
+<5121> <513c> 4184
+<513d> <513d> 7814
+<513e> <5146> 4213
+<5147> <5147> 7815
+<5148> <514a> 4223
+<514b> <514b> 7816
+<514c> <514c> 4227
+<514d> <514d> 7817
+<514e> <517e> 4229
+<5221> <527e> 4278
+<5321> <532f> 4372
+<5330> <5330> 7818
+<5331> <5339> 4388
+<533a> <533a> 7819
+<533b> <534f> 4398
+<5350> <5350> 7820
+<5351> <535d> 4420
+<535e> <535e> 7821
+<535f> <536a> 4434
+<536b> <536b> 7822
+<536c> <537e> 4447
+<5421> <5443> 4466
+<5444> <5444> 7823
+<5445> <5463> 4502
+<5464> <5464> 3063
+<5465> <547e> 4534
+<5521> <553c> 4560
+<553d> <553d> 7824
+<553e> <5562> 4589
+<5563> <5563> 7825
+<5564> <557e> 4627
+<5621> <5621> 4654
+<5622> <5622> 7826
+<5623> <5671> 4656
+<5672> <5672> 7827
+<5673> <567e> 4736
+<5721> <577e> 4748
+<5821> <5823> 4842
+<5824> <5824> 7828
+<5825> <587e> 4846
+<5921> <595f> 4936
+<5960> <5960> 7829
+<5961> <596b> 5000
+<596c> <596c> 7830
+<596d> <5977> 5012
+<5978> <5978> 1447
+<5979> <597e> 5024
+<5a21> <5a38> 5030
+<5a39> <5a39> 7831
+<5a3a> <5a4c> 5055
+<5a4d> <5a4d> 7832
+<5a4e> <5a7e> 5075
+<5b21> <5b44> 5124
+<5b45> <5b45> 7833
+<5b46> <5b49> 5161
+<5b4a> <5b4a> 7834
+<5b4b> <5b57> 5166
+<5b58> <5b58> 3490
+<5b59> <5b6a> 5180
+<5b6b> <5b6b> 7835
+<5b6c> <5b6c> 5199
+<5b6d> <5b6d> 3176
+<5b6e> <5b73> 5201
+<5b74> <5b74> 7836
+<5b75> <5b7e> 5208
+endcidrange
+
+100 begincidrange
+<5c21> <5c7e> 5218
+<5d21> <5d7e> 5312
+<5e21> <5e38> 5406
+<5e39> <5e39> 3181
+<5e3a> <5e4f> 5431
+<5e50> <5e50> 7837
+<5e51> <5e74> 5454
+<5e75> <5e75> 1535
+<5e76> <5e7e> 5491
+<5f21> <5f72> 5500
+<5f73> <5f73> 7838
+<5f74> <5f7e> 5583
+<6021> <6025> 5594
+<6026> <6026> 7839
+<6027> <605e> 5600
+<605f> <605f> 7840
+<6060> <6075> 5657
+<6076> <6076> 7477
+<6077> <607e> 5680
+<6121> <612a> 5688
+<612b> <612b> 7841
+<612c> <612f> 5699
+<6130> <6131> 7842
+<6132> <617e> 5705
+<6221> <622a> 5782
+<622b> <622b> 7844
+<622c> <6267> 5793
+<6268> <6268> 2030
+<6269> <6269> 5854
+<626a> <626a> 3153
+<626b> <626e> 5856
+<626f> <626f> 7845
+<6270> <627e> 5861
+<6321> <6349> 5876
+<634a> <634a> 7846
+<634b> <6353> 5918
+<6354> <6354> 7847
+<6355> <635d> 5928
+<635e> <635e> 1492
+<635f> <637e> 5938
+<6421> <6438> 5970
+<6439> <6439> 7848
+<643a> <6445> 5995
+<6446> <6446> 4060
+<6447> <6463> 6008
+<6464> <6464> 7849
+<6465> <646d> 6038
+<646e> <646e> 7850
+<646f> <647e> 6048
+<6521> <6538> 6064
+<6539> <6539> 7851
+<653a> <653a> 6089
+<653b> <653b> 7852
+<653c> <6545> 6091
+<6546> <6546> 7853
+<6547> <657e> 6102
+<6621> <6645> 6158
+<6646> <6646> 7854
+<6647> <667e> 6196
+<6721> <6763> 6252
+<6764> <6764> 7855
+<6765> <6768> 6320
+<6769> <6769> 7856
+<676a> <6771> 6325
+<6772> <6772> 7857
+<6773> <677e> 6334
+<6821> <6833> 6346
+<6834> <6834> 7858
+<6835> <683a> 6366
+<683b> <683b> 7859
+<683c> <6873> 6373
+<6874> <6874> 7860
+<6875> <687e> 6430
+<6921> <6921> 6440
+<6922> <6922> 2293
+<6923> <692d> 6442
+<692e> <692e> 3845
+<692f> <693b> 6454
+<693c> <693c> 7861
+<693d> <6959> 6468
+<695a> <695a> 1440
+<695b> <697e> 6498
+<6a21> <6a23> 6534
+<6a24> <6a24> 3358
+<6a25> <6a26> 6538
+<6a27> <6a27> 7862
+<6a28> <6a3c> 6541
+<6a3d> <6a3d> 7863
+<6a3e> <6a6e> 6563
+<6a6f> <6a6f> 7864
+<6a70> <6a7e> 6613
+<6b21> <6b31> 6628
+<6b32> <6b32> 7865
+<6b33> <6b5c> 6646
+<6b5d> <6b5d> 1550
+<6b5e> <6b65> 6689
+<6b66> <6b66> 7866
+<6b67> <6b75> 6698
+<6b76> <6b76> 7867
+<6b77> <6b7e> 6714
+endcidrange
+
+61 begincidrange
+<6c21> <6c4c> 6722
+<6c4d> <6c4d> 2730
+<6c4e> <6c68> 6767
+<6c69> <6c69> 7868
+<6c6a> <6c73> 6795
+<6c74> <6c74> 7869
+<6c75> <6c7e> 6806
+<6d21> <6d4d> 6816
+<6d4e> <6d4e> 7870
+<6d4f> <6d6b> 6862
+<6d6c> <6d6c> 7871
+<6d6d> <6d6d> 6892
+<6d6e> <6d6e> 7872
+<6d6f> <6d7e> 6894
+<6e21> <6e28> 6910
+<6e29> <6e29> 7873
+<6e2a> <6e3c> 6919
+<6e3d> <6e3d> 7874
+<6e3e> <6e56> 6939
+<6e57> <6e57> 7875
+<6e58> <6e7e> 6965
+<6f21> <6f64> 7004
+<6f65> <6f65> 7876
+<6f66> <6f7e> 7073
+<7021> <7032> 7098
+<7033> <7033> 7877
+<7034> <7044> 7117
+<7045> <7045> 7878
+<7046> <7050> 7135
+<7051> <7051> 7879
+<7052> <7056> 7147
+<7057> <7057> 7880
+<7058> <7073> 7153
+<7074> <7074> 1841
+<7075> <7075> 7881
+<7076> <707e> 7183
+<7121> <717e> 7192
+<7221> <722c> 7286
+<722d> <722d> 7882
+<722e> <723b> 7299
+<723c> <723c> 7883
+<723d> <724c> 7314
+<724d> <724d> 1143
+<724e> <724e> 7884
+<724f> <7273> 7332
+<7274> <7274> 1321
+<7275> <727e> 7370
+<7321> <7350> 7380
+<7351> <7351> 7885
+<7352> <737c> 7429
+<737d> <737d> 7886
+<737e> <737e> 7473
+<7921> <797e> 8359
+<7a21> <7a35> 8453
+<7a36> <7a36> 1993
+<7a37> <7a7e> 8474
+<7b21> <7b7e> 8546
+<7c21> <7c6e> 8640
+<7c71> <7c7a> 8092
+<7c7b> <7c7b> 751
+<7c7c> <7c7e> 8005
+endcidrange
+endcmap
+CMapName currentdict /CMap defineresource pop
+end
+end
+
+%%EndResource
+%%EOF
diff --git a/src/main/resources/Resources/cmap/Ext-RKSJ-H b/src/main/resources/Resources/cmap/Ext-RKSJ-H
new file mode 100644
index 0000000..4286dfe
--- /dev/null
+++ b/src/main/resources/Resources/cmap/Ext-RKSJ-H
@@ -0,0 +1 @@
+%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%IncludeResource: ProcSet (CIDInit) %%BeginResource: CMap (Ext-RKSJ-H) %%Title: (Ext-RKSJ-H Adobe Japan1 2) %%Version: 11.001 %%Copyright: ----------------------------------------------------------- %%Copyright: Copyright 1990-1998 Adobe Systems Incorporated. %%Copyright: All Rights Reserved. %%Copyright: %%Copyright: Patents Pending %%Copyright: %%Copyright: NOTICE: All information contained herein is the property %%Copyright: of Adobe Systems Incorporated. %%Copyright: %%Copyright: Permission is granted for redistribution of this file %%Copyright: provided this copyright notice is maintained intact and %%Copyright: that the contents of this file are not altered in any %%Copyright: way from its original form. %%Copyright: %%Copyright: PostScript and Display PostScript are trademarks of %%Copyright: Adobe Systems Incorporated which may be registered in %%Copyright: certain jurisdictions. %%Copyright: ----------------------------------------------------------- %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo 3 dict dup begin /Registry (Adobe) def /Ordering (Japan1) def /Supplement 2 def end def /CMapName /Ext-RKSJ-H def /CMapVersion 11.001 def /CMapType 1 def /UIDOffset 70 def /XUID [1 10 25332] def /WMode 0 def 4 begincodespacerange <00> <80> <8140> <9FFC> <A0> <DF> <E040> <FCFC> endcodespacerange 1 beginnotdefrange <00> <1f> 231 endnotdefrange 100 begincidrange <20> <7e> 231 <8140> <817e> 633 <8180> <8188> 696 <8189> <8189> 7478 <818a> <81ac> 706 <824f> <8258> 780 <8260> <8279> 790 <8281> <829a> 816 <829f> <82f1> 842 <8340> <837e> 925 <8380> <8396> 988 <839f> <83b6> 1011 <83bf> <83d6> 1035 <8440> <8460> 1059 <8470> <847e> 1092 <8480> <8491> 1107 <8540> <857e> 232 <8580> <8580> 390 <8581> <859e> 296 <859f> <85dd> 327 <85de> <85fc> 391 <8640> <867e> 422 <8680> <8691> 485 <8692> <8692> 295 <8693> <869e> 503 <86a2> <86ed> 7479 <8740> <875d> 7555 <875f> <8775> 7585 <877e> <877e> 8323 <8780> <878f> 7608 <8790> <8790> 762 <8791> <8791> 761 <8792> <8792> 769 <8793> <8799> 7624 <879a> <879a> 768 <879b> <879c> 7631 <889f> <889f> 1125 <88a0> <88a0> 7633 <88a1> <88b0> 1127 <88b1> <88b1> 7330 <88b2> <88b8> 1144 <88b9> <88b9> 7634 <88ba> <88eb> 1152 <88ec> <88ec> 7635 <88ed> <88f0> 1203 <88f1> <88f1> 7636 <88f2> <88f9> 1208 <88fa> <88fa> 7637 <88fb> <88fc> 1217 <8940> <8948> 1219 <8949> <8949> 7638 <894a> <8953> 1229 <8954> <8954> 7639 <8955> <8957> 1240 <8958> <8958> 7640 <8959> <895a> 1244 <895b> <895c> 7641 <895d> <8960> 1248 <8961> <8961> 7643 <8962> <897e> 1253 <8980> <898a> 1282 <898b> <898b> 7644 <898c> <89a5> 1294 <89a6> <89a6> 7645 <89a7> <89a7> 7369 <89a8> <89a8> 7646 <89a9> <89dd> 1323 <89de> <89de> 7647 <89df> <89f7> 1377 <89f8> <89f8> 7648 <89f9> <89fa> 1403 <89fb> <89fb> 7649 <89fc> <89fc> 1406 <8a40> <8a40> 1407 <8a41> <8a41> 7650 <8a42> <8a60> 1409 <8a61> <8a61> 6497 <8a62> <8a67> 1441 <8a68> <8a68> 5023 <8a69> <8a7e> 1448 <8a80> <8a84> 1470 <8a85> <8a85> 7651 <8a86> <8a8a> 1476 <8a8b> <8a8b> 7652 <8a8c> <8a92> 1482 <8a93> <8a93> 7653 <8a94> <8a95> 1490 <8a96> <8a96> 5937 <8a97> <8a99> 1493 <8a9a> <8a9a> 7654 <8a9b> <8abf> 1497 <8ac0> <8ac0> 7655 <8ac1> <8ac1> 5490 <8ac2> <8aca> 1536 <8acb> <8acb> 7656 <8acc> <8acf> 1546 <8ad0> <8ad0> 6688 <8ad1> <8ae2> 1551 <8ae3> <8ae3> 7657 <8ae4> <8afc> 1570 endcidrange 100 begincidrange <8b40> <8b49> 1595 <8b4a> <8b4a> 7658 <8b4b> <8b5e> 1606 <8b5f> <8b5f> 7659 <8b60> <8b7e> 1627 <8b80> <8b9f> 1658 <8ba0> <8ba0> 7660 <8ba1> <8ba7> 1691 <8ba8> <8ba8> 7661 <8ba9> <8bc3> 1699 <8bc4> <8bc4> 7474 <8bc5> <8bcc> 1727 <8bcd> <8bcd> 7662 <8bce> <8bea> 1736 <8beb> <8beb> 7663 <8bec> <8bf1> 1766 <8bf2> <8bf2> 7664 <8bf3> <8bf8> 1773 <8bf9> <8bf9> 7665 <8bfa> <8bfa> 1780 <8bfb> <8bfb> 7666 <8bfc> <8bfc> 1782 <8c40> <8c42> 1783 <8c43> <8c43> 7667 <8c44> <8c55> 1787 <8c56> <8c56> 7668 <8c57> <8c63> 1806 <8c64> <8c64> 7669 <8c65> <8c6c> 1820 <8c6d> <8c6d> 7670 <8c6e> <8c70> 1829 <8c71> <8c71> 7671 <8c72> <8c73> 1833 <8c74> <8c74> 7672 <8c75> <8c79> 1836 <8c7a> <8c7a> 7181 <8c7b> <8c7e> 1842 <8c80> <8c83> 1846 <8c84> <8c84> 7673 <8c85> <8c90> 1851 <8c91> <8c91> 7674 <8c92> <8c98> 1864 <8c99> <8c99> 7675 <8c9a> <8c9d> 1872 <8c9e> <8c9e> 7676 <8c9f> <8cb1> 1877 <8cb2> <8cb2> 7677 <8cb3> <8cbe> 1897 <8cbf> <8cbf> 7678 <8cc0> <8cfc> 1910 <8d40> <8d49> 1971 <8d4a> <8d4a> 7679 <8d4b> <8d55> 1982 <8d56> <8d56> 7680 <8d57> <8d60> 1994 <8d61> <8d61> 7681 <8d62> <8d7a> 2005 <8d7b> <8d7b> 5853 <8d7c> <8d7e> 2031 <8d80> <8d8c> 2034 <8d8d> <8d8d> 7682 <8d8e> <8d93> 2048 <8d94> <8d94> 7683 <8d95> <8d98> 2055 <8d99> <8d99> 7684 <8d9a> <8dd0> 2060 <8dd1> <8dd1> 7685 <8dd2> <8de4> 2116 <8de5> <8de5> 7686 <8de6> <8df1> 2136 <8df2> <8df2> 7687 <8df3> <8dfc> 2149 <8e40> <8e45> 2159 <8e46> <8e46> 7688 <8e47> <8e48> 2166 <8e49> <8e49> 7689 <8e4a> <8e4a> 2169 <8e4b> <8e4b> 7690 <8e4c> <8e57> 2171 <8e58> <8e58> 7691 <8e59> <8e7e> 2184 <8e80> <8eb5> 2222 <8eb6> <8eb6> 7692 <8eb7> <8ec5> 2277 <8ec6> <8ec6> 7693 <8ec7> <8ec7> 6441 <8ec8> <8ed4> 2294 <8ed5> <8ed5> 7694 <8ed6> <8eda> 2308 <8edb> <8edc> 7695 <8edd> <8efc> 2315 <8f40> <8f49> 2347 <8f4a> <8f4a> 7697 <8f4b> <8f54> 2358 <8f55> <8f55> 7698 <8f56> <8f7e> 2369 <8f80> <8f8b> 2410 <8f8c> <8f8d> 7699 <8f8e> <8f91> 2424 <8f92> <8f93> 7701 endcidrange 100 begincidrange <8f94> <8fa2> 2430 <8fa3> <8fa3> 7703 <8fa4> <8fb0> 2446 <8fb1> <8fb1> 7704 <8fb2> <8fbc> 2460 <8fbd> <8fbd> 7705 <8fbe> <8fd2> 2472 <8fd3> <8fd3> 7706 <8fd4> <8fdc> 2494 <8fdd> <8fdd> 7707 <8fde> <8fe1> 2504 <8fe2> <8fe2> 7708 <8fe3> <8ffc> 2509 <9040> <9048> 2535 <9049> <9049> 7709 <904a> <9077> 2545 <9078> <9078> 7710 <9079> <907e> 2592 <9080> <9080> 7711 <9081> <9088> 2599 <9089> <9089> 7712 <908a> <909f> 2608 <90a0> <90a0> 7713 <90a1> <90bf> 2631 <90c0> <90c0> 7714 <90c1> <90e3> 2663 <90e4> <90e4> 7715 <90e5> <90ee> 2699 <90ef> <90f0> 7716 <90f1> <90f6> 2711 <90f7> <90f8> 7718 <90f9> <90fc> 2719 <9140> <9145> 2723 <9146> <9146> 7720 <9147> <9147> 6766 <9148> <9157> 2731 <9158> <9158> 7721 <9159> <916a> 2748 <916b> <916b> 7722 <916c> <916d> 2767 <916e> <916e> 7723 <916f> <917d> 2770 <917e> <917e> 7724 <9180> <9188> 2786 <9189> <9189> 7725 <918a> <91ba> 2796 <91bb> <91bb> 7726 <91bc> <91ca> 2846 <91cb> <91cb> 7727 <91cc> <91d9> 2862 <91da> <91da> 7728 <91db> <91e0> 2877 <91e1> <91e1> 7729 <91e2> <91ec> 2884 <91ed> <91ed> 7730 <91ee> <91f2> 2896 <91f3> <91f4> 7731 <91f5> <91fa> 2903 <91fb> <91fb> 7733 <91fc> <91fc> 2910 <9240> <9245> 2911 <9246> <9246> 7734 <9247> <9247> 2918 <9248> <9249> 7735 <924a> <924b> 2921 <924c> <924d> 7737 <924e> <925b> 2925 <925c> <925c> 7739 <925d> <927e> 2940 <9280> <928f> 2974 <9290> <9290> 7740 <9291> <9294> 2991 <9295> <9295> 7741 <9296> <929b> 2996 <929c> <929c> 7742 <929d> <92ba> 3003 <92bb> <92bb> 7743 <92bc> <92c5> 3034 <92c6> <92c6> 7744 <92c7> <92c7> 3045 <92c8> <92c8> 7745 <92c9> <92ca> 3047 <92cb> <92cb> 7746 <92cc> <92cc> 3050 <92cd> <92cd> 7747 <92ce> <92d8> 3052 <92d9> <92d9> 4533 <92da> <92fc> 3064 <9340> <9340> 3099 <9341> <9341> 7748 <9342> <9345> 3101 <9346> <9346> 7749 <9347> <934c> 3106 <934d> <934d> 7750 <934e> <9354> 3113 <9355> <9355> 7751 <9356> <935d> 3121 <935e> <935e> 7752 <935f> <9366> 3130 <9367> <9367> 7753 endcidrange 100 begincidrange <9368> <9369> 3139 <936a> <936a> 7754 <936b> <936f> 3142 <9370> <9371> 7755 <9372> <9375> 3149 <9376> <9376> 5855 <9377> <937e> 3154 <9380> <9383> 3162 <9384> <9384> 7757 <9385> <938d> 3167 <938e> <938e> 5200 <938f> <9392> 3177 <9393> <9393> 5430 <9394> <9397> 3182 <9398> <9398> 7758 <9399> <93bb> 3187 <93bc> <93bc> 7759 <93bd> <93bf> 3223 <93c0> <93c0> 7760 <93c1> <93d1> 3227 <93d2> <93d3> 7761 <93d4> <93d8> 3246 <93d9> <93da> 7763 <93db> <93de> 3253 <93df> <93df> 7765 <93e0> <93e3> 3258 <93e4> <93e5> 7766 <93e6> <93e7> 3264 <93e8> <93e8> 7768 <93e9> <93f3> 3267 <93f4> <93f4> 6893 <93f5> <93fc> 3279 <9440> <9447> 3287 <9448> <9448> 7769 <9449> <9457> 3296 <9458> <9458> 7770 <9459> <9475> 3312 <9476> <9476> 7771 <9477> <947e> 3342 <9480> <9486> 3350 <9487> <9487> 7772 <9488> <9488> 6537 <9489> <9489> 7773 <948a> <948c> 3360 <948d> <948d> 7774 <948e> <94a1> 3364 <94a2> <94a2> 7775 <94a3> <94ab> 3385 <94ac> <94ac> 7776 <94ad> <94ad> 3395 <94ae> <94ae> 7777 <94af> <94d1> 3397 <94d2> <94d2> 7778 <94d3> <94df> 3433 <94e0> <94e0> 7779 <94e1> <94f2> 3447 <94f3> <94f3> 7780 <94f4> <94fc> 3466 <9540> <9540> 3475 <9541> <9542> 7781 <9543> <954d> 3478 <954e> <954e> 7783 <954f> <954f> 5179 <9550> <9550> 3491 <9551> <9551> 7784 <9552> <9553> 3493 <9554> <9554> 7785 <9555> <955e> 3496 <955f> <955f> 7786 <9560> <956c> 3507 <956d> <956d> 7787 <956e> <956f> 3521 <9570> <9570> 7788 <9571> <957e> 3524 <9580> <95c0> 3538 <95c1> <95c1> 7789 <95c2> <95ca> 3604 <95cb> <95cb> 7790 <95cc> <95d7> 3614 <95d8> <95d8> 7791 <95d9> <95f6> 3627 <95f7> <95f7> 7792 <95f8> <95fc> 3658 <9640> <9640> 3663 <9641> <9641> 7793 <9642> <9647> 3665 <9648> <9648> 7794 <9649> <9669> 3672 <966a> <966a> 7795 <966b> <967e> 3706 <9680> <9689> 3726 <968a> <968a> 7475 <968b> <968f> 3737 <9690> <9690> 7796 <9691> <9698> 3743 <9699> <9699> 4143 <969a> <96ca> 3752 <96cb> <96cb> 7797 <96cc> <96d6> 3802 <96d7> <96d7> 7798 endcidrange 100 begincidrange <96d8> <96dc> 3814 <96dd> <96dd> 7799 <96de> <96df> 3820 <96e0> <96e0> 7800 <96e1> <96f6> 3823 <96f7> <96f7> 6453 <96f8> <96f8> 7801 <96f9> <96f9> 3847 <96fa> <96fa> 7802 <96fb> <96fb> 3849 <96fc> <96fc> 7803 <9740> <9750> 3851 <9751> <9751> 7804 <9752> <976e> 3869 <976f> <976f> 7805 <9770> <9772> 3899 <9773> <9773> 7806 <9774> <9778> 3903 <9779> <9779> 7476 <977a> <977e> 3909 <9780> <9788> 3914 <9789> <9789> 7807 <978a> <97c8> 3924 <97c9> <97c9> 7808 <97ca> <97f7> 3988 <97f8> <97f9> 7809 <97fa> <97fc> 4036 <9840> <9840> 7811 <9841> <984f> 4040 <9850> <9850> 7812 <9851> <9854> 4056 <9855> <9855> 6007 <9856> <9857> 4061 <9858> <9858> 7813 <9859> <9872> 4064 <989f> <98d3> 4090 <98d4> <98d4> 3751 <98d5> <98fc> 4144 <9940> <995b> 4184 <995c> <995c> 7814 <995d> <9965> 4213 <9966> <9966> 7815 <9967> <9969> 4223 <996a> <996a> 7816 <996b> <996b> 4227 <996c> <996c> 7817 <996d> <997e> 4229 <9980> <99fc> 4247 <9a40> <9a4e> 4372 <9a4f> <9a4f> 7818 <9a50> <9a58> 4388 <9a59> <9a59> 7819 <9a5a> <9a6e> 4398 <9a6f> <9a6f> 7820 <9a70> <9a7c> 4420 <9a7d> <9a7d> 7821 <9a7e> <9a7e> 4434 <9a80> <9a8a> 4435 <9a8b> <9a8b> 7822 <9a8c> <9ac1> 4447 <9ac2> <9ac2> 7823 <9ac3> <9ae1> 4502 <9ae2> <9ae2> 3063 <9ae3> <9afc> 4534 <9b40> <9b5b> 4560 <9b5c> <9b5c> 7824 <9b5d> <9b7e> 4589 <9b80> <9b82> 4623 <9b83> <9b83> 7825 <9b84> <9b9f> 4627 <9ba0> <9ba0> 7826 <9ba1> <9bef> 4656 <9bf0> <9bf0> 7827 <9bf1> <9bfc> 4736 <9c40> <9c7e> 4748 <9c80> <9ca1> 4811 <9ca2> <9ca2> 7828 <9ca3> <9cfc> 4846 <9d40> <9d7e> 4936 <9d80> <9d80> 7829 <9d81> <9d8b> 5000 <9d8c> <9d8c> 7830 <9d8d> <9d97> 5012 <9d98> <9d98> 1447 <9d99> <9db6> 5024 <9db7> <9db7> 7831 <9db8> <9dca> 5055 <9dcb> <9dcb> 7832 <9dcc> <9dfc> 5075 <9e40> <9e63> 5124 <9e64> <9e64> 7833 <9e65> <9e68> 5161 <9e69> <9e69> 7834 <9e6a> <9e76> 5166 <9e77> <9e77> 3490 <9e78> <9e7e> 5180 <9e80> <9e8a> 5187 <9e8b> <9e8b> 7835 <9e8c> <9e8c> 5199 <9e8d> <9e8d> 3176 endcidrange 100 begincidrange <9e8e> <9e93> 5201 <9e94> <9e94> 7836 <9e95> <9efc> 5208 <9f40> <9f7e> 5312 <9f80> <9fb6> 5375 <9fb7> <9fb7> 3181 <9fb8> <9fcd> 5431 <9fce> <9fce> 7837 <9fcf> <9ff2> 5454 <9ff3> <9ff3> 1535 <9ff4> <9ffc> 5491 <a0> <df> 326 <e040> <e07e> 5500 <e080> <e092> 5563 <e093> <e093> 7838 <e094> <e0a3> 5583 <e0a4> <e0a4> 7839 <e0a5> <e0dc> 5600 <e0dd> <e0dd> 7840 <e0de> <e0f3> 5657 <e0f4> <e0f4> 7477 <e0f5> <e0fc> 5680 <e140> <e149> 5688 <e14a> <e14a> 7841 <e14b> <e14e> 5699 <e14f> <e150> 7842 <e151> <e17e> 5705 <e180> <e1a8> 5751 <e1a9> <e1a9> 7844 <e1aa> <e1e5> 5793 <e1e6> <e1e6> 2030 <e1e7> <e1e7> 5854 <e1e8> <e1e8> 3153 <e1e9> <e1ec> 5856 <e1ed> <e1ed> 7845 <e1ee> <e1fc> 5861 <e240> <e268> 5876 <e269> <e269> 7846 <e26a> <e272> 5918 <e273> <e273> 7847 <e274> <e27c> 5928 <e27d> <e27d> 1492 <e27e> <e27e> 5938 <e280> <e2b6> 5939 <e2b7> <e2b7> 7848 <e2b8> <e2c3> 5995 <e2c4> <e2c4> 4060 <e2c5> <e2e1> 6008 <e2e2> <e2e2> 7849 <e2e3> <e2eb> 6038 <e2ec> <e2ec> 7850 <e2ed> <e2fc> 6048 <e340> <e357> 6064 <e358> <e358> 7851 <e359> <e359> 6089 <e35a> <e35a> 7852 <e35b> <e364> 6091 <e365> <e365> 7853 <e366> <e37e> 6102 <e380> <e3c3> 6127 <e3c4> <e3c4> 7854 <e3c5> <e3fc> 6196 <e440> <e47e> 6252 <e480> <e483> 6315 <e484> <e484> 7855 <e485> <e488> 6320 <e489> <e489> 7856 <e48a> <e491> 6325 <e492> <e492> 7857 <e493> <e4b1> 6334 <e4b2> <e4b2> 7858 <e4b3> <e4b8> 6366 <e4b9> <e4b9> 7859 <e4ba> <e4f1> 6373 <e4f2> <e4f2> 7860 <e4f3> <e4fc> 6430 <e540> <e540> 6440 <e541> <e541> 2293 <e542> <e54c> 6442 <e54d> <e54d> 3845 <e54e> <e55a> 6454 <e55b> <e55b> 7861 <e55c> <e578> 6468 <e579> <e579> 1440 <e57a> <e57e> 6498 <e580> <e5a1> 6503 <e5a2> <e5a2> 3358 <e5a3> <e5a4> 6538 <e5a5> <e5a5> 7862 <e5a6> <e5ba> 6541 <e5bb> <e5bb> 7863 <e5bc> <e5ec> 6563 <e5ed> <e5ed> 7864 <e5ee> <e5fc> 6613 <e640> <e650> 6628 <e651> <e651> 7865 <e652> <e67b> 6646 <e67c> <e67c> 1550 <e67d> <e67e> 6689 <e680> <e685> 6691 endcidrange 65 begincidrange <e686> <e686> 7866 <e687> <e695> 6698 <e696> <e696> 7867 <e697> <e6ca> 6714 <e6cb> <e6cb> 2730 <e6cc> <e6e6> 6767 <e6e7> <e6e7> 7868 <e6e8> <e6f1> 6795 <e6f2> <e6f2> 7869 <e6f3> <e6fc> 6806 <e740> <e76c> 6816 <e76d> <e76d> 7870 <e76e> <e77e> 6862 <e780> <e78b> 6879 <e78c> <e78c> 7871 <e78d> <e78d> 6892 <e78e> <e78e> 7872 <e78f> <e7a6> 6894 <e7a7> <e7a7> 7873 <e7a8> <e7ba> 6919 <e7bb> <e7bb> 7874 <e7bc> <e7d4> 6939 <e7d5> <e7d5> 7875 <e7d6> <e7fc> 6965 <e840> <e87e> 7004 <e880> <e884> 7067 <e885> <e885> 7876 <e886> <e8b0> 7073 <e8b1> <e8b1> 7877 <e8b2> <e8c2> 7117 <e8c3> <e8c3> 7878 <e8c4> <e8ce> 7135 <e8cf> <e8cf> 7879 <e8d0> <e8d4> 7147 <e8d5> <e8d5> 7880 <e8d6> <e8f1> 7153 <e8f2> <e8f2> 1841 <e8f3> <e8f3> 7881 <e8f4> <e8fc> 7183 <e940> <e97e> 7192 <e980> <e9aa> 7255 <e9ab> <e9ab> 7882 <e9ac> <e9b9> 7299 <e9ba> <e9ba> 7883 <e9bb> <e9ca> 7314 <e9cb> <e9cb> 1143 <e9cc> <e9cc> 7884 <e9cd> <e9f1> 7332 <e9f2> <e9f2> 1321 <e9f3> <e9fc> 7370 <ea40> <ea6f> 7380 <ea70> <ea70> 7885 <ea71> <ea7e> 7429 <ea80> <ea9c> 7443 <ea9d> <ea9d> 7886 <ea9e> <ea9e> 7473 <ed40> <ed7e> 8359 <ed80> <edb3> 8422 <edb4> <edb4> 1993 <edb5> <edfc> 8474 <ee40> <ee7e> 8546 <ee80> <eeec> 8609 <eeef> <eef8> 8092 <eef9> <eef9> 751 <eefa> <eefc> 8005 endcidrange endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF \ No newline at end of file
diff --git a/src/main/resources/Resources/cmap/Ext-RKSJ-V b/src/main/resources/Resources/cmap/Ext-RKSJ-V
new file mode 100644
index 0000000..6fdacd5
--- /dev/null
+++ b/src/main/resources/Resources/cmap/Ext-RKSJ-V
@@ -0,0 +1 @@
+%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%DocumentNeededResources: CMap (Ext-RKSJ-H) %%IncludeResource: ProcSet (CIDInit) %%IncludeResource: CMap (Ext-RKSJ-H) %%BeginResource: CMap (Ext-RKSJ-V) %%Title: (Ext-RKSJ-V Adobe Japan1 0) %%Version: 10.001 %%Copyright: ----------------------------------------------------------- %%Copyright: Copyright 1990-1998 Adobe Systems Incorporated. %%Copyright: All Rights Reserved. %%Copyright: %%Copyright: Patents Pending %%Copyright: %%Copyright: NOTICE: All information contained herein is the property %%Copyright: of Adobe Systems Incorporated. %%Copyright: %%Copyright: Permission is granted for redistribution of this file %%Copyright: provided this copyright notice is maintained intact and %%Copyright: that the contents of this file are not altered in any %%Copyright: way from its original form. %%Copyright: %%Copyright: PostScript and Display PostScript are trademarks of %%Copyright: Adobe Systems Incorporated which may be registered in %%Copyright: certain jurisdictions. %%Copyright: ----------------------------------------------------------- %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /Ext-RKSJ-H usecmap /CIDSystemInfo 3 dict dup begin /Registry (Adobe) def /Ordering (Japan1) def /Supplement 0 def end def /CMapName /Ext-RKSJ-V def /CMapVersion 10.001 def /CMapType 1 def /UIDOffset 810 def /XUID [1 10 25333] def /WMode 1 def 39 begincidrange <8141> <8142> 7887 <8143> <8143> 8268 <8144> <8144> 8274 <814a> <814a> 8272 <814b> <814b> 8271 <815b> <815d> 7891 <8160> <8164> 7894 <8165> <8165> 8281 <8166> <8166> 8276 <8167> <8167> 8279 <8168> <8168> 8278 <8169> <817a> 7899 <818b> <818b> 8269 <818c> <818c> 8273 <818d> <818d> 8283 <81ac> <81ac> 8270 <829f> <829f> 7918 <82a1> <82a1> 7919 <82a3> <82a3> 7920 <82a5> <82a5> 7921 <82a7> <82a7> 7922 <82c1> <82c1> 7923 <82e1> <82e1> 7924 <82e3> <82e3> 7925 <82e5> <82e5> 7926 <82ec> <82ec> 7927 <8340> <8340> 7928 <8342> <8342> 7929 <8344> <8344> 7930 <8346> <8346> 7931 <8348> <8348> 7932 <8362> <8362> 7933 <8383> <8383> 7934 <8385> <8385> 7935 <8387> <8387> 7936 <838e> <838e> 7937 <8395> <8396> 7938 <875f> <876e> 7940 <8780> <8781> 7956 endcidrange endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF \ No newline at end of file
diff --git a/src/main/resources/Resources/cmap/Ext-V b/src/main/resources/Resources/cmap/Ext-V
new file mode 100644
index 0000000..4c84457
--- /dev/null
+++ b/src/main/resources/Resources/cmap/Ext-V
@@ -0,0 +1,99 @@
+%!PS-Adobe-3.0 Resource-CMap
+%%DocumentNeededResources: ProcSet (CIDInit)
+%%DocumentNeededResources: CMap (Ext-H)
+%%IncludeResource: procset (CIDInit)
+%%IncludeResource: CMap (Ext-H)
+%%BeginResource: CMap (Ext-V)
+%%Title: (Ext-V Adobe Japan1 0)
+%%Version: 6.001
+%%Copyright: -----------------------------------------------------------
+%%Copyright: Copyright 1990-1997 Adobe Systems Incorporated.
+%%Copyright: All Rights Reserved.
+%%Copyright:
+%%Copyright: Patents Pending
+%%Copyright:
+%%Copyright: NOTICE: All information contained herein is the property
+%%Copyright: of Adobe Systems Incorporated.
+%%Copyright:
+%%Copyright: Permission is granted for redistribution of this file
+%%Copyright: provided this copyright notice is maintained intact and
+%%Copyright: that the contents of this file are not altered in any
+%%Copyright: way from its original form.
+%%Copyright:
+%%Copyright: PostScript and Display PostScript are trademarks of
+%%Copyright: Adobe Systems Incorporated which may be registered in
+%%Copyright: certain jurisdictions.
+%%Copyright: -----------------------------------------------------------
+%%EndComments
+
+/CIDInit /ProcSet findresource begin
+
+12 dict begin
+
+begincmap
+
+/Ext-H usecmap
+
+/CIDSystemInfo 3 dict dup begin
+ /Registry (Adobe) def
+ /Ordering (Japan1) def
+ /Supplement 0 def
+end def
+
+/CMapName /Ext-V def
+/CMapVersion 6.001 def
+/CMapType 1 def
+
+/UIDOffset 820 def
+/XUID [1 10 25334] def
+
+/WMode 1 def
+
+39 begincidrange
+<2122> <2123> 7887
+<2124> <2124> 8268
+<2125> <2125> 8274
+<212b> <212b> 8272
+<212c> <212c> 8271
+<213c> <213e> 7891
+<2141> <2145> 7894
+<2146> <2146> 8281
+<2147> <2147> 8276
+<2148> <2148> 8279
+<2149> <2149> 8278
+<214a> <215b> 7899
+<216b> <216b> 8269
+<216c> <216c> 8273
+<216d> <216d> 8283
+<222e> <222e> 8270
+<2421> <2421> 7918
+<2423> <2423> 7919
+<2425> <2425> 7920
+<2427> <2427> 7921
+<2429> <2429> 7922
+<2443> <2443> 7923
+<2463> <2463> 7924
+<2465> <2465> 7925
+<2467> <2467> 7926
+<246e> <246e> 7927
+<2521> <2521> 7928
+<2523> <2523> 7929
+<2525> <2525> 7930
+<2527> <2527> 7931
+<2529> <2529> 7932
+<2543> <2543> 7933
+<2563> <2563> 7934
+<2565> <2565> 7935
+<2567> <2567> 7936
+<256e> <256e> 7937
+<2575> <2576> 7938
+<2d40> <2d4f> 7940
+<2d60> <2d61> 7956
+endcidrange
+endcmap
+CMapName currentdict /CMap defineresource pop
+end
+end
+
+%%EndResource
+%%EOF
diff --git a/src/main/resources/Resources/cmap/GB-EUC-H b/src/main/resources/Resources/cmap/GB-EUC-H
new file mode 100644
index 0000000..bc62eea
--- /dev/null
+++ b/src/main/resources/Resources/cmap/GB-EUC-H
@@ -0,0 +1 @@
+%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%IncludeResource: ProcSet (CIDInit) %%BeginResource: CMap (GB-EUC-H) %%Title: (GB-EUC-H Adobe GB1 0) %%Version: 9.001 %%Copyright: ----------------------------------------------------------- %%Copyright: Copyright 1990-1998 Adobe Systems Incorporated. %%Copyright: All Rights Reserved. %%Copyright: %%Copyright: Patents Pending %%Copyright: %%Copyright: NOTICE: All information contained herein is the property %%Copyright: of Adobe Systems Incorporated. %%Copyright: %%Copyright: Permission is granted for redistribution of this file %%Copyright: provided this copyright notice is maintained intact and %%Copyright: that the contents of this file are not altered in any %%Copyright: way from its original form. %%Copyright: %%Copyright: PostScript and Display PostScript are trademarks of %%Copyright: Adobe Systems Incorporated which may be registered in %%Copyright: certain jurisdictions. %%Copyright: ----------------------------------------------------------- %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo 3 dict dup begin /Registry (Adobe) def /Ordering (GB1) def /Supplement 0 def end def /CMapName /GB-EUC-H def /CMapVersion 9.001 def /CMapType 1 def /UIDOffset 100 def /XUID [1 10 25360] def /WMode 0 def 2 begincodespacerange <00> <80> <A1A1> <FEFE> endcodespacerange 1 beginnotdefrange <00> <1f> 7716 endnotdefrange 90 begincidrange <20> <20> 7716 <21> <7e> 814 <a1a1> <a1fe> 96 <a2b1> <a2e2> 190 <a2e5> <a2ee> 240 <a2f1> <a2fc> 250 <a3a1> <a3fe> 262 <a4a1> <a4f3> 356 <a5a1> <a5f6> 439 <a6a1> <a6b8> 525 <a6c1> <a6f5> 549 <a7a1> <a7c1> 602 <a7d1> <a7f1> 635 <a8a1> <a8c0> 668 <a8c5> <a8ea> 700 <a9a4> <a9ef> 738 <aaa1> <aafe> 814 <aba1> <abc0> 908 <b0a1> <b0fe> 940 <b1a1> <b1fe> 1034 <b2a1> <b2fe> 1128 <b3a1> <b3fe> 1222 <b4a1> <b4fe> 1316 <b5a1> <b5fe> 1410 <b6a1> <b6fe> 1504 <b7a1> <b7fe> 1598 <b8a1> <b8fe> 1692 <b9a1> <b9fe> 1786 <baa1> <bafe> 1880 <bba1> <bbfe> 1974 <bca1> <bcfe> 2068 <bda1> <bdfe> 2162 <bea1> <befe> 2256 <bfa1> <bffe> 2350 <c0a1> <c0fe> 2444 <c1a1> <c1fe> 2538 <c2a1> <c2fe> 2632 <c3a1> <c3fe> 2726 <c4a1> <c4fe> 2820 <c5a1> <c5fe> 2914 <c6a1> <c6fe> 3008 <c7a1> <c7fe> 3102 <c8a1> <c8fe> 3196 <c9a1> <c9fe> 3290 <caa1> <cafe> 3384 <cba1> <cbfe> 3478 <cca1> <ccfe> 3572 <cda1> <cdfe> 3666 <cea1> <cefe> 3760 <cfa1> <cffe> 3854 <d0a1> <d0fe> 3948 <d1a1> <d1fe> 4042 <d2a1> <d2fe> 4136 <d3a1> <d3fe> 4230 <d4a1> <d4fe> 4324 <d5a1> <d5fe> 4418 <d6a1> <d6fe> 4512 <d7a1> <d7f9> 4606 <d8a1> <d8fe> 4695 <d9a1> <d9fe> 4789 <daa1> <dafe> 4883 <dba1> <dbfe> 4977 <dca1> <dcfe> 5071 <dda1> <ddfe> 5165 <dea1> <defe> 5259 <dfa1> <dffe> 5353 <e0a1> <e0fe> 5447 <e1a1> <e1fe> 5541 <e2a1> <e2fe> 5635 <e3a1> <e3fe> 5729 <e4a1> <e4fe> 5823 <e5a1> <e5fe> 5917 <e6a1> <e6fe> 6011 <e7a1> <e7fe> 6105 <e8a1> <e8fe> 6199 <e9a1> <e9fe> 6293 <eaa1> <eafe> 6387 <eba1> <ebfe> 6481 <eca1> <ecfe> 6575 <eda1> <edfe> 6669 <eea1> <eefe> 6763 <efa1> <effe> 6857 <f0a1> <f0fe> 6951 <f1a1> <f1fe> 7045 <f2a1> <f2fe> 7139 <f3a1> <f3fe> 7233 <f4a1> <f4fe> 7327 <f5a1> <f5fe> 7421 <f6a1> <f6fe> 7515 <f7a1> <f7fe> 7609 endcidrange endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF \ No newline at end of file
diff --git a/src/main/resources/Resources/cmap/GB-EUC-V b/src/main/resources/Resources/cmap/GB-EUC-V
new file mode 100644
index 0000000..7b558cc
--- /dev/null
+++ b/src/main/resources/Resources/cmap/GB-EUC-V
@@ -0,0 +1 @@
+%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%DocumentNeededResources: CMap (GB-EUC-H) %%IncludeResource: ProcSet (CIDInit) %%IncludeResource: CMap (GB-EUC-H) %%BeginResource: CMap (GB-EUC-V) %%Title: (GB-EUC-V Adobe GB1 0) %%Version: 9.001 %%Copyright: ----------------------------------------------------------- %%Copyright: Copyright 1990-1998 Adobe Systems Incorporated. %%Copyright: All Rights Reserved. %%Copyright: %%Copyright: Patents Pending %%Copyright: %%Copyright: NOTICE: All information contained herein is the property %%Copyright: of Adobe Systems Incorporated. %%Copyright: %%Copyright: Permission is granted for redistribution of this file %%Copyright: provided this copyright notice is maintained intact and %%Copyright: that the contents of this file are not altered in any %%Copyright: way from its original form. %%Copyright: %%Copyright: PostScript and Display PostScript are trademarks of %%Copyright: Adobe Systems Incorporated which may be registered in %%Copyright: certain jurisdictions. %%Copyright: ----------------------------------------------------------- %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /GB-EUC-H usecmap /CIDSystemInfo 3 dict dup begin /Registry (Adobe) def /Ordering (GB1) def /Supplement 0 def end def /CMapName /GB-EUC-V def /CMapVersion 9.001 def /CMapType 1 def /UIDOffset 310 def /XUID [1 10 25361] def /WMode 1 def 20 begincidrange <a1a2> <a1a2> 575 <a1a3> <a1a3> 574 <a1aa> <a1aa> 598 <a1ab> <a1ac> 7704 <a1ad> <a1ad> 599 <a1b2> <a1bf> 582 <a1fe> <a1fe> 7706 <a3a1> <a3a1> 578 <a3a8> <a3a9> 580 <a3ac> <a3ac> 573 <a3ae> <a3ae> 7707 <a3ba> <a3bb> 576 <a3bd> <a3bd> 7708 <a3bf> <a3bf> 579 <a3db> <a3db> 7709 <a3dd> <a3dd> 7710 <a3df> <a3df> 600 <a3fb> <a3fb> 596 <a3fd> <a3fd> 597 <a3fe> <a3fe> 7711 endcidrange endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF \ No newline at end of file
diff --git a/src/main/resources/Resources/cmap/GBK-EUC-H b/src/main/resources/Resources/cmap/GBK-EUC-H
new file mode 100644
index 0000000..a246029
--- /dev/null
+++ b/src/main/resources/Resources/cmap/GBK-EUC-H
@@ -0,0 +1 @@
+%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%IncludeResource: ProcSet (CIDInit) %%BeginResource: CMap (GBK-EUC-H) %%Title: (GBK-EUC-H Adobe GB1 2) %%Version: 11.001 %%Copyright: ----------------------------------------------------------- %%Copyright: Copyright 1990-1999 Adobe Systems Incorporated. %%Copyright: All Rights Reserved. %%Copyright: %%Copyright: Patents Pending %%Copyright: %%Copyright: NOTICE: All information contained herein is the property %%Copyright: of Adobe Systems Incorporated. %%Copyright: %%Copyright: Permission is granted for redistribution of this file %%Copyright: provided this copyright notice is maintained intact and %%Copyright: that the contents of this file are not altered in any %%Copyright: way from its original form. %%Copyright: %%Copyright: PostScript and Display PostScript are trademarks of %%Copyright: Adobe Systems Incorporated which may be registered in %%Copyright: certain jurisdictions. %%Copyright: ----------------------------------------------------------- %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo 3 dict dup begin /Registry (Adobe) def /Ordering (GB1) def /Supplement 2 def end def /CMapName /GBK-EUC-H def /CMapVersion 11.001 def /CMapType 1 def /XUID [1 10 25377] def /WMode 0 def 2 begincodespacerange <00> <80> <8140> <FEFE> endcodespacerange 1 beginnotdefrange <00> <1f> 7716 endnotdefrange 100 begincidrange <20> <20> 7716 <21> <7e> 814 <8140> <8178> 10072 <8179> <8179> 8281 <817a> <817e> 10129 <8180> <8185> 10134 <8186> <8186> 8689 <8187> <81ec> 10140 <81ed> <81ed> 8178 <81ee> <81f5> 10242 <81f6> <81f6> 8285 <81f7> <81fe> 10250 <8240> <8252> 10258 <8253> <8253> 9884 <8254> <8261> 10277 <8262> <8262> 8629 <8263> <8273> 10291 <8274> <8274> 8908 <8275> <8279> 10308 <827a> <827a> 8214 <827b> <827c> 10313 <827d> <827d> 7778 <827e> <827e> 10315 <8280> <8280> 7968 <8281> <8282> 10316 <8283> <8283> 8319 <8284> <828f> 10318 <8290> <8290> 8284 <8291> <82a4> 10330 <82a5> <82a5> 8596 <82a6> <82c7> 10350 <82c8> <82c8> 7781 <82c9> <82c9> 8833 <82ca> <82e0> 10384 <82e1> <82e1> 8909 <82e2> <82e2> 10407 <82e3> <82e3> 8458 <82e4> <82e4> 7742 <82e5> <82ec> 10408 <82ed> <82ed> 9855 <82ee> <82f1> 10416 <82f2> <82f2> 8750 <82f3> <82f6> 10420 <82f7> <82f7> 7830 <82f8> <82f8> 8907 <82f9> <82f9> 8812 <82fa> <82fa> 10424 <82fb> <82fb> 8471 <82fc> <82fe> 10425 <8340> <8340> 10428 <8341> <8341> 8424 <8342> <8344> 10429 <8345> <8345> 8916 <8346> <8347> 10432 <8348> <8348> 8121 <8349> <834b> 10434 <834c> <834c> 8920 <834d> <8352> 10437 <8353> <8353> 8415 <8354> <8356> 10443 <8357> <8357> 8386 <8358> <835d> 10446 <835e> <835e> 8597 <835f> <8364> 10452 <8365> <8365> 8108 <8366> <8366> 8915 <8367> <8371> 10458 <8372> <8372> 8065 <8373> <8377> 10469 <8378> <8378> 8720 <8379> <8379> 10474 <837a> <837a> 8911 <837b> <837b> 10475 <837c> <837c> 8723 <837d> <837d> 10476 <837e> <837e> 8164 <8380> <8380> 8080 <8381> <8385> 10477 <8386> <8386> 8918 <8387> <8388> 10482 <8389> <8389> 8912 <838a> <838a> 8910 <838b> <838c> 10484 <838d> <838d> 9857 <838e> <8393> 10486 <8394> <8394> 7798 <8395> <839d> 10492 <839e> <839e> 8753 <839f> <83a5> 10501 <83a6> <83a6> 7827 <83a7> <83aa> 10508 <83ab> <83ab> 8914 <83ac> <83ad> 10512 <83ae> <83ae> 8919 <83af> <83af> 8917 <83b0> <83b0> 8913 <83b1> <83b9> 10514 <83ba> <83ba> 7909 <83bb> <83c8> 10523 <83c9> <83c9> 8229 endcidrange 100 begincidrange <83ca> <83f5> 10537 <83f6> <83f6> 7887 <83f7> <83fe> 10581 <8440> <844f> 10589 <8450> <8450> 8153 <8451> <8470> 10605 <8471> <8471> 8904 <8472> <8473> 10637 <8474> <8474> 8803 <8475> <8476> 10639 <8477> <8477> 9859 <8478> <847e> 10641 <8480> <8481> 10648 <8482> <8482> 7959 <8483> <848d> 10650 <848e> <848e> 7979 <848f> <8491> 10661 <8492> <8492> 8906 <8493> <8493> 7833 <8494> <849c> 10664 <849d> <849d> 8015 <849e> <84a0> 10673 <84a1> <84a1> 8143 <84a2> <84a2> 8246 <84a3> <84a3> 7994 <84a4> <84a4> 10676 <84a5> <84a5> 8905 <84a6> <84a6> 8089 <84a7> <84a8> 10677 <84a9> <84a9> 8053 <84aa> <84c4> 10679 <84c5> <84c5> 8126 <84c6> <84d2> 10706 <84d3> <84d3> 7885 <84d4> <84d4> 10719 <84d5> <84d5> 8617 <84d6> <84d6> 10720 <84d7> <84d7> 8678 <84d8> <84d8> 10721 <84d9> <84d9> 8487 <84da> <84da> 8195 <84db> <84dc> 10722 <84dd> <84dd> 8498 <84de> <84e9> 10724 <84ea> <84ea> 8995 <84eb> <84ed> 10736 <84ee> <84ee> 8209 <84ef> <84f0> 10739 <84f1> <84f1> 8437 <84f2> <84fe> 10741 <8540> <8550> 10754 <8551> <8551> 8901 <8552> <8552> 8030 <8553> <8553> 10771 <8554> <8554> 8902 <8555> <855d> 10772 <855e> <855e> 8431 <855f> <8565> 10781 <8566> <8566> 8656 <8567> <857e> 10788 <8580> <8586> 10812 <8587> <8587> 8897 <8588> <858a> 10819 <858b> <858b> 7780 <858c> <8591> 10822 <8592> <8592> 8697 <8593> <8595> 10828 <8596> <8596> 8208 <8597> <8597> 10831 <8598> <8598> 8898 <8599> <85a1> 10832 <85a2> <85a2> 7770 <85a3> <85b1> 10841 <85b2> <85b2> 7842 <85b3> <85fe> 10856 <8640> <8649> 10932 <864a> <864a> 9069 <864b> <8653> 10942 <8654> <8654> 8775 <8655> <8667> 10951 <8668> <8668> 9068 <8669> <867e> 10970 <8680> <8695> 10992 <8696> <8696> 8604 <8697> <8698> 11014 <8699> <8699> 8393 <869a> <86a0> 11016 <86a1> <86a1> 8688 <86a2> <86c9> 11023 <86ca> <86ca> 8459 <86cb> <86cb> 11063 <86cc> <86cc> 8414 <86cd> <86cd> 11064 <86ce> <86ce> 7850 <86cf> <86d0> 11065 <86d1> <86d1> 8748 <86d2> <86db> 11067 <86dc> <86dc> 8408 <86dd> <86dd> 8896 <86de> <86e0> 11077 endcidrange 100 begincidrange <86e1> <86e1> 8303 <86e2> <86e7> 11080 <86e8> <86e8> 8609 <86e9> <86ed> 11086 <86ee> <86ee> 9081 <86ef> <86f3> 11091 <86f4> <86f4> 9074 <86f5> <86fe> 11096 <8740> <8740> 8554 <8741> <8743> 11106 <8744> <8744> 9084 <8745> <8748> 11109 <8749> <8749> 8368 <874a> <874a> 11113 <874b> <874b> 9082 <874c> <874c> 7796 <874d> <874e> 11114 <874f> <874f> 9079 <8750> <8756> 11116 <8757> <8757> 8012 <8758> <8759> 11123 <875a> <875a> 9080 <875b> <875b> 8655 <875c> <875c> 9064 <875d> <875d> 11125 <875e> <875e> 9073 <875f> <875f> 11126 <8760> <8760> 9065 <8761> <8765> 11127 <8766> <8766> 9844 <8767> <8779> 11132 <877a> <877a> 9071 <877b> <877c> 11151 <877d> <877d> 9072 <877e> <877e> 11153 <8780> <8780> 11154 <8781> <8781> 9078 <8782> <8782> 9075 <8783> <8785> 11155 <8786> <8786> 9087 <8787> <8787> 11158 <8788> <8788> 9076 <8789> <8789> 11159 <878a> <878a> 8373 <878b> <878c> 11160 <878d> <878d> 7899 <878e> <878e> 9842 <878f> <8792> 11162 <8793> <8793> 9070 <8794> <8797> 11166 <8798> <8798> 8631 <8799> <879c> 11170 <879d> <879d> 9077 <879e> <87a2> 11174 <87a3> <87a3> 9090 <87a4> <87a6> 11179 <87a7> <87a7> 8350 <87a8> <87b2> 11182 <87b3> <87b3> 9067 <87b4> <87b4> 11193 <87b5> <87b5> 8249 <87b6> <87ba> 11194 <87bb> <87bb> 9887 <87bc> <87be> 11199 <87bf> <87bf> 9085 <87c0> <87c0> 8693 <87c1> <87c1> 11202 <87c2> <87c2> 9089 <87c3> <87c9> 11203 <87ca> <87ca> 9083 <87cb> <87cb> 9086 <87cc> <87cc> 8652 <87cd> <87ce> 11210 <87cf> <87cf> 8923 <87d0> <87d1> 11212 <87d2> <87d2> 9066 <87d3> <87d3> 9865 <87d4> <87d4> 11214 <87d5> <87d5> 9879 <87d6> <87d9> 11215 <87da> <87da> 8865 <87db> <87f6> 11219 <87f7> <87f7> 9091 <87f8> <87f8> 7997 <87f9> <87f9> 11247 <87fa> <87fa> 8591 <87fb> <87fe> 11248 <8840> <8840> 8774 <8841> <8841> 8776 <8842> <8843> 11252 <8844> <8844> 8574 <8845> <8845> 11254 <8846> <8846> 8576 <8847> <887e> 11255 <8880> <88b9> 11311 <88ba> <88ba> 9002 <88bb> <88cb> 11369 <88cc> <88cc> 8843 <88cd> <88d3> 11386 <88d4> <88d4> 8069 endcidrange 100 begincidrange <88d5> <88d6> 11393 <88d7> <88d7> 8997 <88d8> <88de> 11395 <88df> <88df> 9004 <88e0> <88e4> 11402 <88e5> <88e5> 9006 <88e6> <88f1> 11407 <88f2> <88f2> 8709 <88f3> <88f3> 7736 <88f4> <88f5> 11419 <88f6> <88f6> 7795 <88f7> <88fe> 11421 <8940> <894a> 11429 <894b> <894b> 8163 <894c> <894c> 9017 <894d> <894d> 11440 <894e> <894e> 9003 <894f> <894f> 11441 <8950> <8950> 9005 <8951> <8953> 11442 <8954> <8954> 8575 <8955> <895c> 11445 <895d> <895d> 8615 <895e> <895e> 11453 <895f> <895f> 9007 <8960> <896c> 11454 <896d> <896d> 7805 <896e> <8970> 11467 <8971> <8971> 8406 <8972> <897b> 11470 <897c> <897c> 7874 <897d> <897e> 11480 <8980> <898a> 11482 <898b> <898b> 8882 <898c> <8998> 11493 <8999> <8999> 7903 <899a> <899d> 11506 <899e> <899e> 7929 <899f> <89a5> 11510 <89a6> <89a6> 8409 <89a7> <89a7> 11517 <89a8> <89a8> 8157 <89a9> <89ae> 11518 <89af> <89af> 8551 <89b0> <89b9> 11524 <89ba> <89ba> 8685 <89bb> <89bd> 11534 <89be> <89be> 8199 <89bf> <89bf> 8998 <89c0> <89c0> 9001 <89c1> <89c3> 11537 <89c4> <89c4> 8018 <89c5> <89c5> 8251 <89c6> <89c6> 9000 <89c7> <89c7> 11540 <89c8> <89c8> 8999 <89c9> <89cd> 11541 <89ce> <89ce> 7723 <89cf> <89d0> 11546 <89d1> <89d1> 8878 <89d2> <89d7> 11548 <89d8> <89d8> 8009 <89d9> <89da> 11554 <89db> <89db> 8504 <89dc> <89f3> 11556 <89f4> <89f4> 8321 <89f5> <89fe> 11580 <8a40> <8a40> 11590 <8a41> <8a41> 8060 <8a42> <8a58> 11591 <8a59> <8a59> 9051 <8a5a> <8a5a> 7902 <8a5b> <8a5b> 11614 <8a5c> <8a5c> 8098 <8a5d> <8a5d> 11615 <8a5e> <8a5e> 7930 <8a5f> <8a78> 11616 <8a79> <8a79> 8877 <8a7a> <8a7e> 11642 <8a80> <8ae3> 11647 <8ae4> <8ae4> 8255 <8ae5> <8afe> 11747 <8b40> <8b43> 11773 <8b44> <8b44> 7950 <8b45> <8b48> 11777 <8b49> <8b49> 9209 <8b4a> <8b79> 11781 <8b7a> <8b7a> 9212 <8b7b> <8b7e> 11829 <8b80> <8b8b> 11833 <8b8c> <8b8c> 8297 <8b8d> <8b9d> 11845 <8b9e> <8b9e> 9207 <8b9f> <8bb2> 11862 <8bb3> <8bb3> 9206 <8bb4> <8bb8> 11882 <8bb9> <8bb9> 9213 <8bba> <8bbd> 11887 <8bbe> <8bbe> 9208 <8bbf> <8bc5> 11891 endcidrange 100 begincidrange <8bc6> <8bc6> 9210 <8bc7> <8bc7> 11898 <8bc8> <8bc8> 9214 <8bc9> <8bc9> 8104 <8bca> <8bd3> 11899 <8bd4> <8bd4> 9217 <8bd5> <8bdb> 11909 <8bdc> <8bdc> 9215 <8bdd> <8be4> 11916 <8be5> <8be5> 9216 <8be6> <8bea> 11924 <8beb> <8beb> 8737 <8bec> <8bef> 11929 <8bf0> <8bf0> 8482 <8bf1> <8bfe> 11933 <8c40> <8c43> 11947 <8c44> <8c44> 9211 <8c45> <8c4e> 11951 <8c4f> <8c4f> 8538 <8c50> <8c56> 11961 <8c57> <8c57> 8677 <8c58> <8c5b> 11968 <8c5c> <8c5c> 8279 <8c5d> <8c7e> 11972 <8c80> <8c8a> 12006 <8c8b> <8c8b> 8421 <8c8c> <8c8c> 12017 <8c8d> <8c8d> 8495 <8c8e> <8c8e> 8355 <8c8f> <8c8f> 8481 <8c90> <8c90> 12018 <8c91> <8c91> 8660 <8c92> <8c92> 8165 <8c93> <8c98> 12019 <8c99> <8c99> 7818 <8c9a> <8c9a> 7735 <8c9b> <8ca1> 12025 <8ca2> <8ca2> 8094 <8ca3> <8ca3> 8870 <8ca4> <8ca4> 8680 <8ca5> <8ca5> 12032 <8ca6> <8ca6> 7898 <8ca7> <8ca7> 7865 <8ca8> <8cbf> 12033 <8cc0> <8cc0> 9052 <8cc1> <8cd1> 12057 <8cd2> <8cd2> 8272 <8cd3> <8cd3> 7783 <8cd4> <8cd4> 12074 <8cd5> <8cd5> 9204 <8cd6> <8cd8> 12075 <8cd9> <8cd9> 8510 <8cda> <8cf8> 12078 <8cf9> <8cf9> 7958 <8cfa> <8cfe> 12109 <8d40> <8d72> 12114 <8d73> <8d73> 9097 <8d74> <8d74> 12165 <8d75> <8d75> 7863 <8d76> <8d7a> 12166 <8d7b> <8d7b> 8628 <8d7c> <8d7e> 12171 <8d80> <8d87> 12174 <8d88> <8d88> 9103 <8d89> <8d8e> 12182 <8d8f> <8d8f> 7962 <8d90> <8d9d> 12188 <8d9e> <8d9e> 9099 <8d9f> <8db8> 12202 <8db9> <8db9> 9098 <8dba> <8de1> 12228 <8de2> <8de2> 9105 <8de3> <8de3> 12268 <8de4> <8de4> 8817 <8de5> <8de6> 12269 <8de7> <8de7> 9096 <8de8> <8df6> 12271 <8df7> <8df7> 9102 <8df8> <8dfd> 12286 <8dfe> <8dfe> 9101 <8e40> <8e45> 12292 <8e46> <8e46> 9100 <8e47> <8e55> 12298 <8e56> <8e56> 9104 <8e57> <8e57> 12313 <8e58> <8e58> 8243 <8e59> <8e59> 12314 <8e5a> <8e5a> 8764 <8e5b> <8e67> 12315 <8e68> <8e68> 8169 <8e69> <8e6d> 12328 <8e6e> <8e6e> 8277 <8e6f> <8e6f> 12333 <8e70> <8e70> 9106 <8e71> <8e7e> 12334 <8e80> <8e80> 8996 <8e81> <8e9a> 12348 <8e9b> <8e9b> 8515 <8e9c> <8e9e> 12374 <8e9f> <8e9f> 8489 endcidrange 100 begincidrange <8ea0> <8ea3> 12377 <8ea4> <8ea4> 8823 <8ea5> <8ea6> 12381 <8ea7> <8ea7> 7847 <8ea8> <8eab> 12383 <8eac> <8eac> 8837 <8ead> <8ead> 12387 <8eae> <8eae> 9092 <8eaf> <8ebc> 12388 <8ebd> <8ebd> 9095 <8ebe> <8ebe> 9094 <8ebf> <8ec2> 12402 <8ec3> <8ec3> 8848 <8ec4> <8ec4> 12406 <8ec5> <8ec5> 7748 <8ec6> <8ecc> 12407 <8ecd> <8ecd> 7730 <8ece> <8ece> 9093 <8ecf> <8ed5> 12414 <8ed6> <8ed6> 7955 <8ed7> <8ed7> 8051 <8ed8> <8eeb> 12421 <8eec> <8eec> 8160 <8eed> <8efe> 12441 <8f40> <8f51> 12459 <8f52> <8f52> 8327 <8f53> <8f53> 7800 <8f54> <8f54> 9134 <8f55> <8f55> 7926 <8f56> <8f56> 7985 <8f57> <8f5c> 12477 <8f5d> <8f5d> 8261 <8f5e> <8f63> 12483 <8f64> <8f64> 8568 <8f65> <8f7e> 12489 <8f80> <8f85> 12515 <8f86> <8f86> 9205 <8f87> <8f87> 12521 <8f88> <8f88> 8821 <8f89> <8f94> 12522 <8f95> <8f95> 9838 <8f96> <8f96> 12534 <8f97> <8f97> 7856 <8f98> <8f9a> 12535 <8f9b> <8f9b> 8323 <8f9c> <8f9c> 12538 <8f9d> <8f9d> 8584 <8f9e> <8fa0> 12539 <8fa1> <8fa1> 9852 <8fa2> <8fbc> 12542 <8fbd> <8fbd> 8133 <8fbe> <8fc3> 12569 <8fc4> <8fc4> 7841 <8fc5> <8fc5> 12575 <8fc6> <8fc6> 9107 <8fc7> <8fcc> 12576 <8fcd> <8fcd> 7947 <8fce> <8fd7> 12582 <8fd8> <8fd8> 7804 <8fd9> <8ffe> 12592 <9040> <907e> 12630 <9080> <909c> 12693 <909d> <909d> 9140 <909e> <909e> 8318 <909f> <90b9> 12722 <90ba> <90ba> 7907 <90bb> <90bf> 12749 <90c0> <90c0> 8341 <90c1> <90c1> 9147 <90c2> <90c4> 12754 <90c5> <90c5> 9145 <90c6> <90da> 12757 <90db> <90db> 7720 <90dc> <90dc> 9149 <90dd> <90ec> 12778 <90ed> <90ed> 9141 <90ee> <90ef> 12794 <90f0> <90f0> 9146 <90f1> <90f6> 12796 <90f7> <90f7> 9139 <90f8> <90fe> 12802 <9140> <9141> 12809 <9142> <9142> 8546 <9143> <914a> 12811 <914b> <914b> 7774 <914c> <914c> 12819 <914d> <914d> 7773 <914e> <9150> 12820 <9151> <9151> 9143 <9152> <9153> 12823 <9154> <9154> 7983 <9155> <9155> 9439 <9156> <9158> 12825 <9159> <9159> 9138 <915a> <915a> 8526 <915b> <915c> 12828 <915d> <915d> 8274 <915e> <9160> 12830 <9161> <9161> 9148 <9162> <9162> 12833 endcidrange 100 begincidrange <9163> <9163> 8427 <9164> <916d> 12834 <916e> <916e> 8754 <916f> <9175> 12844 <9176> <9176> 7743 <9177> <9179> 12851 <917a> <917a> 8219 <917b> <917b> 8380 <917c> <917c> 9150 <917d> <917e> 12854 <9180> <9183> 12856 <9184> <9184> 7854 <9185> <918c> 12860 <918d> <918d> 7931 <918e> <9190> 12868 <9191> <9191> 8329 <9192> <9192> 12871 <9193> <9193> 9137 <9194> <9196> 12872 <9197> <9197> 8644 <9198> <919a> 12875 <919b> <919b> 8724 <919c> <91a8> 12878 <91a9> <91a9> 8158 <91aa> <91aa> 8739 <91ab> <91ab> 9142 <91ac> <91b9> 12891 <91ba> <91ba> 9868 <91bb> <91bb> 9438 <91bc> <91be> 12905 <91bf> <91bf> 9440 <91c0> <91c2> 12908 <91c3> <91c3> 9144 <91c4> <91cc> 12911 <91cd> <91cd> 7809 <91ce> <91cf> 12920 <91d0> <91d0> 8190 <91d1> <91d1> 8017 <91d2> <91d2> 8673 <91d3> <91d3> 12922 <91d4> <91d4> 9136 <91d5> <91d5> 12923 <91d6> <91d6> 8142 <91d7> <91d7> 12924 <91d8> <91d8> 8478 <91d9> <91d9> 8225 <91da> <91de> 12925 <91df> <91df> 9441 <91e0> <91e1> 12930 <91e2> <91e2> 9379 <91e3> <91e9> 12932 <91ea> <91ea> 9380 <91eb> <91ef> 12939 <91f0> <91f0> 8819 <91f1> <91f1> 12944 <91f2> <91f2> 8624 <91f3> <91fe> 12945 <9240> <927e> 12957 <9280> <92b5> 13020 <92b6> <92b6> 8657 <92b7> <92cd> 13074 <92ce> <92ce> 8476 <92cf> <92cf> 13097 <92d0> <92d0> 9053 <92d1> <92d3> 13098 <92d4> <92d4> 9858 <92d5> <92de> 13101 <92df> <92df> 8461 <92e0> <92e0> 8282 <92e1> <92fd> 13111 <92fe> <92fe> 8077 <9340> <934f> 13140 <9350> <9350> 8703 <9351> <935c> 13156 <935d> <935d> 8024 <935e> <936f> 13168 <9370> <9370> 8539 <9371> <9375> 13186 <9376> <9376> 7862 <9377> <937e> 13191 <9380> <938b> 13199 <938c> <938c> 8411 <938d> <939c> 13211 <939d> <939d> 9056 <939e> <93a4> 13227 <93a5> <93a5> 9057 <93a6> <93a6> 13234 <93a7> <93a7> 8256 <93a8> <93b3> 13235 <93b4> <93b4> 8846 <93b5> <93b7> 13247 <93b8> <93b8> 8159 <93b9> <93ba> 13250 <93bb> <93bb> 9054 <93bc> <93bc> 13252 <93bd> <93bd> 7786 <93be> <93c5> 13253 <93c6> <93c6> 8194 <93c7> <93ce> 13261 <93cf> <93cf> 8339 endcidrange 100 begincidrange <93d0> <93d6> 13269 <93d7> <93d7> 9055 <93d8> <93da> 13276 <93db> <93db> 7852 <93dc> <93dc> 7764 <93dd> <93e0> 13279 <93e1> <93e1> 7944 <93e2> <93e3> 13283 <93e4> <93e4> 8384 <93e5> <93e5> 9058 <93e6> <93e8> 13285 <93e9> <93e9> 8544 <93ea> <93ea> 13288 <93eb> <93eb> 8605 <93ec> <93ec> 8078 <93ed> <93ed> 8749 <93ee> <93ee> 13289 <93ef> <93ef> 8263 <93f0> <93f0> 13290 <93f1> <93f1> 8802 <93f2> <93f3> 13291 <93f4> <93f4> 8039 <93f5> <93f5> 7858 <93f6> <93f9> 13293 <93fa> <93fa> 7849 <93fb> <93fd> 13297 <93fe> <93fe> 8140 <9440> <9443> 13300 <9444> <9444> 8050 <9445> <944c> 13304 <944d> <944d> 8344 <944e> <944f> 13312 <9450> <9450> 7762 <9451> <9451> 8356 <9452> <9452> 7964 <9453> <9453> 8847 <9454> <9454> 13314 <9455> <9455> 8173 <9456> <9457> 13315 <9458> <9458> 9061 <9459> <945a> 13317 <945b> <945b> 7725 <945c> <945c> 8530 <945d> <945d> 9062 <945e> <945e> 13319 <945f> <945f> 8442 <9460> <9463> 13320 <9464> <9464> 9059 <9465> <9465> 13324 <9466> <9466> 8346 <9467> <946d> 13325 <946e> <946e> 8252 <946f> <9471> 13332 <9472> <9472> 8182 <9473> <9473> 13335 <9474> <9474> 9060 <9475> <9475> 13336 <9476> <9476> 7785 <9477> <9477> 13337 <9478> <9478> 9063 <9479> <9479> 13338 <947a> <947a> 8477 <947b> <947e> 13339 <9480> <9480> 8793 <9481> <9481> 8278 <9482> <9482> 8547 <9483> <9486> 13343 <9487> <9487> 8105 <9488> <9488> 8188 <9489> <94a0> 13347 <94a1> <94a1> 7726 <94a2> <94b2> 13371 <94b3> <94b3> 7868 <94b4> <94b4> 13388 <94b5> <94b5> 8514 <94b6> <94be> 13389 <94bf> <94bf> 8222 <94c0> <94c0> 7747 <94c1> <94cb> 13398 <94cc> <94cc> 9428 <94cd> <94d7> 13409 <94d8> <94d8> 8815 <94d9> <94df> 13420 <94e0> <94e0> 7895 <94e1> <94fe> 13427 <9540> <9571> 13457 <9572> <9572> 8493 <9573> <957e> 13507 <9580> <9582> 13519 <9583> <9583> 8859 <9584> <959d> 13522 <959e> <959e> 8790 <959f> <959f> 9384 <95a0> <95b2> 13548 <95b3> <95b3> 7801 <95b4> <95b9> 13567 <95ba> <95ba> 8794 <95bb> <95ce> 13573 <95cf> <95cf> 9383 <95d0> <95d0> 13593 endcidrange 100 begincidrange <95d1> <95d1> 9862 <95d2> <95d2> 9382 <95d3> <95d3> 13594 <95d4> <95d4> 8654 <95d5> <95e0> 13595 <95e1> <95e1> 9385 <95e2> <95e6> 13607 <95e7> <95e7> 8167 <95e8> <95f0> 13612 <95f1> <95f1> 8466 <95f2> <95f7> 13621 <95f8> <95f8> 8508 <95f9> <95fd> 13627 <95fe> <95fe> 8028 <9640> <9655> 13632 <9656> <9656> 9412 <9657> <967b> 13654 <967c> <967c> 7884 <967d> <967e> 13691 <9680> <96fe> 13693 <9740> <9766> 13820 <9767> <9767> 9322 <9768> <976b> 13859 <976c> <976c> 8565 <976d> <976d> 13863 <976e> <976e> 9325 <976f> <977e> 13864 <9780> <9795> 13880 <9796> <9796> 9323 <9797> <9797> 8799 <9798> <979c> 13902 <979d> <979d> 7886 <979e> <97a2> 13907 <97a3> <97a3> 8818 <97a4> <97be> 13912 <97bf> <97bf> 9331 <97c0> <97ed> 13939 <97ee> <97ee> 8702 <97ef> <97f6> 13985 <97f7> <97f7> 7934 <97f8> <97fe> 13993 <9840> <9844> 14000 <9845> <9845> 9333 <9846> <9848> 14005 <9849> <9849> 8714 <984a> <984e> 14008 <984f> <984f> 8047 <9850> <9870> 14013 <9871> <9871> 9320 <9872> <9872> 14046 <9873> <9873> 8448 <9874> <987e> 14047 <9880> <9880> 14058 <9881> <9881> 9334 <9882> <988a> 14059 <988b> <988b> 7975 <988c> <988c> 8407 <988d> <989f> 14068 <98a0> <98a0> 9340 <98a1> <98a9> 14087 <98aa> <98aa> 8097 <98ab> <98b5> 14096 <98b6> <98b6> 8874 <98b7> <98b7> 8197 <98b8> <98b9> 14107 <98ba> <98ba> 9324 <98bb> <98c6> 14109 <98c7> <98c7> 8254 <98c8> <98ca> 14121 <98cb> <98cb> 7756 <98cc> <98cf> 14124 <98d0> <98d0> 8506 <98d1> <98d2> 14128 <98d3> <98d3> 8708 <98d4> <98e2> 14130 <98e3> <98e3> 8387 <98e4> <98e4> 8512 <98e5> <98e5> 9335 <98e6> <98ee> 14145 <98ef> <98ef> 9332 <98f0> <98f1> 14154 <98f2> <98f2> 8413 <98f3> <98fe> 14156 <9940> <9942> 14168 <9943> <9943> 8040 <9944> <9944> 14171 <9945> <9945> 8581 <9946> <9965> 14172 <9966> <9966> 9330 <9967> <996d> 14204 <996e> <996e> 7861 <996f> <9974> 14211 <9975> <9975> 9336 <9976> <9979> 14217 <997a> <997a> 8075 <997b> <997b> 9348 <997c> <997e> 14221 <9980> <9984> 14224 <9985> <9985> 9881 <9986> <9988> 14229 endcidrange 100 begincidrange <9989> <9989> 9346 <998a> <998d> 14232 <998e> <998e> 8353 <998f> <9990> 14236 <9991> <9991> 8082 <9992> <9998> 14238 <9999> <9999> 7992 <999a> <99a8> 14245 <99a9> <99a9> 9349 <99aa> <99af> 14260 <99b0> <99b0> 9344 <99b1> <99b1> 9326 <99b2> <99b2> 14266 <99b3> <99b3> 9339 <99b4> <99b4> 9350 <99b5> <99b5> 9329 <99b6> <99bc> 14267 <99bd> <99bd> 9347 <99be> <99be> 9328 <99bf> <99bf> 14274 <99c0> <99c0> 9321 <99c1> <99c1> 14275 <99c2> <99c2> 9343 <99c3> <99c8> 14276 <99c9> <99c9> 9327 <99ca> <99cd> 14282 <99ce> <99ce> 9345 <99cf> <99d0> 14286 <99d1> <99d1> 8736 <99d2> <99d9> 14288 <99da> <99da> 8181 <99db> <99df> 14296 <99e0> <99e0> 8436 <99e1> <99e4> 14301 <99e5> <99e5> 9341 <99e6> <99e7> 14305 <99e8> <99e8> 9337 <99e9> <99eb> 14307 <99ec> <99ec> 9342 <99ed> <99f3> 14310 <99f4> <99f4> 9338 <99f5> <99fe> 14317 <9a40> <9a49> 14327 <9a4a> <9a4a> 8419 <9a4b> <9a56> 14337 <9a57> <9a57> 8365 <9a58> <9a64> 14349 <9a65> <9a65> 9419 <9a66> <9a66> 14362 <9a67> <9a67> 8019 <9a68> <9a70> 14363 <9a71> <9a71> 8537 <9a72> <9a75> 14372 <9a76> <9a76> 8211 <9a77> <9a77> 7987 <9a78> <9a7e> 14376 <9a80> <9a87> 14383 <9a88> <9a88> 7772 <9a89> <9a8b> 14391 <9a8c> <9a8c> 9352 <9a8d> <9a90> 14394 <9a91> <9a91> 9351 <9a92> <9a96> 14398 <9a97> <9a97> 9354 <9a98> <9a99> 14403 <9a9a> <9a9a> 9353 <9a9b> <9a9b> 9355 <9a9c> <9a9d> 14405 <9a9e> <9a9e> 8067 <9a9f> <9aa1> 14407 <9aa2> <9aa2> 8463 <9aa3> <9aa3> 8155 <9aa4> <9aa9> 14410 <9aaa> <9aaa> 8367 <9aab> <9acf> 14416 <9ad0> <9ad0> 9408 <9ad1> <9ad5> 14453 <9ad6> <9ad6> 8813 <9ad7> <9ad9> 14458 <9ada> <9ada> 9409 <9adb> <9ae1> 14461 <9ae2> <9ae2> 8394 <9ae3> <9ae3> 14468 <9ae4> <9ae4> 8423 <9ae5> <9ae5> 9410 <9ae6> <9afe> 14469 <9b40> <9b7e> 14494 <9b80> <9bd0> 14557 <9bd1> <9bd1> 9180 <9bd2> <9bdb> 14638 <9bdc> <9bdc> 9179 <9bdd> <9bfe> 14648 <9c40> <9c52> 14682 <9c53> <9c53> 8286 <9c54> <9c58> 14701 <9c59> <9c59> 8772 <9c5a> <9c5a> 9186 <9c5b> <9c5b> 14706 <9c5c> <9c5c> 8404 <9c5d> <9c74> 14707 endcidrange 100 begincidrange <9c75> <9c75> 8607 <9c76> <9c78> 14731 <9c79> <9c79> 7782 <9c7a> <9c7e> 14734 <9c80> <9c85> 14739 <9c86> <9c86> 8035 <9c87> <9c9c> 14745 <9c9d> <9c9d> 9181 <9c9e> <9caa> 14767 <9cab> <9cab> 8555 <9cac> <9cc9> 14780 <9cca> <9cca> 8885 <9ccb> <9cce> 14810 <9ccf> <9ccf> 7974 <9cd0> <9ce5> 14814 <9ce6> <9ce6> 7779 <9ce7> <9ce7> 8328 <9ce8> <9ceb> 14836 <9cec> <9cec> 7869 <9ced> <9ced> 14840 <9cee> <9cee> 9025 <9cef> <9cfa> 14841 <9cfb> <9cfb> 8011 <9cfc> <9cfd> 14853 <9cfe> <9cfe> 8850 <9d40> <9d41> 14855 <9d42> <9d42> 8484 <9d43> <9d45> 14857 <9d46> <9d46> 8264 <9d47> <9d47> 9184 <9d48> <9d4c> 14860 <9d4d> <9d4d> 8311 <9d4e> <9d4e> 14865 <9d4f> <9d4f> 8762 <9d50> <9d60> 14866 <9d61> <9d61> 8369 <9d62> <9d67> 14883 <9d68> <9d68> 8001 <9d69> <9d69> 8220 <9d6a> <9d6d> 14889 <9d6e> <9d6e> 8888 <9d6f> <9d70> 14893 <9d71> <9d71> 8822 <9d72> <9d74> 14895 <9d75> <9d75> 8091 <9d76> <9d7a> 14898 <9d7b> <9d7b> 8095 <9d7c> <9d7c> 14903 <9d7d> <9d7d> 9674 <9d7e> <9d7e> 14904 <9d80> <9d89> 14905 <9d8a> <9d8a> 8382 <9d8b> <9d8c> 14915 <9d8d> <9d8d> 8116 <9d8e> <9d90> 14917 <9d91> <9d91> 9175 <9d92> <9d98> 14920 <9d99> <9d99> 8453 <9d9a> <9da0> 14927 <9da1> <9da1> 9185 <9da2> <9da2> 8172 <9da3> <9da6> 14934 <9da7> <9da7> 9194 <9da8> <9dab> 14938 <9dac> <9dac> 9187 <9dad> <9dad> 8462 <9dae> <9db1> 14942 <9db2> <9db2> 8102 <9db3> <9db3> 8196 <9db4> <9dbd> 14946 <9dbe> <9dbe> 8093 <9dbf> <9dc5> 14956 <9dc6> <9dc6> 9189 <9dc7> <9dc8> 14963 <9dc9> <9dc9> 8804 <9dca> <9dcc> 14965 <9dcd> <9dcd> 9442 <9dce> <9dd1> 14968 <9dd2> <9dd2> 9182 <9dd3> <9dd4> 14972 <9dd5> <9dd5> 7876 <9dd6> <9de0> 14974 <9de1> <9de1> 8886 <9de2> <9de2> 8361 <9de3> <9df0> 14985 <9df1> <9df1> 8491 <9df2> <9df3> 14999 <9df4> <9df4> 8357 <9df5> <9df6> 15001 <9df7> <9df7> 9867 <9df8> <9df9> 15003 <9dfa> <9dfa> 8054 <9dfb> <9dfc> 15005 <9dfd> <9dfd> 8557 <9dfe> <9dfe> 15007 <9e40> <9e44> 15008 <9e45> <9e45> 8193 <9e46> <9e47> 15013 <9e48> <9e48> 8593 <9e49> <9e49> 7760 endcidrange 100 begincidrange <9e4a> <9e51> 15015 <9e52> <9e52> 8092 <9e53> <9e53> 15023 <9e54> <9e54> 9178 <9e55> <9e55> 15024 <9e56> <9e56> 8275 <9e57> <9e5c> 15025 <9e5d> <9e5d> 9193 <9e5e> <9e5e> 9188 <9e5f> <9e60> 15031 <9e61> <9e61> 8661 <9e62> <9e62> 15033 <9e63> <9e63> 9190 <9e64> <9e66> 15034 <9e67> <9e67> 9183 <9e68> <9e6b> 15037 <9e6c> <9e6c> 7759 <9e6d> <9e6e> 15041 <9e6f> <9e6f> 9177 <9e70> <9e71> 15043 <9e72> <9e72> 8212 <9e73> <9e73> 15045 <9e74> <9e74> 9196 <9e75> <9e75> 9195 <9e76> <9e7a> 15046 <9e7b> <9e7b> 9176 <9e7c> <9e7c> 9198 <9e7d> <9e7e> 15051 <9e80> <9e84> 15053 <9e85> <9e85> 9870 <9e86> <9e86> 15058 <9e87> <9e87> 9197 <9e88> <9e90> 15059 <9e91> <9e91> 8186 <9e92> <9e95> 15068 <9e96> <9e96> 9174 <9e97> <9e97> 9192 <9e98> <9ea1> 15072 <9ea2> <9ea2> 8454 <9ea3> <9ea5> 15082 <9ea6> <9ea6> 8203 <9ea7> <9ea8> 15085 <9ea9> <9ea9> 8550 <9eaa> <9ead> 15087 <9eae> <9eae> 9199 <9eaf> <9eb2> 15091 <9eb3> <9eb3> 8585 <9eb4> <9eb4> 8280 <9eb5> <9eb6> 15095 <9eb7> <9eb7> 9191 <9eb8> <9ef4> 15097 <9ef5> <9ef5> 8611 <9ef6> <9efe> 15158 <9f40> <9f4d> 15167 <9f4e> <9f4e> 8570 <9f4f> <9f6e> 15181 <9f6f> <9f6f> 8613 <9f70> <9f7e> 15213 <9f80> <9f91> 15228 <9f92> <9f92> 8226 <9f93> <9f97> 15246 <9f98> <9f98> 9430 <9f99> <9fa5> 15251 <9fa6> <9fa6> 9018 <9fa7> <9fa8> 15264 <9fa9> <9fa9> 7918 <9faa> <9fab> 15266 <9fac> <9fac> 9429 <9fad> <9fc8> 15268 <9fc9> <9fc9> 8744 <9fca> <9fcc> 15296 <9fcd> <9fcd> 9431 <9fce> <9fe0> 15299 <9fe1> <9fe1> 8444 <9fe2> <9fea> 15318 <9feb> <9feb> 7815 <9fec> <9fed> 15327 <9fee> <9fee> 9432 <9fef> <9ff3> 15329 <9ff4> <9ff4> 7866 <9ff5> <9ffc> 15334 <9ffd> <9ffd> 8473 <9ffe> <9ffe> 15342 <a040> <a042> 15343 <a043> <a043> 8556 <a044> <a045> 15346 <a046> <a046> 9433 <a047> <a048> 15348 <a049> <a049> 8743 <a04a> <a04d> 15350 <a04e> <a04e> 7775 <a04f> <a053> 15354 <a054> <a054> 8863 <a055> <a059> 15359 <a05a> <a05a> 8029 <a05b> <a060> 15364 <a061> <a061> 8124 <a062> <a062> 15370 <a063> <a063> 9434 <a064> <a070> 15371 endcidrange 100 begincidrange <a071> <a071> 8521 <a072> <a073> 15384 <a074> <a074> 8262 <a075> <a07e> 15386 <a080> <a080> 8192 <a081> <a090> 15396 <a091> <a091> 8592 <a092> <a093> 15412 <a094> <a094> 8712 <a095> <a095> 15414 <a096> <a096> 7910 <a097> <a0a8> 15415 <a0a9> <a0a9> 9411 <a0aa> <a0be> 15433 <a0bf> <a0bf> 8396 <a0c0> <a0cd> 15454 <a0ce> <a0ce> 9024 <a0cf> <a0d8> 15468 <a0d9> <a0d9> 7889 <a0da> <a0dd> 15478 <a0de> <a0de> 8620 <a0df> <a0ed> 15482 <a0ee> <a0ee> 8879 <a0ef> <a0fe> 15497 <a1a1> <a1fe> 96 <a2a1> <a2aa> 9897 <a2b1> <a2e2> 190 <a2e5> <a2ee> 240 <a2f1> <a2fc> 250 <a3a1> <a3fe> 262 <a4a1> <a4f3> 356 <a5a1> <a5f6> 439 <a6a1> <a6b8> 525 <a6c1> <a6f5> 549 <a7a1> <a7c1> 602 <a7d1> <a7f1> 635 <a840> <a87e> 9907 <a880> <a895> 9970 <a8a1> <a8c0> 668 <a8c5> <a8ea> 700 <a940> <a957> 9992 <a959> <a95a> 10016 <a95c> <a95c> 10018 <a960> <a97e> 10019 <a980> <a995> 10050 <a996> <a996> 7703 <a9a4> <a9ef> 738 <aa40> <aa4c> 15513 <aa4d> <aa4d> 8630 <aa4e> <aa4e> 7741 <aa4f> <aa70> 15526 <aa71> <aa71> 8757 <aa72> <aa72> 15560 <aa73> <aa73> 9111 <aa74> <aa76> 15561 <aa77> <aa77> 9109 <aa78> <aa79> 15564 <aa7a> <aa7a> 8767 <aa7b> <aa7b> 8490 <aa7c> <aa7e> 15566 <aa80> <aa99> 15569 <aa9a> <aa9a> 7890 <aa9b> <aa9b> 15595 <aa9c> <aa9c> 9110 <aa9d> <aa9d> 9112 <aa9e> <aa9e> 15596 <aa9f> <aa9f> 8354 <aaa0> <aaa0> 15597 <aaa1> <aafe> 814 <ab40> <ab40> 8036 <ab41> <ab42> 15598 <ab43> <ab43> 8235 <ab44> <ab44> 15600 <ab45> <ab45> 9108 <ab46> <ab46> 8505 <ab47> <ab47> 15601 <ab48> <ab48> 8543 <ab49> <ab49> 8641 <ab4a> <ab4a> 9114 <ab4b> <ab4c> 15602 <ab4d> <ab4d> 9113 <ab4e> <ab7e> 15604 <ab80> <aba0> 15653 <aba1> <abc0> 908 <ac40> <ac45> 15686 <ac46> <ac46> 8640 <ac47> <ac70> 15692 <ac71> <ac71> 9312 <ac72> <ac7b> 15734 <ac7c> <ac7c> 9308 <ac7d> <ac7e> 15744 <ac80> <ac8c> 15746 <ac8d> <ac8d> 8541 <ac8e> <ac92> 15759 <ac93> <ac93> 8741 <ac94> <ac94> 8298 <ac95> <aca0> 15764 <ad40> <ad48> 15776 <ad49> <ad49> 9313 <ad4a> <ad5d> 15785 endcidrange 100 begincidrange <ad5e> <ad5e> 9307 <ad5f> <ad60> 15805 <ad61> <ad61> 9314 <ad62> <ad67> 15807 <ad68> <ad68> 8020 <ad69> <ad73> 15813 <ad74> <ad74> 9311 <ad75> <ad7e> 15824 <ad80> <ad81> 15834 <ad82> <ad82> 8428 <ad83> <ad86> 15836 <ad87> <ad87> 9309 <ad88> <ad8a> 15840 <ad8b> <ad8b> 9315 <ad8c> <ad90> 15843 <ad91> <ad91> 9316 <ad92> <ada0> 15848 <ae40> <ae53> 15863 <ae54> <ae54> 9381 <ae55> <ae61> 15883 <ae62> <ae62> 7792 <ae63> <ae7e> 15896 <ae80> <ae80> 8335 <ae81> <ae84> 15924 <ae85> <ae85> 7746 <ae86> <ae8a> 15928 <ae8b> <ae8b> 8014 <ae8c> <ae93> 15933 <ae94> <ae94> 7857 <ae95> <ae9f> 15941 <aea0> <aea0> 7819 <af40> <af63> 15952 <af64> <af64> 8134 <af65> <af7a> 15988 <af7b> <af7b> 9646 <af7c> <af7e> 16010 <af80> <af81> 16013 <af82> <af82> 7937 <af83> <af83> 8704 <af84> <af8d> 16015 <af8e> <af8e> 9650 <af8f> <af8f> 7831 <af90> <af90> 16025 <af91> <af91> 8363 <af92> <af9b> 16026 <af9c> <af9c> 9651 <af9d> <af9e> 16036 <af9f> <af9f> 8232 <afa0> <afa0> 16038 <b040> <b040> 16039 <b041> <b042> 9647 <b043> <b043> 16040 <b044> <b044> 9649 <b045> <b04e> 16041 <b04f> <b04f> 9644 <b050> <b053> 16051 <b054> <b054> 7758 <b055> <b056> 16055 <b057> <b057> 8706 <b058> <b058> 9643 <b059> <b059> 8838 <b05a> <b05a> 16057 <b05b> <b05b> 9645 <b05c> <b05c> 16058 <b05d> <b05d> 9654 <b05e> <b05e> 16059 <b05f> <b05f> 8675 <b060> <b061> 9652 <b062> <b062> 8751 <b063> <b063> 8549 <b064> <b064> 9655 <b065> <b06b> 16060 <b06c> <b06c> 7913 <b06d> <b07c> 16067 <b07d> <b07d> 7717 <b07e> <b07e> 16083 <b080> <b096> 16084 <b097> <b097> 9664 <b098> <b098> 16107 <b099> <b099> 8858 <b09a> <b0a0> 16108 <b0a1> <b0fe> 940 <b140> <b14a> 16115 <b14b> <b14b> 8814 <b14c> <b14c> 16126 <b14d> <b14d> 8125 <b14e> <b14e> 16127 <b14f> <b14f> 8068 <b150> <b150> 8370 <b151> <b151> 16128 <b152> <b152> 8259 <b153> <b17e> 16129 <b180> <b196> 16173 <b197> <b197> 9860 <b198> <b1a0> 16196 <b1a1> <b1fe> 1034 <b240> <b240> 16205 <b241> <b241> 9455 <b242> <b266> 16206 <b267> <b267> 9454 endcidrange 100 begincidrange <b268> <b26c> 16243 <b26d> <b26d> 8308 <b26e> <b273> 16248 <b274> <b274> 9863 <b275> <b27e> 16254 <b280> <b280> 9456 <b281> <b288> 16264 <b289> <b289> 9869 <b28a> <b299> 16272 <b29a> <b29a> 8864 <b29b> <b2a0> 16288 <b2a1> <b2fe> 1128 <b340> <b342> 16294 <b343> <b343> 8107 <b344> <b36f> 16297 <b370> <b370> 9896 <b371> <b37e> 16341 <b380> <b387> 16355 <b388> <b388> 9449 <b389> <b38b> 16363 <b38c> <b38c> 9445 <b38d> <b38d> 16366 <b38e> <b38e> 8698 <b38f> <b3a0> 16367 <b3a1> <b3fe> 1222 <b440> <b453> 16385 <b454> <b454> 8520 <b455> <b457> 16405 <b458> <b458> 9444 <b459> <b45d> 16408 <b45e> <b45e> 9446 <b45f> <b45f> 8439 <b460> <b460> 16413 <b461> <b461> 8299 <b462> <b474> 16414 <b475> <b475> 8871 <b476> <b47d> 16433 <b47e> <b47e> 9452 <b480> <b482> 16441 <b483> <b483> 9451 <b484> <b488> 16444 <b489> <b489> 9443 <b48a> <b492> 16449 <b493> <b493> 9450 <b494> <b4a0> 16458 <b4a1> <b4fe> 1316 <b540> <b540> 16471 <b541> <b541> 7826 <b542> <b54a> 16472 <b54b> <b54b> 7719 <b54c> <b555> 16481 <b556> <b556> 8166 <b557> <b559> 16491 <b55a> <b55a> 9447 <b55b> <b55b> 8210 <b55c> <b55c> 7916 <b55d> <b560> 16494 <b561> <b561> 9448 <b562> <b57e> 16498 <b580> <b59b> 16527 <b59c> <b59c> 8038 <b59d> <b59d> 9436 <b59e> <b5a0> 16555 <b5a1> <b5fe> 1410 <b640> <b651> 16558 <b652> <b652> 9890 <b653> <b654> 16576 <b655> <b655> 9437 <b656> <b658> 16578 <b659> <b659> 8206 <b65a> <b65a> 16581 <b65b> <b65b> 9435 <b65c> <b65c> 7864 <b65d> <b67e> 16582 <b680> <b6a0> 16616 <b6a1> <b6fe> 1504 <b740> <b74d> 16649 <b74e> <b74e> 8853 <b74f> <b750> 16663 <b751> <b751> 7808 <b752> <b758> 16665 <b759> <b759> 9847 <b75a> <b763> 16672 <b764> <b764> 9764 <b765> <b765> 8041 <b766> <b766> 8747 <b767> <b776> 16682 <b777> <b777> 9599 <b778> <b778> 8027 <b779> <b77e> 16698 <b780> <b780> 8603 <b781> <b781> 16704 <b782> <b782> 9853 <b783> <b7a0> 16705 <b7a1> <b7fe> 1598 <b840> <b842> 16735 <b843> <b843> 8608 <b844> <b844> 8582 <b845> <b845> 16738 <b846> <b846> 8429 endcidrange 100 begincidrange <b847> <b84c> 16739 <b84d> <b84d> 9657 <b84e> <b850> 16745 <b851> <b851> 8170 <b852> <b859> 16748 <b85a> <b85a> 7844 <b85b> <b85b> 8417 <b85c> <b85c> 16756 <b85d> <b85d> 9656 <b85e> <b85e> 8800 <b85f> <b85f> 16757 <b860> <b860> 8418 <b861> <b876> 16758 <b877> <b877> 8513 <b878> <b87e> 16780 <b880> <b881> 16787 <b882> <b882> 8135 <b883> <b8a0> 16789 <b8a1> <b8fe> 1692 <b940> <b94f> 16819 <b950> <b950> 7745 <b951> <b960> 16835 <b961> <b961> 9700 <b962> <b97a> 16851 <b97b> <b97b> 8070 <b97c> <b97e> 16876 <b980> <b99c> 16879 <b99d> <b99d> 8115 <b99e> <b99f> 16908 <b9a0> <b9a0> 7919 <b9a1> <b9fe> 1786 <ba40> <ba41> 16910 <ba42> <ba42> 8868 <ba43> <ba43> 16912 <ba44> <ba44> 9704 <ba45> <ba55> 16913 <ba56> <ba56> 9699 <ba57> <ba58> 16930 <ba59> <ba59> 8465 <ba5a> <ba5f> 16932 <ba60> <ba60> 9702 <ba61> <ba69> 16938 <ba6a> <ba6a> 9703 <ba6b> <ba73> 16947 <ba74> <ba74> 8257 <ba75> <ba7e> 16956 <ba80> <ba83> 16966 <ba84> <ba84> 9706 <ba85> <ba85> 16970 <ba86> <ba86> 8079 <ba87> <ba87> 16971 <ba88> <ba88> 9708 <ba89> <ba8c> 16972 <ba8d> <ba8d> 9707 <ba8e> <ba9d> 16976 <ba9e> <ba9e> 8400 <ba9f> <ba9f> 8221 <baa0> <baa0> 16992 <baa1> <bafe> 1880 <bb40> <bb40> 8183 <bb41> <bb48> 16993 <bb49> <bb49> 7821 <bb4a> <bb57> 17001 <bb58> <bb58> 9705 <bb59> <bb5a> 17015 <bb5b> <bb5b> 9710 <bb5c> <bb5c> 8250 <bb5d> <bb5f> 17017 <bb60> <bb60> 9875 <bb61> <bb64> 17020 <bb65> <bb65> 9701 <bb66> <bb66> 9709 <bb67> <bb67> 17024 <bb68> <bb68> 8201 <bb69> <bb69> 17025 <bb6a> <bb6a> 8293 <bb6b> <bb6d> 17026 <bb6e> <bb6e> 9891 <bb6f> <bb7e> 17029 <bb80> <bba0> 17045 <bba1> <bbfe> 1974 <bc40> <bc51> 17078 <bc52> <bc52> 9717 <bc53> <bc53> 7932 <bc54> <bc59> 17096 <bc5a> <bc5a> 8228 <bc5b> <bc60> 17102 <bc61> <bc61> 9883 <bc62> <bc62> 17108 <bc63> <bc63> 9715 <bc64> <bc64> 17109 <bc65> <bc65> 8921 <bc66> <bc66> 17110 <bc67> <bc67> 9716 <bc68> <bc68> 17111 <bc69> <bc69> 9243 <bc6a> <bc6c> 17112 <bc6d> <bc6d> 8136 <bc6e> <bc6e> 17115 <bc6f> <bc6f> 8059 endcidrange 100 begincidrange <bc70> <bc70> 17116 <bc71> <bc71> 9245 <bc72> <bc72> 17117 <bc73> <bc73> 8780 <bc74> <bc74> 8008 <bc75> <bc75> 9244 <bc76> <bc77> 9246 <bc78> <bc78> 8447 <bc79> <bc79> 8602 <bc7a> <bc7a> 17118 <bc7b> <bc7b> 8337 <bc7c> <bc7d> 17119 <bc7e> <bc7e> 8359 <bc80> <bc81> 17121 <bc82> <bc82> 9251 <bc83> <bc83> 7835 <bc84> <bc84> 9250 <bc85> <bc85> 17123 <bc86> <bc86> 8464 <bc87> <bc87> 17124 <bc88> <bc88> 8845 <bc89> <bc89> 8049 <bc8a> <bc8a> 7928 <bc8b> <bc8b> 9249 <bc8c> <bc8e> 17125 <bc8f> <bc8f> 7923 <bc90> <bc99> 17128 <bc9a> <bc9a> 8625 <bc9b> <bc9b> 9254 <bc9c> <bc9c> 9253 <bc9d> <bc9d> 8480 <bc9e> <bca0> 17138 <bca1> <bcfe> 2068 <bd40> <bd41> 17141 <bd42> <bd42> 8474 <bd43> <bd43> 9252 <bd44> <bd44> 17143 <bd45> <bd45> 9256 <bd46> <bd47> 17144 <bd48> <bd48> 9258 <bd49> <bd49> 9257 <bd4a> <bd4a> 17146 <bd4b> <bd4b> 8852 <bd4c> <bd4c> 17147 <bd4d> <bd4d> 8894 <bd4e> <bd4e> 17148 <bd4f> <bd4f> 7729 <bd50> <bd56> 17149 <bd57> <bd57> 9260 <bd58> <bd58> 17156 <bd59> <bd59> 8117 <bd5a> <bd65> 17157 <bd66> <bd66> 9259 <bd67> <bd67> 8111 <bd68> <bd69> 17169 <bd6a> <bd6a> 8296 <bd6b> <bd6b> 8676 <bd6c> <bd6e> 17171 <bd6f> <bd6f> 7969 <bd70> <bd70> 17174 <bd71> <bd71> 8449 <bd72> <bd78> 17175 <bd79> <bd79> 8572 <bd7a> <bd7a> 8522 <bd7b> <bd7b> 9261 <bd7c> <bd7d> 17182 <bd7e> <bd7e> 8148 <bd80> <bd80> 17184 <bd81> <bd81> 8145 <bd82> <bd88> 17185 <bd89> <bd89> 7731 <bd8a> <bd8a> 17192 <bd8b> <bd8b> 9263 <bd8c> <bd8d> 17193 <bd8e> <bd8e> 9262 <bd8f> <bd8f> 17195 <bd90> <bd90> 9264 <bd91> <bd91> 8667 <bd92> <bd96> 17196 <bd97> <bd97> 8536 <bd98> <bd9a> 17201 <bd9b> <bd9b> 8130 <bd9c> <bda0> 17204 <bda1> <bdfe> 2162 <be40> <be42> 17209 <be43> <be43> 8889 <be44> <be44> 17212 <be45> <be45> 9270 <be46> <be48> 17213 <be49> <be49> 7822 <be4a> <be4a> 9273 <be4b> <be50> 17216 <be51> <be51> 8645 <be52> <be52> 9271 <be53> <be53> 8594 <be54> <be54> 17222 <be55> <be55> 9274 <be56> <be56> 7961 <be57> <be57> 8588 <be58> <be58> 7744 endcidrange 100 begincidrange <be59> <be59> 8883 <be5a> <be5c> 17223 <be5d> <be5d> 8287 <be5e> <be5e> 9272 <be5f> <be5f> 9266 <be60> <be60> 8820 <be61> <be61> 17226 <be62> <be62> 7836 <be63> <be63> 9265 <be64> <be64> 8325 <be65> <be68> 17227 <be69> <be69> 9269 <be6a> <be6b> 17231 <be6c> <be6c> 9275 <be6d> <be6e> 17233 <be6f> <be6f> 8119 <be70> <be70> 9267 <be71> <be75> 17235 <be76> <be76> 8276 <be77> <be77> 8670 <be78> <be78> 17240 <be79> <be79> 9268 <be7a> <be7b> 17241 <be7c> <be7c> 9277 <be7d> <be7d> 8073 <be7e> <be7e> 9276 <be80> <be82> 17243 <be83> <be83> 8046 <be84> <be84> 7896 <be85> <be85> 17246 <be86> <be86> 7871 <be87> <be87> 9285 <be88> <be88> 17247 <be89> <be89> 8777 <be8a> <be8b> 17248 <be8c> <be8c> 9281 <be8d> <be8d> 17250 <be8e> <be8e> 7751 <be8f> <be8f> 8022 <be90> <be91> 17251 <be92> <be92> 8326 <be93> <be94> 17253 <be95> <be95> 8598 <be96> <be96> 17255 <be97> <be97> 9283 <be98> <be98> 9279 <be99> <be99> 17256 <be9a> <be9a> 8227 <be9b> <be9b> 17257 <be9c> <be9c> 9282 <be9d> <be9e> 17258 <be9f> <be9f> 9278 <bea0> <bea0> 17260 <bea1> <befe> 2256 <bf40> <bf40> 9894 <bf41> <bf4c> 17261 <bf4d> <bf4d> 9038 <bf4e> <bf4e> 9286 <bf4f> <bf4f> 9291 <bf50> <bf50> 9284 <bf51> <bf54> 17273 <bf55> <bf55> 9255 <bf56> <bf56> 9292 <bf57> <bf5f> 17277 <bf60> <bf60> 7951 <bf61> <bf61> 17286 <bf62> <bf62> 9287 <bf63> <bf63> 9289 <bf64> <bf64> 9288 <bf65> <bf67> 17287 <bf68> <bf68> 8642 <bf69> <bf6b> 17290 <bf6c> <bf6c> 8558 <bf6d> <bf6f> 17293 <bf70> <bf70> 7939 <bf71> <bf71> 17296 <bf72> <bf72> 9290 <bf73> <bf73> 8540 <bf74> <bf75> 17297 <bf76> <bf76> 8891 <bf77> <bf77> 9296 <bf78> <bf78> 17299 <bf79> <bf79> 9876 <bf7a> <bf7a> 9295 <bf7b> <bf7b> 9718 <bf7c> <bf7c> 8273 <bf7d> <bf7d> 17300 <bf7e> <bf7e> 9294 <bf80> <bf81> 17301 <bf82> <bf82> 8890 <bf83> <bf83> 8045 <bf84> <bf88> 17303 <bf89> <bf89> 9298 <bf8a> <bf8a> 9297 <bf8b> <bf94> 17308 <bf95> <bf95> 9301 <bf96> <bf96> 17318 <bf97> <bf97> 8841 <bf98> <bf98> 8470 <bf99> <bf9c> 17319 endcidrange 100 begincidrange <bf9d> <bf9d> 9300 <bf9e> <bfa0> 17323 <bfa1> <bffe> 2350 <c040> <c040> 8443 <c041> <c043> 17326 <c044> <c044> 9280 <c045> <c04a> 17329 <c04b> <c04b> 8486 <c04c> <c04c> 8033 <c04d> <c04d> 9885 <c04e> <c04e> 17335 <c04f> <c04f> 8074 <c050> <c050> 9302 <c051> <c051> 9305 <c052> <c052> 9304 <c053> <c054> 17336 <c055> <c055> 8110 <c056> <c05a> 17338 <c05b> <c05b> 8730 <c05c> <c05d> 17343 <c05e> <c05e> 8058 <c05f> <c05f> 9293 <c060> <c060> 9303 <c061> <c068> 17345 <c069> <c069> 9299 <c06a> <c06a> 17353 <c06b> <c06b> 9248 <c06c> <c06c> 17354 <c06d> <c06d> 8671 <c06e> <c06e> 9861 <c06f> <c06f> 17355 <c070> <c070> 7790 <c071> <c073> 17356 <c074> <c074> 8740 <c075> <c075> 9840 <c076> <c076> 17359 <c077> <c077> 8634 <c078> <c078> 17360 <c079> <c079> 9306 <c07a> <c07b> 17361 <c07c> <c07c> 8191 <c07d> <c07e> 17363 <c080> <c09a> 17365 <c09b> <c09b> 9698 <c09c> <c09c> 17392 <c09d> <c09d> 9882 <c09e> <c0a0> 17393 <c0a1> <c0fe> 2444 <c140> <c14f> 17396 <c150> <c150> 7914 <c151> <c153> 17412 <c154> <c154> 7724 <c155> <c15e> 17415 <c15f> <c15f> 8290 <c160> <c160> 9457 <c161> <c161> 17425 <c162> <c162> 9458 <c163> <c174> 17426 <c175> <c175> 9714 <c176> <c177> 17444 <c178> <c178> 8725 <c179> <c17e> 17446 <c180> <c194> 17452 <c195> <c195> 8622 <c196> <c1a0> 17473 <c1a1> <c1fe> 2538 <c240> <c24d> 17484 <c24e> <c24e> 8416 <c24f> <c264> 17498 <c265> <c265> 9666 <c266> <c266> 17520 <c267> <c267> 9665 <c268> <c27c> 17521 <c27d> <c27d> 8488 <c27e> <c27e> 17542 <c280> <c283> 17543 <c284> <c284> 8601 <c285> <c292> 17547 <c293> <c293> 8215 <c294> <c294> 7840 <c295> <c295> 8485 <c296> <c296> 8525 <c297> <c297> 17561 <c298> <c298> 9668 <c299> <c299> 8349 <c29a> <c29a> 8842 <c29b> <c29b> 17562 <c29c> <c29c> 9667 <c29d> <c29f> 17563 <c2a0> <c2a0> 8569 <c2a1> <c2fe> 2632 <c340> <c340> 8248 <c341> <c342> 17566 <c343> <c343> 8533 <c344> <c37a> 17568 <c37b> <c37b> 8658 <c37c> <c37e> 17623 <c380> <c383> 17626 <c384> <c384> 9415 <c385> <c39a> 17630 endcidrange 100 begincidrange <c39b> <c39b> 8825 <c39c> <c3a0> 17652 <c3a1> <c3fe> 2726 <c440> <c448> 17657 <c449> <c449> 8483 <c44a> <c44b> 17666 <c44c> <c44c> 9413 <c44d> <c453> 17668 <c454> <c454> 9417 <c455> <c457> 17675 <c458> <c458> 8340 <c459> <c45a> 17678 <c45b> <c45b> 8854 <c45c> <c462> 17680 <c463> <c463> 7799 <c464> <c476> 17687 <c477> <c477> 7942 <c478> <c479> 17706 <c47a> <c47a> 8101 <c47b> <c47e> 17708 <c480> <c480> 17712 <c481> <c481> 8345 <c482> <c490> 17713 <c491> <c491> 7853 <c492> <c492> 9416 <c493> <c493> 8360 <c494> <c497> 17728 <c498> <c498> 8223 <c499> <c499> 17732 <c49a> <c49a> 8389 <c49b> <c49b> 17733 <c49c> <c49c> 9418 <c49d> <c4a0> 17734 <c4a1> <c4fe> 2820 <c540> <c543> 17738 <c544> <c544> 8176 <c545> <c545> 17742 <c546> <c546> 9414 <c547> <c54a> 17743 <c54b> <c54b> 8797 <c54c> <c54c> 8926 <c54d> <c551> 17747 <c552> <c552> 8236 <c553> <c55e> 17752 <c55f> <c55f> 8545 <c560> <c562> 17764 <c563> <c563> 8763 <c564> <c564> 8665 <c565> <c565> 8139 <c566> <c566> 8137 <c567> <c57e> 17767 <c580> <c592> 17791 <c593> <c593> 7777 <c594> <c59b> 17810 <c59c> <c59c> 9711 <c59d> <c59d> 17818 <c59e> <c59e> 8088 <c59f> <c5a0> 17819 <c5a1> <c5fe> 2914 <c640> <c640> 17821 <c641> <c641> 9712 <c642> <c643> 17822 <c644> <c644> 8072 <c645> <c646> 17824 <c647> <c647> 8696 <c648> <c662> 17826 <c663> <c663> 8994 <c664> <c671> 17853 <c672> <c672> 9014 <c673> <c67e> 17867 <c680> <c6a0> 17879 <c6a1> <c6fe> 3008 <c740> <c765> 17912 <c766> <c766> 8875 <c767> <c76e> 17950 <c76f> <c76f> 8127 <c770> <c775> 17958 <c776> <c776> 8061 <c777> <c77a> 17964 <c77b> <c77b> 9011 <c77c> <c77e> 17968 <c780> <c7a0> 17971 <c7a1> <c7fe> 3102 <c840> <c840> 18004 <c841> <c841> 8013 <c842> <c84e> 18005 <c84f> <c84f> 9012 <c850> <c851> 18018 <c852> <c852> 8177 <c853> <c865> 18020 <c866> <c866> 8587 <c867> <c86d> 18039 <c86e> <c86e> 9033 <c86f> <c87d> 18046 <c87e> <c87e> 8715 <c880> <c886> 18061 <c887> <c887> 9030 <c888> <c891> 18068 <c892> <c892> 9031 <c893> <c893> 18078 endcidrange 100 begincidrange <c894> <c894> 8595 <c895> <c898> 18079 <c899> <c899> 9889 <c89a> <c89c> 18083 <c89d> <c89d> 8034 <c89e> <c8a0> 18086 <c8a1> <c8fe> 3196 <c940> <c94e> 18089 <c94f> <c94f> 9037 <c950> <c950> 9032 <c951> <c96d> 18104 <c96e> <c96e> 7776 <c96f> <c96f> 18133 <c970> <c970> 9029 <c971> <c976> 18134 <c977> <c977> 7954 <c978> <c97e> 18140 <c980> <c98e> 18147 <c98f> <c98f> 8216 <c990> <c990> 9013 <c991> <c99b> 18162 <c99c> <c99c> 9020 <c99d> <c9a0> 18173 <c9a1> <c9fe> 3290 <ca40> <ca4d> 18177 <ca4e> <ca4e> 9839 <ca4f> <ca55> 18191 <ca56> <ca56> 9041 <ca57> <ca58> 18198 <ca59> <ca59> 8096 <ca5a> <ca5b> 18200 <ca5c> <ca5c> 9016 <ca5d> <ca60> 18202 <ca61> <ca61> 8731 <ca62> <ca6d> 18206 <ca6e> <ca6e> 9026 <ca6f> <ca71> 18218 <ca72> <ca72> 9039 <ca73> <ca76> 18221 <ca77> <ca77> 9021 <ca78> <ca7a> 18225 <ca7b> <ca7b> 9028 <ca7c> <ca7c> 9009 <ca7d> <ca7d> 18228 <ca7e> <ca7e> 9035 <ca80> <ca80> 18229 <ca81> <ca81> 9019 <ca82> <ca88> 18230 <ca89> <ca89> 9040 <ca8a> <ca8d> 18237 <ca8e> <ca8e> 7860 <ca8f> <ca8f> 8614 <ca90> <ca91> 18241 <ca92> <ca92> 8651 <ca93> <ca99> 18243 <ca9a> <ca9a> 9045 <ca9b> <caa0> 18250 <caa1> <cafe> 3384 <cb40> <cb42> 18256 <cb43> <cb43> 9022 <cb44> <cb44> 18259 <cb45> <cb45> 8052 <cb46> <cb46> 18260 <cb47> <cb47> 9008 <cb48> <cb4a> 18261 <cb4b> <cb4b> 9856 <cb4c> <cb4d> 18264 <cb4e> <cb4e> 8410 <cb4f> <cb56> 18266 <cb57> <cb57> 9034 <cb58> <cb5c> 18274 <cb5d> <cb5d> 8081 <cb5e> <cb5e> 18279 <cb5f> <cb5f> 8455 <cb60> <cb69> 18280 <cb6a> <cb6a> 9023 <cb6b> <cb7a> 18290 <cb7b> <cb7b> 8180 <cb7c> <cb7c> 9027 <cb7d> <cb7e> 18306 <cb80> <cb86> 18308 <cb87> <cb87> 8722 <cb88> <cb8d> 18315 <cb8e> <cb8e> 8711 <cb8f> <cb91> 18321 <cb92> <cb92> 9049 <cb93> <cb9b> 18324 <cb9c> <cb9c> 8788 <cb9d> <cb9d> 18333 <cb9e> <cb9e> 9010 <cb9f> <cba0> 18334 <cba1> <cbfe> 3478 <cc40> <cc40> 7718 <cc41> <cc41> 9047 <cc42> <cc48> 18336 <cc49> <cc49> 9048 <cc4a> <cc4a> 8258 <cc4b> <cc4b> 8531 <cc4c> <cc4e> 18343 <cc4f> <cc4f> 8379 endcidrange 100 begincidrange <cc50> <cc5b> 18346 <cc5c> <cc5c> 9050 <cc5d> <cc5f> 18358 <cc60> <cc60> 9046 <cc61> <cc63> 18361 <cc64> <cc64> 9015 <cc65> <cc6c> 18364 <cc6d> <cc6d> 8185 <cc6e> <cc78> 18372 <cc79> <cc79> 9043 <cc7a> <cc7c> 18383 <cc7d> <cc7d> 8289 <cc7e> <cc7e> 18386 <cc80> <cc8d> 18387 <cc8e> <cc8e> 7829 <cc8f> <cc93> 18401 <cc94> <cc94> 8265 <cc95> <cc95> 18406 <cc96> <cc96> 8002 <cc97> <cc9c> 18407 <cc9d> <cc9d> 8168 <cc9e> <cca0> 18413 <cca1> <ccfe> 3572 <cd40> <cd7e> 18416 <cd80> <cd8f> 18479 <cd90> <cd90> 9690 <cd91> <cd97> 18495 <cd98> <cd98> 9687 <cd99> <cda0> 18502 <cda1> <cdfe> 3666 <ce40> <ce66> 18510 <ce67> <ce67> 8494 <ce68> <ce71> 18549 <ce72> <ce72> 8626 <ce73> <ce7e> 18559 <ce80> <ce80> 18571 <ce81> <ce81> 8606 <ce82> <ce86> 18572 <ce87> <ce87> 9692 <ce88> <ce9a> 18577 <ce9b> <ce9b> 8300 <ce9c> <ce9d> 18596 <ce9e> <ce9e> 8742 <ce9f> <cea0> 18598 <cea1> <cefe> 3760 <cf40> <cf4d> 18600 <cf4e> <cf4e> 9696 <cf4f> <cf54> 18614 <cf55> <cf55> 8827 <cf56> <cf57> 18620 <cf58> <cf58> 9694 <cf59> <cf5b> 18622 <cf5c> <cf5c> 9697 <cf5d> <cf6b> 18625 <cf6c> <cf6c> 9685 <cf6d> <cf72> 18640 <cf73> <cf73> 7787 <cf74> <cf74> 18646 <cf75> <cf75> 9691 <cf76> <cf77> 18647 <cf78> <cf78> 7817 <cf79> <cf7b> 18649 <cf7c> <cf7c> 9689 <cf7d> <cf7e> 18652 <cf80> <cf80> 18654 <cf81> <cf81> 8721 <cf82> <cf88> 18655 <cf89> <cf89> 8745 <cf8a> <cf8a> 9686 <cf8b> <cf92> 18662 <cf93> <cf93> 9693 <cf94> <cf94> 9695 <cf95> <cf9d> 18670 <cf9e> <cf9e> 8175 <cf9f> <cf9f> 18679 <cfa0> <cfa0> 9688 <cfa1> <cffe> 3854 <d040> <d04c> 18680 <d04d> <d04d> 7977 <d04e> <d050> 18693 <d051> <d051> 7771 <d052> <d054> 18696 <d055> <d055> 8310 <d056> <d05b> 18699 <d05c> <d05c> 8855 <d05d> <d05f> 18705 <d060> <d060> 9872 <d061> <d066> 18708 <d067> <d067> 8511 <d068> <d06b> 18714 <d06c> <d06c> 8600 <d06d> <d06d> 18718 <d06e> <d06e> 7816 <d06f> <d07c> 18719 <d07d> <d07d> 8844 <d07e> <d07e> 18733 <d080> <d0a0> 18734 <d0a1> <d0fe> 3948 <d140> <d154> 18767 <d155> <d155> 9713 endcidrange 100 begincidrange <d156> <d158> 18788 <d159> <d159> 8204 <d15a> <d160> 18791 <d161> <d161> 7768 <d162> <d162> 8876 <d163> <d174> 18798 <d175> <d175> 9895 <d176> <d17c> 18816 <d17d> <d17d> 9846 <d17e> <d17e> 18823 <d180> <d19c> 18824 <d19d> <d19d> 8161 <d19e> <d19e> 9659 <d19f> <d1a0> 18853 <d1a1> <d1fe> 4042 <d240> <d240> 9662 <d241> <d242> 18855 <d243> <d243> 8925 <d244> <d24c> 18857 <d24d> <d24d> 9661 <d24e> <d25b> 18866 <d25c> <d25c> 7722 <d25d> <d262> 18880 <d263> <d263> 9660 <d264> <d264> 9658 <d265> <d267> 18886 <d268> <d268> 9663 <d269> <d26c> 18889 <d26d> <d26d> 8583 <d26e> <d26e> 18893 <d26f> <d26f> 9835 <d270> <d271> 18894 <d272> <d272> 7807 <d273> <d274> 18896 <d275> <d275> 8621 <d276> <d27e> 18898 <d280> <d289> 18907 <d28a> <d28a> 8086 <d28b> <d28d> 18917 <d28e> <d28e> 7986 <d28f> <d291> 18920 <d292> <d292> 8324 <d293> <d294> 18923 <d295> <d295> 8502 <d296> <d296> 18925 <d297> <d297> 9400 <d298> <d29f> 18926 <d2a0> <d2a0> 9402 <d2a1> <d2fe> 4136 <d340> <d343> 18934 <d344> <d344> 9404 <d345> <d347> 18938 <d348> <d348> 8420 <d349> <d349> 18941 <d34a> <d34a> 9401 <d34b> <d34c> 18942 <d34d> <d34d> 9405 <d34e> <d34f> 18944 <d350> <d350> 9406 <d351> <d354> 18946 <d355> <d355> 9407 <d356> <d357> 18950 <d358> <d358> 8146 <d359> <d35a> 18952 <d35b> <d35b> 8189 <d35c> <d35c> 18954 <d35d> <d35d> 9403 <d35e> <d35e> 7981 <d35f> <d377> 18955 <d378> <d378> 9737 <d379> <d379> 18980 <d37a> <d37a> 9738 <d37b> <d37b> 18981 <d37c> <d37c> 7828 <d37d> <d37e> 18982 <d380> <d384> 18984 <d385> <d385> 8927 <d386> <d386> 7883 <d387> <d387> 7949 <d388> <d38a> 18989 <d38b> <d38b> 8055 <d38c> <d38c> 18992 <d38d> <d38d> 8683 <d38e> <d38e> 18993 <d38f> <d38f> 8929 <d390> <d390> 18994 <d391> <d391> 8559 <d392> <d392> 18995 <d393> <d393> 8928 <d394> <d395> 18996 <d396> <d396> 8682 <d397> <d397> 18998 <d398> <d398> 8930 <d399> <d399> 8395 <d39a> <d39a> 18999 <d39b> <d39b> 8056 <d39c> <d39d> 19000 <d39e> <d39e> 7906 <d39f> <d39f> 19002 <d3a0> <d3a0> 8690 endcidrange 100 begincidrange <d3a1> <d3fe> 4230 <d440> <d440> 19003 <d441> <d441> 8528 <d442> <d444> 19004 <d445> <d445> 8147 <d446> <d446> 19007 <d447> <d447> 8933 <d448> <d44b> 19008 <d44c> <d44c> 7922 <d44d> <d44e> 19012 <d44f> <d44f> 8479 <d450> <d452> 19014 <d453> <d453> 8669 <d454> <d455> 19017 <d456> <d456> 8532 <d457> <d457> 19019 <d458> <d458> 8935 <d459> <d45b> 19020 <d45c> <d45c> 8834 <d45d> <d461> 19023 <d462> <d462> 8934 <d463> <d466> 19028 <d467> <d467> 8936 <d468> <d46d> 19032 <d46e> <d46e> 8932 <d46f> <d46f> 19038 <d470> <d470> 8810 <d471> <d471> 19039 <d472> <d472> 8939 <d473> <d473> 19040 <d474> <d474> 8937 <d475> <d475> 8381 <d476> <d477> 19041 <d478> <d478> 8938 <d479> <d47a> 19043 <d47b> <d47b> 8893 <d47c> <d47d> 19045 <d47e> <d47e> 7838 <d480> <d481> 19047 <d482> <d482> 8950 <d483> <d483> 8679 <d484> <d484> 8726 <d485> <d486> 19049 <d487> <d487> 8503 <d488> <d489> 19051 <d48a> <d48a> 8492 <d48b> <d48b> 19053 <d48c> <d48c> 7784 <d48d> <d48d> 8946 <d48e> <d48e> 7991 <d48f> <d48f> 8947 <d490> <d490> 19054 <d491> <d491> 8943 <d492> <d492> 8016 <d493> <d493> 7952 <d494> <d494> 8648 <d495> <d495> 19055 <d496> <d496> 8945 <d497> <d49b> 19056 <d49c> <d49c> 8944 <d49d> <d49e> 19061 <d49f> <d49f> 8942 <d4a0> <d4a0> 19063 <d4a1> <d4fe> 4324 <d540> <d542> 19064 <d543> <d543> 8941 <d544> <d544> 8862 <d545> <d545> 8940 <d546> <d546> 8162 <d547> <d549> 19067 <d54a> <d54a> 8446 <d54b> <d54d> 19070 <d54e> <d54f> 8953 <d550> <d550> 19073 <d551> <d551> 7855 <d552> <d553> 19074 <d554> <d554> 8758 <d555> <d555> 19076 <d556> <d556> 8951 <d557> <d559> 19077 <d55a> <d55a> 8765 <d55b> <d55b> 19080 <d55c> <d55c> 7810 <d55d> <d55d> 8118 <d55e> <d55e> 19081 <d55f> <d55f> 8612 <d560> <d560> 8618 <d561> <d561> 8952 <d562> <d562> 8529 <d563> <d563> 19082 <d564> <d564> 8032 <d565> <d567> 19083 <d568> <d568> 8519 <d569> <d56b> 19086 <d56c> <d56c> 8517 <d56d> <d56d> 19089 <d56e> <d56e> 8156 <d56f> <d571> 19090 <d572> <d572> 8961 <d573> <d574> 19093 endcidrange 100 begincidrange <d575> <d575> 7925 <d576> <d577> 19095 <d578> <d578> 8728 <d579> <d57a> 19097 <d57b> <d57b> 7878 <d57c> <d57d> 19099 <d57e> <d57e> 8960 <d580> <d580> 19101 <d581> <d581> 8884 <d582> <d583> 19102 <d584> <d584> 8553 <d585> <d585> 19104 <d586> <d586> 8957 <d587> <d587> 19105 <d588> <d588> 8426 <d589> <d589> 19106 <d58a> <d58a> 8948 <d58b> <d58b> 19107 <d58c> <d58c> 8955 <d58d> <d58d> 19108 <d58e> <d58e> 8956 <d58f> <d58f> 8231 <d590> <d592> 19109 <d593> <d593> 8288 <d594> <d594> 8959 <d595> <d597> 19112 <d598> <d598> 8958 <d599> <d599> 7879 <d59a> <d59a> 19115 <d59b> <d59b> 8972 <d59c> <d59e> 19116 <d59f> <d59f> 8949 <d5a0> <d5a0> 19119 <d5a1> <d5fe> 4418 <d640> <d640> 8966 <d641> <d641> 19120 <d642> <d642> 8970 <d643> <d643> 8659 <d644> <d646> 19121 <d647> <d647> 8963 <d648> <d648> 19124 <d649> <d649> 8967 <d64a> <d64a> 8971 <d64b> <d64c> 19125 <d64d> <d64d> 8031 <d64e> <d64e> 19127 <d64f> <d64f> 8969 <d650> <d651> 19128 <d652> <d652> 8962 <d653> <d653> 7940 <d654> <d654> 8861 <d655> <d655> 19130 <d656> <d656> 8699 <d657> <d657> 19131 <d658> <d658> 8968 <d659> <d659> 19132 <d65a> <d65a> 8364 <d65b> <d65b> 19133 <d65c> <d65c> 8334 <d65d> <d65d> 8965 <d65e> <d65e> 8599 <d65f> <d65f> 19134 <d660> <d660> 8561 <d661> <d661> 8856 <d662> <d664> 19135 <d665> <d665> 8023 <d666> <d668> 19138 <d669> <d669> 8322 <d66a> <d66a> 19141 <d66b> <d66b> 8977 <d66c> <d66e> 19142 <d66f> <d66f> 8964 <d670> <d670> 19145 <d671> <d671> 8975 <d672> <d672> 7733 <d673> <d673> 19146 <d674> <d674> 8401 <d675> <d675> 8976 <d676> <d676> 8099 <d677> <d677> 19147 <d678> <d678> 8662 <d679> <d67b> 19148 <d67c> <d67c> 8710 <d67d> <d67e> 19151 <d680> <d682> 19153 <d683> <d683> 8973 <d684> <d685> 19156 <d686> <d686> 8978 <d687> <d687> 8333 <d688> <d688> 8979 <d689> <d68d> 19158 <d68e> <d68e> 8931 <d68f> <d693> 19163 <d694> <d694> 8122 <d695> <d698> 19168 <d699> <d699> 8312 <d69a> <d6a0> 19172 <d6a1> <d6fe> 4512 <d740> <d742> 19179 <d743> <d743> 8840 endcidrange 100 begincidrange <d744> <d747> 19182 <d748> <d748> 8982 <d749> <d749> 8043 <d74a> <d74f> 19186 <d750> <d750> 8980 <d751> <d751> 19192 <d752> <d752> 8496 <d753> <d753> 8981 <d754> <d754> 8552 <d755> <d755> 19193 <d756> <d756> 8388 <d757> <d763> 19194 <d764> <d764> 8984 <d765> <d766> 19207 <d767> <d767> 8729 <d768> <d768> 8727 <d769> <d76b> 19209 <d76c> <d76c> 8405 <d76d> <d76e> 19212 <d76f> <d76f> 8010 <d770> <d774> 19214 <d775> <d775> 8768 <d776> <d777> 19219 <d778> <d778> 7891 <d779> <d77e> 19221 <d780> <d782> 19227 <d783> <d783> 7753 <d784> <d786> 19230 <d787> <d787> 9755 <d788> <d78a> 19233 <d78b> <d78b> 7789 <d78c> <d78c> 8440 <d78d> <d78d> 19236 <d78e> <d78e> 8187 <d78f> <d78f> 8985 <d790> <d794> 19237 <d795> <d795> 8974 <d796> <d796> 19242 <d797> <d797> 8983 <d798> <d7a0> 19243 <d7a1> <d7f9> 4606 <d840> <d84c> 19252 <d84d> <d84d> 8392 <d84e> <d852> 19265 <d853> <d853> 7933 <d854> <d87e> 19270 <d880> <d88f> 19313 <d890> <d890> 7739 <d891> <d891> 8831 <d892> <d892> 19329 <d893> <d893> 7948 <d894> <d894> 7769 <d895> <d895> 7972 <d896> <d899> 19330 <d89a> <d89a> 8378 <d89b> <d89b> 8037 <d89c> <d89c> 7920 <d89d> <d89d> 8548 <d89e> <d89e> 7984 <d89f> <d89f> 8801 <d8a0> <d8a0> 19334 <d8a1> <d8fe> 4695 <d940> <d940> 19335 <d941> <d941> 8866 <d942> <d942> 9387 <d943> <d943> 19336 <d944> <d944> 9391 <d945> <d945> 7912 <d946> <d946> 7993 <d947> <d947> 19337 <d948> <d948> 7752 <d949> <d949> 8304 <d94a> <d94a> 7848 <d94b> <d94b> 19338 <d94c> <d94c> 9388 <d94d> <d94d> 7927 <d94e> <d94e> 8566 <d94f> <d94f> 9389 <d950> <d950> 19339 <d951> <d951> 8315 <d952> <d952> 8005 <d953> <d953> 9386 <d954> <d954> 8267 <d955> <d955> 8239 <d956> <d956> 8026 <d957> <d957> 9392 <d958> <d958> 19340 <d959> <d959> 8887 <d95a> <d95a> 8063 <d95b> <d95b> 19341 <d95c> <d95c> 8805 <d95d> <d962> 19342 <d963> <d963> 9394 <d964> <d964> 8475 <d965> <d965> 7761 <d966> <d966> 19348 <d967> <d967> 9396 <d968> <d96b> 19349 <d96c> <d96c> 9395 <d96d> <d96d> 19353 endcidrange 100 begincidrange <d96e> <d96e> 7839 <d96f> <d96f> 19354 <d970> <d970> 8472 <d971> <d971> 19355 <d972> <d972> 8372 <d973> <d973> 9135 <d974> <d974> 8635 <d975> <d975> 8306 <d976> <d976> 8085 <d977> <d977> 19356 <d978> <d978> 7946 <d979> <d979> 9398 <d97a> <d97b> 19357 <d97c> <d97c> 8849 <d97d> <d97d> 9397 <d97e> <d97e> 8824 <d980> <d980> 7892 <d981> <d986> 19359 <d987> <d987> 8179 <d988> <d98c> 19365 <d98d> <d98d> 8873 <d98e> <d98e> 9399 <d98f> <d98f> 7976 <d990> <d990> 8457 <d991> <d991> 8903 <d992> <d996> 19370 <d997> <d997> 9390 <d998> <d998> 8881 <d999> <d99a> 19375 <d99b> <d99b> 8806 <d99c> <d99c> 19377 <d99d> <d99d> 8795 <d99e> <d99e> 8900 <d99f> <d99f> 19378 <d9a0> <d9a0> 8469 <d9a1> <d9fe> 4789 <da40> <da40> 19379 <da41> <da41> 8746 <da42> <da42> 9393 <da43> <da47> 19380 <da48> <da48> 8509 <da49> <da4c> 19385 <da4d> <da4d> 7957 <da4e> <da4e> 8796 <da4f> <da72> 19389 <da73> <da73> 7956 <da74> <da76> 19425 <da77> <da77> 8826 <da78> <da7e> 19428 <da80> <da84> 19435 <da85> <da85> 8430 <da86> <da8d> 19440 <da8e> <da8e> 9720 <da8f> <daa0> 19448 <daa1> <dafe> 4883 <db40> <db5f> 19466 <db60> <db60> 8084 <db61> <db77> 19498 <db78> <db78> 8752 <db79> <db7e> 19521 <db80> <db83> 19527 <db84> <db84> 9725 <db85> <db8a> 19531 <db8b> <db8b> 9728 <db8c> <db97> 19537 <db98> <db98> 9734 <db99> <dba0> 19549 <dba1> <dbfe> 4977 <dc40> <dc44> 19557 <dc45> <dc45> 9727 <dc46> <dc4e> 19562 <dc4f> <dc4f> 9724 <dc50> <dc50> 7820 <dc51> <dc51> 9730 <dc52> <dc52> 19571 <dc53> <dc53> 8781 <dc54> <dc54> 19572 <dc55> <dc55> 9732 <dc56> <dc56> 9726 <dc57> <dc57> 9731 <dc58> <dc5c> 19573 <dc5d> <dc5d> 9729 <dc5e> <dc61> 19578 <dc62> <dc62> 9733 <dc63> <dc65> 19582 <dc66> <dc66> 7843 <dc67> <dc67> 9736 <dc68> <dc6a> 19585 <dc6b> <dc6b> 9735 <dc6c> <dc7b> 19588 <dc7c> <dc7c> 8432 <dc7d> <dc7e> 19604 <dc80> <dc86> 19606 <dc87> <dc87> 7803 <dc88> <dc88> 8807 <dc89> <dc89> 7990 <dc8a> <dc8a> 8150 <dc8b> <dc8d> 19613 <dc8e> <dc8e> 8672 <dc8f> <dc8f> 19616 endcidrange 100 begincidrange <dc90> <dc90> 9356 <dc91> <dc96> 19617 <dc97> <dc97> 9357 <dc98> <dc9a> 19623 <dc9b> <dc9b> 8450 <dc9c> <dc9f> 19626 <dca0> <dca0> 9364 <dca1> <dcfe> 5071 <dd40> <dd45> 19630 <dd46> <dd46> 9363 <dd47> <dd4c> 19636 <dd4d> <dd4d> 9358 <dd4e> <dd52> 19642 <dd53> <dd53> 8857 <dd54> <dd54> 9361 <dd55> <dd55> 9366 <dd56> <dd56> 9359 <dd57> <dd57> 9362 <dd58> <dd58> 19647 <dd59> <dd59> 9367 <dd5a> <dd5d> 19648 <dd5e> <dd5e> 8113 <dd5f> <dd5f> 19652 <dd60> <dd60> 9370 <dd61> <dd61> 19653 <dd62> <dd62> 9369 <dd63> <dd63> 19654 <dd64> <dd64> 8792 <dd65> <dd65> 9368 <dd66> <dd6c> 19655 <dd6d> <dd6d> 9371 <dd6e> <dd6e> 19662 <dd6f> <dd6f> 7945 <dd70> <dd70> 8422 <dd71> <dd75> 19663 <dd76> <dd76> 8230 <dd77> <dd77> 9375 <dd78> <dd78> 8025 <dd79> <dd7a> 9373 <dd7b> <dd7e> 19668 <dd80> <dd80> 19672 <dd81> <dd81> 7995 <dd82> <dd82> 9372 <dd83> <dd84> 19673 <dd85> <dd85> 7738 <dd86> <dd86> 8283 <dd87> <dd8a> 19675 <dd8b> <dd8b> 8048 <dd8c> <dd8e> 19679 <dd8f> <dd8f> 9376 <dd90> <dd93> 19682 <dd94> <dd94> 8507 <dd95> <dd96> 19686 <dd97> <dd97> 7943 <dd98> <dd99> 19688 <dd9a> <dd9a> 8816 <dd9b> <dd9b> 8759 <dd9c> <dd9d> 19690 <dd9e> <dd9e> 9426 <dd9f> <dd9f> 19692 <dda0> <dda0> 8627 <dda1> <ddfe> 5165 <de40> <de40> 8773 <de41> <de41> 9377 <de42> <de43> 19693 <de44> <de44> 8872 <de45> <de47> 19695 <de48> <de48> 8828 <de49> <de49> 8112 <de4a> <de4e> 19698 <de4f> <de4f> 9378 <de50> <de59> 19703 <de5a> <de5a> 8006 <de5b> <de5b> 19713 <de5c> <de5c> 9088 <de5d> <de5d> 9365 <de5e> <de5e> 19714 <de5f> <de5f> 9360 <de60> <de6a> 19715 <de6b> <de6b> 7728 <de6c> <de6e> 19726 <de6f> <de6f> 7837 <de70> <de70> 7755 <de71> <de71> 7754 <de72> <de72> 8362 <de73> <de7e> 19729 <de80> <de91> 19741 <de92> <de92> 9851 <de93> <de9e> 19759 <de9f> <de9f> 9202 <dea0> <dea0> 19771 <dea1> <defe> 5259 <df40> <df40> 8830 <df41> <df41> 19772 <df42> <df42> 8217 <df43> <df4c> 19773 <df4d> <df4d> 8123 <df4e> <df5b> 19783 <df5c> <df5c> 8787 <df5d> <df5d> 19797 endcidrange 100 begincidrange <df5e> <df5e> 7998 <df5f> <df5f> 7846 <df60> <df60> 8590 <df61> <df63> 19798 <df64> <df64> 8684 <df65> <df65> 19801 <df66> <df66> 7870 <df67> <df67> 19802 <df68> <df68> 8778 <df69> <df6c> 19803 <df6d> <df6d> 8499 <df6e> <df73> 19807 <df74> <df74> 7812 <df75> <df76> 19813 <df77> <df77> 8399 <df78> <df78> 8674 <df79> <df79> 19815 <df7a> <df7a> 8719 <df7b> <df7b> 19816 <df7c> <df7c> 8233 <df7d> <df7d> 19817 <df7e> <df7e> 8307 <df80> <df80> 8021 <df81> <df82> 19818 <df83> <df83> 9201 <df84> <df84> 19820 <df85> <df85> 7750 <df86> <df88> 19821 <df89> <df89> 8291 <df8a> <df8a> 9203 <df8b> <dfa0> 19824 <dfa1> <dffe> 5353 <e040> <e04f> 19846 <e050> <e050> 8990 <e051> <e05c> 19862 <e05d> <e05d> 8755 <e05e> <e068> 19874 <e069> <e069> 8992 <e06a> <e06b> 19885 <e06c> <e06c> 8647 <e06d> <e074> 19887 <e075> <e075> 8892 <e076> <e076> 19895 <e077> <e077> 8988 <e078> <e078> 19896 <e079> <e079> 8785 <e07a> <e07e> 19897 <e080> <e086> 19902 <e087> <e087> 7867 <e088> <e08c> 19909 <e08d> <e08d> 8839 <e08e> <e08e> 19914 <e08f> <e08f> 8237 <e090> <e090> 7851 <e091> <e091> 19915 <e092> <e092> 8989 <e093> <e093> 19916 <e094> <e094> 8991 <e095> <e096> 19917 <e097> <e097> 8987 <e098> <e0a0> 19919 <e0a1> <e0fe> 5447 <e140> <e141> 19928 <e142> <e142> 8993 <e143> <e163> 19930 <e164> <e164> 8789 <e165> <e167> 19963 <e168> <e168> 7823 <e169> <e173> 19966 <e174> <e174> 8716 <e175> <e175> 8100 <e176> <e17e> 19977 <e180> <e183> 19986 <e184> <e184> 8347 <e185> <e185> 8664 <e186> <e186> 19990 <e187> <e187> 9722 <e188> <e188> 19991 <e189> <e189> 9721 <e18a> <e18b> 19992 <e18c> <e18c> 8500 <e18d> <e18d> 19994 <e18e> <e190> 9459 <e191> <e191> 9464 <e192> <e192> 19995 <e193> <e193> 9463 <e194> <e194> 7880 <e195> <e195> 9462 <e196> <e197> 19996 <e198> <e198> 8832 <e199> <e19d> 19998 <e19e> <e19e> 7877 <e19f> <e19f> 9467 <e1a0> <e1a0> 20003 <e1a1> <e1fe> 5541 <e240> <e240> 20004 <e241> <e241> 9466 <e242> <e242> 20005 <e243> <e243> 7917 <e244> <e24e> 20006 endcidrange 100 begincidrange <e24f> <e24f> 9469 <e250> <e250> 20017 <e251> <e251> 9465 <e252> <e252> 20018 <e253> <e253> 9470 <e254> <e254> 8397 <e255> <e259> 20019 <e25a> <e25a> 9480 <e25b> <e25b> 9476 <e25c> <e25d> 20024 <e25e> <e25e> 9478 <e25f> <e261> 20026 <e262> <e262> 9471 <e263> <e263> 8336 <e264> <e266> 20029 <e267> <e267> 7901 <e268> <e268> 7973 <e269> <e269> 20032 <e26a> <e26a> 9475 <e26b> <e26b> 9474 <e26c> <e26d> 20033 <e26e> <e26e> 7802 <e26f> <e26f> 8358 <e270> <e277> 20035 <e278> <e278> 8149 <e279> <e27c> 20043 <e27d> <e27d> 7953 <e27e> <e27e> 20047 <e280> <e280> 9479 <e281> <e281> 9472 <e282> <e282> 9477 <e283> <e288> 20048 <e289> <e289> 9497 <e28a> <e28a> 20054 <e28b> <e28b> 9493 <e28c> <e28d> 20055 <e28e> <e28e> 9484 <e28f> <e28f> 8241 <e290> <e291> 20057 <e292> <e292> 9483 <e293> <e293> 9487 <e294> <e294> 9498 <e295> <e295> 9481 <e296> <e297> 20059 <e298> <e298> 9486 <e299> <e299> 8756 <e29a> <e29a> 9491 <e29b> <e29b> 8064 <e29c> <e29f> 20061 <e2a0> <e2a0> 9473 <e2a1> <e2fe> 5635 <e340> <e341> 20065 <e342> <e342> 9495 <e343> <e343> 9494 <e344> <e346> 20067 <e347> <e347> 9496 <e348> <e34a> 20070 <e34b> <e34b> 7766 <e34c> <e34e> 20073 <e34f> <e34f> 9485 <e350> <e350> 20076 <e351> <e351> 8403 <e352> <e353> 20077 <e354> <e354> 8314 <e355> <e355> 8398 <e356> <e357> 20079 <e358> <e358> 9488 <e359> <e35b> 20081 <e35c> <e35c> 7765 <e35d> <e35f> 20084 <e360> <e360> 9482 <e361> <e365> 20087 <e366> <e367> 9489 <e368> <e370> 20092 <e371> <e371> 8106 <e372> <e372> 20101 <e373> <e373> 9502 <e374> <e374> 7967 <e375> <e377> 20102 <e378> <e378> 9517 <e379> <e379> 8733 <e37a> <e37b> 20105 <e37c> <e37c> 9522 <e37d> <e37d> 20107 <e37e> <e37e> 8571 <e380> <e389> 20108 <e38a> <e38a> 8623 <e38b> <e38b> 20118 <e38c> <e38c> 9516 <e38d> <e38e> 20119 <e38f> <e38f> 9512 <e390> <e390> 20121 <e391> <e391> 8332 <e392> <e392> 20122 <e393> <e393> 9519 <e394> <e394> 20123 <e395> <e395> 8636 <e396> <e398> 20124 <e399> <e399> 9501 <e39a> <e39b> 20127 endcidrange 100 begincidrange <e39c> <e39c> 9525 <e39d> <e39d> 20129 <e39e> <e39e> 8717 <e39f> <e39f> 9510 <e3a0> <e3a0> 20130 <e3a1> <e3fe> 5729 <e440> <e440> 9524 <e441> <e441> 9514 <e442> <e442> 9503 <e443> <e443> 9521 <e444> <e444> 9500 <e445> <e447> 20131 <e448> <e448> 9509 <e449> <e44d> 20134 <e44e> <e44e> 8653 <e44f> <e44f> 20139 <e450> <e450> 8666 <e451> <e451> 20140 <e452> <e452> 8562 <e453> <e453> 9534 <e454> <e457> 20141 <e458> <e458> 8271 <e459> <e459> 20145 <e45a> <e45a> 9539 <e45b> <e45b> 20146 <e45c> <e45c> 8663 <e45d> <e45d> 20147 <e45e> <e45e> 7740 <e45f> <e461> 20148 <e462> <e462> 9513 <e463> <e464> 20151 <e465> <e465> 9505 <e466> <e467> 20153 <e468> <e468> 7935 <e469> <e472> 20155 <e473> <e473> 9535 <e474> <e474> 20165 <e475> <e475> 9540 <e476> <e478> 20166 <e479> <e479> 9507 <e47a> <e47a> 7824 <e47b> <e47b> 9530 <e47c> <e47c> 9541 <e47d> <e47d> 20169 <e47e> <e47e> 9533 <e480> <e480> 20170 <e481> <e481> 8385 <e482> <e483> 20171 <e484> <e484> 8451 <e485> <e485> 9504 <e486> <e486> 9532 <e487> <e487> 9531 <e488> <e488> 9528 <e489> <e48c> 20173 <e48d> <e48d> 9536 <e48e> <e48e> 20177 <e48f> <e48f> 8141 <e490> <e492> 20178 <e493> <e493> 7960 <e494> <e497> 20181 <e498> <e498> 9547 <e499> <e49c> 20185 <e49d> <e49d> 9543 <e49e> <e49f> 9551 <e4a0> <e4a0> 20189 <e4a1> <e4fe> 5823 <e540> <e545> 20190 <e546> <e546> 8880 <e547> <e547> 20196 <e548> <e548> 9542 <e549> <e54a> 20197 <e54b> <e54b> 9548 <e54c> <e54d> 20199 <e54e> <e54e> 7834 <e54f> <e54f> 9554 <e550> <e550> 9520 <e551> <e551> 9545 <e552> <e554> 20201 <e555> <e555> 9553 <e556> <e556> 7882 <e557> <e557> 20204 <e558> <e558> 8402 <e559> <e55b> 20205 <e55c> <e55c> 8120 <e55d> <e55d> 20208 <e55e> <e55e> 8313 <e55f> <e560> 20209 <e561> <e561> 8619 <e562> <e563> 20211 <e564> <e564> 9549 <e565> <e565> 7845 <e566> <e567> 20213 <e568> <e568> 8268 <e569> <e569> 8320 <e56a> <e56b> 20215 <e56c> <e56c> 9837 <e56d> <e56d> 20217 <e56e> <e56e> 9527 <e56f> <e574> 20218 <e575> <e575> 9546 endcidrange 100 begincidrange <e576> <e576> 8632 <e577> <e577> 20224 <e578> <e578> 9550 <e579> <e57a> 20225 <e57b> <e57b> 9468 <e57c> <e57c> 9556 <e57d> <e57e> 20227 <e580> <e580> 20229 <e581> <e581> 7996 <e582> <e582> 20230 <e583> <e583> 7893 <e584> <e589> 20231 <e58a> <e58a> 9558 <e58b> <e58d> 20237 <e58e> <e58e> 8808 <e58f> <e590> 20240 <e591> <e591> 7894 <e592> <e599> 20242 <e59a> <e59a> 9559 <e59b> <e59b> 9555 <e59c> <e59e> 20250 <e59f> <e59f> 9544 <e5a0> <e5a0> 20253 <e5a1> <e5fe> 5917 <e640> <e640> 8412 <e641> <e643> 20254 <e644> <e644> 9561 <e645> <e648> 20257 <e649> <e649> 8087 <e64a> <e64a> 9557 <e64b> <e64d> 20261 <e64e> <e64e> 8829 <e64f> <e651> 20264 <e652> <e652> 9598 <e653> <e655> 20267 <e656> <e656> 8316 <e657> <e657> 20270 <e658> <e658> 9562 <e659> <e65a> 20271 <e65b> <e65b> 9566 <e65c> <e65d> 20273 <e65e> <e65e> 7732 <e65f> <e668> 20275 <e669> <e669> 8542 <e66a> <e66a> 20285 <e66b> <e66b> 9568 <e66c> <e674> 20286 <e675> <e675> 8610 <e676> <e676> 9044 <e677> <e678> 20295 <e679> <e679> 9571 <e67a> <e67a> 9511 <e67b> <e67b> 20297 <e67c> <e67c> 9518 <e67d> <e67d> 9560 <e67e> <e67e> 20298 <e680> <e680> 7963 <e681> <e681> 20299 <e682> <e682> 8835 <e683> <e683> 20300 <e684> <e684> 9572 <e685> <e686> 20301 <e687> <e687> 8352 <e688> <e688> 20303 <e689> <e689> 9573 <e68a> <e68b> 20304 <e68c> <e68c> 9569 <e68d> <e692> 20306 <e693> <e693> 9570 <e694> <e696> 20312 <e697> <e697> 9580 <e698> <e69a> 20315 <e69b> <e69b> 9581 <e69c> <e69c> 8224 <e69d> <e69e> 20318 <e69f> <e69f> 9567 <e6a0> <e6a0> 9578 <e6a1> <e6fe> 6011 <e740> <e742> 20320 <e743> <e743> 9582 <e744> <e747> 20323 <e748> <e748> 9529 <e749> <e749> 9564 <e74a> <e74c> 20327 <e74d> <e74e> 9576 <e74f> <e74f> 9579 <e750> <e750> 7791 <e751> <e751> 20330 <e752> <e752> 8132 <e753> <e753> 9575 <e754> <e754> 20331 <e755> <e755> 9563 <e756> <e758> 20332 <e759> <e759> 9757 <e75a> <e765> 20335 <e766> <e766> 9515 <e767> <e767> 20347 <e768> <e768> 9585 <e769> <e769> 20348 <e76a> <e76a> 9591 endcidrange 100 begincidrange <e76b> <e773> 20349 <e774> <e774> 9506 <e775> <e77b> 20358 <e77c> <e77c> 9523 <e77d> <e77e> 20365 <e780> <e781> 20367 <e782> <e782> 8234 <e783> <e783> 20369 <e784> <e784> 9526 <e785> <e785> 9587 <e786> <e786> 9583 <e787> <e789> 20370 <e78a> <e78a> 8851 <e78b> <e78b> 9592 <e78c> <e78e> 20373 <e78f> <e78f> 9584 <e790> <e791> 20376 <e792> <e792> 9589 <e793> <e797> 20378 <e798> <e799> 9537 <e79a> <e79a> 9565 <e79b> <e79f> 20383 <e7a0> <e7a0> 8218 <e7a1> <e7fe> 6105 <e840> <e842> 20388 <e843> <e843> 9594 <e844> <e844> 8198 <e845> <e845> 20391 <e846> <e846> 8567 <e847> <e848> 20392 <e849> <e849> 9499 <e84a> <e84a> 20394 <e84b> <e84b> 9508 <e84c> <e84e> 20395 <e84f> <e84f> 9595 <e850> <e853> 20398 <e854> <e854> 8867 <e855> <e859> 20402 <e85a> <e85a> 9593 <e85b> <e85b> 20407 <e85c> <e85c> 9574 <e85d> <e861> 20408 <e862> <e862> 8083 <e863> <e863> 20413 <e864> <e864> 9596 <e865> <e86f> 20414 <e870> <e870> 9492 <e871> <e872> 20425 <e873> <e873> 9597 <e874> <e874> 20427 <e875> <e875> 9586 <e876> <e87b> 20428 <e87c> <e87c> 9588 <e87d> <e87e> 20434 <e880> <e880> 8782 <e881> <e881> 20436 <e882> <e882> 8646 <e883> <e886> 20437 <e887> <e887> 8351 <e888> <e888> 20441 <e889> <e889> 9590 <e88a> <e88b> 20442 <e88c> <e88c> 8292 <e88d> <e88d> 8895 <e88e> <e88e> 9756 <e88f> <e88f> 8798 <e890> <e8a0> 20444 <e8a1> <e8fe> 6199 <e940> <e94b> 20461 <e94c> <e94c> 7797 <e94d> <e953> 20473 <e954> <e954> 8317 <e955> <e955> 20480 <e956> <e956> 9151 <e957> <e957> 8467 <e958> <e959> 20481 <e95a> <e95a> 9152 <e95b> <e95c> 20483 <e95d> <e95d> 7749 <e95e> <e95e> 20485 <e95f> <e95f> 8152 <e960> <e960> 9156 <e961> <e961> 20486 <e962> <e962> 9154 <e963> <e963> 8452 <e964> <e964> 20487 <e965> <e965> 8637 <e966> <e966> 20488 <e967> <e967> 8071 <e968> <e968> 9155 <e969> <e96b> 20489 <e96c> <e96c> 8809 <e96d> <e974> 20492 <e975> <e975> 8003 <e976> <e976> 20500 <e977> <e977> 7966 <e978> <e978> 9849 <e979> <e979> 7915 <e97a> <e97b> 20501 <e97c> <e97c> 7989 endcidrange 100 begincidrange <e97d> <e97d> 8330 <e97e> <e97e> 20503 <e980> <e980> 9159 <e981> <e981> 9161 <e982> <e982> 9158 <e983> <e986> 20504 <e987> <e987> 8783 <e988> <e98a> 20508 <e98b> <e98b> 9163 <e98c> <e98d> 20511 <e98e> <e98e> 8691 <e98f> <e98f> 20513 <e990> <e990> 8695 <e991> <e991> 9167 <e992> <e992> 9166 <e993> <e993> 9162 <e994> <e994> 9165 <e995> <e997> 20514 <e998> <e998> 9168 <e999> <e99a> 20517 <e99b> <e99b> 9836 <e99c> <e99c> 20519 <e99d> <e99d> 9153 <e99e> <e99e> 20520 <e99f> <e99f> 8174 <e9a0> <e9a0> 9169 <e9a1> <e9fe> 6293 <ea40> <ea40> 8184 <ea41> <ea43> 20521 <ea44> <ea44> 9171 <ea45> <ea47> 20524 <ea48> <ea48> 9170 <ea49> <ea49> 9172 <ea4a> <ea4a> 7832 <ea4b> <ea4f> 20527 <ea50> <ea50> 7980 <ea51> <ea51> 20532 <ea52> <ea52> 9173 <ea53> <ea54> 20533 <ea55> <ea55> 7793 <ea56> <ea56> 9873 <ea57> <ea58> 20535 <ea59> <ea59> 9157 <ea5a> <ea7e> 20537 <ea80> <ea80> 8986 <ea81> <ea83> 20574 <ea84> <ea84> 8468 <ea85> <ea86> 20577 <ea87> <ea87> 8836 <ea88> <ea8d> 20579 <ea8e> <ea8e> 8732 <ea8f> <ea8f> 20585 <ea90> <ea90> 7806 <ea91> <ea91> 8269 <ea92> <ea95> 20586 <ea96> <ea96> 8705 <ea97> <ea9f> 20590 <eaa0> <eaa0> 7897 <eaa1> <eafe> 6387 <eb40> <eb40> 20599 <eb41> <eb41> 8114 <eb42> <eb44> 20600 <eb45> <eb45> 8786 <eb46> <eb47> 20603 <eb48> <eb48> 8057 <eb49> <eb52> 20605 <eb53> <eb53> 8535 <eb54> <eb54> 20615 <eb55> <eb55> 8639 <eb56> <eb5a> 20616 <eb5b> <eb5b> 8735 <eb5c> <eb5c> 20621 <eb5d> <eb5d> 8253 <eb5e> <eb5f> 20622 <eb60> <eb60> 8213 <eb61> <eb61> 20624 <eb62> <eb62> 9893 <eb63> <eb6c> 20625 <eb6d> <eb6d> 8534 <eb6e> <eb6f> 20635 <eb70> <eb70> 8516 <eb71> <eb71> 20637 <eb72> <eb72> 7825 <eb73> <eb73> 8791 <eb74> <eb77> 20638 <eb78> <eb78> 8202 <eb79> <eb79> 8338 <eb7a> <eb7e> 20642 <eb80> <eb84> 20647 <eb85> <eb85> 8784 <eb86> <eb89> 20652 <eb8a> <eb8a> 7875 <eb8b> <eba0> 20656 <eba1> <ebfe> 6481 <ec40> <ec45> 20678 <ec46> <ec46> 8616 <ec47> <ec55> 20684 <ec56> <ec56> 9741 <ec57> <ec59> 20699 <ec5a> <ec5a> 9740 endcidrange 100 begincidrange <ec5b> <ec5b> 20702 <ec5c> <ec5c> 9742 <ec5d> <ec5f> 20703 <ec60> <ec60> 8242 <ec61> <ec6d> 20706 <ec6e> <ec6e> 9739 <ec6f> <ec75> 20719 <ec76> <ec76> 8899 <ec77> <ec7e> 20726 <ec80> <ec95> 20734 <ec96> <ec96> 7971 <ec97> <eca0> 20756 <eca1> <ecfe> 6575 <ed40> <ed45> 20766 <ed46> <ed46> 9877 <ed47> <ed57> 20772 <ed58> <ed58> 9822 <ed59> <ed5d> 20789 <ed5e> <ed5e> 9821 <ed5f> <ed60> 20794 <ed61> <ed61> 9874 <ed62> <ed63> 20796 <ed64> <ed64> 9823 <ed65> <ed65> 20798 <ed66> <ed66> 8589 <ed67> <ed67> 8445 <ed68> <ed6d> 20799 <ed6e> <ed6e> 8000 <ed6f> <ed73> 20805 <ed74> <ed74> 9317 <ed75> <ed76> 20810 <ed77> <ed77> 9319 <ed78> <ed78> 20812 <ed79> <ed79> 9318 <ed7a> <ed7e> 20813 <ed80> <ed90> 20818 <ed91> <ed91> 8649 <ed92> <ed92> 20835 <ed93> <ed93> 8713 <ed94> <ed94> 7881 <ed95> <ed95> 8425 <ed96> <ed96> 20836 <ed97> <ed97> 8650 <ed98> <ed98> 8518 <ed99> <ed99> 9669 <ed9a> <ed9a> 8668 <ed9b> <ed9b> 20837 <ed9c> <ed9c> 9310 <ed9d> <ed9d> 20838 <ed9e> <ed9e> 8527 <ed9f> <ed9f> 20839 <eda0> <eda0> 9670 <eda1> <edfe> 6669 <ee40> <ee40> 9671 <ee41> <ee41> 8769 <ee42> <ee42> 8586 <ee43> <ee43> 7727 <ee44> <ee44> 7900 <ee45> <ee47> 20840 <ee48> <ee48> 8383 <ee49> <ee49> 8244 <ee4a> <ee4c> 20843 <ee4d> <ee4d> 9673 <ee4e> <ee51> 20846 <ee52> <ee52> 9672 <ee53> <ee54> 20850 <ee55> <ee55> 8718 <ee56> <ee56> 20852 <ee57> <ee57> 9675 <ee58> <ee5d> 20853 <ee5e> <ee5e> 8573 <ee5f> <ee60> 20859 <ee61> <ee61> 8062 <ee62> <ee67> 20861 <ee68> <ee68> 9676 <ee69> <ee69> 8131 <ee6a> <ee6b> 20867 <ee6c> <ee6c> 8377 <ee6d> <ee6d> 20869 <ee6e> <ee6e> 8577 <ee6f> <ee76> 20870 <ee77> <ee77> 8154 <ee78> <ee7c> 20878 <ee7d> <ee7d> 8563 <ee7e> <ee7e> 7905 <ee80> <ee80> 9677 <ee81> <ee84> 20883 <ee85> <ee85> 9678 <ee86> <ee86> 8694 <ee87> <ee89> 20887 <ee8a> <ee8a> 8779 <ee8b> <ee8b> 9681 <ee8c> <ee8c> 20890 <ee8d> <ee8d> 7872 <ee8e> <ee8f> 20891 <ee90> <ee90> 8200 <ee91> <ee93> 20893 <ee94> <ee94> 9680 <ee95> <ee96> 20896 <ee97> <ee97> 9682 endcidrange 100 begincidrange <ee98> <ee98> 20898 <ee99> <ee99> 7978 <ee9a> <ee9c> 20899 <ee9d> <ee9d> 7794 <ee9e> <ee9e> 9683 <ee9f> <eea0> 20902 <eea1> <eefe> 6763 <ef40> <ef40> 8638 <ef41> <ef41> 9684 <ef42> <ef42> 8260 <ef43> <ef43> 20904 <ef44> <ef44> 9679 <ef45> <ef45> 8435 <ef46> <ef4b> 20905 <ef4c> <ef4c> 7936 <ef4d> <ef51> 20911 <ef52> <ef53> 9420 <ef54> <ef54> 20916 <ef55> <ef55> 9880 <ef56> <ef56> 20917 <ef57> <ef57> 9848 <ef58> <ef59> 20918 <ef5a> <ef5a> 9422 <ef5b> <ef5f> 20920 <ef60> <ef60> 9423 <ef61> <ef67> 20925 <ef68> <ef68> 8376 <ef69> <ef69> 20932 <ef6a> <ef6a> 9424 <ef6b> <ef6b> 20933 <ef6c> <ef6c> 9425 <ef6d> <ef76> 20934 <ef77> <ef77> 7924 <ef78> <ef79> 20944 <ef7a> <ef7a> 9115 <ef7b> <ef7b> 20946 <ef7c> <ef7c> 9854 <ef7d> <ef7e> 20947 <ef80> <ef81> 20949 <ef82> <ef82> 9117 <ef83> <ef84> 9119 <ef85> <ef85> 20951 <ef86> <ef86> 9121 <ef87> <ef87> 20952 <ef88> <ef88> 7921 <ef89> <ef8a> 20953 <ef8b> <ef8b> 8734 <ef8c> <ef8c> 20955 <ef8d> <ef8d> 9122 <ef8e> <ef94> 20956 <ef95> <ef95> 8523 <ef96> <ef96> 7734 <ef97> <ef97> 8501 <ef98> <ef9b> 20963 <ef9c> <ef9c> 8109 <ef9d> <ef9d> 20967 <ef9e> <ef9e> 7763 <ef9f> <efa0> 20968 <efa1> <effe> 6857 <f040> <f040> 20970 <f041> <f041> 9123 <f042> <f042> 8707 <f043> <f043> 20971 <f044> <f044> 7911 <f045> <f046> 20972 <f047> <f047> 9124 <f048> <f048> 8343 <f049> <f049> 7908 <f04a> <f04d> 20974 <f04e> <f04e> 8760 <f04f> <f050> 20978 <f051> <f051> 9125 <f052> <f053> 20980 <f054> <f054> 8090 <f055> <f056> 20982 <f057> <f057> 8643 <f058> <f05d> 20984 <f05e> <f05e> 7982 <f05f> <f067> 20990 <f068> <f068> 9116 <f069> <f06b> 20999 <f06c> <f06c> 9126 <f06d> <f070> 21002 <f071> <f071> 9118 <f072> <f072> 21006 <f073> <f073> 8245 <f074> <f074> 9127 <f075> <f077> 21007 <f078> <f078> 9128 <f079> <f079> 21010 <f07a> <f07a> 8309 <f07b> <f07c> 21011 <f07d> <f07e> 9129 <f080> <f080> 9131 <f081> <f081> 8171 <f082> <f082> 9132 <f083> <f086> 21013 <f087> <f087> 8042 <f088> <f088> 8441 <f089> <f08a> 21017 endcidrange 100 begincidrange <f08b> <f08b> 9830 <f08c> <f08f> 21019 <f090> <f090> 9831 <f091> <f091> 21023 <f092> <f092> 7788 <f093> <f095> 21024 <f096> <f096> 9133 <f097> <f0a0> 21027 <f0a1> <f0fe> 6951 <f140> <f151> 21037 <f152> <f152> 8301 <f153> <f153> 8770 <f154> <f154> 7938 <f155> <f156> 21055 <f157> <f157> 8579 <f158> <f158> 21057 <f159> <f159> 7813 <f15a> <f15a> 8681 <f15b> <f166> 21058 <f167> <f167> 7767 <f168> <f175> 21070 <f176> <f176> 8869 <f177> <f177> 9223 <f178> <f178> 8138 <f179> <f179> 21084 <f17a> <f17a> 9218 <f17b> <f17b> 8066 <f17c> <f17d> 21085 <f17e> <f17e> 9224 <f180> <f180> 9220 <f181> <f181> 21087 <f182> <f182> 8497 <f183> <f183> 21088 <f184> <f184> 8580 <f185> <f185> 21089 <f186> <f186> 9219 <f187> <f187> 21090 <f188> <f188> 8302 <f189> <f189> 9227 <f18a> <f193> 21091 <f194> <f194> 7999 <f195> <f197> 21101 <f198> <f198> 8295 <f199> <f1a0> 21104 <f1a1> <f1fe> 7045 <f240> <f244> 21112 <f245> <f245> 8151 <f246> <f246> 21117 <f247> <f247> 7811 <f248> <f24a> 21118 <f24b> <f24b> 9231 <f24c> <f252> 21121 <f253> <f253> 9230 <f254> <f254> 8391 <f255> <f255> 9229 <f256> <f25b> 21128 <f25c> <f25c> 9234 <f25d> <f25e> 21134 <f25f> <f25f> 8375 <f260> <f270> 21136 <f271> <f271> 9200 <f272> <f272> 21153 <f273> <f273> 9233 <f274> <f274> 9236 <f275> <f275> 21154 <f276> <f276> 8560 <f277> <f27b> 21155 <f27c> <f27c> 9221 <f27d> <f27d> 8460 <f27e> <f27e> 9237 <f280> <f284> 21160 <f285> <f285> 8294 <f286> <f286> 21165 <f287> <f287> 9042 <f288> <f288> 9235 <f289> <f289> 9232 <f28a> <f28b> 9238 <f28c> <f28c> 8433 <f28d> <f290> 21166 <f291> <f291> 9226 <f292> <f293> 21170 <f294> <f294> 9225 <f295> <f295> 21172 <f296> <f296> 9240 <f297> <f29b> 21173 <f29c> <f29c> 8103 <f29d> <f29d> 21178 <f29e> <f29e> 8700 <f29f> <f2a0> 21179 <f2a1> <f2fe> 7139 <f340> <f340> 8129 <f341> <f341> 9222 <f342> <f344> 21181 <f345> <f345> 8860 <f346> <f347> 21184 <f348> <f348> 8270 <f349> <f349> 21186 <f34a> <f34a> 9242 <f34b> <f34b> 9241 <f34c> <f34f> 21187 endcidrange 100 begincidrange <f350> <f350> 9228 <f351> <f360> 21191 <f361> <f361> 7721 <f362> <f373> 21207 <f374> <f374> 9825 <f375> <f375> 21225 <f376> <f376> 9892 <f377> <f377> 8564 <f378> <f378> 9827 <f379> <f379> 9826 <f37a> <f37e> 21226 <f380> <f38b> 21231 <f38c> <f38c> 9845 <f38d> <f39f> 21243 <f3a0> <f3a0> 8524 <f3a1> <f3fe> 7233 <f440> <f444> 21262 <f445> <f445> 9850 <f446> <f44f> 21267 <f450> <f450> 9888 <f451> <f456> 21277 <f457> <f457> 9832 <f458> <f458> 21283 <f459> <f459> 7888 <f45a> <f45a> 21284 <f45b> <f45b> 8342 <f45c> <f45c> 21285 <f45d> <f45d> 9164 <f45e> <f461> 21286 <f462> <f462> 9160 <f463> <f463> 21290 <f464> <f464> 8766 <f465> <f474> 21291 <f475> <f475> 9829 <f476> <f47b> 21307 <f47c> <f47c> 9828 <f47d> <f47d> 21313 <f47e> <f47e> 8761 <f480> <f493> 21314 <f494> <f494> 8266 <f495> <f498> 21334 <f499> <f499> 9759 <f49a> <f49b> 21338 <f49c> <f49c> 9758 <f49d> <f4a0> 21340 <f4a1> <f4fe> 7327 <f540> <f544> 21344 <f545> <f545> 9760 <f546> <f546> 21349 <f547> <f547> 9761 <f548> <f551> 21350 <f552> <f552> 9762 <f553> <f553> 21360 <f554> <f554> 9767 <f555> <f555> 7737 <f556> <f556> 9765 <f557> <f55d> 21361 <f55e> <f55e> 9769 <f55f> <f560> 21368 <f561> <f561> 9774 <f562> <f562> 9771 <f563> <f56d> 21370 <f56e> <f56e> 9770 <f56f> <f56f> 9773 <f570> <f570> 21381 <f571> <f571> 9768 <f572> <f572> 8633 <f573> <f57e> 21382 <f580> <f584> 21394 <f585> <f585> 9782 <f586> <f586> 9776 <f587> <f58b> 21399 <f58c> <f58c> 9784 <f58d> <f58d> 21404 <f58e> <f58e> 8205 <f58f> <f58f> 9783 <f590> <f598> 21405 <f599> <f599> 9797 <f59a> <f59a> 21414 <f59b> <f59b> 9786 <f59c> <f59f> 21415 <f5a0> <f5a0> 9795 <f5a1> <f5fe> 7421 <f640> <f640> 21419 <f641> <f641> 9792 <f642> <f644> 21420 <f645> <f645> 9789 <f646> <f646> 9793 <f647> <f647> 21423 <f648> <f648> 9790 <f649> <f64a> 21424 <f64b> <f64b> 9791 <f64c> <f64c> 8128 <f64d> <f64d> 21426 <f64e> <f64f> 9787 <f650> <f653> 21427 <f654> <f654> 9794 <f655> <f657> 21431 <f658> <f658> 9796 <f659> <f660> 21434 endcidrange 100 begincidrange <f661> <f661> 9785 <f662> <f662> 21442 <f663> <f663> 9804 <f664> <f66b> 21443 <f66c> <f66c> 9799 <f66d> <f66d> 9803 <f66e> <f670> 21451 <f671> <f671> 9801 <f672> <f673> 21454 <f674> <f674> 9800 <f675> <f675> 21456 <f676> <f676> 9802 <f677> <f677> 8456 <f678> <f67e> 21457 <f680> <f684> 21464 <f685> <f685> 9805 <f686> <f687> 21469 <f688> <f688> 9780 <f689> <f689> 21471 <f68a> <f68a> 9809 <f68b> <f68c> 21472 <f68d> <f68d> 9808 <f68e> <f68e> 9810 <f68f> <f691> 21474 <f692> <f692> 9807 <f693> <f695> 21477 <f696> <f696> 9778 <f697> <f697> 9806 <f698> <f698> 9811 <f699> <f699> 21480 <f69a> <f69a> 9815 <f69b> <f69b> 21481 <f69c> <f69c> 9781 <f69d> <f69d> 21482 <f69e> <f69e> 9779 <f69f> <f69f> 21483 <f6a0> <f6a0> 9814 <f6a1> <f6fe> 7515 <f740> <f741> 21484 <f742> <f742> 9812 <f743> <f748> 21486 <f749> <f749> 9816 <f74a> <f74b> 21492 <f74c> <f74c> 9813 <f74d> <f74d> 7757 <f74e> <f755> 21494 <f756> <f756> 9819 <f757> <f757> 21502 <f758> <f758> 9818 <f759> <f759> 21503 <f75a> <f75a> 9817 <f75b> <f75b> 8238 <f75c> <f75c> 9775 <f75d> <f760> 21504 <f761> <f761> 9798 <f762> <f762> 21508 <f763> <f763> 9766 <f764> <f76a> 21509 <f76b> <f76b> 9820 <f76c> <f770> 21516 <f771> <f771> 9772 <f772> <f77b> 21521 <f77c> <f77c> 9763 <f77d> <f77d> 21531 <f77e> <f77e> 9777 <f780> <f7a0> 21532 <f7a1> <f7fe> 7609 <f840> <f841> 21565 <f842> <f842> 8348 <f843> <f845> 21567 <f846> <f846> 9600 <f847> <f848> 21570 <f849> <f849> 8924 <f84a> <f84f> 21572 <f850> <f850> 7941 <f851> <f851> 8331 <f852> <f852> 21578 <f853> <f853> 9601 <f854> <f862> 21579 <f863> <f863> 9603 <f864> <f864> 9602 <f865> <f865> 21594 <f866> <f866> 8686 <f867> <f871> 21595 <f872> <f872> 8578 <f873> <f877> 21606 <f878> <f878> 8771 <f879> <f879> 21611 <f87a> <f87a> 9607 <f87b> <f87b> 21612 <f87c> <f87c> 9608 <f87d> <f87e> 21613 <f880> <f880> 21615 <f881> <f881> 9604 <f882> <f883> 21616 <f884> <f884> 8701 <f885> <f885> 21618 <f886> <f886> 8687 <f887> <f88c> 21619 <f88d> <f88d> 9610 endcidrange 100 begincidrange <f88e> <f88e> 9612 <f88f> <f898> 21625 <f899> <f899> 8007 <f89a> <f89c> 21635 <f89d> <f89d> 7965 <f89e> <f89f> 21638 <f8a0> <f8a0> 9613 <f940> <f94d> 21640 <f94e> <f94e> 8144 <f94f> <f94f> 9618 <f950> <f950> 9615 <f951> <f958> 21654 <f959> <f959> 9620 <f95a> <f95a> 7904 <f95b> <f95c> 21662 <f95d> <f95d> 9617 <f95e> <f95e> 9621 <f95f> <f966> 21664 <f967> <f967> 9623 <f968> <f968> 21672 <f969> <f969> 8374 <f96a> <f96b> 21673 <f96c> <f96c> 9624 <f96d> <f96e> 21675 <f96f> <f96f> 8438 <f970> <f97e> 21677 <f980> <f984> 21692 <f985> <f985> 9605 <f986> <f986> 21697 <f987> <f987> 9625 <f988> <f990> 21698 <f991> <f991> 9622 <f992> <f995> 21707 <f996> <f996> 9626 <f997> <f997> 21711 <f998> <f998> 9627 <f999> <f9a0> 21712 <fa40> <fa41> 21720 <fa42> <fa42> 9629 <fa43> <fa45> 21722 <fa46> <fa46> 9630 <fa47> <fa4b> 21725 <fa4c> <fa4c> 9036 <fa4d> <fa50> 21730 <fa51> <fa51> 8004 <fa52> <fa57> 21734 <fa58> <fa58> 9824 <fa59> <fa59> 9632 <fa5a> <fa5c> 21740 <fa5d> <fa5d> 9628 <fa5e> <fa5e> 21743 <fa5f> <fa5f> 9631 <fa60> <fa60> 21744 <fa61> <fa61> 8044 <fa62> <fa6f> 21745 <fa70> <fa70> 9634 <fa71> <fa73> 21759 <fa74> <fa74> 8366 <fa75> <fa75> 21762 <fa76> <fa76> 9611 <fa77> <fa77> 9635 <fa78> <fa7e> 21763 <fa80> <fa82> 21770 <fa83> <fa83> 9609 <fa84> <fa84> 9637 <fa85> <fa8c> 21773 <fa8d> <fa8d> 9636 <fa8e> <fa8f> 21781 <fa90> <fa90> 9638 <fa91> <fa91> 9619 <fa92> <fa95> 21783 <fa96> <fa96> 9639 <fa97> <fa97> 8738 <fa98> <fa98> 9641 <fa99> <faa0> 21787 <fb40> <fb48> 21795 <fb49> <fb49> 9640 <fb4a> <fb51> 21804 <fb52> <fb52> 9606 <fb53> <fb56> 21812 <fb57> <fb57> 9633 <fb58> <fb58> 9642 <fb59> <fb59> 21816 <fb5a> <fb5a> 9616 <fb5b> <fb5b> 9614 <fb5c> <fb74> 21817 <fb75> <fb75> 9864 <fb76> <fb78> 21842 <fb79> <fb79> 9886 <fb7a> <fb7a> 9723 <fb7b> <fb7b> 21845 <fb7c> <fb7c> 8076 <fb7d> <fb7d> 8692 <fb7e> <fb7e> 21846 <fb80> <fb8f> 21847 <fb90> <fb90> 8207 <fb91> <fb9b> 21863 <fb9c> <fb9c> 8305 <fb9d> <fb9e> 21874 <fb9f> <fb9f> 9719 endcidrange 71 begincidrange <fba0> <fba0> 21876 <fc40> <fc43> 21877 <fc44> <fc44> 9878 <fc45> <fc48> 21881 <fc49> <fc49> 9871 <fc4a> <fc59> 21885 <fc5a> <fc5a> 8922 <fc5b> <fc62> 21901 <fc63> <fc63> 7873 <fc64> <fc67> 21909 <fc68> <fc68> 7859 <fc69> <fc6e> 21913 <fc6f> <fc6f> 9834 <fc70> <fc70> 21919 <fc71> <fc71> 9866 <fc72> <fc73> 21920 <fc74> <fc74> 9833 <fc75> <fc76> 21922 <fc77> <fc78> 9752 <fc79> <fc7e> 21924 <fc80> <fc82> 21930 <fc83> <fc83> 9754 <fc84> <fc89> 21933 <fc8a> <fc8a> 9843 <fc8b> <fca0> 21939 <fd40> <fd51> 21961 <fd52> <fd52> 8390 <fd53> <fd53> 8811 <fd54> <fd56> 21979 <fd57> <fd57> 9427 <fd58> <fd58> 7814 <fd59> <fd59> 21982 <fd5a> <fd5a> 9743 <fd5b> <fd5e> 21983 <fd5f> <fd5f> 9745 <fd60> <fd61> 21987 <fd62> <fd62> 9747 <fd63> <fd64> 21989 <fd65> <fd65> 9744 <fd66> <fd66> 9746 <fd67> <fd67> 8240 <fd68> <fd68> 21991 <fd69> <fd69> 9841 <fd6a> <fd6b> 21992 <fd6c> <fd6c> 9748 <fd6d> <fd6f> 21994 <fd70> <fd70> 9750 <fd71> <fd71> 21997 <fd72> <fd72> 9749 <fd73> <fd77> 21998 <fd78> <fd78> 8434 <fd79> <fd7c> 22003 <fd7d> <fd7d> 9751 <fd7e> <fd7e> 22007 <fd80> <fd87> 22008 <fd88> <fd88> 8247 <fd89> <fd8a> 22016 <fd8b> <fd8b> 8371 <fd8c> <fd8e> 22018 <fd8f> <fd8f> 7970 <fd90> <fd90> 9453 <fd91> <fd93> 22021 <fd94> <fd94> 7988 <fd95> <fd9c> 22024 <fd9d> <fd9d> 2562 <fd9e> <fd9e> 16595 <fd9f> <fd9f> 8204 <fda0> <fda0> 20611 <fe40> <fe40> 4697 <fe41> <fe7e> 22032 <fe80> <fea0> 22094 endcidrange endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF \ No newline at end of file
diff --git a/src/main/resources/Resources/cmap/GBK-EUC-UCS2 b/src/main/resources/Resources/cmap/GBK-EUC-UCS2
new file mode 100644
index 0000000..ea633f2
--- /dev/null
+++ b/src/main/resources/Resources/cmap/GBK-EUC-UCS2
@@ -0,0 +1 @@
+%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%IncludeResource: ProcSet (CIDInit) %%BeginResource: CMap (GBK-EUC-UCS2) %%Title: (GBK-EUC-UCS2) %%Version: 4.002 %%Copyright: ----------------------------------------------------------- %%Copyright: Copyright 1990-1999 Adobe Systems Incorporated. %%Copyright: All Rights Reserved. %%Copyright: %%Copyright: Patents Pending %%Copyright: %%Copyright: NOTICE: All information contained herein is the property %%Copyright: of Adobe Systems Incorporated. %%Copyright: %%Copyright: Permission is granted for redistribution of this file %%Copyright: provided this copyright notice is maintained intact and %%Copyright: that the contents of this file are not altered in any %%Copyright: way from its original form. %%Copyright: %%Copyright: PostScript and Display PostScript are trademarks of %%Copyright: Adobe Systems Incorporated which may be registered in %%Copyright: certain jurisdictions. %%Copyright: ----------------------------------------------------------- %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo 3 dict dup begin /Registry (Adobe) def /Ordering (GBK_EUC_UCS2) def /Supplement 2 def end def /CMapName /GBK-EUC-UCS2 def /CMapVersion 4.002 def /CMapType 1 def /WMode 0 def 3 begincodespacerange <00> <80> <8140> <FEFE> <FF> <FF> endcodespacerange 100 beginbfrange <00> <80> <0000> <FF> <FF> <F8F5> <8140> <8140> <4E02> <8141> <8143> <4E04> <8144> <8144> <4E0F> <8145> <8145> <4E12> <8146> <8146> <4E17> <8147> <8149> <4E1F> <814A> <814A> <4E23> <814B> <814B> <4E26> <814C> <814C> <4E29> <814D> <814E> <4E2E> <814F> <814F> <4E31> <8150> <8150> <4E33> <8151> <8151> <4E35> <8152> <8152> <4E37> <8153> <8153> <4E3C> <8154> <8156> <4E40> <8157> <8157> <4E44> <8158> <8158> <4E46> <8159> <8159> <4E4A> <815A> <815A> <4E51> <815B> <815B> <4E55> <815C> <815C> <4E57> <815D> <815E> <4E5A> <815F> <8162> <4E62> <8163> <8164> <4E67> <8165> <816A> <4E6A> <816B> <816B> <4E72> <816C> <8175> <4E74> <8176> <817C> <4E7F> <817D> <817D> <4E87> <817E> <817E> <4E8A> <8180> <8180> <4E90> <8181> <8182> <4E96> <8183> <8183> <4E99> <8184> <8186> <4E9C> <8187> <8187> <4EA3> <8188> <8188> <4EAA> <8189> <818B> <4EAF> <818C> <818C> <4EB4> <818D> <8190> <4EB6> <8191> <8193> <4EBC> <8194> <8194> <4EC8> <8195> <8195> <4ECC> <8196> <8197> <4ECF> <8198> <8198> <4ED2> <8199> <819B> <4EDA> <819C> <819C> <4EE0> <819D> <819D> <4EE2> <819E> <819F> <4EE6> <81A0> <81A0> <4EE9> <81A1> <81A3> <4EED> <81A4> <81A4> <4EF1> <81A5> <81A5> <4EF4> <81A6> <81A8> <4EF8> <81A9> <81A9> <4EFC> <81AA> <81AA> <4EFE> <81AB> <81AB> <4F00> <81AC> <81B2> <4F02> <81B3> <81B4> <4F0B> <81B5> <81B9> <4F12> <81BA> <81BB> <4F1C> <81BC> <81BC> <4F21> <81BD> <81BD> <4F23> <81BE> <81BF> <4F28> <81C0> <81C2> <4F2C> <81C3> <81C3> <4F31> <81C4> <81C4> <4F33> <81C5> <81C5> <4F35> <81C6> <81C6> <4F37> <81C7> <81C7> <4F39> <81C8> <81C8> <4F3B> <81C9> <81CD> <4F3E> <81CE> <81CF> <4F44> <81D0> <81D5> <4F47> <81D6> <81D6> <4F52> <81D7> <81D7> <4F54> <81D8> <81D8> <4F56> <81D9> <81DA> <4F61> <81DB> <81DB> <4F66> <81DC> <81DC> <4F68> <81DD> <81DE> <4F6A> <81DF> <81E0> <4F6D> <81E1> <81E2> <4F71> <81E3> <81E3> <4F75> <81E4> <81E7> <4F77> <81E8> <81E8> <4F7D> <81E9> <81EB> <4F80> <81EC> <81EE> <4F85> <81EF> <81EF> <4F8A> <81F0> <81F0> <4F8C> <81F1> <81F1> <4F8E> <81F2> <81F2> <4F90> <81F3> <81F4> <4F92> <81F5> <81F6> <4F95> <81F7> <81F9> <4F98> <81FA> <81FA> <4F9C> <81FB> <81FC> <4F9E> <81FD> <81FE> <4FA1> endbfrange 100 beginbfrange <8240> <8240> <4FA4> <8241> <8241> <4FAB> <8242> <8242> <4FAD> <8243> <8247> <4FB0> <8248> <8250> <4FB6> <8251> <8253> <4FC0> <8254> <8257> <4FC6> <8258> <825A> <4FCB> <825B> <825F> <4FD2> <8260> <8260> <4FD9> <8261> <8261> <4FDB> <8262> <8262> <4FE0> <8263> <8263> <4FE2> <8264> <8265> <4FE4> <8266> <8266> <4FE7> <8267> <8268> <4FEB> <8269> <8269> <4FF0> <826A> <826A> <4FF2> <826B> <826E> <4FF4> <826F> <826F> <4FF9> <8270> <8272> <4FFB> <8273> <827E> <4FFF> <8280> <8280> <500B> <8281> <8281> <500E> <8282> <8283> <5010> <8284> <8284> <5013> <8285> <8287> <5015> <8288> <8288> <501B> <8289> <828A> <501D> <828B> <828B> <5020> <828C> <828E> <5022> <828F> <828F> <5027> <8290> <8290> <502B> <8291> <829B> <502F> <829C> <829C> <503B> <829D> <829D> <503D> <829E> <82A1> <503F> <82A2> <82A4> <5044> <82A5> <82A7> <5049> <82A8> <82A8> <504D> <82A9> <82AD> <5050> <82AE> <82B1> <5056> <82B2> <82B2> <505B> <82B3> <82BA> <505D> <82BB> <82C0> <5066> <82C1> <82C9> <506D> <82CA> <82CC> <5078> <82CD> <82CE> <507C> <82CF> <82D2> <5081> <82D3> <82D4> <5086> <82D5> <82D8> <5089> <82D9> <82ED> <508E> <82EE> <82EE> <50A4> <82EF> <82EF> <50A6> <82F0> <82F1> <50AA> <82F2> <82F6> <50AD> <82F7> <82FD> <50B3> <82FE> <82FE> <50BC> <8340> <8351> <50BD> <8352> <8357> <50D0> <8358> <835A> <50D7> <835B> <8365> <50DB> <8366> <8369> <50E8> <836A> <836D> <50EF> <836E> <836E> <50F4> <836F> <8373> <50F6> <8374> <837D> <50FC> <837E> <837E> <5108> <8380> <8381> <5109> <8382> <8387> <510C> <8388> <8395> <5113> <8396> <83B2> <5122> <83B3> <83B3> <5142> <83B4> <83B4> <5147> <83B5> <83B5> <514A> <83B6> <83B6> <514C> <83B7> <83B9> <514E> <83BA> <83BB> <5152> <83BC> <83BE> <5157> <83BF> <83BF> <515B> <83C0> <83C4> <515D> <83C5> <83C6> <5163> <83C7> <83C8> <5166> <83C9> <83CA> <5169> <83CB> <83CB> <516F> <83CC> <83CC> <5172> <83CD> <83CD> <517A> <83CE> <83CF> <517E> <83D0> <83D1> <5183> <83D2> <83D3> <5186> <83D4> <83D5> <518A> <83D6> <83D9> <518E> <83DA> <83DB> <5193> <83DC> <83DC> <5198> <83DD> <83DD> <519A> <83DE> <83E0> <519D> <83E1> <83E1> <51A1> <83E2> <83E2> <51A3> <83E3> <83E7> <51A6> <83E8> <83E9> <51AD> endbfrange 100 beginbfrange <83EA> <83EA> <51B4> <83EB> <83ED> <51B8> <83EE> <83EF> <51BE> <83F0> <83F2> <51C1> <83F3> <83F3> <51C5> <83F4> <83F4> <51C8> <83F5> <83F5> <51CA> <83F6> <83F7> <51CD> <83F8> <83F8> <51D0> <83F9> <83FE> <51D2> <8440> <8442> <51D8> <8443> <8443> <51DC> <8444> <8445> <51DE> <8446> <8447> <51E2> <8448> <844D> <51E5> <844E> <844E> <51EC> <844F> <844F> <51EE> <8450> <8451> <51F1> <8452> <8452> <51F4> <8453> <8453> <51F7> <8454> <8454> <51FE> <8455> <8456> <5204> <8457> <8457> <5209> <8458> <8459> <520B> <845A> <845B> <520F> <845C> <845E> <5213> <845F> <845F> <521C> <8460> <8461> <521E> <8462> <8464> <5221> <8465> <8467> <5225> <8468> <8468> <522A> <8469> <8469> <522C> <846A> <846A> <522F> <846B> <846C> <5231> <846D> <846E> <5234> <846F> <846F> <523C> <8470> <8470> <523E> <8471> <8476> <5244> <8477> <8477> <524B> <8478> <8479> <524E> <847A> <847B> <5252> <847C> <847C> <5255> <847D> <847E> <5257> <8480> <8482> <5259> <8483> <8483> <525D> <8484> <8485> <525F> <8486> <8488> <5262> <8489> <8489> <5266> <848A> <848A> <5268> <848B> <848E> <526B> <848F> <8490> <5270> <8491> <849A> <5273> <849B> <849B> <527E> <849C> <849C> <5280> <849D> <84A1> <5283> <84A2> <84A8> <5289> <84A9> <84AA> <5291> <84AB> <84B1> <5294> <84B2> <84B2> <529C> <84B3> <84B6> <52A4> <84B7> <84B9> <52AE> <84BA> <84C3> <52B4> <84C4> <84C6> <52C0> <84C7> <84C9> <52C4> <84CA> <84CA> <52C8> <84CB> <84CB> <52CA> <84CC> <84CF> <52CC> <84D0> <84D0> <52D1> <84D1> <84D3> <52D3> <84D4> <84D4> <52D7> <84D5> <84DA> <52D9> <84DB> <84DE> <52E0> <84DF> <84E9> <52E5> <84EA> <84F1> <52F1> <84F2> <84F4> <52FB> <84F5> <84F8> <5301> <84F9> <84F9> <5307> <84FA> <84FD> <5309> <84FE> <84FE> <530E> <8540> <8543> <5311> <8544> <8544> <5318> <8545> <8546> <531B> <8547> <8548> <531E> <8549> <8549> <5322> <854A> <854B> <5324> <854C> <854E> <5327> <854F> <8551> <532B> <8552> <855B> <532F> <855C> <855D> <533C> <855E> <855E> <5340> <855F> <855F> <5342> <8560> <8560> <5344> <8561> <8561> <5346> <8562> <8564> <534B> <8565> <8565> <5350> <8566> <8566> <5354> <8567> <8568> <5358> <8569> <8569> <535B> <856A> <856A> <535D> <856B> <856B> <5365> endbfrange 100 beginbfrange <856C> <856C> <5368> <856D> <856D> <536A> <856E> <856F> <536C> <8570> <8570> <5372> <8571> <8571> <5376> <8572> <8572> <5379> <8573> <8576> <537B> <8577> <8578> <5380> <8579> <8579> <5383> <857A> <857B> <5387> <857C> <857C> <538A> <857D> <857E> <538E> <8580> <8584> <5390> <8585> <8586> <5396> <8587> <8587> <5399> <8588> <8589> <539B> <858A> <858A> <539E> <858B> <858C> <53A0> <858D> <858D> <53A4> <858E> <858E> <53A7> <858F> <8592> <53AA> <8593> <8599> <53AF> <859A> <859D> <53B7> <859E> <85A0> <53BC> <85A1> <85A1> <53C0> <85A2> <85A6> <53C3> <85A7> <85A9> <53CE> <85AA> <85AB> <53D2> <85AC> <85AC> <53D5> <85AD> <85AD> <53DA> <85AE> <85B0> <53DC> <85B1> <85B2> <53E1> <85B3> <85B3> <53E7> <85B4> <85B4> <53F4> <85B5> <85B5> <53FA> <85B6> <85B8> <53FE> <85B9> <85B9> <5402> <85BA> <85BA> <5405> <85BB> <85BB> <5407> <85BC> <85BC> <540B> <85BD> <85BD> <5414> <85BE> <85C0> <5418> <85C1> <85C1> <541C> <85C2> <85C2> <5422> <85C3> <85C4> <5424> <85C5> <85C5> <542A> <85C6> <85C6> <5430> <85C7> <85C7> <5433> <85C8> <85C9> <5436> <85CA> <85CA> <543A> <85CB> <85CB> <543D> <85CC> <85CC> <543F> <85CD> <85CE> <5441> <85CF> <85D0> <5444> <85D1> <85D1> <5447> <85D2> <85D2> <5449> <85D3> <85D6> <544C> <85D7> <85D7> <5451> <85D8> <85D8> <545A> <85D9> <85DD> <545D> <85DE> <85DE> <5463> <85DF> <85DF> <5465> <85E0> <85E0> <5467> <85E1> <85E8> <5469> <85E9> <85E9> <5474> <85EA> <85EB> <5479> <85EC> <85ED> <547E> <85EE> <85EE> <5481> <85EF> <85EF> <5483> <85F0> <85F0> <5485> <85F1> <85F4> <5487> <85F5> <85F5> <548D> <85F6> <85F6> <5491> <85F7> <85F7> <5493> <85F8> <85F9> <5497> <85FA> <85FA> <549C> <85FB> <85FE> <549E> <8640> <8640> <54A2> <8641> <8641> <54A5> <8642> <8642> <54AE> <8643> <8643> <54B0> <8644> <8644> <54B2> <8645> <8647> <54B5> <8648> <8649> <54B9> <864A> <864A> <54BC> <864B> <864B> <54BE> <864C> <864C> <54C3> <864D> <864D> <54C5> <864E> <864F> <54CA> <8650> <8650> <54D6> <8651> <8651> <54D8> <8652> <8652> <54DB> <8653> <8657> <54E0> <8658> <8659> <54EB> <865A> <865C> <54EF> <865D> <8662> <54F4> <8663> <8663> <54FB> <8664> <8664> <54FE> <8665> <8665> <5500> <8666> <8669> <5502> endbfrange 100 beginbfrange <866A> <866A> <5508> <866B> <866F> <550A> <8670> <8671> <5512> <8672> <8677> <5515> <8678> <867B> <551C> <867C> <867C> <5521> <867D> <867E> <5525> <8680> <8681> <5528> <8682> <8682> <552B> <8683> <8683> <552D> <8684> <8684> <5532> <8685> <8687> <5534> <8688> <868B> <5538> <868C> <868C> <553D> <868D> <868D> <5540> <868E> <868E> <5542> <868F> <868F> <5545> <8690> <8691> <5547> <8692> <8696> <554B> <8697> <869A> <5551> <869B> <869F> <5557> <86A0> <86A3> <555D> <86A4> <86A5> <5562> <86A6> <86A7> <5568> <86A8> <86A8> <556B> <86A9> <86AE> <556F> <86AF> <86B0> <5579> <86B1> <86B1> <557D> <86B2> <86B2> <557F> <86B3> <86B4> <5585> <86B5> <86B7> <558C> <86B8> <86B8> <5590> <86B9> <86BA> <5592> <86BB> <86BD> <5595> <86BE> <86BF> <559A> <86C0> <86C0> <559E> <86C1> <86C7> <55A0> <86C8> <86D0> <55A8> <86D1> <86D1> <55B2> <86D2> <86D2> <55B4> <86D3> <86D3> <55B6> <86D4> <86D4> <55B8> <86D5> <86D5> <55BA> <86D6> <86D6> <55BC> <86D7> <86DB> <55BF> <86DC> <86DE> <55C6> <86DF> <86E0> <55CA> <86E1> <86E3> <55CE> <86E4> <86E4> <55D5> <86E5> <86E9> <55D7> <86EA> <86EA> <55DE> <86EB> <86EB> <55E0> <86EC> <86EC> <55E2> <86ED> <86ED> <55E7> <86EE> <86EE> <55E9> <86EF> <86F0> <55ED> <86F1> <86F2> <55F0> <86F3> <86F3> <55F4> <86F4> <86F4> <55F6> <86F5> <86F9> <55F8> <86FA> <86FA> <55FF> <86FB> <86FE> <5602> <8740> <8741> <5606> <8742> <8743> <560A> <8744> <8744> <560D> <8745> <874C> <5610> <874D> <874E> <5619> <874F> <8750> <561C> <8751> <8753> <5620> <8754> <8755> <5625> <8756> <8759> <5628> <875A> <875C> <562E> <875D> <875D> <5633> <875E> <875E> <5635> <875F> <8760> <5637> <8761> <8761> <563A> <8762> <8764> <563C> <8765> <8770> <5640> <8771> <8775> <564F> <8776> <8777> <5655> <8778> <8779> <565A> <877A> <877E> <565D> <8780> <8780> <5663> <8781> <8783> <5665> <8784> <8787> <566D> <8788> <878B> <5672> <878C> <878F> <5677> <8790> <8797> <567D> <8798> <879E> <5687> <879F> <87A1> <5690> <87A2> <87B0> <5694> <87B1> <87BB> <56A4> <87BC> <87C2> <56B0> <87C3> <87C6> <56B8> <87C7> <87D3> <56BD> <87D4> <87DC> <56CB> <87DD> <87DE> <56D5> <87DF> <87E0> <56D8> <87E1> <87E1> <56DC> <87E2> <87E2> <56E3> endbfrange 100 beginbfrange <87E3> <87E8> <56E5> <87E9> <87E9> <56EC> <87EA> <87EB> <56EE> <87EC> <87ED> <56F2> <87EE> <87F0> <56F6> <87F1> <87F2> <56FB> <87F3> <87F5> <5700> <87F6> <87F6> <5705> <87F7> <87F7> <5707> <87F8> <87FE> <570B> <8840> <8849> <5712> <884A> <884B> <571D> <884C> <884E> <5720> <884F> <8852> <5724> <8853> <8853> <572B> <8854> <8855> <5731> <8856> <885A> <5734> <885B> <885C> <573C> <885D> <885D> <573F> <885E> <885E> <5741> <885F> <8862> <5743> <8863> <8864> <5748> <8865> <8865> <574B> <8866> <886A> <5752> <886B> <886C> <5758> <886D> <886E> <5762> <886F> <886F> <5765> <8870> <8870> <5767> <8871> <8871> <576C> <8872> <8872> <576E> <8873> <8875> <5770> <8876> <8877> <5774> <8878> <887A> <5778> <887B> <887E> <577D> <8880> <8880> <5781> <8881> <8884> <5787> <8885> <8889> <578D> <888A> <8890> <5794> <8891> <8894> <579C> <8895> <8895> <57A5> <8896> <8896> <57A8> <8897> <8897> <57AA> <8898> <8898> <57AC> <8899> <889B> <57AF> <889C> <889C> <57B3> <889D> <889F> <57B5> <88A0> <88A8> <57B9> <88A9> <88AF> <57C4> <88B0> <88B1> <57CC> <88B2> <88B3> <57D0> <88B4> <88B4> <57D3> <88B5> <88B6> <57D6> <88B7> <88B8> <57DB> <88B9> <88B9> <57DE> <88BA> <88BC> <57E1> <88BD> <88C4> <57E5> <88C5> <88C5> <57EE> <88C6> <88C9> <57F0> <88CA> <88CC> <57F5> <88CD> <88CE> <57FB> <88CF> <88D0> <57FE> <88D1> <88D1> <5801> <88D2> <88D4> <5803> <88D5> <88D7> <5808> <88D8> <88D8> <580C> <88D9> <88DB> <580E> <88DC> <88DE> <5812> <88DF> <88E1> <5816> <88E2> <88E5> <581A> <88E6> <88E6> <581F> <88E7> <88E8> <5822> <88E9> <88ED> <5825> <88EE> <88F2> <582B> <88F3> <88F6> <5831> <88F7> <88FE> <5836> <8940> <8945> <583E> <8946> <894C> <5845> <894D> <894F> <584E> <8950> <8951> <5852> <8952> <8954> <5855> <8955> <8959> <5859> <895A> <895F> <585F> <8960> <8964> <5866> <8965> <8975> <586D> <8976> <8976> <587F> <8977> <8977> <5882> <8978> <8978> <5884> <8979> <897B> <5886> <897C> <897E> <588A> <8980> <8984> <588D> <8985> <8989> <5894> <898A> <898C> <589B> <898D> <8994> <58A0> <8995> <89A6> <58AA> <89A7> <89AA> <58BD> <89AB> <89AD> <58C2> <89AE> <89B8> <58C6> <89B9> <89BB> <58D2> <89BC> <89C9> <58D6> <89CA> <89CF> <58E5> endbfrange 100 beginbfrange <89D0> <89D0> <58ED> <89D1> <89D1> <58EF> <89D2> <89D3> <58F1> <89D4> <89D5> <58F4> <89D6> <89D7> <58F7> <89D8> <89DF> <58FA> <89E0> <89E0> <5903> <89E1> <89E2> <5905> <89E3> <89E7> <5908> <89E8> <89E8> <590E> <89E9> <89EC> <5910> <89ED> <89EE> <5917> <89EF> <89EF> <591B> <89F0> <89F1> <591D> <89F2> <89F5> <5920> <89F6> <89F6> <5926> <89F7> <89F7> <5928> <89F8> <89F8> <592C> <89F9> <89F9> <5930> <89FA> <89FB> <5932> <89FC> <89FD> <5935> <89FE> <89FE> <593B> <8A40> <8A43> <593D> <8A44> <8A44> <5943> <8A45> <8A46> <5945> <8A47> <8A47> <594A> <8A48> <8A49> <594C> <8A4A> <8A4A> <5950> <8A4B> <8A4C> <5952> <8A4D> <8A4D> <5959> <8A4E> <8A52> <595B> <8A53> <8A53> <5961> <8A54> <8A55> <5963> <8A56> <8A62> <5966> <8A63> <8A63> <5975> <8A64> <8A64> <5977> <8A65> <8A67> <597A> <8A68> <8A6A> <597E> <8A6B> <8A6B> <5985> <8A6C> <8A6C> <5989> <8A6D> <8A6E> <598B> <8A6F> <8A72> <598E> <8A73> <8A74> <5994> <8A75> <8A75> <5998> <8A76> <8A79> <599A> <8A7A> <8A7D> <599F> <8A7E> <8A7E> <59A6> <8A80> <8A80> <59A7> <8A81> <8A82> <59AC> <8A83> <8A84> <59B0> <8A85> <8A8A> <59B3> <8A8B> <8A8B> <59BA> <8A8C> <8A8D> <59BC> <8A8E> <8A94> <59BF> <8A95> <8A97> <59C7> <8A98> <8A9B> <59CC> <8A9C> <8A9D> <59D5> <8A9E> <8A9E> <59D9> <8A9F> <8A9F> <59DB> <8AA0> <8AA4> <59DE> <8AA5> <8AA5> <59E4> <8AA6> <8AA7> <59E6> <8AA8> <8AAA> <59E9> <8AAB> <8AB6> <59ED> <8AB7> <8AB7> <59FA> <8AB8> <8ABA> <59FC> <8ABB> <8ABB> <5A00> <8ABC> <8ABC> <5A02> <8ABD> <8ABE> <5A0A> <8ABF> <8AC2> <5A0D> <8AC3> <8AC3> <5A12> <8AC4> <8AC7> <5A14> <8AC8> <8ACA> <5A19> <8ACB> <8ACC> <5A1D> <8ACD> <8ACE> <5A21> <8ACF> <8ACF> <5A24> <8AD0> <8AD2> <5A26> <8AD3> <8AD9> <5A2A> <8ADA> <8ADA> <5A33> <8ADB> <8ADB> <5A35> <8ADC> <8AE0> <5A37> <8AE1> <8AE3> <5A3D> <8AE4> <8AE8> <5A41> <8AE9> <8AEA> <5A47> <8AEB> <8AF4> <5A4B> <8AF5> <8AF8> <5A56> <8AF9> <8AFE> <5A5B> <8B40> <8B40> <5A61> <8B41> <8B44> <5A63> <8B45> <8B46> <5A68> <8B47> <8B4F> <5A6B> <8B50> <8B51> <5A78> <8B52> <8B55> <5A7B> <8B56> <8B67> <5A80> <8B68> <8B6E> <5A93> <8B6F> <8B7C> <5A9C> <8B7D> <8B7E> <5AAB> <8B80> <8B84> <5AAD> <8B85> <8B85> <5AB4> <8B86> <8B87> <5AB6> endbfrange 100 beginbfrange <8B88> <8B8C> <5AB9> <8B8D> <8B8E> <5ABF> <8B8F> <8B94> <5AC3> <8B95> <8B96> <5ACA> <8B97> <8B9B> <5ACD> <8B9C> <8B9C> <5AD3> <8B9D> <8B9D> <5AD5> <8B9E> <8B9E> <5AD7> <8B9F> <8BA1> <5AD9> <8BA2> <8BA4> <5ADD> <8BA5> <8BA5> <5AE2> <8BA6> <8BA7> <5AE4> <8BA8> <8BA9> <5AE7> <8BAA> <8BAA> <5AEA> <8BAB> <8BAF> <5AEC> <8BB0> <8BC6> <5AF2> <8BC7> <8BD2> <5B0A> <8BD3> <8BEC> <5B18> <8BED> <8BED> <5B33> <8BEE> <8BEF> <5B35> <8BF0> <8BF7> <5B38> <8BF8> <8BFE> <5B41> <8C40> <8C47> <5B48> <8C48> <8C48> <5B52> <8C49> <8C49> <5B56> <8C4A> <8C4A> <5B5E> <8C4B> <8C4C> <5B60> <8C4D> <8C4E> <5B67> <8C4F> <8C4F> <5B6B> <8C50> <8C52> <5B6D> <8C53> <8C53> <5B72> <8C54> <8C54> <5B74> <8C55> <8C58> <5B76> <8C59> <8C5A> <5B7B> <8C5B> <8C5C> <5B7E> <8C5D> <8C5D> <5B82> <8C5E> <8C5E> <5B86> <8C5F> <8C5F> <5B8A> <8C60> <8C61> <5B8D> <8C62> <8C64> <5B90> <8C65> <8C65> <5B94> <8C66> <8C66> <5B96> <8C67> <8C67> <5B9F> <8C68> <8C6A> <5BA7> <8C6B> <8C6E> <5BAC> <8C6F> <8C70> <5BB1> <8C71> <8C71> <5BB7> <8C72> <8C74> <5BBA> <8C75> <8C76> <5BC0> <8C77> <8C77> <5BC3> <8C78> <8C7B> <5BC8> <8C7C> <8C7E> <5BCD> <8C80> <8C80> <5BD1> <8C81> <8C89> <5BD4> <8C8A> <8C8A> <5BE0> <8C8B> <8C8C> <5BE2> <8C8D> <8C8E> <5BE6> <8C8F> <8C93> <5BE9> <8C94> <8C94> <5BEF> <8C95> <8C9B> <5BF1> <8C9C> <8C9D> <5BFD> <8C9E> <8C9E> <5C00> <8C9F> <8CA0> <5C02> <8CA1> <8CA1> <5C05> <8CA2> <8CA3> <5C07> <8CA4> <8CA7> <5C0B> <8CA8> <8CA8> <5C10> <8CA9> <8CAA> <5C12> <8CAB> <8CAB> <5C17> <8CAC> <8CAC> <5C19> <8CAD> <8CAD> <5C1B> <8CAE> <8CB1> <5C1E> <8CB2> <8CB2> <5C23> <8CB3> <8CB3> <5C26> <8CB4> <8CB7> <5C28> <8CB8> <8CBB> <5C2D> <8CBC> <8CBD> <5C32> <8CBE> <8CC0> <5C35> <8CC1> <8CC2> <5C43> <8CC3> <8CC4> <5C46> <8CC5> <8CC6> <5C4C> <8CC7> <8CC9> <5C52> <8CCA> <8CCC> <5C56> <8CCD> <8CD0> <5C5A> <8CD1> <8CD1> <5C5F> <8CD2> <8CD2> <5C62> <8CD3> <8CD3> <5C64> <8CD4> <8CDA> <5C67> <8CDB> <8CDB> <5C70> <8CDC> <8CE2> <5C72> <8CE3> <8CE6> <5C7B> <8CE7> <8CE7> <5C80> <8CE8> <8CEC> <5C83> <8CED> <8CEF> <5C89> <8CF0> <8CF1> <5C8E> <8CF2> <8CF3> <5C92> <8CF4> <8CF4> <5C95> <8CF5> <8CF9> <5C9D> <8CFA> <8CFE> <5CA4> <8D40> <8D40> <5CAA> endbfrange 100 beginbfrange <8D41> <8D43> <5CAE> <8D44> <8D44> <5CB2> <8D45> <8D45> <5CB4> <8D46> <8D46> <5CB6> <8D47> <8D4A> <5CB9> <8D4B> <8D4B> <5CBE> <8D4C> <8D4C> <5CC0> <8D4D> <8D4E> <5CC2> <8D4F> <8D54> <5CC5> <8D55> <8D5A> <5CCC> <8D5B> <8D60> <5CD3> <8D61> <8D67> <5CDA> <8D68> <8D69> <5CE2> <8D6A> <8D6A> <5CE7> <8D6B> <8D6B> <5CE9> <8D6C> <8D6D> <5CEB> <8D6E> <8D6F> <5CEE> <8D70> <8D79> <5CF1> <8D7A> <8D7E> <5CFC> <8D80> <8D80> <5D01> <8D81> <8D82> <5D04> <8D83> <8D88> <5D08> <8D89> <8D8D> <5D0F> <8D8E> <8D8E> <5D15> <8D8F> <8D92> <5D17> <8D93> <8D94> <5D1C> <8D95> <8D99> <5D1F> <8D9A> <8D9A> <5D25> <8D9B> <8D9B> <5D28> <8D9C> <8D9E> <5D2A> <8D9F> <8DA3> <5D2F> <8DA4> <8DAB> <5D35> <8DAC> <8DB3> <5D3F> <8DB4> <8DB5> <5D48> <8DB6> <8DC0> <5D4D> <8DC1> <8DC2> <5D59> <8DC3> <8DC3> <5D5C> <8DC4> <8DCE> <5D5E> <8DCF> <8DCF> <5D6A> <8DD0> <8DD1> <5D6D> <8DD2> <8DD5> <5D70> <8DD6> <8DE2> <5D75> <8DE3> <8DF8> <5D83> <8DF9> <8DFB> <5D9A> <8DFC> <8DFE> <5D9E> <8E40> <8E55> <5DA1> <8E56> <8E62> <5DB8> <8E63> <8E69> <5DC6> <8E6A> <8E76> <5DCE> <8E77> <8E77> <5DDC> <8E78> <8E79> <5DDF> <8E7A> <8E7B> <5DE3> <8E7C> <8E7C> <5DEA> <8E7D> <8E7E> <5DEC> <8E80> <8E80> <5DF0> <8E81> <8E82> <5DF5> <8E83> <8E87> <5DF8> <8E88> <8E89> <5DFF> <8E8A> <8E8A> <5E04> <8E8B> <8E8B> <5E07> <8E8C> <8E8E> <5E09> <8E8F> <8E90> <5E0D> <8E91> <8E92> <5E12> <8E93> <8E93> <5E17> <8E94> <8E9B> <5E1E> <8E9C> <8EA0> <5E28> <8EA1> <8EA2> <5E2F> <8EA3> <8EA7> <5E32> <8EA8> <8EA9> <5E39> <8EAA> <8EAD> <5E3E> <8EAE> <8EAE> <5E43> <8EAF> <8EB4> <5E46> <8EB5> <8EBB> <5E4D> <8EBC> <8EC0> <5E56> <8EC1> <8EC2> <5E5C> <8EC3> <8EC4> <5E5F> <8EC5> <8ED3> <5E63> <8ED4> <8ED4> <5E75> <8ED5> <8ED5> <5E77> <8ED6> <8ED6> <5E79> <8ED7> <8ED7> <5E7E> <8ED8> <8EDA> <5E81> <8EDB> <8EDB> <5E85> <8EDC> <8EDD> <5E88> <8EDE> <8EE0> <5E8C> <8EE1> <8EE1> <5E92> <8EE2> <8EE2> <5E98> <8EE3> <8EE3> <5E9B> <8EE4> <8EE4> <5E9D> <8EE5> <8EE8> <5EA1> <8EE9> <8EED> <5EA8> <8EEE> <8EF2> <5EAE> <8EF3> <8EF3> <5EB4> <8EF4> <8EF7> <5EBA> <8EF8> <8EFE> <5EBF> <8F40> <8F42> <5EC6> <8F43> <8F48> <5ECB> <8F49> <8F4A> <5ED4> <8F4B> <8F4E> <5ED7> <8F4F> <8F5A> <5EDC> endbfrange 100 beginbfrange <8F5B> <8F5B> <5EE9> <8F5C> <8F64> <5EEB> <8F65> <8F65> <5EF5> <8F66> <8F67> <5EF8> <8F68> <8F6A> <5EFB> <8F6B> <8F6D> <5F05> <8F6E> <8F6E> <5F09> <8F6F> <8F71> <5F0C> <8F72> <8F72> <5F10> <8F73> <8F73> <5F12> <8F74> <8F74> <5F14> <8F75> <8F75> <5F16> <8F76> <8F77> <5F19> <8F78> <8F7A> <5F1C> <8F7B> <8F7E> <5F21> <8F80> <8F80> <5F28> <8F81> <8F82> <5F2B> <8F83> <8F83> <5F2E> <8F84> <8F84> <5F30> <8F85> <8F8B> <5F32> <8F8C> <8F8C> <5F3B> <8F8D> <8F8F> <5F3D> <8F90> <8F9E> <5F41> <8F9F> <8F9F> <5F51> <8FA0> <8FA0> <5F54> <8FA1> <8FA4> <5F59> <8FA5> <8FA7> <5F5E> <8FA8> <8FA8> <5F63> <8FA9> <8FA9> <5F65> <8FAA> <8FAB> <5F67> <8FAC> <8FAC> <5F6B> <8FAD> <8FAE> <5F6E> <8FAF> <8FAF> <5F72> <8FB0> <8FB2> <5F74> <8FB3> <8FB3> <5F78> <8FB4> <8FB4> <5F7A> <8FB5> <8FB7> <5F7D> <8FB8> <8FB8> <5F83> <8FB9> <8FB9> <5F86> <8FBA> <8FBC> <5F8D> <8FBD> <8FBD> <5F91> <8FBE> <8FBF> <5F93> <8FC0> <8FC0> <5F96> <8FC1> <8FC2> <5F9A> <8FC3> <8FC6> <5F9D> <8FC7> <8FCC> <5FA2> <8FCD> <8FCD> <5FA9> <8FCE> <8FCF> <5FAB> <8FD0> <8FD5> <5FAF> <8FD6> <8FD6> <5FB6> <8FD7> <8FDA> <5FB8> <8FDB> <8FDF> <5FBE> <8FE0> <8FE1> <5FC7> <8FE2> <8FE3> <5FCA> <8FE4> <8FE4> <5FCE> <8FE5> <8FE7> <5FD3> <8FE8> <8FEA> <5FDA> <8FEB> <8FEC> <5FDE> <8FED> <8FEE> <5FE2> <8FEF> <8FF0> <5FE5> <8FF1> <8FF2> <5FE8> <8FF3> <8FF3> <5FEC> <8FF4> <8FF5> <5FEF> <8FF6> <8FF8> <5FF2> <8FF9> <8FFA> <5FF6> <8FFB> <8FFC> <5FF9> <8FFD> <8FFD> <5FFC> <8FFE> <8FFE> <6007> <9040> <9041> <6008> <9042> <9043> <600B> <9044> <9045> <6010> <9046> <9046> <6013> <9047> <9048> <6017> <9049> <9049> <601A> <904A> <904B> <601E> <904C> <904E> <6022> <904F> <9051> <602C> <9052> <9056> <6030> <9057> <905B> <6036> <905C> <905D> <603D> <905E> <905E> <6040> <905F> <9065> <6044> <9066> <9066> <604C> <9067> <9068> <604E> <9069> <9069> <6051> <906A> <906B> <6053> <906C> <906E> <6056> <906F> <9070> <605B> <9071> <9074> <605E> <9075> <9076> <6065> <9077> <9077> <606E> <9078> <9079> <6071> <907A> <907B> <6074> <907C> <907C> <6077> <907D> <907D> <607E> <907E> <907E> <6080> <9080> <9081> <6081> <9082> <9085> <6085> <9086> <9087> <608A> <9088> <908B> <608E> endbfrange 100 beginbfrange <908C> <908C> <6093> <908D> <908D> <6095> <908E> <9090> <6097> <9091> <9091> <609C> <9092> <9092> <609E> <9093> <9094> <60A1> <9095> <9096> <60A4> <9097> <9097> <60A7> <9098> <9099> <60A9> <909A> <909A> <60AE> <909B> <909B> <60B0> <909C> <909C> <60B3> <909D> <909F> <60B5> <90A0> <90A1> <60B9> <90A2> <90A9> <60BD> <90AA> <90AC> <60C7> <90AD> <90B1> <60CC> <90B2> <90B4> <60D2> <90B5> <90B6> <60D6> <90B7> <90B7> <60D9> <90B8> <90B8> <60DB> <90B9> <90B9> <60DE> <90BA> <90BE> <60E1> <90BF> <90BF> <60EA> <90C0> <90C1> <60F1> <90C2> <90C2> <60F5> <90C3> <90C4> <60F7> <90C5> <90C9> <60FB> <90CA> <90CD> <6102> <90CE> <90CE> <6107> <90CF> <90D1> <610A> <90D2> <90D6> <6110> <90D7> <90DA> <6116> <90DB> <90DE> <611B> <90DF> <90E0> <6121> <90E1> <90E1> <6125> <90E2> <90E4> <6128> <90E5> <90F7> <612C> <90F8> <90FE> <6140> <9140> <9140> <6147> <9141> <9141> <6149> <9142> <9142> <614B> <9143> <9143> <614D> <9144> <9145> <614F> <9146> <9148> <6152> <9149> <914F> <6156> <9150> <9153> <615E> <9154> <9157> <6163> <9158> <915E> <6169> <915F> <9162> <6171> <9163> <9163> <6176> <9164> <9176> <6178> <9177> <9178> <618C> <9179> <917D> <618F> <917E> <917E> <6195> <9180> <9186> <6196> <9187> <918F> <619E> <9190> <9191> <61AA> <9192> <919B> <61AD> <919C> <91A1> <61B8> <91A2> <91A4> <61BF> <91A5> <91A9> <61C3> <91AA> <91AA> <61C9> <91AB> <91AF> <61CC> <91B0> <91B0> <61D3> <91B1> <91C1> <61D5> <91C2> <91CF> <61E7> <91D0> <91D8> <61F6> <91D9> <91DE> <6200> <91DF> <91DF> <6207> <91E0> <91E0> <6209> <91E1> <91E2> <6213> <91E3> <91E3> <6219> <91E4> <91E6> <621C> <91E7> <91E7> <6220> <91E8> <91E8> <6223> <91E9> <91EC> <6226> <91ED> <91ED> <622B> <91EE> <91EE> <622D> <91EF> <91F2> <622F> <91F3> <91F4> <6235> <91F5> <91F9> <6238> <91FA> <91FA> <6242> <91FB> <91FD> <6244> <91FE> <91FE> <624A> <9240> <9241> <624F> <9242> <9244> <6255> <9245> <9246> <6259> <9247> <924D> <625C> <924E> <924F> <6264> <9250> <9250> <6268> <9251> <9252> <6271> <9253> <9254> <6274> <9255> <9256> <6277> <9257> <9258> <627A> <9259> <9259> <627D> <925A> <925C> <6281> <925D> <9260> <6285> <9261> <9266> <628B> <9267> <9267> <6294> endbfrange 100 beginbfrange <9268> <9268> <6299> <9269> <926B> <629C> <926C> <926C> <62A3> <926D> <926E> <62A6> <926F> <9270> <62A9> <9271> <9274> <62AD> <9275> <9277> <62B2> <9278> <927A> <62B6> <927B> <927B> <62BA> <927C> <927C> <62BE> <927D> <927E> <62C0> <9280> <9280> <62C3> <9281> <9281> <62CB> <9282> <9282> <62CF> <9283> <9283> <62D1> <9284> <9284> <62D5> <9285> <9286> <62DD> <9287> <9288> <62E0> <9289> <9289> <62E4> <928A> <928B> <62EA> <928C> <928C> <62F0> <928D> <928D> <62F2> <928E> <928E> <62F5> <928F> <9292> <62F8> <9293> <9293> <6300> <9294> <9297> <6303> <9298> <929B> <630A> <929C> <929D> <630F> <929E> <92A1> <6312> <92A2> <92A4> <6317> <92A5> <92A5> <631C> <92A6> <92A7> <6326> <92A8> <92A8> <6329> <92A9> <92AB> <632C> <92AC> <92AD> <6330> <92AE> <92B3> <6333> <92B4> <92B5> <633B> <92B6> <92B9> <633E> <92BA> <92BA> <6344> <92BB> <92BC> <6347> <92BD> <92BD> <634A> <92BE> <92C1> <6351> <92C2> <92C9> <6356> <92CA> <92CA> <6360> <92CB> <92CD> <6364> <92CE> <92CE> <6368> <92CF> <92D1> <636A> <92D2> <92D3> <636F> <92D4> <92D7> <6372> <92D8> <92D9> <6378> <92DA> <92DD> <637C> <92DE> <92DE> <6381> <92DF> <92E2> <6383> <92E3> <92E3> <638B> <92E4> <92E4> <638D> <92E5> <92E5> <6391> <92E6> <92E8> <6393> <92E9> <92E9> <6397> <92EA> <92F0> <6399> <92F1> <92F1> <63A1> <92F2> <92F2> <63A4> <92F3> <92F3> <63A6> <92F4> <92F4> <63AB> <92F5> <92F5> <63AF> <92F6> <92F7> <63B1> <92F8> <92F9> <63B5> <92FA> <92FA> <63B9> <92FB> <92FB> <63BB> <92FC> <92FC> <63BD> <92FD> <92FE> <63BF> <9340> <9342> <63C1> <9343> <9343> <63C5> <9344> <9345> <63C7> <9346> <9348> <63CA> <9349> <9349> <63D1> <934A> <934C> <63D3> <934D> <9353> <63D7> <9354> <9354> <63DF> <9355> <9355> <63E2> <9356> <935A> <63E4> <935B> <935C> <63EB> <935D> <9360> <63EE> <9361> <9361> <63F3> <9362> <9362> <63F5> <9363> <9363> <63F7> <9364> <9367> <63F9> <9368> <9368> <63FE> <9369> <936A> <6403> <936B> <936F> <6406> <9370> <9371> <640D> <9372> <9373> <6411> <9374> <9379> <6415> <937A> <937A> <641D> <937B> <937B> <641F> <937C> <937E> <6422> <9380> <9380> <6425> <9381> <9383> <6427> <9384> <9384> <642B> <9385> <938A> <642E> <938B> <938F> <6435> endbfrange 100 beginbfrange <9390> <9391> <643B> <9392> <9392> <643E> <9393> <9393> <6440> <9394> <9395> <6442> <9396> <9396> <6449> <9397> <939D> <644B> <939E> <939E> <6453> <939F> <93A1> <6455> <93A2> <93A6> <6459> <93A7> <93AE> <645F> <93AF> <93AF> <6468> <93B0> <93B2> <646A> <93B3> <93BC> <646E> <93BD> <93C3> <647B> <93C4> <93C4> <6483> <93C5> <93C5> <6486> <93C6> <93CE> <6488> <93CF> <93D0> <6493> <93D1> <93D2> <6497> <93D3> <93D6> <649A> <93D7> <93DB> <649F> <93DC> <93DF> <64A5> <93E0> <93E1> <64AA> <93E2> <93E2> <64AF> <93E3> <93E6> <64B1> <93E7> <93E7> <64B6> <93E8> <93E8> <64B9> <93E9> <93E9> <64BB> <93EA> <93EC> <64BD> <93ED> <93ED> <64C1> <93EE> <93EF> <64C3> <93F0> <93F6> <64C6> <93F7> <93F7> <64CF> <93F8> <93F8> <64D1> <93F9> <93FC> <64D3> <93FD> <93FE> <64D9> <9440> <9442> <64DB> <9443> <9445> <64DF> <9446> <9446> <64E3> <9447> <9447> <64E5> <9448> <9460> <64E7> <9461> <9468> <6501> <9469> <9470> <650A> <9471> <9475> <6513> <9476> <947E> <6519> <9480> <9482> <6522> <9483> <9487> <6526> <9488> <9489> <652C> <948A> <948D> <6530> <948E> <948E> <6537> <948F> <948F> <653A> <9490> <9491> <653C> <9492> <9496> <6540> <9497> <9498> <6546> <9499> <949A> <654A> <949B> <949C> <654D> <949D> <949D> <6550> <949E> <94A0> <6552> <94A1> <94A2> <6557> <94A3> <94A3> <655A> <94A4> <94A4> <655C> <94A5> <94A7> <655F> <94A8> <94A9> <6564> <94AA> <94AD> <6567> <94AE> <94B0> <656D> <94B1> <94B1> <6571> <94B2> <94B2> <6573> <94B3> <94B4> <6575> <94B5> <94C3> <6578> <94C4> <94C6> <6588> <94C7> <94C9> <658D> <94CA> <94CA> <6592> <94CB> <94CD> <6594> <94CE> <94CE> <6598> <94CF> <94CF> <659A> <94D0> <94D1> <659D> <94D2> <94D2> <65A0> <94D3> <94D4> <65A2> <94D5> <94D5> <65A6> <94D6> <94D6> <65A8> <94D7> <94D7> <65AA> <94D8> <94D8> <65AC> <94D9> <94D9> <65AE> <94DA> <94E1> <65B1> <94E2> <94E3> <65BA> <94E4> <94E6> <65BE> <94E7> <94E7> <65C2> <94E8> <94EB> <65C7> <94EC> <94EC> <65CD> <94ED> <94EE> <65D0> <94EF> <94F1> <65D3> <94F2> <94F9> <65D8> <94FA> <94FA> <65E1> <94FB> <94FC> <65E3> <94FD> <94FE> <65EA> <9540> <9543> <65F2> <9544> <9545> <65F8> <9546> <954A> <65FB> <954B> <954B> <6601> <954C> <954D> <6604> endbfrange 100 beginbfrange <954E> <9550> <6607> <9551> <9551> <660B> <9552> <9552> <660D> <9553> <9555> <6610> <9556> <9558> <6616> <9559> <955B> <661A> <955C> <955C> <661E> <955D> <9560> <6621> <9561> <9561> <6626> <9562> <9565> <6629> <9566> <9566> <662E> <9567> <9567> <6630> <9568> <9569> <6632> <956A> <956E> <6637> <956F> <956F> <663D> <9570> <9571> <663F> <9572> <9572> <6642> <9573> <9579> <6644> <957A> <957B> <664D> <957C> <957D> <6650> <957E> <957E> <6658> <9580> <9580> <6659> <9581> <9584> <665B> <9585> <9585> <6660> <9586> <9587> <6662> <9588> <9588> <6665> <9589> <9589> <6667> <958A> <958E> <6669> <958F> <9591> <6671> <9592> <9592> <6675> <9593> <9594> <6678> <9595> <9597> <667B> <9598> <959A> <667F> <959B> <959B> <6683> <959C> <959D> <6685> <959E> <95A1> <6688> <95A2> <95A5> <668D> <95A6> <95A9> <6692> <95AA> <95AE> <6698> <95AF> <95B7> <669E> <95B8> <95BC> <66A9> <95BD> <95C1> <66AF> <95C2> <95C5> <66B5> <95C6> <95C9> <66BA> <95CA> <95E3> <66BF> <95E4> <95E4> <66DA> <95E5> <95EC> <66DE> <95ED> <95EE> <66E7> <95EF> <95F4> <66EA> <95F5> <95F5> <66F1> <95F6> <95F7> <66F5> <95F8> <95F8> <66F8> <95F9> <95FA> <66FA> <95FB> <95FB> <66FD> <95FC> <95FE> <6701> <9640> <9643> <6704> <9644> <9644> <670C> <9645> <9646> <670E> <9647> <9649> <6711> <964A> <964A> <6716> <964B> <964D> <6718> <964E> <964E> <671C> <964F> <964F> <671E> <9650> <9655> <6720> <9656> <9656> <6727> <9657> <9657> <6729> <9658> <9658> <672E> <9659> <9659> <6730> <965A> <965B> <6732> <965C> <965F> <6736> <9660> <9661> <673B> <9662> <9663> <673E> <9664> <9664> <6741> <9665> <9666> <6744> <9667> <9667> <6747> <9668> <9669> <674A> <966A> <966A> <674D> <966B> <966B> <6752> <966C> <966D> <6754> <966E> <9672> <6757> <9673> <9673> <675D> <9674> <9676> <6762> <9677> <9678> <6766> <9679> <967A> <676B> <967B> <967B> <676E> <967C> <967C> <6771> <967D> <967D> <6774> <967E> <967E> <6776> <9680> <9683> <6778> <9684> <9684> <677D> <9685> <9685> <6780> <9686> <9687> <6782> <9688> <9689> <6785> <968A> <968A> <6788> <968B> <968B> <678A> <968C> <968F> <678C> <9690> <9693> <6791> <9694> <9694> <6796> <9695> <9695> <6799> <9696> <9696> <679B> endbfrange 100 beginbfrange <9697> <9699> <679F> <969A> <969A> <67A4> <969B> <969B> <67A6> <969C> <969C> <67A9> <969D> <969D> <67AC> <969E> <969E> <67AE> <969F> <96A0> <67B1> <96A1> <96A1> <67B4> <96A2> <96A9> <67B9> <96AA> <96AA> <67C2> <96AB> <96B4> <67C5> <96B5> <96B7> <67D5> <96B8> <96B8> <67DB> <96B9> <96B9> <67DF> <96BA> <96BA> <67E1> <96BB> <96BC> <67E3> <96BD> <96BF> <67E6> <96C0> <96C1> <67EA> <96C2> <96C3> <67ED> <96C4> <96C4> <67F2> <96C5> <96CC> <67F5> <96CD> <96CD> <67FE> <96CE> <96D1> <6801> <96D2> <96D2> <6806> <96D3> <96D3> <680D> <96D4> <96D4> <6810> <96D5> <96D5> <6812> <96D6> <96D7> <6814> <96D8> <96DC> <6818> <96DD> <96DF> <681E> <96E0> <96E6> <6822> <96E7> <96ED> <682B> <96EE> <96F0> <6834> <96F1> <96F2> <683A> <96F3> <96F3> <683F> <96F4> <96F4> <6847> <96F5> <96F5> <684B> <96F6> <96F6> <684D> <96F7> <96F7> <684F> <96F8> <96F8> <6852> <96F9> <96FE> <6856> <9740> <9743> <685C> <9744> <9744> <686A> <9745> <974C> <686C> <974D> <974D> <6875> <974E> <9756> <6878> <9757> <9757> <6882> <9758> <9758> <6884> <9759> <9760> <6887> <9761> <9763> <6890> <9764> <9766> <6894> <9767> <9770> <6898> <9771> <9773> <68A3> <9774> <9777> <68A9> <9778> <9778> <68AE> <9779> <977A> <68B1> <977B> <977B> <68B4> <977C> <977E> <68B6> <9780> <9786> <68B9> <9787> <9787> <68C1> <9788> <978D> <68C3> <978E> <978E> <68CA> <978F> <978F> <68CC> <9790> <9793> <68CE> <9794> <9795> <68D3> <9796> <9797> <68D6> <9798> <9798> <68D9> <9799> <979D> <68DB> <979E> <979F> <68E1> <97A0> <97A9> <68E4> <97AA> <97AA> <68EF> <97AB> <97AD> <68F2> <97AE> <97B0> <68F6> <97B1> <97B1> <68FB> <97B2> <97B5> <68FD> <97B6> <97B8> <6902> <97B9> <97BD> <6906> <97BE> <97BE> <690C> <97BF> <97BF> <690F> <97C0> <97C0> <6911> <97C1> <97CC> <6913> <97CD> <97CF> <6921> <97D0> <97D7> <6925> <97D8> <97D9> <692E> <97DA> <97DC> <6931> <97DD> <97E0> <6935> <97E1> <97E3> <693A> <97E4> <97E4> <693E> <97E5> <97E6> <6940> <97E7> <97F7> <6943> <97F8> <97F9> <6955> <97FA> <97FB> <6958> <97FC> <97FD> <695B> <97FE> <97FE> <695F> <9840> <9841> <6961> <9842> <9843> <6964> <9844> <9847> <6967> <9848> <9849> <696C> <984A> <984B> <696F> <984C> <9850> <6972> endbfrange 100 beginbfrange <9851> <9852> <697A> <9853> <9855> <697D> <9856> <9856> <6981> <9857> <9857> <6983> <9858> <9858> <6985> <9859> <985B> <698A> <985C> <9861> <698E> <9862> <9863> <6996> <9864> <9865> <6999> <9866> <986F> <699D> <9870> <9871> <69A9> <9872> <9872> <69AC> <9873> <9875> <69AE> <9876> <9877> <69B2> <9878> <9879> <69B5> <987A> <987C> <69B8> <987D> <987E> <69BC> <9880> <9882> <69BE> <9883> <988A> <69C2> <988B> <988B> <69CB> <988C> <988C> <69CD> <988D> <988D> <69CF> <988E> <9890> <69D1> <9891> <9896> <69D5> <9897> <9899> <69DC> <989A> <98A5> <69E1> <98A6> <98A9> <69EE> <98AA> <98B3> <69F3> <98B4> <98B4> <69FE> <98B5> <98BE> <6A00> <98BF> <98CA> <6A0B> <98CB> <98D0> <6A19> <98D1> <98D1> <6A20> <98D2> <98D7> <6A22> <98D8> <98D8> <6A29> <98D9> <98DC> <6A2B> <98DD> <98DD> <6A30> <98DE> <98E0> <6A32> <98E1> <98E7> <6A36> <98E8> <98EC> <6A3F> <98ED> <98EE> <6A45> <98EF> <98F6> <6A48> <98F7> <98FD> <6A51> <98FE> <98FE> <6A5A> <9940> <9944> <6A5C> <9945> <9947> <6A62> <9948> <9952> <6A66> <9953> <9959> <6A72> <995A> <995B> <6A7A> <995C> <995E> <6A7D> <995F> <9961> <6A81> <9962> <996A> <6A85> <996B> <996B> <6A8F> <996C> <9970> <6A92> <9971> <9978> <6A98> <9979> <997E> <6AA1> <9980> <9981> <6AA7> <9982> <9982> <6AAA> <9983> <99F5> <6AAD> <99F6> <99F7> <6B25> <99F8> <99FE> <6B28> <9A40> <9A42> <6B2F> <9A43> <9A46> <6B33> <9A47> <9A47> <6B38> <9A48> <9A4A> <6B3B> <9A4B> <9A4E> <6B3F> <9A4F> <9A50> <6B44> <9A51> <9A51> <6B48> <9A52> <9A53> <6B4A> <9A54> <9A5F> <6B4D> <9A60> <9A67> <6B5A> <9A68> <9A69> <6B68> <9A6A> <9A77> <6B6B> <9A78> <9A78> <6B7A> <9A79> <9A7C> <6B7D> <9A7D> <9A7D> <6B85> <9A7E> <9A7E> <6B88> <9A80> <9A80> <6B8C> <9A81> <9A84> <6B8E> <9A85> <9A86> <6B94> <9A87> <9A89> <6B97> <9A8A> <9A8E> <6B9C> <9A8F> <9A96> <6BA2> <9A97> <9A9E> <6BAB> <9A9F> <9A9F> <6BB6> <9AA0> <9AA6> <6BB8> <9AA7> <9AA7> <6BC0> <9AA8> <9AA9> <6BC3> <9AAA> <9AAE> <6BC6> <9AAF> <9AAF> <6BCC> <9AB0> <9AB0> <6BCE> <9AB1> <9AB2> <6BD0> <9AB3> <9AB3> <6BD8> <9AB4> <9AB4> <6BDA> <9AB5> <9AB9> <6BDC> <9ABA> <9AC1> <6BE2> <9AC2> <9AC4> <6BEC> <9AC5> <9AC7> <6BF0> <9AC8> <9AC8> <6BF4> <9AC9> <9ACB> <6BF6> endbfrange 100 beginbfrange <9ACC> <9ACE> <6BFA> <9ACF> <9AD5> <6BFE> <9AD6> <9ADA> <6C08> <9ADB> <9ADB> <6C0E> <9ADC> <9ADC> <6C12> <9ADD> <9ADD> <6C17> <9ADE> <9AE0> <6C1C> <9AE1> <9AE1> <6C20> <9AE2> <9AE2> <6C23> <9AE3> <9AE3> <6C25> <9AE4> <9AE6> <6C2B> <9AE7> <9AE7> <6C31> <9AE8> <9AE8> <6C33> <9AE9> <9AEA> <6C36> <9AEB> <9AEE> <6C39> <9AEF> <9AF0> <6C3E> <9AF1> <9AF3> <6C43> <9AF4> <9AF4> <6C48> <9AF5> <9AF9> <6C4B> <9AFA> <9AFC> <6C51> <9AFD> <9AFD> <6C56> <9AFE> <9AFE> <6C58> <9B40> <9B41> <6C59> <9B42> <9B43> <6C62> <9B44> <9B46> <6C65> <9B47> <9B4B> <6C6B> <9B4C> <9B4C> <6C71> <9B4D> <9B4D> <6C73> <9B4E> <9B4E> <6C75> <9B4F> <9B50> <6C77> <9B51> <9B53> <6C7A> <9B54> <9B55> <6C7F> <9B56> <9B56> <6C84> <9B57> <9B57> <6C87> <9B58> <9B59> <6C8A> <9B5A> <9B5B> <6C8D> <9B5C> <9B5D> <6C91> <9B5E> <9B61> <6C95> <9B62> <9B62> <6C9A> <9B63> <9B65> <6C9C> <9B66> <9B66> <6CA0> <9B67> <9B67> <6CA2> <9B68> <9B68> <6CA8> <9B69> <9B69> <6CAC> <9B6A> <9B6B> <6CAF> <9B6C> <9B6F> <6CB4> <9B70> <9B70> <6CBA> <9B71> <9B74> <6CC0> <9B75> <9B77> <6CC6> <9B78> <9B78> <6CCB> <9B79> <9B7B> <6CCD> <9B7C> <9B7D> <6CD1> <9B7E> <9B7E> <6CD8> <9B80> <9B81> <6CD9> <9B82> <9B83> <6CDC> <9B84> <9B84> <6CDF> <9B85> <9B85> <6CE4> <9B86> <9B87> <6CE6> <9B88> <9B88> <6CE9> <9B89> <9B8A> <6CEC> <9B8B> <9B8B> <6CF2> <9B8C> <9B8C> <6CF4> <9B8D> <9B8D> <6CF9> <9B8E> <9B8F> <6CFF> <9B90> <9B91> <6D02> <9B92> <9B93> <6D05> <9B94> <9B96> <6D08> <9B97> <9B97> <6D0D> <9B98> <9B9A> <6D0F> <9B9B> <9B9E> <6D13> <9B9F> <9B9F> <6D18> <9BA0> <9BA1> <6D1C> <9BA2> <9BA7> <6D1F> <9BA8> <9BA8> <6D26> <9BA9> <9BAA> <6D28> <9BAB> <9BAC> <6D2C> <9BAD> <9BAE> <6D2F> <9BAF> <9BAF> <6D34> <9BB0> <9BB2> <6D36> <9BB3> <9BB3> <6D3A> <9BB4> <9BB5> <6D3F> <9BB6> <9BB6> <6D42> <9BB7> <9BB7> <6D44> <9BB8> <9BB8> <6D49> <9BB9> <9BB9> <6D4C> <9BBA> <9BBA> <6D50> <9BBB> <9BBE> <6D55> <9BBF> <9BBF> <6D5B> <9BC0> <9BC0> <6D5D> <9BC1> <9BC1> <6D5F> <9BC2> <9BC3> <6D61> <9BC4> <9BC5> <6D64> <9BC6> <9BC7> <6D67> <9BC8> <9BCA> <6D6B> <9BCB> <9BCE> <6D70> <9BCF> <9BD0> <6D75> <9BD1> <9BD3> <6D79> <9BD4> <9BD8> <6D7D> <9BD9> <9BDA> <6D83> <9BDB> <9BDC> <6D86> endbfrange 100 beginbfrange <9BDD> <9BDE> <6D8A> <9BDF> <9BDF> <6D8D> <9BE0> <9BE1> <6D8F> <9BE2> <9BE2> <6D92> <9BE3> <9BE7> <6D96> <9BE8> <9BE8> <6D9C> <9BE9> <9BE9> <6DA2> <9BEA> <9BEA> <6DA5> <9BEB> <9BEC> <6DAC> <9BED> <9BEE> <6DB0> <9BEF> <9BF0> <6DB3> <9BF1> <9BF2> <6DB6> <9BF3> <9BF8> <6DB9> <9BF9> <9BFB> <6DC1> <9BFC> <9BFE> <6DC8> <9C40> <9C43> <6DCD> <9C44> <9C47> <6DD2> <9C48> <9C48> <6DD7> <9C49> <9C4B> <6DDA> <9C4C> <9C4C> <6DDF> <9C4D> <9C4E> <6DE2> <9C4F> <9C4F> <6DE5> <9C50> <9C53> <6DE7> <9C54> <9C54> <6DED> <9C55> <9C56> <6DEF> <9C57> <9C57> <6DF2> <9C58> <9C5A> <6DF4> <9C5B> <9C5B> <6DF8> <9C5C> <9C5C> <6DFA> <9C5D> <9C64> <6DFD> <9C65> <9C68> <6E06> <9C69> <9C69> <6E0B> <9C6A> <9C6A> <6E0F> <9C6B> <9C6C> <6E12> <9C6D> <9C6D> <6E15> <9C6E> <9C6F> <6E18> <9C70> <9C71> <6E1B> <9C72> <9C73> <6E1E> <9C74> <9C74> <6E22> <9C75> <9C77> <6E26> <9C78> <9C78> <6E2A> <9C79> <9C79> <6E2C> <9C7A> <9C7A> <6E2E> <9C7B> <9C7C> <6E30> <9C7D> <9C7D> <6E33> <9C7E> <9C7E> <6E35> <9C80> <9C81> <6E36> <9C82> <9C82> <6E39> <9C83> <9C8A> <6E3B> <9C8B> <9C92> <6E45> <9C93> <9C96> <6E4F> <9C97> <9C97> <6E55> <9C98> <9C98> <6E57> <9C99> <9C9A> <6E59> <9C9B> <9C9D> <6E5C> <9C9E> <9CA8> <6E60> <9CA9> <9CAA> <6E6C> <9CAB> <9CB9> <6E6F> <9CBA> <9CBC> <6E80> <9CBD> <9CBD> <6E84> <9CBE> <9CBF> <6E87> <9CC0> <9CC4> <6E8A> <9CC5> <9CCB> <6E91> <9CCC> <9CCE> <6E99> <9CCF> <9CD0> <6E9D> <9CD1> <9CD2> <6EA0> <9CD3> <9CD4> <6EA3> <9CD5> <9CD5> <6EA6> <9CD6> <9CD7> <6EA8> <9CD8> <9CDB> <6EAB> <9CDC> <9CDC> <6EB0> <9CDD> <9CDD> <6EB3> <9CDE> <9CDE> <6EB5> <9CDF> <9CE0> <6EB8> <9CE1> <9CE1> <6EBC> <9CE2> <9CE4> <6EBE> <9CE5> <9CE8> <6EC3> <9CE9> <9CEB> <6EC8> <9CEC> <9CEE> <6ECC> <9CEF> <9CEF> <6ED0> <9CF0> <9CF0> <6ED2> <9CF1> <9CF1> <6ED6> <9CF2> <9CF3> <6ED8> <9CF4> <9CF6> <6EDB> <9CF7> <9CF7> <6EE3> <9CF8> <9CF8> <6EE7> <9CF9> <9CFE> <6EEA> <9D40> <9D43> <6EF0> <9D44> <9D47> <6EF5> <9D48> <9D4F> <6EFA> <9D50> <9D52> <6F03> <9D53> <9D54> <6F07> <9D55> <9D59> <6F0A> <9D5A> <9D5C> <6F10> <9D5D> <9D66> <6F16> <9D67> <9D69> <6F21> <9D6A> <9D6D> <6F25> <9D6E> <9D6E> <6F2C> <9D6F> <9D6F> <6F2E> <9D70> <9D70> <6F30> endbfrange 100 beginbfrange <9D71> <9D71> <6F32> <9D72> <9D73> <6F34> <9D74> <9D7A> <6F37> <9D7B> <9D7E> <6F3F> <9D80> <9D82> <6F43> <9D83> <9D85> <6F48> <9D86> <9D86> <6F4C> <9D87> <9D90> <6F4E> <9D91> <9D93> <6F59> <9D94> <9D94> <6F5D> <9D95> <9D97> <6F5F> <9D98> <9D9A> <6F63> <9D9B> <9DA0> <6F67> <9DA1> <9DA3> <6F6F> <9DA4> <9DA4> <6F73> <9DA5> <9DA7> <6F75> <9DA8> <9DA8> <6F79> <9DA9> <9DA9> <6F7B> <9DAA> <9DB0> <6F7D> <9DB1> <9DB3> <6F85> <9DB4> <9DB5> <6F8A> <9DB6> <9DC2> <6F8F> <9DC3> <9DC6> <6F9D> <9DC7> <9DCB> <6FA2> <9DCC> <9DD6> <6FA8> <9DD7> <9DD8> <6FB4> <9DD9> <9DDA> <6FB7> <9DDB> <9DE0> <6FBA> <9DE1> <9DE1> <6FC1> <9DE2> <9DE7> <6FC3> <9DE8> <9DEE> <6FCA> <9DEF> <9DF9> <6FD3> <9DFA> <9DFA> <6FDF> <9DFB> <9DFE> <6FE2> <9E40> <9E47> <6FE6> <9E48> <9E68> <6FF0> <9E69> <9E70> <7012> <9E71> <9E77> <701C> <9E78> <9E7E> <7024> <9E80> <9E89> <702B> <9E8A> <9E8C> <7036> <9E8D> <9E9E> <703A> <9E9F> <9EA0> <704D> <9EA1> <9EAE> <7050> <9EAF> <9EBA> <705F> <9EBB> <9EBB> <706E> <9EBC> <9EBF> <7071> <9EC0> <9EC0> <7077> <9EC1> <9EC3> <7079> <9EC4> <9EC4> <707D> <9EC5> <9EC8> <7081> <9EC9> <9ECB> <7086> <9ECC> <9ECE> <708B> <9ECF> <9ED1> <708F> <9ED2> <9ED2> <7093> <9ED3> <9ED4> <7097> <9ED5> <9ED6> <709A> <9ED7> <9EE3> <709E> <9EE4> <9EE4> <70B0> <9EE5> <9EE5> <70B2> <9EE6> <9EE8> <70B4> <9EE9> <9EE9> <70BA> <9EEA> <9EEB> <70BE> <9EEC> <9EEF> <70C4> <9EF0> <9EF0> <70C9> <9EF1> <9EFD> <70CB> <9EFE> <9EFE> <70DA> <9F40> <9F42> <70DC> <9F43> <9F46> <70E0> <9F47> <9F47> <70E5> <9F48> <9F48> <70EA> <9F49> <9F49> <70EE> <9F4A> <9F50> <70F0> <9F51> <9F51> <70F8> <9F52> <9F54> <70FA> <9F55> <9F5F> <70FE> <9F60> <9F64> <710B> <9F65> <9F66> <7111> <9F67> <9F67> <7114> <9F68> <9F68> <7117> <9F69> <9F73> <711B> <9F74> <9F7B> <7127> <9F7C> <9F7E> <7132> <9F80> <9F80> <7135> <9F81> <9F8E> <7137> <9F8F> <9F92> <7146> <9F93> <9F93> <714B> <9F94> <9F94> <714D> <9F95> <9FA1> <714F> <9FA2> <9FA2> <715D> <9FA3> <9FA7> <715F> <9FA8> <9FA8> <7165> <9FA9> <9FAD> <7169> <9FAE> <9FB0> <716F> <9FB1> <9FB4> <7174> <9FB5> <9FB5> <7179> <9FB6> <9FB7> <717B> <9FB8> <9FBD> <717E> <9FBE> <9FC2> <7185> <9FC3> <9FC6> <718B> endbfrange 100 beginbfrange <9FC7> <9FCA> <7190> <9FCB> <9FCD> <7195> <9FCE> <9FD2> <719A> <9FD3> <9FD9> <71A1> <9FDA> <9FDC> <71A9> <9FDD> <9FE2> <71AD> <9FE3> <9FE3> <71B4> <9FE4> <9FE6> <71B6> <9FE7> <9FEF> <71BA> <9FF0> <9FF9> <71C4> <9FFA> <9FFE> <71CF> <A040> <A049> <71D6> <A04A> <A04D> <71E1> <A04E> <A04E> <71E6> <A04F> <A054> <71E8> <A055> <A05E> <71EF> <A05F> <A06A> <71FA> <A06B> <A07E> <7207> <A080> <A081> <721B> <A082> <A08B> <721E> <A08C> <A08C> <7229> <A08D> <A08D> <722B> <A08E> <A090> <722D> <A091> <A093> <7232> <A094> <A094> <723A> <A095> <A095> <723C> <A096> <A096> <723E> <A097> <A09D> <7240> <A09E> <A0A0> <7249> <A0A1> <A0A4> <724E> <A0A5> <A0A7> <7253> <A0A8> <A0A9> <7257> <A0AA> <A0AA> <725A> <A0AB> <A0AB> <725C> <A0AC> <A0AC> <725E> <A0AD> <A0AD> <7260> <A0AE> <A0B0> <7263> <A0B1> <A0B1> <7268> <A0B2> <A0B5> <726A> <A0B6> <A0B7> <7270> <A0B8> <A0B9> <7273> <A0BA> <A0BC> <7276> <A0BD> <A0BF> <727B> <A0C0> <A0C1> <7282> <A0C2> <A0C6> <7285> <A0C7> <A0C7> <728C> <A0C8> <A0C8> <728E> <A0C9> <A0CA> <7290> <A0CB> <A0D6> <7293> <A0D7> <A0E2> <72A0> <A0E3> <A0E3> <72AE> <A0E4> <A0E6> <72B1> <A0E7> <A0E7> <72B5> <A0E8> <A0EE> <72BA> <A0EF> <A0F1> <72C5> <A0F2> <A0F5> <72C9> <A0F6> <A0F6> <72CF> <A0F7> <A0F7> <72D1> <A0F8> <A0FB> <72D3> <A0FC> <A0FC> <72D8> <A0FD> <A0FE> <72DA> <A140> <A17E> <E4C6> <A180> <A1A0> <E505> <A1A1> <A1A3> <3000> <A1A4> <A1A4> <00B7> <A1A5> <A1A5> <02C9> <A1A6> <A1A6> <02C7> <A1A7> <A1A7> <00A8> <A1A8> <A1A8> <3003> <A1A9> <A1A9> <3005> <A1AA> <A1AA> <2014> <A1AB> <A1AB> <FF5E> <A1AC> <A1AC> <2016> <A1AD> <A1AD> <2026> <A1AE> <A1AF> <2018> <A1B0> <A1B1> <201C> <A1B2> <A1B3> <3014> <A1B4> <A1BB> <3008> <A1BC> <A1BD> <3016> <A1BE> <A1BF> <3010> <A1C0> <A1C0> <00B1> <A1C1> <A1C1> <00D7> <A1C2> <A1C2> <00F7> <A1C3> <A1C3> <2236> <A1C4> <A1C5> <2227> <A1C6> <A1C6> <2211> <A1C7> <A1C7> <220F> <A1C8> <A1C8> <222A> <A1C9> <A1C9> <2229> <A1CA> <A1CA> <2208> <A1CB> <A1CB> <2237> <A1CC> <A1CC> <221A> <A1CD> <A1CD> <22A5> <A1CE> <A1CE> <2225> <A1CF> <A1CF> <2220> <A1D0> <A1D0> <2312> <A1D1> <A1D1> <2299> <A1D2> <A1D2> <222B> <A1D3> <A1D3> <222E> <A1D4> <A1D4> <2261> endbfrange 100 beginbfrange <A1D5> <A1D5> <224C> <A1D6> <A1D6> <2248> <A1D7> <A1D7> <223D> <A1D8> <A1D8> <221D> <A1D9> <A1D9> <2260> <A1DA> <A1DB> <226E> <A1DC> <A1DD> <2264> <A1DE> <A1DE> <221E> <A1DF> <A1DF> <2235> <A1E0> <A1E0> <2234> <A1E1> <A1E1> <2642> <A1E2> <A1E2> <2640> <A1E3> <A1E3> <00B0> <A1E4> <A1E5> <2032> <A1E6> <A1E6> <2103> <A1E7> <A1E7> <FF04> <A1E8> <A1E8> <00A4> <A1E9> <A1EA> <FFE0> <A1EB> <A1EB> <2030> <A1EC> <A1EC> <00A7> <A1ED> <A1ED> <2116> <A1EE> <A1EE> <2606> <A1EF> <A1EF> <2605> <A1F0> <A1F0> <25CB> <A1F1> <A1F1> <25CF> <A1F2> <A1F2> <25CE> <A1F3> <A1F3> <25C7> <A1F4> <A1F4> <25C6> <A1F5> <A1F5> <25A1> <A1F6> <A1F6> <25A0> <A1F7> <A1F7> <25B3> <A1F8> <A1F8> <25B2> <A1F9> <A1F9> <203B> <A1FA> <A1FA> <2192> <A1FB> <A1FC> <2190> <A1FD> <A1FD> <2193> <A1FE> <A1FE> <3013> <A240> <A27E> <E526> <A280> <A2A0> <E565> <A2A1> <A2AA> <2170> <A2AB> <A2B0> <E766> <A2B1> <A2C4> <2488> <A2C5> <A2D8> <2474> <A2D9> <A2E2> <2460> <A2E3> <A2E4> <E76C> <A2E5> <A2EE> <3220> <A2EF> <A2F0> <E76E> <A2F1> <A2FC> <2160> <A2FD> <A2FE> <E770> <A340> <A37E> <E586> <A380> <A3A0> <E5C5> <A3A1> <A3A3> <FF01> <A3A4> <A3A4> <FFE5> <A3A5> <A3FD> <FF05> <A3FE> <A3FE> <FFE3> <A440> <A47E> <E5E6> <A480> <A4A0> <E625> <A4A1> <A4F3> <3041> <A4F4> <A4FE> <E772> <A540> <A57E> <E646> <A580> <A5A0> <E685> <A5A1> <A5F6> <30A1> <A5F7> <A5FE> <E77D> <A640> <A67E> <E6A6> <A680> <A6A0> <E6E5> <A6A1> <A6B1> <0391> <A6B2> <A6B8> <03A3> <A6B9> <A6C0> <E785> <A6C1> <A6D1> <03B1> <A6D2> <A6D8> <03C3> <A6D9> <A6DF> <E78D> <A6E0> <A6E1> <FE35> <A6E2> <A6E3> <FE39> <A6E4> <A6E5> <FE3F> <A6E6> <A6E7> <FE3D> <A6E8> <A6EB> <FE41> <A6EC> <A6ED> <E794> <A6EE> <A6EF> <FE3B> <A6F0> <A6F1> <FE37> <A6F2> <A6F2> <FE31> <A6F3> <A6F3> <E796> <A6F4> <A6F5> <FE33> <A6F6> <A6FE> <E797> <A740> <A77E> <E706> <A780> <A7A0> <E745> <A7A1> <A7A6> <0410> <A7A7> <A7A7> <0401> <A7A8> <A7C1> <0416> <A7C2> <A7D0> <E7A0> <A7D1> <A7D6> <0430> <A7D7> <A7D7> <0451> <A7D8> <A7F1> <0436> <A7F2> <A7FE> <E7AF> <A840> <A841> <02CA> <A842> <A842> <02D9> <A843> <A843> <2013> <A844> <A844> <2015> <A845> <A845> <2025> <A846> <A846> <2035> <A847> <A847> <2105> endbfrange 100 beginbfrange <A848> <A848> <2109> <A849> <A84C> <2196> <A84D> <A84D> <2215> <A84E> <A84E> <221F> <A84F> <A84F> <2223> <A850> <A850> <2252> <A851> <A852> <2266> <A853> <A853> <22BF> <A854> <A877> <2550> <A878> <A87E> <2581> <A880> <A887> <2588> <A888> <A88A> <2593> <A88B> <A88C> <25BC> <A88D> <A890> <25E2> <A891> <A891> <2609> <A892> <A892> <2295> <A893> <A893> <3012> <A894> <A895> <301D> <A896> <A8A0> <E7BC> <A8A1> <A8A1> <0101> <A8A2> <A8A2> <00E1> <A8A3> <A8A3> <01CE> <A8A4> <A8A4> <00E0> <A8A5> <A8A5> <0113> <A8A6> <A8A6> <00E9> <A8A7> <A8A7> <011B> <A8A8> <A8A8> <00E8> <A8A9> <A8A9> <012B> <A8AA> <A8AA> <00ED> <A8AB> <A8AB> <01D0> <A8AC> <A8AC> <00EC> <A8AD> <A8AD> <014D> <A8AE> <A8AE> <00F3> <A8AF> <A8AF> <01D2> <A8B0> <A8B0> <00F2> <A8B1> <A8B1> <016B> <A8B2> <A8B2> <00FA> <A8B3> <A8B3> <01D4> <A8B4> <A8B4> <00F9> <A8B5> <A8B5> <01D6> <A8B6> <A8B6> <01D8> <A8B7> <A8B7> <01DA> <A8B8> <A8B8> <01DC> <A8B9> <A8B9> <00FC> <A8BA> <A8BA> <00EA> <A8BB> <A8BB> <0251> <A8BC> <A8BC> <1E3F> <A8BD> <A8BD> <0144> <A8BE> <A8BE> <0148> <A8BF> <A8BF> <E7C8> <A8C0> <A8C0> <0261> <A8C1> <A8C4> <E7C9> <A8C5> <A8E9> <3105> <A8EA> <A8FE> <E7CD> <A940> <A948> <3021> <A949> <A949> <32A3> <A94A> <A94B> <338E> <A94C> <A94E> <339C> <A94F> <A94F> <33A1> <A950> <A950> <33C4> <A951> <A951> <33CE> <A952> <A953> <33D1> <A954> <A954> <33D5> <A955> <A955> <FE30> <A956> <A956> <FFE2> <A957> <A957> <FFE4> <A958> <A958> <E7E2> <A959> <A959> <2121> <A95A> <A95A> <3231> <A95B> <A95B> <E7E3> <A95C> <A95C> <2010> <A95D> <A95F> <E7E4> <A960> <A960> <30FC> <A961> <A962> <309B> <A963> <A964> <30FD> <A965> <A965> <3006> <A966> <A967> <309D> <A968> <A971> <FE49> <A972> <A975> <FE54> <A976> <A97E> <FE59> <A980> <A984> <FE62> <A985> <A988> <FE68> <A989> <A995> <E7E7> <A996> <A996> <3007> <A997> <A9A3> <E7F4> <A9A4> <A9EF> <2500> <A9F0> <A9FE> <E801> <AA40> <AA41> <72DC> <AA42> <AA42> <72DF> <AA43> <AA48> <72E2> <AA49> <AA4A> <72EA> <AA4B> <AA4C> <72F5> <AA4D> <AA4D> <72F9> <AA4E> <AA51> <72FD> <AA52> <AA52> <7302> <AA53> <AA58> <7304> <AA59> <AA5B> <730B> <AA5C> <AA5F> <730F> <AA60> <AA60> <7314> <AA61> <AA63> <7318> endbfrange 100 beginbfrange <AA64> <AA65> <731F> <AA66> <AA67> <7323> <AA68> <AA6A> <7326> <AA6B> <AA6B> <732D> <AA6C> <AA6D> <732F> <AA6E> <AA6F> <7332> <AA70> <AA71> <7335> <AA72> <AA75> <733A> <AA76> <AA7E> <7340> <AA80> <AA83> <7349> <AA84> <AA85> <734E> <AA86> <AA86> <7351> <AA87> <AA8A> <7353> <AA8B> <AA92> <7358> <AA93> <AA9D> <7361> <AA9E> <AA9E> <736E> <AA9F> <AAA0> <7370> <AAA1> <AAFE> <E000> <AB40> <AB4B> <7372> <AB4C> <AB50> <737F> <AB51> <AB52> <7385> <AB53> <AB53> <7388> <AB54> <AB54> <738A> <AB55> <AB56> <738C> <AB57> <AB58> <738F> <AB59> <AB5C> <7392> <AB5D> <AB60> <7397> <AB61> <AB63> <739C> <AB64> <AB65> <73A0> <AB66> <AB6B> <73A3> <AB6C> <AB6C> <73AA> <AB6D> <AB6E> <73AC> <AB6F> <AB6F> <73B1> <AB70> <AB72> <73B4> <AB73> <AB74> <73B8> <AB75> <AB78> <73BC> <AB79> <AB79> <73C1> <AB7A> <AB7E> <73C3> <AB80> <AB81> <73CB> <AB82> <AB82> <73CE> <AB83> <AB89> <73D2> <AB8A> <AB8D> <73DA> <AB8E> <AB8E> <73DF> <AB8F> <AB92> <73E1> <AB93> <AB93> <73E6> <AB94> <AB94> <73E8> <AB95> <AB97> <73EA> <AB98> <AB9B> <73EE> <AB9C> <ABA0> <73F3> <ABA1> <ABFE> <E05E> <AC40> <AC4A> <73F8> <AC4B> <AC4B> <7404> <AC4C> <AC4D> <7407> <AC4E> <AC51> <740B> <AC52> <AC5A> <7411> <AC5B> <AC60> <741C> <AC61> <AC62> <7423> <AC63> <AC63> <7427> <AC64> <AC64> <7429> <AC65> <AC65> <742B> <AC66> <AC66> <742D> <AC67> <AC67> <742F> <AC68> <AC69> <7431> <AC6A> <AC6E> <7437> <AC6F> <AC72> <743D> <AC73> <AC7E> <7442> <AC80> <AC86> <744E> <AC87> <AC87> <7456> <AC88> <AC88> <7458> <AC89> <AC89> <745D> <AC8A> <AC96> <7460> <AC97> <AC98> <746E> <AC99> <AC9D> <7471> <AC9E> <ACA0> <7478> <ACA1> <ACFE> <E0BC> <AD40> <AD42> <747B> <AD43> <AD43> <747F> <AD44> <AD44> <7482> <AD45> <AD47> <7484> <AD48> <AD4A> <7488> <AD4B> <AD4C> <748C> <AD4D> <AD4D> <748F> <AD4E> <AD58> <7491> <AD59> <AD59> <749D> <AD5A> <AD61> <749F> <AD62> <AD71> <74AA> <AD72> <AD7E> <74BB> <AD80> <AD89> <74C8> <AD8A> <AD92> <74D3> <AD93> <AD93> <74DD> <AD94> <AD94> <74DF> <AD95> <AD95> <74E1> <AD96> <AD96> <74E5> <AD97> <AD9D> <74E7> <AD9E> <ADA0> <74F0> <ADA1> <ADFE> <E11A> <AE40> <AE40> <74F3> <AE41> <AE41> <74F5> <AE42> <AE48> <74F8> <AE49> <AE4C> <7500> endbfrange 100 beginbfrange <AE4D> <AE54> <7505> <AE55> <AE55> <750E> <AE56> <AE56> <7510> <AE57> <AE57> <7512> <AE58> <AE5B> <7514> <AE5C> <AE5C> <751B> <AE5D> <AE5E> <751D> <AE5F> <AE63> <7520> <AE64> <AE65> <7526> <AE66> <AE66> <752A> <AE67> <AE67> <752E> <AE68> <AE68> <7534> <AE69> <AE69> <7536> <AE6A> <AE6A> <7539> <AE6B> <AE6C> <753C> <AE6D> <AE6D> <753F> <AE6E> <AE71> <7541> <AE72> <AE73> <7546> <AE74> <AE75> <7549> <AE76> <AE76> <754D> <AE77> <AE7A> <7550> <AE7B> <AE7E> <7555> <AE80> <AE87> <755D> <AE88> <AE8A> <7567> <AE8B> <AE91> <756B> <AE92> <AE92> <7573> <AE93> <AE95> <7575> <AE96> <AE9A> <757A> <AE9B> <AE9D> <7580> <AE9E> <AE9F> <7584> <AEA0> <AEA0> <7587> <AEA1> <AEFE> <E178> <AF40> <AF42> <7588> <AF43> <AF45> <758C> <AF46> <AF46> <7590> <AF47> <AF47> <7593> <AF48> <AF48> <7595> <AF49> <AF49> <7598> <AF4A> <AF4B> <759B> <AF4C> <AF4C> <759E> <AF4D> <AF4D> <75A2> <AF4E> <AF52> <75A6> <AF53> <AF53> <75AD> <AF54> <AF55> <75B6> <AF56> <AF57> <75BA> <AF58> <AF5A> <75BF> <AF5B> <AF5B> <75C6> <AF5C> <AF5D> <75CB> <AF5E> <AF61> <75CE> <AF62> <AF62> <75D3> <AF63> <AF63> <75D7> <AF64> <AF65> <75D9> <AF66> <AF67> <75DC> <AF68> <AF6A> <75DF> <AF6B> <AF6B> <75E5> <AF6C> <AF6C> <75E9> <AF6D> <AF70> <75EC> <AF71> <AF72> <75F2> <AF73> <AF76> <75F5> <AF77> <AF78> <75FA> <AF79> <AF7A> <75FD> <AF7B> <AF7B> <7602> <AF7C> <AF7C> <7604> <AF7D> <AF7E> <7606> <AF80> <AF81> <7608> <AF82> <AF82> <760B> <AF83> <AF85> <760D> <AF86> <AF89> <7611> <AF8A> <AF8A> <7616> <AF8B> <AF8B> <761A> <AF8C> <AF8E> <761C> <AF8F> <AF8F> <7621> <AF90> <AF90> <7623> <AF91> <AF92> <7627> <AF93> <AF93> <762C> <AF94> <AF95> <762E> <AF96> <AF97> <7631> <AF98> <AF99> <7636> <AF9A> <AF9C> <7639> <AF9D> <AF9D> <763D> <AF9E> <AF9F> <7641> <AFA0> <AFA0> <7644> <AFA1> <AFFE> <E1D6> <B040> <B046> <7645> <B047> <B04C> <764E> <B04D> <B04D> <7655> <B04E> <B052> <7657> <B053> <B053> <765D> <B054> <B057> <765F> <B058> <B05E> <7664> <B05F> <B061> <766C> <B062> <B069> <7670> <B06A> <B06B> <7679> <B06C> <B06C> <767C> <B06D> <B06F> <767F> <B070> <B070> <7683> <B071> <B071> <7685> <B072> <B073> <7689> <B074> <B075> <768C> <B076> <B077> <768F> endbfrange 100 beginbfrange <B078> <B078> <7692> <B079> <B07A> <7694> <B07B> <B07C> <7697> <B07D> <B07E> <769A> <B080> <B087> <769C> <B088> <B090> <76A5> <B091> <B092> <76AF> <B093> <B093> <76B3> <B094> <B09D> <76B5> <B09E> <B09F> <76C0> <B0A0> <B0A0> <76C3> <B0A1> <B0A1> <554A> <B0A2> <B0A2> <963F> <B0A3> <B0A3> <57C3> <B0A4> <B0A4> <6328> <B0A5> <B0A5> <54CE> <B0A6> <B0A6> <5509> <B0A7> <B0A7> <54C0> <B0A8> <B0A8> <7691> <B0A9> <B0A9> <764C> <B0AA> <B0AA> <853C> <B0AB> <B0AB> <77EE> <B0AC> <B0AC> <827E> <B0AD> <B0AD> <788D> <B0AE> <B0AE> <7231> <B0AF> <B0AF> <9698> <B0B0> <B0B0> <978D> <B0B1> <B0B1> <6C28> <B0B2> <B0B2> <5B89> <B0B3> <B0B3> <4FFA> <B0B4> <B0B4> <6309> <B0B5> <B0B5> <6697> <B0B6> <B0B6> <5CB8> <B0B7> <B0B7> <80FA> <B0B8> <B0B8> <6848> <B0B9> <B0B9> <80AE> <B0BA> <B0BA> <6602> <B0BB> <B0BB> <76CE> <B0BC> <B0BC> <51F9> <B0BD> <B0BD> <6556> <B0BE> <B0BE> <71AC> <B0BF> <B0BF> <7FF1> <B0C0> <B0C0> <8884> <B0C1> <B0C1> <50B2> <B0C2> <B0C2> <5965> <B0C3> <B0C3> <61CA> <B0C4> <B0C4> <6FB3> <B0C5> <B0C5> <82AD> <B0C6> <B0C6> <634C> <B0C7> <B0C7> <6252> <B0C8> <B0C8> <53ED> <B0C9> <B0C9> <5427> <B0CA> <B0CA> <7B06> <B0CB> <B0CB> <516B> <B0CC> <B0CC> <75A4> <B0CD> <B0CD> <5DF4> <B0CE> <B0CE> <62D4> <B0CF> <B0CF> <8DCB> <B0D0> <B0D0> <9776> <B0D1> <B0D1> <628A> <B0D2> <B0D2> <8019> <B0D3> <B0D3> <575D> <B0D4> <B0D4> <9738> <B0D5> <B0D5> <7F62> <B0D6> <B0D6> <7238> <B0D7> <B0D7> <767D> <B0D8> <B0D8> <67CF> <B0D9> <B0D9> <767E> <B0DA> <B0DA> <6446> <B0DB> <B0DB> <4F70> <B0DC> <B0DC> <8D25> <B0DD> <B0DD> <62DC> <B0DE> <B0DE> <7A17> <B0DF> <B0DF> <6591> <B0E0> <B0E0> <73ED> <B0E1> <B0E1> <642C> <B0E2> <B0E2> <6273> <B0E3> <B0E3> <822C> <B0E4> <B0E4> <9881> <B0E5> <B0E5> <677F> <B0E6> <B0E6> <7248> <B0E7> <B0E7> <626E> <B0E8> <B0E8> <62CC> <B0E9> <B0E9> <4F34> <B0EA> <B0EA> <74E3> <B0EB> <B0EB> <534A> <B0EC> <B0EC> <529E> <B0ED> <B0ED> <7ECA> <B0EE> <B0EE> <90A6> <B0EF> <B0EF> <5E2E> <B0F0> <B0F0> <6886> <B0F1> <B0F1> <699C> <B0F2> <B0F2> <8180> <B0F3> <B0F3> <7ED1> <B0F4> <B0F4> <68D2> <B0F5> <B0F5> <78C5> <B0F6> <B0F6> <868C> <B0F7> <B0F7> <9551> <B0F8> <B0F8> <508D> <B0F9> <B0F9> <8C24> endbfrange 100 beginbfrange <B0FA> <B0FA> <82DE> <B0FB> <B0FB> <80DE> <B0FC> <B0FC> <5305> <B0FD> <B0FD> <8912> <B0FE> <B0FE> <5265> <B140> <B140> <76C4> <B141> <B141> <76C7> <B142> <B142> <76C9> <B143> <B144> <76CB> <B145> <B145> <76D3> <B146> <B146> <76D5> <B147> <B148> <76D9> <B149> <B14B> <76DC> <B14C> <B150> <76E0> <B151> <B158> <76E6> <B159> <B159> <76F0> <B15A> <B15A> <76F3> <B15B> <B15D> <76F5> <B15E> <B15F> <76FA> <B160> <B160> <76FD> <B161> <B162> <76FF> <B163> <B164> <7702> <B165> <B166> <7705> <B167> <B167> <770A> <B168> <B168> <770C> <B169> <B173> <770E> <B174> <B177> <771B> <B178> <B178> <7721> <B179> <B17B> <7723> <B17C> <B17C> <7727> <B17D> <B17E> <772A> <B180> <B180> <772C> <B181> <B181> <772E> <B182> <B186> <7730> <B187> <B187> <7739> <B188> <B188> <773B> <B189> <B18B> <773D> <B18C> <B18C> <7742> <B18D> <B18F> <7744> <B190> <B197> <7748> <B198> <B19F> <7752> <B1A0> <B1A0> <775C> <B1A1> <B1A1> <8584> <B1A2> <B1A2> <96F9> <B1A3> <B1A3> <4FDD> <B1A4> <B1A4> <5821> <B1A5> <B1A5> <9971> <B1A6> <B1A6> <5B9D> <B1A7> <B1A7> <62B1> <B1A8> <B1A8> <62A5> <B1A9> <B1A9> <66B4> <B1AA> <B1AA> <8C79> <B1AB> <B1AB> <9C8D> <B1AC> <B1AC> <7206> <B1AD> <B1AD> <676F> <B1AE> <B1AE> <7891> <B1AF> <B1AF> <60B2> <B1B0> <B1B0> <5351> <B1B1> <B1B1> <5317> <B1B2> <B1B2> <8F88> <B1B3> <B1B3> <80CC> <B1B4> <B1B4> <8D1D> <B1B5> <B1B5> <94A1> <B1B6> <B1B6> <500D> <B1B7> <B1B7> <72C8> <B1B8> <B1B8> <5907> <B1B9> <B1B9> <60EB> <B1BA> <B1BA> <7119> <B1BB> <B1BB> <88AB> <B1BC> <B1BC> <5954> <B1BD> <B1BD> <82EF> <B1BE> <B1BE> <672C> <B1BF> <B1BF> <7B28> <B1C0> <B1C0> <5D29> <B1C1> <B1C1> <7EF7> <B1C2> <B1C2> <752D> <B1C3> <B1C3> <6CF5> <B1C4> <B1C4> <8E66> <B1C5> <B1C5> <8FF8> <B1C6> <B1C6> <903C> <B1C7> <B1C7> <9F3B> <B1C8> <B1C8> <6BD4> <B1C9> <B1C9> <9119> <B1CA> <B1CA> <7B14> <B1CB> <B1CB> <5F7C> <B1CC> <B1CC> <78A7> <B1CD> <B1CD> <84D6> <B1CE> <B1CE> <853D> <B1CF> <B1CF> <6BD5> <B1D0> <B1D0> <6BD9> <B1D1> <B1D1> <6BD6> <B1D2> <B1D2> <5E01> <B1D3> <B1D3> <5E87> <B1D4> <B1D4> <75F9> <B1D5> <B1D5> <95ED> <B1D6> <B1D6> <655D> <B1D7> <B1D7> <5F0A> <B1D8> <B1D8> <5FC5> <B1D9> <B1D9> <8F9F> <B1DA> <B1DA> <58C1> endbfrange 100 beginbfrange <B1DB> <B1DB> <81C2> <B1DC> <B1DC> <907F> <B1DD> <B1DD> <965B> <B1DE> <B1DE> <97AD> <B1DF> <B1DF> <8FB9> <B1E0> <B1E0> <7F16> <B1E1> <B1E1> <8D2C> <B1E2> <B1E2> <6241> <B1E3> <B1E3> <4FBF> <B1E4> <B1E4> <53D8> <B1E5> <B1E5> <535E> <B1E6> <B1E7> <8FA8> <B1E8> <B1E8> <8FAB> <B1E9> <B1E9> <904D> <B1EA> <B1EA> <6807> <B1EB> <B1EB> <5F6A> <B1EC> <B1EC> <8198> <B1ED> <B1ED> <8868> <B1EE> <B1EE> <9CD6> <B1EF> <B1EF> <618B> <B1F0> <B1F0> <522B> <B1F1> <B1F1> <762A> <B1F2> <B1F2> <5F6C> <B1F3> <B1F3> <658C> <B1F4> <B1F4> <6FD2> <B1F5> <B1F5> <6EE8> <B1F6> <B1F6> <5BBE> <B1F7> <B1F7> <6448> <B1F8> <B1F8> <5175> <B1F9> <B1F9> <51B0> <B1FA> <B1FA> <67C4> <B1FB> <B1FB> <4E19> <B1FC> <B1FC> <79C9> <B1FD> <B1FD> <997C> <B1FE> <B1FE> <70B3> <B240> <B243> <775D> <B244> <B244> <7764> <B245> <B245> <7767> <B246> <B247> <7769> <B248> <B253> <776D> <B254> <B256> <777A> <B257> <B259> <7781> <B25A> <B25F> <7786> <B260> <B261> <778F> <B262> <B26D> <7793> <B26E> <B26E> <77A1> <B26F> <B270> <77A3> <B271> <B271> <77A6> <B272> <B272> <77A8> <B273> <B273> <77AB> <B274> <B276> <77AD> <B277> <B278> <77B1> <B279> <B279> <77B4> <B27A> <B27E> <77B6> <B280> <B280> <77BC> <B281> <B281> <77BE> <B282> <B28E> <77C0> <B28F> <B297> <77CE> <B298> <B29A> <77D8> <B29B> <B29F> <77DD> <B2A0> <B2A0> <77E4> <B2A1> <B2A1> <75C5> <B2A2> <B2A2> <5E76> <B2A3> <B2A3> <73BB> <B2A4> <B2A4> <83E0> <B2A5> <B2A5> <64AD> <B2A6> <B2A6> <62E8> <B2A7> <B2A7> <94B5> <B2A8> <B2A8> <6CE2> <B2A9> <B2A9> <535A> <B2AA> <B2AA> <52C3> <B2AB> <B2AB> <640F> <B2AC> <B2AC> <94C2> <B2AD> <B2AD> <7B94> <B2AE> <B2AE> <4F2F> <B2AF> <B2AF> <5E1B> <B2B0> <B2B0> <8236> <B2B1> <B2B1> <8116> <B2B2> <B2B2> <818A> <B2B3> <B2B3> <6E24> <B2B4> <B2B4> <6CCA> <B2B5> <B2B5> <9A73> <B2B6> <B2B6> <6355> <B2B7> <B2B7> <535C> <B2B8> <B2B8> <54FA> <B2B9> <B2B9> <8865> <B2BA> <B2BA> <57E0> <B2BB> <B2BB> <4E0D> <B2BC> <B2BC> <5E03> <B2BD> <B2BD> <6B65> <B2BE> <B2BE> <7C3F> <B2BF> <B2BF> <90E8> <B2C0> <B2C0> <6016> <B2C1> <B2C1> <64E6> <B2C2> <B2C2> <731C> <B2C3> <B2C3> <88C1> <B2C4> <B2C4> <6750> <B2C5> <B2C5> <624D> <B2C6> <B2C6> <8D22> <B2C7> <B2C7> <776C> endbfrange 100 beginbfrange <B2C8> <B2C8> <8E29> <B2C9> <B2C9> <91C7> <B2CA> <B2CA> <5F69> <B2CB> <B2CB> <83DC> <B2CC> <B2CC> <8521> <B2CD> <B2CD> <9910> <B2CE> <B2CE> <53C2> <B2CF> <B2CF> <8695> <B2D0> <B2D0> <6B8B> <B2D1> <B2D1> <60ED> <B2D2> <B2D2> <60E8> <B2D3> <B2D3> <707F> <B2D4> <B2D4> <82CD> <B2D5> <B2D5> <8231> <B2D6> <B2D6> <4ED3> <B2D7> <B2D7> <6CA7> <B2D8> <B2D8> <85CF> <B2D9> <B2D9> <64CD> <B2DA> <B2DA> <7CD9> <B2DB> <B2DB> <69FD> <B2DC> <B2DC> <66F9> <B2DD> <B2DD> <8349> <B2DE> <B2DE> <5395> <B2DF> <B2DF> <7B56> <B2E0> <B2E0> <4FA7> <B2E1> <B2E1> <518C> <B2E2> <B2E2> <6D4B> <B2E3> <B2E3> <5C42> <B2E4> <B2E4> <8E6D> <B2E5> <B2E5> <63D2> <B2E6> <B2E6> <53C9> <B2E7> <B2E7> <832C> <B2E8> <B2E8> <8336> <B2E9> <B2E9> <67E5> <B2EA> <B2EA> <78B4> <B2EB> <B2EB> <643D> <B2EC> <B2EC> <5BDF> <B2ED> <B2ED> <5C94> <B2EE> <B2EE> <5DEE> <B2EF> <B2EF> <8BE7> <B2F0> <B2F0> <62C6> <B2F1> <B2F1> <67F4> <B2F2> <B2F2> <8C7A> <B2F3> <B2F3> <6400> <B2F4> <B2F4> <63BA> <B2F5> <B2F5> <8749> <B2F6> <B2F6> <998B> <B2F7> <B2F7> <8C17> <B2F8> <B2F8> <7F20> <B2F9> <B2F9> <94F2> <B2FA> <B2FA> <4EA7> <B2FB> <B2FB> <9610> <B2FC> <B2FC> <98A4> <B2FD> <B2FD> <660C> <B2FE> <B2FE> <7316> <B340> <B340> <77E6> <B341> <B341> <77E8> <B342> <B342> <77EA> <B343> <B346> <77EF> <B347> <B348> <77F4> <B349> <B349> <77F7> <B34A> <B34D> <77F9> <B34E> <B353> <7803> <B354> <B355> <780A> <B356> <B358> <780E> <B359> <B359> <7813> <B35A> <B35A> <7815> <B35B> <B35B> <7819> <B35C> <B35C> <781B> <B35D> <B35D> <781E> <B35E> <B360> <7820> <B361> <B361> <7824> <B362> <B362> <7828> <B363> <B364> <782A> <B365> <B366> <782E> <B367> <B369> <7831> <B36A> <B36B> <7835> <B36C> <B36C> <783D> <B36D> <B36D> <783F> <B36E> <B371> <7841> <B372> <B372> <7846> <B373> <B376> <7848> <B377> <B377> <784D> <B378> <B378> <784F> <B379> <B379> <7851> <B37A> <B37B> <7853> <B37C> <B37E> <7858> <B380> <B381> <785B> <B382> <B38D> <785E> <B38E> <B395> <786F> <B396> <B399> <7878> <B39A> <B3A0> <787D> <B3A1> <B3A1> <573A> <B3A2> <B3A2> <5C1D> <B3A3> <B3A3> <5E38> <B3A4> <B3A4> <957F> <B3A5> <B3A5> <507F> <B3A6> <B3A6> <80A0> <B3A7> <B3A7> <5382> <B3A8> <B3A8> <655E> endbfrange 100 beginbfrange <B3A9> <B3A9> <7545> <B3AA> <B3AA> <5531> <B3AB> <B3AB> <5021> <B3AC> <B3AC> <8D85> <B3AD> <B3AD> <6284> <B3AE> <B3AE> <949E> <B3AF> <B3AF> <671D> <B3B0> <B3B0> <5632> <B3B1> <B3B1> <6F6E> <B3B2> <B3B2> <5DE2> <B3B3> <B3B3> <5435> <B3B4> <B3B4> <7092> <B3B5> <B3B5> <8F66> <B3B6> <B3B6> <626F> <B3B7> <B3B7> <64A4> <B3B8> <B3B8> <63A3> <B3B9> <B3B9> <5F7B> <B3BA> <B3BA> <6F88> <B3BB> <B3BB> <90F4> <B3BC> <B3BC> <81E3> <B3BD> <B3BD> <8FB0> <B3BE> <B3BE> <5C18> <B3BF> <B3BF> <6668> <B3C0> <B3C0> <5FF1> <B3C1> <B3C1> <6C89> <B3C2> <B3C2> <9648> <B3C3> <B3C3> <8D81> <B3C4> <B3C4> <886C> <B3C5> <B3C5> <6491> <B3C6> <B3C6> <79F0> <B3C7> <B3C7> <57CE> <B3C8> <B3C8> <6A59> <B3C9> <B3C9> <6210> <B3CA> <B3CA> <5448> <B3CB> <B3CB> <4E58> <B3CC> <B3CC> <7A0B> <B3CD> <B3CD> <60E9> <B3CE> <B3CE> <6F84> <B3CF> <B3CF> <8BDA> <B3D0> <B3D0> <627F> <B3D1> <B3D1> <901E> <B3D2> <B3D2> <9A8B> <B3D3> <B3D3> <79E4> <B3D4> <B3D4> <5403> <B3D5> <B3D5> <75F4> <B3D6> <B3D6> <6301> <B3D7> <B3D7> <5319> <B3D8> <B3D8> <6C60> <B3D9> <B3D9> <8FDF> <B3DA> <B3DA> <5F1B> <B3DB> <B3DB> <9A70> <B3DC> <B3DC> <803B> <B3DD> <B3DD> <9F7F> <B3DE> <B3DE> <4F88> <B3DF> <B3DF> <5C3A> <B3E0> <B3E0> <8D64> <B3E1> <B3E1> <7FC5> <B3E2> <B3E2> <65A5> <B3E3> <B3E3> <70BD> <B3E4> <B3E4> <5145> <B3E5> <B3E5> <51B2> <B3E6> <B3E6> <866B> <B3E7> <B3E7> <5D07> <B3E8> <B3E8> <5BA0> <B3E9> <B3E9> <62BD> <B3EA> <B3EA> <916C> <B3EB> <B3EB> <7574> <B3EC> <B3EC> <8E0C> <B3ED> <B3ED> <7A20> <B3EE> <B3EE> <6101> <B3EF> <B3EF> <7B79> <B3F0> <B3F0> <4EC7> <B3F1> <B3F1> <7EF8> <B3F2> <B3F2> <7785> <B3F3> <B3F3> <4E11> <B3F4> <B3F4> <81ED> <B3F5> <B3F5> <521D> <B3F6> <B3F6> <51FA> <B3F7> <B3F7> <6A71> <B3F8> <B3F8> <53A8> <B3F9> <B3F9> <8E87> <B3FA> <B3FA> <9504> <B3FB> <B3FB> <96CF> <B3FC> <B3FC> <6EC1> <B3FD> <B3FD> <9664> <B3FE> <B3FE> <695A> <B440> <B442> <7884> <B443> <B443> <7888> <B444> <B445> <788A> <B446> <B447> <788F> <B448> <B448> <7892> <B449> <B44B> <7894> <B44C> <B44C> <7899> <B44D> <B44E> <789D> <B44F> <B44F> <78A0> <B450> <B450> <78A2> <B451> <B451> <78A4> <B452> <B452> <78A6> <B453> <B45A> <78A8> <B45B> <B45E> <78B5> endbfrange 100 beginbfrange <B45F> <B462> <78BA> <B463> <B464> <78BF> <B465> <B467> <78C2> <B468> <B46A> <78C6> <B46B> <B46E> <78CC> <B46F> <B471> <78D1> <B472> <B474> <78D6> <B475> <B47E> <78DA> <B480> <B483> <78E4> <B484> <B486> <78E9> <B487> <B48B> <78ED> <B48C> <B48C> <78F3> <B48D> <B48E> <78F5> <B48F> <B490> <78F8> <B491> <B496> <78FB> <B497> <B499> <7902> <B49A> <B4A0> <7906> <B4A1> <B4A1> <7840> <B4A2> <B4A2> <50A8> <B4A3> <B4A3> <77D7> <B4A4> <B4A4> <6410> <B4A5> <B4A5> <89E6> <B4A6> <B4A6> <5904> <B4A7> <B4A7> <63E3> <B4A8> <B4A8> <5DDD> <B4A9> <B4A9> <7A7F> <B4AA> <B4AA> <693D> <B4AB> <B4AB> <4F20> <B4AC> <B4AC> <8239> <B4AD> <B4AD> <5598> <B4AE> <B4AE> <4E32> <B4AF> <B4AF> <75AE> <B4B0> <B4B0> <7A97> <B4B1> <B4B1> <5E62> <B4B2> <B4B2> <5E8A> <B4B3> <B4B3> <95EF> <B4B4> <B4B4> <521B> <B4B5> <B4B5> <5439> <B4B6> <B4B6> <708A> <B4B7> <B4B7> <6376> <B4B8> <B4B8> <9524> <B4B9> <B4B9> <5782> <B4BA> <B4BA> <6625> <B4BB> <B4BB> <693F> <B4BC> <B4BC> <9187> <B4BD> <B4BD> <5507> <B4BE> <B4BE> <6DF3> <B4BF> <B4BF> <7EAF> <B4C0> <B4C0> <8822> <B4C1> <B4C1> <6233> <B4C2> <B4C2> <7EF0> <B4C3> <B4C3> <75B5> <B4C4> <B4C4> <8328> <B4C5> <B4C5> <78C1> <B4C6> <B4C6> <96CC> <B4C7> <B4C7> <8F9E> <B4C8> <B4C8> <6148> <B4C9> <B4C9> <74F7> <B4CA> <B4CA> <8BCD> <B4CB> <B4CB> <6B64> <B4CC> <B4CC> <523A> <B4CD> <B4CD> <8D50> <B4CE> <B4CE> <6B21> <B4CF> <B4CF> <806A> <B4D0> <B4D0> <8471> <B4D1> <B4D1> <56F1> <B4D2> <B4D2> <5306> <B4D3> <B4D3> <4ECE> <B4D4> <B4D4> <4E1B> <B4D5> <B4D5> <51D1> <B4D6> <B4D6> <7C97> <B4D7> <B4D7> <918B> <B4D8> <B4D8> <7C07> <B4D9> <B4D9> <4FC3> <B4DA> <B4DA> <8E7F> <B4DB> <B4DB> <7BE1> <B4DC> <B4DC> <7A9C> <B4DD> <B4DD> <6467> <B4DE> <B4DE> <5D14> <B4DF> <B4DF> <50AC> <B4E0> <B4E0> <8106> <B4E1> <B4E1> <7601> <B4E2> <B4E2> <7CB9> <B4E3> <B4E3> <6DEC> <B4E4> <B4E4> <7FE0> <B4E5> <B4E5> <6751> <B4E6> <B4E6> <5B58> <B4E7> <B4E7> <5BF8> <B4E8> <B4E8> <78CB> <B4E9> <B4E9> <64AE> <B4EA> <B4EA> <6413> <B4EB> <B4EB> <63AA> <B4EC> <B4EC> <632B> <B4ED> <B4ED> <9519> <B4EE> <B4EE> <642D> <B4EF> <B4EF> <8FBE> <B4F0> <B4F0> <7B54> <B4F1> <B4F1> <7629> <B4F2> <B4F2> <6253> <B4F3> <B4F3> <5927> endbfrange 100 beginbfrange <B4F4> <B4F4> <5446> <B4F5> <B4F5> <6B79> <B4F6> <B4F6> <50A3> <B4F7> <B4F7> <6234> <B4F8> <B4F8> <5E26> <B4F9> <B4F9> <6B86> <B4FA> <B4FA> <4EE3> <B4FB> <B4FB> <8D37> <B4FC> <B4FC> <888B> <B4FD> <B4FD> <5F85> <B4FE> <B4FE> <902E> <B540> <B545> <790D> <B546> <B54F> <7914> <B550> <B554> <791F> <B555> <B563> <7925> <B564> <B568> <7935> <B569> <B569> <793D> <B56A> <B56A> <793F> <B56B> <B56E> <7942> <B56F> <B56F> <7947> <B570> <B578> <794A> <B579> <B57A> <7954> <B57B> <B57C> <7958> <B57D> <B57D> <7961> <B57E> <B57E> <7963> <B580> <B580> <7964> <B581> <B581> <7966> <B582> <B585> <7969> <B586> <B586> <796E> <B587> <B58D> <7970> <B58E> <B58E> <7979> <B58F> <B593> <797B> <B594> <B595> <7982> <B596> <B599> <7986> <B59A> <B59D> <798B> <B59E> <B5A0> <7990> <B5A1> <B5A1> <6020> <B5A2> <B5A2> <803D> <B5A3> <B5A3> <62C5> <B5A4> <B5A4> <4E39> <B5A5> <B5A5> <5355> <B5A6> <B5A6> <90F8> <B5A7> <B5A7> <63B8> <B5A8> <B5A8> <80C6> <B5A9> <B5A9> <65E6> <B5AA> <B5AA> <6C2E> <B5AB> <B5AB> <4F46> <B5AC> <B5AC> <60EE> <B5AD> <B5AD> <6DE1> <B5AE> <B5AE> <8BDE> <B5AF> <B5AF> <5F39> <B5B0> <B5B0> <86CB> <B5B1> <B5B1> <5F53> <B5B2> <B5B2> <6321> <B5B3> <B5B3> <515A> <B5B4> <B5B4> <8361> <B5B5> <B5B5> <6863> <B5B6> <B5B6> <5200> <B5B7> <B5B7> <6363> <B5B8> <B5B8> <8E48> <B5B9> <B5B9> <5012> <B5BA> <B5BA> <5C9B> <B5BB> <B5BB> <7977> <B5BC> <B5BC> <5BFC> <B5BD> <B5BD> <5230> <B5BE> <B5BE> <7A3B> <B5BF> <B5BF> <60BC> <B5C0> <B5C0> <9053> <B5C1> <B5C1> <76D7> <B5C2> <B5C2> <5FB7> <B5C3> <B5C3> <5F97> <B5C4> <B5C4> <7684> <B5C5> <B5C5> <8E6C> <B5C6> <B5C6> <706F> <B5C7> <B5C7> <767B> <B5C8> <B5C8> <7B49> <B5C9> <B5C9> <77AA> <B5CA> <B5CA> <51F3> <B5CB> <B5CB> <9093> <B5CC> <B5CC> <5824> <B5CD> <B5CD> <4F4E> <B5CE> <B5CE> <6EF4> <B5CF> <B5CF> <8FEA> <B5D0> <B5D0> <654C> <B5D1> <B5D1> <7B1B> <B5D2> <B5D2> <72C4> <B5D3> <B5D3> <6DA4> <B5D4> <B5D4> <7FDF> <B5D5> <B5D5> <5AE1> <B5D6> <B5D6> <62B5> <B5D7> <B5D7> <5E95> <B5D8> <B5D8> <5730> <B5D9> <B5D9> <8482> <B5DA> <B5DA> <7B2C> <B5DB> <B5DB> <5E1D> <B5DC> <B5DC> <5F1F> <B5DD> <B5DD> <9012> <B5DE> <B5DE> <7F14> <B5DF> <B5DF> <98A0> <B5E0> <B5E0> <6382> endbfrange 100 beginbfrange <B5E1> <B5E1> <6EC7> <B5E2> <B5E2> <7898> <B5E3> <B5E3> <70B9> <B5E4> <B5E4> <5178> <B5E5> <B5E5> <975B> <B5E6> <B5E6> <57AB> <B5E7> <B5E7> <7535> <B5E8> <B5E8> <4F43> <B5E9> <B5E9> <7538> <B5EA> <B5EA> <5E97> <B5EB> <B5EB> <60E6> <B5EC> <B5EC> <5960> <B5ED> <B5ED> <6DC0> <B5EE> <B5EE> <6BBF> <B5EF> <B5EF> <7889> <B5F0> <B5F0> <53FC> <B5F1> <B5F1> <96D5> <B5F2> <B5F2> <51CB> <B5F3> <B5F3> <5201> <B5F4> <B5F4> <6389> <B5F5> <B5F5> <540A> <B5F6> <B5F6> <9493> <B5F7> <B5F7> <8C03> <B5F8> <B5F8> <8DCC> <B5F9> <B5F9> <7239> <B5FA> <B5FA> <789F> <B5FB> <B5FB> <8776> <B5FC> <B5FC> <8FED> <B5FD> <B5FD> <8C0D> <B5FE> <B5FE> <53E0> <B640> <B646> <7993> <B647> <B652> <799B> <B653> <B65D> <79A8> <B65E> <B662> <79B4> <B663> <B663> <79BC> <B664> <B664> <79BF> <B665> <B665> <79C2> <B666> <B667> <79C4> <B668> <B669> <79C7> <B66A> <B66A> <79CA> <B66B> <B66B> <79CC> <B66C> <B66E> <79CE> <B66F> <B670> <79D3> <B671> <B672> <79D6> <B673> <B678> <79D9> <B679> <B67B> <79E0> <B67C> <B67C> <79E5> <B67D> <B67D> <79E8> <B67E> <B67E> <79EA> <B680> <B680> <79EC> <B681> <B681> <79EE> <B682> <B688> <79F1> <B689> <B68A> <79F9> <B68B> <B68B> <79FC> <B68C> <B68D> <79FE> <B68E> <B68E> <7A01> <B68F> <B690> <7A04> <B691> <B694> <7A07> <B695> <B695> <7A0C> <B696> <B69A> <7A0F> <B69B> <B69C> <7A15> <B69D> <B69E> <7A18> <B69F> <B6A0> <7A1B> <B6A1> <B6A1> <4E01> <B6A2> <B6A2> <76EF> <B6A3> <B6A3> <53EE> <B6A4> <B6A4> <9489> <B6A5> <B6A5> <9876> <B6A6> <B6A6> <9F0E> <B6A7> <B6A7> <952D> <B6A8> <B6A8> <5B9A> <B6A9> <B6A9> <8BA2> <B6AA> <B6AA> <4E22> <B6AB> <B6AB> <4E1C> <B6AC> <B6AC> <51AC> <B6AD> <B6AD> <8463> <B6AE> <B6AE> <61C2> <B6AF> <B6AF> <52A8> <B6B0> <B6B0> <680B> <B6B1> <B6B1> <4F97> <B6B2> <B6B2> <606B> <B6B3> <B6B3> <51BB> <B6B4> <B6B4> <6D1E> <B6B5> <B6B5> <515C> <B6B6> <B6B6> <6296> <B6B7> <B6B7> <6597> <B6B8> <B6B8> <9661> <B6B9> <B6B9> <8C46> <B6BA> <B6BA> <9017> <B6BB> <B6BB> <75D8> <B6BC> <B6BC> <90FD> <B6BD> <B6BD> <7763> <B6BE> <B6BE> <6BD2> <B6BF> <B6BF> <728A> <B6C0> <B6C0> <72EC> <B6C1> <B6C1> <8BFB> <B6C2> <B6C2> <5835> <B6C3> <B6C3> <7779> <B6C4> <B6C4> <8D4C> <B6C5> <B6C5> <675C> endbfrange 100 beginbfrange <B6C6> <B6C6> <9540> <B6C7> <B6C7> <809A> <B6C8> <B6C8> <5EA6> <B6C9> <B6C9> <6E21> <B6CA> <B6CA> <5992> <B6CB> <B6CB> <7AEF> <B6CC> <B6CC> <77ED> <B6CD> <B6CD> <953B> <B6CE> <B6CE> <6BB5> <B6CF> <B6CF> <65AD> <B6D0> <B6D0> <7F0E> <B6D1> <B6D1> <5806> <B6D2> <B6D2> <5151> <B6D3> <B6D3> <961F> <B6D4> <B6D4> <5BF9> <B6D5> <B6D5> <58A9> <B6D6> <B6D6> <5428> <B6D7> <B6D7> <8E72> <B6D8> <B6D8> <6566> <B6D9> <B6D9> <987F> <B6DA> <B6DA> <56E4> <B6DB> <B6DB> <949D> <B6DC> <B6DC> <76FE> <B6DD> <B6DD> <9041> <B6DE> <B6DE> <6387> <B6DF> <B6DF> <54C6> <B6E0> <B6E0> <591A> <B6E1> <B6E1> <593A> <B6E2> <B6E2> <579B> <B6E3> <B6E3> <8EB2> <B6E4> <B6E4> <6735> <B6E5> <B6E5> <8DFA> <B6E6> <B6E6> <8235> <B6E7> <B6E7> <5241> <B6E8> <B6E8> <60F0> <B6E9> <B6E9> <5815> <B6EA> <B6EA> <86FE> <B6EB> <B6EB> <5CE8> <B6EC> <B6EC> <9E45> <B6ED> <B6ED> <4FC4> <B6EE> <B6EE> <989D> <B6EF> <B6EF> <8BB9> <B6F0> <B6F0> <5A25> <B6F1> <B6F1> <6076> <B6F2> <B6F2> <5384> <B6F3> <B6F3> <627C> <B6F4> <B6F4> <904F> <B6F5> <B6F5> <9102> <B6F6> <B6F6> <997F> <B6F7> <B6F7> <6069> <B6F8> <B6F8> <800C> <B6F9> <B6F9> <513F> <B6FA> <B6FA> <8033> <B6FB> <B6FB> <5C14> <B6FC> <B6FC> <9975> <B6FD> <B6FD> <6D31> <B6FE> <B6FE> <4E8C> <B740> <B740> <7A1D> <B741> <B741> <7A1F> <B742> <B743> <7A21> <B744> <B752> <7A24> <B753> <B755> <7A34> <B756> <B756> <7A38> <B757> <B757> <7A3A> <B758> <B758> <7A3E> <B759> <B75E> <7A40> <B75F> <B768> <7A47> <B769> <B76D> <7A52> <B76E> <B77E> <7A58> <B780> <B786> <7A69> <B787> <B789> <7A71> <B78A> <B78A> <7A75> <B78B> <B78E> <7A7B> <B78F> <B78F> <7A82> <B790> <B790> <7A85> <B791> <B791> <7A87> <B792> <B795> <7A89> <B796> <B798> <7A8E> <B799> <B79A> <7A93> <B79B> <B79D> <7A99> <B79E> <B79E> <7A9E> <B79F> <B7A0> <7AA1> <B7A1> <B7A1> <8D30> <B7A2> <B7A2> <53D1> <B7A3> <B7A3> <7F5A> <B7A4> <B7A4> <7B4F> <B7A5> <B7A5> <4F10> <B7A6> <B7A6> <4E4F> <B7A7> <B7A7> <9600> <B7A8> <B7A8> <6CD5> <B7A9> <B7A9> <73D0> <B7AA> <B7AA> <85E9> <B7AB> <B7AB> <5E06> <B7AC> <B7AC> <756A> <B7AD> <B7AD> <7FFB> <B7AE> <B7AE> <6A0A> <B7AF> <B7AF> <77FE> <B7B0> <B7B0> <9492> <B7B1> <B7B1> <7E41> <B7B2> <B7B2> <51E1> endbfrange 100 beginbfrange <B7B3> <B7B3> <70E6> <B7B4> <B7B4> <53CD> <B7B5> <B7B5> <8FD4> <B7B6> <B7B6> <8303> <B7B7> <B7B7> <8D29> <B7B8> <B7B8> <72AF> <B7B9> <B7B9> <996D> <B7BA> <B7BA> <6CDB> <B7BB> <B7BB> <574A> <B7BC> <B7BC> <82B3> <B7BD> <B7BD> <65B9> <B7BE> <B7BE> <80AA> <B7BF> <B7BF> <623F> <B7C0> <B7C0> <9632> <B7C1> <B7C1> <59A8> <B7C2> <B7C2> <4EFF> <B7C3> <B7C3> <8BBF> <B7C4> <B7C4> <7EBA> <B7C5> <B7C5> <653E> <B7C6> <B7C6> <83F2> <B7C7> <B7C7> <975E> <B7C8> <B7C8> <5561> <B7C9> <B7C9> <98DE> <B7CA> <B7CA> <80A5> <B7CB> <B7CB> <532A> <B7CC> <B7CC> <8BFD> <B7CD> <B7CD> <5420> <B7CE> <B7CE> <80BA> <B7CF> <B7CF> <5E9F> <B7D0> <B7D0> <6CB8> <B7D1> <B7D1> <8D39> <B7D2> <B7D2> <82AC> <B7D3> <B7D3> <915A> <B7D4> <B7D4> <5429> <B7D5> <B7D5> <6C1B> <B7D6> <B7D6> <5206> <B7D7> <B7D7> <7EB7> <B7D8> <B7D8> <575F> <B7D9> <B7D9> <711A> <B7DA> <B7DA> <6C7E> <B7DB> <B7DB> <7C89> <B7DC> <B7DC> <594B> <B7DD> <B7DD> <4EFD> <B7DE> <B7DE> <5FFF> <B7DF> <B7DF> <6124> <B7E0> <B7E0> <7CAA> <B7E1> <B7E1> <4E30> <B7E2> <B7E2> <5C01> <B7E3> <B7E3> <67AB> <B7E4> <B7E4> <8702> <B7E5> <B7E5> <5CF0> <B7E6> <B7E6> <950B> <B7E7> <B7E7> <98CE> <B7E8> <B7E8> <75AF> <B7E9> <B7E9> <70FD> <B7EA> <B7EA> <9022> <B7EB> <B7EB> <51AF> <B7EC> <B7EC> <7F1D> <B7ED> <B7ED> <8BBD> <B7EE> <B7EE> <5949> <B7EF> <B7EF> <51E4> <B7F0> <B7F0> <4F5B> <B7F1> <B7F1> <5426> <B7F2> <B7F2> <592B> <B7F3> <B7F3> <6577> <B7F4> <B7F4> <80A4> <B7F5> <B7F5> <5B75> <B7F6> <B7F6> <6276> <B7F7> <B7F7> <62C2> <B7F8> <B7F8> <8F90> <B7F9> <B7F9> <5E45> <B7FA> <B7FA> <6C1F> <B7FB> <B7FB> <7B26> <B7FC> <B7FC> <4F0F> <B7FD> <B7FD> <4FD8> <B7FE> <B7FE> <670D> <B840> <B841> <7AA3> <B842> <B842> <7AA7> <B843> <B845> <7AA9> <B846> <B84A> <7AAE> <B84B> <B855> <7AB4> <B856> <B860> <7AC0> <B861> <B86A> <7ACC> <B86B> <B86C> <7AD7> <B86D> <B870> <7ADA> <B871> <B872> <7AE1> <B873> <B873> <7AE4> <B874> <B879> <7AE7> <B87A> <B87A> <7AEE> <B87B> <B87E> <7AF0> <B880> <B884> <7AF4> <B885> <B886> <7AFB> <B887> <B887> <7AFE> <B888> <B88A> <7B00> <B88B> <B88B> <7B05> <B88C> <B88C> <7B07> <B88D> <B88D> <7B09> <B88E> <B890> <7B0C> <B891> <B891> <7B10> <B892> <B893> <7B12> endbfrange 100 beginbfrange <B894> <B896> <7B16> <B897> <B897> <7B1A> <B898> <B899> <7B1C> <B89A> <B89A> <7B1F> <B89B> <B89D> <7B21> <B89E> <B89E> <7B27> <B89F> <B89F> <7B29> <B8A0> <B8A0> <7B2D> <B8A1> <B8A1> <6D6E> <B8A2> <B8A2> <6DAA> <B8A3> <B8A3> <798F> <B8A4> <B8A4> <88B1> <B8A5> <B8A5> <5F17> <B8A6> <B8A6> <752B> <B8A7> <B8A7> <629A> <B8A8> <B8A8> <8F85> <B8A9> <B8A9> <4FEF> <B8AA> <B8AA> <91DC> <B8AB> <B8AB> <65A7> <B8AC> <B8AC> <812F> <B8AD> <B8AD> <8151> <B8AE> <B8AE> <5E9C> <B8AF> <B8AF> <8150> <B8B0> <B8B0> <8D74> <B8B1> <B8B1> <526F> <B8B2> <B8B2> <8986> <B8B3> <B8B3> <8D4B> <B8B4> <B8B4> <590D> <B8B5> <B8B5> <5085> <B8B6> <B8B6> <4ED8> <B8B7> <B8B7> <961C> <B8B8> <B8B8> <7236> <B8B9> <B8B9> <8179> <B8BA> <B8BA> <8D1F> <B8BB> <B8BB> <5BCC> <B8BC> <B8BC> <8BA3> <B8BD> <B8BD> <9644> <B8BE> <B8BE> <5987> <B8BF> <B8BF> <7F1A> <B8C0> <B8C0> <5490> <B8C1> <B8C1> <5676> <B8C2> <B8C2> <560E> <B8C3> <B8C3> <8BE5> <B8C4> <B8C4> <6539> <B8C5> <B8C5> <6982> <B8C6> <B8C6> <9499> <B8C7> <B8C7> <76D6> <B8C8> <B8C8> <6E89> <B8C9> <B8C9> <5E72> <B8CA> <B8CA> <7518> <B8CB> <B8CB> <6746> <B8CC> <B8CC> <67D1> <B8CD> <B8CD> <7AFF> <B8CE> <B8CE> <809D> <B8CF> <B8CF> <8D76> <B8D0> <B8D0> <611F> <B8D1> <B8D1> <79C6> <B8D2> <B8D2> <6562> <B8D3> <B8D3> <8D63> <B8D4> <B8D4> <5188> <B8D5> <B8D5> <521A> <B8D6> <B8D6> <94A2> <B8D7> <B8D7> <7F38> <B8D8> <B8D8> <809B> <B8D9> <B8D9> <7EB2> <B8DA> <B8DA> <5C97> <B8DB> <B8DB> <6E2F> <B8DC> <B8DC> <6760> <B8DD> <B8DD> <7BD9> <B8DE> <B8DE> <768B> <B8DF> <B8DF> <9AD8> <B8E0> <B8E0> <818F> <B8E1> <B8E1> <7F94> <B8E2> <B8E2> <7CD5> <B8E3> <B8E3> <641E> <B8E4> <B8E4> <9550> <B8E5> <B8E5> <7A3F> <B8E6> <B8E6> <544A> <B8E7> <B8E7> <54E5> <B8E8> <B8E8> <6B4C> <B8E9> <B8E9> <6401> <B8EA> <B8EA> <6208> <B8EB> <B8EB> <9E3D> <B8EC> <B8EC> <80F3> <B8ED> <B8ED> <7599> <B8EE> <B8EE> <5272> <B8EF> <B8EF> <9769> <B8F0> <B8F0> <845B> <B8F1> <B8F1> <683C> <B8F2> <B8F2> <86E4> <B8F3> <B8F3> <9601> <B8F4> <B8F4> <9694> <B8F5> <B8F5> <94EC> <B8F6> <B8F6> <4E2A> <B8F7> <B8F7> <5404> <B8F8> <B8F8> <7ED9> <B8F9> <B8F9> <6839> <B8FA> <B8FA> <8DDF> <B8FB> <B8FB> <8015> <B8FC> <B8FC> <66F4> endbfrange 100 beginbfrange <B8FD> <B8FD> <5E9A> <B8FE> <B8FE> <7FB9> <B940> <B941> <7B2F> <B942> <B942> <7B32> <B943> <B946> <7B34> <B947> <B947> <7B39> <B948> <B948> <7B3B> <B949> <B949> <7B3D> <B94A> <B94F> <7B3F> <B950> <B950> <7B46> <B951> <B951> <7B48> <B952> <B952> <7B4A> <B953> <B954> <7B4D> <B955> <B955> <7B53> <B956> <B956> <7B55> <B957> <B957> <7B57> <B958> <B958> <7B59> <B959> <B959> <7B5C> <B95A> <B95B> <7B5E> <B95C> <B95C> <7B61> <B95D> <B967> <7B63> <B968> <B969> <7B6F> <B96A> <B96B> <7B73> <B96C> <B96C> <7B76> <B96D> <B96D> <7B78> <B96E> <B96E> <7B7A> <B96F> <B970> <7B7C> <B971> <B971> <7B7F> <B972> <B975> <7B81> <B976> <B97C> <7B86> <B97D> <B97E> <7B8E> <B980> <B982> <7B91> <B983> <B983> <7B96> <B984> <B987> <7B98> <B988> <B98A> <7B9E> <B98B> <B98D> <7BA3> <B98E> <B990> <7BAE> <B991> <B992> <7BB2> <B993> <B995> <7BB5> <B996> <B99D> <7BB9> <B99E> <B9A0> <7BC2> <B9A1> <B9A1> <57C2> <B9A2> <B9A2> <803F> <B9A3> <B9A3> <6897> <B9A4> <B9A4> <5DE5> <B9A5> <B9A5> <653B> <B9A6> <B9A6> <529F> <B9A7> <B9A7> <606D> <B9A8> <B9A8> <9F9A> <B9A9> <B9A9> <4F9B> <B9AA> <B9AA> <8EAC> <B9AB> <B9AB> <516C> <B9AC> <B9AC> <5BAB> <B9AD> <B9AD> <5F13> <B9AE> <B9AE> <5DE9> <B9AF> <B9AF> <6C5E> <B9B0> <B9B0> <62F1> <B9B1> <B9B1> <8D21> <B9B2> <B9B2> <5171> <B9B3> <B9B3> <94A9> <B9B4> <B9B4> <52FE> <B9B5> <B9B5> <6C9F> <B9B6> <B9B6> <82DF> <B9B7> <B9B7> <72D7> <B9B8> <B9B8> <57A2> <B9B9> <B9B9> <6784> <B9BA> <B9BA> <8D2D> <B9BB> <B9BB> <591F> <B9BC> <B9BC> <8F9C> <B9BD> <B9BD> <83C7> <B9BE> <B9BE> <5495> <B9BF> <B9BF> <7B8D> <B9C0> <B9C0> <4F30> <B9C1> <B9C1> <6CBD> <B9C2> <B9C2> <5B64> <B9C3> <B9C3> <59D1> <B9C4> <B9C4> <9F13> <B9C5> <B9C5> <53E4> <B9C6> <B9C6> <86CA> <B9C7> <B9C7> <9AA8> <B9C8> <B9C8> <8C37> <B9C9> <B9C9> <80A1> <B9CA> <B9CA> <6545> <B9CB> <B9CB> <987E> <B9CC> <B9CC> <56FA> <B9CD> <B9CD> <96C7> <B9CE> <B9CE> <522E> <B9CF> <B9CF> <74DC> <B9D0> <B9D0> <5250> <B9D1> <B9D1> <5BE1> <B9D2> <B9D2> <6302> <B9D3> <B9D3> <8902> <B9D4> <B9D4> <4E56> <B9D5> <B9D5> <62D0> <B9D6> <B9D6> <602A> <B9D7> <B9D7> <68FA> <B9D8> <B9D8> <5173> <B9D9> <B9D9> <5B98> <B9DA> <B9DA> <51A0> <B9DB> <B9DB> <89C2> endbfrange 100 beginbfrange <B9DC> <B9DC> <7BA1> <B9DD> <B9DD> <9986> <B9DE> <B9DE> <7F50> <B9DF> <B9DF> <60EF> <B9E0> <B9E0> <704C> <B9E1> <B9E1> <8D2F> <B9E2> <B9E2> <5149> <B9E3> <B9E3> <5E7F> <B9E4> <B9E4> <901B> <B9E5> <B9E5> <7470> <B9E6> <B9E6> <89C4> <B9E7> <B9E7> <572D> <B9E8> <B9E8> <7845> <B9E9> <B9E9> <5F52> <B9EA> <B9EA> <9F9F> <B9EB> <B9EB> <95FA> <B9EC> <B9EC> <8F68> <B9ED> <B9ED> <9B3C> <B9EE> <B9EE> <8BE1> <B9EF> <B9EF> <7678> <B9F0> <B9F0> <6842> <B9F1> <B9F1> <67DC> <B9F2> <B9F2> <8DEA> <B9F3> <B9F3> <8D35> <B9F4> <B9F4> <523D> <B9F5> <B9F5> <8F8A> <B9F6> <B9F6> <6EDA> <B9F7> <B9F7> <68CD> <B9F8> <B9F8> <9505> <B9F9> <B9F9> <90ED> <B9FA> <B9FA> <56FD> <B9FB> <B9FB> <679C> <B9FC> <B9FC> <88F9> <B9FD> <B9FD> <8FC7> <B9FE> <B9FE> <54C8> <BA40> <BA40> <7BC5> <BA41> <BA44> <7BC8> <BA45> <BA48> <7BCD> <BA49> <BA49> <7BD2> <BA4A> <BA4E> <7BD4> <BA4F> <BA50> <7BDB> <BA51> <BA53> <7BDE> <BA54> <BA56> <7BE2> <BA57> <BA59> <7BE7> <BA5A> <BA5C> <7BEB> <BA5D> <BA5E> <7BEF> <BA5F> <BA63> <7BF2> <BA64> <BA67> <7BF8> <BA68> <BA68> <7BFD> <BA69> <BA70> <7BFF> <BA71> <BA73> <7C08> <BA74> <BA75> <7C0D> <BA76> <BA7B> <7C10> <BA7C> <BA7E> <7C17> <BA80> <BA84> <7C1A> <BA85> <BA8A> <7C20> <BA8B> <BA8C> <7C28> <BA8D> <BA99> <7C2B> <BA9A> <BA9F> <7C39> <BAA0> <BAA0> <7C42> <BAA1> <BAA1> <9AB8> <BAA2> <BAA2> <5B69> <BAA3> <BAA3> <6D77> <BAA4> <BAA4> <6C26> <BAA5> <BAA5> <4EA5> <BAA6> <BAA6> <5BB3> <BAA7> <BAA7> <9A87> <BAA8> <BAA8> <9163> <BAA9> <BAA9> <61A8> <BAAA> <BAAA> <90AF> <BAAB> <BAAB> <97E9> <BAAC> <BAAC> <542B> <BAAD> <BAAD> <6DB5> <BAAE> <BAAE> <5BD2> <BAAF> <BAAF> <51FD> <BAB0> <BAB0> <558A> <BAB1> <BAB1> <7F55> <BAB2> <BAB2> <7FF0> <BAB3> <BAB3> <64BC> <BAB4> <BAB4> <634D> <BAB5> <BAB5> <65F1> <BAB6> <BAB6> <61BE> <BAB7> <BAB7> <608D> <BAB8> <BAB8> <710A> <BAB9> <BAB9> <6C57> <BABA> <BABA> <6C49> <BABB> <BABB> <592F> <BABC> <BABC> <676D> <BABD> <BABD> <822A> <BABE> <BABE> <58D5> <BABF> <BABF> <568E> <BAC0> <BAC0> <8C6A> <BAC1> <BAC1> <6BEB> <BAC2> <BAC2> <90DD> <BAC3> <BAC3> <597D> <BAC4> <BAC4> <8017> <BAC5> <BAC5> <53F7> <BAC6> <BAC6> <6D69> <BAC7> <BAC7> <5475> <BAC8> <BAC8> <559D> endbfrange 100 beginbfrange <BAC9> <BAC9> <8377> <BACA> <BACA> <83CF> <BACB> <BACB> <6838> <BACC> <BACC> <79BE> <BACD> <BACD> <548C> <BACE> <BACE> <4F55> <BACF> <BACF> <5408> <BAD0> <BAD0> <76D2> <BAD1> <BAD1> <8C89> <BAD2> <BAD2> <9602> <BAD3> <BAD3> <6CB3> <BAD4> <BAD4> <6DB8> <BAD5> <BAD5> <8D6B> <BAD6> <BAD6> <8910> <BAD7> <BAD7> <9E64> <BAD8> <BAD8> <8D3A> <BAD9> <BAD9> <563F> <BADA> <BADA> <9ED1> <BADB> <BADB> <75D5> <BADC> <BADC> <5F88> <BADD> <BADD> <72E0> <BADE> <BADE> <6068> <BADF> <BADF> <54FC> <BAE0> <BAE0> <4EA8> <BAE1> <BAE1> <6A2A> <BAE2> <BAE2> <8861> <BAE3> <BAE3> <6052> <BAE4> <BAE4> <8F70> <BAE5> <BAE5> <54C4> <BAE6> <BAE6> <70D8> <BAE7> <BAE7> <8679> <BAE8> <BAE8> <9E3F> <BAE9> <BAE9> <6D2A> <BAEA> <BAEA> <5B8F> <BAEB> <BAEB> <5F18> <BAEC> <BAEC> <7EA2> <BAED> <BAED> <5589> <BAEE> <BAEE> <4FAF> <BAEF> <BAEF> <7334> <BAF0> <BAF0> <543C> <BAF1> <BAF1> <539A> <BAF2> <BAF2> <5019> <BAF3> <BAF3> <540E> <BAF4> <BAF4> <547C> <BAF5> <BAF5> <4E4E> <BAF6> <BAF6> <5FFD> <BAF7> <BAF7> <745A> <BAF8> <BAF8> <58F6> <BAF9> <BAF9> <846B> <BAFA> <BAFA> <80E1> <BAFB> <BAFB> <8774> <BAFC> <BAFC> <72D0> <BAFD> <BAFD> <7CCA> <BAFE> <BAFE> <6E56> <BB40> <BB49> <7C43> <BB4A> <BB6E> <7C4E> <BB6F> <BB74> <7C75> <BB75> <BB7E> <7C7E> <BB80> <BB80> <7C88> <BB81> <BB87> <7C8A> <BB88> <BB89> <7C93> <BB8A> <BB8A> <7C96> <BB8B> <BB8D> <7C99> <BB8E> <BB8F> <7CA0> <BB90> <BB90> <7CA3> <BB91> <BB94> <7CA6> <BB95> <BB97> <7CAB> <BB98> <BB99> <7CAF> <BB9A> <BB9E> <7CB4> <BB9F> <BBA0> <7CBA> <BBA1> <BBA1> <5F27> <BBA2> <BBA2> <864E> <BBA3> <BBA3> <552C> <BBA4> <BBA4> <62A4> <BBA5> <BBA5> <4E92> <BBA6> <BBA6> <6CAA> <BBA7> <BBA7> <6237> <BBA8> <BBA8> <82B1> <BBA9> <BBA9> <54D7> <BBAA> <BBAA> <534E> <BBAB> <BBAB> <733E> <BBAC> <BBAC> <6ED1> <BBAD> <BBAD> <753B> <BBAE> <BBAE> <5212> <BBAF> <BBAF> <5316> <BBB0> <BBB0> <8BDD> <BBB1> <BBB1> <69D0> <BBB2> <BBB2> <5F8A> <BBB3> <BBB3> <6000> <BBB4> <BBB4> <6DEE> <BBB5> <BBB5> <574F> <BBB6> <BBB6> <6B22> <BBB7> <BBB7> <73AF> <BBB8> <BBB8> <6853> <BBB9> <BBB9> <8FD8> <BBBA> <BBBA> <7F13> <BBBB> <BBBB> <6362> <BBBC> <BBBC> <60A3> <BBBD> <BBBD> <5524> <BBBE> <BBBE> <75EA> endbfrange 100 beginbfrange <BBBF> <BBBF> <8C62> <BBC0> <BBC0> <7115> <BBC1> <BBC1> <6DA3> <BBC2> <BBC2> <5BA6> <BBC3> <BBC3> <5E7B> <BBC4> <BBC4> <8352> <BBC5> <BBC5> <614C> <BBC6> <BBC6> <9EC4> <BBC7> <BBC7> <78FA> <BBC8> <BBC8> <8757> <BBC9> <BBC9> <7C27> <BBCA> <BBCA> <7687> <BBCB> <BBCB> <51F0> <BBCC> <BBCC> <60F6> <BBCD> <BBCD> <714C> <BBCE> <BBCE> <6643> <BBCF> <BBCF> <5E4C> <BBD0> <BBD0> <604D> <BBD1> <BBD1> <8C0E> <BBD2> <BBD2> <7070> <BBD3> <BBD3> <6325> <BBD4> <BBD4> <8F89> <BBD5> <BBD5> <5FBD> <BBD6> <BBD6> <6062> <BBD7> <BBD7> <86D4> <BBD8> <BBD8> <56DE> <BBD9> <BBD9> <6BC1> <BBDA> <BBDA> <6094> <BBDB> <BBDB> <6167> <BBDC> <BBDC> <5349> <BBDD> <BBDD> <60E0> <BBDE> <BBDE> <6666> <BBDF> <BBDF> <8D3F> <BBE0> <BBE0> <79FD> <BBE1> <BBE1> <4F1A> <BBE2> <BBE2> <70E9> <BBE3> <BBE3> <6C47> <BBE4> <BBE4> <8BB3> <BBE5> <BBE5> <8BF2> <BBE6> <BBE6> <7ED8> <BBE7> <BBE7> <8364> <BBE8> <BBE8> <660F> <BBE9> <BBE9> <5A5A> <BBEA> <BBEA> <9B42> <BBEB> <BBEB> <6D51> <BBEC> <BBEC> <6DF7> <BBED> <BBED> <8C41> <BBEE> <BBEE> <6D3B> <BBEF> <BBEF> <4F19> <BBF0> <BBF0> <706B> <BBF1> <BBF1> <83B7> <BBF2> <BBF2> <6216> <BBF3> <BBF3> <60D1> <BBF4> <BBF4> <970D> <BBF5> <BBF5> <8D27> <BBF6> <BBF6> <7978> <BBF7> <BBF7> <51FB> <BBF8> <BBF8> <573E> <BBF9> <BBF9> <57FA> <BBFA> <BBFA> <673A> <BBFB> <BBFB> <7578> <BBFC> <BBFC> <7A3D> <BBFD> <BBFD> <79EF> <BBFE> <BBFE> <7B95> <BC40> <BC41> <7CBF> <BC42> <BC44> <7CC2> <BC45> <BC45> <7CC6> <BC46> <BC46> <7CC9> <BC47> <BC47> <7CCB> <BC48> <BC4E> <7CCE> <BC4F> <BC4F> <7CD8> <BC50> <BC51> <7CDA> <BC52> <BC53> <7CDD> <BC54> <BC5A> <7CE1> <BC5B> <BC60> <7CE9> <BC61> <BC68> <7CF0> <BC69> <BC6A> <7CF9> <BC6B> <BC78> <7CFC> <BC79> <BC7E> <7D0B> <BC80> <BC8E> <7D11> <BC8F> <BC8F> <7D21> <BC90> <BC93> <7D23> <BC94> <BC96> <7D28> <BC97> <BC99> <7D2C> <BC9A> <BCA0> <7D30> <BCA1> <BCA1> <808C> <BCA2> <BCA2> <9965> <BCA3> <BCA3> <8FF9> <BCA4> <BCA4> <6FC0> <BCA5> <BCA5> <8BA5> <BCA6> <BCA6> <9E21> <BCA7> <BCA7> <59EC> <BCA8> <BCA8> <7EE9> <BCA9> <BCA9> <7F09> <BCAA> <BCAA> <5409> <BCAB> <BCAB> <6781> <BCAC> <BCAC> <68D8> <BCAD> <BCAD> <8F91> <BCAE> <BCAE> <7C4D> <BCAF> <BCAF> <96C6> endbfrange 100 beginbfrange <BCB0> <BCB0> <53CA> <BCB1> <BCB1> <6025> <BCB2> <BCB2> <75BE> <BCB3> <BCB3> <6C72> <BCB4> <BCB4> <5373> <BCB5> <BCB5> <5AC9> <BCB6> <BCB6> <7EA7> <BCB7> <BCB7> <6324> <BCB8> <BCB8> <51E0> <BCB9> <BCB9> <810A> <BCBA> <BCBA> <5DF1> <BCBB> <BCBB> <84DF> <BCBC> <BCBC> <6280> <BCBD> <BCBD> <5180> <BCBE> <BCBE> <5B63> <BCBF> <BCBF> <4F0E> <BCC0> <BCC0> <796D> <BCC1> <BCC1> <5242> <BCC2> <BCC2> <60B8> <BCC3> <BCC3> <6D4E> <BCC4> <BCC4> <5BC4> <BCC5> <BCC5> <5BC2> <BCC6> <BCC6> <8BA1> <BCC7> <BCC7> <8BB0> <BCC8> <BCC8> <65E2> <BCC9> <BCC9> <5FCC> <BCCA> <BCCA> <9645> <BCCB> <BCCB> <5993> <BCCC> <BCCC> <7EE7> <BCCD> <BCCD> <7EAA> <BCCE> <BCCE> <5609> <BCCF> <BCCF> <67B7> <BCD0> <BCD0> <5939> <BCD1> <BCD1> <4F73> <BCD2> <BCD2> <5BB6> <BCD3> <BCD3> <52A0> <BCD4> <BCD4> <835A> <BCD5> <BCD5> <988A> <BCD6> <BCD6> <8D3E> <BCD7> <BCD7> <7532> <BCD8> <BCD8> <94BE> <BCD9> <BCD9> <5047> <BCDA> <BCDA> <7A3C> <BCDB> <BCDB> <4EF7> <BCDC> <BCDC> <67B6> <BCDD> <BCDD> <9A7E> <BCDE> <BCDE> <5AC1> <BCDF> <BCDF> <6B7C> <BCE0> <BCE0> <76D1> <BCE1> <BCE1> <575A> <BCE2> <BCE2> <5C16> <BCE3> <BCE3> <7B3A> <BCE4> <BCE4> <95F4> <BCE5> <BCE5> <714E> <BCE6> <BCE6> <517C> <BCE7> <BCE7> <80A9> <BCE8> <BCE8> <8270> <BCE9> <BCE9> <5978> <BCEA> <BCEA> <7F04> <BCEB> <BCEB> <8327> <BCEC> <BCEC> <68C0> <BCED> <BCED> <67EC> <BCEE> <BCEE> <78B1> <BCEF> <BCEF> <7877> <BCF0> <BCF0> <62E3> <BCF1> <BCF1> <6361> <BCF2> <BCF2> <7B80> <BCF3> <BCF3> <4FED> <BCF4> <BCF4> <526A> <BCF5> <BCF5> <51CF> <BCF6> <BCF6> <8350> <BCF7> <BCF7> <69DB> <BCF8> <BCF8> <9274> <BCF9> <BCF9> <8DF5> <BCFA> <BCFA> <8D31> <BCFB> <BCFB> <89C1> <BCFC> <BCFC> <952E> <BCFD> <BCFD> <7BAD> <BCFE> <BCFE> <4EF6> <BD40> <BD76> <7D37> <BD77> <BD7E> <7D6F> <BD80> <BDA0> <7D78> <BDA1> <BDA1> <5065> <BDA2> <BDA2> <8230> <BDA3> <BDA3> <5251> <BDA4> <BDA4> <996F> <BDA5> <BDA5> <6E10> <BDA6> <BDA6> <6E85> <BDA7> <BDA7> <6DA7> <BDA8> <BDA8> <5EFA> <BDA9> <BDA9> <50F5> <BDAA> <BDAA> <59DC> <BDAB> <BDAB> <5C06> <BDAC> <BDAC> <6D46> <BDAD> <BDAD> <6C5F> <BDAE> <BDAE> <7586> <BDAF> <BDAF> <848B> <BDB0> <BDB0> <6868> <BDB1> <BDB1> <5956> <BDB2> <BDB2> <8BB2> endbfrange 100 beginbfrange <BDB3> <BDB3> <5320> <BDB4> <BDB4> <9171> <BDB5> <BDB5> <964D> <BDB6> <BDB6> <8549> <BDB7> <BDB7> <6912> <BDB8> <BDB8> <7901> <BDB9> <BDB9> <7126> <BDBA> <BDBA> <80F6> <BDBB> <BDBB> <4EA4> <BDBC> <BDBC> <90CA> <BDBD> <BDBD> <6D47> <BDBE> <BDBE> <9A84> <BDBF> <BDBF> <5A07> <BDC0> <BDC0> <56BC> <BDC1> <BDC1> <6405> <BDC2> <BDC2> <94F0> <BDC3> <BDC3> <77EB> <BDC4> <BDC4> <4FA5> <BDC5> <BDC5> <811A> <BDC6> <BDC6> <72E1> <BDC7> <BDC7> <89D2> <BDC8> <BDC8> <997A> <BDC9> <BDC9> <7F34> <BDCA> <BDCA> <7EDE> <BDCB> <BDCB> <527F> <BDCC> <BDCC> <6559> <BDCD> <BDCD> <9175> <BDCE> <BDCE> <8F7F> <BDCF> <BDCF> <8F83> <BDD0> <BDD0> <53EB> <BDD1> <BDD1> <7A96> <BDD2> <BDD2> <63ED> <BDD3> <BDD3> <63A5> <BDD4> <BDD4> <7686> <BDD5> <BDD5> <79F8> <BDD6> <BDD6> <8857> <BDD7> <BDD7> <9636> <BDD8> <BDD8> <622A> <BDD9> <BDD9> <52AB> <BDDA> <BDDA> <8282> <BDDB> <BDDB> <6854> <BDDC> <BDDC> <6770> <BDDD> <BDDD> <6377> <BDDE> <BDDE> <776B> <BDDF> <BDDF> <7AED> <BDE0> <BDE0> <6D01> <BDE1> <BDE1> <7ED3> <BDE2> <BDE2> <89E3> <BDE3> <BDE3> <59D0> <BDE4> <BDE4> <6212> <BDE5> <BDE5> <85C9> <BDE6> <BDE6> <82A5> <BDE7> <BDE7> <754C> <BDE8> <BDE8> <501F> <BDE9> <BDE9> <4ECB> <BDEA> <BDEA> <75A5> <BDEB> <BDEB> <8BEB> <BDEC> <BDEC> <5C4A> <BDED> <BDED> <5DFE> <BDEE> <BDEE> <7B4B> <BDEF> <BDEF> <65A4> <BDF0> <BDF0> <91D1> <BDF1> <BDF1> <4ECA> <BDF2> <BDF2> <6D25> <BDF3> <BDF3> <895F> <BDF4> <BDF4> <7D27> <BDF5> <BDF5> <9526> <BDF6> <BDF6> <4EC5> <BDF7> <BDF7> <8C28> <BDF8> <BDF8> <8FDB> <BDF9> <BDF9> <9773> <BDFA> <BDFA> <664B> <BDFB> <BDFB> <7981> <BDFC> <BDFC> <8FD1> <BDFD> <BDFD> <70EC> <BDFE> <BDFE> <6D78> <BE40> <BE4C> <7D99> <BE4D> <BE53> <7DA7> <BE54> <BE7E> <7DAF> <BE80> <BEA0> <7DDA> <BEA1> <BEA1> <5C3D> <BEA2> <BEA2> <52B2> <BEA3> <BEA3> <8346> <BEA4> <BEA4> <5162> <BEA5> <BEA5> <830E> <BEA6> <BEA6> <775B> <BEA7> <BEA7> <6676> <BEA8> <BEA8> <9CB8> <BEA9> <BEA9> <4EAC> <BEAA> <BEAA> <60CA> <BEAB> <BEAB> <7CBE> <BEAC> <BEAC> <7CB3> <BEAD> <BEAD> <7ECF> <BEAE> <BEAE> <4E95> <BEAF> <BEAF> <8B66> <BEB0> <BEB0> <666F> <BEB1> <BEB1> <9888> <BEB2> <BEB2> <9759> <BEB3> <BEB3> <5883> <BEB4> <BEB4> <656C> endbfrange 100 beginbfrange <BEB5> <BEB5> <955C> <BEB6> <BEB6> <5F84> <BEB7> <BEB7> <75C9> <BEB8> <BEB8> <9756> <BEB9> <BEB9> <7ADF> <BEBA> <BEBA> <7ADE> <BEBB> <BEBB> <51C0> <BEBC> <BEBC> <70AF> <BEBD> <BEBD> <7A98> <BEBE> <BEBE> <63EA> <BEBF> <BEBF> <7A76> <BEC0> <BEC0> <7EA0> <BEC1> <BEC1> <7396> <BEC2> <BEC2> <97ED> <BEC3> <BEC3> <4E45> <BEC4> <BEC4> <7078> <BEC5> <BEC5> <4E5D> <BEC6> <BEC6> <9152> <BEC7> <BEC7> <53A9> <BEC8> <BEC8> <6551> <BEC9> <BEC9> <65E7> <BECA> <BECA> <81FC> <BECB> <BECB> <8205> <BECC> <BECC> <548E> <BECD> <BECD> <5C31> <BECE> <BECE> <759A> <BECF> <BECF> <97A0> <BED0> <BED0> <62D8> <BED1> <BED1> <72D9> <BED2> <BED2> <75BD> <BED3> <BED3> <5C45> <BED4> <BED4> <9A79> <BED5> <BED5> <83CA> <BED6> <BED6> <5C40> <BED7> <BED7> <5480> <BED8> <BED8> <77E9> <BED9> <BED9> <4E3E> <BEDA> <BEDA> <6CAE> <BEDB> <BEDB> <805A> <BEDC> <BEDC> <62D2> <BEDD> <BEDD> <636E> <BEDE> <BEDE> <5DE8> <BEDF> <BEDF> <5177> <BEE0> <BEE0> <8DDD> <BEE1> <BEE1> <8E1E> <BEE2> <BEE2> <952F> <BEE3> <BEE3> <4FF1> <BEE4> <BEE4> <53E5> <BEE5> <BEE5> <60E7> <BEE6> <BEE6> <70AC> <BEE7> <BEE7> <5267> <BEE8> <BEE8> <6350> <BEE9> <BEE9> <9E43> <BEEA> <BEEA> <5A1F> <BEEB> <BEEB> <5026> <BEEC> <BEEC> <7737> <BEED> <BEED> <5377> <BEEE> <BEEE> <7EE2> <BEEF> <BEEF> <6485> <BEF0> <BEF0> <652B> <BEF1> <BEF1> <6289> <BEF2> <BEF2> <6398> <BEF3> <BEF3> <5014> <BEF4> <BEF4> <7235> <BEF5> <BEF5> <89C9> <BEF6> <BEF6> <51B3> <BEF7> <BEF7> <8BC0> <BEF8> <BEF8> <7EDD> <BEF9> <BEF9> <5747> <BEFA> <BEFA> <83CC> <BEFB> <BEFB> <94A7> <BEFC> <BEFC> <519B> <BEFD> <BEFD> <541B> <BEFE> <BEFE> <5CFB> <BF40> <BF7E> <7DFB> <BF80> <BF80> <7E3A> <BF81> <BF85> <7E3C> <BF86> <BF8A> <7E42> <BF8B> <BFA0> <7E48> <BFA1> <BFA1> <4FCA> <BFA2> <BFA2> <7AE3> <BFA3> <BFA3> <6D5A> <BFA4> <BFA4> <90E1> <BFA5> <BFA5> <9A8F> <BFA6> <BFA6> <5580> <BFA7> <BFA7> <5496> <BFA8> <BFA8> <5361> <BFA9> <BFA9> <54AF> <BFAA> <BFAA> <5F00> <BFAB> <BFAB> <63E9> <BFAC> <BFAC> <6977> <BFAD> <BFAD> <51EF> <BFAE> <BFAE> <6168> <BFAF> <BFAF> <520A> <BFB0> <BFB0> <582A> <BFB1> <BFB1> <52D8> <BFB2> <BFB2> <574E> <BFB3> <BFB3> <780D> <BFB4> <BFB4> <770B> <BFB5> <BFB5> <5EB7> endbfrange 100 beginbfrange <BFB6> <BFB6> <6177> <BFB7> <BFB7> <7CE0> <BFB8> <BFB8> <625B> <BFB9> <BFB9> <6297> <BFBA> <BFBA> <4EA2> <BFBB> <BFBB> <7095> <BFBC> <BFBC> <8003> <BFBD> <BFBD> <62F7> <BFBE> <BFBE> <70E4> <BFBF> <BFBF> <9760> <BFC0> <BFC0> <5777> <BFC1> <BFC1> <82DB> <BFC2> <BFC2> <67EF> <BFC3> <BFC3> <68F5> <BFC4> <BFC4> <78D5> <BFC5> <BFC5> <9897> <BFC6> <BFC6> <79D1> <BFC7> <BFC7> <58F3> <BFC8> <BFC8> <54B3> <BFC9> <BFC9> <53EF> <BFCA> <BFCA> <6E34> <BFCB> <BFCB> <514B> <BFCC> <BFCC> <523B> <BFCD> <BFCD> <5BA2> <BFCE> <BFCE> <8BFE> <BFCF> <BFCF> <80AF> <BFD0> <BFD0> <5543> <BFD1> <BFD1> <57A6> <BFD2> <BFD2> <6073> <BFD3> <BFD3> <5751> <BFD4> <BFD4> <542D> <BFD5> <BFD5> <7A7A> <BFD6> <BFD6> <6050> <BFD7> <BFD7> <5B54> <BFD8> <BFD8> <63A7> <BFD9> <BFD9> <62A0> <BFDA> <BFDA> <53E3> <BFDB> <BFDB> <6263> <BFDC> <BFDC> <5BC7> <BFDD> <BFDD> <67AF> <BFDE> <BFDE> <54ED> <BFDF> <BFDF> <7A9F> <BFE0> <BFE0> <82E6> <BFE1> <BFE1> <9177> <BFE2> <BFE2> <5E93> <BFE3> <BFE3> <88E4> <BFE4> <BFE4> <5938> <BFE5> <BFE5> <57AE> <BFE6> <BFE6> <630E> <BFE7> <BFE7> <8DE8> <BFE8> <BFE8> <80EF> <BFE9> <BFE9> <5757> <BFEA> <BFEA> <7B77> <BFEB> <BFEB> <4FA9> <BFEC> <BFEC> <5FEB> <BFED> <BFED> <5BBD> <BFEE> <BFEE> <6B3E> <BFEF> <BFEF> <5321> <BFF0> <BFF0> <7B50> <BFF1> <BFF1> <72C2> <BFF2> <BFF2> <6846> <BFF3> <BFF3> <77FF> <BFF4> <BFF4> <7736> <BFF5> <BFF5> <65F7> <BFF6> <BFF6> <51B5> <BFF7> <BFF7> <4E8F> <BFF8> <BFF8> <76D4> <BFF9> <BFF9> <5CBF> <BFFA> <BFFA> <7AA5> <BFFB> <BFFB> <8475> <BFFC> <BFFC> <594E> <BFFD> <BFFD> <9B41> <BFFE> <BFFE> <5080> <C040> <C063> <7E5E> <C064> <C07B> <7E83> <C07C> <C07E> <7E9C> <C080> <C080> <7EAE> <C081> <C081> <7EB4> <C082> <C083> <7EBB> <C084> <C084> <7ED6> <C085> <C085> <7EE4> <C086> <C086> <7EEC> <C087> <C087> <7EF9> <C088> <C088> <7F0A> <C089> <C089> <7F10> <C08A> <C08A> <7F1E> <C08B> <C08B> <7F37> <C08C> <C08C> <7F39> <C08D> <C093> <7F3B> <C094> <C094> <7F43> <C095> <C09E> <7F46> <C09F> <C0A0> <7F52> <C0A1> <C0A1> <9988> <C0A2> <C0A2> <6127> <C0A3> <C0A3> <6E83> <C0A4> <C0A4> <5764> <C0A5> <C0A5> <6606> <C0A6> <C0A6> <6346> <C0A7> <C0A7> <56F0> <C0A8> <C0A8> <62EC> endbfrange 100 beginbfrange <C0A9> <C0A9> <6269> <C0AA> <C0AA> <5ED3> <C0AB> <C0AB> <9614> <C0AC> <C0AC> <5783> <C0AD> <C0AD> <62C9> <C0AE> <C0AE> <5587> <C0AF> <C0AF> <8721> <C0B0> <C0B0> <814A> <C0B1> <C0B1> <8FA3> <C0B2> <C0B2> <5566> <C0B3> <C0B3> <83B1> <C0B4> <C0B4> <6765> <C0B5> <C0B5> <8D56> <C0B6> <C0B6> <84DD> <C0B7> <C0B7> <5A6A> <C0B8> <C0B8> <680F> <C0B9> <C0B9> <62E6> <C0BA> <C0BA> <7BEE> <C0BB> <C0BB> <9611> <C0BC> <C0BC> <5170> <C0BD> <C0BD> <6F9C> <C0BE> <C0BE> <8C30> <C0BF> <C0BF> <63FD> <C0C0> <C0C0> <89C8> <C0C1> <C0C1> <61D2> <C0C2> <C0C2> <7F06> <C0C3> <C0C3> <70C2> <C0C4> <C0C4> <6EE5> <C0C5> <C0C5> <7405> <C0C6> <C0C6> <6994> <C0C7> <C0C7> <72FC> <C0C8> <C0C8> <5ECA> <C0C9> <C0C9> <90CE> <C0CA> <C0CA> <6717> <C0CB> <C0CB> <6D6A> <C0CC> <C0CC> <635E> <C0CD> <C0CD> <52B3> <C0CE> <C0CE> <7262> <C0CF> <C0CF> <8001> <C0D0> <C0D0> <4F6C> <C0D1> <C0D1> <59E5> <C0D2> <C0D2> <916A> <C0D3> <C0D3> <70D9> <C0D4> <C0D4> <6D9D> <C0D5> <C0D5> <52D2> <C0D6> <C0D6> <4E50> <C0D7> <C0D7> <96F7> <C0D8> <C0D8> <956D> <C0D9> <C0D9> <857E> <C0DA> <C0DA> <78CA> <C0DB> <C0DB> <7D2F> <C0DC> <C0DC> <5121> <C0DD> <C0DD> <5792> <C0DE> <C0DE> <64C2> <C0DF> <C0DF> <808B> <C0E0> <C0E0> <7C7B> <C0E1> <C0E1> <6CEA> <C0E2> <C0E2> <68F1> <C0E3> <C0E3> <695E> <C0E4> <C0E4> <51B7> <C0E5> <C0E5> <5398> <C0E6> <C0E6> <68A8> <C0E7> <C0E7> <7281> <C0E8> <C0E8> <9ECE> <C0E9> <C0E9> <7BF1> <C0EA> <C0EA> <72F8> <C0EB> <C0EB> <79BB> <C0EC> <C0EC> <6F13> <C0ED> <C0ED> <7406> <C0EE> <C0EE> <674E> <C0EF> <C0EF> <91CC> <C0F0> <C0F0> <9CA4> <C0F1> <C0F1> <793C> <C0F2> <C0F2> <8389> <C0F3> <C0F3> <8354> <C0F4> <C0F4> <540F> <C0F5> <C0F5> <6817> <C0F6> <C0F6> <4E3D> <C0F7> <C0F7> <5389> <C0F8> <C0F8> <52B1> <C0F9> <C0F9> <783E> <C0FA> <C0FA> <5386> <C0FB> <C0FB> <5229> <C0FC> <C0FC> <5088> <C0FD> <C0FD> <4F8B> <C0FE> <C0FE> <4FD0> <C140> <C140> <7F56> <C141> <C141> <7F59> <C142> <C145> <7F5B> <C146> <C146> <7F60> <C147> <C14B> <7F63> <C14C> <C14E> <7F6B> <C14F> <C150> <7F6F> <C151> <C151> <7F73> <C152> <C155> <7F75> <C156> <C159> <7F7A> <C15A> <C15B> <7F7F> <C15C> <C163> <7F82> <C164> <C164> <7F8B> <C165> <C165> <7F8D> endbfrange 100 beginbfrange <C166> <C16A> <7F8F> <C16B> <C16F> <7F95> <C170> <C171> <7F9B> <C172> <C172> <7FA0> <C173> <C174> <7FA2> <C175> <C176> <7FA5> <C177> <C17D> <7FA8> <C17E> <C17E> <7FB1> <C180> <C184> <7FB3> <C185> <C186> <7FBA> <C187> <C187> <7FBE> <C188> <C188> <7FC0> <C189> <C18B> <7FC2> <C18C> <C18F> <7FC6> <C190> <C190> <7FCB> <C191> <C191> <7FCD> <C192> <C196> <7FCF> <C197> <C198> <7FD6> <C199> <C19E> <7FD9> <C19F> <C1A0> <7FE2> <C1A1> <C1A1> <75E2> <C1A2> <C1A2> <7ACB> <C1A3> <C1A3> <7C92> <C1A4> <C1A4> <6CA5> <C1A5> <C1A5> <96B6> <C1A6> <C1A6> <529B> <C1A7> <C1A7> <7483> <C1A8> <C1A8> <54E9> <C1A9> <C1A9> <4FE9> <C1AA> <C1AA> <8054> <C1AB> <C1AB> <83B2> <C1AC> <C1AC> <8FDE> <C1AD> <C1AD> <9570> <C1AE> <C1AE> <5EC9> <C1AF> <C1AF> <601C> <C1B0> <C1B0> <6D9F> <C1B1> <C1B1> <5E18> <C1B2> <C1B2> <655B> <C1B3> <C1B3> <8138> <C1B4> <C1B4> <94FE> <C1B5> <C1B5> <604B> <C1B6> <C1B6> <70BC> <C1B7> <C1B7> <7EC3> <C1B8> <C1B8> <7CAE> <C1B9> <C1B9> <51C9> <C1BA> <C1BA> <6881> <C1BB> <C1BB> <7CB1> <C1BC> <C1BC> <826F> <C1BD> <C1BD> <4E24> <C1BE> <C1BE> <8F86> <C1BF> <C1BF> <91CF> <C1C0> <C1C0> <667E> <C1C1> <C1C1> <4EAE> <C1C2> <C1C2> <8C05> <C1C3> <C1C3> <64A9> <C1C4> <C1C4> <804A> <C1C5> <C1C5> <50DA> <C1C6> <C1C6> <7597> <C1C7> <C1C7> <71CE> <C1C8> <C1C8> <5BE5> <C1C9> <C1C9> <8FBD> <C1CA> <C1CA> <6F66> <C1CB> <C1CB> <4E86> <C1CC> <C1CC> <6482> <C1CD> <C1CD> <9563> <C1CE> <C1CE> <5ED6> <C1CF> <C1CF> <6599> <C1D0> <C1D0> <5217> <C1D1> <C1D1> <88C2> <C1D2> <C1D2> <70C8> <C1D3> <C1D3> <52A3> <C1D4> <C1D4> <730E> <C1D5> <C1D5> <7433> <C1D6> <C1D6> <6797> <C1D7> <C1D7> <78F7> <C1D8> <C1D8> <9716> <C1D9> <C1D9> <4E34> <C1DA> <C1DA> <90BB> <C1DB> <C1DB> <9CDE> <C1DC> <C1DC> <6DCB> <C1DD> <C1DD> <51DB> <C1DE> <C1DE> <8D41> <C1DF> <C1DF> <541D> <C1E0> <C1E0> <62CE> <C1E1> <C1E1> <73B2> <C1E2> <C1E2> <83F1> <C1E3> <C1E3> <96F6> <C1E4> <C1E4> <9F84> <C1E5> <C1E5> <94C3> <C1E6> <C1E6> <4F36> <C1E7> <C1E7> <7F9A> <C1E8> <C1E8> <51CC> <C1E9> <C1E9> <7075> <C1EA> <C1EA> <9675> <C1EB> <C1EB> <5CAD> <C1EC> <C1EC> <9886> <C1ED> <C1ED> <53E6> <C1EE> <C1EE> <4EE4> <C1EF> <C1EF> <6E9C> <C1F0> <C1F0> <7409> endbfrange 100 beginbfrange <C1F1> <C1F1> <69B4> <C1F2> <C1F2> <786B> <C1F3> <C1F3> <998F> <C1F4> <C1F4> <7559> <C1F5> <C1F5> <5218> <C1F6> <C1F6> <7624> <C1F7> <C1F7> <6D41> <C1F8> <C1F8> <67F3> <C1F9> <C1F9> <516D> <C1FA> <C1FA> <9F99> <C1FB> <C1FB> <804B> <C1FC> <C1FC> <5499> <C1FD> <C1FD> <7B3C> <C1FE> <C1FE> <7ABF> <C240> <C240> <7FE4> <C241> <C242> <7FE7> <C243> <C246> <7FEA> <C247> <C247> <7FEF> <C248> <C248> <7FF2> <C249> <C24F> <7FF4> <C250> <C252> <7FFD> <C253> <C253> <8002> <C254> <C257> <8007> <C258> <C259> <800E> <C25A> <C25A> <8011> <C25B> <C25B> <8013> <C25C> <C25D> <801A> <C25E> <C260> <801D> <C261> <C261> <8021> <C262> <C263> <8023> <C264> <C269> <802B> <C26A> <C26A> <8032> <C26B> <C26B> <8034> <C26C> <C26D> <8039> <C26E> <C26E> <803C> <C26F> <C26F> <803E> <C270> <C271> <8040> <C272> <C273> <8044> <C274> <C276> <8047> <C277> <C27A> <804E> <C27B> <C27B> <8053> <C27C> <C27E> <8055> <C280> <C280> <8059> <C281> <C28E> <805B> <C28F> <C294> <806B> <C295> <C2A0> <8072> <C2A1> <C2A1> <9686> <C2A2> <C2A2> <5784> <C2A3> <C2A3> <62E2> <C2A4> <C2A4> <9647> <C2A5> <C2A5> <697C> <C2A6> <C2A6> <5A04> <C2A7> <C2A7> <6402> <C2A8> <C2A8> <7BD3> <C2A9> <C2A9> <6F0F> <C2AA> <C2AA> <964B> <C2AB> <C2AB> <82A6> <C2AC> <C2AC> <5362> <C2AD> <C2AD> <9885> <C2AE> <C2AE> <5E90> <C2AF> <C2AF> <7089> <C2B0> <C2B0> <63B3> <C2B1> <C2B1> <5364> <C2B2> <C2B2> <864F> <C2B3> <C2B3> <9C81> <C2B4> <C2B4> <9E93> <C2B5> <C2B5> <788C> <C2B6> <C2B6> <9732> <C2B7> <C2B7> <8DEF> <C2B8> <C2B8> <8D42> <C2B9> <C2B9> <9E7F> <C2BA> <C2BA> <6F5E> <C2BB> <C2BB> <7984> <C2BC> <C2BC> <5F55> <C2BD> <C2BD> <9646> <C2BE> <C2BE> <622E> <C2BF> <C2BF> <9A74> <C2C0> <C2C0> <5415> <C2C1> <C2C1> <94DD> <C2C2> <C2C2> <4FA3> <C2C3> <C2C3> <65C5> <C2C4> <C2C4> <5C65> <C2C5> <C2C5> <5C61> <C2C6> <C2C6> <7F15> <C2C7> <C2C7> <8651> <C2C8> <C2C8> <6C2F> <C2C9> <C2C9> <5F8B> <C2CA> <C2CA> <7387> <C2CB> <C2CB> <6EE4> <C2CC> <C2CC> <7EFF> <C2CD> <C2CD> <5CE6> <C2CE> <C2CE> <631B> <C2CF> <C2CF> <5B6A> <C2D0> <C2D0> <6EE6> <C2D1> <C2D1> <5375> <C2D2> <C2D2> <4E71> <C2D3> <C2D3> <63A0> <C2D4> <C2D4> <7565> <C2D5> <C2D5> <62A1> <C2D6> <C2D6> <8F6E> endbfrange 100 beginbfrange <C2D7> <C2D7> <4F26> <C2D8> <C2D8> <4ED1> <C2D9> <C2D9> <6CA6> <C2DA> <C2DA> <7EB6> <C2DB> <C2DB> <8BBA> <C2DC> <C2DC> <841D> <C2DD> <C2DD> <87BA> <C2DE> <C2DE> <7F57> <C2DF> <C2DF> <903B> <C2E0> <C2E0> <9523> <C2E1> <C2E1> <7BA9> <C2E2> <C2E2> <9AA1> <C2E3> <C2E3> <88F8> <C2E4> <C2E4> <843D> <C2E5> <C2E5> <6D1B> <C2E6> <C2E6> <9A86> <C2E7> <C2E7> <7EDC> <C2E8> <C2E8> <5988> <C2E9> <C2E9> <9EBB> <C2EA> <C2EA> <739B> <C2EB> <C2EB> <7801> <C2EC> <C2EC> <8682> <C2ED> <C2ED> <9A6C> <C2EE> <C2EE> <9A82> <C2EF> <C2EF> <561B> <C2F0> <C2F0> <5417> <C2F1> <C2F1> <57CB> <C2F2> <C2F2> <4E70> <C2F3> <C2F3> <9EA6> <C2F4> <C2F4> <5356> <C2F5> <C2F5> <8FC8> <C2F6> <C2F6> <8109> <C2F7> <C2F7> <7792> <C2F8> <C2F8> <9992> <C2F9> <C2F9> <86EE> <C2FA> <C2FA> <6EE1> <C2FB> <C2FB> <8513> <C2FC> <C2FC> <66FC> <C2FD> <C2FD> <6162> <C2FE> <C2FE> <6F2B> <C340> <C340> <807E> <C341> <C342> <8081> <C343> <C343> <8085> <C344> <C344> <8088> <C345> <C345> <808A> <C346> <C34B> <808D> <C34C> <C34D> <8094> <C34E> <C34E> <8097> <C34F> <C34F> <8099> <C350> <C350> <809E> <C351> <C351> <80A3> <C352> <C354> <80A6> <C355> <C355> <80AC> <C356> <C356> <80B0> <C357> <C357> <80B3> <C358> <C359> <80B5> <C35A> <C35B> <80B8> <C35C> <C35C> <80BB> <C35D> <C35D> <80C5> <C35E> <C362> <80C7> <C363> <C369> <80CF> <C36A> <C36A> <80D8> <C36B> <C36C> <80DF> <C36D> <C36E> <80E2> <C36F> <C36F> <80E6> <C370> <C370> <80EE> <C371> <C371> <80F5> <C372> <C372> <80F7> <C373> <C373> <80F9> <C374> <C374> <80FB> <C375> <C378> <80FE> <C379> <C37B> <8103> <C37C> <C37D> <8107> <C37E> <C37E> <810B> <C380> <C380> <810C> <C381> <C381> <8115> <C382> <C382> <8117> <C383> <C383> <8119> <C384> <C386> <811B> <C387> <C393> <811F> <C394> <C395> <812D> <C396> <C396> <8130> <C397> <C399> <8133> <C39A> <C39A> <8137> <C39B> <C39F> <8139> <C3A0> <C3A0> <813F> <C3A1> <C3A1> <8C29> <C3A2> <C3A2> <8292> <C3A3> <C3A3> <832B> <C3A4> <C3A4> <76F2> <C3A5> <C3A5> <6C13> <C3A6> <C3A6> <5FD9> <C3A7> <C3A7> <83BD> <C3A8> <C3A8> <732B> <C3A9> <C3A9> <8305> <C3AA> <C3AA> <951A> <C3AB> <C3AB> <6BDB> <C3AC> <C3AC> <77DB> <C3AD> <C3AD> <94C6> <C3AE> <C3AE> <536F> endbfrange 100 beginbfrange <C3AF> <C3AF> <8302> <C3B0> <C3B0> <5192> <C3B1> <C3B1> <5E3D> <C3B2> <C3B2> <8C8C> <C3B3> <C3B3> <8D38> <C3B4> <C3B4> <4E48> <C3B5> <C3B5> <73AB> <C3B6> <C3B6> <679A> <C3B7> <C3B7> <6885> <C3B8> <C3B8> <9176> <C3B9> <C3B9> <9709> <C3BA> <C3BA> <7164> <C3BB> <C3BB> <6CA1> <C3BC> <C3BC> <7709> <C3BD> <C3BD> <5A92> <C3BE> <C3BE> <9541> <C3BF> <C3BF> <6BCF> <C3C0> <C3C0> <7F8E> <C3C1> <C3C1> <6627> <C3C2> <C3C2> <5BD0> <C3C3> <C3C3> <59B9> <C3C4> <C3C4> <5A9A> <C3C5> <C3C5> <95E8> <C3C6> <C3C6> <95F7> <C3C7> <C3C7> <4EEC> <C3C8> <C3C8> <840C> <C3C9> <C3C9> <8499> <C3CA> <C3CA> <6AAC> <C3CB> <C3CB> <76DF> <C3CC> <C3CC> <9530> <C3CD> <C3CD> <731B> <C3CE> <C3CE> <68A6> <C3CF> <C3CF> <5B5F> <C3D0> <C3D0> <772F> <C3D1> <C3D1> <919A> <C3D2> <C3D2> <9761> <C3D3> <C3D3> <7CDC> <C3D4> <C3D4> <8FF7> <C3D5> <C3D5> <8C1C> <C3D6> <C3D6> <5F25> <C3D7> <C3D7> <7C73> <C3D8> <C3D8> <79D8> <C3D9> <C3D9> <89C5> <C3DA> <C3DA> <6CCC> <C3DB> <C3DB> <871C> <C3DC> <C3DC> <5BC6> <C3DD> <C3DD> <5E42> <C3DE> <C3DE> <68C9> <C3DF> <C3DF> <7720> <C3E0> <C3E0> <7EF5> <C3E1> <C3E1> <5195> <C3E2> <C3E2> <514D> <C3E3> <C3E3> <52C9> <C3E4> <C3E4> <5A29> <C3E5> <C3E5> <7F05> <C3E6> <C3E6> <9762> <C3E7> <C3E7> <82D7> <C3E8> <C3E8> <63CF> <C3E9> <C3E9> <7784> <C3EA> <C3EA> <85D0> <C3EB> <C3EB> <79D2> <C3EC> <C3EC> <6E3A> <C3ED> <C3ED> <5E99> <C3EE> <C3EE> <5999> <C3EF> <C3EF> <8511> <C3F0> <C3F0> <706D> <C3F1> <C3F1> <6C11> <C3F2> <C3F2> <62BF> <C3F3> <C3F3> <76BF> <C3F4> <C3F4> <654F> <C3F5> <C3F5> <60AF> <C3F6> <C3F6> <95FD> <C3F7> <C3F7> <660E> <C3F8> <C3F8> <879F> <C3F9> <C3F9> <9E23> <C3FA> <C3FA> <94ED> <C3FB> <C3FB> <540D> <C3FC> <C3FC> <547D> <C3FD> <C3FD> <8C2C> <C3FE> <C3FE> <6478> <C440> <C445> <8140> <C446> <C446> <8147> <C447> <C447> <8149> <C448> <C44A> <814D> <C44B> <C44B> <8152> <C44C> <C44E> <8156> <C44F> <C453> <815B> <C454> <C457> <8161> <C458> <C458> <8166> <C459> <C459> <8168> <C45A> <C45C> <816A> <C45D> <C45D> <816F> <C45E> <C45F> <8172> <C460> <C463> <8175> <C464> <C464> <8181> <C465> <C469> <8183> <C46A> <C46A> <8189> <C46B> <C46E> <818B> <C46F> <C46F> <8190> <C470> <C475> <8192> endbfrange 100 beginbfrange <C476> <C477> <8199> <C478> <C47C> <819E> <C47D> <C47E> <81A4> <C480> <C480> <81A7> <C481> <C481> <81A9> <C482> <C489> <81AB> <C48A> <C48F> <81B4> <C490> <C493> <81BC> <C494> <C495> <81C4> <C496> <C498> <81C7> <C499> <C499> <81CB> <C49A> <C4A0> <81CD> <C4A1> <C4A1> <6479> <C4A2> <C4A2> <8611> <C4A3> <C4A3> <6A21> <C4A4> <C4A4> <819C> <C4A5> <C4A5> <78E8> <C4A6> <C4A6> <6469> <C4A7> <C4A7> <9B54> <C4A8> <C4A8> <62B9> <C4A9> <C4A9> <672B> <C4AA> <C4AA> <83AB> <C4AB> <C4AB> <58A8> <C4AC> <C4AC> <9ED8> <C4AD> <C4AD> <6CAB> <C4AE> <C4AE> <6F20> <C4AF> <C4AF> <5BDE> <C4B0> <C4B0> <964C> <C4B1> <C4B1> <8C0B> <C4B2> <C4B2> <725F> <C4B3> <C4B3> <67D0> <C4B4> <C4B4> <62C7> <C4B5> <C4B5> <7261> <C4B6> <C4B6> <4EA9> <C4B7> <C4B7> <59C6> <C4B8> <C4B8> <6BCD> <C4B9> <C4B9> <5893> <C4BA> <C4BA> <66AE> <C4BB> <C4BB> <5E55> <C4BC> <C4BC> <52DF> <C4BD> <C4BD> <6155> <C4BE> <C4BE> <6728> <C4BF> <C4BF> <76EE> <C4C0> <C4C0> <7766> <C4C1> <C4C1> <7267> <C4C2> <C4C2> <7A46> <C4C3> <C4C3> <62FF> <C4C4> <C4C4> <54EA> <C4C5> <C4C5> <5450> <C4C6> <C4C6> <94A0> <C4C7> <C4C7> <90A3> <C4C8> <C4C8> <5A1C> <C4C9> <C4C9> <7EB3> <C4CA> <C4CA> <6C16> <C4CB> <C4CB> <4E43> <C4CC> <C4CC> <5976> <C4CD> <C4CD> <8010> <C4CE> <C4CE> <5948> <C4CF> <C4CF> <5357> <C4D0> <C4D0> <7537> <C4D1> <C4D1> <96BE> <C4D2> <C4D2> <56CA> <C4D3> <C4D3> <6320> <C4D4> <C4D4> <8111> <C4D5> <C4D5> <607C> <C4D6> <C4D6> <95F9> <C4D7> <C4D7> <6DD6> <C4D8> <C4D8> <5462> <C4D9> <C4D9> <9981> <C4DA> <C4DA> <5185> <C4DB> <C4DB> <5AE9> <C4DC> <C4DC> <80FD> <C4DD> <C4DD> <59AE> <C4DE> <C4DE> <9713> <C4DF> <C4DF> <502A> <C4E0> <C4E0> <6CE5> <C4E1> <C4E1> <5C3C> <C4E2> <C4E2> <62DF> <C4E3> <C4E3> <4F60> <C4E4> <C4E4> <533F> <C4E5> <C4E5> <817B> <C4E6> <C4E6> <9006> <C4E7> <C4E7> <6EBA> <C4E8> <C4E8> <852B> <C4E9> <C4E9> <62C8> <C4EA> <C4EA> <5E74> <C4EB> <C4EB> <78BE> <C4EC> <C4EC> <64B5> <C4ED> <C4ED> <637B> <C4EE> <C4EE> <5FF5> <C4EF> <C4EF> <5A18> <C4F0> <C4F0> <917F> <C4F1> <C4F1> <9E1F> <C4F2> <C4F2> <5C3F> <C4F3> <C4F3> <634F> <C4F4> <C4F4> <8042> <C4F5> <C4F5> <5B7D> <C4F6> <C4F6> <556E> <C4F7> <C4F7> <954A> <C4F8> <C4F8> <954D> endbfrange 100 beginbfrange <C4F9> <C4F9> <6D85> <C4FA> <C4FA> <60A8> <C4FB> <C4FB> <67E0> <C4FC> <C4FC> <72DE> <C4FD> <C4FD> <51DD> <C4FE> <C4FE> <5B81> <C540> <C54E> <81D4> <C54F> <C551> <81E4> <C552> <C553> <81E8> <C554> <C554> <81EB> <C555> <C559> <81EE> <C55A> <C55F> <81F5> <C560> <C560> <81FD> <C561> <C561> <81FF> <C562> <C562> <8203> <C563> <C567> <8207> <C568> <C569> <820E> <C56A> <C56A> <8211> <C56B> <C56B> <8213> <C56C> <C571> <8215> <C572> <C572> <821D> <C573> <C573> <8220> <C574> <C577> <8224> <C578> <C578> <8229> <C579> <C579> <822E> <C57A> <C57A> <8232> <C57B> <C57B> <823A> <C57C> <C57D> <823C> <C57E> <C57E> <823F> <C580> <C583> <8240> <C584> <C585> <8245> <C586> <C586> <8248> <C587> <C587> <824A> <C588> <C58A> <824C> <C58B> <C592> <8250> <C593> <C593> <8259> <C594> <C597> <825B> <C598> <C59F> <8260> <C5A0> <C5A0> <8269> <C5A1> <C5A1> <62E7> <C5A2> <C5A2> <6CDE> <C5A3> <C5A3> <725B> <C5A4> <C5A4> <626D> <C5A5> <C5A5> <94AE> <C5A6> <C5A6> <7EBD> <C5A7> <C5A7> <8113> <C5A8> <C5A8> <6D53> <C5A9> <C5A9> <519C> <C5AA> <C5AA> <5F04> <C5AB> <C5AB> <5974> <C5AC> <C5AC> <52AA> <C5AD> <C5AD> <6012> <C5AE> <C5AE> <5973> <C5AF> <C5AF> <6696> <C5B0> <C5B0> <8650> <C5B1> <C5B1> <759F> <C5B2> <C5B2> <632A> <C5B3> <C5B3> <61E6> <C5B4> <C5B4> <7CEF> <C5B5> <C5B5> <8BFA> <C5B6> <C5B6> <54E6> <C5B7> <C5B7> <6B27> <C5B8> <C5B8> <9E25> <C5B9> <C5B9> <6BB4> <C5BA> <C5BA> <85D5> <C5BB> <C5BB> <5455> <C5BC> <C5BC> <5076> <C5BD> <C5BD> <6CA4> <C5BE> <C5BE> <556A> <C5BF> <C5BF> <8DB4> <C5C0> <C5C0> <722C> <C5C1> <C5C1> <5E15> <C5C2> <C5C2> <6015> <C5C3> <C5C3> <7436> <C5C4> <C5C4> <62CD> <C5C5> <C5C5> <6392> <C5C6> <C5C6> <724C> <C5C7> <C5C7> <5F98> <C5C8> <C5C8> <6E43> <C5C9> <C5C9> <6D3E> <C5CA> <C5CA> <6500> <C5CB> <C5CB> <6F58> <C5CC> <C5CC> <76D8> <C5CD> <C5CD> <78D0> <C5CE> <C5CE> <76FC> <C5CF> <C5CF> <7554> <C5D0> <C5D0> <5224> <C5D1> <C5D1> <53DB> <C5D2> <C5D2> <4E53> <C5D3> <C5D3> <5E9E> <C5D4> <C5D4> <65C1> <C5D5> <C5D5> <802A> <C5D6> <C5D6> <80D6> <C5D7> <C5D7> <629B> <C5D8> <C5D8> <5486> <C5D9> <C5D9> <5228> <C5DA> <C5DA> <70AE> <C5DB> <C5DB> <888D> <C5DC> <C5DC> <8DD1> <C5DD> <C5DD> <6CE1> endbfrange 100 beginbfrange <C5DE> <C5DE> <5478> <C5DF> <C5DF> <80DA> <C5E0> <C5E0> <57F9> <C5E1> <C5E1> <88F4> <C5E2> <C5E2> <8D54> <C5E3> <C5E3> <966A> <C5E4> <C5E4> <914D> <C5E5> <C5E5> <4F69> <C5E6> <C5E6> <6C9B> <C5E7> <C5E7> <55B7> <C5E8> <C5E8> <76C6> <C5E9> <C5E9> <7830> <C5EA> <C5EA> <62A8> <C5EB> <C5EB> <70F9> <C5EC> <C5EC> <6F8E> <C5ED> <C5ED> <5F6D> <C5EE> <C5EE> <84EC> <C5EF> <C5EF> <68DA> <C5F0> <C5F0> <787C> <C5F1> <C5F1> <7BF7> <C5F2> <C5F2> <81A8> <C5F3> <C5F3> <670B> <C5F4> <C5F4> <9E4F> <C5F5> <C5F5> <6367> <C5F6> <C5F6> <78B0> <C5F7> <C5F7> <576F> <C5F8> <C5F8> <7812> <C5F9> <C5F9> <9739> <C5FA> <C5FA> <6279> <C5FB> <C5FB> <62AB> <C5FC> <C5FC> <5288> <C5FD> <C5FD> <7435> <C5FE> <C5FE> <6BD7> <C640> <C643> <826A> <C644> <C644> <8271> <C645> <C648> <8275> <C649> <C64A> <827B> <C64B> <C64C> <8280> <C64D> <C64D> <8283> <C64E> <C650> <8285> <C651> <C651> <8289> <C652> <C652> <828C> <C653> <C653> <8290> <C654> <C657> <8293> <C658> <C659> <829A> <C65A> <C65A> <829E> <C65B> <C65B> <82A0> <C65C> <C65D> <82A2> <C65E> <C65E> <82A7> <C65F> <C65F> <82B2> <C660> <C661> <82B5> <C662> <C664> <82BA> <C665> <C666> <82BF> <C667> <C668> <82C2> <C669> <C66A> <82C5> <C66B> <C66B> <82C9> <C66C> <C66C> <82D0> <C66D> <C66D> <82D6> <C66E> <C66F> <82D9> <C670> <C670> <82DD> <C671> <C671> <82E2> <C672> <C675> <82E7> <C676> <C678> <82EC> <C679> <C679> <82F0> <C67A> <C67B> <82F2> <C67C> <C67D> <82F5> <C67E> <C67E> <82F8> <C680> <C680> <82FA> <C681> <C685> <82FC> <C686> <C687> <830A> <C688> <C688> <830D> <C689> <C689> <8310> <C68A> <C68B> <8312> <C68C> <C68C> <8316> <C68D> <C68E> <8318> <C68F> <C698> <831D> <C699> <C69A> <8329> <C69B> <C69B> <832E> <C69C> <C69C> <8330> <C69D> <C69D> <8332> <C69E> <C69E> <8337> <C69F> <C69F> <833B> <C6A0> <C6A0> <833D> <C6A1> <C6A1> <5564> <C6A2> <C6A2> <813E> <C6A3> <C6A3> <75B2> <C6A4> <C6A4> <76AE> <C6A5> <C6A5> <5339> <C6A6> <C6A6> <75DE> <C6A7> <C6A7> <50FB> <C6A8> <C6A8> <5C41> <C6A9> <C6A9> <8B6C> <C6AA> <C6AA> <7BC7> <C6AB> <C6AB> <504F> <C6AC> <C6AC> <7247> <C6AD> <C6AD> <9A97> <C6AE> <C6AE> <98D8> <C6AF> <C6AF> <6F02> <C6B0> <C6B0> <74E2> <C6B1> <C6B1> <7968> endbfrange 100 beginbfrange <C6B2> <C6B2> <6487> <C6B3> <C6B3> <77A5> <C6B4> <C6B4> <62FC> <C6B5> <C6B5> <9891> <C6B6> <C6B6> <8D2B> <C6B7> <C6B7> <54C1> <C6B8> <C6B8> <8058> <C6B9> <C6B9> <4E52> <C6BA> <C6BA> <576A> <C6BB> <C6BB> <82F9> <C6BC> <C6BC> <840D> <C6BD> <C6BD> <5E73> <C6BE> <C6BE> <51ED> <C6BF> <C6BF> <74F6> <C6C0> <C6C0> <8BC4> <C6C1> <C6C1> <5C4F> <C6C2> <C6C2> <5761> <C6C3> <C6C3> <6CFC> <C6C4> <C6C4> <9887> <C6C5> <C6C5> <5A46> <C6C6> <C6C6> <7834> <C6C7> <C6C7> <9B44> <C6C8> <C6C8> <8FEB> <C6C9> <C6C9> <7C95> <C6CA> <C6CA> <5256> <C6CB> <C6CB> <6251> <C6CC> <C6CC> <94FA> <C6CD> <C6CD> <4EC6> <C6CE> <C6CE> <8386> <C6CF> <C6CF> <8461> <C6D0> <C6D0> <83E9> <C6D1> <C6D1> <84B2> <C6D2> <C6D2> <57D4> <C6D3> <C6D3> <6734> <C6D4> <C6D4> <5703> <C6D5> <C6D5> <666E> <C6D6> <C6D6> <6D66> <C6D7> <C6D7> <8C31> <C6D8> <C6D8> <66DD> <C6D9> <C6D9> <7011> <C6DA> <C6DA> <671F> <C6DB> <C6DB> <6B3A> <C6DC> <C6DC> <6816> <C6DD> <C6DD> <621A> <C6DE> <C6DE> <59BB> <C6DF> <C6DF> <4E03> <C6E0> <C6E0> <51C4> <C6E1> <C6E1> <6F06> <C6E2> <C6E2> <67D2> <C6E3> <C6E3> <6C8F> <C6E4> <C6E4> <5176> <C6E5> <C6E5> <68CB> <C6E6> <C6E6> <5947> <C6E7> <C6E7> <6B67> <C6E8> <C6E8> <7566> <C6E9> <C6E9> <5D0E> <C6EA> <C6EA> <8110> <C6EB> <C6EB> <9F50> <C6EC> <C6EC> <65D7> <C6ED> <C6ED> <7948> <C6EE> <C6EE> <7941> <C6EF> <C6EF> <9A91> <C6F0> <C6F0> <8D77> <C6F1> <C6F1> <5C82> <C6F2> <C6F2> <4E5E> <C6F3> <C6F3> <4F01> <C6F4> <C6F4> <542F> <C6F5> <C6F5> <5951> <C6F6> <C6F6> <780C> <C6F7> <C6F7> <5668> <C6F8> <C6F8> <6C14> <C6F9> <C6F9> <8FC4> <C6FA> <C6FA> <5F03> <C6FB> <C6FB> <6C7D> <C6FC> <C6FC> <6CE3> <C6FD> <C6FD> <8BAB> <C6FE> <C6FE> <6390> <C740> <C741> <833E> <C742> <C743> <8341> <C744> <C745> <8344> <C746> <C746> <8348> <C747> <C74B> <834A> <C74C> <C74C> <8353> <C74D> <C751> <8355> <C752> <C752> <835D> <C753> <C753> <8362> <C754> <C75A> <8370> <C75B> <C75C> <8379> <C75D> <C763> <837E> <C764> <C765> <8387> <C766> <C769> <838A> <C76A> <C76C> <838F> <C76D> <C770> <8394> <C771> <C772> <8399> <C773> <C773> <839D> <C774> <C774> <839F> <C775> <C77B> <83A1> <C77C> <C77E> <83AC> <C780> <C780> <83AF> <C781> <C781> <83B5> endbfrange 100 beginbfrange <C782> <C782> <83BB> <C783> <C784> <83BE> <C785> <C787> <83C2> <C788> <C788> <83C6> <C789> <C78A> <83C8> <C78B> <C78B> <83CB> <C78C> <C78D> <83CD> <C78E> <C791> <83D0> <C792> <C792> <83D5> <C793> <C793> <83D7> <C794> <C796> <83D9> <C797> <C797> <83DE> <C798> <C79A> <83E2> <C79B> <C79D> <83E6> <C79E> <C7A0> <83EB> <C7A1> <C7A1> <6070> <C7A2> <C7A2> <6D3D> <C7A3> <C7A3> <7275> <C7A4> <C7A4> <6266> <C7A5> <C7A5> <948E> <C7A6> <C7A6> <94C5> <C7A7> <C7A7> <5343> <C7A8> <C7A8> <8FC1> <C7A9> <C7A9> <7B7E> <C7AA> <C7AA> <4EDF> <C7AB> <C7AB> <8C26> <C7AC> <C7AC> <4E7E> <C7AD> <C7AD> <9ED4> <C7AE> <C7AE> <94B1> <C7AF> <C7AF> <94B3> <C7B0> <C7B0> <524D> <C7B1> <C7B1> <6F5C> <C7B2> <C7B2> <9063> <C7B3> <C7B3> <6D45> <C7B4> <C7B4> <8C34> <C7B5> <C7B5> <5811> <C7B6> <C7B6> <5D4C> <C7B7> <C7B7> <6B20> <C7B8> <C7B8> <6B49> <C7B9> <C7B9> <67AA> <C7BA> <C7BA> <545B> <C7BB> <C7BB> <8154> <C7BC> <C7BC> <7F8C> <C7BD> <C7BD> <5899> <C7BE> <C7BE> <8537> <C7BF> <C7BF> <5F3A> <C7C0> <C7C0> <62A2> <C7C1> <C7C1> <6A47> <C7C2> <C7C2> <9539> <C7C3> <C7C3> <6572> <C7C4> <C7C4> <6084> <C7C5> <C7C5> <6865> <C7C6> <C7C6> <77A7> <C7C7> <C7C7> <4E54> <C7C8> <C7C8> <4FA8> <C7C9> <C7C9> <5DE7> <C7CA> <C7CA> <9798> <C7CB> <C7CB> <64AC> <C7CC> <C7CC> <7FD8> <C7CD> <C7CD> <5CED> <C7CE> <C7CE> <4FCF> <C7CF> <C7CF> <7A8D> <C7D0> <C7D0> <5207> <C7D1> <C7D1> <8304> <C7D2> <C7D2> <4E14> <C7D3> <C7D3> <602F> <C7D4> <C7D4> <7A83> <C7D5> <C7D5> <94A6> <C7D6> <C7D6> <4FB5> <C7D7> <C7D7> <4EB2> <C7D8> <C7D8> <79E6> <C7D9> <C7D9> <7434> <C7DA> <C7DA> <52E4> <C7DB> <C7DB> <82B9> <C7DC> <C7DC> <64D2> <C7DD> <C7DD> <79BD> <C7DE> <C7DE> <5BDD> <C7DF> <C7DF> <6C81> <C7E0> <C7E0> <9752> <C7E1> <C7E1> <8F7B> <C7E2> <C7E2> <6C22> <C7E3> <C7E3> <503E> <C7E4> <C7E4> <537F> <C7E5> <C7E5> <6E05> <C7E6> <C7E6> <64CE> <C7E7> <C7E7> <6674> <C7E8> <C7E8> <6C30> <C7E9> <C7E9> <60C5> <C7EA> <C7EA> <9877> <C7EB> <C7EB> <8BF7> <C7EC> <C7EC> <5E86> <C7ED> <C7ED> <743C> <C7EE> <C7EE> <7A77> <C7EF> <C7EF> <79CB> <C7F0> <C7F0> <4E18> <C7F1> <C7F1> <90B1> <C7F2> <C7F2> <7403> <C7F3> <C7F3> <6C42> <C7F4> <C7F4> <56DA> <C7F5> <C7F5> <914B> endbfrange 100 beginbfrange <C7F6> <C7F6> <6CC5> <C7F7> <C7F7> <8D8B> <C7F8> <C7F8> <533A> <C7F9> <C7F9> <86C6> <C7FA> <C7FA> <66F2> <C7FB> <C7FB> <8EAF> <C7FC> <C7FC> <5C48> <C7FD> <C7FD> <9A71> <C7FE> <C7FE> <6E20> <C840> <C841> <83EE> <C842> <C846> <83F3> <C847> <C849> <83FA> <C84A> <C84C> <83FE> <C84D> <C84D> <8402> <C84E> <C84E> <8405> <C84F> <C852> <8407> <C853> <C853> <8410> <C854> <C859> <8412> <C85A> <C85C> <8419> <C85D> <C862> <841E> <C863> <C86A> <8429> <C86B> <C870> <8432> <C871> <C873> <8439> <C874> <C87B> <843E> <C87C> <C87E> <8447> <C880> <C886> <844A> <C887> <C88B> <8452> <C88C> <C88C> <8458> <C88D> <C890> <845D> <C891> <C891> <8462> <C892> <C896> <8464> <C897> <C897> <846A> <C898> <C89A> <846E> <C89B> <C89B> <8472> <C89C> <C89C> <8474> <C89D> <C89D> <8477> <C89E> <C89E> <8479> <C89F> <C8A0> <847B> <C8A1> <C8A1> <53D6> <C8A2> <C8A2> <5A36> <C8A3> <C8A3> <9F8B> <C8A4> <C8A4> <8DA3> <C8A5> <C8A5> <53BB> <C8A6> <C8A6> <5708> <C8A7> <C8A7> <98A7> <C8A8> <C8A8> <6743> <C8A9> <C8A9> <919B> <C8AA> <C8AA> <6CC9> <C8AB> <C8AB> <5168> <C8AC> <C8AC> <75CA> <C8AD> <C8AD> <62F3> <C8AE> <C8AE> <72AC> <C8AF> <C8AF> <5238> <C8B0> <C8B0> <529D> <C8B1> <C8B1> <7F3A> <C8B2> <C8B2> <7094> <C8B3> <C8B3> <7638> <C8B4> <C8B4> <5374> <C8B5> <C8B5> <9E4A> <C8B6> <C8B6> <69B7> <C8B7> <C8B7> <786E> <C8B8> <C8B8> <96C0> <C8B9> <C8B9> <88D9> <C8BA> <C8BA> <7FA4> <C8BB> <C8BB> <7136> <C8BC> <C8BC> <71C3> <C8BD> <C8BD> <5189> <C8BE> <C8BE> <67D3> <C8BF> <C8BF> <74E4> <C8C0> <C8C0> <58E4> <C8C1> <C8C1> <6518> <C8C2> <C8C2> <56B7> <C8C3> <C8C3> <8BA9> <C8C4> <C8C4> <9976> <C8C5> <C8C5> <6270> <C8C6> <C8C6> <7ED5> <C8C7> <C8C7> <60F9> <C8C8> <C8C8> <70ED> <C8C9> <C8C9> <58EC> <C8CA> <C8CA> <4EC1> <C8CB> <C8CB> <4EBA> <C8CC> <C8CC> <5FCD> <C8CD> <C8CD> <97E7> <C8CE> <C8CE> <4EFB> <C8CF> <C8CF> <8BA4> <C8D0> <C8D0> <5203> <C8D1> <C8D1> <598A> <C8D2> <C8D2> <7EAB> <C8D3> <C8D3> <6254> <C8D4> <C8D4> <4ECD> <C8D5> <C8D5> <65E5> <C8D6> <C8D6> <620E> <C8D7> <C8D7> <8338> <C8D8> <C8D8> <84C9> <C8D9> <C8D9> <8363> <C8DA> <C8DA> <878D> <C8DB> <C8DB> <7194> <C8DC> <C8DC> <6EB6> <C8DD> <C8DD> <5BB9> <C8DE> <C8DE> <7ED2> endbfrange 100 beginbfrange <C8DF> <C8DF> <5197> <C8E0> <C8E0> <63C9> <C8E1> <C8E1> <67D4> <C8E2> <C8E2> <8089> <C8E3> <C8E3> <8339> <C8E4> <C8E4> <8815> <C8E5> <C8E5> <5112> <C8E6> <C8E6> <5B7A> <C8E7> <C8E7> <5982> <C8E8> <C8E8> <8FB1> <C8E9> <C8E9> <4E73> <C8EA> <C8EA> <6C5D> <C8EB> <C8EB> <5165> <C8EC> <C8EC> <8925> <C8ED> <C8ED> <8F6F> <C8EE> <C8EE> <962E> <C8EF> <C8EF> <854A> <C8F0> <C8F0> <745E> <C8F1> <C8F1> <9510> <C8F2> <C8F2> <95F0> <C8F3> <C8F3> <6DA6> <C8F4> <C8F4> <82E5> <C8F5> <C8F5> <5F31> <C8F6> <C8F6> <6492> <C8F7> <C8F7> <6D12> <C8F8> <C8F8> <8428> <C8F9> <C8F9> <816E> <C8FA> <C8FA> <9CC3> <C8FB> <C8FB> <585E> <C8FC> <C8FC> <8D5B> <C8FD> <C8FD> <4E09> <C8FE> <C8FE> <53C1> <C940> <C944> <847D> <C945> <C948> <8483> <C949> <C949> <848A> <C94A> <C94A> <848D> <C94B> <C952> <848F> <C953> <C953> <8498> <C954> <C955> <849A> <C956> <C959> <849D> <C95A> <C966> <84A2> <C967> <C968> <84B0> <C969> <C969> <84B3> <C96A> <C96C> <84B5> <C96D> <C96E> <84BB> <C96F> <C96F> <84BE> <C970> <C970> <84C0> <C971> <C972> <84C2> <C973> <C976> <84C5> <C977> <C978> <84CB> <C979> <C97A> <84CE> <C97B> <C97B> <84D2> <C97C> <C97D> <84D4> <C97E> <C97E> <84D7> <C980> <C984> <84D8> <C985> <C985> <84DE> <C986> <C987> <84E1> <C988> <C988> <84E4> <C989> <C98D> <84E7> <C98E> <C990> <84ED> <C991> <C99B> <84F1> <C99C> <C99D> <84FD> <C99E> <C9A0> <8500> <C9A1> <C9A1> <4F1E> <C9A2> <C9A2> <6563> <C9A3> <C9A3> <6851> <C9A4> <C9A4> <55D3> <C9A5> <C9A5> <4E27> <C9A6> <C9A6> <6414> <C9A7> <C9A7> <9A9A> <C9A8> <C9A8> <626B> <C9A9> <C9A9> <5AC2> <C9AA> <C9AA> <745F> <C9AB> <C9AB> <8272> <C9AC> <C9AC> <6DA9> <C9AD> <C9AD> <68EE> <C9AE> <C9AE> <50E7> <C9AF> <C9AF> <838E> <C9B0> <C9B0> <7802> <C9B1> <C9B1> <6740> <C9B2> <C9B2> <5239> <C9B3> <C9B3> <6C99> <C9B4> <C9B4> <7EB1> <C9B5> <C9B5> <50BB> <C9B6> <C9B6> <5565> <C9B7> <C9B7> <715E> <C9B8> <C9B8> <7B5B> <C9B9> <C9B9> <6652> <C9BA> <C9BA> <73CA> <C9BB> <C9BB> <82EB> <C9BC> <C9BC> <6749> <C9BD> <C9BD> <5C71> <C9BE> <C9BE> <5220> <C9BF> <C9BF> <717D> <C9C0> <C9C0> <886B> <C9C1> <C9C1> <95EA> <C9C2> <C9C2> <9655> <C9C3> <C9C3> <64C5> <C9C4> <C9C4> <8D61> <C9C5> <C9C5> <81B3> endbfrange 100 beginbfrange <C9C6> <C9C6> <5584> <C9C7> <C9C7> <6C55> <C9C8> <C9C8> <6247> <C9C9> <C9C9> <7F2E> <C9CA> <C9CA> <5892> <C9CB> <C9CB> <4F24> <C9CC> <C9CC> <5546> <C9CD> <C9CD> <8D4F> <C9CE> <C9CE> <664C> <C9CF> <C9CF> <4E0A> <C9D0> <C9D0> <5C1A> <C9D1> <C9D1> <88F3> <C9D2> <C9D2> <68A2> <C9D3> <C9D3> <634E> <C9D4> <C9D4> <7A0D> <C9D5> <C9D5> <70E7> <C9D6> <C9D6> <828D> <C9D7> <C9D7> <52FA> <C9D8> <C9D8> <97F6> <C9D9> <C9D9> <5C11> <C9DA> <C9DA> <54E8> <C9DB> <C9DB> <90B5> <C9DC> <C9DC> <7ECD> <C9DD> <C9DD> <5962> <C9DE> <C9DE> <8D4A> <C9DF> <C9DF> <86C7> <C9E0> <C9E1> <820C> <C9E2> <C9E2> <8D66> <C9E3> <C9E3> <6444> <C9E4> <C9E4> <5C04> <C9E5> <C9E5> <6151> <C9E6> <C9E6> <6D89> <C9E7> <C9E7> <793E> <C9E8> <C9E8> <8BBE> <C9E9> <C9E9> <7837> <C9EA> <C9EA> <7533> <C9EB> <C9EB> <547B> <C9EC> <C9EC> <4F38> <C9ED> <C9ED> <8EAB> <C9EE> <C9EE> <6DF1> <C9EF> <C9EF> <5A20> <C9F0> <C9F0> <7EC5> <C9F1> <C9F1> <795E> <C9F2> <C9F2> <6C88> <C9F3> <C9F3> <5BA1> <C9F4> <C9F4> <5A76> <C9F5> <C9F5> <751A> <C9F6> <C9F6> <80BE> <C9F7> <C9F7> <614E> <C9F8> <C9F8> <6E17> <C9F9> <C9F9> <58F0> <C9FA> <C9FA> <751F> <C9FB> <C9FB> <7525> <C9FC> <C9FC> <7272> <C9FD> <C9FD> <5347> <C9FE> <C9FE> <7EF3> <CA40> <CA48> <8503> <CA49> <CA4C> <850D> <CA4D> <CA4D> <8512> <CA4E> <CA50> <8514> <CA51> <CA52> <8518> <CA53> <CA56> <851B> <CA57> <CA57> <8520> <CA58> <CA60> <8522> <CA61> <CA6A> <852D> <CA6B> <CA6F> <853E> <CA70> <CA73> <8544> <CA74> <CA7E> <854B> <CA80> <CA81> <8557> <CA82> <CA85> <855A> <CA86> <CA8A> <855F> <CA8B> <CA8D> <8565> <CA8E> <CA96> <8569> <CA97> <CA97> <8573> <CA98> <CA9B> <8575> <CA9C> <CA9D> <857C> <CA9E> <CAA0> <857F> <CAA1> <CAA1> <7701> <CAA2> <CAA2> <76DB> <CAA3> <CAA3> <5269> <CAA4> <CAA4> <80DC> <CAA5> <CAA5> <5723> <CAA6> <CAA6> <5E08> <CAA7> <CAA7> <5931> <CAA8> <CAA8> <72EE> <CAA9> <CAA9> <65BD> <CAAA> <CAAA> <6E7F> <CAAB> <CAAB> <8BD7> <CAAC> <CAAC> <5C38> <CAAD> <CAAD> <8671> <CAAE> <CAAE> <5341> <CAAF> <CAAF> <77F3> <CAB0> <CAB0> <62FE> <CAB1> <CAB1> <65F6> <CAB2> <CAB2> <4EC0> <CAB3> <CAB3> <98DF> <CAB4> <CAB4> <8680> <CAB5> <CAB5> <5B9E> <CAB6> <CAB6> <8BC6> <CAB7> <CAB7> <53F2> endbfrange 100 beginbfrange <CAB8> <CAB8> <77E2> <CAB9> <CAB9> <4F7F> <CABA> <CABA> <5C4E> <CABB> <CABB> <9A76> <CABC> <CABC> <59CB> <CABD> <CABD> <5F0F> <CABE> <CABE> <793A> <CABF> <CABF> <58EB> <CAC0> <CAC0> <4E16> <CAC1> <CAC1> <67FF> <CAC2> <CAC2> <4E8B> <CAC3> <CAC3> <62ED> <CAC4> <CAC4> <8A93> <CAC5> <CAC5> <901D> <CAC6> <CAC6> <52BF> <CAC7> <CAC7> <662F> <CAC8> <CAC8> <55DC> <CAC9> <CAC9> <566C> <CACA> <CACA> <9002> <CACB> <CACB> <4ED5> <CACC> <CACC> <4F8D> <CACD> <CACD> <91CA> <CACE> <CACE> <9970> <CACF> <CACF> <6C0F> <CAD0> <CAD0> <5E02> <CAD1> <CAD1> <6043> <CAD2> <CAD2> <5BA4> <CAD3> <CAD3> <89C6> <CAD4> <CAD4> <8BD5> <CAD5> <CAD5> <6536> <CAD6> <CAD6> <624B> <CAD7> <CAD7> <9996> <CAD8> <CAD8> <5B88> <CAD9> <CAD9> <5BFF> <CADA> <CADA> <6388> <CADB> <CADB> <552E> <CADC> <CADC> <53D7> <CADD> <CADD> <7626> <CADE> <CADE> <517D> <CADF> <CADF> <852C> <CAE0> <CAE0> <67A2> <CAE1> <CAE1> <68B3> <CAE2> <CAE2> <6B8A> <CAE3> <CAE3> <6292> <CAE4> <CAE4> <8F93> <CAE5> <CAE5> <53D4> <CAE6> <CAE6> <8212> <CAE7> <CAE7> <6DD1> <CAE8> <CAE8> <758F> <CAE9> <CAE9> <4E66> <CAEA> <CAEA> <8D4E> <CAEB> <CAEB> <5B70> <CAEC> <CAEC> <719F> <CAED> <CAED> <85AF> <CAEE> <CAEE> <6691> <CAEF> <CAEF> <66D9> <CAF0> <CAF0> <7F72> <CAF1> <CAF1> <8700> <CAF2> <CAF2> <9ECD> <CAF3> <CAF3> <9F20> <CAF4> <CAF4> <5C5E> <CAF5> <CAF5> <672F> <CAF6> <CAF6> <8FF0> <CAF7> <CAF7> <6811> <CAF8> <CAF8> <675F> <CAF9> <CAF9> <620D> <CAFA> <CAFA> <7AD6> <CAFB> <CAFB> <5885> <CAFC> <CAFC> <5EB6> <CAFD> <CAFD> <6570> <CAFE> <CAFE> <6F31> <CB40> <CB41> <8582> <CB42> <CB42> <8586> <CB43> <CB49> <8588> <CB4A> <CB54> <8590> <CB55> <CB5B> <859D> <CB5C> <CB5E> <85A5> <CB5F> <CB5F> <85A9> <CB60> <CB62> <85AB> <CB63> <CB68> <85B1> <CB69> <CB69> <85B8> <CB6A> <CB70> <85BA> <CB71> <CB77> <85C2> <CB78> <CB7C> <85CA> <CB7D> <CB7E> <85D1> <CB80> <CB80> <85D4> <CB81> <CB86> <85D6> <CB87> <CB8D> <85DD> <CB8E> <CB91> <85E5> <CB92> <CBA0> <85EA> <CBA1> <CBA1> <6055> <CBA2> <CBA2> <5237> <CBA3> <CBA3> <800D> <CBA4> <CBA4> <6454> <CBA5> <CBA5> <8870> <CBA6> <CBA6> <7529> <CBA7> <CBA7> <5E05> <CBA8> <CBA8> <6813> <CBA9> <CBA9> <62F4> <CBAA> <CBAA> <971C> endbfrange 100 beginbfrange <CBAB> <CBAB> <53CC> <CBAC> <CBAC> <723D> <CBAD> <CBAD> <8C01> <CBAE> <CBAE> <6C34> <CBAF> <CBAF> <7761> <CBB0> <CBB0> <7A0E> <CBB1> <CBB1> <542E> <CBB2> <CBB2> <77AC> <CBB3> <CBB3> <987A> <CBB4> <CBB4> <821C> <CBB5> <CBB5> <8BF4> <CBB6> <CBB6> <7855> <CBB7> <CBB7> <6714> <CBB8> <CBB8> <70C1> <CBB9> <CBB9> <65AF> <CBBA> <CBBA> <6495> <CBBB> <CBBB> <5636> <CBBC> <CBBC> <601D> <CBBD> <CBBD> <79C1> <CBBE> <CBBE> <53F8> <CBBF> <CBBF> <4E1D> <CBC0> <CBC0> <6B7B> <CBC1> <CBC1> <8086> <CBC2> <CBC2> <5BFA> <CBC3> <CBC3> <55E3> <CBC4> <CBC4> <56DB> <CBC5> <CBC5> <4F3A> <CBC6> <CBC6> <4F3C> <CBC7> <CBC7> <9972> <CBC8> <CBC8> <5DF3> <CBC9> <CBC9> <677E> <CBCA> <CBCA> <8038> <CBCB> <CBCB> <6002> <CBCC> <CBCC> <9882> <CBCD> <CBCD> <9001> <CBCE> <CBCE> <5B8B> <CBCF> <CBCF> <8BBC> <CBD0> <CBD0> <8BF5> <CBD1> <CBD1> <641C> <CBD2> <CBD2> <8258> <CBD3> <CBD3> <64DE> <CBD4> <CBD4> <55FD> <CBD5> <CBD5> <82CF> <CBD6> <CBD6> <9165> <CBD7> <CBD7> <4FD7> <CBD8> <CBD8> <7D20> <CBD9> <CBD9> <901F> <CBDA> <CBDA> <7C9F> <CBDB> <CBDB> <50F3> <CBDC> <CBDC> <5851> <CBDD> <CBDD> <6EAF> <CBDE> <CBDE> <5BBF> <CBDF> <CBDF> <8BC9> <CBE0> <CBE0> <8083> <CBE1> <CBE1> <9178> <CBE2> <CBE2> <849C> <CBE3> <CBE3> <7B97> <CBE4> <CBE4> <867D> <CBE5> <CBE5> <968B> <CBE6> <CBE6> <968F> <CBE7> <CBE7> <7EE5> <CBE8> <CBE8> <9AD3> <CBE9> <CBE9> <788E> <CBEA> <CBEA> <5C81> <CBEB> <CBEB> <7A57> <CBEC> <CBEC> <9042> <CBED> <CBED> <96A7> <CBEE> <CBEE> <795F> <CBEF> <CBEF> <5B59> <CBF0> <CBF0> <635F> <CBF1> <CBF1> <7B0B> <CBF2> <CBF2> <84D1> <CBF3> <CBF3> <68AD> <CBF4> <CBF4> <5506> <CBF5> <CBF5> <7F29> <CBF6> <CBF6> <7410> <CBF7> <CBF7> <7D22> <CBF8> <CBF8> <9501> <CBF9> <CBF9> <6240> <CBFA> <CBFA> <584C> <CBFB> <CBFB> <4ED6> <CBFC> <CBFC> <5B83> <CBFD> <CBFD> <5979> <CBFE> <CBFE> <5854> <CC40> <CC41> <85F9> <CC42> <CC44> <85FC> <CC45> <CC49> <8600> <CC4A> <CC54> <8606> <CC55> <CC58> <8612> <CC59> <CC68> <8617> <CC69> <CC69> <8628> <CC6A> <CC77> <862A> <CC78> <CC7A> <8639> <CC7B> <CC7E> <863D> <CC80> <CC8B> <8641> <CC8C> <CC8D> <8652> <CC8E> <CC92> <8655> <CC93> <CC95> <865B> <CC96> <CC98> <865F> <CC99> <CCA0> <8663> endbfrange 100 beginbfrange <CCA1> <CCA1> <736D> <CCA2> <CCA2> <631E> <CCA3> <CCA3> <8E4B> <CCA4> <CCA4> <8E0F> <CCA5> <CCA5> <80CE> <CCA6> <CCA6> <82D4> <CCA7> <CCA7> <62AC> <CCA8> <CCA8> <53F0> <CCA9> <CCA9> <6CF0> <CCAA> <CCAA> <915E> <CCAB> <CCAB> <592A> <CCAC> <CCAC> <6001> <CCAD> <CCAD> <6C70> <CCAE> <CCAE> <574D> <CCAF> <CCAF> <644A> <CCB0> <CCB0> <8D2A> <CCB1> <CCB1> <762B> <CCB2> <CCB2> <6EE9> <CCB3> <CCB3> <575B> <CCB4> <CCB4> <6A80> <CCB5> <CCB5> <75F0> <CCB6> <CCB6> <6F6D> <CCB7> <CCB7> <8C2D> <CCB8> <CCB8> <8C08> <CCB9> <CCB9> <5766> <CCBA> <CCBA> <6BEF> <CCBB> <CCBB> <8892> <CCBC> <CCBC> <78B3> <CCBD> <CCBD> <63A2> <CCBE> <CCBE> <53F9> <CCBF> <CCBF> <70AD> <CCC0> <CCC0> <6C64> <CCC1> <CCC1> <5858> <CCC2> <CCC2> <642A> <CCC3> <CCC3> <5802> <CCC4> <CCC4> <68E0> <CCC5> <CCC5> <819B> <CCC6> <CCC6> <5510> <CCC7> <CCC7> <7CD6> <CCC8> <CCC8> <5018> <CCC9> <CCC9> <8EBA> <CCCA> <CCCA> <6DCC> <CCCB> <CCCB> <8D9F> <CCCC> <CCCC> <70EB> <CCCD> <CCCD> <638F> <CCCE> <CCCE> <6D9B> <CCCF> <CCCF> <6ED4> <CCD0> <CCD0> <7EE6> <CCD1> <CCD1> <8404> <CCD2> <CCD2> <6843> <CCD3> <CCD3> <9003> <CCD4> <CCD4> <6DD8> <CCD5> <CCD5> <9676> <CCD6> <CCD6> <8BA8> <CCD7> <CCD7> <5957> <CCD8> <CCD8> <7279> <CCD9> <CCD9> <85E4> <CCDA> <CCDA> <817E> <CCDB> <CCDB> <75BC> <CCDC> <CCDC> <8A8A> <CCDD> <CCDD> <68AF> <CCDE> <CCDE> <5254> <CCDF> <CCDF> <8E22> <CCE0> <CCE0> <9511> <CCE1> <CCE1> <63D0> <CCE2> <CCE2> <9898> <CCE3> <CCE3> <8E44> <CCE4> <CCE4> <557C> <CCE5> <CCE5> <4F53> <CCE6> <CCE6> <66FF> <CCE7> <CCE7> <568F> <CCE8> <CCE8> <60D5> <CCE9> <CCE9> <6D95> <CCEA> <CCEA> <5243> <CCEB> <CCEB> <5C49> <CCEC> <CCEC> <5929> <CCED> <CCED> <6DFB> <CCEE> <CCEE> <586B> <CCEF> <CCEF> <7530> <CCF0> <CCF0> <751C> <CCF1> <CCF1> <606C> <CCF2> <CCF2> <8214> <CCF3> <CCF3> <8146> <CCF4> <CCF4> <6311> <CCF5> <CCF5> <6761> <CCF6> <CCF6> <8FE2> <CCF7> <CCF7> <773A> <CCF8> <CCF8> <8DF3> <CCF9> <CCF9> <8D34> <CCFA> <CCFA> <94C1> <CCFB> <CCFB> <5E16> <CCFC> <CCFC> <5385> <CCFD> <CCFD> <542C> <CCFE> <CCFE> <70C3> <CD40> <CD40> <866D> <CD41> <CD42> <866F> <CD43> <CD49> <8672> <CD4A> <CD50> <8683> <CD51> <CD55> <868E> <CD56> <CD56> <8694> endbfrange 100 beginbfrange <CD57> <CD5C> <8696> <CD5D> <CD61> <869E> <CD62> <CD63> <86A5> <CD64> <CD64> <86AB> <CD65> <CD66> <86AD> <CD67> <CD68> <86B2> <CD69> <CD6B> <86B7> <CD6C> <CD70> <86BB> <CD71> <CD73> <86C1> <CD74> <CD74> <86C5> <CD75> <CD75> <86C8> <CD76> <CD77> <86CC> <CD78> <CD79> <86D2> <CD7A> <CD7C> <86D5> <CD7D> <CD7D> <86DA> <CD7E> <CD7E> <86DC> <CD80> <CD80> <86DD> <CD81> <CD84> <86E0> <CD85> <CD88> <86E5> <CD89> <CD8B> <86EA> <CD8C> <CD8C> <86EF> <CD8D> <CD8F> <86F5> <CD90> <CD93> <86FA> <CD94> <CD94> <86FF> <CD95> <CD95> <8701> <CD96> <CD98> <8704> <CD99> <CD9A> <870B> <CD9B> <CD9E> <870E> <CD9F> <CD9F> <8714> <CDA0> <CDA0> <8716> <CDA1> <CDA1> <6C40> <CDA2> <CDA2> <5EF7> <CDA3> <CDA3> <505C> <CDA4> <CDA4> <4EAD> <CDA5> <CDA5> <5EAD> <CDA6> <CDA6> <633A> <CDA7> <CDA7> <8247> <CDA8> <CDA8> <901A> <CDA9> <CDA9> <6850> <CDAA> <CDAA> <916E> <CDAB> <CDAB> <77B3> <CDAC> <CDAC> <540C> <CDAD> <CDAD> <94DC> <CDAE> <CDAE> <5F64> <CDAF> <CDAF> <7AE5> <CDB0> <CDB0> <6876> <CDB1> <CDB1> <6345> <CDB2> <CDB2> <7B52> <CDB3> <CDB3> <7EDF> <CDB4> <CDB4> <75DB> <CDB5> <CDB5> <5077> <CDB6> <CDB6> <6295> <CDB7> <CDB7> <5934> <CDB8> <CDB8> <900F> <CDB9> <CDB9> <51F8> <CDBA> <CDBA> <79C3> <CDBB> <CDBB> <7A81> <CDBC> <CDBC> <56FE> <CDBD> <CDBD> <5F92> <CDBE> <CDBE> <9014> <CDBF> <CDBF> <6D82> <CDC0> <CDC0> <5C60> <CDC1> <CDC1> <571F> <CDC2> <CDC2> <5410> <CDC3> <CDC3> <5154> <CDC4> <CDC4> <6E4D> <CDC5> <CDC5> <56E2> <CDC6> <CDC6> <63A8> <CDC7> <CDC7> <9893> <CDC8> <CDC8> <817F> <CDC9> <CDC9> <8715> <CDCA> <CDCA> <892A> <CDCB> <CDCB> <9000> <CDCC> <CDCC> <541E> <CDCD> <CDCD> <5C6F> <CDCE> <CDCE> <81C0> <CDCF> <CDCF> <62D6> <CDD0> <CDD0> <6258> <CDD1> <CDD1> <8131> <CDD2> <CDD2> <9E35> <CDD3> <CDD3> <9640> <CDD4> <CDD4> <9A6E> <CDD5> <CDD5> <9A7C> <CDD6> <CDD6> <692D> <CDD7> <CDD7> <59A5> <CDD8> <CDD8> <62D3> <CDD9> <CDD9> <553E> <CDDA> <CDDA> <6316> <CDDB> <CDDB> <54C7> <CDDC> <CDDC> <86D9> <CDDD> <CDDD> <6D3C> <CDDE> <CDDE> <5A03> <CDDF> <CDDF> <74E6> <CDE0> <CDE0> <889C> <CDE1> <CDE1> <6B6A> <CDE2> <CDE2> <5916> <CDE3> <CDE3> <8C4C> <CDE4> <CDE4> <5F2F> <CDE5> <CDE5> <6E7E> <CDE6> <CDE6> <73A9> endbfrange 100 beginbfrange <CDE7> <CDE7> <987D> <CDE8> <CDE8> <4E38> <CDE9> <CDE9> <70F7> <CDEA> <CDEA> <5B8C> <CDEB> <CDEB> <7897> <CDEC> <CDEC> <633D> <CDED> <CDED> <665A> <CDEE> <CDEE> <7696> <CDEF> <CDEF> <60CB> <CDF0> <CDF0> <5B9B> <CDF1> <CDF1> <5A49> <CDF2> <CDF2> <4E07> <CDF3> <CDF3> <8155> <CDF4> <CDF4> <6C6A> <CDF5> <CDF5> <738B> <CDF6> <CDF6> <4EA1> <CDF7> <CDF7> <6789> <CDF8> <CDF8> <7F51> <CDF9> <CDF9> <5F80> <CDFA> <CDFA> <65FA> <CDFB> <CDFB> <671B> <CDFC> <CDFC> <5FD8> <CDFD> <CDFD> <5984> <CDFE> <CDFE> <5A01> <CE40> <CE40> <8719> <CE41> <CE41> <871B> <CE42> <CE42> <871D> <CE43> <CE44> <871F> <CE45> <CE45> <8724> <CE46> <CE48> <8726> <CE49> <CE4C> <872A> <CE4D> <CE4E> <872F> <CE4F> <CE50> <8732> <CE51> <CE52> <8735> <CE53> <CE55> <8738> <CE56> <CE57> <873C> <CE58> <CE5E> <8740> <CE5F> <CE60> <874A> <CE61> <CE61> <874D> <CE62> <CE65> <874F> <CE66> <CE68> <8754> <CE69> <CE69> <8758> <CE6A> <CE6F> <875A> <CE70> <CE71> <8761> <CE72> <CE79> <8766> <CE7A> <CE7A> <876F> <CE7B> <CE7D> <8771> <CE7E> <CE7E> <8775> <CE80> <CE83> <8777> <CE84> <CE86> <877F> <CE87> <CE87> <8784> <CE88> <CE89> <8786> <CE8A> <CE8B> <8789> <CE8C> <CE8C> <878C> <CE8D> <CE91> <878E> <CE92> <CE94> <8794> <CE95> <CE9B> <8798> <CE9C> <CEA0> <87A0> <CEA1> <CEA1> <5DCD> <CEA2> <CEA2> <5FAE> <CEA3> <CEA3> <5371> <CEA4> <CEA4> <97E6> <CEA5> <CEA5> <8FDD> <CEA6> <CEA6> <6845> <CEA7> <CEA7> <56F4> <CEA8> <CEA8> <552F> <CEA9> <CEA9> <60DF> <CEAA> <CEAA> <4E3A> <CEAB> <CEAB> <6F4D> <CEAC> <CEAC> <7EF4> <CEAD> <CEAD> <82C7> <CEAE> <CEAE> <840E> <CEAF> <CEAF> <59D4> <CEB0> <CEB0> <4F1F> <CEB1> <CEB1> <4F2A> <CEB2> <CEB2> <5C3E> <CEB3> <CEB3> <7EAC> <CEB4> <CEB4> <672A> <CEB5> <CEB5> <851A> <CEB6> <CEB6> <5473> <CEB7> <CEB7> <754F> <CEB8> <CEB8> <80C3> <CEB9> <CEB9> <5582> <CEBA> <CEBA> <9B4F> <CEBB> <CEBB> <4F4D> <CEBC> <CEBC> <6E2D> <CEBD> <CEBD> <8C13> <CEBE> <CEBE> <5C09> <CEBF> <CEBF> <6170> <CEC0> <CEC0> <536B> <CEC1> <CEC1> <761F> <CEC2> <CEC2> <6E29> <CEC3> <CEC3> <868A> <CEC4> <CEC4> <6587> <CEC5> <CEC5> <95FB> <CEC6> <CEC6> <7EB9> <CEC7> <CEC7> <543B> <CEC8> <CEC8> <7A33> <CEC9> <CEC9> <7D0A> <CECA> <CECA> <95EE> endbfrange 100 beginbfrange <CECB> <CECB> <55E1> <CECC> <CECC> <7FC1> <CECD> <CECD> <74EE> <CECE> <CECE> <631D> <CECF> <CECF> <8717> <CED0> <CED0> <6DA1> <CED1> <CED1> <7A9D> <CED2> <CED2> <6211> <CED3> <CED3> <65A1> <CED4> <CED4> <5367> <CED5> <CED5> <63E1> <CED6> <CED6> <6C83> <CED7> <CED7> <5DEB> <CED8> <CED8> <545C> <CED9> <CED9> <94A8> <CEDA> <CEDA> <4E4C> <CEDB> <CEDB> <6C61> <CEDC> <CEDC> <8BEC> <CEDD> <CEDD> <5C4B> <CEDE> <CEDE> <65E0> <CEDF> <CEDF> <829C> <CEE0> <CEE0> <68A7> <CEE1> <CEE1> <543E> <CEE2> <CEE2> <5434> <CEE3> <CEE3> <6BCB> <CEE4> <CEE4> <6B66> <CEE5> <CEE5> <4E94> <CEE6> <CEE6> <6342> <CEE7> <CEE7> <5348> <CEE8> <CEE8> <821E> <CEE9> <CEE9> <4F0D> <CEEA> <CEEA> <4FAE> <CEEB> <CEEB> <575E> <CEEC> <CEEC> <620A> <CEED> <CEED> <96FE> <CEEE> <CEEE> <6664> <CEEF> <CEEF> <7269> <CEF0> <CEF0> <52FF> <CEF1> <CEF1> <52A1> <CEF2> <CEF2> <609F> <CEF3> <CEF3> <8BEF> <CEF4> <CEF4> <6614> <CEF5> <CEF5> <7199> <CEF6> <CEF6> <6790> <CEF7> <CEF7> <897F> <CEF8> <CEF8> <7852> <CEF9> <CEF9> <77FD> <CEFA> <CEFA> <6670> <CEFB> <CEFB> <563B> <CEFC> <CEFC> <5438> <CEFD> <CEFD> <9521> <CEFE> <CEFE> <727A> <CF40> <CF42> <87A5> <CF43> <CF44> <87A9> <CF45> <CF45> <87AE> <CF46> <CF48> <87B0> <CF49> <CF49> <87B4> <CF4A> <CF4D> <87B6> <CF4E> <CF4F> <87BB> <CF50> <CF51> <87BE> <CF52> <CF56> <87C1> <CF57> <CF59> <87C7> <CF5A> <CF5E> <87CC> <CF5F> <CF65> <87D4> <CF66> <CF69> <87DC> <CF6A> <CF6D> <87E1> <CF6E> <CF71> <87E6> <CF72> <CF74> <87EB> <CF75> <CF7E> <87EF> <CF80> <CF83> <87FA> <CF84> <CF87> <87FF> <CF88> <CF8D> <8804> <CF8E> <CF95> <880B> <CF96> <CF96> <8814> <CF97> <CF9A> <8817> <CF9B> <CF9F> <881C> <CFA0> <CFA0> <8823> <CFA1> <CFA1> <7A00> <CFA2> <CFA2> <606F> <CFA3> <CFA3> <5E0C> <CFA4> <CFA4> <6089> <CFA5> <CFA5> <819D> <CFA6> <CFA6> <5915> <CFA7> <CFA7> <60DC> <CFA8> <CFA8> <7184> <CFA9> <CFA9> <70EF> <CFAA> <CFAA> <6EAA> <CFAB> <CFAB> <6C50> <CFAC> <CFAC> <7280> <CFAD> <CFAD> <6A84> <CFAE> <CFAE> <88AD> <CFAF> <CFAF> <5E2D> <CFB0> <CFB0> <4E60> <CFB1> <CFB1> <5AB3> <CFB2> <CFB2> <559C> <CFB3> <CFB3> <94E3> <CFB4> <CFB4> <6D17> <CFB5> <CFB5> <7CFB> <CFB6> <CFB6> <9699> <CFB7> <CFB7> <620F> endbfrange 100 beginbfrange <CFB8> <CFB8> <7EC6> <CFB9> <CFB9> <778E> <CFBA> <CFBA> <867E> <CFBB> <CFBB> <5323> <CFBC> <CFBC> <971E> <CFBD> <CFBD> <8F96> <CFBE> <CFBE> <6687> <CFBF> <CFBF> <5CE1> <CFC0> <CFC0> <4FA0> <CFC1> <CFC1> <72ED> <CFC2> <CFC2> <4E0B> <CFC3> <CFC3> <53A6> <CFC4> <CFC4> <590F> <CFC5> <CFC5> <5413> <CFC6> <CFC6> <6380> <CFC7> <CFC7> <9528> <CFC8> <CFC8> <5148> <CFC9> <CFC9> <4ED9> <CFCA> <CFCA> <9C9C> <CFCB> <CFCB> <7EA4> <CFCC> <CFCC> <54B8> <CFCD> <CFCD> <8D24> <CFCE> <CFCE> <8854> <CFCF> <CFCF> <8237> <CFD0> <CFD0> <95F2> <CFD1> <CFD1> <6D8E> <CFD2> <CFD2> <5F26> <CFD3> <CFD3> <5ACC> <CFD4> <CFD4> <663E> <CFD5> <CFD5> <9669> <CFD6> <CFD6> <73B0> <CFD7> <CFD7> <732E> <CFD8> <CFD8> <53BF> <CFD9> <CFD9> <817A> <CFDA> <CFDA> <9985> <CFDB> <CFDB> <7FA1> <CFDC> <CFDC> <5BAA> <CFDD> <CFDD> <9677> <CFDE> <CFDE> <9650> <CFDF> <CFDF> <7EBF> <CFE0> <CFE0> <76F8> <CFE1> <CFE1> <53A2> <CFE2> <CFE2> <9576> <CFE3> <CFE3> <9999> <CFE4> <CFE4> <7BB1> <CFE5> <CFE5> <8944> <CFE6> <CFE6> <6E58> <CFE7> <CFE7> <4E61> <CFE8> <CFE8> <7FD4> <CFE9> <CFE9> <7965> <CFEA> <CFEA> <8BE6> <CFEB> <CFEB> <60F3> <CFEC> <CFEC> <54CD> <CFED> <CFED> <4EAB> <CFEE> <CFEE> <9879> <CFEF> <CFEF> <5DF7> <CFF0> <CFF0> <6A61> <CFF1> <CFF1> <50CF> <CFF2> <CFF2> <5411> <CFF3> <CFF3> <8C61> <CFF4> <CFF4> <8427> <CFF5> <CFF5> <785D> <CFF6> <CFF6> <9704> <CFF7> <CFF7> <524A> <CFF8> <CFF8> <54EE> <CFF9> <CFF9> <56A3> <CFFA> <CFFA> <9500> <CFFB> <CFFB> <6D88> <CFFC> <CFFC> <5BB5> <CFFD> <CFFD> <6DC6> <CFFE> <CFFE> <6653> <D040> <D04D> <8824> <D04E> <D053> <8833> <D054> <D055> <883A> <D056> <D058> <883D> <D059> <D05B> <8841> <D05C> <D061> <8846> <D062> <D067> <884E> <D068> <D069> <8855> <D06A> <D06A> <8858> <D06B> <D071> <885A> <D072> <D073> <8866> <D074> <D074> <886A> <D075> <D075> <886D> <D076> <D076> <886F> <D077> <D077> <8871> <D078> <D07B> <8873> <D07C> <D07E> <8878> <D080> <D081> <887B> <D082> <D082> <8880> <D083> <D083> <8883> <D084> <D085> <8886> <D086> <D087> <8889> <D088> <D088> <888C> <D089> <D08C> <888E> <D08D> <D08F> <8893> <D090> <D094> <8897> <D095> <D099> <889D> <D09A> <D09A> <88A3> <D09B> <D0A0> <88A5> endbfrange 100 beginbfrange <D0A1> <D0A1> <5C0F> <D0A2> <D0A2> <5B5D> <D0A3> <D0A3> <6821> <D0A4> <D0A4> <8096> <D0A5> <D0A5> <5578> <D0A6> <D0A6> <7B11> <D0A7> <D0A7> <6548> <D0A8> <D0A8> <6954> <D0A9> <D0A9> <4E9B> <D0AA> <D0AA> <6B47> <D0AB> <D0AB> <874E> <D0AC> <D0AC> <978B> <D0AD> <D0AD> <534F> <D0AE> <D0AE> <631F> <D0AF> <D0AF> <643A> <D0B0> <D0B0> <90AA> <D0B1> <D0B1> <659C> <D0B2> <D0B2> <80C1> <D0B3> <D0B3> <8C10> <D0B4> <D0B4> <5199> <D0B5> <D0B5> <68B0> <D0B6> <D0B6> <5378> <D0B7> <D0B7> <87F9> <D0B8> <D0B8> <61C8> <D0B9> <D0B9> <6CC4> <D0BA> <D0BA> <6CFB> <D0BB> <D0BB> <8C22> <D0BC> <D0BC> <5C51> <D0BD> <D0BD> <85AA> <D0BE> <D0BE> <82AF> <D0BF> <D0BF> <950C> <D0C0> <D0C0> <6B23> <D0C1> <D0C1> <8F9B> <D0C2> <D0C2> <65B0> <D0C3> <D0C3> <5FFB> <D0C4> <D0C4> <5FC3> <D0C5> <D0C5> <4FE1> <D0C6> <D0C6> <8845> <D0C7> <D0C7> <661F> <D0C8> <D0C8> <8165> <D0C9> <D0C9> <7329> <D0CA> <D0CA> <60FA> <D0CB> <D0CB> <5174> <D0CC> <D0CC> <5211> <D0CD> <D0CD> <578B> <D0CE> <D0CE> <5F62> <D0CF> <D0CF> <90A2> <D0D0> <D0D0> <884C> <D0D1> <D0D1> <9192> <D0D2> <D0D2> <5E78> <D0D3> <D0D3> <674F> <D0D4> <D0D4> <6027> <D0D5> <D0D5> <59D3> <D0D6> <D0D6> <5144> <D0D7> <D0D7> <51F6> <D0D8> <D0D8> <80F8> <D0D9> <D0D9> <5308> <D0DA> <D0DA> <6C79> <D0DB> <D0DB> <96C4> <D0DC> <D0DC> <718A> <D0DD> <D0DD> <4F11> <D0DE> <D0DE> <4FEE> <D0DF> <D0DF> <7F9E> <D0E0> <D0E0> <673D> <D0E1> <D0E1> <55C5> <D0E2> <D0E2> <9508> <D0E3> <D0E3> <79C0> <D0E4> <D0E4> <8896> <D0E5> <D0E5> <7EE3> <D0E6> <D0E6> <589F> <D0E7> <D0E7> <620C> <D0E8> <D0E8> <9700> <D0E9> <D0E9> <865A> <D0EA> <D0EA> <5618> <D0EB> <D0EB> <987B> <D0EC> <D0EC> <5F90> <D0ED> <D0ED> <8BB8> <D0EE> <D0EE> <84C4> <D0EF> <D0EF> <9157> <D0F0> <D0F0> <53D9> <D0F1> <D0F1> <65ED> <D0F2> <D0F2> <5E8F> <D0F3> <D0F3> <755C> <D0F4> <D0F4> <6064> <D0F5> <D0F5> <7D6E> <D0F6> <D0F6> <5A7F> <D0F7> <D0F7> <7EEA> <D0F8> <D0F8> <7EED> <D0F9> <D0F9> <8F69> <D0FA> <D0FA> <55A7> <D0FB> <D0FB> <5BA3> <D0FC> <D0FC> <60AC> <D0FD> <D0FD> <65CB> <D0FE> <D0FE> <7384> <D140> <D140> <88AC> <D141> <D143> <88AE> <D144> <D148> <88B2> <D149> <D14C> <88B8> <D14D> <D150> <88BD> <D151> <D152> <88C3> endbfrange 100 beginbfrange <D153> <D154> <88C7> <D155> <D158> <88CA> <D159> <D15B> <88CF> <D15C> <D15C> <88D3> <D15D> <D15E> <88D6> <D15F> <D163> <88DA> <D164> <D165> <88E0> <D166> <D167> <88E6> <D168> <D16E> <88E9> <D16F> <D16F> <88F2> <D170> <D172> <88F5> <D173> <D174> <88FA> <D175> <D175> <88FD> <D176> <D178> <88FF> <D179> <D17E> <8903> <D180> <D180> <8909> <D181> <D185> <890B> <D186> <D186> <8911> <D187> <D18B> <8914> <D18C> <D190> <891C> <D191> <D193> <8922> <D194> <D197> <8926> <D198> <D19B> <892C> <D19C> <D19E> <8931> <D19F> <D19F> <8935> <D1A0> <D1A0> <8937> <D1A1> <D1A1> <9009> <D1A2> <D1A2> <7663> <D1A3> <D1A3> <7729> <D1A4> <D1A4> <7EDA> <D1A5> <D1A5> <9774> <D1A6> <D1A6> <859B> <D1A7> <D1A7> <5B66> <D1A8> <D1A8> <7A74> <D1A9> <D1A9> <96EA> <D1AA> <D1AA> <8840> <D1AB> <D1AB> <52CB> <D1AC> <D1AC> <718F> <D1AD> <D1AD> <5FAA> <D1AE> <D1AE> <65EC> <D1AF> <D1AF> <8BE2> <D1B0> <D1B0> <5BFB> <D1B1> <D1B1> <9A6F> <D1B2> <D1B2> <5DE1> <D1B3> <D1B3> <6B89> <D1B4> <D1B4> <6C5B> <D1B5> <D1B5> <8BAD> <D1B6> <D1B6> <8BAF> <D1B7> <D1B7> <900A> <D1B8> <D1B8> <8FC5> <D1B9> <D1B9> <538B> <D1BA> <D1BA> <62BC> <D1BB> <D1BB> <9E26> <D1BC> <D1BC> <9E2D> <D1BD> <D1BD> <5440> <D1BE> <D1BE> <4E2B> <D1BF> <D1BF> <82BD> <D1C0> <D1C0> <7259> <D1C1> <D1C1> <869C> <D1C2> <D1C2> <5D16> <D1C3> <D1C3> <8859> <D1C4> <D1C4> <6DAF> <D1C5> <D1C5> <96C5> <D1C6> <D1C6> <54D1> <D1C7> <D1C7> <4E9A> <D1C8> <D1C8> <8BB6> <D1C9> <D1C9> <7109> <D1CA> <D1CA> <54BD> <D1CB> <D1CB> <9609> <D1CC> <D1CC> <70DF> <D1CD> <D1CD> <6DF9> <D1CE> <D1CE> <76D0> <D1CF> <D1CF> <4E25> <D1D0> <D1D0> <7814> <D1D1> <D1D1> <8712> <D1D2> <D1D2> <5CA9> <D1D3> <D1D3> <5EF6> <D1D4> <D1D4> <8A00> <D1D5> <D1D5> <989C> <D1D6> <D1D6> <960E> <D1D7> <D1D7> <708E> <D1D8> <D1D8> <6CBF> <D1D9> <D1D9> <5944> <D1DA> <D1DA> <63A9> <D1DB> <D1DB> <773C> <D1DC> <D1DC> <884D> <D1DD> <D1DD> <6F14> <D1DE> <D1DE> <8273> <D1DF> <D1DF> <5830> <D1E0> <D1E0> <71D5> <D1E1> <D1E1> <538C> <D1E2> <D1E2> <781A> <D1E3> <D1E3> <96C1> <D1E4> <D1E4> <5501> <D1E5> <D1E5> <5F66> <D1E6> <D1E6> <7130> <D1E7> <D1E7> <5BB4> <D1E8> <D1E8> <8C1A> <D1E9> <D1E9> <9A8C> <D1EA> <D1EA> <6B83> endbfrange 100 beginbfrange <D1EB> <D1EB> <592E> <D1EC> <D1EC> <9E2F> <D1ED> <D1ED> <79E7> <D1EE> <D1EE> <6768> <D1EF> <D1EF> <626C> <D1F0> <D1F0> <4F6F> <D1F1> <D1F1> <75A1> <D1F2> <D1F2> <7F8A> <D1F3> <D1F3> <6D0B> <D1F4> <D1F4> <9633> <D1F5> <D1F5> <6C27> <D1F6> <D1F6> <4EF0> <D1F7> <D1F7> <75D2> <D1F8> <D1F8> <517B> <D1F9> <D1F9> <6837> <D1FA> <D1FA> <6F3E> <D1FB> <D1FB> <9080> <D1FC> <D1FC> <8170> <D1FD> <D1FD> <5996> <D1FE> <D1FE> <7476> <D240> <D248> <8938> <D249> <D24A> <8942> <D24B> <D263> <8945> <D264> <D269> <8960> <D26A> <D27D> <8967> <D27E> <D27E> <897C> <D280> <D281> <897D> <D282> <D282> <8980> <D283> <D283> <8982> <D284> <D285> <8984> <D286> <D2A0> <8987> <D2A1> <D2A1> <6447> <D2A2> <D2A2> <5C27> <D2A3> <D2A3> <9065> <D2A4> <D2A4> <7A91> <D2A5> <D2A5> <8C23> <D2A6> <D2A6> <59DA> <D2A7> <D2A7> <54AC> <D2A8> <D2A8> <8200> <D2A9> <D2A9> <836F> <D2AA> <D2AA> <8981> <D2AB> <D2AB> <8000> <D2AC> <D2AC> <6930> <D2AD> <D2AD> <564E> <D2AE> <D2AE> <8036> <D2AF> <D2AF> <7237> <D2B0> <D2B0> <91CE> <D2B1> <D2B1> <51B6> <D2B2> <D2B2> <4E5F> <D2B3> <D2B3> <9875> <D2B4> <D2B4> <6396> <D2B5> <D2B5> <4E1A> <D2B6> <D2B6> <53F6> <D2B7> <D2B7> <66F3> <D2B8> <D2B8> <814B> <D2B9> <D2B9> <591C> <D2BA> <D2BA> <6DB2> <D2BB> <D2BB> <4E00> <D2BC> <D2BC> <58F9> <D2BD> <D2BD> <533B> <D2BE> <D2BE> <63D6> <D2BF> <D2BF> <94F1> <D2C0> <D2C0> <4F9D> <D2C1> <D2C1> <4F0A> <D2C2> <D2C2> <8863> <D2C3> <D2C3> <9890> <D2C4> <D2C4> <5937> <D2C5> <D2C5> <9057> <D2C6> <D2C6> <79FB> <D2C7> <D2C7> <4EEA> <D2C8> <D2C8> <80F0> <D2C9> <D2C9> <7591> <D2CA> <D2CA> <6C82> <D2CB> <D2CB> <5B9C> <D2CC> <D2CC> <59E8> <D2CD> <D2CD> <5F5D> <D2CE> <D2CE> <6905> <D2CF> <D2CF> <8681> <D2D0> <D2D0> <501A> <D2D1> <D2D1> <5DF2> <D2D2> <D2D2> <4E59> <D2D3> <D2D3> <77E3> <D2D4> <D2D4> <4EE5> <D2D5> <D2D5> <827A> <D2D6> <D2D6> <6291> <D2D7> <D2D7> <6613> <D2D8> <D2D8> <9091> <D2D9> <D2D9> <5C79> <D2DA> <D2DA> <4EBF> <D2DB> <D2DB> <5F79> <D2DC> <D2DC> <81C6> <D2DD> <D2DD> <9038> <D2DE> <D2DE> <8084> <D2DF> <D2DF> <75AB> <D2E0> <D2E0> <4EA6> <D2E1> <D2E1> <88D4> <D2E2> <D2E2> <610F> <D2E3> <D2E3> <6BC5> <D2E4> <D2E4> <5FC6> <D2E5> <D2E5> <4E49> endbfrange 100 beginbfrange <D2E6> <D2E6> <76CA> <D2E7> <D2E7> <6EA2> <D2E8> <D2E8> <8BE3> <D2E9> <D2E9> <8BAE> <D2EA> <D2EA> <8C0A> <D2EB> <D2EB> <8BD1> <D2EC> <D2EC> <5F02> <D2ED> <D2ED> <7FFC> <D2EE> <D2EE> <7FCC> <D2EF> <D2EF> <7ECE> <D2F0> <D2F0> <8335> <D2F1> <D2F1> <836B> <D2F2> <D2F2> <56E0> <D2F3> <D2F3> <6BB7> <D2F4> <D2F4> <97F3> <D2F5> <D2F5> <9634> <D2F6> <D2F6> <59FB> <D2F7> <D2F7> <541F> <D2F8> <D2F8> <94F6> <D2F9> <D2F9> <6DEB> <D2FA> <D2FA> <5BC5> <D2FB> <D2FB> <996E> <D2FC> <D2FC> <5C39> <D2FD> <D2FD> <5F15> <D2FE> <D2FE> <9690> <D340> <D35E> <89A2> <D35F> <D35F> <89C3> <D360> <D360> <89CD> <D361> <D363> <89D3> <D364> <D366> <89D7> <D367> <D367> <89DB> <D368> <D368> <89DD> <D369> <D36C> <89DF> <D36D> <D36D> <89E4> <D36E> <D371> <89E7> <D372> <D374> <89EC> <D375> <D377> <89F0> <D378> <D37E> <89F4> <D380> <D384> <89FB> <D385> <D38A> <8A01> <D38B> <D3A0> <8A08> <D3A1> <D3A1> <5370> <D3A2> <D3A2> <82F1> <D3A3> <D3A3> <6A31> <D3A4> <D3A4> <5A74> <D3A5> <D3A5> <9E70> <D3A6> <D3A6> <5E94> <D3A7> <D3A7> <7F28> <D3A8> <D3A8> <83B9> <D3A9> <D3AA> <8424> <D3AB> <D3AB> <8367> <D3AC> <D3AC> <8747> <D3AD> <D3AD> <8FCE> <D3AE> <D3AE> <8D62> <D3AF> <D3AF> <76C8> <D3B0> <D3B0> <5F71> <D3B1> <D3B1> <9896> <D3B2> <D3B2> <786C> <D3B3> <D3B3> <6620> <D3B4> <D3B4> <54DF> <D3B5> <D3B5> <62E5> <D3B6> <D3B6> <4F63> <D3B7> <D3B7> <81C3> <D3B8> <D3B8> <75C8> <D3B9> <D3B9> <5EB8> <D3BA> <D3BA> <96CD> <D3BB> <D3BB> <8E0A> <D3BC> <D3BC> <86F9> <D3BD> <D3BD> <548F> <D3BE> <D3BE> <6CF3> <D3BF> <D3BF> <6D8C> <D3C0> <D3C0> <6C38> <D3C1> <D3C1> <607F> <D3C2> <D3C2> <52C7> <D3C3> <D3C3> <7528> <D3C4> <D3C4> <5E7D> <D3C5> <D3C5> <4F18> <D3C6> <D3C6> <60A0> <D3C7> <D3C7> <5FE7> <D3C8> <D3C8> <5C24> <D3C9> <D3C9> <7531> <D3CA> <D3CA> <90AE> <D3CB> <D3CB> <94C0> <D3CC> <D3CC> <72B9> <D3CD> <D3CD> <6CB9> <D3CE> <D3CE> <6E38> <D3CF> <D3CF> <9149> <D3D0> <D3D0> <6709> <D3D1> <D3D1> <53CB> <D3D2> <D3D2> <53F3> <D3D3> <D3D3> <4F51> <D3D4> <D3D4> <91C9> <D3D5> <D3D5> <8BF1> <D3D6> <D3D6> <53C8> <D3D7> <D3D7> <5E7C> <D3D8> <D3D8> <8FC2> <D3D9> <D3D9> <6DE4> <D3DA> <D3DA> <4E8E> <D3DB> <D3DB> <76C2> <D3DC> <D3DC> <6986> endbfrange 100 beginbfrange <D3DD> <D3DD> <865E> <D3DE> <D3DE> <611A> <D3DF> <D3DF> <8206> <D3E0> <D3E0> <4F59> <D3E1> <D3E1> <4FDE> <D3E2> <D3E2> <903E> <D3E3> <D3E3> <9C7C> <D3E4> <D3E4> <6109> <D3E5> <D3E5> <6E1D> <D3E6> <D3E6> <6E14> <D3E7> <D3E7> <9685> <D3E8> <D3E8> <4E88> <D3E9> <D3E9> <5A31> <D3EA> <D3EA> <96E8> <D3EB> <D3EB> <4E0E> <D3EC> <D3EC> <5C7F> <D3ED> <D3ED> <79B9> <D3EE> <D3EE> <5B87> <D3EF> <D3EF> <8BED> <D3F0> <D3F0> <7FBD> <D3F1> <D3F1> <7389> <D3F2> <D3F2> <57DF> <D3F3> <D3F3> <828B> <D3F4> <D3F4> <90C1> <D3F5> <D3F5> <5401> <D3F6> <D3F6> <9047> <D3F7> <D3F7> <55BB> <D3F8> <D3F8> <5CEA> <D3F9> <D3F9> <5FA1> <D3FA> <D3FA> <6108> <D3FB> <D3FB> <6B32> <D3FC> <D3FC> <72F1> <D3FD> <D3FD> <80B2> <D3FE> <D3FE> <8A89> <D440> <D45F> <8A1E> <D460> <D468> <8A3F> <D469> <D47E> <8A49> <D480> <D499> <8A5F> <D49A> <D4A0> <8A7A> <D4A1> <D4A1> <6D74> <D4A2> <D4A2> <5BD3> <D4A3> <D4A3> <88D5> <D4A4> <D4A4> <9884> <D4A5> <D4A5> <8C6B> <D4A6> <D4A6> <9A6D> <D4A7> <D4A7> <9E33> <D4A8> <D4A8> <6E0A> <D4A9> <D4A9> <51A4> <D4AA> <D4AA> <5143> <D4AB> <D4AB> <57A3> <D4AC> <D4AC> <8881> <D4AD> <D4AD> <539F> <D4AE> <D4AE> <63F4> <D4AF> <D4AF> <8F95> <D4B0> <D4B0> <56ED> <D4B1> <D4B1> <5458> <D4B2> <D4B2> <5706> <D4B3> <D4B3> <733F> <D4B4> <D4B4> <6E90> <D4B5> <D4B5> <7F18> <D4B6> <D4B6> <8FDC> <D4B7> <D4B7> <82D1> <D4B8> <D4B8> <613F> <D4B9> <D4B9> <6028> <D4BA> <D4BA> <9662> <D4BB> <D4BB> <66F0> <D4BC> <D4BC> <7EA6> <D4BD> <D4BD> <8D8A> <D4BE> <D4BE> <8DC3> <D4BF> <D4BF> <94A5> <D4C0> <D4C0> <5CB3> <D4C1> <D4C1> <7CA4> <D4C2> <D4C2> <6708> <D4C3> <D4C3> <60A6> <D4C4> <D4C4> <9605> <D4C5> <D4C5> <8018> <D4C6> <D4C6> <4E91> <D4C7> <D4C7> <90E7> <D4C8> <D4C8> <5300> <D4C9> <D4C9> <9668> <D4CA> <D4CA> <5141> <D4CB> <D4CB> <8FD0> <D4CC> <D4CC> <8574> <D4CD> <D4CD> <915D> <D4CE> <D4CE> <6655> <D4CF> <D4CF> <97F5> <D4D0> <D4D0> <5B55> <D4D1> <D4D1> <531D> <D4D2> <D4D2> <7838> <D4D3> <D4D3> <6742> <D4D4> <D4D4> <683D> <D4D5> <D4D5> <54C9> <D4D6> <D4D6> <707E> <D4D7> <D4D7> <5BB0> <D4D8> <D4D8> <8F7D> <D4D9> <D4D9> <518D> <D4DA> <D4DA> <5728> <D4DB> <D4DB> <54B1> <D4DC> <D4DC> <6512> <D4DD> <D4DD> <6682> endbfrange 100 beginbfrange <D4DE> <D4DE> <8D5E> <D4DF> <D4DF> <8D43> <D4E0> <D4E0> <810F> <D4E1> <D4E1> <846C> <D4E2> <D4E2> <906D> <D4E3> <D4E3> <7CDF> <D4E4> <D4E4> <51FF> <D4E5> <D4E5> <85FB> <D4E6> <D4E6> <67A3> <D4E7> <D4E7> <65E9> <D4E8> <D4E8> <6FA1> <D4E9> <D4E9> <86A4> <D4EA> <D4EA> <8E81> <D4EB> <D4EB> <566A> <D4EC> <D4EC> <9020> <D4ED> <D4ED> <7682> <D4EE> <D4EE> <7076> <D4EF> <D4EF> <71E5> <D4F0> <D4F0> <8D23> <D4F1> <D4F1> <62E9> <D4F2> <D4F2> <5219> <D4F3> <D4F3> <6CFD> <D4F4> <D4F4> <8D3C> <D4F5> <D4F5> <600E> <D4F6> <D4F6> <589E> <D4F7> <D4F7> <618E> <D4F8> <D4F8> <66FE> <D4F9> <D4F9> <8D60> <D4FA> <D4FA> <624E> <D4FB> <D4FB> <55B3> <D4FC> <D4FC> <6E23> <D4FD> <D4FD> <672D> <D4FE> <D4FE> <8F67> <D540> <D547> <8A81> <D548> <D54F> <8A8B> <D550> <D57E> <8A94> <D580> <D5A0> <8AC3> <D5A1> <D5A1> <94E1> <D5A2> <D5A2> <95F8> <D5A3> <D5A3> <7728> <D5A4> <D5A4> <6805> <D5A5> <D5A5> <69A8> <D5A6> <D5A6> <548B> <D5A7> <D5A7> <4E4D> <D5A8> <D5A8> <70B8> <D5A9> <D5A9> <8BC8> <D5AA> <D5AA> <6458> <D5AB> <D5AB> <658B> <D5AC> <D5AC> <5B85> <D5AD> <D5AD> <7A84> <D5AE> <D5AE> <503A> <D5AF> <D5AF> <5BE8> <D5B0> <D5B0> <77BB> <D5B1> <D5B1> <6BE1> <D5B2> <D5B2> <8A79> <D5B3> <D5B3> <7C98> <D5B4> <D5B4> <6CBE> <D5B5> <D5B5> <76CF> <D5B6> <D5B6> <65A9> <D5B7> <D5B7> <8F97> <D5B8> <D5B8> <5D2D> <D5B9> <D5B9> <5C55> <D5BA> <D5BA> <8638> <D5BB> <D5BB> <6808> <D5BC> <D5BC> <5360> <D5BD> <D5BD> <6218> <D5BE> <D5BE> <7AD9> <D5BF> <D5BF> <6E5B> <D5C0> <D5C0> <7EFD> <D5C1> <D5C1> <6A1F> <D5C2> <D5C2> <7AE0> <D5C3> <D5C3> <5F70> <D5C4> <D5C4> <6F33> <D5C5> <D5C5> <5F20> <D5C6> <D5C6> <638C> <D5C7> <D5C7> <6DA8> <D5C8> <D5C8> <6756> <D5C9> <D5C9> <4E08> <D5CA> <D5CA> <5E10> <D5CB> <D5CB> <8D26> <D5CC> <D5CC> <4ED7> <D5CD> <D5CD> <80C0> <D5CE> <D5CE> <7634> <D5CF> <D5CF> <969C> <D5D0> <D5D0> <62DB> <D5D1> <D5D1> <662D> <D5D2> <D5D2> <627E> <D5D3> <D5D3> <6CBC> <D5D4> <D5D4> <8D75> <D5D5> <D5D5> <7167> <D5D6> <D5D6> <7F69> <D5D7> <D5D7> <5146> <D5D8> <D5D8> <8087> <D5D9> <D5D9> <53EC> <D5DA> <D5DA> <906E> <D5DB> <D5DB> <6298> <D5DC> <D5DC> <54F2> <D5DD> <D5DD> <86F0> <D5DE> <D5DE> <8F99> <D5DF> <D5DF> <8005> endbfrange 100 beginbfrange <D5E0> <D5E0> <9517> <D5E1> <D5E1> <8517> <D5E2> <D5E2> <8FD9> <D5E3> <D5E3> <6D59> <D5E4> <D5E4> <73CD> <D5E5> <D5E5> <659F> <D5E6> <D5E6> <771F> <D5E7> <D5E7> <7504> <D5E8> <D5E8> <7827> <D5E9> <D5E9> <81FB> <D5EA> <D5EA> <8D1E> <D5EB> <D5EB> <9488> <D5EC> <D5EC> <4FA6> <D5ED> <D5ED> <6795> <D5EE> <D5EE> <75B9> <D5EF> <D5EF> <8BCA> <D5F0> <D5F0> <9707> <D5F1> <D5F1> <632F> <D5F2> <D5F2> <9547> <D5F3> <D5F3> <9635> <D5F4> <D5F4> <84B8> <D5F5> <D5F5> <6323> <D5F6> <D5F6> <7741> <D5F7> <D5F7> <5F81> <D5F8> <D5F8> <72F0> <D5F9> <D5F9> <4E89> <D5FA> <D5FA> <6014> <D5FB> <D5FB> <6574> <D5FC> <D5FC> <62EF> <D5FD> <D5FD> <6B63> <D5FE> <D5FE> <653F> <D640> <D662> <8AE4> <D663> <D67E> <8B08> <D680> <D681> <8B24> <D682> <D6A0> <8B27> <D6A1> <D6A1> <5E27> <D6A2> <D6A2> <75C7> <D6A3> <D6A3> <90D1> <D6A4> <D6A4> <8BC1> <D6A5> <D6A5> <829D> <D6A6> <D6A6> <679D> <D6A7> <D6A7> <652F> <D6A8> <D6A8> <5431> <D6A9> <D6A9> <8718> <D6AA> <D6AA> <77E5> <D6AB> <D6AB> <80A2> <D6AC> <D6AC> <8102> <D6AD> <D6AD> <6C41> <D6AE> <D6AE> <4E4B> <D6AF> <D6AF> <7EC7> <D6B0> <D6B0> <804C> <D6B1> <D6B1> <76F4> <D6B2> <D6B2> <690D> <D6B3> <D6B3> <6B96> <D6B4> <D6B4> <6267> <D6B5> <D6B5> <503C> <D6B6> <D6B6> <4F84> <D6B7> <D6B7> <5740> <D6B8> <D6B8> <6307> <D6B9> <D6B9> <6B62> <D6BA> <D6BA> <8DBE> <D6BB> <D6BB> <53EA> <D6BC> <D6BC> <65E8> <D6BD> <D6BD> <7EB8> <D6BE> <D6BE> <5FD7> <D6BF> <D6BF> <631A> <D6C0> <D6C0> <63B7> <D6C1> <D6C2> <81F3> <D6C3> <D6C3> <7F6E> <D6C4> <D6C4> <5E1C> <D6C5> <D6C5> <5CD9> <D6C6> <D6C6> <5236> <D6C7> <D6C7> <667A> <D6C8> <D6C8> <79E9> <D6C9> <D6C9> <7A1A> <D6CA> <D6CA> <8D28> <D6CB> <D6CB> <7099> <D6CC> <D6CC> <75D4> <D6CD> <D6CD> <6EDE> <D6CE> <D6CE> <6CBB> <D6CF> <D6CF> <7A92> <D6D0> <D6D0> <4E2D> <D6D1> <D6D1> <76C5> <D6D2> <D6D2> <5FE0> <D6D3> <D6D3> <949F> <D6D4> <D6D4> <8877> <D6D5> <D6D5> <7EC8> <D6D6> <D6D6> <79CD> <D6D7> <D6D7> <80BF> <D6D8> <D6D8> <91CD> <D6D9> <D6D9> <4EF2> <D6DA> <D6DA> <4F17> <D6DB> <D6DB> <821F> <D6DC> <D6DC> <5468> <D6DD> <D6DD> <5DDE> <D6DE> <D6DE> <6D32> <D6DF> <D6DF> <8BCC> <D6E0> <D6E0> <7CA5> <D6E1> <D6E1> <8F74> <D6E2> <D6E2> <8098> endbfrange 100 beginbfrange <D6E3> <D6E3> <5E1A> <D6E4> <D6E4> <5492> <D6E5> <D6E5> <76B1> <D6E6> <D6E6> <5B99> <D6E7> <D6E7> <663C> <D6E8> <D6E8> <9AA4> <D6E9> <D6E9> <73E0> <D6EA> <D6EA> <682A> <D6EB> <D6EB> <86DB> <D6EC> <D6EC> <6731> <D6ED> <D6ED> <732A> <D6EE> <D6EE> <8BF8> <D6EF> <D6EF> <8BDB> <D6F0> <D6F0> <9010> <D6F1> <D6F1> <7AF9> <D6F2> <D6F2> <70DB> <D6F3> <D6F3> <716E> <D6F4> <D6F4> <62C4> <D6F5> <D6F5> <77A9> <D6F6> <D6F6> <5631> <D6F7> <D6F7> <4E3B> <D6F8> <D6F8> <8457> <D6F9> <D6F9> <67F1> <D6FA> <D6FA> <52A9> <D6FB> <D6FB> <86C0> <D6FC> <D6FC> <8D2E> <D6FD> <D6FD> <94F8> <D6FE> <D6FE> <7B51> <D740> <D75F> <8B46> <D760> <D764> <8B67> <D765> <D77E> <8B6D> <D780> <D798> <8B87> <D799> <D799> <8BAC> <D79A> <D79A> <8BB1> <D79B> <D79B> <8BBB> <D79C> <D79C> <8BC7> <D79D> <D79D> <8BD0> <D79E> <D79E> <8BEA> <D79F> <D79F> <8C09> <D7A0> <D7A0> <8C1E> <D7A1> <D7A1> <4F4F> <D7A2> <D7A2> <6CE8> <D7A3> <D7A3> <795D> <D7A4> <D7A4> <9A7B> <D7A5> <D7A5> <6293> <D7A6> <D7A6> <722A> <D7A7> <D7A7> <62FD> <D7A8> <D7A8> <4E13> <D7A9> <D7A9> <7816> <D7AA> <D7AA> <8F6C> <D7AB> <D7AB> <64B0> <D7AC> <D7AC> <8D5A> <D7AD> <D7AD> <7BC6> <D7AE> <D7AE> <6869> <D7AF> <D7AF> <5E84> <D7B0> <D7B0> <88C5> <D7B1> <D7B1> <5986> <D7B2> <D7B2> <649E> <D7B3> <D7B3> <58EE> <D7B4> <D7B4> <72B6> <D7B5> <D7B5> <690E> <D7B6> <D7B6> <9525> <D7B7> <D7B7> <8FFD> <D7B8> <D7B8> <8D58> <D7B9> <D7B9> <5760> <D7BA> <D7BA> <7F00> <D7BB> <D7BB> <8C06> <D7BC> <D7BC> <51C6> <D7BD> <D7BD> <6349> <D7BE> <D7BE> <62D9> <D7BF> <D7BF> <5353> <D7C0> <D7C0> <684C> <D7C1> <D7C1> <7422> <D7C2> <D7C2> <8301> <D7C3> <D7C3> <914C> <D7C4> <D7C4> <5544> <D7C5> <D7C5> <7740> <D7C6> <D7C6> <707C> <D7C7> <D7C7> <6D4A> <D7C8> <D7C8> <5179> <D7C9> <D7C9> <54A8> <D7CA> <D7CA> <8D44> <D7CB> <D7CB> <59FF> <D7CC> <D7CC> <6ECB> <D7CD> <D7CD> <6DC4> <D7CE> <D7CE> <5B5C> <D7CF> <D7CF> <7D2B> <D7D0> <D7D0> <4ED4> <D7D1> <D7D1> <7C7D> <D7D2> <D7D2> <6ED3> <D7D3> <D7D3> <5B50> <D7D4> <D7D4> <81EA> <D7D5> <D7D5> <6E0D> <D7D6> <D7D6> <5B57> <D7D7> <D7D7> <9B03> <D7D8> <D7D8> <68D5> <D7D9> <D7D9> <8E2A> <D7DA> <D7DA> <5B97> <D7DB> <D7DB> <7EFC> <D7DC> <D7DC> <603B> endbfrange 100 beginbfrange <D7DD> <D7DD> <7EB5> <D7DE> <D7DE> <90B9> <D7DF> <D7DF> <8D70> <D7E0> <D7E0> <594F> <D7E1> <D7E1> <63CD> <D7E2> <D7E2> <79DF> <D7E3> <D7E3> <8DB3> <D7E4> <D7E4> <5352> <D7E5> <D7E5> <65CF> <D7E6> <D7E6> <7956> <D7E7> <D7E7> <8BC5> <D7E8> <D7E8> <963B> <D7E9> <D7E9> <7EC4> <D7EA> <D7EA> <94BB> <D7EB> <D7EB> <7E82> <D7EC> <D7EC> <5634> <D7ED> <D7ED> <9189> <D7EE> <D7EE> <6700> <D7EF> <D7EF> <7F6A> <D7F0> <D7F0> <5C0A> <D7F1> <D7F1> <9075> <D7F2> <D7F2> <6628> <D7F3> <D7F3> <5DE6> <D7F4> <D7F4> <4F50> <D7F5> <D7F5> <67DE> <D7F6> <D7F6> <505A> <D7F7> <D7F7> <4F5C> <D7F8> <D7F8> <5750> <D7F9> <D7F9> <5EA7> <D7FA> <D7FE> <E810> <D840> <D848> <8C38> <D849> <D84C> <8C42> <D84D> <D84D> <8C48> <D84E> <D84F> <8C4A> <D850> <D857> <8C4D> <D858> <D85B> <8C56> <D85C> <D861> <8C5B> <D862> <D868> <8C63> <D869> <D86F> <8C6C> <D870> <D873> <8C74> <D874> <D87A> <8C7B> <D87B> <D87C> <8C83> <D87D> <D87E> <8C86> <D880> <D880> <8C88> <D881> <D881> <8C8B> <D882> <D888> <8C8D> <D889> <D88B> <8C95> <D88C> <D8A0> <8C99> <D8A1> <D8A1> <4E8D> <D8A2> <D8A2> <4E0C> <D8A3> <D8A3> <5140> <D8A4> <D8A4> <4E10> <D8A5> <D8A5> <5EFF> <D8A6> <D8A6> <5345> <D8A7> <D8A7> <4E15> <D8A8> <D8A8> <4E98> <D8A9> <D8A9> <4E1E> <D8AA> <D8AA> <9B32> <D8AB> <D8AB> <5B6C> <D8AC> <D8AC> <5669> <D8AD> <D8AD> <4E28> <D8AE> <D8AE> <79BA> <D8AF> <D8AF> <4E3F> <D8B0> <D8B0> <5315> <D8B1> <D8B1> <4E47> <D8B2> <D8B2> <592D> <D8B3> <D8B3> <723B> <D8B4> <D8B4> <536E> <D8B5> <D8B5> <6C10> <D8B6> <D8B6> <56DF> <D8B7> <D8B7> <80E4> <D8B8> <D8B8> <9997> <D8B9> <D8B9> <6BD3> <D8BA> <D8BA> <777E> <D8BB> <D8BB> <9F17> <D8BC> <D8BC> <4E36> <D8BD> <D8BD> <4E9F> <D8BE> <D8BE> <9F10> <D8BF> <D8BF> <4E5C> <D8C0> <D8C0> <4E69> <D8C1> <D8C1> <4E93> <D8C2> <D8C2> <8288> <D8C3> <D8C3> <5B5B> <D8C4> <D8C4> <556C> <D8C5> <D8C5> <560F> <D8C6> <D8C6> <4EC4> <D8C7> <D8C7> <538D> <D8C8> <D8C8> <539D> <D8C9> <D8C9> <53A3> <D8CA> <D8CA> <53A5> <D8CB> <D8CB> <53AE> <D8CC> <D8CC> <9765> <D8CD> <D8CD> <8D5D> <D8CE> <D8CE> <531A> <D8CF> <D8CF> <53F5> <D8D0> <D8D0> <5326> <D8D1> <D8D1> <532E> <D8D2> <D8D2> <533E> <D8D3> <D8D3> <8D5C> <D8D4> <D8D4> <5366> endbfrange 100 beginbfrange <D8D5> <D8D5> <5363> <D8D6> <D8D6> <5202> <D8D7> <D8D7> <5208> <D8D8> <D8D8> <520E> <D8D9> <D8D9> <522D> <D8DA> <D8DA> <5233> <D8DB> <D8DC> <523F> <D8DD> <D8DD> <524C> <D8DE> <D8DE> <525E> <D8DF> <D8DF> <5261> <D8E0> <D8E0> <525C> <D8E1> <D8E1> <84AF> <D8E2> <D8E2> <527D> <D8E3> <D8E3> <5282> <D8E4> <D8E4> <5281> <D8E5> <D8E5> <5290> <D8E6> <D8E6> <5293> <D8E7> <D8E7> <5182> <D8E8> <D8E8> <7F54> <D8E9> <D8E9> <4EBB> <D8EA> <D8EA> <4EC3> <D8EB> <D8EB> <4EC9> <D8EC> <D8EC> <4EC2> <D8ED> <D8ED> <4EE8> <D8EE> <D8EE> <4EE1> <D8EF> <D8EF> <4EEB> <D8F0> <D8F0> <4EDE> <D8F1> <D8F1> <4F1B> <D8F2> <D8F2> <4EF3> <D8F3> <D8F3> <4F22> <D8F4> <D8F4> <4F64> <D8F5> <D8F5> <4EF5> <D8F6> <D8F6> <4F25> <D8F7> <D8F7> <4F27> <D8F8> <D8F8> <4F09> <D8F9> <D8F9> <4F2B> <D8FA> <D8FA> <4F5E> <D8FB> <D8FB> <4F67> <D8FC> <D8FC> <6538> <D8FD> <D8FD> <4F5A> <D8FE> <D8FE> <4F5D> <D940> <D97E> <8CAE> <D980> <D9A0> <8CED> <D9A1> <D9A1> <4F5F> <D9A2> <D9A2> <4F57> <D9A3> <D9A3> <4F32> <D9A4> <D9A4> <4F3D> <D9A5> <D9A5> <4F76> <D9A6> <D9A6> <4F74> <D9A7> <D9A7> <4F91> <D9A8> <D9A8> <4F89> <D9A9> <D9A9> <4F83> <D9AA> <D9AA> <4F8F> <D9AB> <D9AB> <4F7E> <D9AC> <D9AC> <4F7B> <D9AD> <D9AD> <4FAA> <D9AE> <D9AE> <4F7C> <D9AF> <D9AF> <4FAC> <D9B0> <D9B0> <4F94> <D9B1> <D9B1> <4FE6> <D9B2> <D9B2> <4FE8> <D9B3> <D9B3> <4FEA> <D9B4> <D9B4> <4FC5> <D9B5> <D9B5> <4FDA> <D9B6> <D9B6> <4FE3> <D9B7> <D9B7> <4FDC> <D9B8> <D9B8> <4FD1> <D9B9> <D9B9> <4FDF> <D9BA> <D9BA> <4FF8> <D9BB> <D9BB> <5029> <D9BC> <D9BC> <504C> <D9BD> <D9BD> <4FF3> <D9BE> <D9BE> <502C> <D9BF> <D9BF> <500F> <D9C0> <D9C0> <502E> <D9C1> <D9C1> <502D> <D9C2> <D9C2> <4FFE> <D9C3> <D9C3> <501C> <D9C4> <D9C4> <500C> <D9C5> <D9C5> <5025> <D9C6> <D9C6> <5028> <D9C7> <D9C7> <507E> <D9C8> <D9C8> <5043> <D9C9> <D9C9> <5055> <D9CA> <D9CA> <5048> <D9CB> <D9CB> <504E> <D9CC> <D9CC> <506C> <D9CD> <D9CD> <507B> <D9CE> <D9CE> <50A5> <D9CF> <D9CF> <50A7> <D9D0> <D9D0> <50A9> <D9D1> <D9D1> <50BA> <D9D2> <D9D2> <50D6> <D9D3> <D9D3> <5106> <D9D4> <D9D4> <50ED> <D9D5> <D9D5> <50EC> <D9D6> <D9D6> <50E6> <D9D7> <D9D7> <50EE> <D9D8> <D9D8> <5107> <D9D9> <D9D9> <510B> endbfrange 100 beginbfrange <D9DA> <D9DA> <4EDD> <D9DB> <D9DB> <6C3D> <D9DC> <D9DC> <4F58> <D9DD> <D9DD> <4F65> <D9DE> <D9DE> <4FCE> <D9DF> <D9DF> <9FA0> <D9E0> <D9E0> <6C46> <D9E1> <D9E1> <7C74> <D9E2> <D9E2> <516E> <D9E3> <D9E3> <5DFD> <D9E4> <D9E4> <9EC9> <D9E5> <D9E5> <9998> <D9E6> <D9E6> <5181> <D9E7> <D9E7> <5914> <D9E8> <D9E8> <52F9> <D9E9> <D9E9> <530D> <D9EA> <D9EA> <8A07> <D9EB> <D9EB> <5310> <D9EC> <D9EC> <51EB> <D9ED> <D9ED> <5919> <D9EE> <D9EE> <5155> <D9EF> <D9EF> <4EA0> <D9F0> <D9F0> <5156> <D9F1> <D9F1> <4EB3> <D9F2> <D9F2> <886E> <D9F3> <D9F3> <88A4> <D9F4> <D9F4> <4EB5> <D9F5> <D9F5> <8114> <D9F6> <D9F6> <88D2> <D9F7> <D9F7> <7980> <D9F8> <D9F8> <5B34> <D9F9> <D9F9> <8803> <D9FA> <D9FA> <7FB8> <D9FB> <D9FB> <51AB> <D9FC> <D9FC> <51B1> <D9FD> <D9FD> <51BD> <D9FE> <D9FE> <51BC> <DA40> <DA4E> <8D0E> <DA4F> <DA4F> <8D20> <DA50> <DA51> <8D51> <DA52> <DA52> <8D57> <DA53> <DA53> <8D5F> <DA54> <DA54> <8D65> <DA55> <DA57> <8D68> <DA58> <DA58> <8D6C> <DA59> <DA5A> <8D6E> <DA5B> <DA5C> <8D71> <DA5D> <DA65> <8D78> <DA66> <DA67> <8D82> <DA68> <DA6B> <8D86> <DA6C> <DA70> <8D8C> <DA71> <DA72> <8D92> <DA73> <DA7C> <8D95> <DA7D> <DA7E> <8DA0> <DA80> <DA80> <8DA2> <DA81> <DA8D> <8DA4> <DA8E> <DA8E> <8DB2> <DA8F> <DA90> <8DB6> <DA91> <DA91> <8DB9> <DA92> <DA92> <8DBB> <DA93> <DA93> <8DBD> <DA94> <DA96> <8DC0> <DA97> <DA97> <8DC5> <DA98> <DA9B> <8DC7> <DA9C> <DA9C> <8DCD> <DA9D> <DA9D> <8DD0> <DA9E> <DAA0> <8DD2> <DAA1> <DAA1> <51C7> <DAA2> <DAA2> <5196> <DAA3> <DAA3> <51A2> <DAA4> <DAA4> <51A5> <DAA5> <DAA5> <8BA0> <DAA6> <DAA7> <8BA6> <DAA8> <DAA8> <8BAA> <DAA9> <DAAA> <8BB4> <DAAB> <DAAB> <8BB7> <DAAC> <DAAD> <8BC2> <DAAE> <DAAE> <8BCB> <DAAF> <DAAF> <8BCF> <DAB0> <DAB0> <8BCE> <DAB1> <DAB3> <8BD2> <DAB4> <DAB4> <8BD6> <DAB5> <DAB6> <8BD8> <DAB7> <DAB7> <8BDC> <DAB8> <DAB9> <8BDF> <DABA> <DABA> <8BE4> <DABB> <DABC> <8BE8> <DABD> <DABD> <8BEE> <DABE> <DABE> <8BF0> <DABF> <DABF> <8BF3> <DAC0> <DAC0> <8BF6> <DAC1> <DAC1> <8BF9> <DAC2> <DAC2> <8BFC> <DAC3> <DAC4> <8BFF> <DAC5> <DAC5> <8C02> <DAC6> <DAC6> <8C04> <DAC7> <DAC7> <8C07> <DAC8> <DAC8> <8C0C> <DAC9> <DAC9> <8C0F> <DACA> <DACB> <8C11> endbfrange 100 beginbfrange <DACC> <DACE> <8C14> <DACF> <DACF> <8C19> <DAD0> <DAD0> <8C1B> <DAD1> <DAD1> <8C18> <DAD2> <DAD2> <8C1D> <DAD3> <DAD5> <8C1F> <DAD6> <DAD6> <8C25> <DAD7> <DAD7> <8C27> <DAD8> <DAD9> <8C2A> <DADA> <DADB> <8C2E> <DADC> <DADD> <8C32> <DADE> <DADF> <8C35> <DAE0> <DAE0> <5369> <DAE1> <DAE1> <537A> <DAE2> <DAE2> <961D> <DAE3> <DAE3> <9622> <DAE4> <DAE4> <9621> <DAE5> <DAE5> <9631> <DAE6> <DAE6> <962A> <DAE7> <DAE7> <963D> <DAE8> <DAE8> <963C> <DAE9> <DAE9> <9642> <DAEA> <DAEA> <9649> <DAEB> <DAEB> <9654> <DAEC> <DAEC> <965F> <DAED> <DAED> <9667> <DAEE> <DAEE> <966C> <DAEF> <DAEF> <9672> <DAF0> <DAF0> <9674> <DAF1> <DAF1> <9688> <DAF2> <DAF2> <968D> <DAF3> <DAF3> <9697> <DAF4> <DAF4> <96B0> <DAF5> <DAF5> <9097> <DAF6> <DAF6> <909B> <DAF7> <DAF7> <909D> <DAF8> <DAF8> <9099> <DAF9> <DAF9> <90AC> <DAFA> <DAFA> <90A1> <DAFB> <DAFB> <90B4> <DAFC> <DAFC> <90B3> <DAFD> <DAFD> <90B6> <DAFE> <DAFE> <90BA> <DB40> <DB40> <8DD5> <DB41> <DB42> <8DD8> <DB43> <DB43> <8DDC> <DB44> <DB46> <8DE0> <DB47> <DB49> <8DE5> <DB4A> <DB4A> <8DE9> <DB4B> <DB4C> <8DED> <DB4D> <DB4F> <8DF0> <DB50> <DB50> <8DF4> <DB51> <DB51> <8DF6> <DB52> <DB52> <8DFC> <DB53> <DB59> <8DFE> <DB5A> <DB5C> <8E06> <DB5D> <DB5D> <8E0B> <DB5E> <DB5F> <8E0D> <DB60> <DB63> <8E10> <DB64> <DB6B> <8E15> <DB6C> <DB6D> <8E20> <DB6E> <DB72> <8E24> <DB73> <DB73> <8E2B> <DB74> <DB74> <8E2D> <DB75> <DB75> <8E30> <DB76> <DB78> <8E32> <DB79> <DB7B> <8E36> <DB7C> <DB7D> <8E3B> <DB7E> <DB7E> <8E3E> <DB80> <DB80> <8E3F> <DB81> <DB81> <8E43> <DB82> <DB83> <8E45> <DB84> <DB88> <8E4C> <DB89> <DB8E> <8E53> <DB8F> <DB9A> <8E5A> <DB9B> <DB9C> <8E67> <DB9D> <DB9E> <8E6A> <DB9F> <DB9F> <8E6E> <DBA0> <DBA0> <8E71> <DBA1> <DBA1> <90B8> <DBA2> <DBA2> <90B0> <DBA3> <DBA3> <90CF> <DBA4> <DBA4> <90C5> <DBA5> <DBA5> <90BE> <DBA6> <DBA6> <90D0> <DBA7> <DBA7> <90C4> <DBA8> <DBA8> <90C7> <DBA9> <DBA9> <90D3> <DBAA> <DBAA> <90E6> <DBAB> <DBAB> <90E2> <DBAC> <DBAC> <90DC> <DBAD> <DBAD> <90D7> <DBAE> <DBAE> <90DB> <DBAF> <DBAF> <90EB> <DBB0> <DBB0> <90EF> <DBB1> <DBB1> <90FE> <DBB2> <DBB2> <9104> <DBB3> <DBB3> <9122> <DBB4> <DBB4> <911E> <DBB5> <DBB5> <9123> endbfrange 100 beginbfrange <DBB6> <DBB6> <9131> <DBB7> <DBB7> <912F> <DBB8> <DBB8> <9139> <DBB9> <DBB9> <9143> <DBBA> <DBBA> <9146> <DBBB> <DBBB> <520D> <DBBC> <DBBC> <5942> <DBBD> <DBBD> <52A2> <DBBE> <DBBF> <52AC> <DBC0> <DBC0> <52BE> <DBC1> <DBC1> <54FF> <DBC2> <DBC2> <52D0> <DBC3> <DBC3> <52D6> <DBC4> <DBC4> <52F0> <DBC5> <DBC5> <53DF> <DBC6> <DBC6> <71EE> <DBC7> <DBC7> <77CD> <DBC8> <DBC8> <5EF4> <DBC9> <DBC9> <51F5> <DBCA> <DBCA> <51FC> <DBCB> <DBCB> <9B2F> <DBCC> <DBCC> <53B6> <DBCD> <DBCD> <5F01> <DBCE> <DBCE> <755A> <DBCF> <DBCF> <5DEF> <DBD0> <DBD0> <574C> <DBD1> <DBD1> <57A9> <DBD2> <DBD2> <57A1> <DBD3> <DBD3> <587E> <DBD4> <DBD4> <58BC> <DBD5> <DBD5> <58C5> <DBD6> <DBD6> <58D1> <DBD7> <DBD7> <5729> <DBD8> <DBD8> <572C> <DBD9> <DBD9> <572A> <DBDA> <DBDA> <5733> <DBDB> <DBDB> <5739> <DBDC> <DBDD> <572E> <DBDE> <DBDE> <575C> <DBDF> <DBDF> <573B> <DBE0> <DBE0> <5742> <DBE1> <DBE1> <5769> <DBE2> <DBE2> <5785> <DBE3> <DBE3> <576B> <DBE4> <DBE4> <5786> <DBE5> <DBE5> <577C> <DBE6> <DBE6> <577B> <DBE7> <DBE7> <5768> <DBE8> <DBE8> <576D> <DBE9> <DBE9> <5776> <DBEA> <DBEA> <5773> <DBEB> <DBEB> <57AD> <DBEC> <DBEC> <57A4> <DBED> <DBED> <578C> <DBEE> <DBEE> <57B2> <DBEF> <DBEF> <57CF> <DBF0> <DBF0> <57A7> <DBF1> <DBF1> <57B4> <DBF2> <DBF2> <5793> <DBF3> <DBF3> <57A0> <DBF4> <DBF4> <57D5> <DBF5> <DBF5> <57D8> <DBF6> <DBF6> <57DA> <DBF7> <DBF7> <57D9> <DBF8> <DBF8> <57D2> <DBF9> <DBF9> <57B8> <DBFA> <DBFA> <57F4> <DBFB> <DBFB> <57EF> <DBFC> <DBFC> <57F8> <DBFD> <DBFD> <57E4> <DBFE> <DBFE> <57DD> <DC40> <DC40> <8E73> <DC41> <DC41> <8E75> <DC42> <DC46> <8E77> <DC47> <DC48> <8E7D> <DC49> <DC49> <8E80> <DC4A> <DC4C> <8E82> <DC4D> <DC4D> <8E86> <DC4E> <DC54> <8E88> <DC55> <DC57> <8E91> <DC58> <DC5E> <8E95> <DC5F> <DC5F> <8E9D> <DC60> <DC6B> <8E9F> <DC6C> <DC6D> <8EAD> <DC6E> <DC6F> <8EB0> <DC70> <DC76> <8EB3> <DC77> <DC7E> <8EBB> <DC80> <DC8A> <8EC3> <DC8B> <DCA0> <8ECF> <DCA1> <DCA1> <580B> <DCA2> <DCA2> <580D> <DCA3> <DCA3> <57FD> <DCA4> <DCA4> <57ED> <DCA5> <DCA5> <5800> <DCA6> <DCA6> <581E> <DCA7> <DCA7> <5819> <DCA8> <DCA8> <5844> <DCA9> <DCA9> <5820> <DCAA> <DCAA> <5865> <DCAB> <DCAB> <586C> endbfrange 100 beginbfrange <DCAC> <DCAC> <5881> <DCAD> <DCAD> <5889> <DCAE> <DCAE> <589A> <DCAF> <DCAF> <5880> <DCB0> <DCB0> <99A8> <DCB1> <DCB1> <9F19> <DCB2> <DCB2> <61FF> <DCB3> <DCB3> <8279> <DCB4> <DCB4> <827D> <DCB5> <DCB5> <827F> <DCB6> <DCB6> <828F> <DCB7> <DCB7> <828A> <DCB8> <DCB8> <82A8> <DCB9> <DCB9> <8284> <DCBA> <DCBA> <828E> <DCBB> <DCBB> <8291> <DCBC> <DCBC> <8297> <DCBD> <DCBD> <8299> <DCBE> <DCBE> <82AB> <DCBF> <DCBF> <82B8> <DCC0> <DCC0> <82BE> <DCC1> <DCC1> <82B0> <DCC2> <DCC2> <82C8> <DCC3> <DCC3> <82CA> <DCC4> <DCC4> <82E3> <DCC5> <DCC5> <8298> <DCC6> <DCC6> <82B7> <DCC7> <DCC7> <82AE> <DCC8> <DCC9> <82CB> <DCCA> <DCCA> <82C1> <DCCB> <DCCB> <82A9> <DCCC> <DCCC> <82B4> <DCCD> <DCCD> <82A1> <DCCE> <DCCE> <82AA> <DCCF> <DCCF> <829F> <DCD0> <DCD0> <82C4> <DCD1> <DCD1> <82CE> <DCD2> <DCD2> <82A4> <DCD3> <DCD3> <82E1> <DCD4> <DCD4> <8309> <DCD5> <DCD5> <82F7> <DCD6> <DCD6> <82E4> <DCD7> <DCD7> <830F> <DCD8> <DCD8> <8307> <DCD9> <DCD9> <82DC> <DCDA> <DCDA> <82F4> <DCDB> <DCDB> <82D2> <DCDC> <DCDC> <82D8> <DCDD> <DCDD> <830C> <DCDE> <DCDE> <82FB> <DCDF> <DCDF> <82D3> <DCE0> <DCE0> <8311> <DCE1> <DCE1> <831A> <DCE2> <DCE2> <8306> <DCE3> <DCE4> <8314> <DCE5> <DCE5> <82E0> <DCE6> <DCE6> <82D5> <DCE7> <DCE7> <831C> <DCE8> <DCE8> <8351> <DCE9> <DCEA> <835B> <DCEB> <DCEB> <8308> <DCEC> <DCEC> <8392> <DCED> <DCED> <833C> <DCEE> <DCEE> <8334> <DCEF> <DCEF> <8331> <DCF0> <DCF0> <839B> <DCF1> <DCF1> <835E> <DCF2> <DCF2> <832F> <DCF3> <DCF3> <834F> <DCF4> <DCF4> <8347> <DCF5> <DCF5> <8343> <DCF6> <DCF6> <835F> <DCF7> <DCF7> <8340> <DCF8> <DCF8> <8317> <DCF9> <DCF9> <8360> <DCFA> <DCFA> <832D> <DCFB> <DCFB> <833A> <DCFC> <DCFC> <8333> <DCFD> <DCFD> <8366> <DCFE> <DCFE> <8365> <DD40> <DD7E> <8EE5> <DD80> <DDA0> <8F24> <DDA1> <DDA1> <8368> <DDA2> <DDA2> <831B> <DDA3> <DDA3> <8369> <DDA4> <DDA4> <836C> <DDA5> <DDA5> <836A> <DDA6> <DDA7> <836D> <DDA8> <DDA8> <83B0> <DDA9> <DDA9> <8378> <DDAA> <DDAB> <83B3> <DDAC> <DDAC> <83A0> <DDAD> <DDAD> <83AA> <DDAE> <DDAE> <8393> <DDAF> <DDAF> <839C> <DDB0> <DDB0> <8385> <DDB1> <DDB1> <837C> <DDB2> <DDB2> <83B6> <DDB3> <DDB3> <83A9> <DDB4> <DDB4> <837D> endbfrange 100 beginbfrange <DDB5> <DDB5> <83B8> <DDB6> <DDB6> <837B> <DDB7> <DDB7> <8398> <DDB8> <DDB8> <839E> <DDB9> <DDB9> <83A8> <DDBA> <DDBA> <83BA> <DDBB> <DDBB> <83BC> <DDBC> <DDBC> <83C1> <DDBD> <DDBD> <8401> <DDBE> <DDBE> <83E5> <DDBF> <DDBF> <83D8> <DDC0> <DDC0> <5807> <DDC1> <DDC1> <8418> <DDC2> <DDC2> <840B> <DDC3> <DDC3> <83DD> <DDC4> <DDC4> <83FD> <DDC5> <DDC5> <83D6> <DDC6> <DDC6> <841C> <DDC7> <DDC7> <8438> <DDC8> <DDC8> <8411> <DDC9> <DDC9> <8406> <DDCA> <DDCA> <83D4> <DDCB> <DDCB> <83DF> <DDCC> <DDCC> <840F> <DDCD> <DDCD> <8403> <DDCE> <DDCF> <83F8> <DDD0> <DDD0> <83EA> <DDD1> <DDD1> <83C5> <DDD2> <DDD2> <83C0> <DDD3> <DDD3> <8426> <DDD4> <DDD4> <83F0> <DDD5> <DDD5> <83E1> <DDD6> <DDD6> <845C> <DDD7> <DDD7> <8451> <DDD8> <DDD8> <845A> <DDD9> <DDD9> <8459> <DDDA> <DDDA> <8473> <DDDB> <DDDC> <8487> <DDDD> <DDDD> <847A> <DDDE> <DDDE> <8489> <DDDF> <DDDF> <8478> <DDE0> <DDE0> <843C> <DDE1> <DDE1> <8446> <DDE2> <DDE2> <8469> <DDE3> <DDE3> <8476> <DDE4> <DDE4> <848C> <DDE5> <DDE5> <848E> <DDE6> <DDE6> <8431> <DDE7> <DDE7> <846D> <DDE8> <DDE8> <84C1> <DDE9> <DDE9> <84CD> <DDEA> <DDEA> <84D0> <DDEB> <DDEB> <84E6> <DDEC> <DDEC> <84BD> <DDED> <DDED> <84D3> <DDEE> <DDEE> <84CA> <DDEF> <DDEF> <84BF> <DDF0> <DDF0> <84BA> <DDF1> <DDF1> <84E0> <DDF2> <DDF2> <84A1> <DDF3> <DDF3> <84B9> <DDF4> <DDF4> <84B4> <DDF5> <DDF5> <8497> <DDF6> <DDF6> <84E5> <DDF7> <DDF7> <84E3> <DDF8> <DDF8> <850C> <DDF9> <DDF9> <750D> <DDFA> <DDFA> <8538> <DDFB> <DDFB> <84F0> <DDFC> <DDFC> <8539> <DDFD> <DDFD> <851F> <DDFE> <DDFE> <853A> <DE40> <DE60> <8F45> <DE61> <DE61> <8F6A> <DE62> <DE62> <8F80> <DE63> <DE63> <8F8C> <DE64> <DE64> <8F92> <DE65> <DE65> <8F9D> <DE66> <DE68> <8FA0> <DE69> <DE6C> <8FA4> <DE6D> <DE6D> <8FAA> <DE6E> <DE71> <8FAC> <DE72> <DE75> <8FB2> <DE76> <DE77> <8FB7> <DE78> <DE7A> <8FBA> <DE7B> <DE7C> <8FBF> <DE7D> <DE7D> <8FC3> <DE7E> <DE7E> <8FC6> <DE80> <DE84> <8FC9> <DE85> <DE85> <8FCF> <DE86> <DE86> <8FD2> <DE87> <DE88> <8FD6> <DE89> <DE89> <8FDA> <DE8A> <DE8B> <8FE0> <DE8C> <DE8C> <8FE3> <DE8D> <DE8D> <8FE7> <DE8E> <DE8E> <8FEC> <DE8F> <DE8F> <8FEF> <DE90> <DE91> <8FF1> <DE92> <DE94> <8FF4> endbfrange 100 beginbfrange <DE95> <DE97> <8FFA> <DE98> <DE99> <8FFE> <DE9A> <DE9B> <9007> <DE9C> <DE9C> <900C> <DE9D> <DE9D> <900E> <DE9E> <DE9E> <9013> <DE9F> <DE9F> <9015> <DEA0> <DEA0> <9018> <DEA1> <DEA1> <8556> <DEA2> <DEA2> <853B> <DEA3> <DEA3> <84FF> <DEA4> <DEA4> <84FC> <DEA5> <DEA5> <8559> <DEA6> <DEA6> <8548> <DEA7> <DEA7> <8568> <DEA8> <DEA8> <8564> <DEA9> <DEA9> <855E> <DEAA> <DEAA> <857A> <DEAB> <DEAB> <77A2> <DEAC> <DEAC> <8543> <DEAD> <DEAD> <8572> <DEAE> <DEAE> <857B> <DEAF> <DEAF> <85A4> <DEB0> <DEB0> <85A8> <DEB1> <DEB1> <8587> <DEB2> <DEB2> <858F> <DEB3> <DEB3> <8579> <DEB4> <DEB4> <85AE> <DEB5> <DEB5> <859C> <DEB6> <DEB6> <8585> <DEB7> <DEB7> <85B9> <DEB8> <DEB8> <85B7> <DEB9> <DEB9> <85B0> <DEBA> <DEBA> <85D3> <DEBB> <DEBB> <85C1> <DEBC> <DEBC> <85DC> <DEBD> <DEBD> <85FF> <DEBE> <DEBE> <8627> <DEBF> <DEBF> <8605> <DEC0> <DEC0> <8629> <DEC1> <DEC1> <8616> <DEC2> <DEC2> <863C> <DEC3> <DEC3> <5EFE> <DEC4> <DEC4> <5F08> <DEC5> <DEC5> <593C> <DEC6> <DEC6> <5941> <DEC7> <DEC7> <8037> <DEC8> <DEC8> <5955> <DEC9> <DEC9> <595A> <DECA> <DECA> <5958> <DECB> <DECB> <530F> <DECC> <DECC> <5C22> <DECD> <DECD> <5C25> <DECE> <DECE> <5C2C> <DECF> <DECF> <5C34> <DED0> <DED0> <624C> <DED1> <DED1> <626A> <DED2> <DED2> <629F> <DED3> <DED3> <62BB> <DED4> <DED4> <62CA> <DED5> <DED5> <62DA> <DED6> <DED6> <62D7> <DED7> <DED7> <62EE> <DED8> <DED8> <6322> <DED9> <DED9> <62F6> <DEDA> <DEDA> <6339> <DEDB> <DEDB> <634B> <DEDC> <DEDC> <6343> <DEDD> <DEDD> <63AD> <DEDE> <DEDE> <63F6> <DEDF> <DEDF> <6371> <DEE0> <DEE0> <637A> <DEE1> <DEE1> <638E> <DEE2> <DEE2> <63B4> <DEE3> <DEE3> <636D> <DEE4> <DEE4> <63AC> <DEE5> <DEE5> <638A> <DEE6> <DEE6> <6369> <DEE7> <DEE7> <63AE> <DEE8> <DEE8> <63BC> <DEE9> <DEE9> <63F2> <DEEA> <DEEA> <63F8> <DEEB> <DEEB> <63E0> <DEEC> <DEEC> <63FF> <DEED> <DEED> <63C4> <DEEE> <DEEE> <63DE> <DEEF> <DEEF> <63CE> <DEF0> <DEF0> <6452> <DEF1> <DEF1> <63C6> <DEF2> <DEF2> <63BE> <DEF3> <DEF3> <6445> <DEF4> <DEF4> <6441> <DEF5> <DEF5> <640B> <DEF6> <DEF6> <641B> <DEF7> <DEF7> <6420> <DEF8> <DEF8> <640C> <DEF9> <DEF9> <6426> <DEFA> <DEFA> <6421> <DEFB> <DEFB> <645E> <DEFC> <DEFC> <6484> endbfrange 100 beginbfrange <DEFD> <DEFD> <646D> <DEFE> <DEFE> <6496> <DF40> <DF40> <9019> <DF41> <DF41> <901C> <DF42> <DF44> <9023> <DF45> <DF4A> <9027> <DF4B> <DF4F> <9030> <DF50> <DF50> <9037> <DF51> <DF52> <9039> <DF53> <DF53> <903D> <DF54> <DF55> <903F> <DF56> <DF56> <9043> <DF57> <DF58> <9045> <DF59> <DF5D> <9048> <DF5E> <DF5E> <904E> <DF5F> <DF61> <9054> <DF62> <DF63> <9059> <DF64> <DF69> <905C> <DF6A> <DF6A> <9064> <DF6B> <DF6C> <9066> <DF6D> <DF70> <9069> <DF71> <DF75> <906F> <DF76> <DF7C> <9076> <DF7D> <DF7D> <907E> <DF7E> <DF7E> <9081> <DF80> <DF83> <9084> <DF84> <DF85> <9089> <DF86> <DF8A> <908C> <DF8B> <DF8B> <9092> <DF8C> <DF8C> <9094> <DF8D> <DF8D> <9096> <DF8E> <DF8E> <9098> <DF8F> <DF8F> <909A> <DF90> <DF90> <909C> <DF91> <DF93> <909E> <DF94> <DF95> <90A4> <DF96> <DF98> <90A7> <DF99> <DF99> <90AB> <DF9A> <DF9A> <90AD> <DF9B> <DF9B> <90B2> <DF9C> <DF9C> <90B7> <DF9D> <DF9E> <90BC> <DF9F> <DFA0> <90BF> <DFA1> <DFA1> <647A> <DFA2> <DFA3> <64B7> <DFA4> <DFA4> <6499> <DFA5> <DFA5> <64BA> <DFA6> <DFA6> <64C0> <DFA7> <DFA7> <64D0> <DFA8> <DFA8> <64D7> <DFA9> <DFA9> <64E4> <DFAA> <DFAA> <64E2> <DFAB> <DFAB> <6509> <DFAC> <DFAC> <6525> <DFAD> <DFAD> <652E> <DFAE> <DFAE> <5F0B> <DFAF> <DFAF> <5FD2> <DFB0> <DFB0> <7519> <DFB1> <DFB1> <5F11> <DFB2> <DFB2> <535F> <DFB3> <DFB3> <53F1> <DFB4> <DFB4> <53FD> <DFB5> <DFB5> <53E9> <DFB6> <DFB6> <53E8> <DFB7> <DFB7> <53FB> <DFB8> <DFB8> <5412> <DFB9> <DFB9> <5416> <DFBA> <DFBA> <5406> <DFBB> <DFBB> <544B> <DFBC> <DFBE> <5452> <DFBF> <DFBF> <5456> <DFC0> <DFC0> <5443> <DFC1> <DFC1> <5421> <DFC2> <DFC2> <5457> <DFC3> <DFC3> <5459> <DFC4> <DFC4> <5423> <DFC5> <DFC5> <5432> <DFC6> <DFC6> <5482> <DFC7> <DFC7> <5494> <DFC8> <DFC8> <5477> <DFC9> <DFC9> <5471> <DFCA> <DFCA> <5464> <DFCB> <DFCC> <549A> <DFCD> <DFCD> <5484> <DFCE> <DFCE> <5476> <DFCF> <DFCF> <5466> <DFD0> <DFD0> <549D> <DFD1> <DFD1> <54D0> <DFD2> <DFD2> <54AD> <DFD3> <DFD3> <54C2> <DFD4> <DFD4> <54B4> <DFD5> <DFD5> <54D2> <DFD6> <DFD6> <54A7> <DFD7> <DFD7> <54A6> <DFD8> <DFD9> <54D3> <DFDA> <DFDA> <5472> <DFDB> <DFDB> <54A3> <DFDC> <DFDC> <54D5> <DFDD> <DFDD> <54BB> <DFDE> <DFDE> <54BF> endbfrange 100 beginbfrange <DFDF> <DFDF> <54CC> <DFE0> <DFE1> <54D9> <DFE2> <DFE2> <54DC> <DFE3> <DFE4> <54A9> <DFE5> <DFE5> <54A4> <DFE6> <DFE6> <54DD> <DFE7> <DFE7> <54CF> <DFE8> <DFE8> <54DE> <DFE9> <DFE9> <551B> <DFEA> <DFEA> <54E7> <DFEB> <DFEB> <5520> <DFEC> <DFEC> <54FD> <DFED> <DFED> <5514> <DFEE> <DFEE> <54F3> <DFEF> <DFF0> <5522> <DFF1> <DFF1> <550F> <DFF2> <DFF2> <5511> <DFF3> <DFF3> <5527> <DFF4> <DFF4> <552A> <DFF5> <DFF5> <5567> <DFF6> <DFF6> <558F> <DFF7> <DFF7> <55B5> <DFF8> <DFF8> <5549> <DFF9> <DFF9> <556D> <DFFA> <DFFA> <5541> <DFFB> <DFFB> <5555> <DFFC> <DFFC> <553F> <DFFD> <DFFD> <5550> <DFFE> <DFFE> <553C> <E040> <E041> <90C2> <E042> <E042> <90C6> <E043> <E044> <90C8> <E045> <E047> <90CB> <E048> <E048> <90D2> <E049> <E04B> <90D4> <E04C> <E04E> <90D8> <E04F> <E051> <90DE> <E052> <E054> <90E3> <E055> <E056> <90E9> <E057> <E057> <90EC> <E058> <E058> <90EE> <E059> <E05C> <90F0> <E05D> <E05F> <90F5> <E060> <E063> <90F9> <E064> <E066> <90FF> <E067> <E067> <9103> <E068> <E07B> <9105> <E07C> <E07E> <911A> <E080> <E080> <911D> <E081> <E083> <911F> <E084> <E08E> <9124> <E08F> <E08F> <9130> <E090> <E096> <9132> <E097> <E09F> <913A> <E0A0> <E0A0> <9144> <E0A1> <E0A1> <5537> <E0A2> <E0A2> <5556> <E0A3> <E0A5> <5575> <E0A6> <E0A6> <5533> <E0A7> <E0A7> <5530> <E0A8> <E0A8> <555C> <E0A9> <E0A9> <558B> <E0AA> <E0AA> <55D2> <E0AB> <E0AB> <5583> <E0AC> <E0AC> <55B1> <E0AD> <E0AD> <55B9> <E0AE> <E0AE> <5588> <E0AF> <E0AF> <5581> <E0B0> <E0B0> <559F> <E0B1> <E0B1> <557E> <E0B2> <E0B2> <55D6> <E0B3> <E0B3> <5591> <E0B4> <E0B4> <557B> <E0B5> <E0B5> <55DF> <E0B6> <E0B7> <55BD> <E0B8> <E0B8> <5594> <E0B9> <E0B9> <5599> <E0BA> <E0BA> <55EA> <E0BB> <E0BB> <55F7> <E0BC> <E0BC> <55C9> <E0BD> <E0BD> <561F> <E0BE> <E0BE> <55D1> <E0BF> <E0C0> <55EB> <E0C1> <E0C1> <55D4> <E0C2> <E0C2> <55E6> <E0C3> <E0C3> <55DD> <E0C4> <E0C4> <55C4> <E0C5> <E0C5> <55EF> <E0C6> <E0C6> <55E5> <E0C7> <E0C8> <55F2> <E0C9> <E0CA> <55CC> <E0CB> <E0CB> <55E8> <E0CC> <E0CC> <55F5> <E0CD> <E0CD> <55E4> <E0CE> <E0CE> <8F94> <E0CF> <E0CF> <561E> <E0D0> <E0D0> <5608> <E0D1> <E0D1> <560C> <E0D2> <E0D2> <5601> <E0D3> <E0D3> <5624> endbfrange 100 beginbfrange <E0D4> <E0D4> <5623> <E0D5> <E0D5> <55FE> <E0D6> <E0D6> <5600> <E0D7> <E0D7> <5627> <E0D8> <E0D8> <562D> <E0D9> <E0D9> <5658> <E0DA> <E0DA> <5639> <E0DB> <E0DB> <5657> <E0DC> <E0DC> <562C> <E0DD> <E0DD> <564D> <E0DE> <E0DE> <5662> <E0DF> <E0DF> <5659> <E0E0> <E0E0> <565C> <E0E1> <E0E1> <564C> <E0E2> <E0E2> <5654> <E0E3> <E0E3> <5686> <E0E4> <E0E4> <5664> <E0E5> <E0E5> <5671> <E0E6> <E0E6> <566B> <E0E7> <E0E8> <567B> <E0E9> <E0E9> <5685> <E0EA> <E0EA> <5693> <E0EB> <E0EB> <56AF> <E0EC> <E0EC> <56D4> <E0ED> <E0ED> <56D7> <E0EE> <E0EE> <56DD> <E0EF> <E0EF> <56E1> <E0F0> <E0F0> <56F5> <E0F1> <E0F1> <56EB> <E0F2> <E0F2> <56F9> <E0F3> <E0F3> <56FF> <E0F4> <E0F4> <5704> <E0F5> <E0F5> <570A> <E0F6> <E0F6> <5709> <E0F7> <E0F7> <571C> <E0F8> <E0F8> <5E0F> <E0F9> <E0F9> <5E19> <E0FA> <E0FA> <5E14> <E0FB> <E0FB> <5E11> <E0FC> <E0FC> <5E31> <E0FD> <E0FE> <5E3B> <E140> <E140> <9145> <E141> <E142> <9147> <E143> <E143> <9151> <E144> <E147> <9153> <E148> <E149> <9158> <E14A> <E14B> <915B> <E14C> <E14D> <915F> <E14E> <E150> <9166> <E151> <E151> <916B> <E152> <E152> <916D> <E153> <E153> <9173> <E154> <E156> <917A> <E157> <E15B> <9180> <E15C> <E15C> <9186> <E15D> <E15D> <9188> <E15E> <E15E> <918A> <E15F> <E160> <918E> <E161> <E167> <9193> <E168> <E16D> <919C> <E16E> <E173> <91A4> <E174> <E175> <91AB> <E176> <E179> <91B0> <E17A> <E17D> <91B6> <E17E> <E17E> <91BB> <E180> <E18A> <91BC> <E18B> <E18B> <91C8> <E18C> <E18C> <91CB> <E18D> <E18D> <91D0> <E18E> <E197> <91D2> <E198> <E1A0> <91DD> <E1A1> <E1A1> <5E37> <E1A2> <E1A2> <5E44> <E1A3> <E1A3> <5E54> <E1A4> <E1A4> <5E5B> <E1A5> <E1A5> <5E5E> <E1A6> <E1A6> <5E61> <E1A7> <E1A7> <5C8C> <E1A8> <E1A8> <5C7A> <E1A9> <E1A9> <5C8D> <E1AA> <E1AA> <5C90> <E1AB> <E1AB> <5C96> <E1AC> <E1AC> <5C88> <E1AD> <E1AE> <5C98> <E1AF> <E1AF> <5C91> <E1B0> <E1B0> <5C9A> <E1B1> <E1B1> <5C9C> <E1B2> <E1B2> <5CB5> <E1B3> <E1B3> <5CA2> <E1B4> <E1B4> <5CBD> <E1B5> <E1B5> <5CAC> <E1B6> <E1B6> <5CAB> <E1B7> <E1B7> <5CB1> <E1B8> <E1B8> <5CA3> <E1B9> <E1B9> <5CC1> <E1BA> <E1BA> <5CB7> <E1BB> <E1BB> <5CC4> <E1BC> <E1BC> <5CD2> <E1BD> <E1BD> <5CE4> <E1BE> <E1BE> <5CCB> endbfrange 100 beginbfrange <E1BF> <E1BF> <5CE5> <E1C0> <E1C1> <5D02> <E1C2> <E1C2> <5D27> <E1C3> <E1C3> <5D26> <E1C4> <E1C4> <5D2E> <E1C5> <E1C5> <5D24> <E1C6> <E1C6> <5D1E> <E1C7> <E1C7> <5D06> <E1C8> <E1C8> <5D1B> <E1C9> <E1C9> <5D58> <E1CA> <E1CA> <5D3E> <E1CB> <E1CB> <5D34> <E1CC> <E1CC> <5D3D> <E1CD> <E1CD> <5D6C> <E1CE> <E1CE> <5D5B> <E1CF> <E1CF> <5D6F> <E1D0> <E1D0> <5D5D> <E1D1> <E1D1> <5D6B> <E1D2> <E1D2> <5D4B> <E1D3> <E1D3> <5D4A> <E1D4> <E1D4> <5D69> <E1D5> <E1D5> <5D74> <E1D6> <E1D6> <5D82> <E1D7> <E1D7> <5D99> <E1D8> <E1D8> <5D9D> <E1D9> <E1D9> <8C73> <E1DA> <E1DA> <5DB7> <E1DB> <E1DB> <5DC5> <E1DC> <E1DC> <5F73> <E1DD> <E1DD> <5F77> <E1DE> <E1DE> <5F82> <E1DF> <E1DF> <5F87> <E1E0> <E1E0> <5F89> <E1E1> <E1E1> <5F8C> <E1E2> <E1E2> <5F95> <E1E3> <E1E3> <5F99> <E1E4> <E1E4> <5F9C> <E1E5> <E1E5> <5FA8> <E1E6> <E1E6> <5FAD> <E1E7> <E1E7> <5FB5> <E1E8> <E1E8> <5FBC> <E1E9> <E1E9> <8862> <E1EA> <E1EA> <5F61> <E1EB> <E1EB> <72AD> <E1EC> <E1EC> <72B0> <E1ED> <E1ED> <72B4> <E1EE> <E1EF> <72B7> <E1F0> <E1F0> <72C3> <E1F1> <E1F1> <72C1> <E1F2> <E1F2> <72CE> <E1F3> <E1F3> <72CD> <E1F4> <E1F4> <72D2> <E1F5> <E1F5> <72E8> <E1F6> <E1F6> <72EF> <E1F7> <E1F7> <72E9> <E1F8> <E1F8> <72F2> <E1F9> <E1F9> <72F4> <E1FA> <E1FA> <72F7> <E1FB> <E1FB> <7301> <E1FC> <E1FC> <72F3> <E1FD> <E1FD> <7303> <E1FE> <E1FE> <72FA> <E240> <E27E> <91E6> <E280> <E2A0> <9225> <E2A1> <E2A1> <72FB> <E2A2> <E2A2> <7317> <E2A3> <E2A3> <7313> <E2A4> <E2A4> <7321> <E2A5> <E2A5> <730A> <E2A6> <E2A6> <731E> <E2A7> <E2A7> <731D> <E2A8> <E2A8> <7315> <E2A9> <E2A9> <7322> <E2AA> <E2AA> <7339> <E2AB> <E2AB> <7325> <E2AC> <E2AC> <732C> <E2AD> <E2AD> <7338> <E2AE> <E2AE> <7331> <E2AF> <E2AF> <7350> <E2B0> <E2B0> <734D> <E2B1> <E2B1> <7357> <E2B2> <E2B2> <7360> <E2B3> <E2B3> <736C> <E2B4> <E2B4> <736F> <E2B5> <E2B5> <737E> <E2B6> <E2B6> <821B> <E2B7> <E2B7> <5925> <E2B8> <E2B8> <98E7> <E2B9> <E2B9> <5924> <E2BA> <E2BA> <5902> <E2BB> <E2BB> <9963> <E2BC> <E2C1> <9967> <E2C2> <E2C2> <9974> <E2C3> <E2C3> <9977> <E2C4> <E2C4> <997D> <E2C5> <E2C5> <9980> <E2C6> <E2C6> <9984> <E2C7> <E2C7> <9987> <E2C8> <E2C8> <998A> <E2C9> <E2C9> <998D> endbfrange 100 beginbfrange <E2CA> <E2CB> <9990> <E2CC> <E2CE> <9993> <E2CF> <E2CF> <5E80> <E2D0> <E2D0> <5E91> <E2D1> <E2D1> <5E8B> <E2D2> <E2D2> <5E96> <E2D3> <E2D3> <5EA5> <E2D4> <E2D4> <5EA0> <E2D5> <E2D5> <5EB9> <E2D6> <E2D6> <5EB5> <E2D7> <E2D7> <5EBE> <E2D8> <E2D8> <5EB3> <E2D9> <E2D9> <8D53> <E2DA> <E2DA> <5ED2> <E2DB> <E2DB> <5ED1> <E2DC> <E2DC> <5EDB> <E2DD> <E2DD> <5EE8> <E2DE> <E2DE> <5EEA> <E2DF> <E2DF> <81BA> <E2E0> <E2E0> <5FC4> <E2E1> <E2E1> <5FC9> <E2E2> <E2E2> <5FD6> <E2E3> <E2E3> <5FCF> <E2E4> <E2E4> <6003> <E2E5> <E2E5> <5FEE> <E2E6> <E2E6> <6004> <E2E7> <E2E7> <5FE1> <E2E8> <E2E8> <5FE4> <E2E9> <E2E9> <5FFE> <E2EA> <E2EB> <6005> <E2EC> <E2EC> <5FEA> <E2ED> <E2ED> <5FED> <E2EE> <E2EE> <5FF8> <E2EF> <E2EF> <6019> <E2F0> <E2F0> <6035> <E2F1> <E2F1> <6026> <E2F2> <E2F2> <601B> <E2F3> <E2F3> <600F> <E2F4> <E2F4> <600D> <E2F5> <E2F5> <6029> <E2F6> <E2F6> <602B> <E2F7> <E2F7> <600A> <E2F8> <E2F8> <603F> <E2F9> <E2F9> <6021> <E2FA> <E2FB> <6078> <E2FC> <E2FC> <607B> <E2FD> <E2FD> <607A> <E2FE> <E2FE> <6042> <E340> <E36D> <9246> <E36E> <E37E> <9275> <E380> <E387> <9286> <E388> <E3A0> <928F> <E3A1> <E3A1> <606A> <E3A2> <E3A2> <607D> <E3A3> <E3A3> <6096> <E3A4> <E3A4> <609A> <E3A5> <E3A5> <60AD> <E3A6> <E3A6> <609D> <E3A7> <E3A7> <6083> <E3A8> <E3A8> <6092> <E3A9> <E3A9> <608C> <E3AA> <E3AA> <609B> <E3AB> <E3AB> <60EC> <E3AC> <E3AC> <60BB> <E3AD> <E3AD> <60B1> <E3AE> <E3AE> <60DD> <E3AF> <E3AF> <60D8> <E3B0> <E3B0> <60C6> <E3B1> <E3B1> <60DA> <E3B2> <E3B2> <60B4> <E3B3> <E3B3> <6120> <E3B4> <E3B4> <6126> <E3B5> <E3B5> <6115> <E3B6> <E3B6> <6123> <E3B7> <E3B7> <60F4> <E3B8> <E3B8> <6100> <E3B9> <E3B9> <610E> <E3BA> <E3BA> <612B> <E3BB> <E3BB> <614A> <E3BC> <E3BC> <6175> <E3BD> <E3BD> <61AC> <E3BE> <E3BE> <6194> <E3BF> <E3BF> <61A7> <E3C0> <E3C0> <61B7> <E3C1> <E3C1> <61D4> <E3C2> <E3C2> <61F5> <E3C3> <E3C3> <5FDD> <E3C4> <E3C4> <96B3> <E3C5> <E3C5> <95E9> <E3C6> <E3C6> <95EB> <E3C7> <E3C7> <95F1> <E3C8> <E3C8> <95F3> <E3C9> <E3CA> <95F5> <E3CB> <E3CB> <95FC> <E3CC> <E3CC> <95FE> <E3CD> <E3CE> <9603> <E3CF> <E3CF> <9606> <E3D0> <E3D0> <9608> <E3D1> <E3D4> <960A> <E3D5> <E3D5> <960F> endbfrange 100 beginbfrange <E3D6> <E3D6> <9612> <E3D7> <E3D9> <9615> <E3DA> <E3DB> <9619> <E3DC> <E3DC> <4E2C> <E3DD> <E3DD> <723F> <E3DE> <E3DE> <6215> <E3DF> <E3DF> <6C35> <E3E0> <E3E0> <6C54> <E3E1> <E3E1> <6C5C> <E3E2> <E3E2> <6C4A> <E3E3> <E3E3> <6CA3> <E3E4> <E3E4> <6C85> <E3E5> <E3E5> <6C90> <E3E6> <E3E6> <6C94> <E3E7> <E3E7> <6C8C> <E3E8> <E3E9> <6C68> <E3EA> <E3EA> <6C74> <E3EB> <E3EB> <6C76> <E3EC> <E3EC> <6C86> <E3ED> <E3ED> <6CA9> <E3EE> <E3EE> <6CD0> <E3EF> <E3EF> <6CD4> <E3F0> <E3F0> <6CAD> <E3F1> <E3F2> <6CF7> <E3F3> <E3F3> <6CF1> <E3F4> <E3F4> <6CD7> <E3F5> <E3F5> <6CB2> <E3F6> <E3F6> <6CE0> <E3F7> <E3F7> <6CD6> <E3F8> <E3F8> <6CFA> <E3F9> <E3F9> <6CEB> <E3FA> <E3FA> <6CEE> <E3FB> <E3FB> <6CB1> <E3FC> <E3FC> <6CD3> <E3FD> <E3FD> <6CEF> <E3FE> <E3FE> <6CFE> <E440> <E445> <92A8> <E446> <E45E> <92AF> <E45F> <E47E> <92C9> <E480> <E4A0> <92E9> <E4A1> <E4A1> <6D39> <E4A2> <E4A2> <6D27> <E4A3> <E4A3> <6D0C> <E4A4> <E4A4> <6D43> <E4A5> <E4A5> <6D48> <E4A6> <E4A6> <6D07> <E4A7> <E4A7> <6D04> <E4A8> <E4A8> <6D19> <E4A9> <E4A9> <6D0E> <E4AA> <E4AA> <6D2B> <E4AB> <E4AB> <6D4D> <E4AC> <E4AC> <6D2E> <E4AD> <E4AD> <6D35> <E4AE> <E4AE> <6D1A> <E4AF> <E4AF> <6D4F> <E4B0> <E4B0> <6D52> <E4B1> <E4B1> <6D54> <E4B2> <E4B2> <6D33> <E4B3> <E4B3> <6D91> <E4B4> <E4B4> <6D6F> <E4B5> <E4B5> <6D9E> <E4B6> <E4B6> <6DA0> <E4B7> <E4B7> <6D5E> <E4B8> <E4B9> <6D93> <E4BA> <E4BA> <6D5C> <E4BB> <E4BB> <6D60> <E4BC> <E4BC> <6D7C> <E4BD> <E4BD> <6D63> <E4BE> <E4BE> <6E1A> <E4BF> <E4BF> <6DC7> <E4C0> <E4C0> <6DC5> <E4C1> <E4C1> <6DDE> <E4C2> <E4C2> <6E0E> <E4C3> <E4C3> <6DBF> <E4C4> <E4C4> <6DE0> <E4C5> <E4C5> <6E11> <E4C6> <E4C6> <6DE6> <E4C7> <E4C7> <6DDD> <E4C8> <E4C8> <6DD9> <E4C9> <E4C9> <6E16> <E4CA> <E4CA> <6DAB> <E4CB> <E4CB> <6E0C> <E4CC> <E4CC> <6DAE> <E4CD> <E4CD> <6E2B> <E4CE> <E4CE> <6E6E> <E4CF> <E4CF> <6E4E> <E4D0> <E4D0> <6E6B> <E4D1> <E4D1> <6EB2> <E4D2> <E4D2> <6E5F> <E4D3> <E4D3> <6E86> <E4D4> <E4D5> <6E53> <E4D6> <E4D6> <6E32> <E4D7> <E4D7> <6E25> <E4D8> <E4D8> <6E44> <E4D9> <E4D9> <6EDF> <E4DA> <E4DA> <6EB1> <E4DB> <E4DB> <6E98> <E4DC> <E4DC> <6EE0> <E4DD> <E4DD> <6F2D> <E4DE> <E4DE> <6EE2> endbfrange 100 beginbfrange <E4DF> <E4DF> <6EA5> <E4E0> <E4E0> <6EA7> <E4E1> <E4E1> <6EBD> <E4E2> <E4E2> <6EBB> <E4E3> <E4E3> <6EB7> <E4E4> <E4E4> <6ED7> <E4E5> <E4E5> <6EB4> <E4E6> <E4E6> <6ECF> <E4E7> <E4E7> <6E8F> <E4E8> <E4E8> <6EC2> <E4E9> <E4E9> <6E9F> <E4EA> <E4EA> <6F62> <E4EB> <E4EC> <6F46> <E4ED> <E4ED> <6F24> <E4EE> <E4EE> <6F15> <E4EF> <E4EF> <6EF9> <E4F0> <E4F0> <6F2F> <E4F1> <E4F1> <6F36> <E4F2> <E4F2> <6F4B> <E4F3> <E4F3> <6F74> <E4F4> <E4F4> <6F2A> <E4F5> <E4F5> <6F09> <E4F6> <E4F6> <6F29> <E4F7> <E4F7> <6F89> <E4F8> <E4F8> <6F8D> <E4F9> <E4F9> <6F8C> <E4FA> <E4FA> <6F78> <E4FB> <E4FB> <6F72> <E4FC> <E4FC> <6F7C> <E4FD> <E4FD> <6F7A> <E4FE> <E4FE> <6FD1> <E540> <E573> <930A> <E574> <E57E> <933F> <E580> <E59F> <934A> <E5A0> <E5A0> <936B> <E5A1> <E5A1> <6FC9> <E5A2> <E5A2> <6FA7> <E5A3> <E5A3> <6FB9> <E5A4> <E5A4> <6FB6> <E5A5> <E5A5> <6FC2> <E5A6> <E5A6> <6FE1> <E5A7> <E5A7> <6FEE> <E5A8> <E5A8> <6FDE> <E5A9> <E5A9> <6FE0> <E5AA> <E5AA> <6FEF> <E5AB> <E5AB> <701A> <E5AC> <E5AC> <7023> <E5AD> <E5AD> <701B> <E5AE> <E5AE> <7039> <E5AF> <E5AF> <7035> <E5B0> <E5B0> <704F> <E5B1> <E5B1> <705E> <E5B2> <E5B2> <5B80> <E5B3> <E5B3> <5B84> <E5B4> <E5B4> <5B95> <E5B5> <E5B5> <5B93> <E5B6> <E5B6> <5BA5> <E5B7> <E5B7> <5BB8> <E5B8> <E5B8> <752F> <E5B9> <E5B9> <9A9E> <E5BA> <E5BA> <6434> <E5BB> <E5BB> <5BE4> <E5BC> <E5BC> <5BEE> <E5BD> <E5BD> <8930> <E5BE> <E5BE> <5BF0> <E5BF> <E5BF> <8E47> <E5C0> <E5C0> <8B07> <E5C1> <E5C1> <8FB6> <E5C2> <E5C2> <8FD3> <E5C3> <E5C3> <8FD5> <E5C4> <E5C4> <8FE5> <E5C5> <E5C5> <8FEE> <E5C6> <E5C6> <8FE4> <E5C7> <E5C7> <8FE9> <E5C8> <E5C8> <8FE6> <E5C9> <E5C9> <8FF3> <E5CA> <E5CA> <8FE8> <E5CB> <E5CB> <9005> <E5CC> <E5CC> <9004> <E5CD> <E5CD> <900B> <E5CE> <E5CE> <9026> <E5CF> <E5CF> <9011> <E5D0> <E5D0> <900D> <E5D1> <E5D1> <9016> <E5D2> <E5D2> <9021> <E5D3> <E5D4> <9035> <E5D5> <E5D5> <902D> <E5D6> <E5D6> <902F> <E5D7> <E5D7> <9044> <E5D8> <E5D9> <9051> <E5DA> <E5DA> <9050> <E5DB> <E5DB> <9068> <E5DC> <E5DC> <9058> <E5DD> <E5DD> <9062> <E5DE> <E5DE> <905B> <E5DF> <E5DF> <66B9> <E5E0> <E5E0> <9074> <E5E1> <E5E1> <907D> <E5E2> <E5E2> <9082> <E5E3> <E5E3> <9088> endbfrange 100 beginbfrange <E5E4> <E5E4> <9083> <E5E5> <E5E5> <908B> <E5E6> <E5E6> <5F50> <E5E7> <E5E7> <5F57> <E5E8> <E5E8> <5F56> <E5E9> <E5E9> <5F58> <E5EA> <E5EA> <5C3B> <E5EB> <E5EB> <54AB> <E5EC> <E5EC> <5C50> <E5ED> <E5ED> <5C59> <E5EE> <E5EE> <5B71> <E5EF> <E5EF> <5C63> <E5F0> <E5F0> <5C66> <E5F1> <E5F1> <7FBC> <E5F2> <E5F2> <5F2A> <E5F3> <E5F3> <5F29> <E5F4> <E5F4> <5F2D> <E5F5> <E5F5> <8274> <E5F6> <E5F6> <5F3C> <E5F7> <E5F7> <9B3B> <E5F8> <E5F8> <5C6E> <E5F9> <E5F9> <5981> <E5FA> <E5FA> <5983> <E5FB> <E5FB> <598D> <E5FC> <E5FD> <59A9> <E5FE> <E5FE> <59A3> <E640> <E662> <936C> <E663> <E67E> <9390> <E680> <E69D> <93AC> <E69E> <E6A0> <93CB> <E6A1> <E6A1> <5997> <E6A2> <E6A2> <59CA> <E6A3> <E6A3> <59AB> <E6A4> <E6A4> <599E> <E6A5> <E6A5> <59A4> <E6A6> <E6A6> <59D2> <E6A7> <E6A7> <59B2> <E6A8> <E6A8> <59AF> <E6A9> <E6A9> <59D7> <E6AA> <E6AA> <59BE> <E6AB> <E6AC> <5A05> <E6AD> <E6AD> <59DD> <E6AE> <E6AE> <5A08> <E6AF> <E6AF> <59E3> <E6B0> <E6B0> <59D8> <E6B1> <E6B1> <59F9> <E6B2> <E6B2> <5A0C> <E6B3> <E6B3> <5A09> <E6B4> <E6B4> <5A32> <E6B5> <E6B5> <5A34> <E6B6> <E6B6> <5A11> <E6B7> <E6B7> <5A23> <E6B8> <E6B8> <5A13> <E6B9> <E6B9> <5A40> <E6BA> <E6BA> <5A67> <E6BB> <E6BB> <5A4A> <E6BC> <E6BC> <5A55> <E6BD> <E6BD> <5A3C> <E6BE> <E6BE> <5A62> <E6BF> <E6BF> <5A75> <E6C0> <E6C0> <80EC> <E6C1> <E6C1> <5AAA> <E6C2> <E6C2> <5A9B> <E6C3> <E6C3> <5A77> <E6C4> <E6C4> <5A7A> <E6C5> <E6C5> <5ABE> <E6C6> <E6C6> <5AEB> <E6C7> <E6C7> <5AB2> <E6C8> <E6C8> <5AD2> <E6C9> <E6C9> <5AD4> <E6CA> <E6CA> <5AB8> <E6CB> <E6CB> <5AE0> <E6CC> <E6CC> <5AE3> <E6CD> <E6CD> <5AF1> <E6CE> <E6CE> <5AD6> <E6CF> <E6CF> <5AE6> <E6D0> <E6D0> <5AD8> <E6D1> <E6D1> <5ADC> <E6D2> <E6D2> <5B09> <E6D3> <E6D3> <5B17> <E6D4> <E6D4> <5B16> <E6D5> <E6D5> <5B32> <E6D6> <E6D6> <5B37> <E6D7> <E6D7> <5B40> <E6D8> <E6D8> <5C15> <E6D9> <E6D9> <5C1C> <E6DA> <E6DA> <5B5A> <E6DB> <E6DB> <5B65> <E6DC> <E6DC> <5B73> <E6DD> <E6DD> <5B51> <E6DE> <E6DE> <5B53> <E6DF> <E6DF> <5B62> <E6E0> <E6E0> <9A75> <E6E1> <E6E2> <9A77> <E6E3> <E6E3> <9A7A> <E6E4> <E6E4> <9A7F> <E6E5> <E6E5> <9A7D> <E6E6> <E6E7> <9A80> <E6E8> <E6E8> <9A85> <E6E9> <E6E9> <9A88> endbfrange 100 beginbfrange <E6EA> <E6EA> <9A8A> <E6EB> <E6EB> <9A90> <E6EC> <E6ED> <9A92> <E6EE> <E6EE> <9A96> <E6EF> <E6EF> <9A98> <E6F0> <E6F2> <9A9B> <E6F3> <E6F4> <9A9F> <E6F5> <E6F6> <9AA2> <E6F7> <E6F7> <9AA5> <E6F8> <E6F8> <9AA7> <E6F9> <E6F9> <7E9F> <E6FA> <E6FA> <7EA1> <E6FB> <E6FB> <7EA3> <E6FC> <E6FC> <7EA5> <E6FD> <E6FE> <7EA8> <E740> <E747> <93CE> <E748> <E77E> <93D7> <E780> <E7A0> <940E> <E7A1> <E7A1> <7EAD> <E7A2> <E7A2> <7EB0> <E7A3> <E7A3> <7EBE> <E7A4> <E7A6> <7EC0> <E7A7> <E7A7> <7EC9> <E7A8> <E7A9> <7ECB> <E7AA> <E7AA> <7ED0> <E7AB> <E7AB> <7ED4> <E7AC> <E7AC> <7ED7> <E7AD> <E7AD> <7EDB> <E7AE> <E7AF> <7EE0> <E7B0> <E7B0> <7EE8> <E7B1> <E7B1> <7EEB> <E7B2> <E7B3> <7EEE> <E7B4> <E7B5> <7EF1> <E7B6> <E7B6> <7F0D> <E7B7> <E7B7> <7EF6> <E7B8> <E7B9> <7EFA> <E7BA> <E7BA> <7EFE> <E7BB> <E7BD> <7F01> <E7BE> <E7BF> <7F07> <E7C0> <E7C1> <7F0B> <E7C2> <E7C2> <7F0F> <E7C3> <E7C4> <7F11> <E7C5> <E7C5> <7F17> <E7C6> <E7C6> <7F19> <E7C7> <E7C7> <7F1C> <E7C8> <E7C8> <7F1B> <E7C9> <E7C9> <7F1F> <E7CA> <E7D0> <7F21> <E7D1> <E7D4> <7F2A> <E7D5> <E7D9> <7F2F> <E7DA> <E7DA> <7F35> <E7DB> <E7DB> <5E7A> <E7DC> <E7DC> <757F> <E7DD> <E7DD> <5DDB> <E7DE> <E7DE> <753E> <E7DF> <E7DF> <9095> <E7E0> <E7E0> <738E> <E7E1> <E7E1> <7391> <E7E2> <E7E2> <73AE> <E7E3> <E7E3> <73A2> <E7E4> <E7E4> <739F> <E7E5> <E7E5> <73CF> <E7E6> <E7E6> <73C2> <E7E7> <E7E7> <73D1> <E7E8> <E7E8> <73B7> <E7E9> <E7E9> <73B3> <E7EA> <E7EA> <73C0> <E7EB> <E7EB> <73C9> <E7EC> <E7EC> <73C8> <E7ED> <E7ED> <73E5> <E7EE> <E7EE> <73D9> <E7EF> <E7EF> <987C> <E7F0> <E7F0> <740A> <E7F1> <E7F1> <73E9> <E7F2> <E7F2> <73E7> <E7F3> <E7F3> <73DE> <E7F4> <E7F4> <73BA> <E7F5> <E7F5> <73F2> <E7F6> <E7F6> <740F> <E7F7> <E7F7> <742A> <E7F8> <E7F8> <745B> <E7F9> <E7F9> <7426> <E7FA> <E7FA> <7425> <E7FB> <E7FB> <7428> <E7FC> <E7FC> <7430> <E7FD> <E7FD> <742E> <E7FE> <E7FE> <742C> <E840> <E84E> <942F> <E84F> <E87A> <943F> <E87B> <E87E> <946C> <E880> <E894> <9470> <E895> <E895> <9491> <E896> <E896> <9496> <E897> <E897> <9498> <E898> <E898> <94C7> <E899> <E899> <94CF> <E89A> <E89B> <94D3> <E89C> <E89C> <94DA> <E89D> <E89D> <94E6> <E89E> <E89E> <94FB> endbfrange 100 beginbfrange <E89F> <E89F> <951C> <E8A0> <E8A0> <9520> <E8A1> <E8A1> <741B> <E8A2> <E8A2> <741A> <E8A3> <E8A3> <7441> <E8A4> <E8A4> <745C> <E8A5> <E8A5> <7457> <E8A6> <E8A6> <7455> <E8A7> <E8A7> <7459> <E8A8> <E8A8> <7477> <E8A9> <E8A9> <746D> <E8AA> <E8AA> <747E> <E8AB> <E8AB> <749C> <E8AC> <E8AC> <748E> <E8AD> <E8AE> <7480> <E8AF> <E8AF> <7487> <E8B0> <E8B0> <748B> <E8B1> <E8B1> <749E> <E8B2> <E8B3> <74A8> <E8B4> <E8B4> <7490> <E8B5> <E8B5> <74A7> <E8B6> <E8B6> <74D2> <E8B7> <E8B7> <74BA> <E8B8> <E8BA> <97EA> <E8BB> <E8BB> <674C> <E8BC> <E8BC> <6753> <E8BD> <E8BD> <675E> <E8BE> <E8BE> <6748> <E8BF> <E8BF> <6769> <E8C0> <E8C0> <67A5> <E8C1> <E8C1> <6787> <E8C2> <E8C2> <676A> <E8C3> <E8C3> <6773> <E8C4> <E8C4> <6798> <E8C5> <E8C5> <67A7> <E8C6> <E8C6> <6775> <E8C7> <E8C7> <67A8> <E8C8> <E8C8> <679E> <E8C9> <E8C9> <67AD> <E8CA> <E8CA> <678B> <E8CB> <E8CB> <6777> <E8CC> <E8CC> <677C> <E8CD> <E8CD> <67F0> <E8CE> <E8CE> <6809> <E8CF> <E8CF> <67D8> <E8D0> <E8D0> <680A> <E8D1> <E8D1> <67E9> <E8D2> <E8D2> <67B0> <E8D3> <E8D3> <680C> <E8D4> <E8D4> <67D9> <E8D5> <E8D5> <67B5> <E8D6> <E8D6> <67DA> <E8D7> <E8D7> <67B3> <E8D8> <E8D8> <67DD> <E8D9> <E8D9> <6800> <E8DA> <E8DA> <67C3> <E8DB> <E8DB> <67B8> <E8DC> <E8DC> <67E2> <E8DD> <E8DD> <680E> <E8DE> <E8DE> <67C1> <E8DF> <E8DF> <67FD> <E8E0> <E8E1> <6832> <E8E2> <E8E3> <6860> <E8E4> <E8E4> <684E> <E8E5> <E8E5> <6862> <E8E6> <E8E6> <6844> <E8E7> <E8E7> <6864> <E8E8> <E8E8> <6883> <E8E9> <E8E9> <681D> <E8EA> <E8EA> <6855> <E8EB> <E8EB> <6866> <E8EC> <E8EC> <6841> <E8ED> <E8ED> <6867> <E8EE> <E8EE> <6840> <E8EF> <E8EF> <683E> <E8F0> <E8F0> <684A> <E8F1> <E8F1> <6849> <E8F2> <E8F2> <6829> <E8F3> <E8F3> <68B5> <E8F4> <E8F4> <688F> <E8F5> <E8F5> <6874> <E8F6> <E8F6> <6877> <E8F7> <E8F7> <6893> <E8F8> <E8F8> <686B> <E8F9> <E8F9> <68C2> <E8FA> <E8FA> <696E> <E8FB> <E8FB> <68FC> <E8FC> <E8FD> <691F> <E8FE> <E8FE> <68F9> <E940> <E940> <9527> <E941> <E941> <9533> <E942> <E942> <953D> <E943> <E943> <9543> <E944> <E944> <9548> <E945> <E945> <954B> <E946> <E946> <9555> <E947> <E947> <955A> <E948> <E948> <9560> <E949> <E949> <956E> <E94A> <E94B> <9574> endbfrange 100 beginbfrange <E94C> <E953> <9577> <E954> <E97E> <9580> <E980> <E9A0> <95AB> <E9A1> <E9A1> <6924> <E9A2> <E9A2> <68F0> <E9A3> <E9A3> <690B> <E9A4> <E9A4> <6901> <E9A5> <E9A5> <6957> <E9A6> <E9A6> <68E3> <E9A7> <E9A7> <6910> <E9A8> <E9A8> <6971> <E9A9> <E9A9> <6939> <E9AA> <E9AA> <6960> <E9AB> <E9AB> <6942> <E9AC> <E9AC> <695D> <E9AD> <E9AD> <6984> <E9AE> <E9AE> <696B> <E9AF> <E9AF> <6980> <E9B0> <E9B0> <6998> <E9B1> <E9B1> <6978> <E9B2> <E9B2> <6934> <E9B3> <E9B3> <69CC> <E9B4> <E9B5> <6987> <E9B6> <E9B6> <69CE> <E9B7> <E9B7> <6989> <E9B8> <E9B8> <6966> <E9B9> <E9B9> <6963> <E9BA> <E9BA> <6979> <E9BB> <E9BB> <699B> <E9BC> <E9BC> <69A7> <E9BD> <E9BD> <69BB> <E9BE> <E9BE> <69AB> <E9BF> <E9BF> <69AD> <E9C0> <E9C0> <69D4> <E9C1> <E9C1> <69B1> <E9C2> <E9C2> <69C1> <E9C3> <E9C3> <69CA> <E9C4> <E9C4> <69DF> <E9C5> <E9C5> <6995> <E9C6> <E9C6> <69E0> <E9C7> <E9C7> <698D> <E9C8> <E9C8> <69FF> <E9C9> <E9C9> <6A2F> <E9CA> <E9CA> <69ED> <E9CB> <E9CC> <6A17> <E9CD> <E9CD> <6A65> <E9CE> <E9CE> <69F2> <E9CF> <E9CF> <6A44> <E9D0> <E9D0> <6A3E> <E9D1> <E9D1> <6AA0> <E9D2> <E9D2> <6A50> <E9D3> <E9D3> <6A5B> <E9D4> <E9D4> <6A35> <E9D5> <E9D5> <6A8E> <E9D6> <E9D6> <6A79> <E9D7> <E9D7> <6A3D> <E9D8> <E9D8> <6A28> <E9D9> <E9D9> <6A58> <E9DA> <E9DA> <6A7C> <E9DB> <E9DB> <6A91> <E9DC> <E9DC> <6A90> <E9DD> <E9DD> <6AA9> <E9DE> <E9DE> <6A97> <E9DF> <E9DF> <6AAB> <E9E0> <E9E0> <7337> <E9E1> <E9E1> <7352> <E9E2> <E9E3> <6B81> <E9E4> <E9E4> <6B87> <E9E5> <E9E5> <6B84> <E9E6> <E9E7> <6B92> <E9E8> <E9E8> <6B8D> <E9E9> <E9EA> <6B9A> <E9EB> <E9EB> <6BA1> <E9EC> <E9EC> <6BAA> <E9ED> <E9ED> <8F6B> <E9EE> <E9EE> <8F6D> <E9EF> <E9F1> <8F71> <E9F2> <E9F3> <8F75> <E9F4> <E9F4> <8F78> <E9F5> <E9F5> <8F77> <E9F6> <E9F7> <8F79> <E9F8> <E9F8> <8F7C> <E9F9> <E9F9> <8F7E> <E9FA> <E9FB> <8F81> <E9FC> <E9FC> <8F84> <E9FD> <E9FD> <8F87> <E9FE> <E9FE> <8F8B> <EA40> <EA5B> <95CC> <EA5C> <EA5C> <95EC> <EA5D> <EA5D> <95FF> <EA5E> <EA5E> <9607> <EA5F> <EA5F> <9613> <EA60> <EA60> <9618> <EA61> <EA61> <961B> <EA62> <EA62> <961E> <EA63> <EA63> <9620> <EA64> <EA6A> <9623> <EA6B> <EA6D> <962B> <EA6E> <EA6F> <962F> <EA70> <EA73> <9637> endbfrange 100 beginbfrange <EA74> <EA74> <963E> <EA75> <EA75> <9641> <EA76> <EA76> <9643> <EA77> <EA77> <964A> <EA78> <EA79> <964E> <EA7A> <EA7C> <9651> <EA7D> <EA7E> <9656> <EA80> <EA82> <9658> <EA83> <EA85> <965C> <EA86> <EA86> <9660> <EA87> <EA87> <9663> <EA88> <EA89> <9665> <EA8A> <EA8A> <966B> <EA8B> <EA8F> <966D> <EA90> <EA90> <9673> <EA91> <EA9D> <9678> <EA9E> <EA9E> <9687> <EA9F> <EAA0> <9689> <EAA1> <EAA3> <8F8D> <EAA4> <EAA4> <8F98> <EAA5> <EAA5> <8F9A> <EAA6> <EAA6> <8ECE> <EAA7> <EAA7> <620B> <EAA8> <EAA8> <6217> <EAA9> <EAA9> <621B> <EAAA> <EAAA> <621F> <EAAB> <EAAB> <6222> <EAAC> <EAAC> <6221> <EAAD> <EAAD> <6225> <EAAE> <EAAE> <6224> <EAAF> <EAAF> <622C> <EAB0> <EAB0> <81E7> <EAB1> <EAB1> <74EF> <EAB2> <EAB2> <74F4> <EAB3> <EAB3> <74FF> <EAB4> <EAB4> <750F> <EAB5> <EAB5> <7511> <EAB6> <EAB6> <7513> <EAB7> <EAB7> <6534> <EAB8> <EABA> <65EE> <EABB> <EABB> <660A> <EABC> <EABC> <6619> <EABD> <EABD> <6772> <EABE> <EABE> <6603> <EABF> <EABF> <6615> <EAC0> <EAC0> <6600> <EAC1> <EAC1> <7085> <EAC2> <EAC2> <66F7> <EAC3> <EAC3> <661D> <EAC4> <EAC4> <6634> <EAC5> <EAC5> <6631> <EAC6> <EAC6> <6636> <EAC7> <EAC7> <6635> <EAC8> <EAC8> <8006> <EAC9> <EAC9> <665F> <EACA> <EACA> <6654> <EACB> <EACB> <6641> <EACC> <EACC> <664F> <EACD> <EACD> <6656> <EACE> <EACE> <6661> <EACF> <EACF> <6657> <EAD0> <EAD0> <6677> <EAD1> <EAD1> <6684> <EAD2> <EAD2> <668C> <EAD3> <EAD3> <66A7> <EAD4> <EAD4> <669D> <EAD5> <EAD5> <66BE> <EAD6> <EAD7> <66DB> <EAD8> <EAD8> <66E6> <EAD9> <EAD9> <66E9> <EADA> <EADB> <8D32> <EADC> <EADC> <8D36> <EADD> <EADD> <8D3B> <EADE> <EADE> <8D3D> <EADF> <EADF> <8D40> <EAE0> <EAE1> <8D45> <EAE2> <EAE3> <8D48> <EAE4> <EAE4> <8D47> <EAE5> <EAE5> <8D4D> <EAE6> <EAE6> <8D55> <EAE7> <EAE7> <8D59> <EAE8> <EAE8> <89C7> <EAE9> <EAEB> <89CA> <EAEC> <EAEF> <89CE> <EAF0> <EAF0> <726E> <EAF1> <EAF1> <729F> <EAF2> <EAF2> <725D> <EAF3> <EAF3> <7266> <EAF4> <EAF4> <726F> <EAF5> <EAF6> <727E> <EAF7> <EAF7> <7284> <EAF8> <EAF8> <728B> <EAF9> <EAF9> <728D> <EAFA> <EAFA> <728F> <EAFB> <EAFB> <7292> <EAFC> <EAFC> <6308> <EAFD> <EAFD> <6332> <EAFE> <EAFE> <63B0> <EB40> <EB40> <968C> <EB41> <EB41> <968E> endbfrange 100 beginbfrange <EB42> <EB44> <9691> <EB45> <EB46> <9695> <EB47> <EB48> <969A> <EB49> <EB52> <969D> <EB53> <EB5A> <96A8> <EB5B> <EB5C> <96B1> <EB5D> <EB5E> <96B4> <EB5F> <EB60> <96B7> <EB61> <EB62> <96BA> <EB63> <EB63> <96BF> <EB64> <EB65> <96C2> <EB66> <EB66> <96C8> <EB67> <EB68> <96CA> <EB69> <EB6A> <96D0> <EB6B> <EB6C> <96D3> <EB6D> <EB76> <96D6> <EB77> <EB7D> <96E1> <EB7E> <EB7E> <96EB> <EB80> <EB82> <96EC> <EB83> <EB85> <96F0> <EB86> <EB87> <96F4> <EB88> <EB88> <96F8> <EB89> <EB8C> <96FA> <EB8D> <EB8D> <96FF> <EB8E> <EB8F> <9702> <EB90> <EB90> <9705> <EB91> <EB93> <970A> <EB94> <EB96> <9710> <EB97> <EB98> <9714> <EB99> <EB9D> <9717> <EB9E> <EB9E> <971D> <EB9F> <EBA0> <971F> <EBA1> <EBA1> <643F> <EBA2> <EBA2> <64D8> <EBA3> <EBA3> <8004> <EBA4> <EBA4> <6BEA> <EBA5> <EBA5> <6BF3> <EBA6> <EBA6> <6BFD> <EBA7> <EBA7> <6BF5> <EBA8> <EBA8> <6BF9> <EBA9> <EBA9> <6C05> <EBAA> <EBAA> <6C07> <EBAB> <EBAB> <6C06> <EBAC> <EBAC> <6C0D> <EBAD> <EBAD> <6C15> <EBAE> <EBB0> <6C18> <EBB1> <EBB1> <6C21> <EBB2> <EBB2> <6C29> <EBB3> <EBB3> <6C24> <EBB4> <EBB4> <6C2A> <EBB5> <EBB5> <6C32> <EBB6> <EBB6> <6535> <EBB7> <EBB7> <6555> <EBB8> <EBB8> <656B> <EBB9> <EBB9> <724D> <EBBA> <EBBA> <7252> <EBBB> <EBBB> <7256> <EBBC> <EBBC> <7230> <EBBD> <EBBD> <8662> <EBBE> <EBBE> <5216> <EBBF> <EBBF> <809F> <EBC0> <EBC0> <809C> <EBC1> <EBC1> <8093> <EBC2> <EBC2> <80BC> <EBC3> <EBC3> <670A> <EBC4> <EBC4> <80BD> <EBC5> <EBC5> <80B1> <EBC6> <EBC6> <80AB> <EBC7> <EBC7> <80AD> <EBC8> <EBC8> <80B4> <EBC9> <EBC9> <80B7> <EBCA> <EBCD> <80E7> <EBCE> <EBCE> <80DB> <EBCF> <EBCF> <80C2> <EBD0> <EBD0> <80C4> <EBD1> <EBD1> <80D9> <EBD2> <EBD2> <80CD> <EBD3> <EBD3> <80D7> <EBD4> <EBD4> <6710> <EBD5> <EBD5> <80DD> <EBD6> <EBD6> <80EB> <EBD7> <EBD7> <80F1> <EBD8> <EBD8> <80F4> <EBD9> <EBD9> <80ED> <EBDA> <EBDB> <810D> <EBDC> <EBDC> <80F2> <EBDD> <EBDD> <80FC> <EBDE> <EBDE> <6715> <EBDF> <EBDF> <8112> <EBE0> <EBE0> <8C5A> <EBE1> <EBE1> <8136> <EBE2> <EBE2> <811E> <EBE3> <EBE3> <812C> <EBE4> <EBE4> <8118> <EBE5> <EBE5> <8132> <EBE6> <EBE6> <8148> <EBE7> <EBE7> <814C> <EBE8> <EBE8> <8153> <EBE9> <EBE9> <8174> <EBEA> <EBEB> <8159> endbfrange 100 beginbfrange <EBEC> <EBEC> <8171> <EBED> <EBED> <8160> <EBEE> <EBEE> <8169> <EBEF> <EBF0> <817C> <EBF1> <EBF1> <816D> <EBF2> <EBF2> <8167> <EBF3> <EBF3> <584D> <EBF4> <EBF4> <5AB5> <EBF5> <EBF5> <8188> <EBF6> <EBF6> <8182> <EBF7> <EBF7> <8191> <EBF8> <EBF8> <6ED5> <EBF9> <EBF9> <81A3> <EBFA> <EBFA> <81AA> <EBFB> <EBFB> <81CC> <EBFC> <EBFC> <6726> <EBFD> <EBFD> <81CA> <EBFE> <EBFE> <81BB> <EC40> <EC48> <9721> <EC49> <EC4A> <972B> <EC4B> <EC4C> <972E> <EC4D> <EC4D> <9731> <EC4E> <EC52> <9733> <EC53> <EC56> <973A> <EC57> <EC69> <973F> <EC6A> <EC6B> <9754> <EC6C> <EC6D> <9757> <EC6E> <EC6E> <975A> <EC6F> <EC70> <975C> <EC71> <EC71> <975F> <EC72> <EC73> <9763> <EC74> <EC76> <9766> <EC77> <EC7E> <976A> <EC80> <EC80> <9772> <EC81> <EC81> <9775> <EC82> <EC86> <9777> <EC87> <EC8E> <977D> <EC8F> <EC93> <9786> <EC94> <EC94> <978C> <EC95> <EC97> <978E> <EC98> <EC98> <9793> <EC99> <EC9B> <9795> <EC9C> <ECA0> <9799> <ECA1> <ECA1> <81C1> <ECA2> <ECA2> <81A6> <ECA3> <ECA3> <6B24> <ECA4> <ECA4> <6B37> <ECA5> <ECA5> <6B39> <ECA6> <ECA6> <6B43> <ECA7> <ECA7> <6B46> <ECA8> <ECA8> <6B59> <ECA9> <ECAB> <98D1> <ECAC> <ECAC> <98D5> <ECAD> <ECAE> <98D9> <ECAF> <ECAF> <6BB3> <ECB0> <ECB0> <5F40> <ECB1> <ECB1> <6BC2> <ECB2> <ECB2> <89F3> <ECB3> <ECB3> <6590> <ECB4> <ECB4> <9F51> <ECB5> <ECB5> <6593> <ECB6> <ECB6> <65BC> <ECB7> <ECB7> <65C6> <ECB8> <ECB8> <65C4> <ECB9> <ECB9> <65C3> <ECBA> <ECBA> <65CC> <ECBB> <ECBB> <65CE> <ECBC> <ECBC> <65D2> <ECBD> <ECBD> <65D6> <ECBE> <ECBE> <7080> <ECBF> <ECBF> <709C> <ECC0> <ECC0> <7096> <ECC1> <ECC1> <709D> <ECC2> <ECC2> <70BB> <ECC3> <ECC3> <70C0> <ECC4> <ECC4> <70B7> <ECC5> <ECC5> <70AB> <ECC6> <ECC6> <70B1> <ECC7> <ECC7> <70E8> <ECC8> <ECC8> <70CA> <ECC9> <ECC9> <7110> <ECCA> <ECCA> <7113> <ECCB> <ECCB> <7116> <ECCC> <ECCC> <712F> <ECCD> <ECCD> <7131> <ECCE> <ECCE> <7173> <ECCF> <ECCF> <715C> <ECD0> <ECD0> <7168> <ECD1> <ECD1> <7145> <ECD2> <ECD2> <7172> <ECD3> <ECD3> <714A> <ECD4> <ECD4> <7178> <ECD5> <ECD5> <717A> <ECD6> <ECD6> <7198> <ECD7> <ECD7> <71B3> <ECD8> <ECD8> <71B5> <ECD9> <ECD9> <71A8> <ECDA> <ECDA> <71A0> <ECDB> <ECDB> <71E0> <ECDC> <ECDC> <71D4> endbfrange 100 beginbfrange <ECDD> <ECDD> <71E7> <ECDE> <ECDE> <71F9> <ECDF> <ECDF> <721D> <ECE0> <ECE0> <7228> <ECE1> <ECE1> <706C> <ECE2> <ECE2> <7118> <ECE3> <ECE3> <7166> <ECE4> <ECE4> <71B9> <ECE5> <ECE5> <623E> <ECE6> <ECE6> <623D> <ECE7> <ECE7> <6243> <ECE8> <ECE9> <6248> <ECEA> <ECEA> <793B> <ECEB> <ECEB> <7940> <ECEC> <ECEC> <7946> <ECED> <ECED> <7949> <ECEE> <ECEF> <795B> <ECF0> <ECF0> <7953> <ECF1> <ECF1> <795A> <ECF2> <ECF2> <7962> <ECF3> <ECF3> <7957> <ECF4> <ECF4> <7960> <ECF5> <ECF5> <796F> <ECF6> <ECF6> <7967> <ECF7> <ECF7> <797A> <ECF8> <ECF8> <7985> <ECF9> <ECF9> <798A> <ECFA> <ECFA> <799A> <ECFB> <ECFB> <79A7> <ECFC> <ECFC> <79B3> <ECFD> <ECFD> <5FD1> <ECFE> <ECFE> <5FD0> <ED40> <ED41> <979E> <ED42> <ED43> <97A1> <ED44> <ED4A> <97A4> <ED4B> <ED4B> <97AC> <ED4C> <ED4C> <97AE> <ED4D> <ED4E> <97B0> <ED4F> <ED4F> <97B3> <ED50> <ED7E> <97B5> <ED80> <ED81> <97E4> <ED82> <ED82> <97E8> <ED83> <ED87> <97EE> <ED88> <ED88> <97F4> <ED89> <EDA0> <97F7> <EDA1> <EDA1> <603C> <EDA2> <EDA2> <605D> <EDA3> <EDA3> <605A> <EDA4> <EDA4> <6067> <EDA5> <EDA5> <6041> <EDA6> <EDA6> <6059> <EDA7> <EDA7> <6063> <EDA8> <EDA8> <60AB> <EDA9> <EDA9> <6106> <EDAA> <EDAA> <610D> <EDAB> <EDAB> <615D> <EDAC> <EDAC> <61A9> <EDAD> <EDAD> <619D> <EDAE> <EDAE> <61CB> <EDAF> <EDAF> <61D1> <EDB0> <EDB0> <6206> <EDB1> <EDB1> <8080> <EDB2> <EDB2> <807F> <EDB3> <EDB3> <6C93> <EDB4> <EDB4> <6CF6> <EDB5> <EDB5> <6DFC> <EDB6> <EDB6> <77F6> <EDB7> <EDB7> <77F8> <EDB8> <EDB8> <7800> <EDB9> <EDB9> <7809> <EDBA> <EDBB> <7817> <EDBC> <EDBC> <7811> <EDBD> <EDBD> <65AB> <EDBE> <EDBE> <782D> <EDBF> <EDC0> <781C> <EDC1> <EDC3> <7839> <EDC4> <EDC4> <781F> <EDC5> <EDC5> <783C> <EDC6> <EDC6> <7825> <EDC7> <EDC7> <782C> <EDC8> <EDC8> <7823> <EDC9> <EDC9> <7829> <EDCA> <EDCA> <784E> <EDCB> <EDCB> <786D> <EDCC> <EDCD> <7856> <EDCE> <EDCE> <7826> <EDCF> <EDCF> <7850> <EDD0> <EDD0> <7847> <EDD1> <EDD1> <784C> <EDD2> <EDD2> <786A> <EDD3> <EDD3> <789B> <EDD4> <EDD4> <7893> <EDD5> <EDD5> <789A> <EDD6> <EDD6> <7887> <EDD7> <EDD7> <789C> <EDD8> <EDD8> <78A1> <EDD9> <EDD9> <78A3> <EDDA> <EDDA> <78B2> <EDDB> <EDDB> <78B9> <EDDC> <EDDC> <78A5> endbfrange 100 beginbfrange <EDDD> <EDDD> <78D4> <EDDE> <EDDE> <78D9> <EDDF> <EDDF> <78C9> <EDE0> <EDE0> <78EC> <EDE1> <EDE1> <78F2> <EDE2> <EDE2> <7905> <EDE3> <EDE3> <78F4> <EDE4> <EDE4> <7913> <EDE5> <EDE5> <7924> <EDE6> <EDE6> <791E> <EDE7> <EDE7> <7934> <EDE8> <EDE8> <9F9B> <EDE9> <EDE9> <9EF9> <EDEA> <EDEB> <9EFB> <EDEC> <EDEC> <76F1> <EDED> <EDED> <7704> <EDEE> <EDEE> <770D> <EDEF> <EDEF> <76F9> <EDF0> <EDF1> <7707> <EDF2> <EDF2> <771A> <EDF3> <EDF3> <7722> <EDF4> <EDF4> <7719> <EDF5> <EDF5> <772D> <EDF6> <EDF6> <7726> <EDF7> <EDF7> <7735> <EDF8> <EDF8> <7738> <EDF9> <EDFA> <7750> <EDFB> <EDFB> <7747> <EDFC> <EDFC> <7743> <EDFD> <EDFD> <775A> <EDFE> <EDFE> <7768> <EE40> <EE7E> <980F> <EE80> <EEA0> <984E> <EEA1> <EEA1> <7762> <EEA2> <EEA2> <7765> <EEA3> <EEA3> <777F> <EEA4> <EEA4> <778D> <EEA5> <EEA5> <777D> <EEA6> <EEA6> <7780> <EEA7> <EEA7> <778C> <EEA8> <EEA8> <7791> <EEA9> <EEAA> <779F> <EEAB> <EEAB> <77B0> <EEAC> <EEAC> <77B5> <EEAD> <EEAD> <77BD> <EEAE> <EEAE> <753A> <EEAF> <EEAF> <7540> <EEB0> <EEB0> <754E> <EEB1> <EEB1> <754B> <EEB2> <EEB2> <7548> <EEB3> <EEB3> <755B> <EEB4> <EEB4> <7572> <EEB5> <EEB5> <7579> <EEB6> <EEB6> <7583> <EEB7> <EEB7> <7F58> <EEB8> <EEB8> <7F61> <EEB9> <EEB9> <7F5F> <EEBA> <EEBA> <8A48> <EEBB> <EEBB> <7F68> <EEBC> <EEBC> <7F74> <EEBD> <EEBD> <7F71> <EEBE> <EEBE> <7F79> <EEBF> <EEBF> <7F81> <EEC0> <EEC0> <7F7E> <EEC1> <EEC1> <76CD> <EEC2> <EEC2> <76E5> <EEC3> <EEC3> <8832> <EEC4> <EEC6> <9485> <EEC7> <EEC7> <948B> <EEC8> <EEC8> <948A> <EEC9> <EECA> <948C> <EECB> <EECC> <948F> <EECD> <EECD> <9494> <EECE> <EECE> <9497> <EECF> <EECF> <9495> <EED0> <EED2> <949A> <EED3> <EED4> <94A3> <EED5> <EED5> <94AB> <EED6> <EED6> <94AA> <EED7> <EED7> <94AD> <EED8> <EED8> <94AC> <EED9> <EEDA> <94AF> <EEDB> <EEDB> <94B2> <EEDC> <EEDC> <94B4> <EEDD> <EEE1> <94B6> <EEE2> <EEE3> <94BC> <EEE4> <EEE4> <94BF> <EEE5> <EEE5> <94C4> <EEE6> <EEEC> <94C8> <EEED> <EEEF> <94D0> <EEF0> <EEF2> <94D5> <EEF3> <EEF3> <94D9> <EEF4> <EEF4> <94D8> <EEF5> <EEF5> <94DB> <EEF6> <EEF8> <94DE> <EEF9> <EEF9> <94E2> <EEFA> <EEFB> <94E4> <EEFC> <EEFD> <94E7> <EEFE> <EEFE> <94EA> <EF40> <EF45> <986F> endbfrange 100 beginbfrange <EF46> <EF46> <988B> <EF47> <EF47> <988E> <EF48> <EF48> <9892> <EF49> <EF49> <9895> <EF4A> <EF4A> <9899> <EF4B> <EF4B> <98A3> <EF4C> <EF71> <98A8> <EF72> <EF73> <98CF> <EF74> <EF74> <98D4> <EF75> <EF76> <98D6> <EF77> <EF79> <98DB> <EF7A> <EF7E> <98E0> <EF80> <EF81> <98E5> <EF82> <EFA0> <98E9> <EFA1> <EFA1> <94E9> <EFA2> <EFA2> <94EB> <EFA3> <EFA4> <94EE> <EFA5> <EFA7> <94F3> <EFA8> <EFA8> <94F7> <EFA9> <EFA9> <94F9> <EFAA> <EFAB> <94FC> <EFAC> <EFAC> <94FF> <EFAD> <EFAD> <9503> <EFAE> <EFAE> <9502> <EFAF> <EFB0> <9506> <EFB1> <EFB2> <9509> <EFB3> <EFB5> <950D> <EFB6> <EFBA> <9512> <EFBB> <EFBB> <9518> <EFBC> <EFBC> <951B> <EFBD> <EFBF> <951D> <EFC0> <EFC0> <9522> <EFC1> <EFC2> <952A> <EFC3> <EFC3> <9529> <EFC4> <EFC4> <952C> <EFC5> <EFC6> <9531> <EFC7> <EFC7> <9534> <EFC8> <EFCA> <9536> <EFCB> <EFCB> <953C> <EFCC> <EFCD> <953E> <EFCE> <EFCE> <9542> <EFCF> <EFCF> <9535> <EFD0> <EFD2> <9544> <EFD3> <EFD3> <9549> <EFD4> <EFD4> <954C> <EFD5> <EFD6> <954E> <EFD7> <EFD9> <9552> <EFDA> <EFDD> <9556> <EFDE> <EFDE> <955B> <EFDF> <EFE0> <955E> <EFE1> <EFE1> <955D> <EFE2> <EFE3> <9561> <EFE4> <EFEC> <9564> <EFED> <EFED> <956F> <EFEE> <EFF0> <9571> <EFF1> <EFF1> <953A> <EFF2> <EFF2> <77E7> <EFF3> <EFF3> <77EC> <EFF4> <EFF4> <96C9> <EFF5> <EFF5> <79D5> <EFF6> <EFF6> <79ED> <EFF7> <EFF7> <79E3> <EFF8> <EFF8> <79EB> <EFF9> <EFF9> <7A06> <EFFA> <EFFA> <5D47> <EFFB> <EFFB> <7A03> <EFFC> <EFFC> <7A02> <EFFD> <EFFD> <7A1E> <EFFE> <EFFE> <7A14> <F040> <F044> <9908> <F045> <F046> <990E> <F047> <F063> <9911> <F064> <F07E> <992F> <F080> <F089> <994A> <F08A> <F096> <9956> <F097> <F097> <9964> <F098> <F098> <9966> <F099> <F099> <9973> <F09A> <F09B> <9978> <F09C> <F09C> <997B> <F09D> <F09D> <997E> <F09E> <F09F> <9982> <F0A0> <F0A0> <9989> <F0A1> <F0A1> <7A39> <F0A2> <F0A2> <7A37> <F0A3> <F0A3> <7A51> <F0A4> <F0A4> <9ECF> <F0A5> <F0A5> <99A5> <F0A6> <F0A6> <7A70> <F0A7> <F0A7> <7688> <F0A8> <F0A8> <768E> <F0A9> <F0A9> <7693> <F0AA> <F0AA> <7699> <F0AB> <F0AB> <76A4> <F0AC> <F0AC> <74DE> <F0AD> <F0AD> <74E0> <F0AE> <F0AE> <752C> <F0AF> <F0AF> <9E20> <F0B0> <F0B0> <9E22> <F0B1> <F0B5> <9E28> endbfrange 100 beginbfrange <F0B6> <F0B6> <9E32> <F0B7> <F0B7> <9E31> <F0B8> <F0B8> <9E36> <F0B9> <F0B9> <9E38> <F0BA> <F0BA> <9E37> <F0BB> <F0BC> <9E39> <F0BD> <F0BD> <9E3E> <F0BE> <F0BF> <9E41> <F0C0> <F0C0> <9E44> <F0C1> <F0C4> <9E46> <F0C5> <F0C6> <9E4B> <F0C7> <F0C7> <9E4E> <F0C8> <F0C8> <9E51> <F0C9> <F0C9> <9E55> <F0CA> <F0CA> <9E57> <F0CB> <F0CD> <9E5A> <F0CE> <F0CE> <9E5E> <F0CF> <F0CF> <9E63> <F0D0> <F0D6> <9E66> <F0D7> <F0D7> <9E71> <F0D8> <F0D8> <9E6D> <F0D9> <F0D9> <9E73> <F0DA> <F0DA> <7592> <F0DB> <F0DB> <7594> <F0DC> <F0DC> <7596> <F0DD> <F0DD> <75A0> <F0DE> <F0DE> <759D> <F0DF> <F0DF> <75AC> <F0E0> <F0E0> <75A3> <F0E1> <F0E2> <75B3> <F0E3> <F0E3> <75B8> <F0E4> <F0E4> <75C4> <F0E5> <F0E5> <75B1> <F0E6> <F0E6> <75B0> <F0E7> <F0E7> <75C3> <F0E8> <F0E8> <75C2> <F0E9> <F0E9> <75D6> <F0EA> <F0EA> <75CD> <F0EB> <F0EB> <75E3> <F0EC> <F0EC> <75E8> <F0ED> <F0ED> <75E6> <F0EE> <F0EE> <75E4> <F0EF> <F0EF> <75EB> <F0F0> <F0F0> <75E7> <F0F1> <F0F1> <7603> <F0F2> <F0F2> <75F1> <F0F3> <F0F3> <75FC> <F0F4> <F0F4> <75FF> <F0F5> <F0F5> <7610> <F0F6> <F0F6> <7600> <F0F7> <F0F7> <7605> <F0F8> <F0F8> <760C> <F0F9> <F0F9> <7617> <F0FA> <F0FA> <760A> <F0FB> <F0FB> <7625> <F0FC> <F0FC> <7618> <F0FD> <F0FD> <7615> <F0FE> <F0FE> <7619> <F140> <F140> <998C> <F141> <F141> <998E> <F142> <F14C> <999A> <F14D> <F14E> <99A6> <F14F> <F17E> <99A9> <F180> <F1A0> <99D9> <F1A1> <F1A1> <761B> <F1A2> <F1A2> <763C> <F1A3> <F1A3> <7622> <F1A4> <F1A4> <7620> <F1A5> <F1A5> <7640> <F1A6> <F1A6> <762D> <F1A7> <F1A7> <7630> <F1A8> <F1A8> <763F> <F1A9> <F1A9> <7635> <F1AA> <F1AA> <7643> <F1AB> <F1AB> <763E> <F1AC> <F1AC> <7633> <F1AD> <F1AD> <764D> <F1AE> <F1AE> <765E> <F1AF> <F1AF> <7654> <F1B0> <F1B0> <765C> <F1B1> <F1B1> <7656> <F1B2> <F1B2> <766B> <F1B3> <F1B3> <766F> <F1B4> <F1B4> <7FCA> <F1B5> <F1B5> <7AE6> <F1B6> <F1B7> <7A78> <F1B8> <F1B8> <7A80> <F1B9> <F1B9> <7A86> <F1BA> <F1BA> <7A88> <F1BB> <F1BB> <7A95> <F1BC> <F1BC> <7AA6> <F1BD> <F1BD> <7AA0> <F1BE> <F1BE> <7AAC> <F1BF> <F1BF> <7AA8> <F1C0> <F1C0> <7AAD> <F1C1> <F1C1> <7AB3> <F1C2> <F1C2> <8864> <F1C3> <F1C3> <8869> <F1C4> <F1C4> <8872> <F1C5> <F1C5> <887D> endbfrange 100 beginbfrange <F1C6> <F1C6> <887F> <F1C7> <F1C7> <8882> <F1C8> <F1C8> <88A2> <F1C9> <F1C9> <88C6> <F1CA> <F1CA> <88B7> <F1CB> <F1CB> <88BC> <F1CC> <F1CC> <88C9> <F1CD> <F1CD> <88E2> <F1CE> <F1CE> <88CE> <F1CF> <F1CF> <88E3> <F1D0> <F1D0> <88E5> <F1D1> <F1D1> <88F1> <F1D2> <F1D2> <891A> <F1D3> <F1D3> <88FC> <F1D4> <F1D4> <88E8> <F1D5> <F1D5> <88FE> <F1D6> <F1D6> <88F0> <F1D7> <F1D7> <8921> <F1D8> <F1D8> <8919> <F1D9> <F1D9> <8913> <F1DA> <F1DA> <891B> <F1DB> <F1DB> <890A> <F1DC> <F1DC> <8934> <F1DD> <F1DD> <892B> <F1DE> <F1DE> <8936> <F1DF> <F1DF> <8941> <F1E0> <F1E0> <8966> <F1E1> <F1E1> <897B> <F1E2> <F1E2> <758B> <F1E3> <F1E3> <80E5> <F1E4> <F1E4> <76B2> <F1E5> <F1E5> <76B4> <F1E6> <F1E6> <77DC> <F1E7> <F1E7> <8012> <F1E8> <F1E8> <8014> <F1E9> <F1E9> <8016> <F1EA> <F1EA> <801C> <F1EB> <F1EB> <8020> <F1EC> <F1EC> <8022> <F1ED> <F1EF> <8025> <F1F0> <F1F0> <8029> <F1F1> <F1F1> <8028> <F1F2> <F1F2> <8031> <F1F3> <F1F3> <800B> <F1F4> <F1F4> <8035> <F1F5> <F1F5> <8043> <F1F6> <F1F6> <8046> <F1F7> <F1F7> <804D> <F1F8> <F1F8> <8052> <F1F9> <F1F9> <8069> <F1FA> <F1FA> <8071> <F1FB> <F1FB> <8983> <F1FC> <F1FC> <9878> <F1FD> <F1FD> <9880> <F1FE> <F1FE> <9883> <F240> <F27E> <99FA> <F280> <F2A0> <9A39> <F2A1> <F2A1> <9889> <F2A2> <F2A3> <988C> <F2A4> <F2A4> <988F> <F2A5> <F2A5> <9894> <F2A6> <F2A7> <989A> <F2A8> <F2A9> <989E> <F2AA> <F2AB> <98A1> <F2AC> <F2AD> <98A5> <F2AE> <F2AE> <864D> <F2AF> <F2AF> <8654> <F2B0> <F2B0> <866C> <F2B1> <F2B1> <866E> <F2B2> <F2B2> <867F> <F2B3> <F2B3> <867A> <F2B4> <F2B4> <867C> <F2B5> <F2B5> <867B> <F2B6> <F2B6> <86A8> <F2B7> <F2B7> <868D> <F2B8> <F2B8> <868B> <F2B9> <F2B9> <86AC> <F2BA> <F2BA> <869D> <F2BB> <F2BB> <86A7> <F2BC> <F2BC> <86A3> <F2BD> <F2BD> <86AA> <F2BE> <F2BE> <8693> <F2BF> <F2BF> <86A9> <F2C0> <F2C0> <86B6> <F2C1> <F2C1> <86C4> <F2C2> <F2C2> <86B5> <F2C3> <F2C3> <86CE> <F2C4> <F2C4> <86B0> <F2C5> <F2C5> <86BA> <F2C6> <F2C6> <86B1> <F2C7> <F2C7> <86AF> <F2C8> <F2C8> <86C9> <F2C9> <F2C9> <86CF> <F2CA> <F2CA> <86B4> <F2CB> <F2CB> <86E9> <F2CC> <F2CD> <86F1> <F2CE> <F2CE> <86ED> <F2CF> <F2CF> <86F3> <F2D0> <F2D0> <86D0> <F2D1> <F2D1> <8713> endbfrange 100 beginbfrange <F2D2> <F2D2> <86DE> <F2D3> <F2D3> <86F4> <F2D4> <F2D4> <86DF> <F2D5> <F2D5> <86D8> <F2D6> <F2D6> <86D1> <F2D7> <F2D7> <8703> <F2D8> <F2D8> <8707> <F2D9> <F2D9> <86F8> <F2DA> <F2DA> <8708> <F2DB> <F2DB> <870A> <F2DC> <F2DC> <870D> <F2DD> <F2DD> <8709> <F2DE> <F2DE> <8723> <F2DF> <F2DF> <873B> <F2E0> <F2E0> <871E> <F2E1> <F2E1> <8725> <F2E2> <F2E2> <872E> <F2E3> <F2E3> <871A> <F2E4> <F2E4> <873E> <F2E5> <F2E5> <8748> <F2E6> <F2E6> <8734> <F2E7> <F2E7> <8731> <F2E8> <F2E8> <8729> <F2E9> <F2E9> <8737> <F2EA> <F2EA> <873F> <F2EB> <F2EB> <8782> <F2EC> <F2EC> <8722> <F2ED> <F2EE> <877D> <F2EF> <F2EF> <877B> <F2F0> <F2F0> <8760> <F2F1> <F2F1> <8770> <F2F2> <F2F2> <874C> <F2F3> <F2F3> <876E> <F2F4> <F2F4> <878B> <F2F5> <F2F5> <8753> <F2F6> <F2F6> <8763> <F2F7> <F2F7> <877C> <F2F8> <F2F8> <8764> <F2F9> <F2F9> <8759> <F2FA> <F2FA> <8765> <F2FB> <F2FB> <8793> <F2FC> <F2FC> <87AF> <F2FD> <F2FD> <87A8> <F2FE> <F2FE> <87D2> <F340> <F351> <9A5A> <F352> <F352> <9A72> <F353> <F353> <9A83> <F354> <F354> <9A89> <F355> <F356> <9A8D> <F357> <F358> <9A94> <F359> <F359> <9A99> <F35A> <F35A> <9AA6> <F35B> <F361> <9AA9> <F362> <F365> <9AB2> <F366> <F366> <9AB9> <F367> <F367> <9ABB> <F368> <F36A> <9ABD> <F36B> <F36C> <9AC3> <F36D> <F371> <9AC6> <F372> <F375> <9ACD> <F376> <F376> <9AD2> <F377> <F37A> <9AD4> <F37B> <F37E> <9AD9> <F380> <F381> <9ADD> <F382> <F382> <9AE0> <F383> <F386> <9AE2> <F387> <F38A> <9AE7> <F38B> <F38B> <9AEC> <F38C> <F38C> <9AEE> <F38D> <F395> <9AF0> <F396> <F396> <9AFA> <F397> <F39D> <9AFC> <F39E> <F3A0> <9B04> <F3A1> <F3A1> <87C6> <F3A2> <F3A2> <8788> <F3A3> <F3A3> <8785> <F3A4> <F3A4> <87AD> <F3A5> <F3A5> <8797> <F3A6> <F3A6> <8783> <F3A7> <F3A7> <87AB> <F3A8> <F3A8> <87E5> <F3A9> <F3A9> <87AC> <F3AA> <F3AA> <87B5> <F3AB> <F3AB> <87B3> <F3AC> <F3AC> <87CB> <F3AD> <F3AD> <87D3> <F3AE> <F3AE> <87BD> <F3AF> <F3AF> <87D1> <F3B0> <F3B0> <87C0> <F3B1> <F3B1> <87CA> <F3B2> <F3B2> <87DB> <F3B3> <F3B3> <87EA> <F3B4> <F3B4> <87E0> <F3B5> <F3B5> <87EE> <F3B6> <F3B6> <8816> <F3B7> <F3B7> <8813> <F3B8> <F3B8> <87FE> <F3B9> <F3B9> <880A> <F3BA> <F3BA> <881B> <F3BB> <F3BB> <8821> endbfrange 100 beginbfrange <F3BC> <F3BC> <8839> <F3BD> <F3BD> <883C> <F3BE> <F3BE> <7F36> <F3BF> <F3BF> <7F42> <F3C0> <F3C1> <7F44> <F3C2> <F3C2> <8210> <F3C3> <F3C3> <7AFA> <F3C4> <F3C4> <7AFD> <F3C5> <F3C5> <7B08> <F3C6> <F3C7> <7B03> <F3C8> <F3C8> <7B15> <F3C9> <F3C9> <7B0A> <F3CA> <F3CA> <7B2B> <F3CB> <F3CB> <7B0F> <F3CC> <F3CC> <7B47> <F3CD> <F3CD> <7B38> <F3CE> <F3CE> <7B2A> <F3CF> <F3CF> <7B19> <F3D0> <F3D0> <7B2E> <F3D1> <F3D1> <7B31> <F3D2> <F3D2> <7B20> <F3D3> <F3D3> <7B25> <F3D4> <F3D4> <7B24> <F3D5> <F3D5> <7B33> <F3D6> <F3D6> <7B3E> <F3D7> <F3D7> <7B1E> <F3D8> <F3D8> <7B58> <F3D9> <F3D9> <7B5A> <F3DA> <F3DA> <7B45> <F3DB> <F3DB> <7B75> <F3DC> <F3DC> <7B4C> <F3DD> <F3DD> <7B5D> <F3DE> <F3DE> <7B60> <F3DF> <F3DF> <7B6E> <F3E0> <F3E0> <7B7B> <F3E1> <F3E1> <7B62> <F3E2> <F3E2> <7B72> <F3E3> <F3E3> <7B71> <F3E4> <F3E4> <7B90> <F3E5> <F3E6> <7BA6> <F3E7> <F3E7> <7BB8> <F3E8> <F3E8> <7BAC> <F3E9> <F3E9> <7B9D> <F3EA> <F3EA> <7BA8> <F3EB> <F3EB> <7B85> <F3EC> <F3EC> <7BAA> <F3ED> <F3ED> <7B9C> <F3EE> <F3EE> <7BA2> <F3EF> <F3EF> <7BAB> <F3F0> <F3F0> <7BB4> <F3F1> <F3F1> <7BD1> <F3F2> <F3F2> <7BC1> <F3F3> <F3F3> <7BCC> <F3F4> <F3F4> <7BDD> <F3F5> <F3F5> <7BDA> <F3F6> <F3F7> <7BE5> <F3F8> <F3F8> <7BEA> <F3F9> <F3F9> <7C0C> <F3FA> <F3FA> <7BFE> <F3FB> <F3FB> <7BFC> <F3FC> <F3FC> <7C0F> <F3FD> <F3FD> <7C16> <F3FE> <F3FE> <7C0B> <F440> <F440> <9B07> <F441> <F446> <9B09> <F447> <F449> <9B10> <F44A> <F454> <9B14> <F455> <F457> <9B20> <F458> <F462> <9B24> <F463> <F464> <9B30> <F465> <F46C> <9B33> <F46D> <F470> <9B3D> <F471> <F471> <9B46> <F472> <F474> <9B4A> <F475> <F475> <9B4E> <F476> <F476> <9B50> <F477> <F478> <9B52> <F479> <F47E> <9B55> <F480> <F4A0> <9B5B> <F4A1> <F4A1> <7C1F> <F4A2> <F4A2> <7C2A> <F4A3> <F4A3> <7C26> <F4A4> <F4A4> <7C38> <F4A5> <F4A5> <7C41> <F4A6> <F4A6> <7C40> <F4A7> <F4A7> <81FE> <F4A8> <F4A9> <8201> <F4AA> <F4AA> <8204> <F4AB> <F4AB> <81EC> <F4AC> <F4AC> <8844> <F4AD> <F4AF> <8221> <F4B0> <F4B0> <822D> <F4B1> <F4B1> <822F> <F4B2> <F4B2> <8228> <F4B3> <F4B3> <822B> <F4B4> <F4B4> <8238> <F4B5> <F4B5> <823B> <F4B6> <F4B7> <8233> <F4B8> <F4B8> <823E> <F4B9> <F4B9> <8244> endbfrange 100 beginbfrange <F4BA> <F4BA> <8249> <F4BB> <F4BB> <824B> <F4BC> <F4BC> <824F> <F4BD> <F4BD> <825A> <F4BE> <F4BE> <825F> <F4BF> <F4BF> <8268> <F4C0> <F4C0> <887E> <F4C1> <F4C1> <8885> <F4C2> <F4C2> <8888> <F4C3> <F4C3> <88D8> <F4C4> <F4C4> <88DF> <F4C5> <F4C5> <895E> <F4C6> <F4C6> <7F9D> <F4C7> <F4C7> <7F9F> <F4C8> <F4C8> <7FA7> <F4C9> <F4CA> <7FAF> <F4CB> <F4CB> <7FB2> <F4CC> <F4CC> <7C7C> <F4CD> <F4CD> <6549> <F4CE> <F4CE> <7C91> <F4CF> <F4CF> <7C9D> <F4D0> <F4D0> <7C9C> <F4D1> <F4D1> <7C9E> <F4D2> <F4D2> <7CA2> <F4D3> <F4D3> <7CB2> <F4D4> <F4D5> <7CBC> <F4D6> <F4D6> <7CC1> <F4D7> <F4D7> <7CC7> <F4D8> <F4D9> <7CCC> <F4DA> <F4DA> <7CC8> <F4DB> <F4DB> <7CC5> <F4DC> <F4DC> <7CD7> <F4DD> <F4DD> <7CE8> <F4DE> <F4DE> <826E> <F4DF> <F4DF> <66A8> <F4E0> <F4E0> <7FBF> <F4E1> <F4E1> <7FCE> <F4E2> <F4E2> <7FD5> <F4E3> <F4E3> <7FE5> <F4E4> <F4E4> <7FE1> <F4E5> <F4E5> <7FE6> <F4E6> <F4E6> <7FE9> <F4E7> <F4E7> <7FEE> <F4E8> <F4E8> <7FF3> <F4E9> <F4E9> <7CF8> <F4EA> <F4EA> <7D77> <F4EB> <F4EB> <7DA6> <F4EC> <F4EC> <7DAE> <F4ED> <F4ED> <7E47> <F4EE> <F4EE> <7E9B> <F4EF> <F4EF> <9EB8> <F4F0> <F4F0> <9EB4> <F4F1> <F4F1> <8D73> <F4F2> <F4F2> <8D84> <F4F3> <F4F3> <8D94> <F4F4> <F4F4> <8D91> <F4F5> <F4F5> <8DB1> <F4F6> <F4F6> <8D67> <F4F7> <F4F7> <8D6D> <F4F8> <F4F8> <8C47> <F4F9> <F4F9> <8C49> <F4FA> <F4FA> <914A> <F4FB> <F4FB> <9150> <F4FC> <F4FD> <914E> <F4FE> <F4FE> <9164> <F540> <F57E> <9B7C> <F580> <F5A0> <9BBB> <F5A1> <F5A1> <9162> <F5A2> <F5A2> <9161> <F5A3> <F5A3> <9170> <F5A4> <F5A4> <9169> <F5A5> <F5A5> <916F> <F5A6> <F5A7> <917D> <F5A8> <F5A8> <9172> <F5A9> <F5A9> <9174> <F5AA> <F5AA> <9179> <F5AB> <F5AB> <918C> <F5AC> <F5AC> <9185> <F5AD> <F5AD> <9190> <F5AE> <F5AE> <918D> <F5AF> <F5AF> <9191> <F5B0> <F5B1> <91A2> <F5B2> <F5B2> <91AA> <F5B3> <F5B5> <91AD> <F5B6> <F5B6> <91B5> <F5B7> <F5B7> <91B4> <F5B8> <F5B8> <91BA> <F5B9> <F5B9> <8C55> <F5BA> <F5BA> <9E7E> <F5BB> <F5BB> <8DB8> <F5BC> <F5BC> <8DEB> <F5BD> <F5BD> <8E05> <F5BE> <F5BE> <8E59> <F5BF> <F5BF> <8E69> <F5C0> <F5C0> <8DB5> <F5C1> <F5C1> <8DBF> <F5C2> <F5C2> <8DBC> <F5C3> <F5C3> <8DBA> <F5C4> <F5C4> <8DC4> <F5C5> <F5C6> <8DD6> endbfrange 100 beginbfrange <F5C7> <F5C7> <8DDA> <F5C8> <F5C8> <8DDE> <F5C9> <F5CA> <8DCE> <F5CB> <F5CB> <8DDB> <F5CC> <F5CC> <8DC6> <F5CD> <F5CD> <8DEC> <F5CE> <F5CF> <8DF7> <F5D0> <F5D0> <8DE3> <F5D1> <F5D1> <8DF9> <F5D2> <F5D2> <8DFB> <F5D3> <F5D3> <8DE4> <F5D4> <F5D4> <8E09> <F5D5> <F5D5> <8DFD> <F5D6> <F5D6> <8E14> <F5D7> <F5D7> <8E1D> <F5D8> <F5D8> <8E1F> <F5D9> <F5D9> <8E2C> <F5DA> <F5DA> <8E2E> <F5DB> <F5DB> <8E23> <F5DC> <F5DC> <8E2F> <F5DD> <F5DD> <8E3A> <F5DE> <F5DE> <8E40> <F5DF> <F5DF> <8E39> <F5E0> <F5E0> <8E35> <F5E1> <F5E1> <8E3D> <F5E2> <F5E2> <8E31> <F5E3> <F5E3> <8E49> <F5E4> <F5E5> <8E41> <F5E6> <F5E7> <8E51> <F5E8> <F5E8> <8E4A> <F5E9> <F5E9> <8E70> <F5EA> <F5EA> <8E76> <F5EB> <F5EB> <8E7C> <F5EC> <F5EC> <8E6F> <F5ED> <F5ED> <8E74> <F5EE> <F5EE> <8E85> <F5EF> <F5EF> <8E8F> <F5F0> <F5F0> <8E94> <F5F1> <F5F1> <8E90> <F5F2> <F5F2> <8E9C> <F5F3> <F5F3> <8E9E> <F5F4> <F5F4> <8C78> <F5F5> <F5F5> <8C82> <F5F6> <F5F6> <8C8A> <F5F7> <F5F7> <8C85> <F5F8> <F5F8> <8C98> <F5F9> <F5F9> <8C94> <F5FA> <F5FA> <659B> <F5FB> <F5FB> <89D6> <F5FC> <F5FC> <89DE> <F5FD> <F5FD> <89DA> <F5FE> <F5FE> <89DC> <F640> <F67E> <9BDC> <F680> <F6A0> <9C1B> <F6A1> <F6A1> <89E5> <F6A2> <F6A2> <89EB> <F6A3> <F6A3> <89EF> <F6A4> <F6A4> <8A3E> <F6A5> <F6A5> <8B26> <F6A6> <F6A6> <9753> <F6A7> <F6A7> <96E9> <F6A8> <F6A8> <96F3> <F6A9> <F6A9> <96EF> <F6AA> <F6AA> <9706> <F6AB> <F6AB> <9701> <F6AC> <F6AC> <9708> <F6AD> <F6AD> <970F> <F6AE> <F6AE> <970E> <F6AF> <F6AF> <972A> <F6B0> <F6B0> <972D> <F6B1> <F6B1> <9730> <F6B2> <F6B2> <973E> <F6B3> <F6B3> <9F80> <F6B4> <F6B4> <9F83> <F6B5> <F6BA> <9F85> <F6BB> <F6BB> <9F8C> <F6BC> <F6BC> <9EFE> <F6BD> <F6BD> <9F0B> <F6BE> <F6BE> <9F0D> <F6BF> <F6BF> <96B9> <F6C0> <F6C1> <96BC> <F6C2> <F6C2> <96CE> <F6C3> <F6C3> <96D2> <F6C4> <F6C4> <77BF> <F6C5> <F6C5> <96E0> <F6C6> <F6C6> <928E> <F6C7> <F6C7> <92AE> <F6C8> <F6C8> <92C8> <F6C9> <F6C9> <933E> <F6CA> <F6CA> <936A> <F6CB> <F6CB> <93CA> <F6CC> <F6CC> <938F> <F6CD> <F6CD> <943E> <F6CE> <F6CE> <946B> <F6CF> <F6CF> <9C7F> <F6D0> <F6D0> <9C82> <F6D1> <F6D4> <9C85> <F6D5> <F6D5> <7A23> <F6D6> <F6D6> <9C8B> <F6D7> <F6D7> <9C8E> endbfrange 100 beginbfrange <F6D8> <F6DA> <9C90> <F6DB> <F6DC> <9C94> <F6DD> <F6DE> <9C9A> <F6DF> <F6E4> <9C9E> <F6E5> <F6E9> <9CA5> <F6EA> <F6EA> <9CAB> <F6EB> <F6EC> <9CAD> <F6ED> <F6F4> <9CB0> <F6F5> <F6F8> <9CBA> <F6F9> <F6FC> <9CC4> <F6FD> <F6FE> <9CCA> <F740> <F77E> <9C3C> <F780> <F780> <9C7B> <F781> <F782> <9C7D> <F783> <F783> <9C80> <F784> <F785> <9C83> <F786> <F787> <9C89> <F788> <F788> <9C8C> <F789> <F789> <9C8F> <F78A> <F78A> <9C93> <F78B> <F78E> <9C96> <F78F> <F78F> <9C9D> <F790> <F790> <9CAA> <F791> <F791> <9CAC> <F792> <F792> <9CAF> <F793> <F793> <9CB9> <F794> <F798> <9CBE> <F799> <F79A> <9CC8> <F79B> <F79C> <9CD1> <F79D> <F79E> <9CDA> <F79F> <F7A0> <9CE0> <F7A1> <F7A5> <9CCC> <F7A6> <F7A8> <9CD3> <F7A9> <F7AB> <9CD7> <F7AC> <F7AD> <9CDC> <F7AE> <F7AE> <9CDF> <F7AF> <F7AF> <9CE2> <F7B0> <F7B0> <977C> <F7B1> <F7B1> <9785> <F7B2> <F7B3> <9791> <F7B4> <F7B4> <9794> <F7B5> <F7B5> <97AF> <F7B6> <F7B6> <97AB> <F7B7> <F7B7> <97A3> <F7B8> <F7B8> <97B2> <F7B9> <F7B9> <97B4> <F7BA> <F7BA> <9AB1> <F7BB> <F7BB> <9AB0> <F7BC> <F7BC> <9AB7> <F7BD> <F7BD> <9E58> <F7BE> <F7BE> <9AB6> <F7BF> <F7BF> <9ABA> <F7C0> <F7C0> <9ABC> <F7C1> <F7C1> <9AC1> <F7C2> <F7C2> <9AC0> <F7C3> <F7C3> <9AC5> <F7C4> <F7C4> <9AC2> <F7C5> <F7C6> <9ACB> <F7C7> <F7C7> <9AD1> <F7C8> <F7C8> <9B45> <F7C9> <F7C9> <9B43> <F7CA> <F7CA> <9B47> <F7CB> <F7CB> <9B49> <F7CC> <F7CC> <9B48> <F7CD> <F7CD> <9B4D> <F7CE> <F7CE> <9B51> <F7CF> <F7CF> <98E8> <F7D0> <F7D0> <990D> <F7D1> <F7D1> <992E> <F7D2> <F7D2> <9955> <F7D3> <F7D3> <9954> <F7D4> <F7D4> <9ADF> <F7D5> <F7D5> <9AE1> <F7D6> <F7D6> <9AE6> <F7D7> <F7D7> <9AEF> <F7D8> <F7D8> <9AEB> <F7D9> <F7D9> <9AFB> <F7DA> <F7DA> <9AED> <F7DB> <F7DB> <9AF9> <F7DC> <F7DC> <9B08> <F7DD> <F7DD> <9B0F> <F7DE> <F7DE> <9B13> <F7DF> <F7DF> <9B1F> <F7E0> <F7E0> <9B23> <F7E1> <F7E2> <9EBD> <F7E3> <F7E3> <7E3B> <F7E4> <F7E4> <9E82> <F7E5> <F7E6> <9E87> <F7E7> <F7E7> <9E8B> <F7E8> <F7E8> <9E92> <F7E9> <F7E9> <93D6> <F7EA> <F7EA> <9E9D> <F7EB> <F7EB> <9E9F> <F7EC> <F7EE> <9EDB> <F7EF> <F7EF> <9EE0> <F7F0> <F7F0> <9EDF> <F7F1> <F7F1> <9EE2> <F7F2> <F7F2> <9EE9> <F7F3> <F7F3> <9EE7> <F7F4> <F7F4> <9EE5> endbfrange 100 beginbfrange <F7F5> <F7F5> <9EEA> <F7F6> <F7F6> <9EEF> <F7F7> <F7F7> <9F22> <F7F8> <F7F8> <9F2C> <F7F9> <F7F9> <9F2F> <F7FA> <F7FA> <9F39> <F7FB> <F7FB> <9F37> <F7FC> <F7FD> <9F3D> <F7FE> <F7FE> <9F44> <F840> <F87E> <9CE3> <F880> <F8A0> <9D22> <F8A1> <F8FE> <E234> <F940> <F97E> <9D43> <F980> <F9A0> <9D82> <F9A1> <F9FE> <E292> <FA40> <FA7E> <9DA3> <FA80> <FAA0> <9DE2> <FAA1> <FAFE> <E2F0> <FB40> <FB5B> <9E03> <FB5C> <FB5C> <9E24> <FB5D> <FB5D> <9E27> <FB5E> <FB5E> <9E2E> <FB5F> <FB5F> <9E30> <FB60> <FB60> <9E34> <FB61> <FB62> <9E3B> <FB63> <FB63> <9E40> <FB64> <FB64> <9E4D> <FB65> <FB65> <9E50> <FB66> <FB68> <9E52> <FB69> <FB69> <9E56> <FB6A> <FB6A> <9E59> <FB6B> <FB6B> <9E5D> <FB6C> <FB6F> <9E5F> <FB70> <FB70> <9E65> <FB71> <FB72> <9E6E> <FB73> <FB73> <9E72> <FB74> <FB7D> <9E74> <FB7E> <FB7E> <9E80> <FB80> <FB80> <9E81> <FB81> <FB84> <9E83> <FB85> <FB86> <9E89> <FB87> <FB8C> <9E8C> <FB8D> <FB95> <9E94> <FB96> <FB96> <9E9E> <FB97> <FB9C> <9EA0> <FB9D> <FBA0> <9EA7> <FBA1> <FBFE> <E34E> <FC40> <FC48> <9EAB> <FC49> <FC4B> <9EB5> <FC4C> <FC4D> <9EB9> <FC4E> <FC4E> <9EBC> <FC4F> <FC53> <9EBF> <FC54> <FC57> <9EC5> <FC58> <FC5A> <9ECA> <FC5B> <FC5B> <9ED0> <FC5C> <FC5D> <9ED2> <FC5E> <FC60> <9ED5> <FC61> <FC62> <9ED9> <FC63> <FC63> <9EDE> <FC64> <FC64> <9EE1> <FC65> <FC66> <9EE3> <FC67> <FC67> <9EE6> <FC68> <FC68> <9EE8> <FC69> <FC6C> <9EEB> <FC6D> <FC75> <9EF0> <FC76> <FC76> <9EFA> <FC77> <FC77> <9EFD> <FC78> <FC7E> <9EFF> <FC80> <FC84> <9F06> <FC85> <FC85> <9F0C> <FC86> <FC86> <9F0F> <FC87> <FC88> <9F11> <FC89> <FC8B> <9F14> <FC8C> <FC8C> <9F18> <FC8D> <FC92> <9F1A> <FC93> <FC93> <9F21> <FC94> <FC9C> <9F23> <FC9D> <FC9E> <9F2D> <FC9F> <FCA0> <9F30> <FCA1> <FCFE> <E3AC> <FD40> <FD44> <9F32> <FD45> <FD45> <9F38> <FD46> <FD46> <9F3A> <FD47> <FD47> <9F3C> <FD48> <FD4C> <9F3F> <FD4D> <FD57> <9F45> <FD58> <FD7E> <9F52> <FD80> <FD85> <9F79> <FD86> <FD87> <9F81> <FD88> <FD93> <9F8D> <FD94> <FD96> <9F9C> <FD97> <FD9B> <9FA1> <FD9C> <FD9C> <F92C> <FD9D> <FD9D> <F979> <FD9E> <FD9E> <F995> <FD9F> <FD9F> <F9E7> <FDA0> <FDA0> <F9F1> <FDA1> <FDFE> <E40A> <FE40> <FE43> <FA0C> <FE44> <FE44> <FA11> endbfrange 8 beginbfrange <FE45> <FE46> <FA13> <FE47> <FE47> <FA18> <FE48> <FE4A> <FA1F> <FE4B> <FE4C> <FA23> <FE4D> <FE4F> <FA27> <FE50> <FE7E> <E815> <FE80> <FEA0> <E844> <FEA1> <FEFE> <E468> endbfrange endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF \ No newline at end of file
diff --git a/src/main/resources/Resources/cmap/GBK-EUC-V b/src/main/resources/Resources/cmap/GBK-EUC-V
new file mode 100644
index 0000000..881cdba
--- /dev/null
+++ b/src/main/resources/Resources/cmap/GBK-EUC-V
@@ -0,0 +1 @@
+%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%DocumentNeededResources: CMap (GBK-EUC-H) %%IncludeResource: ProcSet (CIDInit) %%IncludeResource: CMap (GBK-EUC-H) %%BeginResource: CMap (GBK-EUC-V) %%Title: (GBK-EUC-V Adobe GB1 1) %%Version: 10.001 %%Copyright: ----------------------------------------------------------- %%Copyright: Copyright 1990-1998 Adobe Systems Incorporated. %%Copyright: All Rights Reserved. %%Copyright: %%Copyright: Patents Pending %%Copyright: %%Copyright: NOTICE: All information contained herein is the property %%Copyright: of Adobe Systems Incorporated. %%Copyright: %%Copyright: Permission is granted for redistribution of this file %%Copyright: provided this copyright notice is maintained intact and %%Copyright: that the contents of this file are not altered in any %%Copyright: way from its original form. %%Copyright: %%Copyright: PostScript and Display PostScript are trademarks of %%Copyright: Adobe Systems Incorporated which may be registered in %%Copyright: certain jurisdictions. %%Copyright: ----------------------------------------------------------- %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /GBK-EUC-H usecmap /CIDSystemInfo 3 dict dup begin /Registry (Adobe) def /Ordering (GB1) def /Supplement 1 def end def /CMapName /GBK-EUC-V def /CMapVersion 10.001 def /CMapType 1 def /XUID [1 10 25378] def /WMode 1 def 20 begincidrange <a1a2> <a1a2> 575 <a1a3> <a1a3> 574 <a1aa> <a1aa> 598 <a1ab> <a1ac> 7704 <a1ad> <a1ad> 599 <a1b2> <a1bf> 582 <a1fe> <a1fe> 7706 <a3a1> <a3a1> 578 <a3a8> <a3a9> 580 <a3ac> <a3ac> 573 <a3ae> <a3ae> 7707 <a3ba> <a3bb> 576 <a3bd> <a3bd> 7708 <a3bf> <a3bf> 579 <a3db> <a3db> 7709 <a3dd> <a3dd> 7710 <a3df> <a3df> 600 <a3fb> <a3fb> 596 <a3fd> <a3fd> 597 <a3fe> <a3fe> 7711 endcidrange endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF \ No newline at end of file
diff --git a/src/main/resources/Resources/cmap/GBK2K-H b/src/main/resources/Resources/cmap/GBK2K-H
new file mode 100644
index 0000000..81ff8fd
--- /dev/null
+++ b/src/main/resources/Resources/cmap/GBK2K-H
@@ -0,0 +1 @@
+%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%IncludeResource: ProcSet (CIDInit) %%BeginResource: CMap (GBK2K-H) %%Title: (GBK2K-H Adobe GB1 4) %%Version: 1.001 %%Copyright: ----------------------------------------------------------- %%Copyright: Copyright 1990-2000 Adobe Systems Incorporated. %%Copyright: All Rights Reserved. %%Copyright: %%Copyright: Patents Pending %%Copyright: %%Copyright: NOTICE: All information contained herein is the property %%Copyright: of Adobe Systems Incorporated. %%Copyright: %%Copyright: Permission is granted for redistribution of this file %%Copyright: provided this copyright notice is maintained intact and %%Copyright: that the contents of this file are not altered in any %%Copyright: way from its original form. %%Copyright: %%Copyright: PostScript and Display PostScript are trademarks of %%Copyright: Adobe Systems Incorporated which may be registered in %%Copyright: certain jurisdictions. %%Copyright: ----------------------------------------------------------- %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo 3 dict dup begin /Registry (Adobe) def /Ordering (GB1) def /Supplement 4 def end def /CMapName /GBK2K-H def /CMapVersion 1.001 def /CMapType 1 def /XUID [1 10 25459] def /WMode 0 def 37 begincodespacerange <00> <7F> <81308130> <8130FE39> <81318130> <8131FE39> <81328130> <8132FE39> <81338130> <8133FE39> <81348130> <8134FE39> <81358130> <8135FE39> <81368130> <8136FE39> <81378130> <8137FE39> <81388130> <8138FE39> <81398130> <8139FE39> <8140> <81FE> <82308130> <8230FE39> <82318130> <8231FE39> <82328130> <8232FE39> <82338130> <8233FE39> <82348130> <8234FE39> <82358130> <8235FE39> <82368130> <8236FE39> <82378130> <8237FE39> <82388130> <8238FE39> <82398130> <8239FE39> <8240> <82FE> <83308130> <8330FE39> <83318130> <8331FE39> <83328130> <8332FE39> <83338130> <8333FE39> <83348130> <8334FE39> <83358130> <8335FE39> <83368130> <8336FE39> <83378130> <8337FE39> <83388130> <8338FE39> <83398130> <8339FE39> <8340> <83FE> <84308130> <8430FE39> <84318130> <8431A439> <8440> <FEFE> endcodespacerange 1 beginnotdefrange <00> <1f> 1 endnotdefrange 100 begincidrange <20> <7e> 1 <81308436> <81308436> 22354 <8138fd38> <8138fd39> 22428 <8138fe30> <8138fe39> 22430 <81398130> <81398137> 22440 <81398139> <81398139> 22448 <81398230> <81398239> 22449 <81398330> <81398339> 22459 <81398430> <81398439> 22469 <81398530> <81398539> 22479 <81398630> <81398639> 22489 <81398730> <81398739> 22499 <81398830> <81398839> 22509 <81398930> <81398939> 22519 <81398b32> <81398b32> 4162 <81398b33> <81398b33> 4707 <81398b34> <81398b34> 4722 <81398b35> <81398b35> 4709 <81398b36> <81398b36> 4185 <81398b37> <81398b37> 10131 <81398b38> <81398b38> 1597 <81398b39> <81398b39> 4867 <81398c30> <81398c30> 3238 <81398c31> <81398c31> 1592 <81398c32> <81398c32> 3270 <81398c33> <81398c33> 982 <81398c34> <81398c34> 4765 <81398c35> <81398c35> 4884 <81398c36> <81398c36> 4879 <81398c37> <81398c37> 2091 <81398c38> <81398c38> 5017 <81398c39> <81398c39> 1431 <81398d30> <81398d30> 2543 <81398d31> <81398d31> 4860 <81398d32> <81398d32> 4710 <81398d33> <81398d33> 4740 <81398d34> <81398d34> 10778 <81398d35> <81398d35> 3397 <81398d36> <81398d36> 1150 <81398d37> <81398d37> 4946 <81398d38> <81398d38> 1228 <81398d39> <81398d39> 5020 <81398e30> <81398e30> 4283 <81398e31> <81398e31> 2407 <81398e32> <81398e32> 5523 <81398e33> <81398e33> 3698 <81398e34> <81398e34> 3414 <81398e35> <81398e35> 5660 <81398e36> <81398e36> 11565 <81398e37> <81398e37> 3859 <81398e38> <81398e38> 1398 <81398e39> <81398e39> 2927 <81398f30> <81398f30> 4656 <81398f31> <81398f31> 5934 <81398f32> <81398f32> 1386 <81398f33> <81398f33> 3948 <81398f34> <81398f34> 5302 <81398f35> <81398f35> 3395 <81398f36> <81398f36> 6004 <81398f37> <81398f37> 3318 <81398f38> <81398f38> 6165 <81398f39> <81398f39> 1789 <81399030> <81399030> 2093 <81399031> <81399031> 2238 <81399032> <81399032> 1732 <81399033> <81399033> 6163 <81399034> <81399034> 1852 <81399035> <81399035> 5016 <81399036> <81399036> 5293 <81399037> <81399037> 5366 <81399038> <81399038> 1798 <81399039> <81399039> 5986 <81399130> <81399130> 5614 <81399131> <81399131> 5600 <81399132> <81399132> 3983 <81399133> <81399133> 1765 <81399134> <81399134> 12946 <81399135> <81399135> 3437 <81399136> <81399136> 4518 <81399137> <81399137> 6409 <81399138> <81399138> 3795 <81399139> <81399139> 1526 <81399230> <81399230> 2240 <81399231> <81399231> 1626 <81399232> <81399232> 3821 <81399233> <81399233> 3248 <81399234> <81399234> 4350 <81399235> <81399235> 4357 <81399236> <81399236> 2849 <81399237> <81399237> 3124 <81399238> <81399238> 4536 <81399239> <81399239> 1400 <81399330> <81399330> 6589 <81399331> <81399331> 3826 <81399332> <81399332> 1073 <81399333> <81399333> 2736 <81399334> <81399334> 3430 <81399335> <81399335> 3095 <81399336> <81399336> 3491 <81399337> <81399337> 2053 endcidrange 100 begincidrange <81399338> <81399338> 4611 <81399339> <81399339> 1715 <81399430> <81399430> 4713 <81399431> <81399431> 5789 <81399432> <81399432> 3019 <81399433> <81399433> 4073 <81399434> <81399434> 2916 <81399435> <81399435> 3209 <81399436> <81399436> 4041 <81399437> <81399437> 4310 <81399438> <81399438> 1832 <81399439> <81399439> 3728 <81399530> <81399530> 1733 <81399531> <81399531> 3379 <81399532> <81399532> 4264 <81399533> <81399533> 3650 <81399534> <81399534> 7110 <81399535> <81399535> 7008 <81399536> <81399536> 16063 <81399537> <81399537> 994 <81399538> <81399538> 3011 <81399539> <81399539> 2808 <81399630> <81399630> 2850 <81399631> <81399631> 2737 <81399632> <81399632> 3407 <81399633> <81399633> 3398 <81399634> <81399634> 3413 <81399635> <81399635> 16587 <81399636> <81399636> 1923 <81399637> <81399637> 4049 <81399638> <81399638> 2539 <81399639> <81399639> 4592 <81399730> <81399730> 2780 <81399731> <81399731> 7399 <81399732> <81399732> 7262 <81399733> <81399733> 3753 <81399734> <81399734> 4123 <81399735> <81399735> 4309 <81399736> <81399736> 2490 <81399737> <81399737> 1591 <81399738> <81399738> 7115 <81399739> <81399739> 1593 <81399830> <81399830> 6686 <81399831> <81399831> 3261 <81399832> <81399832> 1249 <81399833> <81399833> 4657 <81399834> <81399834> 4544 <81399835> <81399835> 2297 <81399836> <81399836> 3353 <81399837> <81399837> 5656 <81399838> <81399838> 4570 <81399839> <81399839> 7388 <81399930> <81399930> 3300 <81399931> <81399931> 17826 <81399932> <81399932> 7152 <81399933> <81399933> 1291 <81399934> <81399934> 4051 <81399935> <81399935> 3995 <81399936> <81399936> 4169 <81399937> <81399937> 18908 <81399938> <81399938> 8086 <81399939> <81399939> 2200 <81399a30> <81399a30> 4093 <81399a31> <81399a31> 1825 <81399a32> <81399a32> 1528 <81399a33> <81399a33> 7445 <81399a34> <81399a34> 7504 <81399a35> <81399a35> 7739 <81399a36> <81399a36> 1285 <81399a37> <81399a37> 4668 <81399a38> <81399a38> 4672 <81399a39> <81399a39> 3366 <81399b30> <81399b30> 7803 <81399b31> <81399b31> 3980 <81399b32> <81399b32> 1250 <81399b33> <81399b33> 19731 <81399b34> <81399b34> 4191 <81399b35> <81399b35> 4276 <81399b36> <81399b36> 19992 <81399b37> <81399b37> 2522 <81399b38> <81399b38> 2241 <81399b39> <81399b39> 7797 <81399c30> <81399c30> 8317 <81399c31> <81399c31> 1714 <81399c32> <81399c32> 2542 <81399c33> <81399c33> 7545 <81399c34> <81399c34> 4303 <81399c35> <81399c35> 20714 <81399c36> <81399c36> 1636 <81399c37> <81399c37> 2795 <81399c38> <81399c38> 1770 <81399c39> <81399c39> 8589 <81399d30> <81399d30> 2289 <81399d31> <81399d31> 4219 <81399d32> <81399d32> 8713 <81399d33> <81399d33> 7936 <81399d34> <81399d34> 7924 <81399d35> <81399d35> 3402 <81399d36> <81399d36> 3438 <81399d37> <81399d37> 3920 endcidrange 100 begincidrange <81399d38> <81399d38> 8301 <81399d39> <81399d39> 1824 <81399e30> <81399e30> 1754 <81399e31> <81399e31> 7660 <81399e32> <81399e32> 7888 <81399e33> <81399e33> 5019 <81399e34> <81399e34> 4704 <81399e35> <81399e35> 1862 <81399e36> <81399e36> 8761 <81399e37> <81399e37> 8348 <81399e38> <81399e38> 9864 <81399e39> <81399e39> 2656 <81399f30> <81399f30> 8305 <81399f31> <81399f31> 2704 <81399f32> <81399f32> 21894 <81399f33> <81399f33> 3465 <81399f34> <81399f34> 1937 <81399f35> <81399f35> 6741 <81399f36> <81399f36> 9752 <81399f37> <81399f37> 1509 <81399f38> <81399f38> 1821 <81399f39> <81399f39> 3466 <8139a030> <8139a030> 1072 <8139a031> <8139a031> 8390 <8139a032> <8139a032> 7814 <8139a033> <8139a033> 8247 <8139a034> <8139a034> 7988 <8139a035> <8139a035> 4851 <8139a533> <8139a535> 22395 <8139a538> <8139a539> 22398 <8139a630> <8139a630> 22400 <8139a634> <8139a634> 22357 <8139a636> <8139a636> 22375 <8139a735> <8139a735> 22390 <8139a737> <8139a737> 22391 <8139a736> <8139a736> 22392 <8139a738> <8139a738> 22393 <8139a836> <8139a838> 22401 <8139b434> <8139b439> 22404 <8139b530> <8139b539> 22410 <8139b630> <8139b637> 22420 <8139ee39> <8139ee39> 22529 <8139ef30> <8139ef39> 22530 <8139f030> <8139f039> 22540 <8139f130> <8139f139> 22550 <8139f230> <8139f239> 22560 <8139f330> <8139f339> 22570 <8139f430> <8139f439> 22580 <8139f530> <8139f539> 22590 <8139f630> <8139f639> 22600 <8139f730> <8139f739> 22610 <8139f830> <8139f839> 22620 <8139f930> <8139f939> 22630 <8139fa30> <8139fa39> 22640 <8139fb30> <8139fb39> 22650 <8139fc30> <8139fc39> 22660 <8139fd30> <8139fd39> 22670 <8139fe30> <8139fe39> 22680 <8140> <8178> 10072 <8179> <8179> 8281 <817a> <817e> 10129 <8180> <8185> 10134 <8186> <8186> 8689 <8187> <81ec> 10140 <81ed> <81ed> 8178 <81ee> <81f5> 10242 <81f6> <81f6> 8285 <81f7> <81fe> 10250 <82308130> <82308139> 22690 <82308230> <82308239> 22700 <82308330> <82308339> 22710 <82308430> <82308439> 22720 <82308530> <82308539> 22730 <82308630> <82308639> 22740 <82308730> <82308739> 22750 <82308830> <82308839> 22760 <82308930> <82308939> 22770 <82308a30> <82308a39> 22780 <82308b30> <82308b39> 22790 <82308c30> <82308c39> 22800 <82308d30> <82308d39> 22810 <82308e30> <82308e39> 22820 <82308f30> <82308f39> 22830 <82309030> <82309039> 22840 <82309130> <82309139> 22850 <82309230> <82309239> 22860 <82309330> <82309339> 22870 <82309430> <82309439> 22880 <82309530> <82309539> 22890 <82309630> <82309639> 22900 <82309730> <82309739> 22910 <82309830> <82309839> 22920 <82309930> <82309939> 22930 <82309a30> <82309a39> 22940 <82309b30> <82309b39> 22950 <82309c30> <82309c39> 22960 <82309d30> <82309d39> 22970 <82309e30> <82309e39> 22980 <82309f30> <82309f39> 22990 <8230a030> <8230a039> 23000 endcidrange 100 begincidrange <8230a130> <8230a139> 23010 <8230a230> <8230a239> 23020 <8230a330> <8230a339> 23030 <8230a430> <8230a439> 23040 <8230a530> <8230a539> 23050 <8230a630> <8230a639> 23060 <8230a730> <8230a739> 23070 <8230a830> <8230a839> 23080 <8230a930> <8230a939> 23090 <8230aa30> <8230aa39> 23100 <8230ab30> <8230ab39> 23110 <8230ac30> <8230ac39> 23120 <8230ad30> <8230ad39> 23130 <8230ae30> <8230ae39> 23140 <8230af30> <8230af39> 23150 <8230b030> <8230b039> 23160 <8230b130> <8230b139> 23170 <8230b230> <8230b239> 23180 <8230b330> <8230b339> 23190 <8230b430> <8230b439> 23200 <8230b530> <8230b539> 23210 <8230b630> <8230b639> 23220 <8230b730> <8230b739> 23230 <8230b830> <8230b839> 23240 <8230b930> <8230b939> 23250 <8230ba30> <8230ba39> 23260 <8230bb30> <8230bb39> 23270 <8230bc30> <8230bc39> 23280 <8230bd30> <8230bd39> 23290 <8230be30> <8230be39> 23300 <8230bf30> <8230bf39> 23310 <8230c030> <8230c039> 23320 <8230c130> <8230c139> 23330 <8230c230> <8230c239> 23340 <8230c330> <8230c339> 23350 <8230c430> <8230c439> 23360 <8230c530> <8230c539> 23370 <8230c630> <8230c639> 23380 <8230c730> <8230c739> 23390 <8230c830> <8230c839> 23400 <8230c930> <8230c939> 23410 <8230ca30> <8230ca39> 23420 <8230cb30> <8230cb39> 23430 <8230cc30> <8230cc39> 23440 <8230cd30> <8230cd39> 23450 <8230ce30> <8230ce39> 23460 <8230cf30> <8230cf39> 23470 <8230d030> <8230d039> 23480 <8230d130> <8230d139> 23490 <8230d230> <8230d239> 23500 <8230d330> <8230d339> 23510 <8230d430> <8230d439> 23520 <8230d530> <8230d539> 23530 <8230d630> <8230d639> 23540 <8230d730> <8230d739> 23550 <8230d830> <8230d839> 23560 <8230d930> <8230d939> 23570 <8230da30> <8230da39> 23580 <8230db30> <8230db39> 23590 <8230dc30> <8230dc39> 23600 <8230dd30> <8230dd39> 23610 <8230de30> <8230de39> 23620 <8230df30> <8230df39> 23630 <8230e030> <8230e039> 23640 <8230e130> <8230e139> 23650 <8230e230> <8230e239> 23660 <8230e330> <8230e339> 23670 <8230e430> <8230e439> 23680 <8230e530> <8230e539> 23690 <8230e630> <8230e639> 23700 <8230e730> <8230e739> 23710 <8230e830> <8230e839> 23720 <8230e930> <8230e939> 23730 <8230ea30> <8230ea39> 23740 <8230eb30> <8230eb39> 23750 <8230ec30> <8230ec39> 23760 <8230ed30> <8230ed39> 23770 <8230ee30> <8230ee39> 23780 <8230ef30> <8230ef39> 23790 <8230f030> <8230f039> 23800 <8230f130> <8230f139> 23810 <8230f230> <8230f239> 23820 <8230f330> <8230f339> 23830 <8230f430> <8230f439> 23840 <8230f530> <8230f539> 23850 <8230f630> <8230f639> 23860 <8230f730> <8230f739> 23870 <8230f830> <8230f839> 23880 <8230f930> <8230f939> 23890 <8230fa30> <8230fa39> 23900 <8230fb30> <8230fb39> 23910 <8230fc30> <8230fc39> 23920 <8230fd30> <8230fd39> 23930 <8230fe30> <8230fe39> 23940 <82318130> <82318139> 23950 <82318230> <82318239> 23960 <82318330> <82318339> 23970 <82318430> <82318439> 23980 <82318530> <82318539> 23990 <82318630> <82318639> 24000 endcidrange 100 begincidrange <82318730> <82318739> 24010 <82318830> <82318839> 24020 <82318930> <82318939> 24030 <82318a30> <82318a39> 24040 <82318b30> <82318b39> 24050 <82318c30> <82318c39> 24060 <82318d30> <82318d39> 24070 <82318e30> <82318e39> 24080 <82318f30> <82318f39> 24090 <82319030> <82319039> 24100 <82319130> <82319139> 24110 <82319230> <82319239> 24120 <82319330> <82319339> 24130 <82319430> <82319439> 24140 <82319530> <82319539> 24150 <82319630> <82319639> 24160 <82319730> <82319739> 24170 <82319830> <82319839> 24180 <82319930> <82319939> 24190 <82319a30> <82319a39> 24200 <82319b30> <82319b39> 24210 <82319c30> <82319c39> 24220 <82319d30> <82319d39> 24230 <82319e30> <82319e39> 24240 <82319f30> <82319f39> 24250 <8231a030> <8231a039> 24260 <8231a130> <8231a139> 24270 <8231a230> <8231a239> 24280 <8231a330> <8231a339> 24290 <8231a430> <8231a439> 24300 <8231a530> <8231a539> 24310 <8231a630> <8231a639> 24320 <8231a730> <8231a739> 24330 <8231a830> <8231a839> 24340 <8231a930> <8231a939> 24350 <8231aa30> <8231aa39> 24360 <8231ab30> <8231ab39> 24370 <8231ac30> <8231ac39> 24380 <8231ad30> <8231ad39> 24390 <8231ae30> <8231ae39> 24400 <8231af30> <8231af39> 24410 <8231b030> <8231b039> 24420 <8231b130> <8231b139> 24430 <8231b230> <8231b239> 24440 <8231b330> <8231b339> 24450 <8231b430> <8231b439> 24460 <8231b530> <8231b539> 24470 <8231b630> <8231b639> 24480 <8231b730> <8231b739> 24490 <8231b830> <8231b839> 24500 <8231b930> <8231b939> 24510 <8231ba30> <8231ba39> 24520 <8231bb30> <8231bb39> 24530 <8231bc30> <8231bc39> 24540 <8231bd30> <8231bd39> 24550 <8231be30> <8231be39> 24560 <8231bf30> <8231bf39> 24570 <8231c030> <8231c039> 24580 <8231c130> <8231c139> 24590 <8231c230> <8231c239> 24600 <8231c330> <8231c339> 24610 <8231c430> <8231c439> 24620 <8231c530> <8231c539> 24630 <8231c630> <8231c639> 24640 <8231c730> <8231c739> 24650 <8231c830> <8231c839> 24660 <8231c930> <8231c939> 24670 <8231ca30> <8231ca39> 24680 <8231cb30> <8231cb39> 24690 <8231cc30> <8231cc39> 24700 <8231cd30> <8231cd39> 24710 <8231ce30> <8231ce39> 24720 <8231cf30> <8231cf39> 24730 <8231d030> <8231d039> 24740 <8231d130> <8231d139> 24750 <8231d230> <8231d239> 24760 <8231d330> <8231d339> 24770 <8231d430> <8231d439> 24780 <8231d530> <8231d539> 24790 <8231d630> <8231d639> 24800 <8231d730> <8231d739> 24810 <8231d830> <8231d839> 24820 <8231d930> <8231d939> 24830 <8231da30> <8231da39> 24840 <8231db30> <8231db39> 24850 <8231dc30> <8231dc39> 24860 <8231dd30> <8231dd39> 24870 <8231de30> <8231de39> 24880 <8231df30> <8231df39> 24890 <8231e030> <8231e039> 24900 <8231e130> <8231e139> 24910 <8231e230> <8231e239> 24920 <8231e330> <8231e339> 24930 <8231e430> <8231e439> 24940 <8231e530> <8231e539> 24950 <8231e630> <8231e639> 24960 <8231e730> <8231e739> 24970 <8231e830> <8231e839> 24980 <8231e930> <8231e939> 24990 <8231ea30> <8231ea39> 25000 endcidrange 100 begincidrange <8231eb30> <8231eb39> 25010 <8231ec30> <8231ec39> 25020 <8231ed30> <8231ed39> 25030 <8231ee30> <8231ee39> 25040 <8231ef30> <8231ef39> 25050 <8231f030> <8231f039> 25060 <8231f130> <8231f139> 25070 <8231f230> <8231f239> 25080 <8231f330> <8231f339> 25090 <8231f430> <8231f439> 25100 <8231f530> <8231f539> 25110 <8231f630> <8231f639> 25120 <8231f730> <8231f739> 25130 <8231f830> <8231f839> 25140 <8231f930> <8231f939> 25150 <8231fa30> <8231fa39> 25160 <8231fb30> <8231fb39> 25170 <8231fc30> <8231fc39> 25180 <8231fd30> <8231fd39> 25190 <8231fe30> <8231fe39> 25200 <82328130> <82328139> 25210 <82328230> <82328239> 25220 <82328330> <82328339> 25230 <82328430> <82328439> 25240 <82328530> <82328539> 25250 <82328630> <82328639> 25260 <82328730> <82328739> 25270 <82328830> <82328839> 25280 <82328930> <82328939> 25290 <82328a30> <82328a39> 25300 <82328b30> <82328b39> 25310 <82328c30> <82328c39> 25320 <82328d30> <82328d39> 25330 <82328e30> <82328e39> 25340 <82328f30> <82328f39> 25350 <82329030> <82329039> 25360 <82329130> <82329139> 25370 <82329230> <82329239> 25380 <82329330> <82329339> 25390 <82329430> <82329439> 25400 <82329530> <82329539> 25410 <82329630> <82329639> 25420 <82329730> <82329739> 25430 <82329830> <82329839> 25440 <82329930> <82329939> 25450 <82329a30> <82329a39> 25460 <82329b30> <82329b39> 25470 <82329c30> <82329c39> 25480 <82329d30> <82329d39> 25490 <82329e30> <82329e39> 25500 <82329f30> <82329f39> 25510 <8232a030> <8232a039> 25520 <8232a130> <8232a139> 25530 <8232a230> <8232a239> 25540 <8232a330> <8232a339> 25550 <8232a430> <8232a439> 25560 <8232a530> <8232a539> 25570 <8232a630> <8232a639> 25580 <8232a730> <8232a739> 25590 <8232a830> <8232a839> 25600 <8232a930> <8232a939> 25610 <8232aa30> <8232aa39> 25620 <8232ab30> <8232ab39> 25630 <8232ac30> <8232ac39> 25640 <8232ad30> <8232ad39> 25650 <8232ae30> <8232ae39> 25660 <8232af30> <8232af39> 25670 <8232b030> <8232b039> 25680 <8232b130> <8232b139> 25690 <8232b230> <8232b239> 25700 <8232b330> <8232b339> 25710 <8232b430> <8232b439> 25720 <8232b530> <8232b539> 25730 <8232b630> <8232b639> 25740 <8232b730> <8232b739> 25750 <8232b830> <8232b839> 25760 <8232b930> <8232b939> 25770 <8232ba30> <8232ba39> 25780 <8232bb30> <8232bb39> 25790 <8232bc30> <8232bc39> 25800 <8232bd30> <8232bd39> 25810 <8232be30> <8232be39> 25820 <8232bf30> <8232bf39> 25830 <8232c030> <8232c039> 25840 <8232c130> <8232c139> 25850 <8232c230> <8232c239> 25860 <8232c330> <8232c339> 25870 <8232c430> <8232c439> 25880 <8232c530> <8232c539> 25890 <8232c630> <8232c639> 25900 <8232c730> <8232c739> 25910 <8232c830> <8232c839> 25920 <8232c930> <8232c939> 25930 <8232ca30> <8232ca39> 25940 <8232cb30> <8232cb39> 25950 <8232cc30> <8232cc39> 25960 <8232cd30> <8232cd39> 25970 <8232ce30> <8232ce39> 25980 <8232cf30> <8232cf39> 25990 <8232d030> <8232d039> 26000 endcidrange 100 begincidrange <8232d130> <8232d139> 26010 <8232d230> <8232d239> 26020 <8232d330> <8232d339> 26030 <8232d430> <8232d439> 26040 <8232d530> <8232d539> 26050 <8232d630> <8232d639> 26060 <8232d730> <8232d739> 26070 <8232d830> <8232d839> 26080 <8232d930> <8232d939> 26090 <8232da30> <8232da39> 26100 <8232db30> <8232db39> 26110 <8232dc30> <8232dc39> 26120 <8232dd30> <8232dd39> 26130 <8232de30> <8232de39> 26140 <8232df30> <8232df39> 26150 <8232e030> <8232e039> 26160 <8232e130> <8232e139> 26170 <8232e230> <8232e239> 26180 <8232e330> <8232e339> 26190 <8232e430> <8232e439> 26200 <8232e530> <8232e539> 26210 <8232e630> <8232e639> 26220 <8232e730> <8232e739> 26230 <8232e830> <8232e839> 26240 <8232e930> <8232e939> 26250 <8232ea30> <8232ea39> 26260 <8232eb30> <8232eb39> 26270 <8232ec30> <8232ec39> 26280 <8232ed30> <8232ed39> 26290 <8232ee30> <8232ee39> 26300 <8232ef30> <8232ef39> 26310 <8232f030> <8232f039> 26320 <8232f130> <8232f139> 26330 <8232f230> <8232f239> 26340 <8232f330> <8232f339> 26350 <8232f430> <8232f439> 26360 <8232f530> <8232f539> 26370 <8232f630> <8232f639> 26380 <8232f730> <8232f739> 26390 <8232f830> <8232f839> 26400 <8232f930> <8232f939> 26410 <8232fa30> <8232fa39> 26420 <8232fb30> <8232fb39> 26430 <8232fc30> <8232fc39> 26440 <8232fd30> <8232fd39> 26450 <8232fe30> <8232fe39> 26460 <82338130> <82338139> 26470 <82338230> <82338239> 26480 <82338330> <82338339> 26490 <82338430> <82338439> 26500 <82338530> <82338539> 26510 <82338630> <82338639> 26520 <82338730> <82338739> 26530 <82338830> <82338839> 26540 <82338930> <82338939> 26550 <82338a30> <82338a39> 26560 <82338b30> <82338b39> 26570 <82338c30> <82338c39> 26580 <82338d30> <82338d39> 26590 <82338e30> <82338e39> 26600 <82338f30> <82338f39> 26610 <82339030> <82339039> 26620 <82339130> <82339139> 26630 <82339230> <82339239> 26640 <82339330> <82339339> 26650 <82339430> <82339439> 26660 <82339530> <82339539> 26670 <82339630> <82339639> 26680 <82339730> <82339739> 26690 <82339830> <82339839> 26700 <82339930> <82339939> 26710 <82339a30> <82339a39> 26720 <82339b30> <82339b39> 26730 <82339c30> <82339c39> 26740 <82339d30> <82339d39> 26750 <82339e30> <82339e39> 26760 <82339f30> <82339f39> 26770 <8233a030> <8233a039> 26780 <8233a130> <8233a139> 26790 <8233a230> <8233a239> 26800 <8233a330> <8233a339> 26810 <8233a430> <8233a439> 26820 <8233a530> <8233a539> 26830 <8233a630> <8233a639> 26840 <8233a730> <8233a739> 26850 <8233a830> <8233a839> 26860 <8233a930> <8233a939> 26870 <8233aa30> <8233aa39> 26880 <8233ab30> <8233ab39> 26890 <8233ac30> <8233ac39> 26900 <8233ad30> <8233ad39> 26910 <8233ae30> <8233ae39> 26920 <8233af30> <8233af39> 26930 <8233b030> <8233b039> 26940 <8233b130> <8233b139> 26950 <8233b230> <8233b239> 26960 <8233b330> <8233b339> 26970 <8233b430> <8233b439> 26980 <8233b530> <8233b539> 26990 <8233b630> <8233b639> 27000 endcidrange 100 begincidrange <8233b730> <8233b739> 27010 <8233b830> <8233b839> 27020 <8233b930> <8233b939> 27030 <8233ba30> <8233ba39> 27040 <8233bb30> <8233bb39> 27050 <8233bc30> <8233bc39> 27060 <8233bd30> <8233bd39> 27070 <8233be30> <8233be39> 27080 <8233bf30> <8233bf39> 27090 <8233c030> <8233c039> 27100 <8233c130> <8233c139> 27110 <8233c230> <8233c239> 27120 <8233c330> <8233c339> 27130 <8233c430> <8233c439> 27140 <8233c530> <8233c539> 27150 <8233c630> <8233c639> 27160 <8233c730> <8233c739> 27170 <8233c830> <8233c839> 27180 <8233c930> <8233c939> 27190 <8233ca30> <8233ca39> 27200 <8233cb30> <8233cb39> 27210 <8233cc30> <8233cc39> 27220 <8233cd30> <8233cd39> 27230 <8233ce30> <8233ce39> 27240 <8233cf30> <8233cf39> 27250 <8233d030> <8233d039> 27260 <8233d130> <8233d139> 27270 <8233d230> <8233d239> 27280 <8233d330> <8233d339> 27290 <8233d430> <8233d439> 27300 <8233d530> <8233d539> 27310 <8233d630> <8233d639> 27320 <8233d730> <8233d739> 27330 <8233d830> <8233d839> 27340 <8233d930> <8233d939> 27350 <8233da30> <8233da39> 27360 <8233db30> <8233db39> 27370 <8233dc30> <8233dc39> 27380 <8233dd30> <8233dd39> 27390 <8233de30> <8233de39> 27400 <8233df30> <8233df39> 27410 <8233e030> <8233e039> 27420 <8233e130> <8233e139> 27430 <8233e230> <8233e239> 27440 <8233e330> <8233e339> 27450 <8233e430> <8233e439> 27460 <8233e530> <8233e539> 27470 <8233e630> <8233e639> 27480 <8233e730> <8233e739> 27490 <8233e830> <8233e839> 27500 <8233e930> <8233e939> 27510 <8233ea30> <8233ea39> 27520 <8233eb30> <8233eb39> 27530 <8233ec30> <8233ec39> 27540 <8233ed30> <8233ed39> 27550 <8233ee30> <8233ee39> 27560 <8233ef30> <8233ef39> 27570 <8233f030> <8233f039> 27580 <8233f130> <8233f139> 27590 <8233f230> <8233f239> 27600 <8233f330> <8233f339> 27610 <8233f430> <8233f439> 27620 <8233f530> <8233f539> 27630 <8233f630> <8233f639> 27640 <8233f730> <8233f739> 27650 <8233f830> <8233f839> 27660 <8233f930> <8233f939> 27670 <8233fa30> <8233fa39> 27680 <8233fb30> <8233fb39> 27690 <8233fc30> <8233fc39> 27700 <8233fd30> <8233fd39> 27710 <8233fe30> <8233fe39> 27720 <82348130> <82348139> 27730 <82348230> <82348239> 27740 <82348330> <82348339> 27750 <82348430> <82348439> 27760 <82348530> <82348539> 27770 <82348630> <82348639> 27780 <82348730> <82348739> 27790 <82348830> <82348839> 27800 <82348930> <82348939> 27810 <82348a30> <82348a39> 27820 <82348b30> <82348b39> 27830 <82348c30> <82348c39> 27840 <82348d30> <82348d39> 27850 <82348e30> <82348e39> 27860 <82348f30> <82348f39> 27870 <82349030> <82349039> 27880 <82349130> <82349139> 27890 <82349230> <82349239> 27900 <82349330> <82349339> 27910 <82349430> <82349439> 27920 <82349530> <82349539> 27930 <82349630> <82349639> 27940 <82349730> <82349739> 27950 <82349830> <82349839> 27960 <82349930> <82349939> 27970 <82349a30> <82349a39> 27980 <82349b30> <82349b39> 27990 <82349c30> <82349c39> 28000 endcidrange 100 begincidrange <82349d30> <82349d39> 28010 <82349e30> <82349e39> 28020 <82349f30> <82349f39> 28030 <8234a030> <8234a039> 28040 <8234a130> <8234a139> 28050 <8234a230> <8234a239> 28060 <8234a330> <8234a339> 28070 <8234a430> <8234a439> 28080 <8234a530> <8234a539> 28090 <8234a630> <8234a639> 28100 <8234a730> <8234a739> 28110 <8234a830> <8234a839> 28120 <8234a930> <8234a939> 28130 <8234aa30> <8234aa39> 28140 <8234ab30> <8234ab39> 28150 <8234ac30> <8234ac39> 28160 <8234ad30> <8234ad39> 28170 <8234ae30> <8234ae39> 28180 <8234af30> <8234af39> 28190 <8234b030> <8234b039> 28200 <8234b130> <8234b139> 28210 <8234b230> <8234b239> 28220 <8234b330> <8234b339> 28230 <8234b430> <8234b439> 28240 <8234b530> <8234b539> 28250 <8234b630> <8234b639> 28260 <8234b730> <8234b739> 28270 <8234b830> <8234b839> 28280 <8234b930> <8234b939> 28290 <8234ba30> <8234ba39> 28300 <8234bb30> <8234bb39> 28310 <8234bc30> <8234bc39> 28320 <8234bd30> <8234bd39> 28330 <8234be30> <8234be39> 28340 <8234bf30> <8234bf39> 28350 <8234c030> <8234c039> 28360 <8234c130> <8234c139> 28370 <8234c230> <8234c239> 28380 <8234c330> <8234c339> 28390 <8234c430> <8234c439> 28400 <8234c530> <8234c539> 28410 <8234c630> <8234c639> 28420 <8234c730> <8234c739> 28430 <8234c830> <8234c839> 28440 <8234c930> <8234c939> 28450 <8234ca30> <8234ca39> 28460 <8234cb30> <8234cb39> 28470 <8234cc30> <8234cc39> 28480 <8234cd30> <8234cd39> 28490 <8234ce30> <8234ce39> 28500 <8234cf30> <8234cf39> 28510 <8234d030> <8234d039> 28520 <8234d130> <8234d139> 28530 <8234d230> <8234d239> 28540 <8234d330> <8234d339> 28550 <8234d430> <8234d439> 28560 <8234d530> <8234d539> 28570 <8234d630> <8234d639> 28580 <8234d730> <8234d739> 28590 <8234d830> <8234d839> 28600 <8234d930> <8234d939> 28610 <8234da30> <8234da39> 28620 <8234db30> <8234db39> 28630 <8234dc30> <8234dc39> 28640 <8234dd30> <8234dd39> 28650 <8234de30> <8234de39> 28660 <8234df30> <8234df39> 28670 <8234e030> <8234e039> 28680 <8234e130> <8234e139> 28690 <8234e230> <8234e239> 28700 <8234e330> <8234e339> 28710 <8234e430> <8234e439> 28720 <8234e530> <8234e539> 28730 <8234e630> <8234e639> 28740 <8234e730> <8234e739> 28750 <8234e830> <8234e839> 28760 <8234e930> <8234e939> 28770 <8234ea30> <8234ea39> 28780 <8234eb30> <8234eb39> 28790 <8234ec30> <8234ec39> 28800 <8234ed30> <8234ed39> 28810 <8234ee30> <8234ee39> 28820 <8234ef30> <8234ef39> 28830 <8234f030> <8234f039> 28840 <8234f130> <8234f139> 28850 <8234f230> <8234f239> 28860 <8234f330> <8234f339> 28870 <8234f430> <8234f439> 28880 <8234f530> <8234f539> 28890 <8234f630> <8234f639> 28900 <8234f730> <8234f739> 28910 <8234f830> <8234f839> 28920 <8234f930> <8234f939> 28930 <8234fa30> <8234fa39> 28940 <8234fb30> <8234fb39> 28950 <8234fc30> <8234fc39> 28960 <8234fd30> <8234fd39> 28970 <8234fe30> <8234fe39> 28980 <82358130> <82358139> 28990 <82358230> <82358239> 29000 endcidrange 100 begincidrange <82358330> <82358339> 29010 <82358430> <82358439> 29020 <82358530> <82358539> 29030 <82358630> <82358639> 29040 <82358730> <82358738> 29050 <8240> <8252> 10258 <8253> <8253> 9884 <8254> <8261> 10277 <8262> <8262> 8629 <8263> <8273> 10291 <8274> <8274> 8908 <8275> <8279> 10308 <827a> <827a> 8214 <827b> <827c> 10313 <827d> <827d> 7778 <827e> <827e> 10315 <8280> <8280> 7968 <8281> <8282> 10316 <8283> <8283> 8319 <8284> <828f> 10318 <8290> <8290> 8284 <8291> <82a4> 10330 <82a5> <82a5> 8596 <82a6> <82c7> 10350 <82c8> <82c8> 7781 <82c9> <82c9> 8833 <82ca> <82e0> 10384 <82e1> <82e1> 8909 <82e2> <82e2> 10407 <82e3> <82e3> 8458 <82e4> <82e4> 7742 <82e5> <82ec> 10408 <82ed> <82ed> 9855 <82ee> <82f1> 10416 <82f2> <82f2> 8750 <82f3> <82f6> 10420 <82f7> <82f7> 7830 <82f8> <82f8> 8907 <82f9> <82f9> 8812 <82fa> <82fa> 10424 <82fb> <82fb> 8471 <82fc> <82fe> 10425 <8340> <8340> 10428 <8341> <8341> 8424 <8342> <8344> 10429 <8345> <8345> 8916 <8346> <8347> 10432 <8348> <8348> 8121 <8349> <834b> 10434 <834c> <834c> 8920 <834d> <8352> 10437 <8353> <8353> 8415 <8354> <8356> 10443 <8357> <8357> 8386 <8358> <835d> 10446 <835e> <835e> 8597 <835f> <8364> 10452 <8365> <8365> 8108 <8366> <8366> 8915 <8367> <8371> 10458 <8372> <8372> 8065 <8373> <8377> 10469 <8378> <8378> 8720 <8379> <8379> 10474 <837a> <837a> 8911 <837b> <837b> 10475 <837c> <837c> 8723 <837d> <837d> 10476 <837e> <837e> 8164 <8380> <8380> 8080 <8381> <8385> 10477 <8386> <8386> 8918 <8387> <8388> 10482 <8389> <8389> 8912 <838a> <838a> 8910 <838b> <838c> 10484 <838d> <838d> 9857 <838e> <8393> 10486 <8394> <8394> 7798 <8395> <839d> 10492 <839e> <839e> 8753 <839f> <83a5> 10501 <83a6> <83a6> 7827 <83a7> <83aa> 10508 <83ab> <83ab> 8914 <83ac> <83ad> 10512 <83ae> <83ae> 8919 <83af> <83af> 8917 <83b0> <83b0> 8913 <83b1> <83b9> 10514 <83ba> <83ba> 7909 <83bb> <83c8> 10523 <83c9> <83c9> 8229 <83ca> <83f5> 10537 <83f6> <83f6> 7887 <83f7> <83fe> 10581 <8440> <844f> 10589 <8450> <8450> 8153 <8451> <8470> 10605 <8471> <8471> 8904 endcidrange 100 begincidrange <8472> <8473> 10637 <8474> <8474> 8803 <8475> <8476> 10639 <8477> <8477> 9859 <8478> <847e> 10641 <8480> <8481> 10648 <8482> <8482> 7959 <8483> <848d> 10650 <848e> <848e> 7979 <848f> <8491> 10661 <8492> <8492> 8906 <8493> <8493> 7833 <8494> <849c> 10664 <849d> <849d> 8015 <849e> <84a0> 10673 <84a1> <84a1> 8143 <84a2> <84a2> 8246 <84a3> <84a3> 7994 <84a4> <84a4> 10676 <84a5> <84a5> 8905 <84a6> <84a6> 8089 <84a7> <84a8> 10677 <84a9> <84a9> 8053 <84aa> <84c4> 10679 <84c5> <84c5> 8126 <84c6> <84d2> 10706 <84d3> <84d3> 7885 <84d4> <84d4> 10719 <84d5> <84d5> 8617 <84d6> <84d6> 10720 <84d7> <84d7> 8678 <84d8> <84d8> 10721 <84d9> <84d9> 8487 <84da> <84da> 8195 <84db> <84dc> 10722 <84dd> <84dd> 8498 <84de> <84e9> 10724 <84ea> <84ea> 8995 <84eb> <84ed> 10736 <84ee> <84ee> 8209 <84ef> <84f0> 10739 <84f1> <84f1> 8437 <84f2> <84fe> 10741 <8540> <8550> 10754 <8551> <8551> 8901 <8552> <8552> 8030 <8553> <8553> 10771 <8554> <8554> 8902 <8555> <855d> 10772 <855e> <855e> 8431 <855f> <8565> 10781 <8566> <8566> 8656 <8567> <857e> 10788 <8580> <8586> 10812 <8587> <8587> 8897 <8588> <858a> 10819 <858b> <858b> 7780 <858c> <8591> 10822 <8592> <8592> 8697 <8593> <8595> 10828 <8596> <8596> 8208 <8597> <8597> 10831 <8598> <8598> 8898 <8599> <85a1> 10832 <85a2> <85a2> 7770 <85a3> <85b1> 10841 <85b2> <85b2> 7842 <85b3> <85fe> 10856 <8640> <8649> 10932 <864a> <864a> 9069 <864b> <8653> 10942 <8654> <8654> 8775 <8655> <8667> 10951 <8668> <8668> 9068 <8669> <867e> 10970 <8680> <8695> 10992 <8696> <8696> 8604 <8697> <8698> 11014 <8699> <8699> 8393 <869a> <86a0> 11016 <86a1> <86a1> 8688 <86a2> <86c9> 11023 <86ca> <86ca> 8459 <86cb> <86cb> 11063 <86cc> <86cc> 8414 <86cd> <86cd> 11064 <86ce> <86ce> 7850 <86cf> <86d0> 11065 <86d1> <86d1> 8748 <86d2> <86db> 11067 <86dc> <86dc> 8408 <86dd> <86dd> 8896 <86de> <86e0> 11077 <86e1> <86e1> 8303 <86e2> <86e7> 11080 <86e8> <86e8> 8609 <86e9> <86ed> 11086 <86ee> <86ee> 9081 <86ef> <86f3> 11091 <86f4> <86f4> 9074 endcidrange 100 begincidrange <86f5> <86fe> 11096 <8740> <8740> 8554 <8741> <8743> 11106 <8744> <8744> 9084 <8745> <8748> 11109 <8749> <8749> 8368 <874a> <874a> 11113 <874b> <874b> 9082 <874c> <874c> 7796 <874d> <874e> 11114 <874f> <874f> 9079 <8750> <8756> 11116 <8757> <8757> 8012 <8758> <8759> 11123 <875a> <875a> 9080 <875b> <875b> 8655 <875c> <875c> 9064 <875d> <875d> 11125 <875e> <875e> 9073 <875f> <875f> 11126 <8760> <8760> 9065 <8761> <8765> 11127 <8766> <8766> 9844 <8767> <8779> 11132 <877a> <877a> 9071 <877b> <877c> 11151 <877d> <877d> 9072 <877e> <877e> 11153 <8780> <8780> 11154 <8781> <8781> 9078 <8782> <8782> 9075 <8783> <8785> 11155 <8786> <8786> 9087 <8787> <8787> 11158 <8788> <8788> 9076 <8789> <8789> 11159 <878a> <878a> 8373 <878b> <878c> 11160 <878d> <878d> 7899 <878e> <878e> 9842 <878f> <8792> 11162 <8793> <8793> 9070 <8794> <8797> 11166 <8798> <8798> 8631 <8799> <879c> 11170 <879d> <879d> 9077 <879e> <87a2> 11174 <87a3> <87a3> 9090 <87a4> <87a6> 11179 <87a7> <87a7> 8350 <87a8> <87b2> 11182 <87b3> <87b3> 9067 <87b4> <87b4> 11193 <87b5> <87b5> 8249 <87b6> <87ba> 11194 <87bb> <87bb> 9887 <87bc> <87be> 11199 <87bf> <87bf> 9085 <87c0> <87c0> 8693 <87c1> <87c1> 11202 <87c2> <87c2> 9089 <87c3> <87c9> 11203 <87ca> <87ca> 9083 <87cb> <87cb> 9086 <87cc> <87cc> 8652 <87cd> <87ce> 11210 <87cf> <87cf> 8923 <87d0> <87d1> 11212 <87d2> <87d2> 9066 <87d3> <87d3> 9865 <87d4> <87d4> 11214 <87d5> <87d5> 9879 <87d6> <87d9> 11215 <87da> <87da> 8865 <87db> <87f6> 11219 <87f7> <87f7> 9091 <87f8> <87f8> 7997 <87f9> <87f9> 11247 <87fa> <87fa> 8591 <87fb> <87fe> 11248 <8840> <8840> 8774 <8841> <8841> 8776 <8842> <8843> 11252 <8844> <8844> 8574 <8845> <8845> 11254 <8846> <8846> 8576 <8847> <887e> 11255 <8880> <88b9> 11311 <88ba> <88ba> 9002 <88bb> <88cb> 11369 <88cc> <88cc> 8843 <88cd> <88d3> 11386 <88d4> <88d4> 8069 <88d5> <88d6> 11393 <88d7> <88d7> 8997 <88d8> <88de> 11395 <88df> <88df> 9004 <88e0> <88e4> 11402 <88e5> <88e5> 9006 <88e6> <88f1> 11407 endcidrange 100 begincidrange <88f2> <88f2> 8709 <88f3> <88f3> 7736 <88f4> <88f5> 11419 <88f6> <88f6> 7795 <88f7> <88fe> 11421 <8940> <894a> 11429 <894b> <894b> 8163 <894c> <894c> 9017 <894d> <894d> 11440 <894e> <894e> 9003 <894f> <894f> 11441 <8950> <8950> 9005 <8951> <8953> 11442 <8954> <8954> 8575 <8955> <895c> 11445 <895d> <895d> 8615 <895e> <895e> 11453 <895f> <895f> 9007 <8960> <896c> 11454 <896d> <896d> 7805 <896e> <8970> 11467 <8971> <8971> 8406 <8972> <897b> 11470 <897c> <897c> 7874 <897d> <897e> 11480 <8980> <898a> 11482 <898b> <898b> 8882 <898c> <8998> 11493 <8999> <8999> 7903 <899a> <899d> 11506 <899e> <899e> 7929 <899f> <89a5> 11510 <89a6> <89a6> 8409 <89a7> <89a7> 11517 <89a8> <89a8> 8157 <89a9> <89ae> 11518 <89af> <89af> 8551 <89b0> <89b9> 11524 <89ba> <89ba> 8685 <89bb> <89bd> 11534 <89be> <89be> 8199 <89bf> <89bf> 8998 <89c0> <89c0> 9001 <89c1> <89c3> 11537 <89c4> <89c4> 8018 <89c5> <89c5> 8251 <89c6> <89c6> 9000 <89c7> <89c7> 11540 <89c8> <89c8> 8999 <89c9> <89cd> 11541 <89ce> <89ce> 7723 <89cf> <89d0> 11546 <89d1> <89d1> 8878 <89d2> <89d7> 11548 <89d8> <89d8> 8009 <89d9> <89da> 11554 <89db> <89db> 8504 <89dc> <89f3> 11556 <89f4> <89f4> 8321 <89f5> <89fe> 11580 <8a40> <8a40> 11590 <8a41> <8a41> 8060 <8a42> <8a58> 11591 <8a59> <8a59> 9051 <8a5a> <8a5a> 7902 <8a5b> <8a5b> 11614 <8a5c> <8a5c> 8098 <8a5d> <8a5d> 11615 <8a5e> <8a5e> 7930 <8a5f> <8a78> 11616 <8a79> <8a79> 8877 <8a7a> <8a7e> 11642 <8a80> <8ae3> 11647 <8ae4> <8ae4> 8255 <8ae5> <8afe> 11747 <8b40> <8b43> 11773 <8b44> <8b44> 7950 <8b45> <8b48> 11777 <8b49> <8b49> 9209 <8b4a> <8b79> 11781 <8b7a> <8b7a> 9212 <8b7b> <8b7e> 11829 <8b80> <8b8b> 11833 <8b8c> <8b8c> 8297 <8b8d> <8b9d> 11845 <8b9e> <8b9e> 9207 <8b9f> <8bb2> 11862 <8bb3> <8bb3> 9206 <8bb4> <8bb8> 11882 <8bb9> <8bb9> 9213 <8bba> <8bbd> 11887 <8bbe> <8bbe> 9208 <8bbf> <8bc5> 11891 <8bc6> <8bc6> 9210 <8bc7> <8bc7> 11898 <8bc8> <8bc8> 9214 <8bc9> <8bc9> 8104 <8bca> <8bd3> 11899 <8bd4> <8bd4> 9217 <8bd5> <8bdb> 11909 endcidrange 100 begincidrange <8bdc> <8bdc> 9215 <8bdd> <8be4> 11916 <8be5> <8be5> 9216 <8be6> <8bea> 11924 <8beb> <8beb> 8737 <8bec> <8bef> 11929 <8bf0> <8bf0> 8482 <8bf1> <8bfe> 11933 <8c40> <8c43> 11947 <8c44> <8c44> 9211 <8c45> <8c4e> 11951 <8c4f> <8c4f> 8538 <8c50> <8c56> 11961 <8c57> <8c57> 8677 <8c58> <8c5b> 11968 <8c5c> <8c5c> 8279 <8c5d> <8c7e> 11972 <8c80> <8c8a> 12006 <8c8b> <8c8b> 8421 <8c8c> <8c8c> 12017 <8c8d> <8c8d> 8495 <8c8e> <8c8e> 8355 <8c8f> <8c8f> 8481 <8c90> <8c90> 12018 <8c91> <8c91> 8660 <8c92> <8c92> 8165 <8c93> <8c98> 12019 <8c99> <8c99> 7818 <8c9a> <8c9a> 7735 <8c9b> <8ca1> 12025 <8ca2> <8ca2> 8094 <8ca3> <8ca3> 8870 <8ca4> <8ca4> 8680 <8ca5> <8ca5> 12032 <8ca6> <8ca6> 7898 <8ca7> <8ca7> 7865 <8ca8> <8cbf> 12033 <8cc0> <8cc0> 9052 <8cc1> <8cd1> 12057 <8cd2> <8cd2> 8272 <8cd3> <8cd3> 7783 <8cd4> <8cd4> 12074 <8cd5> <8cd5> 9204 <8cd6> <8cd8> 12075 <8cd9> <8cd9> 8510 <8cda> <8cf8> 12078 <8cf9> <8cf9> 7958 <8cfa> <8cfe> 12109 <8d40> <8d72> 12114 <8d73> <8d73> 9097 <8d74> <8d74> 12165 <8d75> <8d75> 7863 <8d76> <8d7a> 12166 <8d7b> <8d7b> 8628 <8d7c> <8d7e> 12171 <8d80> <8d87> 12174 <8d88> <8d88> 9103 <8d89> <8d8e> 12182 <8d8f> <8d8f> 7962 <8d90> <8d9d> 12188 <8d9e> <8d9e> 9099 <8d9f> <8db8> 12202 <8db9> <8db9> 9098 <8dba> <8de1> 12228 <8de2> <8de2> 9105 <8de3> <8de3> 12268 <8de4> <8de4> 8817 <8de5> <8de6> 12269 <8de7> <8de7> 9096 <8de8> <8df6> 12271 <8df7> <8df7> 9102 <8df8> <8dfd> 12286 <8dfe> <8dfe> 9101 <8e40> <8e45> 12292 <8e46> <8e46> 9100 <8e47> <8e55> 12298 <8e56> <8e56> 9104 <8e57> <8e57> 12313 <8e58> <8e58> 8243 <8e59> <8e59> 12314 <8e5a> <8e5a> 8764 <8e5b> <8e67> 12315 <8e68> <8e68> 8169 <8e69> <8e6d> 12328 <8e6e> <8e6e> 8277 <8e6f> <8e6f> 12333 <8e70> <8e70> 9106 <8e71> <8e7e> 12334 <8e80> <8e80> 8996 <8e81> <8e9a> 12348 <8e9b> <8e9b> 8515 <8e9c> <8e9e> 12374 <8e9f> <8e9f> 8489 <8ea0> <8ea3> 12377 <8ea4> <8ea4> 8823 <8ea5> <8ea6> 12381 <8ea7> <8ea7> 7847 <8ea8> <8eab> 12383 <8eac> <8eac> 8837 <8ead> <8ead> 12387 endcidrange 100 begincidrange <8eae> <8eae> 9092 <8eaf> <8ebc> 12388 <8ebd> <8ebd> 9095 <8ebe> <8ebe> 9094 <8ebf> <8ec2> 12402 <8ec3> <8ec3> 8848 <8ec4> <8ec4> 12406 <8ec5> <8ec5> 7748 <8ec6> <8ecc> 12407 <8ecd> <8ecd> 7730 <8ece> <8ece> 9093 <8ecf> <8ed5> 12414 <8ed6> <8ed6> 7955 <8ed7> <8ed7> 8051 <8ed8> <8eeb> 12421 <8eec> <8eec> 8160 <8eed> <8efe> 12441 <8f40> <8f51> 12459 <8f52> <8f52> 8327 <8f53> <8f53> 7800 <8f54> <8f54> 9134 <8f55> <8f55> 7926 <8f56> <8f56> 7985 <8f57> <8f5c> 12477 <8f5d> <8f5d> 8261 <8f5e> <8f63> 12483 <8f64> <8f64> 8568 <8f65> <8f7e> 12489 <8f80> <8f85> 12515 <8f86> <8f86> 9205 <8f87> <8f87> 12521 <8f88> <8f88> 8821 <8f89> <8f94> 12522 <8f95> <8f95> 9838 <8f96> <8f96> 12534 <8f97> <8f97> 7856 <8f98> <8f9a> 12535 <8f9b> <8f9b> 8323 <8f9c> <8f9c> 12538 <8f9d> <8f9d> 8584 <8f9e> <8fa0> 12539 <8fa1> <8fa1> 9852 <8fa2> <8fbc> 12542 <8fbd> <8fbd> 8133 <8fbe> <8fc3> 12569 <8fc4> <8fc4> 7841 <8fc5> <8fc5> 12575 <8fc6> <8fc6> 9107 <8fc7> <8fcc> 12576 <8fcd> <8fcd> 7947 <8fce> <8fd7> 12582 <8fd8> <8fd8> 7804 <8fd9> <8ffe> 12592 <9040> <907e> 12630 <9080> <909c> 12693 <909d> <909d> 9140 <909e> <909e> 8318 <909f> <90b9> 12722 <90ba> <90ba> 7907 <90bb> <90bf> 12749 <90c0> <90c0> 8341 <90c1> <90c1> 9147 <90c2> <90c4> 12754 <90c5> <90c5> 9145 <90c6> <90da> 12757 <90db> <90db> 7720 <90dc> <90dc> 9149 <90dd> <90ec> 12778 <90ed> <90ed> 9141 <90ee> <90ef> 12794 <90f0> <90f0> 9146 <90f1> <90f6> 12796 <90f7> <90f7> 9139 <90f8> <90fe> 12802 <9140> <9141> 12809 <9142> <9142> 8546 <9143> <914a> 12811 <914b> <914b> 7774 <914c> <914c> 12819 <914d> <914d> 7773 <914e> <9150> 12820 <9151> <9151> 9143 <9152> <9153> 12823 <9154> <9154> 7983 <9155> <9155> 9439 <9156> <9158> 12825 <9159> <9159> 9138 <915a> <915a> 8526 <915b> <915c> 12828 <915d> <915d> 8274 <915e> <9160> 12830 <9161> <9161> 9148 <9162> <9162> 12833 <9163> <9163> 8427 <9164> <916d> 12834 <916e> <916e> 8754 <916f> <9175> 12844 <9176> <9176> 7743 <9177> <9179> 12851 <917a> <917a> 8219 endcidrange 100 begincidrange <917b> <917b> 8380 <917c> <917c> 9150 <917d> <917e> 12854 <9180> <9183> 12856 <9184> <9184> 7854 <9185> <918c> 12860 <918d> <918d> 7931 <918e> <9190> 12868 <9191> <9191> 8329 <9192> <9192> 12871 <9193> <9193> 9137 <9194> <9196> 12872 <9197> <9197> 8644 <9198> <919a> 12875 <919b> <919b> 8724 <919c> <91a8> 12878 <91a9> <91a9> 8158 <91aa> <91aa> 8739 <91ab> <91ab> 9142 <91ac> <91b9> 12891 <91ba> <91ba> 9868 <91bb> <91bb> 9438 <91bc> <91be> 12905 <91bf> <91bf> 9440 <91c0> <91c2> 12908 <91c3> <91c3> 9144 <91c4> <91cc> 12911 <91cd> <91cd> 7809 <91ce> <91cf> 12920 <91d0> <91d0> 8190 <91d1> <91d1> 8017 <91d2> <91d2> 8673 <91d3> <91d3> 12922 <91d4> <91d4> 9136 <91d5> <91d5> 12923 <91d6> <91d6> 8142 <91d7> <91d7> 12924 <91d8> <91d8> 8478 <91d9> <91d9> 8225 <91da> <91de> 12925 <91df> <91df> 9441 <91e0> <91e1> 12930 <91e2> <91e2> 9379 <91e3> <91e9> 12932 <91ea> <91ea> 9380 <91eb> <91ef> 12939 <91f0> <91f0> 8819 <91f1> <91f1> 12944 <91f2> <91f2> 8624 <91f3> <91fe> 12945 <9240> <927e> 12957 <9280> <92b5> 13020 <92b6> <92b6> 8657 <92b7> <92cd> 13074 <92ce> <92ce> 8476 <92cf> <92cf> 13097 <92d0> <92d0> 9053 <92d1> <92d3> 13098 <92d4> <92d4> 9858 <92d5> <92de> 13101 <92df> <92df> 8461 <92e0> <92e0> 8282 <92e1> <92fd> 13111 <92fe> <92fe> 8077 <9340> <934f> 13140 <9350> <9350> 8703 <9351> <935c> 13156 <935d> <935d> 8024 <935e> <936f> 13168 <9370> <9370> 8539 <9371> <9375> 13186 <9376> <9376> 7862 <9377> <937e> 13191 <9380> <938b> 13199 <938c> <938c> 8411 <938d> <939c> 13211 <939d> <939d> 9056 <939e> <93a4> 13227 <93a5> <93a5> 9057 <93a6> <93a6> 13234 <93a7> <93a7> 8256 <93a8> <93b3> 13235 <93b4> <93b4> 8846 <93b5> <93b7> 13247 <93b8> <93b8> 8159 <93b9> <93ba> 13250 <93bb> <93bb> 9054 <93bc> <93bc> 13252 <93bd> <93bd> 7786 <93be> <93c5> 13253 <93c6> <93c6> 8194 <93c7> <93ce> 13261 <93cf> <93cf> 8339 <93d0> <93d6> 13269 <93d7> <93d7> 9055 <93d8> <93da> 13276 <93db> <93db> 7852 <93dc> <93dc> 7764 <93dd> <93e0> 13279 <93e1> <93e1> 7944 endcidrange 100 begincidrange <93e2> <93e3> 13283 <93e4> <93e4> 8384 <93e5> <93e5> 9058 <93e6> <93e8> 13285 <93e9> <93e9> 8544 <93ea> <93ea> 13288 <93eb> <93eb> 8605 <93ec> <93ec> 8078 <93ed> <93ed> 8749 <93ee> <93ee> 13289 <93ef> <93ef> 8263 <93f0> <93f0> 13290 <93f1> <93f1> 8802 <93f2> <93f3> 13291 <93f4> <93f4> 8039 <93f5> <93f5> 7858 <93f6> <93f9> 13293 <93fa> <93fa> 7849 <93fb> <93fd> 13297 <93fe> <93fe> 8140 <9440> <9443> 13300 <9444> <9444> 8050 <9445> <944c> 13304 <944d> <944d> 8344 <944e> <944f> 13312 <9450> <9450> 7762 <9451> <9451> 8356 <9452> <9452> 7964 <9453> <9453> 8847 <9454> <9454> 13314 <9455> <9455> 8173 <9456> <9457> 13315 <9458> <9458> 9061 <9459> <945a> 13317 <945b> <945b> 7725 <945c> <945c> 8530 <945d> <945d> 9062 <945e> <945e> 13319 <945f> <945f> 8442 <9460> <9463> 13320 <9464> <9464> 9059 <9465> <9465> 13324 <9466> <9466> 8346 <9467> <946d> 13325 <946e> <946e> 8252 <946f> <9471> 13332 <9472> <9472> 8182 <9473> <9473> 13335 <9474> <9474> 9060 <9475> <9475> 13336 <9476> <9476> 7785 <9477> <9477> 13337 <9478> <9478> 9063 <9479> <9479> 13338 <947a> <947a> 8477 <947b> <947e> 13339 <9480> <9480> 8793 <9481> <9481> 8278 <9482> <9482> 8547 <9483> <9486> 13343 <9487> <9487> 8105 <9488> <9488> 8188 <9489> <94a0> 13347 <94a1> <94a1> 7726 <94a2> <94b2> 13371 <94b3> <94b3> 7868 <94b4> <94b4> 13388 <94b5> <94b5> 8514 <94b6> <94be> 13389 <94bf> <94bf> 8222 <94c0> <94c0> 7747 <94c1> <94cb> 13398 <94cc> <94cc> 9428 <94cd> <94d7> 13409 <94d8> <94d8> 8815 <94d9> <94df> 13420 <94e0> <94e0> 7895 <94e1> <94fe> 13427 <9540> <9571> 13457 <9572> <9572> 8493 <9573> <957e> 13507 <9580> <9582> 13519 <9583> <9583> 8859 <9584> <959d> 13522 <959e> <959e> 8790 <959f> <959f> 9384 <95a0> <95b2> 13548 <95b3> <95b3> 7801 <95b4> <95b9> 13567 <95ba> <95ba> 8794 <95bb> <95ce> 13573 <95cf> <95cf> 9383 <95d0> <95d0> 13593 <95d1> <95d1> 9862 <95d2> <95d2> 9382 <95d3> <95d3> 13594 <95d4> <95d4> 8654 <95d5> <95e0> 13595 <95e1> <95e1> 9385 <95e2> <95e6> 13607 endcidrange 100 begincidrange <95e7> <95e7> 8167 <95e8> <95f0> 13612 <95f1> <95f1> 8466 <95f2> <95f7> 13621 <95f8> <95f8> 8508 <95f9> <95fd> 13627 <95fe> <95fe> 8028 <9640> <9655> 13632 <9656> <9656> 9412 <9657> <967b> 13654 <967c> <967c> 7884 <967d> <967e> 13691 <9680> <96fe> 13693 <9740> <9766> 13820 <9767> <9767> 9322 <9768> <976b> 13859 <976c> <976c> 8565 <976d> <976d> 13863 <976e> <976e> 9325 <976f> <977e> 13864 <9780> <9795> 13880 <9796> <9796> 9323 <9797> <9797> 8799 <9798> <979c> 13902 <979d> <979d> 7886 <979e> <97a2> 13907 <97a3> <97a3> 8818 <97a4> <97be> 13912 <97bf> <97bf> 9331 <97c0> <97ed> 13939 <97ee> <97ee> 8702 <97ef> <97f6> 13985 <97f7> <97f7> 7934 <97f8> <97fe> 13993 <9840> <9844> 14000 <9845> <9845> 9333 <9846> <9848> 14005 <9849> <9849> 8714 <984a> <984e> 14008 <984f> <984f> 8047 <9850> <9870> 14013 <9871> <9871> 9320 <9872> <9872> 14046 <9873> <9873> 8448 <9874> <987e> 14047 <9880> <9880> 14058 <9881> <9881> 9334 <9882> <988a> 14059 <988b> <988b> 7975 <988c> <988c> 8407 <988d> <989f> 14068 <98a0> <98a0> 9340 <98a1> <98a9> 14087 <98aa> <98aa> 8097 <98ab> <98b5> 14096 <98b6> <98b6> 8874 <98b7> <98b7> 8197 <98b8> <98b9> 14107 <98ba> <98ba> 9324 <98bb> <98c6> 14109 <98c7> <98c7> 8254 <98c8> <98ca> 14121 <98cb> <98cb> 7756 <98cc> <98cf> 14124 <98d0> <98d0> 8506 <98d1> <98d2> 14128 <98d3> <98d3> 8708 <98d4> <98e2> 14130 <98e3> <98e3> 8387 <98e4> <98e4> 8512 <98e5> <98e5> 9335 <98e6> <98ee> 14145 <98ef> <98ef> 9332 <98f0> <98f1> 14154 <98f2> <98f2> 8413 <98f3> <98fe> 14156 <9940> <9942> 14168 <9943> <9943> 8040 <9944> <9944> 14171 <9945> <9945> 8581 <9946> <9965> 14172 <9966> <9966> 9330 <9967> <996d> 14204 <996e> <996e> 7861 <996f> <9974> 14211 <9975> <9975> 9336 <9976> <9979> 14217 <997a> <997a> 8075 <997b> <997b> 9348 <997c> <997e> 14221 <9980> <9984> 14224 <9985> <9985> 9881 <9986> <9988> 14229 <9989> <9989> 9346 <998a> <998d> 14232 <998e> <998e> 8353 <998f> <9990> 14236 <9991> <9991> 8082 <9992> <9998> 14238 <9999> <9999> 7992 endcidrange 100 begincidrange <999a> <99a8> 14245 <99a9> <99a9> 9349 <99aa> <99af> 14260 <99b0> <99b0> 9344 <99b1> <99b1> 9326 <99b2> <99b2> 14266 <99b3> <99b3> 9339 <99b4> <99b4> 9350 <99b5> <99b5> 9329 <99b6> <99bc> 14267 <99bd> <99bd> 9347 <99be> <99be> 9328 <99bf> <99bf> 14274 <99c0> <99c0> 9321 <99c1> <99c1> 14275 <99c2> <99c2> 9343 <99c3> <99c8> 14276 <99c9> <99c9> 9327 <99ca> <99cd> 14282 <99ce> <99ce> 9345 <99cf> <99d0> 14286 <99d1> <99d1> 8736 <99d2> <99d9> 14288 <99da> <99da> 8181 <99db> <99df> 14296 <99e0> <99e0> 8436 <99e1> <99e4> 14301 <99e5> <99e5> 9341 <99e6> <99e7> 14305 <99e8> <99e8> 9337 <99e9> <99eb> 14307 <99ec> <99ec> 9342 <99ed> <99f3> 14310 <99f4> <99f4> 9338 <99f5> <99fe> 14317 <9a40> <9a49> 14327 <9a4a> <9a4a> 8419 <9a4b> <9a56> 14337 <9a57> <9a57> 8365 <9a58> <9a64> 14349 <9a65> <9a65> 9419 <9a66> <9a66> 14362 <9a67> <9a67> 8019 <9a68> <9a70> 14363 <9a71> <9a71> 8537 <9a72> <9a75> 14372 <9a76> <9a76> 8211 <9a77> <9a77> 7987 <9a78> <9a7e> 14376 <9a80> <9a87> 14383 <9a88> <9a88> 7772 <9a89> <9a8b> 14391 <9a8c> <9a8c> 9352 <9a8d> <9a90> 14394 <9a91> <9a91> 9351 <9a92> <9a96> 14398 <9a97> <9a97> 9354 <9a98> <9a99> 14403 <9a9a> <9a9a> 9353 <9a9b> <9a9b> 9355 <9a9c> <9a9d> 14405 <9a9e> <9a9e> 8067 <9a9f> <9aa1> 14407 <9aa2> <9aa2> 8463 <9aa3> <9aa3> 8155 <9aa4> <9aa9> 14410 <9aaa> <9aaa> 8367 <9aab> <9acf> 14416 <9ad0> <9ad0> 9408 <9ad1> <9ad5> 14453 <9ad6> <9ad6> 8813 <9ad7> <9ad9> 14458 <9ada> <9ada> 9409 <9adb> <9ae1> 14461 <9ae2> <9ae2> 8394 <9ae3> <9ae3> 14468 <9ae4> <9ae4> 8423 <9ae5> <9ae5> 9410 <9ae6> <9afe> 14469 <9b40> <9b7e> 14494 <9b80> <9bd0> 14557 <9bd1> <9bd1> 9180 <9bd2> <9bdb> 14638 <9bdc> <9bdc> 9179 <9bdd> <9bfe> 14648 <9c40> <9c52> 14682 <9c53> <9c53> 8286 <9c54> <9c58> 14701 <9c59> <9c59> 8772 <9c5a> <9c5a> 9186 <9c5b> <9c5b> 14706 <9c5c> <9c5c> 8404 <9c5d> <9c74> 14707 <9c75> <9c75> 8607 <9c76> <9c78> 14731 <9c79> <9c79> 7782 <9c7a> <9c7e> 14734 <9c80> <9c85> 14739 <9c86> <9c86> 8035 <9c87> <9c9c> 14745 endcidrange 100 begincidrange <9c9d> <9c9d> 9181 <9c9e> <9caa> 14767 <9cab> <9cab> 8555 <9cac> <9cc9> 14780 <9cca> <9cca> 8885 <9ccb> <9cce> 14810 <9ccf> <9ccf> 7974 <9cd0> <9ce5> 14814 <9ce6> <9ce6> 7779 <9ce7> <9ce7> 8328 <9ce8> <9ceb> 14836 <9cec> <9cec> 7869 <9ced> <9ced> 14840 <9cee> <9cee> 9025 <9cef> <9cfa> 14841 <9cfb> <9cfb> 8011 <9cfc> <9cfd> 14853 <9cfe> <9cfe> 8850 <9d40> <9d41> 14855 <9d42> <9d42> 8484 <9d43> <9d45> 14857 <9d46> <9d46> 8264 <9d47> <9d47> 9184 <9d48> <9d4c> 14860 <9d4d> <9d4d> 8311 <9d4e> <9d4e> 14865 <9d4f> <9d4f> 8762 <9d50> <9d60> 14866 <9d61> <9d61> 8369 <9d62> <9d67> 14883 <9d68> <9d68> 8001 <9d69> <9d69> 8220 <9d6a> <9d6d> 14889 <9d6e> <9d6e> 8888 <9d6f> <9d70> 14893 <9d71> <9d71> 8822 <9d72> <9d74> 14895 <9d75> <9d75> 8091 <9d76> <9d7a> 14898 <9d7b> <9d7b> 8095 <9d7c> <9d7c> 14903 <9d7d> <9d7d> 9674 <9d7e> <9d7e> 14904 <9d80> <9d89> 14905 <9d8a> <9d8a> 8382 <9d8b> <9d8c> 14915 <9d8d> <9d8d> 8116 <9d8e> <9d90> 14917 <9d91> <9d91> 9175 <9d92> <9d98> 14920 <9d99> <9d99> 8453 <9d9a> <9da0> 14927 <9da1> <9da1> 9185 <9da2> <9da2> 8172 <9da3> <9da6> 14934 <9da7> <9da7> 9194 <9da8> <9dab> 14938 <9dac> <9dac> 9187 <9dad> <9dad> 8462 <9dae> <9db1> 14942 <9db2> <9db2> 8102 <9db3> <9db3> 8196 <9db4> <9dbd> 14946 <9dbe> <9dbe> 8093 <9dbf> <9dc5> 14956 <9dc6> <9dc6> 9189 <9dc7> <9dc8> 14963 <9dc9> <9dc9> 8804 <9dca> <9dcc> 14965 <9dcd> <9dcd> 9442 <9dce> <9dd1> 14968 <9dd2> <9dd2> 9182 <9dd3> <9dd4> 14972 <9dd5> <9dd5> 7876 <9dd6> <9de0> 14974 <9de1> <9de1> 8886 <9de2> <9de2> 8361 <9de3> <9df0> 14985 <9df1> <9df1> 8491 <9df2> <9df3> 14999 <9df4> <9df4> 8357 <9df5> <9df6> 15001 <9df7> <9df7> 9867 <9df8> <9df9> 15003 <9dfa> <9dfa> 8054 <9dfb> <9dfc> 15005 <9dfd> <9dfd> 8557 <9dfe> <9dfe> 15007 <9e40> <9e44> 15008 <9e45> <9e45> 8193 <9e46> <9e47> 15013 <9e48> <9e48> 8593 <9e49> <9e49> 7760 <9e4a> <9e51> 15015 <9e52> <9e52> 8092 <9e53> <9e53> 15023 <9e54> <9e54> 9178 <9e55> <9e55> 15024 <9e56> <9e56> 8275 <9e57> <9e5c> 15025 endcidrange 100 begincidrange <9e5d> <9e5d> 9193 <9e5e> <9e5e> 9188 <9e5f> <9e60> 15031 <9e61> <9e61> 8661 <9e62> <9e62> 15033 <9e63> <9e63> 9190 <9e64> <9e66> 15034 <9e67> <9e67> 9183 <9e68> <9e6b> 15037 <9e6c> <9e6c> 7759 <9e6d> <9e6e> 15041 <9e6f> <9e6f> 9177 <9e70> <9e71> 15043 <9e72> <9e72> 8212 <9e73> <9e73> 15045 <9e74> <9e74> 9196 <9e75> <9e75> 9195 <9e76> <9e7a> 15046 <9e7b> <9e7b> 9176 <9e7c> <9e7c> 9198 <9e7d> <9e7e> 15051 <9e80> <9e84> 15053 <9e85> <9e85> 9870 <9e86> <9e86> 15058 <9e87> <9e87> 9197 <9e88> <9e90> 15059 <9e91> <9e91> 8186 <9e92> <9e95> 15068 <9e96> <9e96> 9174 <9e97> <9e97> 9192 <9e98> <9ea1> 15072 <9ea2> <9ea2> 8454 <9ea3> <9ea5> 15082 <9ea6> <9ea6> 8203 <9ea7> <9ea8> 15085 <9ea9> <9ea9> 8550 <9eaa> <9ead> 15087 <9eae> <9eae> 9199 <9eaf> <9eb2> 15091 <9eb3> <9eb3> 8585 <9eb4> <9eb4> 8280 <9eb5> <9eb6> 15095 <9eb7> <9eb7> 9191 <9eb8> <9ef4> 15097 <9ef5> <9ef5> 8611 <9ef6> <9efe> 15158 <9f40> <9f4d> 15167 <9f4e> <9f4e> 8570 <9f4f> <9f6e> 15181 <9f6f> <9f6f> 8613 <9f70> <9f7e> 15213 <9f80> <9f91> 15228 <9f92> <9f92> 8226 <9f93> <9f97> 15246 <9f98> <9f98> 9430 <9f99> <9fa5> 15251 <9fa6> <9fa6> 9018 <9fa7> <9fa8> 15264 <9fa9> <9fa9> 7918 <9faa> <9fab> 15266 <9fac> <9fac> 9429 <9fad> <9fc8> 15268 <9fc9> <9fc9> 8744 <9fca> <9fcc> 15296 <9fcd> <9fcd> 9431 <9fce> <9fe0> 15299 <9fe1> <9fe1> 8444 <9fe2> <9fea> 15318 <9feb> <9feb> 7815 <9fec> <9fed> 15327 <9fee> <9fee> 9432 <9fef> <9ff3> 15329 <9ff4> <9ff4> 7866 <9ff5> <9ffc> 15334 <9ffd> <9ffd> 8473 <9ffe> <9ffe> 15342 <a040> <a042> 15343 <a043> <a043> 8556 <a044> <a045> 15346 <a046> <a046> 9433 <a047> <a048> 15348 <a049> <a049> 8743 <a04a> <a04d> 15350 <a04e> <a04e> 7775 <a04f> <a053> 15354 <a054> <a054> 8863 <a055> <a059> 15359 <a05a> <a05a> 8029 <a05b> <a060> 15364 <a061> <a061> 8124 <a062> <a062> 15370 <a063> <a063> 9434 <a064> <a070> 15371 <a071> <a071> 8521 <a072> <a073> 15384 <a074> <a074> 8262 <a075> <a07e> 15386 <a080> <a080> 8192 <a081> <a090> 15396 <a091> <a091> 8592 endcidrange 100 begincidrange <a092> <a093> 15412 <a094> <a094> 8712 <a095> <a095> 15414 <a096> <a096> 7910 <a097> <a0a8> 15415 <a0a9> <a0a9> 9411 <a0aa> <a0be> 15433 <a0bf> <a0bf> 8396 <a0c0> <a0cd> 15454 <a0ce> <a0ce> 9024 <a0cf> <a0d8> 15468 <a0d9> <a0d9> 7889 <a0da> <a0dd> 15478 <a0de> <a0de> 8620 <a0df> <a0ed> 15482 <a0ee> <a0ee> 8879 <a0ef> <a0fe> 15497 <a1a1> <a1fe> 96 <a2a1> <a2aa> 9897 <a2b1> <a2e2> 190 <a2e3> <a2e3> 22353 <a2e5> <a2ee> 240 <a2f1> <a2fc> 250 <a3a1> <a3fe> 262 <a4a1> <a4f3> 356 <a5a1> <a5f6> 439 <a6a1> <a6b8> 525 <a6c1> <a6f5> 549 <a7a1> <a7c1> 602 <a7d1> <a7f1> 635 <a840> <a87e> 9907 <a880> <a895> 9970 <a8a1> <a8c0> 668 <a8c5> <a8ea> 700 <a940> <a957> 9992 <a959> <a95a> 10016 <a95c> <a95c> 10018 <a960> <a97e> 10019 <a980> <a995> 10050 <a996> <a996> 7703 <a9a4> <a9ef> 738 <aa40> <aa4c> 15513 <aa4d> <aa4d> 8630 <aa4e> <aa4e> 7741 <aa4f> <aa70> 15526 <aa71> <aa71> 8757 <aa72> <aa72> 15560 <aa73> <aa73> 9111 <aa74> <aa76> 15561 <aa77> <aa77> 9109 <aa78> <aa79> 15564 <aa7a> <aa7a> 8767 <aa7b> <aa7b> 8490 <aa7c> <aa7e> 15566 <aa80> <aa99> 15569 <aa9a> <aa9a> 7890 <aa9b> <aa9b> 15595 <aa9c> <aa9c> 9110 <aa9d> <aa9d> 9112 <aa9e> <aa9e> 15596 <aa9f> <aa9f> 8354 <aaa0> <aaa0> 15597 <aaa1> <aafe> 814 <ab40> <ab40> 8036 <ab41> <ab42> 15598 <ab43> <ab43> 8235 <ab44> <ab44> 15600 <ab45> <ab45> 9108 <ab46> <ab46> 8505 <ab47> <ab47> 15601 <ab48> <ab48> 8543 <ab49> <ab49> 8641 <ab4a> <ab4a> 9114 <ab4b> <ab4c> 15602 <ab4d> <ab4d> 9113 <ab4e> <ab7e> 15604 <ab80> <aba0> 15653 <aba1> <abc0> 908 <ac40> <ac45> 15686 <ac46> <ac46> 8640 <ac47> <ac70> 15692 <ac71> <ac71> 9312 <ac72> <ac7b> 15734 <ac7c> <ac7c> 9308 <ac7d> <ac7e> 15744 <ac80> <ac8c> 15746 <ac8d> <ac8d> 8541 <ac8e> <ac92> 15759 <ac93> <ac93> 8741 <ac94> <ac94> 8298 <ac95> <aca0> 15764 <ad40> <ad48> 15776 <ad49> <ad49> 9313 <ad4a> <ad5d> 15785 <ad5e> <ad5e> 9307 <ad5f> <ad60> 15805 <ad61> <ad61> 9314 <ad62> <ad67> 15807 <ad68> <ad68> 8020 <ad69> <ad73> 15813 endcidrange 100 begincidrange <ad74> <ad74> 9311 <ad75> <ad7e> 15824 <ad80> <ad81> 15834 <ad82> <ad82> 8428 <ad83> <ad86> 15836 <ad87> <ad87> 9309 <ad88> <ad8a> 15840 <ad8b> <ad8b> 9315 <ad8c> <ad90> 15843 <ad91> <ad91> 9316 <ad92> <ada0> 15848 <ae40> <ae53> 15863 <ae54> <ae54> 9381 <ae55> <ae61> 15883 <ae62> <ae62> 7792 <ae63> <ae7e> 15896 <ae80> <ae80> 8335 <ae81> <ae84> 15924 <ae85> <ae85> 7746 <ae86> <ae8a> 15928 <ae8b> <ae8b> 8014 <ae8c> <ae93> 15933 <ae94> <ae94> 7857 <ae95> <ae9f> 15941 <aea0> <aea0> 7819 <af40> <af63> 15952 <af64> <af64> 8134 <af65> <af7a> 15988 <af7b> <af7b> 9646 <af7c> <af7e> 16010 <af80> <af81> 16013 <af82> <af82> 7937 <af83> <af83> 8704 <af84> <af8d> 16015 <af8e> <af8e> 9650 <af8f> <af8f> 7831 <af90> <af90> 16025 <af91> <af91> 8363 <af92> <af9b> 16026 <af9c> <af9c> 9651 <af9d> <af9e> 16036 <af9f> <af9f> 8232 <afa0> <afa0> 16038 <b040> <b040> 16039 <b041> <b042> 9647 <b043> <b043> 16040 <b044> <b044> 9649 <b045> <b04e> 16041 <b04f> <b04f> 9644 <b050> <b053> 16051 <b054> <b054> 7758 <b055> <b056> 16055 <b057> <b057> 8706 <b058> <b058> 9643 <b059> <b059> 8838 <b05a> <b05a> 16057 <b05b> <b05b> 9645 <b05c> <b05c> 16058 <b05d> <b05d> 9654 <b05e> <b05e> 16059 <b05f> <b05f> 8675 <b060> <b061> 9652 <b062> <b062> 8751 <b063> <b063> 8549 <b064> <b064> 9655 <b065> <b06b> 16060 <b06c> <b06c> 7913 <b06d> <b07c> 16067 <b07d> <b07d> 7717 <b07e> <b07e> 16083 <b080> <b096> 16084 <b097> <b097> 9664 <b098> <b098> 16107 <b099> <b099> 8858 <b09a> <b0a0> 16108 <b0a1> <b0fe> 940 <b140> <b14a> 16115 <b14b> <b14b> 8814 <b14c> <b14c> 16126 <b14d> <b14d> 8125 <b14e> <b14e> 16127 <b14f> <b14f> 8068 <b150> <b150> 8370 <b151> <b151> 16128 <b152> <b152> 8259 <b153> <b17e> 16129 <b180> <b196> 16173 <b197> <b197> 9860 <b198> <b1a0> 16196 <b1a1> <b1fe> 1034 <b240> <b240> 16205 <b241> <b241> 9455 <b242> <b266> 16206 <b267> <b267> 9454 <b268> <b26c> 16243 <b26d> <b26d> 8308 <b26e> <b273> 16248 <b274> <b274> 9863 <b275> <b27e> 16254 <b280> <b280> 9456 endcidrange 100 begincidrange <b281> <b288> 16264 <b289> <b289> 9869 <b28a> <b299> 16272 <b29a> <b29a> 8864 <b29b> <b2a0> 16288 <b2a1> <b2fe> 1128 <b340> <b342> 16294 <b343> <b343> 8107 <b344> <b36f> 16297 <b370> <b370> 9896 <b371> <b37e> 16341 <b380> <b387> 16355 <b388> <b388> 9449 <b389> <b38b> 16363 <b38c> <b38c> 9445 <b38d> <b38d> 16366 <b38e> <b38e> 8698 <b38f> <b3a0> 16367 <b3a1> <b3fe> 1222 <b440> <b453> 16385 <b454> <b454> 8520 <b455> <b457> 16405 <b458> <b458> 9444 <b459> <b45d> 16408 <b45e> <b45e> 9446 <b45f> <b45f> 8439 <b460> <b460> 16413 <b461> <b461> 8299 <b462> <b474> 16414 <b475> <b475> 8871 <b476> <b47d> 16433 <b47e> <b47e> 9452 <b480> <b482> 16441 <b483> <b483> 9451 <b484> <b488> 16444 <b489> <b489> 9443 <b48a> <b492> 16449 <b493> <b493> 9450 <b494> <b4a0> 16458 <b4a1> <b4fe> 1316 <b540> <b540> 16471 <b541> <b541> 7826 <b542> <b54a> 16472 <b54b> <b54b> 7719 <b54c> <b555> 16481 <b556> <b556> 8166 <b557> <b559> 16491 <b55a> <b55a> 9447 <b55b> <b55b> 8210 <b55c> <b55c> 7916 <b55d> <b560> 16494 <b561> <b561> 9448 <b562> <b57e> 16498 <b580> <b59b> 16527 <b59c> <b59c> 8038 <b59d> <b59d> 9436 <b59e> <b5a0> 16555 <b5a1> <b5fe> 1410 <b640> <b651> 16558 <b652> <b652> 9890 <b653> <b654> 16576 <b655> <b655> 9437 <b656> <b658> 16578 <b659> <b659> 8206 <b65a> <b65a> 16581 <b65b> <b65b> 9435 <b65c> <b65c> 7864 <b65d> <b67e> 16582 <b680> <b6a0> 16616 <b6a1> <b6fe> 1504 <b740> <b74d> 16649 <b74e> <b74e> 8853 <b74f> <b750> 16663 <b751> <b751> 7808 <b752> <b758> 16665 <b759> <b759> 9847 <b75a> <b763> 16672 <b764> <b764> 9764 <b765> <b765> 8041 <b766> <b766> 8747 <b767> <b776> 16682 <b777> <b777> 9599 <b778> <b778> 8027 <b779> <b77e> 16698 <b780> <b780> 8603 <b781> <b781> 16704 <b782> <b782> 9853 <b783> <b7a0> 16705 <b7a1> <b7fe> 1598 <b840> <b842> 16735 <b843> <b843> 8608 <b844> <b844> 8582 <b845> <b845> 16738 <b846> <b846> 8429 <b847> <b84c> 16739 <b84d> <b84d> 9657 <b84e> <b850> 16745 <b851> <b851> 8170 <b852> <b859> 16748 <b85a> <b85a> 7844 endcidrange 100 begincidrange <b85b> <b85b> 8417 <b85c> <b85c> 16756 <b85d> <b85d> 9656 <b85e> <b85e> 8800 <b85f> <b85f> 16757 <b860> <b860> 8418 <b861> <b876> 16758 <b877> <b877> 8513 <b878> <b87e> 16780 <b880> <b881> 16787 <b882> <b882> 8135 <b883> <b8a0> 16789 <b8a1> <b8fe> 1692 <b940> <b94f> 16819 <b950> <b950> 7745 <b951> <b960> 16835 <b961> <b961> 9700 <b962> <b97a> 16851 <b97b> <b97b> 8070 <b97c> <b97e> 16876 <b980> <b99c> 16879 <b99d> <b99d> 8115 <b99e> <b99f> 16908 <b9a0> <b9a0> 7919 <b9a1> <b9fe> 1786 <ba40> <ba41> 16910 <ba42> <ba42> 8868 <ba43> <ba43> 16912 <ba44> <ba44> 9704 <ba45> <ba55> 16913 <ba56> <ba56> 9699 <ba57> <ba58> 16930 <ba59> <ba59> 8465 <ba5a> <ba5f> 16932 <ba60> <ba60> 9702 <ba61> <ba69> 16938 <ba6a> <ba6a> 9703 <ba6b> <ba73> 16947 <ba74> <ba74> 8257 <ba75> <ba7e> 16956 <ba80> <ba83> 16966 <ba84> <ba84> 9706 <ba85> <ba85> 16970 <ba86> <ba86> 8079 <ba87> <ba87> 16971 <ba88> <ba88> 9708 <ba89> <ba8c> 16972 <ba8d> <ba8d> 9707 <ba8e> <ba9d> 16976 <ba9e> <ba9e> 8400 <ba9f> <ba9f> 8221 <baa0> <baa0> 16992 <baa1> <bafe> 1880 <bb40> <bb40> 8183 <bb41> <bb48> 16993 <bb49> <bb49> 7821 <bb4a> <bb57> 17001 <bb58> <bb58> 9705 <bb59> <bb5a> 17015 <bb5b> <bb5b> 9710 <bb5c> <bb5c> 8250 <bb5d> <bb5f> 17017 <bb60> <bb60> 9875 <bb61> <bb64> 17020 <bb65> <bb65> 9701 <bb66> <bb66> 9709 <bb67> <bb67> 17024 <bb68> <bb68> 8201 <bb69> <bb69> 17025 <bb6a> <bb6a> 8293 <bb6b> <bb6d> 17026 <bb6e> <bb6e> 9891 <bb6f> <bb7e> 17029 <bb80> <bba0> 17045 <bba1> <bbfe> 1974 <bc40> <bc51> 17078 <bc52> <bc52> 9717 <bc53> <bc53> 7932 <bc54> <bc59> 17096 <bc5a> <bc5a> 8228 <bc5b> <bc60> 17102 <bc61> <bc61> 9883 <bc62> <bc62> 17108 <bc63> <bc63> 9715 <bc64> <bc64> 17109 <bc65> <bc65> 8921 <bc66> <bc66> 17110 <bc67> <bc67> 9716 <bc68> <bc68> 17111 <bc69> <bc69> 9243 <bc6a> <bc6c> 17112 <bc6d> <bc6d> 8136 <bc6e> <bc6e> 17115 <bc6f> <bc6f> 8059 <bc70> <bc70> 17116 <bc71> <bc71> 9245 <bc72> <bc72> 17117 <bc73> <bc73> 8780 <bc74> <bc74> 8008 <bc75> <bc75> 9244 endcidrange 100 begincidrange <bc76> <bc77> 9246 <bc78> <bc78> 8447 <bc79> <bc79> 8602 <bc7a> <bc7a> 17118 <bc7b> <bc7b> 8337 <bc7c> <bc7d> 17119 <bc7e> <bc7e> 8359 <bc80> <bc81> 17121 <bc82> <bc82> 9251 <bc83> <bc83> 7835 <bc84> <bc84> 9250 <bc85> <bc85> 17123 <bc86> <bc86> 8464 <bc87> <bc87> 17124 <bc88> <bc88> 8845 <bc89> <bc89> 8049 <bc8a> <bc8a> 7928 <bc8b> <bc8b> 9249 <bc8c> <bc8e> 17125 <bc8f> <bc8f> 7923 <bc90> <bc99> 17128 <bc9a> <bc9a> 8625 <bc9b> <bc9b> 9254 <bc9c> <bc9c> 9253 <bc9d> <bc9d> 8480 <bc9e> <bca0> 17138 <bca1> <bcfe> 2068 <bd40> <bd41> 17141 <bd42> <bd42> 8474 <bd43> <bd43> 9252 <bd44> <bd44> 17143 <bd45> <bd45> 9256 <bd46> <bd47> 17144 <bd48> <bd48> 9258 <bd49> <bd49> 9257 <bd4a> <bd4a> 17146 <bd4b> <bd4b> 8852 <bd4c> <bd4c> 17147 <bd4d> <bd4d> 8894 <bd4e> <bd4e> 17148 <bd4f> <bd4f> 7729 <bd50> <bd56> 17149 <bd57> <bd57> 9260 <bd58> <bd58> 17156 <bd59> <bd59> 8117 <bd5a> <bd65> 17157 <bd66> <bd66> 9259 <bd67> <bd67> 8111 <bd68> <bd69> 17169 <bd6a> <bd6a> 8296 <bd6b> <bd6b> 8676 <bd6c> <bd6e> 17171 <bd6f> <bd6f> 7969 <bd70> <bd70> 17174 <bd71> <bd71> 8449 <bd72> <bd78> 17175 <bd79> <bd79> 8572 <bd7a> <bd7a> 8522 <bd7b> <bd7b> 9261 <bd7c> <bd7d> 17182 <bd7e> <bd7e> 8148 <bd80> <bd80> 17184 <bd81> <bd81> 8145 <bd82> <bd88> 17185 <bd89> <bd89> 7731 <bd8a> <bd8a> 17192 <bd8b> <bd8b> 9263 <bd8c> <bd8d> 17193 <bd8e> <bd8e> 9262 <bd8f> <bd8f> 17195 <bd90> <bd90> 9264 <bd91> <bd91> 8667 <bd92> <bd96> 17196 <bd97> <bd97> 8536 <bd98> <bd9a> 17201 <bd9b> <bd9b> 8130 <bd9c> <bda0> 17204 <bda1> <bdfe> 2162 <be40> <be42> 17209 <be43> <be43> 8889 <be44> <be44> 17212 <be45> <be45> 9270 <be46> <be48> 17213 <be49> <be49> 7822 <be4a> <be4a> 9273 <be4b> <be50> 17216 <be51> <be51> 8645 <be52> <be52> 9271 <be53> <be53> 8594 <be54> <be54> 17222 <be55> <be55> 9274 <be56> <be56> 7961 <be57> <be57> 8588 <be58> <be58> 7744 <be59> <be59> 8883 <be5a> <be5c> 17223 <be5d> <be5d> 8287 <be5e> <be5e> 9272 <be5f> <be5f> 9266 <be60> <be60> 8820 endcidrange 100 begincidrange <be61> <be61> 17226 <be62> <be62> 7836 <be63> <be63> 9265 <be64> <be64> 8325 <be65> <be68> 17227 <be69> <be69> 9269 <be6a> <be6b> 17231 <be6c> <be6c> 9275 <be6d> <be6e> 17233 <be6f> <be6f> 8119 <be70> <be70> 9267 <be71> <be75> 17235 <be76> <be76> 8276 <be77> <be77> 8670 <be78> <be78> 17240 <be79> <be79> 9268 <be7a> <be7b> 17241 <be7c> <be7c> 9277 <be7d> <be7d> 8073 <be7e> <be7e> 9276 <be80> <be82> 17243 <be83> <be83> 8046 <be84> <be84> 7896 <be85> <be85> 17246 <be86> <be86> 7871 <be87> <be87> 9285 <be88> <be88> 17247 <be89> <be89> 8777 <be8a> <be8b> 17248 <be8c> <be8c> 9281 <be8d> <be8d> 17250 <be8e> <be8e> 7751 <be8f> <be8f> 8022 <be90> <be91> 17251 <be92> <be92> 8326 <be93> <be94> 17253 <be95> <be95> 8598 <be96> <be96> 17255 <be97> <be97> 9283 <be98> <be98> 9279 <be99> <be99> 17256 <be9a> <be9a> 8227 <be9b> <be9b> 17257 <be9c> <be9c> 9282 <be9d> <be9e> 17258 <be9f> <be9f> 9278 <bea0> <bea0> 17260 <bea1> <befe> 2256 <bf40> <bf40> 9894 <bf41> <bf4c> 17261 <bf4d> <bf4d> 9038 <bf4e> <bf4e> 9286 <bf4f> <bf4f> 9291 <bf50> <bf50> 9284 <bf51> <bf54> 17273 <bf55> <bf55> 9255 <bf56> <bf56> 9292 <bf57> <bf5f> 17277 <bf60> <bf60> 7951 <bf61> <bf61> 17286 <bf62> <bf62> 9287 <bf63> <bf63> 9289 <bf64> <bf64> 9288 <bf65> <bf67> 17287 <bf68> <bf68> 8642 <bf69> <bf6b> 17290 <bf6c> <bf6c> 8558 <bf6d> <bf6f> 17293 <bf70> <bf70> 7939 <bf71> <bf71> 17296 <bf72> <bf72> 9290 <bf73> <bf73> 8540 <bf74> <bf75> 17297 <bf76> <bf76> 8891 <bf77> <bf77> 9296 <bf78> <bf78> 17299 <bf79> <bf79> 9876 <bf7a> <bf7a> 9295 <bf7b> <bf7b> 9718 <bf7c> <bf7c> 8273 <bf7d> <bf7d> 17300 <bf7e> <bf7e> 9294 <bf80> <bf81> 17301 <bf82> <bf82> 8890 <bf83> <bf83> 8045 <bf84> <bf88> 17303 <bf89> <bf89> 9298 <bf8a> <bf8a> 9297 <bf8b> <bf94> 17308 <bf95> <bf95> 9301 <bf96> <bf96> 17318 <bf97> <bf97> 8841 <bf98> <bf98> 8470 <bf99> <bf9c> 17319 <bf9d> <bf9d> 9300 <bf9e> <bfa0> 17323 <bfa1> <bffe> 2350 <c040> <c040> 8443 <c041> <c043> 17326 <c044> <c044> 9280 endcidrange 100 begincidrange <c045> <c04a> 17329 <c04b> <c04b> 8486 <c04c> <c04c> 8033 <c04d> <c04d> 9885 <c04e> <c04e> 17335 <c04f> <c04f> 8074 <c050> <c050> 9302 <c051> <c051> 9305 <c052> <c052> 9304 <c053> <c054> 17336 <c055> <c055> 8110 <c056> <c05a> 17338 <c05b> <c05b> 8730 <c05c> <c05d> 17343 <c05e> <c05e> 8058 <c05f> <c05f> 9293 <c060> <c060> 9303 <c061> <c068> 17345 <c069> <c069> 9299 <c06a> <c06a> 17353 <c06b> <c06b> 9248 <c06c> <c06c> 17354 <c06d> <c06d> 8671 <c06e> <c06e> 9861 <c06f> <c06f> 17355 <c070> <c070> 7790 <c071> <c073> 17356 <c074> <c074> 8740 <c075> <c075> 9840 <c076> <c076> 17359 <c077> <c077> 8634 <c078> <c078> 17360 <c079> <c079> 9306 <c07a> <c07b> 17361 <c07c> <c07c> 8191 <c07d> <c07e> 17363 <c080> <c09a> 17365 <c09b> <c09b> 9698 <c09c> <c09c> 17392 <c09d> <c09d> 9882 <c09e> <c0a0> 17393 <c0a1> <c0fe> 2444 <c140> <c14f> 17396 <c150> <c150> 7914 <c151> <c153> 17412 <c154> <c154> 7724 <c155> <c15e> 17415 <c15f> <c15f> 8290 <c160> <c160> 9457 <c161> <c161> 17425 <c162> <c162> 9458 <c163> <c174> 17426 <c175> <c175> 9714 <c176> <c177> 17444 <c178> <c178> 8725 <c179> <c17e> 17446 <c180> <c194> 17452 <c195> <c195> 8622 <c196> <c1a0> 17473 <c1a1> <c1fe> 2538 <c240> <c24d> 17484 <c24e> <c24e> 8416 <c24f> <c264> 17498 <c265> <c265> 9666 <c266> <c266> 17520 <c267> <c267> 9665 <c268> <c27c> 17521 <c27d> <c27d> 8488 <c27e> <c27e> 17542 <c280> <c283> 17543 <c284> <c284> 8601 <c285> <c292> 17547 <c293> <c293> 8215 <c294> <c294> 7840 <c295> <c295> 8485 <c296> <c296> 8525 <c297> <c297> 17561 <c298> <c298> 9668 <c299> <c299> 8349 <c29a> <c29a> 8842 <c29b> <c29b> 17562 <c29c> <c29c> 9667 <c29d> <c29f> 17563 <c2a0> <c2a0> 8569 <c2a1> <c2fe> 2632 <c340> <c340> 8248 <c341> <c342> 17566 <c343> <c343> 8533 <c344> <c37a> 17568 <c37b> <c37b> 8658 <c37c> <c37e> 17623 <c380> <c383> 17626 <c384> <c384> 9415 <c385> <c39a> 17630 <c39b> <c39b> 8825 <c39c> <c3a0> 17652 <c3a1> <c3fe> 2726 <c440> <c448> 17657 <c449> <c449> 8483 <c44a> <c44b> 17666 endcidrange 100 begincidrange <c44c> <c44c> 9413 <c44d> <c453> 17668 <c454> <c454> 9417 <c455> <c457> 17675 <c458> <c458> 8340 <c459> <c45a> 17678 <c45b> <c45b> 8854 <c45c> <c462> 17680 <c463> <c463> 7799 <c464> <c476> 17687 <c477> <c477> 7942 <c478> <c479> 17706 <c47a> <c47a> 8101 <c47b> <c47e> 17708 <c480> <c480> 17712 <c481> <c481> 8345 <c482> <c490> 17713 <c491> <c491> 7853 <c492> <c492> 9416 <c493> <c493> 8360 <c494> <c497> 17728 <c498> <c498> 8223 <c499> <c499> 17732 <c49a> <c49a> 8389 <c49b> <c49b> 17733 <c49c> <c49c> 9418 <c49d> <c4a0> 17734 <c4a1> <c4fe> 2820 <c540> <c543> 17738 <c544> <c544> 8176 <c545> <c545> 17742 <c546> <c546> 9414 <c547> <c54a> 17743 <c54b> <c54b> 8797 <c54c> <c54c> 8926 <c54d> <c551> 17747 <c552> <c552> 8236 <c553> <c55e> 17752 <c55f> <c55f> 8545 <c560> <c562> 17764 <c563> <c563> 8763 <c564> <c564> 8665 <c565> <c565> 8139 <c566> <c566> 8137 <c567> <c57e> 17767 <c580> <c592> 17791 <c593> <c593> 7777 <c594> <c59b> 17810 <c59c> <c59c> 9711 <c59d> <c59d> 17818 <c59e> <c59e> 8088 <c59f> <c5a0> 17819 <c5a1> <c5fe> 2914 <c640> <c640> 17821 <c641> <c641> 9712 <c642> <c643> 17822 <c644> <c644> 8072 <c645> <c646> 17824 <c647> <c647> 8696 <c648> <c662> 17826 <c663> <c663> 8994 <c664> <c671> 17853 <c672> <c672> 9014 <c673> <c67e> 17867 <c680> <c6a0> 17879 <c6a1> <c6fe> 3008 <c740> <c765> 17912 <c766> <c766> 8875 <c767> <c76e> 17950 <c76f> <c76f> 8127 <c770> <c775> 17958 <c776> <c776> 8061 <c777> <c77a> 17964 <c77b> <c77b> 9011 <c77c> <c77e> 17968 <c780> <c7a0> 17971 <c7a1> <c7fe> 3102 <c840> <c840> 18004 <c841> <c841> 8013 <c842> <c84e> 18005 <c84f> <c84f> 9012 <c850> <c851> 18018 <c852> <c852> 8177 <c853> <c865> 18020 <c866> <c866> 8587 <c867> <c86d> 18039 <c86e> <c86e> 9033 <c86f> <c87d> 18046 <c87e> <c87e> 8715 <c880> <c886> 18061 <c887> <c887> 9030 <c888> <c891> 18068 <c892> <c892> 9031 <c893> <c893> 18078 <c894> <c894> 8595 <c895> <c898> 18079 <c899> <c899> 9889 <c89a> <c89c> 18083 <c89d> <c89d> 8034 <c89e> <c8a0> 18086 endcidrange 100 begincidrange <c8a1> <c8fe> 3196 <c940> <c94e> 18089 <c94f> <c94f> 9037 <c950> <c950> 9032 <c951> <c96d> 18104 <c96e> <c96e> 7776 <c96f> <c96f> 18133 <c970> <c970> 9029 <c971> <c976> 18134 <c977> <c977> 7954 <c978> <c97e> 18140 <c980> <c98e> 18147 <c98f> <c98f> 8216 <c990> <c990> 9013 <c991> <c99b> 18162 <c99c> <c99c> 9020 <c99d> <c9a0> 18173 <c9a1> <c9fe> 3290 <ca40> <ca4d> 18177 <ca4e> <ca4e> 9839 <ca4f> <ca55> 18191 <ca56> <ca56> 9041 <ca57> <ca58> 18198 <ca59> <ca59> 8096 <ca5a> <ca5b> 18200 <ca5c> <ca5c> 9016 <ca5d> <ca60> 18202 <ca61> <ca61> 8731 <ca62> <ca6d> 18206 <ca6e> <ca6e> 9026 <ca6f> <ca71> 18218 <ca72> <ca72> 9039 <ca73> <ca76> 18221 <ca77> <ca77> 9021 <ca78> <ca7a> 18225 <ca7b> <ca7b> 9028 <ca7c> <ca7c> 9009 <ca7d> <ca7d> 18228 <ca7e> <ca7e> 9035 <ca80> <ca80> 18229 <ca81> <ca81> 9019 <ca82> <ca88> 18230 <ca89> <ca89> 9040 <ca8a> <ca8d> 18237 <ca8e> <ca8e> 7860 <ca8f> <ca8f> 8614 <ca90> <ca91> 18241 <ca92> <ca92> 8651 <ca93> <ca99> 18243 <ca9a> <ca9a> 9045 <ca9b> <caa0> 18250 <caa1> <cafe> 3384 <cb40> <cb42> 18256 <cb43> <cb43> 9022 <cb44> <cb44> 18259 <cb45> <cb45> 8052 <cb46> <cb46> 18260 <cb47> <cb47> 9008 <cb48> <cb4a> 18261 <cb4b> <cb4b> 9856 <cb4c> <cb4d> 18264 <cb4e> <cb4e> 8410 <cb4f> <cb56> 18266 <cb57> <cb57> 9034 <cb58> <cb5c> 18274 <cb5d> <cb5d> 8081 <cb5e> <cb5e> 18279 <cb5f> <cb5f> 8455 <cb60> <cb69> 18280 <cb6a> <cb6a> 9023 <cb6b> <cb7a> 18290 <cb7b> <cb7b> 8180 <cb7c> <cb7c> 9027 <cb7d> <cb7e> 18306 <cb80> <cb86> 18308 <cb87> <cb87> 8722 <cb88> <cb8d> 18315 <cb8e> <cb8e> 8711 <cb8f> <cb91> 18321 <cb92> <cb92> 9049 <cb93> <cb9b> 18324 <cb9c> <cb9c> 8788 <cb9d> <cb9d> 18333 <cb9e> <cb9e> 9010 <cb9f> <cba0> 18334 <cba1> <cbfe> 3478 <cc40> <cc40> 7718 <cc41> <cc41> 9047 <cc42> <cc48> 18336 <cc49> <cc49> 9048 <cc4a> <cc4a> 8258 <cc4b> <cc4b> 8531 <cc4c> <cc4e> 18343 <cc4f> <cc4f> 8379 <cc50> <cc5b> 18346 <cc5c> <cc5c> 9050 <cc5d> <cc5f> 18358 <cc60> <cc60> 9046 <cc61> <cc63> 18361 <cc64> <cc64> 9015 endcidrange 100 begincidrange <cc65> <cc6c> 18364 <cc6d> <cc6d> 8185 <cc6e> <cc78> 18372 <cc79> <cc79> 9043 <cc7a> <cc7c> 18383 <cc7d> <cc7d> 8289 <cc7e> <cc7e> 18386 <cc80> <cc8d> 18387 <cc8e> <cc8e> 7829 <cc8f> <cc93> 18401 <cc94> <cc94> 8265 <cc95> <cc95> 18406 <cc96> <cc96> 8002 <cc97> <cc9c> 18407 <cc9d> <cc9d> 8168 <cc9e> <cca0> 18413 <cca1> <ccfe> 3572 <cd40> <cd7e> 18416 <cd80> <cd8f> 18479 <cd90> <cd90> 9690 <cd91> <cd97> 18495 <cd98> <cd98> 9687 <cd99> <cda0> 18502 <cda1> <cdfe> 3666 <ce40> <ce66> 18510 <ce67> <ce67> 8494 <ce68> <ce71> 18549 <ce72> <ce72> 8626 <ce73> <ce7e> 18559 <ce80> <ce80> 18571 <ce81> <ce81> 8606 <ce82> <ce86> 18572 <ce87> <ce87> 9692 <ce88> <ce9a> 18577 <ce9b> <ce9b> 8300 <ce9c> <ce9d> 18596 <ce9e> <ce9e> 8742 <ce9f> <cea0> 18598 <cea1> <cefe> 3760 <cf40> <cf4d> 18600 <cf4e> <cf4e> 9696 <cf4f> <cf54> 18614 <cf55> <cf55> 8827 <cf56> <cf57> 18620 <cf58> <cf58> 9694 <cf59> <cf5b> 18622 <cf5c> <cf5c> 9697 <cf5d> <cf6b> 18625 <cf6c> <cf6c> 9685 <cf6d> <cf72> 18640 <cf73> <cf73> 7787 <cf74> <cf74> 18646 <cf75> <cf75> 9691 <cf76> <cf77> 18647 <cf78> <cf78> 7817 <cf79> <cf7b> 18649 <cf7c> <cf7c> 9689 <cf7d> <cf7e> 18652 <cf80> <cf80> 18654 <cf81> <cf81> 8721 <cf82> <cf88> 18655 <cf89> <cf89> 8745 <cf8a> <cf8a> 9686 <cf8b> <cf92> 18662 <cf93> <cf93> 9693 <cf94> <cf94> 9695 <cf95> <cf9d> 18670 <cf9e> <cf9e> 8175 <cf9f> <cf9f> 18679 <cfa0> <cfa0> 9688 <cfa1> <cffe> 3854 <d040> <d04c> 18680 <d04d> <d04d> 7977 <d04e> <d050> 18693 <d051> <d051> 7771 <d052> <d054> 18696 <d055> <d055> 8310 <d056> <d05b> 18699 <d05c> <d05c> 8855 <d05d> <d05f> 18705 <d060> <d060> 9872 <d061> <d066> 18708 <d067> <d067> 8511 <d068> <d06b> 18714 <d06c> <d06c> 8600 <d06d> <d06d> 18718 <d06e> <d06e> 7816 <d06f> <d07c> 18719 <d07d> <d07d> 8844 <d07e> <d07e> 18733 <d080> <d0a0> 18734 <d0a1> <d0fe> 3948 <d140> <d154> 18767 <d155> <d155> 9713 <d156> <d158> 18788 <d159> <d159> 8204 <d15a> <d160> 18791 <d161> <d161> 7768 <d162> <d162> 8876 <d163> <d174> 18798 endcidrange 100 begincidrange <d175> <d175> 9895 <d176> <d17c> 18816 <d17d> <d17d> 9846 <d17e> <d17e> 18823 <d180> <d19c> 18824 <d19d> <d19d> 8161 <d19e> <d19e> 9659 <d19f> <d1a0> 18853 <d1a1> <d1fe> 4042 <d240> <d240> 9662 <d241> <d242> 18855 <d243> <d243> 8925 <d244> <d24c> 18857 <d24d> <d24d> 9661 <d24e> <d25b> 18866 <d25c> <d25c> 7722 <d25d> <d262> 18880 <d263> <d263> 9660 <d264> <d264> 9658 <d265> <d267> 18886 <d268> <d268> 9663 <d269> <d26c> 18889 <d26d> <d26d> 8583 <d26e> <d26e> 18893 <d26f> <d26f> 9835 <d270> <d271> 18894 <d272> <d272> 7807 <d273> <d274> 18896 <d275> <d275> 8621 <d276> <d27e> 18898 <d280> <d289> 18907 <d28a> <d28a> 8086 <d28b> <d28d> 18917 <d28e> <d28e> 7986 <d28f> <d291> 18920 <d292> <d292> 8324 <d293> <d294> 18923 <d295> <d295> 8502 <d296> <d296> 18925 <d297> <d297> 9400 <d298> <d29f> 18926 <d2a0> <d2a0> 9402 <d2a1> <d2fe> 4136 <d340> <d343> 18934 <d344> <d344> 9404 <d345> <d347> 18938 <d348> <d348> 8420 <d349> <d349> 18941 <d34a> <d34a> 9401 <d34b> <d34c> 18942 <d34d> <d34d> 9405 <d34e> <d34f> 18944 <d350> <d350> 9406 <d351> <d354> 18946 <d355> <d355> 9407 <d356> <d357> 18950 <d358> <d358> 8146 <d359> <d35a> 18952 <d35b> <d35b> 8189 <d35c> <d35c> 18954 <d35d> <d35d> 9403 <d35e> <d35e> 7981 <d35f> <d377> 18955 <d378> <d378> 9737 <d379> <d379> 18980 <d37a> <d37a> 9738 <d37b> <d37b> 18981 <d37c> <d37c> 7828 <d37d> <d37e> 18982 <d380> <d384> 18984 <d385> <d385> 8927 <d386> <d386> 7883 <d387> <d387> 7949 <d388> <d38a> 18989 <d38b> <d38b> 8055 <d38c> <d38c> 18992 <d38d> <d38d> 8683 <d38e> <d38e> 18993 <d38f> <d38f> 8929 <d390> <d390> 18994 <d391> <d391> 8559 <d392> <d392> 18995 <d393> <d393> 8928 <d394> <d395> 18996 <d396> <d396> 8682 <d397> <d397> 18998 <d398> <d398> 8930 <d399> <d399> 8395 <d39a> <d39a> 18999 <d39b> <d39b> 8056 <d39c> <d39d> 19000 <d39e> <d39e> 7906 <d39f> <d39f> 19002 <d3a0> <d3a0> 8690 <d3a1> <d3fe> 4230 <d440> <d440> 19003 <d441> <d441> 8528 <d442> <d444> 19004 <d445> <d445> 8147 <d446> <d446> 19007 endcidrange 100 begincidrange <d447> <d447> 8933 <d448> <d44b> 19008 <d44c> <d44c> 7922 <d44d> <d44e> 19012 <d44f> <d44f> 8479 <d450> <d452> 19014 <d453> <d453> 8669 <d454> <d455> 19017 <d456> <d456> 8532 <d457> <d457> 19019 <d458> <d458> 8935 <d459> <d45b> 19020 <d45c> <d45c> 8834 <d45d> <d461> 19023 <d462> <d462> 8934 <d463> <d466> 19028 <d467> <d467> 8936 <d468> <d46d> 19032 <d46e> <d46e> 8932 <d46f> <d46f> 19038 <d470> <d470> 8810 <d471> <d471> 19039 <d472> <d472> 8939 <d473> <d473> 19040 <d474> <d474> 8937 <d475> <d475> 8381 <d476> <d477> 19041 <d478> <d478> 8938 <d479> <d47a> 19043 <d47b> <d47b> 8893 <d47c> <d47d> 19045 <d47e> <d47e> 7838 <d480> <d481> 19047 <d482> <d482> 8950 <d483> <d483> 8679 <d484> <d484> 8726 <d485> <d486> 19049 <d487> <d487> 8503 <d488> <d489> 19051 <d48a> <d48a> 8492 <d48b> <d48b> 19053 <d48c> <d48c> 7784 <d48d> <d48d> 8946 <d48e> <d48e> 7991 <d48f> <d48f> 8947 <d490> <d490> 19054 <d491> <d491> 8943 <d492> <d492> 8016 <d493> <d493> 7952 <d494> <d494> 8648 <d495> <d495> 19055 <d496> <d496> 8945 <d497> <d49b> 19056 <d49c> <d49c> 8944 <d49d> <d49e> 19061 <d49f> <d49f> 8942 <d4a0> <d4a0> 19063 <d4a1> <d4fe> 4324 <d540> <d542> 19064 <d543> <d543> 8941 <d544> <d544> 8862 <d545> <d545> 8940 <d546> <d546> 8162 <d547> <d549> 19067 <d54a> <d54a> 8446 <d54b> <d54d> 19070 <d54e> <d54f> 8953 <d550> <d550> 19073 <d551> <d551> 7855 <d552> <d553> 19074 <d554> <d554> 8758 <d555> <d555> 19076 <d556> <d556> 8951 <d557> <d559> 19077 <d55a> <d55a> 8765 <d55b> <d55b> 19080 <d55c> <d55c> 7810 <d55d> <d55d> 8118 <d55e> <d55e> 19081 <d55f> <d55f> 8612 <d560> <d560> 8618 <d561> <d561> 8952 <d562> <d562> 8529 <d563> <d563> 19082 <d564> <d564> 8032 <d565> <d567> 19083 <d568> <d568> 8519 <d569> <d56b> 19086 <d56c> <d56c> 8517 <d56d> <d56d> 19089 <d56e> <d56e> 8156 <d56f> <d571> 19090 <d572> <d572> 8961 <d573> <d574> 19093 <d575> <d575> 7925 <d576> <d577> 19095 <d578> <d578> 8728 <d579> <d57a> 19097 <d57b> <d57b> 7878 <d57c> <d57d> 19099 endcidrange 100 begincidrange <d57e> <d57e> 8960 <d580> <d580> 19101 <d581> <d581> 8884 <d582> <d583> 19102 <d584> <d584> 8553 <d585> <d585> 19104 <d586> <d586> 8957 <d587> <d587> 19105 <d588> <d588> 8426 <d589> <d589> 19106 <d58a> <d58a> 8948 <d58b> <d58b> 19107 <d58c> <d58c> 8955 <d58d> <d58d> 19108 <d58e> <d58e> 8956 <d58f> <d58f> 8231 <d590> <d592> 19109 <d593> <d593> 8288 <d594> <d594> 8959 <d595> <d597> 19112 <d598> <d598> 8958 <d599> <d599> 7879 <d59a> <d59a> 19115 <d59b> <d59b> 8972 <d59c> <d59e> 19116 <d59f> <d59f> 8949 <d5a0> <d5a0> 19119 <d5a1> <d5fe> 4418 <d640> <d640> 8966 <d641> <d641> 19120 <d642> <d642> 8970 <d643> <d643> 8659 <d644> <d646> 19121 <d647> <d647> 8963 <d648> <d648> 19124 <d649> <d649> 8967 <d64a> <d64a> 8971 <d64b> <d64c> 19125 <d64d> <d64d> 8031 <d64e> <d64e> 19127 <d64f> <d64f> 8969 <d650> <d651> 19128 <d652> <d652> 8962 <d653> <d653> 7940 <d654> <d654> 8861 <d655> <d655> 19130 <d656> <d656> 8699 <d657> <d657> 19131 <d658> <d658> 8968 <d659> <d659> 19132 <d65a> <d65a> 8364 <d65b> <d65b> 19133 <d65c> <d65c> 8334 <d65d> <d65d> 8965 <d65e> <d65e> 8599 <d65f> <d65f> 19134 <d660> <d660> 8561 <d661> <d661> 8856 <d662> <d664> 19135 <d665> <d665> 8023 <d666> <d668> 19138 <d669> <d669> 8322 <d66a> <d66a> 19141 <d66b> <d66b> 8977 <d66c> <d66e> 19142 <d66f> <d66f> 8964 <d670> <d670> 19145 <d671> <d671> 8975 <d672> <d672> 7733 <d673> <d673> 19146 <d674> <d674> 8401 <d675> <d675> 8976 <d676> <d676> 8099 <d677> <d677> 19147 <d678> <d678> 8662 <d679> <d67b> 19148 <d67c> <d67c> 8710 <d67d> <d67e> 19151 <d680> <d682> 19153 <d683> <d683> 8973 <d684> <d685> 19156 <d686> <d686> 8978 <d687> <d687> 8333 <d688> <d688> 8979 <d689> <d68d> 19158 <d68e> <d68e> 8931 <d68f> <d693> 19163 <d694> <d694> 8122 <d695> <d698> 19168 <d699> <d699> 8312 <d69a> <d6a0> 19172 <d6a1> <d6fe> 4512 <d740> <d742> 19179 <d743> <d743> 8840 <d744> <d747> 19182 <d748> <d748> 8982 <d749> <d749> 8043 <d74a> <d74f> 19186 <d750> <d750> 8980 <d751> <d751> 19192 endcidrange 100 begincidrange <d752> <d752> 8496 <d753> <d753> 8981 <d754> <d754> 8552 <d755> <d755> 19193 <d756> <d756> 8388 <d757> <d763> 19194 <d764> <d764> 8984 <d765> <d766> 19207 <d767> <d767> 8729 <d768> <d768> 8727 <d769> <d76b> 19209 <d76c> <d76c> 8405 <d76d> <d76e> 19212 <d76f> <d76f> 8010 <d770> <d774> 19214 <d775> <d775> 8768 <d776> <d777> 19219 <d778> <d778> 7891 <d779> <d77e> 19221 <d780> <d782> 19227 <d783> <d783> 7753 <d784> <d786> 19230 <d787> <d787> 9755 <d788> <d78a> 19233 <d78b> <d78b> 7789 <d78c> <d78c> 8440 <d78d> <d78d> 19236 <d78e> <d78e> 8187 <d78f> <d78f> 8985 <d790> <d794> 19237 <d795> <d795> 8974 <d796> <d796> 19242 <d797> <d797> 8983 <d798> <d7a0> 19243 <d7a1> <d7f9> 4606 <d840> <d84c> 19252 <d84d> <d84d> 8392 <d84e> <d852> 19265 <d853> <d853> 7933 <d854> <d87e> 19270 <d880> <d88f> 19313 <d890> <d890> 7739 <d891> <d891> 8831 <d892> <d892> 19329 <d893> <d893> 7948 <d894> <d894> 7769 <d895> <d895> 7972 <d896> <d899> 19330 <d89a> <d89a> 8378 <d89b> <d89b> 8037 <d89c> <d89c> 7920 <d89d> <d89d> 8548 <d89e> <d89e> 7984 <d89f> <d89f> 8801 <d8a0> <d8a0> 19334 <d8a1> <d8fe> 4695 <d940> <d940> 19335 <d941> <d941> 8866 <d942> <d942> 9387 <d943> <d943> 19336 <d944> <d944> 9391 <d945> <d945> 7912 <d946> <d946> 7993 <d947> <d947> 19337 <d948> <d948> 7752 <d949> <d949> 8304 <d94a> <d94a> 7848 <d94b> <d94b> 19338 <d94c> <d94c> 9388 <d94d> <d94d> 7927 <d94e> <d94e> 8566 <d94f> <d94f> 9389 <d950> <d950> 19339 <d951> <d951> 8315 <d952> <d952> 8005 <d953> <d953> 9386 <d954> <d954> 8267 <d955> <d955> 8239 <d956> <d956> 8026 <d957> <d957> 9392 <d958> <d958> 19340 <d959> <d959> 8887 <d95a> <d95a> 8063 <d95b> <d95b> 19341 <d95c> <d95c> 8805 <d95d> <d962> 19342 <d963> <d963> 9394 <d964> <d964> 8475 <d965> <d965> 7761 <d966> <d966> 19348 <d967> <d967> 9396 <d968> <d96b> 19349 <d96c> <d96c> 9395 <d96d> <d96d> 19353 <d96e> <d96e> 7839 <d96f> <d96f> 19354 <d970> <d970> 8472 <d971> <d971> 19355 <d972> <d972> 8372 <d973> <d973> 9135 endcidrange 100 begincidrange <d974> <d974> 8635 <d975> <d975> 8306 <d976> <d976> 8085 <d977> <d977> 19356 <d978> <d978> 7946 <d979> <d979> 9398 <d97a> <d97b> 19357 <d97c> <d97c> 8849 <d97d> <d97d> 9397 <d97e> <d97e> 8824 <d980> <d980> 7892 <d981> <d986> 19359 <d987> <d987> 8179 <d988> <d98c> 19365 <d98d> <d98d> 8873 <d98e> <d98e> 9399 <d98f> <d98f> 7976 <d990> <d990> 8457 <d991> <d991> 8903 <d992> <d996> 19370 <d997> <d997> 9390 <d998> <d998> 8881 <d999> <d99a> 19375 <d99b> <d99b> 8806 <d99c> <d99c> 19377 <d99d> <d99d> 8795 <d99e> <d99e> 8900 <d99f> <d99f> 19378 <d9a0> <d9a0> 8469 <d9a1> <d9fe> 4789 <da40> <da40> 19379 <da41> <da41> 8746 <da42> <da42> 9393 <da43> <da47> 19380 <da48> <da48> 8509 <da49> <da4c> 19385 <da4d> <da4d> 7957 <da4e> <da4e> 8796 <da4f> <da72> 19389 <da73> <da73> 7956 <da74> <da76> 19425 <da77> <da77> 8826 <da78> <da7e> 19428 <da80> <da84> 19435 <da85> <da85> 8430 <da86> <da8d> 19440 <da8e> <da8e> 9720 <da8f> <daa0> 19448 <daa1> <dafe> 4883 <db40> <db5f> 19466 <db60> <db60> 8084 <db61> <db77> 19498 <db78> <db78> 8752 <db79> <db7e> 19521 <db80> <db83> 19527 <db84> <db84> 9725 <db85> <db8a> 19531 <db8b> <db8b> 9728 <db8c> <db97> 19537 <db98> <db98> 9734 <db99> <dba0> 19549 <dba1> <dbfe> 4977 <dc40> <dc44> 19557 <dc45> <dc45> 9727 <dc46> <dc4e> 19562 <dc4f> <dc4f> 9724 <dc50> <dc50> 7820 <dc51> <dc51> 9730 <dc52> <dc52> 19571 <dc53> <dc53> 8781 <dc54> <dc54> 19572 <dc55> <dc55> 9732 <dc56> <dc56> 9726 <dc57> <dc57> 9731 <dc58> <dc5c> 19573 <dc5d> <dc5d> 9729 <dc5e> <dc61> 19578 <dc62> <dc62> 9733 <dc63> <dc65> 19582 <dc66> <dc66> 7843 <dc67> <dc67> 9736 <dc68> <dc6a> 19585 <dc6b> <dc6b> 9735 <dc6c> <dc7b> 19588 <dc7c> <dc7c> 8432 <dc7d> <dc7e> 19604 <dc80> <dc86> 19606 <dc87> <dc87> 7803 <dc88> <dc88> 8807 <dc89> <dc89> 7990 <dc8a> <dc8a> 8150 <dc8b> <dc8d> 19613 <dc8e> <dc8e> 8672 <dc8f> <dc8f> 19616 <dc90> <dc90> 9356 <dc91> <dc96> 19617 <dc97> <dc97> 9357 <dc98> <dc9a> 19623 <dc9b> <dc9b> 8450 <dc9c> <dc9f> 19626 endcidrange 100 begincidrange <dca0> <dca0> 9364 <dca1> <dcfe> 5071 <dd40> <dd45> 19630 <dd46> <dd46> 9363 <dd47> <dd4c> 19636 <dd4d> <dd4d> 9358 <dd4e> <dd52> 19642 <dd53> <dd53> 8857 <dd54> <dd54> 9361 <dd55> <dd55> 9366 <dd56> <dd56> 9359 <dd57> <dd57> 9362 <dd58> <dd58> 19647 <dd59> <dd59> 9367 <dd5a> <dd5d> 19648 <dd5e> <dd5e> 8113 <dd5f> <dd5f> 19652 <dd60> <dd60> 9370 <dd61> <dd61> 19653 <dd62> <dd62> 9369 <dd63> <dd63> 19654 <dd64> <dd64> 8792 <dd65> <dd65> 9368 <dd66> <dd6c> 19655 <dd6d> <dd6d> 9371 <dd6e> <dd6e> 19662 <dd6f> <dd6f> 7945 <dd70> <dd70> 8422 <dd71> <dd75> 19663 <dd76> <dd76> 8230 <dd77> <dd77> 9375 <dd78> <dd78> 8025 <dd79> <dd7a> 9373 <dd7b> <dd7e> 19668 <dd80> <dd80> 19672 <dd81> <dd81> 7995 <dd82> <dd82> 9372 <dd83> <dd84> 19673 <dd85> <dd85> 7738 <dd86> <dd86> 8283 <dd87> <dd8a> 19675 <dd8b> <dd8b> 8048 <dd8c> <dd8e> 19679 <dd8f> <dd8f> 9376 <dd90> <dd93> 19682 <dd94> <dd94> 8507 <dd95> <dd96> 19686 <dd97> <dd97> 7943 <dd98> <dd99> 19688 <dd9a> <dd9a> 8816 <dd9b> <dd9b> 8759 <dd9c> <dd9d> 19690 <dd9e> <dd9e> 9426 <dd9f> <dd9f> 19692 <dda0> <dda0> 8627 <dda1> <ddfe> 5165 <de40> <de40> 8773 <de41> <de41> 9377 <de42> <de43> 19693 <de44> <de44> 8872 <de45> <de47> 19695 <de48> <de48> 8828 <de49> <de49> 8112 <de4a> <de4e> 19698 <de4f> <de4f> 9378 <de50> <de59> 19703 <de5a> <de5a> 8006 <de5b> <de5b> 19713 <de5c> <de5c> 9088 <de5d> <de5d> 9365 <de5e> <de5e> 19714 <de5f> <de5f> 9360 <de60> <de6a> 19715 <de6b> <de6b> 7728 <de6c> <de6e> 19726 <de6f> <de6f> 7837 <de70> <de70> 7755 <de71> <de71> 7754 <de72> <de72> 8362 <de73> <de7e> 19729 <de80> <de91> 19741 <de92> <de92> 9851 <de93> <de9e> 19759 <de9f> <de9f> 9202 <dea0> <dea0> 19771 <dea1> <defe> 5259 <df40> <df40> 8830 <df41> <df41> 19772 <df42> <df42> 8217 <df43> <df4c> 19773 <df4d> <df4d> 8123 <df4e> <df5b> 19783 <df5c> <df5c> 8787 <df5d> <df5d> 19797 <df5e> <df5e> 7998 <df5f> <df5f> 7846 <df60> <df60> 8590 <df61> <df63> 19798 <df64> <df64> 8684 <df65> <df65> 19801 endcidrange 100 begincidrange <df66> <df66> 7870 <df67> <df67> 19802 <df68> <df68> 8778 <df69> <df6c> 19803 <df6d> <df6d> 8499 <df6e> <df73> 19807 <df74> <df74> 7812 <df75> <df76> 19813 <df77> <df77> 8399 <df78> <df78> 8674 <df79> <df79> 19815 <df7a> <df7a> 8719 <df7b> <df7b> 19816 <df7c> <df7c> 8233 <df7d> <df7d> 19817 <df7e> <df7e> 8307 <df80> <df80> 8021 <df81> <df82> 19818 <df83> <df83> 9201 <df84> <df84> 19820 <df85> <df85> 7750 <df86> <df88> 19821 <df89> <df89> 8291 <df8a> <df8a> 9203 <df8b> <dfa0> 19824 <dfa1> <dffe> 5353 <e040> <e04f> 19846 <e050> <e050> 8990 <e051> <e05c> 19862 <e05d> <e05d> 8755 <e05e> <e068> 19874 <e069> <e069> 8992 <e06a> <e06b> 19885 <e06c> <e06c> 8647 <e06d> <e074> 19887 <e075> <e075> 8892 <e076> <e076> 19895 <e077> <e077> 8988 <e078> <e078> 19896 <e079> <e079> 8785 <e07a> <e07e> 19897 <e080> <e086> 19902 <e087> <e087> 7867 <e088> <e08c> 19909 <e08d> <e08d> 8839 <e08e> <e08e> 19914 <e08f> <e08f> 8237 <e090> <e090> 7851 <e091> <e091> 19915 <e092> <e092> 8989 <e093> <e093> 19916 <e094> <e094> 8991 <e095> <e096> 19917 <e097> <e097> 8987 <e098> <e0a0> 19919 <e0a1> <e0fe> 5447 <e140> <e141> 19928 <e142> <e142> 8993 <e143> <e163> 19930 <e164> <e164> 8789 <e165> <e167> 19963 <e168> <e168> 7823 <e169> <e173> 19966 <e174> <e174> 8716 <e175> <e175> 8100 <e176> <e17e> 19977 <e180> <e183> 19986 <e184> <e184> 8347 <e185> <e185> 8664 <e186> <e186> 19990 <e187> <e187> 9722 <e188> <e188> 19991 <e189> <e189> 9721 <e18a> <e18b> 19992 <e18c> <e18c> 8500 <e18d> <e18d> 19994 <e18e> <e190> 9459 <e191> <e191> 9464 <e192> <e192> 19995 <e193> <e193> 9463 <e194> <e194> 7880 <e195> <e195> 9462 <e196> <e197> 19996 <e198> <e198> 8832 <e199> <e19d> 19998 <e19e> <e19e> 7877 <e19f> <e19f> 9467 <e1a0> <e1a0> 20003 <e1a1> <e1fe> 5541 <e240> <e240> 20004 <e241> <e241> 9466 <e242> <e242> 20005 <e243> <e243> 7917 <e244> <e24e> 20006 <e24f> <e24f> 9469 <e250> <e250> 20017 <e251> <e251> 9465 <e252> <e252> 20018 <e253> <e253> 9470 <e254> <e254> 8397 endcidrange 100 begincidrange <e255> <e259> 20019 <e25a> <e25a> 9480 <e25b> <e25b> 9476 <e25c> <e25d> 20024 <e25e> <e25e> 9478 <e25f> <e261> 20026 <e262> <e262> 9471 <e263> <e263> 8336 <e264> <e266> 20029 <e267> <e267> 7901 <e268> <e268> 7973 <e269> <e269> 20032 <e26a> <e26a> 9475 <e26b> <e26b> 9474 <e26c> <e26d> 20033 <e26e> <e26e> 7802 <e26f> <e26f> 8358 <e270> <e277> 20035 <e278> <e278> 8149 <e279> <e27c> 20043 <e27d> <e27d> 7953 <e27e> <e27e> 20047 <e280> <e280> 9479 <e281> <e281> 9472 <e282> <e282> 9477 <e283> <e288> 20048 <e289> <e289> 9497 <e28a> <e28a> 20054 <e28b> <e28b> 9493 <e28c> <e28d> 20055 <e28e> <e28e> 9484 <e28f> <e28f> 8241 <e290> <e291> 20057 <e292> <e292> 9483 <e293> <e293> 9487 <e294> <e294> 9498 <e295> <e295> 9481 <e296> <e297> 20059 <e298> <e298> 9486 <e299> <e299> 8756 <e29a> <e29a> 9491 <e29b> <e29b> 8064 <e29c> <e29f> 20061 <e2a0> <e2a0> 9473 <e2a1> <e2fe> 5635 <e340> <e341> 20065 <e342> <e342> 9495 <e343> <e343> 9494 <e344> <e346> 20067 <e347> <e347> 9496 <e348> <e34a> 20070 <e34b> <e34b> 7766 <e34c> <e34e> 20073 <e34f> <e34f> 9485 <e350> <e350> 20076 <e351> <e351> 8403 <e352> <e353> 20077 <e354> <e354> 8314 <e355> <e355> 8398 <e356> <e357> 20079 <e358> <e358> 9488 <e359> <e35b> 20081 <e35c> <e35c> 7765 <e35d> <e35f> 20084 <e360> <e360> 9482 <e361> <e365> 20087 <e366> <e367> 9489 <e368> <e370> 20092 <e371> <e371> 8106 <e372> <e372> 20101 <e373> <e373> 9502 <e374> <e374> 7967 <e375> <e377> 20102 <e378> <e378> 9517 <e379> <e379> 8733 <e37a> <e37b> 20105 <e37c> <e37c> 9522 <e37d> <e37d> 20107 <e37e> <e37e> 8571 <e380> <e389> 20108 <e38a> <e38a> 8623 <e38b> <e38b> 20118 <e38c> <e38c> 9516 <e38d> <e38e> 20119 <e38f> <e38f> 9512 <e390> <e390> 20121 <e391> <e391> 8332 <e392> <e392> 20122 <e393> <e393> 9519 <e394> <e394> 20123 <e395> <e395> 8636 <e396> <e398> 20124 <e399> <e399> 9501 <e39a> <e39b> 20127 <e39c> <e39c> 9525 <e39d> <e39d> 20129 <e39e> <e39e> 8717 <e39f> <e39f> 9510 <e3a0> <e3a0> 20130 <e3a1> <e3fe> 5729 endcidrange 100 begincidrange <e440> <e440> 9524 <e441> <e441> 9514 <e442> <e442> 9503 <e443> <e443> 9521 <e444> <e444> 9500 <e445> <e447> 20131 <e448> <e448> 9509 <e449> <e44d> 20134 <e44e> <e44e> 8653 <e44f> <e44f> 20139 <e450> <e450> 8666 <e451> <e451> 20140 <e452> <e452> 8562 <e453> <e453> 9534 <e454> <e457> 20141 <e458> <e458> 8271 <e459> <e459> 20145 <e45a> <e45a> 9539 <e45b> <e45b> 20146 <e45c> <e45c> 8663 <e45d> <e45d> 20147 <e45e> <e45e> 7740 <e45f> <e461> 20148 <e462> <e462> 9513 <e463> <e464> 20151 <e465> <e465> 9505 <e466> <e467> 20153 <e468> <e468> 7935 <e469> <e472> 20155 <e473> <e473> 9535 <e474> <e474> 20165 <e475> <e475> 9540 <e476> <e478> 20166 <e479> <e479> 9507 <e47a> <e47a> 7824 <e47b> <e47b> 9530 <e47c> <e47c> 9541 <e47d> <e47d> 20169 <e47e> <e47e> 9533 <e480> <e480> 20170 <e481> <e481> 8385 <e482> <e483> 20171 <e484> <e484> 8451 <e485> <e485> 9504 <e486> <e486> 9532 <e487> <e487> 9531 <e488> <e488> 9528 <e489> <e48c> 20173 <e48d> <e48d> 9536 <e48e> <e48e> 20177 <e48f> <e48f> 8141 <e490> <e492> 20178 <e493> <e493> 7960 <e494> <e497> 20181 <e498> <e498> 9547 <e499> <e49c> 20185 <e49d> <e49d> 9543 <e49e> <e49f> 9551 <e4a0> <e4a0> 20189 <e4a1> <e4fe> 5823 <e540> <e545> 20190 <e546> <e546> 8880 <e547> <e547> 20196 <e548> <e548> 9542 <e549> <e54a> 20197 <e54b> <e54b> 9548 <e54c> <e54d> 20199 <e54e> <e54e> 7834 <e54f> <e54f> 9554 <e550> <e550> 9520 <e551> <e551> 9545 <e552> <e554> 20201 <e555> <e555> 9553 <e556> <e556> 7882 <e557> <e557> 20204 <e558> <e558> 8402 <e559> <e55b> 20205 <e55c> <e55c> 8120 <e55d> <e55d> 20208 <e55e> <e55e> 8313 <e55f> <e560> 20209 <e561> <e561> 8619 <e562> <e563> 20211 <e564> <e564> 9549 <e565> <e565> 7845 <e566> <e567> 20213 <e568> <e568> 8268 <e569> <e569> 8320 <e56a> <e56b> 20215 <e56c> <e56c> 9837 <e56d> <e56d> 20217 <e56e> <e56e> 9527 <e56f> <e574> 20218 <e575> <e575> 9546 <e576> <e576> 8632 <e577> <e577> 20224 <e578> <e578> 9550 <e579> <e57a> 20225 <e57b> <e57b> 9468 <e57c> <e57c> 9556 endcidrange 100 begincidrange <e57d> <e57e> 20227 <e580> <e580> 20229 <e581> <e581> 7996 <e582> <e582> 20230 <e583> <e583> 7893 <e584> <e589> 20231 <e58a> <e58a> 9558 <e58b> <e58d> 20237 <e58e> <e58e> 8808 <e58f> <e590> 20240 <e591> <e591> 7894 <e592> <e599> 20242 <e59a> <e59a> 9559 <e59b> <e59b> 9555 <e59c> <e59e> 20250 <e59f> <e59f> 9544 <e5a0> <e5a0> 20253 <e5a1> <e5fe> 5917 <e640> <e640> 8412 <e641> <e643> 20254 <e644> <e644> 9561 <e645> <e648> 20257 <e649> <e649> 8087 <e64a> <e64a> 9557 <e64b> <e64d> 20261 <e64e> <e64e> 8829 <e64f> <e651> 20264 <e652> <e652> 9598 <e653> <e655> 20267 <e656> <e656> 8316 <e657> <e657> 20270 <e658> <e658> 9562 <e659> <e65a> 20271 <e65b> <e65b> 9566 <e65c> <e65d> 20273 <e65e> <e65e> 7732 <e65f> <e668> 20275 <e669> <e669> 8542 <e66a> <e66a> 20285 <e66b> <e66b> 9568 <e66c> <e674> 20286 <e675> <e675> 8610 <e676> <e676> 9044 <e677> <e678> 20295 <e679> <e679> 9571 <e67a> <e67a> 9511 <e67b> <e67b> 20297 <e67c> <e67c> 9518 <e67d> <e67d> 9560 <e67e> <e67e> 20298 <e680> <e680> 7963 <e681> <e681> 20299 <e682> <e682> 8835 <e683> <e683> 20300 <e684> <e684> 9572 <e685> <e686> 20301 <e687> <e687> 8352 <e688> <e688> 20303 <e689> <e689> 9573 <e68a> <e68b> 20304 <e68c> <e68c> 9569 <e68d> <e692> 20306 <e693> <e693> 9570 <e694> <e696> 20312 <e697> <e697> 9580 <e698> <e69a> 20315 <e69b> <e69b> 9581 <e69c> <e69c> 8224 <e69d> <e69e> 20318 <e69f> <e69f> 9567 <e6a0> <e6a0> 9578 <e6a1> <e6fe> 6011 <e740> <e742> 20320 <e743> <e743> 9582 <e744> <e747> 20323 <e748> <e748> 9529 <e749> <e749> 9564 <e74a> <e74c> 20327 <e74d> <e74e> 9576 <e74f> <e74f> 9579 <e750> <e750> 7791 <e751> <e751> 20330 <e752> <e752> 8132 <e753> <e753> 9575 <e754> <e754> 20331 <e755> <e755> 9563 <e756> <e758> 20332 <e759> <e759> 9757 <e75a> <e765> 20335 <e766> <e766> 9515 <e767> <e767> 20347 <e768> <e768> 9585 <e769> <e769> 20348 <e76a> <e76a> 9591 <e76b> <e773> 20349 <e774> <e774> 9506 <e775> <e77b> 20358 <e77c> <e77c> 9523 <e77d> <e77e> 20365 <e780> <e781> 20367 endcidrange 100 begincidrange <e782> <e782> 8234 <e783> <e783> 20369 <e784> <e784> 9526 <e785> <e785> 9587 <e786> <e786> 9583 <e787> <e789> 20370 <e78a> <e78a> 8851 <e78b> <e78b> 9592 <e78c> <e78e> 20373 <e78f> <e78f> 9584 <e790> <e791> 20376 <e792> <e792> 9589 <e793> <e797> 20378 <e798> <e799> 9537 <e79a> <e79a> 9565 <e79b> <e79f> 20383 <e7a0> <e7a0> 8218 <e7a1> <e7fe> 6105 <e840> <e842> 20388 <e843> <e843> 9594 <e844> <e844> 8198 <e845> <e845> 20391 <e846> <e846> 8567 <e847> <e848> 20392 <e849> <e849> 9499 <e84a> <e84a> 20394 <e84b> <e84b> 9508 <e84c> <e84e> 20395 <e84f> <e84f> 9595 <e850> <e853> 20398 <e854> <e854> 8867 <e855> <e859> 20402 <e85a> <e85a> 9593 <e85b> <e85b> 20407 <e85c> <e85c> 9574 <e85d> <e861> 20408 <e862> <e862> 8083 <e863> <e863> 20413 <e864> <e864> 9596 <e865> <e86f> 20414 <e870> <e870> 9492 <e871> <e872> 20425 <e873> <e873> 9597 <e874> <e874> 20427 <e875> <e875> 9586 <e876> <e87b> 20428 <e87c> <e87c> 9588 <e87d> <e87e> 20434 <e880> <e880> 8782 <e881> <e881> 20436 <e882> <e882> 8646 <e883> <e886> 20437 <e887> <e887> 8351 <e888> <e888> 20441 <e889> <e889> 9590 <e88a> <e88b> 20442 <e88c> <e88c> 8292 <e88d> <e88d> 8895 <e88e> <e88e> 9756 <e88f> <e88f> 8798 <e890> <e8a0> 20444 <e8a1> <e8fe> 6199 <e940> <e94b> 20461 <e94c> <e94c> 7797 <e94d> <e953> 20473 <e954> <e954> 8317 <e955> <e955> 20480 <e956> <e956> 9151 <e957> <e957> 8467 <e958> <e959> 20481 <e95a> <e95a> 9152 <e95b> <e95c> 20483 <e95d> <e95d> 7749 <e95e> <e95e> 20485 <e95f> <e95f> 8152 <e960> <e960> 9156 <e961> <e961> 20486 <e962> <e962> 9154 <e963> <e963> 8452 <e964> <e964> 20487 <e965> <e965> 8637 <e966> <e966> 20488 <e967> <e967> 8071 <e968> <e968> 9155 <e969> <e96b> 20489 <e96c> <e96c> 8809 <e96d> <e974> 20492 <e975> <e975> 8003 <e976> <e976> 20500 <e977> <e977> 7966 <e978> <e978> 9849 <e979> <e979> 7915 <e97a> <e97b> 20501 <e97c> <e97c> 7989 <e97d> <e97d> 8330 <e97e> <e97e> 20503 <e980> <e980> 9159 <e981> <e981> 9161 <e982> <e982> 9158 <e983> <e986> 20504 endcidrange 100 begincidrange <e987> <e987> 8783 <e988> <e98a> 20508 <e98b> <e98b> 9163 <e98c> <e98d> 20511 <e98e> <e98e> 8691 <e98f> <e98f> 20513 <e990> <e990> 8695 <e991> <e991> 9167 <e992> <e992> 9166 <e993> <e993> 9162 <e994> <e994> 9165 <e995> <e997> 20514 <e998> <e998> 9168 <e999> <e99a> 20517 <e99b> <e99b> 9836 <e99c> <e99c> 20519 <e99d> <e99d> 9153 <e99e> <e99e> 20520 <e99f> <e99f> 8174 <e9a0> <e9a0> 9169 <e9a1> <e9fe> 6293 <ea40> <ea40> 8184 <ea41> <ea43> 20521 <ea44> <ea44> 9171 <ea45> <ea47> 20524 <ea48> <ea48> 9170 <ea49> <ea49> 9172 <ea4a> <ea4a> 7832 <ea4b> <ea4f> 20527 <ea50> <ea50> 7980 <ea51> <ea51> 20532 <ea52> <ea52> 9173 <ea53> <ea54> 20533 <ea55> <ea55> 7793 <ea56> <ea56> 9873 <ea57> <ea58> 20535 <ea59> <ea59> 9157 <ea5a> <ea7e> 20537 <ea80> <ea80> 8986 <ea81> <ea83> 20574 <ea84> <ea84> 8468 <ea85> <ea86> 20577 <ea87> <ea87> 8836 <ea88> <ea8d> 20579 <ea8e> <ea8e> 8732 <ea8f> <ea8f> 20585 <ea90> <ea90> 7806 <ea91> <ea91> 8269 <ea92> <ea95> 20586 <ea96> <ea96> 8705 <ea97> <ea9f> 20590 <eaa0> <eaa0> 7897 <eaa1> <eafe> 6387 <eb40> <eb40> 20599 <eb41> <eb41> 8114 <eb42> <eb44> 20600 <eb45> <eb45> 8786 <eb46> <eb47> 20603 <eb48> <eb48> 8057 <eb49> <eb52> 20605 <eb53> <eb53> 8535 <eb54> <eb54> 20615 <eb55> <eb55> 8639 <eb56> <eb5a> 20616 <eb5b> <eb5b> 8735 <eb5c> <eb5c> 20621 <eb5d> <eb5d> 8253 <eb5e> <eb5f> 20622 <eb60> <eb60> 8213 <eb61> <eb61> 20624 <eb62> <eb62> 9893 <eb63> <eb6c> 20625 <eb6d> <eb6d> 8534 <eb6e> <eb6f> 20635 <eb70> <eb70> 8516 <eb71> <eb71> 20637 <eb72> <eb72> 7825 <eb73> <eb73> 8791 <eb74> <eb77> 20638 <eb78> <eb78> 8202 <eb79> <eb79> 8338 <eb7a> <eb7e> 20642 <eb80> <eb84> 20647 <eb85> <eb85> 8784 <eb86> <eb89> 20652 <eb8a> <eb8a> 7875 <eb8b> <eba0> 20656 <eba1> <ebfe> 6481 <ec40> <ec45> 20678 <ec46> <ec46> 8616 <ec47> <ec55> 20684 <ec56> <ec56> 9741 <ec57> <ec59> 20699 <ec5a> <ec5a> 9740 <ec5b> <ec5b> 20702 <ec5c> <ec5c> 9742 <ec5d> <ec5f> 20703 <ec60> <ec60> 8242 <ec61> <ec6d> 20706 <ec6e> <ec6e> 9739 endcidrange 100 begincidrange <ec6f> <ec75> 20719 <ec76> <ec76> 8899 <ec77> <ec7e> 20726 <ec80> <ec95> 20734 <ec96> <ec96> 7971 <ec97> <eca0> 20756 <eca1> <ecfe> 6575 <ed40> <ed45> 20766 <ed46> <ed46> 9877 <ed47> <ed57> 20772 <ed58> <ed58> 9822 <ed59> <ed5d> 20789 <ed5e> <ed5e> 9821 <ed5f> <ed60> 20794 <ed61> <ed61> 9874 <ed62> <ed63> 20796 <ed64> <ed64> 9823 <ed65> <ed65> 20798 <ed66> <ed66> 8589 <ed67> <ed67> 8445 <ed68> <ed6d> 20799 <ed6e> <ed6e> 8000 <ed6f> <ed73> 20805 <ed74> <ed74> 9317 <ed75> <ed76> 20810 <ed77> <ed77> 9319 <ed78> <ed78> 20812 <ed79> <ed79> 9318 <ed7a> <ed7e> 20813 <ed80> <ed90> 20818 <ed91> <ed91> 8649 <ed92> <ed92> 20835 <ed93> <ed93> 8713 <ed94> <ed94> 7881 <ed95> <ed95> 8425 <ed96> <ed96> 20836 <ed97> <ed97> 8650 <ed98> <ed98> 8518 <ed99> <ed99> 9669 <ed9a> <ed9a> 8668 <ed9b> <ed9b> 20837 <ed9c> <ed9c> 9310 <ed9d> <ed9d> 20838 <ed9e> <ed9e> 8527 <ed9f> <ed9f> 20839 <eda0> <eda0> 9670 <eda1> <edfe> 6669 <ee40> <ee40> 9671 <ee41> <ee41> 8769 <ee42> <ee42> 8586 <ee43> <ee43> 7727 <ee44> <ee44> 7900 <ee45> <ee47> 20840 <ee48> <ee48> 8383 <ee49> <ee49> 8244 <ee4a> <ee4c> 20843 <ee4d> <ee4d> 9673 <ee4e> <ee51> 20846 <ee52> <ee52> 9672 <ee53> <ee54> 20850 <ee55> <ee55> 8718 <ee56> <ee56> 20852 <ee57> <ee57> 9675 <ee58> <ee5d> 20853 <ee5e> <ee5e> 8573 <ee5f> <ee60> 20859 <ee61> <ee61> 8062 <ee62> <ee67> 20861 <ee68> <ee68> 9676 <ee69> <ee69> 8131 <ee6a> <ee6b> 20867 <ee6c> <ee6c> 8377 <ee6d> <ee6d> 20869 <ee6e> <ee6e> 8577 <ee6f> <ee76> 20870 <ee77> <ee77> 8154 <ee78> <ee7c> 20878 <ee7d> <ee7d> 8563 <ee7e> <ee7e> 7905 <ee80> <ee80> 9677 <ee81> <ee84> 20883 <ee85> <ee85> 9678 <ee86> <ee86> 8694 <ee87> <ee89> 20887 <ee8a> <ee8a> 8779 <ee8b> <ee8b> 9681 <ee8c> <ee8c> 20890 <ee8d> <ee8d> 7872 <ee8e> <ee8f> 20891 <ee90> <ee90> 8200 <ee91> <ee93> 20893 <ee94> <ee94> 9680 <ee95> <ee96> 20896 <ee97> <ee97> 9682 <ee98> <ee98> 20898 <ee99> <ee99> 7978 <ee9a> <ee9c> 20899 <ee9d> <ee9d> 7794 <ee9e> <ee9e> 9683 <ee9f> <eea0> 20902 endcidrange 100 begincidrange <eea1> <eefe> 6763 <ef40> <ef40> 8638 <ef41> <ef41> 9684 <ef42> <ef42> 8260 <ef43> <ef43> 20904 <ef44> <ef44> 9679 <ef45> <ef45> 8435 <ef46> <ef4b> 20905 <ef4c> <ef4c> 7936 <ef4d> <ef51> 20911 <ef52> <ef53> 9420 <ef54> <ef54> 20916 <ef55> <ef55> 9880 <ef56> <ef56> 20917 <ef57> <ef57> 9848 <ef58> <ef59> 20918 <ef5a> <ef5a> 9422 <ef5b> <ef5f> 20920 <ef60> <ef60> 9423 <ef61> <ef67> 20925 <ef68> <ef68> 8376 <ef69> <ef69> 20932 <ef6a> <ef6a> 9424 <ef6b> <ef6b> 20933 <ef6c> <ef6c> 9425 <ef6d> <ef76> 20934 <ef77> <ef77> 7924 <ef78> <ef79> 20944 <ef7a> <ef7a> 9115 <ef7b> <ef7b> 20946 <ef7c> <ef7c> 9854 <ef7d> <ef7e> 20947 <ef80> <ef81> 20949 <ef82> <ef82> 9117 <ef83> <ef84> 9119 <ef85> <ef85> 20951 <ef86> <ef86> 9121 <ef87> <ef87> 20952 <ef88> <ef88> 7921 <ef89> <ef8a> 20953 <ef8b> <ef8b> 8734 <ef8c> <ef8c> 20955 <ef8d> <ef8d> 9122 <ef8e> <ef94> 20956 <ef95> <ef95> 8523 <ef96> <ef96> 7734 <ef97> <ef97> 8501 <ef98> <ef9b> 20963 <ef9c> <ef9c> 8109 <ef9d> <ef9d> 20967 <ef9e> <ef9e> 7763 <ef9f> <efa0> 20968 <efa1> <effe> 6857 <f040> <f040> 20970 <f041> <f041> 9123 <f042> <f042> 8707 <f043> <f043> 20971 <f044> <f044> 7911 <f045> <f046> 20972 <f047> <f047> 9124 <f048> <f048> 8343 <f049> <f049> 7908 <f04a> <f04d> 20974 <f04e> <f04e> 8760 <f04f> <f050> 20978 <f051> <f051> 9125 <f052> <f053> 20980 <f054> <f054> 8090 <f055> <f056> 20982 <f057> <f057> 8643 <f058> <f05d> 20984 <f05e> <f05e> 7982 <f05f> <f067> 20990 <f068> <f068> 9116 <f069> <f06b> 20999 <f06c> <f06c> 9126 <f06d> <f070> 21002 <f071> <f071> 9118 <f072> <f072> 21006 <f073> <f073> 8245 <f074> <f074> 9127 <f075> <f077> 21007 <f078> <f078> 9128 <f079> <f079> 21010 <f07a> <f07a> 8309 <f07b> <f07c> 21011 <f07d> <f07e> 9129 <f080> <f080> 9131 <f081> <f081> 8171 <f082> <f082> 9132 <f083> <f086> 21013 <f087> <f087> 8042 <f088> <f088> 8441 <f089> <f08a> 21017 <f08b> <f08b> 9830 <f08c> <f08f> 21019 <f090> <f090> 9831 <f091> <f091> 21023 <f092> <f092> 7788 <f093> <f095> 21024 endcidrange 100 begincidrange <f096> <f096> 9133 <f097> <f0a0> 21027 <f0a1> <f0fe> 6951 <f140> <f151> 21037 <f152> <f152> 8301 <f153> <f153> 8770 <f154> <f154> 7938 <f155> <f156> 21055 <f157> <f157> 8579 <f158> <f158> 21057 <f159> <f159> 7813 <f15a> <f15a> 8681 <f15b> <f166> 21058 <f167> <f167> 7767 <f168> <f175> 21070 <f176> <f176> 8869 <f177> <f177> 9223 <f178> <f178> 8138 <f179> <f179> 21084 <f17a> <f17a> 9218 <f17b> <f17b> 8066 <f17c> <f17d> 21085 <f17e> <f17e> 9224 <f180> <f180> 9220 <f181> <f181> 21087 <f182> <f182> 8497 <f183> <f183> 21088 <f184> <f184> 8580 <f185> <f185> 21089 <f186> <f186> 9219 <f187> <f187> 21090 <f188> <f188> 8302 <f189> <f189> 9227 <f18a> <f193> 21091 <f194> <f194> 7999 <f195> <f197> 21101 <f198> <f198> 8295 <f199> <f1a0> 21104 <f1a1> <f1fe> 7045 <f240> <f244> 21112 <f245> <f245> 8151 <f246> <f246> 21117 <f247> <f247> 7811 <f248> <f24a> 21118 <f24b> <f24b> 9231 <f24c> <f252> 21121 <f253> <f253> 9230 <f254> <f254> 8391 <f255> <f255> 9229 <f256> <f25b> 21128 <f25c> <f25c> 9234 <f25d> <f25e> 21134 <f25f> <f25f> 8375 <f260> <f270> 21136 <f271> <f271> 9200 <f272> <f272> 21153 <f273> <f273> 9233 <f274> <f274> 9236 <f275> <f275> 21154 <f276> <f276> 8560 <f277> <f27b> 21155 <f27c> <f27c> 9221 <f27d> <f27d> 8460 <f27e> <f27e> 9237 <f280> <f284> 21160 <f285> <f285> 8294 <f286> <f286> 21165 <f287> <f287> 9042 <f288> <f288> 9235 <f289> <f289> 9232 <f28a> <f28b> 9238 <f28c> <f28c> 8433 <f28d> <f290> 21166 <f291> <f291> 9226 <f292> <f293> 21170 <f294> <f294> 9225 <f295> <f295> 21172 <f296> <f296> 9240 <f297> <f29b> 21173 <f29c> <f29c> 8103 <f29d> <f29d> 21178 <f29e> <f29e> 8700 <f29f> <f2a0> 21179 <f2a1> <f2fe> 7139 <f340> <f340> 8129 <f341> <f341> 9222 <f342> <f344> 21181 <f345> <f345> 8860 <f346> <f347> 21184 <f348> <f348> 8270 <f349> <f349> 21186 <f34a> <f34a> 9242 <f34b> <f34b> 9241 <f34c> <f34f> 21187 <f350> <f350> 9228 <f351> <f360> 21191 <f361> <f361> 7721 <f362> <f373> 21207 <f374> <f374> 9825 <f375> <f375> 21225 endcidrange 100 begincidrange <f376> <f376> 9892 <f377> <f377> 8564 <f378> <f378> 9827 <f379> <f379> 9826 <f37a> <f37e> 21226 <f380> <f38b> 21231 <f38c> <f38c> 9845 <f38d> <f39f> 21243 <f3a0> <f3a0> 8524 <f3a1> <f3fe> 7233 <f440> <f444> 21262 <f445> <f445> 9850 <f446> <f44f> 21267 <f450> <f450> 9888 <f451> <f456> 21277 <f457> <f457> 9832 <f458> <f458> 21283 <f459> <f459> 7888 <f45a> <f45a> 21284 <f45b> <f45b> 8342 <f45c> <f45c> 21285 <f45d> <f45d> 9164 <f45e> <f461> 21286 <f462> <f462> 9160 <f463> <f463> 21290 <f464> <f464> 8766 <f465> <f474> 21291 <f475> <f475> 9829 <f476> <f47b> 21307 <f47c> <f47c> 9828 <f47d> <f47d> 21313 <f47e> <f47e> 8761 <f480> <f493> 21314 <f494> <f494> 8266 <f495> <f498> 21334 <f499> <f499> 9759 <f49a> <f49b> 21338 <f49c> <f49c> 9758 <f49d> <f4a0> 21340 <f4a1> <f4fe> 7327 <f540> <f544> 21344 <f545> <f545> 9760 <f546> <f546> 21349 <f547> <f547> 9761 <f548> <f551> 21350 <f552> <f552> 9762 <f553> <f553> 21360 <f554> <f554> 9767 <f555> <f555> 7737 <f556> <f556> 9765 <f557> <f55d> 21361 <f55e> <f55e> 9769 <f55f> <f560> 21368 <f561> <f561> 9774 <f562> <f562> 9771 <f563> <f56d> 21370 <f56e> <f56e> 9770 <f56f> <f56f> 9773 <f570> <f570> 21381 <f571> <f571> 9768 <f572> <f572> 8633 <f573> <f57e> 21382 <f580> <f584> 21394 <f585> <f585> 9782 <f586> <f586> 9776 <f587> <f58b> 21399 <f58c> <f58c> 9784 <f58d> <f58d> 21404 <f58e> <f58e> 8205 <f58f> <f58f> 9783 <f590> <f598> 21405 <f599> <f599> 9797 <f59a> <f59a> 21414 <f59b> <f59b> 9786 <f59c> <f59f> 21415 <f5a0> <f5a0> 9795 <f5a1> <f5fe> 7421 <f640> <f640> 21419 <f641> <f641> 9792 <f642> <f644> 21420 <f645> <f645> 9789 <f646> <f646> 9793 <f647> <f647> 21423 <f648> <f648> 9790 <f649> <f64a> 21424 <f64b> <f64b> 9791 <f64c> <f64c> 8128 <f64d> <f64d> 21426 <f64e> <f64f> 9787 <f650> <f653> 21427 <f654> <f654> 9794 <f655> <f657> 21431 <f658> <f658> 9796 <f659> <f660> 21434 <f661> <f661> 9785 <f662> <f662> 21442 <f663> <f663> 9804 <f664> <f66b> 21443 <f66c> <f66c> 9799 <f66d> <f66d> 9803 endcidrange 100 begincidrange <f66e> <f670> 21451 <f671> <f671> 9801 <f672> <f673> 21454 <f674> <f674> 9800 <f675> <f675> 21456 <f676> <f676> 9802 <f677> <f677> 8456 <f678> <f67e> 21457 <f680> <f684> 21464 <f685> <f685> 9805 <f686> <f687> 21469 <f688> <f688> 9780 <f689> <f689> 21471 <f68a> <f68a> 9809 <f68b> <f68c> 21472 <f68d> <f68d> 9808 <f68e> <f68e> 9810 <f68f> <f691> 21474 <f692> <f692> 9807 <f693> <f695> 21477 <f696> <f696> 9778 <f697> <f697> 9806 <f698> <f698> 9811 <f699> <f699> 21480 <f69a> <f69a> 9815 <f69b> <f69b> 21481 <f69c> <f69c> 9781 <f69d> <f69d> 21482 <f69e> <f69e> 9779 <f69f> <f69f> 21483 <f6a0> <f6a0> 9814 <f6a1> <f6fe> 7515 <f740> <f741> 21484 <f742> <f742> 9812 <f743> <f748> 21486 <f749> <f749> 9816 <f74a> <f74b> 21492 <f74c> <f74c> 9813 <f74d> <f74d> 7757 <f74e> <f755> 21494 <f756> <f756> 9819 <f757> <f757> 21502 <f758> <f758> 9818 <f759> <f759> 21503 <f75a> <f75a> 9817 <f75b> <f75b> 8238 <f75c> <f75c> 9775 <f75d> <f760> 21504 <f761> <f761> 9798 <f762> <f762> 21508 <f763> <f763> 9766 <f764> <f76a> 21509 <f76b> <f76b> 9820 <f76c> <f770> 21516 <f771> <f771> 9772 <f772> <f77b> 21521 <f77c> <f77c> 9763 <f77d> <f77d> 21531 <f77e> <f77e> 9777 <f780> <f7a0> 21532 <f7a1> <f7fe> 7609 <f840> <f841> 21565 <f842> <f842> 8348 <f843> <f845> 21567 <f846> <f846> 9600 <f847> <f848> 21570 <f849> <f849> 8924 <f84a> <f84f> 21572 <f850> <f850> 7941 <f851> <f851> 8331 <f852> <f852> 21578 <f853> <f853> 9601 <f854> <f862> 21579 <f863> <f863> 9603 <f864> <f864> 9602 <f865> <f865> 21594 <f866> <f866> 8686 <f867> <f871> 21595 <f872> <f872> 8578 <f873> <f877> 21606 <f878> <f878> 8771 <f879> <f879> 21611 <f87a> <f87a> 9607 <f87b> <f87b> 21612 <f87c> <f87c> 9608 <f87d> <f87e> 21613 <f880> <f880> 21615 <f881> <f881> 9604 <f882> <f883> 21616 <f884> <f884> 8701 <f885> <f885> 21618 <f886> <f886> 8687 <f887> <f88c> 21619 <f88d> <f88d> 9610 <f88e> <f88e> 9612 <f88f> <f898> 21625 <f899> <f899> 8007 <f89a> <f89c> 21635 <f89d> <f89d> 7965 <f89e> <f89f> 21638 endcidrange 100 begincidrange <f8a0> <f8a0> 9613 <f940> <f94d> 21640 <f94e> <f94e> 8144 <f94f> <f94f> 9618 <f950> <f950> 9615 <f951> <f958> 21654 <f959> <f959> 9620 <f95a> <f95a> 7904 <f95b> <f95c> 21662 <f95d> <f95d> 9617 <f95e> <f95e> 9621 <f95f> <f966> 21664 <f967> <f967> 9623 <f968> <f968> 21672 <f969> <f969> 8374 <f96a> <f96b> 21673 <f96c> <f96c> 9624 <f96d> <f96e> 21675 <f96f> <f96f> 8438 <f970> <f97e> 21677 <f980> <f984> 21692 <f985> <f985> 9605 <f986> <f986> 21697 <f987> <f987> 9625 <f988> <f990> 21698 <f991> <f991> 9622 <f992> <f995> 21707 <f996> <f996> 9626 <f997> <f997> 21711 <f998> <f998> 9627 <f999> <f9a0> 21712 <fa40> <fa41> 21720 <fa42> <fa42> 9629 <fa43> <fa45> 21722 <fa46> <fa46> 9630 <fa47> <fa4b> 21725 <fa4c> <fa4c> 9036 <fa4d> <fa50> 21730 <fa51> <fa51> 8004 <fa52> <fa57> 21734 <fa58> <fa58> 9824 <fa59> <fa59> 9632 <fa5a> <fa5c> 21740 <fa5d> <fa5d> 9628 <fa5e> <fa5e> 21743 <fa5f> <fa5f> 9631 <fa60> <fa60> 21744 <fa61> <fa61> 8044 <fa62> <fa6f> 21745 <fa70> <fa70> 9634 <fa71> <fa73> 21759 <fa74> <fa74> 8366 <fa75> <fa75> 21762 <fa76> <fa76> 9611 <fa77> <fa77> 9635 <fa78> <fa7e> 21763 <fa80> <fa82> 21770 <fa83> <fa83> 9609 <fa84> <fa84> 9637 <fa85> <fa8c> 21773 <fa8d> <fa8d> 9636 <fa8e> <fa8f> 21781 <fa90> <fa90> 9638 <fa91> <fa91> 9619 <fa92> <fa95> 21783 <fa96> <fa96> 9639 <fa97> <fa97> 8738 <fa98> <fa98> 9641 <fa99> <faa0> 21787 <fb40> <fb48> 21795 <fb49> <fb49> 9640 <fb4a> <fb51> 21804 <fb52> <fb52> 9606 <fb53> <fb56> 21812 <fb57> <fb57> 9633 <fb58> <fb58> 9642 <fb59> <fb59> 21816 <fb5a> <fb5a> 9616 <fb5b> <fb5b> 9614 <fb5c> <fb74> 21817 <fb75> <fb75> 9864 <fb76> <fb78> 21842 <fb79> <fb79> 9886 <fb7a> <fb7a> 9723 <fb7b> <fb7b> 21845 <fb7c> <fb7c> 8076 <fb7d> <fb7d> 8692 <fb7e> <fb7e> 21846 <fb80> <fb8f> 21847 <fb90> <fb90> 8207 <fb91> <fb9b> 21863 <fb9c> <fb9c> 8305 <fb9d> <fb9e> 21874 <fb9f> <fb9f> 9719 <fba0> <fba0> 21876 <fc40> <fc43> 21877 <fc44> <fc44> 9878 <fc45> <fc48> 21881 <fc49> <fc49> 9871 <fc4a> <fc59> 21885 endcidrange 65 begincidrange <fc5a> <fc5a> 8922 <fc5b> <fc62> 21901 <fc63> <fc63> 7873 <fc64> <fc67> 21909 <fc68> <fc68> 7859 <fc69> <fc6e> 21913 <fc6f> <fc6f> 9834 <fc70> <fc70> 21919 <fc71> <fc71> 9866 <fc72> <fc73> 21920 <fc74> <fc74> 9833 <fc75> <fc76> 21922 <fc77> <fc78> 9752 <fc79> <fc7e> 21924 <fc80> <fc82> 21930 <fc83> <fc83> 9754 <fc84> <fc89> 21933 <fc8a> <fc8a> 9843 <fc8b> <fca0> 21939 <fd40> <fd51> 21961 <fd52> <fd52> 8390 <fd53> <fd53> 8811 <fd54> <fd56> 21979 <fd57> <fd57> 9427 <fd58> <fd58> 7814 <fd59> <fd59> 21982 <fd5a> <fd5a> 9743 <fd5b> <fd5e> 21983 <fd5f> <fd5f> 9745 <fd60> <fd61> 21987 <fd62> <fd62> 9747 <fd63> <fd64> 21989 <fd65> <fd65> 9744 <fd66> <fd66> 9746 <fd67> <fd67> 8240 <fd68> <fd68> 21991 <fd69> <fd69> 9841 <fd6a> <fd6b> 21992 <fd6c> <fd6c> 9748 <fd6d> <fd6f> 21994 <fd70> <fd70> 9750 <fd71> <fd71> 21997 <fd72> <fd72> 9749 <fd73> <fd77> 21998 <fd78> <fd78> 8434 <fd79> <fd7c> 22003 <fd7d> <fd7d> 9751 <fd7e> <fd7e> 22007 <fd80> <fd87> 22008 <fd88> <fd88> 8247 <fd89> <fd8a> 22016 <fd8b> <fd8b> 8371 <fd8c> <fd8e> 22018 <fd8f> <fd8f> 7970 <fd90> <fd90> 9453 <fd91> <fd93> 22021 <fd94> <fd94> 7988 <fd95> <fd9c> 22024 <fd9d> <fd9d> 2562 <fd9e> <fd9e> 16595 <fd9f> <fd9f> 8204 <fda0> <fda0> 20611 <fe40> <fe40> 4697 <fe41> <fe7e> 22032 <fe80> <fea0> 22094 endcidrange endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF \ No newline at end of file
diff --git a/src/main/resources/Resources/cmap/GBK2K-V b/src/main/resources/Resources/cmap/GBK2K-V
new file mode 100644
index 0000000..68b90b3
--- /dev/null
+++ b/src/main/resources/Resources/cmap/GBK2K-V
@@ -0,0 +1 @@
+%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%DocumentNeededResources: CMap (GBK2K-H) %%IncludeResource: ProcSet (CIDInit) %%IncludeResource: CMap (GBK2K-H) %%BeginResource: CMap (GBK2K-V) %%Title: (GBK2K-V Adobe GB1 4) %%Version: 1.000 %%Copyright: ----------------------------------------------------------- %%Copyright: Copyright 1990-2000 Adobe Systems Incorporated. %%Copyright: All Rights Reserved. %%Copyright: %%Copyright: Patents Pending %%Copyright: %%Copyright: NOTICE: All information contained herein is the property %%Copyright: of Adobe Systems Incorporated. %%Copyright: %%Copyright: Permission is granted for redistribution of this file %%Copyright: provided this copyright notice is maintained intact and %%Copyright: that the contents of this file are not altered in any %%Copyright: way from its original form. %%Copyright: %%Copyright: PostScript and Display PostScript are trademarks of %%Copyright: Adobe Systems Incorporated which may be registered in %%Copyright: certain jurisdictions. %%Copyright: ----------------------------------------------------------- %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /GBK2K-H usecmap /CIDSystemInfo 3 dict dup begin /Registry (Adobe) def /Ordering (GB1) def /Supplement 4 def end def /CMapName /GBK2K-V def /CMapVersion 1.000 def /CMapType 1 def /XUID [1 10 25600] def /WMode 1 def 41 begincidrange <a1a2> <a1a2> 575 <a1a3> <a1a3> 574 <a1aa> <a1aa> 598 <a1ab> <a1ac> 7704 <a1ad> <a1ad> 599 <a1b2> <a1bf> 582 <a1fe> <a1fe> 7706 <a3a1> <a3a1> 578 <a3a8> <a3a9> 580 <a3ac> <a3ac> 573 <a3ae> <a3ae> 7707 <a3ba> <a3bb> 576 <a3bd> <a3bd> 7708 <a3bf> <a3bf> 579 <a3db> <a3db> 7709 <a3dd> <a3dd> 7710 <a3df> <a3df> 600 <a3fb> <a3fb> 596 <a3fd> <a3fd> 597 <a3fe> <a3fe> 7711 <a4a1> <a4a1> 22359 <a4a3> <a4a3> 22361 <a4a5> <a4a5> 22370 <a4a7> <a4a7> 22360 <a4a9> <a4a9> 22368 <a4c3> <a4c3> 22369 <a4e3> <a4e3> 22372 <a4e5> <a4e5> 22374 <a4e7> <a4e7> 22373 <a4ee> <a4ee> 22371 <a5a1> <a5a1> 22376 <a5a3> <a5a3> 22378 <a5a5> <a5a5> 22385 <a5a7> <a5a7> 22377 <a5a9> <a5a9> 22383 <a5c3> <a5c3> 22384 <a5e3> <a5e3> 22387 <a5e5> <a5e5> 22389 <a5e7> <a5e7> 22388 <a5ee> <a5ee> 22386 <a960> <a960> 22394 endcidrange endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF \ No newline at end of file
diff --git a/src/main/resources/Resources/cmap/GBKp-EUC-H b/src/main/resources/Resources/cmap/GBKp-EUC-H
new file mode 100644
index 0000000..e0d752e
--- /dev/null
+++ b/src/main/resources/Resources/cmap/GBKp-EUC-H
@@ -0,0 +1 @@
+%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%IncludeResource: ProcSet (CIDInit) %%BeginResource: CMap (GBKp-EUC-H) %%Title: (GBKp-EUC-H Adobe GB1 2) %%Version: 1.000 %%Copyright: ----------------------------------------------------------- %%Copyright: Copyright 1990-2000 Adobe Systems Incorporated. %%Copyright: All Rights Reserved. %%Copyright: %%Copyright: Patents Pending %%Copyright: %%Copyright: NOTICE: All information contained herein is the property %%Copyright: of Adobe Systems Incorporated. %%Copyright: %%Copyright: Permission is granted for redistribution of this file %%Copyright: provided this copyright notice is maintained intact and %%Copyright: that the contents of this file are not altered in any %%Copyright: way from its original form. %%Copyright: %%Copyright: PostScript and Display PostScript are trademarks of %%Copyright: Adobe Systems Incorporated which may be registered in %%Copyright: certain jurisdictions. %%Copyright: ----------------------------------------------------------- %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo 3 dict dup begin /Registry (Adobe) def /Ordering (GB1) def /Supplement 2 def end def /CMapName /GBKp-EUC-H def /CMapVersion 1.000 def /CMapType 1 def /XUID [1 10 25455] def /WMode 0 def 2 begincodespacerange <00> <80> <8140> <FEFE> endcodespacerange 1 beginnotdefrange <00> <1f> 1 endnotdefrange 100 begincidrange <20> <7e> 1 <8140> <8178> 10072 <8179> <8179> 8281 <817a> <817e> 10129 <8180> <8185> 10134 <8186> <8186> 8689 <8187> <81ec> 10140 <81ed> <81ed> 8178 <81ee> <81f5> 10242 <81f6> <81f6> 8285 <81f7> <81fe> 10250 <8240> <8252> 10258 <8253> <8253> 9884 <8254> <8261> 10277 <8262> <8262> 8629 <8263> <8273> 10291 <8274> <8274> 8908 <8275> <8279> 10308 <827a> <827a> 8214 <827b> <827c> 10313 <827d> <827d> 7778 <827e> <827e> 10315 <8280> <8280> 7968 <8281> <8282> 10316 <8283> <8283> 8319 <8284> <828f> 10318 <8290> <8290> 8284 <8291> <82a4> 10330 <82a5> <82a5> 8596 <82a6> <82c7> 10350 <82c8> <82c8> 7781 <82c9> <82c9> 8833 <82ca> <82e0> 10384 <82e1> <82e1> 8909 <82e2> <82e2> 10407 <82e3> <82e3> 8458 <82e4> <82e4> 7742 <82e5> <82ec> 10408 <82ed> <82ed> 9855 <82ee> <82f1> 10416 <82f2> <82f2> 8750 <82f3> <82f6> 10420 <82f7> <82f7> 7830 <82f8> <82f8> 8907 <82f9> <82f9> 8812 <82fa> <82fa> 10424 <82fb> <82fb> 8471 <82fc> <82fe> 10425 <8340> <8340> 10428 <8341> <8341> 8424 <8342> <8344> 10429 <8345> <8345> 8916 <8346> <8347> 10432 <8348> <8348> 8121 <8349> <834b> 10434 <834c> <834c> 8920 <834d> <8352> 10437 <8353> <8353> 8415 <8354> <8356> 10443 <8357> <8357> 8386 <8358> <835d> 10446 <835e> <835e> 8597 <835f> <8364> 10452 <8365> <8365> 8108 <8366> <8366> 8915 <8367> <8371> 10458 <8372> <8372> 8065 <8373> <8377> 10469 <8378> <8378> 8720 <8379> <8379> 10474 <837a> <837a> 8911 <837b> <837b> 10475 <837c> <837c> 8723 <837d> <837d> 10476 <837e> <837e> 8164 <8380> <8380> 8080 <8381> <8385> 10477 <8386> <8386> 8918 <8387> <8388> 10482 <8389> <8389> 8912 <838a> <838a> 8910 <838b> <838c> 10484 <838d> <838d> 9857 <838e> <8393> 10486 <8394> <8394> 7798 <8395> <839d> 10492 <839e> <839e> 8753 <839f> <83a5> 10501 <83a6> <83a6> 7827 <83a7> <83aa> 10508 <83ab> <83ab> 8914 <83ac> <83ad> 10512 <83ae> <83ae> 8919 <83af> <83af> 8917 <83b0> <83b0> 8913 <83b1> <83b9> 10514 <83ba> <83ba> 7909 <83bb> <83c8> 10523 <83c9> <83c9> 8229 <83ca> <83f5> 10537 endcidrange 100 begincidrange <83f6> <83f6> 7887 <83f7> <83fe> 10581 <8440> <844f> 10589 <8450> <8450> 8153 <8451> <8470> 10605 <8471> <8471> 8904 <8472> <8473> 10637 <8474> <8474> 8803 <8475> <8476> 10639 <8477> <8477> 9859 <8478> <847e> 10641 <8480> <8481> 10648 <8482> <8482> 7959 <8483> <848d> 10650 <848e> <848e> 7979 <848f> <8491> 10661 <8492> <8492> 8906 <8493> <8493> 7833 <8494> <849c> 10664 <849d> <849d> 8015 <849e> <84a0> 10673 <84a1> <84a1> 8143 <84a2> <84a2> 8246 <84a3> <84a3> 7994 <84a4> <84a4> 10676 <84a5> <84a5> 8905 <84a6> <84a6> 8089 <84a7> <84a8> 10677 <84a9> <84a9> 8053 <84aa> <84c4> 10679 <84c5> <84c5> 8126 <84c6> <84d2> 10706 <84d3> <84d3> 7885 <84d4> <84d4> 10719 <84d5> <84d5> 8617 <84d6> <84d6> 10720 <84d7> <84d7> 8678 <84d8> <84d8> 10721 <84d9> <84d9> 8487 <84da> <84da> 8195 <84db> <84dc> 10722 <84dd> <84dd> 8498 <84de> <84e9> 10724 <84ea> <84ea> 8995 <84eb> <84ed> 10736 <84ee> <84ee> 8209 <84ef> <84f0> 10739 <84f1> <84f1> 8437 <84f2> <84fe> 10741 <8540> <8550> 10754 <8551> <8551> 8901 <8552> <8552> 8030 <8553> <8553> 10771 <8554> <8554> 8902 <8555> <855d> 10772 <855e> <855e> 8431 <855f> <8565> 10781 <8566> <8566> 8656 <8567> <857e> 10788 <8580> <8586> 10812 <8587> <8587> 8897 <8588> <858a> 10819 <858b> <858b> 7780 <858c> <8591> 10822 <8592> <8592> 8697 <8593> <8595> 10828 <8596> <8596> 8208 <8597> <8597> 10831 <8598> <8598> 8898 <8599> <85a1> 10832 <85a2> <85a2> 7770 <85a3> <85b1> 10841 <85b2> <85b2> 7842 <85b3> <85fe> 10856 <8640> <8649> 10932 <864a> <864a> 9069 <864b> <8653> 10942 <8654> <8654> 8775 <8655> <8667> 10951 <8668> <8668> 9068 <8669> <867e> 10970 <8680> <8695> 10992 <8696> <8696> 8604 <8697> <8698> 11014 <8699> <8699> 8393 <869a> <86a0> 11016 <86a1> <86a1> 8688 <86a2> <86c9> 11023 <86ca> <86ca> 8459 <86cb> <86cb> 11063 <86cc> <86cc> 8414 <86cd> <86cd> 11064 <86ce> <86ce> 7850 <86cf> <86d0> 11065 <86d1> <86d1> 8748 <86d2> <86db> 11067 <86dc> <86dc> 8408 <86dd> <86dd> 8896 <86de> <86e0> 11077 <86e1> <86e1> 8303 endcidrange 100 begincidrange <86e2> <86e7> 11080 <86e8> <86e8> 8609 <86e9> <86ed> 11086 <86ee> <86ee> 9081 <86ef> <86f3> 11091 <86f4> <86f4> 9074 <86f5> <86fe> 11096 <8740> <8740> 8554 <8741> <8743> 11106 <8744> <8744> 9084 <8745> <8748> 11109 <8749> <8749> 8368 <874a> <874a> 11113 <874b> <874b> 9082 <874c> <874c> 7796 <874d> <874e> 11114 <874f> <874f> 9079 <8750> <8756> 11116 <8757> <8757> 8012 <8758> <8759> 11123 <875a> <875a> 9080 <875b> <875b> 8655 <875c> <875c> 9064 <875d> <875d> 11125 <875e> <875e> 9073 <875f> <875f> 11126 <8760> <8760> 9065 <8761> <8765> 11127 <8766> <8766> 9844 <8767> <8779> 11132 <877a> <877a> 9071 <877b> <877c> 11151 <877d> <877d> 9072 <877e> <877e> 11153 <8780> <8780> 11154 <8781> <8781> 9078 <8782> <8782> 9075 <8783> <8785> 11155 <8786> <8786> 9087 <8787> <8787> 11158 <8788> <8788> 9076 <8789> <8789> 11159 <878a> <878a> 8373 <878b> <878c> 11160 <878d> <878d> 7899 <878e> <878e> 9842 <878f> <8792> 11162 <8793> <8793> 9070 <8794> <8797> 11166 <8798> <8798> 8631 <8799> <879c> 11170 <879d> <879d> 9077 <879e> <87a2> 11174 <87a3> <87a3> 9090 <87a4> <87a6> 11179 <87a7> <87a7> 8350 <87a8> <87b2> 11182 <87b3> <87b3> 9067 <87b4> <87b4> 11193 <87b5> <87b5> 8249 <87b6> <87ba> 11194 <87bb> <87bb> 9887 <87bc> <87be> 11199 <87bf> <87bf> 9085 <87c0> <87c0> 8693 <87c1> <87c1> 11202 <87c2> <87c2> 9089 <87c3> <87c9> 11203 <87ca> <87ca> 9083 <87cb> <87cb> 9086 <87cc> <87cc> 8652 <87cd> <87ce> 11210 <87cf> <87cf> 8923 <87d0> <87d1> 11212 <87d2> <87d2> 9066 <87d3> <87d3> 9865 <87d4> <87d4> 11214 <87d5> <87d5> 9879 <87d6> <87d9> 11215 <87da> <87da> 8865 <87db> <87f6> 11219 <87f7> <87f7> 9091 <87f8> <87f8> 7997 <87f9> <87f9> 11247 <87fa> <87fa> 8591 <87fb> <87fe> 11248 <8840> <8840> 8774 <8841> <8841> 8776 <8842> <8843> 11252 <8844> <8844> 8574 <8845> <8845> 11254 <8846> <8846> 8576 <8847> <887e> 11255 <8880> <88b9> 11311 <88ba> <88ba> 9002 <88bb> <88cb> 11369 <88cc> <88cc> 8843 <88cd> <88d3> 11386 <88d4> <88d4> 8069 <88d5> <88d6> 11393 endcidrange 100 begincidrange <88d7> <88d7> 8997 <88d8> <88de> 11395 <88df> <88df> 9004 <88e0> <88e4> 11402 <88e5> <88e5> 9006 <88e6> <88f1> 11407 <88f2> <88f2> 8709 <88f3> <88f3> 7736 <88f4> <88f5> 11419 <88f6> <88f6> 7795 <88f7> <88fe> 11421 <8940> <894a> 11429 <894b> <894b> 8163 <894c> <894c> 9017 <894d> <894d> 11440 <894e> <894e> 9003 <894f> <894f> 11441 <8950> <8950> 9005 <8951> <8953> 11442 <8954> <8954> 8575 <8955> <895c> 11445 <895d> <895d> 8615 <895e> <895e> 11453 <895f> <895f> 9007 <8960> <896c> 11454 <896d> <896d> 7805 <896e> <8970> 11467 <8971> <8971> 8406 <8972> <897b> 11470 <897c> <897c> 7874 <897d> <897e> 11480 <8980> <898a> 11482 <898b> <898b> 8882 <898c> <8998> 11493 <8999> <8999> 7903 <899a> <899d> 11506 <899e> <899e> 7929 <899f> <89a5> 11510 <89a6> <89a6> 8409 <89a7> <89a7> 11517 <89a8> <89a8> 8157 <89a9> <89ae> 11518 <89af> <89af> 8551 <89b0> <89b9> 11524 <89ba> <89ba> 8685 <89bb> <89bd> 11534 <89be> <89be> 8199 <89bf> <89bf> 8998 <89c0> <89c0> 9001 <89c1> <89c3> 11537 <89c4> <89c4> 8018 <89c5> <89c5> 8251 <89c6> <89c6> 9000 <89c7> <89c7> 11540 <89c8> <89c8> 8999 <89c9> <89cd> 11541 <89ce> <89ce> 7723 <89cf> <89d0> 11546 <89d1> <89d1> 8878 <89d2> <89d7> 11548 <89d8> <89d8> 8009 <89d9> <89da> 11554 <89db> <89db> 8504 <89dc> <89f3> 11556 <89f4> <89f4> 8321 <89f5> <89fe> 11580 <8a40> <8a40> 11590 <8a41> <8a41> 8060 <8a42> <8a58> 11591 <8a59> <8a59> 9051 <8a5a> <8a5a> 7902 <8a5b> <8a5b> 11614 <8a5c> <8a5c> 8098 <8a5d> <8a5d> 11615 <8a5e> <8a5e> 7930 <8a5f> <8a78> 11616 <8a79> <8a79> 8877 <8a7a> <8a7e> 11642 <8a80> <8ae3> 11647 <8ae4> <8ae4> 8255 <8ae5> <8afe> 11747 <8b40> <8b43> 11773 <8b44> <8b44> 7950 <8b45> <8b48> 11777 <8b49> <8b49> 9209 <8b4a> <8b79> 11781 <8b7a> <8b7a> 9212 <8b7b> <8b7e> 11829 <8b80> <8b8b> 11833 <8b8c> <8b8c> 8297 <8b8d> <8b9d> 11845 <8b9e> <8b9e> 9207 <8b9f> <8bb2> 11862 <8bb3> <8bb3> 9206 <8bb4> <8bb8> 11882 <8bb9> <8bb9> 9213 <8bba> <8bbd> 11887 <8bbe> <8bbe> 9208 <8bbf> <8bc5> 11891 <8bc6> <8bc6> 9210 endcidrange 100 begincidrange <8bc7> <8bc7> 11898 <8bc8> <8bc8> 9214 <8bc9> <8bc9> 8104 <8bca> <8bd3> 11899 <8bd4> <8bd4> 9217 <8bd5> <8bdb> 11909 <8bdc> <8bdc> 9215 <8bdd> <8be4> 11916 <8be5> <8be5> 9216 <8be6> <8bea> 11924 <8beb> <8beb> 8737 <8bec> <8bef> 11929 <8bf0> <8bf0> 8482 <8bf1> <8bfe> 11933 <8c40> <8c43> 11947 <8c44> <8c44> 9211 <8c45> <8c4e> 11951 <8c4f> <8c4f> 8538 <8c50> <8c56> 11961 <8c57> <8c57> 8677 <8c58> <8c5b> 11968 <8c5c> <8c5c> 8279 <8c5d> <8c7e> 11972 <8c80> <8c8a> 12006 <8c8b> <8c8b> 8421 <8c8c> <8c8c> 12017 <8c8d> <8c8d> 8495 <8c8e> <8c8e> 8355 <8c8f> <8c8f> 8481 <8c90> <8c90> 12018 <8c91> <8c91> 8660 <8c92> <8c92> 8165 <8c93> <8c98> 12019 <8c99> <8c99> 7818 <8c9a> <8c9a> 7735 <8c9b> <8ca1> 12025 <8ca2> <8ca2> 8094 <8ca3> <8ca3> 8870 <8ca4> <8ca4> 8680 <8ca5> <8ca5> 12032 <8ca6> <8ca6> 7898 <8ca7> <8ca7> 7865 <8ca8> <8cbf> 12033 <8cc0> <8cc0> 9052 <8cc1> <8cd1> 12057 <8cd2> <8cd2> 8272 <8cd3> <8cd3> 7783 <8cd4> <8cd4> 12074 <8cd5> <8cd5> 9204 <8cd6> <8cd8> 12075 <8cd9> <8cd9> 8510 <8cda> <8cf8> 12078 <8cf9> <8cf9> 7958 <8cfa> <8cfe> 12109 <8d40> <8d72> 12114 <8d73> <8d73> 9097 <8d74> <8d74> 12165 <8d75> <8d75> 7863 <8d76> <8d7a> 12166 <8d7b> <8d7b> 8628 <8d7c> <8d7e> 12171 <8d80> <8d87> 12174 <8d88> <8d88> 9103 <8d89> <8d8e> 12182 <8d8f> <8d8f> 7962 <8d90> <8d9d> 12188 <8d9e> <8d9e> 9099 <8d9f> <8db8> 12202 <8db9> <8db9> 9098 <8dba> <8de1> 12228 <8de2> <8de2> 9105 <8de3> <8de3> 12268 <8de4> <8de4> 8817 <8de5> <8de6> 12269 <8de7> <8de7> 9096 <8de8> <8df6> 12271 <8df7> <8df7> 9102 <8df8> <8dfd> 12286 <8dfe> <8dfe> 9101 <8e40> <8e45> 12292 <8e46> <8e46> 9100 <8e47> <8e55> 12298 <8e56> <8e56> 9104 <8e57> <8e57> 12313 <8e58> <8e58> 8243 <8e59> <8e59> 12314 <8e5a> <8e5a> 8764 <8e5b> <8e67> 12315 <8e68> <8e68> 8169 <8e69> <8e6d> 12328 <8e6e> <8e6e> 8277 <8e6f> <8e6f> 12333 <8e70> <8e70> 9106 <8e71> <8e7e> 12334 <8e80> <8e80> 8996 <8e81> <8e9a> 12348 <8e9b> <8e9b> 8515 <8e9c> <8e9e> 12374 <8e9f> <8e9f> 8489 <8ea0> <8ea3> 12377 endcidrange 100 begincidrange <8ea4> <8ea4> 8823 <8ea5> <8ea6> 12381 <8ea7> <8ea7> 7847 <8ea8> <8eab> 12383 <8eac> <8eac> 8837 <8ead> <8ead> 12387 <8eae> <8eae> 9092 <8eaf> <8ebc> 12388 <8ebd> <8ebd> 9095 <8ebe> <8ebe> 9094 <8ebf> <8ec2> 12402 <8ec3> <8ec3> 8848 <8ec4> <8ec4> 12406 <8ec5> <8ec5> 7748 <8ec6> <8ecc> 12407 <8ecd> <8ecd> 7730 <8ece> <8ece> 9093 <8ecf> <8ed5> 12414 <8ed6> <8ed6> 7955 <8ed7> <8ed7> 8051 <8ed8> <8eeb> 12421 <8eec> <8eec> 8160 <8eed> <8efe> 12441 <8f40> <8f51> 12459 <8f52> <8f52> 8327 <8f53> <8f53> 7800 <8f54> <8f54> 9134 <8f55> <8f55> 7926 <8f56> <8f56> 7985 <8f57> <8f5c> 12477 <8f5d> <8f5d> 8261 <8f5e> <8f63> 12483 <8f64> <8f64> 8568 <8f65> <8f7e> 12489 <8f80> <8f85> 12515 <8f86> <8f86> 9205 <8f87> <8f87> 12521 <8f88> <8f88> 8821 <8f89> <8f94> 12522 <8f95> <8f95> 9838 <8f96> <8f96> 12534 <8f97> <8f97> 7856 <8f98> <8f9a> 12535 <8f9b> <8f9b> 8323 <8f9c> <8f9c> 12538 <8f9d> <8f9d> 8584 <8f9e> <8fa0> 12539 <8fa1> <8fa1> 9852 <8fa2> <8fbc> 12542 <8fbd> <8fbd> 8133 <8fbe> <8fc3> 12569 <8fc4> <8fc4> 7841 <8fc5> <8fc5> 12575 <8fc6> <8fc6> 9107 <8fc7> <8fcc> 12576 <8fcd> <8fcd> 7947 <8fce> <8fd7> 12582 <8fd8> <8fd8> 7804 <8fd9> <8ffe> 12592 <9040> <907e> 12630 <9080> <909c> 12693 <909d> <909d> 9140 <909e> <909e> 8318 <909f> <90b9> 12722 <90ba> <90ba> 7907 <90bb> <90bf> 12749 <90c0> <90c0> 8341 <90c1> <90c1> 9147 <90c2> <90c4> 12754 <90c5> <90c5> 9145 <90c6> <90da> 12757 <90db> <90db> 7720 <90dc> <90dc> 9149 <90dd> <90ec> 12778 <90ed> <90ed> 9141 <90ee> <90ef> 12794 <90f0> <90f0> 9146 <90f1> <90f6> 12796 <90f7> <90f7> 9139 <90f8> <90fe> 12802 <9140> <9141> 12809 <9142> <9142> 8546 <9143> <914a> 12811 <914b> <914b> 7774 <914c> <914c> 12819 <914d> <914d> 7773 <914e> <9150> 12820 <9151> <9151> 9143 <9152> <9153> 12823 <9154> <9154> 7983 <9155> <9155> 9439 <9156> <9158> 12825 <9159> <9159> 9138 <915a> <915a> 8526 <915b> <915c> 12828 <915d> <915d> 8274 <915e> <9160> 12830 <9161> <9161> 9148 <9162> <9162> 12833 <9163> <9163> 8427 endcidrange 100 begincidrange <9164> <916d> 12834 <916e> <916e> 8754 <916f> <9175> 12844 <9176> <9176> 7743 <9177> <9179> 12851 <917a> <917a> 8219 <917b> <917b> 8380 <917c> <917c> 9150 <917d> <917e> 12854 <9180> <9183> 12856 <9184> <9184> 7854 <9185> <918c> 12860 <918d> <918d> 7931 <918e> <9190> 12868 <9191> <9191> 8329 <9192> <9192> 12871 <9193> <9193> 9137 <9194> <9196> 12872 <9197> <9197> 8644 <9198> <919a> 12875 <919b> <919b> 8724 <919c> <91a8> 12878 <91a9> <91a9> 8158 <91aa> <91aa> 8739 <91ab> <91ab> 9142 <91ac> <91b9> 12891 <91ba> <91ba> 9868 <91bb> <91bb> 9438 <91bc> <91be> 12905 <91bf> <91bf> 9440 <91c0> <91c2> 12908 <91c3> <91c3> 9144 <91c4> <91cc> 12911 <91cd> <91cd> 7809 <91ce> <91cf> 12920 <91d0> <91d0> 8190 <91d1> <91d1> 8017 <91d2> <91d2> 8673 <91d3> <91d3> 12922 <91d4> <91d4> 9136 <91d5> <91d5> 12923 <91d6> <91d6> 8142 <91d7> <91d7> 12924 <91d8> <91d8> 8478 <91d9> <91d9> 8225 <91da> <91de> 12925 <91df> <91df> 9441 <91e0> <91e1> 12930 <91e2> <91e2> 9379 <91e3> <91e9> 12932 <91ea> <91ea> 9380 <91eb> <91ef> 12939 <91f0> <91f0> 8819 <91f1> <91f1> 12944 <91f2> <91f2> 8624 <91f3> <91fe> 12945 <9240> <927e> 12957 <9280> <92b5> 13020 <92b6> <92b6> 8657 <92b7> <92cd> 13074 <92ce> <92ce> 8476 <92cf> <92cf> 13097 <92d0> <92d0> 9053 <92d1> <92d3> 13098 <92d4> <92d4> 9858 <92d5> <92de> 13101 <92df> <92df> 8461 <92e0> <92e0> 8282 <92e1> <92fd> 13111 <92fe> <92fe> 8077 <9340> <934f> 13140 <9350> <9350> 8703 <9351> <935c> 13156 <935d> <935d> 8024 <935e> <936f> 13168 <9370> <9370> 8539 <9371> <9375> 13186 <9376> <9376> 7862 <9377> <937e> 13191 <9380> <938b> 13199 <938c> <938c> 8411 <938d> <939c> 13211 <939d> <939d> 9056 <939e> <93a4> 13227 <93a5> <93a5> 9057 <93a6> <93a6> 13234 <93a7> <93a7> 8256 <93a8> <93b3> 13235 <93b4> <93b4> 8846 <93b5> <93b7> 13247 <93b8> <93b8> 8159 <93b9> <93ba> 13250 <93bb> <93bb> 9054 <93bc> <93bc> 13252 <93bd> <93bd> 7786 <93be> <93c5> 13253 <93c6> <93c6> 8194 <93c7> <93ce> 13261 <93cf> <93cf> 8339 <93d0> <93d6> 13269 endcidrange 100 begincidrange <93d7> <93d7> 9055 <93d8> <93da> 13276 <93db> <93db> 7852 <93dc> <93dc> 7764 <93dd> <93e0> 13279 <93e1> <93e1> 7944 <93e2> <93e3> 13283 <93e4> <93e4> 8384 <93e5> <93e5> 9058 <93e6> <93e8> 13285 <93e9> <93e9> 8544 <93ea> <93ea> 13288 <93eb> <93eb> 8605 <93ec> <93ec> 8078 <93ed> <93ed> 8749 <93ee> <93ee> 13289 <93ef> <93ef> 8263 <93f0> <93f0> 13290 <93f1> <93f1> 8802 <93f2> <93f3> 13291 <93f4> <93f4> 8039 <93f5> <93f5> 7858 <93f6> <93f9> 13293 <93fa> <93fa> 7849 <93fb> <93fd> 13297 <93fe> <93fe> 8140 <9440> <9443> 13300 <9444> <9444> 8050 <9445> <944c> 13304 <944d> <944d> 8344 <944e> <944f> 13312 <9450> <9450> 7762 <9451> <9451> 8356 <9452> <9452> 7964 <9453> <9453> 8847 <9454> <9454> 13314 <9455> <9455> 8173 <9456> <9457> 13315 <9458> <9458> 9061 <9459> <945a> 13317 <945b> <945b> 7725 <945c> <945c> 8530 <945d> <945d> 9062 <945e> <945e> 13319 <945f> <945f> 8442 <9460> <9463> 13320 <9464> <9464> 9059 <9465> <9465> 13324 <9466> <9466> 8346 <9467> <946d> 13325 <946e> <946e> 8252 <946f> <9471> 13332 <9472> <9472> 8182 <9473> <9473> 13335 <9474> <9474> 9060 <9475> <9475> 13336 <9476> <9476> 7785 <9477> <9477> 13337 <9478> <9478> 9063 <9479> <9479> 13338 <947a> <947a> 8477 <947b> <947e> 13339 <9480> <9480> 8793 <9481> <9481> 8278 <9482> <9482> 8547 <9483> <9486> 13343 <9487> <9487> 8105 <9488> <9488> 8188 <9489> <94a0> 13347 <94a1> <94a1> 7726 <94a2> <94b2> 13371 <94b3> <94b3> 7868 <94b4> <94b4> 13388 <94b5> <94b5> 8514 <94b6> <94be> 13389 <94bf> <94bf> 8222 <94c0> <94c0> 7747 <94c1> <94cb> 13398 <94cc> <94cc> 9428 <94cd> <94d7> 13409 <94d8> <94d8> 8815 <94d9> <94df> 13420 <94e0> <94e0> 7895 <94e1> <94fe> 13427 <9540> <9571> 13457 <9572> <9572> 8493 <9573> <957e> 13507 <9580> <9582> 13519 <9583> <9583> 8859 <9584> <959d> 13522 <959e> <959e> 8790 <959f> <959f> 9384 <95a0> <95b2> 13548 <95b3> <95b3> 7801 <95b4> <95b9> 13567 <95ba> <95ba> 8794 <95bb> <95ce> 13573 <95cf> <95cf> 9383 <95d0> <95d0> 13593 <95d1> <95d1> 9862 endcidrange 100 begincidrange <95d2> <95d2> 9382 <95d3> <95d3> 13594 <95d4> <95d4> 8654 <95d5> <95e0> 13595 <95e1> <95e1> 9385 <95e2> <95e6> 13607 <95e7> <95e7> 8167 <95e8> <95f0> 13612 <95f1> <95f1> 8466 <95f2> <95f7> 13621 <95f8> <95f8> 8508 <95f9> <95fd> 13627 <95fe> <95fe> 8028 <9640> <9655> 13632 <9656> <9656> 9412 <9657> <967b> 13654 <967c> <967c> 7884 <967d> <967e> 13691 <9680> <96fe> 13693 <9740> <9766> 13820 <9767> <9767> 9322 <9768> <976b> 13859 <976c> <976c> 8565 <976d> <976d> 13863 <976e> <976e> 9325 <976f> <977e> 13864 <9780> <9795> 13880 <9796> <9796> 9323 <9797> <9797> 8799 <9798> <979c> 13902 <979d> <979d> 7886 <979e> <97a2> 13907 <97a3> <97a3> 8818 <97a4> <97be> 13912 <97bf> <97bf> 9331 <97c0> <97ed> 13939 <97ee> <97ee> 8702 <97ef> <97f6> 13985 <97f7> <97f7> 7934 <97f8> <97fe> 13993 <9840> <9844> 14000 <9845> <9845> 9333 <9846> <9848> 14005 <9849> <9849> 8714 <984a> <984e> 14008 <984f> <984f> 8047 <9850> <9870> 14013 <9871> <9871> 9320 <9872> <9872> 14046 <9873> <9873> 8448 <9874> <987e> 14047 <9880> <9880> 14058 <9881> <9881> 9334 <9882> <988a> 14059 <988b> <988b> 7975 <988c> <988c> 8407 <988d> <989f> 14068 <98a0> <98a0> 9340 <98a1> <98a9> 14087 <98aa> <98aa> 8097 <98ab> <98b5> 14096 <98b6> <98b6> 8874 <98b7> <98b7> 8197 <98b8> <98b9> 14107 <98ba> <98ba> 9324 <98bb> <98c6> 14109 <98c7> <98c7> 8254 <98c8> <98ca> 14121 <98cb> <98cb> 7756 <98cc> <98cf> 14124 <98d0> <98d0> 8506 <98d1> <98d2> 14128 <98d3> <98d3> 8708 <98d4> <98e2> 14130 <98e3> <98e3> 8387 <98e4> <98e4> 8512 <98e5> <98e5> 9335 <98e6> <98ee> 14145 <98ef> <98ef> 9332 <98f0> <98f1> 14154 <98f2> <98f2> 8413 <98f3> <98fe> 14156 <9940> <9942> 14168 <9943> <9943> 8040 <9944> <9944> 14171 <9945> <9945> 8581 <9946> <9965> 14172 <9966> <9966> 9330 <9967> <996d> 14204 <996e> <996e> 7861 <996f> <9974> 14211 <9975> <9975> 9336 <9976> <9979> 14217 <997a> <997a> 8075 <997b> <997b> 9348 <997c> <997e> 14221 <9980> <9984> 14224 <9985> <9985> 9881 <9986> <9988> 14229 <9989> <9989> 9346 endcidrange 100 begincidrange <998a> <998d> 14232 <998e> <998e> 8353 <998f> <9990> 14236 <9991> <9991> 8082 <9992> <9998> 14238 <9999> <9999> 7992 <999a> <99a8> 14245 <99a9> <99a9> 9349 <99aa> <99af> 14260 <99b0> <99b0> 9344 <99b1> <99b1> 9326 <99b2> <99b2> 14266 <99b3> <99b3> 9339 <99b4> <99b4> 9350 <99b5> <99b5> 9329 <99b6> <99bc> 14267 <99bd> <99bd> 9347 <99be> <99be> 9328 <99bf> <99bf> 14274 <99c0> <99c0> 9321 <99c1> <99c1> 14275 <99c2> <99c2> 9343 <99c3> <99c8> 14276 <99c9> <99c9> 9327 <99ca> <99cd> 14282 <99ce> <99ce> 9345 <99cf> <99d0> 14286 <99d1> <99d1> 8736 <99d2> <99d9> 14288 <99da> <99da> 8181 <99db> <99df> 14296 <99e0> <99e0> 8436 <99e1> <99e4> 14301 <99e5> <99e5> 9341 <99e6> <99e7> 14305 <99e8> <99e8> 9337 <99e9> <99eb> 14307 <99ec> <99ec> 9342 <99ed> <99f3> 14310 <99f4> <99f4> 9338 <99f5> <99fe> 14317 <9a40> <9a49> 14327 <9a4a> <9a4a> 8419 <9a4b> <9a56> 14337 <9a57> <9a57> 8365 <9a58> <9a64> 14349 <9a65> <9a65> 9419 <9a66> <9a66> 14362 <9a67> <9a67> 8019 <9a68> <9a70> 14363 <9a71> <9a71> 8537 <9a72> <9a75> 14372 <9a76> <9a76> 8211 <9a77> <9a77> 7987 <9a78> <9a7e> 14376 <9a80> <9a87> 14383 <9a88> <9a88> 7772 <9a89> <9a8b> 14391 <9a8c> <9a8c> 9352 <9a8d> <9a90> 14394 <9a91> <9a91> 9351 <9a92> <9a96> 14398 <9a97> <9a97> 9354 <9a98> <9a99> 14403 <9a9a> <9a9a> 9353 <9a9b> <9a9b> 9355 <9a9c> <9a9d> 14405 <9a9e> <9a9e> 8067 <9a9f> <9aa1> 14407 <9aa2> <9aa2> 8463 <9aa3> <9aa3> 8155 <9aa4> <9aa9> 14410 <9aaa> <9aaa> 8367 <9aab> <9acf> 14416 <9ad0> <9ad0> 9408 <9ad1> <9ad5> 14453 <9ad6> <9ad6> 8813 <9ad7> <9ad9> 14458 <9ada> <9ada> 9409 <9adb> <9ae1> 14461 <9ae2> <9ae2> 8394 <9ae3> <9ae3> 14468 <9ae4> <9ae4> 8423 <9ae5> <9ae5> 9410 <9ae6> <9afe> 14469 <9b40> <9b7e> 14494 <9b80> <9bd0> 14557 <9bd1> <9bd1> 9180 <9bd2> <9bdb> 14638 <9bdc> <9bdc> 9179 <9bdd> <9bfe> 14648 <9c40> <9c52> 14682 <9c53> <9c53> 8286 <9c54> <9c58> 14701 <9c59> <9c59> 8772 <9c5a> <9c5a> 9186 <9c5b> <9c5b> 14706 <9c5c> <9c5c> 8404 <9c5d> <9c74> 14707 <9c75> <9c75> 8607 endcidrange 100 begincidrange <9c76> <9c78> 14731 <9c79> <9c79> 7782 <9c7a> <9c7e> 14734 <9c80> <9c85> 14739 <9c86> <9c86> 8035 <9c87> <9c9c> 14745 <9c9d> <9c9d> 9181 <9c9e> <9caa> 14767 <9cab> <9cab> 8555 <9cac> <9cc9> 14780 <9cca> <9cca> 8885 <9ccb> <9cce> 14810 <9ccf> <9ccf> 7974 <9cd0> <9ce5> 14814 <9ce6> <9ce6> 7779 <9ce7> <9ce7> 8328 <9ce8> <9ceb> 14836 <9cec> <9cec> 7869 <9ced> <9ced> 14840 <9cee> <9cee> 9025 <9cef> <9cfa> 14841 <9cfb> <9cfb> 8011 <9cfc> <9cfd> 14853 <9cfe> <9cfe> 8850 <9d40> <9d41> 14855 <9d42> <9d42> 8484 <9d43> <9d45> 14857 <9d46> <9d46> 8264 <9d47> <9d47> 9184 <9d48> <9d4c> 14860 <9d4d> <9d4d> 8311 <9d4e> <9d4e> 14865 <9d4f> <9d4f> 8762 <9d50> <9d60> 14866 <9d61> <9d61> 8369 <9d62> <9d67> 14883 <9d68> <9d68> 8001 <9d69> <9d69> 8220 <9d6a> <9d6d> 14889 <9d6e> <9d6e> 8888 <9d6f> <9d70> 14893 <9d71> <9d71> 8822 <9d72> <9d74> 14895 <9d75> <9d75> 8091 <9d76> <9d7a> 14898 <9d7b> <9d7b> 8095 <9d7c> <9d7c> 14903 <9d7d> <9d7d> 9674 <9d7e> <9d7e> 14904 <9d80> <9d89> 14905 <9d8a> <9d8a> 8382 <9d8b> <9d8c> 14915 <9d8d> <9d8d> 8116 <9d8e> <9d90> 14917 <9d91> <9d91> 9175 <9d92> <9d98> 14920 <9d99> <9d99> 8453 <9d9a> <9da0> 14927 <9da1> <9da1> 9185 <9da2> <9da2> 8172 <9da3> <9da6> 14934 <9da7> <9da7> 9194 <9da8> <9dab> 14938 <9dac> <9dac> 9187 <9dad> <9dad> 8462 <9dae> <9db1> 14942 <9db2> <9db2> 8102 <9db3> <9db3> 8196 <9db4> <9dbd> 14946 <9dbe> <9dbe> 8093 <9dbf> <9dc5> 14956 <9dc6> <9dc6> 9189 <9dc7> <9dc8> 14963 <9dc9> <9dc9> 8804 <9dca> <9dcc> 14965 <9dcd> <9dcd> 9442 <9dce> <9dd1> 14968 <9dd2> <9dd2> 9182 <9dd3> <9dd4> 14972 <9dd5> <9dd5> 7876 <9dd6> <9de0> 14974 <9de1> <9de1> 8886 <9de2> <9de2> 8361 <9de3> <9df0> 14985 <9df1> <9df1> 8491 <9df2> <9df3> 14999 <9df4> <9df4> 8357 <9df5> <9df6> 15001 <9df7> <9df7> 9867 <9df8> <9df9> 15003 <9dfa> <9dfa> 8054 <9dfb> <9dfc> 15005 <9dfd> <9dfd> 8557 <9dfe> <9dfe> 15007 <9e40> <9e44> 15008 <9e45> <9e45> 8193 <9e46> <9e47> 15013 <9e48> <9e48> 8593 <9e49> <9e49> 7760 <9e4a> <9e51> 15015 endcidrange 100 begincidrange <9e52> <9e52> 8092 <9e53> <9e53> 15023 <9e54> <9e54> 9178 <9e55> <9e55> 15024 <9e56> <9e56> 8275 <9e57> <9e5c> 15025 <9e5d> <9e5d> 9193 <9e5e> <9e5e> 9188 <9e5f> <9e60> 15031 <9e61> <9e61> 8661 <9e62> <9e62> 15033 <9e63> <9e63> 9190 <9e64> <9e66> 15034 <9e67> <9e67> 9183 <9e68> <9e6b> 15037 <9e6c> <9e6c> 7759 <9e6d> <9e6e> 15041 <9e6f> <9e6f> 9177 <9e70> <9e71> 15043 <9e72> <9e72> 8212 <9e73> <9e73> 15045 <9e74> <9e74> 9196 <9e75> <9e75> 9195 <9e76> <9e7a> 15046 <9e7b> <9e7b> 9176 <9e7c> <9e7c> 9198 <9e7d> <9e7e> 15051 <9e80> <9e84> 15053 <9e85> <9e85> 9870 <9e86> <9e86> 15058 <9e87> <9e87> 9197 <9e88> <9e90> 15059 <9e91> <9e91> 8186 <9e92> <9e95> 15068 <9e96> <9e96> 9174 <9e97> <9e97> 9192 <9e98> <9ea1> 15072 <9ea2> <9ea2> 8454 <9ea3> <9ea5> 15082 <9ea6> <9ea6> 8203 <9ea7> <9ea8> 15085 <9ea9> <9ea9> 8550 <9eaa> <9ead> 15087 <9eae> <9eae> 9199 <9eaf> <9eb2> 15091 <9eb3> <9eb3> 8585 <9eb4> <9eb4> 8280 <9eb5> <9eb6> 15095 <9eb7> <9eb7> 9191 <9eb8> <9ef4> 15097 <9ef5> <9ef5> 8611 <9ef6> <9efe> 15158 <9f40> <9f4d> 15167 <9f4e> <9f4e> 8570 <9f4f> <9f6e> 15181 <9f6f> <9f6f> 8613 <9f70> <9f7e> 15213 <9f80> <9f91> 15228 <9f92> <9f92> 8226 <9f93> <9f97> 15246 <9f98> <9f98> 9430 <9f99> <9fa5> 15251 <9fa6> <9fa6> 9018 <9fa7> <9fa8> 15264 <9fa9> <9fa9> 7918 <9faa> <9fab> 15266 <9fac> <9fac> 9429 <9fad> <9fc8> 15268 <9fc9> <9fc9> 8744 <9fca> <9fcc> 15296 <9fcd> <9fcd> 9431 <9fce> <9fe0> 15299 <9fe1> <9fe1> 8444 <9fe2> <9fea> 15318 <9feb> <9feb> 7815 <9fec> <9fed> 15327 <9fee> <9fee> 9432 <9fef> <9ff3> 15329 <9ff4> <9ff4> 7866 <9ff5> <9ffc> 15334 <9ffd> <9ffd> 8473 <9ffe> <9ffe> 15342 <a040> <a042> 15343 <a043> <a043> 8556 <a044> <a045> 15346 <a046> <a046> 9433 <a047> <a048> 15348 <a049> <a049> 8743 <a04a> <a04d> 15350 <a04e> <a04e> 7775 <a04f> <a053> 15354 <a054> <a054> 8863 <a055> <a059> 15359 <a05a> <a05a> 8029 <a05b> <a060> 15364 <a061> <a061> 8124 <a062> <a062> 15370 <a063> <a063> 9434 <a064> <a070> 15371 <a071> <a071> 8521 endcidrange 100 begincidrange <a072> <a073> 15384 <a074> <a074> 8262 <a075> <a07e> 15386 <a080> <a080> 8192 <a081> <a090> 15396 <a091> <a091> 8592 <a092> <a093> 15412 <a094> <a094> 8712 <a095> <a095> 15414 <a096> <a096> 7910 <a097> <a0a8> 15415 <a0a9> <a0a9> 9411 <a0aa> <a0be> 15433 <a0bf> <a0bf> 8396 <a0c0> <a0cd> 15454 <a0ce> <a0ce> 9024 <a0cf> <a0d8> 15468 <a0d9> <a0d9> 7889 <a0da> <a0dd> 15478 <a0de> <a0de> 8620 <a0df> <a0ed> 15482 <a0ee> <a0ee> 8879 <a0ef> <a0fe> 15497 <a1a1> <a1fe> 96 <a2a1> <a2aa> 9897 <a2b1> <a2e2> 190 <a2e5> <a2ee> 240 <a2f1> <a2fc> 250 <a3a1> <a3fe> 262 <a4a1> <a4f3> 356 <a5a1> <a5f6> 439 <a6a1> <a6b8> 525 <a6c1> <a6f5> 549 <a7a1> <a7c1> 602 <a7d1> <a7f1> 635 <a840> <a87e> 9907 <a880> <a895> 9970 <a8a1> <a8c0> 668 <a8c5> <a8ea> 700 <a940> <a957> 9992 <a959> <a95a> 10016 <a95c> <a95c> 10018 <a960> <a97e> 10019 <a980> <a995> 10050 <a996> <a996> 7703 <a9a4> <a9ef> 738 <aa40> <aa4c> 15513 <aa4d> <aa4d> 8630 <aa4e> <aa4e> 7741 <aa4f> <aa70> 15526 <aa71> <aa71> 8757 <aa72> <aa72> 15560 <aa73> <aa73> 9111 <aa74> <aa76> 15561 <aa77> <aa77> 9109 <aa78> <aa79> 15564 <aa7a> <aa7a> 8767 <aa7b> <aa7b> 8490 <aa7c> <aa7e> 15566 <aa80> <aa99> 15569 <aa9a> <aa9a> 7890 <aa9b> <aa9b> 15595 <aa9c> <aa9c> 9110 <aa9d> <aa9d> 9112 <aa9e> <aa9e> 15596 <aa9f> <aa9f> 8354 <aaa0> <aaa0> 15597 <aaa1> <aafe> 814 <ab40> <ab40> 8036 <ab41> <ab42> 15598 <ab43> <ab43> 8235 <ab44> <ab44> 15600 <ab45> <ab45> 9108 <ab46> <ab46> 8505 <ab47> <ab47> 15601 <ab48> <ab48> 8543 <ab49> <ab49> 8641 <ab4a> <ab4a> 9114 <ab4b> <ab4c> 15602 <ab4d> <ab4d> 9113 <ab4e> <ab7e> 15604 <ab80> <aba0> 15653 <aba1> <abc0> 908 <ac40> <ac45> 15686 <ac46> <ac46> 8640 <ac47> <ac70> 15692 <ac71> <ac71> 9312 <ac72> <ac7b> 15734 <ac7c> <ac7c> 9308 <ac7d> <ac7e> 15744 <ac80> <ac8c> 15746 <ac8d> <ac8d> 8541 <ac8e> <ac92> 15759 <ac93> <ac93> 8741 <ac94> <ac94> 8298 <ac95> <aca0> 15764 <ad40> <ad48> 15776 <ad49> <ad49> 9313 <ad4a> <ad5d> 15785 <ad5e> <ad5e> 9307 endcidrange 100 begincidrange <ad5f> <ad60> 15805 <ad61> <ad61> 9314 <ad62> <ad67> 15807 <ad68> <ad68> 8020 <ad69> <ad73> 15813 <ad74> <ad74> 9311 <ad75> <ad7e> 15824 <ad80> <ad81> 15834 <ad82> <ad82> 8428 <ad83> <ad86> 15836 <ad87> <ad87> 9309 <ad88> <ad8a> 15840 <ad8b> <ad8b> 9315 <ad8c> <ad90> 15843 <ad91> <ad91> 9316 <ad92> <ada0> 15848 <ae40> <ae53> 15863 <ae54> <ae54> 9381 <ae55> <ae61> 15883 <ae62> <ae62> 7792 <ae63> <ae7e> 15896 <ae80> <ae80> 8335 <ae81> <ae84> 15924 <ae85> <ae85> 7746 <ae86> <ae8a> 15928 <ae8b> <ae8b> 8014 <ae8c> <ae93> 15933 <ae94> <ae94> 7857 <ae95> <ae9f> 15941 <aea0> <aea0> 7819 <af40> <af63> 15952 <af64> <af64> 8134 <af65> <af7a> 15988 <af7b> <af7b> 9646 <af7c> <af7e> 16010 <af80> <af81> 16013 <af82> <af82> 7937 <af83> <af83> 8704 <af84> <af8d> 16015 <af8e> <af8e> 9650 <af8f> <af8f> 7831 <af90> <af90> 16025 <af91> <af91> 8363 <af92> <af9b> 16026 <af9c> <af9c> 9651 <af9d> <af9e> 16036 <af9f> <af9f> 8232 <afa0> <afa0> 16038 <b040> <b040> 16039 <b041> <b042> 9647 <b043> <b043> 16040 <b044> <b044> 9649 <b045> <b04e> 16041 <b04f> <b04f> 9644 <b050> <b053> 16051 <b054> <b054> 7758 <b055> <b056> 16055 <b057> <b057> 8706 <b058> <b058> 9643 <b059> <b059> 8838 <b05a> <b05a> 16057 <b05b> <b05b> 9645 <b05c> <b05c> 16058 <b05d> <b05d> 9654 <b05e> <b05e> 16059 <b05f> <b05f> 8675 <b060> <b061> 9652 <b062> <b062> 8751 <b063> <b063> 8549 <b064> <b064> 9655 <b065> <b06b> 16060 <b06c> <b06c> 7913 <b06d> <b07c> 16067 <b07d> <b07d> 7717 <b07e> <b07e> 16083 <b080> <b096> 16084 <b097> <b097> 9664 <b098> <b098> 16107 <b099> <b099> 8858 <b09a> <b0a0> 16108 <b0a1> <b0fe> 940 <b140> <b14a> 16115 <b14b> <b14b> 8814 <b14c> <b14c> 16126 <b14d> <b14d> 8125 <b14e> <b14e> 16127 <b14f> <b14f> 8068 <b150> <b150> 8370 <b151> <b151> 16128 <b152> <b152> 8259 <b153> <b17e> 16129 <b180> <b196> 16173 <b197> <b197> 9860 <b198> <b1a0> 16196 <b1a1> <b1fe> 1034 <b240> <b240> 16205 <b241> <b241> 9455 <b242> <b266> 16206 <b267> <b267> 9454 <b268> <b26c> 16243 endcidrange 100 begincidrange <b26d> <b26d> 8308 <b26e> <b273> 16248 <b274> <b274> 9863 <b275> <b27e> 16254 <b280> <b280> 9456 <b281> <b288> 16264 <b289> <b289> 9869 <b28a> <b299> 16272 <b29a> <b29a> 8864 <b29b> <b2a0> 16288 <b2a1> <b2fe> 1128 <b340> <b342> 16294 <b343> <b343> 8107 <b344> <b36f> 16297 <b370> <b370> 9896 <b371> <b37e> 16341 <b380> <b387> 16355 <b388> <b388> 9449 <b389> <b38b> 16363 <b38c> <b38c> 9445 <b38d> <b38d> 16366 <b38e> <b38e> 8698 <b38f> <b3a0> 16367 <b3a1> <b3fe> 1222 <b440> <b453> 16385 <b454> <b454> 8520 <b455> <b457> 16405 <b458> <b458> 9444 <b459> <b45d> 16408 <b45e> <b45e> 9446 <b45f> <b45f> 8439 <b460> <b460> 16413 <b461> <b461> 8299 <b462> <b474> 16414 <b475> <b475> 8871 <b476> <b47d> 16433 <b47e> <b47e> 9452 <b480> <b482> 16441 <b483> <b483> 9451 <b484> <b488> 16444 <b489> <b489> 9443 <b48a> <b492> 16449 <b493> <b493> 9450 <b494> <b4a0> 16458 <b4a1> <b4fe> 1316 <b540> <b540> 16471 <b541> <b541> 7826 <b542> <b54a> 16472 <b54b> <b54b> 7719 <b54c> <b555> 16481 <b556> <b556> 8166 <b557> <b559> 16491 <b55a> <b55a> 9447 <b55b> <b55b> 8210 <b55c> <b55c> 7916 <b55d> <b560> 16494 <b561> <b561> 9448 <b562> <b57e> 16498 <b580> <b59b> 16527 <b59c> <b59c> 8038 <b59d> <b59d> 9436 <b59e> <b5a0> 16555 <b5a1> <b5fe> 1410 <b640> <b651> 16558 <b652> <b652> 9890 <b653> <b654> 16576 <b655> <b655> 9437 <b656> <b658> 16578 <b659> <b659> 8206 <b65a> <b65a> 16581 <b65b> <b65b> 9435 <b65c> <b65c> 7864 <b65d> <b67e> 16582 <b680> <b6a0> 16616 <b6a1> <b6fe> 1504 <b740> <b74d> 16649 <b74e> <b74e> 8853 <b74f> <b750> 16663 <b751> <b751> 7808 <b752> <b758> 16665 <b759> <b759> 9847 <b75a> <b763> 16672 <b764> <b764> 9764 <b765> <b765> 8041 <b766> <b766> 8747 <b767> <b776> 16682 <b777> <b777> 9599 <b778> <b778> 8027 <b779> <b77e> 16698 <b780> <b780> 8603 <b781> <b781> 16704 <b782> <b782> 9853 <b783> <b7a0> 16705 <b7a1> <b7fe> 1598 <b840> <b842> 16735 <b843> <b843> 8608 <b844> <b844> 8582 <b845> <b845> 16738 <b846> <b846> 8429 <b847> <b84c> 16739 endcidrange 100 begincidrange <b84d> <b84d> 9657 <b84e> <b850> 16745 <b851> <b851> 8170 <b852> <b859> 16748 <b85a> <b85a> 7844 <b85b> <b85b> 8417 <b85c> <b85c> 16756 <b85d> <b85d> 9656 <b85e> <b85e> 8800 <b85f> <b85f> 16757 <b860> <b860> 8418 <b861> <b876> 16758 <b877> <b877> 8513 <b878> <b87e> 16780 <b880> <b881> 16787 <b882> <b882> 8135 <b883> <b8a0> 16789 <b8a1> <b8fe> 1692 <b940> <b94f> 16819 <b950> <b950> 7745 <b951> <b960> 16835 <b961> <b961> 9700 <b962> <b97a> 16851 <b97b> <b97b> 8070 <b97c> <b97e> 16876 <b980> <b99c> 16879 <b99d> <b99d> 8115 <b99e> <b99f> 16908 <b9a0> <b9a0> 7919 <b9a1> <b9fe> 1786 <ba40> <ba41> 16910 <ba42> <ba42> 8868 <ba43> <ba43> 16912 <ba44> <ba44> 9704 <ba45> <ba55> 16913 <ba56> <ba56> 9699 <ba57> <ba58> 16930 <ba59> <ba59> 8465 <ba5a> <ba5f> 16932 <ba60> <ba60> 9702 <ba61> <ba69> 16938 <ba6a> <ba6a> 9703 <ba6b> <ba73> 16947 <ba74> <ba74> 8257 <ba75> <ba7e> 16956 <ba80> <ba83> 16966 <ba84> <ba84> 9706 <ba85> <ba85> 16970 <ba86> <ba86> 8079 <ba87> <ba87> 16971 <ba88> <ba88> 9708 <ba89> <ba8c> 16972 <ba8d> <ba8d> 9707 <ba8e> <ba9d> 16976 <ba9e> <ba9e> 8400 <ba9f> <ba9f> 8221 <baa0> <baa0> 16992 <baa1> <bafe> 1880 <bb40> <bb40> 8183 <bb41> <bb48> 16993 <bb49> <bb49> 7821 <bb4a> <bb57> 17001 <bb58> <bb58> 9705 <bb59> <bb5a> 17015 <bb5b> <bb5b> 9710 <bb5c> <bb5c> 8250 <bb5d> <bb5f> 17017 <bb60> <bb60> 9875 <bb61> <bb64> 17020 <bb65> <bb65> 9701 <bb66> <bb66> 9709 <bb67> <bb67> 17024 <bb68> <bb68> 8201 <bb69> <bb69> 17025 <bb6a> <bb6a> 8293 <bb6b> <bb6d> 17026 <bb6e> <bb6e> 9891 <bb6f> <bb7e> 17029 <bb80> <bba0> 17045 <bba1> <bbfe> 1974 <bc40> <bc51> 17078 <bc52> <bc52> 9717 <bc53> <bc53> 7932 <bc54> <bc59> 17096 <bc5a> <bc5a> 8228 <bc5b> <bc60> 17102 <bc61> <bc61> 9883 <bc62> <bc62> 17108 <bc63> <bc63> 9715 <bc64> <bc64> 17109 <bc65> <bc65> 8921 <bc66> <bc66> 17110 <bc67> <bc67> 9716 <bc68> <bc68> 17111 <bc69> <bc69> 9243 <bc6a> <bc6c> 17112 <bc6d> <bc6d> 8136 <bc6e> <bc6e> 17115 <bc6f> <bc6f> 8059 <bc70> <bc70> 17116 endcidrange 100 begincidrange <bc71> <bc71> 9245 <bc72> <bc72> 17117 <bc73> <bc73> 8780 <bc74> <bc74> 8008 <bc75> <bc75> 9244 <bc76> <bc77> 9246 <bc78> <bc78> 8447 <bc79> <bc79> 8602 <bc7a> <bc7a> 17118 <bc7b> <bc7b> 8337 <bc7c> <bc7d> 17119 <bc7e> <bc7e> 8359 <bc80> <bc81> 17121 <bc82> <bc82> 9251 <bc83> <bc83> 7835 <bc84> <bc84> 9250 <bc85> <bc85> 17123 <bc86> <bc86> 8464 <bc87> <bc87> 17124 <bc88> <bc88> 8845 <bc89> <bc89> 8049 <bc8a> <bc8a> 7928 <bc8b> <bc8b> 9249 <bc8c> <bc8e> 17125 <bc8f> <bc8f> 7923 <bc90> <bc99> 17128 <bc9a> <bc9a> 8625 <bc9b> <bc9b> 9254 <bc9c> <bc9c> 9253 <bc9d> <bc9d> 8480 <bc9e> <bca0> 17138 <bca1> <bcfe> 2068 <bd40> <bd41> 17141 <bd42> <bd42> 8474 <bd43> <bd43> 9252 <bd44> <bd44> 17143 <bd45> <bd45> 9256 <bd46> <bd47> 17144 <bd48> <bd48> 9258 <bd49> <bd49> 9257 <bd4a> <bd4a> 17146 <bd4b> <bd4b> 8852 <bd4c> <bd4c> 17147 <bd4d> <bd4d> 8894 <bd4e> <bd4e> 17148 <bd4f> <bd4f> 7729 <bd50> <bd56> 17149 <bd57> <bd57> 9260 <bd58> <bd58> 17156 <bd59> <bd59> 8117 <bd5a> <bd65> 17157 <bd66> <bd66> 9259 <bd67> <bd67> 8111 <bd68> <bd69> 17169 <bd6a> <bd6a> 8296 <bd6b> <bd6b> 8676 <bd6c> <bd6e> 17171 <bd6f> <bd6f> 7969 <bd70> <bd70> 17174 <bd71> <bd71> 8449 <bd72> <bd78> 17175 <bd79> <bd79> 8572 <bd7a> <bd7a> 8522 <bd7b> <bd7b> 9261 <bd7c> <bd7d> 17182 <bd7e> <bd7e> 8148 <bd80> <bd80> 17184 <bd81> <bd81> 8145 <bd82> <bd88> 17185 <bd89> <bd89> 7731 <bd8a> <bd8a> 17192 <bd8b> <bd8b> 9263 <bd8c> <bd8d> 17193 <bd8e> <bd8e> 9262 <bd8f> <bd8f> 17195 <bd90> <bd90> 9264 <bd91> <bd91> 8667 <bd92> <bd96> 17196 <bd97> <bd97> 8536 <bd98> <bd9a> 17201 <bd9b> <bd9b> 8130 <bd9c> <bda0> 17204 <bda1> <bdfe> 2162 <be40> <be42> 17209 <be43> <be43> 8889 <be44> <be44> 17212 <be45> <be45> 9270 <be46> <be48> 17213 <be49> <be49> 7822 <be4a> <be4a> 9273 <be4b> <be50> 17216 <be51> <be51> 8645 <be52> <be52> 9271 <be53> <be53> 8594 <be54> <be54> 17222 <be55> <be55> 9274 <be56> <be56> 7961 <be57> <be57> 8588 <be58> <be58> 7744 <be59> <be59> 8883 endcidrange 100 begincidrange <be5a> <be5c> 17223 <be5d> <be5d> 8287 <be5e> <be5e> 9272 <be5f> <be5f> 9266 <be60> <be60> 8820 <be61> <be61> 17226 <be62> <be62> 7836 <be63> <be63> 9265 <be64> <be64> 8325 <be65> <be68> 17227 <be69> <be69> 9269 <be6a> <be6b> 17231 <be6c> <be6c> 9275 <be6d> <be6e> 17233 <be6f> <be6f> 8119 <be70> <be70> 9267 <be71> <be75> 17235 <be76> <be76> 8276 <be77> <be77> 8670 <be78> <be78> 17240 <be79> <be79> 9268 <be7a> <be7b> 17241 <be7c> <be7c> 9277 <be7d> <be7d> 8073 <be7e> <be7e> 9276 <be80> <be82> 17243 <be83> <be83> 8046 <be84> <be84> 7896 <be85> <be85> 17246 <be86> <be86> 7871 <be87> <be87> 9285 <be88> <be88> 17247 <be89> <be89> 8777 <be8a> <be8b> 17248 <be8c> <be8c> 9281 <be8d> <be8d> 17250 <be8e> <be8e> 7751 <be8f> <be8f> 8022 <be90> <be91> 17251 <be92> <be92> 8326 <be93> <be94> 17253 <be95> <be95> 8598 <be96> <be96> 17255 <be97> <be97> 9283 <be98> <be98> 9279 <be99> <be99> 17256 <be9a> <be9a> 8227 <be9b> <be9b> 17257 <be9c> <be9c> 9282 <be9d> <be9e> 17258 <be9f> <be9f> 9278 <bea0> <bea0> 17260 <bea1> <befe> 2256 <bf40> <bf40> 9894 <bf41> <bf4c> 17261 <bf4d> <bf4d> 9038 <bf4e> <bf4e> 9286 <bf4f> <bf4f> 9291 <bf50> <bf50> 9284 <bf51> <bf54> 17273 <bf55> <bf55> 9255 <bf56> <bf56> 9292 <bf57> <bf5f> 17277 <bf60> <bf60> 7951 <bf61> <bf61> 17286 <bf62> <bf62> 9287 <bf63> <bf63> 9289 <bf64> <bf64> 9288 <bf65> <bf67> 17287 <bf68> <bf68> 8642 <bf69> <bf6b> 17290 <bf6c> <bf6c> 8558 <bf6d> <bf6f> 17293 <bf70> <bf70> 7939 <bf71> <bf71> 17296 <bf72> <bf72> 9290 <bf73> <bf73> 8540 <bf74> <bf75> 17297 <bf76> <bf76> 8891 <bf77> <bf77> 9296 <bf78> <bf78> 17299 <bf79> <bf79> 9876 <bf7a> <bf7a> 9295 <bf7b> <bf7b> 9718 <bf7c> <bf7c> 8273 <bf7d> <bf7d> 17300 <bf7e> <bf7e> 9294 <bf80> <bf81> 17301 <bf82> <bf82> 8890 <bf83> <bf83> 8045 <bf84> <bf88> 17303 <bf89> <bf89> 9298 <bf8a> <bf8a> 9297 <bf8b> <bf94> 17308 <bf95> <bf95> 9301 <bf96> <bf96> 17318 <bf97> <bf97> 8841 <bf98> <bf98> 8470 <bf99> <bf9c> 17319 <bf9d> <bf9d> 9300 endcidrange 100 begincidrange <bf9e> <bfa0> 17323 <bfa1> <bffe> 2350 <c040> <c040> 8443 <c041> <c043> 17326 <c044> <c044> 9280 <c045> <c04a> 17329 <c04b> <c04b> 8486 <c04c> <c04c> 8033 <c04d> <c04d> 9885 <c04e> <c04e> 17335 <c04f> <c04f> 8074 <c050> <c050> 9302 <c051> <c051> 9305 <c052> <c052> 9304 <c053> <c054> 17336 <c055> <c055> 8110 <c056> <c05a> 17338 <c05b> <c05b> 8730 <c05c> <c05d> 17343 <c05e> <c05e> 8058 <c05f> <c05f> 9293 <c060> <c060> 9303 <c061> <c068> 17345 <c069> <c069> 9299 <c06a> <c06a> 17353 <c06b> <c06b> 9248 <c06c> <c06c> 17354 <c06d> <c06d> 8671 <c06e> <c06e> 9861 <c06f> <c06f> 17355 <c070> <c070> 7790 <c071> <c073> 17356 <c074> <c074> 8740 <c075> <c075> 9840 <c076> <c076> 17359 <c077> <c077> 8634 <c078> <c078> 17360 <c079> <c079> 9306 <c07a> <c07b> 17361 <c07c> <c07c> 8191 <c07d> <c07e> 17363 <c080> <c09a> 17365 <c09b> <c09b> 9698 <c09c> <c09c> 17392 <c09d> <c09d> 9882 <c09e> <c0a0> 17393 <c0a1> <c0fe> 2444 <c140> <c14f> 17396 <c150> <c150> 7914 <c151> <c153> 17412 <c154> <c154> 7724 <c155> <c15e> 17415 <c15f> <c15f> 8290 <c160> <c160> 9457 <c161> <c161> 17425 <c162> <c162> 9458 <c163> <c174> 17426 <c175> <c175> 9714 <c176> <c177> 17444 <c178> <c178> 8725 <c179> <c17e> 17446 <c180> <c194> 17452 <c195> <c195> 8622 <c196> <c1a0> 17473 <c1a1> <c1fe> 2538 <c240> <c24d> 17484 <c24e> <c24e> 8416 <c24f> <c264> 17498 <c265> <c265> 9666 <c266> <c266> 17520 <c267> <c267> 9665 <c268> <c27c> 17521 <c27d> <c27d> 8488 <c27e> <c27e> 17542 <c280> <c283> 17543 <c284> <c284> 8601 <c285> <c292> 17547 <c293> <c293> 8215 <c294> <c294> 7840 <c295> <c295> 8485 <c296> <c296> 8525 <c297> <c297> 17561 <c298> <c298> 9668 <c299> <c299> 8349 <c29a> <c29a> 8842 <c29b> <c29b> 17562 <c29c> <c29c> 9667 <c29d> <c29f> 17563 <c2a0> <c2a0> 8569 <c2a1> <c2fe> 2632 <c340> <c340> 8248 <c341> <c342> 17566 <c343> <c343> 8533 <c344> <c37a> 17568 <c37b> <c37b> 8658 <c37c> <c37e> 17623 <c380> <c383> 17626 <c384> <c384> 9415 <c385> <c39a> 17630 <c39b> <c39b> 8825 endcidrange 100 begincidrange <c39c> <c3a0> 17652 <c3a1> <c3fe> 2726 <c440> <c448> 17657 <c449> <c449> 8483 <c44a> <c44b> 17666 <c44c> <c44c> 9413 <c44d> <c453> 17668 <c454> <c454> 9417 <c455> <c457> 17675 <c458> <c458> 8340 <c459> <c45a> 17678 <c45b> <c45b> 8854 <c45c> <c462> 17680 <c463> <c463> 7799 <c464> <c476> 17687 <c477> <c477> 7942 <c478> <c479> 17706 <c47a> <c47a> 8101 <c47b> <c47e> 17708 <c480> <c480> 17712 <c481> <c481> 8345 <c482> <c490> 17713 <c491> <c491> 7853 <c492> <c492> 9416 <c493> <c493> 8360 <c494> <c497> 17728 <c498> <c498> 8223 <c499> <c499> 17732 <c49a> <c49a> 8389 <c49b> <c49b> 17733 <c49c> <c49c> 9418 <c49d> <c4a0> 17734 <c4a1> <c4fe> 2820 <c540> <c543> 17738 <c544> <c544> 8176 <c545> <c545> 17742 <c546> <c546> 9414 <c547> <c54a> 17743 <c54b> <c54b> 8797 <c54c> <c54c> 8926 <c54d> <c551> 17747 <c552> <c552> 8236 <c553> <c55e> 17752 <c55f> <c55f> 8545 <c560> <c562> 17764 <c563> <c563> 8763 <c564> <c564> 8665 <c565> <c565> 8139 <c566> <c566> 8137 <c567> <c57e> 17767 <c580> <c592> 17791 <c593> <c593> 7777 <c594> <c59b> 17810 <c59c> <c59c> 9711 <c59d> <c59d> 17818 <c59e> <c59e> 8088 <c59f> <c5a0> 17819 <c5a1> <c5fe> 2914 <c640> <c640> 17821 <c641> <c641> 9712 <c642> <c643> 17822 <c644> <c644> 8072 <c645> <c646> 17824 <c647> <c647> 8696 <c648> <c662> 17826 <c663> <c663> 8994 <c664> <c671> 17853 <c672> <c672> 9014 <c673> <c67e> 17867 <c680> <c6a0> 17879 <c6a1> <c6fe> 3008 <c740> <c765> 17912 <c766> <c766> 8875 <c767> <c76e> 17950 <c76f> <c76f> 8127 <c770> <c775> 17958 <c776> <c776> 8061 <c777> <c77a> 17964 <c77b> <c77b> 9011 <c77c> <c77e> 17968 <c780> <c7a0> 17971 <c7a1> <c7fe> 3102 <c840> <c840> 18004 <c841> <c841> 8013 <c842> <c84e> 18005 <c84f> <c84f> 9012 <c850> <c851> 18018 <c852> <c852> 8177 <c853> <c865> 18020 <c866> <c866> 8587 <c867> <c86d> 18039 <c86e> <c86e> 9033 <c86f> <c87d> 18046 <c87e> <c87e> 8715 <c880> <c886> 18061 <c887> <c887> 9030 <c888> <c891> 18068 <c892> <c892> 9031 <c893> <c893> 18078 <c894> <c894> 8595 endcidrange 100 begincidrange <c895> <c898> 18079 <c899> <c899> 9889 <c89a> <c89c> 18083 <c89d> <c89d> 8034 <c89e> <c8a0> 18086 <c8a1> <c8fe> 3196 <c940> <c94e> 18089 <c94f> <c94f> 9037 <c950> <c950> 9032 <c951> <c96d> 18104 <c96e> <c96e> 7776 <c96f> <c96f> 18133 <c970> <c970> 9029 <c971> <c976> 18134 <c977> <c977> 7954 <c978> <c97e> 18140 <c980> <c98e> 18147 <c98f> <c98f> 8216 <c990> <c990> 9013 <c991> <c99b> 18162 <c99c> <c99c> 9020 <c99d> <c9a0> 18173 <c9a1> <c9fe> 3290 <ca40> <ca4d> 18177 <ca4e> <ca4e> 9839 <ca4f> <ca55> 18191 <ca56> <ca56> 9041 <ca57> <ca58> 18198 <ca59> <ca59> 8096 <ca5a> <ca5b> 18200 <ca5c> <ca5c> 9016 <ca5d> <ca60> 18202 <ca61> <ca61> 8731 <ca62> <ca6d> 18206 <ca6e> <ca6e> 9026 <ca6f> <ca71> 18218 <ca72> <ca72> 9039 <ca73> <ca76> 18221 <ca77> <ca77> 9021 <ca78> <ca7a> 18225 <ca7b> <ca7b> 9028 <ca7c> <ca7c> 9009 <ca7d> <ca7d> 18228 <ca7e> <ca7e> 9035 <ca80> <ca80> 18229 <ca81> <ca81> 9019 <ca82> <ca88> 18230 <ca89> <ca89> 9040 <ca8a> <ca8d> 18237 <ca8e> <ca8e> 7860 <ca8f> <ca8f> 8614 <ca90> <ca91> 18241 <ca92> <ca92> 8651 <ca93> <ca99> 18243 <ca9a> <ca9a> 9045 <ca9b> <caa0> 18250 <caa1> <cafe> 3384 <cb40> <cb42> 18256 <cb43> <cb43> 9022 <cb44> <cb44> 18259 <cb45> <cb45> 8052 <cb46> <cb46> 18260 <cb47> <cb47> 9008 <cb48> <cb4a> 18261 <cb4b> <cb4b> 9856 <cb4c> <cb4d> 18264 <cb4e> <cb4e> 8410 <cb4f> <cb56> 18266 <cb57> <cb57> 9034 <cb58> <cb5c> 18274 <cb5d> <cb5d> 8081 <cb5e> <cb5e> 18279 <cb5f> <cb5f> 8455 <cb60> <cb69> 18280 <cb6a> <cb6a> 9023 <cb6b> <cb7a> 18290 <cb7b> <cb7b> 8180 <cb7c> <cb7c> 9027 <cb7d> <cb7e> 18306 <cb80> <cb86> 18308 <cb87> <cb87> 8722 <cb88> <cb8d> 18315 <cb8e> <cb8e> 8711 <cb8f> <cb91> 18321 <cb92> <cb92> 9049 <cb93> <cb9b> 18324 <cb9c> <cb9c> 8788 <cb9d> <cb9d> 18333 <cb9e> <cb9e> 9010 <cb9f> <cba0> 18334 <cba1> <cbfe> 3478 <cc40> <cc40> 7718 <cc41> <cc41> 9047 <cc42> <cc48> 18336 <cc49> <cc49> 9048 <cc4a> <cc4a> 8258 <cc4b> <cc4b> 8531 <cc4c> <cc4e> 18343 <cc4f> <cc4f> 8379 <cc50> <cc5b> 18346 endcidrange 100 begincidrange <cc5c> <cc5c> 9050 <cc5d> <cc5f> 18358 <cc60> <cc60> 9046 <cc61> <cc63> 18361 <cc64> <cc64> 9015 <cc65> <cc6c> 18364 <cc6d> <cc6d> 8185 <cc6e> <cc78> 18372 <cc79> <cc79> 9043 <cc7a> <cc7c> 18383 <cc7d> <cc7d> 8289 <cc7e> <cc7e> 18386 <cc80> <cc8d> 18387 <cc8e> <cc8e> 7829 <cc8f> <cc93> 18401 <cc94> <cc94> 8265 <cc95> <cc95> 18406 <cc96> <cc96> 8002 <cc97> <cc9c> 18407 <cc9d> <cc9d> 8168 <cc9e> <cca0> 18413 <cca1> <ccfe> 3572 <cd40> <cd7e> 18416 <cd80> <cd8f> 18479 <cd90> <cd90> 9690 <cd91> <cd97> 18495 <cd98> <cd98> 9687 <cd99> <cda0> 18502 <cda1> <cdfe> 3666 <ce40> <ce66> 18510 <ce67> <ce67> 8494 <ce68> <ce71> 18549 <ce72> <ce72> 8626 <ce73> <ce7e> 18559 <ce80> <ce80> 18571 <ce81> <ce81> 8606 <ce82> <ce86> 18572 <ce87> <ce87> 9692 <ce88> <ce9a> 18577 <ce9b> <ce9b> 8300 <ce9c> <ce9d> 18596 <ce9e> <ce9e> 8742 <ce9f> <cea0> 18598 <cea1> <cefe> 3760 <cf40> <cf4d> 18600 <cf4e> <cf4e> 9696 <cf4f> <cf54> 18614 <cf55> <cf55> 8827 <cf56> <cf57> 18620 <cf58> <cf58> 9694 <cf59> <cf5b> 18622 <cf5c> <cf5c> 9697 <cf5d> <cf6b> 18625 <cf6c> <cf6c> 9685 <cf6d> <cf72> 18640 <cf73> <cf73> 7787 <cf74> <cf74> 18646 <cf75> <cf75> 9691 <cf76> <cf77> 18647 <cf78> <cf78> 7817 <cf79> <cf7b> 18649 <cf7c> <cf7c> 9689 <cf7d> <cf7e> 18652 <cf80> <cf80> 18654 <cf81> <cf81> 8721 <cf82> <cf88> 18655 <cf89> <cf89> 8745 <cf8a> <cf8a> 9686 <cf8b> <cf92> 18662 <cf93> <cf93> 9693 <cf94> <cf94> 9695 <cf95> <cf9d> 18670 <cf9e> <cf9e> 8175 <cf9f> <cf9f> 18679 <cfa0> <cfa0> 9688 <cfa1> <cffe> 3854 <d040> <d04c> 18680 <d04d> <d04d> 7977 <d04e> <d050> 18693 <d051> <d051> 7771 <d052> <d054> 18696 <d055> <d055> 8310 <d056> <d05b> 18699 <d05c> <d05c> 8855 <d05d> <d05f> 18705 <d060> <d060> 9872 <d061> <d066> 18708 <d067> <d067> 8511 <d068> <d06b> 18714 <d06c> <d06c> 8600 <d06d> <d06d> 18718 <d06e> <d06e> 7816 <d06f> <d07c> 18719 <d07d> <d07d> 8844 <d07e> <d07e> 18733 <d080> <d0a0> 18734 <d0a1> <d0fe> 3948 <d140> <d154> 18767 <d155> <d155> 9713 <d156> <d158> 18788 endcidrange 100 begincidrange <d159> <d159> 8204 <d15a> <d160> 18791 <d161> <d161> 7768 <d162> <d162> 8876 <d163> <d174> 18798 <d175> <d175> 9895 <d176> <d17c> 18816 <d17d> <d17d> 9846 <d17e> <d17e> 18823 <d180> <d19c> 18824 <d19d> <d19d> 8161 <d19e> <d19e> 9659 <d19f> <d1a0> 18853 <d1a1> <d1fe> 4042 <d240> <d240> 9662 <d241> <d242> 18855 <d243> <d243> 8925 <d244> <d24c> 18857 <d24d> <d24d> 9661 <d24e> <d25b> 18866 <d25c> <d25c> 7722 <d25d> <d262> 18880 <d263> <d263> 9660 <d264> <d264> 9658 <d265> <d267> 18886 <d268> <d268> 9663 <d269> <d26c> 18889 <d26d> <d26d> 8583 <d26e> <d26e> 18893 <d26f> <d26f> 9835 <d270> <d271> 18894 <d272> <d272> 7807 <d273> <d274> 18896 <d275> <d275> 8621 <d276> <d27e> 18898 <d280> <d289> 18907 <d28a> <d28a> 8086 <d28b> <d28d> 18917 <d28e> <d28e> 7986 <d28f> <d291> 18920 <d292> <d292> 8324 <d293> <d294> 18923 <d295> <d295> 8502 <d296> <d296> 18925 <d297> <d297> 9400 <d298> <d29f> 18926 <d2a0> <d2a0> 9402 <d2a1> <d2fe> 4136 <d340> <d343> 18934 <d344> <d344> 9404 <d345> <d347> 18938 <d348> <d348> 8420 <d349> <d349> 18941 <d34a> <d34a> 9401 <d34b> <d34c> 18942 <d34d> <d34d> 9405 <d34e> <d34f> 18944 <d350> <d350> 9406 <d351> <d354> 18946 <d355> <d355> 9407 <d356> <d357> 18950 <d358> <d358> 8146 <d359> <d35a> 18952 <d35b> <d35b> 8189 <d35c> <d35c> 18954 <d35d> <d35d> 9403 <d35e> <d35e> 7981 <d35f> <d377> 18955 <d378> <d378> 9737 <d379> <d379> 18980 <d37a> <d37a> 9738 <d37b> <d37b> 18981 <d37c> <d37c> 7828 <d37d> <d37e> 18982 <d380> <d384> 18984 <d385> <d385> 8927 <d386> <d386> 7883 <d387> <d387> 7949 <d388> <d38a> 18989 <d38b> <d38b> 8055 <d38c> <d38c> 18992 <d38d> <d38d> 8683 <d38e> <d38e> 18993 <d38f> <d38f> 8929 <d390> <d390> 18994 <d391> <d391> 8559 <d392> <d392> 18995 <d393> <d393> 8928 <d394> <d395> 18996 <d396> <d396> 8682 <d397> <d397> 18998 <d398> <d398> 8930 <d399> <d399> 8395 <d39a> <d39a> 18999 <d39b> <d39b> 8056 <d39c> <d39d> 19000 <d39e> <d39e> 7906 <d39f> <d39f> 19002 <d3a0> <d3a0> 8690 <d3a1> <d3fe> 4230 endcidrange 100 begincidrange <d440> <d440> 19003 <d441> <d441> 8528 <d442> <d444> 19004 <d445> <d445> 8147 <d446> <d446> 19007 <d447> <d447> 8933 <d448> <d44b> 19008 <d44c> <d44c> 7922 <d44d> <d44e> 19012 <d44f> <d44f> 8479 <d450> <d452> 19014 <d453> <d453> 8669 <d454> <d455> 19017 <d456> <d456> 8532 <d457> <d457> 19019 <d458> <d458> 8935 <d459> <d45b> 19020 <d45c> <d45c> 8834 <d45d> <d461> 19023 <d462> <d462> 8934 <d463> <d466> 19028 <d467> <d467> 8936 <d468> <d46d> 19032 <d46e> <d46e> 8932 <d46f> <d46f> 19038 <d470> <d470> 8810 <d471> <d471> 19039 <d472> <d472> 8939 <d473> <d473> 19040 <d474> <d474> 8937 <d475> <d475> 8381 <d476> <d477> 19041 <d478> <d478> 8938 <d479> <d47a> 19043 <d47b> <d47b> 8893 <d47c> <d47d> 19045 <d47e> <d47e> 7838 <d480> <d481> 19047 <d482> <d482> 8950 <d483> <d483> 8679 <d484> <d484> 8726 <d485> <d486> 19049 <d487> <d487> 8503 <d488> <d489> 19051 <d48a> <d48a> 8492 <d48b> <d48b> 19053 <d48c> <d48c> 7784 <d48d> <d48d> 8946 <d48e> <d48e> 7991 <d48f> <d48f> 8947 <d490> <d490> 19054 <d491> <d491> 8943 <d492> <d492> 8016 <d493> <d493> 7952 <d494> <d494> 8648 <d495> <d495> 19055 <d496> <d496> 8945 <d497> <d49b> 19056 <d49c> <d49c> 8944 <d49d> <d49e> 19061 <d49f> <d49f> 8942 <d4a0> <d4a0> 19063 <d4a1> <d4fe> 4324 <d540> <d542> 19064 <d543> <d543> 8941 <d544> <d544> 8862 <d545> <d545> 8940 <d546> <d546> 8162 <d547> <d549> 19067 <d54a> <d54a> 8446 <d54b> <d54d> 19070 <d54e> <d54f> 8953 <d550> <d550> 19073 <d551> <d551> 7855 <d552> <d553> 19074 <d554> <d554> 8758 <d555> <d555> 19076 <d556> <d556> 8951 <d557> <d559> 19077 <d55a> <d55a> 8765 <d55b> <d55b> 19080 <d55c> <d55c> 7810 <d55d> <d55d> 8118 <d55e> <d55e> 19081 <d55f> <d55f> 8612 <d560> <d560> 8618 <d561> <d561> 8952 <d562> <d562> 8529 <d563> <d563> 19082 <d564> <d564> 8032 <d565> <d567> 19083 <d568> <d568> 8519 <d569> <d56b> 19086 <d56c> <d56c> 8517 <d56d> <d56d> 19089 <d56e> <d56e> 8156 <d56f> <d571> 19090 <d572> <d572> 8961 <d573> <d574> 19093 <d575> <d575> 7925 endcidrange 100 begincidrange <d576> <d577> 19095 <d578> <d578> 8728 <d579> <d57a> 19097 <d57b> <d57b> 7878 <d57c> <d57d> 19099 <d57e> <d57e> 8960 <d580> <d580> 19101 <d581> <d581> 8884 <d582> <d583> 19102 <d584> <d584> 8553 <d585> <d585> 19104 <d586> <d586> 8957 <d587> <d587> 19105 <d588> <d588> 8426 <d589> <d589> 19106 <d58a> <d58a> 8948 <d58b> <d58b> 19107 <d58c> <d58c> 8955 <d58d> <d58d> 19108 <d58e> <d58e> 8956 <d58f> <d58f> 8231 <d590> <d592> 19109 <d593> <d593> 8288 <d594> <d594> 8959 <d595> <d597> 19112 <d598> <d598> 8958 <d599> <d599> 7879 <d59a> <d59a> 19115 <d59b> <d59b> 8972 <d59c> <d59e> 19116 <d59f> <d59f> 8949 <d5a0> <d5a0> 19119 <d5a1> <d5fe> 4418 <d640> <d640> 8966 <d641> <d641> 19120 <d642> <d642> 8970 <d643> <d643> 8659 <d644> <d646> 19121 <d647> <d647> 8963 <d648> <d648> 19124 <d649> <d649> 8967 <d64a> <d64a> 8971 <d64b> <d64c> 19125 <d64d> <d64d> 8031 <d64e> <d64e> 19127 <d64f> <d64f> 8969 <d650> <d651> 19128 <d652> <d652> 8962 <d653> <d653> 7940 <d654> <d654> 8861 <d655> <d655> 19130 <d656> <d656> 8699 <d657> <d657> 19131 <d658> <d658> 8968 <d659> <d659> 19132 <d65a> <d65a> 8364 <d65b> <d65b> 19133 <d65c> <d65c> 8334 <d65d> <d65d> 8965 <d65e> <d65e> 8599 <d65f> <d65f> 19134 <d660> <d660> 8561 <d661> <d661> 8856 <d662> <d664> 19135 <d665> <d665> 8023 <d666> <d668> 19138 <d669> <d669> 8322 <d66a> <d66a> 19141 <d66b> <d66b> 8977 <d66c> <d66e> 19142 <d66f> <d66f> 8964 <d670> <d670> 19145 <d671> <d671> 8975 <d672> <d672> 7733 <d673> <d673> 19146 <d674> <d674> 8401 <d675> <d675> 8976 <d676> <d676> 8099 <d677> <d677> 19147 <d678> <d678> 8662 <d679> <d67b> 19148 <d67c> <d67c> 8710 <d67d> <d67e> 19151 <d680> <d682> 19153 <d683> <d683> 8973 <d684> <d685> 19156 <d686> <d686> 8978 <d687> <d687> 8333 <d688> <d688> 8979 <d689> <d68d> 19158 <d68e> <d68e> 8931 <d68f> <d693> 19163 <d694> <d694> 8122 <d695> <d698> 19168 <d699> <d699> 8312 <d69a> <d6a0> 19172 <d6a1> <d6fe> 4512 <d740> <d742> 19179 <d743> <d743> 8840 <d744> <d747> 19182 endcidrange 100 begincidrange <d748> <d748> 8982 <d749> <d749> 8043 <d74a> <d74f> 19186 <d750> <d750> 8980 <d751> <d751> 19192 <d752> <d752> 8496 <d753> <d753> 8981 <d754> <d754> 8552 <d755> <d755> 19193 <d756> <d756> 8388 <d757> <d763> 19194 <d764> <d764> 8984 <d765> <d766> 19207 <d767> <d767> 8729 <d768> <d768> 8727 <d769> <d76b> 19209 <d76c> <d76c> 8405 <d76d> <d76e> 19212 <d76f> <d76f> 8010 <d770> <d774> 19214 <d775> <d775> 8768 <d776> <d777> 19219 <d778> <d778> 7891 <d779> <d77e> 19221 <d780> <d782> 19227 <d783> <d783> 7753 <d784> <d786> 19230 <d787> <d787> 9755 <d788> <d78a> 19233 <d78b> <d78b> 7789 <d78c> <d78c> 8440 <d78d> <d78d> 19236 <d78e> <d78e> 8187 <d78f> <d78f> 8985 <d790> <d794> 19237 <d795> <d795> 8974 <d796> <d796> 19242 <d797> <d797> 8983 <d798> <d7a0> 19243 <d7a1> <d7f9> 4606 <d840> <d84c> 19252 <d84d> <d84d> 8392 <d84e> <d852> 19265 <d853> <d853> 7933 <d854> <d87e> 19270 <d880> <d88f> 19313 <d890> <d890> 7739 <d891> <d891> 8831 <d892> <d892> 19329 <d893> <d893> 7948 <d894> <d894> 7769 <d895> <d895> 7972 <d896> <d899> 19330 <d89a> <d89a> 8378 <d89b> <d89b> 8037 <d89c> <d89c> 7920 <d89d> <d89d> 8548 <d89e> <d89e> 7984 <d89f> <d89f> 8801 <d8a0> <d8a0> 19334 <d8a1> <d8fe> 4695 <d940> <d940> 19335 <d941> <d941> 8866 <d942> <d942> 9387 <d943> <d943> 19336 <d944> <d944> 9391 <d945> <d945> 7912 <d946> <d946> 7993 <d947> <d947> 19337 <d948> <d948> 7752 <d949> <d949> 8304 <d94a> <d94a> 7848 <d94b> <d94b> 19338 <d94c> <d94c> 9388 <d94d> <d94d> 7927 <d94e> <d94e> 8566 <d94f> <d94f> 9389 <d950> <d950> 19339 <d951> <d951> 8315 <d952> <d952> 8005 <d953> <d953> 9386 <d954> <d954> 8267 <d955> <d955> 8239 <d956> <d956> 8026 <d957> <d957> 9392 <d958> <d958> 19340 <d959> <d959> 8887 <d95a> <d95a> 8063 <d95b> <d95b> 19341 <d95c> <d95c> 8805 <d95d> <d962> 19342 <d963> <d963> 9394 <d964> <d964> 8475 <d965> <d965> 7761 <d966> <d966> 19348 <d967> <d967> 9396 <d968> <d96b> 19349 <d96c> <d96c> 9395 <d96d> <d96d> 19353 <d96e> <d96e> 7839 endcidrange 100 begincidrange <d96f> <d96f> 19354 <d970> <d970> 8472 <d971> <d971> 19355 <d972> <d972> 8372 <d973> <d973> 9135 <d974> <d974> 8635 <d975> <d975> 8306 <d976> <d976> 8085 <d977> <d977> 19356 <d978> <d978> 7946 <d979> <d979> 9398 <d97a> <d97b> 19357 <d97c> <d97c> 8849 <d97d> <d97d> 9397 <d97e> <d97e> 8824 <d980> <d980> 7892 <d981> <d986> 19359 <d987> <d987> 8179 <d988> <d98c> 19365 <d98d> <d98d> 8873 <d98e> <d98e> 9399 <d98f> <d98f> 7976 <d990> <d990> 8457 <d991> <d991> 8903 <d992> <d996> 19370 <d997> <d997> 9390 <d998> <d998> 8881 <d999> <d99a> 19375 <d99b> <d99b> 8806 <d99c> <d99c> 19377 <d99d> <d99d> 8795 <d99e> <d99e> 8900 <d99f> <d99f> 19378 <d9a0> <d9a0> 8469 <d9a1> <d9fe> 4789 <da40> <da40> 19379 <da41> <da41> 8746 <da42> <da42> 9393 <da43> <da47> 19380 <da48> <da48> 8509 <da49> <da4c> 19385 <da4d> <da4d> 7957 <da4e> <da4e> 8796 <da4f> <da72> 19389 <da73> <da73> 7956 <da74> <da76> 19425 <da77> <da77> 8826 <da78> <da7e> 19428 <da80> <da84> 19435 <da85> <da85> 8430 <da86> <da8d> 19440 <da8e> <da8e> 9720 <da8f> <daa0> 19448 <daa1> <dafe> 4883 <db40> <db5f> 19466 <db60> <db60> 8084 <db61> <db77> 19498 <db78> <db78> 8752 <db79> <db7e> 19521 <db80> <db83> 19527 <db84> <db84> 9725 <db85> <db8a> 19531 <db8b> <db8b> 9728 <db8c> <db97> 19537 <db98> <db98> 9734 <db99> <dba0> 19549 <dba1> <dbfe> 4977 <dc40> <dc44> 19557 <dc45> <dc45> 9727 <dc46> <dc4e> 19562 <dc4f> <dc4f> 9724 <dc50> <dc50> 7820 <dc51> <dc51> 9730 <dc52> <dc52> 19571 <dc53> <dc53> 8781 <dc54> <dc54> 19572 <dc55> <dc55> 9732 <dc56> <dc56> 9726 <dc57> <dc57> 9731 <dc58> <dc5c> 19573 <dc5d> <dc5d> 9729 <dc5e> <dc61> 19578 <dc62> <dc62> 9733 <dc63> <dc65> 19582 <dc66> <dc66> 7843 <dc67> <dc67> 9736 <dc68> <dc6a> 19585 <dc6b> <dc6b> 9735 <dc6c> <dc7b> 19588 <dc7c> <dc7c> 8432 <dc7d> <dc7e> 19604 <dc80> <dc86> 19606 <dc87> <dc87> 7803 <dc88> <dc88> 8807 <dc89> <dc89> 7990 <dc8a> <dc8a> 8150 <dc8b> <dc8d> 19613 <dc8e> <dc8e> 8672 <dc8f> <dc8f> 19616 <dc90> <dc90> 9356 endcidrange 100 begincidrange <dc91> <dc96> 19617 <dc97> <dc97> 9357 <dc98> <dc9a> 19623 <dc9b> <dc9b> 8450 <dc9c> <dc9f> 19626 <dca0> <dca0> 9364 <dca1> <dcfe> 5071 <dd40> <dd45> 19630 <dd46> <dd46> 9363 <dd47> <dd4c> 19636 <dd4d> <dd4d> 9358 <dd4e> <dd52> 19642 <dd53> <dd53> 8857 <dd54> <dd54> 9361 <dd55> <dd55> 9366 <dd56> <dd56> 9359 <dd57> <dd57> 9362 <dd58> <dd58> 19647 <dd59> <dd59> 9367 <dd5a> <dd5d> 19648 <dd5e> <dd5e> 8113 <dd5f> <dd5f> 19652 <dd60> <dd60> 9370 <dd61> <dd61> 19653 <dd62> <dd62> 9369 <dd63> <dd63> 19654 <dd64> <dd64> 8792 <dd65> <dd65> 9368 <dd66> <dd6c> 19655 <dd6d> <dd6d> 9371 <dd6e> <dd6e> 19662 <dd6f> <dd6f> 7945 <dd70> <dd70> 8422 <dd71> <dd75> 19663 <dd76> <dd76> 8230 <dd77> <dd77> 9375 <dd78> <dd78> 8025 <dd79> <dd7a> 9373 <dd7b> <dd7e> 19668 <dd80> <dd80> 19672 <dd81> <dd81> 7995 <dd82> <dd82> 9372 <dd83> <dd84> 19673 <dd85> <dd85> 7738 <dd86> <dd86> 8283 <dd87> <dd8a> 19675 <dd8b> <dd8b> 8048 <dd8c> <dd8e> 19679 <dd8f> <dd8f> 9376 <dd90> <dd93> 19682 <dd94> <dd94> 8507 <dd95> <dd96> 19686 <dd97> <dd97> 7943 <dd98> <dd99> 19688 <dd9a> <dd9a> 8816 <dd9b> <dd9b> 8759 <dd9c> <dd9d> 19690 <dd9e> <dd9e> 9426 <dd9f> <dd9f> 19692 <dda0> <dda0> 8627 <dda1> <ddfe> 5165 <de40> <de40> 8773 <de41> <de41> 9377 <de42> <de43> 19693 <de44> <de44> 8872 <de45> <de47> 19695 <de48> <de48> 8828 <de49> <de49> 8112 <de4a> <de4e> 19698 <de4f> <de4f> 9378 <de50> <de59> 19703 <de5a> <de5a> 8006 <de5b> <de5b> 19713 <de5c> <de5c> 9088 <de5d> <de5d> 9365 <de5e> <de5e> 19714 <de5f> <de5f> 9360 <de60> <de6a> 19715 <de6b> <de6b> 7728 <de6c> <de6e> 19726 <de6f> <de6f> 7837 <de70> <de70> 7755 <de71> <de71> 7754 <de72> <de72> 8362 <de73> <de7e> 19729 <de80> <de91> 19741 <de92> <de92> 9851 <de93> <de9e> 19759 <de9f> <de9f> 9202 <dea0> <dea0> 19771 <dea1> <defe> 5259 <df40> <df40> 8830 <df41> <df41> 19772 <df42> <df42> 8217 <df43> <df4c> 19773 <df4d> <df4d> 8123 <df4e> <df5b> 19783 <df5c> <df5c> 8787 <df5d> <df5d> 19797 <df5e> <df5e> 7998 endcidrange 100 begincidrange <df5f> <df5f> 7846 <df60> <df60> 8590 <df61> <df63> 19798 <df64> <df64> 8684 <df65> <df65> 19801 <df66> <df66> 7870 <df67> <df67> 19802 <df68> <df68> 8778 <df69> <df6c> 19803 <df6d> <df6d> 8499 <df6e> <df73> 19807 <df74> <df74> 7812 <df75> <df76> 19813 <df77> <df77> 8399 <df78> <df78> 8674 <df79> <df79> 19815 <df7a> <df7a> 8719 <df7b> <df7b> 19816 <df7c> <df7c> 8233 <df7d> <df7d> 19817 <df7e> <df7e> 8307 <df80> <df80> 8021 <df81> <df82> 19818 <df83> <df83> 9201 <df84> <df84> 19820 <df85> <df85> 7750 <df86> <df88> 19821 <df89> <df89> 8291 <df8a> <df8a> 9203 <df8b> <dfa0> 19824 <dfa1> <dffe> 5353 <e040> <e04f> 19846 <e050> <e050> 8990 <e051> <e05c> 19862 <e05d> <e05d> 8755 <e05e> <e068> 19874 <e069> <e069> 8992 <e06a> <e06b> 19885 <e06c> <e06c> 8647 <e06d> <e074> 19887 <e075> <e075> 8892 <e076> <e076> 19895 <e077> <e077> 8988 <e078> <e078> 19896 <e079> <e079> 8785 <e07a> <e07e> 19897 <e080> <e086> 19902 <e087> <e087> 7867 <e088> <e08c> 19909 <e08d> <e08d> 8839 <e08e> <e08e> 19914 <e08f> <e08f> 8237 <e090> <e090> 7851 <e091> <e091> 19915 <e092> <e092> 8989 <e093> <e093> 19916 <e094> <e094> 8991 <e095> <e096> 19917 <e097> <e097> 8987 <e098> <e0a0> 19919 <e0a1> <e0fe> 5447 <e140> <e141> 19928 <e142> <e142> 8993 <e143> <e163> 19930 <e164> <e164> 8789 <e165> <e167> 19963 <e168> <e168> 7823 <e169> <e173> 19966 <e174> <e174> 8716 <e175> <e175> 8100 <e176> <e17e> 19977 <e180> <e183> 19986 <e184> <e184> 8347 <e185> <e185> 8664 <e186> <e186> 19990 <e187> <e187> 9722 <e188> <e188> 19991 <e189> <e189> 9721 <e18a> <e18b> 19992 <e18c> <e18c> 8500 <e18d> <e18d> 19994 <e18e> <e190> 9459 <e191> <e191> 9464 <e192> <e192> 19995 <e193> <e193> 9463 <e194> <e194> 7880 <e195> <e195> 9462 <e196> <e197> 19996 <e198> <e198> 8832 <e199> <e19d> 19998 <e19e> <e19e> 7877 <e19f> <e19f> 9467 <e1a0> <e1a0> 20003 <e1a1> <e1fe> 5541 <e240> <e240> 20004 <e241> <e241> 9466 <e242> <e242> 20005 <e243> <e243> 7917 <e244> <e24e> 20006 <e24f> <e24f> 9469 endcidrange 100 begincidrange <e250> <e250> 20017 <e251> <e251> 9465 <e252> <e252> 20018 <e253> <e253> 9470 <e254> <e254> 8397 <e255> <e259> 20019 <e25a> <e25a> 9480 <e25b> <e25b> 9476 <e25c> <e25d> 20024 <e25e> <e25e> 9478 <e25f> <e261> 20026 <e262> <e262> 9471 <e263> <e263> 8336 <e264> <e266> 20029 <e267> <e267> 7901 <e268> <e268> 7973 <e269> <e269> 20032 <e26a> <e26a> 9475 <e26b> <e26b> 9474 <e26c> <e26d> 20033 <e26e> <e26e> 7802 <e26f> <e26f> 8358 <e270> <e277> 20035 <e278> <e278> 8149 <e279> <e27c> 20043 <e27d> <e27d> 7953 <e27e> <e27e> 20047 <e280> <e280> 9479 <e281> <e281> 9472 <e282> <e282> 9477 <e283> <e288> 20048 <e289> <e289> 9497 <e28a> <e28a> 20054 <e28b> <e28b> 9493 <e28c> <e28d> 20055 <e28e> <e28e> 9484 <e28f> <e28f> 8241 <e290> <e291> 20057 <e292> <e292> 9483 <e293> <e293> 9487 <e294> <e294> 9498 <e295> <e295> 9481 <e296> <e297> 20059 <e298> <e298> 9486 <e299> <e299> 8756 <e29a> <e29a> 9491 <e29b> <e29b> 8064 <e29c> <e29f> 20061 <e2a0> <e2a0> 9473 <e2a1> <e2fe> 5635 <e340> <e341> 20065 <e342> <e342> 9495 <e343> <e343> 9494 <e344> <e346> 20067 <e347> <e347> 9496 <e348> <e34a> 20070 <e34b> <e34b> 7766 <e34c> <e34e> 20073 <e34f> <e34f> 9485 <e350> <e350> 20076 <e351> <e351> 8403 <e352> <e353> 20077 <e354> <e354> 8314 <e355> <e355> 8398 <e356> <e357> 20079 <e358> <e358> 9488 <e359> <e35b> 20081 <e35c> <e35c> 7765 <e35d> <e35f> 20084 <e360> <e360> 9482 <e361> <e365> 20087 <e366> <e367> 9489 <e368> <e370> 20092 <e371> <e371> 8106 <e372> <e372> 20101 <e373> <e373> 9502 <e374> <e374> 7967 <e375> <e377> 20102 <e378> <e378> 9517 <e379> <e379> 8733 <e37a> <e37b> 20105 <e37c> <e37c> 9522 <e37d> <e37d> 20107 <e37e> <e37e> 8571 <e380> <e389> 20108 <e38a> <e38a> 8623 <e38b> <e38b> 20118 <e38c> <e38c> 9516 <e38d> <e38e> 20119 <e38f> <e38f> 9512 <e390> <e390> 20121 <e391> <e391> 8332 <e392> <e392> 20122 <e393> <e393> 9519 <e394> <e394> 20123 <e395> <e395> 8636 <e396> <e398> 20124 <e399> <e399> 9501 <e39a> <e39b> 20127 <e39c> <e39c> 9525 endcidrange 100 begincidrange <e39d> <e39d> 20129 <e39e> <e39e> 8717 <e39f> <e39f> 9510 <e3a0> <e3a0> 20130 <e3a1> <e3fe> 5729 <e440> <e440> 9524 <e441> <e441> 9514 <e442> <e442> 9503 <e443> <e443> 9521 <e444> <e444> 9500 <e445> <e447> 20131 <e448> <e448> 9509 <e449> <e44d> 20134 <e44e> <e44e> 8653 <e44f> <e44f> 20139 <e450> <e450> 8666 <e451> <e451> 20140 <e452> <e452> 8562 <e453> <e453> 9534 <e454> <e457> 20141 <e458> <e458> 8271 <e459> <e459> 20145 <e45a> <e45a> 9539 <e45b> <e45b> 20146 <e45c> <e45c> 8663 <e45d> <e45d> 20147 <e45e> <e45e> 7740 <e45f> <e461> 20148 <e462> <e462> 9513 <e463> <e464> 20151 <e465> <e465> 9505 <e466> <e467> 20153 <e468> <e468> 7935 <e469> <e472> 20155 <e473> <e473> 9535 <e474> <e474> 20165 <e475> <e475> 9540 <e476> <e478> 20166 <e479> <e479> 9507 <e47a> <e47a> 7824 <e47b> <e47b> 9530 <e47c> <e47c> 9541 <e47d> <e47d> 20169 <e47e> <e47e> 9533 <e480> <e480> 20170 <e481> <e481> 8385 <e482> <e483> 20171 <e484> <e484> 8451 <e485> <e485> 9504 <e486> <e486> 9532 <e487> <e487> 9531 <e488> <e488> 9528 <e489> <e48c> 20173 <e48d> <e48d> 9536 <e48e> <e48e> 20177 <e48f> <e48f> 8141 <e490> <e492> 20178 <e493> <e493> 7960 <e494> <e497> 20181 <e498> <e498> 9547 <e499> <e49c> 20185 <e49d> <e49d> 9543 <e49e> <e49f> 9551 <e4a0> <e4a0> 20189 <e4a1> <e4fe> 5823 <e540> <e545> 20190 <e546> <e546> 8880 <e547> <e547> 20196 <e548> <e548> 9542 <e549> <e54a> 20197 <e54b> <e54b> 9548 <e54c> <e54d> 20199 <e54e> <e54e> 7834 <e54f> <e54f> 9554 <e550> <e550> 9520 <e551> <e551> 9545 <e552> <e554> 20201 <e555> <e555> 9553 <e556> <e556> 7882 <e557> <e557> 20204 <e558> <e558> 8402 <e559> <e55b> 20205 <e55c> <e55c> 8120 <e55d> <e55d> 20208 <e55e> <e55e> 8313 <e55f> <e560> 20209 <e561> <e561> 8619 <e562> <e563> 20211 <e564> <e564> 9549 <e565> <e565> 7845 <e566> <e567> 20213 <e568> <e568> 8268 <e569> <e569> 8320 <e56a> <e56b> 20215 <e56c> <e56c> 9837 <e56d> <e56d> 20217 <e56e> <e56e> 9527 <e56f> <e574> 20218 <e575> <e575> 9546 <e576> <e576> 8632 endcidrange 100 begincidrange <e577> <e577> 20224 <e578> <e578> 9550 <e579> <e57a> 20225 <e57b> <e57b> 9468 <e57c> <e57c> 9556 <e57d> <e57e> 20227 <e580> <e580> 20229 <e581> <e581> 7996 <e582> <e582> 20230 <e583> <e583> 7893 <e584> <e589> 20231 <e58a> <e58a> 9558 <e58b> <e58d> 20237 <e58e> <e58e> 8808 <e58f> <e590> 20240 <e591> <e591> 7894 <e592> <e599> 20242 <e59a> <e59a> 9559 <e59b> <e59b> 9555 <e59c> <e59e> 20250 <e59f> <e59f> 9544 <e5a0> <e5a0> 20253 <e5a1> <e5fe> 5917 <e640> <e640> 8412 <e641> <e643> 20254 <e644> <e644> 9561 <e645> <e648> 20257 <e649> <e649> 8087 <e64a> <e64a> 9557 <e64b> <e64d> 20261 <e64e> <e64e> 8829 <e64f> <e651> 20264 <e652> <e652> 9598 <e653> <e655> 20267 <e656> <e656> 8316 <e657> <e657> 20270 <e658> <e658> 9562 <e659> <e65a> 20271 <e65b> <e65b> 9566 <e65c> <e65d> 20273 <e65e> <e65e> 7732 <e65f> <e668> 20275 <e669> <e669> 8542 <e66a> <e66a> 20285 <e66b> <e66b> 9568 <e66c> <e674> 20286 <e675> <e675> 8610 <e676> <e676> 9044 <e677> <e678> 20295 <e679> <e679> 9571 <e67a> <e67a> 9511 <e67b> <e67b> 20297 <e67c> <e67c> 9518 <e67d> <e67d> 9560 <e67e> <e67e> 20298 <e680> <e680> 7963 <e681> <e681> 20299 <e682> <e682> 8835 <e683> <e683> 20300 <e684> <e684> 9572 <e685> <e686> 20301 <e687> <e687> 8352 <e688> <e688> 20303 <e689> <e689> 9573 <e68a> <e68b> 20304 <e68c> <e68c> 9569 <e68d> <e692> 20306 <e693> <e693> 9570 <e694> <e696> 20312 <e697> <e697> 9580 <e698> <e69a> 20315 <e69b> <e69b> 9581 <e69c> <e69c> 8224 <e69d> <e69e> 20318 <e69f> <e69f> 9567 <e6a0> <e6a0> 9578 <e6a1> <e6fe> 6011 <e740> <e742> 20320 <e743> <e743> 9582 <e744> <e747> 20323 <e748> <e748> 9529 <e749> <e749> 9564 <e74a> <e74c> 20327 <e74d> <e74e> 9576 <e74f> <e74f> 9579 <e750> <e750> 7791 <e751> <e751> 20330 <e752> <e752> 8132 <e753> <e753> 9575 <e754> <e754> 20331 <e755> <e755> 9563 <e756> <e758> 20332 <e759> <e759> 9757 <e75a> <e765> 20335 <e766> <e766> 9515 <e767> <e767> 20347 <e768> <e768> 9585 <e769> <e769> 20348 <e76a> <e76a> 9591 <e76b> <e773> 20349 endcidrange 100 begincidrange <e774> <e774> 9506 <e775> <e77b> 20358 <e77c> <e77c> 9523 <e77d> <e77e> 20365 <e780> <e781> 20367 <e782> <e782> 8234 <e783> <e783> 20369 <e784> <e784> 9526 <e785> <e785> 9587 <e786> <e786> 9583 <e787> <e789> 20370 <e78a> <e78a> 8851 <e78b> <e78b> 9592 <e78c> <e78e> 20373 <e78f> <e78f> 9584 <e790> <e791> 20376 <e792> <e792> 9589 <e793> <e797> 20378 <e798> <e799> 9537 <e79a> <e79a> 9565 <e79b> <e79f> 20383 <e7a0> <e7a0> 8218 <e7a1> <e7fe> 6105 <e840> <e842> 20388 <e843> <e843> 9594 <e844> <e844> 8198 <e845> <e845> 20391 <e846> <e846> 8567 <e847> <e848> 20392 <e849> <e849> 9499 <e84a> <e84a> 20394 <e84b> <e84b> 9508 <e84c> <e84e> 20395 <e84f> <e84f> 9595 <e850> <e853> 20398 <e854> <e854> 8867 <e855> <e859> 20402 <e85a> <e85a> 9593 <e85b> <e85b> 20407 <e85c> <e85c> 9574 <e85d> <e861> 20408 <e862> <e862> 8083 <e863> <e863> 20413 <e864> <e864> 9596 <e865> <e86f> 20414 <e870> <e870> 9492 <e871> <e872> 20425 <e873> <e873> 9597 <e874> <e874> 20427 <e875> <e875> 9586 <e876> <e87b> 20428 <e87c> <e87c> 9588 <e87d> <e87e> 20434 <e880> <e880> 8782 <e881> <e881> 20436 <e882> <e882> 8646 <e883> <e886> 20437 <e887> <e887> 8351 <e888> <e888> 20441 <e889> <e889> 9590 <e88a> <e88b> 20442 <e88c> <e88c> 8292 <e88d> <e88d> 8895 <e88e> <e88e> 9756 <e88f> <e88f> 8798 <e890> <e8a0> 20444 <e8a1> <e8fe> 6199 <e940> <e94b> 20461 <e94c> <e94c> 7797 <e94d> <e953> 20473 <e954> <e954> 8317 <e955> <e955> 20480 <e956> <e956> 9151 <e957> <e957> 8467 <e958> <e959> 20481 <e95a> <e95a> 9152 <e95b> <e95c> 20483 <e95d> <e95d> 7749 <e95e> <e95e> 20485 <e95f> <e95f> 8152 <e960> <e960> 9156 <e961> <e961> 20486 <e962> <e962> 9154 <e963> <e963> 8452 <e964> <e964> 20487 <e965> <e965> 8637 <e966> <e966> 20488 <e967> <e967> 8071 <e968> <e968> 9155 <e969> <e96b> 20489 <e96c> <e96c> 8809 <e96d> <e974> 20492 <e975> <e975> 8003 <e976> <e976> 20500 <e977> <e977> 7966 <e978> <e978> 9849 <e979> <e979> 7915 <e97a> <e97b> 20501 <e97c> <e97c> 7989 <e97d> <e97d> 8330 endcidrange 100 begincidrange <e97e> <e97e> 20503 <e980> <e980> 9159 <e981> <e981> 9161 <e982> <e982> 9158 <e983> <e986> 20504 <e987> <e987> 8783 <e988> <e98a> 20508 <e98b> <e98b> 9163 <e98c> <e98d> 20511 <e98e> <e98e> 8691 <e98f> <e98f> 20513 <e990> <e990> 8695 <e991> <e991> 9167 <e992> <e992> 9166 <e993> <e993> 9162 <e994> <e994> 9165 <e995> <e997> 20514 <e998> <e998> 9168 <e999> <e99a> 20517 <e99b> <e99b> 9836 <e99c> <e99c> 20519 <e99d> <e99d> 9153 <e99e> <e99e> 20520 <e99f> <e99f> 8174 <e9a0> <e9a0> 9169 <e9a1> <e9fe> 6293 <ea40> <ea40> 8184 <ea41> <ea43> 20521 <ea44> <ea44> 9171 <ea45> <ea47> 20524 <ea48> <ea48> 9170 <ea49> <ea49> 9172 <ea4a> <ea4a> 7832 <ea4b> <ea4f> 20527 <ea50> <ea50> 7980 <ea51> <ea51> 20532 <ea52> <ea52> 9173 <ea53> <ea54> 20533 <ea55> <ea55> 7793 <ea56> <ea56> 9873 <ea57> <ea58> 20535 <ea59> <ea59> 9157 <ea5a> <ea7e> 20537 <ea80> <ea80> 8986 <ea81> <ea83> 20574 <ea84> <ea84> 8468 <ea85> <ea86> 20577 <ea87> <ea87> 8836 <ea88> <ea8d> 20579 <ea8e> <ea8e> 8732 <ea8f> <ea8f> 20585 <ea90> <ea90> 7806 <ea91> <ea91> 8269 <ea92> <ea95> 20586 <ea96> <ea96> 8705 <ea97> <ea9f> 20590 <eaa0> <eaa0> 7897 <eaa1> <eafe> 6387 <eb40> <eb40> 20599 <eb41> <eb41> 8114 <eb42> <eb44> 20600 <eb45> <eb45> 8786 <eb46> <eb47> 20603 <eb48> <eb48> 8057 <eb49> <eb52> 20605 <eb53> <eb53> 8535 <eb54> <eb54> 20615 <eb55> <eb55> 8639 <eb56> <eb5a> 20616 <eb5b> <eb5b> 8735 <eb5c> <eb5c> 20621 <eb5d> <eb5d> 8253 <eb5e> <eb5f> 20622 <eb60> <eb60> 8213 <eb61> <eb61> 20624 <eb62> <eb62> 9893 <eb63> <eb6c> 20625 <eb6d> <eb6d> 8534 <eb6e> <eb6f> 20635 <eb70> <eb70> 8516 <eb71> <eb71> 20637 <eb72> <eb72> 7825 <eb73> <eb73> 8791 <eb74> <eb77> 20638 <eb78> <eb78> 8202 <eb79> <eb79> 8338 <eb7a> <eb7e> 20642 <eb80> <eb84> 20647 <eb85> <eb85> 8784 <eb86> <eb89> 20652 <eb8a> <eb8a> 7875 <eb8b> <eba0> 20656 <eba1> <ebfe> 6481 <ec40> <ec45> 20678 <ec46> <ec46> 8616 <ec47> <ec55> 20684 <ec56> <ec56> 9741 <ec57> <ec59> 20699 <ec5a> <ec5a> 9740 <ec5b> <ec5b> 20702 endcidrange 100 begincidrange <ec5c> <ec5c> 9742 <ec5d> <ec5f> 20703 <ec60> <ec60> 8242 <ec61> <ec6d> 20706 <ec6e> <ec6e> 9739 <ec6f> <ec75> 20719 <ec76> <ec76> 8899 <ec77> <ec7e> 20726 <ec80> <ec95> 20734 <ec96> <ec96> 7971 <ec97> <eca0> 20756 <eca1> <ecfe> 6575 <ed40> <ed45> 20766 <ed46> <ed46> 9877 <ed47> <ed57> 20772 <ed58> <ed58> 9822 <ed59> <ed5d> 20789 <ed5e> <ed5e> 9821 <ed5f> <ed60> 20794 <ed61> <ed61> 9874 <ed62> <ed63> 20796 <ed64> <ed64> 9823 <ed65> <ed65> 20798 <ed66> <ed66> 8589 <ed67> <ed67> 8445 <ed68> <ed6d> 20799 <ed6e> <ed6e> 8000 <ed6f> <ed73> 20805 <ed74> <ed74> 9317 <ed75> <ed76> 20810 <ed77> <ed77> 9319 <ed78> <ed78> 20812 <ed79> <ed79> 9318 <ed7a> <ed7e> 20813 <ed80> <ed90> 20818 <ed91> <ed91> 8649 <ed92> <ed92> 20835 <ed93> <ed93> 8713 <ed94> <ed94> 7881 <ed95> <ed95> 8425 <ed96> <ed96> 20836 <ed97> <ed97> 8650 <ed98> <ed98> 8518 <ed99> <ed99> 9669 <ed9a> <ed9a> 8668 <ed9b> <ed9b> 20837 <ed9c> <ed9c> 9310 <ed9d> <ed9d> 20838 <ed9e> <ed9e> 8527 <ed9f> <ed9f> 20839 <eda0> <eda0> 9670 <eda1> <edfe> 6669 <ee40> <ee40> 9671 <ee41> <ee41> 8769 <ee42> <ee42> 8586 <ee43> <ee43> 7727 <ee44> <ee44> 7900 <ee45> <ee47> 20840 <ee48> <ee48> 8383 <ee49> <ee49> 8244 <ee4a> <ee4c> 20843 <ee4d> <ee4d> 9673 <ee4e> <ee51> 20846 <ee52> <ee52> 9672 <ee53> <ee54> 20850 <ee55> <ee55> 8718 <ee56> <ee56> 20852 <ee57> <ee57> 9675 <ee58> <ee5d> 20853 <ee5e> <ee5e> 8573 <ee5f> <ee60> 20859 <ee61> <ee61> 8062 <ee62> <ee67> 20861 <ee68> <ee68> 9676 <ee69> <ee69> 8131 <ee6a> <ee6b> 20867 <ee6c> <ee6c> 8377 <ee6d> <ee6d> 20869 <ee6e> <ee6e> 8577 <ee6f> <ee76> 20870 <ee77> <ee77> 8154 <ee78> <ee7c> 20878 <ee7d> <ee7d> 8563 <ee7e> <ee7e> 7905 <ee80> <ee80> 9677 <ee81> <ee84> 20883 <ee85> <ee85> 9678 <ee86> <ee86> 8694 <ee87> <ee89> 20887 <ee8a> <ee8a> 8779 <ee8b> <ee8b> 9681 <ee8c> <ee8c> 20890 <ee8d> <ee8d> 7872 <ee8e> <ee8f> 20891 <ee90> <ee90> 8200 <ee91> <ee93> 20893 <ee94> <ee94> 9680 <ee95> <ee96> 20896 <ee97> <ee97> 9682 <ee98> <ee98> 20898 endcidrange 100 begincidrange <ee99> <ee99> 7978 <ee9a> <ee9c> 20899 <ee9d> <ee9d> 7794 <ee9e> <ee9e> 9683 <ee9f> <eea0> 20902 <eea1> <eefe> 6763 <ef40> <ef40> 8638 <ef41> <ef41> 9684 <ef42> <ef42> 8260 <ef43> <ef43> 20904 <ef44> <ef44> 9679 <ef45> <ef45> 8435 <ef46> <ef4b> 20905 <ef4c> <ef4c> 7936 <ef4d> <ef51> 20911 <ef52> <ef53> 9420 <ef54> <ef54> 20916 <ef55> <ef55> 9880 <ef56> <ef56> 20917 <ef57> <ef57> 9848 <ef58> <ef59> 20918 <ef5a> <ef5a> 9422 <ef5b> <ef5f> 20920 <ef60> <ef60> 9423 <ef61> <ef67> 20925 <ef68> <ef68> 8376 <ef69> <ef69> 20932 <ef6a> <ef6a> 9424 <ef6b> <ef6b> 20933 <ef6c> <ef6c> 9425 <ef6d> <ef76> 20934 <ef77> <ef77> 7924 <ef78> <ef79> 20944 <ef7a> <ef7a> 9115 <ef7b> <ef7b> 20946 <ef7c> <ef7c> 9854 <ef7d> <ef7e> 20947 <ef80> <ef81> 20949 <ef82> <ef82> 9117 <ef83> <ef84> 9119 <ef85> <ef85> 20951 <ef86> <ef86> 9121 <ef87> <ef87> 20952 <ef88> <ef88> 7921 <ef89> <ef8a> 20953 <ef8b> <ef8b> 8734 <ef8c> <ef8c> 20955 <ef8d> <ef8d> 9122 <ef8e> <ef94> 20956 <ef95> <ef95> 8523 <ef96> <ef96> 7734 <ef97> <ef97> 8501 <ef98> <ef9b> 20963 <ef9c> <ef9c> 8109 <ef9d> <ef9d> 20967 <ef9e> <ef9e> 7763 <ef9f> <efa0> 20968 <efa1> <effe> 6857 <f040> <f040> 20970 <f041> <f041> 9123 <f042> <f042> 8707 <f043> <f043> 20971 <f044> <f044> 7911 <f045> <f046> 20972 <f047> <f047> 9124 <f048> <f048> 8343 <f049> <f049> 7908 <f04a> <f04d> 20974 <f04e> <f04e> 8760 <f04f> <f050> 20978 <f051> <f051> 9125 <f052> <f053> 20980 <f054> <f054> 8090 <f055> <f056> 20982 <f057> <f057> 8643 <f058> <f05d> 20984 <f05e> <f05e> 7982 <f05f> <f067> 20990 <f068> <f068> 9116 <f069> <f06b> 20999 <f06c> <f06c> 9126 <f06d> <f070> 21002 <f071> <f071> 9118 <f072> <f072> 21006 <f073> <f073> 8245 <f074> <f074> 9127 <f075> <f077> 21007 <f078> <f078> 9128 <f079> <f079> 21010 <f07a> <f07a> 8309 <f07b> <f07c> 21011 <f07d> <f07e> 9129 <f080> <f080> 9131 <f081> <f081> 8171 <f082> <f082> 9132 <f083> <f086> 21013 <f087> <f087> 8042 <f088> <f088> 8441 <f089> <f08a> 21017 <f08b> <f08b> 9830 endcidrange 100 begincidrange <f08c> <f08f> 21019 <f090> <f090> 9831 <f091> <f091> 21023 <f092> <f092> 7788 <f093> <f095> 21024 <f096> <f096> 9133 <f097> <f0a0> 21027 <f0a1> <f0fe> 6951 <f140> <f151> 21037 <f152> <f152> 8301 <f153> <f153> 8770 <f154> <f154> 7938 <f155> <f156> 21055 <f157> <f157> 8579 <f158> <f158> 21057 <f159> <f159> 7813 <f15a> <f15a> 8681 <f15b> <f166> 21058 <f167> <f167> 7767 <f168> <f175> 21070 <f176> <f176> 8869 <f177> <f177> 9223 <f178> <f178> 8138 <f179> <f179> 21084 <f17a> <f17a> 9218 <f17b> <f17b> 8066 <f17c> <f17d> 21085 <f17e> <f17e> 9224 <f180> <f180> 9220 <f181> <f181> 21087 <f182> <f182> 8497 <f183> <f183> 21088 <f184> <f184> 8580 <f185> <f185> 21089 <f186> <f186> 9219 <f187> <f187> 21090 <f188> <f188> 8302 <f189> <f189> 9227 <f18a> <f193> 21091 <f194> <f194> 7999 <f195> <f197> 21101 <f198> <f198> 8295 <f199> <f1a0> 21104 <f1a1> <f1fe> 7045 <f240> <f244> 21112 <f245> <f245> 8151 <f246> <f246> 21117 <f247> <f247> 7811 <f248> <f24a> 21118 <f24b> <f24b> 9231 <f24c> <f252> 21121 <f253> <f253> 9230 <f254> <f254> 8391 <f255> <f255> 9229 <f256> <f25b> 21128 <f25c> <f25c> 9234 <f25d> <f25e> 21134 <f25f> <f25f> 8375 <f260> <f270> 21136 <f271> <f271> 9200 <f272> <f272> 21153 <f273> <f273> 9233 <f274> <f274> 9236 <f275> <f275> 21154 <f276> <f276> 8560 <f277> <f27b> 21155 <f27c> <f27c> 9221 <f27d> <f27d> 8460 <f27e> <f27e> 9237 <f280> <f284> 21160 <f285> <f285> 8294 <f286> <f286> 21165 <f287> <f287> 9042 <f288> <f288> 9235 <f289> <f289> 9232 <f28a> <f28b> 9238 <f28c> <f28c> 8433 <f28d> <f290> 21166 <f291> <f291> 9226 <f292> <f293> 21170 <f294> <f294> 9225 <f295> <f295> 21172 <f296> <f296> 9240 <f297> <f29b> 21173 <f29c> <f29c> 8103 <f29d> <f29d> 21178 <f29e> <f29e> 8700 <f29f> <f2a0> 21179 <f2a1> <f2fe> 7139 <f340> <f340> 8129 <f341> <f341> 9222 <f342> <f344> 21181 <f345> <f345> 8860 <f346> <f347> 21184 <f348> <f348> 8270 <f349> <f349> 21186 <f34a> <f34a> 9242 <f34b> <f34b> 9241 <f34c> <f34f> 21187 <f350> <f350> 9228 endcidrange 100 begincidrange <f351> <f360> 21191 <f361> <f361> 7721 <f362> <f373> 21207 <f374> <f374> 9825 <f375> <f375> 21225 <f376> <f376> 9892 <f377> <f377> 8564 <f378> <f378> 9827 <f379> <f379> 9826 <f37a> <f37e> 21226 <f380> <f38b> 21231 <f38c> <f38c> 9845 <f38d> <f39f> 21243 <f3a0> <f3a0> 8524 <f3a1> <f3fe> 7233 <f440> <f444> 21262 <f445> <f445> 9850 <f446> <f44f> 21267 <f450> <f450> 9888 <f451> <f456> 21277 <f457> <f457> 9832 <f458> <f458> 21283 <f459> <f459> 7888 <f45a> <f45a> 21284 <f45b> <f45b> 8342 <f45c> <f45c> 21285 <f45d> <f45d> 9164 <f45e> <f461> 21286 <f462> <f462> 9160 <f463> <f463> 21290 <f464> <f464> 8766 <f465> <f474> 21291 <f475> <f475> 9829 <f476> <f47b> 21307 <f47c> <f47c> 9828 <f47d> <f47d> 21313 <f47e> <f47e> 8761 <f480> <f493> 21314 <f494> <f494> 8266 <f495> <f498> 21334 <f499> <f499> 9759 <f49a> <f49b> 21338 <f49c> <f49c> 9758 <f49d> <f4a0> 21340 <f4a1> <f4fe> 7327 <f540> <f544> 21344 <f545> <f545> 9760 <f546> <f546> 21349 <f547> <f547> 9761 <f548> <f551> 21350 <f552> <f552> 9762 <f553> <f553> 21360 <f554> <f554> 9767 <f555> <f555> 7737 <f556> <f556> 9765 <f557> <f55d> 21361 <f55e> <f55e> 9769 <f55f> <f560> 21368 <f561> <f561> 9774 <f562> <f562> 9771 <f563> <f56d> 21370 <f56e> <f56e> 9770 <f56f> <f56f> 9773 <f570> <f570> 21381 <f571> <f571> 9768 <f572> <f572> 8633 <f573> <f57e> 21382 <f580> <f584> 21394 <f585> <f585> 9782 <f586> <f586> 9776 <f587> <f58b> 21399 <f58c> <f58c> 9784 <f58d> <f58d> 21404 <f58e> <f58e> 8205 <f58f> <f58f> 9783 <f590> <f598> 21405 <f599> <f599> 9797 <f59a> <f59a> 21414 <f59b> <f59b> 9786 <f59c> <f59f> 21415 <f5a0> <f5a0> 9795 <f5a1> <f5fe> 7421 <f640> <f640> 21419 <f641> <f641> 9792 <f642> <f644> 21420 <f645> <f645> 9789 <f646> <f646> 9793 <f647> <f647> 21423 <f648> <f648> 9790 <f649> <f64a> 21424 <f64b> <f64b> 9791 <f64c> <f64c> 8128 <f64d> <f64d> 21426 <f64e> <f64f> 9787 <f650> <f653> 21427 <f654> <f654> 9794 <f655> <f657> 21431 <f658> <f658> 9796 <f659> <f660> 21434 <f661> <f661> 9785 endcidrange 100 begincidrange <f662> <f662> 21442 <f663> <f663> 9804 <f664> <f66b> 21443 <f66c> <f66c> 9799 <f66d> <f66d> 9803 <f66e> <f670> 21451 <f671> <f671> 9801 <f672> <f673> 21454 <f674> <f674> 9800 <f675> <f675> 21456 <f676> <f676> 9802 <f677> <f677> 8456 <f678> <f67e> 21457 <f680> <f684> 21464 <f685> <f685> 9805 <f686> <f687> 21469 <f688> <f688> 9780 <f689> <f689> 21471 <f68a> <f68a> 9809 <f68b> <f68c> 21472 <f68d> <f68d> 9808 <f68e> <f68e> 9810 <f68f> <f691> 21474 <f692> <f692> 9807 <f693> <f695> 21477 <f696> <f696> 9778 <f697> <f697> 9806 <f698> <f698> 9811 <f699> <f699> 21480 <f69a> <f69a> 9815 <f69b> <f69b> 21481 <f69c> <f69c> 9781 <f69d> <f69d> 21482 <f69e> <f69e> 9779 <f69f> <f69f> 21483 <f6a0> <f6a0> 9814 <f6a1> <f6fe> 7515 <f740> <f741> 21484 <f742> <f742> 9812 <f743> <f748> 21486 <f749> <f749> 9816 <f74a> <f74b> 21492 <f74c> <f74c> 9813 <f74d> <f74d> 7757 <f74e> <f755> 21494 <f756> <f756> 9819 <f757> <f757> 21502 <f758> <f758> 9818 <f759> <f759> 21503 <f75a> <f75a> 9817 <f75b> <f75b> 8238 <f75c> <f75c> 9775 <f75d> <f760> 21504 <f761> <f761> 9798 <f762> <f762> 21508 <f763> <f763> 9766 <f764> <f76a> 21509 <f76b> <f76b> 9820 <f76c> <f770> 21516 <f771> <f771> 9772 <f772> <f77b> 21521 <f77c> <f77c> 9763 <f77d> <f77d> 21531 <f77e> <f77e> 9777 <f780> <f7a0> 21532 <f7a1> <f7fe> 7609 <f840> <f841> 21565 <f842> <f842> 8348 <f843> <f845> 21567 <f846> <f846> 9600 <f847> <f848> 21570 <f849> <f849> 8924 <f84a> <f84f> 21572 <f850> <f850> 7941 <f851> <f851> 8331 <f852> <f852> 21578 <f853> <f853> 9601 <f854> <f862> 21579 <f863> <f863> 9603 <f864> <f864> 9602 <f865> <f865> 21594 <f866> <f866> 8686 <f867> <f871> 21595 <f872> <f872> 8578 <f873> <f877> 21606 <f878> <f878> 8771 <f879> <f879> 21611 <f87a> <f87a> 9607 <f87b> <f87b> 21612 <f87c> <f87c> 9608 <f87d> <f87e> 21613 <f880> <f880> 21615 <f881> <f881> 9604 <f882> <f883> 21616 <f884> <f884> 8701 <f885> <f885> 21618 <f886> <f886> 8687 <f887> <f88c> 21619 <f88d> <f88d> 9610 <f88e> <f88e> 9612 endcidrange 100 begincidrange <f88f> <f898> 21625 <f899> <f899> 8007 <f89a> <f89c> 21635 <f89d> <f89d> 7965 <f89e> <f89f> 21638 <f8a0> <f8a0> 9613 <f940> <f94d> 21640 <f94e> <f94e> 8144 <f94f> <f94f> 9618 <f950> <f950> 9615 <f951> <f958> 21654 <f959> <f959> 9620 <f95a> <f95a> 7904 <f95b> <f95c> 21662 <f95d> <f95d> 9617 <f95e> <f95e> 9621 <f95f> <f966> 21664 <f967> <f967> 9623 <f968> <f968> 21672 <f969> <f969> 8374 <f96a> <f96b> 21673 <f96c> <f96c> 9624 <f96d> <f96e> 21675 <f96f> <f96f> 8438 <f970> <f97e> 21677 <f980> <f984> 21692 <f985> <f985> 9605 <f986> <f986> 21697 <f987> <f987> 9625 <f988> <f990> 21698 <f991> <f991> 9622 <f992> <f995> 21707 <f996> <f996> 9626 <f997> <f997> 21711 <f998> <f998> 9627 <f999> <f9a0> 21712 <fa40> <fa41> 21720 <fa42> <fa42> 9629 <fa43> <fa45> 21722 <fa46> <fa46> 9630 <fa47> <fa4b> 21725 <fa4c> <fa4c> 9036 <fa4d> <fa50> 21730 <fa51> <fa51> 8004 <fa52> <fa57> 21734 <fa58> <fa58> 9824 <fa59> <fa59> 9632 <fa5a> <fa5c> 21740 <fa5d> <fa5d> 9628 <fa5e> <fa5e> 21743 <fa5f> <fa5f> 9631 <fa60> <fa60> 21744 <fa61> <fa61> 8044 <fa62> <fa6f> 21745 <fa70> <fa70> 9634 <fa71> <fa73> 21759 <fa74> <fa74> 8366 <fa75> <fa75> 21762 <fa76> <fa76> 9611 <fa77> <fa77> 9635 <fa78> <fa7e> 21763 <fa80> <fa82> 21770 <fa83> <fa83> 9609 <fa84> <fa84> 9637 <fa85> <fa8c> 21773 <fa8d> <fa8d> 9636 <fa8e> <fa8f> 21781 <fa90> <fa90> 9638 <fa91> <fa91> 9619 <fa92> <fa95> 21783 <fa96> <fa96> 9639 <fa97> <fa97> 8738 <fa98> <fa98> 9641 <fa99> <faa0> 21787 <fb40> <fb48> 21795 <fb49> <fb49> 9640 <fb4a> <fb51> 21804 <fb52> <fb52> 9606 <fb53> <fb56> 21812 <fb57> <fb57> 9633 <fb58> <fb58> 9642 <fb59> <fb59> 21816 <fb5a> <fb5a> 9616 <fb5b> <fb5b> 9614 <fb5c> <fb74> 21817 <fb75> <fb75> 9864 <fb76> <fb78> 21842 <fb79> <fb79> 9886 <fb7a> <fb7a> 9723 <fb7b> <fb7b> 21845 <fb7c> <fb7c> 8076 <fb7d> <fb7d> 8692 <fb7e> <fb7e> 21846 <fb80> <fb8f> 21847 <fb90> <fb90> 8207 <fb91> <fb9b> 21863 <fb9c> <fb9c> 8305 <fb9d> <fb9e> 21874 <fb9f> <fb9f> 9719 <fba0> <fba0> 21876 endcidrange 70 begincidrange <fc40> <fc43> 21877 <fc44> <fc44> 9878 <fc45> <fc48> 21881 <fc49> <fc49> 9871 <fc4a> <fc59> 21885 <fc5a> <fc5a> 8922 <fc5b> <fc62> 21901 <fc63> <fc63> 7873 <fc64> <fc67> 21909 <fc68> <fc68> 7859 <fc69> <fc6e> 21913 <fc6f> <fc6f> 9834 <fc70> <fc70> 21919 <fc71> <fc71> 9866 <fc72> <fc73> 21920 <fc74> <fc74> 9833 <fc75> <fc76> 21922 <fc77> <fc78> 9752 <fc79> <fc7e> 21924 <fc80> <fc82> 21930 <fc83> <fc83> 9754 <fc84> <fc89> 21933 <fc8a> <fc8a> 9843 <fc8b> <fca0> 21939 <fd40> <fd51> 21961 <fd52> <fd52> 8390 <fd53> <fd53> 8811 <fd54> <fd56> 21979 <fd57> <fd57> 9427 <fd58> <fd58> 7814 <fd59> <fd59> 21982 <fd5a> <fd5a> 9743 <fd5b> <fd5e> 21983 <fd5f> <fd5f> 9745 <fd60> <fd61> 21987 <fd62> <fd62> 9747 <fd63> <fd64> 21989 <fd65> <fd65> 9744 <fd66> <fd66> 9746 <fd67> <fd67> 8240 <fd68> <fd68> 21991 <fd69> <fd69> 9841 <fd6a> <fd6b> 21992 <fd6c> <fd6c> 9748 <fd6d> <fd6f> 21994 <fd70> <fd70> 9750 <fd71> <fd71> 21997 <fd72> <fd72> 9749 <fd73> <fd77> 21998 <fd78> <fd78> 8434 <fd79> <fd7c> 22003 <fd7d> <fd7d> 9751 <fd7e> <fd7e> 22007 <fd80> <fd87> 22008 <fd88> <fd88> 8247 <fd89> <fd8a> 22016 <fd8b> <fd8b> 8371 <fd8c> <fd8e> 22018 <fd8f> <fd8f> 7970 <fd90> <fd90> 9453 <fd91> <fd93> 22021 <fd94> <fd94> 7988 <fd95> <fd9c> 22024 <fd9d> <fd9d> 2562 <fd9e> <fd9e> 16595 <fd9f> <fd9f> 8204 <fda0> <fda0> 20611 <fe40> <fe40> 4697 <fe41> <fe7e> 22032 <fe80> <fea0> 22094 endcidrange endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF \ No newline at end of file
diff --git a/src/main/resources/Resources/cmap/GBKp-EUC-V b/src/main/resources/Resources/cmap/GBKp-EUC-V
new file mode 100644
index 0000000..25d00a6
--- /dev/null
+++ b/src/main/resources/Resources/cmap/GBKp-EUC-V
@@ -0,0 +1 @@
+%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%DocumentNeededResources: CMap (GBKp-EUC-H) %%IncludeResource: ProcSet (CIDInit) %%IncludeResource: CMap (GBKp-EUC-H) %%BeginResource: CMap (GBKp-EUC-V) %%Title: (GBKp-EUC-V Adobe GB1 1) %%Version: 1.000 %%Copyright: ----------------------------------------------------------- %%Copyright: Copyright 1990-2000 Adobe Systems Incorporated. %%Copyright: All Rights Reserved. %%Copyright: %%Copyright: Patents Pending %%Copyright: %%Copyright: NOTICE: All information contained herein is the property %%Copyright: of Adobe Systems Incorporated. %%Copyright: %%Copyright: Permission is granted for redistribution of this file %%Copyright: provided this copyright notice is maintained intact and %%Copyright: that the contents of this file are not altered in any %%Copyright: way from its original form. %%Copyright: %%Copyright: PostScript and Display PostScript are trademarks of %%Copyright: Adobe Systems Incorporated which may be registered in %%Copyright: certain jurisdictions. %%Copyright: ----------------------------------------------------------- %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /GBKp-EUC-H usecmap /CIDSystemInfo 3 dict dup begin /Registry (Adobe) def /Ordering (GB1) def /Supplement 1 def end def /CMapName /GBKp-EUC-V def /CMapVersion 1.000 def /CMapType 1 def /XUID [1 10 25456] def /WMode 1 def 20 begincidrange <a1a2> <a1a2> 575 <a1a3> <a1a3> 574 <a1aa> <a1aa> 598 <a1ab> <a1ac> 7704 <a1ad> <a1ad> 599 <a1b2> <a1bf> 582 <a1fe> <a1fe> 7706 <a3a1> <a3a1> 578 <a3a8> <a3a9> 580 <a3ac> <a3ac> 573 <a3ae> <a3ae> 7707 <a3ba> <a3bb> 576 <a3bd> <a3bd> 7708 <a3bf> <a3bf> 579 <a3db> <a3db> 7709 <a3dd> <a3dd> 7710 <a3df> <a3df> 600 <a3fb> <a3fb> 596 <a3fd> <a3fd> 597 <a3fe> <a3fe> 7711 endcidrange endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF \ No newline at end of file
diff --git a/src/main/resources/Resources/cmap/GBT-EUC-H b/src/main/resources/Resources/cmap/GBT-EUC-H
new file mode 100644
index 0000000..7456483
--- /dev/null
+++ b/src/main/resources/Resources/cmap/GBT-EUC-H
@@ -0,0 +1 @@
+%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%IncludeResource: ProcSet (CIDInit) %%BeginResource: CMap (GBT-EUC-H) %%Title: (GBT-EUC-H Adobe GB1 1) %%Version: 10.001 %%Copyright: ----------------------------------------------------------- %%Copyright: Copyright 1990-1998 Adobe Systems Incorporated. %%Copyright: All Rights Reserved. %%Copyright: %%Copyright: Patents Pending %%Copyright: %%Copyright: NOTICE: All information contained herein is the property %%Copyright: of Adobe Systems Incorporated. %%Copyright: %%Copyright: Permission is granted for redistribution of this file %%Copyright: provided this copyright notice is maintained intact and %%Copyright: that the contents of this file are not altered in any %%Copyright: way from its original form. %%Copyright: %%Copyright: PostScript and Display PostScript are trademarks of %%Copyright: Adobe Systems Incorporated which may be registered in %%Copyright: certain jurisdictions. %%Copyright: ----------------------------------------------------------- %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo 3 dict dup begin /Registry (Adobe) def /Ordering (GB1) def /Supplement 1 def end def /CMapName /GBT-EUC-H def /CMapVersion 10.001 def /CMapType 1 def /UIDOffset 480 def /XUID [1 10 25370] def /WMode 0 def 2 begincodespacerange <00> <80> <A1A1> <FEFE> endcodespacerange 1 beginnotdefrange <00> <1f> 7716 endnotdefrange 100 begincidrange <20> <20> 7716 <21> <7e> 814 <a1a1> <a1fe> 96 <a2b1> <a2e2> 190 <a2e5> <a2ee> 240 <a2f1> <a2fc> 250 <a3a1> <a3fe> 262 <a4a1> <a4f3> 356 <a5a1> <a5f6> 439 <a6a1> <a6b8> 525 <a6c1> <a6f5> 549 <a7a1> <a7c1> 602 <a7d1> <a7f1> 635 <a8a1> <a8c0> 668 <a8c5> <a8ea> 700 <a9a4> <a9ef> 738 <aaa1> <aafe> 814 <aba1> <abc0> 908 <b0a1> <b0a7> 940 <b0a8> <b0a8> 7717 <b0a9> <b0a9> 948 <b0aa> <b0aa> 7718 <b0ab> <b0ac> 950 <b0ad> <b0ae> 7719 <b0af> <b0b8> 954 <b0b9> <b0b9> 7721 <b0ba> <b0bf> 965 <b0c0> <b0c0> 7722 <b0c1> <b0d2> 972 <b0d3> <b0d3> 7723 <b0d4> <b0d4> 991 <b0d5> <b0d5> 7724 <b0d6> <b0d9> 993 <b0da> <b0da> 7725 <b0db> <b0db> 998 <b0dc> <b0dc> 7726 <b0dd> <b0e3> 1000 <b0e4> <b0e4> 7727 <b0e5> <b0eb> 1008 <b0ec> <b0ed> 7728 <b0ee> <b0ee> 1017 <b0ef> <b0ef> 7730 <b0f0> <b0f2> 1019 <b0f3> <b0f3> 7731 <b0f4> <b0f6> 1023 <b0f7> <b0f7> 7732 <b0f8> <b0f8> 1027 <b0f9> <b0f9> 7733 <b0fa> <b0fe> 1029 <b1a1> <b1a4> 1034 <b1a5> <b1a6> 7734 <b1a7> <b1a7> 1040 <b1a8> <b1a8> 7736 <b1a9> <b1aa> 1042 <b1ab> <b1ab> 7737 <b1ac> <b1b1> 1045 <b1b2> <b1b2> 7738 <b1b3> <b1b3> 1052 <b1b4> <b1b5> 7739 <b1b6> <b1b6> 1055 <b1b7> <b1b9> 7741 <b1ba> <b1c0> 1059 <b1c1> <b1c1> 7744 <b1c2> <b1c9> 1067 <b1ca> <b1ca> 7745 <b1cb> <b1ce> 1076 <b1cf> <b1d0> 7746 <b1d1> <b1d1> 1082 <b1d2> <b1d2> 7748 <b1d3> <b1d4> 1084 <b1d5> <b1d5> 7749 <b1d6> <b1de> 1087 <b1df> <b1e1> 7750 <b1e2> <b1e3> 1099 <b1e4> <b1e4> 7753 <b1e5> <b1e6> 1102 <b1e7> <b1e8> 7754 <b1e9> <b1e9> 1106 <b1ea> <b1ea> 7756 <b1eb> <b1ed> 1108 <b1ee> <b1ee> 7757 <b1ef> <b1f0> 1112 <b1f1> <b1f1> 7758 <b1f2> <b1f3> 1115 <b1f4> <b1f7> 7759 <b1f8> <b1fc> 1121 <b1fd> <b1fd> 7763 <b1fe> <b1fe> 1127 <b2a1> <b2a5> 1128 <b2a6> <b2a7> 7764 <b2a8> <b2ab> 1135 <b2ac> <b2ac> 7766 <b2ad> <b2b4> 1140 <b2b5> <b2b5> 7767 <b2b6> <b2b8> 1149 <b2b9> <b2b9> 7768 <b2ba> <b2c5> 1153 <b2c6> <b2c6> 7769 <b2c7> <b2cd> 1166 <b2ce> <b2d7> 7770 endcidrange 100 begincidrange <b2d8> <b2dd> 1183 <b2de> <b2de> 7780 <b2df> <b2df> 1190 <b2e0> <b2e0> 7781 <b2e1> <b2e1> 1192 <b2e2> <b2e3> 7782 <b2e4> <b2ee> 1195 <b2ef> <b2ef> 7784 <b2f0> <b2f2> 1207 <b2f3> <b2fc> 7785 <b2fd> <b2fe> 1220 <b3a1> <b3a2> 7795 <b3a3> <b3a3> 1224 <b3a4> <b3a7> 7797 <b3a8> <b3a8> 1229 <b3a9> <b3a9> 7801 <b3aa> <b3ad> 1231 <b3ae> <b3ae> 7802 <b3af> <b3b4> 1236 <b3b5> <b3b5> 7803 <b3b6> <b3b8> 1243 <b3b9> <b3b9> 7804 <b3ba> <b3bd> 1247 <b3be> <b3be> 7805 <b3bf> <b3c1> 1252 <b3c2> <b3c2> 7806 <b3c3> <b3c3> 1256 <b3c4> <b3c4> 7807 <b3c5> <b3c5> 1258 <b3c6> <b3c6> 7808 <b3c7> <b3cc> 1260 <b3cd> <b3cd> 7809 <b3ce> <b3ce> 1267 <b3cf> <b3cf> 7810 <b3d0> <b3d1> 1269 <b3d2> <b3d2> 7811 <b3d3> <b3d8> 1272 <b3d9> <b3d9> 7812 <b3da> <b3da> 1279 <b3db> <b3db> 7813 <b3dc> <b3dc> 1281 <b3dd> <b3dd> 7814 <b3de> <b3e2> 1283 <b3e3> <b3e3> 7815 <b3e4> <b3e4> 1289 <b3e5> <b3e6> 7816 <b3e7> <b3e7> 1292 <b3e8> <b3e8> 7818 <b3e9> <b3ea> 1294 <b3eb> <b3ec> 7819 <b3ed> <b3ee> 1298 <b3ef> <b3ef> 7821 <b3f0> <b3f0> 1301 <b3f1> <b3f1> 7822 <b3f2> <b3f2> 1303 <b3f3> <b3f3> 7823 <b3f4> <b3f9> 1305 <b3fa> <b3fb> 7824 <b3fc> <b3fe> 1313 <b4a1> <b4a2> 7826 <b4a3> <b4a4> 1318 <b4a5> <b4a6> 7828 <b4a7> <b4aa> 1322 <b4ab> <b4ab> 7830 <b4ac> <b4ae> 1327 <b4af> <b4af> 7831 <b4b0> <b4b2> 1331 <b4b3> <b4b4> 7832 <b4b5> <b4b7> 1336 <b4b8> <b4b8> 7834 <b4b9> <b4be> 1340 <b4bf> <b4bf> 7835 <b4c0> <b4c1> 1347 <b4c2> <b4c2> 7836 <b4c3> <b4c6> 1350 <b4c7> <b4c7> 7837 <b4c8> <b4c9> 1355 <b4ca> <b4ca> 7838 <b4cb> <b4cc> 1358 <b4cd> <b4cd> 7839 <b4ce> <b4ce> 1361 <b4cf> <b4cf> 7840 <b4d0> <b4d2> 1363 <b4d3> <b4d4> 7841 <b4d5> <b4d9> 1368 <b4da> <b4da> 7843 <b4db> <b4db> 1374 <b4dc> <b4dc> 7844 <b4dd> <b4ec> 1376 <b4ed> <b4ed> 7845 <b4ee> <b4ee> 1393 <b4ef> <b4ef> 7846 <b4f0> <b4f7> 1395 <b4f8> <b4f8> 7847 <b4f9> <b4fa> 1404 <b4fb> <b4fb> 7848 <b4fc> <b4fe> 1407 <b5a1> <b5a2> 1410 <b5a3> <b5a3> 7849 <b5a4> <b5a4> 1413 endcidrange 100 begincidrange <b5a5> <b5a8> 7850 <b5a9> <b5ab> 1418 <b5ac> <b5ac> 7854 <b5ad> <b5ad> 1422 <b5ae> <b5af> 7855 <b5b0> <b5b0> 1425 <b5b1> <b5b5> 7857 <b5b6> <b5b6> 1431 <b5b7> <b5b7> 7862 <b5b8> <b5b9> 1433 <b5ba> <b5bc> 7863 <b5bd> <b5c5> 1438 <b5c6> <b5c6> 7866 <b5c7> <b5ca> 1448 <b5cb> <b5cb> 7867 <b5cc> <b5cf> 1453 <b5d0> <b5d0> 7868 <b5d1> <b5d2> 1458 <b5d3> <b5d3> 7869 <b5d4> <b5dc> 1461 <b5dd> <b5df> 7870 <b5e0> <b5e2> 1473 <b5e3> <b5e3> 7873 <b5e4> <b5e5> 1477 <b5e6> <b5e7> 7874 <b5e8> <b5ec> 1481 <b5ed> <b5ed> 7876 <b5ee> <b5f5> 1487 <b5f6> <b5f7> 7877 <b5f8> <b5fc> 1497 <b5fd> <b5fd> 7879 <b5fe> <b5fe> 1503 <b6a1> <b6a3> 1504 <b6a4> <b6a5> 7880 <b6a6> <b6a6> 1509 <b6a7> <b6a7> 7882 <b6a8> <b6a8> 1511 <b6a9> <b6a9> 7883 <b6aa> <b6aa> 1513 <b6ab> <b6ab> 7884 <b6ac> <b6ae> 1515 <b6af> <b6b0> 7885 <b6b1> <b6b2> 1520 <b6b3> <b6b3> 7887 <b6b4> <b6b6> 1523 <b6b7> <b6b7> 7888 <b6b8> <b6be> 1527 <b6bf> <b6c1> 7889 <b6c2> <b6c3> 1537 <b6c4> <b6c4> 7892 <b6c5> <b6c5> 1540 <b6c6> <b6c6> 7893 <b6c7> <b6cc> 1542 <b6cd> <b6cd> 7894 <b6ce> <b6ce> 1549 <b6cf> <b6d0> 7895 <b6d1> <b6d2> 1552 <b6d3> <b6d4> 7897 <b6d5> <b6d5> 1556 <b6d6> <b6d6> 7899 <b6d7> <b6d8> 1558 <b6d9> <b6d9> 7900 <b6da> <b6da> 1561 <b6db> <b6db> 7901 <b6dc> <b6e0> 1563 <b6e1> <b6e1> 7902 <b6e2> <b6e8> 1569 <b6e9> <b6e9> 7903 <b6ea> <b6eb> 1577 <b6ec> <b6ec> 7904 <b6ed> <b6ed> 1580 <b6ee> <b6ef> 7905 <b6f0> <b6f0> 1583 <b6f1> <b6f1> 7907 <b6f2> <b6f5> 1585 <b6f6> <b6f6> 7908 <b6f7> <b6f8> 1590 <b6f9> <b6f9> 7909 <b6fa> <b6fa> 1593 <b6fb> <b6fc> 7910 <b6fd> <b6fe> 1596 <b7a1> <b7a3> 7912 <b7a4> <b7a6> 1601 <b7a7> <b7a7> 7915 <b7a8> <b7ae> 1605 <b7af> <b7b0> 7916 <b7b1> <b7b2> 1614 <b7b3> <b7b3> 7918 <b7b4> <b7b5> 1617 <b7b6> <b7b7> 7919 <b7b8> <b7b8> 1621 <b7b9> <b7b9> 7921 <b7ba> <b7c2> 1623 <b7c3> <b7c4> 7922 <b7c5> <b7c8> 1634 <b7c9> <b7c9> 7924 <b7ca> <b7cb> 1639 <b7cc> <b7cc> 7925 <b7cd> <b7ce> 1642 <b7cf> <b7cf> 7926 endcidrange 100 begincidrange <b7d0> <b7d0> 1645 <b7d1> <b7d1> 7927 <b7d2> <b7d6> 1647 <b7d7> <b7d8> 7928 <b7d9> <b7db> 1654 <b7dc> <b7dc> 7930 <b7dd> <b7de> 1658 <b7df> <b7e1> 7931 <b7e2> <b7e2> 1663 <b7e3> <b7e3> 7934 <b7e4> <b7e5> 1665 <b7e6> <b7e8> 7935 <b7e9> <b7ea> 1670 <b7eb> <b7ed> 7938 <b7ee> <b7ee> 1675 <b7ef> <b7ef> 7941 <b7f0> <b7f3> 1677 <b7f4> <b7f4> 7942 <b7f5> <b7f7> 1682 <b7f8> <b7f8> 7943 <b7f9> <b7fe> 1686 <b8a1> <b8a6> 1692 <b8a7> <b8a8> 7944 <b8a9> <b8b2> 1700 <b8b3> <b8b4> 7946 <b8b5> <b8b9> 1712 <b8ba> <b8ba> 7948 <b8bb> <b8bb> 1718 <b8bc> <b8bc> 7949 <b8bd> <b8bd> 1720 <b8be> <b8bf> 7950 <b8c0> <b8c2> 1723 <b8c3> <b8c3> 7952 <b8c4> <b8c5> 1727 <b8c6> <b8c7> 7953 <b8c8> <b8c8> 1731 <b8c9> <b8c9> 7955 <b8ca> <b8ce> 1733 <b8cf> <b8cf> 7956 <b8d0> <b8d2> 1739 <b8d3> <b8d6> 7957 <b8d7> <b8d8> 1746 <b8d9> <b8da> 7961 <b8db> <b8e3> 1750 <b8e4> <b8e4> 7963 <b8e5> <b8e8> 1760 <b8e9> <b8e9> 7964 <b8ea> <b8ea> 1765 <b8eb> <b8eb> 7965 <b8ec> <b8f2> 1767 <b8f3> <b8f3> 7966 <b8f4> <b8f4> 1775 <b8f5> <b8f6> 7967 <b8f7> <b8f7> 1778 <b8f8> <b8f8> 7969 <b8f9> <b8fe> 1780 <b9a1> <b9a7> 1786 <b9a8> <b9a8> 7970 <b9a9> <b9ad> 1794 <b9ae> <b9ae> 7971 <b9af> <b9b0> 1800 <b9b1> <b9b1> 7972 <b9b2> <b9b2> 1803 <b9b3> <b9b3> 7973 <b9b4> <b9b4> 1805 <b9b5> <b9b5> 7974 <b9b6> <b9b8> 1807 <b9b9> <b9ba> 7975 <b9bb> <b9c5> 1812 <b9c6> <b9c6> 7977 <b9c7> <b9ca> 1824 <b9cb> <b9cb> 7978 <b9cc> <b9cf> 1829 <b9d0> <b9d0> 7979 <b9d1> <b9d7> 1834 <b9d8> <b9d8> 7980 <b9d9> <b9da> 1842 <b9db> <b9db> 7981 <b9dc> <b9dc> 1845 <b9dd> <b9dd> 7982 <b9de> <b9de> 1847 <b9df> <b9df> 7983 <b9e0> <b9e0> 1849 <b9e1> <b9e1> 7984 <b9e2> <b9e2> 1851 <b9e3> <b9e3> 7985 <b9e4> <b9e5> 1853 <b9e6> <b9e6> 7986 <b9e7> <b9e8> 1856 <b9e9> <b9ec> 7987 <b9ed> <b9ed> 1862 <b9ee> <b9ee> 7991 <b9ef> <b9f0> 1864 <b9f1> <b9f1> 7992 <b9f2> <b9f2> 1867 <b9f3> <b9f5> 7993 <b9f6> <b9f7> 1871 <b9f8> <b9f8> 7996 <b9f9> <b9f9> 1874 <b9fa> <b9fa> 7997 endcidrange 100 begincidrange <b9fb> <b9fc> 1876 <b9fd> <b9fd> 7998 <b9fe> <b9fe> 1879 <baa1> <baa6> 1880 <baa7> <baa7> 7999 <baa8> <baaa> 1887 <baab> <baab> 8000 <baac> <bab9> 1891 <baba> <baba> 8001 <babb> <bac4> 1906 <bac5> <bac5> 8002 <bac6> <bad1> 1917 <bad2> <bad2> 8003 <bad3> <bad6> 1930 <bad7> <bad8> 8004 <bad9> <bae3> 1936 <bae4> <bae4> 8006 <bae5> <bae7> 1948 <bae8> <bae8> 8007 <bae9> <baeb> 1952 <baec> <baec> 8008 <baed> <baf2> 1956 <baf3> <baf3> 5605 <baf4> <baf7> 1963 <baf8> <baf8> 8009 <baf9> <bafe> 1968 <bba1> <bba3> 1974 <bba4> <bba4> 8010 <bba5> <bba5> 1978 <bba6> <bba6> 8011 <bba7> <bba8> 1980 <bba9> <bbaa> 8012 <bbab> <bbac> 1984 <bbad> <bbae> 8014 <bbaf> <bbaf> 1988 <bbb0> <bbb0> 8016 <bbb1> <bbb2> 1990 <bbb3> <bbb3> 8017 <bbb4> <bbb4> 1993 <bbb5> <bbb7> 8018 <bbb8> <bbb8> 1997 <bbb9> <bbba> 8021 <bbbb> <bbd0> 2000 <bbd1> <bbd1> 8023 <bbd2> <bbd2> 2023 <bbd3> <bbd4> 8024 <bbd5> <bbde> 2026 <bbdf> <bbe7> 8026 <bbe8> <bbea> 2045 <bbeb> <bbeb> 8035 <bbec> <bbf0> 2049 <bbf1> <bbf1> 8036 <bbf2> <bbf4> 2055 <bbf5> <bbf7> 8037 <bbf8> <bbf9> 2061 <bbfa> <bbfa> 8040 <bbfb> <bbfc> 2064 <bbfd> <bbfd> 8041 <bbfe> <bbfe> 2067 <bca1> <bca1> 2068 <bca2> <bca2> 8042 <bca3> <bca4> 2070 <bca5> <bca6> 8043 <bca7> <bca7> 2074 <bca8> <bca9> 8045 <bcaa> <bcaa> 2077 <bcab> <bcab> 8047 <bcac> <bcac> 2079 <bcad> <bcad> 8048 <bcae> <bcb5> 2081 <bcb6> <bcb8> 8049 <bcb9> <bcba> 2092 <bcbb> <bcbb> 8052 <bcbc> <bcc0> 2095 <bcc1> <bcc1> 8053 <bcc2> <bcc2> 2101 <bcc3> <bcc3> 8054 <bcc4> <bcc5> 2103 <bcc6> <bcc7> 8055 <bcc8> <bcc9> 2107 <bcca> <bcca> 8057 <bccb> <bccb> 2110 <bccc> <bccd> 8058 <bcce> <bccf> 2113 <bcd0> <bcd0> 8060 <bcd1> <bcd3> 2116 <bcd4> <bcd6> 8061 <bcd7> <bcd7> 2122 <bcd8> <bcd8> 8064 <bcd9> <bcda> 2124 <bcdb> <bcdb> 8065 <bcdc> <bcdc> 2127 <bcdd> <bcdd> 8066 <bcde> <bcde> 2129 <bcdf> <bce1> 8067 <bce2> <bce2> 2133 <bce3> <bce4> 8070 <bce5> <bce7> 2136 <bce8> <bce8> 8072 <bce9> <bce9> 2140 endcidrange 100 begincidrange <bcea> <bcec> 8073 <bced> <bcee> 2144 <bcef> <bcf3> 8076 <bcf4> <bcf5> 2151 <bcf6> <bcfc> 8081 <bcfd> <bcfe> 2160 <bda1> <bda1> 2162 <bda2> <bda7> 8088 <bda8> <bdaa> 2169 <bdab> <bdac> 8094 <bdad> <bdae> 2174 <bdaf> <bdb2> 8096 <bdb3> <bdb3> 2180 <bdb4> <bdb4> 8100 <bdb5> <bdb9> 2182 <bdba> <bdba> 8101 <bdbb> <bdbc> 2188 <bdbd> <bdbf> 8102 <bdc0> <bdc0> 2193 <bdc1> <bdc4> 8105 <bdc5> <bdc7> 2198 <bdc8> <bdca> 8109 <bdcb> <bdcd> 2204 <bdce> <bdcf> 8112 <bdd0> <bdd6> 2209 <bdd7> <bdd7> 8114 <bdd8> <bdd9> 2217 <bdda> <bdda> 8115 <bddb> <bddf> 2220 <bde0> <bde1> 8116 <bde2> <bdea> 2227 <bdeb> <bdeb> 8118 <bdec> <bdf3> 2237 <bdf4> <bdf8> 8119 <bdf9> <bdfc> 2250 <bdfd> <bdfd> 8124 <bdfe> <bdfe> 2255 <bea1> <bea2> 8125 <bea3> <bea4> 2258 <bea5> <bea5> 8127 <bea6> <bea7> 2261 <bea8> <bea8> 8128 <bea9> <bea9> 2264 <beaa> <beaa> 8129 <beab> <beac> 2266 <bead> <bead> 8130 <beae> <beb0> 2269 <beb1> <beb1> 8131 <beb2> <beb4> 2273 <beb5> <beb7> 8132 <beb8> <beb9> 2279 <beba> <beba> 8135 <bebb> <bebf> 2282 <bec0> <bec0> 8136 <bec1> <bec8> 2288 <bec9> <bec9> 8137 <beca> <bed3> 2297 <bed4> <bed4> 8138 <bed5> <bed8> 2308 <bed9> <bed9> 8139 <beda> <bedc> 2313 <bedd> <bedd> 8140 <bede> <bee1> 2317 <bee2> <bee2> 8141 <bee3> <bee4> 2322 <bee5> <bee5> 8142 <bee6> <bee6> 2325 <bee7> <bee7> 8143 <bee8> <bee8> 2327 <bee9> <bee9> 8144 <beea> <beed> 2329 <beee> <beee> 8145 <beef> <bef4> 2334 <bef5> <bef5> 8146 <bef6> <bef6> 2341 <bef7> <bef8> 8147 <bef9> <befa> 2344 <befb> <befc> 8149 <befd> <befe> 2348 <bfa1> <bfa4> 2350 <bfa5> <bfa5> 8151 <bfa6> <bfa9> 2355 <bfaa> <bfaa> 8152 <bfab> <bfac> 2360 <bfad> <bfad> 8153 <bfae> <bfc4> 2363 <bfc5> <bfc5> 8154 <bfc6> <bfc6> 2387 <bfc7> <bfc7> 8155 <bfc8> <bfcd> 2389 <bfce> <bfce> 8156 <bfcf> <bfd0> 2396 <bfd1> <bfd2> 8157 <bfd3> <bfd8> 2400 <bfd9> <bfd9> 8159 <bfda> <bfe1> 2407 <bfe2> <bfe4> 8160 <bfe5> <bfe8> 2418 <bfe9> <bfe9> 8163 <bfea> <bfea> 2423 endcidrange 100 begincidrange <bfeb> <bfeb> 8164 <bfec> <bfec> 2425 <bfed> <bfed> 8165 <bfee> <bff2> 2427 <bff3> <bff3> 8166 <bff4> <bff4> 2433 <bff5> <bff5> 8167 <bff6> <bff6> 2435 <bff7> <bff7> 8168 <bff8> <bff8> 2437 <bff9> <bffa> 8169 <bffb> <bffe> 2440 <c0a1> <c0a1> 8171 <c0a2> <c0a2> 2445 <c0a3> <c0a3> 8172 <c0a4> <c0a8> 2447 <c0a9> <c0a9> 8173 <c0aa> <c0aa> 2453 <c0ab> <c0ab> 8174 <c0ac> <c0ae> 2455 <c0af> <c0b0> 8175 <c0b1> <c0b2> 2460 <c0b3> <c0b6> 8177 <c0b7> <c0b7> 2466 <c0b8> <c0c4> 8181 <c0c5> <c0cb> 2480 <c0cc> <c0cd> 8194 <c0ce> <c0d3> 2489 <c0d4> <c0d4> 8196 <c0d5> <c0d5> 2496 <c0d6> <c0d6> 8197 <c0d7> <c0d7> 2498 <c0d8> <c0d8> 8198 <c0d9> <c0dc> 2500 <c0dd> <c0dd> 8199 <c0de> <c0df> 2505 <c0e0> <c0e0> 8200 <c0e1> <c0e8> 2508 <c0e9> <c0e9> 8201 <c0ea> <c0ea> 2517 <c0eb> <c0ec> 8202 <c0ed> <c0ee> 2520 <c0ef> <c0f1> 8204 <c0f2> <c0f5> 2525 <c0f6> <c0fa> 8207 <c0fb> <c0fe> 2534 <c1a1> <c1a3> 2538 <c1a4> <c1a5> 8212 <c1a6> <c1a8> 2543 <c1a9> <c1ad> 8214 <c1ae> <c1ae> 2551 <c1af> <c1b8> 8219 <c1b9> <c1bc> 2562 <c1bd> <c1be> 8229 <c1bf> <c1c1> 2568 <c1c2> <c1c2> 8231 <c1c3> <c1c5> 2572 <c1c6> <c1c6> 8232 <c1c7> <c1c8> 2576 <c1c9> <c1c9> 8233 <c1ca> <c1cc> 2579 <c1cd> <c1cd> 8234 <c1ce> <c1d3> 2583 <c1d4> <c1d4> 8235 <c1d5> <c1d8> 2590 <c1d9> <c1db> 8236 <c1dc> <c1dd> 2597 <c1de> <c1de> 8239 <c1df> <c1e3> 2600 <c1e4> <c1e5> 8240 <c1e6> <c1e8> 2607 <c1e9> <c1e9> 8242 <c1ea> <c1ea> 2611 <c1eb> <c1ec> 8243 <c1ed> <c1f2> 2614 <c1f3> <c1f3> 8245 <c1f4> <c1f4> 2621 <c1f5> <c1f5> 8246 <c1f6> <c1f9> 2623 <c1fa> <c1fd> 8247 <c1fe> <c1fe> 2631 <c2a1> <c2a1> 2632 <c2a2> <c2a8> 8251 <c2a9> <c2aa> 2640 <c2ab> <c2b3> 8258 <c2b4> <c2b7> 2651 <c2b8> <c2b8> 8267 <c2b9> <c2bb> 2656 <c2bc> <c2bd> 8268 <c2be> <c2be> 2661 <c2bf> <c2bf> 8270 <c2c0> <c2c0> 2663 <c2c1> <c2c1> 8271 <c2c2> <c2c4> 2665 <c2c5> <c2c7> 8272 <c2c8> <c2ca> 2671 <c2cb> <c2d0> 8275 <c2d1> <c2d1> 2680 <c2d2> <c2d2> 8281 <c2d3> <c2d4> 2682 endcidrange 100 begincidrange <c2d5> <c2dc> 8282 <c2dd> <c2dd> 2692 <c2de> <c2e2> 8290 <c2e3> <c2e5> 2698 <c2e6> <c2e8> 8295 <c2e9> <c2e9> 2704 <c2ea> <c2ee> 8298 <c2ef> <c2ef> 2710 <c2f0> <c2f0> 8303 <c2f1> <c2f1> 2712 <c2f2> <c2f5> 8304 <c2f6> <c2f6> 2717 <c2f7> <c2fa> 8308 <c2fb> <c2fe> 2722 <c3a1> <c3a1> 8312 <c3a2> <c3a9> 2727 <c3aa> <c3aa> 8313 <c3ab> <c3ac> 2736 <c3ad> <c3ad> 8314 <c3ae> <c3b2> 2739 <c3b3> <c3b3> 8315 <c3b4> <c3b4> 7673 <c3b5> <c3bd> 2746 <c3be> <c3be> 8316 <c3bf> <c3c4> 2756 <c3c5> <c3c7> 8317 <c3c8> <c3cb> 2765 <c3cc> <c3cc> 8320 <c3cd> <c3cd> 2770 <c3ce> <c3ce> 8321 <c3cf> <c3d4> 2772 <c3d5> <c3d6> 8322 <c3d7> <c3d8> 2780 <c3d9> <c3d9> 8324 <c3da> <c3df> 2783 <c3e0> <c3e0> 8325 <c3e1> <c3e4> 2790 <c3e5> <c3e5> 8326 <c3e6> <c3ec> 2795 <c3ed> <c3ed> 8327 <c3ee> <c3ef> 2803 <c3f0> <c3f0> 8328 <c3f1> <c3f4> 2806 <c3f5> <c3f6> 8329 <c3f7> <c3f8> 2812 <c3f9> <c3fa> 8331 <c3fb> <c3fc> 2816 <c3fd> <c3fd> 8333 <c3fe> <c3fe> 2819 <c4a1> <c4b0> 2820 <c4b1> <c4b1> 8334 <c4b2> <c4b5> 2837 <c4b6> <c4b6> 8335 <c4b7> <c4c5> 2842 <c4c6> <c4c6> 8336 <c4c7> <c4c8> 2858 <c4c9> <c4c9> 8337 <c4ca> <c4d0> 2861 <c4d1> <c4d1> 8338 <c4d2> <c4d2> 2869 <c4d3> <c4d6> 8339 <c4d7> <c4d8> 2874 <c4d9> <c4d9> 8343 <c4da> <c4e1> 2877 <c4e2> <c4e2> 8344 <c4e3> <c4e4> 2886 <c4e5> <c4e5> 8345 <c4e6> <c4eb> 2889 <c4ec> <c4ec> 8346 <c4ed> <c4ef> 2896 <c4f0> <c4f1> 8347 <c4f2> <c4f3> 2901 <c4f4> <c4f4> 8349 <c4f5> <c4f5> 2904 <c4f6> <c4f8> 8350 <c4f9> <c4fa> 2908 <c4fb> <c4fc> 8353 <c4fd> <c4fd> 2912 <c4fe> <c4fe> 8355 <c5a1> <c5a2> 8356 <c5a3> <c5a4> 2916 <c5a5> <c5a9> 8358 <c5aa> <c5b0> 2923 <c5b1> <c5b1> 8363 <c5b2> <c5b4> 2931 <c5b5> <c5b5> 8364 <c5b6> <c5b6> 2935 <c5b7> <c5b9> 8365 <c5ba> <c5ba> 2939 <c5bb> <c5bb> 8368 <c5bc> <c5bc> 2941 <c5bd> <c5bd> 8369 <c5be> <c5cb> 2943 <c5cc> <c5cc> 8370 <c5cd> <c5d2> 2958 <c5d3> <c5d3> 8371 <c5d4> <c5e1> 2965 <c5e2> <c5e2> 8372 <c5e3> <c5e6> 2980 <c5e7> <c5e7> 8373 endcidrange 100 begincidrange <c5e8> <c5f3> 2985 <c5f4> <c5f4> 8374 <c5f5> <c5fe> 2998 <c6a1> <c6ac> 3008 <c6ad> <c6ae> 8375 <c6af> <c6b4> 3022 <c6b5> <c6b6> 8377 <c6b7> <c6ba> 3030 <c6bb> <c6bb> 8379 <c6bc> <c6bd> 3035 <c6be> <c6be> 8380 <c6bf> <c6bf> 3038 <c6c0> <c6c0> 8381 <c6c1> <c6c2> 3040 <c6c3> <c6c4> 8382 <c6c5> <c6ca> 3044 <c6cb> <c6cd> 8384 <c6ce> <c6d2> 3053 <c6d3> <c6d3> 8387 <c6d4> <c6d6> 3059 <c6d7> <c6d7> 8388 <c6d8> <c6e9> 3063 <c6ea> <c6eb> 8389 <c6ec> <c6ee> 3083 <c6ef> <c6ef> 8391 <c6f0> <c6f0> 3087 <c6f1> <c6f1> 8392 <c6f2> <c6f3> 3089 <c6f4> <c6f4> 8393 <c6f5> <c6f7> 3092 <c6f8> <c6f8> 8394 <c6f9> <c6fc> 3096 <c6fd> <c6fd> 8395 <c6fe> <c6fe> 3101 <c7a1> <c7a2> 3102 <c7a3> <c7a3> 8396 <c7a4> <c7a4> 3105 <c7a5> <c7a6> 8397 <c7a7> <c7a7> 3108 <c7a8> <c7a9> 8399 <c7aa> <c7aa> 3111 <c7ab> <c7ab> 8401 <c7ac> <c7ad> 3113 <c7ae> <c7af> 8402 <c7b0> <c7b2> 3117 <c7b3> <c7b5> 8404 <c7b6> <c7b8> 3123 <c7b9> <c7ba> 8407 <c7bb> <c7bc> 3128 <c7bd> <c7be> 8409 <c7bf> <c7bf> 3132 <c7c0> <c7c0> 8411 <c7c1> <c7c1> 3134 <c7c2> <c7c2> 8412 <c7c3> <c7c4> 3136 <c7c5> <c7c5> 8413 <c7c6> <c7c6> 3139 <c7c7> <c7c8> 8414 <c7c9> <c7cb> 3142 <c7cc> <c7cc> 8416 <c7cd> <c7ce> 3146 <c7cf> <c7cf> 8417 <c7d0> <c7d3> 3149 <c7d4> <c7d5> 8418 <c7d6> <c7d6> 3155 <c7d7> <c7d7> 8420 <c7d8> <c7dd> 3157 <c7de> <c7de> 8421 <c7df> <c7e0> 3164 <c7e1> <c7e3> 8422 <c7e4> <c7e9> 3169 <c7ea> <c7ee> 8425 <c7ef> <c7f6> 3180 <c7f7> <c7f8> 8430 <c7f9> <c7fa> 3190 <c7fb> <c7fb> 8432 <c7fc> <c7fc> 3193 <c7fd> <c7fd> 8433 <c7fe> <c7fe> 3195 <c8a1> <c8a2> 3196 <c8a3> <c8a3> 8434 <c8a4> <c8a6> 3199 <c8a7> <c8a8> 8435 <c8a9> <c8af> 3204 <c8b0> <c8b0> 8437 <c8b1> <c8b4> 3212 <c8b5> <c8b5> 8438 <c8b6> <c8b6> 3217 <c8b7> <c8b7> 8439 <c8b8> <c8c2> 3219 <c8c3> <c8c6> 8440 <c8c7> <c8c7> 3234 <c8c8> <c8c8> 8444 <c8c9> <c8cc> 3236 <c8cd> <c8cd> 8445 <c8ce> <c8ce> 3241 <c8cf> <c8cf> 8446 <c8d0> <c8d1> 3243 <c8d2> <c8d2> 8447 <c8d3> <c8d8> 3246 endcidrange 100 begincidrange <c8d9> <c8d9> 8448 <c8da> <c8dd> 3253 <c8de> <c8de> 8449 <c8df> <c8ec> 3258 <c8ed> <c8ed> 8450 <c8ee> <c8f0> 3273 <c8f1> <c8f3> 8451 <c8f4> <c8f6> 3279 <c8f7> <c8f8> 8454 <c8f9> <c8f9> 3284 <c8fa> <c8fa> 8456 <c8fb> <c8fb> 3286 <c8fc> <c8fc> 8457 <c8fd> <c8fe> 3288 <c9a1> <c9a1> 8458 <c9a2> <c9a4> 3291 <c9a5> <c9a5> 8459 <c9a6> <c9a6> 3295 <c9a7> <c9a8> 8460 <c9a9> <c9ab> 3298 <c9ac> <c9ac> 8462 <c9ad> <c9b0> 3302 <c9b1> <c9b1> 8463 <c9b2> <c9b3> 3307 <c9b4> <c9b4> 8464 <c9b5> <c9b7> 3310 <c9b8> <c9b9> 8465 <c9ba> <c9c0> 3315 <c9c1> <c9c2> 8467 <c9c3> <c9c3> 3324 <c9c4> <c9c4> 8469 <c9c5> <c9c8> 3326 <c9c9> <c9c9> 8470 <c9ca> <c9ca> 3331 <c9cb> <c9cb> 8471 <c9cc> <c9cc> 3333 <c9cd> <c9cd> 8472 <c9ce> <c9d4> 3335 <c9d5> <c9d5> 8473 <c9d6> <c9db> 3343 <c9dc> <c9dc> 8474 <c9dd> <c9dd> 3350 <c9de> <c9de> 8475 <c9df> <c9e0> 3352 <c9e1> <c9e1> 8476 <c9e2> <c9e2> 3355 <c9e3> <c9e3> 8477 <c9e4> <c9e4> 3357 <c9e5> <c9e5> 8478 <c9e6> <c9e7> 3359 <c9e8> <c9e8> 8479 <c9e9> <c9ef> 3362 <c9f0> <c9f0> 8480 <c9f1> <c9f2> 3370 <c9f3> <c9f4> 8481 <c9f5> <c9f5> 3374 <c9f6> <c9f6> 8483 <c9f7> <c9f7> 3376 <c9f8> <c9f9> 8484 <c9fa> <c9fd> 3379 <c9fe> <c9fe> 8486 <caa1> <caa3> 3384 <caa4> <caa6> 8487 <caa7> <caa7> 3390 <caa8> <caa8> 8490 <caa9> <caa9> 3392 <caaa> <caab> 8491 <caac> <cab0> 3395 <cab1> <cab1> 8493 <cab2> <cab3> 3401 <cab4> <cab6> 8494 <cab7> <caba> 3406 <cabb> <cabb> 8497 <cabc> <cac5> 3411 <cac6> <cac6> 8498 <cac7> <cac9> 3422 <caca> <caca> 8499 <cacb> <cacc> 3426 <cacd> <cace> 8500 <cacf> <cad2> 3430 <cad3> <cad4> 8502 <cad5> <cad8> 3436 <cad9> <cad9> 8504 <cada> <cadd> 3441 <cade> <cade> 8505 <cadf> <cadf> 3446 <cae0> <cae0> 8506 <cae1> <cae3> 3448 <cae4> <cae4> 8507 <cae5> <cae8> 3452 <cae9> <caea> 8508 <caeb> <caf3> 3458 <caf4> <caf5> 8510 <caf6> <caf6> 3469 <caf7> <caf7> 8512 <caf8> <caf9> 3471 <cafa> <cafa> 8513 <cafb> <cafc> 3474 <cafd> <cafd> 8514 <cafe> <cafe> 3477 endcidrange 100 begincidrange <cba1> <cba6> 3478 <cba7> <cba7> 8515 <cba8> <cbaa> 3485 <cbab> <cbab> 8516 <cbac> <cbac> 3489 <cbad> <cbad> 8517 <cbae> <cbb2> 3491 <cbb3> <cbb3> 8518 <cbb4> <cbb4> 3497 <cbb5> <cbb6> 8519 <cbb7> <cbb7> 3500 <cbb8> <cbb8> 8521 <cbb9> <cbbe> 3502 <cbbf> <cbbf> 8522 <cbc0> <cbc6> 3509 <cbc7> <cbc7> 8523 <cbc8> <cbc8> 3517 <cbc9> <cbcc> 8524 <cbcd> <cbce> 3522 <cbcf> <cbd0> 8528 <cbd1> <cbd2> 3526 <cbd3> <cbd3> 8530 <cbd4> <cbd4> 3529 <cbd5> <cbd5> 8531 <cbd6> <cbde> 3531 <cbdf> <cbe0> 8532 <cbe1> <cbe3> 3542 <cbe4> <cbe4> 8534 <cbe5> <cbe5> 3546 <cbe6> <cbe7> 8535 <cbe8> <cbe9> 3549 <cbea> <cbea> 8537 <cbeb> <cbee> 3552 <cbef> <cbf0> 8538 <cbf1> <cbf4> 3558 <cbf5> <cbf6> 8540 <cbf7> <cbf7> 3564 <cbf8> <cbf8> 8542 <cbf9> <cbfe> 3566 <cca1> <cca2> 8543 <cca3> <cca7> 3574 <cca8> <cca8> 8545 <cca9> <ccab> 3580 <ccac> <ccac> 8546 <ccad> <ccae> 3584 <ccaf> <ccb3> 8547 <ccb4> <ccb6> 3591 <ccb7> <ccb8> 8552 <ccb9> <ccbd> 3596 <ccbe> <ccbe> 8554 <ccbf> <ccbf> 3602 <ccc0> <ccc0> 8555 <ccc1> <cccb> 3604 <cccc> <cccc> 8556 <cccd> <cccd> 3616 <ccce> <ccce> 8557 <cccf> <cccf> 3618 <ccd0> <ccd0> 8558 <ccd1> <ccd5> 3620 <ccd6> <ccd6> 8559 <ccd7> <ccd9> 3626 <ccda> <ccda> 8560 <ccdb> <ccdb> 3630 <ccdc> <ccdc> 8561 <ccdd> <ccdf> 3632 <cce0> <cce0> 8562 <cce1> <cce1> 3636 <cce2> <cce2> 8563 <cce3> <cce4> 3638 <cce5> <cce5> 8564 <cce6> <ccf4> 3641 <ccf5> <ccf5> 8565 <ccf6> <ccf8> 3657 <ccf9> <ccfa> 8566 <ccfb> <ccfb> 3662 <ccfc> <ccfe> 8568 <cda1> <cdac> 3666 <cdad> <cdad> 8571 <cdae> <cdb2> 3679 <cdb3> <cdb3> 8572 <cdb4> <cdb6> 3685 <cdb7> <cdb7> 8573 <cdb8> <cdbb> 3689 <cdbc> <cdbc> 8574 <cdbd> <cdbe> 3694 <cdbf> <cdbf> 8575 <cdc0> <cdc4> 3697 <cdc5> <cdc5> 8576 <cdc6> <cdc6> 3703 <cdc7> <cdc7> 8577 <cdc8> <cdd1> 3705 <cdd2> <cdd2> 8578 <cdd3> <cdd3> 3716 <cdd4> <cdd6> 8579 <cdd7> <cddc> 3720 <cddd> <cddd> 8582 <cdde> <cddf> 3727 <cde0> <cde0> 8583 <cde1> <cde3> 3730 <cde4> <cde5> 8584 endcidrange 100 begincidrange <cde6> <cde6> 3735 <cde7> <cde7> 8586 <cde8> <cdf1> 3737 <cdf2> <cdf2> 8587 <cdf3> <cdf7> 3748 <cdf8> <cdf8> 8588 <cdf9> <cdfe> 3754 <cea1> <cea3> 3760 <cea4> <cea5> 8589 <cea6> <cea6> 3765 <cea7> <cea7> 8591 <cea8> <cea9> 3767 <ceaa> <cead> 8592 <ceae> <ceaf> 3773 <ceb0> <ceb1> 8596 <ceb2> <ceb2> 3777 <ceb3> <ceb3> 8598 <ceb4> <cebc> 3779 <cebd> <cebd> 8599 <cebe> <cebf> 3789 <cec0> <cec0> 8600 <cec1> <cec4> 3792 <cec5> <cec6> 8601 <cec7> <cec7> 3798 <cec8> <cec8> 8603 <cec9> <cec9> 3800 <ceca> <ceca> 8604 <cecb> <cecd> 3802 <cece> <ced1> 8605 <ced2> <ced7> 3809 <ced8> <ceda> 8609 <cedb> <cedb> 3818 <cedc> <cedc> 8612 <cedd> <cedd> 3820 <cede> <cedf> 8613 <cee0> <ceea> 3823 <ceeb> <ceeb> 8615 <ceec> <ceec> 3835 <ceed> <ceed> 8616 <ceee> <cef0> 3837 <cef1> <cef1> 8617 <cef2> <cef2> 3841 <cef3> <cef3> 8618 <cef4> <cefc> 3843 <cefd> <cefe> 8619 <cfa1> <cfad> 3854 <cfae> <cfae> 8621 <cfaf> <cfaf> 3868 <cfb0> <cfb0> 8622 <cfb1> <cfb2> 3870 <cfb3> <cfb3> 8623 <cfb4> <cfb6> 3873 <cfb7> <cfb8> 8624 <cfb9> <cfb9> 3878 <cfba> <cfba> 8626 <cfbb> <cfbc> 3880 <cfbd> <cfbd> 8627 <cfbe> <cfbe> 3883 <cfbf> <cfc1> 8628 <cfc2> <cfc4> 3887 <cfc5> <cfc5> 8631 <cfc6> <cfc6> 3891 <cfc7> <cfc7> 8632 <cfc8> <cfc9> 3893 <cfca> <cfcb> 8633 <cfcc> <cfcc> 3897 <cfcd> <cfce> 8635 <cfcf> <cfcf> 3900 <cfd0> <cfd0> 8637 <cfd1> <cfd3> 3902 <cfd4> <cfd8> 8638 <cfd9> <cfd9> 3910 <cfda> <cfda> 8643 <cfdb> <cfdb> 3912 <cfdc> <cfdc> 8644 <cfdd> <cfde> 3914 <cfdf> <cfdf> 8645 <cfe0> <cfe1> 3917 <cfe2> <cfe2> 8646 <cfe3> <cfe6> 3920 <cfe7> <cfe7> 8647 <cfe8> <cfe9> 3925 <cfea> <cfea> 8648 <cfeb> <cfeb> 3928 <cfec> <cfec> 8649 <cfed> <cfed> 3930 <cfee> <cfee> 8650 <cfef> <cff3> 3932 <cff4> <cff4> 8651 <cff5> <cff8> 3938 <cff9> <cffa> 8652 <cffb> <cffd> 3944 <cffe> <cffe> 8654 <d0a1> <d0a4> 3948 <d0a5> <d0a5> 8655 <d0a6> <d0ac> 3953 <d0ad> <d0ae> 8656 <d0af> <d0b1> 3962 <d0b2> <d0b4> 8658 <d0b5> <d0b9> 3968 endcidrange 100 begincidrange <d0ba> <d0bb> 8661 <d0bc> <d0be> 3975 <d0bf> <d0bf> 8663 <d0c0> <d0c5> 3979 <d0c6> <d0c6> 8664 <d0c7> <d0ca> 3986 <d0cb> <d0cb> 8665 <d0cc> <d0e1> 3991 <d0e2> <d0e2> 8666 <d0e3> <d0e4> 4014 <d0e5> <d0e5> 8667 <d0e6> <d0ea> 4017 <d0eb> <d0eb> 8668 <d0ec> <d0ec> 4023 <d0ed> <d0ed> 8669 <d0ee> <d0f6> 4025 <d0f7> <d0f9> 8670 <d0fa> <d0fb> 4037 <d0fc> <d0fc> 8673 <d0fd> <d0fe> 4040 <d1a1> <d1a2> 8674 <d1a3> <d1a3> 4044 <d1a4> <d1a4> 8676 <d1a5> <d1a6> 4046 <d1a7> <d1a7> 8677 <d1a8> <d1aa> 4049 <d1ab> <d1ab> 8678 <d1ac> <d1ae> 4053 <d1af> <d1b1> 8679 <d1b2> <d1b4> 4059 <d1b5> <d1b7> 8682 <d1b8> <d1b8> 4065 <d1b9> <d1b9> 8685 <d1ba> <d1ba> 4067 <d1bb> <d1bc> 8686 <d1bd> <d1c5> 4070 <d1c6> <d1c8> 8688 <d1c9> <d1ca> 4082 <d1cb> <d1cb> 8691 <d1cc> <d1cd> 4085 <d1ce> <d1cf> 8692 <d1d0> <d1d4> 4089 <d1d5> <d1d6> 8694 <d1d7> <d1dd> 4096 <d1de> <d1de> 8696 <d1df> <d1e0> 4104 <d1e1> <d1e2> 8697 <d1e3> <d1e7> 4108 <d1e8> <d1e9> 8699 <d1ea> <d1eb> 4115 <d1ec> <d1ec> 8701 <d1ed> <d1ed> 4118 <d1ee> <d1ef> 8702 <d1f0> <d1f0> 4121 <d1f1> <d1f1> 8704 <d1f2> <d1f3> 4123 <d1f4> <d1f4> 8705 <d1f5> <d1f6> 4126 <d1f7> <d1f9> 8706 <d1fa> <d1fe> 4131 <d2a1> <d2a1> 4136 <d2a2> <d2a2> 8709 <d2a3> <d2a4> 4138 <d2a5> <d2a5> 8710 <d2a6> <d2a8> 4141 <d2a9> <d2a9> 8711 <d2aa> <d2ae> 4145 <d2af> <d2af> 8712 <d2b0> <d2b2> 4151 <d2b3> <d2b3> 8713 <d2b4> <d2b4> 4155 <d2b5> <d2b6> 8714 <d2b7> <d2bc> 4158 <d2bd> <d2bd> 8716 <d2be> <d2be> 4165 <d2bf> <d2bf> 8717 <d2c0> <d2c2> 4167 <d2c3> <d2c3> 8718 <d2c4> <d2c4> 4171 <d2c5> <d2c5> 8719 <d2c6> <d2c6> 4173 <d2c7> <d2c7> 8720 <d2c8> <d2ce> 4175 <d2cf> <d2cf> 8721 <d2d0> <d2d4> 4183 <d2d5> <d2d5> 8722 <d2d6> <d2d9> 4189 <d2da> <d2da> 8723 <d2db> <d2e3> 4194 <d2e4> <d2e5> 8724 <d2e6> <d2e7> 4205 <d2e8> <d2eb> 8726 <d2ec> <d2ee> 4211 <d2ef> <d2ef> 8730 <d2f0> <d2f0> 4215 <d2f1> <d2f1> 8731 <d2f2> <d2f4> 4217 <d2f5> <d2f5> 8732 <d2f6> <d2f7> 4221 <d2f8> <d2f8> 8733 endcidrange 100 begincidrange <d2f9> <d2fa> 4224 <d2fb> <d2fb> 8734 <d2fc> <d2fd> 4227 <d2fe> <d2fe> 8735 <d3a1> <d3a2> 4230 <d3a3> <d3ac> 8736 <d3ad> <d3ad> 4242 <d3ae> <d3ae> 8746 <d3af> <d3b0> 4244 <d3b1> <d3b1> 8747 <d3b2> <d3b3> 4247 <d3b4> <d3b6> 8748 <d3b7> <d3b7> 4252 <d3b8> <d3b8> 8751 <d3b9> <d3ba> 4254 <d3bb> <d3bb> 8752 <d3bc> <d3c4> 4257 <d3c5> <d3c5> 8753 <d3c6> <d3c6> 4267 <d3c7> <d3c7> 8754 <d3c8> <d3c9> 4269 <d3ca> <d3cc> 8755 <d3cd> <d3d4> 4274 <d3d5> <d3d5> 8758 <d3d6> <d3de> 4283 <d3df> <d3e0> 8759 <d3e1> <d3e2> 4294 <d3e3> <d3e3> 8761 <d3e4> <d3e5> 4297 <d3e6> <d3e6> 8762 <d3e7> <d3ea> 4300 <d3eb> <d3ec> 8763 <d3ed> <d3ee> 4306 <d3ef> <d3ef> 8765 <d3f0> <d3f3> 4309 <d3f4> <d3f4> 8766 <d3f5> <d3fb> 4314 <d3fc> <d3fc> 8767 <d3fd> <d3fd> 4322 <d3fe> <d3fe> 8768 <d4a1> <d4a3> 4324 <d4a4> <d4a4> 8769 <d4a5> <d4a5> 4328 <d4a6> <d4a8> 8770 <d4a9> <d4ae> 4332 <d4af> <d4b2> 8773 <d4b3> <d4b4> 4342 <d4b5> <d4b6> 8777 <d4b7> <d4b7> 4346 <d4b8> <d4b8> 8779 <d4b9> <d4bb> 4348 <d4bc> <d4bc> 8780 <d4bd> <d4bd> 4352 <d4be> <d4bf> 8781 <d4c0> <d4c3> 4355 <d4c4> <d4c4> 8783 <d4c5> <d4c5> 4360 <d4c6> <d4c7> 8784 <d4c8> <d4c8> 4363 <d4c9> <d4c9> 8786 <d4ca> <d4ca> 4365 <d4cb> <d4ce> 8787 <d4cf> <d4d2> 4370 <d4d3> <d4d3> 8791 <d4d4> <d4d7> 4375 <d4d8> <d4d8> 8792 <d4d9> <d4db> 4380 <d4dc> <d4e0> 8793 <d4e1> <d4e3> 4388 <d4e4> <d4e4> 8798 <d4e5> <d4e5> 4392 <d4e6> <d4e6> 8799 <d4e7> <d4ed> 4394 <d4ee> <d4ee> 8800 <d4ef> <d4ef> 4402 <d4f0> <d4f4> 8801 <d4f5> <d4f8> 4408 <d4f9> <d4f9> 8806 <d4fa> <d4fd> 4413 <d4fe> <d4fe> 8807 <d5a1> <d5a2> 8808 <d5a3> <d5a8> 4420 <d5a9> <d5a9> 8810 <d5aa> <d5aa> 4427 <d5ab> <d5ab> 8811 <d5ac> <d5ad> 4429 <d5ae> <d5ae> 8812 <d5af> <d5b0> 4432 <d5b1> <d5b1> 8813 <d5b2> <d5b4> 4435 <d5b5> <d5b8> 8814 <d5b9> <d5ba> 4442 <d5bb> <d5bb> 8818 <d5bc> <d5bc> 4445 <d5bd> <d5bd> 8819 <d5be> <d5bf> 4447 <d5c0> <d5c0> 8820 <d5c1> <d5c4> 4450 <d5c5> <d5c5> 8821 <d5c6> <d5c6> 4455 endcidrange 100 begincidrange <d5c7> <d5c7> 8822 <d5c8> <d5c9> 4457 <d5ca> <d5cb> 8823 <d5cc> <d5cc> 4461 <d5cd> <d5cd> 8825 <d5ce> <d5d3> 4463 <d5d4> <d5d4> 8826 <d5d5> <d5dc> 4470 <d5dd> <d5de> 8827 <d5df> <d5df> 4480 <d5e0> <d5e0> 8829 <d5e1> <d5e1> 4482 <d5e2> <d5e2> 8830 <d5e3> <d5e9> 4484 <d5ea> <d5ec> 8831 <d5ed> <d5ee> 4494 <d5ef> <d5ef> 8834 <d5f0> <d5f1> 4497 <d5f2> <d5f3> 8835 <d5f4> <d5f6> 4501 <d5f7> <d5f7> 5611 <d5f8> <d5fe> 4505 <d6a1> <d6a4> 8837 <d6a5> <d6ae> 4516 <d6af> <d6b0> 8841 <d6b1> <d6b3> 4528 <d6b4> <d6b4> 8843 <d6b5> <d6ba> 4532 <d6bb> <d6bb> 8844 <d6bc> <d6bc> 4539 <d6bd> <d6bd> 8845 <d6be> <d6be> 4541 <d6bf> <d6c0> 8846 <d6c1> <d6c3> 4544 <d6c4> <d6c4> 8848 <d6c5> <d6c9> 4548 <d6ca> <d6ca> 8849 <d6cb> <d6cc> 4554 <d6cd> <d6cd> 8850 <d6ce> <d6d2> 4557 <d6d3> <d6d3> 8851 <d6d4> <d6d4> 4563 <d6d5> <d6d7> 8852 <d6d8> <d6d9> 4567 <d6da> <d6da> 8855 <d6db> <d6de> 4570 <d6df> <d6df> 8856 <d6e0> <d6e0> 4575 <d6e1> <d6e1> 8857 <d6e2> <d6e4> 4577 <d6e5> <d6e5> 8858 <d6e6> <d6e6> 4581 <d6e7> <d6e8> 8859 <d6e9> <d6ed> 4584 <d6ee> <d6ef> 8861 <d6f0> <d6f1> 4591 <d6f2> <d6f2> 8863 <d6f3> <d6f4> 4594 <d6f5> <d6f6> 8864 <d6f7> <d6fb> 4598 <d6fc> <d6fe> 8866 <d7a1> <d7a3> 4606 <d7a4> <d7a4> 8869 <d7a5> <d7a7> 4610 <d7a8> <d7aa> 8870 <d7ab> <d7ab> 4616 <d7ac> <d7ac> 8873 <d7ad> <d7ad> 4618 <d7ae> <d7b1> 8874 <d7b2> <d7b2> 4623 <d7b3> <d7b4> 8878 <d7b5> <d7b5> 4626 <d7b6> <d7b6> 8880 <d7b7> <d7b7> 4628 <d7b8> <d7bc> 8881 <d7bd> <d7c6> 4634 <d7c7> <d7c7> 8886 <d7c8> <d7c9> 4645 <d7ca> <d7ca> 8887 <d7cb> <d7d4> 4648 <d7d5> <d7d5> 8888 <d7d6> <d7da> 4659 <d7db> <d7de> 8889 <d7df> <d7e6> 4668 <d7e7> <d7e7> 8893 <d7e8> <d7e8> 4677 <d7e9> <d7ea> 8894 <d7eb> <d7f9> 4680 <d8a1> <d8c3> 4695 <d8c4> <d8c4> 8896 <d8c5> <d8c6> 4731 <d8c7> <d8c7> 8897 <d8c8> <d8c8> 4734 <d8c9> <d8c9> 8898 <d8ca> <d8cb> 4736 <d8cc> <d8cd> 8899 <d8ce> <d8cf> 4740 <d8d0> <d8d1> 8901 <d8d2> <d8d2> 4744 <d8d3> <d8d3> 8903 endcidrange 100 begincidrange <d8d4> <d8d8> 4746 <d8d9> <d8d9> 8904 <d8da> <d8da> 4752 <d8db> <d8dc> 8905 <d8dd> <d8f0> 4755 <d8f1> <d8f1> 8907 <d8f2> <d8f5> 4776 <d8f6> <d8f7> 8908 <d8f8> <d8fe> 4782 <d9a1> <d9ac> 4789 <d9ad> <d9ad> 8910 <d9ae> <d9ae> 4802 <d9af> <d9af> 8911 <d9b0> <d9b0> 4804 <d9b1> <d9b3> 8912 <d9b4> <d9c6> 4808 <d9c7> <d9c7> 8915 <d9c8> <d9cc> 4828 <d9cd> <d9d0> 8916 <d9d1> <d9dc> 4837 <d9dd> <d9dd> 8920 <d9de> <d9e0> 4850 <d9e1> <d9e1> 8921 <d9e2> <d9e3> 4854 <d9e4> <d9e4> 8922 <d9e5> <d9e5> 4857 <d9e6> <d9e6> 8923 <d9e7> <d9eb> 4859 <d9ec> <d9ec> 8924 <d9ed> <d9f3> 4865 <d9f4> <d9f5> 8925 <d9f6> <d9fe> 4874 <daa1> <daa4> 4883 <daa5> <dadf> 8927 <dae0> <dae9> 4946 <daea> <daea> 8986 <daeb> <daf6> 4957 <daf7> <daf7> 8987 <daf8> <daf8> 4970 <daf9> <daf9> 8988 <dafa> <dafd> 4972 <dafe> <dafe> 8989 <dba1> <dba2> 4977 <dba3> <dba3> 8990 <dba4> <dba5> 4980 <dba6> <dba6> 8991 <dba7> <dba8> 4983 <dba9> <dbaa> 8992 <dbab> <dbba> 4987 <dbbb> <dbbb> 8994 <dbbc> <dbbc> 5004 <dbbd> <dbbd> 8995 <dbbe> <dbce> 5006 <dbcf> <dbcf> 8996 <dbd0> <dbd0> 5024 <dbd1> <dbd1> 8997 <dbd2> <dbda> 5026 <dbdb> <dbdb> 8998 <dbdc> <dbdd> 5036 <dbde> <dbde> 8999 <dbdf> <dbe1> 5039 <dbe2> <dbe2> 9000 <dbe3> <dbe3> 5043 <dbe4> <dbe4> 9001 <dbe5> <dbea> 5045 <dbeb> <dbeb> 9002 <dbec> <dbed> 5052 <dbee> <dbee> 9003 <dbef> <dbf0> 5055 <dbf1> <dbf1> 9004 <dbf2> <dbf4> 5058 <dbf5> <dbf7> 9005 <dbf8> <dbfe> 5064 <dca1> <dcbb> 5071 <dcbc> <dcbc> 9008 <dcbd> <dcbe> 5099 <dcbf> <dcbf> 9009 <dcc0> <dcc1> 5102 <dcc2> <dcc2> 9010 <dcc3> <dcc7> 5105 <dcc8> <dcca> 9011 <dccb> <dcd0> 5113 <dcd1> <dcd1> 9014 <dcd2> <dcd6> 5120 <dcd7> <dcd7> 9015 <dcd8> <dcdf> 5126 <dce0> <dce0> 9016 <dce1> <dce2> 5135 <dce3> <dce4> 9017 <dce5> <dce8> 5139 <dce9> <dcea> 9019 <dceb> <dcf0> 5145 <dcf1> <dcf1> 9021 <dcf2> <dcf5> 5152 <dcf6> <dcf6> 9022 <dcf7> <dcf8> 5157 <dcf9> <dcf9> 9023 <dcfa> <dcfc> 5160 <dcfd> <dcfe> 9024 <dda1> <dda1> 9026 endcidrange 100 begincidrange <dda2> <dda2> 5166 <dda3> <dda7> 9027 <dda8> <dda9> 5172 <ddaa> <ddab> 9032 <ddac> <ddb1> 5176 <ddb2> <ddb2> 9034 <ddb3> <ddb4> 5183 <ddb5> <ddb5> 9035 <ddb6> <ddb9> 5186 <ddba> <ddbb> 9036 <ddbc> <ddd2> 5192 <ddd3> <ddd3> 9038 <ddd4> <ddda> 5216 <dddb> <dddb> 9039 <dddc> <dddd> 5224 <ddde> <ddde> 9040 <dddf> <dde3> 5227 <dde4> <dde4> 9041 <dde5> <ddea> 5233 <ddeb> <ddeb> 9042 <ddec> <ddf0> 5240 <ddf1> <ddf1> 9043 <ddf2> <ddf5> 5246 <ddf6> <ddf7> 9044 <ddf8> <ddfb> 5252 <ddfc> <ddfc> 9046 <ddfd> <ddfd> 5257 <ddfe> <ddfe> 9047 <dea1> <deac> 5259 <dead> <dead> 9048 <deae> <deb3> 5272 <deb4> <deb4> 9049 <deb5> <deb9> 5279 <deba> <deba> 9050 <debb> <dec5> 5285 <dec6> <dec6> 9051 <dec7> <dece> 5297 <decf> <decf> 9052 <ded0> <ded0> 5306 <ded1> <ded2> 9053 <ded3> <ded7> 5309 <ded8> <ded8> 9055 <ded9> <dee1> 5315 <dee2> <dee2> 9056 <dee3> <dee7> 5325 <dee8> <dee8> 9057 <dee9> <deeb> 5331 <deec> <deec> 9058 <deed> <def2> 5335 <def3> <def3> 9059 <def4> <defb> 5342 <defc> <defc> 9060 <defd> <defe> 5351 <dfa1> <dfa1> 5353 <dfa2> <dfa3> 9061 <dfa4> <dfa4> 5356 <dfa5> <dfa5> 9063 <dfa6> <dfb3> 5358 <dfb4> <dfb4> 9064 <dfb5> <dfbb> 5373 <dfbc> <dfbd> 9065 <dfbe> <dfbe> 5382 <dfbf> <dfbf> 9067 <dfc0> <dfc1> 5384 <dfc2> <dfc3> 9068 <dfc4> <dfcb> 5388 <dfcc> <dfcc> 9070 <dfcd> <dfcf> 5397 <dfd0> <dfd0> 9071 <dfd1> <dfd4> 5401 <dfd5> <dfd5> 9072 <dfd6> <dfd7> 5406 <dfd8> <dfd9> 9073 <dfda> <dfdb> 5410 <dfdc> <dfdc> 9075 <dfdd> <dfdf> 5413 <dfe0> <dfe0> 9076 <dfe1> <dfe1> 5417 <dfe2> <dfe2> 9077 <dfe3> <dfe5> 5419 <dfe6> <dfe6> 9078 <dfe7> <dfe8> 5423 <dfe9> <dfe9> 9079 <dfea> <dfea> 5426 <dfeb> <dfeb> 9080 <dfec> <dfee> 5428 <dfef> <dfef> 9081 <dff0> <dff4> 5432 <dff5> <dff5> 9082 <dff6> <dff8> 5438 <dff9> <dff9> 9083 <dffa> <dffe> 5442 <e0a1> <e0b5> 5447 <e0b6> <e0b7> 9084 <e0b8> <e0be> 5470 <e0bf> <e0bf> 9086 <e0c0> <e0c7> 5478 <e0c8> <e0c8> 9087 <e0c9> <e0cd> 5487 <e0ce> <e0ce> 9088 endcidrange 100 begincidrange <e0cf> <e0d2> 5493 <e0d3> <e0d3> 9089 <e0d4> <e0df> 5498 <e0e0> <e0e0> 9090 <e0e1> <e0ef> 5511 <e0f0> <e0f0> 9091 <e0f1> <e0f7> 5527 <e0f8> <e0f8> 9092 <e0f9> <e0fb> 5535 <e0fc> <e0fe> 9093 <e1a1> <e1aa> 5541 <e1ab> <e1ab> 9096 <e1ac> <e1ac> 5552 <e1ad> <e1ad> 9097 <e1ae> <e1af> 5554 <e1b0> <e1b0> 9098 <e1b1> <e1b3> 5557 <e1b4> <e1b4> 9099 <e1b5> <e1ba> 5561 <e1bb> <e1bb> 9100 <e1bc> <e1bc> 5568 <e1bd> <e1bd> 9101 <e1be> <e1bf> 5570 <e1c0> <e1c1> 9102 <e1c2> <e1c8> 5574 <e1c9> <e1c9> 9104 <e1ca> <e1cf> 5582 <e1d0> <e1d0> 9105 <e1d1> <e1da> 5589 <e1db> <e1db> 9106 <e1dc> <e1e0> 5600 <e1e1> <e1e1> 1962 <e1e2> <e1e2> 9107 <e1e3> <e1e6> 5607 <e1e7> <e1e7> 4504 <e1e8> <e1ed> 5612 <e1ee> <e1ef> 9108 <e1f0> <e1f5> 5620 <e1f6> <e1f6> 9110 <e1f7> <e1f7> 5627 <e1f8> <e1f8> 9111 <e1f9> <e1fc> 5629 <e1fd> <e1fd> 9112 <e1fe> <e1fe> 5634 <e2a1> <e2a3> 5635 <e2a4> <e2a4> 9113 <e2a5> <e2a7> 5639 <e2a8> <e2a8> 9114 <e2a9> <e2ba> 5643 <e2bb> <e2c4> 9115 <e2c5> <e2c5> 4293 <e2c6> <e2ce> 9125 <e2cf> <e2cf> 5681 <e2d0> <e2d0> 9134 <e2d1> <e2d8> 5683 <e2d9> <e2d9> 9135 <e2da> <e2e2> 5692 <e2e3> <e2e4> 9136 <e2e5> <e2e5> 5703 <e2e6> <e2e6> 9138 <e2e7> <e2e8> 5705 <e2e9> <e2eb> 9139 <e2ec> <e2f7> 5710 <e2f8> <e2f8> 9142 <e2f9> <e2f9> 5723 <e2fa> <e2fd> 9143 <e2fe> <e2fe> 5728 <e3a1> <e3a1> 5729 <e3a2> <e3a2> 9147 <e3a3> <e3a4> 5731 <e3a5> <e3a5> 9148 <e3a6> <e3aa> 5734 <e3ab> <e3ab> 9149 <e3ac> <e3b3> 5740 <e3b4> <e3b4> 9150 <e3b5> <e3c4> 5749 <e3c5> <e3db> 9151 <e3dc> <e3e2> 5788 <e3e3> <e3e3> 9174 <e3e4> <e3ec> 5796 <e3ed> <e3ed> 9175 <e3ee> <e3f0> 5806 <e3f1> <e3f2> 9176 <e3f3> <e3f7> 5811 <e3f8> <e3f8> 9178 <e3f9> <e3fd> 5817 <e3fe> <e3fe> 9179 <e4a1> <e4a3> 5823 <e4a4> <e4a5> 9180 <e4a6> <e4aa> 5828 <e4ab> <e4ab> 9182 <e4ac> <e4ae> 5834 <e4af> <e4b1> 9183 <e4b2> <e4b4> 5840 <e4b5> <e4b6> 9186 <e4b7> <e4c1> 5845 <e4c2> <e4c2> 9188 <e4c3> <e4c4> 5857 <e4c5> <e4c5> 9189 <e4c6> <e4c8> 5860 endcidrange 100 begincidrange <e4c9> <e4c9> 9190 <e4ca> <e4d8> 5864 <e4d9> <e4d9> 9191 <e4da> <e4db> 5880 <e4dc> <e4dc> 9192 <e4dd> <e4dd> 5883 <e4de> <e4de> 9193 <e4df> <e4e3> 5885 <e4e4> <e4e4> 9194 <e4e5> <e4ea> 5891 <e4eb> <e4ec> 9195 <e4ed> <e4f1> 5899 <e4f2> <e4f2> 9197 <e4f3> <e4fd> 5905 <e4fe> <e4fe> 9198 <e5a1> <e5af> 5917 <e5b0> <e5b0> 9199 <e5b1> <e5b8> 5933 <e5b9> <e5b9> 9200 <e5ba> <e5c6> 5942 <e5c7> <e5c7> 9201 <e5c8> <e5c8> 5956 <e5c9> <e5c9> 9202 <e5ca> <e5cd> 5958 <e5ce> <e5ce> 9203 <e5cf> <e5ef> 5963 <e5f0> <e5f0> 9204 <e5f1> <e5f1> 5997 <e5f2> <e5f2> 9205 <e5f3> <e5fb> 5999 <e5fc> <e5fd> 9206 <e5fe> <e5fe> 6010 <e6a1> <e6a2> 6011 <e6a3> <e6a3> 9208 <e6a4> <e6aa> 6014 <e6ab> <e6ac> 9209 <e6ad> <e6ad> 6023 <e6ae> <e6ae> 9211 <e6af> <e6b3> 6025 <e6b4> <e6b5> 9212 <e6b6> <e6be> 6032 <e6bf> <e6bf> 9214 <e6c0> <e6c7> 6042 <e6c8> <e6c9> 9215 <e6ca> <e6cc> 6052 <e6cd> <e6cd> 9217 <e6ce> <e6df> 6056 <e6e0> <e6fe> 9218 <e7a1> <e7da> 9249 <e7db> <e7e0> 6163 <e7e1> <e7e2> 9307 <e7e3> <e7e6> 6171 <e7e7> <e7e7> 9309 <e7e8> <e7ee> 6176 <e7ef> <e7ef> 9310 <e7f0> <e7f3> 6184 <e7f4> <e7f6> 9311 <e7f7> <e7fe> 6191 <e8a1> <e8a7> 6199 <e8a8> <e8a8> 9314 <e8a9> <e8ab> 6207 <e8ac> <e8ac> 9315 <e8ad> <e8b5> 6211 <e8b6> <e8b6> 9316 <e8b7> <e8b7> 6221 <e8b8> <e8ba> 9317 <e8bb> <e8be> 6225 <e8bf> <e8c0> 9320 <e8c1> <e8c4> 6231 <e8c5> <e8c5> 9322 <e8c6> <e8c6> 6236 <e8c7> <e8c9> 9323 <e8ca> <e8cd> 6240 <e8ce> <e8ce> 9326 <e8cf> <e8cf> 6245 <e8d0> <e8d0> 9327 <e8d1> <e8d2> 6247 <e8d3> <e8d3> 9328 <e8d4> <e8dc> 6250 <e8dd> <e8dd> 9329 <e8de> <e8de> 6260 <e8df> <e8df> 9330 <e8e0> <e8e1> 6262 <e8e2> <e8e3> 9331 <e8e4> <e8e4> 6266 <e8e5> <e8e5> 9333 <e8e6> <e8e6> 6268 <e8e7> <e8e7> 9334 <e8e8> <e8ea> 6270 <e8eb> <e8eb> 9335 <e8ec> <e8ec> 6274 <e8ed> <e8ed> 9336 <e8ee> <e8ee> 6276 <e8ef> <e8ef> 9337 <e8f0> <e8f8> 6278 <e8f9> <e8f9> 9338 <e8fa> <e8fb> 6288 <e8fc> <e8fd> 9339 <e8fe> <e8fe> 6292 <e9a1> <e9a1> 9341 endcidrange 100 begincidrange <e9a2> <e9ac> 6294 <e9ad> <e9ad> 9342 <e9ae> <e9b3> 6306 <e9b4> <e9b5> 9343 <e9b6> <e9b6> 6314 <e9b7> <e9b7> 9345 <e9b8> <e9c3> 6316 <e9c4> <e9c4> 9346 <e9c5> <e9c5> 6329 <e9c6> <e9c6> 9347 <e9c7> <e9c8> 6331 <e9c9> <e9c9> 9348 <e9ca> <e9d5> 6334 <e9d6> <e9d6> 9349 <e9d7> <e9d9> 6347 <e9da> <e9da> 9350 <e9db> <e9e3> 6351 <e9e4> <e9e4> 9351 <e9e5> <e9e5> 6361 <e9e6> <e9e7> 9352 <e9e8> <e9e8> 6364 <e9e9> <e9e9> 9354 <e9ea> <e9ea> 6366 <e9eb> <e9eb> 9355 <e9ec> <e9ec> 6368 <e9ed> <e9fe> 9356 <eaa1> <eaa5> 9374 <eaa6> <eaa6> 6392 <eaa7> <eaa8> 9379 <eaa9> <eab0> 6395 <eab1> <eab1> 9381 <eab2> <eabb> 6404 <eabc> <eabc> 9382 <eabd> <eac9> 6415 <eaca> <eaca> 9383 <eacb> <eacc> 6429 <eacd> <eacd> 9384 <eace> <ead2> 6432 <ead3> <ead3> 9385 <ead4> <ead9> 6438 <eada> <eaef> 9386 <eaf0> <eafe> 6466 <eba1> <eba6> 6481 <eba7> <eba7> 9408 <eba8> <eba9> 6488 <ebaa> <ebaa> 9409 <ebab> <ebb1> 6491 <ebb2> <ebb2> 9410 <ebb3> <ebb8> 6499 <ebb9> <ebb9> 9411 <ebba> <ebc9> 6506 <ebca> <ebcb> 9412 <ebcc> <ebcc> 6524 <ebcd> <ebcd> 9414 <ebce> <ebd5> 6526 <ebd6> <ebd6> 9415 <ebd7> <ebd9> 6535 <ebda> <ebda> 9416 <ebdb> <ebe0> 6539 <ebe1> <ebe1> 9417 <ebe2> <ebf6> 6546 <ebf7> <ebf7> 9418 <ebf8> <ebfe> 6568 <eca1> <eca2> 6575 <eca3> <eca3> 9419 <eca4> <eca8> 6578 <eca9> <ecae> 9420 <ecaf> <ecb0> 6589 <ecb1> <ecb1> 9426 <ecb2> <ecb3> 6592 <ecb4> <ecb5> 9427 <ecb6> <ecbd> 6596 <ecbe> <ecbf> 9429 <ecc0> <ecc0> 6606 <ecc1> <ecc1> 9431 <ecc2> <ecc6> 6608 <ecc7> <ecc7> 9432 <ecc8> <ecca> 6614 <eccb> <eccb> 9433 <eccc> <ece1> 6618 <ece2> <ece2> 9434 <ece3> <ecf1> 6641 <ecf2> <ecf2> 9435 <ecf3> <ecf4> 6657 <ecf5> <ecf5> 9436 <ecf6> <ecf7> 6660 <ecf8> <ecf8> 9437 <ecf9> <ecfe> 6663 <eda1> <eda1> 9438 <eda2> <eda7> 6670 <eda8> <eda8> 9439 <eda9> <edae> 6677 <edaf> <edb0> 9440 <edb1> <edb3> 6685 <edb4> <edb4> 9442 <edb5> <edb5> 6689 <edb6> <edb6> 9443 <edb7> <edb7> 6691 <edb8> <edb8> 9444 <edb9> <edb9> 6693 endcidrange 100 begincidrange <edba> <edba> 9445 <edbb> <edbe> 6695 <edbf> <edbf> 9446 <edc0> <edc1> 6700 <edc2> <edc3> 9447 <edc4> <edcb> 6704 <edcc> <edcd> 9449 <edce> <edd2> 6714 <edd3> <edd3> 9451 <edd4> <edd6> 6720 <edd7> <edd7> 9452 <edd8> <ede7> 6724 <ede8> <ede8> 9453 <ede9> <eded> 6741 <edee> <edee> 9454 <edef> <edf8> 6747 <edf9> <edfa> 9455 <edfb> <edfe> 6759 <eea1> <eebb> 6763 <eebc> <eebc> 9457 <eebd> <eebe> 6791 <eebf> <eebf> 9458 <eec0> <eec3> 6794 <eec4> <eefe> 9459 <efa1> <eff1> 9518 <eff2> <effe> 6938 <f0a1> <f0a2> 6951 <f0a3> <f0a3> 9599 <f0a4> <f0ae> 6954 <f0af> <f0d9> 9600 <f0da> <f0db> 7008 <f0dc> <f0dd> 9643 <f0de> <f0de> 7012 <f0df> <f0df> 9645 <f0e0> <f0e8> 7014 <f0e9> <f0e9> 9646 <f0ea> <f0eb> 7024 <f0ec> <f0ec> 9647 <f0ed> <f0ee> 7027 <f0ef> <f0ef> 9648 <f0f0> <f0f6> 7030 <f0f7> <f0f7> 9649 <f0f8> <f0f8> 7038 <f0f9> <f0f9> 9650 <f0fa> <f0fb> 7040 <f0fc> <f0fc> 9651 <f0fd> <f0fe> 7043 <f1a1> <f1a7> 7045 <f1a8> <f1a8> 9652 <f1a9> <f1aa> 7053 <f1ab> <f1ab> 9653 <f1ac> <f1ad> 7056 <f1ae> <f1ae> 9654 <f1af> <f1b1> 7059 <f1b2> <f1b2> 9655 <f1b3> <f1bb> 7063 <f1bc> <f1bc> 9656 <f1bd> <f1bf> 7073 <f1c0> <f1c0> 9657 <f1c1> <f1c8> 7077 <f1c9> <f1c9> 9658 <f1ca> <f1cc> 7086 <f1cd> <f1cd> 9659 <f1ce> <f1ce> 7090 <f1cf> <f1d0> 9660 <f1d1> <f1d9> 7093 <f1da> <f1da> 9662 <f1db> <f1db> 7103 <f1dc> <f1dc> 9663 <f1dd> <f1e3> 7105 <f1e4> <f1e4> 9664 <f1e5> <f1eb> 7113 <f1ec> <f1ec> 9665 <f1ed> <f1ee> 7121 <f1ef> <f1ef> 9666 <f1f0> <f1f6> 7124 <f1f7> <f1f7> 9667 <f1f8> <f1f8> 7132 <f1f9> <f1f9> 9668 <f1fa> <f1fb> 7134 <f1fc> <f1fe> 9669 <f2a1> <f2ad> 9672 <f2ae> <f2b0> 7152 <f2b1> <f2b2> 9685 <f2b3> <f2b8> 7157 <f2b9> <f2b9> 9687 <f2ba> <f2c2> 7164 <f2c3> <f2c3> 9688 <f2c4> <f2c8> 7174 <f2c9> <f2c9> 9689 <f2ca> <f2cb> 7180 <f2cc> <f2cd> 9690 <f2ce> <f2ce> 7184 <f2cf> <f2cf> 9692 <f2d0> <f2d2> 7186 <f2d3> <f2d3> 9693 <f2d4> <f2e4> 7190 <f2e5> <f2e5> 9694 <f2e6> <f2ed> 7208 <f2ee> <f2ee> 9695 endcidrange 100 begincidrange <f2ef> <f2f6> 7217 <f2f7> <f2f7> 9696 <f2f8> <f2fc> 7226 <f2fd> <f2fd> 9697 <f2fe> <f2fe> 7232 <f3a1> <f3be> 7233 <f3bf> <f3bf> 9698 <f3c0> <f3c5> 7264 <f3c6> <f3c6> 9699 <f3c7> <f3c7> 7271 <f3c8> <f3c8> 9700 <f3c9> <f3d5> 7273 <f3d6> <f3d6> 9701 <f3d7> <f3d8> 7287 <f3d9> <f3d9> 9702 <f3da> <f3e4> 7290 <f3e5> <f3e6> 9703 <f3e7> <f3e9> 7303 <f3ea> <f3ea> 9705 <f3eb> <f3eb> 7307 <f3ec> <f3ec> 9706 <f3ed> <f3ee> 7309 <f3ef> <f3ef> 9707 <f3f0> <f3f0> 7312 <f3f1> <f3f1> 9708 <f3f2> <f3fc> 7314 <f3fd> <f3fd> 9709 <f3fe> <f3fe> 7326 <f4a1> <f4a4> 7327 <f4a5> <f4a5> 9710 <f4a6> <f4ae> 7332 <f4af> <f4af> 9711 <f4b0> <f4b4> 7342 <f4b5> <f4b5> 9712 <f4b6> <f4c0> 7348 <f4c1> <f4c1> 9713 <f4c2> <f4c6> 7360 <f4c7> <f4c7> 9714 <f4c8> <f4ce> 7366 <f4cf> <f4d0> 9715 <f4d1> <f4d5> 7375 <f4d6> <f4d6> 9717 <f4d7> <f4e9> 7381 <f4ea> <f4ea> 9718 <f4eb> <f4ee> 7401 <f4ef> <f4ef> 9719 <f4f0> <f4f4> 7406 <f4f5> <f4f5> 9720 <f4f6> <f4fe> 7412 <f5a1> <f5a5> 7421 <f5a6> <f5a7> 9721 <f5a8> <f5b9> 7428 <f5ba> <f5bb> 9723 <f5bc> <f5c3> 7448 <f5c4> <f5c4> 9725 <f5c5> <f5c7> 7457 <f5c8> <f5c8> 9726 <f5c9> <f5cd> 7461 <f5ce> <f5cf> 9727 <f5d0> <f5d0> 7468 <f5d1> <f5d2> 9729 <f5d3> <f5d8> 7471 <f5d9> <f5d9> 9731 <f5da> <f5db> 7478 <f5dc> <f5dc> 9732 <f5dd> <f5e5> 7481 <f5e6> <f5e7> 9733 <f5e8> <f5ee> 7492 <f5ef> <f5ef> 9735 <f5f0> <f5f1> 7500 <f5f2> <f5f2> 9736 <f5f3> <f5fb> 7503 <f5fc> <f5fc> 9737 <f5fd> <f5fe> 7513 <f6a1> <f6a2> 7515 <f6a3> <f6a3> 9738 <f6a4> <f6a5> 7518 <f6a6> <f6a6> 9739 <f6a7> <f6a7> 7521 <f6a8> <f6a8> 9740 <f6a9> <f6aa> 7523 <f6ab> <f6ab> 9741 <f6ac> <f6af> 7526 <f6b0> <f6b0> 9742 <f6b1> <f6b2> 7531 <f6b3> <f6be> 9743 <f6bf> <f6c4> 7545 <f6c5> <f6c5> 9755 <f6c6> <f6c6> 7552 <f6c7> <f6c7> 9756 <f6c8> <f6c8> 7554 <f6c9> <f6c9> 9757 <f6ca> <f6ce> 7556 <f6cf> <f6fe> 9758 <f7a1> <f7af> 9806 <f7b0> <f7b1> 7624 <f7b2> <f7b3> 9821 <f7b4> <f7b4> 7628 <f7b5> <f7b5> 9823 <f7b6> <f7bc> 7630 endcidrange 83 begincidrange <f7bd> <f7bd> 9824 <f7be> <f7c2> 7638 <f7c3> <f7c3> 9825 <f7c4> <f7c4> 7644 <f7c5> <f7c6> 9826 <f7c7> <f7c9> 7647 <f7ca> <f7cb> 9828 <f7cc> <f7ce> 7652 <f7cf> <f7d0> 9830 <f7d1> <f7dd> 7657 <f7de> <f7de> 9832 <f7df> <f7e0> 7671 <f7e1> <f7e1> 2745 <f7e2> <f7f1> 7674 <f7f2> <f7f2> 9833 <f7f3> <f7f4> 7691 <f7f5> <f7f5> 9834 <f7f6> <f7fe> 7694 <f8a1> <f8a6> 9835 <f8a7> <f8a7> 1228 <f8a8> <f8a8> 1290 <f8a9> <f8a9> 1304 <f8aa> <f8ab> 9841 <f8ac> <f8ac> 1428 <f8ad> <f8ad> 1486 <f8ae> <f8ae> 9843 <f8af> <f8af> 1526 <f8b0> <f8b1> 9844 <f8b2> <f8b2> 1619 <f8b3> <f8b3> 1662 <f8b4> <f8b4> 9846 <f8b5> <f8b5> 1732 <f8b6> <f8b7> 9847 <f8b8> <f8b8> 1852 <f8b9> <f8ba> 9849 <f8bb> <f8bb> 1987 <f8bc> <f8bf> 9851 <f8c0> <f8c0> 2091 <f8c1> <f8c1> 9855 <f8c2> <f8c2> 2126 <f8c3> <f8c3> 2153 <f8c4> <f8c5> 9856 <f8c6> <f8c6> 2316 <f8c7> <f8c8> 9858 <f8c9> <f8c9> 2417 <f8ca> <f8ca> 9860 <f8cb> <f8cc> 2458 <f8cd> <f8cd> 9861 <f8ce> <f8ce> 2522 <f8cf> <f8cf> 9862 <f8d0> <f8d0> 2554 <f8d1> <f8db> 9863 <f8dc> <f8dc> 3034 <f8dd> <f8dd> 3037 <f8de> <f8de> 3050 <f8df> <f8df> 3052 <f8e0> <f8e0> 3058 <f8e1> <f8e5> 9874 <f8e6> <f8e6> 3218 <f8e7> <f8e7> 3354 <f8e8> <f8e8> 3468 <f8e9> <f8e9> 3518 <f8ea> <f8ea> 9879 <f8eb> <f8eb> 3579 <f8ec> <f8ee> 9880 <f8ef> <f8ef> 3696 <f8f0> <f8f0> 9883 <f8f1> <f8f1> 3747 <f8f2> <f8f7> 9884 <f8f8> <f8f8> 4157 <f8f9> <f8f9> 4313 <f8fa> <f8fb> 9890 <f8fc> <f8fc> 4347 <f8fd> <f8fd> 4361 <f8fe> <f8fe> 9892 <f9a1> <f9a1> 4513 <f9a2> <f9a2> 9893 <f9a3> <f9a3> 4538 <f9a4> <f9a5> 9894 <f9a6> <f9a6> 4565 <f9a7> <f9a7> 9896 <f9a8> <f9a8> 4605 <f9a9> <f9a9> 4633 endcidrange endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF \ No newline at end of file
diff --git a/src/main/resources/Resources/cmap/GBT-EUC-V b/src/main/resources/Resources/cmap/GBT-EUC-V
new file mode 100644
index 0000000..39fd71e
--- /dev/null
+++ b/src/main/resources/Resources/cmap/GBT-EUC-V
@@ -0,0 +1 @@
+%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%DocumentNeededResources: CMap (GBT-EUC-H) %%IncludeResource: ProcSet (CIDInit) %%IncludeResource: CMap (GBT-EUC-H) %%BeginResource: CMap (GBT-EUC-V) %%Title: (GBT-EUC-V Adobe GB1 1) %%Version: 10.001 %%Copyright: ----------------------------------------------------------- %%Copyright: Copyright 1990-1998 Adobe Systems Incorporated. %%Copyright: All Rights Reserved. %%Copyright: %%Copyright: Patents Pending %%Copyright: %%Copyright: NOTICE: All information contained herein is the property %%Copyright: of Adobe Systems Incorporated. %%Copyright: %%Copyright: Permission is granted for redistribution of this file %%Copyright: provided this copyright notice is maintained intact and %%Copyright: that the contents of this file are not altered in any %%Copyright: way from its original form. %%Copyright: %%Copyright: PostScript and Display PostScript are trademarks of %%Copyright: Adobe Systems Incorporated which may be registered in %%Copyright: certain jurisdictions. %%Copyright: ----------------------------------------------------------- %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /GBT-EUC-H usecmap /CIDSystemInfo 3 dict dup begin /Registry (Adobe) def /Ordering (GB1) def /Supplement 1 def end def /CMapName /GBT-EUC-V def /CMapVersion 10.001 def /CMapType 1 def /UIDOffset 690 def /XUID [1 10 25371] def /WMode 1 def 20 begincidrange <a1a2> <a1a2> 575 <a1a3> <a1a3> 574 <a1aa> <a1aa> 598 <a1ab> <a1ac> 7704 <a1ad> <a1ad> 599 <a1b2> <a1bf> 582 <a1fe> <a1fe> 7706 <a3a1> <a3a1> 578 <a3a8> <a3a9> 580 <a3ac> <a3ac> 573 <a3ae> <a3ae> 7707 <a3ba> <a3bb> 576 <a3bd> <a3bd> 7708 <a3bf> <a3bf> 579 <a3db> <a3db> 7709 <a3dd> <a3dd> 7710 <a3df> <a3df> 600 <a3fb> <a3fb> 596 <a3fd> <a3fd> 597 <a3fe> <a3fe> 7711 endcidrange endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF \ No newline at end of file
diff --git a/src/main/resources/Resources/cmap/GBpc-EUC-H b/src/main/resources/Resources/cmap/GBpc-EUC-H
new file mode 100644
index 0000000..106f6be
--- /dev/null
+++ b/src/main/resources/Resources/cmap/GBpc-EUC-H
@@ -0,0 +1 @@
+%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%IncludeResource: ProcSet (CIDInit) %%BeginResource: CMap (GBpc-EUC-H) %%Title: (GBpc-EUC-H Adobe GB1 0) %%Version: 9.001 %%Copyright: ----------------------------------------------------------- %%Copyright: Copyright 1990-1998 Adobe Systems Incorporated. %%Copyright: All Rights Reserved. %%Copyright: %%Copyright: Patents Pending %%Copyright: %%Copyright: NOTICE: All information contained herein is the property %%Copyright: of Adobe Systems Incorporated. %%Copyright: %%Copyright: Permission is granted for redistribution of this file %%Copyright: provided this copyright notice is maintained intact and %%Copyright: that the contents of this file are not altered in any %%Copyright: way from its original form. %%Copyright: %%Copyright: PostScript and Display PostScript are trademarks of %%Copyright: Adobe Systems Incorporated which may be registered in %%Copyright: certain jurisdictions. %%Copyright: ----------------------------------------------------------- %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo 3 dict dup begin /Registry (Adobe) def /Ordering (GB1) def /Supplement 0 def end def /CMapName /GBpc-EUC-H def /CMapVersion 9.001 def /CMapType 1 def /UIDOffset 0 def /XUID [1 10 25364] def /WMode 0 def 3 begincodespacerange <00> <80> <A1A1> <FCFE> <FD> <FF> endcodespacerange 1 beginnotdefrange <00> <1f> 1 endnotdefrange 91 begincidrange <20> <7e> 1 <80> <80> 7712 <a1a1> <a1fe> 96 <a2b1> <a2e2> 190 <a2e5> <a2ee> 240 <a2f1> <a2fc> 250 <a3a1> <a3fe> 262 <a4a1> <a4f3> 356 <a5a1> <a5f6> 439 <a6a1> <a6b8> 525 <a6c1> <a6f5> 549 <a7a1> <a7c1> 602 <a7d1> <a7f1> 635 <a8a1> <a8c0> 668 <a8c5> <a8ea> 700 <a9a4> <a9ef> 738 <aaa1> <aafe> 814 <aba1> <abc0> 908 <b0a1> <b0fe> 940 <b1a1> <b1fe> 1034 <b2a1> <b2fe> 1128 <b3a1> <b3fe> 1222 <b4a1> <b4fe> 1316 <b5a1> <b5fe> 1410 <b6a1> <b6fe> 1504 <b7a1> <b7fe> 1598 <b8a1> <b8fe> 1692 <b9a1> <b9fe> 1786 <baa1> <bafe> 1880 <bba1> <bbfe> 1974 <bca1> <bcfe> 2068 <bda1> <bdfe> 2162 <bea1> <befe> 2256 <bfa1> <bffe> 2350 <c0a1> <c0fe> 2444 <c1a1> <c1fe> 2538 <c2a1> <c2fe> 2632 <c3a1> <c3fe> 2726 <c4a1> <c4fe> 2820 <c5a1> <c5fe> 2914 <c6a1> <c6fe> 3008 <c7a1> <c7fe> 3102 <c8a1> <c8fe> 3196 <c9a1> <c9fe> 3290 <caa1> <cafe> 3384 <cba1> <cbfe> 3478 <cca1> <ccfe> 3572 <cda1> <cdfe> 3666 <cea1> <cefe> 3760 <cfa1> <cffe> 3854 <d0a1> <d0fe> 3948 <d1a1> <d1fe> 4042 <d2a1> <d2fe> 4136 <d3a1> <d3fe> 4230 <d4a1> <d4fe> 4324 <d5a1> <d5fe> 4418 <d6a1> <d6fe> 4512 <d7a1> <d7f9> 4606 <d8a1> <d8fe> 4695 <d9a1> <d9fe> 4789 <daa1> <dafe> 4883 <dba1> <dbfe> 4977 <dca1> <dcfe> 5071 <dda1> <ddfe> 5165 <dea1> <defe> 5259 <dfa1> <dffe> 5353 <e0a1> <e0fe> 5447 <e1a1> <e1fe> 5541 <e2a1> <e2fe> 5635 <e3a1> <e3fe> 5729 <e4a1> <e4fe> 5823 <e5a1> <e5fe> 5917 <e6a1> <e6fe> 6011 <e7a1> <e7fe> 6105 <e8a1> <e8fe> 6199 <e9a1> <e9fe> 6293 <eaa1> <eafe> 6387 <eba1> <ebfe> 6481 <eca1> <ecfe> 6575 <eda1> <edfe> 6669 <eea1> <eefe> 6763 <efa1> <effe> 6857 <f0a1> <f0fe> 6951 <f1a1> <f1fe> 7045 <f2a1> <f2fe> 7139 <f3a1> <f3fe> 7233 <f4a1> <f4fe> 7327 <f5a1> <f5fe> 7421 <f6a1> <f6fe> 7515 <f7a1> <f7fe> 7609 <fd> <ff> 7713 endcidrange endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF \ No newline at end of file
diff --git a/src/main/resources/Resources/cmap/GBpc-EUC-UCS2 b/src/main/resources/Resources/cmap/GBpc-EUC-UCS2
new file mode 100644
index 0000000..147f491
--- /dev/null
+++ b/src/main/resources/Resources/cmap/GBpc-EUC-UCS2
@@ -0,0 +1 @@
+%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%DocumentNeededResources: CMap (GBpc-EUC-UCS2C) %%IncludeResource: ProcSet (CIDInit) %%IncludeResource: CMap (GBpc-EUC-UCS2C) %%BeginResource: CMap (GBpc-EUC-UCS2) %%Title: (GBpc-EUC-UCS2) %%Version: 4.002 %%Copyright: ----------------------------------------------------------- %%Copyright: Copyright 1990-1997 Adobe Systems Incorporated. %%Copyright: All Rights Reserved. %%Copyright: %%Copyright: Patents Pending %%Copyright: %%Copyright: NOTICE: All information contained herein is the property %%Copyright: of Adobe Systems Incorporated. %%Copyright: %%Copyright: Permission is granted for redistribution of this file %%Copyright: provided this copyright notice is maintained intact and %%Copyright: that the contents of this file are not altered in any %%Copyright: way from its original form. %%Copyright: %%Copyright: PostScript and Display PostScript are trademarks of %%Copyright: Adobe Systems Incorporated which may be registered in %%Copyright: certain jurisdictions. %%Copyright: ----------------------------------------------------------- %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /GBpc-EUC-UCS2C usecmap /CIDSystemInfo 3 dict dup begin /Registry (Adobe) def /Ordering (GBpc_EUC_UCS2) def /Supplement 2 def end def /CMapName /GBpc-EUC-UCS2 def /CMapVersion 4.002 def /CMapType 1 def /WMode 0 def 1 beginbfrange <a8bf> <a8bf> <006e0300> endbfrange endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF \ No newline at end of file
diff --git a/src/main/resources/Resources/cmap/GBpc-EUC-UCS2C b/src/main/resources/Resources/cmap/GBpc-EUC-UCS2C
new file mode 100644
index 0000000..6ce652a
--- /dev/null
+++ b/src/main/resources/Resources/cmap/GBpc-EUC-UCS2C
@@ -0,0 +1 @@
+%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%IncludeResource: ProcSet (CIDInit) %%BeginResource: CMap (GBpc-EUC-UCS2C) %%Title: (GBpc-EUC-UCS2C) %%Version: 4.002 %%Copyright: ----------------------------------------------------------- %%Copyright: Copyright 1990-1999 Adobe Systems Incorporated. %%Copyright: All Rights Reserved. %%Copyright: %%Copyright: Patents Pending %%Copyright: %%Copyright: NOTICE: All information contained herein is the property %%Copyright: of Adobe Systems Incorporated. %%Copyright: %%Copyright: Permission is granted for redistribution of this file %%Copyright: provided this copyright notice is maintained intact and %%Copyright: that the contents of this file are not altered in any %%Copyright: way from its original form. %%Copyright: %%Copyright: PostScript and Display PostScript are trademarks of %%Copyright: Adobe Systems Incorporated which may be registered in %%Copyright: certain jurisdictions. %%Copyright: ----------------------------------------------------------- %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo 3 dict dup begin /Registry (Adobe) def /Ordering (GBpc_EUC_UCS2C) def /Supplement 2 def end def /CMapName /GBpc-EUC-UCS2C def /CMapVersion 4.002 def /CMapType 1 def /WMode 0 def 4 begincodespacerange <00> <80> <A1A1> <FCFE> <83> <A0> <FD> <FF> endcodespacerange 100 beginbfrange <00> <7F> <0000> <80> <80> <00FC> <83> <A0> <0083> <FD> <FD> <00A9> <FE> <FE> <2122> <FF> <FF> <2026> <A1A1> <A1A3> <3000> <A1A4> <A1A4> <00B7> <A1A5> <A1A5> <02C9> <A1A6> <A1A6> <02C7> <A1A7> <A1A7> <00A8> <A1A8> <A1A8> <3003> <A1A9> <A1A9> <3005> <A1AA> <A1AA> <2014> <A1AB> <A1AB> <301C> <A1AC> <A1AC> <2016> <A1AD> <A1AD> <22EF> <A1AE> <A1AF> <2018> <A1B0> <A1B1> <201C> <A1B2> <A1B3> <3014> <A1B4> <A1BB> <3008> <A1BC> <A1BD> <3016> <A1BE> <A1BF> <3010> <A1C0> <A1C0> <00B1> <A1C1> <A1C1> <00D7> <A1C2> <A1C2> <00F7> <A1C3> <A1C3> <2236> <A1C4> <A1C5> <2227> <A1C6> <A1C6> <2211> <A1C7> <A1C7> <220F> <A1C8> <A1C8> <222A> <A1C9> <A1C9> <2229> <A1CA> <A1CA> <2208> <A1CB> <A1CB> <2237> <A1CC> <A1CC> <221A> <A1CD> <A1CD> <22A5> <A1CE> <A1CE> <2225> <A1CF> <A1CF> <2220> <A1D0> <A1D0> <2312> <A1D1> <A1D1> <2299> <A1D2> <A1D2> <222B> <A1D3> <A1D3> <222E> <A1D4> <A1D4> <2261> <A1D5> <A1D5> <224C> <A1D6> <A1D6> <2248> <A1D7> <A1D7> <223D> <A1D8> <A1D8> <221D> <A1D9> <A1D9> <2260> <A1DA> <A1DB> <226E> <A1DC> <A1DD> <2264> <A1DE> <A1DE> <221E> <A1DF> <A1DF> <2235> <A1E0> <A1E0> <2234> <A1E1> <A1E1> <2642> <A1E2> <A1E2> <2640> <A1E3> <A1E3> <00B0> <A1E4> <A1E5> <2032> <A1E6> <A1E6> <2103> <A1E7> <A1E7> <FF04> <A1E8> <A1E8> <00A4> <A1E9> <A1EA> <00A2> <A1EB> <A1EB> <2030> <A1EC> <A1EC> <00A7> <A1ED> <A1ED> <2116> <A1EE> <A1EE> <2606> <A1EF> <A1EF> <2605> <A1F0> <A1F0> <25CB> <A1F1> <A1F1> <25CF> <A1F2> <A1F2> <25CE> <A1F3> <A1F3> <25C7> <A1F4> <A1F4> <25C6> <A1F5> <A1F5> <25A1> <A1F6> <A1F6> <25A0> <A1F7> <A1F7> <25B3> <A1F8> <A1F8> <25B2> <A1F9> <A1F9> <203B> <A1FA> <A1FA> <2192> <A1FB> <A1FC> <2190> <A1FD> <A1FD> <2193> <A1FE> <A1FE> <3013> <A2B1> <A2C4> <2488> <A2C5> <A2D8> <2474> <A2D9> <A2E2> <2460> <A2E5> <A2EE> <3220> <A2F1> <A2FC> <2160> <A3A1> <A3A3> <FF01> <A3A4> <A3A4> <00A5> <A3A5> <A3FD> <FF05> <A3FE> <A3FE> <203E> <A4A1> <A4F3> <3041> <A5A1> <A5F6> <30A1> <A6A1> <A6B1> <0391> <A6B2> <A6B8> <03A3> <A6C1> <A6D1> <03B1> <A6D2> <A6D8> <03C3> <A6D9> <A6D9> <FF0C> <A6DA> <A6DA> <3002> <A6DB> <A6DB> <3001> <A6DC> <A6DD> <FF1A> <A6DE> <A6DE> <FF01> endbfrange 100 beginbfrange <A6DF> <A6DF> <FF1F> <A6E0> <A6E1> <FE35> <A6E2> <A6E3> <FE39> <A6E4> <A6E5> <FE3F> <A6E6> <A6E7> <FE3D> <A6E8> <A6EB> <FE41> <A6EC> <A6ED> <3016> <A6EE> <A6EF> <FE3B> <A6F0> <A6F1> <FE37> <A6F2> <A6F2> <FE31> <A6F3> <A6F3> <22EF> <A6F4> <A6F5> <FE33> <A7A1> <A7A6> <0410> <A7A7> <A7A7> <0401> <A7A8> <A7C1> <0416> <A7D1> <A7D6> <0430> <A7D7> <A7D7> <0451> <A7D8> <A7F1> <0436> <A8A1> <A8A1> <0101> <A8A2> <A8A2> <00E1> <A8A3> <A8A3> <01CE> <A8A4> <A8A4> <00E0> <A8A5> <A8A5> <0113> <A8A6> <A8A6> <00E9> <A8A7> <A8A7> <011B> <A8A8> <A8A8> <00E8> <A8A9> <A8A9> <012B> <A8AA> <A8AA> <00ED> <A8AB> <A8AB> <01D0> <A8AC> <A8AC> <00EC> <A8AD> <A8AD> <014D> <A8AE> <A8AE> <00F3> <A8AF> <A8AF> <01D2> <A8B0> <A8B0> <00F2> <A8B1> <A8B1> <016B> <A8B2> <A8B2> <00FA> <A8B3> <A8B3> <01D4> <A8B4> <A8B4> <00F9> <A8B5> <A8B5> <01D6> <A8B6> <A8B6> <01D8> <A8B7> <A8B7> <01DA> <A8B8> <A8B8> <01DC> <A8B9> <A8B9> <00FC> <A8BA> <A8BA> <00EA> <A8BB> <A8BB> <0251> <A8BC> <A8BC> <1E3F> <A8BD> <A8BD> <0144> <A8BE> <A8BE> <0148> <A8C0> <A8C0> <0261> <A8C5> <A8E9> <3105> <A9A4> <A9EF> <2500> <B0A1> <B0A1> <554A> <B0A2> <B0A2> <963F> <B0A3> <B0A3> <57C3> <B0A4> <B0A4> <6328> <B0A5> <B0A5> <54CE> <B0A6> <B0A6> <5509> <B0A7> <B0A7> <54C0> <B0A8> <B0A8> <7691> <B0A9> <B0A9> <764C> <B0AA> <B0AA> <853C> <B0AB> <B0AB> <77EE> <B0AC> <B0AC> <827E> <B0AD> <B0AD> <788D> <B0AE> <B0AE> <7231> <B0AF> <B0AF> <9698> <B0B0> <B0B0> <978D> <B0B1> <B0B1> <6C28> <B0B2> <B0B2> <5B89> <B0B3> <B0B3> <4FFA> <B0B4> <B0B4> <6309> <B0B5> <B0B5> <6697> <B0B6> <B0B6> <5CB8> <B0B7> <B0B7> <80FA> <B0B8> <B0B8> <6848> <B0B9> <B0B9> <80AE> <B0BA> <B0BA> <6602> <B0BB> <B0BB> <76CE> <B0BC> <B0BC> <51F9> <B0BD> <B0BD> <6556> <B0BE> <B0BE> <71AC> <B0BF> <B0BF> <7FF1> <B0C0> <B0C0> <8884> <B0C1> <B0C1> <50B2> <B0C2> <B0C2> <5965> <B0C3> <B0C3> <61CA> <B0C4> <B0C4> <6FB3> <B0C5> <B0C5> <82AD> <B0C6> <B0C6> <634C> <B0C7> <B0C7> <6252> <B0C8> <B0C8> <53ED> <B0C9> <B0C9> <5427> <B0CA> <B0CA> <7B06> <B0CB> <B0CB> <516B> <B0CC> <B0CC> <75A4> <B0CD> <B0CD> <5DF4> <B0CE> <B0CE> <62D4> <B0CF> <B0CF> <8DCB> <B0D0> <B0D0> <9776> <B0D1> <B0D1> <628A> endbfrange 100 beginbfrange <B0D2> <B0D2> <8019> <B0D3> <B0D3> <575D> <B0D4> <B0D4> <9738> <B0D5> <B0D5> <7F62> <B0D6> <B0D6> <7238> <B0D7> <B0D7> <767D> <B0D8> <B0D8> <67CF> <B0D9> <B0D9> <767E> <B0DA> <B0DA> <6446> <B0DB> <B0DB> <4F70> <B0DC> <B0DC> <8D25> <B0DD> <B0DD> <62DC> <B0DE> <B0DE> <7A17> <B0DF> <B0DF> <6591> <B0E0> <B0E0> <73ED> <B0E1> <B0E1> <642C> <B0E2> <B0E2> <6273> <B0E3> <B0E3> <822C> <B0E4> <B0E4> <9881> <B0E5> <B0E5> <677F> <B0E6> <B0E6> <7248> <B0E7> <B0E7> <626E> <B0E8> <B0E8> <62CC> <B0E9> <B0E9> <4F34> <B0EA> <B0EA> <74E3> <B0EB> <B0EB> <534A> <B0EC> <B0EC> <529E> <B0ED> <B0ED> <7ECA> <B0EE> <B0EE> <90A6> <B0EF> <B0EF> <5E2E> <B0F0> <B0F0> <6886> <B0F1> <B0F1> <699C> <B0F2> <B0F2> <8180> <B0F3> <B0F3> <7ED1> <B0F4> <B0F4> <68D2> <B0F5> <B0F5> <78C5> <B0F6> <B0F6> <868C> <B0F7> <B0F7> <9551> <B0F8> <B0F8> <508D> <B0F9> <B0F9> <8C24> <B0FA> <B0FA> <82DE> <B0FB> <B0FB> <80DE> <B0FC> <B0FC> <5305> <B0FD> <B0FD> <8912> <B0FE> <B0FE> <5265> <B1A1> <B1A1> <8584> <B1A2> <B1A2> <96F9> <B1A3> <B1A3> <4FDD> <B1A4> <B1A4> <5821> <B1A5> <B1A5> <9971> <B1A6> <B1A6> <5B9D> <B1A7> <B1A7> <62B1> <B1A8> <B1A8> <62A5> <B1A9> <B1A9> <66B4> <B1AA> <B1AA> <8C79> <B1AB> <B1AB> <9C8D> <B1AC> <B1AC> <7206> <B1AD> <B1AD> <676F> <B1AE> <B1AE> <7891> <B1AF> <B1AF> <60B2> <B1B0> <B1B0> <5351> <B1B1> <B1B1> <5317> <B1B2> <B1B2> <8F88> <B1B3> <B1B3> <80CC> <B1B4> <B1B4> <8D1D> <B1B5> <B1B5> <94A1> <B1B6> <B1B6> <500D> <B1B7> <B1B7> <72C8> <B1B8> <B1B8> <5907> <B1B9> <B1B9> <60EB> <B1BA> <B1BA> <7119> <B1BB> <B1BB> <88AB> <B1BC> <B1BC> <5954> <B1BD> <B1BD> <82EF> <B1BE> <B1BE> <672C> <B1BF> <B1BF> <7B28> <B1C0> <B1C0> <5D29> <B1C1> <B1C1> <7EF7> <B1C2> <B1C2> <752D> <B1C3> <B1C3> <6CF5> <B1C4> <B1C4> <8E66> <B1C5> <B1C5> <8FF8> <B1C6> <B1C6> <903C> <B1C7> <B1C7> <9F3B> <B1C8> <B1C8> <6BD4> <B1C9> <B1C9> <9119> <B1CA> <B1CA> <7B14> <B1CB> <B1CB> <5F7C> <B1CC> <B1CC> <78A7> <B1CD> <B1CD> <84D6> <B1CE> <B1CE> <853D> <B1CF> <B1CF> <6BD5> <B1D0> <B1D0> <6BD9> <B1D1> <B1D1> <6BD6> <B1D2> <B1D2> <5E01> <B1D3> <B1D3> <5E87> <B1D4> <B1D4> <75F9> <B1D5> <B1D5> <95ED> <B1D6> <B1D6> <655D> <B1D7> <B1D7> <5F0A> endbfrange 100 beginbfrange <B1D8> <B1D8> <5FC5> <B1D9> <B1D9> <8F9F> <B1DA> <B1DA> <58C1> <B1DB> <B1DB> <81C2> <B1DC> <B1DC> <907F> <B1DD> <B1DD> <965B> <B1DE> <B1DE> <97AD> <B1DF> <B1DF> <8FB9> <B1E0> <B1E0> <7F16> <B1E1> <B1E1> <8D2C> <B1E2> <B1E2> <6241> <B1E3> <B1E3> <4FBF> <B1E4> <B1E4> <53D8> <B1E5> <B1E5> <535E> <B1E6> <B1E7> <8FA8> <B1E8> <B1E8> <8FAB> <B1E9> <B1E9> <904D> <B1EA> <B1EA> <6807> <B1EB> <B1EB> <5F6A> <B1EC> <B1EC> <8198> <B1ED> <B1ED> <8868> <B1EE> <B1EE> <9CD6> <B1EF> <B1EF> <618B> <B1F0> <B1F0> <522B> <B1F1> <B1F1> <762A> <B1F2> <B1F2> <5F6C> <B1F3> <B1F3> <658C> <B1F4> <B1F4> <6FD2> <B1F5> <B1F5> <6EE8> <B1F6> <B1F6> <5BBE> <B1F7> <B1F7> <6448> <B1F8> <B1F8> <5175> <B1F9> <B1F9> <51B0> <B1FA> <B1FA> <67C4> <B1FB> <B1FB> <4E19> <B1FC> <B1FC> <79C9> <B1FD> <B1FD> <997C> <B1FE> <B1FE> <70B3> <B2A1> <B2A1> <75C5> <B2A2> <B2A2> <5E76> <B2A3> <B2A3> <73BB> <B2A4> <B2A4> <83E0> <B2A5> <B2A5> <64AD> <B2A6> <B2A6> <62E8> <B2A7> <B2A7> <94B5> <B2A8> <B2A8> <6CE2> <B2A9> <B2A9> <535A> <B2AA> <B2AA> <52C3> <B2AB> <B2AB> <640F> <B2AC> <B2AC> <94C2> <B2AD> <B2AD> <7B94> <B2AE> <B2AE> <4F2F> <B2AF> <B2AF> <5E1B> <B2B0> <B2B0> <8236> <B2B1> <B2B1> <8116> <B2B2> <B2B2> <818A> <B2B3> <B2B3> <6E24> <B2B4> <B2B4> <6CCA> <B2B5> <B2B5> <9A73> <B2B6> <B2B6> <6355> <B2B7> <B2B7> <535C> <B2B8> <B2B8> <54FA> <B2B9> <B2B9> <8865> <B2BA> <B2BA> <57E0> <B2BB> <B2BB> <4E0D> <B2BC> <B2BC> <5E03> <B2BD> <B2BD> <6B65> <B2BE> <B2BE> <7C3F> <B2BF> <B2BF> <90E8> <B2C0> <B2C0> <6016> <B2C1> <B2C1> <64E6> <B2C2> <B2C2> <731C> <B2C3> <B2C3> <88C1> <B2C4> <B2C4> <6750> <B2C5> <B2C5> <624D> <B2C6> <B2C6> <8D22> <B2C7> <B2C7> <776C> <B2C8> <B2C8> <8E29> <B2C9> <B2C9> <91C7> <B2CA> <B2CA> <5F69> <B2CB> <B2CB> <83DC> <B2CC> <B2CC> <8521> <B2CD> <B2CD> <9910> <B2CE> <B2CE> <53C2> <B2CF> <B2CF> <8695> <B2D0> <B2D0> <6B8B> <B2D1> <B2D1> <60ED> <B2D2> <B2D2> <60E8> <B2D3> <B2D3> <707F> <B2D4> <B2D4> <82CD> <B2D5> <B2D5> <8231> <B2D6> <B2D6> <4ED3> <B2D7> <B2D7> <6CA7> <B2D8> <B2D8> <85CF> <B2D9> <B2D9> <64CD> <B2DA> <B2DA> <7CD9> <B2DB> <B2DB> <69FD> <B2DC> <B2DC> <66F9> <B2DD> <B2DD> <8349> <B2DE> <B2DE> <5395> endbfrange 100 beginbfrange <B2DF> <B2DF> <7B56> <B2E0> <B2E0> <4FA7> <B2E1> <B2E1> <518C> <B2E2> <B2E2> <6D4B> <B2E3> <B2E3> <5C42> <B2E4> <B2E4> <8E6D> <B2E5> <B2E5> <63D2> <B2E6> <B2E6> <53C9> <B2E7> <B2E7> <832C> <B2E8> <B2E8> <8336> <B2E9> <B2E9> <67E5> <B2EA> <B2EA> <78B4> <B2EB> <B2EB> <643D> <B2EC> <B2EC> <5BDF> <B2ED> <B2ED> <5C94> <B2EE> <B2EE> <5DEE> <B2EF> <B2EF> <8BE7> <B2F0> <B2F0> <62C6> <B2F1> <B2F1> <67F4> <B2F2> <B2F2> <8C7A> <B2F3> <B2F3> <6400> <B2F4> <B2F4> <63BA> <B2F5> <B2F5> <8749> <B2F6> <B2F6> <998B> <B2F7> <B2F7> <8C17> <B2F8> <B2F8> <7F20> <B2F9> <B2F9> <94F2> <B2FA> <B2FA> <4EA7> <B2FB> <B2FB> <9610> <B2FC> <B2FC> <98A4> <B2FD> <B2FD> <660C> <B2FE> <B2FE> <7316> <B3A1> <B3A1> <573A> <B3A2> <B3A2> <5C1D> <B3A3> <B3A3> <5E38> <B3A4> <B3A4> <957F> <B3A5> <B3A5> <507F> <B3A6> <B3A6> <80A0> <B3A7> <B3A7> <5382> <B3A8> <B3A8> <655E> <B3A9> <B3A9> <7545> <B3AA> <B3AA> <5531> <B3AB> <B3AB> <5021> <B3AC> <B3AC> <8D85> <B3AD> <B3AD> <6284> <B3AE> <B3AE> <949E> <B3AF> <B3AF> <671D> <B3B0> <B3B0> <5632> <B3B1> <B3B1> <6F6E> <B3B2> <B3B2> <5DE2> <B3B3> <B3B3> <5435> <B3B4> <B3B4> <7092> <B3B5> <B3B5> <8F66> <B3B6> <B3B6> <626F> <B3B7> <B3B7> <64A4> <B3B8> <B3B8> <63A3> <B3B9> <B3B9> <5F7B> <B3BA> <B3BA> <6F88> <B3BB> <B3BB> <90F4> <B3BC> <B3BC> <81E3> <B3BD> <B3BD> <8FB0> <B3BE> <B3BE> <5C18> <B3BF> <B3BF> <6668> <B3C0> <B3C0> <5FF1> <B3C1> <B3C1> <6C89> <B3C2> <B3C2> <9648> <B3C3> <B3C3> <8D81> <B3C4> <B3C4> <886C> <B3C5> <B3C5> <6491> <B3C6> <B3C6> <79F0> <B3C7> <B3C7> <57CE> <B3C8> <B3C8> <6A59> <B3C9> <B3C9> <6210> <B3CA> <B3CA> <5448> <B3CB> <B3CB> <4E58> <B3CC> <B3CC> <7A0B> <B3CD> <B3CD> <60E9> <B3CE> <B3CE> <6F84> <B3CF> <B3CF> <8BDA> <B3D0> <B3D0> <627F> <B3D1> <B3D1> <901E> <B3D2> <B3D2> <9A8B> <B3D3> <B3D3> <79E4> <B3D4> <B3D4> <5403> <B3D5> <B3D5> <75F4> <B3D6> <B3D6> <6301> <B3D7> <B3D7> <5319> <B3D8> <B3D8> <6C60> <B3D9> <B3D9> <8FDF> <B3DA> <B3DA> <5F1B> <B3DB> <B3DB> <9A70> <B3DC> <B3DC> <803B> <B3DD> <B3DD> <9F7F> <B3DE> <B3DE> <4F88> <B3DF> <B3DF> <5C3A> <B3E0> <B3E0> <8D64> <B3E1> <B3E1> <7FC5> <B3E2> <B3E2> <65A5> <B3E3> <B3E3> <70BD> <B3E4> <B3E4> <5145> endbfrange 100 beginbfrange <B3E5> <B3E5> <51B2> <B3E6> <B3E6> <866B> <B3E7> <B3E7> <5D07> <B3E8> <B3E8> <5BA0> <B3E9> <B3E9> <62BD> <B3EA> <B3EA> <916C> <B3EB> <B3EB> <7574> <B3EC> <B3EC> <8E0C> <B3ED> <B3ED> <7A20> <B3EE> <B3EE> <6101> <B3EF> <B3EF> <7B79> <B3F0> <B3F0> <4EC7> <B3F1> <B3F1> <7EF8> <B3F2> <B3F2> <7785> <B3F3> <B3F3> <4E11> <B3F4> <B3F4> <81ED> <B3F5> <B3F5> <521D> <B3F6> <B3F6> <51FA> <B3F7> <B3F7> <6A71> <B3F8> <B3F8> <53A8> <B3F9> <B3F9> <8E87> <B3FA> <B3FA> <9504> <B3FB> <B3FB> <96CF> <B3FC> <B3FC> <6EC1> <B3FD> <B3FD> <9664> <B3FE> <B3FE> <695A> <B4A1> <B4A1> <7840> <B4A2> <B4A2> <50A8> <B4A3> <B4A3> <77D7> <B4A4> <B4A4> <6410> <B4A5> <B4A5> <89E6> <B4A6> <B4A6> <5904> <B4A7> <B4A7> <63E3> <B4A8> <B4A8> <5DDD> <B4A9> <B4A9> <7A7F> <B4AA> <B4AA> <693D> <B4AB> <B4AB> <4F20> <B4AC> <B4AC> <8239> <B4AD> <B4AD> <5598> <B4AE> <B4AE> <4E32> <B4AF> <B4AF> <75AE> <B4B0> <B4B0> <7A97> <B4B1> <B4B1> <5E62> <B4B2> <B4B2> <5E8A> <B4B3> <B4B3> <95EF> <B4B4> <B4B4> <521B> <B4B5> <B4B5> <5439> <B4B6> <B4B6> <708A> <B4B7> <B4B7> <6376> <B4B8> <B4B8> <9524> <B4B9> <B4B9> <5782> <B4BA> <B4BA> <6625> <B4BB> <B4BB> <693F> <B4BC> <B4BC> <9187> <B4BD> <B4BD> <5507> <B4BE> <B4BE> <6DF3> <B4BF> <B4BF> <7EAF> <B4C0> <B4C0> <8822> <B4C1> <B4C1> <6233> <B4C2> <B4C2> <7EF0> <B4C3> <B4C3> <75B5> <B4C4> <B4C4> <8328> <B4C5> <B4C5> <78C1> <B4C6> <B4C6> <96CC> <B4C7> <B4C7> <8F9E> <B4C8> <B4C8> <6148> <B4C9> <B4C9> <74F7> <B4CA> <B4CA> <8BCD> <B4CB> <B4CB> <6B64> <B4CC> <B4CC> <523A> <B4CD> <B4CD> <8D50> <B4CE> <B4CE> <6B21> <B4CF> <B4CF> <806A> <B4D0> <B4D0> <8471> <B4D1> <B4D1> <56F1> <B4D2> <B4D2> <5306> <B4D3> <B4D3> <4ECE> <B4D4> <B4D4> <4E1B> <B4D5> <B4D5> <51D1> <B4D6> <B4D6> <7C97> <B4D7> <B4D7> <918B> <B4D8> <B4D8> <7C07> <B4D9> <B4D9> <4FC3> <B4DA> <B4DA> <8E7F> <B4DB> <B4DB> <7BE1> <B4DC> <B4DC> <7A9C> <B4DD> <B4DD> <6467> <B4DE> <B4DE> <5D14> <B4DF> <B4DF> <50AC> <B4E0> <B4E0> <8106> <B4E1> <B4E1> <7601> <B4E2> <B4E2> <7CB9> <B4E3> <B4E3> <6DEC> <B4E4> <B4E4> <7FE0> <B4E5> <B4E5> <6751> <B4E6> <B4E6> <5B58> <B4E7> <B4E7> <5BF8> <B4E8> <B4E8> <78CB> <B4E9> <B4E9> <64AE> <B4EA> <B4EA> <6413> endbfrange 100 beginbfrange <B4EB> <B4EB> <63AA> <B4EC> <B4EC> <632B> <B4ED> <B4ED> <9519> <B4EE> <B4EE> <642D> <B4EF> <B4EF> <8FBE> <B4F0> <B4F0> <7B54> <B4F1> <B4F1> <7629> <B4F2> <B4F2> <6253> <B4F3> <B4F3> <5927> <B4F4> <B4F4> <5446> <B4F5> <B4F5> <6B79> <B4F6> <B4F6> <50A3> <B4F7> <B4F7> <6234> <B4F8> <B4F8> <5E26> <B4F9> <B4F9> <6B86> <B4FA> <B4FA> <4EE3> <B4FB> <B4FB> <8D37> <B4FC> <B4FC> <888B> <B4FD> <B4FD> <5F85> <B4FE> <B4FE> <902E> <B5A1> <B5A1> <6020> <B5A2> <B5A2> <803D> <B5A3> <B5A3> <62C5> <B5A4> <B5A4> <4E39> <B5A5> <B5A5> <5355> <B5A6> <B5A6> <90F8> <B5A7> <B5A7> <63B8> <B5A8> <B5A8> <80C6> <B5A9> <B5A9> <65E6> <B5AA> <B5AA> <6C2E> <B5AB> <B5AB> <4F46> <B5AC> <B5AC> <60EE> <B5AD> <B5AD> <6DE1> <B5AE> <B5AE> <8BDE> <B5AF> <B5AF> <5F39> <B5B0> <B5B0> <86CB> <B5B1> <B5B1> <5F53> <B5B2> <B5B2> <6321> <B5B3> <B5B3> <515A> <B5B4> <B5B4> <8361> <B5B5> <B5B5> <6863> <B5B6> <B5B6> <5200> <B5B7> <B5B7> <6363> <B5B8> <B5B8> <8E48> <B5B9> <B5B9> <5012> <B5BA> <B5BA> <5C9B> <B5BB> <B5BB> <7977> <B5BC> <B5BC> <5BFC> <B5BD> <B5BD> <5230> <B5BE> <B5BE> <7A3B> <B5BF> <B5BF> <60BC> <B5C0> <B5C0> <9053> <B5C1> <B5C1> <76D7> <B5C2> <B5C2> <5FB7> <B5C3> <B5C3> <5F97> <B5C4> <B5C4> <7684> <B5C5> <B5C5> <8E6C> <B5C6> <B5C6> <706F> <B5C7> <B5C7> <767B> <B5C8> <B5C8> <7B49> <B5C9> <B5C9> <77AA> <B5CA> <B5CA> <51F3> <B5CB> <B5CB> <9093> <B5CC> <B5CC> <5824> <B5CD> <B5CD> <4F4E> <B5CE> <B5CE> <6EF4> <B5CF> <B5CF> <8FEA> <B5D0> <B5D0> <654C> <B5D1> <B5D1> <7B1B> <B5D2> <B5D2> <72C4> <B5D3> <B5D3> <6DA4> <B5D4> <B5D4> <7FDF> <B5D5> <B5D5> <5AE1> <B5D6> <B5D6> <62B5> <B5D7> <B5D7> <5E95> <B5D8> <B5D8> <5730> <B5D9> <B5D9> <8482> <B5DA> <B5DA> <7B2C> <B5DB> <B5DB> <5E1D> <B5DC> <B5DC> <5F1F> <B5DD> <B5DD> <9012> <B5DE> <B5DE> <7F14> <B5DF> <B5DF> <98A0> <B5E0> <B5E0> <6382> <B5E1> <B5E1> <6EC7> <B5E2> <B5E2> <7898> <B5E3> <B5E3> <70B9> <B5E4> <B5E4> <5178> <B5E5> <B5E5> <975B> <B5E6> <B5E6> <57AB> <B5E7> <B5E7> <7535> <B5E8> <B5E8> <4F43> <B5E9> <B5E9> <7538> <B5EA> <B5EA> <5E97> <B5EB> <B5EB> <60E6> <B5EC> <B5EC> <5960> <B5ED> <B5ED> <6DC0> <B5EE> <B5EE> <6BBF> <B5EF> <B5EF> <7889> <B5F0> <B5F0> <53FC> endbfrange 100 beginbfrange <B5F1> <B5F1> <96D5> <B5F2> <B5F2> <51CB> <B5F3> <B5F3> <5201> <B5F4> <B5F4> <6389> <B5F5> <B5F5> <540A> <B5F6> <B5F6> <9493> <B5F7> <B5F7> <8C03> <B5F8> <B5F8> <8DCC> <B5F9> <B5F9> <7239> <B5FA> <B5FA> <789F> <B5FB> <B5FB> <8776> <B5FC> <B5FC> <8FED> <B5FD> <B5FD> <8C0D> <B5FE> <B5FE> <53E0> <B6A1> <B6A1> <4E01> <B6A2> <B6A2> <76EF> <B6A3> <B6A3> <53EE> <B6A4> <B6A4> <9489> <B6A5> <B6A5> <9876> <B6A6> <B6A6> <9F0E> <B6A7> <B6A7> <952D> <B6A8> <B6A8> <5B9A> <B6A9> <B6A9> <8BA2> <B6AA> <B6AA> <4E22> <B6AB> <B6AB> <4E1C> <B6AC> <B6AC> <51AC> <B6AD> <B6AD> <8463> <B6AE> <B6AE> <61C2> <B6AF> <B6AF> <52A8> <B6B0> <B6B0> <680B> <B6B1> <B6B1> <4F97> <B6B2> <B6B2> <606B> <B6B3> <B6B3> <51BB> <B6B4> <B6B4> <6D1E> <B6B5> <B6B5> <515C> <B6B6> <B6B6> <6296> <B6B7> <B6B7> <6597> <B6B8> <B6B8> <9661> <B6B9> <B6B9> <8C46> <B6BA> <B6BA> <9017> <B6BB> <B6BB> <75D8> <B6BC> <B6BC> <90FD> <B6BD> <B6BD> <7763> <B6BE> <B6BE> <6BD2> <B6BF> <B6BF> <728A> <B6C0> <B6C0> <72EC> <B6C1> <B6C1> <8BFB> <B6C2> <B6C2> <5835> <B6C3> <B6C3> <7779> <B6C4> <B6C4> <8D4C> <B6C5> <B6C5> <675C> <B6C6> <B6C6> <9540> <B6C7> <B6C7> <809A> <B6C8> <B6C8> <5EA6> <B6C9> <B6C9> <6E21> <B6CA> <B6CA> <5992> <B6CB> <B6CB> <7AEF> <B6CC> <B6CC> <77ED> <B6CD> <B6CD> <953B> <B6CE> <B6CE> <6BB5> <B6CF> <B6CF> <65AD> <B6D0> <B6D0> <7F0E> <B6D1> <B6D1> <5806> <B6D2> <B6D2> <5151> <B6D3> <B6D3> <961F> <B6D4> <B6D4> <5BF9> <B6D5> <B6D5> <58A9> <B6D6> <B6D6> <5428> <B6D7> <B6D7> <8E72> <B6D8> <B6D8> <6566> <B6D9> <B6D9> <987F> <B6DA> <B6DA> <56E4> <B6DB> <B6DB> <949D> <B6DC> <B6DC> <76FE> <B6DD> <B6DD> <9041> <B6DE> <B6DE> <6387> <B6DF> <B6DF> <54C6> <B6E0> <B6E0> <591A> <B6E1> <B6E1> <593A> <B6E2> <B6E2> <579B> <B6E3> <B6E3> <8EB2> <B6E4> <B6E4> <6735> <B6E5> <B6E5> <8DFA> <B6E6> <B6E6> <8235> <B6E7> <B6E7> <5241> <B6E8> <B6E8> <60F0> <B6E9> <B6E9> <5815> <B6EA> <B6EA> <86FE> <B6EB> <B6EB> <5CE8> <B6EC> <B6EC> <9E45> <B6ED> <B6ED> <4FC4> <B6EE> <B6EE> <989D> <B6EF> <B6EF> <8BB9> <B6F0> <B6F0> <5A25> <B6F1> <B6F1> <6076> <B6F2> <B6F2> <5384> <B6F3> <B6F3> <627C> <B6F4> <B6F4> <904F> <B6F5> <B6F5> <9102> <B6F6> <B6F6> <997F> endbfrange 100 beginbfrange <B6F7> <B6F7> <6069> <B6F8> <B6F8> <800C> <B6F9> <B6F9> <513F> <B6FA> <B6FA> <8033> <B6FB> <B6FB> <5C14> <B6FC> <B6FC> <9975> <B6FD> <B6FD> <6D31> <B6FE> <B6FE> <4E8C> <B7A1> <B7A1> <8D30> <B7A2> <B7A2> <53D1> <B7A3> <B7A3> <7F5A> <B7A4> <B7A4> <7B4F> <B7A5> <B7A5> <4F10> <B7A6> <B7A6> <4E4F> <B7A7> <B7A7> <9600> <B7A8> <B7A8> <6CD5> <B7A9> <B7A9> <73D0> <B7AA> <B7AA> <85E9> <B7AB> <B7AB> <5E06> <B7AC> <B7AC> <756A> <B7AD> <B7AD> <7FFB> <B7AE> <B7AE> <6A0A> <B7AF> <B7AF> <77FE> <B7B0> <B7B0> <9492> <B7B1> <B7B1> <7E41> <B7B2> <B7B2> <51E1> <B7B3> <B7B3> <70E6> <B7B4> <B7B4> <53CD> <B7B5> <B7B5> <8FD4> <B7B6> <B7B6> <8303> <B7B7> <B7B7> <8D29> <B7B8> <B7B8> <72AF> <B7B9> <B7B9> <996D> <B7BA> <B7BA> <6CDB> <B7BB> <B7BB> <574A> <B7BC> <B7BC> <82B3> <B7BD> <B7BD> <65B9> <B7BE> <B7BE> <80AA> <B7BF> <B7BF> <623F> <B7C0> <B7C0> <9632> <B7C1> <B7C1> <59A8> <B7C2> <B7C2> <4EFF> <B7C3> <B7C3> <8BBF> <B7C4> <B7C4> <7EBA> <B7C5> <B7C5> <653E> <B7C6> <B7C6> <83F2> <B7C7> <B7C7> <975E> <B7C8> <B7C8> <5561> <B7C9> <B7C9> <98DE> <B7CA> <B7CA> <80A5> <B7CB> <B7CB> <532A> <B7CC> <B7CC> <8BFD> <B7CD> <B7CD> <5420> <B7CE> <B7CE> <80BA> <B7CF> <B7CF> <5E9F> <B7D0> <B7D0> <6CB8> <B7D1> <B7D1> <8D39> <B7D2> <B7D2> <82AC> <B7D3> <B7D3> <915A> <B7D4> <B7D4> <5429> <B7D5> <B7D5> <6C1B> <B7D6> <B7D6> <5206> <B7D7> <B7D7> <7EB7> <B7D8> <B7D8> <575F> <B7D9> <B7D9> <711A> <B7DA> <B7DA> <6C7E> <B7DB> <B7DB> <7C89> <B7DC> <B7DC> <594B> <B7DD> <B7DD> <4EFD> <B7DE> <B7DE> <5FFF> <B7DF> <B7DF> <6124> <B7E0> <B7E0> <7CAA> <B7E1> <B7E1> <4E30> <B7E2> <B7E2> <5C01> <B7E3> <B7E3> <67AB> <B7E4> <B7E4> <8702> <B7E5> <B7E5> <5CF0> <B7E6> <B7E6> <950B> <B7E7> <B7E7> <98CE> <B7E8> <B7E8> <75AF> <B7E9> <B7E9> <70FD> <B7EA> <B7EA> <9022> <B7EB> <B7EB> <51AF> <B7EC> <B7EC> <7F1D> <B7ED> <B7ED> <8BBD> <B7EE> <B7EE> <5949> <B7EF> <B7EF> <51E4> <B7F0> <B7F0> <4F5B> <B7F1> <B7F1> <5426> <B7F2> <B7F2> <592B> <B7F3> <B7F3> <6577> <B7F4> <B7F4> <80A4> <B7F5> <B7F5> <5B75> <B7F6> <B7F6> <6276> <B7F7> <B7F7> <62C2> <B7F8> <B7F8> <8F90> <B7F9> <B7F9> <5E45> <B7FA> <B7FA> <6C1F> <B7FB> <B7FB> <7B26> <B7FC> <B7FC> <4F0F> endbfrange 100 beginbfrange <B7FD> <B7FD> <4FD8> <B7FE> <B7FE> <670D> <B8A1> <B8A1> <6D6E> <B8A2> <B8A2> <6DAA> <B8A3> <B8A3> <798F> <B8A4> <B8A4> <88B1> <B8A5> <B8A5> <5F17> <B8A6> <B8A6> <752B> <B8A7> <B8A7> <629A> <B8A8> <B8A8> <8F85> <B8A9> <B8A9> <4FEF> <B8AA> <B8AA> <91DC> <B8AB> <B8AB> <65A7> <B8AC> <B8AC> <812F> <B8AD> <B8AD> <8151> <B8AE> <B8AE> <5E9C> <B8AF> <B8AF> <8150> <B8B0> <B8B0> <8D74> <B8B1> <B8B1> <526F> <B8B2> <B8B2> <8986> <B8B3> <B8B3> <8D4B> <B8B4> <B8B4> <590D> <B8B5> <B8B5> <5085> <B8B6> <B8B6> <4ED8> <B8B7> <B8B7> <961C> <B8B8> <B8B8> <7236> <B8B9> <B8B9> <8179> <B8BA> <B8BA> <8D1F> <B8BB> <B8BB> <5BCC> <B8BC> <B8BC> <8BA3> <B8BD> <B8BD> <9644> <B8BE> <B8BE> <5987> <B8BF> <B8BF> <7F1A> <B8C0> <B8C0> <5490> <B8C1> <B8C1> <5676> <B8C2> <B8C2> <560E> <B8C3> <B8C3> <8BE5> <B8C4> <B8C4> <6539> <B8C5> <B8C5> <6982> <B8C6> <B8C6> <9499> <B8C7> <B8C7> <76D6> <B8C8> <B8C8> <6E89> <B8C9> <B8C9> <5E72> <B8CA> <B8CA> <7518> <B8CB> <B8CB> <6746> <B8CC> <B8CC> <67D1> <B8CD> <B8CD> <7AFF> <B8CE> <B8CE> <809D> <B8CF> <B8CF> <8D76> <B8D0> <B8D0> <611F> <B8D1> <B8D1> <79C6> <B8D2> <B8D2> <6562> <B8D3> <B8D3> <8D63> <B8D4> <B8D4> <5188> <B8D5> <B8D5> <521A> <B8D6> <B8D6> <94A2> <B8D7> <B8D7> <7F38> <B8D8> <B8D8> <809B> <B8D9> <B8D9> <7EB2> <B8DA> <B8DA> <5C97> <B8DB> <B8DB> <6E2F> <B8DC> <B8DC> <6760> <B8DD> <B8DD> <7BD9> <B8DE> <B8DE> <768B> <B8DF> <B8DF> <9AD8> <B8E0> <B8E0> <818F> <B8E1> <B8E1> <7F94> <B8E2> <B8E2> <7CD5> <B8E3> <B8E3> <641E> <B8E4> <B8E4> <9550> <B8E5> <B8E5> <7A3F> <B8E6> <B8E6> <544A> <B8E7> <B8E7> <54E5> <B8E8> <B8E8> <6B4C> <B8E9> <B8E9> <6401> <B8EA> <B8EA> <6208> <B8EB> <B8EB> <9E3D> <B8EC> <B8EC> <80F3> <B8ED> <B8ED> <7599> <B8EE> <B8EE> <5272> <B8EF> <B8EF> <9769> <B8F0> <B8F0> <845B> <B8F1> <B8F1> <683C> <B8F2> <B8F2> <86E4> <B8F3> <B8F3> <9601> <B8F4> <B8F4> <9694> <B8F5> <B8F5> <94EC> <B8F6> <B8F6> <4E2A> <B8F7> <B8F7> <5404> <B8F8> <B8F8> <7ED9> <B8F9> <B8F9> <6839> <B8FA> <B8FA> <8DDF> <B8FB> <B8FB> <8015> <B8FC> <B8FC> <66F4> <B8FD> <B8FD> <5E9A> <B8FE> <B8FE> <7FB9> <B9A1> <B9A1> <57C2> <B9A2> <B9A2> <803F> <B9A3> <B9A3> <6897> <B9A4> <B9A4> <5DE5> endbfrange 100 beginbfrange <B9A5> <B9A5> <653B> <B9A6> <B9A6> <529F> <B9A7> <B9A7> <606D> <B9A8> <B9A8> <9F9A> <B9A9> <B9A9> <4F9B> <B9AA> <B9AA> <8EAC> <B9AB> <B9AB> <516C> <B9AC> <B9AC> <5BAB> <B9AD> <B9AD> <5F13> <B9AE> <B9AE> <5DE9> <B9AF> <B9AF> <6C5E> <B9B0> <B9B0> <62F1> <B9B1> <B9B1> <8D21> <B9B2> <B9B2> <5171> <B9B3> <B9B3> <94A9> <B9B4> <B9B4> <52FE> <B9B5> <B9B5> <6C9F> <B9B6> <B9B6> <82DF> <B9B7> <B9B7> <72D7> <B9B8> <B9B8> <57A2> <B9B9> <B9B9> <6784> <B9BA> <B9BA> <8D2D> <B9BB> <B9BB> <591F> <B9BC> <B9BC> <8F9C> <B9BD> <B9BD> <83C7> <B9BE> <B9BE> <5495> <B9BF> <B9BF> <7B8D> <B9C0> <B9C0> <4F30> <B9C1> <B9C1> <6CBD> <B9C2> <B9C2> <5B64> <B9C3> <B9C3> <59D1> <B9C4> <B9C4> <9F13> <B9C5> <B9C5> <53E4> <B9C6> <B9C6> <86CA> <B9C7> <B9C7> <9AA8> <B9C8> <B9C8> <8C37> <B9C9> <B9C9> <80A1> <B9CA> <B9CA> <6545> <B9CB> <B9CB> <987E> <B9CC> <B9CC> <56FA> <B9CD> <B9CD> <96C7> <B9CE> <B9CE> <522E> <B9CF> <B9CF> <74DC> <B9D0> <B9D0> <5250> <B9D1> <B9D1> <5BE1> <B9D2> <B9D2> <6302> <B9D3> <B9D3> <8902> <B9D4> <B9D4> <4E56> <B9D5> <B9D5> <62D0> <B9D6> <B9D6> <602A> <B9D7> <B9D7> <68FA> <B9D8> <B9D8> <5173> <B9D9> <B9D9> <5B98> <B9DA> <B9DA> <51A0> <B9DB> <B9DB> <89C2> <B9DC> <B9DC> <7BA1> <B9DD> <B9DD> <9986> <B9DE> <B9DE> <7F50> <B9DF> <B9DF> <60EF> <B9E0> <B9E0> <704C> <B9E1> <B9E1> <8D2F> <B9E2> <B9E2> <5149> <B9E3> <B9E3> <5E7F> <B9E4> <B9E4> <901B> <B9E5> <B9E5> <7470> <B9E6> <B9E6> <89C4> <B9E7> <B9E7> <572D> <B9E8> <B9E8> <7845> <B9E9> <B9E9> <5F52> <B9EA> <B9EA> <9F9F> <B9EB> <B9EB> <95FA> <B9EC> <B9EC> <8F68> <B9ED> <B9ED> <9B3C> <B9EE> <B9EE> <8BE1> <B9EF> <B9EF> <7678> <B9F0> <B9F0> <6842> <B9F1> <B9F1> <67DC> <B9F2> <B9F2> <8DEA> <B9F3> <B9F3> <8D35> <B9F4> <B9F4> <523D> <B9F5> <B9F5> <8F8A> <B9F6> <B9F6> <6EDA> <B9F7> <B9F7> <68CD> <B9F8> <B9F8> <9505> <B9F9> <B9F9> <90ED> <B9FA> <B9FA> <56FD> <B9FB> <B9FB> <679C> <B9FC> <B9FC> <88F9> <B9FD> <B9FD> <8FC7> <B9FE> <B9FE> <54C8> <BAA1> <BAA1> <9AB8> <BAA2> <BAA2> <5B69> <BAA3> <BAA3> <6D77> <BAA4> <BAA4> <6C26> <BAA5> <BAA5> <4EA5> <BAA6> <BAA6> <5BB3> <BAA7> <BAA7> <9A87> <BAA8> <BAA8> <9163> <BAA9> <BAA9> <61A8> <BAAA> <BAAA> <90AF> endbfrange 100 beginbfrange <BAAB> <BAAB> <97E9> <BAAC> <BAAC> <542B> <BAAD> <BAAD> <6DB5> <BAAE> <BAAE> <5BD2> <BAAF> <BAAF> <51FD> <BAB0> <BAB0> <558A> <BAB1> <BAB1> <7F55> <BAB2> <BAB2> <7FF0> <BAB3> <BAB3> <64BC> <BAB4> <BAB4> <634D> <BAB5> <BAB5> <65F1> <BAB6> <BAB6> <61BE> <BAB7> <BAB7> <608D> <BAB8> <BAB8> <710A> <BAB9> <BAB9> <6C57> <BABA> <BABA> <6C49> <BABB> <BABB> <592F> <BABC> <BABC> <676D> <BABD> <BABD> <822A> <BABE> <BABE> <58D5> <BABF> <BABF> <568E> <BAC0> <BAC0> <8C6A> <BAC1> <BAC1> <6BEB> <BAC2> <BAC2> <90DD> <BAC3> <BAC3> <597D> <BAC4> <BAC4> <8017> <BAC5> <BAC5> <53F7> <BAC6> <BAC6> <6D69> <BAC7> <BAC7> <5475> <BAC8> <BAC8> <559D> <BAC9> <BAC9> <8377> <BACA> <BACA> <83CF> <BACB> <BACB> <6838> <BACC> <BACC> <79BE> <BACD> <BACD> <548C> <BACE> <BACE> <4F55> <BACF> <BACF> <5408> <BAD0> <BAD0> <76D2> <BAD1> <BAD1> <8C89> <BAD2> <BAD2> <9602> <BAD3> <BAD3> <6CB3> <BAD4> <BAD4> <6DB8> <BAD5> <BAD5> <8D6B> <BAD6> <BAD6> <8910> <BAD7> <BAD7> <9E64> <BAD8> <BAD8> <8D3A> <BAD9> <BAD9> <563F> <BADA> <BADA> <9ED1> <BADB> <BADB> <75D5> <BADC> <BADC> <5F88> <BADD> <BADD> <72E0> <BADE> <BADE> <6068> <BADF> <BADF> <54FC> <BAE0> <BAE0> <4EA8> <BAE1> <BAE1> <6A2A> <BAE2> <BAE2> <8861> <BAE3> <BAE3> <6052> <BAE4> <BAE4> <8F70> <BAE5> <BAE5> <54C4> <BAE6> <BAE6> <70D8> <BAE7> <BAE7> <8679> <BAE8> <BAE8> <9E3F> <BAE9> <BAE9> <6D2A> <BAEA> <BAEA> <5B8F> <BAEB> <BAEB> <5F18> <BAEC> <BAEC> <7EA2> <BAED> <BAED> <5589> <BAEE> <BAEE> <4FAF> <BAEF> <BAEF> <7334> <BAF0> <BAF0> <543C> <BAF1> <BAF1> <539A> <BAF2> <BAF2> <5019> <BAF3> <BAF3> <540E> <BAF4> <BAF4> <547C> <BAF5> <BAF5> <4E4E> <BAF6> <BAF6> <5FFD> <BAF7> <BAF7> <745A> <BAF8> <BAF8> <58F6> <BAF9> <BAF9> <846B> <BAFA> <BAFA> <80E1> <BAFB> <BAFB> <8774> <BAFC> <BAFC> <72D0> <BAFD> <BAFD> <7CCA> <BAFE> <BAFE> <6E56> <BBA1> <BBA1> <5F27> <BBA2> <BBA2> <864E> <BBA3> <BBA3> <552C> <BBA4> <BBA4> <62A4> <BBA5> <BBA5> <4E92> <BBA6> <BBA6> <6CAA> <BBA7> <BBA7> <6237> <BBA8> <BBA8> <82B1> <BBA9> <BBA9> <54D7> <BBAA> <BBAA> <534E> <BBAB> <BBAB> <733E> <BBAC> <BBAC> <6ED1> <BBAD> <BBAD> <753B> <BBAE> <BBAE> <5212> <BBAF> <BBAF> <5316> <BBB0> <BBB0> <8BDD> endbfrange 100 beginbfrange <BBB1> <BBB1> <69D0> <BBB2> <BBB2> <5F8A> <BBB3> <BBB3> <6000> <BBB4> <BBB4> <6DEE> <BBB5> <BBB5> <574F> <BBB6> <BBB6> <6B22> <BBB7> <BBB7> <73AF> <BBB8> <BBB8> <6853> <BBB9> <BBB9> <8FD8> <BBBA> <BBBA> <7F13> <BBBB> <BBBB> <6362> <BBBC> <BBBC> <60A3> <BBBD> <BBBD> <5524> <BBBE> <BBBE> <75EA> <BBBF> <BBBF> <8C62> <BBC0> <BBC0> <7115> <BBC1> <BBC1> <6DA3> <BBC2> <BBC2> <5BA6> <BBC3> <BBC3> <5E7B> <BBC4> <BBC4> <8352> <BBC5> <BBC5> <614C> <BBC6> <BBC6> <9EC4> <BBC7> <BBC7> <78FA> <BBC8> <BBC8> <8757> <BBC9> <BBC9> <7C27> <BBCA> <BBCA> <7687> <BBCB> <BBCB> <51F0> <BBCC> <BBCC> <60F6> <BBCD> <BBCD> <714C> <BBCE> <BBCE> <6643> <BBCF> <BBCF> <5E4C> <BBD0> <BBD0> <604D> <BBD1> <BBD1> <8C0E> <BBD2> <BBD2> <7070> <BBD3> <BBD3> <6325> <BBD4> <BBD4> <8F89> <BBD5> <BBD5> <5FBD> <BBD6> <BBD6> <6062> <BBD7> <BBD7> <86D4> <BBD8> <BBD8> <56DE> <BBD9> <BBD9> <6BC1> <BBDA> <BBDA> <6094> <BBDB> <BBDB> <6167> <BBDC> <BBDC> <5349> <BBDD> <BBDD> <60E0> <BBDE> <BBDE> <6666> <BBDF> <BBDF> <8D3F> <BBE0> <BBE0> <79FD> <BBE1> <BBE1> <4F1A> <BBE2> <BBE2> <70E9> <BBE3> <BBE3> <6C47> <BBE4> <BBE4> <8BB3> <BBE5> <BBE5> <8BF2> <BBE6> <BBE6> <7ED8> <BBE7> <BBE7> <8364> <BBE8> <BBE8> <660F> <BBE9> <BBE9> <5A5A> <BBEA> <BBEA> <9B42> <BBEB> <BBEB> <6D51> <BBEC> <BBEC> <6DF7> <BBED> <BBED> <8C41> <BBEE> <BBEE> <6D3B> <BBEF> <BBEF> <4F19> <BBF0> <BBF0> <706B> <BBF1> <BBF1> <83B7> <BBF2> <BBF2> <6216> <BBF3> <BBF3> <60D1> <BBF4> <BBF4> <970D> <BBF5> <BBF5> <8D27> <BBF6> <BBF6> <7978> <BBF7> <BBF7> <51FB> <BBF8> <BBF8> <573E> <BBF9> <BBF9> <57FA> <BBFA> <BBFA> <673A> <BBFB> <BBFB> <7578> <BBFC> <BBFC> <7A3D> <BBFD> <BBFD> <79EF> <BBFE> <BBFE> <7B95> <BCA1> <BCA1> <808C> <BCA2> <BCA2> <9965> <BCA3> <BCA3> <8FF9> <BCA4> <BCA4> <6FC0> <BCA5> <BCA5> <8BA5> <BCA6> <BCA6> <9E21> <BCA7> <BCA7> <59EC> <BCA8> <BCA8> <7EE9> <BCA9> <BCA9> <7F09> <BCAA> <BCAA> <5409> <BCAB> <BCAB> <6781> <BCAC> <BCAC> <68D8> <BCAD> <BCAD> <8F91> <BCAE> <BCAE> <7C4D> <BCAF> <BCAF> <96C6> <BCB0> <BCB0> <53CA> <BCB1> <BCB1> <6025> <BCB2> <BCB2> <75BE> <BCB3> <BCB3> <6C72> <BCB4> <BCB4> <5373> <BCB5> <BCB5> <5AC9> <BCB6> <BCB6> <7EA7> endbfrange 100 beginbfrange <BCB7> <BCB7> <6324> <BCB8> <BCB8> <51E0> <BCB9> <BCB9> <810A> <BCBA> <BCBA> <5DF1> <BCBB> <BCBB> <84DF> <BCBC> <BCBC> <6280> <BCBD> <BCBD> <5180> <BCBE> <BCBE> <5B63> <BCBF> <BCBF> <4F0E> <BCC0> <BCC0> <796D> <BCC1> <BCC1> <5242> <BCC2> <BCC2> <60B8> <BCC3> <BCC3> <6D4E> <BCC4> <BCC4> <5BC4> <BCC5> <BCC5> <5BC2> <BCC6> <BCC6> <8BA1> <BCC7> <BCC7> <8BB0> <BCC8> <BCC8> <65E2> <BCC9> <BCC9> <5FCC> <BCCA> <BCCA> <9645> <BCCB> <BCCB> <5993> <BCCC> <BCCC> <7EE7> <BCCD> <BCCD> <7EAA> <BCCE> <BCCE> <5609> <BCCF> <BCCF> <67B7> <BCD0> <BCD0> <5939> <BCD1> <BCD1> <4F73> <BCD2> <BCD2> <5BB6> <BCD3> <BCD3> <52A0> <BCD4> <BCD4> <835A> <BCD5> <BCD5> <988A> <BCD6> <BCD6> <8D3E> <BCD7> <BCD7> <7532> <BCD8> <BCD8> <94BE> <BCD9> <BCD9> <5047> <BCDA> <BCDA> <7A3C> <BCDB> <BCDB> <4EF7> <BCDC> <BCDC> <67B6> <BCDD> <BCDD> <9A7E> <BCDE> <BCDE> <5AC1> <BCDF> <BCDF> <6B7C> <BCE0> <BCE0> <76D1> <BCE1> <BCE1> <575A> <BCE2> <BCE2> <5C16> <BCE3> <BCE3> <7B3A> <BCE4> <BCE4> <95F4> <BCE5> <BCE5> <714E> <BCE6> <BCE6> <517C> <BCE7> <BCE7> <80A9> <BCE8> <BCE8> <8270> <BCE9> <BCE9> <5978> <BCEA> <BCEA> <7F04> <BCEB> <BCEB> <8327> <BCEC> <BCEC> <68C0> <BCED> <BCED> <67EC> <BCEE> <BCEE> <78B1> <BCEF> <BCEF> <7877> <BCF0> <BCF0> <62E3> <BCF1> <BCF1> <6361> <BCF2> <BCF2> <7B80> <BCF3> <BCF3> <4FED> <BCF4> <BCF4> <526A> <BCF5> <BCF5> <51CF> <BCF6> <BCF6> <8350> <BCF7> <BCF7> <69DB> <BCF8> <BCF8> <9274> <BCF9> <BCF9> <8DF5> <BCFA> <BCFA> <8D31> <BCFB> <BCFB> <89C1> <BCFC> <BCFC> <952E> <BCFD> <BCFD> <7BAD> <BCFE> <BCFE> <4EF6> <BDA1> <BDA1> <5065> <BDA2> <BDA2> <8230> <BDA3> <BDA3> <5251> <BDA4> <BDA4> <996F> <BDA5> <BDA5> <6E10> <BDA6> <BDA6> <6E85> <BDA7> <BDA7> <6DA7> <BDA8> <BDA8> <5EFA> <BDA9> <BDA9> <50F5> <BDAA> <BDAA> <59DC> <BDAB> <BDAB> <5C06> <BDAC> <BDAC> <6D46> <BDAD> <BDAD> <6C5F> <BDAE> <BDAE> <7586> <BDAF> <BDAF> <848B> <BDB0> <BDB0> <6868> <BDB1> <BDB1> <5956> <BDB2> <BDB2> <8BB2> <BDB3> <BDB3> <5320> <BDB4> <BDB4> <9171> <BDB5> <BDB5> <964D> <BDB6> <BDB6> <8549> <BDB7> <BDB7> <6912> <BDB8> <BDB8> <7901> <BDB9> <BDB9> <7126> <BDBA> <BDBA> <80F6> <BDBB> <BDBB> <4EA4> <BDBC> <BDBC> <90CA> endbfrange 100 beginbfrange <BDBD> <BDBD> <6D47> <BDBE> <BDBE> <9A84> <BDBF> <BDBF> <5A07> <BDC0> <BDC0> <56BC> <BDC1> <BDC1> <6405> <BDC2> <BDC2> <94F0> <BDC3> <BDC3> <77EB> <BDC4> <BDC4> <4FA5> <BDC5> <BDC5> <811A> <BDC6> <BDC6> <72E1> <BDC7> <BDC7> <89D2> <BDC8> <BDC8> <997A> <BDC9> <BDC9> <7F34> <BDCA> <BDCA> <7EDE> <BDCB> <BDCB> <527F> <BDCC> <BDCC> <6559> <BDCD> <BDCD> <9175> <BDCE> <BDCE> <8F7F> <BDCF> <BDCF> <8F83> <BDD0> <BDD0> <53EB> <BDD1> <BDD1> <7A96> <BDD2> <BDD2> <63ED> <BDD3> <BDD3> <63A5> <BDD4> <BDD4> <7686> <BDD5> <BDD5> <79F8> <BDD6> <BDD6> <8857> <BDD7> <BDD7> <9636> <BDD8> <BDD8> <622A> <BDD9> <BDD9> <52AB> <BDDA> <BDDA> <8282> <BDDB> <BDDB> <6854> <BDDC> <BDDC> <6770> <BDDD> <BDDD> <6377> <BDDE> <BDDE> <776B> <BDDF> <BDDF> <7AED> <BDE0> <BDE0> <6D01> <BDE1> <BDE1> <7ED3> <BDE2> <BDE2> <89E3> <BDE3> <BDE3> <59D0> <BDE4> <BDE4> <6212> <BDE5> <BDE5> <85C9> <BDE6> <BDE6> <82A5> <BDE7> <BDE7> <754C> <BDE8> <BDE8> <501F> <BDE9> <BDE9> <4ECB> <BDEA> <BDEA> <75A5> <BDEB> <BDEB> <8BEB> <BDEC> <BDEC> <5C4A> <BDED> <BDED> <5DFE> <BDEE> <BDEE> <7B4B> <BDEF> <BDEF> <65A4> <BDF0> <BDF0> <91D1> <BDF1> <BDF1> <4ECA> <BDF2> <BDF2> <6D25> <BDF3> <BDF3> <895F> <BDF4> <BDF4> <7D27> <BDF5> <BDF5> <9526> <BDF6> <BDF6> <4EC5> <BDF7> <BDF7> <8C28> <BDF8> <BDF8> <8FDB> <BDF9> <BDF9> <9773> <BDFA> <BDFA> <664B> <BDFB> <BDFB> <7981> <BDFC> <BDFC> <8FD1> <BDFD> <BDFD> <70EC> <BDFE> <BDFE> <6D78> <BEA1> <BEA1> <5C3D> <BEA2> <BEA2> <52B2> <BEA3> <BEA3> <8346> <BEA4> <BEA4> <5162> <BEA5> <BEA5> <830E> <BEA6> <BEA6> <775B> <BEA7> <BEA7> <6676> <BEA8> <BEA8> <9CB8> <BEA9> <BEA9> <4EAC> <BEAA> <BEAA> <60CA> <BEAB> <BEAB> <7CBE> <BEAC> <BEAC> <7CB3> <BEAD> <BEAD> <7ECF> <BEAE> <BEAE> <4E95> <BEAF> <BEAF> <8B66> <BEB0> <BEB0> <666F> <BEB1> <BEB1> <9888> <BEB2> <BEB2> <9759> <BEB3> <BEB3> <5883> <BEB4> <BEB4> <656C> <BEB5> <BEB5> <955C> <BEB6> <BEB6> <5F84> <BEB7> <BEB7> <75C9> <BEB8> <BEB8> <9756> <BEB9> <BEB9> <7ADF> <BEBA> <BEBA> <7ADE> <BEBB> <BEBB> <51C0> <BEBC> <BEBC> <70AF> <BEBD> <BEBD> <7A98> <BEBE> <BEBE> <63EA> <BEBF> <BEBF> <7A76> <BEC0> <BEC0> <7EA0> <BEC1> <BEC1> <7396> <BEC2> <BEC2> <97ED> endbfrange 100 beginbfrange <BEC3> <BEC3> <4E45> <BEC4> <BEC4> <7078> <BEC5> <BEC5> <4E5D> <BEC6> <BEC6> <9152> <BEC7> <BEC7> <53A9> <BEC8> <BEC8> <6551> <BEC9> <BEC9> <65E7> <BECA> <BECA> <81FC> <BECB> <BECB> <8205> <BECC> <BECC> <548E> <BECD> <BECD> <5C31> <BECE> <BECE> <759A> <BECF> <BECF> <97A0> <BED0> <BED0> <62D8> <BED1> <BED1> <72D9> <BED2> <BED2> <75BD> <BED3> <BED3> <5C45> <BED4> <BED4> <9A79> <BED5> <BED5> <83CA> <BED6> <BED6> <5C40> <BED7> <BED7> <5480> <BED8> <BED8> <77E9> <BED9> <BED9> <4E3E> <BEDA> <BEDA> <6CAE> <BEDB> <BEDB> <805A> <BEDC> <BEDC> <62D2> <BEDD> <BEDD> <636E> <BEDE> <BEDE> <5DE8> <BEDF> <BEDF> <5177> <BEE0> <BEE0> <8DDD> <BEE1> <BEE1> <8E1E> <BEE2> <BEE2> <952F> <BEE3> <BEE3> <4FF1> <BEE4> <BEE4> <53E5> <BEE5> <BEE5> <60E7> <BEE6> <BEE6> <70AC> <BEE7> <BEE7> <5267> <BEE8> <BEE8> <6350> <BEE9> <BEE9> <9E43> <BEEA> <BEEA> <5A1F> <BEEB> <BEEB> <5026> <BEEC> <BEEC> <7737> <BEED> <BEED> <5377> <BEEE> <BEEE> <7EE2> <BEEF> <BEEF> <6485> <BEF0> <BEF0> <652B> <BEF1> <BEF1> <6289> <BEF2> <BEF2> <6398> <BEF3> <BEF3> <5014> <BEF4> <BEF4> <7235> <BEF5> <BEF5> <89C9> <BEF6> <BEF6> <51B3> <BEF7> <BEF7> <8BC0> <BEF8> <BEF8> <7EDD> <BEF9> <BEF9> <5747> <BEFA> <BEFA> <83CC> <BEFB> <BEFB> <94A7> <BEFC> <BEFC> <519B> <BEFD> <BEFD> <541B> <BEFE> <BEFE> <5CFB> <BFA1> <BFA1> <4FCA> <BFA2> <BFA2> <7AE3> <BFA3> <BFA3> <6D5A> <BFA4> <BFA4> <90E1> <BFA5> <BFA5> <9A8F> <BFA6> <BFA6> <5580> <BFA7> <BFA7> <5496> <BFA8> <BFA8> <5361> <BFA9> <BFA9> <54AF> <BFAA> <BFAA> <5F00> <BFAB> <BFAB> <63E9> <BFAC> <BFAC> <6977> <BFAD> <BFAD> <51EF> <BFAE> <BFAE> <6168> <BFAF> <BFAF> <520A> <BFB0> <BFB0> <582A> <BFB1> <BFB1> <52D8> <BFB2> <BFB2> <574E> <BFB3> <BFB3> <780D> <BFB4> <BFB4> <770B> <BFB5> <BFB5> <5EB7> <BFB6> <BFB6> <6177> <BFB7> <BFB7> <7CE0> <BFB8> <BFB8> <625B> <BFB9> <BFB9> <6297> <BFBA> <BFBA> <4EA2> <BFBB> <BFBB> <7095> <BFBC> <BFBC> <8003> <BFBD> <BFBD> <62F7> <BFBE> <BFBE> <70E4> <BFBF> <BFBF> <9760> <BFC0> <BFC0> <5777> <BFC1> <BFC1> <82DB> <BFC2> <BFC2> <67EF> <BFC3> <BFC3> <68F5> <BFC4> <BFC4> <78D5> <BFC5> <BFC5> <9897> <BFC6> <BFC6> <79D1> <BFC7> <BFC7> <58F3> <BFC8> <BFC8> <54B3> endbfrange 100 beginbfrange <BFC9> <BFC9> <53EF> <BFCA> <BFCA> <6E34> <BFCB> <BFCB> <514B> <BFCC> <BFCC> <523B> <BFCD> <BFCD> <5BA2> <BFCE> <BFCE> <8BFE> <BFCF> <BFCF> <80AF> <BFD0> <BFD0> <5543> <BFD1> <BFD1> <57A6> <BFD2> <BFD2> <6073> <BFD3> <BFD3> <5751> <BFD4> <BFD4> <542D> <BFD5> <BFD5> <7A7A> <BFD6> <BFD6> <6050> <BFD7> <BFD7> <5B54> <BFD8> <BFD8> <63A7> <BFD9> <BFD9> <62A0> <BFDA> <BFDA> <53E3> <BFDB> <BFDB> <6263> <BFDC> <BFDC> <5BC7> <BFDD> <BFDD> <67AF> <BFDE> <BFDE> <54ED> <BFDF> <BFDF> <7A9F> <BFE0> <BFE0> <82E6> <BFE1> <BFE1> <9177> <BFE2> <BFE2> <5E93> <BFE3> <BFE3> <88E4> <BFE4> <BFE4> <5938> <BFE5> <BFE5> <57AE> <BFE6> <BFE6> <630E> <BFE7> <BFE7> <8DE8> <BFE8> <BFE8> <80EF> <BFE9> <BFE9> <5757> <BFEA> <BFEA> <7B77> <BFEB> <BFEB> <4FA9> <BFEC> <BFEC> <5FEB> <BFED> <BFED> <5BBD> <BFEE> <BFEE> <6B3E> <BFEF> <BFEF> <5321> <BFF0> <BFF0> <7B50> <BFF1> <BFF1> <72C2> <BFF2> <BFF2> <6846> <BFF3> <BFF3> <77FF> <BFF4> <BFF4> <7736> <BFF5> <BFF5> <65F7> <BFF6> <BFF6> <51B5> <BFF7> <BFF7> <4E8F> <BFF8> <BFF8> <76D4> <BFF9> <BFF9> <5CBF> <BFFA> <BFFA> <7AA5> <BFFB> <BFFB> <8475> <BFFC> <BFFC> <594E> <BFFD> <BFFD> <9B41> <BFFE> <BFFE> <5080> <C0A1> <C0A1> <9988> <C0A2> <C0A2> <6127> <C0A3> <C0A3> <6E83> <C0A4> <C0A4> <5764> <C0A5> <C0A5> <6606> <C0A6> <C0A6> <6346> <C0A7> <C0A7> <56F0> <C0A8> <C0A8> <62EC> <C0A9> <C0A9> <6269> <C0AA> <C0AA> <5ED3> <C0AB> <C0AB> <9614> <C0AC> <C0AC> <5783> <C0AD> <C0AD> <62C9> <C0AE> <C0AE> <5587> <C0AF> <C0AF> <8721> <C0B0> <C0B0> <814A> <C0B1> <C0B1> <8FA3> <C0B2> <C0B2> <5566> <C0B3> <C0B3> <83B1> <C0B4> <C0B4> <6765> <C0B5> <C0B5> <8D56> <C0B6> <C0B6> <84DD> <C0B7> <C0B7> <5A6A> <C0B8> <C0B8> <680F> <C0B9> <C0B9> <62E6> <C0BA> <C0BA> <7BEE> <C0BB> <C0BB> <9611> <C0BC> <C0BC> <5170> <C0BD> <C0BD> <6F9C> <C0BE> <C0BE> <8C30> <C0BF> <C0BF> <63FD> <C0C0> <C0C0> <89C8> <C0C1> <C0C1> <61D2> <C0C2> <C0C2> <7F06> <C0C3> <C0C3> <70C2> <C0C4> <C0C4> <6EE5> <C0C5> <C0C5> <7405> <C0C6> <C0C6> <6994> <C0C7> <C0C7> <72FC> <C0C8> <C0C8> <5ECA> <C0C9> <C0C9> <90CE> <C0CA> <C0CA> <6717> <C0CB> <C0CB> <6D6A> <C0CC> <C0CC> <635E> <C0CD> <C0CD> <52B3> <C0CE> <C0CE> <7262> endbfrange 100 beginbfrange <C0CF> <C0CF> <8001> <C0D0> <C0D0> <4F6C> <C0D1> <C0D1> <59E5> <C0D2> <C0D2> <916A> <C0D3> <C0D3> <70D9> <C0D4> <C0D4> <6D9D> <C0D5> <C0D5> <52D2> <C0D6> <C0D6> <4E50> <C0D7> <C0D7> <96F7> <C0D8> <C0D8> <956D> <C0D9> <C0D9> <857E> <C0DA> <C0DA> <78CA> <C0DB> <C0DB> <7D2F> <C0DC> <C0DC> <5121> <C0DD> <C0DD> <5792> <C0DE> <C0DE> <64C2> <C0DF> <C0DF> <808B> <C0E0> <C0E0> <7C7B> <C0E1> <C0E1> <6CEA> <C0E2> <C0E2> <68F1> <C0E3> <C0E3> <695E> <C0E4> <C0E4> <51B7> <C0E5> <C0E5> <5398> <C0E6> <C0E6> <68A8> <C0E7> <C0E7> <7281> <C0E8> <C0E8> <9ECE> <C0E9> <C0E9> <7BF1> <C0EA> <C0EA> <72F8> <C0EB> <C0EB> <79BB> <C0EC> <C0EC> <6F13> <C0ED> <C0ED> <7406> <C0EE> <C0EE> <674E> <C0EF> <C0EF> <91CC> <C0F0> <C0F0> <9CA4> <C0F1> <C0F1> <793C> <C0F2> <C0F2> <8389> <C0F3> <C0F3> <8354> <C0F4> <C0F4> <540F> <C0F5> <C0F5> <6817> <C0F6> <C0F6> <4E3D> <C0F7> <C0F7> <5389> <C0F8> <C0F8> <52B1> <C0F9> <C0F9> <783E> <C0FA> <C0FA> <5386> <C0FB> <C0FB> <5229> <C0FC> <C0FC> <5088> <C0FD> <C0FD> <4F8B> <C0FE> <C0FE> <4FD0> <C1A1> <C1A1> <75E2> <C1A2> <C1A2> <7ACB> <C1A3> <C1A3> <7C92> <C1A4> <C1A4> <6CA5> <C1A5> <C1A5> <96B6> <C1A6> <C1A6> <529B> <C1A7> <C1A7> <7483> <C1A8> <C1A8> <54E9> <C1A9> <C1A9> <4FE9> <C1AA> <C1AA> <8054> <C1AB> <C1AB> <83B2> <C1AC> <C1AC> <8FDE> <C1AD> <C1AD> <9570> <C1AE> <C1AE> <5EC9> <C1AF> <C1AF> <601C> <C1B0> <C1B0> <6D9F> <C1B1> <C1B1> <5E18> <C1B2> <C1B2> <655B> <C1B3> <C1B3> <8138> <C1B4> <C1B4> <94FE> <C1B5> <C1B5> <604B> <C1B6> <C1B6> <70BC> <C1B7> <C1B7> <7EC3> <C1B8> <C1B8> <7CAE> <C1B9> <C1B9> <51C9> <C1BA> <C1BA> <6881> <C1BB> <C1BB> <7CB1> <C1BC> <C1BC> <826F> <C1BD> <C1BD> <4E24> <C1BE> <C1BE> <8F86> <C1BF> <C1BF> <91CF> <C1C0> <C1C0> <667E> <C1C1> <C1C1> <4EAE> <C1C2> <C1C2> <8C05> <C1C3> <C1C3> <64A9> <C1C4> <C1C4> <804A> <C1C5> <C1C5> <50DA> <C1C6> <C1C6> <7597> <C1C7> <C1C7> <71CE> <C1C8> <C1C8> <5BE5> <C1C9> <C1C9> <8FBD> <C1CA> <C1CA> <6F66> <C1CB> <C1CB> <4E86> <C1CC> <C1CC> <6482> <C1CD> <C1CD> <9563> <C1CE> <C1CE> <5ED6> <C1CF> <C1CF> <6599> <C1D0> <C1D0> <5217> <C1D1> <C1D1> <88C2> <C1D2> <C1D2> <70C8> <C1D3> <C1D3> <52A3> <C1D4> <C1D4> <730E> endbfrange 100 beginbfrange <C1D5> <C1D5> <7433> <C1D6> <C1D6> <6797> <C1D7> <C1D7> <78F7> <C1D8> <C1D8> <9716> <C1D9> <C1D9> <4E34> <C1DA> <C1DA> <90BB> <C1DB> <C1DB> <9CDE> <C1DC> <C1DC> <6DCB> <C1DD> <C1DD> <51DB> <C1DE> <C1DE> <8D41> <C1DF> <C1DF> <541D> <C1E0> <C1E0> <62CE> <C1E1> <C1E1> <73B2> <C1E2> <C1E2> <83F1> <C1E3> <C1E3> <96F6> <C1E4> <C1E4> <9F84> <C1E5> <C1E5> <94C3> <C1E6> <C1E6> <4F36> <C1E7> <C1E7> <7F9A> <C1E8> <C1E8> <51CC> <C1E9> <C1E9> <7075> <C1EA> <C1EA> <9675> <C1EB> <C1EB> <5CAD> <C1EC> <C1EC> <9886> <C1ED> <C1ED> <53E6> <C1EE> <C1EE> <4EE4> <C1EF> <C1EF> <6E9C> <C1F0> <C1F0> <7409> <C1F1> <C1F1> <69B4> <C1F2> <C1F2> <786B> <C1F3> <C1F3> <998F> <C1F4> <C1F4> <7559> <C1F5> <C1F5> <5218> <C1F6> <C1F6> <7624> <C1F7> <C1F7> <6D41> <C1F8> <C1F8> <67F3> <C1F9> <C1F9> <516D> <C1FA> <C1FA> <9F99> <C1FB> <C1FB> <804B> <C1FC> <C1FC> <5499> <C1FD> <C1FD> <7B3C> <C1FE> <C1FE> <7ABF> <C2A1> <C2A1> <9686> <C2A2> <C2A2> <5784> <C2A3> <C2A3> <62E2> <C2A4> <C2A4> <9647> <C2A5> <C2A5> <697C> <C2A6> <C2A6> <5A04> <C2A7> <C2A7> <6402> <C2A8> <C2A8> <7BD3> <C2A9> <C2A9> <6F0F> <C2AA> <C2AA> <964B> <C2AB> <C2AB> <82A6> <C2AC> <C2AC> <5362> <C2AD> <C2AD> <9885> <C2AE> <C2AE> <5E90> <C2AF> <C2AF> <7089> <C2B0> <C2B0> <63B3> <C2B1> <C2B1> <5364> <C2B2> <C2B2> <864F> <C2B3> <C2B3> <9C81> <C2B4> <C2B4> <9E93> <C2B5> <C2B5> <788C> <C2B6> <C2B6> <9732> <C2B7> <C2B7> <8DEF> <C2B8> <C2B8> <8D42> <C2B9> <C2B9> <9E7F> <C2BA> <C2BA> <6F5E> <C2BB> <C2BB> <7984> <C2BC> <C2BC> <5F55> <C2BD> <C2BD> <9646> <C2BE> <C2BE> <622E> <C2BF> <C2BF> <9A74> <C2C0> <C2C0> <5415> <C2C1> <C2C1> <94DD> <C2C2> <C2C2> <4FA3> <C2C3> <C2C3> <65C5> <C2C4> <C2C4> <5C65> <C2C5> <C2C5> <5C61> <C2C6> <C2C6> <7F15> <C2C7> <C2C7> <8651> <C2C8> <C2C8> <6C2F> <C2C9> <C2C9> <5F8B> <C2CA> <C2CA> <7387> <C2CB> <C2CB> <6EE4> <C2CC> <C2CC> <7EFF> <C2CD> <C2CD> <5CE6> <C2CE> <C2CE> <631B> <C2CF> <C2CF> <5B6A> <C2D0> <C2D0> <6EE6> <C2D1> <C2D1> <5375> <C2D2> <C2D2> <4E71> <C2D3> <C2D3> <63A0> <C2D4> <C2D4> <7565> <C2D5> <C2D5> <62A1> <C2D6> <C2D6> <8F6E> <C2D7> <C2D7> <4F26> <C2D8> <C2D8> <4ED1> <C2D9> <C2D9> <6CA6> <C2DA> <C2DA> <7EB6> endbfrange 100 beginbfrange <C2DB> <C2DB> <8BBA> <C2DC> <C2DC> <841D> <C2DD> <C2DD> <87BA> <C2DE> <C2DE> <7F57> <C2DF> <C2DF> <903B> <C2E0> <C2E0> <9523> <C2E1> <C2E1> <7BA9> <C2E2> <C2E2> <9AA1> <C2E3> <C2E3> <88F8> <C2E4> <C2E4> <843D> <C2E5> <C2E5> <6D1B> <C2E6> <C2E6> <9A86> <C2E7> <C2E7> <7EDC> <C2E8> <C2E8> <5988> <C2E9> <C2E9> <9EBB> <C2EA> <C2EA> <739B> <C2EB> <C2EB> <7801> <C2EC> <C2EC> <8682> <C2ED> <C2ED> <9A6C> <C2EE> <C2EE> <9A82> <C2EF> <C2EF> <561B> <C2F0> <C2F0> <5417> <C2F1> <C2F1> <57CB> <C2F2> <C2F2> <4E70> <C2F3> <C2F3> <9EA6> <C2F4> <C2F4> <5356> <C2F5> <C2F5> <8FC8> <C2F6> <C2F6> <8109> <C2F7> <C2F7> <7792> <C2F8> <C2F8> <9992> <C2F9> <C2F9> <86EE> <C2FA> <C2FA> <6EE1> <C2FB> <C2FB> <8513> <C2FC> <C2FC> <66FC> <C2FD> <C2FD> <6162> <C2FE> <C2FE> <6F2B> <C3A1> <C3A1> <8C29> <C3A2> <C3A2> <8292> <C3A3> <C3A3> <832B> <C3A4> <C3A4> <76F2> <C3A5> <C3A5> <6C13> <C3A6> <C3A6> <5FD9> <C3A7> <C3A7> <83BD> <C3A8> <C3A8> <732B> <C3A9> <C3A9> <8305> <C3AA> <C3AA> <951A> <C3AB> <C3AB> <6BDB> <C3AC> <C3AC> <77DB> <C3AD> <C3AD> <94C6> <C3AE> <C3AE> <536F> <C3AF> <C3AF> <8302> <C3B0> <C3B0> <5192> <C3B1> <C3B1> <5E3D> <C3B2> <C3B2> <8C8C> <C3B3> <C3B3> <8D38> <C3B4> <C3B4> <4E48> <C3B5> <C3B5> <73AB> <C3B6> <C3B6> <679A> <C3B7> <C3B7> <6885> <C3B8> <C3B8> <9176> <C3B9> <C3B9> <9709> <C3BA> <C3BA> <7164> <C3BB> <C3BB> <6CA1> <C3BC> <C3BC> <7709> <C3BD> <C3BD> <5A92> <C3BE> <C3BE> <9541> <C3BF> <C3BF> <6BCF> <C3C0> <C3C0> <7F8E> <C3C1> <C3C1> <6627> <C3C2> <C3C2> <5BD0> <C3C3> <C3C3> <59B9> <C3C4> <C3C4> <5A9A> <C3C5> <C3C5> <95E8> <C3C6> <C3C6> <95F7> <C3C7> <C3C7> <4EEC> <C3C8> <C3C8> <840C> <C3C9> <C3C9> <8499> <C3CA> <C3CA> <6AAC> <C3CB> <C3CB> <76DF> <C3CC> <C3CC> <9530> <C3CD> <C3CD> <731B> <C3CE> <C3CE> <68A6> <C3CF> <C3CF> <5B5F> <C3D0> <C3D0> <772F> <C3D1> <C3D1> <919A> <C3D2> <C3D2> <9761> <C3D3> <C3D3> <7CDC> <C3D4> <C3D4> <8FF7> <C3D5> <C3D5> <8C1C> <C3D6> <C3D6> <5F25> <C3D7> <C3D7> <7C73> <C3D8> <C3D8> <79D8> <C3D9> <C3D9> <89C5> <C3DA> <C3DA> <6CCC> <C3DB> <C3DB> <871C> <C3DC> <C3DC> <5BC6> <C3DD> <C3DD> <5E42> <C3DE> <C3DE> <68C9> <C3DF> <C3DF> <7720> <C3E0> <C3E0> <7EF5> endbfrange 100 beginbfrange <C3E1> <C3E1> <5195> <C3E2> <C3E2> <514D> <C3E3> <C3E3> <52C9> <C3E4> <C3E4> <5A29> <C3E5> <C3E5> <7F05> <C3E6> <C3E6> <9762> <C3E7> <C3E7> <82D7> <C3E8> <C3E8> <63CF> <C3E9> <C3E9> <7784> <C3EA> <C3EA> <85D0> <C3EB> <C3EB> <79D2> <C3EC> <C3EC> <6E3A> <C3ED> <C3ED> <5E99> <C3EE> <C3EE> <5999> <C3EF> <C3EF> <8511> <C3F0> <C3F0> <706D> <C3F1> <C3F1> <6C11> <C3F2> <C3F2> <62BF> <C3F3> <C3F3> <76BF> <C3F4> <C3F4> <654F> <C3F5> <C3F5> <60AF> <C3F6> <C3F6> <95FD> <C3F7> <C3F7> <660E> <C3F8> <C3F8> <879F> <C3F9> <C3F9> <9E23> <C3FA> <C3FA> <94ED> <C3FB> <C3FB> <540D> <C3FC> <C3FC> <547D> <C3FD> <C3FD> <8C2C> <C3FE> <C3FE> <6478> <C4A1> <C4A1> <6479> <C4A2> <C4A2> <8611> <C4A3> <C4A3> <6A21> <C4A4> <C4A4> <819C> <C4A5> <C4A5> <78E8> <C4A6> <C4A6> <6469> <C4A7> <C4A7> <9B54> <C4A8> <C4A8> <62B9> <C4A9> <C4A9> <672B> <C4AA> <C4AA> <83AB> <C4AB> <C4AB> <58A8> <C4AC> <C4AC> <9ED8> <C4AD> <C4AD> <6CAB> <C4AE> <C4AE> <6F20> <C4AF> <C4AF> <5BDE> <C4B0> <C4B0> <964C> <C4B1> <C4B1> <8C0B> <C4B2> <C4B2> <725F> <C4B3> <C4B3> <67D0> <C4B4> <C4B4> <62C7> <C4B5> <C4B5> <7261> <C4B6> <C4B6> <4EA9> <C4B7> <C4B7> <59C6> <C4B8> <C4B8> <6BCD> <C4B9> <C4B9> <5893> <C4BA> <C4BA> <66AE> <C4BB> <C4BB> <5E55> <C4BC> <C4BC> <52DF> <C4BD> <C4BD> <6155> <C4BE> <C4BE> <6728> <C4BF> <C4BF> <76EE> <C4C0> <C4C0> <7766> <C4C1> <C4C1> <7267> <C4C2> <C4C2> <7A46> <C4C3> <C4C3> <62FF> <C4C4> <C4C4> <54EA> <C4C5> <C4C5> <5450> <C4C6> <C4C6> <94A0> <C4C7> <C4C7> <90A3> <C4C8> <C4C8> <5A1C> <C4C9> <C4C9> <7EB3> <C4CA> <C4CA> <6C16> <C4CB> <C4CB> <4E43> <C4CC> <C4CC> <5976> <C4CD> <C4CD> <8010> <C4CE> <C4CE> <5948> <C4CF> <C4CF> <5357> <C4D0> <C4D0> <7537> <C4D1> <C4D1> <96BE> <C4D2> <C4D2> <56CA> <C4D3> <C4D3> <6320> <C4D4> <C4D4> <8111> <C4D5> <C4D5> <607C> <C4D6> <C4D6> <95F9> <C4D7> <C4D7> <6DD6> <C4D8> <C4D8> <5462> <C4D9> <C4D9> <9981> <C4DA> <C4DA> <5185> <C4DB> <C4DB> <5AE9> <C4DC> <C4DC> <80FD> <C4DD> <C4DD> <59AE> <C4DE> <C4DE> <9713> <C4DF> <C4DF> <502A> <C4E0> <C4E0> <6CE5> <C4E1> <C4E1> <5C3C> <C4E2> <C4E2> <62DF> <C4E3> <C4E3> <4F60> <C4E4> <C4E4> <533F> <C4E5> <C4E5> <817B> <C4E6> <C4E6> <9006> endbfrange 100 beginbfrange <C4E7> <C4E7> <6EBA> <C4E8> <C4E8> <852B> <C4E9> <C4E9> <62C8> <C4EA> <C4EA> <5E74> <C4EB> <C4EB> <78BE> <C4EC> <C4EC> <64B5> <C4ED> <C4ED> <637B> <C4EE> <C4EE> <5FF5> <C4EF> <C4EF> <5A18> <C4F0> <C4F0> <917F> <C4F1> <C4F1> <9E1F> <C4F2> <C4F2> <5C3F> <C4F3> <C4F3> <634F> <C4F4> <C4F4> <8042> <C4F5> <C4F5> <5B7D> <C4F6> <C4F6> <556E> <C4F7> <C4F7> <954A> <C4F8> <C4F8> <954D> <C4F9> <C4F9> <6D85> <C4FA> <C4FA> <60A8> <C4FB> <C4FB> <67E0> <C4FC> <C4FC> <72DE> <C4FD> <C4FD> <51DD> <C4FE> <C4FE> <5B81> <C5A1> <C5A1> <62E7> <C5A2> <C5A2> <6CDE> <C5A3> <C5A3> <725B> <C5A4> <C5A4> <626D> <C5A5> <C5A5> <94AE> <C5A6> <C5A6> <7EBD> <C5A7> <C5A7> <8113> <C5A8> <C5A8> <6D53> <C5A9> <C5A9> <519C> <C5AA> <C5AA> <5F04> <C5AB> <C5AB> <5974> <C5AC> <C5AC> <52AA> <C5AD> <C5AD> <6012> <C5AE> <C5AE> <5973> <C5AF> <C5AF> <6696> <C5B0> <C5B0> <8650> <C5B1> <C5B1> <759F> <C5B2> <C5B2> <632A> <C5B3> <C5B3> <61E6> <C5B4> <C5B4> <7CEF> <C5B5> <C5B5> <8BFA> <C5B6> <C5B6> <54E6> <C5B7> <C5B7> <6B27> <C5B8> <C5B8> <9E25> <C5B9> <C5B9> <6BB4> <C5BA> <C5BA> <85D5> <C5BB> <C5BB> <5455> <C5BC> <C5BC> <5076> <C5BD> <C5BD> <6CA4> <C5BE> <C5BE> <556A> <C5BF> <C5BF> <8DB4> <C5C0> <C5C0> <722C> <C5C1> <C5C1> <5E15> <C5C2> <C5C2> <6015> <C5C3> <C5C3> <7436> <C5C4> <C5C4> <62CD> <C5C5> <C5C5> <6392> <C5C6> <C5C6> <724C> <C5C7> <C5C7> <5F98> <C5C8> <C5C8> <6E43> <C5C9> <C5C9> <6D3E> <C5CA> <C5CA> <6500> <C5CB> <C5CB> <6F58> <C5CC> <C5CC> <76D8> <C5CD> <C5CD> <78D0> <C5CE> <C5CE> <76FC> <C5CF> <C5CF> <7554> <C5D0> <C5D0> <5224> <C5D1> <C5D1> <53DB> <C5D2> <C5D2> <4E53> <C5D3> <C5D3> <5E9E> <C5D4> <C5D4> <65C1> <C5D5> <C5D5> <802A> <C5D6> <C5D6> <80D6> <C5D7> <C5D7> <629B> <C5D8> <C5D8> <5486> <C5D9> <C5D9> <5228> <C5DA> <C5DA> <70AE> <C5DB> <C5DB> <888D> <C5DC> <C5DC> <8DD1> <C5DD> <C5DD> <6CE1> <C5DE> <C5DE> <5478> <C5DF> <C5DF> <80DA> <C5E0> <C5E0> <57F9> <C5E1> <C5E1> <88F4> <C5E2> <C5E2> <8D54> <C5E3> <C5E3> <966A> <C5E4> <C5E4> <914D> <C5E5> <C5E5> <4F69> <C5E6> <C5E6> <6C9B> <C5E7> <C5E7> <55B7> <C5E8> <C5E8> <76C6> <C5E9> <C5E9> <7830> <C5EA> <C5EA> <62A8> <C5EB> <C5EB> <70F9> <C5EC> <C5EC> <6F8E> endbfrange 100 beginbfrange <C5ED> <C5ED> <5F6D> <C5EE> <C5EE> <84EC> <C5EF> <C5EF> <68DA> <C5F0> <C5F0> <787C> <C5F1> <C5F1> <7BF7> <C5F2> <C5F2> <81A8> <C5F3> <C5F3> <670B> <C5F4> <C5F4> <9E4F> <C5F5> <C5F5> <6367> <C5F6> <C5F6> <78B0> <C5F7> <C5F7> <576F> <C5F8> <C5F8> <7812> <C5F9> <C5F9> <9739> <C5FA> <C5FA> <6279> <C5FB> <C5FB> <62AB> <C5FC> <C5FC> <5288> <C5FD> <C5FD> <7435> <C5FE> <C5FE> <6BD7> <C6A1> <C6A1> <5564> <C6A2> <C6A2> <813E> <C6A3> <C6A3> <75B2> <C6A4> <C6A4> <76AE> <C6A5> <C6A5> <5339> <C6A6> <C6A6> <75DE> <C6A7> <C6A7> <50FB> <C6A8> <C6A8> <5C41> <C6A9> <C6A9> <8B6C> <C6AA> <C6AA> <7BC7> <C6AB> <C6AB> <504F> <C6AC> <C6AC> <7247> <C6AD> <C6AD> <9A97> <C6AE> <C6AE> <98D8> <C6AF> <C6AF> <6F02> <C6B0> <C6B0> <74E2> <C6B1> <C6B1> <7968> <C6B2> <C6B2> <6487> <C6B3> <C6B3> <77A5> <C6B4> <C6B4> <62FC> <C6B5> <C6B5> <9891> <C6B6> <C6B6> <8D2B> <C6B7> <C6B7> <54C1> <C6B8> <C6B8> <8058> <C6B9> <C6B9> <4E52> <C6BA> <C6BA> <576A> <C6BB> <C6BB> <82F9> <C6BC> <C6BC> <840D> <C6BD> <C6BD> <5E73> <C6BE> <C6BE> <51ED> <C6BF> <C6BF> <74F6> <C6C0> <C6C0> <8BC4> <C6C1> <C6C1> <5C4F> <C6C2> <C6C2> <5761> <C6C3> <C6C3> <6CFC> <C6C4> <C6C4> <9887> <C6C5> <C6C5> <5A46> <C6C6> <C6C6> <7834> <C6C7> <C6C7> <9B44> <C6C8> <C6C8> <8FEB> <C6C9> <C6C9> <7C95> <C6CA> <C6CA> <5256> <C6CB> <C6CB> <6251> <C6CC> <C6CC> <94FA> <C6CD> <C6CD> <4EC6> <C6CE> <C6CE> <8386> <C6CF> <C6CF> <8461> <C6D0> <C6D0> <83E9> <C6D1> <C6D1> <84B2> <C6D2> <C6D2> <57D4> <C6D3> <C6D3> <6734> <C6D4> <C6D4> <5703> <C6D5> <C6D5> <666E> <C6D6> <C6D6> <6D66> <C6D7> <C6D7> <8C31> <C6D8> <C6D8> <66DD> <C6D9> <C6D9> <7011> <C6DA> <C6DA> <671F> <C6DB> <C6DB> <6B3A> <C6DC> <C6DC> <6816> <C6DD> <C6DD> <621A> <C6DE> <C6DE> <59BB> <C6DF> <C6DF> <4E03> <C6E0> <C6E0> <51C4> <C6E1> <C6E1> <6F06> <C6E2> <C6E2> <67D2> <C6E3> <C6E3> <6C8F> <C6E4> <C6E4> <5176> <C6E5> <C6E5> <68CB> <C6E6> <C6E6> <5947> <C6E7> <C6E7> <6B67> <C6E8> <C6E8> <7566> <C6E9> <C6E9> <5D0E> <C6EA> <C6EA> <8110> <C6EB> <C6EB> <9F50> <C6EC> <C6EC> <65D7> <C6ED> <C6ED> <7948> <C6EE> <C6EE> <7941> <C6EF> <C6EF> <9A91> <C6F0> <C6F0> <8D77> <C6F1> <C6F1> <5C82> <C6F2> <C6F2> <4E5E> endbfrange 100 beginbfrange <C6F3> <C6F3> <4F01> <C6F4> <C6F4> <542F> <C6F5> <C6F5> <5951> <C6F6> <C6F6> <780C> <C6F7> <C6F7> <5668> <C6F8> <C6F8> <6C14> <C6F9> <C6F9> <8FC4> <C6FA> <C6FA> <5F03> <C6FB> <C6FB> <6C7D> <C6FC> <C6FC> <6CE3> <C6FD> <C6FD> <8BAB> <C6FE> <C6FE> <6390> <C7A1> <C7A1> <6070> <C7A2> <C7A2> <6D3D> <C7A3> <C7A3> <7275> <C7A4> <C7A4> <6266> <C7A5> <C7A5> <948E> <C7A6> <C7A6> <94C5> <C7A7> <C7A7> <5343> <C7A8> <C7A8> <8FC1> <C7A9> <C7A9> <7B7E> <C7AA> <C7AA> <4EDF> <C7AB> <C7AB> <8C26> <C7AC> <C7AC> <4E7E> <C7AD> <C7AD> <9ED4> <C7AE> <C7AE> <94B1> <C7AF> <C7AF> <94B3> <C7B0> <C7B0> <524D> <C7B1> <C7B1> <6F5C> <C7B2> <C7B2> <9063> <C7B3> <C7B3> <6D45> <C7B4> <C7B4> <8C34> <C7B5> <C7B5> <5811> <C7B6> <C7B6> <5D4C> <C7B7> <C7B7> <6B20> <C7B8> <C7B8> <6B49> <C7B9> <C7B9> <67AA> <C7BA> <C7BA> <545B> <C7BB> <C7BB> <8154> <C7BC> <C7BC> <7F8C> <C7BD> <C7BD> <5899> <C7BE> <C7BE> <8537> <C7BF> <C7BF> <5F3A> <C7C0> <C7C0> <62A2> <C7C1> <C7C1> <6A47> <C7C2> <C7C2> <9539> <C7C3> <C7C3> <6572> <C7C4> <C7C4> <6084> <C7C5> <C7C5> <6865> <C7C6> <C7C6> <77A7> <C7C7> <C7C7> <4E54> <C7C8> <C7C8> <4FA8> <C7C9> <C7C9> <5DE7> <C7CA> <C7CA> <9798> <C7CB> <C7CB> <64AC> <C7CC> <C7CC> <7FD8> <C7CD> <C7CD> <5CED> <C7CE> <C7CE> <4FCF> <C7CF> <C7CF> <7A8D> <C7D0> <C7D0> <5207> <C7D1> <C7D1> <8304> <C7D2> <C7D2> <4E14> <C7D3> <C7D3> <602F> <C7D4> <C7D4> <7A83> <C7D5> <C7D5> <94A6> <C7D6> <C7D6> <4FB5> <C7D7> <C7D7> <4EB2> <C7D8> <C7D8> <79E6> <C7D9> <C7D9> <7434> <C7DA> <C7DA> <52E4> <C7DB> <C7DB> <82B9> <C7DC> <C7DC> <64D2> <C7DD> <C7DD> <79BD> <C7DE> <C7DE> <5BDD> <C7DF> <C7DF> <6C81> <C7E0> <C7E0> <9752> <C7E1> <C7E1> <8F7B> <C7E2> <C7E2> <6C22> <C7E3> <C7E3> <503E> <C7E4> <C7E4> <537F> <C7E5> <C7E5> <6E05> <C7E6> <C7E6> <64CE> <C7E7> <C7E7> <6674> <C7E8> <C7E8> <6C30> <C7E9> <C7E9> <60C5> <C7EA> <C7EA> <9877> <C7EB> <C7EB> <8BF7> <C7EC> <C7EC> <5E86> <C7ED> <C7ED> <743C> <C7EE> <C7EE> <7A77> <C7EF> <C7EF> <79CB> <C7F0> <C7F0> <4E18> <C7F1> <C7F1> <90B1> <C7F2> <C7F2> <7403> <C7F3> <C7F3> <6C42> <C7F4> <C7F4> <56DA> <C7F5> <C7F5> <914B> <C7F6> <C7F6> <6CC5> <C7F7> <C7F7> <8D8B> <C7F8> <C7F8> <533A> endbfrange 100 beginbfrange <C7F9> <C7F9> <86C6> <C7FA> <C7FA> <66F2> <C7FB> <C7FB> <8EAF> <C7FC> <C7FC> <5C48> <C7FD> <C7FD> <9A71> <C7FE> <C7FE> <6E20> <C8A1> <C8A1> <53D6> <C8A2> <C8A2> <5A36> <C8A3> <C8A3> <9F8B> <C8A4> <C8A4> <8DA3> <C8A5> <C8A5> <53BB> <C8A6> <C8A6> <5708> <C8A7> <C8A7> <98A7> <C8A8> <C8A8> <6743> <C8A9> <C8A9> <919B> <C8AA> <C8AA> <6CC9> <C8AB> <C8AB> <5168> <C8AC> <C8AC> <75CA> <C8AD> <C8AD> <62F3> <C8AE> <C8AE> <72AC> <C8AF> <C8AF> <5238> <C8B0> <C8B0> <529D> <C8B1> <C8B1> <7F3A> <C8B2> <C8B2> <7094> <C8B3> <C8B3> <7638> <C8B4> <C8B4> <5374> <C8B5> <C8B5> <9E4A> <C8B6> <C8B6> <69B7> <C8B7> <C8B7> <786E> <C8B8> <C8B8> <96C0> <C8B9> <C8B9> <88D9> <C8BA> <C8BA> <7FA4> <C8BB> <C8BB> <7136> <C8BC> <C8BC> <71C3> <C8BD> <C8BD> <5189> <C8BE> <C8BE> <67D3> <C8BF> <C8BF> <74E4> <C8C0> <C8C0> <58E4> <C8C1> <C8C1> <6518> <C8C2> <C8C2> <56B7> <C8C3> <C8C3> <8BA9> <C8C4> <C8C4> <9976> <C8C5> <C8C5> <6270> <C8C6> <C8C6> <7ED5> <C8C7> <C8C7> <60F9> <C8C8> <C8C8> <70ED> <C8C9> <C8C9> <58EC> <C8CA> <C8CA> <4EC1> <C8CB> <C8CB> <4EBA> <C8CC> <C8CC> <5FCD> <C8CD> <C8CD> <97E7> <C8CE> <C8CE> <4EFB> <C8CF> <C8CF> <8BA4> <C8D0> <C8D0> <5203> <C8D1> <C8D1> <598A> <C8D2> <C8D2> <7EAB> <C8D3> <C8D3> <6254> <C8D4> <C8D4> <4ECD> <C8D5> <C8D5> <65E5> <C8D6> <C8D6> <620E> <C8D7> <C8D7> <8338> <C8D8> <C8D8> <84C9> <C8D9> <C8D9> <8363> <C8DA> <C8DA> <878D> <C8DB> <C8DB> <7194> <C8DC> <C8DC> <6EB6> <C8DD> <C8DD> <5BB9> <C8DE> <C8DE> <7ED2> <C8DF> <C8DF> <5197> <C8E0> <C8E0> <63C9> <C8E1> <C8E1> <67D4> <C8E2> <C8E2> <8089> <C8E3> <C8E3> <8339> <C8E4> <C8E4> <8815> <C8E5> <C8E5> <5112> <C8E6> <C8E6> <5B7A> <C8E7> <C8E7> <5982> <C8E8> <C8E8> <8FB1> <C8E9> <C8E9> <4E73> <C8EA> <C8EA> <6C5D> <C8EB> <C8EB> <5165> <C8EC> <C8EC> <8925> <C8ED> <C8ED> <8F6F> <C8EE> <C8EE> <962E> <C8EF> <C8EF> <854A> <C8F0> <C8F0> <745E> <C8F1> <C8F1> <9510> <C8F2> <C8F2> <95F0> <C8F3> <C8F3> <6DA6> <C8F4> <C8F4> <82E5> <C8F5> <C8F5> <5F31> <C8F6> <C8F6> <6492> <C8F7> <C8F7> <6D12> <C8F8> <C8F8> <8428> <C8F9> <C8F9> <816E> <C8FA> <C8FA> <9CC3> <C8FB> <C8FB> <585E> <C8FC> <C8FC> <8D5B> <C8FD> <C8FD> <4E09> <C8FE> <C8FE> <53C1> endbfrange 100 beginbfrange <C9A1> <C9A1> <4F1E> <C9A2> <C9A2> <6563> <C9A3> <C9A3> <6851> <C9A4> <C9A4> <55D3> <C9A5> <C9A5> <4E27> <C9A6> <C9A6> <6414> <C9A7> <C9A7> <9A9A> <C9A8> <C9A8> <626B> <C9A9> <C9A9> <5AC2> <C9AA> <C9AA> <745F> <C9AB> <C9AB> <8272> <C9AC> <C9AC> <6DA9> <C9AD> <C9AD> <68EE> <C9AE> <C9AE> <50E7> <C9AF> <C9AF> <838E> <C9B0> <C9B0> <7802> <C9B1> <C9B1> <6740> <C9B2> <C9B2> <5239> <C9B3> <C9B3> <6C99> <C9B4> <C9B4> <7EB1> <C9B5> <C9B5> <50BB> <C9B6> <C9B6> <5565> <C9B7> <C9B7> <715E> <C9B8> <C9B8> <7B5B> <C9B9> <C9B9> <6652> <C9BA> <C9BA> <73CA> <C9BB> <C9BB> <82EB> <C9BC> <C9BC> <6749> <C9BD> <C9BD> <5C71> <C9BE> <C9BE> <5220> <C9BF> <C9BF> <717D> <C9C0> <C9C0> <886B> <C9C1> <C9C1> <95EA> <C9C2> <C9C2> <9655> <C9C3> <C9C3> <64C5> <C9C4> <C9C4> <8D61> <C9C5> <C9C5> <81B3> <C9C6> <C9C6> <5584> <C9C7> <C9C7> <6C55> <C9C8> <C9C8> <6247> <C9C9> <C9C9> <7F2E> <C9CA> <C9CA> <5892> <C9CB> <C9CB> <4F24> <C9CC> <C9CC> <5546> <C9CD> <C9CD> <8D4F> <C9CE> <C9CE> <664C> <C9CF> <C9CF> <4E0A> <C9D0> <C9D0> <5C1A> <C9D1> <C9D1> <88F3> <C9D2> <C9D2> <68A2> <C9D3> <C9D3> <634E> <C9D4> <C9D4> <7A0D> <C9D5> <C9D5> <70E7> <C9D6> <C9D6> <828D> <C9D7> <C9D7> <52FA> <C9D8> <C9D8> <97F6> <C9D9> <C9D9> <5C11> <C9DA> <C9DA> <54E8> <C9DB> <C9DB> <90B5> <C9DC> <C9DC> <7ECD> <C9DD> <C9DD> <5962> <C9DE> <C9DE> <8D4A> <C9DF> <C9DF> <86C7> <C9E0> <C9E1> <820C> <C9E2> <C9E2> <8D66> <C9E3> <C9E3> <6444> <C9E4> <C9E4> <5C04> <C9E5> <C9E5> <6151> <C9E6> <C9E6> <6D89> <C9E7> <C9E7> <793E> <C9E8> <C9E8> <8BBE> <C9E9> <C9E9> <7837> <C9EA> <C9EA> <7533> <C9EB> <C9EB> <547B> <C9EC> <C9EC> <4F38> <C9ED> <C9ED> <8EAB> <C9EE> <C9EE> <6DF1> <C9EF> <C9EF> <5A20> <C9F0> <C9F0> <7EC5> <C9F1> <C9F1> <795E> <C9F2> <C9F2> <6C88> <C9F3> <C9F3> <5BA1> <C9F4> <C9F4> <5A76> <C9F5> <C9F5> <751A> <C9F6> <C9F6> <80BE> <C9F7> <C9F7> <614E> <C9F8> <C9F8> <6E17> <C9F9> <C9F9> <58F0> <C9FA> <C9FA> <751F> <C9FB> <C9FB> <7525> <C9FC> <C9FC> <7272> <C9FD> <C9FD> <5347> <C9FE> <C9FE> <7EF3> <CAA1> <CAA1> <7701> <CAA2> <CAA2> <76DB> <CAA3> <CAA3> <5269> <CAA4> <CAA4> <80DC> <CAA5> <CAA5> <5723> <CAA6> <CAA6> <5E08> <CAA7> <CAA7> <5931> endbfrange 100 beginbfrange <CAA8> <CAA8> <72EE> <CAA9> <CAA9> <65BD> <CAAA> <CAAA> <6E7F> <CAAB> <CAAB> <8BD7> <CAAC> <CAAC> <5C38> <CAAD> <CAAD> <8671> <CAAE> <CAAE> <5341> <CAAF> <CAAF> <77F3> <CAB0> <CAB0> <62FE> <CAB1> <CAB1> <65F6> <CAB2> <CAB2> <4EC0> <CAB3> <CAB3> <98DF> <CAB4> <CAB4> <8680> <CAB5> <CAB5> <5B9E> <CAB6> <CAB6> <8BC6> <CAB7> <CAB7> <53F2> <CAB8> <CAB8> <77E2> <CAB9> <CAB9> <4F7F> <CABA> <CABA> <5C4E> <CABB> <CABB> <9A76> <CABC> <CABC> <59CB> <CABD> <CABD> <5F0F> <CABE> <CABE> <793A> <CABF> <CABF> <58EB> <CAC0> <CAC0> <4E16> <CAC1> <CAC1> <67FF> <CAC2> <CAC2> <4E8B> <CAC3> <CAC3> <62ED> <CAC4> <CAC4> <8A93> <CAC5> <CAC5> <901D> <CAC6> <CAC6> <52BF> <CAC7> <CAC7> <662F> <CAC8> <CAC8> <55DC> <CAC9> <CAC9> <566C> <CACA> <CACA> <9002> <CACB> <CACB> <4ED5> <CACC> <CACC> <4F8D> <CACD> <CACD> <91CA> <CACE> <CACE> <9970> <CACF> <CACF> <6C0F> <CAD0> <CAD0> <5E02> <CAD1> <CAD1> <6043> <CAD2> <CAD2> <5BA4> <CAD3> <CAD3> <89C6> <CAD4> <CAD4> <8BD5> <CAD5> <CAD5> <6536> <CAD6> <CAD6> <624B> <CAD7> <CAD7> <9996> <CAD8> <CAD8> <5B88> <CAD9> <CAD9> <5BFF> <CADA> <CADA> <6388> <CADB> <CADB> <552E> <CADC> <CADC> <53D7> <CADD> <CADD> <7626> <CADE> <CADE> <517D> <CADF> <CADF> <852C> <CAE0> <CAE0> <67A2> <CAE1> <CAE1> <68B3> <CAE2> <CAE2> <6B8A> <CAE3> <CAE3> <6292> <CAE4> <CAE4> <8F93> <CAE5> <CAE5> <53D4> <CAE6> <CAE6> <8212> <CAE7> <CAE7> <6DD1> <CAE8> <CAE8> <758F> <CAE9> <CAE9> <4E66> <CAEA> <CAEA> <8D4E> <CAEB> <CAEB> <5B70> <CAEC> <CAEC> <719F> <CAED> <CAED> <85AF> <CAEE> <CAEE> <6691> <CAEF> <CAEF> <66D9> <CAF0> <CAF0> <7F72> <CAF1> <CAF1> <8700> <CAF2> <CAF2> <9ECD> <CAF3> <CAF3> <9F20> <CAF4> <CAF4> <5C5E> <CAF5> <CAF5> <672F> <CAF6> <CAF6> <8FF0> <CAF7> <CAF7> <6811> <CAF8> <CAF8> <675F> <CAF9> <CAF9> <620D> <CAFA> <CAFA> <7AD6> <CAFB> <CAFB> <5885> <CAFC> <CAFC> <5EB6> <CAFD> <CAFD> <6570> <CAFE> <CAFE> <6F31> <CBA1> <CBA1> <6055> <CBA2> <CBA2> <5237> <CBA3> <CBA3> <800D> <CBA4> <CBA4> <6454> <CBA5> <CBA5> <8870> <CBA6> <CBA6> <7529> <CBA7> <CBA7> <5E05> <CBA8> <CBA8> <6813> <CBA9> <CBA9> <62F4> <CBAA> <CBAA> <971C> <CBAB> <CBAB> <53CC> <CBAC> <CBAC> <723D> <CBAD> <CBAD> <8C01> endbfrange 100 beginbfrange <CBAE> <CBAE> <6C34> <CBAF> <CBAF> <7761> <CBB0> <CBB0> <7A0E> <CBB1> <CBB1> <542E> <CBB2> <CBB2> <77AC> <CBB3> <CBB3> <987A> <CBB4> <CBB4> <821C> <CBB5> <CBB5> <8BF4> <CBB6> <CBB6> <7855> <CBB7> <CBB7> <6714> <CBB8> <CBB8> <70C1> <CBB9> <CBB9> <65AF> <CBBA> <CBBA> <6495> <CBBB> <CBBB> <5636> <CBBC> <CBBC> <601D> <CBBD> <CBBD> <79C1> <CBBE> <CBBE> <53F8> <CBBF> <CBBF> <4E1D> <CBC0> <CBC0> <6B7B> <CBC1> <CBC1> <8086> <CBC2> <CBC2> <5BFA> <CBC3> <CBC3> <55E3> <CBC4> <CBC4> <56DB> <CBC5> <CBC5> <4F3A> <CBC6> <CBC6> <4F3C> <CBC7> <CBC7> <9972> <CBC8> <CBC8> <5DF3> <CBC9> <CBC9> <677E> <CBCA> <CBCA> <8038> <CBCB> <CBCB> <6002> <CBCC> <CBCC> <9882> <CBCD> <CBCD> <9001> <CBCE> <CBCE> <5B8B> <CBCF> <CBCF> <8BBC> <CBD0> <CBD0> <8BF5> <CBD1> <CBD1> <641C> <CBD2> <CBD2> <8258> <CBD3> <CBD3> <64DE> <CBD4> <CBD4> <55FD> <CBD5> <CBD5> <82CF> <CBD6> <CBD6> <9165> <CBD7> <CBD7> <4FD7> <CBD8> <CBD8> <7D20> <CBD9> <CBD9> <901F> <CBDA> <CBDA> <7C9F> <CBDB> <CBDB> <50F3> <CBDC> <CBDC> <5851> <CBDD> <CBDD> <6EAF> <CBDE> <CBDE> <5BBF> <CBDF> <CBDF> <8BC9> <CBE0> <CBE0> <8083> <CBE1> <CBE1> <9178> <CBE2> <CBE2> <849C> <CBE3> <CBE3> <7B97> <CBE4> <CBE4> <867D> <CBE5> <CBE5> <968B> <CBE6> <CBE6> <968F> <CBE7> <CBE7> <7EE5> <CBE8> <CBE8> <9AD3> <CBE9> <CBE9> <788E> <CBEA> <CBEA> <5C81> <CBEB> <CBEB> <7A57> <CBEC> <CBEC> <9042> <CBED> <CBED> <96A7> <CBEE> <CBEE> <795F> <CBEF> <CBEF> <5B59> <CBF0> <CBF0> <635F> <CBF1> <CBF1> <7B0B> <CBF2> <CBF2> <84D1> <CBF3> <CBF3> <68AD> <CBF4> <CBF4> <5506> <CBF5> <CBF5> <7F29> <CBF6> <CBF6> <7410> <CBF7> <CBF7> <7D22> <CBF8> <CBF8> <9501> <CBF9> <CBF9> <6240> <CBFA> <CBFA> <584C> <CBFB> <CBFB> <4ED6> <CBFC> <CBFC> <5B83> <CBFD> <CBFD> <5979> <CBFE> <CBFE> <5854> <CCA1> <CCA1> <736D> <CCA2> <CCA2> <631E> <CCA3> <CCA3> <8E4B> <CCA4> <CCA4> <8E0F> <CCA5> <CCA5> <80CE> <CCA6> <CCA6> <82D4> <CCA7> <CCA7> <62AC> <CCA8> <CCA8> <53F0> <CCA9> <CCA9> <6CF0> <CCAA> <CCAA> <915E> <CCAB> <CCAB> <592A> <CCAC> <CCAC> <6001> <CCAD> <CCAD> <6C70> <CCAE> <CCAE> <574D> <CCAF> <CCAF> <644A> <CCB0> <CCB0> <8D2A> <CCB1> <CCB1> <762B> <CCB2> <CCB2> <6EE9> <CCB3> <CCB3> <575B> endbfrange 100 beginbfrange <CCB4> <CCB4> <6A80> <CCB5> <CCB5> <75F0> <CCB6> <CCB6> <6F6D> <CCB7> <CCB7> <8C2D> <CCB8> <CCB8> <8C08> <CCB9> <CCB9> <5766> <CCBA> <CCBA> <6BEF> <CCBB> <CCBB> <8892> <CCBC> <CCBC> <78B3> <CCBD> <CCBD> <63A2> <CCBE> <CCBE> <53F9> <CCBF> <CCBF> <70AD> <CCC0> <CCC0> <6C64> <CCC1> <CCC1> <5858> <CCC2> <CCC2> <642A> <CCC3> <CCC3> <5802> <CCC4> <CCC4> <68E0> <CCC5> <CCC5> <819B> <CCC6> <CCC6> <5510> <CCC7> <CCC7> <7CD6> <CCC8> <CCC8> <5018> <CCC9> <CCC9> <8EBA> <CCCA> <CCCA> <6DCC> <CCCB> <CCCB> <8D9F> <CCCC> <CCCC> <70EB> <CCCD> <CCCD> <638F> <CCCE> <CCCE> <6D9B> <CCCF> <CCCF> <6ED4> <CCD0> <CCD0> <7EE6> <CCD1> <CCD1> <8404> <CCD2> <CCD2> <6843> <CCD3> <CCD3> <9003> <CCD4> <CCD4> <6DD8> <CCD5> <CCD5> <9676> <CCD6> <CCD6> <8BA8> <CCD7> <CCD7> <5957> <CCD8> <CCD8> <7279> <CCD9> <CCD9> <85E4> <CCDA> <CCDA> <817E> <CCDB> <CCDB> <75BC> <CCDC> <CCDC> <8A8A> <CCDD> <CCDD> <68AF> <CCDE> <CCDE> <5254> <CCDF> <CCDF> <8E22> <CCE0> <CCE0> <9511> <CCE1> <CCE1> <63D0> <CCE2> <CCE2> <9898> <CCE3> <CCE3> <8E44> <CCE4> <CCE4> <557C> <CCE5> <CCE5> <4F53> <CCE6> <CCE6> <66FF> <CCE7> <CCE7> <568F> <CCE8> <CCE8> <60D5> <CCE9> <CCE9> <6D95> <CCEA> <CCEA> <5243> <CCEB> <CCEB> <5C49> <CCEC> <CCEC> <5929> <CCED> <CCED> <6DFB> <CCEE> <CCEE> <586B> <CCEF> <CCEF> <7530> <CCF0> <CCF0> <751C> <CCF1> <CCF1> <606C> <CCF2> <CCF2> <8214> <CCF3> <CCF3> <8146> <CCF4> <CCF4> <6311> <CCF5> <CCF5> <6761> <CCF6> <CCF6> <8FE2> <CCF7> <CCF7> <773A> <CCF8> <CCF8> <8DF3> <CCF9> <CCF9> <8D34> <CCFA> <CCFA> <94C1> <CCFB> <CCFB> <5E16> <CCFC> <CCFC> <5385> <CCFD> <CCFD> <542C> <CCFE> <CCFE> <70C3> <CDA1> <CDA1> <6C40> <CDA2> <CDA2> <5EF7> <CDA3> <CDA3> <505C> <CDA4> <CDA4> <4EAD> <CDA5> <CDA5> <5EAD> <CDA6> <CDA6> <633A> <CDA7> <CDA7> <8247> <CDA8> <CDA8> <901A> <CDA9> <CDA9> <6850> <CDAA> <CDAA> <916E> <CDAB> <CDAB> <77B3> <CDAC> <CDAC> <540C> <CDAD> <CDAD> <94DC> <CDAE> <CDAE> <5F64> <CDAF> <CDAF> <7AE5> <CDB0> <CDB0> <6876> <CDB1> <CDB1> <6345> <CDB2> <CDB2> <7B52> <CDB3> <CDB3> <7EDF> <CDB4> <CDB4> <75DB> <CDB5> <CDB5> <5077> <CDB6> <CDB6> <6295> <CDB7> <CDB7> <5934> <CDB8> <CDB8> <900F> <CDB9> <CDB9> <51F8> endbfrange 100 beginbfrange <CDBA> <CDBA> <79C3> <CDBB> <CDBB> <7A81> <CDBC> <CDBC> <56FE> <CDBD> <CDBD> <5F92> <CDBE> <CDBE> <9014> <CDBF> <CDBF> <6D82> <CDC0> <CDC0> <5C60> <CDC1> <CDC1> <571F> <CDC2> <CDC2> <5410> <CDC3> <CDC3> <5154> <CDC4> <CDC4> <6E4D> <CDC5> <CDC5> <56E2> <CDC6> <CDC6> <63A8> <CDC7> <CDC7> <9893> <CDC8> <CDC8> <817F> <CDC9> <CDC9> <8715> <CDCA> <CDCA> <892A> <CDCB> <CDCB> <9000> <CDCC> <CDCC> <541E> <CDCD> <CDCD> <5C6F> <CDCE> <CDCE> <81C0> <CDCF> <CDCF> <62D6> <CDD0> <CDD0> <6258> <CDD1> <CDD1> <8131> <CDD2> <CDD2> <9E35> <CDD3> <CDD3> <9640> <CDD4> <CDD4> <9A6E> <CDD5> <CDD5> <9A7C> <CDD6> <CDD6> <692D> <CDD7> <CDD7> <59A5> <CDD8> <CDD8> <62D3> <CDD9> <CDD9> <553E> <CDDA> <CDDA> <6316> <CDDB> <CDDB> <54C7> <CDDC> <CDDC> <86D9> <CDDD> <CDDD> <6D3C> <CDDE> <CDDE> <5A03> <CDDF> <CDDF> <74E6> <CDE0> <CDE0> <889C> <CDE1> <CDE1> <6B6A> <CDE2> <CDE2> <5916> <CDE3> <CDE3> <8C4C> <CDE4> <CDE4> <5F2F> <CDE5> <CDE5> <6E7E> <CDE6> <CDE6> <73A9> <CDE7> <CDE7> <987D> <CDE8> <CDE8> <4E38> <CDE9> <CDE9> <70F7> <CDEA> <CDEA> <5B8C> <CDEB> <CDEB> <7897> <CDEC> <CDEC> <633D> <CDED> <CDED> <665A> <CDEE> <CDEE> <7696> <CDEF> <CDEF> <60CB> <CDF0> <CDF0> <5B9B> <CDF1> <CDF1> <5A49> <CDF2> <CDF2> <4E07> <CDF3> <CDF3> <8155> <CDF4> <CDF4> <6C6A> <CDF5> <CDF5> <738B> <CDF6> <CDF6> <4EA1> <CDF7> <CDF7> <6789> <CDF8> <CDF8> <7F51> <CDF9> <CDF9> <5F80> <CDFA> <CDFA> <65FA> <CDFB> <CDFB> <671B> <CDFC> <CDFC> <5FD8> <CDFD> <CDFD> <5984> <CDFE> <CDFE> <5A01> <CEA1> <CEA1> <5DCD> <CEA2> <CEA2> <5FAE> <CEA3> <CEA3> <5371> <CEA4> <CEA4> <97E6> <CEA5> <CEA5> <8FDD> <CEA6> <CEA6> <6845> <CEA7> <CEA7> <56F4> <CEA8> <CEA8> <552F> <CEA9> <CEA9> <60DF> <CEAA> <CEAA> <4E3A> <CEAB> <CEAB> <6F4D> <CEAC> <CEAC> <7EF4> <CEAD> <CEAD> <82C7> <CEAE> <CEAE> <840E> <CEAF> <CEAF> <59D4> <CEB0> <CEB0> <4F1F> <CEB1> <CEB1> <4F2A> <CEB2> <CEB2> <5C3E> <CEB3> <CEB3> <7EAC> <CEB4> <CEB4> <672A> <CEB5> <CEB5> <851A> <CEB6> <CEB6> <5473> <CEB7> <CEB7> <754F> <CEB8> <CEB8> <80C3> <CEB9> <CEB9> <5582> <CEBA> <CEBA> <9B4F> <CEBB> <CEBB> <4F4D> <CEBC> <CEBC> <6E2D> <CEBD> <CEBD> <8C13> <CEBE> <CEBE> <5C09> <CEBF> <CEBF> <6170> endbfrange 100 beginbfrange <CEC0> <CEC0> <536B> <CEC1> <CEC1> <761F> <CEC2> <CEC2> <6E29> <CEC3> <CEC3> <868A> <CEC4> <CEC4> <6587> <CEC5> <CEC5> <95FB> <CEC6> <CEC6> <7EB9> <CEC7> <CEC7> <543B> <CEC8> <CEC8> <7A33> <CEC9> <CEC9> <7D0A> <CECA> <CECA> <95EE> <CECB> <CECB> <55E1> <CECC> <CECC> <7FC1> <CECD> <CECD> <74EE> <CECE> <CECE> <631D> <CECF> <CECF> <8717> <CED0> <CED0> <6DA1> <CED1> <CED1> <7A9D> <CED2> <CED2> <6211> <CED3> <CED3> <65A1> <CED4> <CED4> <5367> <CED5> <CED5> <63E1> <CED6> <CED6> <6C83> <CED7> <CED7> <5DEB> <CED8> <CED8> <545C> <CED9> <CED9> <94A8> <CEDA> <CEDA> <4E4C> <CEDB> <CEDB> <6C61> <CEDC> <CEDC> <8BEC> <CEDD> <CEDD> <5C4B> <CEDE> <CEDE> <65E0> <CEDF> <CEDF> <829C> <CEE0> <CEE0> <68A7> <CEE1> <CEE1> <543E> <CEE2> <CEE2> <5434> <CEE3> <CEE3> <6BCB> <CEE4> <CEE4> <6B66> <CEE5> <CEE5> <4E94> <CEE6> <CEE6> <6342> <CEE7> <CEE7> <5348> <CEE8> <CEE8> <821E> <CEE9> <CEE9> <4F0D> <CEEA> <CEEA> <4FAE> <CEEB> <CEEB> <575E> <CEEC> <CEEC> <620A> <CEED> <CEED> <96FE> <CEEE> <CEEE> <6664> <CEEF> <CEEF> <7269> <CEF0> <CEF0> <52FF> <CEF1> <CEF1> <52A1> <CEF2> <CEF2> <609F> <CEF3> <CEF3> <8BEF> <CEF4> <CEF4> <6614> <CEF5> <CEF5> <7199> <CEF6> <CEF6> <6790> <CEF7> <CEF7> <897F> <CEF8> <CEF8> <7852> <CEF9> <CEF9> <77FD> <CEFA> <CEFA> <6670> <CEFB> <CEFB> <563B> <CEFC> <CEFC> <5438> <CEFD> <CEFD> <9521> <CEFE> <CEFE> <727A> <CFA1> <CFA1> <7A00> <CFA2> <CFA2> <606F> <CFA3> <CFA3> <5E0C> <CFA4> <CFA4> <6089> <CFA5> <CFA5> <819D> <CFA6> <CFA6> <5915> <CFA7> <CFA7> <60DC> <CFA8> <CFA8> <7184> <CFA9> <CFA9> <70EF> <CFAA> <CFAA> <6EAA> <CFAB> <CFAB> <6C50> <CFAC> <CFAC> <7280> <CFAD> <CFAD> <6A84> <CFAE> <CFAE> <88AD> <CFAF> <CFAF> <5E2D> <CFB0> <CFB0> <4E60> <CFB1> <CFB1> <5AB3> <CFB2> <CFB2> <559C> <CFB3> <CFB3> <94E3> <CFB4> <CFB4> <6D17> <CFB5> <CFB5> <7CFB> <CFB6> <CFB6> <9699> <CFB7> <CFB7> <620F> <CFB8> <CFB8> <7EC6> <CFB9> <CFB9> <778E> <CFBA> <CFBA> <867E> <CFBB> <CFBB> <5323> <CFBC> <CFBC> <971E> <CFBD> <CFBD> <8F96> <CFBE> <CFBE> <6687> <CFBF> <CFBF> <5CE1> <CFC0> <CFC0> <4FA0> <CFC1> <CFC1> <72ED> <CFC2> <CFC2> <4E0B> <CFC3> <CFC3> <53A6> <CFC4> <CFC4> <590F> <CFC5> <CFC5> <5413> endbfrange 100 beginbfrange <CFC6> <CFC6> <6380> <CFC7> <CFC7> <9528> <CFC8> <CFC8> <5148> <CFC9> <CFC9> <4ED9> <CFCA> <CFCA> <9C9C> <CFCB> <CFCB> <7EA4> <CFCC> <CFCC> <54B8> <CFCD> <CFCD> <8D24> <CFCE> <CFCE> <8854> <CFCF> <CFCF> <8237> <CFD0> <CFD0> <95F2> <CFD1> <CFD1> <6D8E> <CFD2> <CFD2> <5F26> <CFD3> <CFD3> <5ACC> <CFD4> <CFD4> <663E> <CFD5> <CFD5> <9669> <CFD6> <CFD6> <73B0> <CFD7> <CFD7> <732E> <CFD8> <CFD8> <53BF> <CFD9> <CFD9> <817A> <CFDA> <CFDA> <9985> <CFDB> <CFDB> <7FA1> <CFDC> <CFDC> <5BAA> <CFDD> <CFDD> <9677> <CFDE> <CFDE> <9650> <CFDF> <CFDF> <7EBF> <CFE0> <CFE0> <76F8> <CFE1> <CFE1> <53A2> <CFE2> <CFE2> <9576> <CFE3> <CFE3> <9999> <CFE4> <CFE4> <7BB1> <CFE5> <CFE5> <8944> <CFE6> <CFE6> <6E58> <CFE7> <CFE7> <4E61> <CFE8> <CFE8> <7FD4> <CFE9> <CFE9> <7965> <CFEA> <CFEA> <8BE6> <CFEB> <CFEB> <60F3> <CFEC> <CFEC> <54CD> <CFED> <CFED> <4EAB> <CFEE> <CFEE> <9879> <CFEF> <CFEF> <5DF7> <CFF0> <CFF0> <6A61> <CFF1> <CFF1> <50CF> <CFF2> <CFF2> <5411> <CFF3> <CFF3> <8C61> <CFF4> <CFF4> <8427> <CFF5> <CFF5> <785D> <CFF6> <CFF6> <9704> <CFF7> <CFF7> <524A> <CFF8> <CFF8> <54EE> <CFF9> <CFF9> <56A3> <CFFA> <CFFA> <9500> <CFFB> <CFFB> <6D88> <CFFC> <CFFC> <5BB5> <CFFD> <CFFD> <6DC6> <CFFE> <CFFE> <6653> <D0A1> <D0A1> <5C0F> <D0A2> <D0A2> <5B5D> <D0A3> <D0A3> <6821> <D0A4> <D0A4> <8096> <D0A5> <D0A5> <5578> <D0A6> <D0A6> <7B11> <D0A7> <D0A7> <6548> <D0A8> <D0A8> <6954> <D0A9> <D0A9> <4E9B> <D0AA> <D0AA> <6B47> <D0AB> <D0AB> <874E> <D0AC> <D0AC> <978B> <D0AD> <D0AD> <534F> <D0AE> <D0AE> <631F> <D0AF> <D0AF> <643A> <D0B0> <D0B0> <90AA> <D0B1> <D0B1> <659C> <D0B2> <D0B2> <80C1> <D0B3> <D0B3> <8C10> <D0B4> <D0B4> <5199> <D0B5> <D0B5> <68B0> <D0B6> <D0B6> <5378> <D0B7> <D0B7> <87F9> <D0B8> <D0B8> <61C8> <D0B9> <D0B9> <6CC4> <D0BA> <D0BA> <6CFB> <D0BB> <D0BB> <8C22> <D0BC> <D0BC> <5C51> <D0BD> <D0BD> <85AA> <D0BE> <D0BE> <82AF> <D0BF> <D0BF> <950C> <D0C0> <D0C0> <6B23> <D0C1> <D0C1> <8F9B> <D0C2> <D0C2> <65B0> <D0C3> <D0C3> <5FFB> <D0C4> <D0C4> <5FC3> <D0C5> <D0C5> <4FE1> <D0C6> <D0C6> <8845> <D0C7> <D0C7> <661F> <D0C8> <D0C8> <8165> <D0C9> <D0C9> <7329> <D0CA> <D0CA> <60FA> <D0CB> <D0CB> <5174> endbfrange 100 beginbfrange <D0CC> <D0CC> <5211> <D0CD> <D0CD> <578B> <D0CE> <D0CE> <5F62> <D0CF> <D0CF> <90A2> <D0D0> <D0D0> <884C> <D0D1> <D0D1> <9192> <D0D2> <D0D2> <5E78> <D0D3> <D0D3> <674F> <D0D4> <D0D4> <6027> <D0D5> <D0D5> <59D3> <D0D6> <D0D6> <5144> <D0D7> <D0D7> <51F6> <D0D8> <D0D8> <80F8> <D0D9> <D0D9> <5308> <D0DA> <D0DA> <6C79> <D0DB> <D0DB> <96C4> <D0DC> <D0DC> <718A> <D0DD> <D0DD> <4F11> <D0DE> <D0DE> <4FEE> <D0DF> <D0DF> <7F9E> <D0E0> <D0E0> <673D> <D0E1> <D0E1> <55C5> <D0E2> <D0E2> <9508> <D0E3> <D0E3> <79C0> <D0E4> <D0E4> <8896> <D0E5> <D0E5> <7EE3> <D0E6> <D0E6> <589F> <D0E7> <D0E7> <620C> <D0E8> <D0E8> <9700> <D0E9> <D0E9> <865A> <D0EA> <D0EA> <5618> <D0EB> <D0EB> <987B> <D0EC> <D0EC> <5F90> <D0ED> <D0ED> <8BB8> <D0EE> <D0EE> <84C4> <D0EF> <D0EF> <9157> <D0F0> <D0F0> <53D9> <D0F1> <D0F1> <65ED> <D0F2> <D0F2> <5E8F> <D0F3> <D0F3> <755C> <D0F4> <D0F4> <6064> <D0F5> <D0F5> <7D6E> <D0F6> <D0F6> <5A7F> <D0F7> <D0F7> <7EEA> <D0F8> <D0F8> <7EED> <D0F9> <D0F9> <8F69> <D0FA> <D0FA> <55A7> <D0FB> <D0FB> <5BA3> <D0FC> <D0FC> <60AC> <D0FD> <D0FD> <65CB> <D0FE> <D0FE> <7384> <D1A1> <D1A1> <9009> <D1A2> <D1A2> <7663> <D1A3> <D1A3> <7729> <D1A4> <D1A4> <7EDA> <D1A5> <D1A5> <9774> <D1A6> <D1A6> <859B> <D1A7> <D1A7> <5B66> <D1A8> <D1A8> <7A74> <D1A9> <D1A9> <96EA> <D1AA> <D1AA> <8840> <D1AB> <D1AB> <52CB> <D1AC> <D1AC> <718F> <D1AD> <D1AD> <5FAA> <D1AE> <D1AE> <65EC> <D1AF> <D1AF> <8BE2> <D1B0> <D1B0> <5BFB> <D1B1> <D1B1> <9A6F> <D1B2> <D1B2> <5DE1> <D1B3> <D1B3> <6B89> <D1B4> <D1B4> <6C5B> <D1B5> <D1B5> <8BAD> <D1B6> <D1B6> <8BAF> <D1B7> <D1B7> <900A> <D1B8> <D1B8> <8FC5> <D1B9> <D1B9> <538B> <D1BA> <D1BA> <62BC> <D1BB> <D1BB> <9E26> <D1BC> <D1BC> <9E2D> <D1BD> <D1BD> <5440> <D1BE> <D1BE> <4E2B> <D1BF> <D1BF> <82BD> <D1C0> <D1C0> <7259> <D1C1> <D1C1> <869C> <D1C2> <D1C2> <5D16> <D1C3> <D1C3> <8859> <D1C4> <D1C4> <6DAF> <D1C5> <D1C5> <96C5> <D1C6> <D1C6> <54D1> <D1C7> <D1C7> <4E9A> <D1C8> <D1C8> <8BB6> <D1C9> <D1C9> <7109> <D1CA> <D1CA> <54BD> <D1CB> <D1CB> <9609> <D1CC> <D1CC> <70DF> <D1CD> <D1CD> <6DF9> <D1CE> <D1CE> <76D0> <D1CF> <D1CF> <4E25> <D1D0> <D1D0> <7814> <D1D1> <D1D1> <8712> endbfrange 100 beginbfrange <D1D2> <D1D2> <5CA9> <D1D3> <D1D3> <5EF6> <D1D4> <D1D4> <8A00> <D1D5> <D1D5> <989C> <D1D6> <D1D6> <960E> <D1D7> <D1D7> <708E> <D1D8> <D1D8> <6CBF> <D1D9> <D1D9> <5944> <D1DA> <D1DA> <63A9> <D1DB> <D1DB> <773C> <D1DC> <D1DC> <884D> <D1DD> <D1DD> <6F14> <D1DE> <D1DE> <8273> <D1DF> <D1DF> <5830> <D1E0> <D1E0> <71D5> <D1E1> <D1E1> <538C> <D1E2> <D1E2> <781A> <D1E3> <D1E3> <96C1> <D1E4> <D1E4> <5501> <D1E5> <D1E5> <5F66> <D1E6> <D1E6> <7130> <D1E7> <D1E7> <5BB4> <D1E8> <D1E8> <8C1A> <D1E9> <D1E9> <9A8C> <D1EA> <D1EA> <6B83> <D1EB> <D1EB> <592E> <D1EC> <D1EC> <9E2F> <D1ED> <D1ED> <79E7> <D1EE> <D1EE> <6768> <D1EF> <D1EF> <626C> <D1F0> <D1F0> <4F6F> <D1F1> <D1F1> <75A1> <D1F2> <D1F2> <7F8A> <D1F3> <D1F3> <6D0B> <D1F4> <D1F4> <9633> <D1F5> <D1F5> <6C27> <D1F6> <D1F6> <4EF0> <D1F7> <D1F7> <75D2> <D1F8> <D1F8> <517B> <D1F9> <D1F9> <6837> <D1FA> <D1FA> <6F3E> <D1FB> <D1FB> <9080> <D1FC> <D1FC> <8170> <D1FD> <D1FD> <5996> <D1FE> <D1FE> <7476> <D2A1> <D2A1> <6447> <D2A2> <D2A2> <5C27> <D2A3> <D2A3> <9065> <D2A4> <D2A4> <7A91> <D2A5> <D2A5> <8C23> <D2A6> <D2A6> <59DA> <D2A7> <D2A7> <54AC> <D2A8> <D2A8> <8200> <D2A9> <D2A9> <836F> <D2AA> <D2AA> <8981> <D2AB> <D2AB> <8000> <D2AC> <D2AC> <6930> <D2AD> <D2AD> <564E> <D2AE> <D2AE> <8036> <D2AF> <D2AF> <7237> <D2B0> <D2B0> <91CE> <D2B1> <D2B1> <51B6> <D2B2> <D2B2> <4E5F> <D2B3> <D2B3> <9875> <D2B4> <D2B4> <6396> <D2B5> <D2B5> <4E1A> <D2B6> <D2B6> <53F6> <D2B7> <D2B7> <66F3> <D2B8> <D2B8> <814B> <D2B9> <D2B9> <591C> <D2BA> <D2BA> <6DB2> <D2BB> <D2BB> <4E00> <D2BC> <D2BC> <58F9> <D2BD> <D2BD> <533B> <D2BE> <D2BE> <63D6> <D2BF> <D2BF> <94F1> <D2C0> <D2C0> <4F9D> <D2C1> <D2C1> <4F0A> <D2C2> <D2C2> <8863> <D2C3> <D2C3> <9890> <D2C4> <D2C4> <5937> <D2C5> <D2C5> <9057> <D2C6> <D2C6> <79FB> <D2C7> <D2C7> <4EEA> <D2C8> <D2C8> <80F0> <D2C9> <D2C9> <7591> <D2CA> <D2CA> <6C82> <D2CB> <D2CB> <5B9C> <D2CC> <D2CC> <59E8> <D2CD> <D2CD> <5F5D> <D2CE> <D2CE> <6905> <D2CF> <D2CF> <8681> <D2D0> <D2D0> <501A> <D2D1> <D2D1> <5DF2> <D2D2> <D2D2> <4E59> <D2D3> <D2D3> <77E3> <D2D4> <D2D4> <4EE5> <D2D5> <D2D5> <827A> <D2D6> <D2D6> <6291> <D2D7> <D2D7> <6613> endbfrange 100 beginbfrange <D2D8> <D2D8> <9091> <D2D9> <D2D9> <5C79> <D2DA> <D2DA> <4EBF> <D2DB> <D2DB> <5F79> <D2DC> <D2DC> <81C6> <D2DD> <D2DD> <9038> <D2DE> <D2DE> <8084> <D2DF> <D2DF> <75AB> <D2E0> <D2E0> <4EA6> <D2E1> <D2E1> <88D4> <D2E2> <D2E2> <610F> <D2E3> <D2E3> <6BC5> <D2E4> <D2E4> <5FC6> <D2E5> <D2E5> <4E49> <D2E6> <D2E6> <76CA> <D2E7> <D2E7> <6EA2> <D2E8> <D2E8> <8BE3> <D2E9> <D2E9> <8BAE> <D2EA> <D2EA> <8C0A> <D2EB> <D2EB> <8BD1> <D2EC> <D2EC> <5F02> <D2ED> <D2ED> <7FFC> <D2EE> <D2EE> <7FCC> <D2EF> <D2EF> <7ECE> <D2F0> <D2F0> <8335> <D2F1> <D2F1> <836B> <D2F2> <D2F2> <56E0> <D2F3> <D2F3> <6BB7> <D2F4> <D2F4> <97F3> <D2F5> <D2F5> <9634> <D2F6> <D2F6> <59FB> <D2F7> <D2F7> <541F> <D2F8> <D2F8> <94F6> <D2F9> <D2F9> <6DEB> <D2FA> <D2FA> <5BC5> <D2FB> <D2FB> <996E> <D2FC> <D2FC> <5C39> <D2FD> <D2FD> <5F15> <D2FE> <D2FE> <9690> <D3A1> <D3A1> <5370> <D3A2> <D3A2> <82F1> <D3A3> <D3A3> <6A31> <D3A4> <D3A4> <5A74> <D3A5> <D3A5> <9E70> <D3A6> <D3A6> <5E94> <D3A7> <D3A7> <7F28> <D3A8> <D3A8> <83B9> <D3A9> <D3AA> <8424> <D3AB> <D3AB> <8367> <D3AC> <D3AC> <8747> <D3AD> <D3AD> <8FCE> <D3AE> <D3AE> <8D62> <D3AF> <D3AF> <76C8> <D3B0> <D3B0> <5F71> <D3B1> <D3B1> <9896> <D3B2> <D3B2> <786C> <D3B3> <D3B3> <6620> <D3B4> <D3B4> <54DF> <D3B5> <D3B5> <62E5> <D3B6> <D3B6> <4F63> <D3B7> <D3B7> <81C3> <D3B8> <D3B8> <75C8> <D3B9> <D3B9> <5EB8> <D3BA> <D3BA> <96CD> <D3BB> <D3BB> <8E0A> <D3BC> <D3BC> <86F9> <D3BD> <D3BD> <548F> <D3BE> <D3BE> <6CF3> <D3BF> <D3BF> <6D8C> <D3C0> <D3C0> <6C38> <D3C1> <D3C1> <607F> <D3C2> <D3C2> <52C7> <D3C3> <D3C3> <7528> <D3C4> <D3C4> <5E7D> <D3C5> <D3C5> <4F18> <D3C6> <D3C6> <60A0> <D3C7> <D3C7> <5FE7> <D3C8> <D3C8> <5C24> <D3C9> <D3C9> <7531> <D3CA> <D3CA> <90AE> <D3CB> <D3CB> <94C0> <D3CC> <D3CC> <72B9> <D3CD> <D3CD> <6CB9> <D3CE> <D3CE> <6E38> <D3CF> <D3CF> <9149> <D3D0> <D3D0> <6709> <D3D1> <D3D1> <53CB> <D3D2> <D3D2> <53F3> <D3D3> <D3D3> <4F51> <D3D4> <D3D4> <91C9> <D3D5> <D3D5> <8BF1> <D3D6> <D3D6> <53C8> <D3D7> <D3D7> <5E7C> <D3D8> <D3D8> <8FC2> <D3D9> <D3D9> <6DE4> <D3DA> <D3DA> <4E8E> <D3DB> <D3DB> <76C2> <D3DC> <D3DC> <6986> <D3DD> <D3DD> <865E> <D3DE> <D3DE> <611A> endbfrange 100 beginbfrange <D3DF> <D3DF> <8206> <D3E0> <D3E0> <4F59> <D3E1> <D3E1> <4FDE> <D3E2> <D3E2> <903E> <D3E3> <D3E3> <9C7C> <D3E4> <D3E4> <6109> <D3E5> <D3E5> <6E1D> <D3E6> <D3E6> <6E14> <D3E7> <D3E7> <9685> <D3E8> <D3E8> <4E88> <D3E9> <D3E9> <5A31> <D3EA> <D3EA> <96E8> <D3EB> <D3EB> <4E0E> <D3EC> <D3EC> <5C7F> <D3ED> <D3ED> <79B9> <D3EE> <D3EE> <5B87> <D3EF> <D3EF> <8BED> <D3F0> <D3F0> <7FBD> <D3F1> <D3F1> <7389> <D3F2> <D3F2> <57DF> <D3F3> <D3F3> <828B> <D3F4> <D3F4> <90C1> <D3F5> <D3F5> <5401> <D3F6> <D3F6> <9047> <D3F7> <D3F7> <55BB> <D3F8> <D3F8> <5CEA> <D3F9> <D3F9> <5FA1> <D3FA> <D3FA> <6108> <D3FB> <D3FB> <6B32> <D3FC> <D3FC> <72F1> <D3FD> <D3FD> <80B2> <D3FE> <D3FE> <8A89> <D4A1> <D4A1> <6D74> <D4A2> <D4A2> <5BD3> <D4A3> <D4A3> <88D5> <D4A4> <D4A4> <9884> <D4A5> <D4A5> <8C6B> <D4A6> <D4A6> <9A6D> <D4A7> <D4A7> <9E33> <D4A8> <D4A8> <6E0A> <D4A9> <D4A9> <51A4> <D4AA> <D4AA> <5143> <D4AB> <D4AB> <57A3> <D4AC> <D4AC> <8881> <D4AD> <D4AD> <539F> <D4AE> <D4AE> <63F4> <D4AF> <D4AF> <8F95> <D4B0> <D4B0> <56ED> <D4B1> <D4B1> <5458> <D4B2> <D4B2> <5706> <D4B3> <D4B3> <733F> <D4B4> <D4B4> <6E90> <D4B5> <D4B5> <7F18> <D4B6> <D4B6> <8FDC> <D4B7> <D4B7> <82D1> <D4B8> <D4B8> <613F> <D4B9> <D4B9> <6028> <D4BA> <D4BA> <9662> <D4BB> <D4BB> <66F0> <D4BC> <D4BC> <7EA6> <D4BD> <D4BD> <8D8A> <D4BE> <D4BE> <8DC3> <D4BF> <D4BF> <94A5> <D4C0> <D4C0> <5CB3> <D4C1> <D4C1> <7CA4> <D4C2> <D4C2> <6708> <D4C3> <D4C3> <60A6> <D4C4> <D4C4> <9605> <D4C5> <D4C5> <8018> <D4C6> <D4C6> <4E91> <D4C7> <D4C7> <90E7> <D4C8> <D4C8> <5300> <D4C9> <D4C9> <9668> <D4CA> <D4CA> <5141> <D4CB> <D4CB> <8FD0> <D4CC> <D4CC> <8574> <D4CD> <D4CD> <915D> <D4CE> <D4CE> <6655> <D4CF> <D4CF> <97F5> <D4D0> <D4D0> <5B55> <D4D1> <D4D1> <531D> <D4D2> <D4D2> <7838> <D4D3> <D4D3> <6742> <D4D4> <D4D4> <683D> <D4D5> <D4D5> <54C9> <D4D6> <D4D6> <707E> <D4D7> <D4D7> <5BB0> <D4D8> <D4D8> <8F7D> <D4D9> <D4D9> <518D> <D4DA> <D4DA> <5728> <D4DB> <D4DB> <54B1> <D4DC> <D4DC> <6512> <D4DD> <D4DD> <6682> <D4DE> <D4DE> <8D5E> <D4DF> <D4DF> <8D43> <D4E0> <D4E0> <810F> <D4E1> <D4E1> <846C> <D4E2> <D4E2> <906D> <D4E3> <D4E3> <7CDF> <D4E4> <D4E4> <51FF> endbfrange 100 beginbfrange <D4E5> <D4E5> <85FB> <D4E6> <D4E6> <67A3> <D4E7> <D4E7> <65E9> <D4E8> <D4E8> <6FA1> <D4E9> <D4E9> <86A4> <D4EA> <D4EA> <8E81> <D4EB> <D4EB> <566A> <D4EC> <D4EC> <9020> <D4ED> <D4ED> <7682> <D4EE> <D4EE> <7076> <D4EF> <D4EF> <71E5> <D4F0> <D4F0> <8D23> <D4F1> <D4F1> <62E9> <D4F2> <D4F2> <5219> <D4F3> <D4F3> <6CFD> <D4F4> <D4F4> <8D3C> <D4F5> <D4F5> <600E> <D4F6> <D4F6> <589E> <D4F7> <D4F7> <618E> <D4F8> <D4F8> <66FE> <D4F9> <D4F9> <8D60> <D4FA> <D4FA> <624E> <D4FB> <D4FB> <55B3> <D4FC> <D4FC> <6E23> <D4FD> <D4FD> <672D> <D4FE> <D4FE> <8F67> <D5A1> <D5A1> <94E1> <D5A2> <D5A2> <95F8> <D5A3> <D5A3> <7728> <D5A4> <D5A4> <6805> <D5A5> <D5A5> <69A8> <D5A6> <D5A6> <548B> <D5A7> <D5A7> <4E4D> <D5A8> <D5A8> <70B8> <D5A9> <D5A9> <8BC8> <D5AA> <D5AA> <6458> <D5AB> <D5AB> <658B> <D5AC> <D5AC> <5B85> <D5AD> <D5AD> <7A84> <D5AE> <D5AE> <503A> <D5AF> <D5AF> <5BE8> <D5B0> <D5B0> <77BB> <D5B1> <D5B1> <6BE1> <D5B2> <D5B2> <8A79> <D5B3> <D5B3> <7C98> <D5B4> <D5B4> <6CBE> <D5B5> <D5B5> <76CF> <D5B6> <D5B6> <65A9> <D5B7> <D5B7> <8F97> <D5B8> <D5B8> <5D2D> <D5B9> <D5B9> <5C55> <D5BA> <D5BA> <8638> <D5BB> <D5BB> <6808> <D5BC> <D5BC> <5360> <D5BD> <D5BD> <6218> <D5BE> <D5BE> <7AD9> <D5BF> <D5BF> <6E5B> <D5C0> <D5C0> <7EFD> <D5C1> <D5C1> <6A1F> <D5C2> <D5C2> <7AE0> <D5C3> <D5C3> <5F70> <D5C4> <D5C4> <6F33> <D5C5> <D5C5> <5F20> <D5C6> <D5C6> <638C> <D5C7> <D5C7> <6DA8> <D5C8> <D5C8> <6756> <D5C9> <D5C9> <4E08> <D5CA> <D5CA> <5E10> <D5CB> <D5CB> <8D26> <D5CC> <D5CC> <4ED7> <D5CD> <D5CD> <80C0> <D5CE> <D5CE> <7634> <D5CF> <D5CF> <969C> <D5D0> <D5D0> <62DB> <D5D1> <D5D1> <662D> <D5D2> <D5D2> <627E> <D5D3> <D5D3> <6CBC> <D5D4> <D5D4> <8D75> <D5D5> <D5D5> <7167> <D5D6> <D5D6> <7F69> <D5D7> <D5D7> <5146> <D5D8> <D5D8> <8087> <D5D9> <D5D9> <53EC> <D5DA> <D5DA> <906E> <D5DB> <D5DB> <6298> <D5DC> <D5DC> <54F2> <D5DD> <D5DD> <86F0> <D5DE> <D5DE> <8F99> <D5DF> <D5DF> <8005> <D5E0> <D5E0> <9517> <D5E1> <D5E1> <8517> <D5E2> <D5E2> <8FD9> <D5E3> <D5E3> <6D59> <D5E4> <D5E4> <73CD> <D5E5> <D5E5> <659F> <D5E6> <D5E6> <771F> <D5E7> <D5E7> <7504> <D5E8> <D5E8> <7827> <D5E9> <D5E9> <81FB> <D5EA> <D5EA> <8D1E> endbfrange 100 beginbfrange <D5EB> <D5EB> <9488> <D5EC> <D5EC> <4FA6> <D5ED> <D5ED> <6795> <D5EE> <D5EE> <75B9> <D5EF> <D5EF> <8BCA> <D5F0> <D5F0> <9707> <D5F1> <D5F1> <632F> <D5F2> <D5F2> <9547> <D5F3> <D5F3> <9635> <D5F4> <D5F4> <84B8> <D5F5> <D5F5> <6323> <D5F6> <D5F6> <7741> <D5F7> <D5F7> <5F81> <D5F8> <D5F8> <72F0> <D5F9> <D5F9> <4E89> <D5FA> <D5FA> <6014> <D5FB> <D5FB> <6574> <D5FC> <D5FC> <62EF> <D5FD> <D5FD> <6B63> <D5FE> <D5FE> <653F> <D6A1> <D6A1> <5E27> <D6A2> <D6A2> <75C7> <D6A3> <D6A3> <90D1> <D6A4> <D6A4> <8BC1> <D6A5> <D6A5> <829D> <D6A6> <D6A6> <679D> <D6A7> <D6A7> <652F> <D6A8> <D6A8> <5431> <D6A9> <D6A9> <8718> <D6AA> <D6AA> <77E5> <D6AB> <D6AB> <80A2> <D6AC> <D6AC> <8102> <D6AD> <D6AD> <6C41> <D6AE> <D6AE> <4E4B> <D6AF> <D6AF> <7EC7> <D6B0> <D6B0> <804C> <D6B1> <D6B1> <76F4> <D6B2> <D6B2> <690D> <D6B3> <D6B3> <6B96> <D6B4> <D6B4> <6267> <D6B5> <D6B5> <503C> <D6B6> <D6B6> <4F84> <D6B7> <D6B7> <5740> <D6B8> <D6B8> <6307> <D6B9> <D6B9> <6B62> <D6BA> <D6BA> <8DBE> <D6BB> <D6BB> <53EA> <D6BC> <D6BC> <65E8> <D6BD> <D6BD> <7EB8> <D6BE> <D6BE> <5FD7> <D6BF> <D6BF> <631A> <D6C0> <D6C0> <63B7> <D6C1> <D6C2> <81F3> <D6C3> <D6C3> <7F6E> <D6C4> <D6C4> <5E1C> <D6C5> <D6C5> <5CD9> <D6C6> <D6C6> <5236> <D6C7> <D6C7> <667A> <D6C8> <D6C8> <79E9> <D6C9> <D6C9> <7A1A> <D6CA> <D6CA> <8D28> <D6CB> <D6CB> <7099> <D6CC> <D6CC> <75D4> <D6CD> <D6CD> <6EDE> <D6CE> <D6CE> <6CBB> <D6CF> <D6CF> <7A92> <D6D0> <D6D0> <4E2D> <D6D1> <D6D1> <76C5> <D6D2> <D6D2> <5FE0> <D6D3> <D6D3> <949F> <D6D4> <D6D4> <8877> <D6D5> <D6D5> <7EC8> <D6D6> <D6D6> <79CD> <D6D7> <D6D7> <80BF> <D6D8> <D6D8> <91CD> <D6D9> <D6D9> <4EF2> <D6DA> <D6DA> <4F17> <D6DB> <D6DB> <821F> <D6DC> <D6DC> <5468> <D6DD> <D6DD> <5DDE> <D6DE> <D6DE> <6D32> <D6DF> <D6DF> <8BCC> <D6E0> <D6E0> <7CA5> <D6E1> <D6E1> <8F74> <D6E2> <D6E2> <8098> <D6E3> <D6E3> <5E1A> <D6E4> <D6E4> <5492> <D6E5> <D6E5> <76B1> <D6E6> <D6E6> <5B99> <D6E7> <D6E7> <663C> <D6E8> <D6E8> <9AA4> <D6E9> <D6E9> <73E0> <D6EA> <D6EA> <682A> <D6EB> <D6EB> <86DB> <D6EC> <D6EC> <6731> <D6ED> <D6ED> <732A> <D6EE> <D6EE> <8BF8> <D6EF> <D6EF> <8BDB> <D6F0> <D6F0> <9010> <D6F1> <D6F1> <7AF9> endbfrange 100 beginbfrange <D6F2> <D6F2> <70DB> <D6F3> <D6F3> <716E> <D6F4> <D6F4> <62C4> <D6F5> <D6F5> <77A9> <D6F6> <D6F6> <5631> <D6F7> <D6F7> <4E3B> <D6F8> <D6F8> <8457> <D6F9> <D6F9> <67F1> <D6FA> <D6FA> <52A9> <D6FB> <D6FB> <86C0> <D6FC> <D6FC> <8D2E> <D6FD> <D6FD> <94F8> <D6FE> <D6FE> <7B51> <D7A1> <D7A1> <4F4F> <D7A2> <D7A2> <6CE8> <D7A3> <D7A3> <795D> <D7A4> <D7A4> <9A7B> <D7A5> <D7A5> <6293> <D7A6> <D7A6> <722A> <D7A7> <D7A7> <62FD> <D7A8> <D7A8> <4E13> <D7A9> <D7A9> <7816> <D7AA> <D7AA> <8F6C> <D7AB> <D7AB> <64B0> <D7AC> <D7AC> <8D5A> <D7AD> <D7AD> <7BC6> <D7AE> <D7AE> <6869> <D7AF> <D7AF> <5E84> <D7B0> <D7B0> <88C5> <D7B1> <D7B1> <5986> <D7B2> <D7B2> <649E> <D7B3> <D7B3> <58EE> <D7B4> <D7B4> <72B6> <D7B5> <D7B5> <690E> <D7B6> <D7B6> <9525> <D7B7> <D7B7> <8FFD> <D7B8> <D7B8> <8D58> <D7B9> <D7B9> <5760> <D7BA> <D7BA> <7F00> <D7BB> <D7BB> <8C06> <D7BC> <D7BC> <51C6> <D7BD> <D7BD> <6349> <D7BE> <D7BE> <62D9> <D7BF> <D7BF> <5353> <D7C0> <D7C0> <684C> <D7C1> <D7C1> <7422> <D7C2> <D7C2> <8301> <D7C3> <D7C3> <914C> <D7C4> <D7C4> <5544> <D7C5> <D7C5> <7740> <D7C6> <D7C6> <707C> <D7C7> <D7C7> <6D4A> <D7C8> <D7C8> <5179> <D7C9> <D7C9> <54A8> <D7CA> <D7CA> <8D44> <D7CB> <D7CB> <59FF> <D7CC> <D7CC> <6ECB> <D7CD> <D7CD> <6DC4> <D7CE> <D7CE> <5B5C> <D7CF> <D7CF> <7D2B> <D7D0> <D7D0> <4ED4> <D7D1> <D7D1> <7C7D> <D7D2> <D7D2> <6ED3> <D7D3> <D7D3> <5B50> <D7D4> <D7D4> <81EA> <D7D5> <D7D5> <6E0D> <D7D6> <D7D6> <5B57> <D7D7> <D7D7> <9B03> <D7D8> <D7D8> <68D5> <D7D9> <D7D9> <8E2A> <D7DA> <D7DA> <5B97> <D7DB> <D7DB> <7EFC> <D7DC> <D7DC> <603B> <D7DD> <D7DD> <7EB5> <D7DE> <D7DE> <90B9> <D7DF> <D7DF> <8D70> <D7E0> <D7E0> <594F> <D7E1> <D7E1> <63CD> <D7E2> <D7E2> <79DF> <D7E3> <D7E3> <8DB3> <D7E4> <D7E4> <5352> <D7E5> <D7E5> <65CF> <D7E6> <D7E6> <7956> <D7E7> <D7E7> <8BC5> <D7E8> <D7E8> <963B> <D7E9> <D7E9> <7EC4> <D7EA> <D7EA> <94BB> <D7EB> <D7EB> <7E82> <D7EC> <D7EC> <5634> <D7ED> <D7ED> <9189> <D7EE> <D7EE> <6700> <D7EF> <D7EF> <7F6A> <D7F0> <D7F0> <5C0A> <D7F1> <D7F1> <9075> <D7F2> <D7F2> <6628> <D7F3> <D7F3> <5DE6> <D7F4> <D7F4> <4F50> <D7F5> <D7F5> <67DE> <D7F6> <D7F6> <505A> <D7F7> <D7F7> <4F5C> endbfrange 100 beginbfrange <D7F8> <D7F8> <5750> <D7F9> <D7F9> <5EA7> <D8A1> <D8A1> <4E8D> <D8A2> <D8A2> <4E0C> <D8A3> <D8A3> <5140> <D8A4> <D8A4> <4E10> <D8A5> <D8A5> <5EFF> <D8A6> <D8A6> <5345> <D8A7> <D8A7> <4E15> <D8A8> <D8A8> <4E98> <D8A9> <D8A9> <4E1E> <D8AA> <D8AA> <9B32> <D8AB> <D8AB> <5B6C> <D8AC> <D8AC> <5669> <D8AD> <D8AD> <4E28> <D8AE> <D8AE> <79BA> <D8AF> <D8AF> <4E3F> <D8B0> <D8B0> <5315> <D8B1> <D8B1> <4E47> <D8B2> <D8B2> <592D> <D8B3> <D8B3> <723B> <D8B4> <D8B4> <536E> <D8B5> <D8B5> <6C10> <D8B6> <D8B6> <56DF> <D8B7> <D8B7> <80E4> <D8B8> <D8B8> <9997> <D8B9> <D8B9> <6BD3> <D8BA> <D8BA> <777E> <D8BB> <D8BB> <9F17> <D8BC> <D8BC> <4E36> <D8BD> <D8BD> <4E9F> <D8BE> <D8BE> <9F10> <D8BF> <D8BF> <4E5C> <D8C0> <D8C0> <4E69> <D8C1> <D8C1> <4E93> <D8C2> <D8C2> <8288> <D8C3> <D8C3> <5B5B> <D8C4> <D8C4> <556C> <D8C5> <D8C5> <560F> <D8C6> <D8C6> <4EC4> <D8C7> <D8C7> <538D> <D8C8> <D8C8> <539D> <D8C9> <D8C9> <53A3> <D8CA> <D8CA> <53A5> <D8CB> <D8CB> <53AE> <D8CC> <D8CC> <9765> <D8CD> <D8CD> <8D5D> <D8CE> <D8CE> <531A> <D8CF> <D8CF> <53F5> <D8D0> <D8D0> <5326> <D8D1> <D8D1> <532E> <D8D2> <D8D2> <533E> <D8D3> <D8D3> <8D5C> <D8D4> <D8D4> <5366> <D8D5> <D8D5> <5363> <D8D6> <D8D6> <5202> <D8D7> <D8D7> <5208> <D8D8> <D8D8> <520E> <D8D9> <D8D9> <522D> <D8DA> <D8DA> <5233> <D8DB> <D8DC> <523F> <D8DD> <D8DD> <524C> <D8DE> <D8DE> <525E> <D8DF> <D8DF> <5261> <D8E0> <D8E0> <525C> <D8E1> <D8E1> <84AF> <D8E2> <D8E2> <527D> <D8E3> <D8E3> <5282> <D8E4> <D8E4> <5281> <D8E5> <D8E5> <5290> <D8E6> <D8E6> <5293> <D8E7> <D8E7> <5182> <D8E8> <D8E8> <7F54> <D8E9> <D8E9> <4EBB> <D8EA> <D8EA> <4EC3> <D8EB> <D8EB> <4EC9> <D8EC> <D8EC> <4EC2> <D8ED> <D8ED> <4EE8> <D8EE> <D8EE> <4EE1> <D8EF> <D8EF> <4EEB> <D8F0> <D8F0> <4EDE> <D8F1> <D8F1> <4F1B> <D8F2> <D8F2> <4EF3> <D8F3> <D8F3> <4F22> <D8F4> <D8F4> <4F64> <D8F5> <D8F5> <4EF5> <D8F6> <D8F6> <4F25> <D8F7> <D8F7> <4F27> <D8F8> <D8F8> <4F09> <D8F9> <D8F9> <4F2B> <D8FA> <D8FA> <4F5E> <D8FB> <D8FB> <4F67> <D8FC> <D8FC> <6538> <D8FD> <D8FD> <4F5A> <D8FE> <D8FE> <4F5D> <D9A1> <D9A1> <4F5F> <D9A2> <D9A2> <4F57> <D9A3> <D9A3> <4F32> <D9A4> <D9A4> <4F3D> <D9A5> <D9A5> <4F76> endbfrange 100 beginbfrange <D9A6> <D9A6> <4F74> <D9A7> <D9A7> <4F91> <D9A8> <D9A8> <4F89> <D9A9> <D9A9> <4F83> <D9AA> <D9AA> <4F8F> <D9AB> <D9AB> <4F7E> <D9AC> <D9AC> <4F7B> <D9AD> <D9AD> <4FAA> <D9AE> <D9AE> <4F7C> <D9AF> <D9AF> <4FAC> <D9B0> <D9B0> <4F94> <D9B1> <D9B1> <4FE6> <D9B2> <D9B2> <4FE8> <D9B3> <D9B3> <4FEA> <D9B4> <D9B4> <4FC5> <D9B5> <D9B5> <4FDA> <D9B6> <D9B6> <4FE3> <D9B7> <D9B7> <4FDC> <D9B8> <D9B8> <4FD1> <D9B9> <D9B9> <4FDF> <D9BA> <D9BA> <4FF8> <D9BB> <D9BB> <5029> <D9BC> <D9BC> <504C> <D9BD> <D9BD> <4FF3> <D9BE> <D9BE> <502C> <D9BF> <D9BF> <500F> <D9C0> <D9C0> <502E> <D9C1> <D9C1> <502D> <D9C2> <D9C2> <4FFE> <D9C3> <D9C3> <501C> <D9C4> <D9C4> <500C> <D9C5> <D9C5> <5025> <D9C6> <D9C6> <5028> <D9C7> <D9C7> <507E> <D9C8> <D9C8> <5043> <D9C9> <D9C9> <5055> <D9CA> <D9CA> <5048> <D9CB> <D9CB> <504E> <D9CC> <D9CC> <506C> <D9CD> <D9CD> <507B> <D9CE> <D9CE> <50A5> <D9CF> <D9CF> <50A7> <D9D0> <D9D0> <50A9> <D9D1> <D9D1> <50BA> <D9D2> <D9D2> <50D6> <D9D3> <D9D3> <5106> <D9D4> <D9D4> <50ED> <D9D5> <D9D5> <50EC> <D9D6> <D9D6> <50E6> <D9D7> <D9D7> <50EE> <D9D8> <D9D8> <5107> <D9D9> <D9D9> <510B> <D9DA> <D9DA> <4EDD> <D9DB> <D9DB> <6C3D> <D9DC> <D9DC> <4F58> <D9DD> <D9DD> <4F65> <D9DE> <D9DE> <4FCE> <D9DF> <D9DF> <9FA0> <D9E0> <D9E0> <6C46> <D9E1> <D9E1> <7C74> <D9E2> <D9E2> <516E> <D9E3> <D9E3> <5DFD> <D9E4> <D9E4> <9EC9> <D9E5> <D9E5> <9998> <D9E6> <D9E6> <5181> <D9E7> <D9E7> <5914> <D9E8> <D9E8> <52F9> <D9E9> <D9E9> <530D> <D9EA> <D9EA> <8A07> <D9EB> <D9EB> <5310> <D9EC> <D9EC> <51EB> <D9ED> <D9ED> <5919> <D9EE> <D9EE> <5155> <D9EF> <D9EF> <4EA0> <D9F0> <D9F0> <5156> <D9F1> <D9F1> <4EB3> <D9F2> <D9F2> <886E> <D9F3> <D9F3> <88A4> <D9F4> <D9F4> <4EB5> <D9F5> <D9F5> <8114> <D9F6> <D9F6> <88D2> <D9F7> <D9F7> <7980> <D9F8> <D9F8> <5B34> <D9F9> <D9F9> <8803> <D9FA> <D9FA> <7FB8> <D9FB> <D9FB> <51AB> <D9FC> <D9FC> <51B1> <D9FD> <D9FD> <51BD> <D9FE> <D9FE> <51BC> <DAA1> <DAA1> <51C7> <DAA2> <DAA2> <5196> <DAA3> <DAA3> <51A2> <DAA4> <DAA4> <51A5> <DAA5> <DAA5> <8BA0> <DAA6> <DAA7> <8BA6> <DAA8> <DAA8> <8BAA> <DAA9> <DAAA> <8BB4> <DAAB> <DAAB> <8BB7> <DAAC> <DAAD> <8BC2> <DAAE> <DAAE> <8BCB> endbfrange 100 beginbfrange <DAAF> <DAAF> <8BCF> <DAB0> <DAB0> <8BCE> <DAB1> <DAB3> <8BD2> <DAB4> <DAB4> <8BD6> <DAB5> <DAB6> <8BD8> <DAB7> <DAB7> <8BDC> <DAB8> <DAB9> <8BDF> <DABA> <DABA> <8BE4> <DABB> <DABC> <8BE8> <DABD> <DABD> <8BEE> <DABE> <DABE> <8BF0> <DABF> <DABF> <8BF3> <DAC0> <DAC0> <8BF6> <DAC1> <DAC1> <8BF9> <DAC2> <DAC2> <8BFC> <DAC3> <DAC4> <8BFF> <DAC5> <DAC5> <8C02> <DAC6> <DAC6> <8C04> <DAC7> <DAC7> <8C07> <DAC8> <DAC8> <8C0C> <DAC9> <DAC9> <8C0F> <DACA> <DACB> <8C11> <DACC> <DACE> <8C14> <DACF> <DACF> <8C19> <DAD0> <DAD0> <8C1B> <DAD1> <DAD1> <8C18> <DAD2> <DAD2> <8C1D> <DAD3> <DAD5> <8C1F> <DAD6> <DAD6> <8C25> <DAD7> <DAD7> <8C27> <DAD8> <DAD9> <8C2A> <DADA> <DADB> <8C2E> <DADC> <DADD> <8C32> <DADE> <DADF> <8C35> <DAE0> <DAE0> <5369> <DAE1> <DAE1> <537A> <DAE2> <DAE2> <961D> <DAE3> <DAE3> <9622> <DAE4> <DAE4> <9621> <DAE5> <DAE5> <9631> <DAE6> <DAE6> <962A> <DAE7> <DAE7> <963D> <DAE8> <DAE8> <963C> <DAE9> <DAE9> <9642> <DAEA> <DAEA> <9649> <DAEB> <DAEB> <9654> <DAEC> <DAEC> <965F> <DAED> <DAED> <9667> <DAEE> <DAEE> <966C> <DAEF> <DAEF> <9672> <DAF0> <DAF0> <9674> <DAF1> <DAF1> <9688> <DAF2> <DAF2> <968D> <DAF3> <DAF3> <9697> <DAF4> <DAF4> <96B0> <DAF5> <DAF5> <9097> <DAF6> <DAF6> <909B> <DAF7> <DAF7> <909D> <DAF8> <DAF8> <9099> <DAF9> <DAF9> <90AC> <DAFA> <DAFA> <90A1> <DAFB> <DAFB> <90B4> <DAFC> <DAFC> <90B3> <DAFD> <DAFD> <90B6> <DAFE> <DAFE> <90BA> <DBA1> <DBA1> <90B8> <DBA2> <DBA2> <90B0> <DBA3> <DBA3> <90CF> <DBA4> <DBA4> <90C5> <DBA5> <DBA5> <90BE> <DBA6> <DBA6> <90D0> <DBA7> <DBA7> <90C4> <DBA8> <DBA8> <90C7> <DBA9> <DBA9> <90D3> <DBAA> <DBAA> <90E6> <DBAB> <DBAB> <90E2> <DBAC> <DBAC> <90DC> <DBAD> <DBAD> <90D7> <DBAE> <DBAE> <90DB> <DBAF> <DBAF> <90EB> <DBB0> <DBB0> <90EF> <DBB1> <DBB1> <90FE> <DBB2> <DBB2> <9104> <DBB3> <DBB3> <9122> <DBB4> <DBB4> <911E> <DBB5> <DBB5> <9123> <DBB6> <DBB6> <9131> <DBB7> <DBB7> <912F> <DBB8> <DBB8> <9139> <DBB9> <DBB9> <9143> <DBBA> <DBBA> <9146> <DBBB> <DBBB> <520D> <DBBC> <DBBC> <5942> <DBBD> <DBBD> <52A2> <DBBE> <DBBF> <52AC> <DBC0> <DBC0> <52BE> <DBC1> <DBC1> <54FF> <DBC2> <DBC2> <52D0> <DBC3> <DBC3> <52D6> <DBC4> <DBC4> <52F0> endbfrange 100 beginbfrange <DBC5> <DBC5> <53DF> <DBC6> <DBC6> <71EE> <DBC7> <DBC7> <77CD> <DBC8> <DBC8> <5EF4> <DBC9> <DBC9> <51F5> <DBCA> <DBCA> <51FC> <DBCB> <DBCB> <9B2F> <DBCC> <DBCC> <53B6> <DBCD> <DBCD> <5F01> <DBCE> <DBCE> <755A> <DBCF> <DBCF> <5DEF> <DBD0> <DBD0> <574C> <DBD1> <DBD1> <57A9> <DBD2> <DBD2> <57A1> <DBD3> <DBD3> <587E> <DBD4> <DBD4> <58BC> <DBD5> <DBD5> <58C5> <DBD6> <DBD6> <58D1> <DBD7> <DBD7> <5729> <DBD8> <DBD8> <572C> <DBD9> <DBD9> <572A> <DBDA> <DBDA> <5733> <DBDB> <DBDB> <5739> <DBDC> <DBDD> <572E> <DBDE> <DBDE> <575C> <DBDF> <DBDF> <573B> <DBE0> <DBE0> <5742> <DBE1> <DBE1> <5769> <DBE2> <DBE2> <5785> <DBE3> <DBE3> <576B> <DBE4> <DBE4> <5786> <DBE5> <DBE5> <577C> <DBE6> <DBE6> <577B> <DBE7> <DBE7> <5768> <DBE8> <DBE8> <576D> <DBE9> <DBE9> <5776> <DBEA> <DBEA> <5773> <DBEB> <DBEB> <57AD> <DBEC> <DBEC> <57A4> <DBED> <DBED> <578C> <DBEE> <DBEE> <57B2> <DBEF> <DBEF> <57CF> <DBF0> <DBF0> <57A7> <DBF1> <DBF1> <57B4> <DBF2> <DBF2> <5793> <DBF3> <DBF3> <57A0> <DBF4> <DBF4> <57D5> <DBF5> <DBF5> <57D8> <DBF6> <DBF6> <57DA> <DBF7> <DBF7> <57D9> <DBF8> <DBF8> <57D2> <DBF9> <DBF9> <57B8> <DBFA> <DBFA> <57F4> <DBFB> <DBFB> <57EF> <DBFC> <DBFC> <57F8> <DBFD> <DBFD> <57E4> <DBFE> <DBFE> <57DD> <DCA1> <DCA1> <580B> <DCA2> <DCA2> <580D> <DCA3> <DCA3> <57FD> <DCA4> <DCA4> <57ED> <DCA5> <DCA5> <5800> <DCA6> <DCA6> <581E> <DCA7> <DCA7> <5819> <DCA8> <DCA8> <5844> <DCA9> <DCA9> <5820> <DCAA> <DCAA> <5865> <DCAB> <DCAB> <586C> <DCAC> <DCAC> <5881> <DCAD> <DCAD> <5889> <DCAE> <DCAE> <589A> <DCAF> <DCAF> <5880> <DCB0> <DCB0> <99A8> <DCB1> <DCB1> <9F19> <DCB2> <DCB2> <61FF> <DCB3> <DCB3> <8279> <DCB4> <DCB4> <827D> <DCB5> <DCB5> <827F> <DCB6> <DCB6> <828F> <DCB7> <DCB7> <828A> <DCB8> <DCB8> <82A8> <DCB9> <DCB9> <8284> <DCBA> <DCBA> <828E> <DCBB> <DCBB> <8291> <DCBC> <DCBC> <8297> <DCBD> <DCBD> <8299> <DCBE> <DCBE> <82AB> <DCBF> <DCBF> <82B8> <DCC0> <DCC0> <82BE> <DCC1> <DCC1> <82B0> <DCC2> <DCC2> <82C8> <DCC3> <DCC3> <82CA> <DCC4> <DCC4> <82E3> <DCC5> <DCC5> <8298> <DCC6> <DCC6> <82B7> <DCC7> <DCC7> <82AE> <DCC8> <DCC9> <82CB> <DCCA> <DCCA> <82C1> <DCCB> <DCCB> <82A9> <DCCC> <DCCC> <82B4> endbfrange 100 beginbfrange <DCCD> <DCCD> <82A1> <DCCE> <DCCE> <82AA> <DCCF> <DCCF> <829F> <DCD0> <DCD0> <82C4> <DCD1> <DCD1> <82CE> <DCD2> <DCD2> <82A4> <DCD3> <DCD3> <82E1> <DCD4> <DCD4> <8309> <DCD5> <DCD5> <82F7> <DCD6> <DCD6> <82E4> <DCD7> <DCD7> <830F> <DCD8> <DCD8> <8307> <DCD9> <DCD9> <82DC> <DCDA> <DCDA> <82F4> <DCDB> <DCDB> <82D2> <DCDC> <DCDC> <82D8> <DCDD> <DCDD> <830C> <DCDE> <DCDE> <82FB> <DCDF> <DCDF> <82D3> <DCE0> <DCE0> <8311> <DCE1> <DCE1> <831A> <DCE2> <DCE2> <8306> <DCE3> <DCE4> <8314> <DCE5> <DCE5> <82E0> <DCE6> <DCE6> <82D5> <DCE7> <DCE7> <831C> <DCE8> <DCE8> <8351> <DCE9> <DCEA> <835B> <DCEB> <DCEB> <8308> <DCEC> <DCEC> <8392> <DCED> <DCED> <833C> <DCEE> <DCEE> <8334> <DCEF> <DCEF> <8331> <DCF0> <DCF0> <839B> <DCF1> <DCF1> <835E> <DCF2> <DCF2> <832F> <DCF3> <DCF3> <834F> <DCF4> <DCF4> <8347> <DCF5> <DCF5> <8343> <DCF6> <DCF6> <835F> <DCF7> <DCF7> <8340> <DCF8> <DCF8> <8317> <DCF9> <DCF9> <8360> <DCFA> <DCFA> <832D> <DCFB> <DCFB> <833A> <DCFC> <DCFC> <8333> <DCFD> <DCFD> <8366> <DCFE> <DCFE> <8365> <DDA1> <DDA1> <8368> <DDA2> <DDA2> <831B> <DDA3> <DDA3> <8369> <DDA4> <DDA4> <836C> <DDA5> <DDA5> <836A> <DDA6> <DDA7> <836D> <DDA8> <DDA8> <83B0> <DDA9> <DDA9> <8378> <DDAA> <DDAB> <83B3> <DDAC> <DDAC> <83A0> <DDAD> <DDAD> <83AA> <DDAE> <DDAE> <8393> <DDAF> <DDAF> <839C> <DDB0> <DDB0> <8385> <DDB1> <DDB1> <837C> <DDB2> <DDB2> <83B6> <DDB3> <DDB3> <83A9> <DDB4> <DDB4> <837D> <DDB5> <DDB5> <83B8> <DDB6> <DDB6> <837B> <DDB7> <DDB7> <8398> <DDB8> <DDB8> <839E> <DDB9> <DDB9> <83A8> <DDBA> <DDBA> <83BA> <DDBB> <DDBB> <83BC> <DDBC> <DDBC> <83C1> <DDBD> <DDBD> <8401> <DDBE> <DDBE> <83E5> <DDBF> <DDBF> <83D8> <DDC0> <DDC0> <5807> <DDC1> <DDC1> <8418> <DDC2> <DDC2> <840B> <DDC3> <DDC3> <83DD> <DDC4> <DDC4> <83FD> <DDC5> <DDC5> <83D6> <DDC6> <DDC6> <841C> <DDC7> <DDC7> <8438> <DDC8> <DDC8> <8411> <DDC9> <DDC9> <8406> <DDCA> <DDCA> <83D4> <DDCB> <DDCB> <83DF> <DDCC> <DDCC> <840F> <DDCD> <DDCD> <8403> <DDCE> <DDCF> <83F8> <DDD0> <DDD0> <83EA> <DDD1> <DDD1> <83C5> <DDD2> <DDD2> <83C0> <DDD3> <DDD3> <8426> <DDD4> <DDD4> <83F0> <DDD5> <DDD5> <83E1> <DDD6> <DDD6> <845C> <DDD7> <DDD7> <8451> endbfrange 100 beginbfrange <DDD8> <DDD8> <845A> <DDD9> <DDD9> <8459> <DDDA> <DDDA> <8473> <DDDB> <DDDC> <8487> <DDDD> <DDDD> <847A> <DDDE> <DDDE> <8489> <DDDF> <DDDF> <8478> <DDE0> <DDE0> <843C> <DDE1> <DDE1> <8446> <DDE2> <DDE2> <8469> <DDE3> <DDE3> <8476> <DDE4> <DDE4> <848C> <DDE5> <DDE5> <848E> <DDE6> <DDE6> <8431> <DDE7> <DDE7> <846D> <DDE8> <DDE8> <84C1> <DDE9> <DDE9> <84CD> <DDEA> <DDEA> <84D0> <DDEB> <DDEB> <84E6> <DDEC> <DDEC> <84BD> <DDED> <DDED> <84D3> <DDEE> <DDEE> <84CA> <DDEF> <DDEF> <84BF> <DDF0> <DDF0> <84BA> <DDF1> <DDF1> <84E0> <DDF2> <DDF2> <84A1> <DDF3> <DDF3> <84B9> <DDF4> <DDF4> <84B4> <DDF5> <DDF5> <8497> <DDF6> <DDF6> <84E5> <DDF7> <DDF7> <84E3> <DDF8> <DDF8> <850C> <DDF9> <DDF9> <750D> <DDFA> <DDFA> <8538> <DDFB> <DDFB> <84F0> <DDFC> <DDFC> <8539> <DDFD> <DDFD> <851F> <DDFE> <DDFE> <853A> <DEA1> <DEA1> <8556> <DEA2> <DEA2> <853B> <DEA3> <DEA3> <84FF> <DEA4> <DEA4> <84FC> <DEA5> <DEA5> <8559> <DEA6> <DEA6> <8548> <DEA7> <DEA7> <8568> <DEA8> <DEA8> <8564> <DEA9> <DEA9> <855E> <DEAA> <DEAA> <857A> <DEAB> <DEAB> <77A2> <DEAC> <DEAC> <8543> <DEAD> <DEAD> <8572> <DEAE> <DEAE> <857B> <DEAF> <DEAF> <85A4> <DEB0> <DEB0> <85A8> <DEB1> <DEB1> <8587> <DEB2> <DEB2> <858F> <DEB3> <DEB3> <8579> <DEB4> <DEB4> <85AE> <DEB5> <DEB5> <859C> <DEB6> <DEB6> <8585> <DEB7> <DEB7> <85B9> <DEB8> <DEB8> <85B7> <DEB9> <DEB9> <85B0> <DEBA> <DEBA> <85D3> <DEBB> <DEBB> <85C1> <DEBC> <DEBC> <85DC> <DEBD> <DEBD> <85FF> <DEBE> <DEBE> <8627> <DEBF> <DEBF> <8605> <DEC0> <DEC0> <8629> <DEC1> <DEC1> <8616> <DEC2> <DEC2> <863C> <DEC3> <DEC3> <5EFE> <DEC4> <DEC4> <5F08> <DEC5> <DEC5> <593C> <DEC6> <DEC6> <5941> <DEC7> <DEC7> <8037> <DEC8> <DEC8> <5955> <DEC9> <DEC9> <595A> <DECA> <DECA> <5958> <DECB> <DECB> <530F> <DECC> <DECC> <5C22> <DECD> <DECD> <5C25> <DECE> <DECE> <5C2C> <DECF> <DECF> <5C34> <DED0> <DED0> <624C> <DED1> <DED1> <626A> <DED2> <DED2> <629F> <DED3> <DED3> <62BB> <DED4> <DED4> <62CA> <DED5> <DED5> <62DA> <DED6> <DED6> <62D7> <DED7> <DED7> <62EE> <DED8> <DED8> <6322> <DED9> <DED9> <62F6> <DEDA> <DEDA> <6339> <DEDB> <DEDB> <634B> <DEDC> <DEDC> <6343> <DEDD> <DEDD> <63AD> <DEDE> <DEDE> <63F6> endbfrange 100 beginbfrange <DEDF> <DEDF> <6371> <DEE0> <DEE0> <637A> <DEE1> <DEE1> <638E> <DEE2> <DEE2> <63B4> <DEE3> <DEE3> <636D> <DEE4> <DEE4> <63AC> <DEE5> <DEE5> <638A> <DEE6> <DEE6> <6369> <DEE7> <DEE7> <63AE> <DEE8> <DEE8> <63BC> <DEE9> <DEE9> <63F2> <DEEA> <DEEA> <63F8> <DEEB> <DEEB> <63E0> <DEEC> <DEEC> <63FF> <DEED> <DEED> <63C4> <DEEE> <DEEE> <63DE> <DEEF> <DEEF> <63CE> <DEF0> <DEF0> <6452> <DEF1> <DEF1> <63C6> <DEF2> <DEF2> <63BE> <DEF3> <DEF3> <6445> <DEF4> <DEF4> <6441> <DEF5> <DEF5> <640B> <DEF6> <DEF6> <641B> <DEF7> <DEF7> <6420> <DEF8> <DEF8> <640C> <DEF9> <DEF9> <6426> <DEFA> <DEFA> <6421> <DEFB> <DEFB> <645E> <DEFC> <DEFC> <6484> <DEFD> <DEFD> <646D> <DEFE> <DEFE> <6496> <DFA1> <DFA1> <647A> <DFA2> <DFA3> <64B7> <DFA4> <DFA4> <6499> <DFA5> <DFA5> <64BA> <DFA6> <DFA6> <64C0> <DFA7> <DFA7> <64D0> <DFA8> <DFA8> <64D7> <DFA9> <DFA9> <64E4> <DFAA> <DFAA> <64E2> <DFAB> <DFAB> <6509> <DFAC> <DFAC> <6525> <DFAD> <DFAD> <652E> <DFAE> <DFAE> <5F0B> <DFAF> <DFAF> <5FD2> <DFB0> <DFB0> <7519> <DFB1> <DFB1> <5F11> <DFB2> <DFB2> <535F> <DFB3> <DFB3> <53F1> <DFB4> <DFB4> <53FD> <DFB5> <DFB5> <53E9> <DFB6> <DFB6> <53E8> <DFB7> <DFB7> <53FB> <DFB8> <DFB8> <5412> <DFB9> <DFB9> <5416> <DFBA> <DFBA> <5406> <DFBB> <DFBB> <544B> <DFBC> <DFBE> <5452> <DFBF> <DFBF> <5456> <DFC0> <DFC0> <5443> <DFC1> <DFC1> <5421> <DFC2> <DFC2> <5457> <DFC3> <DFC3> <5459> <DFC4> <DFC4> <5423> <DFC5> <DFC5> <5432> <DFC6> <DFC6> <5482> <DFC7> <DFC7> <5494> <DFC8> <DFC8> <5477> <DFC9> <DFC9> <5471> <DFCA> <DFCA> <5464> <DFCB> <DFCC> <549A> <DFCD> <DFCD> <5484> <DFCE> <DFCE> <5476> <DFCF> <DFCF> <5466> <DFD0> <DFD0> <549D> <DFD1> <DFD1> <54D0> <DFD2> <DFD2> <54AD> <DFD3> <DFD3> <54C2> <DFD4> <DFD4> <54B4> <DFD5> <DFD5> <54D2> <DFD6> <DFD6> <54A7> <DFD7> <DFD7> <54A6> <DFD8> <DFD9> <54D3> <DFDA> <DFDA> <5472> <DFDB> <DFDB> <54A3> <DFDC> <DFDC> <54D5> <DFDD> <DFDD> <54BB> <DFDE> <DFDE> <54BF> <DFDF> <DFDF> <54CC> <DFE0> <DFE1> <54D9> <DFE2> <DFE2> <54DC> <DFE3> <DFE4> <54A9> <DFE5> <DFE5> <54A4> <DFE6> <DFE6> <54DD> <DFE7> <DFE7> <54CF> <DFE8> <DFE8> <54DE> <DFE9> <DFE9> <551B> <DFEA> <DFEA> <54E7> <DFEB> <DFEB> <5520> endbfrange 100 beginbfrange <DFEC> <DFEC> <54FD> <DFED> <DFED> <5514> <DFEE> <DFEE> <54F3> <DFEF> <DFF0> <5522> <DFF1> <DFF1> <550F> <DFF2> <DFF2> <5511> <DFF3> <DFF3> <5527> <DFF4> <DFF4> <552A> <DFF5> <DFF5> <5567> <DFF6> <DFF6> <558F> <DFF7> <DFF7> <55B5> <DFF8> <DFF8> <5549> <DFF9> <DFF9> <556D> <DFFA> <DFFA> <5541> <DFFB> <DFFB> <5555> <DFFC> <DFFC> <553F> <DFFD> <DFFD> <5550> <DFFE> <DFFE> <553C> <E0A1> <E0A1> <5537> <E0A2> <E0A2> <5556> <E0A3> <E0A5> <5575> <E0A6> <E0A6> <5533> <E0A7> <E0A7> <5530> <E0A8> <E0A8> <555C> <E0A9> <E0A9> <558B> <E0AA> <E0AA> <55D2> <E0AB> <E0AB> <5583> <E0AC> <E0AC> <55B1> <E0AD> <E0AD> <55B9> <E0AE> <E0AE> <5588> <E0AF> <E0AF> <5581> <E0B0> <E0B0> <559F> <E0B1> <E0B1> <557E> <E0B2> <E0B2> <55D6> <E0B3> <E0B3> <5591> <E0B4> <E0B4> <557B> <E0B5> <E0B5> <55DF> <E0B6> <E0B7> <55BD> <E0B8> <E0B8> <5594> <E0B9> <E0B9> <5599> <E0BA> <E0BA> <55EA> <E0BB> <E0BB> <55F7> <E0BC> <E0BC> <55C9> <E0BD> <E0BD> <561F> <E0BE> <E0BE> <55D1> <E0BF> <E0C0> <55EB> <E0C1> <E0C1> <55D4> <E0C2> <E0C2> <55E6> <E0C3> <E0C3> <55DD> <E0C4> <E0C4> <55C4> <E0C5> <E0C5> <55EF> <E0C6> <E0C6> <55E5> <E0C7> <E0C8> <55F2> <E0C9> <E0CA> <55CC> <E0CB> <E0CB> <55E8> <E0CC> <E0CC> <55F5> <E0CD> <E0CD> <55E4> <E0CE> <E0CE> <8F94> <E0CF> <E0CF> <561E> <E0D0> <E0D0> <5608> <E0D1> <E0D1> <560C> <E0D2> <E0D2> <5601> <E0D3> <E0D3> <5624> <E0D4> <E0D4> <5623> <E0D5> <E0D5> <55FE> <E0D6> <E0D6> <5600> <E0D7> <E0D7> <5627> <E0D8> <E0D8> <562D> <E0D9> <E0D9> <5658> <E0DA> <E0DA> <5639> <E0DB> <E0DB> <5657> <E0DC> <E0DC> <562C> <E0DD> <E0DD> <564D> <E0DE> <E0DE> <5662> <E0DF> <E0DF> <5659> <E0E0> <E0E0> <565C> <E0E1> <E0E1> <564C> <E0E2> <E0E2> <5654> <E0E3> <E0E3> <5686> <E0E4> <E0E4> <5664> <E0E5> <E0E5> <5671> <E0E6> <E0E6> <566B> <E0E7> <E0E8> <567B> <E0E9> <E0E9> <5685> <E0EA> <E0EA> <5693> <E0EB> <E0EB> <56AF> <E0EC> <E0EC> <56D4> <E0ED> <E0ED> <56D7> <E0EE> <E0EE> <56DD> <E0EF> <E0EF> <56E1> <E0F0> <E0F0> <56F5> <E0F1> <E0F1> <56EB> <E0F2> <E0F2> <56F9> <E0F3> <E0F3> <56FF> <E0F4> <E0F4> <5704> <E0F5> <E0F5> <570A> <E0F6> <E0F6> <5709> <E0F7> <E0F7> <571C> <E0F8> <E0F8> <5E0F> <E0F9> <E0F9> <5E19> endbfrange 100 beginbfrange <E0FA> <E0FA> <5E14> <E0FB> <E0FB> <5E11> <E0FC> <E0FC> <5E31> <E0FD> <E0FE> <5E3B> <E1A1> <E1A1> <5E37> <E1A2> <E1A2> <5E44> <E1A3> <E1A3> <5E54> <E1A4> <E1A4> <5E5B> <E1A5> <E1A5> <5E5E> <E1A6> <E1A6> <5E61> <E1A7> <E1A7> <5C8C> <E1A8> <E1A8> <5C7A> <E1A9> <E1A9> <5C8D> <E1AA> <E1AA> <5C90> <E1AB> <E1AB> <5C96> <E1AC> <E1AC> <5C88> <E1AD> <E1AE> <5C98> <E1AF> <E1AF> <5C91> <E1B0> <E1B0> <5C9A> <E1B1> <E1B1> <5C9C> <E1B2> <E1B2> <5CB5> <E1B3> <E1B3> <5CA2> <E1B4> <E1B4> <5CBD> <E1B5> <E1B5> <5CAC> <E1B6> <E1B6> <5CAB> <E1B7> <E1B7> <5CB1> <E1B8> <E1B8> <5CA3> <E1B9> <E1B9> <5CC1> <E1BA> <E1BA> <5CB7> <E1BB> <E1BB> <5CC4> <E1BC> <E1BC> <5CD2> <E1BD> <E1BD> <5CE4> <E1BE> <E1BE> <5CCB> <E1BF> <E1BF> <5CE5> <E1C0> <E1C1> <5D02> <E1C2> <E1C2> <5D27> <E1C3> <E1C3> <5D26> <E1C4> <E1C4> <5D2E> <E1C5> <E1C5> <5D24> <E1C6> <E1C6> <5D1E> <E1C7> <E1C7> <5D06> <E1C8> <E1C8> <5D1B> <E1C9> <E1C9> <5D58> <E1CA> <E1CA> <5D3E> <E1CB> <E1CB> <5D34> <E1CC> <E1CC> <5D3D> <E1CD> <E1CD> <5D6C> <E1CE> <E1CE> <5D5B> <E1CF> <E1CF> <5D6F> <E1D0> <E1D0> <5D5D> <E1D1> <E1D1> <5D6B> <E1D2> <E1D2> <5D4B> <E1D3> <E1D3> <5D4A> <E1D4> <E1D4> <5D69> <E1D5> <E1D5> <5D74> <E1D6> <E1D6> <5D82> <E1D7> <E1D7> <5D99> <E1D8> <E1D8> <5D9D> <E1D9> <E1D9> <8C73> <E1DA> <E1DA> <5DB7> <E1DB> <E1DB> <5DC5> <E1DC> <E1DC> <5F73> <E1DD> <E1DD> <5F77> <E1DE> <E1DE> <5F82> <E1DF> <E1DF> <5F87> <E1E0> <E1E0> <5F89> <E1E1> <E1E1> <5F8C> <E1E2> <E1E2> <5F95> <E1E3> <E1E3> <5F99> <E1E4> <E1E4> <5F9C> <E1E5> <E1E5> <5FA8> <E1E6> <E1E6> <5FAD> <E1E7> <E1E7> <5FB5> <E1E8> <E1E8> <5FBC> <E1E9> <E1E9> <8862> <E1EA> <E1EA> <5F61> <E1EB> <E1EB> <72AD> <E1EC> <E1EC> <72B0> <E1ED> <E1ED> <72B4> <E1EE> <E1EF> <72B7> <E1F0> <E1F0> <72C3> <E1F1> <E1F1> <72C1> <E1F2> <E1F2> <72CE> <E1F3> <E1F3> <72CD> <E1F4> <E1F4> <72D2> <E1F5> <E1F5> <72E8> <E1F6> <E1F6> <72EF> <E1F7> <E1F7> <72E9> <E1F8> <E1F8> <72F2> <E1F9> <E1F9> <72F4> <E1FA> <E1FA> <72F7> <E1FB> <E1FB> <7301> <E1FC> <E1FC> <72F3> <E1FD> <E1FD> <7303> <E1FE> <E1FE> <72FA> <E2A1> <E2A1> <72FB> <E2A2> <E2A2> <7317> <E2A3> <E2A3> <7313> <E2A4> <E2A4> <7321> <E2A5> <E2A5> <730A> endbfrange 100 beginbfrange <E2A6> <E2A6> <731E> <E2A7> <E2A7> <731D> <E2A8> <E2A8> <7315> <E2A9> <E2A9> <7322> <E2AA> <E2AA> <7339> <E2AB> <E2AB> <7325> <E2AC> <E2AC> <732C> <E2AD> <E2AD> <7338> <E2AE> <E2AE> <7331> <E2AF> <E2AF> <7350> <E2B0> <E2B0> <734D> <E2B1> <E2B1> <7357> <E2B2> <E2B2> <7360> <E2B3> <E2B3> <736C> <E2B4> <E2B4> <736F> <E2B5> <E2B5> <737E> <E2B6> <E2B6> <821B> <E2B7> <E2B7> <5925> <E2B8> <E2B8> <98E7> <E2B9> <E2B9> <5924> <E2BA> <E2BA> <5902> <E2BB> <E2BB> <9963> <E2BC> <E2C1> <9967> <E2C2> <E2C2> <9974> <E2C3> <E2C3> <9977> <E2C4> <E2C4> <997D> <E2C5> <E2C5> <9980> <E2C6> <E2C6> <9984> <E2C7> <E2C7> <9987> <E2C8> <E2C8> <998A> <E2C9> <E2C9> <998D> <E2CA> <E2CB> <9990> <E2CC> <E2CE> <9993> <E2CF> <E2CF> <5E80> <E2D0> <E2D0> <5E91> <E2D1> <E2D1> <5E8B> <E2D2> <E2D2> <5E96> <E2D3> <E2D3> <5EA5> <E2D4> <E2D4> <5EA0> <E2D5> <E2D5> <5EB9> <E2D6> <E2D6> <5EB5> <E2D7> <E2D7> <5EBE> <E2D8> <E2D8> <5EB3> <E2D9> <E2D9> <8D53> <E2DA> <E2DA> <5ED2> <E2DB> <E2DB> <5ED1> <E2DC> <E2DC> <5EDB> <E2DD> <E2DD> <5EE8> <E2DE> <E2DE> <5EEA> <E2DF> <E2DF> <81BA> <E2E0> <E2E0> <5FC4> <E2E1> <E2E1> <5FC9> <E2E2> <E2E2> <5FD6> <E2E3> <E2E3> <5FCF> <E2E4> <E2E4> <6003> <E2E5> <E2E5> <5FEE> <E2E6> <E2E6> <6004> <E2E7> <E2E7> <5FE1> <E2E8> <E2E8> <5FE4> <E2E9> <E2E9> <5FFE> <E2EA> <E2EB> <6005> <E2EC> <E2EC> <5FEA> <E2ED> <E2ED> <5FED> <E2EE> <E2EE> <5FF8> <E2EF> <E2EF> <6019> <E2F0> <E2F0> <6035> <E2F1> <E2F1> <6026> <E2F2> <E2F2> <601B> <E2F3> <E2F3> <600F> <E2F4> <E2F4> <600D> <E2F5> <E2F5> <6029> <E2F6> <E2F6> <602B> <E2F7> <E2F7> <600A> <E2F8> <E2F8> <603F> <E2F9> <E2F9> <6021> <E2FA> <E2FB> <6078> <E2FC> <E2FC> <607B> <E2FD> <E2FD> <607A> <E2FE> <E2FE> <6042> <E3A1> <E3A1> <606A> <E3A2> <E3A2> <607D> <E3A3> <E3A3> <6096> <E3A4> <E3A4> <609A> <E3A5> <E3A5> <60AD> <E3A6> <E3A6> <609D> <E3A7> <E3A7> <6083> <E3A8> <E3A8> <6092> <E3A9> <E3A9> <608C> <E3AA> <E3AA> <609B> <E3AB> <E3AB> <60EC> <E3AC> <E3AC> <60BB> <E3AD> <E3AD> <60B1> <E3AE> <E3AE> <60DD> <E3AF> <E3AF> <60D8> <E3B0> <E3B0> <60C6> <E3B1> <E3B1> <60DA> <E3B2> <E3B2> <60B4> <E3B3> <E3B3> <6120> <E3B4> <E3B4> <6126> <E3B5> <E3B5> <6115> endbfrange 100 beginbfrange <E3B6> <E3B6> <6123> <E3B7> <E3B7> <60F4> <E3B8> <E3B8> <6100> <E3B9> <E3B9> <610E> <E3BA> <E3BA> <612B> <E3BB> <E3BB> <614A> <E3BC> <E3BC> <6175> <E3BD> <E3BD> <61AC> <E3BE> <E3BE> <6194> <E3BF> <E3BF> <61A7> <E3C0> <E3C0> <61B7> <E3C1> <E3C1> <61D4> <E3C2> <E3C2> <61F5> <E3C3> <E3C3> <5FDD> <E3C4> <E3C4> <96B3> <E3C5> <E3C5> <95E9> <E3C6> <E3C6> <95EB> <E3C7> <E3C7> <95F1> <E3C8> <E3C8> <95F3> <E3C9> <E3CA> <95F5> <E3CB> <E3CB> <95FC> <E3CC> <E3CC> <95FE> <E3CD> <E3CE> <9603> <E3CF> <E3CF> <9606> <E3D0> <E3D0> <9608> <E3D1> <E3D4> <960A> <E3D5> <E3D5> <960F> <E3D6> <E3D6> <9612> <E3D7> <E3D9> <9615> <E3DA> <E3DB> <9619> <E3DC> <E3DC> <4E2C> <E3DD> <E3DD> <723F> <E3DE> <E3DE> <6215> <E3DF> <E3DF> <6C35> <E3E0> <E3E0> <6C54> <E3E1> <E3E1> <6C5C> <E3E2> <E3E2> <6C4A> <E3E3> <E3E3> <6CA3> <E3E4> <E3E4> <6C85> <E3E5> <E3E5> <6C90> <E3E6> <E3E6> <6C94> <E3E7> <E3E7> <6C8C> <E3E8> <E3E9> <6C68> <E3EA> <E3EA> <6C74> <E3EB> <E3EB> <6C76> <E3EC> <E3EC> <6C86> <E3ED> <E3ED> <6CA9> <E3EE> <E3EE> <6CD0> <E3EF> <E3EF> <6CD4> <E3F0> <E3F0> <6CAD> <E3F1> <E3F2> <6CF7> <E3F3> <E3F3> <6CF1> <E3F4> <E3F4> <6CD7> <E3F5> <E3F5> <6CB2> <E3F6> <E3F6> <6CE0> <E3F7> <E3F7> <6CD6> <E3F8> <E3F8> <6CFA> <E3F9> <E3F9> <6CEB> <E3FA> <E3FA> <6CEE> <E3FB> <E3FB> <6CB1> <E3FC> <E3FC> <6CD3> <E3FD> <E3FD> <6CEF> <E3FE> <E3FE> <6CFE> <E4A1> <E4A1> <6D39> <E4A2> <E4A2> <6D27> <E4A3> <E4A3> <6D0C> <E4A4> <E4A4> <6D43> <E4A5> <E4A5> <6D48> <E4A6> <E4A6> <6D07> <E4A7> <E4A7> <6D04> <E4A8> <E4A8> <6D19> <E4A9> <E4A9> <6D0E> <E4AA> <E4AA> <6D2B> <E4AB> <E4AB> <6D4D> <E4AC> <E4AC> <6D2E> <E4AD> <E4AD> <6D35> <E4AE> <E4AE> <6D1A> <E4AF> <E4AF> <6D4F> <E4B0> <E4B0> <6D52> <E4B1> <E4B1> <6D54> <E4B2> <E4B2> <6D33> <E4B3> <E4B3> <6D91> <E4B4> <E4B4> <6D6F> <E4B5> <E4B5> <6D9E> <E4B6> <E4B6> <6DA0> <E4B7> <E4B7> <6D5E> <E4B8> <E4B9> <6D93> <E4BA> <E4BA> <6D5C> <E4BB> <E4BB> <6D60> <E4BC> <E4BC> <6D7C> <E4BD> <E4BD> <6D63> <E4BE> <E4BE> <6E1A> <E4BF> <E4BF> <6DC7> <E4C0> <E4C0> <6DC5> <E4C1> <E4C1> <6DDE> <E4C2> <E4C2> <6E0E> <E4C3> <E4C3> <6DBF> <E4C4> <E4C4> <6DE0> <E4C5> <E4C5> <6E11> <E4C6> <E4C6> <6DE6> endbfrange 100 beginbfrange <E4C7> <E4C7> <6DDD> <E4C8> <E4C8> <6DD9> <E4C9> <E4C9> <6E16> <E4CA> <E4CA> <6DAB> <E4CB> <E4CB> <6E0C> <E4CC> <E4CC> <6DAE> <E4CD> <E4CD> <6E2B> <E4CE> <E4CE> <6E6E> <E4CF> <E4CF> <6E4E> <E4D0> <E4D0> <6E6B> <E4D1> <E4D1> <6EB2> <E4D2> <E4D2> <6E5F> <E4D3> <E4D3> <6E86> <E4D4> <E4D5> <6E53> <E4D6> <E4D6> <6E32> <E4D7> <E4D7> <6E25> <E4D8> <E4D8> <6E44> <E4D9> <E4D9> <6EDF> <E4DA> <E4DA> <6EB1> <E4DB> <E4DB> <6E98> <E4DC> <E4DC> <6EE0> <E4DD> <E4DD> <6F2D> <E4DE> <E4DE> <6EE2> <E4DF> <E4DF> <6EA5> <E4E0> <E4E0> <6EA7> <E4E1> <E4E1> <6EBD> <E4E2> <E4E2> <6EBB> <E4E3> <E4E3> <6EB7> <E4E4> <E4E4> <6ED7> <E4E5> <E4E5> <6EB4> <E4E6> <E4E6> <6ECF> <E4E7> <E4E7> <6E8F> <E4E8> <E4E8> <6EC2> <E4E9> <E4E9> <6E9F> <E4EA> <E4EA> <6F62> <E4EB> <E4EC> <6F46> <E4ED> <E4ED> <6F24> <E4EE> <E4EE> <6F15> <E4EF> <E4EF> <6EF9> <E4F0> <E4F0> <6F2F> <E4F1> <E4F1> <6F36> <E4F2> <E4F2> <6F4B> <E4F3> <E4F3> <6F74> <E4F4> <E4F4> <6F2A> <E4F5> <E4F5> <6F09> <E4F6> <E4F6> <6F29> <E4F7> <E4F7> <6F89> <E4F8> <E4F8> <6F8D> <E4F9> <E4F9> <6F8C> <E4FA> <E4FA> <6F78> <E4FB> <E4FB> <6F72> <E4FC> <E4FC> <6F7C> <E4FD> <E4FD> <6F7A> <E4FE> <E4FE> <6FD1> <E5A1> <E5A1> <6FC9> <E5A2> <E5A2> <6FA7> <E5A3> <E5A3> <6FB9> <E5A4> <E5A4> <6FB6> <E5A5> <E5A5> <6FC2> <E5A6> <E5A6> <6FE1> <E5A7> <E5A7> <6FEE> <E5A8> <E5A8> <6FDE> <E5A9> <E5A9> <6FE0> <E5AA> <E5AA> <6FEF> <E5AB> <E5AB> <701A> <E5AC> <E5AC> <7023> <E5AD> <E5AD> <701B> <E5AE> <E5AE> <7039> <E5AF> <E5AF> <7035> <E5B0> <E5B0> <704F> <E5B1> <E5B1> <705E> <E5B2> <E5B2> <5B80> <E5B3> <E5B3> <5B84> <E5B4> <E5B4> <5B95> <E5B5> <E5B5> <5B93> <E5B6> <E5B6> <5BA5> <E5B7> <E5B7> <5BB8> <E5B8> <E5B8> <752F> <E5B9> <E5B9> <9A9E> <E5BA> <E5BA> <6434> <E5BB> <E5BB> <5BE4> <E5BC> <E5BC> <5BEE> <E5BD> <E5BD> <8930> <E5BE> <E5BE> <5BF0> <E5BF> <E5BF> <8E47> <E5C0> <E5C0> <8B07> <E5C1> <E5C1> <8FB6> <E5C2> <E5C2> <8FD3> <E5C3> <E5C3> <8FD5> <E5C4> <E5C4> <8FE5> <E5C5> <E5C5> <8FEE> <E5C6> <E5C6> <8FE4> <E5C7> <E5C7> <8FE9> <E5C8> <E5C8> <8FE6> <E5C9> <E5C9> <8FF3> <E5CA> <E5CA> <8FE8> <E5CB> <E5CB> <9005> <E5CC> <E5CC> <9004> <E5CD> <E5CD> <900B> <E5CE> <E5CE> <9026> endbfrange 100 beginbfrange <E5CF> <E5CF> <9011> <E5D0> <E5D0> <900D> <E5D1> <E5D1> <9016> <E5D2> <E5D2> <9021> <E5D3> <E5D4> <9035> <E5D5> <E5D5> <902D> <E5D6> <E5D6> <902F> <E5D7> <E5D7> <9044> <E5D8> <E5D9> <9051> <E5DA> <E5DA> <9050> <E5DB> <E5DB> <9068> <E5DC> <E5DC> <9058> <E5DD> <E5DD> <9062> <E5DE> <E5DE> <905B> <E5DF> <E5DF> <66B9> <E5E0> <E5E0> <9074> <E5E1> <E5E1> <907D> <E5E2> <E5E2> <9082> <E5E3> <E5E3> <9088> <E5E4> <E5E4> <9083> <E5E5> <E5E5> <908B> <E5E6> <E5E6> <5F50> <E5E7> <E5E7> <5F57> <E5E8> <E5E8> <5F56> <E5E9> <E5E9> <5F58> <E5EA> <E5EA> <5C3B> <E5EB> <E5EB> <54AB> <E5EC> <E5EC> <5C50> <E5ED> <E5ED> <5C59> <E5EE> <E5EE> <5B71> <E5EF> <E5EF> <5C63> <E5F0> <E5F0> <5C66> <E5F1> <E5F1> <7FBC> <E5F2> <E5F2> <5F2A> <E5F3> <E5F3> <5F29> <E5F4> <E5F4> <5F2D> <E5F5> <E5F5> <8274> <E5F6> <E5F6> <5F3C> <E5F7> <E5F7> <9B3B> <E5F8> <E5F8> <5C6E> <E5F9> <E5F9> <5981> <E5FA> <E5FA> <5983> <E5FB> <E5FB> <598D> <E5FC> <E5FD> <59A9> <E5FE> <E5FE> <59A3> <E6A1> <E6A1> <5997> <E6A2> <E6A2> <59CA> <E6A3> <E6A3> <59AB> <E6A4> <E6A4> <599E> <E6A5> <E6A5> <59A4> <E6A6> <E6A6> <59D2> <E6A7> <E6A7> <59B2> <E6A8> <E6A8> <59AF> <E6A9> <E6A9> <59D7> <E6AA> <E6AA> <59BE> <E6AB> <E6AC> <5A05> <E6AD> <E6AD> <59DD> <E6AE> <E6AE> <5A08> <E6AF> <E6AF> <59E3> <E6B0> <E6B0> <59D8> <E6B1> <E6B1> <59F9> <E6B2> <E6B2> <5A0C> <E6B3> <E6B3> <5A09> <E6B4> <E6B4> <5A32> <E6B5> <E6B5> <5A34> <E6B6> <E6B6> <5A11> <E6B7> <E6B7> <5A23> <E6B8> <E6B8> <5A13> <E6B9> <E6B9> <5A40> <E6BA> <E6BA> <5A67> <E6BB> <E6BB> <5A4A> <E6BC> <E6BC> <5A55> <E6BD> <E6BD> <5A3C> <E6BE> <E6BE> <5A62> <E6BF> <E6BF> <5A75> <E6C0> <E6C0> <80EC> <E6C1> <E6C1> <5AAA> <E6C2> <E6C2> <5A9B> <E6C3> <E6C3> <5A77> <E6C4> <E6C4> <5A7A> <E6C5> <E6C5> <5ABE> <E6C6> <E6C6> <5AEB> <E6C7> <E6C7> <5AB2> <E6C8> <E6C8> <5AD2> <E6C9> <E6C9> <5AD4> <E6CA> <E6CA> <5AB8> <E6CB> <E6CB> <5AE0> <E6CC> <E6CC> <5AE3> <E6CD> <E6CD> <5AF1> <E6CE> <E6CE> <5AD6> <E6CF> <E6CF> <5AE6> <E6D0> <E6D0> <5AD8> <E6D1> <E6D1> <5ADC> <E6D2> <E6D2> <5B09> <E6D3> <E6D3> <5B17> <E6D4> <E6D4> <5B16> <E6D5> <E6D5> <5B32> <E6D6> <E6D6> <5B37> <E6D7> <E6D7> <5B40> <E6D8> <E6D8> <5C15> endbfrange 100 beginbfrange <E6D9> <E6D9> <5C1C> <E6DA> <E6DA> <5B5A> <E6DB> <E6DB> <5B65> <E6DC> <E6DC> <5B73> <E6DD> <E6DD> <5B51> <E6DE> <E6DE> <5B53> <E6DF> <E6DF> <5B62> <E6E0> <E6E0> <9A75> <E6E1> <E6E2> <9A77> <E6E3> <E6E3> <9A7A> <E6E4> <E6E4> <9A7F> <E6E5> <E6E5> <9A7D> <E6E6> <E6E7> <9A80> <E6E8> <E6E8> <9A85> <E6E9> <E6E9> <9A88> <E6EA> <E6EA> <9A8A> <E6EB> <E6EB> <9A90> <E6EC> <E6ED> <9A92> <E6EE> <E6EE> <9A96> <E6EF> <E6EF> <9A98> <E6F0> <E6F2> <9A9B> <E6F3> <E6F4> <9A9F> <E6F5> <E6F6> <9AA2> <E6F7> <E6F7> <9AA5> <E6F8> <E6F8> <9AA7> <E6F9> <E6F9> <7E9F> <E6FA> <E6FA> <7EA1> <E6FB> <E6FB> <7EA3> <E6FC> <E6FC> <7EA5> <E6FD> <E6FE> <7EA8> <E7A1> <E7A1> <7EAD> <E7A2> <E7A2> <7EB0> <E7A3> <E7A3> <7EBE> <E7A4> <E7A6> <7EC0> <E7A7> <E7A7> <7EC9> <E7A8> <E7A9> <7ECB> <E7AA> <E7AA> <7ED0> <E7AB> <E7AB> <7ED4> <E7AC> <E7AC> <7ED7> <E7AD> <E7AD> <7EDB> <E7AE> <E7AF> <7EE0> <E7B0> <E7B0> <7EE8> <E7B1> <E7B1> <7EEB> <E7B2> <E7B3> <7EEE> <E7B4> <E7B5> <7EF1> <E7B6> <E7B6> <7F0D> <E7B7> <E7B7> <7EF6> <E7B8> <E7B9> <7EFA> <E7BA> <E7BA> <7EFE> <E7BB> <E7BD> <7F01> <E7BE> <E7BF> <7F07> <E7C0> <E7C1> <7F0B> <E7C2> <E7C2> <7F0F> <E7C3> <E7C4> <7F11> <E7C5> <E7C5> <7F17> <E7C6> <E7C6> <7F19> <E7C7> <E7C7> <7F1C> <E7C8> <E7C8> <7F1B> <E7C9> <E7C9> <7F1F> <E7CA> <E7D0> <7F21> <E7D1> <E7D4> <7F2A> <E7D5> <E7D9> <7F2F> <E7DA> <E7DA> <7F35> <E7DB> <E7DB> <5E7A> <E7DC> <E7DC> <757F> <E7DD> <E7DD> <5DDB> <E7DE> <E7DE> <753E> <E7DF> <E7DF> <9095> <E7E0> <E7E0> <738E> <E7E1> <E7E1> <7391> <E7E2> <E7E2> <73AE> <E7E3> <E7E3> <73A2> <E7E4> <E7E4> <739F> <E7E5> <E7E5> <73CF> <E7E6> <E7E6> <73C2> <E7E7> <E7E7> <73D1> <E7E8> <E7E8> <73B7> <E7E9> <E7E9> <73B3> <E7EA> <E7EA> <73C0> <E7EB> <E7EB> <73C9> <E7EC> <E7EC> <73C8> <E7ED> <E7ED> <73E5> <E7EE> <E7EE> <73D9> <E7EF> <E7EF> <987C> <E7F0> <E7F0> <740A> <E7F1> <E7F1> <73E9> <E7F2> <E7F2> <73E7> <E7F3> <E7F3> <73DE> <E7F4> <E7F4> <73BA> <E7F5> <E7F5> <73F2> <E7F6> <E7F6> <740F> <E7F7> <E7F7> <742A> <E7F8> <E7F8> <745B> <E7F9> <E7F9> <7426> <E7FA> <E7FA> <7425> <E7FB> <E7FB> <7428> <E7FC> <E7FC> <7430> <E7FD> <E7FD> <742E> <E7FE> <E7FE> <742C> <E8A1> <E8A1> <741B> endbfrange 100 beginbfrange <E8A2> <E8A2> <741A> <E8A3> <E8A3> <7441> <E8A4> <E8A4> <745C> <E8A5> <E8A5> <7457> <E8A6> <E8A6> <7455> <E8A7> <E8A7> <7459> <E8A8> <E8A8> <7477> <E8A9> <E8A9> <746D> <E8AA> <E8AA> <747E> <E8AB> <E8AB> <749C> <E8AC> <E8AC> <748E> <E8AD> <E8AE> <7480> <E8AF> <E8AF> <7487> <E8B0> <E8B0> <748B> <E8B1> <E8B1> <749E> <E8B2> <E8B3> <74A8> <E8B4> <E8B4> <7490> <E8B5> <E8B5> <74A7> <E8B6> <E8B6> <74D2> <E8B7> <E8B7> <74BA> <E8B8> <E8BA> <97EA> <E8BB> <E8BB> <674C> <E8BC> <E8BC> <6753> <E8BD> <E8BD> <675E> <E8BE> <E8BE> <6748> <E8BF> <E8BF> <6769> <E8C0> <E8C0> <67A5> <E8C1> <E8C1> <6787> <E8C2> <E8C2> <676A> <E8C3> <E8C3> <6773> <E8C4> <E8C4> <6798> <E8C5> <E8C5> <67A7> <E8C6> <E8C6> <6775> <E8C7> <E8C7> <67A8> <E8C8> <E8C8> <679E> <E8C9> <E8C9> <67AD> <E8CA> <E8CA> <678B> <E8CB> <E8CB> <6777> <E8CC> <E8CC> <677C> <E8CD> <E8CD> <67F0> <E8CE> <E8CE> <6809> <E8CF> <E8CF> <67D8> <E8D0> <E8D0> <680A> <E8D1> <E8D1> <67E9> <E8D2> <E8D2> <67B0> <E8D3> <E8D3> <680C> <E8D4> <E8D4> <67D9> <E8D5> <E8D5> <67B5> <E8D6> <E8D6> <67DA> <E8D7> <E8D7> <67B3> <E8D8> <E8D8> <67DD> <E8D9> <E8D9> <6800> <E8DA> <E8DA> <67C3> <E8DB> <E8DB> <67B8> <E8DC> <E8DC> <67E2> <E8DD> <E8DD> <680E> <E8DE> <E8DE> <67C1> <E8DF> <E8DF> <67FD> <E8E0> <E8E1> <6832> <E8E2> <E8E3> <6860> <E8E4> <E8E4> <684E> <E8E5> <E8E5> <6862> <E8E6> <E8E6> <6844> <E8E7> <E8E7> <6864> <E8E8> <E8E8> <6883> <E8E9> <E8E9> <681D> <E8EA> <E8EA> <6855> <E8EB> <E8EB> <6866> <E8EC> <E8EC> <6841> <E8ED> <E8ED> <6867> <E8EE> <E8EE> <6840> <E8EF> <E8EF> <683E> <E8F0> <E8F0> <684A> <E8F1> <E8F1> <6849> <E8F2> <E8F2> <6829> <E8F3> <E8F3> <68B5> <E8F4> <E8F4> <688F> <E8F5> <E8F5> <6874> <E8F6> <E8F6> <6877> <E8F7> <E8F7> <6893> <E8F8> <E8F8> <686B> <E8F9> <E8F9> <68C2> <E8FA> <E8FA> <696E> <E8FB> <E8FB> <68FC> <E8FC> <E8FD> <691F> <E8FE> <E8FE> <68F9> <E9A1> <E9A1> <6924> <E9A2> <E9A2> <68F0> <E9A3> <E9A3> <690B> <E9A4> <E9A4> <6901> <E9A5> <E9A5> <6957> <E9A6> <E9A6> <68E3> <E9A7> <E9A7> <6910> <E9A8> <E9A8> <6971> <E9A9> <E9A9> <6939> <E9AA> <E9AA> <6960> <E9AB> <E9AB> <6942> <E9AC> <E9AC> <695D> <E9AD> <E9AD> <6984> <E9AE> <E9AE> <696B> endbfrange 100 beginbfrange <E9AF> <E9AF> <6980> <E9B0> <E9B0> <6998> <E9B1> <E9B1> <6978> <E9B2> <E9B2> <6934> <E9B3> <E9B3> <69CC> <E9B4> <E9B5> <6987> <E9B6> <E9B6> <69CE> <E9B7> <E9B7> <6989> <E9B8> <E9B8> <6966> <E9B9> <E9B9> <6963> <E9BA> <E9BA> <6979> <E9BB> <E9BB> <699B> <E9BC> <E9BC> <69A7> <E9BD> <E9BD> <69BB> <E9BE> <E9BE> <69AB> <E9BF> <E9BF> <69AD> <E9C0> <E9C0> <69D4> <E9C1> <E9C1> <69B1> <E9C2> <E9C2> <69C1> <E9C3> <E9C3> <69CA> <E9C4> <E9C4> <69DF> <E9C5> <E9C5> <6995> <E9C6> <E9C6> <69E0> <E9C7> <E9C7> <698D> <E9C8> <E9C8> <69FF> <E9C9> <E9C9> <6A2F> <E9CA> <E9CA> <69ED> <E9CB> <E9CC> <6A17> <E9CD> <E9CD> <6A65> <E9CE> <E9CE> <69F2> <E9CF> <E9CF> <6A44> <E9D0> <E9D0> <6A3E> <E9D1> <E9D1> <6AA0> <E9D2> <E9D2> <6A50> <E9D3> <E9D3> <6A5B> <E9D4> <E9D4> <6A35> <E9D5> <E9D5> <6A8E> <E9D6> <E9D6> <6A79> <E9D7> <E9D7> <6A3D> <E9D8> <E9D8> <6A28> <E9D9> <E9D9> <6A58> <E9DA> <E9DA> <6A7C> <E9DB> <E9DB> <6A91> <E9DC> <E9DC> <6A90> <E9DD> <E9DD> <6AA9> <E9DE> <E9DE> <6A97> <E9DF> <E9DF> <6AAB> <E9E0> <E9E0> <7337> <E9E1> <E9E1> <7352> <E9E2> <E9E3> <6B81> <E9E4> <E9E4> <6B87> <E9E5> <E9E5> <6B84> <E9E6> <E9E7> <6B92> <E9E8> <E9E8> <6B8D> <E9E9> <E9EA> <6B9A> <E9EB> <E9EB> <6BA1> <E9EC> <E9EC> <6BAA> <E9ED> <E9ED> <8F6B> <E9EE> <E9EE> <8F6D> <E9EF> <E9F1> <8F71> <E9F2> <E9F3> <8F75> <E9F4> <E9F4> <8F78> <E9F5> <E9F5> <8F77> <E9F6> <E9F7> <8F79> <E9F8> <E9F8> <8F7C> <E9F9> <E9F9> <8F7E> <E9FA> <E9FB> <8F81> <E9FC> <E9FC> <8F84> <E9FD> <E9FD> <8F87> <E9FE> <E9FE> <8F8B> <EAA1> <EAA3> <8F8D> <EAA4> <EAA4> <8F98> <EAA5> <EAA5> <8F9A> <EAA6> <EAA6> <8ECE> <EAA7> <EAA7> <620B> <EAA8> <EAA8> <6217> <EAA9> <EAA9> <621B> <EAAA> <EAAA> <621F> <EAAB> <EAAB> <6222> <EAAC> <EAAC> <6221> <EAAD> <EAAD> <6225> <EAAE> <EAAE> <6224> <EAAF> <EAAF> <622C> <EAB0> <EAB0> <81E7> <EAB1> <EAB1> <74EF> <EAB2> <EAB2> <74F4> <EAB3> <EAB3> <74FF> <EAB4> <EAB4> <750F> <EAB5> <EAB5> <7511> <EAB6> <EAB6> <7513> <EAB7> <EAB7> <6534> <EAB8> <EABA> <65EE> <EABB> <EABB> <660A> <EABC> <EABC> <6619> <EABD> <EABD> <6772> <EABE> <EABE> <6603> <EABF> <EABF> <6615> <EAC0> <EAC0> <6600> <EAC1> <EAC1> <7085> <EAC2> <EAC2> <66F7> endbfrange 100 beginbfrange <EAC3> <EAC3> <661D> <EAC4> <EAC4> <6634> <EAC5> <EAC5> <6631> <EAC6> <EAC6> <6636> <EAC7> <EAC7> <6635> <EAC8> <EAC8> <8006> <EAC9> <EAC9> <665F> <EACA> <EACA> <6654> <EACB> <EACB> <6641> <EACC> <EACC> <664F> <EACD> <EACD> <6656> <EACE> <EACE> <6661> <EACF> <EACF> <6657> <EAD0> <EAD0> <6677> <EAD1> <EAD1> <6684> <EAD2> <EAD2> <668C> <EAD3> <EAD3> <66A7> <EAD4> <EAD4> <669D> <EAD5> <EAD5> <66BE> <EAD6> <EAD7> <66DB> <EAD8> <EAD8> <66E6> <EAD9> <EAD9> <66E9> <EADA> <EADB> <8D32> <EADC> <EADC> <8D36> <EADD> <EADD> <8D3B> <EADE> <EADE> <8D3D> <EADF> <EADF> <8D40> <EAE0> <EAE1> <8D45> <EAE2> <EAE3> <8D48> <EAE4> <EAE4> <8D47> <EAE5> <EAE5> <8D4D> <EAE6> <EAE6> <8D55> <EAE7> <EAE7> <8D59> <EAE8> <EAE8> <89C7> <EAE9> <EAEB> <89CA> <EAEC> <EAEF> <89CE> <EAF0> <EAF0> <726E> <EAF1> <EAF1> <729F> <EAF2> <EAF2> <725D> <EAF3> <EAF3> <7266> <EAF4> <EAF4> <726F> <EAF5> <EAF6> <727E> <EAF7> <EAF7> <7284> <EAF8> <EAF8> <728B> <EAF9> <EAF9> <728D> <EAFA> <EAFA> <728F> <EAFB> <EAFB> <7292> <EAFC> <EAFC> <6308> <EAFD> <EAFD> <6332> <EAFE> <EAFE> <63B0> <EBA1> <EBA1> <643F> <EBA2> <EBA2> <64D8> <EBA3> <EBA3> <8004> <EBA4> <EBA4> <6BEA> <EBA5> <EBA5> <6BF3> <EBA6> <EBA6> <6BFD> <EBA7> <EBA7> <6BF5> <EBA8> <EBA8> <6BF9> <EBA9> <EBA9> <6C05> <EBAA> <EBAA> <6C07> <EBAB> <EBAB> <6C06> <EBAC> <EBAC> <6C0D> <EBAD> <EBAD> <6C15> <EBAE> <EBB0> <6C18> <EBB1> <EBB1> <6C21> <EBB2> <EBB2> <6C29> <EBB3> <EBB3> <6C24> <EBB4> <EBB4> <6C2A> <EBB5> <EBB5> <6C32> <EBB6> <EBB6> <6535> <EBB7> <EBB7> <6555> <EBB8> <EBB8> <656B> <EBB9> <EBB9> <724D> <EBBA> <EBBA> <7252> <EBBB> <EBBB> <7256> <EBBC> <EBBC> <7230> <EBBD> <EBBD> <8662> <EBBE> <EBBE> <5216> <EBBF> <EBBF> <809F> <EBC0> <EBC0> <809C> <EBC1> <EBC1> <8093> <EBC2> <EBC2> <80BC> <EBC3> <EBC3> <670A> <EBC4> <EBC4> <80BD> <EBC5> <EBC5> <80B1> <EBC6> <EBC6> <80AB> <EBC7> <EBC7> <80AD> <EBC8> <EBC8> <80B4> <EBC9> <EBC9> <80B7> <EBCA> <EBCD> <80E7> <EBCE> <EBCE> <80DB> <EBCF> <EBCF> <80C2> <EBD0> <EBD0> <80C4> <EBD1> <EBD1> <80D9> <EBD2> <EBD2> <80CD> <EBD3> <EBD3> <80D7> <EBD4> <EBD4> <6710> <EBD5> <EBD5> <80DD> <EBD6> <EBD6> <80EB> <EBD7> <EBD7> <80F1> endbfrange 100 beginbfrange <EBD8> <EBD8> <80F4> <EBD9> <EBD9> <80ED> <EBDA> <EBDB> <810D> <EBDC> <EBDC> <80F2> <EBDD> <EBDD> <80FC> <EBDE> <EBDE> <6715> <EBDF> <EBDF> <8112> <EBE0> <EBE0> <8C5A> <EBE1> <EBE1> <8136> <EBE2> <EBE2> <811E> <EBE3> <EBE3> <812C> <EBE4> <EBE4> <8118> <EBE5> <EBE5> <8132> <EBE6> <EBE6> <8148> <EBE7> <EBE7> <814C> <EBE8> <EBE8> <8153> <EBE9> <EBE9> <8174> <EBEA> <EBEB> <8159> <EBEC> <EBEC> <8171> <EBED> <EBED> <8160> <EBEE> <EBEE> <8169> <EBEF> <EBF0> <817C> <EBF1> <EBF1> <816D> <EBF2> <EBF2> <8167> <EBF3> <EBF3> <584D> <EBF4> <EBF4> <5AB5> <EBF5> <EBF5> <8188> <EBF6> <EBF6> <8182> <EBF7> <EBF7> <8191> <EBF8> <EBF8> <6ED5> <EBF9> <EBF9> <81A3> <EBFA> <EBFA> <81AA> <EBFB> <EBFB> <81CC> <EBFC> <EBFC> <6726> <EBFD> <EBFD> <81CA> <EBFE> <EBFE> <81BB> <ECA1> <ECA1> <81C1> <ECA2> <ECA2> <81A6> <ECA3> <ECA3> <6B24> <ECA4> <ECA4> <6B37> <ECA5> <ECA5> <6B39> <ECA6> <ECA6> <6B43> <ECA7> <ECA7> <6B46> <ECA8> <ECA8> <6B59> <ECA9> <ECAB> <98D1> <ECAC> <ECAC> <98D5> <ECAD> <ECAE> <98D9> <ECAF> <ECAF> <6BB3> <ECB0> <ECB0> <5F40> <ECB1> <ECB1> <6BC2> <ECB2> <ECB2> <89F3> <ECB3> <ECB3> <6590> <ECB4> <ECB4> <9F51> <ECB5> <ECB5> <6593> <ECB6> <ECB6> <65BC> <ECB7> <ECB7> <65C6> <ECB8> <ECB8> <65C4> <ECB9> <ECB9> <65C3> <ECBA> <ECBA> <65CC> <ECBB> <ECBB> <65CE> <ECBC> <ECBC> <65D2> <ECBD> <ECBD> <65D6> <ECBE> <ECBE> <7080> <ECBF> <ECBF> <709C> <ECC0> <ECC0> <7096> <ECC1> <ECC1> <709D> <ECC2> <ECC2> <70BB> <ECC3> <ECC3> <70C0> <ECC4> <ECC4> <70B7> <ECC5> <ECC5> <70AB> <ECC6> <ECC6> <70B1> <ECC7> <ECC7> <70E8> <ECC8> <ECC8> <70CA> <ECC9> <ECC9> <7110> <ECCA> <ECCA> <7113> <ECCB> <ECCB> <7116> <ECCC> <ECCC> <712F> <ECCD> <ECCD> <7131> <ECCE> <ECCE> <7173> <ECCF> <ECCF> <715C> <ECD0> <ECD0> <7168> <ECD1> <ECD1> <7145> <ECD2> <ECD2> <7172> <ECD3> <ECD3> <714A> <ECD4> <ECD4> <7178> <ECD5> <ECD5> <717A> <ECD6> <ECD6> <7198> <ECD7> <ECD7> <71B3> <ECD8> <ECD8> <71B5> <ECD9> <ECD9> <71A8> <ECDA> <ECDA> <71A0> <ECDB> <ECDB> <71E0> <ECDC> <ECDC> <71D4> <ECDD> <ECDD> <71E7> <ECDE> <ECDE> <71F9> <ECDF> <ECDF> <721D> <ECE0> <ECE0> <7228> <ECE1> <ECE1> <706C> <ECE2> <ECE2> <7118> <ECE3> <ECE3> <7166> endbfrange 100 beginbfrange <ECE4> <ECE4> <71B9> <ECE5> <ECE5> <623E> <ECE6> <ECE6> <623D> <ECE7> <ECE7> <6243> <ECE8> <ECE9> <6248> <ECEA> <ECEA> <793B> <ECEB> <ECEB> <7940> <ECEC> <ECEC> <7946> <ECED> <ECED> <7949> <ECEE> <ECEF> <795B> <ECF0> <ECF0> <7953> <ECF1> <ECF1> <795A> <ECF2> <ECF2> <7962> <ECF3> <ECF3> <7957> <ECF4> <ECF4> <7960> <ECF5> <ECF5> <796F> <ECF6> <ECF6> <7967> <ECF7> <ECF7> <797A> <ECF8> <ECF8> <7985> <ECF9> <ECF9> <798A> <ECFA> <ECFA> <799A> <ECFB> <ECFB> <79A7> <ECFC> <ECFC> <79B3> <ECFD> <ECFD> <5FD1> <ECFE> <ECFE> <5FD0> <EDA1> <EDA1> <603C> <EDA2> <EDA2> <605D> <EDA3> <EDA3> <605A> <EDA4> <EDA4> <6067> <EDA5> <EDA5> <6041> <EDA6> <EDA6> <6059> <EDA7> <EDA7> <6063> <EDA8> <EDA8> <60AB> <EDA9> <EDA9> <6106> <EDAA> <EDAA> <610D> <EDAB> <EDAB> <615D> <EDAC> <EDAC> <61A9> <EDAD> <EDAD> <619D> <EDAE> <EDAE> <61CB> <EDAF> <EDAF> <61D1> <EDB0> <EDB0> <6206> <EDB1> <EDB1> <8080> <EDB2> <EDB2> <807F> <EDB3> <EDB3> <6C93> <EDB4> <EDB4> <6CF6> <EDB5> <EDB5> <6DFC> <EDB6> <EDB6> <77F6> <EDB7> <EDB7> <77F8> <EDB8> <EDB8> <7800> <EDB9> <EDB9> <7809> <EDBA> <EDBB> <7817> <EDBC> <EDBC> <7811> <EDBD> <EDBD> <65AB> <EDBE> <EDBE> <782D> <EDBF> <EDC0> <781C> <EDC1> <EDC3> <7839> <EDC4> <EDC4> <781F> <EDC5> <EDC5> <783C> <EDC6> <EDC6> <7825> <EDC7> <EDC7> <782C> <EDC8> <EDC8> <7823> <EDC9> <EDC9> <7829> <EDCA> <EDCA> <784E> <EDCB> <EDCB> <786D> <EDCC> <EDCD> <7856> <EDCE> <EDCE> <7826> <EDCF> <EDCF> <7850> <EDD0> <EDD0> <7847> <EDD1> <EDD1> <784C> <EDD2> <EDD2> <786A> <EDD3> <EDD3> <789B> <EDD4> <EDD4> <7893> <EDD5> <EDD5> <789A> <EDD6> <EDD6> <7887> <EDD7> <EDD7> <789C> <EDD8> <EDD8> <78A1> <EDD9> <EDD9> <78A3> <EDDA> <EDDA> <78B2> <EDDB> <EDDB> <78B9> <EDDC> <EDDC> <78A5> <EDDD> <EDDD> <78D4> <EDDE> <EDDE> <78D9> <EDDF> <EDDF> <78C9> <EDE0> <EDE0> <78EC> <EDE1> <EDE1> <78F2> <EDE2> <EDE2> <7905> <EDE3> <EDE3> <78F4> <EDE4> <EDE4> <7913> <EDE5> <EDE5> <7924> <EDE6> <EDE6> <791E> <EDE7> <EDE7> <7934> <EDE8> <EDE8> <9F9B> <EDE9> <EDE9> <9EF9> <EDEA> <EDEB> <9EFB> <EDEC> <EDEC> <76F1> <EDED> <EDED> <7704> <EDEE> <EDEE> <770D> <EDEF> <EDEF> <76F9> <EDF0> <EDF1> <7707> <EDF2> <EDF2> <771A> endbfrange 100 beginbfrange <EDF3> <EDF3> <7722> <EDF4> <EDF4> <7719> <EDF5> <EDF5> <772D> <EDF6> <EDF6> <7726> <EDF7> <EDF7> <7735> <EDF8> <EDF8> <7738> <EDF9> <EDFA> <7750> <EDFB> <EDFB> <7747> <EDFC> <EDFC> <7743> <EDFD> <EDFD> <775A> <EDFE> <EDFE> <7768> <EEA1> <EEA1> <7762> <EEA2> <EEA2> <7765> <EEA3> <EEA3> <777F> <EEA4> <EEA4> <778D> <EEA5> <EEA5> <777D> <EEA6> <EEA6> <7780> <EEA7> <EEA7> <778C> <EEA8> <EEA8> <7791> <EEA9> <EEAA> <779F> <EEAB> <EEAB> <77B0> <EEAC> <EEAC> <77B5> <EEAD> <EEAD> <77BD> <EEAE> <EEAE> <753A> <EEAF> <EEAF> <7540> <EEB0> <EEB0> <754E> <EEB1> <EEB1> <754B> <EEB2> <EEB2> <7548> <EEB3> <EEB3> <755B> <EEB4> <EEB4> <7572> <EEB5> <EEB5> <7579> <EEB6> <EEB6> <7583> <EEB7> <EEB7> <7F58> <EEB8> <EEB8> <7F61> <EEB9> <EEB9> <7F5F> <EEBA> <EEBA> <8A48> <EEBB> <EEBB> <7F68> <EEBC> <EEBC> <7F74> <EEBD> <EEBD> <7F71> <EEBE> <EEBE> <7F79> <EEBF> <EEBF> <7F81> <EEC0> <EEC0> <7F7E> <EEC1> <EEC1> <76CD> <EEC2> <EEC2> <76E5> <EEC3> <EEC3> <8832> <EEC4> <EEC6> <9485> <EEC7> <EEC7> <948B> <EEC8> <EEC8> <948A> <EEC9> <EECA> <948C> <EECB> <EECC> <948F> <EECD> <EECD> <9494> <EECE> <EECE> <9497> <EECF> <EECF> <9495> <EED0> <EED2> <949A> <EED3> <EED4> <94A3> <EED5> <EED5> <94AB> <EED6> <EED6> <94AA> <EED7> <EED7> <94AD> <EED8> <EED8> <94AC> <EED9> <EEDA> <94AF> <EEDB> <EEDB> <94B2> <EEDC> <EEDC> <94B4> <EEDD> <EEE1> <94B6> <EEE2> <EEE3> <94BC> <EEE4> <EEE4> <94BF> <EEE5> <EEE5> <94C4> <EEE6> <EEEC> <94C8> <EEED> <EEEF> <94D0> <EEF0> <EEF2> <94D5> <EEF3> <EEF3> <94D9> <EEF4> <EEF4> <94D8> <EEF5> <EEF5> <94DB> <EEF6> <EEF8> <94DE> <EEF9> <EEF9> <94E2> <EEFA> <EEFB> <94E4> <EEFC> <EEFD> <94E7> <EEFE> <EEFE> <94EA> <EFA1> <EFA1> <94E9> <EFA2> <EFA2> <94EB> <EFA3> <EFA4> <94EE> <EFA5> <EFA7> <94F3> <EFA8> <EFA8> <94F7> <EFA9> <EFA9> <94F9> <EFAA> <EFAB> <94FC> <EFAC> <EFAC> <94FF> <EFAD> <EFAD> <9503> <EFAE> <EFAE> <9502> <EFAF> <EFB0> <9506> <EFB1> <EFB2> <9509> <EFB3> <EFB5> <950D> <EFB6> <EFBA> <9512> <EFBB> <EFBB> <9518> <EFBC> <EFBC> <951B> <EFBD> <EFBF> <951D> <EFC0> <EFC0> <9522> <EFC1> <EFC2> <952A> <EFC3> <EFC3> <9529> <EFC4> <EFC4> <952C> <EFC5> <EFC6> <9531> <EFC7> <EFC7> <9534> endbfrange 100 beginbfrange <EFC8> <EFCA> <9536> <EFCB> <EFCB> <953C> <EFCC> <EFCD> <953E> <EFCE> <EFCE> <9542> <EFCF> <EFCF> <9535> <EFD0> <EFD2> <9544> <EFD3> <EFD3> <9549> <EFD4> <EFD4> <954C> <EFD5> <EFD6> <954E> <EFD7> <EFD9> <9552> <EFDA> <EFDD> <9556> <EFDE> <EFDE> <955B> <EFDF> <EFE0> <955E> <EFE1> <EFE1> <955D> <EFE2> <EFE3> <9561> <EFE4> <EFEC> <9564> <EFED> <EFED> <956F> <EFEE> <EFF0> <9571> <EFF1> <EFF1> <953A> <EFF2> <EFF2> <77E7> <EFF3> <EFF3> <77EC> <EFF4> <EFF4> <96C9> <EFF5> <EFF5> <79D5> <EFF6> <EFF6> <79ED> <EFF7> <EFF7> <79E3> <EFF8> <EFF8> <79EB> <EFF9> <EFF9> <7A06> <EFFA> <EFFA> <5D47> <EFFB> <EFFB> <7A03> <EFFC> <EFFC> <7A02> <EFFD> <EFFD> <7A1E> <EFFE> <EFFE> <7A14> <F0A1> <F0A1> <7A39> <F0A2> <F0A2> <7A37> <F0A3> <F0A3> <7A51> <F0A4> <F0A4> <9ECF> <F0A5> <F0A5> <99A5> <F0A6> <F0A6> <7A70> <F0A7> <F0A7> <7688> <F0A8> <F0A8> <768E> <F0A9> <F0A9> <7693> <F0AA> <F0AA> <7699> <F0AB> <F0AB> <76A4> <F0AC> <F0AC> <74DE> <F0AD> <F0AD> <74E0> <F0AE> <F0AE> <752C> <F0AF> <F0AF> <9E20> <F0B0> <F0B0> <9E22> <F0B1> <F0B5> <9E28> <F0B6> <F0B6> <9E32> <F0B7> <F0B7> <9E31> <F0B8> <F0B8> <9E36> <F0B9> <F0B9> <9E38> <F0BA> <F0BA> <9E37> <F0BB> <F0BC> <9E39> <F0BD> <F0BD> <9E3E> <F0BE> <F0BF> <9E41> <F0C0> <F0C0> <9E44> <F0C1> <F0C4> <9E46> <F0C5> <F0C6> <9E4B> <F0C7> <F0C7> <9E4E> <F0C8> <F0C8> <9E51> <F0C9> <F0C9> <9E55> <F0CA> <F0CA> <9E57> <F0CB> <F0CD> <9E5A> <F0CE> <F0CE> <9E5E> <F0CF> <F0CF> <9E63> <F0D0> <F0D6> <9E66> <F0D7> <F0D7> <9E71> <F0D8> <F0D8> <9E6D> <F0D9> <F0D9> <9E73> <F0DA> <F0DA> <7592> <F0DB> <F0DB> <7594> <F0DC> <F0DC> <7596> <F0DD> <F0DD> <75A0> <F0DE> <F0DE> <759D> <F0DF> <F0DF> <75AC> <F0E0> <F0E0> <75A3> <F0E1> <F0E2> <75B3> <F0E3> <F0E3> <75B8> <F0E4> <F0E4> <75C4> <F0E5> <F0E5> <75B1> <F0E6> <F0E6> <75B0> <F0E7> <F0E7> <75C3> <F0E8> <F0E8> <75C2> <F0E9> <F0E9> <75D6> <F0EA> <F0EA> <75CD> <F0EB> <F0EB> <75E3> <F0EC> <F0EC> <75E8> <F0ED> <F0ED> <75E6> <F0EE> <F0EE> <75E4> <F0EF> <F0EF> <75EB> <F0F0> <F0F0> <75E7> <F0F1> <F0F1> <7603> <F0F2> <F0F2> <75F1> <F0F3> <F0F3> <75FC> <F0F4> <F0F4> <75FF> <F0F5> <F0F5> <7610> <F0F6> <F0F6> <7600> <F0F7> <F0F7> <7605> endbfrange 100 beginbfrange <F0F8> <F0F8> <760C> <F0F9> <F0F9> <7617> <F0FA> <F0FA> <760A> <F0FB> <F0FB> <7625> <F0FC> <F0FC> <7618> <F0FD> <F0FD> <7615> <F0FE> <F0FE> <7619> <F1A1> <F1A1> <761B> <F1A2> <F1A2> <763C> <F1A3> <F1A3> <7622> <F1A4> <F1A4> <7620> <F1A5> <F1A5> <7640> <F1A6> <F1A6> <762D> <F1A7> <F1A7> <7630> <F1A8> <F1A8> <763F> <F1A9> <F1A9> <7635> <F1AA> <F1AA> <7643> <F1AB> <F1AB> <763E> <F1AC> <F1AC> <7633> <F1AD> <F1AD> <764D> <F1AE> <F1AE> <765E> <F1AF> <F1AF> <7654> <F1B0> <F1B0> <765C> <F1B1> <F1B1> <7656> <F1B2> <F1B2> <766B> <F1B3> <F1B3> <766F> <F1B4> <F1B4> <7FCA> <F1B5> <F1B5> <7AE6> <F1B6> <F1B7> <7A78> <F1B8> <F1B8> <7A80> <F1B9> <F1B9> <7A86> <F1BA> <F1BA> <7A88> <F1BB> <F1BB> <7A95> <F1BC> <F1BC> <7AA6> <F1BD> <F1BD> <7AA0> <F1BE> <F1BE> <7AAC> <F1BF> <F1BF> <7AA8> <F1C0> <F1C0> <7AAD> <F1C1> <F1C1> <7AB3> <F1C2> <F1C2> <8864> <F1C3> <F1C3> <8869> <F1C4> <F1C4> <8872> <F1C5> <F1C5> <887D> <F1C6> <F1C6> <887F> <F1C7> <F1C7> <8882> <F1C8> <F1C8> <88A2> <F1C9> <F1C9> <88C6> <F1CA> <F1CA> <88B7> <F1CB> <F1CB> <88BC> <F1CC> <F1CC> <88C9> <F1CD> <F1CD> <88E2> <F1CE> <F1CE> <88CE> <F1CF> <F1CF> <88E3> <F1D0> <F1D0> <88E5> <F1D1> <F1D1> <88F1> <F1D2> <F1D2> <891A> <F1D3> <F1D3> <88FC> <F1D4> <F1D4> <88E8> <F1D5> <F1D5> <88FE> <F1D6> <F1D6> <88F0> <F1D7> <F1D7> <8921> <F1D8> <F1D8> <8919> <F1D9> <F1D9> <8913> <F1DA> <F1DA> <891B> <F1DB> <F1DB> <890A> <F1DC> <F1DC> <8934> <F1DD> <F1DD> <892B> <F1DE> <F1DE> <8936> <F1DF> <F1DF> <8941> <F1E0> <F1E0> <8966> <F1E1> <F1E1> <897B> <F1E2> <F1E2> <758B> <F1E3> <F1E3> <80E5> <F1E4> <F1E4> <76B2> <F1E5> <F1E5> <76B4> <F1E6> <F1E6> <77DC> <F1E7> <F1E7> <8012> <F1E8> <F1E8> <8014> <F1E9> <F1E9> <8016> <F1EA> <F1EA> <801C> <F1EB> <F1EB> <8020> <F1EC> <F1EC> <8022> <F1ED> <F1EF> <8025> <F1F0> <F1F0> <8029> <F1F1> <F1F1> <8028> <F1F2> <F1F2> <8031> <F1F3> <F1F3> <800B> <F1F4> <F1F4> <8035> <F1F5> <F1F5> <8043> <F1F6> <F1F6> <8046> <F1F7> <F1F7> <804D> <F1F8> <F1F8> <8052> <F1F9> <F1F9> <8069> <F1FA> <F1FA> <8071> <F1FB> <F1FB> <8983> <F1FC> <F1FC> <9878> <F1FD> <F1FD> <9880> <F1FE> <F1FE> <9883> <F2A1> <F2A1> <9889> <F2A2> <F2A3> <988C> endbfrange 100 beginbfrange <F2A4> <F2A4> <988F> <F2A5> <F2A5> <9894> <F2A6> <F2A7> <989A> <F2A8> <F2A9> <989E> <F2AA> <F2AB> <98A1> <F2AC> <F2AD> <98A5> <F2AE> <F2AE> <864D> <F2AF> <F2AF> <8654> <F2B0> <F2B0> <866C> <F2B1> <F2B1> <866E> <F2B2> <F2B2> <867F> <F2B3> <F2B3> <867A> <F2B4> <F2B4> <867C> <F2B5> <F2B5> <867B> <F2B6> <F2B6> <86A8> <F2B7> <F2B7> <868D> <F2B8> <F2B8> <868B> <F2B9> <F2B9> <86AC> <F2BA> <F2BA> <869D> <F2BB> <F2BB> <86A7> <F2BC> <F2BC> <86A3> <F2BD> <F2BD> <86AA> <F2BE> <F2BE> <8693> <F2BF> <F2BF> <86A9> <F2C0> <F2C0> <86B6> <F2C1> <F2C1> <86C4> <F2C2> <F2C2> <86B5> <F2C3> <F2C3> <86CE> <F2C4> <F2C4> <86B0> <F2C5> <F2C5> <86BA> <F2C6> <F2C6> <86B1> <F2C7> <F2C7> <86AF> <F2C8> <F2C8> <86C9> <F2C9> <F2C9> <86CF> <F2CA> <F2CA> <86B4> <F2CB> <F2CB> <86E9> <F2CC> <F2CD> <86F1> <F2CE> <F2CE> <86ED> <F2CF> <F2CF> <86F3> <F2D0> <F2D0> <86D0> <F2D1> <F2D1> <8713> <F2D2> <F2D2> <86DE> <F2D3> <F2D3> <86F4> <F2D4> <F2D4> <86DF> <F2D5> <F2D5> <86D8> <F2D6> <F2D6> <86D1> <F2D7> <F2D7> <8703> <F2D8> <F2D8> <8707> <F2D9> <F2D9> <86F8> <F2DA> <F2DA> <8708> <F2DB> <F2DB> <870A> <F2DC> <F2DC> <870D> <F2DD> <F2DD> <8709> <F2DE> <F2DE> <8723> <F2DF> <F2DF> <873B> <F2E0> <F2E0> <871E> <F2E1> <F2E1> <8725> <F2E2> <F2E2> <872E> <F2E3> <F2E3> <871A> <F2E4> <F2E4> <873E> <F2E5> <F2E5> <8748> <F2E6> <F2E6> <8734> <F2E7> <F2E7> <8731> <F2E8> <F2E8> <8729> <F2E9> <F2E9> <8737> <F2EA> <F2EA> <873F> <F2EB> <F2EB> <8782> <F2EC> <F2EC> <8722> <F2ED> <F2EE> <877D> <F2EF> <F2EF> <877B> <F2F0> <F2F0> <8760> <F2F1> <F2F1> <8770> <F2F2> <F2F2> <874C> <F2F3> <F2F3> <876E> <F2F4> <F2F4> <878B> <F2F5> <F2F5> <8753> <F2F6> <F2F6> <8763> <F2F7> <F2F7> <877C> <F2F8> <F2F8> <8764> <F2F9> <F2F9> <8759> <F2FA> <F2FA> <8765> <F2FB> <F2FB> <8793> <F2FC> <F2FC> <87AF> <F2FD> <F2FD> <87A8> <F2FE> <F2FE> <87D2> <F3A1> <F3A1> <87C6> <F3A2> <F3A2> <8788> <F3A3> <F3A3> <8785> <F3A4> <F3A4> <87AD> <F3A5> <F3A5> <8797> <F3A6> <F3A6> <8783> <F3A7> <F3A7> <87AB> <F3A8> <F3A8> <87E5> <F3A9> <F3A9> <87AC> <F3AA> <F3AA> <87B5> <F3AB> <F3AB> <87B3> <F3AC> <F3AC> <87CB> <F3AD> <F3AD> <87D3> <F3AE> <F3AE> <87BD> <F3AF> <F3AF> <87D1> endbfrange 100 beginbfrange <F3B0> <F3B0> <87C0> <F3B1> <F3B1> <87CA> <F3B2> <F3B2> <87DB> <F3B3> <F3B3> <87EA> <F3B4> <F3B4> <87E0> <F3B5> <F3B5> <87EE> <F3B6> <F3B6> <8816> <F3B7> <F3B7> <8813> <F3B8> <F3B8> <87FE> <F3B9> <F3B9> <880A> <F3BA> <F3BA> <881B> <F3BB> <F3BB> <8821> <F3BC> <F3BC> <8839> <F3BD> <F3BD> <883C> <F3BE> <F3BE> <7F36> <F3BF> <F3BF> <7F42> <F3C0> <F3C1> <7F44> <F3C2> <F3C2> <8210> <F3C3> <F3C3> <7AFA> <F3C4> <F3C4> <7AFD> <F3C5> <F3C5> <7B08> <F3C6> <F3C7> <7B03> <F3C8> <F3C8> <7B15> <F3C9> <F3C9> <7B0A> <F3CA> <F3CA> <7B2B> <F3CB> <F3CB> <7B0F> <F3CC> <F3CC> <7B47> <F3CD> <F3CD> <7B38> <F3CE> <F3CE> <7B2A> <F3CF> <F3CF> <7B19> <F3D0> <F3D0> <7B2E> <F3D1> <F3D1> <7B31> <F3D2> <F3D2> <7B20> <F3D3> <F3D3> <7B25> <F3D4> <F3D4> <7B24> <F3D5> <F3D5> <7B33> <F3D6> <F3D6> <7B3E> <F3D7> <F3D7> <7B1E> <F3D8> <F3D8> <7B58> <F3D9> <F3D9> <7B5A> <F3DA> <F3DA> <7B45> <F3DB> <F3DB> <7B75> <F3DC> <F3DC> <7B4C> <F3DD> <F3DD> <7B5D> <F3DE> <F3DE> <7B60> <F3DF> <F3DF> <7B6E> <F3E0> <F3E0> <7B7B> <F3E1> <F3E1> <7B62> <F3E2> <F3E2> <7B72> <F3E3> <F3E3> <7B71> <F3E4> <F3E4> <7B90> <F3E5> <F3E6> <7BA6> <F3E7> <F3E7> <7BB8> <F3E8> <F3E8> <7BAC> <F3E9> <F3E9> <7B9D> <F3EA> <F3EA> <7BA8> <F3EB> <F3EB> <7B85> <F3EC> <F3EC> <7BAA> <F3ED> <F3ED> <7B9C> <F3EE> <F3EE> <7BA2> <F3EF> <F3EF> <7BAB> <F3F0> <F3F0> <7BB4> <F3F1> <F3F1> <7BD1> <F3F2> <F3F2> <7BC1> <F3F3> <F3F3> <7BCC> <F3F4> <F3F4> <7BDD> <F3F5> <F3F5> <7BDA> <F3F6> <F3F7> <7BE5> <F3F8> <F3F8> <7BEA> <F3F9> <F3F9> <7C0C> <F3FA> <F3FA> <7BFE> <F3FB> <F3FB> <7BFC> <F3FC> <F3FC> <7C0F> <F3FD> <F3FD> <7C16> <F3FE> <F3FE> <7C0B> <F4A1> <F4A1> <7C1F> <F4A2> <F4A2> <7C2A> <F4A3> <F4A3> <7C26> <F4A4> <F4A4> <7C38> <F4A5> <F4A5> <7C41> <F4A6> <F4A6> <7C40> <F4A7> <F4A7> <81FE> <F4A8> <F4A9> <8201> <F4AA> <F4AA> <8204> <F4AB> <F4AB> <81EC> <F4AC> <F4AC> <8844> <F4AD> <F4AF> <8221> <F4B0> <F4B0> <822D> <F4B1> <F4B1> <822F> <F4B2> <F4B2> <8228> <F4B3> <F4B3> <822B> <F4B4> <F4B4> <8238> <F4B5> <F4B5> <823B> <F4B6> <F4B7> <8233> <F4B8> <F4B8> <823E> <F4B9> <F4B9> <8244> <F4BA> <F4BA> <8249> <F4BB> <F4BB> <824B> <F4BC> <F4BC> <824F> <F4BD> <F4BD> <825A> endbfrange 100 beginbfrange <F4BE> <F4BE> <825F> <F4BF> <F4BF> <8268> <F4C0> <F4C0> <887E> <F4C1> <F4C1> <8885> <F4C2> <F4C2> <8888> <F4C3> <F4C3> <88D8> <F4C4> <F4C4> <88DF> <F4C5> <F4C5> <895E> <F4C6> <F4C6> <7F9D> <F4C7> <F4C7> <7F9F> <F4C8> <F4C8> <7FA7> <F4C9> <F4CA> <7FAF> <F4CB> <F4CB> <7FB2> <F4CC> <F4CC> <7C7C> <F4CD> <F4CD> <6549> <F4CE> <F4CE> <7C91> <F4CF> <F4CF> <7C9D> <F4D0> <F4D0> <7C9C> <F4D1> <F4D1> <7C9E> <F4D2> <F4D2> <7CA2> <F4D3> <F4D3> <7CB2> <F4D4> <F4D5> <7CBC> <F4D6> <F4D6> <7CC1> <F4D7> <F4D7> <7CC7> <F4D8> <F4D9> <7CCC> <F4DA> <F4DA> <7CC8> <F4DB> <F4DB> <7CC5> <F4DC> <F4DC> <7CD7> <F4DD> <F4DD> <7CE8> <F4DE> <F4DE> <826E> <F4DF> <F4DF> <66A8> <F4E0> <F4E0> <7FBF> <F4E1> <F4E1> <7FCE> <F4E2> <F4E2> <7FD5> <F4E3> <F4E3> <7FE5> <F4E4> <F4E4> <7FE1> <F4E5> <F4E5> <7FE6> <F4E6> <F4E6> <7FE9> <F4E7> <F4E7> <7FEE> <F4E8> <F4E8> <7FF3> <F4E9> <F4E9> <7CF8> <F4EA> <F4EA> <7D77> <F4EB> <F4EB> <7DA6> <F4EC> <F4EC> <7DAE> <F4ED> <F4ED> <7E47> <F4EE> <F4EE> <7E9B> <F4EF> <F4EF> <9EB8> <F4F0> <F4F0> <9EB4> <F4F1> <F4F1> <8D73> <F4F2> <F4F2> <8D84> <F4F3> <F4F3> <8D94> <F4F4> <F4F4> <8D91> <F4F5> <F4F5> <8DB1> <F4F6> <F4F6> <8D67> <F4F7> <F4F7> <8D6D> <F4F8> <F4F8> <8C47> <F4F9> <F4F9> <8C49> <F4FA> <F4FA> <914A> <F4FB> <F4FB> <9150> <F4FC> <F4FD> <914E> <F4FE> <F4FE> <9164> <F5A1> <F5A1> <9162> <F5A2> <F5A2> <9161> <F5A3> <F5A3> <9170> <F5A4> <F5A4> <9169> <F5A5> <F5A5> <916F> <F5A6> <F5A7> <917D> <F5A8> <F5A8> <9172> <F5A9> <F5A9> <9174> <F5AA> <F5AA> <9179> <F5AB> <F5AB> <918C> <F5AC> <F5AC> <9185> <F5AD> <F5AD> <9190> <F5AE> <F5AE> <918D> <F5AF> <F5AF> <9191> <F5B0> <F5B1> <91A2> <F5B2> <F5B2> <91AA> <F5B3> <F5B5> <91AD> <F5B6> <F5B6> <91B5> <F5B7> <F5B7> <91B4> <F5B8> <F5B8> <91BA> <F5B9> <F5B9> <8C55> <F5BA> <F5BA> <9E7E> <F5BB> <F5BB> <8DB8> <F5BC> <F5BC> <8DEB> <F5BD> <F5BD> <8E05> <F5BE> <F5BE> <8E59> <F5BF> <F5BF> <8E69> <F5C0> <F5C0> <8DB5> <F5C1> <F5C1> <8DBF> <F5C2> <F5C2> <8DBC> <F5C3> <F5C3> <8DBA> <F5C4> <F5C4> <8DC4> <F5C5> <F5C6> <8DD6> <F5C7> <F5C7> <8DDA> <F5C8> <F5C8> <8DDE> <F5C9> <F5CA> <8DCE> <F5CB> <F5CB> <8DDB> <F5CC> <F5CC> <8DC6> <F5CD> <F5CD> <8DEC> endbfrange 100 beginbfrange <F5CE> <F5CF> <8DF7> <F5D0> <F5D0> <8DE3> <F5D1> <F5D1> <8DF9> <F5D2> <F5D2> <8DFB> <F5D3> <F5D3> <8DE4> <F5D4> <F5D4> <8E09> <F5D5> <F5D5> <8DFD> <F5D6> <F5D6> <8E14> <F5D7> <F5D7> <8E1D> <F5D8> <F5D8> <8E1F> <F5D9> <F5D9> <8E2C> <F5DA> <F5DA> <8E2E> <F5DB> <F5DB> <8E23> <F5DC> <F5DC> <8E2F> <F5DD> <F5DD> <8E3A> <F5DE> <F5DE> <8E40> <F5DF> <F5DF> <8E39> <F5E0> <F5E0> <8E35> <F5E1> <F5E1> <8E3D> <F5E2> <F5E2> <8E31> <F5E3> <F5E3> <8E49> <F5E4> <F5E5> <8E41> <F5E6> <F5E7> <8E51> <F5E8> <F5E8> <8E4A> <F5E9> <F5E9> <8E70> <F5EA> <F5EA> <8E76> <F5EB> <F5EB> <8E7C> <F5EC> <F5EC> <8E6F> <F5ED> <F5ED> <8E74> <F5EE> <F5EE> <8E85> <F5EF> <F5EF> <8E8F> <F5F0> <F5F0> <8E94> <F5F1> <F5F1> <8E90> <F5F2> <F5F2> <8E9C> <F5F3> <F5F3> <8E9E> <F5F4> <F5F4> <8C78> <F5F5> <F5F5> <8C82> <F5F6> <F5F6> <8C8A> <F5F7> <F5F7> <8C85> <F5F8> <F5F8> <8C98> <F5F9> <F5F9> <8C94> <F5FA> <F5FA> <659B> <F5FB> <F5FB> <89D6> <F5FC> <F5FC> <89DE> <F5FD> <F5FD> <89DA> <F5FE> <F5FE> <89DC> <F6A1> <F6A1> <89E5> <F6A2> <F6A2> <89EB> <F6A3> <F6A3> <89EF> <F6A4> <F6A4> <8A3E> <F6A5> <F6A5> <8B26> <F6A6> <F6A6> <9753> <F6A7> <F6A7> <96E9> <F6A8> <F6A8> <96F3> <F6A9> <F6A9> <96EF> <F6AA> <F6AA> <9706> <F6AB> <F6AB> <9701> <F6AC> <F6AC> <9708> <F6AD> <F6AD> <970F> <F6AE> <F6AE> <970E> <F6AF> <F6AF> <972A> <F6B0> <F6B0> <972D> <F6B1> <F6B1> <9730> <F6B2> <F6B2> <973E> <F6B3> <F6B3> <9F80> <F6B4> <F6B4> <9F83> <F6B5> <F6BA> <9F85> <F6BB> <F6BB> <9F8C> <F6BC> <F6BC> <9EFE> <F6BD> <F6BD> <9F0B> <F6BE> <F6BE> <9F0D> <F6BF> <F6BF> <96B9> <F6C0> <F6C1> <96BC> <F6C2> <F6C2> <96CE> <F6C3> <F6C3> <96D2> <F6C4> <F6C4> <77BF> <F6C5> <F6C5> <96E0> <F6C6> <F6C6> <928E> <F6C7> <F6C7> <92AE> <F6C8> <F6C8> <92C8> <F6C9> <F6C9> <933E> <F6CA> <F6CA> <936A> <F6CB> <F6CB> <93CA> <F6CC> <F6CC> <938F> <F6CD> <F6CD> <943E> <F6CE> <F6CE> <946B> <F6CF> <F6CF> <9C7F> <F6D0> <F6D0> <9C82> <F6D1> <F6D4> <9C85> <F6D5> <F6D5> <7A23> <F6D6> <F6D6> <9C8B> <F6D7> <F6D7> <9C8E> <F6D8> <F6DA> <9C90> <F6DB> <F6DC> <9C94> <F6DD> <F6DE> <9C9A> <F6DF> <F6E4> <9C9E> <F6E5> <F6E9> <9CA5> <F6EA> <F6EA> <9CAB> <F6EB> <F6EC> <9CAD> <F6ED> <F6F4> <9CB0> endbfrange 81 beginbfrange <F6F5> <F6F8> <9CBA> <F6F9> <F6FC> <9CC4> <F6FD> <F6FE> <9CCA> <F7A1> <F7A5> <9CCC> <F7A6> <F7A8> <9CD3> <F7A9> <F7AB> <9CD7> <F7AC> <F7AD> <9CDC> <F7AE> <F7AE> <9CDF> <F7AF> <F7AF> <9CE2> <F7B0> <F7B0> <977C> <F7B1> <F7B1> <9785> <F7B2> <F7B3> <9791> <F7B4> <F7B4> <9794> <F7B5> <F7B5> <97AF> <F7B6> <F7B6> <97AB> <F7B7> <F7B7> <97A3> <F7B8> <F7B8> <97B2> <F7B9> <F7B9> <97B4> <F7BA> <F7BA> <9AB1> <F7BB> <F7BB> <9AB0> <F7BC> <F7BC> <9AB7> <F7BD> <F7BD> <9E58> <F7BE> <F7BE> <9AB6> <F7BF> <F7BF> <9ABA> <F7C0> <F7C0> <9ABC> <F7C1> <F7C1> <9AC1> <F7C2> <F7C2> <9AC0> <F7C3> <F7C3> <9AC5> <F7C4> <F7C4> <9AC2> <F7C5> <F7C6> <9ACB> <F7C7> <F7C7> <9AD1> <F7C8> <F7C8> <9B45> <F7C9> <F7C9> <9B43> <F7CA> <F7CA> <9B47> <F7CB> <F7CB> <9B49> <F7CC> <F7CC> <9B48> <F7CD> <F7CD> <9B4D> <F7CE> <F7CE> <9B51> <F7CF> <F7CF> <98E8> <F7D0> <F7D0> <990D> <F7D1> <F7D1> <992E> <F7D2> <F7D2> <9955> <F7D3> <F7D3> <9954> <F7D4> <F7D4> <9ADF> <F7D5> <F7D5> <9AE1> <F7D6> <F7D6> <9AE6> <F7D7> <F7D7> <9AEF> <F7D8> <F7D8> <9AEB> <F7D9> <F7D9> <9AFB> <F7DA> <F7DA> <9AED> <F7DB> <F7DB> <9AF9> <F7DC> <F7DC> <9B08> <F7DD> <F7DD> <9B0F> <F7DE> <F7DE> <9B13> <F7DF> <F7DF> <9B1F> <F7E0> <F7E0> <9B23> <F7E1> <F7E2> <9EBD> <F7E3> <F7E3> <7E3B> <F7E4> <F7E4> <9E82> <F7E5> <F7E6> <9E87> <F7E7> <F7E7> <9E8B> <F7E8> <F7E8> <9E92> <F7E9> <F7E9> <93D6> <F7EA> <F7EA> <9E9D> <F7EB> <F7EB> <9E9F> <F7EC> <F7EE> <9EDB> <F7EF> <F7EF> <9EE0> <F7F0> <F7F0> <9EDF> <F7F1> <F7F1> <9EE2> <F7F2> <F7F2> <9EE9> <F7F3> <F7F3> <9EE7> <F7F4> <F7F4> <9EE5> <F7F5> <F7F5> <9EEA> <F7F6> <F7F6> <9EEF> <F7F7> <F7F7> <9F22> <F7F8> <F7F8> <9F2C> <F7F9> <F7F9> <9F2F> <F7FA> <F7FA> <9F39> <F7FB> <F7FB> <9F37> <F7FC> <F7FD> <9F3D> <F7FE> <F7FE> <9F44> endbfrange endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF \ No newline at end of file
diff --git a/src/main/resources/Resources/cmap/GBpc-EUC-V b/src/main/resources/Resources/cmap/GBpc-EUC-V
new file mode 100644
index 0000000..5698c4b
--- /dev/null
+++ b/src/main/resources/Resources/cmap/GBpc-EUC-V
@@ -0,0 +1 @@
+%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%DocumentNeededResources: CMap (GBpc-EUC-H) %%IncludeResource: ProcSet (CIDInit) %%IncludeResource: CMap (GBpc-EUC-H) %%BeginResource: CMap (GBpc-EUC-V) %%Title: (GBpc-EUC-V Adobe GB1 0) %%Version: 9.001 %%Copyright: ----------------------------------------------------------- %%Copyright: Copyright 1990-1998 Adobe Systems Incorporated. %%Copyright: All Rights Reserved. %%Copyright: %%Copyright: Patents Pending %%Copyright: %%Copyright: NOTICE: All information contained herein is the property %%Copyright: of Adobe Systems Incorporated. %%Copyright: %%Copyright: Permission is granted for redistribution of this file %%Copyright: provided this copyright notice is maintained intact and %%Copyright: that the contents of this file are not altered in any %%Copyright: way from its original form. %%Copyright: %%Copyright: PostScript and Display PostScript are trademarks of %%Copyright: Adobe Systems Incorporated which may be registered in %%Copyright: certain jurisdictions. %%Copyright: ----------------------------------------------------------- %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /GBpc-EUC-H usecmap /CIDSystemInfo 3 dict dup begin /Registry (Adobe) def /Ordering (GB1) def /Supplement 0 def end def /CMapName /GBpc-EUC-V def /CMapVersion 9.001 def /CMapType 1 def /UIDOffset 300 def /XUID [1 10 25365] def /WMode 1 def 20 begincidrange <a1a2> <a1a2> 575 <a1a3> <a1a3> 574 <a1aa> <a1aa> 598 <a1ab> <a1ac> 7704 <a1ad> <a1ad> 599 <a1b2> <a1bf> 582 <a1fe> <a1fe> 7706 <a3a1> <a3a1> 578 <a3a8> <a3a9> 580 <a3ac> <a3ac> 573 <a3ae> <a3ae> 7707 <a3ba> <a3bb> 576 <a3bd> <a3bd> 7708 <a3bf> <a3bf> 579 <a3db> <a3db> 7709 <a3dd> <a3dd> 7710 <a3df> <a3df> 600 <a3fb> <a3fb> 596 <a3fd> <a3fd> 597 <a3fe> <a3fe> 7711 endcidrange endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF \ No newline at end of file
diff --git a/src/main/resources/Resources/cmap/H b/src/main/resources/Resources/cmap/H
new file mode 100644
index 0000000..5f364b0
--- /dev/null
+++ b/src/main/resources/Resources/cmap/H
@@ -0,0 +1 @@
+%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%IncludeResource: ProcSet (CIDInit) %%BeginResource: CMap (H) %%Title: (H Adobe Japan1 1) %%Version: 10.001 %%Copyright: ----------------------------------------------------------- %%Copyright: Copyright 1990-1998 Adobe Systems Incorporated. %%Copyright: All Rights Reserved. %%Copyright: %%Copyright: Patents Pending %%Copyright: %%Copyright: NOTICE: All information contained herein is the property %%Copyright: of Adobe Systems Incorporated. %%Copyright: %%Copyright: Permission is granted for redistribution of this file %%Copyright: provided this copyright notice is maintained intact and %%Copyright: that the contents of this file are not altered in any %%Copyright: way from its original form. %%Copyright: %%Copyright: PostScript and Display PostScript are trademarks of %%Copyright: Adobe Systems Incorporated which may be registered in %%Copyright: certain jurisdictions. %%Copyright: ----------------------------------------------------------- %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo 3 dict dup begin /Registry (Adobe) def /Ordering (Japan1) def /Supplement 1 def end def /CMapName /H def /CMapVersion 10.001 def /CMapType 1 def /UIDOffset 280 def /XUID [1 10 25335] def /WMode 0 def 1 begincodespacerange <2121> <7E7E> endcodespacerange 100 begincidrange <2121> <217e> 633 <2221> <222e> 727 <223a> <2241> 741 <224a> <2250> 749 <225c> <226a> 756 <2272> <2279> 771 <227e> <227e> 779 <2330> <2339> 780 <2341> <235a> 790 <2361> <237a> 816 <2421> <2473> 842 <2521> <2576> 925 <2621> <2638> 1011 <2641> <2658> 1035 <2721> <2741> 1059 <2751> <2771> 1092 <2821> <2821> 7479 <2822> <2822> 7481 <2823> <2823> 7491 <2824> <2824> 7495 <2825> <2825> 7503 <2826> <2826> 7499 <2827> <2827> 7507 <2828> <2828> 7523 <2829> <2829> 7515 <282a> <282a> 7531 <282b> <282b> 7539 <282c> <282c> 7480 <282d> <282d> 7482 <282e> <282e> 7494 <282f> <282f> 7498 <2830> <2830> 7506 <2831> <2831> 7502 <2832> <2832> 7514 <2833> <2833> 7530 <2834> <2834> 7522 <2835> <2835> 7538 <2836> <2836> 7554 <2837> <2837> 7511 <2838> <2838> 7526 <2839> <2839> 7519 <283a> <283a> 7534 <283b> <283b> 7542 <283c> <283c> 7508 <283d> <283d> 7527 <283e> <283e> 7516 <283f> <283f> 7535 <2840> <2840> 7545 <3021> <307e> 1125 <3121> <317e> 1219 <3221> <327e> 1313 <3321> <337e> 1407 <3421> <347e> 1501 <3521> <357e> 1595 <3621> <367e> 1689 <3721> <377e> 1783 <3821> <387e> 1877 <3921> <397e> 1971 <3a21> <3a7e> 2065 <3b21> <3b7e> 2159 <3c21> <3c7e> 2253 <3d21> <3d7e> 2347 <3e21> <3e7e> 2441 <3f21> <3f7e> 2535 <4021> <407e> 2629 <4121> <417e> 2723 <4221> <427e> 2817 <4321> <437e> 2911 <4421> <447e> 3005 <4521> <457e> 3099 <4621> <467e> 3193 <4721> <477e> 3287 <4821> <487e> 3381 <4921> <497e> 3475 <4a21> <4a7e> 3569 <4b21> <4b7e> 3663 <4c21> <4c7e> 3757 <4d21> <4d7e> 3851 <4e21> <4e7e> 3945 <4f21> <4f53> 4039 <5021> <507e> 4090 <5121> <517e> 4184 <5221> <527e> 4278 <5321> <537e> 4372 <5421> <547e> 4466 <5521> <557e> 4560 <5621> <567e> 4654 <5721> <577e> 4748 <5821> <587e> 4842 <5921> <597e> 4936 <5a21> <5a7e> 5030 <5b21> <5b7e> 5124 <5c21> <5c7e> 5218 <5d21> <5d7e> 5312 <5e21> <5e7e> 5406 <5f21> <5f7e> 5500 <6021> <607e> 5594 <6121> <617e> 5688 <6221> <627e> 5782 <6321> <637e> 5876 endcidrange 18 begincidrange <6421> <647e> 5970 <6521> <657e> 6064 <6621> <667e> 6158 <6721> <677e> 6252 <6821> <687e> 6346 <6921> <697e> 6440 <6a21> <6a7e> 6534 <6b21> <6b7e> 6628 <6c21> <6c7e> 6722 <6d21> <6d7e> 6816 <6e21> <6e7e> 6910 <6f21> <6f7e> 7004 <7021> <707e> 7098 <7121> <717e> 7192 <7221> <727e> 7286 <7321> <737e> 7380 <7421> <7424> 7474 <7425> <7426> 8284 endcidrange endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF \ No newline at end of file
diff --git a/src/main/resources/Resources/cmap/HKdla-B5-H b/src/main/resources/Resources/cmap/HKdla-B5-H
new file mode 100644
index 0000000..6cdd194
--- /dev/null
+++ b/src/main/resources/Resources/cmap/HKdla-B5-H
@@ -0,0 +1,1116 @@
+%!PS-Adobe-3.0 Resource-CMap
+%%DocumentNeededResources: ProcSet (CIDInit)
+%%IncludeResource: ProcSet (CIDInit)
+%%BeginResource: CMap (HKdla-B5-H)
+%%Title: (HKdla-B5-H Adobe CNS1 1)
+%%Version: 1.001
+%%Copyright: -----------------------------------------------------------
+%%Copyright: Copyright 1990-2000 Adobe Systems Incorporated.
+%%Copyright: All Rights Reserved.
+%%Copyright:
+%%Copyright: Patents Pending
+%%Copyright:
+%%Copyright: NOTICE: All information contained herein is the property
+%%Copyright: of Adobe Systems Incorporated.
+%%Copyright:
+%%Copyright: Permission is granted for redistribution of this file
+%%Copyright: provided this copyright notice is maintained intact and
+%%Copyright: that the contents of this file are not altered in any
+%%Copyright: way from its original form.
+%%Copyright:
+%%Copyright: PostScript and Display PostScript are trademarks of
+%%Copyright: Adobe Systems Incorporated which may be registered in
+%%Copyright: certain jurisdictions.
+%%Copyright: -----------------------------------------------------------
+%%EndComments
+
+/CIDInit /ProcSet findresource begin
+
+12 dict begin
+
+begincmap
+
+/CIDSystemInfo 3 dict dup begin
+ /Registry (Adobe) def
+ /Ordering (CNS1) def
+ /Supplement 1 def
+end def
+
+/CMapName /HKdla-B5-H def
+/CMapVersion 1.001 def
+/CMapType 1 def
+
+/XUID [1 10 25521] def
+
+/WMode 0 def
+
+2 begincodespacerange
+ <00> <80>
+ <A140> <FEFE>
+endcodespacerange
+
+1 beginnotdefrange
+<00> <1f> 1
+endnotdefrange
+
+100 begincidrange
+<20> <7e> 1
+<a140> <a158> 99
+<a159> <a15c> 13743
+<a15d> <a17e> 128
+<a1a1> <a1f5> 162
+<a1f6> <a1f6> 248
+<a1f7> <a1f7> 247
+<a1f8> <a1fe> 249
+<a240> <a27e> 256
+<a2a1> <a2fe> 319
+<a340> <a37e> 413
+<a3a1> <a3bb> 476
+<a3bd> <a3bf> 503
+<a440> <a47e> 595
+<a4a1> <a4fe> 658
+<a540> <a57e> 752
+<a5a1> <a5fe> 815
+<a640> <a67e> 909
+<a6a1> <a6fe> 972
+<a740> <a77e> 1066
+<a7a1> <a7fe> 1129
+<a840> <a87e> 1223
+<a8a1> <a8fe> 1286
+<a940> <a97e> 1380
+<a9a1> <a9fe> 1443
+<aa40> <aa7e> 1537
+<aaa1> <aafe> 1600
+<ab40> <ab7e> 1694
+<aba1> <abfe> 1757
+<ac40> <ac7e> 1851
+<aca1> <acfd> 1914
+<acfe> <acfe> 2431
+<ad40> <ad7e> 2007
+<ada1> <adfe> 2070
+<ae40> <ae7e> 2164
+<aea1> <aefe> 2227
+<af40> <af7e> 2321
+<afa1> <afcf> 2384
+<afd0> <affe> 2432
+<b040> <b07e> 2479
+<b0a1> <b0fe> 2542
+<b140> <b17e> 2636
+<b1a1> <b1fe> 2699
+<b240> <b27e> 2793
+<b2a1> <b2fe> 2856
+<b340> <b37e> 2950
+<b3a1> <b3fe> 3013
+<b440> <b47e> 3107
+<b4a1> <b4fe> 3170
+<b540> <b57e> 3264
+<b5a1> <b5fe> 3327
+<b640> <b67e> 3421
+<b6a1> <b6fe> 3484
+<b740> <b77e> 3578
+<b7a1> <b7fe> 3641
+<b840> <b87e> 3735
+<b8a1> <b8fe> 3798
+<b940> <b97e> 3892
+<b9a1> <b9fe> 3955
+<ba40> <ba7e> 4049
+<baa1> <bafe> 4112
+<bb40> <bb7e> 4206
+<bba1> <bbc7> 4269
+<bbc8> <bbfe> 4309
+<bc40> <bc7e> 4364
+<bca1> <bcfe> 4427
+<bd40> <bd7e> 4521
+<bda1> <bdfe> 4584
+<be40> <be51> 4678
+<be52> <be52> 4308
+<be53> <be7e> 4696
+<bea1> <befe> 4740
+<bf40> <bf7e> 4834
+<bfa1> <bffe> 4897
+<c040> <c07e> 4991
+<c0a1> <c0fe> 5054
+<c140> <c17e> 5148
+<c1a1> <c1aa> 5211
+<c1ab> <c1fe> 5222
+<c240> <c27e> 5306
+<c2a1> <c2ca> 5369
+<c2cb> <c2cb> 5221
+<c2cc> <c2fe> 5411
+<c340> <c360> 5462
+<c361> <c37e> 5496
+<c3a1> <c3b8> 5526
+<c3b9> <c3b9> 5551
+<c3ba> <c3ba> 5550
+<c3bb> <c3fe> 5552
+<c440> <c455> 5620
+<c456> <c456> 5495
+<c457> <c47e> 5642
+<c4a1> <c4fe> 5682
+<c540> <c57e> 5776
+<c5a1> <c5fe> 5839
+<c640> <c67e> 5933
+<c940> <c949> 5996
+<c94a> <c94a> 628
+<c94b> <c96b> 6006
+<c96c> <c97e> 6040
+endcidrange
+
+100 begincidrange
+<c9a1> <c9bd> 6059
+<c9be> <c9be> 6039
+<c9bf> <c9ec> 6088
+<c9ed> <c9fe> 6135
+<ca40> <ca7e> 6153
+<caa1> <caf6> 6216
+<caf7> <caf7> 6134
+<caf8> <cafe> 6302
+<cb40> <cb7e> 6309
+<cba1> <cbfe> 6372
+<cc40> <cc7e> 6466
+<cca1> <ccfe> 6529
+<cd40> <cd7e> 6623
+<cda1> <cdfe> 6686
+<ce40> <ce7e> 6780
+<cea1> <cefe> 6843
+<cf40> <cf7e> 6937
+<cfa1> <cffe> 7000
+<d040> <d07e> 7094
+<d0a1> <d0fe> 7157
+<d140> <d17e> 7251
+<d1a1> <d1fe> 7314
+<d240> <d27e> 7408
+<d2a1> <d2fe> 7471
+<d340> <d37e> 7565
+<d3a1> <d3fe> 7628
+<d440> <d47e> 7722
+<d4a1> <d4fe> 7785
+<d540> <d57e> 7879
+<d5a1> <d5fe> 7942
+<d640> <d67e> 8036
+<d6a1> <d6cb> 8099
+<d6cc> <d6cc> 8788
+<d6cd> <d6fe> 8143
+<d740> <d779> 8193
+<d77a> <d77a> 8889
+<d77b> <d77e> 8251
+<d7a1> <d7fe> 8255
+<d840> <d87e> 8349
+<d8a1> <d8fe> 8412
+<d940> <d97e> 8506
+<d9a1> <d9fe> 8569
+<da40> <da7e> 8663
+<daa1> <dade> 8726
+<dadf> <dadf> 8142
+<dae0> <dafe> 8789
+<db40> <db7e> 8820
+<dba1> <dba6> 8883
+<dba7> <dbfe> 8890
+<dc40> <dc7e> 8978
+<dca1> <dcfe> 9041
+<dd40> <dd7e> 9135
+<dda1> <ddfb> 9198
+<ddfc> <ddfc> 9089
+<ddfd> <ddfe> 9289
+<de40> <de7e> 9291
+<dea1> <defe> 9354
+<df40> <df7e> 9448
+<dfa1> <dffe> 9511
+<e040> <e07e> 9605
+<e0a1> <e0fe> 9668
+<e140> <e17e> 9762
+<e1a1> <e1fe> 9825
+<e240> <e27e> 9919
+<e2a1> <e2fe> 9982
+<e340> <e37e> 10076
+<e3a1> <e3fe> 10139
+<e440> <e47e> 10233
+<e4a1> <e4fe> 10296
+<e540> <e57e> 10390
+<e5a1> <e5fe> 10453
+<e640> <e67e> 10547
+<e6a1> <e6fe> 10610
+<e740> <e77e> 10704
+<e7a1> <e7fe> 10767
+<e840> <e87e> 10861
+<e8a1> <e8a2> 10924
+<e8a3> <e8fe> 10927
+<e940> <e975> 11019
+<e976> <e97e> 11074
+<e9a1> <e9fe> 11083
+<ea40> <ea7e> 11177
+<eaa1> <eafe> 11240
+<eb40> <eb5a> 11334
+<eb5b> <eb7e> 11362
+<eba1> <ebf0> 11398
+<ebf1> <ebf1> 10926
+<ebf2> <ebfe> 11478
+<ec40> <ec7e> 11491
+<eca1> <ecdd> 11554
+<ecde> <ecde> 11073
+<ecdf> <ecfe> 11615
+<ed40> <ed7e> 11647
+<eda1> <eda9> 11710
+<edaa> <edfe> 11720
+<ee40> <ee7e> 11805
+<eea1> <eeea> 11868
+<eeeb> <eeeb> 12308
+<eeec> <eefe> 11942
+<ef40> <ef7e> 11961
+endcidrange
+
+100 begincidrange
+<efa1> <effe> 12024
+<f040> <f055> 12118
+<f056> <f056> 11719
+<f057> <f07e> 12140
+<f0a1> <f0ca> 12180
+<f0cb> <f0cb> 11361
+<f0cc> <f0fe> 12222
+<f140> <f162> 12273
+<f163> <f16a> 12309
+<f16b> <f16b> 12640
+<f16c> <f17e> 12317
+<f1a1> <f1fe> 12336
+<f240> <f267> 12430
+<f268> <f268> 12783
+<f269> <f27e> 12470
+<f2a1> <f2c2> 12492
+<f2c3> <f2fe> 12527
+<f340> <f374> 12587
+<f375> <f37e> 12641
+<f3a1> <f3fe> 12651
+<f440> <f465> 12745
+<f466> <f47e> 12784
+<f4a1> <f4b4> 12809
+<f4b5> <f4b5> 12526
+<f4b6> <f4fc> 12829
+<f4fd> <f4fe> 12901
+<f540> <f57e> 12903
+<f5a1> <f5fe> 12966
+<f640> <f662> 13060
+<f663> <f663> 12900
+<f664> <f67e> 13095
+<f6a1> <f6fe> 13122
+<f740> <f77e> 13216
+<f7a1> <f7fe> 13279
+<f840> <f87e> 13373
+<f8a1> <f8fe> 13436
+<f940> <f976> 13530
+<f977> <f97e> 13586
+<f9a1> <f9c3> 13594
+<f9c4> <f9c4> 13585
+<f9c5> <f9c5> 13629
+<f9c6> <f9c6> 13641
+<f9c7> <f9d1> 13630
+<f9d2> <f9d5> 13642
+<fa41> <fa41> 16713
+<fa42> <fa42> 16035
+<fa43> <fa43> 16004
+<fa44> <fa44> 16007
+<fa45> <fa45> 15877
+<fa46> <fa46> 16534
+<fa47> <fa47> 14788
+<fa48> <fa48> 15725
+<fa49> <fa49> 15999
+<fa4a> <fa4a> 15479
+<fa4b> <fa4b> 16006
+<fa4c> <fa4c> 14460
+<fa4d> <fa4d> 16039
+<fa4e> <fa4e> 16910
+<fa4f> <fa4f> 16036
+<fa50> <fa50> 16778
+<fa51> <fa51> 16479
+<fa52> <fa52> 16662
+<fa53> <fa53> 16523
+<fa54> <fa54> 15974
+<fa55> <fa55> 15973
+<fa56> <fa56> 15759
+<fa57> <fa57> 16798
+<fa58> <fa58> 14950
+<fa59> <fa59> 16737
+<fa5a> <fa5a> 16010
+<fa5b> <fa5b> 15758
+<fa5c> <fa5c> 16013
+<fa5d> <fa5d> 15804
+<fa5e> <fa5e> 16021
+<fa5f> <fa5f> 14755
+<fa60> <fa60> 16884
+<fa61> <fa61> 16017
+<fa62> <fa62> 15302
+<fa63> <fa63> 15811
+<fa64> <fa64> 16046
+<fa65> <fa65> 14150
+<fa66> <fa66> 14449
+<fa67> <fa67> 14848
+<fa68> <fa68> 17036
+<fa69> <fa69> 16987
+<fa6a> <fa6a> 16045
+<fa6b> <fa6b> 16675
+<fa6c> <fa6c> 16038
+<fa6d> <fa6d> 16032
+<fa6e> <fa6e> 15150
+<fa6f> <fa6f> 15805
+<fa70> <fa70> 14436
+<fa71> <fa71> 15485
+<fa72> <fa72> 16041
+<fa73> <fa73> 16909
+<fa74> <fa74> 16216
+<fa75> <fa75> 16024
+<fa76> <fa76> 15728
+<fa77> <fa77> 16040
+<fa78> <fa78> 16020
+endcidrange
+
+100 begincidrange
+<fa79> <fa79> 16029
+<fa7a> <fa7a> 15018
+<fa7b> <fa7b> 16037
+<fa7c> <fa7c> 15564
+<fa7d> <fa7d> 16536
+<fa7e> <fa7e> 16031
+<faa1> <faa1> 16885
+<faa2> <faa2> 16011
+<faa3> <faa3> 15218
+<faa4> <faa4> 14304
+<faa5> <faa5> 15071
+<faa6> <faa6> 17120
+<faa7> <faa7> 16023
+<faa8> <faa8> 16786
+<faa9> <faa9> 14472
+<faaa> <faaa> 17096
+<faab> <faab> 16016
+<faac> <faac> 14447
+<faad> <faad> 16028
+<faae> <faae> 16708
+<faaf> <faaf> 16710
+<fab0> <fab0> 16030
+<fab1> <fab1> 16009
+<fab2> <fab2> 16531
+<fab3> <fab4> 16001
+<fab5> <fab5> 15374
+<fab6> <fab6> 16005
+<fab7> <fab7> 14556
+<fab8> <fab8> 16489
+<fab9> <fab9> 14296
+<faba> <faba> 16025
+<fabb> <fabb> 16003
+<fabc> <fabc> 16008
+<fabd> <fabd> 16000
+<fabe> <fabe> 16049
+<fabf> <fabf> 16746
+<fac0> <fac0> 14187
+<fac1> <fac1> 15975
+<fac2> <fac2> 15992
+<fac3> <fac3> 16994
+<fac4> <fac4> 14325
+<fac5> <fac5> 14324
+<fac6> <fac6> 15173
+<fac7> <fac7> 15961
+<fac8> <fac8> 10940
+<fac9> <fac9> 15807
+<faca> <faca> 16573
+<facb> <facb> 15998
+<facc> <facc> 14381
+<facd> <facd> 16048
+<face> <face> 16043
+<facf> <facf> 16050
+<fad0> <fad0> 16929
+<fad1> <fad1> 16234
+<fad2> <fad2> 14363
+<fad3> <fad3> 16026
+<fad4> <fad4> 16931
+<fad5> <fad5> 16014
+<fad6> <fad6> 15357
+<fad7> <fad7> 16474
+<fad8> <fad8> 16047
+<fad9> <fad9> 15560
+<fada> <fada> 14664
+<fadb> <fadb> 17085
+<fadc> <fadc> 16588
+<fadd> <fadd> 15964
+<fade> <fade> 16044
+<fadf> <fadf> 14618
+<fae0> <fae0> 16042
+<fae1> <fae1> 17305
+<fae2> <fae2> 14490
+<fae3> <fae3> 16012
+<fae4> <fae4> 14495
+<fae5> <fae5> 16033
+<fae6> <fae6> 16775
+<fae7> <fae7> 16015
+<fae8> <fae8> 16323
+<fae9> <fae9> 16034
+<faea> <faea> 16027
+<faeb> <faeb> 15997
+<faec> <faec> 16465
+<faed> <faed> 16316
+<faee> <faee> 16341
+<faef> <faef> 15124
+<faf0> <faf0> 16930
+<faf1> <faf1> 14235
+<faf2> <faf2> 16507
+<faf3> <faf3> 14216
+<faf4> <faf4> 15284
+<faf5> <faf5> 16848
+<faf6> <faf6> 16996
+<faf7> <faf7> 14430
+<faf8> <faf8> 14188
+<faf9> <faf9> 15806
+<fafa> <fafa> 14355
+<fafb> <fafb> 16383
+<fafc> <fafc> 15715
+<fafd> <fafd> 14214
+<fafe> <fafe> 15178
+<fb40> <fb40> 14138
+endcidrange
+
+100 begincidrange
+<fb41> <fb41> 17018
+<fb42> <fb42> 15482
+<fb43> <fb43> 16901
+<fb44> <fb44> 15398
+<fb45> <fb45> 14511
+<fb46> <fb46> 14646
+<fb47> <fb47> 14248
+<fb48> <fb48> 15220
+<fb49> <fb49> 16237
+<fb4a> <fb4a> 16022
+<fb4b> <fb4b> 14268
+<fb4c> <fb4c> 15995
+<fb4d> <fb4d> 16362
+<fb4e> <fb4e> 16842
+<fb4f> <fb4f> 14807
+<fb50> <fb50> 16593
+<fb51> <fb51> 15217
+<fb52> <fb52> 16335
+<fb53> <fb53> 1986
+<fb54> <fb54> 17150
+<fb55> <fb55> 15565
+<fb56> <fb56> 15984
+<fb57> <fb57> 15986
+<fb58> <fb58> 14156
+<fb59> <fb59> 14185
+<fb5a> <fb5a> 15183
+<fb5b> <fb5b> 14239
+<fb5c> <fb5c> 11845
+<fb5d> <fb5d> 14349
+<fb5e> <fb5e> 16290
+<fb5f> <fb5f> 14364
+<fb60> <fb60> 16252
+<fb61> <fb61> 16217
+<fb62> <fb62> 16286
+<fb63> <fb63> 15763
+<fb64> <fb64> 14357
+<fb65> <fb65> 14475
+<fb66> <fb66> 15456
+<fb67> <fb67> 14576
+<fb68> <fb68> 14250
+<fb69> <fb69> 16180
+<fb6a> <fb6a> 15378
+<fb6b> <fb6b> 14592
+<fb6c> <fb6c> 16298
+<fb6d> <fb6d> 14603
+<fb6e> <fb6e> 14633
+<fb6f> <fb6f> 16167
+<fb70> <fb70> 16272
+<fb71> <fb71> 16215
+<fb72> <fb72> 16219
+<fb73> <fb73> 16226
+<fb74> <fb74> 15734
+<fb75> <fb75> 14792
+<fb76> <fb77> 16228
+<fb78> <fb78> 14653
+<fb79> <fb79> 15462
+<fb7a> <fb7a> 14800
+<fb7b> <fb7b> 16418
+<fb7c> <fb7c> 16172
+<fb7d> <fb7d> 16168
+<fb7e> <fb7e> 14796
+<fba1> <fba1> 16166
+<fba2> <fba2> 14797
+<fba3> <fba3> 16191
+<fba4> <fba4> 14789
+<fba5> <fba5> 16334
+<fba6> <fba6> 16436
+<fba7> <fba7> 16222
+<fba8> <fba8> 16434
+<fba9> <fba9> 16468
+<fbaa> <fbaa> 16760
+<fbab> <fbab> 16224
+<fbac> <fbac> 16169
+<fbad> <fbad> 16477
+<fbae> <fbae> 16195
+<fbaf> <fbaf> 16232
+<fbb0> <fbb0> 16480
+<fbb1> <fbb1> 16170
+<fbb2> <fbb2> 16483
+<fbb3> <fbb3> 14823
+<fbb4> <fbb4> 14518
+<fbb5> <fbb5> 16528
+<fbb6> <fbb6> 16456
+<fbb7> <fbb7> 16402
+<fbb8> <fbb8> 15740
+<fbb9> <fbb9> 16459
+<fbba> <fbba> 16461
+<fbbb> <fbbb> 16463
+<fbbc> <fbbc> 16975
+<fbbd> <fbbd> 15737
+<fbbe> <fbbe> 16192
+<fbbf> <fbbf> 16138
+<fbc0> <fbc0> 16336
+<fbc1> <fbc1> 16182
+<fbc2> <fbc2> 16493
+<fbc3> <fbc3> 16517
+<fbc4> <fbc4> 16516
+<fbc5> <fbc5> 16702
+<fbc6> <fbc6> 16699
+<fbc7> <fbc7> 16326
+endcidrange
+
+100 begincidrange
+<fbc8> <fbc8> 16518
+<fbc9> <fbc9> 14674
+<fbca> <fbca> 16545
+<fbcb> <fbcb> 16178
+<fbcc> <fbcc> 16899
+<fbcd> <fbcd> 16230
+<fbce> <fbce> 15747
+<fbcf> <fbcf> 15989
+<fbd0> <fbd0> 16546
+<fbd1> <fbd1> 1392
+<fbd2> <fbd2> 16185
+<fbd3> <fbd3> 2161
+<fbd4> <fbd4> 16164
+<fbd5> <fbd5> 16558
+<fbd6> <fbd6> 16196
+<fbd7> <fbd7> 14581
+<fbd8> <fbd8> 16329
+<fbd9> <fbd9> 16333
+<fbda> <fbda> 16309
+<fbdb> <fbdb> 15996
+<fbdc> <fbdc> 16338
+<fbdd> <fbdd> 16205
+<fbde> <fbde> 16572
+<fbdf> <fbdf> 16567
+<fbe0> <fbe0> 14424
+<fbe1> <fbe1> 17327
+<fbe2> <fbe2> 16236
+<fbe3> <fbe3> 15749
+<fbe4> <fbe4> 17302
+<fbe5> <fbe5> 14758
+<fbe6> <fbe6> 16253
+<fbe7> <fbe7> 16319
+<fbe8> <fbe8> 16584
+<fbe9> <fbe9> 16223
+<fbea> <fbea> 16171
+<fbeb> <fbeb> 15730
+<fbec> <fbec> 16591
+<fbed> <fbed> 14853
+<fbee> <fbee> 15746
+<fbef> <fbef> 16604
+<fbf0> <fbf0> 15717
+<fbf1> <fbf1> 16596
+<fbf2> <fbf2> 16602
+<fbf3> <fbf3> 16173
+<fbf4> <fbf4> 1429
+<fbf5> <fbf5> 15745
+<fbf6> <fbf6> 16625
+<fbf7> <fbf7> 1781
+<fbf8> <fbf8> 16632
+<fbf9> <fbf9> 16635
+<fbfa> <fbfa> 16193
+<fbfb> <fbfb> 16664
+<fbfc> <fbfc> 15753
+<fbfd> <fbfd> 16220
+<fbfe> <fbfe> 15719
+<fc40> <fc40> 16142
+<fc41> <fc41> 16147
+<fc42> <fc42> 16674
+<fc43> <fc43> 16330
+<fc44> <fc44> 16681
+<fc45> <fc45> 16140
+<fc46> <fc46> 16139
+<fc47> <fc47> 16225
+<fc48> <fc48> 15754
+<fc49> <fc49> 16174
+<fc4a> <fc4a> 6513
+<fc4b> <fc4b> 16693
+<fc4c> <fc4c> 14891
+<fc4d> <fc4d> 16235
+<fc4e> <fc4e> 15269
+<fc4f> <fc4f> 16452
+<fc50> <fc50> 16981
+<fc51> <fc51> 14135
+<fc52> <fc52> 16165
+<fc53> <fc53> 14137
+<fc54> <fc54> 14896
+<fc55> <fc55> 16707
+<fc56> <fc56> 16580
+<fc57> <fc57> 15716
+<fc58> <fc58> 16318
+<fc59> <fc59> 16294
+<fc5a> <fc5a> 16428
+<fc5b> <fc5b> 16727
+<fc5c> <fc5c> 16287
+<fc5d> <fc5d> 11072
+<fc5e> <fc5e> 16295
+<fc5f> <fc5f> 16389
+<fc60> <fc60> 16385
+<fc61> <fc61> 7323
+<fc62> <fc62> 15748
+<fc63> <fc63> 2709
+<fc64> <fc64> 16748
+<fc65> <fc65> 16393
+<fc66> <fc66> 15733
+<fc67> <fc67> 15068
+<fc68> <fc68> 16296
+<fc69> <fc69> 16183
+<fc6a> <fc6a> 16756
+<fc6b> <fc6b> 16390
+<fc6c> <fc6c> 16386
+endcidrange
+
+100 begincidrange
+<fc6d> <fc6d> 16314
+<fc6e> <fc6e> 16320
+<fc6f> <fc6f> 4784
+<fc70> <fc70> 16317
+<fc71> <fc71> 16755
+<fc72> <fc72> 16774
+<fc73> <fc73> 14932
+<fc74> <fc74> 16325
+<fc75> <fc75> 16985
+<fc76> <fc76> 16322
+<fc77> <fc77> 16149
+<fc78> <fc78> 16208
+<fc79> <fc79> 16262
+<fc7a> <fc7a> 16321
+<fc7b> <fc7b> 16780
+<fc7c> <fc7c> 16327
+<fc7d> <fc7d> 16150
+<fc7e> <fc7e> 16782
+<fca1> <fca1> 16203
+<fca2> <fca2> 16797
+<fca3> <fca3> 4447
+<fca4> <fca4> 16324
+<fca5> <fca5> 13188
+<fca6> <fca6> 15769
+<fca7> <fca7> 16825
+<fca8> <fca8> 14985
+<fca9> <fca9> 16823
+<fcaa> <fcaa> 15755
+<fcab> <fcab> 15718
+<fcac> <fcac> 994
+<fcad> <fcad> 15722
+<fcae> <fcae> 15738
+<fcaf> <fcaf> 16867
+<fcb0> <fcb0> 1561
+<fcb1> <fcb1> 14742
+<fcb2> <fcb2> 16328
+<fcb3> <fcb3> 15006
+<fcb4> <fcb4> 16184
+<fcb5> <fcb5> 15744
+<fcb6> <fcb7> 16862
+<fcb8> <fcb8> 17131
+<fcb9> <fcb9> 15750
+<fcba> <fcba> 16859
+<fcbb> <fcbb> 16190
+<fcbc> <fcbc> 16470
+<fcbd> <fcbd> 16857
+<fcbe> <fcbe> 16374
+<fcbf> <fcbf> 16221
+<fcc0> <fcc0> 15732
+<fcc1> <fcc1> 16872
+<fcc2> <fcc2> 16839
+<fcc3> <fcc3> 15761
+<fcc4> <fcc4> 15179
+<fcc5> <fcc5> 15682
+<fcc6> <fcc6> 15021
+<fcc7> <fcc7> 15013
+<fcc8> <fcc8> 16882
+<fcc9> <fcc9> 16204
+<fcca> <fcca> 16888
+<fccb> <fccb> 16238
+<fccc> <fccc> 16249
+<fccd> <fccd> 16269
+<fcce> <fcce> 16387
+<fccf> <fccf> 16273
+<fcd0> <fcd0> 15043
+<fcd1> <fcd1> 2330
+<fcd2> <fcd2> 16948
+<fcd3> <fcd3> 16379
+<fcd4> <fcd5> 16960
+<fcd6> <fcd6> 16381
+<fcd7> <fcd7> 16248
+<fcd8> <fcd8> 15477
+<fcd9> <fcd9> 15475
+<fcda> <fcda> 14501
+<fcdb> <fcdb> 17401
+<fcdc> <fcdc> 15614
+<fcdd> <fcdd> 16983
+<fcde> <fcde> 16947
+<fcdf> <fcdf> 15721
+<fce0> <fce0> 15486
+<fce1> <fce1> 15727
+<fce2> <fce2> 16384
+<fce3> <fce3> 15808
+<fce4> <fce4> 16388
+<fce5> <fce5> 3698
+<fce6> <fce6> 14648
+<fce7> <fce7> 16292
+<fce8> <fce8> 10586
+<fce9> <fce9> 17011
+<fcea> <fcea> 15049
+<fceb> <fceb> 17021
+<fcec> <fcec> 15050
+<fced> <fced> 16306
+<fcee> <fcee> 16310
+<fcef> <fcef> 16279
+<fcf0> <fcf0> 16282
+<fcf1> <fcf1> 17035
+<fcf2> <fcf2> 17402
+<fcf3> <fcf3> 17034
+<fcf4> <fcf4> 16209
+endcidrange
+
+100 begincidrange
+<fcf5> <fcf5> 16280
+<fcf6> <fcf6> 16803
+<fcf7> <fcf7> 15708
+<fcf8> <fcf8> 16227
+<fcf9> <fcf9> 17040
+<fcfa> <fcfa> 8084
+<fcfb> <fcfb> 17094
+<fcfc> <fcfc> 17058
+<fcfd> <fcfd> 16378
+<fcfe> <fcfe> 16285
+<fd40> <fd40> 16382
+<fd41> <fd41> 16283
+<fd42> <fd42> 16351
+<fd43> <fd43> 16358
+<fd44> <fd44> 16350
+<fd45> <fd45> 17079
+<fd46> <fd46> 16372
+<fd47> <fd47> 17080
+<fd48> <fd48> 16363
+<fd49> <fd49> 17087
+<fd4a> <fd4a> 15729
+<fd4b> <fd4b> 16207
+<fd4c> <fd4c> 17093
+<fd4d> <fd4d> 17109
+<fd4e> <fd4e> 17104
+<fd4f> <fd4f> 17112
+<fd50> <fd50> 16213
+<fd51> <fd51> 16360
+<fd52> <fd52> 16371
+<fd53> <fd53> 17119
+<fd54> <fd54> 16339
+<fd55> <fd55> 15987
+<fd56> <fd56> 16277
+<fd57> <fd57> 17134
+<fd58> <fd58> 17140
+<fd59> <fd59> 16268
+<fd5a> <fd5a> 16335
+<fd5b> <fd5b> 17132
+<fd5c> <fd5c> 16340
+<fd5d> <fd5d> 17136
+<fd5e> <fd5e> 1986
+<fd5f> <fd5f> 2389
+<fd60> <fd60> 17150
+<fd61> <fd61> 17153
+<fd62> <fd62> 15565
+<fd63> <fd63> 17159
+<fd64> <fd64> 17403
+<fd65> <fd65> 16346
+<fd66> <fd66> 16267
+<fd67> <fd67> 14131
+<fd68> <fd68> 16266
+<fd69> <fd69> 14145
+<fd6a> <fd6a> 14144
+<fd6b> <fd6b> 14146
+<fd6c> <fd6c> 16275
+<fd6d> <fd6d> 16271
+<fd6e> <fd6e> 15984
+<fd6f> <fd6f> 17097
+<fd70> <fd70> 15986
+<fd71> <fd71> 16297
+<fd72> <fd72> 17101
+<fd73> <fd73> 17362
+<fd74> <fd74> 16270
+<fd75> <fd75> 16247
+<fd76> <fd76> 15726
+<fd77> <fd77> 3338
+<fd78> <fd78> 16145
+<fd79> <fd79> 14162
+<fd7a> <fd7a> 16148
+<fd7b> <fd7b> 16152
+<fd7c> <fd7c> 16211
+<fd7d> <fd7d> 16159
+<fd7e> <fd7e> 16156
+<fda1> <fda1> 16312
+<fda2> <fda2> 13213
+<fda3> <fda3> 15167
+<fda4> <fda4> 16210
+<fda5> <fda5> 16154
+<fda6> <fda6> 16157
+<fda7> <fda7> 14172
+<fda8> <fda8> 14469
+<fda9> <fda9> 14177
+<fdaa> <fdaa> 16343
+<fdab> <fdab> 16342
+<fdac> <fdac> 16345
+<fdad> <fdad> 16344
+<fdae> <fdae> 16349
+<fdaf> <fdaf> 16019
+<fdb0> <fdb0> 14185
+<fdb1> <fdb1> 14190
+<fdb2> <fdb2> 15180
+<fdb3> <fdb3> 14196
+<fdb4> <fdb4> 14207
+<fdb5> <fdb5> 14203
+<fdb6> <fdb6> 14210
+<fdb7> <fdb7> 15183
+<fdb8> <fdb8> 14226
+<fdb9> <fdb9> 16355
+<fdba> <fdba> 16348
+<fdbb> <fdbb> 16347
+endcidrange
+
+100 begincidrange
+<fdbc> <fdbc> 16357
+<fdbd> <fdbd> 15221
+<fdbe> <fdbe> 14242
+<fdbf> <fdbf> 16354
+<fdc0> <fdc0> 16359
+<fdc1> <fdc1> 15981
+<fdc2> <fdc2> 3370
+<fdc3> <fdc3> 15993
+<fdc4> <fdc4> 15990
+<fdc5> <fdc5> 14239
+<fdc6> <fdc6> 16366
+<fdc7> <fdc7> 17108
+<fdc8> <fdc8> 15764
+<fdc9> <fdc9> 15713
+<fdca> <fdca> 16353
+<fdcb> <fdcb> 14174
+<fdcc> <fdcc> 15226
+<fdcd> <fdcd> 14347
+<fdce> <fdce> 16364
+<fdcf> <fdcf> 16367
+<fdd0> <fdd0> 11845
+<fdd1> <fdd1> 16380
+<fdd2> <fdd2> 16365
+<fdd3> <fdd3> 14349
+<fdd4> <fdd4> 16356
+<fdd5> <fdd5> 16274
+<fdd6> <fdd6> 16302
+<fdd7> <fdd7> 14353
+<fdd8> <fdd8> 16250
+<fdd9> <fdd9> 15243
+<fdda> <fdda> 16218
+<fddb> <fddb> 14358
+<fddc> <fddc> 16290
+<fddd> <fddd> 15246
+<fdde> <fdde> 14364
+<fddf> <fddf> 8276
+<fde0> <fde0> 14367
+<fde1> <fde1> 16288
+<fde2> <fde2> 17404
+<fde3> <fde3> 15894
+<fde4> <fde4> 15252
+<fde5> <fde5> 16252
+<fde6> <fde6> 16391
+<fde7> <fde7> 16251
+<fde8> <fde8> 15731
+<fde9> <fde9> 15991
+<fdea> <fdea> 15762
+<fdeb> <fdeb> 16289
+<fdec> <fdec> 14273
+<fded> <fded> 14291
+<fdee> <fdee> 15994
+<fdef> <fdef> 16217
+<fdf0> <fdf0> 15445
+<fdf1> <fdf1> 16376
+<fdf2> <fdf2> 16373
+<fdf3> <fdf3> 15436
+<fdf4> <fdf4> 15756
+<fdf5> <fdf5> 16291
+<fdf6> <fdf6> 14272
+<fdf7> <fdf7> 16212
+<fdf8> <fdf8> 14336
+<fdf9> <fdf9> 15231
+<fdfa> <fdfa> 16286
+<fdfb> <fdfb> 14370
+<fdfc> <fdfc> 16361
+<fdfd> <fdfd> 14371
+<fdfe> <fdfe> 16352
+<fe40> <fe40> 15763
+<fe41> <fe41> 16377
+<fe42> <fe42> 14375
+<fe43> <fe43> 16293
+<fe44> <fe44> 16368
+<fe45> <fe45> 14390
+<fe46> <fe46> 16281
+<fe47> <fe47> 16370
+<fe48> <fe48> 15757
+<fe49> <fe49> 17382
+<fe4a> <fe4a> 13602
+<fe4b> <fe4b> 16369
+<fe4c> <fe4c> 16284
+<fe4d> <fe4d> 16305
+<fe4e> <fe4e> 16278
+<fe4f> <fe4f> 15983
+<fe50> <fe50> 16233
+<fe51> <fe51> 16375
+<fe52> <fe52> 16258
+<fe53> <fe53> 16264
+<fe54> <fe54> 16261
+<fe55> <fe55> 16259
+<fe56> <fe56> 16255
+<fe57> <fe57> 16265
+<fe58> <fe58> 15285
+<fe59> <fe59> 14434
+<fe5a> <fe5a> 16263
+<fe5b> <fe5b> 16177
+<fe5c> <fe5c> 14357
+<fe5d> <fe5d> 14462
+<fe5e> <fe5e> 16201
+<fe5f> <fe5f> 16200
+<fe60> <fe60> 16199
+endcidrange
+
+100 begincidrange
+<fe61> <fe61> 16197
+<fe62> <fe62> 17387
+<fe63> <fe63> 14466
+<fe64> <fe64> 16239
+<fe65> <fe65> 16206
+<fe66> <fe66> 15304
+<fe67> <fe67> 17405
+<fe68> <fe69> 15723
+<fe6a> <fe6a> 17406
+<fe6b> <fe6b> 16331
+<fe6c> <fe6c> 15826
+<fe6d> <fe6d> 14457
+<fe6e> <fe6e> 16144
+<fe6f> <fe6f> 14382
+<fe70> <fe70> 14475
+<fe71> <fe71> 15456
+<fe72> <fe72> 10911
+<fe73> <fe73> 15457
+<fe74> <fe74> 14483
+<fe75> <fe75> 15988
+<fe76> <fe76> 16300
+<fe77> <fe77> 16257
+<fe78> <fe78> 15309
+<fe79> <fe79> 15316
+<fe7a> <fe7a> 15315
+<fe7b> <fe7b> 16332
+<fe7c> <fe7c> 16337
+<fe7d> <fe7d> 16189
+<fe7e> <fe7e> 16202
+<fea1> <fea1> 9042
+<fea2> <fea2> 14509
+<fea3> <fea3> 16198
+<fea4> <fea4> 14517
+<fea5> <fea5> 16141
+<fea6> <fea6> 16307
+<fea7> <fea7> 14528
+<fea8> <fea8> 15919
+<fea9> <fea9> 14543
+<feaa> <feaa> 14549
+<feab> <feab> 16179
+<feac> <feac> 15765
+<fead> <fead> 16181
+<feae> <feae> 14551
+<feaf> <feaf> 16175
+<feb0> <feb0> 14560
+<feb1> <feb1> 15362
+<feb2> <feb2> 16242
+<feb3> <feb3> 16240
+<feb4> <feb4> 15766
+<feb5> <feb6> 14566
+<feb7> <feb7> 16437
+<feb8> <feb8> 16243
+<feb9> <feb9> 14576
+<feba> <feba> 15371
+<febb> <febb> 14583
+<febc> <febc> 14250
+<febd> <febd> 17407
+<febe> <febe> 14586
+<febf> <febf> 15377
+<fec0> <fec0> 16180
+<fec1> <fec1> 16313
+<fec2> <fec2> 15378
+<fec3> <fec3> 16394
+<fec4> <fec4> 15735
+<fec5> <fec5> 16194
+<fec6> <fec6> 14592
+<fec7> <fec7> 14594
+<fec8> <fec8> 16244
+<fec9> <fec9> 15767
+<feca> <feca> 16298
+<fecb> <fecb> 16153
+<fecc> <fecc> 16155
+<fecd> <fecd> 14606
+<fece> <fece> 14601
+<fecf> <fecf> 14603
+<fed0> <fed0> 16146
+<fed1> <fed1> 16151
+<fed2> <fed2> 16311
+<fed3> <fed3> 16160
+<fed4> <fed4> 16315
+<fed5> <fed5> 16188
+<fed6> <fed6> 16301
+<fed7> <fed7> 14617
+<fed8> <fed8> 16214
+<fed9> <fed9> 16241
+<feda> <feda> 16308
+<fedb> <fedb> 14620
+<fedc> <fedc> 16158
+<fedd> <fedd> 16186
+<fede> <fede> 14619
+<fedf> <fedf> 15751
+<fee0> <fee0> 15418
+<fee1> <fee1> 16162
+<fee2> <fee2> 15985
+<fee3> <fee3> 15417
+<fee4> <fee4> 15742
+<fee5> <fee5> 16676
+<fee6> <fee6> 16187
+<fee7> <fee7> 15982
+<fee8> <fee8> 16299
+endcidrange
+
+22 begincidrange
+<fee9> <fee9> 14629
+<feea> <feea> 16176
+<feeb> <feeb> 14633
+<feec> <feec> 16260
+<feed> <feed> 16143
+<feee> <feee> 16246
+<feef> <feef> 16276
+<fef0> <fef0> 14642
+<fef1> <fef1> 16167
+<fef2> <fef2> 14643
+<fef3> <fef3> 16245
+<fef4> <fef4> 14647
+<fef5> <fef5> 15736
+<fef6> <fef6> 16161
+<fef7> <fef7> 16272
+<fef8> <fef8> 14656
+<fef9> <fef9> 15743
+<fefa> <fefa> 14666
+<fefb> <fefb> 16256
+<fefc> <fefc> 16163
+<fefd> <fefd> 14672
+<fefe> <fefe> 16254
+endcidrange
+endcmap
+CMapName currentdict /CMap defineresource pop
+end
+end
+
+%%EndResource
+%%EOF
diff --git a/src/main/resources/Resources/cmap/HKdla-B5-V b/src/main/resources/Resources/cmap/HKdla-B5-V
new file mode 100644
index 0000000..76c746e
--- /dev/null
+++ b/src/main/resources/Resources/cmap/HKdla-B5-V
@@ -0,0 +1,71 @@
+%!PS-Adobe-3.0 Resource-CMap
+%%DocumentNeededResources: ProcSet (CIDInit)
+%%DocumentNeededResources: CMap (HKdla-B5-H)
+%%IncludeResource: ProcSet (CIDInit)
+%%IncludeResource: CMap (HKdla-B5-H)
+%%BeginResource: CMap (HKdla-B5-V)
+%%Title: (HKdla-B5-V Adobe CNS1 0)
+%%Version: 1.001
+%%Copyright: -----------------------------------------------------------
+%%Copyright: Copyright 1990-2000 Adobe Systems Incorporated.
+%%Copyright: All Rights Reserved.
+%%Copyright:
+%%Copyright: Patents Pending
+%%Copyright:
+%%Copyright: NOTICE: All information contained herein is the property
+%%Copyright: of Adobe Systems Incorporated.
+%%Copyright:
+%%Copyright: Permission is granted for redistribution of this file
+%%Copyright: provided this copyright notice is maintained intact and
+%%Copyright: that the contents of this file are not altered in any
+%%Copyright: way from its original form.
+%%Copyright:
+%%Copyright: PostScript and Display PostScript are trademarks of
+%%Copyright: Adobe Systems Incorporated which may be registered in
+%%Copyright: certain jurisdictions.
+%%Copyright: -----------------------------------------------------------
+%%EndComments
+
+/CIDInit /ProcSet findresource begin
+
+12 dict begin
+
+begincmap
+
+/HKdla-B5-H usecmap
+
+/CIDSystemInfo 3 dict dup begin
+ /Registry (Adobe) def
+ /Ordering (CNS1) def
+ /Supplement 0 def
+end def
+
+/CMapName /HKdla-B5-V def
+/CMapVersion 1.001 def
+/CMapType 1 def
+
+/XUID [1 10 25522] def
+
+/WMode 1 def
+
+12 begincidrange
+<a14b> <a14b> 13646
+<a15a> <a15a> 13743
+<a15c> <a15c> 13745
+<a15d> <a15e> 130
+<a161> <a162> 134
+<a165> <a166> 138
+<a169> <a16a> 142
+<a16d> <a16e> 146
+<a171> <a172> 150
+<a175> <a176> 154
+<a179> <a17a> 158
+<a1e3> <a1e3> 13647
+endcidrange
+endcmap
+CMapName currentdict /CMap defineresource pop
+end
+end
+
+%%EndResource
+%%EOF
diff --git a/src/main/resources/Resources/cmap/HKdlb-B5-H b/src/main/resources/Resources/cmap/HKdlb-B5-H
new file mode 100644
index 0000000..ebdae5f
--- /dev/null
+++ b/src/main/resources/Resources/cmap/HKdlb-B5-H
@@ -0,0 +1,998 @@
+%!PS-Adobe-3.0 Resource-CMap
+%%DocumentNeededResources: ProcSet (CIDInit)
+%%IncludeResource: ProcSet (CIDInit)
+%%BeginResource: CMap (HKdlb-B5-H)
+%%Title: (HKdlb-B5-H Adobe CNS1 1)
+%%Version: 1.001
+%%Copyright: -----------------------------------------------------------
+%%Copyright: Copyright 1990-2000 Adobe Systems Incorporated.
+%%Copyright: All Rights Reserved.
+%%Copyright:
+%%Copyright: Patents Pending
+%%Copyright:
+%%Copyright: NOTICE: All information contained herein is the property
+%%Copyright: of Adobe Systems Incorporated.
+%%Copyright:
+%%Copyright: Permission is granted for redistribution of this file
+%%Copyright: provided this copyright notice is maintained intact and
+%%Copyright: that the contents of this file are not altered in any
+%%Copyright: way from its original form.
+%%Copyright:
+%%Copyright: PostScript and Display PostScript are trademarks of
+%%Copyright: Adobe Systems Incorporated which may be registered in
+%%Copyright: certain jurisdictions.
+%%Copyright: -----------------------------------------------------------
+%%EndComments
+
+/CIDInit /ProcSet findresource begin
+
+12 dict begin
+
+begincmap
+
+/CIDSystemInfo 3 dict dup begin
+ /Registry (Adobe) def
+ /Ordering (CNS1) def
+ /Supplement 1 def
+end def
+
+/CMapName /HKdlb-B5-H def
+/CMapVersion 1.001 def
+/CMapType 1 def
+
+/XUID [1 10 25523] def
+
+/WMode 0 def
+
+2 begincodespacerange
+ <00> <80>
+ <8E40> <FEFE>
+endcodespacerange
+
+1 beginnotdefrange
+<00> <1f> 1
+endnotdefrange
+
+100 begincidrange
+<20> <7e> 1
+<8e40> <8e40> 15735
+<8e41> <8e41> 15724
+<8e42> <8e42> 16217
+<8e43> <8e43> 14617
+<8e44> <8e44> 15984
+<8e45> <8e45> 14162
+<8e46> <8e46> 14511
+<8e47> <8e47> 14214
+<8e48> <8e48> 16155
+<8e49> <8e49> 15708
+<8e4a> <8e4a> 16281
+<8e4b> <8e4b> 16360
+<8e4c> <8e4c> 14475
+<8e4d> <8e4d> 14556
+<8e4e> <8e4e> 16298
+<8e4f> <8e4f> 17096
+<8e50> <8e50> 14145
+<8e51> <8e51> 15743
+<8e52> <8e52> 17132
+<8e53> <8e53> 16275
+<8e54> <8e54> 14490
+<8e55> <8e55> 14457
+<8e56> <8e56> 14138
+<8e57> <8e57> 17104
+<8e58> <8e58> 15983
+<8e59> <8e59> 16152
+<8e5a> <8e5a> 14056
+<8e5b> <8e5b> 14137
+<8e5c> <8e5c> 16025
+<8e5d> <8e5d> 15180
+<8e5e> <8e5e> 15826
+<8e5f> <8e5f> 16297
+<8e60> <8e60> 16300
+<8e61> <8e61> 16331
+<8e62> <8e62> 14131
+<8e63> <8e63> 16287
+<8e64> <8e64> 16602
+<8e65> <8e65> 16169
+<8e66> <8e66> 15462
+<8e67> <8e67> 16930
+<8e68> <8e68> 16558
+<8e69> <8e69> 15738
+<8e6a> <8e6a> 16269
+<8e6b> <8e6b> 14800
+<8e6c> <8e6c> 16996
+<8e6d> <8e6d> 15746
+<8e6e> <8e6e> 16899
+<8e6f> <8e6f> 16859
+<8e70> <8e70> 16350
+<8e71> <8e71> 16372
+<8e72> <8e72> 16388
+<8e73> <8e73> 16230
+<8e74> <8e74> 16283
+<8e75> <8e75> 15718
+<8e76> <8e76> 16459
+<8e77> <8e77> 16351
+<8e78> <8e78> 16635
+<8e79> <8e79> 16402
+<8e7a> <8e7a> 16358
+<8e7b> <8e7b> 17131
+<8e7c> <8e7c> 16676
+<8e7d> <8e7d> 15740
+<8e7e> <8e7e> 15721
+<8ea1> <8ea1> 16382
+<8ea2> <8ea2> 15730
+<8ea3> <8ea3> 16326
+<8ea4> <8ea4> 15614
+<8ea5> <8ea5> 17401
+<8ea6> <8ea6> 15682
+<8ea7> <8ea7> 16149
+<8ea8> <8ea8> 16334
+<8ea9> <8ea9> 17035
+<8eaa> <8eaa> 16591
+<8eab> <8eab> 17398
+<8eac> <8eac> 16389
+<8ead> <8ead> 16173
+<8eae> <8eae> 16737
+<8eaf> <8eaf> 16172
+<8eb0> <8eb0> 15050
+<8eb1> <8eb1> 15722
+<8eb2> <8eb2> 16483
+<8eb3> <8eb3> 16325
+<8eb4> <8eb4> 14823
+<8eb5> <8eb5> 16170
+<8eb6> <8eb6> 16480
+<8eb7> <8eb7> 17011
+<8eb8> <8eb8> 16929
+<8eb9> <8eb9> 16546
+<8eba> <8eba> 16232
+<8ebb> <8ebb> 16545
+<8ebc> <8ebc> 16215
+<8ebd> <8ebd> 16240
+<8ebe> <8ebe> 16311
+<8ebf> <8ebf> 14150
+<8ec0> <8ec0> 16299
+<8ec1> <8ec1> 16370
+<8ec2> <8ec2> 16268
+<8ec3> <8ec3> 16264
+<8ec4> <8ec4> 14291
+endcidrange
+
+100 begincidrange
+<8ec5> <8ec6> 15220
+<8ec7> <8ec7> 17140
+<8ec8> <8ec8> 15436
+<8ec9> <8ec9> 15226
+<8eca> <8eca> 14469
+<8ecb> <8ecb> 14135
+<8ecc> <8ecc> 16347
+<8ecd> <8ecd> 16157
+<8ece> <8ece> 16364
+<8ecf> <8ecf> 16357
+<8ed0> <8ed0> 14174
+<8ed1> <8ed1> 16375
+<8ed2> <8ed2> 14355
+<8ed3> <8ed3> 16355
+<8ed4> <8ed4> 16154
+<8ed5> <8ed5> 14566
+<8ed6> <8ed6> 16348
+<8ed7> <8ed7> 14207
+<8ed8> <8ed8> 15751
+<8ed9> <8ed9> 15315
+<8eda> <8eda> 15736
+<8edb> <8edb> 15316
+<8edc> <8edc> 16278
+<8edd> <8edd> 16277
+<8ede> <8ede> 15756
+<8edf> <8edf> 14647
+<8ee0> <8ee0> 16156
+<8ee1> <8ee1> 14642
+<8ee2> <8ee2> 15723
+<8ee3> <8ee3> 14336
+<8ee4> <8ee4> 16376
+<8ee5> <8ee5> 15418
+<8ee6> <8ee6> 16194
+<8ee7> <8ee7> 17405
+<8ee8> <8ee8> 16305
+<8ee9> <8ee9> 14226
+<8eea> <8eea> 16276
+<8eeb> <8eeb> 16158
+<8eec> <8eec> 16394
+<8eed> <8eed> 14466
+<8eee> <8eee> 16284
+<8eef> <8eef> 15713
+<8ef0> <8ef0> 16162
+<8ef1> <8ef1> 16361
+<8ef2> <8ef2> 15762
+<8ef3> <8ef3> 14207
+<8ef4> <8ef4> 15252
+<8ef5> <8ef5> 14190
+<8ef6> <8ef6> 17153
+<8ef7> <8ef7> 16186
+<8ef8> <8ef8> 14435
+<8ef9> <8ef9> 16369
+<8efa> <8efa> 17150
+<8efb> <8efb> 15356
+<8efc> <8efc> 16197
+<8efd> <8efd> 14239
+<8efe> <8efe> 14187
+<8f40> <8f40> 16148
+<8f41> <8f41> 16199
+<8f42> <8f42> 14434
+<8f43> <8f43> 14185
+<8f44> <8f44> 15378
+<8f45> <8f45> 16201
+<8f46> <8f46> 14367
+<8f47> <8f47> 14633
+<8f48> <8f48> 16214
+<8f49> <8f49> 16180
+<8f4a> <8f4a> 16349
+<8f4b> <8f4b> 14586
+<8f4c> <8f4c> 16251
+<8f4d> <8f4d> 15377
+<8f4e> <8f4e> 16252
+<8f4f> <8f4f> 17407
+<8f50> <8f50> 15987
+<8f51> <8f51> 16241
+<8f52> <8f52> 14629
+<8f53> <8f53> 15445
+<8f54> <8f54> 14517
+<8f55> <8f55> 16218
+<8f56> <8f56> 14358
+<8f57> <8f57> 15981
+<8f58> <8f58> 14210
+<8f59> <8f59> 16145
+<8f5a> <8f5a> 15243
+<8f5b> <8f5b> 14272
+<8f5c> <8f5c> 14357
+<8f5d> <8f5d> 14395
+<8f5e> <8f5e> 15731
+<8f5f> <8f5f> 15726
+<8f60> <8f60> 16266
+<8f61> <8f61> 16190
+<8f62> <8f62> 16948
+<8f63> <8f63> 16867
+<8f64> <8f64> 16327
+<8f65> <8f65> 16371
+<8f66> <8f66> 16387
+<8f67> <8f67> 16434
+<8f68> <8f68> 16238
+<8f69> <8f69> 16803
+<8f6a> <8f6a> 16390
+endcidrange
+
+100 begincidrange
+<8f6b> <8f6b> 16171
+<8f6c> <8f6c> 16253
+<8f6d> <8f6d> 15475
+<8f6e> <8f6e> 16150
+<8f6f> <8f6f> 16386
+<8f70> <8f70> 16470
+<8f71> <8f71> 16314
+<8f72> <8f72> 16235
+<8f73> <8f73> 16273
+<8f74> <8f74> 16318
+<8f75> <8f75> 16474
+<8f76> <8f76> 15071
+<8f77> <8f77> 15937
+<8f78> <8f78> 15719
+<8f79> <8f79> 16224
+<8f7a> <8f7a> 16872
+<8f7b> <8f7b> 16320
+<8f7c> <8f7c> 15747
+<8f7d> <8f7d> 16755
+<8f7e> <8f7e> 16220
+<8fa1> <8fa1> 16178
+<8fa2> <8fa2> 16191
+<8fa3> <8fa3> 15715
+<8fa4> <8fa4> 16710
+<8fa5> <8fa5> 16333
+<8fa6> <8fa6> 15737
+<8fa7> <8fa7> 16168
+<8fa8> <8fa8> 16321
+<8fa9> <8fa9> 16572
+<8faa> <8faa> 15729
+<8fab> <8fab> 16183
+<8fac> <8fac> 17112
+<8fad> <8fad> 16363
+<8fae> <8fae> 16961
+<8faf> <8faf> 14896
+<8fb0> <8fb0> 14797
+<8fb1> <8fb1> 17087
+<8fb2> <8fb2> 16910
+<8fb3> <8fb3> 16138
+<8fb4> <8fb4> 14796
+<8fb5> <8fb5> 16452
+<8fb6> <8fb6> 16536
+<8fb7> <8fb7> 16780
+<8fb8> <8fb8> 15716
+<8fb9> <8fb9> 16196
+<8fba> <8fba> 16463
+<8fbb> <8fbb> 17109
+<8fbc> <8fbc> 17040
+<8fbd> <8fbd> 16384
+<8fbe> <8fbe> 14985
+<8fbf> <8fbf> 16748
+<8fc0> <8fc0> 16580
+<8fc1> <8fc1> 16461
+<8fc2> <8fc2> 15808
+<8fc3> <8fc3> 16208
+<8fc4> <8fc4> 16393
+<8fc5> <8fc5> 16303
+<8fc6> <8fc6> 16262
+<8fc7> <8fc7> 16531
+<8fc8> <8fc8> 15021
+<8fc9> <8fc9> 16184
+<8fca> <8fca> 15733
+<8fcb> <8fcb> 16185
+<8fcc> <8fcc> 17101
+<8fcd> <8fcd> 16248
+<8fce> <8fce> 16285
+<8fcf> <8fcf> 16528
+<8fd0> <8fd0> 15744
+<8fd1> <8fd1> 16174
+<8fd2> <8fd2> 14518
+<8fd3> <8fd3> 16825
+<8fd4> <8fd4> 15754
+<8fd5> <8fd5> 16164
+<8fd6> <8fd6> 15006
+<8fd7> <8fd7> 15068
+<8fd8> <8fd8> 15717
+<8fd9> <8fd9> 16517
+<8fda> <8fda> 16209
+<8fdb> <8fdb> 17402
+<8fdc> <8fdc> 16227
+<8fdd> <8fdd> 16760
+<8fde> <8fde> 16823
+<8fdf> <8fdf> 15986
+<8fe0> <8fe0> 16857
+<8fe1> <8fe1> 16782
+<8fe2> <8fe2> 15734
+<8fe3> <8fe3> 17108
+<8fe4> <8fe4> 17058
+<8fe5> <8fe5> 16983
+<8fe6> <8fe6> 16140
+<8fe7> <8fe7> 14742
+<8fe8> <8fe8> 16981
+<8fe9> <8fe9> 16567
+<8fea> <8fea> 16282
+<8feb> <8feb> 16330
+<8fec> <8fec> 16222
+<8fed> <8fed> 15749
+<8fee> <8fee> 16378
+<8fef> <8fef> 16310
+<8ff0> <8ff0> 15043
+endcidrange
+
+100 begincidrange
+<8ff1> <8ff1> 16328
+<8ff2> <8ff2> 16203
+<8ff3> <8ff3> 16625
+<8ff4> <8ff4> 16436
+<8ff5> <8ff5> 16219
+<8ff6> <8ff6> 17097
+<8ff7> <8ff7> 15477
+<8ff8> <8ff8> 16249
+<8ff9> <8ff9> 17094
+<8ffa> <8ffa> 14543
+<8ffb> <8ffb> 16884
+<8ffc> <8ffc> 16193
+<8ffd> <8ffd> 14603
+<8ffe> <8ffe> 14560
+<9040> <9040> 17021
+<9041> <9041> 17136
+<9042> <9042> 16167
+<9043> <9043> 14370
+<9044> <9044> 14296
+<9045> <9045> 14242
+<9046> <9046> 16243
+<9047> <9047> 17080
+<9048> <9048> 16153
+<9049> <9049> 17079
+<904a> <904a> 15755
+<904b> <904b> 16681
+<904c> <904c> 16596
+<904d> <904d> 14581
+<904e> <904e> 16707
+<904f> <904f> 16418
+<9050> <9050> 16848
+<9051> <9051> 16885
+<9052> <9052> 16195
+<9053> <9053> 16584
+<9054> <9054> 16534
+<9055> <9055> 16477
+<9056> <9056> 16756
+<9057> <9057> 16702
+<9058> <9058> 16699
+<9059> <9059> 14788
+<905a> <905a> 15753
+<905b> <905b> 16901
+<905c> <905c> 14059
+<905d> <905d> 14789
+<905e> <905e> 15748
+<905f> <905f> 16468
+<9060> <9060> 6463
+<9061> <9061> 1561
+<9062> <9062> 2161
+<9063> <9063> 4447
+<9064> <9064> 16211
+<9065> <9065> 16159
+<9066> <9066> 13213
+<9067> <9067> 16312
+<9068> <9068> 15167
+<9069> <9069> 16210
+<906a> <906a> 14177
+<906b> <906b> 14172
+<906c> <906c> 16345
+<906d> <906d> 16343
+<906e> <906e> 16342
+<906f> <906f> 16019
+<9070> <9070> 14196
+<9071> <9071> 14203
+<9072> <9072> 15183
+<9073> <9073> 16391
+<9074> <9074> 16354
+<9075> <9075> 15993
+<9076> <9076> 15990
+<9077> <9077> 16359
+<9078> <9078> 3370
+<9079> <9079> 16366
+<907a> <907a> 16353
+<907b> <907b> 15991
+<907c> <907c> 16291
+<907d> <907d> 16212
+<907e> <907e> 14268
+<90a1> <90a1> 15994
+<90a2> <90a2> 16289
+<90a3> <90a3> 14273
+<90a4> <90a4> 16373
+<90a5> <90a5> 16286
+<90a6> <90a6> 15231
+<90a7> <90a7> 14347
+<90a8> <90a8> 16367
+<90a9> <90a9> 16380
+<90aa> <90aa> 14349
+<90ab> <90ab> 16365
+<90ac> <90ac> 16356
+<90ad> <90ad> 14353
+<90ae> <90ae> 16250
+<90af> <90af> 16290
+<90b0> <90b0> 15246
+<90b1> <90b1> 14364
+<90b2> <90b2> 16288
+<90b3> <90b3> 16352
+<90b4> <90b4> 15763
+<90b5> <90b5> 14375
+<90b6> <90b6> 16368
+<90b7> <90b7> 16293
+endcidrange
+
+100 begincidrange
+<90b8> <90b8> 14390
+<90b9> <90b9> 15757
+<90ba> <90ba> 16233
+<90bb> <90bb> 16258
+<90bc> <90bc> 16261
+<90bd> <90bd> 16259
+<90be> <90be> 16265
+<90bf> <90bf> 16255
+<90c0> <90c0> 15285
+<90c1> <90c1> 16263
+<90c2> <90c2> 16177
+<90c3> <90c3> 15764
+<90c4> <90c4> 560
+<90c5> <90c5> 17406
+<90c6> <90c6> 16144
+<90c7> <90c7> 14462
+<90c8> <90c8> 17387
+<90c9> <90c9> 16239
+<90ca> <90ca> 16027
+<90cb> <90cb> 16206
+<90cc> <90cc> 15304
+<90cd> <90cd> 7721
+<90ce> <90ce> 16200
+<90cf> <90cf> 14382
+<90d0> <90d0> 15456
+<90d1> <90d1> 10911
+<90d2> <90d2> 14483
+<90d3> <90d3> 17399
+<90d4> <90d4> 15988
+<90d5> <90d5> 15309
+<90d6> <90d6> 15049
+<90d7> <90d7> 16332
+<90d8> <90d8> 16337
+<90d9> <90d9> 16189
+<90da> <90da> 16202
+<90db> <90db> 14509
+<90dc> <90dc> 9042
+<90dd> <90dd> 16198
+<90de> <90de> 14514
+<90df> <90df> 16307
+<90e0> <90e0> 16141
+<90e1> <90e1> 14528
+<90e2> <90e2> 15919
+<90e3> <90e3> 14549
+<90e4> <90e4> 16181
+<90e5> <90e5> 14551
+<90e6> <90e6> 16175
+<90e7> <90e7> 16179
+<90e8> <90e8> 15765
+<90e9> <90e9> 15362
+<90ea> <90ea> 16242
+<90eb> <90eb> 15766
+<90ec> <90ec> 14567
+<90ed> <90ed> 16437
+<90ee> <90ee> 15371
+<90ef> <90ef> 14576
+<90f0> <90f0> 14583
+<90f1> <90f1> 16313
+<90f2> <90f2> 14592
+<90f3> <90f3> 16244
+<90f4> <90f4> 14601
+<90f5> <90f5> 16146
+<90f6> <90f6> 16151
+<90f7> <90f7> 16160
+<90f8> <90f8> 16315
+<90f9> <90f9> 16188
+<90fa> <90fa> 16308
+<90fb> <90fb> 16301
+<90fc> <90fc> 14618
+<90fd> <90fd> 14620
+<90fe> <90fe> 14619
+<9140> <9140> 15417
+<9141> <9141> 15985
+<9142> <9142> 15742
+<9143> <9143> 16187
+<9144> <9144> 16176
+<9145> <9145> 16260
+<9146> <9146> 17400
+<9147> <9147> 16143
+<9148> <9148> 16246
+<9149> <9149> 14643
+<914a> <914a> 16245
+<914b> <914b> 14656
+<914c> <914c> 16161
+<914d> <914d> 16272
+<914e> <914e> 14666
+<914f> <914f> 16256
+<9150> <9150> 16163
+<9151> <9151> 14672
+<9152> <9152> 15767
+<9153> <9153> 11845
+<9154> <9154> 1392
+<9155> <9155> 16045
+<9156> <9156> 13602
+<9157> <9157> 3043
+<9158> <9158> 1429
+<9159> <9159> 552
+<915a> <915a> 2709
+<915b> <915b> 4784
+<915c> <915c> 2330
+endcidrange
+
+100 begincidrange
+<915d> <915d> 17404
+<915e> <915e> 16274
+<915f> <915f> 16302
+<9160> <9160> 1986
+<9161> <9161> 2389
+<9162> <9162> 14213
+<9163> <9163> 15982
+<9164> <9164> 15725
+<9165> <9165> 16226
+<9166> <9166> 14792
+<9167> <9167> 16229
+<9168> <9168> 14653
+<9169> <9169> 16166
+<916a> <916a> 16493
+<916b> <916b> 16336
+<916c> <916c> 16182
+<916d> <916d> 16518
+<916e> <916e> 14674
+<916f> <916f> 16338
+<9170> <9170> 14424
+<9171> <9171> 16379
+<9172> <9172> 16231
+<9173> <9173> 16001
+<9174> <9174> 16329
+<9175> <9175> 16309
+<9176> <9176> 15996
+<9177> <9177> 15989
+<9178> <9178> 15479
+<9179> <9179> 15150
+<917a> <917a> 16205
+<917b> <917b> 17327
+<917c> <917c> 15975
+<917d> <917d> 16573
+<917e> <917e> 16236
+<91a1> <91a1> 14758
+<91a2> <91a2> 14664
+<91a3> <91a3> 16319
+<91a4> <91a4> 16223
+<91a5> <91a5> 14853
+<91a6> <91a6> 1781
+<91a7> <91a7> 16632
+<91a8> <91a8> 16813
+<91a9> <91a9> 16142
+<91aa> <91aa> 16674
+<91ab> <91ab> 16147
+<91ac> <91ac> 16139
+<91ad> <91ad> 16693
+<91ae> <91ae> 14891
+<91af> <91af> 16696
+<91b0> <91b0> 550
+<91b1> <91b1> 16713
+<91b2> <91b2> 15269
+<91b3> <91b3> 16385
+<91b4> <91b4> 16317
+<91b5> <91b5> 16296
+<91b6> <91b6> 16774
+<91b7> <91b7> 14932
+<91b8> <91b8> 16322
+<91b9> <91b9> 16786
+<91ba> <91ba> 16775
+<91bb> <91bb> 13188
+<91bc> <91bc> 16324
+<91bd> <91bd> 15769
+<91be> <91be> 15018
+<91bf> <91c0> 16862
+<91c1> <91c1> 16374
+<91c2> <91c2> 16221
+<91c3> <91c3> 16839
+<91c4> <91c4> 15761
+<91c5> <91c5> 15732
+<91c6> <91c6> 16204
+<91c7> <91c7> 16882
+<91c8> <91c8> 15013
+<91c9> <91c9> 15179
+<91ca> <91ca> 15750
+<91cb> <91cb> 16888
+<91cc> <91cc> 16960
+<91cd> <91cd> 16381
+<91ce> <91ce> 16295
+<91cf> <91cf> 16985
+<91d0> <91d0> 3698
+<91d1> <91d1> 16994
+<91d2> <91d2> 15486
+<91d3> <91d3> 14648
+<91d4> <91d4> 16947
+<91d5> <91d5> 10586
+<91d7> <91d7> 16279
+<91d8> <91d8> 16306
+<91d9> <91d9> 17034
+<91da> <91da> 16280
+<91db> <91db> 8084
+<91dc> <91dc> 16192
+<91dd> <91dd> 16207
+<91de> <91de> 16271
+<91df> <91df> 15727
+<91e0> <91e0> 17119
+<91e1> <91e1> 16213
+<91e2> <91e2> 16339
+<91e3> <91e3> 17134
+<91e4> <91e4> 16335
+endcidrange
+
+100 begincidrange
+<91e5> <91e5> 16340
+<91e6> <91e6> 15997
+<91e7> <91e7> 17159
+<91e8> <91e8> 17403
+<91e9> <91e9> 16346
+<91ea> <91ea> 3338
+<91eb> <91eb> 16247
+<91ec> <91ec> 15807
+<91ed> <91ed> 16428
+<91ee> <91ee> 16292
+<91ef> <91ef> 15727
+<91f0> <91f0> 15565
+<91f1> <91f1> 16228
+<91f2> <91f2> 16267
+<91f3> <91f3> 14447
+<91f4> <91f4> 6513
+<91f5> <91f5> 7323
+<91f6> <91f6> 1861
+<91f7> <91f7> 7541
+<91f8> <91f8> 14472
+<91f9> <91f9> 14146
+<91fa> <91fa> 11072
+<91fb> <91fb> 14057
+<91fc> <91fc> 14304
+<91fd> <91fd> 15894
+<91fe> <91fe> 14460
+<9240> <9240> 14250
+<9241> <9241> 16270
+<9242> <9242> 16604
+<9243> <9243> 15482
+<9244> <9244> 16294
+<9245> <9245> 16479
+<9246> <9246> 15398
+<9247> <9247> 14430
+<9248> <9248> 16165
+<9249> <9249> 16456
+<924a> <924a> 15745
+<924b> <924b> 14606
+<924c> <924c> 16516
+<924d> <924d> 16664
+<924e> <924e> 16727
+<924f> <924f> 14594
+<9250> <9250> 14495
+<9251> <9251> 16377
+<9252> <9252> 14371
+<9253> <9253> 14449
+<9254> <9254> 14058
+<9255> <9255> 14188
+<9256> <9256> 14144
+<9257> <9257> 14324
+<9258> <9258> 17120
+<9259> <9259> 16987
+<925a> <925a> 14061
+<925b> <925b> 15124
+<925c> <925c> 17093
+<925d> <925d> 16523
+<925e> <925e> 14501
+<925f> <925f> 16746
+<9260> <9260> 16797
+<9261> <9261> 16708
+<9262> <9262> 16975
+<9263> <9263> 16225
+<9264> <9264> 16344
+<9265> <9265> 1564
+<a140> <a158> 99
+<a159> <a15c> 13743
+<a15d> <a17e> 128
+<a1a1> <a1f5> 162
+<a1f6> <a1f6> 248
+<a1f7> <a1f7> 247
+<a1f8> <a1fe> 249
+<a240> <a27e> 256
+<a2a1> <a2fe> 319
+<a340> <a37e> 413
+<a3a1> <a3bb> 476
+<a3bd> <a3bf> 503
+<a440> <a47e> 595
+<a4a1> <a4fe> 658
+<a540> <a57e> 752
+<a5a1> <a5fe> 815
+<a640> <a67e> 909
+<a6a1> <a6fe> 972
+<a740> <a77e> 1066
+<a7a1> <a7fe> 1129
+<a840> <a87e> 1223
+<a8a1> <a8fe> 1286
+<a940> <a97e> 1380
+<a9a1> <a9fe> 1443
+<aa40> <aa7e> 1537
+<aaa1> <aafe> 1600
+<ab40> <ab7e> 1694
+<aba1> <abfe> 1757
+<ac40> <ac7e> 1851
+<aca1> <acfd> 1914
+<acfe> <acfe> 2431
+<ad40> <ad7e> 2007
+<ada1> <adfe> 2070
+<ae40> <ae7e> 2164
+<aea1> <aefe> 2227
+<af40> <af7e> 2321
+endcidrange
+
+100 begincidrange
+<afa1> <afcf> 2384
+<afd0> <affe> 2432
+<b040> <b07e> 2479
+<b0a1> <b0fe> 2542
+<b140> <b17e> 2636
+<b1a1> <b1fe> 2699
+<b240> <b27e> 2793
+<b2a1> <b2fe> 2856
+<b340> <b37e> 2950
+<b3a1> <b3fe> 3013
+<b440> <b47e> 3107
+<b4a1> <b4fe> 3170
+<b540> <b57e> 3264
+<b5a1> <b5fe> 3327
+<b640> <b67e> 3421
+<b6a1> <b6fe> 3484
+<b740> <b77e> 3578
+<b7a1> <b7fe> 3641
+<b840> <b87e> 3735
+<b8a1> <b8fe> 3798
+<b940> <b97e> 3892
+<b9a1> <b9fe> 3955
+<ba40> <ba7e> 4049
+<baa1> <bafe> 4112
+<bb40> <bb7e> 4206
+<bba1> <bbc7> 4269
+<bbc8> <bbfe> 4309
+<bc40> <bc7e> 4364
+<bca1> <bcfe> 4427
+<bd40> <bd7e> 4521
+<bda1> <bdfe> 4584
+<be40> <be51> 4678
+<be52> <be52> 4308
+<be53> <be7e> 4696
+<bea1> <befe> 4740
+<bf40> <bf7e> 4834
+<bfa1> <bffe> 4897
+<c040> <c07e> 4991
+<c0a1> <c0fe> 5054
+<c140> <c17e> 5148
+<c1a1> <c1aa> 5211
+<c1ab> <c1fe> 5222
+<c240> <c27e> 5306
+<c2a1> <c2ca> 5369
+<c2cb> <c2cb> 5221
+<c2cc> <c2fe> 5411
+<c340> <c360> 5462
+<c361> <c37e> 5496
+<c3a1> <c3b8> 5526
+<c3b9> <c3b9> 5551
+<c3ba> <c3ba> 5550
+<c3bb> <c3fe> 5552
+<c440> <c455> 5620
+<c456> <c456> 5495
+<c457> <c47e> 5642
+<c4a1> <c4fe> 5682
+<c540> <c57e> 5776
+<c5a1> <c5fe> 5839
+<c640> <c67e> 5933
+<c940> <c949> 5996
+<c94a> <c94a> 628
+<c94b> <c96b> 6006
+<c96c> <c97e> 6040
+<c9a1> <c9bd> 6059
+<c9be> <c9be> 6039
+<c9bf> <c9ec> 6088
+<c9ed> <c9fe> 6135
+<ca40> <ca7e> 6153
+<caa1> <caf6> 6216
+<caf7> <caf7> 6134
+<caf8> <cafe> 6302
+<cb40> <cb7e> 6309
+<cba1> <cbfe> 6372
+<cc40> <cc7e> 6466
+<cca1> <ccfe> 6529
+<cd40> <cd7e> 6623
+<cda1> <cdfe> 6686
+<ce40> <ce7e> 6780
+<cea1> <cefe> 6843
+<cf40> <cf7e> 6937
+<cfa1> <cffe> 7000
+<d040> <d07e> 7094
+<d0a1> <d0fe> 7157
+<d140> <d17e> 7251
+<d1a1> <d1fe> 7314
+<d240> <d27e> 7408
+<d2a1> <d2fe> 7471
+<d340> <d37e> 7565
+<d3a1> <d3fe> 7628
+<d440> <d47e> 7722
+<d4a1> <d4fe> 7785
+<d540> <d57e> 7879
+<d5a1> <d5fe> 7942
+<d640> <d67e> 8036
+<d6a1> <d6cb> 8099
+<d6cc> <d6cc> 8788
+<d6cd> <d6fe> 8143
+<d740> <d779> 8193
+<d77a> <d77a> 8889
+<d77b> <d77e> 8251
+endcidrange
+
+100 begincidrange
+<d7a1> <d7fe> 8255
+<d840> <d87e> 8349
+<d8a1> <d8fe> 8412
+<d940> <d97e> 8506
+<d9a1> <d9fe> 8569
+<da40> <da7e> 8663
+<daa1> <dade> 8726
+<dadf> <dadf> 8142
+<dae0> <dafe> 8789
+<db40> <db7e> 8820
+<dba1> <dba6> 8883
+<dba7> <dbfe> 8890
+<dc40> <dc7e> 8978
+<dca1> <dcfe> 9041
+<dd40> <dd7e> 9135
+<dda1> <ddfb> 9198
+<ddfc> <ddfc> 9089
+<ddfd> <ddfe> 9289
+<de40> <de7e> 9291
+<dea1> <defe> 9354
+<df40> <df7e> 9448
+<dfa1> <dffe> 9511
+<e040> <e07e> 9605
+<e0a1> <e0fe> 9668
+<e140> <e17e> 9762
+<e1a1> <e1fe> 9825
+<e240> <e27e> 9919
+<e2a1> <e2fe> 9982
+<e340> <e37e> 10076
+<e3a1> <e3fe> 10139
+<e440> <e47e> 10233
+<e4a1> <e4fe> 10296
+<e540> <e57e> 10390
+<e5a1> <e5fe> 10453
+<e640> <e67e> 10547
+<e6a1> <e6fe> 10610
+<e740> <e77e> 10704
+<e7a1> <e7fe> 10767
+<e840> <e87e> 10861
+<e8a1> <e8a2> 10924
+<e8a3> <e8fe> 10927
+<e940> <e975> 11019
+<e976> <e97e> 11074
+<e9a1> <e9fe> 11083
+<ea40> <ea7e> 11177
+<eaa1> <eafe> 11240
+<eb40> <eb5a> 11334
+<eb5b> <eb7e> 11362
+<eba1> <ebf0> 11398
+<ebf1> <ebf1> 10926
+<ebf2> <ebfe> 11478
+<ec40> <ec7e> 11491
+<eca1> <ecdd> 11554
+<ecde> <ecde> 11073
+<ecdf> <ecfe> 11615
+<ed40> <ed7e> 11647
+<eda1> <eda9> 11710
+<edaa> <edfe> 11720
+<ee40> <ee7e> 11805
+<eea1> <eeea> 11868
+<eeeb> <eeeb> 12308
+<eeec> <eefe> 11942
+<ef40> <ef7e> 11961
+<efa1> <effe> 12024
+<f040> <f055> 12118
+<f056> <f056> 11719
+<f057> <f07e> 12140
+<f0a1> <f0ca> 12180
+<f0cb> <f0cb> 11361
+<f0cc> <f0fe> 12222
+<f140> <f162> 12273
+<f163> <f16a> 12309
+<f16b> <f16b> 12640
+<f16c> <f17e> 12317
+<f1a1> <f1fe> 12336
+<f240> <f267> 12430
+<f268> <f268> 12783
+<f269> <f27e> 12470
+<f2a1> <f2c2> 12492
+<f2c3> <f2fe> 12527
+<f340> <f374> 12587
+<f375> <f37e> 12641
+<f3a1> <f3fe> 12651
+<f440> <f465> 12745
+<f466> <f47e> 12784
+<f4a1> <f4b4> 12809
+<f4b5> <f4b5> 12526
+<f4b6> <f4fc> 12829
+<f4fd> <f4fe> 12901
+<f540> <f57e> 12903
+<f5a1> <f5fe> 12966
+<f640> <f662> 13060
+<f663> <f663> 12900
+<f664> <f67e> 13095
+<f6a1> <f6fe> 13122
+<f740> <f77e> 13216
+<f7a1> <f7fe> 13279
+<f840> <f87e> 13373
+<f8a1> <f8fe> 13436
+<f940> <f976> 13530
+endcidrange
+
+7 begincidrange
+<f977> <f97e> 13586
+<f9a1> <f9c3> 13594
+<f9c4> <f9c4> 13585
+<f9c5> <f9c5> 13629
+<f9c6> <f9c6> 13641
+<f9c7> <f9d1> 13630
+<f9d2> <f9d5> 13642
+endcidrange
+endcmap
+CMapName currentdict /CMap defineresource pop
+end
+end
+
+%%EndResource
+%%EOF
diff --git a/src/main/resources/Resources/cmap/HKdlb-B5-V b/src/main/resources/Resources/cmap/HKdlb-B5-V
new file mode 100644
index 0000000..88c6766
--- /dev/null
+++ b/src/main/resources/Resources/cmap/HKdlb-B5-V
@@ -0,0 +1,71 @@
+%!PS-Adobe-3.0 Resource-CMap
+%%DocumentNeededResources: ProcSet (CIDInit)
+%%DocumentNeededResources: CMap (HKdlb-B5-H)
+%%IncludeResource: ProcSet (CIDInit)
+%%IncludeResource: CMap (HKdlb-B5-H)
+%%BeginResource: CMap (HKdlb-B5-V)
+%%Title: (HKdlb-B5-V Adobe CNS1 0)
+%%Version: 1.001
+%%Copyright: -----------------------------------------------------------
+%%Copyright: Copyright 1990-2000 Adobe Systems Incorporated.
+%%Copyright: All Rights Reserved.
+%%Copyright:
+%%Copyright: Patents Pending
+%%Copyright:
+%%Copyright: NOTICE: All information contained herein is the property
+%%Copyright: of Adobe Systems Incorporated.
+%%Copyright:
+%%Copyright: Permission is granted for redistribution of this file
+%%Copyright: provided this copyright notice is maintained intact and
+%%Copyright: that the contents of this file are not altered in any
+%%Copyright: way from its original form.
+%%Copyright:
+%%Copyright: PostScript and Display PostScript are trademarks of
+%%Copyright: Adobe Systems Incorporated which may be registered in
+%%Copyright: certain jurisdictions.
+%%Copyright: -----------------------------------------------------------
+%%EndComments
+
+/CIDInit /ProcSet findresource begin
+
+12 dict begin
+
+begincmap
+
+/HKdlb-B5-H usecmap
+
+/CIDSystemInfo 3 dict dup begin
+ /Registry (Adobe) def
+ /Ordering (CNS1) def
+ /Supplement 0 def
+end def
+
+/CMapName /HKdlb-B5-V def
+/CMapVersion 1.001 def
+/CMapType 1 def
+
+/XUID [1 10 25524] def
+
+/WMode 1 def
+
+12 begincidrange
+<a14b> <a14b> 13646
+<a15a> <a15a> 13743
+<a15c> <a15c> 13745
+<a15d> <a15e> 130
+<a161> <a162> 134
+<a165> <a166> 138
+<a169> <a16a> 142
+<a16d> <a16e> 146
+<a171> <a172> 150
+<a175> <a176> 154
+<a179> <a17a> 158
+<a1e3> <a1e3> 13647
+endcidrange
+endcmap
+CMapName currentdict /CMap defineresource pop
+end
+end
+
+%%EndResource
+%%EOF
diff --git a/src/main/resources/Resources/cmap/HKgccs-B5-H b/src/main/resources/Resources/cmap/HKgccs-B5-H
new file mode 100644
index 0000000..90b8ca3
--- /dev/null
+++ b/src/main/resources/Resources/cmap/HKgccs-B5-H
@@ -0,0 +1,631 @@
+%!PS-Adobe-3.0 Resource-CMap
+%%DocumentNeededResources: ProcSet (CIDInit)
+%%IncludeResource: ProcSet (CIDInit)
+%%BeginResource: CMap (HKgccs-B5-H)
+%%Title: (HKgccs-B5-H Adobe CNS1 1)
+%%Version: 1.001
+%%Copyright: -----------------------------------------------------------
+%%Copyright: Copyright 1990-200 Adobe Systems Incorporated.
+%%Copyright: All Rights Reserved.
+%%Copyright:
+%%Copyright: Patents Pending
+%%Copyright:
+%%Copyright: NOTICE: All information contained herein is the property
+%%Copyright: of Adobe Systems Incorporated.
+%%Copyright:
+%%Copyright: Permission is granted for redistribution of this file
+%%Copyright: provided this copyright notice is maintained intact and
+%%Copyright: that the contents of this file are not altered in any
+%%Copyright: way from its original form.
+%%Copyright:
+%%Copyright: PostScript and Display PostScript are trademarks of
+%%Copyright: Adobe Systems Incorporated which may be registered in
+%%Copyright: certain jurisdictions.
+%%Copyright: -----------------------------------------------------------
+%%EndComments
+
+/CIDInit /ProcSet findresource begin
+
+12 dict begin
+
+begincmap
+
+/CIDSystemInfo 3 dict dup begin
+ /Registry (Adobe) def
+ /Ordering (CNS1) def
+ /Supplement 1 def
+end def
+
+/CMapName /HKgccs-B5-H def
+/CMapVersion 1.001 def
+/CMapType 1 def
+
+/XUID [1 10 25399] def
+
+/WMode 0 def
+
+2 begincodespacerange
+ <00> <80>
+ <8A40> <FEFE>
+endcodespacerange
+
+1 beginnotdefrange
+<00> <1f> 1
+endnotdefrange
+
+100 begincidrange
+<20> <7e> 1
+<8a40> <8a7e> 17160
+<8aa1> <8ae5> 17223
+<8b41> <8b42> 17292
+<8b45> <8b45> 17294
+<8b47> <8b47> 17295
+<8b49> <8b49> 17296
+<8b4b> <8b4b> 17297
+<8b4d> <8b50> 17298
+<8b54> <8b54> 17302
+<8b58> <8b58> 17303
+<8b5a> <8b5a> 17304
+<8e40> <8e44> 14123
+<8e46> <8e6a> 14128
+<8e6c> <8e75> 14165
+<8e77> <8e7d> 14175
+<8e7e> <8e7e> 289
+<8ea1> <8ea5> 14182
+<8ea7> <8ec8> 14187
+<8eca> <8ee4> 14221
+<8ee6> <8eee> 14248
+<8ef0> <8efe> 14257
+<8f40> <8f58> 14272
+<8f5a> <8f5e> 14297
+<8f60> <8f66> 14302
+<8f68> <8f7e> 14309
+<8fa1> <8fc4> 14332
+<8fc6> <8fc6> 14368
+<8fc8> <8fd9> 14369
+<8fdb> <8ffb> 14387
+<8ffd> <8ffe> 14420
+<9040> <905b> 14422
+<905e> <906e> 14450
+<9070> <9079> 14467
+<907a> <907a> 14057
+<907b> <907e> 14477
+<90a1> <90a5> 14481
+<90a7> <90b7> 14486
+<90b9> <90fe> 14503
+<9140> <9164> 14573
+<9166> <916d> 14610
+<916f> <917d> 14618
+<91a1> <91a1> 14633
+<91a3> <91fe> 14634
+<9240> <927e> 14726
+<92a1> <92ae> 14789
+<92af> <92b0> 281
+<92b1> <92b1> 284
+<92b2> <92b2> 283
+<92b3> <92e4> 14803
+<92e6> <92f1> 14853
+<92f3> <92fe> 14865
+<9340> <9367> 14877
+<9369> <937e> 14917
+<93a1> <93a9> 14939
+<93ab> <93c1> 14948
+<93c3> <93e4> 14971
+<93e6> <93ea> 15005
+<93ec> <93fe> 15010
+<9440> <9445> 15029
+<9447> <947e> 15035
+<94a1> <94fe> 15091
+<9540> <954c> 15185
+<954e> <9559> 15198
+<955b> <957e> 15210
+<95a1> <95c5> 15246
+<95c7> <95fe> 15283
+<9640> <967e> 15339
+<96a1> <96d3> 15402
+<96d5> <96fe> 15453
+<9740> <977e> 15495
+<97a1> <97fe> 15558
+<9840> <9874> 15652
+<9877> <9877> 15705
+<987a> <987a> 15706
+<98a3> <98a3> 15707
+<98af> <98af> 15708
+<98b6> <98b6> 15709
+<98b9> <98b9> 15710
+<98bd> <98be> 15711
+<98c2> <98c2> 15713
+<98c4> <98c4> 15714
+<98c6> <98c7> 15715
+<98e3> <98e3> 15717
+<98e7> <98e7> 15718
+<98ed> <98ed> 15719
+<98f0> <98f0> 15720
+<98f2> <98f2> 15721
+<98fc> <98fc> 15722
+<9943> <9943> 15723
+<9945> <9945> 15724
+<994f> <994f> 15725
+<996a> <996a> 15726
+<996e> <996e> 15727
+<9975> <9975> 15728
+<9978> <9978> 15729
+<99a2> <99a2> 15730
+<99ae> <99ae> 15731
+<99b6> <99b6> 15732
+<99ba> <99ba> 15733
+endcidrange
+
+100 begincidrange
+<99e2> <99e2> 15734
+<99f4> <99f4> 15735
+<9a4a> <9a4a> 15736
+<9a4c> <9a4c> 15737
+<9a59> <9a59> 15738
+<9a61> <9a61> 15739
+<9a68> <9a68> 15740
+<9a73> <9a73> 15741
+<9a7e> <9a7e> 15742
+<9ab2> <9ab2> 15743
+<9ab7> <9ab7> 15744
+<9ab9> <9ab9> 15745
+<9abb> <9abb> 15746
+<9ac7> <9ac7> 15747
+<9ad0> <9ad0> 15748
+<9ad2> <9ad2> 15749
+<9ad9> <9adb> 15750
+<9ae2> <9ae2> 15753
+<9ae4> <9ae4> 15754
+<9ae8> <9ae8> 15755
+<9af2> <9af2> 15756
+<9af6> <9af6> 15757
+<9afb> <9afb> 15758
+<9b46> <9b46> 15759
+<9b4a> <9b4a> 15760
+<9b4c> <9b4c> 15761
+<9b54> <9b54> 15762
+<9b58> <9b58> 15763
+<9b5a> <9b5a> 15764
+<9b5c> <9b5c> 15765
+<9b5e> <9b5f> 15766
+<9b70> <9b73> 15768
+<9b76> <9b78> 15772
+<9b7b> <9b7c> 15775
+<9b7e> <9b7e> 15777
+<9ba1> <9ba1> 15778
+<9ba3> <9ba4> 15779
+<9ba7> <9baa> 15781
+<9bac> <9bac> 15785
+<9baf> <9baf> 15786
+<9bb2> <9bb9> 15787
+<9bbe> <9bbe> 15795
+<9bc0> <9bc6> 15796
+<9bca> <9bca> 15803
+<9bcc> <9bcc> 15804
+<9bd0> <9bd1> 15805
+<9bd3> <9bd3> 15807
+<9bd5> <9bd5> 15808
+<9bd8> <9bda> 15809
+<9bdd> <9bdd> 15812
+<9bde> <9bde> 7188
+<9bdf> <9bdf> 15813
+<9be1> <9be1> 15814
+<9be3> <9be3> 15815
+<9be7> <9be7> 15816
+<9be9> <9bec> 15817
+<9bee> <9bef> 15821
+<9bf3> <9bf3> 15823
+<9bf6> <9bf6> 15824
+<9bf8> <9bf9> 15825
+<9bfb> <9bfc> 15827
+<9c40> <9c42> 15829
+<9c44> <9c46> 15832
+<9c48> <9c48> 15835
+<9c4a> <9c4a> 15836
+<9c4d> <9c53> 15837
+<9c55> <9c55> 15844
+<9c57> <9c5b> 15845
+<9c5d> <9c5d> 15850
+<9c60> <9c60> 15851
+<9c62> <9c62> 15852
+<9c64> <9c66> 15853
+<9c68> <9c68> 15856
+<9c6a> <9c6a> 15857
+<9c6b> <9c6b> 13418
+<9c6d> <9c6d> 15858
+<9c6f> <9c72> 15859
+<9c75> <9c77> 15863
+<9c79> <9c79> 15866
+<9c7b> <9c7c> 15867
+<9c7e> <9c7e> 15869
+<9ca1> <9ca2> 15870
+<9ca5> <9ca5> 15872
+<9ca8> <9ca9> 15873
+<9cab> <9cab> 15875
+<9cad> <9cae> 15876
+<9cb1> <9cba> 15878
+<9cbc> <9cc2> 15888
+<9cc6> <9ccd> 15895
+<9ccf> <9cd3> 15903
+<9cd8> <9cda> 15908
+<9cdc> <9ce5> 15911
+<9ce7> <9ce9> 15921
+<9ceb> <9cec> 15924
+<9cee> <9cf9> 15926
+<9cfd> <9cfd> 15938
+<9d46> <9d46> 15939
+<9d49> <9d4a> 15940
+<9d4c> <9d4d> 15942
+<9d4f> <9d4f> 15944
+endcidrange
+
+100 begincidrange
+<9d51> <9d51> 15945
+<9d55> <9d55> 15946
+<9d57> <9d57> 9665
+<9d5a> <9d5a> 15947
+<9d62> <9d62> 15948
+<9d64> <9d64> 15949
+<9d79> <9d79> 15950
+<9d7e> <9d7e> 15951
+<9da5> <9da8> 15952
+<9daa> <9daa> 15956
+<9dac> <9dae> 15957
+<9db0> <9db0> 15960
+<9db3> <9db3> 15961
+<9db5> <9db5> 15962
+<9db7> <9db7> 15963
+<9dbc> <9dbd> 15964
+<9dbf> <9dc0> 15966
+<9dc3> <9dc4> 15968
+<9dc7> <9dc8> 15970
+<9dca> <9dca> 15972
+<9dcd> <9dd1> 15973
+<9dd3> <9dd5> 15978
+<9dda> <9dfb> 15981
+<9dfd> <9dfe> 16015
+<9e40> <9e62> 16017
+<9e64> <9e65> 16052
+<9e68> <9e68> 16054
+<9e6a> <9e6a> 16055
+<9e71> <9e71> 16056
+<9e73> <9e73> 16057
+<9e77> <9e78> 16058
+<9e7a> <9e7a> 16060
+<9e7c> <9e7c> 16061
+<9e7e> <9e7e> 16062
+<9ea1> <9ea2> 16063
+<9ea4> <9ea6> 16065
+<9ea9> <9eaa> 16068
+<9eac> <9ead> 16070
+<9eaf> <9eb1> 16072
+<9eb4> <9eb4> 16075
+<9eb6> <9eb7> 16076
+<9eb9> <9eb9> 16078
+<9ebc> <9ebc> 16079
+<9ebf> <9ec0> 16080
+<9ec4> <9ec5> 16082
+<9ec7> <9eca> 16084
+<9ecc> <9ecd> 16088
+<9ed0> <9ed1> 16090
+<9ed3> <9ed3> 16092
+<9ed6> <9ed7> 16093
+<9eda> <9ef1> 16095
+<9ef3> <9ef5> 16119
+<9ef9> <9efa> 16122
+<9efc> <9efe> 16124
+<9f40> <9f42> 16127
+<9f44> <9f47> 16130
+<9f49> <9f4a> 16134
+<9f4d> <9f67> 16136
+<9f69> <9f6f> 16163
+<9f71> <9f7e> 16170
+<9fa1> <9fb4> 16184
+<9fb6> <9fba> 16204
+<9fbc> <9fbe> 16209
+<9fc0> <9fc0> 16212
+<9fc2> <9fe3> 16213
+<9fe5> <9ff8> 16247
+<9ffa> <9ffe> 16267
+<a041> <a046> 16272
+<a048> <a054> 16278
+<a056> <a06c> 16291
+<a06e> <a07a> 16314
+<a07c> <a07e> 16327
+<a0a1> <a0a1> 16330
+<a0a3> <a0a6> 16331
+<a0a8> <a0c4> 16335
+<a0c6> <a0cf> 16364
+<a0d1> <a0e2> 16374
+<a0e4> <a0e6> 16392
+<a140> <a158> 99
+<a159> <a15c> 13743
+<a15d> <a17e> 128
+<a1a1> <a1f5> 162
+<a1f6> <a1f6> 248
+<a1f7> <a1f7> 247
+<a1f8> <a1fe> 249
+<a240> <a27e> 256
+<a2a1> <a2fe> 319
+<a340> <a37e> 413
+<a3a1> <a3bb> 476
+<a3bd> <a3bf> 503
+<a440> <a47e> 595
+<a4a1> <a4fe> 658
+<a540> <a57e> 752
+<a5a1> <a5fe> 815
+<a640> <a67e> 909
+<a6a1> <a6fe> 972
+<a740> <a77e> 1066
+<a7a1> <a7fe> 1129
+<a840> <a87e> 1223
+<a8a1> <a8fe> 1286
+endcidrange
+
+100 begincidrange
+<a940> <a97e> 1380
+<a9a1> <a9fe> 1443
+<aa40> <aa7e> 1537
+<aaa1> <aafe> 1600
+<ab40> <ab7e> 1694
+<aba1> <abfe> 1757
+<ac40> <ac7e> 1851
+<aca1> <acfd> 1914
+<acfe> <acfe> 2431
+<ad40> <ad7e> 2007
+<ada1> <adfe> 2070
+<ae40> <ae7e> 2164
+<aea1> <aefe> 2227
+<af40> <af7e> 2321
+<afa1> <afcf> 2384
+<afd0> <affe> 2432
+<b040> <b07e> 2479
+<b0a1> <b0fe> 2542
+<b140> <b17e> 2636
+<b1a1> <b1fe> 2699
+<b240> <b27e> 2793
+<b2a1> <b2fe> 2856
+<b340> <b37e> 2950
+<b3a1> <b3fe> 3013
+<b440> <b47e> 3107
+<b4a1> <b4fe> 3170
+<b540> <b57e> 3264
+<b5a1> <b5fe> 3327
+<b640> <b67e> 3421
+<b6a1> <b6fe> 3484
+<b740> <b77e> 3578
+<b7a1> <b7fe> 3641
+<b840> <b87e> 3735
+<b8a1> <b8fe> 3798
+<b940> <b97e> 3892
+<b9a1> <b9fe> 3955
+<ba40> <ba7e> 4049
+<baa1> <bafe> 4112
+<bb40> <bb7e> 4206
+<bba1> <bbc7> 4269
+<bbc8> <bbfe> 4309
+<bc40> <bc7e> 4364
+<bca1> <bcfe> 4427
+<bd40> <bd7e> 4521
+<bda1> <bdfe> 4584
+<be40> <be51> 4678
+<be52> <be52> 4308
+<be53> <be7e> 4696
+<bea1> <befe> 4740
+<bf40> <bf7e> 4834
+<bfa1> <bffe> 4897
+<c040> <c07e> 4991
+<c0a1> <c0fe> 5054
+<c140> <c17e> 5148
+<c1a1> <c1aa> 5211
+<c1ab> <c1fe> 5222
+<c240> <c27e> 5306
+<c2a1> <c2ca> 5369
+<c2cb> <c2cb> 5221
+<c2cc> <c2fe> 5411
+<c340> <c360> 5462
+<c361> <c37e> 5496
+<c3a1> <c3b8> 5526
+<c3b9> <c3b9> 5551
+<c3ba> <c3ba> 5550
+<c3bb> <c3fe> 5552
+<c440> <c455> 5620
+<c456> <c456> 5495
+<c457> <c47e> 5642
+<c4a1> <c4fe> 5682
+<c540> <c57e> 5776
+<c5a1> <c5fe> 5839
+<c640> <c67e> 5933
+<c940> <c949> 5996
+<c94a> <c94a> 628
+<c94b> <c96b> 6006
+<c96c> <c97e> 6040
+<c9a1> <c9bd> 6059
+<c9be> <c9be> 6039
+<c9bf> <c9ec> 6088
+<c9ed> <c9fe> 6135
+<ca40> <ca7e> 6153
+<caa1> <caf6> 6216
+<caf7> <caf7> 6134
+<caf8> <cafe> 6302
+<cb40> <cb7e> 6309
+<cba1> <cbfe> 6372
+<cc40> <cc7e> 6466
+<cca1> <ccfe> 6529
+<cd40> <cd7e> 6623
+<cda1> <cdfe> 6686
+<ce40> <ce7e> 6780
+<cea1> <cefe> 6843
+<cf40> <cf7e> 6937
+<cfa1> <cffe> 7000
+<d040> <d07e> 7094
+<d0a1> <d0fe> 7157
+<d140> <d17e> 7251
+<d1a1> <d1fe> 7314
+<d240> <d27e> 7408
+endcidrange
+
+100 begincidrange
+<d2a1> <d2fe> 7471
+<d340> <d37e> 7565
+<d3a1> <d3fe> 7628
+<d440> <d47e> 7722
+<d4a1> <d4fe> 7785
+<d540> <d57e> 7879
+<d5a1> <d5fe> 7942
+<d640> <d67e> 8036
+<d6a1> <d6cb> 8099
+<d6cc> <d6cc> 8788
+<d6cd> <d6fe> 8143
+<d740> <d779> 8193
+<d77a> <d77a> 8889
+<d77b> <d77e> 8251
+<d7a1> <d7fe> 8255
+<d840> <d87e> 8349
+<d8a1> <d8fe> 8412
+<d940> <d97e> 8506
+<d9a1> <d9fe> 8569
+<da40> <da7e> 8663
+<daa1> <dade> 8726
+<dadf> <dadf> 8142
+<dae0> <dafe> 8789
+<db40> <db7e> 8820
+<dba1> <dba6> 8883
+<dba7> <dbfe> 8890
+<dc40> <dc7e> 8978
+<dca1> <dcfe> 9041
+<dd40> <dd7e> 9135
+<dda1> <ddfb> 9198
+<ddfc> <ddfc> 9089
+<ddfd> <ddfe> 9289
+<de40> <de7e> 9291
+<dea1> <defe> 9354
+<df40> <df7e> 9448
+<dfa1> <dffe> 9511
+<e040> <e07e> 9605
+<e0a1> <e0fe> 9668
+<e140> <e17e> 9762
+<e1a1> <e1fe> 9825
+<e240> <e27e> 9919
+<e2a1> <e2fe> 9982
+<e340> <e37e> 10076
+<e3a1> <e3fe> 10139
+<e440> <e47e> 10233
+<e4a1> <e4fe> 10296
+<e540> <e57e> 10390
+<e5a1> <e5fe> 10453
+<e640> <e67e> 10547
+<e6a1> <e6fe> 10610
+<e740> <e77e> 10704
+<e7a1> <e7fe> 10767
+<e840> <e87e> 10861
+<e8a1> <e8a2> 10924
+<e8a3> <e8fe> 10927
+<e940> <e975> 11019
+<e976> <e97e> 11074
+<e9a1> <e9fe> 11083
+<ea40> <ea7e> 11177
+<eaa1> <eafe> 11240
+<eb40> <eb5a> 11334
+<eb5b> <eb7e> 11362
+<eba1> <ebf0> 11398
+<ebf1> <ebf1> 10926
+<ebf2> <ebfe> 11478
+<ec40> <ec7e> 11491
+<eca1> <ecdd> 11554
+<ecde> <ecde> 11073
+<ecdf> <ecfe> 11615
+<ed40> <ed7e> 11647
+<eda1> <eda9> 11710
+<edaa> <edfe> 11720
+<ee40> <ee7e> 11805
+<eea1> <eeea> 11868
+<eeeb> <eeeb> 12308
+<eeec> <eefe> 11942
+<ef40> <ef7e> 11961
+<efa1> <effe> 12024
+<f040> <f055> 12118
+<f056> <f056> 11719
+<f057> <f07e> 12140
+<f0a1> <f0ca> 12180
+<f0cb> <f0cb> 11361
+<f0cc> <f0fe> 12222
+<f140> <f162> 12273
+<f163> <f16a> 12309
+<f16b> <f16b> 12640
+<f16c> <f17e> 12317
+<f1a1> <f1fe> 12336
+<f240> <f267> 12430
+<f268> <f268> 12783
+<f269> <f27e> 12470
+<f2a1> <f2c2> 12492
+<f2c3> <f2fe> 12527
+<f340> <f374> 12587
+<f375> <f37e> 12641
+<f3a1> <f3fe> 12651
+<f440> <f465> 12745
+<f466> <f47e> 12784
+<f4a1> <f4b4> 12809
+endcidrange
+
+52 begincidrange
+<f4b5> <f4b5> 12526
+<f4b6> <f4fc> 12829
+<f4fd> <f4fe> 12901
+<f540> <f57e> 12903
+<f5a1> <f5fe> 12966
+<f640> <f662> 13060
+<f663> <f663> 12900
+<f664> <f67e> 13095
+<f6a1> <f6fe> 13122
+<f740> <f77e> 13216
+<f7a1> <f7fe> 13279
+<f840> <f87e> 13373
+<f8a1> <f8fe> 13436
+<f940> <f976> 13530
+<f977> <f97e> 13586
+<f9a1> <f9c3> 13594
+<f9c4> <f9c4> 13585
+<f9c5> <f9c5> 13629
+<f9c6> <f9c6> 13641
+<f9c7> <f9d1> 13630
+<f9d2> <f9d5> 13642
+<fa40> <fa7e> 16395
+<faa1> <fafe> 16458
+<fb40> <fb7e> 16552
+<fba1> <fbbe> 16615
+<fbc0> <fbcc> 16645
+<fbce> <fbfe> 16658
+<fc40> <fc49> 16707
+<fc4b> <fc4e> 16717
+<fc4f> <fc4f> 8495
+<fc50> <fc51> 16721
+<fc53> <fc62> 16723
+<fc64> <fc74> 16739
+<fc76> <fc7e> 16756
+<fca1> <fcb8> 16765
+<fcb9> <fcb9> 4447
+<fcba> <fcbb> 16789
+<fcbd> <fce2> 16791
+<fce4> <fced> 16829
+<fcef> <fcfe> 16839
+<fd40> <fd48> 16855
+<fd4a> <fd7e> 16864
+<fda1> <fdf1> 16917
+<fdf3> <fdfe> 16998
+<fe40> <fe6c> 17010
+<fe6e> <fe77> 17055
+<fe79> <fe7e> 17065
+<fea1> <fea9> 17071
+<feaa> <feaa> 288
+<feab> <fedd> 17080
+<fee0> <feec> 17131
+<feef> <fefe> 17144
+endcidrange
+endcmap
+CMapName currentdict /CMap defineresource pop
+end
+end
+
+%%EndResource
+%%EOF
diff --git a/src/main/resources/Resources/cmap/HKgccs-B5-V b/src/main/resources/Resources/cmap/HKgccs-B5-V
new file mode 100644
index 0000000..f450af0
--- /dev/null
+++ b/src/main/resources/Resources/cmap/HKgccs-B5-V
@@ -0,0 +1,71 @@
+%!PS-Adobe-3.0 Resource-CMap
+%%DocumentNeededResources: ProcSet (CIDInit)
+%%DocumentNeededResources: CMap (HKgccs-B5-H)
+%%IncludeResource: ProcSet (CIDInit)
+%%IncludeResource: CMap (HKgccs-B5-H)
+%%BeginResource: CMap (HKgccs-B5-V)
+%%Title: (HKgccs-B5-V Adobe CNS1 0)
+%%Version: 1.001
+%%Copyright: -----------------------------------------------------------
+%%Copyright: Copyright 1990-2000 Adobe Systems Incorporated.
+%%Copyright: All Rights Reserved.
+%%Copyright:
+%%Copyright: Patents Pending
+%%Copyright:
+%%Copyright: NOTICE: All information contained herein is the property
+%%Copyright: of Adobe Systems Incorporated.
+%%Copyright:
+%%Copyright: Permission is granted for redistribution of this file
+%%Copyright: provided this copyright notice is maintained intact and
+%%Copyright: that the contents of this file are not altered in any
+%%Copyright: way from its original form.
+%%Copyright:
+%%Copyright: PostScript and Display PostScript are trademarks of
+%%Copyright: Adobe Systems Incorporated which may be registered in
+%%Copyright: certain jurisdictions.
+%%Copyright: -----------------------------------------------------------
+%%EndComments
+
+/CIDInit /ProcSet findresource begin
+
+12 dict begin
+
+begincmap
+
+/HKgccs-B5-H usecmap
+
+/CIDSystemInfo 3 dict dup begin
+ /Registry (Adobe) def
+ /Ordering (CNS1) def
+ /Supplement 0 def
+end def
+
+/CMapName /HKgccs-B5-V def
+/CMapVersion 1.001 def
+/CMapType 1 def
+
+/XUID [1 10 25520] def
+
+/WMode 1 def
+
+12 begincidrange
+<a14b> <a14b> 13646
+<a15a> <a15a> 13743
+<a15c> <a15c> 13745
+<a15d> <a15e> 130
+<a161> <a162> 134
+<a165> <a166> 138
+<a169> <a16a> 142
+<a16d> <a16e> 146
+<a171> <a172> 150
+<a175> <a176> 154
+<a179> <a17a> 158
+<a1e3> <a1e3> 13647
+endcidrange
+endcmap
+CMapName currentdict /CMap defineresource pop
+end
+end
+
+%%EndResource
+%%EOF
diff --git a/src/main/resources/Resources/cmap/HKm314-B5-H b/src/main/resources/Resources/cmap/HKm314-B5-H
new file mode 100644
index 0000000..3ff3a58
--- /dev/null
+++ b/src/main/resources/Resources/cmap/HKm314-B5-H
@@ -0,0 +1,621 @@
+%!PS-Adobe-3.0 Resource-CMap
+%%DocumentNeededResources: ProcSet (CIDInit)
+%%IncludeResource: ProcSet (CIDInit)
+%%BeginResource: CMap (HKm314-B5-H)
+%%Title: (HKm314-B5-H Adobe CNS1 1)
+%%Version: 1.001
+%%Copyright: -----------------------------------------------------------
+%%Copyright: Copyright 1990-2000 Adobe Systems Incorporated.
+%%Copyright: All Rights Reserved.
+%%Copyright:
+%%Copyright: Patents Pending
+%%Copyright:
+%%Copyright: NOTICE: All information contained herein is the property
+%%Copyright: of Adobe Systems Incorporated.
+%%Copyright:
+%%Copyright: Permission is granted for redistribution of this file
+%%Copyright: provided this copyright notice is maintained intact and
+%%Copyright: that the contents of this file are not altered in any
+%%Copyright: way from its original form.
+%%Copyright:
+%%Copyright: PostScript and Display PostScript are trademarks of
+%%Copyright: Adobe Systems Incorporated which may be registered in
+%%Copyright: certain jurisdictions.
+%%Copyright: -----------------------------------------------------------
+%%EndComments
+
+/CIDInit /ProcSet findresource begin
+
+12 dict begin
+
+begincmap
+
+/CIDSystemInfo 3 dict dup begin
+ /Registry (Adobe) def
+ /Ordering (CNS1) def
+ /Supplement 1 def
+end def
+
+/CMapName /HKm314-B5-H def
+/CMapVersion 1.001 def
+/CMapType 1 def
+
+/XUID [1 10 25527] def
+
+/WMode 0 def
+
+2 begincodespacerange
+ <00> <80>
+ <A140> <FEFE>
+endcodespacerange
+
+1 beginnotdefrange
+<00> <1f> 1
+endnotdefrange
+
+100 begincidrange
+<20> <7e> 1
+<a140> <a158> 99
+<a159> <a15c> 13743
+<a15d> <a17e> 128
+<a1a1> <a1f5> 162
+<a1f6> <a1f6> 248
+<a1f7> <a1f7> 247
+<a1f8> <a1fe> 249
+<a240> <a27e> 256
+<a2a1> <a2fe> 319
+<a340> <a37e> 413
+<a3a1> <a3bb> 476
+<a3bd> <a3bf> 503
+<a440> <a47e> 595
+<a4a1> <a4fe> 658
+<a540> <a57e> 752
+<a5a1> <a5fe> 815
+<a640> <a67e> 909
+<a6a1> <a6fe> 972
+<a740> <a77e> 1066
+<a7a1> <a7fe> 1129
+<a840> <a87e> 1223
+<a8a1> <a8fe> 1286
+<a940> <a97e> 1380
+<a9a1> <a9fe> 1443
+<aa40> <aa7e> 1537
+<aaa1> <aafe> 1600
+<ab40> <ab7e> 1694
+<aba1> <abfe> 1757
+<ac40> <ac7e> 1851
+<aca1> <acfd> 1914
+<acfe> <acfe> 2431
+<ad40> <ad7e> 2007
+<ada1> <adfe> 2070
+<ae40> <ae7e> 2164
+<aea1> <aefe> 2227
+<af40> <af7e> 2321
+<afa1> <afcf> 2384
+<afd0> <affe> 2432
+<b040> <b07e> 2479
+<b0a1> <b0fe> 2542
+<b140> <b17e> 2636
+<b1a1> <b1fe> 2699
+<b240> <b27e> 2793
+<b2a1> <b2fe> 2856
+<b340> <b37e> 2950
+<b3a1> <b3fe> 3013
+<b440> <b47e> 3107
+<b4a1> <b4fe> 3170
+<b540> <b57e> 3264
+<b5a1> <b5fe> 3327
+<b640> <b67e> 3421
+<b6a1> <b6fe> 3484
+<b740> <b77e> 3578
+<b7a1> <b7fe> 3641
+<b840> <b87e> 3735
+<b8a1> <b8fe> 3798
+<b940> <b97e> 3892
+<b9a1> <b9fe> 3955
+<ba40> <ba7e> 4049
+<baa1> <bafe> 4112
+<bb40> <bb7e> 4206
+<bba1> <bbc7> 4269
+<bbc8> <bbfe> 4309
+<bc40> <bc7e> 4364
+<bca1> <bcfe> 4427
+<bd40> <bd7e> 4521
+<bda1> <bdfe> 4584
+<be40> <be51> 4678
+<be52> <be52> 4308
+<be53> <be7e> 4696
+<bea1> <befe> 4740
+<bf40> <bf7e> 4834
+<bfa1> <bffe> 4897
+<c040> <c07e> 4991
+<c0a1> <c0fe> 5054
+<c140> <c17e> 5148
+<c1a1> <c1aa> 5211
+<c1ab> <c1fe> 5222
+<c240> <c27e> 5306
+<c2a1> <c2ca> 5369
+<c2cb> <c2cb> 5221
+<c2cc> <c2fe> 5411
+<c340> <c360> 5462
+<c361> <c37e> 5496
+<c3a1> <c3b8> 5526
+<c3b9> <c3b9> 5551
+<c3ba> <c3ba> 5550
+<c3bb> <c3fe> 5552
+<c440> <c455> 5620
+<c456> <c456> 5495
+<c457> <c47e> 5642
+<c4a1> <c4fe> 5682
+<c540> <c57e> 5776
+<c5a1> <c5fe> 5839
+<c640> <c67e> 5933
+<c740> <c740> 15725
+<c741> <c741> 14788
+<c742> <c742> 17305
+<c743> <c743> 15877
+endcidrange
+
+100 begincidrange
+<c744> <c744> 14058
+<c745> <c745> 14792
+<c746> <c746> 14653
+<c747> <c747> 17307
+<c748> <c748> 16418
+<c749> <c749> 17309
+<c74a> <c74a> 16436
+<c74b> <c74b> 17311
+<c74c> <c74c> 16035
+<c74d> <c74d> 16038
+<c74e> <c74e> 16465
+<c74f> <c750> 16456
+<c751> <c751> 16459
+<c752> <c752> 16463
+<c753> <c753> 17314
+<c754> <c754> 16474
+<c755> <c755> 16036
+<c756> <c756> 15805
+<c757> <c757> 15807
+<c758> <c758> 16476
+<c759> <c759> 16479
+<c75a> <c75a> 17316
+<c75b> <c75b> 16507
+<c75c> <c75c> 16514
+<c75d> <c75d> 16237
+<c75e> <c75e> 16523
+<c75f> <c75f> 17318
+<c760> <c760> 16531
+<c761> <c761> 16534
+<c762> <c762> 17319
+<c763> <c763> 16536
+<c764> <c764> 15999
+<c765> <c765> 15479
+<c766> <c766> 16039
+<c767> <c767> 16010
+<c768> <c768> 16024
+<c769> <c769> 16012
+<c76a> <c76a> 16545
+<c76b> <c76b> 14848
+<c76c> <c76c> 14755
+<c76d> <c76d> 16013
+<c76e> <c76e> 17320
+<c76f> <c76f> 16216
+<c770> <c770> 15804
+<c771> <c771> 15564
+<c772> <c773> 16040
+<c774> <c774> 15150
+<c775> <c775> 15302
+<c776> <c776> 16011
+<c777> <c777> 16031
+<c778> <c778> 17196
+<c779> <c779> 17321
+<c77a> <c77a> 16136
+<c77b> <c77b> 16037
+<c77c> <c77c> 16009
+<c77d> <c77d> 15811
+<c77e> <c77e> 16002
+<c7a1> <c7a1> 16001
+<c7a2> <c7a2> 16020
+<c7a3> <c7a3> 16003
+<c7a4> <c7a4> 16008
+<c7a5> <c7a5> 17323
+<c7a6> <c7a6> 16017
+<c7a7> <c7a7> 17324
+<c7a8> <c7a8> 15996
+<c7a9> <c7a9> 16000
+<c7aa> <c7aa> 16015
+<c7ab> <c7ab> 15975
+<c7ac> <c7ac> 15992
+<c7ad> <c7ad> 15976
+<c7ae> <c7ae> 17325
+<c7af> <c7af> 14290
+<c7b0> <c7b0> 16205
+<c7b1> <c7b1> 17326
+<c7b2> <c7b2> 15998
+<c7b3> <c7b3> 16572
+<c7b4> <c7b4> 15971
+<c7b5> <c7b5> 16573
+<c7b6> <c7b6> 17327
+<c7b7> <c7b7> 16567
+<c7b8> <c7b8> 16055
+<c7b9> <c7b9> 16109
+<c7ba> <c7ba> 16234
+<c7bb> <c7bb> 16021
+<c7bc> <c7bc> 14664
+<c7bd> <c7bd> 15560
+<c7be> <c7bf> 17329
+<c7c0> <c7c0> 16588
+<c7c1> <c7c1> 16006
+<c7c2> <c7c2> 15482
+<c7c3> <c7c3> 15485
+<c7c4> <c7c4> 17332
+<c7c5> <c7c5> 16593
+<c7c6> <c7c6> 15730
+<c7c7> <c7c7> 15398
+<c7c8> <c7c8> 14059
+<c7c9> <c7c9> 16575
+<c7ca> <c7ca> 16640
+<c7cb> <c7cb> 15493
+<c7cc> <c7cc> 17333
+endcidrange
+
+100 begincidrange
+<c7cd> <c7cd> 14877
+<c7ce> <c7ce> 14325
+<c7cf> <c7cf> 14062
+<c7d0> <c7d0> 15967
+<c7d1> <c7d1> 16662
+<c7d2> <c7d2> 16671
+<c7d3> <c7d3> 16664
+<c7d4> <c7d4> 16675
+<c7d5> <c7d5> 16679
+<c7d6> <c7d6> 16681
+<c7d7> <c7d8> 17340
+<c7d9> <c7d9> 16014
+<c7da> <c7da> 14447
+<c7db> <c7db> 16707
+<c7dc> <c7dc> 16710
+<c7dd> <c7dd> 16708
+<c7de> <c7de> 16713
+<c7df> <c7df> 15269
+<c7e0> <c7e0> 16727
+<c7e1> <c7e1> 16737
+<c7e2> <c7e2> 14060
+<c7e3> <c7e3> 16746
+<c7e4> <c7e4> 16386
+<c7e5> <c7e5> 16774
+<c7e6> <c7e6> 16314
+<c7e7> <c7e7> 16208
+<c7e8> <c7e8> 16022
+<c7e9> <c7e9> 16778
+<c7ea> <c7ea> 16321
+<c7eb> <c7eb> 15759
+<c7ec> <c7ec> 17345
+<c7ed> <c7ed> 16032
+<c7ee> <c7ee> 16150
+<c7ef> <c7ef> 16029
+<c7f0> <c7f0> 16786
+<c7f1> <c7f1> 14950
+<c7f2> <c7f2> 16028
+<c7f3> <c7f3> 16016
+<c7f4> <c7f4> 16797
+<c7f5> <c7f6> 17346
+<c7f7> <c7f7> 14248
+<c7f8> <c7f8> 16798
+<c7f9> <c7f9> 16775
+<c7fa> <c7fa> 16034
+<c7fb> <c7fb> 16007
+<c7fc> <c7fc> 16004
+<c7fd> <c7fd> 16046
+<c7fe> <c7fe> 15220
+<c840> <c840> 15221
+<c841> <c841> 15218
+<c842> <c842> 16050
+<c843> <c843> 16044
+<c844> <c844> 16842
+<c845> <c845> 16884
+<c846> <c846> 16848
+<c847> <c847> 15018
+<c848> <c848> 16885
+<c849> <c849> 16888
+<c84a> <c84a> 16891
+<c84b> <c84b> 16901
+<c84c> <c84c> 15758
+<c84d> <c84d> 16910
+<c84e> <c84e> 15715
+<c84f> <c84f> 16930
+<c850> <c850> 16929
+<c851> <c851> 16931
+<c852> <c852> 16489
+<c853> <c853> 16431
+<c854> <c854> 14501
+<c855> <c855> 15605
+<c856> <c856> 15721
+<c857> <c857> 16987
+<c858> <c858> 15048
+<c859> <c859> 15808
+<c85a> <c85a> 14826
+<c85b> <c85b> 16384
+<c85c> <c85c> 16996
+<c85d> <c85d> 16994
+<c85e> <c85e> 16383
+<c85f> <c85f> 16026
+<c860> <c860> 17011
+<c861> <c861> 14697
+<c862> <c862> 17018
+<c863> <c863> 17354
+<c864> <c864> 16282
+<c865> <c865> 16053
+<c866> <c867> 17355
+<c868> <c868> 16306
+<c869> <c86b> 17034
+<c86c> <c86c> 15071
+<c86d> <c86d> 17096
+<c86e> <c86e> 16045
+<c86f> <c86f> 17358
+<c870> <c870> 16271
+<c871> <c871> 17359
+<c872> <c872> 15986
+<c873> <c873> 16042
+<c874> <c874> 17363
+<c875> <c875> 17120
+<c876> <c876> 14381
+endcidrange
+
+100 begincidrange
+<c877> <c877> 16341
+<c878> <c878> 15124
+<c879> <c879> 14056
+<c87a> <c87a> 17136
+<c87b> <c87b> 15997
+<c87c> <c87c> 17150
+<c87d> <c87d> 17157
+<c87e> <c87e> 14138
+<c8a1> <c8a1> 14150
+<c8a2> <c8a2> 14162
+<c8a3> <c8a3> 14061
+<c8a4> <c8a4> 15178
+<c8a5> <c8a5> 15173
+<c8a6> <c8a6> 17370
+<c8a7> <c8a7> 16094
+<c8a8> <c8a8> 14188
+<c8a9> <c8a9> 14187
+<c8aa> <c8aa> 14210
+<c8ab> <c8ab> 15977
+<c8ac> <c8ac> 15183
+<c8ad> <c8ad> 14214
+<c8ae> <c8ae> 17371
+<c8af> <c8af> 14216
+<c8b0> <c8b0> 17372
+<c8b1> <c8b1> 16077
+<c8b2> <c8b2> 14231
+<c8b3> <c8b3> 16909
+<c8b4> <c8b4> 14296
+<c8b5> <c8b5> 15217
+<c8b6> <c8b6> 14556
+<c8b7> <c8b7> 14304
+<c8b8> <c8b8> 14324
+<c8b9> <c8b9> 14355
+<c8ba> <c8ba> 16048
+<c8bb> <c8bb> 14349
+<c8bc> <c8bc> 16047
+<c8bd> <c8be> 14363
+<c8bf> <c8c0> 14366
+<c8c1> <c8c1> 16049
+<c8c2> <c8c2> 16361
+<c8c3> <c8c3> 17380
+<c8c4> <c8c4> 16377
+<c8c5> <c8c5> 15961
+<c8c6> <c8c6> 16025
+<c8c7> <c8c7> 15966
+<c8c8> <c8c8> 15284
+<c8c9> <c8c9> 16043
+<c8ca> <c8cb> 17383
+<c8cc> <c8cc> 14430
+<c8cd> <c8cd> 17385
+<c8ce> <c8ce> 15806
+<c8cf> <c8cf> 16005
+<c8d0> <c8d1> 14435
+<c8d2> <c8d2> 15724
+<c8d3> <c8d3> 14449
+<c8d4> <c8d4> 14460
+<c8d5> <c8d5> 14466
+<c8d6> <c8d6> 16027
+<c8d7> <c8d7> 14472
+<c8d8> <c8d8> 15374
+<c8d9> <c8d9> 14382
+<c8da> <c8da> 14490
+<c8db> <c8db> 14475
+<c8dc> <c8dc> 15364
+<c8dd> <c8dd> 14057
+<c8de> <c8de> 17085
+<c8df> <c8df> 15309
+<c8e0> <c8e0> 14495
+<c8e1> <c8e1> 14235
+<c8e2> <c8e2> 14511
+<c8e3> <c8e3> 16023
+<c8e4> <c8e4> 14576
+<c8e5> <c8e5> 15357
+<c8e6> <c8e7> 15377
+<c8e8> <c8e8> 17391
+<c8e9> <c8e9> 14213
+<c8ea> <c8ea> 14594
+<c8eb> <c8eb> 16298
+<c8ec> <c8ec> 16153
+<c8ed> <c8ed> 14617
+<c8ee> <c8ee> 17393
+<c8ef> <c8f0> 14618
+<c8f1> <c8f1> 15974
+<c8f2> <c8f2> 16162
+<c8f3> <c8f3> 15742
+<c8f4> <c8f4> 15417
+<c8f5> <c8f5> 16033
+<c8f6> <c8f7> 17394
+<c8f8> <c8f8> 16176
+<c8f9> <c8f9> 14633
+<c8fa> <c8fa> 16316
+<c8fb> <c8fc> 14646
+<c8fd> <c8fd> 16272
+<c8fe> <c8fe> 2746
+<c940> <c949> 5996
+<c94a> <c94a> 628
+<c94b> <c96b> 6006
+<c96c> <c97e> 6040
+<c9a1> <c9bd> 6059
+<c9be> <c9be> 6039
+endcidrange
+
+100 begincidrange
+<c9bf> <c9ec> 6088
+<c9ed> <c9fe> 6135
+<ca40> <ca7e> 6153
+<caa1> <caf6> 6216
+<caf7> <caf7> 6134
+<caf8> <cafe> 6302
+<cb40> <cb7e> 6309
+<cba1> <cbfe> 6372
+<cc40> <cc7e> 6466
+<cca1> <ccfe> 6529
+<cd40> <cd7e> 6623
+<cda1> <cdfe> 6686
+<ce40> <ce7e> 6780
+<cea1> <cefe> 6843
+<cf40> <cf7e> 6937
+<cfa1> <cffe> 7000
+<d040> <d07e> 7094
+<d0a1> <d0fe> 7157
+<d140> <d17e> 7251
+<d1a1> <d1fe> 7314
+<d240> <d27e> 7408
+<d2a1> <d2fe> 7471
+<d340> <d37e> 7565
+<d3a1> <d3fe> 7628
+<d440> <d47e> 7722
+<d4a1> <d4fe> 7785
+<d540> <d57e> 7879
+<d5a1> <d5fe> 7942
+<d640> <d67e> 8036
+<d6a1> <d6cb> 8099
+<d6cc> <d6cc> 8788
+<d6cd> <d6fe> 8143
+<d740> <d779> 8193
+<d77a> <d77a> 8889
+<d77b> <d77e> 8251
+<d7a1> <d7fe> 8255
+<d840> <d87e> 8349
+<d8a1> <d8fe> 8412
+<d940> <d97e> 8506
+<d9a1> <d9fe> 8569
+<da40> <da7e> 8663
+<daa1> <dade> 8726
+<dadf> <dadf> 8142
+<dae0> <dafe> 8789
+<db40> <db7e> 8820
+<dba1> <dba6> 8883
+<dba7> <dbfe> 8890
+<dc40> <dc7e> 8978
+<dca1> <dcfe> 9041
+<dd40> <dd7e> 9135
+<dda1> <ddfb> 9198
+<ddfc> <ddfc> 9089
+<ddfd> <ddfe> 9289
+<de40> <de7e> 9291
+<dea1> <defe> 9354
+<df40> <df7e> 9448
+<dfa1> <dffe> 9511
+<e040> <e07e> 9605
+<e0a1> <e0fe> 9668
+<e140> <e17e> 9762
+<e1a1> <e1fe> 9825
+<e240> <e27e> 9919
+<e2a1> <e2fe> 9982
+<e340> <e37e> 10076
+<e3a1> <e3fe> 10139
+<e440> <e47e> 10233
+<e4a1> <e4fe> 10296
+<e540> <e57e> 10390
+<e5a1> <e5fe> 10453
+<e640> <e67e> 10547
+<e6a1> <e6fe> 10610
+<e740> <e77e> 10704
+<e7a1> <e7fe> 10767
+<e840> <e87e> 10861
+<e8a1> <e8a2> 10924
+<e8a3> <e8fe> 10927
+<e940> <e975> 11019
+<e976> <e97e> 11074
+<e9a1> <e9fe> 11083
+<ea40> <ea7e> 11177
+<eaa1> <eafe> 11240
+<eb40> <eb5a> 11334
+<eb5b> <eb7e> 11362
+<eba1> <ebf0> 11398
+<ebf1> <ebf1> 10926
+<ebf2> <ebfe> 11478
+<ec40> <ec7e> 11491
+<eca1> <ecdd> 11554
+<ecde> <ecde> 11073
+<ecdf> <ecfe> 11615
+<ed40> <ed7e> 11647
+<eda1> <eda9> 11710
+<edaa> <edfe> 11720
+<ee40> <ee7e> 11805
+<eea1> <eeea> 11868
+<eeeb> <eeeb> 12308
+<eeec> <eefe> 11942
+<ef40> <ef7e> 11961
+<efa1> <effe> 12024
+<f040> <f055> 12118
+endcidrange
+
+42 begincidrange
+<f056> <f056> 11719
+<f057> <f07e> 12140
+<f0a1> <f0ca> 12180
+<f0cb> <f0cb> 11361
+<f0cc> <f0fe> 12222
+<f140> <f162> 12273
+<f163> <f16a> 12309
+<f16b> <f16b> 12640
+<f16c> <f17e> 12317
+<f1a1> <f1fe> 12336
+<f240> <f267> 12430
+<f268> <f268> 12783
+<f269> <f27e> 12470
+<f2a1> <f2c2> 12492
+<f2c3> <f2fe> 12527
+<f340> <f374> 12587
+<f375> <f37e> 12641
+<f3a1> <f3fe> 12651
+<f440> <f465> 12745
+<f466> <f47e> 12784
+<f4a1> <f4b4> 12809
+<f4b5> <f4b5> 12526
+<f4b6> <f4fc> 12829
+<f4fd> <f4fe> 12901
+<f540> <f57e> 12903
+<f5a1> <f5fe> 12966
+<f640> <f662> 13060
+<f663> <f663> 12900
+<f664> <f67e> 13095
+<f6a1> <f6fe> 13122
+<f740> <f77e> 13216
+<f7a1> <f7fe> 13279
+<f840> <f87e> 13373
+<f8a1> <f8fe> 13436
+<f940> <f976> 13530
+<f977> <f97e> 13586
+<f9a1> <f9c3> 13594
+<f9c4> <f9c4> 13585
+<f9c5> <f9c5> 13629
+<f9c6> <f9c6> 13641
+<f9c7> <f9d1> 13630
+<f9d2> <f9d5> 13642
+endcidrange
+endcmap
+CMapName currentdict /CMap defineresource pop
+end
+end
+
+%%EndResource
+%%EOF
diff --git a/src/main/resources/Resources/cmap/HKm314-B5-V b/src/main/resources/Resources/cmap/HKm314-B5-V
new file mode 100644
index 0000000..c519d80
--- /dev/null
+++ b/src/main/resources/Resources/cmap/HKm314-B5-V
@@ -0,0 +1,71 @@
+%!PS-Adobe-3.0 Resource-CMap
+%%DocumentNeededResources: ProcSet (CIDInit)
+%%DocumentNeededResources: CMap (HKm314-B5-H)
+%%IncludeResource: ProcSet (CIDInit)
+%%IncludeResource: CMap (HKm314-B5-H)
+%%BeginResource: CMap (HKm314-B5-V)
+%%Title: (HKm314-B5-V Adobe CNS1 0)
+%%Version: 1.001
+%%Copyright: -----------------------------------------------------------
+%%Copyright: Copyright 1990-2000 Adobe Systems Incorporated.
+%%Copyright: All Rights Reserved.
+%%Copyright:
+%%Copyright: Patents Pending
+%%Copyright:
+%%Copyright: NOTICE: All information contained herein is the property
+%%Copyright: of Adobe Systems Incorporated.
+%%Copyright:
+%%Copyright: Permission is granted for redistribution of this file
+%%Copyright: provided this copyright notice is maintained intact and
+%%Copyright: that the contents of this file are not altered in any
+%%Copyright: way from its original form.
+%%Copyright:
+%%Copyright: PostScript and Display PostScript are trademarks of
+%%Copyright: Adobe Systems Incorporated which may be registered in
+%%Copyright: certain jurisdictions.
+%%Copyright: -----------------------------------------------------------
+%%EndComments
+
+/CIDInit /ProcSet findresource begin
+
+12 dict begin
+
+begincmap
+
+/HKm314-B5-H usecmap
+
+/CIDSystemInfo 3 dict dup begin
+ /Registry (Adobe) def
+ /Ordering (CNS1) def
+ /Supplement 0 def
+end def
+
+/CMapName /HKm314-B5-V def
+/CMapVersion 1.001 def
+/CMapType 1 def
+
+/XUID [1 10 25528] def
+
+/WMode 1 def
+
+12 begincidrange
+<a14b> <a14b> 13646
+<a15a> <a15a> 13743
+<a15c> <a15c> 13745
+<a15d> <a15e> 130
+<a161> <a162> 134
+<a165> <a166> 138
+<a169> <a16a> 142
+<a16d> <a16e> 146
+<a171> <a172> 150
+<a175> <a176> 154
+<a179> <a17a> 158
+<a1e3> <a1e3> 13647
+endcidrange
+endcmap
+CMapName currentdict /CMap defineresource pop
+end
+end
+
+%%EndResource
+%%EOF
diff --git a/src/main/resources/Resources/cmap/HKm471-B5-H b/src/main/resources/Resources/cmap/HKm471-B5-H
new file mode 100644
index 0000000..2dec0c2
--- /dev/null
+++ b/src/main/resources/Resources/cmap/HKm471-B5-H
@@ -0,0 +1,771 @@
+%!PS-Adobe-3.0 Resource-CMap
+%%DocumentNeededResources: ProcSet (CIDInit)
+%%IncludeResource: ProcSet (CIDInit)
+%%BeginResource: CMap (HKm471-B5-H)
+%%Title: (HKm471-B5-H Adobe CNS1 1)
+%%Version: 1.001
+%%Copyright: -----------------------------------------------------------
+%%Copyright: Copyright 1990-2000 Adobe Systems Incorporated.
+%%Copyright: All Rights Reserved.
+%%Copyright:
+%%Copyright: Patents Pending
+%%Copyright:
+%%Copyright: NOTICE: All information contained herein is the property
+%%Copyright: of Adobe Systems Incorporated.
+%%Copyright:
+%%Copyright: Permission is granted for redistribution of this file
+%%Copyright: provided this copyright notice is maintained intact and
+%%Copyright: that the contents of this file are not altered in any
+%%Copyright: way from its original form.
+%%Copyright:
+%%Copyright: PostScript and Display PostScript are trademarks of
+%%Copyright: Adobe Systems Incorporated which may be registered in
+%%Copyright: certain jurisdictions.
+%%Copyright: -----------------------------------------------------------
+%%EndComments
+
+/CIDInit /ProcSet findresource begin
+
+12 dict begin
+
+begincmap
+
+/CIDSystemInfo 3 dict dup begin
+ /Registry (Adobe) def
+ /Ordering (CNS1) def
+ /Supplement 1 def
+end def
+
+/CMapName /HKm471-B5-H def
+/CMapVersion 1.001 def
+/CMapType 1 def
+
+/XUID [1 10 25525] def
+
+/WMode 0 def
+
+2 begincodespacerange
+ <00> <80>
+ <A140> <FEFE>
+endcodespacerange
+
+1 beginnotdefrange
+<00> <1f> 1
+endnotdefrange
+
+100 begincidrange
+<20> <7e> 1
+<a140> <a158> 99
+<a159> <a15c> 13743
+<a15d> <a17e> 128
+<a1a1> <a1f5> 162
+<a1f6> <a1f6> 248
+<a1f7> <a1f7> 247
+<a1f8> <a1fe> 249
+<a240> <a27e> 256
+<a2a1> <a2fe> 319
+<a340> <a37e> 413
+<a3a1> <a3bb> 476
+<a3bd> <a3bf> 503
+<a440> <a47e> 595
+<a4a1> <a4fe> 658
+<a540> <a57e> 752
+<a5a1> <a5fe> 815
+<a640> <a67e> 909
+<a6a1> <a6fe> 972
+<a740> <a77e> 1066
+<a7a1> <a7fe> 1129
+<a840> <a87e> 1223
+<a8a1> <a8fe> 1286
+<a940> <a97e> 1380
+<a9a1> <a9fe> 1443
+<aa40> <aa7e> 1537
+<aaa1> <aafe> 1600
+<ab40> <ab7e> 1694
+<aba1> <abfe> 1757
+<ac40> <ac7e> 1851
+<aca1> <acfd> 1914
+<acfe> <acfe> 2431
+<ad40> <ad7e> 2007
+<ada1> <adfe> 2070
+<ae40> <ae7e> 2164
+<aea1> <aefe> 2227
+<af40> <af7e> 2321
+<afa1> <afcf> 2384
+<afd0> <affe> 2432
+<b040> <b07e> 2479
+<b0a1> <b0fe> 2542
+<b140> <b17e> 2636
+<b1a1> <b1fe> 2699
+<b240> <b27e> 2793
+<b2a1> <b2fe> 2856
+<b340> <b37e> 2950
+<b3a1> <b3fe> 3013
+<b440> <b47e> 3107
+<b4a1> <b4fe> 3170
+<b540> <b57e> 3264
+<b5a1> <b5fe> 3327
+<b640> <b67e> 3421
+<b6a1> <b6fe> 3484
+<b740> <b77e> 3578
+<b7a1> <b7fe> 3641
+<b840> <b87e> 3735
+<b8a1> <b8fe> 3798
+<b940> <b97e> 3892
+<b9a1> <b9fe> 3955
+<ba40> <ba7e> 4049
+<baa1> <bafe> 4112
+<bb40> <bb7e> 4206
+<bba1> <bbc7> 4269
+<bbc8> <bbfe> 4309
+<bc40> <bc7e> 4364
+<bca1> <bcfe> 4427
+<bd40> <bd7e> 4521
+<bda1> <bdfe> 4584
+<be40> <be51> 4678
+<be52> <be52> 4308
+<be53> <be7e> 4696
+<bea1> <befe> 4740
+<bf40> <bf7e> 4834
+<bfa1> <bffe> 4897
+<c040> <c07e> 4991
+<c0a1> <c0fe> 5054
+<c140> <c17e> 5148
+<c1a1> <c1aa> 5211
+<c1ab> <c1fe> 5222
+<c240> <c27e> 5306
+<c2a1> <c2ca> 5369
+<c2cb> <c2cb> 5221
+<c2cc> <c2fe> 5411
+<c340> <c360> 5462
+<c361> <c37e> 5496
+<c3a1> <c3b8> 5526
+<c3b9> <c3b9> 5551
+<c3ba> <c3ba> 5550
+<c3bb> <c3fe> 5552
+<c440> <c455> 5620
+<c456> <c456> 5495
+<c457> <c47e> 5642
+<c4a1> <c4fe> 5682
+<c540> <c57e> 5776
+<c5a1> <c5fe> 5839
+<c640> <c67e> 5933
+<c940> <c949> 5996
+<c94a> <c94a> 628
+<c94b> <c96b> 6006
+<c96c> <c97e> 6040
+endcidrange
+
+100 begincidrange
+<c9a1> <c9bd> 6059
+<c9be> <c9be> 6039
+<c9bf> <c9ec> 6088
+<c9ed> <c9fe> 6135
+<ca40> <ca7e> 6153
+<caa1> <caf6> 6216
+<caf7> <caf7> 6134
+<caf8> <cafe> 6302
+<cb40> <cb7e> 6309
+<cba1> <cbfe> 6372
+<cc40> <cc7e> 6466
+<cca1> <ccfe> 6529
+<cd40> <cd7e> 6623
+<cda1> <cdfe> 6686
+<ce40> <ce7e> 6780
+<cea1> <cefe> 6843
+<cf40> <cf7e> 6937
+<cfa1> <cffe> 7000
+<d040> <d07e> 7094
+<d0a1> <d0fe> 7157
+<d140> <d17e> 7251
+<d1a1> <d1fe> 7314
+<d240> <d27e> 7408
+<d2a1> <d2fe> 7471
+<d340> <d37e> 7565
+<d3a1> <d3fe> 7628
+<d440> <d47e> 7722
+<d4a1> <d4fe> 7785
+<d540> <d57e> 7879
+<d5a1> <d5fe> 7942
+<d640> <d67e> 8036
+<d6a1> <d6cb> 8099
+<d6cc> <d6cc> 8788
+<d6cd> <d6fe> 8143
+<d740> <d779> 8193
+<d77a> <d77a> 8889
+<d77b> <d77e> 8251
+<d7a1> <d7fe> 8255
+<d840> <d87e> 8349
+<d8a1> <d8fe> 8412
+<d940> <d97e> 8506
+<d9a1> <d9fe> 8569
+<da40> <da7e> 8663
+<daa1> <dade> 8726
+<dadf> <dadf> 8142
+<dae0> <dafe> 8789
+<db40> <db7e> 8820
+<dba1> <dba6> 8883
+<dba7> <dbfe> 8890
+<dc40> <dc7e> 8978
+<dca1> <dcfe> 9041
+<dd40> <dd7e> 9135
+<dda1> <ddfb> 9198
+<ddfc> <ddfc> 9089
+<ddfd> <ddfe> 9289
+<de40> <de7e> 9291
+<dea1> <defe> 9354
+<df40> <df7e> 9448
+<dfa1> <dffe> 9511
+<e040> <e07e> 9605
+<e0a1> <e0fe> 9668
+<e140> <e17e> 9762
+<e1a1> <e1fe> 9825
+<e240> <e27e> 9919
+<e2a1> <e2fe> 9982
+<e340> <e37e> 10076
+<e3a1> <e3fe> 10139
+<e440> <e47e> 10233
+<e4a1> <e4fe> 10296
+<e540> <e57e> 10390
+<e5a1> <e5fe> 10453
+<e640> <e67e> 10547
+<e6a1> <e6fe> 10610
+<e740> <e77e> 10704
+<e7a1> <e7fe> 10767
+<e840> <e87e> 10861
+<e8a1> <e8a2> 10924
+<e8a3> <e8fe> 10927
+<e940> <e975> 11019
+<e976> <e97e> 11074
+<e9a1> <e9fe> 11083
+<ea40> <ea7e> 11177
+<eaa1> <eafe> 11240
+<eb40> <eb5a> 11334
+<eb5b> <eb7e> 11362
+<eba1> <ebf0> 11398
+<ebf1> <ebf1> 10926
+<ebf2> <ebfe> 11478
+<ec40> <ec7e> 11491
+<eca1> <ecdd> 11554
+<ecde> <ecde> 11073
+<ecdf> <ecfe> 11615
+<ed40> <ed7e> 11647
+<eda1> <eda9> 11710
+<edaa> <edfe> 11720
+<ee40> <ee7e> 11805
+<eea1> <eeea> 11868
+<eeeb> <eeeb> 12308
+<eeec> <eefe> 11942
+<ef40> <ef7e> 11961
+endcidrange
+
+100 begincidrange
+<efa1> <effe> 12024
+<f040> <f055> 12118
+<f056> <f056> 11719
+<f057> <f07e> 12140
+<f0a1> <f0ca> 12180
+<f0cb> <f0cb> 11361
+<f0cc> <f0fe> 12222
+<f140> <f162> 12273
+<f163> <f16a> 12309
+<f16b> <f16b> 12640
+<f16c> <f17e> 12317
+<f1a1> <f1fe> 12336
+<f240> <f267> 12430
+<f268> <f268> 12783
+<f269> <f27e> 12470
+<f2a1> <f2c2> 12492
+<f2c3> <f2fe> 12527
+<f340> <f374> 12587
+<f375> <f37e> 12641
+<f3a1> <f3fe> 12651
+<f440> <f465> 12745
+<f466> <f47e> 12784
+<f4a1> <f4b4> 12809
+<f4b5> <f4b5> 12526
+<f4b6> <f4fc> 12829
+<f4fd> <f4fe> 12901
+<f540> <f57e> 12903
+<f5a1> <f5fe> 12966
+<f640> <f662> 13060
+<f663> <f663> 12900
+<f664> <f67e> 13095
+<f6a1> <f6fe> 13122
+<f740> <f77e> 13216
+<f7a1> <f7fe> 13279
+<f840> <f87e> 13373
+<f8a1> <f8fe> 13436
+<f940> <f976> 13530
+<f977> <f97e> 13586
+<f9a1> <f9c3> 13594
+<f9c4> <f9c4> 13585
+<f9c5> <f9c5> 13629
+<f9c6> <f9c6> 13641
+<f9c7> <f9d1> 13630
+<f9d2> <f9d5> 13642
+<fa40> <fa40> 15725
+<fa41> <fa41> 14788
+<fa42> <fa42> 17305
+<fa43> <fa43> 16207
+<fa44> <fa44> 15877
+<fa45> <fa45> 17306
+<fa46> <fa46> 15246
+<fa47> <fa47> 14058
+<fa48> <fa48> 14792
+<fa49> <fa49> 14653
+<fa4a> <fa4a> 17307
+<fa4b> <fa4b> 16418
+<fa4c> <fa4d> 14796
+<fa4e> <fa4e> 17308
+<fa4f> <fa4f> 14789
+<fa50> <fa50> 17309
+<fa51> <fa51> 16436
+<fa52> <fa53> 17310
+<fa54> <fa54> 16035
+<fa55> <fa55> 16038
+<fa56> <fa56> 17312
+<fa57> <fa57> 16465
+<fa58> <fa59> 16456
+<fa5a> <fa5a> 16459
+<fa5b> <fa5b> 16463
+<fa5c> <fa5c> 16468
+<fa5d> <fa5d> 16760
+<fa5e> <fa5e> 16138
+<fa5f> <fa60> 17313
+<fa61> <fa61> 16474
+<fa62> <fa62> 16036
+<fa63> <fa63> 15805
+<fa64> <fa64> 17315
+<fa65> <fa65> 15807
+<fa66> <fa66> 16476
+<fa67> <fa68> 16479
+<fa69> <fa69> 16483
+<fa6a> <fa6a> 17316
+<fa6b> <fa6c> 16506
+<fa6d> <fa6d> 16509
+<fa6e> <fa6e> 16514
+<fa6f> <fa6f> 16237
+<fa70> <fa70> 17317
+<fa71> <fa71> 16523
+<fa72> <fa72> 17318
+<fa73> <fa73> 16185
+<fa74> <fa74> 16531
+<fa75> <fa75> 16534
+<fa76> <fa76> 17319
+<fa77> <fa77> 16536
+<fa78> <fa78> 15999
+<fa79> <fa79> 15479
+<fa7a> <fa7a> 16039
+<fa7b> <fa7b> 16899
+<fa7c> <fa7c> 16081
+<fa7d> <fa7d> 16010
+endcidrange
+
+100 begincidrange
+<fa7e> <fa7e> 16024
+<faa1> <faa1> 16012
+<faa2> <faa2> 16545
+<faa3> <faa3> 15747
+<faa4> <faa4> 14848
+<faa5> <faa5> 14755
+<faa6> <faa6> 16013
+<faa7> <faa7> 17320
+<faa8> <faa8> 16216
+<faa9> <faa9> 15804
+<faaa> <faaa> 16546
+<faab> <faab> 15564
+<faac> <faad> 16040
+<faae> <faae> 15150
+<faaf> <faaf> 15302
+<fab0> <fab0> 16011
+<fab1> <fab1> 16031
+<fab2> <fab2> 17196
+<fab3> <fab3> 17321
+<fab4> <fab4> 16136
+<fab5> <fab5> 16037
+<fab6> <fab6> 16009
+<fab7> <fab7> 15811
+<fab8> <fab8> 16002
+<fab9> <fab9> 16001
+<faba> <faba> 16020
+<fabb> <fabb> 17322
+<fabc> <fabc> 16003
+<fabd> <fabd> 16008
+<fabe> <fabe> 17323
+<fabf> <fabf> 16017
+<fac0> <fac0> 17324
+<fac1> <fac1> 15996
+<fac2> <fac2> 16000
+<fac3> <fac3> 16015
+<fac4> <fac4> 17189
+<fac5> <fac5> 15975
+<fac6> <fac6> 15992
+<fac7> <fac7> 15976
+<fac8> <fac8> 17325
+<fac9> <fac9> 14290
+<faca> <faca> 16205
+<facb> <facb> 17326
+<facc> <facc> 15998
+<facd> <facd> 16572
+<face> <face> 15971
+<facf> <facf> 16573
+<fad0> <fad0> 17327
+<fad1> <fad1> 16236
+<fad2> <fad2> 16121
+<fad3> <fad3> 16567
+<fad4> <fad4> 16055
+<fad5> <fad5> 16109
+<fad6> <fad6> 16234
+<fad7> <fad7> 14758
+<fad8> <fad8> 17328
+<fad9> <fad9> 16021
+<fada> <fada> 14664
+<fadb> <fadb> 15560
+<fadc> <fade> 17329
+<fadf> <fadf> 16588
+<fae0> <fae0> 16006
+<fae1> <fae1> 16584
+<fae2> <fae2> 15482
+<fae3> <fae3> 15485
+<fae4> <fae4> 17332
+<fae5> <fae5> 16593
+<fae6> <fae6> 15730
+<fae7> <fae7> 16596
+<fae8> <fae8> 15398
+<fae9> <fae9> 14059
+<faea> <faea> 16602
+<faeb> <faeb> 16601
+<faec> <faec> 16575
+<faed> <faed> 15745
+<faee> <faee> 16625
+<faef> <faef> 16640
+<faf0> <faf0> 15493
+<faf1> <faf1> 17333
+<faf2> <faf2> 14877
+<faf3> <faf3> 14325
+<faf4> <faf4> 14062
+<faf5> <faf5> 15967
+<faf6> <faf6> 16662
+<faf7> <faf7> 17083
+<faf8> <faf8> 16671
+<faf9> <faf9> 17334
+<fafa> <fafa> 16664
+<fafb> <fafc> 17335
+<fafd> <fafd> 16675
+<fafe> <fafe> 16674
+<fb40> <fb40> 16679
+<fb41> <fb41> 17337
+<fb42> <fb42> 16681
+<fb43> <fb43> 17338
+<fb44> <fb44> 15829
+<fb45> <fb45> 16111
+<fb46> <fb46> 15754
+<fb47> <fb47> 17339
+<fb48> <fb48> 14891
+endcidrange
+
+100 begincidrange
+<fb49> <fb49> 17340
+<fb4a> <fb4a> 16696
+<fb4b> <fb4b> 17341
+<fb4c> <fb4c> 16014
+<fb4d> <fb4d> 14896
+<fb4e> <fb4e> 14447
+<fb4f> <fb4f> 16707
+<fb50> <fb50> 16710
+<fb51> <fb51> 16708
+<fb52> <fb52> 16713
+<fb53> <fb53> 15269
+<fb54> <fb54> 16727
+<fb55> <fb55> 17342
+<fb56> <fb56> 16737
+<fb57> <fb57> 14060
+<fb58> <fb58> 16746
+<fb59> <fb59> 15748
+<fb5a> <fb5a> 16386
+<fb5b> <fb5b> 16774
+<fb5c> <fb5c> 16314
+<fb5d> <fb5d> 17343
+<fb5e> <fb5e> 16325
+<fb5f> <fb5f> 16208
+<fb60> <fb60> 16022
+<fb61> <fb61> 17344
+<fb62> <fb62> 16778
+<fb63> <fb63> 16321
+<fb64> <fb64> 15759
+<fb65> <fb65> 17345
+<fb66> <fb66> 16032
+<fb67> <fb67> 16150
+<fb68> <fb68> 16029
+<fb69> <fb69> 16782
+<fb6a> <fb6a> 16786
+<fb6b> <fb6b> 14950
+<fb6c> <fb6c> 16028
+<fb6d> <fb6d> 17295
+<fb6e> <fb6e> 16016
+<fb6f> <fb6f> 16797
+<fb70> <fb71> 17346
+<fb72> <fb72> 17238
+<fb73> <fb73> 14248
+<fb74> <fb74> 16798
+<fb75> <fb75> 16793
+<fb76> <fb76> 16775
+<fb77> <fb77> 16034
+<fb78> <fb78> 16799
+<fb79> <fb79> 16007
+<fb7a> <fb7a> 16004
+<fb7b> <fb7b> 16046
+<fb7c> <fb7d> 15220
+<fb7e> <fb7e> 14242
+<fba1> <fba1> 15218
+<fba2> <fba2> 15993
+<fba3> <fba3> 15981
+<fba4> <fba5> 17348
+<fba6> <fba6> 16050
+<fba7> <fba7> 17350
+<fba8> <fba8> 16044
+<fba9> <fba9> 16842
+<fbaa> <fbaa> 16884
+<fbab> <fbab> 17351
+<fbac> <fbac> 16848
+<fbad> <fbad> 15018
+<fbae> <fbae> 16862
+<fbaf> <fbaf> 16859
+<fbb0> <fbb0> 16872
+<fbb1> <fbb1> 17352
+<fbb2> <fbb2> 16374
+<fbb3> <fbb3> 16857
+<fbb4> <fbb4> 15682
+<fbb5> <fbb5> 16885
+<fbb6> <fbb6> 16888
+<fbb7> <fbb7> 16891
+<fbb8> <fbb8> 16901
+<fbb9> <fbb9> 15758
+<fbba> <fbba> 16910
+<fbbb> <fbbb> 15715
+<fbbc> <fbbc> 16930
+<fbbd> <fbbd> 16929
+<fbbe> <fbbe> 16931
+<fbbf> <fbbf> 16489
+<fbc0> <fbc0> 16431
+<fbc1> <fbc1> 16962
+<fbc2> <fbc2> 14501
+<fbc3> <fbc3> 16966
+<fbc4> <fbc4> 15605
+<fbc5> <fbc5> 15721
+<fbc6> <fbc6> 15614
+<fbc7> <fbc7> 16987
+<fbc8> <fbc8> 15048
+<fbc9> <fbc9> 15808
+<fbca> <fbca> 14826
+<fbcb> <fbcb> 16384
+<fbcc> <fbcc> 16996
+<fbcd> <fbcd> 16994
+<fbce> <fbce> 16383
+<fbcf> <fbcf> 16026
+<fbd0> <fbd0> 17011
+<fbd1> <fbd1> 14697
+endcidrange
+
+100 begincidrange
+<fbd2> <fbd2> 17018
+<fbd3> <fbd3> 17027
+<fbd4> <fbd5> 17353
+<fbd6> <fbd6> 16282
+<fbd7> <fbd7> 16053
+<fbd8> <fbd9> 17355
+<fbda> <fbda> 16306
+<fbdb> <fbdc> 17034
+<fbdd> <fbdd> 15127
+<fbde> <fbde> 17036
+<fbdf> <fbdf> 17040
+<fbe0> <fbe0> 15071
+<fbe1> <fbe1> 17357
+<fbe2> <fbe2> 17093
+<fbe3> <fbe3> 17096
+<fbe4> <fbe4> 16045
+<fbe5> <fbe5> 17358
+<fbe6> <fbe6> 16271
+<fbe7> <fbe7> 17359
+<fbe8> <fbe8> 15986
+<fbe9> <fbe9> 15984
+<fbea> <fbea> 17360
+<fbeb> <fbeb> 16042
+<fbec> <fbec> 17361
+<fbed> <fbed> 16297
+<fbee> <fbf0> 17362
+<fbf1> <fbf1> 17112
+<fbf2> <fbf2> 16371
+<fbf3> <fbf3> 17120
+<fbf4> <fbf4> 15104
+<fbf5> <fbf5> 17175
+<fbf6> <fbf6> 14381
+<fbf7> <fbf7> 15987
+<fbf8> <fbf8> 16341
+<fbf9> <fbfa> 17365
+<fbfb> <fbfb> 15124
+<fbfc> <fbfc> 14056
+<fbfd> <fbfd> 17140
+<fbfe> <fbfe> 15118
+<fc40> <fc40> 17132
+<fc41> <fc41> 17136
+<fc42> <fc42> 15997
+<fc43> <fc43> 17367
+<fc44> <fc44> 17150
+<fc45> <fc45> 17157
+<fc46> <fc46> 16346
+<fc47> <fc47> 15857
+<fc48> <fc48> 14131
+<fc49> <fc49> 15741
+<fc4a> <fc4a> 17368
+<fc4b> <fc4b> 14138
+<fc4c> <fc4c> 14144
+<fc4d> <fc4d> 14146
+<fc4e> <fc4e> 14150
+<fc4f> <fc4f> 14162
+<fc50> <fc50> 16159
+<fc51> <fc51> 17369
+<fc52> <fc52> 14061
+<fc53> <fc53> 15178
+<fc54> <fc54> 14174
+<fc55> <fc55> 15173
+<fc56> <fc56> 17370
+<fc57> <fc57> 16094
+<fc58> <fc58> 14185
+<fc59> <fc59> 14188
+<fc5a> <fc5a> 14187
+<fc5b> <fc5b> 14190
+<fc5c> <fc5c> 14207
+<fc5d> <fc5d> 14203
+<fc5e> <fc5e> 14210
+<fc5f> <fc5f> 15977
+<fc60> <fc60> 15183
+<fc61> <fc61> 14214
+<fc62> <fc62> 17371
+<fc63> <fc63> 14216
+<fc64> <fc64> 17372
+<fc65> <fc65> 16077
+<fc66> <fc66> 14231
+<fc67> <fc67> 16909
+<fc68> <fc68> 17373
+<fc69> <fc69> 14268
+<fc6a> <fc6a> 17374
+<fc6b> <fc6b> 14296
+<fc6c> <fc6c> 15217
+<fc6d> <fc6d> 15994
+<fc6e> <fc6e> 17375
+<fc6f> <fc6f> 14556
+<fc70> <fc70> 14304
+<fc71> <fc71> 14318
+<fc72> <fc72> 14324
+<fc73> <fc73> 14355
+<fc74> <fc75> 17376
+<fc76> <fc76> 16048
+<fc77> <fc77> 17378
+<fc78> <fc78> 16365
+<fc79> <fc79> 14349
+<fc7a> <fc7a> 16047
+<fc7b> <fc7b> 16274
+<fc7c> <fc7c> 14358
+<fc7d> <fc7d> 14363
+endcidrange
+
+89 begincidrange
+<fc7e> <fc7e> 16290
+<fca1> <fca1> 14364
+<fca2> <fca3> 14366
+<fca4> <fca4> 16049
+<fca5> <fca5> 4938
+<fca6> <fca6> 17379
+<fca7> <fca7> 16361
+<fca8> <fca8> 17380
+<fca9> <fca9> 16377
+<fcaa> <fcaa> 15763
+<fcab> <fcab> 17381
+<fcac> <fcac> 15961
+<fcad> <fcad> 17382
+<fcae> <fcae> 14391
+<fcaf> <fcaf> 16281
+<fcb0> <fcb0> 16025
+<fcb1> <fcb1> 15966
+<fcb2> <fcb2> 15284
+<fcb3> <fcb3> 16043
+<fcb4> <fcb5> 17383
+<fcb6> <fcb6> 14430
+<fcb7> <fcb7> 17385
+<fcb8> <fcb8> 15806
+<fcb9> <fcb9> 16005
+<fcba> <fcbb> 14435
+<fcbc> <fcbc> 15724
+<fcbd> <fcbd> 14449
+<fcbe> <fcbe> 16096
+<fcbf> <fcbf> 17386
+<fcc0> <fcc0> 14460
+<fcc1> <fcc1> 17387
+<fcc2> <fcc2> 16056
+<fcc3> <fcc3> 14466
+<fcc4> <fcc4> 16027
+<fcc5> <fcc5> 17388
+<fcc6> <fcc6> 14472
+<fcc7> <fcc7> 15374
+<fcc8> <fcc8> 14382
+<fcc9> <fcc9> 14490
+<fcca> <fcca> 14475
+<fccb> <fccb> 15364
+<fccc> <fccc> 14057
+<fccd> <fccd> 17085
+<fcce> <fcce> 15309
+<fccf> <fccf> 14495
+<fcd0> <fcd0> 15838
+<fcd1> <fcd1> 14235
+<fcd2> <fcd2> 15315
+<fcd3> <fcd3> 14511
+<fcd4> <fcd4> 16023
+<fcd5> <fcd5> 14550
+<fcd6> <fcd6> 16181
+<fcd7> <fcd7> 14560
+<fcd8> <fcd8> 16437
+<fcd9> <fcd9> 14576
+<fcda> <fcdb> 17389
+<fcdc> <fcdc> 15357
+<fcdd> <fcde> 15377
+<fcdf> <fcdf> 17391
+<fce0> <fce0> 14213
+<fce1> <fce1> 14594
+<fce2> <fce2> 15836
+<fce3> <fce3> 17392
+<fce4> <fce4> 16298
+<fce5> <fce5> 14603
+<fce6> <fce6> 16153
+<fce7> <fce7> 14606
+<fce8> <fce8> 14617
+<fce9> <fce9> 17393
+<fcea> <fcea> 15420
+<fceb> <fceb> 14618
+<fcec> <fcec> 15418
+<fced> <fced> 14619
+<fcee> <fcee> 15974
+<fcef> <fcef> 16162
+<fcf0> <fcf0> 15742
+<fcf1> <fcf1> 15985
+<fcf2> <fcf2> 15417
+<fcf3> <fcf3> 16033
+<fcf4> <fcf5> 17394
+<fcf6> <fcf6> 16176
+<fcf7> <fcf7> 14633
+<fcf8> <fcf8> 16316
+<fcf9> <fcf9> 14646
+<fcfa> <fcfa> 17396
+<fcfb> <fcfb> 14647
+<fcfc> <fcfc> 16272
+<fcfd> <fcfd> 17397
+<fcfe> <fcfe> 2746
+endcidrange
+endcmap
+CMapName currentdict /CMap defineresource pop
+end
+end
+
+%%EndResource
+%%EOF
diff --git a/src/main/resources/Resources/cmap/HKm471-B5-V b/src/main/resources/Resources/cmap/HKm471-B5-V
new file mode 100644
index 0000000..486b9e2
--- /dev/null
+++ b/src/main/resources/Resources/cmap/HKm471-B5-V
@@ -0,0 +1,71 @@
+%!PS-Adobe-3.0 Resource-CMap
+%%DocumentNeededResources: ProcSet (CIDInit)
+%%DocumentNeededResources: CMap (HKm471-B5-H)
+%%IncludeResource: ProcSet (CIDInit)
+%%IncludeResource: CMap (HKm471-B5-H)
+%%BeginResource: CMap (HKm471-B5-V)
+%%Title: (HKm471-B5-V Adobe CNS1 0)
+%%Version: 1.001
+%%Copyright: -----------------------------------------------------------
+%%Copyright: Copyright 1990-2000 Adobe Systems Incorporated.
+%%Copyright: All Rights Reserved.
+%%Copyright:
+%%Copyright: Patents Pending
+%%Copyright:
+%%Copyright: NOTICE: All information contained herein is the property
+%%Copyright: of Adobe Systems Incorporated.
+%%Copyright:
+%%Copyright: Permission is granted for redistribution of this file
+%%Copyright: provided this copyright notice is maintained intact and
+%%Copyright: that the contents of this file are not altered in any
+%%Copyright: way from its original form.
+%%Copyright:
+%%Copyright: PostScript and Display PostScript are trademarks of
+%%Copyright: Adobe Systems Incorporated which may be registered in
+%%Copyright: certain jurisdictions.
+%%Copyright: -----------------------------------------------------------
+%%EndComments
+
+/CIDInit /ProcSet findresource begin
+
+12 dict begin
+
+begincmap
+
+/HKm471-B5-H usecmap
+
+/CIDSystemInfo 3 dict dup begin
+ /Registry (Adobe) def
+ /Ordering (CNS1) def
+ /Supplement 0 def
+end def
+
+/CMapName /HKm471-B5-V def
+/CMapVersion 1.001 def
+/CMapType 1 def
+
+/XUID [1 10 25526] def
+
+/WMode 1 def
+
+12 begincidrange
+<a14b> <a14b> 13646
+<a15a> <a15a> 13743
+<a15c> <a15c> 13745
+<a15d> <a15e> 130
+<a161> <a162> 134
+<a165> <a166> 138
+<a169> <a16a> 142
+<a16d> <a16e> 146
+<a171> <a172> 150
+<a175> <a176> 154
+<a179> <a17a> 158
+<a1e3> <a1e3> 13647
+endcidrange
+endcmap
+CMapName currentdict /CMap defineresource pop
+end
+end
+
+%%EndResource
+%%EOF
diff --git a/src/main/resources/Resources/cmap/HKscs-B5-H b/src/main/resources/Resources/cmap/HKscs-B5-H
new file mode 100644
index 0000000..9acf676
--- /dev/null
+++ b/src/main/resources/Resources/cmap/HKscs-B5-H
@@ -0,0 +1 @@
+%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%IncludeResource: ProcSet (CIDInit) %%BeginResource: CMap (HKscs-B5-H) %%Title: (HKscs-B5-H Adobe CNS1 3) %%Version: 1.001 %%Copyright: ----------------------------------------------------------- %%Copyright: Copyright 1990-2000 Adobe Systems Incorporated. %%Copyright: All Rights Reserved. %%Copyright: %%Copyright: Patents Pending %%Copyright: %%Copyright: NOTICE: All information contained herein is the property %%Copyright: of Adobe Systems Incorporated. %%Copyright: %%Copyright: Permission is granted for redistribution of this file %%Copyright: provided this copyright notice is maintained intact and %%Copyright: that the contents of this file are not altered in any %%Copyright: way from its original form. %%Copyright: %%Copyright: PostScript and Display PostScript are trademarks of %%Copyright: Adobe Systems Incorporated which may be registered in %%Copyright: certain jurisdictions. %%Copyright: ----------------------------------------------------------- %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo 3 dict dup begin /Registry (Adobe) def /Ordering (CNS1) def /Supplement 3 def end def /CMapName /HKscs-B5-H def /CMapVersion 1.001 def /CMapType 1 def /XUID [1 10 25580] def /WMode 0 def 2 begincodespacerange <00> <80> <8840> <FEFE> endcodespacerange 1 beginnotdefrange <00> <1f> 1 endnotdefrange 100 begincidrange <20> <7e> 1 <8840> <8855> 17609 <8856> <887e> 18785 <88a1> <88a8> 18826 <88a9> <88aa> 18844 <8940> <8941> 17716 <8943> <8943> 17718 <8946> <8949> 17719 <894c> <894c> 17723 <894d> <894d> 17347 <894e> <8950> 17724 <8951> <8951> 17306 <8952> <897e> 17727 <89a1> <89a5> 17772 <89a6> <89a6> 17314 <89ab> <89ab> 17388 <89ac> <89ac> 17777 <89ad> <89ad> 17387 <89ae> <89ae> 17778 <89b0> <89b2> 17779 <89b5> <89bf> 17782 <89c1> <89c3> 17793 <89c5> <89ce> 17796 <89cf> <89cf> 17340 <89d0> <89d8> 17806 <89d9> <89d9> 17308 <89da> <89da> 17815 <89db> <89db> 17310 <89dc> <89dc> 17816 <89dd> <89dd> 17311 <89de> <89e0> 17817 <89e1> <89e1> 17313 <89e2> <89e2> 17820 <89e3> <89e3> 17315 <89e4> <89e9> 17821 <89ea> <89eb> 17317 <89ec> <89f9> 17827 <89fa> <89fa> 17321 <89fb> <89fe> 17841 <8a40> <8a40> 17845 <8a41> <8a41> 17161 <8a43> <8a4c> 17163 <8a4d> <8a4d> 17846 <8a4e> <8a59> 17174 <8a5a> <8a5a> 17847 <8a5b> <8a5d> 17187 <8a5e> <8a5e> 17848 <8a5f> <8a62> 17191 <8a64> <8a70> 17196 <8a71> <8a71> 17849 <8a72> <8a74> 17210 <8a76> <8a76> 17214 <8a77> <8a77> 17850 <8a78> <8a79> 17216 <8a7a> <8a7a> 17851 <8a7b> <8a7b> 17219 <8a7c> <8a7c> 17852 <8a7d> <8a7d> 17221 <8a7e> <8a7e> 17853 <8aa1> <8aa7> 17223 <8aa8> <8aa8> 17854 <8aa9> <8aaa> 17231 <8aac> <8ab0> 17234 <8ab2> <8ab5> 17240 <8ab6> <8ab6> 17855 <8ab7> <8ab7> 17245 <8ab8> <8ab8> 17856 <8ab9> <8ab9> 17247 <8abb> <8ac7> 17249 <8ac9> <8acb> 17263 <8acc> <8acc> 17857 <8ace> <8ad5> 17268 <8ad6> <8ad7> 17858 <8ad8> <8adc> 17278 <8adf> <8ae5> 17285 <8ae6> <8ae6> 17860 <8ae7> <8ae7> 17371 <8ae8> <8af4> 17861 <8af6> <8afe> 17874 <8b40> <8b40> 17883 <8b41> <8b42> 17292 <8b43> <8b44> 17884 <8b45> <8b45> 17294 <8b46> <8b46> 17886 <8b47> <8b47> 17295 <8b48> <8b48> 17887 <8b49> <8b49> 17296 <8b4a> <8b4a> 17888 <8b4b> <8b4b> 17297 <8b4c> <8b4c> 17889 <8b4d> <8b50> 17298 <8b51> <8b53> 17890 <8b55> <8b57> 17893 <8b58> <8b58> 17303 <8b59> <8b59> 17896 <8b5a> <8b5a> 17304 <8b5b> <8b5b> 17348 <8b5c> <8b60> 17897 <8b61> <8b61> 17319 <8b62> <8b67> 17902 endcidrange 100 begincidrange <8b68> <8b68> 17324 <8b69> <8b7e> 17908 <8ba1> <8bbf> 17930 <8bc0> <8bdc> 17631 <8bde> <8bfd> 17660 <8d60> <8d61> 17961 <8d62> <8d62> 17338 <8d63> <8d67> 17963 <8d68> <8d68> 17339 <8d69> <8d69> 17312 <8d6a> <8d6a> 17341 <8d6b> <8d6d> 17968 <8d6e> <8d6e> 17342 <8d6f> <8d75> 17971 <8d76> <8d76> 17343 <8d77> <8d79> 17978 <8d7a> <8d7a> 17344 <8d7b> <8d7b> 17981 <8d7c> <8d7c> 17345 <8d7d> <8d7e> 17982 <8da1> <8da4> 17984 <8da5> <8da5> 17346 <8da6> <8da7> 17988 <8da8> <8da8> 17337 <8da9> <8da9> 17325 <8daa> <8db5> 17990 <8db6> <8db6> 17351 <8db7> <8dc2> 18002 <8dc3> <8dc3> 17352 <8dc4> <8df9> 18014 <8dfa> <8dfa> 17401 <8dfb> <8dfe> 18068 <8e40> <8e44> 14123 <8e45> <8e45> 18072 <8e46> <8e68> 14128 <8e6a> <8e6a> 14164 <8e6b> <8e6c> 18073 <8e6d> <8e6e> 14166 <8e70> <8e75> 14169 <8e76> <8e76> 18075 <8e77> <8e7a> 14175 <8e7b> <8e7b> 18076 <8e7c> <8e7d> 14180 <8ea1> <8ea5> 14182 <8ea6> <8ea6> 18077 <8ea7> <8eaa> 14187 <8eac> <8eb3> 14192 <8eb5> <8eb7> 14201 <8eb8> <8eb8> 18078 <8eb9> <8ec8> 14205 <8ec9> <8ec9> 18079 <8eca> <8ecc> 14221 <8ece> <8ecf> 14225 <8ed1> <8ee4> 14228 <8ee5> <8ee5> 18080 <8ee6> <8eee> 14248 <8eef> <8eef> 18081 <8ef0> <8ef5> 14257 <8ef6> <8ef6> 18082 <8ef7> <8efe> 14264 <8f40> <8f56> 14272 <8f58> <8f58> 14296 <8f59> <8f59> 18083 <8f5a> <8f5e> 14297 <8f5f> <8f5f> 18084 <8f60> <8f66> 14302 <8f67> <8f67> 18085 <8f68> <8f68> 14309 <8f6a> <8f6d> 14311 <8f6f> <8f78> 14316 <8f79> <8f79> 18086 <8f7a> <8f7e> 14327 <8fa1> <8faf> 14332 <8fb0> <8fb0> 18087 <8fb1> <8fc4> 14348 <8fc5> <8fc5> 18088 <8fc6> <8fc6> 14368 <8fc7> <8fc7> 18089 <8fc8> <8fc9> 14369 <8fca> <8fca> 18090 <8fcd> <8fd9> 14374 <8fda> <8fda> 18091 <8fdb> <8fe2> 14387 <8fe3> <8fe3> 18092 <8fe4> <8ffb> 14396 <8ffc> <8ffc> 18093 <8ffd> <8ffd> 14420 <9040> <9054> 14422 <9055> <9055> 18094 <9056> <905b> 14444 <905c> <905e> 18095 <905f> <906c> 14451 <906e> <906e> 14466 <906f> <906f> 18098 <9070> <9079> 14467 <907b> <907e> 14477 <90a1> <90a5> 14481 <90a6> <90a6> 18099 <90a7> <90b7> 14486 <90b8> <90b8> 18100 endcidrange 100 begincidrange <90b9> <90db> 14503 <90dd> <90f0> 14539 <90f2> <90fe> 14560 <9140> <9164> 14573 <9165> <9165> 18101 <9166> <916d> 14610 <916e> <916e> 18102 <916f> <917d> 14618 <917e> <917e> 18103 <91a1> <91a1> 14633 <91a2> <91a2> 18104 <91a3> <91be> 14634 <91c0> <91c7> 14663 <91c8> <91c8> 18105 <91c9> <91fe> 14672 <9240> <9243> 14726 <9245> <9263> 14731 <9264> <9264> 18106 <9265> <926c> 14763 <926d> <926d> 18107 <926e> <927e> 14772 <92a1> <92ae> 14789 <92b3> <92c7> 14803 <92c9> <92d0> 14825 <92d2> <92e4> 14834 <92e5> <92e5> 18108 <92e6> <92f1> 14853 <92f2> <92f2> 18109 <92f3> <92fe> 14865 <9340> <9367> 14877 <9368> <9368> 18110 <9369> <937e> 14917 <93a1> <93a9> 14939 <93aa> <93aa> 18111 <93ab> <93c1> 14948 <93c2> <93c2> 18112 <93c3> <93e4> 14971 <93e5> <93e5> 18113 <93e6> <93e7> 15005 <93e8> <93e8> 18114 <93e9> <93ea> 15008 <93eb> <93eb> 18115 <93ec> <93fe> 15010 <9440> <9445> 15029 <9446> <9446> 18116 <9448> <9478> 15036 <9479> <9479> 18117 <947a> <947e> 15086 <94a1> <94c9> 15091 <94cb> <94cb> 18118 <94cc> <94fe> 15134 <9540> <954c> 15185 <954d> <954d> 18119 <954e> <9559> 15198 <955a> <955a> 18120 <955b> <955e> 15210 <955f> <955f> 18121 <9560> <957e> 15215 <95a1> <95c5> 15246 <95c6> <95c6> 18122 <95c7> <95d8> 15283 <95da> <95fe> 15302 <9640> <9643> 15339 <9645> <9650> 15344 <9651> <9651> 18123 <9652> <9669> 15357 <966a> <966a> 18124 <966b> <967e> 15382 <96a1> <96d3> 15402 <96d4> <96d4> 18125 <96d5> <96ec> 15453 <96ee> <96fb> 15478 <96fd> <96fe> 15493 <9740> <977e> 15495 <97a1> <97fe> 15558 <9840> <9843> 15652 <9844> <9845> 18126 <9846> <986e> 15658 <986f> <986f> 18128 <9870> <9874> 15700 <9875> <9876> 18129 <9877> <9877> 15705 <9878> <9879> 18131 <987a> <987a> 15706 <987b> <987e> 18133 <98a1> <98a2> 18137 <98a3> <98a3> 15707 <98a4> <98ae> 18139 <98af> <98af> 15708 <98b0> <98b3> 18150 <98b4> <98b4> 17354 <98b5> <98b5> 18154 <98b6> <98b6> 15709 <98b7> <98b7> 18155 <98b8> <98b8> 17356 <98b9> <98b9> 15710 <98ba> <98ba> 18156 <98bb> <98bb> 17402 <98bc> <98bc> 18157 <98bd> <98be> 15711 endcidrange 100 begincidrange <98bf> <98c1> 18158 <98c2> <98c2> 15713 <98c3> <98c3> 18161 <98c4> <98c4> 15714 <98c5> <98c5> 18162 <98c6> <98c7> 15715 <98c8> <98d1> 18163 <98d2> <98d2> 17357 <98d3> <98d7> 18173 <98d8> <98d9> 17358 <98da> <98da> 18178 <98db> <98db> 17361 <98dc> <98de> 18179 <98df> <98df> 17364 <98e0> <98e2> 18182 <98e3> <98e3> 15717 <98e4> <98e6> 18185 <98e7> <98e7> 15718 <98e8> <98ec> 18188 <98ed> <98ed> 15719 <98ee> <98ef> 18193 <98f0> <98f0> 15720 <98f1> <98f1> 18195 <98f2> <98f2> 15721 <98f3> <98f3> 18196 <98f4> <98f5> 17365 <98f6> <98fb> 18197 <98fc> <98fc> 15722 <98fd> <98fd> 18203 <98fe> <98fe> 17367 <9940> <9941> 18204 <9942> <9942> 17404 <9943> <9943> 15723 <9944> <9944> 18206 <9945> <9945> 15724 <9946> <9946> 18207 <9947> <9947> 17368 <9948> <994e> 18208 <994f> <994f> 15725 <9950> <9953> 18215 <9954> <9954> 17369 <9955> <995b> 18219 <995c> <995c> 17370 <995d> <9963> 18226 <9964> <9964> 17372 <9965> <9969> 18233 <996a> <996a> 15726 <996b> <996d> 18238 <996e> <996e> 15727 <996f> <9974> 18241 <9975> <9975> 15728 <9976> <9977> 18247 <9978> <9978> 15729 <9979> <997e> 18249 <99a1> <99a1> 18255 <99a2> <99a2> 15730 <99a3> <99a3> 18256 <99a4> <99a4> 17349 <99a5> <99a5> 18257 <99a6> <99a6> 17350 <99a7> <99ad> 18258 <99ae> <99ae> 15731 <99af> <99b1> 18265 <99b2> <99b2> 17374 <99b3> <99b5> 18268 <99b6> <99b6> 15732 <99b7> <99b9> 18271 <99ba> <99ba> 15733 <99bb> <99c9> 18274 <99ca> <99ca> 17376 <99cb> <99cc> 18289 <99cd> <99cd> 17378 <99ce> <99d2> 18291 <99d3> <99d3> 17379 <99d4> <99d5> 18296 <99d6> <99d6> 17381 <99d7> <99de> 18298 <99df> <99df> 17375 <99e0> <99e1> 18306 <99e2> <99e2> 15734 <99e3> <99e3> 18308 <99e4> <99e4> 17323 <99e5> <99e5> 18309 <99e6> <99e6> 17383 <99e7> <99e7> 18310 <99e8> <99e8> 17385 <99e9> <99ee> 18311 <99ef> <99ef> 17405 <99f0> <99f3> 18317 <99f4> <99f4> 15735 <99f5> <99fe> 18321 <9a40> <9a49> 18331 <9a4a> <9a4a> 15736 <9a4b> <9a4b> 18341 <9a4c> <9a4c> 15737 <9a4d> <9a58> 18342 <9a59> <9a59> 15738 <9a5a> <9a5e> 18354 <9a5f> <9a5f> 17327 <9a60> <9a60> 18359 endcidrange 100 begincidrange <9a61> <9a61> 15739 <9a62> <9a65> 18360 <9a66> <9a66> 17389 <9a67> <9a67> 18364 <9a68> <9a68> 15740 <9a69> <9a69> 17390 <9a6a> <9a6a> 18365 <9a6b> <9a6b> 17407 <9a6c> <9a72> 18366 <9a73> <9a73> 15741 <9a74> <9a74> 18373 <9a75> <9a75> 17393 <9a76> <9a7d> 18374 <9a7e> <9a7e> 15742 <9aa1> <9aa2> 18382 <9aa3> <9aa3> 17395 <9aa4> <9aa4> 18384 <9aa5> <9aa5> 17394 <9aa6> <9aa8> 18385 <9aa9> <9aa9> 17400 <9aaa> <9aaa> 17396 <9aab> <9ab1> 18388 <9ab2> <9ab2> 15743 <9ab3> <9ab6> 18395 <9ab7> <9ab7> 15744 <9ab8> <9ab8> 18399 <9ab9> <9ab9> 15745 <9aba> <9aba> 18400 <9abb> <9abb> 15746 <9abc> <9abc> 18401 <9abd> <9abd> 17335 <9abe> <9ac6> 18402 <9ac7> <9ac7> 15747 <9ac8> <9acf> 18411 <9ad0> <9ad0> 15748 <9ad1> <9ad1> 18419 <9ad2> <9ad2> 15749 <9ad3> <9ad8> 18420 <9ad9> <9adb> 15750 <9adc> <9ae1> 18426 <9ae2> <9ae2> 15753 <9ae3> <9ae3> 18432 <9ae4> <9ae4> 15754 <9ae5> <9ae7> 18433 <9ae8> <9ae8> 15755 <9ae9> <9ae9> 17328 <9aea> <9aed> 18436 <9aee> <9aee> 17330 <9aef> <9af1> 18440 <9af2> <9af2> 15756 <9af3> <9af5> 18443 <9af6> <9af6> 15757 <9af7> <9afa> 18446 <9afb> <9afb> 15758 <9afc> <9afe> 18450 <9b40> <9b45> 18453 <9b46> <9b46> 15759 <9b47> <9b49> 18459 <9b4a> <9b4a> 15760 <9b4b> <9b53> 18462 <9b54> <9b54> 15762 <9b55> <9b57> 18471 <9b58> <9b58> 15763 <9b59> <9b59> 18474 <9b5a> <9b5a> 15764 <9b5b> <9b5b> 18475 <9b5c> <9b5c> 15765 <9b5d> <9b5d> 18476 <9b5e> <9b5f> 15766 <9b60> <9b60> 18477 <9b62> <9b6f> 18478 <9b70> <9b73> 15768 <9b74> <9b75> 18492 <9b77> <9b77> 15773 <9b79> <9b7a> 18494 <9b7c> <9b7c> 15776 <9b7d> <9b7d> 18496 <9b7e> <9b7e> 15777 <9ba1> <9ba1> 15778 <9ba2> <9ba2> 18497 <9ba3> <9ba4> 15779 <9ba5> <9ba6> 18498 <9ba7> <9baa> 15781 <9bab> <9bab> 18500 <9bac> <9bac> 15785 <9bad> <9bae> 18501 <9baf> <9baf> 15786 <9bb0> <9bb1> 18503 <9bb2> <9bb9> 15787 <9bba> <9bbd> 18505 <9bbe> <9bbe> 15795 <9bbf> <9bbf> 18509 <9bc0> <9bc5> 15796 <9bc7> <9bc9> 18510 <9bca> <9bca> 15803 <9bcb> <9bcb> 18513 <9bcc> <9bcc> 15804 <9bcd> <9bcd> 18514 <9bce> <9bce> 17360 <9bcf> <9bcf> 18515 endcidrange 100 begincidrange <9bd0> <9bd1> 15805 <9bd2> <9bd2> 18516 <9bd3> <9bd3> 15807 <9bd4> <9bd4> 18517 <9bd5> <9bd5> 15808 <9bd6> <9bd7> 18518 <9bd8> <9bda> 15809 <9bdb> <9bdc> 18520 <9bdd> <9bdd> 15812 <9bdf> <9bdf> 15813 <9be0> <9be0> 18522 <9be1> <9be1> 15814 <9be2> <9be2> 18523 <9be3> <9be3> 15815 <9be4> <9be6> 18524 <9be7> <9be7> 15816 <9be8> <9be8> 18527 <9be9> <9beb> 15817 <9bed> <9bed> 18528 <9bee> <9bef> 15821 <9bf0> <9bf2> 18529 <9bf3> <9bf3> 15823 <9bf4> <9bf5> 18532 <9bf7> <9bf7> 18534 <9bf8> <9bf9> 15825 <9bfa> <9bfa> 18535 <9bfb> <9bfc> 15827 <9bfd> <9bfe> 18536 <9c40> <9c41> 15829 <9c43> <9c43> 18538 <9c44> <9c46> 15832 <9c47> <9c47> 18539 <9c48> <9c48> 15835 <9c49> <9c49> 18540 <9c4a> <9c4a> 15836 <9c4b> <9c4c> 18541 <9c4d> <9c52> 15837 <9c54> <9c54> 18543 <9c55> <9c55> 15844 <9c56> <9c56> 18544 <9c57> <9c5b> 15845 <9c5c> <9c5c> 18545 <9c5d> <9c5d> 15850 <9c5e> <9c5f> 18546 <9c60> <9c60> 15851 <9c61> <9c61> 18548 <9c63> <9c63> 18549 <9c64> <9c66> 15853 <9c67> <9c67> 18550 <9c69> <9c69> 18551 <9c6a> <9c6a> 15857 <9c6c> <9c6c> 18552 <9c6d> <9c6d> 15858 <9c6e> <9c6e> 18553 <9c6f> <9c72> 15859 <9c73> <9c74> 18554 <9c75> <9c76> 15863 <9c78> <9c78> 18556 <9c79> <9c79> 15866 <9c7a> <9c7a> 18557 <9c7b> <9c7c> 15867 <9c7d> <9c7d> 18558 <9c7e> <9c7e> 15869 <9ca1> <9ca2> 15870 <9ca3> <9ca4> 18559 <9ca5> <9ca5> 15872 <9ca6> <9ca7> 18561 <9ca8> <9ca9> 15873 <9caa> <9caa> 18563 <9cab> <9cab> 15875 <9cac> <9cac> 18564 <9cad> <9cae> 15876 <9caf> <9cb0> 18565 <9cb1> <9cba> 15878 <9cbb> <9cbb> 18567 <9cbe> <9cc2> 15890 <9cc3> <9cc5> 18568 <9cc6> <9ccd> 15895 <9cce> <9cce> 18571 <9ccf> <9ccf> 15903 <9cd1> <9cd3> 15905 <9cd4> <9cd7> 18572 <9cd8> <9cda> 15908 <9cdb> <9cdb> 18576 <9cdc> <9ce5> 15911 <9ce6> <9ce6> 18577 <9ce7> <9ce9> 15921 <9cea> <9cea> 18578 <9ceb> <9cec> 15924 <9ced> <9ced> 18579 <9cee> <9cf9> 15926 <9cfa> <9cfc> 18580 <9cfd> <9cfd> 15938 <9cfe> <9cfe> 18583 <9d40> <9d40> 17384 <9d41> <9d45> 18584 <9d46> <9d46> 15939 <9d47> <9d48> 18589 <9d49> <9d49> 15940 <9d4a> <9d4b> 18591 endcidrange 100 begincidrange <9d4c> <9d4d> 15942 <9d4e> <9d4e> 18593 <9d4f> <9d4f> 15944 <9d50> <9d50> 18594 <9d51> <9d51> 15945 <9d52> <9d54> 18595 <9d55> <9d55> 15946 <9d56> <9d56> 18598 <9d58> <9d59> 18599 <9d5b> <9d60> 18601 <9d61> <9d61> 17353 <9d62> <9d62> 15948 <9d63> <9d63> 18607 <9d64> <9d64> 15949 <9d65> <9d77> 18608 <9d78> <9d78> 17397 <9d79> <9d79> 15950 <9d7a> <9d7d> 18627 <9d7e> <9d7e> 15951 <9da1> <9da4> 18631 <9da5> <9da8> 15952 <9da9> <9da9> 18635 <9daa> <9daa> 15956 <9dab> <9dab> 18636 <9dac> <9dad> 15957 <9dae> <9daf> 18637 <9db0> <9db0> 15960 <9db1> <9db2> 18639 <9db3> <9db3> 15961 <9db4> <9db4> 18641 <9db5> <9db5> 15962 <9db6> <9db6> 18642 <9db7> <9db7> 15963 <9db8> <9dbb> 18643 <9dbc> <9dbd> 15964 <9dbe> <9dbe> 18647 <9dbf> <9dc0> 15966 <9dc1> <9dc2> 18648 <9dc3> <9dc3> 15968 <9dc5> <9dc6> 18650 <9dc7> <9dc8> 15970 <9dc9> <9dc9> 18652 <9dca> <9dca> 15972 <9dcb> <9dcc> 18653 <9dcd> <9dd1> 15973 <9dd2> <9dd2> 18655 <9dd3> <9dd5> 15978 <9dd6> <9dd9> 18656 <9dda> <9dfb> 15981 <9dfc> <9dfc> 18660 <9dfd> <9dfe> 16015 <9e40> <9e42> 16017 <9e43> <9e43> 18661 <9e44> <9e5e> 16021 <9e5f> <9e5f> 18662 <9e60> <9e62> 16049 <9e63> <9e63> 18663 <9e64> <9e65> 16052 <9e66> <9e67> 18664 <9e68> <9e68> 16054 <9e69> <9e69> 18666 <9e6a> <9e6a> 16055 <9e6b> <9e70> 18667 <9e71> <9e71> 16056 <9e72> <9e72> 18673 <9e73> <9e73> 16057 <9e74> <9e76> 18674 <9e77> <9e78> 16058 <9e79> <9e79> 18677 <9e7a> <9e7a> 16060 <9e7b> <9e7b> 18678 <9e7c> <9e7c> 16061 <9e7d> <9e7d> 18679 <9e7e> <9e7e> 16062 <9ea1> <9ea2> 16063 <9ea3> <9ea3> 18680 <9ea4> <9ea6> 16065 <9ea7> <9ea8> 18681 <9eaa> <9eaa> 16069 <9eab> <9eab> 18683 <9ead> <9ead> 16071 <9eae> <9eae> 18684 <9eaf> <9eb1> 16072 <9eb2> <9eb3> 18685 <9eb4> <9eb4> 16075 <9eb5> <9eb5> 18687 <9eb6> <9eb7> 16076 <9eb8> <9eb8> 18688 <9eb9> <9eb9> 16078 <9eba> <9ebb> 18689 <9ebc> <9ebc> 16079 <9ebd> <9ebe> 18691 <9ebf> <9ec0> 16080 <9ec1> <9ec3> 18693 <9ec5> <9ec5> 16083 <9ec6> <9ec6> 18696 <9ec7> <9eca> 16084 <9ecb> <9ecc> 18697 <9ecd> <9ecd> 16089 <9ece> <9ecf> 18699 endcidrange 100 begincidrange <9ed0> <9ed1> 16090 <9ed2> <9ed2> 18701 <9ed3> <9ed3> 16092 <9ed4> <9ed5> 18702 <9ed6> <9ed7> 16093 <9ed8> <9ed9> 18704 <9eda> <9eee> 16095 <9ef0> <9ef1> 16117 <9ef2> <9ef2> 18706 <9ef3> <9ef3> 16119 <9ef5> <9ef5> 16121 <9ef6> <9ef8> 18707 <9ef9> <9efa> 16122 <9efb> <9efb> 18710 <9efc> <9efc> 16124 <9efe> <9efe> 16126 <9f40> <9f42> 16127 <9f43> <9f43> 18711 <9f44> <9f47> 16130 <9f48> <9f48> 18712 <9f49> <9f4a> 16134 <9f4b> <9f4c> 18713 <9f4d> <9f4d> 16136 <9f4f> <9f5f> 16138 <9f61> <9f65> 16156 <9f67> <9f68> 18715 <9f69> <9f6f> 16163 <9f70> <9f70> 18717 <9f71> <9f7e> 16170 <9fa1> <9fac> 16184 <9fae> <9fb0> 16197 <9fb2> <9fb4> 16201 <9fb5> <9fb5> 18718 <9fb6> <9fba> 16204 <9fbb> <9fbb> 18719 <9fbc> <9fbe> 16209 <9fbf> <9fbf> 18720 <9fc1> <9fc1> 18721 <9fc2> <9fc7> 16213 <9fc9> <9fca> 16220 <9fcc> <9fcc> 18722 <9fcd> <9fd3> 16224 <9fd4> <9fd4> 18723 <9fd5> <9fd7> 16232 <9fd9> <9fd9> 16236 <9fdb> <9fe3> 16238 <9fe4> <9fe4> 18724 <9fe5> <9fe5> 16247 <9fe7> <9fe9> 16249 <9feb> <9fee> 16253 <9ff0> <9ff8> 16258 <9ff9> <9ff9> 18725 <9ffa> <9ffe> 16267 <a040> <a040> 18726 <a041> <a046> 16272 <a047> <a047> 18727 <a048> <a053> 16278 <a055> <a055> 18728 <a056> <a056> 16291 <a058> <a059> 16293 <a05b> <a061> 16296 <a064> <a06c> 16305 <a06d> <a06d> 18729 <a06e> <a071> 16314 <a073> <a076> 16319 <a078> <a07a> 16324 <a07b> <a07b> 18730 <a07c> <a07e> 16327 <a0a1> <a0a1> 16330 <a0a2> <a0a2> 18731 <a0a3> <a0a4> 16331 <a0a6> <a0a6> 16334 <a0a7> <a0a7> 18732 <a0a8> <a0ac> 16335 <a0ae> <a0ae> 16341 <a0b0> <a0c4> 16343 <a0c5> <a0c5> 18733 <a0c6> <a0cf> 16364 <a0d0> <a0d0> 18734 <a0d1> <a0d2> 16374 <a0d4> <a0d4> 16377 <a0d6> <a0de> 16379 <a0e0> <a0e0> 16389 <a0e2> <a0e2> 16391 <a0e3> <a0e3> 18735 <a0e5> <a0e6> 16393 <a0e7> <a0ed> 18736 <a0ee> <a0ee> 17332 <a0ef> <a0f1> 18743 <a0f2> <a0f2> 17336 <a0f3> <a0fe> 18746 <a140> <a158> 99 <a159> <a15c> 13743 <a15d> <a17e> 128 <a1a1> <a1f5> 162 <a1f6> <a1f6> 248 <a1f7> <a1f7> 247 <a1f8> <a1fe> 249 <a240> <a27e> 256 <a2a1> <a2fe> 319 endcidrange 100 begincidrange <a340> <a37e> 413 <a3a1> <a3bb> 476 <a3bd> <a3bf> 503 <a440> <a47e> 595 <a4a1> <a4fe> 658 <a540> <a57e> 752 <a5a1> <a5fe> 815 <a640> <a67e> 909 <a6a1> <a6fe> 972 <a740> <a77e> 1066 <a7a1> <a7fe> 1129 <a840> <a87e> 1223 <a8a1> <a8fe> 1286 <a940> <a97e> 1380 <a9a1> <a9fe> 1443 <aa40> <aa7e> 1537 <aaa1> <aafe> 1600 <ab40> <ab7e> 1694 <aba1> <abfe> 1757 <ac40> <ac7e> 1851 <aca1> <acfd> 1914 <acfe> <acfe> 2431 <ad40> <ad7e> 2007 <ada1> <adfe> 2070 <ae40> <ae7e> 2164 <aea1> <aefe> 2227 <af40> <af7e> 2321 <afa1> <afcf> 2384 <afd0> <affe> 2432 <b040> <b07e> 2479 <b0a1> <b0fe> 2542 <b140> <b17e> 2636 <b1a1> <b1fe> 2699 <b240> <b27e> 2793 <b2a1> <b2fe> 2856 <b340> <b37e> 2950 <b3a1> <b3fe> 3013 <b440> <b47e> 3107 <b4a1> <b4fe> 3170 <b540> <b57e> 3264 <b5a1> <b5fe> 3327 <b640> <b67e> 3421 <b6a1> <b6fe> 3484 <b740> <b77e> 3578 <b7a1> <b7fe> 3641 <b840> <b87e> 3735 <b8a1> <b8fe> 3798 <b940> <b97e> 3892 <b9a1> <b9fe> 3955 <ba40> <ba7e> 4049 <baa1> <bafe> 4112 <bb40> <bb7e> 4206 <bba1> <bbc7> 4269 <bbc8> <bbfe> 4309 <bc40> <bc7e> 4364 <bca1> <bcfe> 4427 <bd40> <bd7e> 4521 <bda1> <bdfe> 4584 <be40> <be51> 4678 <be52> <be52> 4308 <be53> <be7e> 4696 <bea1> <befe> 4740 <bf40> <bf7e> 4834 <bfa1> <bffe> 4897 <c040> <c07e> 4991 <c0a1> <c0fe> 5054 <c140> <c17e> 5148 <c1a1> <c1aa> 5211 <c1ab> <c1fe> 5222 <c240> <c27e> 5306 <c2a1> <c2ca> 5369 <c2cb> <c2cb> 5221 <c2cc> <c2fe> 5411 <c340> <c360> 5462 <c361> <c37e> 5496 <c3a1> <c3b8> 5526 <c3b9> <c3b9> 5551 <c3ba> <c3ba> 5550 <c3bb> <c3fe> 5552 <c440> <c455> 5620 <c456> <c456> 5495 <c457> <c47e> 5642 <c4a1> <c4fe> 5682 <c540> <c57e> 5776 <c5a1> <c5fe> 5839 <c640> <c67e> 5933 <c6a1> <c6be> 506 <c6bf> <c6ce> 537 <c6d0> <c6d2> 554 <c6d4> <c6d4> 558 <c6d6> <c6d6> 560 <c6d8> <c6dd> 13747 <c6e0> <c6fe> 13754 <c740> <c77e> 13785 <c7a1> <c7fe> 13848 <c840> <c87e> 13942 <c8a1> <c8a4> 14005 <c8cd> <c8d3> 14049 <c8d4> <c8d6> 17606 <c8d7> <c8df> 17692 endcidrange 100 begincidrange <c8e0> <c8e0> 732 <c8e1> <c8e8> 17701 <c8e9> <c8e9> 1289 <c8ea> <c8f0> 17709 <c8f1> <c8f1> 2550 <c8f5> <c8fe> 18834 <c940> <c949> 5996 <c94a> <c94a> 628 <c94b> <c96b> 6006 <c96c> <c97e> 6040 <c9a1> <c9bd> 6059 <c9be> <c9be> 6039 <c9bf> <c9ec> 6088 <c9ed> <c9fe> 6135 <ca40> <ca7e> 6153 <caa1> <caf6> 6216 <caf7> <caf7> 6134 <caf8> <cafe> 6302 <cb40> <cb7e> 6309 <cba1> <cbfe> 6372 <cc40> <cc7e> 6466 <cca1> <ccfe> 6529 <cd40> <cd7e> 6623 <cda1> <cdfe> 6686 <ce40> <ce7e> 6780 <cea1> <cefe> 6843 <cf40> <cf7e> 6937 <cfa1> <cffe> 7000 <d040> <d07e> 7094 <d0a1> <d0fe> 7157 <d140> <d17e> 7251 <d1a1> <d1fe> 7314 <d240> <d27e> 7408 <d2a1> <d2fe> 7471 <d340> <d37e> 7565 <d3a1> <d3fe> 7628 <d440> <d47e> 7722 <d4a1> <d4fe> 7785 <d540> <d57e> 7879 <d5a1> <d5fe> 7942 <d640> <d67e> 8036 <d6a1> <d6cb> 8099 <d6cc> <d6cc> 8788 <d6cd> <d6fe> 8143 <d740> <d779> 8193 <d77a> <d77a> 8889 <d77b> <d77e> 8251 <d7a1> <d7fe> 8255 <d840> <d87e> 8349 <d8a1> <d8fe> 8412 <d940> <d97e> 8506 <d9a1> <d9fe> 8569 <da40> <da7e> 8663 <daa1> <dade> 8726 <dadf> <dadf> 8142 <dae0> <dafe> 8789 <db40> <db7e> 8820 <dba1> <dba6> 8883 <dba7> <dbfe> 8890 <dc40> <dc7e> 8978 <dca1> <dcfe> 9041 <dd40> <dd7e> 9135 <dda1> <ddfb> 9198 <ddfc> <ddfc> 9089 <ddfd> <ddfe> 9289 <de40> <de7e> 9291 <dea1> <defe> 9354 <df40> <df7e> 9448 <dfa1> <dffe> 9511 <e040> <e07e> 9605 <e0a1> <e0fe> 9668 <e140> <e17e> 9762 <e1a1> <e1fe> 9825 <e240> <e27e> 9919 <e2a1> <e2fe> 9982 <e340> <e37e> 10076 <e3a1> <e3fe> 10139 <e440> <e47e> 10233 <e4a1> <e4fe> 10296 <e540> <e57e> 10390 <e5a1> <e5fe> 10453 <e640> <e67e> 10547 <e6a1> <e6fe> 10610 <e740> <e77e> 10704 <e7a1> <e7fe> 10767 <e840> <e87e> 10861 <e8a1> <e8a2> 10924 <e8a3> <e8fe> 10927 <e940> <e975> 11019 <e976> <e97e> 11074 <e9a1> <e9fe> 11083 <ea40> <ea7e> 11177 <eaa1> <eafe> 11240 <eb40> <eb5a> 11334 <eb5b> <eb7e> 11362 <eba1> <ebf0> 11398 <ebf1> <ebf1> 10926 <ebf2> <ebfe> 11478 <ec40> <ec7e> 11491 <eca1> <ecdd> 11554 endcidrange 100 begincidrange <ecde> <ecde> 11073 <ecdf> <ecfe> 11615 <ed40> <ed7e> 11647 <eda1> <eda9> 11710 <edaa> <edfe> 11720 <ee40> <ee7e> 11805 <eea1> <eeea> 11868 <eeeb> <eeeb> 12308 <eeec> <eefe> 11942 <ef40> <ef7e> 11961 <efa1> <effe> 12024 <f040> <f055> 12118 <f056> <f056> 11719 <f057> <f07e> 12140 <f0a1> <f0ca> 12180 <f0cb> <f0cb> 11361 <f0cc> <f0fe> 12222 <f140> <f162> 12273 <f163> <f16a> 12309 <f16b> <f16b> 12640 <f16c> <f17e> 12317 <f1a1> <f1fe> 12336 <f240> <f267> 12430 <f268> <f268> 12783 <f269> <f27e> 12470 <f2a1> <f2c2> 12492 <f2c3> <f2fe> 12527 <f340> <f374> 12587 <f375> <f37e> 12641 <f3a1> <f3fe> 12651 <f440> <f465> 12745 <f466> <f47e> 12784 <f4a1> <f4b4> 12809 <f4b5> <f4b5> 12526 <f4b6> <f4fc> 12829 <f4fd> <f4fe> 12901 <f540> <f57e> 12903 <f5a1> <f5fe> 12966 <f640> <f662> 13060 <f663> <f663> 12900 <f664> <f67e> 13095 <f6a1> <f6fe> 13122 <f740> <f77e> 13216 <f7a1> <f7fe> 13279 <f840> <f87e> 13373 <f8a1> <f8fe> 13436 <f940> <f976> 13530 <f977> <f97e> 13586 <f9a1> <f9c3> 13594 <f9c4> <f9c4> 13585 <f9c5> <f9c5> 13629 <f9c6> <f9c6> 13641 <f9c7> <f9d1> 13630 <f9d2> <f9d5> 13642 <f9d6> <f9fe> 14056 <fa40> <fa5e> 16395 <fa60> <fa65> 16427 <fa67> <fa7e> 16434 <faa1> <faa8> 16458 <faa9> <faaa> 18758 <faab> <fabc> 16468 <fabe> <fac4> 16487 <fac6> <fad4> 16495 <fad6> <fafe> 16511 <fb40> <fb47> 16552 <fb49> <fb52> 16561 <fb53> <fb53> 18760 <fb54> <fb6d> 16572 <fb6e> <fb6e> 18761 <fb6f> <fb7e> 16599 <fba1> <fba2> 16615 <fba3> <fba3> 18762 <fba4> <fbb7> 16618 <fbb9> <fbbe> 16639 <fbbf> <fbbf> 18763 <fbc0> <fbcc> 16645 <fbcd> <fbcd> 18764 <fbce> <fbf2> 16658 <fbf4> <fbf8> 16696 <fbfa> <fbfe> 16702 <fc40> <fc49> 16707 <fc4a> <fc4a> 18765 <fc4b> <fc4e> 16717 <fc50> <fc51> 16721 <fc52> <fc52> 18766 <fc53> <fc62> 16723 <fc63> <fc63> 18767 <fc64> <fc6b> 16739 <fc6d> <fc6d> 18768 <fc6e> <fc74> 16749 <fc75> <fc75> 18769 <fc76> <fc7e> 16756 <fca1> <fcb8> 16765 <fcba> <fcbb> 16789 <fcbc> <fcbd> 18770 <fcbe> <fccb> 16792 <fccc> <fccc> 18772 <fccd> <fce1> 16807 <fce3> <fce3> 18773 <fce4> <fced> 16829 endcidrange 28 begincidrange <fcee> <fcee> 18774 <fcef> <fcf0> 16839 <fcf2> <fcfe> 16842 <fd40> <fd48> 16855 <fd49> <fd49> 18775 <fd4a> <fd69> 16864 <fd6a> <fd6a> 18776 <fd6b> <fd7e> 16897 <fda1> <fdb6> 16917 <fdb9> <fdba> 16941 <fdbc> <fde2> 16944 <fde3> <fde3> 18777 <fde4> <fdf0> 16984 <fdf2> <fdf2> 18778 <fdf3> <fdfe> 16998 <fe40> <fe51> 17010 <fe53> <fe6c> 17029 <fe6d> <fe6d> 18779 <fe6e> <fe6e> 17055 <fe70> <fe77> 17057 <fe78> <fe78> 18780 <fe79> <fe7e> 17065 <fea1> <fea9> 17071 <feab> <fedc> 17080 <fede> <fedf> 18781 <fee0> <feec> 17131 <feed> <feee> 18783 <feef> <fefe> 17144 endcidrange endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF \ No newline at end of file
diff --git a/src/main/resources/Resources/cmap/HKscs-B5-V b/src/main/resources/Resources/cmap/HKscs-B5-V
new file mode 100644
index 0000000..dcc084d
--- /dev/null
+++ b/src/main/resources/Resources/cmap/HKscs-B5-V
@@ -0,0 +1 @@
+%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%DocumentNeededResources: CMap (HKscs-B5-H) %%IncludeResource: ProcSet (CIDInit) %%IncludeResource: CMap (HKscs-B5-H) %%BeginResource: CMap (HKscs-B5-V) %%Title: (HKscs-B5-V Adobe CNS1 0) %%Version: 1.001 %%Copyright: ----------------------------------------------------------- %%Copyright: Copyright 1990-2000 Adobe Systems Incorporated. %%Copyright: All Rights Reserved. %%Copyright: %%Copyright: Patents Pending %%Copyright: %%Copyright: NOTICE: All information contained herein is the property %%Copyright: of Adobe Systems Incorporated. %%Copyright: %%Copyright: Permission is granted for redistribution of this file %%Copyright: provided this copyright notice is maintained intact and %%Copyright: that the contents of this file are not altered in any %%Copyright: way from its original form. %%Copyright: %%Copyright: PostScript and Display PostScript are trademarks of %%Copyright: Adobe Systems Incorporated which may be registered in %%Copyright: certain jurisdictions. %%Copyright: ----------------------------------------------------------- %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /HKscs-B5-H usecmap /CIDSystemInfo 3 dict dup begin /Registry (Adobe) def /Ordering (CNS1) def /Supplement 0 def end def /CMapName /HKscs-B5-V def /CMapVersion 1.001 def /CMapType 1 def /XUID [1 10 25581] def /WMode 1 def 13 begincidrange <a14b> <a14b> 13646 <a15a> <a15a> 13743 <a15c> <a15c> 13745 <a15d> <a15e> 130 <a161> <a162> 134 <a165> <a166> 138 <a169> <a16a> 142 <a16d> <a16e> 146 <a171> <a172> 150 <a175> <a176> 154 <a179> <a17a> 158 <a1e3> <a1e3> 13647 <c6e4> <c6e5> 14097 endcidrange endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF \ No newline at end of file
diff --git a/src/main/resources/Resources/cmap/Hankaku b/src/main/resources/Resources/cmap/Hankaku
new file mode 100644
index 0000000..7f09a5f
--- /dev/null
+++ b/src/main/resources/Resources/cmap/Hankaku
@@ -0,0 +1,70 @@
+%!PS-Adobe-3.0 Resource-CMap
+%%DocumentNeededResources: ProcSet (CIDInit)
+%%IncludeResource: ProcSet (CIDInit)
+%%BeginResource: CMap (Hankaku)
+%%Title: (Hankaku Adobe Japan1 0)
+%%Version: 6.001
+%%Copyright: -----------------------------------------------------------
+%%Copyright: Copyright 1990-1997 Adobe Systems Incorporated.
+%%Copyright: All Rights Reserved.
+%%Copyright:
+%%Copyright: Patents Pending
+%%Copyright:
+%%Copyright: NOTICE: All information contained herein is the property
+%%Copyright: of Adobe Systems Incorporated.
+%%Copyright:
+%%Copyright: Permission is granted for redistribution of this file
+%%Copyright: provided this copyright notice is maintained intact and
+%%Copyright: that the contents of this file are not altered in any
+%%Copyright: way from its original form.
+%%Copyright:
+%%Copyright: PostScript and Display PostScript are trademarks of
+%%Copyright: Adobe Systems Incorporated which may be registered in
+%%Copyright: certain jurisdictions.
+%%Copyright: -----------------------------------------------------------
+%%EndComments
+
+/CIDInit /ProcSet findresource begin
+
+12 dict begin
+
+begincmap
+
+/CIDSystemInfo 3 dict dup begin
+ /Registry (Adobe) def
+ /Ordering (Japan1) def
+ /Supplement 0 def
+end def
+
+/CMapName /Hankaku def
+/CMapVersion 6.001 def
+/CMapType 1 def
+
+/UIDOffset 860 def
+/XUID [1 10 25348] def
+
+/WMode 0 def
+
+1 begincodespacerange
+ <00> <FF>
+endcodespacerange
+
+10 begincidrange
+<20> <5f> 231
+<60> <60> 231
+<61> <7e> 296
+<81> <85> 327
+<86> <8f> 516
+<90> <90> 342
+<91> <9f> 526
+<a1> <df> 327
+<e0> <fd> 541
+<fe> <ff> 388
+endcidrange
+endcmap
+CMapName currentdict /CMap defineresource pop
+end
+end
+
+%%EndResource
+%%EOF
diff --git a/src/main/resources/Resources/cmap/Hiragana b/src/main/resources/Resources/cmap/Hiragana
new file mode 100644
index 0000000..af3ccba
--- /dev/null
+++ b/src/main/resources/Resources/cmap/Hiragana
@@ -0,0 +1,68 @@
+%!PS-Adobe-3.0 Resource-CMap
+%%DocumentNeededResources: ProcSet (CIDInit)
+%%IncludeResource: ProcSet (CIDInit)
+%%BeginResource: CMap (Hiragana)
+%%Title: (Hiragana Adobe Japan1 0)
+%%Version: 6.001
+%%Copyright: -----------------------------------------------------------
+%%Copyright: Copyright 1990-1997 Adobe Systems Incorporated.
+%%Copyright: All Rights Reserved.
+%%Copyright:
+%%Copyright: Patents Pending
+%%Copyright:
+%%Copyright: NOTICE: All information contained herein is the property
+%%Copyright: of Adobe Systems Incorporated.
+%%Copyright:
+%%Copyright: Permission is granted for redistribution of this file
+%%Copyright: provided this copyright notice is maintained intact and
+%%Copyright: that the contents of this file are not altered in any
+%%Copyright: way from its original form.
+%%Copyright:
+%%Copyright: PostScript and Display PostScript are trademarks of
+%%Copyright: Adobe Systems Incorporated which may be registered in
+%%Copyright: certain jurisdictions.
+%%Copyright: -----------------------------------------------------------
+%%EndComments
+
+/CIDInit /ProcSet findresource begin
+
+12 dict begin
+
+begincmap
+
+/CIDSystemInfo 3 dict dup begin
+ /Registry (Adobe) def
+ /Ordering (Japan1) def
+ /Supplement 0 def
+end def
+
+/CMapName /Hiragana def
+/CMapVersion 6.001 def
+/CMapType 1 def
+
+/UIDOffset 862 def
+/XUID [1 10 25349] def
+
+/WMode 0 def
+
+1 begincodespacerange
+ <00> <FF>
+endcodespacerange
+
+8 begincidrange
+<20> <20> 515
+<21> <25> 327
+<26> <2f> 516
+<30> <30> 342
+<31> <5d> 526
+<5e> <5f> 388
+<60> <62> 571
+<66> <7e> 574
+endcidrange
+endcmap
+CMapName currentdict /CMap defineresource pop
+end
+end
+
+%%EndResource
+%%EOF
diff --git a/src/main/resources/Resources/cmap/Identity-H b/src/main/resources/Resources/cmap/Identity-H
new file mode 100644
index 0000000..d314f97
--- /dev/null
+++ b/src/main/resources/Resources/cmap/Identity-H
@@ -0,0 +1,316 @@
+%!PS-Adobe-3.0 Resource-CMap
+%%DocumentNeededResources: ProcSet (CIDInit)
+%%IncludeResource: ProcSet (CIDInit)
+%%BeginResource: CMap (Identity-H)
+%%Title: (Identity-H Adobe Identity 0)
+%%Version: 10.001
+%%Copyright: -----------------------------------------------------------
+%%Copyright: Copyright 1990-2000 Adobe Systems Incorporated.
+%%Copyright: All Rights Reserved.
+%%Copyright:
+%%Copyright: Patents Pending
+%%Copyright:
+%%Copyright: NOTICE: All information contained herein is the property
+%%Copyright: of Adobe Systems Incorporated.
+%%Copyright:
+%%Copyright: PostScript and Display PostScript are trademarks of
+%%Copyright: Adobe Systems Incorporated which may be registered in
+%%Copyright: certain jurisdictions.
+%%Copyright: -----------------------------------------------------------
+%%EndComments
+
+/CIDInit /ProcSet findresource begin
+
+12 dict begin
+
+begincmap
+
+/CIDSystemInfo 3 dict dup begin
+ /Registry (Adobe) def
+ /Ordering (Identity) def
+ /Supplement 0 def
+end def
+
+/CMapName /Identity-H def
+/CMapVersion 10.001 def
+/CMapType 1 def
+
+/XUID [1 10 25404 9999] def
+
+/WMode 0 def
+
+1 begincodespacerange
+ <0000> <FFFF>
+endcodespacerange
+
+100 begincidrange
+<0000> <00ff> 0
+<0100> <01ff> 256
+<0200> <02ff> 512
+<0300> <03ff> 768
+<0400> <04ff> 1024
+<0500> <05ff> 1280
+<0600> <06ff> 1536
+<0700> <07ff> 1792
+<0800> <08ff> 2048
+<0900> <09ff> 2304
+<0a00> <0aff> 2560
+<0b00> <0bff> 2816
+<0c00> <0cff> 3072
+<0d00> <0dff> 3328
+<0e00> <0eff> 3584
+<0f00> <0fff> 3840
+<1000> <10ff> 4096
+<1100> <11ff> 4352
+<1200> <12ff> 4608
+<1300> <13ff> 4864
+<1400> <14ff> 5120
+<1500> <15ff> 5376
+<1600> <16ff> 5632
+<1700> <17ff> 5888
+<1800> <18ff> 6144
+<1900> <19ff> 6400
+<1a00> <1aff> 6656
+<1b00> <1bff> 6912
+<1c00> <1cff> 7168
+<1d00> <1dff> 7424
+<1e00> <1eff> 7680
+<1f00> <1fff> 7936
+<2000> <20ff> 8192
+<2100> <21ff> 8448
+<2200> <22ff> 8704
+<2300> <23ff> 8960
+<2400> <24ff> 9216
+<2500> <25ff> 9472
+<2600> <26ff> 9728
+<2700> <27ff> 9984
+<2800> <28ff> 10240
+<2900> <29ff> 10496
+<2a00> <2aff> 10752
+<2b00> <2bff> 11008
+<2c00> <2cff> 11264
+<2d00> <2dff> 11520
+<2e00> <2eff> 11776
+<2f00> <2fff> 12032
+<3000> <30ff> 12288
+<3100> <31ff> 12544
+<3200> <32ff> 12800
+<3300> <33ff> 13056
+<3400> <34ff> 13312
+<3500> <35ff> 13568
+<3600> <36ff> 13824
+<3700> <37ff> 14080
+<3800> <38ff> 14336
+<3900> <39ff> 14592
+<3a00> <3aff> 14848
+<3b00> <3bff> 15104
+<3c00> <3cff> 15360
+<3d00> <3dff> 15616
+<3e00> <3eff> 15872
+<3f00> <3fff> 16128
+<4000> <40ff> 16384
+<4100> <41ff> 16640
+<4200> <42ff> 16896
+<4300> <43ff> 17152
+<4400> <44ff> 17408
+<4500> <45ff> 17664
+<4600> <46ff> 17920
+<4700> <47ff> 18176
+<4800> <48ff> 18432
+<4900> <49ff> 18688
+<4a00> <4aff> 18944
+<4b00> <4bff> 19200
+<4c00> <4cff> 19456
+<4d00> <4dff> 19712
+<4e00> <4eff> 19968
+<4f00> <4fff> 20224
+<5000> <50ff> 20480
+<5100> <51ff> 20736
+<5200> <52ff> 20992
+<5300> <53ff> 21248
+<5400> <54ff> 21504
+<5500> <55ff> 21760
+<5600> <56ff> 22016
+<5700> <57ff> 22272
+<5800> <58ff> 22528
+<5900> <59ff> 22784
+<5a00> <5aff> 23040
+<5b00> <5bff> 23296
+<5c00> <5cff> 23552
+<5d00> <5dff> 23808
+<5e00> <5eff> 24064
+<5f00> <5fff> 24320
+<6000> <60ff> 24576
+<6100> <61ff> 24832
+<6200> <62ff> 25088
+<6300> <63ff> 25344
+endcidrange
+
+100 begincidrange
+<6400> <64ff> 25600
+<6500> <65ff> 25856
+<6600> <66ff> 26112
+<6700> <67ff> 26368
+<6800> <68ff> 26624
+<6900> <69ff> 26880
+<6a00> <6aff> 27136
+<6b00> <6bff> 27392
+<6c00> <6cff> 27648
+<6d00> <6dff> 27904
+<6e00> <6eff> 28160
+<6f00> <6fff> 28416
+<7000> <70ff> 28672
+<7100> <71ff> 28928
+<7200> <72ff> 29184
+<7300> <73ff> 29440
+<7400> <74ff> 29696
+<7500> <75ff> 29952
+<7600> <76ff> 30208
+<7700> <77ff> 30464
+<7800> <78ff> 30720
+<7900> <79ff> 30976
+<7a00> <7aff> 31232
+<7b00> <7bff> 31488
+<7c00> <7cff> 31744
+<7d00> <7dff> 32000
+<7e00> <7eff> 32256
+<7f00> <7fff> 32512
+<8000> <80ff> 32768
+<8100> <81ff> 33024
+<8200> <82ff> 33280
+<8300> <83ff> 33536
+<8400> <84ff> 33792
+<8500> <85ff> 34048
+<8600> <86ff> 34304
+<8700> <87ff> 34560
+<8800> <88ff> 34816
+<8900> <89ff> 35072
+<8a00> <8aff> 35328
+<8b00> <8bff> 35584
+<8c00> <8cff> 35840
+<8d00> <8dff> 36096
+<8e00> <8eff> 36352
+<8f00> <8fff> 36608
+<9000> <90ff> 36864
+<9100> <91ff> 37120
+<9200> <92ff> 37376
+<9300> <93ff> 37632
+<9400> <94ff> 37888
+<9500> <95ff> 38144
+<9600> <96ff> 38400
+<9700> <97ff> 38656
+<9800> <98ff> 38912
+<9900> <99ff> 39168
+<9a00> <9aff> 39424
+<9b00> <9bff> 39680
+<9c00> <9cff> 39936
+<9d00> <9dff> 40192
+<9e00> <9eff> 40448
+<9f00> <9fff> 40704
+<a000> <a0ff> 40960
+<a100> <a1ff> 41216
+<a200> <a2ff> 41472
+<a300> <a3ff> 41728
+<a400> <a4ff> 41984
+<a500> <a5ff> 42240
+<a600> <a6ff> 42496
+<a700> <a7ff> 42752
+<a800> <a8ff> 43008
+<a900> <a9ff> 43264
+<aa00> <aaff> 43520
+<ab00> <abff> 43776
+<ac00> <acff> 44032
+<ad00> <adff> 44288
+<ae00> <aeff> 44544
+<af00> <afff> 44800
+<b000> <b0ff> 45056
+<b100> <b1ff> 45312
+<b200> <b2ff> 45568
+<b300> <b3ff> 45824
+<b400> <b4ff> 46080
+<b500> <b5ff> 46336
+<b600> <b6ff> 46592
+<b700> <b7ff> 46848
+<b800> <b8ff> 47104
+<b900> <b9ff> 47360
+<ba00> <baff> 47616
+<bb00> <bbff> 47872
+<bc00> <bcff> 48128
+<bd00> <bdff> 48384
+<be00> <beff> 48640
+<bf00> <bfff> 48896
+<c000> <c0ff> 49152
+<c100> <c1ff> 49408
+<c200> <c2ff> 49664
+<c300> <c3ff> 49920
+<c400> <c4ff> 50176
+<c500> <c5ff> 50432
+<c600> <c6ff> 50688
+<c700> <c7ff> 50944
+endcidrange
+
+56 begincidrange
+<c800> <c8ff> 51200
+<c900> <c9ff> 51456
+<ca00> <caff> 51712
+<cb00> <cbff> 51968
+<cc00> <ccff> 52224
+<cd00> <cdff> 52480
+<ce00> <ceff> 52736
+<cf00> <cfff> 52992
+<d000> <d0ff> 53248
+<d100> <d1ff> 53504
+<d200> <d2ff> 53760
+<d300> <d3ff> 54016
+<d400> <d4ff> 54272
+<d500> <d5ff> 54528
+<d600> <d6ff> 54784
+<d700> <d7ff> 55040
+<d800> <d8ff> 55296
+<d900> <d9ff> 55552
+<da00> <daff> 55808
+<db00> <dbff> 56064
+<dc00> <dcff> 56320
+<dd00> <ddff> 56576
+<de00> <deff> 56832
+<df00> <dfff> 57088
+<e000> <e0ff> 57344
+<e100> <e1ff> 57600
+<e200> <e2ff> 57856
+<e300> <e3ff> 58112
+<e400> <e4ff> 58368
+<e500> <e5ff> 58624
+<e600> <e6ff> 58880
+<e700> <e7ff> 59136
+<e800> <e8ff> 59392
+<e900> <e9ff> 59648
+<ea00> <eaff> 59904
+<eb00> <ebff> 60160
+<ec00> <ecff> 60416
+<ed00> <edff> 60672
+<ee00> <eeff> 60928
+<ef00> <efff> 61184
+<f000> <f0ff> 61440
+<f100> <f1ff> 61696
+<f200> <f2ff> 61952
+<f300> <f3ff> 62208
+<f400> <f4ff> 62464
+<f500> <f5ff> 62720
+<f600> <f6ff> 62976
+<f700> <f7ff> 63232
+<f800> <f8ff> 63488
+<f900> <f9ff> 63744
+<fa00> <faff> 64000
+<fb00> <fbff> 64256
+<fc00> <fcff> 64512
+<fd00> <fdff> 64768
+<fe00> <feff> 65024
+<ff00> <ffff> 65280
+endcidrange
+endcmap
+CMapName currentdict /CMap defineresource pop
+end
+end
+
+%%EndResource
+%%EOF
diff --git a/src/main/resources/Resources/cmap/Identity-V b/src/main/resources/Resources/cmap/Identity-V
new file mode 100644
index 0000000..da5ecb1
--- /dev/null
+++ b/src/main/resources/Resources/cmap/Identity-V
@@ -0,0 +1,50 @@
+%!PS-Adobe-3.0 Resource-CMap
+%%DocumentNeededResources: ProcSet (CIDInit)
+%%IncludeResource: ProcSet (CIDInit)
+%%BeginResource: CMap (Identity-V)
+%%Title: (Identity-V Adobe Identity 0)
+%%Version: 10.001
+%%Copyright: -----------------------------------------------------------
+%%Copyright: Copyright 1990-2000 Adobe Systems Incorporated.
+%%Copyright: All Rights Reserved.
+%%Copyright:
+%%Copyright: Patents Pending
+%%Copyright:
+%%Copyright: NOTICE: All information contained herein is the property
+%%Copyright: of Adobe Systems Incorporated.
+%%Copyright:
+%%Copyright: PostScript and Display PostScript are trademarks of
+%%Copyright: Adobe Systems Incorporated which may be registered in
+%%Copyright: certain jurisdictions.
+%%Copyright: -----------------------------------------------------------
+%%EndComments
+
+/CIDInit /ProcSet findresource begin
+
+12 dict begin
+
+begincmap
+
+/CIDSystemInfo 3 dict dup begin
+ /Registry (Adobe) def
+ /Ordering (Identity) def
+ /Supplement 0 def
+end def
+
+/CMapName /Identity-V def
+/CMapVersion 10.001 def
+/CMapType 1 def
+
+/XUID [1 10 25404 9991] def
+
+/WMode 1 def
+
+/Identity-H usecmap
+
+endcmap
+CMapName currentdict /CMap defineresource pop
+end
+end
+
+%%EndResource
+%%EOF
diff --git a/src/main/resources/Resources/cmap/KSC-EUC-H b/src/main/resources/Resources/cmap/KSC-EUC-H
new file mode 100644
index 0000000..8ea46b1
--- /dev/null
+++ b/src/main/resources/Resources/cmap/KSC-EUC-H
@@ -0,0 +1 @@
+%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%IncludeResource: ProcSet (CIDInit) %%BeginResource: CMap (KSC-EUC-H) %%Title: (KSC-EUC-H Adobe Korea1 0) %%Version: 9.001 %%Copyright: ----------------------------------------------------------- %%Copyright: Copyright 1990-1998 Adobe Systems Incorporated. %%Copyright: All Rights Reserved. %%Copyright: %%Copyright: Patents Pending %%Copyright: %%Copyright: NOTICE: All information contained herein is the property %%Copyright: of Adobe Systems Incorporated. %%Copyright: %%Copyright: Permission is granted for redistribution of this file %%Copyright: provided this copyright notice is maintained intact and %%Copyright: that the contents of this file are not altered in any %%Copyright: way from its original form. %%Copyright: %%Copyright: PostScript and Display PostScript are trademarks of %%Copyright: Adobe Systems Incorporated which may be registered in %%Copyright: certain jurisdictions. %%Copyright: ----------------------------------------------------------- %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo 3 dict dup begin /Registry (Adobe) def /Ordering (Korea1) def /Supplement 0 def end def /CMapName /KSC-EUC-H def /CMapVersion 9.001 def /CMapType 1 def /UIDOffset 100 def /XUID [1 10 25400] def /WMode 0 def 2 begincodespacerange <00> <80> <A1A1> <FEFE> endcodespacerange 1 beginnotdefrange <00> <1f> 8094 endnotdefrange 100 begincidrange <20> <7e> 8094 <a1a1> <a1fe> 101 <a2a1> <a2e5> 195 <a3a1> <a3fe> 264 <a4a1> <a4d3> 358 <a4d5> <a4fe> 409 <a5a1> <a5aa> 451 <a5b0> <a5b9> 461 <a5c1> <a5d8> 471 <a5e1> <a5f8> 495 <a6a1> <a6e4> 519 <a7a1> <a7ef> 587 <a8a1> <a8a4> 666 <a8a6> <a8a6> 670 <a8a8> <a8af> 671 <a8b1> <a8fe> 679 <a9a1> <a9fe> 757 <aaa1> <aaf3> 851 <aba1> <abf6> 934 <aca1> <acc1> 1020 <acd1> <acf1> 1053 <b0a1> <b0fe> 1086 <b1a1> <b1fe> 1180 <b2a1> <b2fe> 1274 <b3a1> <b3fe> 1368 <b4a1> <b4fe> 1462 <b5a1> <b5fe> 1556 <b6a1> <b6fe> 1650 <b7a1> <b7fe> 1744 <b8a1> <b8fe> 1838 <b9a1> <b9fe> 1932 <baa1> <bafe> 2026 <bba1> <bbfe> 2120 <bca1> <bcfe> 2214 <bda1> <bdfe> 2308 <bea1> <befe> 2402 <bfa1> <bffe> 2496 <c0a1> <c0fe> 2590 <c1a1> <c1fe> 2684 <c2a1> <c2fe> 2778 <c3a1> <c3fe> 2872 <c4a1> <c4fe> 2966 <c5a1> <c5fe> 3060 <c6a1> <c6fe> 3154 <c7a1> <c7fe> 3248 <c8a1> <c8fe> 3342 <caa1> <cafe> 3436 <cba1> <cbcf> 3530 <cbd0> <cbd0> 4116 <cbd1> <cbd5> 3577 <cbd6> <cbd6> 3678 <cbd7> <cbe6> 3582 <cbe7> <cbe7> 7053 <cbe8> <cbfe> 3598 <cca1> <ccfe> 3621 <cda1> <cdce> 3715 <cdcf> <cdcf> 3460 <cdd0> <cde7> 3761 <cde8> <cde8> 7900 <cde9> <cdfe> 3785 <cea1> <ceac> 3807 <cead> <cead> 3802 <ceae> <cefe> 3819 <cfa1> <cffa> 3900 <cffb> <cffb> 3902 <cffc> <cffe> 3990 <d0a1> <d0a1> 3993 <d0a2> <d0a2> 3946 <d0a3> <d0b7> 3994 <d0b8> <d0b8> 3946 <d0b9> <d0cf> 4015 <d0d0> <d0d0> 3708 <d0d1> <d0dc> 4038 <d0dd> <d0dd> 4131 <d0de> <d0fe> 4050 <d1a1> <d1d3> 4083 <d1d4> <d1d4> 4374 <d1d5> <d1d5> 4156 <d1d6> <d1d7> 4134 <d1d8> <d1d8> 4375 <d1d9> <d1da> 4136 <d1db> <d1e0> 4376 <d1e1> <d1e1> 4138 <d1e2> <d1e2> 5800 <d1e3> <d1e5> 4382 <d1e6> <d1e6> 4386 <d1e7> <d1e7> 4139 <d1e8> <d1eb> 4387 <d1ec> <d1ec> 4140 <d1ed> <d1ed> 4391 <d1ee> <d1ee> 4141 <d1ef> <d1f0> 4394 <d1f1> <d1f1> 4142 <d1f2> <d1f2> 4396 <d1f3> <d1f5> 4143 <d1f6> <d1f6> 4399 <d1f7> <d1f9> 4146 <d1fa> <d1fa> 4403 <d1fb> <d1fb> 4149 <d1fc> <d1fd> 4406 endcidrange 100 begincidrange <d1fe> <d1fe> 4409 <d2a1> <d2a1> 4150 <d2a2> <d2a3> 4410 <d2a4> <d2a6> 4151 <d2a7> <d2aa> 4412 <d2ab> <d2ab> 4419 <d2ac> <d2ac> 4154 <d2ad> <d2ad> 4420 <d2ae> <d2b1> 4155 <d2b2> <d2b2> 4424 <d2b3> <d2bd> 4159 <d2be> <d2be> 4511 <d2bf> <d2c1> 4170 <d2c2> <d2c3> 4513 <d2c4> <d2c4> 4517 <d2c5> <d2c5> 4173 <d2c6> <d2ca> 4518 <d2cb> <d2cb> 4524 <d2cc> <d2cc> 4174 <d2cd> <d2ce> 4525 <d2cf> <d2d4> 4528 <d2d5> <d2d7> 4535 <d2d8> <d2d8> 4175 <d2d9> <d2da> 4541 <d2db> <d2dd> 4176 <d2de> <d2df> 4545 <d2e0> <d2e0> 4179 <d2e1> <d2e1> 4547 <d2e2> <d2e2> 4550 <d2e3> <d2e3> 4180 <d2e4> <d2e4> 4564 <d2e5> <d2e8> 4566 <d2e9> <d2ea> 4571 <d2eb> <d2eb> 4576 <d2ec> <d2ef> 4181 <d2f0> <d2f3> 4604 <d2f4> <d2f5> 4609 <d2f6> <d2f6> 4185 <d2f7> <d2f8> 4611 <d2f9> <d2fe> 4186 <d3a1> <d3fe> 4192 <d4a1> <d4e5> 4286 <d4e6> <d4e6> 4318 <d4e7> <d4fb> 4355 <d4fc> <d4fc> 4136 <d4fd> <d4fe> 4376 <d5a1> <d5a4> 4378 <d5a5> <d5a5> 5800 <d5a6> <d5aa> 4382 <d5ab> <d5ab> 4139 <d5ac> <d5ad> 4387 <d5ae> <d5ae> 4192 <d5af> <d5fe> 4389 <d6a1> <d6b7> 4469 <d6b8> <d6b8> 4167 <d6b9> <d6cc> 4492 <d6cd> <d6cd> 4172 <d6ce> <d6fe> 4512 <d7a1> <d7ca> 4561 <d7cb> <d7cb> 5552 <d7cc> <d7e3> 4603 <d7e4> <d7e4> 6424 <d7e5> <d7fe> 4627 <d8a1> <d8fe> 4653 <d9a1> <d9fe> 4747 <daa1> <dafe> 4841 <dba1> <dbc4> 4935 <dbc5> <dbc5> 5151 <dbc6> <dbe3> 4971 <dbe4> <dbe4> 4922 <dbe5> <dbfe> 5001 <dca1> <dca4> 5027 <dca5> <dca5> 7518 <dca6> <dcfe> 5031 <dda1> <dda4> 5120 <dda5> <dda5> 5079 <dda6> <ddd4> 5124 <ddd5> <ddd5> 5109 <ddd6> <ddf3> 5171 <ddf4> <ddf4> 7607 <ddf5> <ddfe> 5201 <dea1> <defb> 5211 <defc> <defc> 5584 <defd> <defd> 5302 <defe> <defe> 5367 <dfa1> <dfb2> 5303 <dfb3> <dfb3> 7083 <dfb4> <dfe0> 5321 <dfe1> <dfe1> 5362 <dfe2> <dfe7> 5366 <dfe8> <dfe8> 5485 <dfe9> <dffe> 5372 <e0a1> <e0f0> 5394 <e0f1> <e0f1> 6001 <e0f2> <e0fe> 5474 <e1a1> <e1ac> 5487 <e1ad> <e1ad> 5460 <e1ae> <e1ec> 5499 <e1ed> <e1ed> 5317 <e1ee> <e1fe> 5562 endcidrange 100 begincidrange <e2a1> <e2fe> 5579 <e3a1> <e3f4> 5673 <e3f5> <e3f5> 7009 <e3f6> <e3fe> 5757 <e4a1> <e4a1> 7370 <e4a2> <e4a8> 5766 <e4a9> <e4a9> 5678 <e4aa> <e4fe> 5773 <e5a1> <e5ad> 5858 <e5ae> <e5ae> 5874 <e5af> <e5b0> 5871 <e5b1> <e5b2> 4425 <e5b3> <e5b8> 5873 <e5b9> <e5b9> 4427 <e5ba> <e5ba> 5879 <e5bb> <e5bc> 4429 <e5bd> <e5c3> 5880 <e5c4> <e5c4> 4431 <e5c5> <e5cd> 5887 <e5ce> <e5ce> 4435 <e5cf> <e5cf> 5896 <e5d0> <e5d0> 4436 <e5d1> <e5d1> 5897 <e5d2> <e5d2> 4437 <e5d3> <e5d5> 5898 <e5d6> <e5d6> 4439 <e5d7> <e5f9> 5901 <e5fa> <e5fb> 4442 <e5fc> <e5fc> 4159 <e5fd> <e5fd> 5936 <e5fe> <e5fe> 4444 <e6a1> <e6a1> 4447 <e6a2> <e6a3> 5937 <e6a4> <e6a4> 4449 <e6a5> <e6a6> 5939 <e6a7> <e6a7> 4450 <e6a8> <e6ac> 5941 <e6ad> <e6ad> 4453 <e6ae> <e6ae> 5946 <e6af> <e6b1> 4455 <e6b2> <e6b2> 5947 <e6b3> <e6b3> 4458 <e6b4> <e6b6> 5948 <e6b7> <e6b8> 4459 <e6b9> <e6bb> 5951 <e6bc> <e6bc> 4463 <e6bd> <e6c3> 5954 <e6c4> <e6c4> 4160 <e6c5> <e6c5> 5961 <e6c6> <e6c7> 4465 <e6c8> <e6c9> 5962 <e6ca> <e6ca> 4161 <e6cb> <e6d1> 5964 <e6d2> <e6d2> 4468 <e6d3> <e6d5> 5971 <e6d6> <e6d6> 4469 <e6d7> <e6d8> 5974 <e6d9> <e6d9> 4470 <e6da> <e6db> 5976 <e6dc> <e6dc> 4162 <e6dd> <e6de> 5978 <e6df> <e6df> 4471 <e6e0> <e6e0> 5980 <e6e1> <e6e1> 4472 <e6e2> <e6e3> 5981 <e6e4> <e6e4> 4474 <e6e5> <e6e5> 4473 <e6e6> <e6e6> 4475 <e6e7> <e6e7> 5983 <e6e8> <e6e8> 4476 <e6e9> <e6e9> 5984 <e6ea> <e6eb> 4478 <e6ec> <e6ec> 6447 <e6ed> <e6ee> 5985 <e6ef> <e6ef> 4481 <e6f0> <e6f0> 5987 <e6f1> <e6f1> 4482 <e6f2> <e6f2> 5460 <e6f3> <e6f4> 5988 <e6f5> <e6f5> 4483 <e6f6> <e6f6> 4163 <e6f7> <e6f7> 4166 <e6f8> <e6f8> 5990 <e6f9> <e6f9> 4485 <e6fa> <e6fe> 5991 <e7a1> <e7a1> 4487 <e7a2> <e7a5> 5996 <e7a6> <e7a6> 4488 <e7a7> <e7a8> 6000 <e7a9> <e7a9> 4489 <e7aa> <e7aa> 4491 <e7ab> <e7ab> 6002 <e7ac> <e7ac> 4167 <e7ad> <e7ad> 4493 <e7ae> <e7af> 6003 <e7b0> <e7b0> 4494 <e7b1> <e7be> 6005 <e7bf> <e7bf> 4495 <e7c0> <e7c0> 6019 <e7c1> <e7c1> 7783 endcidrange 100 begincidrange <e7c2> <e7c5> 6020 <e7c6> <e7c6> 4497 <e7c7> <e7c7> 4499 <e7c8> <e7ca> 6024 <e7cb> <e7cb> 4501 <e7cc> <e7cc> 6027 <e7cd> <e7cd> 4502 <e7ce> <e7ce> 6028 <e7cf> <e7d0> 4503 <e7d1> <e7d2> 6029 <e7d3> <e7d3> 4506 <e7d4> <e7de> 6031 <e7df> <e7df> 4508 <e7e0> <e7e3> 6042 <e7e4> <e7e4> 4509 <e7e5> <e7e5> 6046 <e7e6> <e7e6> 4510 <e7e7> <e7f6> 6047 <e7f7> <e7f7> 5797 <e7f8> <e7fe> 6063 <e8a1> <e8e6> 6070 <e8e7> <e8e8> 4551 <e8e9> <e8ef> 6140 <e8f0> <e8f0> 4553 <e8f1> <e8f1> 4180 <e8f2> <e8f6> 6147 <e8f7> <e8f7> 4555 <e8f8> <e8f8> 6152 <e8f9> <e8f9> 5800 <e8fa> <e8fa> 6153 <e8fb> <e8fb> 4556 <e8fc> <e8fd> 6154 <e8fe> <e8fe> 4557 <e9a1> <e9a6> 6156 <e9a7> <e9a7> 4560 <e9a8> <e9ab> 6162 <e9ac> <e9ac> 4561 <e9ad> <e9cb> 6166 <e9cc> <e9cc> 4563 <e9cd> <e9f6> 6197 <e9f7> <e9f7> 7988 <e9f8> <e9fe> 6239 <eaa1> <eac0> 6246 <eac1> <eac1> 6123 <eac2> <eae4> 6278 <eae5> <eae5> 4577 <eae6> <eaf3> 6313 <eaf4> <eaf4> 4183 <eaf5> <eaf6> 6327 <eaf7> <eaf7> 4579 <eaf8> <eafb> 6329 <eafc> <eafc> 4581 <eafd> <eafd> 6333 <eafe> <eafe> 4582 <eba1> <eba3> 6334 <eba4> <eba4> 4584 <eba5> <eba6> 6337 <eba7> <eba7> 4586 <eba8> <eba8> 6339 <eba9> <eba9> 4588 <ebaa> <ebaa> 4184 <ebab> <ebb9> 6340 <ebba> <ebbb> 4590 <ebbc> <ebbc> 6355 <ebbd> <ebbd> 4592 <ebbe> <ebc0> 6356 <ebc1> <ebc1> 4593 <ebc2> <ebc2> 4595 <ebc3> <ebc5> 6359 <ebc6> <ebc7> 4596 <ebc8> <ebcb> 6362 <ebcc> <ebcc> 4599 <ebcd> <ebce> 6366 <ebcf> <ebd1> 4600 <ebd2> <ebd2> 5552 <ebd3> <ebd7> 6368 <ebd8> <ebd8> 4603 <ebd9> <ebfe> 6373 <eca1> <eca5> 6411 <eca6> <eca6> 4614 <eca7> <eca7> 4616 <eca8> <eca9> 6416 <ecaa> <ecaa> 4618 <ecab> <ecae> 6418 <ecaf> <ecaf> 5950 <ecb0> <ecb1> 4620 <ecb2> <ecb2> 4187 <ecb3> <ecb4> 6422 <ecb5> <ecb5> 4625 <ecb6> <ecb7> 6424 <ecb8> <ecb8> 4627 <ecb9> <ecb9> 6426 <ecba> <ecba> 4629 <ecbb> <ecbf> 6427 <ecc0> <ecc1> 4632 <ecc2> <ecc4> 6432 <ecc5> <ecc5> 4634 <ecc6> <ecc6> 4636 <ecc7> <ecc8> 6435 <ecc9> <ecca> 4188 endcidrange 67 begincidrange <eccb> <ecd4> 6437 <ecd5> <ecd5> 4638 <ecd6> <ecdc> 6447 <ecdd> <ecde> 4640 <ecdf> <ece0> 6454 <ece1> <ece1> 4642 <ece2> <ece3> 6456 <ece4> <ece4> 4644 <ece5> <ece6> 6458 <ece7> <ece8> 4645 <ece9> <ecf6> 6460 <ecf7> <ecf8> 4647 <ecf9> <ecf9> 6474 <ecfa> <ecfa> 4650 <ecfb> <ecfe> 6475 <eda1> <eda3> 4653 <eda4> <eded> 6479 <edee> <edee> 5351 <edef> <edfe> 6553 <eea1> <eeda> 6569 <eedb> <eedb> 6494 <eedc> <eefe> 6627 <efa1> <effe> 6662 <f0a1> <f0fe> 6756 <f1a1> <f1fe> 6850 <f2a1> <f2bc> 6944 <f2bd> <f2bd> 5731 <f2be> <f2f9> 6972 <f2fa> <f2fa> 5771 <f2fb> <f2fe> 7032 <f3a1> <f3b0> 7036 <f3b1> <f3b1> 4191 <f3b2> <f3fe> 7052 <f4a1> <f4a6> 7129 <f4a7> <f4a7> 6484 <f4a8> <f4ed> 7135 <f4ee> <f4ee> 6684 <f4ef> <f4fe> 7205 <f5a1> <f5fe> 7221 <f6a1> <f6f3> 7315 <f6f4> <f6f4> 4279 <f6f5> <f6f5> 7398 <f6f6> <f6f6> 7139 <f6f7> <f6fe> 7399 <f7a1> <f7b7> 7407 <f7b8> <f7b8> 4247 <f7b9> <f7c7> 7430 <f7c8> <f7c8> 4266 <f7c9> <f7d2> 7445 <f7d3> <f7d3> 4340 <f7d4> <f7fe> 7455 <f8a1> <f8da> 7498 <f8db> <f8db> 7572 <f8dc> <f8ef> 7556 <f8f0> <f8f0> 5088 <f8f1> <f8fe> 7576 <f9a1> <f9fe> 7590 <faa1> <faa1> 7709 <faa2> <faa2> 3558 <faa3> <fae5> 7684 <fae6> <fae6> 3644 <fae7> <fafe> 7751 <fba1> <fbfe> 7775 <fca1> <fca8> 7869 <fca9> <fca9> 3815 <fcaa> <fcfe> 7877 <fda1> <fdfe> 7962 endcidrange endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF \ No newline at end of file
diff --git a/src/main/resources/Resources/cmap/KSC-EUC-V b/src/main/resources/Resources/cmap/KSC-EUC-V
new file mode 100644
index 0000000..f5f3709
--- /dev/null
+++ b/src/main/resources/Resources/cmap/KSC-EUC-V
@@ -0,0 +1 @@
+%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%DocumentNeededResources: CMap (KSC-EUC-H) %%IncludeResource: ProcSet (CIDInit) %%IncludeResource: CMap (KSC-EUC-H) %%BeginResource: CMap (KSC-EUC-V) %%Title: (KSC-EUC-V Adobe Korea1 0) %%Version: 9.001 %%Copyright: ----------------------------------------------------------- %%Copyright: Copyright 1990-1998 Adobe Systems Incorporated. %%Copyright: All Rights Reserved. %%Copyright: %%Copyright: Patents Pending %%Copyright: %%Copyright: NOTICE: All information contained herein is the property %%Copyright: of Adobe Systems Incorporated. %%Copyright: %%Copyright: Permission is granted for redistribution of this file %%Copyright: provided this copyright notice is maintained intact and %%Copyright: that the contents of this file are not altered in any %%Copyright: way from its original form. %%Copyright: %%Copyright: PostScript and Display PostScript are trademarks of %%Copyright: Adobe Systems Incorporated which may be registered in %%Copyright: certain jurisdictions. %%Copyright: ----------------------------------------------------------- %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /KSC-EUC-H usecmap /CIDSystemInfo 3 dict dup begin /Registry (Adobe) def /Ordering (Korea1) def /Supplement 0 def end def /CMapName /KSC-EUC-V def /CMapVersion 9.001 def /CMapType 1 def /UIDOffset 310 def /XUID [1 10 25401] def /WMode 1 def 16 begincidrange <a1a2> <a1a3> 8056 <a1a5> <a1a5> 8058 <a1a6> <a1a6> 8320 <a1a9> <a1ab> 8059 <a1ad> <a1ad> 8062 <a1b2> <a1bd> 8063 <a1eb> <a1eb> 8075 <a3a1> <a3a1> 8076 <a3a8> <a3a9> 8077 <a3ac> <a3ac> 8079 <a3ae> <a3ae> 8080 <a3ba> <a3bf> 8081 <a3db> <a3db> 8087 <a3dd> <a3dd> 8088 <a3df> <a3df> 8089 <a3fb> <a3fe> 8090 endcidrange endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF \ No newline at end of file
diff --git a/src/main/resources/Resources/cmap/KSC-Johab-H b/src/main/resources/Resources/cmap/KSC-Johab-H
new file mode 100644
index 0000000..cbb5ed2
--- /dev/null
+++ b/src/main/resources/Resources/cmap/KSC-Johab-H
@@ -0,0 +1,4279 @@
+%!PS-Adobe-3.0 Resource-CMap
+%%DocumentNeededResources: ProcSet (CIDInit)
+%%IncludeResource: ProcSet (CIDInit)
+%%BeginResource: CMap (KSC-Johab-H)
+%%Title: (KSC-Johab-H Adobe Korea1 1)
+%%Version: 4.003
+%%Copyright: -----------------------------------------------------------
+%%Copyright: Copyright 1990-1997 Adobe Systems Incorporated.
+%%Copyright: All Rights Reserved.
+%%Copyright:
+%%Copyright: Patents Pending
+%%Copyright:
+%%Copyright: NOTICE: All information contained herein is the property
+%%Copyright: of Adobe Systems Incorporated.
+%%Copyright:
+%%Copyright: Permission is granted for redistribution of this file
+%%Copyright: provided this copyright notice is maintained intact and
+%%Copyright: that the contents of this file are not altered in any
+%%Copyright: way from its original form.
+%%Copyright:
+%%Copyright: PostScript and Display PostScript are trademarks of
+%%Copyright: Adobe Systems Incorporated which may be registered in
+%%Copyright: certain jurisdictions.
+%%Copyright: -----------------------------------------------------------
+%%EndComments
+
+/CIDInit /ProcSet findresource begin
+
+12 dict begin
+
+begincmap
+
+/CIDSystemInfo 3 dict dup begin
+ /Registry (Adobe) def
+ /Ordering (Korea1) def
+ /Supplement 1 def
+end def
+
+/CMapName /KSC-Johab-H def
+/CMapVersion 4.003 def
+/CMapType 1 def
+
+/UIDOffset 560 def
+/XUID [1 10 25411] def
+
+/WMode 0 def
+
+4 begincodespacerange
+ <00> <80>
+ <8441> <D3FE>
+ <D831> <DEFE>
+ <E031> <F9FE>
+endcodespacerange
+
+1 beginnotdefrange
+<00> <1f> 1
+endnotdefrange
+
+100 begincidrange
+<20> <7e> 1
+<8861> <8862> 1086
+<8863> <8864> 9333
+<8865> <8865> 1088
+<8866> <8867> 9335
+<8868> <886b> 1089
+<886c> <8870> 9337
+<8871> <8871> 1093
+<8873> <8879> 1094
+<887a> <887a> 9342
+<887b> <887d> 1101
+<8881> <8882> 1104
+<8883> <8884> 9343
+<8885> <8885> 1106
+<8886> <8888> 9345
+<8889> <8889> 1107
+<888a> <8890> 9348
+<8891> <8891> 1108
+<8893> <8893> 1109
+<8894> <8894> 9355
+<8895> <8897> 1110
+<8898> <889d> 9356
+<88a1> <88a2> 1113
+<88a3> <88a4> 9362
+<88a5> <88a5> 1115
+<88a6> <88a8> 9364
+<88a9> <88a9> 1116
+<88aa> <88b1> 9367
+<88b3> <88b4> 9375
+<88b5> <88b5> 1117
+<88b6> <88b6> 9377
+<88b7> <88b7> 1118
+<88b8> <88bd> 9378
+<88c1> <88c1> 1119
+<88c2> <88c4> 9384
+<88c5> <88c5> 1120
+<88c6> <88c8> 9387
+<88c9> <88c9> 1121
+<88ca> <88d1> 9390
+<88d3> <88dd> 9398
+<88e1> <88e2> 1122
+<88e3> <88e4> 9409
+<88e5> <88e5> 1124
+<88e6> <88e7> 9411
+<88e8> <88e9> 1125
+<88ea> <88ea> 9413
+<88eb> <88eb> 1127
+<88ec> <88f0> 9414
+<88f1> <88f1> 1128
+<88f3> <88f3> 1129
+<88f4> <88f4> 9419
+<88f5> <88f8> 1130
+<88f9> <88fa> 9420
+<88fb> <88fd> 1134
+<8941> <8941> 1137
+<8942> <8944> 9422
+<8945> <8945> 1138
+<8946> <8948> 9425
+<8949> <8949> 1139
+<894a> <8950> 9428
+<8951> <8951> 1140
+<8953> <8953> 1141
+<8954> <8954> 9435
+<8955> <8957> 1142
+<8958> <895d> 9436
+<8961> <8963> 1145
+<8964> <8964> 9442
+<8965> <8965> 1148
+<8966> <8967> 9443
+<8968> <8969> 1149
+<896a> <8970> 9445
+<8971> <8971> 1151
+<8973> <8973> 1152
+<8974> <8974> 9452
+<8975> <8977> 1153
+<8978> <897a> 9453
+<897b> <897b> 1156
+<897c> <897d> 9456
+<8981> <8981> 1157
+<8982> <8984> 9458
+<8985> <8985> 1158
+<8986> <8988> 9461
+<8989> <8989> 1159
+<898a> <8991> 9464
+<8993> <8993> 1160
+<8994> <8994> 9472
+<8995> <8995> 1161
+<8996> <899d> 9473
+<89a1> <89a2> 1162
+<89a3> <89a4> 9481
+<89a5> <89a5> 1164
+<89a6> <89a7> 9483
+<89a8> <89a9> 1165
+<89aa> <89aa> 9485
+<89ab> <89ab> 1167
+<89ac> <89ac> 9486
+<89ad> <89ad> 1168
+<89ae> <89af> 9487
+<89b0> <89b1> 1169
+<89b3> <89b3> 1171
+endcidrange
+
+100 begincidrange
+<89b4> <89b4> 9489
+<89b5> <89b5> 1172
+<89b6> <89b6> 9490
+<89b7> <89b8> 1173
+<89b9> <89bd> 9491
+<89c1> <89c2> 1175
+<89c3> <89c4> 9496
+<89c5> <89c5> 1177
+<89c6> <89c8> 9498
+<89c9> <89c9> 1178
+<89ca> <89ca> 9501
+<89cb> <89cb> 1179
+<89cc> <89d0> 9502
+<89d1> <89d1> 1180
+<89d3> <89d3> 1181
+<89d4> <89d4> 9507
+<89d5> <89d5> 1182
+<89d6> <89d6> 9508
+<89d7> <89d7> 1183
+<89d8> <89dd> 9509
+<89e1> <89e1> 1184
+<89e2> <89e4> 9515
+<89e5> <89e5> 1185
+<89e6> <89e8> 9518
+<89e9> <89e9> 1186
+<89ea> <89f1> 9521
+<89f3> <89f3> 1187
+<89f4> <89f5> 9529
+<89f6> <89f7> 1188
+<89f8> <89fd> 9531
+<8a41> <8a42> 1190
+<8a43> <8a44> 9537
+<8a45> <8a45> 1192
+<8a46> <8a48> 9539
+<8a49> <8a49> 1193
+<8a4a> <8a50> 9542
+<8a51> <8a51> 1194
+<8a53> <8a53> 1195
+<8a54> <8a54> 9549
+<8a55> <8a55> 1196
+<8a56> <8a56> 9550
+<8a57> <8a57> 1197
+<8a58> <8a5d> 9551
+<8a61> <8a61> 1198
+<8a62> <8a64> 9557
+<8a65> <8a65> 1199
+<8a66> <8a68> 9560
+<8a69> <8a69> 1200
+<8a6a> <8a71> 9563
+<8a73> <8a73> 1201
+<8a74> <8a74> 9571
+<8a75> <8a75> 1202
+<8a76> <8a7d> 9572
+<8a81> <8a82> 1203
+<8a83> <8a84> 9580
+<8a85> <8a85> 1205
+<8a86> <8a87> 9582
+<8a88> <8a8b> 1206
+<8a8c> <8a8f> 9584
+<8a90> <8a91> 1210
+<8a93> <8a93> 1212
+<8a94> <8a94> 9588
+<8a95> <8a95> 1213
+<8a96> <8a96> 9589
+<8a97> <8a98> 1214
+<8a99> <8a9d> 9590
+<8aa1> <8aa2> 1216
+<8aa3> <8aa4> 9595
+<8aa5> <8aa5> 1218
+<8aa6> <8aa8> 9597
+<8aa9> <8aa9> 1219
+<8aaa> <8ab1> 9600
+<8ab3> <8ab5> 9608
+<8ab6> <8ab7> 1220
+<8ab8> <8abd> 9611
+<8ac1> <8ac1> 1222
+<8ac2> <8ad1> 9617
+<8ad3> <8ad4> 9633
+<8ad5> <8ad5> 1223
+<8ad6> <8add> 9635
+<8ae1> <8ae2> 1224
+<8ae3> <8ae4> 9643
+<8ae5> <8ae5> 1226
+<8ae6> <8ae8> 9645
+<8ae9> <8ae9> 1227
+<8aea> <8af0> 9648
+<8af1> <8af1> 1228
+<8af3> <8af3> 1229
+<8af4> <8af4> 9655
+<8af5> <8af5> 1230
+<8af6> <8afd> 9656
+<8b41> <8b41> 1231
+<8b42> <8b44> 9664
+<8b45> <8b45> 1232
+<8b46> <8b48> 9667
+<8b49> <8b49> 1233
+<8b4a> <8b51> 9670
+<8b53> <8b5d> 9678
+<8b61> <8b62> 1234
+<8b63> <8b64> 9689
+endcidrange
+
+100 begincidrange
+<8b65> <8b65> 1236
+<8b66> <8b67> 9691
+<8b68> <8b6a> 1237
+<8b6b> <8b70> 9693
+<8b71> <8b71> 1240
+<8b73> <8b73> 1241
+<8b74> <8b74> 9699
+<8b75> <8b75> 1242
+<8b76> <8b76> 9700
+<8b77> <8b77> 1243
+<8b78> <8b7d> 9701
+<8b81> <8b81> 1244
+<8b82> <8b91> 9707
+<8b93> <8b9d> 9723
+<8ba1> <8ba2> 1245
+<8ba3> <8ba4> 9734
+<8ba5> <8ba5> 1247
+<8ba6> <8ba7> 9736
+<8ba8> <8ba9> 1248
+<8baa> <8baa> 9738
+<8bab> <8bab> 1250
+<8bac> <8bb0> 9739
+<8bb1> <8bb1> 1251
+<8bb3> <8bb3> 1252
+<8bb4> <8bb4> 9744
+<8bb5> <8bb5> 1253
+<8bb6> <8bb6> 9745
+<8bb7> <8bb8> 1254
+<8bb9> <8bbb> 9746
+<8bbc> <8bbc> 1256
+<8bbd> <8bbd> 9749
+<8c61> <8c63> 1257
+<8c64> <8c64> 9750
+<8c65> <8c65> 1260
+<8c66> <8c68> 9751
+<8c69> <8c69> 1261
+<8c6a> <8c6a> 9754
+<8c6b> <8c6b> 1262
+<8c6c> <8c70> 9755
+<8c71> <8c71> 1263
+<8c73> <8c73> 1264
+<8c74> <8c74> 9760
+<8c75> <8c77> 1265
+<8c78> <8c7a> 9761
+<8c7b> <8c7b> 1268
+<8c7c> <8c7d> 9764
+<8c81> <8c82> 1269
+<8c83> <8c84> 9766
+<8c85> <8c85> 1271
+<8c86> <8c88> 9768
+<8c89> <8c89> 1272
+<8c8a> <8c90> 9771
+<8c91> <8c91> 1273
+<8c93> <8c93> 1274
+<8c94> <8c94> 9778
+<8c95> <8c97> 1275
+<8c98> <8c9d> 9779
+<8ca1> <8ca2> 1278
+<8ca3> <8ca8> 9785
+<8ca9> <8ca9> 1280
+<8caa> <8cb1> 9791
+<8cb3> <8cbd> 9799
+<8cc1> <8cd1> 9810
+<8cd3> <8cdd> 9827
+<8ce1> <8ce3> 1281
+<8ce4> <8ce4> 9838
+<8ce5> <8ce5> 1284
+<8ce6> <8ce8> 9839
+<8ce9> <8ce9> 1285
+<8cea> <8cf0> 9842
+<8cf1> <8cf1> 1286
+<8cf3> <8cf3> 1287
+<8cf4> <8cf4> 9849
+<8cf5> <8cf7> 1288
+<8cf8> <8cfd> 9850
+<8d41> <8d42> 1291
+<8d43> <8d44> 9856
+<8d45> <8d45> 1293
+<8d46> <8d50> 9858
+<8d51> <8d51> 1294
+<8d53> <8d54> 9869
+<8d55> <8d55> 1295
+<8d56> <8d56> 9871
+<8d57> <8d57> 1296
+<8d58> <8d5d> 9872
+<8d61> <8d61> 1297
+<8d62> <8d64> 9878
+<8d65> <8d65> 1298
+<8d66> <8d68> 9881
+<8d69> <8d69> 1299
+<8d6a> <8d71> 9884
+<8d73> <8d74> 9892
+<8d75> <8d76> 1300
+<8d77> <8d7a> 9894
+<8d7b> <8d7b> 1302
+<8d7c> <8d7d> 9898
+<8d81> <8d81> 1303
+<8d82> <8d91> 9900
+<8d93> <8d9d> 9916
+<8da1> <8da2> 1304
+endcidrange
+
+100 begincidrange
+<8da3> <8da4> 9927
+<8da5> <8da5> 1306
+<8da6> <8da6> 9929
+<8da7> <8da7> 1307
+<8da8> <8da8> 9930
+<8da9> <8da9> 1308
+<8daa> <8db0> 9931
+<8db1> <8db1> 1309
+<8db3> <8db3> 1310
+<8db4> <8db4> 9938
+<8db5> <8db5> 1311
+<8db6> <8db6> 9939
+<8db7> <8db9> 1312
+<8dba> <8dbd> 9940
+<8dc1> <8dc2> 1315
+<8dc3> <8dc8> 9944
+<8dc9> <8dc9> 1317
+<8dca> <8dd1> 9950
+<8dd3> <8dd5> 9958
+<8dd6> <8dd7> 1318
+<8dd8> <8ddd> 9961
+<8de1> <8de2> 1320
+<8de3> <8df1> 9967
+<8df3> <8df6> 9982
+<8df7> <8df7> 1322
+<8df8> <8dfd> 9986
+<8e41> <8e41> 1323
+<8e42> <8e44> 9992
+<8e45> <8e45> 1324
+<8e46> <8e48> 9995
+<8e49> <8e49> 1325
+<8e4a> <8e50> 9998
+<8e51> <8e51> 1326
+<8e53> <8e53> 1327
+<8e54> <8e56> 10005
+<8e57> <8e57> 1328
+<8e58> <8e5d> 10008
+<8e61> <8e61> 1329
+<8e62> <8e71> 10014
+<8e73> <8e7d> 10030
+<8e81> <8e82> 1330
+<8e83> <8e84> 10041
+<8e85> <8e85> 1332
+<8e86> <8e88> 10043
+<8e89> <8e89> 1333
+<8e8a> <8e8f> 10046
+<8e90> <8e91> 1334
+<8e93> <8e93> 1336
+<8e94> <8e94> 10052
+<8e95> <8e95> 1337
+<8e96> <8e96> 10053
+<8e97> <8e98> 1338
+<8e99> <8e9d> 10054
+<8ea1> <8ea1> 1340
+<8ea2> <8ea8> 10059
+<8ea9> <8ea9> 1341
+<8eaa> <8eb1> 10066
+<8eb3> <8eb5> 10074
+<8eb6> <8eb7> 1342
+<8eb8> <8ebd> 10077
+<8ec1> <8ec2> 1344
+<8ec3> <8ec4> 10083
+<8ec5> <8ec5> 1346
+<8ec6> <8ec8> 10085
+<8ec9> <8ec9> 1347
+<8eca> <8ed0> 10088
+<8ed1> <8ed1> 1348
+<8ed3> <8ed3> 1349
+<8ed4> <8ed5> 10095
+<8ed6> <8ed6> 1350
+<8ed7> <8edd> 10097
+<8ee1> <8ee1> 1351
+<8ee2> <8ee4> 10104
+<8ee5> <8ee5> 1352
+<8ee6> <8ee8> 10107
+<8ee9> <8ee9> 1353
+<8eea> <8ef0> 10110
+<8ef1> <8ef1> 1354
+<8ef3> <8ef3> 1355
+<8ef4> <8efd> 10117
+<8f41> <8f41> 1356
+<8f42> <8f51> 10127
+<8f53> <8f5d> 10143
+<8f61> <8f62> 1357
+<8f63> <8f64> 10154
+<8f65> <8f65> 1359
+<8f66> <8f66> 10156
+<8f67> <8f67> 1360
+<8f68> <8f68> 10157
+<8f69> <8f69> 1361
+<8f6a> <8f6a> 10158
+<8f6b> <8f6b> 1362
+<8f6c> <8f6f> 10159
+<8f70> <8f71> 1363
+<8f73> <8f73> 1365
+<8f74> <8f74> 10163
+<8f75> <8f75> 1366
+<8f76> <8f76> 10164
+<8f77> <8f77> 1367
+<8f78> <8f7a> 10165
+endcidrange
+
+100 begincidrange
+<8f7b> <8f7b> 1368
+<8f7c> <8f7d> 10168
+<8f81> <8f91> 10170
+<8f93> <8f9d> 10187
+<8fa1> <8fa2> 1369
+<8fa3> <8fa4> 10198
+<8fa5> <8fa5> 1371
+<8fa6> <8fa8> 10200
+<8fa9> <8fa9> 1372
+<8faa> <8fb0> 10203
+<8fb1> <8fb1> 1373
+<8fb3> <8fb3> 1374
+<8fb4> <8fb4> 10210
+<8fb5> <8fb5> 1375
+<8fb6> <8fb6> 10211
+<8fb7> <8fb7> 1376
+<8fb8> <8fbd> 10212
+<9061> <9063> 1377
+<9064> <9064> 10218
+<9065> <9065> 1380
+<9066> <9067> 10219
+<9068> <906b> 1381
+<906c> <9070> 10221
+<9071> <9071> 1385
+<9073> <9073> 1386
+<9074> <9074> 10226
+<9075> <9079> 1387
+<907a> <907a> 10227
+<907b> <907b> 1392
+<907c> <907c> 10228
+<907d> <907d> 1393
+<9081> <9082> 1394
+<9083> <9084> 10229
+<9085> <9085> 1396
+<9086> <9088> 10231
+<9089> <9089> 1397
+<908a> <9090> 10234
+<9091> <9091> 1398
+<9093> <9093> 1399
+<9094> <9094> 10241
+<9095> <9097> 1400
+<9098> <909d> 10242
+<90a1> <90a2> 1403
+<90a3> <90a4> 10248
+<90a5> <90a5> 1405
+<90a6> <90a8> 10250
+<90a9> <90a9> 1406
+<90aa> <90b0> 10253
+<90b1> <90b1> 1407
+<90b3> <90b6> 10260
+<90b7> <90b7> 1408
+<90b8> <90bd> 10264
+<90c1> <90d1> 10270
+<90d3> <90dd> 10287
+<90e1> <90e2> 1409
+<90e3> <90e3> 10298
+<90e4> <90e5> 1411
+<90e6> <90e8> 10299
+<90e9> <90e9> 1413
+<90ea> <90ea> 10302
+<90eb> <90ec> 1414
+<90ed> <90f0> 10303
+<90f1> <90f1> 1416
+<90f3> <90f3> 1417
+<90f4> <90f4> 10307
+<90f5> <90f7> 1418
+<90f8> <90fc> 10308
+<90fd> <90fd> 1421
+<9141> <9142> 1422
+<9143> <9144> 10313
+<9145> <9145> 1424
+<9146> <9148> 10315
+<9149> <9149> 1425
+<914a> <9150> 10318
+<9151> <9151> 1426
+<9153> <9153> 1427
+<9154> <9154> 10325
+<9155> <9157> 1428
+<9158> <915d> 10326
+<9161> <9162> 1431
+<9163> <9164> 10332
+<9165> <9165> 1433
+<9166> <9168> 10334
+<9169> <9169> 1434
+<916a> <9170> 10337
+<9171> <9171> 1435
+<9173> <9173> 1436
+<9174> <9175> 10344
+<9176> <9177> 1437
+<9178> <9179> 10346
+<917a> <917a> 1439
+<917b> <917d> 10348
+<9181> <9181> 1440
+<9182> <9184> 10351
+<9185> <9185> 1441
+<9186> <9191> 10354
+<9193> <919d> 10366
+<91a1> <91a2> 1442
+<91a3> <91a4> 10377
+<91a5> <91a5> 1444
+endcidrange
+
+100 begincidrange
+<91a6> <91a8> 10379
+<91a9> <91a9> 1445
+<91aa> <91aa> 10382
+<91ab> <91ab> 1446
+<91ac> <91b0> 10383
+<91b1> <91b1> 1447
+<91b3> <91b3> 1448
+<91b4> <91b4> 10388
+<91b5> <91b5> 1449
+<91b6> <91b6> 10389
+<91b7> <91b7> 1450
+<91b8> <91bb> 10390
+<91bc> <91bd> 1451
+<91c1> <91c1> 1453
+<91c2> <91c4> 10394
+<91c5> <91c5> 1454
+<91c6> <91c8> 10397
+<91c9> <91c9> 1455
+<91ca> <91d1> 10400
+<91d3> <91d5> 10408
+<91d6> <91d6> 1456
+<91d7> <91dd> 10411
+<91e1> <91f1> 10418
+<91f3> <91fd> 10435
+<9241> <9241> 1457
+<9242> <9244> 10446
+<9245> <9245> 1458
+<9246> <9248> 10449
+<9249> <9249> 1459
+<924a> <9250> 10452
+<9251> <9251> 1460
+<9253> <9253> 1461
+<9254> <9254> 10459
+<9255> <9255> 1462
+<9256> <925d> 10460
+<9261> <9262> 1463
+<9263> <9264> 10468
+<9265> <9265> 1465
+<9266> <9268> 10470
+<9269> <9269> 1466
+<926a> <9271> 10473
+<9273> <9273> 1467
+<9274> <9274> 10481
+<9275> <9275> 1468
+<9276> <9276> 10482
+<9277> <9277> 1469
+<9278> <927d> 10483
+<9281> <9282> 1470
+<9283> <9284> 10489
+<9285> <9285> 1472
+<9286> <9287> 10491
+<9288> <9289> 1473
+<928a> <9290> 10493
+<9291> <9291> 1475
+<9293> <9293> 1476
+<9294> <9294> 10500
+<9295> <9295> 1477
+<9296> <9296> 10501
+<9297> <9297> 1478
+<9298> <929d> 10502
+<92a1> <92a1> 1479
+<92a2> <92b1> 10508
+<92b3> <92b5> 10524
+<92b6> <92b6> 1480
+<92b7> <92bd> 10527
+<92c1> <92c1> 1481
+<92c2> <92d1> 10534
+<92d3> <92dd> 10550
+<92e1> <92e1> 1482
+<92e2> <92e4> 10561
+<92e5> <92e5> 1483
+<92e6> <92e8> 10564
+<92e9> <92e9> 1484
+<92ea> <92f0> 10567
+<92f1> <92f1> 1485
+<92f3> <92f3> 1486
+<92f4> <92fd> 10574
+<9341> <9342> 1487
+<9343> <9348> 10584
+<9349> <9349> 1489
+<934a> <9350> 10590
+<9351> <9351> 1490
+<9353> <9353> 1491
+<9354> <9356> 10597
+<9357> <9357> 1492
+<9358> <935d> 10600
+<9361> <9362> 1493
+<9363> <9364> 10606
+<9365> <9365> 1495
+<9366> <9368> 10608
+<9369> <936b> 1496
+<936c> <9370> 10611
+<9371> <9371> 1499
+<9373> <9373> 1500
+<9374> <9374> 10616
+<9375> <9375> 1501
+<9376> <9376> 10617
+<9377> <9378> 1502
+<9379> <937b> 10618
+<937c> <937c> 1504
+endcidrange
+
+100 begincidrange
+<937d> <937d> 10621
+<9381> <9381> 1505
+<9382> <9384> 10622
+<9385> <9385> 1506
+<9386> <9388> 10625
+<9389> <9389> 1507
+<938a> <9391> 10628
+<9393> <939d> 10636
+<93a1> <93a2> 1508
+<93a3> <93a4> 10647
+<93a5> <93a5> 1510
+<93a6> <93a8> 10649
+<93a9> <93a9> 1511
+<93aa> <93aa> 10652
+<93ab> <93ab> 1512
+<93ac> <93b0> 10653
+<93b1> <93b1> 1513
+<93b3> <93b3> 1514
+<93b4> <93b4> 10658
+<93b5> <93b5> 1515
+<93b6> <93b6> 10659
+<93b7> <93b7> 1516
+<93b8> <93bb> 10660
+<93bc> <93bc> 1517
+<93bd> <93bd> 10664
+<9461> <9463> 1518
+<9464> <9464> 10665
+<9465> <9465> 1521
+<9466> <9467> 10666
+<9468> <946c> 1522
+<946d> <946f> 10668
+<9470> <9471> 1527
+<9473> <9473> 1529
+<9474> <9474> 10671
+<9475> <9479> 1530
+<947a> <947c> 10672
+<947d> <947d> 1535
+<9481> <9482> 1536
+<9483> <9484> 10675
+<9485> <9485> 1538
+<9486> <9488> 10677
+<9489> <9489> 1539
+<948a> <9490> 10680
+<9491> <9491> 1540
+<9493> <9493> 1541
+<9494> <9494> 10687
+<9495> <9497> 1542
+<9498> <949d> 10688
+<94a1> <94a1> 1545
+<94a2> <94b1> 10694
+<94b3> <94bd> 10710
+<94c1> <94d1> 10721
+<94d3> <94dd> 10738
+<94e1> <94e3> 1546
+<94e4> <94e4> 10749
+<94e5> <94e5> 1549
+<94e6> <94e7> 10750
+<94e8> <94e9> 1550
+<94ea> <94ea> 10752
+<94eb> <94ec> 1552
+<94ed> <94f0> 10753
+<94f1> <94f1> 1554
+<94f3> <94f3> 1555
+<94f4> <94f4> 10757
+<94f5> <94f5> 1556
+<94f6> <94f6> 10758
+<94f7> <94f7> 1557
+<94f8> <94f8> 10759
+<94f9> <94f9> 1558
+<94fa> <94fb> 10760
+<94fc> <94fc> 1559
+<94fd> <94fd> 10762
+<9541> <9542> 1560
+<9543> <9544> 10763
+<9545> <9545> 1562
+<9546> <9548> 10765
+<9549> <9549> 1563
+<954a> <9550> 10768
+<9551> <9551> 1564
+<9553> <9553> 1565
+<9554> <9554> 10775
+<9555> <9557> 1566
+<9558> <955d> 10776
+<9561> <9561> 1569
+<9562> <9564> 10782
+<9565> <9565> 1570
+<9566> <9568> 10785
+<9569> <9569> 1571
+<956a> <9571> 10788
+<9573> <9575> 10796
+<9576> <9577> 1572
+<9578> <957d> 10799
+<9581> <9581> 1574
+<9582> <9584> 10805
+<9585> <9585> 1575
+<9586> <9591> 10808
+<9593> <959d> 10820
+<95a1> <95a2> 1576
+<95a3> <95a4> 10831
+<95a5> <95a5> 1578
+endcidrange
+
+100 begincidrange
+<95a6> <95a7> 10833
+<95a8> <95a9> 1579
+<95aa> <95aa> 10835
+<95ab> <95ab> 1581
+<95ac> <95ac> 10836
+<95ad> <95ad> 1582
+<95ae> <95b0> 10837
+<95b1> <95b1> 1583
+<95b3> <95b3> 1584
+<95b4> <95b4> 10840
+<95b5> <95b5> 1585
+<95b6> <95b6> 10841
+<95b7> <95b7> 1586
+<95b8> <95b8> 10842
+<95b9> <95b9> 1587
+<95ba> <95ba> 10843
+<95bb> <95bb> 1588
+<95bc> <95bd> 10844
+<95c1> <95c1> 1589
+<95c2> <95c4> 10846
+<95c5> <95c5> 1590
+<95c6> <95c8> 10849
+<95c9> <95c9> 1591
+<95ca> <95d1> 10852
+<95d3> <95dd> 10860
+<95e1> <95e1> 1592
+<95e2> <95f1> 10871
+<95f3> <95f5> 10887
+<95f6> <95f6> 1593
+<95f7> <95fd> 10890
+<9641> <9641> 1594
+<9642> <9644> 10897
+<9645> <9645> 1595
+<9646> <9648> 10900
+<9649> <9649> 1596
+<964a> <9650> 10903
+<9651> <9651> 1597
+<9653> <9653> 1598
+<9654> <9654> 10910
+<9655> <9655> 1599
+<9656> <965d> 10911
+<9661> <9661> 1600
+<9662> <9671> 10919
+<9673> <967d> 10935
+<9681> <9682> 1601
+<9683> <9684> 10946
+<9685> <9685> 1603
+<9686> <9688> 10948
+<9689> <9689> 1604
+<968a> <9690> 10951
+<9691> <9691> 1605
+<9693> <9693> 1606
+<9694> <9694> 10958
+<9695> <9695> 1607
+<9696> <9696> 10959
+<9697> <9697> 1608
+<9698> <969d> 10960
+<96a1> <96a1> 1609
+<96a2> <96b1> 10966
+<96b3> <96b5> 10982
+<96b6> <96b6> 1610
+<96b7> <96bd> 10985
+<96c1> <96c1> 1611
+<96c2> <96d1> 10992
+<96d3> <96d6> 11008
+<96d7> <96d7> 1612
+<96d8> <96dd> 11012
+<96e1> <96e1> 1613
+<96e2> <96e4> 11018
+<96e5> <96e5> 1614
+<96e6> <96e8> 11021
+<96e9> <96e9> 1615
+<96ea> <96f1> 11024
+<96f3> <96f3> 1616
+<96f4> <96f4> 11032
+<96f5> <96f5> 1617
+<96f6> <96f6> 11033
+<96f7> <96f7> 1618
+<96f8> <96fd> 11034
+<9741> <9741> 1619
+<9742> <9744> 11040
+<9745> <9745> 1620
+<9746> <9748> 11043
+<9749> <9749> 1621
+<974a> <9750> 11046
+<9751> <9751> 1622
+<9753> <9756> 11053
+<9757> <9757> 1623
+<9758> <975d> 11057
+<9761> <9762> 1624
+<9763> <9764> 11063
+<9765> <9765> 1626
+<9766> <9767> 11065
+<9768> <9769> 1627
+<976a> <976a> 11067
+<976b> <976b> 1629
+<976c> <9770> 11068
+<9771> <9771> 1630
+<9773> <9773> 1631
+<9774> <9774> 11073
+endcidrange
+
+100 begincidrange
+<9775> <9775> 1632
+<9776> <9776> 11074
+<9777> <9777> 1633
+<9778> <977d> 11075
+<9781> <9781> 1634
+<9782> <9791> 11081
+<9793> <979d> 11097
+<97a1> <97a2> 1635
+<97a3> <97a4> 11108
+<97a5> <97a5> 1637
+<97a6> <97a7> 11110
+<97a8> <97a9> 1638
+<97aa> <97b0> 11112
+<97b1> <97b1> 1640
+<97b3> <97b3> 1641
+<97b4> <97b4> 11119
+<97b5> <97b8> 1642
+<97b9> <97bd> 11120
+<9861> <9862> 1646
+<9863> <9864> 11125
+<9865> <9865> 1648
+<9866> <9868> 11127
+<9869> <9869> 1649
+<986a> <9870> 11130
+<9871> <9871> 1650
+<9873> <9873> 1651
+<9874> <9874> 11137
+<9875> <9877> 1652
+<9878> <987c> 11138
+<987d> <987d> 1655
+<9881> <9882> 1656
+<9883> <9884> 11143
+<9885> <9885> 1658
+<9886> <9888> 11145
+<9889> <9889> 1659
+<988a> <9890> 11148
+<9891> <9891> 1660
+<9893> <9893> 1661
+<9894> <9894> 11155
+<9895> <9897> 1662
+<9898> <989d> 11156
+<98a1> <98b1> 11162
+<98b3> <98bd> 11179
+<98c1> <98d1> 11190
+<98d3> <98dd> 11207
+<98e1> <98e2> 1665
+<98e3> <98e4> 11218
+<98e5> <98e5> 1667
+<98e6> <98e8> 11220
+<98e9> <98e9> 1668
+<98ea> <98ea> 11223
+<98eb> <98ec> 1669
+<98ed> <98f0> 11224
+<98f1> <98f1> 1671
+<98f3> <98f3> 1672
+<98f4> <98f4> 11228
+<98f5> <98f7> 1673
+<98f8> <98fc> 11229
+<98fd> <98fd> 1676
+<9941> <9942> 1677
+<9943> <9944> 11234
+<9945> <9945> 1679
+<9946> <9948> 11236
+<9949> <9949> 1680
+<994a> <9950> 11239
+<9951> <9951> 1681
+<9953> <9953> 1682
+<9954> <9954> 11246
+<9955> <9957> 1683
+<9958> <995d> 11247
+<9961> <9961> 1686
+<9962> <9971> 11253
+<9973> <9975> 11269
+<9976> <9976> 1687
+<9977> <997d> 11272
+<9981> <9991> 11279
+<9993> <999d> 11296
+<99a1> <99a2> 1688
+<99a3> <99a4> 11307
+<99a5> <99a5> 1690
+<99a6> <99a8> 11309
+<99a9> <99a9> 1691
+<99aa> <99b1> 11312
+<99b3> <99b6> 11320
+<99b7> <99b7> 1692
+<99b8> <99bd> 11324
+<99c1> <99c1> 1693
+<99c2> <99c8> 11330
+<99c9> <99c9> 1694
+<99ca> <99d1> 11337
+<99d3> <99dd> 11345
+<99e1> <99e1> 1695
+<99e2> <99f1> 11356
+<99f3> <99fd> 11372
+<9a41> <9a41> 1696
+<9a42> <9a44> 11383
+<9a45> <9a45> 1697
+<9a46> <9a51> 11386
+<9a53> <9a5d> 11398
+<9a61> <9a71> 11409
+endcidrange
+
+100 begincidrange
+<9a73> <9a7d> 11426
+<9a81> <9a82> 1698
+<9a83> <9a84> 11437
+<9a85> <9a85> 1700
+<9a86> <9a88> 11439
+<9a89> <9a89> 1701
+<9a8a> <9a8f> 11442
+<9a90> <9a91> 1702
+<9a93> <9a96> 11448
+<9a97> <9a97> 1704
+<9a98> <9a9d> 11452
+<9aa1> <9ab1> 11458
+<9ab3> <9abd> 11475
+<9ac1> <9ac1> 1705
+<9ac2> <9ad1> 11486
+<9ad3> <9add> 11502
+<9ae1> <9ae1> 1706
+<9ae2> <9ae4> 11513
+<9ae5> <9ae5> 1707
+<9ae6> <9ae8> 11516
+<9ae9> <9ae9> 1708
+<9aea> <9af0> 11519
+<9af1> <9af1> 1709
+<9af3> <9af3> 1710
+<9af4> <9af6> 11526
+<9af7> <9af7> 1711
+<9af8> <9afd> 11529
+<9b41> <9b51> 11535
+<9b53> <9b5d> 11552
+<9b61> <9b62> 1712
+<9b63> <9b64> 11563
+<9b65> <9b65> 1714
+<9b66> <9b67> 11565
+<9b68> <9b69> 1715
+<9b6a> <9b70> 11567
+<9b71> <9b71> 1717
+<9b73> <9b73> 1718
+<9b74> <9b74> 11574
+<9b75> <9b75> 1719
+<9b76> <9b7d> 11575
+<9b81> <9b81> 1720
+<9b82> <9b84> 11583
+<9b85> <9b85> 1721
+<9b86> <9b88> 11586
+<9b89> <9b89> 1722
+<9b8a> <9b90> 11589
+<9b91> <9b91> 1723
+<9b93> <9b93> 1724
+<9b94> <9b9d> 11596
+<9ba1> <9ba1> 1725
+<9ba2> <9ba4> 11606
+<9ba5> <9ba5> 1726
+<9ba6> <9ba8> 11609
+<9ba9> <9ba9> 1727
+<9baa> <9bb0> 11612
+<9bb1> <9bb1> 1728
+<9bb3> <9bb3> 1729
+<9bb4> <9bb4> 11619
+<9bb5> <9bb5> 1730
+<9bb6> <9bb6> 11620
+<9bb7> <9bb7> 1731
+<9bb8> <9bbd> 11621
+<9c61> <9c62> 1732
+<9c63> <9c64> 11627
+<9c65> <9c65> 1734
+<9c66> <9c68> 11629
+<9c69> <9c69> 1735
+<9c6a> <9c70> 11632
+<9c71> <9c71> 1736
+<9c73> <9c73> 1737
+<9c74> <9c74> 11639
+<9c75> <9c78> 1738
+<9c79> <9c7b> 11640
+<9c7c> <9c7d> 1742
+<9c81> <9c82> 1744
+<9c83> <9c84> 11643
+<9c85> <9c85> 1746
+<9c86> <9c88> 11645
+<9c89> <9c89> 1747
+<9c8a> <9c90> 11648
+<9c91> <9c91> 1748
+<9c93> <9c93> 1749
+<9c94> <9c94> 11655
+<9c95> <9c97> 1750
+<9c98> <9c9d> 11656
+<9ca1> <9ca2> 1753
+<9ca3> <9ca4> 11662
+<9ca5> <9ca5> 1755
+<9ca6> <9cb1> 11664
+<9cb3> <9cb4> 11676
+<9cb5> <9cb5> 1756
+<9cb6> <9cb6> 11678
+<9cb7> <9cb7> 1757
+<9cb8> <9cbd> 11679
+<9cc1> <9cd1> 11685
+<9cd3> <9cdd> 11702
+<9ce1> <9ce2> 1758
+<9ce3> <9ce4> 11713
+<9ce5> <9ce5> 1760
+<9ce6> <9ce8> 11715
+endcidrange
+
+100 begincidrange
+<9ce9> <9ce9> 1761
+<9cea> <9cf0> 11718
+<9cf1> <9cf1> 1762
+<9cf3> <9cf3> 1763
+<9cf4> <9cf4> 11725
+<9cf5> <9cf7> 1764
+<9cf8> <9cfc> 11726
+<9cfd> <9cfd> 1767
+<9d41> <9d42> 1768
+<9d43> <9d44> 11731
+<9d45> <9d45> 1770
+<9d46> <9d48> 11733
+<9d49> <9d49> 1771
+<9d4a> <9d50> 11736
+<9d51> <9d51> 1772
+<9d53> <9d53> 1773
+<9d54> <9d54> 11743
+<9d55> <9d55> 1774
+<9d56> <9d56> 11744
+<9d57> <9d57> 1775
+<9d58> <9d5d> 11745
+<9d61> <9d62> 1776
+<9d63> <9d64> 11751
+<9d65> <9d65> 1778
+<9d66> <9d68> 11753
+<9d69> <9d69> 1779
+<9d6a> <9d70> 11756
+<9d71> <9d71> 1780
+<9d73> <9d73> 1781
+<9d74> <9d74> 11763
+<9d75> <9d77> 1782
+<9d78> <9d7d> 11764
+<9d81> <9d81> 1785
+<9d82> <9d84> 11770
+<9d85> <9d85> 1786
+<9d86> <9d91> 11773
+<9d93> <9d93> 1787
+<9d94> <9d94> 11785
+<9d95> <9d95> 1788
+<9d96> <9d9d> 11786
+<9da1> <9da2> 1789
+<9da3> <9da4> 11794
+<9da5> <9da5> 1791
+<9da6> <9da8> 11796
+<9da9> <9da9> 1792
+<9daa> <9db0> 11799
+<9db1> <9db1> 1793
+<9db3> <9db3> 1794
+<9db4> <9db4> 11806
+<9db5> <9db5> 1795
+<9db6> <9db6> 11807
+<9db7> <9db7> 1796
+<9db8> <9dbd> 11808
+<9dc1> <9dc1> 1797
+<9dc2> <9dc4> 11814
+<9dc5> <9dc5> 1798
+<9dc6> <9dd1> 11817
+<9dd3> <9dd6> 11829
+<9dd7> <9dd7> 1799
+<9dd8> <9ddd> 11833
+<9de1> <9df1> 11839
+<9df3> <9df5> 11856
+<9df6> <9df6> 1800
+<9df7> <9dfd> 11859
+<9e41> <9e41> 1801
+<9e42> <9e44> 11866
+<9e45> <9e45> 1802
+<9e46> <9e48> 11869
+<9e49> <9e49> 1803
+<9e4a> <9e50> 11872
+<9e51> <9e51> 1804
+<9e53> <9e53> 1805
+<9e54> <9e54> 11879
+<9e55> <9e55> 1806
+<9e56> <9e56> 11880
+<9e57> <9e57> 1807
+<9e58> <9e5d> 11881
+<9e61> <9e61> 1808
+<9e62> <9e64> 11887
+<9e65> <9e65> 1809
+<9e66> <9e68> 11890
+<9e69> <9e69> 1810
+<9e6a> <9e71> 11893
+<9e73> <9e73> 1811
+<9e74> <9e74> 11901
+<9e75> <9e75> 1812
+<9e76> <9e76> 11902
+<9e77> <9e77> 1813
+<9e78> <9e7d> 11903
+<9e81> <9e82> 1814
+<9e83> <9e84> 11909
+<9e85> <9e85> 1816
+<9e86> <9e88> 11911
+<9e89> <9e89> 1817
+<9e8a> <9e90> 11914
+<9e91> <9e91> 1818
+<9e93> <9e93> 1819
+<9e94> <9e94> 11921
+<9e95> <9e95> 1820
+<9e96> <9e96> 11922
+endcidrange
+
+100 begincidrange
+<9e97> <9e97> 1821
+<9e98> <9e9d> 11923
+<9ea1> <9ea1> 1822
+<9ea2> <9eb1> 11929
+<9eb3> <9eb5> 11945
+<9eb6> <9eb6> 1823
+<9eb7> <9ebd> 11948
+<9ec1> <9ec1> 1824
+<9ec2> <9ed1> 11955
+<9ed3> <9edd> 11971
+<9ee1> <9ee2> 1825
+<9ee3> <9ee4> 11982
+<9ee5> <9ee5> 1827
+<9ee6> <9ee8> 11984
+<9ee9> <9ee9> 1828
+<9eea> <9ef0> 11987
+<9ef1> <9ef1> 1829
+<9ef3> <9ef4> 11994
+<9ef5> <9ef5> 1830
+<9ef6> <9ef6> 11996
+<9ef7> <9ef7> 1831
+<9ef8> <9efd> 11997
+<9f41> <9f42> 1832
+<9f43> <9f44> 12003
+<9f45> <9f45> 1834
+<9f46> <9f48> 12005
+<9f49> <9f49> 1835
+<9f4a> <9f50> 12008
+<9f51> <9f51> 1836
+<9f53> <9f53> 1837
+<9f54> <9f54> 12015
+<9f55> <9f55> 1838
+<9f56> <9f56> 12016
+<9f57> <9f57> 1839
+<9f58> <9f5d> 12017
+<9f61> <9f62> 1840
+<9f63> <9f64> 12023
+<9f65> <9f65> 1842
+<9f66> <9f68> 12025
+<9f69> <9f69> 1843
+<9f6a> <9f70> 12028
+<9f71> <9f71> 1844
+<9f73> <9f73> 1845
+<9f74> <9f74> 12035
+<9f75> <9f75> 1846
+<9f76> <9f76> 12036
+<9f77> <9f78> 1847
+<9f79> <9f7a> 12037
+<9f7b> <9f7c> 1849
+<9f7d> <9f7d> 12039
+<9f81> <9f91> 12040
+<9f93> <9f9d> 12057
+<9fa1> <9fa2> 1851
+<9fa3> <9fa4> 12068
+<9fa5> <9fa5> 1853
+<9fa6> <9fa8> 12070
+<9fa9> <9fa9> 1854
+<9faa> <9fb0> 12073
+<9fb1> <9fb1> 1855
+<9fb3> <9fb3> 1856
+<9fb4> <9fb4> 12080
+<9fb5> <9fb5> 1857
+<9fb6> <9fb6> 12081
+<9fb7> <9fb7> 1858
+<9fb8> <9fbd> 12082
+<a061> <a062> 1859
+<a063> <a064> 12088
+<a065> <a065> 1861
+<a066> <a066> 12090
+<a067> <a06b> 1862
+<a06c> <a070> 12091
+<a071> <a071> 1867
+<a073> <a073> 1868
+<a074> <a074> 12096
+<a075> <a075> 1869
+<a076> <a076> 12097
+<a077> <a078> 1870
+<a079> <a07a> 12098
+<a07b> <a07b> 1872
+<a07c> <a07c> 12100
+<a07d> <a07d> 1873
+<a081> <a082> 1874
+<a083> <a084> 12101
+<a085> <a085> 1876
+<a086> <a088> 12103
+<a089> <a089> 1877
+<a08a> <a090> 12106
+<a091> <a091> 1878
+<a093> <a093> 1879
+<a094> <a094> 12113
+<a095> <a098> 1880
+<a099> <a09d> 12114
+<a0a1> <a0a2> 1884
+<a0a3> <a0a8> 12119
+<a0a9> <a0a9> 1886
+<a0aa> <a0b1> 12125
+<a0b3> <a0b6> 12133
+<a0b7> <a0b7> 1887
+<a0b8> <a0bd> 12137
+<a0c1> <a0d1> 12143
+endcidrange
+
+100 begincidrange
+<a0d3> <a0dd> 12160
+<a0e1> <a0e2> 1888
+<a0e3> <a0e4> 12171
+<a0e5> <a0e5> 1890
+<a0e6> <a0e8> 12173
+<a0e9> <a0e9> 1891
+<a0ea> <a0ea> 12176
+<a0eb> <a0eb> 1892
+<a0ec> <a0f0> 12177
+<a0f1> <a0f1> 1893
+<a0f3> <a0f3> 1894
+<a0f4> <a0f4> 12182
+<a0f5> <a0f5> 1895
+<a0f6> <a0f6> 12183
+<a0f7> <a0f8> 1896
+<a0f9> <a0fc> 12184
+<a0fd> <a0fd> 1898
+<a141> <a142> 1899
+<a143> <a144> 12188
+<a145> <a145> 1901
+<a146> <a148> 12190
+<a149> <a149> 1902
+<a14a> <a150> 12193
+<a151> <a151> 1903
+<a153> <a153> 1904
+<a154> <a154> 12200
+<a155> <a157> 1905
+<a158> <a15d> 12201
+<a161> <a162> 1908
+<a163> <a164> 12207
+<a165> <a165> 1910
+<a166> <a168> 12209
+<a169> <a169> 1911
+<a16a> <a171> 12212
+<a173> <a174> 12220
+<a175> <a177> 1912
+<a178> <a178> 12222
+<a179> <a179> 1915
+<a17a> <a17d> 12223
+<a181> <a181> 1916
+<a182> <a191> 12227
+<a193> <a19d> 12243
+<a1a1> <a1a2> 1917
+<a1a3> <a1a3> 12254
+<a1a4> <a1a5> 1919
+<a1a6> <a1a8> 12255
+<a1a9> <a1a9> 1921
+<a1aa> <a1aa> 12258
+<a1ab> <a1ab> 1922
+<a1ac> <a1b0> 12259
+<a1b1> <a1b1> 1923
+<a1b3> <a1b3> 1924
+<a1b4> <a1b4> 12264
+<a1b5> <a1b5> 1925
+<a1b6> <a1b6> 12265
+<a1b7> <a1b7> 1926
+<a1b8> <a1bd> 12266
+<a1c1> <a1c1> 1927
+<a1c2> <a1c4> 12272
+<a1c5> <a1c5> 1928
+<a1c6> <a1d1> 12275
+<a1d3> <a1d5> 12287
+<a1d6> <a1d7> 1929
+<a1d8> <a1dd> 12290
+<a1e1> <a1f1> 12296
+<a1f3> <a1fd> 12313
+<a241> <a241> 1931
+<a242> <a244> 12324
+<a245> <a245> 1932
+<a246> <a248> 12327
+<a249> <a249> 1933
+<a24a> <a251> 12330
+<a253> <a253> 1934
+<a254> <a254> 12338
+<a255> <a255> 1935
+<a256> <a256> 12339
+<a257> <a257> 1936
+<a258> <a25d> 12340
+<a261> <a261> 1937
+<a262> <a264> 12346
+<a265> <a265> 1938
+<a266> <a268> 12349
+<a269> <a269> 1939
+<a26a> <a271> 12352
+<a273> <a273> 1940
+<a274> <a274> 12360
+<a275> <a275> 1941
+<a276> <a27d> 12361
+<a281> <a283> 1942
+<a284> <a284> 12369
+<a285> <a285> 1945
+<a286> <a287> 12370
+<a288> <a28b> 1946
+<a28c> <a290> 12372
+<a291> <a291> 1950
+<a293> <a293> 1951
+<a294> <a294> 12377
+<a295> <a295> 1952
+<a296> <a296> 12378
+<a297> <a297> 1953
+endcidrange
+
+100 begincidrange
+<a298> <a29a> 12379
+<a29b> <a29b> 1954
+<a29c> <a29c> 12382
+<a29d> <a29d> 1955
+<a2a1> <a2a1> 1956
+<a2a2> <a2a4> 12383
+<a2a5> <a2a5> 1957
+<a2a6> <a2a8> 12386
+<a2a9> <a2a9> 1958
+<a2aa> <a2b1> 12389
+<a2b3> <a2b3> 1959
+<a2b4> <a2b4> 12397
+<a2b5> <a2b5> 1960
+<a2b6> <a2bd> 12398
+<a2c1> <a2c1> 1961
+<a2c2> <a2d1> 12406
+<a2d3> <a2dd> 12422
+<a2e1> <a2e1> 1962
+<a2e2> <a2e4> 12433
+<a2e5> <a2e5> 1963
+<a2e6> <a2e8> 12436
+<a2e9> <a2e9> 1964
+<a2ea> <a2f1> 12439
+<a2f3> <a2fd> 12447
+<a341> <a341> 1965
+<a342> <a344> 12458
+<a345> <a345> 1966
+<a346> <a348> 12461
+<a349> <a349> 1967
+<a34a> <a350> 12464
+<a351> <a351> 1968
+<a353> <a354> 12471
+<a355> <a355> 1969
+<a356> <a35d> 12473
+<a361> <a361> 1970
+<a362> <a364> 12481
+<a365> <a365> 1971
+<a366> <a368> 12484
+<a369> <a369> 1972
+<a36a> <a370> 12487
+<a371> <a371> 1973
+<a373> <a374> 12494
+<a375> <a375> 1974
+<a376> <a37d> 12496
+<a381> <a391> 12504
+<a393> <a39d> 12521
+<a3a1> <a3a2> 1975
+<a3a3> <a3a4> 12532
+<a3a5> <a3a5> 1977
+<a3a6> <a3a7> 12534
+<a3a8> <a3a9> 1978
+<a3aa> <a3aa> 12536
+<a3ab> <a3ab> 1980
+<a3ac> <a3b0> 12537
+<a3b1> <a3b1> 1981
+<a3b3> <a3b3> 1982
+<a3b4> <a3b4> 12542
+<a3b5> <a3b7> 1983
+<a3b8> <a3b8> 12543
+<a3b9> <a3b9> 1986
+<a3ba> <a3ba> 12544
+<a3bb> <a3bb> 1987
+<a3bc> <a3bd> 12545
+<a461> <a465> 1988
+<a466> <a467> 12547
+<a468> <a46c> 1993
+<a46d> <a470> 12549
+<a471> <a471> 1998
+<a473> <a473> 1999
+<a474> <a474> 12553
+<a475> <a475> 2000
+<a476> <a476> 12554
+<a477> <a477> 2001
+<a478> <a47a> 12555
+<a47b> <a47b> 2002
+<a47c> <a47d> 12558
+<a481> <a482> 2003
+<a483> <a484> 12560
+<a485> <a485> 2005
+<a486> <a488> 12562
+<a489> <a489> 2006
+<a48a> <a490> 12565
+<a491> <a491> 2007
+<a493> <a493> 2008
+<a494> <a494> 12572
+<a495> <a497> 2009
+<a498> <a49a> 12573
+<a49b> <a49b> 2012
+<a49c> <a49d> 12576
+<a4a1> <a4a2> 2013
+<a4a3> <a4a4> 12578
+<a4a5> <a4a5> 2015
+<a4a6> <a4b1> 12580
+<a4b3> <a4b3> 2016
+<a4b4> <a4bd> 12592
+<a4c1> <a4d1> 12602
+<a4d3> <a4dd> 12619
+<a4e1> <a4e2> 2017
+<a4e3> <a4e4> 12630
+<a4e5> <a4e5> 2019
+endcidrange
+
+100 begincidrange
+<a4e6> <a4e7> 12632
+<a4e8> <a4e9> 2020
+<a4ea> <a4ea> 12634
+<a4eb> <a4eb> 2022
+<a4ec> <a4f0> 12635
+<a4f1> <a4f1> 2023
+<a4f3> <a4f3> 2024
+<a4f4> <a4f4> 12640
+<a4f5> <a4f5> 2025
+<a4f6> <a4f6> 12641
+<a4f7> <a4f8> 2026
+<a4f9> <a4fd> 12642
+<a541> <a542> 2028
+<a543> <a544> 12647
+<a545> <a545> 2030
+<a546> <a547> 12649
+<a548> <a549> 2031
+<a54a> <a550> 12651
+<a551> <a551> 2033
+<a553> <a553> 2034
+<a554> <a554> 12658
+<a555> <a557> 2035
+<a558> <a55d> 12659
+<a561> <a562> 2038
+<a563> <a564> 12665
+<a565> <a565> 2040
+<a566> <a568> 12667
+<a569> <a569> 2041
+<a56a> <a571> 12670
+<a573> <a573> 2042
+<a574> <a574> 12678
+<a575> <a577> 2043
+<a578> <a57a> 12679
+<a57b> <a57b> 2046
+<a57c> <a57d> 12682
+<a581> <a581> 2047
+<a582> <a584> 12684
+<a585> <a585> 2048
+<a586> <a591> 12687
+<a593> <a59d> 12699
+<a5a1> <a5a3> 2049
+<a5a4> <a5a4> 12710
+<a5a5> <a5a5> 2052
+<a5a6> <a5a8> 12711
+<a5a9> <a5a9> 2053
+<a5aa> <a5b0> 12714
+<a5b1> <a5b1> 2054
+<a5b3> <a5b3> 2055
+<a5b4> <a5b4> 12721
+<a5b5> <a5b5> 2056
+<a5b6> <a5b6> 12722
+<a5b7> <a5b7> 2057
+<a5b8> <a5bd> 12723
+<a5c1> <a5c1> 2058
+<a5c2> <a5c4> 12729
+<a5c5> <a5c5> 2059
+<a5c6> <a5d1> 12732
+<a5d3> <a5d5> 12744
+<a5d6> <a5d6> 2060
+<a5d7> <a5dd> 12747
+<a5e1> <a5e1> 2061
+<a5e2> <a5f1> 12754
+<a5f3> <a5f5> 12770
+<a5f6> <a5f6> 2062
+<a5f7> <a5fd> 12773
+<a641> <a642> 2063
+<a643> <a644> 12780
+<a645> <a645> 2065
+<a646> <a648> 12782
+<a649> <a649> 2066
+<a64a> <a650> 12785
+<a651> <a651> 2067
+<a653> <a653> 2068
+<a654> <a65d> 12792
+<a661> <a661> 2069
+<a662> <a664> 12802
+<a665> <a665> 2070
+<a666> <a671> 12805
+<a673> <a67d> 12817
+<a681> <a682> 2071
+<a683> <a684> 12828
+<a685> <a685> 2073
+<a686> <a687> 12830
+<a688> <a68b> 2074
+<a68c> <a690> 12832
+<a691> <a691> 2078
+<a693> <a693> 2079
+<a694> <a694> 12837
+<a695> <a695> 2080
+<a696> <a696> 12838
+<a697> <a697> 2081
+<a698> <a69a> 12839
+<a69b> <a69c> 2082
+<a69d> <a69d> 12842
+<a6a1> <a6a1> 2084
+<a6a2> <a6a8> 12843
+<a6a9> <a6a9> 2085
+<a6aa> <a6b1> 12850
+<a6b3> <a6b5> 12858
+<a6b6> <a6b6> 2086
+endcidrange
+
+100 begincidrange
+<a6b7> <a6bd> 12861
+<a6c1> <a6c1> 2087
+<a6c2> <a6d1> 12868
+<a6d3> <a6dd> 12884
+<a6e1> <a6e2> 2088
+<a6e3> <a6e4> 12895
+<a6e5> <a6e5> 2090
+<a6e6> <a6e8> 12897
+<a6e9> <a6e9> 2091
+<a6ea> <a6f1> 12900
+<a6f3> <a6f6> 12908
+<a6f7> <a6f7> 2092
+<a6f8> <a6fd> 12912
+<a741> <a741> 2093
+<a742> <a744> 12918
+<a745> <a745> 2094
+<a746> <a748> 12921
+<a749> <a749> 2095
+<a74a> <a750> 12924
+<a751> <a751> 2096
+<a753> <a754> 12931
+<a755> <a755> 2097
+<a756> <a756> 12933
+<a757> <a757> 2098
+<a758> <a75d> 12934
+<a761> <a762> 2099
+<a763> <a764> 12940
+<a765> <a765> 2101
+<a766> <a768> 12942
+<a769> <a769> 2102
+<a76a> <a770> 12945
+<a771> <a771> 2103
+<a773> <a773> 2104
+<a774> <a774> 12952
+<a775> <a775> 2105
+<a776> <a77d> 12953
+<a781> <a791> 12961
+<a793> <a79d> 12978
+<a7a1> <a7a2> 2106
+<a7a3> <a7a4> 12989
+<a7a5> <a7a5> 2108
+<a7a6> <a7a8> 12991
+<a7a9> <a7a9> 2109
+<a7aa> <a7aa> 12994
+<a7ab> <a7ab> 2110
+<a7ac> <a7b0> 12995
+<a7b1> <a7b1> 2111
+<a7b3> <a7b3> 2112
+<a7b4> <a7b4> 13000
+<a7b5> <a7b5> 2113
+<a7b6> <a7b6> 13001
+<a7b7> <a7b9> 2114
+<a7ba> <a7bd> 13002
+<a861> <a862> 2117
+<a863> <a864> 13006
+<a865> <a865> 2119
+<a866> <a868> 13008
+<a869> <a869> 2120
+<a86a> <a86a> 13011
+<a86b> <a86b> 2121
+<a86c> <a870> 13012
+<a871> <a871> 2122
+<a873> <a873> 2123
+<a874> <a874> 13017
+<a875> <a877> 2124
+<a878> <a87c> 13018
+<a87d> <a87d> 2127
+<a881> <a882> 2128
+<a883> <a884> 13023
+<a885> <a885> 2130
+<a886> <a888> 13025
+<a889> <a889> 2131
+<a88a> <a890> 13028
+<a891> <a891> 2132
+<a893> <a893> 2133
+<a894> <a894> 13035
+<a895> <a897> 2134
+<a898> <a89d> 13036
+<a8a1> <a8a2> 2137
+<a8a3> <a8b0> 13042
+<a8b1> <a8b1> 2139
+<a8b3> <a8bd> 13056
+<a8c1> <a8d1> 13067
+<a8d3> <a8dd> 13084
+<a8e1> <a8e2> 2140
+<a8e3> <a8e4> 13095
+<a8e5> <a8e5> 2142
+<a8e6> <a8e7> 13097
+<a8e8> <a8e9> 2143
+<a8ea> <a8f0> 13099
+<a8f1> <a8f1> 2145
+<a8f3> <a8f4> 13106
+<a8f5> <a8f7> 2146
+<a8f8> <a8fd> 13108
+<a941> <a941> 2149
+<a942> <a951> 13114
+<a953> <a956> 13130
+<a957> <a957> 2150
+<a958> <a95d> 13134
+<a961> <a962> 2151
+endcidrange
+
+100 begincidrange
+<a963> <a970> 13140
+<a971> <a971> 2153
+<a973> <a973> 2154
+<a974> <a974> 13154
+<a975> <a977> 2155
+<a978> <a97d> 13155
+<a981> <a991> 13161
+<a993> <a99d> 13178
+<a9a1> <a9a2> 2158
+<a9a3> <a9a4> 13189
+<a9a5> <a9a5> 2160
+<a9a6> <a9a8> 13191
+<a9a9> <a9a9> 2161
+<a9aa> <a9b0> 13194
+<a9b1> <a9b1> 2162
+<a9b3> <a9b3> 2163
+<a9b4> <a9b6> 13201
+<a9b7> <a9b7> 2164
+<a9b8> <a9bd> 13204
+<a9c1> <a9d1> 13210
+<a9d3> <a9dd> 13227
+<a9e1> <a9f1> 13238
+<a9f3> <a9fd> 13255
+<aa41> <aa41> 2165
+<aa42> <aa51> 13266
+<aa53> <aa5d> 13282
+<aa61> <aa61> 2166
+<aa62> <aa71> 13293
+<aa73> <aa76> 13309
+<aa77> <aa77> 2167
+<aa78> <aa7d> 13313
+<aa81> <aa82> 2168
+<aa83> <aa84> 13319
+<aa85> <aa85> 2170
+<aa86> <aa88> 13321
+<aa89> <aa89> 2171
+<aa8a> <aa90> 13324
+<aa91> <aa91> 2172
+<aa93> <aa94> 13331
+<aa95> <aa95> 2173
+<aa96> <aa96> 13333
+<aa97> <aa97> 2174
+<aa98> <aa9d> 13334
+<aaa1> <aab1> 13340
+<aab3> <aabd> 13357
+<aac1> <aad1> 13368
+<aad3> <aadd> 13385
+<aae1> <aaf1> 13396
+<aaf3> <aafd> 13413
+<ab41> <ab41> 2175
+<ab42> <ab51> 13424
+<ab53> <ab56> 13440
+<ab57> <ab57> 2176
+<ab58> <ab5d> 13444
+<ab61> <ab61> 2177
+<ab62> <ab64> 13450
+<ab65> <ab65> 2178
+<ab66> <ab68> 13453
+<ab69> <ab69> 2179
+<ab6a> <ab70> 13456
+<ab71> <ab71> 2180
+<ab73> <ab73> 2181
+<ab74> <ab7d> 13463
+<ab81> <ab91> 13473
+<ab93> <ab9d> 13490
+<aba1> <aba2> 2182
+<aba3> <aba4> 13501
+<aba5> <aba5> 2184
+<aba6> <aba8> 13503
+<aba9> <aba9> 2185
+<abaa> <abb0> 13506
+<abb1> <abb1> 2186
+<abb3> <abb3> 2187
+<abb4> <abb4> 13513
+<abb5> <abb5> 2188
+<abb6> <abb6> 13514
+<abb7> <abb7> 2189
+<abb8> <abbd> 13515
+<ac61> <ac62> 2190
+<ac63> <ac63> 13521
+<ac64> <ac65> 2192
+<ac66> <ac67> 13522
+<ac68> <ac6b> 2194
+<ac6c> <ac70> 13524
+<ac71> <ac71> 2198
+<ac73> <ac73> 2199
+<ac74> <ac74> 13529
+<ac75> <ac77> 2200
+<ac78> <ac7a> 13530
+<ac7b> <ac7b> 2203
+<ac7c> <ac7d> 13533
+<ac81> <ac82> 2204
+<ac83> <ac84> 13535
+<ac85> <ac85> 2206
+<ac86> <ac88> 13537
+<ac89> <ac89> 2207
+<ac8a> <ac90> 13540
+<ac91> <ac91> 2208
+<ac93> <ac93> 2209
+<ac94> <ac94> 13547
+endcidrange
+
+100 begincidrange
+<ac95> <ac97> 2210
+<ac98> <ac9d> 13548
+<aca1> <aca2> 2213
+<aca3> <aca4> 13554
+<aca5> <aca5> 2215
+<aca6> <aca8> 13556
+<aca9> <aca9> 2216
+<acaa> <acb0> 13559
+<acb1> <acb1> 2217
+<acb3> <acb3> 2218
+<acb4> <acb4> 13566
+<acb5> <acb5> 2219
+<acb6> <acb6> 13567
+<acb7> <acb7> 2220
+<acb8> <acbd> 13568
+<acc1> <acc1> 2221
+<acc2> <acc4> 13574
+<acc5> <acc5> 2222
+<acc6> <acc8> 13577
+<acc9> <acc9> 2223
+<acca> <acd0> 13580
+<acd1> <acd1> 2224
+<acd3> <acd6> 13587
+<acd7> <acd7> 2225
+<acd8> <acdd> 13591
+<ace1> <ace5> 2226
+<ace6> <ace7> 13597
+<ace8> <ace9> 2231
+<acea> <acea> 13599
+<aceb> <acec> 2233
+<aced> <acf0> 13600
+<acf1> <acf1> 2235
+<acf3> <acf3> 2236
+<acf4> <acf4> 13604
+<acf5> <acf7> 2237
+<acf8> <acfb> 13605
+<acfc> <acfc> 2240
+<acfd> <acfd> 13609
+<ad41> <ad42> 2241
+<ad43> <ad44> 13610
+<ad45> <ad45> 2243
+<ad46> <ad48> 13612
+<ad49> <ad49> 2244
+<ad4a> <ad50> 13615
+<ad51> <ad51> 2245
+<ad53> <ad53> 2246
+<ad54> <ad54> 13622
+<ad55> <ad57> 2247
+<ad58> <ad5d> 13623
+<ad61> <ad62> 2250
+<ad63> <ad64> 13629
+<ad65> <ad65> 2252
+<ad66> <ad68> 13631
+<ad69> <ad69> 2253
+<ad6a> <ad70> 13634
+<ad71> <ad71> 2254
+<ad73> <ad73> 2255
+<ad74> <ad74> 13641
+<ad75> <ad77> 2256
+<ad78> <ad7d> 13642
+<ad81> <ad81> 2259
+<ad82> <ad84> 13648
+<ad85> <ad85> 2260
+<ad86> <ad88> 13651
+<ad89> <ad89> 2261
+<ad8a> <ad91> 13654
+<ad93> <ad96> 13662
+<ad97> <ad97> 2262
+<ad98> <ad9d> 13666
+<ada1> <ada3> 2263
+<ada4> <ada4> 13672
+<ada5> <ada5> 2266
+<ada6> <ada8> 13673
+<ada9> <ada9> 2267
+<adaa> <adaa> 13676
+<adab> <adab> 2268
+<adac> <adb0> 13677
+<adb1> <adb1> 2269
+<adb3> <adb3> 2270
+<adb4> <adb4> 13682
+<adb5> <adb5> 2271
+<adb6> <adb6> 13683
+<adb7> <adb7> 2272
+<adb8> <adba> 13684
+<adbb> <adbb> 2273
+<adbc> <adbd> 13687
+<adc1> <adc2> 2274
+<adc3> <adc4> 13689
+<adc5> <adc5> 2276
+<adc6> <adc8> 13691
+<adc9> <adc9> 2277
+<adca> <add1> 13694
+<add3> <add6> 13702
+<add7> <add7> 2278
+<add8> <addd> 13706
+<ade1> <ade1> 2279
+<ade2> <ade4> 13712
+<ade5> <ade5> 2280
+<ade6> <ade8> 13715
+<ade9> <ade9> 2281
+endcidrange
+
+100 begincidrange
+<adea> <adf0> 13718
+<adf1> <adf1> 2282
+<adf3> <adf4> 13725
+<adf5> <adf6> 2283
+<adf7> <adfd> 13727
+<ae41> <ae41> 2285
+<ae42> <ae44> 13734
+<ae45> <ae45> 2286
+<ae46> <ae48> 13737
+<ae49> <ae49> 2287
+<ae4a> <ae50> 13740
+<ae51> <ae51> 2288
+<ae53> <ae53> 2289
+<ae54> <ae54> 13747
+<ae55> <ae55> 2290
+<ae56> <ae5d> 13748
+<ae61> <ae62> 2291
+<ae63> <ae64> 13756
+<ae65> <ae65> 2293
+<ae66> <ae68> 13758
+<ae69> <ae69> 2294
+<ae6a> <ae70> 13761
+<ae71> <ae71> 2295
+<ae73> <ae73> 2296
+<ae74> <ae74> 13768
+<ae75> <ae75> 2297
+<ae76> <ae76> 13769
+<ae77> <ae77> 2298
+<ae78> <ae7d> 13770
+<ae81> <ae82> 2299
+<ae83> <ae84> 13776
+<ae85> <ae85> 2301
+<ae86> <ae87> 13778
+<ae88> <ae89> 2302
+<ae8a> <ae90> 13780
+<ae91> <ae91> 2304
+<ae93> <ae93> 2305
+<ae94> <ae94> 13787
+<ae95> <ae95> 2306
+<ae96> <ae96> 13788
+<ae97> <ae97> 2307
+<ae98> <ae98> 13789
+<ae99> <ae99> 2308
+<ae9a> <ae9a> 13790
+<ae9b> <ae9c> 2309
+<ae9d> <ae9d> 13791
+<aea1> <aea1> 2311
+<aea2> <aeb1> 13792
+<aeb3> <aeb5> 13808
+<aeb6> <aeb6> 2312
+<aeb7> <aebd> 13811
+<aec1> <aec2> 2313
+<aec3> <aec4> 13818
+<aec5> <aec5> 2315
+<aec6> <aec8> 13820
+<aec9> <aec9> 2316
+<aeca> <aed0> 13823
+<aed1> <aed1> 2317
+<aed3> <aed6> 13830
+<aed7> <aed7> 2318
+<aed8> <aedd> 13834
+<aee1> <aee2> 2319
+<aee3> <aee4> 13840
+<aee5> <aee5> 2321
+<aee6> <aee8> 13842
+<aee9> <aee9> 2322
+<aeea> <aef0> 13845
+<aef1> <aef1> 2323
+<aef3> <aef3> 2324
+<aef4> <aef4> 13852
+<aef5> <aef5> 2325
+<aef6> <aef6> 13853
+<aef7> <aef7> 2326
+<aef8> <aefd> 13854
+<af41> <af42> 2327
+<af43> <af48> 13860
+<af49> <af49> 2329
+<af4a> <af50> 13866
+<af51> <af51> 2330
+<af53> <af54> 13873
+<af55> <af55> 2331
+<af56> <af56> 13875
+<af57> <af57> 2332
+<af58> <af5d> 13876
+<af61> <af62> 2333
+<af63> <af64> 13882
+<af65> <af65> 2335
+<af66> <af68> 13884
+<af69> <af6a> 2336
+<af6b> <af70> 13887
+<af71> <af71> 2338
+<af73> <af73> 2339
+<af74> <af74> 13893
+<af75> <af75> 2340
+<af76> <af76> 13894
+<af77> <af77> 2341
+<af78> <af7d> 13895
+<af81> <af91> 13901
+<af93> <af9d> 13918
+<afa1> <afa2> 2342
+endcidrange
+
+100 begincidrange
+<afa3> <afa4> 13929
+<afa5> <afa5> 2344
+<afa6> <afa7> 13931
+<afa8> <afa9> 2345
+<afaa> <afaf> 13933
+<afb0> <afb1> 2347
+<afb3> <afb3> 2349
+<afb4> <afb4> 13939
+<afb5> <afb5> 2350
+<afb6> <afb6> 13940
+<afb7> <afb7> 2351
+<afb8> <afbb> 13941
+<afbc> <afbc> 2352
+<afbd> <afbd> 13945
+<b061> <b062> 2353
+<b063> <b063> 13946
+<b064> <b065> 2355
+<b066> <b068> 13947
+<b069> <b069> 2357
+<b06a> <b070> 13950
+<b071> <b071> 2358
+<b073> <b073> 2359
+<b074> <b075> 13957
+<b076> <b077> 2360
+<b078> <b07c> 13959
+<b07d> <b07d> 2362
+<b081> <b082> 2363
+<b083> <b084> 13964
+<b085> <b085> 2365
+<b086> <b088> 13966
+<b089> <b089> 2366
+<b08a> <b090> 13969
+<b091> <b091> 2367
+<b093> <b093> 2368
+<b094> <b095> 13976
+<b096> <b097> 2369
+<b098> <b09d> 13978
+<b0a1> <b0b1> 13984
+<b0b3> <b0b6> 14001
+<b0b7> <b0b7> 2371
+<b0b8> <b0bd> 14005
+<b0c1> <b0d1> 14011
+<b0d3> <b0dd> 14028
+<b0e1> <b0e2> 2372
+<b0e3> <b0e4> 14039
+<b0e5> <b0e5> 2374
+<b0e6> <b0e8> 14041
+<b0e9> <b0e9> 2375
+<b0ea> <b0ea> 14044
+<b0eb> <b0eb> 2376
+<b0ec> <b0f0> 14045
+<b0f1> <b0f1> 2377
+<b0f3> <b0f3> 2378
+<b0f4> <b0f5> 14050
+<b0f6> <b0f7> 2379
+<b0f8> <b0fd> 14052
+<b141> <b141> 2381
+<b142> <b144> 14058
+<b145> <b145> 2382
+<b146> <b148> 14061
+<b149> <b149> 2383
+<b14a> <b151> 14064
+<b153> <b15d> 14072
+<b161> <b171> 14083
+<b173> <b17d> 14100
+<b181> <b184> 14111
+<b185> <b185> 2384
+<b186> <b191> 14115
+<b193> <b19d> 14127
+<b1a1> <b1a2> 2385
+<b1a3> <b1a4> 14138
+<b1a5> <b1a5> 2387
+<b1a6> <b1a7> 14140
+<b1a8> <b1a9> 2388
+<b1aa> <b1aa> 14142
+<b1ab> <b1ab> 2390
+<b1ac> <b1b0> 14143
+<b1b1> <b1b1> 2391
+<b1b3> <b1b3> 2392
+<b1b4> <b1b6> 14148
+<b1b7> <b1b7> 2393
+<b1b8> <b1bd> 14151
+<b1c1> <b1c2> 2394
+<b1c3> <b1c4> 14157
+<b1c5> <b1c5> 2396
+<b1c6> <b1d1> 14159
+<b1d3> <b1d5> 14171
+<b1d6> <b1d6> 2397
+<b1d7> <b1dd> 14174
+<b1e1> <b1e1> 2398
+<b1e2> <b1f1> 14181
+<b1f3> <b1f5> 14197
+<b1f6> <b1f6> 2399
+<b1f7> <b1fd> 14200
+<b241> <b241> 2400
+<b242> <b244> 14207
+<b245> <b245> 2401
+<b246> <b248> 14210
+<b249> <b249> 2402
+<b24a> <b250> 14213
+endcidrange
+
+100 begincidrange
+<b251> <b251> 2403
+<b253> <b253> 2404
+<b254> <b25d> 14220
+<b261> <b261> 2405
+<b262> <b271> 14230
+<b273> <b27d> 14246
+<b281> <b282> 2406
+<b283> <b284> 14257
+<b285> <b285> 2408
+<b286> <b288> 14259
+<b289> <b289> 2409
+<b28a> <b290> 14262
+<b291> <b291> 2410
+<b293> <b293> 2411
+<b294> <b296> 14269
+<b297> <b297> 2412
+<b298> <b29d> 14272
+<b2a1> <b2a1> 2413
+<b2a2> <b2b1> 14278
+<b2b3> <b2b5> 14294
+<b2b6> <b2b6> 2414
+<b2b7> <b2bd> 14297
+<b2c1> <b2c1> 2415
+<b2c2> <b2d1> 14304
+<b2d3> <b2dd> 14320
+<b2e1> <b2e1> 2416
+<b2e2> <b2e4> 14331
+<b2e5> <b2e5> 2417
+<b2e6> <b2f1> 14334
+<b2f3> <b2fd> 14346
+<b341> <b351> 14357
+<b353> <b356> 14374
+<b357> <b357> 2418
+<b358> <b35d> 14378
+<b361> <b362> 2419
+<b363> <b364> 14384
+<b365> <b365> 2421
+<b366> <b368> 14386
+<b369> <b369> 2422
+<b36a> <b36a> 14389
+<b36b> <b36b> 2423
+<b36c> <b36f> 14390
+<b370> <b371> 2424
+<b373> <b373> 2426
+<b374> <b37d> 14394
+<b381> <b381> 2427
+<b382> <b384> 14404
+<b385> <b385> 2428
+<b386> <b388> 14407
+<b389> <b389> 2429
+<b38a> <b390> 14410
+<b391> <b391> 2430
+<b393> <b39d> 14417
+<b3a1> <b3a2> 2431
+<b3a3> <b3a4> 14428
+<b3a5> <b3a5> 2433
+<b3a6> <b3a8> 14430
+<b3a9> <b3a9> 2434
+<b3aa> <b3b0> 14433
+<b3b1> <b3b1> 2435
+<b3b3> <b3b3> 2436
+<b3b4> <b3b4> 14440
+<b3b5> <b3b5> 2437
+<b3b6> <b3b6> 14441
+<b3b7> <b3b7> 2438
+<b3b8> <b3bd> 14442
+<b461> <b462> 2439
+<b463> <b464> 14448
+<b465> <b467> 2441
+<b468> <b468> 14450
+<b469> <b46b> 2444
+<b46c> <b46f> 14451
+<b470> <b471> 2447
+<b473> <b473> 2449
+<b474> <b474> 14455
+<b475> <b477> 2450
+<b478> <b47a> 14456
+<b47b> <b47c> 2453
+<b47d> <b47d> 14459
+<b481> <b482> 2455
+<b483> <b484> 14460
+<b485> <b485> 2457
+<b486> <b488> 14462
+<b489> <b489> 2458
+<b48a> <b490> 14465
+<b491> <b491> 2459
+<b493> <b493> 2460
+<b494> <b494> 14472
+<b495> <b497> 2461
+<b498> <b49d> 14473
+<b4a1> <b4a2> 2464
+<b4a3> <b4a4> 14479
+<b4a5> <b4a5> 2466
+<b4a6> <b4a8> 14481
+<b4a9> <b4a9> 2467
+<b4aa> <b4ab> 14484
+<b4ac> <b4ac> 2468
+<b4ad> <b4b0> 14486
+<b4b1> <b4b1> 2469
+<b4b3> <b4b3> 2470
+endcidrange
+
+100 begincidrange
+<b4b4> <b4b4> 14490
+<b4b5> <b4b5> 2471
+<b4b6> <b4b6> 14491
+<b4b7> <b4b7> 2472
+<b4b8> <b4ba> 14492
+<b4bb> <b4bb> 2473
+<b4bc> <b4bc> 14495
+<b4bd> <b4bd> 2474
+<b4c1> <b4c1> 2475
+<b4c2> <b4c4> 14496
+<b4c5> <b4c5> 2476
+<b4c6> <b4c8> 14499
+<b4c9> <b4c9> 2477
+<b4ca> <b4d1> 14502
+<b4d3> <b4d3> 2478
+<b4d4> <b4dd> 14510
+<b4e1> <b4e2> 2479
+<b4e3> <b4e4> 14520
+<b4e5> <b4e6> 2481
+<b4e7> <b4e7> 14522
+<b4e8> <b4eb> 2483
+<b4ec> <b4f0> 14523
+<b4f1> <b4f1> 2487
+<b4f3> <b4f8> 2488
+<b4f9> <b4f9> 14528
+<b4fa> <b4fa> 2494
+<b4fb> <b4fb> 14529
+<b4fc> <b4fc> 2495
+<b4fd> <b4fd> 14530
+<b541> <b542> 2496
+<b543> <b544> 14531
+<b545> <b545> 2498
+<b546> <b548> 14533
+<b549> <b549> 2499
+<b54a> <b550> 14536
+<b551> <b551> 2500
+<b553> <b553> 2501
+<b554> <b554> 14543
+<b555> <b555> 2502
+<b556> <b556> 14544
+<b557> <b557> 2503
+<b558> <b55d> 14545
+<b561> <b563> 2504
+<b564> <b564> 14551
+<b565> <b565> 2507
+<b566> <b568> 14552
+<b569> <b569> 2508
+<b56a> <b56a> 14555
+<b56b> <b56c> 2509
+<b56d> <b570> 14556
+<b571> <b571> 2511
+<b573> <b577> 2512
+<b578> <b57a> 14560
+<b57b> <b57d> 2517
+<b581> <b581> 2520
+<b582> <b584> 14563
+<b585> <b585> 2521
+<b586> <b588> 14566
+<b589> <b589> 2522
+<b58a> <b590> 14569
+<b591> <b591> 2523
+<b593> <b593> 2524
+<b594> <b594> 14576
+<b595> <b596> 2525
+<b597> <b59d> 14577
+<b5a1> <b5a2> 2527
+<b5a3> <b5a4> 14584
+<b5a5> <b5a5> 2529
+<b5a6> <b5a8> 14586
+<b5a9> <b5ab> 2530
+<b5ac> <b5ac> 14589
+<b5ad> <b5ad> 2533
+<b5ae> <b5af> 14590
+<b5b0> <b5b1> 2534
+<b5b3> <b5b3> 2536
+<b5b4> <b5b4> 14592
+<b5b5> <b5b5> 2537
+<b5b6> <b5b6> 14593
+<b5b7> <b5b7> 2538
+<b5b8> <b5b8> 14594
+<b5b9> <b5b9> 2539
+<b5ba> <b5bd> 14595
+<b5c1> <b5c2> 2540
+<b5c3> <b5c4> 14599
+<b5c5> <b5c5> 2542
+<b5c6> <b5c8> 14601
+<b5c9> <b5c9> 2543
+<b5ca> <b5d0> 14604
+<b5d1> <b5d1> 2544
+<b5d3> <b5d3> 2545
+<b5d4> <b5d4> 14611
+<b5d5> <b5d7> 2546
+<b5d8> <b5dd> 14612
+<b5e1> <b5e2> 2549
+<b5e3> <b5e4> 14618
+<b5e5> <b5e5> 2551
+<b5e6> <b5f0> 14620
+<b5f1> <b5f1> 2552
+<b5f3> <b5f4> 14631
+<b5f5> <b5f5> 2553
+endcidrange
+
+100 begincidrange
+<b5f6> <b5f6> 14633
+<b5f7> <b5f7> 2554
+<b5f8> <b5fd> 14634
+<b641> <b642> 2555
+<b643> <b644> 14640
+<b645> <b645> 2557
+<b646> <b648> 14642
+<b649> <b649> 2558
+<b64a> <b650> 14645
+<b651> <b651> 2559
+<b653> <b653> 2560
+<b654> <b654> 14652
+<b655> <b655> 2561
+<b656> <b656> 14653
+<b657> <b657> 2562
+<b658> <b65d> 14654
+<b661> <b662> 2563
+<b663> <b664> 14660
+<b665> <b665> 2565
+<b666> <b668> 14662
+<b669> <b669> 2566
+<b66a> <b670> 14665
+<b671> <b671> 2567
+<b673> <b673> 2568
+<b674> <b674> 14672
+<b675> <b675> 2569
+<b676> <b676> 14673
+<b677> <b677> 2570
+<b678> <b67d> 14674
+<b681> <b682> 2571
+<b683> <b684> 14680
+<b685> <b685> 2573
+<b686> <b688> 14682
+<b689> <b68b> 2574
+<b68c> <b690> 14685
+<b691> <b691> 2577
+<b693> <b693> 2578
+<b694> <b694> 14690
+<b695> <b695> 2579
+<b696> <b696> 14691
+<b697> <b697> 2580
+<b698> <b69d> 14692
+<b6a1> <b6a2> 2581
+<b6a3> <b6a4> 14698
+<b6a5> <b6a5> 2583
+<b6a6> <b6a8> 14700
+<b6a9> <b6a9> 2584
+<b6aa> <b6b0> 14703
+<b6b1> <b6b1> 2585
+<b6b3> <b6b3> 2586
+<b6b4> <b6b5> 14710
+<b6b6> <b6b7> 2587
+<b6b8> <b6bd> 14712
+<b6c1> <b6c2> 2589
+<b6c3> <b6c4> 14718
+<b6c5> <b6c5> 2591
+<b6c6> <b6c8> 14720
+<b6c9> <b6c9> 2592
+<b6ca> <b6d0> 14723
+<b6d1> <b6d1> 2593
+<b6d3> <b6d3> 2594
+<b6d4> <b6d6> 14730
+<b6d7> <b6d7> 2595
+<b6d8> <b6dd> 14733
+<b6e1> <b6e2> 2596
+<b6e3> <b6e4> 14739
+<b6e5> <b6e5> 2598
+<b6e6> <b6e8> 14741
+<b6e9> <b6e9> 2599
+<b6ea> <b6f0> 14744
+<b6f1> <b6f1> 2600
+<b6f3> <b6f3> 2601
+<b6f4> <b6f4> 14751
+<b6f5> <b6f5> 2602
+<b6f6> <b6f6> 14752
+<b6f7> <b6f7> 2603
+<b6f8> <b6fd> 14753
+<b741> <b742> 2604
+<b743> <b744> 14759
+<b745> <b745> 2606
+<b746> <b748> 14761
+<b749> <b749> 2607
+<b74a> <b750> 14764
+<b751> <b751> 2608
+<b753> <b753> 2609
+<b754> <b754> 14771
+<b755> <b755> 2610
+<b756> <b756> 14772
+<b757> <b757> 2611
+<b758> <b758> 14773
+<b759> <b759> 2612
+<b75a> <b75d> 14774
+<b761> <b762> 2613
+<b763> <b764> 14778
+<b765> <b765> 2615
+<b766> <b768> 14780
+<b769> <b769> 2616
+<b76a> <b76e> 14783
+<b76f> <b76f> 2617
+<b770> <b770> 14788
+endcidrange
+
+100 begincidrange
+<b771> <b771> 2618
+<b773> <b773> 2619
+<b774> <b774> 14789
+<b775> <b775> 2620
+<b776> <b776> 14790
+<b777> <b77d> 2621
+<b781> <b781> 2628
+<b782> <b784> 14791
+<b785> <b785> 2629
+<b786> <b788> 14794
+<b789> <b789> 2630
+<b78a> <b790> 14797
+<b791> <b791> 2631
+<b793> <b794> 14804
+<b795> <b795> 2632
+<b796> <b79d> 14806
+<b7a1> <b7a2> 2633
+<b7a3> <b7a4> 14814
+<b7a5> <b7a5> 2635
+<b7a6> <b7a8> 14816
+<b7a9> <b7ab> 2636
+<b7ac> <b7af> 14819
+<b7b0> <b7b1> 2639
+<b7b3> <b7b3> 2641
+<b7b4> <b7b4> 14823
+<b7b5> <b7b8> 2642
+<b7b9> <b7bb> 14824
+<b7bc> <b7bc> 2646
+<b7bd> <b7bd> 14827
+<b861> <b862> 2647
+<b863> <b864> 14828
+<b865> <b865> 2649
+<b866> <b866> 14830
+<b867> <b869> 2650
+<b86a> <b86a> 14831
+<b86b> <b86b> 2653
+<b86c> <b870> 14832
+<b871> <b871> 2654
+<b873> <b873> 2655
+<b874> <b874> 14837
+<b875> <b878> 2656
+<b879> <b87d> 14838
+<b881> <b882> 2660
+<b883> <b884> 14843
+<b885> <b885> 2662
+<b886> <b888> 14845
+<b889> <b889> 2663
+<b88a> <b890> 14848
+<b891> <b891> 2664
+<b893> <b893> 2665
+<b894> <b894> 14855
+<b895> <b897> 2666
+<b898> <b89d> 14856
+<b8a1> <b8a2> 2669
+<b8a3> <b8a4> 14862
+<b8a5> <b8a5> 2671
+<b8a6> <b8a6> 14864
+<b8a7> <b8a7> 2672
+<b8a8> <b8a8> 14865
+<b8a9> <b8a9> 2673
+<b8aa> <b8b0> 14866
+<b8b1> <b8b1> 2674
+<b8b3> <b8b6> 14873
+<b8b7> <b8b7> 2675
+<b8b8> <b8bd> 14877
+<b8c1> <b8c1> 2676
+<b8c2> <b8c4> 14883
+<b8c5> <b8c5> 2677
+<b8c6> <b8c8> 14886
+<b8c9> <b8c9> 2678
+<b8ca> <b8d1> 14889
+<b8d3> <b8dd> 14897
+<b8e1> <b8e2> 2679
+<b8e3> <b8e4> 14908
+<b8e5> <b8e5> 2681
+<b8e6> <b8e8> 14910
+<b8e9> <b8e9> 2682
+<b8ea> <b8ea> 14913
+<b8eb> <b8eb> 2683
+<b8ec> <b8f0> 14914
+<b8f1> <b8f1> 2684
+<b8f3> <b8f3> 2685
+<b8f4> <b8f4> 14919
+<b8f5> <b8f5> 2686
+<b8f6> <b8f6> 14920
+<b8f7> <b8f8> 2687
+<b8f9> <b8fd> 14921
+<b941> <b942> 2689
+<b943> <b944> 14926
+<b945> <b945> 2691
+<b946> <b948> 14928
+<b949> <b949> 2692
+<b94a> <b950> 14931
+<b951> <b951> 2693
+<b953> <b953> 2694
+<b954> <b954> 14938
+<b955> <b955> 2695
+<b956> <b956> 14939
+<b957> <b957> 2696
+<b958> <b95d> 14940
+endcidrange
+
+100 begincidrange
+<b961> <b961> 2697
+<b962> <b964> 14946
+<b965> <b965> 2698
+<b966> <b968> 14949
+<b969> <b969> 2699
+<b96a> <b970> 14952
+<b971> <b971> 2700
+<b973> <b973> 2701
+<b974> <b975> 14959
+<b976> <b977> 2702
+<b978> <b97d> 14961
+<b981> <b981> 2704
+<b982> <b991> 14967
+<b993> <b99d> 14983
+<b9a1> <b9a2> 2705
+<b9a3> <b9a4> 14994
+<b9a5> <b9a5> 2707
+<b9a6> <b9a8> 14996
+<b9a9> <b9a9> 2708
+<b9aa> <b9aa> 14999
+<b9ab> <b9ab> 2709
+<b9ac> <b9b0> 15000
+<b9b1> <b9b1> 2710
+<b9b3> <b9b3> 2711
+<b9b4> <b9b4> 15005
+<b9b5> <b9b5> 2712
+<b9b6> <b9b6> 15006
+<b9b7> <b9b9> 2713
+<b9ba> <b9bc> 15007
+<b9bd> <b9bd> 2716
+<b9c1> <b9c2> 2717
+<b9c3> <b9c8> 15010
+<b9c9> <b9c9> 2719
+<b9ca> <b9d1> 15016
+<b9d3> <b9d3> 2720
+<b9d4> <b9d4> 15024
+<b9d5> <b9d5> 2721
+<b9d6> <b9d6> 15025
+<b9d7> <b9d7> 2722
+<b9d8> <b9dd> 15026
+<b9e1> <b9e1> 2723
+<b9e2> <b9f1> 15032
+<b9f3> <b9f5> 15048
+<b9f6> <b9f7> 2724
+<b9f8> <b9fd> 15051
+<ba41> <ba41> 2726
+<ba42> <ba44> 15057
+<ba45> <ba45> 2727
+<ba46> <ba48> 15060
+<ba49> <ba49> 2728
+<ba4a> <ba50> 15063
+<ba51> <ba51> 2729
+<ba53> <ba53> 2730
+<ba54> <ba54> 15070
+<ba55> <ba55> 2731
+<ba56> <ba56> 15071
+<ba57> <ba57> 2732
+<ba58> <ba5d> 15072
+<ba61> <ba62> 2733
+<ba63> <ba64> 15078
+<ba65> <ba65> 2735
+<ba66> <ba71> 15080
+<ba73> <ba76> 15092
+<ba77> <ba77> 2736
+<ba78> <ba7d> 15096
+<ba81> <ba82> 2737
+<ba83> <ba84> 15102
+<ba85> <ba85> 2739
+<ba86> <ba88> 15104
+<ba89> <ba8b> 2740
+<ba8c> <ba90> 15107
+<ba91> <ba91> 2743
+<ba93> <ba93> 2744
+<ba94> <ba94> 15112
+<ba95> <ba95> 2745
+<ba96> <ba96> 15113
+<ba97> <ba97> 2746
+<ba98> <ba9d> 15114
+<baa1> <baa1> 2747
+<baa2> <bab1> 15120
+<bab3> <bab5> 15136
+<bab6> <bab6> 2748
+<bab7> <babd> 15139
+<bac1> <bac1> 2749
+<bac2> <bad1> 15146
+<bad3> <badd> 15162
+<bae1> <bae2> 2750
+<bae3> <bae4> 15173
+<bae5> <bae5> 2752
+<bae6> <bae8> 15175
+<bae9> <bae9> 2753
+<baea> <baf0> 15178
+<baf1> <baf1> 2754
+<baf3> <baf3> 2755
+<baf4> <baf4> 15185
+<baf5> <baf5> 2756
+<baf6> <bafd> 15186
+<bb41> <bb41> 2757
+<bb42> <bb44> 15194
+<bb45> <bb45> 2758
+endcidrange
+
+100 begincidrange
+<bb46> <bb48> 15197
+<bb49> <bb49> 2759
+<bb4a> <bb50> 15200
+<bb51> <bb51> 2760
+<bb53> <bb5d> 15207
+<bb61> <bb62> 2761
+<bb63> <bb64> 15218
+<bb65> <bb65> 2763
+<bb66> <bb68> 15220
+<bb69> <bb69> 2764
+<bb6a> <bb70> 15223
+<bb71> <bb71> 2765
+<bb73> <bb73> 2766
+<bb74> <bb74> 15230
+<bb75> <bb75> 2767
+<bb76> <bb76> 15231
+<bb77> <bb77> 2768
+<bb78> <bb7d> 15232
+<bb81> <bb91> 15238
+<bb93> <bb9d> 15255
+<bba1> <bba2> 2769
+<bba3> <bba4> 15266
+<bba5> <bba5> 2771
+<bba6> <bba7> 15268
+<bba8> <bba9> 2772
+<bbaa> <bbaa> 15270
+<bbab> <bbab> 2774
+<bbac> <bbb0> 15271
+<bbb1> <bbb1> 2775
+<bbb3> <bbb3> 2776
+<bbb4> <bbb4> 15276
+<bbb5> <bbb5> 2777
+<bbb6> <bbb6> 15277
+<bbb7> <bbb8> 2778
+<bbb9> <bbba> 15278
+<bbbb> <bbbc> 2780
+<bbbd> <bbbd> 15280
+<bc61> <bc62> 2782
+<bc63> <bc64> 15281
+<bc65> <bc65> 2784
+<bc66> <bc66> 15283
+<bc67> <bc67> 2785
+<bc68> <bc68> 15284
+<bc69> <bc69> 2786
+<bc6a> <bc6b> 15285
+<bc6c> <bc6c> 2787
+<bc6d> <bc70> 15287
+<bc71> <bc71> 2788
+<bc73> <bc73> 2789
+<bc74> <bc74> 15291
+<bc75> <bc77> 2790
+<bc78> <bc7d> 15292
+<bc81> <bc82> 2793
+<bc83> <bc84> 15298
+<bc85> <bc85> 2795
+<bc86> <bc88> 15300
+<bc89> <bc89> 2796
+<bc8a> <bc90> 15303
+<bc91> <bc91> 2797
+<bc93> <bc93> 2798
+<bc94> <bc94> 15310
+<bc95> <bc97> 2799
+<bc98> <bc9d> 15311
+<bca1> <bca1> 2802
+<bca2> <bca4> 15317
+<bca5> <bca5> 2803
+<bca6> <bcb1> 15320
+<bcb3> <bcb6> 15332
+<bcb7> <bcb7> 2804
+<bcb8> <bcbd> 15336
+<bcc1> <bcd1> 15342
+<bcd3> <bcdd> 15359
+<bce1> <bce2> 2805
+<bce3> <bce4> 15370
+<bce5> <bce5> 2807
+<bce6> <bce8> 15372
+<bce9> <bce9> 2808
+<bcea> <bcf0> 15375
+<bcf1> <bcf1> 2809
+<bcf3> <bcf3> 2810
+<bcf4> <bcf4> 15382
+<bcf5> <bcf7> 2811
+<bcf8> <bcfd> 15383
+<bd41> <bd41> 2814
+<bd42> <bd51> 15389
+<bd53> <bd56> 15405
+<bd57> <bd57> 2815
+<bd58> <bd5d> 15409
+<bd61> <bd61> 2816
+<bd62> <bd71> 15415
+<bd73> <bd75> 15431
+<bd76> <bd76> 2817
+<bd77> <bd7d> 15434
+<bd81> <bd91> 15441
+<bd93> <bd9d> 15458
+<bda1> <bda2> 2818
+<bda3> <bda4> 15469
+<bda5> <bda5> 2820
+<bda6> <bda8> 15471
+<bda9> <bda9> 2821
+endcidrange
+
+100 begincidrange
+<bdaa> <bdb0> 15474
+<bdb1> <bdb1> 2822
+<bdb3> <bdb3> 2823
+<bdb4> <bdb4> 15481
+<bdb5> <bdb5> 2824
+<bdb6> <bdb6> 15482
+<bdb7> <bdb7> 2825
+<bdb8> <bdb8> 15483
+<bdb9> <bdb9> 2826
+<bdba> <bdbd> 15484
+<bdc1> <bdc2> 2827
+<bdc3> <bdc8> 15488
+<bdc9> <bdc9> 2829
+<bdca> <bdd1> 15494
+<bdd3> <bdd5> 15502
+<bdd6> <bdd6> 2830
+<bdd7> <bddd> 15505
+<bde1> <bde1> 2831
+<bde2> <bdf1> 15512
+<bdf3> <bdf5> 15528
+<bdf6> <bdf6> 2832
+<bdf7> <bdfd> 15531
+<be41> <be41> 2833
+<be42> <be44> 15538
+<be45> <be45> 2834
+<be46> <be48> 15541
+<be49> <be49> 2835
+<be4a> <be50> 15544
+<be51> <be51> 2836
+<be53> <be53> 2837
+<be54> <be5d> 15551
+<be61> <be71> 15561
+<be73> <be76> 15578
+<be77> <be77> 2838
+<be78> <be7d> 15582
+<be81> <be82> 2839
+<be83> <be84> 15588
+<be85> <be85> 2841
+<be86> <be88> 15590
+<be89> <be89> 2842
+<be8a> <be90> 15593
+<be91> <be91> 2843
+<be93> <be93> 2844
+<be94> <be96> 15600
+<be97> <be97> 2845
+<be98> <be9d> 15603
+<bea1> <bea1> 2846
+<bea2> <beb1> 15609
+<beb3> <beb5> 15625
+<beb6> <beb7> 2847
+<beb8> <bebd> 15628
+<bec1> <bed1> 15634
+<bed3> <bedd> 15651
+<bee1> <bee1> 2849
+<bee2> <bef1> 15662
+<bef3> <befd> 15678
+<bf41> <bf41> 2850
+<bf42> <bf51> 15689
+<bf53> <bf5d> 15705
+<bf61> <bf61> 2851
+<bf62> <bf70> 15716
+<bf71> <bf71> 2852
+<bf73> <bf74> 15731
+<bf75> <bf75> 2853
+<bf76> <bf76> 15733
+<bf77> <bf77> 2854
+<bf78> <bf7d> 15734
+<bf81> <bf91> 15740
+<bf93> <bf9d> 15757
+<bfa1> <bfa2> 2855
+<bfa3> <bfa4> 15768
+<bfa5> <bfa5> 2857
+<bfa6> <bfa8> 15770
+<bfa9> <bfa9> 2858
+<bfaa> <bfb0> 15773
+<bfb1> <bfb1> 2859
+<bfb3> <bfb3> 2860
+<bfb4> <bfb6> 15780
+<bfb7> <bfb8> 2861
+<bfb9> <bfbc> 15783
+<bfbd> <bfbd> 2863
+<c061> <c062> 2864
+<c063> <c064> 15787
+<c065> <c065> 2866
+<c066> <c066> 15789
+<c067> <c067> 2867
+<c068> <c068> 15790
+<c069> <c069> 2868
+<c06a> <c070> 15791
+<c071> <c071> 2869
+<c073> <c073> 2870
+<c074> <c074> 15798
+<c075> <c078> 2871
+<c079> <c07d> 15799
+<c081> <c082> 2875
+<c083> <c084> 15804
+<c085> <c085> 2877
+<c086> <c088> 15806
+<c089> <c089> 2878
+<c08a> <c090> 15809
+endcidrange
+
+100 begincidrange
+<c091> <c091> 2879
+<c093> <c093> 2880
+<c094> <c094> 15816
+<c095> <c097> 2881
+<c098> <c09d> 15817
+<c0a1> <c0a1> 2884
+<c0a2> <c0a4> 15823
+<c0a5> <c0a5> 2885
+<c0a6> <c0a6> 15826
+<c0a7> <c0a7> 2886
+<c0a8> <c0a8> 15827
+<c0a9> <c0a9> 2887
+<c0aa> <c0b0> 15828
+<c0b1> <c0b1> 2888
+<c0b3> <c0b6> 15835
+<c0b7> <c0b7> 2889
+<c0b8> <c0bd> 15839
+<c0c1> <c0d1> 15845
+<c0d3> <c0dd> 15862
+<c0e1> <c0e2> 2890
+<c0e3> <c0e4> 15873
+<c0e5> <c0e5> 2892
+<c0e6> <c0e8> 15875
+<c0e9> <c0e9> 2893
+<c0ea> <c0f0> 15878
+<c0f1> <c0f1> 2894
+<c0f3> <c0f3> 2895
+<c0f4> <c0f4> 15885
+<c0f5> <c0f7> 2896
+<c0f8> <c0fd> 15886
+<c141> <c142> 2899
+<c143> <c144> 15892
+<c145> <c145> 2901
+<c146> <c148> 15894
+<c149> <c149> 2902
+<c14a> <c150> 15897
+<c151> <c151> 2903
+<c153> <c153> 2904
+<c154> <c154> 15904
+<c155> <c155> 2905
+<c156> <c156> 15905
+<c157> <c157> 2906
+<c158> <c15d> 15906
+<c161> <c161> 2907
+<c162> <c164> 15912
+<c165> <c165> 2908
+<c166> <c171> 15915
+<c173> <c175> 15927
+<c176> <c176> 2909
+<c177> <c17d> 15930
+<c181> <c181> 2910
+<c182> <c184> 15937
+<c185> <c185> 2911
+<c186> <c191> 15940
+<c193> <c196> 15952
+<c197> <c197> 2912
+<c198> <c19d> 15956
+<c1a1> <c1a2> 2913
+<c1a3> <c1a4> 15962
+<c1a5> <c1a5> 2915
+<c1a6> <c1a8> 15964
+<c1a9> <c1a9> 2916
+<c1aa> <c1b0> 15967
+<c1b1> <c1b1> 2917
+<c1b3> <c1b3> 2918
+<c1b4> <c1b4> 15974
+<c1b5> <c1b5> 2919
+<c1b6> <c1b6> 15975
+<c1b7> <c1b7> 2920
+<c1b8> <c1bd> 15976
+<c1c1> <c1c1> 2921
+<c1c2> <c1c4> 15982
+<c1c5> <c1c5> 2922
+<c1c6> <c1c8> 15985
+<c1c9> <c1c9> 2923
+<c1ca> <c1d1> 15988
+<c1d3> <c1d6> 15996
+<c1d7> <c1d7> 2924
+<c1d8> <c1dd> 16000
+<c1e1> <c1f1> 16006
+<c1f3> <c1fd> 16023
+<c241> <c241> 2925
+<c242> <c244> 16034
+<c245> <c245> 2926
+<c246> <c248> 16037
+<c249> <c249> 2927
+<c24a> <c250> 16040
+<c251> <c251> 2928
+<c253> <c253> 2929
+<c254> <c254> 16047
+<c255> <c255> 2930
+<c256> <c256> 16048
+<c257> <c257> 2931
+<c258> <c25d> 16049
+<c261> <c261> 2932
+<c262> <c270> 16055
+<c271> <c271> 2933
+<c273> <c27d> 16070
+<c281> <c282> 2934
+<c283> <c284> 16081
+endcidrange
+
+100 begincidrange
+<c285> <c285> 2936
+<c286> <c288> 16083
+<c289> <c289> 2937
+<c28a> <c290> 16086
+<c291> <c291> 2938
+<c293> <c293> 2939
+<c294> <c294> 16093
+<c295> <c295> 2940
+<c296> <c296> 16094
+<c297> <c297> 2941
+<c298> <c29d> 16095
+<c2a1> <c2a1> 2942
+<c2a2> <c2b1> 16101
+<c2b3> <c2b5> 16117
+<c2b6> <c2b6> 2943
+<c2b7> <c2bd> 16120
+<c2c1> <c2c1> 2944
+<c2c2> <c2c4> 16127
+<c2c5> <c2c5> 2945
+<c2c6> <c2d1> 16130
+<c2d3> <c2dd> 16142
+<c2e1> <c2e1> 2946
+<c2e2> <c2e4> 16153
+<c2e5> <c2e5> 2947
+<c2e6> <c2e8> 16156
+<c2e9> <c2e9> 2948
+<c2ea> <c2f0> 16159
+<c2f1> <c2f1> 2949
+<c2f3> <c2f3> 2950
+<c2f4> <c2f4> 16166
+<c2f5> <c2f5> 2951
+<c2f6> <c2f6> 16167
+<c2f7> <c2f7> 2952
+<c2f8> <c2fd> 16168
+<c341> <c341> 2953
+<c342> <c344> 16174
+<c345> <c345> 2954
+<c346> <c348> 16177
+<c349> <c349> 2955
+<c34a> <c350> 16180
+<c351> <c351> 2956
+<c353> <c356> 16187
+<c357> <c357> 2957
+<c358> <c35d> 16191
+<c361> <c362> 2958
+<c363> <c364> 16197
+<c365> <c365> 2960
+<c366> <c368> 16199
+<c369> <c369> 2961
+<c36a> <c370> 16202
+<c371> <c371> 2962
+<c373> <c373> 2963
+<c374> <c374> 16209
+<c375> <c375> 2964
+<c376> <c376> 16210
+<c377> <c377> 2965
+<c378> <c37d> 16211
+<c381> <c391> 16217
+<c393> <c39d> 16234
+<c3a1> <c3a2> 2966
+<c3a3> <c3a4> 16245
+<c3a5> <c3a5> 2968
+<c3a6> <c3a7> 16247
+<c3a8> <c3aa> 2969
+<c3ab> <c3b0> 16249
+<c3b1> <c3b1> 2972
+<c3b3> <c3b3> 2973
+<c3b4> <c3b4> 16255
+<c3b5> <c3b5> 2974
+<c3b6> <c3b6> 16256
+<c3b7> <c3b7> 2975
+<c3b8> <c3bd> 16257
+<c461> <c462> 2976
+<c463> <c464> 16263
+<c465> <c465> 2978
+<c466> <c468> 16265
+<c469> <c469> 2979
+<c46a> <c470> 16268
+<c471> <c471> 2980
+<c473> <c473> 2981
+<c474> <c474> 16275
+<c475> <c475> 2982
+<c476> <c476> 16276
+<c477> <c477> 2983
+<c478> <c47d> 16277
+<c481> <c482> 2984
+<c483> <c484> 16283
+<c485> <c485> 2986
+<c486> <c488> 16285
+<c489> <c489> 2987
+<c48a> <c490> 16288
+<c491> <c491> 2988
+<c493> <c493> 2989
+<c494> <c494> 16295
+<c495> <c497> 2990
+<c498> <c49d> 16296
+<c4a1> <c4a2> 2993
+<c4a3> <c4b1> 16302
+<c4b3> <c4b6> 16317
+<c4b7> <c4b7> 2995
+endcidrange
+
+100 begincidrange
+<c4b8> <c4bd> 16321
+<c4c1> <c4d1> 16327
+<c4d3> <c4dd> 16344
+<c4e1> <c4e2> 2996
+<c4e3> <c4e4> 16355
+<c4e5> <c4e5> 2998
+<c4e6> <c4e7> 16357
+<c4e8> <c4e9> 2999
+<c4ea> <c4f0> 16359
+<c4f1> <c4f1> 3001
+<c4f3> <c4f3> 3002
+<c4f4> <c4f4> 16366
+<c4f5> <c4f7> 3003
+<c4f8> <c4fd> 16367
+<c541> <c542> 3006
+<c543> <c544> 16373
+<c545> <c545> 3008
+<c546> <c548> 16375
+<c549> <c549> 3009
+<c54a> <c550> 16378
+<c551> <c551> 3010
+<c553> <c553> 3011
+<c554> <c554> 16385
+<c555> <c555> 3012
+<c556> <c556> 16386
+<c557> <c557> 3013
+<c558> <c55d> 16387
+<c561> <c561> 3014
+<c562> <c564> 16393
+<c565> <c565> 3015
+<c566> <c568> 16396
+<c569> <c569> 3016
+<c56a> <c570> 16399
+<c571> <c571> 3017
+<c573> <c573> 3018
+<c574> <c574> 16406
+<c575> <c577> 3019
+<c578> <c57d> 16407
+<c581> <c581> 3022
+<c582> <c591> 16413
+<c593> <c59d> 16429
+<c5a1> <c5a2> 3023
+<c5a3> <c5a4> 16440
+<c5a5> <c5a5> 3025
+<c5a6> <c5a8> 16442
+<c5a9> <c5a9> 3026
+<c5aa> <c5b0> 16445
+<c5b1> <c5b1> 3027
+<c5b3> <c5b3> 3028
+<c5b4> <c5b4> 16452
+<c5b5> <c5b5> 3029
+<c5b6> <c5b6> 16453
+<c5b7> <c5b7> 3030
+<c5b8> <c5bd> 16454
+<c5c1> <c5c2> 3031
+<c5c3> <c5c4> 16460
+<c5c5> <c5c5> 3033
+<c5c6> <c5c8> 16462
+<c5c9> <c5c9> 3034
+<c5ca> <c5d0> 16465
+<c5d1> <c5d1> 3035
+<c5d3> <c5d6> 16472
+<c5d7> <c5d7> 3036
+<c5d8> <c5dd> 16476
+<c5e1> <c5e1> 3037
+<c5e2> <c5f1> 16482
+<c5f3> <c5f6> 16498
+<c5f7> <c5f7> 3038
+<c5f8> <c5fd> 16502
+<c641> <c641> 3039
+<c642> <c648> 16508
+<c649> <c649> 3040
+<c64a> <c651> 16515
+<c653> <c65d> 16523
+<c661> <c661> 3041
+<c662> <c671> 16534
+<c673> <c67d> 16550
+<c681> <c682> 3042
+<c683> <c684> 16561
+<c685> <c685> 3044
+<c686> <c688> 16563
+<c689> <c689> 3045
+<c68a> <c690> 16566
+<c691> <c691> 3046
+<c693> <c693> 3047
+<c694> <c694> 16573
+<c695> <c695> 3048
+<c696> <c696> 16574
+<c697> <c697> 3049
+<c698> <c69d> 16575
+<c6a1> <c6a1> 3050
+<c6a2> <c6a4> 16581
+<c6a5> <c6a5> 3051
+<c6a6> <c6a8> 16584
+<c6a9> <c6a9> 3052
+<c6aa> <c6b1> 16587
+<c6b3> <c6b6> 16595
+<c6b7> <c6b7> 3053
+<c6b8> <c6bd> 16599
+<c6c1> <c6c1> 3054
+endcidrange
+
+100 begincidrange
+<c6c2> <c6d1> 16605
+<c6d3> <c6d6> 16621
+<c6d7> <c6d7> 3055
+<c6d8> <c6dd> 16625
+<c6e1> <c6e2> 3056
+<c6e3> <c6e4> 16631
+<c6e5> <c6e5> 3058
+<c6e6> <c6e8> 16633
+<c6e9> <c6e9> 3059
+<c6ea> <c6f0> 16636
+<c6f1> <c6f1> 3060
+<c6f3> <c6f3> 3061
+<c6f4> <c6f4> 16643
+<c6f5> <c6f5> 3062
+<c6f6> <c6f6> 16644
+<c6f7> <c6f7> 3063
+<c6f8> <c6fd> 16645
+<c741> <c741> 3064
+<c742> <c744> 16651
+<c745> <c745> 3065
+<c746> <c748> 16654
+<c749> <c749> 3066
+<c74a> <c750> 16657
+<c751> <c751> 3067
+<c753> <c75d> 16664
+<c761> <c762> 3068
+<c763> <c764> 16675
+<c765> <c765> 3070
+<c766> <c768> 16677
+<c769> <c769> 3071
+<c76a> <c770> 16680
+<c771> <c771> 3072
+<c773> <c773> 3073
+<c774> <c776> 16687
+<c777> <c777> 3074
+<c778> <c77d> 16690
+<c781> <c791> 16696
+<c793> <c79d> 16713
+<c7a1> <c7a2> 3075
+<c7a3> <c7a4> 16724
+<c7a5> <c7a5> 3077
+<c7a6> <c7a8> 16726
+<c7a9> <c7a9> 3078
+<c7aa> <c7b0> 16729
+<c7b1> <c7b1> 3079
+<c7b3> <c7b3> 3080
+<c7b4> <c7b4> 16736
+<c7b5> <c7b5> 3081
+<c7b6> <c7b6> 16737
+<c7b7> <c7b7> 3082
+<c7b8> <c7bd> 16738
+<c861> <c862> 3083
+<c863> <c864> 16744
+<c865> <c865> 3085
+<c866> <c868> 16746
+<c869> <c86a> 3086
+<c86b> <c870> 16749
+<c871> <c871> 3088
+<c873> <c873> 3089
+<c874> <c874> 16755
+<c875> <c877> 3090
+<c878> <c87d> 16756
+<c881> <c882> 3093
+<c883> <c884> 16762
+<c885> <c885> 3095
+<c886> <c888> 16764
+<c889> <c889> 3096
+<c88a> <c890> 16767
+<c891> <c891> 3097
+<c893> <c893> 3098
+<c894> <c894> 16774
+<c895> <c897> 3099
+<c898> <c89d> 16775
+<c8a1> <c8a1> 3102
+<c8a2> <c8b1> 16781
+<c8b3> <c8b6> 16797
+<c8b7> <c8b7> 3103
+<c8b8> <c8bd> 16801
+<c8c1> <c8d1> 16807
+<c8d3> <c8dd> 16824
+<c8e1> <c8e2> 3104
+<c8e3> <c8e4> 16835
+<c8e5> <c8e5> 3106
+<c8e6> <c8e8> 16837
+<c8e9> <c8e9> 3107
+<c8ea> <c8ea> 16840
+<c8eb> <c8eb> 3108
+<c8ec> <c8f0> 16841
+<c8f1> <c8f1> 3109
+<c8f3> <c8f3> 3110
+<c8f4> <c8f4> 16846
+<c8f5> <c8f7> 3111
+<c8f8> <c8fd> 16847
+<c941> <c942> 3114
+<c943> <c944> 16853
+<c945> <c945> 3116
+<c946> <c948> 16855
+<c949> <c949> 3117
+<c94a> <c950> 16858
+<c951> <c951> 3118
+endcidrange
+
+100 begincidrange
+<c953> <c953> 3119
+<c954> <c954> 16865
+<c955> <c955> 3120
+<c956> <c956> 16866
+<c957> <c957> 3121
+<c958> <c95d> 16867
+<c961> <c961> 3122
+<c962> <c964> 16873
+<c965> <c965> 3123
+<c966> <c971> 16876
+<c973> <c975> 16888
+<c976> <c976> 3124
+<c977> <c97d> 16891
+<c981> <c981> 3125
+<c982> <c984> 16898
+<c985> <c985> 3126
+<c986> <c991> 16901
+<c993> <c99d> 16913
+<c9a1> <c9a2> 3127
+<c9a3> <c9a4> 16924
+<c9a5> <c9a5> 3129
+<c9a6> <c9a8> 16926
+<c9a9> <c9a9> 3130
+<c9aa> <c9b0> 16929
+<c9b1> <c9b1> 3131
+<c9b3> <c9b3> 3132
+<c9b4> <c9b4> 16936
+<c9b5> <c9b5> 3133
+<c9b6> <c9b6> 16937
+<c9b7> <c9b7> 3134
+<c9b8> <c9bb> 16938
+<c9bc> <c9bc> 3135
+<c9bd> <c9bd> 16942
+<c9c1> <c9c1> 3136
+<c9c2> <c9c4> 16943
+<c9c5> <c9c5> 3137
+<c9c6> <c9d1> 16946
+<c9d3> <c9dd> 16958
+<c9e1> <c9e1> 3138
+<c9e2> <c9f1> 16969
+<c9f3> <c9fd> 16985
+<ca41> <ca41> 3139
+<ca42> <ca44> 16996
+<ca45> <ca45> 3140
+<ca46> <ca51> 16999
+<ca53> <ca54> 17011
+<ca55> <ca55> 3141
+<ca56> <ca56> 17013
+<ca57> <ca57> 3142
+<ca58> <ca5d> 17014
+<ca61> <ca61> 3143
+<ca62> <ca71> 17020
+<ca73> <ca7d> 17036
+<ca81> <ca82> 3144
+<ca83> <ca84> 17047
+<ca85> <ca85> 3146
+<ca86> <ca88> 17049
+<ca89> <ca89> 3147
+<ca8a> <ca90> 17052
+<ca91> <ca91> 3148
+<ca93> <ca93> 3149
+<ca94> <ca94> 17059
+<ca95> <ca95> 3150
+<ca96> <ca96> 17060
+<ca97> <ca97> 3151
+<ca98> <ca9d> 17061
+<caa1> <caa1> 3152
+<caa2> <cab1> 17067
+<cab3> <cab5> 17083
+<cab6> <cab6> 3153
+<cab7> <cabd> 17086
+<cac1> <cac1> 3154
+<cac2> <cad1> 17093
+<cad3> <cadd> 17109
+<cae1> <cae2> 3155
+<cae3> <cae4> 17120
+<cae5> <cae5> 3157
+<cae6> <cae8> 17122
+<cae9> <cae9> 3158
+<caea> <caf0> 17125
+<caf1> <caf1> 3159
+<caf3> <caf3> 3160
+<caf4> <caf6> 17132
+<caf7> <caf7> 3161
+<caf8> <cafd> 17135
+<cb41> <cb41> 3162
+<cb42> <cb44> 17141
+<cb45> <cb45> 3163
+<cb46> <cb48> 17144
+<cb49> <cb49> 3164
+<cb4a> <cb50> 17147
+<cb51> <cb51> 3165
+<cb53> <cb56> 17154
+<cb57> <cb57> 3166
+<cb58> <cb5d> 17158
+<cb61> <cb62> 3167
+<cb63> <cb64> 17164
+<cb65> <cb65> 3169
+<cb66> <cb67> 17166
+<cb68> <cb69> 3170
+endcidrange
+
+100 begincidrange
+<cb6a> <cb6a> 17168
+<cb6b> <cb6b> 3172
+<cb6c> <cb70> 17169
+<cb71> <cb71> 3173
+<cb73> <cb73> 3174
+<cb74> <cb74> 17174
+<cb75> <cb75> 3175
+<cb76> <cb7d> 17175
+<cb81> <cb81> 3176
+<cb82> <cb84> 17183
+<cb85> <cb85> 3177
+<cb86> <cb88> 17186
+<cb89> <cb89> 3178
+<cb8a> <cb90> 17189
+<cb91> <cb91> 3179
+<cb93> <cb93> 3180
+<cb94> <cb9d> 17196
+<cba1> <cba2> 3181
+<cba3> <cba4> 17206
+<cba5> <cba5> 3183
+<cba6> <cba8> 17208
+<cba9> <cba9> 3184
+<cbaa> <cbb0> 17211
+<cbb1> <cbb1> 3185
+<cbb3> <cbb3> 3186
+<cbb4> <cbb4> 17218
+<cbb5> <cbb5> 3187
+<cbb6> <cbb6> 17219
+<cbb7> <cbb7> 3188
+<cbb8> <cbbd> 17220
+<cc61> <cc63> 3189
+<cc64> <cc64> 17226
+<cc65> <cc65> 3192
+<cc66> <cc68> 17227
+<cc69> <cc69> 3193
+<cc6a> <cc6a> 17230
+<cc6b> <cc6b> 3194
+<cc6c> <cc70> 17231
+<cc71> <cc71> 3195
+<cc73> <cc73> 3196
+<cc74> <cc74> 17236
+<cc75> <cc77> 3197
+<cc78> <cc7a> 17237
+<cc7b> <cc7b> 3200
+<cc7c> <cc7d> 17240
+<cc81> <cc82> 3201
+<cc83> <cc84> 17242
+<cc85> <cc85> 3203
+<cc86> <cc88> 17244
+<cc89> <cc89> 3204
+<cc8a> <cc90> 17247
+<cc91> <cc91> 3205
+<cc93> <cc93> 3206
+<cc94> <cc94> 17254
+<cc95> <cc97> 3207
+<cc98> <cc9d> 17255
+<cca1> <cca2> 3210
+<cca3> <ccb1> 17261
+<ccb3> <ccbd> 17276
+<ccc1> <ccd1> 17287
+<ccd3> <ccdd> 17304
+<cce1> <cce2> 3212
+<cce3> <cce4> 17315
+<cce5> <cce5> 3214
+<cce6> <cce8> 17317
+<cce9> <cce9> 3215
+<ccea> <ccf0> 17320
+<ccf1> <ccf1> 3216
+<ccf3> <ccf3> 3217
+<ccf4> <ccf4> 17327
+<ccf5> <ccf7> 3218
+<ccf8> <ccfd> 17328
+<cd41> <cd42> 3221
+<cd43> <cd44> 17334
+<cd45> <cd45> 3223
+<cd46> <cd48> 17336
+<cd49> <cd49> 3224
+<cd4a> <cd50> 17339
+<cd51> <cd51> 3225
+<cd53> <cd53> 3226
+<cd54> <cd54> 17346
+<cd55> <cd55> 3227
+<cd56> <cd56> 17347
+<cd57> <cd57> 3228
+<cd58> <cd5d> 17348
+<cd61> <cd61> 3229
+<cd62> <cd64> 17354
+<cd65> <cd65> 3230
+<cd66> <cd68> 17357
+<cd69> <cd69> 3231
+<cd6a> <cd70> 17360
+<cd71> <cd71> 3232
+<cd73> <cd73> 3233
+<cd74> <cd75> 17367
+<cd76> <cd77> 3234
+<cd78> <cd7d> 17369
+<cd81> <cd81> 3236
+<cd82> <cd88> 17375
+<cd89> <cd89> 3237
+<cd8a> <cd91> 17382
+endcidrange
+
+100 begincidrange
+<cd93> <cd93> 3238
+<cd94> <cd94> 17390
+<cd95> <cd95> 3239
+<cd96> <cd9d> 17391
+<cda1> <cda2> 3240
+<cda3> <cda4> 17399
+<cda5> <cda5> 3242
+<cda6> <cda8> 17401
+<cda9> <cda9> 3243
+<cdaa> <cdb0> 17404
+<cdb1> <cdb1> 3244
+<cdb3> <cdb3> 3245
+<cdb4> <cdb4> 17411
+<cdb5> <cdb5> 3246
+<cdb6> <cdb6> 17412
+<cdb7> <cdb7> 3247
+<cdb8> <cdbd> 17413
+<cdc1> <cdc1> 3248
+<cdc2> <cdd1> 17419
+<cdd3> <cdd6> 17435
+<cdd7> <cdd7> 3249
+<cdd8> <cddd> 17439
+<cde1> <cdf1> 17445
+<cdf3> <cdfd> 17462
+<ce41> <ce41> 3250
+<ce42> <ce44> 17473
+<ce45> <ce45> 3251
+<ce46> <ce51> 17476
+<ce53> <ce5d> 17488
+<ce61> <ce61> 3252
+<ce62> <ce64> 17499
+<ce65> <ce65> 3253
+<ce66> <ce68> 17502
+<ce69> <ce69> 3254
+<ce6a> <ce71> 17505
+<ce73> <ce73> 3255
+<ce74> <ce74> 17513
+<ce75> <ce75> 3256
+<ce76> <ce7d> 17514
+<ce81> <ce82> 3257
+<ce83> <ce84> 17522
+<ce85> <ce85> 3259
+<ce86> <ce87> 17524
+<ce88> <ce89> 3260
+<ce8a> <ce8a> 17526
+<ce8b> <ce8b> 3262
+<ce8c> <ce90> 17527
+<ce91> <ce91> 3263
+<ce93> <ce93> 3264
+<ce94> <ce94> 17532
+<ce95> <ce95> 3265
+<ce96> <ce96> 17533
+<ce97> <ce97> 3266
+<ce98> <ce9d> 17534
+<cea1> <cea1> 3267
+<cea2> <ceb1> 17540
+<ceb3> <ceb6> 17556
+<ceb7> <ceb7> 3268
+<ceb8> <cebd> 17560
+<cec1> <ced1> 17566
+<ced3> <cedd> 17583
+<cee1> <cee1> 3269
+<cee2> <cee4> 17594
+<cee5> <cee5> 3270
+<cee6> <cee8> 17597
+<cee9> <cee9> 3271
+<ceea> <cef0> 17600
+<cef1> <cef1> 3272
+<cef3> <cef4> 17607
+<cef5> <cef5> 3273
+<cef6> <cefd> 17609
+<cf41> <cf41> 3274
+<cf42> <cf44> 17617
+<cf45> <cf45> 3275
+<cf46> <cf48> 17620
+<cf49> <cf49> 3276
+<cf4a> <cf50> 17623
+<cf51> <cf51> 3277
+<cf53> <cf54> 17630
+<cf55> <cf55> 3278
+<cf56> <cf56> 17632
+<cf57> <cf57> 3279
+<cf58> <cf5d> 17633
+<cf61> <cf61> 3280
+<cf62> <cf64> 17639
+<cf65> <cf65> 3281
+<cf66> <cf68> 17642
+<cf69> <cf69> 3282
+<cf6a> <cf70> 17645
+<cf71> <cf71> 3283
+<cf73> <cf73> 3284
+<cf74> <cf74> 17652
+<cf75> <cf75> 3285
+<cf76> <cf7d> 17653
+<cf81> <cf91> 17661
+<cf93> <cf9d> 17678
+<cfa1> <cfa2> 3286
+<cfa3> <cfa4> 17689
+<cfa5> <cfa5> 3288
+<cfa6> <cfa8> 17691
+endcidrange
+
+100 begincidrange
+<cfa9> <cfa9> 3289
+<cfaa> <cfb0> 17694
+<cfb1> <cfb1> 3290
+<cfb3> <cfb3> 3291
+<cfb4> <cfb4> 17701
+<cfb5> <cfb5> 3292
+<cfb6> <cfb6> 17702
+<cfb7> <cfb7> 3293
+<cfb8> <cfbd> 17703
+<d061> <d062> 3294
+<d063> <d064> 17709
+<d065> <d065> 3296
+<d066> <d068> 17711
+<d069> <d069> 3297
+<d06a> <d06d> 17714
+<d06e> <d06e> 3298
+<d06f> <d070> 17718
+<d071> <d071> 3299
+<d073> <d073> 3300
+<d074> <d074> 17720
+<d075> <d075> 3301
+<d076> <d076> 17721
+<d077> <d077> 3302
+<d078> <d07d> 17722
+<d081> <d082> 3303
+<d083> <d084> 17728
+<d085> <d085> 3305
+<d086> <d088> 17730
+<d089> <d089> 3306
+<d08a> <d090> 17733
+<d091> <d091> 3307
+<d093> <d093> 3308
+<d094> <d094> 17740
+<d095> <d097> 3309
+<d098> <d09d> 17741
+<d0a1> <d0a1> 3312
+<d0a2> <d0b1> 17747
+<d0b3> <d0b6> 17763
+<d0b7> <d0b7> 3313
+<d0b8> <d0bd> 17767
+<d0c1> <d0d1> 17773
+<d0d3> <d0dd> 17790
+<d0e1> <d0e2> 3314
+<d0e3> <d0e4> 17801
+<d0e5> <d0e5> 3316
+<d0e6> <d0e8> 17803
+<d0e9> <d0e9> 3317
+<d0ea> <d0ea> 17806
+<d0eb> <d0eb> 3318
+<d0ec> <d0f0> 17807
+<d0f1> <d0f1> 3319
+<d0f3> <d0f3> 3320
+<d0f4> <d0f4> 17812
+<d0f5> <d0f5> 3321
+<d0f6> <d0f6> 17813
+<d0f7> <d0f7> 3322
+<d0f8> <d0fd> 17814
+<d141> <d142> 3323
+<d143> <d144> 17820
+<d145> <d145> 3325
+<d146> <d148> 17822
+<d149> <d149> 3326
+<d14a> <d150> 17825
+<d151> <d151> 3327
+<d153> <d153> 3328
+<d154> <d154> 17832
+<d155> <d155> 3329
+<d156> <d156> 17833
+<d157> <d157> 3330
+<d158> <d15d> 17834
+<d161> <d162> 3331
+<d163> <d164> 17840
+<d165> <d165> 3333
+<d166> <d168> 17842
+<d169> <d169> 3334
+<d16a> <d170> 17845
+<d171> <d171> 3335
+<d173> <d173> 3336
+<d174> <d174> 17852
+<d175> <d177> 3337
+<d178> <d17d> 17853
+<d181> <d181> 3340
+<d182> <d184> 17859
+<d185> <d185> 3341
+<d186> <d188> 17862
+<d189> <d189> 3342
+<d18a> <d191> 17865
+<d193> <d193> 3343
+<d194> <d19d> 17873
+<d1a1> <d1a2> 3344
+<d1a3> <d1a4> 17883
+<d1a5> <d1a5> 3346
+<d1a6> <d1a8> 17885
+<d1a9> <d1a9> 3347
+<d1aa> <d1ad> 17888
+<d1ae> <d1ae> 3348
+<d1af> <d1b0> 17892
+<d1b1> <d1b1> 3349
+<d1b3> <d1b3> 3350
+<d1b4> <d1b4> 17894
+endcidrange
+
+100 begincidrange
+<d1b5> <d1b5> 3351
+<d1b6> <d1b6> 17895
+<d1b7> <d1b7> 3352
+<d1b8> <d1ba> 17896
+<d1bb> <d1bb> 3353
+<d1bc> <d1bd> 17899
+<d1c1> <d1c2> 3354
+<d1c3> <d1c4> 17901
+<d1c5> <d1c5> 3356
+<d1c6> <d1c8> 17903
+<d1c9> <d1c9> 3357
+<d1ca> <d1d1> 17906
+<d1d3> <d1d4> 17914
+<d1d5> <d1d5> 3358
+<d1d6> <d1d6> 17916
+<d1d7> <d1d7> 3359
+<d1d8> <d1dd> 17917
+<d1e1> <d1e2> 3360
+<d1e3> <d1e4> 17923
+<d1e5> <d1e5> 3362
+<d1e6> <d1f1> 17925
+<d1f3> <d1f4> 17937
+<d1f5> <d1f5> 3363
+<d1f6> <d1f6> 17939
+<d1f7> <d1f7> 3364
+<d1f8> <d1fd> 17940
+<d241> <d242> 3365
+<d243> <d244> 17946
+<d245> <d245> 3367
+<d246> <d248> 17948
+<d249> <d249> 3368
+<d24a> <d251> 17951
+<d253> <d253> 3369
+<d254> <d254> 17959
+<d255> <d255> 3370
+<d256> <d256> 17960
+<d257> <d257> 3371
+<d258> <d25d> 17961
+<d261> <d261> 3372
+<d262> <d264> 17967
+<d265> <d265> 3373
+<d266> <d268> 17970
+<d269> <d269> 3374
+<d26a> <d271> 17973
+<d273> <d273> 3375
+<d274> <d274> 17981
+<d275> <d275> 3376
+<d276> <d27d> 17982
+<d281> <d282> 3377
+<d283> <d284> 17990
+<d285> <d285> 3379
+<d286> <d288> 17992
+<d289> <d289> 3380
+<d28a> <d28d> 17995
+<d28e> <d28e> 3381
+<d28f> <d290> 17999
+<d291> <d291> 3382
+<d293> <d294> 18001
+<d295> <d295> 3383
+<d296> <d296> 18003
+<d297> <d297> 3384
+<d298> <d29d> 18004
+<d2a1> <d2a1> 3385
+<d2a2> <d2a4> 18010
+<d2a5> <d2a5> 3386
+<d2a6> <d2a8> 18013
+<d2a9> <d2a9> 3387
+<d2aa> <d2b0> 18016
+<d2b1> <d2b1> 3388
+<d2b3> <d2b6> 18023
+<d2b7> <d2b7> 3389
+<d2b8> <d2bd> 18027
+<d2c1> <d2c2> 3390
+<d2c3> <d2c4> 18033
+<d2c5> <d2c5> 3392
+<d2c6> <d2c8> 18035
+<d2c9> <d2c9> 3393
+<d2ca> <d2d1> 18038
+<d2d3> <d2d6> 18046
+<d2d7> <d2d7> 3394
+<d2d8> <d2dd> 18050
+<d2e1> <d2e2> 3395
+<d2e3> <d2e4> 18056
+<d2e5> <d2e5> 3397
+<d2e6> <d2e8> 18058
+<d2e9> <d2e9> 3398
+<d2ea> <d2f0> 18061
+<d2f1> <d2f1> 3399
+<d2f3> <d2f3> 3400
+<d2f4> <d2f4> 18068
+<d2f5> <d2f5> 3401
+<d2f6> <d2f6> 18069
+<d2f7> <d2f7> 3402
+<d2f8> <d2fd> 18070
+<d341> <d342> 3403
+<d343> <d344> 18076
+<d345> <d345> 3405
+<d346> <d348> 18078
+<d349> <d349> 3406
+<d34a> <d350> 18081
+endcidrange
+
+100 begincidrange
+<d351> <d351> 3407
+<d353> <d354> 18088
+<d355> <d355> 3408
+<d356> <d356> 18090
+<d357> <d357> 3409
+<d358> <d35d> 18091
+<d361> <d362> 3410
+<d363> <d364> 18097
+<d365> <d365> 3412
+<d366> <d366> 18099
+<d367> <d36a> 3413
+<d36b> <d370> 18100
+<d371> <d371> 3417
+<d373> <d373> 3418
+<d374> <d374> 18106
+<d375> <d375> 3419
+<d376> <d376> 18107
+<d377> <d377> 3420
+<d378> <d37a> 18108
+<d37b> <d37b> 3421
+<d37c> <d37d> 18111
+<d381> <d381> 3422
+<d382> <d384> 18113
+<d385> <d385> 3423
+<d386> <d388> 18116
+<d389> <d389> 3424
+<d38a> <d390> 18119
+<d391> <d391> 3425
+<d393> <d393> 3426
+<d394> <d396> 18126
+<d397> <d397> 3427
+<d398> <d39d> 18129
+<d3a1> <d3a2> 3428
+<d3a3> <d3a4> 18135
+<d3a5> <d3a5> 3430
+<d3a6> <d3a8> 18137
+<d3a9> <d3a9> 3431
+<d3aa> <d3b0> 18140
+<d3b1> <d3b1> 3432
+<d3b3> <d3b3> 3433
+<d3b4> <d3b4> 18147
+<d3b5> <d3b5> 3434
+<d3b6> <d3b6> 18148
+<d3b7> <d3b7> 3435
+<d3b8> <d3bd> 18149
+<d931> <d97e> 101
+<d991> <d9e5> 179
+<da31> <da7e> 264
+<da91> <dad3> 342
+<dad5> <dafe> 409
+<db31> <db3a> 451
+<db40> <db49> 461
+<db51> <db68> 471
+<db71> <db7e> 495
+<db91> <db9a> 509
+<dba1> <dbe4> 519
+<dc31> <dc7e> 587
+<dc91> <dc91> 665
+<dca1> <dca4> 666
+<dca6> <dca6> 670
+<dca8> <dcaf> 671
+<dcb1> <dcfe> 679
+<dd31> <dd7e> 757
+<dd91> <ddf3> 835
+<de31> <de7e> 934
+<de91> <de98> 1012
+<dea1> <dec1> 1020
+<ded1> <def1> 1053
+<e031> <e07e> 3436
+<e091> <e0cf> 3514
+<e0d0> <e0d0> 4116
+<e0d1> <e0d5> 3577
+<e0d6> <e0d6> 3678
+<e0d7> <e0e6> 3582
+<e0e7> <e0e7> 7053
+<e0e8> <e0fe> 3598
+<e131> <e17e> 3621
+<e191> <e1ce> 3699
+<e1cf> <e1cf> 3460
+<e1d0> <e1e7> 3761
+<e1e8> <e1e8> 7900
+<e1e9> <e1fe> 3785
+<e231> <e23c> 3807
+<e23d> <e23d> 3802
+<e23e> <e27e> 3819
+<e291> <e2fa> 3884
+<e2fb> <e2fb> 3902
+<e2fc> <e2fe> 3990
+<e331> <e331> 3993
+<e332> <e332> 3946
+<e333> <e347> 3994
+<e348> <e348> 3946
+<e349> <e35f> 4015
+<e360> <e360> 3708
+<e361> <e36c> 4038
+<e36d> <e36d> 4131
+<e36e> <e37e> 4050
+<e391> <e3d3> 4067
+<e3d4> <e3d4> 4374
+<e3d5> <e3d5> 4156
+endcidrange
+
+100 begincidrange
+<e3d6> <e3d7> 4134
+<e3d8> <e3d8> 4375
+<e3d9> <e3da> 4136
+<e3db> <e3e0> 4376
+<e3e1> <e3e1> 4138
+<e3e2> <e3e2> 5800
+<e3e3> <e3e5> 4382
+<e3e6> <e3e6> 4386
+<e3e7> <e3e7> 4139
+<e3e8> <e3eb> 4387
+<e3ec> <e3ec> 4140
+<e3ed> <e3ed> 4391
+<e3ee> <e3ee> 4141
+<e3ef> <e3f0> 4394
+<e3f1> <e3f1> 4142
+<e3f2> <e3f2> 4396
+<e3f3> <e3f5> 4143
+<e3f6> <e3f6> 4399
+<e3f7> <e3f9> 4146
+<e3fa> <e3fa> 4403
+<e3fb> <e3fb> 4149
+<e3fc> <e3fd> 4406
+<e3fe> <e3fe> 4409
+<e431> <e431> 4150
+<e432> <e433> 4410
+<e434> <e436> 4151
+<e437> <e43a> 4412
+<e43b> <e43b> 4419
+<e43c> <e43c> 4154
+<e43d> <e43d> 4420
+<e43e> <e441> 4155
+<e442> <e442> 4424
+<e443> <e44d> 4159
+<e44e> <e44e> 4511
+<e44f> <e451> 4170
+<e452> <e453> 4513
+<e454> <e454> 4517
+<e455> <e455> 4173
+<e456> <e45a> 4518
+<e45b> <e45b> 4524
+<e45c> <e45c> 4174
+<e45d> <e45e> 4525
+<e45f> <e464> 4528
+<e465> <e467> 4535
+<e468> <e468> 4175
+<e469> <e46a> 4541
+<e46b> <e46d> 4176
+<e46e> <e46f> 4545
+<e470> <e470> 4179
+<e471> <e471> 4547
+<e472> <e472> 4550
+<e473> <e473> 4180
+<e474> <e474> 4564
+<e475> <e478> 4566
+<e479> <e47a> 4571
+<e47b> <e47b> 4576
+<e47c> <e47e> 4181
+<e491> <e491> 4184
+<e492> <e495> 4604
+<e496> <e497> 4609
+<e498> <e498> 4185
+<e499> <e49a> 4611
+<e49b> <e4fe> 4186
+<e531> <e575> 4286
+<e576> <e576> 4318
+<e577> <e57e> 4355
+<e591> <e59d> 4363
+<e59e> <e59e> 4136
+<e59f> <e5a4> 4376
+<e5a5> <e5a5> 5800
+<e5a6> <e5aa> 4382
+<e5ab> <e5ab> 4139
+<e5ac> <e5ad> 4387
+<e5ae> <e5ae> 4192
+<e5af> <e5fe> 4389
+<e631> <e647> 4469
+<e648> <e648> 4167
+<e649> <e65c> 4492
+<e65d> <e65d> 4172
+<e65e> <e67e> 4512
+<e691> <e6ca> 4545
+<e6cb> <e6cb> 5552
+<e6cc> <e6e3> 4603
+<e6e4> <e6e4> 6424
+<e6e5> <e6fe> 4627
+<e731> <e77e> 4653
+<e791> <e7fe> 4731
+<e831> <e87e> 4841
+<e891> <e8c4> 4919
+<e8c5> <e8c5> 5151
+<e8c6> <e8e3> 4971
+<e8e4> <e8e4> 4922
+<e8e5> <e8fe> 5001
+<e931> <e934> 5027
+<e935> <e935> 7518
+<e936> <e97e> 5031
+<e991> <e9a4> 5104
+<e9a5> <e9a5> 5079
+<e9a6> <e9d4> 5124
+<e9d5> <e9d5> 5109
+endcidrange
+
+100 begincidrange
+<e9d6> <e9f3> 5171
+<e9f4> <e9f4> 7607
+<e9f5> <e9fe> 5201
+<ea31> <ea7e> 5211
+<ea91> <ea9d> 5289
+<ea9e> <ea9e> 5584
+<ea9f> <ea9f> 5302
+<eaa0> <eaa0> 5367
+<eaa1> <eab2> 5303
+<eab3> <eab3> 7083
+<eab4> <eae0> 5321
+<eae1> <eae1> 5362
+<eae2> <eae7> 5366
+<eae8> <eae8> 5485
+<eae9> <eafe> 5372
+<eb31> <eb7e> 5394
+<eb91> <eb92> 5472
+<eb93> <eb93> 6001
+<eb94> <ebac> 5474
+<ebad> <ebad> 5460
+<ebae> <ebec> 5499
+<ebed> <ebed> 5317
+<ebee> <ebfe> 5562
+<ec31> <ec7e> 5579
+<ec91> <ecf4> 5657
+<ecf5> <ecf5> 7009
+<ecf6> <ecfe> 5757
+<ed31> <ed31> 7370
+<ed32> <ed38> 5766
+<ed39> <ed39> 5678
+<ed3a> <ed7e> 5773
+<ed91> <edad> 5842
+<edae> <edae> 5874
+<edaf> <edb0> 5871
+<edb1> <edb2> 4425
+<edb3> <edb8> 5873
+<edb9> <edb9> 4427
+<edba> <edba> 5879
+<edbb> <edbc> 4429
+<edbd> <edc3> 5880
+<edc4> <edc4> 4431
+<edc5> <edcd> 5887
+<edce> <edce> 4435
+<edcf> <edcf> 5896
+<edd0> <edd0> 4436
+<edd1> <edd1> 5897
+<edd2> <edd2> 4437
+<edd3> <edd5> 5898
+<edd6> <edd6> 4439
+<edd7> <edf9> 5901
+<edfa> <edfb> 4442
+<edfc> <edfc> 4159
+<edfd> <edfd> 5936
+<edfe> <edfe> 4444
+<ee31> <ee31> 4447
+<ee32> <ee33> 5937
+<ee34> <ee34> 4449
+<ee35> <ee36> 5939
+<ee37> <ee37> 4450
+<ee38> <ee3c> 5941
+<ee3d> <ee3d> 4453
+<ee3e> <ee3e> 5946
+<ee3f> <ee41> 4455
+<ee42> <ee42> 5947
+<ee43> <ee43> 4458
+<ee44> <ee46> 5948
+<ee47> <ee48> 4459
+<ee49> <ee4b> 5951
+<ee4c> <ee4c> 4463
+<ee4d> <ee53> 5954
+<ee54> <ee54> 4160
+<ee55> <ee55> 5961
+<ee56> <ee57> 4465
+<ee58> <ee59> 5962
+<ee5a> <ee5a> 4161
+<ee5b> <ee61> 5964
+<ee62> <ee62> 4468
+<ee63> <ee65> 5971
+<ee66> <ee66> 4469
+<ee67> <ee68> 5974
+<ee69> <ee69> 4470
+<ee6a> <ee6b> 5976
+<ee6c> <ee6c> 4162
+<ee6d> <ee6e> 5978
+<ee6f> <ee6f> 4471
+<ee70> <ee70> 5980
+<ee71> <ee71> 4472
+<ee72> <ee73> 5981
+<ee74> <ee74> 4474
+<ee75> <ee75> 4473
+<ee76> <ee76> 4475
+<ee77> <ee77> 5983
+<ee78> <ee78> 4476
+<ee79> <ee79> 5984
+<ee7a> <ee7b> 4478
+<ee7c> <ee7c> 6447
+<ee7d> <ee7e> 5985
+<ee91> <ee91> 4481
+<ee92> <ee92> 5987
+<ee93> <ee93> 4482
+endcidrange
+
+100 begincidrange
+<ee94> <ee94> 5460
+<ee95> <ee96> 5988
+<ee97> <ee97> 4483
+<ee98> <ee98> 4163
+<ee99> <ee99> 4166
+<ee9a> <ee9a> 5990
+<ee9b> <ee9b> 4485
+<ee9c> <eea0> 5991
+<eea1> <eea1> 4487
+<eea2> <eea5> 5996
+<eea6> <eea6> 4488
+<eea7> <eea8> 6000
+<eea9> <eea9> 4489
+<eeaa> <eeaa> 4491
+<eeab> <eeab> 6002
+<eeac> <eeac> 4167
+<eead> <eead> 4493
+<eeae> <eeaf> 6003
+<eeb0> <eeb0> 4494
+<eeb1> <eebe> 6005
+<eebf> <eebf> 4495
+<eec0> <eec0> 6019
+<eec1> <eec1> 7783
+<eec2> <eec5> 6020
+<eec6> <eec6> 4497
+<eec7> <eec7> 4499
+<eec8> <eeca> 6024
+<eecb> <eecb> 4501
+<eecc> <eecc> 6027
+<eecd> <eecd> 4502
+<eece> <eece> 6028
+<eecf> <eed0> 4503
+<eed1> <eed2> 6029
+<eed3> <eed3> 4506
+<eed4> <eede> 6031
+<eedf> <eedf> 4508
+<eee0> <eee3> 6042
+<eee4> <eee4> 4509
+<eee5> <eee5> 6046
+<eee6> <eee6> 4510
+<eee7> <eef6> 6047
+<eef7> <eef7> 5797
+<eef8> <eefe> 6063
+<ef31> <ef76> 6070
+<ef77> <ef78> 4551
+<ef79> <ef7e> 6140
+<ef91> <ef91> 6146
+<ef92> <ef92> 4553
+<ef93> <ef93> 4180
+<ef94> <ef98> 6147
+<ef99> <ef99> 4555
+<ef9a> <ef9a> 6152
+<ef9b> <ef9b> 5800
+<ef9c> <ef9c> 6153
+<ef9d> <ef9d> 4556
+<ef9e> <ef9f> 6154
+<efa0> <efa0> 4557
+<efa1> <efa6> 6156
+<efa7> <efa7> 4560
+<efa8> <efab> 6162
+<efac> <efac> 4561
+<efad> <efcb> 6166
+<efcc> <efcc> 4563
+<efcd> <eff6> 6197
+<eff7> <eff7> 7988
+<eff8> <effe> 6239
+<f031> <f050> 6246
+<f051> <f051> 6123
+<f052> <f074> 6278
+<f075> <f075> 4577
+<f076> <f07e> 6313
+<f091> <f095> 6322
+<f096> <f096> 4183
+<f097> <f098> 6327
+<f099> <f099> 4579
+<f09a> <f09d> 6329
+<f09e> <f09e> 4581
+<f09f> <f09f> 6333
+<f0a0> <f0a0> 4582
+<f0a1> <f0a3> 6334
+<f0a4> <f0a4> 4584
+<f0a5> <f0a6> 6337
+<f0a7> <f0a7> 4586
+<f0a8> <f0a8> 6339
+<f0a9> <f0a9> 4588
+<f0aa> <f0aa> 4184
+<f0ab> <f0b9> 6340
+<f0ba> <f0bb> 4590
+<f0bc> <f0bc> 6355
+<f0bd> <f0bd> 4592
+<f0be> <f0c0> 6356
+<f0c1> <f0c1> 4593
+<f0c2> <f0c2> 4595
+<f0c3> <f0c5> 6359
+<f0c6> <f0c7> 4596
+<f0c8> <f0cb> 6362
+<f0cc> <f0cc> 4599
+<f0cd> <f0ce> 6366
+<f0cf> <f0d1> 4600
+<f0d2> <f0d2> 5552
+endcidrange
+
+92 begincidrange
+<f0d3> <f0d7> 6368
+<f0d8> <f0d8> 4603
+<f0d9> <f0fe> 6373
+<f131> <f135> 6411
+<f136> <f136> 4614
+<f137> <f137> 4616
+<f138> <f139> 6416
+<f13a> <f13a> 4618
+<f13b> <f13e> 6418
+<f13f> <f13f> 5950
+<f140> <f141> 4620
+<f142> <f142> 4187
+<f143> <f144> 6422
+<f145> <f145> 4625
+<f146> <f147> 6424
+<f148> <f148> 4627
+<f149> <f149> 6426
+<f14a> <f14a> 4629
+<f14b> <f14f> 6427
+<f150> <f151> 4632
+<f152> <f154> 6432
+<f155> <f155> 4634
+<f156> <f156> 4636
+<f157> <f158> 6435
+<f159> <f15a> 4188
+<f15b> <f164> 6437
+<f165> <f165> 4638
+<f166> <f16c> 6447
+<f16d> <f16e> 4640
+<f16f> <f170> 6454
+<f171> <f171> 4642
+<f172> <f173> 6456
+<f174> <f174> 4644
+<f175> <f176> 6458
+<f177> <f178> 4645
+<f179> <f17e> 6460
+<f191> <f198> 6466
+<f199> <f19a> 4647
+<f19b> <f19b> 6474
+<f19c> <f19c> 4650
+<f19d> <f1a0> 6475
+<f1a1> <f1a3> 4653
+<f1a4> <f1ed> 6479
+<f1ee> <f1ee> 5351
+<f1ef> <f1fe> 6553
+<f231> <f26a> 6569
+<f26b> <f26b> 6494
+<f26c> <f27e> 6627
+<f291> <f2fe> 6646
+<f331> <f37e> 6756
+<f391> <f3fe> 6834
+<f431> <f44c> 6944
+<f44d> <f44d> 5731
+<f44e> <f47e> 6972
+<f491> <f49b> 7021
+<f49c> <f49c> 5771
+<f49d> <f4b0> 7032
+<f4b1> <f4b1> 4191
+<f4b2> <f4fe> 7052
+<f531> <f536> 7129
+<f537> <f537> 6484
+<f538> <f57d> 7135
+<f57e> <f57e> 6684
+<f591> <f5fe> 7205
+<f631> <f67e> 7315
+<f691> <f695> 7393
+<f696> <f696> 4279
+<f697> <f697> 7398
+<f698> <f698> 7139
+<f699> <f6b7> 7399
+<f6b8> <f6b8> 4247
+<f6b9> <f6c7> 7430
+<f6c8> <f6c8> 4266
+<f6c9> <f6d2> 7445
+<f6d3> <f6d3> 4340
+<f6d4> <f6fe> 7455
+<f731> <f76a> 7498
+<f76b> <f76b> 7572
+<f76c> <f77e> 7556
+<f791> <f791> 7575
+<f792> <f792> 5088
+<f793> <f7fe> 7576
+<f831> <f831> 7709
+<f832> <f832> 3558
+<f833> <f875> 7684
+<f876> <f876> 3644
+<f877> <f87e> 7751
+<f891> <f8fe> 7759
+<f931> <f938> 7869
+<f939> <f939> 3815
+<f93a> <f97e> 7877
+<f991> <f9fe> 7946
+endcidrange
+endcmap
+CMapName currentdict /CMap defineresource pop
+end
+end
+
+%%EndResource
+%%EOF
diff --git a/src/main/resources/Resources/cmap/KSC-Johab-V b/src/main/resources/Resources/cmap/KSC-Johab-V
new file mode 100644
index 0000000..2841695
--- /dev/null
+++ b/src/main/resources/Resources/cmap/KSC-Johab-V
@@ -0,0 +1,76 @@
+%!PS-Adobe-3.0 Resource-CMap
+%%DocumentNeededResources: ProcSet (CIDInit)
+%%DocumentNeededResources: CMap (KSC-Johab-H)
+%%IncludeResource: ProcSet (CIDInit)
+%%IncludeResource: CMap (KSC-Johab-H)
+%%BeginResource: CMap (KSC-Johab-V)
+%%Title: (KSC-Johab-V Adobe Korea1 1)
+%%Version: 4.003
+%%Copyright: -----------------------------------------------------------
+%%Copyright: Copyright 1990-1997 Adobe Systems Incorporated.
+%%Copyright: All Rights Reserved.
+%%Copyright:
+%%Copyright: Patents Pending
+%%Copyright:
+%%Copyright: NOTICE: All information contained herein is the property
+%%Copyright: of Adobe Systems Incorporated.
+%%Copyright:
+%%Copyright: Permission is granted for redistribution of this file
+%%Copyright: provided this copyright notice is maintained intact and
+%%Copyright: that the contents of this file are not altered in any
+%%Copyright: way from its original form.
+%%Copyright:
+%%Copyright: PostScript and Display PostScript are trademarks of
+%%Copyright: Adobe Systems Incorporated which may be registered in
+%%Copyright: certain jurisdictions.
+%%Copyright: -----------------------------------------------------------
+%%EndComments
+
+/CIDInit /ProcSet findresource begin
+
+12 dict begin
+
+begincmap
+
+/KSC-Johab-H usecmap
+
+/CIDSystemInfo 3 dict dup begin
+ /Registry (Adobe) def
+ /Ordering (Korea1) def
+ /Supplement 1 def
+end def
+
+/CMapName /KSC-Johab-V def
+/CMapVersion 4.003 def
+/CMapType 1 def
+
+/UIDOffset 690 def
+/XUID [1 10 25412] def
+
+/WMode 1 def
+
+16 begincidrange
+<d932> <d933> 8056
+<d935> <d935> 8058
+<d936> <d936> 8320
+<d939> <d93b> 8059
+<d93d> <d93d> 8062
+<d942> <d94d> 8063
+<d97b> <d97b> 8075
+<da31> <da31> 8076
+<da38> <da39> 8077
+<da3c> <da3c> 8079
+<da3e> <da3e> 8080
+<da4a> <da4f> 8081
+<da6b> <da6b> 8087
+<da6d> <da6d> 8088
+<da6f> <da6f> 8089
+<da9d> <daa0> 8090
+endcidrange
+endcmap
+CMapName currentdict /CMap defineresource pop
+end
+end
+
+%%EndResource
+%%EOF
diff --git a/src/main/resources/Resources/cmap/KSCms-UHC-H b/src/main/resources/Resources/cmap/KSCms-UHC-H
new file mode 100644
index 0000000..449f43f
--- /dev/null
+++ b/src/main/resources/Resources/cmap/KSCms-UHC-H
@@ -0,0 +1 @@
+%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%IncludeResource: ProcSet (CIDInit) %%BeginResource: CMap (KSCms-UHC-H) %%Title: (KSCms-UHC-H Adobe Korea1 1) %%Version: 10.001 %%Copyright: ----------------------------------------------------------- %%Copyright: Copyright 1990-1999 Adobe Systems Incorporated. %%Copyright: All Rights Reserved. %%Copyright: %%Copyright: Patents Pending %%Copyright: %%Copyright: NOTICE: All information contained herein is the property %%Copyright: of Adobe Systems Incorporated. %%Copyright: %%Copyright: Permission is granted for redistribution of this file %%Copyright: provided this copyright notice is maintained intact and %%Copyright: that the contents of this file are not altered in any %%Copyright: way from its original form. %%Copyright: %%Copyright: PostScript and Display PostScript are trademarks of %%Copyright: Adobe Systems Incorporated which may be registered in %%Copyright: certain jurisdictions. %%Copyright: ----------------------------------------------------------- %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo 3 dict dup begin /Registry (Adobe) def /Ordering (Korea1) def /Supplement 1 def end def /CMapName /KSCms-UHC-H def /CMapVersion 10.001 def /CMapType 1 def /UIDOffset 430 def /XUID [1 10 25409] def /WMode 0 def 2 begincodespacerange <00> <80> <8141> <FEFE> endcodespacerange 1 beginnotdefrange <00> <1f> 1 endnotdefrange 100 begincidrange <20> <7e> 1 <8141> <815a> 9333 <8161> <817a> 9359 <8181> <81fe> 9385 <8241> <825a> 9511 <8261> <827a> 9537 <8281> <82fe> 9563 <8341> <835a> 9689 <8361> <837a> 9715 <8381> <83fe> 9741 <8441> <845a> 9867 <8461> <847a> 9893 <8481> <84fe> 9919 <8541> <855a> 10045 <8561> <857a> 10071 <8581> <85fe> 10097 <8641> <865a> 10223 <8661> <867a> 10249 <8681> <86fe> 10275 <8741> <875a> 10401 <8761> <877a> 10427 <8781> <87fe> 10453 <8841> <885a> 10579 <8861> <887a> 10605 <8881> <88fe> 10631 <8941> <895a> 10757 <8961> <897a> 10783 <8981> <89fe> 10809 <8a41> <8a5a> 10935 <8a61> <8a7a> 10961 <8a81> <8afe> 10987 <8b41> <8b5a> 11113 <8b61> <8b7a> 11139 <8b81> <8bfe> 11165 <8c41> <8c5a> 11291 <8c61> <8c7a> 11317 <8c81> <8cfe> 11343 <8d41> <8d5a> 11469 <8d61> <8d7a> 11495 <8d81> <8dfe> 11521 <8e41> <8e5a> 11647 <8e61> <8e7a> 11673 <8e81> <8efe> 11699 <8f41> <8f5a> 11825 <8f61> <8f7a> 11851 <8f81> <8ffe> 11877 <9041> <905a> 12003 <9061> <907a> 12029 <9081> <90fe> 12055 <9141> <915a> 12181 <9161> <917a> 12207 <9181> <91fe> 12233 <9241> <925a> 12359 <9261> <927a> 12385 <9281> <92fe> 12411 <9341> <935a> 12537 <9361> <937a> 12563 <9381> <93fe> 12589 <9441> <945a> 12715 <9461> <947a> 12741 <9481> <94fe> 12767 <9541> <955a> 12893 <9561> <957a> 12919 <9581> <95fe> 12945 <9641> <965a> 13071 <9661> <967a> 13097 <9681> <96fe> 13123 <9741> <975a> 13249 <9761> <977a> 13275 <9781> <97fe> 13301 <9841> <985a> 13427 <9861> <987a> 13453 <9881> <98fe> 13479 <9941> <995a> 13605 <9961> <997a> 13631 <9981> <99fe> 13657 <9a41> <9a5a> 13783 <9a61> <9a7a> 13809 <9a81> <9afe> 13835 <9b41> <9b5a> 13961 <9b61> <9b7a> 13987 <9b81> <9bfe> 14013 <9c41> <9c5a> 14139 <9c61> <9c7a> 14165 <9c81> <9cfe> 14191 <9d41> <9d5a> 14317 <9d61> <9d7a> 14343 <9d81> <9dfe> 14369 <9e41> <9e5a> 14495 <9e61> <9e7a> 14521 <9e81> <9efe> 14547 <9f41> <9f5a> 14673 <9f61> <9f7a> 14699 <9f81> <9ffe> 14725 <a041> <a05a> 14851 <a061> <a07a> 14877 <a081> <a0fe> 14903 <a141> <a15a> 15029 <a161> <a17a> 15055 <a181> <a1a0> 15081 endcidrange 100 begincidrange <a1a1> <a1fe> 101 <a241> <a25a> 15113 <a261> <a27a> 15139 <a281> <a2a0> 15165 <a2a1> <a2e5> 195 <a341> <a35a> 15197 <a361> <a37a> 15223 <a381> <a3a0> 15249 <a3a1> <a3fe> 264 <a441> <a45a> 15281 <a461> <a47a> 15307 <a481> <a4a0> 15333 <a4a1> <a4d3> 358 <a4d5> <a4fe> 409 <a541> <a55a> 15365 <a561> <a57a> 15391 <a581> <a5a0> 15417 <a5a1> <a5aa> 451 <a5b0> <a5b9> 461 <a5c1> <a5d8> 471 <a5e1> <a5f8> 495 <a641> <a65a> 15449 <a661> <a67a> 15475 <a681> <a6a0> 15501 <a6a1> <a6e4> 519 <a741> <a75a> 15533 <a761> <a77a> 15559 <a781> <a7a0> 15585 <a7a1> <a7ef> 587 <a841> <a85a> 15617 <a861> <a87a> 15643 <a881> <a8a0> 15669 <a8a1> <a8a4> 666 <a8a6> <a8a6> 670 <a8a8> <a8af> 671 <a8b1> <a8fe> 679 <a941> <a95a> 15701 <a961> <a97a> 15727 <a981> <a9a0> 15753 <a9a1> <a9fe> 757 <aa41> <aa5a> 15785 <aa61> <aa7a> 15811 <aa81> <aaa0> 15837 <aaa1> <aaf3> 851 <ab41> <ab5a> 15869 <ab61> <ab7a> 15895 <ab81> <aba0> 15921 <aba1> <abf6> 934 <ac41> <ac5a> 15953 <ac61> <ac7a> 15979 <ac81> <aca0> 16005 <aca1> <acc1> 1020 <acd1> <acf1> 1053 <ad41> <ad5a> 16037 <ad61> <ad7a> 16063 <ad81> <ada0> 16089 <ae41> <ae5a> 16121 <ae61> <ae7a> 16147 <ae81> <aea0> 16173 <af41> <af5a> 16205 <af61> <af7a> 16231 <af81> <afa0> 16257 <b041> <b05a> 16289 <b061> <b07a> 16315 <b081> <b0a0> 16341 <b0a1> <b0fe> 1086 <b141> <b15a> 16373 <b161> <b17a> 16399 <b181> <b1a0> 16425 <b1a1> <b1fe> 1180 <b241> <b25a> 16457 <b261> <b27a> 16483 <b281> <b2a0> 16509 <b2a1> <b2fe> 1274 <b341> <b35a> 16541 <b361> <b37a> 16567 <b381> <b3a0> 16593 <b3a1> <b3fe> 1368 <b441> <b45a> 16625 <b461> <b47a> 16651 <b481> <b4a0> 16677 <b4a1> <b4fe> 1462 <b541> <b55a> 16709 <b561> <b57a> 16735 <b581> <b5a0> 16761 <b5a1> <b5fe> 1556 <b641> <b65a> 16793 <b661> <b67a> 16819 <b681> <b6a0> 16845 <b6a1> <b6fe> 1650 <b741> <b75a> 16877 <b761> <b77a> 16903 <b781> <b7a0> 16929 <b7a1> <b7fe> 1744 <b841> <b85a> 16961 <b861> <b87a> 16987 <b881> <b8a0> 17013 <b8a1> <b8fe> 1838 <b941> <b95a> 17045 <b961> <b97a> 17071 endcidrange 100 begincidrange <b981> <b9a0> 17097 <b9a1> <b9fe> 1932 <ba41> <ba5a> 17129 <ba61> <ba7a> 17155 <ba81> <baa0> 17181 <baa1> <bafe> 2026 <bb41> <bb5a> 17213 <bb61> <bb7a> 17239 <bb81> <bba0> 17265 <bba1> <bbfe> 2120 <bc41> <bc5a> 17297 <bc61> <bc7a> 17323 <bc81> <bca0> 17349 <bca1> <bcfe> 2214 <bd41> <bd5a> 17381 <bd61> <bd7a> 17407 <bd81> <bda0> 17433 <bda1> <bdfe> 2308 <be41> <be5a> 17465 <be61> <be7a> 17491 <be81> <bea0> 17517 <bea1> <befe> 2402 <bf41> <bf5a> 17549 <bf61> <bf7a> 17575 <bf81> <bfa0> 17601 <bfa1> <bffe> 2496 <c041> <c05a> 17633 <c061> <c07a> 17659 <c081> <c0a0> 17685 <c0a1> <c0fe> 2590 <c141> <c15a> 17717 <c161> <c17a> 17743 <c181> <c1a0> 17769 <c1a1> <c1fe> 2684 <c241> <c25a> 17801 <c261> <c27a> 17827 <c281> <c2a0> 17853 <c2a1> <c2fe> 2778 <c341> <c35a> 17885 <c361> <c37a> 17911 <c381> <c3a0> 17937 <c3a1> <c3fe> 2872 <c441> <c45a> 17969 <c461> <c47a> 17995 <c481> <c4a0> 18021 <c4a1> <c4fe> 2966 <c541> <c55a> 18053 <c561> <c57a> 18079 <c581> <c5a0> 18105 <c5a1> <c5fe> 3060 <c641> <c652> 18137 <c6a1> <c6fe> 3154 <c7a1> <c7fe> 3248 <c8a1> <c8fe> 3342 <caa1> <cafe> 3436 <cba1> <cbcf> 3530 <cbd0> <cbd0> 4116 <cbd1> <cbd5> 3577 <cbd6> <cbd6> 3678 <cbd7> <cbe6> 3582 <cbe7> <cbe7> 7053 <cbe8> <cbfe> 3598 <cca1> <ccfe> 3621 <cda1> <cdce> 3715 <cdcf> <cdcf> 3460 <cdd0> <cde7> 3761 <cde8> <cde8> 7900 <cde9> <cdfe> 3785 <cea1> <ceac> 3807 <cead> <cead> 3802 <ceae> <cefe> 3819 <cfa1> <cffa> 3900 <cffb> <cffb> 3902 <cffc> <cffe> 3990 <d0a1> <d0a1> 3993 <d0a2> <d0a2> 3946 <d0a3> <d0b7> 3994 <d0b8> <d0b8> 3946 <d0b9> <d0cf> 4015 <d0d0> <d0d0> 3708 <d0d1> <d0dc> 4038 <d0dd> <d0dd> 4131 <d0de> <d0fe> 4050 <d1a1> <d1d3> 4083 <d1d4> <d1d4> 4374 <d1d5> <d1d5> 4156 <d1d6> <d1d7> 4134 <d1d8> <d1d8> 4375 <d1d9> <d1da> 4136 <d1db> <d1e0> 4376 <d1e1> <d1e1> 4138 <d1e2> <d1e2> 5800 <d1e3> <d1e5> 4382 <d1e6> <d1e6> 4386 <d1e7> <d1e7> 4139 <d1e8> <d1eb> 4387 <d1ec> <d1ec> 4140 <d1ed> <d1ed> 4391 <d1ee> <d1ee> 4141 <d1ef> <d1f0> 4394 endcidrange 100 begincidrange <d1f1> <d1f1> 4142 <d1f2> <d1f2> 4396 <d1f3> <d1f5> 4143 <d1f6> <d1f6> 4399 <d1f7> <d1f9> 4146 <d1fa> <d1fa> 4403 <d1fb> <d1fb> 4149 <d1fc> <d1fd> 4406 <d1fe> <d1fe> 4409 <d2a1> <d2a1> 4150 <d2a2> <d2a3> 4410 <d2a4> <d2a6> 4151 <d2a7> <d2aa> 4412 <d2ab> <d2ab> 4419 <d2ac> <d2ac> 4154 <d2ad> <d2ad> 4420 <d2ae> <d2b1> 4155 <d2b2> <d2b2> 4424 <d2b3> <d2bd> 4159 <d2be> <d2be> 4511 <d2bf> <d2c1> 4170 <d2c2> <d2c3> 4513 <d2c4> <d2c4> 4517 <d2c5> <d2c5> 4173 <d2c6> <d2ca> 4518 <d2cb> <d2cb> 4524 <d2cc> <d2cc> 4174 <d2cd> <d2ce> 4525 <d2cf> <d2d4> 4528 <d2d5> <d2d7> 4535 <d2d8> <d2d8> 4175 <d2d9> <d2da> 4541 <d2db> <d2dd> 4176 <d2de> <d2df> 4545 <d2e0> <d2e0> 4179 <d2e1> <d2e1> 4547 <d2e2> <d2e2> 4550 <d2e3> <d2e3> 4180 <d2e4> <d2e4> 4564 <d2e5> <d2e8> 4566 <d2e9> <d2ea> 4571 <d2eb> <d2eb> 4576 <d2ec> <d2ef> 4181 <d2f0> <d2f3> 4604 <d2f4> <d2f5> 4609 <d2f6> <d2f6> 4185 <d2f7> <d2f8> 4611 <d2f9> <d2fe> 4186 <d3a1> <d3fe> 4192 <d4a1> <d4e5> 4286 <d4e6> <d4e6> 4318 <d4e7> <d4fb> 4355 <d4fc> <d4fc> 4136 <d4fd> <d4fe> 4376 <d5a1> <d5a4> 4378 <d5a5> <d5a5> 5800 <d5a6> <d5aa> 4382 <d5ab> <d5ab> 4139 <d5ac> <d5ad> 4387 <d5ae> <d5ae> 4192 <d5af> <d5fe> 4389 <d6a1> <d6b7> 4469 <d6b8> <d6b8> 4167 <d6b9> <d6cc> 4492 <d6cd> <d6cd> 4172 <d6ce> <d6fe> 4512 <d7a1> <d7ca> 4561 <d7cb> <d7cb> 5552 <d7cc> <d7e3> 4603 <d7e4> <d7e4> 6424 <d7e5> <d7fe> 4627 <d8a1> <d8fe> 4653 <d9a1> <d9fe> 4747 <daa1> <dafe> 4841 <dba1> <dbc4> 4935 <dbc5> <dbc5> 5151 <dbc6> <dbe3> 4971 <dbe4> <dbe4> 4922 <dbe5> <dbfe> 5001 <dca1> <dca4> 5027 <dca5> <dca5> 7518 <dca6> <dcfe> 5031 <dda1> <dda4> 5120 <dda5> <dda5> 5079 <dda6> <ddd4> 5124 <ddd5> <ddd5> 5109 <ddd6> <ddf3> 5171 <ddf4> <ddf4> 7607 <ddf5> <ddfe> 5201 <dea1> <defb> 5211 <defc> <defc> 5584 <defd> <defd> 5302 <defe> <defe> 5367 <dfa1> <dfb2> 5303 <dfb3> <dfb3> 7083 <dfb4> <dfe0> 5321 <dfe1> <dfe1> 5362 <dfe2> <dfe7> 5366 <dfe8> <dfe8> 5485 <dfe9> <dffe> 5372 endcidrange 100 begincidrange <e0a1> <e0f0> 5394 <e0f1> <e0f1> 6001 <e0f2> <e0fe> 5474 <e1a1> <e1ac> 5487 <e1ad> <e1ad> 5460 <e1ae> <e1ec> 5499 <e1ed> <e1ed> 5317 <e1ee> <e1fe> 5562 <e2a1> <e2fe> 5579 <e3a1> <e3f4> 5673 <e3f5> <e3f5> 7009 <e3f6> <e3fe> 5757 <e4a1> <e4a1> 7370 <e4a2> <e4a8> 5766 <e4a9> <e4a9> 5678 <e4aa> <e4fe> 5773 <e5a1> <e5ad> 5858 <e5ae> <e5ae> 5874 <e5af> <e5b0> 5871 <e5b1> <e5b2> 4425 <e5b3> <e5b8> 5873 <e5b9> <e5b9> 4427 <e5ba> <e5ba> 5879 <e5bb> <e5bc> 4429 <e5bd> <e5c3> 5880 <e5c4> <e5c4> 4431 <e5c5> <e5cd> 5887 <e5ce> <e5ce> 4435 <e5cf> <e5cf> 5896 <e5d0> <e5d0> 4436 <e5d1> <e5d1> 5897 <e5d2> <e5d2> 4437 <e5d3> <e5d5> 5898 <e5d6> <e5d6> 4439 <e5d7> <e5f9> 5901 <e5fa> <e5fb> 4442 <e5fc> <e5fc> 4159 <e5fd> <e5fd> 5936 <e5fe> <e5fe> 4444 <e6a1> <e6a1> 4447 <e6a2> <e6a3> 5937 <e6a4> <e6a4> 4449 <e6a5> <e6a6> 5939 <e6a7> <e6a7> 4450 <e6a8> <e6ac> 5941 <e6ad> <e6ad> 4453 <e6ae> <e6ae> 5946 <e6af> <e6b1> 4455 <e6b2> <e6b2> 5947 <e6b3> <e6b3> 4458 <e6b4> <e6b6> 5948 <e6b7> <e6b8> 4459 <e6b9> <e6bb> 5951 <e6bc> <e6bc> 4463 <e6bd> <e6c3> 5954 <e6c4> <e6c4> 4160 <e6c5> <e6c5> 5961 <e6c6> <e6c7> 4465 <e6c8> <e6c9> 5962 <e6ca> <e6ca> 4161 <e6cb> <e6d1> 5964 <e6d2> <e6d2> 4468 <e6d3> <e6d5> 5971 <e6d6> <e6d6> 4469 <e6d7> <e6d8> 5974 <e6d9> <e6d9> 4470 <e6da> <e6db> 5976 <e6dc> <e6dc> 4162 <e6dd> <e6de> 5978 <e6df> <e6df> 4471 <e6e0> <e6e0> 5980 <e6e1> <e6e1> 4472 <e6e2> <e6e3> 5981 <e6e4> <e6e4> 4474 <e6e5> <e6e5> 4473 <e6e6> <e6e6> 4475 <e6e7> <e6e7> 5983 <e6e8> <e6e8> 4476 <e6e9> <e6e9> 5984 <e6ea> <e6eb> 4478 <e6ec> <e6ec> 6447 <e6ed> <e6ee> 5985 <e6ef> <e6ef> 4481 <e6f0> <e6f0> 5987 <e6f1> <e6f1> 4482 <e6f2> <e6f2> 5460 <e6f3> <e6f4> 5988 <e6f5> <e6f5> 4483 <e6f6> <e6f6> 4163 <e6f7> <e6f7> 4166 <e6f8> <e6f8> 5990 <e6f9> <e6f9> 4485 <e6fa> <e6fe> 5991 <e7a1> <e7a1> 4487 <e7a2> <e7a5> 5996 <e7a6> <e7a6> 4488 <e7a7> <e7a8> 6000 <e7a9> <e7a9> 4489 <e7aa> <e7aa> 4491 <e7ab> <e7ab> 6002 endcidrange 100 begincidrange <e7ac> <e7ac> 4167 <e7ad> <e7ad> 4493 <e7ae> <e7af> 6003 <e7b0> <e7b0> 4494 <e7b1> <e7be> 6005 <e7bf> <e7bf> 4495 <e7c0> <e7c0> 6019 <e7c1> <e7c1> 7783 <e7c2> <e7c5> 6020 <e7c6> <e7c6> 4497 <e7c7> <e7c7> 4499 <e7c8> <e7ca> 6024 <e7cb> <e7cb> 4501 <e7cc> <e7cc> 6027 <e7cd> <e7cd> 4502 <e7ce> <e7ce> 6028 <e7cf> <e7d0> 4503 <e7d1> <e7d2> 6029 <e7d3> <e7d3> 4506 <e7d4> <e7de> 6031 <e7df> <e7df> 4508 <e7e0> <e7e3> 6042 <e7e4> <e7e4> 4509 <e7e5> <e7e5> 6046 <e7e6> <e7e6> 4510 <e7e7> <e7f6> 6047 <e7f7> <e7f7> 5797 <e7f8> <e7fe> 6063 <e8a1> <e8e6> 6070 <e8e7> <e8e8> 4551 <e8e9> <e8ef> 6140 <e8f0> <e8f0> 4553 <e8f1> <e8f1> 4180 <e8f2> <e8f6> 6147 <e8f7> <e8f7> 4555 <e8f8> <e8f8> 6152 <e8f9> <e8f9> 5800 <e8fa> <e8fa> 6153 <e8fb> <e8fb> 4556 <e8fc> <e8fd> 6154 <e8fe> <e8fe> 4557 <e9a1> <e9a6> 6156 <e9a7> <e9a7> 4560 <e9a8> <e9ab> 6162 <e9ac> <e9ac> 4561 <e9ad> <e9cb> 6166 <e9cc> <e9cc> 4563 <e9cd> <e9f6> 6197 <e9f7> <e9f7> 7988 <e9f8> <e9fe> 6239 <eaa1> <eac0> 6246 <eac1> <eac1> 6123 <eac2> <eae4> 6278 <eae5> <eae5> 4577 <eae6> <eaf3> 6313 <eaf4> <eaf4> 4183 <eaf5> <eaf6> 6327 <eaf7> <eaf7> 4579 <eaf8> <eafb> 6329 <eafc> <eafc> 4581 <eafd> <eafd> 6333 <eafe> <eafe> 4582 <eba1> <eba3> 6334 <eba4> <eba4> 4584 <eba5> <eba6> 6337 <eba7> <eba7> 4586 <eba8> <eba8> 6339 <eba9> <eba9> 4588 <ebaa> <ebaa> 4184 <ebab> <ebb9> 6340 <ebba> <ebbb> 4590 <ebbc> <ebbc> 6355 <ebbd> <ebbd> 4592 <ebbe> <ebc0> 6356 <ebc1> <ebc1> 4593 <ebc2> <ebc2> 4595 <ebc3> <ebc5> 6359 <ebc6> <ebc7> 4596 <ebc8> <ebcb> 6362 <ebcc> <ebcc> 4599 <ebcd> <ebce> 6366 <ebcf> <ebd1> 4600 <ebd2> <ebd2> 5552 <ebd3> <ebd7> 6368 <ebd8> <ebd8> 4603 <ebd9> <ebfe> 6373 <eca1> <eca5> 6411 <eca6> <eca6> 4614 <eca7> <eca7> 4616 <eca8> <eca9> 6416 <ecaa> <ecaa> 4618 <ecab> <ecae> 6418 <ecaf> <ecaf> 5950 <ecb0> <ecb1> 4620 <ecb2> <ecb2> 4187 <ecb3> <ecb4> 6422 <ecb5> <ecb5> 4625 <ecb6> <ecb7> 6424 <ecb8> <ecb8> 4627 <ecb9> <ecb9> 6426 endcidrange 75 begincidrange <ecba> <ecba> 4629 <ecbb> <ecbf> 6427 <ecc0> <ecc1> 4632 <ecc2> <ecc4> 6432 <ecc5> <ecc5> 4634 <ecc6> <ecc6> 4636 <ecc7> <ecc8> 6435 <ecc9> <ecca> 4188 <eccb> <ecd4> 6437 <ecd5> <ecd5> 4638 <ecd6> <ecdc> 6447 <ecdd> <ecde> 4640 <ecdf> <ece0> 6454 <ece1> <ece1> 4642 <ece2> <ece3> 6456 <ece4> <ece4> 4644 <ece5> <ece6> 6458 <ece7> <ece8> 4645 <ece9> <ecf6> 6460 <ecf7> <ecf8> 4647 <ecf9> <ecf9> 6474 <ecfa> <ecfa> 4650 <ecfb> <ecfe> 6475 <eda1> <eda3> 4653 <eda4> <eded> 6479 <edee> <edee> 5351 <edef> <edfe> 6553 <eea1> <eeda> 6569 <eedb> <eedb> 6494 <eedc> <eefe> 6627 <efa1> <effe> 6662 <f0a1> <f0fe> 6756 <f1a1> <f1fe> 6850 <f2a1> <f2bc> 6944 <f2bd> <f2bd> 5731 <f2be> <f2f9> 6972 <f2fa> <f2fa> 5771 <f2fb> <f2fe> 7032 <f3a1> <f3b0> 7036 <f3b1> <f3b1> 4191 <f3b2> <f3fe> 7052 <f4a1> <f4a6> 7129 <f4a7> <f4a7> 6484 <f4a8> <f4ed> 7135 <f4ee> <f4ee> 6684 <f4ef> <f4fe> 7205 <f5a1> <f5fe> 7221 <f6a1> <f6f3> 7315 <f6f4> <f6f4> 4279 <f6f5> <f6f5> 7398 <f6f6> <f6f6> 7139 <f6f7> <f6fe> 7399 <f7a1> <f7b7> 7407 <f7b8> <f7b8> 4247 <f7b9> <f7c7> 7430 <f7c8> <f7c8> 4266 <f7c9> <f7d2> 7445 <f7d3> <f7d3> 4340 <f7d4> <f7fe> 7455 <f8a1> <f8da> 7498 <f8db> <f8db> 7572 <f8dc> <f8ef> 7556 <f8f0> <f8f0> 5088 <f8f1> <f8fe> 7576 <f9a1> <f9fe> 7590 <faa1> <faa1> 7709 <faa2> <faa2> 3558 <faa3> <fae5> 7684 <fae6> <fae6> 3644 <fae7> <fafe> 7751 <fba1> <fbfe> 7775 <fca1> <fca8> 7869 <fca9> <fca9> 3815 <fcaa> <fcfe> 7877 <fda1> <fdfe> 7962 endcidrange endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF \ No newline at end of file
diff --git a/src/main/resources/Resources/cmap/KSCms-UHC-HW-H b/src/main/resources/Resources/cmap/KSCms-UHC-HW-H
new file mode 100644
index 0000000..c468c91
--- /dev/null
+++ b/src/main/resources/Resources/cmap/KSCms-UHC-HW-H
@@ -0,0 +1 @@
+%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%IncludeResource: ProcSet (CIDInit) %%BeginResource: CMap (KSCms-UHC-HW-H) %%Title: (KSCms-UHC-HW-H Adobe Korea1 1) %%Version: 10.001 %%Copyright: ----------------------------------------------------------- %%Copyright: Copyright 1990-1999 Adobe Systems Incorporated. %%Copyright: All Rights Reserved. %%Copyright: %%Copyright: Patents Pending %%Copyright: %%Copyright: NOTICE: All information contained herein is the property %%Copyright: of Adobe Systems Incorporated. %%Copyright: %%Copyright: Permission is granted for redistribution of this file %%Copyright: provided this copyright notice is maintained intact and %%Copyright: that the contents of this file are not altered in any %%Copyright: way from its original form. %%Copyright: %%Copyright: PostScript and Display PostScript are trademarks of %%Copyright: Adobe Systems Incorporated which may be registered in %%Copyright: certain jurisdictions. %%Copyright: ----------------------------------------------------------- %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo 3 dict dup begin /Registry (Adobe) def /Ordering (Korea1) def /Supplement 1 def end def /CMapName /KSCms-UHC-HW-H def /CMapVersion 10.001 def /CMapType 1 def /XUID [1 10 25416] def /WMode 0 def 2 begincodespacerange <00> <80> <8141> <FEFE> endcodespacerange 1 beginnotdefrange <00> <1f> 8094 endnotdefrange 100 begincidrange <20> <7e> 8094 <8141> <815a> 9333 <8161> <817a> 9359 <8181> <81fe> 9385 <8241> <825a> 9511 <8261> <827a> 9537 <8281> <82fe> 9563 <8341> <835a> 9689 <8361> <837a> 9715 <8381> <83fe> 9741 <8441> <845a> 9867 <8461> <847a> 9893 <8481> <84fe> 9919 <8541> <855a> 10045 <8561> <857a> 10071 <8581> <85fe> 10097 <8641> <865a> 10223 <8661> <867a> 10249 <8681> <86fe> 10275 <8741> <875a> 10401 <8761> <877a> 10427 <8781> <87fe> 10453 <8841> <885a> 10579 <8861> <887a> 10605 <8881> <88fe> 10631 <8941> <895a> 10757 <8961> <897a> 10783 <8981> <89fe> 10809 <8a41> <8a5a> 10935 <8a61> <8a7a> 10961 <8a81> <8afe> 10987 <8b41> <8b5a> 11113 <8b61> <8b7a> 11139 <8b81> <8bfe> 11165 <8c41> <8c5a> 11291 <8c61> <8c7a> 11317 <8c81> <8cfe> 11343 <8d41> <8d5a> 11469 <8d61> <8d7a> 11495 <8d81> <8dfe> 11521 <8e41> <8e5a> 11647 <8e61> <8e7a> 11673 <8e81> <8efe> 11699 <8f41> <8f5a> 11825 <8f61> <8f7a> 11851 <8f81> <8ffe> 11877 <9041> <905a> 12003 <9061> <907a> 12029 <9081> <90fe> 12055 <9141> <915a> 12181 <9161> <917a> 12207 <9181> <91fe> 12233 <9241> <925a> 12359 <9261> <927a> 12385 <9281> <92fe> 12411 <9341> <935a> 12537 <9361> <937a> 12563 <9381> <93fe> 12589 <9441> <945a> 12715 <9461> <947a> 12741 <9481> <94fe> 12767 <9541> <955a> 12893 <9561> <957a> 12919 <9581> <95fe> 12945 <9641> <965a> 13071 <9661> <967a> 13097 <9681> <96fe> 13123 <9741> <975a> 13249 <9761> <977a> 13275 <9781> <97fe> 13301 <9841> <985a> 13427 <9861> <987a> 13453 <9881> <98fe> 13479 <9941> <995a> 13605 <9961> <997a> 13631 <9981> <99fe> 13657 <9a41> <9a5a> 13783 <9a61> <9a7a> 13809 <9a81> <9afe> 13835 <9b41> <9b5a> 13961 <9b61> <9b7a> 13987 <9b81> <9bfe> 14013 <9c41> <9c5a> 14139 <9c61> <9c7a> 14165 <9c81> <9cfe> 14191 <9d41> <9d5a> 14317 <9d61> <9d7a> 14343 <9d81> <9dfe> 14369 <9e41> <9e5a> 14495 <9e61> <9e7a> 14521 <9e81> <9efe> 14547 <9f41> <9f5a> 14673 <9f61> <9f7a> 14699 <9f81> <9ffe> 14725 <a041> <a05a> 14851 <a061> <a07a> 14877 <a081> <a0fe> 14903 <a141> <a15a> 15029 <a161> <a17a> 15055 <a181> <a1a0> 15081 endcidrange 100 begincidrange <a1a1> <a1fe> 101 <a241> <a25a> 15113 <a261> <a27a> 15139 <a281> <a2a0> 15165 <a2a1> <a2e5> 195 <a341> <a35a> 15197 <a361> <a37a> 15223 <a381> <a3a0> 15249 <a3a1> <a3fe> 264 <a441> <a45a> 15281 <a461> <a47a> 15307 <a481> <a4a0> 15333 <a4a1> <a4d3> 358 <a4d5> <a4fe> 409 <a541> <a55a> 15365 <a561> <a57a> 15391 <a581> <a5a0> 15417 <a5a1> <a5aa> 451 <a5b0> <a5b9> 461 <a5c1> <a5d8> 471 <a5e1> <a5f8> 495 <a641> <a65a> 15449 <a661> <a67a> 15475 <a681> <a6a0> 15501 <a6a1> <a6e4> 519 <a741> <a75a> 15533 <a761> <a77a> 15559 <a781> <a7a0> 15585 <a7a1> <a7ef> 587 <a841> <a85a> 15617 <a861> <a87a> 15643 <a881> <a8a0> 15669 <a8a1> <a8a4> 666 <a8a6> <a8a6> 670 <a8a8> <a8af> 671 <a8b1> <a8fe> 679 <a941> <a95a> 15701 <a961> <a97a> 15727 <a981> <a9a0> 15753 <a9a1> <a9fe> 757 <aa41> <aa5a> 15785 <aa61> <aa7a> 15811 <aa81> <aaa0> 15837 <aaa1> <aaf3> 851 <ab41> <ab5a> 15869 <ab61> <ab7a> 15895 <ab81> <aba0> 15921 <aba1> <abf6> 934 <ac41> <ac5a> 15953 <ac61> <ac7a> 15979 <ac81> <aca0> 16005 <aca1> <acc1> 1020 <acd1> <acf1> 1053 <ad41> <ad5a> 16037 <ad61> <ad7a> 16063 <ad81> <ada0> 16089 <ae41> <ae5a> 16121 <ae61> <ae7a> 16147 <ae81> <aea0> 16173 <af41> <af5a> 16205 <af61> <af7a> 16231 <af81> <afa0> 16257 <b041> <b05a> 16289 <b061> <b07a> 16315 <b081> <b0a0> 16341 <b0a1> <b0fe> 1086 <b141> <b15a> 16373 <b161> <b17a> 16399 <b181> <b1a0> 16425 <b1a1> <b1fe> 1180 <b241> <b25a> 16457 <b261> <b27a> 16483 <b281> <b2a0> 16509 <b2a1> <b2fe> 1274 <b341> <b35a> 16541 <b361> <b37a> 16567 <b381> <b3a0> 16593 <b3a1> <b3fe> 1368 <b441> <b45a> 16625 <b461> <b47a> 16651 <b481> <b4a0> 16677 <b4a1> <b4fe> 1462 <b541> <b55a> 16709 <b561> <b57a> 16735 <b581> <b5a0> 16761 <b5a1> <b5fe> 1556 <b641> <b65a> 16793 <b661> <b67a> 16819 <b681> <b6a0> 16845 <b6a1> <b6fe> 1650 <b741> <b75a> 16877 <b761> <b77a> 16903 <b781> <b7a0> 16929 <b7a1> <b7fe> 1744 <b841> <b85a> 16961 <b861> <b87a> 16987 <b881> <b8a0> 17013 <b8a1> <b8fe> 1838 <b941> <b95a> 17045 <b961> <b97a> 17071 endcidrange 100 begincidrange <b981> <b9a0> 17097 <b9a1> <b9fe> 1932 <ba41> <ba5a> 17129 <ba61> <ba7a> 17155 <ba81> <baa0> 17181 <baa1> <bafe> 2026 <bb41> <bb5a> 17213 <bb61> <bb7a> 17239 <bb81> <bba0> 17265 <bba1> <bbfe> 2120 <bc41> <bc5a> 17297 <bc61> <bc7a> 17323 <bc81> <bca0> 17349 <bca1> <bcfe> 2214 <bd41> <bd5a> 17381 <bd61> <bd7a> 17407 <bd81> <bda0> 17433 <bda1> <bdfe> 2308 <be41> <be5a> 17465 <be61> <be7a> 17491 <be81> <bea0> 17517 <bea1> <befe> 2402 <bf41> <bf5a> 17549 <bf61> <bf7a> 17575 <bf81> <bfa0> 17601 <bfa1> <bffe> 2496 <c041> <c05a> 17633 <c061> <c07a> 17659 <c081> <c0a0> 17685 <c0a1> <c0fe> 2590 <c141> <c15a> 17717 <c161> <c17a> 17743 <c181> <c1a0> 17769 <c1a1> <c1fe> 2684 <c241> <c25a> 17801 <c261> <c27a> 17827 <c281> <c2a0> 17853 <c2a1> <c2fe> 2778 <c341> <c35a> 17885 <c361> <c37a> 17911 <c381> <c3a0> 17937 <c3a1> <c3fe> 2872 <c441> <c45a> 17969 <c461> <c47a> 17995 <c481> <c4a0> 18021 <c4a1> <c4fe> 2966 <c541> <c55a> 18053 <c561> <c57a> 18079 <c581> <c5a0> 18105 <c5a1> <c5fe> 3060 <c641> <c652> 18137 <c6a1> <c6fe> 3154 <c7a1> <c7fe> 3248 <c8a1> <c8fe> 3342 <caa1> <cafe> 3436 <cba1> <cbcf> 3530 <cbd0> <cbd0> 4116 <cbd1> <cbd5> 3577 <cbd6> <cbd6> 3678 <cbd7> <cbe6> 3582 <cbe7> <cbe7> 7053 <cbe8> <cbfe> 3598 <cca1> <ccfe> 3621 <cda1> <cdce> 3715 <cdcf> <cdcf> 3460 <cdd0> <cde7> 3761 <cde8> <cde8> 7900 <cde9> <cdfe> 3785 <cea1> <ceac> 3807 <cead> <cead> 3802 <ceae> <cefe> 3819 <cfa1> <cffa> 3900 <cffb> <cffb> 3902 <cffc> <cffe> 3990 <d0a1> <d0a1> 3993 <d0a2> <d0a2> 3946 <d0a3> <d0b7> 3994 <d0b8> <d0b8> 3946 <d0b9> <d0cf> 4015 <d0d0> <d0d0> 3708 <d0d1> <d0dc> 4038 <d0dd> <d0dd> 4131 <d0de> <d0fe> 4050 <d1a1> <d1d3> 4083 <d1d4> <d1d4> 4374 <d1d5> <d1d5> 4156 <d1d6> <d1d7> 4134 <d1d8> <d1d8> 4375 <d1d9> <d1da> 4136 <d1db> <d1e0> 4376 <d1e1> <d1e1> 4138 <d1e2> <d1e2> 5800 <d1e3> <d1e5> 4382 <d1e6> <d1e6> 4386 <d1e7> <d1e7> 4139 <d1e8> <d1eb> 4387 <d1ec> <d1ec> 4140 <d1ed> <d1ed> 4391 <d1ee> <d1ee> 4141 <d1ef> <d1f0> 4394 endcidrange 100 begincidrange <d1f1> <d1f1> 4142 <d1f2> <d1f2> 4396 <d1f3> <d1f5> 4143 <d1f6> <d1f6> 4399 <d1f7> <d1f9> 4146 <d1fa> <d1fa> 4403 <d1fb> <d1fb> 4149 <d1fc> <d1fd> 4406 <d1fe> <d1fe> 4409 <d2a1> <d2a1> 4150 <d2a2> <d2a3> 4410 <d2a4> <d2a6> 4151 <d2a7> <d2aa> 4412 <d2ab> <d2ab> 4419 <d2ac> <d2ac> 4154 <d2ad> <d2ad> 4420 <d2ae> <d2b1> 4155 <d2b2> <d2b2> 4424 <d2b3> <d2bd> 4159 <d2be> <d2be> 4511 <d2bf> <d2c1> 4170 <d2c2> <d2c3> 4513 <d2c4> <d2c4> 4517 <d2c5> <d2c5> 4173 <d2c6> <d2ca> 4518 <d2cb> <d2cb> 4524 <d2cc> <d2cc> 4174 <d2cd> <d2ce> 4525 <d2cf> <d2d4> 4528 <d2d5> <d2d7> 4535 <d2d8> <d2d8> 4175 <d2d9> <d2da> 4541 <d2db> <d2dd> 4176 <d2de> <d2df> 4545 <d2e0> <d2e0> 4179 <d2e1> <d2e1> 4547 <d2e2> <d2e2> 4550 <d2e3> <d2e3> 4180 <d2e4> <d2e4> 4564 <d2e5> <d2e8> 4566 <d2e9> <d2ea> 4571 <d2eb> <d2eb> 4576 <d2ec> <d2ef> 4181 <d2f0> <d2f3> 4604 <d2f4> <d2f5> 4609 <d2f6> <d2f6> 4185 <d2f7> <d2f8> 4611 <d2f9> <d2fe> 4186 <d3a1> <d3fe> 4192 <d4a1> <d4e5> 4286 <d4e6> <d4e6> 4318 <d4e7> <d4fb> 4355 <d4fc> <d4fc> 4136 <d4fd> <d4fe> 4376 <d5a1> <d5a4> 4378 <d5a5> <d5a5> 5800 <d5a6> <d5aa> 4382 <d5ab> <d5ab> 4139 <d5ac> <d5ad> 4387 <d5ae> <d5ae> 4192 <d5af> <d5fe> 4389 <d6a1> <d6b7> 4469 <d6b8> <d6b8> 4167 <d6b9> <d6cc> 4492 <d6cd> <d6cd> 4172 <d6ce> <d6fe> 4512 <d7a1> <d7ca> 4561 <d7cb> <d7cb> 5552 <d7cc> <d7e3> 4603 <d7e4> <d7e4> 6424 <d7e5> <d7fe> 4627 <d8a1> <d8fe> 4653 <d9a1> <d9fe> 4747 <daa1> <dafe> 4841 <dba1> <dbc4> 4935 <dbc5> <dbc5> 5151 <dbc6> <dbe3> 4971 <dbe4> <dbe4> 4922 <dbe5> <dbfe> 5001 <dca1> <dca4> 5027 <dca5> <dca5> 7518 <dca6> <dcfe> 5031 <dda1> <dda4> 5120 <dda5> <dda5> 5079 <dda6> <ddd4> 5124 <ddd5> <ddd5> 5109 <ddd6> <ddf3> 5171 <ddf4> <ddf4> 7607 <ddf5> <ddfe> 5201 <dea1> <defb> 5211 <defc> <defc> 5584 <defd> <defd> 5302 <defe> <defe> 5367 <dfa1> <dfb2> 5303 <dfb3> <dfb3> 7083 <dfb4> <dfe0> 5321 <dfe1> <dfe1> 5362 <dfe2> <dfe7> 5366 <dfe8> <dfe8> 5485 <dfe9> <dffe> 5372 endcidrange 100 begincidrange <e0a1> <e0f0> 5394 <e0f1> <e0f1> 6001 <e0f2> <e0fe> 5474 <e1a1> <e1ac> 5487 <e1ad> <e1ad> 5460 <e1ae> <e1ec> 5499 <e1ed> <e1ed> 5317 <e1ee> <e1fe> 5562 <e2a1> <e2fe> 5579 <e3a1> <e3f4> 5673 <e3f5> <e3f5> 7009 <e3f6> <e3fe> 5757 <e4a1> <e4a1> 7370 <e4a2> <e4a8> 5766 <e4a9> <e4a9> 5678 <e4aa> <e4fe> 5773 <e5a1> <e5ad> 5858 <e5ae> <e5ae> 5874 <e5af> <e5b0> 5871 <e5b1> <e5b2> 4425 <e5b3> <e5b8> 5873 <e5b9> <e5b9> 4427 <e5ba> <e5ba> 5879 <e5bb> <e5bc> 4429 <e5bd> <e5c3> 5880 <e5c4> <e5c4> 4431 <e5c5> <e5cd> 5887 <e5ce> <e5ce> 4435 <e5cf> <e5cf> 5896 <e5d0> <e5d0> 4436 <e5d1> <e5d1> 5897 <e5d2> <e5d2> 4437 <e5d3> <e5d5> 5898 <e5d6> <e5d6> 4439 <e5d7> <e5f9> 5901 <e5fa> <e5fb> 4442 <e5fc> <e5fc> 4159 <e5fd> <e5fd> 5936 <e5fe> <e5fe> 4444 <e6a1> <e6a1> 4447 <e6a2> <e6a3> 5937 <e6a4> <e6a4> 4449 <e6a5> <e6a6> 5939 <e6a7> <e6a7> 4450 <e6a8> <e6ac> 5941 <e6ad> <e6ad> 4453 <e6ae> <e6ae> 5946 <e6af> <e6b1> 4455 <e6b2> <e6b2> 5947 <e6b3> <e6b3> 4458 <e6b4> <e6b6> 5948 <e6b7> <e6b8> 4459 <e6b9> <e6bb> 5951 <e6bc> <e6bc> 4463 <e6bd> <e6c3> 5954 <e6c4> <e6c4> 4160 <e6c5> <e6c5> 5961 <e6c6> <e6c7> 4465 <e6c8> <e6c9> 5962 <e6ca> <e6ca> 4161 <e6cb> <e6d1> 5964 <e6d2> <e6d2> 4468 <e6d3> <e6d5> 5971 <e6d6> <e6d6> 4469 <e6d7> <e6d8> 5974 <e6d9> <e6d9> 4470 <e6da> <e6db> 5976 <e6dc> <e6dc> 4162 <e6dd> <e6de> 5978 <e6df> <e6df> 4471 <e6e0> <e6e0> 5980 <e6e1> <e6e1> 4472 <e6e2> <e6e3> 5981 <e6e4> <e6e4> 4474 <e6e5> <e6e5> 4473 <e6e6> <e6e6> 4475 <e6e7> <e6e7> 5983 <e6e8> <e6e8> 4476 <e6e9> <e6e9> 5984 <e6ea> <e6eb> 4478 <e6ec> <e6ec> 6447 <e6ed> <e6ee> 5985 <e6ef> <e6ef> 4481 <e6f0> <e6f0> 5987 <e6f1> <e6f1> 4482 <e6f2> <e6f2> 5460 <e6f3> <e6f4> 5988 <e6f5> <e6f5> 4483 <e6f6> <e6f6> 4163 <e6f7> <e6f7> 4166 <e6f8> <e6f8> 5990 <e6f9> <e6f9> 4485 <e6fa> <e6fe> 5991 <e7a1> <e7a1> 4487 <e7a2> <e7a5> 5996 <e7a6> <e7a6> 4488 <e7a7> <e7a8> 6000 <e7a9> <e7a9> 4489 <e7aa> <e7aa> 4491 <e7ab> <e7ab> 6002 endcidrange 100 begincidrange <e7ac> <e7ac> 4167 <e7ad> <e7ad> 4493 <e7ae> <e7af> 6003 <e7b0> <e7b0> 4494 <e7b1> <e7be> 6005 <e7bf> <e7bf> 4495 <e7c0> <e7c0> 6019 <e7c1> <e7c1> 7783 <e7c2> <e7c5> 6020 <e7c6> <e7c6> 4497 <e7c7> <e7c7> 4499 <e7c8> <e7ca> 6024 <e7cb> <e7cb> 4501 <e7cc> <e7cc> 6027 <e7cd> <e7cd> 4502 <e7ce> <e7ce> 6028 <e7cf> <e7d0> 4503 <e7d1> <e7d2> 6029 <e7d3> <e7d3> 4506 <e7d4> <e7de> 6031 <e7df> <e7df> 4508 <e7e0> <e7e3> 6042 <e7e4> <e7e4> 4509 <e7e5> <e7e5> 6046 <e7e6> <e7e6> 4510 <e7e7> <e7f6> 6047 <e7f7> <e7f7> 5797 <e7f8> <e7fe> 6063 <e8a1> <e8e6> 6070 <e8e7> <e8e8> 4551 <e8e9> <e8ef> 6140 <e8f0> <e8f0> 4553 <e8f1> <e8f1> 4180 <e8f2> <e8f6> 6147 <e8f7> <e8f7> 4555 <e8f8> <e8f8> 6152 <e8f9> <e8f9> 5800 <e8fa> <e8fa> 6153 <e8fb> <e8fb> 4556 <e8fc> <e8fd> 6154 <e8fe> <e8fe> 4557 <e9a1> <e9a6> 6156 <e9a7> <e9a7> 4560 <e9a8> <e9ab> 6162 <e9ac> <e9ac> 4561 <e9ad> <e9cb> 6166 <e9cc> <e9cc> 4563 <e9cd> <e9f6> 6197 <e9f7> <e9f7> 7988 <e9f8> <e9fe> 6239 <eaa1> <eac0> 6246 <eac1> <eac1> 6123 <eac2> <eae4> 6278 <eae5> <eae5> 4577 <eae6> <eaf3> 6313 <eaf4> <eaf4> 4183 <eaf5> <eaf6> 6327 <eaf7> <eaf7> 4579 <eaf8> <eafb> 6329 <eafc> <eafc> 4581 <eafd> <eafd> 6333 <eafe> <eafe> 4582 <eba1> <eba3> 6334 <eba4> <eba4> 4584 <eba5> <eba6> 6337 <eba7> <eba7> 4586 <eba8> <eba8> 6339 <eba9> <eba9> 4588 <ebaa> <ebaa> 4184 <ebab> <ebb9> 6340 <ebba> <ebbb> 4590 <ebbc> <ebbc> 6355 <ebbd> <ebbd> 4592 <ebbe> <ebc0> 6356 <ebc1> <ebc1> 4593 <ebc2> <ebc2> 4595 <ebc3> <ebc5> 6359 <ebc6> <ebc7> 4596 <ebc8> <ebcb> 6362 <ebcc> <ebcc> 4599 <ebcd> <ebce> 6366 <ebcf> <ebd1> 4600 <ebd2> <ebd2> 5552 <ebd3> <ebd7> 6368 <ebd8> <ebd8> 4603 <ebd9> <ebfe> 6373 <eca1> <eca5> 6411 <eca6> <eca6> 4614 <eca7> <eca7> 4616 <eca8> <eca9> 6416 <ecaa> <ecaa> 4618 <ecab> <ecae> 6418 <ecaf> <ecaf> 5950 <ecb0> <ecb1> 4620 <ecb2> <ecb2> 4187 <ecb3> <ecb4> 6422 <ecb5> <ecb5> 4625 <ecb6> <ecb7> 6424 <ecb8> <ecb8> 4627 <ecb9> <ecb9> 6426 endcidrange 75 begincidrange <ecba> <ecba> 4629 <ecbb> <ecbf> 6427 <ecc0> <ecc1> 4632 <ecc2> <ecc4> 6432 <ecc5> <ecc5> 4634 <ecc6> <ecc6> 4636 <ecc7> <ecc8> 6435 <ecc9> <ecca> 4188 <eccb> <ecd4> 6437 <ecd5> <ecd5> 4638 <ecd6> <ecdc> 6447 <ecdd> <ecde> 4640 <ecdf> <ece0> 6454 <ece1> <ece1> 4642 <ece2> <ece3> 6456 <ece4> <ece4> 4644 <ece5> <ece6> 6458 <ece7> <ece8> 4645 <ece9> <ecf6> 6460 <ecf7> <ecf8> 4647 <ecf9> <ecf9> 6474 <ecfa> <ecfa> 4650 <ecfb> <ecfe> 6475 <eda1> <eda3> 4653 <eda4> <eded> 6479 <edee> <edee> 5351 <edef> <edfe> 6553 <eea1> <eeda> 6569 <eedb> <eedb> 6494 <eedc> <eefe> 6627 <efa1> <effe> 6662 <f0a1> <f0fe> 6756 <f1a1> <f1fe> 6850 <f2a1> <f2bc> 6944 <f2bd> <f2bd> 5731 <f2be> <f2f9> 6972 <f2fa> <f2fa> 5771 <f2fb> <f2fe> 7032 <f3a1> <f3b0> 7036 <f3b1> <f3b1> 4191 <f3b2> <f3fe> 7052 <f4a1> <f4a6> 7129 <f4a7> <f4a7> 6484 <f4a8> <f4ed> 7135 <f4ee> <f4ee> 6684 <f4ef> <f4fe> 7205 <f5a1> <f5fe> 7221 <f6a1> <f6f3> 7315 <f6f4> <f6f4> 4279 <f6f5> <f6f5> 7398 <f6f6> <f6f6> 7139 <f6f7> <f6fe> 7399 <f7a1> <f7b7> 7407 <f7b8> <f7b8> 4247 <f7b9> <f7c7> 7430 <f7c8> <f7c8> 4266 <f7c9> <f7d2> 7445 <f7d3> <f7d3> 4340 <f7d4> <f7fe> 7455 <f8a1> <f8da> 7498 <f8db> <f8db> 7572 <f8dc> <f8ef> 7556 <f8f0> <f8f0> 5088 <f8f1> <f8fe> 7576 <f9a1> <f9fe> 7590 <faa1> <faa1> 7709 <faa2> <faa2> 3558 <faa3> <fae5> 7684 <fae6> <fae6> 3644 <fae7> <fafe> 7751 <fba1> <fbfe> 7775 <fca1> <fca8> 7869 <fca9> <fca9> 3815 <fcaa> <fcfe> 7877 <fda1> <fdfe> 7962 endcidrange endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF \ No newline at end of file
diff --git a/src/main/resources/Resources/cmap/KSCms-UHC-HW-V b/src/main/resources/Resources/cmap/KSCms-UHC-HW-V
new file mode 100644
index 0000000..e26fe8a
--- /dev/null
+++ b/src/main/resources/Resources/cmap/KSCms-UHC-HW-V
@@ -0,0 +1 @@
+%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%DocumentNeededResources: CMap (KSCms-UHC-HW-H) %%IncludeResource: ProcSet (CIDInit) %%IncludeResource: CMap (KSCms-UHC-HW-H) %%BeginResource: CMap (KSCms-UHC-HW-V) %%Title: (KSCms-UHC-HW-V Adobe Korea1 1) %%Version: 10.001 %%Copyright: ----------------------------------------------------------- %%Copyright: Copyright 1990-1999 Adobe Systems Incorporated. %%Copyright: All Rights Reserved. %%Copyright: %%Copyright: Patents Pending %%Copyright: %%Copyright: NOTICE: All information contained herein is the property %%Copyright: of Adobe Systems Incorporated. %%Copyright: %%Copyright: Permission is granted for redistribution of this file %%Copyright: provided this copyright notice is maintained intact and %%Copyright: that the contents of this file are not altered in any %%Copyright: way from its original form. %%Copyright: %%Copyright: PostScript and Display PostScript are trademarks of %%Copyright: Adobe Systems Incorporated which may be registered in %%Copyright: certain jurisdictions. %%Copyright: ----------------------------------------------------------- %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /KSCms-UHC-HW-H usecmap /CIDSystemInfo 3 dict dup begin /Registry (Adobe) def /Ordering (Korea1) def /Supplement 1 def end def /CMapName /KSCms-UHC-HW-V def /CMapVersion 10.001 def /CMapType 1 def /XUID [1 10 25417] def /WMode 1 def 16 begincidrange <a1a2> <a1a3> 8056 <a1a5> <a1a5> 8058 <a1a6> <a1a6> 8320 <a1a9> <a1ab> 8059 <a1ad> <a1ad> 8062 <a1b2> <a1bd> 8063 <a1eb> <a1eb> 8075 <a3a1> <a3a1> 8076 <a3a8> <a3a9> 8077 <a3ac> <a3ac> 8079 <a3ae> <a3ae> 8080 <a3ba> <a3bf> 8081 <a3db> <a3db> 8087 <a3dd> <a3dd> 8088 <a3df> <a3df> 8089 <a3fb> <a3fe> 8090 endcidrange endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF \ No newline at end of file
diff --git a/src/main/resources/Resources/cmap/KSCms-UHC-UCS2 b/src/main/resources/Resources/cmap/KSCms-UHC-UCS2
new file mode 100644
index 0000000..8ff2aa3
--- /dev/null
+++ b/src/main/resources/Resources/cmap/KSCms-UHC-UCS2
@@ -0,0 +1 @@
+%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%IncludeResource: ProcSet (CIDInit) %%BeginResource: CMap (KSCms-UHC-UCS2) %%Title: (KSCms-UHC-UCS2) %%Version: 4.002 %%Copyright: ----------------------------------------------------------- %%Copyright: Copyright 1990-1999 Adobe Systems Incorporated. %%Copyright: All Rights Reserved. %%Copyright: %%Copyright: Patents Pending %%Copyright: %%Copyright: NOTICE: All information contained herein is the property %%Copyright: of Adobe Systems Incorporated. %%Copyright: %%Copyright: Permission is granted for redistribution of this file %%Copyright: provided this copyright notice is maintained intact and %%Copyright: that the contents of this file are not altered in any %%Copyright: way from its original form. %%Copyright: %%Copyright: PostScript and Display PostScript are trademarks of %%Copyright: Adobe Systems Incorporated which may be registered in %%Copyright: certain jurisdictions. %%Copyright: ----------------------------------------------------------- %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo 3 dict dup begin /Registry (Adobe) def /Ordering (KSCms_UHC_UCS2) def /Supplement 1 def end def /CMapName /KSCms-UHC-UCS2 def /CMapVersion 4.002 def /CMapType 1 def /WMode 0 def 3 begincodespacerange <00> <80> <8141> <FEFE> <FF> <FF> endcodespacerange 100 beginbfrange <00> <80> <0000> <FF> <FF> <F8F7> <8141> <8142> <AC02> <8143> <8144> <AC05> <8145> <8149> <AC0B> <814A> <814A> <AC18> <814B> <814C> <AC1E> <814D> <814F> <AC21> <8150> <8156> <AC25> <8157> <8157> <AC2E> <8158> <815A> <AC32> <8161> <8163> <AC35> <8164> <8165> <AC3A> <8166> <8168> <AC3D> <8169> <8172> <AC41> <8173> <8173> <AC4C> <8174> <8179> <AC4E> <817A> <817A> <AC55> <8181> <8182> <AC56> <8183> <8185> <AC59> <8186> <8198> <AC5D> <8199> <819A> <AC72> <819B> <819C> <AC75> <819D> <819D> <AC79> <819E> <81A2> <AC7B> <81A3> <81A3> <AC82> <81A4> <81A5> <AC87> <81A6> <81A8> <AC8D> <81A9> <81AB> <AC91> <81AC> <81B2> <AC95> <81B3> <81B3> <AC9E> <81B4> <81B9> <ACA2> <81BA> <81BA> <ACAB> <81BB> <81BC> <ACAD> <81BD> <81C3> <ACB1> <81C4> <81C4> <ACBA> <81C5> <81C7> <ACBE> <81C8> <81C9> <ACC2> <81CA> <81CC> <ACC5> <81CD> <81CF> <ACC9> <81D0> <81D7> <ACCD> <81D8> <81D8> <ACD6> <81D9> <81E0> <ACD8> <81E1> <81E2> <ACE2> <81E3> <81E4> <ACE5> <81E5> <81E5> <ACE9> <81E6> <81E6> <ACEB> <81E7> <81E8> <ACED> <81E9> <81E9> <ACF2> <81EA> <81EA> <ACF4> <81EB> <81EF> <ACF7> <81F0> <81F1> <ACFE> <81F2> <81F4> <AD01> <81F5> <81F5> <AD05> <81F6> <81FA> <AD07> <81FB> <81FB> <AD0E> <81FC> <81FC> <AD10> <81FD> <81FE> <AD12> <8241> <8244> <AD14> <8245> <8247> <AD19> <8248> <824A> <AD1D> <824B> <8252> <AD21> <8253> <8254> <AD2A> <8255> <825A> <AD2E> <8261> <8262> <AD36> <8263> <8265> <AD39> <8266> <826C> <AD3D> <826D> <826D> <AD46> <826E> <826E> <AD48> <826F> <8274> <AD4A> <8275> <8277> <AD51> <8278> <827A> <AD55> <8281> <8288> <AD59> <8289> <8289> <AD62> <828A> <8291> <AD64> <8292> <8293> <AD6E> <8294> <8295> <AD71> <8296> <8299> <AD77> <829A> <829A> <AD7E> <829B> <829B> <AD80> <829C> <82A0> <AD83> <82A1> <82A2> <AD8A> <82A3> <82A5> <AD8D> <82A6> <82B0> <AD91> <82B1> <82B6> <AD9E> <82B7> <82C8> <ADA5> <82C9> <82D0> <ADB8> <82D1> <82D2> <ADC2> <82D3> <82D5> <ADC5> <82D6> <82DC> <ADC9> <82DD> <82DD> <ADD2> <82DE> <82E5> <ADD4> <82E6> <82E8> <ADDD> <82E9> <82EB> <ADE1> <82EC> <82FE> <ADE5> <8341> <8342> <ADFA> <8343> <8344> <ADFD> <8345> <834A> <AE02> <834B> <834B> <AE0A> <834C> <834C> <AE0C> endbfrange 100 beginbfrange <834D> <8352> <AE0E> <8353> <835A> <AE15> <8361> <8373> <AE1D> <8374> <8375> <AE32> <8376> <8377> <AE35> <8378> <8378> <AE39> <8379> <837A> <AE3B> <8381> <8383> <AE3D> <8384> <8384> <AE42> <8385> <8385> <AE44> <8386> <8388> <AE47> <8389> <8389> <AE4B> <838A> <838A> <AE4F> <838B> <838D> <AE51> <838E> <838E> <AE55> <838F> <8393> <AE57> <8394> <8394> <AE5E> <8395> <8397> <AE62> <8398> <8399> <AE66> <839A> <839B> <AE6A> <839C> <839E> <AE6D> <839F> <83A5> <AE71> <83A6> <83A6> <AE7A> <83A7> <83AC> <AE7E> <83AD> <83B2> <AE86> <83B3> <83E1> <AE8D> <83E2> <83E2> <AEBF> <83E3> <83E5> <AEC1> <83E6> <83EC> <AEC5> <83ED> <83ED> <AECE> <83EE> <83F3> <AED2> <83F4> <83F5> <AEDA> <83F6> <83FE> <AEDD> <8441> <8442> <AEE6> <8443> <8444> <AEE9> <8445> <8445> <AEEC> <8446> <844B> <AEEE> <844C> <844E> <AEF5> <844F> <8451> <AEF9> <8452> <845A> <AEFD> <8461> <8461> <AF06> <8462> <8465> <AF09> <8466> <8467> <AF0E> <8468> <847A> <AF11> <8481> <8488> <AF24> <8489> <848A> <AF2E> <848B> <848B> <AF31> <848C> <848C> <AF33> <848D> <8493> <AF35> <8494> <8494> <AF3E> <8495> <8495> <AF40> <8496> <8499> <AF44> <849A> <849F> <AF4A> <84A0> <84AA> <AF51> <84AB> <84B0> <AF5E> <84B1> <84C3> <AF66> <84C4> <84C9> <AF7A> <84CA> <84CC> <AF81> <84CD> <84CF> <AF85> <84D0> <84D6> <AF89> <84D7> <84D9> <AF92> <84DA> <84DF> <AF96> <84E0> <84FA> <AF9D> <84FB> <84FC> <AFBA> <84FD> <84FE> <AFBD> <8541> <8541> <AFBF> <8542> <8547> <AFC1> <8548> <8548> <AFCA> <8549> <8549> <AFCC> <854A> <854E> <AFCF> <854F> <8555> <AFD5> <8556> <855A> <AFDD> <8561> <8566> <AFE2> <8567> <856C> <AFEA> <856D> <856E> <AFF2> <856F> <8571> <AFF5> <8572> <8578> <AFF9> <8579> <857A> <B002> <8581> <8587> <B005> <8588> <858A> <B00D> <858B> <858D> <B011> <858E> <8594> <B015> <8595> <859E> <B01E> <859F> <85B9> <B029> <85BA> <85BB> <B046> <85BC> <85BC> <B049> <85BD> <85BD> <B04B> <85BE> <85BE> <B04D> <85BF> <85C2> <B04F> <85C3> <85C3> <B056> <85C4> <85C4> <B058> <85C5> <85C7> <B05A> <85C8> <85E5> <B05E> <85E6> <85E7> <B07E> <85E8> <85EA> <B081> <85EB> <85F1> <B085> <85F2> <85F2> <B08E> <85F3> <85F3> <B090> <85F4> <85F9> <B092> <85FA> <85FA> <B09B> endbfrange 100 beginbfrange <85FB> <85FC> <B09D> <85FD> <85FE> <B0A3> <8641> <8643> <B0A5> <8644> <8644> <B0AA> <8645> <8645> <B0B0> <8646> <8646> <B0B2> <8647> <8648> <B0B6> <8649> <864B> <B0B9> <864C> <8652> <B0BD> <8653> <8653> <B0C6> <8654> <8659> <B0CA> <865A> <865A> <B0D2> <8661> <8661> <B0D3> <8662> <8664> <B0D5> <8665> <866B> <B0D9> <866C> <866F> <B0E1> <8670> <867A> <B0E6> <8681> <8697> <B0F1> <8698> <8698> <B10A> <8699> <869B> <B10D> <869C> <869C> <B111> <869D> <86A0> <B114> <86A1> <86A1> <B11A> <86A2> <86A6> <B11E> <86A7> <86A8> <B126> <86A9> <86AB> <B129> <86AC> <86B2> <B12D> <86B3> <86B3> <B136> <86B4> <86B9> <B13A> <86BA> <86BB> <B142> <86BC> <86BE> <B145> <86BF> <86C5> <B149> <86C6> <86C7> <B152> <86C8> <86C9> <B156> <86CA> <86CC> <B159> <86CD> <86CF> <B15D> <86D0> <86E6> <B161> <86E7> <86E8> <B17A> <86E9> <86EB> <B17D> <86EC> <86EC> <B181> <86ED> <86F1> <B183> <86F2> <86F2> <B18A> <86F3> <86F3> <B18C> <86F4> <86F7> <B18E> <86F8> <86FA> <B195> <86FB> <86FD> <B199> <86FE> <86FE> <B19D> <8741> <874A> <B19E> <874B> <875A> <B1A9> <8761> <8773> <B1B9> <8774> <8776> <B1CD> <8777> <8779> <B1D1> <877A> <877A> <B1D5> <8781> <8786> <B1D6> <8787> <8787> <B1DE> <8788> <878F> <B1E0> <8790> <8791> <B1EA> <8792> <8794> <B1ED> <8795> <879C> <B1F1> <879D> <879D> <B1FA> <879E> <879E> <B1FC> <879F> <87A4> <B1FE> <87A5> <87A6> <B206> <87A7> <87A8> <B209> <87A9> <87AF> <B20D> <87B0> <87B0> <B216> <87B1> <87B1> <B218> <87B2> <87B7> <B21A> <87B8> <87CA> <B221> <87CB> <87D1> <B235> <87D2> <87EC> <B23D> <87ED> <87EF> <B259> <87F0> <87F2> <B25D> <87F3> <87F9> <B261> <87FA> <87FE> <B26A> <8841> <8845> <B26F> <8846> <884B> <B276> <884C> <8852> <B27D> <8853> <8855> <B286> <8856> <885A> <B28A> <8861> <8861> <B28F> <8862> <8863> <B292> <8864> <8866> <B295> <8867> <886B> <B29B> <886C> <886C> <B2A2> <886D> <886D> <B2A4> <886E> <8870> <B2A7> <8871> <8871> <B2AB> <8872> <8874> <B2AD> <8875> <8877> <B2B1> <8878> <887A> <B2B5> <8881> <8890> <B2B8> <8891> <8892> <B2CA> <8893> <8895> <B2CD> <8896> <8896> <B2D1> <8897> <889B> <B2D3> <889C> <889C> <B2DA> <889D> <889D> <B2DC> <889E> <88A1> <B2DE> <88A2> <88A2> <B2E3> endbfrange 100 beginbfrange <88A3> <88A3> <B2E7> <88A4> <88A5> <B2E9> <88A6> <88A8> <B2F0> <88A9> <88A9> <B2F6> <88AA> <88AC> <B2FC> <88AD> <88AE> <B302> <88AF> <88B1> <B305> <88B2> <88B8> <B309> <88B9> <88B9> <B312> <88BA> <88BF> <B316> <88C0> <88F6> <B31D> <88F7> <88F7> <B357> <88F8> <88F9> <B359> <88FA> <88FA> <B35D> <88FB> <88FE> <B360> <8941> <8941> <B366> <8942> <8942> <B368> <8943> <8943> <B36A> <8944> <8945> <B36C> <8946> <8946> <B36F> <8947> <8948> <B372> <8949> <894B> <B375> <894C> <8952> <B379> <8953> <8953> <B382> <8954> <8959> <B386> <895A> <895A> <B38D> <8961> <8962> <B38E> <8963> <8965> <B391> <8966> <8970> <B395> <8971> <8976> <B3A2> <8977> <8979> <B3A9> <897A> <897A> <B3AD> <8981> <8996> <B3AE> <8997> <8998> <B3C6> <8999> <899A> <B3C9> <899B> <899B> <B3CD> <899C> <899C> <B3CF> <899D> <899F> <B3D1> <89A0> <89A0> <B3D6> <89A1> <89A1> <B3D8> <89A2> <89A2> <B3DA> <89A3> <89A3> <B3DC> <89A4> <89A5> <B3DE> <89A6> <89A8> <B3E1> <89A9> <89AB> <B3E5> <89AC> <89BE> <B3E9> <89BF> <89D1> <B3FD> <89D2> <89D8> <B411> <89D9> <89DB> <B419> <89DC> <89DE> <B41D> <89DF> <89E5> <B421> <89E6> <89E6> <B42A> <89E7> <89EE> <B42C> <89EF> <89FE> <B435> <8A41> <8A4B> <B445> <8A4C> <8A4D> <B452> <8A4E> <8A50> <B455> <8A51> <8A57> <B459> <8A58> <8A58> <B462> <8A59> <8A59> <B464> <8A5A> <8A5A> <B466> <8A61> <8A65> <B467> <8A66> <8A78> <B46D> <8A79> <8A7A> <B481> <8A81> <8A85> <B483> <8A86> <8A99> <B489> <8A9A> <8A9F> <B49E> <8AA0> <8AA2> <B4A5> <8AA3> <8AA5> <B4A9> <8AA6> <8AAD> <B4AD> <8AAE> <8AAE> <B4B6> <8AAF> <8AAF> <B4B8> <8AB0> <8AB5> <B4BA> <8AB6> <8AB8> <B4C1> <8AB9> <8ABB> <B4C5> <8ABC> <8AC2> <B4C9> <8AC3> <8AC6> <B4D1> <8AC7> <8ACC> <B4D6> <8ACD> <8ACE> <B4DE> <8ACF> <8AD0> <B4E1> <8AD1> <8AD1> <B4E5> <8AD2> <8AD6> <B4E7> <8AD7> <8AD7> <B4EE> <8AD8> <8AD8> <B4F0> <8AD9> <8ADE> <B4F2> <8ADF> <8AF9> <B4F9> <8AFA> <8AFB> <B516> <8AFC> <8AFD> <B519> <8AFE> <8AFE> <B51D> <8B41> <8B46> <B51E> <8B47> <8B47> <B526> <8B48> <8B4C> <B52B> <8B4D> <8B4E> <B532> <8B4F> <8B51> <B535> <8B52> <8B58> <B539> <8B59> <8B59> <B542> <8B5A> <8B5A> <B546> <8B61> <8B64> <B547> <8B65> <8B66> <B54E> <8B67> <8B69> <B551> endbfrange 100 beginbfrange <8B6A> <8B70> <B555> <8B71> <8B71> <B55E> <8B72> <8B7A> <B562> <8B81> <8BB5> <B56B> <8BB6> <8BB7> <B5A2> <8BB8> <8BBA> <B5A5> <8BBB> <8BBB> <B5A9> <8BBC> <8BBF> <B5AC> <8BC0> <8BC0> <B5B2> <8BC1> <8BC5> <B5B6> <8BC6> <8BC7> <B5BE> <8BC8> <8BCA> <B5C1> <8BCB> <8BD1> <B5C5> <8BD2> <8BD2> <B5CE> <8BD3> <8BD8> <B5D2> <8BD9> <8BEB> <B5D9> <8BEC> <8BFE> <B5ED> <8C41> <8C50> <B600> <8C51> <8C52> <B612> <8C53> <8C55> <B615> <8C56> <8C5A> <B619> <8C61> <8C67> <B61E> <8C68> <8C6D> <B626> <8C6E> <8C74> <B62D> <8C75> <8C7A> <B635> <8C81> <8C8D> <B63B> <8C8E> <8CA8> <B649> <8CA9> <8CAB> <B665> <8CAC> <8CDE> <B669> <8CDF> <8CE0> <B69E> <8CE1> <8CE3> <B6A1> <8CE4> <8CE9> <B6A5> <8CEA> <8CED> <B6AD> <8CEE> <8CFE> <B6B2> <8D41> <8D51> <B6C3> <8D52> <8D5A> <B6D5> <8D61> <8D72> <B6DE> <8D73> <8D75> <B6F1> <8D76> <8D78> <B6F5> <8D79> <8D7A> <B6F9> <8D81> <8D85> <B6FB> <8D86> <8D88> <B702> <8D89> <8DAA> <B706> <8DAB> <8DAC> <B72A> <8DAD> <8DAE> <B72D> <8DAF> <8DB5> <B731> <8DB6> <8DB6> <B73A> <8DB7> <8DBE> <B73C> <8DBF> <8DC1> <B745> <8DC2> <8DC4> <B749> <8DC5> <8DCB> <B74D> <8DCC> <8DD5> <B756> <8DD6> <8DD8> <B761> <8DD9> <8DDB> <B765> <8DDC> <8DE2> <B769> <8DE3> <8DE3> <B772> <8DE4> <8DE4> <B774> <8DE5> <8DEA> <B776> <8DEB> <8DEC> <B77E> <8DED> <8DEF> <B781> <8DF0> <8DF6> <B785> <8DF7> <8DF7> <B78E> <8DF8> <8DFA> <B793> <8DFB> <8DFC> <B79A> <8DFD> <8DFE> <B79D> <8E41> <8E41> <B79F> <8E42> <8E48> <B7A1> <8E49> <8E49> <B7AA> <8E4A> <8E4F> <B7AE> <8E50> <8E51> <B7B6> <8E52> <8E5A> <B7B9> <8E61> <8E65> <B7C2> <8E66> <8E66> <B7C8> <8E67> <8E7A> <B7CA> <8E81> <8E8E> <B7DE> <8E8F> <8E90> <B7EE> <8E91> <8E93> <B7F1> <8E94> <8E9A> <B7F5> <8E9B> <8E9B> <B7FE> <8E9C> <8EA0> <B802> <8EA1> <8EA2> <B80A> <8EA3> <8EA5> <B80D> <8EA6> <8EAC> <B811> <8EAD> <8EAD> <B81A> <8EAE> <8EAE> <B81C> <8EAF> <8EB4> <B81E> <8EB5> <8EB6> <B826> <8EB7> <8EB9> <B829> <8EBA> <8EC0> <B82D> <8EC1> <8EC1> <B836> <8EC2> <8EC7> <B83A> <8EC8> <8ECA> <B841> <8ECB> <8ED6> <B845> <8ED7> <8ED7> <B852> <8ED8> <8EDF> <B854> <8EE0> <8EE1> <B85E> <8EE2> <8EE4> <B861> <8EE5> <8EEB> <B865> <8EEC> <8EEC> <B86E> <8EED> <8EED> <B870> endbfrange 100 beginbfrange <8EEE> <8EF3> <B872> <8EF4> <8EF6> <B879> <8EF7> <8EFE> <B87D> <8F41> <8F48> <B885> <8F49> <8F5A> <B88E> <8F61> <8F68> <B8A0> <8F69> <8F6F> <B8A9> <8F70> <8F72> <B8B1> <8F73> <8F75> <B8B5> <8F76> <8F7A> <B8B9> <8F81> <8F82> <B8BE> <8F83> <8F83> <B8C2> <8F84> <8F84> <B8C4> <8F85> <8F8A> <B8C6> <8F8B> <8F8D> <B8CD> <8F8E> <8F90> <B8D1> <8F91> <8F98> <B8D5> <8F99> <8F99> <B8DE> <8F9A> <8F9A> <B8E0> <8F9B> <8FA0> <B8E2> <8FA1> <8FA2> <B8EA> <8FA3> <8FA5> <B8ED> <8FA6> <8FAC> <B8F1> <8FAD> <8FAD> <B8FA> <8FAE> <8FAE> <B8FC> <8FAF> <8FB4> <B8FE> <8FB5> <8FC7> <B905> <8FC8> <8FCE> <B919> <8FCF> <8FE9> <B921> <8FEA> <8FEB> <B93E> <8FEC> <8FEE> <B941> <8FEF> <8FF5> <B945> <8FF6> <8FF7> <B94D> <8FF8> <8FF8> <B950> <8FF9> <8FFE> <B952> <9041> <9042> <B95A> <9043> <9045> <B95D> <9046> <904C> <B961> <904D> <904D> <B96A> <904E> <904E> <B96C> <904F> <9054> <B96E> <9055> <9056> <B976> <9057> <9059> <B979> <905A> <905A> <B97D> <9061> <9066> <B97E> <9067> <9067> <B986> <9068> <9068> <B988> <9069> <906A> <B98B> <906B> <907A> <B98F> <9081> <908D> <B99F> <908E> <908F> <B9AE> <9090> <9092> <B9B1> <9093> <9099> <B9B5> <909A> <909A> <B9BE> <909B> <909B> <B9C0> <909C> <90A1> <B9C2> <90A2> <90A3> <B9CA> <90A4> <90A4> <B9CD> <90A5> <90A9> <B9D3> <90AA> <90AA> <B9DA> <90AB> <90AB> <B9DC> <90AC> <90AD> <B9DF> <90AE> <90AE> <B9E2> <90AF> <90B0> <B9E6> <90B1> <90B3> <B9E9> <90B4> <90BA> <B9ED> <90BB> <90BB> <B9F6> <90BC> <90C0> <B9FB> <90C1> <90C6> <BA02> <90C7> <90D2> <BA09> <90D3> <90F4> <BA16> <90F5> <90F6> <BA3A> <90F7> <90F9> <BA3D> <90FA> <90FA> <BA41> <90FB> <90FE> <BA43> <9141> <9141> <BA47> <9142> <9142> <BA4A> <9143> <9143> <BA4C> <9144> <9147> <BA4F> <9148> <9149> <BA56> <914A> <914C> <BA59> <914D> <9153> <BA5D> <9154> <9154> <BA66> <9155> <915A> <BA6A> <9161> <9162> <BA72> <9163> <9165> <BA75> <9166> <916F> <BA79> <9170> <9170> <BA86> <9171> <9174> <BA88> <9175> <917A> <BA8D> <9181> <9195> <BA93> <9196> <9196> <BAAA> <9197> <9199> <BAAD> <919A> <919A> <BAB1> <919B> <919F> <BAB3> <91A0> <91A0> <BABA> <91A1> <91A1> <BABC> <91A2> <91A7> <BABE> <91A8> <91AA> <BAC5> <91AB> <91B9> <BAC9> endbfrange 100 beginbfrange <91BA> <91DB> <BADA> <91DC> <91DE> <BAFD> <91DF> <91E1> <BB01> <91E2> <91E9> <BB05> <91EA> <91EA> <BB0E> <91EB> <91EB> <BB10> <91EC> <91F1> <BB12> <91F2> <91F4> <BB19> <91F5> <91F7> <BB1D> <91F8> <91FE> <BB21> <9241> <9241> <BB28> <9242> <9242> <BB2A> <9243> <924A> <BB2C> <924B> <924B> <BB37> <924C> <924D> <BB39> <924E> <9252> <BB3F> <9253> <9253> <BB46> <9254> <9254> <BB48> <9255> <9257> <BB4A> <9258> <9258> <BB4E> <9259> <925A> <BB51> <9261> <9261> <BB53> <9262> <9264> <BB55> <9265> <926C> <BB59> <926D> <926D> <BB62> <926E> <9275> <BB64> <9276> <927A> <BB6D> <9281> <9296> <BB72> <9297> <9299> <BB89> <929A> <929C> <BB8D> <929D> <92AF> <BB91> <92B0> <92B2> <BBA5> <92B3> <92B5> <BBA9> <92B6> <92BC> <BBAD> <92BD> <92BE> <BBB5> <92BF> <92C6> <BBB8> <92C7> <92C9> <BBC1> <92CA> <92CC> <BBC5> <92CD> <92D3> <BBC9> <92D4> <92D5> <BBD1> <92D6> <92F9> <BBD4> <92FA> <92FB> <BBFA> <92FC> <92FD> <BBFD> <92FE> <92FE> <BC01> <9341> <9345> <BC03> <9346> <9346> <BC0A> <9347> <9347> <BC0E> <9348> <9348> <BC10> <9349> <934A> <BC12> <934B> <934C> <BC19> <934D> <9350> <BC20> <9351> <9351> <BC26> <9352> <9352> <BC28> <9353> <9355> <BC2A> <9356> <9357> <BC2E> <9358> <9359> <BC32> <935A> <935A> <BC35> <9361> <9362> <BC36> <9363> <9369> <BC39> <936A> <936A> <BC42> <936B> <936D> <BC46> <936E> <936F> <BC4A> <9370> <9371> <BC4E> <9372> <937A> <BC51> <9381> <9383> <BC5A> <9384> <93A9> <BC5E> <93AA> <93AB> <BC86> <93AC> <93AD> <BC89> <93AE> <93AE> <BC8D> <93AF> <93B3> <BC8F> <93B4> <93B4> <BC96> <93B5> <93B5> <BC98> <93B6> <93BA> <BC9B> <93BB> <93BC> <BCA2> <93BD> <93BE> <BCA5> <93BF> <93C5> <BCA9> <93C6> <93C6> <BCB2> <93C7> <93CC> <BCB6> <93CD> <93CE> <BCBE> <93CF> <93D1> <BCC1> <93D2> <93D9> <BCC5> <93DA> <93DA> <BCCE> <93DB> <93DD> <BCD2> <93DE> <93DF> <BCD6> <93E0> <93E2> <BCD9> <93E3> <93F9> <BCDD> <93FA> <93FA> <BCF7> <93FB> <93FD> <BCF9> <93FE> <93FE> <BCFD> <9441> <9446> <BCFE> <9447> <9447> <BD06> <9448> <9448> <BD08> <9449> <944E> <BD0A> <944F> <9451> <BD11> <9452> <945A> <BD15> <9461> <9466> <BD1E> <9467> <946D> <BD25> <946E> <947A> <BD2D> <9481> <9486> <BD3A> <9487> <948D> <BD41> endbfrange 100 beginbfrange <948E> <948F> <BD4A> <9490> <9492> <BD4D> <9493> <9499> <BD51> <949A> <94A3> <BD5A> <94A4> <94A6> <BD65> <94A7> <94BD> <BD69> <94BE> <94BF> <BD82> <94C0> <94C1> <BD85> <94C2> <94C6> <BD8B> <94C7> <94C7> <BD92> <94C8> <94C8> <BD94> <94C9> <94CB> <BD96> <94CC> <94CC> <BD9B> <94CD> <94D3> <BD9D> <94D4> <94DE> <BDA5> <94DF> <94E5> <BDB1> <94E6> <94FE> <BDB9> <9541> <9542> <BDD2> <9543> <9544> <BDD6> <9545> <9547> <BDD9> <9548> <9553> <BDDD> <9554> <9559> <BDEA> <955A> <955A> <BDF1> <9561> <9562> <BDF2> <9563> <9565> <BDF5> <9566> <956C> <BDF9> <956D> <956E> <BE01> <956F> <956F> <BE04> <9570> <9575> <BE06> <9576> <9577> <BE0E> <9578> <957A> <BE11> <9581> <9587> <BE15> <9588> <9588> <BE1E> <9589> <95AC> <BE20> <95AD> <95AE> <BE46> <95AF> <95B1> <BE49> <95B2> <95B2> <BE4D> <95B3> <95B7> <BE4F> <95B8> <95B8> <BE56> <95B9> <95B9> <BE58> <95BA> <95BD> <BE5C> <95BE> <95BF> <BE62> <95C0> <95C2> <BE65> <95C3> <95C3> <BE69> <95C4> <95C8> <BE6B> <95C9> <95C9> <BE72> <95CA> <95CE> <BE76> <95CF> <95D0> <BE7E> <95D1> <95D3> <BE81> <95D4> <95DA> <BE85> <95DB> <95DB> <BE8E> <95DC> <95E1> <BE92> <95E2> <95EF> <BE9A> <95F0> <95FE> <BEA9> <9641> <9658> <BEB8> <9659> <965A> <BED2> <9661> <9662> <BED5> <9663> <9669> <BED9> <966A> <966B> <BEE1> <966C> <9671> <BEE6> <9672> <967A> <BEED> <9681> <968B> <BEF6> <968C> <9691> <BF02> <9692> <969F> <BF0A> <96A0> <96A0> <BF1A> <96A1> <96C2> <BF1E> <96C3> <96C4> <BF42> <96C5> <96C7> <BF45> <96C8> <96CE> <BF49> <96CF> <96D1> <BF52> <96D2> <96FE> <BF56> <9741> <9751> <BF83> <9752> <975A> <BF95> <9761> <9772> <BF9E> <9773> <977A> <BFB1> <9781> <978C> <BFB9> <978D> <9792> <BFC6> <9793> <9794> <BFCE> <9795> <9797> <BFD1> <9798> <979E> <BFD5> <979F> <97A0> <BFDD> <97A1> <97A1> <BFE0> <97A2> <97FB> <BFE2> <97FC> <97FE> <C03D> <9841> <9851> <C040> <9852> <9857> <C052> <9858> <985A> <C059> <9861> <9863> <C05D> <9864> <986A> <C061> <986B> <987A> <C06A> <9881> <9896> <C07A> <9897> <9898> <C092> <9899> <989B> <C095> <989C> <98A2> <C099> <98A3> <98A3> <C0A2> <98A4> <98A4> <C0A4> <98A5> <98AA> <C0A6> <98AB> <98AB> <C0AE> <98AC> <98AD> <C0B1> <98AE> <98B2> <C0B7> endbfrange 100 beginbfrange <98B3> <98B3> <C0BE> <98B4> <98B6> <C0C2> <98B7> <98B8> <C0C6> <98B9> <98BA> <C0CA> <98BB> <98BD> <C0CD> <98BE> <98C4> <C0D1> <98C5> <98C5> <C0DA> <98C6> <98CB> <C0DE> <98CC> <98CD> <C0E6> <98CE> <98D0> <C0E9> <98D1> <98D7> <C0ED> <98D8> <98D8> <C0F6> <98D9> <98D9> <C0F8> <98DA> <98DF> <C0FA> <98E0> <98E2> <C101> <98E3> <98E5> <C105> <98E6> <98EC> <C109> <98ED> <98F0> <C111> <98F1> <98F6> <C116> <98F7> <98F8> <C121> <98F9> <98F9> <C125> <98FA> <98FD> <C128> <98FE> <98FE> <C12E> <9941> <9944> <C132> <9945> <9945> <C137> <9946> <9947> <C13A> <9948> <994A> <C13D> <994B> <9951> <C141> <9952> <9952> <C14A> <9953> <9958> <C14E> <9959> <995A> <C156> <9961> <9963> <C159> <9964> <996A> <C15D> <996B> <996B> <C166> <996C> <9971> <C16A> <9972> <9974> <C171> <9975> <9977> <C175> <9978> <997A> <C179> <9981> <9989> <C17C> <998A> <998F> <C186> <9990> <9990> <C18F> <9991> <9993> <C191> <9994> <9994> <C195> <9995> <9999> <C197> <999A> <999A> <C19E> <999B> <999B> <C1A0> <999C> <999E> <C1A2> <999F> <99A0> <C1A6> <99A1> <99A2> <C1AA> <99A3> <99A5> <C1AD> <99A6> <99B1> <C1B1> <99B2> <99B7> <C1BE> <99B8> <99BA> <C1C5> <99BB> <99BD> <C1C9> <99BE> <99C4> <C1CD> <99C5> <99C6> <C1D5> <99C7> <99CD> <C1D9> <99CE> <99D0> <C1E1> <99D1> <99D3> <C1E5> <99D4> <99DA> <C1E9> <99DB> <99DB> <C1F2> <99DC> <99E3> <C1F4> <99E4> <99E5> <C1FE> <99E6> <99E8> <C201> <99E9> <99EF> <C205> <99F0> <99F0> <C20E> <99F1> <99F1> <C210> <99F2> <99F7> <C212> <99F8> <99F9> <C21A> <99FA> <99FB> <C21D> <99FC> <99FE> <C221> <9A41> <9A44> <C224> <9A45> <9A45> <C22A> <9A46> <9A46> <C22C> <9A47> <9A47> <C22E> <9A48> <9A48> <C230> <9A49> <9A49> <C233> <9A4A> <9A5A> <C235> <9A61> <9A62> <C246> <9A63> <9A69> <C249> <9A6A> <9A6B> <C252> <9A6C> <9A6E> <C255> <9A6F> <9A75> <C259> <9A76> <9A79> <C261> <9A7A> <9A7A> <C266> <9A81> <9A85> <C267> <9A86> <9A87> <C26E> <9A88> <9A8A> <C271> <9A8B> <9A91> <C275> <9A92> <9A92> <C27E> <9A93> <9A93> <C280> <9A94> <9A99> <C282> <9A9A> <9A9F> <C28A> <9AA0> <9AA6> <C291> <9AA7> <9AA8> <C299> <9AA9> <9AA9> <C29C> <9AAA> <9AAF> <C29E> <9AB0> <9AB1> <C2A6> <9AB2> <9AB4> <C2A9> <9AB5> <9ABA> <C2AE> endbfrange 100 beginbfrange <9ABB> <9ABB> <C2B6> <9ABC> <9ABC> <C2B8> <9ABD> <9ADE> <C2BA> <9ADF> <9AE0> <C2DE> <9AE1> <9AE2> <C2E1> <9AE3> <9AE8> <C2E5> <9AE9> <9AE9> <C2EE> <9AEA> <9AEA> <C2F0> <9AEB> <9AEE> <C2F2> <9AEF> <9AEF> <C2F7> <9AF0> <9AF0> <C2FA> <9AF1> <9AF3> <C2FD> <9AF4> <9AFA> <C301> <9AFB> <9AFC> <C30A> <9AFD> <9AFE> <C30E> <9B41> <9B43> <C310> <9B44> <9B45> <C316> <9B46> <9B48> <C319> <9B49> <9B4F> <C31D> <9B50> <9B51> <C326> <9B52> <9B5A> <C32A> <9B61> <9B72> <C333> <9B73> <9B7A> <C346> <9B81> <9B9A> <C34E> <9B9B> <9B9C> <C36A> <9B9D> <9B9F> <C36D> <9BA0> <9BA0> <C371> <9BA1> <9BA5> <C373> <9BA6> <9BA7> <C37A> <9BA8> <9BAD> <C37E> <9BAE> <9BB0> <C385> <9BB1> <9BB3> <C389> <9BB4> <9BE6> <C38D> <9BE7> <9BFD> <C3C1> <9BFE> <9BFE> <C3DA> <9C41> <9C41> <C3DB> <9C42> <9C43> <C3DD> <9C44> <9C44> <C3E1> <9C45> <9C49> <C3E3> <9C4A> <9C4C> <C3EA> <9C4D> <9C52> <C3EE> <9C53> <9C54> <C3F6> <9C55> <9C5A> <C3F9> <9C61> <9C69> <C3FF> <9C6A> <9C70> <C409> <9C71> <9C7A> <C411> <9C81> <9C89> <C41B> <9C8A> <9C90> <C425> <9C91> <9C93> <C42D> <9C94> <9C96> <C431> <9C97> <9C9D> <C435> <9C9E> <9CA7> <C43E> <9CA8> <9CC2> <C449> <9CC3> <9CC4> <C466> <9CC5> <9CC7> <C469> <9CC8> <9CCE> <C46D> <9CCF> <9CD1> <C476> <9CD2> <9CD7> <C47A> <9CD8> <9CEA> <C481> <9CEB> <9CF1> <C495> <9CF2> <9CFE> <C49D> <9D41> <9D4E> <C4AA> <9D4F> <9D51> <C4B9> <9D52> <9D5A> <C4BD> <9D61> <9D7A> <C4C6> <9D81> <9D89> <C4E0> <9D8A> <9D8F> <C4EA> <9D90> <9D91> <C4F2> <9D92> <9D94> <C4F5> <9D95> <9D95> <C4F9> <9D96> <9D99> <C4FB> <9D9A> <9DA3> <C502> <9DA4> <9DA6> <C50D> <9DA7> <9DA9> <C511> <9DAA> <9DB0> <C515> <9DB1> <9DBB> <C51D> <9DBC> <9DBD> <C52A> <9DBE> <9DC0> <C52D> <9DC1> <9DC7> <C531> <9DC8> <9DC8> <C53A> <9DC9> <9DC9> <C53C> <9DCA> <9DCF> <C53E> <9DD0> <9DD1> <C546> <9DD2> <9DD2> <C54B> <9DD3> <9DD6> <C54F> <9DD7> <9DD7> <C556> <9DD8> <9DDA> <C55A> <9DDB> <9DDB> <C55F> <9DDC> <9DDD> <C562> <9DDE> <9DE0> <C565> <9DE1> <9DE7> <C569> <9DE8> <9DE8> <C572> <9DE9> <9DEE> <C576> <9DEF> <9DF0> <C57E> <9DF1> <9DF3> <C581> <9DF4> <9DF5> <C585> <9DF6> <9DF9> <C588> <9DFA> <9DFA> <C58E> <9DFB> <9DFB> <C590> <9DFC> <9DFE> <C592> endbfrange 100 beginbfrange <9E41> <9E41> <C596> <9E42> <9E44> <C599> <9E45> <9E47> <C59D> <9E48> <9E4F> <C5A1> <9E50> <9E59> <C5AA> <9E5A> <9E5A> <C5B6> <9E61> <9E61> <C5B7> <9E62> <9E62> <C5BA> <9E63> <9E67> <C5BF> <9E68> <9E68> <C5CB> <9E69> <9E69> <C5CD> <9E6A> <9E6A> <C5CF> <9E6B> <9E6C> <C5D2> <9E6D> <9E6F> <C5D5> <9E70> <9E76> <C5D9> <9E77> <9E77> <C5E2> <9E78> <9E78> <C5E4> <9E79> <9E7A> <C5E6> <9E81> <9E84> <C5E8> <9E85> <9E85> <C5EF> <9E86> <9E88> <C5F1> <9E89> <9E89> <C5F5> <9E8A> <9E8D> <C5F8> <9E8E> <9E90> <C602> <9E91> <9E93> <C609> <9E94> <9E96> <C60D> <9E97> <9E9D> <C611> <9E9E> <9E9E> <C61A> <9E9F> <9EA5> <C61D> <9EA6> <9EA7> <C626> <9EA8> <9EAA> <C629> <9EAB> <9EAB> <C62F> <9EAC> <9EAD> <C631> <9EAE> <9EAE> <C636> <9EAF> <9EAF> <C638> <9EB0> <9EB0> <C63A> <9EB1> <9EB4> <C63C> <9EB5> <9EB6> <C642> <9EB7> <9EB9> <C645> <9EBA> <9EC0> <C649> <9EC1> <9EC1> <C652> <9EC2> <9EC7> <C656> <9EC8> <9EC9> <C65E> <9ECA> <9ED4> <C661> <9ED5> <9ED6> <C66D> <9ED7> <9ED7> <C670> <9ED8> <9EDD> <C672> <9EDE> <9EDF> <C67A> <9EE0> <9EE2> <C67D> <9EE3> <9EE9> <C681> <9EEA> <9EEA> <C68A> <9EEB> <9EEB> <C68C> <9EEC> <9EF1> <C68E> <9EF2> <9EF3> <C696> <9EF4> <9EF6> <C699> <9EF7> <9EFD> <C69D> <9EFE> <9EFE> <C6A6> <9F41> <9F41> <C6A8> <9F42> <9F47> <C6AA> <9F48> <9F49> <C6B2> <9F4A> <9F4C> <C6B5> <9F4D> <9F51> <C6BB> <9F52> <9F52> <C6C2> <9F53> <9F53> <C6C4> <9F54> <9F59> <C6C6> <9F5A> <9F5A> <C6CE> <9F61> <9F61> <C6CF> <9F62> <9F64> <C6D1> <9F65> <9F6B> <C6D5> <9F6C> <9F6D> <C6DE> <9F6E> <9F73> <C6E2> <9F74> <9F75> <C6EA> <9F76> <9F78> <C6ED> <9F79> <9F7A> <C6F1> <9F81> <9F85> <C6F3> <9F86> <9F88> <C6FA> <9F89> <9F8E> <C6FE> <9F8F> <9F90> <C706> <9F91> <9F93> <C709> <9F94> <9F9A> <C70D> <9F9B> <9F9B> <C716> <9F9C> <9F9C> <C718> <9F9D> <9FA2> <C71A> <9FA3> <9FA4> <C722> <9FA5> <9FA7> <C725> <9FA8> <9FAE> <C729> <9FAF> <9FAF> <C732> <9FB0> <9FB0> <C734> <9FB1> <9FB1> <C736> <9FB2> <9FB5> <C738> <9FB6> <9FB7> <C73E> <9FB8> <9FBA> <C741> <9FBB> <9FBF> <C745> <9FC0> <9FC0> <C74B> <9FC1> <9FC1> <C74E> <9FC2> <9FC2> <C750> <9FC3> <9FC5> <C759> <9FC6> <9FC8> <C75D> <9FC9> <9FCF> <C761> <9FD0> <9FD1> <C769> endbfrange 100 beginbfrange <9FD2> <9FD9> <C76C> <9FDA> <9FDB> <C776> <9FDC> <9FDE> <C779> <9FDF> <9FE2> <C77F> <9FE3> <9FE3> <C786> <9FE4> <9FE6> <C78B> <9FE7> <9FE7> <C78F> <9FE8> <9FE9> <C792> <9FEA> <9FEA> <C795> <9FEB> <9FEB> <C799> <9FEC> <9FF0> <C79B> <9FF1> <9FF1> <C7A2> <9FF2> <9FF6> <C7A7> <9FF7> <9FF8> <C7AE> <9FF9> <9FFB> <C7B1> <9FFC> <9FFE> <C7B5> <A041> <A044> <C7B8> <A045> <A045> <C7BE> <A046> <A04B> <C7C2> <A04C> <A04D> <C7CA> <A04E> <A04E> <C7CD> <A04F> <A04F> <C7CF> <A050> <A056> <C7D1> <A057> <A05A> <C7D9> <A061> <A066> <C7DE> <A067> <A069> <C7E5> <A06A> <A06C> <C7E9> <A06D> <A07A> <C7ED> <A081> <A085> <C7FB> <A086> <A087> <C802> <A088> <A08A> <C805> <A08B> <A08B> <C809> <A08C> <A090> <C80B> <A091> <A091> <C812> <A092> <A092> <C814> <A093> <A097> <C817> <A098> <A099> <C81E> <A09A> <A09C> <C821> <A09D> <A0A3> <C825> <A0A4> <A0A4> <C82E> <A0A5> <A0A5> <C830> <A0A6> <A0AB> <C832> <A0AC> <A0AE> <C839> <A0AF> <A0B1> <C83D> <A0B2> <A0B8> <C841> <A0B9> <A0BA> <C84A> <A0BB> <A0C0> <C84E> <A0C1> <A0DB> <C855> <A0DC> <A0DD> <C872> <A0DE> <A0E0> <C875> <A0E1> <A0E1> <C879> <A0E2> <A0E6> <C87B> <A0E7> <A0E7> <C882> <A0E8> <A0E8> <C884> <A0E9> <A0EB> <C888> <A0EC> <A0F1> <C88E> <A0F2> <A0F9> <C895> <A0FA> <A0FA> <C89E> <A0FB> <A0FB> <C8A0> <A0FC> <A0FE> <C8A2> <A141> <A143> <C8A5> <A144> <A156> <C8A9> <A157> <A15A> <C8BE> <A161> <A162> <C8C2> <A163> <A165> <C8C5> <A166> <A168> <C8C9> <A169> <A16F> <C8CD> <A170> <A170> <C8D6> <A171> <A171> <C8D8> <A172> <A177> <C8DA> <A178> <A179> <C8E2> <A17A> <A17A> <C8E5> <A181> <A18F> <C8E6> <A190> <A195> <C8F6> <A196> <A197> <C8FE> <A198> <A19A> <C901> <A19B> <A19F> <C907> <A1A0> <A1A0> <C90E> <A1A1> <A1A3> <3000> <A1A4> <A1A4> <00B7> <A1A5> <A1A6> <2025> <A1A7> <A1A7> <00A8> <A1A8> <A1A8> <3003> <A1A9> <A1A9> <00AD> <A1AA> <A1AA> <2015> <A1AB> <A1AB> <2225> <A1AC> <A1AC> <FF3C> <A1AD> <A1AD> <223C> <A1AE> <A1AF> <2018> <A1B0> <A1B1> <201C> <A1B2> <A1B3> <3014> <A1B4> <A1BD> <3008> <A1BE> <A1BE> <00B1> <A1BF> <A1BF> <00D7> <A1C0> <A1C0> <00F7> <A1C1> <A1C1> <2260> <A1C2> <A1C3> <2264> <A1C4> <A1C4> <221E> <A1C5> <A1C5> <2234> <A1C6> <A1C6> <00B0> endbfrange 100 beginbfrange <A1C7> <A1C8> <2032> <A1C9> <A1C9> <2103> <A1CA> <A1CA> <212B> <A1CB> <A1CC> <FFE0> <A1CD> <A1CD> <FFE5> <A1CE> <A1CE> <2642> <A1CF> <A1CF> <2640> <A1D0> <A1D0> <2220> <A1D1> <A1D1> <22A5> <A1D2> <A1D2> <2312> <A1D3> <A1D3> <2202> <A1D4> <A1D4> <2207> <A1D5> <A1D5> <2261> <A1D6> <A1D6> <2252> <A1D7> <A1D7> <00A7> <A1D8> <A1D8> <203B> <A1D9> <A1D9> <2606> <A1DA> <A1DA> <2605> <A1DB> <A1DB> <25CB> <A1DC> <A1DC> <25CF> <A1DD> <A1DD> <25CE> <A1DE> <A1DE> <25C7> <A1DF> <A1DF> <25C6> <A1E0> <A1E0> <25A1> <A1E1> <A1E1> <25A0> <A1E2> <A1E2> <25B3> <A1E3> <A1E3> <25B2> <A1E4> <A1E4> <25BD> <A1E5> <A1E5> <25BC> <A1E6> <A1E6> <2192> <A1E7> <A1E8> <2190> <A1E9> <A1EA> <2193> <A1EB> <A1EB> <3013> <A1EC> <A1ED> <226A> <A1EE> <A1EE> <221A> <A1EF> <A1EF> <223D> <A1F0> <A1F0> <221D> <A1F1> <A1F1> <2235> <A1F2> <A1F3> <222B> <A1F4> <A1F4> <2208> <A1F5> <A1F5> <220B> <A1F6> <A1F7> <2286> <A1F8> <A1F9> <2282> <A1FA> <A1FA> <222A> <A1FB> <A1FB> <2229> <A1FC> <A1FD> <2227> <A1FE> <A1FE> <FFE2> <A241> <A241> <C910> <A242> <A247> <C912> <A248> <A25A> <C919> <A261> <A267> <C92D> <A268> <A27A> <C935> <A281> <A288> <C948> <A289> <A28A> <C952> <A28B> <A28D> <C955> <A28E> <A294> <C959> <A295> <A295> <C962> <A296> <A29D> <C964> <A29E> <A2A0> <C96D> <A2A1> <A2A1> <21D2> <A2A2> <A2A2> <21D4> <A2A3> <A2A3> <2200> <A2A4> <A2A4> <2203> <A2A5> <A2A5> <00B4> <A2A6> <A2A6> <FF5E> <A2A7> <A2A7> <02C7> <A2A8> <A2A8> <02D8> <A2A9> <A2A9> <02DD> <A2AA> <A2AA> <02DA> <A2AB> <A2AB> <02D9> <A2AC> <A2AC> <00B8> <A2AD> <A2AD> <02DB> <A2AE> <A2AE> <00A1> <A2AF> <A2AF> <00BF> <A2B0> <A2B0> <02D0> <A2B1> <A2B1> <222E> <A2B2> <A2B2> <2211> <A2B3> <A2B3> <220F> <A2B4> <A2B4> <00A4> <A2B5> <A2B5> <2109> <A2B6> <A2B6> <2030> <A2B7> <A2B7> <25C1> <A2B8> <A2B8> <25C0> <A2B9> <A2B9> <25B7> <A2BA> <A2BA> <25B6> <A2BB> <A2BB> <2664> <A2BC> <A2BD> <2660> <A2BE> <A2BE> <2665> <A2BF> <A2BF> <2667> <A2C0> <A2C0> <2663> <A2C1> <A2C1> <2299> <A2C2> <A2C2> <25C8> <A2C3> <A2C3> <25A3> <A2C4> <A2C5> <25D0> <A2C6> <A2C6> <2592> <A2C7> <A2C8> <25A4> <A2C9> <A2C9> <25A8> <A2CA> <A2CA> <25A7> <A2CB> <A2CB> <25A6> <A2CC> <A2CC> <25A9> endbfrange 100 beginbfrange <A2CD> <A2CD> <2668> <A2CE> <A2CE> <260F> <A2CF> <A2CF> <260E> <A2D0> <A2D0> <261C> <A2D1> <A2D1> <261E> <A2D2> <A2D2> <00B6> <A2D3> <A2D4> <2020> <A2D5> <A2D5> <2195> <A2D6> <A2D6> <2197> <A2D7> <A2D7> <2199> <A2D8> <A2D8> <2196> <A2D9> <A2D9> <2198> <A2DA> <A2DA> <266D> <A2DB> <A2DC> <2669> <A2DD> <A2DD> <266C> <A2DE> <A2DE> <327F> <A2DF> <A2DF> <321C> <A2E0> <A2E0> <2116> <A2E1> <A2E1> <33C7> <A2E2> <A2E2> <2122> <A2E3> <A2E3> <33C2> <A2E4> <A2E4> <33D8> <A2E5> <A2E5> <2121> <A341> <A343> <C971> <A344> <A34A> <C975> <A34B> <A355> <C97D> <A356> <A357> <C98A> <A358> <A35A> <C98D> <A361> <A367> <C991> <A368> <A368> <C99A> <A369> <A369> <C99C> <A36A> <A37A> <C99E> <A381> <A391> <C9AF> <A392> <A393> <C9C2> <A394> <A395> <C9C5> <A396> <A396> <C9C9> <A397> <A39B> <C9CB> <A39C> <A39C> <C9D2> <A39D> <A39D> <C9D4> <A39E> <A39F> <C9D7> <A3A0> <A3A0> <C9DB> <A3A1> <A3DB> <FF01> <A3DC> <A3DC> <FFE6> <A3DD> <A3FD> <FF3D> <A3FE> <A3FE> <FFE3> <A441> <A442> <C9DE> <A443> <A443> <C9E1> <A444> <A444> <C9E3> <A445> <A446> <C9E5> <A447> <A44A> <C9E8> <A44B> <A44B> <C9EE> <A44C> <A451> <C9F2> <A452> <A453> <C9FA> <A454> <A456> <C9FD> <A457> <A45A> <CA01> <A461> <A463> <CA05> <A464> <A464> <CA0A> <A465> <A46A> <CA0E> <A46B> <A46D> <CA15> <A46E> <A47A> <CA19> <A481> <A483> <CA26> <A484> <A4A0> <CA2A> <A4A1> <A4FE> <3131> <A541> <A545> <CA47> <A546> <A547> <CA4E> <A548> <A54A> <CA51> <A54B> <A551> <CA55> <A552> <A552> <CA5E> <A553> <A558> <CA62> <A559> <A55A> <CA69> <A561> <A572> <CA6B> <A573> <A578> <CA7E> <A579> <A57A> <CA85> <A581> <A591> <CA87> <A592> <A5A0> <CA99> <A5A1> <A5AA> <2170> <A5B0> <A5B9> <2160> <A5C1> <A5D1> <0391> <A5D2> <A5D8> <03A3> <A5E1> <A5F1> <03B1> <A5F2> <A5F8> <03C3> <A641> <A654> <CAA8> <A655> <A656> <CABE> <A657> <A659> <CAC1> <A65A> <A65A> <CAC5> <A661> <A666> <CAC6> <A667> <A667> <CACE> <A668> <A668> <CAD0> <A669> <A669> <CAD2> <A66A> <A66D> <CAD4> <A66E> <A673> <CADA> <A674> <A67A> <CAE1> <A681> <A684> <CAE8> <A685> <A68B> <CAED> <A68C> <A69E> <CAF5> <A69F> <A6A0> <CB09> <A6A1> <A6A1> <2500> <A6A2> <A6A2> <2502> <A6A3> <A6A3> <250C> <A6A4> <A6A4> <2510> endbfrange 100 beginbfrange <A6A5> <A6A5> <2518> <A6A6> <A6A6> <2514> <A6A7> <A6A7> <251C> <A6A8> <A6A8> <252C> <A6A9> <A6A9> <2524> <A6AA> <A6AA> <2534> <A6AB> <A6AB> <253C> <A6AC> <A6AC> <2501> <A6AD> <A6AD> <2503> <A6AE> <A6AE> <250F> <A6AF> <A6AF> <2513> <A6B0> <A6B0> <251B> <A6B1> <A6B1> <2517> <A6B2> <A6B2> <2523> <A6B3> <A6B3> <2533> <A6B4> <A6B4> <252B> <A6B5> <A6B5> <253B> <A6B6> <A6B6> <254B> <A6B7> <A6B7> <2520> <A6B8> <A6B8> <252F> <A6B9> <A6B9> <2528> <A6BA> <A6BA> <2537> <A6BB> <A6BB> <253F> <A6BC> <A6BC> <251D> <A6BD> <A6BD> <2530> <A6BE> <A6BE> <2525> <A6BF> <A6BF> <2538> <A6C0> <A6C0> <2542> <A6C1> <A6C1> <2512> <A6C2> <A6C2> <2511> <A6C3> <A6C3> <251A> <A6C4> <A6C4> <2519> <A6C5> <A6C5> <2516> <A6C6> <A6C6> <2515> <A6C7> <A6C7> <250E> <A6C8> <A6C8> <250D> <A6C9> <A6CA> <251E> <A6CB> <A6CC> <2521> <A6CD> <A6CE> <2526> <A6CF> <A6D0> <2529> <A6D1> <A6D2> <252D> <A6D3> <A6D4> <2531> <A6D5> <A6D6> <2535> <A6D7> <A6D8> <2539> <A6D9> <A6DA> <253D> <A6DB> <A6DC> <2540> <A6DD> <A6E4> <2543> <A741> <A745> <CB0B> <A746> <A748> <CB11> <A749> <A74B> <CB15> <A74C> <A752> <CB19> <A753> <A75A> <CB22> <A761> <A777> <CB2A> <A778> <A77A> <CB42> <A781> <A783> <CB45> <A784> <A785> <CB4A> <A786> <A788> <CB4D> <A789> <A78F> <CB51> <A790> <A792> <CB5A> <A793> <A798> <CB5E> <A799> <A7A0> <CB65> <A7A1> <A7A3> <3395> <A7A4> <A7A4> <2113> <A7A5> <A7A5> <3398> <A7A6> <A7A6> <33C4> <A7A7> <A7AA> <33A3> <A7AB> <A7B4> <3399> <A7B5> <A7B5> <33CA> <A7B6> <A7B8> <338D> <A7B9> <A7B9> <33CF> <A7BA> <A7BB> <3388> <A7BC> <A7BC> <33C8> <A7BD> <A7BE> <33A7> <A7BF> <A7C8> <33B0> <A7C9> <A7CD> <3380> <A7CE> <A7D3> <33BA> <A7D4> <A7D8> <3390> <A7D9> <A7D9> <2126> <A7DA> <A7DB> <33C0> <A7DC> <A7DE> <338A> <A7DF> <A7DF> <33D6> <A7E0> <A7E0> <33C5> <A7E1> <A7E3> <33AD> <A7E4> <A7E4> <33DB> <A7E5> <A7E8> <33A9> <A7E9> <A7E9> <33DD> <A7EA> <A7EA> <33D0> <A7EB> <A7EB> <33D3> <A7EC> <A7EC> <33C3> <A7ED> <A7ED> <33C9> <A7EE> <A7EE> <33DC> <A7EF> <A7EF> <33C6> <A841> <A84B> <CB6D> <A84C> <A85A> <CB7A> <A861> <A873> <CB89> <A874> <A87A> <CB9D> <A881> <A894> <CBA4> <A895> <A8A0> <CBB9> <A8A1> <A8A1> <00C6> <A8A2> <A8A2> <00D0> endbfrange 100 beginbfrange <A8A3> <A8A3> <00AA> <A8A4> <A8A4> <0126> <A8A6> <A8A6> <0132> <A8A8> <A8A8> <013F> <A8A9> <A8A9> <0141> <A8AA> <A8AA> <00D8> <A8AB> <A8AB> <0152> <A8AC> <A8AC> <00BA> <A8AD> <A8AD> <00DE> <A8AE> <A8AE> <0166> <A8AF> <A8AF> <014A> <A8B1> <A8CC> <3260> <A8CD> <A8E6> <24D0> <A8E7> <A8F5> <2460> <A8F6> <A8F6> <00BD> <A8F7> <A8F8> <2153> <A8F9> <A8F9> <00BC> <A8FA> <A8FA> <00BE> <A8FB> <A8FE> <215B> <A941> <A94F> <CBC5> <A950> <A95A> <CBD5> <A961> <A964> <CBE0> <A965> <A966> <CBE5> <A967> <A967> <CBE8> <A968> <A97A> <CBEA> <A981> <A98F> <CBFD> <A990> <A991> <CC0E> <A992> <A994> <CC11> <A995> <A99B> <CC15> <A99C> <A99E> <CC1E> <A99F> <A9A0> <CC23> <A9A1> <A9A1> <00E6> <A9A2> <A9A2> <0111> <A9A3> <A9A3> <00F0> <A9A4> <A9A4> <0127> <A9A5> <A9A5> <0131> <A9A6> <A9A6> <0133> <A9A7> <A9A7> <0138> <A9A8> <A9A8> <0140> <A9A9> <A9A9> <0142> <A9AA> <A9AA> <00F8> <A9AB> <A9AB> <0153> <A9AC> <A9AC> <00DF> <A9AD> <A9AD> <00FE> <A9AE> <A9AE> <0167> <A9AF> <A9AF> <014B> <A9B0> <A9B0> <0149> <A9B1> <A9CC> <3200> <A9CD> <A9E6> <249C> <A9E7> <A9F5> <2474> <A9F6> <A9F6> <00B9> <A9F7> <A9F8> <00B2> <A9F9> <A9F9> <2074> <A9FA> <A9FA> <207F> <A9FB> <A9FE> <2081> <AA41> <AA42> <CC25> <AA43> <AA44> <CC2A> <AA45> <AA45> <CC2D> <AA46> <AA46> <CC2F> <AA47> <AA4D> <CC31> <AA4E> <AA4E> <CC3A> <AA4F> <AA53> <CC3F> <AA54> <AA55> <CC46> <AA56> <AA58> <CC49> <AA59> <AA5A> <CC4D> <AA61> <AA65> <CC4F> <AA66> <AA66> <CC56> <AA67> <AA6C> <CC5A> <AA6D> <AA6F> <CC61> <AA70> <AA70> <CC65> <AA71> <AA71> <CC67> <AA72> <AA78> <CC69> <AA79> <AA7A> <CC71> <AA81> <AA82> <CC73> <AA83> <AAA0> <CC76> <AAA1> <AAF3> <3041> <AB41> <AB44> <CC94> <AB45> <AB46> <CC9A> <AB47> <AB49> <CC9D> <AB4A> <AB50> <CCA1> <AB51> <AB51> <CCAA> <AB52> <AB57> <CCAE> <AB58> <AB59> <CCB6> <AB5A> <AB5A> <CCB9> <AB61> <AB62> <CCBA> <AB63> <AB69> <CCBD> <AB6A> <AB6A> <CCC6> <AB6B> <AB6B> <CCC8> <AB6C> <AB71> <CCCA> <AB72> <AB74> <CCD1> <AB75> <AB7A> <CCD5> <AB81> <AB89> <CCDB> <AB8A> <AB90> <CCE5> <AB91> <AB93> <CCED> <AB94> <ABA0> <CCF1> <ABA1> <ABF6> <30A1> <AC41> <AC43> <CCFE> <AC44> <AC49> <CD02> <AC4A> <AC4B> <CD0A> <AC4C> <AC4E> <CD0D> endbfrange 100 beginbfrange <AC4F> <AC55> <CD11> <AC56> <AC56> <CD1A> <AC57> <AC57> <CD1C> <AC58> <AC5A> <CD1E> <AC61> <AC63> <CD21> <AC64> <AC66> <CD25> <AC67> <AC69> <CD29> <AC6A> <AC75> <CD2D> <AC76> <AC7A> <CD3A> <AC81> <AC9D> <CD3F> <AC9E> <ACA0> <CD5D> <ACA1> <ACA6> <0410> <ACA7> <ACA7> <0401> <ACA8> <ACC1> <0416> <ACD1> <ACD6> <0430> <ACD7> <ACD7> <0451> <ACD8> <ACF1> <0436> <AD41> <AD43> <CD61> <AD44> <AD4A> <CD65> <AD4B> <AD4B> <CD6E> <AD4C> <AD4C> <CD70> <AD4D> <AD52> <CD72> <AD53> <AD5A> <CD79> <AD61> <AD67> <CD81> <AD68> <AD72> <CD89> <AD73> <AD74> <CD96> <AD75> <AD77> <CD99> <AD78> <AD7A> <CD9D> <AD81> <AD84> <CDA0> <AD85> <AD85> <CDA6> <AD86> <AD86> <CDA8> <AD87> <AD8C> <CDAA> <AD8D> <AD9F> <CDB1> <ADA0> <ADA0> <CDC5> <AE41> <AE46> <CDC6> <AE47> <AE49> <CDCD> <AE4A> <AE5A> <CDD1> <AE61> <AE66> <CDE2> <AE67> <AE69> <CDE9> <AE6A> <AE6C> <CDED> <AE6D> <AE73> <CDF1> <AE74> <AE74> <CDFA> <AE75> <AE75> <CDFC> <AE76> <AE7A> <CDFE> <AE81> <AE81> <CE03> <AE82> <AE84> <CE05> <AE85> <AE87> <CE09> <AE88> <AE8E> <CE0D> <AE8F> <AE92> <CE15> <AE93> <AE98> <CE1A> <AE99> <AE9A> <CE22> <AE9B> <AE9D> <CE25> <AE9E> <AEA0> <CE29> <AF41> <AF44> <CE2C> <AF45> <AF45> <CE32> <AF46> <AF46> <CE34> <AF47> <AF5A> <CE36> <AF61> <AF6E> <CE4A> <AF6F> <AF70> <CE5A> <AF71> <AF72> <CE5D> <AF73> <AF78> <CE62> <AF79> <AF79> <CE6A> <AF7A> <AF7A> <CE6C> <AF81> <AF86> <CE6E> <AF87> <AF88> <CE76> <AF89> <AF8B> <CE79> <AF8C> <AF92> <CE7D> <AF93> <AF93> <CE86> <AF94> <AF94> <CE88> <AF95> <AF9A> <CE8A> <AF9B> <AF9C> <CE92> <AF9D> <AF9F> <CE95> <AFA0> <AFA0> <CE99> <B041> <B046> <CE9A> <B047> <B047> <CEA2> <B048> <B04D> <CEA6> <B04E> <B05A> <CEAE> <B061> <B066> <CEBB> <B067> <B07A> <CEC2> <B081> <B08E> <CED6> <B08F> <B090> <CEE6> <B091> <B092> <CEE9> <B093> <B099> <CEED> <B09A> <B09A> <CEF6> <B09B> <B0A0> <CEFA> <B0A1> <B0A2> <AC00> <B0A3> <B0A3> <AC04> <B0A4> <B0A7> <AC07> <B0A8> <B0AF> <AC10> <B0B0> <B0B4> <AC19> <B0B5> <B0B5> <AC20> <B0B6> <B0B6> <AC24> <B0B7> <B0B8> <AC2C> <B0B9> <B0BB> <AC2F> <B0BC> <B0BD> <AC38> <B0BE> <B0BE> <AC3C> <B0BF> <B0BF> <AC40> <B0C0> <B0C0> <AC4B> <B0C1> <B0C1> <AC4D> <B0C2> <B0C2> <AC54> endbfrange 100 beginbfrange <B0C3> <B0C3> <AC58> <B0C4> <B0C4> <AC5C> <B0C5> <B0C6> <AC70> <B0C7> <B0C7> <AC74> <B0C8> <B0C9> <AC77> <B0CA> <B0CA> <AC7A> <B0CB> <B0CC> <AC80> <B0CD> <B0D0> <AC83> <B0D1> <B0D4> <AC89> <B0D5> <B0D5> <AC90> <B0D6> <B0D6> <AC94> <B0D7> <B0D8> <AC9C> <B0D9> <B0DB> <AC9F> <B0DC> <B0DE> <ACA8> <B0DF> <B0DF> <ACAC> <B0E0> <B0E1> <ACAF> <B0E2> <B0E3> <ACB8> <B0E4> <B0E6> <ACBB> <B0E7> <B0E7> <ACC1> <B0E8> <B0E8> <ACC4> <B0E9> <B0E9> <ACC8> <B0EA> <B0EA> <ACCC> <B0EB> <B0EB> <ACD5> <B0EC> <B0EC> <ACD7> <B0ED> <B0EE> <ACE0> <B0EF> <B0EF> <ACE4> <B0F0> <B0F1> <ACE7> <B0F2> <B0F2> <ACEA> <B0F3> <B0F3> <ACEC> <B0F4> <B0F6> <ACEF> <B0F7> <B0F7> <ACF3> <B0F8> <B0F9> <ACF5> <B0FA> <B0FB> <ACFC> <B0FC> <B0FC> <AD00> <B0FD> <B0FD> <AD04> <B0FE> <B0FE> <AD06> <B141> <B142> <CF02> <B143> <B145> <CF05> <B146> <B14C> <CF09> <B14D> <B14D> <CF12> <B14E> <B14E> <CF14> <B14F> <B154> <CF16> <B155> <B157> <CF1D> <B158> <B15A> <CF21> <B161> <B167> <CF25> <B168> <B168> <CF2E> <B169> <B16E> <CF32> <B16F> <B17A> <CF39> <B181> <B18F> <CF45> <B190> <B191> <CF56> <B192> <B194> <CF59> <B195> <B19B> <CF5D> <B19C> <B19C> <CF66> <B19D> <B19D> <CF68> <B19E> <B1A0> <CF6A> <B1A1> <B1A2> <AD0C> <B1A3> <B1A3> <AD0F> <B1A4> <B1A4> <AD11> <B1A5> <B1A5> <AD18> <B1A6> <B1A6> <AD1C> <B1A7> <B1A7> <AD20> <B1A8> <B1A8> <AD29> <B1A9> <B1AA> <AD2C> <B1AB> <B1AC> <AD34> <B1AD> <B1AD> <AD38> <B1AE> <B1AE> <AD3C> <B1AF> <B1B0> <AD44> <B1B1> <B1B1> <AD47> <B1B2> <B1B2> <AD49> <B1B3> <B1B3> <AD50> <B1B4> <B1B4> <AD54> <B1B5> <B1B5> <AD58> <B1B6> <B1B6> <AD61> <B1B7> <B1B7> <AD63> <B1B8> <B1B9> <AD6C> <B1BA> <B1BA> <AD70> <B1BB> <B1BE> <AD73> <B1BF> <B1C1> <AD7B> <B1C2> <B1C2> <AD7F> <B1C3> <B1C4> <AD81> <B1C5> <B1C6> <AD88> <B1C7> <B1C7> <AD8C> <B1C8> <B1C8> <AD90> <B1C9> <B1CA> <AD9C> <B1CB> <B1CB> <ADA4> <B1CC> <B1CC> <ADB7> <B1CD> <B1CE> <ADC0> <B1CF> <B1CF> <ADC4> <B1D0> <B1D0> <ADC8> <B1D1> <B1D2> <ADD0> <B1D3> <B1D3> <ADD3> <B1D4> <B1D4> <ADDC> <B1D5> <B1D5> <ADE0> <B1D6> <B1D6> <ADE4> <B1D7> <B1D8> <ADF8> <B1D9> <B1D9> <ADFC> <B1DA> <B1DC> <ADFF> <B1DD> <B1DE> <AE08> <B1DF> <B1DF> <AE0B> <B1E0> <B1E0> <AE0D> endbfrange 100 beginbfrange <B1E1> <B1E1> <AE14> <B1E2> <B1E3> <AE30> <B1E4> <B1E4> <AE34> <B1E5> <B1E6> <AE37> <B1E7> <B1E7> <AE3A> <B1E8> <B1E9> <AE40> <B1EA> <B1EA> <AE43> <B1EB> <B1EC> <AE45> <B1ED> <B1ED> <AE4A> <B1EE> <B1F0> <AE4C> <B1F1> <B1F1> <AE50> <B1F2> <B1F2> <AE54> <B1F3> <B1F3> <AE56> <B1F4> <B1F5> <AE5C> <B1F6> <B1F8> <AE5F> <B1F9> <B1F9> <AE65> <B1FA> <B1FB> <AE68> <B1FC> <B1FC> <AE6C> <B1FD> <B1FD> <AE70> <B1FE> <B1FE> <AE78> <B241> <B243> <CF6D> <B244> <B245> <CF72> <B246> <B248> <CF75> <B249> <B24F> <CF79> <B250> <B253> <CF81> <B254> <B259> <CF86> <B25A> <B25A> <CF8D> <B261> <B273> <CF8E> <B274> <B279> <CFA2> <B27A> <B27A> <CFA9> <B281> <B286> <CFAA> <B287> <B299> <CFB1> <B29A> <B2A0> <CFC5> <B2A1> <B2A1> <AE79> <B2A2> <B2A4> <AE7B> <B2A5> <B2A6> <AE84> <B2A7> <B2A7> <AE8C> <B2A8> <B2AA> <AEBC> <B2AB> <B2AB> <AEC0> <B2AC> <B2AC> <AEC4> <B2AD> <B2AE> <AECC> <B2AF> <B2B1> <AECF> <B2B2> <B2B3> <AED8> <B2B4> <B2B4> <AEDC> <B2B5> <B2B5> <AEE8> <B2B6> <B2B6> <AEEB> <B2B7> <B2B7> <AEED> <B2B8> <B2B8> <AEF4> <B2B9> <B2B9> <AEF8> <B2BA> <B2BA> <AEFC> <B2BB> <B2BC> <AF07> <B2BD> <B2BD> <AF0D> <B2BE> <B2BE> <AF10> <B2BF> <B2C0> <AF2C> <B2C1> <B2C1> <AF30> <B2C2> <B2C2> <AF32> <B2C3> <B2C3> <AF34> <B2C4> <B2C5> <AF3C> <B2C6> <B2C6> <AF3F> <B2C7> <B2C9> <AF41> <B2CA> <B2CB> <AF48> <B2CC> <B2CC> <AF50> <B2CD> <B2CE> <AF5C> <B2CF> <B2D0> <AF64> <B2D1> <B2D1> <AF79> <B2D2> <B2D2> <AF80> <B2D3> <B2D3> <AF84> <B2D4> <B2D4> <AF88> <B2D5> <B2D6> <AF90> <B2D7> <B2D7> <AF95> <B2D8> <B2D8> <AF9C> <B2D9> <B2DA> <AFB8> <B2DB> <B2DB> <AFBC> <B2DC> <B2DC> <AFC0> <B2DD> <B2DF> <AFC7> <B2E0> <B2E0> <AFCB> <B2E1> <B2E2> <AFCD> <B2E3> <B2E3> <AFD4> <B2E4> <B2E4> <AFDC> <B2E5> <B2E6> <AFE8> <B2E7> <B2E8> <AFF0> <B2E9> <B2E9> <AFF4> <B2EA> <B2EA> <AFF8> <B2EB> <B2EC> <B000> <B2ED> <B2ED> <B004> <B2EE> <B2EE> <B00C> <B2EF> <B2EF> <B010> <B2F0> <B2F0> <B014> <B2F1> <B2F2> <B01C> <B2F3> <B2F3> <B028> <B2F4> <B2F5> <B044> <B2F6> <B2F6> <B048> <B2F7> <B2F7> <B04A> <B2F8> <B2F8> <B04C> <B2F9> <B2F9> <B04E> <B2FA> <B2FC> <B053> <B2FD> <B2FD> <B057> <B2FE> <B2FE> <B059> <B341> <B354> <CFCC> <B355> <B356> <CFE2> endbfrange 100 beginbfrange <B357> <B359> <CFE5> <B35A> <B35A> <CFE9> <B361> <B366> <CFEA> <B367> <B367> <CFF2> <B368> <B368> <CFF4> <B369> <B36E> <CFF6> <B36F> <B371> <CFFD> <B372> <B374> <D001> <B375> <B37A> <D005> <B381> <B386> <D00B> <B387> <B38C> <D012> <B38D> <B3A0> <D019> <B3A1> <B3A1> <B05D> <B3A2> <B3A3> <B07C> <B3A4> <B3A4> <B080> <B3A5> <B3A5> <B084> <B3A6> <B3A7> <B08C> <B3A8> <B3A8> <B08F> <B3A9> <B3A9> <B091> <B3AA> <B3AC> <B098> <B3AD> <B3AD> <B09C> <B3AE> <B3B1> <B09F> <B3B2> <B3B3> <B0A8> <B3B4> <B3B8> <B0AB> <B3B9> <B3B9> <B0B1> <B3BA> <B3BC> <B0B3> <B3BD> <B3BD> <B0B8> <B3BE> <B3BE> <B0BC> <B3BF> <B3C0> <B0C4> <B3C1> <B3C3> <B0C7> <B3C4> <B3C5> <B0D0> <B3C6> <B3C6> <B0D4> <B3C7> <B3C7> <B0D8> <B3C8> <B3C8> <B0E0> <B3C9> <B3C9> <B0E5> <B3CA> <B3CB> <B108> <B3CC> <B3CD> <B10B> <B3CE> <B3CE> <B110> <B3CF> <B3D0> <B112> <B3D1> <B3D2> <B118> <B3D3> <B3D5> <B11B> <B3D6> <B3D8> <B123> <B3D9> <B3D9> <B128> <B3DA> <B3DA> <B12C> <B3DB> <B3DC> <B134> <B3DD> <B3DF> <B137> <B3E0> <B3E1> <B140> <B3E2> <B3E2> <B144> <B3E3> <B3E3> <B148> <B3E4> <B3E5> <B150> <B3E6> <B3E7> <B154> <B3E8> <B3E8> <B158> <B3E9> <B3E9> <B15C> <B3EA> <B3EA> <B160> <B3EB> <B3EC> <B178> <B3ED> <B3ED> <B17C> <B3EE> <B3EE> <B180> <B3EF> <B3EF> <B182> <B3F0> <B3F1> <B188> <B3F2> <B3F2> <B18B> <B3F3> <B3F3> <B18D> <B3F4> <B3F6> <B192> <B3F7> <B3F7> <B198> <B3F8> <B3F8> <B19C> <B3F9> <B3F9> <B1A8> <B3FA> <B3FA> <B1CC> <B3FB> <B3FB> <B1D0> <B3FC> <B3FC> <B1D4> <B3FD> <B3FE> <B1DC> <B441> <B446> <D02E> <B447> <B448> <D036> <B449> <B44B> <D039> <B44C> <B452> <D03D> <B453> <B453> <D046> <B454> <B454> <D048> <B455> <B45A> <D04A> <B461> <B463> <D051> <B464> <B466> <D055> <B467> <B46D> <D059> <B46E> <B478> <D061> <B479> <B47A> <D06E> <B481> <B483> <D071> <B484> <B48A> <D075> <B48B> <B48D> <D07E> <B48E> <B4A0> <D082> <B4A1> <B4A1> <B1DF> <B4A2> <B4A3> <B1E8> <B4A4> <B4A4> <B1EC> <B4A5> <B4A5> <B1F0> <B4A6> <B4A6> <B1F9> <B4A7> <B4A7> <B1FB> <B4A8> <B4A8> <B1FD> <B4A9> <B4AA> <B204> <B4AB> <B4AB> <B208> <B4AC> <B4AD> <B20B> <B4AE> <B4AF> <B214> <B4B0> <B4B0> <B217> <B4B1> <B4B1> <B219> <B4B2> <B4B2> <B220> <B4B3> <B4B3> <B234> endbfrange 100 beginbfrange <B4B4> <B4B4> <B23C> <B4B5> <B4B5> <B258> <B4B6> <B4B6> <B25C> <B4B7> <B4B7> <B260> <B4B8> <B4B9> <B268> <B4BA> <B4BB> <B274> <B4BC> <B4BC> <B27C> <B4BD> <B4BE> <B284> <B4BF> <B4BF> <B289> <B4C0> <B4C1> <B290> <B4C2> <B4C2> <B294> <B4C3> <B4C5> <B298> <B4C6> <B4C7> <B2A0> <B4C8> <B4C8> <B2A3> <B4C9> <B4CA> <B2A5> <B4CB> <B4CB> <B2AA> <B4CC> <B4CC> <B2AC> <B4CD> <B4CD> <B2B0> <B4CE> <B4CE> <B2B4> <B4CF> <B4D0> <B2C8> <B4D1> <B4D1> <B2CC> <B4D2> <B4D2> <B2D0> <B4D3> <B4D3> <B2D2> <B4D4> <B4D5> <B2D8> <B4D6> <B4D6> <B2DB> <B4D7> <B4D7> <B2DD> <B4D8> <B4D8> <B2E2> <B4D9> <B4DB> <B2E4> <B4DC> <B4DC> <B2E8> <B4DD> <B4E1> <B2EB> <B4E2> <B4E4> <B2F3> <B4E5> <B4E9> <B2F7> <B4EA> <B4EC> <B2FF> <B4ED> <B4ED> <B304> <B4EE> <B4EE> <B308> <B4EF> <B4F0> <B310> <B4F1> <B4F3> <B313> <B4F4> <B4F4> <B31C> <B4F5> <B4F7> <B354> <B4F8> <B4F8> <B358> <B4F9> <B4FA> <B35B> <B4FB> <B4FC> <B35E> <B4FD> <B4FE> <B364> <B541> <B54F> <D095> <B550> <B551> <D0A6> <B552> <B554> <D0A9> <B555> <B55A> <D0AD> <B561> <B561> <D0B3> <B562> <B562> <D0B6> <B563> <B563> <D0B8> <B564> <B569> <D0BA> <B56A> <B56B> <D0C2> <B56C> <B56E> <D0C5> <B56F> <B574> <D0CA> <B575> <B575> <D0D2> <B576> <B57A> <D0D6> <B581> <B581> <D0DB> <B582> <B583> <D0DE> <B584> <B586> <D0E1> <B587> <B58D> <D0E5> <B58E> <B58E> <D0EE> <B58F> <B594> <D0F2> <B595> <B5A0> <D0F9> <B5A1> <B5A1> <B367> <B5A2> <B5A2> <B369> <B5A3> <B5A3> <B36B> <B5A4> <B5A4> <B36E> <B5A5> <B5A6> <B370> <B5A7> <B5A7> <B374> <B5A8> <B5A8> <B378> <B5A9> <B5AA> <B380> <B5AB> <B5AD> <B383> <B5AE> <B5AE> <B38C> <B5AF> <B5AF> <B390> <B5B0> <B5B0> <B394> <B5B1> <B5B2> <B3A0> <B5B3> <B5B3> <B3A8> <B5B4> <B5B4> <B3AC> <B5B5> <B5B6> <B3C4> <B5B7> <B5B7> <B3C8> <B5B8> <B5B9> <B3CB> <B5BA> <B5BA> <B3CE> <B5BB> <B5BB> <B3D0> <B5BC> <B5BD> <B3D4> <B5BE> <B5BE> <B3D7> <B5BF> <B5BF> <B3D9> <B5C0> <B5C0> <B3DB> <B5C1> <B5C1> <B3DD> <B5C2> <B5C2> <B3E0> <B5C3> <B5C3> <B3E4> <B5C4> <B5C4> <B3E8> <B5C5> <B5C5> <B3FC> <B5C6> <B5C6> <B410> <B5C7> <B5C7> <B418> <B5C8> <B5C8> <B41C> <B5C9> <B5C9> <B420> <B5CA> <B5CB> <B428> <B5CC> <B5CC> <B42B> <B5CD> <B5CD> <B434> <B5CE> <B5CF> <B450> endbfrange 100 beginbfrange <B5D0> <B5D0> <B454> <B5D1> <B5D1> <B458> <B5D2> <B5D3> <B460> <B5D4> <B5D4> <B463> <B5D5> <B5D5> <B465> <B5D6> <B5D6> <B46C> <B5D7> <B5D7> <B480> <B5D8> <B5D8> <B488> <B5D9> <B5D9> <B49D> <B5DA> <B5DA> <B4A4> <B5DB> <B5DB> <B4A8> <B5DC> <B5DC> <B4AC> <B5DD> <B5DD> <B4B5> <B5DE> <B5DE> <B4B7> <B5DF> <B5DF> <B4B9> <B5E0> <B5E0> <B4C0> <B5E1> <B5E1> <B4C4> <B5E2> <B5E2> <B4C8> <B5E3> <B5E3> <B4D0> <B5E4> <B5E4> <B4D5> <B5E5> <B5E6> <B4DC> <B5E7> <B5E7> <B4E0> <B5E8> <B5E9> <B4E3> <B5EA> <B5EA> <B4E6> <B5EB> <B5EC> <B4EC> <B5ED> <B5ED> <B4EF> <B5EE> <B5EE> <B4F1> <B5EF> <B5EF> <B4F8> <B5F0> <B5F1> <B514> <B5F2> <B5F2> <B518> <B5F3> <B5F4> <B51B> <B5F5> <B5F6> <B524> <B5F7> <B5FA> <B527> <B5FB> <B5FC> <B530> <B5FD> <B5FD> <B534> <B5FE> <B5FE> <B538> <B641> <B648> <D105> <B649> <B65A> <D10E> <B661> <B670> <D120> <B671> <B672> <D132> <B673> <B675> <D135> <B676> <B676> <D139> <B677> <B67A> <D13B> <B681> <B681> <D13F> <B682> <B682> <D142> <B683> <B688> <D146> <B689> <B68A> <D14E> <B68B> <B68D> <D151> <B68E> <B694> <D155> <B695> <B695> <D15E> <B696> <B696> <D160> <B697> <B69C> <D162> <B69D> <B69F> <D169> <B6A0> <B6A0> <D16D> <B6A1> <B6A2> <B540> <B6A3> <B6A5> <B543> <B6A6> <B6A8> <B54B> <B6A9> <B6A9> <B550> <B6AA> <B6AA> <B554> <B6AB> <B6AC> <B55C> <B6AD> <B6AF> <B55F> <B6B0> <B6B1> <B5A0> <B6B2> <B6B2> <B5A4> <B6B3> <B6B3> <B5A8> <B6B4> <B6B5> <B5AA> <B6B6> <B6B7> <B5B0> <B6B8> <B6BA> <B5B3> <B6BB> <B6BD> <B5BB> <B6BE> <B6BE> <B5C0> <B6BF> <B6BF> <B5C4> <B6C0> <B6C1> <B5CC> <B6C2> <B6C4> <B5CF> <B6C5> <B6C5> <B5D8> <B6C6> <B6C6> <B5EC> <B6C7> <B6C8> <B610> <B6C9> <B6C9> <B614> <B6CA> <B6CA> <B618> <B6CB> <B6CB> <B625> <B6CC> <B6CC> <B62C> <B6CD> <B6CD> <B634> <B6CE> <B6CE> <B648> <B6CF> <B6CF> <B664> <B6D0> <B6D0> <B668> <B6D1> <B6D2> <B69C> <B6D3> <B6D3> <B6A0> <B6D4> <B6D4> <B6A4> <B6D5> <B6D6> <B6AB> <B6D7> <B6D7> <B6B1> <B6D8> <B6D8> <B6D4> <B6D9> <B6D9> <B6F0> <B6DA> <B6DA> <B6F4> <B6DB> <B6DB> <B6F8> <B6DC> <B6DD> <B700> <B6DE> <B6DE> <B705> <B6DF> <B6E0> <B728> <B6E1> <B6E1> <B72C> <B6E2> <B6E3> <B72F> <B6E4> <B6E5> <B738> <B6E6> <B6E6> <B73B> <B6E7> <B6E7> <B744> endbfrange 100 beginbfrange <B6E8> <B6E8> <B748> <B6E9> <B6E9> <B74C> <B6EA> <B6EB> <B754> <B6EC> <B6EC> <B760> <B6ED> <B6ED> <B764> <B6EE> <B6EE> <B768> <B6EF> <B6F0> <B770> <B6F1> <B6F1> <B773> <B6F2> <B6F2> <B775> <B6F3> <B6F4> <B77C> <B6F5> <B6F5> <B780> <B6F6> <B6F6> <B784> <B6F7> <B6F8> <B78C> <B6F9> <B6FC> <B78F> <B6FD> <B6FE> <B796> <B741> <B74E> <D16E> <B74F> <B755> <D17D> <B756> <B758> <D185> <B759> <B75A> <D189> <B761> <B775> <D18B> <B776> <B777> <D1A2> <B778> <B77A> <D1A5> <B781> <B787> <D1A9> <B788> <B788> <D1B2> <B789> <B789> <D1B4> <B78A> <B78D> <D1B6> <B78E> <B78E> <D1BB> <B78F> <B791> <D1BD> <B792> <B7A0> <D1C1> <B7A1> <B7A2> <B798> <B7A3> <B7A3> <B79C> <B7A4> <B7A4> <B7A0> <B7A5> <B7A6> <B7A8> <B7A7> <B7A9> <B7AB> <B7AA> <B7AB> <B7B4> <B7AC> <B7AC> <B7B8> <B7AD> <B7AD> <B7C7> <B7AE> <B7AE> <B7C9> <B7AF> <B7B0> <B7EC> <B7B1> <B7B1> <B7F0> <B7B2> <B7B2> <B7F4> <B7B3> <B7B4> <B7FC> <B7B5> <B7B7> <B7FF> <B7B8> <B7BA> <B807> <B7BB> <B7BB> <B80C> <B7BC> <B7BC> <B810> <B7BD> <B7BE> <B818> <B7BF> <B7BF> <B81B> <B7C0> <B7C0> <B81D> <B7C1> <B7C2> <B824> <B7C3> <B7C3> <B828> <B7C4> <B7C4> <B82C> <B7C5> <B7C6> <B834> <B7C7> <B7C9> <B837> <B7CA> <B7CA> <B840> <B7CB> <B7CB> <B844> <B7CC> <B7CC> <B851> <B7CD> <B7CD> <B853> <B7CE> <B7CF> <B85C> <B7D0> <B7D0> <B860> <B7D1> <B7D1> <B864> <B7D2> <B7D3> <B86C> <B7D4> <B7D4> <B86F> <B7D5> <B7D5> <B871> <B7D6> <B7D6> <B878> <B7D7> <B7D7> <B87C> <B7D8> <B7D8> <B88D> <B7D9> <B7D9> <B8A8> <B7DA> <B7DA> <B8B0> <B7DB> <B7DB> <B8B4> <B7DC> <B7DC> <B8B8> <B7DD> <B7DE> <B8C0> <B7DF> <B7DF> <B8C3> <B7E0> <B7E0> <B8C5> <B7E1> <B7E1> <B8CC> <B7E2> <B7E2> <B8D0> <B7E3> <B7E3> <B8D4> <B7E4> <B7E4> <B8DD> <B7E5> <B7E5> <B8DF> <B7E6> <B7E6> <B8E1> <B7E7> <B7E8> <B8E8> <B7E9> <B7E9> <B8EC> <B7EA> <B7EA> <B8F0> <B7EB> <B7EC> <B8F8> <B7ED> <B7ED> <B8FB> <B7EE> <B7EE> <B8FD> <B7EF> <B7EF> <B904> <B7F0> <B7F0> <B918> <B7F1> <B7F1> <B920> <B7F2> <B7F3> <B93C> <B7F4> <B7F4> <B940> <B7F5> <B7F5> <B944> <B7F6> <B7F6> <B94C> <B7F7> <B7F7> <B94F> <B7F8> <B7F8> <B951> <B7F9> <B7FA> <B958> <B7FB> <B7FB> <B95C> <B7FC> <B7FC> <B960> <B7FD> <B7FE> <B968> <B841> <B848> <D1D0> endbfrange 100 beginbfrange <B849> <B85A> <D1D9> <B861> <B869> <D1EB> <B86A> <B86C> <D1F5> <B86D> <B87A> <D1F9> <B881> <B881> <D208> <B882> <B887> <D20A> <B888> <B8A0> <D211> <B8A1> <B8A1> <B96B> <B8A2> <B8A2> <B96D> <B8A3> <B8A4> <B974> <B8A5> <B8A5> <B978> <B8A6> <B8A6> <B97C> <B8A7> <B8A8> <B984> <B8A9> <B8A9> <B987> <B8AA> <B8AB> <B989> <B8AC> <B8AD> <B98D> <B8AE> <B8AF> <B9AC> <B8B0> <B8B0> <B9B0> <B8B1> <B8B1> <B9B4> <B8B2> <B8B3> <B9BC> <B8B4> <B8B4> <B9BF> <B8B5> <B8B5> <B9C1> <B8B6> <B8B7> <B9C8> <B8B8> <B8B8> <B9CC> <B8B9> <B8BD> <B9CE> <B8BE> <B8BF> <B9D8> <B8C0> <B8C0> <B9DB> <B8C1> <B8C2> <B9DD> <B8C3> <B8C3> <B9E1> <B8C4> <B8C6> <B9E3> <B8C7> <B8C7> <B9E8> <B8C8> <B8C8> <B9EC> <B8C9> <B8CA> <B9F4> <B8CB> <B8CE> <B9F7> <B8CF> <B8D0> <BA00> <B8D1> <B8D1> <BA08> <B8D2> <B8D2> <BA15> <B8D3> <B8D4> <BA38> <B8D5> <B8D5> <BA3C> <B8D6> <B8D6> <BA40> <B8D7> <B8D7> <BA42> <B8D8> <B8D9> <BA48> <B8DA> <B8DA> <BA4B> <B8DB> <B8DC> <BA4D> <B8DD> <B8DF> <BA53> <B8E0> <B8E0> <BA58> <B8E1> <B8E1> <BA5C> <B8E2> <B8E3> <BA64> <B8E4> <B8E6> <BA67> <B8E7> <B8E8> <BA70> <B8E9> <B8E9> <BA74> <B8EA> <B8EA> <BA78> <B8EB> <B8ED> <BA83> <B8EE> <B8EE> <BA87> <B8EF> <B8EF> <BA8C> <B8F0> <B8F1> <BAA8> <B8F2> <B8F3> <BAAB> <B8F4> <B8F4> <BAB0> <B8F5> <B8F5> <BAB2> <B8F6> <B8F7> <BAB8> <B8F8> <B8F8> <BABB> <B8F9> <B8F9> <BABD> <B8FA> <B8FA> <BAC4> <B8FB> <B8FB> <BAC8> <B8FC> <B8FD> <BAD8> <B8FE> <B8FE> <BAFC> <B941> <B942> <D22A> <B943> <B944> <D22E> <B945> <B947> <D231> <B948> <B94E> <D235> <B94F> <B94F> <D23E> <B950> <B950> <D240> <B951> <B956> <D242> <B957> <B95A> <D249> <B961> <B96F> <D24D> <B970> <B976> <D25D> <B977> <B97A> <D265> <B981> <B997> <D269> <B998> <B999> <D282> <B99A> <B99C> <D285> <B99D> <B9A0> <D289> <B9A1> <B9A1> <BB00> <B9A2> <B9A2> <BB04> <B9A3> <B9A3> <BB0D> <B9A4> <B9A4> <BB0F> <B9A5> <B9A5> <BB11> <B9A6> <B9A6> <BB18> <B9A7> <B9A7> <BB1C> <B9A8> <B9A8> <BB20> <B9A9> <B9A9> <BB29> <B9AA> <B9AA> <BB2B> <B9AB> <B9AD> <BB34> <B9AE> <B9AE> <BB38> <B9AF> <B9B2> <BB3B> <B9B3> <B9B4> <BB44> <B9B5> <B9B5> <BB47> <B9B6> <B9B6> <BB49> <B9B7> <B9B7> <BB4D> <B9B8> <B9B9> <BB4F> <B9BA> <B9BA> <BB54> endbfrange 100 beginbfrange <B9BB> <B9BB> <BB58> <B9BC> <B9BC> <BB61> <B9BD> <B9BD> <BB63> <B9BE> <B9BE> <BB6C> <B9BF> <B9BF> <BB88> <B9C0> <B9C0> <BB8C> <B9C1> <B9C1> <BB90> <B9C2> <B9C2> <BBA4> <B9C3> <B9C3> <BBA8> <B9C4> <B9C4> <BBAC> <B9C5> <B9C5> <BBB4> <B9C6> <B9C6> <BBB7> <B9C7> <B9C7> <BBC0> <B9C8> <B9C8> <BBC4> <B9C9> <B9C9> <BBC8> <B9CA> <B9CA> <BBD0> <B9CB> <B9CB> <BBD3> <B9CC> <B9CD> <BBF8> <B9CE> <B9CE> <BBFC> <B9CF> <B9D0> <BBFF> <B9D1> <B9D1> <BC02> <B9D2> <B9D3> <BC08> <B9D4> <B9D6> <BC0B> <B9D7> <B9D7> <BC0F> <B9D8> <B9D8> <BC11> <B9D9> <B9DD> <BC14> <B9DE> <B9E2> <BC1B> <B9E3> <B9E4> <BC24> <B9E5> <B9E5> <BC27> <B9E6> <B9E6> <BC29> <B9E7> <B9E7> <BC2D> <B9E8> <B9E9> <BC30> <B9EA> <B9EA> <BC34> <B9EB> <B9EB> <BC38> <B9EC> <B9ED> <BC40> <B9EE> <B9F0> <BC43> <B9F1> <B9F1> <BC49> <B9F2> <B9F3> <BC4C> <B9F4> <B9F4> <BC50> <B9F5> <B9F5> <BC5D> <B9F6> <B9F7> <BC84> <B9F8> <B9F8> <BC88> <B9F9> <B9FA> <BC8B> <B9FB> <B9FB> <BC8E> <B9FC> <B9FD> <BC94> <B9FE> <B9FE> <BC97> <BA41> <BA43> <D28D> <BA44> <BA46> <D292> <BA47> <BA4C> <D296> <BA4D> <BA4F> <D29D> <BA50> <BA52> <D2A1> <BA53> <BA59> <D2A5> <BA5A> <BA5A> <D2AD> <BA61> <BA63> <D2AE> <BA64> <BA69> <D2B2> <BA6A> <BA6B> <D2BA> <BA6C> <BA6D> <D2BD> <BA6E> <BA6E> <D2C1> <BA6F> <BA73> <D2C3> <BA74> <BA74> <D2CA> <BA75> <BA7A> <D2CC> <BA81> <BA82> <D2D2> <BA83> <BA85> <D2D5> <BA86> <BA88> <D2D9> <BA89> <BA8F> <D2DD> <BA90> <BA99> <D2E6> <BA9A> <BA9B> <D2F2> <BA9C> <BA9E> <D2F5> <BA9F> <BAA0> <D2F9> <BAA1> <BAA2> <BC99> <BAA3> <BAA4> <BCA0> <BAA5> <BAA5> <BCA4> <BAA6> <BAA7> <BCA7> <BAA8> <BAA9> <BCB0> <BAAA> <BAAC> <BCB3> <BAAD> <BAAE> <BCBC> <BAAF> <BAAF> <BCC0> <BAB0> <BAB0> <BCC4> <BAB1> <BAB1> <BCCD> <BAB2> <BAB4> <BCCF> <BAB5> <BAB5> <BCD5> <BAB6> <BAB6> <BCD8> <BAB7> <BAB7> <BCDC> <BAB8> <BABA> <BCF4> <BABB> <BABB> <BCF8> <BABC> <BABC> <BCFC> <BABD> <BABE> <BD04> <BABF> <BABF> <BD07> <BAC0> <BAC0> <BD09> <BAC1> <BAC1> <BD10> <BAC2> <BAC2> <BD14> <BAC3> <BAC3> <BD24> <BAC4> <BAC4> <BD2C> <BAC5> <BAC5> <BD40> <BAC6> <BAC7> <BD48> <BAC8> <BAC8> <BD4C> <BAC9> <BAC9> <BD50> <BACA> <BACB> <BD58> <BACC> <BACC> <BD64> <BACD> <BACD> <BD68> endbfrange 100 beginbfrange <BACE> <BACF> <BD80> <BAD0> <BAD0> <BD84> <BAD1> <BAD4> <BD87> <BAD5> <BAD6> <BD90> <BAD7> <BAD7> <BD93> <BAD8> <BAD8> <BD95> <BAD9> <BADA> <BD99> <BADB> <BADB> <BD9C> <BADC> <BADC> <BDA4> <BADD> <BADD> <BDB0> <BADE> <BADE> <BDB8> <BADF> <BAE0> <BDD4> <BAE1> <BAE1> <BDD8> <BAE2> <BAE2> <BDDC> <BAE3> <BAE3> <BDE9> <BAE4> <BAE4> <BDF0> <BAE5> <BAE5> <BDF4> <BAE6> <BAE6> <BDF8> <BAE7> <BAE7> <BE00> <BAE8> <BAE8> <BE03> <BAE9> <BAE9> <BE05> <BAEA> <BAEB> <BE0C> <BAEC> <BAEC> <BE10> <BAED> <BAED> <BE14> <BAEE> <BAEF> <BE1C> <BAF0> <BAF0> <BE1F> <BAF1> <BAF2> <BE44> <BAF3> <BAF3> <BE48> <BAF4> <BAF4> <BE4C> <BAF5> <BAF5> <BE4E> <BAF6> <BAF7> <BE54> <BAF8> <BAF8> <BE57> <BAF9> <BAFB> <BE59> <BAFC> <BAFD> <BE60> <BAFE> <BAFE> <BE64> <BB41> <BB45> <D2FB> <BB46> <BB46> <D302> <BB47> <BB47> <D304> <BB48> <BB4D> <D306> <BB4E> <BB4E> <D30F> <BB4F> <BB51> <D311> <BB52> <BB52> <D315> <BB53> <BB57> <D317> <BB58> <BB58> <D31E> <BB59> <BB5A> <D322> <BB61> <BB61> <D324> <BB62> <BB63> <D326> <BB64> <BB65> <D32A> <BB66> <BB68> <D32D> <BB69> <BB6F> <D331> <BB70> <BB70> <D33A> <BB71> <BB76> <D33E> <BB77> <BB7A> <D346> <BB81> <BBA0> <D34A> <BBA1> <BBA1> <BE68> <BBA2> <BBA2> <BE6A> <BBA3> <BBA4> <BE70> <BBA5> <BBA7> <BE73> <BBA8> <BBAA> <BE7B> <BBAB> <BBAB> <BE80> <BBAC> <BBAC> <BE84> <BBAD> <BBAE> <BE8C> <BBAF> <BBB1> <BE8F> <BBB2> <BBB3> <BE98> <BBB4> <BBB4> <BEA8> <BBB5> <BBB6> <BED0> <BBB7> <BBB7> <BED4> <BBB8> <BBB9> <BED7> <BBBA> <BBBA> <BEE0> <BBBB> <BBBD> <BEE3> <BBBE> <BBBE> <BEEC> <BBBF> <BBBF> <BF01> <BBC0> <BBC1> <BF08> <BBC2> <BBC3> <BF18> <BBC4> <BBC6> <BF1B> <BBC7> <BBC8> <BF40> <BBC9> <BBC9> <BF44> <BBCA> <BBCA> <BF48> <BBCB> <BBCC> <BF50> <BBCD> <BBCD> <BF55> <BBCE> <BBCE> <BF94> <BBCF> <BBCF> <BFB0> <BBD0> <BBD0> <BFC5> <BBD1> <BBD2> <BFCC> <BBD3> <BBD3> <BFD0> <BBD4> <BBD4> <BFD4> <BBD5> <BBD5> <BFDC> <BBD6> <BBD6> <BFDF> <BBD7> <BBD7> <BFE1> <BBD8> <BBD8> <C03C> <BBD9> <BBD9> <C051> <BBDA> <BBDA> <C058> <BBDB> <BBDB> <C05C> <BBDC> <BBDC> <C060> <BBDD> <BBDE> <C068> <BBDF> <BBE0> <C090> <BBE1> <BBE1> <C094> <BBE2> <BBE2> <C098> <BBE3> <BBE4> <C0A0> <BBE5> <BBE5> <C0A3> endbfrange 100 beginbfrange <BBE6> <BBE6> <C0A5> <BBE7> <BBE8> <C0AC> <BBE9> <BBEA> <C0AF> <BBEB> <BBEE> <C0B3> <BBEF> <BBF0> <C0BC> <BBF1> <BBF3> <C0BF> <BBF4> <BBF4> <C0C5> <BBF5> <BBF6> <C0C8> <BBF7> <BBF7> <C0CC> <BBF8> <BBF8> <C0D0> <BBF9> <BBFA> <C0D8> <BBFB> <BBFD> <C0DB> <BBFE> <BBFE> <C0E4> <BC41> <BC52> <D36A> <BC53> <BC54> <D37E> <BC55> <BC57> <D381> <BC58> <BC5A> <D385> <BC61> <BC64> <D388> <BC65> <BC65> <D38E> <BC66> <BC6B> <D392> <BC6C> <BC6D> <D39A> <BC6E> <BC70> <D39D> <BC71> <BC77> <D3A1> <BC78> <BC78> <D3AA> <BC79> <BC79> <D3AC> <BC7A> <BC7A> <D3AE> <BC81> <BC85> <D3AF> <BC86> <BC88> <D3B5> <BC89> <BC8B> <D3B9> <BC8C> <BC92> <D3BD> <BC93> <BC94> <D3C6> <BC95> <BC9A> <D3CA> <BC9B> <BCA0> <D3D1> <BCA1> <BCA1> <C0E5> <BCA2> <BCA2> <C0E8> <BCA3> <BCA3> <C0EC> <BCA4> <BCA5> <C0F4> <BCA6> <BCA6> <C0F7> <BCA7> <BCA7> <C0F9> <BCA8> <BCA8> <C100> <BCA9> <BCA9> <C104> <BCAA> <BCAA> <C108> <BCAB> <BCAB> <C110> <BCAC> <BCAC> <C115> <BCAD> <BCB1> <C11C> <BCB2> <BCB3> <C123> <BCB4> <BCB5> <C126> <BCB6> <BCB7> <C12C> <BCB8> <BCBA> <C12F> <BCBB> <BCBB> <C136> <BCBC> <BCBD> <C138> <BCBE> <BCBE> <C13C> <BCBF> <BCBF> <C140> <BCC0> <BCC1> <C148> <BCC2> <BCC4> <C14B> <BCC5> <BCC6> <C154> <BCC7> <BCC7> <C158> <BCC8> <BCC8> <C15C> <BCC9> <BCCA> <C164> <BCCB> <BCCD> <C167> <BCCE> <BCCE> <C170> <BCCF> <BCCF> <C174> <BCD0> <BCD0> <C178> <BCD1> <BCD1> <C185> <BCD2> <BCD4> <C18C> <BCD5> <BCD5> <C190> <BCD6> <BCD6> <C194> <BCD7> <BCD7> <C196> <BCD8> <BCD9> <C19C> <BCDA> <BCDA> <C19F> <BCDB> <BCDB> <C1A1> <BCDC> <BCDC> <C1A5> <BCDD> <BCDE> <C1A8> <BCDF> <BCDF> <C1AC> <BCE0> <BCE0> <C1B0> <BCE1> <BCE1> <C1BD> <BCE2> <BCE2> <C1C4> <BCE3> <BCE3> <C1C8> <BCE4> <BCE4> <C1CC> <BCE5> <BCE5> <C1D4> <BCE6> <BCE7> <C1D7> <BCE8> <BCE8> <C1E0> <BCE9> <BCE9> <C1E4> <BCEA> <BCEA> <C1E8> <BCEB> <BCEC> <C1F0> <BCED> <BCED> <C1F3> <BCEE> <BCEF> <C1FC> <BCF0> <BCF0> <C200> <BCF1> <BCF1> <C204> <BCF2> <BCF3> <C20C> <BCF4> <BCF4> <C20F> <BCF5> <BCF5> <C211> <BCF6> <BCF7> <C218> <BCF8> <BCF8> <C21C> <BCF9> <BCFA> <C21F> <BCFB> <BCFC> <C228> <BCFD> <BCFD> <C22B> <BCFE> <BCFE> <C22D> <BD41> <BD41> <D3D7> <BD42> <BD49> <D3D9> endbfrange 100 beginbfrange <BD4A> <BD4A> <D3E2> <BD4B> <BD52> <D3E4> <BD53> <BD54> <D3EE> <BD55> <BD57> <D3F1> <BD58> <BD5A> <D3F5> <BD61> <BD64> <D3F8> <BD65> <BD65> <D3FE> <BD66> <BD66> <D400> <BD67> <BD6C> <D402> <BD6D> <BD7A> <D409> <BD81> <BD86> <D417> <BD87> <BDA0> <D41E> <BDA1> <BDA1> <C22F> <BDA2> <BDA3> <C231> <BDA4> <BDA4> <C234> <BDA5> <BDA5> <C248> <BDA6> <BDA7> <C250> <BDA8> <BDA8> <C254> <BDA9> <BDA9> <C258> <BDAA> <BDAA> <C260> <BDAB> <BDAB> <C265> <BDAC> <BDAD> <C26C> <BDAE> <BDAE> <C270> <BDAF> <BDAF> <C274> <BDB0> <BDB1> <C27C> <BDB2> <BDB2> <C27F> <BDB3> <BDB3> <C281> <BDB4> <BDB5> <C288> <BDB6> <BDB6> <C290> <BDB7> <BDB7> <C298> <BDB8> <BDB8> <C29B> <BDB9> <BDB9> <C29D> <BDBA> <BDBB> <C2A4> <BDBC> <BDBC> <C2A8> <BDBD> <BDBE> <C2AC> <BDBF> <BDC0> <C2B4> <BDC1> <BDC1> <C2B7> <BDC2> <BDC2> <C2B9> <BDC3> <BDC4> <C2DC> <BDC5> <BDC5> <C2E0> <BDC6> <BDC7> <C2E3> <BDC8> <BDCA> <C2EB> <BDCB> <BDCB> <C2EF> <BDCC> <BDCC> <C2F1> <BDCD> <BDCD> <C2F6> <BDCE> <BDCF> <C2F8> <BDD0> <BDD1> <C2FB> <BDD2> <BDD2> <C300> <BDD3> <BDD4> <C308> <BDD5> <BDD6> <C30C> <BDD7> <BDD9> <C313> <BDDA> <BDDA> <C318> <BDDB> <BDDB> <C31C> <BDDC> <BDDD> <C324> <BDDE> <BDDF> <C328> <BDE0> <BDE0> <C345> <BDE1> <BDE2> <C368> <BDE3> <BDE3> <C36C> <BDE4> <BDE4> <C370> <BDE5> <BDE5> <C372> <BDE6> <BDE7> <C378> <BDE8> <BDE9> <C37C> <BDEA> <BDEA> <C384> <BDEB> <BDEB> <C388> <BDEC> <BDEC> <C38C> <BDED> <BDED> <C3C0> <BDEE> <BDEF> <C3D8> <BDF0> <BDF0> <C3DC> <BDF1> <BDF2> <C3DF> <BDF3> <BDF3> <C3E2> <BDF4> <BDF5> <C3E8> <BDF6> <BDF6> <C3ED> <BDF7> <BDF8> <C3F4> <BDF9> <BDF9> <C3F8> <BDFA> <BDFA> <C408> <BDFB> <BDFB> <C410> <BDFC> <BDFC> <C424> <BDFD> <BDFD> <C42C> <BDFE> <BDFE> <C430> <BE41> <BE48> <D438> <BE49> <BE4B> <D441> <BE4C> <BE5A> <D445> <BE61> <BE68> <D454> <BE69> <BE6B> <D45D> <BE6C> <BE6E> <D461> <BE6F> <BE76> <D465> <BE77> <BE77> <D46E> <BE78> <BE7A> <D470> <BE81> <BE85> <D473> <BE86> <BE87> <D47A> <BE88> <BE89> <D47D> <BE8A> <BE8A> <D481> <BE8B> <BE8F> <D483> <BE90> <BE90> <D48A> <BE91> <BE91> <D48C> <BE92> <BE97> <D48E> <BE98> <BEA0> <D495> <BEA1> <BEA1> <C434> <BEA2> <BEA3> <C43C> <BEA4> <BEA4> <C448> endbfrange 100 beginbfrange <BEA5> <BEA6> <C464> <BEA7> <BEA7> <C468> <BEA8> <BEA8> <C46C> <BEA9> <BEAA> <C474> <BEAB> <BEAB> <C479> <BEAC> <BEAC> <C480> <BEAD> <BEAD> <C494> <BEAE> <BEAE> <C49C> <BEAF> <BEAF> <C4B8> <BEB0> <BEB0> <C4BC> <BEB1> <BEB1> <C4E9> <BEB2> <BEB3> <C4F0> <BEB4> <BEB4> <C4F4> <BEB5> <BEB5> <C4F8> <BEB6> <BEB6> <C4FA> <BEB7> <BEB9> <C4FF> <BEBA> <BEBA> <C50C> <BEBB> <BEBB> <C510> <BEBC> <BEBC> <C514> <BEBD> <BEBD> <C51C> <BEBE> <BEBF> <C528> <BEC0> <BEC0> <C52C> <BEC1> <BEC1> <C530> <BEC2> <BEC3> <C538> <BEC4> <BEC4> <C53B> <BEC5> <BEC5> <C53D> <BEC6> <BEC7> <C544> <BEC8> <BECA> <C548> <BECB> <BECD> <C54C> <BECE> <BED0> <C553> <BED1> <BED3> <C557> <BED4> <BED5> <C55D> <BED6> <BED7> <C560> <BED8> <BED8> <C564> <BED9> <BED9> <C568> <BEDA> <BEDB> <C570> <BEDC> <BEDE> <C573> <BEDF> <BEE0> <C57C> <BEE1> <BEE1> <C580> <BEE2> <BEE2> <C584> <BEE3> <BEE3> <C587> <BEE4> <BEE5> <C58C> <BEE6> <BEE6> <C58F> <BEE7> <BEE7> <C591> <BEE8> <BEE8> <C595> <BEE9> <BEEA> <C597> <BEEB> <BEEB> <C59C> <BEEC> <BEEC> <C5A0> <BEED> <BEED> <C5A9> <BEEE> <BEEF> <C5B4> <BEF0> <BEF1> <C5B8> <BEF2> <BEF5> <C5BB> <BEF6> <BEFC> <C5C4> <BEFD> <BEFD> <C5CC> <BEFE> <BEFE> <C5CE> <BF41> <BF4B> <D49E> <BF4C> <BF5A> <D4AA> <BF61> <BF73> <D4B9> <BF74> <BF76> <D4CD> <BF77> <BF79> <D4D1> <BF7A> <BF7A> <D4D5> <BF81> <BF86> <D4D6> <BF87> <BF88> <D4DD> <BF89> <BF90> <D4E0> <BF91> <BF93> <D4E9> <BF94> <BF96> <D4ED> <BF97> <BF9D> <D4F1> <BF9E> <BF9F> <D4F9> <BFA0> <BFA0> <D4FC> <BFA1> <BFA2> <C5D0> <BFA3> <BFA3> <C5D4> <BFA4> <BFA4> <C5D8> <BFA5> <BFA6> <C5E0> <BFA7> <BFA7> <C5E3> <BFA8> <BFA8> <C5E5> <BFA9> <BFAB> <C5EC> <BFAC> <BFAC> <C5F0> <BFAD> <BFAD> <C5F4> <BFAE> <BFAF> <C5F6> <BFB0> <BFB5> <C5FC> <BFB6> <BFB9> <C605> <BFBA> <BFBA> <C60C> <BFBB> <BFBB> <C610> <BFBC> <BFBD> <C618> <BFBE> <BFBF> <C61B> <BFC0> <BFC1> <C624> <BFC2> <BFC2> <C628> <BFC3> <BFC5> <C62C> <BFC6> <BFC6> <C630> <BFC7> <BFC9> <C633> <BFCA> <BFCA> <C637> <BFCB> <BFCB> <C639> <BFCC> <BFCC> <C63B> <BFCD> <BFCE> <C640> <BFCF> <BFCF> <C644> <BFD0> <BFD0> <C648> <BFD1> <BFD2> <C650> <BFD3> <BFD5> <C653> <BFD6> <BFD7> <C65C> <BFD8> <BFD8> <C660> endbfrange 100 beginbfrange <BFD9> <BFD9> <C66C> <BFDA> <BFDA> <C66F> <BFDB> <BFDB> <C671> <BFDC> <BFDD> <C678> <BFDE> <BFDE> <C67C> <BFDF> <BFDF> <C680> <BFE0> <BFE1> <C688> <BFE2> <BFE2> <C68B> <BFE3> <BFE3> <C68D> <BFE4> <BFE5> <C694> <BFE6> <BFE6> <C698> <BFE7> <BFE7> <C69C> <BFE8> <BFE9> <C6A4> <BFEA> <BFEA> <C6A7> <BFEB> <BFEB> <C6A9> <BFEC> <BFED> <C6B0> <BFEE> <BFEE> <C6B4> <BFEF> <BFF1> <C6B8> <BFF2> <BFF3> <C6C0> <BFF4> <BFF4> <C6C3> <BFF5> <BFF5> <C6C5> <BFF6> <BFF7> <C6CC> <BFF8> <BFF8> <C6D0> <BFF9> <BFF9> <C6D4> <BFFA> <BFFB> <C6DC> <BFFC> <BFFD> <C6E0> <BFFE> <BFFE> <C6E8> <C041> <C046> <D4FE> <C047> <C049> <D505> <C04A> <C04C> <D509> <C04D> <C053> <D50D> <C054> <C054> <D516> <C055> <C05A> <D518> <C061> <C07A> <D51E> <C081> <C084> <D538> <C085> <C086> <D53E> <C087> <C089> <D541> <C08A> <C090> <D545> <C091> <C091> <D54E> <C092> <C092> <D550> <C093> <C098> <D552> <C099> <C09A> <D55A> <C09B> <C09D> <D55D> <C09E> <C0A0> <D561> <C0A1> <C0A1> <C6E9> <C0A2> <C0A2> <C6EC> <C0A3> <C0A3> <C6F0> <C0A4> <C0A5> <C6F8> <C0A6> <C0A6> <C6FD> <C0A7> <C0A8> <C704> <C0A9> <C0A9> <C708> <C0AA> <C0AA> <C70C> <C0AB> <C0AC> <C714> <C0AD> <C0AD> <C717> <C0AE> <C0AE> <C719> <C0AF> <C0B0> <C720> <C0B1> <C0B1> <C724> <C0B2> <C0B2> <C728> <C0B3> <C0B4> <C730> <C0B5> <C0B5> <C733> <C0B6> <C0B6> <C735> <C0B7> <C0B7> <C737> <C0B8> <C0B9> <C73C> <C0BA> <C0BA> <C740> <C0BB> <C0BB> <C744> <C0BC> <C0BC> <C74A> <C0BD> <C0BE> <C74C> <C0BF> <C0BF> <C74F> <C0C0> <C0C7> <C751> <C0C8> <C0C8> <C75C> <C0C9> <C0C9> <C760> <C0CA> <C0CA> <C768> <C0CB> <C0CB> <C76B> <C0CC> <C0CD> <C774> <C0CE> <C0CE> <C778> <C0CF> <C0D1> <C77C> <C0D2> <C0D4> <C783> <C0D5> <C0D8> <C787> <C0D9> <C0D9> <C78E> <C0DA> <C0DB> <C790> <C0DC> <C0DC> <C794> <C0DD> <C0DF> <C796> <C0E0> <C0E0> <C79A> <C0E1> <C0E2> <C7A0> <C0E3> <C0E6> <C7A3> <C0E7> <C0E8> <C7AC> <C0E9> <C0E9> <C7B0> <C0EA> <C0EA> <C7B4> <C0EB> <C0EC> <C7BC> <C0ED> <C0EF> <C7BF> <C0F0> <C0F1> <C7C8> <C0F2> <C0F2> <C7CC> <C0F3> <C0F3> <C7CE> <C0F4> <C0F4> <C7D0> <C0F5> <C0F5> <C7D8> <C0F6> <C0F6> <C7DD> <C0F7> <C0F7> <C7E4> <C0F8> <C0F8> <C7E8> <C0F9> <C0F9> <C7EC> <C0FA> <C0FB> <C800> endbfrange 100 beginbfrange <C0FC> <C0FC> <C804> <C0FD> <C0FD> <C808> <C0FE> <C0FE> <C80A> <C141> <C141> <D564> <C142> <C143> <D566> <C144> <C144> <D56A> <C145> <C145> <D56C> <C146> <C14B> <D56E> <C14C> <C14D> <D576> <C14E> <C150> <D579> <C151> <C157> <D57D> <C158> <C158> <D586> <C159> <C15A> <D58A> <C161> <C164> <D58C> <C165> <C178> <D591> <C179> <C17A> <D5A6> <C181> <C1A0> <D5A8> <C1A1> <C1A2> <C810> <C1A3> <C1A3> <C813> <C1A4> <C1A5> <C815> <C1A6> <C1A7> <C81C> <C1A8> <C1A8> <C820> <C1A9> <C1A9> <C824> <C1AA> <C1AB> <C82C> <C1AC> <C1AC> <C82F> <C1AD> <C1AD> <C831> <C1AE> <C1AE> <C838> <C1AF> <C1AF> <C83C> <C1B0> <C1B0> <C840> <C1B1> <C1B2> <C848> <C1B3> <C1B4> <C84C> <C1B5> <C1B5> <C854> <C1B6> <C1B7> <C870> <C1B8> <C1B8> <C874> <C1B9> <C1B9> <C878> <C1BA> <C1BA> <C87A> <C1BB> <C1BC> <C880> <C1BD> <C1BD> <C883> <C1BE> <C1C0> <C885> <C1C1> <C1C3> <C88B> <C1C4> <C1C4> <C894> <C1C5> <C1C5> <C89D> <C1C6> <C1C6> <C89F> <C1C7> <C1C7> <C8A1> <C1C8> <C1C8> <C8A8> <C1C9> <C1CA> <C8BC> <C1CB> <C1CB> <C8C4> <C1CC> <C1CC> <C8C8> <C1CD> <C1CD> <C8CC> <C1CE> <C1CF> <C8D4> <C1D0> <C1D0> <C8D7> <C1D1> <C1D1> <C8D9> <C1D2> <C1D3> <C8E0> <C1D4> <C1D4> <C8E4> <C1D5> <C1D5> <C8F5> <C1D6> <C1D7> <C8FC> <C1D8> <C1D8> <C900> <C1D9> <C1DB> <C904> <C1DC> <C1DD> <C90C> <C1DE> <C1DE> <C90F> <C1DF> <C1DF> <C911> <C1E0> <C1E0> <C918> <C1E1> <C1E1> <C92C> <C1E2> <C1E2> <C934> <C1E3> <C1E4> <C950> <C1E5> <C1E5> <C954> <C1E6> <C1E6> <C958> <C1E7> <C1E8> <C960> <C1E9> <C1E9> <C963> <C1EA> <C1EA> <C96C> <C1EB> <C1EB> <C970> <C1EC> <C1EC> <C974> <C1ED> <C1ED> <C97C> <C1EE> <C1EF> <C988> <C1F0> <C1F0> <C98C> <C1F1> <C1F1> <C990> <C1F2> <C1F3> <C998> <C1F4> <C1F4> <C99B> <C1F5> <C1F5> <C99D> <C1F6> <C1F7> <C9C0> <C1F8> <C1F8> <C9C4> <C1F9> <C1FA> <C9C7> <C1FB> <C1FB> <C9CA> <C1FC> <C1FD> <C9D0> <C1FE> <C1FE> <C9D3> <C241> <C242> <D5CA> <C243> <C245> <D5CD> <C246> <C246> <D5D1> <C247> <C24B> <D5D3> <C24C> <C24C> <D5DA> <C24D> <C24D> <D5DC> <C24E> <C253> <D5DE> <C254> <C255> <D5E6> <C256> <C258> <D5E9> <C259> <C25A> <D5ED> <C261> <C265> <D5EF> <C266> <C266> <D5F6> <C267> <C267> <D5F8> <C268> <C26D> <D5FA> <C26E> <C26F> <D602> endbfrange 100 beginbfrange <C270> <C272> <D605> <C273> <C279> <D609> <C27A> <C27A> <D612> <C281> <C286> <D616> <C287> <C289> <D61D> <C28A> <C28C> <D621> <C28D> <C294> <D625> <C295> <C29E> <D62E> <C29F> <C2A0> <D63A> <C2A1> <C2A2> <C9D5> <C2A3> <C2A4> <C9D9> <C2A5> <C2A6> <C9DC> <C2A7> <C2A7> <C9E0> <C2A8> <C2A8> <C9E2> <C2A9> <C2A9> <C9E4> <C2AA> <C2AA> <C9E7> <C2AB> <C2AC> <C9EC> <C2AD> <C2AF> <C9EF> <C2B0> <C2B1> <C9F8> <C2B2> <C2B2> <C9FC> <C2B3> <C2B3> <CA00> <C2B4> <C2B5> <CA08> <C2B6> <C2B8> <CA0B> <C2B9> <C2B9> <CA14> <C2BA> <C2BA> <CA18> <C2BB> <C2BB> <CA29> <C2BC> <C2BD> <CA4C> <C2BE> <C2BE> <CA50> <C2BF> <C2BF> <CA54> <C2C0> <C2C1> <CA5C> <C2C2> <C2C4> <CA5F> <C2C5> <C2C5> <CA68> <C2C6> <C2C6> <CA7D> <C2C7> <C2C7> <CA84> <C2C8> <C2C8> <CA98> <C2C9> <C2CA> <CABC> <C2CB> <C2CB> <CAC0> <C2CC> <C2CC> <CAC4> <C2CD> <C2CE> <CACC> <C2CF> <C2CF> <CACF> <C2D0> <C2D0> <CAD1> <C2D1> <C2D1> <CAD3> <C2D2> <C2D3> <CAD8> <C2D4> <C2D4> <CAE0> <C2D5> <C2D5> <CAEC> <C2D6> <C2D6> <CAF4> <C2D7> <C2D7> <CB08> <C2D8> <C2D8> <CB10> <C2D9> <C2D9> <CB14> <C2DA> <C2DA> <CB18> <C2DB> <C2DC> <CB20> <C2DD> <C2DD> <CB41> <C2DE> <C2DF> <CB48> <C2E0> <C2E0> <CB4C> <C2E1> <C2E1> <CB50> <C2E2> <C2E3> <CB58> <C2E4> <C2E4> <CB5D> <C2E5> <C2E5> <CB64> <C2E6> <C2E7> <CB78> <C2E8> <C2E8> <CB9C> <C2E9> <C2E9> <CBB8> <C2EA> <C2EA> <CBD4> <C2EB> <C2EB> <CBE4> <C2EC> <C2EC> <CBE7> <C2ED> <C2ED> <CBE9> <C2EE> <C2EF> <CC0C> <C2F0> <C2F0> <CC10> <C2F1> <C2F1> <CC14> <C2F2> <C2F3> <CC1C> <C2F4> <C2F5> <CC21> <C2F6> <C2F8> <CC27> <C2F9> <C2F9> <CC2C> <C2FA> <C2FA> <CC2E> <C2FB> <C2FB> <CC30> <C2FC> <C2FD> <CC38> <C2FE> <C2FE> <CC3B> <C341> <C343> <D63D> <C344> <C347> <D641> <C348> <C349> <D646> <C34A> <C34A> <D64A> <C34B> <C34B> <D64C> <C34C> <C34E> <D64E> <C34F> <C350> <D652> <C351> <C352> <D656> <C353> <C355> <D659> <C356> <C35A> <D65D> <C361> <C365> <D662> <C366> <C366> <D668> <C367> <C36C> <D66A> <C36D> <C36E> <D672> <C36F> <C37A> <D675> <C381> <C382> <D681> <C383> <C383> <D684> <C384> <C389> <D686> <C38A> <C38B> <D68E> <C38C> <C38E> <D691> <C38F> <C396> <D695> <C397> <C397> <D69E> <C398> <C398> <D6A0> <C399> <C39E> <D6A2> endbfrange 100 beginbfrange <C39F> <C3A0> <D6A9> <C3A1> <C3A3> <CC3C> <C3A4> <C3A5> <CC44> <C3A6> <C3A6> <CC48> <C3A7> <C3A7> <CC4C> <C3A8> <C3A9> <CC54> <C3AA> <C3AC> <CC57> <C3AD> <C3AD> <CC60> <C3AE> <C3AE> <CC64> <C3AF> <C3AF> <CC66> <C3B0> <C3B0> <CC68> <C3B1> <C3B1> <CC70> <C3B2> <C3B2> <CC75> <C3B3> <C3B4> <CC98> <C3B5> <C3B5> <CC9C> <C3B6> <C3B6> <CCA0> <C3B7> <C3B8> <CCA8> <C3B9> <C3BB> <CCAB> <C3BC> <C3BD> <CCB4> <C3BE> <C3BE> <CCB8> <C3BF> <C3BF> <CCBC> <C3C0> <C3C1> <CCC4> <C3C2> <C3C2> <CCC7> <C3C3> <C3C3> <CCC9> <C3C4> <C3C4> <CCD0> <C3C5> <C3C5> <CCD4> <C3C6> <C3C6> <CCE4> <C3C7> <C3C7> <CCEC> <C3C8> <C3C8> <CCF0> <C3C9> <C3C9> <CD01> <C3CA> <C3CB> <CD08> <C3CC> <C3CC> <CD0C> <C3CD> <C3CD> <CD10> <C3CE> <C3CF> <CD18> <C3D0> <C3D0> <CD1B> <C3D1> <C3D1> <CD1D> <C3D2> <C3D2> <CD24> <C3D3> <C3D3> <CD28> <C3D4> <C3D4> <CD2C> <C3D5> <C3D5> <CD39> <C3D6> <C3D6> <CD5C> <C3D7> <C3D7> <CD60> <C3D8> <C3D8> <CD64> <C3D9> <C3DA> <CD6C> <C3DB> <C3DB> <CD6F> <C3DC> <C3DC> <CD71> <C3DD> <C3DD> <CD78> <C3DE> <C3DE> <CD88> <C3DF> <C3E0> <CD94> <C3E1> <C3E1> <CD98> <C3E2> <C3E2> <CD9C> <C3E3> <C3E4> <CDA4> <C3E5> <C3E5> <CDA7> <C3E6> <C3E6> <CDA9> <C3E7> <C3E7> <CDB0> <C3E8> <C3E8> <CDC4> <C3E9> <C3E9> <CDCC> <C3EA> <C3EA> <CDD0> <C3EB> <C3EB> <CDE8> <C3EC> <C3EC> <CDEC> <C3ED> <C3ED> <CDF0> <C3EE> <C3EF> <CDF8> <C3F0> <C3F0> <CDFB> <C3F1> <C3F1> <CDFD> <C3F2> <C3F2> <CE04> <C3F3> <C3F3> <CE08> <C3F4> <C3F4> <CE0C> <C3F5> <C3F5> <CE14> <C3F6> <C3F6> <CE19> <C3F7> <C3F8> <CE20> <C3F9> <C3F9> <CE24> <C3FA> <C3FA> <CE28> <C3FB> <C3FC> <CE30> <C3FD> <C3FD> <CE33> <C3FE> <C3FE> <CE35> <C441> <C441> <D6AB> <C442> <C444> <D6AD> <C445> <C44C> <D6B1> <C44D> <C44D> <D6BA> <C44E> <C455> <D6BC> <C456> <C457> <D6C6> <C458> <C45A> <D6C9> <C461> <C464> <D6CD> <C465> <C466> <D6D2> <C467> <C468> <D6D5> <C469> <C469> <D6D8> <C46A> <C46F> <D6DA> <C470> <C472> <D6E1> <C473> <C475> <D6E5> <C476> <C47A> <D6E9> <C481> <C482> <D6EE> <C483> <C486> <D6F1> <C487> <C48C> <D6F6> <C48D> <C48E> <D6FE> <C48F> <C491> <D701> <C492> <C49D> <D705> <C49E> <C4A0> <D712> <C4A1> <C4A2> <CE58> <C4A3> <C4A3> <CE5C> <C4A4> <C4A6> <CE5F> endbfrange 100 beginbfrange <C4A7> <C4A8> <CE68> <C4A9> <C4A9> <CE6B> <C4AA> <C4AA> <CE6D> <C4AB> <C4AC> <CE74> <C4AD> <C4AD> <CE78> <C4AE> <C4AE> <CE7C> <C4AF> <C4B0> <CE84> <C4B1> <C4B1> <CE87> <C4B2> <C4B2> <CE89> <C4B3> <C4B4> <CE90> <C4B5> <C4B5> <CE94> <C4B6> <C4B6> <CE98> <C4B7> <C4B8> <CEA0> <C4B9> <C4BB> <CEA3> <C4BC> <C4BD> <CEAC> <C4BE> <C4BE> <CEC1> <C4BF> <C4C0> <CEE4> <C4C1> <C4C1> <CEE8> <C4C2> <C4C3> <CEEB> <C4C4> <C4C5> <CEF4> <C4C6> <C4C8> <CEF7> <C4C9> <C4CA> <CF00> <C4CB> <C4CB> <CF04> <C4CC> <C4CC> <CF08> <C4CD> <C4CE> <CF10> <C4CF> <C4CF> <CF13> <C4D0> <C4D0> <CF15> <C4D1> <C4D1> <CF1C> <C4D2> <C4D2> <CF20> <C4D3> <C4D3> <CF24> <C4D4> <C4D5> <CF2C> <C4D6> <C4D8> <CF2F> <C4D9> <C4D9> <CF38> <C4DA> <C4DB> <CF54> <C4DC> <C4DC> <CF58> <C4DD> <C4DD> <CF5C> <C4DE> <C4DF> <CF64> <C4E0> <C4E0> <CF67> <C4E1> <C4E1> <CF69> <C4E2> <C4E3> <CF70> <C4E4> <C4E4> <CF74> <C4E5> <C4E5> <CF78> <C4E6> <C4E6> <CF80> <C4E7> <C4E7> <CF85> <C4E8> <C4E8> <CF8C> <C4E9> <C4E9> <CFA1> <C4EA> <C4EA> <CFA8> <C4EB> <C4EB> <CFB0> <C4EC> <C4EC> <CFC4> <C4ED> <C4EE> <CFE0> <C4EF> <C4EF> <CFE4> <C4F0> <C4F0> <CFE8> <C4F1> <C4F2> <CFF0> <C4F3> <C4F3> <CFF3> <C4F4> <C4F4> <CFF5> <C4F5> <C4F5> <CFFC> <C4F6> <C4F6> <D000> <C4F7> <C4F7> <D004> <C4F8> <C4F8> <D011> <C4F9> <C4F9> <D018> <C4FA> <C4FA> <D02D> <C4FB> <C4FC> <D034> <C4FD> <C4FD> <D038> <C4FE> <C4FE> <D03C> <C541> <C543> <D715> <C544> <C545> <D71A> <C546> <C548> <D71D> <C549> <C54F> <D721> <C550> <C550> <D72A> <C551> <C551> <D72C> <C552> <C557> <D72E> <C558> <C559> <D736> <C55A> <C55A> <D739> <C561> <C562> <D73A> <C563> <C569> <D73D> <C56A> <C56B> <D745> <C56C> <C56C> <D748> <C56D> <C572> <D74A> <C573> <C574> <D752> <C575> <C575> <D755> <C576> <C57A> <D75A> <C581> <C581> <D75F> <C582> <C582> <D762> <C583> <C583> <D764> <C584> <C586> <D766> <C587> <C588> <D76A> <C589> <C58B> <D76D> <C58C> <C58E> <D771> <C58F> <C595> <D775> <C596> <C598> <D77E> <C599> <C59E> <D782> <C59F> <C5A0> <D78A> <C5A1> <C5A2> <D044> <C5A3> <C5A3> <D047> <C5A4> <C5A4> <D049> <C5A5> <C5A5> <D050> <C5A6> <C5A6> <D054> <C5A7> <C5A7> <D058> <C5A8> <C5A8> <D060> <C5A9> <C5AA> <D06C> endbfrange 100 beginbfrange <C5AB> <C5AB> <D070> <C5AC> <C5AC> <D074> <C5AD> <C5AE> <D07C> <C5AF> <C5AF> <D081> <C5B0> <C5B1> <D0A4> <C5B2> <C5B2> <D0A8> <C5B3> <C5B3> <D0AC> <C5B4> <C5B5> <D0B4> <C5B6> <C5B6> <D0B7> <C5B7> <C5B7> <D0B9> <C5B8> <C5B9> <D0C0> <C5BA> <C5BA> <D0C4> <C5BB> <C5BC> <D0C8> <C5BD> <C5BE> <D0D0> <C5BF> <C5C1> <D0D3> <C5C2> <C5C3> <D0DC> <C5C4> <C5C4> <D0E0> <C5C5> <C5C5> <D0E4> <C5C6> <C5C7> <D0EC> <C5C8> <C5CA> <D0EF> <C5CB> <C5CB> <D0F8> <C5CC> <C5CC> <D10D> <C5CD> <C5CE> <D130> <C5CF> <C5CF> <D134> <C5D0> <C5D0> <D138> <C5D1> <C5D1> <D13A> <C5D2> <C5D3> <D140> <C5D4> <C5D6> <D143> <C5D7> <C5D8> <D14C> <C5D9> <C5D9> <D150> <C5DA> <C5DA> <D154> <C5DB> <C5DC> <D15C> <C5DD> <C5DD> <D15F> <C5DE> <C5DE> <D161> <C5DF> <C5DF> <D168> <C5E0> <C5E0> <D16C> <C5E1> <C5E1> <D17C> <C5E2> <C5E2> <D184> <C5E3> <C5E3> <D188> <C5E4> <C5E5> <D1A0> <C5E6> <C5E6> <D1A4> <C5E7> <C5E7> <D1A8> <C5E8> <C5E9> <D1B0> <C5EA> <C5EA> <D1B3> <C5EB> <C5EB> <D1B5> <C5EC> <C5EC> <D1BA> <C5ED> <C5ED> <D1BC> <C5EE> <C5EE> <D1C0> <C5EF> <C5EF> <D1D8> <C5F0> <C5F0> <D1F4> <C5F1> <C5F1> <D1F8> <C5F2> <C5F2> <D207> <C5F3> <C5F3> <D209> <C5F4> <C5F4> <D210> <C5F5> <C5F6> <D22C> <C5F7> <C5F7> <D230> <C5F8> <C5F8> <D234> <C5F9> <C5FA> <D23C> <C5FB> <C5FB> <D23F> <C5FC> <C5FC> <D241> <C5FD> <C5FD> <D248> <C5FE> <C5FE> <D25C> <C641> <C643> <D78D> <C644> <C64A> <D791> <C64B> <C64B> <D79A> <C64C> <C64C> <D79C> <C64D> <C652> <D79E> <C6A1> <C6A1> <D264> <C6A2> <C6A3> <D280> <C6A4> <C6A4> <D284> <C6A5> <C6A5> <D288> <C6A6> <C6A7> <D290> <C6A8> <C6A8> <D295> <C6A9> <C6A9> <D29C> <C6AA> <C6AA> <D2A0> <C6AB> <C6AB> <D2A4> <C6AC> <C6AC> <D2AC> <C6AD> <C6AD> <D2B1> <C6AE> <C6AF> <D2B8> <C6B0> <C6B0> <D2BC> <C6B1> <C6B2> <D2BF> <C6B3> <C6B3> <D2C2> <C6B4> <C6B5> <D2C8> <C6B6> <C6B6> <D2CB> <C6B7> <C6B7> <D2D4> <C6B8> <C6B8> <D2D8> <C6B9> <C6B9> <D2DC> <C6BA> <C6BB> <D2E4> <C6BC> <C6BD> <D2F0> <C6BE> <C6BE> <D2F4> <C6BF> <C6BF> <D2F8> <C6C0> <C6C1> <D300> <C6C2> <C6C2> <D303> <C6C3> <C6C3> <D305> <C6C4> <C6C6> <D30C> <C6C7> <C6C7> <D310> <C6C8> <C6C8> <D314> <C6C9> <C6C9> <D316> <C6CA> <C6CB> <D31C> <C6CC> <C6CE> <D31F> endbfrange 100 beginbfrange <C6CF> <C6CF> <D325> <C6D0> <C6D1> <D328> <C6D2> <C6D2> <D32C> <C6D3> <C6D3> <D330> <C6D4> <C6D5> <D338> <C6D6> <C6D8> <D33B> <C6D9> <C6DA> <D344> <C6DB> <C6DC> <D37C> <C6DD> <C6DD> <D380> <C6DE> <C6DE> <D384> <C6DF> <C6E0> <D38C> <C6E1> <C6E3> <D38F> <C6E4> <C6E5> <D398> <C6E6> <C6E6> <D39C> <C6E7> <C6E7> <D3A0> <C6E8> <C6E9> <D3A8> <C6EA> <C6EA> <D3AB> <C6EB> <C6EB> <D3AD> <C6EC> <C6EC> <D3B4> <C6ED> <C6ED> <D3B8> <C6EE> <C6EE> <D3BC> <C6EF> <C6F0> <D3C4> <C6F1> <C6F2> <D3C8> <C6F3> <C6F3> <D3D0> <C6F4> <C6F4> <D3D8> <C6F5> <C6F5> <D3E1> <C6F6> <C6F6> <D3E3> <C6F7> <C6F8> <D3EC> <C6F9> <C6F9> <D3F0> <C6FA> <C6FA> <D3F4> <C6FB> <C6FC> <D3FC> <C6FD> <C6FD> <D3FF> <C6FE> <C6FE> <D401> <C7A1> <C7A1> <D408> <C7A2> <C7A2> <D41D> <C7A3> <C7A3> <D440> <C7A4> <C7A4> <D444> <C7A5> <C7A5> <D45C> <C7A6> <C7A6> <D460> <C7A7> <C7A7> <D464> <C7A8> <C7A8> <D46D> <C7A9> <C7A9> <D46F> <C7AA> <C7AB> <D478> <C7AC> <C7AC> <D47C> <C7AD> <C7AE> <D47F> <C7AF> <C7AF> <D482> <C7B0> <C7B1> <D488> <C7B2> <C7B2> <D48B> <C7B3> <C7B3> <D48D> <C7B4> <C7B4> <D494> <C7B5> <C7B5> <D4A9> <C7B6> <C7B6> <D4CC> <C7B7> <C7B7> <D4D0> <C7B8> <C7B8> <D4D4> <C7B9> <C7B9> <D4DC> <C7BA> <C7BA> <D4DF> <C7BB> <C7BB> <D4E8> <C7BC> <C7BC> <D4EC> <C7BD> <C7BD> <D4F0> <C7BE> <C7BE> <D4F8> <C7BF> <C7BF> <D4FB> <C7C0> <C7C0> <D4FD> <C7C1> <C7C1> <D504> <C7C2> <C7C2> <D508> <C7C3> <C7C3> <D50C> <C7C4> <C7C5> <D514> <C7C6> <C7C6> <D517> <C7C7> <C7C8> <D53C> <C7C9> <C7C9> <D540> <C7CA> <C7CA> <D544> <C7CB> <C7CC> <D54C> <C7CD> <C7CD> <D54F> <C7CE> <C7CE> <D551> <C7CF> <C7D0> <D558> <C7D1> <C7D1> <D55C> <C7D2> <C7D2> <D560> <C7D3> <C7D3> <D565> <C7D4> <C7D5> <D568> <C7D6> <C7D6> <D56B> <C7D7> <C7D7> <D56D> <C7D8> <C7D9> <D574> <C7DA> <C7DA> <D578> <C7DB> <C7DB> <D57C> <C7DC> <C7DD> <D584> <C7DE> <C7E0> <D587> <C7E1> <C7E1> <D590> <C7E2> <C7E2> <D5A5> <C7E3> <C7E4> <D5C8> <C7E5> <C7E5> <D5CC> <C7E6> <C7E6> <D5D0> <C7E7> <C7E7> <D5D2> <C7E8> <C7E9> <D5D8> <C7EA> <C7EA> <D5DB> <C7EB> <C7EB> <D5DD> <C7EC> <C7ED> <D5E4> <C7EE> <C7EE> <D5E8> <C7EF> <C7EF> <D5EC> <C7F0> <C7F1> <D5F4> <C7F2> <C7F2> <D5F7> <C7F3> <C7F3> <D5F9> endbfrange 100 beginbfrange <C7F4> <C7F5> <D600> <C7F6> <C7F6> <D604> <C7F7> <C7F7> <D608> <C7F8> <C7F9> <D610> <C7FA> <C7FC> <D613> <C7FD> <C7FD> <D61C> <C7FE> <C7FE> <D620> <C8A1> <C8A1> <D624> <C8A2> <C8A2> <D62D> <C8A3> <C8A4> <D638> <C8A5> <C8A5> <D63C> <C8A6> <C8A6> <D640> <C8A7> <C8A7> <D645> <C8A8> <C8A9> <D648> <C8AA> <C8AA> <D64B> <C8AB> <C8AB> <D64D> <C8AC> <C8AC> <D651> <C8AD> <C8AE> <D654> <C8AF> <C8AF> <D658> <C8B0> <C8B0> <D65C> <C8B1> <C8B1> <D667> <C8B2> <C8B2> <D669> <C8B3> <C8B4> <D670> <C8B5> <C8B5> <D674> <C8B6> <C8B6> <D683> <C8B7> <C8B7> <D685> <C8B8> <C8B9> <D68C> <C8BA> <C8BA> <D690> <C8BB> <C8BB> <D694> <C8BC> <C8BC> <D69D> <C8BD> <C8BD> <D69F> <C8BE> <C8BE> <D6A1> <C8BF> <C8BF> <D6A8> <C8C0> <C8C0> <D6AC> <C8C1> <C8C1> <D6B0> <C8C2> <C8C2> <D6B9> <C8C3> <C8C3> <D6BB> <C8C4> <C8C5> <D6C4> <C8C6> <C8C6> <D6C8> <C8C7> <C8C7> <D6CC> <C8C8> <C8C8> <D6D1> <C8C9> <C8C9> <D6D4> <C8CA> <C8CA> <D6D7> <C8CB> <C8CB> <D6D9> <C8CC> <C8CC> <D6E0> <C8CD> <C8CD> <D6E4> <C8CE> <C8CE> <D6E8> <C8CF> <C8CF> <D6F0> <C8D0> <C8D0> <D6F5> <C8D1> <C8D2> <D6FC> <C8D3> <C8D3> <D700> <C8D4> <C8D4> <D704> <C8D5> <C8D5> <D711> <C8D6> <C8D7> <D718> <C8D8> <C8D8> <D71C> <C8D9> <C8D9> <D720> <C8DA> <C8DB> <D728> <C8DC> <C8DC> <D72B> <C8DD> <C8DD> <D72D> <C8DE> <C8DF> <D734> <C8E0> <C8E0> <D738> <C8E1> <C8E1> <D73C> <C8E2> <C8E2> <D744> <C8E3> <C8E3> <D747> <C8E4> <C8E4> <D749> <C8E5> <C8E6> <D750> <C8E7> <C8E7> <D754> <C8E8> <C8EB> <D756> <C8EC> <C8ED> <D760> <C8EE> <C8EE> <D763> <C8EF> <C8EF> <D765> <C8F0> <C8F0> <D769> <C8F1> <C8F1> <D76C> <C8F2> <C8F2> <D770> <C8F3> <C8F3> <D774> <C8F4> <C8F5> <D77C> <C8F6> <C8F6> <D781> <C8F7> <C8F8> <D788> <C8F9> <C8F9> <D78C> <C8FA> <C8FA> <D790> <C8FB> <C8FC> <D798> <C8FD> <C8FD> <D79B> <C8FE> <C8FE> <D79D> <C9A1> <C9FE> <E000> <CAA1> <CAA1> <4F3D> <CAA2> <CAA2> <4F73> <CAA3> <CAA3> <5047> <CAA4> <CAA4> <50F9> <CAA5> <CAA5> <52A0> <CAA6> <CAA6> <53EF> <CAA7> <CAA7> <5475> <CAA8> <CAA8> <54E5> <CAA9> <CAA9> <5609> <CAAA> <CAAA> <5AC1> <CAAB> <CAAB> <5BB6> <CAAC> <CAAC> <6687> <CAAD> <CAAE> <67B6> <CAAF> <CAAF> <67EF> <CAB0> <CAB0> <6B4C> <CAB1> <CAB1> <73C2> endbfrange 100 beginbfrange <CAB2> <CAB2> <75C2> <CAB3> <CAB3> <7A3C> <CAB4> <CAB4> <82DB> <CAB5> <CAB5> <8304> <CAB6> <CAB6> <8857> <CAB7> <CAB7> <8888> <CAB8> <CAB8> <8A36> <CAB9> <CAB9> <8CC8> <CABA> <CABA> <8DCF> <CABB> <CABB> <8EFB> <CABC> <CABC> <8FE6> <CABD> <CABD> <99D5> <CABE> <CABE> <523B> <CABF> <CABF> <5374> <CAC0> <CAC0> <5404> <CAC1> <CAC1> <606A> <CAC2> <CAC2> <6164> <CAC3> <CAC3> <6BBC> <CAC4> <CAC4> <73CF> <CAC5> <CAC5> <811A> <CAC6> <CAC6> <89BA> <CAC7> <CAC7> <89D2> <CAC8> <CAC8> <95A3> <CAC9> <CAC9> <4F83> <CACA> <CACA> <520A> <CACB> <CACB> <58BE> <CACC> <CACC> <5978> <CACD> <CACD> <59E6> <CACE> <CACE> <5E72> <CACF> <CACF> <5E79> <CAD0> <CAD0> <61C7> <CAD1> <CAD1> <63C0> <CAD2> <CAD2> <6746> <CAD3> <CAD3> <67EC> <CAD4> <CAD4> <687F> <CAD5> <CAD5> <6F97> <CAD6> <CAD6> <764E> <CAD7> <CAD7> <770B> <CAD8> <CAD8> <78F5> <CAD9> <CAD9> <7A08> <CADA> <CADA> <7AFF> <CADB> <CADB> <7C21> <CADC> <CADC> <809D> <CADD> <CADD> <826E> <CADE> <CADE> <8271> <CADF> <CADF> <8AEB> <CAE0> <CAE0> <9593> <CAE1> <CAE1> <4E6B> <CAE2> <CAE2> <559D> <CAE3> <CAE3> <66F7> <CAE4> <CAE4> <6E34> <CAE5> <CAE5> <78A3> <CAE6> <CAE6> <7AED> <CAE7> <CAE7> <845B> <CAE8> <CAE8> <8910> <CAE9> <CAE9> <874E> <CAEA> <CAEA> <97A8> <CAEB> <CAEB> <52D8> <CAEC> <CAEC> <574E> <CAED> <CAED> <582A> <CAEE> <CAEE> <5D4C> <CAEF> <CAEF> <611F> <CAF0> <CAF0> <61BE> <CAF1> <CAF1> <6221> <CAF2> <CAF2> <6562> <CAF3> <CAF3> <67D1> <CAF4> <CAF4> <6A44> <CAF5> <CAF5> <6E1B> <CAF6> <CAF6> <7518> <CAF7> <CAF7> <75B3> <CAF8> <CAF8> <76E3> <CAF9> <CAF9> <77B0> <CAFA> <CAFA> <7D3A> <CAFB> <CAFB> <90AF> <CAFC> <CAFD> <9451> <CAFE> <CAFE> <9F95> <CBA1> <CBA1> <5323> <CBA2> <CBA2> <5CAC> <CBA3> <CBA3> <7532> <CBA4> <CBA4> <80DB> <CBA5> <CBA5> <9240> <CBA6> <CBA6> <9598> <CBA7> <CBA7> <525B> <CBA8> <CBA8> <5808> <CBA9> <CBA9> <59DC> <CBAA> <CBAA> <5CA1> <CBAB> <CBAB> <5D17> <CBAC> <CBAC> <5EB7> <CBAD> <CBAD> <5F3A> <CBAE> <CBAE> <5F4A> <CBAF> <CBAF> <6177> <CBB0> <CBB0> <6C5F> <CBB1> <CBB1> <757A> <CBB2> <CBB2> <7586> <CBB3> <CBB3> <7CE0> <CBB4> <CBB4> <7D73> <CBB5> <CBB5> <7DB1> <CBB6> <CBB6> <7F8C> <CBB7> <CBB7> <8154> <CBB8> <CBB8> <8221> endbfrange 100 beginbfrange <CBB9> <CBB9> <8591> <CBBA> <CBBA> <8941> <CBBB> <CBBB> <8B1B> <CBBC> <CBBC> <92FC> <CBBD> <CBBD> <964D> <CBBE> <CBBE> <9C47> <CBBF> <CBBF> <4ECB> <CBC0> <CBC0> <4EF7> <CBC1> <CBC1> <500B> <CBC2> <CBC2> <51F1> <CBC3> <CBC3> <584F> <CBC4> <CBC4> <6137> <CBC5> <CBC5> <613E> <CBC6> <CBC6> <6168> <CBC7> <CBC7> <6539> <CBC8> <CBC8> <69EA> <CBC9> <CBC9> <6F11> <CBCA> <CBCA> <75A5> <CBCB> <CBCB> <7686> <CBCC> <CBCC> <76D6> <CBCD> <CBCD> <7B87> <CBCE> <CBCE> <82A5> <CBCF> <CBCF> <84CB> <CBD0> <CBD0> <F900> <CBD1> <CBD1> <93A7> <CBD2> <CBD2> <958B> <CBD3> <CBD3> <5580> <CBD4> <CBD4> <5BA2> <CBD5> <CBD5> <5751> <CBD6> <CBD6> <F901> <CBD7> <CBD7> <7CB3> <CBD8> <CBD8> <7FB9> <CBD9> <CBD9> <91B5> <CBDA> <CBDA> <5028> <CBDB> <CBDB> <53BB> <CBDC> <CBDC> <5C45> <CBDD> <CBDD> <5DE8> <CBDE> <CBDE> <62D2> <CBDF> <CBDF> <636E> <CBE0> <CBE0> <64DA> <CBE1> <CBE1> <64E7> <CBE2> <CBE2> <6E20> <CBE3> <CBE3> <70AC> <CBE4> <CBE4> <795B> <CBE5> <CBE5> <8DDD> <CBE6> <CBE6> <8E1E> <CBE7> <CBE7> <F902> <CBE8> <CBE8> <907D> <CBE9> <CBE9> <9245> <CBEA> <CBEA> <92F8> <CBEB> <CBEB> <4E7E> <CBEC> <CBEC> <4EF6> <CBED> <CBED> <5065> <CBEE> <CBEE> <5DFE> <CBEF> <CBEF> <5EFA> <CBF0> <CBF0> <6106> <CBF1> <CBF1> <6957> <CBF2> <CBF2> <8171> <CBF3> <CBF3> <8654> <CBF4> <CBF4> <8E47> <CBF5> <CBF5> <9375> <CBF6> <CBF6> <9A2B> <CBF7> <CBF7> <4E5E> <CBF8> <CBF8> <5091> <CBF9> <CBF9> <6770> <CBFA> <CBFA> <6840> <CBFB> <CBFB> <5109> <CBFC> <CBFC> <528D> <CBFD> <CBFD> <5292> <CBFE> <CBFE> <6AA2> <CCA1> <CCA1> <77BC> <CCA2> <CCA2> <9210> <CCA3> <CCA3> <9ED4> <CCA4> <CCA4> <52AB> <CCA5> <CCA5> <602F> <CCA6> <CCA6> <8FF2> <CCA7> <CCA7> <5048> <CCA8> <CCA8> <61A9> <CCA9> <CCA9> <63ED> <CCAA> <CCAA> <64CA> <CCAB> <CCAB> <683C> <CCAC> <CCAC> <6A84> <CCAD> <CCAD> <6FC0> <CCAE> <CCAE> <8188> <CCAF> <CCAF> <89A1> <CCB0> <CCB0> <9694> <CCB1> <CCB1> <5805> <CCB2> <CCB2> <727D> <CCB3> <CCB3> <72AC> <CCB4> <CCB4> <7504> <CCB5> <CCB5> <7D79> <CCB6> <CCB6> <7E6D> <CCB7> <CCB7> <80A9> <CCB8> <CCB8> <898B> <CCB9> <CCB9> <8B74> <CCBA> <CCBA> <9063> <CCBB> <CCBB> <9D51> <CCBC> <CCBC> <6289> <CCBD> <CCBD> <6C7A> <CCBE> <CCBE> <6F54> endbfrange 100 beginbfrange <CCBF> <CCBF> <7D50> <CCC0> <CCC0> <7F3A> <CCC1> <CCC1> <8A23> <CCC2> <CCC2> <517C> <CCC3> <CCC3> <614A> <CCC4> <CCC4> <7B9D> <CCC5> <CCC5> <8B19> <CCC6> <CCC6> <9257> <CCC7> <CCC7> <938C> <CCC8> <CCC8> <4EAC> <CCC9> <CCC9> <4FD3> <CCCA> <CCCA> <501E> <CCCB> <CCCB> <50BE> <CCCC> <CCCC> <5106> <CCCD> <CCCD> <52C1> <CCCE> <CCCE> <52CD> <CCCF> <CCCF> <537F> <CCD0> <CCD0> <5770> <CCD1> <CCD1> <5883> <CCD2> <CCD2> <5E9A> <CCD3> <CCD3> <5F91> <CCD4> <CCD4> <6176> <CCD5> <CCD5> <61AC> <CCD6> <CCD6> <64CE> <CCD7> <CCD7> <656C> <CCD8> <CCD8> <666F> <CCD9> <CCD9> <66BB> <CCDA> <CCDA> <66F4> <CCDB> <CCDB> <6897> <CCDC> <CCDC> <6D87> <CCDD> <CCDD> <7085> <CCDE> <CCDE> <70F1> <CCDF> <CCDF> <749F> <CCE0> <CCE0> <74A5> <CCE1> <CCE1> <74CA> <CCE2> <CCE2> <75D9> <CCE3> <CCE3> <786C> <CCE4> <CCE4> <78EC> <CCE5> <CCE5> <7ADF> <CCE6> <CCE6> <7AF6> <CCE7> <CCE7> <7D45> <CCE8> <CCE8> <7D93> <CCE9> <CCE9> <8015> <CCEA> <CCEA> <803F> <CCEB> <CCEB> <811B> <CCEC> <CCEC> <8396> <CCED> <CCED> <8B66> <CCEE> <CCEE> <8F15> <CCEF> <CCEF> <9015> <CCF0> <CCF0> <93E1> <CCF1> <CCF1> <9803> <CCF2> <CCF2> <9838> <CCF3> <CCF3> <9A5A> <CCF4> <CCF4> <9BE8> <CCF5> <CCF5> <4FC2> <CCF6> <CCF6> <5553> <CCF7> <CCF7> <583A> <CCF8> <CCF8> <5951> <CCF9> <CCF9> <5B63> <CCFA> <CCFA> <5C46> <CCFB> <CCFB> <60B8> <CCFC> <CCFC> <6212> <CCFD> <CCFD> <6842> <CCFE> <CCFE> <68B0> <CDA1> <CDA1> <68E8> <CDA2> <CDA2> <6EAA> <CDA3> <CDA3> <754C> <CDA4> <CDA4> <7678> <CDA5> <CDA5> <78CE> <CDA6> <CDA6> <7A3D> <CDA7> <CDA7> <7CFB> <CDA8> <CDA8> <7E6B> <CDA9> <CDA9> <7E7C> <CDAA> <CDAA> <8A08> <CDAB> <CDAB> <8AA1> <CDAC> <CDAC> <8C3F> <CDAD> <CDAD> <968E> <CDAE> <CDAE> <9DC4> <CDAF> <CDAF> <53E4> <CDB0> <CDB0> <53E9> <CDB1> <CDB1> <544A> <CDB2> <CDB2> <5471> <CDB3> <CDB3> <56FA> <CDB4> <CDB4> <59D1> <CDB5> <CDB5> <5B64> <CDB6> <CDB6> <5C3B> <CDB7> <CDB7> <5EAB> <CDB8> <CDB8> <62F7> <CDB9> <CDB9> <6537> <CDBA> <CDBA> <6545> <CDBB> <CDBB> <6572> <CDBC> <CDBC> <66A0> <CDBD> <CDBD> <67AF> <CDBE> <CDBE> <69C1> <CDBF> <CDBF> <6CBD> <CDC0> <CDC0> <75FC> <CDC1> <CDC1> <7690> <CDC2> <CDC2> <777E> <CDC3> <CDC3> <7A3F> <CDC4> <CDC4> <7F94> endbfrange 100 beginbfrange <CDC5> <CDC5> <8003> <CDC6> <CDC6> <80A1> <CDC7> <CDC7> <818F> <CDC8> <CDC8> <82E6> <CDC9> <CDC9> <82FD> <CDCA> <CDCA> <83F0> <CDCB> <CDCB> <85C1> <CDCC> <CDCC> <8831> <CDCD> <CDCD> <88B4> <CDCE> <CDCE> <8AA5> <CDCF> <CDCF> <F903> <CDD0> <CDD0> <8F9C> <CDD1> <CDD1> <932E> <CDD2> <CDD2> <96C7> <CDD3> <CDD3> <9867> <CDD4> <CDD4> <9AD8> <CDD5> <CDD5> <9F13> <CDD6> <CDD6> <54ED> <CDD7> <CDD7> <659B> <CDD8> <CDD8> <66F2> <CDD9> <CDD9> <688F> <CDDA> <CDDA> <7A40> <CDDB> <CDDB> <8C37> <CDDC> <CDDC> <9D60> <CDDD> <CDDD> <56F0> <CDDE> <CDDE> <5764> <CDDF> <CDDF> <5D11> <CDE0> <CDE0> <6606> <CDE1> <CDE1> <68B1> <CDE2> <CDE2> <68CD> <CDE3> <CDE3> <6EFE> <CDE4> <CDE4> <7428> <CDE5> <CDE5> <889E> <CDE6> <CDE6> <9BE4> <CDE7> <CDE7> <6C68> <CDE8> <CDE8> <F904> <CDE9> <CDE9> <9AA8> <CDEA> <CDEA> <4F9B> <CDEB> <CDEB> <516C> <CDEC> <CDEC> <5171> <CDED> <CDED> <529F> <CDEE> <CDEE> <5B54> <CDEF> <CDEF> <5DE5> <CDF0> <CDF0> <6050> <CDF1> <CDF1> <606D> <CDF2> <CDF2> <62F1> <CDF3> <CDF3> <63A7> <CDF4> <CDF4> <653B> <CDF5> <CDF5> <73D9> <CDF6> <CDF6> <7A7A> <CDF7> <CDF7> <86A3> <CDF8> <CDF8> <8CA2> <CDF9> <CDF9> <978F> <CDFA> <CDFA> <4E32> <CDFB> <CDFB> <5BE1> <CDFC> <CDFC> <6208> <CDFD> <CDFD> <679C> <CDFE> <CDFE> <74DC> <CEA1> <CEA1> <79D1> <CEA2> <CEA2> <83D3> <CEA3> <CEA3> <8A87> <CEA4> <CEA4> <8AB2> <CEA5> <CEA5> <8DE8> <CEA6> <CEA6> <904E> <CEA7> <CEA7> <934B> <CEA8> <CEA8> <9846> <CEA9> <CEA9> <5ED3> <CEAA> <CEAA> <69E8> <CEAB> <CEAB> <85FF> <CEAC> <CEAC> <90ED> <CEAD> <CEAD> <F905> <CEAE> <CEAE> <51A0> <CEAF> <CEAF> <5B98> <CEB0> <CEB0> <5BEC> <CEB1> <CEB1> <6163> <CEB2> <CEB2> <68FA> <CEB3> <CEB3> <6B3E> <CEB4> <CEB4> <704C> <CEB5> <CEB5> <742F> <CEB6> <CEB6> <74D8> <CEB7> <CEB7> <7BA1> <CEB8> <CEB8> <7F50> <CEB9> <CEB9> <83C5> <CEBA> <CEBA> <89C0> <CEBB> <CEBB> <8CAB> <CEBC> <CEBC> <95DC> <CEBD> <CEBD> <9928> <CEBE> <CEBE> <522E> <CEBF> <CEBF> <605D> <CEC0> <CEC0> <62EC> <CEC1> <CEC1> <9002> <CEC2> <CEC2> <4F8A> <CEC3> <CEC3> <5149> <CEC4> <CEC4> <5321> <CEC5> <CEC5> <58D9> <CEC6> <CEC6> <5EE3> <CEC7> <CEC7> <66E0> <CEC8> <CEC8> <6D38> <CEC9> <CEC9> <709A> <CECA> <CECA> <72C2> endbfrange 100 beginbfrange <CECB> <CECB> <73D6> <CECC> <CECC> <7B50> <CECD> <CECD> <80F1> <CECE> <CECE> <945B> <CECF> <CECF> <5366> <CED0> <CED0> <639B> <CED1> <CED1> <7F6B> <CED2> <CED2> <4E56> <CED3> <CED3> <5080> <CED4> <CED4> <584A> <CED5> <CED5> <58DE> <CED6> <CED6> <602A> <CED7> <CED7> <6127> <CED8> <CED8> <62D0> <CED9> <CED9> <69D0> <CEDA> <CEDA> <9B41> <CEDB> <CEDB> <5B8F> <CEDC> <CEDC> <7D18> <CEDD> <CEDD> <80B1> <CEDE> <CEDE> <8F5F> <CEDF> <CEDF> <4EA4> <CEE0> <CEE0> <50D1> <CEE1> <CEE1> <54AC> <CEE2> <CEE2> <55AC> <CEE3> <CEE3> <5B0C> <CEE4> <CEE4> <5DA0> <CEE5> <CEE5> <5DE7> <CEE6> <CEE6> <652A> <CEE7> <CEE7> <654E> <CEE8> <CEE8> <6821> <CEE9> <CEE9> <6A4B> <CEEA> <CEEA> <72E1> <CEEB> <CEEB> <768E> <CEEC> <CEEC> <77EF> <CEED> <CEED> <7D5E> <CEEE> <CEEE> <7FF9> <CEEF> <CEEF> <81A0> <CEF0> <CEF0> <854E> <CEF1> <CEF1> <86DF> <CEF2> <CEF2> <8F03> <CEF3> <CEF3> <8F4E> <CEF4> <CEF4> <90CA> <CEF5> <CEF5> <9903> <CEF6> <CEF6> <9A55> <CEF7> <CEF7> <9BAB> <CEF8> <CEF8> <4E18> <CEF9> <CEF9> <4E45> <CEFA> <CEFA> <4E5D> <CEFB> <CEFB> <4EC7> <CEFC> <CEFC> <4FF1> <CEFD> <CEFD> <5177> <CEFE> <CEFE> <52FE> <CFA1> <CFA1> <5340> <CFA2> <CFA2> <53E3> <CFA3> <CFA3> <53E5> <CFA4> <CFA4> <548E> <CFA5> <CFA5> <5614> <CFA6> <CFA6> <5775> <CFA7> <CFA7> <57A2> <CFA8> <CFA8> <5BC7> <CFA9> <CFA9> <5D87> <CFAA> <CFAA> <5ED0> <CFAB> <CFAB> <61FC> <CFAC> <CFAC> <62D8> <CFAD> <CFAD> <6551> <CFAE> <CFAE> <67B8> <CFAF> <CFAF> <67E9> <CFB0> <CFB0> <69CB> <CFB1> <CFB1> <6B50> <CFB2> <CFB2> <6BC6> <CFB3> <CFB3> <6BEC> <CFB4> <CFB4> <6C42> <CFB5> <CFB5> <6E9D> <CFB6> <CFB6> <7078> <CFB7> <CFB7> <72D7> <CFB8> <CFB8> <7396> <CFB9> <CFB9> <7403> <CFBA> <CFBA> <77BF> <CFBB> <CFBB> <77E9> <CFBC> <CFBC> <7A76> <CFBD> <CFBD> <7D7F> <CFBE> <CFBE> <8009> <CFBF> <CFBF> <81FC> <CFC0> <CFC0> <8205> <CFC1> <CFC1> <820A> <CFC2> <CFC2> <82DF> <CFC3> <CFC3> <8862> <CFC4> <CFC4> <8B33> <CFC5> <CFC5> <8CFC> <CFC6> <CFC6> <8EC0> <CFC7> <CFC7> <9011> <CFC8> <CFC8> <90B1> <CFC9> <CFC9> <9264> <CFCA> <CFCA> <92B6> <CFCB> <CFCB> <99D2> <CFCC> <CFCC> <9A45> <CFCD> <CFCD> <9CE9> <CFCE> <CFCE> <9DD7> <CFCF> <CFCF> <9F9C> <CFD0> <CFD0> <570B> endbfrange 100 beginbfrange <CFD1> <CFD1> <5C40> <CFD2> <CFD2> <83CA> <CFD3> <CFD3> <97A0> <CFD4> <CFD4> <97AB> <CFD5> <CFD5> <9EB4> <CFD6> <CFD6> <541B> <CFD7> <CFD7> <7A98> <CFD8> <CFD8> <7FA4> <CFD9> <CFD9> <88D9> <CFDA> <CFDA> <8ECD> <CFDB> <CFDB> <90E1> <CFDC> <CFDC> <5800> <CFDD> <CFDD> <5C48> <CFDE> <CFDE> <6398> <CFDF> <CFDF> <7A9F> <CFE0> <CFE0> <5BAE> <CFE1> <CFE1> <5F13> <CFE2> <CFE2> <7A79> <CFE3> <CFE3> <7AAE> <CFE4> <CFE4> <828E> <CFE5> <CFE5> <8EAC> <CFE6> <CFE6> <5026> <CFE7> <CFE7> <5238> <CFE8> <CFE8> <52F8> <CFE9> <CFE9> <5377> <CFEA> <CFEA> <5708> <CFEB> <CFEB> <62F3> <CFEC> <CFEC> <6372> <CFED> <CFED> <6B0A> <CFEE> <CFEE> <6DC3> <CFEF> <CFEF> <7737> <CFF0> <CFF0> <53A5> <CFF1> <CFF1> <7357> <CFF2> <CFF2> <8568> <CFF3> <CFF3> <8E76> <CFF4> <CFF4> <95D5> <CFF5> <CFF5> <673A> <CFF6> <CFF6> <6AC3> <CFF7> <CFF7> <6F70> <CFF8> <CFF8> <8A6D> <CFF9> <CFF9> <8ECC> <CFFA> <CFFA> <994B> <CFFB> <CFFB> <F906> <CFFC> <CFFC> <6677> <CFFD> <CFFD> <6B78> <CFFE> <CFFE> <8CB4> <D0A1> <D0A1> <9B3C> <D0A2> <D0A2> <F907> <D0A3> <D0A3> <53EB> <D0A4> <D0A4> <572D> <D0A5> <D0A5> <594E> <D0A6> <D0A6> <63C6> <D0A7> <D0A7> <69FB> <D0A8> <D0A8> <73EA> <D0A9> <D0A9> <7845> <D0AA> <D0AA> <7ABA> <D0AB> <D0AB> <7AC5> <D0AC> <D0AC> <7CFE> <D0AD> <D0AD> <8475> <D0AE> <D0AE> <898F> <D0AF> <D0AF> <8D73> <D0B0> <D0B0> <9035> <D0B1> <D0B1> <95A8> <D0B2> <D0B2> <52FB> <D0B3> <D0B3> <5747> <D0B4> <D0B4> <7547> <D0B5> <D0B5> <7B60> <D0B6> <D0B6> <83CC> <D0B7> <D0B7> <921E> <D0B8> <D0B8> <F908> <D0B9> <D0B9> <6A58> <D0BA> <D0BA> <514B> <D0BB> <D0BB> <524B> <D0BC> <D0BC> <5287> <D0BD> <D0BD> <621F> <D0BE> <D0BE> <68D8> <D0BF> <D0BF> <6975> <D0C0> <D0C0> <9699> <D0C1> <D0C1> <50C5> <D0C2> <D0C2> <52A4> <D0C3> <D0C3> <52E4> <D0C4> <D0C4> <61C3> <D0C5> <D0C5> <65A4> <D0C6> <D0C6> <6839> <D0C7> <D0C7> <69FF> <D0C8> <D0C8> <747E> <D0C9> <D0C9> <7B4B> <D0CA> <D0CA> <82B9> <D0CB> <D0CB> <83EB> <D0CC> <D0CC> <89B2> <D0CD> <D0CD> <8B39> <D0CE> <D0CE> <8FD1> <D0CF> <D0CF> <9949> <D0D0> <D0D0> <F909> <D0D1> <D0D1> <4ECA> <D0D2> <D0D2> <5997> <D0D3> <D0D3> <64D2> <D0D4> <D0D4> <6611> <D0D5> <D0D5> <6A8E> <D0D6> <D0D6> <7434> endbfrange 100 beginbfrange <D0D7> <D0D7> <7981> <D0D8> <D0D8> <79BD> <D0D9> <D0D9> <82A9> <D0DA> <D0DB> <887E> <D0DC> <D0DC> <895F> <D0DD> <D0DD> <F90A> <D0DE> <D0DE> <9326> <D0DF> <D0DF> <4F0B> <D0E0> <D0E0> <53CA> <D0E1> <D0E1> <6025> <D0E2> <D0E2> <6271> <D0E3> <D0E3> <6C72> <D0E4> <D0E4> <7D1A> <D0E5> <D0E5> <7D66> <D0E6> <D0E6> <4E98> <D0E7> <D0E7> <5162> <D0E8> <D0E8> <77DC> <D0E9> <D0E9> <80AF> <D0EA> <D0EA> <4F01> <D0EB> <D0EB> <4F0E> <D0EC> <D0EC> <5176> <D0ED> <D0ED> <5180> <D0EE> <D0EE> <55DC> <D0EF> <D0EF> <5668> <D0F0> <D0F0> <573B> <D0F1> <D0F1> <57FA> <D0F2> <D0F2> <57FC> <D0F3> <D0F3> <5914> <D0F4> <D0F4> <5947> <D0F5> <D0F5> <5993> <D0F6> <D0F6> <5BC4> <D0F7> <D0F7> <5C90> <D0F8> <D0F8> <5D0E> <D0F9> <D0F9> <5DF1> <D0FA> <D0FA> <5E7E> <D0FB> <D0FB> <5FCC> <D0FC> <D0FC> <6280> <D0FD> <D0FD> <65D7> <D0FE> <D0FE> <65E3> <D1A1> <D1A2> <671E> <D1A3> <D1A3> <675E> <D1A4> <D1A4> <68CB> <D1A5> <D1A5> <68C4> <D1A6> <D1A6> <6A5F> <D1A7> <D1A7> <6B3A> <D1A8> <D1A8> <6C23> <D1A9> <D1A9> <6C7D> <D1AA> <D1AA> <6C82> <D1AB> <D1AB> <6DC7> <D1AC> <D1AC> <7398> <D1AD> <D1AD> <7426> <D1AE> <D1AE> <742A> <D1AF> <D1AF> <7482> <D1B0> <D1B0> <74A3> <D1B1> <D1B1> <7578> <D1B2> <D1B2> <757F> <D1B3> <D1B3> <7881> <D1B4> <D1B4> <78EF> <D1B5> <D1B5> <7941> <D1B6> <D1B7> <7947> <D1B8> <D1B8> <797A> <D1B9> <D1B9> <7B95> <D1BA> <D1BA> <7D00> <D1BB> <D1BB> <7DBA> <D1BC> <D1BC> <7F88> <D1BD> <D1BD> <8006> <D1BE> <D1BE> <802D> <D1BF> <D1BF> <808C> <D1C0> <D1C0> <8A18> <D1C1> <D1C1> <8B4F> <D1C2> <D1C2> <8C48> <D1C3> <D1C3> <8D77> <D1C4> <D1C4> <9321> <D1C5> <D1C5> <9324> <D1C6> <D1C6> <98E2> <D1C7> <D1C7> <9951> <D1C8> <D1C9> <9A0E> <D1CA> <D1CA> <9A65> <D1CB> <D1CB> <9E92> <D1CC> <D1CC> <7DCA> <D1CD> <D1CD> <4F76> <D1CE> <D1CE> <5409> <D1CF> <D1CF> <62EE> <D1D0> <D1D0> <6854> <D1D1> <D1D1> <91D1> <D1D2> <D1D2> <55AB> <D1D3> <D1D3> <513A> <D1D4> <D1D5> <F90B> <D1D6> <D1D6> <5A1C> <D1D7> <D1D7> <61E6> <D1D8> <D1D8> <F90D> <D1D9> <D1D9> <62CF> <D1DA> <D1DA> <62FF> <D1DB> <D1E0> <F90E> <D1E1> <D1E1> <90A3> <D1E2> <D1E6> <F914> <D1E7> <D1E7> <8AFE> <D1E8> <D1EB> <F919> <D1EC> <D1EC> <6696> <D1ED> <D1ED> <F91D> endbfrange 100 beginbfrange <D1EE> <D1EE> <7156> <D1EF> <D1F0> <F91E> <D1F1> <D1F1> <96E3> <D1F2> <D1F2> <F920> <D1F3> <D1F3> <634F> <D1F4> <D1F4> <637A> <D1F5> <D1F5> <5357> <D1F6> <D1F6> <F921> <D1F7> <D1F7> <678F> <D1F8> <D1F8> <6960> <D1F9> <D1F9> <6E73> <D1FA> <D1FA> <F922> <D1FB> <D1FB> <7537> <D1FC> <D1FE> <F923> <D2A1> <D2A1> <7D0D> <D2A2> <D2A3> <F926> <D2A4> <D2A4> <8872> <D2A5> <D2A5> <56CA> <D2A6> <D2A6> <5A18> <D2A7> <D2AB> <F928> <D2AC> <D2AC> <4E43> <D2AD> <D2AD> <F92D> <D2AE> <D2AE> <5167> <D2AF> <D2AF> <5948> <D2B0> <D2B0> <67F0> <D2B1> <D2B1> <8010> <D2B2> <D2B2> <F92E> <D2B3> <D2B3> <5973> <D2B4> <D2B4> <5E74> <D2B5> <D2B5> <649A> <D2B6> <D2B6> <79CA> <D2B7> <D2B7> <5FF5> <D2B8> <D2B8> <606C> <D2B9> <D2B9> <62C8> <D2BA> <D2BA> <637B> <D2BB> <D2BB> <5BE7> <D2BC> <D2BC> <5BD7> <D2BD> <D2BD> <52AA> <D2BE> <D2BE> <F92F> <D2BF> <D2BF> <5974> <D2C0> <D2C0> <5F29> <D2C1> <D2C1> <6012> <D2C2> <D2C4> <F930> <D2C5> <D2C5> <7459> <D2C6> <D2CB> <F933> <D2CC> <D2CC> <99D1> <D2CD> <D2D7> <F939> <D2D8> <D2D8> <6FC3> <D2D9> <D2DA> <F944> <D2DB> <D2DB> <81BF> <D2DC> <D2DC> <8FB2> <D2DD> <D2DD> <60F1> <D2DE> <D2DF> <F946> <D2E0> <D2E0> <8166> <D2E1> <D2E2> <F948> <D2E3> <D2E3> <5C3F> <D2E4> <D2EB> <F94A> <D2EC> <D2EC> <5AE9> <D2ED> <D2ED> <8A25> <D2EE> <D2EE> <677B> <D2EF> <D2EF> <7D10> <D2F0> <D2F5> <F952> <D2F6> <D2F6> <80FD> <D2F7> <D2F8> <F958> <D2F9> <D2F9> <5C3C> <D2FA> <D2FA> <6CE5> <D2FB> <D2FB> <533F> <D2FC> <D2FC> <6EBA> <D2FD> <D2FD> <591A> <D2FE> <D2FE> <8336> <D3A1> <D3A1> <4E39> <D3A2> <D3A2> <4EB6> <D3A3> <D3A3> <4F46> <D3A4> <D3A4> <55AE> <D3A5> <D3A5> <5718> <D3A6> <D3A6> <58C7> <D3A7> <D3A7> <5F56> <D3A8> <D3A8> <65B7> <D3A9> <D3A9> <65E6> <D3AA> <D3AA> <6A80> <D3AB> <D3AB> <6BB5> <D3AC> <D3AC> <6E4D> <D3AD> <D3AD> <77ED> <D3AE> <D3AE> <7AEF> <D3AF> <D3AF> <7C1E> <D3B0> <D3B0> <7DDE> <D3B1> <D3B1> <86CB> <D3B2> <D3B2> <8892> <D3B3> <D3B3> <9132> <D3B4> <D3B4> <935B> <D3B5> <D3B5> <64BB> <D3B6> <D3B6> <6FBE> <D3B7> <D3B7> <737A> <D3B8> <D3B8> <75B8> <D3B9> <D3B9> <9054> <D3BA> <D3BA> <5556> <D3BB> <D3BB> <574D> <D3BC> <D3BC> <61BA> <D3BD> <D3BD> <64D4> <D3BE> <D3BE> <66C7> endbfrange 100 beginbfrange <D3BF> <D3BF> <6DE1> <D3C0> <D3C0> <6E5B> <D3C1> <D3C1> <6F6D> <D3C2> <D3C2> <6FB9> <D3C3> <D3C3> <75F0> <D3C4> <D3C4> <8043> <D3C5> <D3C5> <81BD> <D3C6> <D3C6> <8541> <D3C7> <D3C7> <8983> <D3C8> <D3C8> <8AC7> <D3C9> <D3C9> <8B5A> <D3CA> <D3CA> <931F> <D3CB> <D3CB> <6C93> <D3CC> <D3CC> <7553> <D3CD> <D3CD> <7B54> <D3CE> <D3CE> <8E0F> <D3CF> <D3CF> <905D> <D3D0> <D3D0> <5510> <D3D1> <D3D1> <5802> <D3D2> <D3D2> <5858> <D3D3> <D3D3> <5E62> <D3D4> <D3D4> <6207> <D3D5> <D3D5> <649E> <D3D6> <D3D6> <68E0> <D3D7> <D3D7> <7576> <D3D8> <D3D8> <7CD6> <D3D9> <D3D9> <87B3> <D3DA> <D3DA> <9EE8> <D3DB> <D3DB> <4EE3> <D3DC> <D3DC> <5788> <D3DD> <D3DD> <576E> <D3DE> <D3DE> <5927> <D3DF> <D3DF> <5C0D> <D3E0> <D3E0> <5CB1> <D3E1> <D3E1> <5E36> <D3E2> <D3E2> <5F85> <D3E3> <D3E3> <6234> <D3E4> <D3E4> <64E1> <D3E5> <D3E5> <73B3> <D3E6> <D3E6> <81FA> <D3E7> <D3E7> <888B> <D3E8> <D3E8> <8CB8> <D3E9> <D3E9> <968A> <D3EA> <D3EA> <9EDB> <D3EB> <D3EB> <5B85> <D3EC> <D3EC> <5FB7> <D3ED> <D3ED> <60B3> <D3EE> <D3EE> <5012> <D3EF> <D3EF> <5200> <D3F0> <D3F0> <5230> <D3F1> <D3F1> <5716> <D3F2> <D3F2> <5835> <D3F3> <D3F3> <5857> <D3F4> <D3F4> <5C0E> <D3F5> <D3F5> <5C60> <D3F6> <D3F6> <5CF6> <D3F7> <D3F7> <5D8B> <D3F8> <D3F8> <5EA6> <D3F9> <D3F9> <5F92> <D3FA> <D3FA> <60BC> <D3FB> <D3FB> <6311> <D3FC> <D3FC> <6389> <D3FD> <D3FD> <6417> <D3FE> <D3FE> <6843> <D4A1> <D4A1> <68F9> <D4A2> <D4A2> <6AC2> <D4A3> <D4A3> <6DD8> <D4A4> <D4A4> <6E21> <D4A5> <D4A5> <6ED4> <D4A6> <D4A6> <6FE4> <D4A7> <D4A7> <71FE> <D4A8> <D4A8> <76DC> <D4A9> <D4A9> <7779> <D4AA> <D4AA> <79B1> <D4AB> <D4AB> <7A3B> <D4AC> <D4AC> <8404> <D4AD> <D4AD> <89A9> <D4AE> <D4AE> <8CED> <D4AF> <D4AF> <8DF3> <D4B0> <D4B0> <8E48> <D4B1> <D4B1> <9003> <D4B2> <D4B2> <9014> <D4B3> <D4B3> <9053> <D4B4> <D4B4> <90FD> <D4B5> <D4B5> <934D> <D4B6> <D4B6> <9676> <D4B7> <D4B7> <97DC> <D4B8> <D4B8> <6BD2> <D4B9> <D4B9> <7006> <D4BA> <D4BA> <7258> <D4BB> <D4BB> <72A2> <D4BC> <D4BC> <7368> <D4BD> <D4BD> <7763> <D4BE> <D4BE> <79BF> <D4BF> <D4BF> <7BE4> <D4C0> <D4C0> <7E9B> <D4C1> <D4C1> <8B80> <D4C2> <D4C2> <58A9> <D4C3> <D4C3> <60C7> <D4C4> <D4C4> <6566> endbfrange 100 beginbfrange <D4C5> <D4C5> <65FD> <D4C6> <D4C6> <66BE> <D4C7> <D4C7> <6C8C> <D4C8> <D4C8> <711E> <D4C9> <D4C9> <71C9> <D4CA> <D4CA> <8C5A> <D4CB> <D4CB> <9813> <D4CC> <D4CC> <4E6D> <D4CD> <D4CD> <7A81> <D4CE> <D4CE> <4EDD> <D4CF> <D4CF> <51AC> <D4D0> <D4D0> <51CD> <D4D1> <D4D1> <52D5> <D4D2> <D4D2> <540C> <D4D3> <D4D3> <61A7> <D4D4> <D4D4> <6771> <D4D5> <D4D5> <6850> <D4D6> <D4D6> <68DF> <D4D7> <D4D7> <6D1E> <D4D8> <D4D8> <6F7C> <D4D9> <D4D9> <75BC> <D4DA> <D4DA> <77B3> <D4DB> <D4DB> <7AE5> <D4DC> <D4DC> <80F4> <D4DD> <D4DD> <8463> <D4DE> <D4DE> <9285> <D4DF> <D4DF> <515C> <D4E0> <D4E0> <6597> <D4E1> <D4E1> <675C> <D4E2> <D4E2> <6793> <D4E3> <D4E3> <75D8> <D4E4> <D4E4> <7AC7> <D4E5> <D4E5> <8373> <D4E6> <D4E6> <F95A> <D4E7> <D4E7> <8C46> <D4E8> <D4E8> <9017> <D4E9> <D4E9> <982D> <D4EA> <D4EA> <5C6F> <D4EB> <D4EB> <81C0> <D4EC> <D4EC> <829A> <D4ED> <D4ED> <9041> <D4EE> <D4EE> <906F> <D4EF> <D4EF> <920D> <D4F0> <D4F0> <5F97> <D4F1> <D4F1> <5D9D> <D4F2> <D4F2> <6A59> <D4F3> <D4F3> <71C8> <D4F4> <D4F4> <767B> <D4F5> <D4F5> <7B49> <D4F6> <D4F6> <85E4> <D4F7> <D4F7> <8B04> <D4F8> <D4F8> <9127> <D4F9> <D4F9> <9A30> <D4FA> <D4FA> <5587> <D4FB> <D4FB> <61F6> <D4FC> <D4FC> <F95B> <D4FD> <D4FD> <7669> <D4FE> <D4FE> <7F85> <D5A1> <D5A1> <863F> <D5A2> <D5A2> <87BA> <D5A3> <D5A3> <88F8> <D5A4> <D5A4> <908F> <D5A5> <D5A5> <F95C> <D5A6> <D5A6> <6D1B> <D5A7> <D5A7> <70D9> <D5A8> <D5A8> <73DE> <D5A9> <D5A9> <7D61> <D5AA> <D5AA> <843D> <D5AB> <D5AB> <F95D> <D5AC> <D5AC> <916A> <D5AD> <D5AD> <99F1> <D5AE> <D5AE> <F95E> <D5AF> <D5AF> <4E82> <D5B0> <D5B0> <5375> <D5B1> <D5B1> <6B04> <D5B2> <D5B2> <6B12> <D5B3> <D5B3> <703E> <D5B4> <D5B4> <721B> <D5B5> <D5B5> <862D> <D5B6> <D5B6> <9E1E> <D5B7> <D5B7> <524C> <D5B8> <D5B8> <8FA3> <D5B9> <D5B9> <5D50> <D5BA> <D5BA> <64E5> <D5BB> <D5BB> <652C> <D5BC> <D5BC> <6B16> <D5BD> <D5BD> <6FEB> <D5BE> <D5BE> <7C43> <D5BF> <D5BF> <7E9C> <D5C0> <D5C0> <85CD> <D5C1> <D5C1> <8964> <D5C2> <D5C2> <89BD> <D5C3> <D5C3> <62C9> <D5C4> <D5C4> <81D8> <D5C5> <D5C5> <881F> <D5C6> <D5C6> <5ECA> <D5C7> <D5C7> <6717> <D5C8> <D5C8> <6D6A> <D5C9> <D5C9> <72FC> <D5CA> <D5CA> <7405> endbfrange 100 beginbfrange <D5CB> <D5CB> <746F> <D5CC> <D5CC> <8782> <D5CD> <D5CD> <90DE> <D5CE> <D5CE> <4F86> <D5CF> <D5CF> <5D0D> <D5D0> <D5D0> <5FA0> <D5D1> <D5D1> <840A> <D5D2> <D5D2> <51B7> <D5D3> <D5D3> <63A0> <D5D4> <D5D4> <7565> <D5D5> <D5D5> <4EAE> <D5D6> <D5D6> <5006> <D5D7> <D5D7> <5169> <D5D8> <D5D8> <51C9> <D5D9> <D5D9> <6881> <D5DA> <D5DA> <6A11> <D5DB> <D5DB> <7CAE> <D5DC> <D5DC> <7CB1> <D5DD> <D5DD> <7CE7> <D5DE> <D5DE> <826F> <D5DF> <D5DF> <8AD2> <D5E0> <D5E0> <8F1B> <D5E1> <D5E1> <91CF> <D5E2> <D5E2> <4FB6> <D5E3> <D5E3> <5137> <D5E4> <D5E4> <52F5> <D5E5> <D5E5> <5442> <D5E6> <D5E6> <5EEC> <D5E7> <D5E7> <616E> <D5E8> <D5E8> <623E> <D5E9> <D5E9> <65C5> <D5EA> <D5EA> <6ADA> <D5EB> <D5EB> <6FFE> <D5EC> <D5EC> <792A> <D5ED> <D5ED> <85DC> <D5EE> <D5EE> <8823> <D5EF> <D5EF> <95AD> <D5F0> <D5F0> <9A62> <D5F1> <D5F1> <9A6A> <D5F2> <D5F2> <9E97> <D5F3> <D5F3> <9ECE> <D5F4> <D5F4> <529B> <D5F5> <D5F5> <66C6> <D5F6> <D5F6> <6B77> <D5F7> <D5F7> <701D> <D5F8> <D5F8> <792B> <D5F9> <D5F9> <8F62> <D5FA> <D5FA> <9742> <D5FB> <D5FB> <6190> <D5FC> <D5FC> <6200> <D5FD> <D5FD> <6523> <D5FE> <D5FE> <6F23> <D6A1> <D6A1> <7149> <D6A2> <D6A2> <7489> <D6A3> <D6A3> <7DF4> <D6A4> <D6A4> <806F> <D6A5> <D6A5> <84EE> <D6A6> <D6A6> <8F26> <D6A7> <D6A7> <9023> <D6A8> <D6A8> <934A> <D6A9> <D6A9> <51BD> <D6AA> <D6AA> <5217> <D6AB> <D6AB> <52A3> <D6AC> <D6AC> <6D0C> <D6AD> <D6AD> <70C8> <D6AE> <D6AE> <88C2> <D6AF> <D6AF> <5EC9> <D6B0> <D6B0> <6582> <D6B1> <D6B1> <6BAE> <D6B2> <D6B2> <6FC2> <D6B3> <D6B3> <7C3E> <D6B4> <D6B4> <7375> <D6B5> <D6B5> <4EE4> <D6B6> <D6B6> <4F36> <D6B7> <D6B7> <56F9> <D6B8> <D6B8> <F95F> <D6B9> <D6B9> <5CBA> <D6BA> <D6BA> <5DBA> <D6BB> <D6BB> <601C> <D6BC> <D6BC> <73B2> <D6BD> <D6BD> <7B2D> <D6BE> <D6BE> <7F9A> <D6BF> <D6BF> <7FCE> <D6C0> <D6C0> <8046> <D6C1> <D6C1> <901E> <D6C2> <D6C2> <9234> <D6C3> <D6C3> <96F6> <D6C4> <D6C4> <9748> <D6C5> <D6C5> <9818> <D6C6> <D6C6> <9F61> <D6C7> <D6C7> <4F8B> <D6C8> <D6C8> <6FA7> <D6C9> <D6C9> <79AE> <D6CA> <D6CA> <91B4> <D6CB> <D6CB> <96B7> <D6CC> <D6CC> <52DE> <D6CD> <D6CD> <F960> <D6CE> <D6CE> <6488> <D6CF> <D6CF> <64C4> <D6D0> <D6D0> <6AD3> endbfrange 100 beginbfrange <D6D1> <D6D1> <6F5E> <D6D2> <D6D2> <7018> <D6D3> <D6D3> <7210> <D6D4> <D6D4> <76E7> <D6D5> <D6D5> <8001> <D6D6> <D6D6> <8606> <D6D7> <D6D7> <865C> <D6D8> <D6D8> <8DEF> <D6D9> <D6D9> <8F05> <D6DA> <D6DA> <9732> <D6DB> <D6DB> <9B6F> <D6DC> <D6DC> <9DFA> <D6DD> <D6DD> <9E75> <D6DE> <D6DE> <788C> <D6DF> <D6DF> <797F> <D6E0> <D6E0> <7DA0> <D6E1> <D6E1> <83C9> <D6E2> <D6E2> <9304> <D6E3> <D6E3> <9E7F> <D6E4> <D6E4> <9E93> <D6E5> <D6E5> <8AD6> <D6E6> <D6E6> <58DF> <D6E7> <D6E7> <5F04> <D6E8> <D6E8> <6727> <D6E9> <D6E9> <7027> <D6EA> <D6EA> <74CF> <D6EB> <D6EB> <7C60> <D6EC> <D6EC> <807E> <D6ED> <D6ED> <5121> <D6EE> <D6EE> <7028> <D6EF> <D6EF> <7262> <D6F0> <D6F0> <78CA> <D6F1> <D6F1> <8CC2> <D6F2> <D6F2> <8CDA> <D6F3> <D6F3> <8CF4> <D6F4> <D6F4> <96F7> <D6F5> <D6F5> <4E86> <D6F6> <D6F6> <50DA> <D6F7> <D6F7> <5BEE> <D6F8> <D6F8> <5ED6> <D6F9> <D6F9> <6599> <D6FA> <D6FA> <71CE> <D6FB> <D6FB> <7642> <D6FC> <D6FC> <77AD> <D6FD> <D6FD> <804A> <D6FE> <D6FE> <84FC> <D7A1> <D7A1> <907C> <D7A2> <D7A2> <9B27> <D7A3> <D7A3> <9F8D> <D7A4> <D7A4> <58D8> <D7A5> <D7A5> <5A41> <D7A6> <D7A6> <5C62> <D7A7> <D7A7> <6A13> <D7A8> <D7A8> <6DDA> <D7A9> <D7A9> <6F0F> <D7AA> <D7AA> <763B> <D7AB> <D7AB> <7D2F> <D7AC> <D7AC> <7E37> <D7AD> <D7AD> <851E> <D7AE> <D7AE> <8938> <D7AF> <D7AF> <93E4> <D7B0> <D7B0> <964B> <D7B1> <D7B1> <5289> <D7B2> <D7B2> <65D2> <D7B3> <D7B3> <67F3> <D7B4> <D7B4> <69B4> <D7B5> <D7B5> <6D41> <D7B6> <D7B6> <6E9C> <D7B7> <D7B7> <700F> <D7B8> <D7B8> <7409> <D7B9> <D7B9> <7460> <D7BA> <D7BA> <7559> <D7BB> <D7BB> <7624> <D7BC> <D7BC> <786B> <D7BD> <D7BD> <8B2C> <D7BE> <D7BE> <985E> <D7BF> <D7BF> <516D> <D7C0> <D7C0> <622E> <D7C1> <D7C1> <9678> <D7C2> <D7C2> <4F96> <D7C3> <D7C3> <502B> <D7C4> <D7C4> <5D19> <D7C5> <D7C5> <6DEA> <D7C6> <D7C6> <7DB8> <D7C7> <D7C7> <8F2A> <D7C8> <D7C8> <5F8B> <D7C9> <D7C9> <6144> <D7CA> <D7CA> <6817> <D7CB> <D7CB> <F961> <D7CC> <D7CC> <9686> <D7CD> <D7CD> <52D2> <D7CE> <D7CE> <808B> <D7CF> <D7CF> <51DC> <D7D0> <D7D0> <51CC> <D7D1> <D7D1> <695E> <D7D2> <D7D2> <7A1C> <D7D3> <D7D3> <7DBE> <D7D4> <D7D4> <83F1> <D7D5> <D7D5> <9675> <D7D6> <D7D6> <4FDA> endbfrange 100 beginbfrange <D7D7> <D7D7> <5229> <D7D8> <D7D8> <5398> <D7D9> <D7D9> <540F> <D7DA> <D7DA> <550E> <D7DB> <D7DB> <5C65> <D7DC> <D7DC> <60A7> <D7DD> <D7DD> <674E> <D7DE> <D7DE> <68A8> <D7DF> <D7DF> <6D6C> <D7E0> <D7E0> <7281> <D7E1> <D7E1> <72F8> <D7E2> <D7E2> <7406> <D7E3> <D7E3> <7483> <D7E4> <D7E4> <F962> <D7E5> <D7E5> <75E2> <D7E6> <D7E6> <7C6C> <D7E7> <D7E7> <7F79> <D7E8> <D7E8> <7FB8> <D7E9> <D7E9> <8389> <D7EA> <D7EA> <88CF> <D7EB> <D7EB> <88E1> <D7EC> <D7EC> <91CC> <D7ED> <D7ED> <91D0> <D7EE> <D7EE> <96E2> <D7EF> <D7EF> <9BC9> <D7F0> <D7F0> <541D> <D7F1> <D7F1> <6F7E> <D7F2> <D7F2> <71D0> <D7F3> <D7F3> <7498> <D7F4> <D7F4> <85FA> <D7F5> <D7F5> <8EAA> <D7F6> <D7F6> <96A3> <D7F7> <D7F7> <9C57> <D7F8> <D7F8> <9E9F> <D7F9> <D7F9> <6797> <D7FA> <D7FA> <6DCB> <D7FB> <D7FB> <7433> <D7FC> <D7FC> <81E8> <D7FD> <D7FD> <9716> <D7FE> <D7FE> <782C> <D8A1> <D8A1> <7ACB> <D8A2> <D8A2> <7B20> <D8A3> <D8A3> <7C92> <D8A4> <D8A4> <6469> <D8A5> <D8A5> <746A> <D8A6> <D8A6> <75F2> <D8A7> <D8A7> <78BC> <D8A8> <D8A8> <78E8> <D8A9> <D8A9> <99AC> <D8AA> <D8AA> <9B54> <D8AB> <D8AB> <9EBB> <D8AC> <D8AC> <5BDE> <D8AD> <D8AD> <5E55> <D8AE> <D8AE> <6F20> <D8AF> <D8AF> <819C> <D8B0> <D8B0> <83AB> <D8B1> <D8B1> <9088> <D8B2> <D8B2> <4E07> <D8B3> <D8B3> <534D> <D8B4> <D8B4> <5A29> <D8B5> <D8B5> <5DD2> <D8B6> <D8B6> <5F4E> <D8B7> <D8B7> <6162> <D8B8> <D8B8> <633D> <D8B9> <D8B9> <6669> <D8BA> <D8BA> <66FC> <D8BB> <D8BB> <6EFF> <D8BC> <D8BC> <6F2B> <D8BD> <D8BD> <7063> <D8BE> <D8BE> <779E> <D8BF> <D8BF> <842C> <D8C0> <D8C0> <8513> <D8C1> <D8C1> <883B> <D8C2> <D8C2> <8F13> <D8C3> <D8C3> <9945> <D8C4> <D8C4> <9C3B> <D8C5> <D8C5> <551C> <D8C6> <D8C6> <62B9> <D8C7> <D8C7> <672B> <D8C8> <D8C8> <6CAB> <D8C9> <D8C9> <8309> <D8CA> <D8CA> <896A> <D8CB> <D8CB> <977A> <D8CC> <D8CC> <4EA1> <D8CD> <D8CD> <5984> <D8CE> <D8CF> <5FD8> <D8D0> <D8D0> <671B> <D8D1> <D8D1> <7DB2> <D8D2> <D8D2> <7F54> <D8D3> <D8D3> <8292> <D8D4> <D8D4> <832B> <D8D5> <D8D5> <83BD> <D8D6> <D8D6> <8F1E> <D8D7> <D8D7> <9099> <D8D8> <D8D8> <57CB> <D8D9> <D8D9> <59B9> <D8DA> <D8DA> <5A92> <D8DB> <D8DB> <5BD0> <D8DC> <D8DC> <6627> <D8DD> <D8DD> <679A> endbfrange 100 beginbfrange <D8DE> <D8DE> <6885> <D8DF> <D8DF> <6BCF> <D8E0> <D8E0> <7164> <D8E1> <D8E1> <7F75> <D8E2> <D8E2> <8CB7> <D8E3> <D8E3> <8CE3> <D8E4> <D8E4> <9081> <D8E5> <D8E5> <9B45> <D8E6> <D8E6> <8108> <D8E7> <D8E7> <8C8A> <D8E8> <D8E8> <964C> <D8E9> <D8E9> <9A40> <D8EA> <D8EA> <9EA5> <D8EB> <D8EB> <5B5F> <D8EC> <D8EC> <6C13> <D8ED> <D8ED> <731B> <D8EE> <D8EE> <76F2> <D8EF> <D8EF> <76DF> <D8F0> <D8F0> <840C> <D8F1> <D8F1> <51AA> <D8F2> <D8F2> <8993> <D8F3> <D8F3> <514D> <D8F4> <D8F4> <5195> <D8F5> <D8F5> <52C9> <D8F6> <D8F6> <68C9> <D8F7> <D8F7> <6C94> <D8F8> <D8F8> <7704> <D8F9> <D8F9> <7720> <D8FA> <D8FA> <7DBF> <D8FB> <D8FB> <7DEC> <D8FC> <D8FC> <9762> <D8FD> <D8FD> <9EB5> <D8FE> <D8FE> <6EC5> <D9A1> <D9A1> <8511> <D9A2> <D9A2> <51A5> <D9A3> <D9A3> <540D> <D9A4> <D9A4> <547D> <D9A5> <D9A5> <660E> <D9A6> <D9A6> <669D> <D9A7> <D9A7> <6927> <D9A8> <D9A8> <6E9F> <D9A9> <D9A9> <76BF> <D9AA> <D9AA> <7791> <D9AB> <D9AB> <8317> <D9AC> <D9AC> <84C2> <D9AD> <D9AD> <879F> <D9AE> <D9AE> <9169> <D9AF> <D9AF> <9298> <D9B0> <D9B0> <9CF4> <D9B1> <D9B1> <8882> <D9B2> <D9B2> <4FAE> <D9B3> <D9B3> <5192> <D9B4> <D9B4> <52DF> <D9B5> <D9B5> <59C6> <D9B6> <D9B6> <5E3D> <D9B7> <D9B7> <6155> <D9B8> <D9B9> <6478> <D9BA> <D9BA> <66AE> <D9BB> <D9BB> <67D0> <D9BC> <D9BC> <6A21> <D9BD> <D9BD> <6BCD> <D9BE> <D9BE> <6BDB> <D9BF> <D9BF> <725F> <D9C0> <D9C0> <7261> <D9C1> <D9C1> <7441> <D9C2> <D9C2> <7738> <D9C3> <D9C3> <77DB> <D9C4> <D9C4> <8017> <D9C5> <D9C5> <82BC> <D9C6> <D9C6> <8305> <D9C7> <D9C7> <8B00> <D9C8> <D9C8> <8B28> <D9C9> <D9C9> <8C8C> <D9CA> <D9CA> <6728> <D9CB> <D9CB> <6C90> <D9CC> <D9CC> <7267> <D9CD> <D9CD> <76EE> <D9CE> <D9CE> <7766> <D9CF> <D9CF> <7A46> <D9D0> <D9D0> <9DA9> <D9D1> <D9D1> <6B7F> <D9D2> <D9D2> <6C92> <D9D3> <D9D3> <5922> <D9D4> <D9D4> <6726> <D9D5> <D9D5> <8499> <D9D6> <D9D6> <536F> <D9D7> <D9D7> <5893> <D9D8> <D9D8> <5999> <D9D9> <D9D9> <5EDF> <D9DA> <D9DA> <63CF> <D9DB> <D9DB> <6634> <D9DC> <D9DC> <6773> <D9DD> <D9DD> <6E3A> <D9DE> <D9DE> <732B> <D9DF> <D9DF> <7AD7> <D9E0> <D9E0> <82D7> <D9E1> <D9E1> <9328> <D9E2> <D9E2> <52D9> <D9E3> <D9E3> <5DEB> <D9E4> <D9E4> <61AE> endbfrange 100 beginbfrange <D9E5> <D9E5> <61CB> <D9E6> <D9E6> <620A> <D9E7> <D9E7> <62C7> <D9E8> <D9E8> <64AB> <D9E9> <D9E9> <65E0> <D9EA> <D9EA> <6959> <D9EB> <D9EB> <6B66> <D9EC> <D9EC> <6BCB> <D9ED> <D9ED> <7121> <D9EE> <D9EE> <73F7> <D9EF> <D9EF> <755D> <D9F0> <D9F0> <7E46> <D9F1> <D9F1> <821E> <D9F2> <D9F2> <8302> <D9F3> <D9F3> <856A> <D9F4> <D9F4> <8AA3> <D9F5> <D9F5> <8CBF> <D9F6> <D9F6> <9727> <D9F7> <D9F7> <9D61> <D9F8> <D9F8> <58A8> <D9F9> <D9F9> <9ED8> <D9FA> <D9FA> <5011> <D9FB> <D9FB> <520E> <D9FC> <D9FC> <543B> <D9FD> <D9FD> <554F> <D9FE> <D9FE> <6587> <DAA1> <DAA1> <6C76> <DAA2> <DAA3> <7D0A> <DAA4> <DAA4> <805E> <DAA5> <DAA5> <868A> <DAA6> <DAA6> <9580> <DAA7> <DAA7> <96EF> <DAA8> <DAA8> <52FF> <DAA9> <DAA9> <6C95> <DAAA> <DAAA> <7269> <DAAB> <DAAB> <5473> <DAAC> <DAAC> <5A9A> <DAAD> <DAAD> <5C3E> <DAAE> <DAAE> <5D4B> <DAAF> <DAAF> <5F4C> <DAB0> <DAB0> <5FAE> <DAB1> <DAB1> <672A> <DAB2> <DAB2> <68B6> <DAB3> <DAB3> <6963> <DAB4> <DAB4> <6E3C> <DAB5> <DAB5> <6E44> <DAB6> <DAB6> <7709> <DAB7> <DAB7> <7C73> <DAB8> <DAB8> <7F8E> <DAB9> <DAB9> <8587> <DABA> <DABA> <8B0E> <DABB> <DABB> <8FF7> <DABC> <DABC> <9761> <DABD> <DABD> <9EF4> <DABE> <DABE> <5CB7> <DABF> <DABF> <60B6> <DAC0> <DAC0> <610D> <DAC1> <DAC1> <61AB> <DAC2> <DAC2> <654F> <DAC3> <DAC4> <65FB> <DAC5> <DAC5> <6C11> <DAC6> <DAC6> <6CEF> <DAC7> <DAC7> <739F> <DAC8> <DAC8> <73C9> <DAC9> <DAC9> <7DE1> <DACA> <DACA> <9594> <DACB> <DACB> <5BC6> <DACC> <DACC> <871C> <DACD> <DACD> <8B10> <DACE> <DACE> <525D> <DACF> <DACF> <535A> <DAD0> <DAD0> <62CD> <DAD1> <DAD1> <640F> <DAD2> <DAD2> <64B2> <DAD3> <DAD3> <6734> <DAD4> <DAD4> <6A38> <DAD5> <DAD5> <6CCA> <DAD6> <DAD6> <73C0> <DAD7> <DAD7> <749E> <DAD8> <DAD8> <7B94> <DAD9> <DAD9> <7C95> <DADA> <DADA> <7E1B> <DADB> <DADB> <818A> <DADC> <DADC> <8236> <DADD> <DADD> <8584> <DADE> <DADE> <8FEB> <DADF> <DADF> <96F9> <DAE0> <DAE0> <99C1> <DAE1> <DAE1> <4F34> <DAE2> <DAE2> <534A> <DAE3> <DAE3> <53CD> <DAE4> <DAE4> <53DB> <DAE5> <DAE5> <62CC> <DAE6> <DAE6> <642C> <DAE7> <DAE7> <6500> <DAE8> <DAE8> <6591> <DAE9> <DAE9> <69C3> <DAEA> <DAEA> <6CEE> <DAEB> <DAEB> <6F58> <DAEC> <DAEC> <73ED> endbfrange 100 beginbfrange <DAED> <DAED> <7554> <DAEE> <DAEE> <7622> <DAEF> <DAEF> <76E4> <DAF0> <DAF0> <76FC> <DAF1> <DAF1> <78D0> <DAF2> <DAF2> <78FB> <DAF3> <DAF3> <792C> <DAF4> <DAF4> <7D46> <DAF5> <DAF5> <822C> <DAF6> <DAF6> <87E0> <DAF7> <DAF7> <8FD4> <DAF8> <DAF8> <9812> <DAF9> <DAF9> <98EF> <DAFA> <DAFA> <52C3> <DAFB> <DAFB> <62D4> <DAFC> <DAFC> <64A5> <DAFD> <DAFD> <6E24> <DAFE> <DAFE> <6F51> <DBA1> <DBA1> <767C> <DBA2> <DBA2> <8DCB> <DBA3> <DBA3> <91B1> <DBA4> <DBA4> <9262> <DBA5> <DBA5> <9AEE> <DBA6> <DBA6> <9B43> <DBA7> <DBA7> <5023> <DBA8> <DBA8> <508D> <DBA9> <DBA9> <574A> <DBAA> <DBAA> <59A8> <DBAB> <DBAB> <5C28> <DBAC> <DBAC> <5E47> <DBAD> <DBAD> <5F77> <DBAE> <DBAE> <623F> <DBAF> <DBAF> <653E> <DBB0> <DBB0> <65B9> <DBB1> <DBB1> <65C1> <DBB2> <DBB2> <6609> <DBB3> <DBB3> <678B> <DBB4> <DBB4> <699C> <DBB5> <DBB5> <6EC2> <DBB6> <DBB6> <78C5> <DBB7> <DBB7> <7D21> <DBB8> <DBB8> <80AA> <DBB9> <DBB9> <8180> <DBBA> <DBBA> <822B> <DBBB> <DBBB> <82B3> <DBBC> <DBBC> <84A1> <DBBD> <DBBD> <868C> <DBBE> <DBBE> <8A2A> <DBBF> <DBBF> <8B17> <DBC0> <DBC0> <90A6> <DBC1> <DBC1> <9632> <DBC2> <DBC2> <9F90> <DBC3> <DBC3> <500D> <DBC4> <DBC4> <4FF3> <DBC5> <DBC5> <F963> <DBC6> <DBC6> <57F9> <DBC7> <DBC7> <5F98> <DBC8> <DBC8> <62DC> <DBC9> <DBC9> <6392> <DBCA> <DBCA> <676F> <DBCB> <DBCB> <6E43> <DBCC> <DBCC> <7119> <DBCD> <DBCD> <76C3> <DBCE> <DBCE> <80CC> <DBCF> <DBCF> <80DA> <DBD0> <DBD1> <88F4> <DBD2> <DBD2> <8919> <DBD3> <DBD3> <8CE0> <DBD4> <DBD4> <8F29> <DBD5> <DBD5> <914D> <DBD6> <DBD6> <966A> <DBD7> <DBD7> <4F2F> <DBD8> <DBD8> <4F70> <DBD9> <DBD9> <5E1B> <DBDA> <DBDA> <67CF> <DBDB> <DBDB> <6822> <DBDC> <DBDD> <767D> <DBDE> <DBDE> <9B44> <DBDF> <DBDF> <5E61> <DBE0> <DBE0> <6A0A> <DBE1> <DBE1> <7169> <DBE2> <DBE2> <71D4> <DBE3> <DBE3> <756A> <DBE4> <DBE4> <F964> <DBE5> <DBE5> <7E41> <DBE6> <DBE6> <8543> <DBE7> <DBE7> <85E9> <DBE8> <DBE8> <98DC> <DBE9> <DBE9> <4F10> <DBEA> <DBEA> <7B4F> <DBEB> <DBEB> <7F70> <DBEC> <DBEC> <95A5> <DBED> <DBED> <51E1> <DBEE> <DBEE> <5E06> <DBEF> <DBEF> <68B5> <DBF0> <DBF0> <6C3E> <DBF1> <DBF1> <6C4E> <DBF2> <DBF2> <6CDB> <DBF3> <DBF3> <72AF> <DBF4> <DBF4> <7BC4> endbfrange 100 beginbfrange <DBF5> <DBF5> <8303> <DBF6> <DBF6> <6CD5> <DBF7> <DBF7> <743A> <DBF8> <DBF8> <50FB> <DBF9> <DBF9> <5288> <DBFA> <DBFA> <58C1> <DBFB> <DBFB> <64D8> <DBFC> <DBFC> <6A97> <DBFD> <DBFD> <74A7> <DBFE> <DBFE> <7656> <DCA1> <DCA1> <78A7> <DCA2> <DCA2> <8617> <DCA3> <DCA3> <95E2> <DCA4> <DCA4> <9739> <DCA5> <DCA5> <F965> <DCA6> <DCA6> <535E> <DCA7> <DCA7> <5F01> <DCA8> <DCA8> <8B8A> <DCA9> <DCA9> <8FA8> <DCAA> <DCAA> <8FAF> <DCAB> <DCAB> <908A> <DCAC> <DCAC> <5225> <DCAD> <DCAD> <77A5> <DCAE> <DCAE> <9C49> <DCAF> <DCAF> <9F08> <DCB0> <DCB0> <4E19> <DCB1> <DCB1> <5002> <DCB2> <DCB2> <5175> <DCB3> <DCB3> <5C5B> <DCB4> <DCB4> <5E77> <DCB5> <DCB5> <661E> <DCB6> <DCB6> <663A> <DCB7> <DCB7> <67C4> <DCB8> <DCB8> <68C5> <DCB9> <DCB9> <70B3> <DCBA> <DCBA> <7501> <DCBB> <DCBB> <75C5> <DCBC> <DCBC> <79C9> <DCBD> <DCBD> <7ADD> <DCBE> <DCBE> <8F27> <DCBF> <DCBF> <9920> <DCC0> <DCC0> <9A08> <DCC1> <DCC1> <4FDD> <DCC2> <DCC2> <5821> <DCC3> <DCC3> <5831> <DCC4> <DCC4> <5BF6> <DCC5> <DCC5> <666E> <DCC6> <DCC6> <6B65> <DCC7> <DCC7> <6D11> <DCC8> <DCC8> <6E7A> <DCC9> <DCC9> <6F7D> <DCCA> <DCCA> <73E4> <DCCB> <DCCB> <752B> <DCCC> <DCCC> <83E9> <DCCD> <DCCD> <88DC> <DCCE> <DCCE> <8913> <DCCF> <DCCF> <8B5C> <DCD0> <DCD0> <8F14> <DCD1> <DCD1> <4F0F> <DCD2> <DCD2> <50D5> <DCD3> <DCD3> <5310> <DCD4> <DCD4> <535C> <DCD5> <DCD5> <5B93> <DCD6> <DCD6> <5FA9> <DCD7> <DCD7> <670D> <DCD8> <DCD8> <798F> <DCD9> <DCD9> <8179> <DCDA> <DCDA> <832F> <DCDB> <DCDB> <8514> <DCDC> <DCDC> <8907> <DCDD> <DCDD> <8986> <DCDE> <DCDE> <8F39> <DCDF> <DCDF> <8F3B> <DCE0> <DCE0> <99A5> <DCE1> <DCE1> <9C12> <DCE2> <DCE2> <672C> <DCE3> <DCE3> <4E76> <DCE4> <DCE4> <4FF8> <DCE5> <DCE5> <5949> <DCE6> <DCE6> <5C01> <DCE7> <DCE8> <5CEF> <DCE9> <DCE9> <6367> <DCEA> <DCEA> <68D2> <DCEB> <DCEB> <70FD> <DCEC> <DCEC> <71A2> <DCED> <DCED> <742B> <DCEE> <DCEE> <7E2B> <DCEF> <DCEF> <84EC> <DCF0> <DCF0> <8702> <DCF1> <DCF1> <9022> <DCF2> <DCF2> <92D2> <DCF3> <DCF3> <9CF3> <DCF4> <DCF4> <4E0D> <DCF5> <DCF5> <4ED8> <DCF6> <DCF6> <4FEF> <DCF7> <DCF7> <5085> <DCF8> <DCF8> <5256> <DCF9> <DCF9> <526F> <DCFA> <DCFA> <5426> <DCFB> <DCFB> <5490> endbfrange 100 beginbfrange <DCFC> <DCFC> <57E0> <DCFD> <DCFD> <592B> <DCFE> <DCFE> <5A66> <DDA1> <DDA1> <5B5A> <DDA2> <DDA2> <5B75> <DDA3> <DDA3> <5BCC> <DDA4> <DDA4> <5E9C> <DDA5> <DDA5> <F966> <DDA6> <DDA6> <6276> <DDA7> <DDA7> <6577> <DDA8> <DDA8> <65A7> <DDA9> <DDA9> <6D6E> <DDAA> <DDAA> <6EA5> <DDAB> <DDAB> <7236> <DDAC> <DDAC> <7B26> <DDAD> <DDAD> <7C3F> <DDAE> <DDAE> <7F36> <DDAF> <DDB0> <8150> <DDB1> <DDB1> <819A> <DDB2> <DDB2> <8240> <DDB3> <DDB3> <8299> <DDB4> <DDB4> <83A9> <DDB5> <DDB5> <8A03> <DDB6> <DDB6> <8CA0> <DDB7> <DDB7> <8CE6> <DDB8> <DDB8> <8CFB> <DDB9> <DDB9> <8D74> <DDBA> <DDBA> <8DBA> <DDBB> <DDBB> <90E8> <DDBC> <DDBC> <91DC> <DDBD> <DDBD> <961C> <DDBE> <DDBE> <9644> <DDBF> <DDBF> <99D9> <DDC0> <DDC0> <9CE7> <DDC1> <DDC1> <5317> <DDC2> <DDC2> <5206> <DDC3> <DDC3> <5429> <DDC4> <DDC4> <5674> <DDC5> <DDC5> <58B3> <DDC6> <DDC6> <5954> <DDC7> <DDC7> <596E> <DDC8> <DDC8> <5FFF> <DDC9> <DDC9> <61A4> <DDCA> <DDCA> <626E> <DDCB> <DDCB> <6610> <DDCC> <DDCC> <6C7E> <DDCD> <DDCD> <711A> <DDCE> <DDCE> <76C6> <DDCF> <DDCF> <7C89> <DDD0> <DDD0> <7CDE> <DDD1> <DDD1> <7D1B> <DDD2> <DDD2> <82AC> <DDD3> <DDD3> <8CC1> <DDD4> <DDD4> <96F0> <DDD5> <DDD5> <F967> <DDD6> <DDD6> <4F5B> <DDD7> <DDD7> <5F17> <DDD8> <DDD8> <5F7F> <DDD9> <DDD9> <62C2> <DDDA> <DDDA> <5D29> <DDDB> <DDDB> <670B> <DDDC> <DDDC> <68DA> <DDDD> <DDDD> <787C> <DDDE> <DDDE> <7E43> <DDDF> <DDDF> <9D6C> <DDE0> <DDE0> <4E15> <DDE1> <DDE1> <5099> <DDE2> <DDE2> <5315> <DDE3> <DDE3> <532A> <DDE4> <DDE4> <5351> <DDE5> <DDE5> <5983> <DDE6> <DDE6> <5A62> <DDE7> <DDE7> <5E87> <DDE8> <DDE8> <60B2> <DDE9> <DDE9> <618A> <DDEA> <DDEA> <6249> <DDEB> <DDEB> <6279> <DDEC> <DDEC> <6590> <DDED> <DDED> <6787> <DDEE> <DDEE> <69A7> <DDEF> <DDEF> <6BD4> <DDF0> <DDF2> <6BD6> <DDF3> <DDF3> <6CB8> <DDF4> <DDF4> <F968> <DDF5> <DDF5> <7435> <DDF6> <DDF6> <75FA> <DDF7> <DDF7> <7812> <DDF8> <DDF8> <7891> <DDF9> <DDF9> <79D5> <DDFA> <DDFA> <79D8> <DDFB> <DDFB> <7C83> <DDFC> <DDFC> <7DCB> <DDFD> <DDFD> <7FE1> <DDFE> <DDFE> <80A5> <DEA1> <DEA1> <813E> <DEA2> <DEA2> <81C2> <DEA3> <DEA3> <83F2> <DEA4> <DEA4> <871A> <DEA5> <DEA5> <88E8> <DEA6> <DEA6> <8AB9> endbfrange 100 beginbfrange <DEA7> <DEA7> <8B6C> <DEA8> <DEA8> <8CBB> <DEA9> <DEA9> <9119> <DEAA> <DEAA> <975E> <DEAB> <DEAB> <98DB> <DEAC> <DEAC> <9F3B> <DEAD> <DEAD> <56AC> <DEAE> <DEAE> <5B2A> <DEAF> <DEAF> <5F6C> <DEB0> <DEB0> <658C> <DEB1> <DEB1> <6AB3> <DEB2> <DEB2> <6BAF> <DEB3> <DEB3> <6D5C> <DEB4> <DEB4> <6FF1> <DEB5> <DEB5> <7015> <DEB6> <DEB6> <725D> <DEB7> <DEB7> <73AD> <DEB8> <DEB8> <8CA7> <DEB9> <DEB9> <8CD3> <DEBA> <DEBA> <983B> <DEBB> <DEBB> <6191> <DEBC> <DEBC> <6C37> <DEBD> <DEBD> <8058> <DEBE> <DEBE> <9A01> <DEBF> <DEBF> <4E4D> <DEC0> <DEC0> <4E8B> <DEC1> <DEC1> <4E9B> <DEC2> <DEC2> <4ED5> <DEC3> <DEC3> <4F3A> <DEC4> <DEC4> <4F3C> <DEC5> <DEC5> <4F7F> <DEC6> <DEC6> <4FDF> <DEC7> <DEC7> <50FF> <DEC8> <DEC8> <53F2> <DEC9> <DEC9> <53F8> <DECA> <DECA> <5506> <DECB> <DECB> <55E3> <DECC> <DECC> <56DB> <DECD> <DECD> <58EB> <DECE> <DECE> <5962> <DECF> <DECF> <5A11> <DED0> <DED0> <5BEB> <DED1> <DED1> <5BFA> <DED2> <DED2> <5C04> <DED3> <DED3> <5DF3> <DED4> <DED4> <5E2B> <DED5> <DED5> <5F99> <DED6> <DED6> <601D> <DED7> <DED7> <6368> <DED8> <DED8> <659C> <DED9> <DED9> <65AF> <DEDA> <DEDA> <67F6> <DEDB> <DEDB> <67FB> <DEDC> <DEDC> <68AD> <DEDD> <DEDD> <6B7B> <DEDE> <DEDE> <6C99> <DEDF> <DEDF> <6CD7> <DEE0> <DEE0> <6E23> <DEE1> <DEE1> <7009> <DEE2> <DEE2> <7345> <DEE3> <DEE3> <7802> <DEE4> <DEE4> <793E> <DEE5> <DEE5> <7940> <DEE6> <DEE6> <7960> <DEE7> <DEE7> <79C1> <DEE8> <DEE8> <7BE9> <DEE9> <DEE9> <7D17> <DEEA> <DEEA> <7D72> <DEEB> <DEEB> <8086> <DEEC> <DEEC> <820D> <DEED> <DEED> <838E> <DEEE> <DEEE> <84D1> <DEEF> <DEEF> <86C7> <DEF0> <DEF0> <88DF> <DEF1> <DEF1> <8A50> <DEF2> <DEF2> <8A5E> <DEF3> <DEF3> <8B1D> <DEF4> <DEF4> <8CDC> <DEF5> <DEF5> <8D66> <DEF6> <DEF6> <8FAD> <DEF7> <DEF7> <90AA> <DEF8> <DEF8> <98FC> <DEF9> <DEF9> <99DF> <DEFA> <DEFA> <9E9D> <DEFB> <DEFB> <524A> <DEFC> <DEFC> <F969> <DEFD> <DEFD> <6714> <DEFE> <DEFE> <F96A> <DFA1> <DFA1> <5098> <DFA2> <DFA2> <522A> <DFA3> <DFA3> <5C71> <DFA4> <DFA4> <6563> <DFA5> <DFA5> <6C55> <DFA6> <DFA6> <73CA> <DFA7> <DFA7> <7523> <DFA8> <DFA8> <759D> <DFA9> <DFA9> <7B97> <DFAA> <DFAA> <849C> <DFAB> <DFAB> <9178> <DFAC> <DFAC> <9730> endbfrange 100 beginbfrange <DFAD> <DFAD> <4E77> <DFAE> <DFAE> <6492> <DFAF> <DFAF> <6BBA> <DFB0> <DFB0> <715E> <DFB1> <DFB1> <85A9> <DFB2> <DFB2> <4E09> <DFB3> <DFB3> <F96B> <DFB4> <DFB4> <6749> <DFB5> <DFB5> <68EE> <DFB6> <DFB6> <6E17> <DFB7> <DFB7> <829F> <DFB8> <DFB8> <8518> <DFB9> <DFB9> <886B> <DFBA> <DFBA> <63F7> <DFBB> <DFBB> <6F81> <DFBC> <DFBC> <9212> <DFBD> <DFBD> <98AF> <DFBE> <DFBE> <4E0A> <DFBF> <DFBF> <50B7> <DFC0> <DFC0> <50CF> <DFC1> <DFC1> <511F> <DFC2> <DFC2> <5546> <DFC3> <DFC3> <55AA> <DFC4> <DFC4> <5617> <DFC5> <DFC5> <5B40> <DFC6> <DFC6> <5C19> <DFC7> <DFC7> <5CE0> <DFC8> <DFC8> <5E38> <DFC9> <DFC9> <5E8A> <DFCA> <DFCA> <5EA0> <DFCB> <DFCB> <5EC2> <DFCC> <DFCC> <60F3> <DFCD> <DFCD> <6851> <DFCE> <DFCE> <6A61> <DFCF> <DFCF> <6E58> <DFD0> <DFD0> <723D> <DFD1> <DFD1> <7240> <DFD2> <DFD2> <72C0> <DFD3> <DFD3> <76F8> <DFD4> <DFD4> <7965> <DFD5> <DFD5> <7BB1> <DFD6> <DFD6> <7FD4> <DFD7> <DFD7> <88F3> <DFD8> <DFD8> <89F4> <DFD9> <DFD9> <8A73> <DFDA> <DFDA> <8C61> <DFDB> <DFDB> <8CDE> <DFDC> <DFDC> <971C> <DFDD> <DFDD> <585E> <DFDE> <DFDE> <74BD> <DFDF> <DFDF> <8CFD> <DFE0> <DFE0> <55C7> <DFE1> <DFE1> <F96C> <DFE2> <DFE2> <7A61> <DFE3> <DFE3> <7D22> <DFE4> <DFE4> <8272> <DFE5> <DFE5> <7272> <DFE6> <DFE6> <751F> <DFE7> <DFE7> <7525> <DFE8> <DFE8> <F96D> <DFE9> <DFE9> <7B19> <DFEA> <DFEA> <5885> <DFEB> <DFEB> <58FB> <DFEC> <DFEC> <5DBC> <DFED> <DFED> <5E8F> <DFEE> <DFEE> <5EB6> <DFEF> <DFEF> <5F90> <DFF0> <DFF0> <6055> <DFF1> <DFF1> <6292> <DFF2> <DFF2> <637F> <DFF3> <DFF3> <654D> <DFF4> <DFF4> <6691> <DFF5> <DFF5> <66D9> <DFF6> <DFF6> <66F8> <DFF7> <DFF7> <6816> <DFF8> <DFF8> <68F2> <DFF9> <DFF9> <7280> <DFFA> <DFFA> <745E> <DFFB> <DFFB> <7B6E> <DFFC> <DFFC> <7D6E> <DFFD> <DFFD> <7DD6> <DFFE> <DFFE> <7F72> <E0A1> <E0A1> <80E5> <E0A2> <E0A2> <8212> <E0A3> <E0A3> <85AF> <E0A4> <E0A4> <897F> <E0A5> <E0A5> <8A93> <E0A6> <E0A6> <901D> <E0A7> <E0A7> <92E4> <E0A8> <E0A8> <9ECD> <E0A9> <E0A9> <9F20> <E0AA> <E0AA> <5915> <E0AB> <E0AB> <596D> <E0AC> <E0AC> <5E2D> <E0AD> <E0AD> <60DC> <E0AE> <E0AE> <6614> <E0AF> <E0AF> <6673> <E0B0> <E0B0> <6790> <E0B1> <E0B1> <6C50> <E0B2> <E0B2> <6DC5> endbfrange 100 beginbfrange <E0B3> <E0B3> <6F5F> <E0B4> <E0B4> <77F3> <E0B5> <E0B5> <78A9> <E0B6> <E0B6> <84C6> <E0B7> <E0B7> <91CB> <E0B8> <E0B8> <932B> <E0B9> <E0B9> <4ED9> <E0BA> <E0BA> <50CA> <E0BB> <E0BB> <5148> <E0BC> <E0BC> <5584> <E0BD> <E0BD> <5B0B> <E0BE> <E0BE> <5BA3> <E0BF> <E0BF> <6247> <E0C0> <E0C0> <657E> <E0C1> <E0C1> <65CB> <E0C2> <E0C2> <6E32> <E0C3> <E0C3> <717D> <E0C4> <E0C4> <7401> <E0C5> <E0C5> <7444> <E0C6> <E0C6> <7487> <E0C7> <E0C7> <74BF> <E0C8> <E0C8> <766C> <E0C9> <E0C9> <79AA> <E0CA> <E0CA> <7DDA> <E0CB> <E0CB> <7E55> <E0CC> <E0CC> <7FA8> <E0CD> <E0CD> <817A> <E0CE> <E0CE> <81B3> <E0CF> <E0CF> <8239> <E0D0> <E0D0> <861A> <E0D1> <E0D1> <87EC> <E0D2> <E0D2> <8A75> <E0D3> <E0D3> <8DE3> <E0D4> <E0D4> <9078> <E0D5> <E0D5> <9291> <E0D6> <E0D6> <9425> <E0D7> <E0D7> <994D> <E0D8> <E0D8> <9BAE> <E0D9> <E0D9> <5368> <E0DA> <E0DA> <5C51> <E0DB> <E0DB> <6954> <E0DC> <E0DC> <6CC4> <E0DD> <E0DD> <6D29> <E0DE> <E0DE> <6E2B> <E0DF> <E0DF> <820C> <E0E0> <E0E0> <859B> <E0E1> <E0E1> <893B> <E0E2> <E0E2> <8A2D> <E0E3> <E0E3> <8AAA> <E0E4> <E0E4> <96EA> <E0E5> <E0E5> <9F67> <E0E6> <E0E6> <5261> <E0E7> <E0E7> <66B9> <E0E8> <E0E8> <6BB2> <E0E9> <E0E9> <7E96> <E0EA> <E0EA> <87FE> <E0EB> <E0EB> <8D0D> <E0EC> <E0EC> <9583> <E0ED> <E0ED> <965D> <E0EE> <E0EE> <651D> <E0EF> <E0EF> <6D89> <E0F0> <E0F0> <71EE> <E0F1> <E0F1> <F96E> <E0F2> <E0F2> <57CE> <E0F3> <E0F3> <59D3> <E0F4> <E0F4> <5BAC> <E0F5> <E0F5> <6027> <E0F6> <E0F6> <60FA> <E0F7> <E0F7> <6210> <E0F8> <E0F8> <661F> <E0F9> <E0F9> <665F> <E0FA> <E0FA> <7329> <E0FB> <E0FB> <73F9> <E0FC> <E0FC> <76DB> <E0FD> <E0FD> <7701> <E0FE> <E0FE> <7B6C> <E1A1> <E1A1> <8056> <E1A2> <E1A2> <8072> <E1A3> <E1A3> <8165> <E1A4> <E1A4> <8AA0> <E1A5> <E1A5> <9192> <E1A6> <E1A6> <4E16> <E1A7> <E1A7> <52E2> <E1A8> <E1A8> <6B72> <E1A9> <E1A9> <6D17> <E1AA> <E1AA> <7A05> <E1AB> <E1AB> <7B39> <E1AC> <E1AC> <7D30> <E1AD> <E1AD> <F96F> <E1AE> <E1AE> <8CB0> <E1AF> <E1AF> <53EC> <E1B0> <E1B0> <562F> <E1B1> <E1B1> <5851> <E1B2> <E1B2> <5BB5> <E1B3> <E1B3> <5C0F> <E1B4> <E1B4> <5C11> <E1B5> <E1B5> <5DE2> <E1B6> <E1B6> <6240> <E1B7> <E1B7> <6383> <E1B8> <E1B8> <6414> endbfrange 100 beginbfrange <E1B9> <E1B9> <662D> <E1BA> <E1BA> <68B3> <E1BB> <E1BB> <6CBC> <E1BC> <E1BC> <6D88> <E1BD> <E1BD> <6EAF> <E1BE> <E1BE> <701F> <E1BF> <E1BF> <70A4> <E1C0> <E1C0> <71D2> <E1C1> <E1C1> <7526> <E1C2> <E1C2> <758F> <E1C3> <E1C3> <758E> <E1C4> <E1C4> <7619> <E1C5> <E1C5> <7B11> <E1C6> <E1C6> <7BE0> <E1C7> <E1C7> <7C2B> <E1C8> <E1C8> <7D20> <E1C9> <E1C9> <7D39> <E1CA> <E1CA> <852C> <E1CB> <E1CB> <856D> <E1CC> <E1CC> <8607> <E1CD> <E1CD> <8A34> <E1CE> <E1CE> <900D> <E1CF> <E1CF> <9061> <E1D0> <E1D0> <90B5> <E1D1> <E1D1> <92B7> <E1D2> <E1D2> <97F6> <E1D3> <E1D3> <9A37> <E1D4> <E1D4> <4FD7> <E1D5> <E1D5> <5C6C> <E1D6> <E1D6> <675F> <E1D7> <E1D7> <6D91> <E1D8> <E1D8> <7C9F> <E1D9> <E1D9> <7E8C> <E1DA> <E1DA> <8B16> <E1DB> <E1DB> <8D16> <E1DC> <E1DC> <901F> <E1DD> <E1DD> <5B6B> <E1DE> <E1DE> <5DFD> <E1DF> <E1DF> <640D> <E1E0> <E1E0> <84C0> <E1E1> <E1E1> <905C> <E1E2> <E1E2> <98E1> <E1E3> <E1E3> <7387> <E1E4> <E1E4> <5B8B> <E1E5> <E1E5> <609A> <E1E6> <E1E6> <677E> <E1E7> <E1E7> <6DDE> <E1E8> <E1E8> <8A1F> <E1E9> <E1E9> <8AA6> <E1EA> <E1EA> <9001> <E1EB> <E1EB> <980C> <E1EC> <E1EC> <5237> <E1ED> <E1ED> <F970> <E1EE> <E1EE> <7051> <E1EF> <E1EF> <788E> <E1F0> <E1F0> <9396> <E1F1> <E1F1> <8870> <E1F2> <E1F2> <91D7> <E1F3> <E1F3> <4FEE> <E1F4> <E1F4> <53D7> <E1F5> <E1F5> <55FD> <E1F6> <E1F6> <56DA> <E1F7> <E1F7> <5782> <E1F8> <E1F8> <58FD> <E1F9> <E1F9> <5AC2> <E1FA> <E1FA> <5B88> <E1FB> <E1FB> <5CAB> <E1FC> <E1FC> <5CC0> <E1FD> <E1FD> <5E25> <E1FE> <E1FE> <6101> <E2A1> <E2A1> <620D> <E2A2> <E2A2> <624B> <E2A3> <E2A3> <6388> <E2A4> <E2A4> <641C> <E2A5> <E2A5> <6536> <E2A6> <E2A6> <6578> <E2A7> <E2A7> <6A39> <E2A8> <E2A8> <6B8A> <E2A9> <E2A9> <6C34> <E2AA> <E2AA> <6D19> <E2AB> <E2AB> <6F31> <E2AC> <E2AC> <71E7> <E2AD> <E2AD> <72E9> <E2AE> <E2AE> <7378> <E2AF> <E2AF> <7407> <E2B0> <E2B0> <74B2> <E2B1> <E2B1> <7626> <E2B2> <E2B2> <7761> <E2B3> <E2B3> <79C0> <E2B4> <E2B4> <7A57> <E2B5> <E2B5> <7AEA> <E2B6> <E2B6> <7CB9> <E2B7> <E2B7> <7D8F> <E2B8> <E2B8> <7DAC> <E2B9> <E2B9> <7E61> <E2BA> <E2BA> <7F9E> <E2BB> <E2BB> <8129> <E2BC> <E2BC> <8331> <E2BD> <E2BD> <8490> <E2BE> <E2BE> <84DA> endbfrange 100 beginbfrange <E2BF> <E2BF> <85EA> <E2C0> <E2C0> <8896> <E2C1> <E2C1> <8AB0> <E2C2> <E2C2> <8B90> <E2C3> <E2C3> <8F38> <E2C4> <E2C4> <9042> <E2C5> <E2C5> <9083> <E2C6> <E2C6> <916C> <E2C7> <E2C7> <9296> <E2C8> <E2C8> <92B9> <E2C9> <E2C9> <968B> <E2CA> <E2CB> <96A7> <E2CC> <E2CC> <96D6> <E2CD> <E2CD> <9700> <E2CE> <E2CE> <9808> <E2CF> <E2CF> <9996> <E2D0> <E2D0> <9AD3> <E2D1> <E2D1> <9B1A> <E2D2> <E2D2> <53D4> <E2D3> <E2D3> <587E> <E2D4> <E2D4> <5919> <E2D5> <E2D5> <5B70> <E2D6> <E2D6> <5BBF> <E2D7> <E2D7> <6DD1> <E2D8> <E2D8> <6F5A> <E2D9> <E2D9> <719F> <E2DA> <E2DA> <7421> <E2DB> <E2DB> <74B9> <E2DC> <E2DC> <8085> <E2DD> <E2DD> <83FD> <E2DE> <E2DE> <5DE1> <E2DF> <E2DF> <5F87> <E2E0> <E2E0> <5FAA> <E2E1> <E2E1> <6042> <E2E2> <E2E2> <65EC> <E2E3> <E2E3> <6812> <E2E4> <E2E4> <696F> <E2E5> <E2E5> <6A53> <E2E6> <E2E6> <6B89> <E2E7> <E2E7> <6D35> <E2E8> <E2E8> <6DF3> <E2E9> <E2E9> <73E3> <E2EA> <E2EA> <76FE> <E2EB> <E2EB> <77AC> <E2EC> <E2EC> <7B4D> <E2ED> <E2ED> <7D14> <E2EE> <E2EE> <8123> <E2EF> <E2EF> <821C> <E2F0> <E2F0> <8340> <E2F1> <E2F1> <84F4> <E2F2> <E2F2> <8563> <E2F3> <E2F3> <8A62> <E2F4> <E2F4> <8AC4> <E2F5> <E2F5> <9187> <E2F6> <E2F6> <931E> <E2F7> <E2F7> <9806> <E2F8> <E2F8> <99B4> <E2F9> <E2F9> <620C> <E2FA> <E2FA> <8853> <E2FB> <E2FB> <8FF0> <E2FC> <E2FC> <9265> <E2FD> <E2FD> <5D07> <E2FE> <E2FE> <5D27> <E3A1> <E3A1> <5D69> <E3A2> <E3A2> <745F> <E3A3> <E3A3> <819D> <E3A4> <E3A4> <8768> <E3A5> <E3A5> <6FD5> <E3A6> <E3A6> <62FE> <E3A7> <E3A7> <7FD2> <E3A8> <E3A8> <8936> <E3A9> <E3A9> <8972> <E3AA> <E3AA> <4E1E> <E3AB> <E3AB> <4E58> <E3AC> <E3AC> <50E7> <E3AD> <E3AD> <52DD> <E3AE> <E3AE> <5347> <E3AF> <E3AF> <627F> <E3B0> <E3B0> <6607> <E3B1> <E3B1> <7E69> <E3B2> <E3B2> <8805> <E3B3> <E3B3> <965E> <E3B4> <E3B4> <4F8D> <E3B5> <E3B5> <5319> <E3B6> <E3B6> <5636> <E3B7> <E3B7> <59CB> <E3B8> <E3B8> <5AA4> <E3B9> <E3B9> <5C38> <E3BA> <E3BA> <5C4E> <E3BB> <E3BB> <5C4D> <E3BC> <E3BC> <5E02> <E3BD> <E3BD> <5F11> <E3BE> <E3BE> <6043> <E3BF> <E3BF> <65BD> <E3C0> <E3C0> <662F> <E3C1> <E3C1> <6642> <E3C2> <E3C2> <67BE> <E3C3> <E3C3> <67F4> <E3C4> <E3C4> <731C> <E3C5> <E3C5> <77E2> endbfrange 100 beginbfrange <E3C6> <E3C6> <793A> <E3C7> <E3C7> <7FC5> <E3C8> <E3C8> <8494> <E3C9> <E3C9> <84CD> <E3CA> <E3CA> <8996> <E3CB> <E3CB> <8A66> <E3CC> <E3CC> <8A69> <E3CD> <E3CD> <8AE1> <E3CE> <E3CE> <8C55> <E3CF> <E3CF> <8C7A> <E3D0> <E3D0> <57F4> <E3D1> <E3D1> <5BD4> <E3D2> <E3D2> <5F0F> <E3D3> <E3D3> <606F> <E3D4> <E3D4> <62ED> <E3D5> <E3D5> <690D> <E3D6> <E3D6> <6B96> <E3D7> <E3D7> <6E5C> <E3D8> <E3D8> <7184> <E3D9> <E3D9> <7BD2> <E3DA> <E3DA> <8755> <E3DB> <E3DB> <8B58> <E3DC> <E3DC> <8EFE> <E3DD> <E3DD> <98DF> <E3DE> <E3DE> <98FE> <E3DF> <E3DF> <4F38> <E3E0> <E3E0> <4F81> <E3E1> <E3E1> <4FE1> <E3E2> <E3E2> <547B> <E3E3> <E3E3> <5A20> <E3E4> <E3E4> <5BB8> <E3E5> <E3E5> <613C> <E3E6> <E3E6> <65B0> <E3E7> <E3E7> <6668> <E3E8> <E3E8> <71FC> <E3E9> <E3E9> <7533> <E3EA> <E3EA> <795E> <E3EB> <E3EB> <7D33> <E3EC> <E3EC> <814E> <E3ED> <E3ED> <81E3> <E3EE> <E3EE> <8398> <E3EF> <E3EF> <85AA> <E3F0> <E3F0> <85CE> <E3F1> <E3F1> <8703> <E3F2> <E3F2> <8A0A> <E3F3> <E3F3> <8EAB> <E3F4> <E3F4> <8F9B> <E3F5> <E3F5> <F971> <E3F6> <E3F6> <8FC5> <E3F7> <E3F7> <5931> <E3F8> <E3F8> <5BA4> <E3F9> <E3F9> <5BE6> <E3FA> <E3FA> <6089> <E3FB> <E3FB> <5BE9> <E3FC> <E3FC> <5C0B> <E3FD> <E3FD> <5FC3> <E3FE> <E3FE> <6C81> <E4A1> <E4A1> <F972> <E4A2> <E4A2> <6DF1> <E4A3> <E4A3> <700B> <E4A4> <E4A4> <751A> <E4A5> <E4A5> <82AF> <E4A6> <E4A6> <8AF6> <E4A7> <E4A7> <4EC0> <E4A8> <E4A8> <5341> <E4A9> <E4A9> <F973> <E4AA> <E4AA> <96D9> <E4AB> <E4AB> <6C0F> <E4AC> <E4AC> <4E9E> <E4AD> <E4AD> <4FC4> <E4AE> <E4AE> <5152> <E4AF> <E4AF> <555E> <E4B0> <E4B0> <5A25> <E4B1> <E4B1> <5CE8> <E4B2> <E4B2> <6211> <E4B3> <E4B3> <7259> <E4B4> <E4B4> <82BD> <E4B5> <E4B5> <83AA> <E4B6> <E4B6> <86FE> <E4B7> <E4B7> <8859> <E4B8> <E4B8> <8A1D> <E4B9> <E4B9> <963F> <E4BA> <E4BA> <96C5> <E4BB> <E4BB> <9913> <E4BC> <E4BC> <9D09> <E4BD> <E4BD> <9D5D> <E4BE> <E4BE> <580A> <E4BF> <E4BF> <5CB3> <E4C0> <E4C0> <5DBD> <E4C1> <E4C1> <5E44> <E4C2> <E4C2> <60E1> <E4C3> <E4C3> <6115> <E4C4> <E4C4> <63E1> <E4C5> <E4C5> <6A02> <E4C6> <E4C6> <6E25> <E4C7> <E4C7> <9102> <E4C8> <E4C8> <9354> <E4C9> <E4C9> <984E> <E4CA> <E4CA> <9C10> <E4CB> <E4CB> <9F77> endbfrange 100 beginbfrange <E4CC> <E4CC> <5B89> <E4CD> <E4CD> <5CB8> <E4CE> <E4CE> <6309> <E4CF> <E4CF> <664F> <E4D0> <E4D0> <6848> <E4D1> <E4D1> <773C> <E4D2> <E4D2> <96C1> <E4D3> <E4D3> <978D> <E4D4> <E4D4> <9854> <E4D5> <E4D5> <9B9F> <E4D6> <E4D6> <65A1> <E4D7> <E4D7> <8B01> <E4D8> <E4D8> <8ECB> <E4D9> <E4D9> <95BC> <E4DA> <E4DA> <5535> <E4DB> <E4DB> <5CA9> <E4DC> <E4DC> <5DD6> <E4DD> <E4DD> <5EB5> <E4DE> <E4DE> <6697> <E4DF> <E4DF> <764C> <E4E0> <E4E0> <83F4> <E4E1> <E4E1> <95C7> <E4E2> <E4E2> <58D3> <E4E3> <E4E3> <62BC> <E4E4> <E4E4> <72CE> <E4E5> <E4E5> <9D28> <E4E6> <E4E6> <4EF0> <E4E7> <E4E7> <592E> <E4E8> <E4E8> <600F> <E4E9> <E4E9> <663B> <E4EA> <E4EA> <6B83> <E4EB> <E4EB> <79E7> <E4EC> <E4EC> <9D26> <E4ED> <E4ED> <5393> <E4EE> <E4EE> <54C0> <E4EF> <E4EF> <57C3> <E4F0> <E4F0> <5D16> <E4F1> <E4F1> <611B> <E4F2> <E4F2> <66D6> <E4F3> <E4F3> <6DAF> <E4F4> <E4F4> <788D> <E4F5> <E4F5> <827E> <E4F6> <E4F6> <9698> <E4F7> <E4F7> <9744> <E4F8> <E4F8> <5384> <E4F9> <E4F9> <627C> <E4FA> <E4FA> <6396> <E4FB> <E4FB> <6DB2> <E4FC> <E4FC> <7E0A> <E4FD> <E4FD> <814B> <E4FE> <E4FE> <984D> <E5A1> <E5A1> <6AFB> <E5A2> <E5A2> <7F4C> <E5A3> <E5A3> <9DAF> <E5A4> <E5A4> <9E1A> <E5A5> <E5A5> <4E5F> <E5A6> <E5A6> <503B> <E5A7> <E5A7> <51B6> <E5A8> <E5A8> <591C> <E5A9> <E5A9> <60F9> <E5AA> <E5AA> <63F6> <E5AB> <E5AB> <6930> <E5AC> <E5AC> <723A> <E5AD> <E5AD> <8036> <E5AE> <E5AE> <F974> <E5AF> <E5AF> <91CE> <E5B0> <E5B0> <5F31> <E5B1> <E5B2> <F975> <E5B3> <E5B3> <7D04> <E5B4> <E5B4> <82E5> <E5B5> <E5B5> <846F> <E5B6> <E5B6> <84BB> <E5B7> <E5B7> <85E5> <E5B8> <E5B8> <8E8D> <E5B9> <E5B9> <F977> <E5BA> <E5BA> <4F6F> <E5BB> <E5BC> <F978> <E5BD> <E5BD> <58E4> <E5BE> <E5BE> <5B43> <E5BF> <E5BF> <6059> <E5C0> <E5C0> <63DA> <E5C1> <E5C1> <6518> <E5C2> <E5C2> <656D> <E5C3> <E5C3> <6698> <E5C4> <E5C4> <F97A> <E5C5> <E5C5> <694A> <E5C6> <E5C6> <6A23> <E5C7> <E5C7> <6D0B> <E5C8> <E5C8> <7001> <E5C9> <E5C9> <716C> <E5CA> <E5CA> <75D2> <E5CB> <E5CB> <760D> <E5CC> <E5CC> <79B3> <E5CD> <E5CD> <7A70> <E5CE> <E5CE> <F97B> <E5CF> <E5CF> <7F8A> <E5D0> <E5D0> <F97C> <E5D1> <E5D1> <8944> <E5D2> <E5D2> <F97D> <E5D3> <E5D3> <8B93> endbfrange 100 beginbfrange <E5D4> <E5D4> <91C0> <E5D5> <E5D5> <967D> <E5D6> <E5D6> <F97E> <E5D7> <E5D7> <990A> <E5D8> <E5D8> <5704> <E5D9> <E5D9> <5FA1> <E5DA> <E5DA> <65BC> <E5DB> <E5DB> <6F01> <E5DC> <E5DC> <7600> <E5DD> <E5DD> <79A6> <E5DE> <E5DE> <8A9E> <E5DF> <E5DF> <99AD> <E5E0> <E5E0> <9B5A> <E5E1> <E5E1> <9F6C> <E5E2> <E5E2> <5104> <E5E3> <E5E3> <61B6> <E5E4> <E5E4> <6291> <E5E5> <E5E5> <6A8D> <E5E6> <E5E6> <81C6> <E5E7> <E5E7> <5043> <E5E8> <E5E8> <5830> <E5E9> <E5E9> <5F66> <E5EA> <E5EA> <7109> <E5EB> <E5EB> <8A00> <E5EC> <E5EC> <8AFA> <E5ED> <E5ED> <5B7C> <E5EE> <E5EE> <8616> <E5EF> <E5EF> <4FFA> <E5F0> <E5F0> <513C> <E5F1> <E5F1> <56B4> <E5F2> <E5F2> <5944> <E5F3> <E5F3> <63A9> <E5F4> <E5F4> <6DF9> <E5F5> <E5F5> <5DAA> <E5F6> <E5F6> <696D> <E5F7> <E5F7> <5186> <E5F8> <E5F8> <4E88> <E5F9> <E5F9> <4F59> <E5FA> <E5FC> <F97F> <E5FD> <E5FD> <5982> <E5FE> <E5FE> <F982> <E6A1> <E6A1> <F983> <E6A2> <E6A2> <6B5F> <E6A3> <E6A3> <6C5D> <E6A4> <E6A4> <F984> <E6A5> <E6A5> <74B5> <E6A6> <E6A6> <7916> <E6A7> <E6A7> <F985> <E6A8> <E6A8> <8207> <E6A9> <E6A9> <8245> <E6AA> <E6AA> <8339> <E6AB> <E6AB> <8F3F> <E6AC> <E6AC> <8F5D> <E6AD> <E6AD> <F986> <E6AE> <E6AE> <9918> <E6AF> <E6B1> <F987> <E6B2> <E6B2> <4EA6> <E6B3> <E6B3> <F98A> <E6B4> <E6B4> <57DF> <E6B5> <E6B5> <5F79> <E6B6> <E6B6> <6613> <E6B7> <E6B8> <F98B> <E6B9> <E6B9> <75AB> <E6BA> <E6BA> <7E79> <E6BB> <E6BB> <8B6F> <E6BC> <E6BC> <F98D> <E6BD> <E6BD> <9006> <E6BE> <E6BE> <9A5B> <E6BF> <E6BF> <56A5> <E6C0> <E6C0> <5827> <E6C1> <E6C1> <59F8> <E6C2> <E6C2> <5A1F> <E6C3> <E6C3> <5BB4> <E6C4> <E6C4> <F98E> <E6C5> <E6C5> <5EF6> <E6C6> <E6C7> <F98F> <E6C8> <E6C8> <6350> <E6C9> <E6C9> <633B> <E6CA> <E6CA> <F991> <E6CB> <E6CB> <693D> <E6CC> <E6CC> <6C87> <E6CD> <E6CD> <6CBF> <E6CE> <E6CE> <6D8E> <E6CF> <E6CF> <6D93> <E6D0> <E6D0> <6DF5> <E6D1> <E6D1> <6F14> <E6D2> <E6D2> <F992> <E6D3> <E6D3> <70DF> <E6D4> <E6D4> <7136> <E6D5> <E6D5> <7159> <E6D6> <E6D6> <F993> <E6D7> <E6D7> <71C3> <E6D8> <E6D8> <71D5> <E6D9> <E6D9> <F994> <E6DA> <E6DA> <784F> <E6DB> <E6DB> <786F> <E6DC> <E6DC> <F995> <E6DD> <E6DD> <7B75> <E6DE> <E6DE> <7DE3> <E6DF> <E6DF> <F996> endbfrange 100 beginbfrange <E6E0> <E6E0> <7E2F> <E6E1> <E6E1> <F997> <E6E2> <E6E2> <884D> <E6E3> <E6E3> <8EDF> <E6E4> <E6E6> <F998> <E6E7> <E6E7> <925B> <E6E8> <E6E8> <F99B> <E6E9> <E6E9> <9CF6> <E6EA> <E6EC> <F99C> <E6ED> <E6ED> <6085> <E6EE> <E6EE> <6D85> <E6EF> <E6EF> <F99F> <E6F0> <E6F0> <71B1> <E6F1> <E6F2> <F9A0> <E6F3> <E6F3> <95B1> <E6F4> <E6F4> <53AD> <E6F5> <E6F7> <F9A2> <E6F8> <E6F8> <67D3> <E6F9> <E6F9> <F9A5> <E6FA> <E6FA> <708E> <E6FB> <E6FB> <7130> <E6FC> <E6FC> <7430> <E6FD> <E6FD> <8276> <E6FE> <E6FE> <82D2> <E7A1> <E7A1> <F9A6> <E7A2> <E7A2> <95BB> <E7A3> <E7A3> <9AE5> <E7A4> <E7A4> <9E7D> <E7A5> <E7A5> <66C4> <E7A6> <E7A6> <F9A7> <E7A7> <E7A7> <71C1> <E7A8> <E7A8> <8449> <E7A9> <E7AA> <F9A8> <E7AB> <E7AB> <584B> <E7AC> <E7AD> <F9AA> <E7AE> <E7AE> <5DB8> <E7AF> <E7AF> <5F71> <E7B0> <E7B0> <F9AC> <E7B1> <E7B1> <6620> <E7B2> <E7B2> <668E> <E7B3> <E7B3> <6979> <E7B4> <E7B4> <69AE> <E7B5> <E7B5> <6C38> <E7B6> <E7B6> <6CF3> <E7B7> <E7B7> <6E36> <E7B8> <E7B8> <6F41> <E7B9> <E7B9> <6FDA> <E7BA> <E7BA> <701B> <E7BB> <E7BB> <702F> <E7BC> <E7BC> <7150> <E7BD> <E7BD> <71DF> <E7BE> <E7BE> <7370> <E7BF> <E7BF> <F9AD> <E7C0> <E7C0> <745B> <E7C1> <E7C1> <F9AE> <E7C2> <E7C2> <74D4> <E7C3> <E7C3> <76C8> <E7C4> <E7C4> <7A4E> <E7C5> <E7C5> <7E93> <E7C6> <E7C7> <F9AF> <E7C8> <E7C8> <82F1> <E7C9> <E7C9> <8A60> <E7CA> <E7CA> <8FCE> <E7CB> <E7CB> <F9B1> <E7CC> <E7CC> <9348> <E7CD> <E7CD> <F9B2> <E7CE> <E7CE> <9719> <E7CF> <E7D0> <F9B3> <E7D1> <E7D1> <4E42> <E7D2> <E7D2> <502A> <E7D3> <E7D3> <F9B5> <E7D4> <E7D4> <5208> <E7D5> <E7D5> <53E1> <E7D6> <E7D6> <66F3> <E7D7> <E7D7> <6C6D> <E7D8> <E7D8> <6FCA> <E7D9> <E7D9> <730A> <E7DA> <E7DA> <777F> <E7DB> <E7DB> <7A62> <E7DC> <E7DC> <82AE> <E7DD> <E7DD> <85DD> <E7DE> <E7DE> <8602> <E7DF> <E7DF> <F9B6> <E7E0> <E7E0> <88D4> <E7E1> <E7E1> <8A63> <E7E2> <E7E2> <8B7D> <E7E3> <E7E3> <8C6B> <E7E4> <E7E4> <F9B7> <E7E5> <E7E5> <92B3> <E7E6> <E7E6> <F9B8> <E7E7> <E7E7> <9713> <E7E8> <E7E8> <9810> <E7E9> <E7E9> <4E94> <E7EA> <E7EA> <4F0D> <E7EB> <E7EB> <4FC9> <E7EC> <E7EC> <50B2> <E7ED> <E7ED> <5348> <E7EE> <E7EE> <543E> <E7EF> <E7EF> <5433> <E7F0> <E7F0> <55DA> endbfrange 100 beginbfrange <E7F1> <E7F1> <5862> <E7F2> <E7F2> <58BA> <E7F3> <E7F3> <5967> <E7F4> <E7F4> <5A1B> <E7F5> <E7F5> <5BE4> <E7F6> <E7F6> <609F> <E7F7> <E7F7> <F9B9> <E7F8> <E7F8> <61CA> <E7F9> <E7F9> <6556> <E7FA> <E7FA> <65FF> <E7FB> <E7FB> <6664> <E7FC> <E7FC> <68A7> <E7FD> <E7FD> <6C5A> <E7FE> <E7FE> <6FB3> <E8A1> <E8A1> <70CF> <E8A2> <E8A2> <71AC> <E8A3> <E8A3> <7352> <E8A4> <E8A4> <7B7D> <E8A5> <E8A5> <8708> <E8A6> <E8A6> <8AA4> <E8A7> <E8A7> <9C32> <E8A8> <E8A8> <9F07> <E8A9> <E8A9> <5C4B> <E8AA> <E8AA> <6C83> <E8AB> <E8AB> <7344> <E8AC> <E8AC> <7389> <E8AD> <E8AD> <923A> <E8AE> <E8AE> <6EAB> <E8AF> <E8AF> <7465> <E8B0> <E8B0> <761F> <E8B1> <E8B1> <7A69> <E8B2> <E8B2> <7E15> <E8B3> <E8B3> <860A> <E8B4> <E8B4> <5140> <E8B5> <E8B5> <58C5> <E8B6> <E8B6> <64C1> <E8B7> <E8B7> <74EE> <E8B8> <E8B8> <7515> <E8B9> <E8B9> <7670> <E8BA> <E8BA> <7FC1> <E8BB> <E8BB> <9095> <E8BC> <E8BC> <96CD> <E8BD> <E8BD> <9954> <E8BE> <E8BE> <6E26> <E8BF> <E8BF> <74E6> <E8C0> <E8C1> <7AA9> <E8C2> <E8C2> <81E5> <E8C3> <E8C3> <86D9> <E8C4> <E8C4> <8778> <E8C5> <E8C5> <8A1B> <E8C6> <E8C6> <5A49> <E8C7> <E8C7> <5B8C> <E8C8> <E8C8> <5B9B> <E8C9> <E8C9> <68A1> <E8CA> <E8CA> <6900> <E8CB> <E8CB> <6D63> <E8CC> <E8CC> <73A9> <E8CD> <E8CD> <7413> <E8CE> <E8CE> <742C> <E8CF> <E8CF> <7897> <E8D0> <E8D0> <7DE9> <E8D1> <E8D1> <7FEB> <E8D2> <E8D2> <8118> <E8D3> <E8D3> <8155> <E8D4> <E8D4> <839E> <E8D5> <E8D5> <8C4C> <E8D6> <E8D6> <962E> <E8D7> <E8D7> <9811> <E8D8> <E8D8> <66F0> <E8D9> <E8D9> <5F80> <E8DA> <E8DA> <65FA> <E8DB> <E8DB> <6789> <E8DC> <E8DC> <6C6A> <E8DD> <E8DD> <738B> <E8DE> <E8DE> <502D> <E8DF> <E8DF> <5A03> <E8E0> <E8E0> <6B6A> <E8E1> <E8E1> <77EE> <E8E2> <E8E2> <5916> <E8E3> <E8E3> <5D6C> <E8E4> <E8E4> <5DCD> <E8E5> <E8E5> <7325> <E8E6> <E8E6> <754F> <E8E7> <E8E8> <F9BA> <E8E9> <E8E9> <50E5> <E8EA> <E8EA> <51F9> <E8EB> <E8EB> <582F> <E8EC> <E8EC> <592D> <E8ED> <E8ED> <5996> <E8EE> <E8EE> <59DA> <E8EF> <E8EF> <5BE5> <E8F0> <E8F1> <F9BC> <E8F2> <E8F2> <5DA2> <E8F3> <E8F3> <62D7> <E8F4> <E8F4> <6416> <E8F5> <E8F5> <6493> <E8F6> <E8F6> <64FE> <E8F7> <E8F7> <F9BE> <E8F8> <E8F8> <66DC> <E8F9> <E8F9> <F9BF> endbfrange 100 beginbfrange <E8FA> <E8FA> <6A48> <E8FB> <E8FB> <F9C0> <E8FC> <E8FC> <71FF> <E8FD> <E8FD> <7464> <E8FE> <E8FE> <F9C1> <E9A1> <E9A1> <7A88> <E9A2> <E9A2> <7AAF> <E9A3> <E9A3> <7E47> <E9A4> <E9A4> <7E5E> <E9A5> <E9A5> <8000> <E9A6> <E9A6> <8170> <E9A7> <E9A7> <F9C2> <E9A8> <E9A8> <87EF> <E9A9> <E9A9> <8981> <E9AA> <E9AA> <8B20> <E9AB> <E9AB> <9059> <E9AC> <E9AC> <F9C3> <E9AD> <E9AD> <9080> <E9AE> <E9AE> <9952> <E9AF> <E9AF> <617E> <E9B0> <E9B0> <6B32> <E9B1> <E9B1> <6D74> <E9B2> <E9B2> <7E1F> <E9B3> <E9B3> <8925> <E9B4> <E9B4> <8FB1> <E9B5> <E9B5> <4FD1> <E9B6> <E9B6> <50AD> <E9B7> <E9B7> <5197> <E9B8> <E9B8> <52C7> <E9B9> <E9B9> <57C7> <E9BA> <E9BA> <5889> <E9BB> <E9BB> <5BB9> <E9BC> <E9BC> <5EB8> <E9BD> <E9BD> <6142> <E9BE> <E9BE> <6995> <E9BF> <E9BF> <6D8C> <E9C0> <E9C0> <6E67> <E9C1> <E9C1> <6EB6> <E9C2> <E9C2> <7194> <E9C3> <E9C3> <7462> <E9C4> <E9C4> <7528> <E9C5> <E9C5> <752C> <E9C6> <E9C6> <8073> <E9C7> <E9C7> <8338> <E9C8> <E9C8> <84C9> <E9C9> <E9C9> <8E0A> <E9CA> <E9CA> <9394> <E9CB> <E9CB> <93DE> <E9CC> <E9CC> <F9C4> <E9CD> <E9CD> <4E8E> <E9CE> <E9CE> <4F51> <E9CF> <E9CF> <5076> <E9D0> <E9D0> <512A> <E9D1> <E9D1> <53C8> <E9D2> <E9D2> <53CB> <E9D3> <E9D3> <53F3> <E9D4> <E9D4> <5B87> <E9D5> <E9D5> <5BD3> <E9D6> <E9D6> <5C24> <E9D7> <E9D7> <611A> <E9D8> <E9D8> <6182> <E9D9> <E9D9> <65F4> <E9DA> <E9DA> <725B> <E9DB> <E9DB> <7397> <E9DC> <E9DC> <7440> <E9DD> <E9DD> <76C2> <E9DE> <E9DE> <7950> <E9DF> <E9DF> <7991> <E9E0> <E9E0> <79B9> <E9E1> <E9E1> <7D06> <E9E2> <E9E2> <7FBD> <E9E3> <E9E3> <828B> <E9E4> <E9E4> <85D5> <E9E5> <E9E5> <865E> <E9E6> <E9E6> <8FC2> <E9E7> <E9E7> <9047> <E9E8> <E9E8> <90F5> <E9E9> <E9E9> <91EA> <E9EA> <E9EA> <9685> <E9EB> <E9EC> <96E8> <E9ED> <E9ED> <52D6> <E9EE> <E9EE> <5F67> <E9EF> <E9EF> <65ED> <E9F0> <E9F0> <6631> <E9F1> <E9F1> <682F> <E9F2> <E9F2> <715C> <E9F3> <E9F3> <7A36> <E9F4> <E9F4> <90C1> <E9F5> <E9F5> <980A> <E9F6> <E9F6> <4E91> <E9F7> <E9F7> <F9C5> <E9F8> <E9F8> <6A52> <E9F9> <E9F9> <6B9E> <E9FA> <E9FA> <6F90> <E9FB> <E9FB> <7189> <E9FC> <E9FC> <8018> <E9FD> <E9FD> <82B8> <E9FE> <E9FE> <8553> <EAA1> <EAA1> <904B> <EAA2> <EAA2> <9695> endbfrange 100 beginbfrange <EAA3> <EAA3> <96F2> <EAA4> <EAA4> <97FB> <EAA5> <EAA5> <851A> <EAA6> <EAA6> <9B31> <EAA7> <EAA7> <4E90> <EAA8> <EAA8> <718A> <EAA9> <EAA9> <96C4> <EAAA> <EAAA> <5143> <EAAB> <EAAB> <539F> <EAAC> <EAAC> <54E1> <EAAD> <EAAD> <5713> <EAAE> <EAAE> <5712> <EAAF> <EAAF> <57A3> <EAB0> <EAB0> <5A9B> <EAB1> <EAB1> <5AC4> <EAB2> <EAB2> <5BC3> <EAB3> <EAB3> <6028> <EAB4> <EAB4> <613F> <EAB5> <EAB5> <63F4> <EAB6> <EAB6> <6C85> <EAB7> <EAB7> <6D39> <EAB8> <EAB8> <6E72> <EAB9> <EAB9> <6E90> <EABA> <EABA> <7230> <EABB> <EABB> <733F> <EABC> <EABC> <7457> <EABD> <EABD> <82D1> <EABE> <EABE> <8881> <EABF> <EABF> <8F45> <EAC0> <EAC0> <9060> <EAC1> <EAC1> <F9C6> <EAC2> <EAC2> <9662> <EAC3> <EAC3> <9858> <EAC4> <EAC4> <9D1B> <EAC5> <EAC5> <6708> <EAC6> <EAC6> <8D8A> <EAC7> <EAC7> <925E> <EAC8> <EAC8> <4F4D> <EAC9> <EAC9> <5049> <EACA> <EACA> <50DE> <EACB> <EACB> <5371> <EACC> <EACC> <570D> <EACD> <EACD> <59D4> <EACE> <EACE> <5A01> <EACF> <EACF> <5C09> <EAD0> <EAD0> <6170> <EAD1> <EAD1> <6690> <EAD2> <EAD2> <6E2D> <EAD3> <EAD3> <7232> <EAD4> <EAD4> <744B> <EAD5> <EAD5> <7DEF> <EAD6> <EAD6> <80C3> <EAD7> <EAD7> <840E> <EAD8> <EAD8> <8466> <EAD9> <EAD9> <853F> <EADA> <EADA> <875F> <EADB> <EADB> <885B> <EADC> <EADC> <8918> <EADD> <EADD> <8B02> <EADE> <EADE> <9055> <EADF> <EADF> <97CB> <EAE0> <EAE0> <9B4F> <EAE1> <EAE1> <4E73> <EAE2> <EAE2> <4F91> <EAE3> <EAE3> <5112> <EAE4> <EAE4> <516A> <EAE5> <EAE5> <F9C7> <EAE6> <EAE6> <552F> <EAE7> <EAE7> <55A9> <EAE8> <EAE8> <5B7A> <EAE9> <EAE9> <5BA5> <EAEA> <EAEB> <5E7C> <EAEC> <EAEC> <5EBE> <EAED> <EAED> <60A0> <EAEE> <EAEE> <60DF> <EAEF> <EAF0> <6108> <EAF1> <EAF1> <63C4> <EAF2> <EAF2> <6538> <EAF3> <EAF3> <6709> <EAF4> <EAF4> <F9C8> <EAF5> <EAF5> <67D4> <EAF6> <EAF6> <67DA> <EAF7> <EAF7> <F9C9> <EAF8> <EAF9> <6961> <EAFA> <EAFA> <6CB9> <EAFB> <EAFB> <6D27> <EAFC> <EAFC> <F9CA> <EAFD> <EAFD> <6E38> <EAFE> <EAFE> <F9CB> <EBA1> <EBA1> <6FE1> <EBA2> <EBA3> <7336> <EBA4> <EBA4> <F9CC> <EBA5> <EBA5> <745C> <EBA6> <EBA6> <7531> <EBA7> <EBA7> <F9CD> <EBA8> <EBA8> <7652> <EBA9> <EBAA> <F9CE> <EBAB> <EBAB> <7DAD> <EBAC> <EBAC> <81FE> <EBAD> <EBAD> <8438> endbfrange 100 beginbfrange <EBAE> <EBAE> <88D5> <EBAF> <EBAF> <8A98> <EBB0> <EBB0> <8ADB> <EBB1> <EBB1> <8AED> <EBB2> <EBB2> <8E30> <EBB3> <EBB3> <8E42> <EBB4> <EBB4> <904A> <EBB5> <EBB5> <903E> <EBB6> <EBB6> <907A> <EBB7> <EBB7> <9149> <EBB8> <EBB8> <91C9> <EBB9> <EBB9> <936E> <EBBA> <EBBB> <F9D0> <EBBC> <EBBC> <5809> <EBBD> <EBBD> <F9D2> <EBBE> <EBBE> <6BD3> <EBBF> <EBBF> <8089> <EBC0> <EBC0> <80B2> <EBC1> <EBC2> <F9D3> <EBC3> <EBC3> <5141> <EBC4> <EBC4> <596B> <EBC5> <EBC5> <5C39> <EBC6> <EBC7> <F9D5> <EBC8> <EBC8> <6F64> <EBC9> <EBC9> <73A7> <EBCA> <EBCA> <80E4> <EBCB> <EBCB> <8D07> <EBCC> <EBCC> <F9D7> <EBCD> <EBCD> <9217> <EBCE> <EBCE> <958F> <EBCF> <EBD2> <F9D8> <EBD3> <EBD3> <807F> <EBD4> <EBD4> <620E> <EBD5> <EBD5> <701C> <EBD6> <EBD6> <7D68> <EBD7> <EBD7> <878D> <EBD8> <EBD8> <F9DC> <EBD9> <EBD9> <57A0> <EBDA> <EBDA> <6069> <EBDB> <EBDB> <6147> <EBDC> <EBDC> <6BB7> <EBDD> <EBDD> <8ABE> <EBDE> <EBDE> <9280> <EBDF> <EBDF> <96B1> <EBE0> <EBE0> <4E59> <EBE1> <EBE1> <541F> <EBE2> <EBE2> <6DEB> <EBE3> <EBE3> <852D> <EBE4> <EBE4> <9670> <EBE5> <EBE5> <97F3> <EBE6> <EBE6> <98EE> <EBE7> <EBE7> <63D6> <EBE8> <EBE8> <6CE3> <EBE9> <EBE9> <9091> <EBEA> <EBEA> <51DD> <EBEB> <EBEB> <61C9> <EBEC> <EBEC> <81BA> <EBED> <EBED> <9DF9> <EBEE> <EBEE> <4F9D> <EBEF> <EBEF> <501A> <EBF0> <EBF0> <5100> <EBF1> <EBF1> <5B9C> <EBF2> <EBF2> <610F> <EBF3> <EBF3> <61FF> <EBF4> <EBF4> <64EC> <EBF5> <EBF5> <6905> <EBF6> <EBF6> <6BC5> <EBF7> <EBF7> <7591> <EBF8> <EBF8> <77E3> <EBF9> <EBF9> <7FA9> <EBFA> <EBFA> <8264> <EBFB> <EBFB> <858F> <EBFC> <EBFC> <87FB> <EBFD> <EBFD> <8863> <EBFE> <EBFE> <8ABC> <ECA1> <ECA1> <8B70> <ECA2> <ECA2> <91AB> <ECA3> <ECA3> <4E8C> <ECA4> <ECA4> <4EE5> <ECA5> <ECA5> <4F0A> <ECA6> <ECA7> <F9DD> <ECA8> <ECA8> <5937> <ECA9> <ECA9> <59E8> <ECAA> <ECAA> <F9DF> <ECAB> <ECAB> <5DF2> <ECAC> <ECAC> <5F1B> <ECAD> <ECAD> <5F5B> <ECAE> <ECAE> <6021> <ECAF> <ECB2> <F9E0> <ECB3> <ECB3> <723E> <ECB4> <ECB4> <73E5> <ECB5> <ECB5> <F9E4> <ECB6> <ECB6> <7570> <ECB7> <ECB7> <75CD> <ECB8> <ECB8> <F9E5> <ECB9> <ECB9> <79FB> <ECBA> <ECBA> <F9E6> <ECBB> <ECBB> <800C> <ECBC> <ECBC> <8033> <ECBD> <ECBD> <8084> endbfrange 100 beginbfrange <ECBE> <ECBE> <82E1> <ECBF> <ECBF> <8351> <ECC0> <ECC1> <F9E7> <ECC2> <ECC2> <8CBD> <ECC3> <ECC3> <8CB3> <ECC4> <ECC4> <9087> <ECC5> <ECC6> <F9E9> <ECC7> <ECC7> <98F4> <ECC8> <ECC8> <990C> <ECC9> <ECCA> <F9EB> <ECCB> <ECCB> <7037> <ECCC> <ECCC> <76CA> <ECCD> <ECCD> <7FCA> <ECCE> <ECCE> <7FCC> <ECCF> <ECCF> <7FFC> <ECD0> <ECD0> <8B1A> <ECD1> <ECD1> <4EBA> <ECD2> <ECD2> <4EC1> <ECD3> <ECD3> <5203> <ECD4> <ECD4> <5370> <ECD5> <ECD5> <F9ED> <ECD6> <ECD6> <54BD> <ECD7> <ECD7> <56E0> <ECD8> <ECD8> <59FB> <ECD9> <ECD9> <5BC5> <ECDA> <ECDA> <5F15> <ECDB> <ECDB> <5FCD> <ECDC> <ECDC> <6E6E> <ECDD> <ECDE> <F9EE> <ECDF> <ECDF> <7D6A> <ECE0> <ECE0> <8335> <ECE1> <ECE1> <F9F0> <ECE2> <ECE2> <8693> <ECE3> <ECE3> <8A8D> <ECE4> <ECE4> <F9F1> <ECE5> <ECE5> <976D> <ECE6> <ECE6> <9777> <ECE7> <ECE8> <F9F2> <ECE9> <ECE9> <4E00> <ECEA> <ECEA> <4F5A> <ECEB> <ECEB> <4F7E> <ECEC> <ECEC> <58F9> <ECED> <ECED> <65E5> <ECEE> <ECEE> <6EA2> <ECEF> <ECEF> <9038> <ECF0> <ECF0> <93B0> <ECF1> <ECF1> <99B9> <ECF2> <ECF2> <4EFB> <ECF3> <ECF3> <58EC> <ECF4> <ECF4> <598A> <ECF5> <ECF5> <59D9> <ECF6> <ECF6> <6041> <ECF7> <ECF8> <F9F4> <ECF9> <ECF9> <7A14> <ECFA> <ECFA> <F9F6> <ECFB> <ECFB> <834F> <ECFC> <ECFC> <8CC3> <ECFD> <ECFD> <5165> <ECFE> <ECFE> <5344> <EDA1> <EDA3> <F9F7> <EDA4> <EDA4> <4ECD> <EDA5> <EDA5> <5269> <EDA6> <EDA6> <5B55> <EDA7> <EDA7> <82BF> <EDA8> <EDA8> <4ED4> <EDA9> <EDA9> <523A> <EDAA> <EDAA> <54A8> <EDAB> <EDAB> <59C9> <EDAC> <EDAC> <59FF> <EDAD> <EDAD> <5B50> <EDAE> <EDAE> <5B57> <EDAF> <EDAF> <5B5C> <EDB0> <EDB0> <6063> <EDB1> <EDB1> <6148> <EDB2> <EDB2> <6ECB> <EDB3> <EDB3> <7099> <EDB4> <EDB4> <716E> <EDB5> <EDB5> <7386> <EDB6> <EDB6> <74F7> <EDB7> <EDB7> <75B5> <EDB8> <EDB8> <78C1> <EDB9> <EDB9> <7D2B> <EDBA> <EDBA> <8005> <EDBB> <EDBB> <81EA> <EDBC> <EDBC> <8328> <EDBD> <EDBD> <8517> <EDBE> <EDBE> <85C9> <EDBF> <EDBF> <8AEE> <EDC0> <EDC0> <8CC7> <EDC1> <EDC1> <96CC> <EDC2> <EDC2> <4F5C> <EDC3> <EDC3> <52FA> <EDC4> <EDC4> <56BC> <EDC5> <EDC5> <65AB> <EDC6> <EDC6> <6628> <EDC7> <EDC7> <707C> <EDC8> <EDC8> <70B8> <EDC9> <EDC9> <7235> <EDCA> <EDCA> <7DBD> <EDCB> <EDCB> <828D> endbfrange 100 beginbfrange <EDCC> <EDCC> <914C> <EDCD> <EDCD> <96C0> <EDCE> <EDCE> <9D72> <EDCF> <EDCF> <5B71> <EDD0> <EDD0> <68E7> <EDD1> <EDD1> <6B98> <EDD2> <EDD2> <6F7A> <EDD3> <EDD3> <76DE> <EDD4> <EDD4> <5C91> <EDD5> <EDD5> <66AB> <EDD6> <EDD6> <6F5B> <EDD7> <EDD7> <7BB4> <EDD8> <EDD8> <7C2A> <EDD9> <EDD9> <8836> <EDDA> <EDDA> <96DC> <EDDB> <EDDB> <4E08> <EDDC> <EDDC> <4ED7> <EDDD> <EDDD> <5320> <EDDE> <EDDE> <5834> <EDDF> <EDDF> <58BB> <EDE0> <EDE0> <58EF> <EDE1> <EDE1> <596C> <EDE2> <EDE2> <5C07> <EDE3> <EDE3> <5E33> <EDE4> <EDE4> <5E84> <EDE5> <EDE5> <5F35> <EDE6> <EDE6> <638C> <EDE7> <EDE7> <66B2> <EDE8> <EDE8> <6756> <EDE9> <EDE9> <6A1F> <EDEA> <EDEA> <6AA3> <EDEB> <EDEB> <6B0C> <EDEC> <EDEC> <6F3F> <EDED> <EDED> <7246> <EDEE> <EDEE> <F9FA> <EDEF> <EDEF> <7350> <EDF0> <EDF0> <748B> <EDF1> <EDF1> <7AE0> <EDF2> <EDF2> <7CA7> <EDF3> <EDF3> <8178> <EDF4> <EDF4> <81DF> <EDF5> <EDF5> <81E7> <EDF6> <EDF6> <838A> <EDF7> <EDF7> <846C> <EDF8> <EDF8> <8523> <EDF9> <EDF9> <8594> <EDFA> <EDFA> <85CF> <EDFB> <EDFB> <88DD> <EDFC> <EDFC> <8D13> <EDFD> <EDFD> <91AC> <EDFE> <EDFE> <9577> <EEA1> <EEA1> <969C> <EEA2> <EEA2> <518D> <EEA3> <EEA3> <54C9> <EEA4> <EEA4> <5728> <EEA5> <EEA5> <5BB0> <EEA6> <EEA6> <624D> <EEA7> <EEA7> <6750> <EEA8> <EEA8> <683D> <EEA9> <EEA9> <6893> <EEAA> <EEAA> <6E3D> <EEAB> <EEAB> <6ED3> <EEAC> <EEAC> <707D> <EEAD> <EEAD> <7E21> <EEAE> <EEAE> <88C1> <EEAF> <EEAF> <8CA1> <EEB0> <EEB0> <8F09> <EEB1> <EEB1> <9F4B> <EEB2> <EEB2> <9F4E> <EEB3> <EEB3> <722D> <EEB4> <EEB4> <7B8F> <EEB5> <EEB5> <8ACD> <EEB6> <EEB6> <931A> <EEB7> <EEB7> <4F47> <EEB8> <EEB8> <4F4E> <EEB9> <EEB9> <5132> <EEBA> <EEBA> <5480> <EEBB> <EEBB> <59D0> <EEBC> <EEBC> <5E95> <EEBD> <EEBD> <62B5> <EEBE> <EEBE> <6775> <EEBF> <EEBF> <696E> <EEC0> <EEC0> <6A17> <EEC1> <EEC1> <6CAE> <EEC2> <EEC2> <6E1A> <EEC3> <EEC3> <72D9> <EEC4> <EEC4> <732A> <EEC5> <EEC5> <75BD> <EEC6> <EEC6> <7BB8> <EEC7> <EEC7> <7D35> <EEC8> <EEC8> <82E7> <EEC9> <EEC9> <83F9> <EECA> <EECA> <8457> <EECB> <EECB> <85F7> <EECC> <EECC> <8A5B> <EECD> <EECD> <8CAF> <EECE> <EECE> <8E87> <EECF> <EECF> <9019> <EED0> <EED0> <90B8> <EED1> <EED1> <96CE> endbfrange 100 beginbfrange <EED2> <EED2> <9F5F> <EED3> <EED3> <52E3> <EED4> <EED4> <540A> <EED5> <EED5> <5AE1> <EED6> <EED6> <5BC2> <EED7> <EED7> <6458> <EED8> <EED8> <6575> <EED9> <EED9> <6EF4> <EEDA> <EEDA> <72C4> <EEDB> <EEDB> <F9FB> <EEDC> <EEDC> <7684> <EEDD> <EEDD> <7A4D> <EEDE> <EEDE> <7B1B> <EEDF> <EEDF> <7C4D> <EEE0> <EEE0> <7E3E> <EEE1> <EEE1> <7FDF> <EEE2> <EEE2> <837B> <EEE3> <EEE3> <8B2B> <EEE4> <EEE4> <8CCA> <EEE5> <EEE5> <8D64> <EEE6> <EEE6> <8DE1> <EEE7> <EEE7> <8E5F> <EEE8> <EEE8> <8FEA> <EEE9> <EEE9> <8FF9> <EEEA> <EEEA> <9069> <EEEB> <EEEB> <93D1> <EEEC> <EEEC> <4F43> <EEED> <EEED> <4F7A> <EEEE> <EEEE> <50B3> <EEEF> <EEEF> <5168> <EEF0> <EEF0> <5178> <EEF1> <EEF1> <524D> <EEF2> <EEF2> <526A> <EEF3> <EEF3> <5861> <EEF4> <EEF4> <587C> <EEF5> <EEF5> <5960> <EEF6> <EEF6> <5C08> <EEF7> <EEF7> <5C55> <EEF8> <EEF8> <5EDB> <EEF9> <EEF9> <609B> <EEFA> <EEFA> <6230> <EEFB> <EEFB> <6813> <EEFC> <EEFC> <6BBF> <EEFD> <EEFD> <6C08> <EEFE> <EEFE> <6FB1> <EFA1> <EFA1> <714E> <EFA2> <EFA2> <7420> <EFA3> <EFA3> <7530> <EFA4> <EFA4> <7538> <EFA5> <EFA5> <7551> <EFA6> <EFA6> <7672> <EFA7> <EFA7> <7B4C> <EFA8> <EFA8> <7B8B> <EFA9> <EFA9> <7BAD> <EFAA> <EFAA> <7BC6> <EFAB> <EFAB> <7E8F> <EFAC> <EFAC> <8A6E> <EFAD> <EFAD> <8F3E> <EFAE> <EFAE> <8F49> <EFAF> <EFAF> <923F> <EFB0> <EFB0> <9293> <EFB1> <EFB1> <9322> <EFB2> <EFB2> <942B> <EFB3> <EFB3> <96FB> <EFB4> <EFB4> <985A> <EFB5> <EFB5> <986B> <EFB6> <EFB6> <991E> <EFB7> <EFB7> <5207> <EFB8> <EFB8> <622A> <EFB9> <EFB9> <6298> <EFBA> <EFBA> <6D59> <EFBB> <EFBB> <7664> <EFBC> <EFBC> <7ACA> <EFBD> <EFBD> <7BC0> <EFBE> <EFBE> <7D76> <EFBF> <EFBF> <5360> <EFC0> <EFC0> <5CBE> <EFC1> <EFC1> <5E97> <EFC2> <EFC2> <6F38> <EFC3> <EFC3> <70B9> <EFC4> <EFC4> <7C98> <EFC5> <EFC5> <9711> <EFC6> <EFC6> <9B8E> <EFC7> <EFC7> <9EDE> <EFC8> <EFC8> <63A5> <EFC9> <EFC9> <647A> <EFCA> <EFCA> <8776> <EFCB> <EFCB> <4E01> <EFCC> <EFCC> <4E95> <EFCD> <EFCD> <4EAD> <EFCE> <EFCE> <505C> <EFCF> <EFCF> <5075> <EFD0> <EFD0> <5448> <EFD1> <EFD1> <59C3> <EFD2> <EFD2> <5B9A> <EFD3> <EFD3> <5E40> <EFD4> <EFD4> <5EAD> <EFD5> <EFD5> <5EF7> <EFD6> <EFD6> <5F81> <EFD7> <EFD7> <60C5> endbfrange 100 beginbfrange <EFD8> <EFD8> <633A> <EFD9> <EFD9> <653F> <EFDA> <EFDA> <6574> <EFDB> <EFDB> <65CC> <EFDC> <EFDC> <6676> <EFDD> <EFDD> <6678> <EFDE> <EFDE> <67FE> <EFDF> <EFDF> <6968> <EFE0> <EFE0> <6A89> <EFE1> <EFE1> <6B63> <EFE2> <EFE2> <6C40> <EFE3> <EFE3> <6DC0> <EFE4> <EFE4> <6DE8> <EFE5> <EFE5> <6E1F> <EFE6> <EFE6> <6E5E> <EFE7> <EFE7> <701E> <EFE8> <EFE8> <70A1> <EFE9> <EFE9> <738E> <EFEA> <EFEA> <73FD> <EFEB> <EFEB> <753A> <EFEC> <EFEC> <775B> <EFED> <EFED> <7887> <EFEE> <EFEE> <798E> <EFEF> <EFEF> <7A0B> <EFF0> <EFF0> <7A7D> <EFF1> <EFF1> <7CBE> <EFF2> <EFF2> <7D8E> <EFF3> <EFF3> <8247> <EFF4> <EFF4> <8A02> <EFF5> <EFF5> <8AEA> <EFF6> <EFF6> <8C9E> <EFF7> <EFF7> <912D> <EFF8> <EFF8> <914A> <EFF9> <EFF9> <91D8> <EFFA> <EFFA> <9266> <EFFB> <EFFB> <92CC> <EFFC> <EFFC> <9320> <EFFD> <EFFD> <9706> <EFFE> <EFFE> <9756> <F0A1> <F0A1> <975C> <F0A2> <F0A2> <9802> <F0A3> <F0A3> <9F0E> <F0A4> <F0A4> <5236> <F0A5> <F0A5> <5291> <F0A6> <F0A6> <557C> <F0A7> <F0A7> <5824> <F0A8> <F0A8> <5E1D> <F0A9> <F0A9> <5F1F> <F0AA> <F0AA> <608C> <F0AB> <F0AB> <63D0> <F0AC> <F0AC> <68AF> <F0AD> <F0AD> <6FDF> <F0AE> <F0AE> <796D> <F0AF> <F0AF> <7B2C> <F0B0> <F0B0> <81CD> <F0B1> <F0B1> <85BA> <F0B2> <F0B2> <88FD> <F0B3> <F0B3> <8AF8> <F0B4> <F0B4> <8E44> <F0B5> <F0B5> <918D> <F0B6> <F0B6> <9664> <F0B7> <F0B7> <969B> <F0B8> <F0B8> <973D> <F0B9> <F0B9> <984C> <F0BA> <F0BA> <9F4A> <F0BB> <F0BB> <4FCE> <F0BC> <F0BC> <5146> <F0BD> <F0BD> <51CB> <F0BE> <F0BE> <52A9> <F0BF> <F0BF> <5632> <F0C0> <F0C0> <5F14> <F0C1> <F0C1> <5F6B> <F0C2> <F0C2> <63AA> <F0C3> <F0C3> <64CD> <F0C4> <F0C4> <65E9> <F0C5> <F0C5> <6641> <F0C6> <F0C6> <66FA> <F0C7> <F0C7> <66F9> <F0C8> <F0C8> <671D> <F0C9> <F0C9> <689D> <F0CA> <F0CA> <68D7> <F0CB> <F0CB> <69FD> <F0CC> <F0CC> <6F15> <F0CD> <F0CD> <6F6E> <F0CE> <F0CE> <7167> <F0CF> <F0CF> <71E5> <F0D0> <F0D0> <722A> <F0D1> <F0D1> <74AA> <F0D2> <F0D2> <773A> <F0D3> <F0D3> <7956> <F0D4> <F0D4> <795A> <F0D5> <F0D5> <79DF> <F0D6> <F0D6> <7A20> <F0D7> <F0D7> <7A95> <F0D8> <F0D8> <7C97> <F0D9> <F0D9> <7CDF> <F0DA> <F0DA> <7D44> <F0DB> <F0DB> <7E70> <F0DC> <F0DC> <8087> <F0DD> <F0DD> <85FB> endbfrange 100 beginbfrange <F0DE> <F0DE> <86A4> <F0DF> <F0DF> <8A54> <F0E0> <F0E0> <8ABF> <F0E1> <F0E1> <8D99> <F0E2> <F0E2> <8E81> <F0E3> <F0E3> <9020> <F0E4> <F0E4> <906D> <F0E5> <F0E5> <91E3> <F0E6> <F0E6> <963B> <F0E7> <F0E7> <96D5> <F0E8> <F0E8> <9CE5> <F0E9> <F0E9> <65CF> <F0EA> <F0EA> <7C07> <F0EB> <F0EB> <8DB3> <F0EC> <F0EC> <93C3> <F0ED> <F0ED> <5B58> <F0EE> <F0EE> <5C0A> <F0EF> <F0EF> <5352> <F0F0> <F0F0> <62D9> <F0F1> <F0F1> <731D> <F0F2> <F0F2> <5027> <F0F3> <F0F3> <5B97> <F0F4> <F0F4> <5F9E> <F0F5> <F0F5> <60B0> <F0F6> <F0F6> <616B> <F0F7> <F0F7> <68D5> <F0F8> <F0F8> <6DD9> <F0F9> <F0F9> <742E> <F0FA> <F0FA> <7A2E> <F0FB> <F0FB> <7D42> <F0FC> <F0FC> <7D9C> <F0FD> <F0FD> <7E31> <F0FE> <F0FE> <816B> <F1A1> <F1A1> <8E2A> <F1A2> <F1A2> <8E35> <F1A3> <F1A3> <937E> <F1A4> <F1A4> <9418> <F1A5> <F1A5> <4F50> <F1A6> <F1A6> <5750> <F1A7> <F1A7> <5DE6> <F1A8> <F1A8> <5EA7> <F1A9> <F1A9> <632B> <F1AA> <F1AA> <7F6A> <F1AB> <F1AB> <4E3B> <F1AC> <F1AC> <4F4F> <F1AD> <F1AD> <4F8F> <F1AE> <F1AE> <505A> <F1AF> <F1AF> <59DD> <F1B0> <F1B0> <80C4> <F1B1> <F1B1> <546A> <F1B2> <F1B2> <5468> <F1B3> <F1B3> <55FE> <F1B4> <F1B4> <594F> <F1B5> <F1B5> <5B99> <F1B6> <F1B6> <5DDE> <F1B7> <F1B7> <5EDA> <F1B8> <F1B8> <665D> <F1B9> <F1B9> <6731> <F1BA> <F1BA> <67F1> <F1BB> <F1BB> <682A> <F1BC> <F1BC> <6CE8> <F1BD> <F1BD> <6D32> <F1BE> <F1BE> <6E4A> <F1BF> <F1BF> <6F8D> <F1C0> <F1C0> <70B7> <F1C1> <F1C1> <73E0> <F1C2> <F1C2> <7587> <F1C3> <F1C3> <7C4C> <F1C4> <F1C4> <7D02> <F1C5> <F1C5> <7D2C> <F1C6> <F1C6> <7DA2> <F1C7> <F1C7> <821F> <F1C8> <F1C8> <86DB> <F1C9> <F1C9> <8A3B> <F1CA> <F1CA> <8A85> <F1CB> <F1CB> <8D70> <F1CC> <F1CC> <8E8A> <F1CD> <F1CD> <8F33> <F1CE> <F1CE> <9031> <F1CF> <F1CF> <914E> <F1D0> <F1D0> <9152> <F1D1> <F1D1> <9444> <F1D2> <F1D2> <99D0> <F1D3> <F1D3> <7AF9> <F1D4> <F1D4> <7CA5> <F1D5> <F1D5> <4FCA> <F1D6> <F1D6> <5101> <F1D7> <F1D7> <51C6> <F1D8> <F1D8> <57C8> <F1D9> <F1D9> <5BEF> <F1DA> <F1DA> <5CFB> <F1DB> <F1DB> <6659> <F1DC> <F1DC> <6A3D> <F1DD> <F1DD> <6D5A> <F1DE> <F1DE> <6E96> <F1DF> <F1DF> <6FEC> <F1E0> <F1E0> <710C> <F1E1> <F1E1> <756F> <F1E2> <F1E2> <7AE3> <F1E3> <F1E3> <8822> endbfrange 100 beginbfrange <F1E4> <F1E4> <9021> <F1E5> <F1E5> <9075> <F1E6> <F1E6> <96CB> <F1E7> <F1E7> <99FF> <F1E8> <F1E8> <8301> <F1E9> <F1E9> <4E2D> <F1EA> <F1EA> <4EF2> <F1EB> <F1EB> <8846> <F1EC> <F1EC> <91CD> <F1ED> <F1ED> <537D> <F1EE> <F1EE> <6ADB> <F1EF> <F1EF> <696B> <F1F0> <F1F0> <6C41> <F1F1> <F1F1> <847A> <F1F2> <F1F2> <589E> <F1F3> <F1F3> <618E> <F1F4> <F1F4> <66FE> <F1F5> <F1F5> <62EF> <F1F6> <F1F6> <70DD> <F1F7> <F1F7> <7511> <F1F8> <F1F8> <75C7> <F1F9> <F1F9> <7E52> <F1FA> <F1FA> <84B8> <F1FB> <F1FB> <8B49> <F1FC> <F1FC> <8D08> <F1FD> <F1FD> <4E4B> <F1FE> <F1FE> <53EA> <F2A1> <F2A1> <54AB> <F2A2> <F2A2> <5730> <F2A3> <F2A3> <5740> <F2A4> <F2A4> <5FD7> <F2A5> <F2A5> <6301> <F2A6> <F2A6> <6307> <F2A7> <F2A7> <646F> <F2A8> <F2A8> <652F> <F2A9> <F2A9> <65E8> <F2AA> <F2AA> <667A> <F2AB> <F2AB> <679D> <F2AC> <F2AC> <67B3> <F2AD> <F2AD> <6B62> <F2AE> <F2AE> <6C60> <F2AF> <F2AF> <6C9A> <F2B0> <F2B0> <6F2C> <F2B1> <F2B1> <77E5> <F2B2> <F2B2> <7825> <F2B3> <F2B3> <7949> <F2B4> <F2B4> <7957> <F2B5> <F2B5> <7D19> <F2B6> <F2B6> <80A2> <F2B7> <F2B7> <8102> <F2B8> <F2B8> <81F3> <F2B9> <F2B9> <829D> <F2BA> <F2BA> <82B7> <F2BB> <F2BB> <8718> <F2BC> <F2BC> <8A8C> <F2BD> <F2BD> <F9FC> <F2BE> <F2BE> <8D04> <F2BF> <F2BF> <8DBE> <F2C0> <F2C0> <9072> <F2C1> <F2C1> <76F4> <F2C2> <F2C2> <7A19> <F2C3> <F2C3> <7A37> <F2C4> <F2C4> <7E54> <F2C5> <F2C5> <8077> <F2C6> <F2C6> <5507> <F2C7> <F2C7> <55D4> <F2C8> <F2C8> <5875> <F2C9> <F2C9> <632F> <F2CA> <F2CA> <6422> <F2CB> <F2CB> <6649> <F2CC> <F2CC> <664B> <F2CD> <F2CD> <686D> <F2CE> <F2CE> <699B> <F2CF> <F2CF> <6B84> <F2D0> <F2D0> <6D25> <F2D1> <F2D1> <6EB1> <F2D2> <F2D2> <73CD> <F2D3> <F2D3> <7468> <F2D4> <F2D4> <74A1> <F2D5> <F2D5> <755B> <F2D6> <F2D6> <75B9> <F2D7> <F2D7> <76E1> <F2D8> <F2D8> <771E> <F2D9> <F2D9> <778B> <F2DA> <F2DA> <79E6> <F2DB> <F2DB> <7E09> <F2DC> <F2DC> <7E1D> <F2DD> <F2DD> <81FB> <F2DE> <F2DE> <852F> <F2DF> <F2DF> <8897> <F2E0> <F2E0> <8A3A> <F2E1> <F2E1> <8CD1> <F2E2> <F2E2> <8EEB> <F2E3> <F2E3> <8FB0> <F2E4> <F2E4> <9032> <F2E5> <F2E5> <93AD> <F2E6> <F2E6> <9663> <F2E7> <F2E7> <9673> <F2E8> <F2E8> <9707> <F2E9> <F2E9> <4F84> endbfrange 100 beginbfrange <F2EA> <F2EA> <53F1> <F2EB> <F2EB> <59EA> <F2EC> <F2EC> <5AC9> <F2ED> <F2ED> <5E19> <F2EE> <F2EE> <684E> <F2EF> <F2EF> <74C6> <F2F0> <F2F0> <75BE> <F2F1> <F2F1> <79E9> <F2F2> <F2F2> <7A92> <F2F3> <F2F3> <81A3> <F2F4> <F2F4> <86ED> <F2F5> <F2F5> <8CEA> <F2F6> <F2F6> <8DCC> <F2F7> <F2F7> <8FED> <F2F8> <F2F8> <659F> <F2F9> <F2F9> <6715> <F2FA> <F2FA> <F9FD> <F2FB> <F2FB> <57F7> <F2FC> <F2FC> <6F57> <F2FD> <F2FD> <7DDD> <F2FE> <F2FE> <8F2F> <F3A1> <F3A1> <93F6> <F3A2> <F3A2> <96C6> <F3A3> <F3A3> <5FB5> <F3A4> <F3A4> <61F2> <F3A5> <F3A5> <6F84> <F3A6> <F3A6> <4E14> <F3A7> <F3A7> <4F98> <F3A8> <F3A8> <501F> <F3A9> <F3A9> <53C9> <F3AA> <F3AA> <55DF> <F3AB> <F3AB> <5D6F> <F3AC> <F3AC> <5DEE> <F3AD> <F3AD> <6B21> <F3AE> <F3AE> <6B64> <F3AF> <F3AF> <78CB> <F3B0> <F3B0> <7B9A> <F3B1> <F3B1> <F9FE> <F3B2> <F3B2> <8E49> <F3B3> <F3B3> <8ECA> <F3B4> <F3B4> <906E> <F3B5> <F3B5> <6349> <F3B6> <F3B6> <643E> <F3B7> <F3B7> <7740> <F3B8> <F3B8> <7A84> <F3B9> <F3B9> <932F> <F3BA> <F3BA> <947F> <F3BB> <F3BB> <9F6A> <F3BC> <F3BC> <64B0> <F3BD> <F3BD> <6FAF> <F3BE> <F3BE> <71E6> <F3BF> <F3BF> <74A8> <F3C0> <F3C0> <74DA> <F3C1> <F3C1> <7AC4> <F3C2> <F3C2> <7C12> <F3C3> <F3C3> <7E82> <F3C4> <F3C4> <7CB2> <F3C5> <F3C5> <7E98> <F3C6> <F3C6> <8B9A> <F3C7> <F3C7> <8D0A> <F3C8> <F3C8> <947D> <F3C9> <F3C9> <9910> <F3CA> <F3CA> <994C> <F3CB> <F3CB> <5239> <F3CC> <F3CC> <5BDF> <F3CD> <F3CD> <64E6> <F3CE> <F3CE> <672D> <F3CF> <F3CF> <7D2E> <F3D0> <F3D0> <50ED> <F3D1> <F3D1> <53C3> <F3D2> <F3D2> <5879> <F3D3> <F3D4> <6158> <F3D5> <F3D5> <61FA> <F3D6> <F3D6> <65AC> <F3D7> <F3D7> <7AD9> <F3D8> <F3D8> <8B92> <F3D9> <F3D9> <8B96> <F3DA> <F3DA> <5009> <F3DB> <F3DB> <5021> <F3DC> <F3DC> <5275> <F3DD> <F3DD> <5531> <F3DE> <F3DE> <5A3C> <F3DF> <F3DF> <5EE0> <F3E0> <F3E0> <5F70> <F3E1> <F3E1> <6134> <F3E2> <F3E2> <655E> <F3E3> <F3E3> <660C> <F3E4> <F3E4> <6636> <F3E5> <F3E5> <66A2> <F3E6> <F3E6> <69CD> <F3E7> <F3E7> <6EC4> <F3E8> <F3E8> <6F32> <F3E9> <F3E9> <7316> <F3EA> <F3EA> <7621> <F3EB> <F3EB> <7A93> <F3EC> <F3EC> <8139> <F3ED> <F3ED> <8259> <F3EE> <F3EE> <83D6> <F3EF> <F3EF> <84BC> <F3F0> <F3F0> <50B5> endbfrange 100 beginbfrange <F3F1> <F3F1> <57F0> <F3F2> <F3F2> <5BC0> <F3F3> <F3F3> <5BE8> <F3F4> <F3F4> <5F69> <F3F5> <F3F5> <63A1> <F3F6> <F3F6> <7826> <F3F7> <F3F7> <7DB5> <F3F8> <F3F8> <83DC> <F3F9> <F3F9> <8521> <F3FA> <F3FA> <91C7> <F3FB> <F3FB> <91F5> <F3FC> <F3FC> <518A> <F3FD> <F3FD> <67F5> <F3FE> <F3FE> <7B56> <F4A1> <F4A1> <8CAC> <F4A2> <F4A2> <51C4> <F4A3> <F4A3> <59BB> <F4A4> <F4A4> <60BD> <F4A5> <F4A5> <8655> <F4A6> <F4A6> <501C> <F4A7> <F4A7> <F9FF> <F4A8> <F4A8> <5254> <F4A9> <F4A9> <5C3A> <F4AA> <F4AA> <617D> <F4AB> <F4AB> <621A> <F4AC> <F4AC> <62D3> <F4AD> <F4AD> <64F2> <F4AE> <F4AE> <65A5> <F4AF> <F4AF> <6ECC> <F4B0> <F4B0> <7620> <F4B1> <F4B1> <810A> <F4B2> <F4B2> <8E60> <F4B3> <F4B3> <965F> <F4B4> <F4B4> <96BB> <F4B5> <F4B5> <4EDF> <F4B6> <F4B6> <5343> <F4B7> <F4B7> <5598> <F4B8> <F4B8> <5929> <F4B9> <F4B9> <5DDD> <F4BA> <F4BA> <64C5> <F4BB> <F4BB> <6CC9> <F4BC> <F4BC> <6DFA> <F4BD> <F4BD> <7394> <F4BE> <F4BE> <7A7F> <F4BF> <F4BF> <821B> <F4C0> <F4C0> <85A6> <F4C1> <F4C1> <8CE4> <F4C2> <F4C2> <8E10> <F4C3> <F4C3> <9077> <F4C4> <F4C4> <91E7> <F4C5> <F4C5> <95E1> <F4C6> <F4C6> <9621> <F4C7> <F4C7> <97C6> <F4C8> <F4C8> <51F8> <F4C9> <F4C9> <54F2> <F4CA> <F4CA> <5586> <F4CB> <F4CB> <5FB9> <F4CC> <F4CC> <64A4> <F4CD> <F4CD> <6F88> <F4CE> <F4CE> <7DB4> <F4CF> <F4CF> <8F1F> <F4D0> <F4D0> <8F4D> <F4D1> <F4D1> <9435> <F4D2> <F4D2> <50C9> <F4D3> <F4D3> <5C16> <F4D4> <F4D4> <6CBE> <F4D5> <F4D5> <6DFB> <F4D6> <F4D6> <751B> <F4D7> <F4D7> <77BB> <F4D8> <F4D8> <7C3D> <F4D9> <F4D9> <7C64> <F4DA> <F4DA> <8A79> <F4DB> <F4DB> <8AC2> <F4DC> <F4DC> <581E> <F4DD> <F4DD> <59BE> <F4DE> <F4DE> <5E16> <F4DF> <F4DF> <6377> <F4E0> <F4E0> <7252> <F4E1> <F4E1> <758A> <F4E2> <F4E2> <776B> <F4E3> <F4E3> <8ADC> <F4E4> <F4E4> <8CBC> <F4E5> <F4E5> <8F12> <F4E6> <F4E6> <5EF3> <F4E7> <F4E7> <6674> <F4E8> <F4E8> <6DF8> <F4E9> <F4E9> <807D> <F4EA> <F4EA> <83C1> <F4EB> <F4EB> <8ACB> <F4EC> <F4EC> <9751> <F4ED> <F4ED> <9BD6> <F4EE> <F4EE> <FA00> <F4EF> <F4EF> <5243> <F4F0> <F4F0> <66FF> <F4F1> <F4F1> <6D95> <F4F2> <F4F2> <6EEF> <F4F3> <F4F3> <7DE0> <F4F4> <F4F4> <8AE6> <F4F5> <F4F5> <902E> <F4F6> <F4F6> <905E> endbfrange 100 beginbfrange <F4F7> <F4F7> <9AD4> <F4F8> <F4F8> <521D> <F4F9> <F4F9> <527F> <F4FA> <F4FA> <54E8> <F4FB> <F4FB> <6194> <F4FC> <F4FC> <6284> <F4FD> <F4FD> <62DB> <F4FE> <F4FE> <68A2> <F5A1> <F5A1> <6912> <F5A2> <F5A2> <695A> <F5A3> <F5A3> <6A35> <F5A4> <F5A4> <7092> <F5A5> <F5A5> <7126> <F5A6> <F5A6> <785D> <F5A7> <F5A7> <7901> <F5A8> <F5A8> <790E> <F5A9> <F5A9> <79D2> <F5AA> <F5AA> <7A0D> <F5AB> <F5AB> <8096> <F5AC> <F5AC> <8278> <F5AD> <F5AD> <82D5> <F5AE> <F5AE> <8349> <F5AF> <F5AF> <8549> <F5B0> <F5B0> <8C82> <F5B1> <F5B1> <8D85> <F5B2> <F5B2> <9162> <F5B3> <F5B3> <918B> <F5B4> <F5B4> <91AE> <F5B5> <F5B5> <4FC3> <F5B6> <F5B6> <56D1> <F5B7> <F5B7> <71ED> <F5B8> <F5B8> <77D7> <F5B9> <F5B9> <8700> <F5BA> <F5BA> <89F8> <F5BB> <F5BB> <5BF8> <F5BC> <F5BC> <5FD6> <F5BD> <F5BD> <6751> <F5BE> <F5BE> <90A8> <F5BF> <F5BF> <53E2> <F5C0> <F5C0> <585A> <F5C1> <F5C1> <5BF5> <F5C2> <F5C2> <60A4> <F5C3> <F5C3> <6181> <F5C4> <F5C4> <6460> <F5C5> <F5C5> <7E3D> <F5C6> <F5C6> <8070> <F5C7> <F5C7> <8525> <F5C8> <F5C8> <9283> <F5C9> <F5C9> <64AE> <F5CA> <F5CA> <50AC> <F5CB> <F5CB> <5D14> <F5CC> <F5CC> <6700> <F5CD> <F5CD> <589C> <F5CE> <F5CE> <62BD> <F5CF> <F5CF> <63A8> <F5D0> <F5D0> <690E> <F5D1> <F5D1> <6978> <F5D2> <F5D2> <6A1E> <F5D3> <F5D3> <6E6B> <F5D4> <F5D4> <76BA> <F5D5> <F5D5> <79CB> <F5D6> <F5D6> <82BB> <F5D7> <F5D7> <8429> <F5D8> <F5D8> <8ACF> <F5D9> <F5D9> <8DA8> <F5DA> <F5DA> <8FFD> <F5DB> <F5DB> <9112> <F5DC> <F5DC> <914B> <F5DD> <F5DD> <919C> <F5DE> <F5DE> <9310> <F5DF> <F5DF> <9318> <F5E0> <F5E0> <939A> <F5E1> <F5E1> <96DB> <F5E2> <F5E2> <9A36> <F5E3> <F5E3> <9C0D> <F5E4> <F5E4> <4E11> <F5E5> <F5E5> <755C> <F5E6> <F5E6> <795D> <F5E7> <F5E7> <7AFA> <F5E8> <F5E8> <7B51> <F5E9> <F5E9> <7BC9> <F5EA> <F5EA> <7E2E> <F5EB> <F5EB> <84C4> <F5EC> <F5EC> <8E59> <F5ED> <F5ED> <8E74> <F5EE> <F5EE> <8EF8> <F5EF> <F5EF> <9010> <F5F0> <F5F0> <6625> <F5F1> <F5F1> <693F> <F5F2> <F5F2> <7443> <F5F3> <F5F3> <51FA> <F5F4> <F5F4> <672E> <F5F5> <F5F5> <9EDC> <F5F6> <F5F6> <5145> <F5F7> <F5F7> <5FE0> <F5F8> <F5F8> <6C96> <F5F9> <F5F9> <87F2> <F5FA> <F5FA> <885D> <F5FB> <F5FB> <8877> <F5FC> <F5FC> <60B4> endbfrange 100 beginbfrange <F5FD> <F5FD> <81B5> <F5FE> <F5FE> <8403> <F6A1> <F6A1> <8D05> <F6A2> <F6A2> <53D6> <F6A3> <F6A3> <5439> <F6A4> <F6A4> <5634> <F6A5> <F6A5> <5A36> <F6A6> <F6A6> <5C31> <F6A7> <F6A7> <708A> <F6A8> <F6A8> <7FE0> <F6A9> <F6A9> <805A> <F6AA> <F6AA> <8106> <F6AB> <F6AB> <81ED> <F6AC> <F6AC> <8DA3> <F6AD> <F6AD> <9189> <F6AE> <F6AE> <9A5F> <F6AF> <F6AF> <9DF2> <F6B0> <F6B0> <5074> <F6B1> <F6B1> <4EC4> <F6B2> <F6B2> <53A0> <F6B3> <F6B3> <60FB> <F6B4> <F6B4> <6E2C> <F6B5> <F6B5> <5C64> <F6B6> <F6B6> <4F88> <F6B7> <F6B7> <5024> <F6B8> <F6B8> <55E4> <F6B9> <F6B9> <5CD9> <F6BA> <F6BA> <5E5F> <F6BB> <F6BB> <6065> <F6BC> <F6BC> <6894> <F6BD> <F6BD> <6CBB> <F6BE> <F6BE> <6DC4> <F6BF> <F6BF> <71BE> <F6C0> <F6C0> <75D4> <F6C1> <F6C1> <75F4> <F6C2> <F6C2> <7661> <F6C3> <F6C3> <7A1A> <F6C4> <F6C4> <7A49> <F6C5> <F6C5> <7DC7> <F6C6> <F6C6> <7DFB> <F6C7> <F6C7> <7F6E> <F6C8> <F6C8> <81F4> <F6C9> <F6C9> <86A9> <F6CA> <F6CA> <8F1C> <F6CB> <F6CB> <96C9> <F6CC> <F6CC> <99B3> <F6CD> <F6CD> <9F52> <F6CE> <F6CE> <5247> <F6CF> <F6CF> <52C5> <F6D0> <F6D0> <98ED> <F6D1> <F6D1> <89AA> <F6D2> <F6D2> <4E03> <F6D3> <F6D3> <67D2> <F6D4> <F6D4> <6F06> <F6D5> <F6D5> <4FB5> <F6D6> <F6D6> <5BE2> <F6D7> <F6D7> <6795> <F6D8> <F6D8> <6C88> <F6D9> <F6D9> <6D78> <F6DA> <F6DA> <741B> <F6DB> <F6DB> <7827> <F6DC> <F6DC> <91DD> <F6DD> <F6DD> <937C> <F6DE> <F6DE> <87C4> <F6DF> <F6DF> <79E4> <F6E0> <F6E0> <7A31> <F6E1> <F6E1> <5FEB> <F6E2> <F6E2> <4ED6> <F6E3> <F6E3> <54A4> <F6E4> <F6E4> <553E> <F6E5> <F6E5> <58AE> <F6E6> <F6E6> <59A5> <F6E7> <F6E7> <60F0> <F6E8> <F6E8> <6253> <F6E9> <F6E9> <62D6> <F6EA> <F6EA> <6736> <F6EB> <F6EB> <6955> <F6EC> <F6EC> <8235> <F6ED> <F6ED> <9640> <F6EE> <F6EE> <99B1> <F6EF> <F6EF> <99DD> <F6F0> <F6F0> <502C> <F6F1> <F6F1> <5353> <F6F2> <F6F2> <5544> <F6F3> <F6F3> <577C> <F6F4> <F6F4> <FA01> <F6F5> <F6F5> <6258> <F6F6> <F6F6> <FA02> <F6F7> <F6F7> <64E2> <F6F8> <F6F8> <666B> <F6F9> <F6F9> <67DD> <F6FA> <F6FA> <6FC1> <F6FB> <F6FB> <6FEF> <F6FC> <F6FC> <7422> <F6FD> <F6FD> <7438> <F6FE> <F6FE> <8A17> <F7A1> <F7A1> <9438> <F7A2> <F7A2> <5451> <F7A3> <F7A3> <5606> <F7A4> <F7A4> <5766> endbfrange 100 beginbfrange <F7A5> <F7A5> <5F48> <F7A6> <F7A6> <619A> <F7A7> <F7A7> <6B4E> <F7A8> <F7A8> <7058> <F7A9> <F7A9> <70AD> <F7AA> <F7AA> <7DBB> <F7AB> <F7AB> <8A95> <F7AC> <F7AC> <596A> <F7AD> <F7AD> <812B> <F7AE> <F7AE> <63A2> <F7AF> <F7AF> <7708> <F7B0> <F7B0> <803D> <F7B1> <F7B1> <8CAA> <F7B2> <F7B2> <5854> <F7B3> <F7B3> <642D> <F7B4> <F7B4> <69BB> <F7B5> <F7B5> <5B95> <F7B6> <F7B6> <5E11> <F7B7> <F7B7> <6E6F> <F7B8> <F7B8> <FA03> <F7B9> <F7B9> <8569> <F7BA> <F7BA> <514C> <F7BB> <F7BB> <53F0> <F7BC> <F7BC> <592A> <F7BD> <F7BD> <6020> <F7BE> <F7BE> <614B> <F7BF> <F7BF> <6B86> <F7C0> <F7C0> <6C70> <F7C1> <F7C1> <6CF0> <F7C2> <F7C2> <7B1E> <F7C3> <F7C3> <80CE> <F7C4> <F7C4> <82D4> <F7C5> <F7C5> <8DC6> <F7C6> <F7C6> <90B0> <F7C7> <F7C7> <98B1> <F7C8> <F7C8> <FA04> <F7C9> <F7C9> <64C7> <F7CA> <F7CA> <6FA4> <F7CB> <F7CB> <6491> <F7CC> <F7CC> <6504> <F7CD> <F7CD> <514E> <F7CE> <F7CE> <5410> <F7CF> <F7CF> <571F> <F7D0> <F7D0> <8A0E> <F7D1> <F7D1> <615F> <F7D2> <F7D2> <6876> <F7D3> <F7D3> <FA05> <F7D4> <F7D4> <75DB> <F7D5> <F7D5> <7B52> <F7D6> <F7D6> <7D71> <F7D7> <F7D7> <901A> <F7D8> <F7D8> <5806> <F7D9> <F7D9> <69CC> <F7DA> <F7DA> <817F> <F7DB> <F7DB> <892A> <F7DC> <F7DC> <9000> <F7DD> <F7DD> <9839> <F7DE> <F7DE> <5078> <F7DF> <F7DF> <5957> <F7E0> <F7E0> <59AC> <F7E1> <F7E1> <6295> <F7E2> <F7E2> <900F> <F7E3> <F7E3> <9B2A> <F7E4> <F7E4> <615D> <F7E5> <F7E5> <7279> <F7E6> <F7E6> <95D6> <F7E7> <F7E7> <5761> <F7E8> <F7E8> <5A46> <F7E9> <F7E9> <5DF4> <F7EA> <F7EA> <628A> <F7EB> <F7EB> <64AD> <F7EC> <F7EC> <64FA> <F7ED> <F7ED> <6777> <F7EE> <F7EE> <6CE2> <F7EF> <F7EF> <6D3E> <F7F0> <F7F0> <722C> <F7F1> <F7F1> <7436> <F7F2> <F7F2> <7834> <F7F3> <F7F3> <7F77> <F7F4> <F7F4> <82AD> <F7F5> <F7F5> <8DDB> <F7F6> <F7F6> <9817> <F7F7> <F7F7> <5224> <F7F8> <F7F8> <5742> <F7F9> <F7F9> <677F> <F7FA> <F7FA> <7248> <F7FB> <F7FB> <74E3> <F7FC> <F7FC> <8CA9> <F7FD> <F7FD> <8FA6> <F7FE> <F7FE> <9211> <F8A1> <F8A1> <962A> <F8A2> <F8A2> <516B> <F8A3> <F8A3> <53ED> <F8A4> <F8A4> <634C> <F8A5> <F8A5> <4F69> <F8A6> <F8A6> <5504> <F8A7> <F8A7> <6096> <F8A8> <F8A8> <6557> <F8A9> <F8A9> <6C9B> <F8AA> <F8AA> <6D7F> endbfrange 100 beginbfrange <F8AB> <F8AB> <724C> <F8AC> <F8AC> <72FD> <F8AD> <F8AD> <7A17> <F8AE> <F8AE> <8987> <F8AF> <F8AF> <8C9D> <F8B0> <F8B0> <5F6D> <F8B1> <F8B1> <6F8E> <F8B2> <F8B2> <70F9> <F8B3> <F8B3> <81A8> <F8B4> <F8B4> <610E> <F8B5> <F8B5> <4FBF> <F8B6> <F8B6> <504F> <F8B7> <F8B7> <6241> <F8B8> <F8B8> <7247> <F8B9> <F8B9> <7BC7> <F8BA> <F8BA> <7DE8> <F8BB> <F8BB> <7FE9> <F8BC> <F8BC> <904D> <F8BD> <F8BD> <97AD> <F8BE> <F8BE> <9A19> <F8BF> <F8BF> <8CB6> <F8C0> <F8C0> <576A> <F8C1> <F8C1> <5E73> <F8C2> <F8C2> <67B0> <F8C3> <F8C3> <840D> <F8C4> <F8C4> <8A55> <F8C5> <F8C5> <5420> <F8C6> <F8C6> <5B16> <F8C7> <F8C7> <5E63> <F8C8> <F8C8> <5EE2> <F8C9> <F8C9> <5F0A> <F8CA> <F8CA> <6583> <F8CB> <F8CB> <80BA> <F8CC> <F8CC> <853D> <F8CD> <F8CD> <9589> <F8CE> <F8CE> <965B> <F8CF> <F8CF> <4F48> <F8D0> <F8D0> <5305> <F8D1> <F8D1> <530D> <F8D2> <F8D2> <530F> <F8D3> <F8D3> <5486> <F8D4> <F8D4> <54FA> <F8D5> <F8D5> <5703> <F8D6> <F8D6> <5E03> <F8D7> <F8D7> <6016> <F8D8> <F8D8> <629B> <F8D9> <F8D9> <62B1> <F8DA> <F8DA> <6355> <F8DB> <F8DB> <FA06> <F8DC> <F8DC> <6CE1> <F8DD> <F8DD> <6D66> <F8DE> <F8DE> <75B1> <F8DF> <F8DF> <7832> <F8E0> <F8E0> <80DE> <F8E1> <F8E1> <812F> <F8E2> <F8E2> <82DE> <F8E3> <F8E3> <8461> <F8E4> <F8E4> <84B2> <F8E5> <F8E5> <888D> <F8E6> <F8E6> <8912> <F8E7> <F8E7> <900B> <F8E8> <F8E8> <92EA> <F8E9> <F8E9> <98FD> <F8EA> <F8EA> <9B91> <F8EB> <F8EB> <5E45> <F8EC> <F8EC> <66B4> <F8ED> <F8ED> <66DD> <F8EE> <F8EE> <7011> <F8EF> <F8EF> <7206> <F8F0> <F8F0> <FA07> <F8F1> <F8F1> <4FF5> <F8F2> <F8F2> <527D> <F8F3> <F8F3> <5F6A> <F8F4> <F8F4> <6153> <F8F5> <F8F5> <6753> <F8F6> <F8F6> <6A19> <F8F7> <F8F7> <6F02> <F8F8> <F8F8> <74E2> <F8F9> <F8F9> <7968> <F8FA> <F8FA> <8868> <F8FB> <F8FB> <8C79> <F8FC> <F8FC> <98C7> <F8FD> <F8FD> <98C4> <F8FE> <F8FE> <9A43> <F9A1> <F9A1> <54C1> <F9A2> <F9A2> <7A1F> <F9A3> <F9A3> <6953> <F9A4> <F9A4> <8AF7> <F9A5> <F9A5> <8C4A> <F9A6> <F9A6> <98A8> <F9A7> <F9A7> <99AE> <F9A8> <F9A8> <5F7C> <F9A9> <F9A9> <62AB> <F9AA> <F9AA> <75B2> <F9AB> <F9AB> <76AE> <F9AC> <F9AC> <88AB> <F9AD> <F9AD> <907F> <F9AE> <F9AE> <9642> <F9AF> <F9AF> <5339> <F9B0> <F9B0> <5F3C> endbfrange 100 beginbfrange <F9B1> <F9B1> <5FC5> <F9B2> <F9B2> <6CCC> <F9B3> <F9B3> <73CC> <F9B4> <F9B4> <7562> <F9B5> <F9B5> <758B> <F9B6> <F9B6> <7B46> <F9B7> <F9B7> <82FE> <F9B8> <F9B8> <999D> <F9B9> <F9B9> <4E4F> <F9BA> <F9BA> <903C> <F9BB> <F9BB> <4E0B> <F9BC> <F9BC> <4F55> <F9BD> <F9BD> <53A6> <F9BE> <F9BE> <590F> <F9BF> <F9BF> <5EC8> <F9C0> <F9C0> <6630> <F9C1> <F9C1> <6CB3> <F9C2> <F9C2> <7455> <F9C3> <F9C3> <8377> <F9C4> <F9C4> <8766> <F9C5> <F9C5> <8CC0> <F9C6> <F9C6> <9050> <F9C7> <F9C7> <971E> <F9C8> <F9C8> <9C15> <F9C9> <F9C9> <58D1> <F9CA> <F9CA> <5B78> <F9CB> <F9CB> <8650> <F9CC> <F9CC> <8B14> <F9CD> <F9CD> <9DB4> <F9CE> <F9CE> <5BD2> <F9CF> <F9CF> <6068> <F9D0> <F9D0> <608D> <F9D1> <F9D1> <65F1> <F9D2> <F9D2> <6C57> <F9D3> <F9D3> <6F22> <F9D4> <F9D4> <6FA3> <F9D5> <F9D5> <701A> <F9D6> <F9D6> <7F55> <F9D7> <F9D7> <7FF0> <F9D8> <F9D9> <9591> <F9DA> <F9DA> <9650> <F9DB> <F9DB> <97D3> <F9DC> <F9DC> <5272> <F9DD> <F9DD> <8F44> <F9DE> <F9DE> <51FD> <F9DF> <F9DF> <542B> <F9E0> <F9E0> <54B8> <F9E1> <F9E1> <5563> <F9E2> <F9E2> <558A> <F9E3> <F9E3> <6ABB> <F9E4> <F9E4> <6DB5> <F9E5> <F9E5> <7DD8> <F9E6> <F9E6> <8266> <F9E7> <F9E7> <929C> <F9E8> <F9E8> <9677> <F9E9> <F9E9> <9E79> <F9EA> <F9EA> <5408> <F9EB> <F9EB> <54C8> <F9EC> <F9EC> <76D2> <F9ED> <F9ED> <86E4> <F9EE> <F9EE> <95A4> <F9EF> <F9EF> <95D4> <F9F0> <F9F0> <965C> <F9F1> <F9F1> <4EA2> <F9F2> <F9F2> <4F09> <F9F3> <F9F3> <59EE> <F9F4> <F9F4> <5AE6> <F9F5> <F9F5> <5DF7> <F9F6> <F9F6> <6052> <F9F7> <F9F7> <6297> <F9F8> <F9F8> <676D> <F9F9> <F9F9> <6841> <F9FA> <F9FA> <6C86> <F9FB> <F9FB> <6E2F> <F9FC> <F9FC> <7F38> <F9FD> <F9FD> <809B> <F9FE> <F9FE> <822A> <FAA1> <FAA2> <FA08> <FAA3> <FAA3> <9805> <FAA4> <FAA4> <4EA5> <FAA5> <FAA5> <5055> <FAA6> <FAA6> <54B3> <FAA7> <FAA7> <5793> <FAA8> <FAA8> <595A> <FAA9> <FAA9> <5B69> <FAAA> <FAAA> <5BB3> <FAAB> <FAAB> <61C8> <FAAC> <FAAC> <6977> <FAAD> <FAAD> <6D77> <FAAE> <FAAE> <7023> <FAAF> <FAAF> <87F9> <FAB0> <FAB0> <89E3> <FAB1> <FAB1> <8A72> <FAB2> <FAB2> <8AE7> <FAB3> <FAB3> <9082> <FAB4> <FAB4> <99ED> <FAB5> <FAB5> <9AB8> <FAB6> <FAB6> <52BE> <FAB7> <FAB7> <6838> <FAB8> <FAB8> <5016> endbfrange 100 beginbfrange <FAB9> <FAB9> <5E78> <FABA> <FABA> <674F> <FABB> <FABB> <8347> <FABC> <FABC> <884C> <FABD> <FABD> <4EAB> <FABE> <FABE> <5411> <FABF> <FABF> <56AE> <FAC0> <FAC0> <73E6> <FAC1> <FAC1> <9115> <FAC2> <FAC2> <97FF> <FAC3> <FAC3> <9909> <FAC4> <FAC4> <9957> <FAC5> <FAC5> <9999> <FAC6> <FAC6> <5653> <FAC7> <FAC7> <589F> <FAC8> <FAC8> <865B> <FAC9> <FAC9> <8A31> <FACA> <FACA> <61B2> <FACB> <FACB> <6AF6> <FACC> <FACC> <737B> <FACD> <FACD> <8ED2> <FACE> <FACE> <6B47> <FACF> <FACF> <96AA> <FAD0> <FAD0> <9A57> <FAD1> <FAD1> <5955> <FAD2> <FAD2> <7200> <FAD3> <FAD3> <8D6B> <FAD4> <FAD4> <9769> <FAD5> <FAD5> <4FD4> <FAD6> <FAD6> <5CF4> <FAD7> <FAD7> <5F26> <FAD8> <FAD8> <61F8> <FAD9> <FAD9> <665B> <FADA> <FADA> <6CEB> <FADB> <FADB> <70AB> <FADC> <FADC> <7384> <FADD> <FADD> <73B9> <FADE> <FADE> <73FE> <FADF> <FADF> <7729> <FAE0> <FAE0> <774D> <FAE1> <FAE1> <7D43> <FAE2> <FAE2> <7D62> <FAE3> <FAE3> <7E23> <FAE4> <FAE4> <8237> <FAE5> <FAE5> <8852> <FAE6> <FAE6> <FA0A> <FAE7> <FAE7> <8CE2> <FAE8> <FAE8> <9249> <FAE9> <FAE9> <986F> <FAEA> <FAEA> <5B51> <FAEB> <FAEB> <7A74> <FAEC> <FAEC> <8840> <FAED> <FAED> <9801> <FAEE> <FAEE> <5ACC> <FAEF> <FAEF> <4FE0> <FAF0> <FAF0> <5354> <FAF1> <FAF1> <593E> <FAF2> <FAF2> <5CFD> <FAF3> <FAF3> <633E> <FAF4> <FAF4> <6D79> <FAF5> <FAF5> <72F9> <FAF6> <FAF6> <8105> <FAF7> <FAF7> <8107> <FAF8> <FAF8> <83A2> <FAF9> <FAF9> <92CF> <FAFA> <FAFA> <9830> <FAFB> <FAFB> <4EA8> <FAFC> <FAFC> <5144> <FAFD> <FAFD> <5211> <FAFE> <FAFE> <578B> <FBA1> <FBA1> <5F62> <FBA2> <FBA2> <6CC2> <FBA3> <FBA3> <6ECE> <FBA4> <FBA4> <7005> <FBA5> <FBA5> <7050> <FBA6> <FBA6> <70AF> <FBA7> <FBA7> <7192> <FBA8> <FBA8> <73E9> <FBA9> <FBA9> <7469> <FBAA> <FBAA> <834A> <FBAB> <FBAB> <87A2> <FBAC> <FBAC> <8861> <FBAD> <FBAD> <9008> <FBAE> <FBAE> <90A2> <FBAF> <FBAF> <93A3> <FBB0> <FBB0> <99A8> <FBB1> <FBB1> <516E> <FBB2> <FBB2> <5F57> <FBB3> <FBB3> <60E0> <FBB4> <FBB4> <6167> <FBB5> <FBB5> <66B3> <FBB6> <FBB6> <8559> <FBB7> <FBB7> <8E4A> <FBB8> <FBB8> <91AF> <FBB9> <FBB9> <978B> <FBBA> <FBBA> <4E4E> <FBBB> <FBBB> <4E92> <FBBC> <FBBC> <547C> <FBBD> <FBBD> <58D5> <FBBE> <FBBE> <58FA> endbfrange 100 beginbfrange <FBBF> <FBBF> <597D> <FBC0> <FBC0> <5CB5> <FBC1> <FBC1> <5F27> <FBC2> <FBC2> <6236> <FBC3> <FBC3> <6248> <FBC4> <FBC4> <660A> <FBC5> <FBC5> <6667> <FBC6> <FBC6> <6BEB> <FBC7> <FBC7> <6D69> <FBC8> <FBC8> <6DCF> <FBC9> <FBC9> <6E56> <FBCA> <FBCA> <6EF8> <FBCB> <FBCB> <6F94> <FBCC> <FBCC> <6FE0> <FBCD> <FBCD> <6FE9> <FBCE> <FBCE> <705D> <FBCF> <FBCF> <72D0> <FBD0> <FBD0> <7425> <FBD1> <FBD1> <745A> <FBD2> <FBD2> <74E0> <FBD3> <FBD3> <7693> <FBD4> <FBD4> <795C> <FBD5> <FBD5> <7CCA> <FBD6> <FBD6> <7E1E> <FBD7> <FBD7> <80E1> <FBD8> <FBD8> <82A6> <FBD9> <FBD9> <846B> <FBDA> <FBDA> <84BF> <FBDB> <FBDB> <864E> <FBDC> <FBDC> <865F> <FBDD> <FBDD> <8774> <FBDE> <FBDE> <8B77> <FBDF> <FBDF> <8C6A> <FBE0> <FBE0> <93AC> <FBE1> <FBE1> <9800> <FBE2> <FBE2> <9865> <FBE3> <FBE3> <60D1> <FBE4> <FBE4> <6216> <FBE5> <FBE5> <9177> <FBE6> <FBE6> <5A5A> <FBE7> <FBE7> <660F> <FBE8> <FBE8> <6DF7> <FBE9> <FBE9> <6E3E> <FBEA> <FBEA> <743F> <FBEB> <FBEB> <9B42> <FBEC> <FBEC> <5FFD> <FBED> <FBED> <60DA> <FBEE> <FBEE> <7B0F> <FBEF> <FBEF> <54C4> <FBF0> <FBF0> <5F18> <FBF1> <FBF1> <6C5E> <FBF2> <FBF2> <6CD3> <FBF3> <FBF3> <6D2A> <FBF4> <FBF4> <70D8> <FBF5> <FBF5> <7D05> <FBF6> <FBF6> <8679> <FBF7> <FBF7> <8A0C> <FBF8> <FBF8> <9D3B> <FBF9> <FBF9> <5316> <FBFA> <FBFA> <548C> <FBFB> <FBFB> <5B05> <FBFC> <FBFC> <6A3A> <FBFD> <FBFD> <706B> <FBFE> <FBFE> <7575> <FCA1> <FCA1> <798D> <FCA2> <FCA2> <79BE> <FCA3> <FCA3> <82B1> <FCA4> <FCA4> <83EF> <FCA5> <FCA5> <8A71> <FCA6> <FCA6> <8B41> <FCA7> <FCA7> <8CA8> <FCA8> <FCA8> <9774> <FCA9> <FCA9> <FA0B> <FCAA> <FCAA> <64F4> <FCAB> <FCAB> <652B> <FCAC> <FCAD> <78BA> <FCAE> <FCAE> <7A6B> <FCAF> <FCAF> <4E38> <FCB0> <FCB0> <559A> <FCB1> <FCB1> <5950> <FCB2> <FCB2> <5BA6> <FCB3> <FCB3> <5E7B> <FCB4> <FCB4> <60A3> <FCB5> <FCB5> <63DB> <FCB6> <FCB6> <6B61> <FCB7> <FCB7> <6665> <FCB8> <FCB8> <6853> <FCB9> <FCB9> <6E19> <FCBA> <FCBA> <7165> <FCBB> <FCBB> <74B0> <FCBC> <FCBC> <7D08> <FCBD> <FCBD> <9084> <FCBE> <FCBE> <9A69> <FCBF> <FCBF> <9C25> <FCC0> <FCC0> <6D3B> <FCC1> <FCC1> <6ED1> <FCC2> <FCC2> <733E> <FCC3> <FCC3> <8C41> <FCC4> <FCC4> <95CA> <FCC5> <FCC5> <51F0> endbfrange 100 beginbfrange <FCC6> <FCC6> <5E4C> <FCC7> <FCC7> <5FA8> <FCC8> <FCC8> <604D> <FCC9> <FCC9> <60F6> <FCCA> <FCCA> <6130> <FCCB> <FCCB> <614C> <FCCC> <FCCD> <6643> <FCCE> <FCCE> <69A5> <FCCF> <FCCF> <6CC1> <FCD0> <FCD0> <6E5F> <FCD1> <FCD1> <6EC9> <FCD2> <FCD2> <6F62> <FCD3> <FCD3> <714C> <FCD4> <FCD4> <749C> <FCD5> <FCD5> <7687> <FCD6> <FCD6> <7BC1> <FCD7> <FCD7> <7C27> <FCD8> <FCD8> <8352> <FCD9> <FCD9> <8757> <FCDA> <FCDA> <9051> <FCDB> <FCDB> <968D> <FCDC> <FCDC> <9EC3> <FCDD> <FCDD> <532F> <FCDE> <FCDE> <56DE> <FCDF> <FCDF> <5EFB> <FCE0> <FCE0> <5F8A> <FCE1> <FCE1> <6062> <FCE2> <FCE2> <6094> <FCE3> <FCE3> <61F7> <FCE4> <FCE4> <6666> <FCE5> <FCE5> <6703> <FCE6> <FCE6> <6A9C> <FCE7> <FCE7> <6DEE> <FCE8> <FCE8> <6FAE> <FCE9> <FCE9> <7070> <FCEA> <FCEA> <736A> <FCEB> <FCEB> <7E6A> <FCEC> <FCEC> <81BE> <FCED> <FCED> <8334> <FCEE> <FCEE> <86D4> <FCEF> <FCEF> <8AA8> <FCF0> <FCF0> <8CC4> <FCF1> <FCF1> <5283> <FCF2> <FCF2> <7372> <FCF3> <FCF3> <5B96> <FCF4> <FCF4> <6A6B> <FCF5> <FCF5> <9404> <FCF6> <FCF6> <54EE> <FCF7> <FCF7> <5686> <FCF8> <FCF8> <5B5D> <FCF9> <FCF9> <6548> <FCFA> <FCFA> <6585> <FCFB> <FCFB> <66C9> <FCFC> <FCFC> <689F> <FCFD> <FCFD> <6D8D> <FCFE> <FCFE> <6DC6> <FDA1> <FDA1> <723B> <FDA2> <FDA2> <80B4> <FDA3> <FDA3> <9175> <FDA4> <FDA4> <9A4D> <FDA5> <FDA5> <4FAF> <FDA6> <FDA6> <5019> <FDA7> <FDA7> <539A> <FDA8> <FDA8> <540E> <FDA9> <FDA9> <543C> <FDAA> <FDAA> <5589> <FDAB> <FDAB> <55C5> <FDAC> <FDAC> <5E3F> <FDAD> <FDAD> <5F8C> <FDAE> <FDAE> <673D> <FDAF> <FDAF> <7166> <FDB0> <FDB0> <73DD> <FDB1> <FDB1> <9005> <FDB2> <FDB2> <52DB> <FDB3> <FDB3> <52F3> <FDB4> <FDB4> <5864> <FDB5> <FDB5> <58CE> <FDB6> <FDB6> <7104> <FDB7> <FDB7> <718F> <FDB8> <FDB8> <71FB> <FDB9> <FDB9> <85B0> <FDBA> <FDBA> <8A13> <FDBB> <FDBB> <6688> <FDBC> <FDBC> <85A8> <FDBD> <FDBD> <55A7> <FDBE> <FDBE> <6684> <FDBF> <FDBF> <714A> <FDC0> <FDC0> <8431> <FDC1> <FDC1> <5349> <FDC2> <FDC2> <5599> <FDC3> <FDC3> <6BC1> <FDC4> <FDC4> <5F59> <FDC5> <FDC5> <5FBD> <FDC6> <FDC6> <63EE> <FDC7> <FDC7> <6689> <FDC8> <FDC8> <7147> <FDC9> <FDC9> <8AF1> <FDCA> <FDCA> <8F1D> <FDCB> <FDCB> <9EBE> <FDCC> <FDCC> <4F11> endbfrange 50 beginbfrange <FDCD> <FDCD> <643A> <FDCE> <FDCE> <70CB> <FDCF> <FDCF> <7566> <FDD0> <FDD0> <8667> <FDD1> <FDD1> <6064> <FDD2> <FDD2> <8B4E> <FDD3> <FDD3> <9DF8> <FDD4> <FDD4> <5147> <FDD5> <FDD5> <51F6> <FDD6> <FDD6> <5308> <FDD7> <FDD7> <6D36> <FDD8> <FDD8> <80F8> <FDD9> <FDD9> <9ED1> <FDDA> <FDDA> <6615> <FDDB> <FDDB> <6B23> <FDDC> <FDDC> <7098> <FDDD> <FDDD> <75D5> <FDDE> <FDDE> <5403> <FDDF> <FDDF> <5C79> <FDE0> <FDE0> <7D07> <FDE1> <FDE1> <8A16> <FDE2> <FDE2> <6B20> <FDE3> <FDE3> <6B3D> <FDE4> <FDE4> <6B46> <FDE5> <FDE5> <5438> <FDE6> <FDE6> <6070> <FDE7> <FDE7> <6D3D> <FDE8> <FDE8> <7FD5> <FDE9> <FDE9> <8208> <FDEA> <FDEA> <50D6> <FDEB> <FDEB> <51DE> <FDEC> <FDEC> <559C> <FDED> <FDED> <566B> <FDEE> <FDEE> <56CD> <FDEF> <FDEF> <59EC> <FDF0> <FDF0> <5B09> <FDF1> <FDF1> <5E0C> <FDF2> <FDF2> <6199> <FDF3> <FDF3> <6198> <FDF4> <FDF4> <6231> <FDF5> <FDF5> <665E> <FDF6> <FDF6> <66E6> <FDF7> <FDF7> <7199> <FDF8> <FDF9> <71B9> <FDFA> <FDFA> <72A7> <FDFB> <FDFB> <79A7> <FDFC> <FDFC> <7A00> <FDFD> <FDFD> <7FB2> <FDFE> <FDFE> <8A70> <FEA1> <FEFE> <E05E> endbfrange endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF \ No newline at end of file
diff --git a/src/main/resources/Resources/cmap/KSCms-UHC-V b/src/main/resources/Resources/cmap/KSCms-UHC-V
new file mode 100644
index 0000000..be40efc
--- /dev/null
+++ b/src/main/resources/Resources/cmap/KSCms-UHC-V
@@ -0,0 +1 @@
+%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%DocumentNeededResources: CMap (KSCms-UHC-H) %%IncludeResource: ProcSet (CIDInit) %%IncludeResource: CMap (KSCms-UHC-H) %%BeginResource: CMap (KSCms-UHC-V) %%Title: (KSCms-UHC-V Adobe Korea1 1) %%Version: 10.001 %%Copyright: ----------------------------------------------------------- %%Copyright: Copyright 1990-1999 Adobe Systems Incorporated. %%Copyright: All Rights Reserved. %%Copyright: %%Copyright: Patents Pending %%Copyright: %%Copyright: NOTICE: All information contained herein is the property %%Copyright: of Adobe Systems Incorporated. %%Copyright: %%Copyright: Permission is granted for redistribution of this file %%Copyright: provided this copyright notice is maintained intact and %%Copyright: that the contents of this file are not altered in any %%Copyright: way from its original form. %%Copyright: %%Copyright: PostScript and Display PostScript are trademarks of %%Copyright: Adobe Systems Incorporated which may be registered in %%Copyright: certain jurisdictions. %%Copyright: ----------------------------------------------------------- %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /KSCms-UHC-H usecmap /CIDSystemInfo 3 dict dup begin /Registry (Adobe) def /Ordering (Korea1) def /Supplement 1 def end def /CMapName /KSCms-UHC-V def /CMapVersion 10.001 def /CMapType 1 def /UIDOffset 680 def /XUID [1 10 25410] def /WMode 1 def 16 begincidrange <a1a2> <a1a3> 8056 <a1a5> <a1a5> 8058 <a1a6> <a1a6> 8320 <a1a9> <a1ab> 8059 <a1ad> <a1ad> 8062 <a1b2> <a1bd> 8063 <a1eb> <a1eb> 8075 <a3a1> <a3a1> 8076 <a3a8> <a3a9> 8077 <a3ac> <a3ac> 8079 <a3ae> <a3ae> 8080 <a3ba> <a3bf> 8081 <a3db> <a3db> 8087 <a3dd> <a3dd> 8088 <a3df> <a3df> 8089 <a3fb> <a3fe> 8090 endcidrange endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF \ No newline at end of file
diff --git a/src/main/resources/Resources/cmap/KSCpc-EUC-H b/src/main/resources/Resources/cmap/KSCpc-EUC-H
new file mode 100644
index 0000000..21a4564
--- /dev/null
+++ b/src/main/resources/Resources/cmap/KSCpc-EUC-H
@@ -0,0 +1 @@
+%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%IncludeResource: ProcSet (CIDInit) %%BeginResource: CMap (KSCpc-EUC-H) %%Title: (KSCpc-EUC-H Adobe Korea1 0) %%Version: 9.001 %%Copyright: ----------------------------------------------------------- %%Copyright: Copyright 1990-1998 Adobe Systems Incorporated. %%Copyright: All Rights Reserved. %%Copyright: %%Copyright: Patents Pending %%Copyright: %%Copyright: NOTICE: All information contained herein is the property %%Copyright: of Adobe Systems Incorporated. %%Copyright: %%Copyright: Permission is granted for redistribution of this file %%Copyright: provided this copyright notice is maintained intact and %%Copyright: that the contents of this file are not altered in any %%Copyright: way from its original form. %%Copyright: %%Copyright: PostScript and Display PostScript are trademarks of %%Copyright: Adobe Systems Incorporated which may be registered in %%Copyright: certain jurisdictions. %%Copyright: ----------------------------------------------------------- %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo 3 dict dup begin /Registry (Adobe) def /Ordering (Korea1) def /Supplement 0 def end def /CMapName /KSCpc-EUC-H def /CMapVersion 9.001 def /CMapType 1 def /UIDOffset 0 def /XUID [1 10 25404] def /WMode 0 def 3 begincodespacerange <00> <84> <A141> <FDFE> <FE> <FF> endcodespacerange 1 beginnotdefrange <00> <1f> 1 endnotdefrange 100 begincidrange <20> <7e> 1 <81> <83> 96 <a141> <a17d> 8191 <a181> <a19a> 8252 <a19c> <a1a0> 8278 <a1a1> <a1a1> 101 <a1a2> <a1a3> 8283 <a1a4> <a1fe> 104 <a241> <a24c> 8285 <a2a1> <a2e5> 195 <a2e6> <a2fe> 8297 <a341> <a37d> 8322 <a381> <a39f> 8383 <a3a1> <a3fe> 264 <a441> <a47d> 8414 <a481> <a49f> 8475 <a4a1> <a4d3> 358 <a4d5> <a4fe> 409 <a541> <a57d> 8506 <a581> <a58b> 8567 <a5a1> <a5aa> 451 <a5b0> <a5b9> 461 <a5c1> <a5d8> 471 <a5da> <a5de> 8578 <a5e1> <a5f8> 495 <a5f9> <a5fc> 8583 <a641> <a67d> 8587 <a681> <a68a> 8648 <a68d> <a693> 8658 <a696> <a69b> 8665 <a69e> <a69f> 8671 <a6a1> <a6e4> 519 <a6e5> <a6fe> 8673 <a741> <a77d> 8699 <a781> <a79f> 8760 <a7a1> <a7ef> 587 <a7f0> <a7fe> 8791 <a841> <a87d> 8806 <a881> <a89f> 8867 <a8a1> <a8a4> 666 <a8a6> <a8a6> 670 <a8a8> <a8af> 671 <a8b1> <a8fe> 679 <a941> <a974> 8898 <a9a1> <a9fe> 757 <aa41> <aa7d> 8950 <aa81> <aa9f> 9011 <aaa1> <aaf3> 851 <aaf4> <aafe> 9042 <ab41> <ab7d> 9053 <ab81> <ab9f> 9114 <aba1> <abf6> 934 <abf7> <abfa> 9145 <abfb> <abfd> 9330 <ac41> <ac7d> 9149 <ac81> <ac97> 9210 <aca1> <acc1> 1020 <acc2> <acd0> 9233 <acd1> <acf1> 1053 <acf2> <acf6> 9248 <ad41> <ad7d> 9253 <ada1> <adb0> 9314 <b0a1> <b0fe> 1086 <b1a1> <b1fe> 1180 <b2a1> <b2fe> 1274 <b3a1> <b3fe> 1368 <b4a1> <b4fe> 1462 <b5a1> <b5fe> 1556 <b6a1> <b6fe> 1650 <b7a1> <b7fe> 1744 <b8a1> <b8fe> 1838 <b9a1> <b9fe> 1932 <baa1> <bafe> 2026 <bba1> <bbfe> 2120 <bca1> <bcfe> 2214 <bda1> <bdfe> 2308 <bea1> <befe> 2402 <bfa1> <bffe> 2496 <c0a1> <c0fe> 2590 <c1a1> <c1fe> 2684 <c2a1> <c2fe> 2778 <c3a1> <c3fe> 2872 <c4a1> <c4fe> 2966 <c5a1> <c5fe> 3060 <c6a1> <c6fe> 3154 <c7a1> <c7fe> 3248 <c8a1> <c8fe> 3342 <caa1> <cafe> 3436 <cba1> <cbcf> 3530 <cbd0> <cbd0> 4116 <cbd1> <cbd5> 3577 <cbd6> <cbd6> 3678 <cbd7> <cbe6> 3582 <cbe7> <cbe7> 7053 <cbe8> <cbfe> 3598 <cca1> <ccfe> 3621 <cda1> <cdce> 3715 <cdcf> <cdcf> 3460 <cdd0> <cde7> 3761 <cde8> <cde8> 7900 endcidrange 100 begincidrange <cde9> <cdfe> 3785 <cea1> <ceac> 3807 <cead> <cead> 3802 <ceae> <cefe> 3819 <cfa1> <cffa> 3900 <cffb> <cffb> 3902 <cffc> <cffe> 3990 <d0a1> <d0a1> 3993 <d0a2> <d0a2> 3946 <d0a3> <d0b7> 3994 <d0b8> <d0b8> 3946 <d0b9> <d0cf> 4015 <d0d0> <d0d0> 3708 <d0d1> <d0dc> 4038 <d0dd> <d0dd> 4131 <d0de> <d0fe> 4050 <d1a1> <d1d3> 4083 <d1d4> <d1d4> 4374 <d1d5> <d1d5> 4156 <d1d6> <d1d7> 4134 <d1d8> <d1d8> 4375 <d1d9> <d1da> 4136 <d1db> <d1e0> 4376 <d1e1> <d1e1> 4138 <d1e2> <d1e2> 5800 <d1e3> <d1e5> 4382 <d1e6> <d1e6> 4386 <d1e7> <d1e7> 4139 <d1e8> <d1eb> 4387 <d1ec> <d1ec> 4140 <d1ed> <d1ed> 4391 <d1ee> <d1ee> 4141 <d1ef> <d1f0> 4394 <d1f1> <d1f1> 4142 <d1f2> <d1f2> 4396 <d1f3> <d1f5> 4143 <d1f6> <d1f6> 4399 <d1f7> <d1f9> 4146 <d1fa> <d1fa> 4403 <d1fb> <d1fb> 4149 <d1fc> <d1fd> 4406 <d1fe> <d1fe> 4409 <d2a1> <d2a1> 4150 <d2a2> <d2a3> 4410 <d2a4> <d2a6> 4151 <d2a7> <d2aa> 4412 <d2ab> <d2ab> 4419 <d2ac> <d2ac> 4154 <d2ad> <d2ad> 4420 <d2ae> <d2b1> 4155 <d2b2> <d2b2> 4424 <d2b3> <d2bd> 4159 <d2be> <d2be> 4511 <d2bf> <d2c1> 4170 <d2c2> <d2c3> 4513 <d2c4> <d2c4> 4517 <d2c5> <d2c5> 4173 <d2c6> <d2ca> 4518 <d2cb> <d2cb> 4524 <d2cc> <d2cc> 4174 <d2cd> <d2ce> 4525 <d2cf> <d2d4> 4528 <d2d5> <d2d7> 4535 <d2d8> <d2d8> 4175 <d2d9> <d2da> 4541 <d2db> <d2dd> 4176 <d2de> <d2df> 4545 <d2e0> <d2e0> 4179 <d2e1> <d2e1> 4547 <d2e2> <d2e2> 4550 <d2e3> <d2e3> 4180 <d2e4> <d2e4> 4564 <d2e5> <d2e8> 4566 <d2e9> <d2ea> 4571 <d2eb> <d2eb> 4576 <d2ec> <d2ef> 4181 <d2f0> <d2f3> 4604 <d2f4> <d2f5> 4609 <d2f6> <d2f6> 4185 <d2f7> <d2f8> 4611 <d2f9> <d2fe> 4186 <d3a1> <d3fe> 4192 <d4a1> <d4e5> 4286 <d4e6> <d4e6> 4318 <d4e7> <d4fb> 4355 <d4fc> <d4fc> 4136 <d4fd> <d4fe> 4376 <d5a1> <d5a4> 4378 <d5a5> <d5a5> 5800 <d5a6> <d5aa> 4382 <d5ab> <d5ab> 4139 <d5ac> <d5ad> 4387 <d5ae> <d5ae> 4192 <d5af> <d5fe> 4389 <d6a1> <d6b7> 4469 <d6b8> <d6b8> 4167 <d6b9> <d6cc> 4492 <d6cd> <d6cd> 4172 <d6ce> <d6fe> 4512 <d7a1> <d7ca> 4561 endcidrange 100 begincidrange <d7cb> <d7cb> 5552 <d7cc> <d7e3> 4603 <d7e4> <d7e4> 6424 <d7e5> <d7fe> 4627 <d8a1> <d8fe> 4653 <d9a1> <d9fe> 4747 <daa1> <dafe> 4841 <dba1> <dbc4> 4935 <dbc5> <dbc5> 5151 <dbc6> <dbe3> 4971 <dbe4> <dbe4> 4922 <dbe5> <dbfe> 5001 <dca1> <dca4> 5027 <dca5> <dca5> 7518 <dca6> <dcfe> 5031 <dda1> <dda4> 5120 <dda5> <dda5> 5079 <dda6> <ddd4> 5124 <ddd5> <ddd5> 5109 <ddd6> <ddf3> 5171 <ddf4> <ddf4> 7607 <ddf5> <ddfe> 5201 <dea1> <defb> 5211 <defc> <defc> 5584 <defd> <defd> 5302 <defe> <defe> 5367 <dfa1> <dfb2> 5303 <dfb3> <dfb3> 7083 <dfb4> <dfe0> 5321 <dfe1> <dfe1> 5362 <dfe2> <dfe7> 5366 <dfe8> <dfe8> 5485 <dfe9> <dffe> 5372 <e0a1> <e0f0> 5394 <e0f1> <e0f1> 6001 <e0f2> <e0fe> 5474 <e1a1> <e1ac> 5487 <e1ad> <e1ad> 5460 <e1ae> <e1ec> 5499 <e1ed> <e1ed> 5317 <e1ee> <e1fe> 5562 <e2a1> <e2fe> 5579 <e3a1> <e3f4> 5673 <e3f5> <e3f5> 7009 <e3f6> <e3fe> 5757 <e4a1> <e4a1> 7370 <e4a2> <e4a8> 5766 <e4a9> <e4a9> 5678 <e4aa> <e4fe> 5773 <e5a1> <e5ad> 5858 <e5ae> <e5ae> 5874 <e5af> <e5b0> 5871 <e5b1> <e5b2> 4425 <e5b3> <e5b8> 5873 <e5b9> <e5b9> 4427 <e5ba> <e5ba> 5879 <e5bb> <e5bc> 4429 <e5bd> <e5c3> 5880 <e5c4> <e5c4> 4431 <e5c5> <e5cd> 5887 <e5ce> <e5ce> 4435 <e5cf> <e5cf> 5896 <e5d0> <e5d0> 4436 <e5d1> <e5d1> 5897 <e5d2> <e5d2> 4437 <e5d3> <e5d5> 5898 <e5d6> <e5d6> 4439 <e5d7> <e5f9> 5901 <e5fa> <e5fb> 4442 <e5fc> <e5fc> 4159 <e5fd> <e5fd> 5936 <e5fe> <e5fe> 4444 <e6a1> <e6a1> 4447 <e6a2> <e6a3> 5937 <e6a4> <e6a4> 4449 <e6a5> <e6a6> 5939 <e6a7> <e6a7> 4450 <e6a8> <e6ac> 5941 <e6ad> <e6ad> 4453 <e6ae> <e6ae> 5946 <e6af> <e6b1> 4455 <e6b2> <e6b2> 5947 <e6b3> <e6b3> 4458 <e6b4> <e6b6> 5948 <e6b7> <e6b8> 4459 <e6b9> <e6bb> 5951 <e6bc> <e6bc> 4463 <e6bd> <e6c3> 5954 <e6c4> <e6c4> 4160 <e6c5> <e6c5> 5961 <e6c6> <e6c7> 4465 <e6c8> <e6c9> 5962 <e6ca> <e6ca> 4161 <e6cb> <e6d1> 5964 <e6d2> <e6d2> 4468 <e6d3> <e6d5> 5971 <e6d6> <e6d6> 4469 <e6d7> <e6d8> 5974 <e6d9> <e6d9> 4470 <e6da> <e6db> 5976 endcidrange 100 begincidrange <e6dc> <e6dc> 4162 <e6dd> <e6de> 5978 <e6df> <e6df> 4471 <e6e0> <e6e0> 5980 <e6e1> <e6e1> 4472 <e6e2> <e6e3> 5981 <e6e4> <e6e4> 4474 <e6e5> <e6e5> 4473 <e6e6> <e6e6> 4475 <e6e7> <e6e7> 5983 <e6e8> <e6e8> 4476 <e6e9> <e6e9> 5984 <e6ea> <e6eb> 4478 <e6ec> <e6ec> 6447 <e6ed> <e6ee> 5985 <e6ef> <e6ef> 4481 <e6f0> <e6f0> 5987 <e6f1> <e6f1> 4482 <e6f2> <e6f2> 5460 <e6f3> <e6f4> 5988 <e6f5> <e6f5> 4483 <e6f6> <e6f6> 4163 <e6f7> <e6f7> 4166 <e6f8> <e6f8> 5990 <e6f9> <e6f9> 4485 <e6fa> <e6fe> 5991 <e7a1> <e7a1> 4487 <e7a2> <e7a5> 5996 <e7a6> <e7a6> 4488 <e7a7> <e7a8> 6000 <e7a9> <e7a9> 4489 <e7aa> <e7aa> 4491 <e7ab> <e7ab> 6002 <e7ac> <e7ac> 4167 <e7ad> <e7ad> 4493 <e7ae> <e7af> 6003 <e7b0> <e7b0> 4494 <e7b1> <e7be> 6005 <e7bf> <e7bf> 4495 <e7c0> <e7c0> 6019 <e7c1> <e7c1> 7783 <e7c2> <e7c5> 6020 <e7c6> <e7c6> 4497 <e7c7> <e7c7> 4499 <e7c8> <e7ca> 6024 <e7cb> <e7cb> 4501 <e7cc> <e7cc> 6027 <e7cd> <e7cd> 4502 <e7ce> <e7ce> 6028 <e7cf> <e7d0> 4503 <e7d1> <e7d2> 6029 <e7d3> <e7d3> 4506 <e7d4> <e7de> 6031 <e7df> <e7df> 4508 <e7e0> <e7e3> 6042 <e7e4> <e7e4> 4509 <e7e5> <e7e5> 6046 <e7e6> <e7e6> 4510 <e7e7> <e7f6> 6047 <e7f7> <e7f7> 5797 <e7f8> <e7fe> 6063 <e8a1> <e8e6> 6070 <e8e7> <e8e8> 4551 <e8e9> <e8ef> 6140 <e8f0> <e8f0> 4553 <e8f1> <e8f1> 4180 <e8f2> <e8f6> 6147 <e8f7> <e8f7> 4555 <e8f8> <e8f8> 6152 <e8f9> <e8f9> 5800 <e8fa> <e8fa> 6153 <e8fb> <e8fb> 4556 <e8fc> <e8fd> 6154 <e8fe> <e8fe> 4557 <e9a1> <e9a6> 6156 <e9a7> <e9a7> 4560 <e9a8> <e9ab> 6162 <e9ac> <e9ac> 4561 <e9ad> <e9cb> 6166 <e9cc> <e9cc> 4563 <e9cd> <e9f6> 6197 <e9f7> <e9f7> 7988 <e9f8> <e9fe> 6239 <eaa1> <eac0> 6246 <eac1> <eac1> 6123 <eac2> <eae4> 6278 <eae5> <eae5> 4577 <eae6> <eaf3> 6313 <eaf4> <eaf4> 4183 <eaf5> <eaf6> 6327 <eaf7> <eaf7> 4579 <eaf8> <eafb> 6329 <eafc> <eafc> 4581 <eafd> <eafd> 6333 <eafe> <eafe> 4582 <eba1> <eba3> 6334 <eba4> <eba4> 4584 <eba5> <eba6> 6337 <eba7> <eba7> 4586 <eba8> <eba8> 6339 endcidrange 100 begincidrange <eba9> <eba9> 4588 <ebaa> <ebaa> 4184 <ebab> <ebb9> 6340 <ebba> <ebbb> 4590 <ebbc> <ebbc> 6355 <ebbd> <ebbd> 4592 <ebbe> <ebc0> 6356 <ebc1> <ebc1> 4593 <ebc2> <ebc2> 4595 <ebc3> <ebc5> 6359 <ebc6> <ebc7> 4596 <ebc8> <ebcb> 6362 <ebcc> <ebcc> 4599 <ebcd> <ebce> 6366 <ebcf> <ebd1> 4600 <ebd2> <ebd2> 5552 <ebd3> <ebd7> 6368 <ebd8> <ebd8> 4603 <ebd9> <ebfe> 6373 <eca1> <eca5> 6411 <eca6> <eca6> 4614 <eca7> <eca7> 4616 <eca8> <eca9> 6416 <ecaa> <ecaa> 4618 <ecab> <ecae> 6418 <ecaf> <ecaf> 5950 <ecb0> <ecb1> 4620 <ecb2> <ecb2> 4187 <ecb3> <ecb4> 6422 <ecb5> <ecb5> 4625 <ecb6> <ecb7> 6424 <ecb8> <ecb8> 4627 <ecb9> <ecb9> 6426 <ecba> <ecba> 4629 <ecbb> <ecbf> 6427 <ecc0> <ecc1> 4632 <ecc2> <ecc4> 6432 <ecc5> <ecc5> 4634 <ecc6> <ecc6> 4636 <ecc7> <ecc8> 6435 <ecc9> <ecca> 4188 <eccb> <ecd4> 6437 <ecd5> <ecd5> 4638 <ecd6> <ecdc> 6447 <ecdd> <ecde> 4640 <ecdf> <ece0> 6454 <ece1> <ece1> 4642 <ece2> <ece3> 6456 <ece4> <ece4> 4644 <ece5> <ece6> 6458 <ece7> <ece8> 4645 <ece9> <ecf6> 6460 <ecf7> <ecf8> 4647 <ecf9> <ecf9> 6474 <ecfa> <ecfa> 4650 <ecfb> <ecfe> 6475 <eda1> <eda3> 4653 <eda4> <eded> 6479 <edee> <edee> 5351 <edef> <edfe> 6553 <eea1> <eeda> 6569 <eedb> <eedb> 6494 <eedc> <eefe> 6627 <efa1> <effe> 6662 <f0a1> <f0fe> 6756 <f1a1> <f1fe> 6850 <f2a1> <f2bc> 6944 <f2bd> <f2bd> 5731 <f2be> <f2f9> 6972 <f2fa> <f2fa> 5771 <f2fb> <f2fe> 7032 <f3a1> <f3b0> 7036 <f3b1> <f3b1> 4191 <f3b2> <f3fe> 7052 <f4a1> <f4a6> 7129 <f4a7> <f4a7> 6484 <f4a8> <f4ed> 7135 <f4ee> <f4ee> 6684 <f4ef> <f4fe> 7205 <f5a1> <f5fe> 7221 <f6a1> <f6f3> 7315 <f6f4> <f6f4> 4279 <f6f5> <f6f5> 7398 <f6f6> <f6f6> 7139 <f6f7> <f6fe> 7399 <f7a1> <f7b7> 7407 <f7b8> <f7b8> 4247 <f7b9> <f7c7> 7430 <f7c8> <f7c8> 4266 <f7c9> <f7d2> 7445 <f7d3> <f7d3> 4340 <f7d4> <f7fe> 7455 <f8a1> <f8da> 7498 <f8db> <f8db> 7572 <f8dc> <f8ef> 7556 <f8f0> <f8f0> 5088 <f8f1> <f8fe> 7576 <f9a1> <f9fe> 7590 <faa1> <faa1> 7709 <faa2> <faa2> 3558 endcidrange 9 begincidrange <faa3> <fae5> 7684 <fae6> <fae6> 3644 <fae7> <fafe> 7751 <fba1> <fbfe> 7775 <fca1> <fca8> 7869 <fca9> <fca9> 3815 <fcaa> <fcfe> 7877 <fda1> <fdfe> 7962 <fe> <ff> 99 endcidrange endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF \ No newline at end of file
diff --git a/src/main/resources/Resources/cmap/KSCpc-EUC-UCS2 b/src/main/resources/Resources/cmap/KSCpc-EUC-UCS2
new file mode 100644
index 0000000..2b4a78d
--- /dev/null
+++ b/src/main/resources/Resources/cmap/KSCpc-EUC-UCS2
@@ -0,0 +1 @@
+%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%DocumentNeededResources: CMap (KSCpc-EUC-UCS2C) %%IncludeResource: ProcSet (CIDInit) %%IncludeResource: CMap (KSCpc-EUC-UCS2C) %%BeginResource: CMap (KSCpc-EUC-UCS2) %%Title: (KSCpc-EUC-UCS2) %%Version: 4.002 %%Copyright: ----------------------------------------------------------- %%Copyright: Copyright 1990-1997 Adobe Systems Incorporated. %%Copyright: All Rights Reserved. %%Copyright: %%Copyright: Patents Pending %%Copyright: %%Copyright: NOTICE: All information contained herein is the property %%Copyright: of Adobe Systems Incorporated. %%Copyright: %%Copyright: Permission is granted for redistribution of this file %%Copyright: provided this copyright notice is maintained intact and %%Copyright: that the contents of this file are not altered in any %%Copyright: way from its original form. %%Copyright: %%Copyright: PostScript and Display PostScript are trademarks of %%Copyright: Adobe Systems Incorporated which may be registered in %%Copyright: certain jurisdictions. %%Copyright: ----------------------------------------------------------- %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /KSCpc-EUC-UCS2C usecmap /CIDSystemInfo 3 dict dup begin /Registry (Adobe) def /Ordering (KSCpc_EUC_UCS2) def /Supplement 1 def end def /CMapName /KSCpc-EUC-UCS2 def /CMapVersion 4.002 def /CMapType 1 def /WMode 0 def 100 beginbfrange <a151> <a151> <00280028> <a152> <a152> <00290029> <a153> <a153> <00280028> <a154> <a154> <00290029> <a241> <a241> <00280028> <a242> <a242> <00290029> <a243> <a243> <00280028> <a244> <a244> <00290029> <a2e6> <a2e6> <003120de> <a2e7> <a2e7> <003220de> <a2e8> <a2e8> <003320de> <a2e9> <a2e9> <003420de> <a2ea> <a2ea> <003520de> <a2eb> <a2eb> <003620de> <a2ec> <a2ec> <003720de> <a2ed> <a2ed> <003820de> <a2ee> <a2ee> <003920de> <a2ef> <a2ef> <005b00310030005d> <a2f0> <a2f0> <005b00310031005d> <a2f1> <a2f1> <005b00310032005d> <a2f2> <a2f2> <005b00310033005d> <a2f3> <a2f3> <005b00310034005d> <a2f4> <a2f4> <005b00310035005d> <a2f5> <a2f5> <005b00310036005d> <a2f6> <a2f6> <005b00310037005d> <a2f7> <a2f7> <005b00310038005d> <a2f8> <a2f8> <005b00310039005d> <a2f9> <a2f9> <005b00320030005d> <a341> <a341> <003120de> <a342> <a342> <003220de> <a343> <a343> <003320de> <a344> <a344> <003420de> <a345> <a345> <003520de> <a346> <a346> <003620de> <a347> <a347> <003720de> <a348> <a348> <003820de> <a349> <a349> <003920de> <a34a> <a34a> <005b00310030005d> <a34b> <a34b> <005b00310031005d> <a34c> <a34c> <005b00310032005d> <a34d> <a34d> <005b00310033005d> <a34e> <a34e> <005b00310034005d> <a34f> <a34f> <005b00310035005d> <a350> <a350> <005b00310036005d> <a351> <a351> <005b00310037005d> <a352> <a352> <005b00310038005d> <a353> <a353> <005b00310039005d> <a354> <a354> <005b00320030005d> <a369> <a369> <002800410029> <a36a> <a36a> <002800420029> <a36b> <a36b> <002800430029> <a36c> <a36c> <002800440029> <a36d> <a36d> <002800450029> <a36e> <a36e> <002800460029> <a36f> <a36f> <002800470029> <a370> <a370> <002800480029> <a371> <a371> <002800490029> <a372> <a372> <0028004a0029> <a373> <a373> <0028004b0029> <a374> <a374> <0028004c0029> <a375> <a375> <0028004d0029> <a376> <a376> <0028004e0029> <a377> <a377> <0028004f0029> <a378> <a378> <002800500029> <a379> <a379> <002800510029> <a37a> <a37a> <002800520029> <a37b> <a37b> <002800530029> <a37c> <a37c> <002800540029> <a37d> <a37d> <002800550029> <a381> <a381> <002800560029> <a382> <a382> <002800570029> <a383> <a383> <002800580029> <a384> <a384> <002800590029> <a385> <a385> <0028005a0029> <a441> <a441> <003120de> <a442> <a442> <003220de> <a443> <a443> <003320de> <a444> <a444> <003420de> <a445> <a445> <003520de> <a446> <a446> <003620de> <a447> <a447> <003720de> <a448> <a448> <003820de> <a449> <a449> <003920de> <a44a> <a44a> <005b00310030005d> <a44b> <a44b> <005b00310031005d> <a44c> <a44c> <005b00310032005d> <a44d> <a44d> <005b00310033005d> <a44e> <a44e> <005b00310034005d> <a44f> <a44f> <005b00310035005d> <a450> <a450> <005b00310036005d> <a451> <a451> <005b00310037005d> <a452> <a452> <005b00310038005d> <a453> <a453> <005b00310039005d> <a454> <a454> <005b00320030005d> <a455> <a455> <003120de> <a456> <a456> <003220de> <a457> <a457> <003320de> <a458> <a458> <003420de> <a459> <a459> <003520de> <a45a> <a45a> <003620de> endbfrange 100 beginbfrange <a45b> <a45b> <003720de> <a45c> <a45c> <003820de> <a45d> <a45d> <003920de> <a45e> <a45e> <005b00310030005d> <a45f> <a45f> <005b00310031005d> <a460> <a460> <005b00310032005d> <a461> <a461> <005b00310033005d> <a462> <a462> <005b00310034005d> <a463> <a463> <005b00310035005d> <a464> <a464> <005b00310036005d> <a465> <a465> <005b00310037005d> <a466> <a466> <005b00310038005d> <a467> <a467> <005b00310039005d> <a468> <a468> <005b00320030005d> <a541> <a541> <003020de> <a542> <a542> <003120de> <a543> <a543> <003220de> <a544> <a544> <003320de> <a545> <a545> <003420de> <a546> <a546> <003520de> <a547> <a547> <003620de> <a548> <a548> <003720de> <a549> <a549> <003820de> <a54a> <a54a> <003920de> <a555> <a555> <00410029> <a556> <a556> <00420029> <a557> <a557> <00430029> <a558> <a558> <00440029> <a559> <a559> <00450029> <a55a> <a55a> <00460029> <a55b> <a55b> <00470029> <a55c> <a55c> <00480029> <a55d> <a55d> <00490029> <a55e> <a55e> <004a0029> <a55f> <a55f> <004b0029> <a560> <a560> <004c0029> <a561> <a561> <004d0029> <a562> <a562> <004e0029> <a563> <a563> <004f0029> <a564> <a564> <00500029> <a565> <a565> <00510029> <a566> <a566> <00520029> <a567> <a567> <00530029> <a568> <a568> <00540029> <a569> <a569> <00550029> <a56a> <a56a> <00560029> <a56b> <a56b> <00570029> <a56c> <a56c> <00580029> <a56d> <a56d> <00590029> <a56e> <a56e> <005a0029> <a56f> <a56f> <00610029> <a570> <a570> <00620029> <a571> <a571> <00630029> <a572> <a572> <00640029> <a573> <a573> <00650029> <a574> <a574> <00660029> <a575> <a575> <00670029> <a576> <a576> <00680029> <a577> <a577> <00690029> <a578> <a578> <006a0029> <a579> <a579> <006b0029> <a57a> <a57a> <006c0029> <a57b> <a57b> <006d0029> <a57c> <a57c> <006e0029> <a57d> <a57d> <006f0029> <a581> <a581> <00700029> <a582> <a582> <00710029> <a583> <a583> <00720029> <a584> <a584> <00730029> <a585> <a585> <00740029> <a586> <a586> <00750029> <a587> <a587> <00760029> <a588> <a588> <00770029> <a589> <a589> <00780029> <a58a> <a58a> <00790029> <a58b> <a58b> <007a0029> <a5f9> <a5f9> <0028003200370029> <a5fa> <a5fa> <0028003200380029> <a5fb> <a5fb> <0028003200390029> <a5fc> <a5fc> <0028003300300029> <a644> <a644> <20202020> <a645> <a645> <20212021> <a646> <a646> <202020202020> <a656> <a656> <25a020df> <a657> <a657> <25c720df> <a659> <a659> <25a120df> <a662> <a662> <25c720de> <a664> <a664> <25a120de> <a665> <a665> <25c620de> <a66a> <a66a> <25b320dd> <a66b> <a66b> <25b220dd> <a6f9> <a6f9> <0028003200310029> <a6fa> <a6fa> <0028003200320029> <a6fb> <a6fb> <0028003200330029> <a6fc> <a6fc> <0028003200340029> <a6fd> <a6fd> <0028003200350029> <a6fe> <a6fe> <0028003200360029> <a760> <a760> <00f720dd> <a76d> <a76d> <22a50338> <a785> <a785> <0021003f> endbfrange 100 beginbfrange <a787> <a787> <003f003f> <a7f5> <a7f5> <0028003200310029> <a7f6> <a7f6> <0028003200320029> <a7f7> <a7f7> <0028003200330029> <a7f8> <a7f8> <0028003200340029> <a7f9> <a7f9> <0028003200350029> <a7fa> <a7fa> <0028003200360029> <a7fb> <a7fb> <0028003200370029> <a7fc> <a7fc> <0028003200380029> <a7fd> <a7fd> <0028003200390029> <a7fe> <a7fe> <0028003300300029> <a941> <a941> <0041002e> <a942> <a942> <0042002e> <a943> <a943> <0043002e> <a944> <a944> <0044002e> <a945> <a945> <0045002e> <a946> <a946> <0046002e> <a947> <a947> <0047002e> <a948> <a948> <0048002e> <a949> <a949> <0049002e> <a94a> <a94a> <004a002e> <a94b> <a94b> <004b002e> <a94c> <a94c> <004c002e> <a94d> <a94d> <004d002e> <a94e> <a94e> <004e002e> <a94f> <a94f> <004f002e> <a950> <a950> <0050002e> <a951> <a951> <0051002e> <a952> <a952> <0052002e> <a953> <a953> <0053002e> <a954> <a954> <0054002e> <a955> <a955> <0055002e> <a956> <a956> <0056002e> <a957> <a957> <0057002e> <a958> <a958> <0058002e> <a959> <a959> <0059002e> <a95a> <a95a> <005a002e> <a95b> <a95b> <0061002e> <a95c> <a95c> <0062002e> <a95d> <a95d> <0063002e> <a95e> <a95e> <0064002e> <a95f> <a95f> <0065002e> <a960> <a960> <0066002e> <a961> <a961> <0067002e> <a962> <a962> <0068002e> <a963> <a963> <0069002e> <a964> <a964> <006a002e> <a965> <a965> <006b002e> <a966> <a966> <006c002e> <a967> <a967> <006d002e> <a968> <a968> <006e002e> <a969> <a969> <006f002e> <a96a> <a96a> <0070002e> <a96b> <a96b> <0071002e> <a96c> <a96c> <0072002e> <a96d> <a96d> <0073002e> <a96e> <a96e> <0074002e> <a96f> <a96f> <0075002e> <a970> <a970> <0076002e> <a971> <a971> <0077002e> <a972> <a972> <0078002e> <a973> <a973> <0079002e> <a974> <a974> <007a002e> <aa41> <aa41> <c6b420de> <aa42> <aa42> <b2f520de> <aa43> <aa43> <c8fc20de> <aa44> <aa44> <ba8520de> <aa45> <aa45> <b30020de> <aa46> <aa46> <d61520de> <aa47> <aa47> <bd8020de> <aa48> <aa48> <c80420de> <aa49> <aa49> <c81120de> <aa4a> <aa4a> <c21820de> <aa4b> <aa4b> <b3d920de> <aa4c> <aa4c> <be4420de> <aa4d> <aa4d> <bc1820de> <aa4e> <aa4e> <c79020de> <aa4f> <aa4f> <d0c020de> <aa50> <aa50> <ac1020de> <aa51> <aa51> <c57d20de> <aa52> <aa52> <c77820de> <aa53> <aa53> <b73b20de> <aa54> <aa54> <537020de> <aa55> <aa55> <8a3b20de> <aa56> <aa56> <c60820de> <aa57> <aa57> <611f20de> <aa58> <aa58> <51a020de> <aa59> <aa59> <7b5420de> <aa5a> <aa5a> <4ee320de> <aa5b> <aa5b> <982d20de> <aa5c> <aa5c> <52d520de> <aa5d> <aa5d> <540d20de> <aa5e> <aa5e> <76ee20de> <aa5f> <aa5f> <53cd20de> <aa60> <aa60> <88dc20de> <aa61> <aa61> <672c20de> <aa62> <aa62> <526f20de> <aa63> <aa63> <5e8f20de> <aa64> <aa64> <902320de> <aa65> <aa65> <5f7120de> endbfrange 100 beginbfrange <aa66> <aa66> <4f8b20de> <aa67> <aa67> <6e9020de> <aa68> <aa68> <5b5020de> <aa69> <aa69> <524d20de> <aa6a> <aa6a> <7bc020de> <aa6b> <aa6b> <63a520de> <aa6c> <aa6c> <52a920de> <aa6d> <aa6d> <630720de> <aa6e> <aa6e> <4ed620de> <aa6f> <aa6f> <6d3e20de> <aa70> <aa70> <5f6220de> <aa71> <aa71> <c87020de> <aa72> <aa72> <bb3820de> <aa73> <aa73> <b2f520de> <aa74> <aa74> <c8fc20de> <aa75> <aa75> <b73b20de> <aa76> <aa76> <8a3b20de> <aa77> <aa77> <ad5020de> <aa78> <aa78> <c5ed20de> <aa79> <aa79> <c74c20de> <aa7a> <aa7a> <c81520de> <aa7b> <aa7b> <d57420de> <aa7c> <aa7c> <c60820de> <aa7d> <aa7d> <c87420dd> <aa81> <aa81> <b77c20dd> <aa82> <aa82> <b9c820dd> <aa83> <aa83> <bc1420dd> <aa84> <aa84> <c0ac20dd> <aa85> <aa85> <c54420dd> <aa86> <aa86> <c79020dd> <aa87> <aa87> <cc2820dd> <aa88> <aa88> <ce7420dd> <aa89> <aa89> <d0c020dd> <aa8a> <aa8a> <d30c20dd> <aa8b> <aa8b> <b19220dd> <aa8c> <aa8c> <b0ae20dd> <aa8d> <aa8d> <ba8520dd> <aa8e> <aa8e> <b30020dd> <aa8f> <aa8f> <d61520dd> <aa90> <aa90> <bd8020dd> <aa91> <aa91> <c80420dd> <aa92> <aa92> <c81120dd> <aa93> <aa93> <c21820dd> <aa94> <aa94> <b3d920dd> <aa95> <aa95> <be4420dd> <aa96> <aa96> <ac8c20dd> <aa97> <aa97> <bc1820dd> <aa98> <aa98> <c18d20dd> <aa99> <aa99> <c77820dd> <aa9a> <aa9a> <bcf820dd> <aa9b> <aa9b> <c57d20dd> <aa9c> <aa9c> <c21920dd> <aa9d> <aa9d> <c72020dd> <aa9e> <aa9e> <ad0020dd> <aa9f> <aa9f> <51a020dd> <aaf9> <aaf9> <0028003200310029> <aafa> <aafa> <0028003200320029> <aafb> <aafb> <0028003200330029> <aafc> <aafc> <0028003200340029> <aafd> <aafd> <0028003200350029> <aafe> <aafe> <0028003200360029> <ab41> <ab41> <c87020dd> <ab42> <ab42> <ad6d20dd> <ab43> <ab43> <ac1020dd> <ab44> <ab44> <537020dd> <ab45> <ab45> <886320dd> <ab46> <ab46> <672b20dd> <ab47> <ab47> <ac7020dd> <ab48> <ab48> <b2f520dd> <ab49> <ab49> <bcc020dd> <ab4a> <ab4a> <c0c120dd> <ab4b> <ab4b> <c13c20dd> <ab4c> <ab4c> <c2e020dd> <ab4d> <ab4d> <c5ec20dd> <ab4e> <ab4e> <c60820dd> <ab4f> <ab4f> <c6d020dd> <ab50> <ab50> <c79120dd> <ab51> <ab51> <c90020dd> <ab52> <ab52> <d0b920dd> <ab53> <ab53> <c67820dd> <ab54> <ab54> <d65c20dd> <ab55> <ab55> <ac0420dd> <ab56> <ab56> <ac1920dd> <ab57> <ab57> <c2e420dd> <ab58> <ab58> <611f20dd> <ab59> <ab59> <616320dd> <ab5a> <ab5a> <4ee320dd> <ab5b> <ab5b> <52d520dd> <ab5d> <ab5d> <53cd20dd> <ab5e> <ab5e> <526f20dd> <ab5f> <ab5f> <81ea20dd> <ab60> <ab60> <524d20dd> <ab61> <ab61> <96fb20dd> <ab62> <ab62> <63a520dd> <ab63> <ab63> <52a920dd> <ab64> <ab64> <6ce820dd> <ab65> <ab65> <53c320dd> <ab66> <ab66> <672c20dd> <ab67> <ab67> <65b020dd> <ab68> <ab68> <73fe20dd> endbfrange 100 beginbfrange <ab69> <ab69> <5f6220dd> <ab6a> <ab6a> <959320dd> <ab6b> <ab6b> <570b20dd> <ab6d> <ab6d> <4ed620dd> <ab6e> <ab6e> <be6020dd> <ab6f> <ab6f> <c2dc20dd> <ab70> <ab70> <c78520dd> <ab71> <ab71> <c73c20dd> <ab72> <ab72> <c74c20dd> <ab73> <ab73> <c9c120dd> <ab74> <ab74> <d45c20dd> <ab75> <ab75> <ac0020dd> <ab76> <ab76> <b09820dd> <ab77> <ab77> <b2e420dd> <ab78> <ab78> <d55820dd> <ab79> <ab79> <b9c820dd> <ab7a> <ab7a> <bc1420dd> <ab7b> <ab7b> <c0ac20dd> <ab7c> <ab7c> <c54420dd> <ab7d> <ab7d> <c79020dd> <ab81> <ab81> <cc2820dd> <ab82> <ab82> <ce7420dd> <ab83> <ab83> <d0c020dd> <ab84> <ab84> <d30c20dd> <ab85> <ab85> <d55820dd> <ab86> <ab86> <be4420dd> <ab87> <ab87> <b2f520dd> <ab88> <ab88> <be6020dd> <ab89> <ab89> <bcf820dd> <ab8a> <ab8a> <b2e820dd> <ab8b> <ab8b> <c13c20dd> <ab8c> <ab8c> <c2dc20dd> <ab8d> <ab8d> <c5ec20dd> <ab8e> <ab8e> <c60820dd> <ab8f> <ab8f> <c73c20dd> <ab90> <ab90> <c74c20dd> <ab91> <ab91> <c78520dd> <ab92> <ab92> <c81c20dd> <ab93> <ab93> <c87420dd> <ab94> <ab94> <c90020dd> <ab95> <ab95> <d45c20dd> <ab96> <ab96> <d57420dd> <ab97> <ab97> <b29020dd> <ab98> <ab98> <b19220dd> <ab99> <ab99> <b0ae20dd> <ab9a> <ab9a> <bc1820dd> <ab9b> <ab9b> <ac0020dd> <ab9c> <ab9c> <b09820dd> <ab9d> <ab9d> <b2e420dd> <ab9e> <ab9e> <b77c20dd> <ab9f> <ab9f> <c67820dd> <abf7> <abf7> <0028003200370029> <abf8> <abf8> <0028003200380029> <abf9> <abf9> <0028003200390029> <abfa> <abfa> <0028003300300029> <ac91> <ac91> <b2e820dd> <ac92> <ac92> <cc3820dd> <ac93> <ac93> <c18c20dd> <ac94> <ac94> <c91120dd> <ac95> <ac95> <c77c20dd> <ac96> <ac96> <c77420dd> <ac97> <ac97> <d73420dd> <acc2> <acc2> <003120de> <acc3> <acc3> <003220de> <acc4> <acc4> <003320de> <acc5> <acc5> <003420de> <acc6> <acc6> <003520de> <acc7> <acc7> <003620de> <acc8> <acc8> <003720de> <acc9> <acc9> <003820de> <acca> <acca> <003920de> <accb> <accb> <005b00310030005d> <accc> <accc> <005b00310031005d> <accd> <accd> <005b00310032005d> <acce> <acce> <005b00310033005d> <accf> <accf> <005b00310034005d> <acd0> <acd0> <005b00310035005d> <acf2> <acf2> <005b00310036005d> <acf3> <acf3> <005b00310037005d> <acf4> <acf4> <005b00310038005d> <acf5> <acf5> <005b00310039005d> <acf6> <acf6> <005b00320030005d> <ad41> <ad41> <4e0020de> <ad42> <ad42> <4e8c20de> <ad43> <ad43> <4e0920de> <ad44> <ad44> <56db20de> <ad45> <ad45> <4e9420de> <ad46> <ad46> <516d20de> <ad47> <ad47> <4e0320de> <ad48> <ad48> <516b20de> <ad49> <ad49> <4e5d20de> <ad4a> <ad4a> <534120de> <ad4b> <ad4b> <005b53414e00005d> <ad4c> <ad4c> <005b53414e8c005d> <ad4d> <ad4d> <005b53414e09005d> <ad4e> <ad4e> <005b534156db005d> <ad4f> <ad4f> <005b53414e94005d> <ad50> <ad50> <005b5341516d005d> <ad51> <ad51> <005b53414e03005d> <ad52> <ad52> <005b5341516b005d> endbfrange 36 beginbfrange <ad53> <ad53> <005b53414e5d005d> <ad54> <ad54> <005b4e8c5341005d> <ad55> <ad55> <4e0020de> <ad56> <ad56> <4e8c20de> <ad57> <ad57> <4e0920de> <ad58> <ad58> <56db20de> <ad59> <ad59> <4e9420de> <ad5a> <ad5a> <516d20de> <ad5b> <ad5b> <4e0320de> <ad5c> <ad5c> <516b20de> <ad5d> <ad5d> <4e5d20de> <ad5e> <ad5e> <534120de> <ad5f> <ad5f> <005b53414e00005d> <ad60> <ad60> <005b53414e8c005d> <ad61> <ad61> <005b53414e09005d> <ad62> <ad62> <005b534156db005d> <ad63> <ad63> <005b53414e94005d> <ad64> <ad64> <005b5341516d005d> <ad65> <ad65> <005b53414e03005d> <ad66> <ad66> <005b5341516b005d> <ad67> <ad67> <005b53414e5d005d> <ad68> <ad68> <005b4e8c5341005d> <ad69> <ad69> <65e520de> <ad6a> <ad6a> <670820de> <ad6b> <ad6b> <706b20de> <ad6c> <ad6c> <6c3420de> <ad6d> <ad6d> <672820de> <ad6e> <ad6e> <91d120de> <ad6f> <ad6f> <571f20de> <ad77> <ad77> <65e520de> <ad78> <ad78> <670820de> <ad79> <ad79> <706b20de> <ad7a> <ad7a> <6c3420de> <ad7b> <ad7b> <672820de> <ad7c> <ad7c> <91d120de> <ad7d> <ad7d> <571f20de> endbfrange endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF \ No newline at end of file
diff --git a/src/main/resources/Resources/cmap/KSCpc-EUC-UCS2C b/src/main/resources/Resources/cmap/KSCpc-EUC-UCS2C
new file mode 100644
index 0000000..2aee344
--- /dev/null
+++ b/src/main/resources/Resources/cmap/KSCpc-EUC-UCS2C
@@ -0,0 +1 @@
+%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%IncludeResource: ProcSet (CIDInit) %%BeginResource: CMap (KSCpc-EUC-UCS2C) %%Title: (KSCpc-EUC-UCS2C) %%Version: 4.002 %%Copyright: ----------------------------------------------------------- %%Copyright: Copyright 1990-1999 Adobe Systems Incorporated. %%Copyright: All Rights Reserved. %%Copyright: %%Copyright: Patents Pending %%Copyright: %%Copyright: NOTICE: All information contained herein is the property %%Copyright: of Adobe Systems Incorporated. %%Copyright: %%Copyright: Permission is granted for redistribution of this file %%Copyright: provided this copyright notice is maintained intact and %%Copyright: that the contents of this file are not altered in any %%Copyright: way from its original form. %%Copyright: %%Copyright: PostScript and Display PostScript are trademarks of %%Copyright: Adobe Systems Incorporated which may be registered in %%Copyright: certain jurisdictions. %%Copyright: ----------------------------------------------------------- %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo 3 dict dup begin /Registry (Adobe) def /Ordering (KSCpc_EUC_UCS2C) def /Supplement 1 def end def /CMapName /KSCpc-EUC-UCS2C def /CMapVersion 4.002 def /CMapType 1 def /WMode 0 def 3 begincodespacerange <00> <9F> <A141> <FDFE> <FE> <FF> endcodespacerange 100 beginbfrange <00> <7F> <0000> <80> <80> <00A0> <81> <81> <20A9> <82> <82> <2010> <83> <83> <00A9> <84> <84> <FF3F> <85> <9F> <0085> <FE> <FE> <2122> <FF> <FF> <22EF> <A141> <A142> <300C> <A143> <A144> <300C> <A145> <A148> <300C> <A149> <A14A> <300A> <A14B> <A14C> <3008> <A14D> <A14E> <0028> <A14F> <A150> <0028> <A155> <A156> <0028> <A157> <A158> <0028> <A159> <A15A> <0028> <A15B> <A15C> <3010> <A15D> <A160> <3016> <A161> <A161> <005B> <A162> <A162> <005D> <A163> <A163> <005B> <A164> <A164> <005D> <A165> <A166> <0028> <A167> <A168> <2020> <A169> <A16A> <2020> <A16B> <A16B> <2020> <A16C> <A16C> <002A> <A16F> <A16F> <201F> <A170> <A170> <201B> <A171> <A172> <207A> <A173> <A173> <00D7> <A174> <A174> <221E> <A175> <A175> <223D> <A176> <A176> <00B1> <A177> <A177> <2213> <A178> <A178> <003E> <A179> <A179> <003C> <A17A> <A17A> <207C> <A17B> <A17B> <2260> <A17C> <A17D> <207D> <A181> <A181> <007B> <A182> <A182> <007D> <A183> <A183> <005B> <A184> <A184> <005D> <A185> <A186> <2229> <A187> <A187> <2282> <A188> <A188> <2208> <A189> <A189> <2211> <A18A> <A18A> <0021> <A18B> <A18B> <3007> <A18C> <A18C> <4E00> <A18D> <A18D> <4E8C> <A18E> <A18E> <4E09> <A18F> <A18F> <56DB> <A190> <A190> <4E94> <A191> <A191> <516D> <A192> <A192> <4E03> <A193> <A193> <516B> <A194> <A194> <4E5D> <A195> <A195> <5341> <A198> <A198> <02BC> <A199> <A19A> <3014> <A19C> <A19C> <FF0A> <A19E> <A19E> <FF0A> <A19F> <A19F> <FF0A> <A1A1> <A1A3> <3000> <A1A4> <A1A4> <00B7> <A1A5> <A1A6> <2025> <A1A7> <A1A7> <00A8> <A1A8> <A1A8> <3003> <A1A9> <A1AA> <2013> <A1AB> <A1AB> <2016> <A1AC> <A1AC> <FF3C> <A1AD> <A1AD> <301C> <A1AE> <A1AF> <2018> <A1B0> <A1B1> <201C> <A1B2> <A1B3> <3014> <A1B4> <A1BD> <3008> <A1BE> <A1BE> <00B1> <A1BF> <A1BF> <00D7> <A1C0> <A1C0> <00F7> <A1C1> <A1C1> <2260> <A1C2> <A1C3> <2264> <A1C4> <A1C4> <221E> <A1C5> <A1C5> <2234> <A1C6> <A1C6> <00B0> <A1C7> <A1C8> <2032> <A1C9> <A1C9> <2103> <A1CA> <A1CA> <212B> <A1CB> <A1CC> <00A2> <A1CD> <A1CD> <00A5> <A1CE> <A1CE> <2642> <A1CF> <A1CF> <2640> <A1D0> <A1D0> <2220> <A1D1> <A1D1> <22A5> <A1D2> <A1D2> <2312> <A1D3> <A1D3> <2202> endbfrange 100 beginbfrange <A1D4> <A1D4> <2207> <A1D5> <A1D5> <2261> <A1D6> <A1D6> <2252> <A1D7> <A1D7> <00A7> <A1D8> <A1D8> <203B> <A1D9> <A1D9> <2606> <A1DA> <A1DA> <2605> <A1DB> <A1DB> <25CB> <A1DC> <A1DC> <25CF> <A1DD> <A1DD> <25CE> <A1DE> <A1DE> <25C7> <A1DF> <A1DF> <25C6> <A1E0> <A1E0> <25A1> <A1E1> <A1E1> <25A0> <A1E2> <A1E2> <25B3> <A1E3> <A1E3> <25B2> <A1E4> <A1E4> <25BD> <A1E5> <A1E5> <25BC> <A1E6> <A1E6> <2192> <A1E7> <A1E8> <2190> <A1E9> <A1EA> <2193> <A1EB> <A1EB> <3013> <A1EC> <A1ED> <226A> <A1EE> <A1EE> <221A> <A1EF> <A1EF> <223D> <A1F0> <A1F0> <221D> <A1F1> <A1F1> <2235> <A1F2> <A1F3> <222B> <A1F4> <A1F4> <2208> <A1F5> <A1F5> <220B> <A1F6> <A1F7> <2286> <A1F8> <A1F9> <2282> <A1FA> <A1FA> <222A> <A1FB> <A1FB> <2229> <A1FC> <A1FD> <2227> <A1FE> <A1FE> <00AC> <A245> <A246> <0028> <A247> <A248> <3016> <A249> <A24A> <3010> <A24B> <A24C> <0028> <A2A1> <A2A1> <21D2> <A2A2> <A2A2> <21D4> <A2A3> <A2A3> <2200> <A2A4> <A2A4> <2203> <A2A5> <A2A5> <00B4> <A2A6> <A2A6> <02DC> <A2A7> <A2A7> <02C7> <A2A8> <A2A8> <02D8> <A2A9> <A2A9> <02DD> <A2AA> <A2AA> <02DA> <A2AB> <A2AB> <02D9> <A2AC> <A2AC> <00B8> <A2AD> <A2AD> <02DB> <A2AE> <A2AE> <00A1> <A2AF> <A2AF> <00BF> <A2B0> <A2B0> <02D0> <A2B1> <A2B1> <222E> <A2B2> <A2B2> <2211> <A2B3> <A2B3> <220F> <A2B4> <A2B4> <00A4> <A2B5> <A2B5> <2109> <A2B6> <A2B6> <2030> <A2B7> <A2B7> <25C1> <A2B8> <A2B8> <25C0> <A2B9> <A2B9> <25B7> <A2BA> <A2BA> <25B6> <A2BB> <A2BB> <2664> <A2BC> <A2BD> <2660> <A2BE> <A2BE> <2665> <A2BF> <A2BF> <2667> <A2C0> <A2C0> <2663> <A2C1> <A2C1> <25C9> <A2C2> <A2C2> <25C8> <A2C3> <A2C3> <25A3> <A2C4> <A2C5> <25D0> <A2C6> <A2C6> <2592> <A2C7> <A2C8> <25A4> <A2C9> <A2C9> <25A8> <A2CA> <A2CA> <25A7> <A2CB> <A2CB> <25A6> <A2CC> <A2CC> <25A9> <A2CD> <A2CD> <2668> <A2CE> <A2CE> <260F> <A2CF> <A2CF> <260E> <A2D0> <A2D0> <261C> <A2D1> <A2D1> <261E> <A2D2> <A2D2> <00B6> <A2D3> <A2D4> <2020> <A2D5> <A2D5> <2195> <A2D6> <A2D6> <2197> <A2D7> <A2D7> <2199> <A2D8> <A2D8> <2196> <A2D9> <A2D9> <2198> <A2DA> <A2DA> <266D> <A2DB> <A2DC> <2669> <A2DD> <A2DD> <266C> <A2DE> <A2DE> <327F> <A2DF> <A2DF> <321C> <A2E0> <A2E0> <2116> <A2E1> <A2E1> <33C7> endbfrange 100 beginbfrange <A2E2> <A2E2> <2122> <A2E3> <A2E3> <33C2> <A2E4> <A2E4> <33D8> <A2E5> <A2E5> <2121> <A2FA> <A2FA> <00B6> <A2FB> <A2FB> <2016> <A2FC> <A2FC> <2016> <A2FD> <A2FD> <22EE> <A2FE> <A2FE> <2237> <A355> <A35E> <278A> <A35F> <A368> <246A> <A386> <A39F> <24B6> <A3A1> <A3DB> <FF01> <A3DC> <A3DC> <FFE6> <A3DD> <A3FD> <FF3D> <A3FE> <A3FE> <203E> <A469> <A472> <278A> <A473> <A47C> <246A> <A481> <A482> <227A> <A483> <A484> <22CE> <A485> <A486> <2280> <A487> <A48A> <2270> <A48B> <A48B> <2286> <A48C> <A48C> <228A> <A48D> <A48D> <2287> <A48E> <A48E> <228B> <A48F> <A490> <2276> <A491> <A491> <2279> <A492> <A493> <22DA> <A498> <A498> <2222> <A499> <A499> <2245> <A49A> <A49A> <2243> <A49B> <A49B> <2248> <A49D> <A49D> <22A4> <A4A1> <A4FE> <3131> <A54B> <A54B> <24EA> <A54C> <A554> <2460> <A5A1> <A5AA> <2170> <A5B0> <A5B9> <2160> <A5C1> <A5D1> <0391> <A5D2> <A5D8> <03A3> <A5DA> <A5DA> <FF01> <A5DB> <A5DB> <3002> <A5DC> <A5DE> <2032> <A5E1> <A5F1> <03B1> <A5F2> <A5F8> <03C3> <A643> <A643> <2020> <A647> <A647> <00A7> <A648> <A648> <266F> <A649> <A649> <FF0A> <A64A> <A64A> <FF0A> <A64D> <A64D> <2042> <A64E> <A64E> <FF0A> <A651> <A651> <2042> <A652> <A652> <273D> <A655> <A655> <2022> <A65A> <A65B> <2039> <A65C> <A65C> <00AB> <A65D> <A65D> <00BB> <A65E> <A65E> <261C> <A65F> <A65F> <261E> <A668> <A668> <25CE> <A66C> <A66C> <271A> <A66D> <A66D> <2716> <A66F> <A66F> <25EF> <A673> <A673> <2756> <A675> <A675> <25CC> <A67A> <A67A> <2756> <A690> <A690> <20A9> <A692> <A692> <534D> <A693> <A693> <262F> <A697> <A697> <262F> <A698> <A698> <262F> <A69E> <A69E> <3020> <A6A1> <A6A1> <2500> <A6A2> <A6A2> <2502> <A6A3> <A6A3> <250C> <A6A4> <A6A4> <2510> <A6A5> <A6A5> <2518> <A6A6> <A6A6> <2514> <A6A7> <A6A7> <251C> <A6A8> <A6A8> <252C> <A6A9> <A6A9> <2524> <A6AA> <A6AA> <2534> <A6AB> <A6AB> <253C> <A6AC> <A6AC> <2501> <A6AD> <A6AD> <2503> <A6AE> <A6AE> <250F> <A6AF> <A6AF> <2513> <A6B0> <A6B0> <251B> <A6B1> <A6B1> <2517> <A6B2> <A6B2> <2523> <A6B3> <A6B3> <2533> <A6B4> <A6B4> <252B> <A6B5> <A6B5> <253B> <A6B6> <A6B6> <254B> <A6B7> <A6B7> <2520> <A6B8> <A6B8> <252F> <A6B9> <A6B9> <2528> <A6BA> <A6BA> <2537> endbfrange 100 beginbfrange <A6BB> <A6BB> <253F> <A6BC> <A6BC> <251D> <A6BD> <A6BD> <2530> <A6BE> <A6BE> <2525> <A6BF> <A6BF> <2538> <A6C0> <A6C0> <2542> <A6C1> <A6C1> <2512> <A6C2> <A6C2> <2511> <A6C3> <A6C3> <251A> <A6C4> <A6C4> <2519> <A6C5> <A6C5> <2516> <A6C6> <A6C6> <2515> <A6C7> <A6C7> <250E> <A6C8> <A6C8> <250D> <A6C9> <A6CA> <251E> <A6CB> <A6CC> <2521> <A6CD> <A6CE> <2526> <A6CF> <A6D0> <2529> <A6D1> <A6D2> <252D> <A6D3> <A6D4> <2531> <A6D5> <A6D6> <2535> <A6D7> <A6D8> <2539> <A6D9> <A6DA> <253D> <A6DB> <A6DC> <2540> <A6DD> <A6E4> <2543> <A6E5> <A6EE> <2776> <A6EF> <A6F8> <246A> <A741> <A741> <2642> <A742> <A742> <3012> <A743> <A743> <3036> <A751> <A751> <2206> <A752> <A752> <2206> <A753> <A753> <221F> <A754> <A754> <222A> <A755> <A756> <2225> <A757> <A757> <2229> <A758> <A758> <2253> <A759> <A759> <2251> <A75A> <A75B> <2266> <A75C> <A75C> <2213> <A75D> <A75F> <2295> <A761> <A761> <2314> <A764> <A764> <2262> <A766> <A766> <25B1> <A768> <A768> <2222> <A769> <A769> <2250> <A76C> <A76C> <22A3> <A76F> <A770> <226E> <A771> <A771> <2285> <A772> <A772> <2284> <A773> <A773> <2209> <A774> <A774> <220C> <A775> <A776> <22BB> <A777> <A777> <225A> <A778> <A778> <2306> <A77A> <A77A> <2314> <A782> <A782> <329E> <A783> <A783> <329E> <A784> <A784> <203C> <A786> <A786> <203C> <A788> <A788> <25C7> <A789> <A789> <25C7> <A78A> <A78A> <25C7> <A78B> <A78B> <25C6> <A78C> <A78C> <25A1> <A78D> <A78D> <25A1> <A78E> <A78E> <25A1> <A78F> <A78F> <25A0> <A790> <A790> <25E6> <A791> <A791> <25CB> <A792> <A792> <25CB> <A793> <A793> <25CF> <A794> <A794> <25BF> <A795> <A795> <25B5> <A796> <A796> <25B9> <A797> <A797> <25C3> <A79C> <A79C> <25CA> <A79D> <A79D> <3231> <A79E> <A79E> <3239> <A79F> <A79F> <33CB> <A7A1> <A7A3> <3395> <A7A4> <A7A4> <2113> <A7A5> <A7A5> <3398> <A7A6> <A7A6> <33C4> <A7A7> <A7AA> <33A3> <A7AB> <A7B4> <3399> <A7B5> <A7B5> <33CA> <A7B6> <A7B8> <338D> <A7B9> <A7B9> <33CF> <A7BA> <A7BB> <3388> <A7BC> <A7BC> <33C8> <A7BD> <A7BE> <33A7> <A7BF> <A7C8> <33B0> <A7C9> <A7CD> <3380> <A7CE> <A7D3> <33BA> <A7D4> <A7D8> <3390> <A7D9> <A7D9> <2126> <A7DA> <A7DB> <33C0> <A7DC> <A7DE> <338A> <A7DF> <A7DF> <33D6> endbfrange 100 beginbfrange <A7E0> <A7E0> <33C5> <A7E1> <A7E3> <33AD> <A7E4> <A7E4> <33DB> <A7E5> <A7E8> <33A9> <A7E9> <A7E9> <33DD> <A7EA> <A7EA> <33D0> <A7EB> <A7EB> <33D3> <A7EC> <A7EC> <33C3> <A7ED> <A7ED> <33C9> <A7EE> <A7EE> <33DC> <A7EF> <A7EF> <33C6> <A7F0> <A7F4> <246F> <A841> <A841> <2192> <A842> <A843> <2190> <A844> <A844> <2193> <A845> <A848> <2196> <A849> <A849> <21D0> <A84A> <A84A> <21CF> <A84B> <A84B> <21CD> <A84C> <A84C> <21D4> <A84D> <A84D> <2192> <A84E> <A84F> <2190> <A850> <A852> <2193> <A853> <A853> <2190> <A854> <A854> <2192> <A855> <A855> <2191> <A856> <A856> <2193> <A85F> <A85F> <2190> <A860> <A860> <2192> <A861> <A861> <2191> <A862> <A862> <2193> <A863> <A863> <2190> <A864> <A864> <2192> <A865> <A865> <2191> <A866> <A866> <2193> <A86F> <A86F> <21D0> <A870> <A870> <21D2> <A871> <A871> <21D1> <A872> <A872> <21D3> <A87B> <A87B> <21B2> <A87C> <A87C> <21B1> <A881> <A881> <21B4> <A882> <A882> <21B0> <A883> <A883> <21B3> <A886> <A886> <21B2> <A887> <A887> <21B1> <A888> <A888> <21BB> <A889> <A889> <21B7> <A88A> <A88A> <21B0> <A88B> <A88B> <21B3> <A88C> <A88C> <21B6> <A88D> <A88D> <21BA> <A88E> <A88E> <21E6> <A88F> <A88F> <21E8> <A890> <A890> <21E7> <A891> <A891> <21E9> <A892> <A892> <21BC> <A893> <A893> <21C0> <A898> <A898> <21BC> <A899> <A899> <21C0> <A89E> <A89F> <21C4> <A8A1> <A8A1> <00C6> <A8A2> <A8A2> <00D0> <A8A3> <A8A3> <00AA> <A8A4> <A8A4> <0126> <A8A6> <A8A6> <0132> <A8A8> <A8A8> <013F> <A8A9> <A8A9> <0141> <A8AA> <A8AA> <00D8> <A8AB> <A8AB> <0152> <A8AC> <A8AC> <00BA> <A8AD> <A8AD> <00DE> <A8AE> <A8AE> <0166> <A8AF> <A8AF> <014A> <A8B1> <A8CC> <3260> <A8CD> <A8E6> <24D0> <A8E7> <A8F5> <2460> <A8F6> <A8F6> <00BD> <A8F7> <A8F8> <2153> <A8F9> <A8F9> <00BC> <A8FA> <A8FA> <00BE> <A8FB> <A8FE> <215B> <A9A1> <A9A1> <00E6> <A9A2> <A9A2> <0111> <A9A3> <A9A3> <00F0> <A9A4> <A9A4> <0127> <A9A5> <A9A5> <0131> <A9A6> <A9A6> <0133> <A9A7> <A9A7> <0138> <A9A8> <A9A8> <0140> <A9A9> <A9A9> <0142> <A9AA> <A9AA> <00F8> <A9AB> <A9AB> <0153> <A9AC> <A9AC> <00DF> <A9AD> <A9AD> <00FE> <A9AE> <A9AE> <0167> <A9AF> <A9AF> <014B> <A9B0> <A9B0> <0149> <A9B1> <A9CC> <3200> <A9CD> <A9E6> <249C> endbfrange 100 beginbfrange <A9E7> <A9F5> <2474> <A9F6> <A9F6> <00B9> <A9F7> <A9F8> <00B2> <A9F9> <A9F9> <2074> <A9FA> <A9FA> <207F> <A9FB> <A9FE> <2081> <AAA1> <AAF3> <3041> <AAF4> <AAF8> <2483> <AB5C> <AB5C> <3294> <AB6C> <AB6C> <32A5> <ABA1> <ABF6> <30A1> <AC44> <AC44> <21D2> <AC45> <AC45> <21D0> <AC4C> <AC4C> <21BC> <AC4D> <AC4D> <21C0> <AC55> <AC55> <2190> <AC56> <AC56> <2192> <AC57> <AC57> <2191> <AC58> <AC58> <2193> <AC59> <AC59> <21E6> <AC5A> <AC5A> <21E8> <AC5B> <AC5B> <21E7> <AC5C> <AC5C> <21E9> <AC5D> <AC5D> <2190> <AC5E> <AC5E> <2192> <AC60> <AC60> <2191> <AC61> <AC61> <2193> <AC62> <AC62> <2190> <AC63> <AC63> <2192> <AC64> <AC64> <2191> <AC65> <AC65> <2193> <AC66> <AC66> <2190> <AC67> <AC67> <2192> <AC68> <AC68> <2191> <AC69> <AC69> <2193> <AC6A> <AC6A> <21E0> <AC6B> <AC6B> <21E2> <AC6C> <AC6C> <21E1> <AC6D> <AC6D> <21E3> <AC6E> <AC6E> <21E6> <AC6F> <AC6F> <21E8> <AC70> <AC70> <21E7> <AC71> <AC71> <21E9> <AC72> <AC72> <21E6> <AC73> <AC73> <21E8> <AC74> <AC74> <21E7> <AC75> <AC75> <21E9> <AC76> <AC76> <21B2> <AC77> <AC77> <21B1> <AC78> <AC78> <21BB> <AC79> <AC79> <21B7> <AC7A> <AC7A> <21B0> <AC7B> <AC7B> <21B3> <AC7C> <AC7C> <21B6> <AC7D> <AC7D> <21BA> <AC81> <AC81> <21B2> <AC82> <AC82> <21B1> <AC83> <AC83> <21BB> <AC84> <AC84> <21B7> <AC85> <AC85> <21B0> <AC86> <AC86> <21B3> <AC87> <AC87> <21B6> <AC88> <AC88> <21BA> <AC89> <AC89> <2190> <AC8A> <AC8A> <2192> <AC8B> <AC8B> <2191> <AC8C> <AC8C> <2193> <AC8D> <AC8D> <261D> <AC8E> <AC8E> <261F> <AC8F> <AC8F> <261D> <AC90> <AC90> <261F> <ACA1> <ACA6> <0410> <ACA7> <ACA7> <0401> <ACA8> <ACC1> <0416> <ACD1> <ACD6> <0430> <ACD7> <ACD7> <0451> <ACD8> <ACF1> <0436> <AD70> <AD70> <3290> <AD71> <AD76> <328A> <ADA1> <ADA4> <300C> <ADA5> <ADA5> <21E8> <ADA6> <ADA7> <21E6> <ADA8> <ADA8> <21E9> <ADA9> <ADAA> <301E> <ADAB> <ADAB> <2036> <ADAC> <ADAC> <2033> <ADAD> <ADAD> <2035> <ADAE> <ADAE> <2032> <ADB0> <ADB0> <0021> <B0A1> <B0A2> <AC00> <B0A3> <B0A3> <AC04> <B0A4> <B0A7> <AC07> <B0A8> <B0AF> <AC10> <B0B0> <B0B4> <AC19> <B0B5> <B0B5> <AC20> <B0B6> <B0B6> <AC24> <B0B7> <B0B8> <AC2C> <B0B9> <B0BB> <AC2F> <B0BC> <B0BD> <AC38> <B0BE> <B0BE> <AC3C> endbfrange 100 beginbfrange <B0BF> <B0BF> <AC40> <B0C0> <B0C0> <AC4B> <B0C1> <B0C1> <AC4D> <B0C2> <B0C2> <AC54> <B0C3> <B0C3> <AC58> <B0C4> <B0C4> <AC5C> <B0C5> <B0C6> <AC70> <B0C7> <B0C7> <AC74> <B0C8> <B0C9> <AC77> <B0CA> <B0CA> <AC7A> <B0CB> <B0CC> <AC80> <B0CD> <B0D0> <AC83> <B0D1> <B0D4> <AC89> <B0D5> <B0D5> <AC90> <B0D6> <B0D6> <AC94> <B0D7> <B0D8> <AC9C> <B0D9> <B0DB> <AC9F> <B0DC> <B0DE> <ACA8> <B0DF> <B0DF> <ACAC> <B0E0> <B0E1> <ACAF> <B0E2> <B0E3> <ACB8> <B0E4> <B0E6> <ACBB> <B0E7> <B0E7> <ACC1> <B0E8> <B0E8> <ACC4> <B0E9> <B0E9> <ACC8> <B0EA> <B0EA> <ACCC> <B0EB> <B0EB> <ACD5> <B0EC> <B0EC> <ACD7> <B0ED> <B0EE> <ACE0> <B0EF> <B0EF> <ACE4> <B0F0> <B0F1> <ACE7> <B0F2> <B0F2> <ACEA> <B0F3> <B0F3> <ACEC> <B0F4> <B0F6> <ACEF> <B0F7> <B0F7> <ACF3> <B0F8> <B0F9> <ACF5> <B0FA> <B0FB> <ACFC> <B0FC> <B0FC> <AD00> <B0FD> <B0FD> <AD04> <B0FE> <B0FE> <AD06> <B1A1> <B1A2> <AD0C> <B1A3> <B1A3> <AD0F> <B1A4> <B1A4> <AD11> <B1A5> <B1A5> <AD18> <B1A6> <B1A6> <AD1C> <B1A7> <B1A7> <AD20> <B1A8> <B1A8> <AD29> <B1A9> <B1AA> <AD2C> <B1AB> <B1AC> <AD34> <B1AD> <B1AD> <AD38> <B1AE> <B1AE> <AD3C> <B1AF> <B1B0> <AD44> <B1B1> <B1B1> <AD47> <B1B2> <B1B2> <AD49> <B1B3> <B1B3> <AD50> <B1B4> <B1B4> <AD54> <B1B5> <B1B5> <AD58> <B1B6> <B1B6> <AD61> <B1B7> <B1B7> <AD63> <B1B8> <B1B9> <AD6C> <B1BA> <B1BA> <AD70> <B1BB> <B1BE> <AD73> <B1BF> <B1C1> <AD7B> <B1C2> <B1C2> <AD7F> <B1C3> <B1C4> <AD81> <B1C5> <B1C6> <AD88> <B1C7> <B1C7> <AD8C> <B1C8> <B1C8> <AD90> <B1C9> <B1CA> <AD9C> <B1CB> <B1CB> <ADA4> <B1CC> <B1CC> <ADB7> <B1CD> <B1CE> <ADC0> <B1CF> <B1CF> <ADC4> <B1D0> <B1D0> <ADC8> <B1D1> <B1D2> <ADD0> <B1D3> <B1D3> <ADD3> <B1D4> <B1D4> <ADDC> <B1D5> <B1D5> <ADE0> <B1D6> <B1D6> <ADE4> <B1D7> <B1D8> <ADF8> <B1D9> <B1D9> <ADFC> <B1DA> <B1DC> <ADFF> <B1DD> <B1DE> <AE08> <B1DF> <B1DF> <AE0B> <B1E0> <B1E0> <AE0D> <B1E1> <B1E1> <AE14> <B1E2> <B1E3> <AE30> <B1E4> <B1E4> <AE34> <B1E5> <B1E6> <AE37> <B1E7> <B1E7> <AE3A> <B1E8> <B1E9> <AE40> <B1EA> <B1EA> <AE43> <B1EB> <B1EC> <AE45> <B1ED> <B1ED> <AE4A> <B1EE> <B1F0> <AE4C> <B1F1> <B1F1> <AE50> <B1F2> <B1F2> <AE54> <B1F3> <B1F3> <AE56> <B1F4> <B1F5> <AE5C> <B1F6> <B1F8> <AE5F> endbfrange 100 beginbfrange <B1F9> <B1F9> <AE65> <B1FA> <B1FB> <AE68> <B1FC> <B1FC> <AE6C> <B1FD> <B1FD> <AE70> <B1FE> <B1FE> <AE78> <B2A1> <B2A1> <AE79> <B2A2> <B2A4> <AE7B> <B2A5> <B2A6> <AE84> <B2A7> <B2A7> <AE8C> <B2A8> <B2AA> <AEBC> <B2AB> <B2AB> <AEC0> <B2AC> <B2AC> <AEC4> <B2AD> <B2AE> <AECC> <B2AF> <B2B1> <AECF> <B2B2> <B2B3> <AED8> <B2B4> <B2B4> <AEDC> <B2B5> <B2B5> <AEE8> <B2B6> <B2B6> <AEEB> <B2B7> <B2B7> <AEED> <B2B8> <B2B8> <AEF4> <B2B9> <B2B9> <AEF8> <B2BA> <B2BA> <AEFC> <B2BB> <B2BC> <AF07> <B2BD> <B2BD> <AF0D> <B2BE> <B2BE> <AF10> <B2BF> <B2C0> <AF2C> <B2C1> <B2C1> <AF30> <B2C2> <B2C2> <AF32> <B2C3> <B2C3> <AF34> <B2C4> <B2C5> <AF3C> <B2C6> <B2C6> <AF3F> <B2C7> <B2C9> <AF41> <B2CA> <B2CB> <AF48> <B2CC> <B2CC> <AF50> <B2CD> <B2CE> <AF5C> <B2CF> <B2D0> <AF64> <B2D1> <B2D1> <AF79> <B2D2> <B2D2> <AF80> <B2D3> <B2D3> <AF84> <B2D4> <B2D4> <AF88> <B2D5> <B2D6> <AF90> <B2D7> <B2D7> <AF95> <B2D8> <B2D8> <AF9C> <B2D9> <B2DA> <AFB8> <B2DB> <B2DB> <AFBC> <B2DC> <B2DC> <AFC0> <B2DD> <B2DF> <AFC7> <B2E0> <B2E0> <AFCB> <B2E1> <B2E2> <AFCD> <B2E3> <B2E3> <AFD4> <B2E4> <B2E4> <AFDC> <B2E5> <B2E6> <AFE8> <B2E7> <B2E8> <AFF0> <B2E9> <B2E9> <AFF4> <B2EA> <B2EA> <AFF8> <B2EB> <B2EC> <B000> <B2ED> <B2ED> <B004> <B2EE> <B2EE> <B00C> <B2EF> <B2EF> <B010> <B2F0> <B2F0> <B014> <B2F1> <B2F2> <B01C> <B2F3> <B2F3> <B028> <B2F4> <B2F5> <B044> <B2F6> <B2F6> <B048> <B2F7> <B2F7> <B04A> <B2F8> <B2F8> <B04C> <B2F9> <B2F9> <B04E> <B2FA> <B2FC> <B053> <B2FD> <B2FD> <B057> <B2FE> <B2FE> <B059> <B3A1> <B3A1> <B05D> <B3A2> <B3A3> <B07C> <B3A4> <B3A4> <B080> <B3A5> <B3A5> <B084> <B3A6> <B3A7> <B08C> <B3A8> <B3A8> <B08F> <B3A9> <B3A9> <B091> <B3AA> <B3AC> <B098> <B3AD> <B3AD> <B09C> <B3AE> <B3B1> <B09F> <B3B2> <B3B3> <B0A8> <B3B4> <B3B8> <B0AB> <B3B9> <B3B9> <B0B1> <B3BA> <B3BC> <B0B3> <B3BD> <B3BD> <B0B8> <B3BE> <B3BE> <B0BC> <B3BF> <B3C0> <B0C4> <B3C1> <B3C3> <B0C7> <B3C4> <B3C5> <B0D0> <B3C6> <B3C6> <B0D4> <B3C7> <B3C7> <B0D8> <B3C8> <B3C8> <B0E0> <B3C9> <B3C9> <B0E5> <B3CA> <B3CB> <B108> <B3CC> <B3CD> <B10B> <B3CE> <B3CE> <B110> <B3CF> <B3D0> <B112> <B3D1> <B3D2> <B118> <B3D3> <B3D5> <B11B> <B3D6> <B3D8> <B123> endbfrange 100 beginbfrange <B3D9> <B3D9> <B128> <B3DA> <B3DA> <B12C> <B3DB> <B3DC> <B134> <B3DD> <B3DF> <B137> <B3E0> <B3E1> <B140> <B3E2> <B3E2> <B144> <B3E3> <B3E3> <B148> <B3E4> <B3E5> <B150> <B3E6> <B3E7> <B154> <B3E8> <B3E8> <B158> <B3E9> <B3E9> <B15C> <B3EA> <B3EA> <B160> <B3EB> <B3EC> <B178> <B3ED> <B3ED> <B17C> <B3EE> <B3EE> <B180> <B3EF> <B3EF> <B182> <B3F0> <B3F1> <B188> <B3F2> <B3F2> <B18B> <B3F3> <B3F3> <B18D> <B3F4> <B3F6> <B192> <B3F7> <B3F7> <B198> <B3F8> <B3F8> <B19C> <B3F9> <B3F9> <B1A8> <B3FA> <B3FA> <B1CC> <B3FB> <B3FB> <B1D0> <B3FC> <B3FC> <B1D4> <B3FD> <B3FE> <B1DC> <B4A1> <B4A1> <B1DF> <B4A2> <B4A3> <B1E8> <B4A4> <B4A4> <B1EC> <B4A5> <B4A5> <B1F0> <B4A6> <B4A6> <B1F9> <B4A7> <B4A7> <B1FB> <B4A8> <B4A8> <B1FD> <B4A9> <B4AA> <B204> <B4AB> <B4AB> <B208> <B4AC> <B4AD> <B20B> <B4AE> <B4AF> <B214> <B4B0> <B4B0> <B217> <B4B1> <B4B1> <B219> <B4B2> <B4B2> <B220> <B4B3> <B4B3> <B234> <B4B4> <B4B4> <B23C> <B4B5> <B4B5> <B258> <B4B6> <B4B6> <B25C> <B4B7> <B4B7> <B260> <B4B8> <B4B9> <B268> <B4BA> <B4BB> <B274> <B4BC> <B4BC> <B27C> <B4BD> <B4BE> <B284> <B4BF> <B4BF> <B289> <B4C0> <B4C1> <B290> <B4C2> <B4C2> <B294> <B4C3> <B4C5> <B298> <B4C6> <B4C7> <B2A0> <B4C8> <B4C8> <B2A3> <B4C9> <B4CA> <B2A5> <B4CB> <B4CB> <B2AA> <B4CC> <B4CC> <B2AC> <B4CD> <B4CD> <B2B0> <B4CE> <B4CE> <B2B4> <B4CF> <B4D0> <B2C8> <B4D1> <B4D1> <B2CC> <B4D2> <B4D2> <B2D0> <B4D3> <B4D3> <B2D2> <B4D4> <B4D5> <B2D8> <B4D6> <B4D6> <B2DB> <B4D7> <B4D7> <B2DD> <B4D8> <B4D8> <B2E2> <B4D9> <B4DB> <B2E4> <B4DC> <B4DC> <B2E8> <B4DD> <B4E1> <B2EB> <B4E2> <B4E4> <B2F3> <B4E5> <B4E9> <B2F7> <B4EA> <B4EC> <B2FF> <B4ED> <B4ED> <B304> <B4EE> <B4EE> <B308> <B4EF> <B4F0> <B310> <B4F1> <B4F3> <B313> <B4F4> <B4F4> <B31C> <B4F5> <B4F7> <B354> <B4F8> <B4F8> <B358> <B4F9> <B4FA> <B35B> <B4FB> <B4FC> <B35E> <B4FD> <B4FE> <B364> <B5A1> <B5A1> <B367> <B5A2> <B5A2> <B369> <B5A3> <B5A3> <B36B> <B5A4> <B5A4> <B36E> <B5A5> <B5A6> <B370> <B5A7> <B5A7> <B374> <B5A8> <B5A8> <B378> <B5A9> <B5AA> <B380> <B5AB> <B5AD> <B383> <B5AE> <B5AE> <B38C> <B5AF> <B5AF> <B390> <B5B0> <B5B0> <B394> <B5B1> <B5B2> <B3A0> <B5B3> <B5B3> <B3A8> <B5B4> <B5B4> <B3AC> endbfrange 100 beginbfrange <B5B5> <B5B6> <B3C4> <B5B7> <B5B7> <B3C8> <B5B8> <B5B9> <B3CB> <B5BA> <B5BA> <B3CE> <B5BB> <B5BB> <B3D0> <B5BC> <B5BD> <B3D4> <B5BE> <B5BE> <B3D7> <B5BF> <B5BF> <B3D9> <B5C0> <B5C0> <B3DB> <B5C1> <B5C1> <B3DD> <B5C2> <B5C2> <B3E0> <B5C3> <B5C3> <B3E4> <B5C4> <B5C4> <B3E8> <B5C5> <B5C5> <B3FC> <B5C6> <B5C6> <B410> <B5C7> <B5C7> <B418> <B5C8> <B5C8> <B41C> <B5C9> <B5C9> <B420> <B5CA> <B5CB> <B428> <B5CC> <B5CC> <B42B> <B5CD> <B5CD> <B434> <B5CE> <B5CF> <B450> <B5D0> <B5D0> <B454> <B5D1> <B5D1> <B458> <B5D2> <B5D3> <B460> <B5D4> <B5D4> <B463> <B5D5> <B5D5> <B465> <B5D6> <B5D6> <B46C> <B5D7> <B5D7> <B480> <B5D8> <B5D8> <B488> <B5D9> <B5D9> <B49D> <B5DA> <B5DA> <B4A4> <B5DB> <B5DB> <B4A8> <B5DC> <B5DC> <B4AC> <B5DD> <B5DD> <B4B5> <B5DE> <B5DE> <B4B7> <B5DF> <B5DF> <B4B9> <B5E0> <B5E0> <B4C0> <B5E1> <B5E1> <B4C4> <B5E2> <B5E2> <B4C8> <B5E3> <B5E3> <B4D0> <B5E4> <B5E4> <B4D5> <B5E5> <B5E6> <B4DC> <B5E7> <B5E7> <B4E0> <B5E8> <B5E9> <B4E3> <B5EA> <B5EA> <B4E6> <B5EB> <B5EC> <B4EC> <B5ED> <B5ED> <B4EF> <B5EE> <B5EE> <B4F1> <B5EF> <B5EF> <B4F8> <B5F0> <B5F1> <B514> <B5F2> <B5F2> <B518> <B5F3> <B5F4> <B51B> <B5F5> <B5F6> <B524> <B5F7> <B5FA> <B527> <B5FB> <B5FC> <B530> <B5FD> <B5FD> <B534> <B5FE> <B5FE> <B538> <B6A1> <B6A2> <B540> <B6A3> <B6A5> <B543> <B6A6> <B6A8> <B54B> <B6A9> <B6A9> <B550> <B6AA> <B6AA> <B554> <B6AB> <B6AC> <B55C> <B6AD> <B6AF> <B55F> <B6B0> <B6B1> <B5A0> <B6B2> <B6B2> <B5A4> <B6B3> <B6B3> <B5A8> <B6B4> <B6B5> <B5AA> <B6B6> <B6B7> <B5B0> <B6B8> <B6BA> <B5B3> <B6BB> <B6BD> <B5BB> <B6BE> <B6BE> <B5C0> <B6BF> <B6BF> <B5C4> <B6C0> <B6C1> <B5CC> <B6C2> <B6C4> <B5CF> <B6C5> <B6C5> <B5D8> <B6C6> <B6C6> <B5EC> <B6C7> <B6C8> <B610> <B6C9> <B6C9> <B614> <B6CA> <B6CA> <B618> <B6CB> <B6CB> <B625> <B6CC> <B6CC> <B62C> <B6CD> <B6CD> <B634> <B6CE> <B6CE> <B648> <B6CF> <B6CF> <B664> <B6D0> <B6D0> <B668> <B6D1> <B6D2> <B69C> <B6D3> <B6D3> <B6A0> <B6D4> <B6D4> <B6A4> <B6D5> <B6D6> <B6AB> <B6D7> <B6D7> <B6B1> <B6D8> <B6D8> <B6D4> <B6D9> <B6D9> <B6F0> <B6DA> <B6DA> <B6F4> <B6DB> <B6DB> <B6F8> <B6DC> <B6DD> <B700> <B6DE> <B6DE> <B705> <B6DF> <B6E0> <B728> <B6E1> <B6E1> <B72C> endbfrange 100 beginbfrange <B6E2> <B6E3> <B72F> <B6E4> <B6E5> <B738> <B6E6> <B6E6> <B73B> <B6E7> <B6E7> <B744> <B6E8> <B6E8> <B748> <B6E9> <B6E9> <B74C> <B6EA> <B6EB> <B754> <B6EC> <B6EC> <B760> <B6ED> <B6ED> <B764> <B6EE> <B6EE> <B768> <B6EF> <B6F0> <B770> <B6F1> <B6F1> <B773> <B6F2> <B6F2> <B775> <B6F3> <B6F4> <B77C> <B6F5> <B6F5> <B780> <B6F6> <B6F6> <B784> <B6F7> <B6F8> <B78C> <B6F9> <B6FC> <B78F> <B6FD> <B6FE> <B796> <B7A1> <B7A2> <B798> <B7A3> <B7A3> <B79C> <B7A4> <B7A4> <B7A0> <B7A5> <B7A6> <B7A8> <B7A7> <B7A9> <B7AB> <B7AA> <B7AB> <B7B4> <B7AC> <B7AC> <B7B8> <B7AD> <B7AD> <B7C7> <B7AE> <B7AE> <B7C9> <B7AF> <B7B0> <B7EC> <B7B1> <B7B1> <B7F0> <B7B2> <B7B2> <B7F4> <B7B3> <B7B4> <B7FC> <B7B5> <B7B7> <B7FF> <B7B8> <B7BA> <B807> <B7BB> <B7BB> <B80C> <B7BC> <B7BC> <B810> <B7BD> <B7BE> <B818> <B7BF> <B7BF> <B81B> <B7C0> <B7C0> <B81D> <B7C1> <B7C2> <B824> <B7C3> <B7C3> <B828> <B7C4> <B7C4> <B82C> <B7C5> <B7C6> <B834> <B7C7> <B7C9> <B837> <B7CA> <B7CA> <B840> <B7CB> <B7CB> <B844> <B7CC> <B7CC> <B851> <B7CD> <B7CD> <B853> <B7CE> <B7CF> <B85C> <B7D0> <B7D0> <B860> <B7D1> <B7D1> <B864> <B7D2> <B7D3> <B86C> <B7D4> <B7D4> <B86F> <B7D5> <B7D5> <B871> <B7D6> <B7D6> <B878> <B7D7> <B7D7> <B87C> <B7D8> <B7D8> <B88D> <B7D9> <B7D9> <B8A8> <B7DA> <B7DA> <B8B0> <B7DB> <B7DB> <B8B4> <B7DC> <B7DC> <B8B8> <B7DD> <B7DE> <B8C0> <B7DF> <B7DF> <B8C3> <B7E0> <B7E0> <B8C5> <B7E1> <B7E1> <B8CC> <B7E2> <B7E2> <B8D0> <B7E3> <B7E3> <B8D4> <B7E4> <B7E4> <B8DD> <B7E5> <B7E5> <B8DF> <B7E6> <B7E6> <B8E1> <B7E7> <B7E8> <B8E8> <B7E9> <B7E9> <B8EC> <B7EA> <B7EA> <B8F0> <B7EB> <B7EC> <B8F8> <B7ED> <B7ED> <B8FB> <B7EE> <B7EE> <B8FD> <B7EF> <B7EF> <B904> <B7F0> <B7F0> <B918> <B7F1> <B7F1> <B920> <B7F2> <B7F3> <B93C> <B7F4> <B7F4> <B940> <B7F5> <B7F5> <B944> <B7F6> <B7F6> <B94C> <B7F7> <B7F7> <B94F> <B7F8> <B7F8> <B951> <B7F9> <B7FA> <B958> <B7FB> <B7FB> <B95C> <B7FC> <B7FC> <B960> <B7FD> <B7FE> <B968> <B8A1> <B8A1> <B96B> <B8A2> <B8A2> <B96D> <B8A3> <B8A4> <B974> <B8A5> <B8A5> <B978> <B8A6> <B8A6> <B97C> <B8A7> <B8A8> <B984> <B8A9> <B8A9> <B987> <B8AA> <B8AB> <B989> <B8AC> <B8AD> <B98D> <B8AE> <B8AF> <B9AC> <B8B0> <B8B0> <B9B0> endbfrange 100 beginbfrange <B8B1> <B8B1> <B9B4> <B8B2> <B8B3> <B9BC> <B8B4> <B8B4> <B9BF> <B8B5> <B8B5> <B9C1> <B8B6> <B8B7> <B9C8> <B8B8> <B8B8> <B9CC> <B8B9> <B8BD> <B9CE> <B8BE> <B8BF> <B9D8> <B8C0> <B8C0> <B9DB> <B8C1> <B8C2> <B9DD> <B8C3> <B8C3> <B9E1> <B8C4> <B8C6> <B9E3> <B8C7> <B8C7> <B9E8> <B8C8> <B8C8> <B9EC> <B8C9> <B8CA> <B9F4> <B8CB> <B8CE> <B9F7> <B8CF> <B8D0> <BA00> <B8D1> <B8D1> <BA08> <B8D2> <B8D2> <BA15> <B8D3> <B8D4> <BA38> <B8D5> <B8D5> <BA3C> <B8D6> <B8D6> <BA40> <B8D7> <B8D7> <BA42> <B8D8> <B8D9> <BA48> <B8DA> <B8DA> <BA4B> <B8DB> <B8DC> <BA4D> <B8DD> <B8DF> <BA53> <B8E0> <B8E0> <BA58> <B8E1> <B8E1> <BA5C> <B8E2> <B8E3> <BA64> <B8E4> <B8E6> <BA67> <B8E7> <B8E8> <BA70> <B8E9> <B8E9> <BA74> <B8EA> <B8EA> <BA78> <B8EB> <B8ED> <BA83> <B8EE> <B8EE> <BA87> <B8EF> <B8EF> <BA8C> <B8F0> <B8F1> <BAA8> <B8F2> <B8F3> <BAAB> <B8F4> <B8F4> <BAB0> <B8F5> <B8F5> <BAB2> <B8F6> <B8F7> <BAB8> <B8F8> <B8F8> <BABB> <B8F9> <B8F9> <BABD> <B8FA> <B8FA> <BAC4> <B8FB> <B8FB> <BAC8> <B8FC> <B8FD> <BAD8> <B8FE> <B8FE> <BAFC> <B9A1> <B9A1> <BB00> <B9A2> <B9A2> <BB04> <B9A3> <B9A3> <BB0D> <B9A4> <B9A4> <BB0F> <B9A5> <B9A5> <BB11> <B9A6> <B9A6> <BB18> <B9A7> <B9A7> <BB1C> <B9A8> <B9A8> <BB20> <B9A9> <B9A9> <BB29> <B9AA> <B9AA> <BB2B> <B9AB> <B9AD> <BB34> <B9AE> <B9AE> <BB38> <B9AF> <B9B2> <BB3B> <B9B3> <B9B4> <BB44> <B9B5> <B9B5> <BB47> <B9B6> <B9B6> <BB49> <B9B7> <B9B7> <BB4D> <B9B8> <B9B9> <BB4F> <B9BA> <B9BA> <BB54> <B9BB> <B9BB> <BB58> <B9BC> <B9BC> <BB61> <B9BD> <B9BD> <BB63> <B9BE> <B9BE> <BB6C> <B9BF> <B9BF> <BB88> <B9C0> <B9C0> <BB8C> <B9C1> <B9C1> <BB90> <B9C2> <B9C2> <BBA4> <B9C3> <B9C3> <BBA8> <B9C4> <B9C4> <BBAC> <B9C5> <B9C5> <BBB4> <B9C6> <B9C6> <BBB7> <B9C7> <B9C7> <BBC0> <B9C8> <B9C8> <BBC4> <B9C9> <B9C9> <BBC8> <B9CA> <B9CA> <BBD0> <B9CB> <B9CB> <BBD3> <B9CC> <B9CD> <BBF8> <B9CE> <B9CE> <BBFC> <B9CF> <B9D0> <BBFF> <B9D1> <B9D1> <BC02> <B9D2> <B9D3> <BC08> <B9D4> <B9D6> <BC0B> <B9D7> <B9D7> <BC0F> <B9D8> <B9D8> <BC11> <B9D9> <B9DD> <BC14> <B9DE> <B9E2> <BC1B> <B9E3> <B9E4> <BC24> <B9E5> <B9E5> <BC27> <B9E6> <B9E6> <BC29> <B9E7> <B9E7> <BC2D> <B9E8> <B9E9> <BC30> <B9EA> <B9EA> <BC34> endbfrange 100 beginbfrange <B9EB> <B9EB> <BC38> <B9EC> <B9ED> <BC40> <B9EE> <B9F0> <BC43> <B9F1> <B9F1> <BC49> <B9F2> <B9F3> <BC4C> <B9F4> <B9F4> <BC50> <B9F5> <B9F5> <BC5D> <B9F6> <B9F7> <BC84> <B9F8> <B9F8> <BC88> <B9F9> <B9FA> <BC8B> <B9FB> <B9FB> <BC8E> <B9FC> <B9FD> <BC94> <B9FE> <B9FE> <BC97> <BAA1> <BAA2> <BC99> <BAA3> <BAA4> <BCA0> <BAA5> <BAA5> <BCA4> <BAA6> <BAA7> <BCA7> <BAA8> <BAA9> <BCB0> <BAAA> <BAAC> <BCB3> <BAAD> <BAAE> <BCBC> <BAAF> <BAAF> <BCC0> <BAB0> <BAB0> <BCC4> <BAB1> <BAB1> <BCCD> <BAB2> <BAB4> <BCCF> <BAB5> <BAB5> <BCD5> <BAB6> <BAB6> <BCD8> <BAB7> <BAB7> <BCDC> <BAB8> <BABA> <BCF4> <BABB> <BABB> <BCF8> <BABC> <BABC> <BCFC> <BABD> <BABE> <BD04> <BABF> <BABF> <BD07> <BAC0> <BAC0> <BD09> <BAC1> <BAC1> <BD10> <BAC2> <BAC2> <BD14> <BAC3> <BAC3> <BD24> <BAC4> <BAC4> <BD2C> <BAC5> <BAC5> <BD40> <BAC6> <BAC7> <BD48> <BAC8> <BAC8> <BD4C> <BAC9> <BAC9> <BD50> <BACA> <BACB> <BD58> <BACC> <BACC> <BD64> <BACD> <BACD> <BD68> <BACE> <BACF> <BD80> <BAD0> <BAD0> <BD84> <BAD1> <BAD4> <BD87> <BAD5> <BAD6> <BD90> <BAD7> <BAD7> <BD93> <BAD8> <BAD8> <BD95> <BAD9> <BADA> <BD99> <BADB> <BADB> <BD9C> <BADC> <BADC> <BDA4> <BADD> <BADD> <BDB0> <BADE> <BADE> <BDB8> <BADF> <BAE0> <BDD4> <BAE1> <BAE1> <BDD8> <BAE2> <BAE2> <BDDC> <BAE3> <BAE3> <BDE9> <BAE4> <BAE4> <BDF0> <BAE5> <BAE5> <BDF4> <BAE6> <BAE6> <BDF8> <BAE7> <BAE7> <BE00> <BAE8> <BAE8> <BE03> <BAE9> <BAE9> <BE05> <BAEA> <BAEB> <BE0C> <BAEC> <BAEC> <BE10> <BAED> <BAED> <BE14> <BAEE> <BAEF> <BE1C> <BAF0> <BAF0> <BE1F> <BAF1> <BAF2> <BE44> <BAF3> <BAF3> <BE48> <BAF4> <BAF4> <BE4C> <BAF5> <BAF5> <BE4E> <BAF6> <BAF7> <BE54> <BAF8> <BAF8> <BE57> <BAF9> <BAFB> <BE59> <BAFC> <BAFD> <BE60> <BAFE> <BAFE> <BE64> <BBA1> <BBA1> <BE68> <BBA2> <BBA2> <BE6A> <BBA3> <BBA4> <BE70> <BBA5> <BBA7> <BE73> <BBA8> <BBAA> <BE7B> <BBAB> <BBAB> <BE80> <BBAC> <BBAC> <BE84> <BBAD> <BBAE> <BE8C> <BBAF> <BBB1> <BE8F> <BBB2> <BBB3> <BE98> <BBB4> <BBB4> <BEA8> <BBB5> <BBB6> <BED0> <BBB7> <BBB7> <BED4> <BBB8> <BBB9> <BED7> <BBBA> <BBBA> <BEE0> <BBBB> <BBBD> <BEE3> <BBBE> <BBBE> <BEEC> <BBBF> <BBBF> <BF01> <BBC0> <BBC1> <BF08> <BBC2> <BBC3> <BF18> <BBC4> <BBC6> <BF1B> endbfrange 100 beginbfrange <BBC7> <BBC8> <BF40> <BBC9> <BBC9> <BF44> <BBCA> <BBCA> <BF48> <BBCB> <BBCC> <BF50> <BBCD> <BBCD> <BF55> <BBCE> <BBCE> <BF94> <BBCF> <BBCF> <BFB0> <BBD0> <BBD0> <BFC5> <BBD1> <BBD2> <BFCC> <BBD3> <BBD3> <BFD0> <BBD4> <BBD4> <BFD4> <BBD5> <BBD5> <BFDC> <BBD6> <BBD6> <BFDF> <BBD7> <BBD7> <BFE1> <BBD8> <BBD8> <C03C> <BBD9> <BBD9> <C051> <BBDA> <BBDA> <C058> <BBDB> <BBDB> <C05C> <BBDC> <BBDC> <C060> <BBDD> <BBDE> <C068> <BBDF> <BBE0> <C090> <BBE1> <BBE1> <C094> <BBE2> <BBE2> <C098> <BBE3> <BBE4> <C0A0> <BBE5> <BBE5> <C0A3> <BBE6> <BBE6> <C0A5> <BBE7> <BBE8> <C0AC> <BBE9> <BBEA> <C0AF> <BBEB> <BBEE> <C0B3> <BBEF> <BBF0> <C0BC> <BBF1> <BBF3> <C0BF> <BBF4> <BBF4> <C0C5> <BBF5> <BBF6> <C0C8> <BBF7> <BBF7> <C0CC> <BBF8> <BBF8> <C0D0> <BBF9> <BBFA> <C0D8> <BBFB> <BBFD> <C0DB> <BBFE> <BBFE> <C0E4> <BCA1> <BCA1> <C0E5> <BCA2> <BCA2> <C0E8> <BCA3> <BCA3> <C0EC> <BCA4> <BCA5> <C0F4> <BCA6> <BCA6> <C0F7> <BCA7> <BCA7> <C0F9> <BCA8> <BCA8> <C100> <BCA9> <BCA9> <C104> <BCAA> <BCAA> <C108> <BCAB> <BCAB> <C110> <BCAC> <BCAC> <C115> <BCAD> <BCB1> <C11C> <BCB2> <BCB3> <C123> <BCB4> <BCB5> <C126> <BCB6> <BCB7> <C12C> <BCB8> <BCBA> <C12F> <BCBB> <BCBB> <C136> <BCBC> <BCBD> <C138> <BCBE> <BCBE> <C13C> <BCBF> <BCBF> <C140> <BCC0> <BCC1> <C148> <BCC2> <BCC4> <C14B> <BCC5> <BCC6> <C154> <BCC7> <BCC7> <C158> <BCC8> <BCC8> <C15C> <BCC9> <BCCA> <C164> <BCCB> <BCCD> <C167> <BCCE> <BCCE> <C170> <BCCF> <BCCF> <C174> <BCD0> <BCD0> <C178> <BCD1> <BCD1> <C185> <BCD2> <BCD4> <C18C> <BCD5> <BCD5> <C190> <BCD6> <BCD6> <C194> <BCD7> <BCD7> <C196> <BCD8> <BCD9> <C19C> <BCDA> <BCDA> <C19F> <BCDB> <BCDB> <C1A1> <BCDC> <BCDC> <C1A5> <BCDD> <BCDE> <C1A8> <BCDF> <BCDF> <C1AC> <BCE0> <BCE0> <C1B0> <BCE1> <BCE1> <C1BD> <BCE2> <BCE2> <C1C4> <BCE3> <BCE3> <C1C8> <BCE4> <BCE4> <C1CC> <BCE5> <BCE5> <C1D4> <BCE6> <BCE7> <C1D7> <BCE8> <BCE8> <C1E0> <BCE9> <BCE9> <C1E4> <BCEA> <BCEA> <C1E8> <BCEB> <BCEC> <C1F0> <BCED> <BCED> <C1F3> <BCEE> <BCEF> <C1FC> <BCF0> <BCF0> <C200> <BCF1> <BCF1> <C204> <BCF2> <BCF3> <C20C> <BCF4> <BCF4> <C20F> <BCF5> <BCF5> <C211> <BCF6> <BCF7> <C218> <BCF8> <BCF8> <C21C> <BCF9> <BCFA> <C21F> endbfrange 100 beginbfrange <BCFB> <BCFC> <C228> <BCFD> <BCFD> <C22B> <BCFE> <BCFE> <C22D> <BDA1> <BDA1> <C22F> <BDA2> <BDA3> <C231> <BDA4> <BDA4> <C234> <BDA5> <BDA5> <C248> <BDA6> <BDA7> <C250> <BDA8> <BDA8> <C254> <BDA9> <BDA9> <C258> <BDAA> <BDAA> <C260> <BDAB> <BDAB> <C265> <BDAC> <BDAD> <C26C> <BDAE> <BDAE> <C270> <BDAF> <BDAF> <C274> <BDB0> <BDB1> <C27C> <BDB2> <BDB2> <C27F> <BDB3> <BDB3> <C281> <BDB4> <BDB5> <C288> <BDB6> <BDB6> <C290> <BDB7> <BDB7> <C298> <BDB8> <BDB8> <C29B> <BDB9> <BDB9> <C29D> <BDBA> <BDBB> <C2A4> <BDBC> <BDBC> <C2A8> <BDBD> <BDBE> <C2AC> <BDBF> <BDC0> <C2B4> <BDC1> <BDC1> <C2B7> <BDC2> <BDC2> <C2B9> <BDC3> <BDC4> <C2DC> <BDC5> <BDC5> <C2E0> <BDC6> <BDC7> <C2E3> <BDC8> <BDCA> <C2EB> <BDCB> <BDCB> <C2EF> <BDCC> <BDCC> <C2F1> <BDCD> <BDCD> <C2F6> <BDCE> <BDCF> <C2F8> <BDD0> <BDD1> <C2FB> <BDD2> <BDD2> <C300> <BDD3> <BDD4> <C308> <BDD5> <BDD6> <C30C> <BDD7> <BDD9> <C313> <BDDA> <BDDA> <C318> <BDDB> <BDDB> <C31C> <BDDC> <BDDD> <C324> <BDDE> <BDDF> <C328> <BDE0> <BDE0> <C345> <BDE1> <BDE2> <C368> <BDE3> <BDE3> <C36C> <BDE4> <BDE4> <C370> <BDE5> <BDE5> <C372> <BDE6> <BDE7> <C378> <BDE8> <BDE9> <C37C> <BDEA> <BDEA> <C384> <BDEB> <BDEB> <C388> <BDEC> <BDEC> <C38C> <BDED> <BDED> <C3C0> <BDEE> <BDEF> <C3D8> <BDF0> <BDF0> <C3DC> <BDF1> <BDF2> <C3DF> <BDF3> <BDF3> <C3E2> <BDF4> <BDF5> <C3E8> <BDF6> <BDF6> <C3ED> <BDF7> <BDF8> <C3F4> <BDF9> <BDF9> <C3F8> <BDFA> <BDFA> <C408> <BDFB> <BDFB> <C410> <BDFC> <BDFC> <C424> <BDFD> <BDFD> <C42C> <BDFE> <BDFE> <C430> <BEA1> <BEA1> <C434> <BEA2> <BEA3> <C43C> <BEA4> <BEA4> <C448> <BEA5> <BEA6> <C464> <BEA7> <BEA7> <C468> <BEA8> <BEA8> <C46C> <BEA9> <BEAA> <C474> <BEAB> <BEAB> <C479> <BEAC> <BEAC> <C480> <BEAD> <BEAD> <C494> <BEAE> <BEAE> <C49C> <BEAF> <BEAF> <C4B8> <BEB0> <BEB0> <C4BC> <BEB1> <BEB1> <C4E9> <BEB2> <BEB3> <C4F0> <BEB4> <BEB4> <C4F4> <BEB5> <BEB5> <C4F8> <BEB6> <BEB6> <C4FA> <BEB7> <BEB9> <C4FF> <BEBA> <BEBA> <C50C> <BEBB> <BEBB> <C510> <BEBC> <BEBC> <C514> <BEBD> <BEBD> <C51C> <BEBE> <BEBF> <C528> <BEC0> <BEC0> <C52C> <BEC1> <BEC1> <C530> <BEC2> <BEC3> <C538> <BEC4> <BEC4> <C53B> <BEC5> <BEC5> <C53D> <BEC6> <BEC7> <C544> endbfrange 100 beginbfrange <BEC8> <BECA> <C548> <BECB> <BECD> <C54C> <BECE> <BED0> <C553> <BED1> <BED3> <C557> <BED4> <BED5> <C55D> <BED6> <BED7> <C560> <BED8> <BED8> <C564> <BED9> <BED9> <C568> <BEDA> <BEDB> <C570> <BEDC> <BEDE> <C573> <BEDF> <BEE0> <C57C> <BEE1> <BEE1> <C580> <BEE2> <BEE2> <C584> <BEE3> <BEE3> <C587> <BEE4> <BEE5> <C58C> <BEE6> <BEE6> <C58F> <BEE7> <BEE7> <C591> <BEE8> <BEE8> <C595> <BEE9> <BEEA> <C597> <BEEB> <BEEB> <C59C> <BEEC> <BEEC> <C5A0> <BEED> <BEED> <C5A9> <BEEE> <BEEF> <C5B4> <BEF0> <BEF1> <C5B8> <BEF2> <BEF5> <C5BB> <BEF6> <BEFC> <C5C4> <BEFD> <BEFD> <C5CC> <BEFE> <BEFE> <C5CE> <BFA1> <BFA2> <C5D0> <BFA3> <BFA3> <C5D4> <BFA4> <BFA4> <C5D8> <BFA5> <BFA6> <C5E0> <BFA7> <BFA7> <C5E3> <BFA8> <BFA8> <C5E5> <BFA9> <BFAB> <C5EC> <BFAC> <BFAC> <C5F0> <BFAD> <BFAD> <C5F4> <BFAE> <BFAF> <C5F6> <BFB0> <BFB5> <C5FC> <BFB6> <BFB9> <C605> <BFBA> <BFBA> <C60C> <BFBB> <BFBB> <C610> <BFBC> <BFBD> <C618> <BFBE> <BFBF> <C61B> <BFC0> <BFC1> <C624> <BFC2> <BFC2> <C628> <BFC3> <BFC5> <C62C> <BFC6> <BFC6> <C630> <BFC7> <BFC9> <C633> <BFCA> <BFCA> <C637> <BFCB> <BFCB> <C639> <BFCC> <BFCC> <C63B> <BFCD> <BFCE> <C640> <BFCF> <BFCF> <C644> <BFD0> <BFD0> <C648> <BFD1> <BFD2> <C650> <BFD3> <BFD5> <C653> <BFD6> <BFD7> <C65C> <BFD8> <BFD8> <C660> <BFD9> <BFD9> <C66C> <BFDA> <BFDA> <C66F> <BFDB> <BFDB> <C671> <BFDC> <BFDD> <C678> <BFDE> <BFDE> <C67C> <BFDF> <BFDF> <C680> <BFE0> <BFE1> <C688> <BFE2> <BFE2> <C68B> <BFE3> <BFE3> <C68D> <BFE4> <BFE5> <C694> <BFE6> <BFE6> <C698> <BFE7> <BFE7> <C69C> <BFE8> <BFE9> <C6A4> <BFEA> <BFEA> <C6A7> <BFEB> <BFEB> <C6A9> <BFEC> <BFED> <C6B0> <BFEE> <BFEE> <C6B4> <BFEF> <BFF1> <C6B8> <BFF2> <BFF3> <C6C0> <BFF4> <BFF4> <C6C3> <BFF5> <BFF5> <C6C5> <BFF6> <BFF7> <C6CC> <BFF8> <BFF8> <C6D0> <BFF9> <BFF9> <C6D4> <BFFA> <BFFB> <C6DC> <BFFC> <BFFD> <C6E0> <BFFE> <BFFE> <C6E8> <C0A1> <C0A1> <C6E9> <C0A2> <C0A2> <C6EC> <C0A3> <C0A3> <C6F0> <C0A4> <C0A5> <C6F8> <C0A6> <C0A6> <C6FD> <C0A7> <C0A8> <C704> <C0A9> <C0A9> <C708> <C0AA> <C0AA> <C70C> <C0AB> <C0AC> <C714> <C0AD> <C0AD> <C717> <C0AE> <C0AE> <C719> <C0AF> <C0B0> <C720> <C0B1> <C0B1> <C724> <C0B2> <C0B2> <C728> endbfrange 100 beginbfrange <C0B3> <C0B4> <C730> <C0B5> <C0B5> <C733> <C0B6> <C0B6> <C735> <C0B7> <C0B7> <C737> <C0B8> <C0B9> <C73C> <C0BA> <C0BA> <C740> <C0BB> <C0BB> <C744> <C0BC> <C0BC> <C74A> <C0BD> <C0BE> <C74C> <C0BF> <C0BF> <C74F> <C0C0> <C0C7> <C751> <C0C8> <C0C8> <C75C> <C0C9> <C0C9> <C760> <C0CA> <C0CA> <C768> <C0CB> <C0CB> <C76B> <C0CC> <C0CD> <C774> <C0CE> <C0CE> <C778> <C0CF> <C0D1> <C77C> <C0D2> <C0D4> <C783> <C0D5> <C0D8> <C787> <C0D9> <C0D9> <C78E> <C0DA> <C0DB> <C790> <C0DC> <C0DC> <C794> <C0DD> <C0DF> <C796> <C0E0> <C0E0> <C79A> <C0E1> <C0E2> <C7A0> <C0E3> <C0E6> <C7A3> <C0E7> <C0E8> <C7AC> <C0E9> <C0E9> <C7B0> <C0EA> <C0EA> <C7B4> <C0EB> <C0EC> <C7BC> <C0ED> <C0EF> <C7BF> <C0F0> <C0F1> <C7C8> <C0F2> <C0F2> <C7CC> <C0F3> <C0F3> <C7CE> <C0F4> <C0F4> <C7D0> <C0F5> <C0F5> <C7D8> <C0F6> <C0F6> <C7DD> <C0F7> <C0F7> <C7E4> <C0F8> <C0F8> <C7E8> <C0F9> <C0F9> <C7EC> <C0FA> <C0FB> <C800> <C0FC> <C0FC> <C804> <C0FD> <C0FD> <C808> <C0FE> <C0FE> <C80A> <C1A1> <C1A2> <C810> <C1A3> <C1A3> <C813> <C1A4> <C1A5> <C815> <C1A6> <C1A7> <C81C> <C1A8> <C1A8> <C820> <C1A9> <C1A9> <C824> <C1AA> <C1AB> <C82C> <C1AC> <C1AC> <C82F> <C1AD> <C1AD> <C831> <C1AE> <C1AE> <C838> <C1AF> <C1AF> <C83C> <C1B0> <C1B0> <C840> <C1B1> <C1B2> <C848> <C1B3> <C1B4> <C84C> <C1B5> <C1B5> <C854> <C1B6> <C1B7> <C870> <C1B8> <C1B8> <C874> <C1B9> <C1B9> <C878> <C1BA> <C1BA> <C87A> <C1BB> <C1BC> <C880> <C1BD> <C1BD> <C883> <C1BE> <C1C0> <C885> <C1C1> <C1C3> <C88B> <C1C4> <C1C4> <C894> <C1C5> <C1C5> <C89D> <C1C6> <C1C6> <C89F> <C1C7> <C1C7> <C8A1> <C1C8> <C1C8> <C8A8> <C1C9> <C1CA> <C8BC> <C1CB> <C1CB> <C8C4> <C1CC> <C1CC> <C8C8> <C1CD> <C1CD> <C8CC> <C1CE> <C1CF> <C8D4> <C1D0> <C1D0> <C8D7> <C1D1> <C1D1> <C8D9> <C1D2> <C1D3> <C8E0> <C1D4> <C1D4> <C8E4> <C1D5> <C1D5> <C8F5> <C1D6> <C1D7> <C8FC> <C1D8> <C1D8> <C900> <C1D9> <C1DB> <C904> <C1DC> <C1DD> <C90C> <C1DE> <C1DE> <C90F> <C1DF> <C1DF> <C911> <C1E0> <C1E0> <C918> <C1E1> <C1E1> <C92C> <C1E2> <C1E2> <C934> <C1E3> <C1E4> <C950> <C1E5> <C1E5> <C954> <C1E6> <C1E6> <C958> <C1E7> <C1E8> <C960> <C1E9> <C1E9> <C963> <C1EA> <C1EA> <C96C> <C1EB> <C1EB> <C970> <C1EC> <C1EC> <C974> endbfrange 100 beginbfrange <C1ED> <C1ED> <C97C> <C1EE> <C1EF> <C988> <C1F0> <C1F0> <C98C> <C1F1> <C1F1> <C990> <C1F2> <C1F3> <C998> <C1F4> <C1F4> <C99B> <C1F5> <C1F5> <C99D> <C1F6> <C1F7> <C9C0> <C1F8> <C1F8> <C9C4> <C1F9> <C1FA> <C9C7> <C1FB> <C1FB> <C9CA> <C1FC> <C1FD> <C9D0> <C1FE> <C1FE> <C9D3> <C2A1> <C2A2> <C9D5> <C2A3> <C2A4> <C9D9> <C2A5> <C2A6> <C9DC> <C2A7> <C2A7> <C9E0> <C2A8> <C2A8> <C9E2> <C2A9> <C2A9> <C9E4> <C2AA> <C2AA> <C9E7> <C2AB> <C2AC> <C9EC> <C2AD> <C2AF> <C9EF> <C2B0> <C2B1> <C9F8> <C2B2> <C2B2> <C9FC> <C2B3> <C2B3> <CA00> <C2B4> <C2B5> <CA08> <C2B6> <C2B8> <CA0B> <C2B9> <C2B9> <CA14> <C2BA> <C2BA> <CA18> <C2BB> <C2BB> <CA29> <C2BC> <C2BD> <CA4C> <C2BE> <C2BE> <CA50> <C2BF> <C2BF> <CA54> <C2C0> <C2C1> <CA5C> <C2C2> <C2C4> <CA5F> <C2C5> <C2C5> <CA68> <C2C6> <C2C6> <CA7D> <C2C7> <C2C7> <CA84> <C2C8> <C2C8> <CA98> <C2C9> <C2CA> <CABC> <C2CB> <C2CB> <CAC0> <C2CC> <C2CC> <CAC4> <C2CD> <C2CE> <CACC> <C2CF> <C2CF> <CACF> <C2D0> <C2D0> <CAD1> <C2D1> <C2D1> <CAD3> <C2D2> <C2D3> <CAD8> <C2D4> <C2D4> <CAE0> <C2D5> <C2D5> <CAEC> <C2D6> <C2D6> <CAF4> <C2D7> <C2D7> <CB08> <C2D8> <C2D8> <CB10> <C2D9> <C2D9> <CB14> <C2DA> <C2DA> <CB18> <C2DB> <C2DC> <CB20> <C2DD> <C2DD> <CB41> <C2DE> <C2DF> <CB48> <C2E0> <C2E0> <CB4C> <C2E1> <C2E1> <CB50> <C2E2> <C2E3> <CB58> <C2E4> <C2E4> <CB5D> <C2E5> <C2E5> <CB64> <C2E6> <C2E7> <CB78> <C2E8> <C2E8> <CB9C> <C2E9> <C2E9> <CBB8> <C2EA> <C2EA> <CBD4> <C2EB> <C2EB> <CBE4> <C2EC> <C2EC> <CBE7> <C2ED> <C2ED> <CBE9> <C2EE> <C2EF> <CC0C> <C2F0> <C2F0> <CC10> <C2F1> <C2F1> <CC14> <C2F2> <C2F3> <CC1C> <C2F4> <C2F5> <CC21> <C2F6> <C2F8> <CC27> <C2F9> <C2F9> <CC2C> <C2FA> <C2FA> <CC2E> <C2FB> <C2FB> <CC30> <C2FC> <C2FD> <CC38> <C2FE> <C2FE> <CC3B> <C3A1> <C3A3> <CC3C> <C3A4> <C3A5> <CC44> <C3A6> <C3A6> <CC48> <C3A7> <C3A7> <CC4C> <C3A8> <C3A9> <CC54> <C3AA> <C3AC> <CC57> <C3AD> <C3AD> <CC60> <C3AE> <C3AE> <CC64> <C3AF> <C3AF> <CC66> <C3B0> <C3B0> <CC68> <C3B1> <C3B1> <CC70> <C3B2> <C3B2> <CC75> <C3B3> <C3B4> <CC98> <C3B5> <C3B5> <CC9C> <C3B6> <C3B6> <CCA0> <C3B7> <C3B8> <CCA8> <C3B9> <C3BB> <CCAB> <C3BC> <C3BD> <CCB4> <C3BE> <C3BE> <CCB8> <C3BF> <C3BF> <CCBC> endbfrange 100 beginbfrange <C3C0> <C3C1> <CCC4> <C3C2> <C3C2> <CCC7> <C3C3> <C3C3> <CCC9> <C3C4> <C3C4> <CCD0> <C3C5> <C3C5> <CCD4> <C3C6> <C3C6> <CCE4> <C3C7> <C3C7> <CCEC> <C3C8> <C3C8> <CCF0> <C3C9> <C3C9> <CD01> <C3CA> <C3CB> <CD08> <C3CC> <C3CC> <CD0C> <C3CD> <C3CD> <CD10> <C3CE> <C3CF> <CD18> <C3D0> <C3D0> <CD1B> <C3D1> <C3D1> <CD1D> <C3D2> <C3D2> <CD24> <C3D3> <C3D3> <CD28> <C3D4> <C3D4> <CD2C> <C3D5> <C3D5> <CD39> <C3D6> <C3D6> <CD5C> <C3D7> <C3D7> <CD60> <C3D8> <C3D8> <CD64> <C3D9> <C3DA> <CD6C> <C3DB> <C3DB> <CD6F> <C3DC> <C3DC> <CD71> <C3DD> <C3DD> <CD78> <C3DE> <C3DE> <CD88> <C3DF> <C3E0> <CD94> <C3E1> <C3E1> <CD98> <C3E2> <C3E2> <CD9C> <C3E3> <C3E4> <CDA4> <C3E5> <C3E5> <CDA7> <C3E6> <C3E6> <CDA9> <C3E7> <C3E7> <CDB0> <C3E8> <C3E8> <CDC4> <C3E9> <C3E9> <CDCC> <C3EA> <C3EA> <CDD0> <C3EB> <C3EB> <CDE8> <C3EC> <C3EC> <CDEC> <C3ED> <C3ED> <CDF0> <C3EE> <C3EF> <CDF8> <C3F0> <C3F0> <CDFB> <C3F1> <C3F1> <CDFD> <C3F2> <C3F2> <CE04> <C3F3> <C3F3> <CE08> <C3F4> <C3F4> <CE0C> <C3F5> <C3F5> <CE14> <C3F6> <C3F6> <CE19> <C3F7> <C3F8> <CE20> <C3F9> <C3F9> <CE24> <C3FA> <C3FA> <CE28> <C3FB> <C3FC> <CE30> <C3FD> <C3FD> <CE33> <C3FE> <C3FE> <CE35> <C4A1> <C4A2> <CE58> <C4A3> <C4A3> <CE5C> <C4A4> <C4A6> <CE5F> <C4A7> <C4A8> <CE68> <C4A9> <C4A9> <CE6B> <C4AA> <C4AA> <CE6D> <C4AB> <C4AC> <CE74> <C4AD> <C4AD> <CE78> <C4AE> <C4AE> <CE7C> <C4AF> <C4B0> <CE84> <C4B1> <C4B1> <CE87> <C4B2> <C4B2> <CE89> <C4B3> <C4B4> <CE90> <C4B5> <C4B5> <CE94> <C4B6> <C4B6> <CE98> <C4B7> <C4B8> <CEA0> <C4B9> <C4BB> <CEA3> <C4BC> <C4BD> <CEAC> <C4BE> <C4BE> <CEC1> <C4BF> <C4C0> <CEE4> <C4C1> <C4C1> <CEE8> <C4C2> <C4C3> <CEEB> <C4C4> <C4C5> <CEF4> <C4C6> <C4C8> <CEF7> <C4C9> <C4CA> <CF00> <C4CB> <C4CB> <CF04> <C4CC> <C4CC> <CF08> <C4CD> <C4CE> <CF10> <C4CF> <C4CF> <CF13> <C4D0> <C4D0> <CF15> <C4D1> <C4D1> <CF1C> <C4D2> <C4D2> <CF20> <C4D3> <C4D3> <CF24> <C4D4> <C4D5> <CF2C> <C4D6> <C4D8> <CF2F> <C4D9> <C4D9> <CF38> <C4DA> <C4DB> <CF54> <C4DC> <C4DC> <CF58> <C4DD> <C4DD> <CF5C> <C4DE> <C4DF> <CF64> <C4E0> <C4E0> <CF67> <C4E1> <C4E1> <CF69> <C4E2> <C4E3> <CF70> <C4E4> <C4E4> <CF74> <C4E5> <C4E5> <CF78> <C4E6> <C4E6> <CF80> endbfrange 100 beginbfrange <C4E7> <C4E7> <CF85> <C4E8> <C4E8> <CF8C> <C4E9> <C4E9> <CFA1> <C4EA> <C4EA> <CFA8> <C4EB> <C4EB> <CFB0> <C4EC> <C4EC> <CFC4> <C4ED> <C4EE> <CFE0> <C4EF> <C4EF> <CFE4> <C4F0> <C4F0> <CFE8> <C4F1> <C4F2> <CFF0> <C4F3> <C4F3> <CFF3> <C4F4> <C4F4> <CFF5> <C4F5> <C4F5> <CFFC> <C4F6> <C4F6> <D000> <C4F7> <C4F7> <D004> <C4F8> <C4F8> <D011> <C4F9> <C4F9> <D018> <C4FA> <C4FA> <D02D> <C4FB> <C4FC> <D034> <C4FD> <C4FD> <D038> <C4FE> <C4FE> <D03C> <C5A1> <C5A2> <D044> <C5A3> <C5A3> <D047> <C5A4> <C5A4> <D049> <C5A5> <C5A5> <D050> <C5A6> <C5A6> <D054> <C5A7> <C5A7> <D058> <C5A8> <C5A8> <D060> <C5A9> <C5AA> <D06C> <C5AB> <C5AB> <D070> <C5AC> <C5AC> <D074> <C5AD> <C5AE> <D07C> <C5AF> <C5AF> <D081> <C5B0> <C5B1> <D0A4> <C5B2> <C5B2> <D0A8> <C5B3> <C5B3> <D0AC> <C5B4> <C5B5> <D0B4> <C5B6> <C5B6> <D0B7> <C5B7> <C5B7> <D0B9> <C5B8> <C5B9> <D0C0> <C5BA> <C5BA> <D0C4> <C5BB> <C5BC> <D0C8> <C5BD> <C5BE> <D0D0> <C5BF> <C5C1> <D0D3> <C5C2> <C5C3> <D0DC> <C5C4> <C5C4> <D0E0> <C5C5> <C5C5> <D0E4> <C5C6> <C5C7> <D0EC> <C5C8> <C5CA> <D0EF> <C5CB> <C5CB> <D0F8> <C5CC> <C5CC> <D10D> <C5CD> <C5CE> <D130> <C5CF> <C5CF> <D134> <C5D0> <C5D0> <D138> <C5D1> <C5D1> <D13A> <C5D2> <C5D3> <D140> <C5D4> <C5D6> <D143> <C5D7> <C5D8> <D14C> <C5D9> <C5D9> <D150> <C5DA> <C5DA> <D154> <C5DB> <C5DC> <D15C> <C5DD> <C5DD> <D15F> <C5DE> <C5DE> <D161> <C5DF> <C5DF> <D168> <C5E0> <C5E0> <D16C> <C5E1> <C5E1> <D17C> <C5E2> <C5E2> <D184> <C5E3> <C5E3> <D188> <C5E4> <C5E5> <D1A0> <C5E6> <C5E6> <D1A4> <C5E7> <C5E7> <D1A8> <C5E8> <C5E9> <D1B0> <C5EA> <C5EA> <D1B3> <C5EB> <C5EB> <D1B5> <C5EC> <C5EC> <D1BA> <C5ED> <C5ED> <D1BC> <C5EE> <C5EE> <D1C0> <C5EF> <C5EF> <D1D8> <C5F0> <C5F0> <D1F4> <C5F1> <C5F1> <D1F8> <C5F2> <C5F2> <D207> <C5F3> <C5F3> <D209> <C5F4> <C5F4> <D210> <C5F5> <C5F6> <D22C> <C5F7> <C5F7> <D230> <C5F8> <C5F8> <D234> <C5F9> <C5FA> <D23C> <C5FB> <C5FB> <D23F> <C5FC> <C5FC> <D241> <C5FD> <C5FD> <D248> <C5FE> <C5FE> <D25C> <C6A1> <C6A1> <D264> <C6A2> <C6A3> <D280> <C6A4> <C6A4> <D284> <C6A5> <C6A5> <D288> <C6A6> <C6A7> <D290> <C6A8> <C6A8> <D295> <C6A9> <C6A9> <D29C> <C6AA> <C6AA> <D2A0> <C6AB> <C6AB> <D2A4> endbfrange 100 beginbfrange <C6AC> <C6AC> <D2AC> <C6AD> <C6AD> <D2B1> <C6AE> <C6AF> <D2B8> <C6B0> <C6B0> <D2BC> <C6B1> <C6B2> <D2BF> <C6B3> <C6B3> <D2C2> <C6B4> <C6B5> <D2C8> <C6B6> <C6B6> <D2CB> <C6B7> <C6B7> <D2D4> <C6B8> <C6B8> <D2D8> <C6B9> <C6B9> <D2DC> <C6BA> <C6BB> <D2E4> <C6BC> <C6BD> <D2F0> <C6BE> <C6BE> <D2F4> <C6BF> <C6BF> <D2F8> <C6C0> <C6C1> <D300> <C6C2> <C6C2> <D303> <C6C3> <C6C3> <D305> <C6C4> <C6C6> <D30C> <C6C7> <C6C7> <D310> <C6C8> <C6C8> <D314> <C6C9> <C6C9> <D316> <C6CA> <C6CB> <D31C> <C6CC> <C6CE> <D31F> <C6CF> <C6CF> <D325> <C6D0> <C6D1> <D328> <C6D2> <C6D2> <D32C> <C6D3> <C6D3> <D330> <C6D4> <C6D5> <D338> <C6D6> <C6D8> <D33B> <C6D9> <C6DA> <D344> <C6DB> <C6DC> <D37C> <C6DD> <C6DD> <D380> <C6DE> <C6DE> <D384> <C6DF> <C6E0> <D38C> <C6E1> <C6E3> <D38F> <C6E4> <C6E5> <D398> <C6E6> <C6E6> <D39C> <C6E7> <C6E7> <D3A0> <C6E8> <C6E9> <D3A8> <C6EA> <C6EA> <D3AB> <C6EB> <C6EB> <D3AD> <C6EC> <C6EC> <D3B4> <C6ED> <C6ED> <D3B8> <C6EE> <C6EE> <D3BC> <C6EF> <C6F0> <D3C4> <C6F1> <C6F2> <D3C8> <C6F3> <C6F3> <D3D0> <C6F4> <C6F4> <D3D8> <C6F5> <C6F5> <D3E1> <C6F6> <C6F6> <D3E3> <C6F7> <C6F8> <D3EC> <C6F9> <C6F9> <D3F0> <C6FA> <C6FA> <D3F4> <C6FB> <C6FC> <D3FC> <C6FD> <C6FD> <D3FF> <C6FE> <C6FE> <D401> <C7A1> <C7A1> <D408> <C7A2> <C7A2> <D41D> <C7A3> <C7A3> <D440> <C7A4> <C7A4> <D444> <C7A5> <C7A5> <D45C> <C7A6> <C7A6> <D460> <C7A7> <C7A7> <D464> <C7A8> <C7A8> <D46D> <C7A9> <C7A9> <D46F> <C7AA> <C7AB> <D478> <C7AC> <C7AC> <D47C> <C7AD> <C7AE> <D47F> <C7AF> <C7AF> <D482> <C7B0> <C7B1> <D488> <C7B2> <C7B2> <D48B> <C7B3> <C7B3> <D48D> <C7B4> <C7B4> <D494> <C7B5> <C7B5> <D4A9> <C7B6> <C7B6> <D4CC> <C7B7> <C7B7> <D4D0> <C7B8> <C7B8> <D4D4> <C7B9> <C7B9> <D4DC> <C7BA> <C7BA> <D4DF> <C7BB> <C7BB> <D4E8> <C7BC> <C7BC> <D4EC> <C7BD> <C7BD> <D4F0> <C7BE> <C7BE> <D4F8> <C7BF> <C7BF> <D4FB> <C7C0> <C7C0> <D4FD> <C7C1> <C7C1> <D504> <C7C2> <C7C2> <D508> <C7C3> <C7C3> <D50C> <C7C4> <C7C5> <D514> <C7C6> <C7C6> <D517> <C7C7> <C7C8> <D53C> <C7C9> <C7C9> <D540> <C7CA> <C7CA> <D544> <C7CB> <C7CC> <D54C> <C7CD> <C7CD> <D54F> <C7CE> <C7CE> <D551> <C7CF> <C7D0> <D558> <C7D1> <C7D1> <D55C> <C7D2> <C7D2> <D560> endbfrange 100 beginbfrange <C7D3> <C7D3> <D565> <C7D4> <C7D5> <D568> <C7D6> <C7D6> <D56B> <C7D7> <C7D7> <D56D> <C7D8> <C7D9> <D574> <C7DA> <C7DA> <D578> <C7DB> <C7DB> <D57C> <C7DC> <C7DD> <D584> <C7DE> <C7E0> <D587> <C7E1> <C7E1> <D590> <C7E2> <C7E2> <D5A5> <C7E3> <C7E4> <D5C8> <C7E5> <C7E5> <D5CC> <C7E6> <C7E6> <D5D0> <C7E7> <C7E7> <D5D2> <C7E8> <C7E9> <D5D8> <C7EA> <C7EA> <D5DB> <C7EB> <C7EB> <D5DD> <C7EC> <C7ED> <D5E4> <C7EE> <C7EE> <D5E8> <C7EF> <C7EF> <D5EC> <C7F0> <C7F1> <D5F4> <C7F2> <C7F2> <D5F7> <C7F3> <C7F3> <D5F9> <C7F4> <C7F5> <D600> <C7F6> <C7F6> <D604> <C7F7> <C7F7> <D608> <C7F8> <C7F9> <D610> <C7FA> <C7FC> <D613> <C7FD> <C7FD> <D61C> <C7FE> <C7FE> <D620> <C8A1> <C8A1> <D624> <C8A2> <C8A2> <D62D> <C8A3> <C8A4> <D638> <C8A5> <C8A5> <D63C> <C8A6> <C8A6> <D640> <C8A7> <C8A7> <D645> <C8A8> <C8A9> <D648> <C8AA> <C8AA> <D64B> <C8AB> <C8AB> <D64D> <C8AC> <C8AC> <D651> <C8AD> <C8AE> <D654> <C8AF> <C8AF> <D658> <C8B0> <C8B0> <D65C> <C8B1> <C8B1> <D667> <C8B2> <C8B2> <D669> <C8B3> <C8B4> <D670> <C8B5> <C8B5> <D674> <C8B6> <C8B6> <D683> <C8B7> <C8B7> <D685> <C8B8> <C8B9> <D68C> <C8BA> <C8BA> <D690> <C8BB> <C8BB> <D694> <C8BC> <C8BC> <D69D> <C8BD> <C8BD> <D69F> <C8BE> <C8BE> <D6A1> <C8BF> <C8BF> <D6A8> <C8C0> <C8C0> <D6AC> <C8C1> <C8C1> <D6B0> <C8C2> <C8C2> <D6B9> <C8C3> <C8C3> <D6BB> <C8C4> <C8C5> <D6C4> <C8C6> <C8C6> <D6C8> <C8C7> <C8C7> <D6CC> <C8C8> <C8C8> <D6D1> <C8C9> <C8C9> <D6D4> <C8CA> <C8CA> <D6D7> <C8CB> <C8CB> <D6D9> <C8CC> <C8CC> <D6E0> <C8CD> <C8CD> <D6E4> <C8CE> <C8CE> <D6E8> <C8CF> <C8CF> <D6F0> <C8D0> <C8D0> <D6F5> <C8D1> <C8D2> <D6FC> <C8D3> <C8D3> <D700> <C8D4> <C8D4> <D704> <C8D5> <C8D5> <D711> <C8D6> <C8D7> <D718> <C8D8> <C8D8> <D71C> <C8D9> <C8D9> <D720> <C8DA> <C8DB> <D728> <C8DC> <C8DC> <D72B> <C8DD> <C8DD> <D72D> <C8DE> <C8DF> <D734> <C8E0> <C8E0> <D738> <C8E1> <C8E1> <D73C> <C8E2> <C8E2> <D744> <C8E3> <C8E3> <D747> <C8E4> <C8E4> <D749> <C8E5> <C8E6> <D750> <C8E7> <C8E7> <D754> <C8E8> <C8EB> <D756> <C8EC> <C8ED> <D760> <C8EE> <C8EE> <D763> <C8EF> <C8EF> <D765> <C8F0> <C8F0> <D769> <C8F1> <C8F1> <D76C> <C8F2> <C8F2> <D770> <C8F3> <C8F3> <D774> <C8F4> <C8F5> <D77C> endbfrange 100 beginbfrange <C8F6> <C8F6> <D781> <C8F7> <C8F8> <D788> <C8F9> <C8F9> <D78C> <C8FA> <C8FA> <D790> <C8FB> <C8FC> <D798> <C8FD> <C8FD> <D79B> <C8FE> <C8FE> <D79D> <CAA1> <CAA1> <4F3D> <CAA2> <CAA2> <4F73> <CAA3> <CAA3> <5047> <CAA4> <CAA4> <50F9> <CAA5> <CAA5> <52A0> <CAA6> <CAA6> <53EF> <CAA7> <CAA7> <5475> <CAA8> <CAA8> <54E5> <CAA9> <CAA9> <5609> <CAAA> <CAAA> <5AC1> <CAAB> <CAAB> <5BB6> <CAAC> <CAAC> <6687> <CAAD> <CAAE> <67B6> <CAAF> <CAAF> <67EF> <CAB0> <CAB0> <6B4C> <CAB1> <CAB1> <73C2> <CAB2> <CAB2> <75C2> <CAB3> <CAB3> <7A3C> <CAB4> <CAB4> <82DB> <CAB5> <CAB5> <8304> <CAB6> <CAB6> <8857> <CAB7> <CAB7> <8888> <CAB8> <CAB8> <8A36> <CAB9> <CAB9> <8CC8> <CABA> <CABA> <8DCF> <CABB> <CABB> <8EFB> <CABC> <CABC> <8FE6> <CABD> <CABD> <99D5> <CABE> <CABE> <523B> <CABF> <CABF> <5374> <CAC0> <CAC0> <5404> <CAC1> <CAC1> <606A> <CAC2> <CAC2> <6164> <CAC3> <CAC3> <6BBC> <CAC4> <CAC4> <73CF> <CAC5> <CAC5> <811A> <CAC6> <CAC6> <89BA> <CAC7> <CAC7> <89D2> <CAC8> <CAC8> <95A3> <CAC9> <CAC9> <4F83> <CACA> <CACA> <520A> <CACB> <CACB> <58BE> <CACC> <CACC> <5978> <CACD> <CACD> <59E6> <CACE> <CACE> <5E72> <CACF> <CACF> <5E79> <CAD0> <CAD0> <61C7> <CAD1> <CAD1> <63C0> <CAD2> <CAD2> <6746> <CAD3> <CAD3> <67EC> <CAD4> <CAD4> <687F> <CAD5> <CAD5> <6F97> <CAD6> <CAD6> <764E> <CAD7> <CAD7> <770B> <CAD8> <CAD8> <78F5> <CAD9> <CAD9> <7A08> <CADA> <CADA> <7AFF> <CADB> <CADB> <7C21> <CADC> <CADC> <809D> <CADD> <CADD> <826E> <CADE> <CADE> <8271> <CADF> <CADF> <8AEB> <CAE0> <CAE0> <9593> <CAE1> <CAE1> <4E6B> <CAE2> <CAE2> <559D> <CAE3> <CAE3> <66F7> <CAE4> <CAE4> <6E34> <CAE5> <CAE5> <78A3> <CAE6> <CAE6> <7AED> <CAE7> <CAE7> <845B> <CAE8> <CAE8> <8910> <CAE9> <CAE9> <874E> <CAEA> <CAEA> <97A8> <CAEB> <CAEB> <52D8> <CAEC> <CAEC> <574E> <CAED> <CAED> <582A> <CAEE> <CAEE> <5D4C> <CAEF> <CAEF> <611F> <CAF0> <CAF0> <61BE> <CAF1> <CAF1> <6221> <CAF2> <CAF2> <6562> <CAF3> <CAF3> <67D1> <CAF4> <CAF4> <6A44> <CAF5> <CAF5> <6E1B> <CAF6> <CAF6> <7518> <CAF7> <CAF7> <75B3> <CAF8> <CAF8> <76E3> <CAF9> <CAF9> <77B0> <CAFA> <CAFA> <7D3A> <CAFB> <CAFB> <90AF> <CAFC> <CAFD> <9451> <CAFE> <CAFE> <9F95> <CBA1> <CBA1> <5323> endbfrange 100 beginbfrange <CBA2> <CBA2> <5CAC> <CBA3> <CBA3> <7532> <CBA4> <CBA4> <80DB> <CBA5> <CBA5> <9240> <CBA6> <CBA6> <9598> <CBA7> <CBA7> <525B> <CBA8> <CBA8> <5808> <CBA9> <CBA9> <59DC> <CBAA> <CBAA> <5CA1> <CBAB> <CBAB> <5D17> <CBAC> <CBAC> <5EB7> <CBAD> <CBAD> <5F3A> <CBAE> <CBAE> <5F4A> <CBAF> <CBAF> <6177> <CBB0> <CBB0> <6C5F> <CBB1> <CBB1> <757A> <CBB2> <CBB2> <7586> <CBB3> <CBB3> <7CE0> <CBB4> <CBB4> <7D73> <CBB5> <CBB5> <7DB1> <CBB6> <CBB6> <7F8C> <CBB7> <CBB7> <8154> <CBB8> <CBB8> <8221> <CBB9> <CBB9> <8591> <CBBA> <CBBA> <8941> <CBBB> <CBBB> <8B1B> <CBBC> <CBBC> <92FC> <CBBD> <CBBD> <964D> <CBBE> <CBBE> <9C47> <CBBF> <CBBF> <4ECB> <CBC0> <CBC0> <4EF7> <CBC1> <CBC1> <500B> <CBC2> <CBC2> <51F1> <CBC3> <CBC3> <584F> <CBC4> <CBC4> <6137> <CBC5> <CBC5> <613E> <CBC6> <CBC6> <6168> <CBC7> <CBC7> <6539> <CBC8> <CBC8> <69EA> <CBC9> <CBC9> <6F11> <CBCA> <CBCA> <75A5> <CBCB> <CBCB> <7686> <CBCC> <CBCC> <76D6> <CBCD> <CBCD> <7B87> <CBCE> <CBCE> <82A5> <CBCF> <CBCF> <84CB> <CBD0> <CBD0> <F900> <CBD1> <CBD1> <93A7> <CBD2> <CBD2> <958B> <CBD3> <CBD3> <5580> <CBD4> <CBD4> <5BA2> <CBD5> <CBD5> <5751> <CBD6> <CBD6> <F901> <CBD7> <CBD7> <7CB3> <CBD8> <CBD8> <7FB9> <CBD9> <CBD9> <91B5> <CBDA> <CBDA> <5028> <CBDB> <CBDB> <53BB> <CBDC> <CBDC> <5C45> <CBDD> <CBDD> <5DE8> <CBDE> <CBDE> <62D2> <CBDF> <CBDF> <636E> <CBE0> <CBE0> <64DA> <CBE1> <CBE1> <64E7> <CBE2> <CBE2> <6E20> <CBE3> <CBE3> <70AC> <CBE4> <CBE4> <795B> <CBE5> <CBE5> <8DDD> <CBE6> <CBE6> <8E1E> <CBE7> <CBE7> <F902> <CBE8> <CBE8> <907D> <CBE9> <CBE9> <9245> <CBEA> <CBEA> <92F8> <CBEB> <CBEB> <4E7E> <CBEC> <CBEC> <4EF6> <CBED> <CBED> <5065> <CBEE> <CBEE> <5DFE> <CBEF> <CBEF> <5EFA> <CBF0> <CBF0> <6106> <CBF1> <CBF1> <6957> <CBF2> <CBF2> <8171> <CBF3> <CBF3> <8654> <CBF4> <CBF4> <8E47> <CBF5> <CBF5> <9375> <CBF6> <CBF6> <9A2B> <CBF7> <CBF7> <4E5E> <CBF8> <CBF8> <5091> <CBF9> <CBF9> <6770> <CBFA> <CBFA> <6840> <CBFB> <CBFB> <5109> <CBFC> <CBFC> <528D> <CBFD> <CBFD> <5292> <CBFE> <CBFE> <6AA2> <CCA1> <CCA1> <77BC> <CCA2> <CCA2> <9210> <CCA3> <CCA3> <9ED4> <CCA4> <CCA4> <52AB> <CCA5> <CCA5> <602F> <CCA6> <CCA6> <8FF2> <CCA7> <CCA7> <5048> endbfrange 100 beginbfrange <CCA8> <CCA8> <61A9> <CCA9> <CCA9> <63ED> <CCAA> <CCAA> <64CA> <CCAB> <CCAB> <683C> <CCAC> <CCAC> <6A84> <CCAD> <CCAD> <6FC0> <CCAE> <CCAE> <8188> <CCAF> <CCAF> <89A1> <CCB0> <CCB0> <9694> <CCB1> <CCB1> <5805> <CCB2> <CCB2> <727D> <CCB3> <CCB3> <72AC> <CCB4> <CCB4> <7504> <CCB5> <CCB5> <7D79> <CCB6> <CCB6> <7E6D> <CCB7> <CCB7> <80A9> <CCB8> <CCB8> <898B> <CCB9> <CCB9> <8B74> <CCBA> <CCBA> <9063> <CCBB> <CCBB> <9D51> <CCBC> <CCBC> <6289> <CCBD> <CCBD> <6C7A> <CCBE> <CCBE> <6F54> <CCBF> <CCBF> <7D50> <CCC0> <CCC0> <7F3A> <CCC1> <CCC1> <8A23> <CCC2> <CCC2> <517C> <CCC3> <CCC3> <614A> <CCC4> <CCC4> <7B9D> <CCC5> <CCC5> <8B19> <CCC6> <CCC6> <9257> <CCC7> <CCC7> <938C> <CCC8> <CCC8> <4EAC> <CCC9> <CCC9> <4FD3> <CCCA> <CCCA> <501E> <CCCB> <CCCB> <50BE> <CCCC> <CCCC> <5106> <CCCD> <CCCD> <52C1> <CCCE> <CCCE> <52CD> <CCCF> <CCCF> <537F> <CCD0> <CCD0> <5770> <CCD1> <CCD1> <5883> <CCD2> <CCD2> <5E9A> <CCD3> <CCD3> <5F91> <CCD4> <CCD4> <6176> <CCD5> <CCD5> <61AC> <CCD6> <CCD6> <64CE> <CCD7> <CCD7> <656C> <CCD8> <CCD8> <666F> <CCD9> <CCD9> <66BB> <CCDA> <CCDA> <66F4> <CCDB> <CCDB> <6897> <CCDC> <CCDC> <6D87> <CCDD> <CCDD> <7085> <CCDE> <CCDE> <70F1> <CCDF> <CCDF> <749F> <CCE0> <CCE0> <74A5> <CCE1> <CCE1> <74CA> <CCE2> <CCE2> <75D9> <CCE3> <CCE3> <786C> <CCE4> <CCE4> <78EC> <CCE5> <CCE5> <7ADF> <CCE6> <CCE6> <7AF6> <CCE7> <CCE7> <7D45> <CCE8> <CCE8> <7D93> <CCE9> <CCE9> <8015> <CCEA> <CCEA> <803F> <CCEB> <CCEB> <811B> <CCEC> <CCEC> <8396> <CCED> <CCED> <8B66> <CCEE> <CCEE> <8F15> <CCEF> <CCEF> <9015> <CCF0> <CCF0> <93E1> <CCF1> <CCF1> <9803> <CCF2> <CCF2> <9838> <CCF3> <CCF3> <9A5A> <CCF4> <CCF4> <9BE8> <CCF5> <CCF5> <4FC2> <CCF6> <CCF6> <5553> <CCF7> <CCF7> <583A> <CCF8> <CCF8> <5951> <CCF9> <CCF9> <5B63> <CCFA> <CCFA> <5C46> <CCFB> <CCFB> <60B8> <CCFC> <CCFC> <6212> <CCFD> <CCFD> <6842> <CCFE> <CCFE> <68B0> <CDA1> <CDA1> <68E8> <CDA2> <CDA2> <6EAA> <CDA3> <CDA3> <754C> <CDA4> <CDA4> <7678> <CDA5> <CDA5> <78CE> <CDA6> <CDA6> <7A3D> <CDA7> <CDA7> <7CFB> <CDA8> <CDA8> <7E6B> <CDA9> <CDA9> <7E7C> <CDAA> <CDAA> <8A08> <CDAB> <CDAB> <8AA1> <CDAC> <CDAC> <8C3F> <CDAD> <CDAD> <968E> endbfrange 100 beginbfrange <CDAE> <CDAE> <9DC4> <CDAF> <CDAF> <53E4> <CDB0> <CDB0> <53E9> <CDB1> <CDB1> <544A> <CDB2> <CDB2> <5471> <CDB3> <CDB3> <56FA> <CDB4> <CDB4> <59D1> <CDB5> <CDB5> <5B64> <CDB6> <CDB6> <5C3B> <CDB7> <CDB7> <5EAB> <CDB8> <CDB8> <62F7> <CDB9> <CDB9> <6537> <CDBA> <CDBA> <6545> <CDBB> <CDBB> <6572> <CDBC> <CDBC> <66A0> <CDBD> <CDBD> <67AF> <CDBE> <CDBE> <69C1> <CDBF> <CDBF> <6CBD> <CDC0> <CDC0> <75FC> <CDC1> <CDC1> <7690> <CDC2> <CDC2> <777E> <CDC3> <CDC3> <7A3F> <CDC4> <CDC4> <7F94> <CDC5> <CDC5> <8003> <CDC6> <CDC6> <80A1> <CDC7> <CDC7> <818F> <CDC8> <CDC8> <82E6> <CDC9> <CDC9> <82FD> <CDCA> <CDCA> <83F0> <CDCB> <CDCB> <85C1> <CDCC> <CDCC> <8831> <CDCD> <CDCD> <88B4> <CDCE> <CDCE> <8AA5> <CDCF> <CDCF> <F903> <CDD0> <CDD0> <8F9C> <CDD1> <CDD1> <932E> <CDD2> <CDD2> <96C7> <CDD3> <CDD3> <9867> <CDD4> <CDD4> <9AD8> <CDD5> <CDD5> <9F13> <CDD6> <CDD6> <54ED> <CDD7> <CDD7> <659B> <CDD8> <CDD8> <66F2> <CDD9> <CDD9> <688F> <CDDA> <CDDA> <7A40> <CDDB> <CDDB> <8C37> <CDDC> <CDDC> <9D60> <CDDD> <CDDD> <56F0> <CDDE> <CDDE> <5764> <CDDF> <CDDF> <5D11> <CDE0> <CDE0> <6606> <CDE1> <CDE1> <68B1> <CDE2> <CDE2> <68CD> <CDE3> <CDE3> <6EFE> <CDE4> <CDE4> <7428> <CDE5> <CDE5> <889E> <CDE6> <CDE6> <9BE4> <CDE7> <CDE7> <6C68> <CDE8> <CDE8> <F904> <CDE9> <CDE9> <9AA8> <CDEA> <CDEA> <4F9B> <CDEB> <CDEB> <516C> <CDEC> <CDEC> <5171> <CDED> <CDED> <529F> <CDEE> <CDEE> <5B54> <CDEF> <CDEF> <5DE5> <CDF0> <CDF0> <6050> <CDF1> <CDF1> <606D> <CDF2> <CDF2> <62F1> <CDF3> <CDF3> <63A7> <CDF4> <CDF4> <653B> <CDF5> <CDF5> <73D9> <CDF6> <CDF6> <7A7A> <CDF7> <CDF7> <86A3> <CDF8> <CDF8> <8CA2> <CDF9> <CDF9> <978F> <CDFA> <CDFA> <4E32> <CDFB> <CDFB> <5BE1> <CDFC> <CDFC> <6208> <CDFD> <CDFD> <679C> <CDFE> <CDFE> <74DC> <CEA1> <CEA1> <79D1> <CEA2> <CEA2> <83D3> <CEA3> <CEA3> <8A87> <CEA4> <CEA4> <8AB2> <CEA5> <CEA5> <8DE8> <CEA6> <CEA6> <904E> <CEA7> <CEA7> <934B> <CEA8> <CEA8> <9846> <CEA9> <CEA9> <5ED3> <CEAA> <CEAA> <69E8> <CEAB> <CEAB> <85FF> <CEAC> <CEAC> <90ED> <CEAD> <CEAD> <F905> <CEAE> <CEAE> <51A0> <CEAF> <CEAF> <5B98> <CEB0> <CEB0> <5BEC> <CEB1> <CEB1> <6163> <CEB2> <CEB2> <68FA> <CEB3> <CEB3> <6B3E> endbfrange 100 beginbfrange <CEB4> <CEB4> <704C> <CEB5> <CEB5> <742F> <CEB6> <CEB6> <74D8> <CEB7> <CEB7> <7BA1> <CEB8> <CEB8> <7F50> <CEB9> <CEB9> <83C5> <CEBA> <CEBA> <89C0> <CEBB> <CEBB> <8CAB> <CEBC> <CEBC> <95DC> <CEBD> <CEBD> <9928> <CEBE> <CEBE> <522E> <CEBF> <CEBF> <605D> <CEC0> <CEC0> <62EC> <CEC1> <CEC1> <9002> <CEC2> <CEC2> <4F8A> <CEC3> <CEC3> <5149> <CEC4> <CEC4> <5321> <CEC5> <CEC5> <58D9> <CEC6> <CEC6> <5EE3> <CEC7> <CEC7> <66E0> <CEC8> <CEC8> <6D38> <CEC9> <CEC9> <709A> <CECA> <CECA> <72C2> <CECB> <CECB> <73D6> <CECC> <CECC> <7B50> <CECD> <CECD> <80F1> <CECE> <CECE> <945B> <CECF> <CECF> <5366> <CED0> <CED0> <639B> <CED1> <CED1> <7F6B> <CED2> <CED2> <4E56> <CED3> <CED3> <5080> <CED4> <CED4> <584A> <CED5> <CED5> <58DE> <CED6> <CED6> <602A> <CED7> <CED7> <6127> <CED8> <CED8> <62D0> <CED9> <CED9> <69D0> <CEDA> <CEDA> <9B41> <CEDB> <CEDB> <5B8F> <CEDC> <CEDC> <7D18> <CEDD> <CEDD> <80B1> <CEDE> <CEDE> <8F5F> <CEDF> <CEDF> <4EA4> <CEE0> <CEE0> <50D1> <CEE1> <CEE1> <54AC> <CEE2> <CEE2> <55AC> <CEE3> <CEE3> <5B0C> <CEE4> <CEE4> <5DA0> <CEE5> <CEE5> <5DE7> <CEE6> <CEE6> <652A> <CEE7> <CEE7> <654E> <CEE8> <CEE8> <6821> <CEE9> <CEE9> <6A4B> <CEEA> <CEEA> <72E1> <CEEB> <CEEB> <768E> <CEEC> <CEEC> <77EF> <CEED> <CEED> <7D5E> <CEEE> <CEEE> <7FF9> <CEEF> <CEEF> <81A0> <CEF0> <CEF0> <854E> <CEF1> <CEF1> <86DF> <CEF2> <CEF2> <8F03> <CEF3> <CEF3> <8F4E> <CEF4> <CEF4> <90CA> <CEF5> <CEF5> <9903> <CEF6> <CEF6> <9A55> <CEF7> <CEF7> <9BAB> <CEF8> <CEF8> <4E18> <CEF9> <CEF9> <4E45> <CEFA> <CEFA> <4E5D> <CEFB> <CEFB> <4EC7> <CEFC> <CEFC> <4FF1> <CEFD> <CEFD> <5177> <CEFE> <CEFE> <52FE> <CFA1> <CFA1> <5340> <CFA2> <CFA2> <53E3> <CFA3> <CFA3> <53E5> <CFA4> <CFA4> <548E> <CFA5> <CFA5> <5614> <CFA6> <CFA6> <5775> <CFA7> <CFA7> <57A2> <CFA8> <CFA8> <5BC7> <CFA9> <CFA9> <5D87> <CFAA> <CFAA> <5ED0> <CFAB> <CFAB> <61FC> <CFAC> <CFAC> <62D8> <CFAD> <CFAD> <6551> <CFAE> <CFAE> <67B8> <CFAF> <CFAF> <67E9> <CFB0> <CFB0> <69CB> <CFB1> <CFB1> <6B50> <CFB2> <CFB2> <6BC6> <CFB3> <CFB3> <6BEC> <CFB4> <CFB4> <6C42> <CFB5> <CFB5> <6E9D> <CFB6> <CFB6> <7078> <CFB7> <CFB7> <72D7> <CFB8> <CFB8> <7396> <CFB9> <CFB9> <7403> endbfrange 100 beginbfrange <CFBA> <CFBA> <77BF> <CFBB> <CFBB> <77E9> <CFBC> <CFBC> <7A76> <CFBD> <CFBD> <7D7F> <CFBE> <CFBE> <8009> <CFBF> <CFBF> <81FC> <CFC0> <CFC0> <8205> <CFC1> <CFC1> <820A> <CFC2> <CFC2> <82DF> <CFC3> <CFC3> <8862> <CFC4> <CFC4> <8B33> <CFC5> <CFC5> <8CFC> <CFC6> <CFC6> <8EC0> <CFC7> <CFC7> <9011> <CFC8> <CFC8> <90B1> <CFC9> <CFC9> <9264> <CFCA> <CFCA> <92B6> <CFCB> <CFCB> <99D2> <CFCC> <CFCC> <9A45> <CFCD> <CFCD> <9CE9> <CFCE> <CFCE> <9DD7> <CFCF> <CFCF> <9F9C> <CFD0> <CFD0> <570B> <CFD1> <CFD1> <5C40> <CFD2> <CFD2> <83CA> <CFD3> <CFD3> <97A0> <CFD4> <CFD4> <97AB> <CFD5> <CFD5> <9EB4> <CFD6> <CFD6> <541B> <CFD7> <CFD7> <7A98> <CFD8> <CFD8> <7FA4> <CFD9> <CFD9> <88D9> <CFDA> <CFDA> <8ECD> <CFDB> <CFDB> <90E1> <CFDC> <CFDC> <5800> <CFDD> <CFDD> <5C48> <CFDE> <CFDE> <6398> <CFDF> <CFDF> <7A9F> <CFE0> <CFE0> <5BAE> <CFE1> <CFE1> <5F13> <CFE2> <CFE2> <7A79> <CFE3> <CFE3> <7AAE> <CFE4> <CFE4> <828E> <CFE5> <CFE5> <8EAC> <CFE6> <CFE6> <5026> <CFE7> <CFE7> <5238> <CFE8> <CFE8> <52F8> <CFE9> <CFE9> <5377> <CFEA> <CFEA> <5708> <CFEB> <CFEB> <62F3> <CFEC> <CFEC> <6372> <CFED> <CFED> <6B0A> <CFEE> <CFEE> <6DC3> <CFEF> <CFEF> <7737> <CFF0> <CFF0> <53A5> <CFF1> <CFF1> <7357> <CFF2> <CFF2> <8568> <CFF3> <CFF3> <8E76> <CFF4> <CFF4> <95D5> <CFF5> <CFF5> <673A> <CFF6> <CFF6> <6AC3> <CFF7> <CFF7> <6F70> <CFF8> <CFF8> <8A6D> <CFF9> <CFF9> <8ECC> <CFFA> <CFFA> <994B> <CFFB> <CFFB> <F906> <CFFC> <CFFC> <6677> <CFFD> <CFFD> <6B78> <CFFE> <CFFE> <8CB4> <D0A1> <D0A1> <9B3C> <D0A2> <D0A2> <F907> <D0A3> <D0A3> <53EB> <D0A4> <D0A4> <572D> <D0A5> <D0A5> <594E> <D0A6> <D0A6> <63C6> <D0A7> <D0A7> <69FB> <D0A8> <D0A8> <73EA> <D0A9> <D0A9> <7845> <D0AA> <D0AA> <7ABA> <D0AB> <D0AB> <7AC5> <D0AC> <D0AC> <7CFE> <D0AD> <D0AD> <8475> <D0AE> <D0AE> <898F> <D0AF> <D0AF> <8D73> <D0B0> <D0B0> <9035> <D0B1> <D0B1> <95A8> <D0B2> <D0B2> <52FB> <D0B3> <D0B3> <5747> <D0B4> <D0B4> <7547> <D0B5> <D0B5> <7B60> <D0B6> <D0B6> <83CC> <D0B7> <D0B7> <921E> <D0B8> <D0B8> <F908> <D0B9> <D0B9> <6A58> <D0BA> <D0BA> <514B> <D0BB> <D0BB> <524B> <D0BC> <D0BC> <5287> <D0BD> <D0BD> <621F> <D0BE> <D0BE> <68D8> <D0BF> <D0BF> <6975> endbfrange 100 beginbfrange <D0C0> <D0C0> <9699> <D0C1> <D0C1> <50C5> <D0C2> <D0C2> <52A4> <D0C3> <D0C3> <52E4> <D0C4> <D0C4> <61C3> <D0C5> <D0C5> <65A4> <D0C6> <D0C6> <6839> <D0C7> <D0C7> <69FF> <D0C8> <D0C8> <747E> <D0C9> <D0C9> <7B4B> <D0CA> <D0CA> <82B9> <D0CB> <D0CB> <83EB> <D0CC> <D0CC> <89B2> <D0CD> <D0CD> <8B39> <D0CE> <D0CE> <8FD1> <D0CF> <D0CF> <9949> <D0D0> <D0D0> <F909> <D0D1> <D0D1> <4ECA> <D0D2> <D0D2> <5997> <D0D3> <D0D3> <64D2> <D0D4> <D0D4> <6611> <D0D5> <D0D5> <6A8E> <D0D6> <D0D6> <7434> <D0D7> <D0D7> <7981> <D0D8> <D0D8> <79BD> <D0D9> <D0D9> <82A9> <D0DA> <D0DB> <887E> <D0DC> <D0DC> <895F> <D0DD> <D0DD> <F90A> <D0DE> <D0DE> <9326> <D0DF> <D0DF> <4F0B> <D0E0> <D0E0> <53CA> <D0E1> <D0E1> <6025> <D0E2> <D0E2> <6271> <D0E3> <D0E3> <6C72> <D0E4> <D0E4> <7D1A> <D0E5> <D0E5> <7D66> <D0E6> <D0E6> <4E98> <D0E7> <D0E7> <5162> <D0E8> <D0E8> <77DC> <D0E9> <D0E9> <80AF> <D0EA> <D0EA> <4F01> <D0EB> <D0EB> <4F0E> <D0EC> <D0EC> <5176> <D0ED> <D0ED> <5180> <D0EE> <D0EE> <55DC> <D0EF> <D0EF> <5668> <D0F0> <D0F0> <573B> <D0F1> <D0F1> <57FA> <D0F2> <D0F2> <57FC> <D0F3> <D0F3> <5914> <D0F4> <D0F4> <5947> <D0F5> <D0F5> <5993> <D0F6> <D0F6> <5BC4> <D0F7> <D0F7> <5C90> <D0F8> <D0F8> <5D0E> <D0F9> <D0F9> <5DF1> <D0FA> <D0FA> <5E7E> <D0FB> <D0FB> <5FCC> <D0FC> <D0FC> <6280> <D0FD> <D0FD> <65D7> <D0FE> <D0FE> <65E3> <D1A1> <D1A2> <671E> <D1A3> <D1A3> <675E> <D1A4> <D1A4> <68CB> <D1A5> <D1A5> <68C4> <D1A6> <D1A6> <6A5F> <D1A7> <D1A7> <6B3A> <D1A8> <D1A8> <6C23> <D1A9> <D1A9> <6C7D> <D1AA> <D1AA> <6C82> <D1AB> <D1AB> <6DC7> <D1AC> <D1AC> <7398> <D1AD> <D1AD> <7426> <D1AE> <D1AE> <742A> <D1AF> <D1AF> <7482> <D1B0> <D1B0> <74A3> <D1B1> <D1B1> <7578> <D1B2> <D1B2> <757F> <D1B3> <D1B3> <7881> <D1B4> <D1B4> <78EF> <D1B5> <D1B5> <7941> <D1B6> <D1B7> <7947> <D1B8> <D1B8> <797A> <D1B9> <D1B9> <7B95> <D1BA> <D1BA> <7D00> <D1BB> <D1BB> <7DBA> <D1BC> <D1BC> <7F88> <D1BD> <D1BD> <8006> <D1BE> <D1BE> <802D> <D1BF> <D1BF> <808C> <D1C0> <D1C0> <8A18> <D1C1> <D1C1> <8B4F> <D1C2> <D1C2> <8C48> <D1C3> <D1C3> <8D77> <D1C4> <D1C4> <9321> <D1C5> <D1C5> <9324> <D1C6> <D1C6> <98E2> <D1C7> <D1C7> <9951> <D1C8> <D1C9> <9A0E> endbfrange 100 beginbfrange <D1CA> <D1CA> <9A65> <D1CB> <D1CB> <9E92> <D1CC> <D1CC> <7DCA> <D1CD> <D1CD> <4F76> <D1CE> <D1CE> <5409> <D1CF> <D1CF> <62EE> <D1D0> <D1D0> <6854> <D1D1> <D1D1> <91D1> <D1D2> <D1D2> <55AB> <D1D3> <D1D3> <513A> <D1D4> <D1D5> <F90B> <D1D6> <D1D6> <5A1C> <D1D7> <D1D7> <61E6> <D1D8> <D1D8> <F90D> <D1D9> <D1D9> <62CF> <D1DA> <D1DA> <62FF> <D1DB> <D1E0> <F90E> <D1E1> <D1E1> <90A3> <D1E2> <D1E6> <F914> <D1E7> <D1E7> <8AFE> <D1E8> <D1EB> <F919> <D1EC> <D1EC> <6696> <D1ED> <D1ED> <F91D> <D1EE> <D1EE> <7156> <D1EF> <D1F0> <F91E> <D1F1> <D1F1> <96E3> <D1F2> <D1F2> <F920> <D1F3> <D1F3> <634F> <D1F4> <D1F4> <637A> <D1F5> <D1F5> <5357> <D1F6> <D1F6> <F921> <D1F7> <D1F7> <678F> <D1F8> <D1F8> <6960> <D1F9> <D1F9> <6E73> <D1FA> <D1FA> <F922> <D1FB> <D1FB> <7537> <D1FC> <D1FE> <F923> <D2A1> <D2A1> <7D0D> <D2A2> <D2A3> <F926> <D2A4> <D2A4> <8872> <D2A5> <D2A5> <56CA> <D2A6> <D2A6> <5A18> <D2A7> <D2AB> <F928> <D2AC> <D2AC> <4E43> <D2AD> <D2AD> <F92D> <D2AE> <D2AE> <5167> <D2AF> <D2AF> <5948> <D2B0> <D2B0> <67F0> <D2B1> <D2B1> <8010> <D2B2> <D2B2> <F92E> <D2B3> <D2B3> <5973> <D2B4> <D2B4> <5E74> <D2B5> <D2B5> <649A> <D2B6> <D2B6> <79CA> <D2B7> <D2B7> <5FF5> <D2B8> <D2B8> <606C> <D2B9> <D2B9> <62C8> <D2BA> <D2BA> <637B> <D2BB> <D2BB> <5BE7> <D2BC> <D2BC> <5BD7> <D2BD> <D2BD> <52AA> <D2BE> <D2BE> <F92F> <D2BF> <D2BF> <5974> <D2C0> <D2C0> <5F29> <D2C1> <D2C1> <6012> <D2C2> <D2C4> <F930> <D2C5> <D2C5> <7459> <D2C6> <D2CB> <F933> <D2CC> <D2CC> <99D1> <D2CD> <D2D7> <F939> <D2D8> <D2D8> <6FC3> <D2D9> <D2DA> <F944> <D2DB> <D2DB> <81BF> <D2DC> <D2DC> <8FB2> <D2DD> <D2DD> <60F1> <D2DE> <D2DF> <F946> <D2E0> <D2E0> <8166> <D2E1> <D2E2> <F948> <D2E3> <D2E3> <5C3F> <D2E4> <D2EB> <F94A> <D2EC> <D2EC> <5AE9> <D2ED> <D2ED> <8A25> <D2EE> <D2EE> <677B> <D2EF> <D2EF> <7D10> <D2F0> <D2F5> <F952> <D2F6> <D2F6> <80FD> <D2F7> <D2F8> <F958> <D2F9> <D2F9> <5C3C> <D2FA> <D2FA> <6CE5> <D2FB> <D2FB> <533F> <D2FC> <D2FC> <6EBA> <D2FD> <D2FD> <591A> <D2FE> <D2FE> <8336> <D3A1> <D3A1> <4E39> <D3A2> <D3A2> <4EB6> <D3A3> <D3A3> <4F46> <D3A4> <D3A4> <55AE> <D3A5> <D3A5> <5718> <D3A6> <D3A6> <58C7> <D3A7> <D3A7> <5F56> endbfrange 100 beginbfrange <D3A8> <D3A8> <65B7> <D3A9> <D3A9> <65E6> <D3AA> <D3AA> <6A80> <D3AB> <D3AB> <6BB5> <D3AC> <D3AC> <6E4D> <D3AD> <D3AD> <77ED> <D3AE> <D3AE> <7AEF> <D3AF> <D3AF> <7C1E> <D3B0> <D3B0> <7DDE> <D3B1> <D3B1> <86CB> <D3B2> <D3B2> <8892> <D3B3> <D3B3> <9132> <D3B4> <D3B4> <935B> <D3B5> <D3B5> <64BB> <D3B6> <D3B6> <6FBE> <D3B7> <D3B7> <737A> <D3B8> <D3B8> <75B8> <D3B9> <D3B9> <9054> <D3BA> <D3BA> <5556> <D3BB> <D3BB> <574D> <D3BC> <D3BC> <61BA> <D3BD> <D3BD> <64D4> <D3BE> <D3BE> <66C7> <D3BF> <D3BF> <6DE1> <D3C0> <D3C0> <6E5B> <D3C1> <D3C1> <6F6D> <D3C2> <D3C2> <6FB9> <D3C3> <D3C3> <75F0> <D3C4> <D3C4> <8043> <D3C5> <D3C5> <81BD> <D3C6> <D3C6> <8541> <D3C7> <D3C7> <8983> <D3C8> <D3C8> <8AC7> <D3C9> <D3C9> <8B5A> <D3CA> <D3CA> <931F> <D3CB> <D3CB> <6C93> <D3CC> <D3CC> <7553> <D3CD> <D3CD> <7B54> <D3CE> <D3CE> <8E0F> <D3CF> <D3CF> <905D> <D3D0> <D3D0> <5510> <D3D1> <D3D1> <5802> <D3D2> <D3D2> <5858> <D3D3> <D3D3> <5E62> <D3D4> <D3D4> <6207> <D3D5> <D3D5> <649E> <D3D6> <D3D6> <68E0> <D3D7> <D3D7> <7576> <D3D8> <D3D8> <7CD6> <D3D9> <D3D9> <87B3> <D3DA> <D3DA> <9EE8> <D3DB> <D3DB> <4EE3> <D3DC> <D3DC> <5788> <D3DD> <D3DD> <576E> <D3DE> <D3DE> <5927> <D3DF> <D3DF> <5C0D> <D3E0> <D3E0> <5CB1> <D3E1> <D3E1> <5E36> <D3E2> <D3E2> <5F85> <D3E3> <D3E3> <6234> <D3E4> <D3E4> <64E1> <D3E5> <D3E5> <73B3> <D3E6> <D3E6> <81FA> <D3E7> <D3E7> <888B> <D3E8> <D3E8> <8CB8> <D3E9> <D3E9> <968A> <D3EA> <D3EA> <9EDB> <D3EB> <D3EB> <5B85> <D3EC> <D3EC> <5FB7> <D3ED> <D3ED> <60B3> <D3EE> <D3EE> <5012> <D3EF> <D3EF> <5200> <D3F0> <D3F0> <5230> <D3F1> <D3F1> <5716> <D3F2> <D3F2> <5835> <D3F3> <D3F3> <5857> <D3F4> <D3F4> <5C0E> <D3F5> <D3F5> <5C60> <D3F6> <D3F6> <5CF6> <D3F7> <D3F7> <5D8B> <D3F8> <D3F8> <5EA6> <D3F9> <D3F9> <5F92> <D3FA> <D3FA> <60BC> <D3FB> <D3FB> <6311> <D3FC> <D3FC> <6389> <D3FD> <D3FD> <6417> <D3FE> <D3FE> <6843> <D4A1> <D4A1> <68F9> <D4A2> <D4A2> <6AC2> <D4A3> <D4A3> <6DD8> <D4A4> <D4A4> <6E21> <D4A5> <D4A5> <6ED4> <D4A6> <D4A6> <6FE4> <D4A7> <D4A7> <71FE> <D4A8> <D4A8> <76DC> <D4A9> <D4A9> <7779> <D4AA> <D4AA> <79B1> <D4AB> <D4AB> <7A3B> <D4AC> <D4AC> <8404> <D4AD> <D4AD> <89A9> endbfrange 100 beginbfrange <D4AE> <D4AE> <8CED> <D4AF> <D4AF> <8DF3> <D4B0> <D4B0> <8E48> <D4B1> <D4B1> <9003> <D4B2> <D4B2> <9014> <D4B3> <D4B3> <9053> <D4B4> <D4B4> <90FD> <D4B5> <D4B5> <934D> <D4B6> <D4B6> <9676> <D4B7> <D4B7> <97DC> <D4B8> <D4B8> <6BD2> <D4B9> <D4B9> <7006> <D4BA> <D4BA> <7258> <D4BB> <D4BB> <72A2> <D4BC> <D4BC> <7368> <D4BD> <D4BD> <7763> <D4BE> <D4BE> <79BF> <D4BF> <D4BF> <7BE4> <D4C0> <D4C0> <7E9B> <D4C1> <D4C1> <8B80> <D4C2> <D4C2> <58A9> <D4C3> <D4C3> <60C7> <D4C4> <D4C4> <6566> <D4C5> <D4C5> <65FD> <D4C6> <D4C6> <66BE> <D4C7> <D4C7> <6C8C> <D4C8> <D4C8> <711E> <D4C9> <D4C9> <71C9> <D4CA> <D4CA> <8C5A> <D4CB> <D4CB> <9813> <D4CC> <D4CC> <4E6D> <D4CD> <D4CD> <7A81> <D4CE> <D4CE> <4EDD> <D4CF> <D4CF> <51AC> <D4D0> <D4D0> <51CD> <D4D1> <D4D1> <52D5> <D4D2> <D4D2> <540C> <D4D3> <D4D3> <61A7> <D4D4> <D4D4> <6771> <D4D5> <D4D5> <6850> <D4D6> <D4D6> <68DF> <D4D7> <D4D7> <6D1E> <D4D8> <D4D8> <6F7C> <D4D9> <D4D9> <75BC> <D4DA> <D4DA> <77B3> <D4DB> <D4DB> <7AE5> <D4DC> <D4DC> <80F4> <D4DD> <D4DD> <8463> <D4DE> <D4DE> <9285> <D4DF> <D4DF> <515C> <D4E0> <D4E0> <6597> <D4E1> <D4E1> <675C> <D4E2> <D4E2> <6793> <D4E3> <D4E3> <75D8> <D4E4> <D4E4> <7AC7> <D4E5> <D4E5> <8373> <D4E6> <D4E6> <F95A> <D4E7> <D4E7> <8C46> <D4E8> <D4E8> <9017> <D4E9> <D4E9> <982D> <D4EA> <D4EA> <5C6F> <D4EB> <D4EB> <81C0> <D4EC> <D4EC> <829A> <D4ED> <D4ED> <9041> <D4EE> <D4EE> <906F> <D4EF> <D4EF> <920D> <D4F0> <D4F0> <5F97> <D4F1> <D4F1> <5D9D> <D4F2> <D4F2> <6A59> <D4F3> <D4F3> <71C8> <D4F4> <D4F4> <767B> <D4F5> <D4F5> <7B49> <D4F6> <D4F6> <85E4> <D4F7> <D4F7> <8B04> <D4F8> <D4F8> <9127> <D4F9> <D4F9> <9A30> <D4FA> <D4FA> <5587> <D4FB> <D4FB> <61F6> <D4FC> <D4FC> <F95B> <D4FD> <D4FD> <7669> <D4FE> <D4FE> <7F85> <D5A1> <D5A1> <863F> <D5A2> <D5A2> <87BA> <D5A3> <D5A3> <88F8> <D5A4> <D5A4> <908F> <D5A5> <D5A5> <F95C> <D5A6> <D5A6> <6D1B> <D5A7> <D5A7> <70D9> <D5A8> <D5A8> <73DE> <D5A9> <D5A9> <7D61> <D5AA> <D5AA> <843D> <D5AB> <D5AB> <F95D> <D5AC> <D5AC> <916A> <D5AD> <D5AD> <99F1> <D5AE> <D5AE> <F95E> <D5AF> <D5AF> <4E82> <D5B0> <D5B0> <5375> <D5B1> <D5B1> <6B04> <D5B2> <D5B2> <6B12> <D5B3> <D5B3> <703E> endbfrange 100 beginbfrange <D5B4> <D5B4> <721B> <D5B5> <D5B5> <862D> <D5B6> <D5B6> <9E1E> <D5B7> <D5B7> <524C> <D5B8> <D5B8> <8FA3> <D5B9> <D5B9> <5D50> <D5BA> <D5BA> <64E5> <D5BB> <D5BB> <652C> <D5BC> <D5BC> <6B16> <D5BD> <D5BD> <6FEB> <D5BE> <D5BE> <7C43> <D5BF> <D5BF> <7E9C> <D5C0> <D5C0> <85CD> <D5C1> <D5C1> <8964> <D5C2> <D5C2> <89BD> <D5C3> <D5C3> <62C9> <D5C4> <D5C4> <81D8> <D5C5> <D5C5> <881F> <D5C6> <D5C6> <5ECA> <D5C7> <D5C7> <6717> <D5C8> <D5C8> <6D6A> <D5C9> <D5C9> <72FC> <D5CA> <D5CA> <7405> <D5CB> <D5CB> <746F> <D5CC> <D5CC> <8782> <D5CD> <D5CD> <90DE> <D5CE> <D5CE> <4F86> <D5CF> <D5CF> <5D0D> <D5D0> <D5D0> <5FA0> <D5D1> <D5D1> <840A> <D5D2> <D5D2> <51B7> <D5D3> <D5D3> <63A0> <D5D4> <D5D4> <7565> <D5D5> <D5D5> <4EAE> <D5D6> <D5D6> <5006> <D5D7> <D5D7> <5169> <D5D8> <D5D8> <51C9> <D5D9> <D5D9> <6881> <D5DA> <D5DA> <6A11> <D5DB> <D5DB> <7CAE> <D5DC> <D5DC> <7CB1> <D5DD> <D5DD> <7CE7> <D5DE> <D5DE> <826F> <D5DF> <D5DF> <8AD2> <D5E0> <D5E0> <8F1B> <D5E1> <D5E1> <91CF> <D5E2> <D5E2> <4FB6> <D5E3> <D5E3> <5137> <D5E4> <D5E4> <52F5> <D5E5> <D5E5> <5442> <D5E6> <D5E6> <5EEC> <D5E7> <D5E7> <616E> <D5E8> <D5E8> <623E> <D5E9> <D5E9> <65C5> <D5EA> <D5EA> <6ADA> <D5EB> <D5EB> <6FFE> <D5EC> <D5EC> <792A> <D5ED> <D5ED> <85DC> <D5EE> <D5EE> <8823> <D5EF> <D5EF> <95AD> <D5F0> <D5F0> <9A62> <D5F1> <D5F1> <9A6A> <D5F2> <D5F2> <9E97> <D5F3> <D5F3> <9ECE> <D5F4> <D5F4> <529B> <D5F5> <D5F5> <66C6> <D5F6> <D5F6> <6B77> <D5F7> <D5F7> <701D> <D5F8> <D5F8> <792B> <D5F9> <D5F9> <8F62> <D5FA> <D5FA> <9742> <D5FB> <D5FB> <6190> <D5FC> <D5FC> <6200> <D5FD> <D5FD> <6523> <D5FE> <D5FE> <6F23> <D6A1> <D6A1> <7149> <D6A2> <D6A2> <7489> <D6A3> <D6A3> <7DF4> <D6A4> <D6A4> <806F> <D6A5> <D6A5> <84EE> <D6A6> <D6A6> <8F26> <D6A7> <D6A7> <9023> <D6A8> <D6A8> <934A> <D6A9> <D6A9> <51BD> <D6AA> <D6AA> <5217> <D6AB> <D6AB> <52A3> <D6AC> <D6AC> <6D0C> <D6AD> <D6AD> <70C8> <D6AE> <D6AE> <88C2> <D6AF> <D6AF> <5EC9> <D6B0> <D6B0> <6582> <D6B1> <D6B1> <6BAE> <D6B2> <D6B2> <6FC2> <D6B3> <D6B3> <7C3E> <D6B4> <D6B4> <7375> <D6B5> <D6B5> <4EE4> <D6B6> <D6B6> <4F36> <D6B7> <D6B7> <56F9> <D6B8> <D6B8> <F95F> <D6B9> <D6B9> <5CBA> endbfrange 100 beginbfrange <D6BA> <D6BA> <5DBA> <D6BB> <D6BB> <601C> <D6BC> <D6BC> <73B2> <D6BD> <D6BD> <7B2D> <D6BE> <D6BE> <7F9A> <D6BF> <D6BF> <7FCE> <D6C0> <D6C0> <8046> <D6C1> <D6C1> <901E> <D6C2> <D6C2> <9234> <D6C3> <D6C3> <96F6> <D6C4> <D6C4> <9748> <D6C5> <D6C5> <9818> <D6C6> <D6C6> <9F61> <D6C7> <D6C7> <4F8B> <D6C8> <D6C8> <6FA7> <D6C9> <D6C9> <79AE> <D6CA> <D6CA> <91B4> <D6CB> <D6CB> <96B7> <D6CC> <D6CC> <52DE> <D6CD> <D6CD> <F960> <D6CE> <D6CE> <6488> <D6CF> <D6CF> <64C4> <D6D0> <D6D0> <6AD3> <D6D1> <D6D1> <6F5E> <D6D2> <D6D2> <7018> <D6D3> <D6D3> <7210> <D6D4> <D6D4> <76E7> <D6D5> <D6D5> <8001> <D6D6> <D6D6> <8606> <D6D7> <D6D7> <865C> <D6D8> <D6D8> <8DEF> <D6D9> <D6D9> <8F05> <D6DA> <D6DA> <9732> <D6DB> <D6DB> <9B6F> <D6DC> <D6DC> <9DFA> <D6DD> <D6DD> <9E75> <D6DE> <D6DE> <788C> <D6DF> <D6DF> <797F> <D6E0> <D6E0> <7DA0> <D6E1> <D6E1> <83C9> <D6E2> <D6E2> <9304> <D6E3> <D6E3> <9E7F> <D6E4> <D6E4> <9E93> <D6E5> <D6E5> <8AD6> <D6E6> <D6E6> <58DF> <D6E7> <D6E7> <5F04> <D6E8> <D6E8> <6727> <D6E9> <D6E9> <7027> <D6EA> <D6EA> <74CF> <D6EB> <D6EB> <7C60> <D6EC> <D6EC> <807E> <D6ED> <D6ED> <5121> <D6EE> <D6EE> <7028> <D6EF> <D6EF> <7262> <D6F0> <D6F0> <78CA> <D6F1> <D6F1> <8CC2> <D6F2> <D6F2> <8CDA> <D6F3> <D6F3> <8CF4> <D6F4> <D6F4> <96F7> <D6F5> <D6F5> <4E86> <D6F6> <D6F6> <50DA> <D6F7> <D6F7> <5BEE> <D6F8> <D6F8> <5ED6> <D6F9> <D6F9> <6599> <D6FA> <D6FA> <71CE> <D6FB> <D6FB> <7642> <D6FC> <D6FC> <77AD> <D6FD> <D6FD> <804A> <D6FE> <D6FE> <84FC> <D7A1> <D7A1> <907C> <D7A2> <D7A2> <9B27> <D7A3> <D7A3> <9F8D> <D7A4> <D7A4> <58D8> <D7A5> <D7A5> <5A41> <D7A6> <D7A6> <5C62> <D7A7> <D7A7> <6A13> <D7A8> <D7A8> <6DDA> <D7A9> <D7A9> <6F0F> <D7AA> <D7AA> <763B> <D7AB> <D7AB> <7D2F> <D7AC> <D7AC> <7E37> <D7AD> <D7AD> <851E> <D7AE> <D7AE> <8938> <D7AF> <D7AF> <93E4> <D7B0> <D7B0> <964B> <D7B1> <D7B1> <5289> <D7B2> <D7B2> <65D2> <D7B3> <D7B3> <67F3> <D7B4> <D7B4> <69B4> <D7B5> <D7B5> <6D41> <D7B6> <D7B6> <6E9C> <D7B7> <D7B7> <700F> <D7B8> <D7B8> <7409> <D7B9> <D7B9> <7460> <D7BA> <D7BA> <7559> <D7BB> <D7BB> <7624> <D7BC> <D7BC> <786B> <D7BD> <D7BD> <8B2C> <D7BE> <D7BE> <985E> <D7BF> <D7BF> <516D> endbfrange 100 beginbfrange <D7C0> <D7C0> <622E> <D7C1> <D7C1> <9678> <D7C2> <D7C2> <4F96> <D7C3> <D7C3> <502B> <D7C4> <D7C4> <5D19> <D7C5> <D7C5> <6DEA> <D7C6> <D7C6> <7DB8> <D7C7> <D7C7> <8F2A> <D7C8> <D7C8> <5F8B> <D7C9> <D7C9> <6144> <D7CA> <D7CA> <6817> <D7CB> <D7CB> <F961> <D7CC> <D7CC> <9686> <D7CD> <D7CD> <52D2> <D7CE> <D7CE> <808B> <D7CF> <D7CF> <51DC> <D7D0> <D7D0> <51CC> <D7D1> <D7D1> <695E> <D7D2> <D7D2> <7A1C> <D7D3> <D7D3> <7DBE> <D7D4> <D7D4> <83F1> <D7D5> <D7D5> <9675> <D7D6> <D7D6> <4FDA> <D7D7> <D7D7> <5229> <D7D8> <D7D8> <5398> <D7D9> <D7D9> <540F> <D7DA> <D7DA> <550E> <D7DB> <D7DB> <5C65> <D7DC> <D7DC> <60A7> <D7DD> <D7DD> <674E> <D7DE> <D7DE> <68A8> <D7DF> <D7DF> <6D6C> <D7E0> <D7E0> <7281> <D7E1> <D7E1> <72F8> <D7E2> <D7E2> <7406> <D7E3> <D7E3> <7483> <D7E4> <D7E4> <F962> <D7E5> <D7E5> <75E2> <D7E6> <D7E6> <7C6C> <D7E7> <D7E7> <7F79> <D7E8> <D7E8> <7FB8> <D7E9> <D7E9> <8389> <D7EA> <D7EA> <88CF> <D7EB> <D7EB> <88E1> <D7EC> <D7EC> <91CC> <D7ED> <D7ED> <91D0> <D7EE> <D7EE> <96E2> <D7EF> <D7EF> <9BC9> <D7F0> <D7F0> <541D> <D7F1> <D7F1> <6F7E> <D7F2> <D7F2> <71D0> <D7F3> <D7F3> <7498> <D7F4> <D7F4> <85FA> <D7F5> <D7F5> <8EAA> <D7F6> <D7F6> <96A3> <D7F7> <D7F7> <9C57> <D7F8> <D7F8> <9E9F> <D7F9> <D7F9> <6797> <D7FA> <D7FA> <6DCB> <D7FB> <D7FB> <7433> <D7FC> <D7FC> <81E8> <D7FD> <D7FD> <9716> <D7FE> <D7FE> <782C> <D8A1> <D8A1> <7ACB> <D8A2> <D8A2> <7B20> <D8A3> <D8A3> <7C92> <D8A4> <D8A4> <6469> <D8A5> <D8A5> <746A> <D8A6> <D8A6> <75F2> <D8A7> <D8A7> <78BC> <D8A8> <D8A8> <78E8> <D8A9> <D8A9> <99AC> <D8AA> <D8AA> <9B54> <D8AB> <D8AB> <9EBB> <D8AC> <D8AC> <5BDE> <D8AD> <D8AD> <5E55> <D8AE> <D8AE> <6F20> <D8AF> <D8AF> <819C> <D8B0> <D8B0> <83AB> <D8B1> <D8B1> <9088> <D8B2> <D8B2> <4E07> <D8B3> <D8B3> <534D> <D8B4> <D8B4> <5A29> <D8B5> <D8B5> <5DD2> <D8B6> <D8B6> <5F4E> <D8B7> <D8B7> <6162> <D8B8> <D8B8> <633D> <D8B9> <D8B9> <6669> <D8BA> <D8BA> <66FC> <D8BB> <D8BB> <6EFF> <D8BC> <D8BC> <6F2B> <D8BD> <D8BD> <7063> <D8BE> <D8BE> <779E> <D8BF> <D8BF> <842C> <D8C0> <D8C0> <8513> <D8C1> <D8C1> <883B> <D8C2> <D8C2> <8F13> <D8C3> <D8C3> <9945> <D8C4> <D8C4> <9C3B> <D8C5> <D8C5> <551C> endbfrange 100 beginbfrange <D8C6> <D8C6> <62B9> <D8C7> <D8C7> <672B> <D8C8> <D8C8> <6CAB> <D8C9> <D8C9> <8309> <D8CA> <D8CA> <896A> <D8CB> <D8CB> <977A> <D8CC> <D8CC> <4EA1> <D8CD> <D8CD> <5984> <D8CE> <D8CF> <5FD8> <D8D0> <D8D0> <671B> <D8D1> <D8D1> <7DB2> <D8D2> <D8D2> <7F54> <D8D3> <D8D3> <8292> <D8D4> <D8D4> <832B> <D8D5> <D8D5> <83BD> <D8D6> <D8D6> <8F1E> <D8D7> <D8D7> <9099> <D8D8> <D8D8> <57CB> <D8D9> <D8D9> <59B9> <D8DA> <D8DA> <5A92> <D8DB> <D8DB> <5BD0> <D8DC> <D8DC> <6627> <D8DD> <D8DD> <679A> <D8DE> <D8DE> <6885> <D8DF> <D8DF> <6BCF> <D8E0> <D8E0> <7164> <D8E1> <D8E1> <7F75> <D8E2> <D8E2> <8CB7> <D8E3> <D8E3> <8CE3> <D8E4> <D8E4> <9081> <D8E5> <D8E5> <9B45> <D8E6> <D8E6> <8108> <D8E7> <D8E7> <8C8A> <D8E8> <D8E8> <964C> <D8E9> <D8E9> <9A40> <D8EA> <D8EA> <9EA5> <D8EB> <D8EB> <5B5F> <D8EC> <D8EC> <6C13> <D8ED> <D8ED> <731B> <D8EE> <D8EE> <76F2> <D8EF> <D8EF> <76DF> <D8F0> <D8F0> <840C> <D8F1> <D8F1> <51AA> <D8F2> <D8F2> <8993> <D8F3> <D8F3> <514D> <D8F4> <D8F4> <5195> <D8F5> <D8F5> <52C9> <D8F6> <D8F6> <68C9> <D8F7> <D8F7> <6C94> <D8F8> <D8F8> <7704> <D8F9> <D8F9> <7720> <D8FA> <D8FA> <7DBF> <D8FB> <D8FB> <7DEC> <D8FC> <D8FC> <9762> <D8FD> <D8FD> <9EB5> <D8FE> <D8FE> <6EC5> <D9A1> <D9A1> <8511> <D9A2> <D9A2> <51A5> <D9A3> <D9A3> <540D> <D9A4> <D9A4> <547D> <D9A5> <D9A5> <660E> <D9A6> <D9A6> <669D> <D9A7> <D9A7> <6927> <D9A8> <D9A8> <6E9F> <D9A9> <D9A9> <76BF> <D9AA> <D9AA> <7791> <D9AB> <D9AB> <8317> <D9AC> <D9AC> <84C2> <D9AD> <D9AD> <879F> <D9AE> <D9AE> <9169> <D9AF> <D9AF> <9298> <D9B0> <D9B0> <9CF4> <D9B1> <D9B1> <8882> <D9B2> <D9B2> <4FAE> <D9B3> <D9B3> <5192> <D9B4> <D9B4> <52DF> <D9B5> <D9B5> <59C6> <D9B6> <D9B6> <5E3D> <D9B7> <D9B7> <6155> <D9B8> <D9B9> <6478> <D9BA> <D9BA> <66AE> <D9BB> <D9BB> <67D0> <D9BC> <D9BC> <6A21> <D9BD> <D9BD> <6BCD> <D9BE> <D9BE> <6BDB> <D9BF> <D9BF> <725F> <D9C0> <D9C0> <7261> <D9C1> <D9C1> <7441> <D9C2> <D9C2> <7738> <D9C3> <D9C3> <77DB> <D9C4> <D9C4> <8017> <D9C5> <D9C5> <82BC> <D9C6> <D9C6> <8305> <D9C7> <D9C7> <8B00> <D9C8> <D9C8> <8B28> <D9C9> <D9C9> <8C8C> <D9CA> <D9CA> <6728> <D9CB> <D9CB> <6C90> <D9CC> <D9CC> <7267> <D9CD> <D9CD> <76EE> endbfrange 100 beginbfrange <D9CE> <D9CE> <7766> <D9CF> <D9CF> <7A46> <D9D0> <D9D0> <9DA9> <D9D1> <D9D1> <6B7F> <D9D2> <D9D2> <6C92> <D9D3> <D9D3> <5922> <D9D4> <D9D4> <6726> <D9D5> <D9D5> <8499> <D9D6> <D9D6> <536F> <D9D7> <D9D7> <5893> <D9D8> <D9D8> <5999> <D9D9> <D9D9> <5EDF> <D9DA> <D9DA> <63CF> <D9DB> <D9DB> <6634> <D9DC> <D9DC> <6773> <D9DD> <D9DD> <6E3A> <D9DE> <D9DE> <732B> <D9DF> <D9DF> <7AD7> <D9E0> <D9E0> <82D7> <D9E1> <D9E1> <9328> <D9E2> <D9E2> <52D9> <D9E3> <D9E3> <5DEB> <D9E4> <D9E4> <61AE> <D9E5> <D9E5> <61CB> <D9E6> <D9E6> <620A> <D9E7> <D9E7> <62C7> <D9E8> <D9E8> <64AB> <D9E9> <D9E9> <65E0> <D9EA> <D9EA> <6959> <D9EB> <D9EB> <6B66> <D9EC> <D9EC> <6BCB> <D9ED> <D9ED> <7121> <D9EE> <D9EE> <73F7> <D9EF> <D9EF> <755D> <D9F0> <D9F0> <7E46> <D9F1> <D9F1> <821E> <D9F2> <D9F2> <8302> <D9F3> <D9F3> <856A> <D9F4> <D9F4> <8AA3> <D9F5> <D9F5> <8CBF> <D9F6> <D9F6> <9727> <D9F7> <D9F7> <9D61> <D9F8> <D9F8> <58A8> <D9F9> <D9F9> <9ED8> <D9FA> <D9FA> <5011> <D9FB> <D9FB> <520E> <D9FC> <D9FC> <543B> <D9FD> <D9FD> <554F> <D9FE> <D9FE> <6587> <DAA1> <DAA1> <6C76> <DAA2> <DAA3> <7D0A> <DAA4> <DAA4> <805E> <DAA5> <DAA5> <868A> <DAA6> <DAA6> <9580> <DAA7> <DAA7> <96EF> <DAA8> <DAA8> <52FF> <DAA9> <DAA9> <6C95> <DAAA> <DAAA> <7269> <DAAB> <DAAB> <5473> <DAAC> <DAAC> <5A9A> <DAAD> <DAAD> <5C3E> <DAAE> <DAAE> <5D4B> <DAAF> <DAAF> <5F4C> <DAB0> <DAB0> <5FAE> <DAB1> <DAB1> <672A> <DAB2> <DAB2> <68B6> <DAB3> <DAB3> <6963> <DAB4> <DAB4> <6E3C> <DAB5> <DAB5> <6E44> <DAB6> <DAB6> <7709> <DAB7> <DAB7> <7C73> <DAB8> <DAB8> <7F8E> <DAB9> <DAB9> <8587> <DABA> <DABA> <8B0E> <DABB> <DABB> <8FF7> <DABC> <DABC> <9761> <DABD> <DABD> <9EF4> <DABE> <DABE> <5CB7> <DABF> <DABF> <60B6> <DAC0> <DAC0> <610D> <DAC1> <DAC1> <61AB> <DAC2> <DAC2> <654F> <DAC3> <DAC4> <65FB> <DAC5> <DAC5> <6C11> <DAC6> <DAC6> <6CEF> <DAC7> <DAC7> <739F> <DAC8> <DAC8> <73C9> <DAC9> <DAC9> <7DE1> <DACA> <DACA> <9594> <DACB> <DACB> <5BC6> <DACC> <DACC> <871C> <DACD> <DACD> <8B10> <DACE> <DACE> <525D> <DACF> <DACF> <535A> <DAD0> <DAD0> <62CD> <DAD1> <DAD1> <640F> <DAD2> <DAD2> <64B2> <DAD3> <DAD3> <6734> <DAD4> <DAD4> <6A38> <DAD5> <DAD5> <6CCA> endbfrange 100 beginbfrange <DAD6> <DAD6> <73C0> <DAD7> <DAD7> <749E> <DAD8> <DAD8> <7B94> <DAD9> <DAD9> <7C95> <DADA> <DADA> <7E1B> <DADB> <DADB> <818A> <DADC> <DADC> <8236> <DADD> <DADD> <8584> <DADE> <DADE> <8FEB> <DADF> <DADF> <96F9> <DAE0> <DAE0> <99C1> <DAE1> <DAE1> <4F34> <DAE2> <DAE2> <534A> <DAE3> <DAE3> <53CD> <DAE4> <DAE4> <53DB> <DAE5> <DAE5> <62CC> <DAE6> <DAE6> <642C> <DAE7> <DAE7> <6500> <DAE8> <DAE8> <6591> <DAE9> <DAE9> <69C3> <DAEA> <DAEA> <6CEE> <DAEB> <DAEB> <6F58> <DAEC> <DAEC> <73ED> <DAED> <DAED> <7554> <DAEE> <DAEE> <7622> <DAEF> <DAEF> <76E4> <DAF0> <DAF0> <76FC> <DAF1> <DAF1> <78D0> <DAF2> <DAF2> <78FB> <DAF3> <DAF3> <792C> <DAF4> <DAF4> <7D46> <DAF5> <DAF5> <822C> <DAF6> <DAF6> <87E0> <DAF7> <DAF7> <8FD4> <DAF8> <DAF8> <9812> <DAF9> <DAF9> <98EF> <DAFA> <DAFA> <52C3> <DAFB> <DAFB> <62D4> <DAFC> <DAFC> <64A5> <DAFD> <DAFD> <6E24> <DAFE> <DAFE> <6F51> <DBA1> <DBA1> <767C> <DBA2> <DBA2> <8DCB> <DBA3> <DBA3> <91B1> <DBA4> <DBA4> <9262> <DBA5> <DBA5> <9AEE> <DBA6> <DBA6> <9B43> <DBA7> <DBA7> <5023> <DBA8> <DBA8> <508D> <DBA9> <DBA9> <574A> <DBAA> <DBAA> <59A8> <DBAB> <DBAB> <5C28> <DBAC> <DBAC> <5E47> <DBAD> <DBAD> <5F77> <DBAE> <DBAE> <623F> <DBAF> <DBAF> <653E> <DBB0> <DBB0> <65B9> <DBB1> <DBB1> <65C1> <DBB2> <DBB2> <6609> <DBB3> <DBB3> <678B> <DBB4> <DBB4> <699C> <DBB5> <DBB5> <6EC2> <DBB6> <DBB6> <78C5> <DBB7> <DBB7> <7D21> <DBB8> <DBB8> <80AA> <DBB9> <DBB9> <8180> <DBBA> <DBBA> <822B> <DBBB> <DBBB> <82B3> <DBBC> <DBBC> <84A1> <DBBD> <DBBD> <868C> <DBBE> <DBBE> <8A2A> <DBBF> <DBBF> <8B17> <DBC0> <DBC0> <90A6> <DBC1> <DBC1> <9632> <DBC2> <DBC2> <9F90> <DBC3> <DBC3> <500D> <DBC4> <DBC4> <4FF3> <DBC5> <DBC5> <F963> <DBC6> <DBC6> <57F9> <DBC7> <DBC7> <5F98> <DBC8> <DBC8> <62DC> <DBC9> <DBC9> <6392> <DBCA> <DBCA> <676F> <DBCB> <DBCB> <6E43> <DBCC> <DBCC> <7119> <DBCD> <DBCD> <76C3> <DBCE> <DBCE> <80CC> <DBCF> <DBCF> <80DA> <DBD0> <DBD1> <88F4> <DBD2> <DBD2> <8919> <DBD3> <DBD3> <8CE0> <DBD4> <DBD4> <8F29> <DBD5> <DBD5> <914D> <DBD6> <DBD6> <966A> <DBD7> <DBD7> <4F2F> <DBD8> <DBD8> <4F70> <DBD9> <DBD9> <5E1B> <DBDA> <DBDA> <67CF> <DBDB> <DBDB> <6822> <DBDC> <DBDD> <767D> endbfrange 100 beginbfrange <DBDE> <DBDE> <9B44> <DBDF> <DBDF> <5E61> <DBE0> <DBE0> <6A0A> <DBE1> <DBE1> <7169> <DBE2> <DBE2> <71D4> <DBE3> <DBE3> <756A> <DBE4> <DBE4> <F964> <DBE5> <DBE5> <7E41> <DBE6> <DBE6> <8543> <DBE7> <DBE7> <85E9> <DBE8> <DBE8> <98DC> <DBE9> <DBE9> <4F10> <DBEA> <DBEA> <7B4F> <DBEB> <DBEB> <7F70> <DBEC> <DBEC> <95A5> <DBED> <DBED> <51E1> <DBEE> <DBEE> <5E06> <DBEF> <DBEF> <68B5> <DBF0> <DBF0> <6C3E> <DBF1> <DBF1> <6C4E> <DBF2> <DBF2> <6CDB> <DBF3> <DBF3> <72AF> <DBF4> <DBF4> <7BC4> <DBF5> <DBF5> <8303> <DBF6> <DBF6> <6CD5> <DBF7> <DBF7> <743A> <DBF8> <DBF8> <50FB> <DBF9> <DBF9> <5288> <DBFA> <DBFA> <58C1> <DBFB> <DBFB> <64D8> <DBFC> <DBFC> <6A97> <DBFD> <DBFD> <74A7> <DBFE> <DBFE> <7656> <DCA1> <DCA1> <78A7> <DCA2> <DCA2> <8617> <DCA3> <DCA3> <95E2> <DCA4> <DCA4> <9739> <DCA5> <DCA5> <F965> <DCA6> <DCA6> <535E> <DCA7> <DCA7> <5F01> <DCA8> <DCA8> <8B8A> <DCA9> <DCA9> <8FA8> <DCAA> <DCAA> <8FAF> <DCAB> <DCAB> <908A> <DCAC> <DCAC> <5225> <DCAD> <DCAD> <77A5> <DCAE> <DCAE> <9C49> <DCAF> <DCAF> <9F08> <DCB0> <DCB0> <4E19> <DCB1> <DCB1> <5002> <DCB2> <DCB2> <5175> <DCB3> <DCB3> <5C5B> <DCB4> <DCB4> <5E77> <DCB5> <DCB5> <661E> <DCB6> <DCB6> <663A> <DCB7> <DCB7> <67C4> <DCB8> <DCB8> <68C5> <DCB9> <DCB9> <70B3> <DCBA> <DCBA> <7501> <DCBB> <DCBB> <75C5> <DCBC> <DCBC> <79C9> <DCBD> <DCBD> <7ADD> <DCBE> <DCBE> <8F27> <DCBF> <DCBF> <9920> <DCC0> <DCC0> <9A08> <DCC1> <DCC1> <4FDD> <DCC2> <DCC2> <5821> <DCC3> <DCC3> <5831> <DCC4> <DCC4> <5BF6> <DCC5> <DCC5> <666E> <DCC6> <DCC6> <6B65> <DCC7> <DCC7> <6D11> <DCC8> <DCC8> <6E7A> <DCC9> <DCC9> <6F7D> <DCCA> <DCCA> <73E4> <DCCB> <DCCB> <752B> <DCCC> <DCCC> <83E9> <DCCD> <DCCD> <88DC> <DCCE> <DCCE> <8913> <DCCF> <DCCF> <8B5C> <DCD0> <DCD0> <8F14> <DCD1> <DCD1> <4F0F> <DCD2> <DCD2> <50D5> <DCD3> <DCD3> <5310> <DCD4> <DCD4> <535C> <DCD5> <DCD5> <5B93> <DCD6> <DCD6> <5FA9> <DCD7> <DCD7> <670D> <DCD8> <DCD8> <798F> <DCD9> <DCD9> <8179> <DCDA> <DCDA> <832F> <DCDB> <DCDB> <8514> <DCDC> <DCDC> <8907> <DCDD> <DCDD> <8986> <DCDE> <DCDE> <8F39> <DCDF> <DCDF> <8F3B> <DCE0> <DCE0> <99A5> <DCE1> <DCE1> <9C12> <DCE2> <DCE2> <672C> <DCE3> <DCE3> <4E76> endbfrange 100 beginbfrange <DCE4> <DCE4> <4FF8> <DCE5> <DCE5> <5949> <DCE6> <DCE6> <5C01> <DCE7> <DCE8> <5CEF> <DCE9> <DCE9> <6367> <DCEA> <DCEA> <68D2> <DCEB> <DCEB> <70FD> <DCEC> <DCEC> <71A2> <DCED> <DCED> <742B> <DCEE> <DCEE> <7E2B> <DCEF> <DCEF> <84EC> <DCF0> <DCF0> <8702> <DCF1> <DCF1> <9022> <DCF2> <DCF2> <92D2> <DCF3> <DCF3> <9CF3> <DCF4> <DCF4> <4E0D> <DCF5> <DCF5> <4ED8> <DCF6> <DCF6> <4FEF> <DCF7> <DCF7> <5085> <DCF8> <DCF8> <5256> <DCF9> <DCF9> <526F> <DCFA> <DCFA> <5426> <DCFB> <DCFB> <5490> <DCFC> <DCFC> <57E0> <DCFD> <DCFD> <592B> <DCFE> <DCFE> <5A66> <DDA1> <DDA1> <5B5A> <DDA2> <DDA2> <5B75> <DDA3> <DDA3> <5BCC> <DDA4> <DDA4> <5E9C> <DDA5> <DDA5> <F966> <DDA6> <DDA6> <6276> <DDA7> <DDA7> <6577> <DDA8> <DDA8> <65A7> <DDA9> <DDA9> <6D6E> <DDAA> <DDAA> <6EA5> <DDAB> <DDAB> <7236> <DDAC> <DDAC> <7B26> <DDAD> <DDAD> <7C3F> <DDAE> <DDAE> <7F36> <DDAF> <DDB0> <8150> <DDB1> <DDB1> <819A> <DDB2> <DDB2> <8240> <DDB3> <DDB3> <8299> <DDB4> <DDB4> <83A9> <DDB5> <DDB5> <8A03> <DDB6> <DDB6> <8CA0> <DDB7> <DDB7> <8CE6> <DDB8> <DDB8> <8CFB> <DDB9> <DDB9> <8D74> <DDBA> <DDBA> <8DBA> <DDBB> <DDBB> <90E8> <DDBC> <DDBC> <91DC> <DDBD> <DDBD> <961C> <DDBE> <DDBE> <9644> <DDBF> <DDBF> <99D9> <DDC0> <DDC0> <9CE7> <DDC1> <DDC1> <5317> <DDC2> <DDC2> <5206> <DDC3> <DDC3> <5429> <DDC4> <DDC4> <5674> <DDC5> <DDC5> <58B3> <DDC6> <DDC6> <5954> <DDC7> <DDC7> <596E> <DDC8> <DDC8> <5FFF> <DDC9> <DDC9> <61A4> <DDCA> <DDCA> <626E> <DDCB> <DDCB> <6610> <DDCC> <DDCC> <6C7E> <DDCD> <DDCD> <711A> <DDCE> <DDCE> <76C6> <DDCF> <DDCF> <7C89> <DDD0> <DDD0> <7CDE> <DDD1> <DDD1> <7D1B> <DDD2> <DDD2> <82AC> <DDD3> <DDD3> <8CC1> <DDD4> <DDD4> <96F0> <DDD5> <DDD5> <F967> <DDD6> <DDD6> <4F5B> <DDD7> <DDD7> <5F17> <DDD8> <DDD8> <5F7F> <DDD9> <DDD9> <62C2> <DDDA> <DDDA> <5D29> <DDDB> <DDDB> <670B> <DDDC> <DDDC> <68DA> <DDDD> <DDDD> <787C> <DDDE> <DDDE> <7E43> <DDDF> <DDDF> <9D6C> <DDE0> <DDE0> <4E15> <DDE1> <DDE1> <5099> <DDE2> <DDE2> <5315> <DDE3> <DDE3> <532A> <DDE4> <DDE4> <5351> <DDE5> <DDE5> <5983> <DDE6> <DDE6> <5A62> <DDE7> <DDE7> <5E87> <DDE8> <DDE8> <60B2> <DDE9> <DDE9> <618A> <DDEA> <DDEA> <6249> <DDEB> <DDEB> <6279> endbfrange 100 beginbfrange <DDEC> <DDEC> <6590> <DDED> <DDED> <6787> <DDEE> <DDEE> <69A7> <DDEF> <DDEF> <6BD4> <DDF0> <DDF2> <6BD6> <DDF3> <DDF3> <6CB8> <DDF4> <DDF4> <F968> <DDF5> <DDF5> <7435> <DDF6> <DDF6> <75FA> <DDF7> <DDF7> <7812> <DDF8> <DDF8> <7891> <DDF9> <DDF9> <79D5> <DDFA> <DDFA> <79D8> <DDFB> <DDFB> <7C83> <DDFC> <DDFC> <7DCB> <DDFD> <DDFD> <7FE1> <DDFE> <DDFE> <80A5> <DEA1> <DEA1> <813E> <DEA2> <DEA2> <81C2> <DEA3> <DEA3> <83F2> <DEA4> <DEA4> <871A> <DEA5> <DEA5> <88E8> <DEA6> <DEA6> <8AB9> <DEA7> <DEA7> <8B6C> <DEA8> <DEA8> <8CBB> <DEA9> <DEA9> <9119> <DEAA> <DEAA> <975E> <DEAB> <DEAB> <98DB> <DEAC> <DEAC> <9F3B> <DEAD> <DEAD> <56AC> <DEAE> <DEAE> <5B2A> <DEAF> <DEAF> <5F6C> <DEB0> <DEB0> <658C> <DEB1> <DEB1> <6AB3> <DEB2> <DEB2> <6BAF> <DEB3> <DEB3> <6D5C> <DEB4> <DEB4> <6FF1> <DEB5> <DEB5> <7015> <DEB6> <DEB6> <725D> <DEB7> <DEB7> <73AD> <DEB8> <DEB8> <8CA7> <DEB9> <DEB9> <8CD3> <DEBA> <DEBA> <983B> <DEBB> <DEBB> <6191> <DEBC> <DEBC> <6C37> <DEBD> <DEBD> <8058> <DEBE> <DEBE> <9A01> <DEBF> <DEBF> <4E4D> <DEC0> <DEC0> <4E8B> <DEC1> <DEC1> <4E9B> <DEC2> <DEC2> <4ED5> <DEC3> <DEC3> <4F3A> <DEC4> <DEC4> <4F3C> <DEC5> <DEC5> <4F7F> <DEC6> <DEC6> <4FDF> <DEC7> <DEC7> <50FF> <DEC8> <DEC8> <53F2> <DEC9> <DEC9> <53F8> <DECA> <DECA> <5506> <DECB> <DECB> <55E3> <DECC> <DECC> <56DB> <DECD> <DECD> <58EB> <DECE> <DECE> <5962> <DECF> <DECF> <5A11> <DED0> <DED0> <5BEB> <DED1> <DED1> <5BFA> <DED2> <DED2> <5C04> <DED3> <DED3> <5DF3> <DED4> <DED4> <5E2B> <DED5> <DED5> <5F99> <DED6> <DED6> <601D> <DED7> <DED7> <6368> <DED8> <DED8> <659C> <DED9> <DED9> <65AF> <DEDA> <DEDA> <67F6> <DEDB> <DEDB> <67FB> <DEDC> <DEDC> <68AD> <DEDD> <DEDD> <6B7B> <DEDE> <DEDE> <6C99> <DEDF> <DEDF> <6CD7> <DEE0> <DEE0> <6E23> <DEE1> <DEE1> <7009> <DEE2> <DEE2> <7345> <DEE3> <DEE3> <7802> <DEE4> <DEE4> <793E> <DEE5> <DEE5> <7940> <DEE6> <DEE6> <7960> <DEE7> <DEE7> <79C1> <DEE8> <DEE8> <7BE9> <DEE9> <DEE9> <7D17> <DEEA> <DEEA> <7D72> <DEEB> <DEEB> <8086> <DEEC> <DEEC> <820D> <DEED> <DEED> <838E> <DEEE> <DEEE> <84D1> <DEEF> <DEEF> <86C7> <DEF0> <DEF0> <88DF> <DEF1> <DEF1> <8A50> <DEF2> <DEF2> <8A5E> <DEF3> <DEF3> <8B1D> endbfrange 100 beginbfrange <DEF4> <DEF4> <8CDC> <DEF5> <DEF5> <8D66> <DEF6> <DEF6> <8FAD> <DEF7> <DEF7> <90AA> <DEF8> <DEF8> <98FC> <DEF9> <DEF9> <99DF> <DEFA> <DEFA> <9E9D> <DEFB> <DEFB> <524A> <DEFC> <DEFC> <F969> <DEFD> <DEFD> <6714> <DEFE> <DEFE> <F96A> <DFA1> <DFA1> <5098> <DFA2> <DFA2> <522A> <DFA3> <DFA3> <5C71> <DFA4> <DFA4> <6563> <DFA5> <DFA5> <6C55> <DFA6> <DFA6> <73CA> <DFA7> <DFA7> <7523> <DFA8> <DFA8> <759D> <DFA9> <DFA9> <7B97> <DFAA> <DFAA> <849C> <DFAB> <DFAB> <9178> <DFAC> <DFAC> <9730> <DFAD> <DFAD> <4E77> <DFAE> <DFAE> <6492> <DFAF> <DFAF> <6BBA> <DFB0> <DFB0> <715E> <DFB1> <DFB1> <85A9> <DFB2> <DFB2> <4E09> <DFB3> <DFB3> <F96B> <DFB4> <DFB4> <6749> <DFB5> <DFB5> <68EE> <DFB6> <DFB6> <6E17> <DFB7> <DFB7> <829F> <DFB8> <DFB8> <8518> <DFB9> <DFB9> <886B> <DFBA> <DFBA> <63F7> <DFBB> <DFBB> <6F81> <DFBC> <DFBC> <9212> <DFBD> <DFBD> <98AF> <DFBE> <DFBE> <4E0A> <DFBF> <DFBF> <50B7> <DFC0> <DFC0> <50CF> <DFC1> <DFC1> <511F> <DFC2> <DFC2> <5546> <DFC3> <DFC3> <55AA> <DFC4> <DFC4> <5617> <DFC5> <DFC5> <5B40> <DFC6> <DFC6> <5C19> <DFC7> <DFC7> <5CE0> <DFC8> <DFC8> <5E38> <DFC9> <DFC9> <5E8A> <DFCA> <DFCA> <5EA0> <DFCB> <DFCB> <5EC2> <DFCC> <DFCC> <60F3> <DFCD> <DFCD> <6851> <DFCE> <DFCE> <6A61> <DFCF> <DFCF> <6E58> <DFD0> <DFD0> <723D> <DFD1> <DFD1> <7240> <DFD2> <DFD2> <72C0> <DFD3> <DFD3> <76F8> <DFD4> <DFD4> <7965> <DFD5> <DFD5> <7BB1> <DFD6> <DFD6> <7FD4> <DFD7> <DFD7> <88F3> <DFD8> <DFD8> <89F4> <DFD9> <DFD9> <8A73> <DFDA> <DFDA> <8C61> <DFDB> <DFDB> <8CDE> <DFDC> <DFDC> <971C> <DFDD> <DFDD> <585E> <DFDE> <DFDE> <74BD> <DFDF> <DFDF> <8CFD> <DFE0> <DFE0> <55C7> <DFE1> <DFE1> <F96C> <DFE2> <DFE2> <7A61> <DFE3> <DFE3> <7D22> <DFE4> <DFE4> <8272> <DFE5> <DFE5> <7272> <DFE6> <DFE6> <751F> <DFE7> <DFE7> <7525> <DFE8> <DFE8> <F96D> <DFE9> <DFE9> <7B19> <DFEA> <DFEA> <5885> <DFEB> <DFEB> <58FB> <DFEC> <DFEC> <5DBC> <DFED> <DFED> <5E8F> <DFEE> <DFEE> <5EB6> <DFEF> <DFEF> <5F90> <DFF0> <DFF0> <6055> <DFF1> <DFF1> <6292> <DFF2> <DFF2> <637F> <DFF3> <DFF3> <654D> <DFF4> <DFF4> <6691> <DFF5> <DFF5> <66D9> <DFF6> <DFF6> <66F8> <DFF7> <DFF7> <6816> <DFF8> <DFF8> <68F2> <DFF9> <DFF9> <7280> endbfrange 100 beginbfrange <DFFA> <DFFA> <745E> <DFFB> <DFFB> <7B6E> <DFFC> <DFFC> <7D6E> <DFFD> <DFFD> <7DD6> <DFFE> <DFFE> <7F72> <E0A1> <E0A1> <80E5> <E0A2> <E0A2> <8212> <E0A3> <E0A3> <85AF> <E0A4> <E0A4> <897F> <E0A5> <E0A5> <8A93> <E0A6> <E0A6> <901D> <E0A7> <E0A7> <92E4> <E0A8> <E0A8> <9ECD> <E0A9> <E0A9> <9F20> <E0AA> <E0AA> <5915> <E0AB> <E0AB> <596D> <E0AC> <E0AC> <5E2D> <E0AD> <E0AD> <60DC> <E0AE> <E0AE> <6614> <E0AF> <E0AF> <6673> <E0B0> <E0B0> <6790> <E0B1> <E0B1> <6C50> <E0B2> <E0B2> <6DC5> <E0B3> <E0B3> <6F5F> <E0B4> <E0B4> <77F3> <E0B5> <E0B5> <78A9> <E0B6> <E0B6> <84C6> <E0B7> <E0B7> <91CB> <E0B8> <E0B8> <932B> <E0B9> <E0B9> <4ED9> <E0BA> <E0BA> <50CA> <E0BB> <E0BB> <5148> <E0BC> <E0BC> <5584> <E0BD> <E0BD> <5B0B> <E0BE> <E0BE> <5BA3> <E0BF> <E0BF> <6247> <E0C0> <E0C0> <657E> <E0C1> <E0C1> <65CB> <E0C2> <E0C2> <6E32> <E0C3> <E0C3> <717D> <E0C4> <E0C4> <7401> <E0C5> <E0C5> <7444> <E0C6> <E0C6> <7487> <E0C7> <E0C7> <74BF> <E0C8> <E0C8> <766C> <E0C9> <E0C9> <79AA> <E0CA> <E0CA> <7DDA> <E0CB> <E0CB> <7E55> <E0CC> <E0CC> <7FA8> <E0CD> <E0CD> <817A> <E0CE> <E0CE> <81B3> <E0CF> <E0CF> <8239> <E0D0> <E0D0> <861A> <E0D1> <E0D1> <87EC> <E0D2> <E0D2> <8A75> <E0D3> <E0D3> <8DE3> <E0D4> <E0D4> <9078> <E0D5> <E0D5> <9291> <E0D6> <E0D6> <9425> <E0D7> <E0D7> <994D> <E0D8> <E0D8> <9BAE> <E0D9> <E0D9> <5368> <E0DA> <E0DA> <5C51> <E0DB> <E0DB> <6954> <E0DC> <E0DC> <6CC4> <E0DD> <E0DD> <6D29> <E0DE> <E0DE> <6E2B> <E0DF> <E0DF> <820C> <E0E0> <E0E0> <859B> <E0E1> <E0E1> <893B> <E0E2> <E0E2> <8A2D> <E0E3> <E0E3> <8AAA> <E0E4> <E0E4> <96EA> <E0E5> <E0E5> <9F67> <E0E6> <E0E6> <5261> <E0E7> <E0E7> <66B9> <E0E8> <E0E8> <6BB2> <E0E9> <E0E9> <7E96> <E0EA> <E0EA> <87FE> <E0EB> <E0EB> <8D0D> <E0EC> <E0EC> <9583> <E0ED> <E0ED> <965D> <E0EE> <E0EE> <651D> <E0EF> <E0EF> <6D89> <E0F0> <E0F0> <71EE> <E0F1> <E0F1> <F96E> <E0F2> <E0F2> <57CE> <E0F3> <E0F3> <59D3> <E0F4> <E0F4> <5BAC> <E0F5> <E0F5> <6027> <E0F6> <E0F6> <60FA> <E0F7> <E0F7> <6210> <E0F8> <E0F8> <661F> <E0F9> <E0F9> <665F> <E0FA> <E0FA> <7329> <E0FB> <E0FB> <73F9> <E0FC> <E0FC> <76DB> <E0FD> <E0FD> <7701> <E0FE> <E0FE> <7B6C> <E1A1> <E1A1> <8056> endbfrange 100 beginbfrange <E1A2> <E1A2> <8072> <E1A3> <E1A3> <8165> <E1A4> <E1A4> <8AA0> <E1A5> <E1A5> <9192> <E1A6> <E1A6> <4E16> <E1A7> <E1A7> <52E2> <E1A8> <E1A8> <6B72> <E1A9> <E1A9> <6D17> <E1AA> <E1AA> <7A05> <E1AB> <E1AB> <7B39> <E1AC> <E1AC> <7D30> <E1AD> <E1AD> <F96F> <E1AE> <E1AE> <8CB0> <E1AF> <E1AF> <53EC> <E1B0> <E1B0> <562F> <E1B1> <E1B1> <5851> <E1B2> <E1B2> <5BB5> <E1B3> <E1B3> <5C0F> <E1B4> <E1B4> <5C11> <E1B5> <E1B5> <5DE2> <E1B6> <E1B6> <6240> <E1B7> <E1B7> <6383> <E1B8> <E1B8> <6414> <E1B9> <E1B9> <662D> <E1BA> <E1BA> <68B3> <E1BB> <E1BB> <6CBC> <E1BC> <E1BC> <6D88> <E1BD> <E1BD> <6EAF> <E1BE> <E1BE> <701F> <E1BF> <E1BF> <70A4> <E1C0> <E1C0> <71D2> <E1C1> <E1C1> <7526> <E1C2> <E1C2> <758F> <E1C3> <E1C3> <758E> <E1C4> <E1C4> <7619> <E1C5> <E1C5> <7B11> <E1C6> <E1C6> <7BE0> <E1C7> <E1C7> <7C2B> <E1C8> <E1C8> <7D20> <E1C9> <E1C9> <7D39> <E1CA> <E1CA> <852C> <E1CB> <E1CB> <856D> <E1CC> <E1CC> <8607> <E1CD> <E1CD> <8A34> <E1CE> <E1CE> <900D> <E1CF> <E1CF> <9061> <E1D0> <E1D0> <90B5> <E1D1> <E1D1> <92B7> <E1D2> <E1D2> <97F6> <E1D3> <E1D3> <9A37> <E1D4> <E1D4> <4FD7> <E1D5> <E1D5> <5C6C> <E1D6> <E1D6> <675F> <E1D7> <E1D7> <6D91> <E1D8> <E1D8> <7C9F> <E1D9> <E1D9> <7E8C> <E1DA> <E1DA> <8B16> <E1DB> <E1DB> <8D16> <E1DC> <E1DC> <901F> <E1DD> <E1DD> <5B6B> <E1DE> <E1DE> <5DFD> <E1DF> <E1DF> <640D> <E1E0> <E1E0> <84C0> <E1E1> <E1E1> <905C> <E1E2> <E1E2> <98E1> <E1E3> <E1E3> <7387> <E1E4> <E1E4> <5B8B> <E1E5> <E1E5> <609A> <E1E6> <E1E6> <677E> <E1E7> <E1E7> <6DDE> <E1E8> <E1E8> <8A1F> <E1E9> <E1E9> <8AA6> <E1EA> <E1EA> <9001> <E1EB> <E1EB> <980C> <E1EC> <E1EC> <5237> <E1ED> <E1ED> <F970> <E1EE> <E1EE> <7051> <E1EF> <E1EF> <788E> <E1F0> <E1F0> <9396> <E1F1> <E1F1> <8870> <E1F2> <E1F2> <91D7> <E1F3> <E1F3> <4FEE> <E1F4> <E1F4> <53D7> <E1F5> <E1F5> <55FD> <E1F6> <E1F6> <56DA> <E1F7> <E1F7> <5782> <E1F8> <E1F8> <58FD> <E1F9> <E1F9> <5AC2> <E1FA> <E1FA> <5B88> <E1FB> <E1FB> <5CAB> <E1FC> <E1FC> <5CC0> <E1FD> <E1FD> <5E25> <E1FE> <E1FE> <6101> <E2A1> <E2A1> <620D> <E2A2> <E2A2> <624B> <E2A3> <E2A3> <6388> <E2A4> <E2A4> <641C> <E2A5> <E2A5> <6536> <E2A6> <E2A6> <6578> <E2A7> <E2A7> <6A39> endbfrange 100 beginbfrange <E2A8> <E2A8> <6B8A> <E2A9> <E2A9> <6C34> <E2AA> <E2AA> <6D19> <E2AB> <E2AB> <6F31> <E2AC> <E2AC> <71E7> <E2AD> <E2AD> <72E9> <E2AE> <E2AE> <7378> <E2AF> <E2AF> <7407> <E2B0> <E2B0> <74B2> <E2B1> <E2B1> <7626> <E2B2> <E2B2> <7761> <E2B3> <E2B3> <79C0> <E2B4> <E2B4> <7A57> <E2B5> <E2B5> <7AEA> <E2B6> <E2B6> <7CB9> <E2B7> <E2B7> <7D8F> <E2B8> <E2B8> <7DAC> <E2B9> <E2B9> <7E61> <E2BA> <E2BA> <7F9E> <E2BB> <E2BB> <8129> <E2BC> <E2BC> <8331> <E2BD> <E2BD> <8490> <E2BE> <E2BE> <84DA> <E2BF> <E2BF> <85EA> <E2C0> <E2C0> <8896> <E2C1> <E2C1> <8AB0> <E2C2> <E2C2> <8B90> <E2C3> <E2C3> <8F38> <E2C4> <E2C4> <9042> <E2C5> <E2C5> <9083> <E2C6> <E2C6> <916C> <E2C7> <E2C7> <9296> <E2C8> <E2C8> <92B9> <E2C9> <E2C9> <968B> <E2CA> <E2CB> <96A7> <E2CC> <E2CC> <96D6> <E2CD> <E2CD> <9700> <E2CE> <E2CE> <9808> <E2CF> <E2CF> <9996> <E2D0> <E2D0> <9AD3> <E2D1> <E2D1> <9B1A> <E2D2> <E2D2> <53D4> <E2D3> <E2D3> <587E> <E2D4> <E2D4> <5919> <E2D5> <E2D5> <5B70> <E2D6> <E2D6> <5BBF> <E2D7> <E2D7> <6DD1> <E2D8> <E2D8> <6F5A> <E2D9> <E2D9> <719F> <E2DA> <E2DA> <7421> <E2DB> <E2DB> <74B9> <E2DC> <E2DC> <8085> <E2DD> <E2DD> <83FD> <E2DE> <E2DE> <5DE1> <E2DF> <E2DF> <5F87> <E2E0> <E2E0> <5FAA> <E2E1> <E2E1> <6042> <E2E2> <E2E2> <65EC> <E2E3> <E2E3> <6812> <E2E4> <E2E4> <696F> <E2E5> <E2E5> <6A53> <E2E6> <E2E6> <6B89> <E2E7> <E2E7> <6D35> <E2E8> <E2E8> <6DF3> <E2E9> <E2E9> <73E3> <E2EA> <E2EA> <76FE> <E2EB> <E2EB> <77AC> <E2EC> <E2EC> <7B4D> <E2ED> <E2ED> <7D14> <E2EE> <E2EE> <8123> <E2EF> <E2EF> <821C> <E2F0> <E2F0> <8340> <E2F1> <E2F1> <84F4> <E2F2> <E2F2> <8563> <E2F3> <E2F3> <8A62> <E2F4> <E2F4> <8AC4> <E2F5> <E2F5> <9187> <E2F6> <E2F6> <931E> <E2F7> <E2F7> <9806> <E2F8> <E2F8> <99B4> <E2F9> <E2F9> <620C> <E2FA> <E2FA> <8853> <E2FB> <E2FB> <8FF0> <E2FC> <E2FC> <9265> <E2FD> <E2FD> <5D07> <E2FE> <E2FE> <5D27> <E3A1> <E3A1> <5D69> <E3A2> <E3A2> <745F> <E3A3> <E3A3> <819D> <E3A4> <E3A4> <8768> <E3A5> <E3A5> <6FD5> <E3A6> <E3A6> <62FE> <E3A7> <E3A7> <7FD2> <E3A8> <E3A8> <8936> <E3A9> <E3A9> <8972> <E3AA> <E3AA> <4E1E> <E3AB> <E3AB> <4E58> <E3AC> <E3AC> <50E7> <E3AD> <E3AD> <52DD> <E3AE> <E3AE> <5347> endbfrange 100 beginbfrange <E3AF> <E3AF> <627F> <E3B0> <E3B0> <6607> <E3B1> <E3B1> <7E69> <E3B2> <E3B2> <8805> <E3B3> <E3B3> <965E> <E3B4> <E3B4> <4F8D> <E3B5> <E3B5> <5319> <E3B6> <E3B6> <5636> <E3B7> <E3B7> <59CB> <E3B8> <E3B8> <5AA4> <E3B9> <E3B9> <5C38> <E3BA> <E3BA> <5C4E> <E3BB> <E3BB> <5C4D> <E3BC> <E3BC> <5E02> <E3BD> <E3BD> <5F11> <E3BE> <E3BE> <6043> <E3BF> <E3BF> <65BD> <E3C0> <E3C0> <662F> <E3C1> <E3C1> <6642> <E3C2> <E3C2> <67BE> <E3C3> <E3C3> <67F4> <E3C4> <E3C4> <731C> <E3C5> <E3C5> <77E2> <E3C6> <E3C6> <793A> <E3C7> <E3C7> <7FC5> <E3C8> <E3C8> <8494> <E3C9> <E3C9> <84CD> <E3CA> <E3CA> <8996> <E3CB> <E3CB> <8A66> <E3CC> <E3CC> <8A69> <E3CD> <E3CD> <8AE1> <E3CE> <E3CE> <8C55> <E3CF> <E3CF> <8C7A> <E3D0> <E3D0> <57F4> <E3D1> <E3D1> <5BD4> <E3D2> <E3D2> <5F0F> <E3D3> <E3D3> <606F> <E3D4> <E3D4> <62ED> <E3D5> <E3D5> <690D> <E3D6> <E3D6> <6B96> <E3D7> <E3D7> <6E5C> <E3D8> <E3D8> <7184> <E3D9> <E3D9> <7BD2> <E3DA> <E3DA> <8755> <E3DB> <E3DB> <8B58> <E3DC> <E3DC> <8EFE> <E3DD> <E3DD> <98DF> <E3DE> <E3DE> <98FE> <E3DF> <E3DF> <4F38> <E3E0> <E3E0> <4F81> <E3E1> <E3E1> <4FE1> <E3E2> <E3E2> <547B> <E3E3> <E3E3> <5A20> <E3E4> <E3E4> <5BB8> <E3E5> <E3E5> <613C> <E3E6> <E3E6> <65B0> <E3E7> <E3E7> <6668> <E3E8> <E3E8> <71FC> <E3E9> <E3E9> <7533> <E3EA> <E3EA> <795E> <E3EB> <E3EB> <7D33> <E3EC> <E3EC> <814E> <E3ED> <E3ED> <81E3> <E3EE> <E3EE> <8398> <E3EF> <E3EF> <85AA> <E3F0> <E3F0> <85CE> <E3F1> <E3F1> <8703> <E3F2> <E3F2> <8A0A> <E3F3> <E3F3> <8EAB> <E3F4> <E3F4> <8F9B> <E3F5> <E3F5> <F971> <E3F6> <E3F6> <8FC5> <E3F7> <E3F7> <5931> <E3F8> <E3F8> <5BA4> <E3F9> <E3F9> <5BE6> <E3FA> <E3FA> <6089> <E3FB> <E3FB> <5BE9> <E3FC> <E3FC> <5C0B> <E3FD> <E3FD> <5FC3> <E3FE> <E3FE> <6C81> <E4A1> <E4A1> <F972> <E4A2> <E4A2> <6DF1> <E4A3> <E4A3> <700B> <E4A4> <E4A4> <751A> <E4A5> <E4A5> <82AF> <E4A6> <E4A6> <8AF6> <E4A7> <E4A7> <4EC0> <E4A8> <E4A8> <5341> <E4A9> <E4A9> <F973> <E4AA> <E4AA> <96D9> <E4AB> <E4AB> <6C0F> <E4AC> <E4AC> <4E9E> <E4AD> <E4AD> <4FC4> <E4AE> <E4AE> <5152> <E4AF> <E4AF> <555E> <E4B0> <E4B0> <5A25> <E4B1> <E4B1> <5CE8> <E4B2> <E4B2> <6211> <E4B3> <E4B3> <7259> <E4B4> <E4B4> <82BD> endbfrange 100 beginbfrange <E4B5> <E4B5> <83AA> <E4B6> <E4B6> <86FE> <E4B7> <E4B7> <8859> <E4B8> <E4B8> <8A1D> <E4B9> <E4B9> <963F> <E4BA> <E4BA> <96C5> <E4BB> <E4BB> <9913> <E4BC> <E4BC> <9D09> <E4BD> <E4BD> <9D5D> <E4BE> <E4BE> <580A> <E4BF> <E4BF> <5CB3> <E4C0> <E4C0> <5DBD> <E4C1> <E4C1> <5E44> <E4C2> <E4C2> <60E1> <E4C3> <E4C3> <6115> <E4C4> <E4C4> <63E1> <E4C5> <E4C5> <6A02> <E4C6> <E4C6> <6E25> <E4C7> <E4C7> <9102> <E4C8> <E4C8> <9354> <E4C9> <E4C9> <984E> <E4CA> <E4CA> <9C10> <E4CB> <E4CB> <9F77> <E4CC> <E4CC> <5B89> <E4CD> <E4CD> <5CB8> <E4CE> <E4CE> <6309> <E4CF> <E4CF> <664F> <E4D0> <E4D0> <6848> <E4D1> <E4D1> <773C> <E4D2> <E4D2> <96C1> <E4D3> <E4D3> <978D> <E4D4> <E4D4> <9854> <E4D5> <E4D5> <9B9F> <E4D6> <E4D6> <65A1> <E4D7> <E4D7> <8B01> <E4D8> <E4D8> <8ECB> <E4D9> <E4D9> <95BC> <E4DA> <E4DA> <5535> <E4DB> <E4DB> <5CA9> <E4DC> <E4DC> <5DD6> <E4DD> <E4DD> <5EB5> <E4DE> <E4DE> <6697> <E4DF> <E4DF> <764C> <E4E0> <E4E0> <83F4> <E4E1> <E4E1> <95C7> <E4E2> <E4E2> <58D3> <E4E3> <E4E3> <62BC> <E4E4> <E4E4> <72CE> <E4E5> <E4E5> <9D28> <E4E6> <E4E6> <4EF0> <E4E7> <E4E7> <592E> <E4E8> <E4E8> <600F> <E4E9> <E4E9> <663B> <E4EA> <E4EA> <6B83> <E4EB> <E4EB> <79E7> <E4EC> <E4EC> <9D26> <E4ED> <E4ED> <5393> <E4EE> <E4EE> <54C0> <E4EF> <E4EF> <57C3> <E4F0> <E4F0> <5D16> <E4F1> <E4F1> <611B> <E4F2> <E4F2> <66D6> <E4F3> <E4F3> <6DAF> <E4F4> <E4F4> <788D> <E4F5> <E4F5> <827E> <E4F6> <E4F6> <9698> <E4F7> <E4F7> <9744> <E4F8> <E4F8> <5384> <E4F9> <E4F9> <627C> <E4FA> <E4FA> <6396> <E4FB> <E4FB> <6DB2> <E4FC> <E4FC> <7E0A> <E4FD> <E4FD> <814B> <E4FE> <E4FE> <984D> <E5A1> <E5A1> <6AFB> <E5A2> <E5A2> <7F4C> <E5A3> <E5A3> <9DAF> <E5A4> <E5A4> <9E1A> <E5A5> <E5A5> <4E5F> <E5A6> <E5A6> <503B> <E5A7> <E5A7> <51B6> <E5A8> <E5A8> <591C> <E5A9> <E5A9> <60F9> <E5AA> <E5AA> <63F6> <E5AB> <E5AB> <6930> <E5AC> <E5AC> <723A> <E5AD> <E5AD> <8036> <E5AE> <E5AE> <F974> <E5AF> <E5AF> <91CE> <E5B0> <E5B0> <5F31> <E5B1> <E5B2> <F975> <E5B3> <E5B3> <7D04> <E5B4> <E5B4> <82E5> <E5B5> <E5B5> <846F> <E5B6> <E5B6> <84BB> <E5B7> <E5B7> <85E5> <E5B8> <E5B8> <8E8D> <E5B9> <E5B9> <F977> <E5BA> <E5BA> <4F6F> <E5BB> <E5BC> <F978> endbfrange 100 beginbfrange <E5BD> <E5BD> <58E4> <E5BE> <E5BE> <5B43> <E5BF> <E5BF> <6059> <E5C0> <E5C0> <63DA> <E5C1> <E5C1> <6518> <E5C2> <E5C2> <656D> <E5C3> <E5C3> <6698> <E5C4> <E5C4> <F97A> <E5C5> <E5C5> <694A> <E5C6> <E5C6> <6A23> <E5C7> <E5C7> <6D0B> <E5C8> <E5C8> <7001> <E5C9> <E5C9> <716C> <E5CA> <E5CA> <75D2> <E5CB> <E5CB> <760D> <E5CC> <E5CC> <79B3> <E5CD> <E5CD> <7A70> <E5CE> <E5CE> <F97B> <E5CF> <E5CF> <7F8A> <E5D0> <E5D0> <F97C> <E5D1> <E5D1> <8944> <E5D2> <E5D2> <F97D> <E5D3> <E5D3> <8B93> <E5D4> <E5D4> <91C0> <E5D5> <E5D5> <967D> <E5D6> <E5D6> <F97E> <E5D7> <E5D7> <990A> <E5D8> <E5D8> <5704> <E5D9> <E5D9> <5FA1> <E5DA> <E5DA> <65BC> <E5DB> <E5DB> <6F01> <E5DC> <E5DC> <7600> <E5DD> <E5DD> <79A6> <E5DE> <E5DE> <8A9E> <E5DF> <E5DF> <99AD> <E5E0> <E5E0> <9B5A> <E5E1> <E5E1> <9F6C> <E5E2> <E5E2> <5104> <E5E3> <E5E3> <61B6> <E5E4> <E5E4> <6291> <E5E5> <E5E5> <6A8D> <E5E6> <E5E6> <81C6> <E5E7> <E5E7> <5043> <E5E8> <E5E8> <5830> <E5E9> <E5E9> <5F66> <E5EA> <E5EA> <7109> <E5EB> <E5EB> <8A00> <E5EC> <E5EC> <8AFA> <E5ED> <E5ED> <5B7C> <E5EE> <E5EE> <8616> <E5EF> <E5EF> <4FFA> <E5F0> <E5F0> <513C> <E5F1> <E5F1> <56B4> <E5F2> <E5F2> <5944> <E5F3> <E5F3> <63A9> <E5F4> <E5F4> <6DF9> <E5F5> <E5F5> <5DAA> <E5F6> <E5F6> <696D> <E5F7> <E5F7> <5186> <E5F8> <E5F8> <4E88> <E5F9> <E5F9> <4F59> <E5FA> <E5FC> <F97F> <E5FD> <E5FD> <5982> <E5FE> <E5FE> <F982> <E6A1> <E6A1> <F983> <E6A2> <E6A2> <6B5F> <E6A3> <E6A3> <6C5D> <E6A4> <E6A4> <F984> <E6A5> <E6A5> <74B5> <E6A6> <E6A6> <7916> <E6A7> <E6A7> <F985> <E6A8> <E6A8> <8207> <E6A9> <E6A9> <8245> <E6AA> <E6AA> <8339> <E6AB> <E6AB> <8F3F> <E6AC> <E6AC> <8F5D> <E6AD> <E6AD> <F986> <E6AE> <E6AE> <9918> <E6AF> <E6B1> <F987> <E6B2> <E6B2> <4EA6> <E6B3> <E6B3> <F98A> <E6B4> <E6B4> <57DF> <E6B5> <E6B5> <5F79> <E6B6> <E6B6> <6613> <E6B7> <E6B8> <F98B> <E6B9> <E6B9> <75AB> <E6BA> <E6BA> <7E79> <E6BB> <E6BB> <8B6F> <E6BC> <E6BC> <F98D> <E6BD> <E6BD> <9006> <E6BE> <E6BE> <9A5B> <E6BF> <E6BF> <56A5> <E6C0> <E6C0> <5827> <E6C1> <E6C1> <59F8> <E6C2> <E6C2> <5A1F> <E6C3> <E6C3> <5BB4> <E6C4> <E6C4> <F98E> <E6C5> <E6C5> <5EF6> <E6C6> <E6C7> <F98F> <E6C8> <E6C8> <6350> endbfrange 100 beginbfrange <E6C9> <E6C9> <633B> <E6CA> <E6CA> <F991> <E6CB> <E6CB> <693D> <E6CC> <E6CC> <6C87> <E6CD> <E6CD> <6CBF> <E6CE> <E6CE> <6D8E> <E6CF> <E6CF> <6D93> <E6D0> <E6D0> <6DF5> <E6D1> <E6D1> <6F14> <E6D2> <E6D2> <F992> <E6D3> <E6D3> <70DF> <E6D4> <E6D4> <7136> <E6D5> <E6D5> <7159> <E6D6> <E6D6> <F993> <E6D7> <E6D7> <71C3> <E6D8> <E6D8> <71D5> <E6D9> <E6D9> <F994> <E6DA> <E6DA> <784F> <E6DB> <E6DB> <786F> <E6DC> <E6DC> <F995> <E6DD> <E6DD> <7B75> <E6DE> <E6DE> <7DE3> <E6DF> <E6DF> <F996> <E6E0> <E6E0> <7E2F> <E6E1> <E6E1> <F997> <E6E2> <E6E2> <884D> <E6E3> <E6E3> <8EDF> <E6E4> <E6E6> <F998> <E6E7> <E6E7> <925B> <E6E8> <E6E8> <F99B> <E6E9> <E6E9> <9CF6> <E6EA> <E6EC> <F99C> <E6ED> <E6ED> <6085> <E6EE> <E6EE> <6D85> <E6EF> <E6EF> <F99F> <E6F0> <E6F0> <71B1> <E6F1> <E6F2> <F9A0> <E6F3> <E6F3> <95B1> <E6F4> <E6F4> <53AD> <E6F5> <E6F7> <F9A2> <E6F8> <E6F8> <67D3> <E6F9> <E6F9> <F9A5> <E6FA> <E6FA> <708E> <E6FB> <E6FB> <7130> <E6FC> <E6FC> <7430> <E6FD> <E6FD> <8276> <E6FE> <E6FE> <82D2> <E7A1> <E7A1> <F9A6> <E7A2> <E7A2> <95BB> <E7A3> <E7A3> <9AE5> <E7A4> <E7A4> <9E7D> <E7A5> <E7A5> <66C4> <E7A6> <E7A6> <F9A7> <E7A7> <E7A7> <71C1> <E7A8> <E7A8> <8449> <E7A9> <E7AA> <F9A8> <E7AB> <E7AB> <584B> <E7AC> <E7AD> <F9AA> <E7AE> <E7AE> <5DB8> <E7AF> <E7AF> <5F71> <E7B0> <E7B0> <F9AC> <E7B1> <E7B1> <6620> <E7B2> <E7B2> <668E> <E7B3> <E7B3> <6979> <E7B4> <E7B4> <69AE> <E7B5> <E7B5> <6C38> <E7B6> <E7B6> <6CF3> <E7B7> <E7B7> <6E36> <E7B8> <E7B8> <6F41> <E7B9> <E7B9> <6FDA> <E7BA> <E7BA> <701B> <E7BB> <E7BB> <702F> <E7BC> <E7BC> <7150> <E7BD> <E7BD> <71DF> <E7BE> <E7BE> <7370> <E7BF> <E7BF> <F9AD> <E7C0> <E7C0> <745B> <E7C1> <E7C1> <F9AE> <E7C2> <E7C2> <74D4> <E7C3> <E7C3> <76C8> <E7C4> <E7C4> <7A4E> <E7C5> <E7C5> <7E93> <E7C6> <E7C7> <F9AF> <E7C8> <E7C8> <82F1> <E7C9> <E7C9> <8A60> <E7CA> <E7CA> <8FCE> <E7CB> <E7CB> <F9B1> <E7CC> <E7CC> <9348> <E7CD> <E7CD> <F9B2> <E7CE> <E7CE> <9719> <E7CF> <E7D0> <F9B3> <E7D1> <E7D1> <4E42> <E7D2> <E7D2> <502A> <E7D3> <E7D3> <F9B5> <E7D4> <E7D4> <5208> <E7D5> <E7D5> <53E1> <E7D6> <E7D6> <66F3> <E7D7> <E7D7> <6C6D> <E7D8> <E7D8> <6FCA> <E7D9> <E7D9> <730A> endbfrange 100 beginbfrange <E7DA> <E7DA> <777F> <E7DB> <E7DB> <7A62> <E7DC> <E7DC> <82AE> <E7DD> <E7DD> <85DD> <E7DE> <E7DE> <8602> <E7DF> <E7DF> <F9B6> <E7E0> <E7E0> <88D4> <E7E1> <E7E1> <8A63> <E7E2> <E7E2> <8B7D> <E7E3> <E7E3> <8C6B> <E7E4> <E7E4> <F9B7> <E7E5> <E7E5> <92B3> <E7E6> <E7E6> <F9B8> <E7E7> <E7E7> <9713> <E7E8> <E7E8> <9810> <E7E9> <E7E9> <4E94> <E7EA> <E7EA> <4F0D> <E7EB> <E7EB> <4FC9> <E7EC> <E7EC> <50B2> <E7ED> <E7ED> <5348> <E7EE> <E7EE> <543E> <E7EF> <E7EF> <5433> <E7F0> <E7F0> <55DA> <E7F1> <E7F1> <5862> <E7F2> <E7F2> <58BA> <E7F3> <E7F3> <5967> <E7F4> <E7F4> <5A1B> <E7F5> <E7F5> <5BE4> <E7F6> <E7F6> <609F> <E7F7> <E7F7> <F9B9> <E7F8> <E7F8> <61CA> <E7F9> <E7F9> <6556> <E7FA> <E7FA> <65FF> <E7FB> <E7FB> <6664> <E7FC> <E7FC> <68A7> <E7FD> <E7FD> <6C5A> <E7FE> <E7FE> <6FB3> <E8A1> <E8A1> <70CF> <E8A2> <E8A2> <71AC> <E8A3> <E8A3> <7352> <E8A4> <E8A4> <7B7D> <E8A5> <E8A5> <8708> <E8A6> <E8A6> <8AA4> <E8A7> <E8A7> <9C32> <E8A8> <E8A8> <9F07> <E8A9> <E8A9> <5C4B> <E8AA> <E8AA> <6C83> <E8AB> <E8AB> <7344> <E8AC> <E8AC> <7389> <E8AD> <E8AD> <923A> <E8AE> <E8AE> <6EAB> <E8AF> <E8AF> <7465> <E8B0> <E8B0> <761F> <E8B1> <E8B1> <7A69> <E8B2> <E8B2> <7E15> <E8B3> <E8B3> <860A> <E8B4> <E8B4> <5140> <E8B5> <E8B5> <58C5> <E8B6> <E8B6> <64C1> <E8B7> <E8B7> <74EE> <E8B8> <E8B8> <7515> <E8B9> <E8B9> <7670> <E8BA> <E8BA> <7FC1> <E8BB> <E8BB> <9095> <E8BC> <E8BC> <96CD> <E8BD> <E8BD> <9954> <E8BE> <E8BE> <6E26> <E8BF> <E8BF> <74E6> <E8C0> <E8C1> <7AA9> <E8C2> <E8C2> <81E5> <E8C3> <E8C3> <86D9> <E8C4> <E8C4> <8778> <E8C5> <E8C5> <8A1B> <E8C6> <E8C6> <5A49> <E8C7> <E8C7> <5B8C> <E8C8> <E8C8> <5B9B> <E8C9> <E8C9> <68A1> <E8CA> <E8CA> <6900> <E8CB> <E8CB> <6D63> <E8CC> <E8CC> <73A9> <E8CD> <E8CD> <7413> <E8CE> <E8CE> <742C> <E8CF> <E8CF> <7897> <E8D0> <E8D0> <7DE9> <E8D1> <E8D1> <7FEB> <E8D2> <E8D2> <8118> <E8D3> <E8D3> <8155> <E8D4> <E8D4> <839E> <E8D5> <E8D5> <8C4C> <E8D6> <E8D6> <962E> <E8D7> <E8D7> <9811> <E8D8> <E8D8> <66F0> <E8D9> <E8D9> <5F80> <E8DA> <E8DA> <65FA> <E8DB> <E8DB> <6789> <E8DC> <E8DC> <6C6A> <E8DD> <E8DD> <738B> <E8DE> <E8DE> <502D> <E8DF> <E8DF> <5A03> <E8E0> <E8E0> <6B6A> endbfrange 100 beginbfrange <E8E1> <E8E1> <77EE> <E8E2> <E8E2> <5916> <E8E3> <E8E3> <5D6C> <E8E4> <E8E4> <5DCD> <E8E5> <E8E5> <7325> <E8E6> <E8E6> <754F> <E8E7> <E8E8> <F9BA> <E8E9> <E8E9> <50E5> <E8EA> <E8EA> <51F9> <E8EB> <E8EB> <582F> <E8EC> <E8EC> <592D> <E8ED> <E8ED> <5996> <E8EE> <E8EE> <59DA> <E8EF> <E8EF> <5BE5> <E8F0> <E8F1> <F9BC> <E8F2> <E8F2> <5DA2> <E8F3> <E8F3> <62D7> <E8F4> <E8F4> <6416> <E8F5> <E8F5> <6493> <E8F6> <E8F6> <64FE> <E8F7> <E8F7> <F9BE> <E8F8> <E8F8> <66DC> <E8F9> <E8F9> <F9BF> <E8FA> <E8FA> <6A48> <E8FB> <E8FB> <F9C0> <E8FC> <E8FC> <71FF> <E8FD> <E8FD> <7464> <E8FE> <E8FE> <F9C1> <E9A1> <E9A1> <7A88> <E9A2> <E9A2> <7AAF> <E9A3> <E9A3> <7E47> <E9A4> <E9A4> <7E5E> <E9A5> <E9A5> <8000> <E9A6> <E9A6> <8170> <E9A7> <E9A7> <F9C2> <E9A8> <E9A8> <87EF> <E9A9> <E9A9> <8981> <E9AA> <E9AA> <8B20> <E9AB> <E9AB> <9059> <E9AC> <E9AC> <F9C3> <E9AD> <E9AD> <9080> <E9AE> <E9AE> <9952> <E9AF> <E9AF> <617E> <E9B0> <E9B0> <6B32> <E9B1> <E9B1> <6D74> <E9B2> <E9B2> <7E1F> <E9B3> <E9B3> <8925> <E9B4> <E9B4> <8FB1> <E9B5> <E9B5> <4FD1> <E9B6> <E9B6> <50AD> <E9B7> <E9B7> <5197> <E9B8> <E9B8> <52C7> <E9B9> <E9B9> <57C7> <E9BA> <E9BA> <5889> <E9BB> <E9BB> <5BB9> <E9BC> <E9BC> <5EB8> <E9BD> <E9BD> <6142> <E9BE> <E9BE> <6995> <E9BF> <E9BF> <6D8C> <E9C0> <E9C0> <6E67> <E9C1> <E9C1> <6EB6> <E9C2> <E9C2> <7194> <E9C3> <E9C3> <7462> <E9C4> <E9C4> <7528> <E9C5> <E9C5> <752C> <E9C6> <E9C6> <8073> <E9C7> <E9C7> <8338> <E9C8> <E9C8> <84C9> <E9C9> <E9C9> <8E0A> <E9CA> <E9CA> <9394> <E9CB> <E9CB> <93DE> <E9CC> <E9CC> <F9C4> <E9CD> <E9CD> <4E8E> <E9CE> <E9CE> <4F51> <E9CF> <E9CF> <5076> <E9D0> <E9D0> <512A> <E9D1> <E9D1> <53C8> <E9D2> <E9D2> <53CB> <E9D3> <E9D3> <53F3> <E9D4> <E9D4> <5B87> <E9D5> <E9D5> <5BD3> <E9D6> <E9D6> <5C24> <E9D7> <E9D7> <611A> <E9D8> <E9D8> <6182> <E9D9> <E9D9> <65F4> <E9DA> <E9DA> <725B> <E9DB> <E9DB> <7397> <E9DC> <E9DC> <7440> <E9DD> <E9DD> <76C2> <E9DE> <E9DE> <7950> <E9DF> <E9DF> <7991> <E9E0> <E9E0> <79B9> <E9E1> <E9E1> <7D06> <E9E2> <E9E2> <7FBD> <E9E3> <E9E3> <828B> <E9E4> <E9E4> <85D5> <E9E5> <E9E5> <865E> <E9E6> <E9E6> <8FC2> <E9E7> <E9E7> <9047> <E9E8> <E9E8> <90F5> endbfrange 100 beginbfrange <E9E9> <E9E9> <91EA> <E9EA> <E9EA> <9685> <E9EB> <E9EC> <96E8> <E9ED> <E9ED> <52D6> <E9EE> <E9EE> <5F67> <E9EF> <E9EF> <65ED> <E9F0> <E9F0> <6631> <E9F1> <E9F1> <682F> <E9F2> <E9F2> <715C> <E9F3> <E9F3> <7A36> <E9F4> <E9F4> <90C1> <E9F5> <E9F5> <980A> <E9F6> <E9F6> <4E91> <E9F7> <E9F7> <F9C5> <E9F8> <E9F8> <6A52> <E9F9> <E9F9> <6B9E> <E9FA> <E9FA> <6F90> <E9FB> <E9FB> <7189> <E9FC> <E9FC> <8018> <E9FD> <E9FD> <82B8> <E9FE> <E9FE> <8553> <EAA1> <EAA1> <904B> <EAA2> <EAA2> <9695> <EAA3> <EAA3> <96F2> <EAA4> <EAA4> <97FB> <EAA5> <EAA5> <851A> <EAA6> <EAA6> <9B31> <EAA7> <EAA7> <4E90> <EAA8> <EAA8> <718A> <EAA9> <EAA9> <96C4> <EAAA> <EAAA> <5143> <EAAB> <EAAB> <539F> <EAAC> <EAAC> <54E1> <EAAD> <EAAD> <5713> <EAAE> <EAAE> <5712> <EAAF> <EAAF> <57A3> <EAB0> <EAB0> <5A9B> <EAB1> <EAB1> <5AC4> <EAB2> <EAB2> <5BC3> <EAB3> <EAB3> <6028> <EAB4> <EAB4> <613F> <EAB5> <EAB5> <63F4> <EAB6> <EAB6> <6C85> <EAB7> <EAB7> <6D39> <EAB8> <EAB8> <6E72> <EAB9> <EAB9> <6E90> <EABA> <EABA> <7230> <EABB> <EABB> <733F> <EABC> <EABC> <7457> <EABD> <EABD> <82D1> <EABE> <EABE> <8881> <EABF> <EABF> <8F45> <EAC0> <EAC0> <9060> <EAC1> <EAC1> <F9C6> <EAC2> <EAC2> <9662> <EAC3> <EAC3> <9858> <EAC4> <EAC4> <9D1B> <EAC5> <EAC5> <6708> <EAC6> <EAC6> <8D8A> <EAC7> <EAC7> <925E> <EAC8> <EAC8> <4F4D> <EAC9> <EAC9> <5049> <EACA> <EACA> <50DE> <EACB> <EACB> <5371> <EACC> <EACC> <570D> <EACD> <EACD> <59D4> <EACE> <EACE> <5A01> <EACF> <EACF> <5C09> <EAD0> <EAD0> <6170> <EAD1> <EAD1> <6690> <EAD2> <EAD2> <6E2D> <EAD3> <EAD3> <7232> <EAD4> <EAD4> <744B> <EAD5> <EAD5> <7DEF> <EAD6> <EAD6> <80C3> <EAD7> <EAD7> <840E> <EAD8> <EAD8> <8466> <EAD9> <EAD9> <853F> <EADA> <EADA> <875F> <EADB> <EADB> <885B> <EADC> <EADC> <8918> <EADD> <EADD> <8B02> <EADE> <EADE> <9055> <EADF> <EADF> <97CB> <EAE0> <EAE0> <9B4F> <EAE1> <EAE1> <4E73> <EAE2> <EAE2> <4F91> <EAE3> <EAE3> <5112> <EAE4> <EAE4> <516A> <EAE5> <EAE5> <F9C7> <EAE6> <EAE6> <552F> <EAE7> <EAE7> <55A9> <EAE8> <EAE8> <5B7A> <EAE9> <EAE9> <5BA5> <EAEA> <EAEB> <5E7C> <EAEC> <EAEC> <5EBE> <EAED> <EAED> <60A0> <EAEE> <EAEE> <60DF> <EAEF> <EAF0> <6108> <EAF1> <EAF1> <63C4> endbfrange 100 beginbfrange <EAF2> <EAF2> <6538> <EAF3> <EAF3> <6709> <EAF4> <EAF4> <F9C8> <EAF5> <EAF5> <67D4> <EAF6> <EAF6> <67DA> <EAF7> <EAF7> <F9C9> <EAF8> <EAF9> <6961> <EAFA> <EAFA> <6CB9> <EAFB> <EAFB> <6D27> <EAFC> <EAFC> <F9CA> <EAFD> <EAFD> <6E38> <EAFE> <EAFE> <F9CB> <EBA1> <EBA1> <6FE1> <EBA2> <EBA3> <7336> <EBA4> <EBA4> <F9CC> <EBA5> <EBA5> <745C> <EBA6> <EBA6> <7531> <EBA7> <EBA7> <F9CD> <EBA8> <EBA8> <7652> <EBA9> <EBAA> <F9CE> <EBAB> <EBAB> <7DAD> <EBAC> <EBAC> <81FE> <EBAD> <EBAD> <8438> <EBAE> <EBAE> <88D5> <EBAF> <EBAF> <8A98> <EBB0> <EBB0> <8ADB> <EBB1> <EBB1> <8AED> <EBB2> <EBB2> <8E30> <EBB3> <EBB3> <8E42> <EBB4> <EBB4> <904A> <EBB5> <EBB5> <903E> <EBB6> <EBB6> <907A> <EBB7> <EBB7> <9149> <EBB8> <EBB8> <91C9> <EBB9> <EBB9> <936E> <EBBA> <EBBB> <F9D0> <EBBC> <EBBC> <5809> <EBBD> <EBBD> <F9D2> <EBBE> <EBBE> <6BD3> <EBBF> <EBBF> <8089> <EBC0> <EBC0> <80B2> <EBC1> <EBC2> <F9D3> <EBC3> <EBC3> <5141> <EBC4> <EBC4> <596B> <EBC5> <EBC5> <5C39> <EBC6> <EBC7> <F9D5> <EBC8> <EBC8> <6F64> <EBC9> <EBC9> <73A7> <EBCA> <EBCA> <80E4> <EBCB> <EBCB> <8D07> <EBCC> <EBCC> <F9D7> <EBCD> <EBCD> <9217> <EBCE> <EBCE> <958F> <EBCF> <EBD2> <F9D8> <EBD3> <EBD3> <807F> <EBD4> <EBD4> <620E> <EBD5> <EBD5> <701C> <EBD6> <EBD6> <7D68> <EBD7> <EBD7> <878D> <EBD8> <EBD8> <F9DC> <EBD9> <EBD9> <57A0> <EBDA> <EBDA> <6069> <EBDB> <EBDB> <6147> <EBDC> <EBDC> <6BB7> <EBDD> <EBDD> <8ABE> <EBDE> <EBDE> <9280> <EBDF> <EBDF> <96B1> <EBE0> <EBE0> <4E59> <EBE1> <EBE1> <541F> <EBE2> <EBE2> <6DEB> <EBE3> <EBE3> <852D> <EBE4> <EBE4> <9670> <EBE5> <EBE5> <97F3> <EBE6> <EBE6> <98EE> <EBE7> <EBE7> <63D6> <EBE8> <EBE8> <6CE3> <EBE9> <EBE9> <9091> <EBEA> <EBEA> <51DD> <EBEB> <EBEB> <61C9> <EBEC> <EBEC> <81BA> <EBED> <EBED> <9DF9> <EBEE> <EBEE> <4F9D> <EBEF> <EBEF> <501A> <EBF0> <EBF0> <5100> <EBF1> <EBF1> <5B9C> <EBF2> <EBF2> <610F> <EBF3> <EBF3> <61FF> <EBF4> <EBF4> <64EC> <EBF5> <EBF5> <6905> <EBF6> <EBF6> <6BC5> <EBF7> <EBF7> <7591> <EBF8> <EBF8> <77E3> <EBF9> <EBF9> <7FA9> <EBFA> <EBFA> <8264> <EBFB> <EBFB> <858F> <EBFC> <EBFC> <87FB> <EBFD> <EBFD> <8863> <EBFE> <EBFE> <8ABC> <ECA1> <ECA1> <8B70> <ECA2> <ECA2> <91AB> endbfrange 100 beginbfrange <ECA3> <ECA3> <4E8C> <ECA4> <ECA4> <4EE5> <ECA5> <ECA5> <4F0A> <ECA6> <ECA7> <F9DD> <ECA8> <ECA8> <5937> <ECA9> <ECA9> <59E8> <ECAA> <ECAA> <F9DF> <ECAB> <ECAB> <5DF2> <ECAC> <ECAC> <5F1B> <ECAD> <ECAD> <5F5B> <ECAE> <ECAE> <6021> <ECAF> <ECB2> <F9E0> <ECB3> <ECB3> <723E> <ECB4> <ECB4> <73E5> <ECB5> <ECB5> <F9E4> <ECB6> <ECB6> <7570> <ECB7> <ECB7> <75CD> <ECB8> <ECB8> <F9E5> <ECB9> <ECB9> <79FB> <ECBA> <ECBA> <F9E6> <ECBB> <ECBB> <800C> <ECBC> <ECBC> <8033> <ECBD> <ECBD> <8084> <ECBE> <ECBE> <82E1> <ECBF> <ECBF> <8351> <ECC0> <ECC1> <F9E7> <ECC2> <ECC2> <8CBD> <ECC3> <ECC3> <8CB3> <ECC4> <ECC4> <9087> <ECC5> <ECC6> <F9E9> <ECC7> <ECC7> <98F4> <ECC8> <ECC8> <990C> <ECC9> <ECCA> <F9EB> <ECCB> <ECCB> <7037> <ECCC> <ECCC> <76CA> <ECCD> <ECCD> <7FCA> <ECCE> <ECCE> <7FCC> <ECCF> <ECCF> <7FFC> <ECD0> <ECD0> <8B1A> <ECD1> <ECD1> <4EBA> <ECD2> <ECD2> <4EC1> <ECD3> <ECD3> <5203> <ECD4> <ECD4> <5370> <ECD5> <ECD5> <F9ED> <ECD6> <ECD6> <54BD> <ECD7> <ECD7> <56E0> <ECD8> <ECD8> <59FB> <ECD9> <ECD9> <5BC5> <ECDA> <ECDA> <5F15> <ECDB> <ECDB> <5FCD> <ECDC> <ECDC> <6E6E> <ECDD> <ECDE> <F9EE> <ECDF> <ECDF> <7D6A> <ECE0> <ECE0> <8335> <ECE1> <ECE1> <F9F0> <ECE2> <ECE2> <8693> <ECE3> <ECE3> <8A8D> <ECE4> <ECE4> <F9F1> <ECE5> <ECE5> <976D> <ECE6> <ECE6> <9777> <ECE7> <ECE8> <F9F2> <ECE9> <ECE9> <4E00> <ECEA> <ECEA> <4F5A> <ECEB> <ECEB> <4F7E> <ECEC> <ECEC> <58F9> <ECED> <ECED> <65E5> <ECEE> <ECEE> <6EA2> <ECEF> <ECEF> <9038> <ECF0> <ECF0> <93B0> <ECF1> <ECF1> <99B9> <ECF2> <ECF2> <4EFB> <ECF3> <ECF3> <58EC> <ECF4> <ECF4> <598A> <ECF5> <ECF5> <59D9> <ECF6> <ECF6> <6041> <ECF7> <ECF8> <F9F4> <ECF9> <ECF9> <7A14> <ECFA> <ECFA> <F9F6> <ECFB> <ECFB> <834F> <ECFC> <ECFC> <8CC3> <ECFD> <ECFD> <5165> <ECFE> <ECFE> <5344> <EDA1> <EDA3> <F9F7> <EDA4> <EDA4> <4ECD> <EDA5> <EDA5> <5269> <EDA6> <EDA6> <5B55> <EDA7> <EDA7> <82BF> <EDA8> <EDA8> <4ED4> <EDA9> <EDA9> <523A> <EDAA> <EDAA> <54A8> <EDAB> <EDAB> <59C9> <EDAC> <EDAC> <59FF> <EDAD> <EDAD> <5B50> <EDAE> <EDAE> <5B57> <EDAF> <EDAF> <5B5C> <EDB0> <EDB0> <6063> <EDB1> <EDB1> <6148> <EDB2> <EDB2> <6ECB> <EDB3> <EDB3> <7099> <EDB4> <EDB4> <716E> endbfrange 100 beginbfrange <EDB5> <EDB5> <7386> <EDB6> <EDB6> <74F7> <EDB7> <EDB7> <75B5> <EDB8> <EDB8> <78C1> <EDB9> <EDB9> <7D2B> <EDBA> <EDBA> <8005> <EDBB> <EDBB> <81EA> <EDBC> <EDBC> <8328> <EDBD> <EDBD> <8517> <EDBE> <EDBE> <85C9> <EDBF> <EDBF> <8AEE> <EDC0> <EDC0> <8CC7> <EDC1> <EDC1> <96CC> <EDC2> <EDC2> <4F5C> <EDC3> <EDC3> <52FA> <EDC4> <EDC4> <56BC> <EDC5> <EDC5> <65AB> <EDC6> <EDC6> <6628> <EDC7> <EDC7> <707C> <EDC8> <EDC8> <70B8> <EDC9> <EDC9> <7235> <EDCA> <EDCA> <7DBD> <EDCB> <EDCB> <828D> <EDCC> <EDCC> <914C> <EDCD> <EDCD> <96C0> <EDCE> <EDCE> <9D72> <EDCF> <EDCF> <5B71> <EDD0> <EDD0> <68E7> <EDD1> <EDD1> <6B98> <EDD2> <EDD2> <6F7A> <EDD3> <EDD3> <76DE> <EDD4> <EDD4> <5C91> <EDD5> <EDD5> <66AB> <EDD6> <EDD6> <6F5B> <EDD7> <EDD7> <7BB4> <EDD8> <EDD8> <7C2A> <EDD9> <EDD9> <8836> <EDDA> <EDDA> <96DC> <EDDB> <EDDB> <4E08> <EDDC> <EDDC> <4ED7> <EDDD> <EDDD> <5320> <EDDE> <EDDE> <5834> <EDDF> <EDDF> <58BB> <EDE0> <EDE0> <58EF> <EDE1> <EDE1> <596C> <EDE2> <EDE2> <5C07> <EDE3> <EDE3> <5E33> <EDE4> <EDE4> <5E84> <EDE5> <EDE5> <5F35> <EDE6> <EDE6> <638C> <EDE7> <EDE7> <66B2> <EDE8> <EDE8> <6756> <EDE9> <EDE9> <6A1F> <EDEA> <EDEA> <6AA3> <EDEB> <EDEB> <6B0C> <EDEC> <EDEC> <6F3F> <EDED> <EDED> <7246> <EDEE> <EDEE> <F9FA> <EDEF> <EDEF> <7350> <EDF0> <EDF0> <748B> <EDF1> <EDF1> <7AE0> <EDF2> <EDF2> <7CA7> <EDF3> <EDF3> <8178> <EDF4> <EDF4> <81DF> <EDF5> <EDF5> <81E7> <EDF6> <EDF6> <838A> <EDF7> <EDF7> <846C> <EDF8> <EDF8> <8523> <EDF9> <EDF9> <8594> <EDFA> <EDFA> <85CF> <EDFB> <EDFB> <88DD> <EDFC> <EDFC> <8D13> <EDFD> <EDFD> <91AC> <EDFE> <EDFE> <9577> <EEA1> <EEA1> <969C> <EEA2> <EEA2> <518D> <EEA3> <EEA3> <54C9> <EEA4> <EEA4> <5728> <EEA5> <EEA5> <5BB0> <EEA6> <EEA6> <624D> <EEA7> <EEA7> <6750> <EEA8> <EEA8> <683D> <EEA9> <EEA9> <6893> <EEAA> <EEAA> <6E3D> <EEAB> <EEAB> <6ED3> <EEAC> <EEAC> <707D> <EEAD> <EEAD> <7E21> <EEAE> <EEAE> <88C1> <EEAF> <EEAF> <8CA1> <EEB0> <EEB0> <8F09> <EEB1> <EEB1> <9F4B> <EEB2> <EEB2> <9F4E> <EEB3> <EEB3> <722D> <EEB4> <EEB4> <7B8F> <EEB5> <EEB5> <8ACD> <EEB6> <EEB6> <931A> <EEB7> <EEB7> <4F47> <EEB8> <EEB8> <4F4E> <EEB9> <EEB9> <5132> <EEBA> <EEBA> <5480> endbfrange 100 beginbfrange <EEBB> <EEBB> <59D0> <EEBC> <EEBC> <5E95> <EEBD> <EEBD> <62B5> <EEBE> <EEBE> <6775> <EEBF> <EEBF> <696E> <EEC0> <EEC0> <6A17> <EEC1> <EEC1> <6CAE> <EEC2> <EEC2> <6E1A> <EEC3> <EEC3> <72D9> <EEC4> <EEC4> <732A> <EEC5> <EEC5> <75BD> <EEC6> <EEC6> <7BB8> <EEC7> <EEC7> <7D35> <EEC8> <EEC8> <82E7> <EEC9> <EEC9> <83F9> <EECA> <EECA> <8457> <EECB> <EECB> <85F7> <EECC> <EECC> <8A5B> <EECD> <EECD> <8CAF> <EECE> <EECE> <8E87> <EECF> <EECF> <9019> <EED0> <EED0> <90B8> <EED1> <EED1> <96CE> <EED2> <EED2> <9F5F> <EED3> <EED3> <52E3> <EED4> <EED4> <540A> <EED5> <EED5> <5AE1> <EED6> <EED6> <5BC2> <EED7> <EED7> <6458> <EED8> <EED8> <6575> <EED9> <EED9> <6EF4> <EEDA> <EEDA> <72C4> <EEDB> <EEDB> <F9FB> <EEDC> <EEDC> <7684> <EEDD> <EEDD> <7A4D> <EEDE> <EEDE> <7B1B> <EEDF> <EEDF> <7C4D> <EEE0> <EEE0> <7E3E> <EEE1> <EEE1> <7FDF> <EEE2> <EEE2> <837B> <EEE3> <EEE3> <8B2B> <EEE4> <EEE4> <8CCA> <EEE5> <EEE5> <8D64> <EEE6> <EEE6> <8DE1> <EEE7> <EEE7> <8E5F> <EEE8> <EEE8> <8FEA> <EEE9> <EEE9> <8FF9> <EEEA> <EEEA> <9069> <EEEB> <EEEB> <93D1> <EEEC> <EEEC> <4F43> <EEED> <EEED> <4F7A> <EEEE> <EEEE> <50B3> <EEEF> <EEEF> <5168> <EEF0> <EEF0> <5178> <EEF1> <EEF1> <524D> <EEF2> <EEF2> <526A> <EEF3> <EEF3> <5861> <EEF4> <EEF4> <587C> <EEF5> <EEF5> <5960> <EEF6> <EEF6> <5C08> <EEF7> <EEF7> <5C55> <EEF8> <EEF8> <5EDB> <EEF9> <EEF9> <609B> <EEFA> <EEFA> <6230> <EEFB> <EEFB> <6813> <EEFC> <EEFC> <6BBF> <EEFD> <EEFD> <6C08> <EEFE> <EEFE> <6FB1> <EFA1> <EFA1> <714E> <EFA2> <EFA2> <7420> <EFA3> <EFA3> <7530> <EFA4> <EFA4> <7538> <EFA5> <EFA5> <7551> <EFA6> <EFA6> <7672> <EFA7> <EFA7> <7B4C> <EFA8> <EFA8> <7B8B> <EFA9> <EFA9> <7BAD> <EFAA> <EFAA> <7BC6> <EFAB> <EFAB> <7E8F> <EFAC> <EFAC> <8A6E> <EFAD> <EFAD> <8F3E> <EFAE> <EFAE> <8F49> <EFAF> <EFAF> <923F> <EFB0> <EFB0> <9293> <EFB1> <EFB1> <9322> <EFB2> <EFB2> <942B> <EFB3> <EFB3> <96FB> <EFB4> <EFB4> <985A> <EFB5> <EFB5> <986B> <EFB6> <EFB6> <991E> <EFB7> <EFB7> <5207> <EFB8> <EFB8> <622A> <EFB9> <EFB9> <6298> <EFBA> <EFBA> <6D59> <EFBB> <EFBB> <7664> <EFBC> <EFBC> <7ACA> <EFBD> <EFBD> <7BC0> <EFBE> <EFBE> <7D76> <EFBF> <EFBF> <5360> <EFC0> <EFC0> <5CBE> endbfrange 100 beginbfrange <EFC1> <EFC1> <5E97> <EFC2> <EFC2> <6F38> <EFC3> <EFC3> <70B9> <EFC4> <EFC4> <7C98> <EFC5> <EFC5> <9711> <EFC6> <EFC6> <9B8E> <EFC7> <EFC7> <9EDE> <EFC8> <EFC8> <63A5> <EFC9> <EFC9> <647A> <EFCA> <EFCA> <8776> <EFCB> <EFCB> <4E01> <EFCC> <EFCC> <4E95> <EFCD> <EFCD> <4EAD> <EFCE> <EFCE> <505C> <EFCF> <EFCF> <5075> <EFD0> <EFD0> <5448> <EFD1> <EFD1> <59C3> <EFD2> <EFD2> <5B9A> <EFD3> <EFD3> <5E40> <EFD4> <EFD4> <5EAD> <EFD5> <EFD5> <5EF7> <EFD6> <EFD6> <5F81> <EFD7> <EFD7> <60C5> <EFD8> <EFD8> <633A> <EFD9> <EFD9> <653F> <EFDA> <EFDA> <6574> <EFDB> <EFDB> <65CC> <EFDC> <EFDC> <6676> <EFDD> <EFDD> <6678> <EFDE> <EFDE> <67FE> <EFDF> <EFDF> <6968> <EFE0> <EFE0> <6A89> <EFE1> <EFE1> <6B63> <EFE2> <EFE2> <6C40> <EFE3> <EFE3> <6DC0> <EFE4> <EFE4> <6DE8> <EFE5> <EFE5> <6E1F> <EFE6> <EFE6> <6E5E> <EFE7> <EFE7> <701E> <EFE8> <EFE8> <70A1> <EFE9> <EFE9> <738E> <EFEA> <EFEA> <73FD> <EFEB> <EFEB> <753A> <EFEC> <EFEC> <775B> <EFED> <EFED> <7887> <EFEE> <EFEE> <798E> <EFEF> <EFEF> <7A0B> <EFF0> <EFF0> <7A7D> <EFF1> <EFF1> <7CBE> <EFF2> <EFF2> <7D8E> <EFF3> <EFF3> <8247> <EFF4> <EFF4> <8A02> <EFF5> <EFF5> <8AEA> <EFF6> <EFF6> <8C9E> <EFF7> <EFF7> <912D> <EFF8> <EFF8> <914A> <EFF9> <EFF9> <91D8> <EFFA> <EFFA> <9266> <EFFB> <EFFB> <92CC> <EFFC> <EFFC> <9320> <EFFD> <EFFD> <9706> <EFFE> <EFFE> <9756> <F0A1> <F0A1> <975C> <F0A2> <F0A2> <9802> <F0A3> <F0A3> <9F0E> <F0A4> <F0A4> <5236> <F0A5> <F0A5> <5291> <F0A6> <F0A6> <557C> <F0A7> <F0A7> <5824> <F0A8> <F0A8> <5E1D> <F0A9> <F0A9> <5F1F> <F0AA> <F0AA> <608C> <F0AB> <F0AB> <63D0> <F0AC> <F0AC> <68AF> <F0AD> <F0AD> <6FDF> <F0AE> <F0AE> <796D> <F0AF> <F0AF> <7B2C> <F0B0> <F0B0> <81CD> <F0B1> <F0B1> <85BA> <F0B2> <F0B2> <88FD> <F0B3> <F0B3> <8AF8> <F0B4> <F0B4> <8E44> <F0B5> <F0B5> <918D> <F0B6> <F0B6> <9664> <F0B7> <F0B7> <969B> <F0B8> <F0B8> <973D> <F0B9> <F0B9> <984C> <F0BA> <F0BA> <9F4A> <F0BB> <F0BB> <4FCE> <F0BC> <F0BC> <5146> <F0BD> <F0BD> <51CB> <F0BE> <F0BE> <52A9> <F0BF> <F0BF> <5632> <F0C0> <F0C0> <5F14> <F0C1> <F0C1> <5F6B> <F0C2> <F0C2> <63AA> <F0C3> <F0C3> <64CD> <F0C4> <F0C4> <65E9> <F0C5> <F0C5> <6641> <F0C6> <F0C6> <66FA> endbfrange 100 beginbfrange <F0C7> <F0C7> <66F9> <F0C8> <F0C8> <671D> <F0C9> <F0C9> <689D> <F0CA> <F0CA> <68D7> <F0CB> <F0CB> <69FD> <F0CC> <F0CC> <6F15> <F0CD> <F0CD> <6F6E> <F0CE> <F0CE> <7167> <F0CF> <F0CF> <71E5> <F0D0> <F0D0> <722A> <F0D1> <F0D1> <74AA> <F0D2> <F0D2> <773A> <F0D3> <F0D3> <7956> <F0D4> <F0D4> <795A> <F0D5> <F0D5> <79DF> <F0D6> <F0D6> <7A20> <F0D7> <F0D7> <7A95> <F0D8> <F0D8> <7C97> <F0D9> <F0D9> <7CDF> <F0DA> <F0DA> <7D44> <F0DB> <F0DB> <7E70> <F0DC> <F0DC> <8087> <F0DD> <F0DD> <85FB> <F0DE> <F0DE> <86A4> <F0DF> <F0DF> <8A54> <F0E0> <F0E0> <8ABF> <F0E1> <F0E1> <8D99> <F0E2> <F0E2> <8E81> <F0E3> <F0E3> <9020> <F0E4> <F0E4> <906D> <F0E5> <F0E5> <91E3> <F0E6> <F0E6> <963B> <F0E7> <F0E7> <96D5> <F0E8> <F0E8> <9CE5> <F0E9> <F0E9> <65CF> <F0EA> <F0EA> <7C07> <F0EB> <F0EB> <8DB3> <F0EC> <F0EC> <93C3> <F0ED> <F0ED> <5B58> <F0EE> <F0EE> <5C0A> <F0EF> <F0EF> <5352> <F0F0> <F0F0> <62D9> <F0F1> <F0F1> <731D> <F0F2> <F0F2> <5027> <F0F3> <F0F3> <5B97> <F0F4> <F0F4> <5F9E> <F0F5> <F0F5> <60B0> <F0F6> <F0F6> <616B> <F0F7> <F0F7> <68D5> <F0F8> <F0F8> <6DD9> <F0F9> <F0F9> <742E> <F0FA> <F0FA> <7A2E> <F0FB> <F0FB> <7D42> <F0FC> <F0FC> <7D9C> <F0FD> <F0FD> <7E31> <F0FE> <F0FE> <816B> <F1A1> <F1A1> <8E2A> <F1A2> <F1A2> <8E35> <F1A3> <F1A3> <937E> <F1A4> <F1A4> <9418> <F1A5> <F1A5> <4F50> <F1A6> <F1A6> <5750> <F1A7> <F1A7> <5DE6> <F1A8> <F1A8> <5EA7> <F1A9> <F1A9> <632B> <F1AA> <F1AA> <7F6A> <F1AB> <F1AB> <4E3B> <F1AC> <F1AC> <4F4F> <F1AD> <F1AD> <4F8F> <F1AE> <F1AE> <505A> <F1AF> <F1AF> <59DD> <F1B0> <F1B0> <80C4> <F1B1> <F1B1> <546A> <F1B2> <F1B2> <5468> <F1B3> <F1B3> <55FE> <F1B4> <F1B4> <594F> <F1B5> <F1B5> <5B99> <F1B6> <F1B6> <5DDE> <F1B7> <F1B7> <5EDA> <F1B8> <F1B8> <665D> <F1B9> <F1B9> <6731> <F1BA> <F1BA> <67F1> <F1BB> <F1BB> <682A> <F1BC> <F1BC> <6CE8> <F1BD> <F1BD> <6D32> <F1BE> <F1BE> <6E4A> <F1BF> <F1BF> <6F8D> <F1C0> <F1C0> <70B7> <F1C1> <F1C1> <73E0> <F1C2> <F1C2> <7587> <F1C3> <F1C3> <7C4C> <F1C4> <F1C4> <7D02> <F1C5> <F1C5> <7D2C> <F1C6> <F1C6> <7DA2> <F1C7> <F1C7> <821F> <F1C8> <F1C8> <86DB> <F1C9> <F1C9> <8A3B> <F1CA> <F1CA> <8A85> <F1CB> <F1CB> <8D70> <F1CC> <F1CC> <8E8A> endbfrange 100 beginbfrange <F1CD> <F1CD> <8F33> <F1CE> <F1CE> <9031> <F1CF> <F1CF> <914E> <F1D0> <F1D0> <9152> <F1D1> <F1D1> <9444> <F1D2> <F1D2> <99D0> <F1D3> <F1D3> <7AF9> <F1D4> <F1D4> <7CA5> <F1D5> <F1D5> <4FCA> <F1D6> <F1D6> <5101> <F1D7> <F1D7> <51C6> <F1D8> <F1D8> <57C8> <F1D9> <F1D9> <5BEF> <F1DA> <F1DA> <5CFB> <F1DB> <F1DB> <6659> <F1DC> <F1DC> <6A3D> <F1DD> <F1DD> <6D5A> <F1DE> <F1DE> <6E96> <F1DF> <F1DF> <6FEC> <F1E0> <F1E0> <710C> <F1E1> <F1E1> <756F> <F1E2> <F1E2> <7AE3> <F1E3> <F1E3> <8822> <F1E4> <F1E4> <9021> <F1E5> <F1E5> <9075> <F1E6> <F1E6> <96CB> <F1E7> <F1E7> <99FF> <F1E8> <F1E8> <8301> <F1E9> <F1E9> <4E2D> <F1EA> <F1EA> <4EF2> <F1EB> <F1EB> <8846> <F1EC> <F1EC> <91CD> <F1ED> <F1ED> <537D> <F1EE> <F1EE> <6ADB> <F1EF> <F1EF> <696B> <F1F0> <F1F0> <6C41> <F1F1> <F1F1> <847A> <F1F2> <F1F2> <589E> <F1F3> <F1F3> <618E> <F1F4> <F1F4> <66FE> <F1F5> <F1F5> <62EF> <F1F6> <F1F6> <70DD> <F1F7> <F1F7> <7511> <F1F8> <F1F8> <75C7> <F1F9> <F1F9> <7E52> <F1FA> <F1FA> <84B8> <F1FB> <F1FB> <8B49> <F1FC> <F1FC> <8D08> <F1FD> <F1FD> <4E4B> <F1FE> <F1FE> <53EA> <F2A1> <F2A1> <54AB> <F2A2> <F2A2> <5730> <F2A3> <F2A3> <5740> <F2A4> <F2A4> <5FD7> <F2A5> <F2A5> <6301> <F2A6> <F2A6> <6307> <F2A7> <F2A7> <646F> <F2A8> <F2A8> <652F> <F2A9> <F2A9> <65E8> <F2AA> <F2AA> <667A> <F2AB> <F2AB> <679D> <F2AC> <F2AC> <67B3> <F2AD> <F2AD> <6B62> <F2AE> <F2AE> <6C60> <F2AF> <F2AF> <6C9A> <F2B0> <F2B0> <6F2C> <F2B1> <F2B1> <77E5> <F2B2> <F2B2> <7825> <F2B3> <F2B3> <7949> <F2B4> <F2B4> <7957> <F2B5> <F2B5> <7D19> <F2B6> <F2B6> <80A2> <F2B7> <F2B7> <8102> <F2B8> <F2B8> <81F3> <F2B9> <F2B9> <829D> <F2BA> <F2BA> <82B7> <F2BB> <F2BB> <8718> <F2BC> <F2BC> <8A8C> <F2BD> <F2BD> <F9FC> <F2BE> <F2BE> <8D04> <F2BF> <F2BF> <8DBE> <F2C0> <F2C0> <9072> <F2C1> <F2C1> <76F4> <F2C2> <F2C2> <7A19> <F2C3> <F2C3> <7A37> <F2C4> <F2C4> <7E54> <F2C5> <F2C5> <8077> <F2C6> <F2C6> <5507> <F2C7> <F2C7> <55D4> <F2C8> <F2C8> <5875> <F2C9> <F2C9> <632F> <F2CA> <F2CA> <6422> <F2CB> <F2CB> <6649> <F2CC> <F2CC> <664B> <F2CD> <F2CD> <686D> <F2CE> <F2CE> <699B> <F2CF> <F2CF> <6B84> <F2D0> <F2D0> <6D25> <F2D1> <F2D1> <6EB1> <F2D2> <F2D2> <73CD> endbfrange 100 beginbfrange <F2D3> <F2D3> <7468> <F2D4> <F2D4> <74A1> <F2D5> <F2D5> <755B> <F2D6> <F2D6> <75B9> <F2D7> <F2D7> <76E1> <F2D8> <F2D8> <771E> <F2D9> <F2D9> <778B> <F2DA> <F2DA> <79E6> <F2DB> <F2DB> <7E09> <F2DC> <F2DC> <7E1D> <F2DD> <F2DD> <81FB> <F2DE> <F2DE> <852F> <F2DF> <F2DF> <8897> <F2E0> <F2E0> <8A3A> <F2E1> <F2E1> <8CD1> <F2E2> <F2E2> <8EEB> <F2E3> <F2E3> <8FB0> <F2E4> <F2E4> <9032> <F2E5> <F2E5> <93AD> <F2E6> <F2E6> <9663> <F2E7> <F2E7> <9673> <F2E8> <F2E8> <9707> <F2E9> <F2E9> <4F84> <F2EA> <F2EA> <53F1> <F2EB> <F2EB> <59EA> <F2EC> <F2EC> <5AC9> <F2ED> <F2ED> <5E19> <F2EE> <F2EE> <684E> <F2EF> <F2EF> <74C6> <F2F0> <F2F0> <75BE> <F2F1> <F2F1> <79E9> <F2F2> <F2F2> <7A92> <F2F3> <F2F3> <81A3> <F2F4> <F2F4> <86ED> <F2F5> <F2F5> <8CEA> <F2F6> <F2F6> <8DCC> <F2F7> <F2F7> <8FED> <F2F8> <F2F8> <659F> <F2F9> <F2F9> <6715> <F2FA> <F2FA> <F9FD> <F2FB> <F2FB> <57F7> <F2FC> <F2FC> <6F57> <F2FD> <F2FD> <7DDD> <F2FE> <F2FE> <8F2F> <F3A1> <F3A1> <93F6> <F3A2> <F3A2> <96C6> <F3A3> <F3A3> <5FB5> <F3A4> <F3A4> <61F2> <F3A5> <F3A5> <6F84> <F3A6> <F3A6> <4E14> <F3A7> <F3A7> <4F98> <F3A8> <F3A8> <501F> <F3A9> <F3A9> <53C9> <F3AA> <F3AA> <55DF> <F3AB> <F3AB> <5D6F> <F3AC> <F3AC> <5DEE> <F3AD> <F3AD> <6B21> <F3AE> <F3AE> <6B64> <F3AF> <F3AF> <78CB> <F3B0> <F3B0> <7B9A> <F3B1> <F3B1> <F9FE> <F3B2> <F3B2> <8E49> <F3B3> <F3B3> <8ECA> <F3B4> <F3B4> <906E> <F3B5> <F3B5> <6349> <F3B6> <F3B6> <643E> <F3B7> <F3B7> <7740> <F3B8> <F3B8> <7A84> <F3B9> <F3B9> <932F> <F3BA> <F3BA> <947F> <F3BB> <F3BB> <9F6A> <F3BC> <F3BC> <64B0> <F3BD> <F3BD> <6FAF> <F3BE> <F3BE> <71E6> <F3BF> <F3BF> <74A8> <F3C0> <F3C0> <74DA> <F3C1> <F3C1> <7AC4> <F3C2> <F3C2> <7C12> <F3C3> <F3C3> <7E82> <F3C4> <F3C4> <7CB2> <F3C5> <F3C5> <7E98> <F3C6> <F3C6> <8B9A> <F3C7> <F3C7> <8D0A> <F3C8> <F3C8> <947D> <F3C9> <F3C9> <9910> <F3CA> <F3CA> <994C> <F3CB> <F3CB> <5239> <F3CC> <F3CC> <5BDF> <F3CD> <F3CD> <64E6> <F3CE> <F3CE> <672D> <F3CF> <F3CF> <7D2E> <F3D0> <F3D0> <50ED> <F3D1> <F3D1> <53C3> <F3D2> <F3D2> <5879> <F3D3> <F3D4> <6158> <F3D5> <F3D5> <61FA> <F3D6> <F3D6> <65AC> <F3D7> <F3D7> <7AD9> <F3D8> <F3D8> <8B92> <F3D9> <F3D9> <8B96> endbfrange 100 beginbfrange <F3DA> <F3DA> <5009> <F3DB> <F3DB> <5021> <F3DC> <F3DC> <5275> <F3DD> <F3DD> <5531> <F3DE> <F3DE> <5A3C> <F3DF> <F3DF> <5EE0> <F3E0> <F3E0> <5F70> <F3E1> <F3E1> <6134> <F3E2> <F3E2> <655E> <F3E3> <F3E3> <660C> <F3E4> <F3E4> <6636> <F3E5> <F3E5> <66A2> <F3E6> <F3E6> <69CD> <F3E7> <F3E7> <6EC4> <F3E8> <F3E8> <6F32> <F3E9> <F3E9> <7316> <F3EA> <F3EA> <7621> <F3EB> <F3EB> <7A93> <F3EC> <F3EC> <8139> <F3ED> <F3ED> <8259> <F3EE> <F3EE> <83D6> <F3EF> <F3EF> <84BC> <F3F0> <F3F0> <50B5> <F3F1> <F3F1> <57F0> <F3F2> <F3F2> <5BC0> <F3F3> <F3F3> <5BE8> <F3F4> <F3F4> <5F69> <F3F5> <F3F5> <63A1> <F3F6> <F3F6> <7826> <F3F7> <F3F7> <7DB5> <F3F8> <F3F8> <83DC> <F3F9> <F3F9> <8521> <F3FA> <F3FA> <91C7> <F3FB> <F3FB> <91F5> <F3FC> <F3FC> <518A> <F3FD> <F3FD> <67F5> <F3FE> <F3FE> <7B56> <F4A1> <F4A1> <8CAC> <F4A2> <F4A2> <51C4> <F4A3> <F4A3> <59BB> <F4A4> <F4A4> <60BD> <F4A5> <F4A5> <8655> <F4A6> <F4A6> <501C> <F4A7> <F4A7> <F9FF> <F4A8> <F4A8> <5254> <F4A9> <F4A9> <5C3A> <F4AA> <F4AA> <617D> <F4AB> <F4AB> <621A> <F4AC> <F4AC> <62D3> <F4AD> <F4AD> <64F2> <F4AE> <F4AE> <65A5> <F4AF> <F4AF> <6ECC> <F4B0> <F4B0> <7620> <F4B1> <F4B1> <810A> <F4B2> <F4B2> <8E60> <F4B3> <F4B3> <965F> <F4B4> <F4B4> <96BB> <F4B5> <F4B5> <4EDF> <F4B6> <F4B6> <5343> <F4B7> <F4B7> <5598> <F4B8> <F4B8> <5929> <F4B9> <F4B9> <5DDD> <F4BA> <F4BA> <64C5> <F4BB> <F4BB> <6CC9> <F4BC> <F4BC> <6DFA> <F4BD> <F4BD> <7394> <F4BE> <F4BE> <7A7F> <F4BF> <F4BF> <821B> <F4C0> <F4C0> <85A6> <F4C1> <F4C1> <8CE4> <F4C2> <F4C2> <8E10> <F4C3> <F4C3> <9077> <F4C4> <F4C4> <91E7> <F4C5> <F4C5> <95E1> <F4C6> <F4C6> <9621> <F4C7> <F4C7> <97C6> <F4C8> <F4C8> <51F8> <F4C9> <F4C9> <54F2> <F4CA> <F4CA> <5586> <F4CB> <F4CB> <5FB9> <F4CC> <F4CC> <64A4> <F4CD> <F4CD> <6F88> <F4CE> <F4CE> <7DB4> <F4CF> <F4CF> <8F1F> <F4D0> <F4D0> <8F4D> <F4D1> <F4D1> <9435> <F4D2> <F4D2> <50C9> <F4D3> <F4D3> <5C16> <F4D4> <F4D4> <6CBE> <F4D5> <F4D5> <6DFB> <F4D6> <F4D6> <751B> <F4D7> <F4D7> <77BB> <F4D8> <F4D8> <7C3D> <F4D9> <F4D9> <7C64> <F4DA> <F4DA> <8A79> <F4DB> <F4DB> <8AC2> <F4DC> <F4DC> <581E> <F4DD> <F4DD> <59BE> <F4DE> <F4DE> <5E16> <F4DF> <F4DF> <6377> endbfrange 100 beginbfrange <F4E0> <F4E0> <7252> <F4E1> <F4E1> <758A> <F4E2> <F4E2> <776B> <F4E3> <F4E3> <8ADC> <F4E4> <F4E4> <8CBC> <F4E5> <F4E5> <8F12> <F4E6> <F4E6> <5EF3> <F4E7> <F4E7> <6674> <F4E8> <F4E8> <6DF8> <F4E9> <F4E9> <807D> <F4EA> <F4EA> <83C1> <F4EB> <F4EB> <8ACB> <F4EC> <F4EC> <9751> <F4ED> <F4ED> <9BD6> <F4EE> <F4EE> <FA00> <F4EF> <F4EF> <5243> <F4F0> <F4F0> <66FF> <F4F1> <F4F1> <6D95> <F4F2> <F4F2> <6EEF> <F4F3> <F4F3> <7DE0> <F4F4> <F4F4> <8AE6> <F4F5> <F4F5> <902E> <F4F6> <F4F6> <905E> <F4F7> <F4F7> <9AD4> <F4F8> <F4F8> <521D> <F4F9> <F4F9> <527F> <F4FA> <F4FA> <54E8> <F4FB> <F4FB> <6194> <F4FC> <F4FC> <6284> <F4FD> <F4FD> <62DB> <F4FE> <F4FE> <68A2> <F5A1> <F5A1> <6912> <F5A2> <F5A2> <695A> <F5A3> <F5A3> <6A35> <F5A4> <F5A4> <7092> <F5A5> <F5A5> <7126> <F5A6> <F5A6> <785D> <F5A7> <F5A7> <7901> <F5A8> <F5A8> <790E> <F5A9> <F5A9> <79D2> <F5AA> <F5AA> <7A0D> <F5AB> <F5AB> <8096> <F5AC> <F5AC> <8278> <F5AD> <F5AD> <82D5> <F5AE> <F5AE> <8349> <F5AF> <F5AF> <8549> <F5B0> <F5B0> <8C82> <F5B1> <F5B1> <8D85> <F5B2> <F5B2> <9162> <F5B3> <F5B3> <918B> <F5B4> <F5B4> <91AE> <F5B5> <F5B5> <4FC3> <F5B6> <F5B6> <56D1> <F5B7> <F5B7> <71ED> <F5B8> <F5B8> <77D7> <F5B9> <F5B9> <8700> <F5BA> <F5BA> <89F8> <F5BB> <F5BB> <5BF8> <F5BC> <F5BC> <5FD6> <F5BD> <F5BD> <6751> <F5BE> <F5BE> <90A8> <F5BF> <F5BF> <53E2> <F5C0> <F5C0> <585A> <F5C1> <F5C1> <5BF5> <F5C2> <F5C2> <60A4> <F5C3> <F5C3> <6181> <F5C4> <F5C4> <6460> <F5C5> <F5C5> <7E3D> <F5C6> <F5C6> <8070> <F5C7> <F5C7> <8525> <F5C8> <F5C8> <9283> <F5C9> <F5C9> <64AE> <F5CA> <F5CA> <50AC> <F5CB> <F5CB> <5D14> <F5CC> <F5CC> <6700> <F5CD> <F5CD> <589C> <F5CE> <F5CE> <62BD> <F5CF> <F5CF> <63A8> <F5D0> <F5D0> <690E> <F5D1> <F5D1> <6978> <F5D2> <F5D2> <6A1E> <F5D3> <F5D3> <6E6B> <F5D4> <F5D4> <76BA> <F5D5> <F5D5> <79CB> <F5D6> <F5D6> <82BB> <F5D7> <F5D7> <8429> <F5D8> <F5D8> <8ACF> <F5D9> <F5D9> <8DA8> <F5DA> <F5DA> <8FFD> <F5DB> <F5DB> <9112> <F5DC> <F5DC> <914B> <F5DD> <F5DD> <919C> <F5DE> <F5DE> <9310> <F5DF> <F5DF> <9318> <F5E0> <F5E0> <939A> <F5E1> <F5E1> <96DB> <F5E2> <F5E2> <9A36> <F5E3> <F5E3> <9C0D> <F5E4> <F5E4> <4E11> <F5E5> <F5E5> <755C> endbfrange 100 beginbfrange <F5E6> <F5E6> <795D> <F5E7> <F5E7> <7AFA> <F5E8> <F5E8> <7B51> <F5E9> <F5E9> <7BC9> <F5EA> <F5EA> <7E2E> <F5EB> <F5EB> <84C4> <F5EC> <F5EC> <8E59> <F5ED> <F5ED> <8E74> <F5EE> <F5EE> <8EF8> <F5EF> <F5EF> <9010> <F5F0> <F5F0> <6625> <F5F1> <F5F1> <693F> <F5F2> <F5F2> <7443> <F5F3> <F5F3> <51FA> <F5F4> <F5F4> <672E> <F5F5> <F5F5> <9EDC> <F5F6> <F5F6> <5145> <F5F7> <F5F7> <5FE0> <F5F8> <F5F8> <6C96> <F5F9> <F5F9> <87F2> <F5FA> <F5FA> <885D> <F5FB> <F5FB> <8877> <F5FC> <F5FC> <60B4> <F5FD> <F5FD> <81B5> <F5FE> <F5FE> <8403> <F6A1> <F6A1> <8D05> <F6A2> <F6A2> <53D6> <F6A3> <F6A3> <5439> <F6A4> <F6A4> <5634> <F6A5> <F6A5> <5A36> <F6A6> <F6A6> <5C31> <F6A7> <F6A7> <708A> <F6A8> <F6A8> <7FE0> <F6A9> <F6A9> <805A> <F6AA> <F6AA> <8106> <F6AB> <F6AB> <81ED> <F6AC> <F6AC> <8DA3> <F6AD> <F6AD> <9189> <F6AE> <F6AE> <9A5F> <F6AF> <F6AF> <9DF2> <F6B0> <F6B0> <5074> <F6B1> <F6B1> <4EC4> <F6B2> <F6B2> <53A0> <F6B3> <F6B3> <60FB> <F6B4> <F6B4> <6E2C> <F6B5> <F6B5> <5C64> <F6B6> <F6B6> <4F88> <F6B7> <F6B7> <5024> <F6B8> <F6B8> <55E4> <F6B9> <F6B9> <5CD9> <F6BA> <F6BA> <5E5F> <F6BB> <F6BB> <6065> <F6BC> <F6BC> <6894> <F6BD> <F6BD> <6CBB> <F6BE> <F6BE> <6DC4> <F6BF> <F6BF> <71BE> <F6C0> <F6C0> <75D4> <F6C1> <F6C1> <75F4> <F6C2> <F6C2> <7661> <F6C3> <F6C3> <7A1A> <F6C4> <F6C4> <7A49> <F6C5> <F6C5> <7DC7> <F6C6> <F6C6> <7DFB> <F6C7> <F6C7> <7F6E> <F6C8> <F6C8> <81F4> <F6C9> <F6C9> <86A9> <F6CA> <F6CA> <8F1C> <F6CB> <F6CB> <96C9> <F6CC> <F6CC> <99B3> <F6CD> <F6CD> <9F52> <F6CE> <F6CE> <5247> <F6CF> <F6CF> <52C5> <F6D0> <F6D0> <98ED> <F6D1> <F6D1> <89AA> <F6D2> <F6D2> <4E03> <F6D3> <F6D3> <67D2> <F6D4> <F6D4> <6F06> <F6D5> <F6D5> <4FB5> <F6D6> <F6D6> <5BE2> <F6D7> <F6D7> <6795> <F6D8> <F6D8> <6C88> <F6D9> <F6D9> <6D78> <F6DA> <F6DA> <741B> <F6DB> <F6DB> <7827> <F6DC> <F6DC> <91DD> <F6DD> <F6DD> <937C> <F6DE> <F6DE> <87C4> <F6DF> <F6DF> <79E4> <F6E0> <F6E0> <7A31> <F6E1> <F6E1> <5FEB> <F6E2> <F6E2> <4ED6> <F6E3> <F6E3> <54A4> <F6E4> <F6E4> <553E> <F6E5> <F6E5> <58AE> <F6E6> <F6E6> <59A5> <F6E7> <F6E7> <60F0> <F6E8> <F6E8> <6253> <F6E9> <F6E9> <62D6> <F6EA> <F6EA> <6736> <F6EB> <F6EB> <6955> endbfrange 100 beginbfrange <F6EC> <F6EC> <8235> <F6ED> <F6ED> <9640> <F6EE> <F6EE> <99B1> <F6EF> <F6EF> <99DD> <F6F0> <F6F0> <502C> <F6F1> <F6F1> <5353> <F6F2> <F6F2> <5544> <F6F3> <F6F3> <577C> <F6F4> <F6F4> <FA01> <F6F5> <F6F5> <6258> <F6F6> <F6F6> <FA02> <F6F7> <F6F7> <64E2> <F6F8> <F6F8> <666B> <F6F9> <F6F9> <67DD> <F6FA> <F6FA> <6FC1> <F6FB> <F6FB> <6FEF> <F6FC> <F6FC> <7422> <F6FD> <F6FD> <7438> <F6FE> <F6FE> <8A17> <F7A1> <F7A1> <9438> <F7A2> <F7A2> <5451> <F7A3> <F7A3> <5606> <F7A4> <F7A4> <5766> <F7A5> <F7A5> <5F48> <F7A6> <F7A6> <619A> <F7A7> <F7A7> <6B4E> <F7A8> <F7A8> <7058> <F7A9> <F7A9> <70AD> <F7AA> <F7AA> <7DBB> <F7AB> <F7AB> <8A95> <F7AC> <F7AC> <596A> <F7AD> <F7AD> <812B> <F7AE> <F7AE> <63A2> <F7AF> <F7AF> <7708> <F7B0> <F7B0> <803D> <F7B1> <F7B1> <8CAA> <F7B2> <F7B2> <5854> <F7B3> <F7B3> <642D> <F7B4> <F7B4> <69BB> <F7B5> <F7B5> <5B95> <F7B6> <F7B6> <5E11> <F7B7> <F7B7> <6E6F> <F7B8> <F7B8> <FA03> <F7B9> <F7B9> <8569> <F7BA> <F7BA> <514C> <F7BB> <F7BB> <53F0> <F7BC> <F7BC> <592A> <F7BD> <F7BD> <6020> <F7BE> <F7BE> <614B> <F7BF> <F7BF> <6B86> <F7C0> <F7C0> <6C70> <F7C1> <F7C1> <6CF0> <F7C2> <F7C2> <7B1E> <F7C3> <F7C3> <80CE> <F7C4> <F7C4> <82D4> <F7C5> <F7C5> <8DC6> <F7C6> <F7C6> <90B0> <F7C7> <F7C7> <98B1> <F7C8> <F7C8> <FA04> <F7C9> <F7C9> <64C7> <F7CA> <F7CA> <6FA4> <F7CB> <F7CB> <6491> <F7CC> <F7CC> <6504> <F7CD> <F7CD> <514E> <F7CE> <F7CE> <5410> <F7CF> <F7CF> <571F> <F7D0> <F7D0> <8A0E> <F7D1> <F7D1> <615F> <F7D2> <F7D2> <6876> <F7D3> <F7D3> <FA05> <F7D4> <F7D4> <75DB> <F7D5> <F7D5> <7B52> <F7D6> <F7D6> <7D71> <F7D7> <F7D7> <901A> <F7D8> <F7D8> <5806> <F7D9> <F7D9> <69CC> <F7DA> <F7DA> <817F> <F7DB> <F7DB> <892A> <F7DC> <F7DC> <9000> <F7DD> <F7DD> <9839> <F7DE> <F7DE> <5078> <F7DF> <F7DF> <5957> <F7E0> <F7E0> <59AC> <F7E1> <F7E1> <6295> <F7E2> <F7E2> <900F> <F7E3> <F7E3> <9B2A> <F7E4> <F7E4> <615D> <F7E5> <F7E5> <7279> <F7E6> <F7E6> <95D6> <F7E7> <F7E7> <5761> <F7E8> <F7E8> <5A46> <F7E9> <F7E9> <5DF4> <F7EA> <F7EA> <628A> <F7EB> <F7EB> <64AD> <F7EC> <F7EC> <64FA> <F7ED> <F7ED> <6777> <F7EE> <F7EE> <6CE2> <F7EF> <F7EF> <6D3E> <F7F0> <F7F0> <722C> <F7F1> <F7F1> <7436> endbfrange 100 beginbfrange <F7F2> <F7F2> <7834> <F7F3> <F7F3> <7F77> <F7F4> <F7F4> <82AD> <F7F5> <F7F5> <8DDB> <F7F6> <F7F6> <9817> <F7F7> <F7F7> <5224> <F7F8> <F7F8> <5742> <F7F9> <F7F9> <677F> <F7FA> <F7FA> <7248> <F7FB> <F7FB> <74E3> <F7FC> <F7FC> <8CA9> <F7FD> <F7FD> <8FA6> <F7FE> <F7FE> <9211> <F8A1> <F8A1> <962A> <F8A2> <F8A2> <516B> <F8A3> <F8A3> <53ED> <F8A4> <F8A4> <634C> <F8A5> <F8A5> <4F69> <F8A6> <F8A6> <5504> <F8A7> <F8A7> <6096> <F8A8> <F8A8> <6557> <F8A9> <F8A9> <6C9B> <F8AA> <F8AA> <6D7F> <F8AB> <F8AB> <724C> <F8AC> <F8AC> <72FD> <F8AD> <F8AD> <7A17> <F8AE> <F8AE> <8987> <F8AF> <F8AF> <8C9D> <F8B0> <F8B0> <5F6D> <F8B1> <F8B1> <6F8E> <F8B2> <F8B2> <70F9> <F8B3> <F8B3> <81A8> <F8B4> <F8B4> <610E> <F8B5> <F8B5> <4FBF> <F8B6> <F8B6> <504F> <F8B7> <F8B7> <6241> <F8B8> <F8B8> <7247> <F8B9> <F8B9> <7BC7> <F8BA> <F8BA> <7DE8> <F8BB> <F8BB> <7FE9> <F8BC> <F8BC> <904D> <F8BD> <F8BD> <97AD> <F8BE> <F8BE> <9A19> <F8BF> <F8BF> <8CB6> <F8C0> <F8C0> <576A> <F8C1> <F8C1> <5E73> <F8C2> <F8C2> <67B0> <F8C3> <F8C3> <840D> <F8C4> <F8C4> <8A55> <F8C5> <F8C5> <5420> <F8C6> <F8C6> <5B16> <F8C7> <F8C7> <5E63> <F8C8> <F8C8> <5EE2> <F8C9> <F8C9> <5F0A> <F8CA> <F8CA> <6583> <F8CB> <F8CB> <80BA> <F8CC> <F8CC> <853D> <F8CD> <F8CD> <9589> <F8CE> <F8CE> <965B> <F8CF> <F8CF> <4F48> <F8D0> <F8D0> <5305> <F8D1> <F8D1> <530D> <F8D2> <F8D2> <530F> <F8D3> <F8D3> <5486> <F8D4> <F8D4> <54FA> <F8D5> <F8D5> <5703> <F8D6> <F8D6> <5E03> <F8D7> <F8D7> <6016> <F8D8> <F8D8> <629B> <F8D9> <F8D9> <62B1> <F8DA> <F8DA> <6355> <F8DB> <F8DB> <FA06> <F8DC> <F8DC> <6CE1> <F8DD> <F8DD> <6D66> <F8DE> <F8DE> <75B1> <F8DF> <F8DF> <7832> <F8E0> <F8E0> <80DE> <F8E1> <F8E1> <812F> <F8E2> <F8E2> <82DE> <F8E3> <F8E3> <8461> <F8E4> <F8E4> <84B2> <F8E5> <F8E5> <888D> <F8E6> <F8E6> <8912> <F8E7> <F8E7> <900B> <F8E8> <F8E8> <92EA> <F8E9> <F8E9> <98FD> <F8EA> <F8EA> <9B91> <F8EB> <F8EB> <5E45> <F8EC> <F8EC> <66B4> <F8ED> <F8ED> <66DD> <F8EE> <F8EE> <7011> <F8EF> <F8EF> <7206> <F8F0> <F8F0> <FA07> <F8F1> <F8F1> <4FF5> <F8F2> <F8F2> <527D> <F8F3> <F8F3> <5F6A> <F8F4> <F8F4> <6153> <F8F5> <F8F5> <6753> <F8F6> <F8F6> <6A19> <F8F7> <F8F7> <6F02> endbfrange 100 beginbfrange <F8F8> <F8F8> <74E2> <F8F9> <F8F9> <7968> <F8FA> <F8FA> <8868> <F8FB> <F8FB> <8C79> <F8FC> <F8FC> <98C7> <F8FD> <F8FD> <98C4> <F8FE> <F8FE> <9A43> <F9A1> <F9A1> <54C1> <F9A2> <F9A2> <7A1F> <F9A3> <F9A3> <6953> <F9A4> <F9A4> <8AF7> <F9A5> <F9A5> <8C4A> <F9A6> <F9A6> <98A8> <F9A7> <F9A7> <99AE> <F9A8> <F9A8> <5F7C> <F9A9> <F9A9> <62AB> <F9AA> <F9AA> <75B2> <F9AB> <F9AB> <76AE> <F9AC> <F9AC> <88AB> <F9AD> <F9AD> <907F> <F9AE> <F9AE> <9642> <F9AF> <F9AF> <5339> <F9B0> <F9B0> <5F3C> <F9B1> <F9B1> <5FC5> <F9B2> <F9B2> <6CCC> <F9B3> <F9B3> <73CC> <F9B4> <F9B4> <7562> <F9B5> <F9B5> <758B> <F9B6> <F9B6> <7B46> <F9B7> <F9B7> <82FE> <F9B8> <F9B8> <999D> <F9B9> <F9B9> <4E4F> <F9BA> <F9BA> <903C> <F9BB> <F9BB> <4E0B> <F9BC> <F9BC> <4F55> <F9BD> <F9BD> <53A6> <F9BE> <F9BE> <590F> <F9BF> <F9BF> <5EC8> <F9C0> <F9C0> <6630> <F9C1> <F9C1> <6CB3> <F9C2> <F9C2> <7455> <F9C3> <F9C3> <8377> <F9C4> <F9C4> <8766> <F9C5> <F9C5> <8CC0> <F9C6> <F9C6> <9050> <F9C7> <F9C7> <971E> <F9C8> <F9C8> <9C15> <F9C9> <F9C9> <58D1> <F9CA> <F9CA> <5B78> <F9CB> <F9CB> <8650> <F9CC> <F9CC> <8B14> <F9CD> <F9CD> <9DB4> <F9CE> <F9CE> <5BD2> <F9CF> <F9CF> <6068> <F9D0> <F9D0> <608D> <F9D1> <F9D1> <65F1> <F9D2> <F9D2> <6C57> <F9D3> <F9D3> <6F22> <F9D4> <F9D4> <6FA3> <F9D5> <F9D5> <701A> <F9D6> <F9D6> <7F55> <F9D7> <F9D7> <7FF0> <F9D8> <F9D9> <9591> <F9DA> <F9DA> <9650> <F9DB> <F9DB> <97D3> <F9DC> <F9DC> <5272> <F9DD> <F9DD> <8F44> <F9DE> <F9DE> <51FD> <F9DF> <F9DF> <542B> <F9E0> <F9E0> <54B8> <F9E1> <F9E1> <5563> <F9E2> <F9E2> <558A> <F9E3> <F9E3> <6ABB> <F9E4> <F9E4> <6DB5> <F9E5> <F9E5> <7DD8> <F9E6> <F9E6> <8266> <F9E7> <F9E7> <929C> <F9E8> <F9E8> <9677> <F9E9> <F9E9> <9E79> <F9EA> <F9EA> <5408> <F9EB> <F9EB> <54C8> <F9EC> <F9EC> <76D2> <F9ED> <F9ED> <86E4> <F9EE> <F9EE> <95A4> <F9EF> <F9EF> <95D4> <F9F0> <F9F0> <965C> <F9F1> <F9F1> <4EA2> <F9F2> <F9F2> <4F09> <F9F3> <F9F3> <59EE> <F9F4> <F9F4> <5AE6> <F9F5> <F9F5> <5DF7> <F9F6> <F9F6> <6052> <F9F7> <F9F7> <6297> <F9F8> <F9F8> <676D> <F9F9> <F9F9> <6841> <F9FA> <F9FA> <6C86> <F9FB> <F9FB> <6E2F> <F9FC> <F9FC> <7F38> <F9FD> <F9FD> <809B> <F9FE> <F9FE> <822A> endbfrange 100 beginbfrange <FAA1> <FAA2> <FA08> <FAA3> <FAA3> <9805> <FAA4> <FAA4> <4EA5> <FAA5> <FAA5> <5055> <FAA6> <FAA6> <54B3> <FAA7> <FAA7> <5793> <FAA8> <FAA8> <595A> <FAA9> <FAA9> <5B69> <FAAA> <FAAA> <5BB3> <FAAB> <FAAB> <61C8> <FAAC> <FAAC> <6977> <FAAD> <FAAD> <6D77> <FAAE> <FAAE> <7023> <FAAF> <FAAF> <87F9> <FAB0> <FAB0> <89E3> <FAB1> <FAB1> <8A72> <FAB2> <FAB2> <8AE7> <FAB3> <FAB3> <9082> <FAB4> <FAB4> <99ED> <FAB5> <FAB5> <9AB8> <FAB6> <FAB6> <52BE> <FAB7> <FAB7> <6838> <FAB8> <FAB8> <5016> <FAB9> <FAB9> <5E78> <FABA> <FABA> <674F> <FABB> <FABB> <8347> <FABC> <FABC> <884C> <FABD> <FABD> <4EAB> <FABE> <FABE> <5411> <FABF> <FABF> <56AE> <FAC0> <FAC0> <73E6> <FAC1> <FAC1> <9115> <FAC2> <FAC2> <97FF> <FAC3> <FAC3> <9909> <FAC4> <FAC4> <9957> <FAC5> <FAC5> <9999> <FAC6> <FAC6> <5653> <FAC7> <FAC7> <589F> <FAC8> <FAC8> <865B> <FAC9> <FAC9> <8A31> <FACA> <FACA> <61B2> <FACB> <FACB> <6AF6> <FACC> <FACC> <737B> <FACD> <FACD> <8ED2> <FACE> <FACE> <6B47> <FACF> <FACF> <96AA> <FAD0> <FAD0> <9A57> <FAD1> <FAD1> <5955> <FAD2> <FAD2> <7200> <FAD3> <FAD3> <8D6B> <FAD4> <FAD4> <9769> <FAD5> <FAD5> <4FD4> <FAD6> <FAD6> <5CF4> <FAD7> <FAD7> <5F26> <FAD8> <FAD8> <61F8> <FAD9> <FAD9> <665B> <FADA> <FADA> <6CEB> <FADB> <FADB> <70AB> <FADC> <FADC> <7384> <FADD> <FADD> <73B9> <FADE> <FADE> <73FE> <FADF> <FADF> <7729> <FAE0> <FAE0> <774D> <FAE1> <FAE1> <7D43> <FAE2> <FAE2> <7D62> <FAE3> <FAE3> <7E23> <FAE4> <FAE4> <8237> <FAE5> <FAE5> <8852> <FAE6> <FAE6> <FA0A> <FAE7> <FAE7> <8CE2> <FAE8> <FAE8> <9249> <FAE9> <FAE9> <986F> <FAEA> <FAEA> <5B51> <FAEB> <FAEB> <7A74> <FAEC> <FAEC> <8840> <FAED> <FAED> <9801> <FAEE> <FAEE> <5ACC> <FAEF> <FAEF> <4FE0> <FAF0> <FAF0> <5354> <FAF1> <FAF1> <593E> <FAF2> <FAF2> <5CFD> <FAF3> <FAF3> <633E> <FAF4> <FAF4> <6D79> <FAF5> <FAF5> <72F9> <FAF6> <FAF6> <8105> <FAF7> <FAF7> <8107> <FAF8> <FAF8> <83A2> <FAF9> <FAF9> <92CF> <FAFA> <FAFA> <9830> <FAFB> <FAFB> <4EA8> <FAFC> <FAFC> <5144> <FAFD> <FAFD> <5211> <FAFE> <FAFE> <578B> <FBA1> <FBA1> <5F62> <FBA2> <FBA2> <6CC2> <FBA3> <FBA3> <6ECE> <FBA4> <FBA4> <7005> <FBA5> <FBA5> <7050> <FBA6> <FBA6> <70AF> <FBA7> <FBA7> <7192> endbfrange 100 beginbfrange <FBA8> <FBA8> <73E9> <FBA9> <FBA9> <7469> <FBAA> <FBAA> <834A> <FBAB> <FBAB> <87A2> <FBAC> <FBAC> <8861> <FBAD> <FBAD> <9008> <FBAE> <FBAE> <90A2> <FBAF> <FBAF> <93A3> <FBB0> <FBB0> <99A8> <FBB1> <FBB1> <516E> <FBB2> <FBB2> <5F57> <FBB3> <FBB3> <60E0> <FBB4> <FBB4> <6167> <FBB5> <FBB5> <66B3> <FBB6> <FBB6> <8559> <FBB7> <FBB7> <8E4A> <FBB8> <FBB8> <91AF> <FBB9> <FBB9> <978B> <FBBA> <FBBA> <4E4E> <FBBB> <FBBB> <4E92> <FBBC> <FBBC> <547C> <FBBD> <FBBD> <58D5> <FBBE> <FBBE> <58FA> <FBBF> <FBBF> <597D> <FBC0> <FBC0> <5CB5> <FBC1> <FBC1> <5F27> <FBC2> <FBC2> <6236> <FBC3> <FBC3> <6248> <FBC4> <FBC4> <660A> <FBC5> <FBC5> <6667> <FBC6> <FBC6> <6BEB> <FBC7> <FBC7> <6D69> <FBC8> <FBC8> <6DCF> <FBC9> <FBC9> <6E56> <FBCA> <FBCA> <6EF8> <FBCB> <FBCB> <6F94> <FBCC> <FBCC> <6FE0> <FBCD> <FBCD> <6FE9> <FBCE> <FBCE> <705D> <FBCF> <FBCF> <72D0> <FBD0> <FBD0> <7425> <FBD1> <FBD1> <745A> <FBD2> <FBD2> <74E0> <FBD3> <FBD3> <7693> <FBD4> <FBD4> <795C> <FBD5> <FBD5> <7CCA> <FBD6> <FBD6> <7E1E> <FBD7> <FBD7> <80E1> <FBD8> <FBD8> <82A6> <FBD9> <FBD9> <846B> <FBDA> <FBDA> <84BF> <FBDB> <FBDB> <864E> <FBDC> <FBDC> <865F> <FBDD> <FBDD> <8774> <FBDE> <FBDE> <8B77> <FBDF> <FBDF> <8C6A> <FBE0> <FBE0> <93AC> <FBE1> <FBE1> <9800> <FBE2> <FBE2> <9865> <FBE3> <FBE3> <60D1> <FBE4> <FBE4> <6216> <FBE5> <FBE5> <9177> <FBE6> <FBE6> <5A5A> <FBE7> <FBE7> <660F> <FBE8> <FBE8> <6DF7> <FBE9> <FBE9> <6E3E> <FBEA> <FBEA> <743F> <FBEB> <FBEB> <9B42> <FBEC> <FBEC> <5FFD> <FBED> <FBED> <60DA> <FBEE> <FBEE> <7B0F> <FBEF> <FBEF> <54C4> <FBF0> <FBF0> <5F18> <FBF1> <FBF1> <6C5E> <FBF2> <FBF2> <6CD3> <FBF3> <FBF3> <6D2A> <FBF4> <FBF4> <70D8> <FBF5> <FBF5> <7D05> <FBF6> <FBF6> <8679> <FBF7> <FBF7> <8A0C> <FBF8> <FBF8> <9D3B> <FBF9> <FBF9> <5316> <FBFA> <FBFA> <548C> <FBFB> <FBFB> <5B05> <FBFC> <FBFC> <6A3A> <FBFD> <FBFD> <706B> <FBFE> <FBFE> <7575> <FCA1> <FCA1> <798D> <FCA2> <FCA2> <79BE> <FCA3> <FCA3> <82B1> <FCA4> <FCA4> <83EF> <FCA5> <FCA5> <8A71> <FCA6> <FCA6> <8B41> <FCA7> <FCA7> <8CA8> <FCA8> <FCA8> <9774> <FCA9> <FCA9> <FA0B> <FCAA> <FCAA> <64F4> <FCAB> <FCAB> <652B> <FCAC> <FCAD> <78BA> <FCAE> <FCAE> <7A6B> endbfrange 100 beginbfrange <FCAF> <FCAF> <4E38> <FCB0> <FCB0> <559A> <FCB1> <FCB1> <5950> <FCB2> <FCB2> <5BA6> <FCB3> <FCB3> <5E7B> <FCB4> <FCB4> <60A3> <FCB5> <FCB5> <63DB> <FCB6> <FCB6> <6B61> <FCB7> <FCB7> <6665> <FCB8> <FCB8> <6853> <FCB9> <FCB9> <6E19> <FCBA> <FCBA> <7165> <FCBB> <FCBB> <74B0> <FCBC> <FCBC> <7D08> <FCBD> <FCBD> <9084> <FCBE> <FCBE> <9A69> <FCBF> <FCBF> <9C25> <FCC0> <FCC0> <6D3B> <FCC1> <FCC1> <6ED1> <FCC2> <FCC2> <733E> <FCC3> <FCC3> <8C41> <FCC4> <FCC4> <95CA> <FCC5> <FCC5> <51F0> <FCC6> <FCC6> <5E4C> <FCC7> <FCC7> <5FA8> <FCC8> <FCC8> <604D> <FCC9> <FCC9> <60F6> <FCCA> <FCCA> <6130> <FCCB> <FCCB> <614C> <FCCC> <FCCD> <6643> <FCCE> <FCCE> <69A5> <FCCF> <FCCF> <6CC1> <FCD0> <FCD0> <6E5F> <FCD1> <FCD1> <6EC9> <FCD2> <FCD2> <6F62> <FCD3> <FCD3> <714C> <FCD4> <FCD4> <749C> <FCD5> <FCD5> <7687> <FCD6> <FCD6> <7BC1> <FCD7> <FCD7> <7C27> <FCD8> <FCD8> <8352> <FCD9> <FCD9> <8757> <FCDA> <FCDA> <9051> <FCDB> <FCDB> <968D> <FCDC> <FCDC> <9EC3> <FCDD> <FCDD> <532F> <FCDE> <FCDE> <56DE> <FCDF> <FCDF> <5EFB> <FCE0> <FCE0> <5F8A> <FCE1> <FCE1> <6062> <FCE2> <FCE2> <6094> <FCE3> <FCE3> <61F7> <FCE4> <FCE4> <6666> <FCE5> <FCE5> <6703> <FCE6> <FCE6> <6A9C> <FCE7> <FCE7> <6DEE> <FCE8> <FCE8> <6FAE> <FCE9> <FCE9> <7070> <FCEA> <FCEA> <736A> <FCEB> <FCEB> <7E6A> <FCEC> <FCEC> <81BE> <FCED> <FCED> <8334> <FCEE> <FCEE> <86D4> <FCEF> <FCEF> <8AA8> <FCF0> <FCF0> <8CC4> <FCF1> <FCF1> <5283> <FCF2> <FCF2> <7372> <FCF3> <FCF3> <5B96> <FCF4> <FCF4> <6A6B> <FCF5> <FCF5> <9404> <FCF6> <FCF6> <54EE> <FCF7> <FCF7> <5686> <FCF8> <FCF8> <5B5D> <FCF9> <FCF9> <6548> <FCFA> <FCFA> <6585> <FCFB> <FCFB> <66C9> <FCFC> <FCFC> <689F> <FCFD> <FCFD> <6D8D> <FCFE> <FCFE> <6DC6> <FDA1> <FDA1> <723B> <FDA2> <FDA2> <80B4> <FDA3> <FDA3> <9175> <FDA4> <FDA4> <9A4D> <FDA5> <FDA5> <4FAF> <FDA6> <FDA6> <5019> <FDA7> <FDA7> <539A> <FDA8> <FDA8> <540E> <FDA9> <FDA9> <543C> <FDAA> <FDAA> <5589> <FDAB> <FDAB> <55C5> <FDAC> <FDAC> <5E3F> <FDAD> <FDAD> <5F8C> <FDAE> <FDAE> <673D> <FDAF> <FDAF> <7166> <FDB0> <FDB0> <73DD> <FDB1> <FDB1> <9005> <FDB2> <FDB2> <52DB> <FDB3> <FDB3> <52F3> <FDB4> <FDB4> <5864> <FDB5> <FDB5> <58CE> endbfrange 72 beginbfrange <FDB6> <FDB6> <7104> <FDB7> <FDB7> <718F> <FDB8> <FDB8> <71FB> <FDB9> <FDB9> <85B0> <FDBA> <FDBA> <8A13> <FDBB> <FDBB> <6688> <FDBC> <FDBC> <85A8> <FDBD> <FDBD> <55A7> <FDBE> <FDBE> <6684> <FDBF> <FDBF> <714A> <FDC0> <FDC0> <8431> <FDC1> <FDC1> <5349> <FDC2> <FDC2> <5599> <FDC3> <FDC3> <6BC1> <FDC4> <FDC4> <5F59> <FDC5> <FDC5> <5FBD> <FDC6> <FDC6> <63EE> <FDC7> <FDC7> <6689> <FDC8> <FDC8> <7147> <FDC9> <FDC9> <8AF1> <FDCA> <FDCA> <8F1D> <FDCB> <FDCB> <9EBE> <FDCC> <FDCC> <4F11> <FDCD> <FDCD> <643A> <FDCE> <FDCE> <70CB> <FDCF> <FDCF> <7566> <FDD0> <FDD0> <8667> <FDD1> <FDD1> <6064> <FDD2> <FDD2> <8B4E> <FDD3> <FDD3> <9DF8> <FDD4> <FDD4> <5147> <FDD5> <FDD5> <51F6> <FDD6> <FDD6> <5308> <FDD7> <FDD7> <6D36> <FDD8> <FDD8> <80F8> <FDD9> <FDD9> <9ED1> <FDDA> <FDDA> <6615> <FDDB> <FDDB> <6B23> <FDDC> <FDDC> <7098> <FDDD> <FDDD> <75D5> <FDDE> <FDDE> <5403> <FDDF> <FDDF> <5C79> <FDE0> <FDE0> <7D07> <FDE1> <FDE1> <8A16> <FDE2> <FDE2> <6B20> <FDE3> <FDE3> <6B3D> <FDE4> <FDE4> <6B46> <FDE5> <FDE5> <5438> <FDE6> <FDE6> <6070> <FDE7> <FDE7> <6D3D> <FDE8> <FDE8> <7FD5> <FDE9> <FDE9> <8208> <FDEA> <FDEA> <50D6> <FDEB> <FDEB> <51DE> <FDEC> <FDEC> <559C> <FDED> <FDED> <566B> <FDEE> <FDEE> <56CD> <FDEF> <FDEF> <59EC> <FDF0> <FDF0> <5B09> <FDF1> <FDF1> <5E0C> <FDF2> <FDF2> <6199> <FDF3> <FDF3> <6198> <FDF4> <FDF4> <6231> <FDF5> <FDF5> <665E> <FDF6> <FDF6> <66E6> <FDF7> <FDF7> <7199> <FDF8> <FDF9> <71B9> <FDFA> <FDFA> <72A7> <FDFB> <FDFB> <79A7> <FDFC> <FDFC> <7A00> <FDFD> <FDFD> <7FB2> <FDFE> <FDFE> <8A70> endbfrange endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF \ No newline at end of file
diff --git a/src/main/resources/Resources/cmap/Katakana b/src/main/resources/Resources/cmap/Katakana
new file mode 100644
index 0000000..4e98138
--- /dev/null
+++ b/src/main/resources/Resources/cmap/Katakana
@@ -0,0 +1,62 @@
+%!PS-Adobe-3.0 Resource-CMap
+%%DocumentNeededResources: ProcSet (CIDInit)
+%%IncludeResource: ProcSet (CIDInit)
+%%BeginResource: CMap (Katakana)
+%%Title: (Katakana Adobe Japan1 0)
+%%Version: 6.001
+%%Copyright: -----------------------------------------------------------
+%%Copyright: Copyright 1990-1997 Adobe Systems Incorporated.
+%%Copyright: All Rights Reserved.
+%%Copyright:
+%%Copyright: Patents Pending
+%%Copyright:
+%%Copyright: NOTICE: All information contained herein is the property
+%%Copyright: of Adobe Systems Incorporated.
+%%Copyright:
+%%Copyright: Permission is granted for redistribution of this file
+%%Copyright: provided this copyright notice is maintained intact and
+%%Copyright: that the contents of this file are not altered in any
+%%Copyright: way from its original form.
+%%Copyright:
+%%Copyright: PostScript and Display PostScript are trademarks of
+%%Copyright: Adobe Systems Incorporated which may be registered in
+%%Copyright: certain jurisdictions.
+%%Copyright: -----------------------------------------------------------
+%%EndComments
+
+/CIDInit /ProcSet findresource begin
+
+12 dict begin
+
+begincmap
+
+/CIDSystemInfo 3 dict dup begin
+ /Registry (Adobe) def
+ /Ordering (Japan1) def
+ /Supplement 0 def
+end def
+
+/CMapName /Katakana def
+/CMapVersion 6.001 def
+/CMapType 1 def
+
+/UIDOffset 864 def
+/XUID [1 10 25350] def
+
+/WMode 0 def
+
+1 begincodespacerange
+ <00> <FF>
+endcodespacerange
+
+2 begincidrange
+<20> <5f> 326
+<60> <7e> 391
+endcidrange
+endcmap
+CMapName currentdict /CMap defineresource pop
+end
+end
+
+%%EndResource
+%%EOF
diff --git a/src/main/resources/Resources/cmap/NWP-H b/src/main/resources/Resources/cmap/NWP-H
new file mode 100644
index 0000000..b0d39a8
--- /dev/null
+++ b/src/main/resources/Resources/cmap/NWP-H
@@ -0,0 +1,839 @@
+%!PS-Adobe-3.0 Resource-CMap
+%%DocumentNeededResources: ProcSet (CIDInit)
+%%IncludeResource: ProcSet (CIDInit)
+%%BeginResource: CMap (NWP-H)
+%%Title: (NWP-H Adobe Japan1 0)
+%%Version: 6.001
+%%Copyright: -----------------------------------------------------------
+%%Copyright: Copyright 1990-1997 Adobe Systems Incorporated.
+%%Copyright: All Rights Reserved.
+%%Copyright:
+%%Copyright: Patents Pending
+%%Copyright:
+%%Copyright: NOTICE: All information contained herein is the property
+%%Copyright: of Adobe Systems Incorporated.
+%%Copyright:
+%%Copyright: Permission is granted for redistribution of this file
+%%Copyright: provided this copyright notice is maintained intact and
+%%Copyright: that the contents of this file are not altered in any
+%%Copyright: way from its original form.
+%%Copyright:
+%%Copyright: PostScript and Display PostScript are trademarks of
+%%Copyright: Adobe Systems Incorporated which may be registered in
+%%Copyright: certain jurisdictions.
+%%Copyright: -----------------------------------------------------------
+%%EndComments
+
+/CIDInit /ProcSet findresource begin
+
+12 dict begin
+
+begincmap
+
+/CIDSystemInfo 3 dict dup begin
+ /Registry (Adobe) def
+ /Ordering (Japan1) def
+ /Supplement 0 def
+end def
+
+/CMapName /NWP-H def
+/CMapVersion 6.001 def
+/CMapType 1 def
+
+/XUID [1 10 25336] def
+
+/WMode 0 def
+
+1 begincodespacerange
+ <2121> <7E7E>
+endcodespacerange
+
+100 begincidrange
+<2121> <2168> 633
+<2169> <2169> 7478
+<216a> <217e> 706
+<2221> <222e> 727
+<223a> <2241> 741
+<224a> <2250> 749
+<225c> <226a> 756
+<2272> <2279> 771
+<227e> <227e> 779
+<2330> <2339> 780
+<2341> <235a> 790
+<2361> <237a> 816
+<2421> <2473> 842
+<2521> <2576> 925
+<2621> <2638> 1011
+<2641> <2658> 1035
+<2721> <2741> 1059
+<2751> <2771> 1092
+<2921> <295f> 232
+<2960> <2960> 390
+<2961> <297e> 296
+<2a21> <2a5f> 327
+<2a60> <2a7e> 391
+<2b21> <2b71> 422
+<2b72> <2b72> 295
+<2b73> <2b7e> 503
+<2c24> <2c6f> 7479
+<2d21> <2d3e> 7555
+<2d40> <2d56> 7585
+<2d60> <2d6f> 7608
+<2d70> <2d70> 762
+<2d71> <2d71> 761
+<2d72> <2d72> 769
+<2d73> <2d79> 7624
+<2d7a> <2d7a> 768
+<2d7b> <2d7c> 7631
+<2e21> <2e21> 642
+<2e22> <2e22> 673
+<2e23> <2e23> 773
+<2e24> <2e24> 712
+<2e25> <2e25> 715
+<2e26> <2e26> 717
+<2e27> <2e27> 671
+<2e28> <2e29> 674
+<2e2a> <2e2a> 718
+<2e2b> <2e2b> 692
+<2e2c> <2e2c> 636
+<2e2d> <2e2d> 693
+<2e2e> <2e2e> 637
+<2e2f> <2e2f> 663
+<2e30> <2e39> 780
+<2e3a> <2e3b> 639
+<2e3c> <2e3c> 699
+<2e3d> <2e3d> 697
+<2e3e> <2e3e> 700
+<2e3f> <2e3f> 641
+<2e40> <2e40> 719
+<2e41> <2e5a> 790
+<2e5b> <2e5b> 678
+<2e5c> <2e5c> 711
+<2e5d> <2e5d> 679
+<2e5e> <2e5e> 648
+<2e5f> <2e5f> 650
+<2e60> <2e60> 646
+<2e61> <2e7a> 816
+<2e7b> <2e7b> 680
+<2e7c> <2e7c> 667
+<2e7d> <2e7d> 681
+<2e7e> <2e7e> 649
+<2f21> <2f21> 635
+<2f22> <2f23> 686
+<2f24> <2f24> 634
+<2f25> <2f25> 638
+<2f26> <2f26> 1006
+<2f27> <2f27> 925
+<2f28> <2f28> 927
+<2f29> <2f29> 929
+<2f2a> <2f2a> 931
+<2f2b> <2f2b> 933
+<2f2c> <2f2c> 991
+<2f2d> <2f2d> 993
+<2f2e> <2f2e> 995
+<2f2f> <2f2f> 959
+<2f30> <2f30> 660
+<2f31> <2f31> 926
+<2f32> <2f32> 928
+<2f33> <2f33> 930
+<2f34> <2f34> 932
+<2f35> <2f36> 934
+<2f37> <2f37> 937
+<2f38> <2f38> 939
+<2f39> <2f39> 941
+<2f3a> <2f3a> 943
+<2f3b> <2f3b> 945
+<2f3c> <2f3c> 947
+<2f3d> <2f3d> 949
+<2f3e> <2f3e> 951
+<2f3f> <2f3f> 953
+<2f40> <2f40> 955
+<2f41> <2f41> 957
+endcidrange
+
+100 begincidrange
+<2f42> <2f42> 960
+<2f43> <2f43> 962
+<2f44> <2f44> 964
+<2f45> <2f4a> 966
+<2f4b> <2f4b> 974
+<2f4c> <2f4c> 977
+<2f4d> <2f4d> 980
+<2f4e> <2f4e> 983
+<2f4f> <2f53> 986
+<2f54> <2f54> 992
+<2f55> <2f55> 994
+<2f56> <2f5b> 996
+<2f5c> <2f5c> 1003
+<2f5d> <2f5d> 1007
+<2f5e> <2f5f> 643
+<2f60> <2f61> 1004
+<2f62> <2f62> 1002
+<2f63> <2f64> 1009
+<2f65> <2f65> 1008
+<2f66> <2f66> 936
+<2f67> <2f67> 938
+<2f68> <2f68> 940
+<2f69> <2f69> 942
+<2f6a> <2f6a> 944
+<2f6b> <2f6b> 946
+<2f6c> <2f6c> 948
+<2f6d> <2f6d> 950
+<2f6e> <2f6e> 952
+<2f6f> <2f6f> 954
+<2f70> <2f70> 956
+<2f71> <2f71> 958
+<2f72> <2f72> 961
+<2f73> <2f73> 963
+<2f74> <2f74> 965
+<2f75> <2f76> 972
+<2f77> <2f78> 975
+<2f79> <2f7a> 978
+<2f7b> <2f7c> 981
+<2f7d> <2f7e> 984
+<3021> <3021> 1125
+<3022> <3022> 7633
+<3023> <3032> 1127
+<3033> <3033> 7330
+<3034> <303a> 1144
+<303b> <303b> 7634
+<303c> <306d> 1152
+<306e> <306e> 7635
+<306f> <3072> 1203
+<3073> <3073> 7636
+<3074> <307b> 1208
+<307c> <307c> 7637
+<307d> <307e> 1217
+<3121> <3129> 1219
+<312a> <312a> 7638
+<312b> <3134> 1229
+<3135> <3135> 7639
+<3136> <3138> 1240
+<3139> <3139> 7640
+<313a> <313b> 1244
+<313c> <313d> 7641
+<313e> <3141> 1248
+<3142> <3142> 7643
+<3143> <316a> 1253
+<316b> <316b> 7644
+<316c> <317e> 1294
+<3221> <3227> 1313
+<3228> <3228> 7645
+<3229> <3229> 7369
+<322a> <322a> 7646
+<322b> <325f> 1323
+<3260> <3260> 7647
+<3261> <3279> 1377
+<327a> <327a> 7648
+<327b> <327c> 1403
+<327d> <327d> 7649
+<327e> <327e> 1406
+<3321> <3321> 1407
+<3322> <3322> 7650
+<3323> <3341> 1409
+<3342> <3342> 6497
+<3343> <3348> 1441
+<3349> <3349> 5023
+<334a> <3364> 1448
+<3365> <3365> 7651
+<3366> <336a> 1476
+<336b> <336b> 7652
+<336c> <3372> 1482
+<3373> <3373> 7653
+<3374> <3375> 1490
+<3376> <3376> 5937
+<3377> <3379> 1493
+<337a> <337a> 7654
+<337b> <337e> 1497
+<3421> <3441> 1501
+<3442> <3442> 7655
+<3443> <3443> 5490
+<3444> <344c> 1536
+<344d> <344d> 7656
+<344e> <3451> 1546
+<3452> <3452> 6688
+endcidrange
+
+100 begincidrange
+<3453> <3464> 1551
+<3465> <3465> 7657
+<3466> <347e> 1570
+<3521> <352a> 1595
+<352b> <352b> 7658
+<352c> <353f> 1606
+<3540> <3540> 7659
+<3541> <357e> 1627
+<3621> <3621> 1689
+<3622> <3622> 7660
+<3623> <3629> 1691
+<362a> <362a> 7661
+<362b> <3645> 1699
+<3646> <3646> 7474
+<3647> <364e> 1727
+<364f> <364f> 7662
+<3650> <366c> 1736
+<366d> <366d> 7663
+<366e> <3673> 1766
+<3674> <3674> 7664
+<3675> <367a> 1773
+<367b> <367b> 7665
+<367c> <367c> 1780
+<367d> <367d> 7666
+<367e> <367e> 1782
+<3721> <3723> 1783
+<3724> <3724> 7667
+<3725> <3736> 1787
+<3737> <3737> 7668
+<3738> <3744> 1806
+<3745> <3745> 7669
+<3746> <374d> 1820
+<374e> <374e> 7670
+<374f> <3751> 1829
+<3752> <3752> 7671
+<3753> <3754> 1833
+<3755> <3755> 7672
+<3756> <375a> 1836
+<375b> <375b> 7181
+<375c> <3763> 1842
+<3764> <3764> 7673
+<3765> <3770> 1851
+<3771> <3771> 7674
+<3772> <3778> 1864
+<3779> <3779> 7675
+<377a> <377d> 1872
+<377e> <377e> 7676
+<3821> <3833> 1877
+<3834> <3834> 7677
+<3835> <3840> 1897
+<3841> <3841> 7678
+<3842> <387e> 1910
+<3921> <392a> 1971
+<392b> <392b> 7679
+<392c> <3936> 1982
+<3937> <3937> 7680
+<3938> <3941> 1994
+<3942> <3942> 7681
+<3943> <395b> 2005
+<395c> <395c> 5853
+<395d> <396c> 2031
+<396d> <396d> 7682
+<396e> <3973> 2048
+<3974> <3974> 7683
+<3975> <3978> 2055
+<3979> <3979> 7684
+<397a> <397e> 2060
+<3a21> <3a52> 2065
+<3a53> <3a53> 7685
+<3a54> <3a66> 2116
+<3a67> <3a67> 7686
+<3a68> <3a73> 2136
+<3a74> <3a74> 7687
+<3a75> <3a7e> 2149
+<3b21> <3b26> 2159
+<3b27> <3b27> 7688
+<3b28> <3b29> 2166
+<3b2a> <3b2a> 7689
+<3b2b> <3b2b> 2169
+<3b2c> <3b2c> 7690
+<3b2d> <3b38> 2171
+<3b39> <3b39> 7691
+<3b3a> <3b7e> 2184
+<3c21> <3c37> 2253
+<3c38> <3c38> 7692
+<3c39> <3c47> 2277
+<3c48> <3c48> 7693
+<3c49> <3c49> 6441
+<3c4a> <3c56> 2294
+<3c57> <3c57> 7694
+<3c58> <3c5c> 2308
+<3c5d> <3c5e> 7695
+<3c5f> <3c7e> 2315
+<3d21> <3d2a> 2347
+<3d2b> <3d2b> 7697
+<3d2c> <3d35> 2358
+<3d36> <3d36> 7698
+<3d37> <3d6b> 2369
+<3d6c> <3d6d> 7699
+<3d6e> <3d71> 2424
+endcidrange
+
+100 begincidrange
+<3d72> <3d73> 7701
+<3d74> <3d7e> 2430
+<3e21> <3e24> 2441
+<3e25> <3e25> 7703
+<3e26> <3e32> 2446
+<3e33> <3e33> 7704
+<3e34> <3e3e> 2460
+<3e3f> <3e3f> 7705
+<3e40> <3e54> 2472
+<3e55> <3e55> 7706
+<3e56> <3e5e> 2494
+<3e5f> <3e5f> 7707
+<3e60> <3e63> 2504
+<3e64> <3e64> 7708
+<3e65> <3e7e> 2509
+<3f21> <3f29> 2535
+<3f2a> <3f2a> 7709
+<3f2b> <3f58> 2545
+<3f59> <3f59> 7710
+<3f5a> <3f5f> 2592
+<3f60> <3f60> 7711
+<3f61> <3f68> 2599
+<3f69> <3f69> 7712
+<3f6a> <3f7e> 2608
+<4021> <4021> 2629
+<4022> <4022> 7713
+<4023> <4041> 2631
+<4042> <4042> 7714
+<4043> <4065> 2663
+<4066> <4066> 7715
+<4067> <4070> 2699
+<4071> <4072> 7716
+<4073> <4078> 2711
+<4079> <407a> 7718
+<407b> <407e> 2719
+<4121> <4126> 2723
+<4127> <4127> 7720
+<4128> <4128> 6766
+<4129> <4138> 2731
+<4139> <4139> 7721
+<413a> <414b> 2748
+<414c> <414c> 7722
+<414d> <414e> 2767
+<414f> <414f> 7723
+<4150> <415e> 2770
+<415f> <415f> 7724
+<4160> <4168> 2786
+<4169> <4169> 7725
+<416a> <417e> 2796
+<4221> <423c> 2817
+<423d> <423d> 7726
+<423e> <424c> 2846
+<424d> <424d> 7727
+<424e> <425b> 2862
+<425c> <425c> 7728
+<425d> <4262> 2877
+<4263> <4263> 7729
+<4264> <426e> 2884
+<426f> <426f> 7730
+<4270> <4274> 2896
+<4275> <4276> 7731
+<4277> <427c> 2903
+<427d> <427d> 7733
+<427e> <427e> 2910
+<4321> <4326> 2911
+<4327> <4327> 7734
+<4328> <4328> 2918
+<4329> <432a> 7735
+<432b> <432c> 2921
+<432d> <432e> 7737
+<432f> <433c> 2925
+<433d> <433d> 7739
+<433e> <436f> 2940
+<4370> <4370> 7740
+<4371> <4374> 2991
+<4375> <4375> 7741
+<4376> <437b> 2996
+<437c> <437c> 7742
+<437d> <437e> 3003
+<4421> <443c> 3005
+<443d> <443d> 7743
+<443e> <4447> 3034
+<4448> <4448> 7744
+<4449> <4449> 3045
+<444a> <444a> 7745
+<444b> <444c> 3047
+<444d> <444d> 7746
+<444e> <444e> 3050
+<444f> <444f> 7747
+<4450> <445a> 3052
+<445b> <445b> 4533
+<445c> <447e> 3064
+<4521> <4521> 3099
+<4522> <4522> 7748
+<4523> <4526> 3101
+<4527> <4527> 7749
+<4528> <452d> 3106
+<452e> <452e> 7750
+<452f> <4535> 3113
+<4536> <4536> 7751
+endcidrange
+
+100 begincidrange
+<4537> <453e> 3121
+<453f> <453f> 7752
+<4540> <4547> 3130
+<4548> <4548> 7753
+<4549> <454a> 3139
+<454b> <454b> 7754
+<454c> <4550> 3142
+<4551> <4552> 7755
+<4553> <4556> 3149
+<4557> <4557> 5855
+<4558> <4563> 3154
+<4564> <4564> 7757
+<4565> <456d> 3167
+<456e> <456e> 5200
+<456f> <4572> 3177
+<4573> <4573> 5430
+<4574> <4577> 3182
+<4578> <4578> 7758
+<4579> <457e> 3187
+<4621> <463d> 3193
+<463e> <463e> 7759
+<463f> <4641> 3223
+<4642> <4642> 7760
+<4643> <4653> 3227
+<4654> <4655> 7761
+<4656> <465a> 3246
+<465b> <465c> 7763
+<465d> <4660> 3253
+<4661> <4661> 7765
+<4662> <4665> 3258
+<4666> <4667> 7766
+<4668> <4669> 3264
+<466a> <466a> 7768
+<466b> <4675> 3267
+<4676> <4676> 6893
+<4677> <467e> 3279
+<4721> <4728> 3287
+<4729> <4729> 7769
+<472a> <4738> 3296
+<4739> <4739> 7770
+<473a> <4756> 3312
+<4757> <4757> 7771
+<4758> <4766> 3342
+<4767> <4767> 7772
+<4768> <4768> 6537
+<4769> <4769> 7773
+<476a> <476c> 3360
+<476d> <476d> 7774
+<476e> <477e> 3364
+<4821> <4823> 3381
+<4824> <4824> 7775
+<4825> <482d> 3385
+<482e> <482e> 7776
+<482f> <482f> 3395
+<4830> <4830> 7777
+<4831> <4853> 3397
+<4854> <4854> 7778
+<4855> <4861> 3433
+<4862> <4862> 7779
+<4863> <4874> 3447
+<4875> <4875> 7780
+<4876> <487e> 3466
+<4921> <4921> 3475
+<4922> <4923> 7781
+<4924> <492e> 3478
+<492f> <492f> 7783
+<4930> <4930> 5179
+<4931> <4931> 3491
+<4932> <4932> 7784
+<4933> <4934> 3493
+<4935> <4935> 7785
+<4936> <493f> 3496
+<4940> <4940> 7786
+<4941> <494d> 3507
+<494e> <494e> 7787
+<494f> <4950> 3521
+<4951> <4951> 7788
+<4952> <497e> 3524
+<4a21> <4a42> 3569
+<4a43> <4a43> 7789
+<4a44> <4a4c> 3604
+<4a4d> <4a4d> 7790
+<4a4e> <4a59> 3614
+<4a5a> <4a5a> 7791
+<4a5b> <4a78> 3627
+<4a79> <4a79> 7792
+<4a7a> <4a7e> 3658
+<4b21> <4b21> 3663
+<4b22> <4b22> 7793
+<4b23> <4b28> 3665
+<4b29> <4b29> 7794
+<4b2a> <4b4a> 3672
+<4b4b> <4b4b> 7795
+<4b4c> <4b69> 3706
+<4b6a> <4b6a> 7475
+<4b6b> <4b6f> 3737
+<4b70> <4b70> 7796
+<4b71> <4b78> 3743
+<4b79> <4b79> 4143
+<4b7a> <4b7e> 3752
+endcidrange
+
+100 begincidrange
+<4c21> <4c4c> 3757
+<4c4d> <4c4d> 7797
+<4c4e> <4c58> 3802
+<4c59> <4c59> 7798
+<4c5a> <4c5e> 3814
+<4c5f> <4c5f> 7799
+<4c60> <4c61> 3820
+<4c62> <4c62> 7800
+<4c63> <4c78> 3823
+<4c79> <4c79> 6453
+<4c7a> <4c7a> 7801
+<4c7b> <4c7b> 3847
+<4c7c> <4c7c> 7802
+<4c7d> <4c7d> 3849
+<4c7e> <4c7e> 7803
+<4d21> <4d31> 3851
+<4d32> <4d32> 7804
+<4d33> <4d4f> 3869
+<4d50> <4d50> 7805
+<4d51> <4d53> 3899
+<4d54> <4d54> 7806
+<4d55> <4d59> 3903
+<4d5a> <4d5a> 7476
+<4d5b> <4d68> 3909
+<4d69> <4d69> 7807
+<4d6a> <4d7e> 3924
+<4e21> <4e4a> 3945
+<4e4b> <4e4b> 7808
+<4e4c> <4e79> 3988
+<4e7a> <4e7b> 7809
+<4e7c> <4e7e> 4036
+<4f21> <4f21> 7811
+<4f22> <4f30> 4040
+<4f31> <4f31> 7812
+<4f32> <4f35> 4056
+<4f36> <4f36> 6007
+<4f37> <4f38> 4061
+<4f39> <4f39> 7813
+<4f3a> <4f53> 4064
+<5021> <5055> 4090
+<5056> <5056> 3751
+<5057> <507e> 4144
+<5121> <513c> 4184
+<513d> <513d> 7814
+<513e> <5146> 4213
+<5147> <5147> 7815
+<5148> <514a> 4223
+<514b> <514b> 7816
+<514c> <514c> 4227
+<514d> <514d> 7817
+<514e> <517e> 4229
+<5221> <527e> 4278
+<5321> <532f> 4372
+<5330> <5330> 7818
+<5331> <5339> 4388
+<533a> <533a> 7819
+<533b> <534f> 4398
+<5350> <5350> 7820
+<5351> <535d> 4420
+<535e> <535e> 7821
+<535f> <536a> 4434
+<536b> <536b> 7822
+<536c> <537e> 4447
+<5421> <5443> 4466
+<5444> <5444> 7823
+<5445> <5463> 4502
+<5464> <5464> 3063
+<5465> <547e> 4534
+<5521> <553c> 4560
+<553d> <553d> 7824
+<553e> <5562> 4589
+<5563> <5563> 7825
+<5564> <557e> 4627
+<5621> <5621> 4654
+<5622> <5622> 7826
+<5623> <5671> 4656
+<5672> <5672> 7827
+<5673> <567e> 4736
+<5721> <577e> 4748
+<5821> <5823> 4842
+<5824> <5824> 7828
+<5825> <587e> 4846
+<5921> <595f> 4936
+<5960> <5960> 7829
+<5961> <596b> 5000
+<596c> <596c> 7830
+<596d> <5977> 5012
+<5978> <5978> 1447
+<5979> <597e> 5024
+<5a21> <5a38> 5030
+<5a39> <5a39> 7831
+<5a3a> <5a4c> 5055
+<5a4d> <5a4d> 7832
+<5a4e> <5a7e> 5075
+<5b21> <5b44> 5124
+<5b45> <5b45> 7833
+<5b46> <5b49> 5161
+<5b4a> <5b4a> 7834
+<5b4b> <5b57> 5166
+<5b58> <5b58> 3490
+endcidrange
+
+100 begincidrange
+<5b59> <5b6a> 5180
+<5b6b> <5b6b> 7835
+<5b6c> <5b6c> 5199
+<5b6d> <5b6d> 3176
+<5b6e> <5b73> 5201
+<5b74> <5b74> 7836
+<5b75> <5b7e> 5208
+<5c21> <5c7e> 5218
+<5d21> <5d7e> 5312
+<5e21> <5e38> 5406
+<5e39> <5e39> 3181
+<5e3a> <5e4f> 5431
+<5e50> <5e50> 7837
+<5e51> <5e74> 5454
+<5e75> <5e75> 1535
+<5e76> <5e7e> 5491
+<5f21> <5f72> 5500
+<5f73> <5f73> 7838
+<5f74> <5f7e> 5583
+<6021> <6025> 5594
+<6026> <6026> 7839
+<6027> <605e> 5600
+<605f> <605f> 7840
+<6060> <6075> 5657
+<6076> <6076> 7477
+<6077> <607e> 5680
+<6121> <612a> 5688
+<612b> <612b> 7841
+<612c> <612f> 5699
+<6130> <6131> 7842
+<6132> <617e> 5705
+<6221> <622a> 5782
+<622b> <622b> 7844
+<622c> <6267> 5793
+<6268> <6268> 2030
+<6269> <6269> 5854
+<626a> <626a> 3153
+<626b> <626e> 5856
+<626f> <626f> 7845
+<6270> <627e> 5861
+<6321> <6349> 5876
+<634a> <634a> 7846
+<634b> <6353> 5918
+<6354> <6354> 7847
+<6355> <635d> 5928
+<635e> <635e> 1492
+<635f> <637e> 5938
+<6421> <6438> 5970
+<6439> <6439> 7848
+<643a> <6445> 5995
+<6446> <6446> 4060
+<6447> <6463> 6008
+<6464> <6464> 7849
+<6465> <646d> 6038
+<646e> <646e> 7850
+<646f> <647e> 6048
+<6521> <6538> 6064
+<6539> <6539> 7851
+<653a> <653a> 6089
+<653b> <653b> 7852
+<653c> <6545> 6091
+<6546> <6546> 7853
+<6547> <657e> 6102
+<6621> <6645> 6158
+<6646> <6646> 7854
+<6647> <667e> 6196
+<6721> <6763> 6252
+<6764> <6764> 7855
+<6765> <6768> 6320
+<6769> <6769> 7856
+<676a> <6771> 6325
+<6772> <6772> 7857
+<6773> <677e> 6334
+<6821> <6833> 6346
+<6834> <6834> 7858
+<6835> <683a> 6366
+<683b> <683b> 7859
+<683c> <6873> 6373
+<6874> <6874> 7860
+<6875> <687e> 6430
+<6921> <6921> 6440
+<6922> <6922> 2293
+<6923> <692d> 6442
+<692e> <692e> 3845
+<692f> <693b> 6454
+<693c> <693c> 7861
+<693d> <6959> 6468
+<695a> <695a> 1440
+<695b> <697e> 6498
+<6a21> <6a23> 6534
+<6a24> <6a24> 3358
+<6a25> <6a26> 6538
+<6a27> <6a27> 7862
+<6a28> <6a3c> 6541
+<6a3d> <6a3d> 7863
+<6a3e> <6a6e> 6563
+<6a6f> <6a6f> 7864
+<6a70> <6a7e> 6613
+<6b21> <6b31> 6628
+<6b32> <6b32> 7865
+endcidrange
+
+59 begincidrange
+<6b33> <6b5c> 6646
+<6b5d> <6b5d> 1550
+<6b5e> <6b65> 6689
+<6b66> <6b66> 7866
+<6b67> <6b75> 6698
+<6b76> <6b76> 7867
+<6b77> <6b7e> 6714
+<6c21> <6c4c> 6722
+<6c4d> <6c4d> 2730
+<6c4e> <6c68> 6767
+<6c69> <6c69> 7868
+<6c6a> <6c73> 6795
+<6c74> <6c74> 7869
+<6c75> <6c7e> 6806
+<6d21> <6d4d> 6816
+<6d4e> <6d4e> 7870
+<6d4f> <6d6b> 6862
+<6d6c> <6d6c> 7871
+<6d6d> <6d6d> 6892
+<6d6e> <6d6e> 7872
+<6d6f> <6d7e> 6894
+<6e21> <6e28> 6910
+<6e29> <6e29> 7873
+<6e2a> <6e3c> 6919
+<6e3d> <6e3d> 7874
+<6e3e> <6e56> 6939
+<6e57> <6e57> 7875
+<6e58> <6e7e> 6965
+<6f21> <6f64> 7004
+<6f65> <6f65> 7876
+<6f66> <6f7e> 7073
+<7021> <7032> 7098
+<7033> <7033> 7877
+<7034> <7044> 7117
+<7045> <7045> 7878
+<7046> <7050> 7135
+<7051> <7051> 7879
+<7052> <7056> 7147
+<7057> <7057> 7880
+<7058> <7073> 7153
+<7074> <7074> 1841
+<7075> <7075> 7881
+<7076> <707e> 7183
+<7121> <717e> 7192
+<7221> <722c> 7286
+<722d> <722d> 7882
+<722e> <723b> 7299
+<723c> <723c> 7883
+<723d> <724c> 7314
+<724d> <724d> 1143
+<724e> <724e> 7884
+<724f> <7273> 7332
+<7274> <7274> 1321
+<7275> <727e> 7370
+<7321> <7350> 7380
+<7351> <7351> 7885
+<7352> <737c> 7429
+<737d> <737d> 7886
+<737e> <737e> 7473
+endcidrange
+endcmap
+CMapName currentdict /CMap defineresource pop
+end
+end
+
+%%EndResource
+%%EOF
diff --git a/src/main/resources/Resources/cmap/NWP-V b/src/main/resources/Resources/cmap/NWP-V
new file mode 100644
index 0000000..c8ab775
--- /dev/null
+++ b/src/main/resources/Resources/cmap/NWP-V
@@ -0,0 +1,107 @@
+%!PS-Adobe-3.0 Resource-CMap
+%%DocumentNeededResources: ProcSet (CIDInit)
+%%DocumentNeededResources: CMap (NWP-H)
+%%IncludeResource: ProcSet (CIDInit)
+%%IncludeResource: CMap (NWP-H)
+%%BeginResource: CMap (NWP-V)
+%%Title: (NWP-V Adobe Japan1 0)
+%%Version: 6.001
+%%Copyright: -----------------------------------------------------------
+%%Copyright: Copyright 1990-1997 Adobe Systems Incorporated.
+%%Copyright: All Rights Reserved.
+%%Copyright:
+%%Copyright: Patents Pending
+%%Copyright:
+%%Copyright: NOTICE: All information contained herein is the property
+%%Copyright: of Adobe Systems Incorporated.
+%%Copyright:
+%%Copyright: Permission is granted for redistribution of this file
+%%Copyright: provided this copyright notice is maintained intact and
+%%Copyright: that the contents of this file are not altered in any
+%%Copyright: way from its original form.
+%%Copyright:
+%%Copyright: PostScript and Display PostScript are trademarks of
+%%Copyright: Adobe Systems Incorporated which may be registered in
+%%Copyright: certain jurisdictions.
+%%Copyright: -----------------------------------------------------------
+%%EndComments
+
+/CIDInit /ProcSet findresource begin
+
+12 dict begin
+
+begincmap
+
+/NWP-H usecmap
+
+/CIDSystemInfo 3 dict dup begin
+ /Registry (Adobe) def
+ /Ordering (Japan1) def
+ /Supplement 0 def
+end def
+
+/CMapName /NWP-V def
+/CMapVersion 6.001 def
+/CMapType 1 def
+
+/XUID [1 10 25337] def
+
+/WMode 1 def
+
+48 begincidrange
+<2122> <2123> 7887
+<2124> <2124> 8268
+<2125> <2125> 8274
+<212b> <212b> 8272
+<212c> <212c> 8271
+<213c> <213e> 7891
+<2141> <2145> 7894
+<2146> <2146> 8281
+<2147> <2147> 8276
+<2148> <2148> 8279
+<2149> <2149> 8278
+<214a> <215b> 7899
+<216b> <216b> 8269
+<216c> <216c> 8273
+<216d> <216d> 8283
+<222e> <222e> 8270
+<2421> <2421> 7918
+<2423> <2423> 7919
+<2425> <2425> 7920
+<2427> <2427> 7921
+<2429> <2429> 7922
+<2443> <2443> 7923
+<2463> <2463> 7924
+<2465> <2465> 7925
+<2467> <2467> 7926
+<246e> <246e> 7927
+<2521> <2521> 7928
+<2523> <2523> 7929
+<2525> <2525> 7930
+<2527> <2527> 7931
+<2529> <2529> 7932
+<2543> <2543> 7933
+<2563> <2563> 7934
+<2565> <2565> 7935
+<2567> <2567> 7936
+<256e> <256e> 7937
+<2575> <2576> 7938
+<2d40> <2d4f> 7940
+<2d60> <2d61> 7956
+<2f21> <2f21> 7888
+<2f22> <2f23> 7911
+<2f24> <2f24> 7887
+<2f27> <2f2b> 7928
+<2f2c> <2f2e> 7934
+<2f2f> <2f2f> 7933
+<2f30> <2f30> 7891
+<2f5e> <2f5e> 8272
+<2f5f> <2f5f> 8271
+endcidrange
+endcmap
+CMapName currentdict /CMap defineresource pop
+end
+end
+
+%%EndResource
+%%EOF
diff --git a/src/main/resources/Resources/cmap/RKSJ-H b/src/main/resources/Resources/cmap/RKSJ-H
new file mode 100644
index 0000000..24cf31b
--- /dev/null
+++ b/src/main/resources/Resources/cmap/RKSJ-H
@@ -0,0 +1,192 @@
+%!PS-Adobe-3.0 Resource-CMap
+%%DocumentNeededResources: ProcSet (CIDInit)
+%%IncludeResource: ProcSet (CIDInit)
+%%BeginResource: CMap (RKSJ-H)
+%%Title: (RKSJ-H Adobe Japan1 1)
+%%Version: 5.008
+%%Copyright: -----------------------------------------------------------
+%%Copyright: Copyright 1990-1996 Adobe Systems Incorporated.
+%%Copyright: All Rights Reserved.
+%%Copyright:
+%%Copyright: Patents Pending
+%%Copyright:
+%%Copyright: NOTICE: All information contained herein is the property
+%%Copyright: of Adobe Systems Incorporated.
+%%Copyright:
+%%Copyright: Permission is granted for redistribution of this file
+%%Copyright: provided this copyright notice is maintained intact and
+%%Copyright: that the contents of this file are not altered in any
+%%Copyright: way from its original form.
+%%Copyright:
+%%Copyright: PostScript and Display PostScript are trademarks of
+%%Copyright: Adobe Systems Incorporated which may be registered in
+%%Copyright: certain jurisdictions.
+%%Copyright: -----------------------------------------------------------
+%%EndComments
+
+/CIDInit /ProcSet findresource begin
+
+12 dict begin
+
+begincmap
+
+/CIDSystemInfo 3 dict dup begin
+ /Registry (Adobe) def
+ /Ordering (Japan1) def
+ /Supplement 1 def
+end def
+
+/CMapName /RKSJ-H def
+/CMapVersion 5.008 def
+/CMapType 1 def
+
+/UIDOffset 210 def
+/XUID [1 10 25338] def
+
+/WMode 0 def
+
+4 begincodespacerange
+ <00> <80>
+ <8140> <9FFC>
+ <A0> <DF>
+ <E040> <FCFC>
+endcodespacerange
+
+1 beginnotdefrange
+<00> <1f> 231
+endnotdefrange
+
+100 begincidrange
+<20> <7e> 231
+<8140> <817e> 633
+<8180> <81ac> 696
+<81b8> <81bf> 741
+<81c8> <81ce> 749
+<81da> <81e8> 756
+<81f0> <81f7> 771
+<81fc> <81fc> 779
+<824f> <8258> 780
+<8260> <8279> 790
+<8281> <829a> 816
+<829f> <82f1> 842
+<8340> <837e> 925
+<8380> <8396> 988
+<839f> <83b6> 1011
+<83bf> <83d6> 1035
+<8440> <8460> 1059
+<8470> <847e> 1092
+<8480> <8491> 1107
+<849f> <849f> 7479
+<84a0> <84a0> 7481
+<84a1> <84a1> 7491
+<84a2> <84a2> 7495
+<84a3> <84a3> 7503
+<84a4> <84a4> 7499
+<84a5> <84a5> 7507
+<84a6> <84a6> 7523
+<84a7> <84a7> 7515
+<84a8> <84a8> 7531
+<84a9> <84a9> 7539
+<84aa> <84aa> 7480
+<84ab> <84ab> 7482
+<84ac> <84ac> 7494
+<84ad> <84ad> 7498
+<84ae> <84ae> 7506
+<84af> <84af> 7502
+<84b0> <84b0> 7514
+<84b1> <84b1> 7530
+<84b2> <84b2> 7522
+<84b3> <84b3> 7538
+<84b4> <84b4> 7554
+<84b5> <84b5> 7511
+<84b6> <84b6> 7526
+<84b7> <84b7> 7519
+<84b8> <84b8> 7534
+<84b9> <84b9> 7542
+<84ba> <84ba> 7508
+<84bb> <84bb> 7527
+<84bc> <84bc> 7516
+<84bd> <84bd> 7535
+<84be> <84be> 7545
+<889f> <88fc> 1125
+<8940> <897e> 1219
+<8980> <89fc> 1282
+<8a40> <8a7e> 1407
+<8a80> <8afc> 1470
+<8b40> <8b7e> 1595
+<8b80> <8bfc> 1658
+<8c40> <8c7e> 1783
+<8c80> <8cfc> 1846
+<8d40> <8d7e> 1971
+<8d80> <8dfc> 2034
+<8e40> <8e7e> 2159
+<8e80> <8efc> 2222
+<8f40> <8f7e> 2347
+<8f80> <8ffc> 2410
+<9040> <907e> 2535
+<9080> <90fc> 2598
+<9140> <917e> 2723
+<9180> <91fc> 2786
+<9240> <927e> 2911
+<9280> <92fc> 2974
+<9340> <937e> 3099
+<9380> <93fc> 3162
+<9440> <947e> 3287
+<9480> <94fc> 3350
+<9540> <957e> 3475
+<9580> <95fc> 3538
+<9640> <967e> 3663
+<9680> <96fc> 3726
+<9740> <977e> 3851
+<9780> <97fc> 3914
+<9840> <9872> 4039
+<989f> <98fc> 4090
+<9940> <997e> 4184
+<9980> <99fc> 4247
+<9a40> <9a7e> 4372
+<9a80> <9afc> 4435
+<9b40> <9b7e> 4560
+<9b80> <9bfc> 4623
+<9c40> <9c7e> 4748
+<9c80> <9cfc> 4811
+<9d40> <9d7e> 4936
+<9d80> <9dfc> 4999
+<9e40> <9e7e> 5124
+<9e80> <9efc> 5187
+<9f40> <9f7e> 5312
+<9f80> <9ffc> 5375
+<a0> <df> 326
+<e040> <e07e> 5500
+endcidrange
+
+22 begincidrange
+<e080> <e0fc> 5563
+<e140> <e17e> 5688
+<e180> <e1fc> 5751
+<e240> <e27e> 5876
+<e280> <e2fc> 5939
+<e340> <e37e> 6064
+<e380> <e3fc> 6127
+<e440> <e47e> 6252
+<e480> <e4fc> 6315
+<e540> <e57e> 6440
+<e580> <e5fc> 6503
+<e640> <e67e> 6628
+<e680> <e6fc> 6691
+<e740> <e77e> 6816
+<e780> <e7fc> 6879
+<e840> <e87e> 7004
+<e880> <e8fc> 7067
+<e940> <e97e> 7192
+<e980> <e9fc> 7255
+<ea40> <ea7e> 7380
+<ea80> <eaa2> 7443
+<eaa3> <eaa4> 8284
+endcidrange
+endcmap
+CMapName currentdict /CMap defineresource pop
+end
+end
+
+%%EndResource
+%%EOF
diff --git a/src/main/resources/Resources/cmap/RKSJ-V b/src/main/resources/Resources/cmap/RKSJ-V
new file mode 100644
index 0000000..c8fc71a
--- /dev/null
+++ b/src/main/resources/Resources/cmap/RKSJ-V
@@ -0,0 +1,87 @@
+%!PS-Adobe-3.0 Resource-CMap
+%%DocumentNeededResources: ProcSet (CIDInit)
+%%DocumentNeededResources: CMap (RKSJ-H)
+%%IncludeResource: ProcSet (CIDInit)
+%%IncludeResource: CMap (RKSJ-H)
+%%BeginResource: CMap (RKSJ-V)
+%%Title: (RKSJ-V Adobe Japan1 0)
+%%Version: 6.001
+%%Copyright: -----------------------------------------------------------
+%%Copyright: Copyright 1990-1997 Adobe Systems Incorporated.
+%%Copyright: All Rights Reserved.
+%%Copyright:
+%%Copyright: Patents Pending
+%%Copyright:
+%%Copyright: NOTICE: All information contained herein is the property
+%%Copyright: of Adobe Systems Incorporated.
+%%Copyright:
+%%Copyright: Permission is granted for redistribution of this file
+%%Copyright: provided this copyright notice is maintained intact and
+%%Copyright: that the contents of this file are not altered in any
+%%Copyright: way from its original form.
+%%Copyright:
+%%Copyright: PostScript and Display PostScript are trademarks of
+%%Copyright: Adobe Systems Incorporated which may be registered in
+%%Copyright: certain jurisdictions.
+%%Copyright: -----------------------------------------------------------
+%%EndComments
+
+/CIDInit /ProcSet findresource begin
+
+12 dict begin
+
+begincmap
+
+/RKSJ-H usecmap
+
+/CIDSystemInfo 3 dict dup begin
+ /Registry (Adobe) def
+ /Ordering (Japan1) def
+ /Supplement 0 def
+end def
+
+/CMapName /RKSJ-V def
+/CMapVersion 6.001 def
+/CMapType 1 def
+
+/UIDOffset 840 def
+/XUID [1 10 25339] def
+
+/WMode 1 def
+
+27 begincidrange
+<8141> <8142> 7887
+<8150> <8151> 7889
+<815b> <815d> 7891
+<8160> <8164> 7894
+<8169> <817a> 7899
+<8181> <8181> 7917
+<829f> <829f> 7918
+<82a1> <82a1> 7919
+<82a3> <82a3> 7920
+<82a5> <82a5> 7921
+<82a7> <82a7> 7922
+<82c1> <82c1> 7923
+<82e1> <82e1> 7924
+<82e3> <82e3> 7925
+<82e5> <82e5> 7926
+<82ec> <82ec> 7927
+<8340> <8340> 7928
+<8342> <8342> 7929
+<8344> <8344> 7930
+<8346> <8346> 7931
+<8348> <8348> 7932
+<8362> <8362> 7933
+<8383> <8383> 7934
+<8385> <8385> 7935
+<8387> <8387> 7936
+<838e> <838e> 7937
+<8395> <8396> 7938
+endcidrange
+endcmap
+CMapName currentdict /CMap defineresource pop
+end
+end
+
+%%EndResource
+%%EOF
diff --git a/src/main/resources/Resources/cmap/Roman b/src/main/resources/Resources/cmap/Roman
new file mode 100644
index 0000000..36a0784
--- /dev/null
+++ b/src/main/resources/Resources/cmap/Roman
@@ -0,0 +1,61 @@
+%!PS-Adobe-3.0 Resource-CMap
+%%DocumentNeededResources: ProcSet (CIDInit)
+%%IncludeResource: ProcSet (CIDInit)
+%%BeginResource: CMap (Roman)
+%%Title: (Roman Adobe Japan1 0)
+%%Version: 6.001
+%%Copyright: -----------------------------------------------------------
+%%Copyright: Copyright 1990-1997 Adobe Systems Incorporated.
+%%Copyright: All Rights Reserved.
+%%Copyright:
+%%Copyright: Patents Pending
+%%Copyright:
+%%Copyright: NOTICE: All information contained herein is the property
+%%Copyright: of Adobe Systems Incorporated.
+%%Copyright:
+%%Copyright: Permission is granted for redistribution of this file
+%%Copyright: provided this copyright notice is maintained intact and
+%%Copyright: that the contents of this file are not altered in any
+%%Copyright: way from its original form.
+%%Copyright:
+%%Copyright: PostScript and Display PostScript are trademarks of
+%%Copyright: Adobe Systems Incorporated which may be registered in
+%%Copyright: certain jurisdictions.
+%%Copyright: -----------------------------------------------------------
+%%EndComments
+
+/CIDInit /ProcSet findresource begin
+
+12 dict begin
+
+begincmap
+
+/CIDSystemInfo 3 dict dup begin
+ /Registry (Adobe) def
+ /Ordering (Japan1) def
+ /Supplement 0 def
+end def
+
+/CMapName /Roman def
+/CMapVersion 6.001 def
+/CMapType 1 def
+
+/UIDOffset 866 def
+/XUID [1 10 25351] def
+
+/WMode 0 def
+
+1 begincodespacerange
+ <00> <FF>
+endcodespacerange
+
+1 begincidrange
+<20> <7e> 231
+endcidrange
+endcmap
+CMapName currentdict /CMap defineresource pop
+end
+end
+
+%%EndResource
+%%EOF
diff --git a/src/main/resources/Resources/cmap/UCS2-90ms-RKSJ b/src/main/resources/Resources/cmap/UCS2-90ms-RKSJ
new file mode 100644
index 0000000..fca6956
--- /dev/null
+++ b/src/main/resources/Resources/cmap/UCS2-90ms-RKSJ
@@ -0,0 +1,7178 @@
+%!PS-Adobe-3.0 Resource-CMap
+%%DocumentNeededResources: ProcSet (CIDInit)
+%%IncludeResource: ProcSet (CIDInit)
+%%BeginResource: CMap (UCS2-90ms-RKSJ)
+%%Title: (UCS2-90ms-RKSJ)
+%%Version: 4.002
+%%Copyright: -----------------------------------------------------------
+%%Copyright: Copyright 1990-1999 Adobe Systems Incorporated.
+%%Copyright: All Rights Reserved.
+%%Copyright:
+%%Copyright: Patents Pending
+%%Copyright:
+%%Copyright: NOTICE: All information contained herein is the property
+%%Copyright: of Adobe Systems Incorporated.
+%%Copyright:
+%%Copyright: Permission is granted for redistribution of this file
+%%Copyright: provided this copyright notice is maintained intact and
+%%Copyright: that the contents of this file are not altered in any
+%%Copyright: way from its original form.
+%%Copyright:
+%%Copyright: PostScript and Display PostScript are trademarks of
+%%Copyright: Adobe Systems Incorporated which may be registered in
+%%Copyright: certain jurisdictions.
+%%Copyright: -----------------------------------------------------------
+%%EndComments
+
+/CIDInit /ProcSet findresource begin
+
+12 dict begin
+
+begincmap
+
+/CIDSystemInfo 3 dict dup begin
+ /Registry (Adobe) def
+ /Ordering (UCS2_90ms_RKSJ) def
+ /Supplement 2 def
+end def
+
+/CMapName /UCS2-90ms-RKSJ def
+/CMapVersion 4.002 def
+/CMapType 1 def
+/WMode 0 def
+
+1 begincodespacerange
+<0000> <FFFF>
+endcodespacerange
+
+100 beginbfrange
+<0000> <0000> <20>
+<0001> <0080> <01>
+<00A1> <00A1> <21>
+<00A2> <00A3> <8191>
+<00A5> <00A5> <5C>
+<00A6> <00A6> <7C>
+<00A7> <00A7> <8198>
+<00A8> <00A8> <814E>
+<00A9> <00A9> <63>
+<00AA> <00AA> <61>
+<00AB> <00AB> <81E1>
+<00AC> <00AC> <81CA>
+<00AD> <00AD> <2D>
+<00AE> <00AE> <52>
+<00AF> <00AF> <8150>
+<00B0> <00B0> <818B>
+<00B1> <00B1> <817D>
+<00B2> <00B3> <0032>
+<00B4> <00B4> <814C>
+<00B5> <00B5> <83CA>
+<00B6> <00B6> <81F7>
+<00B7> <00B7> <8145>
+<00B8> <00B8> <8143>
+<00B9> <00B9> <31>
+<00BA> <00BA> <6F>
+<00BB> <00BB> <81E2>
+<00C0> <00C0> <41>
+<00C1> <00C1> <41>
+<00C2> <00C2> <41>
+<00C3> <00C3> <41>
+<00C4> <00C4> <41>
+<00C5> <00C5> <41>
+<00C6> <00C6> <41>
+<00C7> <00C7> <43>
+<00C8> <00C8> <45>
+<00C9> <00C9> <45>
+<00CA> <00CA> <45>
+<00CB> <00CB> <45>
+<00CC> <00CC> <49>
+<00CD> <00CD> <49>
+<00CE> <00CE> <49>
+<00CF> <00CF> <49>
+<00D0> <00D0> <44>
+<00D1> <00D2> <4E>
+<00D3> <00D3> <4F>
+<00D4> <00D4> <4F>
+<00D5> <00D5> <4F>
+<00D6> <00D6> <4F>
+<00D7> <00D7> <817E>
+<00D8> <00D8> <4F>
+<00D9> <00D9> <55>
+<00DA> <00DA> <55>
+<00DB> <00DB> <55>
+<00DC> <00DC> <55>
+<00DD> <00DD> <59>
+<00DE> <00DE> <54>
+<00DF> <00DF> <73>
+<00E0> <00E0> <61>
+<00E1> <00E1> <61>
+<00E2> <00E2> <61>
+<00E3> <00E3> <61>
+<00E4> <00E4> <61>
+<00E5> <00E5> <61>
+<00E6> <00E6> <61>
+<00E7> <00E7> <63>
+<00E8> <00E8> <65>
+<00E9> <00E9> <65>
+<00EA> <00EA> <65>
+<00EB> <00EB> <65>
+<00EC> <00EC> <69>
+<00ED> <00ED> <69>
+<00EE> <00EE> <69>
+<00EF> <00EF> <69>
+<00F0> <00F0> <64>
+<00F1> <00F2> <6E>
+<00F3> <00F3> <6F>
+<00F4> <00F4> <6F>
+<00F5> <00F5> <6F>
+<00F6> <00F6> <6F>
+<00F7> <00F7> <8180>
+<00F8> <00F8> <6F>
+<00F9> <00F9> <75>
+<00FA> <00FA> <75>
+<00FB> <00FB> <75>
+<00FC> <00FC> <75>
+<00FD> <00FD> <79>
+<00FE> <00FE> <74>
+<00FF> <00FF> <79>
+<02D0> <02D0> <8146>
+<0391> <03A1> <839F>
+<03A3> <03A9> <83B0>
+<03B1> <03C1> <83BF>
+<03C3> <03C9> <83D0>
+<0401> <0401> <8446>
+<0410> <0415> <8440>
+<0416> <042F> <8447>
+<0430> <0435> <8470>
+<0436> <043D> <8477>
+<043E> <044F> <8480>
+<0451> <0451> <8476>
+endbfrange
+
+100 beginbfrange
+<2010> <2010> <815D>
+<2013> <2013> <815D>
+<2014> <2014> <815C>
+<2015> <2015> <815C>
+<2016> <2016> <8161>
+<2018> <2019> <8165>
+<201C> <201D> <8167>
+<2020> <2021> <81F5>
+<2022> <2022> <8145>
+<2025> <2025> <8164>
+<2026> <2026> <8163>
+<2027> <2027> <8145>
+<2030> <2030> <81F1>
+<2032> <2033> <818C>
+<203B> <203B> <81A6>
+<203E> <203E> <8150>
+<20AC> <20AC> <80>
+<2103> <2103> <818E>
+<2116> <2116> <8782>
+<2121> <2121> <8784>
+<212B> <212B> <81F0>
+<2160> <2169> <8754>
+<2170> <2179> <FA40>
+<2190> <2191> <81A9>
+<2192> <2192> <81A8>
+<2193> <2193> <81AB>
+<21D2> <21D2> <81CB>
+<21D4> <21D4> <81CC>
+<2200> <2200> <81CD>
+<2202> <2202> <81DD>
+<2203> <2203> <81CE>
+<2207> <2207> <81DE>
+<2208> <2208> <81B8>
+<220B> <220B> <81B9>
+<2211> <2211> <8794>
+<2212> <2212> <817C>
+<221A> <221A> <81E3>
+<221D> <221D> <81E5>
+<221E> <221E> <8187>
+<221F> <221F> <8798>
+<2220> <2220> <81DA>
+<2225> <2225> <8161>
+<2227> <2228> <81C8>
+<2229> <2229> <81BF>
+<222A> <222A> <81BE>
+<222B> <222C> <81E7>
+<222E> <222E> <8793>
+<2234> <2234> <8188>
+<2235> <2235> <81E6>
+<2236> <2236> <8146>
+<223C> <223C> <8160>
+<223D> <223D> <81E4>
+<2252> <2252> <81E0>
+<2260> <2260> <8182>
+<2261> <2261> <81DF>
+<2266> <2267> <8185>
+<226A> <226B> <81E1>
+<2282> <2283> <81BC>
+<2286> <2287> <81BA>
+<2299> <2299> <819D>
+<22A5> <22A5> <81DB>
+<22BF> <22BF> <8799>
+<22EF> <22EF> <8163>
+<2312> <2312> <81DC>
+<2460> <2473> <8740>
+<2500> <2500> <849F>
+<2501> <2501> <84AA>
+<2502> <2502> <84A0>
+<2503> <2503> <84AB>
+<250C> <250C> <84A1>
+<250F> <250F> <84AC>
+<2510> <2510> <84A2>
+<2513> <2513> <84AD>
+<2514> <2514> <84A4>
+<2517> <2517> <84AF>
+<2518> <2518> <84A3>
+<251B> <251B> <84AE>
+<251C> <251C> <84A5>
+<251D> <251D> <84BA>
+<2520> <2520> <84B5>
+<2523> <2523> <84B0>
+<2524> <2524> <84A7>
+<2525> <2525> <84BC>
+<2528> <2528> <84B7>
+<252B> <252B> <84B2>
+<252C> <252C> <84A6>
+<252F> <252F> <84B6>
+<2530> <2530> <84BB>
+<2533> <2533> <84B1>
+<2534> <2534> <84A8>
+<2537> <2537> <84B8>
+<2538> <2538> <84BD>
+<253B> <253B> <84B3>
+<253C> <253C> <84A9>
+<253F> <253F> <84B9>
+<2542> <2542> <84BE>
+<254B> <254B> <84B4>
+<2595> <2595> <A3FC>
+<25A0> <25A0> <81A1>
+<25A1> <25A1> <81A0>
+endbfrange
+
+100 beginbfrange
+<25B2> <25B2> <81A3>
+<25B3> <25B3> <81A2>
+<25BC> <25BC> <81A5>
+<25BD> <25BD> <81A4>
+<25C6> <25C6> <819F>
+<25C7> <25C7> <819E>
+<25C9> <25C9> <819D>
+<25CB> <25CB> <819B>
+<25CE> <25CE> <819D>
+<25CF> <25CF> <819C>
+<25EF> <25EF> <81FC>
+<2605> <2605> <819A>
+<2606> <2606> <8199>
+<2609> <2609> <819D>
+<2640> <2640> <818A>
+<2642> <2642> <8189>
+<266A> <266A> <81F4>
+<266D> <266D> <81F3>
+<266F> <266F> <81F2>
+<3000> <3002> <8140>
+<3003> <3003> <8156>
+<3005> <3007> <8158>
+<3008> <3011> <8171>
+<3012> <3012> <81A7>
+<3013> <3013> <81AC>
+<3014> <3015> <816B>
+<301C> <301C> <8160>
+<301D> <301D> <8780>
+<301E> <301E> <8781>
+<301F> <301F> <8781>
+<3041> <3093> <829F>
+<309B> <309C> <814A>
+<309D> <309E> <8154>
+<30A1> <30DF> <8340>
+<30E0> <30F6> <8380>
+<30FB> <30FB> <8145>
+<30FC> <30FC> <815B>
+<30FD> <30FE> <8152>
+<3231> <3232> <878A>
+<3239> <3239> <878C>
+<32A4> <32A8> <8785>
+<3303> <3303> <8765>
+<330D> <330D> <8769>
+<3314> <3314> <8760>
+<3318> <3318> <8763>
+<3322> <3322> <8761>
+<3323> <3323> <876B>
+<3326> <3326> <876A>
+<3327> <3327> <8764>
+<332B> <332B> <876C>
+<3336> <3336> <8766>
+<333B> <333B> <876E>
+<3349> <3349> <875F>
+<334A> <334A> <876D>
+<334D> <334D> <8762>
+<3351> <3351> <8767>
+<3357> <3357> <8768>
+<337B> <337B> <877E>
+<337C> <337C> <878F>
+<337D> <337D> <878E>
+<337E> <337E> <878D>
+<338E> <338F> <8772>
+<339C> <339E> <876F>
+<33A1> <33A1> <8775>
+<33C4> <33C4> <8774>
+<33CD> <33CD> <8783>
+<4E00> <4E00> <88EA>
+<4E01> <4E01> <929A>
+<4E03> <4E03> <8EB5>
+<4E07> <4E07> <969C>
+<4E08> <4E08> <8FE4>
+<4E09> <4E09> <8E4F>
+<4E0A> <4E0A> <8FE3>
+<4E0B> <4E0B> <89BA>
+<4E0D> <4E0D> <9573>
+<4E0E> <4E0E> <975E>
+<4E10> <4E10> <98A0>
+<4E11> <4E11> <894E>
+<4E14> <4E14> <8A8E>
+<4E15> <4E15> <98A1>
+<4E16> <4E16> <90A2>
+<4E17> <4E17> <99C0>
+<4E18> <4E18> <8B75>
+<4E19> <4E19> <95B8>
+<4E1E> <4E1E> <8FE5>
+<4E21> <4E21> <97BC>
+<4E26> <4E26> <95C0>
+<4E28> <4E28> <FA68>
+<4E2A> <4E2A> <98A2>
+<4E2D> <4E2D> <9286>
+<4E31> <4E31> <98A3>
+<4E32> <4E32> <8BF8>
+<4E36> <4E36> <98A4>
+<4E38> <4E38> <8ADB>
+<4E39> <4E39> <924F>
+<4E3B> <4E3B> <8EE5>
+<4E3C> <4E3C> <98A5>
+<4E3F> <4E3F> <98A6>
+<4E42> <4E42> <98A7>
+<4E43> <4E43> <9454>
+endbfrange
+
+100 beginbfrange
+<4E45> <4E45> <8B76>
+<4E4B> <4E4B> <9456>
+<4E4D> <4E4D> <93E1>
+<4E4E> <4E4E> <8CC1>
+<4E4F> <4E4F> <9652>
+<4E55> <4E55> <E568>
+<4E56> <4E56> <98A8>
+<4E57> <4E57> <8FE6>
+<4E58> <4E58> <98A9>
+<4E59> <4E59> <89B3>
+<4E5D> <4E5D> <8BE3>
+<4E5E> <4E5E> <8CEE>
+<4E5F> <4E5F> <96E7>
+<4E62> <4E62> <9BA4>
+<4E71> <4E71> <9790>
+<4E73> <4E73> <93FB>
+<4E7E> <4E7E> <8AA3>
+<4E80> <4E80> <8B54>
+<4E82> <4E82> <98AA>
+<4E85> <4E85> <98AB>
+<4E86> <4E86> <97B9>
+<4E88> <4E88> <975C>
+<4E89> <4E89> <9188>
+<4E8A> <4E8A> <98AD>
+<4E8B> <4E8B> <8E96>
+<4E8C> <4E8C> <93F1>
+<4E8E> <4E8E> <98B0>
+<4E91> <4E91> <895D>
+<4E92> <4E92> <8CDD>
+<4E94> <4E94> <8CDC>
+<4E95> <4E95> <88E4>
+<4E98> <4E98> <986A>
+<4E99> <4E99> <9869>
+<4E9B> <4E9B> <8DB1>
+<4E9C> <4E9C> <889F>
+<4E9E> <4EA0> <98B1>
+<4EA1> <4EA1> <9653>
+<4EA2> <4EA2> <98B4>
+<4EA4> <4EA4> <8CF0>
+<4EA5> <4EA5> <88E5>
+<4EA6> <4EA6> <9692>
+<4EA8> <4EA8> <8B9C>
+<4EAB> <4EAC> <8B9D>
+<4EAD> <4EAD> <92E0>
+<4EAE> <4EAE> <97BA>
+<4EB0> <4EB0> <98B5>
+<4EB3> <4EB3> <98B6>
+<4EB6> <4EB6> <98B7>
+<4EBA> <4EBA> <906C>
+<4EC0> <4EC0> <8F59>
+<4EC1> <4EC1> <906D>
+<4EC2> <4EC2> <98BC>
+<4EC4> <4EC4> <98BA>
+<4EC6> <4EC6> <98BB>
+<4EC7> <4EC7> <8B77>
+<4ECA> <4ECA> <8DA1>
+<4ECB> <4ECB> <89EE>
+<4ECD> <4ECD> <98B9>
+<4ECE> <4ECE> <98B8>
+<4ECF> <4ECF> <95A7>
+<4ED4> <4ED4> <8E65>
+<4ED5> <4ED5> <8E64>
+<4ED6> <4ED6> <91BC>
+<4ED7> <4ED7> <98BD>
+<4ED8> <4ED8> <9574>
+<4ED9> <4ED9> <90E5>
+<4EDD> <4EDD> <8157>
+<4EDE> <4EDE> <98BE>
+<4EDF> <4EDF> <98C0>
+<4EE1> <4EE1> <FA69>
+<4EE3> <4EE3> <91E3>
+<4EE4> <4EE4> <97DF>
+<4EE5> <4EE5> <88C8>
+<4EED> <4EED> <98BF>
+<4EEE> <4EEE> <89BC>
+<4EF0> <4EF0> <8BC2>
+<4EF2> <4EF2> <9287>
+<4EF6> <4EF6> <8C8F>
+<4EF7> <4EF7> <98C1>
+<4EFB> <4EFB> <9443>
+<4EFC> <4EFC> <FA6A>
+<4F00> <4F00> <FA6B>
+<4F01> <4F01> <8AE9>
+<4F03> <4F03> <FA6C>
+<4F09> <4F09> <98C2>
+<4F0A> <4F0A> <88C9>
+<4F0D> <4F0D> <8CDE>
+<4F0E> <4F0E> <8AEA>
+<4F0F> <4F0F> <959A>
+<4F10> <4F10> <94B0>
+<4F11> <4F11> <8B78>
+<4F1A> <4F1A> <89EF>
+<4F1C> <4F1C> <98E5>
+<4F1D> <4F1D> <9360>
+<4F2F> <4F2F> <948C>
+<4F30> <4F30> <98C4>
+<4F34> <4F34> <94BA>
+<4F36> <4F36> <97E0>
+<4F38> <4F38> <904C>
+<4F39> <4F39> <FA6D>
+endbfrange
+
+100 beginbfrange
+<4F3A> <4F3A> <8E66>
+<4F3C> <4F3C> <8E97>
+<4F3D> <4F3D> <89BE>
+<4F43> <4F43> <92CF>
+<4F46> <4F46> <9241>
+<4F47> <4F47> <98C8>
+<4F4D> <4F4D> <88CA>
+<4F4E> <4F4E> <92E1>
+<4F4F> <4F4F> <8F5A>
+<4F50> <4F50> <8DB2>
+<4F51> <4F51> <9743>
+<4F53> <4F53> <91CC>
+<4F55> <4F55> <89BD>
+<4F56> <4F56> <FA6E>
+<4F57> <4F57> <98C7>
+<4F59> <4F59> <975D>
+<4F5A> <4F5A> <98C3>
+<4F5B> <4F5B> <98C5>
+<4F5C> <4F5C> <8DEC>
+<4F5D> <4F5D> <98C6>
+<4F5E> <4F5E> <9B43>
+<4F69> <4F69> <98CE>
+<4F6F> <4F6F> <98D1>
+<4F70> <4F70> <98CF>
+<4F73> <4F73> <89C0>
+<4F75> <4F75> <95B9>
+<4F76> <4F76> <98C9>
+<4F7B> <4F7B> <98CD>
+<4F7C> <4F7C> <8CF1>
+<4F7F> <4F7F> <8E67>
+<4F83> <4F83> <8AA4>
+<4F86> <4F86> <98D2>
+<4F88> <4F88> <98CA>
+<4F8A> <4F8A> <FA70>
+<4F8B> <4F8B> <97E1>
+<4F8D> <4F8D> <8E98>
+<4F8F> <4F8F> <98CB>
+<4F91> <4F91> <98D0>
+<4F92> <4F92> <FA6F>
+<4F94> <4F94> <FA72>
+<4F96> <4F96> <98D3>
+<4F98> <4F98> <98CC>
+<4F9A> <4F9A> <FA71>
+<4F9B> <4F9B> <8B9F>
+<4F9D> <4F9D> <88CB>
+<4FA0> <4FA0> <8BA0>
+<4FA1> <4FA1> <89BF>
+<4FAB> <4FAB> <9B44>
+<4FAD> <4FAD> <9699>
+<4FAE> <4FAE> <958E>
+<4FAF> <4FAF> <8CF2>
+<4FB5> <4FB5> <904E>
+<4FB6> <4FB6> <97B5>
+<4FBF> <4FBF> <95D6>
+<4FC2> <4FC2> <8C57>
+<4FC3> <4FC3> <91A3>
+<4FC4> <4FC4> <89E2>
+<4FC9> <4FC9> <FA61>
+<4FCA> <4FCA> <8F72>
+<4FCD> <4FCD> <FA73>
+<4FCE> <4FCE> <98D7>
+<4FD0> <4FD0> <98DC>
+<4FD1> <4FD1> <98DA>
+<4FD4> <4FD4> <98D5>
+<4FD7> <4FD7> <91AD>
+<4FD8> <4FD8> <98D8>
+<4FDA> <4FDA> <98DB>
+<4FDB> <4FDB> <98D9>
+<4FDD> <4FDD> <95DB>
+<4FDF> <4FDF> <98D6>
+<4FE0> <4FE0> <8BA0>
+<4FE1> <4FE1> <904D>
+<4FE3> <4FE3> <9693>
+<4FE4> <4FE5> <98DD>
+<4FEE> <4FEE> <8F43>
+<4FEF> <4FEF> <98EB>
+<4FF3> <4FF3> <946F>
+<4FF5> <4FF5> <9555>
+<4FF6> <4FF6> <98E6>
+<4FF8> <4FF8> <95EE>
+<4FFA> <4FFA> <89B4>
+<4FFE> <4FFE> <98EA>
+<4FFF> <4FFF> <FA76>
+<5005> <5005> <98E4>
+<5006> <5006> <98ED>
+<5009> <5009> <9171>
+<500B> <500B> <8CC2>
+<500D> <500D> <947B>
+<500F> <500F> <E0C5>
+<5011> <5011> <98EC>
+<5012> <5012> <937C>
+<5014> <5014> <98E1>
+<5016> <5016> <8CF4>
+<5019> <5019> <8CF3>
+<501A> <501A> <98DF>
+<501E> <501E> <FA77>
+<501F> <501F> <8ED8>
+<5021> <5021> <98E7>
+<5022> <5022> <FA75>
+<5023> <5023> <95ED>
+endbfrange
+
+100 beginbfrange
+<5024> <5024> <926C>
+<5025> <5025> <98E3>
+<5026> <5026> <8C91>
+<5028> <5028> <98E0>
+<5029> <5029> <98E8>
+<502A> <502A> <98E2>
+<502B> <502B> <97CF>
+<502C> <502C> <98E9>
+<502D> <502D> <9860>
+<5036> <5036> <8BE4>
+<5039> <5039> <8C90>
+<5040> <5040> <FA74>
+<5042> <5042> <FA7A>
+<5043> <5043> <98EE>
+<5046> <5046> <FA78>
+<5047> <5047> <98EF>
+<5048> <5048> <98F3>
+<5049> <5049> <88CC>
+<504F> <504F> <95CE>
+<5050> <5050> <98F2>
+<5055> <5055> <98F1>
+<5056> <5056> <98F5>
+<505A> <505A> <98F4>
+<505C> <505C> <92E2>
+<5065> <5065> <8C92>
+<506C> <506C> <98F6>
+<5070> <5070> <FA79>
+<5072> <5072> <8EC3>
+<5074> <5074> <91A4>
+<5075> <5075> <92E3>
+<5076> <5076> <8BF4>
+<5078> <5078> <98F7>
+<507D> <507D> <8B55>
+<5080> <5080> <98F8>
+<5085> <5085> <98FA>
+<508D> <508D> <9654>
+<5091> <5091> <8C86>
+<5094> <5094> <FA7B>
+<5098> <5098> <8E50>
+<5099> <5099> <94F5>
+<509A> <509A> <98F9>
+<50AC> <50AC> <8DC3>
+<50AD> <50AD> <9762>
+<50B2> <50B2> <98FC>
+<50B3> <50B3> <9942>
+<50B4> <50B4> <98FB>
+<50B5> <50B5> <8DC2>
+<50B7> <50B7> <8F9D>
+<50BE> <50BE> <8C58>
+<50C2> <50C2> <9943>
+<50C5> <50C5> <8BCD>
+<50C9> <50CA> <9940>
+<50CD> <50CD> <93AD>
+<50CF> <50CF> <919C>
+<50D1> <50D1> <8BA1>
+<50D5> <50D5> <966C>
+<50D6> <50D6> <9944>
+<50D8> <50D8> <FA7D>
+<50DA> <50DA> <97BB>
+<50DE> <50DE> <9945>
+<50E3> <50E3> <9948>
+<50E5> <50E5> <9946>
+<50E7> <50E7> <916D>
+<50ED> <50ED> <9947>
+<50EE> <50EE> <9949>
+<50F4> <50F4> <FA7C>
+<50F5> <50F5> <994B>
+<50F9> <50F9> <994A>
+<50FB> <50FB> <95C6>
+<5100> <5100> <8B56>
+<5101> <5102> <994D>
+<5104> <5104> <89AD>
+<5109> <5109> <994C>
+<5112> <5112> <8EF2>
+<5114> <5114> <9951>
+<5115> <5115> <9950>
+<5116> <5116> <994F>
+<5118> <5118> <98D4>
+<511A> <511A> <9952>
+<511F> <511F> <8F9E>
+<5121> <5121> <9953>
+<512A> <512A> <9744>
+<5132> <5132> <96D7>
+<5137> <5137> <9955>
+<513A> <513A> <9954>
+<513B> <513B> <9957>
+<513C> <513C> <9956>
+<513F> <5140> <9958>
+<5141> <5141> <88F2>
+<5143> <5143> <8CB3>
+<5144> <5144> <8C5A>
+<5145> <5145> <8F5B>
+<5146> <5146> <929B>
+<5147> <5147> <8BA2>
+<5148> <5148> <90E6>
+<5149> <5149> <8CF5>
+<514A> <514A> <FA7E>
+<514B> <514B> <8D8E>
+<514C> <514C> <995B>
+<514D> <514D> <96C6>
+endbfrange
+
+100 beginbfrange
+<514E> <514E> <9365>
+<5150> <5150> <8E99>
+<5152> <5152> <995A>
+<5154> <5154> <995C>
+<515A> <515A> <937D>
+<515C> <515C> <8A95>
+<5162> <5162> <995D>
+<5164> <5164> <FA80>
+<5165> <5165> <93FC>
+<5168> <5168> <9153>
+<5169> <516A> <995F>
+<516B> <516B> <94AA>
+<516C> <516C> <8CF6>
+<516D> <516D> <985A>
+<516E> <516E> <9961>
+<5171> <5171> <8BA4>
+<5175> <5175> <95BA>
+<5176> <5176> <91B4>
+<5177> <5177> <8BEF>
+<5178> <5178> <9354>
+<517C> <517C> <8C93>
+<5180> <5180> <9962>
+<5182> <5182> <9963>
+<5185> <5185> <93E0>
+<5186> <5186> <897E>
+<5189> <5189> <9966>
+<518A> <518A> <8DFB>
+<518C> <518C> <9965>
+<518D> <518D> <8DC4>
+<518F> <518F> <9967>
+<5190> <5190> <E3EC>
+<5191> <5191> <9968>
+<5192> <5192> <9660>
+<5193> <5193> <9969>
+<5195> <5196> <996A>
+<5197> <5197> <8FE7>
+<5199> <5199> <8ECA>
+<519D> <519D> <FA81>
+<51A0> <51A0> <8AA5>
+<51A2> <51A2> <996E>
+<51A4> <51A4> <996C>
+<51A5> <51A5> <96BB>
+<51A6> <51A6> <996D>
+<51A8> <51A8> <9579>
+<51A9> <51AB> <996F>
+<51AC> <51AC> <937E>
+<51B0> <51B0> <9975>
+<51B1> <51B2> <9973>
+<51B3> <51B3> <9972>
+<51B4> <51B4> <8DE1>
+<51B5> <51B5> <9976>
+<51B6> <51B6> <96E8>
+<51B7> <51B7> <97E2>
+<51BD> <51BD> <9977>
+<51BE> <51BE> <FA82>
+<51C4> <51C4> <90A6>
+<51C5> <51C5> <9978>
+<51C6> <51C6> <8F79>
+<51C9> <51C9> <9979>
+<51CB> <51CB> <929C>
+<51CC> <51CC> <97BD>
+<51CD> <51CD> <9380>
+<51D6> <51D6> <99C3>
+<51DB> <51DB> <997A>
+<51DC> <51DC> <EAA3>
+<51DD> <51DD> <8BC3>
+<51E0> <51E0> <997B>
+<51E1> <51E1> <967D>
+<51E6> <51E6> <8F88>
+<51E7> <51E7> <91FA>
+<51E9> <51E9> <997D>
+<51EA> <51EA> <93E2>
+<51EC> <51EC> <FA83>
+<51ED> <51ED> <997E>
+<51F0> <51F0> <9980>
+<51F1> <51F1> <8A4D>
+<51F5> <51F5> <9981>
+<51F6> <51F6> <8BA5>
+<51F8> <51F8> <93CA>
+<51F9> <51F9> <899A>
+<51FA> <51FA> <8F6F>
+<51FD> <51FD> <949F>
+<51FE> <51FE> <9982>
+<5200> <5200> <9381>
+<5203> <5203> <906E>
+<5204> <5204> <9983>
+<5206> <5206> <95AA>
+<5207> <5207> <90D8>
+<5208> <5208> <8AA0>
+<520A> <520A> <8AA7>
+<520B> <520B> <9984>
+<520E> <520E> <9986>
+<5211> <5211> <8C59>
+<5214> <5214> <9985>
+<5215> <5215> <FA84>
+<5217> <5217> <97F1>
+<521D> <521D> <8F89>
+<5224> <5224> <94BB>
+<5225> <5225> <95CA>
+<5227> <5227> <9987>
+endbfrange
+
+100 beginbfrange
+<5229> <5229> <9798>
+<522A> <522A> <9988>
+<522E> <522E> <9989>
+<5230> <5230> <939E>
+<5233> <5233> <998A>
+<5236> <5236> <90A7>
+<5237> <5237> <8DFC>
+<5238> <5238> <8C94>
+<5239> <5239> <998B>
+<523A> <523A> <8E68>
+<523B> <523B> <8D8F>
+<5243> <5243> <92E4>
+<5244> <5244> <998D>
+<5247> <5247> <91A5>
+<524A> <524A> <8DED>
+<524B> <524C> <998E>
+<524D> <524D> <914F>
+<524F> <524F> <998C>
+<5254> <5254> <9991>
+<5256> <5256> <9655>
+<525B> <525B> <8D84>
+<525D> <525D> <948D>
+<525E> <525E> <9990>
+<5263> <5263> <8C95>
+<5264> <5264> <8DDC>
+<5265> <5265> <948D>
+<5269> <5269> <9994>
+<526A> <526A> <9992>
+<526F> <526F> <959B>
+<5270> <5270> <8FE8>
+<5271> <5271> <999B>
+<5272> <5272> <8A84>
+<5273> <5273> <9995>
+<5274> <5274> <9993>
+<5275> <5275> <916E>
+<527D> <527D> <9997>
+<527F> <527F> <9996>
+<5283> <5283> <8A63>
+<5287> <5287> <8C80>
+<5288> <5288> <999C>
+<5289> <5289> <97AB>
+<528D> <528D> <9998>
+<5291> <5291> <999D>
+<5292> <5292> <999A>
+<5294> <5294> <9999>
+<529B> <529B> <97CD>
+<529C> <529C> <FA85>
+<529F> <529F> <8CF7>
+<52A0> <52A0> <89C1>
+<52A3> <52A3> <97F2>
+<52A6> <52A6> <FA86>
+<52A9> <52A9> <8F95>
+<52AA> <52AA> <9377>
+<52AB> <52AB> <8D85>
+<52AC> <52AD> <99A0>
+<52AF> <52AF> <FB77>
+<52B1> <52B1> <97E3>
+<52B4> <52B4> <984A>
+<52B5> <52B5> <99A3>
+<52B9> <52B9> <8CF8>
+<52BC> <52BC> <99A2>
+<52BE> <52BE> <8A4E>
+<52C0> <52C0> <FA87>
+<52C1> <52C1> <99A4>
+<52C3> <52C3> <9675>
+<52C5> <52C5> <92BA>
+<52C7> <52C7> <9745>
+<52C9> <52C9> <95D7>
+<52CD> <52CD> <99A5>
+<52D2> <52D2> <E8D3>
+<52D5> <52D5> <93AE>
+<52D7> <52D7> <99A6>
+<52D8> <52D8> <8AA8>
+<52D9> <52D9> <96B1>
+<52DB> <52DB> <FA88>
+<52DD> <52DD> <8F9F>
+<52DE> <52DE> <99A7>
+<52DF> <52DF> <95E5>
+<52E0> <52E0> <99AB>
+<52E2> <52E2> <90A8>
+<52E3> <52E3> <99A8>
+<52E4> <52E4> <8BCE>
+<52E6> <52E6> <99A9>
+<52E7> <52E7> <8AA9>
+<52F2> <52F2> <8C4D>
+<52F3> <52F3> <99AC>
+<52F5> <52F5> <99AD>
+<52F8> <52F9> <99AE>
+<52FA> <52FA> <8ED9>
+<52FE> <52FE> <8CF9>
+<52FF> <52FF> <96DC>
+<5300> <5300> <FA89>
+<5301> <5301> <96E6>
+<5302> <5302> <93F5>
+<5305> <5305> <95EF>
+<5306> <5306> <99B0>
+<5307> <5307> <FA8A>
+<5308> <5308> <99B1>
+<530D> <530D> <99B3>
+<530F> <530F> <99B5>
+endbfrange
+
+100 beginbfrange
+<5310> <5310> <99B4>
+<5315> <5315> <99B6>
+<5316> <5316> <89BB>
+<5317> <5317> <966B>
+<5319> <5319> <8DFA>
+<531A> <531A> <99B7>
+<531D> <531D> <9178>
+<5320> <5320> <8FA0>
+<5321> <5321> <8BA7>
+<5323> <5323> <99B8>
+<5324> <5324> <FA8B>
+<532A> <532A> <94D9>
+<532F> <532F> <99B9>
+<5331> <5331> <99BA>
+<5333> <5333> <99BB>
+<5338> <5338> <99BC>
+<5339> <5339> <9543>
+<533A> <533A> <8BE6>
+<533B> <533B> <88E3>
+<533F> <533F> <93BD>
+<5340> <5340> <99BD>
+<5341> <5341> <8F5C>
+<5343> <5343> <90E7>
+<5345> <5345> <99BF>
+<5346> <5346> <99BE>
+<5347> <5347> <8FA1>
+<5348> <5348> <8CDF>
+<5349> <5349> <99C1>
+<534A> <534A> <94BC>
+<534D> <534D> <99C2>
+<5351> <5351> <94DA>
+<5352> <5352> <91B2>
+<5353> <5353> <91EC>
+<5354> <5354> <8BA6>
+<5357> <5357> <93EC>
+<5358> <5358> <9250>
+<535A> <535A> <948E>
+<535C> <535C> <966D>
+<535E> <535E> <99C4>
+<5360> <5360> <90E8>
+<5366> <5366> <8C54>
+<5369> <5369> <99C5>
+<536E> <536E> <99C6>
+<536F> <536F> <894B>
+<5370> <5370> <88F3>
+<5371> <5371> <8AEB>
+<5372> <5372> <FA8C>
+<5373> <5373> <91A6>
+<5374> <5374> <8B70>
+<5375> <5375> <9791>
+<5377> <5377> <99C9>
+<5378> <5378> <89B5>
+<537B> <537B> <99C8>
+<537F> <537F> <8BA8>
+<5382> <5382> <99CA>
+<5384> <5384> <96EF>
+<5393> <5393> <FA8D>
+<5396> <5396> <99CB>
+<5398> <5398> <97D0>
+<539A> <539A> <8CFA>
+<539F> <539F> <8CB4>
+<53A0> <53A0> <99CC>
+<53A5> <53A5> <99CE>
+<53A6> <53A6> <99CD>
+<53A8> <53A8> <907E>
+<53A9> <53A9> <8958>
+<53AD> <53AD> <897D>
+<53AE> <53AE> <99CF>
+<53B0> <53B0> <99D0>
+<53B2> <53B2> <FA8E>
+<53B3> <53B3> <8CB5>
+<53B6> <53B6> <99D1>
+<53BB> <53BB> <8B8E>
+<53C2> <53C2> <8E51>
+<53C3> <53C3> <99D2>
+<53C8> <53C8> <9694>
+<53C9> <53C9> <8DB3>
+<53CA> <53CA> <8B79>
+<53CB> <53CB> <9746>
+<53CC> <53CC> <916F>
+<53CD> <53CD> <94BD>
+<53CE> <53CE> <8EFB>
+<53D4> <53D4> <8F66>
+<53D6> <53D6> <8EE6>
+<53D7> <53D7> <8EF3>
+<53D9> <53D9> <8F96>
+<53DB> <53DB> <94BE>
+<53DD> <53DD> <FA8F>
+<53DF> <53DF> <99D5>
+<53E1> <53E1> <8962>
+<53E2> <53E2> <9170>
+<53E3> <53E3> <8CFB>
+<53E4> <53E4> <8CC3>
+<53E5> <53E5> <8BE5>
+<53E8> <53E8> <99D9>
+<53E9> <53E9> <9240>
+<53EA> <53EA> <91FC>
+<53EB> <53EB> <8BA9>
+<53EC> <53EC> <8FA2>
+<53ED> <53ED> <99DA>
+endbfrange
+
+100 beginbfrange
+<53EE> <53EE> <99D8>
+<53EF> <53EF> <89C2>
+<53F0> <53F0> <91E4>
+<53F1> <53F1> <8EB6>
+<53F2> <53F2> <8E6A>
+<53F3> <53F3> <8945>
+<53F6> <53F6> <8A90>
+<53F7> <53F7> <8D86>
+<53F8> <53F8> <8E69>
+<53FA> <53FA> <99DB>
+<5401> <5401> <99DC>
+<5403> <5403> <8B68>
+<5404> <5404> <8A65>
+<5408> <5408> <8D87>
+<5409> <5409> <8B67>
+<540A> <540A> <92DD>
+<540B> <540B> <8944>
+<540C> <540C> <93AF>
+<540D> <540D> <96BC>
+<540E> <540E> <8D40>
+<540F> <540F> <9799>
+<5410> <5410> <9366>
+<5411> <5411> <8CFC>
+<541B> <541B> <8C4E>
+<541D> <541D> <99E5>
+<541F> <541F> <8BE1>
+<5420> <5420> <9669>
+<5426> <5426> <94DB>
+<5429> <5429> <99E4>
+<542B> <542B> <8ADC>
+<542C> <542D> <99DF>
+<542E> <542E> <99E2>
+<5436> <5436> <99E3>
+<5438> <5438> <8B7A>
+<5439> <5439> <9081>
+<543B> <543B> <95AB>
+<543C> <543C> <99E1>
+<543D> <543D> <99DD>
+<543E> <543E> <8CE1>
+<5440> <5440> <99DE>
+<5442> <5442> <9843>
+<5446> <5446> <95F0>
+<5448> <5448> <92E6>
+<5449> <5449> <8CE0>
+<544A> <544A> <8D90>
+<544E> <544E> <99E6>
+<5451> <5451> <93DB>
+<545F> <545F> <99EA>
+<5468> <5468> <8EFC>
+<546A> <546A> <8EF4>
+<5470> <5470> <99ED>
+<5471> <5471> <99EB>
+<5473> <5473> <96A1>
+<5475> <5475> <99E8>
+<5476> <5476> <99F1>
+<5477> <5477> <99EC>
+<547B> <547B> <99EF>
+<547C> <547C> <8CC4>
+<547D> <547D> <96BD>
+<5480> <5480> <99F0>
+<5484> <5484> <99F2>
+<5486> <5486> <99F4>
+<548A> <548A> <FA92>
+<548B> <548B> <8DEE>
+<548C> <548C> <9861>
+<548E> <548E> <99E9>
+<548F> <548F> <99E7>
+<5490> <5490> <99F3>
+<5492> <5492> <99EE>
+<549C> <549C> <FA91>
+<54A2> <54A2> <99F6>
+<54A4> <54A4> <9A42>
+<54A5> <54A5> <99F8>
+<54A8> <54A8> <99FC>
+<54A9> <54A9> <FA93>
+<54AB> <54AB> <9A40>
+<54AC> <54AC> <99F9>
+<54AF> <54AF> <9A5D>
+<54B2> <54B2> <8DE7>
+<54B3> <54B3> <8A50>
+<54B8> <54B8> <99F7>
+<54BC> <54BC> <9A44>
+<54BD> <54BD> <88F4>
+<54BE> <54BE> <9A43>
+<54C0> <54C0> <88A3>
+<54C1> <54C1> <9569>
+<54C2> <54C2> <9A41>
+<54C4> <54C4> <99FA>
+<54C7> <54C7> <99F5>
+<54C8> <54C8> <99FB>
+<54C9> <54C9> <8DC6>
+<54D8> <54D8> <9A45>
+<54E1> <54E1> <88F5>
+<54E2> <54E2> <9A4E>
+<54E5> <54E6> <9A46>
+<54E8> <54E8> <8FA3>
+<54E9> <54E9> <9689>
+<54ED> <54ED> <9A4C>
+<54EE> <54EE> <9A4B>
+<54F2> <54F2> <934E>
+endbfrange
+
+100 beginbfrange
+<54FA> <54FA> <9A4D>
+<54FD> <54FD> <9A4A>
+<54FF> <54FF> <FA94>
+<5504> <5504> <8953>
+<5506> <5506> <8DB4>
+<5507> <5507> <904F>
+<550F> <550F> <9A48>
+<5510> <5510> <9382>
+<5514> <5514> <9A49>
+<5516> <5516> <88A0>
+<552E> <552E> <9A53>
+<552F> <552F> <9742>
+<5531> <5531> <8FA5>
+<5533> <5533> <9A59>
+<5538> <5538> <9A58>
+<5539> <5539> <9A4F>
+<553E> <553E> <91C1>
+<5540> <5540> <9A50>
+<5544> <5544> <91ED>
+<5545> <5545> <9A55>
+<5546> <5546> <8FA4>
+<554C> <554C> <9A52>
+<554F> <554F> <96E2>
+<5553> <5553> <8C5B>
+<5556> <5557> <9A56>
+<555C> <555C> <9A54>
+<555D> <555D> <9A5A>
+<555E> <555E> <88A0>
+<5563> <5563> <9A51>
+<557B> <557B> <9A60>
+<557C> <557C> <9A65>
+<557E> <557E> <9A61>
+<5580> <5580> <9A5C>
+<5583> <5583> <9A66>
+<5584> <5584> <9150>
+<5586> <5586> <FA95>
+<5587> <5587> <9A68>
+<5589> <5589> <8D41>
+<558A> <558A> <9A5E>
+<558B> <558B> <929D>
+<5598> <5598> <9A62>
+<5599> <5599> <9A5B>
+<559A> <559A> <8AAB>
+<559C> <559C> <8AEC>
+<559D> <559D> <8A85>
+<559E> <559E> <9A63>
+<559F> <559F> <9A5F>
+<55A7> <55A7> <8C96>
+<55A8> <55A8> <9A69>
+<55A9> <55A9> <9A67>
+<55AA> <55AA> <9172>
+<55AB> <55AB> <8B69>
+<55AC> <55AC> <8BAA>
+<55AE> <55AE> <9A64>
+<55B0> <55B0> <8BF2>
+<55B6> <55B6> <8963>
+<55C4> <55C4> <9A6D>
+<55C5> <55C5> <9A6B>
+<55C7> <55C7> <9AA5>
+<55D4> <55D4> <9A70>
+<55DA> <55DA> <9A6A>
+<55DC> <55DC> <9A6E>
+<55DF> <55DF> <9A6C>
+<55E3> <55E3> <8E6B>
+<55E4> <55E4> <9A6F>
+<55F7> <55F7> <9A72>
+<55F9> <55F9> <9A77>
+<55FD> <55FD> <9A75>
+<55FE> <55FE> <9A74>
+<5606> <5606> <9251>
+<5609> <5609> <89C3>
+<5614> <5614> <9A71>
+<5616> <5616> <9A73>
+<5617> <5617> <8FA6>
+<5618> <5618> <8952>
+<561B> <561B> <9A76>
+<5629> <5629> <89DC>
+<562F> <562F> <9A82>
+<5631> <5631> <8FFA>
+<5632> <5632> <9A7D>
+<5634> <5634> <9A7B>
+<5636> <5636> <9A7C>
+<5638> <5638> <9A7E>
+<5642> <5642> <895C>
+<564C> <564C> <9158>
+<564E> <564E> <9A78>
+<5650> <5650> <9A79>
+<5653> <5653> <8952>
+<565B> <565B> <8A9A>
+<5664> <5664> <9A81>
+<5668> <5668> <8AED>
+<566A> <566A> <9A84>
+<566B> <566B> <9A80>
+<566C> <566C> <9A83>
+<5674> <5674> <95AC>
+<5678> <5678> <93D3>
+<567A> <567A> <94B6>
+<5680> <5680> <9A86>
+<5686> <5686> <9A85>
+<5687> <5687> <8A64>
+endbfrange
+
+100 beginbfrange
+<568A> <568A> <9A87>
+<568F> <568F> <9A8A>
+<5694> <5694> <9A89>
+<5699> <5699> <8A9A>
+<56A0> <56A0> <9A88>
+<56A2> <56A2> <9458>
+<56A5> <56A5> <9A8B>
+<56AE> <56AE> <9A8C>
+<56B4> <56B4> <9A8E>
+<56B6> <56B6> <9A8D>
+<56BC> <56BC> <9A90>
+<56C0> <56C0> <9A93>
+<56C1> <56C1> <9A91>
+<56C2> <56C2> <9A8F>
+<56C3> <56C3> <9A92>
+<56C8> <56C8> <9A94>
+<56CA> <56CA> <9458>
+<56CE> <56CE> <9A95>
+<56D1> <56D1> <9A96>
+<56D3> <56D3> <9A97>
+<56D7> <56D7> <9A98>
+<56D8> <56D8> <9964>
+<56DA> <56DA> <8EFA>
+<56DB> <56DB> <8E6C>
+<56DE> <56DE> <89F1>
+<56E0> <56E0> <88F6>
+<56E3> <56E3> <9263>
+<56EE> <56EE> <9A99>
+<56F0> <56F0> <8DA2>
+<56F2> <56F2> <88CD>
+<56F3> <56F3> <907D>
+<56F9> <56F9> <9A9A>
+<56FA> <56FA> <8CC5>
+<56FD> <56FD> <8D91>
+<56FF> <56FF> <9A9C>
+<5700> <5700> <9A9B>
+<5703> <5703> <95DE>
+<5704> <5704> <9A9D>
+<5708> <5708> <9A9F>
+<5709> <5709> <9A9E>
+<570B> <570B> <9AA0>
+<570D> <570D> <9AA1>
+<570F> <570F> <8C97>
+<5712> <5712> <8980>
+<5713> <5713> <9AA2>
+<5716> <5716> <9AA4>
+<5718> <5718> <9AA3>
+<571C> <571C> <9AA6>
+<571F> <571F> <9379>
+<5726> <5726> <9AA7>
+<5727> <5727> <88B3>
+<5728> <5728> <8DDD>
+<572D> <572D> <8C5C>
+<5730> <5730> <926E>
+<5737> <5738> <9AA8>
+<573B> <573B> <9AAB>
+<5740> <5740> <9AAC>
+<5742> <5742> <8DE2>
+<5747> <5747> <8BCF>
+<574A> <574A> <9656>
+<574E> <574E> <9AAA>
+<574F> <574F> <9AAD>
+<5750> <5750> <8DBF>
+<5751> <5751> <8D42>
+<5759> <5759> <FA96>
+<5761> <5761> <9AB1>
+<5764> <5764> <8DA3>
+<5765> <5765> <FA97>
+<5766> <5766> <9252>
+<5769> <5769> <9AAE>
+<576A> <576A> <92D8>
+<577F> <577F> <9AB2>
+<5782> <5782> <9082>
+<5788> <5788> <9AB0>
+<5789> <5789> <9AB3>
+<578B> <578B> <8C5E>
+<5793> <5793> <9AB4>
+<57A0> <57A0> <9AB5>
+<57A2> <57A2> <8D43>
+<57A3> <57A3> <8A5F>
+<57A4> <57A4> <9AB7>
+<57AA> <57AA> <9AB8>
+<57AC> <57AC> <FA98>
+<57B0> <57B0> <9AB9>
+<57B3> <57B3> <9AB6>
+<57C0> <57C0> <9AAF>
+<57C3> <57C3> <9ABA>
+<57C6> <57C6> <9ABB>
+<57C7> <57C7> <FA9A>
+<57C8> <57C8> <FA99>
+<57CB> <57CB> <9684>
+<57CE> <57CE> <8FE9>
+<57D2> <57D3> <9ABD>
+<57D4> <57D4> <9ABC>
+<57D6> <57D6> <9AC0>
+<57DC> <57DC> <9457>
+<57DF> <57DF> <88E6>
+<57E0> <57E0> <9575>
+<57E3> <57E3> <9AC1>
+<57F4> <57F4> <8FFB>
+endbfrange
+
+100 beginbfrange
+<57F7> <57F7> <8EB7>
+<57F9> <57F9> <947C>
+<57FA> <57FA> <8AEE>
+<57FC> <57FC> <8DE9>
+<5800> <5800> <9678>
+<5802> <5802> <93B0>
+<5805> <5805> <8C98>
+<5806> <5806> <91CD>
+<580A> <580A> <9ABF>
+<580B> <580B> <9AC2>
+<5815> <5815> <91C2>
+<5819> <5819> <9AC3>
+<581D> <581D> <9AC4>
+<5821> <5821> <9AC6>
+<5824> <5824> <92E7>
+<582A> <582A> <8AAC>
+<582F> <582F> <EA9F>
+<5830> <5830> <8981>
+<5831> <5831> <95F1>
+<5834> <5834> <8FEA>
+<5835> <5835> <9367>
+<583A> <583A> <8DE4>
+<583D> <583D> <9ACC>
+<5840> <5840> <95BB>
+<5841> <5841> <97DB>
+<584A> <584A> <89F2>
+<584B> <584B> <9AC8>
+<5851> <5851> <9159>
+<5852> <5852> <9ACB>
+<5854> <5854> <9383>
+<5857> <5857> <9368>
+<5858> <5858> <9384>
+<5859> <5859> <94B7>
+<585A> <585A> <92CB>
+<585E> <585E> <8DC7>
+<5861> <5861> <9355>
+<5862> <5862> <9AC7>
+<5869> <5869> <8996>
+<586B> <586B> <9355>
+<5870> <5870> <9AC9>
+<5872> <5872> <9AC5>
+<5875> <5875> <906F>
+<5879> <5879> <9ACD>
+<587E> <587E> <8F6D>
+<5883> <5883> <8BAB>
+<5885> <5885> <9ACE>
+<5893> <5893> <95E6>
+<5897> <5897> <919D>
+<589C> <589C> <92C4>
+<589E> <589E> <FA9D>
+<589F> <589F> <9AD0>
+<58A8> <58A8> <966E>
+<58AB> <58AB> <9AD1>
+<58AE> <58AE> <9AD6>
+<58B2> <58B2> <FA9E>
+<58B3> <58B3> <95AD>
+<58B8> <58B8> <9AD5>
+<58B9> <58B9> <9ACF>
+<58BA> <58BA> <9AD2>
+<58BB> <58BB> <9AD4>
+<58BE> <58BE> <8DA4>
+<58C1> <58C1> <95C7>
+<58C5> <58C5> <9AD7>
+<58C7> <58C7> <9264>
+<58CA> <58CA> <89F3>
+<58CC> <58CC> <8FEB>
+<58D1> <58D1> <9AD9>
+<58D3> <58D3> <9AD8>
+<58D5> <58D5> <8D88>
+<58D7> <58D7> <9ADA>
+<58D8> <58D8> <9ADC>
+<58D9> <58D9> <9ADB>
+<58DC> <58DC> <9ADE>
+<58DE> <58DE> <9AD3>
+<58DF> <58DF> <9AE0>
+<58E4> <58E4> <9ADF>
+<58E5> <58E5> <9ADD>
+<58EB> <58EB> <8E6D>
+<58EC> <58EC> <9070>
+<58EE> <58EE> <9173>
+<58EF> <58EF> <9AE1>
+<58F0> <58F0> <90BA>
+<58F1> <58F1> <88EB>
+<58F2> <58F2> <9484>
+<58F7> <58F7> <92D9>
+<58F9> <58F9> <9AE3>
+<58FA> <58FA> <9AE2>
+<58FB> <58FD> <9AE4>
+<5902> <5902> <9AE7>
+<5909> <5909> <95CF>
+<590A> <590A> <9AE8>
+<590B> <590B> <FA9F>
+<590F> <590F> <89C4>
+<5910> <5910> <9AE9>
+<5915> <5915> <975B>
+<5916> <5916> <8A4F>
+<5918> <5918> <99C7>
+<5919> <5919> <8F67>
+<591A> <591A> <91BD>
+<591B> <591B> <9AEA>
+endbfrange
+
+100 beginbfrange
+<591C> <591C> <96E9>
+<5922> <5922> <96B2>
+<5925> <5925> <9AEC>
+<5927> <5927> <91E5>
+<5929> <5929> <9356>
+<592A> <592A> <91BE>
+<592B> <592B> <9576>
+<592C> <592D> <9AED>
+<592E> <592E> <899B>
+<5931> <5931> <8EB8>
+<5932> <5932> <9AEF>
+<5937> <5937> <88CE>
+<5938> <5938> <9AF0>
+<593E> <593E> <9AF1>
+<5944> <5944> <8982>
+<5947> <5947> <8AEF>
+<5948> <5948> <93DE>
+<5949> <5949> <95F2>
+<594E> <594E> <9AF5>
+<594F> <594F> <9174>
+<5950> <5950> <9AF4>
+<5951> <5951> <8C5F>
+<5953> <5953> <FAA0>
+<5954> <5954> <967A>
+<5955> <5955> <9AF3>
+<5957> <5957> <9385>
+<5958> <5958> <9AF7>
+<595A> <595A> <9AF6>
+<595B> <595B> <FAA1>
+<595D> <595D> <FAA2>
+<5960> <5960> <9AF9>
+<5962> <5962> <9AF8>
+<5963> <5963> <FAA3>
+<5965> <5965> <899C>
+<5967> <5967> <9AFA>
+<5968> <5968> <8FA7>
+<5969> <5969> <9AFC>
+<596A> <596A> <9244>
+<596C> <596C> <9AFB>
+<596E> <596E> <95B1>
+<5973> <5973> <8F97>
+<5974> <5974> <937A>
+<5978> <5978> <9B40>
+<597D> <597D> <8D44>
+<5981> <5981> <9B41>
+<5982> <5982> <9440>
+<5983> <5983> <94DC>
+<5984> <5984> <96CF>
+<598A> <598A> <9444>
+<598D> <598D> <9B4A>
+<5993> <5993> <8B57>
+<5996> <5996> <9764>
+<5999> <5999> <96AD>
+<599B> <599B> <9BAA>
+<599D> <599D> <9B42>
+<59A3> <59A3> <9B45>
+<59A4> <59A4> <FAA4>
+<59A5> <59A5> <91C3>
+<59A8> <59A8> <9657>
+<59AC> <59AC> <9369>
+<59B2> <59B2> <9B46>
+<59B9> <59B9> <9685>
+<59BA> <59BA> <FAA5>
+<59BB> <59BB> <8DC8>
+<59BE> <59BE> <8FA8>
+<59C6> <59C6> <9B47>
+<59C9> <59C9> <8E6F>
+<59CB> <59CB> <8E6E>
+<59D0> <59D0> <88B7>
+<59D1> <59D1> <8CC6>
+<59D3> <59D3> <90A9>
+<59D4> <59D4> <88CF>
+<59D9> <59DA> <9B4B>
+<59DC> <59DC> <9B49>
+<59E5> <59E5> <8957>
+<59E6> <59E6> <8AAD>
+<59E8> <59E8> <9B48>
+<59EA> <59EA> <96C3>
+<59EB> <59EB> <9550>
+<59F6> <59F6> <88A6>
+<59FB> <59FB> <88F7>
+<59FF> <59FF> <8E70>
+<5A01> <5A01> <88D0>
+<5A03> <5A03> <88A1>
+<5A09> <5A09> <9B51>
+<5A11> <5A11> <9B4F>
+<5A18> <5A18> <96BA>
+<5A1A> <5A1A> <9B52>
+<5A1C> <5A1C> <9B50>
+<5A1F> <5A1F> <9B4E>
+<5A20> <5A20> <9050>
+<5A25> <5A25> <9B4D>
+<5A29> <5A29> <95D8>
+<5A2F> <5A2F> <8CE2>
+<5A35> <5A36> <9B56>
+<5A3C> <5A3C> <8FA9>
+<5A40> <5A40> <9B53>
+<5A41> <5A41> <984B>
+<5A46> <5A46> <946B>
+<5A49> <5A49> <9B55>
+endbfrange
+
+100 beginbfrange
+<5A5A> <5A5A> <8DA5>
+<5A62> <5A62> <9B58>
+<5A66> <5A66> <9577>
+<5A6A> <5A6A> <9B59>
+<5A6C> <5A6C> <9B54>
+<5A7F> <5A7F> <96B9>
+<5A92> <5A92> <947D>
+<5A9A> <5A9A> <9B5A>
+<5A9B> <5A9B> <9551>
+<5ABC> <5ABC> <9B5B>
+<5ABD> <5ABD> <9B5F>
+<5ABE> <5ABE> <9B5C>
+<5AC1> <5AC1> <89C5>
+<5AC2> <5AC2> <9B5E>
+<5AC9> <5AC9> <8EB9>
+<5ACB> <5ACB> <9B5D>
+<5ACC> <5ACC> <8C99>
+<5AD0> <5AD0> <9B6B>
+<5AD6> <5AD6> <9B64>
+<5AD7> <5AD7> <9B61>
+<5AE1> <5AE1> <9284>
+<5AE3> <5AE3> <9B60>
+<5AE6> <5AE6> <9B62>
+<5AE9> <5AE9> <9B63>
+<5AFA> <5AFB> <9B65>
+<5B09> <5B09> <8AF0>
+<5B0B> <5B0B> <9B68>
+<5B0C> <5B0C> <9B67>
+<5B16> <5B16> <9B69>
+<5B22> <5B22> <8FEC>
+<5B2A> <5B2A> <9B6C>
+<5B2C> <5B2C> <92DA>
+<5B30> <5B30> <8964>
+<5B32> <5B32> <9B6A>
+<5B36> <5B36> <9B6D>
+<5B3E> <5B3E> <9B6E>
+<5B40> <5B40> <9B71>
+<5B43> <5B43> <9B6F>
+<5B45> <5B45> <9B70>
+<5B50> <5B50> <8E71>
+<5B51> <5B51> <9B72>
+<5B54> <5B54> <8D45>
+<5B55> <5B55> <9B73>
+<5B56> <5B56> <FAA6>
+<5B57> <5B57> <8E9A>
+<5B58> <5B58> <91B6>
+<5B5A> <5B5B> <9B74>
+<5B5C> <5B5C> <8E79>
+<5B5D> <5B5D> <8D46>
+<5B5F> <5B5F> <96D0>
+<5B63> <5B63> <8B47>
+<5B64> <5B64> <8CC7>
+<5B65> <5B65> <9B76>
+<5B66> <5B66> <8A77>
+<5B69> <5B69> <9B77>
+<5B6B> <5B6B> <91B7>
+<5B70> <5B70> <9B78>
+<5B71> <5B71> <9BA1>
+<5B73> <5B73> <9B79>
+<5B75> <5B75> <9B7A>
+<5B78> <5B78> <9B7B>
+<5B7A> <5B7A> <9B7D>
+<5B80> <5B80> <9B7E>
+<5B83> <5B83> <9B80>
+<5B85> <5B85> <91EE>
+<5B87> <5B87> <8946>
+<5B88> <5B88> <8EE7>
+<5B89> <5B89> <88C0>
+<5B8B> <5B8B> <9176>
+<5B8C> <5B8C> <8AAE>
+<5B8D> <5B8D> <8EB3>
+<5B8F> <5B8F> <8D47>
+<5B95> <5B95> <9386>
+<5B97> <5B97> <8F40>
+<5B98> <5B98> <8AAF>
+<5B99> <5B99> <9288>
+<5B9A> <5B9A> <92E8>
+<5B9B> <5B9B> <88B6>
+<5B9C> <5B9C> <8B58>
+<5B9D> <5B9D> <95F3>
+<5B9F> <5B9F> <8EC0>
+<5BA2> <5BA2> <8B71>
+<5BA3> <5BA3> <90E9>
+<5BA4> <5BA4> <8EBA>
+<5BA5> <5BA5> <9747>
+<5BA6> <5BA6> <9B81>
+<5BAE> <5BAE> <8B7B>
+<5BB0> <5BB0> <8DC9>
+<5BB3> <5BB3> <8A51>
+<5BB4> <5BB4> <8983>
+<5BB5> <5BB5> <8FAA>
+<5BB6> <5BB6> <89C6>
+<5BB8> <5BB8> <9B82>
+<5BB9> <5BB9> <9765>
+<5BBF> <5BBF> <8F68>
+<5BC0> <5BC0> <FAA7>
+<5BC2> <5BC2> <8EE2>
+<5BC3> <5BC3> <9B83>
+<5BC4> <5BC4> <8AF1>
+<5BC5> <5BC5> <93D0>
+endbfrange
+
+100 beginbfrange
+<5BC6> <5BC6> <96A7>
+<5BC7> <5BC7> <9B84>
+<5BC9> <5BC9> <9B85>
+<5BCC> <5BCC> <9578>
+<5BD0> <5BD0> <9B87>
+<5BD2> <5BD2> <8AA6>
+<5BD3> <5BD3> <8BF5>
+<5BD4> <5BD4> <9B86>
+<5BD8> <5BD8> <FAA9>
+<5BDB> <5BDB> <8AB0>
+<5BDD> <5BDD> <9051>
+<5BDE> <5BDE> <9B8B>
+<5BDF> <5BDF> <8E40>
+<5BE1> <5BE1> <89C7>
+<5BE2> <5BE2> <9B8A>
+<5BE4> <5BE4> <9B88>
+<5BE5> <5BE5> <9B8C>
+<5BE6> <5BE6> <9B89>
+<5BE7> <5BE7> <944A>
+<5BE8> <5BE8> <9ECB>
+<5BE9> <5BE9> <9052>
+<5BEB> <5BEB> <9B8D>
+<5BEC> <5BEC> <FAAA>
+<5BEE> <5BEE> <97BE>
+<5BF0> <5BF0> <9B8E>
+<5BF3> <5BF3> <9B90>
+<5BF5> <5BF5> <929E>
+<5BF6> <5BF6> <9B8F>
+<5BF8> <5BF8> <90A1>
+<5BFA> <5BFA> <8E9B>
+<5BFE> <5BFE> <91CE>
+<5BFF> <5BFF> <8EF5>
+<5C01> <5C01> <9595>
+<5C02> <5C02> <90EA>
+<5C04> <5C04> <8ECB>
+<5C05> <5C05> <9B91>
+<5C06> <5C06> <8FAB>
+<5C07> <5C08> <9B92>
+<5C09> <5C09> <88D1>
+<5C0A> <5C0A> <91B8>
+<5C0B> <5C0B> <9071>
+<5C0D> <5C0D> <9B94>
+<5C0E> <5C0E> <93B1>
+<5C0F> <5C0F> <8FAC>
+<5C11> <5C11> <8FAD>
+<5C13> <5C13> <9B95>
+<5C16> <5C16> <90EB>
+<5C1A> <5C1A> <8FAE>
+<5C1E> <5C1E> <FAAB>
+<5C20> <5C20> <9B96>
+<5C22> <5C22> <9B97>
+<5C24> <5C24> <96DE>
+<5C28> <5C28> <9B98>
+<5C2D> <5C2D> <8BC4>
+<5C31> <5C31> <8F41>
+<5C38> <5C39> <9B99>
+<5C3A> <5C3A> <8EDA>
+<5C3B> <5C3B> <904B>
+<5C3C> <5C3C> <93F2>
+<5C3D> <5C3D> <9073>
+<5C3E> <5C3E> <94F6>
+<5C3F> <5C3F> <9441>
+<5C40> <5C40> <8BC7>
+<5C41> <5C41> <9B9B>
+<5C45> <5C45> <8B8F>
+<5C46> <5C46> <9B9C>
+<5C48> <5C48> <8BFC>
+<5C4A> <5C4A> <93CD>
+<5C4B> <5C4B> <89AE>
+<5C4D> <5C4D> <8E72>
+<5C4E> <5C4E> <9B9D>
+<5C4F> <5C4F> <9BA0>
+<5C50> <5C50> <9B9F>
+<5C51> <5C51> <8BFB>
+<5C53> <5C53> <9B9E>
+<5C55> <5C55> <9357>
+<5C5B> <5C5B> <9BA0>
+<5C5E> <5C5E> <91AE>
+<5C60> <5C60> <936A>
+<5C61> <5C61> <8EC6>
+<5C62> <5C62> <8EC6>
+<5C64> <5C64> <9177>
+<5C65> <5C65> <979A>
+<5C6C> <5C6C> <9BA2>
+<5C6E> <5C6E> <9BA3>
+<5C6F> <5C6F> <93D4>
+<5C71> <5C71> <8E52>
+<5C76> <5C76> <9BA5>
+<5C79> <5C79> <9BA6>
+<5C8C> <5C8C> <9BA7>
+<5C90> <5C90> <8AF2>
+<5C91> <5C91> <9BA8>
+<5C94> <5C94> <9BA9>
+<5CA1> <5CA1> <89AA>
+<5CA6> <5CA6> <FAAC>
+<5CA8> <5CA8> <915A>
+<5CA9> <5CA9> <8AE2>
+<5CAB> <5CAB> <9BAB>
+<5CAC> <5CAC> <96A6>
+<5CB1> <5CB1> <91D0>
+endbfrange
+
+100 beginbfrange
+<5CB3> <5CB3> <8A78>
+<5CB6> <5CB6> <9BAD>
+<5CB7> <5CB7> <9BAF>
+<5CB8> <5CB8> <8ADD>
+<5CBA> <5CBA> <FAAD>
+<5CBB> <5CBB> <9BAC>
+<5CBC> <5CBC> <9BAE>
+<5CBE> <5CBE> <9BB1>
+<5CC5> <5CC5> <9BB0>
+<5CC7> <5CC7> <9BB2>
+<5CD9> <5CD9> <9BB3>
+<5CE0> <5CE0> <93BB>
+<5CE1> <5CE1> <8BAC>
+<5CE8> <5CE8> <89E3>
+<5CE9> <5CE9> <9BB4>
+<5CEA> <5CEA> <9BB9>
+<5CED> <5CED> <9BB7>
+<5CEF> <5CEF> <95F5>
+<5CF0> <5CF0> <95F4>
+<5CF5> <5CF5> <FAAE>
+<5CF6> <5CF6> <9387>
+<5CFA> <5CFA> <9BB6>
+<5CFB> <5CFB> <8F73>
+<5CFD> <5CFD> <9BB5>
+<5D07> <5D07> <9092>
+<5D0B> <5D0B> <9BBA>
+<5D0E> <5D0E> <8DE8>
+<5D11> <5D11> <9BC0>
+<5D14> <5D14> <9BC1>
+<5D15> <5D15> <9BBB>
+<5D16> <5D16> <8A52>
+<5D17> <5D17> <9BBC>
+<5D18> <5D18> <9BC5>
+<5D19> <5D19> <9BC4>
+<5D1A> <5D1A> <9BC3>
+<5D1B> <5D1B> <9BBF>
+<5D1F> <5D1F> <9BBE>
+<5D22> <5D22> <9BC2>
+<5D27> <5D27> <FAAF>
+<5D29> <5D29> <95F6>
+<5D42> <5D42> <FAB2>
+<5D4B> <5D4B> <9BC9>
+<5D4C> <5D4C> <9BC6>
+<5D4E> <5D4E> <9BC8>
+<5D50> <5D50> <9792>
+<5D52> <5D52> <9BC7>
+<5D53> <5D53> <FAB0>
+<5D5C> <5D5C> <9BBD>
+<5D69> <5D69> <9093>
+<5D6C> <5D6C> <9BCA>
+<5D6D> <5D6D> <FAB3>
+<5D6F> <5D6F> <8DB5>
+<5D73> <5D73> <9BCB>
+<5D76> <5D76> <9BCC>
+<5D82> <5D82> <9BCF>
+<5D84> <5D84> <9BCE>
+<5D87> <5D87> <9BCD>
+<5D8B> <5D8B> <9388>
+<5D8C> <5D8C> <9BB8>
+<5D90> <5D90> <9BD5>
+<5D9D> <5D9D> <9BD1>
+<5DA2> <5DA2> <9BD0>
+<5DAC> <5DAC> <9BD2>
+<5DAE> <5DAE> <9BD3>
+<5DB7> <5DB7> <9BD6>
+<5DB8> <5DB9> <FAB4>
+<5DBA> <5DBA> <97E4>
+<5DBC> <5DBC> <9BD7>
+<5DBD> <5DBD> <9BD4>
+<5DC9> <5DC9> <9BD8>
+<5DCC> <5DCC> <8ADE>
+<5DCD> <5DCD> <9BD9>
+<5DD0> <5DD0> <FAB6>
+<5DD2> <5DD2> <9BDB>
+<5DD3> <5DD3> <9BDA>
+<5DD6> <5DD6> <9BDC>
+<5DDB> <5DDB> <9BDD>
+<5DDD> <5DDD> <90EC>
+<5DDE> <5DDE> <8F42>
+<5DE1> <5DE1> <8F84>
+<5DE3> <5DE3> <9183>
+<5DE5> <5DE5> <8D48>
+<5DE6> <5DE6> <8DB6>
+<5DE7> <5DE7> <8D49>
+<5DE8> <5DE8> <8B90>
+<5DEB> <5DEB> <9BDE>
+<5DEE> <5DEE> <8DB7>
+<5DF1> <5DF1> <8CC8>
+<5DF2> <5DF2> <9BDF>
+<5DF3> <5DF3> <96A4>
+<5DF4> <5DF4> <9462>
+<5DF5> <5DF5> <9BE0>
+<5DF7> <5DF7> <8D4A>
+<5DFB> <5DFB> <8AAA>
+<5DFD> <5DFD> <9246>
+<5DFE> <5DFE> <8BD0>
+<5E02> <5E02> <8E73>
+<5E03> <5E03> <957A>
+<5E06> <5E06> <94BF>
+<5E0B> <5E0B> <9BE1>
+endbfrange
+
+100 beginbfrange
+<5E0C> <5E0C> <8AF3>
+<5E11> <5E11> <9BE4>
+<5E16> <5E16> <929F>
+<5E19> <5E19> <9BE3>
+<5E1A> <5E1A> <9BE2>
+<5E1B> <5E1B> <9BE5>
+<5E1D> <5E1D> <92E9>
+<5E25> <5E25> <9083>
+<5E2B> <5E2B> <8E74>
+<5E2D> <5E2D> <90C8>
+<5E2F> <5E2F> <91D1>
+<5E30> <5E30> <8B41>
+<5E33> <5E33> <92A0>
+<5E36> <5E37> <9BE6>
+<5E38> <5E38> <8FED>
+<5E3D> <5E3D> <9658>
+<5E40> <5E40> <9BEA>
+<5E43> <5E43> <9BE9>
+<5E44> <5E44> <9BE8>
+<5E45> <5E45> <959D>
+<5E47> <5E47> <9BF1>
+<5E4C> <5E4C> <9679>
+<5E4E> <5E4E> <9BEB>
+<5E54> <5E54> <9BED>
+<5E55> <5E55> <968B>
+<5E57> <5E57> <9BEC>
+<5E5F> <5E5F> <9BEE>
+<5E61> <5E61> <94A6>
+<5E62> <5E62> <9BEF>
+<5E63> <5E63> <95BC>
+<5E64> <5E64> <9BF0>
+<5E72> <5E72> <8AB1>
+<5E73> <5E73> <95BD>
+<5E74> <5E74> <944E>
+<5E75> <5E76> <9BF2>
+<5E78> <5E78> <8D4B>
+<5E79> <5E79> <8AB2>
+<5E7A> <5E7A> <9BF4>
+<5E7B> <5E7B> <8CB6>
+<5E7C> <5E7C> <9763>
+<5E7D> <5E7D> <9748>
+<5E7E> <5E7E> <8AF4>
+<5E7F> <5E7F> <9BF6>
+<5E81> <5E81> <92A1>
+<5E83> <5E83> <8D4C>
+<5E84> <5E84> <8FAF>
+<5E87> <5E87> <94DD>
+<5E8A> <5E8A> <8FB0>
+<5E8F> <5E8F> <8F98>
+<5E95> <5E95> <92EA>
+<5E96> <5E96> <95F7>
+<5E97> <5E97> <9358>
+<5E9A> <5E9A> <8D4D>
+<5E9C> <5E9C> <957B>
+<5EA0> <5EA0> <9BF7>
+<5EA6> <5EA6> <9378>
+<5EA7> <5EA7> <8DC0>
+<5EAB> <5EAB> <8CC9>
+<5EAD> <5EAD> <92EB>
+<5EB5> <5EB5> <88C1>
+<5EB6> <5EB6> <8F8E>
+<5EB7> <5EB7> <8D4E>
+<5EB8> <5EB8> <9766>
+<5EC1> <5EC2> <9BF8>
+<5EC3> <5EC3> <9470>
+<5EC8> <5EC8> <9BFA>
+<5EC9> <5EC9> <97F5>
+<5ECA> <5ECA> <984C>
+<5ECF> <5ECF> <9BFC>
+<5ED0> <5ED0> <9BFB>
+<5ED3> <5ED3> <8A66>
+<5ED6> <5ED6> <9C40>
+<5EDA> <5EDB> <9C43>
+<5EDD> <5EDD> <9C42>
+<5EDF> <5EDF> <955F>
+<5EE0> <5EE0> <8FB1>
+<5EE1> <5EE1> <9C46>
+<5EE2> <5EE2> <9C45>
+<5EE3> <5EE3> <9C41>
+<5EE8> <5EE9> <9C47>
+<5EEC> <5EEC> <9C49>
+<5EF0> <5EF0> <9C4C>
+<5EF1> <5EF1> <9C4A>
+<5EF3> <5EF3> <9C4B>
+<5EF4> <5EF4> <9C4D>
+<5EF6> <5EF6> <8984>
+<5EF7> <5EF7> <92EC>
+<5EF8> <5EF8> <9C4E>
+<5EFA> <5EFA> <8C9A>
+<5EFB> <5EFB> <89F4>
+<5EFC> <5EFC> <9455>
+<5EFE> <5EFE> <9C4F>
+<5EFF> <5EFF> <93F9>
+<5F01> <5F01> <95D9>
+<5F03> <5F03> <9C50>
+<5F04> <5F04> <984D>
+<5F09> <5F09> <9C51>
+<5F0A> <5F0A> <95BE>
+<5F0B> <5F0B> <9C54>
+<5F0C> <5F0C> <989F>
+endbfrange
+
+100 beginbfrange
+<5F0D> <5F0D> <98AF>
+<5F0F> <5F0F> <8EAE>
+<5F10> <5F10> <93F3>
+<5F11> <5F11> <9C55>
+<5F13> <5F13> <8B7C>
+<5F14> <5F14> <92A2>
+<5F15> <5F15> <88F8>
+<5F16> <5F16> <9C56>
+<5F17> <5F17> <95A4>
+<5F18> <5F18> <8D4F>
+<5F1B> <5F1B> <926F>
+<5F1F> <5F1F> <92ED>
+<5F21> <5F21> <FAB7>
+<5F25> <5F25> <96ED>
+<5F26> <5F26> <8CB7>
+<5F27> <5F27> <8CCA>
+<5F29> <5F29> <9C57>
+<5F2D> <5F2D> <9C58>
+<5F2F> <5F2F> <9C5E>
+<5F31> <5F31> <8EE3>
+<5F34> <5F34> <FAB8>
+<5F35> <5F35> <92A3>
+<5F37> <5F37> <8BAD>
+<5F38> <5F38> <9C59>
+<5F3C> <5F3C> <954A>
+<5F3E> <5F3E> <9265>
+<5F41> <5F41> <9C5A>
+<5F45> <5F45> <FA67>
+<5F48> <5F48> <9C5B>
+<5F4A> <5F4A> <8BAE>
+<5F4C> <5F4C> <9C5C>
+<5F4E> <5F4E> <9C5D>
+<5F51> <5F51> <9C5F>
+<5F53> <5F53> <9396>
+<5F56> <5F57> <9C60>
+<5F59> <5F59> <9C62>
+<5F5C> <5F5C> <9C53>
+<5F5D> <5F5D> <9C52>
+<5F61> <5F61> <9C63>
+<5F62> <5F62> <8C60>
+<5F66> <5F66> <9546>
+<5F67> <5F67> <FAB9>
+<5F69> <5F69> <8DCA>
+<5F6A> <5F6A> <9556>
+<5F6B> <5F6B> <92A4>
+<5F6C> <5F6C> <956A>
+<5F6D> <5F6D> <9C64>
+<5F70> <5F70> <8FB2>
+<5F71> <5F71> <8965>
+<5F73> <5F73> <9C65>
+<5F77> <5F77> <9C66>
+<5F79> <5F79> <96F0>
+<5F7C> <5F7C> <94DE>
+<5F7F> <5F7F> <9C69>
+<5F80> <5F80> <899D>
+<5F81> <5F81> <90AA>
+<5F82> <5F82> <9C68>
+<5F83> <5F83> <9C67>
+<5F84> <5F84> <8C61>
+<5F85> <5F85> <91D2>
+<5F87> <5F87> <9C6D>
+<5F88> <5F88> <9C6B>
+<5F8A> <5F8A> <9C6A>
+<5F8B> <5F8B> <97A5>
+<5F8C> <5F8C> <8CE3>
+<5F90> <5F90> <8F99>
+<5F91> <5F91> <9C6C>
+<5F92> <5F92> <936B>
+<5F93> <5F93> <8F5D>
+<5F97> <5F97> <93BE>
+<5F98> <5F98> <9C70>
+<5F99> <5F99> <9C6F>
+<5F9E> <5F9E> <9C6E>
+<5FA0> <5FA0> <9C71>
+<5FA1> <5FA1> <8CE4>
+<5FA8> <5FA8> <9C72>
+<5FA9> <5FA9> <959C>
+<5FAA> <5FAA> <8F7A>
+<5FAD> <5FAD> <9C73>
+<5FAE> <5FAE> <94F7>
+<5FB3> <5FB3> <93BF>
+<5FB4> <5FB4> <92A5>
+<5FB7> <5FB7> <FABA>
+<5FB9> <5FB9> <934F>
+<5FBC> <5FBC> <9C74>
+<5FBD> <5FBD> <8B4A>
+<5FC3> <5FC3> <9053>
+<5FC5> <5FC5> <954B>
+<5FCC> <5FCC> <8AF5>
+<5FCD> <5FCD> <9445>
+<5FD6> <5FD6> <9C75>
+<5FD7> <5FD7> <8E75>
+<5FD8> <5FD9> <9659>
+<5FDC> <5FDC> <899E>
+<5FDD> <5FDD> <9C7A>
+<5FDE> <5FDE> <FABB>
+<5FE0> <5FE0> <9289>
+<5FE4> <5FE4> <9C77>
+<5FEB> <5FEB> <89F5>
+<5FF0> <5FF0> <9CAB>
+endbfrange
+
+100 beginbfrange
+<5FF1> <5FF1> <9C79>
+<5FF5> <5FF5> <944F>
+<5FF8> <5FF8> <9C78>
+<5FFB> <5FFB> <9C76>
+<5FFD> <5FFD> <8D9A>
+<5FFF> <5FFF> <9C7C>
+<600E> <600E> <9C83>
+<600F> <600F> <9C89>
+<6010> <6010> <9C81>
+<6012> <6012> <937B>
+<6015> <6015> <9C86>
+<6016> <6016> <957C>
+<6019> <6019> <9C80>
+<601B> <601B> <9C85>
+<601C> <601C> <97E5>
+<601D> <601D> <8E76>
+<6020> <6020> <91D3>
+<6021> <6021> <9C7D>
+<6025> <6025> <8B7D>
+<6026> <6026> <9C88>
+<6027> <6027> <90AB>
+<6028> <6028> <8985>
+<6029> <6029> <9C82>
+<602A> <602A> <89F6>
+<602B> <602B> <9C87>
+<602F> <602F> <8BAF>
+<6031> <6031> <9C84>
+<603A> <603A> <9C8A>
+<6041> <6041> <9C8C>
+<6042> <6042> <9C96>
+<6043> <6043> <9C94>
+<6046> <6046> <9C91>
+<604A> <604A> <9C90>
+<604B> <604B> <97F6>
+<604D> <604D> <9C92>
+<6050> <6050> <8BB0>
+<6052> <6052> <8D50>
+<6055> <6055> <8F9A>
+<6059> <6059> <9C99>
+<605A> <605A> <9C8B>
+<605D> <605D> <FABC>
+<605F> <605F> <9C8F>
+<6060> <6060> <9C7E>
+<6062> <6062> <89F8>
+<6063> <6063> <9C93>
+<6064> <6064> <9C95>
+<6065> <6065> <9270>
+<6068> <6068> <8DA6>
+<6069> <6069> <89B6>
+<606A> <606A> <9C8D>
+<606B> <606B> <9C98>
+<606C> <606C> <9C97>
+<606D> <606D> <8BB1>
+<606F> <606F> <91A7>
+<6070> <6070> <8A86>
+<6075> <6075> <8C62>
+<6077> <6077> <9C8E>
+<6081> <6081> <9C9A>
+<6083> <6083> <9C9D>
+<6084> <6084> <9C9F>
+<6085> <6085> <FABD>
+<6089> <6089> <8EBB>
+<608A> <608A> <FABE>
+<608B> <608B> <9CA5>
+<608C> <608C> <92EE>
+<608D> <608D> <9C9B>
+<6092> <6092> <9CA3>
+<6094> <6094> <89F7>
+<6096> <6097> <9CA1>
+<609A> <609A> <9C9E>
+<609B> <609B> <9CA0>
+<609F> <609F> <8CE5>
+<60A0> <60A0> <9749>
+<60A3> <60A3> <8AB3>
+<60A6> <60A6> <8978>
+<60A7> <60A7> <9CA4>
+<60A9> <60A9> <9459>
+<60AA> <60AA> <88AB>
+<60B2> <60B2> <94DF>
+<60B3> <60B3> <9C7B>
+<60B4> <60B4> <9CAA>
+<60B5> <60B5> <9CAE>
+<60B6> <60B6> <96E3>
+<60B8> <60B8> <9CA7>
+<60BC> <60BC> <9389>
+<60BD> <60BD> <9CAC>
+<60C5> <60C5> <8FEE>
+<60C6> <60C6> <9CAD>
+<60C7> <60C7> <93D5>
+<60D1> <60D1> <9866>
+<60D3> <60D3> <9CA9>
+<60D5> <60D5> <FAC0>
+<60D8> <60D8> <9CAF>
+<60DA> <60DA> <8D9B>
+<60DC> <60DC> <90C9>
+<60DE> <60DE> <FABF>
+<60DF> <60DF> <88D2>
+<60E0> <60E0> <9CA8>
+<60E1> <60E1> <9CA6>
+<60E3> <60E3> <9179>
+endbfrange
+
+100 beginbfrange
+<60E7> <60E7> <9C9C>
+<60E8> <60E8> <8E53>
+<60F0> <60F0> <91C4>
+<60F1> <60F1> <9CBB>
+<60F2> <60F2> <FAC2>
+<60F3> <60F3> <917A>
+<60F4> <60F4> <9CB6>
+<60F6> <60F7> <9CB3>
+<60F9> <60F9> <8EE4>
+<60FA> <60FA> <9CB7>
+<60FB> <60FB> <9CBA>
+<6100> <6100> <9CB5>
+<6101> <6101> <8F44>
+<6103> <6103> <9CB8>
+<6106> <6106> <9CB2>
+<6108> <6108> <96FA>
+<6109> <6109> <96F9>
+<610D> <610E> <9CBC>
+<610F> <610F> <88D3>
+<6111> <6111> <FAC3>
+<6115> <6115> <9CB1>
+<611A> <611A> <8BF0>
+<611B> <611B> <88A4>
+<611F> <611F> <8AB4>
+<6120> <6120> <FAC1>
+<6121> <6121> <9CB9>
+<6127> <6127> <9CC1>
+<6128> <6128> <9CC0>
+<612C> <612C> <9CC5>
+<6130> <6130> <FAC5>
+<6134> <6134> <9CC6>
+<6137> <6137> <FAC4>
+<613C> <613C> <9CC4>
+<613D> <613D> <9CC7>
+<613E> <613E> <9CBF>
+<613F> <613F> <9CC3>
+<6142> <6142> <9CC8>
+<6144> <6144> <9CC9>
+<6147> <6147> <9CBE>
+<6148> <6148> <8E9C>
+<614A> <614A> <9CC2>
+<614B> <614B> <91D4>
+<614C> <614C> <8D51>
+<614D> <614D> <9CB0>
+<614E> <614E> <9054>
+<6153> <6153> <9CD6>
+<6155> <6155> <95E7>
+<6158> <615A> <9CCC>
+<615D> <615D> <9CD5>
+<615F> <615F> <9CD4>
+<6162> <6162> <969D>
+<6163> <6163> <8AB5>
+<6165> <6165> <9CD2>
+<6167> <6167> <8C64>
+<6168> <6168> <8A53>
+<616B> <616B> <9CCF>
+<616E> <616E> <97B6>
+<616F> <616F> <9CD1>
+<6170> <6170> <88D4>
+<6171> <6171> <9CD3>
+<6173> <6173> <9CCA>
+<6174> <6174> <9CD0>
+<6175> <6175> <9CD7>
+<6176> <6176> <8C63>
+<6177> <6177> <9CCB>
+<617E> <617E> <977C>
+<6182> <6182> <974A>
+<6187> <6187> <9CDA>
+<618A> <618A> <9CDE>
+<618E> <618E> <919E>
+<6190> <6190> <97F7>
+<6191> <6191> <9CDF>
+<6194> <6194> <9CDC>
+<6196> <6196> <9CD9>
+<6198> <6198> <FAC6>
+<6199> <6199> <9CD8>
+<619A> <619A> <9CDD>
+<61A4> <61A4> <95AE>
+<61A7> <61A7> <93B2>
+<61A9> <61A9> <8C65>
+<61AB> <61AB> <9CE0>
+<61AC> <61AC> <9CDB>
+<61AE> <61AE> <9CE1>
+<61B2> <61B2> <8C9B>
+<61B6> <61B6> <89AF>
+<61BA> <61BA> <9CE9>
+<61BE> <61BE> <8AB6>
+<61C3> <61C3> <9CE7>
+<61C6> <61C6> <9CE8>
+<61C7> <61C7> <8DA7>
+<61C8> <61C8> <9CE6>
+<61C9> <61C9> <9CE4>
+<61CA> <61CA> <9CE3>
+<61CB> <61CB> <9CEA>
+<61CC> <61CC> <9CE2>
+<61CD> <61CD> <9CEC>
+<61D0> <61D0> <89F9>
+<61E3> <61E3> <9CEE>
+<61E6> <61E6> <9CED>
+<61F2> <61F2> <92A6>
+endbfrange
+
+100 beginbfrange
+<61F4> <61F4> <9CF1>
+<61F6> <61F6> <9CEF>
+<61F7> <61F7> <9CE5>
+<61F8> <61F8> <8C9C>
+<61FA> <61FA> <9CF0>
+<61FC> <61FC> <9CF4>
+<61FD> <61FD> <9CF3>
+<61FE> <61FE> <9CF5>
+<61FF> <61FF> <9CF2>
+<6200> <6200> <9CF6>
+<6208> <6209> <9CF7>
+<620A> <620A> <95E8>
+<620C> <620C> <9CFA>
+<620D> <620D> <9CF9>
+<620E> <620E> <8F5E>
+<6210> <6210> <90AC>
+<6211> <6211> <89E4>
+<6212> <6212> <89FA>
+<6213> <6213> <FAC7>
+<6214> <6214> <9CFB>
+<6216> <6216> <88BD>
+<621A> <621A> <90CA>
+<621B> <621B> <9CFC>
+<621D> <621D> <E6C1>
+<621E> <621E> <9D40>
+<621F> <621F> <8C81>
+<6221> <6221> <9D41>
+<6226> <6226> <90ED>
+<622A> <622A> <9D42>
+<622E> <622E> <9D43>
+<622F> <622F> <8B59>
+<6230> <6230> <9D44>
+<6232> <6233> <9D45>
+<6234> <6234> <91D5>
+<6238> <6238> <8CCB>
+<623B> <623B> <96DF>
+<623F> <623F> <965B>
+<6240> <6240> <8F8A>
+<6241> <6241> <9D47>
+<6247> <6247> <90EE>
+<6248> <6248> <E7BB>
+<6249> <6249> <94E0>
+<624B> <624B> <8EE8>
+<624D> <624D> <8DCB>
+<624E> <624E> <9D48>
+<6253> <6253> <91C5>
+<6255> <6255> <95A5>
+<6258> <6258> <91EF>
+<625B> <625B> <9D4B>
+<625E> <625E> <9D49>
+<6260> <6260> <9D4C>
+<6263> <6263> <9D4A>
+<6268> <6268> <9D4D>
+<626E> <626E> <95AF>
+<6271> <6271> <88B5>
+<6276> <6276> <957D>
+<6279> <6279> <94E1>
+<627C> <627C> <9D4E>
+<627E> <627E> <9D51>
+<627F> <627F> <8FB3>
+<6280> <6280> <8B5A>
+<6282> <6282> <9D4F>
+<6283> <6283> <9D56>
+<6284> <6284> <8FB4>
+<6289> <6289> <9D50>
+<628A> <628A> <9463>
+<6291> <6291> <977D>
+<6292> <6293> <9D52>
+<6294> <6294> <9D57>
+<6295> <6295> <938A>
+<6296> <6296> <9D54>
+<6297> <6297> <8D52>
+<6298> <6298> <90DC>
+<629B> <629B> <9D65>
+<629C> <629C> <94B2>
+<629E> <629E> <91F0>
+<62A6> <62A6> <FAC8>
+<62AB> <62AB> <94E2>
+<62AC> <62AC> <9DAB>
+<62B1> <62B1> <95F8>
+<62B5> <62B5> <92EF>
+<62B9> <62B9> <9695>
+<62BB> <62BB> <9D5A>
+<62BC> <62BC> <899F>
+<62BD> <62BD> <928A>
+<62C2> <62C2> <9D63>
+<62C5> <62C5> <9253>
+<62C6> <62C6> <9D5D>
+<62C7> <62C7> <9D64>
+<62C8> <62C8> <9D5F>
+<62C9> <62C9> <9D66>
+<62CA> <62CA> <9D62>
+<62CC> <62CC> <9D61>
+<62CD> <62CD> <948F>
+<62CF> <62CF> <9D5B>
+<62D0> <62D0> <89FB>
+<62D1> <62D1> <9D59>
+<62D2> <62D2> <8B91>
+<62D3> <62D3> <91F1>
+<62D4> <62D4> <9D55>
+endbfrange
+
+100 beginbfrange
+<62D7> <62D7> <9D58>
+<62D8> <62D8> <8D53>
+<62D9> <62D9> <90D9>
+<62DB> <62DB> <8FB5>
+<62DC> <62DC> <9D60>
+<62DD> <62DD> <9471>
+<62E0> <62E0> <8B92>
+<62E1> <62E1> <8A67>
+<62EC> <62EC> <8A87>
+<62ED> <62ED> <9040>
+<62EE> <62EE> <9D68>
+<62EF> <62EF> <9D6D>
+<62F1> <62F1> <9D69>
+<62F3> <62F3> <8C9D>
+<62F5> <62F5> <9D6E>
+<62F6> <62F6> <8E41>
+<62F7> <62F7> <8D89>
+<62FE> <62FE> <8F45>
+<62FF> <62FF> <9D5C>
+<6301> <6301> <8E9D>
+<6302> <6302> <9D6B>
+<6307> <6307> <8E77>
+<6308> <6308> <9D6C>
+<6309> <6309> <88C2>
+<630C> <630C> <9D67>
+<6311> <6311> <92A7>
+<6319> <6319> <8B93>
+<631F> <631F> <8BB2>
+<6327> <6327> <9D6A>
+<6328> <6328> <88A5>
+<632B> <632B> <8DC1>
+<632F> <632F> <9055>
+<633A> <633A> <92F0>
+<633D> <633D> <94D2>
+<633E> <633E> <9D70>
+<633F> <633F> <917D>
+<6349> <6349> <91A8>
+<634C> <634C> <8E4A>
+<634D> <634D> <9D71>
+<634F> <634F> <9D73>
+<6350> <6350> <9D6F>
+<6355> <6355> <95DF>
+<6357> <6357> <92BB>
+<635C> <635C> <917B>
+<6367> <6367> <95F9>
+<6368> <6368> <8ECC>
+<6369> <6369> <9D80>
+<636B> <636B> <9D7E>
+<636E> <636E> <9098>
+<6372> <6372> <8C9E>
+<6376> <6376> <9D78>
+<6377> <6377> <8FB7>
+<637A> <637A> <93E6>
+<637B> <637B> <9450>
+<6380> <6380> <9D76>
+<6383> <6383> <917C>
+<6388> <6388> <8EF6>
+<6389> <6389> <9D7B>
+<638C> <638C> <8FB6>
+<638E> <638E> <9D75>
+<638F> <638F> <9D7A>
+<6392> <6392> <9472>
+<6396> <6396> <9D74>
+<6398> <6398> <8C40>
+<639B> <639B> <8A7C>
+<639F> <639F> <9D7C>
+<63A0> <63A0> <97A9>
+<63A1> <63A1> <8DCC>
+<63A2> <63A2> <9254>
+<63A3> <63A3> <9D79>
+<63A5> <63A5> <90DA>
+<63A7> <63A7> <8D54>
+<63A8> <63A8> <9084>
+<63A9> <63A9> <8986>
+<63AA> <63AA> <915B>
+<63AB> <63AB> <9D77>
+<63AC> <63AC> <8B64>
+<63B2> <63B2> <8C66>
+<63B4> <63B4> <92CD>
+<63B5> <63B5> <9D7D>
+<63BB> <63BB> <917E>
+<63BE> <63BE> <9D81>
+<63C0> <63C0> <9D83>
+<63C3> <63C3> <91B5>
+<63C4> <63C4> <9D89>
+<63C6> <63C6> <9D84>
+<63C9> <63C9> <9D86>
+<63CF> <63CF> <9560>
+<63D0> <63D0> <92F1>
+<63D2> <63D2> <9D87>
+<63D6> <63D6> <974B>
+<63DA> <63DA> <9767>
+<63DB> <63DB> <8AB7>
+<63E1> <63E1> <88AC>
+<63E3> <63E3> <9D85>
+<63E9> <63E9> <9D82>
+<63EE> <63EE> <8AF6>
+<63F4> <63F4> <8987>
+<63F5> <63F5> <FAC9>
+<63F6> <63F6> <9D88>
+endbfrange
+
+100 beginbfrange
+<63FA> <63FA> <9768>
+<6406> <6406> <9D8C>
+<640D> <640D> <91B9>
+<640F> <640F> <9D93>
+<6413> <6413> <9D8D>
+<6414> <6414> <917E>
+<6416> <6416> <9D8A>
+<6417> <6417> <9D91>
+<641C> <641C> <9D72>
+<6426> <6426> <9D8E>
+<6428> <6428> <9D92>
+<642C> <642C> <94C0>
+<642D> <642D> <938B>
+<6434> <6434> <9D8B>
+<6436> <6436> <9D8F>
+<643A> <643A> <8C67>
+<643E> <643E> <8DEF>
+<6442> <6442> <90DB>
+<644E> <644E> <9D97>
+<6451> <6451> <92CD>
+<6458> <6458> <9345>
+<6460> <6460> <FACA>
+<6467> <6467> <9D94>
+<6469> <6469> <9680>
+<646F> <646F> <9D95>
+<6476> <6476> <9D96>
+<6478> <6478> <96CC>
+<647A> <647A> <90A0>
+<6483> <6483> <8C82>
+<6488> <6488> <9D9D>
+<6492> <6492> <8E54>
+<6493> <6493> <9D9A>
+<6495> <6495> <9D99>
+<649A> <649A> <9451>
+<649D> <649D> <FACB>
+<649E> <649E> <93B3>
+<64A4> <64A4> <9350>
+<64A5> <64A5> <9D9B>
+<64A9> <64A9> <9D9C>
+<64AB> <64AB> <958F>
+<64AD> <64AD> <9464>
+<64AE> <64AE> <8E42>
+<64B0> <64B0> <90EF>
+<64B2> <64B2> <966F>
+<64B9> <64B9> <8A68>
+<64BB> <64BB> <9DA3>
+<64BC> <64BC> <9D9E>
+<64C1> <64C1> <9769>
+<64C2> <64C2> <9DA5>
+<64C5> <64C5> <9DA1>
+<64C7> <64C7> <9DA2>
+<64CD> <64CD> <9180>
+<64CE> <64CE> <FACC>
+<64D2> <64D2> <9DA0>
+<64D4> <64D4> <9D5E>
+<64D8> <64D8> <9DA4>
+<64DA> <64DA> <9D9F>
+<64E0> <64E1> <9DA9>
+<64E2> <64E2> <9346>
+<64E3> <64E3> <9DAC>
+<64E6> <64E6> <8E43>
+<64E7> <64E7> <9DA7>
+<64EC> <64EC> <8B5B>
+<64EF> <64EF> <9DAD>
+<64F1> <64F1> <9DA6>
+<64F2> <64F2> <9DB1>
+<64F4> <64F4> <9DB0>
+<64F6> <64F6> <9DAF>
+<64FA> <64FA> <9DB2>
+<64FD> <64FD> <9DB4>
+<64FE> <64FE> <8FEF>
+<6500> <6500> <9DB3>
+<6505> <6505> <9DB7>
+<6518> <6518> <9DB5>
+<651C> <651C> <9DB6>
+<651D> <651D> <9D90>
+<6522> <6522> <9DB7>
+<6523> <6523> <9DB9>
+<6524> <6524> <9DB8>
+<652A> <652A> <9D98>
+<652B> <652B> <9DBA>
+<652C> <652C> <9DAE>
+<652F> <652F> <8E78>
+<6534> <6535> <9DBB>
+<6536> <6536> <9DBE>
+<6537> <6537> <9DBD>
+<6538> <6538> <9DBF>
+<6539> <6539> <89FC>
+<653B> <653B> <8D55>
+<653E> <653E> <95FA>
+<653F> <653F> <90AD>
+<6545> <6545> <8CCC>
+<6548> <6548> <9DC1>
+<654D> <654D> <9DC4>
+<654E> <654E> <FACD>
+<654F> <654F> <9571>
+<6551> <6551> <8B7E>
+<6555> <6555> <9DC3>
+<6556> <6556> <9DC2>
+<6557> <6557> <9473>
+endbfrange
+
+100 beginbfrange
+<6558> <6558> <9DC5>
+<6559> <6559> <8BB3>
+<655D> <655D> <9DC7>
+<655E> <655E> <9DC6>
+<6562> <6562> <8AB8>
+<6563> <6563> <8E55>
+<6566> <6566> <93D6>
+<656C> <656C> <8C68>
+<6570> <6570> <9094>
+<6572> <6572> <9DC8>
+<6574> <6574> <90AE>
+<6575> <6575> <9347>
+<6577> <6577> <957E>
+<6578> <6578> <9DC9>
+<6582> <6583> <9DCA>
+<6587> <6587> <95B6>
+<6588> <6588> <9B7C>
+<6589> <6589> <90C4>
+<658C> <658C> <956B>
+<658E> <658E> <8DD6>
+<6590> <6590> <94E3>
+<6591> <6591> <94C1>
+<6597> <6597> <936C>
+<6599> <6599> <97BF>
+<659B> <659B> <9DCD>
+<659C> <659C> <8ECE>
+<659F> <659F> <9DCE>
+<65A1> <65A1> <88B4>
+<65A4> <65A4> <8BD2>
+<65A5> <65A5> <90CB>
+<65A7> <65A7> <9580>
+<65AB> <65AB> <9DCF>
+<65AC> <65AC> <8E61>
+<65AD> <65AD> <9266>
+<65AF> <65AF> <8E7A>
+<65B0> <65B0> <9056>
+<65B7> <65B7> <9DD0>
+<65B9> <65B9> <95FB>
+<65BC> <65BC> <8997>
+<65BD> <65BD> <8E7B>
+<65C1> <65C1> <9DD3>
+<65C3> <65C3> <9DD1>
+<65C4> <65C4> <9DD4>
+<65C5> <65C5> <97B7>
+<65C6> <65C6> <9DD2>
+<65CB> <65CB> <90F9>
+<65CC> <65CC> <9DD5>
+<65CF> <65CF> <91B0>
+<65D2> <65D2> <9DD6>
+<65D7> <65D7> <8AF8>
+<65D9> <65D9> <9DD8>
+<65DB> <65DB> <9DD7>
+<65E0> <65E1> <9DD9>
+<65E2> <65E2> <8AF9>
+<65E5> <65E5> <93FA>
+<65E6> <65E6> <9255>
+<65E7> <65E7> <8B8C>
+<65E8> <65E8> <8E7C>
+<65E9> <65E9> <9181>
+<65EC> <65EC> <8F7B>
+<65ED> <65ED> <88AE>
+<65F1> <65F1> <9DDB>
+<65FA> <65FA> <89A0>
+<65FB> <65FB> <9DDF>
+<6600> <6600> <FACE>
+<6602> <6602> <8D56>
+<6603> <6603> <9DDE>
+<6606> <6606> <8DA9>
+<6607> <6607> <8FB8>
+<6609> <6609> <FAD1>
+<660A> <660A> <9DDD>
+<660C> <660C> <8FB9>
+<660E> <660E> <96BE>
+<660F> <660F> <8DA8>
+<6613> <6613> <88D5>
+<6614> <6614> <90CC>
+<6615> <6615> <FACF>
+<661C> <661C> <9DE4>
+<661E> <661E> <FAD3>
+<661F> <661F> <90AF>
+<6620> <6620> <8966>
+<6624> <6624> <FAD4>
+<6625> <6625> <8F74>
+<6627> <6627> <9686>
+<6628> <6628> <8DF0>
+<662D> <662D> <8FBA>
+<662E> <662E> <FAD2>
+<662F> <662F> <90A5>
+<6631> <6631> <FA63>
+<6634> <6634> <9DE3>
+<6635> <6636> <9DE1>
+<663B> <663B> <FAD0>
+<663C> <663C> <928B>
+<663F> <663F> <9E45>
+<6641> <6641> <9DE8>
+<6642> <6642> <8E9E>
+<6643> <6643> <8D57>
+<6644> <6644> <9DE6>
+<6649> <6649> <9DE7>
+<664B> <664B> <9057>
+endbfrange
+
+100 beginbfrange
+<664F> <664F> <9DE5>
+<6652> <6652> <8E4E>
+<6657> <6657> <FAD6>
+<6659> <6659> <FAD7>
+<665D> <665D> <9DEA>
+<665E> <665E> <9DE9>
+<665F> <665F> <9DEE>
+<6662> <6662> <9DEF>
+<6664> <6664> <9DEB>
+<6665> <6665> <FAD5>
+<6666> <6666> <8A41>
+<6667> <6668> <9DEC>
+<6669> <6669> <94D3>
+<666E> <666E> <9581>
+<666F> <666F> <8C69>
+<6670> <6670> <9DF0>
+<6673> <6673> <FAD9>
+<6674> <6674> <90B0>
+<6676> <6676> <8FBB>
+<667A> <667A> <9271>
+<6681> <6681> <8BC5>
+<6683> <6683> <9DF1>
+<6684> <6684> <9DF5>
+<6687> <6687> <89C9>
+<6688> <6688> <9DF2>
+<6689> <6689> <9DF4>
+<668E> <668E> <9DF3>
+<6691> <6691> <8F8B>
+<6696> <6696> <9267>
+<6697> <6697> <88C3>
+<6698> <6698> <9DF6>
+<6699> <6699> <FADA>
+<669D> <669D> <9DF7>
+<66A0> <66A0> <FADB>
+<66A2> <66A2> <92A8>
+<66A6> <66A6> <97EF>
+<66AB> <66AB> <8E62>
+<66AE> <66AE> <95E9>
+<66B2> <66B2> <FADC>
+<66B4> <66B4> <965C>
+<66B8> <66B8> <9E41>
+<66B9> <66B9> <9DF9>
+<66BC> <66BC> <9DFC>
+<66BE> <66BE> <9DFB>
+<66BF> <66BF> <FADD>
+<66C1> <66C1> <9DF8>
+<66C4> <66C4> <9E40>
+<66C7> <66C7> <93DC>
+<66C9> <66C9> <9DFA>
+<66D6> <66D6> <9E42>
+<66D9> <66D9> <8F8C>
+<66DA> <66DA> <9E43>
+<66DC> <66DC> <976A>
+<66DD> <66DD> <9498>
+<66E0> <66E0> <9E44>
+<66E6> <66E6> <9E46>
+<66E9> <66E9> <9E47>
+<66F0> <66F0> <9E48>
+<66F2> <66F2> <8BC8>
+<66F3> <66F3> <8967>
+<66F4> <66F4> <8D58>
+<66F5> <66F5> <9E49>
+<66F7> <66F7> <9E4A>
+<66F8> <66F8> <8F91>
+<66F9> <66F9> <9182>
+<66FA> <66FA> <FADE>
+<66FB> <66FB> <FA66>
+<66FC> <66FC> <99D6>
+<66FD> <66FD> <915D>
+<66FE> <66FE> <915C>
+<66FF> <66FF> <91D6>
+<6700> <6700> <8DC5>
+<6703> <6703> <98F0>
+<6708> <6708> <8C8E>
+<6709> <6709> <974C>
+<670B> <670B> <95FC>
+<670D> <670D> <959E>
+<670E> <670E> <FADF>
+<670F> <670F> <9E4B>
+<6714> <6714> <8DF1>
+<6715> <6715> <92BD>
+<6716> <6716> <9E4C>
+<6717> <6717> <984E>
+<671B> <671B> <965D>
+<671D> <671D> <92A9>
+<671E> <671E> <9E4D>
+<671F> <671F> <8AFA>
+<6726> <6727> <9E4E>
+<6728> <6728> <96D8>
+<672A> <672A> <96A2>
+<672B> <672B> <9696>
+<672C> <672C> <967B>
+<672D> <672D> <8E44>
+<672E> <672E> <9E51>
+<6731> <6731> <8EE9>
+<6734> <6734> <9670>
+<6736> <6736> <9E53>
+<6737> <6737> <9E56>
+<6738> <6738> <9E55>
+<673A> <673A> <8AF7>
+endbfrange
+
+100 beginbfrange
+<673D> <673D> <8B80>
+<673F> <673F> <9E52>
+<6741> <6741> <9E54>
+<6746> <6746> <9E57>
+<6749> <6749> <9099>
+<674E> <674E> <979B>
+<674F> <674F> <88C7>
+<6750> <6750> <8DDE>
+<6751> <6751> <91BA>
+<6753> <6753> <8EDB>
+<6756> <6756> <8FF1>
+<6759> <6759> <9E5A>
+<675C> <675C> <936D>
+<675E> <675E> <9E58>
+<675F> <675F> <91A9>
+<6760> <6760> <9E59>
+<6761> <6761> <8FF0>
+<6762> <6762> <96DB>
+<6763> <6764> <9E5B>
+<6765> <6765> <9788>
+<6766> <6766> <FAE1>
+<676A> <676A> <9E61>
+<676D> <676D> <8D59>
+<676F> <676F> <9474>
+<6770> <6770> <9E5E>
+<6771> <6771> <938C>
+<6772> <6772> <9DDC>
+<6773> <6773> <9DE0>
+<6775> <6775> <8B6E>
+<6777> <6777> <9466>
+<677C> <677C> <9E60>
+<677E> <677E> <8FBC>
+<677F> <677F> <94C2>
+<6785> <6785> <9E66>
+<6787> <6787> <94F8>
+<6789> <6789> <9E5D>
+<678B> <678B> <9E63>
+<678C> <678C> <9E62>
+<6790> <6790> <90CD>
+<6795> <6795> <968D>
+<6797> <6797> <97D1>
+<679A> <679A> <9687>
+<679C> <679C> <89CA>
+<679D> <679D> <8E7D>
+<67A0> <67A0> <9867>
+<67A1> <67A1> <9E65>
+<67A2> <67A2> <9095>
+<67A6> <67A6> <9E64>
+<67A9> <67A9> <9E5F>
+<67AF> <67AF> <8CCD>
+<67B3> <67B3> <9E6B>
+<67B4> <67B4> <9E69>
+<67B6> <67B6> <89CB>
+<67B7> <67B7> <9E67>
+<67B8> <67B8> <9E6D>
+<67B9> <67B9> <9E73>
+<67BB> <67BB> <FAE2>
+<67C0> <67C0> <FAE4>
+<67C1> <67C1> <91C6>
+<67C4> <67C4> <95BF>
+<67C6> <67C6> <9E75>
+<67CA> <67CA> <9541>
+<67CE> <67CE> <9E74>
+<67CF> <67CF> <9490>
+<67D0> <67D0> <965E>
+<67D1> <67D1> <8AB9>
+<67D3> <67D3> <90F5>
+<67D4> <67D4> <8F5F>
+<67D8> <67D8> <92D1>
+<67DA> <67DA> <974D>
+<67DD> <67DD> <9E70>
+<67DE> <67DE> <9E6F>
+<67E2> <67E2> <9E71>
+<67E4> <67E4> <9E6E>
+<67E7> <67E7> <9E76>
+<67E9> <67E9> <9E6C>
+<67EC> <67EC> <9E6A>
+<67EE> <67EE> <9E72>
+<67EF> <67EF> <9E68>
+<67F1> <67F1> <928C>
+<67F3> <67F3> <96F6>
+<67F4> <67F4> <8EC4>
+<67F5> <67F5> <8DF2>
+<67FB> <67FB> <8DB8>
+<67FE> <67FE> <968F>
+<67FF> <67FF> <8A60>
+<6801> <6801> <FAE5>
+<6802> <6802> <92CC>
+<6803> <6803> <93C8>
+<6804> <6804> <8968>
+<6805> <6805> <8DF2>
+<6813> <6813> <90F0>
+<6816> <6816> <90B2>
+<6817> <6817> <8C49>
+<681E> <681E> <9E78>
+<6821> <6821> <8D5A>
+<6822> <6822> <8A9C>
+<6829> <6829> <9E7A>
+<682A> <682A> <8A94>
+<682B> <682B> <9E81>
+endbfrange
+
+100 beginbfrange
+<6832> <6832> <9E7D>
+<6834> <6834> <90F1>
+<6838> <6838> <8A6A>
+<6839> <6839> <8DAA>
+<683C> <683C> <8A69>
+<683D> <683D> <8DCD>
+<6840> <6840> <9E7B>
+<6841> <6841> <8C85>
+<6842> <6842> <8C6A>
+<6843> <6843> <938D>
+<6844> <6844> <FAE6>
+<6846> <6846> <9E79>
+<6848> <6848> <88C4>
+<684D> <684D> <9E7C>
+<684E> <684E> <9E7E>
+<6850> <6850> <8BCB>
+<6851> <6851> <8C4B>
+<6852> <6852> <FAE3>
+<6853> <6853> <8ABA>
+<6854> <6854> <8B6A>
+<6859> <6859> <9E82>
+<685C> <685C> <8DF7>
+<685D> <685D> <9691>
+<685F> <685F> <8E56>
+<6863> <6863> <9E83>
+<6867> <6867> <954F>
+<6874> <6874> <9E8F>
+<6876> <6876> <89B1>
+<6877> <6877> <9E84>
+<687E> <687E> <9E95>
+<687F> <687F> <9E85>
+<6881> <6881> <97C0>
+<6883> <6883> <9E8C>
+<6885> <6885> <947E>
+<688D> <688D> <9E94>
+<688E> <688E> <9E94>
+<688F> <688F> <9E87>
+<6893> <6893> <88B2>
+<6894> <6894> <9E89>
+<6897> <6897> <8D5B>
+<689B> <689B> <9E8B>
+<689D> <689D> <9E8A>
+<689F> <689F> <9E86>
+<68A0> <68A0> <9E91>
+<68A2> <68A2> <8FBD>
+<68A6> <68A6> <9AEB>
+<68A7> <68A7> <8CE6>
+<68A8> <68A8> <979C>
+<68AD> <68AD> <9E88>
+<68AF> <68AF> <92F2>
+<68B0> <68B0> <8A42>
+<68B1> <68B1> <8DAB>
+<68B3> <68B3> <9E80>
+<68B5> <68B5> <9E90>
+<68B6> <68B6> <8A81>
+<68B9> <68B9> <9E8E>
+<68BA> <68BA> <9E92>
+<68BC> <68BC> <938E>
+<68C4> <68C4> <8AFC>
+<68C6> <68C6> <9EB0>
+<68C8> <68C8> <FA64>
+<68C9> <68C9> <96C7>
+<68CA> <68CA> <9E97>
+<68CB> <68CB> <8AFB>
+<68CD> <68CD> <9E9E>
+<68CF> <68CF> <FAE7>
+<68D2> <68D2> <965F>
+<68D4> <68D4> <9E9F>
+<68D5> <68D5> <9EA1>
+<68D7> <68D7> <9EA5>
+<68D8> <68D8> <9E99>
+<68DA> <68DA> <9249>
+<68DF> <68DF> <938F>
+<68E0> <68E0> <9EA9>
+<68E1> <68E1> <9E9C>
+<68E3> <68E3> <9EA6>
+<68E7> <68E7> <9EA0>
+<68EE> <68EE> <9058>
+<68EF> <68EF> <9EAA>
+<68F2> <68F2> <90B1>
+<68F9> <68F9> <9EA8>
+<68FA> <68FA> <8ABB>
+<6900> <6900> <986F>
+<6901> <6901> <9E96>
+<6904> <6904> <9EA4>
+<6905> <6905> <88D6>
+<6908> <6908> <9E98>
+<690B> <690B> <96B8>
+<690C> <690C> <9E9D>
+<690D> <690D> <9041>
+<690E> <690E> <92C5>
+<690F> <690F> <9E93>
+<6912> <6912> <9EA3>
+<6919> <6919> <909A>
+<691A> <691A> <9EAD>
+<691B> <691B> <8A91>
+<691C> <691C> <8C9F>
+<6921> <6921> <9EAF>
+<6922> <6922> <9E9A>
+<6923> <6923> <9EAE>
+endbfrange
+
+100 beginbfrange
+<6925> <6925> <9EA7>
+<6926> <6926> <9E9B>
+<6928> <6928> <9EAB>
+<692A> <692A> <9EAC>
+<6930> <6930> <9EBD>
+<6934> <6934> <93CC>
+<6936> <6936> <9EA2>
+<6939> <6939> <9EB9>
+<693D> <693D> <9EBB>
+<693F> <693F> <92D6>
+<694A> <694A> <976B>
+<6953> <6953> <9596>
+<6954> <6954> <9EB6>
+<6955> <6955> <91C8>
+<6959> <6959> <9EBC>
+<695A> <695A> <915E>
+<695C> <695C> <9EB3>
+<695D> <695D> <9EC0>
+<695E> <695E> <9EBF>
+<6960> <6960> <93ED>
+<6961> <6961> <9EBE>
+<6962> <6962> <93E8>
+<6968> <6968> <FAE9>
+<696A> <696A> <9EC2>
+<696B> <696B> <9EB5>
+<696D> <696D> <8BC6>
+<696E> <696E> <9EB8>
+<696F> <696F> <8F7C>
+<6973> <6973> <9480>
+<6974> <6974> <9EBA>
+<6975> <6975> <8BC9>
+<6977> <6977> <9EB2>
+<6978> <6978> <9EB4>
+<6979> <6979> <9EB1>
+<697C> <697C> <984F>
+<697D> <697D> <8A79>
+<697E> <697E> <9EB7>
+<6981> <6981> <9EC1>
+<6982> <6982> <8A54>
+<698A> <698A> <8DE5>
+<698E> <698E> <897C>
+<6991> <6991> <9ED2>
+<6994> <6994> <9850>
+<6995> <6995> <9ED5>
+<6998> <6998> <FAEB>
+<699B> <699B> <9059>
+<699C> <699C> <9ED4>
+<69A0> <69A0> <9ED3>
+<69A7> <69A7> <9ED0>
+<69AE> <69AE> <9EC4>
+<69B1> <69B1> <9EE1>
+<69B2> <69B2> <9EC3>
+<69B4> <69B4> <9ED6>
+<69BB> <69BB> <9ECE>
+<69BE> <69BE> <9EC9>
+<69BF> <69BF> <9EC6>
+<69C1> <69C1> <9EC7>
+<69C3> <69C3> <9ECF>
+<69C7> <69C7> <EAA0>
+<69CA> <69CA> <9ECC>
+<69CB> <69CB> <8D5C>
+<69CC> <69CC> <92C6>
+<69CD> <69CD> <9184>
+<69CE> <69CE> <9ECA>
+<69D0> <69D0> <9EC5>
+<69D3> <69D3> <9EC8>
+<69D8> <69D8> <976C>
+<69D9> <69D9> <968A>
+<69DD> <69DD> <9ECD>
+<69DE> <69DE> <9ED7>
+<69E2> <69E2> <FAEC>
+<69E7> <69E7> <9EDF>
+<69E8> <69E8> <9ED8>
+<69EB> <69EB> <9EE5>
+<69ED> <69ED> <9EE3>
+<69F2> <69F2> <9EDE>
+<69F9> <69F9> <9EDD>
+<69FB> <69FB> <92CE>
+<69FD> <69FD> <9185>
+<69FF> <69FF> <9EDB>
+<6A02> <6A02> <9ED9>
+<6A05> <6A05> <9EE0>
+<6A0A> <6A0A> <9EE6>
+<6A0B> <6A0B> <94F3>
+<6A0C> <6A0C> <9EEC>
+<6A12> <6A12> <9EE7>
+<6A13> <6A13> <9EEA>
+<6A14> <6A14> <9EE4>
+<6A17> <6A17> <9294>
+<6A19> <6A19> <9557>
+<6A1B> <6A1B> <9EDA>
+<6A1E> <6A1E> <9EE2>
+<6A1F> <6A1F> <8FBE>
+<6A21> <6A21> <96CD>
+<6A22> <6A22> <9EF6>
+<6A23> <6A23> <9EE9>
+<6A29> <6A29> <8CA0>
+<6A2A> <6A2A> <89A1>
+<6A2B> <6A2B> <8A7E>
+<6A2E> <6A2E> <9ED1>
+endbfrange
+
+100 beginbfrange
+<6A30> <6A30> <FAED>
+<6A35> <6A35> <8FBF>
+<6A36> <6A36> <9EEE>
+<6A38> <6A38> <9EF5>
+<6A39> <6A39> <8EF7>
+<6A3A> <6A3A> <8A92>
+<6A3D> <6A3D> <924D>
+<6A44> <6A44> <9EEB>
+<6A46> <6A46> <FAEF>
+<6A47> <6A47> <9EF0>
+<6A48> <6A48> <9EF4>
+<6A4B> <6A4B> <8BB4>
+<6A58> <6A58> <8B6B>
+<6A59> <6A59> <9EF2>
+<6A5F> <6A5F> <8B40>
+<6A61> <6A61> <93C9>
+<6A62> <6A62> <9EF1>
+<6A66> <6A66> <9EF3>
+<6A6B> <6A6B> <FAEE>
+<6A72> <6A72> <9EED>
+<6A73> <6A73> <FAF0>
+<6A78> <6A78> <9EEF>
+<6A7E> <6A7E> <FAF1>
+<6A7F> <6A7F> <8A80>
+<6A80> <6A80> <9268>
+<6A84> <6A84> <9EFA>
+<6A8D> <6A8D> <9EF8>
+<6A8E> <6A8E> <8CE7>
+<6A90> <6A90> <9EF7>
+<6A97> <6A97> <9F40>
+<6A9C> <6A9C> <9E77>
+<6AA0> <6AA0> <9EF9>
+<6AA2> <6AA3> <9EFB>
+<6AAA> <6AAA> <9F4B>
+<6AAC> <6AAC> <9F47>
+<6AAE> <6AAE> <9E8D>
+<6AB3> <6AB3> <9F46>
+<6AB8> <6AB8> <9F45>
+<6ABB> <6ABB> <9F42>
+<6AC1> <6AC1> <9EE8>
+<6AC2> <6AC2> <9F44>
+<6AC3> <6AC3> <9F43>
+<6AD1> <6AD1> <9F49>
+<6AD3> <6AD3> <9845>
+<6ADA> <6ADA> <9F4C>
+<6ADB> <6ADB> <8BF9>
+<6ADE> <6ADE> <9F48>
+<6ADF> <6ADF> <9F4A>
+<6AE2> <6AE2> <FAF2>
+<6AE4> <6AE4> <FAF3>
+<6AE8> <6AE8> <94A5>
+<6AEA> <6AEA> <9F4D>
+<6AFA> <6AFA> <9F51>
+<6AFB> <6AFB> <9F4E>
+<6B04> <6B04> <9793>
+<6B05> <6B05> <9F4F>
+<6B0A> <6B0A> <9EDC>
+<6B12> <6B12> <9F52>
+<6B16> <6B16> <9F53>
+<6B1D> <6B1D> <8954>
+<6B1F> <6B1F> <9F55>
+<6B20> <6B20> <8C87>
+<6B21> <6B21> <8E9F>
+<6B23> <6B23> <8BD3>
+<6B27> <6B27> <89A2>
+<6B32> <6B32> <977E>
+<6B37> <6B37> <9F57>
+<6B38> <6B38> <9F56>
+<6B39> <6B39> <9F59>
+<6B3A> <6B3A> <8B5C>
+<6B3D> <6B3D> <8BD4>
+<6B3E> <6B3E> <8ABC>
+<6B43> <6B43> <9F5C>
+<6B47> <6B47> <9F5B>
+<6B49> <6B49> <9F5D>
+<6B4C> <6B4C> <89CC>
+<6B4E> <6B4E> <9256>
+<6B50> <6B50> <9F5E>
+<6B53> <6B53> <8ABD>
+<6B54> <6B54> <9F60>
+<6B59> <6B59> <9F5F>
+<6B5B> <6B5B> <9F61>
+<6B5F> <6B5F> <9F62>
+<6B61> <6B61> <9F63>
+<6B62> <6B62> <8E7E>
+<6B63> <6B63> <90B3>
+<6B64> <6B64> <8D9F>
+<6B66> <6B66> <9590>
+<6B69> <6B69> <95E0>
+<6B6A> <6B6A> <9863>
+<6B6F> <6B6F> <8E95>
+<6B73> <6B73> <8DCE>
+<6B74> <6B74> <97F0>
+<6B78> <6B79> <9F64>
+<6B7B> <6B7B> <8E80>
+<6B7F> <6B80> <9F66>
+<6B83> <6B83> <9F69>
+<6B84> <6B84> <9F68>
+<6B86> <6B86> <9677>
+<6B89> <6B89> <8F7D>
+endbfrange
+
+100 beginbfrange
+<6B8A> <6B8A> <8EEA>
+<6B8B> <6B8B> <8E63>
+<6B8D> <6B8D> <9F6A>
+<6B95> <6B95> <9F6C>
+<6B96> <6B96> <9042>
+<6B98> <6B98> <9F6B>
+<6B9E> <6B9E> <9F6D>
+<6BA4> <6BA4> <9F6E>
+<6BAA> <6BAB> <9F6F>
+<6BAF> <6BAF> <9F71>
+<6BB1> <6BB1> <9F73>
+<6BB2> <6BB2> <9F72>
+<6BB3> <6BB3> <9F74>
+<6BB4> <6BB4> <89A3>
+<6BB5> <6BB5> <9269>
+<6BB7> <6BB7> <9F75>
+<6BBA> <6BBA> <8E45>
+<6BBB> <6BBB> <8A6B>
+<6BBC> <6BBC> <9F76>
+<6BBF> <6BBF> <9361>
+<6BC0> <6BC0> <9ACA>
+<6BC5> <6BC5> <8B42>
+<6BC6> <6BC6> <9F77>
+<6BCB> <6BCB> <9F78>
+<6BCD> <6BCD> <95EA>
+<6BCE> <6BCE> <9688>
+<6BD2> <6BD2> <93C5>
+<6BD3> <6BD3> <9F79>
+<6BD4> <6BD4> <94E4>
+<6BD6> <6BD6> <FAF4>
+<6BD8> <6BD8> <94F9>
+<6BDB> <6BDB> <96D1>
+<6BDF> <6BDF> <9F7A>
+<6BEB> <6BEB> <9F7C>
+<6BEC> <6BEC> <9F7B>
+<6BEF> <6BEF> <9F7E>
+<6BF3> <6BF3> <9F7D>
+<6C08> <6C08> <9F81>
+<6C0F> <6C0F> <8E81>
+<6C11> <6C11> <96AF>
+<6C13> <6C14> <9F82>
+<6C17> <6C17> <8B43>
+<6C1B> <6C1B> <9F84>
+<6C23> <6C23> <9F86>
+<6C24> <6C24> <9F85>
+<6C34> <6C34> <9085>
+<6C37> <6C37> <9558>
+<6C38> <6C38> <8969>
+<6C3E> <6C3E> <94C3>
+<6C3F> <6C3F> <FAF5>
+<6C40> <6C40> <92F3>
+<6C41> <6C41> <8F60>
+<6C42> <6C42> <8B81>
+<6C4E> <6C4E> <94C4>
+<6C50> <6C50> <8EAC>
+<6C55> <6C55> <9F88>
+<6C57> <6C57> <8ABE>
+<6C5A> <6C5A> <8998>
+<6C5C> <6C5C> <FAF6>
+<6C5D> <6C5D> <93F0>
+<6C5E> <6C5E> <9F87>
+<6C5F> <6C5F> <8D5D>
+<6C60> <6C60> <9272>
+<6C62> <6C62> <9F89>
+<6C68> <6C68> <9F91>
+<6C6A> <6C6A> <9F8A>
+<6C6F> <6C6F> <FAF8>
+<6C70> <6C70> <91BF>
+<6C72> <6C72> <8B82>
+<6C73> <6C73> <9F92>
+<6C7A> <6C7A> <8C88>
+<6C7D> <6C7D> <8B44>
+<6C7E> <6C7E> <9F90>
+<6C81> <6C81> <9F8E>
+<6C82> <6C82> <9F8B>
+<6C83> <6C83> <9780>
+<6C86> <6C86> <FAF7>
+<6C88> <6C88> <92BE>
+<6C8C> <6C8C> <93D7>
+<6C8D> <6C8D> <9F8C>
+<6C90> <6C90> <9F94>
+<6C92> <6C92> <9F93>
+<6C93> <6C93> <8C42>
+<6C96> <6C96> <89AB>
+<6C99> <6C99> <8DB9>
+<6C9A> <6C9A> <9F8D>
+<6C9B> <6C9B> <9F8F>
+<6CA1> <6CA1> <9676>
+<6CA2> <6CA2> <91F2>
+<6CAB> <6CAB> <9697>
+<6CAE> <6CAE> <9F9C>
+<6CB1> <6CB1> <9F9D>
+<6CB3> <6CB3> <89CD>
+<6CB8> <6CB8> <95A6>
+<6CB9> <6CB9> <96FB>
+<6CBA> <6CBA> <9F9F>
+<6CBB> <6CBB> <8EA1>
+<6CBC> <6CBC> <8FC0>
+<6CBD> <6CBD> <9F98>
+<6CBE> <6CBE> <9F9E>
+endbfrange
+
+100 beginbfrange
+<6CBF> <6CBF> <8988>
+<6CC1> <6CC1> <8BB5>
+<6CC4> <6CC4> <9F95>
+<6CC5> <6CC5> <9F9A>
+<6CC9> <6CC9> <90F2>
+<6CCA> <6CCA> <9491>
+<6CCC> <6CCC> <94E5>
+<6CD3> <6CD3> <9F97>
+<6CD5> <6CD5> <9640>
+<6CD7> <6CD7> <9F99>
+<6CD9> <6CD9> <9FA2>
+<6CDA> <6CDA> <FAF9>
+<6CDB> <6CDB> <9FA0>
+<6CDD> <6CDD> <9F9B>
+<6CE1> <6CE1> <9641>
+<6CE2> <6CE2> <9467>
+<6CE3> <6CE3> <8B83>
+<6CE5> <6CE5> <9344>
+<6CE8> <6CE8> <928D>
+<6CEA> <6CEA> <9FA3>
+<6CEF> <6CEF> <9FA1>
+<6CF0> <6CF0> <91D7>
+<6CF1> <6CF1> <9F96>
+<6CF3> <6CF3> <896A>
+<6D04> <6D04> <FAFA>
+<6D0B> <6D0B> <976D>
+<6D0C> <6D0C> <9FAE>
+<6D12> <6D12> <9FAD>
+<6D17> <6D17> <90F4>
+<6D19> <6D19> <9FAA>
+<6D1B> <6D1B> <978C>
+<6D1E> <6D1E> <93B4>
+<6D1F> <6D1F> <9FA4>
+<6D25> <6D25> <92C3>
+<6D29> <6D29> <896B>
+<6D2A> <6D2A> <8D5E>
+<6D2B> <6D2B> <9FA7>
+<6D32> <6D32> <8F46>
+<6D33> <6D33> <9FAC>
+<6D35> <6D35> <9FAB>
+<6D36> <6D36> <9FA6>
+<6D38> <6D38> <9FA9>
+<6D3B> <6D3B> <8A88>
+<6D3D> <6D3D> <9FA8>
+<6D3E> <6D3E> <9468>
+<6D41> <6D41> <97AC>
+<6D44> <6D44> <8FF2>
+<6D45> <6D45> <90F3>
+<6D59> <6D59> <9FB4>
+<6D5A> <6D5A> <9FB2>
+<6D5C> <6D5C> <956C>
+<6D63> <6D63> <9FAF>
+<6D64> <6D64> <9FB1>
+<6D66> <6D66> <8959>
+<6D69> <6D69> <8D5F>
+<6D6A> <6D6A> <9851>
+<6D6C> <6D6C> <8A5C>
+<6D6E> <6D6E> <9582>
+<6D6F> <6D6F> <FAFC>
+<6D74> <6D74> <9781>
+<6D77> <6D77> <8A43>
+<6D78> <6D78> <905A>
+<6D79> <6D79> <9FB3>
+<6D85> <6D85> <9FB8>
+<6D87> <6D87> <FAFB>
+<6D88> <6D88> <8FC1>
+<6D8C> <6D8C> <974F>
+<6D8E> <6D8E> <9FB5>
+<6D93> <6D93> <9FB0>
+<6D95> <6D95> <9FB6>
+<6D96> <6D96> <FB40>
+<6D99> <6D99> <97DC>
+<6D9B> <6D9B> <9393>
+<6D9C> <6D9C> <93C0>
+<6DAC> <6DAC> <FB41>
+<6DAF> <6DAF> <8A55>
+<6DB2> <6DB2> <8974>
+<6DB5> <6DB5> <9FBC>
+<6DB8> <6DB8> <9FBF>
+<6DBC> <6DBC> <97C1>
+<6DC0> <6DC0> <9784>
+<6DC5> <6DC5> <9FC6>
+<6DC6> <6DC6> <9FC0>
+<6DC7> <6DC7> <9FBD>
+<6DCB> <6DCB> <97D2>
+<6DCC> <6DCC> <9FC3>
+<6DCF> <6DCF> <FB42>
+<6DD1> <6DD1> <8F69>
+<6DD2> <6DD2> <9FC5>
+<6DD5> <6DD5> <9FCA>
+<6DD8> <6DD8> <9391>
+<6DD9> <6DD9> <9FC8>
+<6DDE> <6DDE> <9FC2>
+<6DE1> <6DE1> <9257>
+<6DE4> <6DE4> <9FC9>
+<6DE6> <6DE6> <9FBE>
+<6DE8> <6DE8> <9FC4>
+<6DEA> <6DEA> <9FCB>
+<6DEB> <6DEB> <88FA>
+<6DEC> <6DEC> <9FC1>
+endbfrange
+
+100 beginbfrange
+<6DEE> <6DEE> <9FCC>
+<6DF1> <6DF1> <905B>
+<6DF2> <6DF2> <FB44>
+<6DF3> <6DF3> <8F7E>
+<6DF5> <6DF5> <95A3>
+<6DF7> <6DF7> <8DAC>
+<6DF8> <6DF8> <FB43>
+<6DF9> <6DF9> <9FB9>
+<6DFA> <6DFA> <9FC7>
+<6DFB> <6DFB> <9359>
+<6DFC> <6DFC> <FB45>
+<6E05> <6E05> <90B4>
+<6E07> <6E07> <8A89>
+<6E08> <6E08> <8DCF>
+<6E09> <6E09> <8FC2>
+<6E0A> <6E0A> <9FBB>
+<6E0B> <6E0B> <8F61>
+<6E13> <6E13> <8C6B>
+<6E15> <6E15> <9FBA>
+<6E19> <6E19> <9FD0>
+<6E1A> <6E1A> <8F8D>
+<6E1B> <6E1B> <8CB8>
+<6E1D> <6E1D> <9FDF>
+<6E1F> <6E1F> <9FD9>
+<6E20> <6E20> <8B94>
+<6E21> <6E21> <936E>
+<6E23> <6E23> <9FD4>
+<6E24> <6E24> <9FDD>
+<6E25> <6E25> <88AD>
+<6E26> <6E26> <8951>
+<6E27> <6E27> <FB48>
+<6E29> <6E29> <89B7>
+<6E2B> <6E2B> <9FD6>
+<6E2C> <6E2C> <91AA>
+<6E2D> <6E2D> <9FCD>
+<6E2E> <6E2E> <9FCF>
+<6E2F> <6E2F> <8D60>
+<6E38> <6E38> <9FE0>
+<6E39> <6E39> <FB46>
+<6E3A> <6E3A> <9FDB>
+<6E3C> <6E3C> <FB49>
+<6E3E> <6E3E> <9FD3>
+<6E43> <6E43> <9FDA>
+<6E4A> <6E4A> <96A9>
+<6E4D> <6E4D> <9FD8>
+<6E4E> <6E4E> <9FDC>
+<6E56> <6E56> <8CCE>
+<6E58> <6E58> <8FC3>
+<6E5B> <6E5B> <9258>
+<6E5C> <6E5C> <FB47>
+<6E5F> <6E5F> <9FD2>
+<6E67> <6E67> <974E>
+<6E6B> <6E6B> <9FD5>
+<6E6E> <6E6E> <9FCE>
+<6E6F> <6E6F> <9392>
+<6E72> <6E72> <9FD1>
+<6E76> <6E76> <9FD7>
+<6E7E> <6E7E> <9870>
+<6E7F> <6E7F> <8EBC>
+<6E80> <6E80> <969E>
+<6E82> <6E82> <9FE1>
+<6E8C> <6E8C> <94AC>
+<6E8F> <6E8F> <9FED>
+<6E90> <6E90> <8CB9>
+<6E96> <6E96> <8F80>
+<6E98> <6E98> <9FE3>
+<6E9C> <6E9C> <97AD>
+<6E9D> <6E9D> <8D61>
+<6E9F> <6E9F> <9FF0>
+<6EA2> <6EA2> <88EC>
+<6EA5> <6EA5> <9FEE>
+<6EAA> <6EAA> <9FE2>
+<6EAF> <6EAF> <9FE8>
+<6EB2> <6EB2> <9FEA>
+<6EB6> <6EB6> <976E>
+<6EB7> <6EB7> <9FE5>
+<6EBA> <6EBA> <934D>
+<6EBD> <6EBD> <9FE7>
+<6EBF> <6EBF> <FB4A>
+<6EC2> <6EC2> <9FEF>
+<6EC4> <6EC4> <9FE9>
+<6EC5> <6EC5> <96C5>
+<6EC9> <6EC9> <9FE4>
+<6ECB> <6ECB> <8EA0>
+<6ECC> <6ECC> <9FFC>
+<6ED1> <6ED1> <8A8A>
+<6ED3> <6ED3> <9FE6>
+<6ED4> <6ED5> <9FEB>
+<6EDD> <6EDD> <91EA>
+<6EDE> <6EDE> <91D8>
+<6EEC> <6EEC> <9FF4>
+<6EEF> <6EEF> <9FFA>
+<6EF2> <6EF2> <9FF8>
+<6EF4> <6EF4> <9348>
+<6EF7> <6EF7> <E042>
+<6EF8> <6EF8> <9FF5>
+<6EFE> <6EFE> <9FF6>
+<6EFF> <6EFF> <9FDE>
+<6F01> <6F01> <8B99>
+<6F02> <6F02> <9559>
+endbfrange
+
+100 beginbfrange
+<6F06> <6F06> <8EBD>
+<6F09> <6F09> <8D97>
+<6F0F> <6F0F> <9852>
+<6F11> <6F11> <9FF2>
+<6F13> <6F13> <E041>
+<6F14> <6F14> <8989>
+<6F15> <6F15> <9186>
+<6F20> <6F20> <9499>
+<6F22> <6F22> <8ABF>
+<6F23> <6F23> <97F8>
+<6F2B> <6F2B> <969F>
+<6F2C> <6F2C> <92D0>
+<6F31> <6F31> <9FF9>
+<6F32> <6F32> <9FFB>
+<6F38> <6F38> <9151>
+<6F3E> <6F3E> <E040>
+<6F3F> <6F3F> <9FF7>
+<6F41> <6F41> <9FF1>
+<6F45> <6F45> <8AC1>
+<6F51> <6F51> <94AC>
+<6F54> <6F54> <8C89>
+<6F58> <6F58> <E04E>
+<6F5B> <6F5B> <E049>
+<6F5C> <6F5C> <90F6>
+<6F5F> <6F5F> <8A83>
+<6F64> <6F64> <8F81>
+<6F66> <6F66> <E052>
+<6F6D> <6F6D> <E04B>
+<6F6E> <6F6E> <92AA>
+<6F6F> <6F6F> <E048>
+<6F70> <6F70> <92D7>
+<6F74> <6F74> <E06B>
+<6F78> <6F78> <E045>
+<6F7A> <6F7A> <E044>
+<6F7C> <6F7C> <E04D>
+<6F80> <6F80> <E047>
+<6F81> <6F81> <E046>
+<6F82> <6F82> <E04C>
+<6F84> <6F84> <909F>
+<6F86> <6F86> <E043>
+<6F88> <6F88> <FB4B>
+<6F8E> <6F8E> <E04F>
+<6F91> <6F91> <E050>
+<6F97> <6F97> <8AC0>
+<6FA1> <6FA1> <E055>
+<6FA3> <6FA3> <E054>
+<6FA4> <6FA4> <E056>
+<6FAA> <6FAA> <E059>
+<6FB1> <6FB1> <9362>
+<6FB3> <6FB3> <E053>
+<6FB5> <6FB5> <FB4C>
+<6FB9> <6FB9> <E057>
+<6FC0> <6FC0> <8C83>
+<6FC1> <6FC1> <91F7>
+<6FC2> <6FC2> <E051>
+<6FC3> <6FC3> <945A>
+<6FC6> <6FC6> <E058>
+<6FD4> <6FD4> <E05D>
+<6FD5> <6FD5> <E05B>
+<6FD8> <6FD8> <E05E>
+<6FDB> <6FDB> <E061>
+<6FDF> <6FDF> <E05A>
+<6FE0> <6FE0> <8D8A>
+<6FE1> <6FE1> <9447>
+<6FE4> <6FE4> <9FB7>
+<6FEB> <6FEB> <9794>
+<6FEC> <6FEC> <E05C>
+<6FEE> <6FEE> <E060>
+<6FEF> <6FEF> <91F3>
+<6FF1> <6FF1> <E05F>
+<6FF3> <6FF3> <E04A>
+<6FF5> <6FF5> <FB4D>
+<6FF6> <6FF6> <E889>
+<6FFA> <6FFA> <E064>
+<6FFE> <6FFE> <E068>
+<7001> <7001> <E066>
+<7005> <7005> <FB4E>
+<7006> <7006> <93C0>
+<7007> <7007> <FB4F>
+<7009> <7009> <E062>
+<700B> <700B> <E063>
+<700F> <700F> <E067>
+<7011> <7011> <E065>
+<7015> <7015> <956D>
+<7018> <7018> <E06D>
+<701A> <701A> <E06A>
+<701B> <701B> <E069>
+<701D> <701D> <E06C>
+<701E> <701E> <93D2>
+<701F> <701F> <E06E>
+<7026> <7026> <9295>
+<7027> <7027> <91EB>
+<7028> <7028> <FB50>
+<702C> <702C> <90A3>
+<7030> <7030> <E06F>
+<7032> <7032> <E071>
+<703E> <703E> <E070>
+<704C> <704C> <9FF3>
+<7051> <7051> <E072>
+<7058> <7058> <93E5>
+endbfrange
+
+100 beginbfrange
+<7063> <7063> <E073>
+<706B> <706B> <89CE>
+<706F> <706F> <9394>
+<7070> <7070> <8A44>
+<7078> <7078> <8B84>
+<707C> <707C> <8EDC>
+<707D> <707D> <8DD0>
+<7085> <7085> <FB51>
+<7089> <7089> <9846>
+<708A> <708A> <9086>
+<708E> <708E> <898A>
+<7092> <7092> <E075>
+<7099> <7099> <E074>
+<70AB> <70AB> <FB52>
+<70AC> <70AC> <E078>
+<70AD> <70AD> <9259>
+<70AE> <70AE> <E07B>
+<70AF> <70AF> <E076>
+<70B3> <70B3> <E07A>
+<70B8> <70B8> <E079>
+<70B9> <70B9> <935F>
+<70BA> <70BA> <88D7>
+<70BB> <70BB> <FA62>
+<70C8> <70C8> <97F3>
+<70CB> <70CB> <E07D>
+<70CF> <70CF> <8947>
+<70D9> <70D9> <E080>
+<70DD> <70DD> <E07E>
+<70DF> <70DF> <E07C>
+<70F1> <70F1> <E077>
+<70F9> <70F9> <9642>
+<70FD> <70FD> <E082>
+<7104> <7104> <FB54>
+<7109> <7109> <E081>
+<710F> <710F> <FB53>
+<7114> <7114> <898B>
+<7119> <7119> <E084>
+<711A> <711A> <95B0>
+<711C> <711C> <E083>
+<7121> <7121> <96B3>
+<7126> <7126> <8FC5>
+<7130> <7130> <898B>
+<7136> <7136> <9152>
+<713C> <713C> <8FC4>
+<7146> <7147> <FB56>
+<7149> <7149> <97F9>
+<714C> <714C> <E08A>
+<714E> <714E> <90F7>
+<7155> <7155> <E086>
+<7156> <7156> <E08B>
+<7159> <7159> <898C>
+<715C> <715C> <FB55>
+<7162> <7162> <E089>
+<7164> <7164> <9481>
+<7165> <7165> <E085>
+<7166> <7166> <E088>
+<7167> <7167> <8FC6>
+<7169> <7169> <94CF>
+<716C> <716C> <E08C>
+<716E> <716E> <8ECF>
+<717D> <717D> <90F8>
+<7184> <7184> <E08F>
+<7188> <7188> <E087>
+<718A> <718A> <8C46>
+<718F> <718F> <E08D>
+<7194> <7194> <976F>
+<7195> <7195> <E090>
+<7199> <7199> <EAA4>
+<719F> <719F> <8F6E>
+<71A8> <71A8> <E091>
+<71AC> <71AC> <E092>
+<71B1> <71B1> <944D>
+<71B9> <71B9> <E094>
+<71BE> <71BE> <E095>
+<71C1> <71C1> <FB59>
+<71C3> <71C3> <9452>
+<71C8> <71C8> <9395>
+<71C9> <71C9> <E097>
+<71CE> <71CE> <E099>
+<71D0> <71D0> <97D3>
+<71D2> <71D2> <E096>
+<71D4> <71D4> <E098>
+<71D5> <71D5> <898D>
+<71D7> <71D7> <E093>
+<71DF> <71DF> <9A7A>
+<71E0> <71E0> <E09A>
+<71E5> <71E5> <9187>
+<71E6> <71E6> <8E57>
+<71E7> <71E7> <E09C>
+<71EC> <71EC> <E09B>
+<71ED> <71ED> <9043>
+<71EE> <71EE> <99D7>
+<71F5> <71F5> <E09D>
+<71F9> <71F9> <E09F>
+<71FB> <71FB> <E08E>
+<71FC> <71FC> <E09E>
+<71FE> <71FE> <FB5A>
+<71FF> <71FF> <E0A0>
+<7206> <7206> <949A>
+<720D> <720D> <E0A1>
+endbfrange
+
+100 beginbfrange
+<7210> <7210> <E0A2>
+<721B> <721B> <E0A3>
+<7228> <7228> <E0A4>
+<722A> <722A> <92DC>
+<722C> <722C> <E0A6>
+<722D> <722D> <E0A5>
+<7230> <7230> <E0A7>
+<7232> <7232> <E0A8>
+<7235> <7235> <8EDD>
+<7236> <7236> <9583>
+<723A> <723A> <96EA>
+<723B> <723C> <E0A9>
+<723D> <723D> <9175>
+<723E> <723E> <8EA2>
+<723F> <7240> <E0AB>
+<7246> <7246> <E0AD>
+<7247> <7247> <95D0>
+<7248> <7248> <94C5>
+<724B> <724B> <E0AE>
+<724C> <724C> <9476>
+<7252> <7252> <92AB>
+<7258> <7258> <E0AF>
+<7259> <7259> <89E5>
+<725B> <725B> <8B8D>
+<725D> <725D> <96C4>
+<725F> <725F> <96B4>
+<7261> <7261> <89B2>
+<7262> <7262> <9853>
+<7267> <7267> <9671>
+<7269> <7269> <95A8>
+<7272> <7272> <90B5>
+<7274> <7274> <E0B0>
+<7279> <7279> <93C1>
+<727D> <727D> <8CA1>
+<727E> <727E> <E0B1>
+<7280> <7280> <8DD2>
+<7281> <7281> <E0B3>
+<7282> <7282> <E0B2>
+<7287> <7287> <E0B4>
+<7292> <7292> <E0B5>
+<7296> <7296> <E0B6>
+<72A0> <72A0> <8B5D>
+<72A2> <72A2> <E0B7>
+<72A7> <72A7> <E0B8>
+<72AC> <72AC> <8CA2>
+<72AF> <72AF> <94C6>
+<72B1> <72B1> <FB5B>
+<72B2> <72B2> <E0BA>
+<72B6> <72B6> <8FF3>
+<72B9> <72B9> <E0B9>
+<72BE> <72BE> <FB5C>
+<72C2> <72C2> <8BB6>
+<72C3> <72C3> <E0BB>
+<72C4> <72C4> <E0BD>
+<72C6> <72C6> <E0BC>
+<72CE> <72CE> <E0BE>
+<72D0> <72D0> <8CCF>
+<72D2> <72D2> <E0BF>
+<72D7> <72D7> <8BE7>
+<72D9> <72D9> <915F>
+<72DB> <72DB> <8D9D>
+<72E0> <72E1> <E0C1>
+<72E2> <72E2> <E0C0>
+<72E9> <72E9> <8EEB>
+<72EC> <72EC> <93C6>
+<72ED> <72ED> <8BB7>
+<72F7> <72F7> <E0C4>
+<72F8> <72F8> <924B>
+<72F9> <72F9> <E0C3>
+<72FC> <72FC> <9854>
+<72FD> <72FD> <9482>
+<730A> <730A> <E0C7>
+<7316> <7316> <E0C9>
+<7317> <7317> <E0C6>
+<731B> <731B> <96D2>
+<731C> <731C> <E0C8>
+<731D> <731D> <E0CA>
+<731F> <731F> <97C2>
+<7324> <7324> <FB5D>
+<7325> <7325> <E0CE>
+<7329> <7329> <E0CD>
+<732A> <732A> <9296>
+<732B> <732B> <944C>
+<732E> <732E> <8CA3>
+<732F> <732F> <E0CC>
+<7334> <7334> <E0CB>
+<7336> <7337> <9750>
+<733E> <733E> <E0CF>
+<733F> <733F> <898E>
+<7344> <7344> <8D96>
+<7345> <7345> <8E82>
+<734E> <734F> <E0D0>
+<7357> <7357> <E0D3>
+<7363> <7363> <8F62>
+<7368> <7368> <E0D5>
+<736A> <736A> <E0D4>
+<7370> <7370> <E0D6>
+<7372> <7372> <8A6C>
+<7375> <7375> <E0D8>
+<7377> <7377> <FB5F>
+endbfrange
+
+100 beginbfrange
+<7378> <7378> <E0D7>
+<737A> <737A> <E0DA>
+<737B> <737B> <E0D9>
+<7384> <7384> <8CBA>
+<7387> <7387> <97A6>
+<7389> <7389> <8BCA>
+<738B> <738B> <89A4>
+<7396> <7396> <8BE8>
+<73A9> <73A9> <8ADF>
+<73B2> <73B2> <97E6>
+<73B3> <73B3> <E0DC>
+<73BB> <73BB> <E0DE>
+<73BD> <73BD> <FB60>
+<73C0> <73C0> <E0DF>
+<73C2> <73C2> <89CF>
+<73C8> <73C8> <E0DB>
+<73C9> <73C9> <FB61>
+<73CA> <73CA> <8E58>
+<73CD> <73CD> <92BF>
+<73CE> <73CE> <E0DD>
+<73D2> <73D2> <FB64>
+<73D6> <73D6> <FB62>
+<73DE> <73DE> <E0E2>
+<73E0> <73E0> <8EEC>
+<73E3> <73E3> <FB63>
+<73E5> <73E5> <E0E0>
+<73EA> <73EA> <8C5D>
+<73ED> <73ED> <94C7>
+<73EE> <73EE> <E0E1>
+<73F1> <73F1> <E0FC>
+<73F5> <73F5> <FB66>
+<73F8> <73F8> <E0E7>
+<73FE> <73FE> <8CBB>
+<7403> <7403> <8B85>
+<7405> <7405> <E0E4>
+<7406> <7406> <979D>
+<7407> <7407> <FB65>
+<7409> <7409> <97AE>
+<7422> <7422> <91F4>
+<7425> <7425> <E0E6>
+<7426> <7426> <FB67>
+<7429> <7429> <FB69>
+<742A> <742A> <FB68>
+<742E> <742E> <FB6A>
+<7432> <7432> <E0E8>
+<7433> <7433> <97D4>
+<7434> <7434> <8BD5>
+<7435> <7435> <94FA>
+<7436> <7436> <9469>
+<743A> <743A> <E0E9>
+<743F> <743F> <E0EB>
+<7441> <7441> <E0EE>
+<7455> <7455> <E0EA>
+<7459> <7459> <E0ED>
+<745A> <745A> <8CE8>
+<745B> <745B> <896C>
+<745C> <745C> <E0EF>
+<745E> <745E> <9090>
+<745F> <745F> <E0EC>
+<7460> <7460> <97DA>
+<7462> <7462> <FB6B>
+<7463> <7463> <E0F2>
+<7464> <7464> <EAA2>
+<7469> <7469> <E0F0>
+<746A> <746A> <E0F3>
+<746F> <746F> <E0E5>
+<7470> <7470> <E0F1>
+<7473> <7473> <8DBA>
+<7476> <7476> <E0F4>
+<747E> <747E> <E0F5>
+<7483> <7483> <979E>
+<7489> <7489> <FB6C>
+<748B> <748B> <E0F6>
+<749E> <749E> <E0F7>
+<749F> <749F> <FB6D>
+<74A2> <74A2> <E0E3>
+<74A7> <74A7> <E0F8>
+<74B0> <74B0> <8AC2>
+<74BD> <74BD> <8EA3>
+<74CA> <74CA> <E0F9>
+<74CF> <74CF> <E0FA>
+<74D4> <74D4> <E0FB>
+<74DC> <74DC> <895A>
+<74E0> <74E0> <E140>
+<74E2> <74E2> <955A>
+<74E3> <74E3> <E141>
+<74E6> <74E6> <8AA2>
+<74E7> <74E7> <E142>
+<74E9> <74E9> <E143>
+<74EE> <74EE> <E144>
+<74F0> <74F1> <E146>
+<74F2> <74F2> <E145>
+<74F6> <74F6> <9572>
+<74F7> <74F7> <E149>
+<74F8> <74F8> <E148>
+<7501> <7501> <FB6E>
+<7503> <7503> <E14B>
+<7504> <7504> <E14A>
+<7505> <7505> <E14C>
+<750C> <750C> <E14D>
+endbfrange
+
+100 beginbfrange
+<750D> <750D> <E14F>
+<750E> <750E> <E14E>
+<7511> <7511> <8D99>
+<7513> <7513> <E151>
+<7515> <7515> <E150>
+<7518> <7518> <8AC3>
+<751A> <751A> <9072>
+<751C> <751C> <935B>
+<751E> <751E> <E152>
+<751F> <751F> <90B6>
+<7523> <7523> <8E59>
+<7525> <7525> <8999>
+<7526> <7526> <E153>
+<7528> <7528> <9770>
+<752B> <752B> <95E1>
+<752C> <752C> <E154>
+<752F> <752F> <FAA8>
+<7530> <7530> <9363>
+<7531> <7531> <9752>
+<7532> <7532> <8D62>
+<7533> <7533> <905C>
+<7537> <7537> <926A>
+<7538> <7538> <99B2>
+<753A> <753A> <92AC>
+<753B> <753B> <89E6>
+<753C> <753C> <E155>
+<7544> <7544> <E156>
+<7546> <7546> <E15B>
+<7549> <7549> <E159>
+<754A> <754A> <E158>
+<754B> <754B> <9DC0>
+<754C> <754C> <8A45>
+<754D> <754D> <E157>
+<754F> <754F> <88D8>
+<7551> <7551> <94A8>
+<7554> <7554> <94C8>
+<7559> <7559> <97AF>
+<755A> <755A> <E15C>
+<755B> <755B> <E15A>
+<755C> <755C> <927B>
+<755D> <755D> <90A4>
+<7560> <7560> <94A9>
+<7562> <7562> <954C>
+<7564> <7564> <E15E>
+<7565> <7565> <97AA>
+<7566> <7566> <8C6C>
+<7567> <7567> <E15F>
+<7569> <7569> <E15D>
+<756A> <756A> <94D4>
+<756B> <756B> <E160>
+<756D> <756D> <E161>
+<756F> <756F> <FB6F>
+<7570> <7570> <88D9>
+<7573> <7573> <8FF4>
+<7574> <7574> <E166>
+<7576> <7576> <E163>
+<7577> <7577> <93EB>
+<7578> <7578> <E162>
+<757F> <757F> <8B45>
+<7582> <7582> <E169>
+<7586> <7587> <E164>
+<7589> <7589> <E168>
+<758A> <758A> <E167>
+<758B> <758B> <9544>
+<758E> <758E> <9161>
+<758F> <758F> <9160>
+<7591> <7591> <8B5E>
+<7594> <7594> <E16A>
+<759A> <759A> <E16B>
+<759D> <759D> <E16C>
+<75A3> <75A3> <E16E>
+<75A5> <75A5> <E16D>
+<75AB> <75AB> <8975>
+<75B1> <75B1> <E176>
+<75B2> <75B2> <94E6>
+<75B3> <75B3> <E170>
+<75B5> <75B5> <E172>
+<75B8> <75B8> <E174>
+<75B9> <75B9> <905D>
+<75BC> <75BC> <E175>
+<75BD> <75BD> <E173>
+<75BE> <75BE> <8EBE>
+<75C2> <75C2> <E16F>
+<75C3> <75C3> <E171>
+<75C5> <75C5> <9561>
+<75C7> <75C7> <8FC7>
+<75CA> <75CA> <E178>
+<75CD> <75CD> <E177>
+<75D2> <75D2> <E179>
+<75D4> <75D4> <8EA4>
+<75D5> <75D5> <8DAD>
+<75D8> <75D8> <9397>
+<75D9> <75D9> <E17A>
+<75DB> <75DB> <92C9>
+<75DE> <75DE> <E17C>
+<75E2> <75E2> <979F>
+<75E3> <75E3> <E17B>
+<75E9> <75E9> <9189>
+<75F0> <75F0> <E182>
+<75F2> <75F3> <E184>
+endbfrange
+
+100 beginbfrange
+<75F4> <75F4> <9273>
+<75FA> <75FA> <E183>
+<75FC> <75FC> <E180>
+<75FE> <75FF> <E17D>
+<7601> <7601> <E181>
+<7609> <7609> <E188>
+<760B> <760B> <E186>
+<760D> <760D> <E187>
+<761F> <761F> <E189>
+<7620> <7622> <E18B>
+<7624> <7624> <E18E>
+<7626> <7626> <9189>
+<7627> <7627> <E18A>
+<7630> <7630> <E190>
+<7634> <7634> <E18F>
+<763B> <763B> <E191>
+<7642> <7642> <97C3>
+<7646> <7646> <E194>
+<7647> <7648> <E192>
+<764C> <764C> <8AE0>
+<7652> <7652> <96FC>
+<7656> <7656> <95C8>
+<7658> <7658> <E196>
+<765C> <765C> <E195>
+<7661> <7662> <E197>
+<7667> <7667> <E19C>
+<7668> <766A> <E199>
+<766C> <766C> <E19D>
+<7670> <7670> <E19E>
+<7672> <7672> <E19F>
+<7676> <7676> <E1A0>
+<7678> <7678> <E1A1>
+<767A> <767A> <94AD>
+<767B> <767B> <936F>
+<767C> <767C> <E1A2>
+<767D> <767D> <9492>
+<767E> <767E> <9553>
+<7680> <7680> <E1A3>
+<7682> <7682> <FB70>
+<7683> <7683> <E1A4>
+<7684> <7684> <9349>
+<7686> <7686> <8A46>
+<7687> <7687> <8D63>
+<7688> <7688> <E1A5>
+<768B> <768B> <E1A6>
+<768E> <768E> <E1A7>
+<7690> <7690> <8E48>
+<7693> <7693> <E1A9>
+<7696> <7696> <E1A8>
+<7699> <769A> <E1AA>
+<769B> <769B> <FB73>
+<769C> <769C> <FB71>
+<769E> <769E> <FB72>
+<76A6> <76A6> <FB74>
+<76AE> <76AE> <94E7>
+<76B0> <76B0> <E1AC>
+<76B4> <76B4> <E1AD>
+<76B7> <76B7> <EA89>
+<76B8> <76BA> <E1AE>
+<76BF> <76BF> <8E4D>
+<76C2> <76C2> <E1B1>
+<76C3> <76C3> <9475>
+<76C6> <76C6> <967E>
+<76C8> <76C8> <896D>
+<76CA> <76CA> <8976>
+<76CD> <76CD> <E1B2>
+<76D2> <76D2> <E1B4>
+<76D6> <76D6> <E1B3>
+<76D7> <76D7> <9390>
+<76DB> <76DB> <90B7>
+<76DC> <76DC> <9F58>
+<76DE> <76DE> <E1B5>
+<76DF> <76DF> <96BF>
+<76E1> <76E1> <E1B6>
+<76E3> <76E3> <8AC4>
+<76E4> <76E4> <94D5>
+<76E5> <76E5> <E1B7>
+<76E7> <76E7> <E1B8>
+<76EA> <76EA> <E1B9>
+<76EE> <76EE> <96DA>
+<76F2> <76F2> <96D3>
+<76F4> <76F4> <92BC>
+<76F8> <76F8> <918A>
+<76FB> <76FB> <E1BB>
+<76FE> <76FE> <8F82>
+<7701> <7701> <8FC8>
+<7704> <7704> <E1BE>
+<7707> <7707> <E1BD>
+<7708> <7708> <E1BC>
+<7709> <7709> <94FB>
+<770B> <770B> <8AC5>
+<770C> <770C> <8CA7>
+<771B> <771B> <E1C4>
+<771E> <771E> <E1C1>
+<771F> <771F> <905E>
+<7720> <7720> <96B0>
+<7724> <7724> <E1C0>
+<7725> <7726> <E1C2>
+<7729> <7729> <E1BF>
+<7737> <7738> <E1C5>
+endbfrange
+
+100 beginbfrange
+<773A> <773A> <92AD>
+<773C> <773C> <8AE1>
+<7740> <7740> <9285>
+<7746> <7746> <FB76>
+<7747> <7747> <E1C7>
+<775A> <775A> <E1C8>
+<775B> <775B> <E1CB>
+<7761> <7761> <9087>
+<7762> <7762> <E8B1>
+<7763> <7763> <93C2>
+<7765> <7765> <E1CC>
+<7766> <7766> <9672>
+<7768> <7768> <E1C9>
+<776B> <776B> <E1CA>
+<7779> <7779> <E1CF>
+<777E> <777E> <E1CE>
+<777F> <777F> <E1CD>
+<778B> <778B> <E1D1>
+<778E> <778E> <E1D0>
+<7791> <7791> <E1D2>
+<779E> <779E> <E1D4>
+<77A0> <77A0> <E1D3>
+<77A5> <77A5> <95CB>
+<77AC> <77AC> <8F75>
+<77AD> <77AD> <97C4>
+<77B0> <77B0> <E1D5>
+<77B3> <77B3> <93B5>
+<77B6> <77B6> <E1D6>
+<77B9> <77B9> <E1D7>
+<77BB> <77BB> <E1DB>
+<77BC> <77BD> <E1D9>
+<77BF> <77BF> <E1D8>
+<77C7> <77C7> <E1DC>
+<77CD> <77CD> <E1DD>
+<77D7> <77D7> <E1DE>
+<77DA> <77DA> <E1DF>
+<77DB> <77DB> <96B5>
+<77DC> <77DC> <E1E0>
+<77E2> <77E2> <96EE>
+<77E3> <77E3> <E1E1>
+<77E5> <77E5> <926D>
+<77E7> <77E7> <948A>
+<77E9> <77E9> <8BE9>
+<77ED> <77ED> <925A>
+<77EE> <77EE> <E1E2>
+<77EF> <77EF> <8BB8>
+<77F3> <77F3> <90CE>
+<77FC> <77FC> <E1E3>
+<7802> <7802> <8DBB>
+<780C> <780C> <E1E4>
+<7812> <7812> <E1E5>
+<7814> <7814> <8CA4>
+<7815> <7815> <8DD3>
+<7820> <7820> <E1E7>
+<7821> <7821> <FB78>
+<7825> <7825> <9375>
+<7826> <7826> <8DD4>
+<7827> <7827> <8B6D>
+<7832> <7832> <9643>
+<7834> <7834> <946A>
+<783A> <783A> <9376>
+<783F> <783F> <8D7B>
+<7845> <7845> <E1E9>
+<784E> <784E> <FB79>
+<785D> <785D> <8FC9>
+<7864> <7864> <FB7A>
+<786B> <786B> <97B0>
+<786C> <786C> <8D64>
+<786F> <786F> <8CA5>
+<7872> <7872> <94A1>
+<7874> <7874> <E1EB>
+<787A> <787A> <FB7B>
+<787C> <787C> <E1ED>
+<7881> <7881> <8CE9>
+<7886> <7886> <E1EC>
+<7887> <7887> <92F4>
+<788C> <788C> <E1EF>
+<788D> <788D> <8A56>
+<788E> <788E> <E1EA>
+<7891> <7891> <94E8>
+<7893> <7893> <894F>
+<7895> <7895> <8DEA>
+<7897> <7897> <9871>
+<789A> <789A> <E1EE>
+<78A3> <78A3> <E1F0>
+<78A7> <78A7> <95C9>
+<78A9> <78A9> <90D7>
+<78AA> <78AA> <E1F2>
+<78AF> <78AF> <E1F3>
+<78B5> <78B5> <E1F1>
+<78BA> <78BA> <8A6D>
+<78BC> <78BC> <E1F9>
+<78BE> <78BE> <E1F8>
+<78C1> <78C1> <8EA5>
+<78C5> <78C5> <E1FA>
+<78C6> <78C6> <E1F5>
+<78CA> <78CA> <E1FB>
+<78CB> <78CB> <E1F6>
+<78D0> <78D0> <94D6>
+<78D1> <78D1> <E1F4>
+endbfrange
+
+100 beginbfrange
+<78D4> <78D4> <E1F7>
+<78DA> <78DA> <E241>
+<78E7> <78E7> <E240>
+<78E8> <78E8> <9681>
+<78EC> <78EC> <E1FC>
+<78EF> <78EF> <88E9>
+<78F4> <78F4> <E243>
+<78FD> <78FD> <E242>
+<7901> <7901> <8FCA>
+<7907> <7907> <E244>
+<790E> <790E> <9162>
+<7911> <7911> <E246>
+<7912> <7912> <E245>
+<7919> <7919> <E247>
+<7926> <7926> <E1E6>
+<792A> <792A> <E1E8>
+<792B> <792B> <E249>
+<792C> <792C> <E248>
+<7930> <7930> <FB7C>
+<793A> <793A> <8EA6>
+<793C> <793C> <97E7>
+<793E> <793E> <8ED0>
+<7940> <7940> <E24A>
+<7941> <7941> <8C56>
+<7947> <7947> <8B5F>
+<7948> <7948> <8B46>
+<7949> <7949> <8E83>
+<7950> <7950> <9753>
+<7953> <7953> <E250>
+<7955> <7955> <E24F>
+<7956> <7956> <9163>
+<7957> <7957> <E24C>
+<795A> <795A> <E24E>
+<795D> <795D> <8F6A>
+<795E> <795E> <905F>
+<795F> <795F> <E24D>
+<7960> <7960> <E24B>
+<7962> <7962> <9449>
+<7965> <7965> <8FCB>
+<7968> <7968> <955B>
+<796D> <796D> <8DD5>
+<7977> <7977> <9398>
+<797A> <797A> <E251>
+<797F> <797F> <E252>
+<7980> <7980> <E268>
+<7981> <7981> <8BD6>
+<7984> <7984> <985C>
+<7985> <7985> <9154>
+<798A> <798A> <E253>
+<798D> <798D> <89D0>
+<798E> <798E> <92F5>
+<798F> <798F> <959F>
+<7994> <7994> <FB81>
+<799B> <799B> <FB83>
+<799D> <799D> <E254>
+<79A6> <79A6> <8B9A>
+<79A7> <79A7> <E255>
+<79AA> <79AA> <E257>
+<79AE> <79AE> <E258>
+<79B0> <79B0> <9448>
+<79B1> <79B1> <9398>
+<79B3> <79B3> <E259>
+<79B9> <79BA> <E25A>
+<79BD> <79BD> <8BD7>
+<79BE> <79BE> <89D1>
+<79BF> <79BF> <93C3>
+<79C0> <79C0> <8F47>
+<79C1> <79C1> <8E84>
+<79C9> <79C9> <E25C>
+<79CB> <79CB> <8F48>
+<79D1> <79D1> <89C8>
+<79D2> <79D2> <9562>
+<79D5> <79D5> <E25D>
+<79D8> <79D8> <94E9>
+<79DF> <79DF> <9164>
+<79E1> <79E1> <E260>
+<79E3> <79E3> <E261>
+<79E4> <79E4> <9489>
+<79E6> <79E6> <9060>
+<79E7> <79E7> <E25E>
+<79E9> <79E9> <9281>
+<79EC> <79EC> <E25F>
+<79F0> <79F0> <8FCC>
+<79FB> <79FB> <88DA>
+<7A00> <7A00> <8B48>
+<7A08> <7A08> <E262>
+<7A0B> <7A0B> <92F6>
+<7A0D> <7A0D> <E263>
+<7A0E> <7A0E> <90C5>
+<7A14> <7A14> <96AB>
+<7A17> <7A17> <9542>
+<7A18> <7A19> <E264>
+<7A1A> <7A1A> <9274>
+<7A1C> <7A1C> <97C5>
+<7A1F> <7A1F> <E267>
+<7A20> <7A20> <E266>
+<7A2E> <7A2E> <8EED>
+<7A31> <7A31> <E269>
+<7A32> <7A32> <88EE>
+<7A37> <7A37> <E26C>
+endbfrange
+
+100 beginbfrange
+<7A3B> <7A3B> <E26A>
+<7A3C> <7A3C> <89D2>
+<7A3D> <7A3D> <8C6D>
+<7A3E> <7A3E> <E26B>
+<7A3F> <7A3F> <8D65>
+<7A40> <7A40> <8D92>
+<7A42> <7A42> <95E4>
+<7A43> <7A43> <E26D>
+<7A46> <7A46> <9673>
+<7A49> <7A49> <E26F>
+<7A4D> <7A4D> <90CF>
+<7A4E> <7A4E> <896E>
+<7A4F> <7A4F> <89B8>
+<7A50> <7A50> <88AA>
+<7A57> <7A57> <E26E>
+<7A61> <7A62> <E270>
+<7A63> <7A63> <8FF5>
+<7A69> <7A69> <E272>
+<7A6B> <7A6B> <8A6E>
+<7A70> <7A70> <E274>
+<7A74> <7A74> <8C8A>
+<7A76> <7A76> <8B86>
+<7A79> <7A79> <E275>
+<7A7A> <7A7A> <8BF3>
+<7A7D> <7A7D> <E276>
+<7A7F> <7A7F> <90FA>
+<7A81> <7A81> <93CB>
+<7A83> <7A83> <90DE>
+<7A84> <7A84> <8DF3>
+<7A88> <7A88> <E277>
+<7A92> <7A92> <9282>
+<7A93> <7A93> <918B>
+<7A95> <7A95> <E279>
+<7A96> <7A96> <E27B>
+<7A97> <7A97> <E278>
+<7A98> <7A98> <E27A>
+<7A9F> <7A9F> <8C41>
+<7AA9> <7AA9> <E27C>
+<7AAA> <7AAA> <8C45>
+<7AAE> <7AAE> <8B87>
+<7AAF> <7AAF> <9771>
+<7AB0> <7AB0> <E27E>
+<7AB6> <7AB6> <E280>
+<7ABA> <7ABA> <894D>
+<7ABF> <7ABF> <E283>
+<7AC3> <7AC3> <8A96>
+<7AC4> <7AC4> <E282>
+<7AC5> <7AC5> <E281>
+<7AC7> <7AC7> <E285>
+<7AC8> <7AC8> <E27D>
+<7ACA> <7ACA> <E286>
+<7ACB> <7ACB> <97A7>
+<7ACD> <7ACD> <E287>
+<7ACF> <7ACF> <E288>
+<7AD1> <7AD1> <FB84>
+<7AD2> <7AD2> <9AF2>
+<7AD3> <7AD3> <E28A>
+<7AD5> <7AD5> <E289>
+<7AD9> <7ADA> <E28B>
+<7ADC> <7ADC> <97B3>
+<7ADD> <7ADD> <E28D>
+<7ADF> <7ADF> <E8ED>
+<7AE0> <7AE0> <8FCD>
+<7AE1> <7AE2> <E28E>
+<7AE3> <7AE3> <8F76>
+<7AE5> <7AE5> <93B6>
+<7AE6> <7AE6> <E290>
+<7AE7> <7AE7> <FB85>
+<7AEA> <7AEA> <9247>
+<7AEB> <7AEB> <FB87>
+<7AED> <7AED> <E291>
+<7AEF> <7AEF> <925B>
+<7AF0> <7AF0> <E292>
+<7AF6> <7AF6> <8BA3>
+<7AF8> <7AF8> <995E>
+<7AF9> <7AF9> <927C>
+<7AFA> <7AFA> <8EB1>
+<7AFF> <7AFF> <8AC6>
+<7B02> <7B02> <E293>
+<7B04> <7B04> <E2A0>
+<7B06> <7B06> <E296>
+<7B08> <7B08> <8B88>
+<7B0A> <7B0A> <E295>
+<7B0B> <7B0B> <E2A2>
+<7B0F> <7B0F> <E294>
+<7B11> <7B11> <8FCE>
+<7B18> <7B19> <E298>
+<7B1B> <7B1B> <934A>
+<7B1E> <7B1E> <E29A>
+<7B20> <7B20> <8A7D>
+<7B25> <7B25> <9079>
+<7B26> <7B26> <9584>
+<7B28> <7B28> <E29C>
+<7B2C> <7B2C> <91E6>
+<7B33> <7B33> <E297>
+<7B35> <7B35> <E29B>
+<7B36> <7B36> <E29D>
+<7B39> <7B39> <8DF9>
+<7B45> <7B45> <E2A4>
+<7B46> <7B46> <954D>
+endbfrange
+
+100 beginbfrange
+<7B48> <7B48> <94A4>
+<7B49> <7B49> <9399>
+<7B4B> <7B4B> <8BD8>
+<7B4C> <7B4C> <E2A3>
+<7B4D> <7B4D> <E2A1>
+<7B4F> <7B4F> <94B3>
+<7B50> <7B50> <E29E>
+<7B51> <7B51> <927D>
+<7B52> <7B52> <939B>
+<7B54> <7B54> <939A>
+<7B56> <7B56> <8DF4>
+<7B5D> <7B5D> <E2B6>
+<7B65> <7B65> <E2A6>
+<7B67> <7B67> <E2A8>
+<7B6C> <7B6C> <E2AB>
+<7B6E> <7B6E> <E2AC>
+<7B70> <7B71> <E2A9>
+<7B74> <7B74> <E2A7>
+<7B75> <7B75> <E2A5>
+<7B7A> <7B7A> <E29F>
+<7B86> <7B86> <95CD>
+<7B87> <7B87> <89D3>
+<7B8B> <7B8B> <E2B3>
+<7B8D> <7B8D> <E2B0>
+<7B8F> <7B8F> <E2B5>
+<7B92> <7B92> <E2B4>
+<7B94> <7B94> <9493>
+<7B95> <7B95> <96A5>
+<7B97> <7B97> <8E5A>
+<7B98> <7B98> <E2AE>
+<7B99> <7B99> <E2B7>
+<7B9A> <7B9A> <E2B2>
+<7B9C> <7B9C> <E2B1>
+<7B9D> <7B9D> <E2AD>
+<7B9E> <7B9E> <FB88>
+<7B9F> <7B9F> <E2AF>
+<7BA1> <7BA1> <8AC7>
+<7BAA> <7BAA> <925C>
+<7BAD> <7BAD> <90FB>
+<7BB1> <7BB1> <94A0>
+<7BB4> <7BB4> <E2BC>
+<7BB8> <7BB8> <94A2>
+<7BC0> <7BC0> <90DF>
+<7BC1> <7BC1> <E2B9>
+<7BC4> <7BC4> <94CD>
+<7BC6> <7BC6> <E2BD>
+<7BC7> <7BC7> <95D1>
+<7BC9> <7BC9> <927A>
+<7BCB> <7BCB> <E2B8>
+<7BCC> <7BCC> <E2BA>
+<7BCF> <7BCF> <E2BB>
+<7BDD> <7BDD> <E2BE>
+<7BE0> <7BE0> <8EC2>
+<7BE4> <7BE4> <93C4>
+<7BE5> <7BE5> <E2C3>
+<7BE6> <7BE6> <E2C2>
+<7BE9> <7BE9> <E2BF>
+<7BED> <7BED> <9855>
+<7BF3> <7BF3> <E2C8>
+<7BF6> <7BF6> <E2CC>
+<7BF7> <7BF7> <E2C9>
+<7C00> <7C00> <E2C5>
+<7C07> <7C07> <E2C6>
+<7C0D> <7C0D> <E2CB>
+<7C11> <7C11> <E2C0>
+<7C12> <7C12> <99D3>
+<7C13> <7C13> <E2C7>
+<7C14> <7C14> <E2C1>
+<7C17> <7C17> <E2CA>
+<7C1E> <7C1E> <925C>
+<7C1F> <7C1F> <E2D0>
+<7C21> <7C21> <8AC8>
+<7C23> <7C23> <E2CD>
+<7C27> <7C27> <E2CE>
+<7C2A> <7C2A> <E2CF>
+<7C2B> <7C2B> <E2D2>
+<7C37> <7C37> <E2D1>
+<7C38> <7C38> <94F4>
+<7C3D> <7C3D> <E2D3>
+<7C3E> <7C3E> <97FA>
+<7C3F> <7C3F> <95EB>
+<7C40> <7C40> <E2D8>
+<7C43> <7C43> <E2D5>
+<7C4C> <7C4C> <E2D4>
+<7C4D> <7C4D> <90D0>
+<7C4F> <7C4F> <E2D7>
+<7C50> <7C50> <E2D9>
+<7C54> <7C54> <E2D6>
+<7C56> <7C56> <E2DD>
+<7C58> <7C58> <E2DA>
+<7C5F> <7C5F> <E2DB>
+<7C60> <7C60> <E2C4>
+<7C64> <7C64> <E2DC>
+<7C65> <7C65> <E2DE>
+<7C6C> <7C6C> <E2DF>
+<7C73> <7C73> <95C4>
+<7C75> <7C75> <E2E0>
+<7C7E> <7C7E> <96E0>
+<7C81> <7C81> <8BCC>
+<7C82> <7C82> <8C48>
+endbfrange
+
+100 beginbfrange
+<7C83> <7C83> <E2E1>
+<7C89> <7C89> <95B2>
+<7C8B> <7C8B> <9088>
+<7C8D> <7C8D> <96AE>
+<7C90> <7C90> <E2E2>
+<7C92> <7C92> <97B1>
+<7C95> <7C95> <9494>
+<7C97> <7C97> <9165>
+<7C98> <7C98> <9453>
+<7C9B> <7C9B> <8F6C>
+<7C9F> <7C9F> <88BE>
+<7CA1> <7CA1> <E2E7>
+<7CA2> <7CA2> <E2E5>
+<7CA4> <7CA4> <E2E3>
+<7CA5> <7CA5> <8A9F>
+<7CA7> <7CA7> <8FCF>
+<7CA8> <7CA8> <E2E8>
+<7CAB> <7CAB> <E2E6>
+<7CAD> <7CAD> <E2E4>
+<7CAE> <7CAE> <E2EC>
+<7CB1> <7CB1> <E2EB>
+<7CB2> <7CB2> <E2EA>
+<7CB3> <7CB3> <E2E9>
+<7CB9> <7CB9> <E2ED>
+<7CBD> <7CBD> <E2EE>
+<7CBE> <7CBE> <90B8>
+<7CC0> <7CC0> <E2EF>
+<7CC2> <7CC2> <E2F1>
+<7CC5> <7CC5> <E2F0>
+<7CCA> <7CCA> <8CD0>
+<7CCE> <7CCE> <9157>
+<7CD2> <7CD2> <E2F3>
+<7CD6> <7CD6> <939C>
+<7CD8> <7CD8> <E2F2>
+<7CDC> <7CDC> <E2F4>
+<7CDE> <7CDE> <95B3>
+<7CDF> <7CDF> <918C>
+<7CE0> <7CE0> <8D66>
+<7CE2> <7CE2> <E2F5>
+<7CE7> <7CE7> <97C6>
+<7CEF> <7CEF> <E2F7>
+<7CF2> <7CF2> <E2F8>
+<7CF4> <7CF4> <E2F9>
+<7CF6> <7CF6> <E2FA>
+<7CF8> <7CF8> <8E85>
+<7CFA> <7CFA> <E2FB>
+<7CFB> <7CFB> <8C6E>
+<7CFE> <7CFE> <8B8A>
+<7D00> <7D00> <8B49>
+<7D02> <7D02> <E340>
+<7D04> <7D04> <96F1>
+<7D05> <7D05> <8D67>
+<7D06> <7D06> <E2FC>
+<7D0A> <7D0A> <E343>
+<7D0B> <7D0B> <96E4>
+<7D0D> <7D0D> <945B>
+<7D10> <7D10> <9552>
+<7D14> <7D14> <8F83>
+<7D15> <7D15> <E342>
+<7D17> <7D17> <8ED1>
+<7D18> <7D18> <8D68>
+<7D19> <7D19> <8E86>
+<7D1A> <7D1A> <8B89>
+<7D1B> <7D1B> <95B4>
+<7D1C> <7D1C> <E341>
+<7D20> <7D20> <9166>
+<7D21> <7D21> <9661>
+<7D22> <7D22> <8DF5>
+<7D2B> <7D2B> <8E87>
+<7D2C> <7D2C> <92DB>
+<7D2E> <7D2E> <E346>
+<7D2F> <7D2F> <97DD>
+<7D30> <7D30> <8DD7>
+<7D32> <7D32> <E347>
+<7D33> <7D33> <9061>
+<7D35> <7D35> <E349>
+<7D39> <7D39> <8FD0>
+<7D3A> <7D3A> <8DAE>
+<7D3F> <7D3F> <E348>
+<7D42> <7D42> <8F49>
+<7D43> <7D43> <8CBC>
+<7D44> <7D44> <9167>
+<7D45> <7D45> <E344>
+<7D46> <7D46> <E34A>
+<7D48> <7D48> <FB8A>
+<7D4B> <7D4B> <E345>
+<7D4C> <7D4C> <8C6F>
+<7D4E> <7D4E> <E34D>
+<7D4F> <7D4F> <E351>
+<7D50> <7D50> <8C8B>
+<7D56> <7D56> <E34C>
+<7D5B> <7D5B> <E355>
+<7D5C> <7D5C> <FB8B>
+<7D5E> <7D5E> <8D69>
+<7D61> <7D61> <978D>
+<7D62> <7D62> <88BA>
+<7D63> <7D63> <E352>
+<7D66> <7D66> <8B8B>
+<7D68> <7D68> <E34F>
+<7D6E> <7D6E> <E350>
+endbfrange
+
+100 beginbfrange
+<7D71> <7D71> <939D>
+<7D72> <7D72> <E34E>
+<7D73> <7D73> <E34B>
+<7D75> <7D75> <8A47>
+<7D76> <7D76> <90E2>
+<7D79> <7D79> <8CA6>
+<7D7D> <7D7D> <E357>
+<7D89> <7D89> <E354>
+<7D8F> <7D8F> <E356>
+<7D93> <7D93> <E353>
+<7D99> <7D99> <8C70>
+<7D9A> <7D9A> <91B1>
+<7D9B> <7D9B> <E358>
+<7D9C> <7D9C> <918E>
+<7D9F> <7D9F> <E365>
+<7DA0> <7DA0> <FB8D>
+<7DA2> <7DA2> <E361>
+<7DA3> <7DA3> <E35B>
+<7DAB> <7DAB> <E35F>
+<7DAC> <7DAC> <8EF8>
+<7DAD> <7DAD> <88DB>
+<7DAE> <7DAE> <E35A>
+<7DAF> <7DAF> <E362>
+<7DB0> <7DB0> <E366>
+<7DB1> <7DB1> <8D6A>
+<7DB2> <7DB2> <96D4>
+<7DB4> <7DB4> <92D4>
+<7DB5> <7DB5> <E35C>
+<7DB7> <7DB7> <FB8C>
+<7DB8> <7DB8> <E364>
+<7DBA> <7DBA> <E359>
+<7DBB> <7DBB> <925D>
+<7DBD> <7DBD> <E35E>
+<7DBE> <7DBE> <88BB>
+<7DBF> <7DBF> <96C8>
+<7DC7> <7DC7> <E35D>
+<7DCA> <7DCA> <8BD9>
+<7DCB> <7DCB> <94EA>
+<7DCF> <7DCF> <918D>
+<7DD1> <7DD1> <97CE>
+<7DD2> <7DD2> <8F8F>
+<7DD5> <7DD5> <E38E>
+<7DD6> <7DD6> <FB8E>
+<7DD8> <7DD8> <E367>
+<7DDA> <7DDA> <90FC>
+<7DDC> <7DDC> <E363>
+<7DDD> <7DDD> <E368>
+<7DDE> <7DDE> <E36A>
+<7DE0> <7DE0> <92F7>
+<7DE1> <7DE1> <E36D>
+<7DE4> <7DE4> <E369>
+<7DE8> <7DE8> <95D2>
+<7DE9> <7DE9> <8AC9>
+<7DEC> <7DEC> <96C9>
+<7DEF> <7DEF> <88DC>
+<7DF2> <7DF2> <E36C>
+<7DF4> <7DF4> <97FB>
+<7DFB> <7DFB> <E36B>
+<7E01> <7E01> <898F>
+<7E04> <7E04> <93EA>
+<7E05> <7E05> <E36E>
+<7E09> <7E09> <E375>
+<7E0A> <7E0A> <E36F>
+<7E0B> <7E0B> <E376>
+<7E12> <7E12> <E372>
+<7E1B> <7E1B> <949B>
+<7E1E> <7E1E> <8EC8>
+<7E1F> <7E1F> <E374>
+<7E21> <7E21> <E371>
+<7E22> <7E22> <E377>
+<7E23> <7E23> <E370>
+<7E26> <7E26> <8F63>
+<7E2B> <7E2B> <9644>
+<7E2E> <7E2E> <8F6B>
+<7E31> <7E31> <E373>
+<7E32> <7E32> <E380>
+<7E35> <7E35> <E37B>
+<7E37> <7E37> <E37E>
+<7E39> <7E39> <E37C>
+<7E3A> <7E3A> <E381>
+<7E3B> <7E3B> <E37A>
+<7E3D> <7E3D> <E360>
+<7E3E> <7E3E> <90D1>
+<7E41> <7E41> <94C9>
+<7E43> <7E43> <E37D>
+<7E46> <7E46> <E378>
+<7E4A> <7E4A> <9140>
+<7E4B> <7E4B> <8C71>
+<7E4D> <7E4D> <8F4A>
+<7E52> <7E52> <FB8F>
+<7E54> <7E54> <9044>
+<7E55> <7E55> <9155>
+<7E56> <7E56> <E384>
+<7E59> <7E5A> <E386>
+<7E5D> <7E5D> <E383>
+<7E5E> <7E5E> <E385>
+<7E61> <7E61> <8F4A>
+<7E66> <7E66> <E379>
+<7E67> <7E67> <E382>
+<7E69> <7E69> <E38A>
+endbfrange
+
+100 beginbfrange
+<7E6A> <7E6A> <E389>
+<7E6B> <7E6B> <8C71>
+<7E6D> <7E6D> <969A>
+<7E70> <7E70> <8C4A>
+<7E79> <7E79> <E388>
+<7E7B> <7E7B> <E38C>
+<7E7C> <7E7C> <E38B>
+<7E7D> <7E7D> <E38F>
+<7E7F> <7E7F> <E391>
+<7E82> <7E82> <8E5B>
+<7E83> <7E83> <E38D>
+<7E88> <7E89> <E392>
+<7E8A> <7E8A> <FA5C>
+<7E8C> <7E8C> <E394>
+<7E8E> <7E8E> <E39A>
+<7E8F> <7E8F> <935A>
+<7E90> <7E90> <E396>
+<7E92> <7E92> <E395>
+<7E93> <7E94> <E397>
+<7E96> <7E96> <E399>
+<7E9B> <7E9C> <E39B>
+<7F36> <7F36> <8ACA>
+<7F38> <7F38> <E39D>
+<7F3A> <7F3A> <E39E>
+<7F45> <7F45> <E39F>
+<7F47> <7F47> <FB90>
+<7F4C> <7F4E> <E3A0>
+<7F50> <7F51> <E3A3>
+<7F54> <7F54> <E3A6>
+<7F55> <7F55> <E3A5>
+<7F58> <7F58> <E3A7>
+<7F5F> <7F60> <E3A8>
+<7F67> <7F67> <E3AC>
+<7F68> <7F69> <E3AA>
+<7F6A> <7F6A> <8DDF>
+<7F6B> <7F6B> <8C72>
+<7F6E> <7F6E> <9275>
+<7F70> <7F70> <94B1>
+<7F72> <7F72> <8F90>
+<7F75> <7F75> <946C>
+<7F77> <7F77> <94EB>
+<7F78> <7F78> <E3AD>
+<7F79> <7F79> <9CEB>
+<7F82> <7F82> <E3AE>
+<7F83> <7F83> <E3B0>
+<7F85> <7F85> <9785>
+<7F86> <7F86> <E3AF>
+<7F87> <7F87> <E3B2>
+<7F88> <7F88> <E3B1>
+<7F8A> <7F8A> <9772>
+<7F8C> <7F8C> <E3B3>
+<7F8E> <7F8E> <94FC>
+<7F94> <7F94> <E3B4>
+<7F9A> <7F9A> <E3B7>
+<7F9D> <7F9D> <E3B6>
+<7F9E> <7F9E> <E3B5>
+<7FA1> <7FA1> <FB91>
+<7FA3> <7FA3> <E3B8>
+<7FA4> <7FA4> <8C51>
+<7FA8> <7FA8> <9141>
+<7FA9> <7FA9> <8B60>
+<7FAE> <7FAE> <E3BC>
+<7FAF> <7FAF> <E3B9>
+<7FB2> <7FB2> <E3BA>
+<7FB6> <7FB6> <E3BD>
+<7FB8> <7FB8> <E3BE>
+<7FB9> <7FB9> <E3BB>
+<7FBD> <7FBD> <8948>
+<7FC1> <7FC1> <89A5>
+<7FC5> <7FC6> <E3C0>
+<7FCA> <7FCA> <E3C2>
+<7FCC> <7FCC> <9782>
+<7FD2> <7FD2> <8F4B>
+<7FD4> <7FD4> <E3C4>
+<7FD5> <7FD5> <E3C3>
+<7FE0> <7FE0> <9089>
+<7FE1> <7FE1> <E3C5>
+<7FE6> <7FE6> <E3C6>
+<7FE9> <7FE9> <E3C7>
+<7FEB> <7FEB> <8AE3>
+<7FF0> <7FF0> <8ACB>
+<7FF3> <7FF3> <E3C8>
+<7FF9> <7FF9> <E3C9>
+<7FFB> <7FFB> <967C>
+<7FFC> <7FFC> <9783>
+<8000> <8000> <9773>
+<8001> <8001> <9856>
+<8003> <8003> <8D6C>
+<8004> <8004> <E3CC>
+<8005> <8005> <8ED2>
+<8006> <8006> <E3CB>
+<800B> <800B> <E3CD>
+<800C> <800C> <8EA7>
+<8010> <8010> <91CF>
+<8012> <8012> <E3CE>
+<8015> <8015> <8D6B>
+<8017> <8017> <96D5>
+<8018> <8019> <E3CF>
+<801C> <801C> <E3D1>
+<8021> <8021> <E3D2>
+endbfrange
+
+100 beginbfrange
+<8028> <8028> <E3D3>
+<8033> <8033> <8EA8>
+<8036> <8036> <96EB>
+<803B> <803B> <E3D5>
+<803D> <803D> <925E>
+<803F> <803F> <E3D4>
+<8046> <8046> <E3D7>
+<804A> <804A> <E3D6>
+<8052> <8052> <E3D8>
+<8056> <8056> <90B9>
+<8058> <8058> <E3D9>
+<805A> <805A> <E3DA>
+<805E> <805E> <95B7>
+<805F> <805F> <E3DB>
+<8061> <8061> <918F>
+<8062> <8062> <E3DC>
+<8068> <8068> <E3DD>
+<806F> <806F> <97FC>
+<8070> <8070> <E3E0>
+<8072> <8072> <E3DF>
+<8073> <8073> <E3DE>
+<8074> <8074> <92AE>
+<8076> <8076> <E3E1>
+<8077> <8077> <9045>
+<8079> <8079> <E3E2>
+<807D> <807D> <E3E3>
+<807E> <807E> <9857>
+<807F> <807F> <E3E4>
+<8084> <8084> <E3E5>
+<8085> <8085> <E3E7>
+<8086> <8086> <E3E6>
+<8087> <8087> <94A3>
+<8089> <8089> <93F7>
+<808B> <808B> <985D>
+<808C> <808C> <94A7>
+<8093> <8093> <E3E9>
+<8096> <8096> <8FD1>
+<8098> <8098> <9549>
+<809A> <809A> <E3EA>
+<809B> <809B> <E3E8>
+<809D> <809D> <8ACC>
+<80A1> <80A1> <8CD2>
+<80A2> <80A2> <8E88>
+<80A5> <80A5> <94EC>
+<80A9> <80A9> <8CA8>
+<80AA> <80AA> <9662>
+<80AC> <80AC> <E3ED>
+<80AD> <80AD> <E3EB>
+<80AF> <80AF> <8D6D>
+<80B1> <80B1> <8D6E>
+<80B2> <80B2> <88E7>
+<80B4> <80B4> <8DE6>
+<80BA> <80BA> <9478>
+<80C3> <80C3> <88DD>
+<80C4> <80C4> <E3F2>
+<80C6> <80C6> <925F>
+<80CC> <80CC> <9477>
+<80CE> <80CE> <91D9>
+<80D6> <80D6> <E3F4>
+<80D9> <80D9> <E3F0>
+<80DA> <80DA> <E3F3>
+<80DB> <80DB> <E3EE>
+<80DD> <80DD> <E3F1>
+<80DE> <80DE> <9645>
+<80E1> <80E1> <8CD3>
+<80E4> <80E4> <88FB>
+<80E5> <80E5> <E3EF>
+<80EF> <80EF> <E3F6>
+<80F1> <80F1> <E3F7>
+<80F4> <80F4> <93B7>
+<80F8> <80F8> <8BB9>
+<80FC> <80FC> <E445>
+<80FD> <80FD> <945C>
+<8102> <8102> <8E89>
+<8105> <8105> <8BBA>
+<8106> <8106> <90C6>
+<8107> <8107> <9865>
+<8108> <8108> <96AC>
+<8109> <8109> <E3F5>
+<810A> <810A> <90D2>
+<811A> <811A> <8B72>
+<811B> <811B> <E3F8>
+<8123> <8123> <E3FA>
+<8129> <8129> <E3F9>
+<812F> <812F> <E3FB>
+<8131> <8131> <9245>
+<8133> <8133> <945D>
+<8139> <8139> <92AF>
+<813E> <813E> <E442>
+<8146> <8146> <E441>
+<814B> <814B> <E3FC>
+<814E> <814E> <9074>
+<8150> <8150> <9585>
+<8151> <8151> <E444>
+<8153> <8153> <E443>
+<8154> <8154> <8D6F>
+<8155> <8155> <9872>
+<815F> <815F> <E454>
+<8165> <8166> <E448>
+<816B> <816B> <8EEE>
+endbfrange
+
+100 beginbfrange
+<816E> <816E> <E447>
+<8170> <8170> <8D98>
+<8171> <8171> <E446>
+<8174> <8174> <E44A>
+<8178> <8178> <92B0>
+<8179> <8179> <95A0>
+<817A> <817A> <9142>
+<817F> <817F> <91DA>
+<8180> <8180> <E44E>
+<8182> <8182> <E44F>
+<8183> <8183> <E44B>
+<8188> <8188> <E44C>
+<818A> <818A> <E44D>
+<818F> <818F> <8D70>
+<8193> <8193> <E455>
+<8195> <8195> <E451>
+<819A> <819A> <9586>
+<819C> <819C> <968C>
+<819D> <819D> <9547>
+<81A0> <81A0> <E450>
+<81A3> <81A3> <E453>
+<81A4> <81A4> <E452>
+<81A8> <81A8> <9663>
+<81A9> <81A9> <E456>
+<81B0> <81B0> <E457>
+<81B3> <81B3> <9156>
+<81B5> <81B5> <E458>
+<81B8> <81B8> <E45A>
+<81BA> <81BA> <E45E>
+<81BD> <81BD> <E45B>
+<81BE> <81BE> <E459>
+<81BF> <81BF> <945E>
+<81C0> <81C0> <E45C>
+<81C2> <81C2> <E45D>
+<81C6> <81C6> <89B0>
+<81C8> <81C8> <E464>
+<81C9> <81C9> <E45F>
+<81CD> <81CD> <E460>
+<81D1> <81D1> <E461>
+<81D3> <81D3> <919F>
+<81D8> <81D8> <E463>
+<81D9> <81D9> <E462>
+<81DA> <81DA> <E465>
+<81DF> <81E0> <E466>
+<81E3> <81E3> <9062>
+<81E5> <81E5> <89E7>
+<81E7> <81E7> <E468>
+<81E8> <81E8> <97D5>
+<81EA> <81EA> <8EA9>
+<81ED> <81ED> <8F4C>
+<81F3> <81F3> <8E8A>
+<81F4> <81F4> <9276>
+<81FA> <81FB> <E469>
+<81FC> <81FC> <8950>
+<81FE> <81FE> <E46B>
+<8201> <8202> <E46C>
+<8205> <8205> <E46E>
+<8207> <8207> <E46F>
+<8208> <8208> <8BBB>
+<8209> <8209> <9DA8>
+<820A> <820A> <E470>
+<820C> <820C> <90E3>
+<820D> <820D> <E471>
+<820E> <820E> <8EC9>
+<8210> <8210> <E472>
+<8212> <8212> <98AE>
+<8216> <8216> <E473>
+<8217> <8217> <95DC>
+<8218> <8218> <8ADA>
+<821B> <821B> <9143>
+<821C> <821C> <8F77>
+<821E> <821E> <9591>
+<821F> <821F> <8F4D>
+<8229> <8229> <E474>
+<822A> <822A> <8D71>
+<822B> <822B> <E475>
+<822C> <822C> <94CA>
+<822E> <822E> <E484>
+<8233> <8233> <E477>
+<8235> <8235> <91C7>
+<8236> <8236> <9495>
+<8237> <8237> <8CBD>
+<8238> <8238> <E476>
+<8239> <8239> <9144>
+<8240> <8240> <E478>
+<8247> <8247> <92F8>
+<8258> <8258> <E47A>
+<8259> <8259> <E479>
+<825A> <825A> <E47C>
+<825D> <825D> <E47B>
+<825F> <825F> <E47D>
+<8262> <8262> <E480>
+<8264> <8264> <E47E>
+<8266> <8266> <8ACD>
+<8268> <8268> <E481>
+<826A> <826B> <E482>
+<826E> <826E> <8DAF>
+<826F> <826F> <97C7>
+<8271> <8271> <E485>
+<8272> <8272> <9046>
+endbfrange
+
+100 beginbfrange
+<8276> <8276> <8990>
+<8277> <8278> <E486>
+<827E> <827E> <E488>
+<828B> <828B> <88F0>
+<828D> <828D> <E489>
+<8292> <8292> <E48A>
+<8299> <8299> <9587>
+<829D> <829D> <8EC5>
+<829F> <829F> <E48C>
+<82A5> <82A5> <8A48>
+<82A6> <82A6> <88B0>
+<82AB> <82AB> <E48B>
+<82AC> <82AC> <E48E>
+<82AD> <82AD> <946D>
+<82AF> <82AF> <9063>
+<82B1> <82B1> <89D4>
+<82B3> <82B3> <9646>
+<82B8> <82B8> <8C7C>
+<82B9> <82B9> <8BDA>
+<82BB> <82BB> <E48D>
+<82BD> <82BD> <89E8>
+<82C5> <82C5> <8AA1>
+<82D1> <82D1> <8991>
+<82D2> <82D2> <E492>
+<82D3> <82D3> <97E8>
+<82D4> <82D4> <91DB>
+<82D7> <82D7> <9563>
+<82D9> <82D9> <E49E>
+<82DB> <82DB> <89D5>
+<82DC> <82DC> <E49C>
+<82DE> <82DE> <E49A>
+<82DF> <82DF> <E491>
+<82E1> <82E1> <E48F>
+<82E3> <82E3> <E490>
+<82E5> <82E5> <8EE1>
+<82E6> <82E6> <8BEA>
+<82E7> <82E7> <9297>
+<82EB> <82EB> <93CF>
+<82F1> <82F1> <8970>
+<82F3> <82F3> <E494>
+<82F4> <82F4> <E493>
+<82F9> <82F9> <E499>
+<82FA> <82FA> <E495>
+<82FB> <82FB> <E498>
+<8301> <8301> <FB93>
+<8302> <8302> <96CE>
+<8303> <8303> <E497>
+<8304> <8304> <89D6>
+<8305> <8305> <8A9D>
+<8306> <8306> <E49B>
+<8309> <8309> <E49D>
+<830E> <830E> <8C73>
+<8316> <8316> <E4A1>
+<8317> <8318> <E4AA>
+<831C> <831C> <88A9>
+<8323> <8323> <E4B2>
+<8328> <8328> <88EF>
+<832B> <832B> <E4A9>
+<832F> <832F> <E4A8>
+<8331> <8331> <E4A3>
+<8332> <8332> <E4A2>
+<8334> <8334> <E4A0>
+<8335> <8335> <E49F>
+<8336> <8336> <9283>
+<8338> <8338> <91F9>
+<8339> <8339> <E4A5>
+<8340> <8340> <E4A4>
+<8345> <8345> <E4A7>
+<8349> <8349> <9190>
+<834A> <834A> <8C74>
+<834F> <834F> <8960>
+<8350> <8350> <E4A6>
+<8352> <8352> <8D72>
+<8358> <8358> <9191>
+<8362> <8362> <FB94>
+<8373> <8373> <E4B8>
+<8375> <8375> <E4B9>
+<8377> <8377> <89D7>
+<837B> <837B> <89AC>
+<837C> <837C> <E4B6>
+<837F> <837F> <FB95>
+<8385> <8385> <E4AC>
+<8387> <8387> <E4B4>
+<8389> <8389> <E4BB>
+<838A> <838A> <E4B5>
+<838E> <838E> <E4B3>
+<8393> <8393> <E496>
+<8396> <8396> <E4B1>
+<839A> <839A> <E4AD>
+<839E> <839E> <8ACE>
+<839F> <839F> <E4AF>
+<83A0> <83A0> <E4BA>
+<83A2> <83A2> <E4B0>
+<83A8> <83A8> <E4BC>
+<83AA> <83AA> <E4AE>
+<83AB> <83AB> <949C>
+<83B1> <83B1> <9789>
+<83B5> <83B5> <E4B7>
+<83BD> <83BD> <E4CD>
+<83C1> <83C1> <E4C5>
+endbfrange
+
+100 beginbfrange
+<83C5> <83C5> <909B>
+<83C7> <83C7> <FB96>
+<83CA> <83CA> <8B65>
+<83CC> <83CC> <8BDB>
+<83CE> <83CE> <E4C0>
+<83D3> <83D3> <89D9>
+<83D6> <83D6> <8FD2>
+<83D8> <83D8> <E4C3>
+<83DC> <83DC> <8DD8>
+<83DF> <83DF> <9370>
+<83E0> <83E0> <E4C8>
+<83E9> <83E9> <95EC>
+<83EB> <83EB> <E4BF>
+<83EF> <83EF> <89D8>
+<83F0> <83F0> <8CD4>
+<83F1> <83F1> <9548>
+<83F2> <83F2> <E4C9>
+<83F4> <83F4> <E4BD>
+<83F6> <83F6> <FB97>
+<83F7> <83F7> <E4C6>
+<83FB> <83FB> <E4D0>
+<83FD> <83FD> <E4C1>
+<8403> <8403> <E4C2>
+<8404> <8404> <93B8>
+<8407> <8407> <E4C7>
+<840A> <840A> <9789>
+<840B> <840B> <E4C4>
+<840C> <840C> <9647>
+<840D> <840D> <E4CA>
+<840E> <840E> <88DE>
+<8413> <8413> <E4BE>
+<8420> <8420> <E4CC>
+<8422> <8422> <E4CB>
+<8429> <8429> <948B>
+<842A> <842A> <E4D2>
+<842C> <842C> <E4DD>
+<8431> <8431> <8A9E>
+<8435> <8435> <E4E0>
+<8438> <8438> <E4CE>
+<843C> <843C> <E4D3>
+<843D> <843D> <978E>
+<8446> <8446> <E4DC>
+<8448> <8448> <FB98>
+<8449> <8449> <9774>
+<844E> <844E> <97A8>
+<8457> <8457> <9298>
+<845B> <845B> <8A8B>
+<8461> <8461> <9592>
+<8462> <8462> <E4E2>
+<8463> <8463> <939F>
+<8466> <8466> <88AF>
+<8469> <8469> <E4DB>
+<846B> <846B> <E4D7>
+<846C> <846C> <9192>
+<846D> <846D> <E4D1>
+<846E> <846E> <E4D9>
+<846F> <846F> <E4DE>
+<8471> <8471> <944B>
+<8475> <8475> <88A8>
+<8477> <8477> <E4D6>
+<8479> <8479> <E4DF>
+<847A> <847A> <9598>
+<8482> <8482> <E4DA>
+<8484> <8484> <E4D5>
+<848B> <848B> <8FD3>
+<8490> <8490> <8F4E>
+<8494> <8494> <8EAA>
+<8499> <8499> <96D6>
+<849C> <849C> <9566>
+<849F> <849F> <E4E5>
+<84A1> <84A1> <E4EE>
+<84AD> <84AD> <E4D8>
+<84B2> <84B2> <8A97>
+<84B4> <84B4> <FB99>
+<84B8> <84B8> <8FF6>
+<84B9> <84B9> <E4E3>
+<84BB> <84BB> <E4E8>
+<84BC> <84BC> <9193>
+<84BF> <84BF> <E4E4>
+<84C1> <84C1> <E4EB>
+<84C4> <84C4> <927E>
+<84C6> <84C6> <E4EC>
+<84C9> <84C9> <9775>
+<84CA> <84CA> <E4E1>
+<84CB> <84CB> <8A57>
+<84CD> <84CD> <E4E7>
+<84D0> <84D0> <E4EA>
+<84D1> <84D1> <96AA>
+<84D6> <84D6> <E4ED>
+<84D9> <84D9> <E4E6>
+<84DA> <84DA> <E4E9>
+<84DC> <84DC> <FA60>
+<84EC> <84EC> <9648>
+<84EE> <84EE> <9840>
+<84F4> <84F4> <E4F1>
+<84FC> <84FC> <E4F8>
+<84FF> <84FF> <E4F0>
+<8500> <8500> <8EC1>
+<8506> <8506> <E4CF>
+<8511> <8511> <95CC>
+endbfrange
+
+100 beginbfrange
+<8513> <8513> <96A0>
+<8514> <8514> <E4F7>
+<8515> <8515> <E4F6>
+<8517> <8518> <E4F2>
+<851A> <851A> <8955>
+<851F> <851F> <E4F5>
+<8521> <8521> <E4EF>
+<8523> <8523> <8FD3>
+<8526> <8526> <92D3>
+<852C> <852C> <E4F4>
+<852D> <852D> <88FC>
+<8535> <8535> <91A0>
+<853D> <853D> <95C1>
+<853E> <853E> <E55B>
+<8540> <8540> <E4F9>
+<8541> <8541> <E540>
+<8543> <8543> <94D7>
+<8548> <8548> <E4FC>
+<8549> <8549> <8FD4>
+<854A> <854A> <8EC7>
+<854B> <854B> <E542>
+<854E> <854E> <8BBC>
+<8553> <8553> <FB9A>
+<8555> <8555> <E543>
+<8557> <8557> <9599>
+<8558> <8558> <E4FB>
+<8559> <8559> <FB9B>
+<855A> <855A> <E4D4>
+<8563> <8563> <E4FA>
+<8568> <8568> <986E>
+<8569> <8569> <93A0>
+<856A> <856A> <9593>
+<856B> <856B> <FB9C>
+<856D> <856D> <E54A>
+<8577> <8577> <E550>
+<857E> <857E> <E551>
+<8580> <8580> <E544>
+<8584> <8584> <9496>
+<8587> <8587> <E54E>
+<8588> <8588> <E546>
+<858A> <858A> <E548>
+<8590> <8590> <E552>
+<8591> <8591> <E547>
+<8594> <8594> <E54B>
+<8597> <8597> <8992>
+<8599> <8599> <93E3>
+<859B> <859B> <E54C>
+<859C> <859C> <E54F>
+<85A4> <85A4> <E545>
+<85A6> <85A6> <9145>
+<85A8> <85A8> <E549>
+<85A9> <85A9> <8E46>
+<85AA> <85AA> <9064>
+<85AB> <85AB> <8C4F>
+<85AC> <85AC> <96F2>
+<85AE> <85AE> <96F7>
+<85AF> <85AF> <8F92>
+<85B0> <85B0> <FB9E>
+<85B9> <85B9> <E556>
+<85BA> <85BA> <E554>
+<85C1> <85C1> <986D>
+<85C9> <85C9> <E553>
+<85CD> <85CD> <9795>
+<85CF> <85CF> <E555>
+<85D0> <85D0> <E557>
+<85D5> <85D5> <E558>
+<85DC> <85DC> <E55B>
+<85DD> <85DD> <E559>
+<85E4> <85E4> <93A1>
+<85E5> <85E5> <E55A>
+<85E9> <85E9> <94CB>
+<85EA> <85EA> <E54D>
+<85F7> <85F7> <8F93>
+<85F9> <85F9> <E55C>
+<85FA> <85FA> <E561>
+<85FB> <85FB> <9194>
+<85FE> <85FE> <E560>
+<8602> <8602> <E541>
+<8606> <8606> <E562>
+<8607> <8607> <9168>
+<860A> <860A> <E55D>
+<860B> <860B> <E55F>
+<8613> <8613> <E55E>
+<8616> <8616> <9F50>
+<8617> <8617> <9F41>
+<861A> <861A> <E564>
+<8622> <8622> <E563>
+<862D> <862D> <9796>
+<862F> <862F> <E1BA>
+<8630> <8630> <E565>
+<863F> <863F> <E566>
+<864D> <864D> <E567>
+<864E> <864E> <8CD5>
+<8650> <8650> <8B73>
+<8654> <8654> <E569>
+<8655> <8655> <997C>
+<865A> <865A> <8B95>
+<865C> <865C> <97B8>
+<865E> <865E> <8BF1>
+<865F> <865F> <E56A>
+endbfrange
+
+100 beginbfrange
+<8667> <8667> <E56B>
+<866B> <866B> <928E>
+<8671> <8671> <E56C>
+<8679> <8679> <93F8>
+<867B> <867B> <88B8>
+<868A> <868A> <89E1>
+<868B> <868C> <E571>
+<8693> <8693> <E56D>
+<8695> <8695> <8E5C>
+<86A3> <86A3> <E56E>
+<86A4> <86A4> <9461>
+<86A9> <86AA> <E56F>
+<86AB> <86AB> <E57A>
+<86AF> <86AF> <E574>
+<86B0> <86B0> <E577>
+<86B6> <86B6> <E573>
+<86C4> <86C4> <E575>
+<86C6> <86C6> <E576>
+<86C7> <86C7> <8ED6>
+<86C9> <86C9> <E578>
+<86CB> <86CB> <9260>
+<86CD> <86CD> <8C75>
+<86CE> <86CE> <8A61>
+<86D4> <86D4> <E57B>
+<86D9> <86D9> <8A5E>
+<86DB> <86DB> <E581>
+<86DE> <86DE> <E57C>
+<86DF> <86DF> <E580>
+<86E4> <86E4> <94B8>
+<86E9> <86E9> <E57D>
+<86EC> <86EC> <E57E>
+<86ED> <86ED> <9567>
+<86EE> <86EE> <94D8>
+<86EF> <86EF> <E582>
+<86F8> <86F8> <91FB>
+<86F9> <86F9> <E58C>
+<86FB> <86FB> <E588>
+<86FE> <86FE> <89E9>
+<8700> <8700> <E586>
+<8702> <8702> <9649>
+<8703> <8703> <E587>
+<8706> <8706> <E584>
+<8708> <8708> <E585>
+<8709> <8709> <E58A>
+<870A> <870A> <E58D>
+<870D> <870D> <E58B>
+<8711> <8711> <E589>
+<8712> <8712> <E583>
+<8718> <8718> <9277>
+<871A> <871A> <E594>
+<871C> <871C> <96A8>
+<8725> <8725> <E592>
+<8729> <8729> <E593>
+<8734> <8734> <E58E>
+<8737> <8737> <E590>
+<873B> <873B> <E591>
+<873F> <873F> <E58F>
+<8749> <8749> <90E4>
+<874B> <874B> <9858>
+<874C> <874C> <E598>
+<874E> <874E> <E599>
+<8753> <8753> <E59F>
+<8755> <8755> <9049>
+<8757> <8757> <E59B>
+<8759> <8759> <E59E>
+<875F> <875F> <E596>
+<8760> <8760> <E595>
+<8763> <8763> <E5A0>
+<8766> <8766> <89DA>
+<8768> <8768> <E59C>
+<876A> <876A> <E5A1>
+<876E> <876E> <E59D>
+<8774> <8774> <E59A>
+<8776> <8776> <92B1>
+<8778> <8778> <E597>
+<877F> <877F> <9488>
+<8782> <8782> <E5A5>
+<878D> <878D> <975A>
+<879F> <879F> <E5A4>
+<87A2> <87A2> <E5A3>
+<87AB> <87AB> <E5AC>
+<87AF> <87AF> <E5A6>
+<87B3> <87B3> <E5AE>
+<87BA> <87BA> <9786>
+<87BB> <87BB> <E5B1>
+<87BD> <87BD> <E5A8>
+<87C0> <87C0> <E5A9>
+<87C4> <87C4> <E5AD>
+<87C6> <87C6> <E5B0>
+<87C7> <87C7> <E5AF>
+<87CB> <87CB> <E5A7>
+<87D0> <87D0> <E5AA>
+<87D2> <87D2> <E5BB>
+<87E0> <87E0> <E5B4>
+<87EC> <87EC> <90E4>
+<87EF> <87EF> <E5B2>
+<87F2> <87F2> <E5B3>
+<87F6> <87F7> <E5B8>
+<87F9> <87F9> <8A49>
+<87FB> <87FB> <8B61>
+endbfrange
+
+100 beginbfrange
+<87FE> <87FE> <E5B7>
+<8805> <8805> <E5A2>
+<8807> <8807> <FBA1>
+<880D> <880D> <E5B6>
+<880E> <880E> <E5BA>
+<880F> <880F> <E5B5>
+<8811> <8811> <E5BC>
+<8815> <8815> <E5BE>
+<8816> <8816> <E5BD>
+<881F> <881F> <9858>
+<8821> <8821> <E5C0>
+<8822> <8822> <E5BF>
+<8823> <8823> <E579>
+<8827> <8827> <E5C4>
+<8831> <8831> <E5C1>
+<8836> <8836> <E5C2>
+<8839> <8839> <E5C3>
+<883B> <883B> <E5C5>
+<8840> <8840> <8C8C>
+<8842> <8842> <E5C7>
+<8844> <8844> <E5C6>
+<8846> <8846> <8F4F>
+<884C> <884C> <8D73>
+<884D> <884D> <9FA5>
+<8852> <8852> <E5C8>
+<8853> <8853> <8F70>
+<8857> <8857> <8A58>
+<8859> <8859> <E5C9>
+<885B> <885B> <8971>
+<885D> <885D> <8FD5>
+<885E> <885E> <E5CA>
+<8861> <8861> <8D74>
+<8862> <8862> <E5CB>
+<8863> <8863> <88DF>
+<8868> <8868> <955C>
+<886B> <886B> <E5CC>
+<8870> <8870> <908A>
+<8872> <8872> <E5D3>
+<8875> <8875> <E5D0>
+<8877> <8877> <928F>
+<887D> <887D> <E5D1>
+<887E> <887E> <E5CE>
+<887F> <887F> <8BDC>
+<8881> <8881> <E5CD>
+<8882> <8882> <E5D4>
+<8888> <8888> <8C55>
+<888B> <888B> <91DC>
+<888D> <888D> <E5DA>
+<8892> <8892> <E5D6>
+<8896> <8896> <91B3>
+<8897> <8897> <E5D5>
+<8899> <8899> <E5D8>
+<889E> <889E> <E5CF>
+<88A2> <88A2> <E5D9>
+<88A4> <88A4> <E5DB>
+<88AB> <88AB> <94ED>
+<88AE> <88AE> <E5D7>
+<88B0> <88B0> <E5DC>
+<88B1> <88B1> <E5DE>
+<88B4> <88B4> <8CD1>
+<88B5> <88B5> <E5D2>
+<88B7> <88B7> <88BF>
+<88BF> <88BF> <E5DD>
+<88C1> <88C1> <8DD9>
+<88C2> <88C2> <97F4>
+<88C3> <88C4> <E5DF>
+<88C5> <88C5> <9195>
+<88CF> <88CF> <97A0>
+<88D4> <88D4> <E5E1>
+<88D5> <88D5> <9754>
+<88D8> <88D9> <E5E2>
+<88DC> <88DC> <95E2>
+<88DD> <88DD> <E5E4>
+<88DF> <88DF> <8DBE>
+<88E1> <88E1> <97A1>
+<88E8> <88E8> <E5E9>
+<88F2> <88F2> <E5EA>
+<88F3> <88F3> <8FD6>
+<88F4> <88F4> <E5E8>
+<88F5> <88F5> <FBA2>
+<88F8> <88F8> <9787>
+<88F9> <88F9> <E5E5>
+<88FC> <88FC> <E5E7>
+<88FD> <88FD> <90BB>
+<88FE> <88FE> <909E>
+<8902> <8902> <E5E6>
+<8904> <8904> <E5EB>
+<8907> <8907> <95A1>
+<890A> <890A> <E5ED>
+<890C> <890C> <E5EC>
+<8910> <8910> <8A8C>
+<8912> <8912> <964A>
+<8913> <8913> <E5EE>
+<891C> <891C> <FA5D>
+<891D> <891D> <E5FA>
+<891E> <891E> <E5F0>
+<8925> <8925> <E5F1>
+<892A> <892B> <E5F2>
+<8936> <8936> <E5F7>
+<8938> <8938> <E5F8>
+endbfrange
+
+100 beginbfrange
+<893B> <893B> <E5F6>
+<8941> <8941> <E5F4>
+<8943> <8943> <E5EF>
+<8944> <8944> <E5F5>
+<894C> <894C> <E5F9>
+<894D> <894D> <E8B5>
+<8956> <8956> <89A6>
+<895E> <895E> <E5FC>
+<895F> <895F> <8BDD>
+<8960> <8960> <E5FB>
+<8964> <8964> <E641>
+<8966> <8966> <E640>
+<896A> <896A> <E643>
+<896D> <896D> <E642>
+<896F> <896F> <E644>
+<8972> <8972> <8F50>
+<8974> <8974> <E645>
+<8977> <8977> <E646>
+<897E> <897E> <E647>
+<897F> <897F> <90BC>
+<8981> <8981> <9776>
+<8983> <8983> <E648>
+<8986> <8986> <95A2>
+<8987> <8987> <9465>
+<8988> <8988> <E649>
+<898A> <898A> <E64A>
+<898B> <898B> <8CA9>
+<898F> <898F> <8B4B>
+<8993> <8993> <E64B>
+<8996> <8996> <8E8B>
+<8997> <8997> <9460>
+<8998> <8998> <E64C>
+<899A> <899A> <8A6F>
+<89A1> <89A1> <E64D>
+<89A6> <89A6> <E64F>
+<89A7> <89A7> <9797>
+<89A9> <89A9> <E64E>
+<89AA> <89AA> <9065>
+<89AC> <89AC> <E650>
+<89AF> <89AF> <E651>
+<89B2> <89B2> <E652>
+<89B3> <89B3> <8ACF>
+<89BA> <89BA> <E653>
+<89BD> <89BD> <E654>
+<89BF> <89C0> <E655>
+<89D2> <89D2> <8A70>
+<89DA> <89DA> <E657>
+<89DC> <89DD> <E658>
+<89E3> <89E3> <89F0>
+<89E6> <89E6> <9047>
+<89E7> <89E7> <E65A>
+<89F4> <89F4> <E65B>
+<89F8> <89F8> <E65C>
+<8A00> <8A00> <8CBE>
+<8A02> <8A02> <92F9>
+<8A03> <8A03> <E65D>
+<8A08> <8A08> <8C76>
+<8A0A> <8A0A> <9075>
+<8A0C> <8A0C> <E660>
+<8A0E> <8A0E> <93A2>
+<8A10> <8A10> <E65F>
+<8A12> <8A12> <FBA3>
+<8A13> <8A13> <8C50>
+<8A16> <8A16> <E65E>
+<8A17> <8A17> <91F5>
+<8A18> <8A18> <8B4C>
+<8A1B> <8A1B> <E661>
+<8A1D> <8A1D> <E662>
+<8A1F> <8A1F> <8FD7>
+<8A23> <8A23> <8C8D>
+<8A25> <8A25> <E663>
+<8A2A> <8A2A> <964B>
+<8A2D> <8A2D> <90DD>
+<8A31> <8A31> <8B96>
+<8A33> <8A33> <96F3>
+<8A34> <8A34> <9169>
+<8A36> <8A36> <E664>
+<8A37> <8A37> <FBA4>
+<8A3A> <8A3A> <9066>
+<8A3B> <8A3B> <9290>
+<8A3C> <8A3C> <8FD8>
+<8A41> <8A41> <E665>
+<8A46> <8A46> <E668>
+<8A48> <8A48> <E669>
+<8A50> <8A50> <8DBC>
+<8A51> <8A51> <91C0>
+<8A52> <8A52> <E667>
+<8A54> <8A54> <8FD9>
+<8A55> <8A55> <955D>
+<8A5B> <8A5B> <E666>
+<8A5E> <8A5E> <8E8C>
+<8A60> <8A60> <8972>
+<8A62> <8A62> <E66D>
+<8A63> <8A63> <8C77>
+<8A66> <8A66> <8E8E>
+<8A69> <8A69> <8E8D>
+<8A6B> <8A6B> <986C>
+<8A6C> <8A6C> <E66C>
+<8A6D> <8A6D> <E66B>
+<8A6E> <8A6E> <9146>
+endbfrange
+
+100 beginbfrange
+<8A70> <8A70> <8B6C>
+<8A71> <8A71> <9862>
+<8A72> <8A72> <8A59>
+<8A73> <8A73> <8FDA>
+<8A79> <8A79> <FBA5>
+<8A7C> <8A7C> <E66A>
+<8A82> <8A82> <E66F>
+<8A84> <8A84> <E670>
+<8A85> <8A85> <E66E>
+<8A87> <8A87> <8CD6>
+<8A89> <8A89> <975F>
+<8A8C> <8A8C> <8E8F>
+<8A8D> <8A8D> <9446>
+<8A91> <8A91> <E673>
+<8A93> <8A93> <90BE>
+<8A95> <8A95> <9261>
+<8A98> <8A98> <9755>
+<8A9A> <8A9A> <E676>
+<8A9E> <8A9E> <8CEA>
+<8AA0> <8AA0> <90BD>
+<8AA1> <8AA1> <E672>
+<8AA3> <8AA3> <E677>
+<8AA4> <8AA4> <8CEB>
+<8AA5> <8AA6> <E674>
+<8AA7> <8AA7> <FBA6>
+<8AA8> <8AA8> <E671>
+<8AAC> <8AAC> <90E0>
+<8AAD> <8AAD> <93C7>
+<8AB0> <8AB0> <924E>
+<8AB2> <8AB2> <89DB>
+<8AB9> <8AB9> <94EE>
+<8ABC> <8ABC> <8B62>
+<8ABE> <8ABE> <FBA7>
+<8ABF> <8ABF> <92B2>
+<8AC2> <8AC2> <E67A>
+<8AC4> <8AC4> <E678>
+<8AC7> <8AC7> <926B>
+<8ACB> <8ACB> <90BF>
+<8ACC> <8ACC> <8AD0>
+<8ACD> <8ACD> <E679>
+<8ACF> <8ACF> <907A>
+<8AD2> <8AD2> <97C8>
+<8AD6> <8AD6> <985F>
+<8ADA> <8ADA> <E67B>
+<8ADB> <8ADB> <E687>
+<8ADC> <8ADC> <92B3>
+<8ADE> <8ADE> <E686>
+<8ADF> <8ADF> <FBA8>
+<8AE0> <8AE0> <E683>
+<8AE1> <8AE1> <E68B>
+<8AE2> <8AE2> <E684>
+<8AE4> <8AE4> <E680>
+<8AE6> <8AE6> <92FA>
+<8AE7> <8AE7> <E67E>
+<8AEB> <8AEB> <E67C>
+<8AED> <8AED> <9740>
+<8AEE> <8AEE> <8E90>
+<8AF1> <8AF1> <E681>
+<8AF3> <8AF3> <E67D>
+<8AF6> <8AF6> <FBAA>
+<8AF7> <8AF7> <E685>
+<8AF8> <8AF8> <8F94>
+<8AFA> <8AFA> <8CBF>
+<8AFE> <8AFE> <91F8>
+<8B00> <8B00> <9664>
+<8B01> <8B01> <8979>
+<8B02> <8B02> <88E0>
+<8B04> <8B04> <93A3>
+<8B07> <8B07> <E689>
+<8B0C> <8B0C> <E688>
+<8B0E> <8B0E> <93E4>
+<8B10> <8B10> <E68D>
+<8B14> <8B14> <E682>
+<8B16> <8B16> <E68C>
+<8B17> <8B17> <E68E>
+<8B19> <8B19> <8CAA>
+<8B1A> <8B1A> <E68A>
+<8B1B> <8B1B> <8D75>
+<8B1D> <8B1D> <8ED3>
+<8B20> <8B20> <E68F>
+<8B21> <8B21> <9777>
+<8B26> <8B26> <E692>
+<8B28> <8B28> <E695>
+<8B2B> <8B2B> <E693>
+<8B2C> <8B2C> <9554>
+<8B33> <8B33> <E690>
+<8B39> <8B39> <8BDE>
+<8B3E> <8B3E> <E694>
+<8B41> <8B41> <E696>
+<8B49> <8B49> <E69A>
+<8B4C> <8B4C> <E697>
+<8B4E> <8B4E> <E699>
+<8B4F> <8B4F> <E698>
+<8B53> <8B53> <FBAB>
+<8B56> <8B56> <E69B>
+<8B58> <8B58> <8EAF>
+<8B5A> <8B5A> <E69D>
+<8B5B> <8B5B> <E69C>
+<8B5C> <8B5C> <9588>
+<8B5F> <8B5F> <E69F>
+endbfrange
+
+100 beginbfrange
+<8B66> <8B66> <8C78>
+<8B6B> <8B6B> <E69E>
+<8B6C> <8B6C> <E6A0>
+<8B6F> <8B6F> <E6A1>
+<8B70> <8B70> <8B63>
+<8B71> <8B71> <E3BF>
+<8B72> <8B72> <8FF7>
+<8B74> <8B74> <E6A2>
+<8B77> <8B77> <8CEC>
+<8B7D> <8B7D> <E6A3>
+<8B7F> <8B7F> <FBAC>
+<8B80> <8B80> <E6A4>
+<8B83> <8B83> <8E5D>
+<8B8A> <8B8A> <9DCC>
+<8B8C> <8B8C> <E6A5>
+<8B8E> <8B8E> <E6A6>
+<8B90> <8B90> <8F51>
+<8B92> <8B93> <E6A7>
+<8B96> <8B96> <E6A9>
+<8B99> <8B9A> <E6AA>
+<8C37> <8C37> <924A>
+<8C3A> <8C3A> <E6AC>
+<8C3F> <8C3F> <E6AE>
+<8C41> <8C41> <E6AD>
+<8C46> <8C46> <93A4>
+<8C48> <8C48> <E6AF>
+<8C4A> <8C4A> <964C>
+<8C4C> <8C4C> <E6B0>
+<8C4E> <8C4E> <E6B1>
+<8C50> <8C50> <E6B2>
+<8C55> <8C55> <E6B3>
+<8C5A> <8C5A> <93D8>
+<8C61> <8C61> <8FDB>
+<8C62> <8C62> <E6B4>
+<8C6A> <8C6A> <8D8B>
+<8C6B> <8C6B> <98AC>
+<8C6C> <8C6C> <E6B5>
+<8C78> <8C78> <E6B6>
+<8C79> <8C79> <955E>
+<8C7A> <8C7A> <E6B7>
+<8C7C> <8C7C> <E6BF>
+<8C82> <8C82> <E6B8>
+<8C85> <8C85> <E6BA>
+<8C89> <8C89> <E6B9>
+<8C8A> <8C8A> <E6BB>
+<8C8C> <8C8C> <9665>
+<8C8D> <8C8E> <E6BC>
+<8C94> <8C94> <E6BE>
+<8C98> <8C98> <E6C0>
+<8C9D> <8C9D> <8A4C>
+<8C9E> <8C9E> <92E5>
+<8CA0> <8CA0> <9589>
+<8CA1> <8CA1> <8DE0>
+<8CA2> <8CA2> <8D76>
+<8CA7> <8CA7> <956E>
+<8CA8> <8CA8> <89DD>
+<8CA9> <8CA9> <94CC>
+<8CAA> <8CAA> <E6C3>
+<8CAB> <8CAB> <8AD1>
+<8CAC> <8CAC> <90D3>
+<8CAD> <8CAD> <E6C2>
+<8CAE> <8CAE> <E6C7>
+<8CAF> <8CAF> <9299>
+<8CB0> <8CB0> <96E1>
+<8CB2> <8CB3> <E6C5>
+<8CB4> <8CB4> <8B4D>
+<8CB6> <8CB6> <E6C8>
+<8CB7> <8CB7> <9483>
+<8CB8> <8CB8> <91DD>
+<8CBB> <8CBB> <94EF>
+<8CBC> <8CBC> <935C>
+<8CBD> <8CBD> <E6C4>
+<8CBF> <8CBF> <9666>
+<8CC0> <8CC0> <89EA>
+<8CC1> <8CC1> <E6CA>
+<8CC2> <8CC2> <9847>
+<8CC3> <8CC3> <92C0>
+<8CC4> <8CC4> <9864>
+<8CC7> <8CC7> <8E91>
+<8CC8> <8CC8> <E6C9>
+<8CCA> <8CCA> <91AF>
+<8CCD> <8CCD> <E6DA>
+<8CCE> <8CCE> <9147>
+<8CD1> <8CD1> <93F6>
+<8CD3> <8CD3> <956F>
+<8CDA> <8CDA> <E6CD>
+<8CDB> <8CDB> <8E5E>
+<8CDC> <8CDC> <8E92>
+<8CDE> <8CDE> <8FDC>
+<8CE0> <8CE0> <9485>
+<8CE2> <8CE2> <8CAB>
+<8CE3> <8CE3> <E6CC>
+<8CE4> <8CE4> <E6CB>
+<8CE6> <8CE6> <958A>
+<8CEA> <8CEA> <8EBF>
+<8CED> <8CED> <9371>
+<8CF0> <8CF0> <FBAD>
+<8CF4> <8CF4> <FBAE>
+<8CFA> <8CFB> <E6CF>
+<8CFC> <8CFC> <8D77>
+endbfrange
+
+100 beginbfrange
+<8CFD> <8CFD> <E6CE>
+<8D04> <8D05> <E6D1>
+<8D07> <8D07> <E6D4>
+<8D08> <8D08> <91A1>
+<8D0A> <8D0A> <E6D3>
+<8D0B> <8D0B> <8AE4>
+<8D0D> <8D0D> <E6D6>
+<8D0F> <8D0F> <E6D5>
+<8D10> <8D10> <E6D7>
+<8D12> <8D12> <FBAF>
+<8D13> <8D13> <E6D9>
+<8D14> <8D14> <E6DB>
+<8D16> <8D16> <E6DC>
+<8D64> <8D64> <90D4>
+<8D66> <8D66> <8ECD>
+<8D67> <8D67> <E6DD>
+<8D6B> <8D6B> <8A71>
+<8D6D> <8D6D> <E6DE>
+<8D70> <8D70> <9196>
+<8D71> <8D71> <E6DF>
+<8D73> <8D73> <E6E0>
+<8D74> <8D74> <958B>
+<8D76> <8D76> <FBB0>
+<8D77> <8D77> <8B4E>
+<8D81> <8D81> <E6E1>
+<8D85> <8D85> <92B4>
+<8D8A> <8D8A> <897A>
+<8D99> <8D99> <E6E2>
+<8DA3> <8DA3> <8EEF>
+<8DA8> <8DA8> <9096>
+<8DB3> <8DB3> <91AB>
+<8DBA> <8DBA> <E6E5>
+<8DBE> <8DBE> <E6E4>
+<8DC2> <8DC2> <E6E3>
+<8DCB> <8DCB> <E6EB>
+<8DCC> <8DCC> <E6E9>
+<8DCF> <8DCF> <E6E6>
+<8DD6> <8DD6> <E6E8>
+<8DDA> <8DDA> <E6E7>
+<8DDB> <8DDB> <E6EA>
+<8DDD> <8DDD> <8B97>
+<8DDF> <8DDF> <E6EE>
+<8DE1> <8DE1> <90D5>
+<8DE3> <8DE3> <E6EF>
+<8DE8> <8DE8> <8CD7>
+<8DEA> <8DEB> <E6EC>
+<8DEF> <8DEF> <9848>
+<8DF3> <8DF3> <92B5>
+<8DF5> <8DF5> <9148>
+<8DFC> <8DFC> <E6F0>
+<8DFF> <8DFF> <E6F3>
+<8E08> <8E09> <E6F1>
+<8E0A> <8E0A> <9778>
+<8E0F> <8E0F> <93A5>
+<8E10> <8E10> <E6F6>
+<8E1D> <8E1E> <E6F4>
+<8E1F> <8E1F> <E6F7>
+<8E2A> <8E2A> <E748>
+<8E30> <8E30> <E6FA>
+<8E34> <8E34> <E6FB>
+<8E35> <8E35> <E6F9>
+<8E42> <8E42> <E6F8>
+<8E44> <8E44> <92FB>
+<8E47> <8E47> <E740>
+<8E48> <8E48> <E744>
+<8E49> <8E49> <E741>
+<8E4A> <8E4A> <E6FC>
+<8E4C> <8E4C> <E742>
+<8E50> <8E50> <E743>
+<8E55> <8E55> <E74A>
+<8E59> <8E59> <E745>
+<8E5F> <8E5F> <90D6>
+<8E60> <8E60> <E747>
+<8E63> <8E63> <E749>
+<8E64> <8E64> <E746>
+<8E72> <8E72> <E74C>
+<8E74> <8E74> <8F52>
+<8E76> <8E76> <E74B>
+<8E7C> <8E7C> <E74D>
+<8E81> <8E81> <E74E>
+<8E84> <8E84> <E751>
+<8E85> <8E85> <E750>
+<8E87> <8E87> <E74F>
+<8E8A> <8E8A> <E753>
+<8E8B> <8E8B> <E752>
+<8E8D> <8E8D> <96F4>
+<8E91> <8E91> <E755>
+<8E93> <8E93> <E754>
+<8E94> <8E94> <E756>
+<8E99> <8E99> <E757>
+<8EA1> <8EA1> <E759>
+<8EAA> <8EAA> <E758>
+<8EAB> <8EAB> <9067>
+<8EAC> <8EAC> <E75A>
+<8EAF> <8EAF> <8BEB>
+<8EB0> <8EB0> <E75B>
+<8EB1> <8EB1> <E75D>
+<8EBE> <8EBE> <E75E>
+<8EC0> <8EC0> <8BEB>
+<8EC5> <8EC5> <E75F>
+endbfrange
+
+100 beginbfrange
+<8EC6> <8EC6> <E75C>
+<8EC8> <8EC8> <E760>
+<8ECA> <8ECA> <8ED4>
+<8ECB> <8ECB> <E761>
+<8ECC> <8ECC> <8B4F>
+<8ECD> <8ECD> <8C52>
+<8ECF> <8ECF> <FBB2>
+<8ED2> <8ED2> <8CAC>
+<8EDB> <8EDB> <E762>
+<8EDF> <8EDF> <93EE>
+<8EE2> <8EE2> <935D>
+<8EE3> <8EE3> <E763>
+<8EEB> <8EEB> <E766>
+<8EF8> <8EF8> <8EB2>
+<8EFB> <8EFB> <E765>
+<8EFC> <8EFC> <E764>
+<8EFD> <8EFD> <8C79>
+<8EFE> <8EFE> <E767>
+<8F03> <8F03> <8A72>
+<8F05> <8F05> <E769>
+<8F09> <8F09> <8DDA>
+<8F0A> <8F0A> <E768>
+<8F0C> <8F0C> <E771>
+<8F12> <8F12> <E76B>
+<8F13> <8F13> <E76D>
+<8F14> <8F14> <95E3>
+<8F15> <8F15> <E76A>
+<8F19> <8F19> <E76C>
+<8F1B> <8F1B> <E770>
+<8F1C> <8F1C> <E76E>
+<8F1D> <8F1D> <8B50>
+<8F1F> <8F1F> <E76F>
+<8F26> <8F26> <E772>
+<8F29> <8F29> <9479>
+<8F2A> <8F2A> <97D6>
+<8F2F> <8F2F> <8F53>
+<8F33> <8F33> <E773>
+<8F38> <8F38> <9741>
+<8F39> <8F39> <E775>
+<8F3B> <8F3B> <E774>
+<8F3E> <8F3E> <E778>
+<8F3F> <8F3F> <9760>
+<8F42> <8F42> <E777>
+<8F44> <8F44> <8A8D>
+<8F45> <8F45> <E776>
+<8F46> <8F46> <E77B>
+<8F49> <8F49> <E77A>
+<8F4C> <8F4C> <E779>
+<8F4D> <8F4D> <9351>
+<8F4E> <8F4E> <E77C>
+<8F57> <8F57> <E77D>
+<8F5C> <8F5C> <E77E>
+<8F5F> <8F5F> <8D8C>
+<8F61> <8F61> <8C44>
+<8F62> <8F64> <E780>
+<8F9B> <8F9B> <9068>
+<8F9C> <8F9C> <E783>
+<8F9E> <8F9E> <8EAB>
+<8F9F> <8F9F> <E784>
+<8FA3> <8FA3> <E785>
+<8FA7> <8FA7> <999F>
+<8FA8> <8FA8> <999E>
+<8FAD> <8FAD> <E786>
+<8FAE> <8FAE> <E390>
+<8FAF> <8FAF> <E787>
+<8FB0> <8FB0> <9243>
+<8FB1> <8FB1> <904A>
+<8FB2> <8FB2> <945F>
+<8FB7> <8FB7> <E788>
+<8FBA> <8FBA> <95D3>
+<8FBB> <8FBB> <92D2>
+<8FBC> <8FBC> <8D9E>
+<8FBF> <8FBF> <9248>
+<8FC2> <8FC2> <8949>
+<8FC4> <8FC4> <9698>
+<8FC5> <8FC5> <9076>
+<8FCE> <8FCE> <8C7D>
+<8FD1> <8FD1> <8BDF>
+<8FD4> <8FD4> <95D4>
+<8FDA> <8FDA> <E789>
+<8FE2> <8FE2> <E78B>
+<8FE5> <8FE5> <E78A>
+<8FE6> <8FE6> <89DE>
+<8FE9> <8FE9> <93F4>
+<8FEA> <8FEA> <E78C>
+<8FEB> <8FEB> <9497>
+<8FED> <8FED> <9352>
+<8FEF> <8FEF> <E78D>
+<8FF0> <8FF0> <8F71>
+<8FF4> <8FF4> <E78F>
+<8FF7> <8FF7> <96C0>
+<8FF8> <8FF8> <E79E>
+<8FF9> <8FFA> <E791>
+<8FFD> <8FFD> <92C7>
+<9000> <9000> <91DE>
+<9001> <9001> <9197>
+<9003> <9003> <93A6>
+<9005> <9005> <E790>
+<9006> <9006> <8B74>
+<900B> <900B> <E799>
+endbfrange
+
+100 beginbfrange
+<900D> <900D> <E796>
+<900E> <900E> <E7A3>
+<900F> <900F> <93A7>
+<9010> <9010> <9280>
+<9011> <9011> <E793>
+<9013> <9013> <92FC>
+<9014> <9014> <9372>
+<9015> <9015> <E794>
+<9016> <9016> <E798>
+<9017> <9017> <9080>
+<9019> <9019> <9487>
+<901A> <901A> <92CA>
+<901D> <901D> <90C0>
+<901E> <901E> <E797>
+<901F> <901F> <91AC>
+<9020> <9020> <91A2>
+<9021> <9021> <E795>
+<9022> <9022> <88A7>
+<9023> <9023> <9841>
+<9027> <9027> <E79A>
+<902E> <902E> <91DF>
+<9031> <9031> <8F54>
+<9032> <9032> <9069>
+<9035> <9035> <E79C>
+<9036> <9036> <E79B>
+<9038> <9038> <88ED>
+<9039> <9039> <E79D>
+<903C> <903C> <954E>
+<903E> <903E> <E7A5>
+<9041> <9041> <93D9>
+<9042> <9042> <908B>
+<9045> <9045> <9278>
+<9047> <9047> <8BF6>
+<9049> <9049> <E7A4>
+<904A> <904A> <9756>
+<904B> <904B> <895E>
+<904D> <904D> <95D5>
+<904E> <904E> <89DF>
+<904F> <9052> <E79F>
+<9053> <9053> <93B9>
+<9054> <9054> <9242>
+<9055> <9055> <88E1>
+<9056> <9056> <E7A6>
+<9058> <9058> <E7A7>
+<9059> <9059> <EAA1>
+<905C> <905C> <91BB>
+<905E> <905E> <E7A8>
+<9060> <9060> <8993>
+<9061> <9061> <916B>
+<9063> <9063> <8CAD>
+<9065> <9065> <9779>
+<9067> <9067> <FBB5>
+<9068> <9068> <E7A9>
+<9069> <9069> <934B>
+<906D> <906D> <9198>
+<906E> <906E> <8ED5>
+<906F> <906F> <E7AA>
+<9072> <9072> <E7AD>
+<9075> <9075> <8F85>
+<9076> <9076> <E7AB>
+<9077> <9077> <914A>
+<9078> <9078> <9149>
+<907A> <907A> <88E2>
+<907C> <907C> <97C9>
+<907D> <907D> <E7AF>
+<907F> <907F> <94F0>
+<9080> <9080> <E7B1>
+<9081> <9081> <E7B0>
+<9082> <9082> <E7AE>
+<9083> <9083> <E284>
+<9084> <9084> <8AD2>
+<9087> <9087> <E78E>
+<9089> <9089> <E7B3>
+<908A> <908A> <E7B2>
+<908F> <908F> <E7B4>
+<9091> <9091> <9757>
+<90A3> <90A3> <93DF>
+<90A6> <90A6> <964D>
+<90A8> <90A8> <E7B5>
+<90AA> <90AA> <8ED7>
+<90AF> <90AF> <E7B6>
+<90B1> <90B1> <E7B7>
+<90B5> <90B5> <E7B8>
+<90B8> <90B8> <9340>
+<90C1> <90C1> <88E8>
+<90CA> <90CA> <8D78>
+<90CE> <90CE> <9859>
+<90DB> <90DB> <E7BC>
+<90DE> <90DE> <FBB6>
+<90E1> <90E1> <8C53>
+<90E2> <90E2> <E7B9>
+<90E4> <90E4> <E7BA>
+<90E8> <90E8> <9594>
+<90ED> <90ED> <8A73>
+<90F5> <90F5> <9758>
+<90F7> <90F7> <8BBD>
+<90FD> <90FD> <9373>
+<9102> <9102> <E7BD>
+<9112> <9112> <E7BE>
+<9115> <9115> <FBB8>
+endbfrange
+
+100 beginbfrange
+<9119> <9119> <E7BF>
+<9127> <9127> <FBB9>
+<912D> <912D> <9341>
+<9130> <9130> <E7C1>
+<9132> <9132> <E7C0>
+<9149> <9149> <93D1>
+<914A> <914A> <E7C2>
+<914B> <914B> <8F55>
+<914C> <914C> <8EDE>
+<914D> <914D> <947A>
+<914E> <914E> <9291>
+<9152> <9152> <8EF0>
+<9154> <9154> <908C>
+<9156> <9156> <E7C3>
+<9158> <9158> <E7C4>
+<9162> <9162> <907C>
+<9163> <9163> <E7C5>
+<9165> <9165> <E7C6>
+<9169> <9169> <E7C7>
+<916A> <916A> <978F>
+<916C> <916C> <8F56>
+<9172> <9172> <E7C9>
+<9173> <9173> <E7C8>
+<9175> <9175> <8D79>
+<9177> <9177> <8D93>
+<9178> <9178> <8E5F>
+<9182> <9182> <E7CC>
+<9187> <9187> <8F86>
+<9189> <9189> <E7CB>
+<918B> <918B> <E7CA>
+<918D> <918D> <91E7>
+<9190> <9190> <8CED>
+<9192> <9192> <90C1>
+<9197> <9197> <94AE>
+<919C> <919C> <8F58>
+<91A2> <91A2> <E7CD>
+<91A4> <91A4> <8FDD>
+<91AA> <91AA> <E7D0>
+<91AB> <91AB> <E7CE>
+<91AC> <91AC> <8FDD>
+<91AF> <91AF> <E7CF>
+<91B1> <91B1> <94AE>
+<91B4> <91B4> <E7D2>
+<91B5> <91B5> <E7D1>
+<91B8> <91B8> <8FF8>
+<91BA> <91BA> <E7D3>
+<91C0> <91C1> <E7D4>
+<91C6> <91C6> <94CE>
+<91C7> <91C7> <8DD1>
+<91C8> <91C8> <8EDF>
+<91C9> <91C9> <E7D6>
+<91CB> <91CB> <E7D7>
+<91CC> <91CC> <97A2>
+<91CD> <91CD> <8F64>
+<91CE> <91CE> <96EC>
+<91CF> <91CF> <97CA>
+<91D0> <91D0> <E7D8>
+<91D1> <91D1> <8BE0>
+<91D6> <91D6> <E7D9>
+<91D7> <91D7> <FBBB>
+<91D8> <91D8> <9342>
+<91DA> <91DA> <FBBA>
+<91DB> <91DB> <E7DC>
+<91DC> <91DC> <8A98>
+<91DD> <91DD> <906A>
+<91DE> <91DE> <FBBC>
+<91DF> <91DF> <E7DA>
+<91E1> <91E1> <E7DB>
+<91E3> <91E3> <92DE>
+<91E4> <91E5> <FBBF>
+<91E6> <91E6> <9674>
+<91E7> <91E7> <8BFA>
+<91ED> <91EE> <FBBD>
+<91F5> <91F6> <E7DE>
+<91FC> <91FC> <E7DD>
+<91FF> <91FF> <E7E1>
+<9206> <9206> <FBC1>
+<920A> <920A> <FBC3>
+<920D> <920D> <93DD>
+<920E> <920E> <8A62>
+<9210> <9210> <FBC2>
+<9211> <9211> <E7E5>
+<9214> <9214> <E7E2>
+<9215> <9215> <E7E4>
+<921E> <921E> <E7E0>
+<9229> <9229> <E86E>
+<922C> <922C> <E7E3>
+<9234> <9234> <97E9>
+<9237> <9237> <8CD8>
+<9239> <9239> <FBCA>
+<923A> <923A> <FBC4>
+<923C> <923C> <FBC6>
+<923F> <923F> <E7ED>
+<9240> <9240> <FBC5>
+<9244> <9244> <9353>
+<9245> <9245> <E7E8>
+<9248> <9248> <E7EB>
+<9249> <9249> <E7E9>
+<924B> <924B> <E7EE>
+<924E> <924E> <FBC7>
+endbfrange
+
+100 beginbfrange
+<9250> <9250> <E7EF>
+<9251> <9251> <FBC9>
+<9257> <9257> <E7E7>
+<9259> <9259> <FBC8>
+<925A> <925A> <E7F4>
+<925B> <925B> <8994>
+<925E> <925E> <E7E6>
+<9262> <9262> <94AB>
+<9264> <9264> <E7EA>
+<9266> <9266> <8FDE>
+<9267> <9267> <FBCB>
+<9271> <9271> <8D7A>
+<9277> <9278> <FBCD>
+<927E> <927E> <9667>
+<9280> <9280> <8BE2>
+<9283> <9283> <8F65>
+<9285> <9285> <93BA>
+<9288> <9288> <FA5F>
+<9291> <9291> <914C>
+<9293> <9293> <E7F2>
+<9295> <9295> <E7EC>
+<9296> <9296> <E7F1>
+<9298> <9298> <96C1>
+<929A> <929A> <92B6>
+<929B> <929B> <E7F3>
+<929C> <929C> <E7F0>
+<92A7> <92A7> <FBCC>
+<92AD> <92AD> <914B>
+<92B7> <92B7> <E7F7>
+<92B9> <92B9> <E7F6>
+<92CF> <92CF> <E7F5>
+<92D0> <92D0> <FBD2>
+<92D2> <92D2> <964E>
+<92D3> <92D3> <FBD6>
+<92D5> <92D5> <FBD4>
+<92D7> <92D7> <FBD0>
+<92D9> <92D9> <FBD1>
+<92E0> <92E0> <FBD5>
+<92E4> <92E4> <8F9B>
+<92E7> <92E7> <FBCF>
+<92E9> <92E9> <E7F8>
+<92EA> <92EA> <95DD>
+<92ED> <92ED> <8973>
+<92F2> <92F2> <9565>
+<92F3> <92F3> <9292>
+<92F8> <92F8> <8B98>
+<92F9> <92F9> <FA65>
+<92FA> <92FA> <E7FA>
+<92FB> <92FB> <FBD9>
+<92FC> <92FC> <8D7C>
+<92FF> <92FF> <FBDC>
+<9302> <9302> <FBDE>
+<9306> <9306> <8E4B>
+<930F> <930F> <E7F9>
+<9310> <9310> <908D>
+<9318> <9318> <908E>
+<9319> <9319> <E840>
+<931A> <931A> <E842>
+<931D> <931D> <FBDD>
+<931E> <931E> <FBDB>
+<9320> <9320> <8FF9>
+<9321> <9321> <FBD8>
+<9322> <9322> <E841>
+<9323> <9323> <E843>
+<9325> <9325> <FBD7>
+<9326> <9326> <8BD1>
+<9328> <9328> <9564>
+<932B> <932B> <8EE0>
+<932C> <932C> <9842>
+<932E> <932E> <E7FC>
+<932F> <932F> <8DF6>
+<9332> <9332> <985E>
+<9335> <9335> <E845>
+<933A> <933A> <E844>
+<933B> <933B> <E846>
+<9344> <9344> <E7FB>
+<9348> <9348> <FA5E>
+<934B> <934B> <93E7>
+<934D> <934D> <9374>
+<9354> <9354> <92D5>
+<9356> <9356> <E84B>
+<9357> <9357> <FBE0>
+<935B> <935B> <9262>
+<935C> <935C> <E847>
+<9360> <9360> <E848>
+<936C> <936C> <8C4C>
+<936E> <936E> <E84A>
+<9370> <9370> <FBDF>
+<9375> <9375> <8CAE>
+<937C> <937C> <E849>
+<937E> <937E> <8FDF>
+<938C> <938C> <8A99>
+<9394> <9394> <E84F>
+<9396> <9396> <8DBD>
+<9397> <9397> <9199>
+<939A> <939A> <92C8>
+<93A4> <93A4> <FBE1>
+<93A7> <93A7> <8A5A>
+<93AC> <93AD> <E84D>
+<93AE> <93AE> <92C1>
+endbfrange
+
+100 beginbfrange
+<93B0> <93B0> <E84C>
+<93B9> <93B9> <E850>
+<93C3> <93C3> <E856>
+<93C6> <93C6> <FBE2>
+<93C8> <93C8> <E859>
+<93D0> <93D0> <E858>
+<93D1> <93D1> <934C>
+<93D6> <93D7> <E851>
+<93D8> <93D8> <E855>
+<93DD> <93DD> <E857>
+<93DE> <93DE> <FBE3>
+<93E1> <93E1> <8BBE>
+<93E4> <93E4> <E85A>
+<93E5> <93E5> <E854>
+<93E8> <93E8> <E853>
+<93F8> <93F8> <FBE4>
+<9403> <9403> <E85E>
+<9407> <9407> <E85F>
+<9410> <9410> <E860>
+<9413> <9413> <E85D>
+<9414> <9414> <E85C>
+<9418> <9418> <8FE0>
+<9419> <9419> <93A8>
+<941A> <941A> <E85B>
+<9421> <9421> <E864>
+<942B> <942B> <E862>
+<9431> <9431> <FBE5>
+<9435> <9435> <E863>
+<9436> <9436> <E861>
+<9438> <9438> <91F6>
+<943A> <943A> <E865>
+<9441> <9441> <E866>
+<9444> <9444> <E868>
+<9445> <9445> <FBE6>
+<9448> <9448> <FBE7>
+<9451> <9451> <8AD3>
+<9452> <9452> <E867>
+<9453> <9453> <96F8>
+<945A> <945A> <E873>
+<945B> <945B> <E869>
+<945E> <945E> <E86C>
+<9460> <9460> <E86A>
+<9462> <9462> <E86B>
+<946A> <946A> <E86D>
+<9470> <9470> <E86F>
+<9475> <9475> <E870>
+<9477> <9477> <E871>
+<947C> <947C> <E874>
+<947D> <947D> <E872>
+<947E> <947E> <E875>
+<947F> <947F> <E877>
+<9481> <9481> <E876>
+<9577> <9577> <92B7>
+<9580> <9580> <96E5>
+<9582> <9582> <E878>
+<9583> <9583> <914D>
+<9587> <9587> <E879>
+<9589> <9589> <95C2>
+<958A> <958A> <E87A>
+<958B> <958B> <8A4A>
+<958F> <958F> <895B>
+<9591> <9591> <8AD5>
+<9592> <9592> <FBE8>
+<9593> <9593> <8AD4>
+<9594> <9594> <E87B>
+<9596> <9596> <E87C>
+<9598> <9599> <E87D>
+<95A0> <95A0> <E880>
+<95A2> <95A2> <8AD6>
+<95A3> <95A3> <8A74>
+<95A4> <95A4> <8D7D>
+<95A5> <95A5> <94B4>
+<95A7> <95A7> <E882>
+<95A8> <95A8> <E881>
+<95AD> <95AD> <E883>
+<95B2> <95B2> <897B>
+<95B9> <95B9> <E886>
+<95BB> <95BB> <E885>
+<95BC> <95BC> <E884>
+<95BE> <95BE> <E887>
+<95C3> <95C3> <E88A>
+<95C7> <95C7> <88C5>
+<95CA> <95CA> <E888>
+<95CC> <95CC> <E88C>
+<95CD> <95CD> <E88B>
+<95D4> <95D4> <E88E>
+<95D5> <95D5> <E88D>
+<95D6> <95D6> <E88F>
+<95D8> <95D8> <93AC>
+<95DC> <95DC> <E890>
+<95E1> <95E1> <E891>
+<95E2> <95E2> <E893>
+<95E5> <95E5> <E892>
+<961C> <961C> <958C>
+<9621> <9621> <E894>
+<9628> <9628> <E895>
+<962A> <962A> <8DE3>
+<962E> <962F> <E896>
+<9632> <9632> <9668>
+<963B> <963B> <916A>
+endbfrange
+
+100 beginbfrange
+<963F> <963F> <88A2>
+<9640> <9640> <91C9>
+<9642> <9642> <E898>
+<9644> <9644> <958D>
+<964B> <964B> <E89B>
+<964C> <964C> <E899>
+<964D> <964D> <8D7E>
+<964F> <964F> <E89A>
+<9650> <9650> <8CC0>
+<965B> <965B> <95C3>
+<965C> <965C> <E89D>
+<965D> <965D> <E89F>
+<965E> <965E> <E89E>
+<965F> <965F> <E8A0>
+<9662> <9662> <8940>
+<9663> <9663> <9077>
+<9664> <9664> <8F9C>
+<9665> <9665> <8AD7>
+<9666> <9666> <E8A1>
+<966A> <966A> <9486>
+<966C> <966C> <E8A3>
+<9670> <9670> <8941>
+<9672> <9672> <E8A2>
+<9673> <9673> <92C2>
+<9675> <9675> <97CB>
+<9676> <9676> <93A9>
+<9677> <9677> <E89C>
+<9678> <9678> <97A4>
+<967A> <967A> <8CAF>
+<967D> <967D> <977A>
+<9685> <9685> <8BF7>
+<9686> <9686> <97B2>
+<9688> <9688> <8C47>
+<968A> <968A> <91E0>
+<968B> <968B> <E440>
+<968D> <968D> <E8A4>
+<968E> <968E> <8A4B>
+<968F> <968F> <908F>
+<9694> <9694> <8A75>
+<9695> <9695> <E8A6>
+<9697> <9697> <E8A7>
+<9698> <9698> <E8A5>
+<9699> <9699> <8C84>
+<969B> <969B> <8DDB>
+<969C> <969C> <8FE1>
+<969D> <969D> <FBEB>
+<96A0> <96A0> <8942>
+<96A3> <96A3> <97D7>
+<96A7> <96A7> <E8A9>
+<96A8> <96A8> <E7AC>
+<96AA> <96AA> <E8A8>
+<96AF> <96AF> <FBEC>
+<96B0> <96B0> <E8AC>
+<96B1> <96B2> <E8AA>
+<96B4> <96B4> <E8AD>
+<96B6> <96B6> <E8AE>
+<96B7> <96B7> <97EA>
+<96B8> <96B9> <E8AF>
+<96BB> <96BB> <90C7>
+<96BC> <96BC> <94B9>
+<96C0> <96C0> <909D>
+<96C1> <96C1> <8AE5>
+<96C4> <96C4> <9759>
+<96C5> <96C5> <89EB>
+<96C6> <96C6> <8F57>
+<96C7> <96C7> <8CD9>
+<96C9> <96C9> <E8B3>
+<96CB> <96CB> <E8B2>
+<96CC> <96CC> <8E93>
+<96CD> <96CD> <E8B4>
+<96CE> <96CE> <E8B1>
+<96D1> <96D1> <8E47>
+<96D5> <96D5> <E8B8>
+<96D6> <96D6> <E5AB>
+<96D9> <96D9> <99D4>
+<96DB> <96DB> <9097>
+<96DC> <96DC> <E8B6>
+<96E2> <96E2> <97A3>
+<96E3> <96E3> <93EF>
+<96E8> <96E8> <894A>
+<96EA> <96EA> <90E1>
+<96EB> <96EB> <8EB4>
+<96F0> <96F0> <95B5>
+<96F2> <96F2> <895F>
+<96F6> <96F6> <97EB>
+<96F7> <96F7> <978B>
+<96F9> <96F9> <E8B9>
+<96FB> <96FB> <9364>
+<9700> <9700> <8EF9>
+<9704> <9704> <E8BA>
+<9706> <9706> <E8BB>
+<9707> <9707> <906B>
+<9708> <9708> <E8BC>
+<970A> <970A> <97EC>
+<970D> <970D> <E8B7>
+<970E> <970E> <E8BE>
+<970F> <970F> <E8C0>
+<9711> <9711> <E8BF>
+<9713> <9713> <E8BD>
+<9716> <9716> <E8C1>
+endbfrange
+
+100 beginbfrange
+<9719> <9719> <E8C2>
+<971C> <971C> <919A>
+<971E> <971E> <89E0>
+<9724> <9724> <E8C3>
+<9727> <9727> <96B6>
+<972A> <972A> <E8C4>
+<9730> <9730> <E8C5>
+<9732> <9732> <9849>
+<9733> <9733> <FBED>
+<9738> <9738> <9E50>
+<9739> <9739> <E8C6>
+<973B> <973B> <FBEE>
+<973D> <973E> <E8C7>
+<9742> <9742> <E8CC>
+<9743> <9743> <FBEF>
+<9744> <9744> <E8C9>
+<9746> <9746> <E8CA>
+<9748> <9748> <E8CB>
+<9749> <9749> <E8CD>
+<974D> <974D> <FBF0>
+<974F> <974F> <FBF1>
+<9751> <9751> <FBF2>
+<9752> <9752> <90C2>
+<9755> <9755> <FBF3>
+<9756> <9756> <96F5>
+<9759> <9759> <90C3>
+<975C> <975C> <E8CE>
+<975E> <975E> <94F1>
+<9760> <9760> <E8CF>
+<9761> <9761> <EA72>
+<9762> <9762> <96CA>
+<9764> <9764> <E8D0>
+<9766> <9766> <E8D1>
+<9768> <9768> <E8D2>
+<9769> <9769> <8A76>
+<976B> <976B> <E8D4>
+<976D> <976D> <9078>
+<9771> <9771> <E8D5>
+<9774> <9774> <8C43>
+<9779> <9779> <E8D6>
+<977A> <977A> <E8DA>
+<977C> <977C> <E8D8>
+<9781> <9781> <E8D9>
+<9784> <9784> <8A93>
+<9785> <9785> <E8D7>
+<9786> <9786> <E8DB>
+<978B> <978B> <E8DC>
+<978D> <978D> <88C6>
+<978F> <9790> <E8DD>
+<9798> <9798> <8FE2>
+<979C> <979C> <E8DF>
+<97A0> <97A0> <8B66>
+<97A3> <97A3> <E8E2>
+<97A6> <97A6> <E8E1>
+<97A8> <97A8> <E8E0>
+<97AB> <97AB> <E691>
+<97AD> <97AD> <95DA>
+<97B3> <97B4> <E8E3>
+<97C3> <97C3> <E8E5>
+<97C6> <97C6> <E8E6>
+<97C8> <97C8> <E8E7>
+<97CB> <97CB> <E8E8>
+<97D3> <97D3> <8AD8>
+<97DC> <97DC> <E8E9>
+<97ED> <97ED> <E8EA>
+<97EE> <97EE> <9442>
+<97F2> <97F2> <E8EC>
+<97F3> <97F3> <89B9>
+<97F5> <97F5> <E8EF>
+<97F6> <97F6> <E8EE>
+<97FB> <97FB> <8943>
+<97FF> <97FF> <8BBF>
+<9801> <9801> <95C5>
+<9802> <9802> <92B8>
+<9803> <9803> <8DA0>
+<9805> <9805> <8D80>
+<9806> <9806> <8F87>
+<9808> <9808> <907B>
+<980C> <980C> <E8F1>
+<980F> <980F> <E8F0>
+<9810> <9810> <9761>
+<9811> <9811> <8AE6>
+<9812> <9812> <94D0>
+<9813> <9813> <93DA>
+<9817> <9817> <909C>
+<9818> <9818> <97CC>
+<981A> <981A> <8C7A>
+<9821> <9821> <E8F4>
+<9824> <9824> <E8F3>
+<982C> <982C> <966A>
+<982D> <982D> <93AA>
+<9830> <9830> <966A>
+<9834> <9834> <896F>
+<9837> <9837> <E8F5>
+<9838> <9838> <E8F2>
+<983B> <983B> <9570>
+<983C> <983C> <978A>
+<983D> <983D> <E8F6>
+<9846> <9846> <E8F7>
+<984B> <984B> <E8F9>
+endbfrange
+
+100 beginbfrange
+<984C> <984C> <91E8>
+<984D> <984E> <8A7A>
+<984F> <984F> <E8F8>
+<9854> <9854> <8AE7>
+<9855> <9855> <8CB0>
+<9857> <9857> <FBF4>
+<9858> <9858> <8AE8>
+<985A> <985A> <935E>
+<985B> <985B> <935E>
+<985E> <985E> <97DE>
+<9865> <9865> <FBF5>
+<9867> <9867> <8CDA>
+<986B> <986B> <E8FA>
+<986F> <9870> <E8FB>
+<9871> <9871> <E940>
+<9873> <9873> <E942>
+<9874> <9874> <E941>
+<98A8> <98A8> <9597>
+<98AA> <98AA> <E943>
+<98AF> <98AF> <E944>
+<98B1> <98B1> <E945>
+<98B6> <98B6> <E946>
+<98C3> <98C3> <E948>
+<98C4> <98C4> <E947>
+<98C6> <98C6> <E949>
+<98DB> <98DB> <94F2>
+<98DC> <98DC> <E3CA>
+<98DF> <98DF> <9048>
+<98E2> <98E2> <8B51>
+<98E9> <98E9> <E94A>
+<98EB> <98EB> <E94B>
+<98ED> <98ED> <99AA>
+<98EE> <98EE> <9F5A>
+<98EF> <98EF> <94D1>
+<98F2> <98F2> <88F9>
+<98F4> <98F4> <88B9>
+<98FC> <98FC> <8E94>
+<98FD> <98FD> <964F>
+<98FE> <98FE> <8FFC>
+<9903> <9903> <E94C>
+<9905> <9905> <96DD>
+<9909> <9909> <E94D>
+<990A> <990A> <977B>
+<990C> <990C> <8961>
+<9910> <9910> <8E60>
+<9912> <9912> <E94E>
+<9913> <9913> <89EC>
+<9914> <9914> <E94F>
+<9918> <9918> <E950>
+<991D> <991E> <E952>
+<9920> <9920> <E955>
+<9921> <9921> <E951>
+<9924> <9924> <E954>
+<9927> <9927> <FBF8>
+<9928> <9928> <8AD9>
+<992C> <992C> <E956>
+<992E> <992E> <E957>
+<993D> <993E> <E958>
+<9942> <9942> <E95A>
+<9945> <9945> <E95C>
+<9949> <9949> <E95B>
+<994B> <994B> <E95E>
+<994C> <994C> <E961>
+<9950> <9950> <E95D>
+<9951> <9952> <E95F>
+<9955> <9955> <E962>
+<9957> <9957> <8BC0>
+<9996> <9996> <8EF1>
+<9997> <9998> <E963>
+<9999> <9999> <8D81>
+<999E> <999E> <FBFA>
+<99A5> <99A5> <E965>
+<99A8> <99A8> <8A5D>
+<99AC> <99AC> <946E>
+<99AD> <99AE> <E966>
+<99B3> <99B3> <9279>
+<99B4> <99B4> <93E9>
+<99BC> <99BC> <E968>
+<99C1> <99C1> <949D>
+<99C4> <99C4> <91CA>
+<99C5> <99C5> <8977>
+<99C6> <99C6> <8BEC>
+<99C8> <99C8> <8BED>
+<99D0> <99D0> <9293>
+<99D1> <99D1> <E96D>
+<99D2> <99D2> <8BEE>
+<99D5> <99D5> <89ED>
+<99D8> <99D8> <E96C>
+<99DB> <99DB> <E96A>
+<99DD> <99DD> <E96B>
+<99DF> <99DF> <E969>
+<99E2> <99E2> <E977>
+<99ED> <99EE> <E96E>
+<99F1> <99F2> <E970>
+<99F8> <99F8> <E973>
+<99FB> <99FB> <E972>
+<99FF> <99FF> <8F78>
+<9A01> <9A01> <E974>
+<9A05> <9A05> <E976>
+<9A0E> <9A0E> <8B52>
+endbfrange
+
+100 beginbfrange
+<9A0F> <9A0F> <E975>
+<9A12> <9A12> <919B>
+<9A13> <9A13> <8CB1>
+<9A19> <9A19> <E978>
+<9A28> <9A28> <91CB>
+<9A2B> <9A2B> <E979>
+<9A30> <9A30> <93AB>
+<9A37> <9A37> <E97A>
+<9A3E> <9A3E> <E980>
+<9A40> <9A40> <E97D>
+<9A42> <9A42> <E97C>
+<9A43> <9A43> <E97E>
+<9A45> <9A45> <E97B>
+<9A4D> <9A4D> <E982>
+<9A4E> <9A4E> <FBFB>
+<9A52> <9A52> <91CB>
+<9A55> <9A55> <E981>
+<9A57> <9A57> <E984>
+<9A5A> <9A5A> <8BC1>
+<9A5B> <9A5B> <E983>
+<9A5F> <9A5F> <E985>
+<9A62> <9A62> <E986>
+<9A64> <9A64> <E988>
+<9A65> <9A65> <E987>
+<9A69> <9A69> <E989>
+<9A6A> <9A6A> <E98B>
+<9A6B> <9A6B> <E98A>
+<9AA8> <9AA8> <8D9C>
+<9AAD> <9AAD> <E98C>
+<9AB0> <9AB0> <E98D>
+<9AB8> <9AB8> <8A5B>
+<9ABC> <9ABC> <E98E>
+<9AC0> <9AC0> <E98F>
+<9AC4> <9AC4> <9091>
+<9ACF> <9ACF> <E990>
+<9AD1> <9AD1> <E991>
+<9AD3> <9AD4> <E992>
+<9AD8> <9AD8> <8D82>
+<9AD9> <9AD9> <FBFC>
+<9ADC> <9ADC> <FC40>
+<9ADE> <9ADF> <E994>
+<9AE2> <9AE3> <E996>
+<9AE6> <9AE6> <E998>
+<9AEA> <9AEA> <94AF>
+<9AEB> <9AEB> <E99A>
+<9AED> <9AED> <9545>
+<9AEE> <9AEE> <E99B>
+<9AEF> <9AEF> <E999>
+<9AF1> <9AF1> <E99D>
+<9AF4> <9AF4> <E99C>
+<9AF7> <9AF7> <E99E>
+<9AFB> <9AFB> <E99F>
+<9B06> <9B06> <E9A0>
+<9B18> <9B18> <E9A1>
+<9B1A> <9B1A> <E9A2>
+<9B1F> <9B1F> <E9A3>
+<9B22> <9B23> <E9A4>
+<9B25> <9B25> <E9A6>
+<9B27> <9B2A> <E9A7>
+<9B2E> <9B2F> <E9AB>
+<9B31> <9B31> <9F54>
+<9B32> <9B32> <E9AD>
+<9B3B> <9B3B> <E2F6>
+<9B3C> <9B3C> <8B53>
+<9B41> <9B41> <8A40>
+<9B42> <9B42> <8DB0>
+<9B43> <9B43> <E9AF>
+<9B44> <9B44> <E9AE>
+<9B45> <9B45> <96A3>
+<9B4D> <9B4E> <E9B1>
+<9B4F> <9B4F> <E9B0>
+<9B51> <9B51> <E9B3>
+<9B54> <9B54> <9682>
+<9B58> <9B58> <E9B4>
+<9B5A> <9B5A> <8B9B>
+<9B6F> <9B6F> <9844>
+<9B72> <9B72> <FC42>
+<9B74> <9B74> <E9B5>
+<9B75> <9B75> <FC41>
+<9B83> <9B83> <E9B7>
+<9B8E> <9B8E> <88BC>
+<9B8F> <9B8F> <FC43>
+<9B91> <9B91> <E9B8>
+<9B92> <9B92> <95A9>
+<9B93> <9B93> <E9B6>
+<9B96> <9B97> <E9B9>
+<9B9F> <9BA0> <E9BB>
+<9BA8> <9BA8> <E9BD>
+<9BAA> <9BAA> <968E>
+<9BAB> <9BAB> <8E4C>
+<9BAD> <9BAD> <8DF8>
+<9BAE> <9BAE> <914E>
+<9BB1> <9BB1> <FC44>
+<9BB4> <9BB4> <E9BE>
+<9BB9> <9BB9> <E9C1>
+<9BBB> <9BBB> <FC45>
+<9BC0> <9BC0> <E9BF>
+<9BC6> <9BC6> <E9C2>
+<9BC9> <9BC9> <8CEF>
+<9BCA> <9BCA> <E9C0>
+endbfrange
+
+100 beginbfrange
+<9BCF> <9BCF> <E9C3>
+<9BD1> <9BD2> <E9C4>
+<9BD4> <9BD4> <E9C9>
+<9BD6> <9BD6> <8E49>
+<9BDB> <9BDB> <91E2>
+<9BE1> <9BE1> <E9CA>
+<9BE2> <9BE2> <E9C7>
+<9BE3> <9BE3> <E9C6>
+<9BE4> <9BE4> <E9C8>
+<9BE8> <9BE8> <8C7E>
+<9BF0> <9BF0> <E9CE>
+<9BF1> <9BF1> <E9CD>
+<9BF2> <9BF2> <E9CC>
+<9BF5> <9BF5> <88B1>
+<9C00> <9C00> <FC46>
+<9C04> <9C04> <E9D8>
+<9C06> <9C06> <E9D4>
+<9C08> <9C08> <E9D5>
+<9C09> <9C09> <E9D1>
+<9C0A> <9C0A> <E9D7>
+<9C0C> <9C0C> <E9D3>
+<9C0D> <9C0D> <8A82>
+<9C10> <9C10> <986B>
+<9C12> <9C12> <E9D6>
+<9C13> <9C13> <E9D2>
+<9C14> <9C14> <E9D0>
+<9C15> <9C15> <E9CF>
+<9C1B> <9C1B> <E9DA>
+<9C21> <9C21> <E9DD>
+<9C24> <9C24> <E9DC>
+<9C25> <9C25> <E9DB>
+<9C2D> <9C2D> <9568>
+<9C2E> <9C2E> <E9D9>
+<9C2F> <9C2F> <88F1>
+<9C30> <9C30> <E9DE>
+<9C32> <9C32> <E9E0>
+<9C39> <9C39> <8A8F>
+<9C3A> <9C3A> <E9CB>
+<9C3B> <9C3B> <8956>
+<9C3E> <9C3E> <E9E2>
+<9C46> <9C46> <E9E1>
+<9C47> <9C47> <E9DF>
+<9C48> <9C48> <924C>
+<9C52> <9C52> <9690>
+<9C57> <9C57> <97D8>
+<9C5A> <9C5A> <E9E3>
+<9C60> <9C60> <E9E4>
+<9C67> <9C67> <E9E5>
+<9C76> <9C76> <E9E6>
+<9C78> <9C78> <E9E7>
+<9CE5> <9CE5> <92B9>
+<9CE7> <9CE7> <E9E8>
+<9CE9> <9CE9> <94B5>
+<9CEB> <9CEB> <E9ED>
+<9CEC> <9CEC> <E9E9>
+<9CF0> <9CF0> <E9EA>
+<9CF3> <9CF3> <9650>
+<9CF4> <9CF4> <96C2>
+<9CF6> <9CF6> <93CE>
+<9D03> <9D03> <E9EE>
+<9D06> <9D06> <E9EF>
+<9D07> <9D07> <93BC>
+<9D08> <9D08> <E9EC>
+<9D09> <9D09> <E9EB>
+<9D0E> <9D0E> <89A8>
+<9D12> <9D12> <E9F7>
+<9D15> <9D15> <E9F6>
+<9D1B> <9D1B> <8995>
+<9D1F> <9D1F> <E9F4>
+<9D23> <9D23> <E9F3>
+<9D26> <9D26> <E9F1>
+<9D28> <9D28> <8A9B>
+<9D2A> <9D2A> <E9F0>
+<9D2B> <9D2B> <8EB0>
+<9D2C> <9D2C> <89A7>
+<9D3B> <9D3B> <8D83>
+<9D3E> <9D3E> <E9FA>
+<9D3F> <9D3F> <E9F9>
+<9D41> <9D41> <E9F8>
+<9D44> <9D44> <E9F5>
+<9D46> <9D46> <E9FB>
+<9D48> <9D48> <E9FC>
+<9D50> <9D50> <EA44>
+<9D51> <9D51> <EA43>
+<9D59> <9D59> <EA45>
+<9D5C> <9D5C> <894C>
+<9D5D> <9D5E> <EA40>
+<9D60> <9D60> <8D94>
+<9D61> <9D61> <96B7>
+<9D64> <9D64> <EA42>
+<9D6B> <9D6B> <FC48>
+<9D6C> <9D6C> <9651>
+<9D6F> <9D6F> <EA4A>
+<9D70> <9D70> <FC47>
+<9D72> <9D72> <EA46>
+<9D7A> <9D7A> <EA4B>
+<9D87> <9D87> <EA48>
+<9D89> <9D89> <EA47>
+<9D8F> <9D8F> <8C7B>
+<9D9A> <9D9A> <EA4C>
+endbfrange
+
+100 beginbfrange
+<9DA4> <9DA4> <EA4D>
+<9DA9> <9DA9> <EA4E>
+<9DAB> <9DAB> <EA49>
+<9DAF> <9DAF> <E9F2>
+<9DB2> <9DB2> <EA4F>
+<9DB4> <9DB4> <92DF>
+<9DB8> <9DB8> <EA53>
+<9DBA> <9DBA> <EA54>
+<9DBB> <9DBB> <EA52>
+<9DC1> <9DC1> <EA51>
+<9DC2> <9DC2> <EA57>
+<9DC4> <9DC4> <EA50>
+<9DC6> <9DC6> <EA55>
+<9DCF> <9DCF> <EA56>
+<9DD3> <9DD3> <EA59>
+<9DD7> <9DD7> <89A8>
+<9DD9> <9DD9> <EA58>
+<9DE6> <9DE6> <EA5B>
+<9DED> <9DED> <EA5C>
+<9DEF> <9DEF> <EA5D>
+<9DF2> <9DF2> <9868>
+<9DF8> <9DF8> <EA5A>
+<9DF9> <9DF9> <91E9>
+<9DFA> <9DFA> <8DEB>
+<9DFD> <9DFD> <EA5E>
+<9E19> <9E19> <FC4A>
+<9E1A> <9E1B> <EA5F>
+<9E1E> <9E1E> <EA61>
+<9E75> <9E75> <EA62>
+<9E78> <9E78> <8CB2>
+<9E79> <9E79> <EA63>
+<9E7C> <9E7C> <8CB2>
+<9E7D> <9E7D> <EA64>
+<9E7F> <9E7F> <8EAD>
+<9E81> <9E81> <EA65>
+<9E88> <9E88> <EA66>
+<9E8B> <9E8C> <EA67>
+<9E91> <9E91> <EA6B>
+<9E92> <9E92> <EA69>
+<9E93> <9E93> <985B>
+<9E95> <9E95> <EA6A>
+<9E97> <9E97> <97ED>
+<9E9D> <9E9D> <EA6C>
+<9E9F> <9E9F> <97D9>
+<9EA5> <9EA5> <EA6D>
+<9EA6> <9EA6> <949E>
+<9EA9> <9EA9> <EA6E>
+<9EAA> <9EAA> <EA70>
+<9EAD> <9EAD> <EA71>
+<9EB4> <9EB4> <8D8D>
+<9EB5> <9EB5> <96CB>
+<9EB8> <9EB8> <EA6F>
+<9EB9> <9EB9> <8D8D>
+<9EBA> <9EBA> <96CB>
+<9EBB> <9EBB> <9683>
+<9EBC> <9EBC> <9BF5>
+<9EBE> <9EBE> <9F80>
+<9EBF> <9EBF> <969B>
+<9EC4> <9EC4> <89A9>
+<9ECC> <9ECC> <EA73>
+<9ECD> <9ECD> <8B6F>
+<9ECE> <9ED0> <EA74>
+<9ED1> <9ED1> <FC4B>
+<9ED2> <9ED2> <8D95>
+<9ED4> <9ED4> <EA77>
+<9ED8> <9ED8> <E0D2>
+<9ED9> <9ED9> <96D9>
+<9EDB> <9EDB> <91E1>
+<9EDC> <9EDC> <EA78>
+<9EDD> <9EDD> <EA7A>
+<9EDE> <9EDE> <EA79>
+<9EE0> <9EE0> <EA7B>
+<9EE5> <9EE5> <EA7C>
+<9EE8> <9EE8> <EA7D>
+<9EEF> <9EEF> <EA7E>
+<9EF4> <9EF4> <EA80>
+<9EF6> <9EF7> <EA81>
+<9EF9> <9EF9> <EA83>
+<9EFB> <9EFD> <EA84>
+<9F07> <9F08> <EA87>
+<9F0E> <9F0E> <9343>
+<9F13> <9F13> <8CDB>
+<9F15> <9F15> <EA8A>
+<9F20> <9F20> <916C>
+<9F21> <9F21> <EA8B>
+<9F2C> <9F2C> <EA8C>
+<9F3B> <9F3B> <9540>
+<9F3E> <9F3E> <EA8D>
+<9F4A> <9F4A> <EA8E>
+<9F4B> <9F4B> <E256>
+<9F4E> <9F4E> <E6D8>
+<9F4F> <9F4F> <E8EB>
+<9F52> <9F52> <EA8F>
+<9F54> <9F54> <EA90>
+<9F5F> <9F61> <EA92>
+<9F62> <9F62> <97EE>
+<9F63> <9F63> <EA91>
+<9F66> <9F67> <EA95>
+<9F6A> <9F6A> <EA98>
+<9F6C> <9F6C> <EA97>
+endbfrange
+
+100 beginbfrange
+<9F72> <9F72> <EA9A>
+<9F76> <9F76> <EA9B>
+<9F77> <9F77> <EA99>
+<9F8D> <9F8D> <97B4>
+<9F95> <9F95> <EA9C>
+<9F9C> <9F9C> <EA9D>
+<9F9D> <9F9D> <E273>
+<9FA0> <9FA0> <EA9E>
+<E000> <E03E> <F040>
+<E03F> <E0BB> <F080>
+<E0BC> <E0FA> <F140>
+<E0FB> <E0FF> <F180>
+<E100> <E177> <F185>
+<E178> <E1B6> <F240>
+<E1B7> <E1FF> <F280>
+<E200> <E233> <F2C9>
+<E234> <E272> <F340>
+<E273> <E2EF> <F380>
+<E2F0> <E2FF> <F440>
+<E300> <E32E> <F450>
+<E32F> <E3AB> <F480>
+<E3AC> <E3EA> <F540>
+<E3EB> <E3FF> <F580>
+<E400> <E467> <F595>
+<E468> <E4A6> <F640>
+<E4A7> <E4FF> <F680>
+<E500> <E523> <F6D9>
+<E524> <E562> <F740>
+<E563> <E5DF> <F780>
+<E5E0> <E5FF> <F840>
+<E600> <E61E> <F860>
+<E61F> <E69B> <F880>
+<E69C> <E6DA> <F940>
+<E6DB> <E6FF> <F980>
+<E700> <E757> <F9A5>
+<F8F0> <F8F0> <A0>
+<F8F1> <F8F3> <FD>
+<F929> <F929> <FAE0>
+<F9DC> <F9DC> <FBE9>
+<FA0E> <FA0E> <FA90>
+<FA0F> <FA10> <FA9B>
+<FA11> <FA11> <FAB1>
+<FA12> <FA12> <FAD8>
+<FA13> <FA13> <FAE8>
+<FA14> <FA14> <FAEA>
+<FA15> <FA15> <FB58>
+<FA16> <FA16> <FB5E>
+<FA17> <FA17> <FB75>
+<FA18> <FA19> <FB7D>
+<FA1A> <FA1A> <FB80>
+<FA1B> <FA1B> <FB82>
+<FA1C> <FA1C> <FB86>
+<FA1D> <FA1D> <FB89>
+<FA1E> <FA1E> <FB92>
+<FA1F> <FA1F> <FB9D>
+<FA20> <FA21> <FB9F>
+<FA22> <FA22> <FBA9>
+<FA23> <FA23> <FBB1>
+<FA24> <FA25> <FBB3>
+<FA26> <FA26> <FBB7>
+<FA27> <FA27> <FBD3>
+<FA28> <FA28> <FBDA>
+<FA29> <FA29> <FBEA>
+<FA2A> <FA2B> <FBF6>
+<FA2C> <FA2C> <FBF9>
+<FA2D> <FA2D> <FC49>
+<FE50> <FE50> <8143>
+<FE51> <FE51> <8141>
+<FE52> <FE52> <8144>
+<FE54> <FE54> <8147>
+<FE55> <FE55> <8146>
+<FE56> <FE57> <8148>
+<FE59> <FE5A> <8169>
+<FE5B> <FE5C> <816F>
+<FE5D> <FE5E> <816B>
+<FF01> <FF01> <8149>
+<FF02> <FF02> <FA57>
+<FF03> <FF03> <8194>
+<FF04> <FF04> <8190>
+<FF05> <FF05> <8193>
+<FF06> <FF06> <8195>
+<FF07> <FF07> <FA56>
+<FF08> <FF09> <8169>
+<FF0A> <FF0A> <8196>
+<FF0B> <FF0B> <817B>
+<FF0C> <FF0C> <8143>
+<FF0D> <FF0D> <817C>
+<FF0E> <FF0E> <8144>
+<FF0F> <FF0F> <815E>
+<FF10> <FF19> <824F>
+<FF1A> <FF1B> <8146>
+<FF1C> <FF1C> <8183>
+<FF1D> <FF1D> <8181>
+<FF1E> <FF1E> <8184>
+<FF1F> <FF1F> <8148>
+<FF20> <FF20> <8197>
+<FF21> <FF3A> <8260>
+<FF3B> <FF3B> <816D>
+<FF3C> <FF3C> <815F>
+<FF3D> <FF3D> <816E>
+endbfrange
+
+14 beginbfrange
+<FF3E> <FF3E> <814F>
+<FF3F> <FF3F> <8151>
+<FF40> <FF40> <814D>
+<FF41> <FF5A> <8281>
+<FF5B> <FF5B> <816F>
+<FF5C> <FF5C> <8162>
+<FF5D> <FF5D> <8170>
+<FF5E> <FF5E> <8160>
+<FF61> <FF9F> <A1>
+<FFE0> <FFE1> <8191>
+<FFE2> <FFE2> <81CA>
+<FFE3> <FFE3> <8150>
+<FFE4> <FFE4> <FA55>
+<FFE5> <FFE5> <818F>
+endbfrange
+
+endcmap
+CMapName currentdict /CMap defineresource pop
+end
+end
+
+%%EndResource
+%%EOF
diff --git a/src/main/resources/Resources/cmap/UCS2-90pv-RKSJ b/src/main/resources/Resources/cmap/UCS2-90pv-RKSJ
new file mode 100644
index 0000000..de82e14
--- /dev/null
+++ b/src/main/resources/Resources/cmap/UCS2-90pv-RKSJ
@@ -0,0 +1,6845 @@
+%!PS-Adobe-3.0 Resource-CMap
+%%DocumentNeededResources: ProcSet (CIDInit)
+%%IncludeResource: ProcSet (CIDInit)
+%%BeginResource: CMap (UCS2-90pv-RKSJ)
+%%Title: (UCS2-90pv-RKSJ)
+%%Version: 4.002
+%%Copyright: -----------------------------------------------------------
+%%Copyright: Copyright 1990-1999 Adobe Systems Incorporated.
+%%Copyright: All Rights Reserved.
+%%Copyright:
+%%Copyright: Patents Pending
+%%Copyright:
+%%Copyright: NOTICE: All information contained herein is the property
+%%Copyright: of Adobe Systems Incorporated.
+%%Copyright:
+%%Copyright: Permission is granted for redistribution of this file
+%%Copyright: provided this copyright notice is maintained intact and
+%%Copyright: that the contents of this file are not altered in any
+%%Copyright: way from its original form.
+%%Copyright:
+%%Copyright: PostScript and Display PostScript are trademarks of
+%%Copyright: Adobe Systems Incorporated which may be registered in
+%%Copyright: certain jurisdictions.
+%%Copyright: -----------------------------------------------------------
+%%EndComments
+
+/CIDInit /ProcSet findresource begin
+
+12 dict begin
+
+begincmap
+
+/CIDSystemInfo 3 dict dup begin
+ /Registry (Adobe) def
+ /Ordering (UCS2_90pv_RKSJ) def
+ /Supplement 2 def
+end def
+
+/CMapName /UCS2-90pv-RKSJ def
+/CMapVersion 4.002 def
+/CMapType 1 def
+/WMode 0 def
+
+1 begincodespacerange
+<0000> <FFFF>
+endcodespacerange
+
+100 beginbfrange
+<0000> <005B> <00>
+<005C> <005C> <80>
+<005D> <007F> <5D>
+<00A0> <00A0> <A0>
+<00A2> <00A3> <8191>
+<00A5> <00A5> <5C>
+<00A6> <00A6> <7C>
+<00A7> <00A7> <8198>
+<00A8> <00A8> <814E>
+<00A9> <00A9> <FD>
+<00AC> <00AC> <81CA>
+<00AD> <00AD> <815D>
+<00B0> <00B0> <818B>
+<00B1> <00B1> <817D>
+<00B4> <00B4> <814C>
+<00B6> <00B6> <81F7>
+<00B7> <00B7> <8145>
+<00B8> <00B8> <8143>
+<00D7> <00D7> <817E>
+<00F7> <00F7> <8180>
+<02D0> <02D0> <8146>
+<0391> <03A1> <839F>
+<03A3> <03A9> <83B0>
+<03B1> <03C1> <83BF>
+<03C3> <03C9> <83D0>
+<0401> <0401> <8446>
+<0410> <0415> <8440>
+<0416> <042F> <8447>
+<0430> <0435> <8470>
+<0436> <043D> <8477>
+<043E> <044F> <8480>
+<0451> <0451> <8476>
+<2010> <2010> <815D>
+<2013> <2013> <815D>
+<2014> <2014> <815C>
+<2015> <2015> <815C>
+<2016> <2016> <8161>
+<2018> <2019> <8165>
+<201C> <201D> <8167>
+<2020> <2021> <81F5>
+<2022> <2022> <8145>
+<2025> <2025> <8164>
+<2026> <2026> <8163>
+<2027> <2027> <8145>
+<2030> <2030> <81F1>
+<2032> <2033> <818C>
+<203B> <203B> <81A6>
+<203E> <203E> <8150>
+<20AC> <20AC> <DB>
+<2103> <2103> <818E>
+<2109> <2109> <8656>
+<210A> <210A> <864B>
+<2113> <2113> <8650>
+<2116> <2116> <869B>
+<2121> <2121> <869D>
+<2122> <2122> <FE>
+<212B> <212B> <81F0>
+<2160> <216B> <859F>
+<2170> <217B> <85B3>
+<217F> <217F> <8645>
+<2190> <2191> <81A9>
+<2192> <2192> <81A8>
+<2193> <2193> <81AB>
+<21C4> <21C5> <86CC>
+<21C6> <21C6> <86CB>
+<21D2> <21D2> <81CB>
+<21D4> <21D4> <81CC>
+<21E6> <21E7> <86D0>
+<21E8> <21E8> <86CF>
+<21E9> <21E9> <86D2>
+<2200> <2200> <81CD>
+<2202> <2202> <81DD>
+<2203> <2203> <81CE>
+<2207> <2207> <81DE>
+<2208> <2208> <81B8>
+<220B> <220B> <81B9>
+<220F> <220F> <83AE>
+<2211> <2211> <83B0>
+<2212> <2212> <817C>
+<221A> <221A> <81E3>
+<221D> <221D> <81E5>
+<221E> <221E> <8187>
+<221F> <221F> <8841>
+<2220> <2220> <81DA>
+<2225> <2225> <8161>
+<2227> <2228> <81C8>
+<2229> <2229> <81BF>
+<222A> <222A> <81BE>
+<222B> <222C> <81E7>
+<222E> <222E> <8840>
+<2234> <2234> <8188>
+<2235> <2235> <81E6>
+<2236> <2236> <8146>
+<223C> <223C> <8160>
+<223D> <223D> <81E4>
+<2252> <2252> <81E0>
+<2260> <2260> <8182>
+<2261> <2261> <81DF>
+<2266> <2267> <8185>
+<226A> <226B> <81E1>
+endbfrange
+
+100 beginbfrange
+<2282> <2283> <81BC>
+<2286> <2287> <81BA>
+<2299> <2299> <819D>
+<22A5> <22A5> <81DB>
+<22BF> <22BF> <8842>
+<22EF> <22EF> <8163>
+<2312> <2312> <81DC>
+<2460> <2473> <8540>
+<2474> <2487> <855E>
+<2488> <2490> <8592>
+<249C> <24B5> <85DB>
+<2500> <2500> <849F>
+<2501> <2501> <84AA>
+<2502> <2502> <84A0>
+<2503> <2503> <84AB>
+<250C> <250C> <84A1>
+<250F> <250F> <84AC>
+<2510> <2510> <84A2>
+<2513> <2513> <84AD>
+<2514> <2514> <84A4>
+<2517> <2517> <84AF>
+<2518> <2518> <84A3>
+<251B> <251B> <84AE>
+<251C> <251C> <84A5>
+<251D> <251D> <84BA>
+<2520> <2520> <84B5>
+<2523> <2523> <84B0>
+<2524> <2524> <84A7>
+<2525> <2525> <84BC>
+<2528> <2528> <84B7>
+<252B> <252B> <84B2>
+<252C> <252C> <84A6>
+<252F> <252F> <84B6>
+<2530> <2530> <84BB>
+<2533> <2533> <84B1>
+<2534> <2534> <84A8>
+<2537> <2537> <84B8>
+<2538> <2538> <84BD>
+<253B> <253B> <84B3>
+<253C> <253C> <84A9>
+<253F> <253F> <84B9>
+<2542> <2542> <84BE>
+<254B> <254B> <84B4>
+<2595> <2595> <8162>
+<25A0> <25A0> <81A1>
+<25A1> <25A1> <81A0>
+<25B2> <25B2> <81A3>
+<25B3> <25B3> <81A2>
+<25BC> <25BC> <81A5>
+<25BD> <25BD> <81A4>
+<25C6> <25C6> <819F>
+<25C7> <25C7> <819E>
+<25C9> <25C9> <819D>
+<25CB> <25CB> <819B>
+<25CE> <25CE> <819D>
+<25CF> <25CF> <819C>
+<25EF> <25EF> <81FC>
+<2605> <2605> <819A>
+<2606> <2606> <8199>
+<2609> <2609> <819D>
+<260E> <260E> <86B4>
+<261C> <261D> <86C8>
+<261E> <261E> <86C7>
+<261F> <261F> <86CA>
+<2640> <2640> <818A>
+<2642> <2642> <8189>
+<2660> <2660> <86A3>
+<2661> <2662> <86A1>
+<2663> <2663> <86A4>
+<2664> <2664> <869F>
+<2665> <2666> <86A5>
+<2667> <2667> <86A0>
+<266A> <266A> <81F4>
+<266D> <266D> <81F3>
+<266F> <266F> <81F2>
+<2776> <2778> <857C>
+<2779> <277E> <8580>
+<27A1> <27A1> <86D3>
+<3000> <3002> <8140>
+<3003> <3003> <8156>
+<3004> <3004> <86B5>
+<3005> <3007> <8158>
+<3008> <3011> <8171>
+<3012> <3012> <81A7>
+<3013> <3013> <81AC>
+<3014> <3015> <816B>
+<301C> <301C> <8160>
+<301D> <301E> <8854>
+<301F> <301F> <8855>
+<3020> <3020> <86B3>
+<3041> <3093> <829F>
+<3094> <3094> <8868>
+<309B> <309C> <814A>
+<309D> <309E> <8154>
+<30A1> <30DF> <8340>
+<30E0> <30F6> <8380>
+<30F7> <30FA> <886A>
+<30FB> <30FB> <8145>
+<30FC> <30FC> <815B>
+<30FD> <30FE> <8152>
+endbfrange
+
+100 beginbfrange
+<322A> <322F> <8741>
+<3230> <3230> <8740>
+<3231> <3231> <874D>
+<3232> <3232> <8750>
+<3233> <3233> <8753>
+<3234> <3234> <874F>
+<3235> <3235> <8754>
+<3236> <3236> <8752>
+<3237> <3237> <8748>
+<3238> <3238> <8758>
+<3239> <323A> <874B>
+<323B> <323B> <8751>
+<323C> <323D> <8755>
+<323E> <323E> <874E>
+<323F> <323F> <8757>
+<3240> <3240> <8747>
+<3242> <3243> <8749>
+<3296> <3296> <8799>
+<3298> <3298> <879B>
+<3299> <3299> <879E>
+<329D> <329D> <879A>
+<329E> <329E> <879C>
+<32A4> <32A9> <8793>
+<3300> <3300> <87BD>
+<3303> <3303> <87A7>
+<3305> <3305> <87A4>
+<330D> <330D> <87B0>
+<3314> <3314> <87A2>
+<3315> <3315> <87AA>
+<3316> <3316> <87A3>
+<3318> <3318> <87A9>
+<331E> <331E> <87BE>
+<3322> <3322> <87A0>
+<3323> <3323> <87B2>
+<3326> <3326> <87B3>
+<3327> <3327> <87AB>
+<332A> <332A> <87BF>
+<332B> <332B> <87B5>
+<3331> <3331> <87C0>
+<3333> <3333> <87A5>
+<3336> <3336> <87A8>
+<3339> <3339> <87AE>
+<333B> <333B> <87B4>
+<3342> <3342> <87B1>
+<3347> <3347> <87C1>
+<3349> <3349> <879F>
+<334A> <334A> <87AD>
+<334D> <334D> <87A1>
+<334E> <334E> <87A6>
+<3351> <3351> <87AC>
+<3357> <3357> <87AF>
+<337B> <337B> <87E8>
+<337C> <337C> <87E7>
+<337D> <337D> <87E6>
+<337E> <337E> <87E5>
+<337F> <337F> <87FA>
+<3385> <3387> <865A>
+<338E> <338E> <864A>
+<338F> <338F> <864C>
+<3390> <3390> <8659>
+<3396> <3397> <864E>
+<3398> <3398> <8651>
+<339C> <339C> <8640>
+<339D> <339D> <8642>
+<339E> <339E> <8648>
+<339F> <339F> <8641>
+<33A0> <33A0> <8643>
+<33A1> <33A1> <8646>
+<33A2> <33A2> <8649>
+<33A4> <33A4> <8644>
+<33A5> <33A5> <8647>
+<33B0> <33B0> <8655>
+<33B1> <33B1> <8654>
+<33B2> <33B2> <8653>
+<33B3> <33B3> <8652>
+<33C4> <33C4> <864D>
+<33CB> <33CB> <8658>
+<33CD> <33CD> <869C>
+<33D4> <33D4> <8657>
+<4E00> <4E00> <88EA>
+<4E01> <4E01> <929A>
+<4E03> <4E03> <8EB5>
+<4E07> <4E07> <969C>
+<4E08> <4E08> <8FE4>
+<4E09> <4E09> <8E4F>
+<4E0A> <4E0A> <8FE3>
+<4E0B> <4E0B> <89BA>
+<4E0D> <4E0D> <9573>
+<4E0E> <4E0E> <975E>
+<4E10> <4E10> <98A0>
+<4E11> <4E11> <894E>
+<4E14> <4E14> <8A8E>
+<4E15> <4E15> <98A1>
+<4E16> <4E16> <90A2>
+<4E17> <4E17> <99C0>
+<4E18> <4E18> <8B75>
+<4E19> <4E19> <95B8>
+<4E1E> <4E1E> <8FE5>
+<4E21> <4E21> <97BC>
+<4E26> <4E26> <95C0>
+endbfrange
+
+100 beginbfrange
+<4E2A> <4E2A> <98A2>
+<4E2D> <4E2D> <9286>
+<4E31> <4E31> <98A3>
+<4E32> <4E32> <8BF8>
+<4E36> <4E36> <98A4>
+<4E38> <4E38> <8ADB>
+<4E39> <4E39> <924F>
+<4E3B> <4E3B> <8EE5>
+<4E3C> <4E3C> <98A5>
+<4E3F> <4E3F> <98A6>
+<4E42> <4E42> <98A7>
+<4E43> <4E43> <9454>
+<4E45> <4E45> <8B76>
+<4E4B> <4E4B> <9456>
+<4E4D> <4E4D> <93E1>
+<4E4E> <4E4E> <8CC1>
+<4E4F> <4E4F> <9652>
+<4E55> <4E55> <E568>
+<4E56> <4E56> <98A8>
+<4E57> <4E57> <8FE6>
+<4E58> <4E58> <98A9>
+<4E59> <4E59> <89B3>
+<4E5D> <4E5D> <8BE3>
+<4E5E> <4E5E> <8CEE>
+<4E5F> <4E5F> <96E7>
+<4E62> <4E62> <9BA4>
+<4E71> <4E71> <9790>
+<4E73> <4E73> <93FB>
+<4E7E> <4E7E> <8AA3>
+<4E80> <4E80> <8B54>
+<4E82> <4E82> <98AA>
+<4E85> <4E85> <98AB>
+<4E86> <4E86> <97B9>
+<4E88> <4E88> <975C>
+<4E89> <4E89> <9188>
+<4E8A> <4E8A> <98AD>
+<4E8B> <4E8B> <8E96>
+<4E8C> <4E8C> <93F1>
+<4E8E> <4E8E> <98B0>
+<4E91> <4E91> <895D>
+<4E92> <4E92> <8CDD>
+<4E94> <4E94> <8CDC>
+<4E95> <4E95> <88E4>
+<4E98> <4E98> <986A>
+<4E99> <4E99> <9869>
+<4E9B> <4E9B> <8DB1>
+<4E9C> <4E9C> <889F>
+<4E9E> <4EA0> <98B1>
+<4EA1> <4EA1> <9653>
+<4EA2> <4EA2> <98B4>
+<4EA4> <4EA4> <8CF0>
+<4EA5> <4EA5> <88E5>
+<4EA6> <4EA6> <9692>
+<4EA8> <4EA8> <8B9C>
+<4EAB> <4EAC> <8B9D>
+<4EAD> <4EAD> <92E0>
+<4EAE> <4EAE> <97BA>
+<4EB0> <4EB0> <98B5>
+<4EB3> <4EB3> <98B6>
+<4EB6> <4EB6> <98B7>
+<4EBA> <4EBA> <906C>
+<4EC0> <4EC0> <8F59>
+<4EC1> <4EC1> <906D>
+<4EC2> <4EC2> <98BC>
+<4EC4> <4EC4> <98BA>
+<4EC6> <4EC6> <98BB>
+<4EC7> <4EC7> <8B77>
+<4ECA> <4ECA> <8DA1>
+<4ECB> <4ECB> <89EE>
+<4ECD> <4ECD> <98B9>
+<4ECE> <4ECE> <98B8>
+<4ECF> <4ECF> <95A7>
+<4ED4> <4ED4> <8E65>
+<4ED5> <4ED5> <8E64>
+<4ED6> <4ED6> <91BC>
+<4ED7> <4ED7> <98BD>
+<4ED8> <4ED8> <9574>
+<4ED9> <4ED9> <90E5>
+<4EDD> <4EDD> <8157>
+<4EDE> <4EDE> <98BE>
+<4EDF> <4EDF> <98C0>
+<4EE3> <4EE3> <91E3>
+<4EE4> <4EE4> <97DF>
+<4EE5> <4EE5> <88C8>
+<4EED> <4EED> <98BF>
+<4EEE> <4EEE> <89BC>
+<4EF0> <4EF0> <8BC2>
+<4EF2> <4EF2> <9287>
+<4EF6> <4EF6> <8C8F>
+<4EF7> <4EF7> <98C1>
+<4EFB> <4EFB> <9443>
+<4F01> <4F01> <8AE9>
+<4F09> <4F09> <98C2>
+<4F0A> <4F0A> <88C9>
+<4F0D> <4F0D> <8CDE>
+<4F0E> <4F0E> <8AEA>
+<4F0F> <4F0F> <959A>
+<4F10> <4F10> <94B0>
+<4F11> <4F11> <8B78>
+<4F1A> <4F1A> <89EF>
+endbfrange
+
+100 beginbfrange
+<4F1C> <4F1C> <98E5>
+<4F1D> <4F1D> <9360>
+<4F2F> <4F2F> <948C>
+<4F30> <4F30> <98C4>
+<4F34> <4F34> <94BA>
+<4F36> <4F36> <97E0>
+<4F38> <4F38> <904C>
+<4F3A> <4F3A> <8E66>
+<4F3C> <4F3C> <8E97>
+<4F3D> <4F3D> <89BE>
+<4F43> <4F43> <92CF>
+<4F46> <4F46> <9241>
+<4F47> <4F47> <98C8>
+<4F4D> <4F4D> <88CA>
+<4F4E> <4F4E> <92E1>
+<4F4F> <4F4F> <8F5A>
+<4F50> <4F50> <8DB2>
+<4F51> <4F51> <9743>
+<4F53> <4F53> <91CC>
+<4F55> <4F55> <89BD>
+<4F57> <4F57> <98C7>
+<4F59> <4F59> <975D>
+<4F5A> <4F5A> <98C3>
+<4F5B> <4F5B> <98C5>
+<4F5C> <4F5C> <8DEC>
+<4F5D> <4F5D> <98C6>
+<4F5E> <4F5E> <9B43>
+<4F69> <4F69> <98CE>
+<4F6F> <4F6F> <98D1>
+<4F70> <4F70> <98CF>
+<4F73> <4F73> <89C0>
+<4F75> <4F75> <95B9>
+<4F76> <4F76> <98C9>
+<4F7B> <4F7B> <98CD>
+<4F7C> <4F7C> <8CF1>
+<4F7F> <4F7F> <8E67>
+<4F83> <4F83> <8AA4>
+<4F86> <4F86> <98D2>
+<4F88> <4F88> <98CA>
+<4F8B> <4F8B> <97E1>
+<4F8D> <4F8D> <8E98>
+<4F8F> <4F8F> <98CB>
+<4F91> <4F91> <98D0>
+<4F96> <4F96> <98D3>
+<4F98> <4F98> <98CC>
+<4F9B> <4F9B> <8B9F>
+<4F9D> <4F9D> <88CB>
+<4FA0> <4FA0> <8BA0>
+<4FA1> <4FA1> <89BF>
+<4FAB> <4FAB> <9B44>
+<4FAD> <4FAD> <9699>
+<4FAE> <4FAE> <958E>
+<4FAF> <4FAF> <8CF2>
+<4FB5> <4FB5> <904E>
+<4FB6> <4FB6> <97B5>
+<4FBF> <4FBF> <95D6>
+<4FC2> <4FC2> <8C57>
+<4FC3> <4FC3> <91A3>
+<4FC4> <4FC4> <89E2>
+<4FCA> <4FCA> <8F72>
+<4FCE> <4FCE> <98D7>
+<4FD0> <4FD0> <98DC>
+<4FD1> <4FD1> <98DA>
+<4FD4> <4FD4> <98D5>
+<4FD7> <4FD7> <91AD>
+<4FD8> <4FD8> <98D8>
+<4FDA> <4FDA> <98DB>
+<4FDB> <4FDB> <98D9>
+<4FDD> <4FDD> <95DB>
+<4FDF> <4FDF> <98D6>
+<4FE0> <4FE0> <8BA0>
+<4FE1> <4FE1> <904D>
+<4FE3> <4FE3> <9693>
+<4FE4> <4FE5> <98DD>
+<4FEE> <4FEE> <8F43>
+<4FEF> <4FEF> <98EB>
+<4FF3> <4FF3> <946F>
+<4FF5> <4FF5> <9555>
+<4FF6> <4FF6> <98E6>
+<4FF8> <4FF8> <95EE>
+<4FFA> <4FFA> <89B4>
+<4FFE> <4FFE> <98EA>
+<5005> <5005> <98E4>
+<5006> <5006> <98ED>
+<5009> <5009> <9171>
+<500B> <500B> <8CC2>
+<500D> <500D> <947B>
+<500F> <500F> <E0C5>
+<5011> <5011> <98EC>
+<5012> <5012> <937C>
+<5014> <5014> <98E1>
+<5016> <5016> <8CF4>
+<5019> <5019> <8CF3>
+<501A> <501A> <98DF>
+<501F> <501F> <8ED8>
+<5021> <5021> <98E7>
+<5023> <5023> <95ED>
+<5024> <5024> <926C>
+<5025> <5025> <98E3>
+<5026> <5026> <8C91>
+endbfrange
+
+100 beginbfrange
+<5028> <5028> <98E0>
+<5029> <5029> <98E8>
+<502A> <502A> <98E2>
+<502B> <502B> <97CF>
+<502C> <502C> <98E9>
+<502D> <502D> <9860>
+<5036> <5036> <8BE4>
+<5039> <5039> <8C90>
+<5043> <5043> <98EE>
+<5047> <5047> <98EF>
+<5048> <5048> <98F3>
+<5049> <5049> <88CC>
+<504F> <504F> <95CE>
+<5050> <5050> <98F2>
+<5055> <5055> <98F1>
+<5056> <5056> <98F5>
+<505A> <505A> <98F4>
+<505C> <505C> <92E2>
+<5065> <5065> <8C92>
+<506C> <506C> <98F6>
+<5072> <5072> <8EC3>
+<5074> <5074> <91A4>
+<5075> <5075> <92E3>
+<5076> <5076> <8BF4>
+<5078> <5078> <98F7>
+<507D> <507D> <8B55>
+<5080> <5080> <98F8>
+<5085> <5085> <98FA>
+<508D> <508D> <9654>
+<5091> <5091> <8C86>
+<5098> <5098> <8E50>
+<5099> <5099> <94F5>
+<509A> <509A> <98F9>
+<50AC> <50AC> <8DC3>
+<50AD> <50AD> <9762>
+<50B2> <50B2> <98FC>
+<50B3> <50B3> <9942>
+<50B4> <50B4> <98FB>
+<50B5> <50B5> <8DC2>
+<50B7> <50B7> <8F9D>
+<50BE> <50BE> <8C58>
+<50C2> <50C2> <9943>
+<50C5> <50C5> <8BCD>
+<50C9> <50CA> <9940>
+<50CD> <50CD> <93AD>
+<50CF> <50CF> <919C>
+<50D1> <50D1> <8BA1>
+<50D5> <50D5> <966C>
+<50D6> <50D6> <9944>
+<50DA> <50DA> <97BB>
+<50DE> <50DE> <9945>
+<50E3> <50E3> <9948>
+<50E5> <50E5> <9946>
+<50E7> <50E7> <916D>
+<50ED> <50ED> <9947>
+<50EE> <50EE> <9949>
+<50F5> <50F5> <994B>
+<50F9> <50F9> <994A>
+<50FB> <50FB> <95C6>
+<5100> <5100> <8B56>
+<5101> <5102> <994D>
+<5104> <5104> <89AD>
+<5109> <5109> <994C>
+<5112> <5112> <8EF2>
+<5114> <5114> <9951>
+<5115> <5115> <9950>
+<5116> <5116> <994F>
+<5118> <5118> <98D4>
+<511A> <511A> <9952>
+<511F> <511F> <8F9E>
+<5121> <5121> <9953>
+<512A> <512A> <9744>
+<5132> <5132> <96D7>
+<5137> <5137> <9955>
+<513A> <513A> <9954>
+<513B> <513B> <9957>
+<513C> <513C> <9956>
+<513F> <5140> <9958>
+<5141> <5141> <88F2>
+<5143> <5143> <8CB3>
+<5144> <5144> <8C5A>
+<5145> <5145> <8F5B>
+<5146> <5146> <929B>
+<5147> <5147> <8BA2>
+<5148> <5148> <90E6>
+<5149> <5149> <8CF5>
+<514B> <514B> <8D8E>
+<514C> <514C> <995B>
+<514D> <514D> <96C6>
+<514E> <514E> <9365>
+<5150> <5150> <8E99>
+<5152> <5152> <995A>
+<5154> <5154> <995C>
+<515A> <515A> <937D>
+<515C> <515C> <8A95>
+<5162> <5162> <995D>
+<5165> <5165> <93FC>
+<5168> <5168> <9153>
+<5169> <516A> <995F>
+<516B> <516B> <94AA>
+endbfrange
+
+100 beginbfrange
+<516C> <516C> <8CF6>
+<516D> <516D> <985A>
+<516E> <516E> <9961>
+<5171> <5171> <8BA4>
+<5175> <5175> <95BA>
+<5176> <5176> <91B4>
+<5177> <5177> <8BEF>
+<5178> <5178> <9354>
+<517C> <517C> <8C93>
+<5180> <5180> <9962>
+<5182> <5182> <9963>
+<5185> <5185> <93E0>
+<5186> <5186> <897E>
+<5189> <5189> <9966>
+<518A> <518A> <8DFB>
+<518C> <518C> <9965>
+<518D> <518D> <8DC4>
+<518F> <518F> <9967>
+<5190> <5190> <E3EC>
+<5191> <5191> <9968>
+<5192> <5192> <9660>
+<5193> <5193> <9969>
+<5195> <5196> <996A>
+<5197> <5197> <8FE7>
+<5199> <5199> <8ECA>
+<51A0> <51A0> <8AA5>
+<51A2> <51A2> <996E>
+<51A4> <51A4> <996C>
+<51A5> <51A5> <96BB>
+<51A6> <51A6> <996D>
+<51A8> <51A8> <9579>
+<51A9> <51AB> <996F>
+<51AC> <51AC> <937E>
+<51B0> <51B0> <9975>
+<51B1> <51B2> <9973>
+<51B3> <51B3> <9972>
+<51B4> <51B4> <8DE1>
+<51B5> <51B5> <9976>
+<51B6> <51B6> <96E8>
+<51B7> <51B7> <97E2>
+<51BD> <51BD> <9977>
+<51C4> <51C4> <90A6>
+<51C5> <51C5> <9978>
+<51C6> <51C6> <8F79>
+<51C9> <51C9> <9979>
+<51CB> <51CB> <929C>
+<51CC> <51CC> <97BD>
+<51CD> <51CD> <9380>
+<51D6> <51D6> <99C3>
+<51DB> <51DB> <997A>
+<51DC> <51DC> <EAA3>
+<51DD> <51DD> <8BC3>
+<51E0> <51E0> <997B>
+<51E1> <51E1> <967D>
+<51E6> <51E6> <8F88>
+<51E7> <51E7> <91FA>
+<51E9> <51E9> <997D>
+<51EA> <51EA> <93E2>
+<51ED> <51ED> <997E>
+<51F0> <51F0> <9980>
+<51F1> <51F1> <8A4D>
+<51F5> <51F5> <9981>
+<51F6> <51F6> <8BA5>
+<51F8> <51F8> <93CA>
+<51F9> <51F9> <899A>
+<51FA> <51FA> <8F6F>
+<51FD> <51FD> <949F>
+<51FE> <51FE> <9982>
+<5200> <5200> <9381>
+<5203> <5203> <906E>
+<5204> <5204> <9983>
+<5206> <5206> <95AA>
+<5207> <5207> <90D8>
+<5208> <5208> <8AA0>
+<520A> <520A> <8AA7>
+<520B> <520B> <9984>
+<520E> <520E> <9986>
+<5211> <5211> <8C59>
+<5214> <5214> <9985>
+<5217> <5217> <97F1>
+<521D> <521D> <8F89>
+<5224> <5224> <94BB>
+<5225> <5225> <95CA>
+<5227> <5227> <9987>
+<5229> <5229> <9798>
+<522A> <522A> <9988>
+<522E> <522E> <9989>
+<5230> <5230> <939E>
+<5233> <5233> <998A>
+<5236> <5236> <90A7>
+<5237> <5237> <8DFC>
+<5238> <5238> <8C94>
+<5239> <5239> <998B>
+<523A> <523A> <8E68>
+<523B> <523B> <8D8F>
+<5243> <5243> <92E4>
+<5244> <5244> <998D>
+<5247> <5247> <91A5>
+<524A> <524A> <8DED>
+<524B> <524C> <998E>
+endbfrange
+
+100 beginbfrange
+<524D> <524D> <914F>
+<524F> <524F> <998C>
+<5254> <5254> <9991>
+<5256> <5256> <9655>
+<525B> <525B> <8D84>
+<525D> <525D> <948D>
+<525E> <525E> <9990>
+<5263> <5263> <8C95>
+<5264> <5264> <8DDC>
+<5265> <5265> <948D>
+<5269> <5269> <9994>
+<526A> <526A> <9992>
+<526F> <526F> <959B>
+<5270> <5270> <8FE8>
+<5271> <5271> <999B>
+<5272> <5272> <8A84>
+<5273> <5273> <9995>
+<5274> <5274> <9993>
+<5275> <5275> <916E>
+<527D> <527D> <9997>
+<527F> <527F> <9996>
+<5283> <5283> <8A63>
+<5287> <5287> <8C80>
+<5288> <5288> <999C>
+<5289> <5289> <97AB>
+<528D> <528D> <9998>
+<5291> <5291> <999D>
+<5292> <5292> <999A>
+<5294> <5294> <9999>
+<529B> <529B> <97CD>
+<529F> <529F> <8CF7>
+<52A0> <52A0> <89C1>
+<52A3> <52A3> <97F2>
+<52A9> <52A9> <8F95>
+<52AA> <52AA> <9377>
+<52AB> <52AB> <8D85>
+<52AC> <52AD> <99A0>
+<52B1> <52B1> <97E3>
+<52B4> <52B4> <984A>
+<52B5> <52B5> <99A3>
+<52B9> <52B9> <8CF8>
+<52BC> <52BC> <99A2>
+<52BE> <52BE> <8A4E>
+<52C1> <52C1> <99A4>
+<52C3> <52C3> <9675>
+<52C5> <52C5> <92BA>
+<52C7> <52C7> <9745>
+<52C9> <52C9> <95D7>
+<52CD> <52CD> <99A5>
+<52D2> <52D2> <E8D3>
+<52D5> <52D5> <93AE>
+<52D7> <52D7> <99A6>
+<52D8> <52D8> <8AA8>
+<52D9> <52D9> <96B1>
+<52DD> <52DD> <8F9F>
+<52DE> <52DE> <99A7>
+<52DF> <52DF> <95E5>
+<52E0> <52E0> <99AB>
+<52E2> <52E2> <90A8>
+<52E3> <52E3> <99A8>
+<52E4> <52E4> <8BCE>
+<52E6> <52E6> <99A9>
+<52E7> <52E7> <8AA9>
+<52F2> <52F2> <8C4D>
+<52F3> <52F3> <99AC>
+<52F5> <52F5> <99AD>
+<52F8> <52F9> <99AE>
+<52FA> <52FA> <8ED9>
+<52FE> <52FE> <8CF9>
+<52FF> <52FF> <96DC>
+<5301> <5301> <96E6>
+<5302> <5302> <93F5>
+<5305> <5305> <95EF>
+<5306> <5306> <99B0>
+<5308> <5308> <99B1>
+<530D> <530D> <99B3>
+<530F> <530F> <99B5>
+<5310> <5310> <99B4>
+<5315> <5315> <99B6>
+<5316> <5316> <89BB>
+<5317> <5317> <966B>
+<5319> <5319> <8DFA>
+<531A> <531A> <99B7>
+<531D> <531D> <9178>
+<5320> <5320> <8FA0>
+<5321> <5321> <8BA7>
+<5323> <5323> <99B8>
+<532A> <532A> <94D9>
+<532F> <532F> <99B9>
+<5331> <5331> <99BA>
+<5333> <5333> <99BB>
+<5338> <5338> <99BC>
+<5339> <5339> <9543>
+<533A> <533A> <8BE6>
+<533B> <533B> <88E3>
+<533F> <533F> <93BD>
+<5340> <5340> <99BD>
+<5341> <5341> <8F5C>
+<5343> <5343> <90E7>
+<5345> <5345> <99BF>
+endbfrange
+
+100 beginbfrange
+<5346> <5346> <99BE>
+<5347> <5347> <8FA1>
+<5348> <5348> <8CDF>
+<5349> <5349> <99C1>
+<534A> <534A> <94BC>
+<534D> <534D> <99C2>
+<5351> <5351> <94DA>
+<5352> <5352> <91B2>
+<5353> <5353> <91EC>
+<5354> <5354> <8BA6>
+<5357> <5357> <93EC>
+<5358> <5358> <9250>
+<535A> <535A> <948E>
+<535C> <535C> <966D>
+<535E> <535E> <99C4>
+<5360> <5360> <90E8>
+<5366> <5366> <8C54>
+<5369> <5369> <99C5>
+<536E> <536E> <99C6>
+<536F> <536F> <894B>
+<5370> <5370> <88F3>
+<5371> <5371> <8AEB>
+<5373> <5373> <91A6>
+<5374> <5374> <8B70>
+<5375> <5375> <9791>
+<5377> <5377> <99C9>
+<5378> <5378> <89B5>
+<537B> <537B> <99C8>
+<537F> <537F> <8BA8>
+<5382> <5382> <99CA>
+<5384> <5384> <96EF>
+<5396> <5396> <99CB>
+<5398> <5398> <97D0>
+<539A> <539A> <8CFA>
+<539F> <539F> <8CB4>
+<53A0> <53A0> <99CC>
+<53A5> <53A5> <99CE>
+<53A6> <53A6> <99CD>
+<53A8> <53A8> <907E>
+<53A9> <53A9> <8958>
+<53AD> <53AD> <897D>
+<53AE> <53AE> <99CF>
+<53B0> <53B0> <99D0>
+<53B3> <53B3> <8CB5>
+<53B6> <53B6> <99D1>
+<53BB> <53BB> <8B8E>
+<53C2> <53C2> <8E51>
+<53C3> <53C3> <99D2>
+<53C8> <53C8> <9694>
+<53C9> <53C9> <8DB3>
+<53CA> <53CA> <8B79>
+<53CB> <53CB> <9746>
+<53CC> <53CC> <916F>
+<53CD> <53CD> <94BD>
+<53CE> <53CE> <8EFB>
+<53D4> <53D4> <8F66>
+<53D6> <53D6> <8EE6>
+<53D7> <53D7> <8EF3>
+<53D9> <53D9> <8F96>
+<53DB> <53DB> <94BE>
+<53DF> <53DF> <99D5>
+<53E1> <53E1> <8962>
+<53E2> <53E2> <9170>
+<53E3> <53E3> <8CFB>
+<53E4> <53E4> <8CC3>
+<53E5> <53E5> <8BE5>
+<53E8> <53E8> <99D9>
+<53E9> <53E9> <9240>
+<53EA> <53EA> <91FC>
+<53EB> <53EB> <8BA9>
+<53EC> <53EC> <8FA2>
+<53ED> <53ED> <99DA>
+<53EE> <53EE> <99D8>
+<53EF> <53EF> <89C2>
+<53F0> <53F0> <91E4>
+<53F1> <53F1> <8EB6>
+<53F2> <53F2> <8E6A>
+<53F3> <53F3> <8945>
+<53F6> <53F6> <8A90>
+<53F7> <53F7> <8D86>
+<53F8> <53F8> <8E69>
+<53FA> <53FA> <99DB>
+<5401> <5401> <99DC>
+<5403> <5403> <8B68>
+<5404> <5404> <8A65>
+<5408> <5408> <8D87>
+<5409> <5409> <8B67>
+<540A> <540A> <92DD>
+<540B> <540B> <8944>
+<540C> <540C> <93AF>
+<540D> <540D> <96BC>
+<540E> <540E> <8D40>
+<540F> <540F> <9799>
+<5410> <5410> <9366>
+<5411> <5411> <8CFC>
+<541B> <541B> <8C4E>
+<541D> <541D> <99E5>
+<541F> <541F> <8BE1>
+<5420> <5420> <9669>
+<5426> <5426> <94DB>
+endbfrange
+
+100 beginbfrange
+<5429> <5429> <99E4>
+<542B> <542B> <8ADC>
+<542C> <542D> <99DF>
+<542E> <542E> <99E2>
+<5436> <5436> <99E3>
+<5438> <5438> <8B7A>
+<5439> <5439> <9081>
+<543B> <543B> <95AB>
+<543C> <543C> <99E1>
+<543D> <543D> <99DD>
+<543E> <543E> <8CE1>
+<5440> <5440> <99DE>
+<5442> <5442> <9843>
+<5446> <5446> <95F0>
+<5448> <5448> <92E6>
+<5449> <5449> <8CE0>
+<544A> <544A> <8D90>
+<544E> <544E> <99E6>
+<5451> <5451> <93DB>
+<545F> <545F> <99EA>
+<5468> <5468> <8EFC>
+<546A> <546A> <8EF4>
+<5470> <5470> <99ED>
+<5471> <5471> <99EB>
+<5473> <5473> <96A1>
+<5475> <5475> <99E8>
+<5476> <5476> <99F1>
+<5477> <5477> <99EC>
+<547B> <547B> <99EF>
+<547C> <547C> <8CC4>
+<547D> <547D> <96BD>
+<5480> <5480> <99F0>
+<5484> <5484> <99F2>
+<5486> <5486> <99F4>
+<548B> <548B> <8DEE>
+<548C> <548C> <9861>
+<548E> <548E> <99E9>
+<548F> <548F> <99E7>
+<5490> <5490> <99F3>
+<5492> <5492> <99EE>
+<54A2> <54A2> <99F6>
+<54A4> <54A4> <9A42>
+<54A5> <54A5> <99F8>
+<54A8> <54A8> <99FC>
+<54AB> <54AB> <9A40>
+<54AC> <54AC> <99F9>
+<54AF> <54AF> <9A5D>
+<54B2> <54B2> <8DE7>
+<54B3> <54B3> <8A50>
+<54B8> <54B8> <99F7>
+<54BC> <54BC> <9A44>
+<54BD> <54BD> <88F4>
+<54BE> <54BE> <9A43>
+<54C0> <54C0> <88A3>
+<54C1> <54C1> <9569>
+<54C2> <54C2> <9A41>
+<54C4> <54C4> <99FA>
+<54C7> <54C7> <99F5>
+<54C8> <54C8> <99FB>
+<54C9> <54C9> <8DC6>
+<54D8> <54D8> <9A45>
+<54E1> <54E1> <88F5>
+<54E2> <54E2> <9A4E>
+<54E5> <54E6> <9A46>
+<54E8> <54E8> <8FA3>
+<54E9> <54E9> <9689>
+<54ED> <54ED> <9A4C>
+<54EE> <54EE> <9A4B>
+<54F2> <54F2> <934E>
+<54FA> <54FA> <9A4D>
+<54FD> <54FD> <9A4A>
+<5504> <5504> <8953>
+<5506> <5506> <8DB4>
+<5507> <5507> <904F>
+<550F> <550F> <9A48>
+<5510> <5510> <9382>
+<5514> <5514> <9A49>
+<5516> <5516> <88A0>
+<552E> <552E> <9A53>
+<552F> <552F> <9742>
+<5531> <5531> <8FA5>
+<5533> <5533> <9A59>
+<5538> <5538> <9A58>
+<5539> <5539> <9A4F>
+<553E> <553E> <91C1>
+<5540> <5540> <9A50>
+<5544> <5544> <91ED>
+<5545> <5545> <9A55>
+<5546> <5546> <8FA4>
+<554C> <554C> <9A52>
+<554F> <554F> <96E2>
+<5553> <5553> <8C5B>
+<5556> <5557> <9A56>
+<555C> <555C> <9A54>
+<555D> <555D> <9A5A>
+<555E> <555E> <88A0>
+<5563> <5563> <9A51>
+<557B> <557B> <9A60>
+<557C> <557C> <9A65>
+<557E> <557E> <9A61>
+endbfrange
+
+100 beginbfrange
+<5580> <5580> <9A5C>
+<5583> <5583> <9A66>
+<5584> <5584> <9150>
+<5587> <5587> <9A68>
+<5589> <5589> <8D41>
+<558A> <558A> <9A5E>
+<558B> <558B> <929D>
+<5598> <5598> <9A62>
+<5599> <5599> <9A5B>
+<559A> <559A> <8AAB>
+<559C> <559C> <8AEC>
+<559D> <559D> <8A85>
+<559E> <559E> <9A63>
+<559F> <559F> <9A5F>
+<55A7> <55A7> <8C96>
+<55A8> <55A8> <9A69>
+<55A9> <55A9> <9A67>
+<55AA> <55AA> <9172>
+<55AB> <55AB> <8B69>
+<55AC> <55AC> <8BAA>
+<55AE> <55AE> <9A64>
+<55B0> <55B0> <8BF2>
+<55B6> <55B6> <8963>
+<55C4> <55C4> <9A6D>
+<55C5> <55C5> <9A6B>
+<55C7> <55C7> <9AA5>
+<55D4> <55D4> <9A70>
+<55DA> <55DA> <9A6A>
+<55DC> <55DC> <9A6E>
+<55DF> <55DF> <9A6C>
+<55E3> <55E3> <8E6B>
+<55E4> <55E4> <9A6F>
+<55F7> <55F7> <9A72>
+<55F9> <55F9> <9A77>
+<55FD> <55FD> <9A75>
+<55FE> <55FE> <9A74>
+<5606> <5606> <9251>
+<5609> <5609> <89C3>
+<5614> <5614> <9A71>
+<5616> <5616> <9A73>
+<5617> <5617> <8FA6>
+<5618> <5618> <8952>
+<561B> <561B> <9A76>
+<5629> <5629> <89DC>
+<562F> <562F> <9A82>
+<5631> <5631> <8FFA>
+<5632> <5632> <9A7D>
+<5634> <5634> <9A7B>
+<5636> <5636> <9A7C>
+<5638> <5638> <9A7E>
+<5642> <5642> <895C>
+<564C> <564C> <9158>
+<564E> <564E> <9A78>
+<5650> <5650> <9A79>
+<5653> <5653> <8952>
+<565B> <565B> <8A9A>
+<5664> <5664> <9A81>
+<5668> <5668> <8AED>
+<566A> <566A> <9A84>
+<566B> <566B> <9A80>
+<566C> <566C> <9A83>
+<5674> <5674> <95AC>
+<5678> <5678> <93D3>
+<567A> <567A> <94B6>
+<5680> <5680> <9A86>
+<5686> <5686> <9A85>
+<5687> <5687> <8A64>
+<568A> <568A> <9A87>
+<568F> <568F> <9A8A>
+<5694> <5694> <9A89>
+<5699> <5699> <8A9A>
+<56A0> <56A0> <9A88>
+<56A2> <56A2> <9458>
+<56A5> <56A5> <9A8B>
+<56AE> <56AE> <9A8C>
+<56B4> <56B4> <9A8E>
+<56B6> <56B6> <9A8D>
+<56BC> <56BC> <9A90>
+<56C0> <56C0> <9A93>
+<56C1> <56C1> <9A91>
+<56C2> <56C2> <9A8F>
+<56C3> <56C3> <9A92>
+<56C8> <56C8> <9A94>
+<56CA> <56CA> <9458>
+<56CE> <56CE> <9A95>
+<56D1> <56D1> <9A96>
+<56D3> <56D3> <9A97>
+<56D7> <56D7> <9A98>
+<56D8> <56D8> <9964>
+<56DA> <56DA> <8EFA>
+<56DB> <56DB> <8E6C>
+<56DE> <56DE> <89F1>
+<56E0> <56E0> <88F6>
+<56E3> <56E3> <9263>
+<56EE> <56EE> <9A99>
+<56F0> <56F0> <8DA2>
+<56F2> <56F2> <88CD>
+<56F3> <56F3> <907D>
+<56F9> <56F9> <9A9A>
+<56FA> <56FA> <8CC5>
+endbfrange
+
+100 beginbfrange
+<56FD> <56FD> <8D91>
+<56FF> <56FF> <9A9C>
+<5700> <5700> <9A9B>
+<5703> <5703> <95DE>
+<5704> <5704> <9A9D>
+<5708> <5708> <9A9F>
+<5709> <5709> <9A9E>
+<570B> <570B> <9AA0>
+<570D> <570D> <9AA1>
+<570F> <570F> <8C97>
+<5712> <5712> <8980>
+<5713> <5713> <9AA2>
+<5716> <5716> <9AA4>
+<5718> <5718> <9AA3>
+<571C> <571C> <9AA6>
+<571F> <571F> <9379>
+<5726> <5726> <9AA7>
+<5727> <5727> <88B3>
+<5728> <5728> <8DDD>
+<572D> <572D> <8C5C>
+<5730> <5730> <926E>
+<5737> <5738> <9AA8>
+<573B> <573B> <9AAB>
+<5740> <5740> <9AAC>
+<5742> <5742> <8DE2>
+<5747> <5747> <8BCF>
+<574A> <574A> <9656>
+<574E> <574E> <9AAA>
+<574F> <574F> <9AAD>
+<5750> <5750> <8DBF>
+<5751> <5751> <8D42>
+<5761> <5761> <9AB1>
+<5764> <5764> <8DA3>
+<5766> <5766> <9252>
+<5769> <5769> <9AAE>
+<576A> <576A> <92D8>
+<577F> <577F> <9AB2>
+<5782> <5782> <9082>
+<5788> <5788> <9AB0>
+<5789> <5789> <9AB3>
+<578B> <578B> <8C5E>
+<5793> <5793> <9AB4>
+<57A0> <57A0> <9AB5>
+<57A2> <57A2> <8D43>
+<57A3> <57A3> <8A5F>
+<57A4> <57A4> <9AB7>
+<57AA> <57AA> <9AB8>
+<57B0> <57B0> <9AB9>
+<57B3> <57B3> <9AB6>
+<57C0> <57C0> <9AAF>
+<57C3> <57C3> <9ABA>
+<57C6> <57C6> <9ABB>
+<57CB> <57CB> <9684>
+<57CE> <57CE> <8FE9>
+<57D2> <57D3> <9ABD>
+<57D4> <57D4> <9ABC>
+<57D6> <57D6> <9AC0>
+<57DC> <57DC> <9457>
+<57DF> <57DF> <88E6>
+<57E0> <57E0> <9575>
+<57E3> <57E3> <9AC1>
+<57F4> <57F4> <8FFB>
+<57F7> <57F7> <8EB7>
+<57F9> <57F9> <947C>
+<57FA> <57FA> <8AEE>
+<57FC> <57FC> <8DE9>
+<5800> <5800> <9678>
+<5802> <5802> <93B0>
+<5805> <5805> <8C98>
+<5806> <5806> <91CD>
+<580A> <580A> <9ABF>
+<580B> <580B> <9AC2>
+<5815> <5815> <91C2>
+<5819> <5819> <9AC3>
+<581D> <581D> <9AC4>
+<5821> <5821> <9AC6>
+<5824> <5824> <92E7>
+<582A> <582A> <8AAC>
+<582F> <582F> <EA9F>
+<5830> <5830> <8981>
+<5831> <5831> <95F1>
+<5834> <5834> <8FEA>
+<5835> <5835> <9367>
+<583A> <583A> <8DE4>
+<583D> <583D> <9ACC>
+<5840> <5840> <95BB>
+<5841> <5841> <97DB>
+<584A> <584A> <89F2>
+<584B> <584B> <9AC8>
+<5851> <5851> <9159>
+<5852> <5852> <9ACB>
+<5854> <5854> <9383>
+<5857> <5857> <9368>
+<5858> <5858> <9384>
+<5859> <5859> <94B7>
+<585A> <585A> <92CB>
+<585E> <585E> <8DC7>
+<5861> <5861> <9355>
+<5862> <5862> <9AC7>
+<5869> <5869> <8996>
+endbfrange
+
+100 beginbfrange
+<586B> <586B> <9355>
+<5870> <5870> <9AC9>
+<5872> <5872> <9AC5>
+<5875> <5875> <906F>
+<5879> <5879> <9ACD>
+<587E> <587E> <8F6D>
+<5883> <5883> <8BAB>
+<5885> <5885> <9ACE>
+<5893> <5893> <95E6>
+<5897> <5897> <919D>
+<589C> <589C> <92C4>
+<589F> <589F> <9AD0>
+<58A8> <58A8> <966E>
+<58AB> <58AB> <9AD1>
+<58AE> <58AE> <9AD6>
+<58B3> <58B3> <95AD>
+<58B8> <58B8> <9AD5>
+<58B9> <58B9> <9ACF>
+<58BA> <58BA> <9AD2>
+<58BB> <58BB> <9AD4>
+<58BE> <58BE> <8DA4>
+<58C1> <58C1> <95C7>
+<58C5> <58C5> <9AD7>
+<58C7> <58C7> <9264>
+<58CA> <58CA> <89F3>
+<58CC> <58CC> <8FEB>
+<58D1> <58D1> <9AD9>
+<58D3> <58D3> <9AD8>
+<58D5> <58D5> <8D88>
+<58D7> <58D7> <9ADA>
+<58D8> <58D8> <9ADC>
+<58D9> <58D9> <9ADB>
+<58DC> <58DC> <9ADE>
+<58DE> <58DE> <9AD3>
+<58DF> <58DF> <9AE0>
+<58E4> <58E4> <9ADF>
+<58E5> <58E5> <9ADD>
+<58EB> <58EB> <8E6D>
+<58EC> <58EC> <9070>
+<58EE> <58EE> <9173>
+<58EF> <58EF> <9AE1>
+<58F0> <58F0> <90BA>
+<58F1> <58F1> <88EB>
+<58F2> <58F2> <9484>
+<58F7> <58F7> <92D9>
+<58F9> <58F9> <9AE3>
+<58FA> <58FA> <9AE2>
+<58FB> <58FD> <9AE4>
+<5902> <5902> <9AE7>
+<5909> <5909> <95CF>
+<590A> <590A> <9AE8>
+<590F> <590F> <89C4>
+<5910> <5910> <9AE9>
+<5915> <5915> <975B>
+<5916> <5916> <8A4F>
+<5918> <5918> <99C7>
+<5919> <5919> <8F67>
+<591A> <591A> <91BD>
+<591B> <591B> <9AEA>
+<591C> <591C> <96E9>
+<5922> <5922> <96B2>
+<5925> <5925> <9AEC>
+<5927> <5927> <91E5>
+<5929> <5929> <9356>
+<592A> <592A> <91BE>
+<592B> <592B> <9576>
+<592C> <592D> <9AED>
+<592E> <592E> <899B>
+<5931> <5931> <8EB8>
+<5932> <5932> <9AEF>
+<5937> <5937> <88CE>
+<5938> <5938> <9AF0>
+<593E> <593E> <9AF1>
+<5944> <5944> <8982>
+<5947> <5947> <8AEF>
+<5948> <5948> <93DE>
+<5949> <5949> <95F2>
+<594E> <594E> <9AF5>
+<594F> <594F> <9174>
+<5950> <5950> <9AF4>
+<5951> <5951> <8C5F>
+<5954> <5954> <967A>
+<5955> <5955> <9AF3>
+<5957> <5957> <9385>
+<5958> <5958> <9AF7>
+<595A> <595A> <9AF6>
+<5960> <5960> <9AF9>
+<5962> <5962> <9AF8>
+<5965> <5965> <899C>
+<5967> <5967> <9AFA>
+<5968> <5968> <8FA7>
+<5969> <5969> <9AFC>
+<596A> <596A> <9244>
+<596C> <596C> <9AFB>
+<596E> <596E> <95B1>
+<5973> <5973> <8F97>
+<5974> <5974> <937A>
+<5978> <5978> <9B40>
+<597D> <597D> <8D44>
+<5981> <5981> <9B41>
+endbfrange
+
+100 beginbfrange
+<5982> <5982> <9440>
+<5983> <5983> <94DC>
+<5984> <5984> <96CF>
+<598A> <598A> <9444>
+<598D> <598D> <9B4A>
+<5993> <5993> <8B57>
+<5996> <5996> <9764>
+<5999> <5999> <96AD>
+<599B> <599B> <9BAA>
+<599D> <599D> <9B42>
+<59A3> <59A3> <9B45>
+<59A5> <59A5> <91C3>
+<59A8> <59A8> <9657>
+<59AC> <59AC> <9369>
+<59B2> <59B2> <9B46>
+<59B9> <59B9> <9685>
+<59BB> <59BB> <8DC8>
+<59BE> <59BE> <8FA8>
+<59C6> <59C6> <9B47>
+<59C9> <59C9> <8E6F>
+<59CB> <59CB> <8E6E>
+<59D0> <59D0> <88B7>
+<59D1> <59D1> <8CC6>
+<59D3> <59D3> <90A9>
+<59D4> <59D4> <88CF>
+<59D9> <59DA> <9B4B>
+<59DC> <59DC> <9B49>
+<59E5> <59E5> <8957>
+<59E6> <59E6> <8AAD>
+<59E8> <59E8> <9B48>
+<59EA> <59EA> <96C3>
+<59EB> <59EB> <9550>
+<59F6> <59F6> <88A6>
+<59FB> <59FB> <88F7>
+<59FF> <59FF> <8E70>
+<5A01> <5A01> <88D0>
+<5A03> <5A03> <88A1>
+<5A09> <5A09> <9B51>
+<5A11> <5A11> <9B4F>
+<5A18> <5A18> <96BA>
+<5A1A> <5A1A> <9B52>
+<5A1C> <5A1C> <9B50>
+<5A1F> <5A1F> <9B4E>
+<5A20> <5A20> <9050>
+<5A25> <5A25> <9B4D>
+<5A29> <5A29> <95D8>
+<5A2F> <5A2F> <8CE2>
+<5A35> <5A36> <9B56>
+<5A3C> <5A3C> <8FA9>
+<5A40> <5A40> <9B53>
+<5A41> <5A41> <984B>
+<5A46> <5A46> <946B>
+<5A49> <5A49> <9B55>
+<5A5A> <5A5A> <8DA5>
+<5A62> <5A62> <9B58>
+<5A66> <5A66> <9577>
+<5A6A> <5A6A> <9B59>
+<5A6C> <5A6C> <9B54>
+<5A7F> <5A7F> <96B9>
+<5A92> <5A92> <947D>
+<5A9A> <5A9A> <9B5A>
+<5A9B> <5A9B> <9551>
+<5ABC> <5ABC> <9B5B>
+<5ABD> <5ABD> <9B5F>
+<5ABE> <5ABE> <9B5C>
+<5AC1> <5AC1> <89C5>
+<5AC2> <5AC2> <9B5E>
+<5AC9> <5AC9> <8EB9>
+<5ACB> <5ACB> <9B5D>
+<5ACC> <5ACC> <8C99>
+<5AD0> <5AD0> <9B6B>
+<5AD6> <5AD6> <9B64>
+<5AD7> <5AD7> <9B61>
+<5AE1> <5AE1> <9284>
+<5AE3> <5AE3> <9B60>
+<5AE6> <5AE6> <9B62>
+<5AE9> <5AE9> <9B63>
+<5AFA> <5AFB> <9B65>
+<5B09> <5B09> <8AF0>
+<5B0B> <5B0B> <9B68>
+<5B0C> <5B0C> <9B67>
+<5B16> <5B16> <9B69>
+<5B22> <5B22> <8FEC>
+<5B2A> <5B2A> <9B6C>
+<5B2C> <5B2C> <92DA>
+<5B30> <5B30> <8964>
+<5B32> <5B32> <9B6A>
+<5B36> <5B36> <9B6D>
+<5B3E> <5B3E> <9B6E>
+<5B40> <5B40> <9B71>
+<5B43> <5B43> <9B6F>
+<5B45> <5B45> <9B70>
+<5B50> <5B50> <8E71>
+<5B51> <5B51> <9B72>
+<5B54> <5B54> <8D45>
+<5B55> <5B55> <9B73>
+<5B57> <5B57> <8E9A>
+<5B58> <5B58> <91B6>
+<5B5A> <5B5B> <9B74>
+<5B5C> <5B5C> <8E79>
+endbfrange
+
+100 beginbfrange
+<5B5D> <5B5D> <8D46>
+<5B5F> <5B5F> <96D0>
+<5B63> <5B63> <8B47>
+<5B64> <5B64> <8CC7>
+<5B65> <5B65> <9B76>
+<5B66> <5B66> <8A77>
+<5B69> <5B69> <9B77>
+<5B6B> <5B6B> <91B7>
+<5B70> <5B70> <9B78>
+<5B71> <5B71> <9BA1>
+<5B73> <5B73> <9B79>
+<5B75> <5B75> <9B7A>
+<5B78> <5B78> <9B7B>
+<5B7A> <5B7A> <9B7D>
+<5B80> <5B80> <9B7E>
+<5B83> <5B83> <9B80>
+<5B85> <5B85> <91EE>
+<5B87> <5B87> <8946>
+<5B88> <5B88> <8EE7>
+<5B89> <5B89> <88C0>
+<5B8B> <5B8B> <9176>
+<5B8C> <5B8C> <8AAE>
+<5B8D> <5B8D> <8EB3>
+<5B8F> <5B8F> <8D47>
+<5B95> <5B95> <9386>
+<5B97> <5B97> <8F40>
+<5B98> <5B98> <8AAF>
+<5B99> <5B99> <9288>
+<5B9A> <5B9A> <92E8>
+<5B9B> <5B9B> <88B6>
+<5B9C> <5B9C> <8B58>
+<5B9D> <5B9D> <95F3>
+<5B9F> <5B9F> <8EC0>
+<5BA2> <5BA2> <8B71>
+<5BA3> <5BA3> <90E9>
+<5BA4> <5BA4> <8EBA>
+<5BA5> <5BA5> <9747>
+<5BA6> <5BA6> <9B81>
+<5BAE> <5BAE> <8B7B>
+<5BB0> <5BB0> <8DC9>
+<5BB3> <5BB3> <8A51>
+<5BB4> <5BB4> <8983>
+<5BB5> <5BB5> <8FAA>
+<5BB6> <5BB6> <89C6>
+<5BB8> <5BB8> <9B82>
+<5BB9> <5BB9> <9765>
+<5BBF> <5BBF> <8F68>
+<5BC2> <5BC2> <8EE2>
+<5BC3> <5BC3> <9B83>
+<5BC4> <5BC4> <8AF1>
+<5BC5> <5BC5> <93D0>
+<5BC6> <5BC6> <96A7>
+<5BC7> <5BC7> <9B84>
+<5BC9> <5BC9> <9B85>
+<5BCC> <5BCC> <9578>
+<5BD0> <5BD0> <9B87>
+<5BD2> <5BD2> <8AA6>
+<5BD3> <5BD3> <8BF5>
+<5BD4> <5BD4> <9B86>
+<5BDB> <5BDB> <8AB0>
+<5BDD> <5BDD> <9051>
+<5BDE> <5BDE> <9B8B>
+<5BDF> <5BDF> <8E40>
+<5BE1> <5BE1> <89C7>
+<5BE2> <5BE2> <9B8A>
+<5BE4> <5BE4> <9B88>
+<5BE5> <5BE5> <9B8C>
+<5BE6> <5BE6> <9B89>
+<5BE7> <5BE7> <944A>
+<5BE8> <5BE8> <9ECB>
+<5BE9> <5BE9> <9052>
+<5BEB> <5BEB> <9B8D>
+<5BEE> <5BEE> <97BE>
+<5BF0> <5BF0> <9B8E>
+<5BF3> <5BF3> <9B90>
+<5BF5> <5BF5> <929E>
+<5BF6> <5BF6> <9B8F>
+<5BF8> <5BF8> <90A1>
+<5BFA> <5BFA> <8E9B>
+<5BFE> <5BFE> <91CE>
+<5BFF> <5BFF> <8EF5>
+<5C01> <5C01> <9595>
+<5C02> <5C02> <90EA>
+<5C04> <5C04> <8ECB>
+<5C05> <5C05> <9B91>
+<5C06> <5C06> <8FAB>
+<5C07> <5C08> <9B92>
+<5C09> <5C09> <88D1>
+<5C0A> <5C0A> <91B8>
+<5C0B> <5C0B> <9071>
+<5C0D> <5C0D> <9B94>
+<5C0E> <5C0E> <93B1>
+<5C0F> <5C0F> <8FAC>
+<5C11> <5C11> <8FAD>
+<5C13> <5C13> <9B95>
+<5C16> <5C16> <90EB>
+<5C1A> <5C1A> <8FAE>
+<5C20> <5C20> <9B96>
+<5C22> <5C22> <9B97>
+<5C24> <5C24> <96DE>
+endbfrange
+
+100 beginbfrange
+<5C28> <5C28> <9B98>
+<5C2D> <5C2D> <8BC4>
+<5C31> <5C31> <8F41>
+<5C38> <5C39> <9B99>
+<5C3A> <5C3A> <8EDA>
+<5C3B> <5C3B> <904B>
+<5C3C> <5C3C> <93F2>
+<5C3D> <5C3D> <9073>
+<5C3E> <5C3E> <94F6>
+<5C3F> <5C3F> <9441>
+<5C40> <5C40> <8BC7>
+<5C41> <5C41> <9B9B>
+<5C45> <5C45> <8B8F>
+<5C46> <5C46> <9B9C>
+<5C48> <5C48> <8BFC>
+<5C4A> <5C4A> <93CD>
+<5C4B> <5C4B> <89AE>
+<5C4D> <5C4D> <8E72>
+<5C4E> <5C4E> <9B9D>
+<5C4F> <5C4F> <9BA0>
+<5C50> <5C50> <9B9F>
+<5C51> <5C51> <8BFB>
+<5C53> <5C53> <9B9E>
+<5C55> <5C55> <9357>
+<5C5B> <5C5B> <9BA0>
+<5C5E> <5C5E> <91AE>
+<5C60> <5C60> <936A>
+<5C61> <5C61> <8EC6>
+<5C62> <5C62> <8EC6>
+<5C64> <5C64> <9177>
+<5C65> <5C65> <979A>
+<5C6C> <5C6C> <9BA2>
+<5C6E> <5C6E> <9BA3>
+<5C6F> <5C6F> <93D4>
+<5C71> <5C71> <8E52>
+<5C76> <5C76> <9BA5>
+<5C79> <5C79> <9BA6>
+<5C8C> <5C8C> <9BA7>
+<5C90> <5C90> <8AF2>
+<5C91> <5C91> <9BA8>
+<5C94> <5C94> <9BA9>
+<5CA1> <5CA1> <89AA>
+<5CA8> <5CA8> <915A>
+<5CA9> <5CA9> <8AE2>
+<5CAB> <5CAB> <9BAB>
+<5CAC> <5CAC> <96A6>
+<5CB1> <5CB1> <91D0>
+<5CB3> <5CB3> <8A78>
+<5CB6> <5CB6> <9BAD>
+<5CB7> <5CB7> <9BAF>
+<5CB8> <5CB8> <8ADD>
+<5CBB> <5CBB> <9BAC>
+<5CBC> <5CBC> <9BAE>
+<5CBE> <5CBE> <9BB1>
+<5CC5> <5CC5> <9BB0>
+<5CC7> <5CC7> <9BB2>
+<5CD9> <5CD9> <9BB3>
+<5CE0> <5CE0> <93BB>
+<5CE1> <5CE1> <8BAC>
+<5CE8> <5CE8> <89E3>
+<5CE9> <5CE9> <9BB4>
+<5CEA> <5CEA> <9BB9>
+<5CED> <5CED> <9BB7>
+<5CEF> <5CEF> <95F5>
+<5CF0> <5CF0> <95F4>
+<5CF6> <5CF6> <9387>
+<5CFA> <5CFA> <9BB6>
+<5CFB> <5CFB> <8F73>
+<5CFD> <5CFD> <9BB5>
+<5D07> <5D07> <9092>
+<5D0B> <5D0B> <9BBA>
+<5D0E> <5D0E> <8DE8>
+<5D11> <5D11> <9BC0>
+<5D14> <5D14> <9BC1>
+<5D15> <5D15> <9BBB>
+<5D16> <5D16> <8A52>
+<5D17> <5D17> <9BBC>
+<5D18> <5D18> <9BC5>
+<5D19> <5D19> <9BC4>
+<5D1A> <5D1A> <9BC3>
+<5D1B> <5D1B> <9BBF>
+<5D1F> <5D1F> <9BBE>
+<5D22> <5D22> <9BC2>
+<5D29> <5D29> <95F6>
+<5D4B> <5D4B> <9BC9>
+<5D4C> <5D4C> <9BC6>
+<5D4E> <5D4E> <9BC8>
+<5D50> <5D50> <9792>
+<5D52> <5D52> <9BC7>
+<5D5C> <5D5C> <9BBD>
+<5D69> <5D69> <9093>
+<5D6C> <5D6C> <9BCA>
+<5D6F> <5D6F> <8DB5>
+<5D73> <5D73> <9BCB>
+<5D76> <5D76> <9BCC>
+<5D82> <5D82> <9BCF>
+<5D84> <5D84> <9BCE>
+<5D87> <5D87> <9BCD>
+<5D8B> <5D8B> <9388>
+<5D8C> <5D8C> <9BB8>
+endbfrange
+
+100 beginbfrange
+<5D90> <5D90> <9BD5>
+<5D9D> <5D9D> <9BD1>
+<5DA2> <5DA2> <9BD0>
+<5DAC> <5DAC> <9BD2>
+<5DAE> <5DAE> <9BD3>
+<5DB7> <5DB7> <9BD6>
+<5DBA> <5DBA> <97E4>
+<5DBC> <5DBC> <9BD7>
+<5DBD> <5DBD> <9BD4>
+<5DC9> <5DC9> <9BD8>
+<5DCC> <5DCC> <8ADE>
+<5DCD> <5DCD> <9BD9>
+<5DD2> <5DD2> <9BDB>
+<5DD3> <5DD3> <9BDA>
+<5DD6> <5DD6> <9BDC>
+<5DDB> <5DDB> <9BDD>
+<5DDD> <5DDD> <90EC>
+<5DDE> <5DDE> <8F42>
+<5DE1> <5DE1> <8F84>
+<5DE3> <5DE3> <9183>
+<5DE5> <5DE5> <8D48>
+<5DE6> <5DE6> <8DB6>
+<5DE7> <5DE7> <8D49>
+<5DE8> <5DE8> <8B90>
+<5DEB> <5DEB> <9BDE>
+<5DEE> <5DEE> <8DB7>
+<5DF1> <5DF1> <8CC8>
+<5DF2> <5DF2> <9BDF>
+<5DF3> <5DF3> <96A4>
+<5DF4> <5DF4> <9462>
+<5DF5> <5DF5> <9BE0>
+<5DF7> <5DF7> <8D4A>
+<5DFB> <5DFB> <8AAA>
+<5DFD> <5DFD> <9246>
+<5DFE> <5DFE> <8BD0>
+<5E02> <5E02> <8E73>
+<5E03> <5E03> <957A>
+<5E06> <5E06> <94BF>
+<5E0B> <5E0B> <9BE1>
+<5E0C> <5E0C> <8AF3>
+<5E11> <5E11> <9BE4>
+<5E16> <5E16> <929F>
+<5E19> <5E19> <9BE3>
+<5E1A> <5E1A> <9BE2>
+<5E1B> <5E1B> <9BE5>
+<5E1D> <5E1D> <92E9>
+<5E25> <5E25> <9083>
+<5E2B> <5E2B> <8E74>
+<5E2D> <5E2D> <90C8>
+<5E2F> <5E2F> <91D1>
+<5E30> <5E30> <8B41>
+<5E33> <5E33> <92A0>
+<5E36> <5E37> <9BE6>
+<5E38> <5E38> <8FED>
+<5E3D> <5E3D> <9658>
+<5E40> <5E40> <9BEA>
+<5E43> <5E43> <9BE9>
+<5E44> <5E44> <9BE8>
+<5E45> <5E45> <959D>
+<5E47> <5E47> <9BF1>
+<5E4C> <5E4C> <9679>
+<5E4E> <5E4E> <9BEB>
+<5E54> <5E54> <9BED>
+<5E55> <5E55> <968B>
+<5E57> <5E57> <9BEC>
+<5E5F> <5E5F> <9BEE>
+<5E61> <5E61> <94A6>
+<5E62> <5E62> <9BEF>
+<5E63> <5E63> <95BC>
+<5E64> <5E64> <9BF0>
+<5E72> <5E72> <8AB1>
+<5E73> <5E73> <95BD>
+<5E74> <5E74> <944E>
+<5E75> <5E76> <9BF2>
+<5E78> <5E78> <8D4B>
+<5E79> <5E79> <8AB2>
+<5E7A> <5E7A> <9BF4>
+<5E7B> <5E7B> <8CB6>
+<5E7C> <5E7C> <9763>
+<5E7D> <5E7D> <9748>
+<5E7E> <5E7E> <8AF4>
+<5E7F> <5E7F> <9BF6>
+<5E81> <5E81> <92A1>
+<5E83> <5E83> <8D4C>
+<5E84> <5E84> <8FAF>
+<5E87> <5E87> <94DD>
+<5E8A> <5E8A> <8FB0>
+<5E8F> <5E8F> <8F98>
+<5E95> <5E95> <92EA>
+<5E96> <5E96> <95F7>
+<5E97> <5E97> <9358>
+<5E9A> <5E9A> <8D4D>
+<5E9C> <5E9C> <957B>
+<5EA0> <5EA0> <9BF7>
+<5EA6> <5EA6> <9378>
+<5EA7> <5EA7> <8DC0>
+<5EAB> <5EAB> <8CC9>
+<5EAD> <5EAD> <92EB>
+<5EB5> <5EB5> <88C1>
+<5EB6> <5EB6> <8F8E>
+endbfrange
+
+100 beginbfrange
+<5EB7> <5EB7> <8D4E>
+<5EB8> <5EB8> <9766>
+<5EC1> <5EC2> <9BF8>
+<5EC3> <5EC3> <9470>
+<5EC8> <5EC8> <9BFA>
+<5EC9> <5EC9> <97F5>
+<5ECA> <5ECA> <984C>
+<5ECF> <5ECF> <9BFC>
+<5ED0> <5ED0> <9BFB>
+<5ED3> <5ED3> <8A66>
+<5ED6> <5ED6> <9C40>
+<5EDA> <5EDB> <9C43>
+<5EDD> <5EDD> <9C42>
+<5EDF> <5EDF> <955F>
+<5EE0> <5EE0> <8FB1>
+<5EE1> <5EE1> <9C46>
+<5EE2> <5EE2> <9C45>
+<5EE3> <5EE3> <9C41>
+<5EE8> <5EE9> <9C47>
+<5EEC> <5EEC> <9C49>
+<5EF0> <5EF0> <9C4C>
+<5EF1> <5EF1> <9C4A>
+<5EF3> <5EF3> <9C4B>
+<5EF4> <5EF4> <9C4D>
+<5EF6> <5EF6> <8984>
+<5EF7> <5EF7> <92EC>
+<5EF8> <5EF8> <9C4E>
+<5EFA> <5EFA> <8C9A>
+<5EFB> <5EFB> <89F4>
+<5EFC> <5EFC> <9455>
+<5EFE> <5EFE> <9C4F>
+<5EFF> <5EFF> <93F9>
+<5F01> <5F01> <95D9>
+<5F03> <5F03> <9C50>
+<5F04> <5F04> <984D>
+<5F09> <5F09> <9C51>
+<5F0A> <5F0A> <95BE>
+<5F0B> <5F0B> <9C54>
+<5F0C> <5F0C> <989F>
+<5F0D> <5F0D> <98AF>
+<5F0F> <5F0F> <8EAE>
+<5F10> <5F10> <93F3>
+<5F11> <5F11> <9C55>
+<5F13> <5F13> <8B7C>
+<5F14> <5F14> <92A2>
+<5F15> <5F15> <88F8>
+<5F16> <5F16> <9C56>
+<5F17> <5F17> <95A4>
+<5F18> <5F18> <8D4F>
+<5F1B> <5F1B> <926F>
+<5F1F> <5F1F> <92ED>
+<5F25> <5F25> <96ED>
+<5F26> <5F26> <8CB7>
+<5F27> <5F27> <8CCA>
+<5F29> <5F29> <9C57>
+<5F2D> <5F2D> <9C58>
+<5F2F> <5F2F> <9C5E>
+<5F31> <5F31> <8EE3>
+<5F35> <5F35> <92A3>
+<5F37> <5F37> <8BAD>
+<5F38> <5F38> <9C59>
+<5F3C> <5F3C> <954A>
+<5F3E> <5F3E> <9265>
+<5F41> <5F41> <9C5A>
+<5F48> <5F48> <9C5B>
+<5F4A> <5F4A> <8BAE>
+<5F4C> <5F4C> <9C5C>
+<5F4E> <5F4E> <9C5D>
+<5F51> <5F51> <9C5F>
+<5F53> <5F53> <9396>
+<5F56> <5F57> <9C60>
+<5F59> <5F59> <9C62>
+<5F5C> <5F5C> <9C53>
+<5F5D> <5F5D> <9C52>
+<5F61> <5F61> <9C63>
+<5F62> <5F62> <8C60>
+<5F66> <5F66> <9546>
+<5F69> <5F69> <8DCA>
+<5F6A> <5F6A> <9556>
+<5F6B> <5F6B> <92A4>
+<5F6C> <5F6C> <956A>
+<5F6D> <5F6D> <9C64>
+<5F70> <5F70> <8FB2>
+<5F71> <5F71> <8965>
+<5F73> <5F73> <9C65>
+<5F77> <5F77> <9C66>
+<5F79> <5F79> <96F0>
+<5F7C> <5F7C> <94DE>
+<5F7F> <5F7F> <9C69>
+<5F80> <5F80> <899D>
+<5F81> <5F81> <90AA>
+<5F82> <5F82> <9C68>
+<5F83> <5F83> <9C67>
+<5F84> <5F84> <8C61>
+<5F85> <5F85> <91D2>
+<5F87> <5F87> <9C6D>
+<5F88> <5F88> <9C6B>
+<5F8A> <5F8A> <9C6A>
+<5F8B> <5F8B> <97A5>
+<5F8C> <5F8C> <8CE3>
+endbfrange
+
+100 beginbfrange
+<5F90> <5F90> <8F99>
+<5F91> <5F91> <9C6C>
+<5F92> <5F92> <936B>
+<5F93> <5F93> <8F5D>
+<5F97> <5F97> <93BE>
+<5F98> <5F98> <9C70>
+<5F99> <5F99> <9C6F>
+<5F9E> <5F9E> <9C6E>
+<5FA0> <5FA0> <9C71>
+<5FA1> <5FA1> <8CE4>
+<5FA8> <5FA8> <9C72>
+<5FA9> <5FA9> <959C>
+<5FAA> <5FAA> <8F7A>
+<5FAD> <5FAD> <9C73>
+<5FAE> <5FAE> <94F7>
+<5FB3> <5FB3> <93BF>
+<5FB4> <5FB4> <92A5>
+<5FB9> <5FB9> <934F>
+<5FBC> <5FBC> <9C74>
+<5FBD> <5FBD> <8B4A>
+<5FC3> <5FC3> <9053>
+<5FC5> <5FC5> <954B>
+<5FCC> <5FCC> <8AF5>
+<5FCD> <5FCD> <9445>
+<5FD6> <5FD6> <9C75>
+<5FD7> <5FD7> <8E75>
+<5FD8> <5FD9> <9659>
+<5FDC> <5FDC> <899E>
+<5FDD> <5FDD> <9C7A>
+<5FE0> <5FE0> <9289>
+<5FE4> <5FE4> <9C77>
+<5FEB> <5FEB> <89F5>
+<5FF0> <5FF0> <9CAB>
+<5FF1> <5FF1> <9C79>
+<5FF5> <5FF5> <944F>
+<5FF8> <5FF8> <9C78>
+<5FFB> <5FFB> <9C76>
+<5FFD> <5FFD> <8D9A>
+<5FFF> <5FFF> <9C7C>
+<600E> <600E> <9C83>
+<600F> <600F> <9C89>
+<6010> <6010> <9C81>
+<6012> <6012> <937B>
+<6015> <6015> <9C86>
+<6016> <6016> <957C>
+<6019> <6019> <9C80>
+<601B> <601B> <9C85>
+<601C> <601C> <97E5>
+<601D> <601D> <8E76>
+<6020> <6020> <91D3>
+<6021> <6021> <9C7D>
+<6025> <6025> <8B7D>
+<6026> <6026> <9C88>
+<6027> <6027> <90AB>
+<6028> <6028> <8985>
+<6029> <6029> <9C82>
+<602A> <602A> <89F6>
+<602B> <602B> <9C87>
+<602F> <602F> <8BAF>
+<6031> <6031> <9C84>
+<603A> <603A> <9C8A>
+<6041> <6041> <9C8C>
+<6042> <6042> <9C96>
+<6043> <6043> <9C94>
+<6046> <6046> <9C91>
+<604A> <604A> <9C90>
+<604B> <604B> <97F6>
+<604D> <604D> <9C92>
+<6050> <6050> <8BB0>
+<6052> <6052> <8D50>
+<6055> <6055> <8F9A>
+<6059> <6059> <9C99>
+<605A> <605A> <9C8B>
+<605F> <605F> <9C8F>
+<6060> <6060> <9C7E>
+<6062> <6062> <89F8>
+<6063> <6063> <9C93>
+<6064> <6064> <9C95>
+<6065> <6065> <9270>
+<6068> <6068> <8DA6>
+<6069> <6069> <89B6>
+<606A> <606A> <9C8D>
+<606B> <606B> <9C98>
+<606C> <606C> <9C97>
+<606D> <606D> <8BB1>
+<606F> <606F> <91A7>
+<6070> <6070> <8A86>
+<6075> <6075> <8C62>
+<6077> <6077> <9C8E>
+<6081> <6081> <9C9A>
+<6083> <6083> <9C9D>
+<6084> <6084> <9C9F>
+<6089> <6089> <8EBB>
+<608B> <608B> <9CA5>
+<608C> <608C> <92EE>
+<608D> <608D> <9C9B>
+<6092> <6092> <9CA3>
+<6094> <6094> <89F7>
+<6096> <6097> <9CA1>
+<609A> <609A> <9C9E>
+endbfrange
+
+100 beginbfrange
+<609B> <609B> <9CA0>
+<609F> <609F> <8CE5>
+<60A0> <60A0> <9749>
+<60A3> <60A3> <8AB3>
+<60A6> <60A6> <8978>
+<60A7> <60A7> <9CA4>
+<60A9> <60A9> <9459>
+<60AA> <60AA> <88AB>
+<60B2> <60B2> <94DF>
+<60B3> <60B3> <9C7B>
+<60B4> <60B4> <9CAA>
+<60B5> <60B5> <9CAE>
+<60B6> <60B6> <96E3>
+<60B8> <60B8> <9CA7>
+<60BC> <60BC> <9389>
+<60BD> <60BD> <9CAC>
+<60C5> <60C5> <8FEE>
+<60C6> <60C6> <9CAD>
+<60C7> <60C7> <93D5>
+<60D1> <60D1> <9866>
+<60D3> <60D3> <9CA9>
+<60D8> <60D8> <9CAF>
+<60DA> <60DA> <8D9B>
+<60DC> <60DC> <90C9>
+<60DF> <60DF> <88D2>
+<60E0> <60E0> <9CA8>
+<60E1> <60E1> <9CA6>
+<60E3> <60E3> <9179>
+<60E7> <60E7> <9C9C>
+<60E8> <60E8> <8E53>
+<60F0> <60F0> <91C4>
+<60F1> <60F1> <9CBB>
+<60F3> <60F3> <917A>
+<60F4> <60F4> <9CB6>
+<60F6> <60F7> <9CB3>
+<60F9> <60F9> <8EE4>
+<60FA> <60FA> <9CB7>
+<60FB> <60FB> <9CBA>
+<6100> <6100> <9CB5>
+<6101> <6101> <8F44>
+<6103> <6103> <9CB8>
+<6106> <6106> <9CB2>
+<6108> <6108> <96FA>
+<6109> <6109> <96F9>
+<610D> <610E> <9CBC>
+<610F> <610F> <88D3>
+<6115> <6115> <9CB1>
+<611A> <611A> <8BF0>
+<611B> <611B> <88A4>
+<611F> <611F> <8AB4>
+<6121> <6121> <9CB9>
+<6127> <6127> <9CC1>
+<6128> <6128> <9CC0>
+<612C> <612C> <9CC5>
+<6134> <6134> <9CC6>
+<613C> <613C> <9CC4>
+<613D> <613D> <9CC7>
+<613E> <613E> <9CBF>
+<613F> <613F> <9CC3>
+<6142> <6142> <9CC8>
+<6144> <6144> <9CC9>
+<6147> <6147> <9CBE>
+<6148> <6148> <8E9C>
+<614A> <614A> <9CC2>
+<614B> <614B> <91D4>
+<614C> <614C> <8D51>
+<614D> <614D> <9CB0>
+<614E> <614E> <9054>
+<6153> <6153> <9CD6>
+<6155> <6155> <95E7>
+<6158> <615A> <9CCC>
+<615D> <615D> <9CD5>
+<615F> <615F> <9CD4>
+<6162> <6162> <969D>
+<6163> <6163> <8AB5>
+<6165> <6165> <9CD2>
+<6167> <6167> <8C64>
+<6168> <6168> <8A53>
+<616B> <616B> <9CCF>
+<616E> <616E> <97B6>
+<616F> <616F> <9CD1>
+<6170> <6170> <88D4>
+<6171> <6171> <9CD3>
+<6173> <6173> <9CCA>
+<6174> <6174> <9CD0>
+<6175> <6175> <9CD7>
+<6176> <6176> <8C63>
+<6177> <6177> <9CCB>
+<617E> <617E> <977C>
+<6182> <6182> <974A>
+<6187> <6187> <9CDA>
+<618A> <618A> <9CDE>
+<618E> <618E> <919E>
+<6190> <6190> <97F7>
+<6191> <6191> <9CDF>
+<6194> <6194> <9CDC>
+<6196> <6196> <9CD9>
+<6199> <6199> <9CD8>
+<619A> <619A> <9CDD>
+<61A4> <61A4> <95AE>
+endbfrange
+
+100 beginbfrange
+<61A7> <61A7> <93B2>
+<61A9> <61A9> <8C65>
+<61AB> <61AB> <9CE0>
+<61AC> <61AC> <9CDB>
+<61AE> <61AE> <9CE1>
+<61B2> <61B2> <8C9B>
+<61B6> <61B6> <89AF>
+<61BA> <61BA> <9CE9>
+<61BE> <61BE> <8AB6>
+<61C3> <61C3> <9CE7>
+<61C6> <61C6> <9CE8>
+<61C7> <61C7> <8DA7>
+<61C8> <61C8> <9CE6>
+<61C9> <61C9> <9CE4>
+<61CA> <61CA> <9CE3>
+<61CB> <61CB> <9CEA>
+<61CC> <61CC> <9CE2>
+<61CD> <61CD> <9CEC>
+<61D0> <61D0> <89F9>
+<61E3> <61E3> <9CEE>
+<61E6> <61E6> <9CED>
+<61F2> <61F2> <92A6>
+<61F4> <61F4> <9CF1>
+<61F6> <61F6> <9CEF>
+<61F7> <61F7> <9CE5>
+<61F8> <61F8> <8C9C>
+<61FA> <61FA> <9CF0>
+<61FC> <61FC> <9CF4>
+<61FD> <61FD> <9CF3>
+<61FE> <61FE> <9CF5>
+<61FF> <61FF> <9CF2>
+<6200> <6200> <9CF6>
+<6208> <6209> <9CF7>
+<620A> <620A> <95E8>
+<620C> <620C> <9CFA>
+<620D> <620D> <9CF9>
+<620E> <620E> <8F5E>
+<6210> <6210> <90AC>
+<6211> <6211> <89E4>
+<6212> <6212> <89FA>
+<6214> <6214> <9CFB>
+<6216> <6216> <88BD>
+<621A> <621A> <90CA>
+<621B> <621B> <9CFC>
+<621D> <621D> <E6C1>
+<621E> <621E> <9D40>
+<621F> <621F> <8C81>
+<6221> <6221> <9D41>
+<6226> <6226> <90ED>
+<622A> <622A> <9D42>
+<622E> <622E> <9D43>
+<622F> <622F> <8B59>
+<6230> <6230> <9D44>
+<6232> <6233> <9D45>
+<6234> <6234> <91D5>
+<6238> <6238> <8CCB>
+<623B> <623B> <96DF>
+<623F> <623F> <965B>
+<6240> <6240> <8F8A>
+<6241> <6241> <9D47>
+<6247> <6247> <90EE>
+<6248> <6248> <E7BB>
+<6249> <6249> <94E0>
+<624B> <624B> <8EE8>
+<624D> <624D> <8DCB>
+<624E> <624E> <9D48>
+<6253> <6253> <91C5>
+<6255> <6255> <95A5>
+<6258> <6258> <91EF>
+<625B> <625B> <9D4B>
+<625E> <625E> <9D49>
+<6260> <6260> <9D4C>
+<6263> <6263> <9D4A>
+<6268> <6268> <9D4D>
+<626E> <626E> <95AF>
+<6271> <6271> <88B5>
+<6276> <6276> <957D>
+<6279> <6279> <94E1>
+<627C> <627C> <9D4E>
+<627E> <627E> <9D51>
+<627F> <627F> <8FB3>
+<6280> <6280> <8B5A>
+<6282> <6282> <9D4F>
+<6283> <6283> <9D56>
+<6284> <6284> <8FB4>
+<6289> <6289> <9D50>
+<628A> <628A> <9463>
+<6291> <6291> <977D>
+<6292> <6293> <9D52>
+<6294> <6294> <9D57>
+<6295> <6295> <938A>
+<6296> <6296> <9D54>
+<6297> <6297> <8D52>
+<6298> <6298> <90DC>
+<629B> <629B> <9D65>
+<629C> <629C> <94B2>
+<629E> <629E> <91F0>
+<62AB> <62AB> <94E2>
+<62AC> <62AC> <9DAB>
+<62B1> <62B1> <95F8>
+endbfrange
+
+100 beginbfrange
+<62B5> <62B5> <92EF>
+<62B9> <62B9> <9695>
+<62BB> <62BB> <9D5A>
+<62BC> <62BC> <899F>
+<62BD> <62BD> <928A>
+<62C2> <62C2> <9D63>
+<62C5> <62C5> <9253>
+<62C6> <62C6> <9D5D>
+<62C7> <62C7> <9D64>
+<62C8> <62C8> <9D5F>
+<62C9> <62C9> <9D66>
+<62CA> <62CA> <9D62>
+<62CC> <62CC> <9D61>
+<62CD> <62CD> <948F>
+<62CF> <62CF> <9D5B>
+<62D0> <62D0> <89FB>
+<62D1> <62D1> <9D59>
+<62D2> <62D2> <8B91>
+<62D3> <62D3> <91F1>
+<62D4> <62D4> <9D55>
+<62D7> <62D7> <9D58>
+<62D8> <62D8> <8D53>
+<62D9> <62D9> <90D9>
+<62DB> <62DB> <8FB5>
+<62DC> <62DC> <9D60>
+<62DD> <62DD> <9471>
+<62E0> <62E0> <8B92>
+<62E1> <62E1> <8A67>
+<62EC> <62EC> <8A87>
+<62ED> <62ED> <9040>
+<62EE> <62EE> <9D68>
+<62EF> <62EF> <9D6D>
+<62F1> <62F1> <9D69>
+<62F3> <62F3> <8C9D>
+<62F5> <62F5> <9D6E>
+<62F6> <62F6> <8E41>
+<62F7> <62F7> <8D89>
+<62FE> <62FE> <8F45>
+<62FF> <62FF> <9D5C>
+<6301> <6301> <8E9D>
+<6302> <6302> <9D6B>
+<6307> <6307> <8E77>
+<6308> <6308> <9D6C>
+<6309> <6309> <88C2>
+<630C> <630C> <9D67>
+<6311> <6311> <92A7>
+<6319> <6319> <8B93>
+<631F> <631F> <8BB2>
+<6327> <6327> <9D6A>
+<6328> <6328> <88A5>
+<632B> <632B> <8DC1>
+<632F> <632F> <9055>
+<633A> <633A> <92F0>
+<633D> <633D> <94D2>
+<633E> <633E> <9D70>
+<633F> <633F> <917D>
+<6349> <6349> <91A8>
+<634C> <634C> <8E4A>
+<634D> <634D> <9D71>
+<634F> <634F> <9D73>
+<6350> <6350> <9D6F>
+<6355> <6355> <95DF>
+<6357> <6357> <92BB>
+<635C> <635C> <917B>
+<6367> <6367> <95F9>
+<6368> <6368> <8ECC>
+<6369> <6369> <9D80>
+<636B> <636B> <9D7E>
+<636E> <636E> <9098>
+<6372> <6372> <8C9E>
+<6376> <6376> <9D78>
+<6377> <6377> <8FB7>
+<637A> <637A> <93E6>
+<637B> <637B> <9450>
+<6380> <6380> <9D76>
+<6383> <6383> <917C>
+<6388> <6388> <8EF6>
+<6389> <6389> <9D7B>
+<638C> <638C> <8FB6>
+<638E> <638E> <9D75>
+<638F> <638F> <9D7A>
+<6392> <6392> <9472>
+<6396> <6396> <9D74>
+<6398> <6398> <8C40>
+<639B> <639B> <8A7C>
+<639F> <639F> <9D7C>
+<63A0> <63A0> <97A9>
+<63A1> <63A1> <8DCC>
+<63A2> <63A2> <9254>
+<63A3> <63A3> <9D79>
+<63A5> <63A5> <90DA>
+<63A7> <63A7> <8D54>
+<63A8> <63A8> <9084>
+<63A9> <63A9> <8986>
+<63AA> <63AA> <915B>
+<63AB> <63AB> <9D77>
+<63AC> <63AC> <8B64>
+<63B2> <63B2> <8C66>
+<63B4> <63B4> <92CD>
+<63B5> <63B5> <9D7D>
+endbfrange
+
+100 beginbfrange
+<63BB> <63BB> <917E>
+<63BE> <63BE> <9D81>
+<63C0> <63C0> <9D83>
+<63C3> <63C3> <91B5>
+<63C4> <63C4> <9D89>
+<63C6> <63C6> <9D84>
+<63C9> <63C9> <9D86>
+<63CF> <63CF> <9560>
+<63D0> <63D0> <92F1>
+<63D2> <63D2> <9D87>
+<63D6> <63D6> <974B>
+<63DA> <63DA> <9767>
+<63DB> <63DB> <8AB7>
+<63E1> <63E1> <88AC>
+<63E3> <63E3> <9D85>
+<63E9> <63E9> <9D82>
+<63EE> <63EE> <8AF6>
+<63F4> <63F4> <8987>
+<63F6> <63F6> <9D88>
+<63FA> <63FA> <9768>
+<6406> <6406> <9D8C>
+<640D> <640D> <91B9>
+<640F> <640F> <9D93>
+<6413> <6413> <9D8D>
+<6414> <6414> <917E>
+<6416> <6416> <9D8A>
+<6417> <6417> <9D91>
+<641C> <641C> <9D72>
+<6426> <6426> <9D8E>
+<6428> <6428> <9D92>
+<642C> <642C> <94C0>
+<642D> <642D> <938B>
+<6434> <6434> <9D8B>
+<6436> <6436> <9D8F>
+<643A> <643A> <8C67>
+<643E> <643E> <8DEF>
+<6442> <6442> <90DB>
+<644E> <644E> <9D97>
+<6451> <6451> <92CD>
+<6458> <6458> <9345>
+<6467> <6467> <9D94>
+<6469> <6469> <9680>
+<646F> <646F> <9D95>
+<6476> <6476> <9D96>
+<6478> <6478> <96CC>
+<647A> <647A> <90A0>
+<6483> <6483> <8C82>
+<6488> <6488> <9D9D>
+<6492> <6492> <8E54>
+<6493> <6493> <9D9A>
+<6495> <6495> <9D99>
+<649A> <649A> <9451>
+<649E> <649E> <93B3>
+<64A4> <64A4> <9350>
+<64A5> <64A5> <9D9B>
+<64A9> <64A9> <9D9C>
+<64AB> <64AB> <958F>
+<64AD> <64AD> <9464>
+<64AE> <64AE> <8E42>
+<64B0> <64B0> <90EF>
+<64B2> <64B2> <966F>
+<64B9> <64B9> <8A68>
+<64BB> <64BB> <9DA3>
+<64BC> <64BC> <9D9E>
+<64C1> <64C1> <9769>
+<64C2> <64C2> <9DA5>
+<64C5> <64C5> <9DA1>
+<64C7> <64C7> <9DA2>
+<64CD> <64CD> <9180>
+<64D2> <64D2> <9DA0>
+<64D4> <64D4> <9D5E>
+<64D8> <64D8> <9DA4>
+<64DA> <64DA> <9D9F>
+<64E0> <64E1> <9DA9>
+<64E2> <64E2> <9346>
+<64E3> <64E3> <9DAC>
+<64E6> <64E6> <8E43>
+<64E7> <64E7> <9DA7>
+<64EC> <64EC> <8B5B>
+<64EF> <64EF> <9DAD>
+<64F1> <64F1> <9DA6>
+<64F2> <64F2> <9DB1>
+<64F4> <64F4> <9DB0>
+<64F6> <64F6> <9DAF>
+<64FA> <64FA> <9DB2>
+<64FD> <64FD> <9DB4>
+<64FE> <64FE> <8FEF>
+<6500> <6500> <9DB3>
+<6505> <6505> <9DB7>
+<6518> <6518> <9DB5>
+<651C> <651C> <9DB6>
+<651D> <651D> <9D90>
+<6522> <6522> <9DB7>
+<6523> <6523> <9DB9>
+<6524> <6524> <9DB8>
+<652A> <652A> <9D98>
+<652B> <652B> <9DBA>
+<652C> <652C> <9DAE>
+<652F> <652F> <8E78>
+<6534> <6535> <9DBB>
+endbfrange
+
+100 beginbfrange
+<6536> <6536> <9DBE>
+<6537> <6537> <9DBD>
+<6538> <6538> <9DBF>
+<6539> <6539> <89FC>
+<653B> <653B> <8D55>
+<653E> <653E> <95FA>
+<653F> <653F> <90AD>
+<6545> <6545> <8CCC>
+<6548> <6548> <9DC1>
+<654D> <654D> <9DC4>
+<654F> <654F> <9571>
+<6551> <6551> <8B7E>
+<6555> <6555> <9DC3>
+<6556> <6556> <9DC2>
+<6557> <6557> <9473>
+<6558> <6558> <9DC5>
+<6559> <6559> <8BB3>
+<655D> <655D> <9DC7>
+<655E> <655E> <9DC6>
+<6562> <6562> <8AB8>
+<6563> <6563> <8E55>
+<6566> <6566> <93D6>
+<656C> <656C> <8C68>
+<6570> <6570> <9094>
+<6572> <6572> <9DC8>
+<6574> <6574> <90AE>
+<6575> <6575> <9347>
+<6577> <6577> <957E>
+<6578> <6578> <9DC9>
+<6582> <6583> <9DCA>
+<6587> <6587> <95B6>
+<6588> <6588> <9B7C>
+<6589> <6589> <90C4>
+<658C> <658C> <956B>
+<658E> <658E> <8DD6>
+<6590> <6590> <94E3>
+<6591> <6591> <94C1>
+<6597> <6597> <936C>
+<6599> <6599> <97BF>
+<659B> <659B> <9DCD>
+<659C> <659C> <8ECE>
+<659F> <659F> <9DCE>
+<65A1> <65A1> <88B4>
+<65A4> <65A4> <8BD2>
+<65A5> <65A5> <90CB>
+<65A7> <65A7> <9580>
+<65AB> <65AB> <9DCF>
+<65AC> <65AC> <8E61>
+<65AD> <65AD> <9266>
+<65AF> <65AF> <8E7A>
+<65B0> <65B0> <9056>
+<65B7> <65B7> <9DD0>
+<65B9> <65B9> <95FB>
+<65BC> <65BC> <8997>
+<65BD> <65BD> <8E7B>
+<65C1> <65C1> <9DD3>
+<65C3> <65C3> <9DD1>
+<65C4> <65C4> <9DD4>
+<65C5> <65C5> <97B7>
+<65C6> <65C6> <9DD2>
+<65CB> <65CB> <90F9>
+<65CC> <65CC> <9DD5>
+<65CF> <65CF> <91B0>
+<65D2> <65D2> <9DD6>
+<65D7> <65D7> <8AF8>
+<65D9> <65D9> <9DD8>
+<65DB> <65DB> <9DD7>
+<65E0> <65E1> <9DD9>
+<65E2> <65E2> <8AF9>
+<65E5> <65E5> <93FA>
+<65E6> <65E6> <9255>
+<65E7> <65E7> <8B8C>
+<65E8> <65E8> <8E7C>
+<65E9> <65E9> <9181>
+<65EC> <65EC> <8F7B>
+<65ED> <65ED> <88AE>
+<65F1> <65F1> <9DDB>
+<65FA> <65FA> <89A0>
+<65FB> <65FB> <9DDF>
+<6602> <6602> <8D56>
+<6603> <6603> <9DDE>
+<6606> <6606> <8DA9>
+<6607> <6607> <8FB8>
+<660A> <660A> <9DDD>
+<660C> <660C> <8FB9>
+<660E> <660E> <96BE>
+<660F> <660F> <8DA8>
+<6613> <6613> <88D5>
+<6614> <6614> <90CC>
+<661C> <661C> <9DE4>
+<661F> <661F> <90AF>
+<6620> <6620> <8966>
+<6625> <6625> <8F74>
+<6627> <6627> <9686>
+<6628> <6628> <8DF0>
+<662D> <662D> <8FBA>
+<662F> <662F> <90A5>
+<6634> <6634> <9DE3>
+<6635> <6636> <9DE1>
+<663B> <663B> <8D56>
+endbfrange
+
+100 beginbfrange
+<663C> <663C> <928B>
+<663F> <663F> <9E45>
+<6641> <6641> <9DE8>
+<6642> <6642> <8E9E>
+<6643> <6643> <8D57>
+<6644> <6644> <9DE6>
+<6649> <6649> <9DE7>
+<664B> <664B> <9057>
+<664F> <664F> <9DE5>
+<6652> <6652> <8E4E>
+<665D> <665D> <9DEA>
+<665E> <665E> <9DE9>
+<665F> <665F> <9DEE>
+<6662> <6662> <9DEF>
+<6664> <6664> <9DEB>
+<6666> <6666> <8A41>
+<6667> <6668> <9DEC>
+<6669> <6669> <94D3>
+<666E> <666E> <9581>
+<666F> <666F> <8C69>
+<6670> <6670> <9DF0>
+<6674> <6674> <90B0>
+<6676> <6676> <8FBB>
+<667A> <667A> <9271>
+<6681> <6681> <8BC5>
+<6683> <6683> <9DF1>
+<6684> <6684> <9DF5>
+<6687> <6687> <89C9>
+<6688> <6688> <9DF2>
+<6689> <6689> <9DF4>
+<668E> <668E> <9DF3>
+<6691> <6691> <8F8B>
+<6696> <6696> <9267>
+<6697> <6697> <88C3>
+<6698> <6698> <9DF6>
+<669D> <669D> <9DF7>
+<66A2> <66A2> <92A8>
+<66A6> <66A6> <97EF>
+<66AB> <66AB> <8E62>
+<66AE> <66AE> <95E9>
+<66B4> <66B4> <965C>
+<66B8> <66B8> <9E41>
+<66B9> <66B9> <9DF9>
+<66BC> <66BC> <9DFC>
+<66BE> <66BE> <9DFB>
+<66C1> <66C1> <9DF8>
+<66C4> <66C4> <9E40>
+<66C7> <66C7> <93DC>
+<66C9> <66C9> <9DFA>
+<66D6> <66D6> <9E42>
+<66D9> <66D9> <8F8C>
+<66DA> <66DA> <9E43>
+<66DC> <66DC> <976A>
+<66DD> <66DD> <9498>
+<66E0> <66E0> <9E44>
+<66E6> <66E6> <9E46>
+<66E9> <66E9> <9E47>
+<66F0> <66F0> <9E48>
+<66F2> <66F2> <8BC8>
+<66F3> <66F3> <8967>
+<66F4> <66F4> <8D58>
+<66F5> <66F5> <9E49>
+<66F7> <66F7> <9E4A>
+<66F8> <66F8> <8F91>
+<66F9> <66F9> <9182>
+<66FC> <66FC> <99D6>
+<66FD> <66FD> <915D>
+<66FE> <66FE> <915C>
+<66FF> <66FF> <91D6>
+<6700> <6700> <8DC5>
+<6703> <6703> <98F0>
+<6708> <6708> <8C8E>
+<6709> <6709> <974C>
+<670B> <670B> <95FC>
+<670D> <670D> <959E>
+<670F> <670F> <9E4B>
+<6714> <6714> <8DF1>
+<6715> <6715> <92BD>
+<6716> <6716> <9E4C>
+<6717> <6717> <984E>
+<671B> <671B> <965D>
+<671D> <671D> <92A9>
+<671E> <671E> <9E4D>
+<671F> <671F> <8AFA>
+<6726> <6727> <9E4E>
+<6728> <6728> <96D8>
+<672A> <672A> <96A2>
+<672B> <672B> <9696>
+<672C> <672C> <967B>
+<672D> <672D> <8E44>
+<672E> <672E> <9E51>
+<6731> <6731> <8EE9>
+<6734> <6734> <9670>
+<6736> <6736> <9E53>
+<6737> <6737> <9E56>
+<6738> <6738> <9E55>
+<673A> <673A> <8AF7>
+<673D> <673D> <8B80>
+<673F> <673F> <9E52>
+<6741> <6741> <9E54>
+endbfrange
+
+100 beginbfrange
+<6746> <6746> <9E57>
+<6749> <6749> <9099>
+<674E> <674E> <979B>
+<674F> <674F> <88C7>
+<6750> <6750> <8DDE>
+<6751> <6751> <91BA>
+<6753> <6753> <8EDB>
+<6756> <6756> <8FF1>
+<6759> <6759> <9E5A>
+<675C> <675C> <936D>
+<675E> <675E> <9E58>
+<675F> <675F> <91A9>
+<6760> <6760> <9E59>
+<6761> <6761> <8FF0>
+<6762> <6762> <96DB>
+<6763> <6764> <9E5B>
+<6765> <6765> <9788>
+<676A> <676A> <9E61>
+<676D> <676D> <8D59>
+<676F> <676F> <9474>
+<6770> <6770> <9E5E>
+<6771> <6771> <938C>
+<6772> <6772> <9DDC>
+<6773> <6773> <9DE0>
+<6775> <6775> <8B6E>
+<6777> <6777> <9466>
+<677C> <677C> <9E60>
+<677E> <677E> <8FBC>
+<677F> <677F> <94C2>
+<6785> <6785> <9E66>
+<6787> <6787> <94F8>
+<6789> <6789> <9E5D>
+<678B> <678B> <9E63>
+<678C> <678C> <9E62>
+<6790> <6790> <90CD>
+<6795> <6795> <968D>
+<6797> <6797> <97D1>
+<679A> <679A> <9687>
+<679C> <679C> <89CA>
+<679D> <679D> <8E7D>
+<67A0> <67A0> <9867>
+<67A1> <67A1> <9E65>
+<67A2> <67A2> <9095>
+<67A6> <67A6> <9E64>
+<67A9> <67A9> <9E5F>
+<67AF> <67AF> <8CCD>
+<67B3> <67B3> <9E6B>
+<67B4> <67B4> <9E69>
+<67B6> <67B6> <89CB>
+<67B7> <67B7> <9E67>
+<67B8> <67B8> <9E6D>
+<67B9> <67B9> <9E73>
+<67C1> <67C1> <91C6>
+<67C4> <67C4> <95BF>
+<67C6> <67C6> <9E75>
+<67CA> <67CA> <9541>
+<67CE> <67CE> <9E74>
+<67CF> <67CF> <9490>
+<67D0> <67D0> <965E>
+<67D1> <67D1> <8AB9>
+<67D3> <67D3> <90F5>
+<67D4> <67D4> <8F5F>
+<67D8> <67D8> <92D1>
+<67DA> <67DA> <974D>
+<67DD> <67DD> <9E70>
+<67DE> <67DE> <9E6F>
+<67E2> <67E2> <9E71>
+<67E4> <67E4> <9E6E>
+<67E7> <67E7> <9E76>
+<67E9> <67E9> <9E6C>
+<67EC> <67EC> <9E6A>
+<67EE> <67EE> <9E72>
+<67EF> <67EF> <9E68>
+<67F1> <67F1> <928C>
+<67F3> <67F3> <96F6>
+<67F4> <67F4> <8EC4>
+<67F5> <67F5> <8DF2>
+<67FB> <67FB> <8DB8>
+<67FE> <67FE> <968F>
+<67FF> <67FF> <8A60>
+<6802> <6802> <92CC>
+<6803> <6803> <93C8>
+<6804> <6804> <8968>
+<6805> <6805> <8DF2>
+<6813> <6813> <90F0>
+<6816> <6816> <90B2>
+<6817> <6817> <8C49>
+<681E> <681E> <9E78>
+<6821> <6821> <8D5A>
+<6822> <6822> <8A9C>
+<6829> <6829> <9E7A>
+<682A> <682A> <8A94>
+<682B> <682B> <9E81>
+<6832> <6832> <9E7D>
+<6834> <6834> <90F1>
+<6838> <6838> <8A6A>
+<6839> <6839> <8DAA>
+<683C> <683C> <8A69>
+<683D> <683D> <8DCD>
+<6840> <6840> <9E7B>
+endbfrange
+
+100 beginbfrange
+<6841> <6841> <8C85>
+<6842> <6842> <8C6A>
+<6843> <6843> <938D>
+<6846> <6846> <9E79>
+<6848> <6848> <88C4>
+<684D> <684D> <9E7C>
+<684E> <684E> <9E7E>
+<6850> <6850> <8BCB>
+<6851> <6851> <8C4B>
+<6853> <6853> <8ABA>
+<6854> <6854> <8B6A>
+<6859> <6859> <9E82>
+<685C> <685C> <8DF7>
+<685D> <685D> <9691>
+<685F> <685F> <8E56>
+<6863> <6863> <9E83>
+<6867> <6867> <954F>
+<6874> <6874> <9E8F>
+<6876> <6876> <89B1>
+<6877> <6877> <9E84>
+<687E> <687E> <9E95>
+<687F> <687F> <9E85>
+<6881> <6881> <97C0>
+<6883> <6883> <9E8C>
+<6885> <6885> <947E>
+<688D> <688D> <9E94>
+<688E> <688E> <9E94>
+<688F> <688F> <9E87>
+<6893> <6893> <88B2>
+<6894> <6894> <9E89>
+<6897> <6897> <8D5B>
+<689B> <689B> <9E8B>
+<689D> <689D> <9E8A>
+<689F> <689F> <9E86>
+<68A0> <68A0> <9E91>
+<68A2> <68A2> <8FBD>
+<68A6> <68A6> <9AEB>
+<68A7> <68A7> <8CE6>
+<68A8> <68A8> <979C>
+<68AD> <68AD> <9E88>
+<68AF> <68AF> <92F2>
+<68B0> <68B0> <8A42>
+<68B1> <68B1> <8DAB>
+<68B3> <68B3> <9E80>
+<68B5> <68B5> <9E90>
+<68B6> <68B6> <8A81>
+<68B9> <68B9> <9E8E>
+<68BA> <68BA> <9E92>
+<68BC> <68BC> <938E>
+<68C4> <68C4> <8AFC>
+<68C6> <68C6> <9EB0>
+<68C9> <68C9> <96C7>
+<68CA> <68CA> <9E97>
+<68CB> <68CB> <8AFB>
+<68CD> <68CD> <9E9E>
+<68D2> <68D2> <965F>
+<68D4> <68D4> <9E9F>
+<68D5> <68D5> <9EA1>
+<68D7> <68D7> <9EA5>
+<68D8> <68D8> <9E99>
+<68DA> <68DA> <9249>
+<68DF> <68DF> <938F>
+<68E0> <68E0> <9EA9>
+<68E1> <68E1> <9E9C>
+<68E3> <68E3> <9EA6>
+<68E7> <68E7> <9EA0>
+<68EE> <68EE> <9058>
+<68EF> <68EF> <9EAA>
+<68F2> <68F2> <90B1>
+<68F9> <68F9> <9EA8>
+<68FA> <68FA> <8ABB>
+<6900> <6900> <986F>
+<6901> <6901> <9E96>
+<6904> <6904> <9EA4>
+<6905> <6905> <88D6>
+<6908> <6908> <9E98>
+<690B> <690B> <96B8>
+<690C> <690C> <9E9D>
+<690D> <690D> <9041>
+<690E> <690E> <92C5>
+<690F> <690F> <9E93>
+<6912> <6912> <9EA3>
+<6919> <6919> <909A>
+<691A> <691A> <9EAD>
+<691B> <691B> <8A91>
+<691C> <691C> <8C9F>
+<6921> <6921> <9EAF>
+<6922> <6922> <9E9A>
+<6923> <6923> <9EAE>
+<6925> <6925> <9EA7>
+<6926> <6926> <9E9B>
+<6928> <6928> <9EAB>
+<692A> <692A> <9EAC>
+<6930> <6930> <9EBD>
+<6934> <6934> <93CC>
+<6936> <6936> <9EA2>
+<6939> <6939> <9EB9>
+<693D> <693D> <9EBB>
+<693F> <693F> <92D6>
+<694A> <694A> <976B>
+endbfrange
+
+100 beginbfrange
+<6953> <6953> <9596>
+<6954> <6954> <9EB6>
+<6955> <6955> <91C8>
+<6959> <6959> <9EBC>
+<695A> <695A> <915E>
+<695C> <695C> <9EB3>
+<695D> <695D> <9EC0>
+<695E> <695E> <9EBF>
+<6960> <6960> <93ED>
+<6961> <6961> <9EBE>
+<6962> <6962> <93E8>
+<696A> <696A> <9EC2>
+<696B> <696B> <9EB5>
+<696D> <696D> <8BC6>
+<696E> <696E> <9EB8>
+<696F> <696F> <8F7C>
+<6973> <6973> <9480>
+<6974> <6974> <9EBA>
+<6975> <6975> <8BC9>
+<6977> <6977> <9EB2>
+<6978> <6978> <9EB4>
+<6979> <6979> <9EB1>
+<697C> <697C> <984F>
+<697D> <697D> <8A79>
+<697E> <697E> <9EB7>
+<6981> <6981> <9EC1>
+<6982> <6982> <8A54>
+<698A> <698A> <8DE5>
+<698E> <698E> <897C>
+<6991> <6991> <9ED2>
+<6994> <6994> <9850>
+<6995> <6995> <9ED5>
+<699B> <699B> <9059>
+<699C> <699C> <9ED4>
+<69A0> <69A0> <9ED3>
+<69A7> <69A7> <9ED0>
+<69AE> <69AE> <9EC4>
+<69B1> <69B1> <9EE1>
+<69B2> <69B2> <9EC3>
+<69B4> <69B4> <9ED6>
+<69BB> <69BB> <9ECE>
+<69BE> <69BE> <9EC9>
+<69BF> <69BF> <9EC6>
+<69C1> <69C1> <9EC7>
+<69C3> <69C3> <9ECF>
+<69C7> <69C7> <EAA0>
+<69CA> <69CA> <9ECC>
+<69CB> <69CB> <8D5C>
+<69CC> <69CC> <92C6>
+<69CD> <69CD> <9184>
+<69CE> <69CE> <9ECA>
+<69D0> <69D0> <9EC5>
+<69D3> <69D3> <9EC8>
+<69D8> <69D8> <976C>
+<69D9> <69D9> <968A>
+<69DD> <69DD> <9ECD>
+<69DE> <69DE> <9ED7>
+<69E7> <69E7> <9EDF>
+<69E8> <69E8> <9ED8>
+<69EB> <69EB> <9EE5>
+<69ED> <69ED> <9EE3>
+<69F2> <69F2> <9EDE>
+<69F9> <69F9> <9EDD>
+<69FB> <69FB> <92CE>
+<69FD> <69FD> <9185>
+<69FF> <69FF> <9EDB>
+<6A02> <6A02> <9ED9>
+<6A05> <6A05> <9EE0>
+<6A0A> <6A0A> <9EE6>
+<6A0B> <6A0B> <94F3>
+<6A0C> <6A0C> <9EEC>
+<6A12> <6A12> <9EE7>
+<6A13> <6A13> <9EEA>
+<6A14> <6A14> <9EE4>
+<6A17> <6A17> <9294>
+<6A19> <6A19> <9557>
+<6A1B> <6A1B> <9EDA>
+<6A1E> <6A1E> <9EE2>
+<6A1F> <6A1F> <8FBE>
+<6A21> <6A21> <96CD>
+<6A22> <6A22> <9EF6>
+<6A23> <6A23> <9EE9>
+<6A29> <6A29> <8CA0>
+<6A2A> <6A2A> <89A1>
+<6A2B> <6A2B> <8A7E>
+<6A2E> <6A2E> <9ED1>
+<6A35> <6A35> <8FBF>
+<6A36> <6A36> <9EEE>
+<6A38> <6A38> <9EF5>
+<6A39> <6A39> <8EF7>
+<6A3A> <6A3A> <8A92>
+<6A3D> <6A3D> <924D>
+<6A44> <6A44> <9EEB>
+<6A47> <6A47> <9EF0>
+<6A48> <6A48> <9EF4>
+<6A4B> <6A4B> <8BB4>
+<6A58> <6A58> <8B6B>
+<6A59> <6A59> <9EF2>
+<6A5F> <6A5F> <8B40>
+<6A61> <6A61> <93C9>
+endbfrange
+
+100 beginbfrange
+<6A62> <6A62> <9EF1>
+<6A66> <6A66> <9EF3>
+<6A72> <6A72> <9EED>
+<6A78> <6A78> <9EEF>
+<6A7F> <6A7F> <8A80>
+<6A80> <6A80> <9268>
+<6A84> <6A84> <9EFA>
+<6A8D> <6A8D> <9EF8>
+<6A8E> <6A8E> <8CE7>
+<6A90> <6A90> <9EF7>
+<6A97> <6A97> <9F40>
+<6A9C> <6A9C> <9E77>
+<6AA0> <6AA0> <9EF9>
+<6AA2> <6AA3> <9EFB>
+<6AAA> <6AAA> <9F4B>
+<6AAC> <6AAC> <9F47>
+<6AAE> <6AAE> <9E8D>
+<6AB3> <6AB3> <9F46>
+<6AB8> <6AB8> <9F45>
+<6ABB> <6ABB> <9F42>
+<6AC1> <6AC1> <9EE8>
+<6AC2> <6AC2> <9F44>
+<6AC3> <6AC3> <9F43>
+<6AD1> <6AD1> <9F49>
+<6AD3> <6AD3> <9845>
+<6ADA> <6ADA> <9F4C>
+<6ADB> <6ADB> <8BF9>
+<6ADE> <6ADE> <9F48>
+<6ADF> <6ADF> <9F4A>
+<6AE8> <6AE8> <94A5>
+<6AEA> <6AEA> <9F4D>
+<6AFA> <6AFA> <9F51>
+<6AFB> <6AFB> <9F4E>
+<6B04> <6B04> <9793>
+<6B05> <6B05> <9F4F>
+<6B0A> <6B0A> <9EDC>
+<6B12> <6B12> <9F52>
+<6B16> <6B16> <9F53>
+<6B1D> <6B1D> <8954>
+<6B1F> <6B1F> <9F55>
+<6B20> <6B20> <8C87>
+<6B21> <6B21> <8E9F>
+<6B23> <6B23> <8BD3>
+<6B27> <6B27> <89A2>
+<6B32> <6B32> <977E>
+<6B37> <6B37> <9F57>
+<6B38> <6B38> <9F56>
+<6B39> <6B39> <9F59>
+<6B3A> <6B3A> <8B5C>
+<6B3D> <6B3D> <8BD4>
+<6B3E> <6B3E> <8ABC>
+<6B43> <6B43> <9F5C>
+<6B47> <6B47> <9F5B>
+<6B49> <6B49> <9F5D>
+<6B4C> <6B4C> <89CC>
+<6B4E> <6B4E> <9256>
+<6B50> <6B50> <9F5E>
+<6B53> <6B53> <8ABD>
+<6B54> <6B54> <9F60>
+<6B59> <6B59> <9F5F>
+<6B5B> <6B5B> <9F61>
+<6B5F> <6B5F> <9F62>
+<6B61> <6B61> <9F63>
+<6B62> <6B62> <8E7E>
+<6B63> <6B63> <90B3>
+<6B64> <6B64> <8D9F>
+<6B66> <6B66> <9590>
+<6B69> <6B69> <95E0>
+<6B6A> <6B6A> <9863>
+<6B6F> <6B6F> <8E95>
+<6B73> <6B73> <8DCE>
+<6B74> <6B74> <97F0>
+<6B78> <6B79> <9F64>
+<6B7B> <6B7B> <8E80>
+<6B7F> <6B80> <9F66>
+<6B83> <6B83> <9F69>
+<6B84> <6B84> <9F68>
+<6B86> <6B86> <9677>
+<6B89> <6B89> <8F7D>
+<6B8A> <6B8A> <8EEA>
+<6B8B> <6B8B> <8E63>
+<6B8D> <6B8D> <9F6A>
+<6B95> <6B95> <9F6C>
+<6B96> <6B96> <9042>
+<6B98> <6B98> <9F6B>
+<6B9E> <6B9E> <9F6D>
+<6BA4> <6BA4> <9F6E>
+<6BAA> <6BAB> <9F6F>
+<6BAF> <6BAF> <9F71>
+<6BB1> <6BB1> <9F73>
+<6BB2> <6BB2> <9F72>
+<6BB3> <6BB3> <9F74>
+<6BB4> <6BB4> <89A3>
+<6BB5> <6BB5> <9269>
+<6BB7> <6BB7> <9F75>
+<6BBA> <6BBA> <8E45>
+<6BBB> <6BBB> <8A6B>
+<6BBC> <6BBC> <9F76>
+<6BBF> <6BBF> <9361>
+<6BC0> <6BC0> <9ACA>
+endbfrange
+
+100 beginbfrange
+<6BC5> <6BC5> <8B42>
+<6BC6> <6BC6> <9F77>
+<6BCB> <6BCB> <9F78>
+<6BCD> <6BCD> <95EA>
+<6BCE> <6BCE> <9688>
+<6BD2> <6BD2> <93C5>
+<6BD3> <6BD3> <9F79>
+<6BD4> <6BD4> <94E4>
+<6BD8> <6BD8> <94F9>
+<6BDB> <6BDB> <96D1>
+<6BDF> <6BDF> <9F7A>
+<6BEB> <6BEB> <9F7C>
+<6BEC> <6BEC> <9F7B>
+<6BEF> <6BEF> <9F7E>
+<6BF3> <6BF3> <9F7D>
+<6C08> <6C08> <9F81>
+<6C0F> <6C0F> <8E81>
+<6C11> <6C11> <96AF>
+<6C13> <6C14> <9F82>
+<6C17> <6C17> <8B43>
+<6C1B> <6C1B> <9F84>
+<6C23> <6C23> <9F86>
+<6C24> <6C24> <9F85>
+<6C34> <6C34> <9085>
+<6C37> <6C37> <9558>
+<6C38> <6C38> <8969>
+<6C3E> <6C3E> <94C3>
+<6C40> <6C40> <92F3>
+<6C41> <6C41> <8F60>
+<6C42> <6C42> <8B81>
+<6C4E> <6C4E> <94C4>
+<6C50> <6C50> <8EAC>
+<6C55> <6C55> <9F88>
+<6C57> <6C57> <8ABE>
+<6C5A> <6C5A> <8998>
+<6C5D> <6C5D> <93F0>
+<6C5E> <6C5E> <9F87>
+<6C5F> <6C5F> <8D5D>
+<6C60> <6C60> <9272>
+<6C62> <6C62> <9F89>
+<6C68> <6C68> <9F91>
+<6C6A> <6C6A> <9F8A>
+<6C70> <6C70> <91BF>
+<6C72> <6C72> <8B82>
+<6C73> <6C73> <9F92>
+<6C7A> <6C7A> <8C88>
+<6C7D> <6C7D> <8B44>
+<6C7E> <6C7E> <9F90>
+<6C81> <6C81> <9F8E>
+<6C82> <6C82> <9F8B>
+<6C83> <6C83> <9780>
+<6C88> <6C88> <92BE>
+<6C8C> <6C8C> <93D7>
+<6C8D> <6C8D> <9F8C>
+<6C90> <6C90> <9F94>
+<6C92> <6C92> <9F93>
+<6C93> <6C93> <8C42>
+<6C96> <6C96> <89AB>
+<6C99> <6C99> <8DB9>
+<6C9A> <6C9A> <9F8D>
+<6C9B> <6C9B> <9F8F>
+<6CA1> <6CA1> <9676>
+<6CA2> <6CA2> <91F2>
+<6CAB> <6CAB> <9697>
+<6CAE> <6CAE> <9F9C>
+<6CB1> <6CB1> <9F9D>
+<6CB3> <6CB3> <89CD>
+<6CB8> <6CB8> <95A6>
+<6CB9> <6CB9> <96FB>
+<6CBA> <6CBA> <9F9F>
+<6CBB> <6CBB> <8EA1>
+<6CBC> <6CBC> <8FC0>
+<6CBD> <6CBD> <9F98>
+<6CBE> <6CBE> <9F9E>
+<6CBF> <6CBF> <8988>
+<6CC1> <6CC1> <8BB5>
+<6CC4> <6CC4> <9F95>
+<6CC5> <6CC5> <9F9A>
+<6CC9> <6CC9> <90F2>
+<6CCA> <6CCA> <9491>
+<6CCC> <6CCC> <94E5>
+<6CD3> <6CD3> <9F97>
+<6CD5> <6CD5> <9640>
+<6CD7> <6CD7> <9F99>
+<6CD9> <6CD9> <9FA2>
+<6CDB> <6CDB> <9FA0>
+<6CDD> <6CDD> <9F9B>
+<6CE1> <6CE1> <9641>
+<6CE2> <6CE2> <9467>
+<6CE3> <6CE3> <8B83>
+<6CE5> <6CE5> <9344>
+<6CE8> <6CE8> <928D>
+<6CEA> <6CEA> <9FA3>
+<6CEF> <6CEF> <9FA1>
+<6CF0> <6CF0> <91D7>
+<6CF1> <6CF1> <9F96>
+<6CF3> <6CF3> <896A>
+<6D0B> <6D0B> <976D>
+<6D0C> <6D0C> <9FAE>
+<6D12> <6D12> <9FAD>
+endbfrange
+
+100 beginbfrange
+<6D17> <6D17> <90F4>
+<6D19> <6D19> <9FAA>
+<6D1B> <6D1B> <978C>
+<6D1E> <6D1E> <93B4>
+<6D1F> <6D1F> <9FA4>
+<6D25> <6D25> <92C3>
+<6D29> <6D29> <896B>
+<6D2A> <6D2A> <8D5E>
+<6D2B> <6D2B> <9FA7>
+<6D32> <6D32> <8F46>
+<6D33> <6D33> <9FAC>
+<6D35> <6D35> <9FAB>
+<6D36> <6D36> <9FA6>
+<6D38> <6D38> <9FA9>
+<6D3B> <6D3B> <8A88>
+<6D3D> <6D3D> <9FA8>
+<6D3E> <6D3E> <9468>
+<6D41> <6D41> <97AC>
+<6D44> <6D44> <8FF2>
+<6D45> <6D45> <90F3>
+<6D59> <6D59> <9FB4>
+<6D5A> <6D5A> <9FB2>
+<6D5C> <6D5C> <956C>
+<6D63> <6D63> <9FAF>
+<6D64> <6D64> <9FB1>
+<6D66> <6D66> <8959>
+<6D69> <6D69> <8D5F>
+<6D6A> <6D6A> <9851>
+<6D6C> <6D6C> <8A5C>
+<6D6E> <6D6E> <9582>
+<6D74> <6D74> <9781>
+<6D77> <6D77> <8A43>
+<6D78> <6D78> <905A>
+<6D79> <6D79> <9FB3>
+<6D85> <6D85> <9FB8>
+<6D88> <6D88> <8FC1>
+<6D8C> <6D8C> <974F>
+<6D8E> <6D8E> <9FB5>
+<6D93> <6D93> <9FB0>
+<6D95> <6D95> <9FB6>
+<6D99> <6D99> <97DC>
+<6D9B> <6D9B> <9393>
+<6D9C> <6D9C> <93C0>
+<6DAF> <6DAF> <8A55>
+<6DB2> <6DB2> <8974>
+<6DB5> <6DB5> <9FBC>
+<6DB8> <6DB8> <9FBF>
+<6DBC> <6DBC> <97C1>
+<6DC0> <6DC0> <9784>
+<6DC5> <6DC5> <9FC6>
+<6DC6> <6DC6> <9FC0>
+<6DC7> <6DC7> <9FBD>
+<6DCB> <6DCB> <97D2>
+<6DCC> <6DCC> <9FC3>
+<6DD1> <6DD1> <8F69>
+<6DD2> <6DD2> <9FC5>
+<6DD5> <6DD5> <9FCA>
+<6DD8> <6DD8> <9391>
+<6DD9> <6DD9> <9FC8>
+<6DDE> <6DDE> <9FC2>
+<6DE1> <6DE1> <9257>
+<6DE4> <6DE4> <9FC9>
+<6DE6> <6DE6> <9FBE>
+<6DE8> <6DE8> <9FC4>
+<6DEA> <6DEA> <9FCB>
+<6DEB> <6DEB> <88FA>
+<6DEC> <6DEC> <9FC1>
+<6DEE> <6DEE> <9FCC>
+<6DF1> <6DF1> <905B>
+<6DF3> <6DF3> <8F7E>
+<6DF5> <6DF5> <95A3>
+<6DF7> <6DF7> <8DAC>
+<6DF9> <6DF9> <9FB9>
+<6DFA> <6DFA> <9FC7>
+<6DFB> <6DFB> <9359>
+<6E05> <6E05> <90B4>
+<6E07> <6E07> <8A89>
+<6E08> <6E08> <8DCF>
+<6E09> <6E09> <8FC2>
+<6E0A> <6E0A> <9FBB>
+<6E0B> <6E0B> <8F61>
+<6E13> <6E13> <8C6B>
+<6E15> <6E15> <9FBA>
+<6E19> <6E19> <9FD0>
+<6E1A> <6E1A> <8F8D>
+<6E1B> <6E1B> <8CB8>
+<6E1D> <6E1D> <9FDF>
+<6E1F> <6E1F> <9FD9>
+<6E20> <6E20> <8B94>
+<6E21> <6E21> <936E>
+<6E23> <6E23> <9FD4>
+<6E24> <6E24> <9FDD>
+<6E25> <6E25> <88AD>
+<6E26> <6E26> <8951>
+<6E29> <6E29> <89B7>
+<6E2B> <6E2B> <9FD6>
+<6E2C> <6E2C> <91AA>
+<6E2D> <6E2D> <9FCD>
+<6E2E> <6E2E> <9FCF>
+<6E2F> <6E2F> <8D60>
+endbfrange
+
+100 beginbfrange
+<6E38> <6E38> <9FE0>
+<6E3A> <6E3A> <9FDB>
+<6E3E> <6E3E> <9FD3>
+<6E43> <6E43> <9FDA>
+<6E4A> <6E4A> <96A9>
+<6E4D> <6E4D> <9FD8>
+<6E4E> <6E4E> <9FDC>
+<6E56> <6E56> <8CCE>
+<6E58> <6E58> <8FC3>
+<6E5B> <6E5B> <9258>
+<6E5F> <6E5F> <9FD2>
+<6E67> <6E67> <974E>
+<6E6B> <6E6B> <9FD5>
+<6E6E> <6E6E> <9FCE>
+<6E6F> <6E6F> <9392>
+<6E72> <6E72> <9FD1>
+<6E76> <6E76> <9FD7>
+<6E7E> <6E7E> <9870>
+<6E7F> <6E7F> <8EBC>
+<6E80> <6E80> <969E>
+<6E82> <6E82> <9FE1>
+<6E8C> <6E8C> <94AC>
+<6E8F> <6E8F> <9FED>
+<6E90> <6E90> <8CB9>
+<6E96> <6E96> <8F80>
+<6E98> <6E98> <9FE3>
+<6E9C> <6E9C> <97AD>
+<6E9D> <6E9D> <8D61>
+<6E9F> <6E9F> <9FF0>
+<6EA2> <6EA2> <88EC>
+<6EA5> <6EA5> <9FEE>
+<6EAA> <6EAA> <9FE2>
+<6EAF> <6EAF> <9FE8>
+<6EB2> <6EB2> <9FEA>
+<6EB6> <6EB6> <976E>
+<6EB7> <6EB7> <9FE5>
+<6EBA> <6EBA> <934D>
+<6EBD> <6EBD> <9FE7>
+<6EC2> <6EC2> <9FEF>
+<6EC4> <6EC4> <9FE9>
+<6EC5> <6EC5> <96C5>
+<6EC9> <6EC9> <9FE4>
+<6ECB> <6ECB> <8EA0>
+<6ECC> <6ECC> <9FFC>
+<6ED1> <6ED1> <8A8A>
+<6ED3> <6ED3> <9FE6>
+<6ED4> <6ED5> <9FEB>
+<6EDD> <6EDD> <91EA>
+<6EDE> <6EDE> <91D8>
+<6EEC> <6EEC> <9FF4>
+<6EEF> <6EEF> <9FFA>
+<6EF2> <6EF2> <9FF8>
+<6EF4> <6EF4> <9348>
+<6EF7> <6EF7> <E042>
+<6EF8> <6EF8> <9FF5>
+<6EFE> <6EFE> <9FF6>
+<6EFF> <6EFF> <9FDE>
+<6F01> <6F01> <8B99>
+<6F02> <6F02> <9559>
+<6F06> <6F06> <8EBD>
+<6F09> <6F09> <8D97>
+<6F0F> <6F0F> <9852>
+<6F11> <6F11> <9FF2>
+<6F13> <6F13> <E041>
+<6F14> <6F14> <8989>
+<6F15> <6F15> <9186>
+<6F20> <6F20> <9499>
+<6F22> <6F22> <8ABF>
+<6F23> <6F23> <97F8>
+<6F2B> <6F2B> <969F>
+<6F2C> <6F2C> <92D0>
+<6F31> <6F31> <9FF9>
+<6F32> <6F32> <9FFB>
+<6F38> <6F38> <9151>
+<6F3E> <6F3E> <E040>
+<6F3F> <6F3F> <9FF7>
+<6F41> <6F41> <9FF1>
+<6F45> <6F45> <8AC1>
+<6F51> <6F51> <94AC>
+<6F54> <6F54> <8C89>
+<6F58> <6F58> <E04E>
+<6F5B> <6F5B> <E049>
+<6F5C> <6F5C> <90F6>
+<6F5F> <6F5F> <8A83>
+<6F64> <6F64> <8F81>
+<6F66> <6F66> <E052>
+<6F6D> <6F6D> <E04B>
+<6F6E> <6F6E> <92AA>
+<6F6F> <6F6F> <E048>
+<6F70> <6F70> <92D7>
+<6F74> <6F74> <E06B>
+<6F78> <6F78> <E045>
+<6F7A> <6F7A> <E044>
+<6F7C> <6F7C> <E04D>
+<6F80> <6F80> <E047>
+<6F81> <6F81> <E046>
+<6F82> <6F82> <E04C>
+<6F84> <6F84> <909F>
+<6F86> <6F86> <E043>
+<6F8E> <6F8E> <E04F>
+endbfrange
+
+100 beginbfrange
+<6F91> <6F91> <E050>
+<6F97> <6F97> <8AC0>
+<6FA1> <6FA1> <E055>
+<6FA3> <6FA3> <E054>
+<6FA4> <6FA4> <E056>
+<6FAA> <6FAA> <E059>
+<6FB1> <6FB1> <9362>
+<6FB3> <6FB3> <E053>
+<6FB9> <6FB9> <E057>
+<6FC0> <6FC0> <8C83>
+<6FC1> <6FC1> <91F7>
+<6FC2> <6FC2> <E051>
+<6FC3> <6FC3> <945A>
+<6FC6> <6FC6> <E058>
+<6FD4> <6FD4> <E05D>
+<6FD5> <6FD5> <E05B>
+<6FD8> <6FD8> <E05E>
+<6FDB> <6FDB> <E061>
+<6FDF> <6FDF> <E05A>
+<6FE0> <6FE0> <8D8A>
+<6FE1> <6FE1> <9447>
+<6FE4> <6FE4> <9FB7>
+<6FEB> <6FEB> <9794>
+<6FEC> <6FEC> <E05C>
+<6FEE> <6FEE> <E060>
+<6FEF> <6FEF> <91F3>
+<6FF1> <6FF1> <E05F>
+<6FF3> <6FF3> <E04A>
+<6FF6> <6FF6> <E889>
+<6FFA> <6FFA> <E064>
+<6FFE> <6FFE> <E068>
+<7001> <7001> <E066>
+<7006> <7006> <93C0>
+<7009> <7009> <E062>
+<700B> <700B> <E063>
+<700F> <700F> <E067>
+<7011> <7011> <E065>
+<7015> <7015> <956D>
+<7018> <7018> <E06D>
+<701A> <701A> <E06A>
+<701B> <701B> <E069>
+<701D> <701D> <E06C>
+<701E> <701E> <93D2>
+<701F> <701F> <E06E>
+<7026> <7026> <9295>
+<7027> <7027> <91EB>
+<702C> <702C> <90A3>
+<7030> <7030> <E06F>
+<7032> <7032> <E071>
+<703E> <703E> <E070>
+<704C> <704C> <9FF3>
+<7051> <7051> <E072>
+<7058> <7058> <93E5>
+<7063> <7063> <E073>
+<706B> <706B> <89CE>
+<706F> <706F> <9394>
+<7070> <7070> <8A44>
+<7078> <7078> <8B84>
+<707C> <707C> <8EDC>
+<707D> <707D> <8DD0>
+<7089> <7089> <9846>
+<708A> <708A> <9086>
+<708E> <708E> <898A>
+<7092> <7092> <E075>
+<7099> <7099> <E074>
+<70AC> <70AC> <E078>
+<70AD> <70AD> <9259>
+<70AE> <70AE> <E07B>
+<70AF> <70AF> <E076>
+<70B3> <70B3> <E07A>
+<70B8> <70B8> <E079>
+<70B9> <70B9> <935F>
+<70BA> <70BA> <88D7>
+<70C8> <70C8> <97F3>
+<70CB> <70CB> <E07D>
+<70CF> <70CF> <8947>
+<70D9> <70D9> <E080>
+<70DD> <70DD> <E07E>
+<70DF> <70DF> <E07C>
+<70F1> <70F1> <E077>
+<70F9> <70F9> <9642>
+<70FD> <70FD> <E082>
+<7109> <7109> <E081>
+<7114> <7114> <898B>
+<7119> <7119> <E084>
+<711A> <711A> <95B0>
+<711C> <711C> <E083>
+<7121> <7121> <96B3>
+<7126> <7126> <8FC5>
+<7130> <7130> <898B>
+<7136> <7136> <9152>
+<713C> <713C> <8FC4>
+<7149> <7149> <97F9>
+<714C> <714C> <E08A>
+<714E> <714E> <90F7>
+<7155> <7155> <E086>
+<7156> <7156> <E08B>
+<7159> <7159> <898C>
+<7162> <7162> <E089>
+<7164> <7164> <9481>
+endbfrange
+
+100 beginbfrange
+<7165> <7165> <E085>
+<7166> <7166> <E088>
+<7167> <7167> <8FC6>
+<7169> <7169> <94CF>
+<716C> <716C> <E08C>
+<716E> <716E> <8ECF>
+<717D> <717D> <90F8>
+<7184> <7184> <E08F>
+<7188> <7188> <E087>
+<718A> <718A> <8C46>
+<718F> <718F> <E08D>
+<7194> <7194> <976F>
+<7195> <7195> <E090>
+<7199> <7199> <EAA4>
+<719F> <719F> <8F6E>
+<71A8> <71A8> <E091>
+<71AC> <71AC> <E092>
+<71B1> <71B1> <944D>
+<71B9> <71B9> <E094>
+<71BE> <71BE> <E095>
+<71C3> <71C3> <9452>
+<71C8> <71C8> <9395>
+<71C9> <71C9> <E097>
+<71CE> <71CE> <E099>
+<71D0> <71D0> <97D3>
+<71D2> <71D2> <E096>
+<71D4> <71D4> <E098>
+<71D5> <71D5> <898D>
+<71D7> <71D7> <E093>
+<71DF> <71DF> <9A7A>
+<71E0> <71E0> <E09A>
+<71E5> <71E5> <9187>
+<71E6> <71E6> <8E57>
+<71E7> <71E7> <E09C>
+<71EC> <71EC> <E09B>
+<71ED> <71ED> <9043>
+<71EE> <71EE> <99D7>
+<71F5> <71F5> <E09D>
+<71F9> <71F9> <E09F>
+<71FB> <71FB> <E08E>
+<71FC> <71FC> <E09E>
+<71FF> <71FF> <E0A0>
+<7206> <7206> <949A>
+<720D> <720D> <E0A1>
+<7210> <7210> <E0A2>
+<721B> <721B> <E0A3>
+<7228> <7228> <E0A4>
+<722A> <722A> <92DC>
+<722C> <722C> <E0A6>
+<722D> <722D> <E0A5>
+<7230> <7230> <E0A7>
+<7232> <7232> <E0A8>
+<7235> <7235> <8EDD>
+<7236> <7236> <9583>
+<723A> <723A> <96EA>
+<723B> <723C> <E0A9>
+<723D> <723D> <9175>
+<723E> <723E> <8EA2>
+<723F> <7240> <E0AB>
+<7246> <7246> <E0AD>
+<7247> <7247> <95D0>
+<7248> <7248> <94C5>
+<724B> <724B> <E0AE>
+<724C> <724C> <9476>
+<7252> <7252> <92AB>
+<7258> <7258> <E0AF>
+<7259> <7259> <89E5>
+<725B> <725B> <8B8D>
+<725D> <725D> <96C4>
+<725F> <725F> <96B4>
+<7261> <7261> <89B2>
+<7262> <7262> <9853>
+<7267> <7267> <9671>
+<7269> <7269> <95A8>
+<7272> <7272> <90B5>
+<7274> <7274> <E0B0>
+<7279> <7279> <93C1>
+<727D> <727D> <8CA1>
+<727E> <727E> <E0B1>
+<7280> <7280> <8DD2>
+<7281> <7281> <E0B3>
+<7282> <7282> <E0B2>
+<7287> <7287> <E0B4>
+<7292> <7292> <E0B5>
+<7296> <7296> <E0B6>
+<72A0> <72A0> <8B5D>
+<72A2> <72A2> <E0B7>
+<72A7> <72A7> <E0B8>
+<72AC> <72AC> <8CA2>
+<72AF> <72AF> <94C6>
+<72B2> <72B2> <E0BA>
+<72B6> <72B6> <8FF3>
+<72B9> <72B9> <E0B9>
+<72C2> <72C2> <8BB6>
+<72C3> <72C3> <E0BB>
+<72C4> <72C4> <E0BD>
+<72C6> <72C6> <E0BC>
+<72CE> <72CE> <E0BE>
+<72D0> <72D0> <8CCF>
+<72D2> <72D2> <E0BF>
+endbfrange
+
+100 beginbfrange
+<72D7> <72D7> <8BE7>
+<72D9> <72D9> <915F>
+<72DB> <72DB> <8D9D>
+<72E0> <72E1> <E0C1>
+<72E2> <72E2> <E0C0>
+<72E9> <72E9> <8EEB>
+<72EC> <72EC> <93C6>
+<72ED> <72ED> <8BB7>
+<72F7> <72F7> <E0C4>
+<72F8> <72F8> <924B>
+<72F9> <72F9> <E0C3>
+<72FC> <72FC> <9854>
+<72FD> <72FD> <9482>
+<730A> <730A> <E0C7>
+<7316> <7316> <E0C9>
+<7317> <7317> <E0C6>
+<731B> <731B> <96D2>
+<731C> <731C> <E0C8>
+<731D> <731D> <E0CA>
+<731F> <731F> <97C2>
+<7325> <7325> <E0CE>
+<7329> <7329> <E0CD>
+<732A> <732A> <9296>
+<732B> <732B> <944C>
+<732E> <732E> <8CA3>
+<732F> <732F> <E0CC>
+<7334> <7334> <E0CB>
+<7336> <7337> <9750>
+<733E> <733E> <E0CF>
+<733F> <733F> <898E>
+<7344> <7344> <8D96>
+<7345> <7345> <8E82>
+<734E> <734F> <E0D0>
+<7357> <7357> <E0D3>
+<7363> <7363> <8F62>
+<7368> <7368> <E0D5>
+<736A> <736A> <E0D4>
+<7370> <7370> <E0D6>
+<7372> <7372> <8A6C>
+<7375> <7375> <E0D8>
+<7378> <7378> <E0D7>
+<737A> <737A> <E0DA>
+<737B> <737B> <E0D9>
+<7384> <7384> <8CBA>
+<7387> <7387> <97A6>
+<7389> <7389> <8BCA>
+<738B> <738B> <89A4>
+<7396> <7396> <8BE8>
+<73A9> <73A9> <8ADF>
+<73B2> <73B2> <97E6>
+<73B3> <73B3> <E0DC>
+<73BB> <73BB> <E0DE>
+<73C0> <73C0> <E0DF>
+<73C2> <73C2> <89CF>
+<73C8> <73C8> <E0DB>
+<73CA> <73CA> <8E58>
+<73CD> <73CD> <92BF>
+<73CE> <73CE> <E0DD>
+<73DE> <73DE> <E0E2>
+<73E0> <73E0> <8EEC>
+<73E5> <73E5> <E0E0>
+<73EA> <73EA> <8C5D>
+<73ED> <73ED> <94C7>
+<73EE> <73EE> <E0E1>
+<73F1> <73F1> <E0FC>
+<73F8> <73F8> <E0E7>
+<73FE> <73FE> <8CBB>
+<7403> <7403> <8B85>
+<7405> <7405> <E0E4>
+<7406> <7406> <979D>
+<7409> <7409> <97AE>
+<7422> <7422> <91F4>
+<7425> <7425> <E0E6>
+<7432> <7432> <E0E8>
+<7433> <7433> <97D4>
+<7434> <7434> <8BD5>
+<7435> <7435> <94FA>
+<7436> <7436> <9469>
+<743A> <743A> <E0E9>
+<743F> <743F> <E0EB>
+<7441> <7441> <E0EE>
+<7455> <7455> <E0EA>
+<7459> <7459> <E0ED>
+<745A> <745A> <8CE8>
+<745B> <745B> <896C>
+<745C> <745C> <E0EF>
+<745E> <745E> <9090>
+<745F> <745F> <E0EC>
+<7460> <7460> <97DA>
+<7463> <7463> <E0F2>
+<7464> <7464> <EAA2>
+<7469> <7469> <E0F0>
+<746A> <746A> <E0F3>
+<746F> <746F> <E0E5>
+<7470> <7470> <E0F1>
+<7473> <7473> <8DBA>
+<7476> <7476> <E0F4>
+<747E> <747E> <E0F5>
+<7483> <7483> <979E>
+<748B> <748B> <E0F6>
+endbfrange
+
+100 beginbfrange
+<749E> <749E> <E0F7>
+<74A2> <74A2> <E0E3>
+<74A7> <74A7> <E0F8>
+<74B0> <74B0> <8AC2>
+<74BD> <74BD> <8EA3>
+<74CA> <74CA> <E0F9>
+<74CF> <74CF> <E0FA>
+<74D4> <74D4> <E0FB>
+<74DC> <74DC> <895A>
+<74E0> <74E0> <E140>
+<74E2> <74E2> <955A>
+<74E3> <74E3> <E141>
+<74E6> <74E6> <8AA2>
+<74E7> <74E7> <E142>
+<74E9> <74E9> <E143>
+<74EE> <74EE> <E144>
+<74F0> <74F1> <E146>
+<74F2> <74F2> <E145>
+<74F6> <74F6> <9572>
+<74F7> <74F7> <E149>
+<74F8> <74F8> <E148>
+<7503> <7503> <E14B>
+<7504> <7504> <E14A>
+<7505> <7505> <E14C>
+<750C> <750C> <E14D>
+<750D> <750D> <E14F>
+<750E> <750E> <E14E>
+<7511> <7511> <8D99>
+<7513> <7513> <E151>
+<7515> <7515> <E150>
+<7518> <7518> <8AC3>
+<751A> <751A> <9072>
+<751C> <751C> <935B>
+<751E> <751E> <E152>
+<751F> <751F> <90B6>
+<7523> <7523> <8E59>
+<7525> <7525> <8999>
+<7526> <7526> <E153>
+<7528> <7528> <9770>
+<752B> <752B> <95E1>
+<752C> <752C> <E154>
+<7530> <7530> <9363>
+<7531> <7531> <9752>
+<7532> <7532> <8D62>
+<7533> <7533> <905C>
+<7537> <7537> <926A>
+<7538> <7538> <99B2>
+<753A> <753A> <92AC>
+<753B> <753B> <89E6>
+<753C> <753C> <E155>
+<7544> <7544> <E156>
+<7546> <7546> <E15B>
+<7549> <7549> <E159>
+<754A> <754A> <E158>
+<754B> <754B> <9DC0>
+<754C> <754C> <8A45>
+<754D> <754D> <E157>
+<754F> <754F> <88D8>
+<7551> <7551> <94A8>
+<7554> <7554> <94C8>
+<7559> <7559> <97AF>
+<755A> <755A> <E15C>
+<755B> <755B> <E15A>
+<755C> <755C> <927B>
+<755D> <755D> <90A4>
+<7560> <7560> <94A9>
+<7562> <7562> <954C>
+<7564> <7564> <E15E>
+<7565> <7565> <97AA>
+<7566> <7566> <8C6C>
+<7567> <7567> <E15F>
+<7569> <7569> <E15D>
+<756A> <756A> <94D4>
+<756B> <756B> <E160>
+<756D> <756D> <E161>
+<7570> <7570> <88D9>
+<7573> <7573> <8FF4>
+<7574> <7574> <E166>
+<7576> <7576> <E163>
+<7577> <7577> <93EB>
+<7578> <7578> <E162>
+<757F> <757F> <8B45>
+<7582> <7582> <E169>
+<7586> <7587> <E164>
+<7589> <7589> <E168>
+<758A> <758A> <E167>
+<758B> <758B> <9544>
+<758E> <758E> <9161>
+<758F> <758F> <9160>
+<7591> <7591> <8B5E>
+<7594> <7594> <E16A>
+<759A> <759A> <E16B>
+<759D> <759D> <E16C>
+<75A3> <75A3> <E16E>
+<75A5> <75A5> <E16D>
+<75AB> <75AB> <8975>
+<75B1> <75B1> <E176>
+<75B2> <75B2> <94E6>
+<75B3> <75B3> <E170>
+<75B5> <75B5> <E172>
+endbfrange
+
+100 beginbfrange
+<75B8> <75B8> <E174>
+<75B9> <75B9> <905D>
+<75BC> <75BC> <E175>
+<75BD> <75BD> <E173>
+<75BE> <75BE> <8EBE>
+<75C2> <75C2> <E16F>
+<75C3> <75C3> <E171>
+<75C5> <75C5> <9561>
+<75C7> <75C7> <8FC7>
+<75CA> <75CA> <E178>
+<75CD> <75CD> <E177>
+<75D2> <75D2> <E179>
+<75D4> <75D4> <8EA4>
+<75D5> <75D5> <8DAD>
+<75D8> <75D8> <9397>
+<75D9> <75D9> <E17A>
+<75DB> <75DB> <92C9>
+<75DE> <75DE> <E17C>
+<75E2> <75E2> <979F>
+<75E3> <75E3> <E17B>
+<75E9> <75E9> <9189>
+<75F0> <75F0> <E182>
+<75F2> <75F3> <E184>
+<75F4> <75F4> <9273>
+<75FA> <75FA> <E183>
+<75FC> <75FC> <E180>
+<75FE> <75FF> <E17D>
+<7601> <7601> <E181>
+<7609> <7609> <E188>
+<760B> <760B> <E186>
+<760D> <760D> <E187>
+<761F> <761F> <E189>
+<7620> <7622> <E18B>
+<7624> <7624> <E18E>
+<7626> <7626> <9189>
+<7627> <7627> <E18A>
+<7630> <7630> <E190>
+<7634> <7634> <E18F>
+<763B> <763B> <E191>
+<7642> <7642> <97C3>
+<7646> <7646> <E194>
+<7647> <7648> <E192>
+<764C> <764C> <8AE0>
+<7652> <7652> <96FC>
+<7656> <7656> <95C8>
+<7658> <7658> <E196>
+<765C> <765C> <E195>
+<7661> <7662> <E197>
+<7667> <7667> <E19C>
+<7668> <766A> <E199>
+<766C> <766C> <E19D>
+<7670> <7670> <E19E>
+<7672> <7672> <E19F>
+<7676> <7676> <E1A0>
+<7678> <7678> <E1A1>
+<767A> <767A> <94AD>
+<767B> <767B> <936F>
+<767C> <767C> <E1A2>
+<767D> <767D> <9492>
+<767E> <767E> <9553>
+<7680> <7680> <E1A3>
+<7683> <7683> <E1A4>
+<7684> <7684> <9349>
+<7686> <7686> <8A46>
+<7687> <7687> <8D63>
+<7688> <7688> <E1A5>
+<768B> <768B> <E1A6>
+<768E> <768E> <E1A7>
+<7690> <7690> <8E48>
+<7693> <7693> <E1A9>
+<7696> <7696> <E1A8>
+<7699> <769A> <E1AA>
+<76AE> <76AE> <94E7>
+<76B0> <76B0> <E1AC>
+<76B4> <76B4> <E1AD>
+<76B7> <76B7> <EA89>
+<76B8> <76BA> <E1AE>
+<76BF> <76BF> <8E4D>
+<76C2> <76C2> <E1B1>
+<76C3> <76C3> <9475>
+<76C6> <76C6> <967E>
+<76C8> <76C8> <896D>
+<76CA> <76CA> <8976>
+<76CD> <76CD> <E1B2>
+<76D2> <76D2> <E1B4>
+<76D6> <76D6> <E1B3>
+<76D7> <76D7> <9390>
+<76DB> <76DB> <90B7>
+<76DC> <76DC> <9F58>
+<76DE> <76DE> <E1B5>
+<76DF> <76DF> <96BF>
+<76E1> <76E1> <E1B6>
+<76E3> <76E3> <8AC4>
+<76E4> <76E4> <94D5>
+<76E5> <76E5> <E1B7>
+<76E7> <76E7> <E1B8>
+<76EA> <76EA> <E1B9>
+<76EE> <76EE> <96DA>
+<76F2> <76F2> <96D3>
+<76F4> <76F4> <92BC>
+endbfrange
+
+100 beginbfrange
+<76F8> <76F8> <918A>
+<76FB> <76FB> <E1BB>
+<76FE> <76FE> <8F82>
+<7701> <7701> <8FC8>
+<7704> <7704> <E1BE>
+<7707> <7707> <E1BD>
+<7708> <7708> <E1BC>
+<7709> <7709> <94FB>
+<770B> <770B> <8AC5>
+<770C> <770C> <8CA7>
+<771B> <771B> <E1C4>
+<771E> <771E> <E1C1>
+<771F> <771F> <905E>
+<7720> <7720> <96B0>
+<7724> <7724> <E1C0>
+<7725> <7726> <E1C2>
+<7729> <7729> <E1BF>
+<7737> <7738> <E1C5>
+<773A> <773A> <92AD>
+<773C> <773C> <8AE1>
+<7740> <7740> <9285>
+<7747> <7747> <E1C7>
+<775A> <775A> <E1C8>
+<775B> <775B> <E1CB>
+<7761> <7761> <9087>
+<7762> <7762> <E8B1>
+<7763> <7763> <93C2>
+<7765> <7765> <E1CC>
+<7766> <7766> <9672>
+<7768> <7768> <E1C9>
+<776B> <776B> <E1CA>
+<7779> <7779> <E1CF>
+<777E> <777E> <E1CE>
+<777F> <777F> <E1CD>
+<778B> <778B> <E1D1>
+<778E> <778E> <E1D0>
+<7791> <7791> <E1D2>
+<779E> <779E> <E1D4>
+<77A0> <77A0> <E1D3>
+<77A5> <77A5> <95CB>
+<77AC> <77AC> <8F75>
+<77AD> <77AD> <97C4>
+<77B0> <77B0> <E1D5>
+<77B3> <77B3> <93B5>
+<77B6> <77B6> <E1D6>
+<77B9> <77B9> <E1D7>
+<77BB> <77BB> <E1DB>
+<77BC> <77BD> <E1D9>
+<77BF> <77BF> <E1D8>
+<77C7> <77C7> <E1DC>
+<77CD> <77CD> <E1DD>
+<77D7> <77D7> <E1DE>
+<77DA> <77DA> <E1DF>
+<77DB> <77DB> <96B5>
+<77DC> <77DC> <E1E0>
+<77E2> <77E2> <96EE>
+<77E3> <77E3> <E1E1>
+<77E5> <77E5> <926D>
+<77E7> <77E7> <948A>
+<77E9> <77E9> <8BE9>
+<77ED> <77ED> <925A>
+<77EE> <77EE> <E1E2>
+<77EF> <77EF> <8BB8>
+<77F3> <77F3> <90CE>
+<77FC> <77FC> <E1E3>
+<7802> <7802> <8DBB>
+<780C> <780C> <E1E4>
+<7812> <7812> <E1E5>
+<7814> <7814> <8CA4>
+<7815> <7815> <8DD3>
+<7820> <7820> <E1E7>
+<7825> <7825> <9375>
+<7826> <7826> <8DD4>
+<7827> <7827> <8B6D>
+<7832> <7832> <9643>
+<7834> <7834> <946A>
+<783A> <783A> <9376>
+<783F> <783F> <8D7B>
+<7845> <7845> <E1E9>
+<785D> <785D> <8FC9>
+<786B> <786B> <97B0>
+<786C> <786C> <8D64>
+<786F> <786F> <8CA5>
+<7872> <7872> <94A1>
+<7874> <7874> <E1EB>
+<787C> <787C> <E1ED>
+<7881> <7881> <8CE9>
+<7886> <7886> <E1EC>
+<7887> <7887> <92F4>
+<788C> <788C> <E1EF>
+<788D> <788D> <8A56>
+<788E> <788E> <E1EA>
+<7891> <7891> <94E8>
+<7893> <7893> <894F>
+<7895> <7895> <8DEA>
+<7897> <7897> <9871>
+<789A> <789A> <E1EE>
+<78A3> <78A3> <E1F0>
+<78A7> <78A7> <95C9>
+<78A9> <78A9> <90D7>
+endbfrange
+
+100 beginbfrange
+<78AA> <78AA> <E1F2>
+<78AF> <78AF> <E1F3>
+<78B5> <78B5> <E1F1>
+<78BA> <78BA> <8A6D>
+<78BC> <78BC> <E1F9>
+<78BE> <78BE> <E1F8>
+<78C1> <78C1> <8EA5>
+<78C5> <78C5> <E1FA>
+<78C6> <78C6> <E1F5>
+<78CA> <78CA> <E1FB>
+<78CB> <78CB> <E1F6>
+<78D0> <78D0> <94D6>
+<78D1> <78D1> <E1F4>
+<78D4> <78D4> <E1F7>
+<78DA> <78DA> <E241>
+<78E7> <78E7> <E240>
+<78E8> <78E8> <9681>
+<78EC> <78EC> <E1FC>
+<78EF> <78EF> <88E9>
+<78F4> <78F4> <E243>
+<78FD> <78FD> <E242>
+<7901> <7901> <8FCA>
+<7907> <7907> <E244>
+<790E> <790E> <9162>
+<7911> <7911> <E246>
+<7912> <7912> <E245>
+<7919> <7919> <E247>
+<7926> <7926> <E1E6>
+<792A> <792A> <E1E8>
+<792B> <792B> <E249>
+<792C> <792C> <E248>
+<793A> <793A> <8EA6>
+<793C> <793C> <97E7>
+<793E> <793E> <8ED0>
+<7940> <7940> <E24A>
+<7941> <7941> <8C56>
+<7947> <7947> <8B5F>
+<7948> <7948> <8B46>
+<7949> <7949> <8E83>
+<7950> <7950> <9753>
+<7953> <7953> <E250>
+<7955> <7955> <E24F>
+<7956> <7956> <9163>
+<7957> <7957> <E24C>
+<795A> <795A> <E24E>
+<795D> <795D> <8F6A>
+<795E> <795E> <905F>
+<795F> <795F> <E24D>
+<7960> <7960> <E24B>
+<7962> <7962> <9449>
+<7965> <7965> <8FCB>
+<7968> <7968> <955B>
+<796D> <796D> <8DD5>
+<7977> <7977> <9398>
+<797A> <797A> <E251>
+<797F> <797F> <E252>
+<7980> <7980> <E268>
+<7981> <7981> <8BD6>
+<7984> <7984> <985C>
+<7985> <7985> <9154>
+<798A> <798A> <E253>
+<798D> <798D> <89D0>
+<798E> <798E> <92F5>
+<798F> <798F> <959F>
+<799D> <799D> <E254>
+<79A6> <79A6> <8B9A>
+<79A7> <79A7> <E255>
+<79AA> <79AA> <E257>
+<79AE> <79AE> <E258>
+<79B0> <79B0> <9448>
+<79B1> <79B1> <9398>
+<79B3> <79B3> <E259>
+<79B9> <79BA> <E25A>
+<79BD> <79BD> <8BD7>
+<79BE> <79BE> <89D1>
+<79BF> <79BF> <93C3>
+<79C0> <79C0> <8F47>
+<79C1> <79C1> <8E84>
+<79C9> <79C9> <E25C>
+<79CB> <79CB> <8F48>
+<79D1> <79D1> <89C8>
+<79D2> <79D2> <9562>
+<79D5> <79D5> <E25D>
+<79D8> <79D8> <94E9>
+<79DF> <79DF> <9164>
+<79E1> <79E1> <E260>
+<79E3> <79E3> <E261>
+<79E4> <79E4> <9489>
+<79E6> <79E6> <9060>
+<79E7> <79E7> <E25E>
+<79E9> <79E9> <9281>
+<79EC> <79EC> <E25F>
+<79F0> <79F0> <8FCC>
+<79FB> <79FB> <88DA>
+<7A00> <7A00> <8B48>
+<7A08> <7A08> <E262>
+<7A0B> <7A0B> <92F6>
+<7A0D> <7A0D> <E263>
+<7A0E> <7A0E> <90C5>
+<7A14> <7A14> <96AB>
+endbfrange
+
+100 beginbfrange
+<7A17> <7A17> <9542>
+<7A18> <7A19> <E264>
+<7A1A> <7A1A> <9274>
+<7A1C> <7A1C> <97C5>
+<7A1F> <7A1F> <E267>
+<7A20> <7A20> <E266>
+<7A2E> <7A2E> <8EED>
+<7A31> <7A31> <E269>
+<7A32> <7A32> <88EE>
+<7A37> <7A37> <E26C>
+<7A3B> <7A3B> <E26A>
+<7A3C> <7A3C> <89D2>
+<7A3D> <7A3D> <8C6D>
+<7A3E> <7A3E> <E26B>
+<7A3F> <7A3F> <8D65>
+<7A40> <7A40> <8D92>
+<7A42> <7A42> <95E4>
+<7A43> <7A43> <E26D>
+<7A46> <7A46> <9673>
+<7A49> <7A49> <E26F>
+<7A4D> <7A4D> <90CF>
+<7A4E> <7A4E> <896E>
+<7A4F> <7A4F> <89B8>
+<7A50> <7A50> <88AA>
+<7A57> <7A57> <E26E>
+<7A61> <7A62> <E270>
+<7A63> <7A63> <8FF5>
+<7A69> <7A69> <E272>
+<7A6B> <7A6B> <8A6E>
+<7A70> <7A70> <E274>
+<7A74> <7A74> <8C8A>
+<7A76> <7A76> <8B86>
+<7A79> <7A79> <E275>
+<7A7A> <7A7A> <8BF3>
+<7A7D> <7A7D> <E276>
+<7A7F> <7A7F> <90FA>
+<7A81> <7A81> <93CB>
+<7A83> <7A83> <90DE>
+<7A84> <7A84> <8DF3>
+<7A88> <7A88> <E277>
+<7A92> <7A92> <9282>
+<7A93> <7A93> <918B>
+<7A95> <7A95> <E279>
+<7A96> <7A96> <E27B>
+<7A97> <7A97> <E278>
+<7A98> <7A98> <E27A>
+<7A9F> <7A9F> <8C41>
+<7AA9> <7AA9> <E27C>
+<7AAA> <7AAA> <8C45>
+<7AAE> <7AAE> <8B87>
+<7AAF> <7AAF> <9771>
+<7AB0> <7AB0> <E27E>
+<7AB6> <7AB6> <E280>
+<7ABA> <7ABA> <894D>
+<7ABF> <7ABF> <E283>
+<7AC3> <7AC3> <8A96>
+<7AC4> <7AC4> <E282>
+<7AC5> <7AC5> <E281>
+<7AC7> <7AC7> <E285>
+<7AC8> <7AC8> <E27D>
+<7ACA> <7ACA> <E286>
+<7ACB> <7ACB> <97A7>
+<7ACD> <7ACD> <E287>
+<7ACF> <7ACF> <E288>
+<7AD2> <7AD2> <9AF2>
+<7AD3> <7AD3> <E28A>
+<7AD5> <7AD5> <E289>
+<7AD9> <7ADA> <E28B>
+<7ADC> <7ADC> <97B3>
+<7ADD> <7ADD> <E28D>
+<7ADF> <7ADF> <E8ED>
+<7AE0> <7AE0> <8FCD>
+<7AE1> <7AE2> <E28E>
+<7AE3> <7AE3> <8F76>
+<7AE5> <7AE5> <93B6>
+<7AE6> <7AE6> <E290>
+<7AEA> <7AEA> <9247>
+<7AED> <7AED> <E291>
+<7AEF> <7AEF> <925B>
+<7AF0> <7AF0> <E292>
+<7AF6> <7AF6> <8BA3>
+<7AF8> <7AF8> <995E>
+<7AF9> <7AF9> <927C>
+<7AFA> <7AFA> <8EB1>
+<7AFF> <7AFF> <8AC6>
+<7B02> <7B02> <E293>
+<7B04> <7B04> <E2A0>
+<7B06> <7B06> <E296>
+<7B08> <7B08> <8B88>
+<7B0A> <7B0A> <E295>
+<7B0B> <7B0B> <E2A2>
+<7B0F> <7B0F> <E294>
+<7B11> <7B11> <8FCE>
+<7B18> <7B19> <E298>
+<7B1B> <7B1B> <934A>
+<7B1E> <7B1E> <E29A>
+<7B20> <7B20> <8A7D>
+<7B25> <7B25> <9079>
+<7B26> <7B26> <9584>
+<7B28> <7B28> <E29C>
+endbfrange
+
+100 beginbfrange
+<7B2C> <7B2C> <91E6>
+<7B33> <7B33> <E297>
+<7B35> <7B35> <E29B>
+<7B36> <7B36> <E29D>
+<7B39> <7B39> <8DF9>
+<7B45> <7B45> <E2A4>
+<7B46> <7B46> <954D>
+<7B48> <7B48> <94A4>
+<7B49> <7B49> <9399>
+<7B4B> <7B4B> <8BD8>
+<7B4C> <7B4C> <E2A3>
+<7B4D> <7B4D> <E2A1>
+<7B4F> <7B4F> <94B3>
+<7B50> <7B50> <E29E>
+<7B51> <7B51> <927D>
+<7B52> <7B52> <939B>
+<7B54> <7B54> <939A>
+<7B56> <7B56> <8DF4>
+<7B5D> <7B5D> <E2B6>
+<7B65> <7B65> <E2A6>
+<7B67> <7B67> <E2A8>
+<7B6C> <7B6C> <E2AB>
+<7B6E> <7B6E> <E2AC>
+<7B70> <7B71> <E2A9>
+<7B74> <7B74> <E2A7>
+<7B75> <7B75> <E2A5>
+<7B7A> <7B7A> <E29F>
+<7B86> <7B86> <95CD>
+<7B87> <7B87> <89D3>
+<7B8B> <7B8B> <E2B3>
+<7B8D> <7B8D> <E2B0>
+<7B8F> <7B8F> <E2B5>
+<7B92> <7B92> <E2B4>
+<7B94> <7B94> <9493>
+<7B95> <7B95> <96A5>
+<7B97> <7B97> <8E5A>
+<7B98> <7B98> <E2AE>
+<7B99> <7B99> <E2B7>
+<7B9A> <7B9A> <E2B2>
+<7B9C> <7B9C> <E2B1>
+<7B9D> <7B9D> <E2AD>
+<7B9F> <7B9F> <E2AF>
+<7BA1> <7BA1> <8AC7>
+<7BAA> <7BAA> <925C>
+<7BAD> <7BAD> <90FB>
+<7BB1> <7BB1> <94A0>
+<7BB4> <7BB4> <E2BC>
+<7BB8> <7BB8> <94A2>
+<7BC0> <7BC0> <90DF>
+<7BC1> <7BC1> <E2B9>
+<7BC4> <7BC4> <94CD>
+<7BC6> <7BC6> <E2BD>
+<7BC7> <7BC7> <95D1>
+<7BC9> <7BC9> <927A>
+<7BCB> <7BCB> <E2B8>
+<7BCC> <7BCC> <E2BA>
+<7BCF> <7BCF> <E2BB>
+<7BDD> <7BDD> <E2BE>
+<7BE0> <7BE0> <8EC2>
+<7BE4> <7BE4> <93C4>
+<7BE5> <7BE5> <E2C3>
+<7BE6> <7BE6> <E2C2>
+<7BE9> <7BE9> <E2BF>
+<7BED> <7BED> <9855>
+<7BF3> <7BF3> <E2C8>
+<7BF6> <7BF6> <E2CC>
+<7BF7> <7BF7> <E2C9>
+<7C00> <7C00> <E2C5>
+<7C07> <7C07> <E2C6>
+<7C0D> <7C0D> <E2CB>
+<7C11> <7C11> <E2C0>
+<7C12> <7C12> <99D3>
+<7C13> <7C13> <E2C7>
+<7C14> <7C14> <E2C1>
+<7C17> <7C17> <E2CA>
+<7C1E> <7C1E> <925C>
+<7C1F> <7C1F> <E2D0>
+<7C21> <7C21> <8AC8>
+<7C23> <7C23> <E2CD>
+<7C27> <7C27> <E2CE>
+<7C2A> <7C2A> <E2CF>
+<7C2B> <7C2B> <E2D2>
+<7C37> <7C37> <E2D1>
+<7C38> <7C38> <94F4>
+<7C3D> <7C3D> <E2D3>
+<7C3E> <7C3E> <97FA>
+<7C3F> <7C3F> <95EB>
+<7C40> <7C40> <E2D8>
+<7C43> <7C43> <E2D5>
+<7C4C> <7C4C> <E2D4>
+<7C4D> <7C4D> <90D0>
+<7C4F> <7C4F> <E2D7>
+<7C50> <7C50> <E2D9>
+<7C54> <7C54> <E2D6>
+<7C56> <7C56> <E2DD>
+<7C58> <7C58> <E2DA>
+<7C5F> <7C5F> <E2DB>
+<7C60> <7C60> <E2C4>
+<7C64> <7C64> <E2DC>
+<7C65> <7C65> <E2DE>
+endbfrange
+
+100 beginbfrange
+<7C6C> <7C6C> <E2DF>
+<7C73> <7C73> <95C4>
+<7C75> <7C75> <E2E0>
+<7C7E> <7C7E> <96E0>
+<7C81> <7C81> <8BCC>
+<7C82> <7C82> <8C48>
+<7C83> <7C83> <E2E1>
+<7C89> <7C89> <95B2>
+<7C8B> <7C8B> <9088>
+<7C8D> <7C8D> <96AE>
+<7C90> <7C90> <E2E2>
+<7C92> <7C92> <97B1>
+<7C95> <7C95> <9494>
+<7C97> <7C97> <9165>
+<7C98> <7C98> <9453>
+<7C9B> <7C9B> <8F6C>
+<7C9F> <7C9F> <88BE>
+<7CA1> <7CA1> <E2E7>
+<7CA2> <7CA2> <E2E5>
+<7CA4> <7CA4> <E2E3>
+<7CA5> <7CA5> <8A9F>
+<7CA7> <7CA7> <8FCF>
+<7CA8> <7CA8> <E2E8>
+<7CAB> <7CAB> <E2E6>
+<7CAD> <7CAD> <E2E4>
+<7CAE> <7CAE> <E2EC>
+<7CB1> <7CB1> <E2EB>
+<7CB2> <7CB2> <E2EA>
+<7CB3> <7CB3> <E2E9>
+<7CB9> <7CB9> <E2ED>
+<7CBD> <7CBD> <E2EE>
+<7CBE> <7CBE> <90B8>
+<7CC0> <7CC0> <E2EF>
+<7CC2> <7CC2> <E2F1>
+<7CC5> <7CC5> <E2F0>
+<7CCA> <7CCA> <8CD0>
+<7CCE> <7CCE> <9157>
+<7CD2> <7CD2> <E2F3>
+<7CD6> <7CD6> <939C>
+<7CD8> <7CD8> <E2F2>
+<7CDC> <7CDC> <E2F4>
+<7CDE> <7CDE> <95B3>
+<7CDF> <7CDF> <918C>
+<7CE0> <7CE0> <8D66>
+<7CE2> <7CE2> <E2F5>
+<7CE7> <7CE7> <97C6>
+<7CEF> <7CEF> <E2F7>
+<7CF2> <7CF2> <E2F8>
+<7CF4> <7CF4> <E2F9>
+<7CF6> <7CF6> <E2FA>
+<7CF8> <7CF8> <8E85>
+<7CFA> <7CFA> <E2FB>
+<7CFB> <7CFB> <8C6E>
+<7CFE> <7CFE> <8B8A>
+<7D00> <7D00> <8B49>
+<7D02> <7D02> <E340>
+<7D04> <7D04> <96F1>
+<7D05> <7D05> <8D67>
+<7D06> <7D06> <E2FC>
+<7D0A> <7D0A> <E343>
+<7D0B> <7D0B> <96E4>
+<7D0D> <7D0D> <945B>
+<7D10> <7D10> <9552>
+<7D14> <7D14> <8F83>
+<7D15> <7D15> <E342>
+<7D17> <7D17> <8ED1>
+<7D18> <7D18> <8D68>
+<7D19> <7D19> <8E86>
+<7D1A> <7D1A> <8B89>
+<7D1B> <7D1B> <95B4>
+<7D1C> <7D1C> <E341>
+<7D20> <7D20> <9166>
+<7D21> <7D21> <9661>
+<7D22> <7D22> <8DF5>
+<7D2B> <7D2B> <8E87>
+<7D2C> <7D2C> <92DB>
+<7D2E> <7D2E> <E346>
+<7D2F> <7D2F> <97DD>
+<7D30> <7D30> <8DD7>
+<7D32> <7D32> <E347>
+<7D33> <7D33> <9061>
+<7D35> <7D35> <E349>
+<7D39> <7D39> <8FD0>
+<7D3A> <7D3A> <8DAE>
+<7D3F> <7D3F> <E348>
+<7D42> <7D42> <8F49>
+<7D43> <7D43> <8CBC>
+<7D44> <7D44> <9167>
+<7D45> <7D45> <E344>
+<7D46> <7D46> <E34A>
+<7D4B> <7D4B> <E345>
+<7D4C> <7D4C> <8C6F>
+<7D4E> <7D4E> <E34D>
+<7D4F> <7D4F> <E351>
+<7D50> <7D50> <8C8B>
+<7D56> <7D56> <E34C>
+<7D5B> <7D5B> <E355>
+<7D5E> <7D5E> <8D69>
+<7D61> <7D61> <978D>
+<7D62> <7D62> <88BA>
+endbfrange
+
+100 beginbfrange
+<7D63> <7D63> <E352>
+<7D66> <7D66> <8B8B>
+<7D68> <7D68> <E34F>
+<7D6E> <7D6E> <E350>
+<7D71> <7D71> <939D>
+<7D72> <7D72> <E34E>
+<7D73> <7D73> <E34B>
+<7D75> <7D75> <8A47>
+<7D76> <7D76> <90E2>
+<7D79> <7D79> <8CA6>
+<7D7D> <7D7D> <E357>
+<7D89> <7D89> <E354>
+<7D8F> <7D8F> <E356>
+<7D93> <7D93> <E353>
+<7D99> <7D99> <8C70>
+<7D9A> <7D9A> <91B1>
+<7D9B> <7D9B> <E358>
+<7D9C> <7D9C> <918E>
+<7D9F> <7D9F> <E365>
+<7DA2> <7DA2> <E361>
+<7DA3> <7DA3> <E35B>
+<7DAB> <7DAB> <E35F>
+<7DAC> <7DAC> <8EF8>
+<7DAD> <7DAD> <88DB>
+<7DAE> <7DAE> <E35A>
+<7DAF> <7DAF> <E362>
+<7DB0> <7DB0> <E366>
+<7DB1> <7DB1> <8D6A>
+<7DB2> <7DB2> <96D4>
+<7DB4> <7DB4> <92D4>
+<7DB5> <7DB5> <E35C>
+<7DB8> <7DB8> <E364>
+<7DBA> <7DBA> <E359>
+<7DBB> <7DBB> <925D>
+<7DBD> <7DBD> <E35E>
+<7DBE> <7DBE> <88BB>
+<7DBF> <7DBF> <96C8>
+<7DC7> <7DC7> <E35D>
+<7DCA> <7DCA> <8BD9>
+<7DCB> <7DCB> <94EA>
+<7DCF> <7DCF> <918D>
+<7DD1> <7DD1> <97CE>
+<7DD2> <7DD2> <8F8F>
+<7DD5> <7DD5> <E38E>
+<7DD8> <7DD8> <E367>
+<7DDA> <7DDA> <90FC>
+<7DDC> <7DDC> <E363>
+<7DDD> <7DDD> <E368>
+<7DDE> <7DDE> <E36A>
+<7DE0> <7DE0> <92F7>
+<7DE1> <7DE1> <E36D>
+<7DE4> <7DE4> <E369>
+<7DE8> <7DE8> <95D2>
+<7DE9> <7DE9> <8AC9>
+<7DEC> <7DEC> <96C9>
+<7DEF> <7DEF> <88DC>
+<7DF2> <7DF2> <E36C>
+<7DF4> <7DF4> <97FB>
+<7DFB> <7DFB> <E36B>
+<7E01> <7E01> <898F>
+<7E04> <7E04> <93EA>
+<7E05> <7E05> <E36E>
+<7E09> <7E09> <E375>
+<7E0A> <7E0A> <E36F>
+<7E0B> <7E0B> <E376>
+<7E12> <7E12> <E372>
+<7E1B> <7E1B> <949B>
+<7E1E> <7E1E> <8EC8>
+<7E1F> <7E1F> <E374>
+<7E21> <7E21> <E371>
+<7E22> <7E22> <E377>
+<7E23> <7E23> <E370>
+<7E26> <7E26> <8F63>
+<7E2B> <7E2B> <9644>
+<7E2E> <7E2E> <8F6B>
+<7E31> <7E31> <E373>
+<7E32> <7E32> <E380>
+<7E35> <7E35> <E37B>
+<7E37> <7E37> <E37E>
+<7E39> <7E39> <E37C>
+<7E3A> <7E3A> <E381>
+<7E3B> <7E3B> <E37A>
+<7E3D> <7E3D> <E360>
+<7E3E> <7E3E> <90D1>
+<7E41> <7E41> <94C9>
+<7E43> <7E43> <E37D>
+<7E46> <7E46> <E378>
+<7E4A> <7E4A> <9140>
+<7E4B> <7E4B> <8C71>
+<7E4D> <7E4D> <8F4A>
+<7E54> <7E54> <9044>
+<7E55> <7E55> <9155>
+<7E56> <7E56> <E384>
+<7E59> <7E5A> <E386>
+<7E5D> <7E5D> <E383>
+<7E5E> <7E5E> <E385>
+<7E61> <7E61> <8F4A>
+<7E66> <7E66> <E379>
+<7E67> <7E67> <E382>
+<7E69> <7E69> <E38A>
+endbfrange
+
+100 beginbfrange
+<7E6A> <7E6A> <E389>
+<7E6B> <7E6B> <8C71>
+<7E6D> <7E6D> <969A>
+<7E70> <7E70> <8C4A>
+<7E79> <7E79> <E388>
+<7E7B> <7E7B> <E38C>
+<7E7C> <7E7C> <E38B>
+<7E7D> <7E7D> <E38F>
+<7E7F> <7E7F> <E391>
+<7E82> <7E82> <8E5B>
+<7E83> <7E83> <E38D>
+<7E88> <7E89> <E392>
+<7E8C> <7E8C> <E394>
+<7E8E> <7E8E> <E39A>
+<7E8F> <7E8F> <935A>
+<7E90> <7E90> <E396>
+<7E92> <7E92> <E395>
+<7E93> <7E94> <E397>
+<7E96> <7E96> <E399>
+<7E9B> <7E9C> <E39B>
+<7F36> <7F36> <8ACA>
+<7F38> <7F38> <E39D>
+<7F3A> <7F3A> <E39E>
+<7F45> <7F45> <E39F>
+<7F4C> <7F4E> <E3A0>
+<7F50> <7F51> <E3A3>
+<7F54> <7F54> <E3A6>
+<7F55> <7F55> <E3A5>
+<7F58> <7F58> <E3A7>
+<7F5F> <7F60> <E3A8>
+<7F67> <7F67> <E3AC>
+<7F68> <7F69> <E3AA>
+<7F6A> <7F6A> <8DDF>
+<7F6B> <7F6B> <8C72>
+<7F6E> <7F6E> <9275>
+<7F70> <7F70> <94B1>
+<7F72> <7F72> <8F90>
+<7F75> <7F75> <946C>
+<7F77> <7F77> <94EB>
+<7F78> <7F78> <E3AD>
+<7F79> <7F79> <9CEB>
+<7F82> <7F82> <E3AE>
+<7F83> <7F83> <E3B0>
+<7F85> <7F85> <9785>
+<7F86> <7F86> <E3AF>
+<7F87> <7F87> <E3B2>
+<7F88> <7F88> <E3B1>
+<7F8A> <7F8A> <9772>
+<7F8C> <7F8C> <E3B3>
+<7F8E> <7F8E> <94FC>
+<7F94> <7F94> <E3B4>
+<7F9A> <7F9A> <E3B7>
+<7F9D> <7F9D> <E3B6>
+<7F9E> <7F9E> <E3B5>
+<7FA3> <7FA3> <E3B8>
+<7FA4> <7FA4> <8C51>
+<7FA8> <7FA8> <9141>
+<7FA9> <7FA9> <8B60>
+<7FAE> <7FAE> <E3BC>
+<7FAF> <7FAF> <E3B9>
+<7FB2> <7FB2> <E3BA>
+<7FB6> <7FB6> <E3BD>
+<7FB8> <7FB8> <E3BE>
+<7FB9> <7FB9> <E3BB>
+<7FBD> <7FBD> <8948>
+<7FC1> <7FC1> <89A5>
+<7FC5> <7FC6> <E3C0>
+<7FCA> <7FCA> <E3C2>
+<7FCC> <7FCC> <9782>
+<7FD2> <7FD2> <8F4B>
+<7FD4> <7FD4> <E3C4>
+<7FD5> <7FD5> <E3C3>
+<7FE0> <7FE0> <9089>
+<7FE1> <7FE1> <E3C5>
+<7FE6> <7FE6> <E3C6>
+<7FE9> <7FE9> <E3C7>
+<7FEB> <7FEB> <8AE3>
+<7FF0> <7FF0> <8ACB>
+<7FF3> <7FF3> <E3C8>
+<7FF9> <7FF9> <E3C9>
+<7FFB> <7FFB> <967C>
+<7FFC> <7FFC> <9783>
+<8000> <8000> <9773>
+<8001> <8001> <9856>
+<8003> <8003> <8D6C>
+<8004> <8004> <E3CC>
+<8005> <8005> <8ED2>
+<8006> <8006> <E3CB>
+<800B> <800B> <E3CD>
+<800C> <800C> <8EA7>
+<8010> <8010> <91CF>
+<8012> <8012> <E3CE>
+<8015> <8015> <8D6B>
+<8017> <8017> <96D5>
+<8018> <8019> <E3CF>
+<801C> <801C> <E3D1>
+<8021> <8021> <E3D2>
+<8028> <8028> <E3D3>
+<8033> <8033> <8EA8>
+<8036> <8036> <96EB>
+endbfrange
+
+100 beginbfrange
+<803B> <803B> <E3D5>
+<803D> <803D> <925E>
+<803F> <803F> <E3D4>
+<8046> <8046> <E3D7>
+<804A> <804A> <E3D6>
+<8052> <8052> <E3D8>
+<8056> <8056> <90B9>
+<8058> <8058> <E3D9>
+<805A> <805A> <E3DA>
+<805E> <805E> <95B7>
+<805F> <805F> <E3DB>
+<8061> <8061> <918F>
+<8062> <8062> <E3DC>
+<8068> <8068> <E3DD>
+<806F> <806F> <97FC>
+<8070> <8070> <E3E0>
+<8072> <8072> <E3DF>
+<8073> <8073> <E3DE>
+<8074> <8074> <92AE>
+<8076> <8076> <E3E1>
+<8077> <8077> <9045>
+<8079> <8079> <E3E2>
+<807D> <807D> <E3E3>
+<807E> <807E> <9857>
+<807F> <807F> <E3E4>
+<8084> <8084> <E3E5>
+<8085> <8085> <E3E7>
+<8086> <8086> <E3E6>
+<8087> <8087> <94A3>
+<8089> <8089> <93F7>
+<808B> <808B> <985D>
+<808C> <808C> <94A7>
+<8093> <8093> <E3E9>
+<8096> <8096> <8FD1>
+<8098> <8098> <9549>
+<809A> <809A> <E3EA>
+<809B> <809B> <E3E8>
+<809D> <809D> <8ACC>
+<80A1> <80A1> <8CD2>
+<80A2> <80A2> <8E88>
+<80A5> <80A5> <94EC>
+<80A9> <80A9> <8CA8>
+<80AA> <80AA> <9662>
+<80AC> <80AC> <E3ED>
+<80AD> <80AD> <E3EB>
+<80AF> <80AF> <8D6D>
+<80B1> <80B1> <8D6E>
+<80B2> <80B2> <88E7>
+<80B4> <80B4> <8DE6>
+<80BA> <80BA> <9478>
+<80C3> <80C3> <88DD>
+<80C4> <80C4> <E3F2>
+<80C6> <80C6> <925F>
+<80CC> <80CC> <9477>
+<80CE> <80CE> <91D9>
+<80D6> <80D6> <E3F4>
+<80D9> <80D9> <E3F0>
+<80DA> <80DA> <E3F3>
+<80DB> <80DB> <E3EE>
+<80DD> <80DD> <E3F1>
+<80DE> <80DE> <9645>
+<80E1> <80E1> <8CD3>
+<80E4> <80E4> <88FB>
+<80E5> <80E5> <E3EF>
+<80EF> <80EF> <E3F6>
+<80F1> <80F1> <E3F7>
+<80F4> <80F4> <93B7>
+<80F8> <80F8> <8BB9>
+<80FC> <80FC> <E445>
+<80FD> <80FD> <945C>
+<8102> <8102> <8E89>
+<8105> <8105> <8BBA>
+<8106> <8106> <90C6>
+<8107> <8107> <9865>
+<8108> <8108> <96AC>
+<8109> <8109> <E3F5>
+<810A> <810A> <90D2>
+<811A> <811A> <8B72>
+<811B> <811B> <E3F8>
+<8123> <8123> <E3FA>
+<8129> <8129> <E3F9>
+<812F> <812F> <E3FB>
+<8131> <8131> <9245>
+<8133> <8133> <945D>
+<8139> <8139> <92AF>
+<813E> <813E> <E442>
+<8146> <8146> <E441>
+<814B> <814B> <E3FC>
+<814E> <814E> <9074>
+<8150> <8150> <9585>
+<8151> <8151> <E444>
+<8153> <8153> <E443>
+<8154> <8154> <8D6F>
+<8155> <8155> <9872>
+<815F> <815F> <E454>
+<8165> <8166> <E448>
+<816B> <816B> <8EEE>
+<816E> <816E> <E447>
+<8170> <8170> <8D98>
+<8171> <8171> <E446>
+endbfrange
+
+100 beginbfrange
+<8174> <8174> <E44A>
+<8178> <8178> <92B0>
+<8179> <8179> <95A0>
+<817A> <817A> <9142>
+<817F> <817F> <91DA>
+<8180> <8180> <E44E>
+<8182> <8182> <E44F>
+<8183> <8183> <E44B>
+<8188> <8188> <E44C>
+<818A> <818A> <E44D>
+<818F> <818F> <8D70>
+<8193> <8193> <E455>
+<8195> <8195> <E451>
+<819A> <819A> <9586>
+<819C> <819C> <968C>
+<819D> <819D> <9547>
+<81A0> <81A0> <E450>
+<81A3> <81A3> <E453>
+<81A4> <81A4> <E452>
+<81A8> <81A8> <9663>
+<81A9> <81A9> <E456>
+<81B0> <81B0> <E457>
+<81B3> <81B3> <9156>
+<81B5> <81B5> <E458>
+<81B8> <81B8> <E45A>
+<81BA> <81BA> <E45E>
+<81BD> <81BD> <E45B>
+<81BE> <81BE> <E459>
+<81BF> <81BF> <945E>
+<81C0> <81C0> <E45C>
+<81C2> <81C2> <E45D>
+<81C6> <81C6> <89B0>
+<81C8> <81C8> <E464>
+<81C9> <81C9> <E45F>
+<81CD> <81CD> <E460>
+<81D1> <81D1> <E461>
+<81D3> <81D3> <919F>
+<81D8> <81D8> <E463>
+<81D9> <81D9> <E462>
+<81DA> <81DA> <E465>
+<81DF> <81E0> <E466>
+<81E3> <81E3> <9062>
+<81E5> <81E5> <89E7>
+<81E7> <81E7> <E468>
+<81E8> <81E8> <97D5>
+<81EA> <81EA> <8EA9>
+<81ED> <81ED> <8F4C>
+<81F3> <81F3> <8E8A>
+<81F4> <81F4> <9276>
+<81FA> <81FB> <E469>
+<81FC> <81FC> <8950>
+<81FE> <81FE> <E46B>
+<8201> <8202> <E46C>
+<8205> <8205> <E46E>
+<8207> <8207> <E46F>
+<8208> <8208> <8BBB>
+<8209> <8209> <9DA8>
+<820A> <820A> <E470>
+<820C> <820C> <90E3>
+<820D> <820D> <E471>
+<820E> <820E> <8EC9>
+<8210> <8210> <E472>
+<8212> <8212> <98AE>
+<8216> <8216> <E473>
+<8217> <8217> <95DC>
+<8218> <8218> <8ADA>
+<821B> <821B> <9143>
+<821C> <821C> <8F77>
+<821E> <821E> <9591>
+<821F> <821F> <8F4D>
+<8229> <8229> <E474>
+<822A> <822A> <8D71>
+<822B> <822B> <E475>
+<822C> <822C> <94CA>
+<822E> <822E> <E484>
+<8233> <8233> <E477>
+<8235> <8235> <91C7>
+<8236> <8236> <9495>
+<8237> <8237> <8CBD>
+<8238> <8238> <E476>
+<8239> <8239> <9144>
+<8240> <8240> <E478>
+<8247> <8247> <92F8>
+<8258> <8258> <E47A>
+<8259> <8259> <E479>
+<825A> <825A> <E47C>
+<825D> <825D> <E47B>
+<825F> <825F> <E47D>
+<8262> <8262> <E480>
+<8264> <8264> <E47E>
+<8266> <8266> <8ACD>
+<8268> <8268> <E481>
+<826A> <826B> <E482>
+<826E> <826E> <8DAF>
+<826F> <826F> <97C7>
+<8271> <8271> <E485>
+<8272> <8272> <9046>
+<8276> <8276> <8990>
+<8277> <8278> <E486>
+<827E> <827E> <E488>
+endbfrange
+
+100 beginbfrange
+<828B> <828B> <88F0>
+<828D> <828D> <E489>
+<8292> <8292> <E48A>
+<8299> <8299> <9587>
+<829D> <829D> <8EC5>
+<829F> <829F> <E48C>
+<82A5> <82A5> <8A48>
+<82A6> <82A6> <88B0>
+<82AB> <82AB> <E48B>
+<82AC> <82AC> <E48E>
+<82AD> <82AD> <946D>
+<82AF> <82AF> <9063>
+<82B1> <82B1> <89D4>
+<82B3> <82B3> <9646>
+<82B8> <82B8> <8C7C>
+<82B9> <82B9> <8BDA>
+<82BB> <82BB> <E48D>
+<82BD> <82BD> <89E8>
+<82C5> <82C5> <8AA1>
+<82D1> <82D1> <8991>
+<82D2> <82D2> <E492>
+<82D3> <82D3> <97E8>
+<82D4> <82D4> <91DB>
+<82D7> <82D7> <9563>
+<82D9> <82D9> <E49E>
+<82DB> <82DB> <89D5>
+<82DC> <82DC> <E49C>
+<82DE> <82DE> <E49A>
+<82DF> <82DF> <E491>
+<82E1> <82E1> <E48F>
+<82E3> <82E3> <E490>
+<82E5> <82E5> <8EE1>
+<82E6> <82E6> <8BEA>
+<82E7> <82E7> <9297>
+<82EB> <82EB> <93CF>
+<82F1> <82F1> <8970>
+<82F3> <82F3> <E494>
+<82F4> <82F4> <E493>
+<82F9> <82F9> <E499>
+<82FA> <82FA> <E495>
+<82FB> <82FB> <E498>
+<8302> <8302> <96CE>
+<8303> <8303> <E497>
+<8304> <8304> <89D6>
+<8305> <8305> <8A9D>
+<8306> <8306> <E49B>
+<8309> <8309> <E49D>
+<830E> <830E> <8C73>
+<8316> <8316> <E4A1>
+<8317> <8318> <E4AA>
+<831C> <831C> <88A9>
+<8323> <8323> <E4B2>
+<8328> <8328> <88EF>
+<832B> <832B> <E4A9>
+<832F> <832F> <E4A8>
+<8331> <8331> <E4A3>
+<8332> <8332> <E4A2>
+<8334> <8334> <E4A0>
+<8335> <8335> <E49F>
+<8336> <8336> <9283>
+<8338> <8338> <91F9>
+<8339> <8339> <E4A5>
+<8340> <8340> <E4A4>
+<8345> <8345> <E4A7>
+<8349> <8349> <9190>
+<834A> <834A> <8C74>
+<834F> <834F> <8960>
+<8350> <8350> <E4A6>
+<8352> <8352> <8D72>
+<8358> <8358> <9191>
+<8373> <8373> <E4B8>
+<8375> <8375> <E4B9>
+<8377> <8377> <89D7>
+<837B> <837B> <89AC>
+<837C> <837C> <E4B6>
+<8385> <8385> <E4AC>
+<8387> <8387> <E4B4>
+<8389> <8389> <E4BB>
+<838A> <838A> <E4B5>
+<838E> <838E> <E4B3>
+<8393> <8393> <E496>
+<8396> <8396> <E4B1>
+<839A> <839A> <E4AD>
+<839E> <839E> <8ACE>
+<839F> <839F> <E4AF>
+<83A0> <83A0> <E4BA>
+<83A2> <83A2> <E4B0>
+<83A8> <83A8> <E4BC>
+<83AA> <83AA> <E4AE>
+<83AB> <83AB> <949C>
+<83B1> <83B1> <9789>
+<83B5> <83B5> <E4B7>
+<83BD> <83BD> <E4CD>
+<83C1> <83C1> <E4C5>
+<83C5> <83C5> <909B>
+<83CA> <83CA> <8B65>
+<83CC> <83CC> <8BDB>
+<83CE> <83CE> <E4C0>
+<83D3> <83D3> <89D9>
+<83D6> <83D6> <8FD2>
+endbfrange
+
+100 beginbfrange
+<83D8> <83D8> <E4C3>
+<83DC> <83DC> <8DD8>
+<83DF> <83DF> <9370>
+<83E0> <83E0> <E4C8>
+<83E9> <83E9> <95EC>
+<83EB> <83EB> <E4BF>
+<83EF> <83EF> <89D8>
+<83F0> <83F0> <8CD4>
+<83F1> <83F1> <9548>
+<83F2> <83F2> <E4C9>
+<83F4> <83F4> <E4BD>
+<83F7> <83F7> <E4C6>
+<83FB> <83FB> <E4D0>
+<83FD> <83FD> <E4C1>
+<8403> <8403> <E4C2>
+<8404> <8404> <93B8>
+<8407> <8407> <E4C7>
+<840A> <840A> <9789>
+<840B> <840B> <E4C4>
+<840C> <840C> <9647>
+<840D> <840D> <E4CA>
+<840E> <840E> <88DE>
+<8413> <8413> <E4BE>
+<8420> <8420> <E4CC>
+<8422> <8422> <E4CB>
+<8429> <8429> <948B>
+<842A> <842A> <E4D2>
+<842C> <842C> <E4DD>
+<8431> <8431> <8A9E>
+<8435> <8435> <E4E0>
+<8438> <8438> <E4CE>
+<843C> <843C> <E4D3>
+<843D> <843D> <978E>
+<8446> <8446> <E4DC>
+<8449> <8449> <9774>
+<844E> <844E> <97A8>
+<8457> <8457> <9298>
+<845B> <845B> <8A8B>
+<8461> <8461> <9592>
+<8462> <8462> <E4E2>
+<8463> <8463> <939F>
+<8466> <8466> <88AF>
+<8469> <8469> <E4DB>
+<846B> <846B> <E4D7>
+<846C> <846C> <9192>
+<846D> <846D> <E4D1>
+<846E> <846E> <E4D9>
+<846F> <846F> <E4DE>
+<8471> <8471> <944B>
+<8475> <8475> <88A8>
+<8477> <8477> <E4D6>
+<8479> <8479> <E4DF>
+<847A> <847A> <9598>
+<8482> <8482> <E4DA>
+<8484> <8484> <E4D5>
+<848B> <848B> <8FD3>
+<8490> <8490> <8F4E>
+<8494> <8494> <8EAA>
+<8499> <8499> <96D6>
+<849C> <849C> <9566>
+<849F> <849F> <E4E5>
+<84A1> <84A1> <E4EE>
+<84AD> <84AD> <E4D8>
+<84B2> <84B2> <8A97>
+<84B8> <84B8> <8FF6>
+<84B9> <84B9> <E4E3>
+<84BB> <84BB> <E4E8>
+<84BC> <84BC> <9193>
+<84BF> <84BF> <E4E4>
+<84C1> <84C1> <E4EB>
+<84C4> <84C4> <927E>
+<84C6> <84C6> <E4EC>
+<84C9> <84C9> <9775>
+<84CA> <84CA> <E4E1>
+<84CB> <84CB> <8A57>
+<84CD> <84CD> <E4E7>
+<84D0> <84D0> <E4EA>
+<84D1> <84D1> <96AA>
+<84D6> <84D6> <E4ED>
+<84D9> <84D9> <E4E6>
+<84DA> <84DA> <E4E9>
+<84EC> <84EC> <9648>
+<84EE> <84EE> <9840>
+<84F4> <84F4> <E4F1>
+<84FC> <84FC> <E4F8>
+<84FF> <84FF> <E4F0>
+<8500> <8500> <8EC1>
+<8506> <8506> <E4CF>
+<8511> <8511> <95CC>
+<8513> <8513> <96A0>
+<8514> <8514> <E4F7>
+<8515> <8515> <E4F6>
+<8517> <8518> <E4F2>
+<851A> <851A> <8955>
+<851F> <851F> <E4F5>
+<8521> <8521> <E4EF>
+<8523> <8523> <8FD3>
+<8526> <8526> <92D3>
+<852C> <852C> <E4F4>
+<852D> <852D> <88FC>
+endbfrange
+
+100 beginbfrange
+<8535> <8535> <91A0>
+<853D> <853D> <95C1>
+<853E> <853E> <E55B>
+<8540> <8540> <E4F9>
+<8541> <8541> <E540>
+<8543> <8543> <94D7>
+<8548> <8548> <E4FC>
+<8549> <8549> <8FD4>
+<854A> <854A> <8EC7>
+<854B> <854B> <E542>
+<854E> <854E> <8BBC>
+<8555> <8555> <E543>
+<8557> <8557> <9599>
+<8558> <8558> <E4FB>
+<855A> <855A> <E4D4>
+<8563> <8563> <E4FA>
+<8568> <8568> <986E>
+<8569> <8569> <93A0>
+<856A> <856A> <9593>
+<856D> <856D> <E54A>
+<8577> <8577> <E550>
+<857E> <857E> <E551>
+<8580> <8580> <E544>
+<8584> <8584> <9496>
+<8587> <8587> <E54E>
+<8588> <8588> <E546>
+<858A> <858A> <E548>
+<8590> <8590> <E552>
+<8591> <8591> <E547>
+<8594> <8594> <E54B>
+<8597> <8597> <8992>
+<8599> <8599> <93E3>
+<859B> <859B> <E54C>
+<859C> <859C> <E54F>
+<85A4> <85A4> <E545>
+<85A6> <85A6> <9145>
+<85A8> <85A8> <E549>
+<85A9> <85A9> <8E46>
+<85AA> <85AA> <9064>
+<85AB> <85AB> <8C4F>
+<85AC> <85AC> <96F2>
+<85AE> <85AE> <96F7>
+<85AF> <85AF> <8F92>
+<85B9> <85B9> <E556>
+<85BA> <85BA> <E554>
+<85C1> <85C1> <986D>
+<85C9> <85C9> <E553>
+<85CD> <85CD> <9795>
+<85CF> <85CF> <E555>
+<85D0> <85D0> <E557>
+<85D5> <85D5> <E558>
+<85DC> <85DC> <E55B>
+<85DD> <85DD> <E559>
+<85E4> <85E4> <93A1>
+<85E5> <85E5> <E55A>
+<85E9> <85E9> <94CB>
+<85EA> <85EA> <E54D>
+<85F7> <85F7> <8F93>
+<85F9> <85F9> <E55C>
+<85FA> <85FA> <E561>
+<85FB> <85FB> <9194>
+<85FE> <85FE> <E560>
+<8602> <8602> <E541>
+<8606> <8606> <E562>
+<8607> <8607> <9168>
+<860A> <860A> <E55D>
+<860B> <860B> <E55F>
+<8613> <8613> <E55E>
+<8616> <8616> <9F50>
+<8617> <8617> <9F41>
+<861A> <861A> <E564>
+<8622> <8622> <E563>
+<862D> <862D> <9796>
+<862F> <862F> <E1BA>
+<8630> <8630> <E565>
+<863F> <863F> <E566>
+<864D> <864D> <E567>
+<864E> <864E> <8CD5>
+<8650> <8650> <8B73>
+<8654> <8654> <E569>
+<8655> <8655> <997C>
+<865A> <865A> <8B95>
+<865C> <865C> <97B8>
+<865E> <865E> <8BF1>
+<865F> <865F> <E56A>
+<8667> <8667> <E56B>
+<866B> <866B> <928E>
+<8671> <8671> <E56C>
+<8679> <8679> <93F8>
+<867B> <867B> <88B8>
+<868A> <868A> <89E1>
+<868B> <868C> <E571>
+<8693> <8693> <E56D>
+<8695> <8695> <8E5C>
+<86A3> <86A3> <E56E>
+<86A4> <86A4> <9461>
+<86A9> <86AA> <E56F>
+<86AB> <86AB> <E57A>
+<86AF> <86AF> <E574>
+<86B0> <86B0> <E577>
+endbfrange
+
+100 beginbfrange
+<86B6> <86B6> <E573>
+<86C4> <86C4> <E575>
+<86C6> <86C6> <E576>
+<86C7> <86C7> <8ED6>
+<86C9> <86C9> <E578>
+<86CB> <86CB> <9260>
+<86CD> <86CD> <8C75>
+<86CE> <86CE> <8A61>
+<86D4> <86D4> <E57B>
+<86D9> <86D9> <8A5E>
+<86DB> <86DB> <E581>
+<86DE> <86DE> <E57C>
+<86DF> <86DF> <E580>
+<86E4> <86E4> <94B8>
+<86E9> <86E9> <E57D>
+<86EC> <86EC> <E57E>
+<86ED> <86ED> <9567>
+<86EE> <86EE> <94D8>
+<86EF> <86EF> <E582>
+<86F8> <86F8> <91FB>
+<86F9> <86F9> <E58C>
+<86FB> <86FB> <E588>
+<86FE> <86FE> <89E9>
+<8700> <8700> <E586>
+<8702> <8702> <9649>
+<8703> <8703> <E587>
+<8706> <8706> <E584>
+<8708> <8708> <E585>
+<8709> <8709> <E58A>
+<870A> <870A> <E58D>
+<870D> <870D> <E58B>
+<8711> <8711> <E589>
+<8712> <8712> <E583>
+<8718> <8718> <9277>
+<871A> <871A> <E594>
+<871C> <871C> <96A8>
+<8725> <8725> <E592>
+<8729> <8729> <E593>
+<8734> <8734> <E58E>
+<8737> <8737> <E590>
+<873B> <873B> <E591>
+<873F> <873F> <E58F>
+<8749> <8749> <90E4>
+<874B> <874B> <9858>
+<874C> <874C> <E598>
+<874E> <874E> <E599>
+<8753> <8753> <E59F>
+<8755> <8755> <9049>
+<8757> <8757> <E59B>
+<8759> <8759> <E59E>
+<875F> <875F> <E596>
+<8760> <8760> <E595>
+<8763> <8763> <E5A0>
+<8766> <8766> <89DA>
+<8768> <8768> <E59C>
+<876A> <876A> <E5A1>
+<876E> <876E> <E59D>
+<8774> <8774> <E59A>
+<8776> <8776> <92B1>
+<8778> <8778> <E597>
+<877F> <877F> <9488>
+<8782> <8782> <E5A5>
+<878D> <878D> <975A>
+<879F> <879F> <E5A4>
+<87A2> <87A2> <E5A3>
+<87AB> <87AB> <E5AC>
+<87AF> <87AF> <E5A6>
+<87B3> <87B3> <E5AE>
+<87BA> <87BA> <9786>
+<87BB> <87BB> <E5B1>
+<87BD> <87BD> <E5A8>
+<87C0> <87C0> <E5A9>
+<87C4> <87C4> <E5AD>
+<87C6> <87C6> <E5B0>
+<87C7> <87C7> <E5AF>
+<87CB> <87CB> <E5A7>
+<87D0> <87D0> <E5AA>
+<87D2> <87D2> <E5BB>
+<87E0> <87E0> <E5B4>
+<87EC> <87EC> <90E4>
+<87EF> <87EF> <E5B2>
+<87F2> <87F2> <E5B3>
+<87F6> <87F7> <E5B8>
+<87F9> <87F9> <8A49>
+<87FB> <87FB> <8B61>
+<87FE> <87FE> <E5B7>
+<8805> <8805> <E5A2>
+<880D> <880D> <E5B6>
+<880E> <880E> <E5BA>
+<880F> <880F> <E5B5>
+<8811> <8811> <E5BC>
+<8815> <8815> <E5BE>
+<8816> <8816> <E5BD>
+<881F> <881F> <9858>
+<8821> <8821> <E5C0>
+<8822> <8822> <E5BF>
+<8823> <8823> <E579>
+<8827> <8827> <E5C4>
+<8831> <8831> <E5C1>
+<8836> <8836> <E5C2>
+endbfrange
+
+100 beginbfrange
+<8839> <8839> <E5C3>
+<883B> <883B> <E5C5>
+<8840> <8840> <8C8C>
+<8842> <8842> <E5C7>
+<8844> <8844> <E5C6>
+<8846> <8846> <8F4F>
+<884C> <884C> <8D73>
+<884D> <884D> <9FA5>
+<8852> <8852> <E5C8>
+<8853> <8853> <8F70>
+<8857> <8857> <8A58>
+<8859> <8859> <E5C9>
+<885B> <885B> <8971>
+<885D> <885D> <8FD5>
+<885E> <885E> <E5CA>
+<8861> <8861> <8D74>
+<8862> <8862> <E5CB>
+<8863> <8863> <88DF>
+<8868> <8868> <955C>
+<886B> <886B> <E5CC>
+<8870> <8870> <908A>
+<8872> <8872> <E5D3>
+<8875> <8875> <E5D0>
+<8877> <8877> <928F>
+<887D> <887D> <E5D1>
+<887E> <887E> <E5CE>
+<887F> <887F> <8BDC>
+<8881> <8881> <E5CD>
+<8882> <8882> <E5D4>
+<8888> <8888> <8C55>
+<888B> <888B> <91DC>
+<888D> <888D> <E5DA>
+<8892> <8892> <E5D6>
+<8896> <8896> <91B3>
+<8897> <8897> <E5D5>
+<8899> <8899> <E5D8>
+<889E> <889E> <E5CF>
+<88A2> <88A2> <E5D9>
+<88A4> <88A4> <E5DB>
+<88AB> <88AB> <94ED>
+<88AE> <88AE> <E5D7>
+<88B0> <88B0> <E5DC>
+<88B1> <88B1> <E5DE>
+<88B4> <88B4> <8CD1>
+<88B5> <88B5> <E5D2>
+<88B7> <88B7> <88BF>
+<88BF> <88BF> <E5DD>
+<88C1> <88C1> <8DD9>
+<88C2> <88C2> <97F4>
+<88C3> <88C4> <E5DF>
+<88C5> <88C5> <9195>
+<88CF> <88CF> <97A0>
+<88D4> <88D4> <E5E1>
+<88D5> <88D5> <9754>
+<88D8> <88D9> <E5E2>
+<88DC> <88DC> <95E2>
+<88DD> <88DD> <E5E4>
+<88DF> <88DF> <8DBE>
+<88E1> <88E1> <97A1>
+<88E8> <88E8> <E5E9>
+<88F2> <88F2> <E5EA>
+<88F3> <88F3> <8FD6>
+<88F4> <88F4> <E5E8>
+<88F8> <88F8> <9787>
+<88F9> <88F9> <E5E5>
+<88FC> <88FC> <E5E7>
+<88FD> <88FD> <90BB>
+<88FE> <88FE> <909E>
+<8902> <8902> <E5E6>
+<8904> <8904> <E5EB>
+<8907> <8907> <95A1>
+<890A> <890A> <E5ED>
+<890C> <890C> <E5EC>
+<8910> <8910> <8A8C>
+<8912> <8912> <964A>
+<8913> <8913> <E5EE>
+<891D> <891D> <E5FA>
+<891E> <891E> <E5F0>
+<8925> <8925> <E5F1>
+<892A> <892B> <E5F2>
+<8936> <8936> <E5F7>
+<8938> <8938> <E5F8>
+<893B> <893B> <E5F6>
+<8941> <8941> <E5F4>
+<8943> <8943> <E5EF>
+<8944> <8944> <E5F5>
+<894C> <894C> <E5F9>
+<894D> <894D> <E8B5>
+<8956> <8956> <89A6>
+<895E> <895E> <E5FC>
+<895F> <895F> <8BDD>
+<8960> <8960> <E5FB>
+<8964> <8964> <E641>
+<8966> <8966> <E640>
+<896A> <896A> <E643>
+<896D> <896D> <E642>
+<896F> <896F> <E644>
+<8972> <8972> <8F50>
+<8974> <8974> <E645>
+<8977> <8977> <E646>
+endbfrange
+
+100 beginbfrange
+<897E> <897E> <E647>
+<897F> <897F> <90BC>
+<8981> <8981> <9776>
+<8983> <8983> <E648>
+<8986> <8986> <95A2>
+<8987> <8987> <9465>
+<8988> <8988> <E649>
+<898A> <898A> <E64A>
+<898B> <898B> <8CA9>
+<898F> <898F> <8B4B>
+<8993> <8993> <E64B>
+<8996> <8996> <8E8B>
+<8997> <8997> <9460>
+<8998> <8998> <E64C>
+<899A> <899A> <8A6F>
+<89A1> <89A1> <E64D>
+<89A6> <89A6> <E64F>
+<89A7> <89A7> <9797>
+<89A9> <89A9> <E64E>
+<89AA> <89AA> <9065>
+<89AC> <89AC> <E650>
+<89AF> <89AF> <E651>
+<89B2> <89B2> <E652>
+<89B3> <89B3> <8ACF>
+<89BA> <89BA> <E653>
+<89BD> <89BD> <E654>
+<89BF> <89C0> <E655>
+<89D2> <89D2> <8A70>
+<89DA> <89DA> <E657>
+<89DC> <89DD> <E658>
+<89E3> <89E3> <89F0>
+<89E6> <89E6> <9047>
+<89E7> <89E7> <E65A>
+<89F4> <89F4> <E65B>
+<89F8> <89F8> <E65C>
+<8A00> <8A00> <8CBE>
+<8A02> <8A02> <92F9>
+<8A03> <8A03> <E65D>
+<8A08> <8A08> <8C76>
+<8A0A> <8A0A> <9075>
+<8A0C> <8A0C> <E660>
+<8A0E> <8A0E> <93A2>
+<8A10> <8A10> <E65F>
+<8A13> <8A13> <8C50>
+<8A16> <8A16> <E65E>
+<8A17> <8A17> <91F5>
+<8A18> <8A18> <8B4C>
+<8A1B> <8A1B> <E661>
+<8A1D> <8A1D> <E662>
+<8A1F> <8A1F> <8FD7>
+<8A23> <8A23> <8C8D>
+<8A25> <8A25> <E663>
+<8A2A> <8A2A> <964B>
+<8A2D> <8A2D> <90DD>
+<8A31> <8A31> <8B96>
+<8A33> <8A33> <96F3>
+<8A34> <8A34> <9169>
+<8A36> <8A36> <E664>
+<8A3A> <8A3A> <9066>
+<8A3B> <8A3B> <9290>
+<8A3C> <8A3C> <8FD8>
+<8A41> <8A41> <E665>
+<8A46> <8A46> <E668>
+<8A48> <8A48> <E669>
+<8A50> <8A50> <8DBC>
+<8A51> <8A51> <91C0>
+<8A52> <8A52> <E667>
+<8A54> <8A54> <8FD9>
+<8A55> <8A55> <955D>
+<8A5B> <8A5B> <E666>
+<8A5E> <8A5E> <8E8C>
+<8A60> <8A60> <8972>
+<8A62> <8A62> <E66D>
+<8A63> <8A63> <8C77>
+<8A66> <8A66> <8E8E>
+<8A69> <8A69> <8E8D>
+<8A6B> <8A6B> <986C>
+<8A6C> <8A6C> <E66C>
+<8A6D> <8A6D> <E66B>
+<8A6E> <8A6E> <9146>
+<8A70> <8A70> <8B6C>
+<8A71> <8A71> <9862>
+<8A72> <8A72> <8A59>
+<8A73> <8A73> <8FDA>
+<8A7C> <8A7C> <E66A>
+<8A82> <8A82> <E66F>
+<8A84> <8A84> <E670>
+<8A85> <8A85> <E66E>
+<8A87> <8A87> <8CD6>
+<8A89> <8A89> <975F>
+<8A8C> <8A8C> <8E8F>
+<8A8D> <8A8D> <9446>
+<8A91> <8A91> <E673>
+<8A93> <8A93> <90BE>
+<8A95> <8A95> <9261>
+<8A98> <8A98> <9755>
+<8A9A> <8A9A> <E676>
+<8A9E> <8A9E> <8CEA>
+<8AA0> <8AA0> <90BD>
+<8AA1> <8AA1> <E672>
+endbfrange
+
+100 beginbfrange
+<8AA3> <8AA3> <E677>
+<8AA4> <8AA4> <8CEB>
+<8AA5> <8AA6> <E674>
+<8AA8> <8AA8> <E671>
+<8AAC> <8AAC> <90E0>
+<8AAD> <8AAD> <93C7>
+<8AB0> <8AB0> <924E>
+<8AB2> <8AB2> <89DB>
+<8AB9> <8AB9> <94EE>
+<8ABC> <8ABC> <8B62>
+<8ABF> <8ABF> <92B2>
+<8AC2> <8AC2> <E67A>
+<8AC4> <8AC4> <E678>
+<8AC7> <8AC7> <926B>
+<8ACB> <8ACB> <90BF>
+<8ACC> <8ACC> <8AD0>
+<8ACD> <8ACD> <E679>
+<8ACF> <8ACF> <907A>
+<8AD2> <8AD2> <97C8>
+<8AD6> <8AD6> <985F>
+<8ADA> <8ADA> <E67B>
+<8ADB> <8ADB> <E687>
+<8ADC> <8ADC> <92B3>
+<8ADE> <8ADE> <E686>
+<8AE0> <8AE0> <E683>
+<8AE1> <8AE1> <E68B>
+<8AE2> <8AE2> <E684>
+<8AE4> <8AE4> <E680>
+<8AE6> <8AE6> <92FA>
+<8AE7> <8AE7> <E67E>
+<8AEB> <8AEB> <E67C>
+<8AED> <8AED> <9740>
+<8AEE> <8AEE> <8E90>
+<8AF1> <8AF1> <E681>
+<8AF3> <8AF3> <E67D>
+<8AF7> <8AF7> <E685>
+<8AF8> <8AF8> <8F94>
+<8AFA> <8AFA> <8CBF>
+<8AFE> <8AFE> <91F8>
+<8B00> <8B00> <9664>
+<8B01> <8B01> <8979>
+<8B02> <8B02> <88E0>
+<8B04> <8B04> <93A3>
+<8B07> <8B07> <E689>
+<8B0C> <8B0C> <E688>
+<8B0E> <8B0E> <93E4>
+<8B10> <8B10> <E68D>
+<8B14> <8B14> <E682>
+<8B16> <8B16> <E68C>
+<8B17> <8B17> <E68E>
+<8B19> <8B19> <8CAA>
+<8B1A> <8B1A> <E68A>
+<8B1B> <8B1B> <8D75>
+<8B1D> <8B1D> <8ED3>
+<8B20> <8B20> <E68F>
+<8B21> <8B21> <9777>
+<8B26> <8B26> <E692>
+<8B28> <8B28> <E695>
+<8B2B> <8B2B> <E693>
+<8B2C> <8B2C> <9554>
+<8B33> <8B33> <E690>
+<8B39> <8B39> <8BDE>
+<8B3E> <8B3E> <E694>
+<8B41> <8B41> <E696>
+<8B49> <8B49> <E69A>
+<8B4C> <8B4C> <E697>
+<8B4E> <8B4E> <E699>
+<8B4F> <8B4F> <E698>
+<8B56> <8B56> <E69B>
+<8B58> <8B58> <8EAF>
+<8B5A> <8B5A> <E69D>
+<8B5B> <8B5B> <E69C>
+<8B5C> <8B5C> <9588>
+<8B5F> <8B5F> <E69F>
+<8B66> <8B66> <8C78>
+<8B6B> <8B6B> <E69E>
+<8B6C> <8B6C> <E6A0>
+<8B6F> <8B6F> <E6A1>
+<8B70> <8B70> <8B63>
+<8B71> <8B71> <E3BF>
+<8B72> <8B72> <8FF7>
+<8B74> <8B74> <E6A2>
+<8B77> <8B77> <8CEC>
+<8B7D> <8B7D> <E6A3>
+<8B80> <8B80> <E6A4>
+<8B83> <8B83> <8E5D>
+<8B8A> <8B8A> <9DCC>
+<8B8C> <8B8C> <E6A5>
+<8B8E> <8B8E> <E6A6>
+<8B90> <8B90> <8F51>
+<8B92> <8B93> <E6A7>
+<8B96> <8B96> <E6A9>
+<8B99> <8B9A> <E6AA>
+<8C37> <8C37> <924A>
+<8C3A> <8C3A> <E6AC>
+<8C3F> <8C3F> <E6AE>
+<8C41> <8C41> <E6AD>
+<8C46> <8C46> <93A4>
+<8C48> <8C48> <E6AF>
+<8C4A> <8C4A> <964C>
+endbfrange
+
+100 beginbfrange
+<8C4C> <8C4C> <E6B0>
+<8C4E> <8C4E> <E6B1>
+<8C50> <8C50> <E6B2>
+<8C55> <8C55> <E6B3>
+<8C5A> <8C5A> <93D8>
+<8C61> <8C61> <8FDB>
+<8C62> <8C62> <E6B4>
+<8C6A> <8C6A> <8D8B>
+<8C6B> <8C6B> <98AC>
+<8C6C> <8C6C> <E6B5>
+<8C78> <8C78> <E6B6>
+<8C79> <8C79> <955E>
+<8C7A> <8C7A> <E6B7>
+<8C7C> <8C7C> <E6BF>
+<8C82> <8C82> <E6B8>
+<8C85> <8C85> <E6BA>
+<8C89> <8C89> <E6B9>
+<8C8A> <8C8A> <E6BB>
+<8C8C> <8C8C> <9665>
+<8C8D> <8C8E> <E6BC>
+<8C94> <8C94> <E6BE>
+<8C98> <8C98> <E6C0>
+<8C9D> <8C9D> <8A4C>
+<8C9E> <8C9E> <92E5>
+<8CA0> <8CA0> <9589>
+<8CA1> <8CA1> <8DE0>
+<8CA2> <8CA2> <8D76>
+<8CA7> <8CA7> <956E>
+<8CA8> <8CA8> <89DD>
+<8CA9> <8CA9> <94CC>
+<8CAA> <8CAA> <E6C3>
+<8CAB> <8CAB> <8AD1>
+<8CAC> <8CAC> <90D3>
+<8CAD> <8CAD> <E6C2>
+<8CAE> <8CAE> <E6C7>
+<8CAF> <8CAF> <9299>
+<8CB0> <8CB0> <96E1>
+<8CB2> <8CB3> <E6C5>
+<8CB4> <8CB4> <8B4D>
+<8CB6> <8CB6> <E6C8>
+<8CB7> <8CB7> <9483>
+<8CB8> <8CB8> <91DD>
+<8CBB> <8CBB> <94EF>
+<8CBC> <8CBC> <935C>
+<8CBD> <8CBD> <E6C4>
+<8CBF> <8CBF> <9666>
+<8CC0> <8CC0> <89EA>
+<8CC1> <8CC1> <E6CA>
+<8CC2> <8CC2> <9847>
+<8CC3> <8CC3> <92C0>
+<8CC4> <8CC4> <9864>
+<8CC7> <8CC7> <8E91>
+<8CC8> <8CC8> <E6C9>
+<8CCA> <8CCA> <91AF>
+<8CCD> <8CCD> <E6DA>
+<8CCE> <8CCE> <9147>
+<8CD1> <8CD1> <93F6>
+<8CD3> <8CD3> <956F>
+<8CDA> <8CDA> <E6CD>
+<8CDB> <8CDB> <8E5E>
+<8CDC> <8CDC> <8E92>
+<8CDE> <8CDE> <8FDC>
+<8CE0> <8CE0> <9485>
+<8CE2> <8CE2> <8CAB>
+<8CE3> <8CE3> <E6CC>
+<8CE4> <8CE4> <E6CB>
+<8CE6> <8CE6> <958A>
+<8CEA> <8CEA> <8EBF>
+<8CED> <8CED> <9371>
+<8CFA> <8CFB> <E6CF>
+<8CFC> <8CFC> <8D77>
+<8CFD> <8CFD> <E6CE>
+<8D04> <8D05> <E6D1>
+<8D07> <8D07> <E6D4>
+<8D08> <8D08> <91A1>
+<8D0A> <8D0A> <E6D3>
+<8D0B> <8D0B> <8AE4>
+<8D0D> <8D0D> <E6D6>
+<8D0F> <8D0F> <E6D5>
+<8D10> <8D10> <E6D7>
+<8D13> <8D13> <E6D9>
+<8D14> <8D14> <E6DB>
+<8D16> <8D16> <E6DC>
+<8D64> <8D64> <90D4>
+<8D66> <8D66> <8ECD>
+<8D67> <8D67> <E6DD>
+<8D6B> <8D6B> <8A71>
+<8D6D> <8D6D> <E6DE>
+<8D70> <8D70> <9196>
+<8D71> <8D71> <E6DF>
+<8D73> <8D73> <E6E0>
+<8D74> <8D74> <958B>
+<8D77> <8D77> <8B4E>
+<8D81> <8D81> <E6E1>
+<8D85> <8D85> <92B4>
+<8D8A> <8D8A> <897A>
+<8D99> <8D99> <E6E2>
+<8DA3> <8DA3> <8EEF>
+<8DA8> <8DA8> <9096>
+<8DB3> <8DB3> <91AB>
+endbfrange
+
+100 beginbfrange
+<8DBA> <8DBA> <E6E5>
+<8DBE> <8DBE> <E6E4>
+<8DC2> <8DC2> <E6E3>
+<8DCB> <8DCB> <E6EB>
+<8DCC> <8DCC> <E6E9>
+<8DCF> <8DCF> <E6E6>
+<8DD6> <8DD6> <E6E8>
+<8DDA> <8DDA> <E6E7>
+<8DDB> <8DDB> <E6EA>
+<8DDD> <8DDD> <8B97>
+<8DDF> <8DDF> <E6EE>
+<8DE1> <8DE1> <90D5>
+<8DE3> <8DE3> <E6EF>
+<8DE8> <8DE8> <8CD7>
+<8DEA> <8DEB> <E6EC>
+<8DEF> <8DEF> <9848>
+<8DF3> <8DF3> <92B5>
+<8DF5> <8DF5> <9148>
+<8DFC> <8DFC> <E6F0>
+<8DFF> <8DFF> <E6F3>
+<8E08> <8E09> <E6F1>
+<8E0A> <8E0A> <9778>
+<8E0F> <8E0F> <93A5>
+<8E10> <8E10> <E6F6>
+<8E1D> <8E1E> <E6F4>
+<8E1F> <8E1F> <E6F7>
+<8E2A> <8E2A> <E748>
+<8E30> <8E30> <E6FA>
+<8E34> <8E34> <E6FB>
+<8E35> <8E35> <E6F9>
+<8E42> <8E42> <E6F8>
+<8E44> <8E44> <92FB>
+<8E47> <8E47> <E740>
+<8E48> <8E48> <E744>
+<8E49> <8E49> <E741>
+<8E4A> <8E4A> <E6FC>
+<8E4C> <8E4C> <E742>
+<8E50> <8E50> <E743>
+<8E55> <8E55> <E74A>
+<8E59> <8E59> <E745>
+<8E5F> <8E5F> <90D6>
+<8E60> <8E60> <E747>
+<8E63> <8E63> <E749>
+<8E64> <8E64> <E746>
+<8E72> <8E72> <E74C>
+<8E74> <8E74> <8F52>
+<8E76> <8E76> <E74B>
+<8E7C> <8E7C> <E74D>
+<8E81> <8E81> <E74E>
+<8E84> <8E84> <E751>
+<8E85> <8E85> <E750>
+<8E87> <8E87> <E74F>
+<8E8A> <8E8A> <E753>
+<8E8B> <8E8B> <E752>
+<8E8D> <8E8D> <96F4>
+<8E91> <8E91> <E755>
+<8E93> <8E93> <E754>
+<8E94> <8E94> <E756>
+<8E99> <8E99> <E757>
+<8EA1> <8EA1> <E759>
+<8EAA> <8EAA> <E758>
+<8EAB> <8EAB> <9067>
+<8EAC> <8EAC> <E75A>
+<8EAF> <8EAF> <8BEB>
+<8EB0> <8EB0> <E75B>
+<8EB1> <8EB1> <E75D>
+<8EBE> <8EBE> <E75E>
+<8EC0> <8EC0> <8BEB>
+<8EC5> <8EC5> <E75F>
+<8EC6> <8EC6> <E75C>
+<8EC8> <8EC8> <E760>
+<8ECA> <8ECA> <8ED4>
+<8ECB> <8ECB> <E761>
+<8ECC> <8ECC> <8B4F>
+<8ECD> <8ECD> <8C52>
+<8ED2> <8ED2> <8CAC>
+<8EDB> <8EDB> <E762>
+<8EDF> <8EDF> <93EE>
+<8EE2> <8EE2> <935D>
+<8EE3> <8EE3> <E763>
+<8EEB> <8EEB> <E766>
+<8EF8> <8EF8> <8EB2>
+<8EFB> <8EFB> <E765>
+<8EFC> <8EFC> <E764>
+<8EFD> <8EFD> <8C79>
+<8EFE> <8EFE> <E767>
+<8F03> <8F03> <8A72>
+<8F05> <8F05> <E769>
+<8F09> <8F09> <8DDA>
+<8F0A> <8F0A> <E768>
+<8F0C> <8F0C> <E771>
+<8F12> <8F12> <E76B>
+<8F13> <8F13> <E76D>
+<8F14> <8F14> <95E3>
+<8F15> <8F15> <E76A>
+<8F19> <8F19> <E76C>
+<8F1B> <8F1B> <E770>
+<8F1C> <8F1C> <E76E>
+<8F1D> <8F1D> <8B50>
+<8F1F> <8F1F> <E76F>
+endbfrange
+
+100 beginbfrange
+<8F26> <8F26> <E772>
+<8F29> <8F29> <9479>
+<8F2A> <8F2A> <97D6>
+<8F2F> <8F2F> <8F53>
+<8F33> <8F33> <E773>
+<8F38> <8F38> <9741>
+<8F39> <8F39> <E775>
+<8F3B> <8F3B> <E774>
+<8F3E> <8F3E> <E778>
+<8F3F> <8F3F> <9760>
+<8F42> <8F42> <E777>
+<8F44> <8F44> <8A8D>
+<8F45> <8F45> <E776>
+<8F46> <8F46> <E77B>
+<8F49> <8F49> <E77A>
+<8F4C> <8F4C> <E779>
+<8F4D> <8F4D> <9351>
+<8F4E> <8F4E> <E77C>
+<8F57> <8F57> <E77D>
+<8F5C> <8F5C> <E77E>
+<8F5F> <8F5F> <8D8C>
+<8F61> <8F61> <8C44>
+<8F62> <8F64> <E780>
+<8F9B> <8F9B> <9068>
+<8F9C> <8F9C> <E783>
+<8F9E> <8F9E> <8EAB>
+<8F9F> <8F9F> <E784>
+<8FA3> <8FA3> <E785>
+<8FA7> <8FA7> <999F>
+<8FA8> <8FA8> <999E>
+<8FAD> <8FAD> <E786>
+<8FAE> <8FAE> <E390>
+<8FAF> <8FAF> <E787>
+<8FB0> <8FB0> <9243>
+<8FB1> <8FB1> <904A>
+<8FB2> <8FB2> <945F>
+<8FB7> <8FB7> <E788>
+<8FBA> <8FBA> <95D3>
+<8FBB> <8FBB> <92D2>
+<8FBC> <8FBC> <8D9E>
+<8FBF> <8FBF> <9248>
+<8FC2> <8FC2> <8949>
+<8FC4> <8FC4> <9698>
+<8FC5> <8FC5> <9076>
+<8FCE> <8FCE> <8C7D>
+<8FD1> <8FD1> <8BDF>
+<8FD4> <8FD4> <95D4>
+<8FDA> <8FDA> <E789>
+<8FE2> <8FE2> <E78B>
+<8FE5> <8FE5> <E78A>
+<8FE6> <8FE6> <89DE>
+<8FE9> <8FE9> <93F4>
+<8FEA> <8FEA> <E78C>
+<8FEB> <8FEB> <9497>
+<8FED> <8FED> <9352>
+<8FEF> <8FEF> <E78D>
+<8FF0> <8FF0> <8F71>
+<8FF4> <8FF4> <E78F>
+<8FF7> <8FF7> <96C0>
+<8FF8> <8FF8> <E79E>
+<8FF9> <8FFA> <E791>
+<8FFD> <8FFD> <92C7>
+<9000> <9000> <91DE>
+<9001> <9001> <9197>
+<9003> <9003> <93A6>
+<9005> <9005> <E790>
+<9006> <9006> <8B74>
+<900B> <900B> <E799>
+<900D> <900D> <E796>
+<900E> <900E> <E7A3>
+<900F> <900F> <93A7>
+<9010> <9010> <9280>
+<9011> <9011> <E793>
+<9013> <9013> <92FC>
+<9014> <9014> <9372>
+<9015> <9015> <E794>
+<9016> <9016> <E798>
+<9017> <9017> <9080>
+<9019> <9019> <9487>
+<901A> <901A> <92CA>
+<901D> <901D> <90C0>
+<901E> <901E> <E797>
+<901F> <901F> <91AC>
+<9020> <9020> <91A2>
+<9021> <9021> <E795>
+<9022> <9022> <88A7>
+<9023> <9023> <9841>
+<9027> <9027> <E79A>
+<902E> <902E> <91DF>
+<9031> <9031> <8F54>
+<9032> <9032> <9069>
+<9035> <9035> <E79C>
+<9036> <9036> <E79B>
+<9038> <9038> <88ED>
+<9039> <9039> <E79D>
+<903C> <903C> <954E>
+<903E> <903E> <E7A5>
+<9041> <9041> <93D9>
+<9042> <9042> <908B>
+<9045> <9045> <9278>
+endbfrange
+
+100 beginbfrange
+<9047> <9047> <8BF6>
+<9049> <9049> <E7A4>
+<904A> <904A> <9756>
+<904B> <904B> <895E>
+<904D> <904D> <95D5>
+<904E> <904E> <89DF>
+<904F> <9052> <E79F>
+<9053> <9053> <93B9>
+<9054> <9054> <9242>
+<9055> <9055> <88E1>
+<9056> <9056> <E7A6>
+<9058> <9058> <E7A7>
+<9059> <9059> <EAA1>
+<905C> <905C> <91BB>
+<905E> <905E> <E7A8>
+<9060> <9060> <8993>
+<9061> <9061> <916B>
+<9063> <9063> <8CAD>
+<9065> <9065> <9779>
+<9068> <9068> <E7A9>
+<9069> <9069> <934B>
+<906D> <906D> <9198>
+<906E> <906E> <8ED5>
+<906F> <906F> <E7AA>
+<9072> <9072> <E7AD>
+<9075> <9075> <8F85>
+<9076> <9076> <E7AB>
+<9077> <9077> <914A>
+<9078> <9078> <9149>
+<907A> <907A> <88E2>
+<907C> <907C> <97C9>
+<907D> <907D> <E7AF>
+<907F> <907F> <94F0>
+<9080> <9080> <E7B1>
+<9081> <9081> <E7B0>
+<9082> <9082> <E7AE>
+<9083> <9083> <E284>
+<9084> <9084> <8AD2>
+<9087> <9087> <E78E>
+<9089> <9089> <E7B3>
+<908A> <908A> <E7B2>
+<908F> <908F> <E7B4>
+<9091> <9091> <9757>
+<90A3> <90A3> <93DF>
+<90A6> <90A6> <964D>
+<90A8> <90A8> <E7B5>
+<90AA> <90AA> <8ED7>
+<90AF> <90AF> <E7B6>
+<90B1> <90B1> <E7B7>
+<90B5> <90B5> <E7B8>
+<90B8> <90B8> <9340>
+<90C1> <90C1> <88E8>
+<90CA> <90CA> <8D78>
+<90CE> <90CE> <9859>
+<90DB> <90DB> <E7BC>
+<90E1> <90E1> <8C53>
+<90E2> <90E2> <E7B9>
+<90E4> <90E4> <E7BA>
+<90E8> <90E8> <9594>
+<90ED> <90ED> <8A73>
+<90F5> <90F5> <9758>
+<90F7> <90F7> <8BBD>
+<90FD> <90FD> <9373>
+<9102> <9102> <E7BD>
+<9112> <9112> <E7BE>
+<9119> <9119> <E7BF>
+<912D> <912D> <9341>
+<9130> <9130> <E7C1>
+<9132> <9132> <E7C0>
+<9149> <9149> <93D1>
+<914A> <914A> <E7C2>
+<914B> <914B> <8F55>
+<914C> <914C> <8EDE>
+<914D> <914D> <947A>
+<914E> <914E> <9291>
+<9152> <9152> <8EF0>
+<9154> <9154> <908C>
+<9156> <9156> <E7C3>
+<9158> <9158> <E7C4>
+<9162> <9162> <907C>
+<9163> <9163> <E7C5>
+<9165> <9165> <E7C6>
+<9169> <9169> <E7C7>
+<916A> <916A> <978F>
+<916C> <916C> <8F56>
+<9172> <9172> <E7C9>
+<9173> <9173> <E7C8>
+<9175> <9175> <8D79>
+<9177> <9177> <8D93>
+<9178> <9178> <8E5F>
+<9182> <9182> <E7CC>
+<9187> <9187> <8F86>
+<9189> <9189> <E7CB>
+<918B> <918B> <E7CA>
+<918D> <918D> <91E7>
+<9190> <9190> <8CED>
+<9192> <9192> <90C1>
+<9197> <9197> <94AE>
+<919C> <919C> <8F58>
+<91A2> <91A2> <E7CD>
+endbfrange
+
+100 beginbfrange
+<91A4> <91A4> <8FDD>
+<91AA> <91AA> <E7D0>
+<91AB> <91AB> <E7CE>
+<91AC> <91AC> <8FDD>
+<91AF> <91AF> <E7CF>
+<91B1> <91B1> <94AE>
+<91B4> <91B4> <E7D2>
+<91B5> <91B5> <E7D1>
+<91B8> <91B8> <8FF8>
+<91BA> <91BA> <E7D3>
+<91C0> <91C1> <E7D4>
+<91C6> <91C6> <94CE>
+<91C7> <91C7> <8DD1>
+<91C8> <91C8> <8EDF>
+<91C9> <91C9> <E7D6>
+<91CB> <91CB> <E7D7>
+<91CC> <91CC> <97A2>
+<91CD> <91CD> <8F64>
+<91CE> <91CE> <96EC>
+<91CF> <91CF> <97CA>
+<91D0> <91D0> <E7D8>
+<91D1> <91D1> <8BE0>
+<91D6> <91D6> <E7D9>
+<91D8> <91D8> <9342>
+<91DB> <91DB> <E7DC>
+<91DC> <91DC> <8A98>
+<91DD> <91DD> <906A>
+<91DF> <91DF> <E7DA>
+<91E1> <91E1> <E7DB>
+<91E3> <91E3> <92DE>
+<91E6> <91E6> <9674>
+<91E7> <91E7> <8BFA>
+<91F5> <91F6> <E7DE>
+<91FC> <91FC> <E7DD>
+<91FF> <91FF> <E7E1>
+<920D> <920D> <93DD>
+<920E> <920E> <8A62>
+<9211> <9211> <E7E5>
+<9214> <9214> <E7E2>
+<9215> <9215> <E7E4>
+<921E> <921E> <E7E0>
+<9229> <9229> <E86E>
+<922C> <922C> <E7E3>
+<9234> <9234> <97E9>
+<9237> <9237> <8CD8>
+<923F> <923F> <E7ED>
+<9244> <9244> <9353>
+<9245> <9245> <E7E8>
+<9248> <9248> <E7EB>
+<9249> <9249> <E7E9>
+<924B> <924B> <E7EE>
+<9250> <9250> <E7EF>
+<9257> <9257> <E7E7>
+<925A> <925A> <E7F4>
+<925B> <925B> <8994>
+<925E> <925E> <E7E6>
+<9262> <9262> <94AB>
+<9264> <9264> <E7EA>
+<9266> <9266> <8FDE>
+<9271> <9271> <8D7A>
+<927E> <927E> <9667>
+<9280> <9280> <8BE2>
+<9283> <9283> <8F65>
+<9285> <9285> <93BA>
+<9291> <9291> <914C>
+<9293> <9293> <E7F2>
+<9295> <9295> <E7EC>
+<9296> <9296> <E7F1>
+<9298> <9298> <96C1>
+<929A> <929A> <92B6>
+<929B> <929B> <E7F3>
+<929C> <929C> <E7F0>
+<92AD> <92AD> <914B>
+<92B7> <92B7> <E7F7>
+<92B9> <92B9> <E7F6>
+<92CF> <92CF> <E7F5>
+<92D2> <92D2> <964E>
+<92E4> <92E4> <8F9B>
+<92E9> <92E9> <E7F8>
+<92EA> <92EA> <95DD>
+<92ED> <92ED> <8973>
+<92F2> <92F2> <9565>
+<92F3> <92F3> <9292>
+<92F8> <92F8> <8B98>
+<92FA> <92FA> <E7FA>
+<92FC> <92FC> <8D7C>
+<9306> <9306> <8E4B>
+<930F> <930F> <E7F9>
+<9310> <9310> <908D>
+<9318> <9318> <908E>
+<9319> <9319> <E840>
+<931A> <931A> <E842>
+<9320> <9320> <8FF9>
+<9322> <9322> <E841>
+<9323> <9323> <E843>
+<9326> <9326> <8BD1>
+<9328> <9328> <9564>
+<932B> <932B> <8EE0>
+<932C> <932C> <9842>
+<932E> <932E> <E7FC>
+endbfrange
+
+100 beginbfrange
+<932F> <932F> <8DF6>
+<9332> <9332> <985E>
+<9335> <9335> <E845>
+<933A> <933A> <E844>
+<933B> <933B> <E846>
+<9344> <9344> <E7FB>
+<934B> <934B> <93E7>
+<934D> <934D> <9374>
+<9354> <9354> <92D5>
+<9356> <9356> <E84B>
+<935B> <935B> <9262>
+<935C> <935C> <E847>
+<9360> <9360> <E848>
+<936C> <936C> <8C4C>
+<936E> <936E> <E84A>
+<9375> <9375> <8CAE>
+<937C> <937C> <E849>
+<937E> <937E> <8FDF>
+<938C> <938C> <8A99>
+<9394> <9394> <E84F>
+<9396> <9396> <8DBD>
+<9397> <9397> <9199>
+<939A> <939A> <92C8>
+<93A7> <93A7> <8A5A>
+<93AC> <93AD> <E84D>
+<93AE> <93AE> <92C1>
+<93B0> <93B0> <E84C>
+<93B9> <93B9> <E850>
+<93C3> <93C3> <E856>
+<93C8> <93C8> <E859>
+<93D0> <93D0> <E858>
+<93D1> <93D1> <934C>
+<93D6> <93D7> <E851>
+<93D8> <93D8> <E855>
+<93DD> <93DD> <E857>
+<93E1> <93E1> <8BBE>
+<93E4> <93E4> <E85A>
+<93E5> <93E5> <E854>
+<93E8> <93E8> <E853>
+<9403> <9403> <E85E>
+<9407> <9407> <E85F>
+<9410> <9410> <E860>
+<9413> <9413> <E85D>
+<9414> <9414> <E85C>
+<9418> <9418> <8FE0>
+<9419> <9419> <93A8>
+<941A> <941A> <E85B>
+<9421> <9421> <E864>
+<942B> <942B> <E862>
+<9435> <9435> <E863>
+<9436> <9436> <E861>
+<9438> <9438> <91F6>
+<943A> <943A> <E865>
+<9441> <9441> <E866>
+<9444> <9444> <E868>
+<9451> <9451> <8AD3>
+<9452> <9452> <E867>
+<9453> <9453> <96F8>
+<945A> <945A> <E873>
+<945B> <945B> <E869>
+<945E> <945E> <E86C>
+<9460> <9460> <E86A>
+<9462> <9462> <E86B>
+<946A> <946A> <E86D>
+<9470> <9470> <E86F>
+<9475> <9475> <E870>
+<9477> <9477> <E871>
+<947C> <947C> <E874>
+<947D> <947D> <E872>
+<947E> <947E> <E875>
+<947F> <947F> <E877>
+<9481> <9481> <E876>
+<9577> <9577> <92B7>
+<9580> <9580> <96E5>
+<9582> <9582> <E878>
+<9583> <9583> <914D>
+<9587> <9587> <E879>
+<9589> <9589> <95C2>
+<958A> <958A> <E87A>
+<958B> <958B> <8A4A>
+<958F> <958F> <895B>
+<9591> <9591> <8AD5>
+<9593> <9593> <8AD4>
+<9594> <9594> <E87B>
+<9596> <9596> <E87C>
+<9598> <9599> <E87D>
+<95A0> <95A0> <E880>
+<95A2> <95A2> <8AD6>
+<95A3> <95A3> <8A74>
+<95A4> <95A4> <8D7D>
+<95A5> <95A5> <94B4>
+<95A7> <95A7> <E882>
+<95A8> <95A8> <E881>
+<95AD> <95AD> <E883>
+<95B2> <95B2> <897B>
+<95B9> <95B9> <E886>
+<95BB> <95BB> <E885>
+<95BC> <95BC> <E884>
+<95BE> <95BE> <E887>
+<95C3> <95C3> <E88A>
+endbfrange
+
+100 beginbfrange
+<95C7> <95C7> <88C5>
+<95CA> <95CA> <E888>
+<95CC> <95CC> <E88C>
+<95CD> <95CD> <E88B>
+<95D4> <95D4> <E88E>
+<95D5> <95D5> <E88D>
+<95D6> <95D6> <E88F>
+<95D8> <95D8> <93AC>
+<95DC> <95DC> <E890>
+<95E1> <95E1> <E891>
+<95E2> <95E2> <E893>
+<95E5> <95E5> <E892>
+<961C> <961C> <958C>
+<9621> <9621> <E894>
+<9628> <9628> <E895>
+<962A> <962A> <8DE3>
+<962E> <962F> <E896>
+<9632> <9632> <9668>
+<963B> <963B> <916A>
+<963F> <963F> <88A2>
+<9640> <9640> <91C9>
+<9642> <9642> <E898>
+<9644> <9644> <958D>
+<964B> <964B> <E89B>
+<964C> <964C> <E899>
+<964D> <964D> <8D7E>
+<964F> <964F> <E89A>
+<9650> <9650> <8CC0>
+<965B> <965B> <95C3>
+<965C> <965C> <E89D>
+<965D> <965D> <E89F>
+<965E> <965E> <E89E>
+<965F> <965F> <E8A0>
+<9662> <9662> <8940>
+<9663> <9663> <9077>
+<9664> <9664> <8F9C>
+<9665> <9665> <8AD7>
+<9666> <9666> <E8A1>
+<966A> <966A> <9486>
+<966C> <966C> <E8A3>
+<9670> <9670> <8941>
+<9672> <9672> <E8A2>
+<9673> <9673> <92C2>
+<9675> <9675> <97CB>
+<9676> <9676> <93A9>
+<9677> <9677> <E89C>
+<9678> <9678> <97A4>
+<967A> <967A> <8CAF>
+<967D> <967D> <977A>
+<9685> <9685> <8BF7>
+<9686> <9686> <97B2>
+<9688> <9688> <8C47>
+<968A> <968A> <91E0>
+<968B> <968B> <E440>
+<968D> <968D> <E8A4>
+<968E> <968E> <8A4B>
+<968F> <968F> <908F>
+<9694> <9694> <8A75>
+<9695> <9695> <E8A6>
+<9697> <9697> <E8A7>
+<9698> <9698> <E8A5>
+<9699> <9699> <8C84>
+<969B> <969B> <8DDB>
+<969C> <969C> <8FE1>
+<96A0> <96A0> <8942>
+<96A3> <96A3> <97D7>
+<96A7> <96A7> <E8A9>
+<96A8> <96A8> <E7AC>
+<96AA> <96AA> <E8A8>
+<96B0> <96B0> <E8AC>
+<96B1> <96B2> <E8AA>
+<96B4> <96B4> <E8AD>
+<96B6> <96B6> <E8AE>
+<96B7> <96B7> <97EA>
+<96B8> <96B9> <E8AF>
+<96BB> <96BB> <90C7>
+<96BC> <96BC> <94B9>
+<96C0> <96C0> <909D>
+<96C1> <96C1> <8AE5>
+<96C4> <96C4> <9759>
+<96C5> <96C5> <89EB>
+<96C6> <96C6> <8F57>
+<96C7> <96C7> <8CD9>
+<96C9> <96C9> <E8B3>
+<96CB> <96CB> <E8B2>
+<96CC> <96CC> <8E93>
+<96CD> <96CD> <E8B4>
+<96CE> <96CE> <E8B1>
+<96D1> <96D1> <8E47>
+<96D5> <96D5> <E8B8>
+<96D6> <96D6> <E5AB>
+<96D9> <96D9> <99D4>
+<96DB> <96DB> <9097>
+<96DC> <96DC> <E8B6>
+<96E2> <96E2> <97A3>
+<96E3> <96E3> <93EF>
+<96E8> <96E8> <894A>
+<96EA> <96EA> <90E1>
+<96EB> <96EB> <8EB4>
+<96F0> <96F0> <95B5>
+endbfrange
+
+100 beginbfrange
+<96F2> <96F2> <895F>
+<96F6> <96F6> <97EB>
+<96F7> <96F7> <978B>
+<96F9> <96F9> <E8B9>
+<96FB> <96FB> <9364>
+<9700> <9700> <8EF9>
+<9704> <9704> <E8BA>
+<9706> <9706> <E8BB>
+<9707> <9707> <906B>
+<9708> <9708> <E8BC>
+<970A> <970A> <97EC>
+<970D> <970D> <E8B7>
+<970E> <970E> <E8BE>
+<970F> <970F> <E8C0>
+<9711> <9711> <E8BF>
+<9713> <9713> <E8BD>
+<9716> <9716> <E8C1>
+<9719> <9719> <E8C2>
+<971C> <971C> <919A>
+<971E> <971E> <89E0>
+<9724> <9724> <E8C3>
+<9727> <9727> <96B6>
+<972A> <972A> <E8C4>
+<9730> <9730> <E8C5>
+<9732> <9732> <9849>
+<9738> <9738> <9E50>
+<9739> <9739> <E8C6>
+<973D> <973E> <E8C7>
+<9742> <9742> <E8CC>
+<9744> <9744> <E8C9>
+<9746> <9746> <E8CA>
+<9748> <9748> <E8CB>
+<9749> <9749> <E8CD>
+<9752> <9752> <90C2>
+<9756> <9756> <96F5>
+<9759> <9759> <90C3>
+<975C> <975C> <E8CE>
+<975E> <975E> <94F1>
+<9760> <9760> <E8CF>
+<9761> <9761> <EA72>
+<9762> <9762> <96CA>
+<9764> <9764> <E8D0>
+<9766> <9766> <E8D1>
+<9768> <9768> <E8D2>
+<9769> <9769> <8A76>
+<976B> <976B> <E8D4>
+<976D> <976D> <9078>
+<9771> <9771> <E8D5>
+<9774> <9774> <8C43>
+<9779> <9779> <E8D6>
+<977A> <977A> <E8DA>
+<977C> <977C> <E8D8>
+<9781> <9781> <E8D9>
+<9784> <9784> <8A93>
+<9785> <9785> <E8D7>
+<9786> <9786> <E8DB>
+<978B> <978B> <E8DC>
+<978D> <978D> <88C6>
+<978F> <9790> <E8DD>
+<9798> <9798> <8FE2>
+<979C> <979C> <E8DF>
+<97A0> <97A0> <8B66>
+<97A3> <97A3> <E8E2>
+<97A6> <97A6> <E8E1>
+<97A8> <97A8> <E8E0>
+<97AB> <97AB> <E691>
+<97AD> <97AD> <95DA>
+<97B3> <97B4> <E8E3>
+<97C3> <97C3> <E8E5>
+<97C6> <97C6> <E8E6>
+<97C8> <97C8> <E8E7>
+<97CB> <97CB> <E8E8>
+<97D3> <97D3> <8AD8>
+<97DC> <97DC> <E8E9>
+<97ED> <97ED> <E8EA>
+<97EE> <97EE> <9442>
+<97F2> <97F2> <E8EC>
+<97F3> <97F3> <89B9>
+<97F5> <97F5> <E8EF>
+<97F6> <97F6> <E8EE>
+<97FB> <97FB> <8943>
+<97FF> <97FF> <8BBF>
+<9801> <9801> <95C5>
+<9802> <9802> <92B8>
+<9803> <9803> <8DA0>
+<9805> <9805> <8D80>
+<9806> <9806> <8F87>
+<9808> <9808> <907B>
+<980C> <980C> <E8F1>
+<980F> <980F> <E8F0>
+<9810> <9810> <9761>
+<9811> <9811> <8AE6>
+<9812> <9812> <94D0>
+<9813> <9813> <93DA>
+<9817> <9817> <909C>
+<9818> <9818> <97CC>
+<981A> <981A> <8C7A>
+<9821> <9821> <E8F4>
+<9824> <9824> <E8F3>
+<982C> <982C> <966A>
+endbfrange
+
+100 beginbfrange
+<982D> <982D> <93AA>
+<9830> <9830> <966A>
+<9834> <9834> <896F>
+<9837> <9837> <E8F5>
+<9838> <9838> <E8F2>
+<983B> <983B> <9570>
+<983C> <983C> <978A>
+<983D> <983D> <E8F6>
+<9846> <9846> <E8F7>
+<984B> <984B> <E8F9>
+<984C> <984C> <91E8>
+<984D> <984E> <8A7A>
+<984F> <984F> <E8F8>
+<9854> <9854> <8AE7>
+<9855> <9855> <8CB0>
+<9858> <9858> <8AE8>
+<985A> <985A> <935E>
+<985B> <985B> <935E>
+<985E> <985E> <97DE>
+<9867> <9867> <8CDA>
+<986B> <986B> <E8FA>
+<986F> <9870> <E8FB>
+<9871> <9871> <E940>
+<9873> <9873> <E942>
+<9874> <9874> <E941>
+<98A8> <98A8> <9597>
+<98AA> <98AA> <E943>
+<98AF> <98AF> <E944>
+<98B1> <98B1> <E945>
+<98B6> <98B6> <E946>
+<98C3> <98C3> <E948>
+<98C4> <98C4> <E947>
+<98C6> <98C6> <E949>
+<98DB> <98DB> <94F2>
+<98DC> <98DC> <E3CA>
+<98DF> <98DF> <9048>
+<98E2> <98E2> <8B51>
+<98E9> <98E9> <E94A>
+<98EB> <98EB> <E94B>
+<98ED> <98ED> <99AA>
+<98EE> <98EE> <9F5A>
+<98EF> <98EF> <94D1>
+<98F2> <98F2> <88F9>
+<98F4> <98F4> <88B9>
+<98FC> <98FC> <8E94>
+<98FD> <98FD> <964F>
+<98FE> <98FE> <8FFC>
+<9903> <9903> <E94C>
+<9905> <9905> <96DD>
+<9909> <9909> <E94D>
+<990A> <990A> <977B>
+<990C> <990C> <8961>
+<9910> <9910> <8E60>
+<9912> <9912> <E94E>
+<9913> <9913> <89EC>
+<9914> <9914> <E94F>
+<9918> <9918> <E950>
+<991D> <991E> <E952>
+<9920> <9920> <E955>
+<9921> <9921> <E951>
+<9924> <9924> <E954>
+<9928> <9928> <8AD9>
+<992C> <992C> <E956>
+<992E> <992E> <E957>
+<993D> <993E> <E958>
+<9942> <9942> <E95A>
+<9945> <9945> <E95C>
+<9949> <9949> <E95B>
+<994B> <994B> <E95E>
+<994C> <994C> <E961>
+<9950> <9950> <E95D>
+<9951> <9952> <E95F>
+<9955> <9955> <E962>
+<9957> <9957> <8BC0>
+<9996> <9996> <8EF1>
+<9997> <9998> <E963>
+<9999> <9999> <8D81>
+<99A5> <99A5> <E965>
+<99A8> <99A8> <8A5D>
+<99AC> <99AC> <946E>
+<99AD> <99AE> <E966>
+<99B3> <99B3> <9279>
+<99B4> <99B4> <93E9>
+<99BC> <99BC> <E968>
+<99C1> <99C1> <949D>
+<99C4> <99C4> <91CA>
+<99C5> <99C5> <8977>
+<99C6> <99C6> <8BEC>
+<99C8> <99C8> <8BED>
+<99D0> <99D0> <9293>
+<99D1> <99D1> <E96D>
+<99D2> <99D2> <8BEE>
+<99D5> <99D5> <89ED>
+<99D8> <99D8> <E96C>
+<99DB> <99DB> <E96A>
+<99DD> <99DD> <E96B>
+<99DF> <99DF> <E969>
+<99E2> <99E2> <E977>
+<99ED> <99EE> <E96E>
+<99F1> <99F2> <E970>
+endbfrange
+
+100 beginbfrange
+<99F8> <99F8> <E973>
+<99FB> <99FB> <E972>
+<99FF> <99FF> <8F78>
+<9A01> <9A01> <E974>
+<9A05> <9A05> <E976>
+<9A0E> <9A0E> <8B52>
+<9A0F> <9A0F> <E975>
+<9A12> <9A12> <919B>
+<9A13> <9A13> <8CB1>
+<9A19> <9A19> <E978>
+<9A28> <9A28> <91CB>
+<9A2B> <9A2B> <E979>
+<9A30> <9A30> <93AB>
+<9A37> <9A37> <E97A>
+<9A3E> <9A3E> <E980>
+<9A40> <9A40> <E97D>
+<9A42> <9A42> <E97C>
+<9A43> <9A43> <E97E>
+<9A45> <9A45> <E97B>
+<9A4D> <9A4D> <E982>
+<9A52> <9A52> <91CB>
+<9A55> <9A55> <E981>
+<9A57> <9A57> <E984>
+<9A5A> <9A5A> <8BC1>
+<9A5B> <9A5B> <E983>
+<9A5F> <9A5F> <E985>
+<9A62> <9A62> <E986>
+<9A64> <9A64> <E988>
+<9A65> <9A65> <E987>
+<9A69> <9A69> <E989>
+<9A6A> <9A6A> <E98B>
+<9A6B> <9A6B> <E98A>
+<9AA8> <9AA8> <8D9C>
+<9AAD> <9AAD> <E98C>
+<9AB0> <9AB0> <E98D>
+<9AB8> <9AB8> <8A5B>
+<9ABC> <9ABC> <E98E>
+<9AC0> <9AC0> <E98F>
+<9AC4> <9AC4> <9091>
+<9ACF> <9ACF> <E990>
+<9AD1> <9AD1> <E991>
+<9AD3> <9AD4> <E992>
+<9AD8> <9AD8> <8D82>
+<9ADE> <9ADF> <E994>
+<9AE2> <9AE3> <E996>
+<9AE6> <9AE6> <E998>
+<9AEA> <9AEA> <94AF>
+<9AEB> <9AEB> <E99A>
+<9AED> <9AED> <9545>
+<9AEE> <9AEE> <E99B>
+<9AEF> <9AEF> <E999>
+<9AF1> <9AF1> <E99D>
+<9AF4> <9AF4> <E99C>
+<9AF7> <9AF7> <E99E>
+<9AFB> <9AFB> <E99F>
+<9B06> <9B06> <E9A0>
+<9B18> <9B18> <E9A1>
+<9B1A> <9B1A> <E9A2>
+<9B1F> <9B1F> <E9A3>
+<9B22> <9B23> <E9A4>
+<9B25> <9B25> <E9A6>
+<9B27> <9B2A> <E9A7>
+<9B2E> <9B2F> <E9AB>
+<9B31> <9B31> <9F54>
+<9B32> <9B32> <E9AD>
+<9B3B> <9B3B> <E2F6>
+<9B3C> <9B3C> <8B53>
+<9B41> <9B41> <8A40>
+<9B42> <9B42> <8DB0>
+<9B43> <9B43> <E9AF>
+<9B44> <9B44> <E9AE>
+<9B45> <9B45> <96A3>
+<9B4D> <9B4E> <E9B1>
+<9B4F> <9B4F> <E9B0>
+<9B51> <9B51> <E9B3>
+<9B54> <9B54> <9682>
+<9B58> <9B58> <E9B4>
+<9B5A> <9B5A> <8B9B>
+<9B6F> <9B6F> <9844>
+<9B74> <9B74> <E9B5>
+<9B83> <9B83> <E9B7>
+<9B8E> <9B8E> <88BC>
+<9B91> <9B91> <E9B8>
+<9B92> <9B92> <95A9>
+<9B93> <9B93> <E9B6>
+<9B96> <9B97> <E9B9>
+<9B9F> <9BA0> <E9BB>
+<9BA8> <9BA8> <E9BD>
+<9BAA> <9BAA> <968E>
+<9BAB> <9BAB> <8E4C>
+<9BAD> <9BAD> <8DF8>
+<9BAE> <9BAE> <914E>
+<9BB4> <9BB4> <E9BE>
+<9BB9> <9BB9> <E9C1>
+<9BC0> <9BC0> <E9BF>
+<9BC6> <9BC6> <E9C2>
+<9BC9> <9BC9> <8CEF>
+<9BCA> <9BCA> <E9C0>
+<9BCF> <9BCF> <E9C3>
+<9BD1> <9BD2> <E9C4>
+endbfrange
+
+100 beginbfrange
+<9BD4> <9BD4> <E9C9>
+<9BD6> <9BD6> <8E49>
+<9BDB> <9BDB> <91E2>
+<9BE1> <9BE1> <E9CA>
+<9BE2> <9BE2> <E9C7>
+<9BE3> <9BE3> <E9C6>
+<9BE4> <9BE4> <E9C8>
+<9BE8> <9BE8> <8C7E>
+<9BF0> <9BF0> <E9CE>
+<9BF1> <9BF1> <E9CD>
+<9BF2> <9BF2> <E9CC>
+<9BF5> <9BF5> <88B1>
+<9C04> <9C04> <E9D8>
+<9C06> <9C06> <E9D4>
+<9C08> <9C08> <E9D5>
+<9C09> <9C09> <E9D1>
+<9C0A> <9C0A> <E9D7>
+<9C0C> <9C0C> <E9D3>
+<9C0D> <9C0D> <8A82>
+<9C10> <9C10> <986B>
+<9C12> <9C12> <E9D6>
+<9C13> <9C13> <E9D2>
+<9C14> <9C14> <E9D0>
+<9C15> <9C15> <E9CF>
+<9C1B> <9C1B> <E9DA>
+<9C21> <9C21> <E9DD>
+<9C24> <9C24> <E9DC>
+<9C25> <9C25> <E9DB>
+<9C2D> <9C2D> <9568>
+<9C2E> <9C2E> <E9D9>
+<9C2F> <9C2F> <88F1>
+<9C30> <9C30> <E9DE>
+<9C32> <9C32> <E9E0>
+<9C39> <9C39> <8A8F>
+<9C3A> <9C3A> <E9CB>
+<9C3B> <9C3B> <8956>
+<9C3E> <9C3E> <E9E2>
+<9C46> <9C46> <E9E1>
+<9C47> <9C47> <E9DF>
+<9C48> <9C48> <924C>
+<9C52> <9C52> <9690>
+<9C57> <9C57> <97D8>
+<9C5A> <9C5A> <E9E3>
+<9C60> <9C60> <E9E4>
+<9C67> <9C67> <E9E5>
+<9C76> <9C76> <E9E6>
+<9C78> <9C78> <E9E7>
+<9CE5> <9CE5> <92B9>
+<9CE7> <9CE7> <E9E8>
+<9CE9> <9CE9> <94B5>
+<9CEB> <9CEB> <E9ED>
+<9CEC> <9CEC> <E9E9>
+<9CF0> <9CF0> <E9EA>
+<9CF3> <9CF3> <9650>
+<9CF4> <9CF4> <96C2>
+<9CF6> <9CF6> <93CE>
+<9D03> <9D03> <E9EE>
+<9D06> <9D06> <E9EF>
+<9D07> <9D07> <93BC>
+<9D08> <9D08> <E9EC>
+<9D09> <9D09> <E9EB>
+<9D0E> <9D0E> <89A8>
+<9D12> <9D12> <E9F7>
+<9D15> <9D15> <E9F6>
+<9D1B> <9D1B> <8995>
+<9D1F> <9D1F> <E9F4>
+<9D23> <9D23> <E9F3>
+<9D26> <9D26> <E9F1>
+<9D28> <9D28> <8A9B>
+<9D2A> <9D2A> <E9F0>
+<9D2B> <9D2B> <8EB0>
+<9D2C> <9D2C> <89A7>
+<9D3B> <9D3B> <8D83>
+<9D3E> <9D3E> <E9FA>
+<9D3F> <9D3F> <E9F9>
+<9D41> <9D41> <E9F8>
+<9D44> <9D44> <E9F5>
+<9D46> <9D46> <E9FB>
+<9D48> <9D48> <E9FC>
+<9D50> <9D50> <EA44>
+<9D51> <9D51> <EA43>
+<9D59> <9D59> <EA45>
+<9D5C> <9D5C> <894C>
+<9D5D> <9D5E> <EA40>
+<9D60> <9D60> <8D94>
+<9D61> <9D61> <96B7>
+<9D64> <9D64> <EA42>
+<9D6C> <9D6C> <9651>
+<9D6F> <9D6F> <EA4A>
+<9D72> <9D72> <EA46>
+<9D7A> <9D7A> <EA4B>
+<9D87> <9D87> <EA48>
+<9D89> <9D89> <EA47>
+<9D8F> <9D8F> <8C7B>
+<9D9A> <9D9A> <EA4C>
+<9DA4> <9DA4> <EA4D>
+<9DA9> <9DA9> <EA4E>
+<9DAB> <9DAB> <EA49>
+<9DAF> <9DAF> <E9F2>
+<9DB2> <9DB2> <EA4F>
+endbfrange
+
+100 beginbfrange
+<9DB4> <9DB4> <92DF>
+<9DB8> <9DB8> <EA53>
+<9DBA> <9DBA> <EA54>
+<9DBB> <9DBB> <EA52>
+<9DC1> <9DC1> <EA51>
+<9DC2> <9DC2> <EA57>
+<9DC4> <9DC4> <EA50>
+<9DC6> <9DC6> <EA55>
+<9DCF> <9DCF> <EA56>
+<9DD3> <9DD3> <EA59>
+<9DD7> <9DD7> <89A8>
+<9DD9> <9DD9> <EA58>
+<9DE6> <9DE6> <EA5B>
+<9DED> <9DED> <EA5C>
+<9DEF> <9DEF> <EA5D>
+<9DF2> <9DF2> <9868>
+<9DF8> <9DF8> <EA5A>
+<9DF9> <9DF9> <91E9>
+<9DFA> <9DFA> <8DEB>
+<9DFD> <9DFD> <EA5E>
+<9E1A> <9E1B> <EA5F>
+<9E1E> <9E1E> <EA61>
+<9E75> <9E75> <EA62>
+<9E78> <9E78> <8CB2>
+<9E79> <9E79> <EA63>
+<9E7C> <9E7C> <8CB2>
+<9E7D> <9E7D> <EA64>
+<9E7F> <9E7F> <8EAD>
+<9E81> <9E81> <EA65>
+<9E88> <9E88> <EA66>
+<9E8B> <9E8C> <EA67>
+<9E91> <9E91> <EA6B>
+<9E92> <9E92> <EA69>
+<9E93> <9E93> <985B>
+<9E95> <9E95> <EA6A>
+<9E97> <9E97> <97ED>
+<9E9D> <9E9D> <EA6C>
+<9E9F> <9E9F> <97D9>
+<9EA5> <9EA5> <EA6D>
+<9EA6> <9EA6> <949E>
+<9EA9> <9EA9> <EA6E>
+<9EAA> <9EAA> <EA70>
+<9EAD> <9EAD> <EA71>
+<9EB4> <9EB4> <8D8D>
+<9EB5> <9EB5> <96CB>
+<9EB8> <9EB8> <EA6F>
+<9EB9> <9EB9> <8D8D>
+<9EBA> <9EBA> <96CB>
+<9EBB> <9EBB> <9683>
+<9EBC> <9EBC> <9BF5>
+<9EBE> <9EBE> <9F80>
+<9EBF> <9EBF> <969B>
+<9EC4> <9EC4> <89A9>
+<9ECC> <9ECC> <EA73>
+<9ECD> <9ECD> <8B6F>
+<9ECE> <9ED0> <EA74>
+<9ED2> <9ED2> <8D95>
+<9ED4> <9ED4> <EA77>
+<9ED8> <9ED8> <E0D2>
+<9ED9> <9ED9> <96D9>
+<9EDB> <9EDB> <91E1>
+<9EDC> <9EDC> <EA78>
+<9EDD> <9EDD> <EA7A>
+<9EDE> <9EDE> <EA79>
+<9EE0> <9EE0> <EA7B>
+<9EE5> <9EE5> <EA7C>
+<9EE8> <9EE8> <EA7D>
+<9EEF> <9EEF> <EA7E>
+<9EF4> <9EF4> <EA80>
+<9EF6> <9EF7> <EA81>
+<9EF9> <9EF9> <EA83>
+<9EFB> <9EFD> <EA84>
+<9F07> <9F08> <EA87>
+<9F0E> <9F0E> <9343>
+<9F13> <9F13> <8CDB>
+<9F15> <9F15> <EA8A>
+<9F20> <9F20> <916C>
+<9F21> <9F21> <EA8B>
+<9F2C> <9F2C> <EA8C>
+<9F3B> <9F3B> <9540>
+<9F3E> <9F3E> <EA8D>
+<9F4A> <9F4A> <EA8E>
+<9F4B> <9F4B> <E256>
+<9F4E> <9F4E> <E6D8>
+<9F4F> <9F4F> <E8EB>
+<9F52> <9F52> <EA8F>
+<9F54> <9F54> <EA90>
+<9F5F> <9F61> <EA92>
+<9F62> <9F62> <97EE>
+<9F63> <9F63> <EA91>
+<9F66> <9F67> <EA95>
+<9F6A> <9F6A> <EA98>
+<9F6C> <9F6C> <EA97>
+<9F72> <9F72> <EA9A>
+<9F76> <9F76> <EA9B>
+<9F77> <9F77> <EA99>
+<9F8D> <9F8D> <97B4>
+<9F95> <9F95> <EA9C>
+<9F9C> <9F9C> <EA9D>
+<9F9D> <9F9D> <E273>
+endbfrange
+
+93 beginbfrange
+<9FA0> <9FA0> <EA9E>
+<E000> <E03E> <F040>
+<E03F> <E0BB> <F080>
+<E0BC> <E0FA> <F140>
+<E0FB> <E0FF> <F180>
+<E100> <E177> <F185>
+<E178> <E1B6> <F240>
+<E1B7> <E1FF> <F280>
+<E200> <E233> <F2C9>
+<E234> <E272> <F340>
+<E273> <E2EF> <F380>
+<E2F0> <E2FF> <F440>
+<E300> <E32E> <F450>
+<E32F> <E3AB> <F480>
+<E3AC> <E3EA> <F540>
+<E3EB> <E3FF> <F580>
+<E400> <E467> <F595>
+<E468> <E4A6> <F640>
+<E4A7> <E4FF> <F680>
+<E500> <E523> <F6D9>
+<E524> <E562> <F740>
+<E563> <E5DF> <F780>
+<E5E0> <E5FF> <F840>
+<E600> <E61E> <F860>
+<E61F> <E69B> <F880>
+<E69C> <E6DA> <F940>
+<E6DB> <E6FF> <F980>
+<E700> <E757> <F9A5>
+<E758> <E796> <FA40>
+<E797> <E7FF> <FA80>
+<E800> <E813> <FAE9>
+<E814> <E852> <FB40>
+<E853> <E8CF> <FB80>
+<E8D0> <E8FF> <FC40>
+<E900> <E90E> <FC70>
+<E90F> <E98B> <FC80>
+<FE30> <FE30> <EB64>
+<FE31> <FE31> <EB5C>
+<FE33> <FE33> <EB51>
+<FE35> <FE36> <EB69>
+<FE37> <FE38> <EB6F>
+<FE39> <FE3A> <EB6B>
+<FE3B> <FE3C> <EB79>
+<FE3D> <FE3E> <EB73>
+<FE3F> <FE40> <EB71>
+<FE41> <FE44> <EB75>
+<FE50> <FE50> <8143>
+<FE51> <FE51> <8141>
+<FE52> <FE52> <8144>
+<FE54> <FE54> <8147>
+<FE55> <FE55> <8146>
+<FE56> <FE57> <8148>
+<FE59> <FE5A> <8169>
+<FE5B> <FE5C> <816F>
+<FE5D> <FE5E> <816B>
+<FF01> <FF01> <8149>
+<FF02> <FF02> <8168>
+<FF03> <FF03> <8194>
+<FF04> <FF04> <8190>
+<FF05> <FF05> <8193>
+<FF06> <FF06> <8195>
+<FF07> <FF07> <8166>
+<FF08> <FF09> <8169>
+<FF0A> <FF0A> <8196>
+<FF0B> <FF0B> <817B>
+<FF0C> <FF0C> <8143>
+<FF0D> <FF0D> <817C>
+<FF0E> <FF0E> <8144>
+<FF0F> <FF0F> <815E>
+<FF10> <FF19> <824F>
+<FF1A> <FF1B> <8146>
+<FF1C> <FF1C> <8183>
+<FF1D> <FF1D> <8181>
+<FF1E> <FF1E> <8184>
+<FF1F> <FF1F> <8148>
+<FF20> <FF20> <8197>
+<FF21> <FF3A> <8260>
+<FF3B> <FF3B> <816D>
+<FF3C> <FF3C> <815F>
+<FF3D> <FF3D> <816E>
+<FF3E> <FF3E> <814F>
+<FF3F> <FF3F> <8151>
+<FF40> <FF40> <814D>
+<FF41> <FF5A> <8281>
+<FF5B> <FF5B> <816F>
+<FF5C> <FF5C> <8162>
+<FF5D> <FF5D> <8170>
+<FF5E> <FF5E> <8160>
+<FF61> <FF9F> <A1>
+<FFE0> <FFE1> <8191>
+<FFE2> <FFE2> <81CA>
+<FFE3> <FFE3> <8150>
+<FFE5> <FFE5> <818F>
+endbfrange
+
+endcmap
+CMapName currentdict /CMap defineresource pop
+end
+end
+
+%%EndResource
+%%EOF
diff --git a/src/main/resources/Resources/cmap/UCS2-B5pc b/src/main/resources/Resources/cmap/UCS2-B5pc
new file mode 100644
index 0000000..6347275
--- /dev/null
+++ b/src/main/resources/Resources/cmap/UCS2-B5pc
@@ -0,0 +1,13150 @@
+%!PS-Adobe-3.0 Resource-CMap
+%%DocumentNeededResources: ProcSet (CIDInit)
+%%IncludeResource: ProcSet (CIDInit)
+%%BeginResource: CMap (UCS2-B5pc)
+%%Title: (UCS2-B5pc)
+%%Version: 4.002
+%%Copyright: -----------------------------------------------------------
+%%Copyright: Copyright 1990-1999 Adobe Systems Incorporated.
+%%Copyright: All Rights Reserved.
+%%Copyright:
+%%Copyright: Patents Pending
+%%Copyright:
+%%Copyright: NOTICE: All information contained herein is the property
+%%Copyright: of Adobe Systems Incorporated.
+%%Copyright:
+%%Copyright: Permission is granted for redistribution of this file
+%%Copyright: provided this copyright notice is maintained intact and
+%%Copyright: that the contents of this file are not altered in any
+%%Copyright: way from its original form.
+%%Copyright:
+%%Copyright: PostScript and Display PostScript are trademarks of
+%%Copyright: Adobe Systems Incorporated which may be registered in
+%%Copyright: certain jurisdictions.
+%%Copyright: -----------------------------------------------------------
+%%EndComments
+
+/CIDInit /ProcSet findresource begin
+
+12 dict begin
+
+begincmap
+
+/CIDSystemInfo 3 dict dup begin
+ /Registry (Adobe) def
+ /Ordering (UCS2_B5pc) def
+ /Supplement 0 def
+end def
+
+/CMapName /UCS2-B5pc def
+/CMapVersion 4.002 def
+/CMapType 1 def
+/WMode 0 def
+
+1 begincodespacerange
+<0000> <FFFF>
+endcodespacerange
+
+100 beginbfrange
+<0000> <007F> <00>
+<0083> <00A0> <83>
+<00A2> <00A3> <A246>
+<00A5> <00A5> <A244>
+<00A7> <00A7> <A1B1>
+<00A9> <00A9> <FD>
+<00AF> <00AF> <A1C2>
+<00B0> <00B0> <A258>
+<00B1> <00B1> <A1D3>
+<00B7> <00B7> <A150>
+<00D7> <00D7> <A1D1>
+<00F7> <00F7> <A1D2>
+<02C7> <02C7> <A3BE>
+<02C9> <02CA> <A3BC>
+<02CB> <02CB> <A3BF>
+<02CD> <02CD> <A1C5>
+<02D0> <02D0> <A14A>
+<02D9> <02D9> <A3BB>
+<0391> <03A1> <A344>
+<03A3> <03A9> <A355>
+<03B1> <03C1> <A35C>
+<03C3> <03C9> <A36D>
+<2010> <2010> <A1D0>
+<2013> <2013> <A156>
+<2014> <2014> <A158>
+<2016> <2016> <A1FC>
+<2018> <2019> <A1A5>
+<201C> <201D> <A1A7>
+<2022> <2022> <A145>
+<2025> <2025> <A14C>
+<2026> <2026> <A14B>
+<2027> <2027> <A145>
+<2032> <2032> <A1AC>
+<2035> <2035> <A1AB>
+<203B> <203B> <A1B0>
+<203E> <203E> <A1C2>
+<2103> <2103> <A24A>
+<2105> <2105> <A1C1>
+<2109> <2109> <A24B>
+<2122> <2122> <FE>
+<2160> <2169> <A2B9>
+<2190> <2190> <A1F6>
+<2191> <2191> <A1F4>
+<2192> <2192> <A1F7>
+<2193> <2193> <A1F5>
+<2196> <2197> <A1F8>
+<2198> <2198> <A1FB>
+<2199> <2199> <A1FA>
+<220F> <220F> <A353>
+<2211> <2211> <A355>
+<2215> <2215> <A241>
+<221A> <221A> <A1D4>
+<221E> <221E> <A1DB>
+<221F> <221F> <A1E8>
+<2220> <2220> <A1E7>
+<2223> <2223> <A1FD>
+<2225> <2225> <A1FC>
+<2229> <222A> <A1E4>
+<222B> <222B> <A1EC>
+<222E> <222E> <A1ED>
+<2234> <2234> <A1EF>
+<2235> <2235> <A1EE>
+<2236> <2236> <A14A>
+<223C> <223C> <A1E3>
+<2252> <2252> <A1DC>
+<2260> <2260> <A1DA>
+<2261> <2261> <A1DD>
+<2266> <2267> <A1D8>
+<2295> <2295> <A1F2>
+<2299> <2299> <A1F3>
+<22A5> <22A5> <A1E6>
+<22BF> <22BF> <A1E9>
+<22EF> <22EF> <A14B>
+<2500> <2500> <A277>
+<2502> <2502> <A278>
+<250C> <250C> <A27A>
+<2510> <2510> <A27B>
+<2514> <2514> <A27C>
+<2518> <2518> <A27D>
+<251C> <251C> <A275>
+<2524> <2524> <A274>
+<252C> <252C> <A273>
+<2534> <2534> <A272>
+<253C> <253C> <A271>
+<2550> <2550> <A2A4>
+<255E> <255E> <A2A5>
+<2561> <2561> <A2A7>
+<256A> <256A> <A2A6>
+<256D> <256D> <A27E>
+<256E> <256E> <A2A1>
+<256F> <256F> <A2A3>
+<2570> <2570> <A2A2>
+<2571> <2573> <A2AC>
+<2581> <2588> <A262>
+<2589> <2589> <A270>
+<258A> <258A> <A26F>
+<258B> <258B> <A26E>
+<258C> <258C> <A26D>
+<258D> <258D> <A26C>
+<258E> <258E> <A26B>
+endbfrange
+
+100 beginbfrange
+<258F> <258F> <A26A>
+<2594> <2594> <A276>
+<2595> <2595> <A279>
+<25A0> <25A0> <A1BD>
+<25A1> <25A1> <A1BC>
+<25B2> <25B2> <A1B6>
+<25B3> <25B3> <A1B5>
+<25BC> <25BC> <A1BF>
+<25BD> <25BD> <A1BE>
+<25C6> <25C6> <A1BB>
+<25C7> <25C7> <A1BA>
+<25C9> <25C9> <A1F3>
+<25CB> <25CB> <A1B3>
+<25CE> <25CE> <A1B7>
+<25CF> <25CF> <A1B4>
+<25E2> <25E3> <A2A8>
+<25E4> <25E4> <A2AB>
+<25E5> <25E5> <A2AA>
+<2605> <2605> <A1B9>
+<2606> <2606> <A1B8>
+<2609> <2609> <A1F3>
+<2640> <2640> <A1F0>
+<2641> <2641> <A1F2>
+<2642> <2642> <A1F1>
+<3000> <3000> <A140>
+<3001> <3002> <A142>
+<3003> <3003> <A1B2>
+<3008> <3009> <A171>
+<300A> <300B> <A16D>
+<300C> <300D> <A175>
+<300E> <300F> <A179>
+<3010> <3011> <A169>
+<3012> <3012> <A245>
+<3014> <3015> <A165>
+<301C> <301C> <A1E3>
+<301D> <301E> <A1A9>
+<3021> <3029> <A2C3>
+<3105> <310F> <A374>
+<3110> <3129> <A3A1>
+<32A3> <32A3> <A1C0>
+<338E> <338F> <A255>
+<339C> <339E> <A250>
+<33A1> <33A1> <A254>
+<33C4> <33C4> <A257>
+<33CE> <33CE> <A253>
+<33D1> <33D1> <A1EB>
+<33D2> <33D2> <A1EA>
+<33D5> <33D5> <A24F>
+<4E00> <4E00> <A440>
+<4E01> <4E01> <A442>
+<4E03> <4E03> <A443>
+<4E07> <4E07> <C945>
+<4E08> <4E08> <A456>
+<4E09> <4E09> <A454>
+<4E0A> <4E0A> <A457>
+<4E0B> <4E0B> <A455>
+<4E0C> <4E0C> <C946>
+<4E0D> <4E0D> <A4A3>
+<4E0E> <4E0E> <C94F>
+<4E0F> <4E0F> <C94D>
+<4E10> <4E10> <A4A2>
+<4E11> <4E11> <A4A1>
+<4E14> <4E14> <A542>
+<4E15> <4E15> <A541>
+<4E16> <4E16> <A540>
+<4E18> <4E18> <A543>
+<4E19> <4E19> <A4FE>
+<4E1E> <4E1F> <A5E0>
+<4E26> <4E26> <A8C3>
+<4E2B> <4E2B> <A458>
+<4E2D> <4E2D> <A4A4>
+<4E2E> <4E2E> <C950>
+<4E30> <4E30> <A4A5>
+<4E31> <4E31> <C963>
+<4E32> <4E32> <A6EA>
+<4E33> <4E33> <CBB1>
+<4E38> <4E38> <A459>
+<4E39> <4E39> <A4A6>
+<4E3B> <4E3B> <A544>
+<4E3C> <4E3C> <C964>
+<4E42> <4E42> <C940>
+<4E43> <4E43> <A444>
+<4E45> <4E45> <A45B>
+<4E47> <4E47> <C947>
+<4E48> <4E48> <A45C>
+<4E4B> <4E4B> <A4A7>
+<4E4D> <4E4D> <A545>
+<4E4E> <4E4E> <A547>
+<4E4F> <4E4F> <A546>
+<4E52> <4E53> <A5E2>
+<4E56> <4E56> <A8C4>
+<4E58> <4E58> <ADBC>
+<4E59> <4E59> <A441>
+<4E5C> <4E5C> <C941>
+<4E5D> <4E5D> <A445>
+<4E5E> <4E5E> <A45E>
+<4E5F> <4E5F> <A45D>
+<4E69> <4E69> <A5E4>
+<4E73> <4E73> <A8C5>
+<4E7E> <4E7E> <B0AE>
+endbfrange
+
+100 beginbfrange
+<4E7F> <4E7F> <D44B>
+<4E82> <4E82> <B6C3>
+<4E83> <4E84> <DCB1>
+<4E86> <4E86> <A446>
+<4E88> <4E88> <A4A9>
+<4E8B> <4E8B> <A8C6>
+<4E8C> <4E8C> <A447>
+<4E8D> <4E8D> <C948>
+<4E8E> <4E8E> <A45F>
+<4E91> <4E91> <A4AA>
+<4E92> <4E92> <A4AC>
+<4E93> <4E93> <C951>
+<4E94> <4E94> <A4AD>
+<4E95> <4E95> <A4AB>
+<4E99> <4E99> <A5E5>
+<4E9B> <4E9B> <A8C7>
+<4E9E> <4E9E> <A8C8>
+<4E9F> <4E9F> <AB45>
+<4EA1> <4EA1> <A460>
+<4EA2> <4EA2> <A4AE>
+<4EA4> <4EA4> <A5E6>
+<4EA5> <4EA5> <A5E8>
+<4EA6> <4EA6> <A5E7>
+<4EA8> <4EA8> <A6EB>
+<4EAB> <4EAC> <A8C9>
+<4EAD> <4EAE> <AB46>
+<4EB3> <4EB3> <ADBD>
+<4EB6> <4EB6> <DCB3>
+<4EB9> <4EB9> <F6D6>
+<4EBA> <4EBA> <A448>
+<4EC0> <4EC0> <A4B0>
+<4EC1> <4EC1> <A4AF>
+<4EC2> <4EC2> <C952>
+<4EC3> <4EC3> <A4B1>
+<4EC4> <4EC4> <A4B7>
+<4EC6> <4EC7> <A4B2>
+<4EC8> <4EC8> <C954>
+<4EC9> <4EC9> <C953>
+<4ECA> <4ECB> <A4B5>
+<4ECD> <4ECD> <A4B4>
+<4ED4> <4ED7> <A54A>
+<4ED8> <4ED8> <A549>
+<4ED9> <4ED9> <A550>
+<4EDA> <4EDA> <C96A>
+<4EDC> <4EDC> <C966>
+<4EDD> <4EDD> <C969>
+<4EDE> <4EDE> <A551>
+<4EDF> <4EDF> <A561>
+<4EE1> <4EE1> <C968>
+<4EE3> <4EE4> <A54E>
+<4EE5> <4EE5> <A548>
+<4EE8> <4EE8> <C965>
+<4EE9> <4EE9> <C967>
+<4EF0> <4EF0> <A5F5>
+<4EF1> <4EF1> <C9B0>
+<4EF2> <4EF2> <A5F2>
+<4EF3> <4EF3> <A5F6>
+<4EF4> <4EF4> <C9BA>
+<4EF5> <4EF5> <C9AE>
+<4EF6> <4EF6> <A5F3>
+<4EF7> <4EF7> <C9B2>
+<4EFB> <4EFB> <A5F4>
+<4EFD> <4EFD> <A5F7>
+<4EFF> <4EFF> <A5E9>
+<4F00> <4F00> <C9B1>
+<4F01> <4F01> <A5F8>
+<4F02> <4F02> <C9B5>
+<4F04> <4F04> <C9B9>
+<4F05> <4F05> <C9B6>
+<4F08> <4F08> <C9B3>
+<4F09> <4F09> <A5EA>
+<4F0A> <4F0A> <A5EC>
+<4F0B> <4F0B> <A5F9>
+<4F0D> <4F0D> <A5EE>
+<4F0E> <4F0E> <C9AB>
+<4F0F> <4F0F> <A5F1>
+<4F10> <4F11> <A5EF>
+<4F12> <4F12> <C9BB>
+<4F13> <4F13> <C9B8>
+<4F14> <4F14> <C9AF>
+<4F15> <4F15> <A5ED>
+<4F18> <4F18> <C9AC>
+<4F19> <4F19> <A5EB>
+<4F1D> <4F1D> <C9B4>
+<4F22> <4F22> <C9B7>
+<4F2C> <4F2C> <C9AD>
+<4F2D> <4F2D> <CA66>
+<4F2F> <4F2F> <A742>
+<4F30> <4F30> <A6F4>
+<4F33> <4F33> <CA67>
+<4F34> <4F34> <A6F1>
+<4F36> <4F36> <A744>
+<4F38> <4F38> <A6F9>
+<4F3A> <4F3A> <A6F8>
+<4F3B> <4F3B> <CA5B>
+<4F3C> <4F3C> <A6FC>
+<4F3D> <4F3D> <A6F7>
+<4F3E> <4F3E> <CA60>
+<4F3F> <4F3F> <CA68>
+<4F41> <4F41> <CA64>
+endbfrange
+
+100 beginbfrange
+<4F43> <4F43> <A6FA>
+<4F46> <4F46> <A6FD>
+<4F47> <4F47> <A6EE>
+<4F48> <4F48> <A747>
+<4F49> <4F49> <CA5D>
+<4F4C> <4F4C> <CBBD>
+<4F4D> <4F4D> <A6EC>
+<4F4E> <4F4E> <A743>
+<4F4F> <4F4F> <A6ED>
+<4F50> <4F51> <A6F5>
+<4F52> <4F52> <CA62>
+<4F53> <4F53> <CA5E>
+<4F54> <4F54> <A6FB>
+<4F55> <4F55> <A6F3>
+<4F56> <4F56> <CA5A>
+<4F57> <4F57> <A6EF>
+<4F58> <4F58> <CA65>
+<4F59> <4F59> <A745>
+<4F5A> <4F5A> <A748>
+<4F5B> <4F5B> <A6F2>
+<4F5C> <4F5C> <A740>
+<4F5D> <4F5D> <A746>
+<4F5E> <4F5E> <A6F0>
+<4F5F> <4F5F> <CA63>
+<4F60> <4F60> <A741>
+<4F61> <4F61> <CA69>
+<4F62> <4F62> <CA5C>
+<4F63> <4F63> <A6FE>
+<4F64> <4F64> <CA5F>
+<4F67> <4F67> <CA61>
+<4F69> <4F69> <A8D8>
+<4F6A> <4F6A> <CBBF>
+<4F6B> <4F6B> <CBCB>
+<4F6C> <4F6C> <A8D0>
+<4F6E> <4F6E> <CBCC>
+<4F6F> <4F6F> <A8CB>
+<4F70> <4F70> <A8D5>
+<4F73> <4F73> <A8CE>
+<4F74> <4F74> <CBB9>
+<4F75> <4F75> <A8D6>
+<4F76> <4F76> <CBB8>
+<4F77> <4F77> <CBBC>
+<4F78> <4F78> <CBC3>
+<4F79> <4F79> <CBC1>
+<4F7A> <4F7A> <A8DE>
+<4F7B> <4F7B> <A8D9>
+<4F7C> <4F7C> <CBB3>
+<4F7D> <4F7D> <CBB5>
+<4F7E> <4F7E> <A8DB>
+<4F7F> <4F7F> <A8CF>
+<4F80> <4F80> <CBB6>
+<4F81> <4F81> <CBC2>
+<4F82> <4F82> <CBC9>
+<4F83> <4F83> <A8D4>
+<4F84> <4F84> <CBBB>
+<4F85> <4F85> <CBB4>
+<4F86> <4F86> <A8D3>
+<4F87> <4F87> <CBB7>
+<4F88> <4F88> <A8D7>
+<4F89> <4F89> <CBBA>
+<4F8B> <4F8B> <A8D2>
+<4F8D> <4F8D> <A8CD>
+<4F8F> <4F8F> <A8DC>
+<4F90> <4F90> <CBC4>
+<4F91> <4F91> <A8DD>
+<4F92> <4F92> <CBC8>
+<4F94> <4F94> <CBC6>
+<4F95> <4F95> <CBCA>
+<4F96> <4F96> <A8DA>
+<4F97> <4F97> <CBBE>
+<4F98> <4F98> <CBB2>
+<4F9A> <4F9A> <CBC0>
+<4F9B> <4F9B> <A8D1>
+<4F9C> <4F9C> <CBC5>
+<4F9D> <4F9D> <A8CC>
+<4F9E> <4F9E> <CBC7>
+<4FAE> <4FAE> <AB56>
+<4FAF> <4FAF> <AB4A>
+<4FB2> <4FB2> <CDE0>
+<4FB3> <4FB3> <CDE8>
+<4FB5> <4FB5> <AB49>
+<4FB6> <4FB6> <AB51>
+<4FB7> <4FB7> <AB5D>
+<4FB9> <4FB9> <CDEE>
+<4FBA> <4FBA> <CDEC>
+<4FBB> <4FBB> <CDE7>
+<4FBF> <4FBF> <AB4B>
+<4FC0> <4FC0> <CDED>
+<4FC1> <4FC1> <CDE3>
+<4FC2> <4FC2> <AB59>
+<4FC3> <4FC3> <AB50>
+<4FC4> <4FC4> <AB58>
+<4FC5> <4FC5> <CDDE>
+<4FC7> <4FC7> <CDEA>
+<4FC9> <4FC9> <CDE1>
+<4FCA> <4FCA> <AB54>
+<4FCB> <4FCB> <CDE2>
+<4FCD> <4FCD> <CDDD>
+<4FCE> <4FCE> <AB5B>
+<4FCF> <4FCF> <AB4E>
+endbfrange
+
+100 beginbfrange
+<4FD0> <4FD0> <AB57>
+<4FD1> <4FD1> <AB4D>
+<4FD3> <4FD3> <CDDF>
+<4FD4> <4FD4> <CDE4>
+<4FD6> <4FD6> <CDEB>
+<4FD7> <4FD7> <AB55>
+<4FD8> <4FD8> <AB52>
+<4FD9> <4FD9> <CDE6>
+<4FDA> <4FDA> <AB5A>
+<4FDB> <4FDB> <CDE9>
+<4FDC> <4FDC> <CDE5>
+<4FDD> <4FDD> <AB4F>
+<4FDE> <4FDE> <AB5C>
+<4FDF> <4FDF> <AB53>
+<4FE0> <4FE0> <AB4C>
+<4FE1> <4FE1> <AB48>
+<4FEC> <4FEC> <CDEF>
+<4FEE> <4FEE> <ADD7>
+<4FEF> <4FEF> <ADC1>
+<4FF1> <4FF1> <ADD1>
+<4FF3> <4FF3> <ADD6>
+<4FF4> <4FF4> <D0D0>
+<4FF5> <4FF5> <D0CF>
+<4FF6> <4FF7> <D0D4>
+<4FF8> <4FF8> <ADC4>
+<4FFA> <4FFA> <ADCD>
+<4FFE> <4FFE> <ADDA>
+<5000> <5000> <ADCE>
+<5005> <5005> <D0C9>
+<5006> <5006> <ADC7>
+<5007> <5007> <D0CA>
+<5009> <5009> <ADDC>
+<500B> <500B> <ADD3>
+<500C> <500D> <ADBE>
+<500E> <500E> <D0DD>
+<500F> <500F> <B0BF>
+<5011> <5011> <ADCC>
+<5012> <5012> <ADCB>
+<5013> <5013> <D0CB>
+<5014> <5014> <ADCF>
+<5015> <5015> <D45B>
+<5016> <5016> <ADC6>
+<5017> <5017> <D0D6>
+<5018> <5018> <ADD5>
+<5019> <5019> <ADD4>
+<501A> <501A> <ADCA>
+<501B> <501B> <D0CE>
+<501C> <501C> <D0D7>
+<501E> <501E> <D0C8>
+<501F> <501F> <ADC9>
+<5020> <5020> <D0D8>
+<5021> <5021> <ADD2>
+<5022> <5022> <D0CC>
+<5023> <5023> <ADC0>
+<5025> <5025> <ADC3>
+<5026> <5026> <ADC2>
+<5027> <5027> <D0D9>
+<5028> <5028> <ADD0>
+<5029> <5029> <ADC5>
+<502A> <502A> <ADD9>
+<502B> <502B> <ADDB>
+<502C> <502C> <D0D3>
+<502D> <502D> <ADD8>
+<502F> <502F> <D0DB>
+<5030> <5030> <D0CD>
+<5031> <5031> <D0DC>
+<5033> <5033> <D0D1>
+<5035> <5035> <D0DA>
+<5037> <5037> <D0D2>
+<503C> <503C> <ADC8>
+<5040> <5040> <D463>
+<5041> <5041> <D457>
+<5043> <5043> <B0B3>
+<5045> <5045> <D45C>
+<5046> <5046> <D462>
+<5047> <5047> <B0B2>
+<5048> <5048> <D455>
+<5049> <5049> <B0B6>
+<504A> <504A> <D459>
+<504B> <504B> <D452>
+<504C> <504C> <B0B4>
+<504D> <504D> <D456>
+<504E> <504E> <B0B9>
+<504F> <504F> <B0BE>
+<5051> <5051> <D467>
+<5053> <5053> <D451>
+<5055> <5055> <B0BA>
+<5057> <5057> <D466>
+<505A> <505A> <B0B5>
+<505B> <505B> <D458>
+<505C> <505C> <B0B1>
+<505D> <505D> <D453>
+<505E> <505E> <D44F>
+<505F> <505F> <D45D>
+<5060> <5060> <D450>
+<5061> <5061> <D44E>
+<5062> <5062> <D45A>
+<5063> <5064> <D460>
+<5065> <5065> <B0B7>
+<5068> <5068> <D85B>
+endbfrange
+
+100 beginbfrange
+<5069> <5069> <D45E>
+<506A> <506A> <D44D>
+<506B> <506B> <D45F>
+<506D> <506D> <B0C1>
+<506E> <506E> <D464>
+<506F> <506F> <B0C0>
+<5070> <5070> <D44C>
+<5072> <5072> <D454>
+<5073> <5073> <D465>
+<5074> <5074> <B0BC>
+<5075> <5075> <B0BB>
+<5076> <5076> <B0B8>
+<5077> <5077> <B0BD>
+<507A> <507A> <B0AF>
+<507D> <507D> <B0B0>
+<5080> <5080> <B3C8>
+<5082> <5082> <D85E>
+<5083> <5083> <D857>
+<5085> <5085> <B3C5>
+<5087> <5087> <D85F>
+<508B> <508B> <D855>
+<508C> <508C> <D858>
+<508D> <508D> <B3C4>
+<508E> <508E> <D859>
+<5091> <5091> <B3C7>
+<5092> <5092> <D85D>
+<5094> <5094> <D853>
+<5095> <5095> <D852>
+<5096> <5096> <B3C9>
+<5098> <5098> <B3CA>
+<5099> <5099> <B3C6>
+<509A> <509A> <B3CB>
+<509B> <509B> <D851>
+<509C> <509C> <D85C>
+<509D> <509D> <D85A>
+<509E> <509E> <D854>
+<50A2> <50A2> <B3C3>
+<50A3> <50A3> <D856>
+<50AC> <50AC> <B6CA>
+<50AD> <50AD> <B6C4>
+<50AE> <50AE> <DCB7>
+<50AF> <50AF> <B6CD>
+<50B0> <50B0> <DCBD>
+<50B1> <50B1> <DCC0>
+<50B2> <50B3> <B6C6>
+<50B4> <50B4> <DCBA>
+<50B5> <50B5> <B6C5>
+<50B6> <50B6> <DCC3>
+<50B7> <50B7> <B6CB>
+<50B8> <50B8> <DCC4>
+<50BA> <50BA> <DCBF>
+<50BB> <50BB> <B6CC>
+<50BD> <50BD> <DCB4>
+<50BE> <50BE> <B6C9>
+<50BF> <50BF> <DCB5>
+<50C1> <50C1> <DCBE>
+<50C2> <50C2> <DCBC>
+<50C4> <50C4> <DCB8>
+<50C5> <50C5> <B6C8>
+<50C6> <50C6> <DCB6>
+<50C7> <50C7> <B6CE>
+<50C8> <50C8> <DCBB>
+<50C9> <50C9> <DCC2>
+<50CA> <50CA> <DCB9>
+<50CB> <50CB> <DCC1>
+<50CE> <50CE> <B9B6>
+<50CF> <50CF> <B9B3>
+<50D1> <50D1> <B9B4>
+<50D3> <50D3> <E0F9>
+<50D4> <50D4> <E0F1>
+<50D5> <50D5> <B9B2>
+<50D6> <50D6> <B9AF>
+<50D7> <50D7> <E0F2>
+<50DA> <50DA> <B9B1>
+<50DB> <50DB> <E0F5>
+<50DD> <50DD> <E0F7>
+<50E0> <50E0> <E0FE>
+<50E3> <50E3> <E0FD>
+<50E4> <50E4> <E0F8>
+<50E5> <50E5> <B9AE>
+<50E6> <50E6> <E0F0>
+<50E7> <50E7> <B9AC>
+<50E8> <50E8> <E0F3>
+<50E9> <50E9> <B9B7>
+<50EA> <50EA> <E0F6>
+<50EC> <50EC> <E0FA>
+<50ED> <50ED> <B9B0>
+<50EE> <50EE> <B9AD>
+<50EF> <50EF> <E0FC>
+<50F0> <50F0> <E0FB>
+<50F1> <50F1> <B9B5>
+<50F3> <50F3> <E0F4>
+<50F5> <50F5> <BBF8>
+<50F6> <50F6> <E4EC>
+<50F8> <50F8> <E4E9>
+<50F9> <50F9> <BBF9>
+<50FB> <50FB> <BBF7>
+<50FD> <50FD> <E4F0>
+<50FE> <50FE> <E4ED>
+<50FF> <50FF> <E4E6>
+endbfrange
+
+100 beginbfrange
+<5100> <5100> <BBF6>
+<5102> <5102> <BBFA>
+<5103> <5103> <E4E7>
+<5104> <5104> <BBF5>
+<5105> <5105> <BBFD>
+<5106> <5107> <E4EA>
+<5108> <5109> <BBFB>
+<510A> <510A> <E4F1>
+<510B> <510C> <E4EE>
+<5110> <5110> <BEAA>
+<5111> <5111> <E8F8>
+<5112> <5112> <BEA7>
+<5113> <5113> <E8F5>
+<5114> <5114> <BEA9>
+<5115> <5115> <BEAB>
+<5117> <5117> <E8F6>
+<5118> <5118> <BEA8>
+<511A> <511A> <E8F7>
+<511C> <511C> <E8F4>
+<511F> <511F> <C076>
+<5120> <5120> <ECBD>
+<5121> <5121> <C077>
+<5122> <5122> <ECBB>
+<5124> <5124> <ECBC>
+<5125> <5125> <ECBA>
+<5126> <5126> <ECB9>
+<5129> <5129> <ECBE>
+<512A> <512A> <C075>
+<512D> <512E> <EFB8>
+<5130> <5130> <E4E8>
+<5131> <5131> <EFB7>
+<5132> <5132> <C078>
+<5133> <5133> <C35F>
+<5134> <5135> <F1EB>
+<5137> <5138> <C4D7>
+<5139> <5139> <F5C1>
+<513A> <513A> <F5C0>
+<513B> <513B> <C56C>
+<513C> <513C> <C56B>
+<513D> <513D> <F7D0>
+<513F> <513F> <A449>
+<5140> <5140> <A461>
+<5141> <5141> <A4B9>
+<5143> <5143> <A4B8>
+<5144> <5144> <A553>
+<5145> <5145> <A552>
+<5146> <5146> <A5FC>
+<5147> <5147> <A5FB>
+<5148> <5148> <A5FD>
+<5149> <5149> <A5FA>
+<514B> <514B> <A74A>
+<514C> <514C> <A749>
+<514D> <514D> <A74B>
+<5152> <5152> <A8E0>
+<5154> <5154> <A8DF>
+<5155> <5155> <A8E1>
+<5157> <5157> <AB5E>
+<5159> <5159> <A259>
+<515A> <515A> <D0DE>
+<515B> <515B> <A25A>
+<515C> <515C> <B0C2>
+<515D> <515D> <A25C>
+<515E> <515E> <A25B>
+<515F> <515F> <D860>
+<5161> <5161> <A25D>
+<5162> <5162> <B9B8>
+<5163> <5163> <A25E>
+<5165> <5165> <A44A>
+<5167> <5167> <A4BA>
+<5168> <5168> <A5FE>
+<5169> <5169> <A8E2>
+<516B> <516B> <A44B>
+<516C> <516C> <A4BD>
+<516D> <516E> <A4BB>
+<5171> <5171> <A640>
+<5175> <5175> <A74C>
+<5176> <5176> <A8E4>
+<5177> <5177> <A8E3>
+<5178> <5178> <A8E5>
+<517C> <517C> <ADDD>
+<5180> <5180> <BEAC>
+<5187> <5187> <C94E>
+<5189> <518A> <A554>
+<518D> <518D> <A641>
+<518F> <518F> <CA6A>
+<5191> <5191> <AB60>
+<5192> <5192> <AB5F>
+<5193> <5193> <D0E0>
+<5194> <5194> <D0DF>
+<5195> <5195> <B0C3>
+<5197> <5197> <A4BE>
+<5198> <5198> <C955>
+<519E> <519E> <CBCD>
+<51A0> <51A0> <AB61>
+<51A2> <51A2> <ADE0>
+<51A4> <51A5> <ADDE>
+<51AA> <51AA> <BEAD>
+<51AC> <51AC> <A556>
+<51B0> <51B0> <A642>
+<51B1> <51B1> <C9BC>
+endbfrange
+
+100 beginbfrange
+<51B6> <51B7> <A74D>
+<51B9> <51B9> <CA6B>
+<51BC> <51BC> <CBCE>
+<51BD> <51BD> <A8E6>
+<51BE> <51BE> <CBCF>
+<51C4> <51C5> <D0E2>
+<51C6> <51C6> <ADE3>
+<51C8> <51C8> <D0E4>
+<51CA> <51CA> <D0E1>
+<51CB> <51CB> <ADE4>
+<51CC> <51CC> <ADE2>
+<51CD> <51CD> <ADE1>
+<51CE> <51CE> <D0E5>
+<51D0> <51D0> <D468>
+<51D4> <51D4> <D861>
+<51D7> <51D7> <DCC5>
+<51D8> <51D8> <E140>
+<51DC> <51DC> <BBFE>
+<51DD> <51DD> <BEAE>
+<51DE> <51DE> <E8F9>
+<51E0> <51E0> <A44C>
+<51E1> <51E1> <A45A>
+<51F0> <51F0> <B0C4>
+<51F1> <51F1> <B3CD>
+<51F3> <51F3> <B9B9>
+<51F5> <51F5> <C942>
+<51F6> <51F6> <A4BF>
+<51F8> <51F8> <A559>
+<51F9> <51FA> <A557>
+<51FD> <51FD> <A8E7>
+<5200> <5201> <A44D>
+<5203> <5203> <A462>
+<5206> <5208> <A4C0>
+<5209> <5209> <C9BE>
+<520A> <520A> <A55A>
+<520C> <520C> <C96B>
+<520E> <520E> <A646>
+<5210> <5210> <C9BF>
+<5211> <5212> <A644>
+<5213> <5213> <C9BD>
+<5216> <5216> <A647>
+<5217> <5217> <A643>
+<521C> <521C> <CA6C>
+<521D> <521D> <AAEC>
+<521E> <521E> <CA6D>
+<5221> <5221> <CA6E>
+<5224> <5224> <A750>
+<5225> <5225> <A74F>
+<5228> <5228> <A753>
+<5229> <522A> <A751>
+<522E> <522E> <A8ED>
+<5230> <5230> <A8EC>
+<5231> <5231> <CBD4>
+<5232> <5233> <CBD1>
+<5235> <5235> <CBD0>
+<5236> <5236> <A8EE>
+<5237> <5237> <A8EA>
+<5238> <5238> <A8E9>
+<523A> <523A> <A8EB>
+<523B> <523B> <A8E8>
+<5241> <5241> <A8EF>
+<5243> <5243> <AB63>
+<5244> <5244> <CDF0>
+<5246> <5246> <CBD3>
+<5247> <5247> <AB68>
+<5249> <5249> <CDF1>
+<524A> <524A> <AB64>
+<524B> <524B> <AB67>
+<524C> <524C> <AB66>
+<524D> <524D> <AB65>
+<524E> <524E> <AB62>
+<5252> <5252> <D0E8>
+<5254> <5254> <ADE7>
+<5255> <5255> <D0EB>
+<5256> <5256> <ADE5>
+<525A> <525A> <D0E7>
+<525B> <525B> <ADE8>
+<525C> <525C> <ADE6>
+<525D> <525D> <ADE9>
+<525E> <525F> <D0E9>
+<5261> <5261> <D0E6>
+<5262> <5262> <D0EC>
+<5269> <5269> <B3D1>
+<526A> <526A> <B0C5>
+<526B> <526B> <D469>
+<526C> <526C> <D46B>
+<526D> <526D> <D46A>
+<526E> <526E> <D46C>
+<526F> <526F> <B0C6>
+<5272> <5272> <B3CE>
+<5274> <5275> <B3CF>
+<5277> <5277> <B6D0>
+<5278> <5278> <DCC7>
+<527A> <527A> <DCC6>
+<527B> <527C> <DCC8>
+<527D> <527D> <B6D1>
+<527F> <527F> <B6CF>
+<5280> <5281> <E141>
+<5282> <5282> <B9BB>
+<5283> <5283> <B9BA>
+endbfrange
+
+100 beginbfrange
+<5284> <5284> <E35A>
+<5287> <5289> <BC40>
+<528A> <528A> <BC44>
+<528B> <528C> <E4F2>
+<528D> <528D> <BC43>
+<5291> <5291> <BEAF>
+<5293> <5293> <BEB0>
+<5296> <5296> <F1ED>
+<5297> <5297> <F5C3>
+<5298> <5298> <F5C2>
+<5299> <5299> <F7D1>
+<529B> <529B> <A44F>
+<529F> <529F> <A55C>
+<52A0> <52A0> <A55B>
+<52A3> <52A3> <A648>
+<52A6> <52A6> <C9C0>
+<52A9> <52AA> <A755>
+<52AB> <52AB> <A754>
+<52AC> <52AC> <A757>
+<52AD> <52AE> <CA6F>
+<52BB> <52BB> <A8F1>
+<52BC> <52BC> <CBD5>
+<52BE> <52BE> <A8F0>
+<52C0> <52C0> <CDF2>
+<52C1> <52C1> <AB6C>
+<52C2> <52C2> <CDF3>
+<52C3> <52C3> <AB6B>
+<52C7> <52C7> <AB69>
+<52C9> <52C9> <AB6A>
+<52CD> <52CD> <D0ED>
+<52D2> <52D2> <B0C7>
+<52D3> <52D3> <D46E>
+<52D5> <52D5> <B0CA>
+<52D6> <52D6> <D46D>
+<52D7> <52D7> <B1E5>
+<52D8> <52D8> <B0C9>
+<52D9> <52D9> <B0C8>
+<52DB> <52DB> <B3D4>
+<52DD> <52DD> <B3D3>
+<52DE> <52DE> <B3D2>
+<52DF> <52DF> <B6D2>
+<52E2> <52E3> <B6D5>
+<52E4> <52E4> <B6D4>
+<52E6> <52E6> <B6D3>
+<52E9> <52E9> <E143>
+<52EB> <52EB> <E144>
+<52EF> <52EF> <E4F5>
+<52F0> <52F0> <BC45>
+<52F1> <52F1> <E4F4>
+<52F3> <52F3> <BEB1>
+<52F4> <52F4> <ECBF>
+<52F5> <52F5> <C079>
+<52F7> <52F7> <F1EE>
+<52F8> <52F8> <C455>
+<52FA> <52FA> <A463>
+<52FB> <52FB> <A4C3>
+<52FC> <52FC> <C956>
+<52FE> <52FF> <A4C4>
+<5305> <5306> <A55D>
+<5308> <5308> <A649>
+<5309> <5309> <CA71>
+<530A> <530B> <CBD6>
+<530D> <530D> <AB6D>
+<530E> <530E> <D0EE>
+<530F> <530F> <B0CC>
+<5310> <5310> <B0CB>
+<5311> <5311> <D863>
+<5312> <5312> <D862>
+<5315> <5315> <A450>
+<5316> <5316> <A4C6>
+<5317> <5317> <A55F>
+<5319> <5319> <B0CD>
+<531A> <531A> <C943>
+<531C> <531C> <C96C>
+<531D> <531D> <A560>
+<531F> <531F> <C9C2>
+<5320> <5320> <A64B>
+<5321> <5321> <A64A>
+<5322> <5322> <C9C1>
+<5323> <5323> <A758>
+<532A> <532A> <ADEA>
+<532D> <532D> <D46F>
+<532F> <532F> <B6D7>
+<5330> <5330> <E145>
+<5331> <5331> <B9BC>
+<5334> <5334> <E8FA>
+<5337> <5337> <F3FD>
+<5339> <5339> <A4C7>
+<533C> <533C> <CBD8>
+<533D> <533D> <CDF4>
+<533E> <533E> <B0D0>
+<533F> <5340> <B0CE>
+<5341> <5341> <A451>
+<5343> <5343> <A464>
+<5344> <5344> <A2CD>
+<5345> <5345> <A4CA>
+<5347> <5347> <A4C9>
+<5348> <5348> <A4C8>
+<5349> <5349> <A563>
+<534A> <534A> <A562>
+endbfrange
+
+100 beginbfrange
+<534C> <534C> <C96D>
+<534D> <534D> <C9C3>
+<5351> <5351> <A8F5>
+<5352> <5352> <A8F2>
+<5353> <5353> <A8F4>
+<5354> <5354> <A8F3>
+<5357> <5357> <AB6E>
+<535A> <535A> <B3D5>
+<535C> <535C> <A452>
+<535E> <535E> <A4CB>
+<5360> <5360> <A565>
+<5361> <5361> <A564>
+<5363> <5363> <CA72>
+<5366> <5366> <A8F6>
+<536C> <536C> <C957>
+<536E> <536E> <A567>
+<536F> <536F> <A566>
+<5370> <5371> <A64C>
+<5372> <5372> <CA73>
+<5373> <5373> <A759>
+<5375> <5375> <A75A>
+<5377> <5379> <A8F7>
+<537B> <537B> <AB6F>
+<537C> <537C> <CDF5>
+<537F> <537F> <ADEB>
+<5382> <5382> <C944>
+<5384> <5384> <A4CC>
+<538A> <538A> <C9C4>
+<538E> <538F> <CA74>
+<5392> <5392> <CBD9>
+<5394> <5394> <CBDA>
+<5396> <5396> <CDF7>
+<5397> <5397> <CDF6>
+<5398> <5398> <CDF9>
+<5399> <5399> <CDF8>
+<539A> <539A> <AB70>
+<539C> <539C> <D470>
+<539D> <539D> <ADED>
+<539E> <539E> <D0EF>
+<539F> <539F> <ADEC>
+<53A4> <53A4> <D864>
+<53A5> <53A5> <B3D6>
+<53A7> <53A7> <D865>
+<53AC> <53AC> <E146>
+<53AD> <53AD> <B9BD>
+<53B2> <53B2> <BC46>
+<53B4> <53B4> <F1EF>
+<53B9> <53B9> <C958>
+<53BB> <53BB> <A568>
+<53C3> <53C3> <B0D1>
+<53C8> <53C8> <A453>
+<53C9> <53C9> <A465>
+<53CA> <53CA> <A4CE>
+<53CB> <53CB> <A4CD>
+<53CD> <53CD> <A4CF>
+<53D4> <53D4> <A8FB>
+<53D6> <53D6> <A8FA>
+<53D7> <53D7> <A8FC>
+<53DB> <53DB> <AB71>
+<53DF> <53DF> <ADEE>
+<53E1> <53E1> <E8FB>
+<53E2> <53E2> <C24F>
+<53E3> <53E3> <A466>
+<53E4> <53E4> <A56A>
+<53E5> <53E5> <A579>
+<53E6> <53E6> <A574>
+<53E8> <53E8> <A56F>
+<53E9> <53E9> <A56E>
+<53EA> <53EA> <A575>
+<53EB> <53EB> <A573>
+<53EC> <53EC> <A56C>
+<53ED> <53ED> <A57A>
+<53EE> <53EE> <A56D>
+<53EF> <53EF> <A569>
+<53F0> <53F0> <A578>
+<53F1> <53F1> <A577>
+<53F2> <53F2> <A576>
+<53F3> <53F3> <A56B>
+<53F5> <53F5> <A572>
+<53F8> <53F8> <A571>
+<53FB> <53FB> <A57B>
+<53FC> <53FC> <A570>
+<5401> <5401> <A653>
+<5403> <5403> <A659>
+<5404> <5404> <A655>
+<5406> <5406> <A65B>
+<5407> <5407> <C9C5>
+<5408> <5408> <A658>
+<5409> <5409> <A64E>
+<540A> <540A> <A651>
+<540B> <540B> <A654>
+<540C> <540C> <A650>
+<540D> <540D> <A657>
+<540E> <540E> <A65A>
+<540F> <540F> <A64F>
+<5410> <5410> <A652>
+<5411> <5411> <A656>
+<5412> <5412> <A65C>
+<5418> <5418> <CA7E>
+<5419> <5419> <CA7B>
+endbfrange
+
+100 beginbfrange
+<541B> <541B> <A767>
+<541C> <541C> <CA7C>
+<541D> <541D> <A75B>
+<541E> <541E> <A75D>
+<541F> <541F> <A775>
+<5420> <5420> <A770>
+<5424> <5424> <CAA5>
+<5425> <5425> <CA7D>
+<5426> <5426> <A75F>
+<5427> <5427> <A761>
+<5428> <5428> <CAA4>
+<5429> <5429> <A768>
+<542A> <542A> <CA78>
+<542B> <542B> <A774>
+<542C> <542C> <A776>
+<542D> <542D> <A75C>
+<542E> <542E> <A76D>
+<5430> <5430> <CA76>
+<5431> <5431> <A773>
+<5433> <5433> <A764>
+<5435> <5436> <A76E>
+<5437> <5437> <CA77>
+<5438> <5438> <A76C>
+<5439> <5439> <A76A>
+<543B> <543B> <A76B>
+<543C> <543C> <A771>
+<543D> <543D> <CAA1>
+<543E> <543E> <A75E>
+<5440> <5440> <A772>
+<5441> <5441> <CAA3>
+<5442> <5442> <A766>
+<5443> <5443> <A763>
+<5445> <5445> <CA7A>
+<5446> <5446> <A762>
+<5447> <5447> <CAA6>
+<5448> <5448> <A765>
+<544A> <544A> <A769>
+<544E> <544E> <A760>
+<544F> <544F> <CAA2>
+<5454> <5454> <CA79>
+<5460> <5460> <CBEB>
+<5461> <5461> <CBEA>
+<5462> <5462> <A94F>
+<5463> <5463> <CBED>
+<5464> <5464> <CBEF>
+<5465> <5465> <CBE4>
+<5466> <5466> <CBE7>
+<5467> <5467> <CBEE>
+<5468> <5468> <A950>
+<546B> <546B> <CBE1>
+<546C> <546C> <CBE5>
+<546F> <546F> <CBE9>
+<5470> <5470> <CE49>
+<5471> <5471> <A94B>
+<5472> <5472> <CE4D>
+<5473> <5473> <A8FD>
+<5474> <5474> <CBE6>
+<5475> <5475> <A8FE>
+<5476> <5476> <A94C>
+<5477> <5477> <A945>
+<5478> <5478> <A941>
+<547A> <547A> <CBE2>
+<547B> <547B> <A944>
+<547C> <547C> <A949>
+<547D> <547D> <A952>
+<547E> <547E> <CBE3>
+<547F> <547F> <CBDC>
+<5480> <5480> <A943>
+<5481> <5481> <CBDD>
+<5482> <5482> <CBDF>
+<5484> <5484> <A946>
+<5486> <5486> <A948>
+<5487> <5487> <CBDB>
+<5488> <5488> <CBE0>
+<548B> <548B> <A951>
+<548C> <548C> <A94D>
+<548D> <548D> <CBE8>
+<548E> <548E> <A953>
+<5490> <5490> <A94A>
+<5491> <5491> <CBDE>
+<5492> <5492> <A947>
+<5495> <5495> <A942>
+<5496> <5496> <A940>
+<5498> <5498> <CBEC>
+<549A> <549A> <A94E>
+<54A0> <54A0> <CE48>
+<54A1> <54A1> <CDFB>
+<54A2> <54A2> <CE4B>
+<54A5> <54A5> <CDFD>
+<54A6> <54A6> <AB78>
+<54A7> <54A7> <ABA8>
+<54A8> <54A8> <AB74>
+<54A9> <54A9> <ABA7>
+<54AA> <54AA> <AB7D>
+<54AB> <54AB> <ABA4>
+<54AC> <54AC> <AB72>
+<54AD> <54AD> <CDFC>
+<54AE> <54AE> <CE43>
+<54AF> <54AF> <ABA3>
+<54B0> <54B0> <CE4F>
+endbfrange
+
+100 beginbfrange
+<54B1> <54B1> <ABA5>
+<54B3> <54B3> <AB79>
+<54B6> <54B6> <CE45>
+<54B7> <54B7> <CE42>
+<54B8> <54B8> <AB77>
+<54BA> <54BA> <CDFA>
+<54BB> <54BB> <ABA6>
+<54BC> <54BC> <CE4A>
+<54BD> <54BD> <AB7C>
+<54BE> <54BE> <CE4C>
+<54BF> <54BF> <ABA9>
+<54C0> <54C0> <AB73>
+<54C1> <54C1> <AB7E>
+<54C2> <54C2> <AB7B>
+<54C3> <54C3> <CE40>
+<54C4> <54C4> <ABA1>
+<54C5> <54C6> <CE46>
+<54C7> <54C7> <AB7A>
+<54C8> <54C8> <ABA2>
+<54C9> <54C9> <AB76>
+<54CE> <54CE> <AB75>
+<54CF> <54CF> <CDFE>
+<54D6> <54D6> <CE44>
+<54DE> <54DE> <CE4E>
+<54E0> <54E0> <D144>
+<54E1> <54E1> <ADFB>
+<54E2> <54E2> <D0F1>
+<54E4> <54E4> <D0F6>
+<54E5> <54E5> <ADF4>
+<54E6> <54E6> <AE40>
+<54E7> <54E7> <D0F4>
+<54E8> <54E8> <ADEF>
+<54E9> <54E9> <ADF9>
+<54EA> <54EA> <ADFE>
+<54EB> <54EB> <D0FB>
+<54ED> <54ED> <ADFA>
+<54EE> <54EE> <ADFD>
+<54F1> <54F1> <D0FE>
+<54F2> <54F2> <ADF5>
+<54F3> <54F3> <D0F5>
+<54F7> <54F8> <D142>
+<54FA> <54FA> <ADF7>
+<54FB> <54FB> <D141>
+<54FC> <54FC> <ADF3>
+<54FD> <54FD> <AE43>
+<54FF> <54FF> <D0F8>
+<5501> <5501> <ADF1>
+<5503> <5503> <D146>
+<5504> <5504> <D0F9>
+<5505> <5505> <D0FD>
+<5506> <5506> <ADF6>
+<5507> <5507> <AE42>
+<5508> <5508> <D0FA>
+<5509> <5509> <ADFC>
+<550A> <550A> <D140>
+<550B> <550B> <D147>
+<550C> <550C> <D4A1>
+<550E> <550E> <D145>
+<550F> <550F> <AE44>
+<5510> <5510> <ADF0>
+<5511> <5511> <D0FC>
+<5512> <5512> <D0F3>
+<5514> <5514> <ADF8>
+<5517> <5517> <D0F2>
+<551A> <551A> <D0F7>
+<5526> <5526> <D0F0>
+<5527> <5527> <AE41>
+<552A> <552A> <D477>
+<552C> <552C> <B0E4>
+<552D> <552D> <D4A7>
+<552E> <552E> <B0E2>
+<552F> <552F> <B0DF>
+<5530> <5530> <D47C>
+<5531> <5531> <B0DB>
+<5532> <5532> <D4A2>
+<5533> <5533> <B0E6>
+<5534> <5534> <D476>
+<5535> <5535> <D47B>
+<5536> <5536> <D47A>
+<5537> <5537> <ADF2>
+<5538> <5538> <B0E1>
+<5539> <5539> <D4A5>
+<553B> <553B> <D4A8>
+<553C> <553C> <D473>
+<553E> <553E> <B3E8>
+<5540> <5540> <D4A9>
+<5541> <5541> <B0E7>
+<5543> <5543> <B0D9>
+<5544> <5544> <B0D6>
+<5545> <5545> <D47E>
+<5546> <5546> <B0D3>
+<5548> <5548> <D4A6>
+<554A> <554A> <B0DA>
+<554B> <554B> <D4AA>
+<554D> <554D> <D474>
+<554E> <554E> <D4A4>
+<554F> <554F> <B0DD>
+<5550> <5550> <D475>
+<5551> <5551> <D478>
+<5552> <5552> <D47D>
+endbfrange
+
+100 beginbfrange
+<5555> <5555> <B0DE>
+<5556> <5556> <B0DC>
+<5557> <5557> <B0E8>
+<555C> <555C> <B0E3>
+<555E> <555E> <B0D7>
+<555F> <555F> <B1D2>
+<5561> <5561> <B0D8>
+<5562> <5562> <D479>
+<5563> <5563> <B0E5>
+<5564> <5564> <B0E0>
+<5565> <5565> <D4A3>
+<5566> <5566> <B0D5>
+<556A> <556A> <B0D4>
+<5575> <5576> <D471>
+<5577> <5577> <D86A>
+<557B> <557B> <B3D7>
+<557C> <557C> <B3DA>
+<557D> <557D> <D875>
+<557E> <557E> <B3EE>
+<557F> <557F> <D878>
+<5580> <5580> <B3D8>
+<5581> <5581> <D871>
+<5582> <5582> <B3DE>
+<5583> <5583> <B3E4>
+<5584> <5584> <B5BD>
+<5587> <5587> <B3E2>
+<5588> <5588> <D86E>
+<5589> <5589> <B3EF>
+<558A> <558A> <B3DB>
+<558B> <558B> <B3E3>
+<558C> <558C> <D876>
+<558D> <558D> <DCD7>
+<558E> <558E> <D87B>
+<558F> <558F> <D86F>
+<5591> <5591> <D866>
+<5592> <5592> <D873>
+<5593> <5593> <D86D>
+<5594> <5594> <B3E1>
+<5595> <5595> <D879>
+<5598> <5598> <B3DD>
+<5599> <5599> <B3F1>
+<559A> <559A> <B3EA>
+<559C> <559C> <B3DF>
+<559D> <559D> <B3DC>
+<559F> <559F> <B3E7>
+<55A1> <55A1> <D87A>
+<55A2> <55A2> <D86C>
+<55A3> <55A3> <D872>
+<55A4> <55A4> <D874>
+<55A5> <55A5> <D868>
+<55A6> <55A6> <D877>
+<55A7> <55A7> <B3D9>
+<55A8> <55A8> <D867>
+<55AA> <55AA> <B3E0>
+<55AB> <55AB> <B3F0>
+<55AC> <55AC> <B3EC>
+<55AD> <55AD> <D869>
+<55AE> <55AE> <B3E6>
+<55B1> <55B1> <B3ED>
+<55B2> <55B2> <B3E9>
+<55B3> <55B3> <B3E5>
+<55B5> <55B5> <D870>
+<55BB> <55BB> <B3EB>
+<55BF> <55BF> <DCD5>
+<55C0> <55C0> <DCD1>
+<55C2> <55C2> <DCE0>
+<55C3> <55C3> <DCCA>
+<55C4> <55C4> <DCD3>
+<55C5> <55C6> <B6E5>
+<55C7> <55C7> <B6DE>
+<55C8> <55C8> <DCDC>
+<55C9> <55C9> <B6E8>
+<55CA> <55CA> <DCCF>
+<55CB> <55CB> <DCCE>
+<55CC> <55CC> <DCCC>
+<55CD> <55CD> <DCDE>
+<55CE> <55CE> <B6DC>
+<55CF> <55CF> <DCD8>
+<55D0> <55D0> <DCCD>
+<55D1> <55D1> <B6DF>
+<55D2> <55D2> <DCD6>
+<55D3> <55D3> <B6DA>
+<55D4> <55D4> <DCD2>
+<55D5> <55D5> <DCD9>
+<55D6> <55D6> <DCDB>
+<55D9> <55D9> <DCDF>
+<55DA> <55DA> <B6E3>
+<55DB> <55DB> <DCCB>
+<55DC> <55DC> <B6DD>
+<55DD> <55DD> <DCD0>
+<55DF> <55DF> <B6D8>
+<55E1> <55E1> <B6E4>
+<55E2> <55E2> <DCDA>
+<55E3> <55E4> <B6E0>
+<55E5> <55E5> <B6E7>
+<55E6> <55E6> <B6DB>
+<55E7> <55E7> <A25F>
+<55E8> <55E8> <B6D9>
+<55E9> <55E9> <DCD4>
+<55EF> <55EF> <B6E2>
+endbfrange
+
+100 beginbfrange
+<55F2> <55F2> <DCDD>
+<55F6> <55F6> <B9CD>
+<55F7> <55F7> <B9C8>
+<55F9> <55F9> <E155>
+<55FA> <55FA> <E151>
+<55FC> <55FC> <E14B>
+<55FD> <55FD> <B9C2>
+<55FE> <55FE> <B9BE>
+<55FF> <55FF> <E154>
+<5600> <5600> <B9BF>
+<5601> <5601> <E14E>
+<5602> <5602> <E150>
+<5604> <5604> <E153>
+<5606> <5606> <B9C4>
+<5608> <5608> <B9CB>
+<5609> <5609> <B9C5>
+<560C> <560C> <E149>
+<560D> <560E> <B9C6>
+<560F> <560F> <E14C>
+<5610> <5610> <B9CC>
+<5612> <5612> <E14A>
+<5613> <5613> <E14F>
+<5614> <5614> <B9C3>
+<5615> <5615> <E148>
+<5616> <5616> <B9C9>
+<5617> <5617> <B9C1>
+<561B> <561B> <B9C0>
+<561C> <561C> <E14D>
+<561D> <561D> <E152>
+<561F> <561F> <B9CA>
+<5627> <5627> <E147>
+<5629> <5629> <BC4D>
+<562A> <562A> <E547>
+<562C> <562C> <E544>
+<562E> <562E> <BC47>
+<562F> <5630> <BC53>
+<5632> <5632> <BC4A>
+<5633> <5633> <E542>
+<5634> <5634> <BC4C>
+<5635> <5635> <E4F9>
+<5636> <5636> <BC52>
+<5638> <5638> <E546>
+<5639> <5639> <BC49>
+<563A> <563A> <E548>
+<563B> <563B> <BC48>
+<563D> <563D> <E543>
+<563E> <563E> <E545>
+<563F> <563F> <BC4B>
+<5640> <5640> <E541>
+<5641> <5641> <E4FA>
+<5642> <5642> <E4F7>
+<5645> <5645> <D86B>
+<5646> <5646> <E4FD>
+<5648> <5648> <E4F6>
+<5649> <5649> <E4FC>
+<564A> <564A> <E4FB>
+<564C> <564C> <E4F8>
+<564E> <564E> <BC4F>
+<5653> <5653> <BC4E>
+<5657> <5657> <BC50>
+<5658> <5658> <E4FE>
+<5659> <5659> <BEB2>
+<565A> <565A> <E540>
+<565E> <565E> <E945>
+<5660> <5660> <E8FD>
+<5662> <5662> <BEBE>
+<5663> <5663> <E942>
+<5664> <5664> <BEB6>
+<5665> <5665> <BEBA>
+<5666> <5666> <E941>
+<5668> <5668> <BEB9>
+<5669> <5669> <BEB5>
+<566A> <566A> <BEB8>
+<566B> <566B> <BEB3>
+<566C> <566C> <BEBD>
+<566D> <566D> <E943>
+<566E> <566E> <E8FE>
+<566F> <566F> <BEBC>
+<5670> <5670> <E8FC>
+<5671> <5671> <BEBB>
+<5672> <5672> <E944>
+<5673> <5673> <E940>
+<5674> <5674> <BC51>
+<5676> <5676> <BEBF>
+<5677> <5677> <E946>
+<5678> <5678> <BEB7>
+<5679> <5679> <BEB4>
+<567E> <567E> <ECC6>
+<567F> <567F> <ECC8>
+<5680> <5680> <C07B>
+<5681> <5681> <ECC9>
+<5682> <5682> <ECC7>
+<5683> <5683> <ECC5>
+<5684> <5684> <ECC4>
+<5685> <5685> <C07D>
+<5686> <5686> <ECC3>
+<5687> <5687> <C07E>
+<568C> <568D> <ECC1>
+<568E> <568E> <C07A>
+<568F> <568F> <C0A1>
+endbfrange
+
+100 beginbfrange
+<5690> <5690> <C07C>
+<5693> <5693> <ECC0>
+<5695> <5695> <C250>
+<5697> <5697> <EFBC>
+<5698> <5698> <EFBA>
+<5699> <5699> <EFBF>
+<569A> <569A> <EFBD>
+<569C> <569C> <EFBB>
+<569D> <569D> <EFBE>
+<56A5> <56A5> <C360>
+<56A6> <56A7> <F1F2>
+<56A8> <56A8> <C456>
+<56AA> <56AA> <F1F4>
+<56AB> <56AB> <F1F0>
+<56AC> <56AC> <F1F5>
+<56AD> <56AD> <F1F1>
+<56AE> <56AE> <C251>
+<56B2> <56B2> <F3FE>
+<56B3> <56B3> <F441>
+<56B4> <56B4> <C459>
+<56B5> <56B5> <F440>
+<56B6> <56B6> <C458>
+<56B7> <56B7> <C457>
+<56BC> <56BC> <C45A>
+<56BD> <56BE> <F5C5>
+<56C0> <56C0> <C4DA>
+<56C1> <56C1> <C4D9>
+<56C2> <56C2> <C4DB>
+<56C3> <56C3> <F5C4>
+<56C5> <56C5> <F6D8>
+<56C6> <56C6> <F6D7>
+<56C8> <56C8> <C56D>
+<56C9> <56C9> <C56F>
+<56CA> <56CA> <C56E>
+<56CB> <56CB> <F6D9>
+<56CC> <56CC> <C5C8>
+<56CD> <56CD> <F8A6>
+<56D1> <56D1> <C5F1>
+<56D3> <56D3> <F8A5>
+<56D4> <56D4> <F8EE>
+<56D7> <56D7> <C949>
+<56DA> <56DA> <A57D>
+<56DB> <56DB> <A57C>
+<56DD> <56DD> <A65F>
+<56DE> <56DE> <A65E>
+<56DF> <56DF> <C9C7>
+<56E0> <56E0> <A65D>
+<56E1> <56E1> <C9C6>
+<56E4> <56E4> <A779>
+<56E5> <56E5> <CAA9>
+<56E7> <56E7> <CAA8>
+<56EA> <56EA> <A777>
+<56EB> <56EB> <A77A>
+<56EE> <56EE> <CAA7>
+<56F0> <56F0> <A778>
+<56F7> <56F7> <CBF0>
+<56F9> <56F9> <CBF1>
+<56FA> <56FA> <A954>
+<56FF> <56FF> <ABAA>
+<5701> <5702> <D148>
+<5703> <5704> <AE45>
+<5707> <5707> <D4AC>
+<5708> <5708> <B0E9>
+<5709> <5709> <B0EB>
+<570A> <570A> <D4AB>
+<570B> <570B> <B0EA>
+<570C> <570C> <D87C>
+<570D> <570D> <B3F2>
+<5712> <5713> <B6E9>
+<5714> <5714> <DCE1>
+<5716> <5716> <B9CF>
+<5718> <5718> <B9CE>
+<571A> <571A> <E549>
+<571B> <571B> <E948>
+<571C> <571C> <E947>
+<571E> <571E> <F96B>
+<571F> <571F> <A467>
+<5720> <5720> <C959>
+<5722> <5723> <C96E>
+<5728> <5728> <A662>
+<5729> <5729> <A666>
+<572A> <572A> <C9C9>
+<572C> <572C> <A664>
+<572D> <572D> <A663>
+<572E> <572E> <C9C8>
+<572F> <572F> <A665>
+<5730> <5730> <A661>
+<5733> <5733> <A660>
+<5734> <5734> <C9CA>
+<573B> <573B> <A7A6>
+<573E> <573E> <A7A3>
+<5740> <5740> <A77D>
+<5741> <5741> <CAAA>
+<5745> <5745> <CAAB>
+<5747> <5747> <A7A1>
+<5749> <5749> <CAAD>
+<574A> <574A> <A77B>
+<574B> <574B> <CAAE>
+<574C> <574C> <CAAC>
+<574D> <574D> <A77E>
+endbfrange
+
+100 beginbfrange
+<574E> <574E> <A7A2>
+<574F> <574F> <A7A5>
+<5750> <5750> <A7A4>
+<5751> <5751> <A77C>
+<5752> <5752> <CAAF>
+<5761> <5761> <A959>
+<5762> <5762> <CBFE>
+<5764> <5764> <A95B>
+<5766> <5766> <A95A>
+<5768> <5768> <CC40>
+<5769> <5769> <A958>
+<576A> <576A> <A957>
+<576B> <576B> <CBF5>
+<576D> <576D> <CBF4>
+<576F> <576F> <CBF2>
+<5770> <5770> <CBF7>
+<5771> <5771> <CBF6>
+<5772> <5772> <CBF3>
+<5773> <5774> <CBFC>
+<5775> <5775> <CBFA>
+<5776> <5776> <CBF8>
+<5777> <5777> <A956>
+<577B> <577B> <CBFB>
+<577C> <577C> <A95C>
+<577D> <577D> <CC41>
+<5780> <5780> <CBF9>
+<5782> <5782> <ABAB>
+<5783> <5783> <A955>
+<578B> <578B> <ABAC>
+<578C> <578C> <CE54>
+<578F> <578F> <CE5A>
+<5793> <5793> <ABB2>
+<5794> <5794> <CE58>
+<5795> <5795> <CE5E>
+<5797> <5797> <CE55>
+<5798> <5798> <CE59>
+<5799> <5799> <CE5B>
+<579A> <579A> <CE5D>
+<579B> <579B> <CE57>
+<579D> <579D> <CE56>
+<579E> <579F> <CE51>
+<57A0> <57A0> <ABAD>
+<57A2> <57A2> <ABAF>
+<57A3> <57A3> <ABAE>
+<57A4> <57A4> <CE53>
+<57A5> <57A5> <CE5C>
+<57AE> <57AE> <ABB1>
+<57B5> <57B5> <CE50>
+<57B6> <57B6> <D153>
+<57B8> <57B8> <D152>
+<57B9> <57B9> <D157>
+<57BA> <57BA> <D14E>
+<57BC> <57BC> <D151>
+<57BD> <57BD> <D150>
+<57BF> <57BF> <D154>
+<57C1> <57C1> <D158>
+<57C2> <57C2> <AE47>
+<57C3> <57C3> <AE4A>
+<57C6> <57C6> <D14F>
+<57C7> <57C7> <D155>
+<57CB> <57CB> <AE49>
+<57CC> <57CC> <D14A>
+<57CE> <57CE> <ABB0>
+<57CF> <57CF> <D4BA>
+<57D0> <57D0> <D156>
+<57D2> <57D2> <D14D>
+<57D4> <57D4> <AE48>
+<57D5> <57D5> <D14C>
+<57DC> <57DC> <D4B1>
+<57DF> <57DF> <B0EC>
+<57E0> <57E0> <B0F0>
+<57E1> <57E1> <D4C1>
+<57E2> <57E2> <D4AF>
+<57E3> <57E3> <D4BD>
+<57E4> <57E4> <B0F1>
+<57E5> <57E5> <D4BF>
+<57E7> <57E7> <D4C5>
+<57E9> <57E9> <D4C9>
+<57EC> <57EC> <D4C0>
+<57ED> <57ED> <D4B4>
+<57EE> <57EE> <D4BC>
+<57F0> <57F0> <D4CA>
+<57F1> <57F1> <D4C8>
+<57F2> <57F2> <D4BE>
+<57F3> <57F3> <D4B9>
+<57F4> <57F4> <D4B2>
+<57F5> <57F5> <D8A6>
+<57F6> <57F6> <D4B0>
+<57F7> <57F7> <B0F5>
+<57F8> <57F8> <D4B7>
+<57F9> <57F9> <B0F6>
+<57FA> <57FA> <B0F2>
+<57FB> <57FB> <D4AD>
+<57FC> <57FC> <D4C3>
+<57FD> <57FD> <D4B5>
+<5800> <5800> <D4B3>
+<5801> <5801> <D4C6>
+<5802> <5802> <B0F3>
+<5804> <5804> <D4CC>
+<5805> <5805> <B0ED>
+endbfrange
+
+100 beginbfrange
+<5806> <5806> <B0EF>
+<5807> <5807> <D4BB>
+<5808> <5808> <D4B6>
+<5809> <5809> <AE4B>
+<580A> <580A> <B0EE>
+<580B> <580B> <D4B8>
+<580C> <580C> <D4C7>
+<580D> <580D> <D4CB>
+<580E> <580E> <D4C2>
+<5810> <5810> <D4C4>
+<5814> <5814> <D4AE>
+<5819> <5819> <D8A1>
+<581B> <581B> <D8AA>
+<581C> <581C> <D8A9>
+<581D> <581D> <B3FA>
+<581E> <581E> <D8A2>
+<5820> <5820> <B3FB>
+<5821> <5821> <B3F9>
+<5823> <5823> <D8A4>
+<5824> <5824> <B3F6>
+<5825> <5825> <D8A8>
+<5827> <5827> <D8A3>
+<5828> <5828> <D8A5>
+<5829> <5829> <D87D>
+<582A> <582A> <B3F4>
+<582C> <582C> <D8B2>
+<582D> <582D> <D8B1>
+<582E> <582E> <D8AE>
+<582F> <582F> <B3F3>
+<5830> <5831> <B3F7>
+<5832> <5832> <D14B>
+<5833> <5833> <D8AB>
+<5834> <5834> <B3F5>
+<5835> <5835> <B0F4>
+<5836> <5836> <D8AD>
+<5837> <5837> <D87E>
+<5838> <5838> <D8B0>
+<5839> <5839> <D8AF>
+<583B> <583B> <D8B3>
+<583D> <583D> <DCEF>
+<583F> <583F> <D8AC>
+<5848> <5848> <D8A7>
+<5849> <5849> <DCE7>
+<584A> <584A> <B6F4>
+<584B> <584B> <B6F7>
+<584C> <584C> <B6F2>
+<584D> <584D> <DCE6>
+<584E> <584E> <DCEA>
+<584F> <584F> <DCE5>
+<5851> <5851> <B6EC>
+<5852> <5852> <B6F6>
+<5853> <5853> <DCE2>
+<5854> <5854> <B6F0>
+<5855> <5855> <DCE9>
+<5857> <5857> <B6EE>
+<5858> <5858> <B6ED>
+<5859> <5859> <DCEC>
+<585A> <585A> <B6EF>
+<585B> <585B> <DCEE>
+<585D> <585D> <DCEB>
+<585E> <585E> <B6EB>
+<5862> <5862> <B6F5>
+<5863> <5863> <DCF0>
+<5864> <5864> <DCE4>
+<5865> <5865> <DCED>
+<5868> <5868> <DCE3>
+<586B> <586B> <B6F1>
+<586D> <586D> <B6F3>
+<586F> <586F> <DCE8>
+<5871> <5871> <DCF1>
+<5874> <5874> <E15D>
+<5875> <5875> <B9D0>
+<5876> <5876> <E163>
+<5879> <5879> <B9D5>
+<587A> <587A> <E15F>
+<587B> <587B> <E166>
+<587C> <587C> <E157>
+<587D> <587D> <B9D7>
+<587E> <587E> <B9D1>
+<587F> <587F> <E15C>
+<5880> <5880> <BC55>
+<5881> <5881> <E15B>
+<5882> <5882> <E164>
+<5883> <5883> <B9D2>
+<5885> <5885> <B9D6>
+<5886> <5886> <E15A>
+<5887> <5887> <E160>
+<5888> <5888> <E165>
+<5889> <5889> <E156>
+<588A> <588A> <B9D4>
+<588B> <588B> <E15E>
+<588E> <588E> <E162>
+<588F> <588F> <E168>
+<5890> <5890> <E158>
+<5891> <5891> <E161>
+<5893> <5893> <B9D3>
+<5894> <5894> <E167>
+<5898> <5898> <E159>
+<589C> <589C> <BC59>
+<589D> <589D> <E54B>
+endbfrange
+
+100 beginbfrange
+<589E> <589E> <BC57>
+<589F> <589F> <BC56>
+<58A0> <58A0> <E54D>
+<58A1> <58A1> <E552>
+<58A3> <58A3> <E54E>
+<58A5> <58A5> <E551>
+<58A6> <58A6> <BC5C>
+<58A8> <58A8> <BEA5>
+<58A9> <58A9> <BC5B>
+<58AB> <58AB> <E54A>
+<58AC> <58AC> <E550>
+<58AE> <58AE> <BC5A>
+<58AF> <58AF> <E54F>
+<58B1> <58B1> <E54C>
+<58B3> <58B3> <BC58>
+<58BA> <58BA> <E94D>
+<58BC> <58BC> <E94F>
+<58BD> <58BD> <E94A>
+<58BE> <58BE> <BEC1>
+<58BF> <58BF> <E94C>
+<58C1> <58C1> <BEC0>
+<58C2> <58C2> <E94E>
+<58C5> <58C5> <BEC3>
+<58C6> <58C6> <E950>
+<58C7> <58C7> <BEC2>
+<58C8> <58C8> <E949>
+<58C9> <58C9> <E94B>
+<58CE> <58CE> <C0A5>
+<58CF> <58CF> <ECCC>
+<58D1> <58D1> <C0A4>
+<58D2> <58D2> <ECCD>
+<58D3> <58D3> <C0A3>
+<58D4> <58D4> <ECCB>
+<58D5> <58D5> <C0A2>
+<58D6> <58D6> <ECCA>
+<58D8> <58D8> <C253>
+<58D9> <58D9> <C252>
+<58DA> <58DA> <F1F6>
+<58DB> <58DB> <F1F8>
+<58DD> <58DD> <F1F7>
+<58DE> <58DF> <C361>
+<58E2> <58E2> <C363>
+<58E3> <58E3> <F442>
+<58E4> <58E4> <C45B>
+<58E7> <58E7> <F7D3>
+<58E8> <58E8> <F7D2>
+<58E9> <58E9> <C5F2>
+<58EB> <58EB> <A468>
+<58EC> <58EC> <A4D0>
+<58EF> <58EF> <A7A7>
+<58F4> <58F4> <CE5F>
+<58F9> <58FA> <B3FC>
+<58FC> <58FC> <DCF2>
+<58FD> <58FD> <B9D8>
+<58FE> <58FE> <E169>
+<58FF> <58FF> <E553>
+<5903> <5903> <C95A>
+<5906> <5906> <CAB0>
+<590C> <590C> <CC42>
+<590D> <590D> <CE60>
+<590E> <590E> <D159>
+<590F> <590F> <AE4C>
+<5912> <5912> <F1F9>
+<5914> <5914> <C4DC>
+<5915> <5915> <A469>
+<5916> <5916> <A57E>
+<5917> <5917> <C970>
+<5919> <591A> <A667>
+<591C> <591C> <A95D>
+<5920> <5920> <B0F7>
+<5922> <5922> <B9DA>
+<5924> <5924> <B9DB>
+<5925> <5925> <B9D9>
+<5927> <5927> <A46A>
+<5929> <5929> <A4D1>
+<592A> <592A> <A4D3>
+<592B> <592B> <A4D2>
+<592C> <592C> <C95B>
+<592D> <592D> <A4D4>
+<592E> <592E> <A5A1>
+<592F> <592F> <C971>
+<5931> <5931> <A5A2>
+<5937> <5938> <A669>
+<593C> <593C> <C9CB>
+<593E> <593E> <A7A8>
+<5940> <5940> <CAB1>
+<5944> <5944> <A961>
+<5945> <5945> <CC43>
+<5947> <5948> <A95F>
+<5949> <5949> <A95E>
+<594A> <594A> <D15A>
+<594E> <594E> <ABB6>
+<594F> <594F> <ABB5>
+<5950> <5950> <ABB7>
+<5951> <5951> <ABB4>
+<5953> <5953> <CE61>
+<5954> <5954> <A962>
+<5955> <5955> <ABB3>
+<5957> <5958> <AE4D>
+<595A> <595A> <AE4F>
+endbfrange
+
+100 beginbfrange
+<595C> <595C> <D4CD>
+<5960> <5960> <B3FE>
+<5961> <5961> <D8B4>
+<5962> <5962> <B0F8>
+<5967> <5967> <B6F8>
+<5969> <5969> <B9DD>
+<596A> <596A> <B9DC>
+<596B> <596B> <E16A>
+<596D> <596D> <BC5D>
+<596E> <596E> <BEC4>
+<5970> <5970> <EFC0>
+<5971> <5971> <F6DA>
+<5972> <5972> <F7D4>
+<5973> <5973> <A46B>
+<5974> <5974> <A5A3>
+<5976> <5976> <A5A4>
+<5977> <5977> <C9D1>
+<5978> <5978> <A66C>
+<5979> <5979> <A66F>
+<597B> <597B> <C9CF>
+<597C> <597C> <C9CD>
+<597D> <597D> <A66E>
+<597E> <597E> <C9D0>
+<597F> <597F> <C9D2>
+<5980> <5980> <C9CC>
+<5981> <5981> <A671>
+<5982> <5982> <A670>
+<5983> <5983> <A66D>
+<5984> <5984> <A66B>
+<5985> <5985> <C9CE>
+<598A> <598A> <A7B3>
+<598D> <598D> <A7B0>
+<598E> <598E> <CAB6>
+<598F> <598F> <CAB9>
+<5990> <5990> <CAB8>
+<5992> <5992> <A7AA>
+<5993> <5993> <A7B2>
+<5996> <5996> <A7AF>
+<5997> <5997> <CAB5>
+<5998> <5998> <CAB3>
+<5999> <5999> <A7AE>
+<599D> <599D> <A7A9>
+<599E> <599E> <A7AC>
+<59A0> <59A0> <CAB4>
+<59A1> <59A1> <CABB>
+<59A2> <59A2> <CAB7>
+<59A3> <59A3> <A7AD>
+<59A4> <59A4> <A7B1>
+<59A5> <59A5> <A7B4>
+<59A6> <59A6> <CAB2>
+<59A7> <59A7> <CABA>
+<59A8> <59A8> <A7AB>
+<59AE> <59AE> <A967>
+<59AF> <59AF> <A96F>
+<59B1> <59B1> <CC4F>
+<59B2> <59B2> <CC48>
+<59B3> <59B3> <A970>
+<59B4> <59B4> <CC53>
+<59B5> <59B5> <CC44>
+<59B6> <59B6> <CC4B>
+<59B9> <59B9> <A966>
+<59BA> <59BA> <CC45>
+<59BB> <59BB> <A964>
+<59BC> <59BC> <CC4C>
+<59BD> <59BD> <CC50>
+<59BE> <59BE> <A963>
+<59C0> <59C0> <CC51>
+<59C1> <59C1> <CC4A>
+<59C3> <59C3> <CC4D>
+<59C5> <59C5> <A972>
+<59C6> <59C6> <A969>
+<59C7> <59C7> <CC54>
+<59C8> <59C8> <CC52>
+<59CA> <59CA> <A96E>
+<59CB> <59CB> <A96C>
+<59CC> <59CC> <CC49>
+<59CD> <59CD> <A96B>
+<59CE> <59CE> <CC47>
+<59CF> <59CF> <CC46>
+<59D0> <59D0> <A96A>
+<59D1> <59D1> <A968>
+<59D2> <59D2> <A971>
+<59D3> <59D3> <A96D>
+<59D4> <59D4> <A965>
+<59D6> <59D6> <CC4E>
+<59D8> <59D8> <ABB9>
+<59DA> <59DA> <ABC0>
+<59DB> <59DB> <CE6F>
+<59DC> <59DC> <ABB8>
+<59DD> <59DD> <CE67>
+<59DE> <59DE> <CE63>
+<59E0> <59E0> <CE73>
+<59E1> <59E1> <CE62>
+<59E3> <59E3> <ABBB>
+<59E4> <59E4> <CE6C>
+<59E5> <59E5> <ABBE>
+<59E6> <59E6> <ABC1>
+<59E8> <59E8> <ABBC>
+<59E9> <59E9> <CE70>
+<59EA> <59EA> <ABBF>
+endbfrange
+
+100 beginbfrange
+<59EC> <59EC> <AE56>
+<59ED> <59ED> <CE76>
+<59EE> <59EE> <CE64>
+<59F1> <59F1> <CE66>
+<59F2> <59F2> <CE6D>
+<59F3> <59F3> <CE71>
+<59F4> <59F4> <CE75>
+<59F5> <59F5> <CE72>
+<59F6> <59F6> <CE6B>
+<59F7> <59F7> <CE6E>
+<59FA> <59FA> <CE68>
+<59FB> <59FB> <ABC3>
+<59FC> <59FC> <CE6A>
+<59FD> <59FD> <CE69>
+<59FE> <59FE> <CE74>
+<59FF> <59FF> <ABBA>
+<5A00> <5A00> <CE65>
+<5A01> <5A01> <ABC2>
+<5A03> <5A03> <ABBD>
+<5A09> <5A09> <AE5C>
+<5A0A> <5A0A> <D162>
+<5A0C> <5A0C> <AE5B>
+<5A0F> <5A0F> <D160>
+<5A11> <5A11> <AE50>
+<5A13> <5A13> <AE55>
+<5A15> <5A15> <D15F>
+<5A16> <5A16> <D15C>
+<5A17> <5A17> <D161>
+<5A18> <5A18> <AE51>
+<5A19> <5A19> <D15B>
+<5A1B> <5A1B> <AE54>
+<5A1C> <5A1C> <AE52>
+<5A1E> <5A1E> <D163>
+<5A1F> <5A1F> <AE53>
+<5A20> <5A20> <AE57>
+<5A23> <5A23> <AE58>
+<5A25> <5A25> <AE5A>
+<5A29> <5A29> <AE59>
+<5A2D> <5A2E> <D15D>
+<5A33> <5A33> <D164>
+<5A35> <5A35> <D4D4>
+<5A36> <5A36> <B0F9>
+<5A37> <5A37> <D8C2>
+<5A38> <5A38> <D4D3>
+<5A39> <5A39> <D4E6>
+<5A3C> <5A3C> <B140>
+<5A3E> <5A3E> <D4E4>
+<5A40> <5A40> <B0FE>
+<5A41> <5A41> <B0FA>
+<5A42> <5A42> <D4ED>
+<5A43> <5A43> <D4DD>
+<5A44> <5A44> <D4E0>
+<5A46> <5A46> <B143>
+<5A47> <5A47> <D4EA>
+<5A48> <5A48> <D4E2>
+<5A49> <5A49> <B0FB>
+<5A4A> <5A4A> <B144>
+<5A4C> <5A4C> <D4E7>
+<5A4D> <5A4D> <D4E5>
+<5A50> <5A50> <D4D6>
+<5A51> <5A51> <D4EB>
+<5A52> <5A52> <D4DF>
+<5A53> <5A53> <D4DA>
+<5A55> <5A55> <D4D0>
+<5A56> <5A56> <D4EC>
+<5A57> <5A57> <D4DC>
+<5A58> <5A58> <D4CF>
+<5A5A> <5A5A> <B142>
+<5A5B> <5A5B> <D4E1>
+<5A5C> <5A5C> <D4EE>
+<5A5D> <5A5D> <D4DE>
+<5A5E> <5A5E> <D4D2>
+<5A5F> <5A5F> <D4D7>
+<5A60> <5A60> <D4CE>
+<5A62> <5A62> <B141>
+<5A64> <5A64> <D4DB>
+<5A65> <5A65> <D4D8>
+<5A66> <5A66> <B0FC>
+<5A67> <5A67> <D4D1>
+<5A69> <5A69> <D4E9>
+<5A6A> <5A6A> <B0FD>
+<5A6C> <5A6C> <D4D9>
+<5A6D> <5A6D> <D4D5>
+<5A70> <5A70> <D4E8>
+<5A77> <5A77> <B440>
+<5A78> <5A78> <D8BB>
+<5A7A> <5A7A> <D8B8>
+<5A7B> <5A7B> <D8C9>
+<5A7C> <5A7C> <D8BD>
+<5A7D> <5A7D> <D8CA>
+<5A7F> <5A7F> <B442>
+<5A83> <5A83> <D8C6>
+<5A84> <5A84> <D8C3>
+<5A8A> <5A8A> <D8C4>
+<5A8B> <5A8B> <D8C7>
+<5A8C> <5A8C> <D8CB>
+<5A8E> <5A8E> <D4E3>
+<5A8F> <5A8F> <D8CD>
+<5A90> <5A90> <DD47>
+<5A92> <5A92> <B443>
+endbfrange
+
+100 beginbfrange
+<5A93> <5A93> <D8CE>
+<5A94> <5A94> <D8B6>
+<5A95> <5A95> <D8C0>
+<5A97> <5A97> <D8C5>
+<5A9A> <5A9A> <B441>
+<5A9B> <5A9B> <B444>
+<5A9C> <5A9C> <D8CC>
+<5A9D> <5A9D> <D8CF>
+<5A9E> <5A9E> <D8BA>
+<5A9F> <5A9F> <D8B7>
+<5AA2> <5AA2> <D8B9>
+<5AA5> <5AA5> <D8BE>
+<5AA6> <5AA6> <D8BC>
+<5AA7> <5AA7> <B445>
+<5AA9> <5AA9> <D8C8>
+<5AAC> <5AAC> <D8BF>
+<5AAE> <5AAE> <D8C1>
+<5AAF> <5AAF> <D8B5>
+<5AB0> <5AB0> <DCFA>
+<5AB1> <5AB1> <DCF8>
+<5AB2> <5AB2> <B742>
+<5AB3> <5AB3> <B740>
+<5AB4> <5AB4> <DD43>
+<5AB5> <5AB5> <DCF9>
+<5AB6> <5AB6> <DD44>
+<5AB7> <5AB7> <DD40>
+<5AB8> <5AB8> <DCF7>
+<5AB9> <5AB9> <DD46>
+<5ABA> <5ABA> <DCF6>
+<5ABB> <5ABB> <DCFD>
+<5ABC> <5ABC> <B6FE>
+<5ABD> <5ABD> <B6FD>
+<5ABE> <5ABE> <B6FC>
+<5ABF> <5ABF> <DCFB>
+<5AC0> <5AC0> <DD41>
+<5AC1> <5AC1> <B6F9>
+<5AC2> <5AC2> <B741>
+<5AC4> <5AC4> <DCF4>
+<5AC6> <5AC6> <DCFE>
+<5AC7> <5AC7> <DCF3>
+<5AC8> <5AC8> <DCFC>
+<5AC9> <5AC9> <B6FA>
+<5ACA> <5ACA> <DD42>
+<5ACB> <5ACB> <DCF5>
+<5ACC> <5ACC> <B6FB>
+<5ACD> <5ACD> <DD45>
+<5AD5> <5AD5> <E16E>
+<5AD6> <5AD6> <B9E2>
+<5AD7> <5AD7> <B9E1>
+<5AD8> <5AD8> <B9E3>
+<5AD9> <5AD9> <E17A>
+<5ADA> <5ADA> <E170>
+<5ADB> <5ADB> <E176>
+<5ADC> <5ADC> <E16B>
+<5ADD> <5ADD> <E179>
+<5ADE> <5ADE> <E178>
+<5ADF> <5ADF> <E17C>
+<5AE0> <5AE0> <E175>
+<5AE1> <5AE1> <B9DE>
+<5AE2> <5AE2> <E174>
+<5AE3> <5AE3> <B9E4>
+<5AE5> <5AE5> <E16D>
+<5AE6> <5AE6> <B9DF>
+<5AE8> <5AE8> <E17B>
+<5AE9> <5AE9> <B9E0>
+<5AEA> <5AEA> <E16F>
+<5AEB> <5AEB> <E172>
+<5AEC> <5AEC> <E177>
+<5AED> <5AED> <E171>
+<5AEE> <5AEE> <E16C>
+<5AF3> <5AF3> <E173>
+<5AF4> <5AF4> <E555>
+<5AF5> <5AF5> <BC61>
+<5AF6> <5AF6> <E558>
+<5AF7> <5AF7> <E557>
+<5AF8> <5AF8> <E55A>
+<5AF9> <5AF9> <E55C>
+<5AFB> <5AFB> <BC5F>
+<5AFD> <5AFD> <E556>
+<5AFF> <5AFF> <E554>
+<5B01> <5B01> <E55D>
+<5B02> <5B02> <E55B>
+<5B03> <5B03> <E559>
+<5B05> <5B05> <E55F>
+<5B07> <5B07> <E55E>
+<5B08> <5B08> <BC63>
+<5B09> <5B09> <BC5E>
+<5B0B> <5B0B> <BC60>
+<5B0C> <5B0C> <BC62>
+<5B0F> <5B0F> <E560>
+<5B10> <5B10> <E957>
+<5B13> <5B13> <E956>
+<5B14> <5B14> <E955>
+<5B16> <5B16> <E958>
+<5B17> <5B17> <E951>
+<5B19> <5B19> <E952>
+<5B1A> <5B1A> <E95A>
+<5B1B> <5B1B> <E953>
+<5B1D> <5B1D> <BEC5>
+<5B1E> <5B1E> <E95C>
+endbfrange
+
+100 beginbfrange
+<5B20> <5B20> <E95B>
+<5B21> <5B21> <E954>
+<5B23> <5B23> <ECD1>
+<5B24> <5B24> <C0A8>
+<5B25> <5B25> <ECCF>
+<5B26> <5B26> <ECD4>
+<5B27> <5B27> <ECD3>
+<5B28> <5B28> <E959>
+<5B2A> <5B2A> <C0A7>
+<5B2C> <5B2C> <ECD2>
+<5B2D> <5B2D> <ECCE>
+<5B2E> <5B2E> <ECD6>
+<5B2F> <5B2F> <ECD5>
+<5B30> <5B30> <C0A6>
+<5B32> <5B32> <ECD0>
+<5B34> <5B34> <BEC6>
+<5B38> <5B38> <C254>
+<5B3C> <5B3C> <EFC1>
+<5B3D> <5B3F> <F1FA>
+<5B40> <5B40> <C45C>
+<5B43> <5B43> <C45D>
+<5B45> <5B45> <F443>
+<5B47> <5B47> <F5C8>
+<5B48> <5B48> <F5C7>
+<5B4B> <5B4C> <F6DB>
+<5B4D> <5B4D> <F7D5>
+<5B4E> <5B4E> <F8A7>
+<5B50> <5B51> <A46C>
+<5B53> <5B53> <A46E>
+<5B54> <5B54> <A4D5>
+<5B55> <5B55> <A5A5>
+<5B56> <5B56> <C9D3>
+<5B57> <5B58> <A672>
+<5B5A> <5B5B> <A7B7>
+<5B5C> <5B5C> <A7B6>
+<5B5D> <5B5D> <A7B5>
+<5B5F> <5B5F> <A973>
+<5B62> <5B62> <CC55>
+<5B63> <5B63> <A975>
+<5B64> <5B64> <A974>
+<5B65> <5B65> <CC56>
+<5B69> <5B69> <ABC4>
+<5B6B> <5B6B> <AE5D>
+<5B6C> <5B6C> <D165>
+<5B6E> <5B6E> <D4F0>
+<5B70> <5B70> <B145>
+<5B71> <5B71> <B447>
+<5B72> <5B72> <D4EF>
+<5B73> <5B73> <B446>
+<5B75> <5B75> <B9E5>
+<5B77> <5B77> <E17D>
+<5B78> <5B78> <BEC7>
+<5B7A> <5B7A> <C0A9>
+<5B7B> <5B7B> <ECD7>
+<5B7D> <5B7D> <C45E>
+<5B7F> <5B7F> <C570>
+<5B81> <5B81> <C972>
+<5B83> <5B83> <A5A6>
+<5B84> <5B84> <C973>
+<5B85> <5B85> <A676>
+<5B87> <5B88> <A674>
+<5B89> <5B89> <A677>
+<5B8B> <5B8B> <A7BA>
+<5B8C> <5B8C> <A7B9>
+<5B8E> <5B8E> <CABC>
+<5B8F> <5B8F> <A7BB>
+<5B92> <5B92> <CABD>
+<5B93> <5B93> <CC57>
+<5B95> <5B95> <CC58>
+<5B97> <5B97> <A976>
+<5B98> <5B98> <A978>
+<5B99> <5B99> <A97A>
+<5B9A> <5B9A> <A977>
+<5B9B> <5B9B> <A97B>
+<5B9C> <5B9C> <A979>
+<5BA2> <5BA2> <ABC8>
+<5BA3> <5BA3> <ABC5>
+<5BA4> <5BA4> <ABC7>
+<5BA5> <5BA5> <ABC9>
+<5BA6> <5BA6> <ABC6>
+<5BA7> <5BA7> <D166>
+<5BA8> <5BA8> <CE77>
+<5BAC> <5BAC> <D168>
+<5BAD> <5BAD> <D167>
+<5BAE> <5BAE> <AE63>
+<5BB0> <5BB0> <AE5F>
+<5BB3> <5BB3> <AE60>
+<5BB4> <5BB4> <AE62>
+<5BB5> <5BB5> <AE64>
+<5BB6> <5BB6> <AE61>
+<5BB8> <5BB8> <AE66>
+<5BB9> <5BB9> <AE65>
+<5BBF> <5BBF> <B14A>
+<5BC0> <5BC0> <D4F2>
+<5BC1> <5BC1> <D4F1>
+<5BC2> <5BC2> <B149>
+<5BC4> <5BC4> <B148>
+<5BC5> <5BC5> <B147>
+<5BC6> <5BC6> <B14B>
+<5BC7> <5BC7> <B146>
+endbfrange
+
+100 beginbfrange
+<5BCA> <5BCA> <D8D5>
+<5BCB> <5BCB> <D8D2>
+<5BCC> <5BCC> <B449>
+<5BCD> <5BCD> <D8D1>
+<5BCE> <5BCE> <D8D6>
+<5BD0> <5BD0> <B44B>
+<5BD1> <5BD1> <D8D4>
+<5BD2> <5BD2> <B448>
+<5BD3> <5BD3> <B44A>
+<5BD4> <5BD4> <D8D3>
+<5BD6> <5BD6> <DD48>
+<5BD8> <5BD9> <DD49>
+<5BDE> <5BDE> <B9E6>
+<5BDF> <5BDF> <B9EE>
+<5BE0> <5BE0> <E17E>
+<5BE1> <5BE1> <B9E8>
+<5BE2> <5BE2> <B9EC>
+<5BE3> <5BE3> <E1A1>
+<5BE4> <5BE4> <B9ED>
+<5BE5> <5BE6> <B9E9>
+<5BE7> <5BE7> <B9E7>
+<5BE8> <5BE8> <B9EB>
+<5BE9> <5BE9> <BC66>
+<5BEA> <5BEA> <D8D0>
+<5BEB> <5BEB> <BC67>
+<5BEC> <5BEC> <BC65>
+<5BEE> <5BEE> <BC64>
+<5BEF> <5BEF> <E95D>
+<5BF0> <5BF0> <BEC8>
+<5BF1> <5BF2> <ECD8>
+<5BF5> <5BF5> <C364>
+<5BF6> <5BF6> <C45F>
+<5BF8> <5BF8> <A46F>
+<5BFA> <5BFA> <A678>
+<5C01> <5C01> <ABCA>
+<5C03> <5C03> <D169>
+<5C04> <5C04> <AE67>
+<5C07> <5C07> <B14E>
+<5C08> <5C08> <B14D>
+<5C09> <5C09> <B14C>
+<5C0A> <5C0B> <B44C>
+<5C0C> <5C0C> <D8D7>
+<5C0D> <5C0D> <B9EF>
+<5C0E> <5C0E> <BEC9>
+<5C0F> <5C0F> <A470>
+<5C10> <5C10> <C95C>
+<5C11> <5C11> <A4D6>
+<5C12> <5C12> <C974>
+<5C15> <5C15> <C9D4>
+<5C16> <5C16> <A679>
+<5C1A> <5C1A> <A97C>
+<5C1F> <5C1F> <DD4B>
+<5C22> <5C22> <A471>
+<5C24> <5C24> <A4D7>
+<5C25> <5C25> <C9D5>
+<5C28> <5C28> <CABE>
+<5C2A> <5C2A> <CABF>
+<5C2C> <5C2C> <A7BC>
+<5C30> <5C30> <D8D8>
+<5C31> <5C31> <B44E>
+<5C33> <5C33> <DD4C>
+<5C37> <5C37> <C0AA>
+<5C38> <5C38> <A472>
+<5C39> <5C39> <A4A8>
+<5C3A> <5C3A> <A4D8>
+<5C3B> <5C3B> <C975>
+<5C3C> <5C3C> <A5A7>
+<5C3E> <5C3E> <A7C0>
+<5C3F> <5C3F> <A7BF>
+<5C40> <5C41> <A7BD>
+<5C44> <5C44> <CC59>
+<5C45> <5C45> <A97E>
+<5C46> <5C46> <A9A1>
+<5C47> <5C47> <CC5A>
+<5C48> <5C48> <A97D>
+<5C4B> <5C4B> <ABCE>
+<5C4C> <5C4C> <CE78>
+<5C4D> <5C4D> <ABCD>
+<5C4E> <5C4F> <ABCB>
+<5C50> <5C50> <AE6A>
+<5C51> <5C51> <AE68>
+<5C54> <5C54> <D16B>
+<5C55> <5C55> <AE69>
+<5C56> <5C56> <D16A>
+<5C58> <5C58> <AE5E>
+<5C59> <5C59> <D4F3>
+<5C5C> <5C5D> <B150>
+<5C60> <5C60> <B14F>
+<5C62> <5C62> <B9F0>
+<5C63> <5C63> <E1A2>
+<5C64> <5C65> <BC68>
+<5C67> <5C67> <E561>
+<5C68> <5C68> <C0AB>
+<5C69> <5C6A> <EFC2>
+<5C6C> <5C6C> <C4DD>
+<5C6D> <5C6D> <F8A8>
+<5C6E> <5C6E> <C94B>
+<5C6F> <5C6F> <A4D9>
+<5C71> <5C71> <A473>
+<5C73> <5C73> <C977>
+endbfrange
+
+100 beginbfrange
+<5C74> <5C74> <C976>
+<5C79> <5C79> <A67A>
+<5C7A> <5C7B> <C9D7>
+<5C7C> <5C7C> <C9D6>
+<5C7E> <5C7E> <C9D9>
+<5C86> <5C86> <CAC7>
+<5C88> <5C88> <CAC2>
+<5C89> <5C89> <CAC4>
+<5C8A> <5C8A> <CAC6>
+<5C8B> <5C8B> <CAC3>
+<5C8C> <5C8C> <A7C4>
+<5C8D> <5C8D> <CAC0>
+<5C8F> <5C8F> <CAC1>
+<5C90> <5C91> <A7C1>
+<5C92> <5C92> <CAC5>
+<5C93> <5C93> <CAC8>
+<5C94> <5C94> <A7C3>
+<5C95> <5C95> <CAC9>
+<5C9D> <5C9D> <CC68>
+<5C9F> <5C9F> <CC62>
+<5CA0> <5CA0> <CC5D>
+<5CA1> <5CA1> <A9A3>
+<5CA2> <5CA2> <CC65>
+<5CA3> <5CA3> <CC63>
+<5CA4> <5CA4> <CC5C>
+<5CA5> <5CA5> <CC69>
+<5CA6> <5CA6> <CC6C>
+<5CA7> <5CA7> <CC67>
+<5CA8> <5CA8> <CC60>
+<5CA9> <5CA9> <A9A5>
+<5CAA> <5CAA> <CC66>
+<5CAB> <5CAB> <A9A6>
+<5CAC> <5CAC> <CC61>
+<5CAD> <5CAD> <CC64>
+<5CAE> <5CAE> <CC5B>
+<5CAF> <5CAF> <CC5F>
+<5CB0> <5CB0> <CC6B>
+<5CB1> <5CB1> <A9A7>
+<5CB3> <5CB3> <A9A8>
+<5CB5> <5CB5> <CC5E>
+<5CB6> <5CB6> <CC6A>
+<5CB7> <5CB7> <A9A2>
+<5CB8> <5CB8> <A9A4>
+<5CC6> <5CC6> <CEAB>
+<5CC7> <5CC7> <CEA4>
+<5CC8> <5CC8> <CEAA>
+<5CC9> <5CC9> <CEA3>
+<5CCA> <5CCA> <CEA5>
+<5CCB> <5CCB> <CE7D>
+<5CCC> <5CCC> <CE7B>
+<5CCE> <5CCE> <CEAC>
+<5CCF> <5CCF> <CEA9>
+<5CD0> <5CD0> <CE79>
+<5CD2> <5CD2> <ABD0>
+<5CD3> <5CD4> <CEA7>
+<5CD6> <5CD6> <CEA6>
+<5CD7> <5CD7> <CE7C>
+<5CD8> <5CD8> <CE7A>
+<5CD9> <5CD9> <ABCF>
+<5CDA> <5CDA> <CEA2>
+<5CDB> <5CDB> <CE7E>
+<5CDE> <5CDE> <CEA1>
+<5CDF> <5CDF> <CEAD>
+<5CE8> <5CE8> <AE6F>
+<5CEA> <5CEA> <AE6E>
+<5CEC> <5CEC> <D16C>
+<5CED> <5CED> <AE6B>
+<5CEE> <5CEE> <D16E>
+<5CF0> <5CF0> <AE70>
+<5CF1> <5CF1> <D16F>
+<5CF4> <5CF4> <AE73>
+<5CF6> <5CF6> <AE71>
+<5CF7> <5CF7> <D170>
+<5CF8> <5CF8> <CEAE>
+<5CF9> <5CF9> <D172>
+<5CFB> <5CFB> <AE6D>
+<5CFD> <5CFD> <AE6C>
+<5CFF> <5CFF> <D16D>
+<5D00> <5D00> <D171>
+<5D01> <5D01> <AE72>
+<5D06> <5D06> <B153>
+<5D07> <5D07> <B152>
+<5D0B> <5D0B> <D4F5>
+<5D0C> <5D0C> <D4F9>
+<5D0D> <5D0D> <D4FB>
+<5D0E> <5D0E> <B154>
+<5D0F> <5D0F> <D4FE>
+<5D11> <5D11> <B158>
+<5D12> <5D12> <D541>
+<5D14> <5D14> <B15A>
+<5D16> <5D16> <B156>
+<5D17> <5D17> <B15E>
+<5D19> <5D19> <B15B>
+<5D1A> <5D1A> <D4F7>
+<5D1B> <5D1B> <B155>
+<5D1D> <5D1D> <D4F6>
+<5D1E> <5D1E> <D4F4>
+<5D1F> <5D1F> <D543>
+<5D20> <5D20> <D4F8>
+<5D22> <5D22> <B157>
+endbfrange
+
+100 beginbfrange
+<5D23> <5D23> <D542>
+<5D24> <5D24> <B15C>
+<5D25> <5D25> <D4FD>
+<5D26> <5D26> <D4FC>
+<5D27> <5D27> <B15D>
+<5D28> <5D28> <D4FA>
+<5D29> <5D29> <B159>
+<5D2E> <5D2E> <D544>
+<5D30> <5D30> <D540>
+<5D31> <5D31> <D8E7>
+<5D32> <5D32> <D8EE>
+<5D33> <5D33> <D8E3>
+<5D34> <5D34> <B451>
+<5D35> <5D35> <D8DF>
+<5D36> <5D36> <D8EF>
+<5D37> <5D37> <D8D9>
+<5D38> <5D38> <D8EC>
+<5D39> <5D39> <D8EA>
+<5D3A> <5D3A> <D8E4>
+<5D3C> <5D3C> <D8ED>
+<5D3D> <5D3D> <D8E6>
+<5D3F> <5D3F> <D8DE>
+<5D40> <5D40> <D8F0>
+<5D41> <5D41> <D8DC>
+<5D42> <5D42> <D8E9>
+<5D43> <5D43> <D8DA>
+<5D45> <5D45> <D8F1>
+<5D47> <5D47> <B452>
+<5D49> <5D49> <D8EB>
+<5D4A> <5D4A> <DD4F>
+<5D4B> <5D4B> <D8DD>
+<5D4C> <5D4C> <B44F>
+<5D4E> <5D4E> <D8E1>
+<5D50> <5D50> <B450>
+<5D51> <5D51> <D8E0>
+<5D52> <5D52> <D8E5>
+<5D55> <5D55> <D8E2>
+<5D59> <5D59> <D8E8>
+<5D5E> <5D5E> <DD53>
+<5D62> <5D62> <DD56>
+<5D63> <5D63> <DD4E>
+<5D65> <5D65> <DD50>
+<5D67> <5D67> <DD55>
+<5D68> <5D68> <DD54>
+<5D69> <5D69> <B743>
+<5D6B> <5D6B> <D8DB>
+<5D6C> <5D6C> <DD52>
+<5D6F> <5D6F> <B744>
+<5D71> <5D71> <DD4D>
+<5D72> <5D72> <DD51>
+<5D77> <5D77> <E1A9>
+<5D79> <5D79> <E1B0>
+<5D7A> <5D7A> <E1A7>
+<5D7C> <5D7C> <E1AE>
+<5D7D> <5D7D> <E1A5>
+<5D7E> <5D7E> <E1AD>
+<5D7F> <5D7F> <E1B1>
+<5D80> <5D80> <E1A4>
+<5D81> <5D81> <E1A8>
+<5D82> <5D82> <E1A3>
+<5D84> <5D84> <B9F1>
+<5D86> <5D86> <E1A6>
+<5D87> <5D87> <B9F2>
+<5D88> <5D88> <E1AC>
+<5D89> <5D89> <E1AB>
+<5D8A> <5D8A> <E1AA>
+<5D8D> <5D8D> <E1AF>
+<5D92> <5D92> <E565>
+<5D93> <5D93> <E567>
+<5D94> <5D94> <BC6B>
+<5D95> <5D95> <E568>
+<5D97> <5D97> <E563>
+<5D99> <5D99> <E562>
+<5D9A> <5D9A> <E56C>
+<5D9C> <5D9C> <E56A>
+<5D9D> <5D9D> <BC6A>
+<5D9E> <5D9E> <E56D>
+<5D9F> <5D9F> <E564>
+<5DA0> <5DA0> <E569>
+<5DA1> <5DA1> <E56B>
+<5DA2> <5DA2> <E566>
+<5DA7> <5DA7> <E961>
+<5DA8> <5DA8> <E966>
+<5DA9> <5DA9> <E960>
+<5DAA> <5DAA> <E965>
+<5DAC> <5DAC> <E95E>
+<5DAD> <5DAD> <E968>
+<5DAE> <5DAE> <E964>
+<5DAF> <5DAF> <E969>
+<5DB0> <5DB0> <E963>
+<5DB1> <5DB1> <E95F>
+<5DB2> <5DB2> <E967>
+<5DB4> <5DB4> <E96A>
+<5DB5> <5DB5> <E962>
+<5DB7> <5DB7> <ECDA>
+<5DB8> <5DB8> <C0AF>
+<5DBA> <5DBA> <C0AD>
+<5DBC> <5DBC> <C0AC>
+<5DBD> <5DBD> <C0AE>
+<5DC0> <5DC0> <EFC4>
+endbfrange
+
+100 beginbfrange
+<5DC2> <5DC2> <F172>
+<5DC3> <5DC3> <F1FD>
+<5DC6> <5DC7> <F444>
+<5DC9> <5DC9> <C460>
+<5DCB> <5DCB> <F5C9>
+<5DCD> <5DCD> <C4DE>
+<5DCF> <5DCF> <F5CA>
+<5DD1> <5DD1> <F6DE>
+<5DD2> <5DD2> <C572>
+<5DD4> <5DD4> <C571>
+<5DD5> <5DD5> <F6DD>
+<5DD6> <5DD6> <C5C9>
+<5DD8> <5DD8> <F7D6>
+<5DDD> <5DDD> <A474>
+<5DDE> <5DDE> <A67B>
+<5DDF> <5DDF> <C9DA>
+<5DE0> <5DE0> <CACA>
+<5DE1> <5DE1> <A8B5>
+<5DE2> <5DE2> <B15F>
+<5DE5> <5DE5> <A475>
+<5DE6> <5DE6> <A5AA>
+<5DE7> <5DE7> <A5A9>
+<5DE8> <5DE8> <A5A8>
+<5DEB> <5DEB> <A7C5>
+<5DEE> <5DEE> <AE74>
+<5DF0> <5DF0> <DD57>
+<5DF1> <5DF3> <A476>
+<5DF4> <5DF4> <A4DA>
+<5DF7> <5DF7> <ABD1>
+<5DF9> <5DF9> <CEAF>
+<5DFD> <5DFD> <B453>
+<5DFE> <5DFE> <A479>
+<5DFF> <5DFF> <C95D>
+<5E02> <5E03> <A5AB>
+<5E04> <5E04> <C978>
+<5E06> <5E06> <A67C>
+<5E0A> <5E0A> <CACB>
+<5E0C> <5E0C> <A7C6>
+<5E0E> <5E0E> <CACC>
+<5E11> <5E11> <A9AE>
+<5E14> <5E14> <CC6E>
+<5E15> <5E15> <A9AC>
+<5E16> <5E16> <A9AB>
+<5E17> <5E17> <CC6D>
+<5E18> <5E18> <A9A9>
+<5E19> <5E19> <CC6F>
+<5E1A> <5E1A> <A9AA>
+<5E1B> <5E1B> <A9AD>
+<5E1D> <5E1D> <ABD2>
+<5E1F> <5E1F> <ABD4>
+<5E20> <5E20> <CEB3>
+<5E21> <5E23> <CEB0>
+<5E24> <5E24> <CEB4>
+<5E25> <5E25> <ABD3>
+<5E28> <5E28> <D174>
+<5E29> <5E29> <D173>
+<5E2B> <5E2B> <AE76>
+<5E2D> <5E2D> <AE75>
+<5E33> <5E33> <B162>
+<5E34> <5E34> <D546>
+<5E36> <5E36> <B161>
+<5E37> <5E37> <B163>
+<5E38> <5E38> <B160>
+<5E3D> <5E3D> <B455>
+<5E3E> <5E3E> <D545>
+<5E40> <5E40> <B456>
+<5E41> <5E41> <D8F3>
+<5E43> <5E43> <B457>
+<5E44> <5E44> <D8F2>
+<5E45> <5E45> <B454>
+<5E4A> <5E4A> <DD5A>
+<5E4B> <5E4B> <DD5C>
+<5E4C> <5E4C> <B745>
+<5E4D> <5E4D> <DD5B>
+<5E4E> <5E4E> <DD59>
+<5E4F> <5E4F> <DD58>
+<5E53> <5E53> <E1B4>
+<5E54> <5E54> <B9F7>
+<5E55> <5E55> <B9F5>
+<5E57> <5E57> <B9F6>
+<5E58> <5E59> <E1B2>
+<5E5B> <5E5B> <B9F3>
+<5E5C> <5E5C> <E571>
+<5E5D> <5E5D> <E56F>
+<5E5F> <5E5F> <BC6D>
+<5E60> <5E60> <E570>
+<5E61> <5E61> <BC6E>
+<5E62> <5E62> <BC6C>
+<5E63> <5E63> <B9F4>
+<5E66> <5E66> <E96D>
+<5E67> <5E68> <E96B>
+<5E69> <5E69> <E56E>
+<5E6A> <5E6A> <ECDC>
+<5E6B> <5E6B> <C0B0>
+<5E6C> <5E6C> <ECDB>
+<5E6D> <5E6E> <EFC5>
+<5E6F> <5E6F> <E96E>
+<5E70> <5E70> <F1FE>
+<5E72> <5E72> <A47A>
+<5E73> <5E73> <A5AD>
+endbfrange
+
+100 beginbfrange
+<5E74> <5E74> <A67E>
+<5E75> <5E75> <C9DB>
+<5E76> <5E76> <A67D>
+<5E78> <5E78> <A9AF>
+<5E79> <5E79> <B746>
+<5E7B> <5E7B> <A4DB>
+<5E7C> <5E7C> <A5AE>
+<5E7D> <5E7D> <ABD5>
+<5E7E> <5E7E> <B458>
+<5E80> <5E80> <C979>
+<5E82> <5E82> <C97A>
+<5E84> <5E84> <C9DC>
+<5E87> <5E87> <A7C8>
+<5E88> <5E88> <CAD0>
+<5E89> <5E89> <CACE>
+<5E8A> <5E8A> <A7C9>
+<5E8B> <5E8B> <CACD>
+<5E8C> <5E8C> <CACF>
+<5E8D> <5E8D> <CAD1>
+<5E8F> <5E8F> <A7C7>
+<5E95> <5E96> <A9B3>
+<5E97> <5E97> <A9B1>
+<5E9A> <5E9A> <A9B0>
+<5E9B> <5E9B> <CEB8>
+<5E9C> <5E9C> <A9B2>
+<5EA0> <5EA0> <ABD6>
+<5EA2> <5EA2> <CEB7>
+<5EA3> <5EA3> <CEB9>
+<5EA4> <5EA4> <CEB6>
+<5EA5> <5EA5> <CEBA>
+<5EA6> <5EA6> <ABD7>
+<5EA7> <5EA7> <AE79>
+<5EA8> <5EA8> <D175>
+<5EAA> <5EAA> <D177>
+<5EAB> <5EAB> <AE77>
+<5EAC> <5EAC> <D178>
+<5EAD> <5EAD> <AE78>
+<5EAE> <5EAE> <D176>
+<5EB0> <5EB0> <CEB5>
+<5EB1> <5EB1> <D547>
+<5EB2> <5EB3> <D54A>
+<5EB4> <5EB4> <D548>
+<5EB5> <5EB5> <B167>
+<5EB6> <5EB6> <B166>
+<5EB7> <5EB8> <B164>
+<5EB9> <5EB9> <D549>
+<5EBE> <5EBE> <B168>
+<5EC1> <5EC2> <B45A>
+<5EC4> <5EC4> <B45C>
+<5EC5> <5EC5> <DD5D>
+<5EC6> <5EC6> <DD5F>
+<5EC7> <5EC7> <DD61>
+<5EC8> <5EC8> <B748>
+<5EC9> <5EC9> <B747>
+<5ECA> <5ECA> <B459>
+<5ECB> <5ECB> <DD60>
+<5ECC> <5ECC> <DD5E>
+<5ECE> <5ECE> <E1B8>
+<5ED1> <5ED1> <E1B6>
+<5ED2> <5ED2> <E1BC>
+<5ED3> <5ED3> <B9F8>
+<5ED4> <5ED4> <E1BD>
+<5ED5> <5ED5> <E1BA>
+<5ED6> <5ED6> <B9F9>
+<5ED7> <5ED7> <E1B7>
+<5ED8> <5ED8> <E1B5>
+<5ED9> <5ED9> <E1BB>
+<5EDA> <5EDA> <BC70>
+<5EDB> <5EDB> <E573>
+<5EDC> <5EDC> <E1B9>
+<5EDD> <5EDD> <BC72>
+<5EDE> <5EDE> <E574>
+<5EDF> <5EDF> <BC71>
+<5EE0> <5EE0> <BC74>
+<5EE1> <5EE1> <E575>
+<5EE2> <5EE2> <BC6F>
+<5EE3> <5EE3> <BC73>
+<5EE5> <5EE5> <E973>
+<5EE6> <5EE6> <E971>
+<5EE7> <5EE7> <E970>
+<5EE8> <5EE8> <E972>
+<5EE9> <5EE9> <E96F>
+<5EEC> <5EEC> <C366>
+<5EEE> <5EEF> <F446>
+<5EF1> <5EF1> <F5CB>
+<5EF2> <5EF2> <F6DF>
+<5EF3> <5EF3> <C655>
+<5EF6> <5EF6> <A9B5>
+<5EF7> <5EF7> <A7CA>
+<5EFA> <5EFA> <ABD8>
+<5EFE> <5EFE> <A47B>
+<5EFF> <5EFF> <A4DC>
+<5F01> <5F01> <A5AF>
+<5F02> <5F02> <C9DD>
+<5F04> <5F04> <A7CB>
+<5F05> <5F05> <CAD2>
+<5F07> <5F07> <CEBB>
+<5F08> <5F08> <ABD9>
+<5F0A> <5F0A> <B9FA>
+<5F0B> <5F0B> <A47C>
+endbfrange
+
+100 beginbfrange
+<5F0F> <5F0F> <A6A1>
+<5F12> <5F12> <B749>
+<5F13> <5F13> <A47D>
+<5F14> <5F15> <A4DD>
+<5F17> <5F17> <A5B1>
+<5F18> <5F18> <A5B0>
+<5F1A> <5F1A> <C9DE>
+<5F1B> <5F1B> <A6A2>
+<5F1D> <5F1D> <CAD3>
+<5F1F> <5F1F> <A7CC>
+<5F22> <5F24> <CC71>
+<5F26> <5F27> <A9B6>
+<5F28> <5F28> <CC70>
+<5F29> <5F29> <A9B8>
+<5F2D> <5F2D> <ABDA>
+<5F2E> <5F2E> <CEBC>
+<5F30> <5F30> <D17A>
+<5F31> <5F31> <AE7A>
+<5F33> <5F33> <D179>
+<5F35> <5F35> <B169>
+<5F36> <5F36> <D54C>
+<5F37> <5F37> <B16A>
+<5F38> <5F38> <D54D>
+<5F3C> <5F3C> <B45D>
+<5F40> <5F40> <DD62>
+<5F43> <5F43> <E1BF>
+<5F44> <5F44> <E1BE>
+<5F46> <5F46> <B9FB>
+<5F48> <5F48> <BC75>
+<5F49> <5F49> <E576>
+<5F4A> <5F4A> <BECA>
+<5F4B> <5F4B> <E974>
+<5F4C> <5F4C> <C0B1>
+<5F4E> <5F4E> <C573>
+<5F4F> <5F4F> <F7D8>
+<5F54> <5F54> <CC74>
+<5F56> <5F56> <CEBD>
+<5F57> <5F57> <B16B>
+<5F58> <5F58> <D8F4>
+<5F59> <5F59> <B74A>
+<5F5D> <5F5D> <C255>
+<5F62> <5F62> <A7CE>
+<5F64> <5F64> <A7CD>
+<5F65> <5F65> <ABDB>
+<5F67> <5F67> <D17B>
+<5F69> <5F69> <B16D>
+<5F6A> <5F6A> <B343>
+<5F6B> <5F6B> <B16E>
+<5F6C> <5F6C> <B16C>
+<5F6D> <5F6D> <B45E>
+<5F6F> <5F6F> <E1C0>
+<5F70> <5F70> <B9FC>
+<5F71> <5F71> <BC76>
+<5F73> <5F73> <C94C>
+<5F74> <5F74> <C9DF>
+<5F76> <5F76> <CAD5>
+<5F77> <5F77> <A7CF>
+<5F78> <5F78> <CAD4>
+<5F79> <5F79> <A7D0>
+<5F7C> <5F7C> <A9BC>
+<5F7D> <5F7D> <CC77>
+<5F7E> <5F7E> <CC76>
+<5F7F> <5F7F> <A9BB>
+<5F80> <5F81> <A9B9>
+<5F82> <5F82> <CC75>
+<5F85> <5F85> <ABDD>
+<5F86> <5F86> <CEBE>
+<5F87> <5F87> <ABE0>
+<5F88> <5F88> <ABDC>
+<5F89> <5F89> <ABE2>
+<5F8A> <5F8B> <ABDE>
+<5F8C> <5F8C> <ABE1>
+<5F90> <5F90> <AE7D>
+<5F91> <5F91> <AE7C>
+<5F92> <5F92> <AE7B>
+<5F96> <5F96> <D54F>
+<5F97> <5F97> <B16F>
+<5F98> <5F98> <B172>
+<5F99> <5F99> <B170>
+<5F9B> <5F9B> <D54E>
+<5F9C> <5F9C> <B175>
+<5F9E> <5F9E> <B171>
+<5F9F> <5F9F> <D550>
+<5FA0> <5FA0> <B174>
+<5FA1> <5FA1> <B173>
+<5FA5> <5FA5> <D8F6>
+<5FA6> <5FA6> <D8F5>
+<5FA8> <5FA8> <B461>
+<5FA9> <5FAA> <B45F>
+<5FAB> <5FAB> <D8F7>
+<5FAC> <5FAC> <B74B>
+<5FAD> <5FAD> <DD64>
+<5FAE> <5FAE> <B74C>
+<5FAF> <5FAF> <DD63>
+<5FB2> <5FB2> <E577>
+<5FB5> <5FB5> <BC78>
+<5FB6> <5FB6> <E1C1>
+<5FB7> <5FB7> <BC77>
+<5FB9> <5FB9> <B9FD>
+<5FBB> <5FBB> <ECDE>
+endbfrange
+
+100 beginbfrange
+<5FBC> <5FBC> <E975>
+<5FBD> <5FBD> <C0B2>
+<5FBE> <5FBE> <ECDD>
+<5FBF> <5FBF> <F240>
+<5FC0> <5FC1> <F448>
+<5FC3> <5FC3> <A4DF>
+<5FC5> <5FC5> <A5B2>
+<5FC9> <5FC9> <C97B>
+<5FCC> <5FCC> <A7D2>
+<5FCD> <5FCD> <A7D4>
+<5FCF> <5FCF> <C9E2>
+<5FD0> <5FD0> <CAD8>
+<5FD1> <5FD1> <CAD7>
+<5FD2> <5FD2> <CAD6>
+<5FD4> <5FD4> <C9E1>
+<5FD5> <5FD5> <C9E0>
+<5FD6> <5FD6> <A6A4>
+<5FD7> <5FD7> <A7D3>
+<5FD8> <5FD8> <A7D1>
+<5FD9> <5FD9> <A6A3>
+<5FDD> <5FDD> <A9BD>
+<5FDE> <5FDE> <CC78>
+<5FE0> <5FE0> <A9BE>
+<5FE1> <5FE1> <CADD>
+<5FE3> <5FE3> <CADF>
+<5FE4> <5FE4> <CADE>
+<5FE5> <5FE5> <CC79>
+<5FE8> <5FE8> <CADA>
+<5FEA> <5FEA> <A7D8>
+<5FEB> <5FEB> <A7D6>
+<5FED> <5FED> <CAD9>
+<5FEE> <5FEE> <CADB>
+<5FEF> <5FEF> <CAE1>
+<5FF1> <5FF1> <A7D5>
+<5FF3> <5FF3> <CADC>
+<5FF4> <5FF4> <CAE5>
+<5FF5> <5FF5> <A9C0>
+<5FF7> <5FF7> <CAE2>
+<5FF8> <5FF8> <A7D7>
+<5FFA> <5FFA> <CAE0>
+<5FFB> <5FFB> <CAE3>
+<5FFD> <5FFD> <A9BF>
+<5FFF> <5FFF> <A9C1>
+<6000> <6000> <CAE4>
+<6009> <6009> <CCAF>
+<600A> <600A> <CCA2>
+<600B> <600B> <CC7E>
+<600C> <600C> <CCAE>
+<600D> <600D> <CCA9>
+<600E> <600E> <ABE7>
+<600F> <600F> <A9C2>
+<6010> <6010> <CCAA>
+<6011> <6011> <CCAD>
+<6012> <6012> <ABE3>
+<6013> <6013> <CCAC>
+<6014> <6014> <A9C3>
+<6015> <6015> <A9C8>
+<6016> <6016> <A9C6>
+<6017> <6017> <CCA3>
+<6019> <6019> <CC7C>
+<601A> <601A> <CCA5>
+<601B> <601B> <A9CD>
+<601C> <601C> <CCB0>
+<601D> <601D> <ABE4>
+<601E> <601E> <CCA6>
+<6020> <6020> <ABE5>
+<6021> <6021> <A9C9>
+<6022> <6022> <CCA8>
+<6024> <6024> <CECD>
+<6025> <6025> <ABE6>
+<6026> <6026> <CC7B>
+<6027> <6027> <A9CA>
+<6028> <6028> <ABE8>
+<6029> <6029> <A9CB>
+<602A> <602A> <A9C7>
+<602B> <602B> <A9CC>
+<602C> <602C> <CCA7>
+<602D> <602D> <CC7A>
+<602E> <602E> <CCAB>
+<602F> <602F> <A9C4>
+<6032> <6032> <CC7D>
+<6033> <6033> <CCA4>
+<6034> <6034> <CCA1>
+<6035> <6035> <A9C5>
+<6037> <6037> <CEBF>
+<6039> <6039> <CEC0>
+<6040> <6040> <CECA>
+<6041> <6041> <D1A1>
+<6042> <6042> <CECB>
+<6043> <6043> <ABEE>
+<6044> <6044> <CECE>
+<6045> <6045> <CEC4>
+<6046> <6046> <ABED>
+<6047> <6047> <CEC6>
+<6049> <6049> <CEC7>
+<604C> <604C> <CEC9>
+<604D> <604D> <ABE9>
+<6050> <6050> <AEA3>
+<6053> <6053> <CEC5>
+<6054> <6054> <CEC1>
+endbfrange
+
+100 beginbfrange
+<6055> <6055> <AEA4>
+<6058> <6058> <CECF>
+<6059> <6059> <AE7E>
+<605A> <605A> <D17D>
+<605B> <605B> <CEC8>
+<605D> <605D> <D17C>
+<605E> <605E> <CEC3>
+<605F> <605F> <CECC>
+<6062> <6062> <ABEC>
+<6063> <6063> <AEA1>
+<6064> <6064> <ABF2>
+<6065> <6065> <AEA2>
+<6066> <6066> <CED0>
+<6067> <6067> <D17E>
+<6068> <6068> <ABEB>
+<6069> <6069> <AEA6>
+<606A> <606A> <ABF1>
+<606B> <606B> <ABF0>
+<606C> <606C> <ABEF>
+<606D> <606D> <AEA5>
+<606E> <606E> <CED1>
+<606F> <606F> <AEA7>
+<6070> <6070> <ABEA>
+<6072> <6072> <CEC2>
+<607F> <607F> <B176>
+<6080> <6080> <D1A4>
+<6081> <6081> <D1A6>
+<6083> <6083> <D1A8>
+<6084> <6084> <AEA8>
+<6085> <6085> <AEAE>
+<6086> <6086> <D553>
+<6087> <6087> <D1AC>
+<6088> <6088> <D1A3>
+<6089> <6089> <B178>
+<608A> <608A> <D551>
+<608C> <608C> <AEAD>
+<608D> <608D> <AEAB>
+<608E> <608E> <D1AE>
+<6090> <6090> <D552>
+<6092> <6092> <D1A5>
+<6094> <6094> <AEAC>
+<6095> <6095> <D1A9>
+<6096> <6096> <AEAF>
+<6097> <6097> <D1AB>
+<609A> <609A> <AEAA>
+<609B> <609B> <D1AA>
+<609C> <609C> <D1AD>
+<609D> <609D> <D1A7>
+<609F> <609F> <AEA9>
+<60A0> <60A0> <B179>
+<60A2> <60A2> <D1A2>
+<60A3> <60A3> <B177>
+<60A8> <60A8> <B17A>
+<60B0> <60B0> <D555>
+<60B1> <60B1> <D55E>
+<60B2> <60B2> <B464>
+<60B4> <60B4> <B17C>
+<60B5> <60B5> <B1A3>
+<60B6> <60B6> <B465>
+<60B7> <60B7> <D560>
+<60B8> <60B8> <B1AA>
+<60B9> <60B9> <D8F9>
+<60BA> <60BA> <D556>
+<60BB> <60BB> <B1A2>
+<60BC> <60BC> <B1A5>
+<60BD> <60BD> <B17E>
+<60BE> <60BE> <D554>
+<60BF> <60BF> <D562>
+<60C0> <60C0> <D565>
+<60C1> <60C1> <D949>
+<60C3> <60C3> <D563>
+<60C4> <60C4> <D8FD>
+<60C5> <60C5> <B1A1>
+<60C6> <60C6> <B1A8>
+<60C7> <60C7> <B1AC>
+<60C8> <60C8> <D55D>
+<60C9> <60C9> <D8F8>
+<60CA> <60CA> <D561>
+<60CB> <60CB> <B17B>
+<60CC> <60CC> <D8FA>
+<60CD> <60CD> <D564>
+<60CE> <60CE> <D8FC>
+<60CF> <60CF> <D559>
+<60D1> <60D1> <B462>
+<60D3> <60D4> <D557>
+<60D5> <60D5> <B1A7>
+<60D8> <60D8> <B1A6>
+<60D9> <60D9> <D55B>
+<60DA> <60DA> <B1AB>
+<60DB> <60DB> <D55F>
+<60DC> <60DC> <B1A4>
+<60DD> <60DD> <D55C>
+<60DF> <60DF> <B1A9>
+<60E0> <60E0> <B466>
+<60E1> <60E1> <B463>
+<60E2> <60E2> <D8FB>
+<60E4> <60E4> <D55A>
+<60E6> <60E6> <B17D>
+<60F0> <60F0> <B46B>
+<60F1> <60F1> <B46F>
+endbfrange
+
+100 beginbfrange
+<60F2> <60F2> <D940>
+<60F3> <60F3> <B751>
+<60F4> <60F4> <B46D>
+<60F5> <60F5> <D944>
+<60F6> <60F6> <B471>
+<60F7> <60F7> <DD65>
+<60F8> <60F8> <D946>
+<60F9> <60F9> <B753>
+<60FA> <60FA> <B469>
+<60FB> <60FB> <B46C>
+<60FC> <60FC> <D947>
+<60FE> <60FE> <D948>
+<60FF> <60FF> <D94E>
+<6100> <6100> <B473>
+<6101> <6101> <B754>
+<6103> <6103> <D94A>
+<6104> <6104> <D94F>
+<6105> <6105> <D943>
+<6106> <6106> <B75E>
+<6108> <6108> <B755>
+<6109> <6109> <B472>
+<610A> <610A> <D941>
+<610B> <610B> <D950>
+<610D> <610D> <B75D>
+<610E> <610E> <B470>
+<610F> <610F> <B74E>
+<6110> <6110> <D94D>
+<6112> <6112> <B474>
+<6113> <6113> <D945>
+<6114> <6114> <D8FE>
+<6115> <6115> <B46A>
+<6116> <6116> <D942>
+<6118> <6118> <D94B>
+<611A> <611A> <B74D>
+<611B> <611B> <B752>
+<611C> <611C> <B467>
+<611D> <611D> <D94C>
+<611F> <611F> <B750>
+<6123> <6123> <B468>
+<6127> <6127> <B75C>
+<6128> <6128> <E1C3>
+<6129> <6129> <DD70>
+<612B> <612B> <DD68>
+<612C> <612C> <E1C2>
+<612E> <612E> <DD6C>
+<612F> <612F> <DD6E>
+<6132> <6132> <DD6B>
+<6134> <6134> <B75B>
+<6136> <6136> <DD6A>
+<6137> <6137> <B75F>
+<613B> <613B> <E1D2>
+<613E> <613E> <B75A>
+<613F> <613F> <BA40>
+<6140> <6140> <DD71>
+<6141> <6141> <E1C4>
+<6144> <6144> <B758>
+<6145> <6145> <DD69>
+<6146> <6146> <DD6D>
+<6147> <6147> <B9FE>
+<6148> <6148> <B74F>
+<6149> <614A> <DD66>
+<614B> <614B> <BA41>
+<614C> <614C> <B757>
+<614D> <614D> <B759>
+<614E> <614E> <B756>
+<614F> <614F> <DD6F>
+<6152> <6153> <E1C8>
+<6154> <6154> <E1CE>
+<6155> <6155> <BC7D>
+<6156> <6156> <E1D5>
+<6158> <6158> <BA47>
+<615A> <615A> <BA46>
+<615B> <615B> <E1D0>
+<615D> <615D> <BC7C>
+<615E> <615E> <E1C5>
+<615F> <615F> <BA45>
+<6161> <6161> <E1D4>
+<6162> <6163> <BA43>
+<6165> <6165> <E1D1>
+<6166> <6166> <E5AA>
+<6167> <6167> <BC7A>
+<6168> <6168> <B46E>
+<616A> <616A> <E1D3>
+<616B> <616B> <BCA3>
+<616C> <616C> <E1CB>
+<616E> <616E> <BC7B>
+<6170> <6170> <BCA2>
+<6171> <6171> <E1C6>
+<6172> <6172> <E1CA>
+<6173> <6173> <E1C7>
+<6174> <6174> <E1CD>
+<6175> <6175> <BA48>
+<6176> <6176> <BC79>
+<6177> <6177> <BA42>
+<6179> <6179> <E57A>
+<617A> <617A> <E1CF>
+<617C> <617C> <BCA1>
+<617E> <617E> <BCA4>
+<6180> <6180> <E1CC>
+<6182> <6182> <BC7E>
+endbfrange
+
+100 beginbfrange
+<6183> <6183> <E579>
+<6189> <6189> <E57E>
+<618A> <618A> <BECE>
+<618B> <618B> <E578>
+<618C> <618C> <E9A3>
+<618D> <618D> <E5A9>
+<618E> <618E> <BCA8>
+<6190> <6190> <BCA6>
+<6191> <6191> <BECC>
+<6192> <6192> <E5A6>
+<6193> <6193> <E5A2>
+<6194> <6194> <BCAC>
+<6196> <6196> <E978>
+<619A> <619A> <BCAA>
+<619B> <619B> <E5A1>
+<619D> <619D> <E976>
+<619F> <619F> <E5A5>
+<61A1> <61A1> <E5A8>
+<61A2> <61A2> <E57D>
+<61A4> <61A4> <BCAB>
+<61A7> <61A7> <BCA5>
+<61A8> <61A8> <E977>
+<61A9> <61A9> <BECD>
+<61AA> <61AA> <E5A7>
+<61AB> <61AB> <BCA7>
+<61AC> <61AC> <BCA9>
+<61AD> <61AD> <E5A4>
+<61AE> <61AE> <BCAD>
+<61AF> <61AF> <E5A3>
+<61B0> <61B0> <E57C>
+<61B1> <61B1> <E57B>
+<61B2> <61B2> <BECB>
+<61B3> <61B3> <E5AB>
+<61B4> <61B4> <E97A>
+<61B5> <61B5> <ECE0>
+<61B6> <61B6> <BED0>
+<61B8> <61B8> <E9A2>
+<61BA> <61BA> <E97E>
+<61BC> <61BC> <ECE1>
+<61BE> <61BE> <BED1>
+<61BF> <61BF> <E9A1>
+<61C1> <61C1> <E97C>
+<61C2> <61C2> <C0B4>
+<61C3> <61C3> <ECDF>
+<61C5> <61C5> <E979>
+<61C6> <61C6> <E97B>
+<61C7> <61C7> <C0B5>
+<61C8> <61C8> <BED3>
+<61C9> <61C9> <C0B3>
+<61CA> <61CA> <BED2>
+<61CB> <61CB> <C0B7>
+<61CC> <61CC> <E97D>
+<61CD> <61CD> <BECF>
+<61D6> <61D6> <EFCF>
+<61D8> <61D8> <EFC7>
+<61DE> <61DE> <ECE7>
+<61DF> <61DF> <EFC8>
+<61E0> <61E0> <ECE3>
+<61E3> <61E3> <C256>
+<61E4> <61E4> <ECE5>
+<61E5> <61E5> <ECE4>
+<61E6> <61E6> <C0B6>
+<61E7> <61E7> <ECE2>
+<61E8> <61E8> <ECE6>
+<61E9> <61E9> <EFD0>
+<61EA> <61EA> <EFCC>
+<61EB> <61EB> <EFCE>
+<61ED> <61EE> <EFC9>
+<61F0> <61F0> <EFCD>
+<61F1> <61F1> <EFCB>
+<61F2> <61F2> <C367>
+<61F5> <61F5> <C36A>
+<61F6> <61F6> <C369>
+<61F7> <61F7> <C368>
+<61F8> <61F8> <C461>
+<61F9> <61F9> <F44A>
+<61FA> <61FA> <C462>
+<61FB> <61FB> <F241>
+<61FC> <61FC> <C4DF>
+<61FD> <61FD> <F5CC>
+<61FE> <61FE> <C4E0>
+<61FF> <61FF> <C574>
+<6200> <6200> <C5CA>
+<6201> <6201> <F7D9>
+<6203> <6204> <F7DA>
+<6207> <6207> <F9BA>
+<6208> <6208> <A4E0>
+<6209> <6209> <C97C>
+<620A> <620A> <A5B3>
+<620C> <620D> <A6A6>
+<620E> <620E> <A6A5>
+<6210> <6210> <A6A8>
+<6211> <6211> <A7DA>
+<6212> <6212> <A7D9>
+<6214> <6214> <CCB1>
+<6215> <6215> <A9CF>
+<6216> <6216> <A9CE>
+<6219> <6219> <D1AF>
+<621A> <621B> <B1AD>
+<621F> <621F> <B475>
+endbfrange
+
+100 beginbfrange
+<6220> <6220> <DD72>
+<6221> <6222> <B760>
+<6223> <6223> <DD74>
+<6224> <6224> <DD76>
+<6225> <6225> <DD75>
+<6227> <6227> <E1D7>
+<6229> <6229> <E1D6>
+<622A> <622A> <BA49>
+<622B> <622B> <E1D8>
+<622D> <622D> <E5AC>
+<622E> <622E> <BCAE>
+<6230> <6230> <BED4>
+<6232> <6232> <C0B8>
+<6233> <6233> <C257>
+<6234> <6234> <C0B9>
+<6236> <6236> <A4E1>
+<623A> <623A> <CAE6>
+<623D> <623D> <CCB2>
+<623E> <623E> <A9D1>
+<623F> <623F> <A9D0>
+<6240> <6240> <A9D2>
+<6241> <6241> <ABF3>
+<6242> <6243> <CED2>
+<6246> <6246> <D1B0>
+<6247> <6247> <AEB0>
+<6248> <6248> <B1AF>
+<6249> <6249> <B476>
+<624A> <624A> <D951>
+<624B> <624B> <A4E2>
+<624D> <624D> <A47E>
+<624E> <624E> <A4E3>
+<6250> <6250> <C97D>
+<6251> <6251> <A5B7>
+<6252> <6252> <A5B6>
+<6253> <6254> <A5B4>
+<6258> <6258> <A6AB>
+<6259> <6259> <C9E9>
+<625A> <625A> <C9EB>
+<625B> <625B> <A6AA>
+<625C> <625C> <C9E3>
+<625E> <625E> <C9E4>
+<6260> <6260> <C9EA>
+<6261> <6261> <C9E6>
+<6262> <6262> <C9E8>
+<6263> <6263> <A6A9>
+<6264> <6264> <C9E5>
+<6265> <6265> <C9EC>
+<6266> <6266> <C9E7>
+<626D> <626D> <A7E1>
+<626E> <626E> <A7EA>
+<626F> <626F> <A7E8>
+<6270> <6270> <CAF0>
+<6271> <6271> <CAED>
+<6272> <6272> <CAF5>
+<6273> <6273> <A7E6>
+<6274> <6274> <CAF6>
+<6276> <6276> <A7DF>
+<6277> <6277> <CAF3>
+<6279> <6279> <A7E5>
+<627A> <627A> <CAEF>
+<627B> <627B> <CAEE>
+<627C> <627C> <A7E3>
+<627D> <627D> <CAF4>
+<627E> <627E> <A7E4>
+<627F> <627F> <A9D3>
+<6280> <6280> <A7DE>
+<6281> <6281> <CAF1>
+<6283> <6283> <CAE7>
+<6284> <6284> <A7DB>
+<6286> <6286> <A7EE>
+<6287> <6287> <CAEC>
+<6288> <6288> <CAF2>
+<6289> <6289> <A7E0>
+<628A> <628A> <A7E2>
+<628C> <628C> <CAE8>
+<628E> <628F> <CAE9>
+<6291> <6291> <A7ED>
+<6292> <6292> <A7E7>
+<6293> <6293> <A7EC>
+<6294> <6294> <CAEB>
+<6295> <6295> <A7EB>
+<6296> <6296> <A7DD>
+<6297> <6297> <A7DC>
+<6298> <6298> <A7E9>
+<62A8> <62A8> <A9E1>
+<62A9> <62A9> <CCBE>
+<62AA> <62AA> <CCB7>
+<62AB> <62AB> <A9DC>
+<62AC> <62AC> <A9EF>
+<62AD> <62AD> <CCB3>
+<62AE> <62AE> <CCBA>
+<62AF> <62AF> <CCBC>
+<62B0> <62B0> <CCBF>
+<62B1> <62B1> <A9EA>
+<62B3> <62B3> <CCBB>
+<62B4> <62B4> <CCB4>
+<62B5> <62B5> <A9E8>
+<62B6> <62B6> <CCB8>
+<62B8> <62B8> <CCC0>
+<62B9> <62B9> <A9D9>
+endbfrange
+
+100 beginbfrange
+<62BB> <62BB> <CCBD>
+<62BC> <62BC> <A9E3>
+<62BD> <62BD> <A9E2>
+<62BE> <62BE> <CCB6>
+<62BF> <62BF> <A9D7>
+<62C2> <62C2> <A9D8>
+<62C4> <62C4> <A9D6>
+<62C6> <62C6> <A9EE>
+<62C7> <62C7> <A9E6>
+<62C8> <62C8> <A9E0>
+<62C9> <62C9> <A9D4>
+<62CA> <62CA> <CCB9>
+<62CB> <62CB> <A9DF>
+<62CC> <62CC> <A9D5>
+<62CD> <62CD> <A9E7>
+<62CE> <62CE> <A9F0>
+<62CF> <62CF> <CED4>
+<62D0> <62D0> <A9E4>
+<62D1> <62D1> <CCB5>
+<62D2> <62D2> <A9DA>
+<62D3> <62D4> <A9DD>
+<62D6> <62D7> <A9EC>
+<62D8> <62D8> <A9EB>
+<62D9> <62D9> <A9E5>
+<62DA> <62DA> <A9E9>
+<62DB> <62DB> <A9DB>
+<62DC> <62DC> <ABF4>
+<62EB> <62EB> <CEDA>
+<62EC> <62EC> <AC41>
+<62ED> <62ED> <ABF8>
+<62EE> <62EE> <ABFA>
+<62EF> <62EF> <AC40>
+<62F0> <62F0> <CEE6>
+<62F1> <62F1> <ABFD>
+<62F2> <62F2> <D1B1>
+<62F3> <62F3> <AEB1>
+<62F4> <62F4> <AC43>
+<62F5> <62F5> <CED7>
+<62F6> <62F6> <CEDF>
+<62F7> <62F7> <ABFE>
+<62F8> <62F8> <CEDE>
+<62F9> <62F9> <CEDB>
+<62FA> <62FA> <CEE3>
+<62FB> <62FB> <CEE5>
+<62FC> <62FC> <ABF7>
+<62FD> <62FD> <ABFB>
+<62FE> <62FE> <AC42>
+<62FF> <62FF> <AEB3>
+<6300> <6300> <CEE0>
+<6301> <6301> <ABF9>
+<6302> <6302> <AC45>
+<6303> <6303> <CED9>
+<6307> <6307> <ABFC>
+<6308> <6308> <AEB2>
+<6309> <6309> <ABF6>
+<630B> <630B> <CED6>
+<630C> <630C> <CEDD>
+<630D> <630D> <CED5>
+<630E> <630E> <CED8>
+<630F> <630F> <CEDC>
+<6310> <6310> <D1B2>
+<6311> <6311> <AC44>
+<6313> <6314> <CEE1>
+<6315> <6315> <CEE4>
+<6316> <6316> <ABF5>
+<6328> <6328> <AEC1>
+<6329> <6329> <D1BE>
+<632A> <632B> <AEBF>
+<632C> <632C> <D1B4>
+<632D> <632D> <D1C4>
+<632F> <632F> <AEB6>
+<6332> <6332> <D566>
+<6333> <6333> <D1C6>
+<6334> <6334> <D1C0>
+<6336> <6336> <D1B7>
+<6338> <6338> <D1C9>
+<6339> <6339> <D1BA>
+<633A> <633A> <AEBC>
+<633B> <633B> <D57D>
+<633C> <633C> <D1BD>
+<633D> <633D> <AEBE>
+<633E> <633E> <AEB5>
+<6340> <6340> <D1CB>
+<6341> <6341> <D1BF>
+<6342> <6342> <AEB8>
+<6343> <6343> <D1B8>
+<6344> <6345> <D1B5>
+<6346> <6346> <AEB9>
+<6347> <6347> <D1C5>
+<6348> <6348> <D1CC>
+<6349> <6349> <AEBB>
+<634A> <634A> <D1BC>
+<634B> <634B> <D1BB>
+<634C> <634C> <AEC3>
+<634D> <634D> <AEC2>
+<634E> <634E> <AEB4>
+<634F> <634F> <AEBA>
+<6350> <6350> <AEBD>
+<6351> <6351> <D1C8>
+<6354> <6354> <D1C2>
+endbfrange
+
+100 beginbfrange
+<6355> <6355> <AEB7>
+<6356> <6356> <D1B3>
+<6357> <6357> <D1CA>
+<6358> <6358> <D1C1>
+<6359> <6359> <D1C3>
+<635A> <635A> <D1C7>
+<6365> <6365> <D567>
+<6367> <6367> <B1B7>
+<6368> <6368> <B1CB>
+<6369> <6369> <B1CA>
+<636B> <636B> <B1BF>
+<636D> <636D> <D579>
+<636E> <636E> <D575>
+<636F> <636F> <D572>
+<6370> <6370> <D5A6>
+<6371> <6371> <B1BA>
+<6372> <6372> <B1B2>
+<6375> <6375> <D577>
+<6376> <6376> <B4A8>
+<6377> <6377> <B1B6>
+<6378> <6378> <D5A1>
+<637A> <637A> <B1CC>
+<637B> <637B> <B1C9>
+<637C> <637C> <D57B>
+<637D> <637D> <D56A>
+<6380> <6380> <B1C8>
+<6381> <6381> <D5A3>
+<6382> <6382> <D569>
+<6383> <6383> <B1BD>
+<6384> <6384> <B1C1>
+<6385> <6385> <D5A2>
+<6387> <6387> <D573>
+<6388> <6388> <B1C2>
+<6389> <6389> <B1BC>
+<638A> <638A> <D568>
+<638C> <638C> <B478>
+<638D> <638D> <D5A5>
+<638E> <638E> <D571>
+<638F> <638F> <B1C7>
+<6390> <6390> <D574>
+<6391> <6391> <D5A4>
+<6392> <6392> <B1C6>
+<6394> <6394> <D952>
+<6396> <6396> <B1B3>
+<6397> <6397> <D56F>
+<6398> <6398> <B1B8>
+<6399> <6399> <B1C3>
+<639B> <639B> <B1BE>
+<639C> <639C> <D578>
+<639D> <639D> <D56E>
+<639E> <639E> <D56C>
+<639F> <639F> <D57E>
+<63A0> <63A0> <B1B0>
+<63A1> <63A1> <B1C4>
+<63A2> <63A2> <B1B4>
+<63A3> <63A3> <B477>
+<63A4> <63A4> <D57C>
+<63A5> <63A5> <B1B5>
+<63A7> <63A7> <B1B1>
+<63A8> <63A8> <B1C0>
+<63A9> <63A9> <B1BB>
+<63AA> <63AA> <B1B9>
+<63AB> <63AB> <D570>
+<63AC> <63AC> <B1C5>
+<63AD> <63AD> <D56D>
+<63AE> <63AE> <D57A>
+<63AF> <63AF> <D576>
+<63B0> <63B0> <D954>
+<63B1> <63B1> <D953>
+<63BD> <63BD> <D56B>
+<63BE> <63BE> <D964>
+<63C0> <63C0> <B47A>
+<63C2> <63C2> <D96A>
+<63C3> <63C3> <D959>
+<63C4> <63C4> <D967>
+<63C5> <63C5> <DD77>
+<63C6> <63C6> <B47D>
+<63C7> <63C7> <D96B>
+<63C8> <63C8> <D96E>
+<63C9> <63C9> <B47C>
+<63CA> <63CA> <D95C>
+<63CB> <63CB> <D96D>
+<63CC> <63CC> <D96C>
+<63CD> <63CD> <B47E>
+<63CE> <63CE> <D955>
+<63CF> <63CF> <B479>
+<63D0> <63D0> <B4A3>
+<63D2> <63D2> <B4A1>
+<63D3> <63D3> <D969>
+<63D5> <63D5> <D95F>
+<63D6> <63D6> <B4A5>
+<63D7> <63D7> <D970>
+<63D8> <63D8> <D968>
+<63D9> <63D9> <D971>
+<63DA> <63DA> <B4AD>
+<63DB> <63DB> <B4AB>
+<63DC> <63DC> <D966>
+<63DD> <63DD> <D965>
+<63DF> <63DF> <D963>
+<63E0> <63E0> <D95D>
+endbfrange
+
+100 beginbfrange
+<63E1> <63E1> <B4A4>
+<63E3> <63E3> <B4A2>
+<63E4> <63E4> <D1B9>
+<63E5> <63E5> <D956>
+<63E7> <63E7> <DDB7>
+<63E8> <63E8> <D957>
+<63E9> <63E9> <B47B>
+<63EA> <63EA> <B4AA>
+<63EB> <63EB> <DD79>
+<63ED> <63EE> <B4A6>
+<63EF> <63EF> <D958>
+<63F0> <63F0> <D96F>
+<63F1> <63F1> <DD78>
+<63F2> <63F2> <D960>
+<63F3> <63F3> <D95B>
+<63F4> <63F4> <B4A9>
+<63F5> <63F5> <D961>
+<63F6> <63F6> <D95E>
+<63F9> <63F9> <B4AE>
+<6406> <6406> <B770>
+<6409> <6409> <DD7C>
+<640A> <640A> <DDB1>
+<640B> <640B> <DDB6>
+<640C> <640C> <DDAA>
+<640D> <640D> <B76C>
+<640E> <640E> <DDBB>
+<640F> <640F> <B769>
+<6410> <6410> <DD7A>
+<6412> <6412> <DD7B>
+<6413> <6413> <B762>
+<6414> <6414> <B76B>
+<6415> <6415> <DDA4>
+<6416> <6417> <B76E>
+<6418> <6418> <DDA5>
+<641A> <641A> <DDB2>
+<641B> <641B> <DDB8>
+<641C> <641C> <B76A>
+<641E> <641E> <B764>
+<641F> <641F> <DDA3>
+<6420> <6420> <DD7D>
+<6421> <6421> <DDBA>
+<6422> <6423> <DDA8>
+<6424> <6424> <DD7E>
+<6425> <6425> <DDB4>
+<6426> <6426> <DDAB>
+<6427> <6427> <DDB5>
+<6428> <6428> <DDAD>
+<642A> <642A> <B765>
+<642B> <642B> <E1D9>
+<642C> <642C> <B768>
+<642D> <642D> <B766>
+<642E> <642E> <DDB9>
+<642F> <642F> <DDB0>
+<6430> <6430> <DDAC>
+<6433> <6433> <DDA1>
+<6434> <6434> <BA53>
+<6435> <6435> <DDAF>
+<6436> <6436> <B76D>
+<6437> <6437> <DDA7>
+<6439> <6439> <DDA6>
+<643D> <643D> <B767>
+<643E> <643E> <B763>
+<643F> <643F> <E1EE>
+<6440> <6440> <DDB3>
+<6441> <6441> <DDAE>
+<6443> <6443> <DDA2>
+<644B> <644B> <E1E9>
+<644D> <644D> <E1DA>
+<644E> <644E> <E1E5>
+<6450> <6450> <E1EC>
+<6451> <6451> <BA51>
+<6452> <6452> <B4AC>
+<6453> <6453> <E1EA>
+<6454> <6454> <BA4C>
+<6458> <6458> <BA4B>
+<6459> <6459> <E1F1>
+<645B> <645B> <E1DB>
+<645C> <645C> <E1E8>
+<645D> <645D> <E1DC>
+<645E> <645E> <E1E7>
+<645F> <645F> <BA4F>
+<6460> <6460> <E1EB>
+<6461> <6461> <D962>
+<6465> <6465> <E1F2>
+<6466> <6466> <E1E3>
+<6467> <6467> <BA52>
+<6468> <6468> <E5BA>
+<6469> <6469> <BCAF>
+<646B> <646B> <E1F0>
+<646C> <646C> <E1EF>
+<646D> <646D> <BA54>
+<646E> <646E> <E5AD>
+<646F> <646F> <BCB0>
+<6470> <6470> <E5AE>
+<6472> <6473> <E1DF>
+<6474> <6474> <E1DD>
+<6475> <6475> <E1E2>
+<6476> <6476> <E1DE>
+<6477> <6477> <E1F3>
+<6478> <6478> <BA4E>
+endbfrange
+
+100 beginbfrange
+<6479> <6479> <BCB1>
+<647A> <647A> <BA50>
+<647B> <647B> <BA55>
+<647D> <647D> <E1E1>
+<647F> <647F> <E1ED>
+<6482> <6482> <E1E6>
+<6485> <6485> <E5B1>
+<6487> <6487> <BA4A>
+<6488> <6488> <BCB4>
+<6489> <6489> <E9AA>
+<648A> <648A> <E5B6>
+<648B> <648B> <E5B5>
+<648C> <648C> <E5B7>
+<648F> <648F> <E5B4>
+<6490> <6490> <BCB5>
+<6492> <6492> <BCBB>
+<6493> <6493> <BCB8>
+<6495> <6495> <BCB9>
+<6496> <6496> <E5AF>
+<6497> <6497> <E5B2>
+<6498> <6498> <E5BC>
+<6499> <6499> <BCC1>
+<649A> <649A> <BCBF>
+<649C> <649C> <E5B3>
+<649D> <649D> <D95A>
+<649E> <649E> <BCB2>
+<649F> <649F> <E5B9>
+<64A0> <64A0> <E5B0>
+<64A2> <64A2> <BCC2>
+<64A3> <64A3> <E5B8>
+<64A4> <64A4> <BA4D>
+<64A5> <64A5> <BCB7>
+<64A6> <64A6> <E1E4>
+<64A9> <64A9> <BCBA>
+<64AB> <64AB> <BCBE>
+<64AC> <64AC> <BCC0>
+<64AD> <64AD> <BCBD>
+<64AE> <64AE> <BCBC>
+<64B0> <64B0> <BCB6>
+<64B1> <64B1> <E5BB>
+<64B2> <64B2> <BCB3>
+<64B3> <64B3> <BCC3>
+<64BB> <64BC> <BED8>
+<64BD> <64BD> <E9A9>
+<64BE> <64BE> <BEE2>
+<64BF> <64BF> <BEDF>
+<64C1> <64C1> <BED6>
+<64C2> <64C2> <BEDD>
+<64C3> <64C3> <E9AB>
+<64C4> <64C4> <BEDB>
+<64C5> <64C5> <BED5>
+<64C7> <64C7> <BEDC>
+<64C9> <64C9> <E9A8>
+<64CA> <64CA> <C0BB>
+<64CB> <64CB> <BED7>
+<64CD> <64CD> <BEDE>
+<64CE> <64CE> <C0BA>
+<64CF> <64CF> <E9A7>
+<64D0> <64D0> <E9A6>
+<64D2> <64D2> <BEE0>
+<64D4> <64D4> <BEE1>
+<64D6> <64D6> <E9A5>
+<64D7> <64D7> <E9A4>
+<64D8> <64D8> <C0BC>
+<64D9> <64D9> <E9AE>
+<64DA> <64DA> <BEDA>
+<64DB> <64DB> <E9AC>
+<64E0> <64E0> <C0BD>
+<64E2> <64E2> <C0C2>
+<64E3> <64E3> <ECEA>
+<64E4> <64E4> <ECEC>
+<64E6> <64E6> <C0BF>
+<64E8> <64E8> <ECED>
+<64E9> <64E9> <ECE9>
+<64EB> <64EB> <ECEB>
+<64EC> <64EC> <C0C0>
+<64ED> <64ED> <C0C3>
+<64EF> <64EF> <ECE8>
+<64F0> <64F0> <C0BE>
+<64F1> <64F1> <C0C1>
+<64F2> <64F2> <C259>
+<64F3> <64F3> <E9AD>
+<64F4> <64F4> <C258>
+<64F7> <64F7> <C25E>
+<64F8> <64F8> <EFD4>
+<64FA> <64FB> <C25C>
+<64FC> <64FC> <EFD7>
+<64FD> <64FD> <EFD3>
+<64FE> <64FE> <C25A>
+<64FF> <64FF> <EFD1>
+<6500> <6500> <C36B>
+<6501> <6501> <EFD5>
+<6503> <6503> <EFD6>
+<6504> <6504> <EFD2>
+<6506> <6506> <C25B>
+<6507> <6507> <F242>
+<6509> <6509> <F245>
+<650C> <650C> <F246>
+<650D> <650D> <F244>
+<650E> <650E> <F247>
+endbfrange
+
+100 beginbfrange
+<650F> <650F> <C36C>
+<6510> <6510> <F243>
+<6513> <6513> <F44E>
+<6514> <6514> <C464>
+<6515> <6515> <F44D>
+<6516> <6516> <F44C>
+<6517> <6517> <F44B>
+<6518> <6518> <C463>
+<6519> <6519> <C465>
+<651B> <651B> <F5CD>
+<651C> <651C> <C4E2>
+<651D> <651D> <C4E1>
+<6520> <6520> <F6E1>
+<6521> <6521> <F6E0>
+<6522> <6522> <F6E3>
+<6523> <6523> <C5CB>
+<6524> <6524> <C575>
+<6525> <6525> <F7DD>
+<6526> <6526> <F6E2>
+<6529> <6529> <F7DC>
+<652A> <652A> <C5CD>
+<652B> <652B> <C5CC>
+<652C> <652C> <C5F3>
+<652D> <652D> <F8A9>
+<652E> <652E> <F8EF>
+<652F> <652F> <A4E4>
+<6532> <6532> <D972>
+<6533> <6533> <E9AF>
+<6536> <6536> <A6AC>
+<6537> <6537> <CAF7>
+<6538> <6538> <A7F1>
+<6539> <6539> <A7EF>
+<653B> <653B> <A7F0>
+<653D> <653D> <CCC1>
+<653E> <653E> <A9F1>
+<653F> <653F> <AC46>
+<6541> <6541> <CEE7>
+<6543> <6543> <CEE8>
+<6545> <6545> <AC47>
+<6546> <6546> <D1CE>
+<6548> <6549> <AEC4>
+<654A> <654A> <D1CD>
+<654F> <654F> <B1D3>
+<6551> <6551> <B1CF>
+<6553> <6553> <D5A7>
+<6554> <6554> <B1D6>
+<6555> <6555> <B1D5>
+<6556> <6556> <B1CE>
+<6557> <6557> <B1D1>
+<6558> <6558> <B1D4>
+<6559> <6559> <B1D0>
+<655C> <655C> <D976>
+<655D> <655D> <B1CD>
+<655E> <655E> <B4AF>
+<6562> <6563> <B4B1>
+<6564> <6564> <D975>
+<6565> <6565> <D978>
+<6566> <6566> <B4B0>
+<6567> <6567> <D973>
+<6568> <6568> <D977>
+<656A> <656A> <D974>
+<656C> <656C> <B771>
+<656F> <656F> <DDBC>
+<6572> <6572> <BA56>
+<6573> <6573> <E1F4>
+<6574> <6574> <BEE3>
+<6575> <6575> <BCC4>
+<6576> <6576> <E5BD>
+<6577> <6578> <BCC5>
+<6579> <6579> <E5BF>
+<657A> <657A> <E5BE>
+<657B> <657B> <E5C0>
+<657C> <657C> <E9B1>
+<657F> <657F> <E9B0>
+<6580> <6580> <ECEF>
+<6581> <6581> <ECEE>
+<6582> <6583> <C0C4>
+<6584> <6584> <F248>
+<6587> <6587> <A4E5>
+<658C> <658C> <D979>
+<6590> <6590> <B4B4>
+<6591> <6591> <B4B3>
+<6592> <6592> <DDBD>
+<6594> <6594> <EFD8>
+<6595> <6595> <C4E3>
+<6596> <6596> <F7DE>
+<6597> <6597> <A4E6>
+<6599> <6599> <AEC6>
+<659B> <659B> <B1D8>
+<659C> <659C> <B1D7>
+<659D> <659E> <D97A>
+<659F> <659F> <B772>
+<65A0> <65A0> <E1F5>
+<65A1> <65A1> <BA57>
+<65A2> <65A2> <E9B2>
+<65A4> <65A4> <A4E7>
+<65A5> <65A5> <A5B8>
+<65A7> <65A7> <A9F2>
+<65A8> <65A8> <CCC2>
+<65AA> <65AA> <CEE9>
+endbfrange
+
+100 beginbfrange
+<65AB> <65AB> <AC48>
+<65AC> <65AC> <B1D9>
+<65AE> <65AE> <D97C>
+<65AF> <65AF> <B4B5>
+<65B0> <65B0> <B773>
+<65B2> <65B3> <E5C1>
+<65B6> <65B6> <ECF0>
+<65B7> <65B7> <C25F>
+<65B8> <65B8> <F8F0>
+<65B9> <65B9> <A4E8>
+<65BB> <65BB> <CCC3>
+<65BC> <65BC> <A9F3>
+<65BD> <65BD> <AC49>
+<65BF> <65BF> <CEEA>
+<65C1> <65C1> <AEC7>
+<65C2> <65C2> <D1D2>
+<65C3> <65C4> <D1D0>
+<65C5> <65C5> <AEC8>
+<65C6> <65C6> <D1CF>
+<65CB> <65CC> <B1DB>
+<65CD> <65CD> <D5A8>
+<65CE> <65CE> <B1DD>
+<65CF> <65CF> <B1DA>
+<65D0> <65D0> <D97D>
+<65D2> <65D2> <D97E>
+<65D3> <65D3> <DDBE>
+<65D6> <65D6> <BA59>
+<65D7> <65D7> <BA58>
+<65DA> <65DA> <ECF1>
+<65DB> <65DB> <EFD9>
+<65DD> <65DD> <F24A>
+<65DE> <65DE> <F249>
+<65DF> <65DF> <F44F>
+<65E1> <65E1> <C95E>
+<65E2> <65E2> <AC4A>
+<65E5> <65E5> <A4E9>
+<65E6> <65E6> <A5B9>
+<65E8> <65E8> <A6AE>
+<65E9> <65E9> <A6AD>
+<65EC> <65ED> <A6AF>
+<65EE> <65EE> <C9EE>
+<65EF> <65EF> <C9ED>
+<65F0> <65F0> <CAF8>
+<65F1> <65F1> <A7F2>
+<65F2> <65F2> <CAFB>
+<65F3> <65F3> <CAFA>
+<65F4> <65F4> <CAF9>
+<65F5> <65F5> <CAFC>
+<65FA> <65FA> <A9F4>
+<65FB> <65FB> <CCC9>
+<65FC> <65FC> <CCC5>
+<65FD> <65FD> <CCCE>
+<6600> <6600> <A9FB>
+<6602> <6602> <A9F9>
+<6603> <6603> <CCCA>
+<6604> <6604> <CCC6>
+<6605> <6605> <CCCD>
+<6606> <6606> <A9F8>
+<6607> <6607> <AA40>
+<6608> <6608> <CCC8>
+<6609> <6609> <CCC4>
+<660A> <660A> <A9FE>
+<660B> <660B> <CCCB>
+<660C> <660C> <A9F7>
+<660D> <660D> <CCCC>
+<660E> <660E> <A9FA>
+<660F> <660F> <A9FC>
+<6610> <6610> <CCD0>
+<6611> <6611> <CCCF>
+<6612> <6612> <CCC7>
+<6613> <6613> <A9F6>
+<6614> <6614> <A9F5>
+<6615> <6615> <A9FD>
+<661C> <661C> <CEEF>
+<661D> <661D> <CEF5>
+<661F> <661F> <AC50>
+<6620> <6620> <AC4D>
+<6621> <6621> <CEEC>
+<6622> <6622> <CEF1>
+<6624> <6624> <AC53>
+<6625> <6625> <AC4B>
+<6626> <6626> <CEF0>
+<6627> <6627> <AC4E>
+<6628> <6628> <AC51>
+<662B> <662B> <CEF3>
+<662D> <662D> <AC4C>
+<662E> <662E> <CEF8>
+<662F> <662F> <AC4F>
+<6631> <6631> <AC52>
+<6632> <6632> <CEED>
+<6633> <6633> <CEF2>
+<6634> <6634> <CEF6>
+<6635> <6635> <CEEE>
+<6636> <6636> <CEEB>
+<6639> <6639> <CEF7>
+<663A> <663A> <CEF4>
+<6641> <6641> <AED0>
+<6642> <6642> <AEC9>
+<6643> <6643> <AECC>
+<6645> <6645> <AECF>
+endbfrange
+
+100 beginbfrange
+<6647> <6647> <D1D5>
+<6649> <6649> <AECA>
+<664A> <664A> <D1D3>
+<664C> <664C> <AECE>
+<664F> <664F> <AECB>
+<6651> <6651> <D1D6>
+<6652> <6652> <AECD>
+<6659> <6659> <D5AC>
+<665A> <665A> <B1DF>
+<665B> <665B> <D5AB>
+<665C> <665C> <D5AD>
+<665D> <665D> <B1DE>
+<665E> <665E> <B1E3>
+<665F> <665F> <D1D4>
+<6661> <6661> <D5AA>
+<6662> <6662> <D5AE>
+<6664> <6664> <B1E0>
+<6665> <6665> <D5A9>
+<6666> <6666> <B1E2>
+<6668> <6668> <B1E1>
+<666A> <666A> <D9A7>
+<666C> <666C> <D9A2>
+<666E> <666E> <B4B6>
+<666F> <666F> <B4BA>
+<6670> <6670> <B4B7>
+<6671> <6671> <D9A5>
+<6672> <6672> <D9A8>
+<6674> <6674> <B4B8>
+<6676> <6676> <B4B9>
+<6677> <6677> <B4BE>
+<6678> <6678> <DDC7>
+<6679> <6679> <D9A6>
+<667A> <667A> <B4BC>
+<667B> <667B> <D9A3>
+<667C> <667C> <D9A1>
+<667E> <667E> <B4BD>
+<6680> <6680> <D9A4>
+<6684> <6684> <B779>
+<6686> <6686> <DDBF>
+<6687> <6688> <B776>
+<6689> <6689> <B775>
+<668A> <668A> <DDC4>
+<668B> <668B> <DDC3>
+<668C> <668C> <DDC0>
+<668D> <668D> <B77B>
+<6690> <6690> <DDC2>
+<6691> <6691> <B4BB>
+<6694> <6694> <DDC6>
+<6695> <6695> <DDC1>
+<6696> <6696> <B778>
+<6697> <6697> <B774>
+<6698> <6698> <B77A>
+<6699> <6699> <DDC5>
+<669D> <669D> <BA5C>
+<669F> <669F> <E1F8>
+<66A0> <66A0> <E1F7>
+<66A1> <66A1> <E1F6>
+<66A2> <66A2> <BA5A>
+<66A8> <66A8> <BA5B>
+<66A9> <66A9> <E5C5>
+<66AA> <66AA> <E5C8>
+<66AB> <66AB> <BCC8>
+<66AE> <66AE> <BCC7>
+<66AF> <66AF> <E5C9>
+<66B0> <66B0> <E5C4>
+<66B1> <66B1> <BCCA>
+<66B2> <66B2> <E5C6>
+<66B4> <66B4> <BCC9>
+<66B5> <66B5> <E5C3>
+<66B7> <66B7> <E5C7>
+<66B8> <66B8> <BEE9>
+<66B9> <66B9> <BEE6>
+<66BA> <66BA> <E9BB>
+<66BB> <66BB> <E9BA>
+<66BD> <66BD> <E9B9>
+<66BE> <66BE> <E9B4>
+<66C0> <66C0> <E9B5>
+<66C4> <66C4> <BEE7>
+<66C6> <66C6> <BEE4>
+<66C7> <66C7> <BEE8>
+<66C8> <66C8> <E9B3>
+<66C9> <66C9> <BEE5>
+<66CA> <66CB> <E9B6>
+<66CC> <66CC> <E9BC>
+<66CF> <66CF> <E9B8>
+<66D2> <66D2> <ECF2>
+<66D6> <66D6> <C0C7>
+<66D8> <66D8> <EFDC>
+<66D9> <66D9> <C0C6>
+<66DA> <66DB> <EFDA>
+<66DC> <66DC> <C260>
+<66DD> <66DD> <C36E>
+<66DE> <66DE> <F24B>
+<66E0> <66E0> <C36D>
+<66E3> <66E4> <F451>
+<66E6> <66E6> <C466>
+<66E8> <66E8> <F450>
+<66E9> <66E9> <C4E4>
+<66EB> <66EB> <F7DF>
+<66EC> <66EC> <C5CE>
+endbfrange
+
+100 beginbfrange
+<66ED> <66EE> <F8AA>
+<66F0> <66F0> <A4EA>
+<66F2> <66F3> <A6B1>
+<66F4> <66F4> <A7F3>
+<66F6> <66F6> <CCD1>
+<66F7> <66F7> <AC54>
+<66F8> <66F8> <AED1>
+<66F9> <66F9> <B1E4>
+<66FC> <66FC> <B0D2>
+<66FE> <66FF> <B4BF>
+<6700> <6700> <B3CC>
+<6701> <6701> <D9A9>
+<6703> <6703> <B77C>
+<6704> <6704> <E1FA>
+<6705> <6705> <E1F9>
+<6708> <6708> <A4EB>
+<6709> <6709> <A6B3>
+<670A> <670A> <CCD2>
+<670B> <670B> <AA42>
+<670D> <670D> <AA41>
+<670F> <6710> <CEF9>
+<6712> <6713> <D1D7>
+<6714> <6715> <AED2>
+<6717> <6717> <AED4>
+<6718> <6718> <D5AF>
+<671B> <671B> <B1E6>
+<671D> <671D> <B4C2>
+<671F> <671F> <B4C1>
+<6720> <6720> <DDC8>
+<6721> <6721> <DF7A>
+<6722> <6722> <E1FB>
+<6723> <6723> <E9BD>
+<6726> <6726> <C261>
+<6727> <6727> <C467>
+<6728> <6728> <A4EC>
+<672A> <672B> <A5BC>
+<672C> <672C> <A5BB>
+<672D> <672D> <A5BE>
+<672E> <672E> <A5BA>
+<6731> <6731> <A6B6>
+<6733> <6733> <C9F6>
+<6734> <6734> <A6B5>
+<6735> <6735> <A6B7>
+<6738> <6738> <C9F1>
+<6739> <6739> <C9F0>
+<673A> <673A> <C9F3>
+<673B> <673B> <C9F2>
+<673C> <673C> <C9F5>
+<673D> <673D> <A6B4>
+<673E> <673E> <C9EF>
+<673F> <673F> <C9F4>
+<6745> <6745> <CAFD>
+<6746> <6746> <A7FD>
+<6747> <6747> <CAFE>
+<6748> <6748> <CB43>
+<6749> <6749> <A7FC>
+<674B> <674B> <CB47>
+<674C> <674C> <CB42>
+<674D> <674D> <CB45>
+<674E> <6751> <A7F5>
+<6753> <6753> <A840>
+<6755> <6755> <CB41>
+<6756> <6756> <A7FA>
+<6757> <6757> <A841>
+<6759> <6759> <CB40>
+<675A> <675A> <CB46>
+<675C> <675C> <A7F9>
+<675D> <675D> <CB44>
+<675E> <675E> <A7FB>
+<675F> <675F> <A7F4>
+<6760> <6760> <A7FE>
+<676A> <676A> <AA57>
+<676C> <676C> <CCD4>
+<676D> <676D> <AA43>
+<676F> <6770> <AA4D>
+<6771> <6771> <AA46>
+<6772> <6772> <AA58>
+<6773> <6773> <AA48>
+<6774> <6774> <CCDC>
+<6775> <6775> <AA53>
+<6776> <6776> <CCD7>
+<6777> <6777> <AA49>
+<6778> <6779> <CCE6>
+<677A> <677A> <CCDF>
+<677B> <677B> <CCD8>
+<677C> <677C> <AA56>
+<677D> <677D> <CCE4>
+<677E> <677E> <AA51>
+<677F> <677F> <AA4F>
+<6781> <6781> <CCE5>
+<6783> <6783> <CCE3>
+<6784> <6784> <CCDB>
+<6785> <6785> <CCD3>
+<6786> <6786> <CCDA>
+<6787> <6787> <AA4A>
+<6789> <6789> <AA50>
+<678B> <678B> <AA44>
+<678C> <678C> <CCDE>
+<678D> <678D> <CCDD>
+<678E> <678E> <CCD5>
+endbfrange
+
+100 beginbfrange
+<6790> <6790> <AA52>
+<6791> <6791> <CCE1>
+<6792> <6792> <CCD6>
+<6793> <6793> <AA55>
+<6794> <6794> <CCE8>
+<6795> <6795> <AA45>
+<6797> <6797> <AA4C>
+<6798> <6798> <CCD9>
+<6799> <6799> <CCE2>
+<679A> <679A> <AA54>
+<679C> <679C> <AA47>
+<679D> <679D> <AA4B>
+<679F> <679F> <CCE0>
+<67AE> <67AE> <CF5B>
+<67AF> <67AF> <AC5C>
+<67B0> <67B0> <AC69>
+<67B2> <67B2> <CF56>
+<67B3> <67B3> <CF4C>
+<67B4> <67B4> <AC62>
+<67B5> <67B5> <CF4A>
+<67B6> <67B6> <AC5B>
+<67B7> <67B7> <CF45>
+<67B8> <67B8> <AC65>
+<67B9> <67B9> <CF52>
+<67BA> <67BA> <CEFE>
+<67BB> <67BB> <CF41>
+<67C0> <67C0> <CF44>
+<67C1> <67C1> <CEFB>
+<67C2> <67C2> <CF51>
+<67C3> <67C3> <CF61>
+<67C4> <67C4> <AC60>
+<67C5> <67C5> <CF46>
+<67C6> <67C6> <CF58>
+<67C8> <67C8> <CEFD>
+<67C9> <67CA> <CF5F>
+<67CB> <67CB> <CF63>
+<67CC> <67CC> <CF5A>
+<67CD> <67CD> <CF4B>
+<67CE> <67CE> <CF53>
+<67CF> <67CF> <AC66>
+<67D0> <67D0> <AC59>
+<67D1> <67D1> <AC61>
+<67D2> <67D2> <AC6D>
+<67D3> <67D3> <AC56>
+<67D4> <67D4> <AC58>
+<67D8> <67D8> <CF43>
+<67D9> <67D9> <AC6A>
+<67DA> <67DA> <AC63>
+<67DB> <67DB> <CF5D>
+<67DC> <67DC> <CF40>
+<67DD> <67DD> <AC6C>
+<67DE> <67DE> <AC67>
+<67DF> <67DF> <CF49>
+<67E2> <67E2> <AC6B>
+<67E3> <67E3> <CF50>
+<67E4> <67E4> <CF48>
+<67E5> <67E5> <AC64>
+<67E6> <67E6> <CF5C>
+<67E7> <67E7> <CF54>
+<67E9> <67E9> <AC5E>
+<67EA> <67EA> <CF62>
+<67EB> <67EB> <CF47>
+<67EC> <67EC> <AC5A>
+<67ED> <67ED> <CF59>
+<67EE> <67EE> <CF4F>
+<67EF> <67EF> <AC5F>
+<67F0> <67F0> <CF55>
+<67F1> <67F1> <AC57>
+<67F2> <67F2> <CEFC>
+<67F3> <67F3> <AC68>
+<67F4> <67F4> <AEE3>
+<67F5> <67F5> <AC5D>
+<67F6> <67F6> <CF4E>
+<67F7> <67F7> <CF4D>
+<67F8> <67F8> <CF42>
+<67FA> <67FA> <CF5E>
+<67FC> <67FC> <CF57>
+<67FF> <67FF> <AC55>
+<6812> <6812> <D1EC>
+<6813> <6813> <AEEA>
+<6814> <6814> <D1ED>
+<6816> <6816> <D1E1>
+<6817> <6817> <AEDF>
+<6818> <6818> <AEEB>
+<681A> <681A> <D1DA>
+<681C> <681C> <D1E3>
+<681D> <681D> <D1EB>
+<681F> <681F> <D1D9>
+<6820> <6820> <D1F4>
+<6821> <6821> <AED5>
+<6825> <6825> <D1F3>
+<6826> <6826> <D1EE>
+<6828> <6828> <D1EF>
+<6829> <6829> <AEDD>
+<682A> <682A> <AEE8>
+<682B> <682B> <D1E5>
+<682D> <682D> <D1E6>
+<682E> <682E> <D1F0>
+<682F> <682F> <D1E7>
+<6831> <6831> <D1E2>
+endbfrange
+
+100 beginbfrange
+<6832> <6833> <D1DC>
+<6834> <6834> <D1EA>
+<6835> <6835> <D1E4>
+<6838> <6838> <AED6>
+<6839> <6839> <AEDA>
+<683A> <683A> <D1F2>
+<683B> <683B> <D1DE>
+<683C> <683C> <AEE6>
+<683D> <683D> <AEE2>
+<6840> <6840> <AEE5>
+<6841> <6841> <AEEC>
+<6842> <6842> <AEDB>
+<6843> <6843> <AEE7>
+<6844> <6844> <D1E9>
+<6845> <6845> <AEE9>
+<6846> <6846> <AED8>
+<6848> <6848> <AED7>
+<6849> <6849> <D1DB>
+<684B> <684B> <D1DF>
+<684C> <684C> <AEE0>
+<684D> <684D> <D1F1>
+<684E> <684E> <D1E8>
+<684F> <684F> <D1E0>
+<6850> <6850> <AEE4>
+<6851> <6851> <AEE1>
+<6853> <6853> <AED9>
+<6854> <6854> <AEDC>
+<686B> <686B> <D5C4>
+<686D> <686E> <D5B4>
+<686F> <686F> <D5B9>
+<6871> <6871> <D5C8>
+<6872> <6872> <D5C5>
+<6874> <6874> <D5BE>
+<6875> <6875> <D5BD>
+<6876> <6876> <B1ED>
+<6877> <6877> <D5C1>
+<6878> <6878> <D5D0>
+<6879> <6879> <D5B0>
+<687B> <687B> <D5D1>
+<687C> <687C> <D5C3>
+<687D> <687D> <D5D5>
+<687E> <687E> <D5C9>
+<687F> <687F> <B1EC>
+<6880> <6880> <D5C7>
+<6881> <6881> <B1E7>
+<6882> <6882> <B1FC>
+<6883> <6883> <B1F2>
+<6885> <6885> <B1F6>
+<6886> <6886> <B1F5>
+<6887> <6887> <D5B1>
+<6889> <6889> <D5CE>
+<688A> <688A> <D5D4>
+<688B> <688B> <D5CC>
+<688C> <688C> <D5D3>
+<688F> <688F> <D5C0>
+<6890> <6890> <D5B2>
+<6891> <6891> <D5D2>
+<6892> <6892> <D5C2>
+<6893> <6893> <B1EA>
+<6894> <6894> <B1F7>
+<6896> <6896> <D5CB>
+<6897> <6897> <B1F0>
+<689B> <689B> <D5CA>
+<689C> <689C> <D5B3>
+<689D> <689D> <B1F8>
+<689F> <689F> <B1FA>
+<68A0> <68A0> <D5CD>
+<68A1> <68A1> <B1FB>
+<68A2> <68A2> <B1E9>
+<68A3> <68A3> <D5BA>
+<68A4> <68A4> <D5CF>
+<68A7> <68A7> <B1EF>
+<68A8> <68A8> <B1F9>
+<68A9> <68A9> <D5BC>
+<68AA> <68AA> <D5C6>
+<68AB> <68AB> <D5B7>
+<68AC> <68AC> <D5BB>
+<68AD> <68AD> <B1F4>
+<68AE> <68AE> <D5B6>
+<68AF> <68AF> <B1E8>
+<68B0> <68B0> <B1F1>
+<68B1> <68B1> <B1EE>
+<68B2> <68B2> <D5BF>
+<68B3> <68B3> <AEDE>
+<68B4> <68B4> <D9C0>
+<68B5> <68B5> <B1EB>
+<68C4> <68C4> <B1F3>
+<68C6> <68C6> <D9C3>
+<68C7> <68C7> <D9D9>
+<68C8> <68C8> <D9CE>
+<68C9> <68C9> <B4D6>
+<68CB> <68CB> <B4D1>
+<68CC> <68CC> <D9BD>
+<68CD> <68CD> <B4D2>
+<68CE> <68CE> <D9CD>
+<68D0> <68D0> <D9C6>
+<68D1> <68D1> <D9D3>
+<68D2> <68D2> <B4CE>
+<68D3> <68D3> <D9AB>
+<68D4> <68D4> <D9D5>
+endbfrange
+
+100 beginbfrange
+<68D5> <68D5> <B4C4>
+<68D6> <68D6> <D9B3>
+<68D7> <68D7> <B4C7>
+<68D8> <68D8> <B4C6>
+<68DA> <68DA> <B4D7>
+<68DC> <68DC> <D9AD>
+<68DD> <68DE> <D9CF>
+<68DF> <68DF> <B4C9>
+<68E0> <68E0> <B4C5>
+<68E1> <68E1> <D9BB>
+<68E3> <68E3> <B4D0>
+<68E4> <68E4> <D9B6>
+<68E6> <68E6> <D9D1>
+<68E7> <68E7> <B4CC>
+<68E8> <68E8> <D9C9>
+<68E9> <68E9> <D9D6>
+<68EA> <68EA> <D9B0>
+<68EB> <68EB> <D9B5>
+<68EC> <68EC> <D9AF>
+<68EE> <68EE> <B4CB>
+<68EF> <68EF> <D9C2>
+<68F0> <68F0> <DDDE>
+<68F1> <68F1> <D9B1>
+<68F2> <68F2> <B4CF>
+<68F3> <68F3> <D9BA>
+<68F4> <68F4> <D9D2>
+<68F5> <68F5> <B4CA>
+<68F6> <68F6> <D9B7>
+<68F7> <68F7> <D9B4>
+<68F8> <68F8> <D9C5>
+<68F9> <68F9> <B4CD>
+<68FA> <68FA> <B4C3>
+<68FB> <68FB> <B4D9>
+<68FC> <68FC> <D9C8>
+<68FD> <68FD> <D9C7>
+<6904> <6904> <D9AC>
+<6905> <6905> <B4C8>
+<6906> <6906> <D9D4>
+<6907> <6907> <D9BC>
+<6908> <6908> <D9BE>
+<690A> <690A> <D9CB>
+<690B> <690B> <D9CA>
+<690C> <690C> <D9AA>
+<690D> <690D> <B4D3>
+<690E> <690E> <B4D5>
+<690F> <690F> <D9B2>
+<6910> <6910> <D9B9>
+<6911> <6911> <D9C1>
+<6912> <6912> <B4D4>
+<6913> <6913> <D9B8>
+<6914> <6914> <D9C4>
+<6915> <6915> <D9D7>
+<6917> <6917> <D9CC>
+<6925> <6925> <D9D8>
+<692A> <692A> <D9AE>
+<692F> <692F> <DDF2>
+<6930> <6930> <B7A6>
+<6932> <6932> <DDF0>
+<6933> <6933> <DDDB>
+<6934> <6934> <DDE0>
+<6935> <6935> <DDD9>
+<6937> <6937> <DDEC>
+<6938> <6938> <DDCB>
+<6939> <6939> <DDD2>
+<693B> <693B> <DDEA>
+<693C> <693C> <DDF4>
+<693D> <693D> <DDDC>
+<693F> <693F> <DDCF>
+<6940> <6940> <DDE2>
+<6941> <6941> <DDE7>
+<6942> <6942> <DDD3>
+<6944> <6944> <DDE4>
+<6945> <6945> <DDD0>
+<6948> <6949> <DDD7>
+<694A> <694A> <B7A8>
+<694B> <694B> <DDEB>
+<694C> <694C> <DDE9>
+<694E> <694E> <DDCC>
+<694F> <694F> <DDEE>
+<6951> <6951> <DDEF>
+<6952> <6952> <DDF1>
+<6953> <6953> <B7AC>
+<6954> <6954> <B7A4>
+<6956> <6956> <D5B8>
+<6957> <6957> <DDD4>
+<6958> <6958> <DDE6>
+<6959> <6959> <DDD5>
+<695A> <695A> <B7A1>
+<695B> <695B> <B7B1>
+<695C> <695C> <DDED>
+<695D> <695D> <B7AF>
+<695E> <695E> <B7AB>
+<695F> <695F> <DDCA>
+<6960> <6960> <B7A3>
+<6962> <6962> <DDCD>
+<6963> <6963> <B7B0>
+<6965> <6965> <DDDD>
+<6966> <6966> <DDC9>
+<6968> <6968> <B7A9>
+<6969> <6969> <DDE1>
+endbfrange
+
+100 beginbfrange
+<696A> <696A> <DDD1>
+<696B> <696B> <B7AA>
+<696C> <696C> <DDDA>
+<696D> <696D> <B77E>
+<696E> <696E> <B4D8>
+<696F> <696F> <DDE3>
+<6970> <6970> <D9BF>
+<6971> <6971> <DDCE>
+<6974> <6974> <DDE8>
+<6975> <6975> <B7A5>
+<6976> <6976> <DDE5>
+<6977> <6977> <B7A2>
+<6978> <6978> <DDDF>
+<6979> <6979> <B7AD>
+<697A> <697A> <DDD6>
+<697B> <697B> <DDF3>
+<6982> <6982> <B7A7>
+<6983> <6983> <DEC6>
+<6986> <6986> <B7AE>
+<698D> <698D> <E24A>
+<698E> <698E> <E248>
+<6990> <6990> <E25E>
+<6991> <6991> <E246>
+<6993> <6993> <E258>
+<6994> <6994> <B77D>
+<6995> <6995> <BA5F>
+<6996> <6996> <E242>
+<6997> <6997> <E25D>
+<6999> <6999> <E247>
+<699A> <699A> <E255>
+<699B> <699B> <BA64>
+<699C> <699C> <BA5D>
+<699E> <699E> <E25B>
+<69A0> <69A0> <E240>
+<69A1> <69A1> <E25A>
+<69A3> <69A3> <BA6F>
+<69A4> <69A4> <E251>
+<69A5> <69A5> <E261>
+<69A6> <69A6> <BA6D>
+<69A7> <69A7> <E249>
+<69A8> <69A8> <BA5E>
+<69A9> <69A9> <E24B>
+<69AA> <69AA> <E259>
+<69AB> <69AB> <BA67>
+<69AC> <69AC> <E244>
+<69AD> <69AD> <BA6B>
+<69AE> <69AE> <BA61>
+<69AF> <69AF> <E24D>
+<69B0> <69B0> <E243>
+<69B1> <69B1> <E1FC>
+<69B3> <69B3> <E257>
+<69B4> <69B4> <BA68>
+<69B5> <69B5> <E260>
+<69B6> <69B6> <E1FD>
+<69B7> <69B7> <BA65>
+<69B9> <69B9> <E253>
+<69BB> <69BB> <BA66>
+<69BC> <69BC> <E245>
+<69BD> <69BD> <E250>
+<69BE> <69BE> <E24C>
+<69BF> <69BF> <E24E>
+<69C1> <69C1> <BA60>
+<69C2> <69C2> <E25F>
+<69C3> <69C3> <BA6E>
+<69C4> <69C4> <E24F>
+<69C6> <69C6> <E262>
+<69C9> <69C9> <E1FE>
+<69CA> <69CA> <E254>
+<69CB> <69CB> <BA63>
+<69CC> <69CC> <BA6C>
+<69CD> <69CD> <BA6A>
+<69CE> <69CE> <E241>
+<69CF> <69CF> <E256>
+<69D0> <69D0> <BA69>
+<69D3> <69D3> <BA62>
+<69D4> <69D4> <E252>
+<69D9> <69D9> <E25C>
+<69E2> <69E2> <E5D5>
+<69E4> <69E4> <E5D1>
+<69E5> <69E5> <E5CD>
+<69E6> <69E6> <E5E1>
+<69E7> <69E7> <E5DE>
+<69E8> <69E8> <BCCD>
+<69EB> <69EB> <E5E5>
+<69EC> <69EC> <E5D4>
+<69ED> <69ED> <BCD8>
+<69EE> <69EE> <E5DB>
+<69F1> <69F1> <E5D0>
+<69F2> <69F2> <E5DA>
+<69F3> <69F3> <BCD5>
+<69F4> <69F4> <E5EE>
+<69F6> <69F6> <E5EB>
+<69F7> <69F7> <E5DD>
+<69F8> <69F8> <E5CE>
+<69FB> <69FB> <E5E2>
+<69FC> <69FC> <E5E4>
+<69FD> <69FD> <BCD1>
+<69FE> <69FE> <E5D8>
+<69FF> <69FF> <E5D3>
+<6A00> <6A00> <E5CA>
+endbfrange
+
+100 beginbfrange
+<6A01> <6A01> <BCCE>
+<6A02> <6A02> <BCD6>
+<6A04> <6A04> <E5E7>
+<6A05> <6A05> <BCD7>
+<6A06> <6A06> <E5CB>
+<6A07> <6A07> <E5ED>
+<6A08> <6A08> <E5E0>
+<6A09> <6A09> <E5E6>
+<6A0A> <6A0A> <BCD4>
+<6A0D> <6A0D> <E5E3>
+<6A0F> <6A0F> <E5EA>
+<6A11> <6A11> <BCD9>
+<6A13> <6A13> <BCD3>
+<6A14> <6A14> <E5DC>
+<6A15> <6A15> <E5CF>
+<6A16> <6A16> <E5EF>
+<6A17> <6A17> <E5CC>
+<6A18> <6A18> <E5E8>
+<6A19> <6A19> <BCD0>
+<6A1B> <6A1B> <E5D6>
+<6A1D> <6A1D> <E5D7>
+<6A1E> <6A1E> <BCCF>
+<6A1F> <6A1F> <BCCC>
+<6A20> <6A20> <E5D2>
+<6A21> <6A21> <BCD2>
+<6A23> <6A23> <BCCB>
+<6A25> <6A25> <E5E9>
+<6A26> <6A26> <E5EC>
+<6A27> <6A27> <E5D9>
+<6A28> <6A28> <E9CA>
+<6A32> <6A32> <E9C2>
+<6A34> <6A34> <E9BE>
+<6A35> <6A35> <BEF6>
+<6A38> <6A38> <BEEB>
+<6A39> <6A39> <BEF0>
+<6A3A> <6A3A> <BEEC>
+<6A3B> <6A3B> <E9CC>
+<6A3C> <6A3C> <E9D7>
+<6A3D> <6A3D> <BEEA>
+<6A3E> <6A3E> <E9C4>
+<6A3F> <6A3F> <E9CD>
+<6A40> <6A40> <E5DF>
+<6A41> <6A41> <E9CE>
+<6A44> <6A44> <BEF1>
+<6A46> <6A46> <E9DD>
+<6A47> <6A47> <BEF5>
+<6A48> <6A48> <BEF8>
+<6A49> <6A49> <E9C0>
+<6A4B> <6A4B> <BEF4>
+<6A4D> <6A4E> <E9DB>
+<6A4F> <6A4F> <E9D2>
+<6A50> <6A50> <E9D1>
+<6A51> <6A51> <E9C9>
+<6A54> <6A54> <E9D3>
+<6A55> <6A55> <E9DA>
+<6A56> <6A56> <E9D9>
+<6A58> <6A58> <BEEF>
+<6A59> <6A59> <BEED>
+<6A5A> <6A5A> <E9CB>
+<6A5B> <6A5B> <E9C8>
+<6A5D> <6A5D> <E9C5>
+<6A5E> <6A5E> <E9D8>
+<6A5F> <6A5F> <BEF7>
+<6A60> <6A60> <E9D6>
+<6A61> <6A61> <BEF3>
+<6A62> <6A62> <BEF2>
+<6A64> <6A64> <E9D0>
+<6A66> <6A66> <E9BF>
+<6A67> <6A67> <E9C1>
+<6A68> <6A68> <E9C3>
+<6A69> <6A69> <E9D5>
+<6A6A> <6A6A> <E9CF>
+<6A6B> <6A6B> <BEEE>
+<6A6D> <6A6D> <E9C6>
+<6A6F> <6A6F> <E9D4>
+<6A76> <6A76> <E9C7>
+<6A7E> <6A7E> <C0CF>
+<6A7F> <6A7F> <ED45>
+<6A80> <6A80> <C0C8>
+<6A81> <6A81> <ECF5>
+<6A83> <6A83> <ED41>
+<6A84> <6A84> <C0CA>
+<6A85> <6A85> <ED48>
+<6A87> <6A87> <ECFC>
+<6A89> <6A89> <ECF7>
+<6A8C> <6A8C> <ED49>
+<6A8D> <6A8D> <ECF3>
+<6A8E> <6A8E> <ECFE>
+<6A90> <6A90> <C0D1>
+<6A91> <6A91> <ED44>
+<6A92> <6A92> <ED4A>
+<6A93> <6A93> <ECFD>
+<6A94> <6A94> <C0C9>
+<6A95> <6A95> <ED40>
+<6A96> <6A96> <ECF4>
+<6A97> <6A97> <C0D0>
+<6A9A> <6A9A> <ED47>
+<6A9B> <6A9B> <ECF9>
+<6A9C> <6A9C> <C0CC>
+<6A9E> <6A9E> <ECFB>
+endbfrange
+
+100 beginbfrange
+<6A9F> <6A9F> <ECF8>
+<6AA0> <6AA0> <C0D2>
+<6AA1> <6AA1> <ECFA>
+<6AA2> <6AA2> <C0CB>
+<6AA3> <6AA3> <C0CE>
+<6AA4> <6AA4> <ED43>
+<6AA5> <6AA5> <ECF6>
+<6AA6> <6AA6> <ED46>
+<6AA8> <6AA8> <ED42>
+<6AAC> <6AAC> <C263>
+<6AAD> <6AAD> <EFE7>
+<6AAE> <6AAF> <C268>
+<6AB3> <6AB3> <C262>
+<6AB4> <6AB4> <EFE6>
+<6AB6> <6AB7> <EFE3>
+<6AB8> <6AB8> <C266>
+<6AB9> <6AB9> <EFDE>
+<6ABA> <6ABA> <EFE2>
+<6ABB> <6ABB> <C265>
+<6ABD> <6ABD> <EFDF>
+<6AC2> <6AC2> <C267>
+<6AC3> <6AC3> <C264>
+<6AC5> <6AC5> <EFDD>
+<6AC6> <6AC6> <EFE1>
+<6AC7> <6AC7> <EFE5>
+<6ACB> <6ACB> <F251>
+<6ACC> <6ACC> <F24E>
+<6ACD> <6ACD> <F257>
+<6ACF> <6ACF> <F256>
+<6AD0> <6AD0> <F254>
+<6AD1> <6AD1> <F24F>
+<6AD3> <6AD3> <C372>
+<6AD9> <6AD9> <F250>
+<6ADA> <6ADA> <C371>
+<6ADB> <6ADB> <C0CD>
+<6ADC> <6ADC> <F253>
+<6ADD> <6ADD> <C370>
+<6ADE> <6ADE> <F258>
+<6ADF> <6ADF> <F252>
+<6AE0> <6AE0> <F24D>
+<6AE1> <6AE1> <EFE0>
+<6AE5> <6AE5> <C36F>
+<6AE7> <6AE7> <F24C>
+<6AE8> <6AE8> <F456>
+<6AEA> <6AEA> <F455>
+<6AEB> <6AEB> <F255>
+<6AEC> <6AEC> <C468>
+<6AEE> <6AEF> <F459>
+<6AF0> <6AF0> <F454>
+<6AF1> <6AF1> <F458>
+<6AF3> <6AF3> <F453>
+<6AF8> <6AF8> <F5D1>
+<6AF9> <6AF9> <F457>
+<6AFA> <6AFA> <C4E7>
+<6AFB> <6AFB> <C4E5>
+<6AFC> <6AFC> <F5CF>
+<6B00> <6B00> <F5D2>
+<6B02> <6B02> <F5CE>
+<6B03> <6B03> <F5D0>
+<6B04> <6B04> <C4E6>
+<6B08> <6B09> <F6E5>
+<6B0A> <6B0A> <C576>
+<6B0B> <6B0B> <F6E4>
+<6B0F> <6B0F> <F7E2>
+<6B10> <6B10> <C5CF>
+<6B11> <6B12> <F7E0>
+<6B13> <6B13> <F8AC>
+<6B16> <6B16> <C656>
+<6B17> <6B17> <F8F3>
+<6B18> <6B19> <F8F1>
+<6B1A> <6B1A> <F8F4>
+<6B1E> <6B1E> <F9BB>
+<6B20> <6B20> <A4ED>
+<6B21> <6B21> <A6B8>
+<6B23> <6B23> <AA59>
+<6B25> <6B25> <CCE9>
+<6B28> <6B28> <CF64>
+<6B2C> <6B2C> <D1F5>
+<6B2D> <6B2D> <D1F7>
+<6B2F> <6B2F> <D1F6>
+<6B31> <6B31> <D1F8>
+<6B32> <6B32> <B1FD>
+<6B33> <6B33> <D5D7>
+<6B34> <6B34> <D1F9>
+<6B36> <6B36> <D5D6>
+<6B37> <6B38> <D5D8>
+<6B39> <6B39> <D9DA>
+<6B3A> <6B3A> <B4DB>
+<6B3B> <6B3B> <D9DB>
+<6B3C> <6B3C> <D9DD>
+<6B3D> <6B3D> <B4DC>
+<6B3E> <6B3E> <B4DA>
+<6B3F> <6B3F> <D9DC>
+<6B41> <6B41> <DDFA>
+<6B42> <6B42> <DDF8>
+<6B43> <6B43> <DDF7>
+<6B45> <6B45> <DDF6>
+<6B46> <6B46> <DDF5>
+<6B47> <6B47> <B7B2>
+<6B48> <6B48> <DDF9>
+endbfrange
+
+100 beginbfrange
+<6B49> <6B49> <BA70>
+<6B4A> <6B4A> <E263>
+<6B4B> <6B4B> <E265>
+<6B4C> <6B4C> <BA71>
+<6B4D> <6B4D> <E264>
+<6B4E> <6B4E> <BCDB>
+<6B50> <6B50> <BCDA>
+<6B51> <6B51> <E5F0>
+<6B54> <6B54> <E9DF>
+<6B55> <6B55> <E9DE>
+<6B56> <6B56> <E9E0>
+<6B59> <6B59> <BEF9>
+<6B5B> <6B5B> <ED4B>
+<6B5C> <6B5C> <C0D3>
+<6B5E> <6B5E> <EFE8>
+<6B5F> <6B5F> <C26A>
+<6B60> <6B60> <F259>
+<6B61> <6B61> <C577>
+<6B62> <6B62> <A4EE>
+<6B63> <6B63> <A5BF>
+<6B64> <6B64> <A6B9>
+<6B65> <6B65> <A842>
+<6B66> <6B67> <AA5A>
+<6B6A> <6B6A> <AC6E>
+<6B6D> <6B6D> <D1FA>
+<6B72> <6B72> <B7B3>
+<6B76> <6B76> <E6D1>
+<6B77> <6B77> <BEFA>
+<6B78> <6B78> <C26B>
+<6B79> <6B79> <A4EF>
+<6B7B> <6B7B> <A6BA>
+<6B7E> <6B7E> <CCEB>
+<6B7F> <6B7F> <AA5C>
+<6B80> <6B80> <CCEA>
+<6B82> <6B82> <CF65>
+<6B83> <6B83> <AC6F>
+<6B84> <6B84> <CF66>
+<6B86> <6B86> <AC70>
+<6B88> <6B88> <D1FC>
+<6B89> <6B89> <AEEE>
+<6B8A> <6B8A> <AEED>
+<6B8C> <6B8C> <D5DE>
+<6B8D> <6B8E> <D5DC>
+<6B8F> <6B8F> <D5DB>
+<6B91> <6B91> <D5DA>
+<6B94> <6B94> <D9DE>
+<6B95> <6B95> <D9E1>
+<6B96> <6B96> <B4DE>
+<6B97> <6B97> <D9DF>
+<6B98> <6B98> <B4DD>
+<6B99> <6B99> <D9E0>
+<6B9B> <6B9B> <DDFB>
+<6B9E> <6BA0> <E266>
+<6BA2> <6BA2> <E5F3>
+<6BA3> <6BA3> <E5F2>
+<6BA4> <6BA4> <BCDC>
+<6BA5> <6BA5> <E5F1>
+<6BA6> <6BA6> <E5F4>
+<6BA7> <6BA7> <E9E1>
+<6BAA> <6BAB> <E9E2>
+<6BAD> <6BAD> <ED4C>
+<6BAE> <6BAE> <C0D4>
+<6BAF> <6BAF> <C26C>
+<6BB0> <6BB0> <F25A>
+<6BB2> <6BB2> <C4E8>
+<6BB3> <6BB3> <C95F>
+<6BB5> <6BB5> <AC71>
+<6BB6> <6BB6> <CF67>
+<6BB7> <6BB7> <AEEF>
+<6BBA> <6BBA> <B1FE>
+<6BBC> <6BBC> <B4DF>
+<6BBD> <6BBD> <D9E2>
+<6BBF> <6BBF> <B7B5>
+<6BC0> <6BC0> <B7B4>
+<6BC3> <6BC4> <E269>
+<6BC5> <6BC6> <BCDD>
+<6BC7> <6BC7> <E9E5>
+<6BC8> <6BC8> <E9E4>
+<6BC9> <6BC9> <EFE9>
+<6BCA> <6BCA> <F7E3>
+<6BCB> <6BCB> <A4F0>
+<6BCC> <6BCC> <C960>
+<6BCD> <6BCD> <A5C0>
+<6BCF> <6BCF> <A843>
+<6BD0> <6BD0> <CB48>
+<6BD2> <6BD2> <AC72>
+<6BD3> <6BD3> <B7B6>
+<6BD4> <6BD4> <A4F1>
+<6BD6> <6BD6> <CF68>
+<6BD7> <6BD7> <AC73>
+<6BD8> <6BD8> <CF69>
+<6BDA> <6BDA> <C0D5>
+<6BDB> <6BDB> <A4F2>
+<6BDE> <6BDE> <CCEC>
+<6BE0> <6BE0> <CF6A>
+<6BE2> <6BE2> <D242>
+<6BE3> <6BE3> <D241>
+<6BE4> <6BE4> <D1FE>
+<6BE6> <6BE6> <D1FD>
+<6BE7> <6BE7> <D243>
+endbfrange
+
+100 beginbfrange
+<6BE8> <6BE8> <D240>
+<6BEB> <6BEC> <B240>
+<6BEF> <6BEF> <B4E0>
+<6BF0> <6BF0> <D9E3>
+<6BF2> <6BF3> <D9E4>
+<6BF7> <6BF8> <DE41>
+<6BF9> <6BF9> <DE40>
+<6BFB> <6BFC> <DDFD>
+<6BFD> <6BFD> <B7B7>
+<6BFE> <6BFE> <E26B>
+<6BFF> <6BFF> <E5F7>
+<6C00> <6C00> <E5F6>
+<6C01> <6C01> <E5F5>
+<6C02> <6C02> <E5F8>
+<6C03> <6C03> <E9E7>
+<6C04> <6C04> <E9E6>
+<6C05> <6C05> <BEFB>
+<6C06> <6C06> <E9E8>
+<6C08> <6C08> <C0D6>
+<6C09> <6C09> <ED4D>
+<6C0B> <6C0B> <EFEA>
+<6C0C> <6C0C> <F25B>
+<6C0D> <6C0D> <F6E7>
+<6C0F> <6C0F> <A4F3>
+<6C10> <6C10> <A5C2>
+<6C11> <6C11> <A5C1>
+<6C13> <6C13> <AA5D>
+<6C14> <6C14> <C961>
+<6C15> <6C15> <C97E>
+<6C16> <6C16> <A6BB>
+<6C18> <6C18> <C9F7>
+<6C19> <6C1A> <CB49>
+<6C1B> <6C1B> <AA5E>
+<6C1D> <6C1D> <CCED>
+<6C1F> <6C1F> <AC74>
+<6C20> <6C21> <CF6B>
+<6C23> <6C23> <AEF0>
+<6C24> <6C24> <AEF4>
+<6C25> <6C25> <D244>
+<6C26> <6C26> <AEF3>
+<6C27> <6C28> <AEF1>
+<6C2A> <6C2A> <D5DF>
+<6C2B> <6C2B> <B242>
+<6C2C> <6C2C> <B4E3>
+<6C2E> <6C2F> <B4E1>
+<6C30> <6C30> <D9E6>
+<6C33> <6C33> <BA72>
+<6C34> <6C34> <A4F4>
+<6C36> <6C36> <C9A1>
+<6C38> <6C38> <A5C3>
+<6C3B> <6C3B> <C9A4>
+<6C3E> <6C3E> <A5C6>
+<6C3F> <6C3F> <C9A3>
+<6C40> <6C40> <A5C5>
+<6C41> <6C41> <A5C4>
+<6C42> <6C42> <A844>
+<6C43> <6C43> <C9A2>
+<6C46> <6C46> <C9F8>
+<6C4A> <6C4A> <C9FC>
+<6C4B> <6C4B> <C9FE>
+<6C4C> <6C4C> <CA40>
+<6C4D> <6C4E> <A6C5>
+<6C4F> <6C4F> <C9FB>
+<6C50> <6C50> <A6C1>
+<6C52> <6C52> <C9F9>
+<6C54> <6C54> <C9FD>
+<6C55> <6C55> <A6C2>
+<6C57> <6C57> <A6BD>
+<6C59> <6C59> <A6BE>
+<6C5B> <6C5B> <A6C4>
+<6C5C> <6C5C> <C9FA>
+<6C5D> <6C5D> <A6BC>
+<6C5E> <6C5E> <A845>
+<6C5F> <6C60> <A6BF>
+<6C61> <6C61> <A6C3>
+<6C65> <6C65> <CB5B>
+<6C66> <6C66> <CB59>
+<6C67> <6C67> <CB4C>
+<6C68> <6C68> <A851>
+<6C69> <6C69> <CB53>
+<6C6A> <6C6A> <A84C>
+<6C6B> <6C6B> <CB4D>
+<6C6D> <6C6D> <CB55>
+<6C6F> <6C6F> <CB52>
+<6C70> <6C70> <A84F>
+<6C71> <6C71> <CB51>
+<6C72> <6C72> <A856>
+<6C73> <6C73> <CB5A>
+<6C74> <6C74> <A858>
+<6C76> <6C76> <A85A>
+<6C78> <6C78> <CB4B>
+<6C7A> <6C7A> <A84D>
+<6C7B> <6C7B> <CB5C>
+<6C7D> <6C7D> <A854>
+<6C7E> <6C7E> <A857>
+<6C80> <6C80> <CD45>
+<6C81> <6C81> <A847>
+<6C82> <6C82> <A85E>
+<6C83> <6C83> <A855>
+<6C84> <6C84> <CB4E>
+endbfrange
+
+100 beginbfrange
+<6C85> <6C85> <A84A>
+<6C86> <6C86> <A859>
+<6C87> <6C87> <CB56>
+<6C88> <6C89> <A848>
+<6C8A> <6C8A> <CD43>
+<6C8B> <6C8B> <CB4F>
+<6C8C> <6C8C> <A850>
+<6C8D> <6C8D> <A85B>
+<6C8E> <6C8E> <CB5D>
+<6C8F> <6C8F> <CB50>
+<6C90> <6C90> <A84E>
+<6C92> <6C92> <A853>
+<6C93> <6C93> <CCEE>
+<6C94> <6C94> <A85C>
+<6C95> <6C95> <CB57>
+<6C96> <6C96> <A852>
+<6C98> <6C98> <A85D>
+<6C99> <6C99> <A846>
+<6C9A> <6C9A> <CB54>
+<6C9B> <6C9B> <A84B>
+<6C9C> <6C9C> <CB58>
+<6C9D> <6C9D> <CD44>
+<6CAB> <6CAB> <AA6A>
+<6CAC> <6CAC> <AA7A>
+<6CAD> <6CAD> <CCF5>
+<6CAE> <6CAE> <AA71>
+<6CB0> <6CB0> <CD4B>
+<6CB1> <6CB1> <AA62>
+<6CB3> <6CB3> <AA65>
+<6CB4> <6CB4> <CD42>
+<6CB6> <6CB6> <CCF3>
+<6CB7> <6CB7> <CCF7>
+<6CB8> <6CB8> <AA6D>
+<6CB9> <6CB9> <AA6F>
+<6CBA> <6CBA> <CCFA>
+<6CBB> <6CBB> <AA76>
+<6CBC> <6CBC> <AA68>
+<6CBD> <6CBE> <AA66>
+<6CBF> <6CBF> <AA75>
+<6CC0> <6CC0> <CD47>
+<6CC1> <6CC1> <AA70>
+<6CC2> <6CC2> <CCF9>
+<6CC3> <6CC3> <CCFB>
+<6CC4> <6CC4> <AA6E>
+<6CC5> <6CC5> <AA73>
+<6CC6> <6CC6> <CCFC>
+<6CC7> <6CC7> <CD4A>
+<6CC9> <6CC9> <AC75>
+<6CCA> <6CCA> <AA79>
+<6CCC> <6CCC> <AA63>
+<6CCD> <6CCD> <CD49>
+<6CCF> <6CCF> <CD4D>
+<6CD0> <6CD0> <CCF8>
+<6CD1> <6CD1> <CD4F>
+<6CD2> <6CD2> <CD40>
+<6CD3> <6CD3> <AA6C>
+<6CD4> <6CD4> <CCF4>
+<6CD5> <6CD5> <AA6B>
+<6CD6> <6CD6> <AA7D>
+<6CD7> <6CD7> <AA72>
+<6CD9> <6CD9> <CCF2>
+<6CDA> <6CDA> <CF75>
+<6CDB> <6CDB> <AA78>
+<6CDC> <6CDC> <AA7C>
+<6CDD> <6CDD> <CD41>
+<6CDE> <6CDE> <CD46>
+<6CE0> <6CE0> <AA7E>
+<6CE1> <6CE1> <AA77>
+<6CE2> <6CE2> <AA69>
+<6CE3> <6CE3> <AA5F>
+<6CE5> <6CE5> <AA64>
+<6CE7> <6CE7> <CCF6>
+<6CE8> <6CE8> <AA60>
+<6CE9> <6CE9> <CD4E>
+<6CEB> <6CEB> <CCF0>
+<6CEC> <6CEC> <CCEF>
+<6CED> <6CED> <CCFD>
+<6CEE> <6CEE> <CCF1>
+<6CEF> <6CEF> <AA7B>
+<6CF0> <6CF0> <AEF5>
+<6CF1> <6CF1> <AA74>
+<6CF2> <6CF2> <CCFE>
+<6CF3> <6CF3> <AA61>
+<6CF5> <6CF5> <ACA6>
+<6CF9> <6CF9> <CD4C>
+<6D00> <6D00> <CF7C>
+<6D01> <6D01> <CFA1>
+<6D03> <6D03> <CFA4>
+<6D04> <6D04> <CF77>
+<6D07> <6D07> <CFA7>
+<6D08> <6D08> <CFAA>
+<6D09> <6D09> <CFAC>
+<6D0A> <6D0A> <CF74>
+<6D0B> <6D0B> <AC76>
+<6D0C> <6D0C> <AC7B>
+<6D0D> <6D0D> <D249>
+<6D0E> <6D0E> <ACAD>
+<6D0F> <6D0F> <CFA5>
+<6D10> <6D10> <CFAD>
+<6D11> <6D11> <CF7B>
+endbfrange
+
+100 beginbfrange
+<6D12> <6D12> <CF73>
+<6D16> <6D16> <D264>
+<6D17> <6D17> <AC7E>
+<6D18> <6D18> <CFA2>
+<6D19> <6D19> <CF78>
+<6D1A> <6D1A> <CF7A>
+<6D1B> <6D1B> <ACA5>
+<6D1D> <6D1D> <CF7D>
+<6D1E> <6D1E> <AC7D>
+<6D1F> <6D1F> <CF70>
+<6D20> <6D20> <CFA8>
+<6D22> <6D22> <CFAB>
+<6D25> <6D25> <AC7A>
+<6D27> <6D27> <ACA8>
+<6D28> <6D28> <CF6D>
+<6D29> <6D29> <ACAA>
+<6D2A> <6D2A> <AC78>
+<6D2B> <6D2B> <ACAE>
+<6D2C> <6D2C> <CFA9>
+<6D2D> <6D2D> <CF6F>
+<6D2E> <6D2E> <ACAB>
+<6D2F> <6D2F> <D25E>
+<6D30> <6D30> <CD48>
+<6D31> <6D31> <AC7C>
+<6D32> <6D32> <AC77>
+<6D33> <6D33> <CF76>
+<6D34> <6D34> <CF6E>
+<6D35> <6D35> <ACAC>
+<6D36> <6D36> <ACA4>
+<6D37> <6D37> <CFA3>
+<6D38> <6D38> <ACA9>
+<6D39> <6D39> <ACA7>
+<6D3A> <6D3A> <CF79>
+<6D3B> <6D3B> <ACA1>
+<6D3C> <6D3C> <CF71>
+<6D3D> <6D3E> <ACA2>
+<6D3F> <6D3F> <CF72>
+<6D40> <6D40> <CFA6>
+<6D41> <6D41> <AC79>
+<6D42> <6D42> <CF7E>
+<6D58> <6D58> <D24C>
+<6D59> <6D59> <AEFD>
+<6D5A> <6D5A> <AF43>
+<6D5E> <6D5E> <D255>
+<6D5F> <6D5F> <D25B>
+<6D60> <6D60> <D257>
+<6D61> <6D61> <D24A>
+<6D62> <6D62> <D24D>
+<6D63> <6D64> <D246>
+<6D65> <6D65> <AF4A>
+<6D66> <6D66> <AEFA>
+<6D67> <6D67> <D256>
+<6D68> <6D68> <D25F>
+<6D69> <6D69> <AF45>
+<6D6A> <6D6A> <AEF6>
+<6D6C> <6D6C> <AF40>
+<6D6D> <6D6D> <D24E>
+<6D6E> <6D6E> <AF42>
+<6D6F> <6D6F> <D24F>
+<6D70> <6D70> <D259>
+<6D74> <6D74> <AF44>
+<6D75> <6D75> <D268>
+<6D76> <6D76> <D248>
+<6D77> <6D77> <AEFC>
+<6D78> <6D78> <AEFB>
+<6D79> <6D79> <AF48>
+<6D7A> <6D7A> <D245>
+<6D7B> <6D7B> <D266>
+<6D7C> <6D7C> <D25A>
+<6D7D> <6D7D> <D267>
+<6D7E> <6D7E> <D261>
+<6D7F> <6D7F> <D253>
+<6D80> <6D80> <D262>
+<6D82> <6D82> <D25C>
+<6D83> <6D83> <D265>
+<6D84> <6D84> <D263>
+<6D85> <6D85> <AF49>
+<6D86> <6D86> <D254>
+<6D87> <6D87> <AEF9>
+<6D88> <6D88> <AEF8>
+<6D89> <6D89> <AF41>
+<6D8A> <6D8A> <AF47>
+<6D8B> <6D8B> <D260>
+<6D8C> <6D8C> <AF46>
+<6D8D> <6D8D> <D251>
+<6D8E> <6D8E> <B243>
+<6D90> <6D90> <D269>
+<6D91> <6D91> <D250>
+<6D92> <6D92> <D24B>
+<6D93> <6D93> <AEFE>
+<6D94> <6D94> <AF4B>
+<6D95> <6D95> <AEF7>
+<6D97> <6D97> <D258>
+<6D98> <6D98> <D25D>
+<6DAA> <6DAA> <B265>
+<6DAB> <6DAB> <D5E1>
+<6DAC> <6DAC> <D5E5>
+<6DAE> <6DAE> <B252>
+<6DAF> <6DAF> <B250>
+<6DB2> <6DB2> <B247>
+endbfrange
+
+100 beginbfrange
+<6DB3> <6DB3> <D5E3>
+<6DB4> <6DB4> <D5E2>
+<6DB5> <6DB5> <B25B>
+<6DB7> <6DB7> <D5E8>
+<6DB8> <6DB8> <B255>
+<6DBA> <6DBA> <D5FA>
+<6DBB> <6DBB> <D647>
+<6DBC> <6DBC> <B244>
+<6DBD> <6DBD> <D5F7>
+<6DBE> <6DBE> <D5F0>
+<6DBF> <6DBF> <B267>
+<6DC0> <6DC0> <D5E0>
+<6DC2> <6DC2> <D5FC>
+<6DC4> <6DC4> <B264>
+<6DC5> <6DC5> <B258>
+<6DC6> <6DC6> <B263>
+<6DC7> <6DC7> <B24E>
+<6DC8> <6DC8> <D5EC>
+<6DC9> <6DC9> <D5FE>
+<6DCA> <6DCA> <D5F6>
+<6DCB> <6DCB> <B24F>
+<6DCC> <6DCC> <B249>
+<6DCD> <6DCD> <D645>
+<6DCF> <6DCF> <D5FD>
+<6DD0> <6DD0> <D640>
+<6DD1> <6DD1> <B251>
+<6DD2> <6DD2> <B259>
+<6DD3> <6DD3> <D642>
+<6DD4> <6DD4> <D5EA>
+<6DD5> <6DD5> <D5FB>
+<6DD6> <6DD6> <D5EF>
+<6DD7> <6DD7> <D644>
+<6DD8> <6DD8> <B25E>
+<6DD9> <6DD9> <B246>
+<6DDA> <6DDA> <B25C>
+<6DDB> <6DDB> <D5F4>
+<6DDC> <6DDD> <D5F2>
+<6DDE> <6DDE> <B253>
+<6DDF> <6DDF> <D5EE>
+<6DE0> <6DE0> <D5ED>
+<6DE1> <6DE1> <B248>
+<6DE2> <6DE2> <D5E7>
+<6DE3> <6DE3> <D646>
+<6DE4> <6DE4> <B24A>
+<6DE5> <6DE5> <D5F1>
+<6DE6> <6DE6> <B268>
+<6DE8> <6DE8> <B262>
+<6DE9> <6DE9> <D5E6>
+<6DEA> <6DEA> <B25F>
+<6DEB> <6DEB> <B25D>
+<6DEC> <6DEC> <B266>
+<6DED> <6DED> <D5F8>
+<6DEE> <6DEE> <B261>
+<6DEF> <6DEF> <D252>
+<6DF0> <6DF0> <D5F9>
+<6DF1> <6DF1> <B260>
+<6DF2> <6DF2> <D641>
+<6DF3> <6DF3> <B245>
+<6DF4> <6DF4> <D5F5>
+<6DF5> <6DF5> <B257>
+<6DF6> <6DF6> <D5E9>
+<6DF7> <6DF7> <B256>
+<6DF9> <6DF9> <B254>
+<6DFA> <6DFA> <B24C>
+<6DFB> <6DFB> <B24B>
+<6DFC> <6DFC> <D9E7>
+<6DFD> <6DFD> <D643>
+<6E00> <6E00> <D5EB>
+<6E03> <6E03> <D9FC>
+<6E05> <6E05> <B24D>
+<6E19> <6E19> <B541>
+<6E1A> <6E1A> <B25A>
+<6E1B> <6E1B> <B4EE>
+<6E1C> <6E1C> <D9F6>
+<6E1D> <6E1D> <B4FC>
+<6E1F> <6E1F> <D9EA>
+<6E20> <6E20> <B4EB>
+<6E21> <6E21> <B4E7>
+<6E22> <6E22> <DA49>
+<6E23> <6E23> <B4ED>
+<6E24> <6E24> <B4F1>
+<6E25> <6E25> <B4EC>
+<6E26> <6E26> <B4F5>
+<6E27> <6E27> <DA4D>
+<6E28> <6E28> <DA44>
+<6E2B> <6E2B> <D9F1>
+<6E2C> <6E2C> <B4FA>
+<6E2D> <6E2D> <B4F4>
+<6E2E> <6E2E> <D9FD>
+<6E2F> <6E2F> <B4E4>
+<6E30> <6E30> <DA4A>
+<6E31> <6E31> <DA43>
+<6E32> <6E32> <B4E8>
+<6E33> <6E33> <D9F7>
+<6E34> <6E34> <B4F7>
+<6E35> <6E36> <DA55>
+<6E38> <6E38> <B4E5>
+<6E39> <6E39> <DA48>
+<6E3A> <6E3A> <B4F9>
+<6E3B> <6E3B> <D9FB>
+endbfrange
+
+100 beginbfrange
+<6E3C> <6E3D> <D9ED>
+<6E3E> <6E3E> <B4FD>
+<6E3F> <6E3F> <D9F2>
+<6E40> <6E40> <D9F9>
+<6E41> <6E41> <D9F3>
+<6E43> <6E43> <B4FB>
+<6E44> <6E44> <B544>
+<6E45> <6E45> <D9EF>
+<6E46> <6E47> <D9E8>
+<6E49> <6E49> <D9EB>
+<6E4A> <6E4A> <B4EA>
+<6E4B> <6E4B> <D9F8>
+<6E4D> <6E4D> <B4F8>
+<6E4E> <6E4E> <B542>
+<6E51> <6E51> <D9FA>
+<6E52> <6E52> <DA53>
+<6E53> <6E53> <DA4B>
+<6E54> <6E54> <B4E6>
+<6E55> <6E55> <DA51>
+<6E56> <6E56> <B4F2>
+<6E58> <6E58> <B4F0>
+<6E5A> <6E5A> <DA57>
+<6E5B> <6E5B> <B4EF>
+<6E5C> <6E5C> <DA41>
+<6E5D> <6E5D> <D9F4>
+<6E5E> <6E5E> <D9FE>
+<6E5F> <6E5F> <B547>
+<6E60> <6E60> <DA45>
+<6E61> <6E61> <DA42>
+<6E62> <6E62> <D9F0>
+<6E63> <6E63> <B543>
+<6E64> <6E64> <DA4F>
+<6E65> <6E65> <DA4C>
+<6E66> <6E66> <DA54>
+<6E67> <6E67> <B4E9>
+<6E68> <6E68> <DA40>
+<6E69> <6E69> <B546>
+<6E6B> <6E6B> <DA47>
+<6E6E> <6E6E> <B4F3>
+<6E6F> <6E6F> <B4F6>
+<6E71> <6E71> <DA46>
+<6E72> <6E72> <B545>
+<6E73> <6E73> <D9F5>
+<6E74> <6E74> <D5E4>
+<6E77> <6E77> <DA50>
+<6E78> <6E78> <DA4E>
+<6E79> <6E79> <DA52>
+<6E88> <6E88> <D9EC>
+<6E89> <6E89> <B540>
+<6E8D> <6E8D> <DE61>
+<6E8E> <6E8E> <DE60>
+<6E8F> <6E8F> <DE46>
+<6E90> <6E90> <B7BD>
+<6E92> <6E92> <DE5F>
+<6E93> <6E94> <DE49>
+<6E96> <6E96> <B7C7>
+<6E97> <6E97> <DE68>
+<6E98> <6E98> <B7C2>
+<6E99> <6E99> <DE5E>
+<6E9B> <6E9B> <DE43>
+<6E9C> <6E9C> <B7C8>
+<6E9D> <6E9D> <B7BE>
+<6E9E> <6E9E> <DE52>
+<6E9F> <6E9F> <DE48>
+<6EA0> <6EA0> <DE4B>
+<6EA1> <6EA1> <DE63>
+<6EA2> <6EA2> <B7B8>
+<6EA3> <6EA3> <DE6A>
+<6EA4> <6EA4> <DE62>
+<6EA5> <6EA5> <B7C1>
+<6EA6> <6EA6> <DE57>
+<6EA7> <6EA7> <B7CC>
+<6EAA> <6EAA> <B7CB>
+<6EAB> <6EAB> <B7C5>
+<6EAE> <6EAE> <DE69>
+<6EAF> <6EAF> <B7B9>
+<6EB0> <6EB0> <DE55>
+<6EB1> <6EB1> <DE4C>
+<6EB2> <6EB2> <DE59>
+<6EB3> <6EB3> <DE65>
+<6EB4> <6EB4> <B7CD>
+<6EB6> <6EB6> <B7BB>
+<6EB7> <6EB7> <DE54>
+<6EB9> <6EB9> <DE4D>
+<6EBA> <6EBA> <B7C4>
+<6EBC> <6EBC> <B7C3>
+<6EBD> <6EBD> <DE50>
+<6EBE> <6EBE> <DE5A>
+<6EBF> <6EBF> <DE64>
+<6EC0> <6EC0> <DE47>
+<6EC1> <6EC1> <DE51>
+<6EC2> <6EC2> <B7BC>
+<6EC3> <6EC3> <DE5B>
+<6EC4> <6EC4> <B7C9>
+<6EC5> <6EC5> <B7C0>
+<6EC6> <6EC6> <DE4E>
+<6EC7> <6EC7> <B7BF>
+<6EC8> <6EC8> <DE45>
+<6EC9> <6EC9> <DE53>
+<6ECA> <6ECA> <DE67>
+endbfrange
+
+100 beginbfrange
+<6ECB> <6ECB> <B4FE>
+<6ECC> <6ECC> <BAB0>
+<6ECD> <6ECD> <DE56>
+<6ECE> <6ECE> <E26C>
+<6ECF> <6ECF> <DE58>
+<6ED0> <6ED0> <DE66>
+<6ED1> <6ED1> <B7C6>
+<6ED2> <6ED2> <DE4F>
+<6ED3> <6ED3> <B7BA>
+<6ED4> <6ED4> <B7CA>
+<6ED5> <6ED5> <BCF0>
+<6ED6> <6ED6> <DE44>
+<6ED8> <6ED8> <DE5D>
+<6EDC> <6EDC> <DE5C>
+<6EEB> <6EEB> <E2AA>
+<6EEC> <6EEC> <BAAD>
+<6EED> <6EED> <E27D>
+<6EEE> <6EEE> <E2A4>
+<6EEF> <6EEF> <BAA2>
+<6EF1> <6EF1> <E26E>
+<6EF2> <6EF2> <BAAF>
+<6EF4> <6EF4> <BA77>
+<6EF5> <6EF5> <E26D>
+<6EF6> <6EF6> <E2B0>
+<6EF7> <6EF7> <BAB1>
+<6EF8> <6EF8> <E271>
+<6EF9> <6EF9> <E2A3>
+<6EFB> <6EFB> <E273>
+<6EFC> <6EFC> <E2B3>
+<6EFD> <6EFD> <E2AF>
+<6EFE> <6EFE> <BA75>
+<6EFF> <6EFF> <BAA1>
+<6F00> <6F00> <E653>
+<6F01> <6F01> <BAAE>
+<6F02> <6F02> <BA7D>
+<6F03> <6F03> <E26F>
+<6F05> <6F05> <E2AE>
+<6F06> <6F06> <BAA3>
+<6F07> <6F07> <E2AB>
+<6F08> <6F08> <E2B8>
+<6F09> <6F09> <E275>
+<6F0A> <6F0A> <E27E>
+<6F0D> <6F0D> <E2B6>
+<6F0E> <6F0E> <E2AC>
+<6F0F> <6F0F> <BA7C>
+<6F12> <6F12> <E27C>
+<6F13> <6F13> <BA76>
+<6F14> <6F14> <BA74>
+<6F15> <6F15> <BAA8>
+<6F18> <6F18> <E27A>
+<6F19> <6F1A> <E277>
+<6F1C> <6F1C> <E2B2>
+<6F1E> <6F1E> <E2B7>
+<6F1F> <6F1F> <E2B5>
+<6F20> <6F20> <BA7A>
+<6F21> <6F21> <E2B9>
+<6F22> <6F22> <BA7E>
+<6F23> <6F23> <BAA7>
+<6F25> <6F25> <E270>
+<6F26> <6F26> <E5FA>
+<6F27> <6F27> <E279>
+<6F29> <6F29> <BA78>
+<6F2A> <6F2A> <BAAC>
+<6F2B> <6F2B> <BAA9>
+<6F2C> <6F2C> <BA7B>
+<6F2D> <6F2D> <E2A5>
+<6F2E> <6F2E> <E274>
+<6F2F> <6F2F> <BAAA>
+<6F30> <6F30> <E2A7>
+<6F31> <6F31> <BAA4>
+<6F32> <6F32> <BAA6>
+<6F33> <6F33> <BA73>
+<6F35> <6F35> <E2A9>
+<6F36> <6F36> <E2A1>
+<6F37> <6F37> <E272>
+<6F38> <6F38> <BAA5>
+<6F39> <6F39> <E2B1>
+<6F3A> <6F3A> <E2B4>
+<6F3B> <6F3B> <E27B>
+<6F3C> <6F3C> <E2A8>
+<6F3E> <6F3E> <BA79>
+<6F3F> <6F3F> <BCDF>
+<6F40> <6F40> <E2A6>
+<6F41> <6F41> <E5F9>
+<6F43> <6F43> <E2AD>
+<6F4E> <6F4E> <E276>
+<6F4F> <6F4F> <E644>
+<6F50> <6F50> <E64E>
+<6F51> <6F51> <BCE2>
+<6F52> <6F52> <E64D>
+<6F53> <6F53> <E659>
+<6F54> <6F54> <BCE4>
+<6F55> <6F55> <E64B>
+<6F57> <6F57> <E64F>
+<6F58> <6F58> <BCEF>
+<6F5A> <6F5A> <E646>
+<6F5B> <6F5B> <BCE7>
+<6F5D> <6F5D> <E652>
+<6F5E> <6F5E> <E9F0>
+<6F5F> <6F5F> <BCF3>
+endbfrange
+
+100 beginbfrange
+<6F60> <6F60> <BCF2>
+<6F61> <6F61> <E654>
+<6F62> <6F62> <E643>
+<6F63> <6F63> <E65E>
+<6F64> <6F64> <BCED>
+<6F66> <6F66> <BCE3>
+<6F67> <6F67> <E657>
+<6F69> <6F69> <E65B>
+<6F6A> <6F6A> <E660>
+<6F6B> <6F6B> <E655>
+<6F6C> <6F6C> <E649>
+<6F6D> <6F6D> <BCE6>
+<6F6E> <6F6E> <BCE9>
+<6F6F> <6F6F> <BCF1>
+<6F70> <6F70> <BCEC>
+<6F72> <6F72> <E64C>
+<6F73> <6F73> <E2A2>
+<6F76> <6F76> <E648>
+<6F77> <6F77> <E65F>
+<6F78> <6F78> <BCE8>
+<6F7A> <6F7A> <BCEB>
+<6F7B> <6F7B> <E661>
+<6F7C> <6F7C> <BCE0>
+<6F7D> <6F7D> <E656>
+<6F7E> <6F7E> <E5FB>
+<6F7F> <6F7F> <E65C>
+<6F80> <6F80> <C0DF>
+<6F82> <6F82> <E64A>
+<6F84> <6F84> <BCE1>
+<6F85> <6F85> <E645>
+<6F86> <6F86> <BCE5>
+<6F87> <6F87> <E5FC>
+<6F88> <6F88> <BAAB>
+<6F89> <6F89> <E641>
+<6F8B> <6F8B> <E65A>
+<6F8C> <6F8C> <E642>
+<6F8D> <6F8D> <E640>
+<6F8E> <6F8E> <BCEA>
+<6F90> <6F90> <E658>
+<6F92> <6F92> <E5FE>
+<6F93> <6F93> <E651>
+<6F94> <6F94> <E650>
+<6F95> <6F95> <E65D>
+<6F96> <6F96> <E647>
+<6F97> <6F97> <BCEE>
+<6F9E> <6F9E> <E9F3>
+<6FA0> <6FA0> <BF49>
+<6FA1> <6FA1> <BEFE>
+<6FA2> <6FA2> <EA40>
+<6FA3> <6FA3> <E9EB>
+<6FA4> <6FA4> <BF41>
+<6FA5> <6FA5> <E9F7>
+<6FA6> <6FA6> <BF48>
+<6FA7> <6FA7> <BF43>
+<6FA8> <6FA8> <E9F5>
+<6FA9> <6FA9> <ED4F>
+<6FAA> <6FAA> <E9FB>
+<6FAB> <6FAB> <EA42>
+<6FAC> <6FAC> <E9FA>
+<6FAD> <6FAD> <E9E9>
+<6FAE> <6FAE> <E9F8>
+<6FAF> <6FAF> <EA44>
+<6FB0> <6FB0> <EA46>
+<6FB1> <6FB1> <BEFD>
+<6FB2> <6FB2> <EA45>
+<6FB3> <6FB3> <BF44>
+<6FB4> <6FB4> <BF4A>
+<6FB6> <6FB6> <BF47>
+<6FB8> <6FB8> <E9FE>
+<6FB9> <6FB9> <BF46>
+<6FBA> <6FBA> <E9F9>
+<6FBC> <6FBC> <E9ED>
+<6FBD> <6FBD> <E9F2>
+<6FBF> <6FBF> <E9FD>
+<6FC0> <6FC0> <BF45>
+<6FC1> <6FC1> <BF42>
+<6FC2> <6FC2> <BEFC>
+<6FC3> <6FC3> <BF40>
+<6FC4> <6FC4> <E9F1>
+<6FC6> <6FC6> <E5FD>
+<6FC7> <6FC7> <E9EC>
+<6FC8> <6FC8> <E9EF>
+<6FC9> <6FC9> <EA41>
+<6FCA> <6FCA> <E9F4>
+<6FCB> <6FCB> <E9EA>
+<6FCC> <6FCC> <ED4E>
+<6FCD> <6FCD> <EA43>
+<6FCE> <6FCE> <E9EE>
+<6FCF> <6FCF> <E9FC>
+<6FD4> <6FD4> <ED51>
+<6FD5> <6FD5> <C0E3>
+<6FD8> <6FD8> <C0D7>
+<6FDB> <6FDB> <C0DB>
+<6FDC> <6FDC> <ED53>
+<6FDD> <6FDD> <ED59>
+<6FDE> <6FDE> <ED57>
+<6FDF> <6FE0> <C0D9>
+<6FE1> <6FE1> <C0E1>
+<6FE2> <6FE2> <ED5A>
+<6FE3> <6FE3> <ED52>
+endbfrange
+
+100 beginbfrange
+<6FE4> <6FE4> <C0DC>
+<6FE6> <6FE6> <ED56>
+<6FE7> <6FE7> <ED55>
+<6FE8> <6FE8> <ED5B>
+<6FE9> <6FE9> <C0E2>
+<6FEB> <6FEB> <C0DD>
+<6FEC> <6FEC> <C0E0>
+<6FED> <6FED> <ED54>
+<6FEE> <6FEE> <C0E4>
+<6FEF> <6FEF> <C0DE>
+<6FF0> <6FF0> <C0E5>
+<6FF1> <6FF1> <C0D8>
+<6FF2> <6FF2> <ED58>
+<6FF4> <6FF4> <ED50>
+<6FF7> <6FF7> <EFF7>
+<6FFA> <6FFA> <C271>
+<6FFB> <6FFB> <EFF4>
+<6FFC> <6FFC> <EFF6>
+<6FFE> <6FFE> <C26F>
+<6FFF> <6FFF> <EFF2>
+<7000> <7000> <EFF3>
+<7001> <7001> <EFEE>
+<7004> <7004> <E9F6>
+<7005> <7005> <EFEF>
+<7006> <7006> <C270>
+<7007> <7007> <EFEB>
+<7009> <7009> <C26D>
+<700A> <700A> <EFF8>
+<700B> <700B> <C26E>
+<700C> <700D> <EFEC>
+<700E> <700E> <EFF1>
+<700F> <700F> <C273>
+<7011> <7011> <C272>
+<7014> <7014> <EFF0>
+<7015> <7015> <C378>
+<7016> <7016> <F25F>
+<7017> <7017> <F265>
+<7018> <7018> <C379>
+<7019> <7019> <F25C>
+<701A> <701A> <C376>
+<701B> <701B> <C373>
+<701C> <701C> <F267>
+<701D> <701D> <C377>
+<701F> <701F> <C374>
+<7020> <7020> <F25E>
+<7021> <7023> <F261>
+<7024> <7024> <F266>
+<7026> <7026> <EFF5>
+<7027> <7027> <F25D>
+<7028> <7028> <C375>
+<7029> <7029> <F264>
+<702A> <702A> <F268>
+<702B> <702B> <F260>
+<702F> <702F> <F45D>
+<7030> <7030> <C46A>
+<7031> <7031> <F460>
+<7032> <7032> <C46B>
+<7033> <7033> <F468>
+<7034> <7034> <F45F>
+<7035> <7035> <F45C>
+<7037> <7037> <F45E>
+<7038> <7038> <F462>
+<7039> <7039> <F465>
+<703A> <703A> <F464>
+<703B> <703B> <F467>
+<703C> <703C> <F45B>
+<703E> <703E> <C469>
+<703F> <703F> <F463>
+<7040> <7040> <F466>
+<7041> <7041> <F469>
+<7042> <7042> <F461>
+<7043> <7044> <F5D3>
+<7045> <7046> <F5D8>
+<7048> <7049> <F5D6>
+<704A> <704A> <F5D5>
+<704C> <704C> <C4E9>
+<7051> <7051> <C578>
+<7052> <7052> <F6EB>
+<7055> <7057> <F6E8>
+<7058> <7058> <C579>
+<705A> <705A> <F7E5>
+<705B> <705B> <F7E4>
+<705D> <705D> <F8AF>
+<705E> <705E> <C5F4>
+<705F> <705F> <F8AD>
+<7060> <7060> <F8B0>
+<7061> <7061> <F8AE>
+<7062> <7062> <F8F5>
+<7063> <7063> <C657>
+<7064> <7064> <C665>
+<7065> <7065> <F9A3>
+<7066> <7066> <F96C>
+<7068> <7068> <F9A2>
+<7069> <706A> <F9D0>
+<706B> <706B> <A4F5>
+<7070> <7070> <A6C7>
+<7071> <7071> <CA41>
+<7074> <7074> <CB5E>
+<7076> <7076> <A85F>
+<7078> <7078> <A862>
+endbfrange
+
+100 beginbfrange
+<707A> <707A> <CB5F>
+<707C> <707D> <A860>
+<7082> <7082> <CD58>
+<7083> <7083> <CD5A>
+<7084> <7084> <CD55>
+<7085> <7085> <CD52>
+<7086> <7086> <CD54>
+<708A> <708A> <AAA4>
+<708E> <708E> <AAA2>
+<7091> <7091> <CD56>
+<7092> <7092> <AAA3>
+<7093> <7093> <CD53>
+<7094> <7094> <CD50>
+<7095> <7095> <AAA1>
+<7096> <7096> <CD57>
+<7098> <7098> <CD51>
+<7099> <7099> <AAA5>
+<709A> <709A> <CD59>
+<709F> <709F> <CFAF>
+<70A1> <70A1> <CFB3>
+<70A4> <70A4> <ACB7>
+<70A9> <70A9> <CFB6>
+<70AB> <70AB> <ACAF>
+<70AC> <70AC> <ACB2>
+<70AD> <70AD> <ACB4>
+<70AE> <70AE> <ACB6>
+<70AF> <70AF> <ACB3>
+<70B0> <70B0> <CFB2>
+<70B1> <70B1> <CFB1>
+<70B3> <70B3> <ACB1>
+<70B4> <70B5> <CFB4>
+<70B7> <70B7> <CFAE>
+<70B8> <70B8> <ACB5>
+<70BA> <70BA> <ACB0>
+<70BE> <70BE> <CFB0>
+<70C5> <70C7> <D277>
+<70C8> <70C8> <AF50>
+<70CA> <70CA> <AF4C>
+<70CB> <70CB> <D26E>
+<70CD> <70CD> <D276>
+<70CE> <70CE> <D27B>
+<70CF> <70CF> <AF51>
+<70D1> <70D1> <D26C>
+<70D2> <70D2> <D272>
+<70D3> <70D3> <D26B>
+<70D4> <70D4> <D275>
+<70D7> <70D7> <D271>
+<70D8> <70D8> <AF4D>
+<70D9> <70D9> <AF4F>
+<70DA> <70DA> <D27A>
+<70DC> <70DC> <D26A>
+<70DD> <70DD> <D26D>
+<70DE> <70DE> <D273>
+<70E0> <70E0> <D274>
+<70E1> <70E1> <D27C>
+<70E2> <70E2> <D270>
+<70E4> <70E4> <AF4E>
+<70EF> <70EF> <B26D>
+<70F0> <70F0> <D64E>
+<70F3> <70F3> <D650>
+<70F4> <70F4> <D64C>
+<70F6> <70F6> <D658>
+<70F7> <70F7> <D64A>
+<70F8> <70F8> <D657>
+<70F9> <70F9> <B269>
+<70FA> <70FA> <D648>
+<70FB> <70FB> <DA5B>
+<70FC> <70FC> <D652>
+<70FD> <70FD> <B26C>
+<70FF> <70FF> <D653>
+<7100> <7100> <D656>
+<7102> <7102> <D65A>
+<7104> <7104> <D64F>
+<7106> <7106> <D654>
+<7109> <710A> <B26A>
+<710B> <710B> <D659>
+<710C> <710C> <D64D>
+<710D> <710D> <D649>
+<710E> <710E> <D65B>
+<7110> <7110> <D651>
+<7113> <7113> <D655>
+<7117> <7117> <D64B>
+<7119> <711A> <B548>
+<711B> <711B> <DA65>
+<711C> <711C> <B54F>
+<711E> <711E> <DA59>
+<711F> <711F> <DA62>
+<7120> <7120> <DA58>
+<7121> <7121> <B54C>
+<7122> <7122> <DA60>
+<7123> <7123> <DA5E>
+<7125> <7125> <DA5F>
+<7126> <7126> <B54A>
+<7128> <7128> <DA63>
+<712E> <712E> <DA5C>
+<712F> <712F> <DA5A>
+<7130> <7130> <B54B>
+<7131> <7131> <DA5D>
+<7132> <7132> <DA61>
+<7136> <7136> <B54D>
+endbfrange
+
+100 beginbfrange
+<713A> <713A> <DA64>
+<7141> <7141> <DE70>
+<7142> <7142> <DE77>
+<7143> <7143> <DE79>
+<7144> <7144> <DEA1>
+<7146> <7146> <B7DA>
+<7147> <7147> <DE6B>
+<7149> <7149> <B7D2>
+<714B> <714B> <DE7A>
+<714C> <714C> <B7D7>
+<714D> <714D> <DEA2>
+<714E> <714E> <B7CE>
+<7150> <7150> <DE7D>
+<7152> <7152> <DE6D>
+<7153> <7153> <DE7E>
+<7154> <7154> <DE6C>
+<7156> <7156> <B7DC>
+<7158> <7158> <DE78>
+<7159> <7159> <B7CF>
+<715A> <715A> <DEA3>
+<715C> <715C> <B7D4>
+<715D> <715D> <DE71>
+<715E> <715E> <B7D9>
+<715F> <715F> <DE7C>
+<7160> <7160> <DE6F>
+<7161> <7161> <DE76>
+<7162> <7162> <DE72>
+<7163> <7163> <DE6E>
+<7164> <7164> <B7D1>
+<7165> <7165> <B7D8>
+<7166> <7166> <B7D6>
+<7167> <7167> <B7D3>
+<7168> <7168> <B7DB>
+<7169> <7169> <B7D0>
+<716A> <716A> <DE75>
+<716C> <716C> <B7D5>
+<716E> <716E> <B54E>
+<7170> <7170> <DE7B>
+<7172> <7172> <DE73>
+<7178> <7178> <DE74>
+<717B> <717B> <E2C1>
+<717D> <717D> <BAB4>
+<7180> <7180> <E2BD>
+<7181> <7181> <E2C3>
+<7182> <7182> <E2BF>
+<7184> <7184> <BAB6>
+<7185> <7185> <E2BE>
+<7186> <7186> <E2C2>
+<7187> <7187> <E2BA>
+<7189> <7189> <E2BC>
+<718A> <718A> <BAB5>
+<718F> <718F> <E2C0>
+<7190> <7190> <E2BB>
+<7192> <7192> <BAB7>
+<7194> <7194> <BAB2>
+<7197> <7197> <E2C4>
+<7199> <7199> <BAB3>
+<719A> <719A> <E667>
+<719B> <719B> <E664>
+<719C> <719C> <E670>
+<719D> <719D> <E66A>
+<719E> <719E> <E66C>
+<719F> <719F> <BCF4>
+<71A0> <71A0> <E666>
+<71A1> <71A1> <E66E>
+<71A4> <71A4> <E66D>
+<71A5> <71A5> <E66B>
+<71A7> <71A7> <E671>
+<71A8> <71A8> <BCF7>
+<71A9> <71A9> <E668>
+<71AA> <71AA> <E66F>
+<71AC> <71AC> <BCF5>
+<71AF> <71AF> <E663>
+<71B0> <71B0> <E665>
+<71B1> <71B1> <BCF6>
+<71B2> <71B2> <E662>
+<71B3> <71B3> <E672>
+<71B5> <71B5> <E669>
+<71B8> <71B8> <EA4A>
+<71B9> <71B9> <BF51>
+<71BC> <71BC> <EA55>
+<71BD> <71BD> <EA53>
+<71BE> <71BE> <BF4B>
+<71BF> <71BF> <EA49>
+<71C0> <71C1> <EA4C>
+<71C2> <71C2> <EA48>
+<71C3> <71C4> <BF55>
+<71C5> <71C5> <EA47>
+<71C6> <71C6> <EA56>
+<71C7> <71C7> <EA51>
+<71C8> <71C8> <BF4F>
+<71C9> <71C9> <BF4C>
+<71CA> <71CA> <EA50>
+<71CB> <71CB> <EA4E>
+<71CE> <71CE> <BF52>
+<71CF> <71CF> <EA52>
+<71D0> <71D0> <BF4D>
+<71D2> <71D2> <BF4E>
+<71D4> <71D4> <EA4F>
+<71D5> <71D5> <BF50>
+endbfrange
+
+100 beginbfrange
+<71D6> <71D6> <EA4B>
+<71D8> <71D8> <EA54>
+<71D9> <71D9> <BF53>
+<71DA> <71DB> <EA57>
+<71DC> <71DC> <BF54>
+<71DF> <71DF> <C0E7>
+<71E0> <71E0> <C0EE>
+<71E1> <71E1> <ED5C>
+<71E2> <71E2> <ED62>
+<71E4> <71E4> <ED60>
+<71E5> <71E5> <C0EA>
+<71E6> <71E6> <C0E9>
+<71E7> <71E7> <C0E6>
+<71E8> <71E8> <ED5E>
+<71EC> <71EC> <C0EC>
+<71ED> <71ED> <C0EB>
+<71EE> <71EE> <C0E8>
+<71F0> <71F0> <ED61>
+<71F1> <71F1> <ED5D>
+<71F2> <71F2> <ED5F>
+<71F4> <71F4> <C0ED>
+<71F8> <71F8> <C277>
+<71F9> <71F9> <EFFB>
+<71FB> <71FC> <C274>
+<71FD> <71FD> <EFFD>
+<71FE> <71FE> <C276>
+<71FF> <71FF> <EFFA>
+<7201> <7201> <EFF9>
+<7202> <7202> <F26C>
+<7203> <7203> <EFFC>
+<7205> <7205> <F26D>
+<7206> <7206> <C37A>
+<7207> <7207> <F26B>
+<720A> <720A> <F26A>
+<720C> <720C> <F269>
+<720D> <720D> <C37B>
+<7210> <7210> <C46C>
+<7213> <7214> <F46A>
+<7219> <7219> <F5DC>
+<721A> <721A> <F5DB>
+<721B> <721B> <C4EA>
+<721D> <721D> <F5DA>
+<721E> <721F> <F6EC>
+<7222> <7222> <F7E6>
+<7223> <7223> <F8B1>
+<7226> <7226> <F8F6>
+<7227> <7227> <F9BC>
+<7228> <7228> <C679>
+<7229> <7229> <F9C6>
+<722A> <722A> <A4F6>
+<722C> <722D> <AAA6>
+<7230> <7230> <ACB8>
+<7235> <7235> <C0EF>
+<7236> <7236> <A4F7>
+<7238> <7238> <AAA8>
+<7239> <7239> <AF52>
+<723A> <723A> <B7DD>
+<723B> <723B> <A4F8>
+<723D> <723D> <B26E>
+<723E> <723E> <BAB8>
+<723F> <723F> <C962>
+<7241> <7241> <CFB7>
+<7242> <7242> <D27D>
+<7244> <7244> <E2C5>
+<7246> <7246> <C0F0>
+<7247> <7247> <A4F9>
+<7248> <7248> <AAA9>
+<7249> <724A> <CFB8>
+<724B> <724B> <DA66>
+<724C> <724C> <B550>
+<724F> <724F> <DEA4>
+<7252> <7252> <B7DE>
+<7253> <7253> <E2C6>
+<7256> <7256> <BCF8>
+<7258> <7258> <C37C>
+<7259> <7259> <A4FA>
+<725A> <725A> <DA67>
+<725B> <725B> <A4FB>
+<725D> <725D> <A6C9>
+<725E> <725E> <CA42>
+<725F> <725F> <A6C8>
+<7260> <7260> <A865>
+<7261> <7261> <A864>
+<7262> <7262> <A863>
+<7263> <7263> <CB60>
+<7267> <7267> <AAAA>
+<7269> <7269> <AAAB>
+<726A> <726A> <CD5B>
+<726C> <726C> <CFBA>
+<726E> <726E> <CFBD>
+<726F> <726F> <ACBA>
+<7270> <7270> <CFBB>
+<7272> <7272> <ACB9>
+<7273> <7273> <CFBC>
+<7274> <7274> <ACBB>
+<7276> <7276> <D2A2>
+<7277> <7277> <D2A1>
+<7278> <7278> <D27E>
+<7279> <7279> <AF53>
+<727B> <727C> <D65D>
+endbfrange
+
+100 beginbfrange
+<727D> <727D> <B26F>
+<727E> <727E> <D65C>
+<727F> <727F> <D65F>
+<7280> <7280> <B552>
+<7281> <7281> <B270>
+<7284> <7284> <B551>
+<7285> <7285> <DA6B>
+<7286> <7286> <DA6A>
+<7288> <7289> <DA68>
+<728B> <728B> <DA6C>
+<728C> <728C> <DEA6>
+<728D> <728D> <DEA5>
+<728E> <728E> <DEA9>
+<7290> <7290> <DEA8>
+<7291> <7291> <DEA7>
+<7292> <7292> <BAB9>
+<7293> <7293> <E2C9>
+<7295> <7295> <E2C8>
+<7296> <7296> <BABA>
+<7297> <7297> <E2C7>
+<7298> <7298> <E673>
+<729A> <729A> <E674>
+<729B> <729B> <BCF9>
+<729D> <729E> <EA59>
+<72A1> <72A1> <F272>
+<72A2> <72A2> <C37D>
+<72A3> <72A3> <F271>
+<72A4> <72A4> <F270>
+<72A5> <72A6> <F26E>
+<72A7> <72A7> <C4EB>
+<72A8> <72A8> <F46C>
+<72A9> <72A9> <F6EE>
+<72AA> <72AA> <F8F7>
+<72AC> <72AC> <A4FC>
+<72AE> <72AE> <C9A5>
+<72AF> <72AF> <A5C7>
+<72B0> <72B0> <C9A6>
+<72B4> <72B5> <CA43>
+<72BA> <72BA> <CB66>
+<72BD> <72BD> <CB62>
+<72BF> <72BF> <CB61>
+<72C0> <72C0> <AAAC>
+<72C1> <72C1> <CB65>
+<72C2> <72C2> <A867>
+<72C3> <72C3> <CB63>
+<72C4> <72C4> <A866>
+<72C5> <72C5> <CB67>
+<72C6> <72C6> <CB64>
+<72C9> <72C9> <CD5F>
+<72CA> <72CA> <CFBE>
+<72CB> <72CB> <CD5D>
+<72CC> <72CC> <CD64>
+<72CE> <72CE> <AAAD>
+<72D0> <72D0> <AAB0>
+<72D1> <72D1> <CD65>
+<72D2> <72D2> <CD61>
+<72D4> <72D4> <CD62>
+<72D6> <72D6> <CD5C>
+<72D7> <72D7> <AAAF>
+<72D8> <72D8> <CD5E>
+<72D9> <72D9> <AAAE>
+<72DA> <72DA> <CD63>
+<72DC> <72DC> <CD60>
+<72DF> <72DF> <CFC2>
+<72E0> <72E1> <ACBD>
+<72E3> <72E3> <CFC5>
+<72E4> <72E4> <CFBF>
+<72E6> <72E6> <CFC4>
+<72E8> <72E8> <CFC0>
+<72E9> <72E9> <ACBC>
+<72EA> <72EA> <CFC3>
+<72EB> <72EB> <CFC1>
+<72F3> <72F3> <D2A8>
+<72F4> <72F4> <D2A5>
+<72F6> <72F6> <D2A7>
+<72F7> <72F7> <AF58>
+<72F8> <72F8> <AF57>
+<72F9> <72F9> <AF55>
+<72FA> <72FA> <D2A4>
+<72FB> <72FB> <D2A9>
+<72FC> <72FC> <AF54>
+<72FD> <72FD> <AF56>
+<72FE> <72FE> <D2A6>
+<72FF> <72FF> <D667>
+<7300> <7300> <D2A3>
+<7301> <7301> <D2AA>
+<7307> <7307> <D662>
+<7308> <7308> <D666>
+<730A> <730A> <D665>
+<730B> <730B> <DA6E>
+<730C> <730C> <DA79>
+<730F> <730F> <D668>
+<7311> <7311> <D663>
+<7312> <7312> <DA6D>
+<7313> <7313> <B274>
+<7316> <7316> <B273>
+<7317> <7317> <D661>
+<7318> <7318> <D664>
+<7319> <7319> <B275>
+<731B> <731B> <B272>
+endbfrange
+
+100 beginbfrange
+<731C> <731C> <B271>
+<731D> <731D> <D660>
+<731E> <731E> <D669>
+<7322> <7322> <DA70>
+<7323> <7323> <DA77>
+<7325> <7325> <B554>
+<7326> <7326> <DA76>
+<7327> <7327> <DA73>
+<7329> <7329> <B556>
+<732D> <732D> <DA75>
+<7330> <7330> <DA6F>
+<7331> <7331> <DA71>
+<7332> <7332> <DA74>
+<7333> <7333> <DA72>
+<7334> <7334> <B555>
+<7335> <7335> <DA78>
+<7336> <7336> <B553>
+<7337> <7337> <B7DF>
+<733A> <733A> <DEAD>
+<733B> <733B> <DEAC>
+<733C> <733C> <DEAA>
+<733E> <733E> <B7E2>
+<733F> <733F> <B7E1>
+<7340> <7340> <DEAE>
+<7342> <7342> <DEAB>
+<7343> <7343> <E2CA>
+<7344> <7344> <BABB>
+<7345> <7345> <B7E0>
+<7349> <7349> <DEB0>
+<734A> <734A> <DEAF>
+<734C> <734C> <E2CD>
+<734D> <734D> <E2CB>
+<734E> <734E> <BCFA>
+<7350> <7350> <BABC>
+<7351> <7351> <E2CC>
+<7352> <7352> <E676>
+<7357> <7357> <BCFB>
+<7358> <7358> <E675>
+<7359> <7359> <E67E>
+<735A> <735A> <E67D>
+<735B> <735B> <E67B>
+<735D> <735D> <E67A>
+<735E> <7360> <E677>
+<7361> <7361> <E67C>
+<7362> <7362> <E6A1>
+<7365> <7365> <EA5F>
+<7366> <7367> <EA5C>
+<7368> <7368> <BF57>
+<7369> <7369> <EA5B>
+<736A> <736A> <EA61>
+<736B> <736B> <EA60>
+<736C> <736C> <EA5E>
+<736E> <736F> <ED64>
+<7370> <7370> <C0F1>
+<7372> <7372> <C0F2>
+<7373> <7373> <ED63>
+<7375> <7375> <C279>
+<7376> <7376> <EFFE>
+<7377> <7377> <C278>
+<7378> <7378> <C37E>
+<737A> <737A> <C3A1>
+<737B> <737B> <C46D>
+<737C> <737C> <F46E>
+<737D> <737D> <F46D>
+<737E> <737E> <F5DD>
+<737F> <737F> <F6EF>
+<7380> <7380> <C57A>
+<7381> <7381> <F7E8>
+<7382> <7382> <F7E7>
+<7383> <7383> <F7E9>
+<7384> <7384> <A5C8>
+<7385> <7385> <CFC6>
+<7386> <7386> <AF59>
+<7387> <7387> <B276>
+<7388> <7388> <D66A>
+<7389> <7389> <A5C9>
+<738A> <738A> <C9A7>
+<738B> <738B> <A4FD>
+<738E> <738E> <CA45>
+<7392> <7392> <CB6C>
+<7393> <7394> <CB6A>
+<7395> <7395> <CB68>
+<7396> <7396> <A868>
+<7397> <7397> <CB69>
+<739D> <739D> <CD6D>
+<739F> <739F> <AAB3>
+<73A0> <73A0> <CD6B>
+<73A1> <73A1> <CD67>
+<73A2> <73A2> <CD6A>
+<73A4> <73A4> <CD66>
+<73A5> <73A5> <AAB5>
+<73A6> <73A6> <CD69>
+<73A8> <73A8> <AAB2>
+<73A9> <73A9> <AAB1>
+<73AB> <73AB> <AAB4>
+<73AC> <73AC> <CD6C>
+<73AD> <73AD> <CD68>
+<73B2> <73B2> <ACC2>
+<73B3> <73B3> <ACC5>
+<73B4> <73B4> <CFCE>
+endbfrange
+
+100 beginbfrange
+<73B5> <73B5> <CFCD>
+<73B6> <73B6> <CFCC>
+<73B7> <73B7> <ACBF>
+<73B8> <73B8> <CFD5>
+<73B9> <73B9> <CFCB>
+<73BB> <73BB> <ACC1>
+<73BC> <73BC> <D2AF>
+<73BE> <73BE> <CFD2>
+<73BF> <73BF> <CFD0>
+<73C0> <73C0> <ACC4>
+<73C2> <73C2> <CFC8>
+<73C3> <73C3> <CFD3>
+<73C5> <73C5> <CFCA>
+<73C6> <73C6> <CFD4>
+<73C7> <73C7> <CFD1>
+<73C8> <73C8> <CFC9>
+<73CA> <73CA> <ACC0>
+<73CB> <73CB> <CFD6>
+<73CC> <73CC> <CFC7>
+<73CD> <73CD> <ACC3>
+<73D2> <73D2> <D2B4>
+<73D3> <73D3> <D2AB>
+<73D4> <73D4> <D2B6>
+<73D6> <73D6> <D2AE>
+<73D7> <73D8> <D2B9>
+<73D9> <73D9> <D2AC>
+<73DA> <73DA> <D2B8>
+<73DB> <73DB> <D2B5>
+<73DC> <73DC> <D2B3>
+<73DD> <73DD> <D2B7>
+<73DE> <73DE> <AF5F>
+<73E0> <73E0> <AF5D>
+<73E3> <73E3> <D2B1>
+<73E5> <73E5> <D2AD>
+<73E7> <73E7> <D2B0>
+<73E8> <73E8> <D2BB>
+<73E9> <73E9> <D2B2>
+<73EA> <73EA> <AF5E>
+<73EB> <73EB> <CFCF>
+<73ED> <73ED> <AF5A>
+<73EE> <73EE> <AF5C>
+<73F4> <73F4> <D678>
+<73F5> <73F5> <D66D>
+<73F6> <73F6> <D66B>
+<73F8> <73F8> <D66C>
+<73FA> <73FA> <D673>
+<73FC> <73FC> <D674>
+<73FD> <73FD> <D670>
+<73FE> <73FE> <B27B>
+<73FF> <73FF> <D675>
+<7400> <7400> <D672>
+<7401> <7401> <D66F>
+<7403> <7403> <B279>
+<7404> <7404> <D66E>
+<7405> <7405> <B277>
+<7406> <7406> <B27A>
+<7407> <7407> <D671>
+<7408> <7408> <D679>
+<7409> <7409> <AF5B>
+<740A> <740A> <B278>
+<740B> <740B> <D677>
+<740C> <740C> <D676>
+<740D> <740D> <B27C>
+<7416> <7416> <DA7E>
+<741A> <741A> <DAA1>
+<741B> <741B> <B560>
+<741D> <741D> <DAA7>
+<7420> <7420> <DAA9>
+<7421> <7421> <DAA2>
+<7422> <7422> <B55A>
+<7423> <7423> <DAA6>
+<7424> <7424> <DAA5>
+<7425> <7425> <B55B>
+<7426> <7426> <B561>
+<7428> <7428> <B562>
+<7429> <7429> <DAA8>
+<742A> <742A> <B558>
+<742B> <742B> <DA7D>
+<742C> <742C> <DA7B>
+<742D> <742D> <DAA3>
+<742E> <742E> <DA7A>
+<742F> <742F> <B55F>
+<7430> <7430> <DA7C>
+<7431> <7431> <DAA4>
+<7432> <7432> <DAAA>
+<7433> <7433> <B559>
+<7434> <7434> <B55E>
+<7435> <7436> <B55C>
+<743A> <743A> <B557>
+<743F> <743F> <B7E9>
+<7440> <7440> <DEB7>
+<7441> <7441> <B7E8>
+<7442> <7442> <DEBB>
+<7444> <7444> <DEB1>
+<7446> <7446> <DEBC>
+<744A> <744B> <DEB2>
+<744D> <744D> <DEBD>
+<744E> <744E> <DEBA>
+<744F> <7450> <DEB8>
+<7451> <7451> <DEB5>
+endbfrange
+
+100 beginbfrange
+<7452> <7452> <DEB4>
+<7454> <7454> <DEBE>
+<7455> <7455> <B7E5>
+<7457> <7457> <DEB6>
+<7459> <7459> <B7EA>
+<745A> <745A> <B7E4>
+<745B> <745C> <B7EB>
+<745E> <745E> <B7E7>
+<745F> <745F> <B7E6>
+<7462> <7462> <E2CE>
+<7463> <7463> <BABE>
+<7464> <7464> <BABD>
+<7467> <7467> <E2D3>
+<7469> <7469> <BCFC>
+<746A> <746A> <BABF>
+<746D> <746D> <BAC1>
+<746E> <746E> <E2D4>
+<746F> <746F> <B7E3>
+<7470> <7470> <BAC0>
+<7471> <7471> <E2D0>
+<7472> <7472> <E2D2>
+<7473> <7473> <E2CF>
+<7475> <7475> <E2D1>
+<7479> <7479> <E6AB>
+<747C> <747C> <E6AA>
+<747D> <747D> <E6A7>
+<747E> <747E> <BD40>
+<747F> <747F> <EA62>
+<7480> <7480> <BD41>
+<7481> <7481> <E6A6>
+<7483> <7483> <BCFE>
+<7485> <7485> <E6A8>
+<7486> <7486> <E6A5>
+<7487> <7487> <E6A2>
+<7488> <7488> <E6A9>
+<7489> <748A> <E6A3>
+<748B> <748B> <BCFD>
+<7490> <7490> <ED69>
+<7492> <7492> <EA66>
+<7494> <7494> <EA65>
+<7495> <7495> <EA67>
+<7497> <7497> <ED66>
+<7498> <7498> <BF5A>
+<749A> <749A> <EA63>
+<749C> <749C> <BF58>
+<749E> <749E> <BF5C>
+<749F> <749F> <BF5B>
+<74A0> <74A0> <EA64>
+<74A1> <74A1> <EA68>
+<74A3> <74A3> <BF59>
+<74A5> <74A5> <ED6D>
+<74A6> <74A6> <C0F5>
+<74A7> <74A7> <C27A>
+<74A8> <74A8> <C0F6>
+<74A9> <74A9> <C0F3>
+<74AA> <74AA> <ED6A>
+<74AB> <74AB> <ED68>
+<74AD> <74AD> <ED6B>
+<74AF> <74AF> <ED6E>
+<74B0> <74B0> <C0F4>
+<74B1> <74B1> <ED6C>
+<74B2> <74B2> <ED67>
+<74B5> <74B5> <F042>
+<74B6> <74B6> <F045>
+<74B7> <74B7> <F275>
+<74B8> <74B8> <F040>
+<74BA> <74BA> <F46F>
+<74BB> <74BB> <F046>
+<74BD> <74BD> <C3A2>
+<74BE> <74BE> <F044>
+<74BF> <74BF> <C27B>
+<74C0> <74C0> <F041>
+<74C1> <74C1> <F043>
+<74C2> <74C2> <F047>
+<74C3> <74C3> <F276>
+<74C5> <74C5> <F274>
+<74CA> <74CA> <C3A3>
+<74CB> <74CB> <F273>
+<74CF> <74CF> <C46E>
+<74D4> <74D4> <C4ED>
+<74D5> <74D5> <F6F1>
+<74D6> <74D6> <C4EC>
+<74D7> <74D7> <F6F3>
+<74D8> <74D8> <F6F0>
+<74D9> <74D9> <F6F2>
+<74DA> <74DA> <C5D0>
+<74DB> <74DB> <F8B2>
+<74DC> <74DC> <A5CA>
+<74DD> <74DD> <CD6E>
+<74DE> <74DF> <D2BC>
+<74E0> <74E0> <B27D>
+<74E1> <74E1> <DEBF>
+<74E2> <74E2> <BF5D>
+<74E3> <74E3> <C3A4>
+<74E4> <74E4> <C57B>
+<74E5> <74E5> <F8B3>
+<74E6> <74E6> <A5CB>
+<74E8> <74E8> <CD6F>
+<74E9> <74E9> <A260>
+<74EC> <74EC> <CFD7>
+endbfrange
+
+100 beginbfrange
+<74EE> <74EE> <CFD8>
+<74F4> <74F5> <D2BE>
+<74F6> <74F6> <B27E>
+<74F7> <74F7> <B2A1>
+<74FB> <74FB> <DAAB>
+<74FD> <74FD> <DEC2>
+<74FE> <74FE> <DEC1>
+<74FF> <74FF> <DEC0>
+<7500> <7500> <E2D5>
+<7502> <7503> <E2D6>
+<7504> <7504> <BAC2>
+<7507> <7507> <E6AD>
+<7508> <7508> <E6AC>
+<750B> <750B> <EA69>
+<750C> <750D> <BF5E>
+<750F> <750F> <ED72>
+<7510> <7512> <ED6F>
+<7513> <7513> <F049>
+<7514> <7514> <F048>
+<7515> <7515> <C27C>
+<7516> <7516> <F277>
+<7517> <7517> <F5DE>
+<7518> <7518> <A5CC>
+<751A> <751A> <ACC6>
+<751C> <751C> <B2A2>
+<751D> <751D> <DEC3>
+<751F> <751F> <A5CD>
+<7521> <7521> <D2C0>
+<7522> <7522> <B2A3>
+<7525> <7526> <B563>
+<7528> <7529> <A5CE>
+<752A> <752A> <CA46>
+<752B> <752B> <A86A>
+<752C> <752C> <A869>
+<752D> <752D> <ACC7>
+<752E> <752E> <CFD9>
+<752F> <752F> <DAAC>
+<7530> <7533> <A5D0>
+<7537> <7538> <A86B>
+<7539> <7539> <CB6E>
+<753A> <753A> <CB6D>
+<753D> <753D> <AAB6>
+<753E> <753E> <CD72>
+<753F> <7540> <CD70>
+<7547> <7548> <CFDA>
+<754B> <754B> <ACCB>
+<754C> <754C> <ACC9>
+<754E> <754E> <ACCA>
+<754F> <754F> <ACC8>
+<7554> <7554> <AF60>
+<7559> <7559> <AF64>
+<755A> <755A> <AF63>
+<755B> <755B> <D2C1>
+<755C> <755C> <AF62>
+<755D> <755D> <AF61>
+<755F> <755F> <D2C2>
+<7562> <7562> <B2A6>
+<7563> <7563> <D67B>
+<7564> <7564> <D67A>
+<7565> <7566> <B2A4>
+<756A> <756A> <B566>
+<756B> <756B> <B565>
+<756C> <756C> <DAAE>
+<756F> <756F> <DAAD>
+<7570> <7570> <B2A7>
+<7576> <7576> <B7ED>
+<7577> <7577> <DEC5>
+<7578> <7578> <B7EE>
+<7579> <7579> <DEC4>
+<757D> <757D> <E2D8>
+<757E> <757E> <E6AE>
+<757F> <757F> <BD42>
+<7580> <7580> <EA6A>
+<7584> <7584> <ED73>
+<7586> <7586> <C3A6>
+<7587> <7587> <C3A5>
+<758A> <758A> <C57C>
+<758B> <758B> <A5D4>
+<758C> <758C> <CD73>
+<758F> <758F> <B2A8>
+<7590> <7590> <E2D9>
+<7591> <7591> <BAC3>
+<7594> <7595> <CB6F>
+<7598> <7598> <CD74>
+<7599> <759A> <AAB8>
+<759D> <759D> <AAB7>
+<75A2> <75A3> <ACCF>
+<75A4> <75A5> <ACCD>
+<75A7> <75A7> <CFDC>
+<75AA> <75AA> <CFDD>
+<75AB> <75AB> <ACCC>
+<75B0> <75B0> <D2C3>
+<75B2> <75B3> <AF68>
+<75B5> <75B5> <B2AB>
+<75B6> <75B6> <D2C9>
+<75B8> <75B8> <AF6E>
+<75B9> <75B9> <AF6C>
+<75BA> <75BA> <D2CA>
+<75BB> <75BB> <D2C5>
+<75BC> <75BC> <AF6B>
+endbfrange
+
+100 beginbfrange
+<75BD> <75BD> <AF6A>
+<75BE> <75BE> <AF65>
+<75BF> <75BF> <D2C8>
+<75C0> <75C0> <D2C7>
+<75C1> <75C1> <D2C4>
+<75C2> <75C2> <AF6D>
+<75C4> <75C4> <D2C6>
+<75C5> <75C5> <AF66>
+<75C7> <75C7> <AF67>
+<75CA> <75CA> <B2AC>
+<75CB> <75CC> <D6A1>
+<75CD> <75CD> <B2AD>
+<75CE> <75CE> <D67C>
+<75CF> <75CF> <D67E>
+<75D0> <75D0> <D6A4>
+<75D1> <75D1> <D6A3>
+<75D2> <75D2> <D67D>
+<75D4> <75D5> <B2A9>
+<75D7> <75D7> <DAB6>
+<75D8> <75D8> <B56B>
+<75D9> <75D9> <B56A>
+<75DA> <75DA> <DAB0>
+<75DB> <75DB> <B568>
+<75DD> <75DD> <DAB3>
+<75DE> <75DE> <B56C>
+<75DF> <75DF> <DAB4>
+<75E0> <75E0> <B56D>
+<75E1> <75E1> <DAB1>
+<75E2> <75E2> <B567>
+<75E3> <75E3> <B569>
+<75E4> <75E4> <DAB5>
+<75E6> <75E6> <DAB2>
+<75E7> <75E7> <DAAF>
+<75ED> <75ED> <DED2>
+<75EF> <75EF> <DEC7>
+<75F0> <75F0> <B7F0>
+<75F1> <75F1> <B7F3>
+<75F2> <75F2> <B7F2>
+<75F3> <75F3> <B7F7>
+<75F4> <75F4> <B7F6>
+<75F5> <75F5> <DED3>
+<75F6> <75F6> <DED1>
+<75F7> <75F7> <DECA>
+<75F8> <75F8> <DECE>
+<75F9> <75F9> <DECD>
+<75FA> <75FA> <B7F4>
+<75FB> <75FB> <DED0>
+<75FC> <75FC> <DECC>
+<75FD> <75FD> <DED4>
+<75FE> <75FE> <DECB>
+<75FF> <75FF> <B7F5>
+<7600> <7600> <B7EF>
+<7601> <7601> <B7F1>
+<7603> <7603> <DEC9>
+<7608> <7608> <E2DB>
+<7609> <7609> <BAC7>
+<760A> <760A> <E2DF>
+<760B> <760B> <BAC6>
+<760C> <760C> <E2DC>
+<760D> <760D> <BAC5>
+<760F> <760F> <DEC8>
+<7610> <7610> <DECF>
+<7611> <7611> <E2DE>
+<7613> <7613> <BAC8>
+<7614> <7614> <E2E0>
+<7615> <7615> <E2DD>
+<7616> <7616> <E2DA>
+<7619> <7619> <E6B1>
+<761A> <761A> <E6B5>
+<761B> <761B> <E6B7>
+<761C> <761C> <E6B3>
+<761D> <761D> <E6B2>
+<761E> <761E> <E6B0>
+<761F> <761F> <BD45>
+<7620> <7620> <BD43>
+<7621> <7622> <BD48>
+<7623> <7623> <E6B4>
+<7624> <7624> <BD46>
+<7625> <7625> <E6AF>
+<7626> <7626> <BD47>
+<7627> <7627> <BAC4>
+<7628> <7628> <E6B6>
+<7629> <7629> <BD44>
+<762D> <762D> <EA6C>
+<762F> <762F> <EA6B>
+<7630> <7630> <EA73>
+<7631> <7631> <EA6D>
+<7632> <7632> <EA72>
+<7633> <7633> <EA6F>
+<7634> <7634> <BF60>
+<7635> <7635> <EA71>
+<7638> <7638> <BF61>
+<763A> <763A> <BF62>
+<763C> <763C> <EA70>
+<763D> <763D> <EA6E>
+<7642> <7642> <C0F8>
+<7643> <7643> <ED74>
+<7646> <7646> <C0F7>
+<7647> <7647> <ED77>
+<7648> <7649> <ED75>
+endbfrange
+
+100 beginbfrange
+<764C> <764C> <C0F9>
+<7650> <7650> <F04D>
+<7652> <7652> <C2A1>
+<7653> <7653> <F04E>
+<7656> <7656> <C27D>
+<7657> <7657> <F04F>
+<7658> <7658> <C27E>
+<7659> <7659> <F04C>
+<765A> <765A> <F050>
+<765C> <765C> <F04A>
+<765F> <765F> <C3A7>
+<7660> <7660> <F278>
+<7661> <7661> <C3A8>
+<7662> <7662> <C46F>
+<7664> <7664> <F04B>
+<7665> <7665> <C470>
+<7669> <7669> <C4EE>
+<766A> <766A> <F5DF>
+<766C> <766C> <C57E>
+<766D> <766D> <F6F4>
+<766E> <766E> <C57D>
+<7670> <7670> <F7EA>
+<7671> <7672> <C5F5>
+<7675> <7675> <F9CC>
+<7678> <7678> <ACD1>
+<7679> <7679> <CFDE>
+<767B> <767C> <B56E>
+<767D> <767D> <A5D5>
+<767E> <767E> <A6CA>
+<767F> <767F> <CA47>
+<7681> <7681> <CB71>
+<7682> <7682> <A86D>
+<7684> <7684> <AABA>
+<7686> <7688> <ACD2>
+<7689> <7689> <D6A6>
+<768A> <768A> <D2CB>
+<768B> <768B> <AF6F>
+<768E> <768E> <B2AE>
+<768F> <768F> <D6A5>
+<7692> <7692> <DAB8>
+<7693> <7693> <B571>
+<7695> <7695> <DAB7>
+<7696> <7696> <B570>
+<7699> <7699> <DED5>
+<769A> <769A> <BD4A>
+<769B> <769B> <E6BB>
+<769C> <769E> <E6B8>
+<76A4> <76A4> <ED78>
+<76A6> <76A6> <F051>
+<76AA> <76AA> <F471>
+<76AB> <76AB> <F470>
+<76AD> <76AD> <F6F5>
+<76AE> <76AE> <A5D6>
+<76AF> <76AF> <CD75>
+<76B0> <76B0> <AF70>
+<76B4> <76B4> <B572>
+<76B5> <76B5> <DED6>
+<76B8> <76B8> <E2E1>
+<76BA> <76BA> <BD4B>
+<76BB> <76BB> <EA74>
+<76BD> <76BD> <F052>
+<76BE> <76BE> <F472>
+<76BF> <76BF> <A5D7>
+<76C2> <76C2> <AABB>
+<76C3> <76C3> <ACD7>
+<76C4> <76C4> <CFDF>
+<76C5> <76C5> <ACD8>
+<76C6> <76C6> <ACD6>
+<76C8> <76C8> <ACD5>
+<76C9> <76C9> <D2CC>
+<76CA> <76CA> <AF71>
+<76CD> <76CE> <AF72>
+<76D2> <76D2> <B2B0>
+<76D3> <76D3> <D6A7>
+<76D4> <76D4> <B2AF>
+<76DA> <76DA> <DAB9>
+<76DB> <76DB> <B2B1>
+<76DC> <76DC> <B573>
+<76DD> <76DD> <DED7>
+<76DE> <76DF> <B7F8>
+<76E1> <76E1> <BAC9>
+<76E3> <76E3> <BACA>
+<76E4> <76E4> <BD4C>
+<76E5> <76E5> <BF64>
+<76E6> <76E6> <EA75>
+<76E7> <76E7> <BF63>
+<76E9> <76E9> <ED79>
+<76EA> <76EA> <C0FA>
+<76EC> <76EC> <F053>
+<76ED> <76ED> <F473>
+<76EE> <76EE> <A5D8>
+<76EF> <76EF> <A86E>
+<76F0> <76F0> <CD78>
+<76F1> <76F1> <CD77>
+<76F2> <76F2> <AABC>
+<76F3> <76F3> <CD76>
+<76F4> <76F4> <AABD>
+<76F5> <76F5> <CD79>
+<76F7> <76F7> <CFE5>
+<76F8> <76F8> <ACDB>
+endbfrange
+
+100 beginbfrange
+<76F9> <76F9> <ACDA>
+<76FA> <76FA> <CFE7>
+<76FB> <76FB> <CFE6>
+<76FC> <76FC> <ACDF>
+<76FE> <76FE> <ACDE>
+<7701> <7701> <ACD9>
+<7703> <7705> <CFE1>
+<7707> <7707> <ACE0>
+<7708> <7708> <CFE0>
+<7709> <7709> <ACDC>
+<770A> <770A> <CFE4>
+<770B> <770B> <ACDD>
+<7710> <7710> <D2CF>
+<7711> <7711> <D2D3>
+<7712> <7712> <D2D1>
+<7713> <7713> <D2D0>
+<7715> <7715> <D2D4>
+<7719> <771A> <D2D5>
+<771B> <771B> <D2CE>
+<771D> <771D> <D2CD>
+<771F> <7720> <AF75>
+<7722> <7722> <D2D7>
+<7723> <7723> <D2D2>
+<7725> <7725> <D6B0>
+<7727> <7727> <D2D8>
+<7728> <7728> <AF77>
+<7729> <7729> <AF74>
+<772D> <772D> <D6AA>
+<772F> <772F> <D6A9>
+<7731> <7732> <D6AB>
+<7733> <7733> <D6AE>
+<7734> <7734> <D6AD>
+<7735> <7735> <D6B2>
+<7736> <7736> <B2B5>
+<7737> <7737> <B2B2>
+<7738> <7738> <B2B6>
+<7739> <7739> <D6A8>
+<773A> <773A> <B2B7>
+<773B> <773B> <D6B1>
+<773C> <773C> <B2B4>
+<773D> <773D> <D6AF>
+<773E> <773E> <B2B3>
+<7744> <7744> <DABC>
+<7745> <7745> <DABE>
+<7746> <7747> <DABA>
+<774A> <774A> <DABF>
+<774B> <774C> <DAC1>
+<774D> <774D> <DABD>
+<774E> <774E> <DAC0>
+<774F> <774F> <B574>
+<7752> <7752> <DEDB>
+<7754> <7754> <DEE0>
+<7755> <7755> <DED8>
+<7756> <7756> <DEDC>
+<7759> <7759> <DEE1>
+<775A> <775A> <DEDD>
+<775B> <775B> <B7FA>
+<775C> <775C> <B843>
+<775E> <775E> <B7FD>
+<775F> <7760> <DED9>
+<7761> <7761> <BACE>
+<7762> <7762> <B846>
+<7763> <7763> <B7FE>
+<7765> <7765> <B844>
+<7766> <7766> <B7FC>
+<7767> <7767> <DEDF>
+<7768> <7768> <B845>
+<7769> <7769> <DEDE>
+<776A> <776A> <B841>
+<776B> <776B> <B7FB>
+<776C> <776C> <B842>
+<776D> <776D> <DEE2>
+<776E> <776E> <E2E6>
+<776F> <776F> <E2E8>
+<7779> <7779> <B840>
+<777C> <777C> <E2E3>
+<777D> <777D> <BACC>
+<777E> <777E> <E2E9>
+<777F> <777F> <BACD>
+<7780> <7780> <E2E7>
+<7781> <7781> <E2E2>
+<7782> <7782> <E2E5>
+<7783> <7783> <E2EA>
+<7784> <7784> <BACB>
+<7785> <7785> <E2E4>
+<7787> <7787> <BD4E>
+<7788> <7788> <E6BF>
+<7789> <7789> <E6BE>
+<778B> <778B> <BD51>
+<778C> <778C> <BD4F>
+<778D> <778D> <E6BC>
+<778E> <778E> <BD4D>
+<778F> <778F> <E6BD>
+<7791> <7791> <BD50>
+<7795> <7795> <EA7D>
+<7797> <7797> <EAA1>
+<7799> <7799> <EA7E>
+<779A> <779A> <EA76>
+<779B> <779B> <EA7A>
+<779C> <779C> <EA79>
+endbfrange
+
+100 beginbfrange
+<779D> <779D> <EA77>
+<779E> <779F> <BF66>
+<77A0> <77A0> <BF65>
+<77A1> <77A1> <EA78>
+<77A2> <77A3> <EA7B>
+<77A5> <77A5> <BF68>
+<77A7> <77A7> <C140>
+<77A8> <77A8> <EDA3>
+<77AA> <77AA> <C0FC>
+<77AB> <77AB> <ED7B>
+<77AC> <77AC> <C0FE>
+<77AD> <77AD> <C141>
+<77B0> <77B0> <C0FD>
+<77B1> <77B1> <EDA2>
+<77B2> <77B2> <ED7C>
+<77B3> <77B3> <C0FB>
+<77B4> <77B4> <EDA1>
+<77B5> <77B5> <ED7A>
+<77B6> <77B6> <ED7E>
+<77B7> <77B7> <ED7D>
+<77BA> <77BA> <F055>
+<77BB> <77BC> <C2A4>
+<77BD> <77BD> <C2A2>
+<77BF> <77BF> <C2A3>
+<77C2> <77C2> <F054>
+<77C4> <77C4> <F27B>
+<77C7> <77C7> <C3A9>
+<77C9> <77CA> <F279>
+<77CC> <77CC> <F474>
+<77CD> <77CD> <F477>
+<77CE> <77CF> <F475>
+<77D0> <77D0> <F5E0>
+<77D3> <77D3> <C4EF>
+<77D4> <77D4> <F7EB>
+<77D5> <77D5> <F8B4>
+<77D7> <77D7> <C5F7>
+<77D8> <77D9> <F8F8>
+<77DA> <77DA> <C666>
+<77DB> <77DB> <A5D9>
+<77DC> <77DC> <ACE1>
+<77DE> <77DE> <DAC3>
+<77E0> <77E0> <DEE3>
+<77E2> <77E2> <A5DA>
+<77E3> <77E3> <A86F>
+<77E5> <77E5> <AABE>
+<77E7> <77E8> <CFE8>
+<77E9> <77E9> <AF78>
+<77EC> <77EC> <DAC4>
+<77ED> <77ED> <B575>
+<77EE> <77EE> <B847>
+<77EF> <77EF> <C142>
+<77F0> <77F0> <EDA4>
+<77F1> <77F1> <F27C>
+<77F2> <77F2> <F478>
+<77F3> <77F3> <A5DB>
+<77F7> <77F7> <CDA1>
+<77F8> <77F8> <CD7A>
+<77F9> <77F9> <CD7C>
+<77FA> <77FA> <CD7E>
+<77FB> <77FB> <CD7D>
+<77FC> <77FC> <CD7B>
+<77FD> <77FD> <AABF>
+<7802> <7802> <ACE2>
+<7803> <7803> <CFF2>
+<7805> <7805> <CFED>
+<7806> <7806> <CFEA>
+<7809> <7809> <CFF1>
+<780C> <780D> <ACE4>
+<780E> <780E> <CFF0>
+<780F> <780F> <CFEF>
+<7810> <7810> <CFEE>
+<7811> <7812> <CFEB>
+<7813> <7813> <CFF3>
+<7814> <7814> <ACE3>
+<781D> <781D> <AF7C>
+<781F> <781F> <AFA4>
+<7820> <7820> <AFA3>
+<7821> <7821> <D2E1>
+<7822> <7822> <D2DB>
+<7823> <7823> <D2D9>
+<7825> <7825> <AFA1>
+<7826> <7826> <D6B9>
+<7827> <7827> <AF7A>
+<7828> <7828> <D2DE>
+<7829> <7829> <D2E2>
+<782A> <782A> <D2E4>
+<782B> <782B> <D2E0>
+<782C> <782C> <D2DA>
+<782D> <782D> <AFA2>
+<782E> <782E> <D2DF>
+<782F> <782F> <D2DD>
+<7830> <7830> <AF79>
+<7831> <7831> <D2E5>
+<7832> <7832> <AFA5>
+<7833> <7833> <D2E3>
+<7834> <7834> <AF7D>
+<7835> <7835> <D2DC>
+<7837> <7837> <AF7E>
+<7838> <7838> <AF7B>
+<7843> <7843> <B2B9>
+endbfrange
+
+100 beginbfrange
+<7845> <7845> <D6BA>
+<7848> <7848> <D6B3>
+<7849> <7849> <D6B5>
+<784A> <784A> <D6B7>
+<784C> <784C> <D6B8>
+<784D> <784D> <D6B6>
+<784E> <784E> <B2BA>
+<7850> <7850> <D6BB>
+<7852> <7852> <D6B4>
+<785C> <785C> <DAC8>
+<785D> <785D> <B576>
+<785E> <785E> <DAD0>
+<7860> <7860> <DAC5>
+<7862> <7862> <DAD1>
+<7864> <7865> <DAC6>
+<7868> <7868> <DACF>
+<7869> <7869> <DACE>
+<786A> <786A> <DACB>
+<786B> <786B> <B2B8>
+<786C> <786C> <B577>
+<786D> <786D> <DAC9>
+<786E> <786E> <DACC>
+<786F> <786F> <B578>
+<7870> <7870> <DACD>
+<7871> <7871> <DACA>
+<7879> <7879> <DEEE>
+<787B> <787B> <DEF2>
+<787C> <787C> <B84E>
+<787E> <787E> <E2F0>
+<787F> <787F> <B851>
+<7880> <7880> <DEF0>
+<7883> <7883> <DEED>
+<7884> <7884> <DEE8>
+<7885> <7886> <DEEA>
+<7887> <7887> <DEE4>
+<7889> <7889> <B84D>
+<788C> <788C> <B84C>
+<788E> <788E> <B848>
+<788F> <788F> <DEE7>
+<7891> <7891> <B84F>
+<7893> <7893> <B850>
+<7894> <7894> <DEE6>
+<7895> <7895> <DEE9>
+<7896> <7896> <DEF1>
+<7897> <7898> <B84A>
+<7899> <7899> <DEEF>
+<789A> <789A> <DEE5>
+<789E> <789E> <E2F2>
+<789F> <789F> <BAD0>
+<78A0> <78A0> <E2F4>
+<78A1> <78A1> <DEEC>
+<78A2> <78A2> <E2F6>
+<78A3> <78A3> <BAD4>
+<78A4> <78A4> <E2F7>
+<78A5> <78A5> <E2F3>
+<78A7> <78A7> <BAD1>
+<78A8> <78A8> <E2EF>
+<78A9> <78A9> <BAD3>
+<78AA> <78AA> <E2EC>
+<78AB> <78AB> <E2F1>
+<78AC> <78AC> <E2F5>
+<78AD> <78AD> <E2EE>
+<78B0> <78B0> <B849>
+<78B2> <78B2> <E2EB>
+<78B3> <78B3> <BAD2>
+<78B4> <78B4> <E2ED>
+<78BA> <78BA> <BD54>
+<78BB> <78BB> <E6C1>
+<78BC> <78BC> <BD58>
+<78BE> <78BE> <BD56>
+<78C1> <78C1> <BACF>
+<78C3> <78C4> <E6C8>
+<78C5> <78C5> <BD53>
+<78C8> <78C8> <E6C7>
+<78C9> <78C9> <E6CA>
+<78CA> <78CA> <BD55>
+<78CB> <78CB> <BD52>
+<78CC> <78CC> <E6C3>
+<78CD> <78CD> <E6C0>
+<78CE> <78CE> <E6C5>
+<78CF> <78CF> <E6C2>
+<78D0> <78D0> <BD59>
+<78D1> <78D1> <E6C4>
+<78D4> <78D4> <E6C6>
+<78D5> <78D5> <BD57>
+<78DA> <78DA> <BF6A>
+<78DB> <78DB> <EAA8>
+<78DD> <78DD> <EAA2>
+<78DE> <78DE> <EAA6>
+<78DF> <78E0> <EAAC>
+<78E1> <78E2> <EAA9>
+<78E3> <78E3> <EAA7>
+<78E5> <78E5> <EAA4>
+<78E7> <78E7> <BF6C>
+<78E8> <78E8> <BF69>
+<78E9> <78E9> <EAA3>
+<78EA> <78EA> <EAA5>
+<78EC> <78EC> <BF6B>
+<78ED> <78ED> <EAAB>
+<78EF> <78EF> <C146>
+endbfrange
+
+100 beginbfrange
+<78F2> <78F2> <EDAA>
+<78F3> <78F3> <EDA5>
+<78F4> <78F4> <C145>
+<78F7> <78F7> <C143>
+<78F9> <78F9> <EDAC>
+<78FA> <78FA> <C144>
+<78FB> <78FC> <EDA8>
+<78FD> <78FD> <EDA6>
+<78FE> <78FE> <EDAD>
+<78FF> <78FF> <F056>
+<7901> <7901> <C147>
+<7902> <7902> <EDA7>
+<7904> <7904> <EDAE>
+<7905> <7905> <EDAB>
+<7909> <7909> <F05A>
+<790C> <790C> <F057>
+<790E> <790E> <C2A6>
+<7910> <7910> <F05B>
+<7911> <7911> <F05D>
+<7912> <7912> <F05C>
+<7913> <7914> <F058>
+<7917> <7917> <F2A3>
+<7919> <7919> <C3AA>
+<791B> <791B> <F27E>
+<791C> <791C> <F2A2>
+<791D> <791D> <F27D>
+<791E> <791E> <F2A4>
+<7921> <7921> <F2A1>
+<7923> <7923> <F47A>
+<7924> <7924> <F47D>
+<7925> <7925> <F479>
+<7926> <7926> <C471>
+<7927> <7928> <F47B>
+<7929> <7929> <F47E>
+<792A> <792A> <C472>
+<792B> <792B> <C474>
+<792C> <792C> <C473>
+<792D> <792D> <F5E1>
+<792F> <792F> <F5E3>
+<7931> <7931> <F5E2>
+<7935> <7935> <F6F6>
+<7938> <7938> <F8B5>
+<7939> <7939> <F8FA>
+<793A> <793A> <A5DC>
+<793D> <793D> <CB72>
+<793E> <793E> <AAC0>
+<793F> <793F> <CDA3>
+<7940> <7941> <AAC1>
+<7942> <7942> <CDA2>
+<7944> <7944> <CFF8>
+<7945> <7945> <CFF7>
+<7946> <7946> <ACE6>
+<7947> <7947> <ACE9>
+<7948> <7948> <ACE8>
+<7949> <7949> <ACE7>
+<794A> <794A> <CFF4>
+<794B> <794B> <CFF6>
+<794C> <794C> <CFF5>
+<794F> <794F> <D2E8>
+<7950> <7950> <AFA7>
+<7951> <7951> <D2EC>
+<7952> <7952> <D2EB>
+<7953> <7953> <D2EA>
+<7954> <7954> <D2E6>
+<7955> <7955> <AFA6>
+<7956> <7956> <AFAA>
+<7957> <7957> <AFAD>
+<795A> <795A> <AFAE>
+<795B> <795B> <D2E7>
+<795C> <795C> <D2E9>
+<795D> <795D> <AFAC>
+<795E> <795E> <AFAB>
+<795F> <795F> <AFA9>
+<7960> <7960> <AFA8>
+<7961> <7961> <D6C2>
+<7963> <7963> <D6C0>
+<7964> <7964> <D6BC>
+<7965> <7965> <B2BB>
+<7967> <7967> <D6BD>
+<7968> <7968> <B2BC>
+<7969> <796A> <D6BE>
+<796B> <796B> <D6C1>
+<796D> <796D> <B2BD>
+<7970> <7970> <DAD5>
+<7972> <7972> <DAD4>
+<7973> <7973> <DAD3>
+<7974> <7974> <DAD2>
+<7979> <7979> <DEF6>
+<797A> <797A> <B852>
+<797C> <797C> <DEF3>
+<797D> <797D> <DEF5>
+<797F> <797F> <B853>
+<7981> <7981> <B854>
+<7982> <7982> <DEF4>
+<7988> <7988> <E341>
+<798A> <798B> <E2F9>
+<798D> <798D> <BAD7>
+<798E> <798F> <BAD5>
+<7990> <7990> <E343>
+<7992> <7992> <E342>
+endbfrange
+
+100 beginbfrange
+<7993> <7993> <E2FE>
+<7994> <7994> <E2FD>
+<7995> <7995> <E2FC>
+<7996> <7996> <E2FB>
+<7997> <7997> <E340>
+<7998> <7998> <E2F8>
+<799A> <799A> <E6CB>
+<799B> <799B> <E6D0>
+<799C> <799C> <E6CE>
+<79A0> <79A0> <E6CD>
+<79A1> <79A1> <E6CC>
+<79A2> <79A2> <E6CF>
+<79A4> <79A4> <EAAE>
+<79A6> <79A6> <BF6D>
+<79A7> <79A7> <C148>
+<79A8> <79A8> <EDB0>
+<79AA> <79AA> <C149>
+<79AB> <79AB> <EDAF>
+<79AC> <79AC> <F05F>
+<79AD> <79AD> <F05E>
+<79AE> <79AE> <C2A7>
+<79B0> <79B0> <F2A5>
+<79B1> <79B1> <C3AB>
+<79B2> <79B2> <F4A1>
+<79B3> <79B3> <C5A1>
+<79B4> <79B4> <F6F7>
+<79B6> <79B6> <F8B7>
+<79B7> <79B7> <F8B6>
+<79B8> <79B8> <C9A8>
+<79B9> <79BA> <ACEA>
+<79BB> <79BB> <D6C3>
+<79BD> <79BD> <B856>
+<79BE> <79BE> <A5DD>
+<79BF> <79BF> <A872>
+<79C0> <79C0> <A871>
+<79C1> <79C1> <A870>
+<79C5> <79C5> <CDA4>
+<79C8> <79C8> <AAC4>
+<79C9> <79C9> <AAC3>
+<79CB> <79CB> <ACEE>
+<79CD> <79CD> <CFFA>
+<79CE> <79CE> <CFFD>
+<79CF> <79CF> <CFFB>
+<79D1> <79D2> <ACEC>
+<79D5> <79D5> <CFF9>
+<79D6> <79D6> <CFFC>
+<79D8> <79D8> <AFB5>
+<79DC> <79DC> <D2F3>
+<79DD> <79DD> <D2F5>
+<79DE> <79DE> <D2F4>
+<79DF> <79DF> <AFB2>
+<79E0> <79E0> <D2EF>
+<79E3> <79E3> <AFB0>
+<79E4> <79E4> <AFAF>
+<79E6> <79E6> <AFB3>
+<79E7> <79E7> <AFB1>
+<79E9> <79E9> <AFB4>
+<79EA> <79EA> <D2F2>
+<79EB> <79EC> <D2ED>
+<79ED> <79ED> <D2F1>
+<79EE> <79EE> <D2F0>
+<79F6> <79F7> <D6C6>
+<79F8> <79F8> <D6C5>
+<79FA> <79FA> <D6C4>
+<79FB> <79FB> <B2BE>
+<7A00> <7A00> <B57D>
+<7A02> <7A02> <DAD6>
+<7A03> <7A03> <DAD8>
+<7A04> <7A04> <DADA>
+<7A05> <7A05> <B57C>
+<7A08> <7A08> <B57A>
+<7A0A> <7A0A> <DAD7>
+<7A0B> <7A0B> <B57B>
+<7A0C> <7A0C> <DAD9>
+<7A0D> <7A0D> <B579>
+<7A10> <7A10> <DF41>
+<7A11> <7A11> <DEF7>
+<7A12> <7A12> <DEFA>
+<7A13> <7A13> <DEFE>
+<7A14> <7A14> <B85A>
+<7A15> <7A15> <DEFC>
+<7A17> <7A17> <DEFB>
+<7A18> <7A19> <DEF8>
+<7A1A> <7A1A> <B858>
+<7A1B> <7A1B> <DF40>
+<7A1C> <7A1C> <B857>
+<7A1E> <7A1E> <B85C>
+<7A1F> <7A1F> <B85B>
+<7A20> <7A20> <B859>
+<7A22> <7A22> <DEFD>
+<7A26> <7A26> <E349>
+<7A28> <7A28> <E348>
+<7A2B> <7A2B> <E344>
+<7A2E> <7A2E> <BAD8>
+<7A2F> <7A2F> <E347>
+<7A30> <7A30> <E346>
+<7A31> <7A31> <BAD9>
+<7A37> <7A37> <BD5E>
+<7A39> <7A39> <E6D2>
+<7A3B> <7A3B> <BD5F>
+endbfrange
+
+100 beginbfrange
+<7A3C> <7A3C> <BD5B>
+<7A3D> <7A3D> <BD5D>
+<7A3F> <7A3F> <BD5A>
+<7A40> <7A40> <BD5C>
+<7A44> <7A44> <EAAF>
+<7A46> <7A46> <BF70>
+<7A47> <7A47> <EAB1>
+<7A48> <7A48> <EAB0>
+<7A4A> <7A4A> <E345>
+<7A4B> <7A4B> <BF72>
+<7A4C> <7A4C> <BF71>
+<7A4D> <7A4E> <BF6E>
+<7A54> <7A54> <EDB5>
+<7A56> <7A56> <EDB3>
+<7A57> <7A57> <C14A>
+<7A58> <7A58> <EDB4>
+<7A5A> <7A5A> <EDB6>
+<7A5B> <7A5B> <EDB2>
+<7A5C> <7A5C> <EDB1>
+<7A5F> <7A5F> <F060>
+<7A60> <7A60> <C2AA>
+<7A61> <7A62> <C2A8>
+<7A67> <7A68> <F2A6>
+<7A69> <7A69> <C3AD>
+<7A6B> <7A6B> <C3AC>
+<7A6C> <7A6D> <F4A3>
+<7A6E> <7A6E> <F4A2>
+<7A70> <7A71> <F6F8>
+<7A74> <7A74> <A5DE>
+<7A75> <7A75> <CA48>
+<7A76> <7A76> <A873>
+<7A78> <7A78> <CDA5>
+<7A79> <7A79> <AAC6>
+<7A7A> <7A7A> <AAC5>
+<7A7B> <7A7B> <CDA6>
+<7A7E> <7A7E> <D040>
+<7A7F> <7A7F> <ACEF>
+<7A80> <7A80> <CFFE>
+<7A81> <7A81> <ACF0>
+<7A84> <7A84> <AFB6>
+<7A85> <7A85> <D2F8>
+<7A86> <7A86> <D2F6>
+<7A87> <7A87> <D2FC>
+<7A88> <7A88> <AFB7>
+<7A89> <7A89> <D2F7>
+<7A8A> <7A8A> <D2FB>
+<7A8B> <7A8C> <D2F9>
+<7A8F> <7A8F> <D6C8>
+<7A90> <7A90> <D6CA>
+<7A92> <7A92> <B2BF>
+<7A94> <7A94> <D6C9>
+<7A95> <7A95> <B2C0>
+<7A96> <7A96> <B5A2>
+<7A97> <7A97> <B5A1>
+<7A98> <7A98> <B57E>
+<7A99> <7A99> <DADB>
+<7A9E> <7A9E> <DF44>
+<7A9F> <7AA0> <B85D>
+<7AA2> <7AA2> <DF43>
+<7AA3> <7AA3> <DF42>
+<7AA8> <7AA8> <E34A>
+<7AA9> <7AA9> <BADB>
+<7AAA> <7AAA> <BADA>
+<7AAB> <7AAC> <E34B>
+<7AAE> <7AAE> <BD61>
+<7AAF> <7AAF> <BD60>
+<7AB1> <7AB1> <EAB5>
+<7AB2> <7AB2> <E6D3>
+<7AB3> <7AB3> <E6D5>
+<7AB4> <7AB4> <E6D4>
+<7AB5> <7AB5> <EAB4>
+<7AB6> <7AB6> <EAB2>
+<7AB7> <7AB7> <EAB6>
+<7AB8> <7AB8> <EAB3>
+<7ABA> <7ABA> <BF73>
+<7ABE> <7ABE> <EDB7>
+<7ABF> <7ABF> <C14B>
+<7AC0> <7AC1> <EDB8>
+<7AC4> <7AC5> <C2AB>
+<7AC7> <7AC7> <C475>
+<7ACA> <7ACA> <C5D1>
+<7ACB> <7ACB> <A5DF>
+<7AD1> <7AD1> <D041>
+<7AD8> <7AD8> <D2FD>
+<7AD9> <7AD9> <AFB8>
+<7ADF> <7ADF> <B3BA>
+<7AE0> <7AE0> <B3B9>
+<7AE3> <7AE3> <B5A4>
+<7AE4> <7AE4> <DADD>
+<7AE5> <7AE5> <B5A3>
+<7AE6> <7AE6> <DADC>
+<7AEB> <7AEB> <DF45>
+<7AED> <7AED> <BADC>
+<7AEE> <7AEE> <E34D>
+<7AEF> <7AEF> <BADD>
+<7AF6> <7AF6> <C476>
+<7AF7> <7AF7> <F4A5>
+<7AF9> <7AF9> <A6CB>
+<7AFA> <7AFA> <AAC7>
+<7AFB> <7AFB> <CDA7>
+endbfrange
+
+100 beginbfrange
+<7AFD> <7AFD> <ACF2>
+<7AFF> <7AFF> <ACF1>
+<7B00> <7B01> <D042>
+<7B04> <7B04> <D340>
+<7B05> <7B05> <D342>
+<7B06> <7B06> <AFB9>
+<7B08> <7B08> <D344>
+<7B09> <7B09> <D347>
+<7B0A> <7B0A> <D345>
+<7B0E> <7B0E> <D346>
+<7B0F> <7B0F> <D343>
+<7B10> <7B10> <D2FE>
+<7B11> <7B11> <AFBA>
+<7B12> <7B12> <D348>
+<7B13> <7B13> <D341>
+<7B18> <7B18> <D6D3>
+<7B19> <7B19> <B2C6>
+<7B1A> <7B1A> <D6DC>
+<7B1B> <7B1B> <B2C3>
+<7B1D> <7B1D> <D6D5>
+<7B1E> <7B1E> <B2C7>
+<7B20> <7B20> <B2C1>
+<7B22> <7B22> <D6D0>
+<7B23> <7B23> <D6DD>
+<7B24> <7B24> <D6D1>
+<7B25> <7B25> <D6CE>
+<7B26> <7B26> <B2C5>
+<7B28> <7B28> <B2C2>
+<7B2A> <7B2A> <D6D4>
+<7B2B> <7B2B> <D6D7>
+<7B2C> <7B2C> <B2C4>
+<7B2D> <7B2D> <D6D8>
+<7B2E> <7B2E> <B2C8>
+<7B2F> <7B2F> <D6D9>
+<7B30> <7B30> <D6CF>
+<7B31> <7B31> <D6D6>
+<7B32> <7B32> <D6DA>
+<7B33> <7B33> <D6D2>
+<7B34> <7B34> <D6CD>
+<7B35> <7B35> <D6CB>
+<7B38> <7B38> <D6DB>
+<7B3B> <7B3B> <DADF>
+<7B40> <7B40> <DAE4>
+<7B44> <7B44> <DAE0>
+<7B45> <7B45> <DAE6>
+<7B46> <7B46> <B5A7>
+<7B47> <7B47> <D6CC>
+<7B48> <7B48> <DAE1>
+<7B49> <7B49> <B5A5>
+<7B4A> <7B4A> <DADE>
+<7B4B> <7B4B> <B5AC>
+<7B4C> <7B4C> <DAE2>
+<7B4D> <7B4D> <B5AB>
+<7B4E> <7B4E> <DAE3>
+<7B4F> <7B4F> <B5AD>
+<7B50> <7B50> <B5A8>
+<7B51> <7B51> <B5AE>
+<7B52> <7B52> <B5A9>
+<7B54> <7B54> <B5AA>
+<7B56> <7B56> <B5A6>
+<7B58> <7B58> <DAE5>
+<7B60> <7B60> <B861>
+<7B61> <7B61> <DF50>
+<7B63> <7B63> <DF53>
+<7B64> <7B64> <DF47>
+<7B65> <7B65> <DF4C>
+<7B66> <7B66> <DF46>
+<7B67> <7B67> <B863>
+<7B69> <7B69> <DF4A>
+<7B6D> <7B6D> <DF48>
+<7B6E> <7B6E> <B862>
+<7B70> <7B70> <DF4F>
+<7B71> <7B71> <DF4E>
+<7B72> <7B72> <DF4B>
+<7B73> <7B73> <DF4D>
+<7B74> <7B74> <DF49>
+<7B75> <7B75> <BAE1>
+<7B76> <7B76> <DF52>
+<7B77> <7B77> <B85F>
+<7B78> <7B78> <DF51>
+<7B82> <7B82> <E35D>
+<7B84> <7B84> <BAE8>
+<7B85> <7B85> <E358>
+<7B87> <7B87> <BAE7>
+<7B88> <7B88> <E34E>
+<7B8A> <7B8A> <E350>
+<7B8B> <7B8B> <BAE0>
+<7B8C> <7B8C> <E355>
+<7B8D> <7B8D> <E354>
+<7B8E> <7B8E> <E357>
+<7B8F> <7B8F> <BAE5>
+<7B90> <7B90> <E352>
+<7B91> <7B91> <E351>
+<7B94> <7B94> <BAE4>
+<7B95> <7B95> <BADF>
+<7B96> <7B96> <E353>
+<7B97> <7B97> <BAE2>
+<7B98> <7B98> <E359>
+<7B99> <7B99> <E35B>
+<7B9B> <7B9B> <E356>
+endbfrange
+
+100 beginbfrange
+<7B9C> <7B9C> <E34F>
+<7B9D> <7B9D> <BAE3>
+<7BA0> <7BA0> <BD69>
+<7BA1> <7BA1> <BADE>
+<7BA4> <7BA4> <E35C>
+<7BAC> <7BAC> <E6D9>
+<7BAD> <7BAD> <BD62>
+<7BAF> <7BAF> <E6DB>
+<7BB1> <7BB1> <BD63>
+<7BB4> <7BB4> <BD65>
+<7BB5> <7BB5> <E6DE>
+<7BB7> <7BB7> <E6D6>
+<7BB8> <7BB8> <BAE6>
+<7BB9> <7BB9> <E6DC>
+<7BBE> <7BBE> <E6D8>
+<7BC0> <7BC0> <B860>
+<7BC1> <7BC1> <BD68>
+<7BC4> <7BC4> <BD64>
+<7BC6> <7BC7> <BD66>
+<7BC9> <7BC9> <BF76>
+<7BCA> <7BCA> <E6DD>
+<7BCB> <7BCB> <E6D7>
+<7BCC> <7BCC> <BD6A>
+<7BCE> <7BCE> <E6DA>
+<7BD4> <7BD4> <EAC0>
+<7BD5> <7BD5> <EABB>
+<7BD8> <7BD8> <EAC5>
+<7BD9> <7BD9> <BF74>
+<7BDA> <7BDA> <EABD>
+<7BDB> <7BDB> <BF78>
+<7BDC> <7BDC> <EAC3>
+<7BDD> <7BDD> <EABA>
+<7BDE> <7BDE> <EAB7>
+<7BDF> <7BDF> <EAC6>
+<7BE0> <7BE0> <C151>
+<7BE1> <7BE1> <BF79>
+<7BE2> <7BE2> <EAC2>
+<7BE3> <7BE3> <EAB8>
+<7BE4> <7BE4> <BF77>
+<7BE5> <7BE5> <EABC>
+<7BE6> <7BE6> <BF7B>
+<7BE7> <7BE7> <EAB9>
+<7BE8> <7BE8> <EABE>
+<7BE9> <7BE9> <BF7A>
+<7BEA> <7BEA> <EAC1>
+<7BEB> <7BEB> <EAC4>
+<7BF0> <7BF1> <EDCB>
+<7BF2> <7BF2> <EDBC>
+<7BF3> <7BF3> <EDC3>
+<7BF4> <7BF4> <EDC1>
+<7BF7> <7BF7> <C14F>
+<7BF8> <7BF8> <EDC8>
+<7BF9> <7BF9> <EABF>
+<7BFB> <7BFB> <EDBF>
+<7BFD> <7BFD> <EDC9>
+<7BFE> <7BFE> <C14E>
+<7BFF> <7BFF> <EDBE>
+<7C00> <7C00> <EDBD>
+<7C01> <7C01> <EDC7>
+<7C02> <7C02> <EDC4>
+<7C03> <7C03> <EDC6>
+<7C05> <7C05> <EDBA>
+<7C06> <7C06> <EDCA>
+<7C07> <7C07> <C14C>
+<7C09> <7C09> <EDC5>
+<7C0A> <7C0A> <EDCE>
+<7C0B> <7C0B> <EDC2>
+<7C0C> <7C0C> <C150>
+<7C0D> <7C0D> <C14D>
+<7C0E> <7C0E> <EDC0>
+<7C0F> <7C0F> <EDBB>
+<7C10> <7C10> <EDCD>
+<7C11> <7C11> <BF75>
+<7C19> <7C19> <F063>
+<7C1C> <7C1C> <F061>
+<7C1D> <7C1D> <F067>
+<7C1E> <7C1E> <C2B0>
+<7C1F> <7C1F> <F065>
+<7C20> <7C20> <F064>
+<7C21> <7C21> <C2B2>
+<7C22> <7C22> <F06A>
+<7C23> <7C23> <C2B1>
+<7C25> <7C25> <F06B>
+<7C26> <7C26> <F068>
+<7C27> <7C27> <C2AE>
+<7C28> <7C28> <F069>
+<7C29> <7C29> <F062>
+<7C2A> <7C2A> <C2AF>
+<7C2B> <7C2B> <C2AD>
+<7C2C> <7C2C> <F2AB>
+<7C2D> <7C2D> <F066>
+<7C30> <7C30> <F06C>
+<7C33> <7C33> <F2A8>
+<7C37> <7C37> <C3B2>
+<7C38> <7C38> <C3B0>
+<7C39> <7C39> <F2AA>
+<7C3B> <7C3B> <F2AC>
+<7C3C> <7C3C> <F2A9>
+<7C3D> <7C3D> <C3B1>
+<7C3E> <7C3F> <C3AE>
+endbfrange
+
+100 beginbfrange
+<7C40> <7C40> <C3B3>
+<7C43> <7C43> <C478>
+<7C45> <7C45> <F4AA>
+<7C47> <7C47> <F4A9>
+<7C48> <7C48> <F4A7>
+<7C49> <7C49> <F4A6>
+<7C4A> <7C4A> <F4A8>
+<7C4C> <7C4C> <C477>
+<7C4D> <7C4D> <C479>
+<7C50> <7C50> <C4F0>
+<7C53> <7C53> <F5E5>
+<7C54> <7C54> <F5E4>
+<7C57> <7C57> <F6FA>
+<7C59> <7C59> <F6FC>
+<7C5A> <7C5A> <F6FE>
+<7C5B> <7C5B> <F6FD>
+<7C5C> <7C5C> <F6FB>
+<7C5F> <7C5F> <C5A3>
+<7C60> <7C60> <C5A2>
+<7C63> <7C63> <C5D3>
+<7C64> <7C64> <C5D2>
+<7C65> <7C65> <C5D4>
+<7C66> <7C66> <F7ED>
+<7C67> <7C67> <F7EC>
+<7C69> <7C69> <F8FB>
+<7C6A> <7C6A> <F8B8>
+<7C6B> <7C6B> <F8FC>
+<7C6C> <7C6C> <C658>
+<7C6E> <7C6E> <C659>
+<7C6F> <7C6F> <F96D>
+<7C72> <7C72> <C67E>
+<7C73> <7C73> <A6CC>
+<7C75> <7C75> <CDA8>
+<7C78> <7C79> <D045>
+<7C7A> <7C7A> <D044>
+<7C7D> <7C7D> <ACF3>
+<7C7F> <7C81> <D047>
+<7C84> <7C84> <D349>
+<7C85> <7C85> <D34F>
+<7C88> <7C88> <D34D>
+<7C89> <7C89> <AFBB>
+<7C8A> <7C8A> <D34B>
+<7C8C> <7C8C> <D34C>
+<7C8D> <7C8D> <D34E>
+<7C91> <7C91> <D34A>
+<7C92> <7C92> <B2C9>
+<7C94> <7C94> <D6DE>
+<7C95> <7C95> <B2CB>
+<7C96> <7C96> <D6E0>
+<7C97> <7C97> <B2CA>
+<7C98> <7C98> <D6DF>
+<7C9E> <7C9E> <DAE8>
+<7C9F> <7C9F> <B5AF>
+<7CA1> <7CA1> <DAEA>
+<7CA2> <7CA2> <DAE7>
+<7CA3> <7CA3> <D6E1>
+<7CA5> <7CA5> <B5B0>
+<7CA8> <7CA8> <DAE9>
+<7CAF> <7CAF> <DF56>
+<7CB1> <7CB1> <B864>
+<7CB2> <7CB2> <DF54>
+<7CB3> <7CB3> <B865>
+<7CB4> <7CB4> <DF55>
+<7CB5> <7CB5> <B866>
+<7CB9> <7CB9> <BAE9>
+<7CBA> <7CBA> <E361>
+<7CBB> <7CBB> <E35E>
+<7CBC> <7CBC> <E360>
+<7CBD> <7CBE> <BAEA>
+<7CBF> <7CBF> <E35F>
+<7CC5> <7CC5> <E6DF>
+<7CC8> <7CC8> <E6E0>
+<7CCA> <7CCA> <BD6B>
+<7CCB> <7CCB> <E6E2>
+<7CCC> <7CCC> <E6E1>
+<7CCE> <7CCE> <A261>
+<7CD0> <7CD1> <EACA>
+<7CD2> <7CD2> <EAC7>
+<7CD4> <7CD4> <EAC8>
+<7CD5> <7CD6> <BF7C>
+<7CD7> <7CD7> <EAC9>
+<7CD9> <7CD9> <C157>
+<7CDC> <7CDC> <C153>
+<7CDD> <7CDD> <C158>
+<7CDE> <7CDE> <C154>
+<7CDF> <7CDF> <C156>
+<7CE0> <7CE0> <C152>
+<7CE2> <7CE2> <C155>
+<7CE7> <7CE7> <C2B3>
+<7CE8> <7CE8> <EDCF>
+<7CEA> <7CEA> <F2AE>
+<7CEC> <7CEC> <F2AD>
+<7CEE> <7CEE> <F4AB>
+<7CEF> <7CF0> <C47A>
+<7CF1> <7CF1> <F741>
+<7CF2> <7CF2> <F5E6>
+<7CF4> <7CF4> <F740>
+<7CF6> <7CF6> <F8FD>
+<7CF7> <7CF7> <F9A4>
+<7CF8> <7CF8> <A6CD>
+endbfrange
+
+100 beginbfrange
+<7CFB> <7CFB> <A874>
+<7CFD> <7CFD> <CDA9>
+<7CFE> <7CFE> <AAC8>
+<7D00> <7D00> <ACF6>
+<7D01> <7D01> <D04C>
+<7D02> <7D02> <ACF4>
+<7D03> <7D03> <D04A>
+<7D04> <7D04> <ACF9>
+<7D05> <7D05> <ACF5>
+<7D06> <7D06> <ACFA>
+<7D07> <7D07> <ACF8>
+<7D08> <7D08> <D04B>
+<7D09> <7D09> <ACF7>
+<7D0A> <7D0A> <AFBF>
+<7D0B> <7D0B> <AFBE>
+<7D0C> <7D0C> <D35A>
+<7D0D> <7D0D> <AFC7>
+<7D0E> <7D0E> <D353>
+<7D0F> <7D0F> <D359>
+<7D10> <7D10> <AFC3>
+<7D11> <7D11> <D352>
+<7D12> <7D12> <D358>
+<7D13> <7D13> <D356>
+<7D14> <7D14> <AFC2>
+<7D15> <7D15> <AFC4>
+<7D16> <7D16> <D355>
+<7D17> <7D17> <AFBD>
+<7D18> <7D18> <D354>
+<7D19> <7D19> <AFC8>
+<7D1A> <7D1A> <AFC5>
+<7D1B> <7D1B> <AFC9>
+<7D1C> <7D1C> <AFC6>
+<7D1D> <7D1D> <D351>
+<7D1E> <7D1E> <D350>
+<7D1F> <7D1F> <D357>
+<7D20> <7D20> <AFC0>
+<7D21> <7D21> <AFBC>
+<7D22> <7D22> <AFC1>
+<7D28> <7D28> <D6F0>
+<7D29> <7D29> <D6E9>
+<7D2B> <7D2B> <B5B5>
+<7D2C> <7D2C> <D6E8>
+<7D2E> <7D2E> <B2CF>
+<7D2F> <7D2F> <B2D6>
+<7D30> <7D30> <B2D3>
+<7D31> <7D31> <B2D9>
+<7D32> <7D32> <B2D8>
+<7D33> <7D33> <B2D4>
+<7D35> <7D35> <D6E2>
+<7D36> <7D36> <D6E5>
+<7D38> <7D38> <D6E4>
+<7D39> <7D39> <B2D0>
+<7D3A> <7D3A> <D6E6>
+<7D3B> <7D3B> <D6EF>
+<7D3C> <7D3C> <B2D1>
+<7D3D> <7D3D> <D6E3>
+<7D3E> <7D3F> <D6EC>
+<7D40> <7D40> <B2D2>
+<7D41> <7D41> <D6EA>
+<7D42> <7D42> <B2D7>
+<7D43> <7D43> <B2CD>
+<7D44> <7D44> <B2D5>
+<7D45> <7D45> <D6E7>
+<7D46> <7D46> <B2CC>
+<7D47> <7D47> <D6EB>
+<7D4A> <7D4A> <D6EE>
+<7D4E> <7D4E> <DAFB>
+<7D4F> <7D4F> <DAF2>
+<7D50> <7D50> <B5B2>
+<7D51> <7D51> <DAF9>
+<7D52> <7D52> <DAF6>
+<7D53> <7D53> <DAEE>
+<7D54> <7D54> <DAF7>
+<7D55> <7D55> <B5B4>
+<7D56> <7D56> <DAEF>
+<7D58> <7D58> <DAEB>
+<7D5B> <7D5B> <B86C>
+<7D5C> <7D5C> <DAF4>
+<7D5E> <7D5E> <B5B1>
+<7D5F> <7D5F> <DAFA>
+<7D61> <7D61> <B5B8>
+<7D62> <7D62> <B5BA>
+<7D63> <7D63> <DAED>
+<7D66> <7D66> <B5B9>
+<7D67> <7D67> <DAF0>
+<7D68> <7D68> <B5B3>
+<7D69> <7D69> <DAF8>
+<7D6A> <7D6A> <DAF1>
+<7D6B> <7D6B> <DAF5>
+<7D6D> <7D6D> <DAF3>
+<7D6E> <7D6E> <B5B6>
+<7D6F> <7D6F> <DAEC>
+<7D70> <7D70> <B5BB>
+<7D71> <7D71> <B2CE>
+<7D72> <7D72> <B5B7>
+<7D73> <7D73> <B5BC>
+<7D79> <7D79> <B868>
+<7D7A> <7D7A> <DF5D>
+<7D7B> <7D7B> <DF5F>
+<7D7C> <7D7C> <DF61>
+endbfrange
+
+100 beginbfrange
+<7D7D> <7D7D> <DF65>
+<7D7F> <7D7F> <DF5B>
+<7D80> <7D80> <DF59>
+<7D81> <7D81> <B86A>
+<7D83> <7D83> <DF60>
+<7D84> <7D84> <DF64>
+<7D85> <7D85> <DF5C>
+<7D86> <7D86> <DF58>
+<7D88> <7D88> <DF57>
+<7D8C> <7D8C> <DF62>
+<7D8D> <7D8D> <DF5A>
+<7D8E> <7D8E> <DF5E>
+<7D8F> <7D8F> <B86B>
+<7D91> <7D91> <B869>
+<7D92> <7D92> <DF66>
+<7D93> <7D93> <B867>
+<7D94> <7D94> <DF63>
+<7D96> <7D96> <E372>
+<7D9C> <7D9C> <BAEE>
+<7D9D> <7D9D> <E36A>
+<7D9E> <7D9E> <BD78>
+<7D9F> <7D9F> <E374>
+<7DA0> <7DA0> <BAF1>
+<7DA1> <7DA1> <E378>
+<7DA2> <7DA2> <BAF7>
+<7DA3> <7DA3> <E365>
+<7DA6> <7DA6> <E375>
+<7DA7> <7DA7> <E362>
+<7DA9> <7DA9> <E377>
+<7DAA> <7DAA> <E366>
+<7DAC> <7DAC> <BAFE>
+<7DAD> <7DAD> <BAFB>
+<7DAE> <7DAE> <E376>
+<7DAF> <7DAF> <E370>
+<7DB0> <7DB0> <BAED>
+<7DB1> <7DB1> <BAF5>
+<7DB2> <7DB2> <BAF4>
+<7DB4> <7DB4> <BAF3>
+<7DB5> <7DB5> <BAF9>
+<7DB7> <7DB7> <E363>
+<7DB8> <7DB8> <BAFA>
+<7DB9> <7DB9> <E371>
+<7DBA> <7DBA> <BAF6>
+<7DBB> <7DBB> <BAEC>
+<7DBC> <7DBC> <E373>
+<7DBD> <7DBE> <BAEF>
+<7DBF> <7DBF> <BAF8>
+<7DC0> <7DC0> <E368>
+<7DC1> <7DC1> <E367>
+<7DC2> <7DC2> <E364>
+<7DC4> <7DC4> <E36C>
+<7DC5> <7DC5> <E369>
+<7DC6> <7DC6> <E36D>
+<7DC7> <7DC7> <BAFD>
+<7DC9> <7DC9> <E379>
+<7DCA> <7DCA> <BAF2>
+<7DCB> <7DCC> <E36E>
+<7DCE> <7DCE> <E36B>
+<7DD2> <7DD2> <BAFC>
+<7DD7> <7DD7> <E6E7>
+<7DD8> <7DD8> <BD70>
+<7DD9> <7DD9> <BD79>
+<7DDA> <7DDA> <BD75>
+<7DDB> <7DDB> <E6E4>
+<7DDD> <7DDD> <BD72>
+<7DDE> <7DDE> <BD76>
+<7DDF> <7DDF> <E6F0>
+<7DE0> <7DE0> <BD6C>
+<7DE1> <7DE1> <E6E8>
+<7DE3> <7DE3> <BD74>
+<7DE6> <7DE6> <E6EB>
+<7DE7> <7DE7> <E6E6>
+<7DE8> <7DE8> <BD73>
+<7DE9> <7DE9> <BD77>
+<7DEA> <7DEA> <E6E5>
+<7DEC> <7DEC> <BD71>
+<7DEE> <7DEE> <E6EF>
+<7DEF> <7DEF> <BD6E>
+<7DF0> <7DF0> <E6EE>
+<7DF1> <7DF1> <E6ED>
+<7DF2> <7DF2> <BD7A>
+<7DF3> <7DF3> <E572>
+<7DF4> <7DF4> <BD6D>
+<7DF6> <7DF6> <E6EC>
+<7DF7> <7DF7> <E6E3>
+<7DF9> <7DF9> <BD7B>
+<7DFA> <7DFA> <E6EA>
+<7DFB> <7DFB> <BD6F>
+<7E03> <7E03> <E6E9>
+<7E08> <7E08> <BFA2>
+<7E09> <7E09> <BFA7>
+<7E0A> <7E0A> <BF7E>
+<7E0B> <7E0B> <EAD8>
+<7E0C> <7E0C> <EACF>
+<7E0D> <7E0D> <EADB>
+<7E0E> <7E0E> <EAD3>
+<7E0F> <7E0F> <EAD9>
+<7E10> <7E10> <BFA8>
+<7E11> <7E11> <BFA1>
+<7E12> <7E12> <EACC>
+endbfrange
+
+100 beginbfrange
+<7E13> <7E13> <EAD2>
+<7E14> <7E14> <EADC>
+<7E15> <7E15> <EAD5>
+<7E16> <7E16> <EADA>
+<7E17> <7E17> <EACE>
+<7E1A> <7E1A> <EAD6>
+<7E1B> <7E1B> <BFA3>
+<7E1C> <7E1C> <EAD4>
+<7E1D> <7E1D> <BFA6>
+<7E1E> <7E1E> <BFA5>
+<7E1F> <7E20> <EAD0>
+<7E21> <7E21> <EACD>
+<7E22> <7E22> <EAD7>
+<7E23> <7E23> <BFA4>
+<7E24> <7E24> <EADE>
+<7E25> <7E25> <EADD>
+<7E29> <7E29> <EDDA>
+<7E2A> <7E2A> <EDD6>
+<7E2B> <7E2B> <C15F>
+<7E2D> <7E2D> <EDD0>
+<7E2E> <7E2E> <C159>
+<7E2F> <7E2F> <C169>
+<7E30> <7E30> <EDDC>
+<7E31> <7E31> <C161>
+<7E32> <7E32> <C15D>
+<7E33> <7E33> <EDD3>
+<7E34> <7E34> <C164>
+<7E35> <7E35> <C167>
+<7E36> <7E36> <EDDE>
+<7E37> <7E37> <C15C>
+<7E38> <7E38> <EDD5>
+<7E39> <7E39> <C165>
+<7E3A> <7E3A> <EDE0>
+<7E3B> <7E3B> <EDDD>
+<7E3C> <7E3C> <EDD1>
+<7E3D> <7E3D> <C160>
+<7E3E> <7E3E> <C15A>
+<7E3F> <7E3F> <C168>
+<7E40> <7E40> <EDD8>
+<7E41> <7E41> <C163>
+<7E42> <7E42> <EDD2>
+<7E43> <7E43> <C15E>
+<7E44> <7E44> <EDDF>
+<7E45> <7E45> <C162>
+<7E46> <7E46> <C15B>
+<7E47> <7E47> <EDD9>
+<7E48> <7E48> <C166>
+<7E49> <7E49> <EDD7>
+<7E4C> <7E4C> <EDDB>
+<7E50> <7E50> <F06E>
+<7E51> <7E51> <F074>
+<7E52> <7E52> <C2B9>
+<7E53> <7E53> <F077>
+<7E54> <7E55> <C2B4>
+<7E56> <7E56> <F06F>
+<7E57> <7E57> <F076>
+<7E58> <7E58> <F071>
+<7E59> <7E59> <C2BA>
+<7E5A> <7E5A> <C2B7>
+<7E5C> <7E5C> <F06D>
+<7E5E> <7E5E> <C2B6>
+<7E5F> <7E5F> <F073>
+<7E60> <7E60> <F075>
+<7E61> <7E61> <C2B8>
+<7E62> <7E62> <F072>
+<7E63> <7E63> <F070>
+<7E68> <7E68> <F2B8>
+<7E69> <7E6A> <C3B7>
+<7E6B> <7E6B> <C3B4>
+<7E6D> <7E6D> <C3B5>
+<7E6F> <7E6F> <F2B4>
+<7E70> <7E70> <F2B2>
+<7E72> <7E72> <F2B6>
+<7E73> <7E73> <C3BA>
+<7E74> <7E74> <F2B7>
+<7E75> <7E75> <F2B0>
+<7E76> <7E76> <F2AF>
+<7E77> <7E77> <F2B3>
+<7E78> <7E78> <F2B1>
+<7E79> <7E79> <C3B6>
+<7E7A> <7E7A> <F2B5>
+<7E7B> <7E7B> <F4AC>
+<7E7C> <7E7C> <C47E>
+<7E7D> <7E7D> <C47D>
+<7E7E> <7E7E> <F4AD>
+<7E80> <7E80> <F4AF>
+<7E81> <7E81> <F4AE>
+<7E82> <7E82> <C4A1>
+<7E86> <7E86> <F5EB>
+<7E87> <7E88> <F5E8>
+<7E8A> <7E8A> <F5E7>
+<7E8B> <7E8B> <F5EA>
+<7E8C> <7E8C> <C4F2>
+<7E8D> <7E8D> <F5EC>
+<7E8F> <7E8F> <C4F1>
+<7E91> <7E91> <F742>
+<7E93> <7E93> <C5D5>
+<7E94> <7E94> <C5D7>
+<7E95> <7E95> <F7EE>
+<7E96> <7E96> <C5D6>
+endbfrange
+
+100 beginbfrange
+<7E97> <7E97> <F8B9>
+<7E98> <7E98> <F940>
+<7E99> <7E99> <F942>
+<7E9A> <7E9A> <F8FE>
+<7E9B> <7E9B> <F941>
+<7E9C> <7E9C> <C66C>
+<7F36> <7F36> <A6CE>
+<7F38> <7F38> <ACFB>
+<7F39> <7F39> <D26F>
+<7F3A> <7F3A> <AFCA>
+<7F3D> <7F3D> <B2DA>
+<7F3E> <7F3F> <DAFC>
+<7F43> <7F43> <EADF>
+<7F44> <7F44> <C16A>
+<7F45> <7F45> <EDE1>
+<7F48> <7F48> <C2BB>
+<7F4A> <7F4A> <F2BA>
+<7F4B> <7F4B> <F2B9>
+<7F4C> <7F4C> <C4A2>
+<7F4D> <7F4D> <F5ED>
+<7F4F> <7F4F> <F743>
+<7F50> <7F50> <C5F8>
+<7F51> <7F51> <CA49>
+<7F54> <7F54> <AAC9>
+<7F55> <7F55> <A875>
+<7F58> <7F58> <D04D>
+<7F5B> <7F5B> <D360>
+<7F5C> <7F5C> <D35B>
+<7F5D> <7F5D> <D35F>
+<7F5E> <7F5E> <D35D>
+<7F5F> <7F5F> <AFCB>
+<7F60> <7F60> <D35E>
+<7F61> <7F61> <D35C>
+<7F63> <7F63> <D6F1>
+<7F65> <7F65> <DAFE>
+<7F66> <7F66> <DB40>
+<7F67> <7F68> <DF69>
+<7F69> <7F6A> <B86E>
+<7F6B> <7F6B> <DF68>
+<7F6C> <7F6C> <DF6B>
+<7F6D> <7F6D> <DF67>
+<7F6E> <7F6E> <B86D>
+<7F70> <7F70> <BB40>
+<7F72> <7F72> <B870>
+<7F73> <7F73> <E37A>
+<7F75> <7F75> <BD7C>
+<7F76> <7F76> <E6F1>
+<7F77> <7F77> <BD7D>
+<7F79> <7F79> <BFA9>
+<7F7A> <7F7A> <EAE2>
+<7F7B> <7F7C> <EAE0>
+<7F7D> <7F7D> <EDE4>
+<7F7E> <7F7E> <EDE3>
+<7F7F> <7F7F> <EDE2>
+<7F83> <7F83> <F2BB>
+<7F85> <7F85> <C3B9>
+<7F86> <7F86> <F2BC>
+<7F87> <7F87> <F744>
+<7F88> <7F88> <C5F9>
+<7F89> <7F89> <F8BA>
+<7F8A> <7F8A> <A6CF>
+<7F8B> <7F8B> <AACB>
+<7F8C> <7F8C> <AACA>
+<7F8D> <7F8D> <D04F>
+<7F8E> <7F8E> <ACFC>
+<7F91> <7F91> <D04E>
+<7F92> <7F92> <D362>
+<7F94> <7F94> <AFCC>
+<7F95> <7F95> <D6F2>
+<7F96> <7F96> <D361>
+<7F9A> <7F9A> <B2DC>
+<7F9B> <7F9B> <D6F5>
+<7F9C> <7F9D> <D6F3>
+<7F9E> <7F9E> <B2DB>
+<7FA0> <7FA1> <DB42>
+<7FA2> <7FA2> <DB41>
+<7FA4> <7FA4> <B873>
+<7FA5> <7FA5> <DF6D>
+<7FA6> <7FA6> <DF6C>
+<7FA7> <7FA7> <DF6E>
+<7FA8> <7FA8> <B872>
+<7FA9> <7FA9> <B871>
+<7FAC> <7FAC> <E6F2>
+<7FAD> <7FAD> <E6F4>
+<7FAF> <7FAF> <BD7E>
+<7FB0> <7FB0> <E6F3>
+<7FB1> <7FB1> <EAE3>
+<7FB2> <7FB2> <BFAA>
+<7FB3> <7FB3> <F079>
+<7FB5> <7FB5> <F078>
+<7FB6> <7FB6> <C3BB>
+<7FB7> <7FB7> <F2BD>
+<7FB8> <7FB8> <C3BD>
+<7FB9> <7FB9> <C3BC>
+<7FBA> <7FBA> <F4B0>
+<7FBB> <7FBB> <F5EE>
+<7FBC> <7FBC> <C4F3>
+<7FBD> <7FBD> <A6D0>
+<7FBE> <7FBE> <D050>
+<7FBF> <7FBF> <ACFD>
+endbfrange
+
+100 beginbfrange
+<7FC0> <7FC0> <D365>
+<7FC1> <7FC1> <AFCE>
+<7FC2> <7FC2> <D364>
+<7FC3> <7FC3> <D363>
+<7FC5> <7FC5> <AFCD>
+<7FC7> <7FC7> <D6FB>
+<7FC9> <7FC9> <D6FD>
+<7FCA> <7FCB> <D6F6>
+<7FCC> <7FCC> <B2DD>
+<7FCD> <7FCD> <D6F8>
+<7FCE> <7FCE> <B2DE>
+<7FCF> <7FCF> <D6FC>
+<7FD0> <7FD1> <D6F9>
+<7FD2> <7FD2> <B2DF>
+<7FD4> <7FD5> <B5BE>
+<7FD7> <7FD7> <DB44>
+<7FDB> <7FDC> <DF6F>
+<7FDE> <7FDE> <E37E>
+<7FDF> <7FDF> <BB43>
+<7FE0> <7FE1> <BB41>
+<7FE2> <7FE3> <E37B>
+<7FE5> <7FE5> <E37D>
+<7FE6> <7FE6> <E6F9>
+<7FE8> <7FE8> <E6FA>
+<7FE9> <7FE9> <BDA1>
+<7FEA> <7FEA> <E6F7>
+<7FEB> <7FEB> <E6F6>
+<7FEC> <7FEC> <E6F8>
+<7FED> <7FED> <E6F5>
+<7FEE> <7FEE> <BFAD>
+<7FEF> <7FEF> <EAE4>
+<7FF0> <7FF1> <BFAB>
+<7FF2> <7FF2> <EDE6>
+<7FF3> <7FF3> <C16B>
+<7FF4> <7FF4> <EDE5>
+<7FF5> <7FF5> <EFA8>
+<7FF7> <7FF8> <F07A>
+<7FF9> <7FF9> <C2BC>
+<7FFB> <7FFB> <C2BD>
+<7FFC> <7FFC> <C16C>
+<7FFD> <7FFE> <F2BE>
+<7FFF> <7FFF> <F4B1>
+<8000> <8000> <C4A3>
+<8001> <8001> <A6D1>
+<8003> <8003> <A6D2>
+<8004> <8004> <ACFE>
+<8005> <8005> <AACC>
+<8006> <8006> <AFCF>
+<8007> <8007> <D051>
+<800B> <800B> <B5C0>
+<800C> <800C> <A6D3>
+<800D> <800D> <AD41>
+<800E> <800F> <D052>
+<8010> <8010> <AD40>
+<8011> <8011> <AD42>
+<8012> <8012> <A6D4>
+<8014> <8014> <D054>
+<8015> <8015> <AFD1>
+<8016> <8016> <D366>
+<8017> <8017> <AFD3>
+<8018> <8018> <AFD0>
+<8019> <8019> <AFD2>
+<801B> <801B> <D741>
+<801C> <801C> <B2E0>
+<801E> <801E> <D740>
+<801F> <801F> <D6FE>
+<8021> <8021> <DF71>
+<8024> <8024> <E3A1>
+<8026> <8026> <BDA2>
+<8028> <8028> <BFAE>
+<8029> <8029> <EAE6>
+<802A> <802A> <EAE5>
+<802C> <802C> <EDE7>
+<8030> <8030> <F5EF>
+<8033> <8033> <A6D5>
+<8034> <8034> <CB73>
+<8035> <8035> <CDAA>
+<8036> <8036> <AD43>
+<8037> <8037> <D055>
+<8039> <8039> <D368>
+<803D> <803D> <AFD4>
+<803E> <803E> <D367>
+<803F> <803F> <AFD5>
+<8043> <8043> <D743>
+<8046> <8046> <B2E2>
+<8047> <8047> <D742>
+<8048> <8048> <D744>
+<804A> <804A> <B2E1>
+<804F> <8050> <DB46>
+<8051> <8051> <DB45>
+<8052> <8052> <B5C1>
+<8056> <8056> <B874>
+<8058> <8058> <B875>
+<805A> <805A> <BB45>
+<805C> <805C> <E3A3>
+<805D> <805D> <E3A2>
+<805E> <805E> <BB44>
+<8064> <8064> <E6FB>
+<8067> <8067> <E6FC>
+<806C> <806C> <EAE7>
+endbfrange
+
+100 beginbfrange
+<806F> <806F> <C170>
+<8070> <8070> <C16F>
+<8071> <8072> <C16D>
+<8073> <8073> <C171>
+<8075> <8075> <F07C>
+<8076> <8076> <C2BF>
+<8077> <8077> <C2BE>
+<8078> <8078> <F2C0>
+<8079> <8079> <F4B2>
+<807D> <807D> <C5A5>
+<807E> <807E> <C5A4>
+<807F> <807F> <A6D6>
+<8082> <8082> <D1FB>
+<8084> <8084> <B877>
+<8085> <8085> <B5C2>
+<8086> <8086> <B876>
+<8087> <8087> <BB46>
+<8089> <8089> <A6D7>
+<808A> <808A> <C9A9>
+<808B> <808C> <A6D8>
+<808F> <808F> <CDAB>
+<8090> <8090> <CB76>
+<8092> <8092> <CB77>
+<8093> <8093> <A877>
+<8095> <8095> <CB74>
+<8096> <8096> <A876>
+<8098> <8098> <A879>
+<8099> <8099> <CB75>
+<809A> <809A> <A87B>
+<809B> <809B> <A87A>
+<809C> <809C> <CB78>
+<809D> <809D> <A878>
+<80A1> <80A1> <AAD1>
+<80A2> <80A2> <AACF>
+<80A3> <80A3> <CDAD>
+<80A5> <80A5> <AACE>
+<80A9> <80A9> <AAD3>
+<80AA> <80AA> <AAD5>
+<80AB> <80AB> <AAD2>
+<80AD> <80AD> <CDB0>
+<80AE> <80AE> <CDAC>
+<80AF> <80AF> <AAD6>
+<80B1> <80B1> <AAD0>
+<80B2> <80B2> <A87C>
+<80B4> <80B4> <AAD4>
+<80B5> <80B5> <CDAF>
+<80B8> <80B8> <CDAE>
+<80BA> <80BA> <AACD>
+<80C2> <80C2> <D05B>
+<80C3> <80C4> <AD47>
+<80C5> <80C5> <D05D>
+<80C7> <80C7> <D057>
+<80C8> <80C8> <D05A>
+<80C9> <80C9> <D063>
+<80CA> <80CA> <D061>
+<80CC> <80CC> <AD49>
+<80CD> <80CD> <D067>
+<80CE> <80CE> <AD4C>
+<80CF> <80CF> <D064>
+<80D0> <80D0> <D05C>
+<80D1> <80D1> <D059>
+<80D4> <80D4> <DB49>
+<80D5> <80D5> <D062>
+<80D6> <80D6> <AD44>
+<80D7> <80D7> <D065>
+<80D8> <80D8> <D056>
+<80D9> <80D9> <D05F>
+<80DA> <80DA> <AD46>
+<80DB> <80DB> <AD4B>
+<80DC> <80DC> <D060>
+<80DD> <80DD> <AD4F>
+<80DE> <80DE> <AD4D>
+<80E0> <80E0> <D058>
+<80E1> <80E1> <AD4A>
+<80E3> <80E3> <D05E>
+<80E4> <80E4> <AD4E>
+<80E5> <80E5> <AD45>
+<80E6> <80E6> <D066>
+<80ED> <80ED> <AFDA>
+<80EF> <80EF> <AFE3>
+<80F0> <80F0> <AFD8>
+<80F1> <80F1> <AFD6>
+<80F2> <80F2> <D36A>
+<80F3> <80F3> <AFDE>
+<80F4> <80F4> <AFDB>
+<80F5> <80F5> <D36C>
+<80F8> <80F8> <AFDD>
+<80F9> <80F9> <D36B>
+<80FA> <80FA> <D369>
+<80FB> <80FB> <D36E>
+<80FC> <80FC> <AFE2>
+<80FD> <80FD> <AFE0>
+<80FE> <80FE> <DB48>
+<8100> <8100> <D36F>
+<8101> <8101> <D36D>
+<8102> <8102> <AFD7>
+<8105> <8105> <AFD9>
+<8106> <8106> <AFDC>
+<8108> <8108> <AFDF>
+<810A> <810A> <AFE1>
+endbfrange
+
+100 beginbfrange
+<8115> <8115> <D74E>
+<8116> <8116> <B2E4>
+<8118> <8118> <D745>
+<8119> <8119> <D747>
+<811B> <811B> <D748>
+<811D> <811D> <D750>
+<811E> <811E> <D74C>
+<811F> <811F> <D74A>
+<8121> <8121> <D74D>
+<8122> <8122> <D751>
+<8123> <8123> <B2E5>
+<8124> <8124> <B2E9>
+<8125> <8125> <D746>
+<8127> <8127> <D74F>
+<8129> <8129> <B2E7>
+<812B> <812B> <B2E6>
+<812C> <812C> <D74B>
+<812D> <812D> <D749>
+<812F> <812F> <B2E3>
+<8130> <8130> <B2E8>
+<8139> <8139> <B5C8>
+<813A> <813A> <DB51>
+<813D> <813D> <DB4F>
+<813E> <813E> <B5CA>
+<8143> <8143> <DB4A>
+<8144> <8144> <DFA1>
+<8146> <8146> <B5C9>
+<8147> <8147> <DB4E>
+<814A> <814A> <DB4B>
+<814B> <814B> <B5C5>
+<814C> <814C> <B5CB>
+<814D> <814D> <DB50>
+<814E> <814E> <B5C7>
+<814F> <814F> <DB4D>
+<8150> <8150> <BB47>
+<8151> <8151> <B5C6>
+<8152> <8152> <DB4C>
+<8153> <8153> <B5CC>
+<8154> <8154> <B5C4>
+<8155> <8155> <B5C3>
+<815B> <815B> <DF77>
+<815C> <815C> <DF75>
+<815E> <815E> <DF7B>
+<8160> <8160> <DF73>
+<8161> <8161> <DFA2>
+<8162> <8162> <DF78>
+<8164> <8164> <DF72>
+<8165> <8165> <B87B>
+<8166> <8166> <B8A3>
+<8167> <8167> <DF7D>
+<8169> <8169> <DF76>
+<816B> <816B> <B87E>
+<816E> <816E> <B87C>
+<816F> <816F> <DF7E>
+<8170> <8170> <B879>
+<8171> <8171> <B878>
+<8172> <8172> <DF79>
+<8173> <8173> <B87D>
+<8174> <8174> <B5CD>
+<8176> <8176> <DF7C>
+<8177> <8177> <DF74>
+<8178> <8178> <B87A>
+<8179> <817A> <B8A1>
+<817F> <817F> <BB4C>
+<8180> <8180> <BB48>
+<8182> <8182> <BB4D>
+<8183> <8183> <E3A6>
+<8186> <8186> <E3A5>
+<8187> <8187> <E3A7>
+<8188> <8188> <BB4A>
+<8189> <8189> <E3A4>
+<818A> <818A> <BB4B>
+<818B> <818B> <E3AA>
+<818C> <818C> <E3A9>
+<818D> <818D> <E3A8>
+<818F> <818F> <BB49>
+<8195> <8195> <E741>
+<8197> <8197> <E744>
+<8198> <8198> <BDA8>
+<8199> <8199> <E743>
+<819A> <819A> <BDA7>
+<819B> <819D> <BDA3>
+<819E> <819E> <E740>
+<819F> <819F> <E6FE>
+<81A0> <81A0> <BDA6>
+<81A2> <81A2> <E742>
+<81A3> <81A3> <E6FD>
+<81A6> <81A6> <EAE9>
+<81A7> <81A7> <EAF3>
+<81A8> <81A8> <BFB1>
+<81A9> <81A9> <BFB0>
+<81AB> <81AB> <EAED>
+<81AC> <81AC> <EAEF>
+<81AE> <81AE> <EAEA>
+<81B0> <81B0> <EAEE>
+<81B1> <81B1> <EAE8>
+<81B2> <81B2> <EAF1>
+<81B3> <81B3> <BFAF>
+<81B4> <81B4> <EAF0>
+<81B5> <81B5> <EAEC>
+endbfrange
+
+100 beginbfrange
+<81B7> <81B7> <EAF2>
+<81B9> <81B9> <EAEB>
+<81BA> <81BA> <C174>
+<81BB> <81BB> <EDE8>
+<81BC> <81BC> <EDEE>
+<81BD> <81BD> <C178>
+<81BE> <81BE> <C17A>
+<81BF> <81BF> <C177>
+<81C0> <81C0> <C176>
+<81C2> <81C2> <C175>
+<81C3> <81C3> <C173>
+<81C4> <81C4> <EDE9>
+<81C5> <81C5> <EDEC>
+<81C6> <81C6> <C172>
+<81C7> <81C7> <EDED>
+<81C9> <81C9> <C179>
+<81CA> <81CA> <EDEB>
+<81CC> <81CC> <EDEA>
+<81CD> <81CD> <C2C0>
+<81CF> <81CF> <C2C1>
+<81D0> <81D0> <F0A1>
+<81D1> <81D2> <F07D>
+<81D5> <81D5> <F2C2>
+<81D7> <81D7> <F2C1>
+<81D8> <81D8> <C3BE>
+<81D9> <81D9> <F4B4>
+<81DA> <81DA> <C4A4>
+<81DB> <81DB> <F4B3>
+<81DD> <81DD> <F5F0>
+<81DE> <81DE> <F745>
+<81DF> <81DF> <C5A6>
+<81E0> <81E1> <F943>
+<81E2> <81E2> <C5D8>
+<81E3> <81E3> <A6DA>
+<81E5> <81E5> <AAD7>
+<81E6> <81E6> <DB52>
+<81E7> <81E7> <BB4E>
+<81E8> <81E8> <C17B>
+<81E9> <81E9> <EDEF>
+<81EA> <81EA> <A6DB>
+<81EC> <81EC> <AFE5>
+<81ED> <81ED> <AFE4>
+<81EE> <81EE> <DB53>
+<81F2> <81F2> <EAF4>
+<81F3> <81F3> <A6DC>
+<81F4> <81F4> <AD50>
+<81F7> <81F9> <DB54>
+<81FA> <81FA> <BB4F>
+<81FB> <81FB> <BFB2>
+<81FC> <81FC> <A6DD>
+<81FE> <81FE> <AAD8>
+<81FF> <81FF> <D068>
+<8200> <8200> <AFE6>
+<8201> <8201> <D370>
+<8202> <8202> <B2EA>
+<8204> <8204> <DB57>
+<8205> <8205> <B8A4>
+<8207> <8207> <BB50>
+<8208> <8208> <BFB3>
+<8209> <8209> <C17C>
+<820A> <820A> <C2C2>
+<820B> <820B> <F4B5>
+<820C> <820C> <A6DE>
+<820D> <820D> <AAD9>
+<8210> <8210> <AFE7>
+<8211> <8211> <D752>
+<8212> <8212> <B5CE>
+<8214> <8214> <BB51>
+<8215> <8215> <E3AB>
+<8216> <8216> <E745>
+<821B> <821B> <A6DF>
+<821C> <821C> <B5CF>
+<821D> <821D> <DFA3>
+<821E> <821E> <BB52>
+<821F> <821F> <A6E0>
+<8220> <8220> <CDB1>
+<8221> <8221> <D069>
+<8222> <8222> <AD51>
+<8225> <8225> <D372>
+<8228> <8228> <AFEA>
+<822A> <822B> <AFE8>
+<822C> <822C> <AFEB>
+<822F> <822F> <D371>
+<8232> <8232> <D757>
+<8233> <8233> <D754>
+<8234> <8234> <D756>
+<8235> <8235> <B2EB>
+<8236> <8236> <B2ED>
+<8237> <8237> <B2EC>
+<8238> <8238> <D753>
+<8239> <8239> <B2EE>
+<823A> <823A> <D755>
+<823C> <823D> <DB58>
+<823F> <823F> <DB5A>
+<8240> <8240> <DFA6>
+<8242> <8242> <DFA7>
+<8244> <8244> <DFA5>
+<8245> <8245> <DFA8>
+<8247> <8247> <B8A5>
+<8249> <8249> <DFA4>
+endbfrange
+
+100 beginbfrange
+<824B> <824B> <BB53>
+<824E> <824E> <E74A>
+<824F> <824F> <E746>
+<8250> <8250> <E749>
+<8251> <8251> <E74B>
+<8252> <8252> <E748>
+<8253> <8253> <E747>
+<8255> <8257> <EAF5>
+<8258> <8259> <BFB4>
+<825A> <825A> <EDF1>
+<825B> <825B> <EDF0>
+<825C> <825C> <EDF2>
+<825E> <825E> <F0A3>
+<825F> <825F> <F0A2>
+<8261> <8261> <F2C4>
+<8263> <8263> <F2C5>
+<8264> <8264> <F2C3>
+<8266> <8266> <C4A5>
+<8268> <8269> <F4B6>
+<826B> <826B> <F746>
+<826C> <826C> <F7EF>
+<826D> <826D> <F8BB>
+<826E> <826E> <A6E1>
+<826F> <826F> <A87D>
+<8271> <8271> <C17D>
+<8272> <8272> <A6E2>
+<8274> <8274> <D758>
+<8275> <8275> <DB5B>
+<8277> <8277> <C641>
+<8278> <8278> <CA4A>
+<827C> <827C> <CA4B>
+<827D> <827D> <CA4D>
+<827E> <827E> <A6E3>
+<827F> <827F> <CA4E>
+<8280> <8280> <CA4C>
+<8283> <8284> <CBA2>
+<8285> <8285> <CB7B>
+<828A> <828A> <CBA1>
+<828B> <828B> <A8A1>
+<828D> <828D> <A8A2>
+<828E> <828E> <CB7C>
+<828F> <828F> <CB7A>
+<8290> <8290> <CB79>
+<8291> <8291> <CB7D>
+<8292> <8292> <A87E>
+<8293> <8293> <CB7E>
+<8294> <8294> <D06A>
+<8298> <8298> <CDB6>
+<8299> <8299> <AADC>
+<829A> <829A> <CDB5>
+<829B> <829B> <CDB7>
+<829D> <829D> <AADB>
+<829E> <829E> <CDBC>
+<829F> <829F> <AADF>
+<82A0> <82A0> <CDB2>
+<82A1> <82A1> <CDC0>
+<82A2> <82A2> <CDC6>
+<82A3> <82A3> <AAE6>
+<82A4> <82A4> <CDC3>
+<82A5> <82A5> <AAE3>
+<82A7> <82A7> <CDB9>
+<82A8> <82A8> <CDBF>
+<82A9> <82A9> <CDC1>
+<82AB> <82AB> <CDB4>
+<82AC> <82AC> <AAE2>
+<82AD> <82AD> <AADD>
+<82AE> <82AE> <CDBA>
+<82AF> <82AF> <AAE4>
+<82B0> <82B0> <AAE7>
+<82B1> <82B1> <AAE1>
+<82B3> <82B3> <AADA>
+<82B4> <82B4> <CDBE>
+<82B5> <82B5> <CDB8>
+<82B6> <82B6> <CDC5>
+<82B7> <82B7> <AAE9>
+<82B8> <82B8> <AAE5>
+<82B9> <82B9> <AAE0>
+<82BA> <82BA> <CDBD>
+<82BB> <82BB> <AFEC>
+<82BC> <82BC> <CDBB>
+<82BD> <82BD> <AADE>
+<82BE> <82BE> <AAE8>
+<82C0> <82C0> <CDB3>
+<82C2> <82C2> <CDC2>
+<82C3> <82C3> <CDC4>
+<82D1> <82D1> <AD62>
+<82D2> <82D2> <AD5C>
+<82D3> <82D3> <AD64>
+<82D4> <82D4> <AD61>
+<82D5> <82D5> <D071>
+<82D6> <82D6> <D074>
+<82D7> <82D7> <AD5D>
+<82D9> <82D9> <D06B>
+<82DB> <82DB> <AD56>
+<82DC> <82DC> <AD60>
+<82DE> <82DE> <AD63>
+<82DF> <82DF> <AD65>
+<82E0> <82E0> <D0A2>
+<82E1> <82E1> <D077>
+<82E3> <82E3> <AD55>
+endbfrange
+
+100 beginbfrange
+<82E4> <82E4> <D0A1>
+<82E5> <82E5> <AD59>
+<82E6> <82E6> <AD57>
+<82E7> <82E7> <AD52>
+<82E8> <82E8> <D06F>
+<82EA> <82EA> <D07E>
+<82EB> <82EB> <D073>
+<82EC> <82EC> <D076>
+<82ED> <82ED> <D0A5>
+<82EF> <82EF> <AD66>
+<82F0> <82F0> <D07D>
+<82F1> <82F1> <AD5E>
+<82F2> <82F2> <D078>
+<82F3> <82F3> <D0A4>
+<82F4> <82F4> <D075>
+<82F5> <82F5> <D079>
+<82F6> <82F6> <D07C>
+<82F9> <82F9> <D06D>
+<82FA> <82FA> <D0A3>
+<82FB> <82FB> <D07B>
+<82FE> <82FE> <D06C>
+<8300> <8300> <D070>
+<8301> <8301> <AD5F>
+<8302> <8302> <AD5A>
+<8303> <8303> <AD53>
+<8304> <8304> <AD58>
+<8305> <8305> <AD54>
+<8306> <8306> <AD67>
+<8307> <8307> <D06E>
+<8308> <8308> <D3A5>
+<8309> <8309> <AD5B>
+<830C> <830C> <D07A>
+<830D> <830D> <CE41>
+<8316> <8316> <D3A8>
+<8317> <8317> <AFFA>
+<8319> <8319> <D376>
+<831B> <831B> <D3A3>
+<831C> <831C> <D37D>
+<831E> <831E> <D3B2>
+<8320> <8320> <D3AA>
+<8322> <8322> <D37E>
+<8324> <8324> <D3A9>
+<8325> <8325> <D378>
+<8326> <8326> <D37C>
+<8327> <8327> <D3B5>
+<8328> <8328> <AFFD>
+<8329> <8329> <D3AD>
+<832A> <832A> <D3A4>
+<832B> <832B> <AFED>
+<832C> <832C> <D3B3>
+<832D> <832D> <D374>
+<832F> <832F> <D3AC>
+<8331> <8331> <AFFC>
+<8332> <8332> <AFF7>
+<8333> <8333> <D373>
+<8334> <8334> <AFF5>
+<8335> <8335> <AFF4>
+<8336> <8336> <AFF9>
+<8337> <8337> <D3AB>
+<8338> <8338> <AFF1>
+<8339> <8339> <AFF8>
+<833A> <833A> <D072>
+<833B> <833B> <DB5C>
+<833C> <833C> <D3A6>
+<833F> <833F> <D37A>
+<8340> <8340> <AFFB>
+<8341> <8341> <D37B>
+<8342> <8342> <D3A1>
+<8343> <8343> <AFFE>
+<8344> <8344> <D375>
+<8345> <8345> <D3AF>
+<8347> <8347> <D3AE>
+<8348> <8348> <D3B6>
+<8349> <8349> <AFF3>
+<834A> <834A> <AFF0>
+<834B> <834B> <D3B4>
+<834C> <834C> <D3B0>
+<834D> <834D> <D3A7>
+<834E> <834E> <D3A2>
+<834F> <834F> <AFF6>
+<8350> <8350> <AFF2>
+<8351> <8351> <D377>
+<8352> <8352> <AFEE>
+<8353> <8353> <D3B1>
+<8354> <8354> <AFEF>
+<8356> <8356> <D379>
+<8373> <8373> <D75E>
+<8374> <8374> <D760>
+<8375> <8375> <D765>
+<8376> <8376> <D779>
+<8377> <8377> <B2FC>
+<8378> <8378> <B2F2>
+<837A> <837A> <D75D>
+<837B> <837C> <B2FD>
+<837D> <837D> <D768>
+<837E> <837E> <D76F>
+<837F> <837F> <D775>
+<8381> <8381> <D762>
+<8383> <8383> <D769>
+<8386> <8386> <B340>
+endbfrange
+
+100 beginbfrange
+<8387> <8387> <D777>
+<8388> <8388> <D772>
+<8389> <8389> <B2FA>
+<838A> <838A> <B2F8>
+<838B> <838B> <D76E>
+<838C> <838C> <D76A>
+<838D> <838D> <D75C>
+<838E> <838E> <B2EF>
+<838F> <838F> <D761>
+<8390> <8390> <D759>
+<8392> <8392> <B2F7>
+<8393> <8393> <B2F9>
+<8394> <8394> <D766>
+<8395> <8395> <D763>
+<8396> <8396> <B2F4>
+<8397> <8397> <D773>
+<8398> <8398> <B2F1>
+<8399> <8399> <D764>
+<839A> <839A> <D77A>
+<839B> <839B> <D76C>
+<839D> <839D> <D76B>
+<839E> <839E> <B2F0>
+<83A0> <83A0> <B2FB>
+<83A2> <83A2> <B2F3>
+<83A3> <83A3> <D75A>
+<83A4> <83A4> <D75F>
+<83A5> <83A5> <D770>
+<83A6> <83A6> <D776>
+<83A7> <83A7> <B341>
+<83A8> <83A8> <D75B>
+<83A9> <83A9> <D767>
+<83AA> <83AA> <D76D>
+<83AB> <83AB> <B2F6>
+<83AE> <83AE> <D778>
+<83AF> <83AF> <D771>
+<83B0> <83B0> <D774>
+<83BD> <83BD> <B2F5>
+<83BF> <83BF> <DB6C>
+<83C0> <83C0> <DB60>
+<83C1> <83C1> <B5D7>
+<83C2> <83C2> <DB7D>
+<83C3> <83C3> <DBA7>
+<83C4> <83C4> <DBAA>
+<83C5> <83C5> <B5D5>
+<83C6> <83C6> <DB68>
+<83C7> <83C7> <DBA3>
+<83C8> <83C8> <DB69>
+<83C9> <83C9> <DB77>
+<83CA> <83CA> <B5E2>
+<83CB> <83CB> <DB73>
+<83CC> <83CC> <B5DF>
+<83CE> <83CE> <DB74>
+<83CF> <83CF> <DB5D>
+<83D1> <83D1> <DBA4>
+<83D4> <83D4> <B5E8>
+<83D5> <83D5> <DBA1>
+<83D6> <83D6> <DB75>
+<83D7> <83D7> <DBAC>
+<83D8> <83D8> <DB70>
+<83D9> <83D9> <DFC8>
+<83DB> <83DB> <DBAF>
+<83DC> <83DC> <B5E6>
+<83DD> <83DD> <DB6E>
+<83DE> <83DE> <DB7A>
+<83DF> <83DF> <B5E9>
+<83E0> <83E0> <B5D4>
+<83E1> <83E1> <DB72>
+<83E2> <83E2> <DBAD>
+<83E3> <83E3> <DB6B>
+<83E4> <83E4> <DB64>
+<83E5> <83E5> <DB6F>
+<83E7> <83E7> <DB63>
+<83E8> <83E8> <DB61>
+<83E9> <83E9> <B5D0>
+<83EA> <83EA> <DBA5>
+<83EB> <83EB> <DB6A>
+<83EC> <83EC> <DBA8>
+<83EE> <83EE> <DBA9>
+<83EF> <83EF> <B5D8>
+<83F0> <83F0> <B5DD>
+<83F1> <83F1> <B5D9>
+<83F2> <83F2> <B5E1>
+<83F3> <83F3> <DB7E>
+<83F4> <83F4> <B5DA>
+<83F5> <83F5> <DB76>
+<83F6> <83F6> <DB66>
+<83F8> <83F8> <B5D2>
+<83F9> <83F9> <DB5E>
+<83FA> <83FA> <DBA2>
+<83FB> <83FB> <DBAB>
+<83FC> <83FC> <DB65>
+<83FD> <83FD> <B5E0>
+<83FE> <83FE> <DBB0>
+<83FF> <83FF> <DB71>
+<8401> <8401> <DB6D>
+<8403> <8403> <B5D1>
+<8404> <8404> <B5E5>
+<8406> <8406> <DB7C>
+<8407> <8407> <B5E7>
+<8409> <8409> <DB78>
+endbfrange
+
+100 beginbfrange
+<840A> <840A> <B5DC>
+<840B> <840B> <B5D6>
+<840C> <840C> <B5DE>
+<840D> <840D> <B5D3>
+<840E> <840E> <B5E4>
+<840F> <840F> <DB79>
+<8410> <8410> <DB67>
+<8411> <8411> <DB7B>
+<8412> <8412> <DB62>
+<8413> <8413> <DBA6>
+<841B> <841B> <DBAE>
+<8423> <8423> <DB5F>
+<8429> <8429> <DFC7>
+<842B> <842B> <DFDD>
+<842C> <842C> <B855>
+<842D> <842D> <DFCC>
+<842F> <842F> <DFCA>
+<8430> <8430> <DFB5>
+<8431> <8431> <B8A9>
+<8432> <8432> <DFC5>
+<8433> <8433> <DFD9>
+<8434> <8434> <DFC1>
+<8435> <8435> <B8B1>
+<8436> <8436> <DFD8>
+<8437> <8437> <DFBF>
+<8438> <8438> <B5E3>
+<8439> <8439> <DFCF>
+<843A> <843A> <DFC0>
+<843B> <843B> <DFD6>
+<843C> <843C> <B8B0>
+<843D> <843D> <B8A8>
+<843F> <843F> <DFAA>
+<8440> <8440> <DFB2>
+<8442> <8442> <DFCB>
+<8443> <8443> <DFC3>
+<8444> <8444> <DFDC>
+<8445> <8445> <DFC6>
+<8446> <8446> <B8B6>
+<8447> <8447> <DFD7>
+<8449> <8449> <B8AD>
+<844B> <844B> <DFC9>
+<844C> <844C> <DFD1>
+<844D> <844D> <DFB6>
+<844E> <844E> <DFD0>
+<8450> <8450> <DFE1>
+<8451> <8451> <DFB1>
+<8452> <8452> <DFD2>
+<8454> <8454> <DFDF>
+<8456> <8456> <DFAB>
+<8457> <8457> <B5DB>
+<8459> <8459> <DFB9>
+<845A> <845A> <DFB8>
+<845B> <845B> <B8AF>
+<845D> <845D> <DFBC>
+<845E> <845E> <DFBE>
+<845F> <845F> <DFCD>
+<8460> <8460> <DFDE>
+<8461> <8461> <B8B2>
+<8463> <8463> <B8B3>
+<8465> <8465> <DFB0>
+<8466> <8466> <B8AB>
+<8467> <8467> <DFB4>
+<8468> <8468> <DFDA>
+<8469> <8469> <B8B4>
+<846B> <846B> <B8AC>
+<846C> <846C> <B8AE>
+<846D> <846D> <B8B5>
+<846E> <846E> <DFE0>
+<846F> <846F> <DFD3>
+<8470> <8470> <DFCE>
+<8473> <8473> <DFBB>
+<8474> <8474> <DFBA>
+<8475> <8475> <B8AA>
+<8476> <8476> <DFAC>
+<8477> <8477> <B8A7>
+<8478> <8478> <DFC4>
+<8479> <8479> <DFAD>
+<847A> <847A> <DFC2>
+<847D> <847D> <DFB7>
+<847E> <847E> <DFDB>
+<8482> <8482> <B8A6>
+<8486> <8486> <DFB3>
+<848D> <848D> <DFAF>
+<848E> <848E> <DFD5>
+<848F> <848F> <DFAE>
+<8490> <8490> <BB60>
+<8491> <8491> <E3D3>
+<8494> <8494> <E3C2>
+<8497> <8497> <E3AC>
+<8498> <8498> <E3CA>
+<8499> <8499> <BB58>
+<849A> <849A> <E3BB>
+<849B> <849B> <E3C5>
+<849C> <849C> <BB5B>
+<849D> <849D> <E3BE>
+<849E> <849E> <BB59>
+<849F> <849F> <E3AF>
+<84A0> <84A0> <E3CD>
+<84A1> <84A1> <E3AE>
+<84A2> <84A2> <E3C1>
+endbfrange
+
+100 beginbfrange
+<84A4> <84A4> <E3AD>
+<84A7> <84A7> <E3BF>
+<84A8> <84A8> <E3C8>
+<84A9> <84A9> <E3C6>
+<84AA> <84AA> <E3BA>
+<84AB> <84AB> <E3B5>
+<84AC> <84AC> <E3B3>
+<84AE> <84AE> <E3B4>
+<84AF> <84AF> <E3C7>
+<84B0> <84B0> <E3D2>
+<84B1> <84B1> <E3BC>
+<84B2> <84B2> <BB5A>
+<84B4> <84B4> <E3B7>
+<84B6> <84B6> <E3CB>
+<84B8> <84B8> <BB5D>
+<84B9> <84B9> <E3B6>
+<84BA> <84BA> <E3B0>
+<84BB> <84BB> <E3C0>
+<84BC> <84BC> <BB61>
+<84BF> <84BF> <BB55>
+<84C0> <84C0> <BB5E>
+<84C1> <84C1> <E3B8>
+<84C2> <84C2> <E3B2>
+<84C4> <84C4> <BB57>
+<84C5> <84C5> <DFD4>
+<84C6> <84C6> <BB56>
+<84C7> <84C7> <E3C3>
+<84C9> <84C9> <BB54>
+<84CA> <84CA> <BB63>
+<84CB> <84CB> <BB5C>
+<84CC> <84CC> <E3C4>
+<84CD> <84CD> <E3B9>
+<84CE> <84CE> <E3B1>
+<84CF> <84CF> <E3CC>
+<84D0> <84D0> <E3BD>
+<84D1> <84D1> <BB62>
+<84D2> <84D2> <E3D0>
+<84D3> <84D3> <BB5F>
+<84D4> <84D4> <E3CF>
+<84D6> <84D6> <E3C9>
+<84D7> <84D7> <E3CE>
+<84DB> <84DB> <E3D1>
+<84E7> <84E8> <E773>
+<84E9> <84E9> <E767>
+<84EA> <84EA> <E766>
+<84EB> <84EB> <E762>
+<84EC> <84EC> <BDB4>
+<84EE> <84EE> <BDAC>
+<84EF> <84EF> <E776>
+<84F0> <84F0> <E775>
+<84F1> <84F1> <DFA9>
+<84F2> <84F2> <E75F>
+<84F3> <84F3> <E763>
+<84F4> <84F4> <E75D>
+<84F6> <84F6> <E770>
+<84F7> <84F7> <E761>
+<84F9> <84F9> <E777>
+<84FA> <84FA> <E75A>
+<84FB> <84FB> <E758>
+<84FC> <84FC> <E764>
+<84FD> <84FD> <E76E>
+<84FE> <84FE> <E769>
+<84FF> <84FF> <BDB6>
+<8500> <8500> <E74F>
+<8502> <8502> <E76D>
+<8506> <8506> <BDB7>
+<8507> <8507> <DFBD>
+<8508> <8508> <E75B>
+<8509> <8509> <E752>
+<850A> <850A> <E755>
+<850B> <850B> <E77B>
+<850C> <850C> <E75C>
+<850D> <850D> <E753>
+<850E> <850E> <E751>
+<850F> <850F> <E74E>
+<8511> <8511> <BDB0>
+<8512> <8512> <E765>
+<8513> <8513> <BDAF>
+<8514> <8514> <BDB3>
+<8515> <8515> <E760>
+<8516> <8516> <E768>
+<8517> <8517> <BDA9>
+<8518> <8518> <E778>
+<8519> <8519> <E77C>
+<851A> <851A> <BDAB>
+<851C> <851C> <E757>
+<851D> <851D> <E76B>
+<851E> <851E> <E76F>
+<851F> <851F> <E754>
+<8520> <8520> <E779>
+<8521> <8521> <BDB2>
+<8523> <8523> <BDB1>
+<8524> <8524> <E74C>
+<8525> <8525> <BDB5>
+<8526> <8526> <E772>
+<8527> <8527> <E756>
+<8528> <8528> <E76A>
+<8529> <8529> <E750>
+<852A> <852A> <E75E>
+<852B> <852B> <E759>
+endbfrange
+
+100 beginbfrange
+<852C> <852D> <BDAD>
+<852E> <852E> <E76C>
+<852F> <852F> <E77D>
+<8530> <8530> <E77A>
+<8531> <8531> <E771>
+<853B> <853B> <E74D>
+<853D> <853D> <BDAA>
+<853E> <853E> <EB49>
+<8540> <8540> <EB40>
+<8541> <8541> <EB43>
+<8543> <8543> <BFBB>
+<8544> <8544> <EB45>
+<8545> <8545> <EAF9>
+<8546> <8546> <EB41>
+<8547> <8547> <EB47>
+<8548> <8548> <BFB8>
+<8549> <8549> <BFBC>
+<854A> <854A> <BFB6>
+<854D> <854D> <EAFB>
+<854E> <854E> <EB4C>
+<8551> <8551> <EB46>
+<8553> <8553> <EAFC>
+<8554> <8554> <EB55>
+<8555> <8555> <EB4F>
+<8556> <8556> <EAF8>
+<8557> <8557> <EE46>
+<8558> <8558> <EAFE>
+<8559> <8559> <BFB7>
+<855B> <855B> <EB4A>
+<855D> <855D> <EB54>
+<855E> <855E> <BFBF>
+<8560> <8560> <EB51>
+<8561> <8561> <EAFD>
+<8562> <8562> <EB44>
+<8563> <8563> <EB48>
+<8564> <8564> <EB42>
+<8565> <8565> <EB56>
+<8566> <8566> <EB53>
+<8567> <8567> <EB50>
+<8568> <8569> <BFB9>
+<856A> <856A> <BFBE>
+<856B> <856B> <EAFA>
+<856C> <856C> <EB57>
+<856D> <856D> <BFBD>
+<856E> <856E> <EB4D>
+<8571> <8571> <EB4B>
+<8575> <8575> <EB4E>
+<8576> <8576> <EE53>
+<8577> <8577> <EE40>
+<8578> <8578> <EE45>
+<8579> <8579> <EE52>
+<857A> <857A> <EE44>
+<857B> <857B> <EDFB>
+<857C> <857C> <EE41>
+<857E> <857E> <C1A2>
+<8580> <8580> <EDF4>
+<8581> <8581> <EE4D>
+<8582> <8582> <EE4F>
+<8583> <8583> <EDF3>
+<8584> <8584> <C1A1>
+<8585> <8585> <EE51>
+<8586> <8586> <EE49>
+<8587> <8587> <C1A8>
+<8588> <8588> <EE50>
+<8589> <8589> <EE42>
+<858A> <858A> <C1AA>
+<858B> <858B> <EDF9>
+<858C> <858C> <EB52>
+<858D> <858D> <EE4A>
+<858E> <858E> <EE47>
+<858F> <858F> <EDF5>
+<8590> <8590> <EE55>
+<8591> <8591> <C1A4>
+<8594> <8594> <C1A5>
+<8595> <8595> <EDF7>
+<8596> <8596> <EE48>
+<8598> <8598> <EE54>
+<8599> <8599> <EE4B>
+<859A> <859A> <EDFD>
+<859B> <859B> <C1A7>
+<859C> <859C> <C1A3>
+<859D> <859D> <EE4C>
+<859E> <859E> <EDFE>
+<859F> <859F> <EE56>
+<85A0> <85A0> <EDF8>
+<85A1> <85A1> <EE43>
+<85A2> <85A2> <EE4E>
+<85A3> <85A3> <EDFA>
+<85A4> <85A4> <EDFC>
+<85A6> <85A6> <C2CB>
+<85A7> <85A7> <EDF6>
+<85A8> <85A8> <C1A9>
+<85A9> <85A9> <C2C4>
+<85AA> <85AA> <C17E>
+<85AF> <85AF> <C1A6>
+<85B0> <85B0> <C2C8>
+<85B1> <85B1> <F0B3>
+<85B3> <85B3> <F0A9>
+<85B4> <85B4> <F0A4>
+<85B5> <85B5> <F0AA>
+endbfrange
+
+100 beginbfrange
+<85B6> <85B6> <F0B4>
+<85B7> <85B7> <F0B8>
+<85B8> <85B8> <F0B7>
+<85B9> <85B9> <C2CA>
+<85BA> <85BA> <C2C9>
+<85BD> <85BD> <F0AB>
+<85BE> <85BE> <F0B9>
+<85BF> <85BF> <F0AE>
+<85C0> <85C0> <F0A6>
+<85C2> <85C2> <F0A8>
+<85C3> <85C3> <F0A7>
+<85C4> <85C4> <F0AD>
+<85C5> <85C5> <F0B2>
+<85C6> <85C6> <F0A5>
+<85C7> <85C7> <F0AC>
+<85C8> <85C8> <F0B1>
+<85C9> <85C9> <C2C7>
+<85CB> <85CB> <F0AF>
+<85CD> <85CD> <C2C5>
+<85CE> <85CE> <F0B0>
+<85CF> <85CF> <C2C3>
+<85D0> <85D0> <C2C6>
+<85D1> <85D1> <F2D5>
+<85D2> <85D2> <F0B5>
+<85D5> <85D5> <C3C2>
+<85D7> <85D7> <F2CD>
+<85D8> <85D8> <F2D1>
+<85D9> <85D9> <F2C9>
+<85DA> <85DA> <F2CC>
+<85DC> <85DC> <F2D4>
+<85DD> <85DD> <C3C0>
+<85DE> <85DE> <F2D9>
+<85DF> <85DF> <F2D2>
+<85E1> <85E1> <F2CA>
+<85E2> <85E2> <F2DA>
+<85E3> <85E3> <F2D3>
+<85E4> <85E5> <C3C3>
+<85E6> <85E6> <F2D7>
+<85E8> <85E8> <F2CB>
+<85E9> <85E9> <C3BF>
+<85EA> <85EA> <C3C1>
+<85EB> <85EB> <F2C6>
+<85EC> <85EC> <F2CE>
+<85ED> <85ED> <F2C8>
+<85EF> <85EF> <F2D8>
+<85F0> <85F0> <F2D6>
+<85F1> <85F1> <F2C7>
+<85F2> <85F2> <F2CF>
+<85F6> <85F6> <F4BE>
+<85F7> <85F7> <C3C5>
+<85F8> <85F8> <F2D0>
+<85F9> <85F9> <C4A7>
+<85FA> <85FA> <C4A9>
+<85FB> <85FB> <C4A6>
+<85FD> <85FD> <F4C3>
+<85FE> <85FE> <F4BB>
+<85FF> <85FF> <F4B9>
+<8600> <8600> <F4BD>
+<8601> <8601> <F4BA>
+<8604> <8604> <F4BF>
+<8605> <8605> <F4C1>
+<8606> <8606> <C4AA>
+<8607> <8607> <C4AC>
+<8609> <8609> <F4C0>
+<860A> <860A> <C4AD>
+<860B> <860B> <C4AB>
+<860C> <860C> <F4C2>
+<8611> <8611> <C4A8>
+<8617> <8617> <C4F4>
+<8618> <8618> <F5F1>
+<8619> <8619> <F5F7>
+<861A> <861A> <C4F6>
+<861B> <861B> <F4BC>
+<861C> <861C> <F5F6>
+<861E> <861E> <F5FD>
+<861F> <861F> <F5F4>
+<8620> <8620> <F5FB>
+<8621> <8621> <F5FA>
+<8622> <8622> <F4B8>
+<8623> <8623> <F5F5>
+<8624> <8624> <F0B6>
+<8625> <8625> <F5FE>
+<8626> <8626> <F5F3>
+<8627> <8627> <F5F8>
+<8629> <8629> <F5FC>
+<862A> <862A> <F5F2>
+<862C> <862C> <F74A>
+<862D> <862D> <C4F5>
+<862E> <862E> <F5F9>
+<8631> <8631> <F7F4>
+<8632> <8632> <F74B>
+<8633> <8633> <F749>
+<8634> <8635> <F747>
+<8636> <8636> <F74C>
+<8638> <8638> <C5D9>
+<8639> <8639> <F7F2>
+<863A> <863A> <F7F0>
+<863B> <863B> <F7F5>
+<863C> <863C> <F7F3>
+<863E> <863E> <F7F6>
+endbfrange
+
+100 beginbfrange
+<863F> <863F> <C5DA>
+<8640> <8640> <F7F1>
+<8643> <8643> <F8BC>
+<8646> <8648> <F945>
+<864B> <864B> <F9C7>
+<864C> <864C> <F9BD>
+<864D> <864D> <CA4F>
+<864E> <864E> <AAEA>
+<8650> <8650> <AD68>
+<8652> <8652> <D3B8>
+<8653> <8653> <D3B7>
+<8654> <8654> <B040>
+<8655> <8655> <B342>
+<8656> <8656> <D77C>
+<8659> <8659> <D77B>
+<865B> <865B> <B5EA>
+<865C> <865C> <B8B8>
+<865E> <865E> <B8B7>
+<865F> <865F> <B8B9>
+<8661> <8661> <E3D4>
+<8662> <8662> <E77E>
+<8663> <8663> <EB58>
+<8664> <8664> <EB5A>
+<8665> <8665> <EB59>
+<8667> <8667> <C1AB>
+<8668> <8668> <EE57>
+<8669> <8669> <F0BA>
+<866A> <866A> <F9A5>
+<866B> <866B> <A6E4>
+<866D> <866E> <CDC9>
+<866F> <866F> <CDC8>
+<8670> <8670> <CDC7>
+<8671> <8671> <AAEB>
+<8673> <8673> <D0A9>
+<8674> <8674> <D0A7>
+<8677> <8677> <D0A6>
+<8679> <8679> <AD69>
+<867A> <867A> <AD6B>
+<867B> <867B> <AD6A>
+<867C> <867C> <D0A8>
+<8685> <8685> <D3C4>
+<8686> <8686> <D3C1>
+<8687> <8687> <D3BF>
+<868A> <868A> <B041>
+<868B> <868B> <D3C2>
+<868C> <868C> <B046>
+<868D> <868D> <D3BC>
+<868E> <868E> <D3CB>
+<8690> <8690> <D3CD>
+<8691> <8691> <D3BD>
+<8693> <8693> <B043>
+<8694> <8694> <D3CE>
+<8695> <8695> <D3C9>
+<8696> <8696> <D3BB>
+<8697> <8697> <D3C0>
+<8698> <8698> <D3CA>
+<8699> <8699> <D3C6>
+<869A> <869A> <D3C3>
+<869C> <869C> <B048>
+<869D> <869D> <D3CC>
+<869E> <869E> <D3BE>
+<86A1> <86A1> <D3C7>
+<86A2> <86A2> <D3B9>
+<86A3> <86A3> <B047>
+<86A4> <86A4> <B044>
+<86A5> <86A5> <D3C5>
+<86A7> <86A7> <D3C8>
+<86A8> <86A8> <D3BA>
+<86A9> <86A9> <B045>
+<86AA> <86AA> <B042>
+<86AF> <86AF> <B34C>
+<86B0> <86B0> <D7A5>
+<86B1> <86B1> <B34B>
+<86B3> <86B3> <D7A8>
+<86B4> <86B4> <D7AB>
+<86B5> <86B5> <B348>
+<86B6> <86B6> <B346>
+<86B7> <86B7> <D77E>
+<86B8> <86B8> <D7A9>
+<86B9> <86B9> <D7A7>
+<86BA> <86BA> <D7A4>
+<86BB> <86BC> <D7AC>
+<86BD> <86BE> <D7AF>
+<86BF> <86BF> <D77D>
+<86C0> <86C0> <B345>
+<86C1> <86C1> <D7A2>
+<86C2> <86C2> <D7A1>
+<86C3> <86C3> <D7AE>
+<86C4> <86C4> <B347>
+<86C5> <86C5> <D7A3>
+<86C6> <86C6> <B349>
+<86C7> <86C7> <B344>
+<86C8> <86C8> <D7A6>
+<86C9> <86C9> <B34D>
+<86CB> <86CB> <B34A>
+<86CC> <86CC> <D7AA>
+<86D0> <86D0> <B5F1>
+<86D1> <86D1> <DBBF>
+<86D3> <86D3> <DBB4>
+<86D4> <86D4> <B5EE>
+endbfrange
+
+100 beginbfrange
+<86D6> <86D6> <DFE7>
+<86D7> <86D7> <DBBD>
+<86D8> <86D8> <DBB1>
+<86D9> <86D9> <B5EC>
+<86DA> <86DA> <DBB6>
+<86DB> <86DB> <B5EF>
+<86DC> <86DC> <DBBA>
+<86DD> <86DD> <DBB8>
+<86DE> <86DE> <B5F2>
+<86DF> <86DF> <B5EB>
+<86E2> <86E2> <DBB2>
+<86E3> <86E3> <DBB5>
+<86E4> <86E4> <B5F0>
+<86E6> <86E6> <DBB3>
+<86E8> <86E8> <DBBE>
+<86E9> <86E9> <DBBC>
+<86EA> <86EA> <DBB7>
+<86EB> <86EB> <DBB9>
+<86EC> <86EC> <DBBB>
+<86ED> <86ED> <B5ED>
+<86F5> <86F5> <DFE8>
+<86F6> <86F6> <DFEE>
+<86F7> <86F7> <DFE4>
+<86F8> <86F8> <DFEA>
+<86F9> <86F9> <B8BA>
+<86FA> <86FA> <DFE6>
+<86FB> <86FB> <B8C0>
+<86FE> <86FE> <B8BF>
+<8700> <8700> <B8BE>
+<8701> <8701> <DFED>
+<8702> <8703> <B8C1>
+<8704> <8704> <DFE3>
+<8705> <8705> <DFF0>
+<8706> <8706> <B8C3>
+<8707> <8707> <B8BD>
+<8708> <8708> <B8BC>
+<8709> <8709> <DFEC>
+<870A> <870A> <B8C4>
+<870B> <870B> <DFE2>
+<870C> <870C> <DFE5>
+<870D> <870D> <DFEF>
+<870E> <870E> <DFEB>
+<8711> <8711> <E3F4>
+<8712> <8712> <E3E9>
+<8713> <8713> <B8BB>
+<8718> <8718> <BB6A>
+<8719> <8719> <E3DD>
+<871A> <871A> <E3F2>
+<871B> <871B> <E3DE>
+<871C> <871C> <BB65>
+<871E> <871E> <E3DB>
+<8720> <8720> <E3E4>
+<8721> <8721> <E3DC>
+<8722> <8722> <BB67>
+<8723> <8723> <E3D6>
+<8724> <8724> <E3F1>
+<8725> <8725> <BB68>
+<8726> <8727> <E3EE>
+<8728> <8728> <E3D7>
+<8729> <8729> <BB6D>
+<872A> <872A> <E3E6>
+<872C> <872C> <E3E0>
+<872D> <872D> <E3E7>
+<872E> <872E> <E3DA>
+<8730> <8730> <E3F3>
+<8731> <8731> <E3EB>
+<8732> <8732> <E3E5>
+<8733> <8733> <E3D5>
+<8734> <8734> <BB69>
+<8735> <8735> <E3EC>
+<8737> <8737> <BB6C>
+<8738> <8738> <E3F0>
+<873A> <873A> <E3EA>
+<873B> <873B> <BB66>
+<873C> <873C> <E3E8>
+<873E> <873E> <E3E2>
+<873F> <873F> <BB64>
+<8740> <8740> <E3D9>
+<8741> <8741> <E3E1>
+<8742> <8742> <E3ED>
+<8743> <8743> <E3DF>
+<8746> <8746> <E3E3>
+<874C> <874C> <BDC1>
+<874D> <874D> <DFE9>
+<874E> <874E> <E7B2>
+<874F> <874F> <E7BB>
+<8750> <8750> <E7B1>
+<8751> <8751> <E7AD>
+<8752> <8752> <E7AA>
+<8753> <8753> <BDC2>
+<8754> <8754> <E7A8>
+<8755> <8755> <BB6B>
+<8756> <8756> <E7A1>
+<8757> <8757> <BDC0>
+<8758> <8758> <E7A7>
+<8759> <8759> <BDBF>
+<875A> <875A> <E7AC>
+<875B> <875B> <E7A9>
+<875C> <875C> <E7B9>
+<875D> <875D> <E7B4>
+endbfrange
+
+100 beginbfrange
+<875E> <875E> <E7AE>
+<875F> <875F> <E7B3>
+<8760> <8760> <BDBB>
+<8761> <8761> <E7AB>
+<8762> <8762> <E7BE>
+<8763> <8764> <E7A2>
+<8765> <8765> <E7BA>
+<8766> <8766> <BDBC>
+<8767> <8767> <E7BF>
+<8768> <8768> <BDBE>
+<8769> <8769> <E7C0>
+<876A> <876A> <E7B0>
+<876B> <876B> <E3D8>
+<876C> <876C> <E7B6>
+<876D> <876D> <E7AF>
+<876E> <876E> <E7B8>
+<876F> <876F> <E7B5>
+<8773> <8773> <E7A6>
+<8774> <8774> <BDB9>
+<8775> <8775> <E7BD>
+<8776> <8776> <BDBA>
+<8777> <8777> <E7A4>
+<8778> <8778> <BDBD>
+<8779> <8779> <EB64>
+<877A> <877A> <E7B7>
+<877B> <877B> <E7BC>
+<8781> <8781> <EB61>
+<8782> <8782> <BDB8>
+<8783> <8783> <BFC0>
+<8784> <8784> <EB6B>
+<8785> <8785> <EB67>
+<8787> <8787> <EB65>
+<8788> <8788> <EB60>
+<8789> <8789> <EB6F>
+<878D> <878D> <BFC4>
+<878F> <878F> <EB5C>
+<8790> <8791> <EB68>
+<8792> <8792> <EB5F>
+<8793> <8793> <EB5E>
+<8794> <8794> <EB6C>
+<8796> <8796> <EB62>
+<8797> <8797> <EB5D>
+<8798> <8798> <EB63>
+<879A> <879A> <EB6E>
+<879B> <879B> <EB5B>
+<879C> <879C> <EB6D>
+<879D> <879D> <EB6A>
+<879E> <879E> <BFC2>
+<879F> <879F> <BFC1>
+<87A2> <87A2> <BFC3>
+<87A3> <87A3> <EB66>
+<87A4> <87A4> <F0CB>
+<87AA> <87AA> <EE59>
+<87AB> <87AB> <C1B1>
+<87AC> <87AC> <EE5D>
+<87AD> <87AD> <EE5A>
+<87AE> <87AE> <EE61>
+<87AF> <87AF> <EE67>
+<87B0> <87B0> <EE5C>
+<87B2> <87B2> <EE70>
+<87B3> <87B3> <C1AE>
+<87B4> <87B4> <EE6A>
+<87B5> <87B5> <EE5F>
+<87B6> <87B6> <EE6B>
+<87B7> <87B7> <EE66>
+<87B8> <87B8> <EE6D>
+<87B9> <87B9> <EE5E>
+<87BA> <87BA> <C1B3>
+<87BB> <87BB> <C1B2>
+<87BC> <87BC> <EE60>
+<87BD> <87BD> <EE6E>
+<87BE> <87BE> <EE58>
+<87BF> <87BF> <EE6C>
+<87C0> <87C0> <C1AC>
+<87C2> <87C2> <EE64>
+<87C3> <87C3> <EE63>
+<87C4> <87C4> <EE68>
+<87C5> <87C5> <EE5B>
+<87C6> <87C6> <C1B0>
+<87C8> <87C8> <C1B4>
+<87C9> <87C9> <EE62>
+<87CA> <87CA> <EE69>
+<87CB> <87CB> <C1B5>
+<87CC> <87CC> <EE65>
+<87D1> <87D1> <C1AD>
+<87D2> <87D2> <C1AF>
+<87D3> <87D3> <F0C7>
+<87D4> <87D4> <F0C5>
+<87D7> <87D7> <F0CC>
+<87D8> <87D8> <F0C9>
+<87D9> <87D9> <F0CD>
+<87DB> <87DB> <F0BE>
+<87DC> <87DC> <F0C6>
+<87DD> <87DD> <F0D1>
+<87DE> <87DE> <EE6F>
+<87DF> <87DF> <F0C2>
+<87E0> <87E0> <C2CF>
+<87E1> <87E1> <E7A5>
+<87E2> <87E2> <F0BD>
+<87E3> <87E3> <F0CA>
+endbfrange
+
+100 beginbfrange
+<87E4> <87E4> <F0C4>
+<87E5> <87E5> <F0C1>
+<87E6> <87E6> <F0BC>
+<87E7> <87E7> <F0BB>
+<87E8> <87E8> <F0D0>
+<87EA> <87EA> <F0C0>
+<87EB> <87EB> <F0BF>
+<87EC> <87EC> <C2CD>
+<87ED> <87ED> <F0C8>
+<87EF> <87EF> <C2CC>
+<87F2> <87F2> <C2CE>
+<87F3> <87F3> <F0C3>
+<87F4> <87F4> <F0CF>
+<87F6> <87F7> <F2DE>
+<87F9> <87F9> <C3C9>
+<87FA> <87FA> <F2DC>
+<87FB> <87FB> <C3C6>
+<87FC> <87FC> <F2E4>
+<87FE> <87FE> <C3CA>
+<87FF> <87FF> <F2E6>
+<8800> <8800> <F2DB>
+<8801> <8801> <F0CE>
+<8802> <8802> <F2E8>
+<8803> <8803> <F2DD>
+<8805> <8805> <C3C7>
+<8806> <8806> <F2E3>
+<8808> <8808> <F2E5>
+<8809> <8809> <F2E0>
+<880A> <880A> <F2E7>
+<880B> <880B> <F2E2>
+<880C> <880C> <F2E1>
+<880D> <880D> <C3C8>
+<8810> <8811> <F4C5>
+<8813> <8813> <F4C8>
+<8814> <8815> <C4AE>
+<8816> <8816> <F4C9>
+<8817> <8817> <F4C7>
+<8819> <8819> <F4C4>
+<881B> <881B> <F642>
+<881C> <881C> <F645>
+<881D> <881D> <F641>
+<881F> <881F> <C4FA>
+<8820> <8820> <F643>
+<8821> <8821> <C4F9>
+<8822> <8822> <C4F8>
+<8823> <8823> <C4F7>
+<8824> <8824> <F644>
+<8825> <8825> <F751>
+<8826> <8826> <F74F>
+<8828> <8828> <F74E>
+<8829> <8829> <F640>
+<882A> <882A> <F750>
+<882B> <882B> <F646>
+<882C> <882C> <F74D>
+<882E> <882E> <F7F9>
+<882F> <882F> <F7D7>
+<8830> <8830> <F7F7>
+<8831> <8831> <C5DB>
+<8832> <8832> <F7F8>
+<8833> <8833> <F7FA>
+<8835> <8835> <F8BF>
+<8836> <8836> <C5FA>
+<8837> <8837> <F8BE>
+<8838> <8838> <F8BD>
+<8839> <8839> <C5FB>
+<883B> <883B> <C65A>
+<883C> <883C> <F96E>
+<883D> <883D> <F9A7>
+<883E> <883E> <F9A6>
+<883F> <883F> <F9A8>
+<8840> <8840> <A6E5>
+<8841> <8841> <D0AA>
+<8843> <8844> <D3CF>
+<8848> <8848> <DBC0>
+<884A> <884A> <F647>
+<884B> <884B> <F8C0>
+<884C> <884C> <A6E6>
+<884D> <884D> <AD6C>
+<884E> <884E> <D0AB>
+<8852> <8852> <D7B1>
+<8853> <8853> <B34E>
+<8855> <8855> <DBC2>
+<8856> <8856> <DBC1>
+<8857> <8857> <B5F3>
+<8859> <8859> <B8C5>
+<885A> <885A> <E7C1>
+<885B> <885B> <BDC3>
+<885D> <885D> <BDC4>
+<8861> <8861> <BFC5>
+<8862> <8862> <C5FC>
+<8863> <8863> <A6E7>
+<8867> <8867> <D0AC>
+<8868> <8868> <AAED>
+<8869> <8869> <D0AE>
+<886A> <886A> <D0AD>
+<886B> <886B> <AD6D>
+<886D> <886D> <D3D1>
+<886F> <886F> <D3D8>
+<8870> <8870> <B049>
+<8871> <8871> <D3D6>
+endbfrange
+
+100 beginbfrange
+<8872> <8872> <D3D4>
+<8874> <8874> <D3DB>
+<8875> <8876> <D3D2>
+<8877> <8877> <B04A>
+<8879> <8879> <B04E>
+<887C> <887C> <D3DC>
+<887D> <887D> <B04D>
+<887E> <887E> <D3DA>
+<887F> <887F> <D3D7>
+<8880> <8880> <D3D5>
+<8881> <8882> <B04B>
+<8883> <8883> <D3D9>
+<8888> <8888> <B350>
+<8889> <8889> <D7B2>
+<888B> <888B> <B355>
+<888C> <888C> <D7C2>
+<888D> <888D> <B354>
+<888E> <888E> <D7C4>
+<8891> <8891> <D7B8>
+<8892> <8892> <B352>
+<8893> <8893> <D7C3>
+<8895> <8895> <D7B3>
+<8896> <8896> <B353>
+<8897> <8897> <D7BF>
+<8898> <8898> <D7BB>
+<8899> <8899> <D7BD>
+<889A> <889A> <D7B7>
+<889B> <889B> <D7BE>
+<889E> <889E> <B34F>
+<889F> <889F> <D7BA>
+<88A1> <88A1> <D7B9>
+<88A2> <88A2> <D7B5>
+<88A4> <88A4> <D7C0>
+<88A7> <88A7> <D7BC>
+<88A8> <88A8> <D7B4>
+<88AA> <88AA> <D7B6>
+<88AB> <88AB> <B351>
+<88AC> <88AC> <D7C1>
+<88B1> <88B1> <B5F6>
+<88B2> <88B2> <DBCD>
+<88B6> <88B6> <DBC9>
+<88B7> <88B7> <DBCB>
+<88B8> <88B8> <DBC6>
+<88B9> <88B9> <DBC5>
+<88BA> <88BA> <DBC3>
+<88BC> <88BC> <DBCA>
+<88BD> <88BD> <DBCC>
+<88BE> <88BE> <DBC8>
+<88C0> <88C0> <DBC7>
+<88C1> <88C2> <B5F4>
+<88C9> <88C9> <DBCF>
+<88CA> <88CA> <B8CD>
+<88CB> <88CB> <DFF2>
+<88CC> <88CC> <DFF8>
+<88CD> <88CE> <DFF3>
+<88D0> <88D0> <DFF9>
+<88D2> <88D2> <B8CF>
+<88D4> <88D4> <B8C7>
+<88D5> <88D5> <B8CE>
+<88D6> <88D6> <DFF1>
+<88D7> <88D7> <DBC4>
+<88D8> <88D8> <B8CA>
+<88D9> <88D9> <B8C8>
+<88DA> <88DA> <DFF7>
+<88DB> <88DB> <DFF6>
+<88DC> <88DC> <B8C9>
+<88DD> <88DD> <B8CB>
+<88DE> <88DE> <DFF5>
+<88DF> <88DF> <B8C6>
+<88E1> <88E1> <B8CC>
+<88E7> <88E7> <E3F6>
+<88E8> <88E8> <BB74>
+<88EB> <88EB> <E442>
+<88EC> <88EC> <E441>
+<88EE> <88EE> <E3FB>
+<88EF> <88EF> <BB76>
+<88F0> <88F0> <E440>
+<88F1> <88F2> <E3F7>
+<88F3> <88F3> <BB6E>
+<88F4> <88F4> <BB70>
+<88F6> <88F6> <E3FD>
+<88F7> <88F7> <E3F5>
+<88F8> <88F8> <BB72>
+<88F9> <88F9> <BB71>
+<88FA> <88FA> <E3F9>
+<88FB> <88FB> <E3FE>
+<88FC> <88FC> <E3FC>
+<88FD> <88FD> <BB73>
+<88FE> <88FE> <E3FA>
+<8901> <8901> <DBCE>
+<8902> <8902> <BB6F>
+<8905> <8905> <E7C2>
+<8906> <8906> <E7C9>
+<8907> <8907> <BDC6>
+<8909> <8909> <E7CD>
+<890A> <890A> <BDCA>
+<890B> <890B> <E7C5>
+<890C> <890C> <E7C3>
+<890E> <890E> <E7CC>
+<8910> <8910> <BDC5>
+endbfrange
+
+100 beginbfrange
+<8911> <8911> <E7CB>
+<8912> <8913> <BDC7>
+<8914> <8914> <E7C4>
+<8915> <8915> <BDC9>
+<8916> <8916> <E7CA>
+<8917> <8919> <E7C6>
+<891A> <891A> <BB75>
+<891E> <891E> <EB70>
+<891F> <891F> <EB7C>
+<8921> <8921> <BFCA>
+<8922> <8922> <EB77>
+<8923> <8923> <EB79>
+<8925> <8925> <BFC8>
+<8926> <8926> <EB71>
+<8927> <8927> <EB75>
+<8929> <8929> <EB78>
+<892A> <892A> <BFC6>
+<892B> <892B> <BFC9>
+<892C> <892C> <EB7B>
+<892D> <892E> <EB73>
+<892F> <892F> <EB7A>
+<8930> <8930> <EB72>
+<8931> <8931> <EB76>
+<8932> <8932> <BFC7>
+<8933> <8933> <EE72>
+<8935> <8935> <EE71>
+<8936> <8936> <C1B7>
+<8937> <8937> <EE77>
+<8938> <8938> <C1B9>
+<893B> <893B> <C1B6>
+<893C> <893C> <EE73>
+<893D> <893D> <C1BA>
+<893E> <893E> <EE74>
+<8941> <8941> <EE75>
+<8942> <8942> <EE78>
+<8944> <8944> <C1B8>
+<8946> <8946> <F0D6>
+<8949> <8949> <F0D9>
+<894B> <894B> <F0D3>
+<894C> <894C> <F0D5>
+<894F> <894F> <F0D4>
+<8950> <8951> <F0D7>
+<8952> <8952> <EE76>
+<8953> <8953> <F0D2>
+<8956> <8956> <C3CD>
+<8957> <8957> <F2EC>
+<8958> <8958> <F2EF>
+<8959> <8959> <F2F1>
+<895A> <895B> <F2EA>
+<895C> <895C> <F2EE>
+<895D> <895D> <F2F0>
+<895E> <895E> <C3CE>
+<895F> <895F> <C3CC>
+<8960> <8960> <C3CB>
+<8961> <8961> <F2ED>
+<8962> <8962> <F2E9>
+<8963> <8963> <F4CA>
+<8964> <8964> <C4B0>
+<8966> <8966> <F4CB>
+<8969> <8969> <F649>
+<896A> <896A> <C4FB>
+<896B> <896B> <F64B>
+<896C> <896C> <C4FC>
+<896D> <896D> <F648>
+<896E> <896E> <F64A>
+<896F> <896F> <C5A8>
+<8971> <8971> <F752>
+<8972> <8972> <C5A7>
+<8973> <8973> <F7FD>
+<8974> <8974> <F7FC>
+<8976> <8976> <F7FB>
+<8979> <897A> <F948>
+<897B> <897B> <F94B>
+<897C> <897C> <F94A>
+<897E> <897E> <CA50>
+<897F> <897F> <A6E8>
+<8981> <8981> <AD6E>
+<8982> <8982> <D7C5>
+<8983> <8983> <B5F7>
+<8985> <8985> <DFFA>
+<8986> <8986> <C2D0>
+<8988> <8988> <F2F2>
+<898B> <898B> <A8A3>
+<898F> <898F> <B357>
+<8993> <8993> <B356>
+<8995> <8995> <DBD0>
+<8996> <8996> <B5F8>
+<8997> <8997> <DBD2>
+<8998> <8998> <DBD1>
+<899B> <899B> <DFFB>
+<899C> <899C> <B8D0>
+<899D> <899D> <E443>
+<899E> <899E> <E446>
+<899F> <899F> <E445>
+<89A1> <89A1> <E444>
+<89A2> <89A2> <E7CE>
+<89A3> <89A3> <E7D0>
+<89A4> <89A4> <E7CF>
+<89A6> <89A6> <BFCC>
+<89AA> <89AA> <BFCB>
+endbfrange
+
+100 beginbfrange
+<89AC> <89AC> <C1BB>
+<89AD> <89AD> <EE79>
+<89AE> <89AE> <EE7B>
+<89AF> <89AF> <EE7A>
+<89B2> <89B2> <C2D1>
+<89B6> <89B6> <F2F4>
+<89B7> <89B7> <F2F3>
+<89B9> <89B9> <F4CC>
+<89BA> <89BA> <C4B1>
+<89BD> <89BD> <C4FD>
+<89BE> <89BE> <F754>
+<89BF> <89BF> <F753>
+<89C0> <89C0> <C65B>
+<89D2> <89D2> <A8A4>
+<89D3> <89D3> <D0AF>
+<89D4> <89D4> <AD6F>
+<89D5> <89D5> <D7C8>
+<89D6> <89D6> <D7C6>
+<89D9> <89D9> <D7C7>
+<89DA> <89DB> <DBD4>
+<89DC> <89DC> <E043>
+<89DD> <89DD> <DBD3>
+<89DF> <89DF> <DFFC>
+<89E0> <89E0> <E041>
+<89E1> <89E1> <E040>
+<89E2> <89E2> <E042>
+<89E3> <89E3> <B8D1>
+<89E4> <89E4> <DFFE>
+<89E5> <89E5> <DFFD>
+<89E6> <89E6> <E044>
+<89E8> <89E8> <E449>
+<89E9> <89E9> <E447>
+<89EB> <89EB> <E448>
+<89EC> <89EC> <E7D3>
+<89ED> <89ED> <E7D1>
+<89F0> <89F0> <E7D2>
+<89F1> <89F1> <EB7D>
+<89F2> <89F3> <EE7C>
+<89F4> <89F4> <C2D2>
+<89F6> <89F6> <F2F5>
+<89F7> <89F7> <F4CD>
+<89F8> <89F8> <C4B2>
+<89FA> <89FA> <F64C>
+<89FB> <89FB> <F755>
+<89FC> <89FC> <C5A9>
+<89FE> <89FE> <F7FE>
+<89FF> <89FF> <F94C>
+<8A00> <8A00> <A8A5>
+<8A02> <8A03> <AD71>
+<8A04> <8A04> <D0B0>
+<8A07> <8A07> <D0B1>
+<8A08> <8A08> <AD70>
+<8A0A> <8A0A> <B054>
+<8A0C> <8A0C> <B052>
+<8A0E> <8A0E> <B051>
+<8A0F> <8A0F> <B058>
+<8A10> <8A10> <B050>
+<8A11> <8A11> <B059>
+<8A12> <8A12> <D3DD>
+<8A13> <8A13> <B056>
+<8A15> <8A15> <B053>
+<8A16> <8A16> <B057>
+<8A17> <8A17> <B055>
+<8A18> <8A18> <B04F>
+<8A1B> <8A1B> <B35F>
+<8A1D> <8A1D> <B359>
+<8A1E> <8A1E> <D7CC>
+<8A1F> <8A1F> <B35E>
+<8A22> <8A22> <B360>
+<8A23> <8A23> <B35A>
+<8A25> <8A25> <B35B>
+<8A27> <8A27> <D7CA>
+<8A2A> <8A2A> <B358>
+<8A2C> <8A2C> <D7CB>
+<8A2D> <8A2D> <B35D>
+<8A30> <8A30> <D7C9>
+<8A31> <8A31> <B35C>
+<8A34> <8A34> <B644>
+<8A36> <8A36> <B646>
+<8A39> <8A39> <DBD8>
+<8A3A> <8A3A> <B645>
+<8A3B> <8A3B> <B5F9>
+<8A3C> <8A3C> <B5FD>
+<8A3E> <8A3E> <B8E4>
+<8A3F> <8A3F> <E049>
+<8A40> <8A40> <DBDA>
+<8A41> <8A41> <B5FE>
+<8A44> <8A45> <DBDD>
+<8A46> <8A46> <B643>
+<8A48> <8A48> <DBE0>
+<8A4A> <8A4A> <DBE2>
+<8A4C> <8A4C> <DBE3>
+<8A4D> <8A4D> <DBD7>
+<8A4E> <8A4E> <DBD6>
+<8A4F> <8A4F> <DBE4>
+<8A50> <8A50> <B642>
+<8A51> <8A51> <DBE1>
+<8A52> <8A52> <DBDF>
+<8A54> <8A54> <B640>
+<8A55> <8A55> <B5FB>
+endbfrange
+
+100 beginbfrange
+<8A56> <8A56> <B647>
+<8A57> <8A58> <DBDB>
+<8A59> <8A59> <DBD9>
+<8A5B> <8A5B> <B641>
+<8A5E> <8A5E> <B5FC>
+<8A60> <8A60> <B5FA>
+<8A61> <8A61> <E048>
+<8A62> <8A62> <B8DF>
+<8A63> <8A63> <B8DA>
+<8A66> <8A66> <B8D5>
+<8A68> <8A68> <B8E5>
+<8A69> <8A69> <B8D6>
+<8A6B> <8A6B> <B8D2>
+<8A6C> <8A6C> <B8E1>
+<8A6D> <8A6D> <B8DE>
+<8A6E> <8A6E> <B8E0>
+<8A70> <8A70> <B8D7>
+<8A71> <8A71> <B8DC>
+<8A72> <8A73> <B8D3>
+<8A74> <8A74> <E050>
+<8A75> <8A75> <E04D>
+<8A76> <8A76> <E045>
+<8A77> <8A77> <E04A>
+<8A79> <8A79> <B8E2>
+<8A7A> <8A7A> <E051>
+<8A7B> <8A7B> <B8E3>
+<8A7C> <8A7C> <B8D9>
+<8A7F> <8A7F> <E047>
+<8A81> <8A81> <E04F>
+<8A82> <8A82> <E04B>
+<8A83> <8A83> <E04E>
+<8A84> <8A84> <E04C>
+<8A85> <8A85> <B8DD>
+<8A86> <8A86> <E046>
+<8A87> <8A87> <B8D8>
+<8A8B> <8A8B> <E44C>
+<8A8C> <8A8C> <BB78>
+<8A8D> <8A8D> <BB7B>
+<8A8F> <8A8F> <E44E>
+<8A91> <8A91> <BBA5>
+<8A92> <8A92> <E44D>
+<8A93> <8A93> <BB7D>
+<8A95> <8A95> <BDCF>
+<8A96> <8A96> <E44F>
+<8A98> <8A98> <BBA4>
+<8A99> <8A99> <E44B>
+<8A9A> <8A9A> <BBA6>
+<8A9E> <8A9E> <BB79>
+<8AA0> <8AA0> <B8DB>
+<8AA1> <8AA1> <BB7C>
+<8AA3> <8AA3> <BB7A>
+<8AA4> <8AA4> <BB7E>
+<8AA5> <8AA5> <BBA2>
+<8AA6> <8AA6> <BB77>
+<8AA7> <8AA7> <BBA7>
+<8AA8> <8AA8> <BBA3>
+<8AAA> <8AAA> <BBA1>
+<8AAB> <8AAB> <E44A>
+<8AB0> <8AB0> <BDD6>
+<8AB2> <8AB2> <BDD2>
+<8AB6> <8AB6> <BDD9>
+<8AB8> <8AB8> <E7D6>
+<8AB9> <8AB9> <BDDA>
+<8ABA> <8ABA> <E7E2>
+<8ABB> <8ABB> <E7DB>
+<8ABC> <8ABC> <BDCB>
+<8ABD> <8ABD> <E7E3>
+<8ABE> <8ABE> <E7DD>
+<8ABF> <8ABF> <BDD5>
+<8AC0> <8AC0> <E7DE>
+<8AC2> <8AC2> <BDD4>
+<8AC3> <8AC3> <E7E1>
+<8AC4> <8AC4> <BDCE>
+<8AC5> <8AC5> <E7DF>
+<8AC6> <8AC6> <E7D5>
+<8AC7> <8AC7> <BDCD>
+<8AC8> <8AC8> <EBAA>
+<8AC9> <8AC9> <BDD3>
+<8ACB> <8ACB> <BDD0>
+<8ACD> <8ACD> <BDD8>
+<8ACF> <8ACF> <E7D4>
+<8AD1> <8AD1> <E7D8>
+<8AD2> <8AD2> <BDCC>
+<8AD3> <8AD3> <E7D7>
+<8AD4> <8AD5> <E7D9>
+<8AD6> <8AD6> <BDD7>
+<8AD7> <8AD7> <E7DC>
+<8AD8> <8AD8> <E7E0>
+<8AD9> <8AD9> <E7E4>
+<8ADB> <8ADB> <BDDB>
+<8ADC> <8ADC> <BFD2>
+<8ADD> <8ADD> <EBA5>
+<8ADE> <8ADE> <EBAB>
+<8ADF> <8ADF> <EBA8>
+<8AE0> <8AE0> <EB7E>
+<8AE1> <8AE1> <EBAC>
+<8AE2> <8AE2> <EBA1>
+<8AE4> <8AE4> <EBA7>
+<8AE6> <8AE6> <BFCD>
+<8AE7> <8AE7> <BFD3>
+endbfrange
+
+100 beginbfrange
+<8AE8> <8AE8> <EBAD>
+<8AEB> <8AEB> <BFCF>
+<8AED> <8AED> <BFD9>
+<8AEE> <8AEE> <BFD4>
+<8AEF> <8AEF> <EBAF>
+<8AF0> <8AF0> <EBA9>
+<8AF1> <8AF1> <BFD0>
+<8AF2> <8AF2> <EBA2>
+<8AF3> <8AF3> <BFDA>
+<8AF4> <8AF5> <EBA3>
+<8AF6> <8AF6> <BFDB>
+<8AF7> <8AF7> <BFD8>
+<8AF8> <8AF8> <BDD1>
+<8AFA> <8AFA> <BFCE>
+<8AFB> <8AFB> <EBB0>
+<8AFC> <8AFC> <BFDC>
+<8AFE> <8AFE> <BFD5>
+<8AFF> <8AFF> <EBAE>
+<8B00> <8B00> <BFD1>
+<8B01> <8B02> <BFD6>
+<8B04> <8B04> <C1C3>
+<8B05> <8B05> <EEA4>
+<8B06> <8B06> <EEAD>
+<8B07> <8B07> <EEAA>
+<8B08> <8B08> <EEAC>
+<8B0A> <8B0A> <C1C0>
+<8B0B> <8B0B> <EEA5>
+<8B0D> <8B0D> <EEAB>
+<8B0E> <8B0E> <C1BC>
+<8B0F> <8B0F> <EEA7>
+<8B10> <8B10> <C1C4>
+<8B11> <8B11> <EEA3>
+<8B12> <8B12> <EEA8>
+<8B13> <8B13> <EEAF>
+<8B14> <8B14> <EBA6>
+<8B15> <8B15> <EEA9>
+<8B16> <8B16> <EEA2>
+<8B17> <8B17> <C1BD>
+<8B18> <8B18> <EEA1>
+<8B19> <8B19> <C1BE>
+<8B1A> <8B1A> <EEB0>
+<8B1B> <8B1B> <C1BF>
+<8B1C> <8B1C> <EEAE>
+<8B1D> <8B1D> <C1C2>
+<8B1E> <8B1E> <EE7E>
+<8B20> <8B20> <C1C1>
+<8B22> <8B22> <EEA6>
+<8B23> <8B23> <F0DC>
+<8B24> <8B24> <F0EA>
+<8B25> <8B25> <F0E5>
+<8B26> <8B26> <F0E7>
+<8B27> <8B27> <F0DB>
+<8B28> <8B28> <C2D3>
+<8B2A> <8B2A> <F0DA>
+<8B2B> <8B2B> <C2D6>
+<8B2C> <8B2C> <C2D5>
+<8B2E> <8B2E> <F0E9>
+<8B2F> <8B2F> <F0E1>
+<8B30> <8B30> <F0DE>
+<8B31> <8B31> <F0E4>
+<8B33> <8B33> <F0DD>
+<8B35> <8B35> <F0DF>
+<8B36> <8B36> <F0E8>
+<8B37> <8B37> <F0E6>
+<8B39> <8B39> <C2D4>
+<8B3A> <8B3A> <F0ED>
+<8B3B> <8B3B> <F0EB>
+<8B3C> <8B3C> <F0E2>
+<8B3D> <8B3D> <F0EC>
+<8B3E> <8B3E> <F0E3>
+<8B40> <8B40> <F2F9>
+<8B41> <8B41> <C3CF>
+<8B42> <8B42> <F341>
+<8B45> <8B45> <F64F>
+<8B46> <8B46> <C3D6>
+<8B47> <8B47> <F0E0>
+<8B48> <8B48> <F2F7>
+<8B49> <8B49> <C3D2>
+<8B4A> <8B4A> <F2F8>
+<8B4B> <8B4B> <F2FD>
+<8B4E> <8B4F> <C3D4>
+<8B50> <8B50> <F2F6>
+<8B51> <8B51> <F340>
+<8B52> <8B52> <F342>
+<8B53> <8B53> <F2FA>
+<8B54> <8B54> <F2FC>
+<8B55> <8B55> <F2FE>
+<8B56> <8B56> <F2FB>
+<8B57> <8B57> <F343>
+<8B58> <8B58> <C3D1>
+<8B59> <8B59> <C3D7>
+<8B5A> <8B5A> <C3D3>
+<8B5C> <8B5C> <C3D0>
+<8B5D> <8B5D> <F4D0>
+<8B5F> <8B5F> <C4B7>
+<8B60> <8B60> <F4CE>
+<8B63> <8B63> <F4D2>
+<8B65> <8B65> <F4D3>
+<8B66> <8B66> <C4B5>
+<8B67> <8B67> <F4D4>
+endbfrange
+
+100 beginbfrange
+<8B68> <8B68> <F4D1>
+<8B6A> <8B6A> <F4CF>
+<8B6B> <8B6B> <C4B8>
+<8B6C> <8B6C> <C4B4>
+<8B6D> <8B6D> <F4D5>
+<8B6F> <8B6F> <C4B6>
+<8B70> <8B70> <C4B3>
+<8B74> <8B74> <C4FE>
+<8B77> <8B77> <C540>
+<8B78> <8B78> <F64E>
+<8B79> <8B79> <F64D>
+<8B7A> <8B7B> <F650>
+<8B7D> <8B7D> <C541>
+<8B7E> <8B7E> <F756>
+<8B7F> <8B7F> <F75B>
+<8B80> <8B80> <C5AA>
+<8B82> <8B82> <F758>
+<8B84> <8B84> <F757>
+<8B85> <8B85> <F75A>
+<8B86> <8B86> <F759>
+<8B88> <8B88> <F843>
+<8B8A> <8B8A> <C5DC>
+<8B8B> <8B8B> <F842>
+<8B8C> <8B8C> <F840>
+<8B8E> <8B8E> <F841>
+<8B92> <8B92> <C5FE>
+<8B93> <8B93> <C5FD>
+<8B94> <8B95> <F8C1>
+<8B96> <8B96> <C640>
+<8B98> <8B99> <F94D>
+<8B9A> <8B9A> <C667>
+<8B9C> <8B9C> <C66D>
+<8B9E> <8B9E> <F9A9>
+<8B9F> <8B9F> <F9C8>
+<8C37> <8C37> <A8A6>
+<8C39> <8C39> <D7CD>
+<8C3B> <8C3B> <D7CE>
+<8C3C> <8C3C> <E052>
+<8C3D> <8C3D> <E450>
+<8C3E> <8C3E> <E7E5>
+<8C3F> <8C3F> <C1C6>
+<8C41> <8C41> <C1C5>
+<8C42> <8C42> <F0EE>
+<8C43> <8C43> <F344>
+<8C45> <8C45> <F844>
+<8C46> <8C46> <A8A7>
+<8C47> <8C47> <D3DE>
+<8C48> <8C48> <B05A>
+<8C49> <8C49> <B361>
+<8C4A> <8C4A> <E054>
+<8C4B> <8C4B> <E053>
+<8C4C> <8C4C> <BDDC>
+<8C4D> <8C4D> <E7E6>
+<8C4E> <8C4E> <BDDD>
+<8C4F> <8C4F> <EEB1>
+<8C50> <8C50> <C2D7>
+<8C54> <8C54> <C676>
+<8C55> <8C55> <A8A8>
+<8C56> <8C56> <CDCB>
+<8C57> <8C57> <D3DF>
+<8C5A> <8C5A> <B362>
+<8C5C> <8C5D> <D7CF>
+<8C5F> <8C5F> <DBE5>
+<8C61> <8C61> <B648>
+<8C62> <8C62> <B8E6>
+<8C64> <8C64> <E056>
+<8C65> <8C65> <E055>
+<8C66> <8C66> <E057>
+<8C68> <8C69> <E451>
+<8C6A> <8C6A> <BBA8>
+<8C6B> <8C6B> <BFDD>
+<8C6C> <8C6C> <BDDE>
+<8C6D> <8C6D> <BFDE>
+<8C6F> <8C6F> <EEB5>
+<8C70> <8C70> <EEB2>
+<8C71> <8C71> <EEB4>
+<8C72> <8C72> <EEB3>
+<8C73> <8C73> <C1C7>
+<8C75> <8C75> <F0EF>
+<8C76> <8C76> <F346>
+<8C77> <8C77> <F345>
+<8C78> <8C78> <CBA4>
+<8C79> <8C79> <B05C>
+<8C7A> <8C7A> <B05B>
+<8C7B> <8C7B> <D3E0>
+<8C7D> <8C7D> <D7D1>
+<8C80> <8C80> <DBE7>
+<8C81> <8C81> <DBE6>
+<8C82> <8C82> <B649>
+<8C84> <8C85> <E059>
+<8C86> <8C86> <E058>
+<8C89> <8C89> <B8E8>
+<8C8A> <8C8A> <B8E7>
+<8C8C> <8C8C> <BBAA>
+<8C8D> <8C8D> <BBA9>
+<8C8F> <8C8F> <E7E7>
+<8C90> <8C90> <EBB3>
+<8C91> <8C92> <EBB1>
+<8C93> <8C93> <BFDF>
+<8C94> <8C94> <EEB7>
+endbfrange
+
+100 beginbfrange
+<8C95> <8C95> <EEB6>
+<8C97> <8C97> <F0F2>
+<8C98> <8C98> <F0F1>
+<8C99> <8C99> <F0F0>
+<8C9A> <8C9A> <F347>
+<8C9C> <8C9C> <F9AA>
+<8C9D> <8C9D> <A8A9>
+<8C9E> <8C9E> <AD73>
+<8CA0> <8CA0> <AD74>
+<8CA1> <8CA2> <B05D>
+<8CA3> <8CA3> <D3E2>
+<8CA4> <8CA4> <D3E1>
+<8CA5> <8CA5> <D7D2>
+<8CA7> <8CA7> <B368>
+<8CA8> <8CA8> <B366>
+<8CA9> <8CA9> <B363>
+<8CAA> <8CAA> <B367>
+<8CAB> <8CAB> <B365>
+<8CAC> <8CAC> <B364>
+<8CAF> <8CAF> <B64A>
+<8CB0> <8CB0> <DBEA>
+<8CB2> <8CB2> <B8ED>
+<8CB3> <8CB3> <B64C>
+<8CB4> <8CB4> <B651>
+<8CB5> <8CB5> <DBEC>
+<8CB6> <8CB6> <B653>
+<8CB7> <8CB7> <B652>
+<8CB8> <8CB8> <B655>
+<8CB9> <8CB9> <DBEB>
+<8CBA> <8CBA> <DBE8>
+<8CBB> <8CBB> <B64F>
+<8CBC> <8CBC> <B64B>
+<8CBD> <8CBD> <B64D>
+<8CBE> <8CBE> <DBE9>
+<8CBF> <8CBF> <B654>
+<8CC0> <8CC0> <B650>
+<8CC1> <8CC1> <B64E>
+<8CC2> <8CC2> <B8EF>
+<8CC3> <8CC3> <B8EE>
+<8CC4> <8CC4> <B8EC>
+<8CC5> <8CC5> <B8F0>
+<8CC7> <8CC8> <B8EA>
+<8CCA> <8CCA> <B8E9>
+<8CCC> <8CCC> <E05B>
+<8CCF> <8CCF> <E454>
+<8CD1> <8CD2> <BBAC>
+<8CD3> <8CD3> <BBAB>
+<8CD5> <8CD5> <E453>
+<8CD7> <8CD7> <E455>
+<8CD9> <8CD9> <E7EA>
+<8CDA> <8CDA> <E7EC>
+<8CDC> <8CDC> <BDE7>
+<8CDD> <8CDD> <E7ED>
+<8CDE> <8CDE> <BDE0>
+<8CDF> <8CDF> <E7E9>
+<8CE0> <8CE0> <BDDF>
+<8CE1> <8CE1> <BDE9>
+<8CE2> <8CE3> <BDE5>
+<8CE4> <8CE4> <BDE2>
+<8CE5> <8CE5> <E7E8>
+<8CE6> <8CE6> <BDE1>
+<8CE7> <8CE7> <E7EE>
+<8CE8> <8CE8> <E7EB>
+<8CEA> <8CEA> <BDE8>
+<8CEC> <8CED> <BDE3>
+<8CEE> <8CEE> <EBB5>
+<8CF0> <8CF0> <EBB7>
+<8CF1> <8CF1> <EBB6>
+<8CF3> <8CF3> <EBB8>
+<8CF4> <8CF4> <BFE0>
+<8CF5> <8CF5> <EBB4>
+<8CF8> <8CF8> <C1CB>
+<8CF9> <8CF9> <EEB8>
+<8CFA> <8CFA> <C1C8>
+<8CFB> <8CFB> <C1CC>
+<8CFC> <8CFC> <C1CA>
+<8CFD> <8CFD> <C1C9>
+<8CFE> <8CFE> <F0F3>
+<8D00> <8D00> <F0F6>
+<8D02> <8D02> <F0F5>
+<8D04> <8D04> <F0F4>
+<8D05> <8D05> <C2D8>
+<8D06> <8D07> <F348>
+<8D08> <8D08> <C3D8>
+<8D09> <8D09> <F34A>
+<8D0A> <8D0A> <C3D9>
+<8D0D> <8D0D> <C4BA>
+<8D0F> <8D0F> <C4B9>
+<8D10> <8D10> <F652>
+<8D13> <8D13> <C542>
+<8D14> <8D14> <F653>
+<8D15> <8D15> <F75C>
+<8D16> <8D17> <C5AB>
+<8D19> <8D19> <F845>
+<8D1B> <8D1B> <C642>
+<8D64> <8D64> <A8AA>
+<8D66> <8D66> <B36A>
+<8D67> <8D67> <B369>
+<8D68> <8D69> <E05C>
+<8D6B> <8D6B> <BBAE>
+endbfrange
+
+100 beginbfrange
+<8D6C> <8D6C> <EBB9>
+<8D6D> <8D6D> <BDEA>
+<8D6E> <8D6E> <EBBA>
+<8D6F> <8D6F> <EEB9>
+<8D70> <8D70> <A8AB>
+<8D72> <8D72> <D0B2>
+<8D73> <8D73> <AD76>
+<8D74> <8D74> <AD75>
+<8D76> <8D76> <D3E3>
+<8D77> <8D77> <B05F>
+<8D78> <8D78> <D3E4>
+<8D79> <8D79> <D7D5>
+<8D7B> <8D7B> <D7D4>
+<8D7D> <8D7D> <D7D3>
+<8D80> <8D80> <DBEE>
+<8D81> <8D81> <B658>
+<8D84> <8D84> <DBED>
+<8D85> <8D85> <B657>
+<8D89> <8D89> <DBEF>
+<8D8A> <8D8A> <B656>
+<8D8C> <8D8C> <E05F>
+<8D8D> <8D8D> <E062>
+<8D8E> <8D8F> <E060>
+<8D90> <8D90> <E065>
+<8D91> <8D91> <E05E>
+<8D92> <8D92> <E066>
+<8D93> <8D94> <E063>
+<8D95> <8D95> <BBB0>
+<8D96> <8D96> <E456>
+<8D99> <8D99> <BBAF>
+<8D9B> <8D9B> <E7F2>
+<8D9C> <8D9C> <E7F0>
+<8D9F> <8D9F> <BDEB>
+<8DA0> <8DA0> <E7EF>
+<8DA1> <8DA1> <E7F1>
+<8DA3> <8DA3> <BDEC>
+<8DA5> <8DA5> <EBBB>
+<8DA7> <8DA7> <EBBC>
+<8DA8> <8DA8> <C1CD>
+<8DAA> <8DAA> <F34C>
+<8DAB> <8DAB> <F34E>
+<8DAC> <8DAC> <F34B>
+<8DAD> <8DAD> <F34D>
+<8DAE> <8DAE> <F4D6>
+<8DAF> <8DAF> <F654>
+<8DB2> <8DB2> <F96F>
+<8DB3> <8DB3> <A8AC>
+<8DB4> <8DB4> <AD77>
+<8DB5> <8DB5> <D3E5>
+<8DB6> <8DB6> <D3E7>
+<8DB7> <8DB7> <D3E6>
+<8DB9> <8DB9> <D7D8>
+<8DBA> <8DBA> <B36C>
+<8DBC> <8DBC> <D7D6>
+<8DBE> <8DBE> <B36B>
+<8DBF> <8DBF> <D7D9>
+<8DC1> <8DC1> <D7DA>
+<8DC2> <8DC2> <D7D7>
+<8DC5> <8DC5> <DBFB>
+<8DC6> <8DC6> <B660>
+<8DC7> <8DC7> <DBF3>
+<8DC8> <8DC8> <DBF9>
+<8DCB> <8DCB> <B65B>
+<8DCC> <8DCC> <B65E>
+<8DCD> <8DCD> <DBF2>
+<8DCE> <8DCE> <B659>
+<8DCF> <8DCF> <DBF6>
+<8DD0> <8DD0> <E06C>
+<8DD1> <8DD1> <B65D>
+<8DD3> <8DD3> <DBF1>
+<8DD5> <8DD5> <DBF7>
+<8DD6> <8DD6> <DBF4>
+<8DD7> <8DD7> <DBFA>
+<8DD8> <8DD8> <DBF0>
+<8DD9> <8DD9> <DBF8>
+<8DDA> <8DDA> <B65C>
+<8DDB> <8DDB> <B65F>
+<8DDC> <8DDC> <DBF5>
+<8DDD> <8DDD> <B65A>
+<8DDF> <8DDF> <B8F2>
+<8DE0> <8DE0> <E068>
+<8DE1> <8DE1> <B8F1>
+<8DE2> <8DE2> <E06F>
+<8DE3> <8DE3> <E06E>
+<8DE4> <8DE4> <B8F8>
+<8DE6> <8DE6> <B8F9>
+<8DE7> <8DE7> <E070>
+<8DE8> <8DE8> <B8F3>
+<8DE9> <8DE9> <E06D>
+<8DEA> <8DEA> <B8F7>
+<8DEB> <8DEB> <E072>
+<8DEC> <8DEC> <E069>
+<8DEE> <8DEE> <E06B>
+<8DEF> <8DEF> <B8F4>
+<8DF0> <8DF0> <E067>
+<8DF1> <8DF1> <E06A>
+<8DF2> <8DF2> <E071>
+<8DF3> <8DF3> <B8F5>
+<8DF4> <8DF4> <E073>
+<8DFA> <8DFA> <B8F6>
+endbfrange
+
+100 beginbfrange
+<8DFC> <8DFC> <BBB1>
+<8DFD> <8DFD> <E45B>
+<8DFE> <8DFE> <E461>
+<8DFF> <8DFF> <E459>
+<8E00> <8E00> <E462>
+<8E02> <8E02> <E458>
+<8E03> <8E03> <E45D>
+<8E04> <8E04> <E463>
+<8E05> <8E05> <E460>
+<8E06> <8E06> <E45F>
+<8E07> <8E07> <E45E>
+<8E09> <8E09> <E457>
+<8E0A> <8E0A> <E45C>
+<8E0D> <8E0D> <E45A>
+<8E0F> <8E0F> <BDF1>
+<8E10> <8E10> <BDEE>
+<8E11> <8E11> <E7FB>
+<8E12> <8E12> <E841>
+<8E13> <8E13> <E843>
+<8E14> <8E14> <E840>
+<8E15> <8E15> <E7F8>
+<8E16> <8E16> <E7FA>
+<8E17> <8E17> <E845>
+<8E18> <8E18> <E842>
+<8E19> <8E19> <E7FC>
+<8E1A> <8E1A> <E846>
+<8E1B> <8E1B> <E7F9>
+<8E1C> <8E1C> <E844>
+<8E1D> <8E1D> <BDEF>
+<8E1E> <8E1E> <BDF5>
+<8E1F> <8E1F> <BDF3>
+<8E20> <8E20> <E7F3>
+<8E21> <8E21> <BDF4>
+<8E22> <8E22> <BDF0>
+<8E23> <8E23> <E7F4>
+<8E24> <8E24> <E7F6>
+<8E25> <8E25> <E7F5>
+<8E26> <8E27> <E7FD>
+<8E29> <8E29> <BDF2>
+<8E2B> <8E2B> <BDED>
+<8E2E> <8E2E> <E7F7>
+<8E30> <8E30> <EBC6>
+<8E31> <8E31> <BFE2>
+<8E33> <8E33> <EBBD>
+<8E34> <8E34> <BFE3>
+<8E35> <8E35> <BFE6>
+<8E36> <8E36> <EBC2>
+<8E38> <8E38> <EBBF>
+<8E39> <8E39> <BFE5>
+<8E3C> <8E3D> <EBC3>
+<8E3E> <8E3E> <EBBE>
+<8E3F> <8E3F> <EBC7>
+<8E40> <8E40> <EBC0>
+<8E41> <8E41> <EBC5>
+<8E42> <8E42> <BFE4>
+<8E44> <8E44> <BFE1>
+<8E45> <8E45> <EBC1>
+<8E47> <8E47> <EEBF>
+<8E48> <8E48> <C1D0>
+<8E49> <8E49> <C1CE>
+<8E4A> <8E4A> <C1D1>
+<8E4B> <8E4B> <C1CF>
+<8E4C> <8E4C> <EEBE>
+<8E4D> <8E4D> <EEBB>
+<8E4E> <8E4E> <EEBA>
+<8E50> <8E50> <EEBD>
+<8E53> <8E53> <EEBC>
+<8E54> <8E54> <F145>
+<8E55> <8E55> <C2DE>
+<8E56> <8E56> <F0FB>
+<8E57> <8E57> <F0FA>
+<8E59> <8E59> <C2D9>
+<8E5A> <8E5A> <F141>
+<8E5B> <8E5B> <F140>
+<8E5C> <8E5C> <F0F7>
+<8E5D> <8E5D> <F143>
+<8E5E> <8E5E> <F0FC>
+<8E5F> <8E5F> <C2DD>
+<8E60> <8E60> <F0F9>
+<8E61> <8E61> <F142>
+<8E62> <8E62> <F0F8>
+<8E63> <8E63> <C2DA>
+<8E64> <8E64> <C2DC>
+<8E65> <8E65> <F0FD>
+<8E66> <8E66> <C2DB>
+<8E67> <8E67> <F0FE>
+<8E69> <8E69> <F144>
+<8E6A> <8E6A> <F352>
+<8E6C> <8E6C> <C3DE>
+<8E6D> <8E6D> <F34F>
+<8E6F> <8E6F> <F353>
+<8E72> <8E72> <C3DB>
+<8E73> <8E73> <F351>
+<8E74> <8E74> <C3E0>
+<8E76> <8E76> <C3DD>
+<8E78> <8E78> <F350>
+<8E7A> <8E7A> <C3DF>
+<8E7B> <8E7B> <F354>
+<8E7C> <8E7C> <C3DA>
+<8E81> <8E81> <C4BC>
+endbfrange
+
+100 beginbfrange
+<8E82> <8E82> <C4BE>
+<8E84> <8E84> <F4D9>
+<8E85> <8E85> <C4BD>
+<8E86> <8E86> <F4D7>
+<8E87> <8E87> <C3DC>
+<8E88> <8E88> <F4D8>
+<8E89> <8E89> <C4BB>
+<8E8A> <8E8A> <C543>
+<8E8B> <8E8B> <C545>
+<8E8C> <8E8C> <F656>
+<8E8D> <8E8D> <C544>
+<8E8E> <8E8E> <F655>
+<8E90> <8E90> <F761>
+<8E91> <8E91> <C5AD>
+<8E92> <8E92> <F760>
+<8E93> <8E93> <C5AE>
+<8E94> <8E94> <F75E>
+<8E95> <8E95> <F75D>
+<8E96> <8E97> <F762>
+<8E98> <8E98> <F846>
+<8E9A> <8E9A> <F75F>
+<8E9D> <8E9D> <F8C6>
+<8E9E> <8EA0> <F8C3>
+<8EA1> <8EA1> <C65C>
+<8EA3> <8EA3> <F951>
+<8EA4> <8EA4> <F950>
+<8EA5> <8EA5> <F94F>
+<8EA6> <8EA6> <F970>
+<8EA8> <8EA8> <F9BE>
+<8EA9> <8EA9> <F9AB>
+<8EAA> <8EAA> <C66E>
+<8EAB> <8EAB> <A8AD>
+<8EAC> <8EAC> <B060>
+<8EB2> <8EB2> <B8FA>
+<8EBA> <8EBA> <BDF6>
+<8EBD> <8EBD> <EBC8>
+<8EC0> <8EC0> <C2DF>
+<8EC2> <8EC2> <F355>
+<8EC9> <8EC9> <F9AC>
+<8ECA> <8ECA> <A8AE>
+<8ECB> <8ECB> <AAEE>
+<8ECC> <8ECC> <AD79>
+<8ECD> <8ECD> <AD78>
+<8ECF> <8ECF> <B063>
+<8ED1> <8ED1> <D3E8>
+<8ED2> <8ED2> <B061>
+<8ED3> <8ED3> <D3E9>
+<8ED4> <8ED4> <B062>
+<8ED7> <8ED7> <D7DF>
+<8ED8> <8ED8> <D7DB>
+<8EDB> <8EDB> <B36D>
+<8EDC> <8EDC> <D7DE>
+<8EDD> <8EDD> <D7DD>
+<8EDE> <8EDE> <D7DC>
+<8EDF> <8EDF> <B36E>
+<8EE0> <8EE1> <D7E0>
+<8EE5> <8EE5> <DC43>
+<8EE6> <8EE6> <DC41>
+<8EE7> <8EE8> <DC45>
+<8EE9> <8EE9> <DC4C>
+<8EEB> <8EEB> <DC48>
+<8EEC> <8EEC> <DC4A>
+<8EEE> <8EEE> <DC42>
+<8EEF> <8EEF> <DBFC>
+<8EF1> <8EF1> <DC49>
+<8EF4> <8EF4> <DC4B>
+<8EF5> <8EF5> <DC44>
+<8EF6> <8EF6> <DC47>
+<8EF7> <8EF7> <DBFD>
+<8EF8> <8EF8> <B662>
+<8EF9> <8EF9> <DC40>
+<8EFA> <8EFA> <DBFE>
+<8EFB> <8EFB> <B661>
+<8EFC> <8EFC> <B663>
+<8EFE> <8EFE> <B8FD>
+<8EFF> <8EFF> <E075>
+<8F00> <8F00> <E077>
+<8F01> <8F01> <E076>
+<8F02> <8F02> <E07B>
+<8F03> <8F03> <B8FB>
+<8F05> <8F05> <E078>
+<8F06> <8F06> <E074>
+<8F07> <8F08> <E079>
+<8F09> <8F09> <B8FC>
+<8F0A> <8F0A> <B8FE>
+<8F0B> <8F0B> <E07C>
+<8F0D> <8F0D> <E467>
+<8F0E> <8F0E> <E466>
+<8F10> <8F11> <E464>
+<8F12> <8F12> <BBB3>
+<8F13> <8F13> <BBB5>
+<8F14> <8F14> <BBB2>
+<8F15> <8F15> <BBB4>
+<8F16> <8F17> <E84D>
+<8F18> <8F18> <E849>
+<8F1A> <8F1A> <E84A>
+<8F1B> <8F1B> <BDF8>
+<8F1C> <8F1C> <BDFD>
+<8F1D> <8F1D> <BDF7>
+<8F1E> <8F1E> <BDFE>
+endbfrange
+
+100 beginbfrange
+<8F1F> <8F1F> <BDF9>
+<8F20> <8F20> <E84B>
+<8F23> <8F23> <E84C>
+<8F24> <8F24> <E848>
+<8F25> <8F25> <BE40>
+<8F26> <8F26> <BDFB>
+<8F29> <8F29> <BDFA>
+<8F2A> <8F2A> <BDFC>
+<8F2C> <8F2C> <E847>
+<8F2E> <8F2E> <EBCA>
+<8F2F> <8F2F> <BFE8>
+<8F32> <8F32> <EBCC>
+<8F33> <8F33> <BFEA>
+<8F34> <8F34> <EBCF>
+<8F35> <8F35> <EBCB>
+<8F36> <8F36> <EBC9>
+<8F37> <8F37> <EBCE>
+<8F38> <8F38> <BFE9>
+<8F39> <8F39> <EBCD>
+<8F3B> <8F3B> <BFE7>
+<8F3E> <8F3E> <C1D3>
+<8F3F> <8F3F> <C1D6>
+<8F40> <8F40> <EEC1>
+<8F42> <8F42> <C1D4>
+<8F43> <8F43> <EEC0>
+<8F44> <8F44> <C1D2>
+<8F45> <8F45> <C1D5>
+<8F46> <8F48> <F146>
+<8F49> <8F49> <C2E0>
+<8F4B> <8F4B> <F149>
+<8F4D> <8F4D> <C2E1>
+<8F4E> <8F4E> <C3E2>
+<8F4F> <8F50> <F358>
+<8F51> <8F51> <F357>
+<8F52> <8F52> <F356>
+<8F53> <8F53> <F35A>
+<8F54> <8F54> <C3E1>
+<8F55> <8F55> <F4DD>
+<8F56> <8F57> <F4DB>
+<8F58> <8F58> <F4DE>
+<8F59> <8F59> <F4DA>
+<8F5A> <8F5A> <F4DF>
+<8F5B> <8F5B> <F658>
+<8F5D> <8F5D> <F659>
+<8F5E> <8F5E> <F657>
+<8F5F> <8F5F> <C546>
+<8F60> <8F60> <F764>
+<8F61> <8F61> <C5AF>
+<8F62> <8F62> <F765>
+<8F63> <8F63> <F848>
+<8F64> <8F64> <F847>
+<8F9B> <8F9B> <A8AF>
+<8F9C> <8F9C> <B664>
+<8F9F> <8F9F> <B940>
+<8FA3> <8FA3> <BBB6>
+<8FA6> <8FA6> <BFEC>
+<8FA8> <8FA8> <BFEB>
+<8FAD> <8FAD> <C3E3>
+<8FAE> <8FAE> <C47C>
+<8FAF> <8FAF> <C547>
+<8FB0> <8FB0> <A8B0>
+<8FB1> <8FB1> <B064>
+<8FB2> <8FB2> <B941>
+<8FB4> <8FB4> <F35B>
+<8FBF> <8FBF> <CBA6>
+<8FC2> <8FC2> <A8B1>
+<8FC4> <8FC4> <A8B4>
+<8FC5> <8FC5> <A8B3>
+<8FC6> <8FC6> <A8B2>
+<8FC9> <8FC9> <CBA5>
+<8FCB> <8FCB> <CDCD>
+<8FCD> <8FCD> <CDCF>
+<8FCE> <8FCE> <AAEF>
+<8FD1> <8FD1> <AAF1>
+<8FD2> <8FD2> <CDCC>
+<8FD3> <8FD3> <CDCE>
+<8FD4> <8FD4> <AAF0>
+<8FD5> <8FD5> <CDD1>
+<8FD6> <8FD6> <CDD0>
+<8FD7> <8FD7> <CDD2>
+<8FE0> <8FE0> <D0B6>
+<8FE1> <8FE1> <D0B4>
+<8FE2> <8FE2> <AD7C>
+<8FE3> <8FE3> <D0B3>
+<8FE4> <8FE4> <ADA3>
+<8FE5> <8FE5> <AD7E>
+<8FE6> <8FE6> <AD7B>
+<8FE8> <8FE8> <ADA4>
+<8FEA> <8FEA> <AD7D>
+<8FEB> <8FEB> <ADA2>
+<8FED> <8FED> <ADA1>
+<8FEE> <8FEE> <D0B5>
+<8FF0> <8FF0> <AD7A>
+<8FF4> <8FF4> <B06A>
+<8FF5> <8FF5> <D3EB>
+<8FF6> <8FF6> <D3F1>
+<8FF7> <8FF7> <B067>
+<8FF8> <8FF8> <B06E>
+<8FFA> <8FFA> <B069>
+<8FFB> <8FFB> <D3EE>
+endbfrange
+
+100 beginbfrange
+<8FFC> <8FFC> <D3F0>
+<8FFD> <8FFD> <B06C>
+<8FFE> <8FFE> <D3EA>
+<8FFF> <8FFF> <D3ED>
+<9000> <9000> <B068>
+<9001> <9001> <B065>
+<9002> <9002> <D3EC>
+<9003> <9003> <B06B>
+<9004> <9004> <D3EF>
+<9005> <9005> <B06D>
+<9006> <9006> <B066>
+<900B> <900B> <D7E3>
+<900C> <900C> <D7E6>
+<900D> <900D> <B370>
+<900F> <900F> <B37A>
+<9010> <9010> <B376>
+<9011> <9011> <D7E4>
+<9014> <9014> <B37E>
+<9015> <9015> <B377>
+<9016> <9016> <B37C>
+<9017> <9017> <B372>
+<9019> <9019> <B36F>
+<901A> <901A> <B371>
+<901B> <901B> <B37D>
+<901C> <901C> <D7E5>
+<901D> <901D> <B375>
+<901E> <901E> <B378>
+<901F> <901F> <B374>
+<9020> <9020> <B379>
+<9021> <9021> <D7E7>
+<9022> <9022> <B37B>
+<9023> <9023> <B373>
+<9024> <9024> <D7E2>
+<902D> <902D> <DC4D>
+<902E> <902E> <B665>
+<902F> <902F> <DC4F>
+<9031> <9031> <B667>
+<9032> <9032> <B669>
+<9034> <9034> <DC4E>
+<9035> <9035> <B666>
+<9036> <9036> <B66A>
+<9038> <9038> <B668>
+<903C> <903C> <B947>
+<903D> <903D> <E0A3>
+<903E> <903E> <B94F>
+<903F> <903F> <E07E>
+<9041> <9041> <B950>
+<9042> <9042> <B945>
+<9044> <9044> <E0A1>
+<9047> <9047> <B94A>
+<9049> <9049> <E0A2>
+<904A> <904A> <B943>
+<904B> <904B> <B942>
+<904D> <904D> <B94D>
+<904E> <904E> <B94C>
+<904F> <904F> <B94B>
+<9050> <9050> <B949>
+<9051> <9051> <B94E>
+<9052> <9052> <E07D>
+<9053> <9053> <B944>
+<9054> <9054> <B946>
+<9055> <9055> <B948>
+<9058> <9058> <BBB8>
+<9059> <9059> <BBBB>
+<905B> <905B> <BBBF>
+<905C> <905C> <BBB9>
+<905D> <905D> <BBBE>
+<905E> <905E> <BBBC>
+<9060> <9060> <BBB7>
+<9062> <9062> <BBBD>
+<9063> <9063> <BBBA>
+<9067> <9067> <E852>
+<9068> <9068> <BE43>
+<9069> <9069> <BE41>
+<906B> <906B> <E853>
+<906D> <906D> <BE44>
+<906E> <906E> <BE42>
+<906F> <906F> <E851>
+<9070> <9070> <E850>
+<9072> <9072> <BFF0>
+<9073> <9073> <E84F>
+<9074> <9074> <BFEE>
+<9075> <9075> <BFED>
+<9076> <9076> <EBD0>
+<9077> <9077> <BE45>
+<9078> <9078> <BFEF>
+<9079> <9079> <EBD1>
+<907A> <907A> <BFF2>
+<907B> <907B> <EBD2>
+<907C> <907C> <BFF1>
+<907D> <907D> <C1D8>
+<907E> <907E> <EEC3>
+<907F> <907F> <C1D7>
+<9080> <9080> <C1DC>
+<9081> <9082> <C1DA>
+<9083> <9083> <C2E3>
+<9084> <9084> <C1D9>
+<9085> <9085> <EEC2>
+<9086> <9086> <EBD3>
+<9087> <9087> <C2E2>
+endbfrange
+
+100 beginbfrange
+<9088> <9088> <C2E4>
+<908A> <908B> <C3E4>
+<908D> <908D> <F4E0>
+<908F> <908F> <C5DE>
+<9090> <9090> <C5DD>
+<9091> <9091> <A8B6>
+<9094> <9094> <CA55>
+<9095> <9095> <B06F>
+<9097> <9098> <CA52>
+<9099> <9099> <CA51>
+<909B> <909B> <CA54>
+<909E> <909E> <CBAA>
+<909F> <909F> <CBA7>
+<90A0> <90A0> <CBAC>
+<90A1> <90A1> <CBA8>
+<90A2> <90A2> <A8B7>
+<90A3> <90A3> <A8BA>
+<90A5> <90A5> <CBA9>
+<90A6> <90A6> <A8B9>
+<90A7> <90A7> <CBAB>
+<90AA> <90AA> <A8B8>
+<90AF> <90AF> <CDD5>
+<90B0> <90B0> <CDD7>
+<90B1> <90B1> <AAF4>
+<90B2> <90B2> <CDD3>
+<90B3> <90B3> <CDD6>
+<90B4> <90B4> <CDD4>
+<90B5> <90B5> <AAF2>
+<90B6> <90B6> <AAF5>
+<90B8> <90B8> <AAF3>
+<90BD> <90BD> <D0B8>
+<90BE> <90BE> <D0BC>
+<90BF> <90BF> <D0B9>
+<90C1> <90C1> <ADA7>
+<90C3> <90C3> <ADA8>
+<90C5> <90C5> <D0BB>
+<90C7> <90C7> <D0BD>
+<90C8> <90C8> <D0BF>
+<90CA> <90CA> <ADA5>
+<90CB> <90CB> <D0BE>
+<90CE> <90CE> <ADA6>
+<90D4> <90D4> <D7EE>
+<90D5> <90D5> <D0BA>
+<90D6> <90D6> <D3F2>
+<90D7> <90D7> <D3FB>
+<90D8> <90D8> <D3F9>
+<90D9> <90DA> <D3F4>
+<90DB> <90DB> <D3FA>
+<90DC> <90DC> <D3FC>
+<90DD> <90DD> <B071>
+<90DF> <90DF> <D3F7>
+<90E0> <90E0> <D3F3>
+<90E1> <90E1> <B070>
+<90E2> <90E2> <B072>
+<90E3> <90E3> <D3F6>
+<90E4> <90E4> <D3FD>
+<90E5> <90E5> <D3F8>
+<90E8> <90E8> <B3A1>
+<90E9> <90E9> <D7F1>
+<90EA> <90EA> <D7E9>
+<90EB> <90EC> <D7EF>
+<90ED> <90ED> <B3A2>
+<90EF> <90EF> <D7E8>
+<90F0> <90F0> <D7EA>
+<90F1> <90F1> <D0B7>
+<90F2> <90F3> <D7EC>
+<90F4> <90F4> <D7EB>
+<90F5> <90F5> <B66C>
+<90F9> <90F9> <DC56>
+<90FA> <90FA> <EBD4>
+<90FB> <90FB> <DC57>
+<90FC> <90FC> <DC54>
+<90FD> <90FD> <B3A3>
+<90FE> <90FE> <B66E>
+<90FF> <90FF> <DC53>
+<9100> <9100> <DC59>
+<9101> <9101> <DC58>
+<9102> <9102> <B66B>
+<9103> <9103> <DC5C>
+<9104> <9104> <DC52>
+<9105> <9105> <DC5B>
+<9106> <9106> <DC50>
+<9107> <9107> <DC5A>
+<9108> <9108> <DC55>
+<9109> <9109> <B66D>
+<910B> <910B> <E0AA>
+<910D> <910D> <E0A5>
+<910E> <910E> <E0AB>
+<910F> <910F> <E0A6>
+<9110> <9110> <E0A4>
+<9111> <9111> <E0A7>
+<9112> <9112> <B951>
+<9114> <9114> <E0A9>
+<9116> <9116> <E0A8>
+<9117> <9117> <B952>
+<9118> <9118> <BBC1>
+<9119> <9119> <BBC0>
+<911A> <911A> <E46E>
+<911B> <911B> <E471>
+<911C> <911C> <E469>
+endbfrange
+
+100 beginbfrange
+<911D> <911D> <E46D>
+<911E> <911E> <BBC2>
+<911F> <911F> <E46C>
+<9120> <9120> <E46A>
+<9121> <9121> <E470>
+<9122> <9122> <E46B>
+<9123> <9123> <E468>
+<9124> <9124> <E46F>
+<9126> <9126> <E859>
+<9127> <9127> <BE48>
+<9128> <9128> <F14A>
+<9129> <912A> <E856>
+<912B> <912B> <E855>
+<912C> <912C> <DC51>
+<912D> <912D> <BE47>
+<912E> <912E> <E85A>
+<912F> <912F> <E854>
+<9130> <9130> <BE46>
+<9131> <9131> <BE49>
+<9132> <9132> <E858>
+<9133> <9133> <EBD5>
+<9134> <9134> <BFF3>
+<9135> <9136> <EBD6>
+<9138> <9138> <EEC4>
+<9139> <9139> <C1DD>
+<913A> <913B> <F14B>
+<913E> <913E> <F14D>
+<913F> <913F> <F35D>
+<9140> <9140> <F35C>
+<9141> <9141> <F4E2>
+<9143> <9143> <F4E1>
+<9144> <9145> <F65B>
+<9146> <9146> <F65A>
+<9147> <9147> <F766>
+<9148> <9148> <C5B0>
+<9149> <9149> <A8BB>
+<914A> <914A> <ADAA>
+<914B> <914B> <ADA9>
+<914C> <914C> <B075>
+<914D> <914D> <B074>
+<914E> <914F> <D440>
+<9150> <9150> <D3FE>
+<9152> <9152> <B073>
+<9153> <9153> <D7F5>
+<9155> <9155> <D7F6>
+<9156> <9156> <D7F2>
+<9157> <9157> <B3A4>
+<9158> <9158> <D7F3>
+<915A> <915A> <D7F4>
+<915F> <915F> <DC5F>
+<9160> <9160> <DC61>
+<9161> <9161> <DC5D>
+<9162> <9162> <DC60>
+<9163> <9163> <B66F>
+<9164> <9164> <DC5E>
+<9165> <9165> <B670>
+<9168> <9168> <DD73>
+<9169> <9169> <B955>
+<916A> <916A> <B954>
+<916C> <916C> <B953>
+<916E> <916F> <E0AC>
+<9172> <9172> <E473>
+<9173> <9173> <E475>
+<9174> <9174> <BBC6>
+<9175> <9175> <BBC3>
+<9177> <9177> <BBC5>
+<9178> <9178> <BBC4>
+<9179> <9179> <E474>
+<917A> <917A> <E472>
+<9180> <9180> <E861>
+<9181> <9182> <E85E>
+<9183> <9183> <BE4D>
+<9184> <9184> <E860>
+<9185> <9186> <E85B>
+<9187> <9187> <BE4A>
+<9189> <9189> <BE4B>
+<918A> <918A> <E85D>
+<918B> <918B> <BE4C>
+<918D> <918D> <EBDB>
+<918F> <918F> <EBDC>
+<9190> <9191> <EBD9>
+<9192> <9192> <BFF4>
+<9193> <9193> <EBD8>
+<9199> <9199> <EEC8>
+<919A> <919A> <EEC5>
+<919B> <919B> <EEC7>
+<919C> <919C> <C1E0>
+<919D> <919D> <EECB>
+<919E> <919E> <C1DF>
+<919F> <919F> <EEC9>
+<91A0> <91A0> <EECC>
+<91A1> <91A1> <EECA>
+<91A2> <91A2> <EEC6>
+<91A3> <91A3> <C1DE>
+<91A5> <91A5> <F14F>
+<91A7> <91A7> <F150>
+<91A8> <91A8> <F14E>
+<91AA> <91AA> <F152>
+<91AB> <91AC> <C2E5>
+<91AD> <91AD> <F35F>
+endbfrange
+
+100 beginbfrange
+<91AE> <91AE> <C3E7>
+<91AF> <91AF> <F151>
+<91B0> <91B0> <F35E>
+<91B1> <91B1> <C3E6>
+<91B2> <91B3> <F4E5>
+<91B4> <91B4> <C4BF>
+<91B5> <91B5> <F4E4>
+<91B7> <91B7> <F4E3>
+<91B9> <91B9> <F65D>
+<91BA> <91BA> <C548>
+<91BC> <91BC> <F849>
+<91BD> <91BD> <F8C8>
+<91BE> <91BE> <F8C7>
+<91C0> <91C0> <C643>
+<91C1> <91C1> <C65D>
+<91C2> <91C2> <F8C9>
+<91C3> <91C3> <F971>
+<91C5> <91C5> <C66F>
+<91C6> <91C6> <A8BC>
+<91C7> <91C7> <AAF6>
+<91C9> <91C9> <B956>
+<91CB> <91CB> <C4C0>
+<91CC> <91CC> <A8BD>
+<91CD> <91CD> <ADAB>
+<91CE> <91CE> <B3A5>
+<91CF> <91CF> <B671>
+<91D0> <91D0> <C2E7>
+<91D1> <91D1> <AAF7>
+<91D3> <91D3> <D0C1>
+<91D4> <91D4> <D0C0>
+<91D5> <91D5> <D442>
+<91D7> <91D7> <B078>
+<91D8> <91D8> <B076>
+<91D9> <91D9> <B07A>
+<91DA> <91DA> <D444>
+<91DC> <91DC> <B079>
+<91DD> <91DD> <B077>
+<91E2> <91E2> <D443>
+<91E3> <91E3> <B3A8>
+<91E4> <91E4> <D7FC>
+<91E6> <91E6> <B3A7>
+<91E7> <91E7> <B3A9>
+<91E8> <91E8> <D842>
+<91E9> <91E9> <B3AB>
+<91EA> <91EA> <D7FE>
+<91EB> <91EB> <D840>
+<91EC> <91EC> <D7F7>
+<91ED> <91ED> <B3AA>
+<91EE> <91EE> <D843>
+<91F1> <91F1> <D7F9>
+<91F3> <91F3> <D7FA>
+<91F4> <91F4> <D7F8>
+<91F5> <91F5> <B3A6>
+<91F7> <91F7> <D841>
+<91F8> <91F8> <D7FB>
+<91F9> <91F9> <D7FD>
+<91FD> <91FD> <DC6D>
+<91FF> <91FF> <DC6C>
+<9200> <9200> <DC6A>
+<9201> <9201> <DC62>
+<9202> <9202> <DC71>
+<9203> <9203> <DC65>
+<9204> <9204> <DC6F>
+<9205> <9205> <DC76>
+<9206> <9206> <DC6E>
+<9207> <9207> <B679>
+<9209> <9209> <B675>
+<920A> <920A> <DC63>
+<920C> <920C> <DC69>
+<920D> <920D> <B677>
+<920F> <920F> <DC68>
+<9210> <9210> <B678>
+<9211> <9211> <B67A>
+<9212> <9212> <DC6B>
+<9214> <9215> <B672>
+<9216> <9216> <DC77>
+<9217> <9217> <DC75>
+<9219> <9219> <DC74>
+<921A> <921A> <DC66>
+<921C> <921C> <DC72>
+<921E> <921E> <B676>
+<9223> <9223> <B674>
+<9224> <9224> <DC73>
+<9225> <9225> <DC64>
+<9226> <9226> <DC67>
+<9227> <9227> <DC70>
+<922D> <922D> <E4BA>
+<922E> <922E> <E0B7>
+<9230> <9230> <E0B0>
+<9231> <9231> <E0C3>
+<9232> <9232> <E0CC>
+<9233> <9233> <E0B3>
+<9234> <9234> <B961>
+<9236> <9236> <E0C0>
+<9237> <9237> <B957>
+<9238> <9238> <B959>
+<9239> <9239> <B965>
+<923A> <923A> <E0B1>
+<923D> <923D> <B95A>
+<923E> <923E> <B95C>
+endbfrange
+
+100 beginbfrange
+<923F> <923F> <B966>
+<9240> <9240> <B95B>
+<9245> <9245> <B964>
+<9246> <9246> <E0B9>
+<9248> <9248> <E0AE>
+<9249> <9249> <B962>
+<924A> <924A> <E0B8>
+<924B> <924B> <B95E>
+<924C> <924C> <E0CA>
+<924D> <924D> <B963>
+<924E> <924E> <E0C8>
+<924F> <924F> <E0BC>
+<9250> <9250> <E0C6>
+<9251> <9251> <B960>
+<9252> <9252> <E0AF>
+<9253> <9253> <E0C9>
+<9254> <9254> <E0C4>
+<9256> <9256> <E0CB>
+<9257> <9257> <B958>
+<925A> <925A> <B967>
+<925B> <925B> <B95D>
+<925E> <925E> <E0B5>
+<9260> <9260> <E0BD>
+<9261> <9261> <E0C1>
+<9263> <9263> <E0C5>
+<9264> <9264> <B95F>
+<9265> <9265> <E0B4>
+<9266> <9266> <E0B2>
+<9267> <9267> <E0BE>
+<926C> <926C> <E0BB>
+<926D> <926D> <E0BA>
+<926F> <926F> <E0BF>
+<9270> <9270> <E0C2>
+<9272> <9272> <E0C7>
+<9276> <9276> <E478>
+<9278> <9278> <BBC7>
+<9279> <9279> <E4A4>
+<927A> <927A> <E47A>
+<927B> <927B> <BBCC>
+<927C> <927C> <BBD0>
+<927D> <927D> <E4AD>
+<927E> <927E> <E4B5>
+<927F> <927F> <E4A6>
+<9280> <9280> <BBC8>
+<9282> <9282> <E4AA>
+<9283> <9283> <E0B6>
+<9285> <9285> <BBC9>
+<9286> <9286> <E4B1>
+<9287> <9287> <E4B6>
+<9288> <9288> <E4AE>
+<928A> <928A> <E4B0>
+<928B> <928B> <E4B9>
+<928C> <928C> <E4B2>
+<928D> <928D> <E47E>
+<928E> <928E> <E4A9>
+<9291> <9291> <BBD1>
+<9293> <9293> <BBCD>
+<9294> <9294> <E47C>
+<9295> <9295> <E4AB>
+<9296> <9296> <BBCB>
+<9297> <9297> <E4A5>
+<9298> <9298> <BBCA>
+<9299> <9299> <E4B3>
+<929A> <929A> <E4A2>
+<929B> <929B> <E479>
+<929C> <929C> <BBCE>
+<929D> <929D> <E4B8>
+<92A0> <92A0> <E47B>
+<92A1> <92A1> <E4AF>
+<92A2> <92A2> <E4AC>
+<92A3> <92A3> <E4A7>
+<92A4> <92A4> <E477>
+<92A5> <92A5> <E476>
+<92A6> <92A6> <E4A1>
+<92A7> <92A7> <E4B4>
+<92A8> <92A8> <BBCF>
+<92A9> <92A9> <E4B7>
+<92AA> <92AA> <E47D>
+<92AB> <92AB> <E4A3>
+<92AC> <92AC> <BE52>
+<92B2> <92B2> <BE5A>
+<92B3> <92B3> <BE55>
+<92B4> <92B4> <E8A4>
+<92B5> <92B5> <E8A1>
+<92B6> <92B6> <E867>
+<92B7> <92B7> <BE50>
+<92BB> <92BB> <BE4F>
+<92BC> <92BC> <BE56>
+<92C0> <92C0> <E865>
+<92C1> <92C1> <BE54>
+<92C2> <92C2> <E871>
+<92C3> <92C4> <E863>
+<92C5> <92C5> <BE4E>
+<92C6> <92C6> <E8A3>
+<92C7> <92C7> <BE58>
+<92C8> <92C8> <E874>
+<92C9> <92C9> <E879>
+<92CA> <92CA> <E873>
+<92CB> <92CB> <EBEE>
+<92CC> <92CC> <E86F>
+endbfrange
+
+100 beginbfrange
+<92CD> <92CD> <E877>
+<92CE> <92CE> <E875>
+<92CF> <92CF> <E868>
+<92D0> <92D0> <E862>
+<92D1> <92D1> <E87D>
+<92D2> <92D2> <BE57>
+<92D3> <92D3> <E87E>
+<92D5> <92D5> <E878>
+<92D7> <92D7> <E86D>
+<92D8> <92D8> <E86B>
+<92D9> <92D9> <E866>
+<92DD> <92DD> <E86E>
+<92DE> <92DE> <E87B>
+<92DF> <92DF> <E86A>
+<92E0> <92E0> <E87A>
+<92E1> <92E1> <E8A2>
+<92E4> <92E4> <BE53>
+<92E6> <92E6> <E876>
+<92E7> <92E7> <E87C>
+<92E8> <92E8> <E872>
+<92E9> <92E9> <E86C>
+<92EA> <92EA> <BE51>
+<92EE> <92EE> <E4A8>
+<92EF> <92EF> <E870>
+<92F0> <92F0> <BE59>
+<92F1> <92F1> <E869>
+<92F7> <92F7> <EBF4>
+<92F8> <92F8> <BFF7>
+<92F9> <92F9> <EBF3>
+<92FA> <92FA> <EBF0>
+<92FB> <92FB> <EC44>
+<92FC> <92FC> <BFFB>
+<92FE> <92FE> <EC41>
+<92FF> <92FF> <EBF8>
+<9300> <9300> <EC43>
+<9301> <9301> <EBE9>
+<9302> <9302> <EBF6>
+<9304> <9304> <BFFD>
+<9306> <9306> <EBE1>
+<9308> <9308> <EBDF>
+<9309> <9309> <EC42>
+<930B> <930B> <EC40>
+<930C> <930C> <EBFE>
+<930D> <930D> <EBED>
+<930E> <930E> <EBEC>
+<930F> <930F> <EBE2>
+<9310> <9310> <C040>
+<9312> <9312> <EBE8>
+<9313> <9313> <EBF2>
+<9314> <9314> <EBFD>
+<9315> <9315> <C043>
+<9316> <9316> <EC45>
+<9318> <9318> <C1E8>
+<9319> <9319> <C045>
+<931A> <931A> <BFFE>
+<931B> <931B> <EBE6>
+<931D> <931D> <EBEF>
+<931E> <931E> <EBDE>
+<931F> <931F> <EBE0>
+<9320> <9320> <BFF5>
+<9321> <9321> <C042>
+<9322> <9322> <BFFA>
+<9323> <9323> <EBE7>
+<9324> <9324> <EBF7>
+<9325> <9325> <EBF1>
+<9326> <9326> <C041>
+<9327> <9327> <EBDD>
+<9328> <9328> <C1E3>
+<9329> <9329> <EBF9>
+<932A> <932A> <EBFC>
+<932B> <932B> <BFFC>
+<932D> <932D> <EBEB>
+<932E> <932E> <C044>
+<932F> <932F> <BFF9>
+<9333> <9333> <BFF8>
+<9334> <9334> <EBF5>
+<9335> <9335> <EBFB>
+<9336> <9336> <BFF6>
+<9338> <9338> <EBE4>
+<9339> <9339> <EBFA>
+<933C> <933C> <EBE5>
+<9346> <9346> <EBEA>
+<9347> <9347> <EED2>
+<9349> <9349> <EED7>
+<934A> <934A> <C1E5>
+<934B> <934B> <C1E7>
+<934C> <934C> <EEDD>
+<934D> <934D> <C1E1>
+<934E> <934E> <EEEC>
+<934F> <934F> <EEE3>
+<9350> <9351> <EED8>
+<9352> <9352> <EEE2>
+<9354> <9354> <C1EE>
+<9355> <9355> <EEE1>
+<9356> <9356> <EED1>
+<9357> <9357> <EEE0>
+<9358> <9358> <EED4>
+<9359> <9359> <EEED>
+<935A> <935A> <C1ED>
+<935B> <935B> <C1EB>
+endbfrange
+
+100 beginbfrange
+<935C> <935C> <EED5>
+<935E> <935E> <EEE8>
+<9360> <9360> <EEDA>
+<9361> <9361> <EEE7>
+<9363> <9363> <EEE9>
+<9364> <9364> <EED0>
+<9365> <9365> <C1E6>
+<9367> <9367> <EEEA>
+<936A> <936A> <EEDE>
+<936C> <936C> <C1EA>
+<936D> <936D> <EEDB>
+<9370> <9370> <C1EC>
+<9371> <9371> <EEE4>
+<9375> <9375> <C1E4>
+<9376> <9376> <EED6>
+<9377> <9377> <EEE5>
+<9379> <9379> <EEDF>
+<937A> <937A> <EBE3>
+<937B> <937B> <EEE6>
+<937C> <937C> <EED3>
+<937E> <937E> <C1E9>
+<9380> <9380> <EEEB>
+<9382> <9382> <C1E2>
+<9383> <9383> <EECE>
+<9388> <9388> <F160>
+<9389> <9389> <F159>
+<938A> <938A> <C2E9>
+<938C> <938C> <F154>
+<938D> <938D> <F163>
+<938E> <938E> <F15B>
+<938F> <938F> <EEDC>
+<9391> <9391> <F165>
+<9392> <9392> <F155>
+<9394> <9394> <C2E8>
+<9395> <9395> <F15F>
+<9396> <9396> <C2EA>
+<9397> <9397> <C2F2>
+<9398> <9398> <C2F0>
+<9399> <9399> <F161>
+<939A> <939A> <C2F1>
+<939B> <939B> <F157>
+<939D> <939D> <F158>
+<939E> <939E> <F15D>
+<939F> <939F> <F162>
+<93A1> <93A1> <EECD>
+<93A2> <93A2> <C2EB>
+<93A3> <93A3> <F16A>
+<93A4> <93A4> <F167>
+<93A5> <93A5> <F16B>
+<93A6> <93A6> <F15E>
+<93A7> <93A7> <F15A>
+<93A8> <93A8> <F168>
+<93A9> <93A9> <F36A>
+<93AA> <93AA> <F15C>
+<93AC> <93AC> <C2EE>
+<93AE> <93AE> <C2ED>
+<93AF> <93AF> <EECF>
+<93B0> <93B0> <C2EF>
+<93B1> <93B1> <F164>
+<93B2> <93B2> <F166>
+<93B3> <93B3> <C2EC>
+<93B4> <93B4> <F169>
+<93B5> <93B5> <F153>
+<93B7> <93B7> <F156>
+<93C0> <93C0> <F373>
+<93C2> <93C2> <F363>
+<93C3> <93C3> <C3EB>
+<93C4> <93C4> <F371>
+<93C7> <93C7> <F361>
+<93C8> <93C8> <C3EC>
+<93CA> <93CA> <F36C>
+<93CC> <93CC> <F368>
+<93CD> <93CD> <C3F1>
+<93CE> <93CE> <F372>
+<93CF> <93CF> <F362>
+<93D0> <93D0> <F365>
+<93D1> <93D1> <C3E9>
+<93D2> <93D2> <F374>
+<93D4> <93D4> <F36D>
+<93D5> <93D5> <F370>
+<93D6> <93D6> <C3EF>
+<93D7> <93D7> <C3F4>
+<93D8> <93D8> <C3F2>
+<93D9> <93D9> <F369>
+<93DA> <93DA> <F364>
+<93DC> <93DD> <C3ED>
+<93DE> <93DE> <F360>
+<93DF> <93DF> <C3EA>
+<93E1> <93E1> <C3E8>
+<93E2> <93E2> <C3F0>
+<93E3> <93E3> <F36F>
+<93E4> <93E4> <C3F3>
+<93E6> <93E6> <F36B>
+<93E7> <93E7> <F375>
+<93E8> <93E8> <C3F5>
+<93EC> <93EC> <F367>
+<93EE> <93EE> <F36E>
+<93F5> <93F5> <F4F3>
+<93F6> <93F6> <F542>
+<93F7> <93F7> <F4F5>
+endbfrange
+
+100 beginbfrange
+<93F8> <93F8> <F4FC>
+<93F9> <93F9> <F366>
+<93FA> <93FA> <F4FA>
+<93FB> <93FB> <F4E9>
+<93FC> <93FC> <F540>
+<93FD> <93FD> <C4C3>
+<93FE> <93FE> <F4ED>
+<93FF> <93FF> <F4FE>
+<9400> <9400> <F4F4>
+<9403> <9403> <C4C2>
+<9406> <9406> <F544>
+<9407> <9407> <F4F6>
+<9409> <9409> <F4FB>
+<940A> <940A> <F4FD>
+<940B> <940B> <F4E7>
+<940C> <940C> <F541>
+<940D> <940D> <F4F2>
+<940E> <940E> <F4F7>
+<940F> <940F> <F4EB>
+<9410> <9410> <F4EF>
+<9411> <9411> <F543>
+<9412> <9412> <F4F9>
+<9413> <9413> <F4E8>
+<9414> <9414> <F4EC>
+<9415> <9415> <F4EE>
+<9416> <9416> <F4F8>
+<9418> <9418> <C4C1>
+<9419> <9419> <F4F1>
+<9420> <9420> <F4EA>
+<9428> <9428> <F4F0>
+<9429> <9429> <F661>
+<942A> <942A> <F666>
+<942B> <942B> <C54F>
+<942C> <942C> <F668>
+<942E> <942E> <C549>
+<9430> <9430> <F664>
+<9431> <9431> <F66A>
+<9432> <9432> <C54E>
+<9433> <9433> <C54A>
+<9435> <9435> <C54B>
+<9436> <9436> <F660>
+<9437> <9437> <F667>
+<9438> <9438> <C54D>
+<9439> <9439> <F665>
+<943A> <943A> <C54C>
+<943B> <943B> <F65F>
+<943C> <943C> <F663>
+<943D> <943D> <F662>
+<943F> <943F> <F65E>
+<9440> <9440> <F669>
+<9444> <9444> <C5B1>
+<9445> <9445> <F76D>
+<9446> <9446> <F770>
+<9447> <9447> <F76C>
+<9448> <9449> <F76E>
+<944A> <944B> <F769>
+<944C> <944C> <F767>
+<944F> <944F> <F76B>
+<9450> <9450> <F768>
+<9451> <9452> <C5B2>
+<9455> <9455> <F84B>
+<9457> <9457> <F84D>
+<945D> <945D> <F84C>
+<945E> <945E> <F84E>
+<9460> <9460> <C5E0>
+<9462> <9462> <F84A>
+<9463> <9463> <C5DF>
+<9464> <9464> <C5E1>
+<9468> <9469> <F8CB>
+<946A> <946A> <C644>
+<946B> <946B> <F8CA>
+<946D> <946D> <F953>
+<946E> <946E> <F952>
+<946F> <946F> <F954>
+<9470> <9470> <C65F>
+<9471> <9471> <F955>
+<9472> <9472> <C65E>
+<9473> <9473> <F956>
+<9474> <9474> <F972>
+<9475> <9475> <F975>
+<9476> <9476> <F974>
+<9477> <9477> <C668>
+<9478> <9478> <F973>
+<947C> <947C> <C672>
+<947D> <947E> <C670>
+<947F> <947F> <C677>
+<9480> <9481> <F9C0>
+<9482> <9482> <F9BF>
+<9483> <9483> <F9C9>
+<9577> <9577> <AAF8>
+<957A> <957A> <D844>
+<957B> <957B> <DC78>
+<957C> <957C> <E8A5>
+<957D> <957D> <F376>
+<9580> <9580> <AAF9>
+<9582> <9582> <ADAC>
+<9583> <9583> <B07B>
+<9586> <9586> <D845>
+<9588> <9588> <D846>
+<9589> <9589> <B3AC>
+endbfrange
+
+100 beginbfrange
+<958B> <958B> <B67D>
+<958C> <958C> <DC7A>
+<958D> <958D> <DC79>
+<958E> <958E> <B6A3>
+<958F> <958F> <B67C>
+<9590> <9590> <DC7B>
+<9591> <9591> <B67E>
+<9592> <9592> <B6A2>
+<9593> <9593> <B6A1>
+<9594> <9594> <B67B>
+<9598> <9598> <B968>
+<959B> <959B> <E0D0>
+<959C> <959C> <E0CE>
+<959E> <959E> <E0CF>
+<959F> <959F> <E0CD>
+<95A1> <95A1> <BBD2>
+<95A3> <95A3> <BBD5>
+<95A4> <95A4> <BBD7>
+<95A5> <95A5> <BBD6>
+<95A8> <95A9> <BBD3>
+<95AB> <95AB> <E8A7>
+<95AC> <95AC> <E8A6>
+<95AD> <95AD> <BE5B>
+<95AE> <95AE> <E8A8>
+<95B0> <95B0> <E8A9>
+<95B1> <95B1> <BE5C>
+<95B5> <95B5> <EC4D>
+<95B6> <95B6> <EC4B>
+<95B7> <95B7> <EEF3>
+<95B9> <95BA> <EC49>
+<95BB> <95BB> <C046>
+<95BC> <95BC> <EC46>
+<95BD> <95BD> <EC4E>
+<95BE> <95BE> <EC48>
+<95BF> <95BF> <EC4C>
+<95C0> <95C0> <EEEF>
+<95C3> <95C3> <EEF1>
+<95C5> <95C5> <EEF2>
+<95C6> <95C6> <C1F3>
+<95C7> <95C7> <EEEE>
+<95C8> <95C8> <C1F2>
+<95C9> <95C9> <EEF0>
+<95CA> <95CC> <C1EF>
+<95CD> <95CD> <EC47>
+<95D0> <95D0> <C2F5>
+<95D1> <95D1> <F16E>
+<95D2> <95D3> <F16C>
+<95D4> <95D4> <C2F3>
+<95D5> <95D5> <C2F6>
+<95D6> <95D6> <C2F4>
+<95DA> <95DB> <F377>
+<95DC> <95DC> <C3F6>
+<95DE> <95DE> <F545>
+<95DF> <95DF> <F547>
+<95E0> <95E0> <F546>
+<95E1> <95E1> <C4C4>
+<95E2> <95E2> <C550>
+<95E3> <95E3> <F66D>
+<95E4> <95E4> <F66C>
+<95E5> <95E5> <F66B>
+<961C> <961C> <AAFA>
+<961E> <961E> <C9AA>
+<9620> <9620> <CA58>
+<9621> <9621> <A6E9>
+<9622> <9622> <CA56>
+<9623> <9623> <CA59>
+<9624> <9624> <CA57>
+<9628> <9628> <CBAE>
+<962A> <962A> <A8C1>
+<962C> <962C> <A8C2>
+<962D> <962D> <CBB0>
+<962E> <962E> <A8BF>
+<962F> <962F> <CBAF>
+<9630> <9630> <CBAD>
+<9631> <9631> <A8C0>
+<9632> <9632> <A8BE>
+<9639> <9639> <CDD8>
+<963A> <963A> <CDDB>
+<963B> <963B> <AAFD>
+<963C> <963C> <CDDA>
+<963D> <963D> <CDD9>
+<963F> <963F> <AAFC>
+<9640> <9640> <AAFB>
+<9642> <9642> <AB40>
+<9643> <9643> <CDDC>
+<9644> <9644> <AAFE>
+<964A> <964A> <D0C6>
+<964B> <964D> <ADAE>
+<964E> <964E> <D0C7>
+<964F> <964F> <D0C3>
+<9650> <9650> <ADAD>
+<9651> <9651> <D0C4>
+<9653> <9653> <D0C5>
+<9654> <9654> <D0C2>
+<9658> <9658> <B0A4>
+<965B> <965B> <B0A1>
+<965C> <965C> <D445>
+<965D> <965D> <B0A2>
+<965E> <965E> <B0A5>
+<965F> <965F> <D446>
+endbfrange
+
+100 beginbfrange
+<9661> <9661> <B07E>
+<9662> <9663> <B07C>
+<9664> <9664> <B0A3>
+<966A> <966A> <B3AD>
+<966B> <966B> <D849>
+<966C> <966C> <B3B5>
+<966D> <966D> <D848>
+<966F> <966F> <D84B>
+<9670> <9670> <B3B1>
+<9671> <9671> <D84A>
+<9672> <9672> <B6AB>
+<9673> <9673> <B3AF>
+<9674> <9674> <B3B2>
+<9675> <9675> <B3AE>
+<9676> <9677> <B3B3>
+<9678> <9678> <B3B0>
+<967C> <967C> <D847>
+<967D> <967D> <B6A7>
+<967E> <967E> <DC7D>
+<9680> <9680> <DCA3>
+<9683> <9683> <DCA2>
+<9684> <9684> <B6AC>
+<9685> <9686> <B6A8>
+<9687> <9687> <DC7C>
+<9688> <9688> <DC7E>
+<9689> <9689> <DCA1>
+<968A> <968A> <B6A4>
+<968B> <968B> <B6A6>
+<968D> <968D> <B6AA>
+<968E> <968E> <B6A5>
+<9691> <9691> <E0D3>
+<9692> <9693> <E0D1>
+<9694> <9695> <B96A>
+<9697> <9697> <E0D4>
+<9698> <9698> <B969>
+<9699> <9699> <BBD8>
+<969B> <969B> <BBDA>
+<969C> <969C> <BBD9>
+<969E> <969E> <E4BB>
+<96A1> <96A1> <E4BC>
+<96A2> <96A2> <E8AB>
+<96A4> <96A4> <E8AA>
+<96A7> <96A8> <C047>
+<96A9> <96A9> <EC4F>
+<96AA> <96AA> <C049>
+<96AC> <96AC> <EEF6>
+<96AE> <96AE> <EEF4>
+<96B0> <96B0> <EEF5>
+<96B1> <96B1> <C1F4>
+<96B3> <96B3> <F16F>
+<96B4> <96B4> <C3F7>
+<96B8> <96B8> <C1F5>
+<96B9> <96B9> <AB41>
+<96BB> <96BB> <B0A6>
+<96BC> <96BC> <D447>
+<96BF> <96BF> <D84C>
+<96C0> <96C0> <B3B6>
+<96C1> <96C1> <B6AD>
+<96C2> <96C2> <DCA4>
+<96C3> <96C3> <DCA6>
+<96C4> <96C4> <B6AF>
+<96C5> <96C5> <B6AE>
+<96C6> <96C7> <B6B0>
+<96C8> <96C8> <DCA5>
+<96C9> <96CA> <B96E>
+<96CB> <96CB> <B96D>
+<96CC> <96CC> <BBDB>
+<96CD> <96CD> <B96C>
+<96CE> <96CE> <E0D5>
+<96D2> <96D2> <BBDC>
+<96D3> <96D3> <E8AC>
+<96D4> <96D4> <EC50>
+<96D5> <96D5> <C04A>
+<96D6> <96D6> <C1F6>
+<96D7> <96D7> <F170>
+<96D8> <96D8> <F174>
+<96D9> <96D9> <C2F9>
+<96DA> <96DA> <F171>
+<96DB> <96DB> <C2FA>
+<96DC> <96DC> <C2F8>
+<96DD> <96DD> <F175>
+<96DE> <96DE> <C2FB>
+<96DF> <96DF> <F173>
+<96E1> <96E1> <F379>
+<96E2> <96E2> <C2F7>
+<96E3> <96E3> <C3F8>
+<96E5> <96E5> <F8CD>
+<96E8> <96E8> <AB42>
+<96E9> <96E9> <B3B8>
+<96EA> <96EA> <B3B7>
+<96EF> <96EF> <B6B2>
+<96F0> <96F0> <DCA8>
+<96F1> <96F1> <DCA7>
+<96F2> <96F2> <B6B3>
+<96F5> <96F5> <E0D9>
+<96F6> <96F6> <B973>
+<96F7> <96F7> <B970>
+<96F8> <96F8> <E0D8>
+<96F9> <96F9> <B972>
+<96FA> <96FA> <E0D6>
+endbfrange
+
+100 beginbfrange
+<96FB> <96FB> <B971>
+<96FD> <96FD> <E0D7>
+<96FF> <96FF> <E4BD>
+<9700> <9700> <BBDD>
+<9702> <9702> <E8AF>
+<9704> <9704> <BE5D>
+<9705> <9705> <E8AD>
+<9706> <9707> <BE5E>
+<9708> <9708> <E8AE>
+<9709> <9709> <BE60>
+<970B> <970B> <EC51>
+<970D> <970D> <C04E>
+<970E> <970E> <C04B>
+<970F> <970F> <C050>
+<9710> <9710> <EC53>
+<9711> <9711> <C04C>
+<9712> <9712> <EC52>
+<9713> <9713> <C04F>
+<9716> <9716> <C04D>
+<9718> <9718> <EEF9>
+<9719> <9719> <EEFB>
+<971C> <971C> <C1F7>
+<971D> <971D> <EEFA>
+<971E> <971E> <C1F8>
+<971F> <971F> <EEF8>
+<9720> <9720> <EEF7>
+<9722> <9722> <F177>
+<9723> <9723> <F176>
+<9724> <9724> <C2FC>
+<9725> <9725> <F178>
+<9726> <9726> <F37E>
+<9727> <9727> <C3FA>
+<9728> <9728> <F37D>
+<9729> <9729> <F37A>
+<972A> <972A> <C3F9>
+<972B> <972C> <F37B>
+<972E> <972F> <F548>
+<9730> <9730> <C4C5>
+<9732> <9732> <C553>
+<9735> <9735> <F66E>
+<9738> <9739> <C551>
+<973A> <973A> <F66F>
+<973D> <973E> <C5B4>
+<973F> <973F> <F771>
+<9742> <9742> <C645>
+<9743> <9743> <F8CF>
+<9744> <9744> <C647>
+<9746> <9746> <F8CE>
+<9747> <9747> <F8D0>
+<9748> <9748> <C646>
+<9749> <9749> <F957>
+<974B> <974B> <F9AD>
+<9752> <9752> <AB43>
+<9756> <9756> <B974>
+<9758> <9758> <E4BE>
+<975A> <975A> <E8B0>
+<975B> <975C> <C051>
+<975E> <975E> <AB44>
+<9760> <9760> <BE61>
+<9761> <9761> <C3FB>
+<9762> <9762> <ADB1>
+<9766> <9766> <C053>
+<9768> <9768> <C5E2>
+<9769> <9769> <ADB2>
+<976A> <976A> <D84D>
+<976C> <976C> <DCA9>
+<976E> <976E> <DCAB>
+<9770> <9770> <DCAA>
+<9772> <9772> <E0DD>
+<9773> <9773> <E0DA>
+<9774> <9774> <B975>
+<9776> <9776> <B976>
+<9777> <9778> <E0DB>
+<977A> <977A> <E4C0>
+<977B> <977B> <E4C5>
+<977C> <977C> <BBDE>
+<977D> <977D> <E4BF>
+<977E> <977E> <E4C1>
+<977F> <977F> <E4C8>
+<9780> <9780> <E4C3>
+<9781> <9781> <E4C7>
+<9782> <9782> <E4C4>
+<9783> <9783> <E4C2>
+<9784> <9784> <E4C6>
+<9785> <9785> <BBDF>
+<9788> <9788> <E8B3>
+<978A> <978A> <E8B1>
+<978B> <978B> <BE63>
+<978D> <978D> <BE62>
+<978E> <978E> <E8B2>
+<978F> <978F> <BE64>
+<9794> <9794> <EC56>
+<9797> <9797> <EC55>
+<9798> <9798> <C054>
+<9799> <9799> <EC54>
+<979A> <979A> <EEFC>
+<979C> <979C> <EEFE>
+<979D> <979D> <EF41>
+<979E> <979E> <EF40>
+<97A0> <97A0> <C1F9>
+endbfrange
+
+100 beginbfrange
+<97A1> <97A1> <EEFD>
+<97A2> <97A2> <F1A1>
+<97A3> <97A3> <C2FD>
+<97A4> <97A4> <F17D>
+<97A5> <97A5> <F1A2>
+<97A6> <97A6> <C2FE>
+<97A8> <97A8> <F17B>
+<97AA> <97AA> <F17E>
+<97AB> <97AB> <F17C>
+<97AC> <97AC> <F179>
+<97AD> <97AD> <C340>
+<97AE> <97AE> <F17A>
+<97B3> <97B3> <F3A1>
+<97B6> <97B6> <F3A3>
+<97B7> <97B7> <F3A2>
+<97B9> <97B9> <F54A>
+<97BB> <97BB> <F54B>
+<97BF> <97BF> <F670>
+<97C1> <97C1> <C5B7>
+<97C3> <97C3> <C5B6>
+<97C4> <97C5> <F84F>
+<97C6> <97C6> <C648>
+<97C7> <97C7> <F8D1>
+<97C9> <97C9> <C669>
+<97CB> <97CB> <ADB3>
+<97CC> <97CC> <B6B4>
+<97CD> <97CD> <E4CA>
+<97CE> <97CE> <E4C9>
+<97CF> <97CF> <E8B5>
+<97D0> <97D0> <E8B4>
+<97D3> <97D3> <C1FA>
+<97D4> <97D4> <EF43>
+<97D5> <97D5> <EF42>
+<97D6> <97D6> <F1A5>
+<97D7> <97D7> <F1A3>
+<97D8> <97D8> <F1A6>
+<97D9> <97D9> <F1A4>
+<97DC> <97DC> <C3FC>
+<97DD> <97DF> <F3A4>
+<97E1> <97E1> <F671>
+<97E3> <97E3> <F772>
+<97E5> <97E5> <F8D2>
+<97ED> <97ED> <ADB4>
+<97F0> <97F0> <EC57>
+<97F1> <97F1> <EF44>
+<97F3> <97F3> <ADB5>
+<97F6> <97F6> <BBE0>
+<97F8> <97F8> <EC58>
+<97F9> <97F9> <C341>
+<97FA> <97FA> <F1A7>
+<97FB> <97FB> <C3FD>
+<97FD> <97FE> <F54C>
+<97FF> <97FF> <C554>
+<9800> <9800> <F851>
+<9801> <9801> <ADB6>
+<9802> <9803> <B3BB>
+<9804> <9804> <D84E>
+<9805> <9806> <B6B5>
+<9807> <9807> <DCAC>
+<9808> <9808> <B6B7>
+<980A> <980A> <B97A>
+<980C> <980C> <B97C>
+<980D> <980E> <E0DF>
+<980F> <980F> <E0DE>
+<9810> <9811> <B977>
+<9812> <9812> <B97B>
+<9813> <9813> <B979>
+<9816> <9816> <E4CB>
+<9817> <9818> <BBE1>
+<981B> <981B> <E8BC>
+<981C> <981C> <BE67>
+<981D> <981D> <E8B7>
+<981E> <981E> <E8B6>
+<9820> <9820> <E8BB>
+<9821> <9821> <BE65>
+<9824> <9824> <C05B>
+<9826> <9826> <E8B8>
+<9827> <9827> <E8BD>
+<9828> <9828> <E8BA>
+<9829> <9829> <E8B9>
+<982B> <982B> <BE66>
+<982D> <982D> <C059>
+<982F> <982F> <EC5A>
+<9830> <9830> <C055>
+<9832> <9832> <EC5B>
+<9835> <9835> <EC59>
+<9837> <9837> <C058>
+<9838> <9838> <C056>
+<9839> <9839> <C05A>
+<983B> <983B> <C057>
+<9841> <9841> <EF45>
+<9843> <9843> <EF4A>
+<9844> <9844> <EF46>
+<9845> <9845> <EF49>
+<9846> <9846> <C1FB>
+<9848> <9848> <EDD4>
+<9849> <9849> <EF48>
+<984A> <984A> <EF47>
+<984C> <984C> <C344>
+<984D> <984D> <C342>
+endbfrange
+
+100 beginbfrange
+<984E> <984E> <C345>
+<984F> <984F> <C343>
+<9850> <9852> <F1A8>
+<9853> <9853> <C346>
+<9857> <9857> <F3AA>
+<9858> <9858> <C440>
+<9859> <9859> <F3A8>
+<985B> <985B> <C441>
+<985C> <985C> <F3A7>
+<985D> <985D> <F3A9>
+<985E> <985E> <C3FE>
+<985F> <985F> <F551>
+<9860> <9860> <F54E>
+<9862> <9863> <F54F>
+<9864> <9864> <F672>
+<9865> <9865> <C556>
+<9867> <9867> <C555>
+<9869> <9869> <F774>
+<986A> <986A> <F773>
+<986B> <986B> <C5B8>
+<986F> <986F> <C5E3>
+<9870> <9870> <C649>
+<9871> <9871> <C660>
+<9872> <9872> <F958>
+<9873> <9874> <F9AE>
+<98A8> <98A8> <ADB7>
+<98A9> <98A9> <DCAD>
+<98AC> <98AC> <E0E1>
+<98AD> <98AE> <E4CC>
+<98AF> <98AF> <BBE3>
+<98B1> <98B1> <BBE4>
+<98B2> <98B2> <E8BE>
+<98B3> <98B3> <BE68>
+<98B6> <98B6> <C1FC>
+<98B8> <98B8> <F1AB>
+<98BA> <98BA> <C347>
+<98BB> <98BB> <F3AD>
+<98BC> <98BC> <C442>
+<98BD> <98BD> <F3AC>
+<98BE> <98BE> <F3AE>
+<98BF> <98BF> <F3AB>
+<98C0> <98C0> <F675>
+<98C1> <98C2> <F552>
+<98C4> <98C4> <C4C6>
+<98C6> <98C6> <F674>
+<98C9> <98C9> <F673>
+<98CB> <98CB> <F775>
+<98CC> <98CC> <F9B0>
+<98DB> <98DB> <ADB8>
+<98DF> <98DF> <ADB9>
+<98E2> <98E2> <B0A7>
+<98E3> <98E3> <D448>
+<98E5> <98E5> <D84F>
+<98E7> <98E7> <B6B8>
+<98E9> <98E9> <B6BB>
+<98EA> <98EA> <B6B9>
+<98EB> <98EB> <DCAE>
+<98ED> <98ED> <B6BD>
+<98EF> <98EF> <B6BA>
+<98F2> <98F2> <B6BC>
+<98F4> <98F4> <B97E>
+<98F6> <98F6> <E0E2>
+<98F9> <98F9> <E0E3>
+<98FA> <98FA> <E8C0>
+<98FC> <98FC> <B97D>
+<98FD> <98FE> <B9A1>
+<9900> <9900> <E4CF>
+<9902> <9902> <E4CE>
+<9903> <9903> <BBE5>
+<9905> <9905> <BBE6>
+<9907> <9907> <E4D0>
+<9908> <9908> <E8BF>
+<9909> <9909> <BBE8>
+<990A> <990A> <BE69>
+<990C> <990C> <BBE7>
+<9910> <9910> <C05C>
+<9911> <9911> <E8C1>
+<9912> <9912> <BE6B>
+<9913> <9913> <BE6A>
+<9914> <9914> <E8C2>
+<9915> <9915> <E8C5>
+<9916> <9917> <E8C3>
+<9918> <9918> <BE6C>
+<991A> <991A> <C061>
+<991B> <991B> <C05F>
+<991E> <991E> <C05E>
+<991F> <991F> <EC5D>
+<9921> <9921> <C060>
+<9924> <9924> <EC5C>
+<9925> <9925> <EF4B>
+<9927> <9927> <EC5E>
+<9928> <9928> <C05D>
+<9929> <9929> <EC5F>
+<992A> <992A> <EF4E>
+<992B> <992C> <EF4C>
+<992D> <992D> <EF52>
+<992E> <992E> <C34B>
+<992F> <992F> <EF51>
+<9930> <9930> <EF54>
+<9931> <9931> <EF53>
+endbfrange
+
+100 beginbfrange
+<9932> <9932> <EF50>
+<9933> <9933> <EF4F>
+<9935> <9935> <C1FD>
+<993A> <993A> <F1AE>
+<993C> <993C> <F1AD>
+<993D> <993D> <C34A>
+<993E> <993F> <C348>
+<9941> <9941> <F1AC>
+<9943> <9943> <F3B1>
+<9945> <9945> <C443>
+<9947> <9947> <F3B0>
+<9948> <9948> <F3AF>
+<9949> <9949> <C444>
+<994B> <994B> <F558>
+<994C> <994C> <F557>
+<994E> <994E> <F555>
+<9950> <9950> <F554>
+<9951> <9951> <C4C8>
+<9952> <9952> <C4C7>
+<9953> <9953> <F559>
+<9954> <9954> <F776>
+<9955> <9955> <C5B9>
+<9956> <9956> <F677>
+<9957> <9957> <C557>
+<9958> <9958> <F676>
+<9959> <9959> <F556>
+<995B> <995B> <F777>
+<995C> <995C> <C5E4>
+<995E> <995E> <C661>
+<995F> <995F> <F959>
+<9961> <9961> <F9B1>
+<9996> <9996> <ADBA>
+<9997> <9997> <D850>
+<9998> <9998> <EF55>
+<9999> <9999> <ADBB>
+<999C> <999C> <E4D2>
+<999D> <999D> <E4D1>
+<999E> <999E> <EC60>
+<99A1> <99A1> <EF57>
+<99A3> <99A3> <EF56>
+<99A5> <99A5> <C34C>
+<99A6> <99A7> <F3B2>
+<99A8> <99A8> <C4C9>
+<99AB> <99AB> <F9B2>
+<99AC> <99AC> <B0A8>
+<99AD> <99AD> <B6BF>
+<99AE> <99AE> <B6BE>
+<99AF> <99AF> <E0E4>
+<99B0> <99B0> <E0E6>
+<99B1> <99B1> <B9A4>
+<99B2> <99B2> <E0E5>
+<99B3> <99B3> <B9A3>
+<99B4> <99B4> <B9A5>
+<99B5> <99B5> <E0E7>
+<99B9> <99B9> <E4D4>
+<99BA> <99BA> <E4D6>
+<99BB> <99BB> <E4D5>
+<99BD> <99BD> <E4D8>
+<99C1> <99C1> <BBE9>
+<99C2> <99C2> <E4D7>
+<99C3> <99C3> <E4D3>
+<99C7> <99C7> <E4D9>
+<99C9> <99C9> <E8CC>
+<99CB> <99CB> <E8CF>
+<99CC> <99CC> <E8D1>
+<99CD> <99CD> <E8C7>
+<99CE> <99CE> <E8CB>
+<99CF> <99CF> <E8C8>
+<99D0> <99D0> <BE6E>
+<99D1> <99D1> <BE71>
+<99D2> <99D2> <BE73>
+<99D3> <99D4> <E8C9>
+<99D5> <99D5> <BE72>
+<99D6> <99D6> <E8CD>
+<99D7> <99D7> <E8D0>
+<99D8> <99D8> <E8CE>
+<99D9> <99D9> <BE74>
+<99DB> <99DB> <BE70>
+<99DC> <99DC> <E8C6>
+<99DD> <99DD> <BE6D>
+<99DF> <99DF> <BE6F>
+<99E2> <99E2> <C063>
+<99E3> <99E3> <EC66>
+<99E4> <99E4> <EC64>
+<99E5> <99E5> <EC63>
+<99E7> <99E7> <EC69>
+<99E9> <99E9> <EC68>
+<99EA> <99EA> <EC67>
+<99EC> <99EC> <EC62>
+<99ED> <99ED> <C062>
+<99EE> <99EE> <EC61>
+<99F0> <99F0> <EC65>
+<99F1> <99F1> <C064>
+<99F4> <99F4> <EF5A>
+<99F6> <99F6> <EF5E>
+<99F7> <99F7> <EF5B>
+<99F8> <99F8> <EF5D>
+<99F9> <99F9> <EF5C>
+<99FA> <99FA> <EF59>
+<99FB> <99FB> <EF5F>
+endbfrange
+
+100 beginbfrange
+<99FC> <99FC> <EF62>
+<99FD> <99FE> <EF60>
+<99FF> <99FF> <C240>
+<9A01> <9A01> <C1FE>
+<9A02> <9A02> <EF58>
+<9A03> <9A03> <EF63>
+<9A04> <9A04> <F1B3>
+<9A05> <9A05> <F1B6>
+<9A06> <9A06> <F1B8>
+<9A07> <9A07> <F1B7>
+<9A09> <9A09> <F1B1>
+<9A0A> <9A0A> <F1B5>
+<9A0B> <9A0B> <F1B0>
+<9A0D> <9A0D> <F1B2>
+<9A0E> <9A0E> <C34D>
+<9A0F> <9A0F> <F1AF>
+<9A11> <9A11> <F1B4>
+<9A14> <9A14> <F3C0>
+<9A15> <9A15> <F3B5>
+<9A16> <9A16> <C445>
+<9A19> <9A19> <C446>
+<9A1A> <9A1A> <F3B4>
+<9A1B> <9A1B> <F3B9>
+<9A1C> <9A1C> <F3BF>
+<9A1D> <9A1D> <F3B7>
+<9A1E> <9A1E> <F3BE>
+<9A20> <9A20> <F3BB>
+<9A22> <9A22> <F3BA>
+<9A23> <9A23> <F3BD>
+<9A24> <9A24> <F3B8>
+<9A25> <9A25> <F3B6>
+<9A27> <9A27> <F3BC>
+<9A29> <9A29> <F560>
+<9A2A> <9A2A> <F55E>
+<9A2B> <9A2B> <C4CA>
+<9A2C> <9A2C> <F55D>
+<9A2D> <9A2D> <F563>
+<9A2E> <9A2E> <F561>
+<9A30> <9A30> <C4CB>
+<9A31> <9A31> <F55C>
+<9A32> <9A32> <F55A>
+<9A34> <9A34> <F55B>
+<9A35> <9A35> <C4CD>
+<9A36> <9A36> <F55F>
+<9A37> <9A37> <C4CC>
+<9A38> <9A38> <F562>
+<9A39> <9A39> <F678>
+<9A3A> <9A3A> <F67E>
+<9A3D> <9A3D> <F679>
+<9A3E> <9A3E> <C55B>
+<9A3F> <9A3F> <F6A1>
+<9A40> <9A40> <C55A>
+<9A41> <9A41> <F67D>
+<9A42> <9A42> <F67C>
+<9A43> <9A43> <C559>
+<9A44> <9A44> <F67B>
+<9A45> <9A45> <C558>
+<9A46> <9A46> <F67A>
+<9A48> <9A48> <F77D>
+<9A49> <9A49> <F7A1>
+<9A4A> <9A4A> <F77E>
+<9A4C> <9A4C> <F77B>
+<9A4D> <9A4D> <C5BB>
+<9A4E> <9A4E> <F778>
+<9A4F> <9A4F> <F77C>
+<9A50> <9A50> <F7A3>
+<9A52> <9A52> <F7A2>
+<9A53> <9A54> <F779>
+<9A55> <9A55> <C5BA>
+<9A56> <9A56> <F852>
+<9A57> <9A57> <C5E7>
+<9A59> <9A59> <F853>
+<9A5A> <9A5B> <C5E5>
+<9A5E> <9A5E> <F8D3>
+<9A5F> <9A5F> <C64A>
+<9A60> <9A60> <F976>
+<9A62> <9A62> <C66A>
+<9A64> <9A64> <F9B3>
+<9A65> <9A65> <C66B>
+<9A66> <9A67> <F9B4>
+<9A68> <9A68> <F9C3>
+<9A69> <9A69> <F9C2>
+<9A6A> <9A6A> <C67A>
+<9A6B> <9A6B> <F9CD>
+<9AA8> <9AA8> <B0A9>
+<9AAB> <9AAB> <E0E9>
+<9AAD> <9AAD> <E0E8>
+<9AAF> <9AB0> <BBEA>
+<9AB1> <9AB1> <E4DA>
+<9AB3> <9AB3> <E8D2>
+<9AB4> <9AB4> <EC6C>
+<9AB7> <9AB7> <BE75>
+<9AB8> <9AB8> <C065>
+<9AB9> <9AB9> <EC6A>
+<9ABB> <9ABB> <EC6D>
+<9ABC> <9ABC> <C066>
+<9ABE> <9ABE> <EF64>
+<9ABF> <9ABF> <EC6B>
+<9AC0> <9AC0> <F1B9>
+<9AC1> <9AC1> <C34E>
+endbfrange
+
+100 beginbfrange
+<9AC2> <9AC2> <F3C1>
+<9AC6> <9AC6> <F566>
+<9AC7> <9AC7> <F564>
+<9ACA> <9ACA> <F565>
+<9ACD> <9ACD> <F6A2>
+<9ACF> <9ACF> <C55C>
+<9AD0> <9AD0> <F7A4>
+<9AD1> <9AD1> <C5EA>
+<9AD2> <9AD2> <C5BC>
+<9AD3> <9AD4> <C5E8>
+<9AD5> <9AD5> <F8D4>
+<9AD6> <9AD6> <C662>
+<9AD8> <9AD8> <B0AA>
+<9ADC> <9ADC> <F1BA>
+<9ADF> <9ADF> <D449>
+<9AE1> <9AE1> <B9A6>
+<9AE3> <9AE3> <E4DB>
+<9AE6> <9AE6> <BBEC>
+<9AE7> <9AE7> <E4DC>
+<9AEB> <9AEB> <E8D4>
+<9AEC> <9AEC> <E8D3>
+<9AED> <9AED> <C068>
+<9AEE> <9AEF> <BE76>
+<9AF1> <9AF1> <E8D7>
+<9AF2> <9AF2> <E8D6>
+<9AF3> <9AF3> <E8D5>
+<9AF6> <9AF6> <EC6E>
+<9AF7> <9AF7> <EC71>
+<9AF9> <9AF9> <EC70>
+<9AFA> <9AFA> <EC6F>
+<9AFB> <9AFB> <C067>
+<9AFC> <9AFC> <EF68>
+<9AFD> <9AFD> <EF66>
+<9AFE> <9AFE> <EF65>
+<9B01> <9B01> <EF67>
+<9B03> <9B03> <C34F>
+<9B04> <9B05> <F1BC>
+<9B06> <9B06> <C350>
+<9B08> <9B08> <F1BB>
+<9B0A> <9B0A> <F3C3>
+<9B0B> <9B0B> <F3C2>
+<9B0C> <9B0C> <F3C5>
+<9B0D> <9B0D> <C447>
+<9B0E> <9B0E> <F3C4>
+<9B10> <9B10> <F567>
+<9B11> <9B11> <F569>
+<9B12> <9B12> <F568>
+<9B15> <9B15> <F6A3>
+<9B16> <9B16> <F6A6>
+<9B17> <9B18> <F6A4>
+<9B19> <9B19> <F7A5>
+<9B1A> <9B1A> <C5BD>
+<9B1E> <9B20> <F854>
+<9B22> <9B22> <C64B>
+<9B23> <9B23> <C663>
+<9B24> <9B24> <F9B6>
+<9B25> <9B25> <B0AB>
+<9B27> <9B27> <BE78>
+<9B28> <9B28> <C069>
+<9B29> <9B29> <F1BE>
+<9B2B> <9B2B> <F7A6>
+<9B2E> <9B2E> <F9C4>
+<9B2F> <9B2F> <D44A>
+<9B31> <9B31> <C67B>
+<9B32> <9B32> <B0AC>
+<9B33> <9B33> <EC72>
+<9B35> <9B35> <F1BF>
+<9B37> <9B37> <F3C6>
+<9B3A> <9B3A> <F6A7>
+<9B3B> <9B3B> <F7A7>
+<9B3C> <9B3C> <B0AD>
+<9B3E> <9B3F> <E4DD>
+<9B41> <9B42> <BBED>
+<9B43> <9B43> <E8D9>
+<9B44> <9B44> <BE7A>
+<9B45> <9B45> <BE79>
+<9B46> <9B46> <E8D8>
+<9B48> <9B48> <EF69>
+<9B4A> <9B4A> <F1C0>
+<9B4B> <9B4B> <F1C2>
+<9B4C> <9B4C> <F1C1>
+<9B4D> <9B4D> <C353>
+<9B4E> <9B4E> <C352>
+<9B4F> <9B4F> <C351>
+<9B51> <9B51> <C55E>
+<9B52> <9B52> <F6A8>
+<9B54> <9B54> <C55D>
+<9B55> <9B55> <F7A9>
+<9B56> <9B56> <F7A8>
+<9B58> <9B58> <C64C>
+<9B59> <9B59> <F8D5>
+<9B5A> <9B5A> <B3BD>
+<9B5B> <9B5B> <E0EA>
+<9B5F> <9B5F> <E4E1>
+<9B60> <9B61> <E4DF>
+<9B64> <9B64> <E8E2>
+<9B66> <9B66> <E8DD>
+<9B67> <9B67> <E8DA>
+<9B68> <9B68> <E8E1>
+<9B6C> <9B6C> <E8E3>
+endbfrange
+
+100 beginbfrange
+<9B6F> <9B6F> <BE7C>
+<9B70> <9B70> <E8E0>
+<9B71> <9B71> <E8DC>
+<9B74> <9B74> <E8DB>
+<9B75> <9B75> <E8DF>
+<9B76> <9B76> <E8DE>
+<9B77> <9B77> <BE7B>
+<9B7A> <9B7A> <EC7D>
+<9B7B> <9B7B> <EC78>
+<9B7C> <9B7C> <EC76>
+<9B7D> <9B7D> <ECA1>
+<9B7E> <9B7E> <EC77>
+<9B80> <9B80> <EC73>
+<9B82> <9B82> <EC79>
+<9B85> <9B85> <EC74>
+<9B86> <9B86> <EF72>
+<9B87> <9B87> <EC75>
+<9B88> <9B88> <ECA2>
+<9B90> <9B90> <EC7C>
+<9B91> <9B91> <C06A>
+<9B92> <9B92> <EC7B>
+<9B93> <9B93> <EC7A>
+<9B95> <9B95> <EC7E>
+<9B9A> <9B9A> <EF6A>
+<9B9B> <9B9B> <EF6D>
+<9B9E> <9B9E> <EF6C>
+<9BA0> <9BA0> <EF74>
+<9BA1> <9BA1> <EF6F>
+<9BA2> <9BA2> <EF73>
+<9BA4> <9BA4> <EF71>
+<9BA5> <9BA5> <EF70>
+<9BA6> <9BA6> <EF6E>
+<9BA8> <9BA8> <EF6B>
+<9BAA> <9BAA> <C243>
+<9BAB> <9BAB> <C242>
+<9BAD> <9BAD> <C244>
+<9BAE> <9BAE> <C241>
+<9BAF> <9BAF> <EF75>
+<9BB5> <9BB5> <F1C8>
+<9BB6> <9BB6> <F1CB>
+<9BB8> <9BB8> <F1C9>
+<9BB9> <9BB9> <F1CD>
+<9BBD> <9BBD> <F1CE>
+<9BBF> <9BBF> <F1C6>
+<9BC0> <9BC0> <C358>
+<9BC1> <9BC1> <F1C7>
+<9BC3> <9BC3> <F1C5>
+<9BC4> <9BC4> <F1CC>
+<9BC6> <9BC6> <F1C4>
+<9BC7> <9BC7> <F1C3>
+<9BC8> <9BC8> <C357>
+<9BC9> <9BC9> <C355>
+<9BCA> <9BCA> <C354>
+<9BD3> <9BD3> <F1CA>
+<9BD4> <9BD4> <F3CF>
+<9BD5> <9BD5> <F3D5>
+<9BD6> <9BD6> <C44A>
+<9BD7> <9BD7> <F3D0>
+<9BD9> <9BD9> <F3D3>
+<9BDA> <9BDA> <F3D7>
+<9BDB> <9BDB> <C44B>
+<9BDC> <9BDC> <F3D2>
+<9BDE> <9BDE> <F3CA>
+<9BE0> <9BE0> <F3C9>
+<9BE1> <9BE1> <F3D6>
+<9BE2> <9BE2> <F3CD>
+<9BE4> <9BE4> <F3CB>
+<9BE5> <9BE5> <F3D4>
+<9BE6> <9BE6> <F3CC>
+<9BE7> <9BE7> <C449>
+<9BE8> <9BE8> <C448>
+<9BEA> <9BEB> <F3C7>
+<9BEC> <9BEC> <F3D1>
+<9BF0> <9BF0> <F3CE>
+<9BF7> <9BF7> <F56C>
+<9BF8> <9BF8> <F56F>
+<9BFD> <9BFD> <C356>
+<9C05> <9C05> <F56D>
+<9C06> <9C06> <F573>
+<9C07> <9C07> <F571>
+<9C08> <9C08> <F56B>
+<9C09> <9C09> <F576>
+<9C0B> <9C0B> <F56A>
+<9C0D> <9C0D> <C4CF>
+<9C0E> <9C0E> <F572>
+<9C12> <9C12> <F56E>
+<9C13> <9C13> <C4CE>
+<9C14> <9C14> <F575>
+<9C17> <9C17> <F574>
+<9C1C> <9C1C> <F6AB>
+<9C1D> <9C1D> <F6AA>
+<9C21> <9C21> <F6B1>
+<9C23> <9C23> <F6AD>
+<9C24> <9C24> <F6B0>
+<9C25> <9C25> <C560>
+<9C28> <9C29> <F6AE>
+<9C2B> <9C2B> <F6A9>
+<9C2C> <9C2C> <F6AC>
+<9C2D> <9C2D> <C55F>
+<9C31> <9C31> <C5BF>
+endbfrange
+
+100 beginbfrange
+<9C32> <9C32> <F7B4>
+<9C33> <9C33> <F7AF>
+<9C34> <9C34> <F7B3>
+<9C36> <9C36> <F7B6>
+<9C37> <9C37> <F7B2>
+<9C39> <9C39> <F7AE>
+<9C3B> <9C3B> <C5C1>
+<9C3C> <9C3C> <F7B1>
+<9C3D> <9C3D> <F7B5>
+<9C3E> <9C3E> <C5C0>
+<9C3F> <9C3F> <F7AC>
+<9C40> <9C40> <F570>
+<9C41> <9C41> <F7B0>
+<9C44> <9C44> <F7AD>
+<9C46> <9C46> <F7AA>
+<9C48> <9C48> <F7AB>
+<9C49> <9C49> <C5BE>
+<9C4A> <9C4A> <F85A>
+<9C4B> <9C4B> <F85C>
+<9C4C> <9C4C> <F85F>
+<9C4D> <9C4D> <F85B>
+<9C4E> <9C4E> <F860>
+<9C50> <9C50> <F859>
+<9C52> <9C52> <F857>
+<9C54> <9C54> <C5EB>
+<9C55> <9C55> <F85D>
+<9C56> <9C56> <C5ED>
+<9C57> <9C57> <C5EC>
+<9C58> <9C58> <F858>
+<9C59> <9C59> <F85E>
+<9C5E> <9C5E> <F8DA>
+<9C5F> <9C5F> <C64D>
+<9C60> <9C60> <F8DB>
+<9C62> <9C62> <F8D9>
+<9C63> <9C63> <F8D6>
+<9C66> <9C66> <F8D8>
+<9C67> <9C67> <F8D7>
+<9C68> <9C68> <F95A>
+<9C6D> <9C6D> <F95C>
+<9C6E> <9C6E> <F95B>
+<9C71> <9C71> <F979>
+<9C73> <9C73> <F978>
+<9C74> <9C74> <F977>
+<9C75> <9C75> <F97A>
+<9C77> <9C78> <C673>
+<9C79> <9C79> <F9CA>
+<9C7A> <9C7A> <F9CE>
+<9CE5> <9CE5> <B3BE>
+<9CE6> <9CE6> <DCAF>
+<9CE7> <9CE7> <E0ED>
+<9CE9> <9CE9> <B9A7>
+<9CEA> <9CEA> <E0EB>
+<9CED> <9CED> <E0EC>
+<9CF1> <9CF2> <E4E2>
+<9CF3> <9CF3> <BBF1>
+<9CF4> <9CF4> <BBEF>
+<9CF5> <9CF5> <E4E4>
+<9CF6> <9CF6> <BBF0>
+<9CF7> <9CF7> <E8E8>
+<9CF9> <9CF9> <E8EB>
+<9CFA> <9CFA> <E8E5>
+<9CFB> <9CFB> <E8EC>
+<9CFC> <9CFC> <E8E4>
+<9CFD> <9CFD> <E8E6>
+<9CFF> <9CFF> <E8E7>
+<9D00> <9D00> <E8EA>
+<9D03> <9D03> <BEA1>
+<9D04> <9D04> <E8EF>
+<9D05> <9D05> <E8EE>
+<9D06> <9D06> <BE7D>
+<9D07> <9D07> <E8E9>
+<9D08> <9D08> <E8ED>
+<9D09> <9D09> <BE7E>
+<9D10> <9D10> <ECAC>
+<9D12> <9D12> <C06F>
+<9D14> <9D14> <ECA7>
+<9D15> <9D15> <C06B>
+<9D17> <9D17> <ECA4>
+<9D18> <9D18> <ECAA>
+<9D19> <9D19> <ECAD>
+<9D1B> <9D1B> <C070>
+<9D1D> <9D1D> <ECA9>
+<9D1E> <9D1E> <ECA6>
+<9D1F> <9D1F> <ECAE>
+<9D20> <9D20> <ECA5>
+<9D22> <9D22> <ECAB>
+<9D23> <9D23> <C06C>
+<9D25> <9D25> <ECA3>
+<9D26> <9D26> <C06D>
+<9D28> <9D28> <C06E>
+<9D29> <9D29> <ECA8>
+<9D2D> <9D2D> <EFA9>
+<9D2E> <9D2F> <EF7A>
+<9D30> <9D30> <EF7E>
+<9D31> <9D31> <EF7C>
+<9D33> <9D33> <EF76>
+<9D36> <9D36> <EF79>
+<9D37> <9D37> <EFA5>
+<9D38> <9D38> <EF7D>
+<9D3B> <9D3B> <C245>
+endbfrange
+
+100 beginbfrange
+<9D3D> <9D3D> <EFA7>
+<9D3E> <9D3E> <EFA4>
+<9D3F> <9D3F> <C246>
+<9D40> <9D40> <EFA6>
+<9D41> <9D41> <EF77>
+<9D42> <9D43> <EFA2>
+<9D45> <9D45> <EFA1>
+<9D4A> <9D4A> <F1D2>
+<9D4B> <9D4B> <F1D4>
+<9D4C> <9D4C> <F1D7>
+<9D4F> <9D4F> <F1D1>
+<9D51> <9D51> <C359>
+<9D52> <9D52> <F1D9>
+<9D53> <9D53> <F1D0>
+<9D54> <9D54> <F1DA>
+<9D56> <9D56> <F1D6>
+<9D57> <9D57> <F1D8>
+<9D58> <9D58> <F1DC>
+<9D59> <9D59> <F1D5>
+<9D5A> <9D5A> <F1DD>
+<9D5B> <9D5B> <F1D3>
+<9D5C> <9D5C> <F1CF>
+<9D5D> <9D5D> <C35A>
+<9D5F> <9D5F> <F1DB>
+<9D60> <9D60> <C35B>
+<9D61> <9D61> <C44D>
+<9D67> <9D67> <EF78>
+<9D68> <9D68> <F3F1>
+<9D69> <9D69> <F3E8>
+<9D6A> <9D6A> <C44F>
+<9D6B> <9D6B> <F3E4>
+<9D6C> <9D6C> <C450>
+<9D6F> <9D6F> <F3ED>
+<9D70> <9D70> <F3E7>
+<9D71> <9D71> <F3DD>
+<9D72> <9D72> <C44E>
+<9D73> <9D73> <F3EA>
+<9D74> <9D75> <F3E5>
+<9D77> <9D77> <F3D8>
+<9D78> <9D78> <F3DF>
+<9D79> <9D79> <F3EE>
+<9D7B> <9D7B> <F3EB>
+<9D7D> <9D7D> <F3E3>
+<9D7F> <9D7F> <F3EF>
+<9D80> <9D80> <F3DE>
+<9D81> <9D81> <F3D9>
+<9D82> <9D82> <F3EC>
+<9D84> <9D84> <F3DB>
+<9D85> <9D85> <F3E9>
+<9D86> <9D86> <F3E0>
+<9D87> <9D87> <F3F0>
+<9D88> <9D88> <F3DC>
+<9D89> <9D89> <C44C>
+<9D8A> <9D8A> <F3DA>
+<9D8B> <9D8C> <F3E1>
+<9D90> <9D90> <F57D>
+<9D92> <9D92> <F57B>
+<9D94> <9D94> <F5A2>
+<9D96> <9D96> <F5AE>
+<9D97> <9D97> <F5A5>
+<9D98> <9D98> <F57C>
+<9D99> <9D99> <F578>
+<9D9A> <9D9A> <F5A7>
+<9D9B> <9D9B> <F57E>
+<9D9C> <9D9C> <F5A3>
+<9D9D> <9D9D> <F57A>
+<9D9E> <9D9E> <F5AA>
+<9D9F> <9D9F> <F577>
+<9DA0> <9DA0> <F5A1>
+<9DA1> <9DA1> <F5A6>
+<9DA2> <9DA2> <F5A8>
+<9DA3> <9DA3> <F5AB>
+<9DA4> <9DA4> <F579>
+<9DA6> <9DA7> <F5AF>
+<9DA8> <9DA8> <F5A9>
+<9DA9> <9DA9> <F5AD>
+<9DAA> <9DAA> <F5A4>
+<9DAC> <9DAC> <F6C1>
+<9DAD> <9DAD> <F6C4>
+<9DAF> <9DAF> <C561>
+<9DB1> <9DB1> <F6C3>
+<9DB2> <9DB2> <F6C8>
+<9DB3> <9DB3> <F6C6>
+<9DB4> <9DB4> <C562>
+<9DB5> <9DB5> <F6BD>
+<9DB6> <9DB6> <F6B3>
+<9DB7> <9DB7> <F6B2>
+<9DB8> <9DB8> <C564>
+<9DB9> <9DBA> <F6BF>
+<9DBB> <9DBB> <F6BC>
+<9DBC> <9DBC> <F6B4>
+<9DBE> <9DBE> <F6B9>
+<9DBF> <9DBF> <F5AC>
+<9DC1> <9DC1> <F6B5>
+<9DC2> <9DC2> <C563>
+<9DC3> <9DC3> <F6BB>
+<9DC5> <9DC5> <F6BA>
+<9DC7> <9DC7> <F6B6>
+<9DC8> <9DC8> <F6C2>
+<9DCA> <9DCA> <F6B7>
+endbfrange
+
+100 beginbfrange
+<9DCB> <9DCB> <F7BB>
+<9DCC> <9DCC> <F6C5>
+<9DCD> <9DCD> <F6C7>
+<9DCE> <9DCE> <F6BE>
+<9DCF> <9DCF> <F6B8>
+<9DD0> <9DD0> <F7BC>
+<9DD1> <9DD1> <F7BE>
+<9DD2> <9DD2> <F7B8>
+<9DD3> <9DD3> <C5C2>
+<9DD5> <9DD5> <F7C5>
+<9DD6> <9DD6> <F7C3>
+<9DD7> <9DD7> <C5C3>
+<9DD8> <9DD8> <F7C2>
+<9DD9> <9DD9> <F7C1>
+<9DDA> <9DDA> <F7BA>
+<9DDB> <9DDB> <F7B7>
+<9DDC> <9DDC> <F7BD>
+<9DDD> <9DDD> <F7C6>
+<9DDE> <9DDE> <F7B9>
+<9DDF> <9DDF> <F7BF>
+<9DE1> <9DE1> <F869>
+<9DE2> <9DE2> <F86E>
+<9DE3> <9DE3> <F864>
+<9DE4> <9DE4> <F867>
+<9DE5> <9DE5> <C5EE>
+<9DE6> <9DE6> <F86B>
+<9DE8> <9DE8> <F872>
+<9DE9> <9DE9> <F7C0>
+<9DEB> <9DEB> <F865>
+<9DEC> <9DEC> <F86F>
+<9DED> <9DED> <F873>
+<9DEE> <9DEE> <F86A>
+<9DEF> <9DEF> <F863>
+<9DF0> <9DF0> <F86D>
+<9DF2> <9DF2> <F86C>
+<9DF3> <9DF3> <F871>
+<9DF4> <9DF4> <F870>
+<9DF5> <9DF5> <F7C4>
+<9DF6> <9DF6> <F868>
+<9DF7> <9DF7> <F862>
+<9DF8> <9DF8> <F866>
+<9DF9> <9DFA> <C64E>
+<9DFB> <9DFB> <F861>
+<9DFD> <9DFD> <F8E6>
+<9DFE> <9DFE> <F8DD>
+<9DFF> <9DFF> <F8E5>
+<9E00> <9E01> <F8E2>
+<9E02> <9E02> <F8DC>
+<9E03> <9E03> <F8DF>
+<9E04> <9E04> <F8E7>
+<9E05> <9E05> <F8E1>
+<9E06> <9E06> <F8E0>
+<9E07> <9E07> <F8DE>
+<9E09> <9E09> <F8E4>
+<9E0B> <9E0B> <F95D>
+<9E0D> <9E0D> <F95E>
+<9E0F> <9E0F> <F960>
+<9E10> <9E10> <F95F>
+<9E11> <9E11> <F962>
+<9E12> <9E12> <F961>
+<9E13> <9E13> <F97C>
+<9E14> <9E14> <F97B>
+<9E15> <9E15> <F9B7>
+<9E17> <9E17> <F9B8>
+<9E19> <9E19> <F9C5>
+<9E1A> <9E1A> <C678>
+<9E1B> <9E1B> <C67C>
+<9E1D> <9E1D> <F9CF>
+<9E1E> <9E1E> <C67D>
+<9E75> <9E75> <B3BF>
+<9E79> <9E79> <C4D0>
+<9E7A> <9E7A> <F6C9>
+<9E7C> <9E7D> <C650>
+<9E7F> <9E7F> <B3C0>
+<9E80> <9E80> <E0EE>
+<9E82> <9E82> <B9A8>
+<9E83> <9E83> <E8F0>
+<9E86> <9E87> <ECB0>
+<9E88> <9E88> <ECAF>
+<9E89> <9E89> <EFAB>
+<9E8A> <9E8A> <EFAA>
+<9E8B> <9E8B> <C247>
+<9E8C> <9E8C> <F1DF>
+<9E8D> <9E8D> <EFAC>
+<9E8E> <9E8E> <F1DE>
+<9E91> <9E91> <F3F3>
+<9E92> <9E92> <C451>
+<9E93> <9E93> <C453>
+<9E94> <9E94> <F3F2>
+<9E97> <9E97> <C452>
+<9E99> <9E99> <F5B1>
+<9E9A> <9E9A> <F5B3>
+<9E9B> <9E9B> <F5B2>
+<9E9C> <9E9C> <F6CA>
+<9E9D> <9E9D> <C565>
+<9E9F> <9E9F> <C5EF>
+<9EA0> <9EA0> <F8E8>
+<9EA1> <9EA1> <F963>
+<9EA4> <9EA4> <F9D2>
+<9EA5> <9EA5> <B3C1>
+endbfrange
+
+100 beginbfrange
+<9EA7> <9EA7> <E4E5>
+<9EA9> <9EA9> <BEA2>
+<9EAD> <9EAD> <ECB3>
+<9EAE> <9EAE> <ECB2>
+<9EB0> <9EB0> <EFAD>
+<9EB4> <9EB4> <C454>
+<9EB5> <9EB5> <C4D1>
+<9EB6> <9EB6> <F7C7>
+<9EB7> <9EB7> <F9CB>
+<9EBB> <9EBB> <B3C2>
+<9EBC> <9EBC> <BBF2>
+<9EBE> <9EBE> <BEA3>
+<9EC0> <9EC0> <F3F4>
+<9EC2> <9EC2> <F874>
+<9EC3> <9EC3> <B6C0>
+<9EC8> <9EC8> <EFAE>
+<9ECC> <9ECC> <C664>
+<9ECD> <9ECD> <B6C1>
+<9ECE> <9ECE> <BEA4>
+<9ECF> <9ECF> <C248>
+<9ED0> <9ED0> <F875>
+<9ED1> <9ED1> <B6C2>
+<9ED3> <9ED3> <E8F1>
+<9ED4> <9ED4> <C072>
+<9ED5> <9ED6> <ECB4>
+<9ED8> <9ED8> <C071>
+<9EDA> <9EDA> <EFAF>
+<9EDB> <9EDB> <C24C>
+<9EDC> <9EDD> <C24A>
+<9EDE> <9EDE> <C249>
+<9EDF> <9EDF> <F1E0>
+<9EE0> <9EE0> <C35C>
+<9EE4> <9EE4> <F5B5>
+<9EE5> <9EE5> <F5B4>
+<9EE6> <9EE6> <F5B7>
+<9EE7> <9EE7> <F5B6>
+<9EE8> <9EE8> <C4D2>
+<9EEB> <9EEB> <F6CB>
+<9EED> <9EED> <F6CD>
+<9EEE> <9EEE> <F6CC>
+<9EEF> <9EEF> <C566>
+<9EF0> <9EF0> <F7C8>
+<9EF2> <9EF3> <F876>
+<9EF4> <9EF4> <C5F0>
+<9EF5> <9EF5> <F964>
+<9EF6> <9EF6> <F97D>
+<9EF7> <9EF7> <C675>
+<9EF9> <9EF9> <DCB0>
+<9EFA> <9EFA> <ECB6>
+<9EFB> <9EFB> <EFB0>
+<9EFC> <9EFC> <F3F5>
+<9EFD> <9EFD> <E0EF>
+<9EFF> <9EFF> <EFB1>
+<9F00> <9F00> <F1E2>
+<9F01> <9F01> <F1E1>
+<9F06> <9F06> <F878>
+<9F07> <9F07> <C652>
+<9F09> <9F09> <F965>
+<9F0A> <9F0A> <F97E>
+<9F0E> <9F0E> <B9A9>
+<9F0F> <9F10> <E8F2>
+<9F12> <9F12> <ECB7>
+<9F13> <9F13> <B9AA>
+<9F15> <9F15> <C35D>
+<9F16> <9F16> <F1E3>
+<9F18> <9F18> <F6CF>
+<9F19> <9F19> <C567>
+<9F1A> <9F1A> <F6D0>
+<9F1B> <9F1B> <F6CE>
+<9F1C> <9F1C> <F879>
+<9F1E> <9F1E> <F8E9>
+<9F20> <9F20> <B9AB>
+<9F22> <9F22> <EFB4>
+<9F23> <9F23> <EFB3>
+<9F24> <9F24> <EFB2>
+<9F25> <9F25> <F1E4>
+<9F28> <9F28> <F1E8>
+<9F29> <9F29> <F1E7>
+<9F2A> <9F2A> <F1E6>
+<9F2B> <9F2B> <F1E5>
+<9F2C> <9F2C> <C35E>
+<9F2D> <9F2D> <F3F6>
+<9F2E> <9F2E> <F5B9>
+<9F2F> <9F2F> <C4D3>
+<9F30> <9F30> <F5B8>
+<9F31> <9F31> <F6D1>
+<9F32> <9F32> <F7CB>
+<9F33> <9F33> <F7CA>
+<9F34> <9F34> <C5C4>
+<9F35> <9F35> <F7C9>
+<9F36> <9F36> <F87C>
+<9F37> <9F37> <F87B>
+<9F38> <9F38> <F87A>
+<9F3B> <9F3B> <BBF3>
+<9F3D> <9F3D> <ECB8>
+<9F3E> <9F3E> <C24D>
+<9F40> <9F41> <F3F7>
+<9F42> <9F42> <F7CC>
+<9F43> <9F43> <F87D>
+<9F46> <9F46> <F8EA>
+endbfrange
+
+100 beginbfrange
+<9F47> <9F47> <F966>
+<9F48> <9F48> <F9B9>
+<9F49> <9F49> <F9D4>
+<9F4A> <9F4A> <BBF4>
+<9F4B> <9F4B> <C24E>
+<9F4C> <9F4C> <F1E9>
+<9F4D> <9F4D> <F3F9>
+<9F4E> <9F4E> <F6D2>
+<9F4F> <9F4F> <F87E>
+<9F52> <9F52> <BEA6>
+<9F54> <9F54> <EFB5>
+<9F55> <9F55> <F1EA>
+<9F56> <9F58> <F3FA>
+<9F59> <9F59> <F5BE>
+<9F5B> <9F5B> <F5BA>
+<9F5C> <9F5C> <C568>
+<9F5D> <9F5D> <F5BD>
+<9F5E> <9F5E> <F5BC>
+<9F5F> <9F5F> <C4D4>
+<9F60> <9F60> <F5BB>
+<9F61> <9F61> <C4D6>
+<9F63> <9F63> <C4D5>
+<9F64> <9F64> <F6D4>
+<9F65> <9F65> <F6D3>
+<9F66> <9F67> <C569>
+<9F6A> <9F6A> <C5C6>
+<9F6B> <9F6B> <F7CD>
+<9F6C> <9F6C> <C5C5>
+<9F6E> <9F6F> <F8A3>
+<9F70> <9F70> <F8A2>
+<9F71> <9F71> <F8A1>
+<9F72> <9F72> <C654>
+<9F74> <9F76> <F8EB>
+<9F77> <9F77> <C653>
+<9F78> <9F78> <F967>
+<9F79> <9F79> <F96A>
+<9F7A> <9F7A> <F969>
+<9F7B> <9F7B> <F968>
+<9F7E> <9F7E> <F9D3>
+<9F8D> <9F8D> <C073>
+<9F90> <9F90> <C365>
+<9F91> <9F91> <F5BF>
+<9F92> <9F92> <F6D5>
+<9F94> <9F94> <C5C7>
+<9F95> <9F95> <F7CE>
+<9F98> <9F98> <F9D5>
+<9F9C> <9F9C> <C074>
+<9FA0> <9FA0> <EFB6>
+<9FA2> <9FA2> <F7CF>
+<9FA4> <9FA4> <F9A1>
+<F880> <F881> <81>
+<FA0C> <FA0C> <C94A>
+<FA0D> <FA0D> <DDFC>
+<FE30> <FE30> <A14A>
+<FE31> <FE31> <A157>
+<FE33> <FE33> <A159>
+<FE34> <FE34> <A15B>
+<FE35> <FE36> <A15F>
+<FE37> <FE38> <A163>
+<FE39> <FE3A> <A167>
+<FE3B> <FE3C> <A16B>
+<FE3D> <FE3E> <A16F>
+<FE3F> <FE40> <A173>
+<FE41> <FE42> <A177>
+<FE43> <FE44> <A17B>
+<FE49> <FE4A> <A1C6>
+<FE4B> <FE4C> <A1CA>
+<FE4D> <FE4E> <A1C8>
+<FE4F> <FE4F> <A15C>
+<FE50> <FE52> <A14D>
+<FE54> <FE54> <A151>
+<FE55> <FE57> <A152>
+<FE59> <FE5A> <A17D>
+<FE5B> <FE5E> <A1A1>
+<FE5F> <FE61> <A1CC>
+<FE62> <FE66> <A1DE>
+<FE68> <FE68> <A242>
+<FE69> <FE6B> <A24C>
+<FF01> <FF01> <A149>
+<FF02> <FF02> <A1A8>
+<FF03> <FF03> <A1AD>
+<FF04> <FF04> <A243>
+<FF05> <FF05> <A248>
+<FF06> <FF06> <A1AE>
+<FF07> <FF07> <A1A6>
+<FF08> <FF09> <A15D>
+<FF0A> <FF0A> <A1AF>
+<FF0B> <FF0B> <A1CF>
+<FF0C> <FF0C> <A141>
+<FF0D> <FF0D> <A1D0>
+<FF0E> <FF0E> <A144>
+<FF0F> <FF0F> <A241>
+<FF10> <FF19> <A2AF>
+<FF1A> <FF1A> <A147>
+<FF1B> <FF1B> <A146>
+<FF1C> <FF1C> <A1D5>
+<FF1D> <FF1D> <A1D7>
+<FF1E> <FF1E> <A1D6>
+<FF1F> <FF1F> <A148>
+<FF20> <FF20> <A249>
+endbfrange
+
+12 beginbfrange
+<FF21> <FF3A> <A2CF>
+<FF3C> <FF3C> <A242>
+<FF3F> <FF3F> <A1C4>
+<FF41> <FF56> <A2E9>
+<FF57> <FF5A> <A340>
+<FF5B> <FF5B> <A161>
+<FF5C> <FF5C> <A155>
+<FF5D> <FF5D> <A162>
+<FF5E> <FF5E> <A1E3>
+<FFE0> <FFE1> <A246>
+<FFE3> <FFE3> <A1C3>
+<FFE5> <FFE5> <A244>
+endbfrange
+
+endcmap
+CMapName currentdict /CMap defineresource pop
+end
+end
+
+%%EndResource
+%%EOF
diff --git a/src/main/resources/Resources/cmap/UCS2-GBK-EUC b/src/main/resources/Resources/cmap/UCS2-GBK-EUC
new file mode 100644
index 0000000..689bc20
--- /dev/null
+++ b/src/main/resources/Resources/cmap/UCS2-GBK-EUC
@@ -0,0 +1,11253 @@
+%!PS-Adobe-3.0 Resource-CMap
+%%DocumentNeededResources: ProcSet (CIDInit)
+%%IncludeResource: ProcSet (CIDInit)
+%%BeginResource: CMap (UCS2-GBK-EUC)
+%%Title: (UCS2-GBK-EUC)
+%%Version: 4.002
+%%Copyright: -----------------------------------------------------------
+%%Copyright: Copyright 1990-1999 Adobe Systems Incorporated.
+%%Copyright: All Rights Reserved.
+%%Copyright:
+%%Copyright: Patents Pending
+%%Copyright:
+%%Copyright: NOTICE: All information contained herein is the property
+%%Copyright: of Adobe Systems Incorporated.
+%%Copyright:
+%%Copyright: Permission is granted for redistribution of this file
+%%Copyright: provided this copyright notice is maintained intact and
+%%Copyright: that the contents of this file are not altered in any
+%%Copyright: way from its original form.
+%%Copyright:
+%%Copyright: PostScript and Display PostScript are trademarks of
+%%Copyright: Adobe Systems Incorporated which may be registered in
+%%Copyright: certain jurisdictions.
+%%Copyright: -----------------------------------------------------------
+%%EndComments
+
+/CIDInit /ProcSet findresource begin
+
+12 dict begin
+
+begincmap
+
+/CIDSystemInfo 3 dict dup begin
+ /Registry (Adobe) def
+ /Ordering (UCS2_GBK_EUC) def
+ /Supplement 2 def
+end def
+
+/CMapName /UCS2-GBK-EUC def
+/CMapVersion 4.002 def
+/CMapType 1 def
+/WMode 0 def
+
+1 begincodespacerange
+<0000> <FFFF>
+endcodespacerange
+
+100 beginbfrange
+<0000> <0080> <00>
+<00A2> <00A3> <A1E9>
+<00A4> <00A4> <A1E8>
+<00A5> <00A5> <A3A4>
+<00A6> <00A6> <7C>
+<00A7> <00A7> <A1EC>
+<00A8> <00A8> <A1A7>
+<00AA> <00AA> <61>
+<00AD> <00AD> <2D>
+<00AF> <00AF> <A1A5>
+<00B0> <00B0> <A1E3>
+<00B1> <00B1> <A1C0>
+<00B2> <00B3> <32>
+<00B4> <00B4> <A1E4>
+<00B5> <00B5> <A6CC>
+<00B7> <00B7> <A1A4>
+<00B9> <00B9> <31>
+<00BA> <00BA> <6F>
+<00C0> <00C0> <A8A4>
+<00C1> <00C1> <A8A2>
+<00C8> <00C8> <A8A8>
+<00C9> <00C9> <A8A6>
+<00CA> <00CA> <A8BA>
+<00CC> <00CC> <A8AC>
+<00CD> <00CD> <A8AA>
+<00D0> <00D0> <44>
+<00D2> <00D2> <A8B0>
+<00D3> <00D3> <A8AE>
+<00D7> <00D7> <A1C1>
+<00D9> <00D9> <A8B4>
+<00DA> <00DA> <A8B2>
+<00DC> <00DC> <A8B9>
+<00DD> <00DD> <59>
+<00DE> <00DE> <54>
+<00E0> <00E0> <A8A4>
+<00E1> <00E1> <A8A2>
+<00E2> <00E2> <61>
+<00E8> <00E8> <A8A8>
+<00E9> <00E9> <A8A6>
+<00EA> <00EA> <A8BA>
+<00EC> <00EC> <A8AC>
+<00ED> <00ED> <A8AA>
+<00F0> <00F0> <65>
+<00F2> <00F2> <A8B0>
+<00F3> <00F3> <A8AE>
+<00F7> <00F7> <A1C2>
+<00F9> <00F9> <A8B4>
+<00FA> <00FA> <A8B2>
+<00FC> <00FC> <A8B9>
+<00FD> <00FD> <79>
+<00FE> <00FE> <74>
+<0100> <0100> <A8A1>
+<0101> <0101> <A8A1>
+<0112> <0112> <A8A5>
+<0113> <0113> <A8A5>
+<011A> <011A> <A8A7>
+<011B> <011B> <A8A7>
+<012A> <012A> <A8A9>
+<012B> <012B> <A8A9>
+<0144> <0144> <A8BD>
+<0148> <0148> <A8BE>
+<014C> <014C> <A8AD>
+<014D> <014D> <A8AD>
+<016A> <016A> <A8B1>
+<016B> <016B> <A8B1>
+<01C1> <01C1> <A1CE>
+<01CD> <01CD> <A8A3>
+<01CE> <01CE> <A8A3>
+<01CF> <01CF> <A8AB>
+<01D0> <01D0> <A8AB>
+<01D1> <01D1> <A8AF>
+<01D2> <01D2> <A8AF>
+<01D3> <01D3> <A8B3>
+<01D4> <01D4> <A8B3>
+<01D5> <01D5> <A8B5>
+<01D6> <01D7> <A8B5>
+<01D8> <01D9> <A8B6>
+<01DA> <01DB> <A8B7>
+<01DC> <01DC> <A8B8>
+<0251> <0251> <A8BB>
+<0261> <0261> <A8C0>
+<02C7> <02C7> <A1A6>
+<02C9> <02C9> <A1A5>
+<02CA> <02CB> <A840>
+<02D0> <02D0> <A1C3>
+<02D9> <02D9> <A842>
+<0391> <03A1> <A6A1>
+<03A3> <03A9> <A6B2>
+<03B1> <03C1> <A6C1>
+<03C3> <03C9> <A6D2>
+<0401> <0401> <A7A7>
+<0410> <0415> <A7A1>
+<0416> <042F> <A7A8>
+<0430> <0435> <A7D1>
+<0436> <044F> <A7D8>
+<0451> <0451> <A7D7>
+<1E3F> <1E3F> <A8BC>
+<2010> <2010> <A95C>
+<2013> <2013> <A843>
+<2014> <2014> <A1AA>
+endbfrange
+
+100 beginbfrange
+<2015> <2015> <A844>
+<2016> <2016> <A1AC>
+<2018> <2019> <A1AE>
+<201C> <201D> <A1B0>
+<2022> <2022> <A1A4>
+<2025> <2025> <A845>
+<2026> <2026> <A1AD>
+<2027> <2027> <A1A4>
+<2030> <2030> <A1EB>
+<2032> <2033> <A1E4>
+<2035> <2035> <A846>
+<203B> <203B> <A1F9>
+<203E> <203E> <A3FE>
+<2103> <2103> <A1E6>
+<2105> <2105> <A847>
+<2109> <2109> <A848>
+<2116> <2116> <A1ED>
+<2121> <2121> <A959>
+<2160> <216B> <A2F1>
+<2170> <2179> <A2A1>
+<2190> <2191> <A1FB>
+<2192> <2192> <A1FA>
+<2193> <2193> <A1FD>
+<2196> <2199> <A849>
+<2208> <2208> <A1CA>
+<220F> <220F> <A1C7>
+<2211> <2211> <A1C6>
+<2215> <2215> <A84D>
+<2218> <2218> <A1E3>
+<221A> <221A> <A1CC>
+<221D> <221D> <A1D8>
+<221E> <221E> <A1DE>
+<221F> <221F> <A84E>
+<2220> <2220> <A1CF>
+<2223> <2223> <A84F>
+<2225> <2225> <A1CE>
+<2227> <2228> <A1C4>
+<2229> <2229> <A1C9>
+<222A> <222A> <A1C8>
+<222B> <222B> <A1D2>
+<222E> <222E> <A1D3>
+<2234> <2234> <A1E0>
+<2235> <2235> <A1DF>
+<2236> <2236> <A1C3>
+<2237> <2237> <A1CB>
+<223C> <223C> <A1AB>
+<223D> <223D> <A1D7>
+<2248> <2248> <A1D6>
+<224C> <224C> <A1D5>
+<2252> <2252> <A850>
+<2260> <2260> <A1D9>
+<2261> <2261> <A1D4>
+<2264> <2265> <A1DC>
+<2266> <2267> <A851>
+<226E> <226F> <A1DA>
+<2295> <2295> <A892>
+<2299> <2299> <A1D1>
+<22A5> <22A5> <A1CD>
+<22BF> <22BF> <A853>
+<22EF> <22EF> <A1AD>
+<2312> <2312> <A1D0>
+<2460> <2469> <A2D9>
+<2474> <2487> <A2C5>
+<2488> <249B> <A2B1>
+<2500> <254B> <A9A4>
+<2550> <2573> <A854>
+<2581> <2587> <A878>
+<2588> <258F> <A880>
+<2593> <2595> <A888>
+<25A0> <25A0> <A1F6>
+<25A1> <25A1> <A1F5>
+<25B2> <25B2> <A1F8>
+<25B3> <25B3> <A1F7>
+<25BC> <25BD> <A88B>
+<25C6> <25C6> <A1F4>
+<25C7> <25C7> <A1F3>
+<25C9> <25C9> <A1D1>
+<25CB> <25CB> <A1F0>
+<25CE> <25CE> <A1F2>
+<25CF> <25CF> <A1F1>
+<25E2> <25E5> <A88D>
+<2605> <2605> <A1EF>
+<2606> <2606> <A1EE>
+<2609> <2609> <A891>
+<2640> <2640> <A1E2>
+<2642> <2642> <A1E1>
+<3000> <3002> <A1A1>
+<3003> <3003> <A1A8>
+<3005> <3005> <A1A9>
+<3006> <3006> <A965>
+<3007> <3007> <A996>
+<3008> <300F> <A1B4>
+<3010> <3011> <A1BE>
+<3012> <3012> <A893>
+<3013> <3013> <A1FE>
+<3014> <3015> <A1B2>
+<3016> <3017> <A1BC>
+<301C> <301C> <A1AB>
+<301D> <301E> <A894>
+<3021> <3029> <A940>
+endbfrange
+
+100 beginbfrange
+<3041> <3093> <A4A1>
+<309B> <309C> <A961>
+<309D> <309E> <A966>
+<30A1> <30F6> <A5A1>
+<30FC> <30FC> <A960>
+<30FD> <30FE> <A963>
+<3105> <3129> <A8C5>
+<3192> <3192> <D2BB>
+<3193> <3193> <B6FE>
+<3194> <3194> <C8FD>
+<3195> <3195> <CBC4>
+<3196> <3196> <C9CF>
+<3197> <3197> <D6D0>
+<3198> <3198> <CFC2>
+<3199> <3199> <BCD7>
+<319A> <319A> <D2D2>
+<319B> <319B> <B1FB>
+<319C> <319C> <B6A1>
+<319D> <319D> <CCEC>
+<319E> <319E> <B5D8>
+<319F> <319F> <C8CB>
+<3220> <3229> <A2E5>
+<322A> <322A> <D4C2>
+<322B> <322B> <BBF0>
+<322C> <322C> <CBAE>
+<322D> <322D> <C4BE>
+<322E> <322E> <BDF0>
+<322F> <322F> <CDC1>
+<3230> <3230> <C8D5>
+<3231> <3231> <A95A>
+<3232> <3232> <D3D0>
+<3233> <3233> <C9E7>
+<3234> <3234> <C3FB>
+<3235> <3235> <CCD8>
+<3236> <3236> <B2C6>
+<3237> <3237> <D7A3>
+<3238> <3238> <C0CD>
+<3239> <3239> <B4FA>
+<323A> <323A> <BAF4>
+<323B> <323B> <D1A7>
+<323C> <323C> <BCE0>
+<323D> <323D> <C6F3>
+<323E> <323E> <D7CA>
+<323F> <323F> <D0AD>
+<3240> <3240> <BCC0>
+<3241> <3241> <D0DD>
+<3242> <3242> <D7D4>
+<3243> <3243> <D6C1>
+<3280> <3280> <D2BB>
+<3281> <3281> <B6FE>
+<3282> <3282> <C8FD>
+<3283> <3283> <CBC4>
+<3284> <3284> <CEE5>
+<3285> <3285> <C1F9>
+<3286> <3286> <C6DF>
+<3287> <3287> <B0CB>
+<3288> <3288> <BEC5>
+<3289> <3289> <CAAE>
+<328A> <328A> <D4C2>
+<328B> <328B> <BBF0>
+<328C> <328C> <CBAE>
+<328D> <328D> <C4BE>
+<328E> <328E> <BDF0>
+<328F> <328F> <CDC1>
+<3290> <3290> <C8D5>
+<3291> <3291> <D6EA>
+<3292> <3292> <D3D0>
+<3293> <3293> <C9E7>
+<3294> <3294> <C3FB>
+<3295> <3295> <CCD8>
+<3296> <3296> <B2C6>
+<3297> <3297> <D7A3>
+<3298> <3298> <C0CD>
+<3299> <3299> <C3D8>
+<329A> <329A> <C4D0>
+<329B> <329B> <C5AE>
+<329C> <329C> <CACA>
+<329D> <329D> <D3C5>
+<329F> <329F> <D7A2>
+<32A0> <32A0> <CFEE>
+<32A1> <32A1> <D0DD>
+<32A2> <32A2> <D0B4>
+<32A3> <32A3> <A949>
+<32A9> <32A9> <D2BD>
+<32AA> <32AA> <D7DA>
+<32AB> <32AB> <D1A7>
+<32AC> <32AC> <BCE0>
+<32AD> <32AD> <C6F3>
+<32AE> <32AE> <D7CA>
+<32AF> <32AF> <D0AD>
+<32B0> <32B0> <D2B9>
+<338E> <338F> <A94A>
+<339C> <339E> <A94C>
+<33A1> <33A1> <A94F>
+<33C4> <33C4> <A950>
+<33CE> <33CE> <A951>
+<33D1> <33D2> <A952>
+<33D5> <33D5> <A954>
+<4E00> <4E00> <D2BB>
+<4E01> <4E01> <B6A1>
+endbfrange
+
+100 beginbfrange
+<4E02> <4E02> <8140>
+<4E03> <4E03> <C6DF>
+<4E04> <4E06> <8141>
+<4E07> <4E07> <CDF2>
+<4E08> <4E08> <D5C9>
+<4E09> <4E09> <C8FD>
+<4E0A> <4E0A> <C9CF>
+<4E0B> <4E0B> <CFC2>
+<4E0C> <4E0C> <D8A2>
+<4E0D> <4E0D> <B2BB>
+<4E0E> <4E0E> <D3EB>
+<4E0F> <4E0F> <8144>
+<4E10> <4E10> <D8A4>
+<4E11> <4E11> <B3F3>
+<4E12> <4E12> <8145>
+<4E13> <4E13> <D7A8>
+<4E14> <4E14> <C7D2>
+<4E15> <4E15> <D8A7>
+<4E16> <4E16> <CAC0>
+<4E17> <4E17> <8146>
+<4E18> <4E18> <C7F0>
+<4E19> <4E19> <B1FB>
+<4E1A> <4E1A> <D2B5>
+<4E1B> <4E1B> <B4D4>
+<4E1C> <4E1C> <B6AB>
+<4E1D> <4E1D> <CBBF>
+<4E1E> <4E1E> <D8A9>
+<4E1F> <4E21> <8147>
+<4E22> <4E22> <B6AA>
+<4E23> <4E23> <814A>
+<4E24> <4E24> <C1BD>
+<4E25> <4E25> <D1CF>
+<4E26> <4E26> <814B>
+<4E27> <4E27> <C9A5>
+<4E28> <4E28> <D8AD>
+<4E29> <4E29> <814C>
+<4E2A> <4E2A> <B8F6>
+<4E2B> <4E2B> <D1BE>
+<4E2C> <4E2C> <E3DC>
+<4E2D> <4E2D> <D6D0>
+<4E2E> <4E2F> <814D>
+<4E30> <4E30> <B7E1>
+<4E31> <4E31> <814F>
+<4E32> <4E32> <B4AE>
+<4E33> <4E33> <8150>
+<4E34> <4E34> <C1D9>
+<4E35> <4E35> <8151>
+<4E36> <4E36> <D8BC>
+<4E37> <4E37> <8152>
+<4E38> <4E38> <CDE8>
+<4E39> <4E39> <B5A4>
+<4E3A> <4E3A> <CEAA>
+<4E3B> <4E3B> <D6F7>
+<4E3C> <4E3C> <8153>
+<4E3D> <4E3D> <C0F6>
+<4E3E> <4E3E> <BED9>
+<4E3F> <4E3F> <D8AF>
+<4E40> <4E42> <8154>
+<4E43> <4E43> <C4CB>
+<4E44> <4E44> <8157>
+<4E45> <4E45> <BEC3>
+<4E46> <4E46> <8158>
+<4E47> <4E47> <D8B1>
+<4E48> <4E48> <C3B4>
+<4E49> <4E49> <D2E5>
+<4E4A> <4E4A> <8159>
+<4E4B> <4E4B> <D6AE>
+<4E4C> <4E4C> <CEDA>
+<4E4D> <4E4D> <D5A7>
+<4E4E> <4E4E> <BAF5>
+<4E4F> <4E4F> <B7A6>
+<4E50> <4E50> <C0D6>
+<4E51> <4E51> <815A>
+<4E52> <4E52> <C6B9>
+<4E53> <4E53> <C5D2>
+<4E54> <4E54> <C7C7>
+<4E55> <4E55> <815B>
+<4E56> <4E56> <B9D4>
+<4E57> <4E57> <815C>
+<4E58> <4E58> <B3CB>
+<4E59> <4E59> <D2D2>
+<4E5A> <4E5B> <815D>
+<4E5C> <4E5C> <D8BF>
+<4E5D> <4E5D> <BEC5>
+<4E5E> <4E5E> <C6F2>
+<4E5F> <4E5F> <D2B2>
+<4E60> <4E60> <CFB0>
+<4E61> <4E61> <CFE7>
+<4E62> <4E65> <815F>
+<4E66> <4E66> <CAE9>
+<4E67> <4E68> <8163>
+<4E69> <4E69> <D8C0>
+<4E6A> <4E6F> <8165>
+<4E70> <4E70> <C2F2>
+<4E71> <4E71> <C2D2>
+<4E72> <4E72> <816B>
+<4E73> <4E73> <C8E9>
+<4E74> <4E7D> <816C>
+<4E7E> <4E7E> <C7AC>
+<4E7F> <4E85> <8176>
+endbfrange
+
+100 beginbfrange
+<4E86> <4E86> <C1CB>
+<4E87> <4E87> <817D>
+<4E88> <4E88> <D3E8>
+<4E89> <4E89> <D5F9>
+<4E8A> <4E8A> <817E>
+<4E8B> <4E8B> <CAC2>
+<4E8C> <4E8C> <B6FE>
+<4E8D> <4E8D> <D8A1>
+<4E8E> <4E8E> <D3DA>
+<4E8F> <4E8F> <BFF7>
+<4E90> <4E90> <8180>
+<4E91> <4E91> <D4C6>
+<4E92> <4E92> <BBA5>
+<4E93> <4E93> <D8C1>
+<4E94> <4E94> <CEE5>
+<4E95> <4E95> <BEAE>
+<4E96> <4E97> <8181>
+<4E98> <4E98> <D8A8>
+<4E99> <4E99> <8183>
+<4E9A> <4E9A> <D1C7>
+<4E9B> <4E9B> <D0A9>
+<4E9C> <4E9E> <8184>
+<4E9F> <4E9F> <D8BD>
+<4EA0> <4EA0> <D9EF>
+<4EA1> <4EA1> <CDF6>
+<4EA2> <4EA2> <BFBA>
+<4EA3> <4EA3> <8187>
+<4EA4> <4EA4> <BDBB>
+<4EA5> <4EA5> <BAA5>
+<4EA6> <4EA6> <D2E0>
+<4EA7> <4EA7> <B2FA>
+<4EA8> <4EA8> <BAE0>
+<4EA9> <4EA9> <C4B6>
+<4EAA> <4EAA> <8188>
+<4EAB> <4EAB> <CFED>
+<4EAC> <4EAC> <BEA9>
+<4EAD> <4EAD> <CDA4>
+<4EAE> <4EAE> <C1C1>
+<4EAF> <4EB1> <8189>
+<4EB2> <4EB2> <C7D7>
+<4EB3> <4EB3> <D9F1>
+<4EB4> <4EB4> <818C>
+<4EB5> <4EB5> <D9F4>
+<4EB6> <4EB9> <818D>
+<4EBA> <4EBA> <C8CB>
+<4EBB> <4EBB> <D8E9>
+<4EBC> <4EBE> <8191>
+<4EBF> <4EBF> <D2DA>
+<4EC0> <4EC0> <CAB2>
+<4EC1> <4EC1> <C8CA>
+<4EC2> <4EC2> <D8EC>
+<4EC3> <4EC3> <D8EA>
+<4EC4> <4EC4> <D8C6>
+<4EC5> <4EC5> <BDF6>
+<4EC6> <4EC6> <C6CD>
+<4EC7> <4EC7> <B3F0>
+<4EC8> <4EC8> <8194>
+<4EC9> <4EC9> <D8EB>
+<4ECA> <4ECA> <BDF1>
+<4ECB> <4ECB> <BDE9>
+<4ECC> <4ECC> <8195>
+<4ECD> <4ECD> <C8D4>
+<4ECE> <4ECE> <B4D3>
+<4ECF> <4ED0> <8196>
+<4ED1> <4ED1> <C2D8>
+<4ED2> <4ED2> <8198>
+<4ED3> <4ED3> <B2D6>
+<4ED4> <4ED4> <D7D0>
+<4ED5> <4ED5> <CACB>
+<4ED6> <4ED6> <CBFB>
+<4ED7> <4ED7> <D5CC>
+<4ED8> <4ED8> <B8B6>
+<4ED9> <4ED9> <CFC9>
+<4EDA> <4EDC> <8199>
+<4EDD> <4EDD> <D9DA>
+<4EDE> <4EDE> <D8F0>
+<4EDF> <4EDF> <C7AA>
+<4EE0> <4EE0> <819C>
+<4EE1> <4EE1> <D8EE>
+<4EE2> <4EE2> <819D>
+<4EE3> <4EE3> <B4FA>
+<4EE4> <4EE4> <C1EE>
+<4EE5> <4EE5> <D2D4>
+<4EE6> <4EE7> <819E>
+<4EE8> <4EE8> <D8ED>
+<4EE9> <4EE9> <81A0>
+<4EEA> <4EEA> <D2C7>
+<4EEB> <4EEB> <D8EF>
+<4EEC> <4EEC> <C3C7>
+<4EED> <4EEF> <81A1>
+<4EF0> <4EF0> <D1F6>
+<4EF1> <4EF1> <81A4>
+<4EF2> <4EF2> <D6D9>
+<4EF3> <4EF3> <D8F2>
+<4EF4> <4EF4> <81A5>
+<4EF5> <4EF5> <D8F5>
+<4EF6> <4EF6> <BCFE>
+<4EF7> <4EF7> <BCDB>
+<4EF8> <4EFA> <81A6>
+<4EFB> <4EFB> <C8CE>
+endbfrange
+
+100 beginbfrange
+<4EFC> <4EFC> <81A9>
+<4EFD> <4EFD> <B7DD>
+<4EFE> <4EFE> <81AA>
+<4EFF> <4EFF> <B7C2>
+<4F00> <4F00> <81AB>
+<4F01> <4F01> <C6F3>
+<4F02> <4F08> <81AC>
+<4F09> <4F09> <D8F8>
+<4F0A> <4F0A> <D2C1>
+<4F0B> <4F0C> <81B3>
+<4F0D> <4F0D> <CEE9>
+<4F0E> <4F0E> <BCBF>
+<4F0F> <4F0F> <B7FC>
+<4F10> <4F10> <B7A5>
+<4F11> <4F11> <D0DD>
+<4F12> <4F16> <81B5>
+<4F17> <4F17> <D6DA>
+<4F18> <4F18> <D3C5>
+<4F19> <4F19> <BBEF>
+<4F1A> <4F1A> <BBE1>
+<4F1B> <4F1B> <D8F1>
+<4F1C> <4F1D> <81BA>
+<4F1E> <4F1E> <C9A1>
+<4F1F> <4F1F> <CEB0>
+<4F20> <4F20> <B4AB>
+<4F21> <4F21> <81BC>
+<4F22> <4F22> <D8F3>
+<4F23> <4F23> <81BD>
+<4F24> <4F24> <C9CB>
+<4F25> <4F25> <D8F6>
+<4F26> <4F26> <C2D7>
+<4F27> <4F27> <D8F7>
+<4F28> <4F29> <81BE>
+<4F2A> <4F2A> <CEB1>
+<4F2B> <4F2B> <D8F9>
+<4F2C> <4F2E> <81C0>
+<4F2F> <4F2F> <B2AE>
+<4F30> <4F30> <B9C0>
+<4F31> <4F31> <81C3>
+<4F32> <4F32> <D9A3>
+<4F33> <4F33> <81C4>
+<4F34> <4F34> <B0E9>
+<4F35> <4F35> <81C5>
+<4F36> <4F36> <C1E6>
+<4F37> <4F37> <81C6>
+<4F38> <4F38> <C9EC>
+<4F39> <4F39> <81C7>
+<4F3A> <4F3A> <CBC5>
+<4F3B> <4F3B> <81C8>
+<4F3C> <4F3C> <CBC6>
+<4F3D> <4F3D> <D9A4>
+<4F3E> <4F42> <81C9>
+<4F43> <4F43> <B5E8>
+<4F44> <4F45> <81CE>
+<4F46> <4F46> <B5AB>
+<4F47> <4F4C> <81D0>
+<4F4D> <4F4D> <CEBB>
+<4F4E> <4F4E> <B5CD>
+<4F4F> <4F4F> <D7A1>
+<4F50> <4F50> <D7F4>
+<4F51> <4F51> <D3D3>
+<4F52> <4F52> <81D6>
+<4F53> <4F53> <CCE5>
+<4F54> <4F54> <81D7>
+<4F55> <4F55> <BACE>
+<4F56> <4F56> <81D8>
+<4F57> <4F57> <D9A2>
+<4F58> <4F58> <D9DC>
+<4F59> <4F59> <D3E0>
+<4F5A> <4F5A> <D8FD>
+<4F5B> <4F5B> <B7F0>
+<4F5C> <4F5C> <D7F7>
+<4F5D> <4F5D> <D8FE>
+<4F5E> <4F5E> <D8FA>
+<4F5F> <4F5F> <D9A1>
+<4F60> <4F60> <C4E3>
+<4F61> <4F62> <81D9>
+<4F63> <4F63> <D3B6>
+<4F64> <4F64> <D8F4>
+<4F65> <4F65> <D9DD>
+<4F66> <4F66> <81DB>
+<4F67> <4F67> <D8FB>
+<4F68> <4F68> <81DC>
+<4F69> <4F69> <C5E5>
+<4F6A> <4F6B> <81DD>
+<4F6C> <4F6C> <C0D0>
+<4F6D> <4F6E> <81DF>
+<4F6F> <4F6F> <D1F0>
+<4F70> <4F70> <B0DB>
+<4F71> <4F72> <81E1>
+<4F73> <4F73> <BCD1>
+<4F74> <4F74> <D9A6>
+<4F75> <4F75> <81E3>
+<4F76> <4F76> <D9A5>
+<4F77> <4F7A> <81E4>
+<4F7B> <4F7B> <D9AC>
+<4F7C> <4F7C> <D9AE>
+<4F7D> <4F7D> <81E8>
+<4F7E> <4F7E> <D9AB>
+<4F7F> <4F7F> <CAB9>
+endbfrange
+
+100 beginbfrange
+<4F80> <4F82> <81E9>
+<4F83> <4F83> <D9A9>
+<4F84> <4F84> <D6B6>
+<4F85> <4F87> <81EC>
+<4F88> <4F88> <B3DE>
+<4F89> <4F89> <D9A8>
+<4F8A> <4F8A> <81EF>
+<4F8B> <4F8B> <C0FD>
+<4F8C> <4F8C> <81F0>
+<4F8D> <4F8D> <CACC>
+<4F8E> <4F8E> <81F1>
+<4F8F> <4F8F> <D9AA>
+<4F90> <4F90> <81F2>
+<4F91> <4F91> <D9A7>
+<4F92> <4F93> <81F3>
+<4F94> <4F94> <D9B0>
+<4F95> <4F96> <81F5>
+<4F97> <4F97> <B6B1>
+<4F98> <4F9A> <81F7>
+<4F9B> <4F9B> <B9A9>
+<4F9C> <4F9C> <81FA>
+<4F9D> <4F9D> <D2C0>
+<4F9E> <4F9F> <81FB>
+<4FA0> <4FA0> <CFC0>
+<4FA1> <4FA2> <81FD>
+<4FA3> <4FA3> <C2C2>
+<4FA4> <4FA4> <8240>
+<4FA5> <4FA5> <BDC4>
+<4FA6> <4FA6> <D5EC>
+<4FA7> <4FA7> <B2E0>
+<4FA8> <4FA8> <C7C8>
+<4FA9> <4FA9> <BFEB>
+<4FAA> <4FAA> <D9AD>
+<4FAB> <4FAB> <8241>
+<4FAC> <4FAC> <D9AF>
+<4FAD> <4FAD> <8242>
+<4FAE> <4FAE> <CEEA>
+<4FAF> <4FAF> <BAEE>
+<4FB0> <4FB4> <8243>
+<4FB5> <4FB5> <C7D6>
+<4FB6> <4FBE> <8248>
+<4FBF> <4FBF> <B1E3>
+<4FC0> <4FC2> <8251>
+<4FC3> <4FC3> <B4D9>
+<4FC4> <4FC4> <B6ED>
+<4FC5> <4FC5> <D9B4>
+<4FC6> <4FC9> <8254>
+<4FCA> <4FCA> <BFA1>
+<4FCB> <4FCD> <8258>
+<4FCE> <4FCE> <D9DE>
+<4FCF> <4FCF> <C7CE>
+<4FD0> <4FD0> <C0FE>
+<4FD1> <4FD1> <D9B8>
+<4FD2> <4FD6> <825B>
+<4FD7> <4FD7> <CBD7>
+<4FD8> <4FD8> <B7FD>
+<4FD9> <4FD9> <8260>
+<4FDA> <4FDA> <D9B5>
+<4FDB> <4FDB> <8261>
+<4FDC> <4FDC> <D9B7>
+<4FDD> <4FDD> <B1A3>
+<4FDE> <4FDE> <D3E1>
+<4FDF> <4FDF> <D9B9>
+<4FE0> <4FE0> <8262>
+<4FE1> <4FE1> <D0C5>
+<4FE2> <4FE2> <8263>
+<4FE3> <4FE3> <D9B6>
+<4FE4> <4FE5> <8264>
+<4FE6> <4FE6> <D9B1>
+<4FE7> <4FE7> <8266>
+<4FE8> <4FE8> <D9B2>
+<4FE9> <4FE9> <C1A9>
+<4FEA> <4FEA> <D9B3>
+<4FEB> <4FEC> <8267>
+<4FED> <4FED> <BCF3>
+<4FEE> <4FEE> <D0DE>
+<4FEF> <4FEF> <B8A9>
+<4FF0> <4FF0> <8269>
+<4FF1> <4FF1> <BEE3>
+<4FF2> <4FF2> <826A>
+<4FF3> <4FF3> <D9BD>
+<4FF4> <4FF7> <826B>
+<4FF8> <4FF8> <D9BA>
+<4FF9> <4FF9> <826F>
+<4FFA> <4FFA> <B0B3>
+<4FFB> <4FFD> <8270>
+<4FFE> <4FFE> <D9C2>
+<4FFF> <4FFF> <8273>
+<5000> <500A> <8274>
+<500B> <500B> <8280>
+<500C> <500C> <D9C4>
+<500D> <500D> <B1B6>
+<500E> <500E> <8281>
+<500F> <500F> <D9BF>
+<5010> <5011> <8282>
+<5012> <5012> <B5B9>
+<5013> <5013> <8284>
+<5014> <5014> <BEF3>
+<5015> <5017> <8285>
+<5018> <5018> <CCC8>
+endbfrange
+
+100 beginbfrange
+<5019> <5019> <BAF2>
+<501A> <501A> <D2D0>
+<501B> <501B> <8288>
+<501C> <501C> <D9C3>
+<501D> <501E> <8289>
+<501F> <501F> <BDE8>
+<5020> <5020> <828B>
+<5021> <5021> <B3AB>
+<5022> <5024> <828C>
+<5025> <5025> <D9C5>
+<5026> <5026> <BEEB>
+<5027> <5027> <828F>
+<5028> <5028> <D9C6>
+<5029> <5029> <D9BB>
+<502A> <502A> <C4DF>
+<502B> <502B> <8290>
+<502C> <502C> <D9BE>
+<502D> <502D> <D9C1>
+<502E> <502E> <D9C0>
+<502F> <5039> <8291>
+<503A> <503A> <D5AE>
+<503B> <503B> <829C>
+<503C> <503C> <D6B5>
+<503D> <503D> <829D>
+<503E> <503E> <C7E3>
+<503F> <5042> <829E>
+<5043> <5043> <D9C8>
+<5044> <5046> <82A2>
+<5047> <5047> <BCD9>
+<5048> <5048> <D9CA>
+<5049> <504B> <82A5>
+<504C> <504C> <D9BC>
+<504D> <504D> <82A8>
+<504E> <504E> <D9CB>
+<504F> <504F> <C6AB>
+<5050> <5054> <82A9>
+<5055> <5055> <D9C9>
+<5056> <5059> <82AE>
+<505A> <505A> <D7F6>
+<505B> <505B> <82B2>
+<505C> <505C> <CDA3>
+<505D> <5064> <82B3>
+<5065> <5065> <BDA1>
+<5066> <506B> <82BB>
+<506C> <506C> <D9CC>
+<506D> <5075> <82C1>
+<5076> <5076> <C5BC>
+<5077> <5077> <CDB5>
+<5078> <507A> <82CA>
+<507B> <507B> <D9CD>
+<507C> <507D> <82CD>
+<507E> <507E> <D9C7>
+<507F> <507F> <B3A5>
+<5080> <5080> <BFFE>
+<5081> <5084> <82CF>
+<5085> <5085> <B8B5>
+<5086> <5087> <82D3>
+<5088> <5088> <C0FC>
+<5089> <508C> <82D5>
+<508D> <508D> <B0F8>
+<508E> <50A2> <82D9>
+<50A3> <50A3> <B4F6>
+<50A4> <50A4> <82EE>
+<50A5> <50A5> <D9CE>
+<50A6> <50A6> <82EF>
+<50A7> <50A7> <D9CF>
+<50A8> <50A8> <B4A2>
+<50A9> <50A9> <D9D0>
+<50AA> <50AB> <82F0>
+<50AC> <50AC> <B4DF>
+<50AD> <50B1> <82F2>
+<50B2> <50B2> <B0C1>
+<50B3> <50B9> <82F7>
+<50BA> <50BA> <D9D1>
+<50BB> <50BB> <C9B5>
+<50BC> <50BC> <82FE>
+<50BD> <50CE> <8340>
+<50CF> <50CF> <CFF1>
+<50D0> <50D5> <8352>
+<50D6> <50D6> <D9D2>
+<50D7> <50D9> <8358>
+<50DA> <50DA> <C1C5>
+<50DB> <50E5> <835B>
+<50E6> <50E6> <D9D6>
+<50E7> <50E7> <C9AE>
+<50E8> <50EB> <8366>
+<50EC> <50EC> <D9D5>
+<50ED> <50ED> <D9D4>
+<50EE> <50EE> <D9D7>
+<50EF> <50F2> <836A>
+<50F3> <50F3> <CBDB>
+<50F4> <50F4> <836E>
+<50F5> <50F5> <BDA9>
+<50F6> <50FA> <836F>
+<50FB> <50FB> <C6A7>
+<50FC> <50FF> <8374>
+<5100> <5105> <8378>
+<5106> <5106> <D9D3>
+<5107> <5107> <D9D8>
+<5108> <5108> <837E>
+endbfrange
+
+100 beginbfrange
+<5109> <510A> <8380>
+<510B> <510B> <D9D9>
+<510C> <5111> <8382>
+<5112> <5112> <C8E5>
+<5113> <5120> <8388>
+<5121> <5121> <C0DC>
+<5122> <513E> <8396>
+<513F> <513F> <B6F9>
+<5140> <5140> <D8A3>
+<5141> <5141> <D4CA>
+<5142> <5142> <83B3>
+<5143> <5143> <D4AA>
+<5144> <5144> <D0D6>
+<5145> <5145> <B3E4>
+<5146> <5146> <D5D7>
+<5147> <5147> <83B4>
+<5148> <5148> <CFC8>
+<5149> <5149> <B9E2>
+<514A> <514A> <83B5>
+<514B> <514B> <BFCB>
+<514C> <514C> <83B6>
+<514D> <514D> <C3E2>
+<514E> <5150> <83B7>
+<5151> <5151> <B6D2>
+<5152> <5153> <83BA>
+<5154> <5154> <CDC3>
+<5155> <5155> <D9EE>
+<5156> <5156> <D9F0>
+<5157> <5159> <83BC>
+<515A> <515A> <B5B3>
+<515B> <515B> <83BF>
+<515C> <515C> <B6B5>
+<515D> <5161> <83C0>
+<5162> <5162> <BEA4>
+<5163> <5164> <83C5>
+<5165> <5165> <C8EB>
+<5166> <5167> <83C7>
+<5168> <5168> <C8AB>
+<5169> <516A> <83C9>
+<516B> <516B> <B0CB>
+<516C> <516C> <B9AB>
+<516D> <516D> <C1F9>
+<516E> <516E> <D9E2>
+<516F> <516F> <83CB>
+<5170> <5170> <C0BC>
+<5171> <5171> <B9B2>
+<5172> <5172> <83CC>
+<5173> <5173> <B9D8>
+<5174> <5174> <D0CB>
+<5175> <5175> <B1F8>
+<5176> <5176> <C6E4>
+<5177> <5177> <BEDF>
+<5178> <5178> <B5E4>
+<5179> <5179> <D7C8>
+<517A> <517A> <83CD>
+<517B> <517B> <D1F8>
+<517C> <517C> <BCE6>
+<517D> <517D> <CADE>
+<517E> <517F> <83CE>
+<5180> <5180> <BCBD>
+<5181> <5181> <D9E6>
+<5182> <5182> <D8E7>
+<5183> <5184> <83D0>
+<5185> <5185> <C4DA>
+<5186> <5187> <83D2>
+<5188> <5188> <B8D4>
+<5189> <5189> <C8BD>
+<518A> <518B> <83D4>
+<518C> <518C> <B2E1>
+<518D> <518D> <D4D9>
+<518E> <5191> <83D6>
+<5192> <5192> <C3B0>
+<5193> <5194> <83DA>
+<5195> <5195> <C3E1>
+<5196> <5196> <DAA2>
+<5197> <5197> <C8DF>
+<5198> <5198> <83DC>
+<5199> <5199> <D0B4>
+<519A> <519A> <83DD>
+<519B> <519B> <BEFC>
+<519C> <519C> <C5A9>
+<519D> <519F> <83DE>
+<51A0> <51A0> <B9DA>
+<51A1> <51A1> <83E1>
+<51A2> <51A2> <DAA3>
+<51A3> <51A3> <83E2>
+<51A4> <51A4> <D4A9>
+<51A5> <51A5> <DAA4>
+<51A6> <51AA> <83E3>
+<51AB> <51AB> <D9FB>
+<51AC> <51AC> <B6AC>
+<51AD> <51AE> <83E8>
+<51AF> <51AF> <B7EB>
+<51B0> <51B0> <B1F9>
+<51B1> <51B1> <D9FC>
+<51B2> <51B2> <B3E5>
+<51B3> <51B3> <BEF6>
+<51B4> <51B4> <83EA>
+<51B5> <51B5> <BFF6>
+<51B6> <51B6> <D2B1>
+endbfrange
+
+100 beginbfrange
+<51B7> <51B7> <C0E4>
+<51B8> <51BA> <83EB>
+<51BB> <51BB> <B6B3>
+<51BC> <51BC> <D9FE>
+<51BD> <51BD> <D9FD>
+<51BE> <51BF> <83EE>
+<51C0> <51C0> <BEBB>
+<51C1> <51C3> <83F0>
+<51C4> <51C4> <C6E0>
+<51C5> <51C5> <83F3>
+<51C6> <51C6> <D7BC>
+<51C7> <51C7> <DAA1>
+<51C8> <51C8> <83F4>
+<51C9> <51C9> <C1B9>
+<51CA> <51CA> <83F5>
+<51CB> <51CB> <B5F2>
+<51CC> <51CC> <C1E8>
+<51CD> <51CE> <83F6>
+<51CF> <51CF> <BCF5>
+<51D0> <51D0> <83F8>
+<51D1> <51D1> <B4D5>
+<51D2> <51D7> <83F9>
+<51D8> <51DA> <8440>
+<51DB> <51DB> <C1DD>
+<51DC> <51DC> <8443>
+<51DD> <51DD> <C4FD>
+<51DE> <51DF> <8444>
+<51E0> <51E0> <BCB8>
+<51E1> <51E1> <B7B2>
+<51E2> <51E3> <8446>
+<51E4> <51E4> <B7EF>
+<51E5> <51EA> <8448>
+<51EB> <51EB> <D9EC>
+<51EC> <51EC> <844E>
+<51ED> <51ED> <C6BE>
+<51EE> <51EE> <844F>
+<51EF> <51EF> <BFAD>
+<51F0> <51F0> <BBCB>
+<51F1> <51F2> <8450>
+<51F3> <51F3> <B5CA>
+<51F4> <51F4> <8452>
+<51F5> <51F5> <DBC9>
+<51F6> <51F6> <D0D7>
+<51F7> <51F7> <8453>
+<51F8> <51F8> <CDB9>
+<51F9> <51F9> <B0BC>
+<51FA> <51FA> <B3F6>
+<51FB> <51FB> <BBF7>
+<51FC> <51FC> <DBCA>
+<51FD> <51FD> <BAAF>
+<51FE> <51FE> <8454>
+<51FF> <51FF> <D4E4>
+<5200> <5200> <B5B6>
+<5201> <5201> <B5F3>
+<5202> <5202> <D8D6>
+<5203> <5203> <C8D0>
+<5204> <5205> <8455>
+<5206> <5206> <B7D6>
+<5207> <5207> <C7D0>
+<5208> <5208> <D8D7>
+<5209> <5209> <8457>
+<520A> <520A> <BFAF>
+<520B> <520C> <8458>
+<520D> <520D> <DBBB>
+<520E> <520E> <D8D8>
+<520F> <5210> <845A>
+<5211> <5211> <D0CC>
+<5212> <5212> <BBAE>
+<5213> <5215> <845C>
+<5216> <5216> <EBBE>
+<5217> <5217> <C1D0>
+<5218> <5218> <C1F5>
+<5219> <5219> <D4F2>
+<521A> <521A> <B8D5>
+<521B> <521B> <B4B4>
+<521C> <521C> <845F>
+<521D> <521D> <B3F5>
+<521E> <521F> <8460>
+<5220> <5220> <C9BE>
+<5221> <5223> <8462>
+<5224> <5224> <C5D0>
+<5225> <5227> <8465>
+<5228> <5228> <C5D9>
+<5229> <5229> <C0FB>
+<522A> <522A> <8468>
+<522B> <522B> <B1F0>
+<522C> <522C> <8469>
+<522D> <522D> <D8D9>
+<522E> <522E> <B9CE>
+<522F> <522F> <846A>
+<5230> <5230> <B5BD>
+<5231> <5232> <846B>
+<5233> <5233> <D8DA>
+<5234> <5235> <846D>
+<5236> <5236> <D6C6>
+<5237> <5237> <CBA2>
+<5238> <5238> <C8AF>
+<5239> <5239> <C9B2>
+<523A> <523A> <B4CC>
+<523B> <523B> <BFCC>
+endbfrange
+
+100 beginbfrange
+<523C> <523C> <846F>
+<523D> <523D> <B9F4>
+<523E> <523E> <8470>
+<523F> <5240> <D8DB>
+<5241> <5241> <B6E7>
+<5242> <5242> <BCC1>
+<5243> <5243> <CCEA>
+<5244> <5249> <8471>
+<524A> <524A> <CFF7>
+<524B> <524B> <8477>
+<524C> <524C> <D8DD>
+<524D> <524D> <C7B0>
+<524E> <524F> <8478>
+<5250> <5250> <B9D0>
+<5251> <5251> <BDA3>
+<5252> <5253> <847A>
+<5254> <5254> <CCDE>
+<5255> <5255> <847C>
+<5256> <5256> <C6CA>
+<5257> <5258> <847D>
+<5259> <525B> <8480>
+<525C> <525C> <D8E0>
+<525D> <525D> <8483>
+<525E> <525E> <D8DE>
+<525F> <5260> <8484>
+<5261> <5261> <D8DF>
+<5262> <5264> <8486>
+<5265> <5265> <B0FE>
+<5266> <5266> <8489>
+<5267> <5267> <BEE7>
+<5268> <5268> <848A>
+<5269> <5269> <CAA3>
+<526A> <526A> <BCF4>
+<526B> <526E> <848B>
+<526F> <526F> <B8B1>
+<5270> <5271> <848F>
+<5272> <5272> <B8EE>
+<5273> <527C> <8491>
+<527D> <527D> <D8E2>
+<527E> <527E> <849B>
+<527F> <527F> <BDCB>
+<5280> <5280> <849C>
+<5281> <5281> <D8E4>
+<5282> <5282> <D8E3>
+<5283> <5287> <849D>
+<5288> <5288> <C5FC>
+<5289> <528F> <84A2>
+<5290> <5290> <D8E5>
+<5291> <5292> <84A9>
+<5293> <5293> <D8E6>
+<5294> <529A> <84AB>
+<529B> <529B> <C1A6>
+<529C> <529C> <84B2>
+<529D> <529D> <C8B0>
+<529E> <529E> <B0EC>
+<529F> <529F> <B9A6>
+<52A0> <52A0> <BCD3>
+<52A1> <52A1> <CEF1>
+<52A2> <52A2> <DBBD>
+<52A3> <52A3> <C1D3>
+<52A4> <52A7> <84B3>
+<52A8> <52A8> <B6AF>
+<52A9> <52A9> <D6FA>
+<52AA> <52AA> <C5AC>
+<52AB> <52AB> <BDD9>
+<52AC> <52AD> <DBBE>
+<52AE> <52B0> <84B7>
+<52B1> <52B1> <C0F8>
+<52B2> <52B2> <BEA2>
+<52B3> <52B3> <C0CD>
+<52B4> <52BD> <84BA>
+<52BE> <52BE> <DBC0>
+<52BF> <52BF> <CAC6>
+<52C0> <52C2> <84C4>
+<52C3> <52C3> <B2AA>
+<52C4> <52C6> <84C7>
+<52C7> <52C7> <D3C2>
+<52C8> <52C8> <84CA>
+<52C9> <52C9> <C3E3>
+<52CA> <52CA> <84CB>
+<52CB> <52CB> <D1AB>
+<52CC> <52CF> <84CC>
+<52D0> <52D0> <DBC2>
+<52D1> <52D1> <84D0>
+<52D2> <52D2> <C0D5>
+<52D3> <52D5> <84D1>
+<52D6> <52D6> <DBC3>
+<52D7> <52D7> <84D4>
+<52D8> <52D8> <BFB1>
+<52D9> <52DE> <84D5>
+<52DF> <52DF> <C4BC>
+<52E0> <52E3> <84DB>
+<52E4> <52E4> <C7DA>
+<52E5> <52EF> <84DF>
+<52F0> <52F0> <DBC4>
+<52F1> <52F8> <84EA>
+<52F9> <52F9> <D9E8>
+<52FA> <52FA> <C9D7>
+<52FB> <52FD> <84F2>
+<52FE> <52FE> <B9B4>
+endbfrange
+
+100 beginbfrange
+<52FF> <52FF> <CEF0>
+<5300> <5300> <D4C8>
+<5301> <5304> <84F5>
+<5305> <5305> <B0FC>
+<5306> <5306> <B4D2>
+<5307> <5307> <84F9>
+<5308> <5308> <D0D9>
+<5309> <530C> <84FA>
+<530D> <530D> <D9E9>
+<530E> <530E> <84FE>
+<530F> <530F> <DECB>
+<5310> <5310> <D9EB>
+<5311> <5314> <8540>
+<5315> <5315> <D8B0>
+<5316> <5316> <BBAF>
+<5317> <5317> <B1B1>
+<5318> <5318> <8544>
+<5319> <5319> <B3D7>
+<531A> <531A> <D8CE>
+<531B> <531C> <8545>
+<531D> <531D> <D4D1>
+<531E> <531F> <8547>
+<5320> <5320> <BDB3>
+<5321> <5321> <BFEF>
+<5322> <5322> <8549>
+<5323> <5323> <CFBB>
+<5324> <5325> <854A>
+<5326> <5326> <D8D0>
+<5327> <5329> <854C>
+<532A> <532A> <B7CB>
+<532B> <532D> <854F>
+<532E> <532E> <D8D1>
+<532F> <5338> <8552>
+<5339> <5339> <C6A5>
+<533A> <533A> <C7F8>
+<533B> <533B> <D2BD>
+<533C> <533D> <855C>
+<533E> <533E> <D8D2>
+<533F> <533F> <C4E4>
+<5340> <5340> <855E>
+<5341> <5341> <CAAE>
+<5342> <5342> <855F>
+<5343> <5343> <C7A7>
+<5344> <5344> <8560>
+<5345> <5345> <D8A6>
+<5346> <5346> <8561>
+<5347> <5347> <C9FD>
+<5348> <5348> <CEE7>
+<5349> <5349> <BBDC>
+<534A> <534A> <B0EB>
+<534B> <534D> <8562>
+<534E> <534E> <BBAA>
+<534F> <534F> <D0AD>
+<5350> <5350> <8565>
+<5351> <5351> <B1B0>
+<5352> <5352> <D7E4>
+<5353> <5353> <D7BF>
+<5354> <5354> <8566>
+<5355> <5355> <B5A5>
+<5356> <5356> <C2F4>
+<5357> <5357> <C4CF>
+<5358> <5359> <8567>
+<535A> <535A> <B2A9>
+<535B> <535B> <8569>
+<535C> <535C> <B2B7>
+<535D> <535D> <856A>
+<535E> <535E> <B1E5>
+<535F> <535F> <DFB2>
+<5360> <5360> <D5BC>
+<5361> <5361> <BFA8>
+<5362> <5362> <C2AC>
+<5363> <5363> <D8D5>
+<5364> <5364> <C2B1>
+<5365> <5365> <856B>
+<5366> <5366> <D8D4>
+<5367> <5367> <CED4>
+<5368> <5368> <856C>
+<5369> <5369> <DAE0>
+<536A> <536A> <856D>
+<536B> <536B> <CEC0>
+<536C> <536D> <856E>
+<536E> <536E> <D8B4>
+<536F> <536F> <C3AE>
+<5370> <5370> <D3A1>
+<5371> <5371> <CEA3>
+<5372> <5372> <8570>
+<5373> <5373> <BCB4>
+<5374> <5374> <C8B4>
+<5375> <5375> <C2D1>
+<5376> <5376> <8571>
+<5377> <5377> <BEED>
+<5378> <5378> <D0B6>
+<5379> <5379> <8572>
+<537A> <537A> <DAE1>
+<537B> <537E> <8573>
+<537F> <537F> <C7E4>
+<5380> <5381> <8577>
+<5382> <5382> <B3A7>
+<5383> <5383> <8579>
+<5384> <5384> <B6F2>
+endbfrange
+
+100 beginbfrange
+<5385> <5385> <CCFC>
+<5386> <5386> <C0FA>
+<5387> <5388> <857A>
+<5389> <5389> <C0F7>
+<538A> <538A> <857C>
+<538B> <538B> <D1B9>
+<538C> <538C> <D1E1>
+<538D> <538D> <D8C7>
+<538E> <538F> <857D>
+<5390> <5394> <8580>
+<5395> <5395> <B2DE>
+<5396> <5397> <8585>
+<5398> <5398> <C0E5>
+<5399> <5399> <8587>
+<539A> <539A> <BAF1>
+<539B> <539C> <8588>
+<539D> <539D> <D8C8>
+<539E> <539E> <858A>
+<539F> <539F> <D4AD>
+<53A0> <53A1> <858B>
+<53A2> <53A2> <CFE1>
+<53A3> <53A3> <D8C9>
+<53A4> <53A4> <858D>
+<53A5> <53A5> <D8CA>
+<53A6> <53A6> <CFC3>
+<53A7> <53A7> <858E>
+<53A8> <53A8> <B3F8>
+<53A9> <53A9> <BEC7>
+<53AA> <53AD> <858F>
+<53AE> <53AE> <D8CB>
+<53AF> <53B5> <8593>
+<53B6> <53B6> <DBCC>
+<53B7> <53BA> <859A>
+<53BB> <53BB> <C8A5>
+<53BC> <53BE> <859E>
+<53BF> <53BF> <CFD8>
+<53C0> <53C0> <85A1>
+<53C1> <53C1> <C8FE>
+<53C2> <53C2> <B2CE>
+<53C3> <53C7> <85A2>
+<53C8> <53C8> <D3D6>
+<53C9> <53C9> <B2E6>
+<53CA> <53CA> <BCB0>
+<53CB> <53CB> <D3D1>
+<53CC> <53CC> <CBAB>
+<53CD> <53CD> <B7B4>
+<53CE> <53D0> <85A7>
+<53D1> <53D1> <B7A2>
+<53D2> <53D3> <85AA>
+<53D4> <53D4> <CAE5>
+<53D5> <53D5> <85AC>
+<53D6> <53D6> <C8A1>
+<53D7> <53D7> <CADC>
+<53D8> <53D8> <B1E4>
+<53D9> <53D9> <D0F0>
+<53DA> <53DA> <85AD>
+<53DB> <53DB> <C5D1>
+<53DC> <53DE> <85AE>
+<53DF> <53DF> <DBC5>
+<53E0> <53E0> <B5FE>
+<53E1> <53E2> <85B1>
+<53E3> <53E3> <BFDA>
+<53E4> <53E4> <B9C5>
+<53E5> <53E5> <BEE4>
+<53E6> <53E6> <C1ED>
+<53E7> <53E7> <85B3>
+<53E8> <53E8> <DFB6>
+<53E9> <53E9> <DFB5>
+<53EA> <53EA> <D6BB>
+<53EB> <53EB> <BDD0>
+<53EC> <53EC> <D5D9>
+<53ED> <53ED> <B0C8>
+<53EE> <53EE> <B6A3>
+<53EF> <53EF> <BFC9>
+<53F0> <53F0> <CCA8>
+<53F1> <53F1> <DFB3>
+<53F2> <53F2> <CAB7>
+<53F3> <53F3> <D3D2>
+<53F4> <53F4> <85B4>
+<53F5> <53F5> <D8CF>
+<53F6> <53F6> <D2B6>
+<53F7> <53F7> <BAC5>
+<53F8> <53F8> <CBBE>
+<53F9> <53F9> <CCBE>
+<53FA> <53FA> <85B5>
+<53FB> <53FB> <DFB7>
+<53FC> <53FC> <B5F0>
+<53FD> <53FD> <DFB4>
+<53FE> <53FF> <85B6>
+<5400> <5400> <85B8>
+<5401> <5401> <D3F5>
+<5402> <5402> <85B9>
+<5403> <5403> <B3D4>
+<5404> <5404> <B8F7>
+<5405> <5405> <85BA>
+<5406> <5406> <DFBA>
+<5407> <5407> <85BB>
+<5408> <5408> <BACF>
+<5409> <5409> <BCAA>
+<540A> <540A> <B5F5>
+endbfrange
+
+100 beginbfrange
+<540B> <540B> <85BC>
+<540C> <540C> <CDAC>
+<540D> <540D> <C3FB>
+<540E> <540E> <BAF3>
+<540F> <540F> <C0F4>
+<5410> <5410> <CDC2>
+<5411> <5411> <CFF2>
+<5412> <5412> <DFB8>
+<5413> <5413> <CFC5>
+<5414> <5414> <85BD>
+<5415> <5415> <C2C0>
+<5416> <5416> <DFB9>
+<5417> <5417> <C2F0>
+<5418> <541A> <85BE>
+<541B> <541B> <BEFD>
+<541C> <541C> <85C1>
+<541D> <541D> <C1DF>
+<541E> <541E> <CDCC>
+<541F> <541F> <D2F7>
+<5420> <5420> <B7CD>
+<5421> <5421> <DFC1>
+<5422> <5422> <85C2>
+<5423> <5423> <DFC4>
+<5424> <5425> <85C3>
+<5426> <5426> <B7F1>
+<5427> <5427> <B0C9>
+<5428> <5428> <B6D6>
+<5429> <5429> <B7D4>
+<542A> <542A> <85C5>
+<542B> <542B> <BAAC>
+<542C> <542C> <CCFD>
+<542D> <542D> <BFD4>
+<542E> <542E> <CBB1>
+<542F> <542F> <C6F4>
+<5430> <5430> <85C6>
+<5431> <5431> <D6A8>
+<5432> <5432> <DFC5>
+<5433> <5433> <85C7>
+<5434> <5434> <CEE2>
+<5435> <5435> <B3B3>
+<5436> <5437> <85C8>
+<5438> <5438> <CEFC>
+<5439> <5439> <B4B5>
+<543A> <543A> <85CA>
+<543B> <543B> <CEC7>
+<543C> <543C> <BAF0>
+<543D> <543D> <85CB>
+<543E> <543E> <CEE1>
+<543F> <543F> <85CC>
+<5440> <5440> <D1BD>
+<5441> <5442> <85CD>
+<5443> <5443> <DFC0>
+<5444> <5445> <85CF>
+<5446> <5446> <B4F4>
+<5447> <5447> <85D1>
+<5448> <5448> <B3CA>
+<5449> <5449> <85D2>
+<544A> <544A> <B8E6>
+<544B> <544B> <DFBB>
+<544C> <544F> <85D3>
+<5450> <5450> <C4C5>
+<5451> <5451> <85D7>
+<5452> <5454> <DFBC>
+<5455> <5455> <C5BB>
+<5456> <5456> <DFBF>
+<5457> <5457> <DFC2>
+<5458> <5458> <D4B1>
+<5459> <5459> <DFC3>
+<545A> <545A> <85D8>
+<545B> <545B> <C7BA>
+<545C> <545C> <CED8>
+<545D> <5461> <85D9>
+<5462> <5462> <C4D8>
+<5463> <5463> <85DE>
+<5464> <5464> <DFCA>
+<5465> <5465> <85DF>
+<5466> <5466> <DFCF>
+<5467> <5467> <85E0>
+<5468> <5468> <D6DC>
+<5469> <5470> <85E1>
+<5471> <5471> <DFC9>
+<5472> <5472> <DFDA>
+<5473> <5473> <CEB6>
+<5474> <5474> <85E9>
+<5475> <5475> <BAC7>
+<5476> <5476> <DFCE>
+<5477> <5477> <DFC8>
+<5478> <5478> <C5DE>
+<5479> <547A> <85EA>
+<547B> <547B> <C9EB>
+<547C> <547C> <BAF4>
+<547D> <547D> <C3FC>
+<547E> <547F> <85EC>
+<5480> <5480> <BED7>
+<5481> <5481> <85EE>
+<5482> <5482> <DFC6>
+<5483> <5483> <85EF>
+<5484> <5484> <DFCD>
+<5485> <5485> <85F0>
+<5486> <5486> <C5D8>
+endbfrange
+
+100 beginbfrange
+<5487> <548A> <85F1>
+<548B> <548B> <D5A6>
+<548C> <548C> <BACD>
+<548D> <548D> <85F5>
+<548E> <548E> <BECC>
+<548F> <548F> <D3BD>
+<5490> <5490> <B8C0>
+<5491> <5491> <85F6>
+<5492> <5492> <D6E4>
+<5493> <5493> <85F7>
+<5494> <5494> <DFC7>
+<5495> <5495> <B9BE>
+<5496> <5496> <BFA7>
+<5497> <5498> <85F8>
+<5499> <5499> <C1FC>
+<549A> <549B> <DFCB>
+<549C> <549C> <85FA>
+<549D> <549D> <DFD0>
+<549E> <54A1> <85FB>
+<54A2> <54A2> <8640>
+<54A3> <54A3> <DFDB>
+<54A4> <54A4> <DFE5>
+<54A5> <54A5> <8641>
+<54A6> <54A6> <DFD7>
+<54A7> <54A7> <DFD6>
+<54A8> <54A8> <D7C9>
+<54A9> <54AA> <DFE3>
+<54AB> <54AB> <E5EB>
+<54AC> <54AC> <D2A7>
+<54AD> <54AD> <DFD2>
+<54AE> <54AE> <8642>
+<54AF> <54AF> <BFA9>
+<54B0> <54B0> <8643>
+<54B1> <54B1> <D4DB>
+<54B2> <54B2> <8644>
+<54B3> <54B3> <BFC8>
+<54B4> <54B4> <DFD4>
+<54B5> <54B7> <8645>
+<54B8> <54B8> <CFCC>
+<54B9> <54BA> <8648>
+<54BB> <54BB> <DFDD>
+<54BC> <54BC> <864A>
+<54BD> <54BD> <D1CA>
+<54BE> <54BE> <864B>
+<54BF> <54BF> <DFDE>
+<54C0> <54C0> <B0A7>
+<54C1> <54C1> <C6B7>
+<54C2> <54C2> <DFD3>
+<54C3> <54C3> <864C>
+<54C4> <54C4> <BAE5>
+<54C5> <54C5> <864D>
+<54C6> <54C6> <B6DF>
+<54C7> <54C7> <CDDB>
+<54C8> <54C8> <B9FE>
+<54C9> <54C9> <D4D5>
+<54CA> <54CB> <864E>
+<54CC> <54CC> <DFDF>
+<54CD> <54CD> <CFEC>
+<54CE> <54CE> <B0A5>
+<54CF> <54CF> <DFE7>
+<54D0> <54D0> <DFD1>
+<54D1> <54D1> <D1C6>
+<54D2> <54D2> <DFD5>
+<54D3> <54D4> <DFD8>
+<54D5> <54D5> <DFDC>
+<54D6> <54D6> <8650>
+<54D7> <54D7> <BBA9>
+<54D8> <54D8> <8651>
+<54D9> <54DA> <DFE0>
+<54DB> <54DB> <8652>
+<54DC> <54DC> <DFE2>
+<54DD> <54DD> <DFE6>
+<54DE> <54DE> <DFE8>
+<54DF> <54DF> <D3B4>
+<54E0> <54E4> <8653>
+<54E5> <54E5> <B8E7>
+<54E6> <54E6> <C5B6>
+<54E7> <54E7> <DFEA>
+<54E8> <54E8> <C9DA>
+<54E9> <54E9> <C1A8>
+<54EA> <54EA> <C4C4>
+<54EB> <54EC> <8658>
+<54ED> <54ED> <BFDE>
+<54EE> <54EE> <CFF8>
+<54EF> <54F1> <865A>
+<54F2> <54F2> <D5DC>
+<54F3> <54F3> <DFEE>
+<54F4> <54F9> <865D>
+<54FA> <54FA> <B2B8>
+<54FB> <54FB> <8663>
+<54FC> <54FC> <BADF>
+<54FD> <54FD> <DFEC>
+<54FE> <54FE> <8664>
+<54FF> <54FF> <DBC1>
+<5500> <5500> <8665>
+<5501> <5501> <D1E4>
+<5502> <5505> <8666>
+<5506> <5506> <CBF4>
+<5507> <5507> <B4BD>
+<5508> <5508> <866A>
+endbfrange
+
+100 beginbfrange
+<5509> <5509> <B0A6>
+<550A> <550E> <866B>
+<550F> <550F> <DFF1>
+<5510> <5510> <CCC6>
+<5511> <5511> <DFF2>
+<5512> <5513> <8670>
+<5514> <5514> <DFED>
+<5515> <551A> <8672>
+<551B> <551B> <DFE9>
+<551C> <551F> <8678>
+<5520> <5520> <DFEB>
+<5521> <5521> <867C>
+<5522> <5523> <DFEF>
+<5524> <5524> <BBBD>
+<5525> <5526> <867D>
+<5527> <5527> <DFF3>
+<5528> <5529> <8680>
+<552A> <552A> <DFF4>
+<552B> <552B> <8682>
+<552C> <552C> <BBA3>
+<552D> <552D> <8683>
+<552E> <552E> <CADB>
+<552F> <552F> <CEA8>
+<5530> <5530> <E0A7>
+<5531> <5531> <B3AA>
+<5532> <5532> <8684>
+<5533> <5533> <E0A6>
+<5534> <5536> <8685>
+<5537> <5537> <E0A1>
+<5538> <553B> <8688>
+<553C> <553C> <DFFE>
+<553D> <553D> <868C>
+<553E> <553E> <CDD9>
+<553F> <553F> <DFFC>
+<5540> <5540> <868D>
+<5541> <5541> <DFFA>
+<5542> <5542> <868E>
+<5543> <5543> <BFD0>
+<5544> <5544> <D7C4>
+<5545> <5545> <868F>
+<5546> <5546> <C9CC>
+<5547> <5548> <8690>
+<5549> <5549> <DFF8>
+<554A> <554A> <B0A1>
+<554B> <554F> <8692>
+<5550> <5550> <DFFD>
+<5551> <5554> <8697>
+<5555> <5555> <DFFB>
+<5556> <5556> <E0A2>
+<5557> <555B> <869B>
+<555C> <555C> <E0A8>
+<555D> <5560> <86A0>
+<5561> <5561> <B7C8>
+<5562> <5563> <86A4>
+<5564> <5564> <C6A1>
+<5565> <5565> <C9B6>
+<5566> <5566> <C0B2>
+<5567> <5567> <DFF5>
+<5568> <5569> <86A6>
+<556A> <556A> <C5BE>
+<556B> <556B> <86A8>
+<556C> <556C> <D8C4>
+<556D> <556D> <DFF9>
+<556E> <556E> <C4F6>
+<556F> <5574> <86A9>
+<5575> <5577> <E0A3>
+<5578> <5578> <D0A5>
+<5579> <557A> <86AF>
+<557B> <557B> <E0B4>
+<557C> <557C> <CCE4>
+<557D> <557D> <86B1>
+<557E> <557E> <E0B1>
+<557F> <557F> <86B2>
+<5580> <5580> <BFA6>
+<5581> <5581> <E0AF>
+<5582> <5582> <CEB9>
+<5583> <5583> <E0AB>
+<5584> <5584> <C9C6>
+<5585> <5586> <86B3>
+<5587> <5587> <C0AE>
+<5588> <5588> <E0AE>
+<5589> <5589> <BAED>
+<558A> <558A> <BAB0>
+<558B> <558B> <E0A9>
+<558C> <558E> <86B5>
+<558F> <558F> <DFF6>
+<5590> <5590> <86B8>
+<5591> <5591> <E0B3>
+<5592> <5593> <86B9>
+<5594> <5594> <E0B8>
+<5595> <5597> <86BB>
+<5598> <5598> <B4AD>
+<5599> <5599> <E0B9>
+<559A> <559B> <86BE>
+<559C> <559C> <CFB2>
+<559D> <559D> <BAC8>
+<559E> <559E> <86C0>
+<559F> <559F> <E0B0>
+<55A0> <55A6> <86C1>
+<55A7> <55A7> <D0FA>
+endbfrange
+
+100 beginbfrange
+<55A8> <55B0> <86C8>
+<55B1> <55B1> <E0AC>
+<55B2> <55B2> <86D1>
+<55B3> <55B3> <D4FB>
+<55B4> <55B4> <86D2>
+<55B5> <55B5> <DFF7>
+<55B6> <55B6> <86D3>
+<55B7> <55B7> <C5E7>
+<55B8> <55B8> <86D4>
+<55B9> <55B9> <E0AD>
+<55BA> <55BA> <86D5>
+<55BB> <55BB> <D3F7>
+<55BC> <55BC> <86D6>
+<55BD> <55BE> <E0B6>
+<55BF> <55C3> <86D7>
+<55C4> <55C4> <E0C4>
+<55C5> <55C5> <D0E1>
+<55C6> <55C8> <86DC>
+<55C9> <55C9> <E0BC>
+<55CA> <55CB> <86DF>
+<55CC> <55CD> <E0C9>
+<55CE> <55D0> <86E1>
+<55D1> <55D1> <E0BE>
+<55D2> <55D2> <E0AA>
+<55D3> <55D3> <C9A4>
+<55D4> <55D4> <E0C1>
+<55D5> <55D5> <86E4>
+<55D6> <55D6> <E0B2>
+<55D7> <55DB> <86E5>
+<55DC> <55DC> <CAC8>
+<55DD> <55DD> <E0C3>
+<55DE> <55DE> <86EA>
+<55DF> <55DF> <E0B5>
+<55E0> <55E0> <86EB>
+<55E1> <55E1> <CECB>
+<55E2> <55E2> <86EC>
+<55E3> <55E3> <CBC3>
+<55E4> <55E4> <E0CD>
+<55E5> <55E5> <E0C6>
+<55E6> <55E6> <E0C2>
+<55E7> <55E7> <86ED>
+<55E8> <55E8> <E0CB>
+<55E9> <55E9> <86EE>
+<55EA> <55EA> <E0BA>
+<55EB> <55EC> <E0BF>
+<55ED> <55EE> <86EF>
+<55EF> <55EF> <E0C5>
+<55F0> <55F1> <86F1>
+<55F2> <55F3> <E0C7>
+<55F4> <55F4> <86F3>
+<55F5> <55F5> <E0CC>
+<55F6> <55F6> <86F4>
+<55F7> <55F7> <E0BB>
+<55F8> <55FC> <86F5>
+<55FD> <55FD> <CBD4>
+<55FE> <55FE> <E0D5>
+<55FF> <55FF> <86FA>
+<5600> <5600> <E0D6>
+<5601> <5601> <E0D2>
+<5602> <5605> <86FB>
+<5606> <5607> <8740>
+<5608> <5608> <E0D0>
+<5609> <5609> <BCCE>
+<560A> <560B> <8742>
+<560C> <560C> <E0D1>
+<560D> <560D> <8744>
+<560E> <560E> <B8C2>
+<560F> <560F> <D8C5>
+<5610> <5617> <8745>
+<5618> <5618> <D0EA>
+<5619> <561A> <874D>
+<561B> <561B> <C2EF>
+<561C> <561D> <874F>
+<561E> <561E> <E0CF>
+<561F> <561F> <E0BD>
+<5620> <5622> <8751>
+<5623> <5623> <E0D4>
+<5624> <5624> <E0D3>
+<5625> <5626> <8754>
+<5627> <5627> <E0D7>
+<5628> <562B> <8756>
+<562C> <562C> <E0DC>
+<562D> <562D> <E0D8>
+<562E> <5630> <875A>
+<5631> <5631> <D6F6>
+<5632> <5632> <B3B0>
+<5633> <5633> <875D>
+<5634> <5634> <D7EC>
+<5635> <5635> <875E>
+<5636> <5636> <CBBB>
+<5637> <5638> <875F>
+<5639> <5639> <E0DA>
+<563A> <563A> <8761>
+<563B> <563B> <CEFB>
+<563C> <563E> <8762>
+<563F> <563F> <BAD9>
+<5640> <564B> <8765>
+<564C> <564C> <E0E1>
+<564D> <564D> <E0DD>
+<564E> <564E> <D2AD>
+endbfrange
+
+100 beginbfrange
+<564F> <5653> <8771>
+<5654> <5654> <E0E2>
+<5655> <5656> <8776>
+<5657> <5657> <E0DB>
+<5658> <5658> <E0D9>
+<5659> <5659> <E0DF>
+<565A> <565B> <8778>
+<565C> <565C> <E0E0>
+<565D> <5661> <877A>
+<5662> <5662> <E0DE>
+<5663> <5663> <8780>
+<5664> <5664> <E0E4>
+<5665> <5667> <8781>
+<5668> <5668> <C6F7>
+<5669> <5669> <D8AC>
+<566A> <566A> <D4EB>
+<566B> <566B> <E0E6>
+<566C> <566C> <CAC9>
+<566D> <5670> <8784>
+<5671> <5671> <E0E5>
+<5672> <5675> <8788>
+<5676> <5676> <B8C1>
+<5677> <567A> <878C>
+<567B> <567C> <E0E7>
+<567D> <5684> <8790>
+<5685> <5685> <E0E9>
+<5686> <5686> <E0E3>
+<5687> <568D> <8798>
+<568E> <568E> <BABF>
+<568F> <568F> <CCE7>
+<5690> <5692> <879F>
+<5693> <5693> <E0EA>
+<5694> <56A2> <87A2>
+<56A3> <56A3> <CFF9>
+<56A4> <56AE> <87B1>
+<56AF> <56AF> <E0EB>
+<56B0> <56B6> <87BC>
+<56B7> <56B7> <C8C2>
+<56B8> <56BB> <87C3>
+<56BC> <56BC> <BDC0>
+<56BD> <56C9> <87C7>
+<56CA> <56CA> <C4D2>
+<56CB> <56D3> <87D4>
+<56D4> <56D4> <E0EC>
+<56D5> <56D6> <87DD>
+<56D7> <56D7> <E0ED>
+<56D8> <56D9> <87DF>
+<56DA> <56DA> <C7F4>
+<56DB> <56DB> <CBC4>
+<56DC> <56DC> <87E1>
+<56DD> <56DD> <E0EE>
+<56DE> <56DE> <BBD8>
+<56DF> <56DF> <D8B6>
+<56E0> <56E0> <D2F2>
+<56E1> <56E1> <E0EF>
+<56E2> <56E2> <CDC5>
+<56E3> <56E3> <87E2>
+<56E4> <56E4> <B6DA>
+<56E5> <56EA> <87E3>
+<56EB> <56EB> <E0F1>
+<56EC> <56EC> <87E9>
+<56ED> <56ED> <D4B0>
+<56EE> <56EF> <87EA>
+<56F0> <56F0> <C0A7>
+<56F1> <56F1> <B4D1>
+<56F2> <56F3> <87EC>
+<56F4> <56F4> <CEA7>
+<56F5> <56F5> <E0F0>
+<56F6> <56F8> <87EE>
+<56F9> <56F9> <E0F2>
+<56FA> <56FA> <B9CC>
+<56FB> <56FC> <87F1>
+<56FD> <56FD> <B9FA>
+<56FE> <56FE> <CDBC>
+<56FF> <56FF> <E0F3>
+<5700> <5702> <87F3>
+<5703> <5703> <C6D4>
+<5704> <5704> <E0F4>
+<5705> <5705> <87F6>
+<5706> <5706> <D4B2>
+<5707> <5707> <87F7>
+<5708> <5708> <C8A6>
+<5709> <5709> <E0F6>
+<570A> <570A> <E0F5>
+<570B> <5711> <87F8>
+<5712> <571B> <8840>
+<571C> <571C> <E0F7>
+<571D> <571E> <884A>
+<571F> <571F> <CDC1>
+<5720> <5722> <884C>
+<5723> <5723> <CAA5>
+<5724> <5727> <884F>
+<5728> <5728> <D4DA>
+<5729> <5729> <DBD7>
+<572A> <572A> <DBD9>
+<572B> <572B> <8853>
+<572C> <572C> <DBD8>
+<572D> <572D> <B9E7>
+<572E> <572F> <DBDC>
+<5730> <5730> <B5D8>
+endbfrange
+
+100 beginbfrange
+<5731> <5732> <8854>
+<5733> <5733> <DBDA>
+<5734> <5738> <8856>
+<5739> <5739> <DBDB>
+<573A> <573A> <B3A1>
+<573B> <573B> <DBDF>
+<573C> <573D> <885B>
+<573E> <573E> <BBF8>
+<573F> <573F> <885D>
+<5740> <5740> <D6B7>
+<5741> <5741> <885E>
+<5742> <5742> <DBE0>
+<5743> <5746> <885F>
+<5747> <5747> <BEF9>
+<5748> <5749> <8863>
+<574A> <574A> <B7BB>
+<574B> <574B> <8865>
+<574C> <574C> <DBD0>
+<574D> <574D> <CCAE>
+<574E> <574E> <BFB2>
+<574F> <574F> <BBB5>
+<5750> <5750> <D7F8>
+<5751> <5751> <BFD3>
+<5752> <5756> <8866>
+<5757> <5757> <BFE9>
+<5758> <5759> <886B>
+<575A> <575A> <BCE1>
+<575B> <575B> <CCB3>
+<575C> <575C> <DBDE>
+<575D> <575D> <B0D3>
+<575E> <575E> <CEEB>
+<575F> <575F> <B7D8>
+<5760> <5760> <D7B9>
+<5761> <5761> <C6C2>
+<5762> <5763> <886D>
+<5764> <5764> <C0A4>
+<5765> <5765> <886F>
+<5766> <5766> <CCB9>
+<5767> <5767> <8870>
+<5768> <5768> <DBE7>
+<5769> <5769> <DBE1>
+<576A> <576A> <C6BA>
+<576B> <576B> <DBE3>
+<576C> <576C> <8871>
+<576D> <576D> <DBE8>
+<576E> <576E> <8872>
+<576F> <576F> <C5F7>
+<5770> <5772> <8873>
+<5773> <5773> <DBEA>
+<5774> <5775> <8876>
+<5776> <5776> <DBE9>
+<5777> <5777> <BFC0>
+<5778> <577A> <8878>
+<577B> <577B> <DBE6>
+<577C> <577C> <DBE5>
+<577D> <5780> <887B>
+<5781> <5781> <8880>
+<5782> <5782> <B4B9>
+<5783> <5783> <C0AC>
+<5784> <5784> <C2A2>
+<5785> <5785> <DBE2>
+<5786> <5786> <DBE4>
+<5787> <578A> <8881>
+<578B> <578B> <D0CD>
+<578C> <578C> <DBED>
+<578D> <5791> <8885>
+<5792> <5792> <C0DD>
+<5793> <5793> <DBF2>
+<5794> <579A> <888A>
+<579B> <579B> <B6E2>
+<579C> <579F> <8891>
+<57A0> <57A0> <DBF3>
+<57A1> <57A1> <DBD2>
+<57A2> <57A2> <B9B8>
+<57A3> <57A3> <D4AB>
+<57A4> <57A4> <DBEC>
+<57A5> <57A5> <8895>
+<57A6> <57A6> <BFD1>
+<57A7> <57A7> <DBF0>
+<57A8> <57A8> <8896>
+<57A9> <57A9> <DBD1>
+<57AA> <57AA> <8897>
+<57AB> <57AB> <B5E6>
+<57AC> <57AC> <8898>
+<57AD> <57AD> <DBEB>
+<57AE> <57AE> <BFE5>
+<57AF> <57B1> <8899>
+<57B2> <57B2> <DBEE>
+<57B3> <57B3> <889C>
+<57B4> <57B4> <DBF1>
+<57B5> <57B7> <889D>
+<57B8> <57B8> <DBF9>
+<57B9> <57C1> <88A0>
+<57C2> <57C2> <B9A1>
+<57C3> <57C3> <B0A3>
+<57C4> <57CA> <88A9>
+<57CB> <57CB> <C2F1>
+<57CC> <57CD> <88B0>
+<57CE> <57CE> <B3C7>
+<57CF> <57CF> <DBEF>
+endbfrange
+
+100 beginbfrange
+<57D0> <57D1> <88B2>
+<57D2> <57D2> <DBF8>
+<57D3> <57D3> <88B4>
+<57D4> <57D4> <C6D2>
+<57D5> <57D5> <DBF4>
+<57D6> <57D7> <88B5>
+<57D8> <57D8> <DBF5>
+<57D9> <57D9> <DBF7>
+<57DA> <57DA> <DBF6>
+<57DB> <57DC> <88B7>
+<57DD> <57DD> <DBFE>
+<57DE> <57DE> <88B9>
+<57DF> <57DF> <D3F2>
+<57E0> <57E0> <B2BA>
+<57E1> <57E3> <88BA>
+<57E4> <57E4> <DBFD>
+<57E5> <57EC> <88BD>
+<57ED> <57ED> <DCA4>
+<57EE> <57EE> <88C5>
+<57EF> <57EF> <DBFB>
+<57F0> <57F3> <88C6>
+<57F4> <57F4> <DBFA>
+<57F5> <57F7> <88CA>
+<57F8> <57F8> <DBFC>
+<57F9> <57F9> <C5E0>
+<57FA> <57FA> <BBF9>
+<57FB> <57FC> <88CD>
+<57FD> <57FD> <DCA3>
+<57FE> <57FF> <88CF>
+<5800> <5800> <DCA5>
+<5801> <5801> <88D1>
+<5802> <5802> <CCC3>
+<5803> <5805> <88D2>
+<5806> <5806> <B6D1>
+<5807> <5807> <DDC0>
+<5808> <580A> <88D5>
+<580B> <580B> <DCA1>
+<580C> <580C> <88D8>
+<580D> <580D> <DCA2>
+<580E> <5810> <88D9>
+<5811> <5811> <C7B5>
+<5812> <5814> <88DC>
+<5815> <5815> <B6E9>
+<5816> <5818> <88DF>
+<5819> <5819> <DCA7>
+<581A> <581D> <88E2>
+<581E> <581E> <DCA6>
+<581F> <581F> <88E6>
+<5820> <5820> <DCA9>
+<5821> <5821> <B1A4>
+<5822> <5823> <88E7>
+<5824> <5824> <B5CC>
+<5825> <5829> <88E9>
+<582A> <582A> <BFB0>
+<582B> <582F> <88EE>
+<5830> <5830> <D1DF>
+<5831> <5834> <88F3>
+<5835> <5835> <B6C2>
+<5836> <583D> <88F7>
+<583E> <5843> <8940>
+<5844> <5844> <DCA8>
+<5845> <584B> <8946>
+<584C> <584C> <CBFA>
+<584D> <584D> <EBF3>
+<584E> <5850> <894D>
+<5851> <5851> <CBDC>
+<5852> <5853> <8950>
+<5854> <5854> <CBFE>
+<5855> <5857> <8952>
+<5858> <5858> <CCC1>
+<5859> <585D> <8955>
+<585E> <585E> <C8FB>
+<585F> <5864> <895A>
+<5865> <5865> <DCAA>
+<5866> <586A> <8960>
+<586B> <586B> <CCEE>
+<586C> <586C> <DCAB>
+<586D> <587D> <8965>
+<587E> <587E> <DBD3>
+<587F> <587F> <8976>
+<5880> <5880> <DCAF>
+<5881> <5881> <DCAC>
+<5882> <5882> <8977>
+<5883> <5883> <BEB3>
+<5884> <5884> <8978>
+<5885> <5885> <CAFB>
+<5886> <5888> <8979>
+<5889> <5889> <DCAD>
+<588A> <588C> <897C>
+<588D> <5891> <8980>
+<5892> <5892> <C9CA>
+<5893> <5893> <C4B9>
+<5894> <5898> <8985>
+<5899> <5899> <C7BD>
+<589A> <589A> <DCAE>
+<589B> <589D> <898A>
+<589E> <589E> <D4F6>
+<589F> <589F> <D0E6>
+<58A0> <58A7> <898D>
+<58A8> <58A8> <C4AB>
+endbfrange
+
+100 beginbfrange
+<58A9> <58A9> <B6D5>
+<58AA> <58BB> <8995>
+<58BC> <58BC> <DBD4>
+<58BD> <58C0> <89A7>
+<58C1> <58C1> <B1DA>
+<58C2> <58C4> <89AB>
+<58C5> <58C5> <DBD5>
+<58C6> <58D0> <89AE>
+<58D1> <58D1> <DBD6>
+<58D2> <58D4> <89B9>
+<58D5> <58D5> <BABE>
+<58D6> <58E3> <89BC>
+<58E4> <58E4> <C8C0>
+<58E5> <58EA> <89CA>
+<58EB> <58EB> <CABF>
+<58EC> <58EC> <C8C9>
+<58ED> <58ED> <89D0>
+<58EE> <58EE> <D7B3>
+<58EF> <58EF> <89D1>
+<58F0> <58F0> <C9F9>
+<58F1> <58F2> <89D2>
+<58F3> <58F3> <BFC7>
+<58F4> <58F5> <89D4>
+<58F6> <58F6> <BAF8>
+<58F7> <58F8> <89D6>
+<58F9> <58F9> <D2BC>
+<58FA> <58FF> <89D8>
+<5900> <5901> <89DE>
+<5902> <5902> <E2BA>
+<5903> <5903> <89E0>
+<5904> <5904> <B4A6>
+<5905> <5906> <89E1>
+<5907> <5907> <B1B8>
+<5908> <590C> <89E3>
+<590D> <590D> <B8B4>
+<590E> <590E> <89E8>
+<590F> <590F> <CFC4>
+<5910> <5913> <89E9>
+<5914> <5914> <D9E7>
+<5915> <5915> <CFA6>
+<5916> <5916> <CDE2>
+<5917> <5918> <89ED>
+<5919> <5919> <D9ED>
+<591A> <591A> <B6E0>
+<591B> <591B> <89EF>
+<591C> <591C> <D2B9>
+<591D> <591E> <89F0>
+<591F> <591F> <B9BB>
+<5920> <5923> <89F2>
+<5924> <5924> <E2B9>
+<5925> <5925> <E2B7>
+<5926> <5926> <89F6>
+<5927> <5927> <B4F3>
+<5928> <5928> <89F7>
+<5929> <5929> <CCEC>
+<592A> <592A> <CCAB>
+<592B> <592B> <B7F2>
+<592C> <592C> <89F8>
+<592D> <592D> <D8B2>
+<592E> <592E> <D1EB>
+<592F> <592F> <BABB>
+<5930> <5930> <89F9>
+<5931> <5931> <CAA7>
+<5932> <5933> <89FA>
+<5934> <5934> <CDB7>
+<5935> <5936> <89FC>
+<5937> <5937> <D2C4>
+<5938> <5938> <BFE4>
+<5939> <5939> <BCD0>
+<593A> <593A> <B6E1>
+<593B> <593B> <89FE>
+<593C> <593C> <DEC5>
+<593D> <5940> <8A40>
+<5941> <5941> <DEC6>
+<5942> <5942> <DBBC>
+<5943> <5943> <8A44>
+<5944> <5944> <D1D9>
+<5945> <5946> <8A45>
+<5947> <5947> <C6E6>
+<5948> <5948> <C4CE>
+<5949> <5949> <B7EE>
+<594A> <594A> <8A47>
+<594B> <594B> <B7DC>
+<594C> <594D> <8A48>
+<594E> <594E> <BFFC>
+<594F> <594F> <D7E0>
+<5950> <5950> <8A4A>
+<5951> <5951> <C6F5>
+<5952> <5953> <8A4B>
+<5954> <5954> <B1BC>
+<5955> <5955> <DEC8>
+<5956> <5956> <BDB1>
+<5957> <5957> <CCD7>
+<5958> <5958> <DECA>
+<5959> <5959> <8A4D>
+<595A> <595A> <DEC9>
+<595B> <595F> <8A4E>
+<5960> <5960> <B5EC>
+<5961> <5961> <8A53>
+<5962> <5962> <C9DD>
+endbfrange
+
+100 beginbfrange
+<5963> <5964> <8A54>
+<5965> <5965> <B0C2>
+<5966> <5972> <8A56>
+<5973> <5973> <C5AE>
+<5974> <5974> <C5AB>
+<5975> <5975> <8A63>
+<5976> <5976> <C4CC>
+<5977> <5977> <8A64>
+<5978> <5978> <BCE9>
+<5979> <5979> <CBFD>
+<597A> <597C> <8A65>
+<597D> <597D> <BAC3>
+<597E> <5980> <8A68>
+<5981> <5981> <E5F9>
+<5982> <5982> <C8E7>
+<5983> <5983> <E5FA>
+<5984> <5984> <CDFD>
+<5985> <5985> <8A6B>
+<5986> <5986> <D7B1>
+<5987> <5987> <B8BE>
+<5988> <5988> <C2E8>
+<5989> <5989> <8A6C>
+<598A> <598A> <C8D1>
+<598B> <598C> <8A6D>
+<598D> <598D> <E5FB>
+<598E> <5991> <8A6F>
+<5992> <5992> <B6CA>
+<5993> <5993> <BCCB>
+<5994> <5995> <8A73>
+<5996> <5996> <D1FD>
+<5997> <5997> <E6A1>
+<5998> <5998> <8A75>
+<5999> <5999> <C3EE>
+<599A> <599D> <8A76>
+<599E> <599E> <E6A4>
+<599F> <59A2> <8A7A>
+<59A3> <59A3> <E5FE>
+<59A4> <59A4> <E6A5>
+<59A5> <59A5> <CDD7>
+<59A6> <59A6> <8A7E>
+<59A7> <59A7> <8A80>
+<59A8> <59A8> <B7C1>
+<59A9> <59AA> <E5FC>
+<59AB> <59AB> <E6A3>
+<59AC> <59AD> <8A81>
+<59AE> <59AE> <C4DD>
+<59AF> <59AF> <E6A8>
+<59B0> <59B1> <8A83>
+<59B2> <59B2> <E6A7>
+<59B3> <59B8> <8A85>
+<59B9> <59B9> <C3C3>
+<59BA> <59BA> <8A8B>
+<59BB> <59BB> <C6DE>
+<59BC> <59BD> <8A8C>
+<59BE> <59BE> <E6AA>
+<59BF> <59C5> <8A8E>
+<59C6> <59C6> <C4B7>
+<59C7> <59C9> <8A95>
+<59CA> <59CA> <E6A2>
+<59CB> <59CB> <CABC>
+<59CC> <59CF> <8A98>
+<59D0> <59D0> <BDE3>
+<59D1> <59D1> <B9C3>
+<59D2> <59D2> <E6A6>
+<59D3> <59D3> <D0D5>
+<59D4> <59D4> <CEAF>
+<59D5> <59D6> <8A9C>
+<59D7> <59D7> <E6A9>
+<59D8> <59D8> <E6B0>
+<59D9> <59D9> <8A9E>
+<59DA> <59DA> <D2A6>
+<59DB> <59DB> <8A9F>
+<59DC> <59DC> <BDAA>
+<59DD> <59DD> <E6AD>
+<59DE> <59E2> <8AA0>
+<59E3> <59E3> <E6AF>
+<59E4> <59E4> <8AA5>
+<59E5> <59E5> <C0D1>
+<59E6> <59E7> <8AA6>
+<59E8> <59E8> <D2CC>
+<59E9> <59EB> <8AA8>
+<59EC> <59EC> <BCA7>
+<59ED> <59F8> <8AAB>
+<59F9> <59F9> <E6B1>
+<59FA> <59FA> <8AB7>
+<59FB> <59FB> <D2F6>
+<59FC> <59FE> <8AB8>
+<59FF> <59FF> <D7CB>
+<5A00> <5A00> <8ABB>
+<5A01> <5A01> <CDFE>
+<5A02> <5A02> <8ABC>
+<5A03> <5A03> <CDDE>
+<5A04> <5A04> <C2A6>
+<5A05> <5A06> <E6AB>
+<5A07> <5A07> <BDBF>
+<5A08> <5A08> <E6AE>
+<5A09> <5A09> <E6B3>
+<5A0A> <5A0B> <8ABD>
+<5A0C> <5A0C> <E6B2>
+<5A0D> <5A10> <8ABF>
+endbfrange
+
+100 beginbfrange
+<5A11> <5A11> <E6B6>
+<5A12> <5A12> <8AC3>
+<5A13> <5A13> <E6B8>
+<5A14> <5A17> <8AC4>
+<5A18> <5A18> <C4EF>
+<5A19> <5A1B> <8AC8>
+<5A1C> <5A1C> <C4C8>
+<5A1D> <5A1E> <8ACB>
+<5A1F> <5A1F> <BEEA>
+<5A20> <5A20> <C9EF>
+<5A21> <5A22> <8ACD>
+<5A23> <5A23> <E6B7>
+<5A24> <5A24> <8ACF>
+<5A25> <5A25> <B6F0>
+<5A26> <5A28> <8AD0>
+<5A29> <5A29> <C3E4>
+<5A2A> <5A30> <8AD3>
+<5A31> <5A31> <D3E9>
+<5A32> <5A32> <E6B4>
+<5A33> <5A33> <8ADA>
+<5A34> <5A34> <E6B5>
+<5A35> <5A35> <8ADB>
+<5A36> <5A36> <C8A2>
+<5A37> <5A3B> <8ADC>
+<5A3C> <5A3C> <E6BD>
+<5A3D> <5A3F> <8AE1>
+<5A40> <5A40> <E6B9>
+<5A41> <5A45> <8AE4>
+<5A46> <5A46> <C6C5>
+<5A47> <5A48> <8AE9>
+<5A49> <5A49> <CDF1>
+<5A4A> <5A4A> <E6BB>
+<5A4B> <5A54> <8AEB>
+<5A55> <5A55> <E6BC>
+<5A56> <5A59> <8AF5>
+<5A5A> <5A5A> <BBE9>
+<5A5B> <5A60> <8AF9>
+<5A61> <5A61> <8B40>
+<5A62> <5A62> <E6BE>
+<5A63> <5A66> <8B41>
+<5A67> <5A67> <E6BA>
+<5A68> <5A69> <8B45>
+<5A6A> <5A6A> <C0B7>
+<5A6B> <5A73> <8B47>
+<5A74> <5A74> <D3A4>
+<5A75> <5A75> <E6BF>
+<5A76> <5A76> <C9F4>
+<5A77> <5A77> <E6C3>
+<5A78> <5A79> <8B50>
+<5A7A> <5A7A> <E6C4>
+<5A7B> <5A7E> <8B52>
+<5A7F> <5A7F> <D0F6>
+<5A80> <5A91> <8B56>
+<5A92> <5A92> <C3BD>
+<5A93> <5A99> <8B68>
+<5A9A> <5A9A> <C3C4>
+<5A9B> <5A9B> <E6C2>
+<5A9C> <5AA9> <8B6F>
+<5AAA> <5AAA> <E6C1>
+<5AAB> <5AAC> <8B7D>
+<5AAD> <5AB1> <8B80>
+<5AB2> <5AB2> <E6C7>
+<5AB3> <5AB3> <CFB1>
+<5AB4> <5AB4> <8B85>
+<5AB5> <5AB5> <EBF4>
+<5AB6> <5AB7> <8B86>
+<5AB8> <5AB8> <E6CA>
+<5AB9> <5ABD> <8B88>
+<5ABE> <5ABE> <E6C5>
+<5ABF> <5AC0> <8B8D>
+<5AC1> <5AC1> <BCDE>
+<5AC2> <5AC2> <C9A9>
+<5AC3> <5AC8> <8B8F>
+<5AC9> <5AC9> <BCB5>
+<5ACA> <5ACB> <8B95>
+<5ACC> <5ACC> <CFD3>
+<5ACD> <5AD1> <8B97>
+<5AD2> <5AD2> <E6C8>
+<5AD3> <5AD3> <8B9C>
+<5AD4> <5AD4> <E6C9>
+<5AD5> <5AD5> <8B9D>
+<5AD6> <5AD6> <E6CE>
+<5AD7> <5AD7> <8B9E>
+<5AD8> <5AD8> <E6D0>
+<5AD9> <5ADB> <8B9F>
+<5ADC> <5ADC> <E6D1>
+<5ADD> <5ADF> <8BA2>
+<5AE0> <5AE0> <E6CB>
+<5AE1> <5AE1> <B5D5>
+<5AE2> <5AE2> <8BA5>
+<5AE3> <5AE3> <E6CC>
+<5AE4> <5AE5> <8BA6>
+<5AE6> <5AE6> <E6CF>
+<5AE7> <5AE8> <8BA8>
+<5AE9> <5AE9> <C4DB>
+<5AEA> <5AEA> <8BAA>
+<5AEB> <5AEB> <E6C6>
+<5AEC> <5AF0> <8BAB>
+<5AF1> <5AF1> <E6CD>
+<5AF2> <5AFF> <8BB0>
+endbfrange
+
+100 beginbfrange
+<5B00> <5B08> <8BBE>
+<5B09> <5B09> <E6D2>
+<5B0A> <5B15> <8BC7>
+<5B16> <5B16> <E6D4>
+<5B17> <5B17> <E6D3>
+<5B18> <5B31> <8BD3>
+<5B32> <5B32> <E6D5>
+<5B33> <5B33> <8BED>
+<5B34> <5B34> <D9F8>
+<5B35> <5B36> <8BEE>
+<5B37> <5B37> <E6D6>
+<5B38> <5B3F> <8BF0>
+<5B40> <5B40> <E6D7>
+<5B41> <5B47> <8BF8>
+<5B48> <5B4F> <8C40>
+<5B50> <5B50> <D7D3>
+<5B51> <5B51> <E6DD>
+<5B52> <5B52> <8C48>
+<5B53> <5B53> <E6DE>
+<5B54> <5B54> <BFD7>
+<5B55> <5B55> <D4D0>
+<5B56> <5B56> <8C49>
+<5B57> <5B57> <D7D6>
+<5B58> <5B58> <B4E6>
+<5B59> <5B59> <CBEF>
+<5B5A> <5B5A> <E6DA>
+<5B5B> <5B5B> <D8C3>
+<5B5C> <5B5C> <D7CE>
+<5B5D> <5B5D> <D0A2>
+<5B5E> <5B5E> <8C4A>
+<5B5F> <5B5F> <C3CF>
+<5B60> <5B61> <8C4B>
+<5B62> <5B62> <E6DF>
+<5B63> <5B63> <BCBE>
+<5B64> <5B64> <B9C2>
+<5B65> <5B65> <E6DB>
+<5B66> <5B66> <D1A7>
+<5B67> <5B68> <8C4D>
+<5B69> <5B69> <BAA2>
+<5B6A> <5B6A> <C2CF>
+<5B6B> <5B6B> <8C4F>
+<5B6C> <5B6C> <D8AB>
+<5B6D> <5B6F> <8C50>
+<5B70> <5B70> <CAEB>
+<5B71> <5B71> <E5EE>
+<5B72> <5B72> <8C53>
+<5B73> <5B73> <E6DC>
+<5B74> <5B74> <8C54>
+<5B75> <5B75> <B7F5>
+<5B76> <5B79> <8C55>
+<5B7A> <5B7A> <C8E6>
+<5B7B> <5B7C> <8C59>
+<5B7D> <5B7D> <C4F5>
+<5B7E> <5B7F> <8C5B>
+<5B80> <5B80> <E5B2>
+<5B81> <5B81> <C4FE>
+<5B82> <5B82> <8C5D>
+<5B83> <5B83> <CBFC>
+<5B84> <5B84> <E5B3>
+<5B85> <5B85> <D5AC>
+<5B86> <5B86> <8C5E>
+<5B87> <5B87> <D3EE>
+<5B88> <5B88> <CAD8>
+<5B89> <5B89> <B0B2>
+<5B8A> <5B8A> <8C5F>
+<5B8B> <5B8B> <CBCE>
+<5B8C> <5B8C> <CDEA>
+<5B8D> <5B8E> <8C60>
+<5B8F> <5B8F> <BAEA>
+<5B90> <5B92> <8C62>
+<5B93> <5B93> <E5B5>
+<5B94> <5B94> <8C65>
+<5B95> <5B95> <E5B4>
+<5B96> <5B96> <8C66>
+<5B97> <5B97> <D7DA>
+<5B98> <5B98> <B9D9>
+<5B99> <5B99> <D6E6>
+<5B9A> <5B9A> <B6A8>
+<5B9B> <5B9B> <CDF0>
+<5B9C> <5B9C> <D2CB>
+<5B9D> <5B9D> <B1A6>
+<5B9E> <5B9E> <CAB5>
+<5B9F> <5B9F> <8C67>
+<5BA0> <5BA0> <B3E8>
+<5BA1> <5BA1> <C9F3>
+<5BA2> <5BA2> <BFCD>
+<5BA3> <5BA3> <D0FB>
+<5BA4> <5BA4> <CAD2>
+<5BA5> <5BA5> <E5B6>
+<5BA6> <5BA6> <BBC2>
+<5BA7> <5BA9> <8C68>
+<5BAA> <5BAA> <CFDC>
+<5BAB> <5BAB> <B9AC>
+<5BAC> <5BAF> <8C6B>
+<5BB0> <5BB0> <D4D7>
+<5BB1> <5BB2> <8C6F>
+<5BB3> <5BB3> <BAA6>
+<5BB4> <5BB4> <D1E7>
+<5BB5> <5BB5> <CFFC>
+<5BB6> <5BB6> <BCD2>
+endbfrange
+
+100 beginbfrange
+<5BB7> <5BB7> <8C71>
+<5BB8> <5BB8> <E5B7>
+<5BB9> <5BB9> <C8DD>
+<5BBA> <5BBC> <8C72>
+<5BBD> <5BBD> <BFED>
+<5BBE> <5BBE> <B1F6>
+<5BBF> <5BBF> <CBDE>
+<5BC0> <5BC1> <8C75>
+<5BC2> <5BC2> <BCC5>
+<5BC3> <5BC3> <8C77>
+<5BC4> <5BC4> <BCC4>
+<5BC5> <5BC5> <D2FA>
+<5BC6> <5BC6> <C3DC>
+<5BC7> <5BC7> <BFDC>
+<5BC8> <5BCB> <8C78>
+<5BCC> <5BCC> <B8BB>
+<5BCD> <5BCF> <8C7C>
+<5BD0> <5BD0> <C3C2>
+<5BD1> <5BD1> <8C80>
+<5BD2> <5BD2> <BAAE>
+<5BD3> <5BD3> <D4A2>
+<5BD4> <5BDC> <8C81>
+<5BDD> <5BDD> <C7DE>
+<5BDE> <5BDE> <C4AF>
+<5BDF> <5BDF> <B2EC>
+<5BE0> <5BE0> <8C8A>
+<5BE1> <5BE1> <B9D1>
+<5BE2> <5BE3> <8C8B>
+<5BE4> <5BE4> <E5BB>
+<5BE5> <5BE5> <C1C8>
+<5BE6> <5BE7> <8C8D>
+<5BE8> <5BE8> <D5AF>
+<5BE9> <5BED> <8C8F>
+<5BEE> <5BEE> <E5BC>
+<5BEF> <5BEF> <8C94>
+<5BF0> <5BF0> <E5BE>
+<5BF1> <5BF7> <8C95>
+<5BF8> <5BF8> <B4E7>
+<5BF9> <5BF9> <B6D4>
+<5BFA> <5BFA> <CBC2>
+<5BFB> <5BFB> <D1B0>
+<5BFC> <5BFC> <B5BC>
+<5BFD> <5BFE> <8C9C>
+<5BFF> <5BFF> <CAD9>
+<5C00> <5C00> <8C9E>
+<5C01> <5C01> <B7E2>
+<5C02> <5C03> <8C9F>
+<5C04> <5C04> <C9E4>
+<5C05> <5C05> <8CA1>
+<5C06> <5C06> <BDAB>
+<5C07> <5C08> <8CA2>
+<5C09> <5C09> <CEBE>
+<5C0A> <5C0A> <D7F0>
+<5C0B> <5C0E> <8CA4>
+<5C0F> <5C0F> <D0A1>
+<5C10> <5C10> <8CA8>
+<5C11> <5C11> <C9D9>
+<5C12> <5C13> <8CA9>
+<5C14> <5C14> <B6FB>
+<5C15> <5C15> <E6D8>
+<5C16> <5C16> <BCE2>
+<5C17> <5C17> <8CAB>
+<5C18> <5C18> <B3BE>
+<5C19> <5C19> <8CAC>
+<5C1A> <5C1A> <C9D0>
+<5C1B> <5C1B> <8CAD>
+<5C1C> <5C1C> <E6D9>
+<5C1D> <5C1D> <B3A2>
+<5C1E> <5C21> <8CAE>
+<5C22> <5C22> <DECC>
+<5C23> <5C23> <8CB2>
+<5C24> <5C24> <D3C8>
+<5C25> <5C25> <DECD>
+<5C26> <5C26> <8CB3>
+<5C27> <5C27> <D2A2>
+<5C28> <5C2B> <8CB4>
+<5C2C> <5C2C> <DECE>
+<5C2D> <5C30> <8CB8>
+<5C31> <5C31> <BECD>
+<5C32> <5C33> <8CBC>
+<5C34> <5C34> <DECF>
+<5C35> <5C37> <8CBE>
+<5C38> <5C38> <CAAC>
+<5C39> <5C39> <D2FC>
+<5C3A> <5C3A> <B3DF>
+<5C3B> <5C3B> <E5EA>
+<5C3C> <5C3C> <C4E1>
+<5C3D> <5C3D> <BEA1>
+<5C3E> <5C3E> <CEB2>
+<5C3F> <5C3F> <C4F2>
+<5C40> <5C40> <BED6>
+<5C41> <5C41> <C6A8>
+<5C42> <5C42> <B2E3>
+<5C43> <5C44> <8CC1>
+<5C45> <5C45> <BED3>
+<5C46> <5C47> <8CC3>
+<5C48> <5C48> <C7FC>
+<5C49> <5C49> <CCEB>
+<5C4A> <5C4A> <BDEC>
+<5C4B> <5C4B> <CEDD>
+endbfrange
+
+100 beginbfrange
+<5C4C> <5C4D> <8CC5>
+<5C4E> <5C4E> <CABA>
+<5C4F> <5C4F> <C6C1>
+<5C50> <5C50> <E5EC>
+<5C51> <5C51> <D0BC>
+<5C52> <5C54> <8CC7>
+<5C55> <5C55> <D5B9>
+<5C56> <5C58> <8CCA>
+<5C59> <5C59> <E5ED>
+<5C5A> <5C5D> <8CCD>
+<5C5E> <5C5E> <CAF4>
+<5C5F> <5C5F> <8CD1>
+<5C60> <5C60> <CDC0>
+<5C61> <5C61> <C2C5>
+<5C62> <5C62> <8CD2>
+<5C63> <5C63> <E5EF>
+<5C64> <5C64> <8CD3>
+<5C65> <5C65> <C2C4>
+<5C66> <5C66> <E5F0>
+<5C67> <5C6D> <8CD4>
+<5C6E> <5C6E> <E5F8>
+<5C6F> <5C6F> <CDCD>
+<5C70> <5C70> <8CDB>
+<5C71> <5C71> <C9BD>
+<5C72> <5C78> <8CDC>
+<5C79> <5C79> <D2D9>
+<5C7A> <5C7A> <E1A8>
+<5C7B> <5C7E> <8CE3>
+<5C7F> <5C7F> <D3EC>
+<5C80> <5C80> <8CE7>
+<5C81> <5C81> <CBEA>
+<5C82> <5C82> <C6F1>
+<5C83> <5C87> <8CE8>
+<5C88> <5C88> <E1AC>
+<5C89> <5C8B> <8CED>
+<5C8C> <5C8C> <E1A7>
+<5C8D> <5C8D> <E1A9>
+<5C8E> <5C8F> <8CF0>
+<5C90> <5C90> <E1AA>
+<5C91> <5C91> <E1AF>
+<5C92> <5C93> <8CF2>
+<5C94> <5C94> <B2ED>
+<5C95> <5C95> <8CF4>
+<5C96> <5C96> <E1AB>
+<5C97> <5C97> <B8DA>
+<5C98> <5C99> <E1AD>
+<5C9A> <5C9A> <E1B0>
+<5C9B> <5C9B> <B5BA>
+<5C9C> <5C9C> <E1B1>
+<5C9D> <5CA1> <8CF5>
+<5CA2> <5CA2> <E1B3>
+<5CA3> <5CA3> <E1B8>
+<5CA4> <5CA8> <8CFA>
+<5CA9> <5CA9> <D1D2>
+<5CAA> <5CAA> <8D40>
+<5CAB> <5CAB> <E1B6>
+<5CAC> <5CAC> <E1B5>
+<5CAD> <5CAD> <C1EB>
+<5CAE> <5CB0> <8D41>
+<5CB1> <5CB1> <E1B7>
+<5CB2> <5CB2> <8D44>
+<5CB3> <5CB3> <D4C0>
+<5CB4> <5CB4> <8D45>
+<5CB5> <5CB5> <E1B2>
+<5CB6> <5CB6> <8D46>
+<5CB7> <5CB7> <E1BA>
+<5CB8> <5CB8> <B0B6>
+<5CB9> <5CBC> <8D47>
+<5CBD> <5CBD> <E1B4>
+<5CBE> <5CBE> <8D4B>
+<5CBF> <5CBF> <BFF9>
+<5CC0> <5CC0> <8D4C>
+<5CC1> <5CC1> <E1B9>
+<5CC2> <5CC3> <8D4D>
+<5CC4> <5CC4> <E1BB>
+<5CC5> <5CCA> <8D4F>
+<5CCB> <5CCB> <E1BE>
+<5CCC> <5CD1> <8D55>
+<5CD2> <5CD2> <E1BC>
+<5CD3> <5CD8> <8D5B>
+<5CD9> <5CD9> <D6C5>
+<5CDA> <5CE0> <8D61>
+<5CE1> <5CE1> <CFBF>
+<5CE2> <5CE3> <8D68>
+<5CE4> <5CE4> <E1BD>
+<5CE5> <5CE5> <E1BF>
+<5CE6> <5CE6> <C2CD>
+<5CE7> <5CE7> <8D6A>
+<5CE8> <5CE8> <B6EB>
+<5CE9> <5CE9> <8D6B>
+<5CEA> <5CEA> <D3F8>
+<5CEB> <5CEC> <8D6C>
+<5CED> <5CED> <C7CD>
+<5CEE> <5CEF> <8D6E>
+<5CF0> <5CF0> <B7E5>
+<5CF1> <5CFA> <8D70>
+<5CFB> <5CFB> <BEFE>
+<5CFC> <5CFF> <8D7A>
+<5D00> <5D00> <8D7E>
+<5D01> <5D01> <8D80>
+endbfrange
+
+100 beginbfrange
+<5D02> <5D03> <E1C0>
+<5D04> <5D05> <8D81>
+<5D06> <5D06> <E1C7>
+<5D07> <5D07> <B3E7>
+<5D08> <5D0D> <8D83>
+<5D0E> <5D0E> <C6E9>
+<5D0F> <5D13> <8D89>
+<5D14> <5D14> <B4DE>
+<5D15> <5D15> <8D8E>
+<5D16> <5D16> <D1C2>
+<5D17> <5D1A> <8D8F>
+<5D1B> <5D1B> <E1C8>
+<5D1C> <5D1D> <8D93>
+<5D1E> <5D1E> <E1C6>
+<5D1F> <5D23> <8D95>
+<5D24> <5D24> <E1C5>
+<5D25> <5D25> <8D9A>
+<5D26> <5D26> <E1C3>
+<5D27> <5D27> <E1C2>
+<5D28> <5D28> <8D9B>
+<5D29> <5D29> <B1C0>
+<5D2A> <5D2C> <8D9C>
+<5D2D> <5D2D> <D5B8>
+<5D2E> <5D2E> <E1C4>
+<5D2F> <5D33> <8D9F>
+<5D34> <5D34> <E1CB>
+<5D35> <5D3C> <8DA4>
+<5D3D> <5D3D> <E1CC>
+<5D3E> <5D3E> <E1CA>
+<5D3F> <5D46> <8DAC>
+<5D47> <5D47> <EFFA>
+<5D48> <5D49> <8DB4>
+<5D4A> <5D4A> <E1D3>
+<5D4B> <5D4B> <E1D2>
+<5D4C> <5D4C> <C7B6>
+<5D4D> <5D57> <8DB6>
+<5D58> <5D58> <E1C9>
+<5D59> <5D5A> <8DC1>
+<5D5B> <5D5B> <E1CE>
+<5D5C> <5D5C> <8DC3>
+<5D5D> <5D5D> <E1D0>
+<5D5E> <5D68> <8DC4>
+<5D69> <5D69> <E1D4>
+<5D6A> <5D6A> <8DCF>
+<5D6B> <5D6B> <E1D1>
+<5D6C> <5D6C> <E1CD>
+<5D6D> <5D6E> <8DD0>
+<5D6F> <5D6F> <E1CF>
+<5D70> <5D73> <8DD2>
+<5D74> <5D74> <E1D5>
+<5D75> <5D81> <8DD6>
+<5D82> <5D82> <E1D6>
+<5D83> <5D98> <8DE3>
+<5D99> <5D99> <E1D7>
+<5D9A> <5D9C> <8DF9>
+<5D9D> <5D9D> <E1D8>
+<5D9E> <5DA0> <8DFC>
+<5DA1> <5DB6> <8E40>
+<5DB7> <5DB7> <E1DA>
+<5DB8> <5DC4> <8E56>
+<5DC5> <5DC5> <E1DB>
+<5DC6> <5DCC> <8E63>
+<5DCD> <5DCD> <CEA1>
+<5DCE> <5DDA> <8E6A>
+<5DDB> <5DDB> <E7DD>
+<5DDC> <5DDC> <8E77>
+<5DDD> <5DDD> <B4A8>
+<5DDE> <5DDE> <D6DD>
+<5DDF> <5DE0> <8E78>
+<5DE1> <5DE1> <D1B2>
+<5DE2> <5DE2> <B3B2>
+<5DE3> <5DE4> <8E7A>
+<5DE5> <5DE5> <B9A4>
+<5DE6> <5DE6> <D7F3>
+<5DE7> <5DE7> <C7C9>
+<5DE8> <5DE8> <BEDE>
+<5DE9> <5DE9> <B9AE>
+<5DEA> <5DEA> <8E7C>
+<5DEB> <5DEB> <CED7>
+<5DEC> <5DED> <8E7D>
+<5DEE> <5DEE> <B2EE>
+<5DEF> <5DEF> <DBCF>
+<5DF0> <5DF0> <8E80>
+<5DF1> <5DF1> <BCBA>
+<5DF2> <5DF2> <D2D1>
+<5DF3> <5DF3> <CBC8>
+<5DF4> <5DF4> <B0CD>
+<5DF5> <5DF6> <8E81>
+<5DF7> <5DF7> <CFEF>
+<5DF8> <5DFC> <8E83>
+<5DFD> <5DFD> <D9E3>
+<5DFE> <5DFE> <BDED>
+<5DFF> <5DFF> <8E88>
+<5E00> <5E00> <8E89>
+<5E01> <5E01> <B1D2>
+<5E02> <5E02> <CAD0>
+<5E03> <5E03> <B2BC>
+<5E04> <5E04> <8E8A>
+<5E05> <5E05> <CBA7>
+<5E06> <5E06> <B7AB>
+endbfrange
+
+100 beginbfrange
+<5E07> <5E07> <8E8B>
+<5E08> <5E08> <CAA6>
+<5E09> <5E0B> <8E8C>
+<5E0C> <5E0C> <CFA3>
+<5E0D> <5E0E> <8E8F>
+<5E0F> <5E0F> <E0F8>
+<5E10> <5E10> <D5CA>
+<5E11> <5E11> <E0FB>
+<5E12> <5E13> <8E91>
+<5E14> <5E14> <E0FA>
+<5E15> <5E15> <C5C1>
+<5E16> <5E16> <CCFB>
+<5E17> <5E17> <8E93>
+<5E18> <5E18> <C1B1>
+<5E19> <5E19> <E0F9>
+<5E1A> <5E1A> <D6E3>
+<5E1B> <5E1B> <B2AF>
+<5E1C> <5E1C> <D6C4>
+<5E1D> <5E1D> <B5DB>
+<5E1E> <5E25> <8E94>
+<5E26> <5E26> <B4F8>
+<5E27> <5E27> <D6A1>
+<5E28> <5E2C> <8E9C>
+<5E2D> <5E2D> <CFAF>
+<5E2E> <5E2E> <B0EF>
+<5E2F> <5E30> <8EA1>
+<5E31> <5E31> <E0FC>
+<5E32> <5E36> <8EA3>
+<5E37> <5E37> <E1A1>
+<5E38> <5E38> <B3A3>
+<5E39> <5E3A> <8EA8>
+<5E3B> <5E3C> <E0FD>
+<5E3D> <5E3D> <C3B1>
+<5E3E> <5E41> <8EAA>
+<5E42> <5E42> <C3DD>
+<5E43> <5E43> <8EAE>
+<5E44> <5E44> <E1A2>
+<5E45> <5E45> <B7F9>
+<5E46> <5E4B> <8EAF>
+<5E4C> <5E4C> <BBCF>
+<5E4D> <5E53> <8EB5>
+<5E54> <5E54> <E1A3>
+<5E55> <5E55> <C4BB>
+<5E56> <5E5A> <8EBC>
+<5E5B> <5E5B> <E1A4>
+<5E5C> <5E5D> <8EC1>
+<5E5E> <5E5E> <E1A5>
+<5E5F> <5E60> <8EC3>
+<5E61> <5E61> <E1A6>
+<5E62> <5E62> <B4B1>
+<5E63> <5E71> <8EC5>
+<5E72> <5E72> <B8C9>
+<5E73> <5E73> <C6BD>
+<5E74> <5E74> <C4EA>
+<5E75> <5E75> <8ED4>
+<5E76> <5E76> <B2A2>
+<5E77> <5E77> <8ED5>
+<5E78> <5E78> <D0D2>
+<5E79> <5E79> <8ED6>
+<5E7A> <5E7A> <E7DB>
+<5E7B> <5E7B> <BBC3>
+<5E7C> <5E7C> <D3D7>
+<5E7D> <5E7D> <D3C4>
+<5E7E> <5E7E> <8ED7>
+<5E7F> <5E7F> <B9E3>
+<5E80> <5E80> <E2CF>
+<5E81> <5E83> <8ED8>
+<5E84> <5E84> <D7AF>
+<5E85> <5E85> <8EDB>
+<5E86> <5E86> <C7EC>
+<5E87> <5E87> <B1D3>
+<5E88> <5E89> <8EDC>
+<5E8A> <5E8A> <B4B2>
+<5E8B> <5E8B> <E2D1>
+<5E8C> <5E8E> <8EDE>
+<5E8F> <5E8F> <D0F2>
+<5E90> <5E90> <C2AE>
+<5E91> <5E91> <E2D0>
+<5E92> <5E92> <8EE1>
+<5E93> <5E93> <BFE2>
+<5E94> <5E94> <D3A6>
+<5E95> <5E95> <B5D7>
+<5E96> <5E96> <E2D2>
+<5E97> <5E97> <B5EA>
+<5E98> <5E98> <8EE2>
+<5E99> <5E99> <C3ED>
+<5E9A> <5E9A> <B8FD>
+<5E9B> <5E9B> <8EE3>
+<5E9C> <5E9C> <B8AE>
+<5E9D> <5E9D> <8EE4>
+<5E9E> <5E9E> <C5D3>
+<5E9F> <5E9F> <B7CF>
+<5EA0> <5EA0> <E2D4>
+<5EA1> <5EA4> <8EE5>
+<5EA5> <5EA5> <E2D3>
+<5EA6> <5EA6> <B6C8>
+<5EA7> <5EA7> <D7F9>
+<5EA8> <5EAC> <8EE9>
+<5EAD> <5EAD> <CDA5>
+<5EAE> <5EB2> <8EEE>
+endbfrange
+
+100 beginbfrange
+<5EB3> <5EB3> <E2D8>
+<5EB4> <5EB4> <8EF3>
+<5EB5> <5EB5> <E2D6>
+<5EB6> <5EB6> <CAFC>
+<5EB7> <5EB7> <BFB5>
+<5EB8> <5EB8> <D3B9>
+<5EB9> <5EB9> <E2D5>
+<5EBA> <5EBD> <8EF4>
+<5EBE> <5EBE> <E2D7>
+<5EBF> <5EC5> <8EF8>
+<5EC6> <5EC8> <8F40>
+<5EC9> <5EC9> <C1AE>
+<5ECA> <5ECA> <C0C8>
+<5ECB> <5ED0> <8F43>
+<5ED1> <5ED1> <E2DB>
+<5ED2> <5ED2> <E2DA>
+<5ED3> <5ED3> <C0AA>
+<5ED4> <5ED5> <8F49>
+<5ED6> <5ED6> <C1CE>
+<5ED7> <5EDA> <8F4B>
+<5EDB> <5EDB> <E2DC>
+<5EDC> <5EE7> <8F4F>
+<5EE8> <5EE8> <E2DD>
+<5EE9> <5EE9> <8F5B>
+<5EEA> <5EEA> <E2DE>
+<5EEB> <5EF3> <8F5C>
+<5EF4> <5EF4> <DBC8>
+<5EF5> <5EF5> <8F65>
+<5EF6> <5EF6> <D1D3>
+<5EF7> <5EF7> <CDA2>
+<5EF8> <5EF9> <8F66>
+<5EFA> <5EFA> <BDA8>
+<5EFB> <5EFD> <8F68>
+<5EFE> <5EFE> <DEC3>
+<5EFF> <5EFF> <D8A5>
+<5F00> <5F00> <BFAA>
+<5F01> <5F01> <DBCD>
+<5F02> <5F02> <D2EC>
+<5F03> <5F03> <C6FA>
+<5F04> <5F04> <C5AA>
+<5F05> <5F07> <8F6B>
+<5F08> <5F08> <DEC4>
+<5F09> <5F09> <8F6E>
+<5F0A> <5F0A> <B1D7>
+<5F0B> <5F0B> <DFAE>
+<5F0C> <5F0E> <8F6F>
+<5F0F> <5F0F> <CABD>
+<5F10> <5F10> <8F72>
+<5F11> <5F11> <DFB1>
+<5F12> <5F12> <8F73>
+<5F13> <5F13> <B9AD>
+<5F14> <5F14> <8F74>
+<5F15> <5F15> <D2FD>
+<5F16> <5F16> <8F75>
+<5F17> <5F17> <B8A5>
+<5F18> <5F18> <BAEB>
+<5F19> <5F1A> <8F76>
+<5F1B> <5F1B> <B3DA>
+<5F1C> <5F1E> <8F78>
+<5F1F> <5F1F> <B5DC>
+<5F20> <5F20> <D5C5>
+<5F21> <5F24> <8F7B>
+<5F25> <5F25> <C3D6>
+<5F26> <5F26> <CFD2>
+<5F27> <5F27> <BBA1>
+<5F28> <5F28> <8F80>
+<5F29> <5F29> <E5F3>
+<5F2A> <5F2A> <E5F2>
+<5F2B> <5F2C> <8F81>
+<5F2D> <5F2D> <E5F4>
+<5F2E> <5F2E> <8F83>
+<5F2F> <5F2F> <CDE4>
+<5F30> <5F30> <8F84>
+<5F31> <5F31> <C8F5>
+<5F32> <5F38> <8F85>
+<5F39> <5F39> <B5AF>
+<5F3A> <5F3A> <C7BF>
+<5F3B> <5F3B> <8F8C>
+<5F3C> <5F3C> <E5F6>
+<5F3D> <5F3F> <8F8D>
+<5F40> <5F40> <ECB0>
+<5F41> <5F4F> <8F90>
+<5F50> <5F50> <E5E6>
+<5F51> <5F51> <8F9F>
+<5F52> <5F52> <B9E9>
+<5F53> <5F53> <B5B1>
+<5F54> <5F54> <8FA0>
+<5F55> <5F55> <C2BC>
+<5F56> <5F56> <E5E8>
+<5F57> <5F57> <E5E7>
+<5F58> <5F58> <E5E9>
+<5F59> <5F5C> <8FA1>
+<5F5D> <5F5D> <D2CD>
+<5F5E> <5F60> <8FA5>
+<5F61> <5F61> <E1EA>
+<5F62> <5F62> <D0CE>
+<5F63> <5F63> <8FA8>
+<5F64> <5F64> <CDAE>
+<5F65> <5F65> <8FA9>
+<5F66> <5F66> <D1E5>
+endbfrange
+
+100 beginbfrange
+<5F67> <5F68> <8FAA>
+<5F69> <5F69> <B2CA>
+<5F6A> <5F6A> <B1EB>
+<5F6B> <5F6B> <8FAC>
+<5F6C> <5F6C> <B1F2>
+<5F6D> <5F6D> <C5ED>
+<5F6E> <5F6F> <8FAD>
+<5F70> <5F70> <D5C3>
+<5F71> <5F71> <D3B0>
+<5F72> <5F72> <8FAF>
+<5F73> <5F73> <E1DC>
+<5F74> <5F76> <8FB0>
+<5F77> <5F77> <E1DD>
+<5F78> <5F78> <8FB3>
+<5F79> <5F79> <D2DB>
+<5F7A> <5F7A> <8FB4>
+<5F7B> <5F7B> <B3B9>
+<5F7C> <5F7C> <B1CB>
+<5F7D> <5F7F> <8FB5>
+<5F80> <5F80> <CDF9>
+<5F81> <5F81> <D5F7>
+<5F82> <5F82> <E1DE>
+<5F83> <5F83> <8FB8>
+<5F84> <5F84> <BEB6>
+<5F85> <5F85> <B4FD>
+<5F86> <5F86> <8FB9>
+<5F87> <5F87> <E1DF>
+<5F88> <5F88> <BADC>
+<5F89> <5F89> <E1E0>
+<5F8A> <5F8A> <BBB2>
+<5F8B> <5F8B> <C2C9>
+<5F8C> <5F8C> <E1E1>
+<5F8D> <5F8F> <8FBA>
+<5F90> <5F90> <D0EC>
+<5F91> <5F91> <8FBD>
+<5F92> <5F92> <CDBD>
+<5F93> <5F94> <8FBE>
+<5F95> <5F95> <E1E2>
+<5F96> <5F96> <8FC0>
+<5F97> <5F97> <B5C3>
+<5F98> <5F98> <C5C7>
+<5F99> <5F99> <E1E3>
+<5F9A> <5F9B> <8FC1>
+<5F9C> <5F9C> <E1E4>
+<5F9D> <5FA0> <8FC3>
+<5FA1> <5FA1> <D3F9>
+<5FA2> <5FA7> <8FC7>
+<5FA8> <5FA8> <E1E5>
+<5FA9> <5FA9> <8FCD>
+<5FAA> <5FAA> <D1AD>
+<5FAB> <5FAC> <8FCE>
+<5FAD> <5FAD> <E1E6>
+<5FAE> <5FAE> <CEA2>
+<5FAF> <5FB4> <8FD0>
+<5FB5> <5FB5> <E1E7>
+<5FB6> <5FB6> <8FD6>
+<5FB7> <5FB7> <B5C2>
+<5FB8> <5FBB> <8FD7>
+<5FBC> <5FBC> <E1E8>
+<5FBD> <5FBD> <BBD5>
+<5FBE> <5FC2> <8FDB>
+<5FC3> <5FC3> <D0C4>
+<5FC4> <5FC4> <E2E0>
+<5FC5> <5FC5> <B1D8>
+<5FC6> <5FC6> <D2E4>
+<5FC7> <5FC8> <8FE0>
+<5FC9> <5FC9> <E2E1>
+<5FCA> <5FCB> <8FE2>
+<5FCC> <5FCC> <BCC9>
+<5FCD> <5FCD> <C8CC>
+<5FCE> <5FCE> <8FE4>
+<5FCF> <5FCF> <E2E3>
+<5FD0> <5FD0> <ECFE>
+<5FD1> <5FD1> <ECFD>
+<5FD2> <5FD2> <DFAF>
+<5FD3> <5FD5> <8FE5>
+<5FD6> <5FD6> <E2E2>
+<5FD7> <5FD7> <D6BE>
+<5FD8> <5FD8> <CDFC>
+<5FD9> <5FD9> <C3A6>
+<5FDA> <5FDC> <8FE8>
+<5FDD> <5FDD> <E3C3>
+<5FDE> <5FDF> <8FEB>
+<5FE0> <5FE0> <D6D2>
+<5FE1> <5FE1> <E2E7>
+<5FE2> <5FE3> <8FED>
+<5FE4> <5FE4> <E2E8>
+<5FE5> <5FE6> <8FEF>
+<5FE7> <5FE7> <D3C7>
+<5FE8> <5FE9> <8FF1>
+<5FEA> <5FEA> <E2EC>
+<5FEB> <5FEB> <BFEC>
+<5FEC> <5FEC> <8FF3>
+<5FED> <5FED> <E2ED>
+<5FEE> <5FEE> <E2E5>
+<5FEF> <5FF0> <8FF4>
+<5FF1> <5FF1> <B3C0>
+<5FF2> <5FF4> <8FF6>
+<5FF5> <5FF5> <C4EE>
+<5FF6> <5FF7> <8FF9>
+endbfrange
+
+100 beginbfrange
+<5FF8> <5FF8> <E2EE>
+<5FF9> <5FFA> <8FFB>
+<5FFB> <5FFB> <D0C3>
+<5FFC> <5FFC> <8FFD>
+<5FFD> <5FFD> <BAF6>
+<5FFE> <5FFE> <E2E9>
+<5FFF> <5FFF> <B7DE>
+<6000> <6000> <BBB3>
+<6001> <6001> <CCAC>
+<6002> <6002> <CBCB>
+<6003> <6003> <E2E4>
+<6004> <6004> <E2E6>
+<6005> <6006> <E2EA>
+<6007> <6007> <8FFE>
+<6008> <6009> <9040>
+<600A> <600A> <E2F7>
+<600B> <600C> <9042>
+<600D> <600D> <E2F4>
+<600E> <600E> <D4F5>
+<600F> <600F> <E2F3>
+<6010> <6011> <9044>
+<6012> <6012> <C5AD>
+<6013> <6013> <9046>
+<6014> <6014> <D5FA>
+<6015> <6015> <C5C2>
+<6016> <6016> <B2C0>
+<6017> <6018> <9047>
+<6019> <6019> <E2EF>
+<601A> <601A> <9049>
+<601B> <601B> <E2F2>
+<601C> <601C> <C1AF>
+<601D> <601D> <CBBC>
+<601E> <601F> <904A>
+<6020> <6020> <B5A1>
+<6021> <6021> <E2F9>
+<6022> <6024> <904C>
+<6025> <6025> <BCB1>
+<6026> <6026> <E2F1>
+<6027> <6027> <D0D4>
+<6028> <6028> <D4B9>
+<6029> <6029> <E2F5>
+<602A> <602A> <B9D6>
+<602B> <602B> <E2F6>
+<602C> <602E> <904F>
+<602F> <602F> <C7D3>
+<6030> <6034> <9052>
+<6035> <6035> <E2F0>
+<6036> <603A> <9057>
+<603B> <603B> <D7DC>
+<603C> <603C> <EDA1>
+<603D> <603E> <905C>
+<603F> <603F> <E2F8>
+<6040> <6040> <905E>
+<6041> <6041> <EDA5>
+<6042> <6042> <E2FE>
+<6043> <6043> <CAD1>
+<6044> <604A> <905F>
+<604B> <604B> <C1B5>
+<604C> <604C> <9066>
+<604D> <604D> <BBD0>
+<604E> <604F> <9067>
+<6050> <6050> <BFD6>
+<6051> <6051> <9069>
+<6052> <6052> <BAE3>
+<6053> <6054> <906A>
+<6055> <6055> <CBA1>
+<6056> <6058> <906C>
+<6059> <6059> <EDA6>
+<605A> <605A> <EDA3>
+<605B> <605C> <906F>
+<605D> <605D> <EDA2>
+<605E> <6061> <9071>
+<6062> <6062> <BBD6>
+<6063> <6063> <EDA7>
+<6064> <6064> <D0F4>
+<6065> <6066> <9075>
+<6067> <6067> <EDA4>
+<6068> <6068> <BADE>
+<6069> <6069> <B6F7>
+<606A> <606A> <E3A1>
+<606B> <606B> <B6B2>
+<606C> <606C> <CCF1>
+<606D> <606D> <B9A7>
+<606E> <606E> <9077>
+<606F> <606F> <CFA2>
+<6070> <6070> <C7A1>
+<6071> <6072> <9078>
+<6073> <6073> <BFD2>
+<6074> <6075> <907A>
+<6076> <6076> <B6F1>
+<6077> <6077> <907C>
+<6078> <6079> <E2FA>
+<607A> <607A> <E2FD>
+<607B> <607B> <E2FC>
+<607C> <607C> <C4D5>
+<607D> <607D> <E3A2>
+<607E> <607E> <907D>
+<607F> <607F> <D3C1>
+<6080> <6080> <907E>
+<6081> <6082> <9080>
+endbfrange
+
+100 beginbfrange
+<6083> <6083> <E3A7>
+<6084> <6084> <C7C4>
+<6085> <6088> <9082>
+<6089> <6089> <CFA4>
+<608A> <608B> <9086>
+<608C> <608C> <E3A9>
+<608D> <608D> <BAB7>
+<608E> <6091> <9088>
+<6092> <6092> <E3A8>
+<6093> <6093> <908C>
+<6094> <6094> <BBDA>
+<6095> <6095> <908D>
+<6096> <6096> <E3A3>
+<6097> <6099> <908E>
+<609A> <609A> <E3A4>
+<609B> <609B> <E3AA>
+<609C> <609C> <9091>
+<609D> <609D> <E3A6>
+<609E> <609E> <9092>
+<609F> <609F> <CEF2>
+<60A0> <60A0> <D3C6>
+<60A1> <60A2> <9093>
+<60A3> <60A3> <BBBC>
+<60A4> <60A5> <9095>
+<60A6> <60A6> <D4C3>
+<60A7> <60A7> <9097>
+<60A8> <60A8> <C4FA>
+<60A9> <60AA> <9098>
+<60AB> <60AB> <EDA8>
+<60AC> <60AC> <D0FC>
+<60AD> <60AD> <E3A5>
+<60AE> <60AE> <909A>
+<60AF> <60AF> <C3F5>
+<60B0> <60B0> <909B>
+<60B1> <60B1> <E3AD>
+<60B2> <60B2> <B1AF>
+<60B3> <60B3> <909C>
+<60B4> <60B4> <E3B2>
+<60B5> <60B7> <909D>
+<60B8> <60B8> <BCC2>
+<60B9> <60BA> <90A0>
+<60BB> <60BB> <E3AC>
+<60BC> <60BC> <B5BF>
+<60BD> <60C4> <90A2>
+<60C5> <60C5> <C7E9>
+<60C6> <60C6> <E3B0>
+<60C7> <60C9> <90AA>
+<60CA> <60CA> <BEAA>
+<60CB> <60CB> <CDEF>
+<60CC> <60D0> <90AD>
+<60D1> <60D1> <BBF3>
+<60D2> <60D4> <90B2>
+<60D5> <60D5> <CCE8>
+<60D6> <60D7> <90B5>
+<60D8> <60D8> <E3AF>
+<60D9> <60D9> <90B7>
+<60DA> <60DA> <E3B1>
+<60DB> <60DB> <90B8>
+<60DC> <60DC> <CFA7>
+<60DD> <60DD> <E3AE>
+<60DE> <60DE> <90B9>
+<60DF> <60DF> <CEA9>
+<60E0> <60E0> <BBDD>
+<60E1> <60E5> <90BA>
+<60E6> <60E6> <B5EB>
+<60E7> <60E7> <BEE5>
+<60E8> <60E8> <B2D2>
+<60E9> <60E9> <B3CD>
+<60EA> <60EA> <90BF>
+<60EB> <60EB> <B1B9>
+<60EC> <60EC> <E3AB>
+<60ED> <60ED> <B2D1>
+<60EE> <60EE> <B5AC>
+<60EF> <60EF> <B9DF>
+<60F0> <60F0> <B6E8>
+<60F1> <60F2> <90C0>
+<60F3> <60F3> <CFEB>
+<60F4> <60F4> <E3B7>
+<60F5> <60F5> <90C2>
+<60F6> <60F6> <BBCC>
+<60F7> <60F8> <90C3>
+<60F9> <60F9> <C8C7>
+<60FA> <60FA> <D0CA>
+<60FB> <60FF> <90C5>
+<6100> <6100> <E3B8>
+<6101> <6101> <B3EE>
+<6102> <6105> <90CA>
+<6106> <6106> <EDA9>
+<6107> <6107> <90CE>
+<6108> <6108> <D3FA>
+<6109> <6109> <D3E4>
+<610A> <610C> <90CF>
+<610D> <610D> <EDAA>
+<610E> <610E> <E3B9>
+<610F> <610F> <D2E2>
+<6110> <6114> <90D2>
+<6115> <6115> <E3B5>
+<6116> <6119> <90D7>
+<611A> <611A> <D3DE>
+<611B> <611E> <90DB>
+endbfrange
+
+100 beginbfrange
+<611F> <611F> <B8D0>
+<6120> <6120> <E3B3>
+<6121> <6122> <90DF>
+<6123> <6123> <E3B6>
+<6124> <6124> <B7DF>
+<6125> <6125> <90E1>
+<6126> <6126> <E3B4>
+<6127> <6127> <C0A2>
+<6128> <612A> <90E2>
+<612B> <612B> <E3BA>
+<612C> <613E> <90E5>
+<613F> <613F> <D4B8>
+<6140> <6146> <90F8>
+<6147> <6147> <9140>
+<6148> <6148> <B4C8>
+<6149> <6149> <9141>
+<614A> <614A> <E3BB>
+<614B> <614B> <9142>
+<614C> <614C> <BBC5>
+<614D> <614D> <9143>
+<614E> <614E> <C9F7>
+<614F> <6150> <9144>
+<6151> <6151> <C9E5>
+<6152> <6154> <9146>
+<6155> <6155> <C4BD>
+<6156> <615C> <9149>
+<615D> <615D> <EDAB>
+<615E> <6161> <9150>
+<6162> <6162> <C2FD>
+<6163> <6166> <9154>
+<6167> <6167> <BBDB>
+<6168> <6168> <BFAE>
+<6169> <616F> <9158>
+<6170> <6170> <CEBF>
+<6171> <6174> <915F>
+<6175> <6175> <E3BC>
+<6176> <6176> <9163>
+<6177> <6177> <BFB6>
+<6178> <618A> <9164>
+<618B> <618B> <B1EF>
+<618C> <618D> <9177>
+<618E> <618E> <D4F7>
+<618F> <6193> <9179>
+<6194> <6194> <E3BE>
+<6195> <6195> <917E>
+<6196> <619C> <9180>
+<619D> <619D> <EDAD>
+<619E> <61A6> <9187>
+<61A7> <61A7> <E3BF>
+<61A8> <61A8> <BAA9>
+<61A9> <61A9> <EDAC>
+<61AA> <61AB> <9190>
+<61AC> <61AC> <E3BD>
+<61AD> <61B6> <9192>
+<61B7> <61B7> <E3C0>
+<61B8> <61BD> <919C>
+<61BE> <61BE> <BAB6>
+<61BF> <61C1> <91A2>
+<61C2> <61C2> <B6AE>
+<61C3> <61C7> <91A5>
+<61C8> <61C8> <D0B8>
+<61C9> <61C9> <91AA>
+<61CA> <61CA> <B0C3>
+<61CB> <61CB> <EDAE>
+<61CC> <61D0> <91AB>
+<61D1> <61D1> <EDAF>
+<61D2> <61D2> <C0C1>
+<61D3> <61D3> <91B0>
+<61D4> <61D4> <E3C1>
+<61D5> <61E5> <91B1>
+<61E6> <61E6> <C5B3>
+<61E7> <61F4> <91C2>
+<61F5> <61F5> <E3C2>
+<61F6> <61FE> <91D0>
+<61FF> <61FF> <DCB2>
+<6200> <6205> <91D9>
+<6206> <6206> <EDB0>
+<6207> <6207> <91DF>
+<6208> <6208> <B8EA>
+<6209> <6209> <91E0>
+<620A> <620A> <CEEC>
+<620B> <620B> <EAA7>
+<620C> <620C> <D0E7>
+<620D> <620D> <CAF9>
+<620E> <620E> <C8D6>
+<620F> <620F> <CFB7>
+<6210> <6210> <B3C9>
+<6211> <6211> <CED2>
+<6212> <6212> <BDE4>
+<6213> <6214> <91E1>
+<6215> <6215> <E3DE>
+<6216> <6216> <BBF2>
+<6217> <6217> <EAA8>
+<6218> <6218> <D5BD>
+<6219> <6219> <91E3>
+<621A> <621A> <C6DD>
+<621B> <621B> <EAA9>
+<621C> <621E> <91E4>
+<621F> <621F> <EAAA>
+<6220> <6220> <91E7>
+endbfrange
+
+100 beginbfrange
+<6221> <6221> <EAAC>
+<6222> <6222> <EAAB>
+<6223> <6223> <91E8>
+<6224> <6224> <EAAE>
+<6225> <6225> <EAAD>
+<6226> <6229> <91E9>
+<622A> <622A> <BDD8>
+<622B> <622B> <91ED>
+<622C> <622C> <EAAF>
+<622D> <622D> <91EE>
+<622E> <622E> <C2BE>
+<622F> <6232> <91EF>
+<6233> <6233> <B4C1>
+<6234> <6234> <B4F7>
+<6235> <6236> <91F3>
+<6237> <6237> <BBA7>
+<6238> <623C> <91F5>
+<623D> <623D> <ECE6>
+<623E> <623E> <ECE5>
+<623F> <623F> <B7BF>
+<6240> <6240> <CBF9>
+<6241> <6241> <B1E2>
+<6242> <6242> <91FA>
+<6243> <6243> <ECE7>
+<6244> <6246> <91FB>
+<6247> <6247> <C9C8>
+<6248> <6249> <ECE8>
+<624A> <624A> <91FE>
+<624B> <624B> <CAD6>
+<624C> <624C> <DED0>
+<624D> <624D> <B2C5>
+<624E> <624E> <D4FA>
+<624F> <6250> <9240>
+<6251> <6251> <C6CB>
+<6252> <6252> <B0C7>
+<6253> <6253> <B4F2>
+<6254> <6254> <C8D3>
+<6255> <6257> <9242>
+<6258> <6258> <CDD0>
+<6259> <625A> <9245>
+<625B> <625B> <BFB8>
+<625C> <6262> <9247>
+<6263> <6263> <BFDB>
+<6264> <6265> <924E>
+<6266> <6266> <C7A4>
+<6267> <6267> <D6B4>
+<6268> <6268> <9250>
+<6269> <6269> <C0A9>
+<626A> <626A> <DED1>
+<626B> <626B> <C9A8>
+<626C> <626C> <D1EF>
+<626D> <626D> <C5A4>
+<626E> <626E> <B0E7>
+<626F> <626F> <B3B6>
+<6270> <6270> <C8C5>
+<6271> <6272> <9251>
+<6273> <6273> <B0E2>
+<6274> <6275> <9253>
+<6276> <6276> <B7F6>
+<6277> <6278> <9255>
+<6279> <6279> <C5FA>
+<627A> <627B> <9257>
+<627C> <627C> <B6F3>
+<627D> <627D> <9259>
+<627E> <627E> <D5D2>
+<627F> <627F> <B3D0>
+<6280> <6280> <BCBC>
+<6281> <6283> <925A>
+<6284> <6284> <B3AD>
+<6285> <6288> <925D>
+<6289> <6289> <BEF1>
+<628A> <628A> <B0D1>
+<628B> <6290> <9261>
+<6291> <6291> <D2D6>
+<6292> <6292> <CAE3>
+<6293> <6293> <D7A5>
+<6294> <6294> <9267>
+<6295> <6295> <CDB6>
+<6296> <6296> <B6B6>
+<6297> <6297> <BFB9>
+<6298> <6298> <D5DB>
+<6299> <6299> <9268>
+<629A> <629A> <B8A7>
+<629B> <629B> <C5D7>
+<629C> <629E> <9269>
+<629F> <629F> <DED2>
+<62A0> <62A0> <BFD9>
+<62A1> <62A1> <C2D5>
+<62A2> <62A2> <C7C0>
+<62A3> <62A3> <926C>
+<62A4> <62A4> <BBA4>
+<62A5> <62A5> <B1A8>
+<62A6> <62A7> <926D>
+<62A8> <62A8> <C5EA>
+<62A9> <62AA> <926F>
+<62AB> <62AB> <C5FB>
+<62AC> <62AC> <CCA7>
+<62AD> <62B0> <9271>
+<62B1> <62B1> <B1A7>
+<62B2> <62B4> <9275>
+endbfrange
+
+100 beginbfrange
+<62B5> <62B5> <B5D6>
+<62B6> <62B8> <9278>
+<62B9> <62B9> <C4A8>
+<62BA> <62BA> <927B>
+<62BB> <62BB> <DED3>
+<62BC> <62BC> <D1BA>
+<62BD> <62BD> <B3E9>
+<62BE> <62BE> <927C>
+<62BF> <62BF> <C3F2>
+<62C0> <62C1> <927D>
+<62C2> <62C2> <B7F7>
+<62C3> <62C3> <9280>
+<62C4> <62C4> <D6F4>
+<62C5> <62C5> <B5A3>
+<62C6> <62C6> <B2F0>
+<62C7> <62C7> <C4B4>
+<62C8> <62C8> <C4E9>
+<62C9> <62C9> <C0AD>
+<62CA> <62CA> <DED4>
+<62CB> <62CB> <9281>
+<62CC> <62CC> <B0E8>
+<62CD> <62CD> <C5C4>
+<62CE> <62CE> <C1E0>
+<62CF> <62CF> <9282>
+<62D0> <62D0> <B9D5>
+<62D1> <62D1> <9283>
+<62D2> <62D2> <BEDC>
+<62D3> <62D3> <CDD8>
+<62D4> <62D4> <B0CE>
+<62D5> <62D5> <9284>
+<62D6> <62D6> <CDCF>
+<62D7> <62D7> <DED6>
+<62D8> <62D8> <BED0>
+<62D9> <62D9> <D7BE>
+<62DA> <62DA> <DED5>
+<62DB> <62DB> <D5D0>
+<62DC> <62DC> <B0DD>
+<62DD> <62DE> <9285>
+<62DF> <62DF> <C4E2>
+<62E0> <62E1> <9287>
+<62E2> <62E2> <C2A3>
+<62E3> <62E3> <BCF0>
+<62E4> <62E4> <9289>
+<62E5> <62E5> <D3B5>
+<62E6> <62E6> <C0B9>
+<62E7> <62E7> <C5A1>
+<62E8> <62E8> <B2A6>
+<62E9> <62E9> <D4F1>
+<62EA> <62EB> <928A>
+<62EC> <62EC> <C0A8>
+<62ED> <62ED> <CAC3>
+<62EE> <62EE> <DED7>
+<62EF> <62EF> <D5FC>
+<62F0> <62F0> <928C>
+<62F1> <62F1> <B9B0>
+<62F2> <62F2> <928D>
+<62F3> <62F3> <C8AD>
+<62F4> <62F4> <CBA9>
+<62F5> <62F5> <928E>
+<62F6> <62F6> <DED9>
+<62F7> <62F7> <BFBD>
+<62F8> <62FB> <928F>
+<62FC> <62FC> <C6B4>
+<62FD> <62FD> <D7A7>
+<62FE> <62FE> <CAB0>
+<62FF> <62FF> <C4C3>
+<6300> <6300> <9293>
+<6301> <6301> <B3D6>
+<6302> <6302> <B9D2>
+<6303> <6306> <9294>
+<6307> <6307> <D6B8>
+<6308> <6308> <EAFC>
+<6309> <6309> <B0B4>
+<630A> <630D> <9298>
+<630E> <630E> <BFE6>
+<630F> <6310> <929C>
+<6311> <6311> <CCF4>
+<6312> <6315> <929E>
+<6316> <6316> <CDDA>
+<6317> <6319> <92A2>
+<631A> <631A> <D6BF>
+<631B> <631B> <C2CE>
+<631C> <631C> <92A5>
+<631D> <631D> <CECE>
+<631E> <631E> <CCA2>
+<631F> <631F> <D0AE>
+<6320> <6320> <C4D3>
+<6321> <6321> <B5B2>
+<6322> <6322> <DED8>
+<6323> <6323> <D5F5>
+<6324> <6324> <BCB7>
+<6325> <6325> <BBD3>
+<6326> <6327> <92A6>
+<6328> <6328> <B0A4>
+<6329> <6329> <92A8>
+<632A> <632A> <C5B2>
+<632B> <632B> <B4EC>
+<632C> <632E> <92A9>
+<632F> <632F> <D5F1>
+<6330> <6331> <92AC>
+endbfrange
+
+100 beginbfrange
+<6332> <6332> <EAFD>
+<6333> <6338> <92AE>
+<6339> <6339> <DEDA>
+<633A> <633A> <CDA6>
+<633B> <633C> <92B4>
+<633D> <633D> <CDEC>
+<633E> <6341> <92B6>
+<6342> <6342> <CEE6>
+<6343> <6343> <DEDC>
+<6344> <6344> <92BA>
+<6345> <6345> <CDB1>
+<6346> <6346> <C0A6>
+<6347> <6348> <92BB>
+<6349> <6349> <D7BD>
+<634A> <634A> <92BD>
+<634B> <634B> <DEDB>
+<634C> <634C> <B0C6>
+<634D> <634D> <BAB4>
+<634E> <634E> <C9D3>
+<634F> <634F> <C4F3>
+<6350> <6350> <BEE8>
+<6351> <6354> <92BE>
+<6355> <6355> <B2B6>
+<6356> <635D> <92C2>
+<635E> <635E> <C0CC>
+<635F> <635F> <CBF0>
+<6360> <6360> <92CA>
+<6361> <6361> <BCF1>
+<6362> <6362> <BBBB>
+<6363> <6363> <B5B7>
+<6364> <6366> <92CB>
+<6367> <6367> <C5F5>
+<6368> <6368> <92CE>
+<6369> <6369> <DEE6>
+<636A> <636C> <92CF>
+<636D> <636D> <DEE3>
+<636E> <636E> <BEDD>
+<636F> <6370> <92D2>
+<6371> <6371> <DEDF>
+<6372> <6375> <92D4>
+<6376> <6376> <B4B7>
+<6377> <6377> <BDDD>
+<6378> <6379> <92D8>
+<637A> <637A> <DEE0>
+<637B> <637B> <C4ED>
+<637C> <637F> <92DA>
+<6380> <6380> <CFC6>
+<6381> <6381> <92DE>
+<6382> <6382> <B5E0>
+<6383> <6386> <92DF>
+<6387> <6387> <B6DE>
+<6388> <6388> <CADA>
+<6389> <6389> <B5F4>
+<638A> <638A> <DEE5>
+<638B> <638B> <92E3>
+<638C> <638C> <D5C6>
+<638D> <638D> <92E4>
+<638E> <638E> <DEE1>
+<638F> <638F> <CCCD>
+<6390> <6390> <C6FE>
+<6391> <6391> <92E5>
+<6392> <6392> <C5C5>
+<6393> <6395> <92E6>
+<6396> <6396> <D2B4>
+<6397> <6397> <92E9>
+<6398> <6398> <BEF2>
+<6399> <639F> <92EA>
+<63A0> <63A0> <C2D3>
+<63A1> <63A1> <92F1>
+<63A2> <63A2> <CCBD>
+<63A3> <63A3> <B3B8>
+<63A4> <63A4> <92F2>
+<63A5> <63A5> <BDD3>
+<63A6> <63A6> <92F3>
+<63A7> <63A7> <BFD8>
+<63A8> <63A8> <CDC6>
+<63A9> <63A9> <D1DA>
+<63AA> <63AA> <B4EB>
+<63AB> <63AB> <92F4>
+<63AC> <63AC> <DEE4>
+<63AD> <63AD> <DEDD>
+<63AE> <63AE> <DEE7>
+<63AF> <63AF> <92F5>
+<63B0> <63B0> <EAFE>
+<63B1> <63B2> <92F6>
+<63B3> <63B3> <C2B0>
+<63B4> <63B4> <DEE2>
+<63B5> <63B6> <92F8>
+<63B7> <63B7> <D6C0>
+<63B8> <63B8> <B5A7>
+<63B9> <63B9> <92FA>
+<63BA> <63BA> <B2F4>
+<63BB> <63BB> <92FB>
+<63BC> <63BC> <DEE8>
+<63BD> <63BD> <92FC>
+<63BE> <63BE> <DEF2>
+<63BF> <63C0> <92FD>
+<63C1> <63C3> <9340>
+<63C4> <63C4> <DEED>
+<63C5> <63C5> <9343>
+endbfrange
+
+100 beginbfrange
+<63C6> <63C6> <DEF1>
+<63C7> <63C8> <9344>
+<63C9> <63C9> <C8E0>
+<63CA> <63CC> <9346>
+<63CD> <63CD> <D7E1>
+<63CE> <63CE> <DEEF>
+<63CF> <63CF> <C3E8>
+<63D0> <63D0> <CCE1>
+<63D1> <63D1> <9349>
+<63D2> <63D2> <B2E5>
+<63D3> <63D5> <934A>
+<63D6> <63D6> <D2BE>
+<63D7> <63DD> <934D>
+<63DE> <63DE> <DEEE>
+<63DF> <63DF> <9354>
+<63E0> <63E0> <DEEB>
+<63E1> <63E1> <CED5>
+<63E2> <63E2> <9355>
+<63E3> <63E3> <B4A7>
+<63E4> <63E8> <9356>
+<63E9> <63E9> <BFAB>
+<63EA> <63EA> <BEBE>
+<63EB> <63EC> <935B>
+<63ED> <63ED> <BDD2>
+<63EE> <63F1> <935D>
+<63F2> <63F2> <DEE9>
+<63F3> <63F3> <9361>
+<63F4> <63F4> <D4AE>
+<63F5> <63F5> <9362>
+<63F6> <63F6> <DEDE>
+<63F7> <63F7> <9363>
+<63F8> <63F8> <DEEA>
+<63F9> <63FC> <9364>
+<63FD> <63FD> <C0BF>
+<63FE> <63FE> <9368>
+<63FF> <63FF> <DEEC>
+<6400> <6400> <B2F3>
+<6401> <6401> <B8E9>
+<6402> <6402> <C2A7>
+<6403> <6404> <9369>
+<6405> <6405> <BDC1>
+<6406> <640A> <936B>
+<640B> <640B> <DEF5>
+<640C> <640C> <DEF8>
+<640D> <640E> <9370>
+<640F> <640F> <B2AB>
+<6410> <6410> <B4A4>
+<6411> <6412> <9372>
+<6413> <6413> <B4EA>
+<6414> <6414> <C9A6>
+<6415> <641A> <9374>
+<641B> <641B> <DEF6>
+<641C> <641C> <CBD1>
+<641D> <641D> <937A>
+<641E> <641E> <B8E3>
+<641F> <641F> <937B>
+<6420> <6420> <DEF7>
+<6421> <6421> <DEFA>
+<6422> <6424> <937C>
+<6425> <6425> <9380>
+<6426> <6426> <DEF9>
+<6427> <6429> <9381>
+<642A> <642A> <CCC2>
+<642B> <642B> <9384>
+<642C> <642C> <B0E1>
+<642D> <642D> <B4EE>
+<642E> <6433> <9385>
+<6434> <6434> <E5BA>
+<6435> <6439> <938B>
+<643A> <643A> <D0AF>
+<643B> <643C> <9390>
+<643D> <643D> <B2EB>
+<643E> <643E> <9392>
+<643F> <643F> <EBA1>
+<6440> <6440> <9393>
+<6441> <6441> <DEF4>
+<6442> <6443> <9394>
+<6444> <6444> <C9E3>
+<6445> <6445> <DEF3>
+<6446> <6446> <B0DA>
+<6447> <6447> <D2A1>
+<6448> <6448> <B1F7>
+<6449> <6449> <9396>
+<644A> <644A> <CCAF>
+<644B> <6451> <9397>
+<6452> <6452> <DEF0>
+<6453> <6453> <939E>
+<6454> <6454> <CBA4>
+<6455> <6457> <939F>
+<6458> <6458> <D5AA>
+<6459> <645D> <93A2>
+<645E> <645E> <DEFB>
+<645F> <6466> <93A7>
+<6467> <6467> <B4DD>
+<6468> <6468> <93AF>
+<6469> <6469> <C4A6>
+<646A> <646C> <93B0>
+<646D> <646D> <DEFD>
+<646E> <6477> <93B3>
+<6478> <6478> <C3FE>
+endbfrange
+
+100 beginbfrange
+<6479> <6479> <C4A1>
+<647A> <647A> <DFA1>
+<647B> <6481> <93BD>
+<6482> <6482> <C1CC>
+<6483> <6483> <93C4>
+<6484> <6484> <DEFC>
+<6485> <6485> <BEEF>
+<6486> <6486> <93C5>
+<6487> <6487> <C6B2>
+<6488> <6490> <93C6>
+<6491> <6491> <B3C5>
+<6492> <6492> <C8F6>
+<6493> <6494> <93CF>
+<6495> <6495> <CBBA>
+<6496> <6496> <DEFE>
+<6497> <6498> <93D1>
+<6499> <6499> <DFA4>
+<649A> <649D> <93D3>
+<649E> <649E> <D7B2>
+<649F> <64A3> <93D7>
+<64A4> <64A4> <B3B7>
+<64A5> <64A8> <93DC>
+<64A9> <64A9> <C1C3>
+<64AA> <64AB> <93E0>
+<64AC> <64AC> <C7CB>
+<64AD> <64AD> <B2A5>
+<64AE> <64AE> <B4E9>
+<64AF> <64AF> <93E2>
+<64B0> <64B0> <D7AB>
+<64B1> <64B4> <93E3>
+<64B5> <64B5> <C4EC>
+<64B6> <64B6> <93E7>
+<64B7> <64B8> <DFA2>
+<64B9> <64B9> <93E8>
+<64BA> <64BA> <DFA5>
+<64BB> <64BB> <93E9>
+<64BC> <64BC> <BAB3>
+<64BD> <64BF> <93EA>
+<64C0> <64C0> <DFA6>
+<64C1> <64C1> <93ED>
+<64C2> <64C2> <C0DE>
+<64C3> <64C4> <93EE>
+<64C5> <64C5> <C9C3>
+<64C6> <64CC> <93F0>
+<64CD> <64CD> <B2D9>
+<64CE> <64CE> <C7E6>
+<64CF> <64CF> <93F7>
+<64D0> <64D0> <DFA7>
+<64D1> <64D1> <93F8>
+<64D2> <64D2> <C7DC>
+<64D3> <64D6> <93F9>
+<64D7> <64D7> <DFA8>
+<64D8> <64D8> <EBA2>
+<64D9> <64DA> <93FD>
+<64DB> <64DD> <9440>
+<64DE> <64DE> <CBD3>
+<64DF> <64E1> <9443>
+<64E2> <64E2> <DFAA>
+<64E3> <64E3> <9446>
+<64E4> <64E4> <DFA9>
+<64E5> <64E5> <9447>
+<64E6> <64E6> <B2C1>
+<64E7> <64FF> <9448>
+<6500> <6500> <C5CA>
+<6501> <6508> <9461>
+<6509> <6509> <DFAB>
+<650A> <6511> <9469>
+<6512> <6512> <D4DC>
+<6513> <6517> <9471>
+<6518> <6518> <C8C1>
+<6519> <6521> <9476>
+<6522> <6524> <9480>
+<6525> <6525> <DFAC>
+<6526> <652A> <9483>
+<652B> <652B> <BEF0>
+<652C> <652D> <9488>
+<652E> <652E> <DFAD>
+<652F> <652F> <D6A7>
+<6530> <6533> <948A>
+<6534> <6534> <EAB7>
+<6535> <6535> <EBB6>
+<6536> <6536> <CAD5>
+<6537> <6537> <948E>
+<6538> <6538> <D8FC>
+<6539> <6539> <B8C4>
+<653A> <653A> <948F>
+<653B> <653B> <B9A5>
+<653C> <653D> <9490>
+<653E> <653E> <B7C5>
+<653F> <653F> <D5FE>
+<6540> <6544> <9492>
+<6545> <6545> <B9CA>
+<6546> <6547> <9497>
+<6548> <6548> <D0A7>
+<6549> <6549> <F4CD>
+<654A> <654B> <9499>
+<654C> <654C> <B5D0>
+<654D> <654E> <949B>
+<654F> <654F> <C3F4>
+<6550> <6550> <949D>
+endbfrange
+
+100 beginbfrange
+<6551> <6551> <BEC8>
+<6552> <6554> <949E>
+<6555> <6555> <EBB7>
+<6556> <6556> <B0BD>
+<6557> <6558> <94A1>
+<6559> <6559> <BDCC>
+<655A> <655A> <94A3>
+<655B> <655B> <C1B2>
+<655C> <655C> <94A4>
+<655D> <655D> <B1D6>
+<655E> <655E> <B3A8>
+<655F> <6561> <94A5>
+<6562> <6562> <B8D2>
+<6563> <6563> <C9A2>
+<6564> <6565> <94A8>
+<6566> <6566> <B6D8>
+<6567> <656A> <94AA>
+<656B> <656B> <EBB8>
+<656C> <656C> <BEB4>
+<656D> <656F> <94AE>
+<6570> <6570> <CAFD>
+<6571> <6571> <94B1>
+<6572> <6572> <C7C3>
+<6573> <6573> <94B2>
+<6574> <6574> <D5FB>
+<6575> <6576> <94B3>
+<6577> <6577> <B7F3>
+<6578> <6586> <94B5>
+<6587> <6587> <CEC4>
+<6588> <658A> <94C4>
+<658B> <658B> <D5AB>
+<658C> <658C> <B1F3>
+<658D> <658F> <94C7>
+<6590> <6590> <ECB3>
+<6591> <6591> <B0DF>
+<6592> <6592> <94CA>
+<6593> <6593> <ECB5>
+<6594> <6596> <94CB>
+<6597> <6597> <B6B7>
+<6598> <6598> <94CE>
+<6599> <6599> <C1CF>
+<659A> <659A> <94CF>
+<659B> <659B> <F5FA>
+<659C> <659C> <D0B1>
+<659D> <659E> <94D0>
+<659F> <659F> <D5E5>
+<65A0> <65A0> <94D2>
+<65A1> <65A1> <CED3>
+<65A2> <65A3> <94D3>
+<65A4> <65A4> <BDEF>
+<65A5> <65A5> <B3E2>
+<65A6> <65A6> <94D5>
+<65A7> <65A7> <B8AB>
+<65A8> <65A8> <94D6>
+<65A9> <65A9> <D5B6>
+<65AA> <65AA> <94D7>
+<65AB> <65AB> <EDBD>
+<65AC> <65AC> <94D8>
+<65AD> <65AD> <B6CF>
+<65AE> <65AE> <94D9>
+<65AF> <65AF> <CBB9>
+<65B0> <65B0> <D0C2>
+<65B1> <65B8> <94DA>
+<65B9> <65B9> <B7BD>
+<65BA> <65BB> <94E2>
+<65BC> <65BC> <ECB6>
+<65BD> <65BD> <CAA9>
+<65BE> <65C0> <94E4>
+<65C1> <65C1> <C5D4>
+<65C2> <65C2> <94E7>
+<65C3> <65C3> <ECB9>
+<65C4> <65C4> <ECB8>
+<65C5> <65C5> <C2C3>
+<65C6> <65C6> <ECB7>
+<65C7> <65CA> <94E8>
+<65CB> <65CB> <D0FD>
+<65CC> <65CC> <ECBA>
+<65CD> <65CD> <94EC>
+<65CE> <65CE> <ECBB>
+<65CF> <65CF> <D7E5>
+<65D0> <65D1> <94ED>
+<65D2> <65D2> <ECBC>
+<65D3> <65D5> <94EF>
+<65D6> <65D6> <ECBD>
+<65D7> <65D7> <C6EC>
+<65D8> <65DF> <94F2>
+<65E0> <65E0> <CEDE>
+<65E1> <65E1> <94FA>
+<65E2> <65E2> <BCC8>
+<65E3> <65E4> <94FB>
+<65E5> <65E5> <C8D5>
+<65E6> <65E6> <B5A9>
+<65E7> <65E7> <BEC9>
+<65E8> <65E8> <D6BC>
+<65E9> <65E9> <D4E7>
+<65EA> <65EB> <94FD>
+<65EC> <65EC> <D1AE>
+<65ED> <65ED> <D0F1>
+<65EE> <65F0> <EAB8>
+<65F1> <65F1> <BAB5>
+endbfrange
+
+100 beginbfrange
+<65F2> <65F5> <9540>
+<65F6> <65F6> <CAB1>
+<65F7> <65F7> <BFF5>
+<65F8> <65F9> <9544>
+<65FA> <65FA> <CDFA>
+<65FB> <65FF> <9546>
+<6600> <6600> <EAC0>
+<6601> <6601> <954B>
+<6602> <6602> <B0BA>
+<6603> <6603> <EABE>
+<6604> <6605> <954C>
+<6606> <6606> <C0A5>
+<6607> <6609> <954E>
+<660A> <660A> <EABB>
+<660B> <660B> <9551>
+<660C> <660C> <B2FD>
+<660D> <660D> <9552>
+<660E> <660E> <C3F7>
+<660F> <660F> <BBE8>
+<6610> <6612> <9553>
+<6613> <6613> <D2D7>
+<6614> <6614> <CEF4>
+<6615> <6615> <EABF>
+<6616> <6618> <9556>
+<6619> <6619> <EABC>
+<661A> <661C> <9559>
+<661D> <661D> <EAC3>
+<661E> <661E> <955C>
+<661F> <661F> <D0C7>
+<6620> <6620> <D3B3>
+<6621> <6624> <955D>
+<6625> <6625> <B4BA>
+<6626> <6626> <9561>
+<6627> <6627> <C3C1>
+<6628> <6628> <D7F2>
+<6629> <662C> <9562>
+<662D> <662D> <D5D1>
+<662E> <662E> <9566>
+<662F> <662F> <CAC7>
+<6630> <6630> <9567>
+<6631> <6631> <EAC5>
+<6632> <6633> <9568>
+<6634> <6634> <EAC4>
+<6635> <6635> <EAC7>
+<6636> <6636> <EAC6>
+<6637> <663B> <956A>
+<663C> <663C> <D6E7>
+<663D> <663D> <956F>
+<663E> <663E> <CFD4>
+<663F> <6640> <9570>
+<6641> <6641> <EACB>
+<6642> <6642> <9572>
+<6643> <6643> <BBCE>
+<6644> <664A> <9573>
+<664B> <664B> <BDFA>
+<664C> <664C> <C9CE>
+<664D> <664E> <957A>
+<664F> <664F> <EACC>
+<6650> <6651> <957C>
+<6652> <6652> <C9B9>
+<6653> <6653> <CFFE>
+<6654> <6654> <EACA>
+<6655> <6655> <D4CE>
+<6656> <6656> <EACD>
+<6657> <6657> <EACF>
+<6658> <6658> <957E>
+<6659> <6659> <9580>
+<665A> <665A> <CDED>
+<665B> <665E> <9581>
+<665F> <665F> <EAC9>
+<6660> <6660> <9585>
+<6661> <6661> <EACE>
+<6662> <6663> <9586>
+<6664> <6664> <CEEE>
+<6665> <6665> <9588>
+<6666> <6666> <BBDE>
+<6667> <6667> <9589>
+<6668> <6668> <B3BF>
+<6669> <666D> <958A>
+<666E> <666E> <C6D5>
+<666F> <666F> <BEB0>
+<6670> <6670> <CEFA>
+<6671> <6673> <958F>
+<6674> <6674> <C7E7>
+<6675> <6675> <9592>
+<6676> <6676> <BEA7>
+<6677> <6677> <EAD0>
+<6678> <6679> <9593>
+<667A> <667A> <D6C7>
+<667B> <667D> <9595>
+<667E> <667E> <C1C0>
+<667F> <6681> <9598>
+<6682> <6682> <D4DD>
+<6683> <6683> <959B>
+<6684> <6684> <EAD1>
+<6685> <6686> <959C>
+<6687> <6687> <CFBE>
+<6688> <668B> <959E>
+<668C> <668C> <EAD2>
+<668D> <6690> <95A2>
+endbfrange
+
+100 beginbfrange
+<6691> <6691> <CAEE>
+<6692> <6695> <95A6>
+<6696> <6696> <C5AF>
+<6697> <6697> <B0B5>
+<6698> <669C> <95AA>
+<669D> <669D> <EAD4>
+<669E> <66A6> <95AF>
+<66A7> <66A7> <EAD3>
+<66A8> <66A8> <F4DF>
+<66A9> <66AD> <95B8>
+<66AE> <66AE> <C4BA>
+<66AF> <66B3> <95BD>
+<66B4> <66B4> <B1A9>
+<66B5> <66B8> <95C2>
+<66B9> <66B9> <E5DF>
+<66BA> <66BD> <95C6>
+<66BE> <66BE> <EAD5>
+<66BF> <66D8> <95CA>
+<66D9> <66D9> <CAEF>
+<66DA> <66DA> <95E4>
+<66DB> <66DC> <EAD6>
+<66DD> <66DD> <C6D8>
+<66DE> <66E5> <95E5>
+<66E6> <66E6> <EAD8>
+<66E7> <66E8> <95ED>
+<66E9> <66E9> <EAD9>
+<66EA> <66EF> <95EF>
+<66F0> <66F0> <D4BB>
+<66F1> <66F1> <95F5>
+<66F2> <66F2> <C7FA>
+<66F3> <66F3> <D2B7>
+<66F4> <66F4> <B8FC>
+<66F5> <66F6> <95F6>
+<66F7> <66F7> <EAC2>
+<66F8> <66F8> <95F8>
+<66F9> <66F9> <B2DC>
+<66FA> <66FB> <95F9>
+<66FC> <66FC> <C2FC>
+<66FD> <66FD> <95FB>
+<66FE> <66FE> <D4F8>
+<66FF> <66FF> <CCE6>
+<6700> <6700> <D7EE>
+<6701> <6703> <95FC>
+<6704> <6707> <9640>
+<6708> <6708> <D4C2>
+<6709> <6709> <D3D0>
+<670A> <670A> <EBC3>
+<670B> <670B> <C5F3>
+<670C> <670C> <9644>
+<670D> <670D> <B7FE>
+<670E> <670F> <9645>
+<6710> <6710> <EBD4>
+<6711> <6713> <9647>
+<6714> <6714> <CBB7>
+<6715> <6715> <EBDE>
+<6716> <6716> <964A>
+<6717> <6717> <C0CA>
+<6718> <671A> <964B>
+<671B> <671B> <CDFB>
+<671C> <671C> <964E>
+<671D> <671D> <B3AF>
+<671E> <671E> <964F>
+<671F> <671F> <C6DA>
+<6720> <6725> <9650>
+<6726> <6726> <EBFC>
+<6727> <6727> <9656>
+<6728> <6728> <C4BE>
+<6729> <6729> <9657>
+<672A> <672A> <CEB4>
+<672B> <672B> <C4A9>
+<672C> <672C> <B1BE>
+<672D> <672D> <D4FD>
+<672E> <672E> <9658>
+<672F> <672F> <CAF5>
+<6730> <6730> <9659>
+<6731> <6731> <D6EC>
+<6732> <6733> <965A>
+<6734> <6734> <C6D3>
+<6735> <6735> <B6E4>
+<6736> <6739> <965C>
+<673A> <673A> <BBFA>
+<673B> <673C> <9660>
+<673D> <673D> <D0E0>
+<673E> <673F> <9662>
+<6740> <6740> <C9B1>
+<6741> <6741> <9664>
+<6742> <6742> <D4D3>
+<6743> <6743> <C8A8>
+<6744> <6745> <9665>
+<6746> <6746> <B8CB>
+<6747> <6747> <9667>
+<6748> <6748> <E8BE>
+<6749> <6749> <C9BC>
+<674A> <674B> <9668>
+<674C> <674C> <E8BB>
+<674D> <674D> <966A>
+<674E> <674E> <C0EE>
+<674F> <674F> <D0D3>
+<6750> <6750> <B2C4>
+<6751> <6751> <B4E5>
+endbfrange
+
+100 beginbfrange
+<6752> <6752> <966B>
+<6753> <6753> <E8BC>
+<6754> <6755> <966C>
+<6756> <6756> <D5C8>
+<6757> <675B> <966E>
+<675C> <675C> <B6C5>
+<675D> <675D> <9673>
+<675E> <675E> <E8BD>
+<675F> <675F> <CAF8>
+<6760> <6760> <B8DC>
+<6761> <6761> <CCF5>
+<6762> <6764> <9674>
+<6765> <6765> <C0B4>
+<6766> <6767> <9677>
+<6768> <6768> <D1EE>
+<6769> <6769> <E8BF>
+<676A> <676A> <E8C2>
+<676B> <676C> <9679>
+<676D> <676D> <BABC>
+<676E> <676E> <967B>
+<676F> <676F> <B1AD>
+<6770> <6770> <BDDC>
+<6771> <6771> <967C>
+<6772> <6772> <EABD>
+<6773> <6773> <E8C3>
+<6774> <6774> <967D>
+<6775> <6775> <E8C6>
+<6776> <6776> <967E>
+<6777> <6777> <E8CB>
+<6778> <677B> <9680>
+<677C> <677C> <E8CC>
+<677D> <677D> <9684>
+<677E> <677E> <CBC9>
+<677F> <677F> <B0E5>
+<6780> <6780> <9685>
+<6781> <6781> <BCAB>
+<6782> <6783> <9686>
+<6784> <6784> <B9B9>
+<6785> <6786> <9688>
+<6787> <6787> <E8C1>
+<6788> <6788> <968A>
+<6789> <6789> <CDF7>
+<678A> <678A> <968B>
+<678B> <678B> <E8CA>
+<678C> <678F> <968C>
+<6790> <6790> <CEF6>
+<6791> <6794> <9690>
+<6795> <6795> <D5ED>
+<6796> <6796> <9694>
+<6797> <6797> <C1D6>
+<6798> <6798> <E8C4>
+<6799> <6799> <9695>
+<679A> <679A> <C3B6>
+<679B> <679B> <9696>
+<679C> <679C> <B9FB>
+<679D> <679D> <D6A6>
+<679E> <679E> <E8C8>
+<679F> <67A1> <9697>
+<67A2> <67A2> <CAE0>
+<67A3> <67A3> <D4E6>
+<67A4> <67A4> <969A>
+<67A5> <67A5> <E8C0>
+<67A6> <67A6> <969B>
+<67A7> <67A7> <E8C5>
+<67A8> <67A8> <E8C7>
+<67A9> <67A9> <969C>
+<67AA> <67AA> <C7B9>
+<67AB> <67AB> <B7E3>
+<67AC> <67AC> <969D>
+<67AD> <67AD> <E8C9>
+<67AE> <67AE> <969E>
+<67AF> <67AF> <BFDD>
+<67B0> <67B0> <E8D2>
+<67B1> <67B2> <969F>
+<67B3> <67B3> <E8D7>
+<67B4> <67B4> <96A1>
+<67B5> <67B5> <E8D5>
+<67B6> <67B6> <BCDC>
+<67B7> <67B7> <BCCF>
+<67B8> <67B8> <E8DB>
+<67B9> <67C0> <96A2>
+<67C1> <67C1> <E8DE>
+<67C2> <67C2> <96AA>
+<67C3> <67C3> <E8DA>
+<67C4> <67C4> <B1FA>
+<67C5> <67CE> <96AB>
+<67CF> <67CF> <B0D8>
+<67D0> <67D0> <C4B3>
+<67D1> <67D1> <B8CC>
+<67D2> <67D2> <C6E2>
+<67D3> <67D3> <C8BE>
+<67D4> <67D4> <C8E1>
+<67D5> <67D7> <96B5>
+<67D8> <67D8> <E8CF>
+<67D9> <67D9> <E8D4>
+<67DA> <67DA> <E8D6>
+<67DB> <67DB> <96B8>
+<67DC> <67DC> <B9F1>
+<67DD> <67DD> <E8D8>
+<67DE> <67DE> <D7F5>
+endbfrange
+
+100 beginbfrange
+<67DF> <67DF> <96B9>
+<67E0> <67E0> <C4FB>
+<67E1> <67E1> <96BA>
+<67E2> <67E2> <E8DC>
+<67E3> <67E4> <96BB>
+<67E5> <67E5> <B2E9>
+<67E6> <67E8> <96BD>
+<67E9> <67E9> <E8D1>
+<67EA> <67EB> <96C0>
+<67EC> <67EC> <BCED>
+<67ED> <67EE> <96C2>
+<67EF> <67EF> <BFC2>
+<67F0> <67F0> <E8CD>
+<67F1> <67F1> <D6F9>
+<67F2> <67F2> <96C4>
+<67F3> <67F3> <C1F8>
+<67F4> <67F4> <B2F1>
+<67F5> <67FC> <96C5>
+<67FD> <67FD> <E8DF>
+<67FE> <67FE> <96CD>
+<67FF> <67FF> <CAC1>
+<6800> <6800> <E8D9>
+<6801> <6804> <96CE>
+<6805> <6805> <D5A4>
+<6806> <6806> <96D2>
+<6807> <6807> <B1EA>
+<6808> <6808> <D5BB>
+<6809> <6809> <E8CE>
+<680A> <680A> <E8D0>
+<680B> <680B> <B6B0>
+<680C> <680C> <E8D3>
+<680D> <680D> <96D3>
+<680E> <680E> <E8DD>
+<680F> <680F> <C0B8>
+<6810> <6810> <96D4>
+<6811> <6811> <CAF7>
+<6812> <6812> <96D5>
+<6813> <6813> <CBA8>
+<6814> <6815> <96D6>
+<6816> <6816> <C6DC>
+<6817> <6817> <C0F5>
+<6818> <681C> <96D8>
+<681D> <681D> <E8E9>
+<681E> <6820> <96DD>
+<6821> <6821> <D0A3>
+<6822> <6828> <96E0>
+<6829> <6829> <E8F2>
+<682A> <682A> <D6EA>
+<682B> <6831> <96E7>
+<6832> <6833> <E8E0>
+<6834> <6836> <96EE>
+<6837> <6837> <D1F9>
+<6838> <6838> <BACB>
+<6839> <6839> <B8F9>
+<683A> <683B> <96F1>
+<683C> <683C> <B8F1>
+<683D> <683D> <D4D4>
+<683E> <683E> <E8EF>
+<683F> <683F> <96F3>
+<6840> <6840> <E8EE>
+<6841> <6841> <E8EC>
+<6842> <6842> <B9F0>
+<6843> <6843> <CCD2>
+<6844> <6844> <E8E6>
+<6845> <6845> <CEA6>
+<6846> <6846> <BFF2>
+<6847> <6847> <96F4>
+<6848> <6848> <B0B8>
+<6849> <6849> <E8F1>
+<684A> <684A> <E8F0>
+<684B> <684B> <96F5>
+<684C> <684C> <D7C0>
+<684D> <684D> <96F6>
+<684E> <684E> <E8E4>
+<684F> <684F> <96F7>
+<6850> <6850> <CDA9>
+<6851> <6851> <C9A3>
+<6852> <6852> <96F8>
+<6853> <6853> <BBB8>
+<6854> <6854> <BDDB>
+<6855> <6855> <E8EA>
+<6856> <685B> <96F9>
+<685C> <685F> <9740>
+<6860> <6861> <E8E2>
+<6862> <6862> <E8E5>
+<6863> <6863> <B5B5>
+<6864> <6864> <E8E7>
+<6865> <6865> <C7C5>
+<6866> <6866> <E8EB>
+<6867> <6867> <E8ED>
+<6868> <6868> <BDB0>
+<6869> <6869> <D7AE>
+<686A> <686A> <9744>
+<686B> <686B> <E8F8>
+<686C> <6873> <9745>
+<6874> <6874> <E8F5>
+<6875> <6875> <974D>
+<6876> <6876> <CDB0>
+<6877> <6877> <E8F6>
+<6878> <6880> <974E>
+endbfrange
+
+100 beginbfrange
+<6881> <6881> <C1BA>
+<6882> <6882> <9757>
+<6883> <6883> <E8E8>
+<6884> <6884> <9758>
+<6885> <6885> <C3B7>
+<6886> <6886> <B0F0>
+<6887> <688E> <9759>
+<688F> <688F> <E8F4>
+<6890> <6892> <9761>
+<6893> <6893> <E8F7>
+<6894> <6896> <9764>
+<6897> <6897> <B9A3>
+<6898> <68A1> <9767>
+<68A2> <68A2> <C9D2>
+<68A3> <68A5> <9771>
+<68A6> <68A6> <C3CE>
+<68A7> <68A7> <CEE0>
+<68A8> <68A8> <C0E6>
+<68A9> <68AC> <9774>
+<68AD> <68AD> <CBF3>
+<68AE> <68AE> <9778>
+<68AF> <68AF> <CCDD>
+<68B0> <68B0> <D0B5>
+<68B1> <68B2> <9779>
+<68B3> <68B3> <CAE1>
+<68B4> <68B4> <977B>
+<68B5> <68B5> <E8F3>
+<68B6> <68B8> <977C>
+<68B9> <68BF> <9780>
+<68C0> <68C0> <BCEC>
+<68C1> <68C1> <9787>
+<68C2> <68C2> <E8F9>
+<68C3> <68C8> <9788>
+<68C9> <68C9> <C3DE>
+<68CA> <68CA> <978E>
+<68CB> <68CB> <C6E5>
+<68CC> <68CC> <978F>
+<68CD> <68CD> <B9F7>
+<68CE> <68D1> <9790>
+<68D2> <68D2> <B0F4>
+<68D3> <68D4> <9794>
+<68D5> <68D5> <D7D8>
+<68D6> <68D7> <9796>
+<68D8> <68D8> <BCAC>
+<68D9> <68D9> <9798>
+<68DA> <68DA> <C5EF>
+<68DB> <68DF> <9799>
+<68E0> <68E0> <CCC4>
+<68E1> <68E2> <979E>
+<68E3> <68E3> <E9A6>
+<68E4> <68ED> <97A0>
+<68EE> <68EE> <C9AD>
+<68EF> <68EF> <97AA>
+<68F0> <68F0> <E9A2>
+<68F1> <68F1> <C0E2>
+<68F2> <68F4> <97AB>
+<68F5> <68F5> <BFC3>
+<68F6> <68F8> <97AE>
+<68F9> <68F9> <E8FE>
+<68FA> <68FA> <B9D7>
+<68FB> <68FB> <97B1>
+<68FC> <68FC> <E8FB>
+<68FD> <68FF> <97B2>
+<6900> <6900> <97B5>
+<6901> <6901> <E9A4>
+<6902> <6904> <97B6>
+<6905> <6905> <D2CE>
+<6906> <690A> <97B9>
+<690B> <690B> <E9A3>
+<690C> <690C> <97BE>
+<690D> <690D> <D6B2>
+<690E> <690E> <D7B5>
+<690F> <690F> <97BF>
+<6910> <6910> <E9A7>
+<6911> <6911> <97C0>
+<6912> <6912> <BDB7>
+<6913> <691E> <97C1>
+<691F> <6920> <E8FC>
+<6921> <6923> <97CD>
+<6924> <6924> <E9A1>
+<6925> <692C> <97D0>
+<692D> <692D> <CDD6>
+<692E> <692F> <97D8>
+<6930> <6930> <D2AC>
+<6931> <6933> <97DA>
+<6934> <6934> <E9B2>
+<6935> <6938> <97DD>
+<6939> <6939> <E9A9>
+<693A> <693C> <97E1>
+<693D> <693D> <B4AA>
+<693E> <693E> <97E4>
+<693F> <693F> <B4BB>
+<6940> <6941> <97E5>
+<6942> <6942> <E9AB>
+<6943> <6953> <97E7>
+<6954> <6954> <D0A8>
+<6955> <6956> <97F8>
+<6957> <6957> <E9A5>
+<6958> <6959> <97FA>
+<695A> <695A> <B3FE>
+endbfrange
+
+100 beginbfrange
+<695B> <695C> <97FC>
+<695D> <695D> <E9AC>
+<695E> <695E> <C0E3>
+<695F> <695F> <97FE>
+<6960> <6960> <E9AA>
+<6961> <6962> <9840>
+<6963> <6963> <E9B9>
+<6964> <6965> <9842>
+<6966> <6966> <E9B8>
+<6967> <696A> <9844>
+<696B> <696B> <E9AE>
+<696C> <696D> <9848>
+<696E> <696E> <E8FA>
+<696F> <6970> <984A>
+<6971> <6971> <E9A8>
+<6972> <6976> <984C>
+<6977> <6977> <BFAC>
+<6978> <6978> <E9B1>
+<6979> <6979> <E9BA>
+<697A> <697B> <9851>
+<697C> <697C> <C2A5>
+<697D> <697F> <9853>
+<6980> <6980> <E9AF>
+<6981> <6981> <9856>
+<6982> <6982> <B8C5>
+<6983> <6983> <9857>
+<6984> <6984> <E9AD>
+<6985> <6985> <9858>
+<6986> <6986> <D3DC>
+<6987> <6988> <E9B4>
+<6989> <6989> <E9B7>
+<698A> <698C> <9859>
+<698D> <698D> <E9C7>
+<698E> <6993> <985C>
+<6994> <6994> <C0C6>
+<6995> <6995> <E9C5>
+<6996> <6997> <9862>
+<6998> <6998> <E9B0>
+<6999> <699A> <9864>
+<699B> <699B> <E9BB>
+<699C> <699C> <B0F1>
+<699D> <69A6> <9866>
+<69A7> <69A7> <E9BC>
+<69A8> <69A8> <D5A5>
+<69A9> <69AA> <9870>
+<69AB> <69AB> <E9BE>
+<69AC> <69AC> <9872>
+<69AD> <69AD> <E9BF>
+<69AE> <69B0> <9873>
+<69B1> <69B1> <E9C1>
+<69B2> <69B3> <9876>
+<69B4> <69B4> <C1F1>
+<69B5> <69B6> <9878>
+<69B7> <69B7> <C8B6>
+<69B8> <69BA> <987A>
+<69BB> <69BB> <E9BD>
+<69BC> <69BD> <987D>
+<69BE> <69C0> <9880>
+<69C1> <69C1> <E9C2>
+<69C2> <69C9> <9883>
+<69CA> <69CA> <E9C3>
+<69CB> <69CB> <988B>
+<69CC> <69CC> <E9B3>
+<69CD> <69CD> <988C>
+<69CE> <69CE> <E9B6>
+<69CF> <69CF> <988D>
+<69D0> <69D0> <BBB1>
+<69D1> <69D3> <988E>
+<69D4> <69D4> <E9C0>
+<69D5> <69DA> <9891>
+<69DB> <69DB> <BCF7>
+<69DC> <69DE> <9897>
+<69DF> <69DF> <E9C4>
+<69E0> <69E0> <E9C6>
+<69E1> <69EC> <989A>
+<69ED> <69ED> <E9CA>
+<69EE> <69F1> <98A6>
+<69F2> <69F2> <E9CE>
+<69F3> <69FC> <98AA>
+<69FD> <69FD> <B2DB>
+<69FE> <69FE> <98B4>
+<69FF> <69FF> <E9C8>
+<6A00> <6A09> <98B5>
+<6A0A> <6A0A> <B7AE>
+<6A0B> <6A16> <98BF>
+<6A17> <6A18> <E9CB>
+<6A19> <6A1E> <98CB>
+<6A1F> <6A1F> <D5C1>
+<6A20> <6A20> <98D1>
+<6A21> <6A21> <C4A3>
+<6A22> <6A27> <98D2>
+<6A28> <6A28> <E9D8>
+<6A29> <6A29> <98D8>
+<6A2A> <6A2A> <BAE1>
+<6A2B> <6A2E> <98D9>
+<6A2F> <6A2F> <E9C9>
+<6A30> <6A30> <98DD>
+<6A31> <6A31> <D3A3>
+<6A32> <6A34> <98DE>
+<6A35> <6A35> <E9D4>
+endbfrange
+
+100 beginbfrange
+<6A36> <6A3C> <98E1>
+<6A3D> <6A3D> <E9D7>
+<6A3E> <6A3E> <E9D0>
+<6A3F> <6A43> <98E8>
+<6A44> <6A44> <E9CF>
+<6A45> <6A46> <98ED>
+<6A47> <6A47> <C7C1>
+<6A48> <6A4F> <98EF>
+<6A50> <6A50> <E9D2>
+<6A51> <6A57> <98F7>
+<6A58> <6A58> <E9D9>
+<6A59> <6A59> <B3C8>
+<6A5A> <6A5A> <98FE>
+<6A5B> <6A5B> <E9D3>
+<6A5C> <6A60> <9940>
+<6A61> <6A61> <CFF0>
+<6A62> <6A64> <9945>
+<6A65> <6A65> <E9CD>
+<6A66> <6A70> <9948>
+<6A71> <6A71> <B3F7>
+<6A72> <6A78> <9953>
+<6A79> <6A79> <E9D6>
+<6A7A> <6A7B> <995A>
+<6A7C> <6A7C> <E9DA>
+<6A7D> <6A7F> <995C>
+<6A80> <6A80> <CCB4>
+<6A81> <6A83> <995F>
+<6A84> <6A84> <CFAD>
+<6A85> <6A8D> <9962>
+<6A8E> <6A8E> <E9D5>
+<6A8F> <6A8F> <996B>
+<6A90> <6A90> <E9DC>
+<6A91> <6A91> <E9DB>
+<6A92> <6A96> <996C>
+<6A97> <6A97> <E9DE>
+<6A98> <6A9F> <9971>
+<6AA0> <6AA0> <E9D1>
+<6AA1> <6AA6> <9979>
+<6AA7> <6AA8> <9980>
+<6AA9> <6AA9> <E9DD>
+<6AAA> <6AAA> <9982>
+<6AAB> <6AAB> <E9DF>
+<6AAC> <6AAC> <C3CA>
+<6AAD> <6AFF> <9983>
+<6B00> <6B1F> <99D6>
+<6B20> <6B20> <C7B7>
+<6B21> <6B21> <B4CE>
+<6B22> <6B22> <BBB6>
+<6B23> <6B23> <D0C0>
+<6B24> <6B24> <ECA3>
+<6B25> <6B26> <99F6>
+<6B27> <6B27> <C5B7>
+<6B28> <6B2E> <99F8>
+<6B2F> <6B31> <9A40>
+<6B32> <6B32> <D3FB>
+<6B33> <6B36> <9A43>
+<6B37> <6B37> <ECA4>
+<6B38> <6B38> <9A47>
+<6B39> <6B39> <ECA5>
+<6B3A> <6B3A> <C6DB>
+<6B3B> <6B3D> <9A48>
+<6B3E> <6B3E> <BFEE>
+<6B3F> <6B42> <9A4B>
+<6B43> <6B43> <ECA6>
+<6B44> <6B45> <9A4F>
+<6B46> <6B46> <ECA7>
+<6B47> <6B47> <D0AA>
+<6B48> <6B48> <9A51>
+<6B49> <6B49> <C7B8>
+<6B4A> <6B4B> <9A52>
+<6B4C> <6B4C> <B8E8>
+<6B4D> <6B58> <9A54>
+<6B59> <6B59> <ECA8>
+<6B5A> <6B61> <9A60>
+<6B62> <6B62> <D6B9>
+<6B63> <6B63> <D5FD>
+<6B64> <6B64> <B4CB>
+<6B65> <6B65> <B2BD>
+<6B66> <6B66> <CEE4>
+<6B67> <6B67> <C6E7>
+<6B68> <6B69> <9A68>
+<6B6A> <6B6A> <CDE1>
+<6B6B> <6B78> <9A6A>
+<6B79> <6B79> <B4F5>
+<6B7A> <6B7A> <9A78>
+<6B7B> <6B7B> <CBC0>
+<6B7C> <6B7C> <BCDF>
+<6B7D> <6B80> <9A79>
+<6B81> <6B82> <E9E2>
+<6B83> <6B83> <D1EA>
+<6B84> <6B84> <E9E5>
+<6B85> <6B85> <9A7D>
+<6B86> <6B86> <B4F9>
+<6B87> <6B87> <E9E4>
+<6B88> <6B88> <9A7E>
+<6B89> <6B89> <D1B3>
+<6B8A> <6B8A> <CAE2>
+<6B8B> <6B8B> <B2D0>
+<6B8C> <6B8C> <9A80>
+<6B8D> <6B8D> <E9E8>
+endbfrange
+
+100 beginbfrange
+<6B8E> <6B91> <9A81>
+<6B92> <6B93> <E9E6>
+<6B94> <6B95> <9A85>
+<6B96> <6B96> <D6B3>
+<6B97> <6B99> <9A87>
+<6B9A> <6B9B> <E9E9>
+<6B9C> <6BA0> <9A8A>
+<6BA1> <6BA1> <E9EB>
+<6BA2> <6BA9> <9A8F>
+<6BAA> <6BAA> <E9EC>
+<6BAB> <6BB2> <9A97>
+<6BB3> <6BB3> <ECAF>
+<6BB4> <6BB4> <C5B9>
+<6BB5> <6BB5> <B6CE>
+<6BB6> <6BB6> <9A9F>
+<6BB7> <6BB7> <D2F3>
+<6BB8> <6BBE> <9AA0>
+<6BBF> <6BBF> <B5EE>
+<6BC0> <6BC0> <9AA7>
+<6BC1> <6BC1> <BBD9>
+<6BC2> <6BC2> <ECB1>
+<6BC3> <6BC4> <9AA8>
+<6BC5> <6BC5> <D2E3>
+<6BC6> <6BCA> <9AAA>
+<6BCB> <6BCB> <CEE3>
+<6BCC> <6BCC> <9AAF>
+<6BCD> <6BCD> <C4B8>
+<6BCE> <6BCE> <9AB0>
+<6BCF> <6BCF> <C3BF>
+<6BD0> <6BD1> <9AB1>
+<6BD2> <6BD2> <B6BE>
+<6BD3> <6BD3> <D8B9>
+<6BD4> <6BD4> <B1C8>
+<6BD5> <6BD5> <B1CF>
+<6BD6> <6BD6> <B1D1>
+<6BD7> <6BD7> <C5FE>
+<6BD8> <6BD8> <9AB3>
+<6BD9> <6BD9> <B1D0>
+<6BDA> <6BDA> <9AB4>
+<6BDB> <6BDB> <C3AB>
+<6BDC> <6BE0> <9AB5>
+<6BE1> <6BE1> <D5B1>
+<6BE2> <6BE9> <9ABA>
+<6BEA> <6BEA> <EBA4>
+<6BEB> <6BEB> <BAC1>
+<6BEC> <6BEE> <9AC2>
+<6BEF> <6BEF> <CCBA>
+<6BF0> <6BF2> <9AC5>
+<6BF3> <6BF3> <EBA5>
+<6BF4> <6BF4> <9AC8>
+<6BF5> <6BF5> <EBA7>
+<6BF6> <6BF8> <9AC9>
+<6BF9> <6BF9> <EBA8>
+<6BFA> <6BFC> <9ACC>
+<6BFD> <6BFD> <EBA6>
+<6BFE> <6BFF> <9ACF>
+<6C00> <6C04> <9AD1>
+<6C05> <6C05> <EBA9>
+<6C06> <6C06> <EBAB>
+<6C07> <6C07> <EBAA>
+<6C08> <6C0C> <9AD6>
+<6C0D> <6C0D> <EBAC>
+<6C0E> <6C0E> <9ADB>
+<6C0F> <6C0F> <CACF>
+<6C10> <6C10> <D8B5>
+<6C11> <6C11> <C3F1>
+<6C12> <6C12> <9ADC>
+<6C13> <6C13> <C3A5>
+<6C14> <6C14> <C6F8>
+<6C15> <6C15> <EBAD>
+<6C16> <6C16> <C4CA>
+<6C17> <6C17> <9ADD>
+<6C18> <6C1A> <EBAE>
+<6C1B> <6C1B> <B7D5>
+<6C1C> <6C1E> <9ADE>
+<6C1F> <6C1F> <B7FA>
+<6C20> <6C20> <9AE1>
+<6C21> <6C21> <EBB1>
+<6C22> <6C22> <C7E2>
+<6C23> <6C23> <9AE2>
+<6C24> <6C24> <EBB3>
+<6C25> <6C25> <9AE3>
+<6C26> <6C26> <BAA4>
+<6C27> <6C27> <D1F5>
+<6C28> <6C28> <B0B1>
+<6C29> <6C29> <EBB2>
+<6C2A> <6C2A> <EBB4>
+<6C2B> <6C2D> <9AE4>
+<6C2E> <6C2E> <B5AA>
+<6C2F> <6C2F> <C2C8>
+<6C30> <6C30> <C7E8>
+<6C31> <6C31> <9AE7>
+<6C32> <6C32> <EBB5>
+<6C33> <6C33> <9AE8>
+<6C34> <6C34> <CBAE>
+<6C35> <6C35> <E3DF>
+<6C36> <6C37> <9AE9>
+<6C38> <6C38> <D3C0>
+<6C39> <6C3C> <9AEB>
+<6C3D> <6C3D> <D9DB>
+endbfrange
+
+100 beginbfrange
+<6C3E> <6C3F> <9AEF>
+<6C40> <6C40> <CDA1>
+<6C41> <6C41> <D6AD>
+<6C42> <6C42> <C7F3>
+<6C43> <6C45> <9AF1>
+<6C46> <6C46> <D9E0>
+<6C47> <6C47> <BBE3>
+<6C48> <6C48> <9AF4>
+<6C49> <6C49> <BABA>
+<6C4A> <6C4A> <E3E2>
+<6C4B> <6C4F> <9AF5>
+<6C50> <6C50> <CFAB>
+<6C51> <6C53> <9AFA>
+<6C54> <6C54> <E3E0>
+<6C55> <6C55> <C9C7>
+<6C56> <6C56> <9AFD>
+<6C57> <6C57> <BAB9>
+<6C58> <6C58> <9AFE>
+<6C59> <6C5A> <9B40>
+<6C5B> <6C5B> <D1B4>
+<6C5C> <6C5C> <E3E1>
+<6C5D> <6C5D> <C8EA>
+<6C5E> <6C5E> <B9AF>
+<6C5F> <6C5F> <BDAD>
+<6C60> <6C60> <B3D8>
+<6C61> <6C61> <CEDB>
+<6C62> <6C63> <9B42>
+<6C64> <6C64> <CCC0>
+<6C65> <6C67> <9B44>
+<6C68> <6C69> <E3E8>
+<6C6A> <6C6A> <CDF4>
+<6C6B> <6C6F> <9B47>
+<6C70> <6C70> <CCAD>
+<6C71> <6C71> <9B4C>
+<6C72> <6C72> <BCB3>
+<6C73> <6C73> <9B4D>
+<6C74> <6C74> <E3EA>
+<6C75> <6C75> <9B4E>
+<6C76> <6C76> <E3EB>
+<6C77> <6C78> <9B4F>
+<6C79> <6C79> <D0DA>
+<6C7A> <6C7C> <9B51>
+<6C7D> <6C7D> <C6FB>
+<6C7E> <6C7E> <B7DA>
+<6C7F> <6C80> <9B54>
+<6C81> <6C81> <C7DF>
+<6C82> <6C82> <D2CA>
+<6C83> <6C83> <CED6>
+<6C84> <6C84> <9B56>
+<6C85> <6C85> <E3E4>
+<6C86> <6C86> <E3EC>
+<6C87> <6C87> <9B57>
+<6C88> <6C88> <C9F2>
+<6C89> <6C89> <B3C1>
+<6C8A> <6C8B> <9B58>
+<6C8C> <6C8C> <E3E7>
+<6C8D> <6C8E> <9B5A>
+<6C8F> <6C8F> <C6E3>
+<6C90> <6C90> <E3E5>
+<6C91> <6C92> <9B5C>
+<6C93> <6C93> <EDB3>
+<6C94> <6C94> <E3E6>
+<6C95> <6C98> <9B5E>
+<6C99> <6C99> <C9B3>
+<6C9A> <6C9A> <9B62>
+<6C9B> <6C9B> <C5E6>
+<6C9C> <6C9E> <9B63>
+<6C9F> <6C9F> <B9B5>
+<6CA0> <6CA0> <9B66>
+<6CA1> <6CA1> <C3BB>
+<6CA2> <6CA2> <9B67>
+<6CA3> <6CA3> <E3E3>
+<6CA4> <6CA4> <C5BD>
+<6CA5> <6CA5> <C1A4>
+<6CA6> <6CA6> <C2D9>
+<6CA7> <6CA7> <B2D7>
+<6CA8> <6CA8> <9B68>
+<6CA9> <6CA9> <E3ED>
+<6CAA> <6CAA> <BBA6>
+<6CAB> <6CAB> <C4AD>
+<6CAC> <6CAC> <9B69>
+<6CAD> <6CAD> <E3F0>
+<6CAE> <6CAE> <BEDA>
+<6CAF> <6CB0> <9B6A>
+<6CB1> <6CB1> <E3FB>
+<6CB2> <6CB2> <E3F5>
+<6CB3> <6CB3> <BAD3>
+<6CB4> <6CB7> <9B6C>
+<6CB8> <6CB8> <B7D0>
+<6CB9> <6CB9> <D3CD>
+<6CBA> <6CBA> <9B70>
+<6CBB> <6CBB> <D6CE>
+<6CBC> <6CBC> <D5D3>
+<6CBD> <6CBD> <B9C1>
+<6CBE> <6CBE> <D5B4>
+<6CBF> <6CBF> <D1D8>
+<6CC0> <6CC3> <9B71>
+<6CC4> <6CC4> <D0B9>
+<6CC5> <6CC5> <C7F6>
+<6CC6> <6CC8> <9B75>
+endbfrange
+
+100 beginbfrange
+<6CC9> <6CC9> <C8AA>
+<6CCA> <6CCA> <B2B4>
+<6CCB> <6CCB> <9B78>
+<6CCC> <6CCC> <C3DA>
+<6CCD> <6CCF> <9B79>
+<6CD0> <6CD0> <E3EE>
+<6CD1> <6CD2> <9B7C>
+<6CD3> <6CD3> <E3FC>
+<6CD4> <6CD4> <E3EF>
+<6CD5> <6CD5> <B7A8>
+<6CD6> <6CD6> <E3F7>
+<6CD7> <6CD7> <E3F4>
+<6CD8> <6CD8> <9B7E>
+<6CD9> <6CDA> <9B80>
+<6CDB> <6CDB> <B7BA>
+<6CDC> <6CDD> <9B82>
+<6CDE> <6CDE> <C5A2>
+<6CDF> <6CDF> <9B84>
+<6CE0> <6CE0> <E3F6>
+<6CE1> <6CE1> <C5DD>
+<6CE2> <6CE2> <B2A8>
+<6CE3> <6CE3> <C6FC>
+<6CE4> <6CE4> <9B85>
+<6CE5> <6CE5> <C4E0>
+<6CE6> <6CE7> <9B86>
+<6CE8> <6CE8> <D7A2>
+<6CE9> <6CE9> <9B88>
+<6CEA> <6CEA> <C0E1>
+<6CEB> <6CEB> <E3F9>
+<6CEC> <6CED> <9B89>
+<6CEE> <6CEE> <E3FA>
+<6CEF> <6CEF> <E3FD>
+<6CF0> <6CF0> <CCA9>
+<6CF1> <6CF1> <E3F3>
+<6CF2> <6CF2> <9B8B>
+<6CF3> <6CF3> <D3BE>
+<6CF4> <6CF4> <9B8C>
+<6CF5> <6CF5> <B1C3>
+<6CF6> <6CF6> <EDB4>
+<6CF7> <6CF8> <E3F1>
+<6CF9> <6CF9> <9B8D>
+<6CFA> <6CFA> <E3F8>
+<6CFB> <6CFB> <D0BA>
+<6CFC> <6CFC> <C6C3>
+<6CFD> <6CFD> <D4F3>
+<6CFE> <6CFE> <E3FE>
+<6CFF> <6CFF> <9B8E>
+<6D00> <6D00> <9B8F>
+<6D01> <6D01> <BDE0>
+<6D02> <6D03> <9B90>
+<6D04> <6D04> <E4A7>
+<6D05> <6D06> <9B92>
+<6D07> <6D07> <E4A6>
+<6D08> <6D0A> <9B94>
+<6D0B> <6D0B> <D1F3>
+<6D0C> <6D0C> <E4A3>
+<6D0D> <6D0D> <9B97>
+<6D0E> <6D0E> <E4A9>
+<6D0F> <6D11> <9B98>
+<6D12> <6D12> <C8F7>
+<6D13> <6D16> <9B9B>
+<6D17> <6D17> <CFB4>
+<6D18> <6D18> <9B9F>
+<6D19> <6D19> <E4A8>
+<6D1A> <6D1A> <E4AE>
+<6D1B> <6D1B> <C2E5>
+<6D1C> <6D1D> <9BA0>
+<6D1E> <6D1E> <B6B4>
+<6D1F> <6D24> <9BA2>
+<6D25> <6D25> <BDF2>
+<6D26> <6D26> <9BA8>
+<6D27> <6D27> <E4A2>
+<6D28> <6D29> <9BA9>
+<6D2A> <6D2A> <BAE9>
+<6D2B> <6D2B> <E4AA>
+<6D2C> <6D2D> <9BAB>
+<6D2E> <6D2E> <E4AC>
+<6D2F> <6D30> <9BAD>
+<6D31> <6D31> <B6FD>
+<6D32> <6D32> <D6DE>
+<6D33> <6D33> <E4B2>
+<6D34> <6D34> <9BAF>
+<6D35> <6D35> <E4AD>
+<6D36> <6D38> <9BB0>
+<6D39> <6D39> <E4A1>
+<6D3A> <6D3A> <9BB3>
+<6D3B> <6D3B> <BBEE>
+<6D3C> <6D3C> <CDDD>
+<6D3D> <6D3D> <C7A2>
+<6D3E> <6D3E> <C5C9>
+<6D3F> <6D40> <9BB4>
+<6D41> <6D41> <C1F7>
+<6D42> <6D42> <9BB6>
+<6D43> <6D43> <E4A4>
+<6D44> <6D44> <9BB7>
+<6D45> <6D45> <C7B3>
+<6D46> <6D46> <BDAC>
+<6D47> <6D47> <BDBD>
+<6D48> <6D48> <E4A5>
+<6D49> <6D49> <9BB8>
+endbfrange
+
+100 beginbfrange
+<6D4A> <6D4A> <D7C7>
+<6D4B> <6D4B> <B2E2>
+<6D4C> <6D4C> <9BB9>
+<6D4D> <6D4D> <E4AB>
+<6D4E> <6D4E> <BCC3>
+<6D4F> <6D4F> <E4AF>
+<6D50> <6D50> <9BBA>
+<6D51> <6D51> <BBEB>
+<6D52> <6D52> <E4B0>
+<6D53> <6D53> <C5A8>
+<6D54> <6D54> <E4B1>
+<6D55> <6D58> <9BBB>
+<6D59> <6D59> <D5E3>
+<6D5A> <6D5A> <BFA3>
+<6D5B> <6D5B> <9BBF>
+<6D5C> <6D5C> <E4BA>
+<6D5D> <6D5D> <9BC0>
+<6D5E> <6D5E> <E4B7>
+<6D5F> <6D5F> <9BC1>
+<6D60> <6D60> <E4BB>
+<6D61> <6D62> <9BC2>
+<6D63> <6D63> <E4BD>
+<6D64> <6D65> <9BC4>
+<6D66> <6D66> <C6D6>
+<6D67> <6D68> <9BC6>
+<6D69> <6D69> <BAC6>
+<6D6A> <6D6A> <C0CB>
+<6D6B> <6D6D> <9BC8>
+<6D6E> <6D6E> <B8A1>
+<6D6F> <6D6F> <E4B4>
+<6D70> <6D73> <9BCB>
+<6D74> <6D74> <D4A1>
+<6D75> <6D76> <9BCF>
+<6D77> <6D77> <BAA3>
+<6D78> <6D78> <BDFE>
+<6D79> <6D7B> <9BD1>
+<6D7C> <6D7C> <E4BC>
+<6D7D> <6D81> <9BD4>
+<6D82> <6D82> <CDBF>
+<6D83> <6D84> <9BD9>
+<6D85> <6D85> <C4F9>
+<6D86> <6D87> <9BDB>
+<6D88> <6D88> <CFFB>
+<6D89> <6D89> <C9E6>
+<6D8A> <6D8B> <9BDD>
+<6D8C> <6D8C> <D3BF>
+<6D8D> <6D8D> <9BDF>
+<6D8E> <6D8E> <CFD1>
+<6D8F> <6D90> <9BE0>
+<6D91> <6D91> <E4B3>
+<6D92> <6D92> <9BE2>
+<6D93> <6D94> <E4B8>
+<6D95> <6D95> <CCE9>
+<6D96> <6D9A> <9BE3>
+<6D9B> <6D9B> <CCCE>
+<6D9C> <6D9C> <9BE8>
+<6D9D> <6D9D> <C0D4>
+<6D9E> <6D9E> <E4B5>
+<6D9F> <6D9F> <C1B0>
+<6DA0> <6DA0> <E4B6>
+<6DA1> <6DA1> <CED0>
+<6DA2> <6DA2> <9BE9>
+<6DA3> <6DA3> <BBC1>
+<6DA4> <6DA4> <B5D3>
+<6DA5> <6DA5> <9BEA>
+<6DA6> <6DA6> <C8F3>
+<6DA7> <6DA7> <BDA7>
+<6DA8> <6DA8> <D5C7>
+<6DA9> <6DA9> <C9AC>
+<6DAA> <6DAA> <B8A2>
+<6DAB> <6DAB> <E4CA>
+<6DAC> <6DAD> <9BEB>
+<6DAE> <6DAE> <E4CC>
+<6DAF> <6DAF> <D1C4>
+<6DB0> <6DB1> <9BED>
+<6DB2> <6DB2> <D2BA>
+<6DB3> <6DB4> <9BEF>
+<6DB5> <6DB5> <BAAD>
+<6DB6> <6DB7> <9BF1>
+<6DB8> <6DB8> <BAD4>
+<6DB9> <6DBE> <9BF3>
+<6DBF> <6DBF> <E4C3>
+<6DC0> <6DC0> <B5ED>
+<6DC1> <6DC3> <9BF9>
+<6DC4> <6DC4> <D7CD>
+<6DC5> <6DC5> <E4C0>
+<6DC6> <6DC6> <CFFD>
+<6DC7> <6DC7> <E4BF>
+<6DC8> <6DCA> <9BFC>
+<6DCB> <6DCB> <C1DC>
+<6DCC> <6DCC> <CCCA>
+<6DCD> <6DD0> <9C40>
+<6DD1> <6DD1> <CAE7>
+<6DD2> <6DD5> <9C44>
+<6DD6> <6DD6> <C4D7>
+<6DD7> <6DD7> <9C48>
+<6DD8> <6DD8> <CCD4>
+<6DD9> <6DD9> <E4C8>
+<6DDA> <6DDC> <9C49>
+<6DDD> <6DDD> <E4C7>
+endbfrange
+
+100 beginbfrange
+<6DDE> <6DDE> <E4C1>
+<6DDF> <6DDF> <9C4C>
+<6DE0> <6DE0> <E4C4>
+<6DE1> <6DE1> <B5AD>
+<6DE2> <6DE3> <9C4D>
+<6DE4> <6DE4> <D3D9>
+<6DE5> <6DE5> <9C4F>
+<6DE6> <6DE6> <E4C6>
+<6DE7> <6DEA> <9C50>
+<6DEB> <6DEB> <D2F9>
+<6DEC> <6DEC> <B4E3>
+<6DED> <6DED> <9C54>
+<6DEE> <6DEE> <BBB4>
+<6DEF> <6DF0> <9C55>
+<6DF1> <6DF1> <C9EE>
+<6DF2> <6DF2> <9C57>
+<6DF3> <6DF3> <B4BE>
+<6DF4> <6DF6> <9C58>
+<6DF7> <6DF7> <BBEC>
+<6DF8> <6DF8> <9C5B>
+<6DF9> <6DF9> <D1CD>
+<6DFA> <6DFA> <9C5C>
+<6DFB> <6DFB> <CCED>
+<6DFC> <6DFC> <EDB5>
+<6DFD> <6DFF> <9C5D>
+<6E00> <6E04> <9C60>
+<6E05> <6E05> <C7E5>
+<6E06> <6E09> <9C65>
+<6E0A> <6E0A> <D4A8>
+<6E0B> <6E0B> <9C69>
+<6E0C> <6E0C> <E4CB>
+<6E0D> <6E0D> <D7D5>
+<6E0E> <6E0E> <E4C2>
+<6E0F> <6E0F> <9C6A>
+<6E10> <6E10> <BDA5>
+<6E11> <6E11> <E4C5>
+<6E12> <6E13> <9C6B>
+<6E14> <6E14> <D3E6>
+<6E15> <6E15> <9C6D>
+<6E16> <6E16> <E4C9>
+<6E17> <6E17> <C9F8>
+<6E18> <6E19> <9C6E>
+<6E1A> <6E1A> <E4BE>
+<6E1B> <6E1C> <9C70>
+<6E1D> <6E1D> <D3E5>
+<6E1E> <6E1F> <9C72>
+<6E20> <6E20> <C7FE>
+<6E21> <6E21> <B6C9>
+<6E22> <6E22> <9C74>
+<6E23> <6E23> <D4FC>
+<6E24> <6E24> <B2B3>
+<6E25> <6E25> <E4D7>
+<6E26> <6E28> <9C75>
+<6E29> <6E29> <CEC2>
+<6E2A> <6E2A> <9C78>
+<6E2B> <6E2B> <E4CD>
+<6E2C> <6E2C> <9C79>
+<6E2D> <6E2D> <CEBC>
+<6E2E> <6E2E> <9C7A>
+<6E2F> <6E2F> <B8DB>
+<6E30> <6E31> <9C7B>
+<6E32> <6E32> <E4D6>
+<6E33> <6E33> <9C7D>
+<6E34> <6E34> <BFCA>
+<6E35> <6E35> <9C7E>
+<6E36> <6E37> <9C80>
+<6E38> <6E38> <D3CE>
+<6E39> <6E39> <9C82>
+<6E3A> <6E3A> <C3EC>
+<6E3B> <6E42> <9C83>
+<6E43> <6E43> <C5C8>
+<6E44> <6E44> <E4D8>
+<6E45> <6E4C> <9C8B>
+<6E4D> <6E4D> <CDC4>
+<6E4E> <6E4E> <E4CF>
+<6E4F> <6E52> <9C93>
+<6E53> <6E54> <E4D4>
+<6E55> <6E55> <9C97>
+<6E56> <6E56> <BAFE>
+<6E57> <6E57> <9C98>
+<6E58> <6E58> <CFE6>
+<6E59> <6E5A> <9C99>
+<6E5B> <6E5B> <D5BF>
+<6E5C> <6E5E> <9C9B>
+<6E5F> <6E5F> <E4D2>
+<6E60> <6E6A> <9C9E>
+<6E6B> <6E6B> <E4D0>
+<6E6C> <6E6D> <9CA9>
+<6E6E> <6E6E> <E4CE>
+<6E6F> <6E7D> <9CAB>
+<6E7E> <6E7E> <CDE5>
+<6E7F> <6E7F> <CAAA>
+<6E80> <6E82> <9CBA>
+<6E83> <6E83> <C0A3>
+<6E84> <6E84> <9CBD>
+<6E85> <6E85> <BDA6>
+<6E86> <6E86> <E4D3>
+<6E87> <6E88> <9CBE>
+<6E89> <6E89> <B8C8>
+<6E8A> <6E8E> <9CC0>
+endbfrange
+
+100 beginbfrange
+<6E8F> <6E8F> <E4E7>
+<6E90> <6E90> <D4B4>
+<6E91> <6E97> <9CC5>
+<6E98> <6E98> <E4DB>
+<6E99> <6E9B> <9CCC>
+<6E9C> <6E9C> <C1EF>
+<6E9D> <6E9E> <9CCF>
+<6E9F> <6E9F> <E4E9>
+<6EA0> <6EA1> <9CD1>
+<6EA2> <6EA2> <D2E7>
+<6EA3> <6EA4> <9CD3>
+<6EA5> <6EA5> <E4DF>
+<6EA6> <6EA6> <9CD5>
+<6EA7> <6EA7> <E4E0>
+<6EA8> <6EA9> <9CD6>
+<6EAA> <6EAA> <CFAA>
+<6EAB> <6EAE> <9CD8>
+<6EAF> <6EAF> <CBDD>
+<6EB0> <6EB0> <9CDC>
+<6EB1> <6EB1> <E4DA>
+<6EB2> <6EB2> <E4D1>
+<6EB3> <6EB3> <9CDD>
+<6EB4> <6EB4> <E4E5>
+<6EB5> <6EB5> <9CDE>
+<6EB6> <6EB6> <C8DC>
+<6EB7> <6EB7> <E4E3>
+<6EB8> <6EB9> <9CDF>
+<6EBA> <6EBA> <C4E7>
+<6EBB> <6EBB> <E4E2>
+<6EBC> <6EBC> <9CE1>
+<6EBD> <6EBD> <E4E1>
+<6EBE> <6EC0> <9CE2>
+<6EC1> <6EC1> <B3FC>
+<6EC2> <6EC2> <E4E8>
+<6EC3> <6EC6> <9CE5>
+<6EC7> <6EC7> <B5E1>
+<6EC8> <6ECA> <9CE9>
+<6ECB> <6ECB> <D7CC>
+<6ECC> <6ECE> <9CEC>
+<6ECF> <6ECF> <E4E6>
+<6ED0> <6ED0> <9CEF>
+<6ED1> <6ED1> <BBAC>
+<6ED2> <6ED2> <9CF0>
+<6ED3> <6ED3> <D7D2>
+<6ED4> <6ED4> <CCCF>
+<6ED5> <6ED5> <EBF8>
+<6ED6> <6ED6> <9CF1>
+<6ED7> <6ED7> <E4E4>
+<6ED8> <6ED9> <9CF2>
+<6EDA> <6EDA> <B9F6>
+<6EDB> <6EDD> <9CF4>
+<6EDE> <6EDE> <D6CD>
+<6EDF> <6EDF> <E4D9>
+<6EE0> <6EE0> <E4DC>
+<6EE1> <6EE1> <C2FA>
+<6EE2> <6EE2> <E4DE>
+<6EE3> <6EE3> <9CF7>
+<6EE4> <6EE4> <C2CB>
+<6EE5> <6EE5> <C0C4>
+<6EE6> <6EE6> <C2D0>
+<6EE7> <6EE7> <9CF8>
+<6EE8> <6EE8> <B1F5>
+<6EE9> <6EE9> <CCB2>
+<6EEA> <6EEF> <9CF9>
+<6EF0> <6EF3> <9D40>
+<6EF4> <6EF4> <B5CE>
+<6EF5> <6EF8> <9D44>
+<6EF9> <6EF9> <E4EF>
+<6EFA> <6EFF> <9D48>
+<6F00> <6F01> <9D4E>
+<6F02> <6F02> <C6AF>
+<6F03> <6F05> <9D50>
+<6F06> <6F06> <C6E1>
+<6F07> <6F08> <9D53>
+<6F09> <6F09> <E4F5>
+<6F0A> <6F0E> <9D55>
+<6F0F> <6F0F> <C2A9>
+<6F10> <6F12> <9D5A>
+<6F13> <6F13> <C0EC>
+<6F14> <6F14> <D1DD>
+<6F15> <6F15> <E4EE>
+<6F16> <6F1F> <9D5D>
+<6F20> <6F20> <C4AE>
+<6F21> <6F23> <9D67>
+<6F24> <6F24> <E4ED>
+<6F25> <6F28> <9D6A>
+<6F29> <6F29> <E4F6>
+<6F2A> <6F2A> <E4F4>
+<6F2B> <6F2B> <C2FE>
+<6F2C> <6F2C> <9D6E>
+<6F2D> <6F2D> <E4DD>
+<6F2E> <6F2E> <9D6F>
+<6F2F> <6F2F> <E4F0>
+<6F30> <6F30> <9D70>
+<6F31> <6F31> <CAFE>
+<6F32> <6F32> <9D71>
+<6F33> <6F33> <D5C4>
+<6F34> <6F35> <9D72>
+<6F36> <6F36> <E4F1>
+<6F37> <6F3D> <9D74>
+endbfrange
+
+100 beginbfrange
+<6F3E> <6F3E> <D1FA>
+<6F3F> <6F42> <9D7B>
+<6F43> <6F45> <9D80>
+<6F46> <6F47> <E4EB>
+<6F48> <6F4A> <9D83>
+<6F4B> <6F4B> <E4F2>
+<6F4C> <6F4C> <9D86>
+<6F4D> <6F4D> <CEAB>
+<6F4E> <6F57> <9D87>
+<6F58> <6F58> <C5CB>
+<6F59> <6F5B> <9D91>
+<6F5C> <6F5C> <C7B1>
+<6F5D> <6F5D> <9D94>
+<6F5E> <6F5E> <C2BA>
+<6F5F> <6F61> <9D95>
+<6F62> <6F62> <E4EA>
+<6F63> <6F65> <9D98>
+<6F66> <6F66> <C1CA>
+<6F67> <6F6C> <9D9B>
+<6F6D> <6F6D> <CCB6>
+<6F6E> <6F6E> <B3B1>
+<6F6F> <6F71> <9DA1>
+<6F72> <6F72> <E4FB>
+<6F73> <6F73> <9DA4>
+<6F74> <6F74> <E4F3>
+<6F75> <6F77> <9DA5>
+<6F78> <6F78> <E4FA>
+<6F79> <6F79> <9DA8>
+<6F7A> <6F7A> <E4FD>
+<6F7B> <6F7B> <9DA9>
+<6F7C> <6F7C> <E4FC>
+<6F7D> <6F83> <9DAA>
+<6F84> <6F84> <B3CE>
+<6F85> <6F87> <9DB1>
+<6F88> <6F88> <B3BA>
+<6F89> <6F89> <E4F7>
+<6F8A> <6F8B> <9DB4>
+<6F8C> <6F8C> <E4F9>
+<6F8D> <6F8D> <E4F8>
+<6F8E> <6F8E> <C5EC>
+<6F8F> <6F9B> <9DB6>
+<6F9C> <6F9C> <C0BD>
+<6F9D> <6FA0> <9DC3>
+<6FA1> <6FA1> <D4E8>
+<6FA2> <6FA6> <9DC7>
+<6FA7> <6FA7> <E5A2>
+<6FA8> <6FB2> <9DCC>
+<6FB3> <6FB3> <B0C4>
+<6FB4> <6FB5> <9DD7>
+<6FB6> <6FB6> <E5A4>
+<6FB7> <6FB8> <9DD9>
+<6FB9> <6FB9> <E5A3>
+<6FBA> <6FBF> <9DDB>
+<6FC0> <6FC0> <BCA4>
+<6FC1> <6FC1> <9DE1>
+<6FC2> <6FC2> <E5A5>
+<6FC3> <6FC8> <9DE2>
+<6FC9> <6FC9> <E5A1>
+<6FCA> <6FD0> <9DE8>
+<6FD1> <6FD1> <E4FE>
+<6FD2> <6FD2> <B1F4>
+<6FD3> <6FDD> <9DEF>
+<6FDE> <6FDE> <E5A8>
+<6FDF> <6FDF> <9DFA>
+<6FE0> <6FE0> <E5A9>
+<6FE1> <6FE1> <E5A6>
+<6FE2> <6FE5> <9DFB>
+<6FE6> <6FED> <9E40>
+<6FEE> <6FEE> <E5A7>
+<6FEF> <6FEF> <E5AA>
+<6FF0> <6FFF> <9E48>
+<7000> <7010> <9E58>
+<7011> <7011> <C6D9>
+<7012> <7019> <9E69>
+<701A> <701A> <E5AB>
+<701B> <701B> <E5AD>
+<701C> <7022> <9E71>
+<7023> <7023> <E5AC>
+<7024> <702A> <9E78>
+<702B> <7034> <9E80>
+<7035> <7035> <E5AF>
+<7036> <7038> <9E8A>
+<7039> <7039> <E5AE>
+<703A> <704B> <9E8D>
+<704C> <704C> <B9E0>
+<704D> <704E> <9E9F>
+<704F> <704F> <E5B0>
+<7050> <705D> <9EA1>
+<705E> <705E> <E5B1>
+<705F> <706A> <9EAF>
+<706B> <706B> <BBF0>
+<706C> <706C> <ECE1>
+<706D> <706D> <C3F0>
+<706E> <706E> <9EBB>
+<706F> <706F> <B5C6>
+<7070> <7070> <BBD2>
+<7071> <7074> <9EBC>
+<7075> <7075> <C1E9>
+<7076> <7076> <D4EE>
+<7077> <7077> <9EC0>
+endbfrange
+
+100 beginbfrange
+<7078> <7078> <BEC4>
+<7079> <707B> <9EC1>
+<707C> <707C> <D7C6>
+<707D> <707D> <9EC4>
+<707E> <707E> <D4D6>
+<707F> <707F> <B2D3>
+<7080> <7080> <ECBE>
+<7081> <7084> <9EC5>
+<7085> <7085> <EAC1>
+<7086> <7088> <9EC9>
+<7089> <7089> <C2AF>
+<708A> <708A> <B4B6>
+<708B> <708D> <9ECC>
+<708E> <708E> <D1D7>
+<708F> <7091> <9ECF>
+<7092> <7092> <B3B4>
+<7093> <7093> <9ED2>
+<7094> <7094> <C8B2>
+<7095> <7095> <BFBB>
+<7096> <7096> <ECC0>
+<7097> <7098> <9ED3>
+<7099> <7099> <D6CB>
+<709A> <709B> <9ED5>
+<709C> <709C> <ECBF>
+<709D> <709D> <ECC1>
+<709E> <70AA> <9ED7>
+<70AB> <70AB> <ECC5>
+<70AC> <70AC> <BEE6>
+<70AD> <70AD> <CCBF>
+<70AE> <70AE> <C5DA>
+<70AF> <70AF> <BEBC>
+<70B0> <70B0> <9EE4>
+<70B1> <70B1> <ECC6>
+<70B2> <70B2> <9EE5>
+<70B3> <70B3> <B1FE>
+<70B4> <70B6> <9EE6>
+<70B7> <70B7> <ECC4>
+<70B8> <70B8> <D5A8>
+<70B9> <70B9> <B5E3>
+<70BA> <70BA> <9EE9>
+<70BB> <70BB> <ECC2>
+<70BC> <70BC> <C1B6>
+<70BD> <70BD> <B3E3>
+<70BE> <70BF> <9EEA>
+<70C0> <70C0> <ECC3>
+<70C1> <70C1> <CBB8>
+<70C2> <70C2> <C0C3>
+<70C3> <70C3> <CCFE>
+<70C4> <70C7> <9EEC>
+<70C8> <70C8> <C1D2>
+<70C9> <70C9> <9EF0>
+<70CA> <70CA> <ECC8>
+<70CB> <70D7> <9EF1>
+<70D8> <70D8> <BAE6>
+<70D9> <70D9> <C0D3>
+<70DA> <70DA> <9EFE>
+<70DB> <70DB> <D6F2>
+<70DC> <70DE> <9F40>
+<70DF> <70DF> <D1CC>
+<70E0> <70E3> <9F43>
+<70E4> <70E4> <BFBE>
+<70E5> <70E5> <9F47>
+<70E6> <70E6> <B7B3>
+<70E7> <70E7> <C9D5>
+<70E8> <70E8> <ECC7>
+<70E9> <70E9> <BBE2>
+<70EA> <70EA> <9F48>
+<70EB> <70EB> <CCCC>
+<70EC> <70EC> <BDFD>
+<70ED> <70ED> <C8C8>
+<70EE> <70EE> <9F49>
+<70EF> <70EF> <CFA9>
+<70F0> <70F6> <9F4A>
+<70F7> <70F7> <CDE9>
+<70F8> <70F8> <9F51>
+<70F9> <70F9> <C5EB>
+<70FA> <70FC> <9F52>
+<70FD> <70FD> <B7E9>
+<70FE> <70FF> <9F55>
+<7100> <7108> <9F57>
+<7109> <7109> <D1C9>
+<710A> <710A> <BAB8>
+<710B> <710F> <9F60>
+<7110> <7110> <ECC9>
+<7111> <7112> <9F65>
+<7113> <7113> <ECCA>
+<7114> <7114> <9F67>
+<7115> <7115> <BBC0>
+<7116> <7116> <ECCB>
+<7117> <7117> <9F68>
+<7118> <7118> <ECE2>
+<7119> <7119> <B1BA>
+<711A> <711A> <B7D9>
+<711B> <7125> <9F69>
+<7126> <7126> <BDB9>
+<7127> <712E> <9F74>
+<712F> <712F> <ECCC>
+<7130> <7130> <D1E6>
+<7131> <7131> <ECCD>
+<7132> <7134> <9F7C>
+endbfrange
+
+100 beginbfrange
+<7135> <7135> <9F80>
+<7136> <7136> <C8BB>
+<7137> <7144> <9F81>
+<7145> <7145> <ECD1>
+<7146> <7149> <9F8F>
+<714A> <714A> <ECD3>
+<714B> <714B> <9F93>
+<714C> <714C> <BBCD>
+<714D> <714D> <9F94>
+<714E> <714E> <BCE5>
+<714F> <715B> <9F95>
+<715C> <715C> <ECCF>
+<715D> <715D> <9FA2>
+<715E> <715E> <C9B7>
+<715F> <7163> <9FA3>
+<7164> <7164> <C3BA>
+<7165> <7165> <9FA8>
+<7166> <7166> <ECE3>
+<7167> <7167> <D5D5>
+<7168> <7168> <ECD0>
+<7169> <716D> <9FA9>
+<716E> <716E> <D6F3>
+<716F> <7171> <9FAE>
+<7172> <7172> <ECD2>
+<7173> <7173> <ECCE>
+<7174> <7177> <9FB1>
+<7178> <7178> <ECD4>
+<7179> <7179> <9FB5>
+<717A> <717A> <ECD5>
+<717B> <717C> <9FB6>
+<717D> <717D> <C9BF>
+<717E> <7183> <9FB8>
+<7184> <7184> <CFA8>
+<7185> <7189> <9FBE>
+<718A> <718A> <D0DC>
+<718B> <718E> <9FC3>
+<718F> <718F> <D1AC>
+<7190> <7193> <9FC7>
+<7194> <7194> <C8DB>
+<7195> <7197> <9FCB>
+<7198> <7198> <ECD6>
+<7199> <7199> <CEF5>
+<719A> <719E> <9FCE>
+<719F> <719F> <CAEC>
+<71A0> <71A0> <ECDA>
+<71A1> <71A7> <9FD3>
+<71A8> <71A8> <ECD9>
+<71A9> <71AB> <9FDA>
+<71AC> <71AC> <B0BE>
+<71AD> <71B2> <9FDD>
+<71B3> <71B3> <ECD7>
+<71B4> <71B4> <9FE3>
+<71B5> <71B5> <ECD8>
+<71B6> <71B8> <9FE4>
+<71B9> <71B9> <ECE4>
+<71BA> <71C2> <9FE7>
+<71C3> <71C3> <C8BC>
+<71C4> <71CD> <9FF0>
+<71CE> <71CE> <C1C7>
+<71CF> <71D3> <9FFA>
+<71D4> <71D4> <ECDC>
+<71D5> <71D5> <D1E0>
+<71D6> <71DF> <A040>
+<71E0> <71E0> <ECDB>
+<71E1> <71E4> <A04A>
+<71E5> <71E5> <D4EF>
+<71E6> <71E6> <A04E>
+<71E7> <71E7> <ECDD>
+<71E8> <71ED> <A04F>
+<71EE> <71EE> <DBC6>
+<71EF> <71F8> <A055>
+<71F9> <71F9> <ECDE>
+<71FA> <71FF> <A05F>
+<7200> <7205> <A065>
+<7206> <7206> <B1AC>
+<7207> <721A> <A06B>
+<721B> <721C> <A080>
+<721D> <721D> <ECDF>
+<721E> <7227> <A082>
+<7228> <7228> <ECE0>
+<7229> <7229> <A08C>
+<722A> <722A> <D7A6>
+<722B> <722B> <A08D>
+<722C> <722C> <C5C0>
+<722D> <722F> <A08E>
+<7230> <7230> <EBBC>
+<7231> <7231> <B0AE>
+<7232> <7234> <A091>
+<7235> <7235> <BEF4>
+<7236> <7236> <B8B8>
+<7237> <7237> <D2AF>
+<7238> <7238> <B0D6>
+<7239> <7239> <B5F9>
+<723A> <723A> <A094>
+<723B> <723B> <D8B3>
+<723C> <723C> <A095>
+<723D> <723D> <CBAC>
+<723E> <723E> <A096>
+<723F> <723F> <E3DD>
+<7240> <7246> <A097>
+endbfrange
+
+100 beginbfrange
+<7247> <7247> <C6AC>
+<7248> <7248> <B0E6>
+<7249> <724B> <A09E>
+<724C> <724C> <C5C6>
+<724D> <724D> <EBB9>
+<724E> <7251> <A0A1>
+<7252> <7252> <EBBA>
+<7253> <7255> <A0A5>
+<7256> <7256> <EBBB>
+<7257> <7258> <A0A8>
+<7259> <7259> <D1C0>
+<725A> <725A> <A0AA>
+<725B> <725B> <C5A3>
+<725C> <725C> <A0AB>
+<725D> <725D> <EAF2>
+<725E> <725E> <A0AC>
+<725F> <725F> <C4B2>
+<7260> <7260> <A0AD>
+<7261> <7261> <C4B5>
+<7262> <7262> <C0CE>
+<7263> <7265> <A0AE>
+<7266> <7266> <EAF3>
+<7267> <7267> <C4C1>
+<7268> <7268> <A0B1>
+<7269> <7269> <CEEF>
+<726A> <726D> <A0B2>
+<726E> <726E> <EAF0>
+<726F> <726F> <EAF4>
+<7270> <7271> <A0B6>
+<7272> <7272> <C9FC>
+<7273> <7274> <A0B8>
+<7275> <7275> <C7A3>
+<7276> <7278> <A0BA>
+<7279> <7279> <CCD8>
+<727A> <727A> <CEFE>
+<727B> <727D> <A0BD>
+<727E> <727F> <EAF5>
+<7280> <7280> <CFAC>
+<7281> <7281> <C0E7>
+<7282> <7283> <A0C0>
+<7284> <7284> <EAF7>
+<7285> <7289> <A0C2>
+<728A> <728A> <B6BF>
+<728B> <728B> <EAF8>
+<728C> <728C> <A0C7>
+<728D> <728D> <EAF9>
+<728E> <728E> <A0C8>
+<728F> <728F> <EAFA>
+<7290> <7291> <A0C9>
+<7292> <7292> <EAFB>
+<7293> <729E> <A0CB>
+<729F> <729F> <EAF1>
+<72A0> <72AB> <A0D7>
+<72AC> <72AC> <C8AE>
+<72AD> <72AD> <E1EB>
+<72AE> <72AE> <A0E3>
+<72AF> <72AF> <B7B8>
+<72B0> <72B0> <E1EC>
+<72B1> <72B3> <A0E4>
+<72B4> <72B4> <E1ED>
+<72B5> <72B5> <A0E7>
+<72B6> <72B6> <D7B4>
+<72B7> <72B8> <E1EE>
+<72B9> <72B9> <D3CC>
+<72BA> <72C0> <A0E8>
+<72C1> <72C1> <E1F1>
+<72C2> <72C2> <BFF1>
+<72C3> <72C3> <E1F0>
+<72C4> <72C4> <B5D2>
+<72C5> <72C7> <A0EF>
+<72C8> <72C8> <B1B7>
+<72C9> <72CC> <A0F2>
+<72CD> <72CD> <E1F3>
+<72CE> <72CE> <E1F2>
+<72CF> <72CF> <A0F6>
+<72D0> <72D0> <BAFC>
+<72D1> <72D1> <A0F7>
+<72D2> <72D2> <E1F4>
+<72D3> <72D6> <A0F8>
+<72D7> <72D7> <B9B7>
+<72D8> <72D8> <A0FC>
+<72D9> <72D9> <BED1>
+<72DA> <72DB> <A0FD>
+<72DC> <72DD> <AA40>
+<72DE> <72DE> <C4FC>
+<72DF> <72DF> <AA42>
+<72E0> <72E0> <BADD>
+<72E1> <72E1> <BDC6>
+<72E2> <72E7> <AA43>
+<72E8> <72E8> <E1F5>
+<72E9> <72E9> <E1F7>
+<72EA> <72EB> <AA49>
+<72EC> <72EC> <B6C0>
+<72ED> <72ED> <CFC1>
+<72EE> <72EE> <CAA8>
+<72EF> <72EF> <E1F6>
+<72F0> <72F0> <D5F8>
+<72F1> <72F1> <D3FC>
+<72F2> <72F2> <E1F8>
+<72F3> <72F3> <E1FC>
+endbfrange
+
+100 beginbfrange
+<72F4> <72F4> <E1F9>
+<72F5> <72F6> <AA4B>
+<72F7> <72F7> <E1FA>
+<72F8> <72F8> <C0EA>
+<72F9> <72F9> <AA4D>
+<72FA> <72FA> <E1FE>
+<72FB> <72FB> <E2A1>
+<72FC> <72FC> <C0C7>
+<72FD> <72FF> <AA4E>
+<7300> <7300> <AA51>
+<7301> <7301> <E1FB>
+<7302> <7302> <AA52>
+<7303> <7303> <E1FD>
+<7304> <7309> <AA53>
+<730A> <730A> <E2A5>
+<730B> <730D> <AA59>
+<730E> <730E> <C1D4>
+<730F> <7312> <AA5C>
+<7313> <7313> <E2A3>
+<7314> <7314> <AA60>
+<7315> <7315> <E2A8>
+<7316> <7316> <B2FE>
+<7317> <7317> <E2A2>
+<7318> <731A> <AA61>
+<731B> <731B> <C3CD>
+<731C> <731C> <B2C2>
+<731D> <731D> <E2A7>
+<731E> <731E> <E2A6>
+<731F> <7320> <AA64>
+<7321> <7321> <E2A4>
+<7322> <7322> <E2A9>
+<7323> <7324> <AA66>
+<7325> <7325> <E2AB>
+<7326> <7328> <AA68>
+<7329> <7329> <D0C9>
+<732A> <732A> <D6ED>
+<732B> <732B> <C3A8>
+<732C> <732C> <E2AC>
+<732D> <732D> <AA6B>
+<732E> <732E> <CFD7>
+<732F> <7330> <AA6C>
+<7331> <7331> <E2AE>
+<7332> <7333> <AA6E>
+<7334> <7334> <BAEF>
+<7335> <7336> <AA70>
+<7337> <7337> <E9E0>
+<7338> <7338> <E2AD>
+<7339> <7339> <E2AA>
+<733A> <733D> <AA72>
+<733E> <733E> <BBAB>
+<733F> <733F> <D4B3>
+<7340> <7348> <AA76>
+<7349> <734C> <AA80>
+<734D> <734D> <E2B0>
+<734E> <734F> <AA84>
+<7350> <7350> <E2AF>
+<7351> <7351> <AA86>
+<7352> <7352> <E9E1>
+<7353> <7356> <AA87>
+<7357> <7357> <E2B1>
+<7358> <735F> <AA8B>
+<7360> <7360> <E2B2>
+<7361> <736B> <AA93>
+<736C> <736C> <E2B3>
+<736D> <736D> <CCA1>
+<736E> <736E> <AA9E>
+<736F> <736F> <E2B4>
+<7370> <7371> <AA9F>
+<7372> <737D> <AB40>
+<737E> <737E> <E2B5>
+<737F> <7383> <AB4C>
+<7384> <7384> <D0FE>
+<7385> <7386> <AB51>
+<7387> <7387> <C2CA>
+<7388> <7388> <AB53>
+<7389> <7389> <D3F1>
+<738A> <738A> <AB54>
+<738B> <738B> <CDF5>
+<738C> <738D> <AB55>
+<738E> <738E> <E7E0>
+<738F> <7390> <AB57>
+<7391> <7391> <E7E1>
+<7392> <7395> <AB59>
+<7396> <7396> <BEC1>
+<7397> <739A> <AB5D>
+<739B> <739B> <C2EA>
+<739C> <739E> <AB61>
+<739F> <739F> <E7E4>
+<73A0> <73A1> <AB64>
+<73A2> <73A2> <E7E3>
+<73A3> <73A8> <AB66>
+<73A9> <73A9> <CDE6>
+<73AA> <73AA> <AB6C>
+<73AB> <73AB> <C3B5>
+<73AC> <73AD> <AB6D>
+<73AE> <73AE> <E7E2>
+<73AF> <73AF> <BBB7>
+<73B0> <73B0> <CFD6>
+<73B1> <73B1> <AB6F>
+<73B2> <73B2> <C1E1>
+endbfrange
+
+100 beginbfrange
+<73B3> <73B3> <E7E9>
+<73B4> <73B6> <AB70>
+<73B7> <73B7> <E7E8>
+<73B8> <73B9> <AB73>
+<73BA> <73BA> <E7F4>
+<73BB> <73BB> <B2A3>
+<73BC> <73BF> <AB75>
+<73C0> <73C0> <E7EA>
+<73C1> <73C1> <AB79>
+<73C2> <73C2> <E7E6>
+<73C3> <73C7> <AB7A>
+<73C8> <73C8> <E7EC>
+<73C9> <73C9> <E7EB>
+<73CA> <73CA> <C9BA>
+<73CB> <73CC> <AB80>
+<73CD> <73CD> <D5E4>
+<73CE> <73CE> <AB82>
+<73CF> <73CF> <E7E5>
+<73D0> <73D0> <B7A9>
+<73D1> <73D1> <E7E7>
+<73D2> <73D8> <AB83>
+<73D9> <73D9> <E7EE>
+<73DA> <73DD> <AB8A>
+<73DE> <73DE> <E7F3>
+<73DF> <73DF> <AB8E>
+<73E0> <73E0> <D6E9>
+<73E1> <73E4> <AB8F>
+<73E5> <73E5> <E7ED>
+<73E6> <73E6> <AB93>
+<73E7> <73E7> <E7F2>
+<73E8> <73E8> <AB94>
+<73E9> <73E9> <E7F1>
+<73EA> <73EC> <AB95>
+<73ED> <73ED> <B0E0>
+<73EE> <73F1> <AB98>
+<73F2> <73F2> <E7F5>
+<73F3> <73F7> <AB9C>
+<73F8> <73FF> <AC40>
+<7400> <7402> <AC48>
+<7403> <7403> <C7F2>
+<7404> <7404> <AC4B>
+<7405> <7405> <C0C5>
+<7406> <7406> <C0ED>
+<7407> <7408> <AC4C>
+<7409> <7409> <C1F0>
+<740A> <740A> <E7F0>
+<740B> <740E> <AC4E>
+<740F> <740F> <E7F6>
+<7410> <7410> <CBF6>
+<7411> <7419> <AC52>
+<741A> <741A> <E8A2>
+<741B> <741B> <E8A1>
+<741C> <7421> <AC5B>
+<7422> <7422> <D7C1>
+<7423> <7424> <AC61>
+<7425> <7425> <E7FA>
+<7426> <7426> <E7F9>
+<7427> <7427> <AC63>
+<7428> <7428> <E7FB>
+<7429> <7429> <AC64>
+<742A> <742A> <E7F7>
+<742B> <742B> <AC65>
+<742C> <742C> <E7FE>
+<742D> <742D> <AC66>
+<742E> <742E> <E7FD>
+<742F> <742F> <AC67>
+<7430> <7430> <E7FC>
+<7431> <7432> <AC68>
+<7433> <7433> <C1D5>
+<7434> <7434> <C7D9>
+<7435> <7435> <C5FD>
+<7436> <7436> <C5C3>
+<7437> <743B> <AC6A>
+<743C> <743C> <C7ED>
+<743D> <7440> <AC6F>
+<7441> <7441> <E8A3>
+<7442> <744D> <AC73>
+<744E> <7454> <AC80>
+<7455> <7455> <E8A6>
+<7456> <7456> <AC87>
+<7457> <7457> <E8A5>
+<7458> <7458> <AC88>
+<7459> <7459> <E8A7>
+<745A> <745A> <BAF7>
+<745B> <745B> <E7F8>
+<745C> <745C> <E8A4>
+<745D> <745D> <AC89>
+<745E> <745E> <C8F0>
+<745F> <745F> <C9AA>
+<7460> <746C> <AC8A>
+<746D> <746D> <E8A9>
+<746E> <746F> <AC97>
+<7470> <7470> <B9E5>
+<7471> <7475> <AC99>
+<7476> <7476> <D1FE>
+<7477> <7477> <E8A8>
+<7478> <747A> <AC9E>
+<747B> <747D> <AD40>
+<747E> <747E> <E8AA>
+<747F> <747F> <AD43>
+endbfrange
+
+100 beginbfrange
+<7480> <7481> <E8AD>
+<7482> <7482> <AD44>
+<7483> <7483> <C1A7>
+<7484> <7486> <AD45>
+<7487> <7487> <E8AF>
+<7488> <748A> <AD48>
+<748B> <748B> <E8B0>
+<748C> <748D> <AD4B>
+<748E> <748E> <E8AC>
+<748F> <748F> <AD4D>
+<7490> <7490> <E8B4>
+<7491> <749B> <AD4E>
+<749C> <749C> <E8AB>
+<749D> <749D> <AD59>
+<749E> <749E> <E8B1>
+<749F> <74A6> <AD5A>
+<74A7> <74A7> <E8B5>
+<74A8> <74A9> <E8B2>
+<74AA> <74B9> <AD62>
+<74BA> <74BA> <E8B7>
+<74BB> <74C7> <AD72>
+<74C8> <74D1> <AD80>
+<74D2> <74D2> <E8B6>
+<74D3> <74DB> <AD8A>
+<74DC> <74DC> <B9CF>
+<74DD> <74DD> <AD93>
+<74DE> <74DE> <F0AC>
+<74DF> <74DF> <AD94>
+<74E0> <74E0> <F0AD>
+<74E1> <74E1> <AD95>
+<74E2> <74E2> <C6B0>
+<74E3> <74E3> <B0EA>
+<74E4> <74E4> <C8BF>
+<74E5> <74E5> <AD96>
+<74E6> <74E6> <CDDF>
+<74E7> <74ED> <AD97>
+<74EE> <74EE> <CECD>
+<74EF> <74EF> <EAB1>
+<74F0> <74F2> <AD9E>
+<74F3> <74F3> <AE40>
+<74F4> <74F4> <EAB2>
+<74F5> <74F5> <AE41>
+<74F6> <74F6> <C6BF>
+<74F7> <74F7> <B4C9>
+<74F8> <74FE> <AE42>
+<74FF> <74FF> <EAB3>
+<7500> <7503> <AE49>
+<7504> <7504> <D5E7>
+<7505> <750C> <AE4D>
+<750D> <750D> <DDF9>
+<750E> <750E> <AE55>
+<750F> <750F> <EAB4>
+<7510> <7510> <AE56>
+<7511> <7511> <EAB5>
+<7512> <7512> <AE57>
+<7513> <7513> <EAB6>
+<7514> <7517> <AE58>
+<7518> <7518> <B8CA>
+<7519> <7519> <DFB0>
+<751A> <751A> <C9F5>
+<751B> <751B> <AE5C>
+<751C> <751C> <CCF0>
+<751D> <751E> <AE5D>
+<751F> <751F> <C9FA>
+<7520> <7524> <AE5F>
+<7525> <7525> <C9FB>
+<7526> <7527> <AE64>
+<7528> <7528> <D3C3>
+<7529> <7529> <CBA6>
+<752A> <752A> <AE66>
+<752B> <752B> <B8A6>
+<752C> <752C> <F0AE>
+<752D> <752D> <B1C2>
+<752E> <752E> <AE67>
+<752F> <752F> <E5B8>
+<7530> <7530> <CCEF>
+<7531> <7531> <D3C9>
+<7532> <7532> <BCD7>
+<7533> <7533> <C9EA>
+<7534> <7534> <AE68>
+<7535> <7535> <B5E7>
+<7536> <7536> <AE69>
+<7537> <7537> <C4D0>
+<7538> <7538> <B5E9>
+<7539> <7539> <AE6A>
+<753A> <753A> <EEAE>
+<753B> <753B> <BBAD>
+<753C> <753D> <AE6B>
+<753E> <753E> <E7DE>
+<753F> <753F> <AE6D>
+<7540> <7540> <EEAF>
+<7541> <7544> <AE6E>
+<7545> <7545> <B3A9>
+<7546> <7547> <AE72>
+<7548> <7548> <EEB2>
+<7549> <754A> <AE74>
+<754B> <754B> <EEB1>
+<754C> <754C> <BDE7>
+<754D> <754D> <AE76>
+<754E> <754E> <EEB0>
+endbfrange
+
+100 beginbfrange
+<754F> <754F> <CEB7>
+<7550> <7553> <AE77>
+<7554> <7554> <C5CF>
+<7555> <7558> <AE7B>
+<7559> <7559> <C1F4>
+<755A> <755A> <DBCE>
+<755B> <755B> <EEB3>
+<755C> <755C> <D0F3>
+<755D> <7564> <AE80>
+<7565> <7565> <C2D4>
+<7566> <7566> <C6E8>
+<7567> <7569> <AE88>
+<756A> <756A> <B7AC>
+<756B> <7571> <AE8B>
+<7572> <7572> <EEB4>
+<7573> <7573> <AE92>
+<7574> <7574> <B3EB>
+<7575> <7577> <AE93>
+<7578> <7578> <BBFB>
+<7579> <7579> <EEB5>
+<757A> <757E> <AE96>
+<757F> <757F> <E7DC>
+<7580> <7582> <AE9B>
+<7583> <7583> <EEB6>
+<7584> <7585> <AE9E>
+<7586> <7586> <BDAE>
+<7587> <7587> <AEA0>
+<7588> <758A> <AF40>
+<758B> <758B> <F1E2>
+<758C> <758E> <AF43>
+<758F> <758F> <CAE8>
+<7590> <7590> <AF46>
+<7591> <7591> <D2C9>
+<7592> <7592> <F0DA>
+<7593> <7593> <AF47>
+<7594> <7594> <F0DB>
+<7595> <7595> <AF48>
+<7596> <7596> <F0DC>
+<7597> <7597> <C1C6>
+<7598> <7598> <AF49>
+<7599> <7599> <B8ED>
+<759A> <759A> <BECE>
+<759B> <759C> <AF4A>
+<759D> <759D> <F0DE>
+<759E> <759E> <AF4C>
+<759F> <759F> <C5B1>
+<75A0> <75A0> <F0DD>
+<75A1> <75A1> <D1F1>
+<75A2> <75A2> <AF4D>
+<75A3> <75A3> <F0E0>
+<75A4> <75A4> <B0CC>
+<75A5> <75A5> <BDEA>
+<75A6> <75AA> <AF4E>
+<75AB> <75AB> <D2DF>
+<75AC> <75AC> <F0DF>
+<75AD> <75AD> <AF53>
+<75AE> <75AE> <B4AF>
+<75AF> <75AF> <B7E8>
+<75B0> <75B0> <F0E6>
+<75B1> <75B1> <F0E5>
+<75B2> <75B2> <C6A3>
+<75B3> <75B4> <F0E1>
+<75B5> <75B5> <B4C3>
+<75B6> <75B7> <AF54>
+<75B8> <75B8> <F0E3>
+<75B9> <75B9> <D5EE>
+<75BA> <75BB> <AF56>
+<75BC> <75BC> <CCDB>
+<75BD> <75BD> <BED2>
+<75BE> <75BE> <BCB2>
+<75BF> <75C1> <AF58>
+<75C2> <75C2> <F0E8>
+<75C3> <75C3> <F0E7>
+<75C4> <75C4> <F0E4>
+<75C5> <75C5> <B2A1>
+<75C6> <75C6> <AF5B>
+<75C7> <75C7> <D6A2>
+<75C8> <75C8> <D3B8>
+<75C9> <75C9> <BEB7>
+<75CA> <75CA> <C8AC>
+<75CB> <75CC> <AF5C>
+<75CD> <75CD> <F0EA>
+<75CE> <75D1> <AF5E>
+<75D2> <75D2> <D1F7>
+<75D3> <75D3> <AF62>
+<75D4> <75D4> <D6CC>
+<75D5> <75D5> <BADB>
+<75D6> <75D6> <F0E9>
+<75D7> <75D7> <AF63>
+<75D8> <75D8> <B6BB>
+<75D9> <75DA> <AF64>
+<75DB> <75DB> <CDB4>
+<75DC> <75DD> <AF66>
+<75DE> <75DE> <C6A6>
+<75DF> <75E1> <AF68>
+<75E2> <75E2> <C1A1>
+<75E3> <75E3> <F0EB>
+<75E4> <75E4> <F0EE>
+<75E5> <75E5> <AF6B>
+<75E6> <75E6> <F0ED>
+endbfrange
+
+100 beginbfrange
+<75E7> <75E7> <F0F0>
+<75E8> <75E8> <F0EC>
+<75E9> <75E9> <AF6C>
+<75EA> <75EA> <BBBE>
+<75EB> <75EB> <F0EF>
+<75EC> <75EF> <AF6D>
+<75F0> <75F0> <CCB5>
+<75F1> <75F1> <F0F2>
+<75F2> <75F3> <AF71>
+<75F4> <75F4> <B3D5>
+<75F5> <75F8> <AF73>
+<75F9> <75F9> <B1D4>
+<75FA> <75FB> <AF77>
+<75FC> <75FC> <F0F3>
+<75FD> <75FE> <AF79>
+<75FF> <75FF> <F0F4>
+<7600> <7600> <F0F6>
+<7601> <7601> <B4E1>
+<7602> <7602> <AF7B>
+<7603> <7603> <F0F1>
+<7604> <7604> <AF7C>
+<7605> <7605> <F0F7>
+<7606> <7607> <AF7D>
+<7608> <7609> <AF80>
+<760A> <760A> <F0FA>
+<760B> <760B> <AF82>
+<760C> <760C> <F0F8>
+<760D> <760F> <AF83>
+<7610> <7610> <F0F5>
+<7611> <7614> <AF86>
+<7615> <7615> <F0FD>
+<7616> <7616> <AF8A>
+<7617> <7617> <F0F9>
+<7618> <7618> <F0FC>
+<7619> <7619> <F0FE>
+<761A> <761A> <AF8B>
+<761B> <761B> <F1A1>
+<761C> <761E> <AF8C>
+<761F> <761F> <CEC1>
+<7620> <7620> <F1A4>
+<7621> <7621> <AF8F>
+<7622> <7622> <F1A3>
+<7623> <7623> <AF90>
+<7624> <7624> <C1F6>
+<7625> <7625> <F0FB>
+<7626> <7626> <CADD>
+<7627> <7628> <AF91>
+<7629> <7629> <B4F1>
+<762A> <762A> <B1F1>
+<762B> <762B> <CCB1>
+<762C> <762C> <AF93>
+<762D> <762D> <F1A6>
+<762E> <762F> <AF94>
+<7630> <7630> <F1A7>
+<7631> <7632> <AF96>
+<7633> <7633> <F1AC>
+<7634> <7634> <D5CE>
+<7635> <7635> <F1A9>
+<7636> <7637> <AF98>
+<7638> <7638> <C8B3>
+<7639> <763B> <AF9A>
+<763C> <763C> <F1A2>
+<763D> <763D> <AF9D>
+<763E> <763E> <F1AB>
+<763F> <763F> <F1A8>
+<7640> <7640> <F1A5>
+<7641> <7642> <AF9E>
+<7643> <7643> <F1AA>
+<7644> <7644> <AFA0>
+<7645> <764B> <B040>
+<764C> <764C> <B0A9>
+<764D> <764D> <F1AD>
+<764E> <7653> <B047>
+<7654> <7654> <F1AF>
+<7655> <7655> <B04D>
+<7656> <7656> <F1B1>
+<7657> <765B> <B04E>
+<765C> <765C> <F1B0>
+<765D> <765D> <B053>
+<765E> <765E> <F1AE>
+<765F> <7662> <B054>
+<7663> <7663> <D1A2>
+<7664> <766A> <B058>
+<766B> <766B> <F1B2>
+<766C> <766E> <B05F>
+<766F> <766F> <F1B3>
+<7670> <7677> <B062>
+<7678> <7678> <B9EF>
+<7679> <767A> <B06A>
+<767B> <767B> <B5C7>
+<767C> <767C> <B06C>
+<767D> <767D> <B0D7>
+<767E> <767E> <B0D9>
+<767F> <7681> <B06D>
+<7682> <7682> <D4ED>
+<7683> <7683> <B070>
+<7684> <7684> <B5C4>
+<7685> <7685> <B071>
+<7686> <7686> <BDD4>
+<7687> <7687> <BBCA>
+endbfrange
+
+100 beginbfrange
+<7688> <7688> <F0A7>
+<7689> <768A> <B072>
+<768B> <768B> <B8DE>
+<768C> <768D> <B074>
+<768E> <768E> <F0A8>
+<768F> <7690> <B076>
+<7691> <7691> <B0A8>
+<7692> <7692> <B078>
+<7693> <7693> <F0A9>
+<7694> <7695> <B079>
+<7696> <7696> <CDEE>
+<7697> <7698> <B07B>
+<7699> <7699> <F0AA>
+<769A> <769B> <B07D>
+<769C> <76A3> <B080>
+<76A4> <76A4> <F0AB>
+<76A5> <76AD> <B088>
+<76AE> <76AE> <C6A4>
+<76AF> <76B0> <B091>
+<76B1> <76B1> <D6E5>
+<76B2> <76B2> <F1E4>
+<76B3> <76B3> <B093>
+<76B4> <76B4> <F1E5>
+<76B5> <76BE> <B094>
+<76BF> <76BF> <C3F3>
+<76C0> <76C1> <B09E>
+<76C2> <76C2> <D3DB>
+<76C3> <76C3> <B0A0>
+<76C4> <76C4> <B140>
+<76C5> <76C5> <D6D1>
+<76C6> <76C6> <C5E8>
+<76C7> <76C7> <B141>
+<76C8> <76C8> <D3AF>
+<76C9> <76C9> <B142>
+<76CA> <76CA> <D2E6>
+<76CB> <76CC> <B143>
+<76CD> <76CD> <EEC1>
+<76CE> <76CE> <B0BB>
+<76CF> <76CF> <D5B5>
+<76D0> <76D0> <D1CE>
+<76D1> <76D1> <BCE0>
+<76D2> <76D2> <BAD0>
+<76D3> <76D3> <B145>
+<76D4> <76D4> <BFF8>
+<76D5> <76D5> <B146>
+<76D6> <76D6> <B8C7>
+<76D7> <76D7> <B5C1>
+<76D8> <76D8> <C5CC>
+<76D9> <76DA> <B147>
+<76DB> <76DB> <CAA2>
+<76DC> <76DE> <B149>
+<76DF> <76DF> <C3CB>
+<76E0> <76E4> <B14C>
+<76E5> <76E5> <EEC2>
+<76E6> <76ED> <B151>
+<76EE> <76EE> <C4BF>
+<76EF> <76EF> <B6A2>
+<76F0> <76F0> <B159>
+<76F1> <76F1> <EDEC>
+<76F2> <76F2> <C3A4>
+<76F3> <76F3> <B15A>
+<76F4> <76F4> <D6B1>
+<76F5> <76F7> <B15B>
+<76F8> <76F8> <CFE0>
+<76F9> <76F9> <EDEF>
+<76FA> <76FB> <B15E>
+<76FC> <76FC> <C5CE>
+<76FD> <76FD> <B160>
+<76FE> <76FE> <B6DC>
+<76FF> <76FF> <B161>
+<7700> <7700> <B162>
+<7701> <7701> <CAA1>
+<7702> <7703> <B163>
+<7704> <7704> <EDED>
+<7705> <7706> <B165>
+<7707> <7708> <EDF0>
+<7709> <7709> <C3BC>
+<770A> <770A> <B167>
+<770B> <770B> <BFB4>
+<770C> <770C> <B168>
+<770D> <770D> <EDEE>
+<770E> <7718> <B169>
+<7719> <7719> <EDF4>
+<771A> <771A> <EDF2>
+<771B> <771E> <B174>
+<771F> <771F> <D5E6>
+<7720> <7720> <C3DF>
+<7721> <7721> <B178>
+<7722> <7722> <EDF3>
+<7723> <7725> <B179>
+<7726> <7726> <EDF6>
+<7727> <7727> <B17C>
+<7728> <7728> <D5A3>
+<7729> <7729> <D1A3>
+<772A> <772B> <B17D>
+<772C> <772C> <B180>
+<772D> <772D> <EDF5>
+<772E> <772E> <B181>
+<772F> <772F> <C3D0>
+<7730> <7734> <B182>
+endbfrange
+
+100 beginbfrange
+<7735> <7735> <EDF7>
+<7736> <7736> <BFF4>
+<7737> <7737> <BEEC>
+<7738> <7738> <EDF8>
+<7739> <7739> <B187>
+<773A> <773A> <CCF7>
+<773B> <773B> <B188>
+<773C> <773C> <D1DB>
+<773D> <773F> <B189>
+<7740> <7740> <D7C5>
+<7741> <7741> <D5F6>
+<7742> <7742> <B18C>
+<7743> <7743> <EDFC>
+<7744> <7746> <B18D>
+<7747> <7747> <EDFB>
+<7748> <774F> <B190>
+<7750> <7751> <EDF9>
+<7752> <7759> <B198>
+<775A> <775A> <EDFD>
+<775B> <775B> <BEA6>
+<775C> <775C> <B1A0>
+<775D> <7760> <B240>
+<7761> <7761> <CBAF>
+<7762> <7762> <EEA1>
+<7763> <7763> <B6BD>
+<7764> <7764> <B244>
+<7765> <7765> <EEA2>
+<7766> <7766> <C4C0>
+<7767> <7767> <B245>
+<7768> <7768> <EDFE>
+<7769> <776A> <B246>
+<776B> <776B> <BDDE>
+<776C> <776C> <B2C7>
+<776D> <7778> <B248>
+<7779> <7779> <B6C3>
+<777A> <777C> <B254>
+<777D> <777D> <EEA5>
+<777E> <777E> <D8BA>
+<777F> <777F> <EEA3>
+<7780> <7780> <EEA6>
+<7781> <7783> <B257>
+<7784> <7784> <C3E9>
+<7785> <7785> <B3F2>
+<7786> <778B> <B25A>
+<778C> <778C> <EEA7>
+<778D> <778D> <EEA4>
+<778E> <778E> <CFB9>
+<778F> <7790> <B260>
+<7791> <7791> <EEA8>
+<7792> <7792> <C2F7>
+<7793> <779E> <B262>
+<779F> <77A0> <EEA9>
+<77A1> <77A1> <B26E>
+<77A2> <77A2> <DEAB>
+<77A3> <77A4> <B26F>
+<77A5> <77A5> <C6B3>
+<77A6> <77A6> <B271>
+<77A7> <77A7> <C7C6>
+<77A8> <77A8> <B272>
+<77A9> <77A9> <D6F5>
+<77AA> <77AA> <B5C9>
+<77AB> <77AB> <B273>
+<77AC> <77AC> <CBB2>
+<77AD> <77AF> <B274>
+<77B0> <77B0> <EEAB>
+<77B1> <77B2> <B277>
+<77B3> <77B3> <CDAB>
+<77B4> <77B4> <B279>
+<77B5> <77B5> <EEAC>
+<77B6> <77BA> <B27A>
+<77BB> <77BB> <D5B0>
+<77BC> <77BC> <B280>
+<77BD> <77BD> <EEAD>
+<77BE> <77BE> <B281>
+<77BF> <77BF> <F6C4>
+<77C0> <77CC> <B282>
+<77CD> <77CD> <DBC7>
+<77CE> <77D6> <B28F>
+<77D7> <77D7> <B4A3>
+<77D8> <77DA> <B298>
+<77DB> <77DB> <C3AC>
+<77DC> <77DC> <F1E6>
+<77DD> <77E1> <B29B>
+<77E2> <77E2> <CAB8>
+<77E3> <77E3> <D2D3>
+<77E4> <77E4> <B2A0>
+<77E5> <77E5> <D6AA>
+<77E6> <77E6> <B340>
+<77E7> <77E7> <EFF2>
+<77E8> <77E8> <B341>
+<77E9> <77E9> <BED8>
+<77EA> <77EA> <B342>
+<77EB> <77EB> <BDC3>
+<77EC> <77EC> <EFF3>
+<77ED> <77ED> <B6CC>
+<77EE> <77EE> <B0AB>
+<77EF> <77F2> <B343>
+<77F3> <77F3> <CAAF>
+<77F4> <77F5> <B347>
+<77F6> <77F6> <EDB6>
+endbfrange
+
+100 beginbfrange
+<77F7> <77F7> <B349>
+<77F8> <77F8> <EDB7>
+<77F9> <77FC> <B34A>
+<77FD> <77FD> <CEF9>
+<77FE> <77FE> <B7AF>
+<77FF> <77FF> <BFF3>
+<7800> <7800> <EDB8>
+<7801> <7801> <C2EB>
+<7802> <7802> <C9B0>
+<7803> <7808> <B34E>
+<7809> <7809> <EDB9>
+<780A> <780B> <B354>
+<780C> <780C> <C6F6>
+<780D> <780D> <BFB3>
+<780E> <7810> <B356>
+<7811> <7811> <EDBC>
+<7812> <7812> <C5F8>
+<7813> <7813> <B359>
+<7814> <7814> <D1D0>
+<7815> <7815> <B35A>
+<7816> <7816> <D7A9>
+<7817> <7818> <EDBA>
+<7819> <7819> <B35B>
+<781A> <781A> <D1E2>
+<781B> <781B> <B35C>
+<781C> <781D> <EDBF>
+<781E> <781E> <B35D>
+<781F> <781F> <EDC4>
+<7820> <7822> <B35E>
+<7823> <7823> <EDC8>
+<7824> <7824> <B361>
+<7825> <7825> <EDC6>
+<7826> <7826> <EDCE>
+<7827> <7827> <D5E8>
+<7828> <7828> <B362>
+<7829> <7829> <EDC9>
+<782A> <782B> <B363>
+<782C> <782C> <EDC7>
+<782D> <782D> <EDBE>
+<782E> <782F> <B365>
+<7830> <7830> <C5E9>
+<7831> <7833> <B367>
+<7834> <7834> <C6C6>
+<7835> <7836> <B36A>
+<7837> <7837> <C9E9>
+<7838> <7838> <D4D2>
+<7839> <783B> <EDC1>
+<783C> <783C> <EDC5>
+<783D> <783D> <B36C>
+<783E> <783E> <C0F9>
+<783F> <783F> <B36D>
+<7840> <7840> <B4A1>
+<7841> <7844> <B36E>
+<7845> <7845> <B9E8>
+<7846> <7846> <B372>
+<7847> <7847> <EDD0>
+<7848> <784B> <B373>
+<784C> <784C> <EDD1>
+<784D> <784D> <B377>
+<784E> <784E> <EDCA>
+<784F> <784F> <B378>
+<7850> <7850> <EDCF>
+<7851> <7851> <B379>
+<7852> <7852> <CEF8>
+<7853> <7854> <B37A>
+<7855> <7855> <CBB6>
+<7856> <7857> <EDCC>
+<7858> <785A> <B37C>
+<785B> <785C> <B380>
+<785D> <785D> <CFF5>
+<785E> <7869> <B382>
+<786A> <786A> <EDD2>
+<786B> <786B> <C1F2>
+<786C> <786C> <D3B2>
+<786D> <786D> <EDCB>
+<786E> <786E> <C8B7>
+<786F> <7876> <B38E>
+<7877> <7877> <BCEF>
+<7878> <787B> <B396>
+<787C> <787C> <C5F0>
+<787D> <7883> <B39A>
+<7884> <7886> <B440>
+<7887> <7887> <EDD6>
+<7888> <7888> <B443>
+<7889> <7889> <B5EF>
+<788A> <788B> <B444>
+<788C> <788C> <C2B5>
+<788D> <788D> <B0AD>
+<788E> <788E> <CBE9>
+<788F> <7890> <B446>
+<7891> <7891> <B1AE>
+<7892> <7892> <B448>
+<7893> <7893> <EDD4>
+<7894> <7896> <B449>
+<7897> <7897> <CDEB>
+<7898> <7898> <B5E2>
+<7899> <7899> <B44C>
+<789A> <789A> <EDD5>
+<789B> <789B> <EDD3>
+<789C> <789C> <EDD7>
+endbfrange
+
+100 beginbfrange
+<789D> <789E> <B44D>
+<789F> <789F> <B5FA>
+<78A0> <78A0> <B44F>
+<78A1> <78A1> <EDD8>
+<78A2> <78A2> <B450>
+<78A3> <78A3> <EDD9>
+<78A4> <78A4> <B451>
+<78A5> <78A5> <EDDC>
+<78A6> <78A6> <B452>
+<78A7> <78A7> <B1CC>
+<78A8> <78AF> <B453>
+<78B0> <78B0> <C5F6>
+<78B1> <78B1> <BCEE>
+<78B2> <78B2> <EDDA>
+<78B3> <78B3> <CCBC>
+<78B4> <78B4> <B2EA>
+<78B5> <78B8> <B45B>
+<78B9> <78B9> <EDDB>
+<78BA> <78BD> <B45F>
+<78BE> <78BE> <C4EB>
+<78BF> <78C0> <B463>
+<78C1> <78C1> <B4C5>
+<78C2> <78C4> <B465>
+<78C5> <78C5> <B0F5>
+<78C6> <78C8> <B468>
+<78C9> <78C9> <EDDF>
+<78CA> <78CA> <C0DA>
+<78CB> <78CB> <B4E8>
+<78CC> <78CF> <B46B>
+<78D0> <78D0> <C5CD>
+<78D1> <78D3> <B46F>
+<78D4> <78D4> <EDDD>
+<78D5> <78D5> <BFC4>
+<78D6> <78D8> <B472>
+<78D9> <78D9> <EDDE>
+<78DA> <78E3> <B475>
+<78E4> <78E7> <B480>
+<78E8> <78E8> <C4A5>
+<78E9> <78EB> <B484>
+<78EC> <78EC> <EDE0>
+<78ED> <78F1> <B487>
+<78F2> <78F2> <EDE1>
+<78F3> <78F3> <B48C>
+<78F4> <78F4> <EDE3>
+<78F5> <78F6> <B48D>
+<78F7> <78F7> <C1D7>
+<78F8> <78F9> <B48F>
+<78FA> <78FA> <BBC7>
+<78FB> <78FF> <B491>
+<7900> <7900> <B496>
+<7901> <7901> <BDB8>
+<7902> <7904> <B497>
+<7905> <7905> <EDE2>
+<7906> <790C> <B49A>
+<790D> <7912> <B540>
+<7913> <7913> <EDE4>
+<7914> <791D> <B546>
+<791E> <791E> <EDE6>
+<791F> <7923> <B550>
+<7924> <7924> <EDE5>
+<7925> <7933> <B555>
+<7934> <7934> <EDE7>
+<7935> <7939> <B564>
+<793A> <793A> <CABE>
+<793B> <793B> <ECEA>
+<793C> <793C> <C0F1>
+<793D> <793D> <B569>
+<793E> <793E> <C9E7>
+<793F> <793F> <B56A>
+<7940> <7940> <ECEB>
+<7941> <7941> <C6EE>
+<7942> <7945> <B56B>
+<7946> <7946> <ECEC>
+<7947> <7947> <B56F>
+<7948> <7948> <C6ED>
+<7949> <7949> <ECED>
+<794A> <7952> <B570>
+<7953> <7953> <ECF0>
+<7954> <7955> <B579>
+<7956> <7956> <D7E6>
+<7957> <7957> <ECF3>
+<7958> <7959> <B57B>
+<795A> <795A> <ECF1>
+<795B> <795C> <ECEE>
+<795D> <795D> <D7A3>
+<795E> <795E> <C9F1>
+<795F> <795F> <CBEE>
+<7960> <7960> <ECF4>
+<7961> <7961> <B57D>
+<7962> <7962> <ECF2>
+<7963> <7963> <B57E>
+<7964> <7964> <B580>
+<7965> <7965> <CFE9>
+<7966> <7966> <B581>
+<7967> <7967> <ECF6>
+<7968> <7968> <C6B1>
+<7969> <796C> <B582>
+<796D> <796D> <BCC0>
+<796E> <796E> <B586>
+<796F> <796F> <ECF5>
+endbfrange
+
+100 beginbfrange
+<7970> <7976> <B587>
+<7977> <7977> <B5BB>
+<7978> <7978> <BBF6>
+<7979> <7979> <B58E>
+<797A> <797A> <ECF7>
+<797B> <797F> <B58F>
+<7980> <7980> <D9F7>
+<7981> <7981> <BDFB>
+<7982> <7983> <B594>
+<7984> <7984> <C2BB>
+<7985> <7985> <ECF8>
+<7986> <7989> <B596>
+<798A> <798A> <ECF9>
+<798B> <798E> <B59A>
+<798F> <798F> <B8A3>
+<7990> <7992> <B59E>
+<7993> <7999> <B640>
+<799A> <799A> <ECFA>
+<799B> <79A6> <B647>
+<79A7> <79A7> <ECFB>
+<79A8> <79B2> <B653>
+<79B3> <79B3> <ECFC>
+<79B4> <79B8> <B65E>
+<79B9> <79B9> <D3ED>
+<79BA> <79BA> <D8AE>
+<79BB> <79BB> <C0EB>
+<79BC> <79BC> <B663>
+<79BD> <79BD> <C7DD>
+<79BE> <79BE> <BACC>
+<79BF> <79BF> <B664>
+<79C0> <79C0> <D0E3>
+<79C1> <79C1> <CBBD>
+<79C2> <79C2> <B665>
+<79C3> <79C3> <CDBA>
+<79C4> <79C5> <B666>
+<79C6> <79C6> <B8D1>
+<79C7> <79C8> <B668>
+<79C9> <79C9> <B1FC>
+<79CA> <79CA> <B66A>
+<79CB> <79CB> <C7EF>
+<79CC> <79CC> <B66B>
+<79CD> <79CD> <D6D6>
+<79CE> <79D0> <B66C>
+<79D1> <79D1> <BFC6>
+<79D2> <79D2> <C3EB>
+<79D3> <79D4> <B66F>
+<79D5> <79D5> <EFF5>
+<79D6> <79D7> <B671>
+<79D8> <79D8> <C3D8>
+<79D9> <79DE> <B673>
+<79DF> <79DF> <D7E2>
+<79E0> <79E2> <B679>
+<79E3> <79E3> <EFF7>
+<79E4> <79E4> <B3D3>
+<79E5> <79E5> <B67C>
+<79E6> <79E6> <C7D8>
+<79E7> <79E7> <D1ED>
+<79E8> <79E8> <B67D>
+<79E9> <79E9> <D6C8>
+<79EA> <79EA> <B67E>
+<79EB> <79EB> <EFF8>
+<79EC> <79EC> <B680>
+<79ED> <79ED> <EFF6>
+<79EE> <79EE> <B681>
+<79EF> <79EF> <BBFD>
+<79F0> <79F0> <B3C6>
+<79F1> <79F7> <B682>
+<79F8> <79F8> <BDD5>
+<79F9> <79FA> <B689>
+<79FB> <79FB> <D2C6>
+<79FC> <79FC> <B68B>
+<79FD> <79FD> <BBE0>
+<79FE> <79FF> <B68C>
+<7A00> <7A00> <CFA1>
+<7A01> <7A01> <B68E>
+<7A02> <7A02> <EFFC>
+<7A03> <7A03> <EFFB>
+<7A04> <7A05> <B68F>
+<7A06> <7A06> <EFF9>
+<7A07> <7A0A> <B691>
+<7A0B> <7A0B> <B3CC>
+<7A0C> <7A0C> <B695>
+<7A0D> <7A0D> <C9D4>
+<7A0E> <7A0E> <CBB0>
+<7A0F> <7A13> <B696>
+<7A14> <7A14> <EFFE>
+<7A15> <7A16> <B69B>
+<7A17> <7A17> <B0DE>
+<7A18> <7A19> <B69D>
+<7A1A> <7A1A> <D6C9>
+<7A1B> <7A1C> <B69F>
+<7A1D> <7A1D> <B740>
+<7A1E> <7A1E> <EFFD>
+<7A1F> <7A1F> <B741>
+<7A20> <7A20> <B3ED>
+<7A21> <7A22> <B742>
+<7A23> <7A23> <F6D5>
+<7A24> <7A32> <B744>
+<7A33> <7A33> <CEC8>
+<7A34> <7A36> <B753>
+endbfrange
+
+100 beginbfrange
+<7A37> <7A37> <F0A2>
+<7A38> <7A38> <B756>
+<7A39> <7A39> <F0A1>
+<7A3A> <7A3A> <B757>
+<7A3B> <7A3B> <B5BE>
+<7A3C> <7A3C> <BCDA>
+<7A3D> <7A3D> <BBFC>
+<7A3E> <7A3E> <B758>
+<7A3F> <7A3F> <B8E5>
+<7A40> <7A45> <B759>
+<7A46> <7A46> <C4C2>
+<7A47> <7A50> <B75F>
+<7A51> <7A51> <F0A3>
+<7A52> <7A56> <B769>
+<7A57> <7A57> <CBEB>
+<7A58> <7A68> <B76E>
+<7A69> <7A6F> <B780>
+<7A70> <7A70> <F0A6>
+<7A71> <7A73> <B787>
+<7A74> <7A74> <D1A8>
+<7A75> <7A75> <B78A>
+<7A76> <7A76> <BEBF>
+<7A77> <7A77> <C7EE>
+<7A78> <7A79> <F1B6>
+<7A7A> <7A7A> <BFD5>
+<7A7B> <7A7E> <B78B>
+<7A7F> <7A7F> <B4A9>
+<7A80> <7A80> <F1B8>
+<7A81> <7A81> <CDBB>
+<7A82> <7A82> <B78F>
+<7A83> <7A83> <C7D4>
+<7A84> <7A84> <D5AD>
+<7A85> <7A85> <B790>
+<7A86> <7A86> <F1B9>
+<7A87> <7A87> <B791>
+<7A88> <7A88> <F1BA>
+<7A89> <7A8C> <B792>
+<7A8D> <7A8D> <C7CF>
+<7A8E> <7A90> <B796>
+<7A91> <7A91> <D2A4>
+<7A92> <7A92> <D6CF>
+<7A93> <7A94> <B799>
+<7A95> <7A95> <F1BB>
+<7A96> <7A96> <BDD1>
+<7A97> <7A97> <B4B0>
+<7A98> <7A98> <BEBD>
+<7A99> <7A9B> <B79B>
+<7A9C> <7A9C> <B4DC>
+<7A9D> <7A9D> <CED1>
+<7A9E> <7A9E> <B79E>
+<7A9F> <7A9F> <BFDF>
+<7AA0> <7AA0> <F1BD>
+<7AA1> <7AA2> <B79F>
+<7AA3> <7AA4> <B840>
+<7AA5> <7AA5> <BFFA>
+<7AA6> <7AA6> <F1BC>
+<7AA7> <7AA7> <B842>
+<7AA8> <7AA8> <F1BF>
+<7AA9> <7AAB> <B843>
+<7AAC> <7AAC> <F1BE>
+<7AAD> <7AAD> <F1C0>
+<7AAE> <7AB2> <B846>
+<7AB3> <7AB3> <F1C1>
+<7AB4> <7ABE> <B84B>
+<7ABF> <7ABF> <C1FE>
+<7AC0> <7ACA> <B856>
+<7ACB> <7ACB> <C1A2>
+<7ACC> <7AD5> <B861>
+<7AD6> <7AD6> <CAFA>
+<7AD7> <7AD8> <B86B>
+<7AD9> <7AD9> <D5BE>
+<7ADA> <7ADD> <B86D>
+<7ADE> <7ADE> <BEBA>
+<7ADF> <7ADF> <BEB9>
+<7AE0> <7AE0> <D5C2>
+<7AE1> <7AE2> <B871>
+<7AE3> <7AE3> <BFA2>
+<7AE4> <7AE4> <B873>
+<7AE5> <7AE5> <CDAF>
+<7AE6> <7AE6> <F1B5>
+<7AE7> <7AEC> <B874>
+<7AED> <7AED> <BDDF>
+<7AEE> <7AEE> <B87A>
+<7AEF> <7AEF> <B6CB>
+<7AF0> <7AF3> <B87B>
+<7AF4> <7AF8> <B880>
+<7AF9> <7AF9> <D6F1>
+<7AFA> <7AFA> <F3C3>
+<7AFB> <7AFC> <B885>
+<7AFD> <7AFD> <F3C4>
+<7AFE> <7AFE> <B887>
+<7AFF> <7AFF> <B8CD>
+<7B00> <7B02> <B888>
+<7B03> <7B04> <F3C6>
+<7B05> <7B05> <B88B>
+<7B06> <7B06> <B0CA>
+<7B07> <7B07> <B88C>
+<7B08> <7B08> <F3C5>
+<7B09> <7B09> <B88D>
+<7B0A> <7B0A> <F3C9>
+endbfrange
+
+100 beginbfrange
+<7B0B> <7B0B> <CBF1>
+<7B0C> <7B0E> <B88E>
+<7B0F> <7B0F> <F3CB>
+<7B10> <7B10> <B891>
+<7B11> <7B11> <D0A6>
+<7B12> <7B13> <B892>
+<7B14> <7B14> <B1CA>
+<7B15> <7B15> <F3C8>
+<7B16> <7B18> <B894>
+<7B19> <7B19> <F3CF>
+<7B1A> <7B1A> <B897>
+<7B1B> <7B1B> <B5D1>
+<7B1C> <7B1D> <B898>
+<7B1E> <7B1E> <F3D7>
+<7B1F> <7B1F> <B89A>
+<7B20> <7B20> <F3D2>
+<7B21> <7B23> <B89B>
+<7B24> <7B24> <F3D4>
+<7B25> <7B25> <F3D3>
+<7B26> <7B26> <B7FB>
+<7B27> <7B27> <B89E>
+<7B28> <7B28> <B1BF>
+<7B29> <7B29> <B89F>
+<7B2A> <7B2A> <F3CE>
+<7B2B> <7B2B> <F3CA>
+<7B2C> <7B2C> <B5DA>
+<7B2D> <7B2D> <B8A0>
+<7B2E> <7B2E> <F3D0>
+<7B2F> <7B30> <B940>
+<7B31> <7B31> <F3D1>
+<7B32> <7B32> <B942>
+<7B33> <7B33> <F3D5>
+<7B34> <7B37> <B943>
+<7B38> <7B38> <F3CD>
+<7B39> <7B39> <B947>
+<7B3A> <7B3A> <BCE3>
+<7B3B> <7B3B> <B948>
+<7B3C> <7B3C> <C1FD>
+<7B3D> <7B3D> <B949>
+<7B3E> <7B3E> <F3D6>
+<7B3F> <7B44> <B94A>
+<7B45> <7B45> <F3DA>
+<7B46> <7B46> <B950>
+<7B47> <7B47> <F3CC>
+<7B48> <7B48> <B951>
+<7B49> <7B49> <B5C8>
+<7B4A> <7B4A> <B952>
+<7B4B> <7B4B> <BDEE>
+<7B4C> <7B4C> <F3DC>
+<7B4D> <7B4E> <B953>
+<7B4F> <7B4F> <B7A4>
+<7B50> <7B50> <BFF0>
+<7B51> <7B51> <D6FE>
+<7B52> <7B52> <CDB2>
+<7B53> <7B53> <B955>
+<7B54> <7B54> <B4F0>
+<7B55> <7B55> <B956>
+<7B56> <7B56> <B2DF>
+<7B57> <7B57> <B957>
+<7B58> <7B58> <F3D8>
+<7B59> <7B59> <B958>
+<7B5A> <7B5A> <F3D9>
+<7B5B> <7B5B> <C9B8>
+<7B5C> <7B5C> <B959>
+<7B5D> <7B5D> <F3DD>
+<7B5E> <7B5F> <B95A>
+<7B60> <7B60> <F3DE>
+<7B61> <7B61> <B95C>
+<7B62> <7B62> <F3E1>
+<7B63> <7B6D> <B95D>
+<7B6E> <7B6E> <F3DF>
+<7B6F> <7B70> <B968>
+<7B71> <7B71> <F3E3>
+<7B72> <7B72> <F3E2>
+<7B73> <7B74> <B96A>
+<7B75> <7B75> <F3DB>
+<7B76> <7B76> <B96C>
+<7B77> <7B77> <BFEA>
+<7B78> <7B78> <B96D>
+<7B79> <7B79> <B3EF>
+<7B7A> <7B7A> <B96E>
+<7B7B> <7B7B> <F3E0>
+<7B7C> <7B7D> <B96F>
+<7B7E> <7B7E> <C7A9>
+<7B7F> <7B7F> <B971>
+<7B80> <7B80> <BCF2>
+<7B81> <7B84> <B972>
+<7B85> <7B85> <F3EB>
+<7B86> <7B8C> <B976>
+<7B8D> <7B8D> <B9BF>
+<7B8E> <7B8F> <B97D>
+<7B90> <7B90> <F3E4>
+<7B91> <7B93> <B980>
+<7B94> <7B94> <B2AD>
+<7B95> <7B95> <BBFE>
+<7B96> <7B96> <B983>
+<7B97> <7B97> <CBE3>
+<7B98> <7B9B> <B984>
+<7B9C> <7B9C> <F3ED>
+<7B9D> <7B9D> <F3E9>
+endbfrange
+
+100 beginbfrange
+<7B9E> <7BA0> <B988>
+<7BA1> <7BA1> <B9DC>
+<7BA2> <7BA2> <F3EE>
+<7BA3> <7BA5> <B98B>
+<7BA6> <7BA7> <F3E5>
+<7BA8> <7BA8> <F3EA>
+<7BA9> <7BA9> <C2E1>
+<7BAA> <7BAA> <F3EC>
+<7BAB> <7BAB> <F3EF>
+<7BAC> <7BAC> <F3E8>
+<7BAD> <7BAD> <BCFD>
+<7BAE> <7BB0> <B98E>
+<7BB1> <7BB1> <CFE4>
+<7BB2> <7BB3> <B991>
+<7BB4> <7BB4> <F3F0>
+<7BB5> <7BB7> <B993>
+<7BB8> <7BB8> <F3E7>
+<7BB9> <7BC0> <B996>
+<7BC1> <7BC1> <F3F2>
+<7BC2> <7BC4> <B99E>
+<7BC5> <7BC5> <BA40>
+<7BC6> <7BC6> <D7AD>
+<7BC7> <7BC7> <C6AA>
+<7BC8> <7BCB> <BA41>
+<7BCC> <7BCC> <F3F3>
+<7BCD> <7BD0> <BA45>
+<7BD1> <7BD1> <F3F1>
+<7BD2> <7BD2> <BA49>
+<7BD3> <7BD3> <C2A8>
+<7BD4> <7BD8> <BA4A>
+<7BD9> <7BD9> <B8DD>
+<7BDA> <7BDA> <F3F5>
+<7BDB> <7BDC> <BA4F>
+<7BDD> <7BDD> <F3F4>
+<7BDE> <7BE0> <BA51>
+<7BE1> <7BE1> <B4DB>
+<7BE2> <7BE4> <BA54>
+<7BE5> <7BE6> <F3F6>
+<7BE7> <7BE9> <BA57>
+<7BEA> <7BEA> <F3F8>
+<7BEB> <7BED> <BA5A>
+<7BEE> <7BEE> <C0BA>
+<7BEF> <7BF0> <BA5D>
+<7BF1> <7BF1> <C0E9>
+<7BF2> <7BF6> <BA5F>
+<7BF7> <7BF7> <C5F1>
+<7BF8> <7BFB> <BA64>
+<7BFC> <7BFC> <F3FB>
+<7BFD> <7BFD> <BA68>
+<7BFE> <7BFE> <F3FA>
+<7BFF> <7BFF> <BA69>
+<7C00> <7C06> <BA6A>
+<7C07> <7C07> <B4D8>
+<7C08> <7C0A> <BA71>
+<7C0B> <7C0B> <F3FE>
+<7C0C> <7C0C> <F3F9>
+<7C0D> <7C0E> <BA74>
+<7C0F> <7C0F> <F3FC>
+<7C10> <7C15> <BA76>
+<7C16> <7C16> <F3FD>
+<7C17> <7C19> <BA7C>
+<7C1A> <7C1E> <BA80>
+<7C1F> <7C1F> <F4A1>
+<7C20> <7C25> <BA85>
+<7C26> <7C26> <F4A3>
+<7C27> <7C27> <BBC9>
+<7C28> <7C29> <BA8B>
+<7C2A> <7C2A> <F4A2>
+<7C2B> <7C37> <BA8D>
+<7C38> <7C38> <F4A4>
+<7C39> <7C3E> <BA9A>
+<7C3F> <7C3F> <B2BE>
+<7C40> <7C40> <F4A6>
+<7C41> <7C41> <F4A5>
+<7C42> <7C42> <BAA0>
+<7C43> <7C4C> <BB40>
+<7C4D> <7C4D> <BCAE>
+<7C4E> <7C72> <BB4A>
+<7C73> <7C73> <C3D7>
+<7C74> <7C74> <D9E1>
+<7C75> <7C7A> <BB6F>
+<7C7B> <7C7B> <C0E0>
+<7C7C> <7C7C> <F4CC>
+<7C7D> <7C7D> <D7D1>
+<7C7E> <7C87> <BB75>
+<7C88> <7C88> <BB80>
+<7C89> <7C89> <B7DB>
+<7C8A> <7C90> <BB81>
+<7C91> <7C91> <F4CE>
+<7C92> <7C92> <C1A3>
+<7C93> <7C94> <BB88>
+<7C95> <7C95> <C6C9>
+<7C96> <7C96> <BB8A>
+<7C97> <7C97> <B4D6>
+<7C98> <7C98> <D5B3>
+<7C99> <7C9B> <BB8B>
+<7C9C> <7C9C> <F4D0>
+<7C9D> <7C9D> <F4CF>
+<7C9E> <7C9E> <F4D1>
+<7C9F> <7C9F> <CBDA>
+endbfrange
+
+100 beginbfrange
+<7CA0> <7CA1> <BB8E>
+<7CA2> <7CA2> <F4D2>
+<7CA3> <7CA3> <BB90>
+<7CA4> <7CA4> <D4C1>
+<7CA5> <7CA5> <D6E0>
+<7CA6> <7CA9> <BB91>
+<7CAA> <7CAA> <B7E0>
+<7CAB> <7CAD> <BB95>
+<7CAE> <7CAE> <C1B8>
+<7CAF> <7CB0> <BB98>
+<7CB1> <7CB1> <C1BB>
+<7CB2> <7CB2> <F4D3>
+<7CB3> <7CB3> <BEAC>
+<7CB4> <7CB8> <BB9A>
+<7CB9> <7CB9> <B4E2>
+<7CBA> <7CBB> <BB9F>
+<7CBC> <7CBD> <F4D4>
+<7CBE> <7CBE> <BEAB>
+<7CBF> <7CC0> <BC40>
+<7CC1> <7CC1> <F4D6>
+<7CC2> <7CC4> <BC42>
+<7CC5> <7CC5> <F4DB>
+<7CC6> <7CC6> <BC45>
+<7CC7> <7CC7> <F4D7>
+<7CC8> <7CC8> <F4DA>
+<7CC9> <7CC9> <BC46>
+<7CCA> <7CCA> <BAFD>
+<7CCB> <7CCB> <BC47>
+<7CCC> <7CCD> <F4D8>
+<7CCE> <7CD4> <BC48>
+<7CD5> <7CD5> <B8E2>
+<7CD6> <7CD6> <CCC7>
+<7CD7> <7CD7> <F4DC>
+<7CD8> <7CD8> <BC4F>
+<7CD9> <7CD9> <B2DA>
+<7CDA> <7CDB> <BC50>
+<7CDC> <7CDC> <C3D3>
+<7CDD> <7CDE> <BC52>
+<7CDF> <7CDF> <D4E3>
+<7CE0> <7CE0> <BFB7>
+<7CE1> <7CE7> <BC54>
+<7CE8> <7CE8> <F4DD>
+<7CE9> <7CEE> <BC5B>
+<7CEF> <7CEF> <C5B4>
+<7CF0> <7CF7> <BC61>
+<7CF8> <7CF8> <F4E9>
+<7CF9> <7CFA> <BC69>
+<7CFB> <7CFB> <CFB5>
+<7CFC> <7CFF> <BC6B>
+<7D00> <7D09> <BC6F>
+<7D0A> <7D0A> <CEC9>
+<7D0B> <7D10> <BC79>
+<7D11> <7D1F> <BC80>
+<7D20> <7D20> <CBD8>
+<7D21> <7D21> <BC8F>
+<7D22> <7D22> <CBF7>
+<7D23> <7D26> <BC90>
+<7D27> <7D27> <BDF4>
+<7D28> <7D2A> <BC94>
+<7D2B> <7D2B> <D7CF>
+<7D2C> <7D2E> <BC97>
+<7D2F> <7D2F> <C0DB>
+<7D30> <7D36> <BC9A>
+<7D37> <7D6D> <BD40>
+<7D6E> <7D6E> <D0F5>
+<7D6F> <7D76> <BD77>
+<7D77> <7D77> <F4EA>
+<7D78> <7D98> <BD80>
+<7D99> <7DA5> <BE40>
+<7DA6> <7DA6> <F4EB>
+<7DA7> <7DAD> <BE4D>
+<7DAE> <7DAE> <F4EC>
+<7DAF> <7DD9> <BE54>
+<7DDA> <7DFA> <BE80>
+<7DFB> <7DFF> <BF40>
+<7E00> <7E39> <BF45>
+<7E3A> <7E3A> <BF80>
+<7E3B> <7E3B> <F7E3>
+<7E3C> <7E40> <BF81>
+<7E41> <7E41> <B7B1>
+<7E42> <7E46> <BF86>
+<7E47> <7E47> <F4ED>
+<7E48> <7E5D> <BF8B>
+<7E5E> <7E81> <C040>
+<7E82> <7E82> <D7EB>
+<7E83> <7E9A> <C064>
+<7E9B> <7E9B> <F4EE>
+<7E9C> <7E9E> <C07C>
+<7E9F> <7E9F> <E6F9>
+<7EA0> <7EA0> <BEC0>
+<7EA1> <7EA1> <E6FA>
+<7EA2> <7EA2> <BAEC>
+<7EA3> <7EA3> <E6FB>
+<7EA4> <7EA4> <CFCB>
+<7EA5> <7EA5> <E6FC>
+<7EA6> <7EA6> <D4BC>
+<7EA7> <7EA7> <BCB6>
+<7EA8> <7EA9> <E6FD>
+<7EAA> <7EAA> <BCCD>
+<7EAB> <7EAB> <C8D2>
+endbfrange
+
+100 beginbfrange
+<7EAC> <7EAC> <CEB3>
+<7EAD> <7EAD> <E7A1>
+<7EAE> <7EAE> <C080>
+<7EAF> <7EAF> <B4BF>
+<7EB0> <7EB0> <E7A2>
+<7EB1> <7EB1> <C9B4>
+<7EB2> <7EB2> <B8D9>
+<7EB3> <7EB3> <C4C9>
+<7EB4> <7EB4> <C081>
+<7EB5> <7EB5> <D7DD>
+<7EB6> <7EB6> <C2DA>
+<7EB7> <7EB7> <B7D7>
+<7EB8> <7EB8> <D6BD>
+<7EB9> <7EB9> <CEC6>
+<7EBA> <7EBA> <B7C4>
+<7EBB> <7EBC> <C082>
+<7EBD> <7EBD> <C5A6>
+<7EBE> <7EBE> <E7A3>
+<7EBF> <7EBF> <CFDF>
+<7EC0> <7EC2> <E7A4>
+<7EC3> <7EC3> <C1B7>
+<7EC4> <7EC4> <D7E9>
+<7EC5> <7EC5> <C9F0>
+<7EC6> <7EC6> <CFB8>
+<7EC7> <7EC7> <D6AF>
+<7EC8> <7EC8> <D6D5>
+<7EC9> <7EC9> <E7A7>
+<7ECA> <7ECA> <B0ED>
+<7ECB> <7ECC> <E7A8>
+<7ECD> <7ECD> <C9DC>
+<7ECE> <7ECE> <D2EF>
+<7ECF> <7ECF> <BEAD>
+<7ED0> <7ED0> <E7AA>
+<7ED1> <7ED1> <B0F3>
+<7ED2> <7ED2> <C8DE>
+<7ED3> <7ED3> <BDE1>
+<7ED4> <7ED4> <E7AB>
+<7ED5> <7ED5> <C8C6>
+<7ED6> <7ED6> <C084>
+<7ED7> <7ED7> <E7AC>
+<7ED8> <7ED8> <BBE6>
+<7ED9> <7ED9> <B8F8>
+<7EDA> <7EDA> <D1A4>
+<7EDB> <7EDB> <E7AD>
+<7EDC> <7EDC> <C2E7>
+<7EDD> <7EDD> <BEF8>
+<7EDE> <7EDE> <BDCA>
+<7EDF> <7EDF> <CDB3>
+<7EE0> <7EE1> <E7AE>
+<7EE2> <7EE2> <BEEE>
+<7EE3> <7EE3> <D0E5>
+<7EE4> <7EE4> <C085>
+<7EE5> <7EE5> <CBE7>
+<7EE6> <7EE6> <CCD0>
+<7EE7> <7EE7> <BCCC>
+<7EE8> <7EE8> <E7B0>
+<7EE9> <7EE9> <BCA8>
+<7EEA> <7EEA> <D0F7>
+<7EEB> <7EEB> <E7B1>
+<7EEC> <7EEC> <C086>
+<7EED> <7EED> <D0F8>
+<7EEE> <7EEF> <E7B2>
+<7EF0> <7EF0> <B4C2>
+<7EF1> <7EF2> <E7B4>
+<7EF3> <7EF3> <C9FE>
+<7EF4> <7EF4> <CEAC>
+<7EF5> <7EF5> <C3E0>
+<7EF6> <7EF6> <E7B7>
+<7EF7> <7EF7> <B1C1>
+<7EF8> <7EF8> <B3F1>
+<7EF9> <7EF9> <C087>
+<7EFA> <7EFB> <E7B8>
+<7EFC> <7EFC> <D7DB>
+<7EFD> <7EFD> <D5C0>
+<7EFE> <7EFE> <E7BA>
+<7EFF> <7EFF> <C2CC>
+<7F00> <7F00> <D7BA>
+<7F01> <7F03> <E7BB>
+<7F04> <7F04> <BCEA>
+<7F05> <7F05> <C3E5>
+<7F06> <7F06> <C0C2>
+<7F07> <7F08> <E7BE>
+<7F09> <7F09> <BCA9>
+<7F0A> <7F0A> <C088>
+<7F0B> <7F0C> <E7C0>
+<7F0D> <7F0D> <E7B6>
+<7F0E> <7F0E> <B6D0>
+<7F0F> <7F0F> <E7C2>
+<7F10> <7F10> <C089>
+<7F11> <7F12> <E7C3>
+<7F13> <7F13> <BBBA>
+<7F14> <7F14> <B5DE>
+<7F15> <7F15> <C2C6>
+<7F16> <7F16> <B1E0>
+<7F17> <7F17> <E7C5>
+<7F18> <7F18> <D4B5>
+<7F19> <7F19> <E7C6>
+<7F1A> <7F1A> <B8BF>
+<7F1B> <7F1B> <E7C8>
+<7F1C> <7F1C> <E7C7>
+endbfrange
+
+100 beginbfrange
+<7F1D> <7F1D> <B7EC>
+<7F1E> <7F1E> <C08A>
+<7F1F> <7F1F> <E7C9>
+<7F20> <7F20> <B2F8>
+<7F21> <7F27> <E7CA>
+<7F28> <7F28> <D3A7>
+<7F29> <7F29> <CBF5>
+<7F2A> <7F2D> <E7D1>
+<7F2E> <7F2E> <C9C9>
+<7F2F> <7F33> <E7D5>
+<7F34> <7F34> <BDC9>
+<7F35> <7F35> <E7DA>
+<7F36> <7F36> <F3BE>
+<7F37> <7F37> <C08B>
+<7F38> <7F38> <B8D7>
+<7F39> <7F39> <C08C>
+<7F3A> <7F3A> <C8B1>
+<7F3B> <7F41> <C08D>
+<7F42> <7F42> <F3BF>
+<7F43> <7F43> <C094>
+<7F44> <7F45> <F3C0>
+<7F46> <7F4F> <C095>
+<7F50> <7F50> <B9DE>
+<7F51> <7F51> <CDF8>
+<7F52> <7F53> <C09F>
+<7F54> <7F54> <D8E8>
+<7F55> <7F55> <BAB1>
+<7F56> <7F56> <C140>
+<7F57> <7F57> <C2DE>
+<7F58> <7F58> <EEB7>
+<7F59> <7F59> <C141>
+<7F5A> <7F5A> <B7A3>
+<7F5B> <7F5E> <C142>
+<7F5F> <7F5F> <EEB9>
+<7F60> <7F60> <C146>
+<7F61> <7F61> <EEB8>
+<7F62> <7F62> <B0D5>
+<7F63> <7F67> <C147>
+<7F68> <7F68> <EEBB>
+<7F69> <7F69> <D5D6>
+<7F6A> <7F6A> <D7EF>
+<7F6B> <7F6D> <C14C>
+<7F6E> <7F6E> <D6C3>
+<7F6F> <7F70> <C14F>
+<7F71> <7F71> <EEBD>
+<7F72> <7F72> <CAF0>
+<7F73> <7F73> <C151>
+<7F74> <7F74> <EEBC>
+<7F75> <7F78> <C152>
+<7F79> <7F79> <EEBE>
+<7F7A> <7F7D> <C156>
+<7F7E> <7F7E> <EEC0>
+<7F7F> <7F80> <C15A>
+<7F81> <7F81> <EEBF>
+<7F82> <7F89> <C15C>
+<7F8A> <7F8A> <D1F2>
+<7F8B> <7F8B> <C164>
+<7F8C> <7F8C> <C7BC>
+<7F8D> <7F8D> <C165>
+<7F8E> <7F8E> <C3C0>
+<7F8F> <7F93> <C166>
+<7F94> <7F94> <B8E1>
+<7F95> <7F99> <C16B>
+<7F9A> <7F9A> <C1E7>
+<7F9B> <7F9C> <C170>
+<7F9D> <7F9D> <F4C6>
+<7F9E> <7F9E> <D0DF>
+<7F9F> <7F9F> <F4C7>
+<7FA0> <7FA0> <C172>
+<7FA1> <7FA1> <CFDB>
+<7FA2> <7FA3> <C173>
+<7FA4> <7FA4> <C8BA>
+<7FA5> <7FA6> <C175>
+<7FA7> <7FA7> <F4C8>
+<7FA8> <7FAE> <C177>
+<7FAF> <7FB0> <F4C9>
+<7FB1> <7FB1> <C17E>
+<7FB2> <7FB2> <F4CB>
+<7FB3> <7FB7> <C180>
+<7FB8> <7FB8> <D9FA>
+<7FB9> <7FB9> <B8FE>
+<7FBA> <7FBB> <C185>
+<7FBC> <7FBC> <E5F1>
+<7FBD> <7FBD> <D3F0>
+<7FBE> <7FBE> <C187>
+<7FBF> <7FBF> <F4E0>
+<7FC0> <7FC0> <C188>
+<7FC1> <7FC1> <CECC>
+<7FC2> <7FC4> <C189>
+<7FC5> <7FC5> <B3E1>
+<7FC6> <7FC9> <C18C>
+<7FCA> <7FCA> <F1B4>
+<7FCB> <7FCB> <C190>
+<7FCC> <7FCC> <D2EE>
+<7FCD> <7FCD> <C191>
+<7FCE> <7FCE> <F4E1>
+<7FCF> <7FD3> <C192>
+<7FD4> <7FD4> <CFE8>
+<7FD5> <7FD5> <F4E2>
+<7FD6> <7FD7> <C197>
+endbfrange
+
+100 beginbfrange
+<7FD8> <7FD8> <C7CC>
+<7FD9> <7FDE> <C199>
+<7FDF> <7FDF> <B5D4>
+<7FE0> <7FE0> <B4E4>
+<7FE1> <7FE1> <F4E4>
+<7FE2> <7FE3> <C19F>
+<7FE4> <7FE4> <C240>
+<7FE5> <7FE5> <F4E3>
+<7FE6> <7FE6> <F4E5>
+<7FE7> <7FE8> <C241>
+<7FE9> <7FE9> <F4E6>
+<7FEA> <7FED> <C243>
+<7FEE> <7FEE> <F4E7>
+<7FEF> <7FEF> <C247>
+<7FF0> <7FF0> <BAB2>
+<7FF1> <7FF1> <B0BF>
+<7FF2> <7FF2> <C248>
+<7FF3> <7FF3> <F4E8>
+<7FF4> <7FFA> <C249>
+<7FFB> <7FFB> <B7AD>
+<7FFC> <7FFC> <D2ED>
+<7FFD> <7FFF> <C250>
+<8000> <8000> <D2AB>
+<8001> <8001> <C0CF>
+<8002> <8002> <C253>
+<8003> <8003> <BFBC>
+<8004> <8004> <EBA3>
+<8005> <8005> <D5DF>
+<8006> <8006> <EAC8>
+<8007> <800A> <C254>
+<800B> <800B> <F1F3>
+<800C> <800C> <B6F8>
+<800D> <800D> <CBA3>
+<800E> <800F> <C258>
+<8010> <8010> <C4CD>
+<8011> <8011> <C25A>
+<8012> <8012> <F1E7>
+<8013> <8013> <C25B>
+<8014> <8014> <F1E8>
+<8015> <8015> <B8FB>
+<8016> <8016> <F1E9>
+<8017> <8017> <BAC4>
+<8018> <8018> <D4C5>
+<8019> <8019> <B0D2>
+<801A> <801B> <C25C>
+<801C> <801C> <F1EA>
+<801D> <801F> <C25E>
+<8020> <8020> <F1EB>
+<8021> <8021> <C261>
+<8022> <8022> <F1EC>
+<8023> <8024> <C262>
+<8025> <8027> <F1ED>
+<8028> <8028> <F1F1>
+<8029> <8029> <F1F0>
+<802A> <802A> <C5D5>
+<802B> <8030> <C264>
+<8031> <8031> <F1F2>
+<8032> <8032> <C26A>
+<8033> <8033> <B6FA>
+<8034> <8034> <C26B>
+<8035> <8035> <F1F4>
+<8036> <8036> <D2AE>
+<8037> <8037> <DEC7>
+<8038> <8038> <CBCA>
+<8039> <803A> <C26C>
+<803B> <803B> <B3DC>
+<803C> <803C> <C26E>
+<803D> <803D> <B5A2>
+<803E> <803E> <C26F>
+<803F> <803F> <B9A2>
+<8040> <8041> <C270>
+<8042> <8042> <C4F4>
+<8043> <8043> <F1F5>
+<8044> <8045> <C272>
+<8046> <8046> <F1F6>
+<8047> <8049> <C274>
+<804A> <804A> <C1C4>
+<804B> <804B> <C1FB>
+<804C> <804C> <D6B0>
+<804D> <804D> <F1F7>
+<804E> <8051> <C277>
+<8052> <8052> <F1F8>
+<8053> <8053> <C27B>
+<8054> <8054> <C1AA>
+<8055> <8057> <C27C>
+<8058> <8058> <C6B8>
+<8059> <8059> <C280>
+<805A> <805A> <BEDB>
+<805B> <8068> <C281>
+<8069> <8069> <F1F9>
+<806A> <806A> <B4CF>
+<806B> <8070> <C28F>
+<8071> <8071> <F1FA>
+<8072> <807D> <C295>
+<807E> <807E> <C340>
+<807F> <807F> <EDB2>
+<8080> <8080> <EDB1>
+<8081> <8082> <C341>
+<8083> <8083> <CBE0>
+<8084> <8084> <D2DE>
+endbfrange
+
+100 beginbfrange
+<8085> <8085> <C343>
+<8086> <8086> <CBC1>
+<8087> <8087> <D5D8>
+<8088> <8088> <C344>
+<8089> <8089> <C8E2>
+<808A> <808A> <C345>
+<808B> <808B> <C0DF>
+<808C> <808C> <BCA1>
+<808D> <8092> <C346>
+<8093> <8093> <EBC1>
+<8094> <8095> <C34C>
+<8096> <8096> <D0A4>
+<8097> <8097> <C34E>
+<8098> <8098> <D6E2>
+<8099> <8099> <C34F>
+<809A> <809A> <B6C7>
+<809B> <809B> <B8D8>
+<809C> <809C> <EBC0>
+<809D> <809D> <B8CE>
+<809E> <809E> <C350>
+<809F> <809F> <EBBF>
+<80A0> <80A0> <B3A6>
+<80A1> <80A1> <B9C9>
+<80A2> <80A2> <D6AB>
+<80A3> <80A3> <C351>
+<80A4> <80A4> <B7F4>
+<80A5> <80A5> <B7CA>
+<80A6> <80A8> <C352>
+<80A9> <80A9> <BCE7>
+<80AA> <80AA> <B7BE>
+<80AB> <80AB> <EBC6>
+<80AC> <80AC> <C355>
+<80AD> <80AD> <EBC7>
+<80AE> <80AE> <B0B9>
+<80AF> <80AF> <BFCF>
+<80B0> <80B0> <C356>
+<80B1> <80B1> <EBC5>
+<80B2> <80B2> <D3FD>
+<80B3> <80B3> <C357>
+<80B4> <80B4> <EBC8>
+<80B5> <80B6> <C358>
+<80B7> <80B7> <EBC9>
+<80B8> <80B9> <C35A>
+<80BA> <80BA> <B7CE>
+<80BB> <80BB> <C35C>
+<80BC> <80BC> <EBC2>
+<80BD> <80BD> <EBC4>
+<80BE> <80BE> <C9F6>
+<80BF> <80BF> <D6D7>
+<80C0> <80C0> <D5CD>
+<80C1> <80C1> <D0B2>
+<80C2> <80C2> <EBCF>
+<80C3> <80C3> <CEB8>
+<80C4> <80C4> <EBD0>
+<80C5> <80C5> <C35D>
+<80C6> <80C6> <B5A8>
+<80C7> <80CB> <C35E>
+<80CC> <80CC> <B1B3>
+<80CD> <80CD> <EBD2>
+<80CE> <80CE> <CCA5>
+<80CF> <80D5> <C363>
+<80D6> <80D6> <C5D6>
+<80D7> <80D7> <EBD3>
+<80D8> <80D8> <C36A>
+<80D9> <80D9> <EBD1>
+<80DA> <80DA> <C5DF>
+<80DB> <80DB> <EBCE>
+<80DC> <80DC> <CAA4>
+<80DD> <80DD> <EBD5>
+<80DE> <80DE> <B0FB>
+<80DF> <80E0> <C36B>
+<80E1> <80E1> <BAFA>
+<80E2> <80E3> <C36D>
+<80E4> <80E4> <D8B7>
+<80E5> <80E5> <F1E3>
+<80E6> <80E6> <C36F>
+<80E7> <80EA> <EBCA>
+<80EB> <80EB> <EBD6>
+<80EC> <80EC> <E6C0>
+<80ED> <80ED> <EBD9>
+<80EE> <80EE> <C370>
+<80EF> <80EF> <BFE8>
+<80F0> <80F0> <D2C8>
+<80F1> <80F1> <EBD7>
+<80F2> <80F2> <EBDC>
+<80F3> <80F3> <B8EC>
+<80F4> <80F4> <EBD8>
+<80F5> <80F5> <C371>
+<80F6> <80F6> <BDBA>
+<80F7> <80F7> <C372>
+<80F8> <80F8> <D0D8>
+<80F9> <80F9> <C373>
+<80FA> <80FA> <B0B7>
+<80FB> <80FB> <C374>
+<80FC> <80FC> <EBDD>
+<80FD> <80FD> <C4DC>
+<80FE> <80FF> <C375>
+<8100> <8101> <C377>
+<8102> <8102> <D6AC>
+<8103> <8105> <C379>
+endbfrange
+
+100 beginbfrange
+<8106> <8106> <B4E0>
+<8107> <8108> <C37C>
+<8109> <8109> <C2F6>
+<810A> <810A> <BCB9>
+<810B> <810B> <C37E>
+<810C> <810C> <C380>
+<810D> <810E> <EBDA>
+<810F> <810F> <D4E0>
+<8110> <8110> <C6EA>
+<8111> <8111> <C4D4>
+<8112> <8112> <EBDF>
+<8113> <8113> <C5A7>
+<8114> <8114> <D9F5>
+<8115> <8115> <C381>
+<8116> <8116> <B2B1>
+<8117> <8117> <C382>
+<8118> <8118> <EBE4>
+<8119> <8119> <C383>
+<811A> <811A> <BDC5>
+<811B> <811D> <C384>
+<811E> <811E> <EBE2>
+<811F> <812B> <C387>
+<812C> <812C> <EBE3>
+<812D> <812E> <C394>
+<812F> <812F> <B8AC>
+<8130> <8130> <C396>
+<8131> <8131> <CDD1>
+<8132> <8132> <EBE5>
+<8133> <8135> <C397>
+<8136> <8136> <EBE1>
+<8137> <8137> <C39A>
+<8138> <8138> <C1B3>
+<8139> <813D> <C39B>
+<813E> <813E> <C6A2>
+<813F> <813F> <C3A0>
+<8140> <8145> <C440>
+<8146> <8146> <CCF3>
+<8147> <8147> <C446>
+<8148> <8148> <EBE6>
+<8149> <8149> <C447>
+<814A> <814A> <C0B0>
+<814B> <814B> <D2B8>
+<814C> <814C> <EBE7>
+<814D> <814F> <C448>
+<8150> <8150> <B8AF>
+<8151> <8151> <B8AD>
+<8152> <8152> <C44B>
+<8153> <8153> <EBE8>
+<8154> <8154> <C7BB>
+<8155> <8155> <CDF3>
+<8156> <8158> <C44C>
+<8159> <815A> <EBEA>
+<815B> <815F> <C44F>
+<8160> <8160> <EBED>
+<8161> <8164> <C454>
+<8165> <8165> <D0C8>
+<8166> <8166> <C458>
+<8167> <8167> <EBF2>
+<8168> <8168> <C459>
+<8169> <8169> <EBEE>
+<816A> <816C> <C45A>
+<816D> <816D> <EBF1>
+<816E> <816E> <C8F9>
+<816F> <816F> <C45D>
+<8170> <8170> <D1FC>
+<8171> <8171> <EBEC>
+<8172> <8173> <C45E>
+<8174> <8174> <EBE9>
+<8175> <8178> <C460>
+<8179> <8179> <B8B9>
+<817A> <817A> <CFD9>
+<817B> <817B> <C4E5>
+<817C> <817D> <EBEF>
+<817E> <817E> <CCDA>
+<817F> <817F> <CDC8>
+<8180> <8180> <B0F2>
+<8181> <8181> <C464>
+<8182> <8182> <EBF6>
+<8183> <8187> <C465>
+<8188> <8188> <EBF5>
+<8189> <8189> <C46A>
+<818A> <818A> <B2B2>
+<818B> <818E> <C46B>
+<818F> <818F> <B8E0>
+<8190> <8190> <C46F>
+<8191> <8191> <EBF7>
+<8192> <8197> <C470>
+<8198> <8198> <B1EC>
+<8199> <819A> <C476>
+<819B> <819B> <CCC5>
+<819C> <819C> <C4A4>
+<819D> <819D> <CFA5>
+<819E> <81A2> <C478>
+<81A3> <81A3> <EBF9>
+<81A4> <81A5> <C47D>
+<81A6> <81A6> <ECA2>
+<81A7> <81A7> <C480>
+<81A8> <81A8> <C5F2>
+<81A9> <81A9> <C481>
+<81AA> <81AA> <EBFA>
+endbfrange
+
+100 beginbfrange
+<81AB> <81B2> <C482>
+<81B3> <81B3> <C9C5>
+<81B4> <81B9> <C48A>
+<81BA> <81BA> <E2DF>
+<81BB> <81BB> <EBFE>
+<81BC> <81BF> <C490>
+<81C0> <81C0> <CDCE>
+<81C1> <81C1> <ECA1>
+<81C2> <81C2> <B1DB>
+<81C3> <81C3> <D3B7>
+<81C4> <81C5> <C494>
+<81C6> <81C6> <D2DC>
+<81C7> <81C9> <C496>
+<81CA> <81CA> <EBFD>
+<81CB> <81CB> <C499>
+<81CC> <81CC> <EBFB>
+<81CD> <81D3> <C49A>
+<81D4> <81E2> <C540>
+<81E3> <81E3> <B3BC>
+<81E4> <81E6> <C54F>
+<81E7> <81E7> <EAB0>
+<81E8> <81E9> <C552>
+<81EA> <81EA> <D7D4>
+<81EB> <81EB> <C554>
+<81EC> <81EC> <F4AB>
+<81ED> <81ED> <B3F4>
+<81EE> <81F2> <C555>
+<81F3> <81F4> <D6C1>
+<81F5> <81FA> <C55A>
+<81FB> <81FB> <D5E9>
+<81FC> <81FC> <BECA>
+<81FD> <81FD> <C560>
+<81FE> <81FE> <F4A7>
+<81FF> <81FF> <C561>
+<8200> <8200> <D2A8>
+<8201> <8202> <F4A8>
+<8203> <8203> <C562>
+<8204> <8204> <F4AA>
+<8205> <8205> <BECB>
+<8206> <8206> <D3DF>
+<8207> <820B> <C563>
+<820C> <820D> <C9E0>
+<820E> <820F> <C568>
+<8210> <8210> <F3C2>
+<8211> <8211> <C56A>
+<8212> <8212> <CAE6>
+<8213> <8213> <C56B>
+<8214> <8214> <CCF2>
+<8215> <821A> <C56C>
+<821B> <821B> <E2B6>
+<821C> <821C> <CBB4>
+<821D> <821D> <C572>
+<821E> <821E> <CEE8>
+<821F> <821F> <D6DB>
+<8220> <8220> <C573>
+<8221> <8223> <F4AD>
+<8224> <8227> <C574>
+<8228> <8228> <F4B2>
+<8229> <8229> <C578>
+<822A> <822A> <BABD>
+<822B> <822B> <F4B3>
+<822C> <822C> <B0E3>
+<822D> <822D> <F4B0>
+<822E> <822E> <C579>
+<822F> <822F> <F4B1>
+<8230> <8230> <BDA2>
+<8231> <8231> <B2D5>
+<8232> <8232> <C57A>
+<8233> <8234> <F4B6>
+<8235> <8235> <B6E6>
+<8236> <8236> <B2B0>
+<8237> <8237> <CFCF>
+<8238> <8238> <F4B4>
+<8239> <8239> <B4AC>
+<823A> <823A> <C57B>
+<823B> <823B> <F4B5>
+<823C> <823D> <C57C>
+<823E> <823E> <F4B8>
+<823F> <823F> <C57E>
+<8240> <8243> <C580>
+<8244> <8244> <F4B9>
+<8245> <8246> <C584>
+<8247> <8247> <CDA7>
+<8248> <8248> <C586>
+<8249> <8249> <F4BA>
+<824A> <824A> <C587>
+<824B> <824B> <F4BB>
+<824C> <824E> <C588>
+<824F> <824F> <F4BC>
+<8250> <8257> <C58B>
+<8258> <8258> <CBD2>
+<8259> <8259> <C593>
+<825A> <825A> <F4BD>
+<825B> <825E> <C594>
+<825F> <825F> <F4BE>
+<8260> <8267> <C598>
+<8268> <8268> <F4BF>
+<8269> <8269> <C5A0>
+<826A> <826D> <C640>
+<826E> <826E> <F4DE>
+endbfrange
+
+100 beginbfrange
+<826F> <826F> <C1BC>
+<8270> <8270> <BCE8>
+<8271> <8271> <C644>
+<8272> <8272> <C9AB>
+<8273> <8273> <D1DE>
+<8274> <8274> <E5F5>
+<8275> <8278> <C645>
+<8279> <8279> <DCB3>
+<827A> <827A> <D2D5>
+<827B> <827C> <C649>
+<827D> <827D> <DCB4>
+<827E> <827E> <B0AC>
+<827F> <827F> <DCB5>
+<8280> <8281> <C64B>
+<8282> <8282> <BDDA>
+<8283> <8283> <C64D>
+<8284> <8284> <DCB9>
+<8285> <8287> <C64E>
+<8288> <8288> <D8C2>
+<8289> <8289> <C651>
+<828A> <828A> <DCB7>
+<828B> <828B> <D3F3>
+<828C> <828C> <C652>
+<828D> <828D> <C9D6>
+<828E> <828E> <DCBA>
+<828F> <828F> <DCB6>
+<8290> <8290> <C653>
+<8291> <8291> <DCBB>
+<8292> <8292> <C3A2>
+<8293> <8296> <C654>
+<8297> <8297> <DCBC>
+<8298> <8298> <DCC5>
+<8299> <8299> <DCBD>
+<829A> <829B> <C658>
+<829C> <829C> <CEDF>
+<829D> <829D> <D6A5>
+<829E> <829E> <C65A>
+<829F> <829F> <DCCF>
+<82A0> <82A0> <C65B>
+<82A1> <82A1> <DCCD>
+<82A2> <82A3> <C65C>
+<82A4> <82A4> <DCD2>
+<82A5> <82A5> <BDE6>
+<82A6> <82A6> <C2AB>
+<82A7> <82A7> <C65E>
+<82A8> <82A8> <DCB8>
+<82A9> <82A9> <DCCB>
+<82AA> <82AA> <DCCE>
+<82AB> <82AB> <DCBE>
+<82AC> <82AC> <B7D2>
+<82AD> <82AD> <B0C5>
+<82AE> <82AE> <DCC7>
+<82AF> <82AF> <D0BE>
+<82B0> <82B0> <DCC1>
+<82B1> <82B1> <BBA8>
+<82B2> <82B2> <C65F>
+<82B3> <82B3> <B7BC>
+<82B4> <82B4> <DCCC>
+<82B5> <82B6> <C660>
+<82B7> <82B7> <DCC6>
+<82B8> <82B8> <DCBF>
+<82B9> <82B9> <C7DB>
+<82BA> <82BC> <C662>
+<82BD> <82BD> <D1BF>
+<82BE> <82BE> <DCC0>
+<82BF> <82C0> <C665>
+<82C1> <82C1> <DCCA>
+<82C2> <82C3> <C667>
+<82C4> <82C4> <DCD0>
+<82C5> <82C6> <C669>
+<82C7> <82C7> <CEAD>
+<82C8> <82C8> <DCC2>
+<82C9> <82C9> <C66B>
+<82CA> <82CA> <DCC3>
+<82CB> <82CC> <DCC8>
+<82CD> <82CD> <B2D4>
+<82CE> <82CE> <DCD1>
+<82CF> <82CF> <CBD5>
+<82D0> <82D0> <C66C>
+<82D1> <82D1> <D4B7>
+<82D2> <82D2> <DCDB>
+<82D3> <82D3> <DCDF>
+<82D4> <82D4> <CCA6>
+<82D5> <82D5> <DCE6>
+<82D6> <82D6> <C66D>
+<82D7> <82D7> <C3E7>
+<82D8> <82D8> <DCDC>
+<82D9> <82DA> <C66E>
+<82DB> <82DB> <BFC1>
+<82DC> <82DC> <DCD9>
+<82DD> <82DD> <C670>
+<82DE> <82DE> <B0FA>
+<82DF> <82DF> <B9B6>
+<82E0> <82E0> <DCE5>
+<82E1> <82E1> <DCD3>
+<82E2> <82E2> <C671>
+<82E3> <82E3> <DCC4>
+<82E4> <82E4> <DCD6>
+<82E5> <82E5> <C8F4>
+<82E6> <82E6> <BFE0>
+endbfrange
+
+100 beginbfrange
+<82E7> <82EA> <C672>
+<82EB> <82EB> <C9BB>
+<82EC> <82EE> <C676>
+<82EF> <82EF> <B1BD>
+<82F0> <82F0> <C679>
+<82F1> <82F1> <D3A2>
+<82F2> <82F3> <C67A>
+<82F4> <82F4> <DCDA>
+<82F5> <82F6> <C67C>
+<82F7> <82F7> <DCD5>
+<82F8> <82F8> <C67E>
+<82F9> <82F9> <C6BB>
+<82FA> <82FA> <C680>
+<82FB> <82FB> <DCDE>
+<82FC> <82FF> <C681>
+<8300> <8300> <C685>
+<8301> <8301> <D7C2>
+<8302> <8302> <C3AF>
+<8303> <8303> <B7B6>
+<8304> <8304> <C7D1>
+<8305> <8305> <C3A9>
+<8306> <8306> <DCE2>
+<8307> <8307> <DCD8>
+<8308> <8308> <DCEB>
+<8309> <8309> <DCD4>
+<830A> <830B> <C686>
+<830C> <830C> <DCDD>
+<830D> <830D> <C688>
+<830E> <830E> <BEA5>
+<830F> <830F> <DCD7>
+<8310> <8310> <C689>
+<8311> <8311> <DCE0>
+<8312> <8313> <C68A>
+<8314> <8315> <DCE3>
+<8316> <8316> <C68C>
+<8317> <8317> <DCF8>
+<8318> <8319> <C68D>
+<831A> <831A> <DCE1>
+<831B> <831B> <DDA2>
+<831C> <831C> <DCE7>
+<831D> <8326> <C68F>
+<8327> <8327> <BCEB>
+<8328> <8328> <B4C4>
+<8329> <832A> <C699>
+<832B> <832B> <C3A3>
+<832C> <832C> <B2E7>
+<832D> <832D> <DCFA>
+<832E> <832E> <C69B>
+<832F> <832F> <DCF2>
+<8330> <8330> <C69C>
+<8331> <8331> <DCEF>
+<8332> <8332> <C69D>
+<8333> <8333> <DCFC>
+<8334> <8334> <DCEE>
+<8335> <8335> <D2F0>
+<8336> <8336> <B2E8>
+<8337> <8337> <C69E>
+<8338> <8338> <C8D7>
+<8339> <8339> <C8E3>
+<833A> <833A> <DCFB>
+<833B> <833B> <C69F>
+<833C> <833C> <DCED>
+<833D> <833D> <C6A0>
+<833E> <833F> <C740>
+<8340> <8340> <DCF7>
+<8341> <8342> <C742>
+<8343> <8343> <DCF5>
+<8344> <8345> <C744>
+<8346> <8346> <BEA3>
+<8347> <8347> <DCF4>
+<8348> <8348> <C746>
+<8349> <8349> <B2DD>
+<834A> <834E> <C747>
+<834F> <834F> <DCF3>
+<8350> <8350> <BCF6>
+<8351> <8351> <DCE8>
+<8352> <8352> <BBC4>
+<8353> <8353> <C74C>
+<8354> <8354> <C0F3>
+<8355> <8359> <C74D>
+<835A> <835A> <BCD4>
+<835B> <835C> <DCE9>
+<835D> <835D> <C752>
+<835E> <835E> <DCF1>
+<835F> <835F> <DCF6>
+<8360> <8360> <DCF9>
+<8361> <8361> <B5B4>
+<8362> <8362> <C753>
+<8363> <8363> <C8D9>
+<8364> <8364> <BBE7>
+<8365> <8365> <DCFE>
+<8366> <8366> <DCFD>
+<8367> <8367> <D3AB>
+<8368> <8368> <DDA1>
+<8369> <8369> <DDA3>
+<836A> <836A> <DDA5>
+<836B> <836B> <D2F1>
+<836C> <836C> <DDA4>
+<836D> <836E> <DDA6>
+<836F> <836F> <D2A9>
+endbfrange
+
+100 beginbfrange
+<8370> <8376> <C754>
+<8377> <8377> <BAC9>
+<8378> <8378> <DDA9>
+<8379> <837A> <C75B>
+<837B> <837B> <DDB6>
+<837C> <837C> <DDB1>
+<837D> <837D> <DDB4>
+<837E> <8384> <C75D>
+<8385> <8385> <DDB0>
+<8386> <8386> <C6CE>
+<8387> <8388> <C764>
+<8389> <8389> <C0F2>
+<838A> <838D> <C766>
+<838E> <838E> <C9AF>
+<838F> <8391> <C76A>
+<8392> <8392> <DCEC>
+<8393> <8393> <DDAE>
+<8394> <8397> <C76D>
+<8398> <8398> <DDB7>
+<8399> <839A> <C771>
+<839B> <839B> <DCF0>
+<839C> <839C> <DDAF>
+<839D> <839D> <C773>
+<839E> <839E> <DDB8>
+<839F> <839F> <C774>
+<83A0> <83A0> <DDAC>
+<83A1> <83A7> <C775>
+<83A8> <83A8> <DDB9>
+<83A9> <83A9> <DDB3>
+<83AA> <83AA> <DDAD>
+<83AB> <83AB> <C4AA>
+<83AC> <83AE> <C77C>
+<83AF> <83AF> <C780>
+<83B0> <83B0> <DDA8>
+<83B1> <83B1> <C0B3>
+<83B2> <83B2> <C1AB>
+<83B3> <83B4> <DDAA>
+<83B5> <83B5> <C781>
+<83B6> <83B6> <DDB2>
+<83B7> <83B7> <BBF1>
+<83B8> <83B8> <DDB5>
+<83B9> <83B9> <D3A8>
+<83BA> <83BA> <DDBA>
+<83BB> <83BB> <C782>
+<83BC> <83BC> <DDBB>
+<83BD> <83BD> <C3A7>
+<83BE> <83BF> <C783>
+<83C0> <83C0> <DDD2>
+<83C1> <83C1> <DDBC>
+<83C2> <83C4> <C785>
+<83C5> <83C5> <DDD1>
+<83C6> <83C6> <C788>
+<83C7> <83C7> <B9BD>
+<83C8> <83C9> <C789>
+<83CA> <83CA> <BED5>
+<83CB> <83CB> <C78B>
+<83CC> <83CC> <BEFA>
+<83CD> <83CE> <C78C>
+<83CF> <83CF> <BACA>
+<83D0> <83D3> <C78E>
+<83D4> <83D4> <DDCA>
+<83D5> <83D5> <C792>
+<83D6> <83D6> <DDC5>
+<83D7> <83D7> <C793>
+<83D8> <83D8> <DDBF>
+<83D9> <83DB> <C794>
+<83DC> <83DC> <B2CB>
+<83DD> <83DD> <DDC3>
+<83DE> <83DE> <C797>
+<83DF> <83DF> <DDCB>
+<83E0> <83E0> <B2A4>
+<83E1> <83E1> <DDD5>
+<83E2> <83E4> <C798>
+<83E5> <83E5> <DDBE>
+<83E6> <83E8> <C79B>
+<83E9> <83E9> <C6D0>
+<83EA> <83EA> <DDD0>
+<83EB> <83ED> <C79E>
+<83EE> <83EF> <C840>
+<83F0> <83F0> <DDD4>
+<83F1> <83F1> <C1E2>
+<83F2> <83F2> <B7C6>
+<83F3> <83F7> <C842>
+<83F8> <83F9> <DDCE>
+<83FA> <83FC> <C847>
+<83FD> <83FD> <DDC4>
+<83FE> <83FF> <C84A>
+<8400> <8400> <C84C>
+<8401> <8401> <DDBD>
+<8402> <8402> <C84D>
+<8403> <8403> <DDCD>
+<8404> <8404> <CCD1>
+<8405> <8405> <C84E>
+<8406> <8406> <DDC9>
+<8407> <840A> <C84F>
+<840B> <840B> <DDC2>
+<840C> <840C> <C3C8>
+<840D> <840D> <C6BC>
+<840E> <840E> <CEAE>
+<840F> <840F> <DDCC>
+endbfrange
+
+100 beginbfrange
+<8410> <8410> <C853>
+<8411> <8411> <DDC8>
+<8412> <8417> <C854>
+<8418> <8418> <DDC1>
+<8419> <841B> <C85A>
+<841C> <841C> <DDC6>
+<841D> <841D> <C2DC>
+<841E> <8423> <C85D>
+<8424> <8425> <D3A9>
+<8426> <8426> <DDD3>
+<8427> <8427> <CFF4>
+<8428> <8428> <C8F8>
+<8429> <8430> <C863>
+<8431> <8431> <DDE6>
+<8432> <8437> <C86B>
+<8438> <8438> <DDC7>
+<8439> <843B> <C871>
+<843C> <843C> <DDE0>
+<843D> <843D> <C2E4>
+<843E> <8445> <C874>
+<8446> <8446> <DDE1>
+<8447> <8449> <C87C>
+<844A> <8450> <C880>
+<8451> <8451> <DDD7>
+<8452> <8456> <C887>
+<8457> <8457> <D6F8>
+<8458> <8458> <C88C>
+<8459> <8459> <DDD9>
+<845A> <845A> <DDD8>
+<845B> <845B> <B8F0>
+<845C> <845C> <DDD6>
+<845D> <8460> <C88D>
+<8461> <8461> <C6CF>
+<8462> <8462> <C891>
+<8463> <8463> <B6AD>
+<8464> <8468> <C892>
+<8469> <8469> <DDE2>
+<846A> <846A> <C897>
+<846B> <846B> <BAF9>
+<846C> <846C> <D4E1>
+<846D> <846D> <DDE7>
+<846E> <8470> <C898>
+<8471> <8471> <B4D0>
+<8472> <8472> <C89B>
+<8473> <8473> <DDDA>
+<8474> <8474> <C89C>
+<8475> <8475> <BFFB>
+<8476> <8476> <DDE3>
+<8477> <8477> <C89D>
+<8478> <8478> <DDDF>
+<8479> <8479> <C89E>
+<847A> <847A> <DDDD>
+<847B> <847C> <C89F>
+<847D> <8481> <C940>
+<8482> <8482> <B5D9>
+<8483> <8486> <C945>
+<8487> <8488> <DDDB>
+<8489> <8489> <DDDE>
+<848A> <848A> <C949>
+<848B> <848B> <BDAF>
+<848C> <848C> <DDE4>
+<848D> <848D> <C94A>
+<848E> <848E> <DDE5>
+<848F> <8496> <C94B>
+<8497> <8497> <DDF5>
+<8498> <8498> <C953>
+<8499> <8499> <C3C9>
+<849A> <849B> <C954>
+<849C> <849C> <CBE2>
+<849D> <84A0> <C956>
+<84A1> <84A1> <DDF2>
+<84A2> <84AE> <C95A>
+<84AF> <84AF> <D8E1>
+<84B0> <84B1> <C967>
+<84B2> <84B2> <C6D1>
+<84B3> <84B3> <C969>
+<84B4> <84B4> <DDF4>
+<84B5> <84B7> <C96A>
+<84B8> <84B8> <D5F4>
+<84B9> <84B9> <DDF3>
+<84BA> <84BA> <DDF0>
+<84BB> <84BC> <C96D>
+<84BD> <84BD> <DDEC>
+<84BE> <84BE> <C96F>
+<84BF> <84BF> <DDEF>
+<84C0> <84C0> <C970>
+<84C1> <84C1> <DDE8>
+<84C2> <84C3> <C971>
+<84C4> <84C4> <D0EE>
+<84C5> <84C8> <C973>
+<84C9> <84C9> <C8D8>
+<84CA> <84CA> <DDEE>
+<84CB> <84CC> <C977>
+<84CD> <84CD> <DDE9>
+<84CE> <84CF> <C979>
+<84D0> <84D0> <DDEA>
+<84D1> <84D1> <CBF2>
+<84D2> <84D2> <C97B>
+<84D3> <84D3> <DDED>
+<84D4> <84D5> <C97C>
+endbfrange
+
+100 beginbfrange
+<84D6> <84D6> <B1CD>
+<84D7> <84D7> <C97E>
+<84D8> <84DC> <C980>
+<84DD> <84DD> <C0B6>
+<84DE> <84DE> <C985>
+<84DF> <84DF> <BCBB>
+<84E0> <84E0> <DDF1>
+<84E1> <84E2> <C986>
+<84E3> <84E3> <DDF7>
+<84E4> <84E4> <C988>
+<84E5> <84E5> <DDF6>
+<84E6> <84E6> <DDEB>
+<84E7> <84EB> <C989>
+<84EC> <84EC> <C5EE>
+<84ED> <84EF> <C98E>
+<84F0> <84F0> <DDFB>
+<84F1> <84FB> <C991>
+<84FC> <84FC> <DEA4>
+<84FD> <84FE> <C99C>
+<84FF> <84FF> <DEA3>
+<8500> <8502> <C99E>
+<8503> <850B> <CA40>
+<850C> <850C> <DDF8>
+<850D> <8510> <CA49>
+<8511> <8511> <C3EF>
+<8512> <8512> <CA4D>
+<8513> <8513> <C2FB>
+<8514> <8516> <CA4E>
+<8517> <8517> <D5E1>
+<8518> <8519> <CA51>
+<851A> <851A> <CEB5>
+<851B> <851E> <CA53>
+<851F> <851F> <DDFD>
+<8520> <8520> <CA57>
+<8521> <8521> <B2CC>
+<8522> <852A> <CA58>
+<852B> <852B> <C4E8>
+<852C> <852C> <CADF>
+<852D> <8536> <CA61>
+<8537> <8537> <C7BE>
+<8538> <8538> <DDFA>
+<8539> <8539> <DDFC>
+<853A> <853A> <DDFE>
+<853B> <853B> <DEA2>
+<853C> <853C> <B0AA>
+<853D> <853D> <B1CE>
+<853E> <8542> <CA6B>
+<8543> <8543> <DEAC>
+<8544> <8547> <CA70>
+<8548> <8548> <DEA6>
+<8549> <8549> <BDB6>
+<854A> <854A> <C8EF>
+<854B> <8555> <CA74>
+<8556> <8556> <DEA1>
+<8557> <8558> <CA80>
+<8559> <8559> <DEA5>
+<855A> <855D> <CA82>
+<855E> <855E> <DEA9>
+<855F> <8563> <CA86>
+<8564> <8564> <DEA8>
+<8565> <8567> <CA8B>
+<8568> <8568> <DEA7>
+<8569> <8571> <CA8E>
+<8572> <8572> <DEAD>
+<8573> <8573> <CA97>
+<8574> <8574> <D4CC>
+<8575> <8578> <CA98>
+<8579> <8579> <DEB3>
+<857A> <857A> <DEAA>
+<857B> <857B> <DEAE>
+<857C> <857D> <CA9C>
+<857E> <857E> <C0D9>
+<857F> <8581> <CA9E>
+<8582> <8583> <CB40>
+<8584> <8584> <B1A1>
+<8585> <8585> <DEB6>
+<8586> <8586> <CB42>
+<8587> <8587> <DEB1>
+<8588> <858E> <CB43>
+<858F> <858F> <DEB2>
+<8590> <859A> <CB4A>
+<859B> <859B> <D1A6>
+<859C> <859C> <DEB5>
+<859D> <85A3> <CB55>
+<85A4> <85A4> <DEAF>
+<85A5> <85A7> <CB5C>
+<85A8> <85A8> <DEB0>
+<85A9> <85A9> <CB5F>
+<85AA> <85AA> <D0BD>
+<85AB> <85AD> <CB60>
+<85AE> <85AE> <DEB4>
+<85AF> <85AF> <CAED>
+<85B0> <85B0> <DEB9>
+<85B1> <85B6> <CB63>
+<85B7> <85B7> <DEB8>
+<85B8> <85B8> <CB69>
+<85B9> <85B9> <DEB7>
+<85BA> <85C0> <CB6A>
+<85C1> <85C1> <DEBB>
+<85C2> <85C8> <CB71>
+endbfrange
+
+100 beginbfrange
+<85C9> <85C9> <BDE5>
+<85CA> <85CE> <CB78>
+<85CF> <85CF> <B2D8>
+<85D0> <85D0> <C3EA>
+<85D1> <85D2> <CB7D>
+<85D3> <85D3> <DEBA>
+<85D4> <85D4> <CB80>
+<85D5> <85D5> <C5BA>
+<85D6> <85DB> <CB81>
+<85DC> <85DC> <DEBC>
+<85DD> <85E3> <CB87>
+<85E4> <85E4> <CCD9>
+<85E5> <85E8> <CB8E>
+<85E9> <85E9> <B7AA>
+<85EA> <85F8> <CB92>
+<85F9> <85FA> <CC40>
+<85FB> <85FB> <D4E5>
+<85FC> <85FE> <CC42>
+<85FF> <85FF> <DEBD>
+<8600> <8604> <CC45>
+<8605> <8605> <DEBF>
+<8606> <8610> <CC4A>
+<8611> <8611> <C4A2>
+<8612> <8615> <CC55>
+<8616> <8616> <DEC1>
+<8617> <8626> <CC59>
+<8627> <8627> <DEBE>
+<8628> <8628> <CC69>
+<8629> <8629> <DEC0>
+<862A> <8637> <CC6A>
+<8638> <8638> <D5BA>
+<8639> <863B> <CC78>
+<863C> <863C> <DEC2>
+<863D> <8640> <CC7B>
+<8641> <864C> <CC80>
+<864D> <864D> <F2AE>
+<864E> <864E> <BBA2>
+<864F> <864F> <C2B2>
+<8650> <8650> <C5B0>
+<8651> <8651> <C2C7>
+<8652> <8653> <CC8C>
+<8654> <8654> <F2AF>
+<8655> <8659> <CC8E>
+<865A> <865A> <D0E9>
+<865B> <865D> <CC93>
+<865E> <865E> <D3DD>
+<865F> <8661> <CC96>
+<8662> <8662> <EBBD>
+<8663> <866A> <CC99>
+<866B> <866B> <B3E6>
+<866C> <866C> <F2B0>
+<866D> <866D> <CD40>
+<866E> <866E> <F2B1>
+<866F> <8670> <CD41>
+<8671> <8671> <CAAD>
+<8672> <8678> <CD43>
+<8679> <8679> <BAE7>
+<867A> <867A> <F2B3>
+<867B> <867B> <F2B5>
+<867C> <867C> <F2B4>
+<867D> <867D> <CBE4>
+<867E> <867E> <CFBA>
+<867F> <867F> <F2B2>
+<8680> <8680> <CAB4>
+<8681> <8681> <D2CF>
+<8682> <8682> <C2EC>
+<8683> <8689> <CD4A>
+<868A> <868A> <CEC3>
+<868B> <868B> <F2B8>
+<868C> <868C> <B0F6>
+<868D> <868D> <F2B7>
+<868E> <8692> <CD51>
+<8693> <8693> <F2BE>
+<8694> <8694> <CD56>
+<8695> <8695> <B2CF>
+<8696> <869B> <CD57>
+<869C> <869C> <D1C1>
+<869D> <869D> <F2BA>
+<869E> <86A2> <CD5D>
+<86A3> <86A3> <F2BC>
+<86A4> <86A4> <D4E9>
+<86A5> <86A6> <CD62>
+<86A7> <86A7> <F2BB>
+<86A8> <86A8> <F2B6>
+<86A9> <86A9> <F2BF>
+<86AA> <86AA> <F2BD>
+<86AB> <86AB> <CD64>
+<86AC> <86AC> <F2B9>
+<86AD> <86AE> <CD65>
+<86AF> <86AF> <F2C7>
+<86B0> <86B0> <F2C4>
+<86B1> <86B1> <F2C6>
+<86B2> <86B3> <CD67>
+<86B4> <86B4> <F2CA>
+<86B5> <86B5> <F2C2>
+<86B6> <86B6> <F2C0>
+<86B7> <86B9> <CD69>
+<86BA> <86BA> <F2C5>
+<86BB> <86BF> <CD6C>
+<86C0> <86C0> <D6FB>
+endbfrange
+
+100 beginbfrange
+<86C1> <86C3> <CD71>
+<86C4> <86C4> <F2C1>
+<86C5> <86C5> <CD74>
+<86C6> <86C6> <C7F9>
+<86C7> <86C7> <C9DF>
+<86C8> <86C8> <CD75>
+<86C9> <86C9> <F2C8>
+<86CA> <86CA> <B9C6>
+<86CB> <86CB> <B5B0>
+<86CC> <86CD> <CD76>
+<86CE> <86CE> <F2C3>
+<86CF> <86CF> <F2C9>
+<86D0> <86D0> <F2D0>
+<86D1> <86D1> <F2D6>
+<86D2> <86D3> <CD78>
+<86D4> <86D4> <BBD7>
+<86D5> <86D7> <CD7A>
+<86D8> <86D8> <F2D5>
+<86D9> <86D9> <CDDC>
+<86DA> <86DA> <CD7D>
+<86DB> <86DB> <D6EB>
+<86DC> <86DC> <CD7E>
+<86DD> <86DD> <CD80>
+<86DE> <86DE> <F2D2>
+<86DF> <86DF> <F2D4>
+<86E0> <86E3> <CD81>
+<86E4> <86E4> <B8F2>
+<86E5> <86E8> <CD85>
+<86E9> <86E9> <F2CB>
+<86EA> <86EC> <CD89>
+<86ED> <86ED> <F2CE>
+<86EE> <86EE> <C2F9>
+<86EF> <86EF> <CD8C>
+<86F0> <86F0> <D5DD>
+<86F1> <86F2> <F2CC>
+<86F3> <86F3> <F2CF>
+<86F4> <86F4> <F2D3>
+<86F5> <86F7> <CD8D>
+<86F8> <86F8> <F2D9>
+<86F9> <86F9> <D3BC>
+<86FA> <86FD> <CD90>
+<86FE> <86FE> <B6EA>
+<86FF> <86FF> <CD94>
+<8700> <8700> <CAF1>
+<8701> <8701> <CD95>
+<8702> <8702> <B7E4>
+<8703> <8703> <F2D7>
+<8704> <8706> <CD96>
+<8707> <8707> <F2D8>
+<8708> <8708> <F2DA>
+<8709> <8709> <F2DD>
+<870A> <870A> <F2DB>
+<870B> <870C> <CD99>
+<870D> <870D> <F2DC>
+<870E> <8711> <CD9B>
+<8712> <8712> <D1D1>
+<8713> <8713> <F2D1>
+<8714> <8714> <CD9F>
+<8715> <8715> <CDC9>
+<8716> <8716> <CDA0>
+<8717> <8717> <CECF>
+<8718> <8718> <D6A9>
+<8719> <8719> <CE40>
+<871A> <871A> <F2E3>
+<871B> <871B> <CE41>
+<871C> <871C> <C3DB>
+<871D> <871D> <CE42>
+<871E> <871E> <F2E0>
+<871F> <8720> <CE43>
+<8721> <8721> <C0AF>
+<8722> <8722> <F2EC>
+<8723> <8723> <F2DE>
+<8724> <8724> <CE45>
+<8725> <8725> <F2E1>
+<8726> <8728> <CE46>
+<8729> <8729> <F2E8>
+<872A> <872D> <CE49>
+<872E> <872E> <F2E2>
+<872F> <8730> <CE4D>
+<8731> <8731> <F2E7>
+<8732> <8733> <CE4F>
+<8734> <8734> <F2E6>
+<8735> <8736> <CE51>
+<8737> <8737> <F2E9>
+<8738> <873A> <CE53>
+<873B> <873B> <F2DF>
+<873C> <873D> <CE56>
+<873E> <873E> <F2E4>
+<873F> <873F> <F2EA>
+<8740> <8746> <CE58>
+<8747> <8747> <D3AC>
+<8748> <8748> <F2E5>
+<8749> <8749> <B2F5>
+<874A> <874B> <CE5F>
+<874C> <874C> <F2F2>
+<874D> <874D> <CE61>
+<874E> <874E> <D0AB>
+<874F> <8752> <CE62>
+<8753> <8753> <F2F5>
+<8754> <8756> <CE66>
+endbfrange
+
+100 beginbfrange
+<8757> <8757> <BBC8>
+<8758> <8758> <CE69>
+<8759> <8759> <F2F9>
+<875A> <875F> <CE6A>
+<8760> <8760> <F2F0>
+<8761> <8762> <CE70>
+<8763> <8763> <F2F6>
+<8764> <8764> <F2F8>
+<8765> <8765> <F2FA>
+<8766> <876D> <CE72>
+<876E> <876E> <F2F3>
+<876F> <876F> <CE7A>
+<8770> <8770> <F2F1>
+<8771> <8773> <CE7B>
+<8774> <8774> <BAFB>
+<8775> <8775> <CE7E>
+<8776> <8776> <B5FB>
+<8777> <877A> <CE80>
+<877B> <877B> <F2EF>
+<877C> <877C> <F2F7>
+<877D> <877E> <F2ED>
+<877F> <8781> <CE84>
+<8782> <8782> <F2EB>
+<8783> <8783> <F3A6>
+<8784> <8784> <CE87>
+<8785> <8785> <F3A3>
+<8786> <8787> <CE88>
+<8788> <8788> <F3A2>
+<8789> <878A> <CE8A>
+<878B> <878B> <F2F4>
+<878C> <878C> <CE8C>
+<878D> <878D> <C8DA>
+<878E> <8792> <CE8D>
+<8793> <8793> <F2FB>
+<8794> <8796> <CE92>
+<8797> <8797> <F3A5>
+<8798> <879E> <CE95>
+<879F> <879F> <C3F8>
+<87A0> <87A4> <CE9C>
+<87A5> <87A7> <CF40>
+<87A8> <87A8> <F2FD>
+<87A9> <87AA> <CF43>
+<87AB> <87AB> <F3A7>
+<87AC> <87AC> <F3A9>
+<87AD> <87AD> <F3A4>
+<87AE> <87AE> <CF45>
+<87AF> <87AF> <F2FC>
+<87B0> <87B2> <CF46>
+<87B3> <87B3> <F3AB>
+<87B4> <87B4> <CF49>
+<87B5> <87B5> <F3AA>
+<87B6> <87B9> <CF4A>
+<87BA> <87BA> <C2DD>
+<87BB> <87BC> <CF4E>
+<87BD> <87BD> <F3AE>
+<87BE> <87BF> <CF50>
+<87C0> <87C0> <F3B0>
+<87C1> <87C5> <CF52>
+<87C6> <87C6> <F3A1>
+<87C7> <87C9> <CF57>
+<87CA> <87CA> <F3B1>
+<87CB> <87CB> <F3AC>
+<87CC> <87D0> <CF5A>
+<87D1> <87D1> <F3AF>
+<87D2> <87D2> <F2FE>
+<87D3> <87D3> <F3AD>
+<87D4> <87DA> <CF5F>
+<87DB> <87DB> <F3B2>
+<87DC> <87DF> <CF66>
+<87E0> <87E0> <F3B4>
+<87E1> <87E4> <CF6A>
+<87E5> <87E5> <F3A8>
+<87E6> <87E9> <CF6E>
+<87EA> <87EA> <F3B3>
+<87EB> <87ED> <CF72>
+<87EE> <87EE> <F3B5>
+<87EF> <87F8> <CF75>
+<87F9> <87F9> <D0B7>
+<87FA> <87FD> <CF80>
+<87FE> <87FE> <F3B8>
+<87FF> <87FF> <CF84>
+<8800> <8802> <CF85>
+<8803> <8803> <D9F9>
+<8804> <8809> <CF88>
+<880A> <880A> <F3B9>
+<880B> <8812> <CF8E>
+<8813> <8813> <F3B7>
+<8814> <8814> <CF96>
+<8815> <8815> <C8E4>
+<8816> <8816> <F3B6>
+<8817> <881A> <CF97>
+<881B> <881B> <F3BA>
+<881C> <8820> <CF9B>
+<8821> <8821> <F3BB>
+<8822> <8822> <B4C0>
+<8823> <8823> <CFA0>
+<8824> <8831> <D040>
+<8832> <8832> <EEC3>
+<8833> <8838> <D04E>
+<8839> <8839> <F3BC>
+endbfrange
+
+100 beginbfrange
+<883A> <883B> <D054>
+<883C> <883C> <F3BD>
+<883D> <883F> <D056>
+<8840> <8840> <D1AA>
+<8841> <8843> <D059>
+<8844> <8844> <F4AC>
+<8845> <8845> <D0C6>
+<8846> <884B> <D05C>
+<884C> <884C> <D0D0>
+<884D> <884D> <D1DC>
+<884E> <8853> <D062>
+<8854> <8854> <CFCE>
+<8855> <8856> <D068>
+<8857> <8857> <BDD6>
+<8858> <8858> <D06A>
+<8859> <8859> <D1C3>
+<885A> <8860> <D06B>
+<8861> <8861> <BAE2>
+<8862> <8862> <E1E9>
+<8863> <8863> <D2C2>
+<8864> <8864> <F1C2>
+<8865> <8865> <B2B9>
+<8866> <8867> <D072>
+<8868> <8868> <B1ED>
+<8869> <8869> <F1C3>
+<886A> <886A> <D074>
+<886B> <886B> <C9C0>
+<886C> <886C> <B3C4>
+<886D> <886D> <D075>
+<886E> <886E> <D9F2>
+<886F> <886F> <D076>
+<8870> <8870> <CBA5>
+<8871> <8871> <D077>
+<8872> <8872> <F1C4>
+<8873> <8876> <D078>
+<8877> <8877> <D6D4>
+<8878> <887A> <D07C>
+<887B> <887C> <D080>
+<887D> <887D> <F1C5>
+<887E> <887E> <F4C0>
+<887F> <887F> <F1C6>
+<8880> <8880> <D082>
+<8881> <8881> <D4AC>
+<8882> <8882> <F1C7>
+<8883> <8883> <D083>
+<8884> <8884> <B0C0>
+<8885> <8885> <F4C1>
+<8886> <8887> <D084>
+<8888> <8888> <F4C2>
+<8889> <888A> <D086>
+<888B> <888B> <B4FC>
+<888C> <888C> <D088>
+<888D> <888D> <C5DB>
+<888E> <8891> <D089>
+<8892> <8892> <CCBB>
+<8893> <8895> <D08D>
+<8896> <8896> <D0E4>
+<8897> <889B> <D090>
+<889C> <889C> <CDE0>
+<889D> <88A1> <D095>
+<88A2> <88A2> <F1C8>
+<88A3> <88A3> <D09A>
+<88A4> <88A4> <D9F3>
+<88A5> <88AA> <D09B>
+<88AB> <88AB> <B1BB>
+<88AC> <88AC> <D140>
+<88AD> <88AD> <CFAE>
+<88AE> <88B0> <D141>
+<88B1> <88B1> <B8A4>
+<88B2> <88B6> <D144>
+<88B7> <88B7> <F1CA>
+<88B8> <88BB> <D149>
+<88BC> <88BC> <F1CB>
+<88BD> <88C0> <D14D>
+<88C1> <88C1> <B2C3>
+<88C2> <88C2> <C1D1>
+<88C3> <88C4> <D151>
+<88C5> <88C5> <D7B0>
+<88C6> <88C6> <F1C9>
+<88C7> <88C8> <D153>
+<88C9> <88C9> <F1CC>
+<88CA> <88CD> <D155>
+<88CE> <88CE> <F1CE>
+<88CF> <88D1> <D159>
+<88D2> <88D2> <D9F6>
+<88D3> <88D3> <D15C>
+<88D4> <88D4> <D2E1>
+<88D5> <88D5> <D4A3>
+<88D6> <88D7> <D15D>
+<88D8> <88D8> <F4C3>
+<88D9> <88D9> <C8B9>
+<88DA> <88DE> <D15F>
+<88DF> <88DF> <F4C4>
+<88E0> <88E1> <D164>
+<88E2> <88E2> <F1CD>
+<88E3> <88E3> <F1CF>
+<88E4> <88E4> <BFE3>
+<88E5> <88E5> <F1D0>
+<88E6> <88E7> <D166>
+<88E8> <88E8> <F1D4>
+endbfrange
+
+100 beginbfrange
+<88E9> <88EF> <D168>
+<88F0> <88F0> <F1D6>
+<88F1> <88F1> <F1D1>
+<88F2> <88F2> <D16F>
+<88F3> <88F3> <C9D1>
+<88F4> <88F4> <C5E1>
+<88F5> <88F7> <D170>
+<88F8> <88F8> <C2E3>
+<88F9> <88F9> <B9FC>
+<88FA> <88FB> <D173>
+<88FC> <88FC> <F1D3>
+<88FD> <88FD> <D175>
+<88FE> <88FE> <F1D5>
+<88FF> <88FF> <D176>
+<8900> <8901> <D177>
+<8902> <8902> <B9D3>
+<8903> <8908> <D179>
+<8909> <8909> <D180>
+<890A> <890A> <F1DB>
+<890B> <890F> <D181>
+<8910> <8910> <BAD6>
+<8911> <8911> <D186>
+<8912> <8912> <B0FD>
+<8913> <8913> <F1D9>
+<8914> <8918> <D187>
+<8919> <8919> <F1D8>
+<891A> <891A> <F1D2>
+<891B> <891B> <F1DA>
+<891C> <8920> <D18C>
+<8921> <8921> <F1D7>
+<8922> <8924> <D191>
+<8925> <8925> <C8EC>
+<8926> <8929> <D194>
+<892A> <892A> <CDCA>
+<892B> <892B> <F1DD>
+<892C> <892F> <D198>
+<8930> <8930> <E5BD>
+<8931> <8933> <D19C>
+<8934> <8934> <F1DC>
+<8935> <8935> <D19F>
+<8936> <8936> <F1DE>
+<8937> <8937> <D1A0>
+<8938> <8940> <D240>
+<8941> <8941> <F1DF>
+<8942> <8943> <D249>
+<8944> <8944> <CFE5>
+<8945> <895D> <D24B>
+<895E> <895E> <F4C5>
+<895F> <895F> <BDF3>
+<8960> <8965> <D264>
+<8966> <8966> <F1E0>
+<8967> <897A> <D26A>
+<897B> <897B> <F1E1>
+<897C> <897C> <D27E>
+<897D> <897E> <D280>
+<897F> <897F> <CEF7>
+<8980> <8980> <D282>
+<8981> <8981> <D2AA>
+<8982> <8982> <D283>
+<8983> <8983> <F1FB>
+<8984> <8985> <D284>
+<8986> <8986> <B8B2>
+<8987> <89A1> <D286>
+<89A2> <89C0> <D340>
+<89C1> <89C1> <BCFB>
+<89C2> <89C2> <B9DB>
+<89C3> <89C3> <D35F>
+<89C4> <89C4> <B9E6>
+<89C5> <89C5> <C3D9>
+<89C6> <89C6> <CAD3>
+<89C7> <89C7> <EAE8>
+<89C8> <89C8> <C0C0>
+<89C9> <89C9> <BEF5>
+<89CA> <89CC> <EAE9>
+<89CD> <89CD> <D360>
+<89CE> <89D1> <EAEC>
+<89D2> <89D2> <BDC7>
+<89D3> <89D5> <D361>
+<89D6> <89D6> <F5FB>
+<89D7> <89D9> <D364>
+<89DA> <89DA> <F5FD>
+<89DB> <89DB> <D367>
+<89DC> <89DC> <F5FE>
+<89DD> <89DD> <D368>
+<89DE> <89DE> <F5FC>
+<89DF> <89E2> <D369>
+<89E3> <89E3> <BDE2>
+<89E4> <89E4> <D36D>
+<89E5> <89E5> <F6A1>
+<89E6> <89E6> <B4A5>
+<89E7> <89EA> <D36E>
+<89EB> <89EB> <F6A2>
+<89EC> <89EE> <D372>
+<89EF> <89EF> <F6A3>
+<89F0> <89F2> <D375>
+<89F3> <89F3> <ECB2>
+<89F4> <89FA> <D378>
+<89FB> <89FF> <D380>
+<8A00> <8A00> <D1D4>
+<8A01> <8A06> <D385>
+endbfrange
+
+100 beginbfrange
+<8A07> <8A07> <D9EA>
+<8A08> <8A1D> <D38B>
+<8A1E> <8A3D> <D440>
+<8A3E> <8A3E> <F6A4>
+<8A3F> <8A47> <D460>
+<8A48> <8A48> <EEBA>
+<8A49> <8A5E> <D469>
+<8A5F> <8A78> <D480>
+<8A79> <8A79> <D5B2>
+<8A7A> <8A80> <D49A>
+<8A81> <8A88> <D540>
+<8A89> <8A89> <D3FE>
+<8A8A> <8A8A> <CCDC>
+<8A8B> <8A92> <D548>
+<8A93> <8A93> <CAC4>
+<8A94> <8AC2> <D550>
+<8AC3> <8AE3> <D580>
+<8AE4> <8AFF> <D640>
+<8B00> <8B06> <D65C>
+<8B07> <8B07> <E5C0>
+<8B08> <8B23> <D663>
+<8B24> <8B25> <D680>
+<8B26> <8B26> <F6A5>
+<8B27> <8B45> <D682>
+<8B46> <8B65> <D740>
+<8B66> <8B66> <BEAF>
+<8B67> <8B6B> <D760>
+<8B6C> <8B6C> <C6A9>
+<8B6D> <8B86> <D765>
+<8B87> <8B9F> <D780>
+<8BA0> <8BA0> <DAA5>
+<8BA1> <8BA1> <BCC6>
+<8BA2> <8BA2> <B6A9>
+<8BA3> <8BA3> <B8BC>
+<8BA4> <8BA4> <C8CF>
+<8BA5> <8BA5> <BCA5>
+<8BA6> <8BA7> <DAA6>
+<8BA8> <8BA8> <CCD6>
+<8BA9> <8BA9> <C8C3>
+<8BAA> <8BAA> <DAA8>
+<8BAB> <8BAB> <C6FD>
+<8BAC> <8BAC> <D799>
+<8BAD> <8BAD> <D1B5>
+<8BAE> <8BAE> <D2E9>
+<8BAF> <8BAF> <D1B6>
+<8BB0> <8BB0> <BCC7>
+<8BB1> <8BB1> <D79A>
+<8BB2> <8BB2> <BDB2>
+<8BB3> <8BB3> <BBE4>
+<8BB4> <8BB5> <DAA9>
+<8BB6> <8BB6> <D1C8>
+<8BB7> <8BB7> <DAAB>
+<8BB8> <8BB8> <D0ED>
+<8BB9> <8BB9> <B6EF>
+<8BBA> <8BBA> <C2DB>
+<8BBB> <8BBB> <D79B>
+<8BBC> <8BBC> <CBCF>
+<8BBD> <8BBD> <B7ED>
+<8BBE> <8BBE> <C9E8>
+<8BBF> <8BBF> <B7C3>
+<8BC0> <8BC0> <BEF7>
+<8BC1> <8BC1> <D6A4>
+<8BC2> <8BC3> <DAAC>
+<8BC4> <8BC4> <C6C0>
+<8BC5> <8BC5> <D7E7>
+<8BC6> <8BC6> <CAB6>
+<8BC7> <8BC7> <D79C>
+<8BC8> <8BC8> <D5A9>
+<8BC9> <8BC9> <CBDF>
+<8BCA> <8BCA> <D5EF>
+<8BCB> <8BCB> <DAAE>
+<8BCC> <8BCC> <D6DF>
+<8BCD> <8BCD> <B4CA>
+<8BCE> <8BCE> <DAB0>
+<8BCF> <8BCF> <DAAF>
+<8BD0> <8BD0> <D79D>
+<8BD1> <8BD1> <D2EB>
+<8BD2> <8BD4> <DAB1>
+<8BD5> <8BD5> <CAD4>
+<8BD6> <8BD6> <DAB4>
+<8BD7> <8BD7> <CAAB>
+<8BD8> <8BD9> <DAB5>
+<8BDA> <8BDA> <B3CF>
+<8BDB> <8BDB> <D6EF>
+<8BDC> <8BDC> <DAB7>
+<8BDD> <8BDD> <BBB0>
+<8BDE> <8BDE> <B5AE>
+<8BDF> <8BE0> <DAB8>
+<8BE1> <8BE1> <B9EE>
+<8BE2> <8BE2> <D1AF>
+<8BE3> <8BE3> <D2E8>
+<8BE4> <8BE4> <DABA>
+<8BE5> <8BE5> <B8C3>
+<8BE6> <8BE6> <CFEA>
+<8BE7> <8BE7> <B2EF>
+<8BE8> <8BE9> <DABB>
+<8BEA> <8BEA> <D79E>
+<8BEB> <8BEB> <BDEB>
+<8BEC> <8BEC> <CEDC>
+<8BED> <8BED> <D3EF>
+endbfrange
+
+100 beginbfrange
+<8BEE> <8BEE> <DABD>
+<8BEF> <8BEF> <CEF3>
+<8BF0> <8BF0> <DABE>
+<8BF1> <8BF1> <D3D5>
+<8BF2> <8BF2> <BBE5>
+<8BF3> <8BF3> <DABF>
+<8BF4> <8BF4> <CBB5>
+<8BF5> <8BF5> <CBD0>
+<8BF6> <8BF6> <DAC0>
+<8BF7> <8BF7> <C7EB>
+<8BF8> <8BF8> <D6EE>
+<8BF9> <8BF9> <DAC1>
+<8BFA> <8BFA> <C5B5>
+<8BFB> <8BFB> <B6C1>
+<8BFC> <8BFC> <DAC2>
+<8BFD> <8BFD> <B7CC>
+<8BFE> <8BFE> <BFCE>
+<8BFF> <8BFF> <DAC3>
+<8C00> <8C00> <DAC4>
+<8C01> <8C01> <CBAD>
+<8C02> <8C02> <DAC5>
+<8C03> <8C03> <B5F7>
+<8C04> <8C04> <DAC6>
+<8C05> <8C05> <C1C2>
+<8C06> <8C06> <D7BB>
+<8C07> <8C07> <DAC7>
+<8C08> <8C08> <CCB8>
+<8C09> <8C09> <D79F>
+<8C0A> <8C0A> <D2EA>
+<8C0B> <8C0B> <C4B1>
+<8C0C> <8C0C> <DAC8>
+<8C0D> <8C0D> <B5FD>
+<8C0E> <8C0E> <BBD1>
+<8C0F> <8C0F> <DAC9>
+<8C10> <8C10> <D0B3>
+<8C11> <8C12> <DACA>
+<8C13> <8C13> <CEBD>
+<8C14> <8C16> <DACC>
+<8C17> <8C17> <B2F7>
+<8C18> <8C18> <DAD1>
+<8C19> <8C19> <DACF>
+<8C1A> <8C1A> <D1E8>
+<8C1B> <8C1B> <DAD0>
+<8C1C> <8C1C> <C3D5>
+<8C1D> <8C1D> <DAD2>
+<8C1E> <8C1E> <D7A0>
+<8C1F> <8C21> <DAD3>
+<8C22> <8C22> <D0BB>
+<8C23> <8C23> <D2A5>
+<8C24> <8C24> <B0F9>
+<8C25> <8C25> <DAD6>
+<8C26> <8C26> <C7AB>
+<8C27> <8C27> <DAD7>
+<8C28> <8C28> <BDF7>
+<8C29> <8C29> <C3A1>
+<8C2A> <8C2B> <DAD8>
+<8C2C> <8C2C> <C3FD>
+<8C2D> <8C2D> <CCB7>
+<8C2E> <8C2F> <DADA>
+<8C30> <8C30> <C0BE>
+<8C31> <8C31> <C6D7>
+<8C32> <8C33> <DADC>
+<8C34> <8C34> <C7B4>
+<8C35> <8C36> <DADE>
+<8C37> <8C37> <B9C8>
+<8C38> <8C40> <D840>
+<8C41> <8C41> <BBED>
+<8C42> <8C45> <D849>
+<8C46> <8C46> <B6B9>
+<8C47> <8C47> <F4F8>
+<8C48> <8C48> <D84D>
+<8C49> <8C49> <F4F9>
+<8C4A> <8C4B> <D84E>
+<8C4C> <8C4C> <CDE3>
+<8C4D> <8C54> <D850>
+<8C55> <8C55> <F5B9>
+<8C56> <8C59> <D858>
+<8C5A> <8C5A> <EBE0>
+<8C5B> <8C60> <D85C>
+<8C61> <8C61> <CFF3>
+<8C62> <8C62> <BBBF>
+<8C63> <8C69> <D862>
+<8C6A> <8C6A> <BAC0>
+<8C6B> <8C6B> <D4A5>
+<8C6C> <8C72> <D869>
+<8C73> <8C73> <E1D9>
+<8C74> <8C77> <D870>
+<8C78> <8C78> <F5F4>
+<8C79> <8C79> <B1AA>
+<8C7A> <8C7A> <B2F2>
+<8C7B> <8C81> <D874>
+<8C82> <8C82> <F5F5>
+<8C83> <8C84> <D87B>
+<8C85> <8C85> <F5F7>
+<8C86> <8C87> <D87D>
+<8C88> <8C88> <D880>
+<8C89> <8C89> <BAD1>
+<8C8A> <8C8A> <F5F6>
+<8C8B> <8C8B> <D881>
+<8C8C> <8C8C> <C3B2>
+endbfrange
+
+100 beginbfrange
+<8C8D> <8C93> <D882>
+<8C94> <8C94> <F5F9>
+<8C95> <8C97> <D889>
+<8C98> <8C98> <F5F8>
+<8C99> <8CAD> <D88C>
+<8CAE> <8CEC> <D940>
+<8CED> <8CFF> <D980>
+<8D00> <8D0D> <D993>
+<8D0E> <8D1C> <DA40>
+<8D1D> <8D1D> <B1B4>
+<8D1E> <8D1E> <D5EA>
+<8D1F> <8D1F> <B8BA>
+<8D20> <8D20> <DA4F>
+<8D21> <8D21> <B9B1>
+<8D22> <8D22> <B2C6>
+<8D23> <8D23> <D4F0>
+<8D24> <8D24> <CFCD>
+<8D25> <8D25> <B0DC>
+<8D26> <8D26> <D5CB>
+<8D27> <8D27> <BBF5>
+<8D28> <8D28> <D6CA>
+<8D29> <8D29> <B7B7>
+<8D2A> <8D2A> <CCB0>
+<8D2B> <8D2B> <C6B6>
+<8D2C> <8D2C> <B1E1>
+<8D2D> <8D2D> <B9BA>
+<8D2E> <8D2E> <D6FC>
+<8D2F> <8D2F> <B9E1>
+<8D30> <8D30> <B7A1>
+<8D31> <8D31> <BCFA>
+<8D32> <8D33> <EADA>
+<8D34> <8D34> <CCF9>
+<8D35> <8D35> <B9F3>
+<8D36> <8D36> <EADC>
+<8D37> <8D37> <B4FB>
+<8D38> <8D38> <C3B3>
+<8D39> <8D39> <B7D1>
+<8D3A> <8D3A> <BAD8>
+<8D3B> <8D3B> <EADD>
+<8D3C> <8D3C> <D4F4>
+<8D3D> <8D3D> <EADE>
+<8D3E> <8D3E> <BCD6>
+<8D3F> <8D3F> <BBDF>
+<8D40> <8D40> <EADF>
+<8D41> <8D41> <C1DE>
+<8D42> <8D42> <C2B8>
+<8D43> <8D43> <D4DF>
+<8D44> <8D44> <D7CA>
+<8D45> <8D46> <EAE0>
+<8D47> <8D47> <EAE4>
+<8D48> <8D49> <EAE2>
+<8D4A> <8D4A> <C9DE>
+<8D4B> <8D4B> <B8B3>
+<8D4C> <8D4C> <B6C4>
+<8D4D> <8D4D> <EAE5>
+<8D4E> <8D4E> <CAEA>
+<8D4F> <8D4F> <C9CD>
+<8D50> <8D50> <B4CD>
+<8D51> <8D52> <DA50>
+<8D53> <8D53> <E2D9>
+<8D54> <8D54> <C5E2>
+<8D55> <8D55> <EAE6>
+<8D56> <8D56> <C0B5>
+<8D57> <8D57> <DA52>
+<8D58> <8D58> <D7B8>
+<8D59> <8D59> <EAE7>
+<8D5A> <8D5A> <D7AC>
+<8D5B> <8D5B> <C8FC>
+<8D5C> <8D5C> <D8D3>
+<8D5D> <8D5D> <D8CD>
+<8D5E> <8D5E> <D4DE>
+<8D5F> <8D5F> <DA53>
+<8D60> <8D60> <D4F9>
+<8D61> <8D61> <C9C4>
+<8D62> <8D62> <D3AE>
+<8D63> <8D63> <B8D3>
+<8D64> <8D64> <B3E0>
+<8D65> <8D65> <DA54>
+<8D66> <8D66> <C9E2>
+<8D67> <8D67> <F4F6>
+<8D68> <8D6A> <DA55>
+<8D6B> <8D6B> <BAD5>
+<8D6C> <8D6C> <DA58>
+<8D6D> <8D6D> <F4F7>
+<8D6E> <8D6F> <DA59>
+<8D70> <8D70> <D7DF>
+<8D71> <8D72> <DA5B>
+<8D73> <8D73> <F4F1>
+<8D74> <8D74> <B8B0>
+<8D75> <8D75> <D5D4>
+<8D76> <8D76> <B8CF>
+<8D77> <8D77> <C6F0>
+<8D78> <8D80> <DA5D>
+<8D81> <8D81> <B3C3>
+<8D82> <8D83> <DA66>
+<8D84> <8D84> <F4F2>
+<8D85> <8D85> <B3AC>
+<8D86> <8D89> <DA68>
+<8D8A> <8D8A> <D4BD>
+<8D8B> <8D8B> <C7F7>
+endbfrange
+
+100 beginbfrange
+<8D8C> <8D90> <DA6C>
+<8D91> <8D91> <F4F4>
+<8D92> <8D93> <DA71>
+<8D94> <8D94> <F4F3>
+<8D95> <8D9E> <DA73>
+<8D9F> <8D9F> <CCCB>
+<8DA0> <8DA1> <DA7D>
+<8DA2> <8DA2> <DA80>
+<8DA3> <8DA3> <C8A4>
+<8DA4> <8DB0> <DA81>
+<8DB1> <8DB1> <F4F5>
+<8DB2> <8DB2> <DA8E>
+<8DB3> <8DB3> <D7E3>
+<8DB4> <8DB4> <C5BF>
+<8DB5> <8DB5> <F5C0>
+<8DB6> <8DB7> <DA8F>
+<8DB8> <8DB8> <F5BB>
+<8DB9> <8DB9> <DA91>
+<8DBA> <8DBA> <F5C3>
+<8DBB> <8DBB> <DA92>
+<8DBC> <8DBC> <F5C2>
+<8DBD> <8DBD> <DA93>
+<8DBE> <8DBE> <D6BA>
+<8DBF> <8DBF> <F5C1>
+<8DC0> <8DC2> <DA94>
+<8DC3> <8DC3> <D4BE>
+<8DC4> <8DC4> <F5C4>
+<8DC5> <8DC5> <DA97>
+<8DC6> <8DC6> <F5CC>
+<8DC7> <8DCA> <DA98>
+<8DCB> <8DCB> <B0CF>
+<8DCC> <8DCC> <B5F8>
+<8DCD> <8DCD> <DA9C>
+<8DCE> <8DCF> <F5C9>
+<8DD0> <8DD0> <DA9D>
+<8DD1> <8DD1> <C5DC>
+<8DD2> <8DD4> <DA9E>
+<8DD5> <8DD5> <DB40>
+<8DD6> <8DD7> <F5C5>
+<8DD8> <8DD9> <DB41>
+<8DDA> <8DDA> <F5C7>
+<8DDB> <8DDB> <F5CB>
+<8DDC> <8DDC> <DB43>
+<8DDD> <8DDD> <BEE0>
+<8DDE> <8DDE> <F5C8>
+<8DDF> <8DDF> <B8FA>
+<8DE0> <8DE2> <DB44>
+<8DE3> <8DE3> <F5D0>
+<8DE4> <8DE4> <F5D3>
+<8DE5> <8DE7> <DB47>
+<8DE8> <8DE8> <BFE7>
+<8DE9> <8DE9> <DB4A>
+<8DEA> <8DEA> <B9F2>
+<8DEB> <8DEB> <F5BC>
+<8DEC> <8DEC> <F5CD>
+<8DED> <8DEE> <DB4B>
+<8DEF> <8DEF> <C2B7>
+<8DF0> <8DF2> <DB4D>
+<8DF3> <8DF3> <CCF8>
+<8DF4> <8DF4> <DB50>
+<8DF5> <8DF5> <BCF9>
+<8DF6> <8DF6> <DB51>
+<8DF7> <8DF8> <F5CE>
+<8DF9> <8DF9> <F5D1>
+<8DFA> <8DFA> <B6E5>
+<8DFB> <8DFB> <F5D2>
+<8DFC> <8DFC> <DB52>
+<8DFD> <8DFD> <F5D5>
+<8DFE> <8DFF> <DB53>
+<8E00> <8E04> <DB55>
+<8E05> <8E05> <F5BD>
+<8E06> <8E08> <DB5A>
+<8E09> <8E09> <F5D4>
+<8E0A> <8E0A> <D3BB>
+<8E0B> <8E0B> <DB5D>
+<8E0C> <8E0C> <B3EC>
+<8E0D> <8E0E> <DB5E>
+<8E0F> <8E0F> <CCA4>
+<8E10> <8E13> <DB60>
+<8E14> <8E14> <F5D6>
+<8E15> <8E1C> <DB64>
+<8E1D> <8E1D> <F5D7>
+<8E1E> <8E1E> <BEE1>
+<8E1F> <8E1F> <F5D8>
+<8E20> <8E21> <DB6C>
+<8E22> <8E22> <CCDF>
+<8E23> <8E23> <F5DB>
+<8E24> <8E28> <DB6E>
+<8E29> <8E29> <B2C8>
+<8E2A> <8E2A> <D7D9>
+<8E2B> <8E2B> <DB73>
+<8E2C> <8E2C> <F5D9>
+<8E2D> <8E2D> <DB74>
+<8E2E> <8E2E> <F5DA>
+<8E2F> <8E2F> <F5DC>
+<8E30> <8E30> <DB75>
+<8E31> <8E31> <F5E2>
+<8E32> <8E34> <DB76>
+<8E35> <8E35> <F5E0>
+<8E36> <8E38> <DB79>
+endbfrange
+
+100 beginbfrange
+<8E39> <8E39> <F5DF>
+<8E3A> <8E3A> <F5DD>
+<8E3B> <8E3C> <DB7C>
+<8E3D> <8E3D> <F5E1>
+<8E3E> <8E3E> <DB7E>
+<8E3F> <8E3F> <DB80>
+<8E40> <8E40> <F5DE>
+<8E41> <8E42> <F5E4>
+<8E43> <8E43> <DB81>
+<8E44> <8E44> <CCE3>
+<8E45> <8E46> <DB82>
+<8E47> <8E47> <E5BF>
+<8E48> <8E48> <B5B8>
+<8E49> <8E49> <F5E3>
+<8E4A> <8E4A> <F5E8>
+<8E4B> <8E4B> <CCA3>
+<8E4C> <8E50> <DB84>
+<8E51> <8E52> <F5E6>
+<8E53> <8E58> <DB89>
+<8E59> <8E59> <F5BE>
+<8E5A> <8E65> <DB8F>
+<8E66> <8E66> <B1C4>
+<8E67> <8E68> <DB9B>
+<8E69> <8E69> <F5BF>
+<8E6A> <8E6B> <DB9D>
+<8E6C> <8E6C> <B5C5>
+<8E6D> <8E6D> <B2E4>
+<8E6E> <8E6E> <DB9F>
+<8E6F> <8E6F> <F5EC>
+<8E70> <8E70> <F5E9>
+<8E71> <8E71> <DBA0>
+<8E72> <8E72> <B6D7>
+<8E73> <8E73> <DC40>
+<8E74> <8E74> <F5ED>
+<8E75> <8E75> <DC41>
+<8E76> <8E76> <F5EA>
+<8E77> <8E7B> <DC42>
+<8E7C> <8E7C> <F5EB>
+<8E7D> <8E7E> <DC47>
+<8E7F> <8E7F> <B4DA>
+<8E80> <8E80> <DC49>
+<8E81> <8E81> <D4EA>
+<8E82> <8E84> <DC4A>
+<8E85> <8E85> <F5EE>
+<8E86> <8E86> <DC4D>
+<8E87> <8E87> <B3F9>
+<8E88> <8E8E> <DC4E>
+<8E8F> <8E8F> <F5EF>
+<8E90> <8E90> <F5F1>
+<8E91> <8E93> <DC55>
+<8E94> <8E94> <F5F0>
+<8E95> <8E9B> <DC58>
+<8E9C> <8E9C> <F5F2>
+<8E9D> <8E9D> <DC5F>
+<8E9E> <8E9E> <F5F3>
+<8E9F> <8EAA> <DC60>
+<8EAB> <8EAB> <C9ED>
+<8EAC> <8EAC> <B9AA>
+<8EAD> <8EAE> <DC6C>
+<8EAF> <8EAF> <C7FB>
+<8EB0> <8EB1> <DC6E>
+<8EB2> <8EB2> <B6E3>
+<8EB3> <8EB9> <DC70>
+<8EBA> <8EBA> <CCC9>
+<8EBB> <8EC2> <DC77>
+<8EC3> <8ECD> <DC80>
+<8ECE> <8ECE> <EAA6>
+<8ECF> <8EE4> <DC8B>
+<8EE5> <8EFF> <DD40>
+<8F00> <8F23> <DD5B>
+<8F24> <8F44> <DD80>
+<8F45> <8F65> <DE40>
+<8F66> <8F66> <B3B5>
+<8F67> <8F67> <D4FE>
+<8F68> <8F68> <B9EC>
+<8F69> <8F69> <D0F9>
+<8F6A> <8F6A> <DE61>
+<8F6B> <8F6B> <E9ED>
+<8F6C> <8F6C> <D7AA>
+<8F6D> <8F6D> <E9EE>
+<8F6E> <8F6E> <C2D6>
+<8F6F> <8F6F> <C8ED>
+<8F70> <8F70> <BAE4>
+<8F71> <8F73> <E9EF>
+<8F74> <8F74> <D6E1>
+<8F75> <8F76> <E9F2>
+<8F77> <8F77> <E9F5>
+<8F78> <8F78> <E9F4>
+<8F79> <8F7A> <E9F6>
+<8F7B> <8F7B> <C7E1>
+<8F7C> <8F7C> <E9F8>
+<8F7D> <8F7D> <D4D8>
+<8F7E> <8F7E> <E9F9>
+<8F7F> <8F7F> <BDCE>
+<8F80> <8F80> <DE62>
+<8F81> <8F82> <E9FA>
+<8F83> <8F83> <BDCF>
+<8F84> <8F84> <E9FC>
+<8F85> <8F85> <B8A8>
+<8F86> <8F86> <C1BE>
+endbfrange
+
+100 beginbfrange
+<8F87> <8F87> <E9FD>
+<8F88> <8F88> <B1B2>
+<8F89> <8F89> <BBD4>
+<8F8A> <8F8A> <B9F5>
+<8F8B> <8F8B> <E9FE>
+<8F8C> <8F8C> <DE63>
+<8F8D> <8F8F> <EAA1>
+<8F90> <8F90> <B7F8>
+<8F91> <8F91> <BCAD>
+<8F92> <8F92> <DE64>
+<8F93> <8F93> <CAE4>
+<8F94> <8F94> <E0CE>
+<8F95> <8F95> <D4AF>
+<8F96> <8F96> <CFBD>
+<8F97> <8F97> <D5B7>
+<8F98> <8F98> <EAA4>
+<8F99> <8F99> <D5DE>
+<8F9A> <8F9A> <EAA5>
+<8F9B> <8F9B> <D0C1>
+<8F9C> <8F9C> <B9BC>
+<8F9D> <8F9D> <DE65>
+<8F9E> <8F9E> <B4C7>
+<8F9F> <8F9F> <B1D9>
+<8FA0> <8FA2> <DE66>
+<8FA3> <8FA3> <C0B1>
+<8FA4> <8FA7> <DE69>
+<8FA8> <8FA9> <B1E6>
+<8FAA> <8FAA> <DE6D>
+<8FAB> <8FAB> <B1E8>
+<8FAC> <8FAF> <DE6E>
+<8FB0> <8FB0> <B3BD>
+<8FB1> <8FB1> <C8E8>
+<8FB2> <8FB5> <DE72>
+<8FB6> <8FB6> <E5C1>
+<8FB7> <8FB8> <DE76>
+<8FB9> <8FB9> <B1DF>
+<8FBA> <8FBC> <DE78>
+<8FBD> <8FBD> <C1C9>
+<8FBE> <8FBE> <B4EF>
+<8FBF> <8FC0> <DE7B>
+<8FC1> <8FC1> <C7A8>
+<8FC2> <8FC2> <D3D8>
+<8FC3> <8FC3> <DE7D>
+<8FC4> <8FC4> <C6F9>
+<8FC5> <8FC5> <D1B8>
+<8FC6> <8FC6> <DE7E>
+<8FC7> <8FC7> <B9FD>
+<8FC8> <8FC8> <C2F5>
+<8FC9> <8FCD> <DE80>
+<8FCE> <8FCE> <D3AD>
+<8FCF> <8FCF> <DE85>
+<8FD0> <8FD0> <D4CB>
+<8FD1> <8FD1> <BDFC>
+<8FD2> <8FD2> <DE86>
+<8FD3> <8FD3> <E5C2>
+<8FD4> <8FD4> <B7B5>
+<8FD5> <8FD5> <E5C3>
+<8FD6> <8FD7> <DE87>
+<8FD8> <8FD8> <BBB9>
+<8FD9> <8FD9> <D5E2>
+<8FDA> <8FDA> <DE89>
+<8FDB> <8FDB> <BDF8>
+<8FDC> <8FDC> <D4B6>
+<8FDD> <8FDD> <CEA5>
+<8FDE> <8FDE> <C1AC>
+<8FDF> <8FDF> <B3D9>
+<8FE0> <8FE1> <DE8A>
+<8FE2> <8FE2> <CCF6>
+<8FE3> <8FE3> <DE8C>
+<8FE4> <8FE4> <E5C6>
+<8FE5> <8FE5> <E5C4>
+<8FE6> <8FE6> <E5C8>
+<8FE7> <8FE7> <DE8D>
+<8FE8> <8FE8> <E5CA>
+<8FE9> <8FE9> <E5C7>
+<8FEA> <8FEA> <B5CF>
+<8FEB> <8FEB> <C6C8>
+<8FEC> <8FEC> <DE8E>
+<8FED> <8FED> <B5FC>
+<8FEE> <8FEE> <E5C5>
+<8FEF> <8FEF> <DE8F>
+<8FF0> <8FF0> <CAF6>
+<8FF1> <8FF2> <DE90>
+<8FF3> <8FF3> <E5C9>
+<8FF4> <8FF6> <DE92>
+<8FF7> <8FF7> <C3D4>
+<8FF8> <8FF8> <B1C5>
+<8FF9> <8FF9> <BCA3>
+<8FFA> <8FFC> <DE95>
+<8FFD> <8FFD> <D7B7>
+<8FFE> <8FFF> <DE98>
+<9000> <9000> <CDCB>
+<9001> <9001> <CBCD>
+<9002> <9002> <CACA>
+<9003> <9003> <CCD3>
+<9004> <9004> <E5CC>
+<9005> <9005> <E5CB>
+<9006> <9006> <C4E6>
+<9007> <9008> <DE9A>
+<9009> <9009> <D1A1>
+endbfrange
+
+100 beginbfrange
+<900A> <900A> <D1B7>
+<900B> <900B> <E5CD>
+<900C> <900C> <DE9C>
+<900D> <900D> <E5D0>
+<900E> <900E> <DE9D>
+<900F> <900F> <CDB8>
+<9010> <9010> <D6F0>
+<9011> <9011> <E5CF>
+<9012> <9012> <B5DD>
+<9013> <9013> <DE9E>
+<9014> <9014> <CDBE>
+<9015> <9015> <DE9F>
+<9016> <9016> <E5D1>
+<9017> <9017> <B6BA>
+<9018> <9018> <DEA0>
+<9019> <9019> <DF40>
+<901A> <901A> <CDA8>
+<901B> <901B> <B9E4>
+<901C> <901C> <DF41>
+<901D> <901D> <CAC5>
+<901E> <901E> <B3D1>
+<901F> <901F> <CBD9>
+<9020> <9020> <D4EC>
+<9021> <9021> <E5D2>
+<9022> <9022> <B7EA>
+<9023> <9025> <DF42>
+<9026> <9026> <E5CE>
+<9027> <902C> <DF45>
+<902D> <902D> <E5D5>
+<902E> <902E> <B4FE>
+<902F> <902F> <E5D6>
+<9030> <9034> <DF4B>
+<9035> <9036> <E5D3>
+<9037> <9037> <DF50>
+<9038> <9038> <D2DD>
+<9039> <903A> <DF51>
+<903B> <903B> <C2DF>
+<903C> <903C> <B1C6>
+<903D> <903D> <DF53>
+<903E> <903E> <D3E2>
+<903F> <9040> <DF54>
+<9041> <9041> <B6DD>
+<9042> <9042> <CBEC>
+<9043> <9043> <DF56>
+<9044> <9044> <E5D7>
+<9045> <9046> <DF57>
+<9047> <9047> <D3F6>
+<9048> <904C> <DF59>
+<904D> <904D> <B1E9>
+<904E> <904E> <DF5E>
+<904F> <904F> <B6F4>
+<9050> <9050> <E5DA>
+<9051> <9052> <E5D8>
+<9053> <9053> <B5C0>
+<9054> <9056> <DF5F>
+<9057> <9057> <D2C5>
+<9058> <9058> <E5DC>
+<9059> <905A> <DF62>
+<905B> <905B> <E5DE>
+<905C> <9061> <DF64>
+<9062> <9062> <E5DD>
+<9063> <9063> <C7B2>
+<9064> <9064> <DF6A>
+<9065> <9065> <D2A3>
+<9066> <9067> <DF6B>
+<9068> <9068> <E5DB>
+<9069> <906C> <DF6D>
+<906D> <906D> <D4E2>
+<906E> <906E> <D5DA>
+<906F> <9073> <DF71>
+<9074> <9074> <E5E0>
+<9075> <9075> <D7F1>
+<9076> <907C> <DF76>
+<907D> <907D> <E5E1>
+<907E> <907E> <DF7D>
+<907F> <907F> <B1DC>
+<9080> <9080> <D1FB>
+<9081> <9081> <DF7E>
+<9082> <9082> <E5E2>
+<9083> <9083> <E5E4>
+<9084> <9087> <DF80>
+<9088> <9088> <E5E3>
+<9089> <908A> <DF84>
+<908B> <908B> <E5E5>
+<908C> <9090> <DF86>
+<9091> <9091> <D2D8>
+<9092> <9092> <DF8B>
+<9093> <9093> <B5CB>
+<9094> <9094> <DF8C>
+<9095> <9095> <E7DF>
+<9096> <9096> <DF8D>
+<9097> <9097> <DAF5>
+<9098> <9098> <DF8E>
+<9099> <9099> <DAF8>
+<909A> <909A> <DF8F>
+<909B> <909B> <DAF6>
+<909C> <909C> <DF90>
+<909D> <909D> <DAF7>
+<909E> <90A0> <DF91>
+<90A1> <90A1> <DAFA>
+endbfrange
+
+100 beginbfrange
+<90A2> <90A2> <D0CF>
+<90A3> <90A3> <C4C7>
+<90A4> <90A5> <DF94>
+<90A6> <90A6> <B0EE>
+<90A7> <90A9> <DF96>
+<90AA> <90AA> <D0B0>
+<90AB> <90AB> <DF99>
+<90AC> <90AC> <DAF9>
+<90AD> <90AD> <DF9A>
+<90AE> <90AE> <D3CA>
+<90AF> <90AF> <BAAA>
+<90B0> <90B0> <DBA2>
+<90B1> <90B1> <C7F1>
+<90B2> <90B2> <DF9B>
+<90B3> <90B3> <DAFC>
+<90B4> <90B4> <DAFB>
+<90B5> <90B5> <C9DB>
+<90B6> <90B6> <DAFD>
+<90B7> <90B7> <DF9C>
+<90B8> <90B8> <DBA1>
+<90B9> <90B9> <D7DE>
+<90BA> <90BA> <DAFE>
+<90BB> <90BB> <C1DA>
+<90BC> <90BD> <DF9D>
+<90BE> <90BE> <DBA5>
+<90BF> <90C0> <DF9F>
+<90C1> <90C1> <D3F4>
+<90C2> <90C3> <E040>
+<90C4> <90C4> <DBA7>
+<90C5> <90C5> <DBA4>
+<90C6> <90C6> <E042>
+<90C7> <90C7> <DBA8>
+<90C8> <90C9> <E043>
+<90CA> <90CA> <BDBC>
+<90CB> <90CD> <E045>
+<90CE> <90CE> <C0C9>
+<90CF> <90CF> <DBA3>
+<90D0> <90D0> <DBA6>
+<90D1> <90D1> <D6A3>
+<90D2> <90D2> <E048>
+<90D3> <90D3> <DBA9>
+<90D4> <90D6> <E049>
+<90D7> <90D7> <DBAD>
+<90D8> <90DA> <E04C>
+<90DB> <90DB> <DBAE>
+<90DC> <90DC> <DBAC>
+<90DD> <90DD> <BAC2>
+<90DE> <90E0> <E04F>
+<90E1> <90E1> <BFA4>
+<90E2> <90E2> <DBAB>
+<90E3> <90E5> <E052>
+<90E6> <90E6> <DBAA>
+<90E7> <90E7> <D4C7>
+<90E8> <90E8> <B2BF>
+<90E9> <90EA> <E055>
+<90EB> <90EB> <DBAF>
+<90EC> <90EC> <E057>
+<90ED> <90ED> <B9F9>
+<90EE> <90EE> <E058>
+<90EF> <90EF> <DBB0>
+<90F0> <90F3> <E059>
+<90F4> <90F4> <B3BB>
+<90F5> <90F7> <E05D>
+<90F8> <90F8> <B5A6>
+<90F9> <90FC> <E060>
+<90FD> <90FD> <B6BC>
+<90FE> <90FE> <DBB1>
+<90FF> <90FF> <E064>
+<9100> <9101> <E065>
+<9102> <9102> <B6F5>
+<9103> <9103> <E067>
+<9104> <9104> <DBB2>
+<9105> <9118> <E068>
+<9119> <9119> <B1C9>
+<911A> <911C> <E07C>
+<911D> <911D> <E080>
+<911E> <911E> <DBB4>
+<911F> <9121> <E081>
+<9122> <9122> <DBB3>
+<9123> <9123> <DBB5>
+<9124> <912E> <E084>
+<912F> <912F> <DBB7>
+<9130> <9130> <E08F>
+<9131> <9131> <DBB6>
+<9132> <9138> <E090>
+<9139> <9139> <DBB8>
+<913A> <9142> <E097>
+<9143> <9143> <DBB9>
+<9144> <9144> <E0A0>
+<9145> <9145> <E140>
+<9146> <9146> <DBBA>
+<9147> <9148> <E141>
+<9149> <9149> <D3CF>
+<914A> <914A> <F4FA>
+<914B> <914B> <C7F5>
+<914C> <914C> <D7C3>
+<914D> <914D> <C5E4>
+<914E> <914F> <F4FC>
+<9150> <9150> <F4FB>
+<9151> <9151> <E143>
+endbfrange
+
+100 beginbfrange
+<9152> <9152> <BEC6>
+<9153> <9156> <E144>
+<9157> <9157> <D0EF>
+<9158> <9159> <E148>
+<915A> <915A> <B7D3>
+<915B> <915C> <E14A>
+<915D> <915D> <D4CD>
+<915E> <915E> <CCAA>
+<915F> <9160> <E14C>
+<9161> <9161> <F5A2>
+<9162> <9162> <F5A1>
+<9163> <9163> <BAA8>
+<9164> <9164> <F4FE>
+<9165> <9165> <CBD6>
+<9166> <9168> <E14E>
+<9169> <9169> <F5A4>
+<916A> <916A> <C0D2>
+<916B> <916B> <E151>
+<916C> <916C> <B3EA>
+<916D> <916D> <E152>
+<916E> <916E> <CDAA>
+<916F> <916F> <F5A5>
+<9170> <9170> <F5A3>
+<9171> <9171> <BDB4>
+<9172> <9172> <F5A8>
+<9173> <9173> <E153>
+<9174> <9174> <F5A9>
+<9175> <9175> <BDCD>
+<9176> <9176> <C3B8>
+<9177> <9177> <BFE1>
+<9178> <9178> <CBE1>
+<9179> <9179> <F5AA>
+<917A> <917C> <E154>
+<917D> <917E> <F5A6>
+<917F> <917F> <C4F0>
+<9180> <9184> <E157>
+<9185> <9185> <F5AC>
+<9186> <9186> <E15C>
+<9187> <9187> <B4BC>
+<9188> <9188> <E15D>
+<9189> <9189> <D7ED>
+<918A> <918A> <E15E>
+<918B> <918B> <B4D7>
+<918C> <918C> <F5AB>
+<918D> <918D> <F5AE>
+<918E> <918F> <E15F>
+<9190> <9190> <F5AD>
+<9191> <9191> <F5AF>
+<9192> <9192> <D0D1>
+<9193> <9199> <E161>
+<919A> <919A> <C3D1>
+<919B> <919B> <C8A9>
+<919C> <91A1> <E168>
+<91A2> <91A3> <F5B0>
+<91A4> <91A9> <E16E>
+<91AA> <91AA> <F5B2>
+<91AB> <91AC> <E174>
+<91AD> <91AF> <F5B3>
+<91B0> <91B3> <E176>
+<91B4> <91B4> <F5B7>
+<91B5> <91B5> <F5B6>
+<91B6> <91B9> <E17A>
+<91BA> <91BA> <F5B8>
+<91BB> <91BB> <E17E>
+<91BC> <91C6> <E180>
+<91C7> <91C7> <B2C9>
+<91C8> <91C8> <E18B>
+<91C9> <91C9> <D3D4>
+<91CA> <91CA> <CACD>
+<91CB> <91CB> <E18C>
+<91CC> <91CC> <C0EF>
+<91CD> <91CD> <D6D8>
+<91CE> <91CE> <D2B0>
+<91CF> <91CF> <C1BF>
+<91D0> <91D0> <E18D>
+<91D1> <91D1> <BDF0>
+<91D2> <91DB> <E18E>
+<91DC> <91DC> <B8AA>
+<91DD> <91E5> <E198>
+<91E6> <91FF> <E240>
+<9200> <9224> <E25A>
+<9225> <9245> <E280>
+<9246> <9273> <E340>
+<9274> <9274> <BCF8>
+<9275> <9285> <E36E>
+<9286> <928D> <E380>
+<928E> <928E> <F6C6>
+<928F> <92A7> <E388>
+<92A8> <92AD> <E440>
+<92AE> <92AE> <F6C7>
+<92AF> <92C7> <E446>
+<92C8> <92C8> <F6C8>
+<92C9> <92E8> <E45F>
+<92E9> <92FF> <E480>
+<9300> <9309> <E497>
+<930A> <933D> <E540>
+<933E> <933E> <F6C9>
+<933F> <9349> <E574>
+<934A> <9369> <E580>
+<936A> <936A> <F6CA>
+endbfrange
+
+100 beginbfrange
+<936B> <936B> <E5A0>
+<936C> <938E> <E640>
+<938F> <938F> <F6CC>
+<9390> <93AB> <E663>
+<93AC> <93C9> <E680>
+<93CA> <93CA> <F6CB>
+<93CB> <93CD> <E69E>
+<93CE> <93D5> <E740>
+<93D6> <93D6> <F7E9>
+<93D7> <93FF> <E748>
+<9400> <940D> <E771>
+<940E> <942E> <E780>
+<942F> <943D> <E840>
+<943E> <943E> <F6CD>
+<943F> <946A> <E84F>
+<946B> <946B> <F6CE>
+<946C> <946F> <E87B>
+<9470> <9484> <E880>
+<9485> <9487> <EEC4>
+<9488> <9488> <D5EB>
+<9489> <9489> <B6A4>
+<948A> <948A> <EEC8>
+<948B> <948B> <EEC7>
+<948C> <948D> <EEC9>
+<948E> <948E> <C7A5>
+<948F> <9490> <EECB>
+<9491> <9491> <E895>
+<9492> <9492> <B7B0>
+<9493> <9493> <B5F6>
+<9494> <9494> <EECD>
+<9495> <9495> <EECF>
+<9496> <9496> <E896>
+<9497> <9497> <EECE>
+<9498> <9498> <E897>
+<9499> <9499> <B8C6>
+<949A> <949C> <EED0>
+<949D> <949D> <B6DB>
+<949E> <949E> <B3AE>
+<949F> <949F> <D6D3>
+<94A0> <94A0> <C4C6>
+<94A1> <94A1> <B1B5>
+<94A2> <94A2> <B8D6>
+<94A3> <94A4> <EED3>
+<94A5> <94A5> <D4BF>
+<94A6> <94A6> <C7D5>
+<94A7> <94A7> <BEFB>
+<94A8> <94A8> <CED9>
+<94A9> <94A9> <B9B3>
+<94AA> <94AA> <EED6>
+<94AB> <94AB> <EED5>
+<94AC> <94AC> <EED8>
+<94AD> <94AD> <EED7>
+<94AE> <94AE> <C5A5>
+<94AF> <94B0> <EED9>
+<94B1> <94B1> <C7AE>
+<94B2> <94B2> <EEDB>
+<94B3> <94B3> <C7AF>
+<94B4> <94B4> <EEDC>
+<94B5> <94B5> <B2A7>
+<94B6> <94BA> <EEDD>
+<94BB> <94BB> <D7EA>
+<94BC> <94BD> <EEE2>
+<94BE> <94BE> <BCD8>
+<94BF> <94BF> <EEE4>
+<94C0> <94C0> <D3CB>
+<94C1> <94C1> <CCFA>
+<94C2> <94C2> <B2AC>
+<94C3> <94C3> <C1E5>
+<94C4> <94C4> <EEE5>
+<94C5> <94C5> <C7A6>
+<94C6> <94C6> <C3AD>
+<94C7> <94C7> <E898>
+<94C8> <94CE> <EEE6>
+<94CF> <94CF> <E899>
+<94D0> <94D2> <EEED>
+<94D3> <94D4> <E89A>
+<94D5> <94D7> <EEF0>
+<94D8> <94D8> <EEF4>
+<94D9> <94D9> <EEF3>
+<94DA> <94DA> <E89C>
+<94DB> <94DB> <EEF5>
+<94DC> <94DC> <CDAD>
+<94DD> <94DD> <C2C1>
+<94DE> <94E0> <EEF6>
+<94E1> <94E1> <D5A1>
+<94E2> <94E2> <EEF9>
+<94E3> <94E3> <CFB3>
+<94E4> <94E5> <EEFA>
+<94E6> <94E6> <E89D>
+<94E7> <94E8> <EEFC>
+<94E9> <94E9> <EFA1>
+<94EA> <94EA> <EEFE>
+<94EB> <94EB> <EFA2>
+<94EC> <94EC> <B8F5>
+<94ED> <94ED> <C3FA>
+<94EE> <94EF> <EFA3>
+<94F0> <94F0> <BDC2>
+<94F1> <94F1> <D2BF>
+<94F2> <94F2> <B2F9>
+<94F3> <94F5> <EFA5>
+endbfrange
+
+100 beginbfrange
+<94F6> <94F6> <D2F8>
+<94F7> <94F7> <EFA8>
+<94F8> <94F8> <D6FD>
+<94F9> <94F9> <EFA9>
+<94FA> <94FA> <C6CC>
+<94FB> <94FB> <E89E>
+<94FC> <94FD> <EFAA>
+<94FE> <94FE> <C1B4>
+<94FF> <94FF> <EFAC>
+<9500> <9500> <CFFA>
+<9501> <9501> <CBF8>
+<9502> <9502> <EFAE>
+<9503> <9503> <EFAD>
+<9504> <9504> <B3FA>
+<9505> <9505> <B9F8>
+<9506> <9507> <EFAF>
+<9508> <9508> <D0E2>
+<9509> <950A> <EFB1>
+<950B> <950B> <B7E6>
+<950C> <950C> <D0BF>
+<950D> <950F> <EFB3>
+<9510> <9510> <C8F1>
+<9511> <9511> <CCE0>
+<9512> <9516> <EFB6>
+<9517> <9517> <D5E0>
+<9518> <9518> <EFBB>
+<9519> <9519> <B4ED>
+<951A> <951A> <C3AA>
+<951B> <951B> <EFBC>
+<951C> <951C> <E89F>
+<951D> <951F> <EFBD>
+<9520> <9520> <E8A0>
+<9521> <9521> <CEFD>
+<9522> <9522> <EFC0>
+<9523> <9523> <C2E0>
+<9524> <9524> <B4B8>
+<9525> <9525> <D7B6>
+<9526> <9526> <BDF5>
+<9527> <9527> <E940>
+<9528> <9528> <CFC7>
+<9529> <9529> <EFC3>
+<952A> <952B> <EFC1>
+<952C> <952C> <EFC4>
+<952D> <952D> <B6A7>
+<952E> <952E> <BCFC>
+<952F> <952F> <BEE2>
+<9530> <9530> <C3CC>
+<9531> <9532> <EFC5>
+<9533> <9533> <E941>
+<9534> <9534> <EFC7>
+<9535> <9535> <EFCF>
+<9536> <9538> <EFC8>
+<9539> <9539> <C7C2>
+<953A> <953A> <EFF1>
+<953B> <953B> <B6CD>
+<953C> <953C> <EFCB>
+<953D> <953D> <E942>
+<953E> <953F> <EFCC>
+<9540> <9540> <B6C6>
+<9541> <9541> <C3BE>
+<9542> <9542> <EFCE>
+<9543> <9543> <E943>
+<9544> <9546> <EFD0>
+<9547> <9547> <D5F2>
+<9548> <9548> <E944>
+<9549> <9549> <EFD3>
+<954A> <954A> <C4F7>
+<954B> <954B> <E945>
+<954C> <954C> <EFD4>
+<954D> <954D> <C4F8>
+<954E> <954F> <EFD5>
+<9550> <9550> <B8E4>
+<9551> <9551> <B0F7>
+<9552> <9554> <EFD7>
+<9555> <9555> <E946>
+<9556> <9559> <EFDA>
+<955A> <955A> <E947>
+<955B> <955B> <EFDE>
+<955C> <955C> <BEB5>
+<955D> <955D> <EFE1>
+<955E> <955F> <EFDF>
+<9560> <9560> <E948>
+<9561> <9562> <EFE2>
+<9563> <9563> <C1CD>
+<9564> <956C> <EFE4>
+<956D> <956D> <C0D8>
+<956E> <956E> <E949>
+<956F> <956F> <EFED>
+<9570> <9570> <C1AD>
+<9571> <9573> <EFEE>
+<9574> <9575> <E94A>
+<9576> <9576> <CFE2>
+<9577> <957E> <E94C>
+<957F> <957F> <B3A4>
+<9580> <95AA> <E954>
+<95AB> <95CB> <E980>
+<95CC> <95E7> <EA40>
+<95E8> <95E8> <C3C5>
+<95E9> <95E9> <E3C5>
+<95EA> <95EA> <C9C1>
+endbfrange
+
+100 beginbfrange
+<95EB> <95EB> <E3C6>
+<95EC> <95EC> <EA5C>
+<95ED> <95ED> <B1D5>
+<95EE> <95EE> <CECA>
+<95EF> <95EF> <B4B3>
+<95F0> <95F0> <C8F2>
+<95F1> <95F1> <E3C7>
+<95F2> <95F2> <CFD0>
+<95F3> <95F3> <E3C8>
+<95F4> <95F4> <BCE4>
+<95F5> <95F6> <E3C9>
+<95F7> <95F7> <C3C6>
+<95F8> <95F8> <D5A2>
+<95F9> <95F9> <C4D6>
+<95FA> <95FA> <B9EB>
+<95FB> <95FB> <CEC5>
+<95FC> <95FC> <E3CB>
+<95FD> <95FD> <C3F6>
+<95FE> <95FE> <E3CC>
+<95FF> <95FF> <EA5D>
+<9600> <9600> <B7A7>
+<9601> <9601> <B8F3>
+<9602> <9602> <BAD2>
+<9603> <9604> <E3CD>
+<9605> <9605> <D4C4>
+<9606> <9606> <E3CF>
+<9607> <9607> <EA5E>
+<9608> <9608> <E3D0>
+<9609> <9609> <D1CB>
+<960A> <960D> <E3D1>
+<960E> <960E> <D1D6>
+<960F> <960F> <E3D5>
+<9610> <9610> <B2FB>
+<9611> <9611> <C0BB>
+<9612> <9612> <E3D6>
+<9613> <9613> <EA5F>
+<9614> <9614> <C0AB>
+<9615> <9617> <E3D7>
+<9618> <9618> <EA60>
+<9619> <961A> <E3DA>
+<961B> <961B> <EA61>
+<961C> <961C> <B8B7>
+<961D> <961D> <DAE2>
+<961E> <961E> <EA62>
+<961F> <961F> <B6D3>
+<9620> <9620> <EA63>
+<9621> <9621> <DAE4>
+<9622> <9622> <DAE3>
+<9623> <9629> <EA64>
+<962A> <962A> <DAE6>
+<962B> <962D> <EA6B>
+<962E> <962E> <C8EE>
+<962F> <9630> <EA6E>
+<9631> <9631> <DAE5>
+<9632> <9632> <B7C0>
+<9633> <9633> <D1F4>
+<9634> <9634> <D2F5>
+<9635> <9635> <D5F3>
+<9636> <9636> <BDD7>
+<9637> <963A> <EA70>
+<963B> <963B> <D7E8>
+<963C> <963C> <DAE8>
+<963D> <963D> <DAE7>
+<963E> <963E> <EA74>
+<963F> <963F> <B0A2>
+<9640> <9640> <CDD3>
+<9641> <9641> <EA75>
+<9642> <9642> <DAE9>
+<9643> <9643> <EA76>
+<9644> <9644> <B8BD>
+<9645> <9645> <BCCA>
+<9646> <9646> <C2BD>
+<9647> <9647> <C2A4>
+<9648> <9648> <B3C2>
+<9649> <9649> <DAEA>
+<964A> <964A> <EA77>
+<964B> <964B> <C2AA>
+<964C> <964C> <C4B0>
+<964D> <964D> <BDB5>
+<964E> <964F> <EA78>
+<9650> <9650> <CFDE>
+<9651> <9653> <EA7A>
+<9654> <9654> <DAEB>
+<9655> <9655> <C9C2>
+<9656> <9657> <EA7D>
+<9658> <965A> <EA80>
+<965B> <965B> <B1DD>
+<965C> <965E> <EA83>
+<965F> <965F> <DAEC>
+<9660> <9660> <EA86>
+<9661> <9661> <B6B8>
+<9662> <9662> <D4BA>
+<9663> <9663> <EA87>
+<9664> <9664> <B3FD>
+<9665> <9666> <EA88>
+<9667> <9667> <DAED>
+<9668> <9668> <D4C9>
+<9669> <9669> <CFD5>
+<966A> <966A> <C5E3>
+<966B> <966B> <EA8A>
+endbfrange
+
+100 beginbfrange
+<966C> <966C> <DAEE>
+<966D> <9671> <EA8B>
+<9672> <9672> <DAEF>
+<9673> <9673> <EA90>
+<9674> <9674> <DAF0>
+<9675> <9675> <C1EA>
+<9676> <9676> <CCD5>
+<9677> <9677> <CFDD>
+<9678> <9684> <EA91>
+<9685> <9685> <D3E7>
+<9686> <9686> <C2A1>
+<9687> <9687> <EA9E>
+<9688> <9688> <DAF1>
+<9689> <968A> <EA9F>
+<968B> <968B> <CBE5>
+<968C> <968C> <EB40>
+<968D> <968D> <DAF2>
+<968E> <968E> <EB41>
+<968F> <968F> <CBE6>
+<9690> <9690> <D2FE>
+<9691> <9693> <EB42>
+<9694> <9694> <B8F4>
+<9695> <9696> <EB45>
+<9697> <9697> <DAF3>
+<9698> <9698> <B0AF>
+<9699> <9699> <CFB6>
+<969A> <969B> <EB47>
+<969C> <969C> <D5CF>
+<969D> <96A6> <EB49>
+<96A7> <96A7> <CBED>
+<96A8> <96AF> <EB53>
+<96B0> <96B0> <DAF4>
+<96B1> <96B2> <EB5B>
+<96B3> <96B3> <E3C4>
+<96B4> <96B5> <EB5D>
+<96B6> <96B6> <C1A5>
+<96B7> <96B8> <EB5F>
+<96B9> <96B9> <F6BF>
+<96BA> <96BB> <EB61>
+<96BC> <96BD> <F6C0>
+<96BE> <96BE> <C4D1>
+<96BF> <96BF> <EB63>
+<96C0> <96C0> <C8B8>
+<96C1> <96C1> <D1E3>
+<96C2> <96C3> <EB64>
+<96C4> <96C4> <D0DB>
+<96C5> <96C5> <D1C5>
+<96C6> <96C6> <BCAF>
+<96C7> <96C7> <B9CD>
+<96C8> <96C8> <EB66>
+<96C9> <96C9> <EFF4>
+<96CA> <96CB> <EB67>
+<96CC> <96CC> <B4C6>
+<96CD> <96CD> <D3BA>
+<96CE> <96CE> <F6C2>
+<96CF> <96CF> <B3FB>
+<96D0> <96D1> <EB69>
+<96D2> <96D2> <F6C3>
+<96D3> <96D4> <EB6B>
+<96D5> <96D5> <B5F1>
+<96D6> <96DF> <EB6D>
+<96E0> <96E0> <F6C5>
+<96E1> <96E7> <EB77>
+<96E8> <96E8> <D3EA>
+<96E9> <96E9> <F6A7>
+<96EA> <96EA> <D1A9>
+<96EB> <96EB> <EB7E>
+<96EC> <96EE> <EB80>
+<96EF> <96EF> <F6A9>
+<96F0> <96F2> <EB83>
+<96F3> <96F3> <F6A8>
+<96F4> <96F5> <EB86>
+<96F6> <96F6> <C1E3>
+<96F7> <96F7> <C0D7>
+<96F8> <96F8> <EB88>
+<96F9> <96F9> <B1A2>
+<96FA> <96FD> <EB89>
+<96FE> <96FE> <CEED>
+<96FF> <96FF> <EB8D>
+<9700> <9700> <D0E8>
+<9701> <9701> <F6AB>
+<9702> <9703> <EB8E>
+<9704> <9704> <CFF6>
+<9705> <9705> <EB90>
+<9706> <9706> <F6AA>
+<9707> <9707> <D5F0>
+<9708> <9708> <F6AC>
+<9709> <9709> <C3B9>
+<970A> <970C> <EB91>
+<970D> <970D> <BBF4>
+<970E> <970E> <F6AE>
+<970F> <970F> <F6AD>
+<9710> <9712> <EB94>
+<9713> <9713> <C4DE>
+<9714> <9715> <EB97>
+<9716> <9716> <C1D8>
+<9717> <971B> <EB99>
+<971C> <971C> <CBAA>
+<971D> <971D> <EB9E>
+<971E> <971E> <CFBC>
+endbfrange
+
+100 beginbfrange
+<971F> <9720> <EB9F>
+<9721> <9729> <EC40>
+<972A> <972A> <F6AF>
+<972B> <972C> <EC49>
+<972D> <972D> <F6B0>
+<972E> <972F> <EC4B>
+<9730> <9730> <F6B1>
+<9731> <9731> <EC4D>
+<9732> <9732> <C2B6>
+<9733> <9737> <EC4E>
+<9738> <9738> <B0D4>
+<9739> <9739> <C5F9>
+<973A> <973D> <EC53>
+<973E> <973E> <F6B2>
+<973F> <9751> <EC57>
+<9752> <9752> <C7E0>
+<9753> <9753> <F6A6>
+<9754> <9755> <EC6A>
+<9756> <9756> <BEB8>
+<9757> <9758> <EC6C>
+<9759> <9759> <BEB2>
+<975A> <975A> <EC6E>
+<975B> <975B> <B5E5>
+<975C> <975D> <EC6F>
+<975E> <975E> <B7C7>
+<975F> <975F> <EC71>
+<9760> <9760> <BFBF>
+<9761> <9761> <C3D2>
+<9762> <9762> <C3E6>
+<9763> <9764> <EC72>
+<9765> <9765> <D8CC>
+<9766> <9768> <EC74>
+<9769> <9769> <B8EF>
+<976A> <9771> <EC77>
+<9772> <9772> <EC80>
+<9773> <9773> <BDF9>
+<9774> <9774> <D1A5>
+<9775> <9775> <EC81>
+<9776> <9776> <B0D0>
+<9777> <977B> <EC82>
+<977C> <977C> <F7B0>
+<977D> <9784> <EC87>
+<9785> <9785> <F7B1>
+<9786> <978A> <EC8F>
+<978B> <978B> <D0AC>
+<978C> <978C> <EC94>
+<978D> <978D> <B0B0>
+<978E> <9790> <EC95>
+<9791> <9792> <F7B2>
+<9793> <9793> <EC98>
+<9794> <9794> <F7B4>
+<9795> <9797> <EC99>
+<9798> <9798> <C7CA>
+<9799> <979D> <EC9C>
+<979E> <979F> <ED40>
+<97A0> <97A0> <BECF>
+<97A1> <97A2> <ED42>
+<97A3> <97A3> <F7B7>
+<97A4> <97AA> <ED44>
+<97AB> <97AB> <F7B6>
+<97AC> <97AC> <ED4B>
+<97AD> <97AD> <B1DE>
+<97AE> <97AE> <ED4C>
+<97AF> <97AF> <F7B5>
+<97B0> <97B1> <ED4D>
+<97B2> <97B2> <F7B8>
+<97B3> <97B3> <ED4F>
+<97B4> <97B4> <F7B9>
+<97B5> <97E3> <ED50>
+<97E4> <97E5> <ED80>
+<97E6> <97E6> <CEA4>
+<97E7> <97E7> <C8CD>
+<97E8> <97E8> <ED82>
+<97E9> <97E9> <BAAB>
+<97EA> <97EC> <E8B8>
+<97ED> <97ED> <BEC2>
+<97EE> <97F2> <ED83>
+<97F3> <97F3> <D2F4>
+<97F4> <97F4> <ED88>
+<97F5> <97F5> <D4CF>
+<97F6> <97F6> <C9D8>
+<97F7> <97FF> <ED89>
+<9800> <980E> <ED92>
+<980F> <984D> <EE40>
+<984E> <986E> <EE80>
+<986F> <9874> <EF40>
+<9875> <9875> <D2B3>
+<9876> <9876> <B6A5>
+<9877> <9877> <C7EA>
+<9878> <9878> <F1FC>
+<9879> <9879> <CFEE>
+<987A> <987A> <CBB3>
+<987B> <987B> <D0EB>
+<987C> <987C> <E7EF>
+<987D> <987D> <CDE7>
+<987E> <987E> <B9CB>
+<987F> <987F> <B6D9>
+<9880> <9880> <F1FD>
+<9881> <9881> <B0E4>
+<9882> <9882> <CBCC>
+endbfrange
+
+100 beginbfrange
+<9883> <9883> <F1FE>
+<9884> <9884> <D4A4>
+<9885> <9885> <C2AD>
+<9886> <9886> <C1EC>
+<9887> <9887> <C6C4>
+<9888> <9888> <BEB1>
+<9889> <9889> <F2A1>
+<988A> <988A> <BCD5>
+<988B> <988B> <EF46>
+<988C> <988D> <F2A2>
+<988E> <988E> <EF47>
+<988F> <988F> <F2A4>
+<9890> <9890> <D2C3>
+<9891> <9891> <C6B5>
+<9892> <9892> <EF48>
+<9893> <9893> <CDC7>
+<9894> <9894> <F2A5>
+<9895> <9895> <EF49>
+<9896> <9896> <D3B1>
+<9897> <9897> <BFC5>
+<9898> <9898> <CCE2>
+<9899> <9899> <EF4A>
+<989A> <989B> <F2A6>
+<989C> <989C> <D1D5>
+<989D> <989D> <B6EE>
+<989E> <989F> <F2A8>
+<98A0> <98A0> <B5DF>
+<98A1> <98A2> <F2AA>
+<98A3> <98A3> <EF4B>
+<98A4> <98A4> <B2FC>
+<98A5> <98A6> <F2AC>
+<98A7> <98A7> <C8A7>
+<98A8> <98CD> <EF4C>
+<98CE> <98CE> <B7E7>
+<98CF> <98D0> <EF72>
+<98D1> <98D3> <ECA9>
+<98D4> <98D4> <EF74>
+<98D5> <98D5> <ECAC>
+<98D6> <98D7> <EF75>
+<98D8> <98D8> <C6AE>
+<98D9> <98DA> <ECAD>
+<98DB> <98DD> <EF77>
+<98DE> <98DE> <B7C9>
+<98DF> <98DF> <CAB3>
+<98E0> <98E4> <EF7A>
+<98E5> <98E6> <EF80>
+<98E7> <98E7> <E2B8>
+<98E8> <98E8> <F7CF>
+<98E9> <98FF> <EF82>
+<9900> <9907> <EF99>
+<9908> <990C> <F040>
+<990D> <990D> <F7D0>
+<990E> <990F> <F045>
+<9910> <9910> <B2CD>
+<9911> <992D> <F047>
+<992E> <992E> <F7D1>
+<992F> <9949> <F064>
+<994A> <9953> <F080>
+<9954> <9954> <F7D3>
+<9955> <9955> <F7D2>
+<9956> <9962> <F08A>
+<9963> <9963> <E2BB>
+<9964> <9964> <F097>
+<9965> <9965> <BCA2>
+<9966> <9966> <F098>
+<9967> <996C> <E2BC>
+<996D> <996D> <B7B9>
+<996E> <996E> <D2FB>
+<996F> <996F> <BDA4>
+<9970> <9970> <CACE>
+<9971> <9971> <B1A5>
+<9972> <9972> <CBC7>
+<9973> <9973> <F099>
+<9974> <9974> <E2C2>
+<9975> <9975> <B6FC>
+<9976> <9976> <C8C4>
+<9977> <9977> <E2C3>
+<9978> <9979> <F09A>
+<997A> <997A> <BDC8>
+<997B> <997B> <F09C>
+<997C> <997C> <B1FD>
+<997D> <997D> <E2C4>
+<997E> <997E> <F09D>
+<997F> <997F> <B6F6>
+<9980> <9980> <E2C5>
+<9981> <9981> <C4D9>
+<9982> <9983> <F09E>
+<9984> <9984> <E2C6>
+<9985> <9985> <CFDA>
+<9986> <9986> <B9DD>
+<9987> <9987> <E2C7>
+<9988> <9988> <C0A1>
+<9989> <9989> <F0A0>
+<998A> <998A> <E2C8>
+<998B> <998B> <B2F6>
+<998C> <998C> <F140>
+<998D> <998D> <E2C9>
+<998E> <998E> <F141>
+<998F> <998F> <C1F3>
+<9990> <9991> <E2CA>
+endbfrange
+
+100 beginbfrange
+<9992> <9992> <C2F8>
+<9993> <9995> <E2CC>
+<9996> <9996> <CAD7>
+<9997> <9997> <D8B8>
+<9998> <9998> <D9E5>
+<9999> <9999> <CFE3>
+<999A> <99A4> <F142>
+<99A5> <99A5> <F0A5>
+<99A6> <99A7> <F14D>
+<99A8> <99A8> <DCB0>
+<99A9> <99D8> <F14F>
+<99D9> <99F9> <F180>
+<99FA> <99FF> <F240>
+<9A00> <9A38> <F246>
+<9A39> <9A59> <F280>
+<9A5A> <9A6B> <F340>
+<9A6C> <9A6C> <C2ED>
+<9A6D> <9A6D> <D4A6>
+<9A6E> <9A6E> <CDD4>
+<9A6F> <9A6F> <D1B1>
+<9A70> <9A70> <B3DB>
+<9A71> <9A71> <C7FD>
+<9A72> <9A72> <F352>
+<9A73> <9A73> <B2B5>
+<9A74> <9A74> <C2BF>
+<9A75> <9A75> <E6E0>
+<9A76> <9A76> <CABB>
+<9A77> <9A78> <E6E1>
+<9A79> <9A79> <BED4>
+<9A7A> <9A7A> <E6E3>
+<9A7B> <9A7B> <D7A4>
+<9A7C> <9A7C> <CDD5>
+<9A7D> <9A7D> <E6E5>
+<9A7E> <9A7E> <BCDD>
+<9A7F> <9A7F> <E6E4>
+<9A80> <9A81> <E6E6>
+<9A82> <9A82> <C2EE>
+<9A83> <9A83> <F353>
+<9A84> <9A84> <BDBE>
+<9A85> <9A85> <E6E8>
+<9A86> <9A86> <C2E6>
+<9A87> <9A87> <BAA7>
+<9A88> <9A88> <E6E9>
+<9A89> <9A89> <F354>
+<9A8A> <9A8A> <E6EA>
+<9A8B> <9A8B> <B3D2>
+<9A8C> <9A8C> <D1E9>
+<9A8D> <9A8E> <F355>
+<9A8F> <9A8F> <BFA5>
+<9A90> <9A90> <E6EB>
+<9A91> <9A91> <C6EF>
+<9A92> <9A93> <E6EC>
+<9A94> <9A95> <F357>
+<9A96> <9A96> <E6EE>
+<9A97> <9A97> <C6AD>
+<9A98> <9A98> <E6EF>
+<9A99> <9A99> <F359>
+<9A9A> <9A9A> <C9A7>
+<9A9B> <9A9D> <E6F0>
+<9A9E> <9A9E> <E5B9>
+<9A9F> <9AA0> <E6F3>
+<9AA1> <9AA1> <C2E2>
+<9AA2> <9AA3> <E6F5>
+<9AA4> <9AA4> <D6E8>
+<9AA5> <9AA5> <E6F7>
+<9AA6> <9AA6> <F35A>
+<9AA7> <9AA7> <E6F8>
+<9AA8> <9AA8> <B9C7>
+<9AA9> <9AAF> <F35B>
+<9AB0> <9AB0> <F7BB>
+<9AB1> <9AB1> <F7BA>
+<9AB2> <9AB5> <F362>
+<9AB6> <9AB6> <F7BE>
+<9AB7> <9AB7> <F7BC>
+<9AB8> <9AB8> <BAA1>
+<9AB9> <9AB9> <F366>
+<9ABA> <9ABA> <F7BF>
+<9ABB> <9ABB> <F367>
+<9ABC> <9ABC> <F7C0>
+<9ABD> <9ABF> <F368>
+<9AC0> <9AC0> <F7C2>
+<9AC1> <9AC1> <F7C1>
+<9AC2> <9AC2> <F7C4>
+<9AC3> <9AC4> <F36B>
+<9AC5> <9AC5> <F7C3>
+<9AC6> <9ACA> <F36D>
+<9ACB> <9ACC> <F7C5>
+<9ACD> <9AD0> <F372>
+<9AD1> <9AD1> <F7C7>
+<9AD2> <9AD2> <F376>
+<9AD3> <9AD3> <CBE8>
+<9AD4> <9AD7> <F377>
+<9AD8> <9AD8> <B8DF>
+<9AD9> <9ADC> <F37B>
+<9ADD> <9ADE> <F380>
+<9ADF> <9ADF> <F7D4>
+<9AE0> <9AE0> <F382>
+<9AE1> <9AE1> <F7D5>
+<9AE2> <9AE5> <F383>
+<9AE6> <9AE6> <F7D6>
+endbfrange
+
+100 beginbfrange
+<9AE7> <9AEA> <F387>
+<9AEB> <9AEB> <F7D8>
+<9AEC> <9AEC> <F38B>
+<9AED> <9AED> <F7DA>
+<9AEE> <9AEE> <F38C>
+<9AEF> <9AEF> <F7D7>
+<9AF0> <9AF8> <F38D>
+<9AF9> <9AF9> <F7DB>
+<9AFA> <9AFA> <F396>
+<9AFB> <9AFB> <F7D9>
+<9AFC> <9AFF> <F397>
+<9B00> <9B02> <F39B>
+<9B03> <9B03> <D7D7>
+<9B04> <9B06> <F39E>
+<9B07> <9B07> <F440>
+<9B08> <9B08> <F7DC>
+<9B09> <9B0E> <F441>
+<9B0F> <9B0F> <F7DD>
+<9B10> <9B12> <F447>
+<9B13> <9B13> <F7DE>
+<9B14> <9B1E> <F44A>
+<9B1F> <9B1F> <F7DF>
+<9B20> <9B22> <F455>
+<9B23> <9B23> <F7E0>
+<9B24> <9B2E> <F458>
+<9B2F> <9B2F> <DBCB>
+<9B30> <9B31> <F463>
+<9B32> <9B32> <D8AA>
+<9B33> <9B3A> <F465>
+<9B3B> <9B3B> <E5F7>
+<9B3C> <9B3C> <B9ED>
+<9B3D> <9B40> <F46D>
+<9B41> <9B41> <BFFD>
+<9B42> <9B42> <BBEA>
+<9B43> <9B43> <F7C9>
+<9B44> <9B44> <C6C7>
+<9B45> <9B45> <F7C8>
+<9B46> <9B46> <F471>
+<9B47> <9B47> <F7CA>
+<9B48> <9B48> <F7CC>
+<9B49> <9B49> <F7CB>
+<9B4A> <9B4C> <F472>
+<9B4D> <9B4D> <F7CD>
+<9B4E> <9B4E> <F475>
+<9B4F> <9B4F> <CEBA>
+<9B50> <9B50> <F476>
+<9B51> <9B51> <F7CE>
+<9B52> <9B53> <F477>
+<9B54> <9B54> <C4A7>
+<9B55> <9B5A> <F479>
+<9B5B> <9B7B> <F480>
+<9B7C> <9BBA> <F540>
+<9BBB> <9BDB> <F580>
+<9BDC> <9BFF> <F640>
+<9C00> <9C1A> <F664>
+<9C1B> <9C3B> <F680>
+<9C3C> <9C7A> <F740>
+<9C7B> <9C7B> <F780>
+<9C7C> <9C7C> <D3E3>
+<9C7D> <9C7E> <F781>
+<9C7F> <9C7F> <F6CF>
+<9C80> <9C80> <F783>
+<9C81> <9C81> <C2B3>
+<9C82> <9C82> <F6D0>
+<9C83> <9C84> <F784>
+<9C85> <9C88> <F6D1>
+<9C89> <9C8A> <F786>
+<9C8B> <9C8B> <F6D6>
+<9C8C> <9C8C> <F788>
+<9C8D> <9C8D> <B1AB>
+<9C8E> <9C8E> <F6D7>
+<9C8F> <9C8F> <F789>
+<9C90> <9C92> <F6D8>
+<9C93> <9C93> <F78A>
+<9C94> <9C95> <F6DB>
+<9C96> <9C99> <F78B>
+<9C9A> <9C9B> <F6DD>
+<9C9C> <9C9C> <CFCA>
+<9C9D> <9C9D> <F78F>
+<9C9E> <9CA3> <F6DF>
+<9CA4> <9CA4> <C0F0>
+<9CA5> <9CA9> <F6E5>
+<9CAA> <9CAA> <F790>
+<9CAB> <9CAB> <F6EA>
+<9CAC> <9CAC> <F791>
+<9CAD> <9CAE> <F6EB>
+<9CAF> <9CAF> <F792>
+<9CB0> <9CB7> <F6ED>
+<9CB8> <9CB8> <BEA8>
+<9CB9> <9CB9> <F793>
+<9CBA> <9CBD> <F6F5>
+<9CBE> <9CC2> <F794>
+<9CC3> <9CC3> <C8FA>
+<9CC4> <9CC7> <F6F9>
+<9CC8> <9CC9> <F799>
+<9CCA> <9CCB> <F6FD>
+<9CCC> <9CD0> <F7A1>
+<9CD1> <9CD2> <F79B>
+<9CD3> <9CD5> <F7A6>
+<9CD6> <9CD6> <B1EE>
+endbfrange
+
+100 beginbfrange
+<9CD7> <9CD9> <F7A9>
+<9CDA> <9CDB> <F79D>
+<9CDC> <9CDD> <F7AC>
+<9CDE> <9CDE> <C1DB>
+<9CDF> <9CDF> <F7AE>
+<9CE0> <9CE1> <F79F>
+<9CE2> <9CE2> <F7AF>
+<9CE3> <9CFF> <F840>
+<9D00> <9D21> <F85D>
+<9D22> <9D42> <F880>
+<9D43> <9D81> <F940>
+<9D82> <9DA2> <F980>
+<9DA3> <9DE1> <FA40>
+<9DE2> <9DFF> <FA80>
+<9E00> <9E02> <FA9E>
+<9E03> <9E1E> <FB40>
+<9E1F> <9E1F> <C4F1>
+<9E20> <9E20> <F0AF>
+<9E21> <9E21> <BCA6>
+<9E22> <9E22> <F0B0>
+<9E23> <9E23> <C3F9>
+<9E24> <9E24> <FB5C>
+<9E25> <9E25> <C5B8>
+<9E26> <9E26> <D1BB>
+<9E27> <9E27> <FB5D>
+<9E28> <9E2C> <F0B1>
+<9E2D> <9E2D> <D1BC>
+<9E2E> <9E2E> <FB5E>
+<9E2F> <9E2F> <D1EC>
+<9E30> <9E30> <FB5F>
+<9E31> <9E31> <F0B7>
+<9E32> <9E32> <F0B6>
+<9E33> <9E33> <D4A7>
+<9E34> <9E34> <FB60>
+<9E35> <9E35> <CDD2>
+<9E36> <9E36> <F0B8>
+<9E37> <9E37> <F0BA>
+<9E38> <9E38> <F0B9>
+<9E39> <9E3A> <F0BB>
+<9E3B> <9E3C> <FB61>
+<9E3D> <9E3D> <B8EB>
+<9E3E> <9E3E> <F0BD>
+<9E3F> <9E3F> <BAE8>
+<9E40> <9E40> <FB63>
+<9E41> <9E42> <F0BE>
+<9E43> <9E43> <BEE9>
+<9E44> <9E44> <F0C0>
+<9E45> <9E45> <B6EC>
+<9E46> <9E49> <F0C1>
+<9E4A> <9E4A> <C8B5>
+<9E4B> <9E4C> <F0C5>
+<9E4D> <9E4D> <FB64>
+<9E4E> <9E4E> <F0C7>
+<9E4F> <9E4F> <C5F4>
+<9E50> <9E50> <FB65>
+<9E51> <9E51> <F0C8>
+<9E52> <9E54> <FB66>
+<9E55> <9E55> <F0C9>
+<9E56> <9E56> <FB69>
+<9E57> <9E57> <F0CA>
+<9E58> <9E58> <F7BD>
+<9E59> <9E59> <FB6A>
+<9E5A> <9E5C> <F0CB>
+<9E5D> <9E5D> <FB6B>
+<9E5E> <9E5E> <F0CE>
+<9E5F> <9E62> <FB6C>
+<9E63> <9E63> <F0CF>
+<9E64> <9E64> <BAD7>
+<9E65> <9E65> <FB70>
+<9E66> <9E6C> <F0D0>
+<9E6D> <9E6D> <F0D8>
+<9E6E> <9E6F> <FB71>
+<9E70> <9E70> <D3A5>
+<9E71> <9E71> <F0D7>
+<9E72> <9E72> <FB73>
+<9E73> <9E73> <F0D9>
+<9E74> <9E7D> <FB74>
+<9E7E> <9E7E> <F5BA>
+<9E7F> <9E7F> <C2B9>
+<9E80> <9E80> <FB7E>
+<9E81> <9E81> <FB80>
+<9E82> <9E82> <F7E4>
+<9E83> <9E86> <FB81>
+<9E87> <9E88> <F7E5>
+<9E89> <9E8A> <FB85>
+<9E8B> <9E8B> <F7E7>
+<9E8C> <9E91> <FB87>
+<9E92> <9E92> <F7E8>
+<9E93> <9E93> <C2B4>
+<9E94> <9E9C> <FB8D>
+<9E9D> <9E9D> <F7EA>
+<9E9E> <9E9E> <FB96>
+<9E9F> <9E9F> <F7EB>
+<9EA0> <9EA5> <FB97>
+<9EA6> <9EA6> <C2F3>
+<9EA7> <9EAA> <FB9D>
+<9EAB> <9EB3> <FC40>
+<9EB4> <9EB4> <F4F0>
+<9EB5> <9EB7> <FC49>
+<9EB8> <9EB8> <F4EF>
+endbfrange
+
+100 beginbfrange
+<9EB9> <9EBA> <FC4C>
+<9EBB> <9EBB> <C2E9>
+<9EBC> <9EBC> <FC4E>
+<9EBD> <9EBE> <F7E1>
+<9EBF> <9EC3> <FC4F>
+<9EC4> <9EC4> <BBC6>
+<9EC5> <9EC8> <FC54>
+<9EC9> <9EC9> <D9E4>
+<9ECA> <9ECC> <FC58>
+<9ECD> <9ECD> <CAF2>
+<9ECE> <9ECE> <C0E8>
+<9ECF> <9ECF> <F0A4>
+<9ED0> <9ED0> <FC5B>
+<9ED1> <9ED1> <BADA>
+<9ED2> <9ED3> <FC5C>
+<9ED4> <9ED4> <C7AD>
+<9ED5> <9ED7> <FC5E>
+<9ED8> <9ED8> <C4AC>
+<9ED9> <9EDA> <FC61>
+<9EDB> <9EDD> <F7EC>
+<9EDE> <9EDE> <FC63>
+<9EDF> <9EDF> <F7F0>
+<9EE0> <9EE0> <F7EF>
+<9EE1> <9EE1> <FC64>
+<9EE2> <9EE2> <F7F1>
+<9EE3> <9EE4> <FC65>
+<9EE5> <9EE5> <F7F4>
+<9EE6> <9EE6> <FC67>
+<9EE7> <9EE7> <F7F3>
+<9EE8> <9EE8> <FC68>
+<9EE9> <9EE9> <F7F2>
+<9EEA> <9EEA> <F7F5>
+<9EEB> <9EEE> <FC69>
+<9EEF> <9EEF> <F7F6>
+<9EF0> <9EF8> <FC6D>
+<9EF9> <9EF9> <EDE9>
+<9EFA> <9EFA> <FC76>
+<9EFB> <9EFC> <EDEA>
+<9EFD> <9EFD> <FC77>
+<9EFE> <9EFE> <F6BC>
+<9EFF> <9EFF> <FC78>
+<9F00> <9F05> <FC79>
+<9F06> <9F0A> <FC80>
+<9F0B> <9F0B> <F6BD>
+<9F0C> <9F0C> <FC85>
+<9F0D> <9F0D> <F6BE>
+<9F0E> <9F0E> <B6A6>
+<9F0F> <9F0F> <FC86>
+<9F10> <9F10> <D8BE>
+<9F11> <9F12> <FC87>
+<9F13> <9F13> <B9C4>
+<9F14> <9F16> <FC89>
+<9F17> <9F17> <D8BB>
+<9F18> <9F18> <FC8C>
+<9F19> <9F19> <DCB1>
+<9F1A> <9F1F> <FC8D>
+<9F20> <9F20> <CAF3>
+<9F21> <9F21> <FC93>
+<9F22> <9F22> <F7F7>
+<9F23> <9F2B> <FC94>
+<9F2C> <9F2C> <F7F8>
+<9F2D> <9F2E> <FC9D>
+<9F2F> <9F2F> <F7F9>
+<9F30> <9F31> <FC9F>
+<9F32> <9F36> <FD40>
+<9F37> <9F37> <F7FB>
+<9F38> <9F38> <FD45>
+<9F39> <9F39> <F7FA>
+<9F3A> <9F3A> <FD46>
+<9F3B> <9F3B> <B1C7>
+<9F3C> <9F3C> <FD47>
+<9F3D> <9F3E> <F7FC>
+<9F3F> <9F43> <FD48>
+<9F44> <9F44> <F7FE>
+<9F45> <9F4F> <FD4D>
+<9F50> <9F50> <C6EB>
+<9F51> <9F51> <ECB4>
+<9F52> <9F78> <FD58>
+<9F79> <9F7E> <FD80>
+<9F7F> <9F7F> <B3DD>
+<9F80> <9F80> <F6B3>
+<9F81> <9F82> <FD86>
+<9F83> <9F83> <F6B4>
+<9F84> <9F84> <C1E4>
+<9F85> <9F8A> <F6B5>
+<9F8B> <9F8B> <C8A3>
+<9F8C> <9F8C> <F6BB>
+<9F8D> <9F98> <FD88>
+<9F99> <9F99> <C1FA>
+<9F9A> <9F9A> <B9A8>
+<9F9B> <9F9B> <EDE8>
+<9F9C> <9F9E> <FD94>
+<9F9F> <9F9F> <B9EA>
+<9FA0> <9FA0> <D9DF>
+<9FA1> <9FA5> <FD97>
+<E000> <E05D> <AAA1>
+<E05E> <E0BB> <ABA1>
+<E0BC> <E0FF> <ACA1>
+<E100> <E119> <ACE5>
+<E11A> <E177> <ADA1>
+endbfrange
+
+100 beginbfrange
+<E178> <E1D5> <AEA1>
+<E1D6> <E1FF> <AFA1>
+<E200> <E233> <AFCB>
+<E234> <E291> <F8A1>
+<E292> <E2EF> <F9A1>
+<E2F0> <E2FF> <FAA1>
+<E300> <E34D> <FAB1>
+<E34E> <E3AB> <FBA1>
+<E3AC> <E3FF> <FCA1>
+<E400> <E409> <FCF5>
+<E40A> <E467> <FDA1>
+<E468> <E4C5> <FEA1>
+<E4C6> <E4FF> <A140>
+<E500> <E504> <A17A>
+<E505> <E525> <A180>
+<E526> <E564> <A240>
+<E565> <E585> <A280>
+<E586> <E5C4> <A340>
+<E5C5> <E5E5> <A380>
+<E5E6> <E5FF> <A440>
+<E600> <E624> <A45A>
+<E625> <E645> <A480>
+<E646> <E684> <A540>
+<E685> <E6A5> <A580>
+<E6A6> <E6E4> <A640>
+<E6E5> <E6FF> <A680>
+<E700> <E705> <A69B>
+<E706> <E744> <A740>
+<E745> <E765> <A780>
+<E766> <E76B> <A2AB>
+<E76C> <E76D> <A2E3>
+<E76E> <E76F> <A2EF>
+<E770> <E771> <A2FD>
+<E772> <E77C> <A4F4>
+<E77D> <E784> <A5F7>
+<E785> <E78C> <A6B9>
+<E78D> <E793> <A6D9>
+<E794> <E795> <A6EC>
+<E796> <E796> <A6F3>
+<E797> <E79F> <A6F6>
+<E7A0> <E7AE> <A7C2>
+<E7AF> <E7BB> <A7F2>
+<E7BC> <E7C6> <A896>
+<E7C7> <E7C7> <A8BC>
+<E7C8> <E7C8> <A8BF>
+<E7C9> <E7CC> <A8C1>
+<E7CD> <E7E1> <A8EA>
+<E7E2> <E7E2> <A958>
+<E7E3> <E7E3> <A95B>
+<E7E4> <E7E6> <A95D>
+<E7E7> <E7F3> <A989>
+<E7F4> <E7FF> <A997>
+<E800> <E800> <A9A3>
+<E801> <E80F> <A9F0>
+<E810> <E814> <D7FA>
+<E815> <E843> <FE50>
+<E844> <E864> <FE80>
+<F8F5> <F8F5> <FF>
+<F900> <F900> <D84D>
+<F901> <F901> <B8FC>
+<F902> <F902> <DC87>
+<F903> <F903> <D95A>
+<F904> <F904> <BBAC>
+<F905> <F905> <B4AE>
+<F906> <F906> <BEE4>
+<F907> <F907> <FD94>
+<F908> <F908> <FD94>
+<F909> <F909> <C6F5>
+<F90A> <F90A> <BDF0>
+<F90B> <F90B> <C0AE>
+<F90C> <F90C> <C4CE>
+<F90D> <F90D> <91D0>
+<F90E> <F90E> <B05D>
+<F90F> <F90F> <C15F>
+<F910> <F910> <CC7D>
+<F911> <F911> <C2DD>
+<F912> <F912> <C2E3>
+<F913> <F913> <DF89>
+<F914> <F914> <98B7>
+<F915> <F915> <C2E5>
+<F916> <F916> <C0D3>
+<F917> <F917> <E7F3>
+<F918> <F918> <C2E4>
+<F919> <F919> <C0D2>
+<F91A> <F91A> <F198>
+<F91B> <F91B> <8179>
+<F91C> <F91C> <C2D1>
+<F91D> <F91D> <99DA>
+<F91E> <F91E> <A080>
+<F91F> <F91F> <CC6D>
+<F920> <F920> <FB5B>
+<F921> <F921> <8DB9>
+<F922> <F922> <9E45>
+<F923> <F923> <CB7B>
+<F924> <F924> <D268>
+<F925> <F925> <C0AD>
+<F926> <F926> <C544>
+<F927> <F927> <CF9E>
+<F928> <F928> <C0C8>
+<F929> <F92A> <C0CA>
+endbfrange
+
+100 beginbfrange
+<F92B> <F92B> <C0C7>
+<F92C> <F92C> <FD9C>
+<F92D> <F92D> <81ED>
+<F92E> <F92E> <C0E4>
+<F92F> <F92F> <84DA>
+<F930> <F930> <93EF>
+<F931> <F931> <99A9>
+<F932> <F932> <A074>
+<F933> <F933> <B152>
+<F934> <F934> <C0CF>
+<F935> <F935> <CC4A>
+<F936> <F936> <CC94>
+<F937> <F937> <C2B7>
+<F938> <F938> <C2B6>
+<F939> <F939> <F494>
+<F93A> <F93A> <FA98>
+<F93B> <F93B> <C2B5>
+<F93C> <F93C> <B593>
+<F93D> <F93D> <BE47>
+<F93E> <F93E> <C78A>
+<F93F> <F93F> <E49B>
+<F940> <F940> <C2B9>
+<F941> <F941> <D593>
+<F942> <F942> <89C5>
+<F943> <F943> <C5AA>
+<F944> <F944> <BB5C>
+<F945> <F945> <C340>
+<F946> <F946> <C0CE>
+<F947> <F947> <C0DA>
+<F948> <F948> <D954>
+<F949> <F949> <C0D7>
+<F94A> <F94A> <89BE>
+<F94B> <F94B> <8CD2>
+<F94C> <F94C> <98C7>
+<F94D> <F94D> <9C49>
+<F94E> <F94E> <C2A9>
+<F94F> <F94F> <C0DB>
+<F950> <F950> <BF7C>
+<F951> <F951> <C2AA>
+<F952> <F952> <C0D5>
+<F953> <F953> <C0DF>
+<F954> <F954> <8443>
+<F955> <F955> <C1E8>
+<F956> <F956> <B6A0>
+<F957> <F957> <BE63>
+<F958> <F958> <C1E2>
+<F959> <F959> <C1EA>
+<F95A> <F95A> <D778>
+<F95B> <F95B> <9282>
+<F95C> <F95C> <98B7>
+<F95D> <F95D> <D65A>
+<F95E> <F95E> <B5A4>
+<F95F> <F95F> <8C8E>
+<F960> <F960> <C5AD>
+<F961> <F961> <C2CA>
+<F962> <F962> <AE90>
+<F963> <F963> <B1B1>
+<F964> <F964> <B491>
+<F965> <F965> <B1E3>
+<F966> <F966> <8FCD>
+<F967> <F967> <B2BB>
+<F968> <F968> <C3DA>
+<F969> <F969> <94B5>
+<F96A> <F96A> <CBF7>
+<F96B> <F96B> <85A2>
+<F96C> <F96C> <C8FB>
+<F96D> <F96D> <CAA1>
+<F96E> <F96E> <C87E>
+<F96F> <F96F> <D566>
+<F970> <F970> <9AA2>
+<F971> <F971> <B3BD>
+<F972> <F972> <C9F2>
+<F973> <F973> <CAB0>
+<F974> <F974> <C8F4>
+<F975> <F976> <C2D3>
+<F977> <F977> <C1C1>
+<F978> <F978> <83C9>
+<F979> <F979> <FD9D>
+<F97A> <F97A> <C1BA>
+<F97B> <F97B> <BC5A>
+<F97C> <F97C> <C1BC>
+<F97D> <F97D> <D58F>
+<F97E> <F97E> <C1BF>
+<F97F> <F97F> <84EE>
+<F980> <F980> <85CE>
+<F981> <F981> <C5AE>
+<F982> <F982> <8F5D>
+<F983> <F983> <C2C3>
+<F984> <F984> <9E56>
+<F985> <F985> <B55A>
+<F986> <F986> <E982>
+<F987> <F987> <F350>
+<F988> <F988> <FB90>
+<F989> <F989> <C0E8>
+<F98A> <F98A> <C1A6>
+<F98B> <F98B> <95D1>
+<F98C> <F98C> <9A76>
+<F98D> <F98D> <DE5D>
+<F98E> <F98E> <C4EA>
+<F98F> <F98F> <917A>
+endbfrange
+
+100 beginbfrange
+<F990> <F990> <91D9>
+<F991> <F991> <93D3>
+<F992> <F992> <9D69>
+<F993> <F993> <9F92>
+<F994> <F994> <AD49>
+<F995> <F995> <FD9E>
+<F996> <F996> <BE9A>
+<F997> <F997> <C293>
+<F998> <F998> <DD82>
+<F999> <F999> <C98F>
+<F99A> <F99A> <DF42>
+<F99B> <F99B> <E580>
+<F99C> <F99C> <C1D0>
+<F99D> <F99D> <C1D3>
+<F99E> <F99E> <D1CA>
+<F99F> <F99F> <C1D2>
+<F9A0> <F9A0> <C1D1>
+<F9A1> <F9A1> <D566>
+<F9A2> <F9A2> <C1AE>
+<F9A3> <F9A3> <C4EE>
+<F9A4> <F9A4> <C4ED>
+<F9A5> <F9A5> <9A9A>
+<F9A6> <F9A6> <BA9F>
+<F9A7> <F9A7> <AB43>
+<F9A8> <F9A8> <C1EE>
+<F9A9> <F9A9> <E0F2>
+<F9AA> <F9AA> <8C8E>
+<F9AB> <F9AB> <8E58>
+<F9AC> <F9AC> <C1AF>
+<F9AD> <F9AD> <C1E1>
+<F9AE> <F9AE> <AC93>
+<F9AF> <F9AF> <C1E7>
+<F9B0> <F9B0> <F1F6>
+<F9B1> <F9B1> <E28F>
+<F9B2> <F9B2> <C1E3>
+<F9B3> <F9B3> <EC60>
+<F9B4> <F9B4> <EE49>
+<F9B5> <F9B5> <C0FD>
+<F9B6> <F9B6> <B659>
+<F9B7> <F9B7> <F5B7>
+<F9B8> <F9B8> <EB60>
+<F9B9> <F9B9> <90BA>
+<F9BA> <F9BA> <C1CB>
+<F9BB> <F9BB> <C1C5>
+<F9BC> <F9BC> <E5BC>
+<F9BD> <F9BD> <C4F2>
+<F9BE> <F9BE> <C1CF>
+<F9BF> <F9BF> <98B7>
+<F9C0> <F9C0> <C1C7>
+<F9C1> <F9C1> <AF9F>
+<F9C2> <F9C2> <DEA4>
+<F9C3> <F9C3> <DF7C>
+<F9C4> <F9C4> <FD88>
+<F9C5> <F9C5> <959E>
+<F9C6> <F9C6> <C8EE>
+<F9C7> <F9C7> <84A2>
+<F9C8> <F9C8> <9683>
+<F9C9> <F9C9> <C1F8>
+<F9CA> <F9CA> <C1F7>
+<F9CB> <F9CC> <C1EF>
+<F9CD> <F9CD> <C1F4>
+<F9CE> <F9CE> <C1F2>
+<F9CF> <F9CF> <BC7E>
+<F9D0> <F9D0> <EE90>
+<F9D1> <F9D1> <C1F9>
+<F9D2> <F9D2> <C2BE>
+<F9D3> <F9D3> <EA91>
+<F9D4> <F9D4> <8290>
+<F9D5> <F9D5> <8D91>
+<F9D6> <F9D6> <9C53>
+<F9D7> <F9D7> <DD86>
+<F9D8> <F9D8> <C2C9>
+<F9D9> <F9D9> <90FC>
+<F9DA> <F9DA> <C0F5>
+<F9DB> <F9DB> <C2CA>
+<F9DC> <F9DC> <C2A1>
+<F9DD> <F9DD> <C0FB>
+<F9DE> <F9DE> <C0F4>
+<F9DF> <F9DF> <C2C4>
+<F9E0> <F9E0> <D2D7>
+<F9E1> <F9E1> <C0EE>
+<F9E2> <F9E2> <C0E6>
+<F9E3> <F9E3> <C4E0>
+<F9E4> <F9E4> <C0ED>
+<F9E5> <F9E5> <C1A1>
+<F9E6> <F9E6> <EEBE>
+<F9E7> <F9E7> <FD9F>
+<F9E8> <F9E8> <D165>
+<F9E9> <F9E9> <C0EF>
+<F9EA> <F9EA> <EB78>
+<F9EB> <F9EB> <C4E4>
+<F9EC> <F9EC> <C4E7>
+<F9ED> <F9ED> <C1DF>
+<F9EE> <F9EE> <9FFB>
+<F9EF> <F9EF> <AD55>
+<F9F0> <F9F0> <CC41>
+<F9F1> <F9F1> <FDA0>
+<F9F2> <F9F2> <F75B>
+<F9F3> <F9F3> <F7EB>
+<F9F4> <F9F4> <C1D6>
+endbfrange
+
+72 beginbfrange
+<F9F5> <F9F5> <C1DC>
+<F9F6> <F9F6> <C552>
+<F9F7> <F9F7> <C1A2>
+<F9F8> <F9F8> <F3D2>
+<F9F9> <F9F9> <C1A3>
+<F9FA> <F9FA> <A0EE>
+<F9FB> <F9FB> <D6CB>
+<F9FC> <F9FC> <D752>
+<F9FD> <F9FD> <CAB2>
+<F9FE> <F9FE> <B2E8>
+<F9FF> <F9FF> <B4CC>
+<FA00> <FA00> <C7D0>
+<FA01> <FA01> <B6C8>
+<FA02> <FA02> <CDD8>
+<FA03> <FA03> <CCC7>
+<FA04> <FA04> <D5AC>
+<FA05> <FA05> <B6B4>
+<FA06> <FA06> <B1A9>
+<FA07> <FA07> <DD97>
+<FA08> <FA08> <D0D0>
+<FA09> <FA09> <BDB5>
+<FA0A> <FA0A> <D28A>
+<FA0B> <FA0B> <C0AA>
+<FA0C> <FA0F> <FE40>
+<FA10> <FA10> <8956>
+<FA11> <FA11> <FE44>
+<FA12> <FA12> <C7E7>
+<FA13> <FA14> <FE45>
+<FA15> <FA15> <8444>
+<FA16> <FA16> <D869>
+<FA17> <FA17> <D2E6>
+<FA18> <FA18> <FE47>
+<FA19> <FA19> <C9F1>
+<FA1A> <FA1A> <CFE9>
+<FA1B> <FA1B> <B8A3>
+<FA1C> <FA1C> <BEB8>
+<FA1D> <FA1D> <BEAB>
+<FA1E> <FA1E> <D3F0>
+<FA1F> <FA21> <FE48>
+<FA22> <FA22> <D654>
+<FA23> <FA24> <FE4B>
+<FA25> <FA25> <D2DD>
+<FA26> <FA26> <B6BC>
+<FA27> <FA29> <FE4D>
+<FA2A> <FA2A> <EF88>
+<FA2B> <FA2B> <EF95>
+<FA2C> <FA2C> <F05E>
+<FA2D> <FA2D> <FA51>
+<FE30> <FE30> <A955>
+<FE31> <FE31> <A6F2>
+<FE33> <FE34> <A6F4>
+<FE35> <FE36> <A6E0>
+<FE37> <FE38> <A6F0>
+<FE39> <FE3A> <A6E2>
+<FE3B> <FE3C> <A6EE>
+<FE3D> <FE3E> <A6E6>
+<FE3F> <FE40> <A6E4>
+<FE41> <FE44> <A6E8>
+<FE49> <FE52> <A968>
+<FE54> <FE57> <A972>
+<FE59> <FE61> <A976>
+<FE62> <FE66> <A980>
+<FE68> <FE6B> <A985>
+<FF01> <FF03> <A3A1>
+<FF04> <FF04> <A1E7>
+<FF05> <FF5D> <A3A5>
+<FF5E> <FF5E> <A1AB>
+<FFE0> <FFE1> <A1E9>
+<FFE2> <FFE2> <A956>
+<FFE3> <FFE3> <A3FE>
+<FFE4> <FFE4> <A957>
+<FFE5> <FFE5> <A3A4>
+endbfrange
+
+endcmap
+CMapName currentdict /CMap defineresource pop
+end
+end
+
+%%EndResource
+%%EOF
diff --git a/src/main/resources/Resources/cmap/UCS2-GBpc-EUC b/src/main/resources/Resources/cmap/UCS2-GBpc-EUC
new file mode 100644
index 0000000..219f94f
--- /dev/null
+++ b/src/main/resources/Resources/cmap/UCS2-GBpc-EUC
@@ -0,0 +1,9098 @@
+%!PS-Adobe-3.0 Resource-CMap
+%%DocumentNeededResources: ProcSet (CIDInit)
+%%IncludeResource: ProcSet (CIDInit)
+%%BeginResource: CMap (UCS2-GBpc-EUC)
+%%Title: (UCS2-GBpc-EUC)
+%%Version: 4.002
+%%Copyright: -----------------------------------------------------------
+%%Copyright: Copyright 1990-1999 Adobe Systems Incorporated.
+%%Copyright: All Rights Reserved.
+%%Copyright:
+%%Copyright: Patents Pending
+%%Copyright:
+%%Copyright: NOTICE: All information contained herein is the property
+%%Copyright: of Adobe Systems Incorporated.
+%%Copyright:
+%%Copyright: Permission is granted for redistribution of this file
+%%Copyright: provided this copyright notice is maintained intact and
+%%Copyright: that the contents of this file are not altered in any
+%%Copyright: way from its original form.
+%%Copyright:
+%%Copyright: PostScript and Display PostScript are trademarks of
+%%Copyright: Adobe Systems Incorporated which may be registered in
+%%Copyright: certain jurisdictions.
+%%Copyright: -----------------------------------------------------------
+%%EndComments
+
+/CIDInit /ProcSet findresource begin
+
+12 dict begin
+
+begincmap
+
+/CIDSystemInfo 3 dict dup begin
+ /Registry (Adobe) def
+ /Ordering (UCS2_GBpc_EUC) def
+ /Supplement 2 def
+end def
+
+/CMapName /UCS2-GBpc-EUC def
+/CMapVersion 4.002 def
+/CMapType 1 def
+/WMode 0 def
+
+1 begincodespacerange
+<0000> <FFFF>
+endcodespacerange
+
+100 beginbfrange
+<0000> <007F> <00>
+<0083> <00A0> <83>
+<00A2> <00A3> <A1E9>
+<00A4> <00A4> <A1E8>
+<00A5> <00A5> <A3A4>
+<00A7> <00A7> <A1EC>
+<00A8> <00A8> <A1A7>
+<00A9> <00A9> <FD>
+<00AD> <00AD> <A3AD>
+<00B0> <00B0> <A1E3>
+<00B1> <00B1> <A1C0>
+<00B7> <00B7> <A1A4>
+<00D7> <00D7> <A1C1>
+<00E0> <00E0> <A8A4>
+<00E1> <00E1> <A8A2>
+<00E8> <00E8> <A8A8>
+<00E9> <00E9> <A8A6>
+<00EA> <00EA> <A8BA>
+<00EC> <00EC> <A8AC>
+<00ED> <00ED> <A8AA>
+<00F2> <00F2> <A8B0>
+<00F3> <00F3> <A8AE>
+<00F7> <00F7> <A1C2>
+<00F9> <00F9> <A8B4>
+<00FA> <00FA> <A8B2>
+<00FC> <00FC> <A8B9>
+<0101> <0101> <A8A1>
+<0113> <0113> <A8A5>
+<011B> <011B> <A8A7>
+<012B> <012B> <A8A9>
+<0144> <0144> <A8BD>
+<0148> <0148> <A8BE>
+<014D> <014D> <A8AD>
+<016B> <016B> <A8B1>
+<01CE> <01CE> <A8A3>
+<01D0> <01D0> <A8AB>
+<01D2> <01D2> <A8AF>
+<01D4> <01D4> <A8B3>
+<01D6> <01D6> <A8B5>
+<01D8> <01D8> <A8B6>
+<01DA> <01DA> <A8B7>
+<01DC> <01DC> <A8B8>
+<0251> <0251> <A8BB>
+<0261> <0261> <A8C0>
+<02C7> <02C7> <A1A6>
+<02C9> <02C9> <A1A5>
+<02D0> <02D0> <A1C3>
+<0391> <03A1> <A6A1>
+<03A3> <03A9> <A6B2>
+<03B1> <03C1> <A6C1>
+<03C3> <03C9> <A6D2>
+<0401> <0401> <A7A7>
+<0410> <0415> <A7A1>
+<0416> <042F> <A7A8>
+<0430> <0435> <A7D1>
+<0436> <044F> <A7D8>
+<0451> <0451> <A7D7>
+<1E3F> <1E3F> <A8BC>
+<2010> <2010> <A3AD>
+<2013> <2013> <A3AD>
+<2014> <2014> <A1AA>
+<2016> <2016> <A1AC>
+<2018> <2019> <A1AE>
+<201C> <201D> <A1B0>
+<2022> <2022> <A1A4>
+<2026> <2026> <A1AD>
+<2027> <2027> <A1A4>
+<2030> <2030> <A1EB>
+<2032> <2033> <A1E4>
+<203B> <203B> <A1F9>
+<203E> <203E> <A3FE>
+<2103> <2103> <A1E6>
+<2116> <2116> <A1ED>
+<2122> <2122> <FE>
+<2160> <216B> <A2F1>
+<2190> <2191> <A1FB>
+<2192> <2192> <A1FA>
+<2193> <2193> <A1FD>
+<2208> <2208> <A1CA>
+<220F> <220F> <A1C7>
+<2211> <2211> <A1C6>
+<221A> <221A> <A1CC>
+<221D> <221D> <A1D8>
+<221E> <221E> <A1DE>
+<2220> <2220> <A1CF>
+<2225> <2225> <A1CE>
+<2227> <2228> <A1C4>
+<2229> <2229> <A1C9>
+<222A> <222A> <A1C8>
+<222B> <222B> <A1D2>
+<222E> <222E> <A1D3>
+<2234> <2234> <A1E0>
+<2235> <2235> <A1DF>
+<2236> <2236> <A1C3>
+<2237> <2237> <A1CB>
+<223C> <223C> <A1AB>
+<223D> <223D> <A1D7>
+<2248> <2248> <A1D6>
+<224C> <224C> <A1D5>
+<2260> <2260> <A1D9>
+endbfrange
+
+100 beginbfrange
+<2261> <2261> <A1D4>
+<2264> <2265> <A1DC>
+<226E> <226F> <A1DA>
+<2299> <2299> <A1D1>
+<22A5> <22A5> <A1CD>
+<22EF> <22EF> <A1AD>
+<2312> <2312> <A1D0>
+<2460> <2469> <A2D9>
+<2474> <2487> <A2C5>
+<2488> <249B> <A2B1>
+<2500> <254B> <A9A4>
+<2595> <2595> <A3FC>
+<25A0> <25A0> <A1F6>
+<25A1> <25A1> <A1F5>
+<25B2> <25B2> <A1F8>
+<25B3> <25B3> <A1F7>
+<25C6> <25C6> <A1F4>
+<25C7> <25C7> <A1F3>
+<25C9> <25C9> <A1D1>
+<25CB> <25CB> <A1F0>
+<25CE> <25CE> <A1F2>
+<25CF> <25CF> <A1F1>
+<2605> <2605> <A1EF>
+<2606> <2606> <A1EE>
+<2609> <2609> <A1D1>
+<2640> <2640> <A1E2>
+<2642> <2642> <A1E1>
+<3000> <3002> <A1A1>
+<3003> <3003> <A1A8>
+<3005> <3005> <A1A9>
+<3008> <300F> <A1B4>
+<3010> <3011> <A1BE>
+<3013> <3013> <A1FE>
+<3014> <3015> <A1B2>
+<3016> <3017> <A1BC>
+<301C> <301C> <A1AB>
+<3041> <3093> <A4A1>
+<30A1> <30F6> <A5A1>
+<3105> <3129> <A8C5>
+<3220> <3229> <A2E5>
+<4E00> <4E00> <D2BB>
+<4E01> <4E01> <B6A1>
+<4E03> <4E03> <C6DF>
+<4E07> <4E07> <CDF2>
+<4E08> <4E08> <D5C9>
+<4E09> <4E09> <C8FD>
+<4E0A> <4E0A> <C9CF>
+<4E0B> <4E0B> <CFC2>
+<4E0C> <4E0C> <D8A2>
+<4E0D> <4E0D> <B2BB>
+<4E0E> <4E0E> <D3EB>
+<4E10> <4E10> <D8A4>
+<4E11> <4E11> <B3F3>
+<4E13> <4E13> <D7A8>
+<4E14> <4E14> <C7D2>
+<4E15> <4E15> <D8A7>
+<4E16> <4E16> <CAC0>
+<4E18> <4E18> <C7F0>
+<4E19> <4E19> <B1FB>
+<4E1A> <4E1A> <D2B5>
+<4E1B> <4E1B> <B4D4>
+<4E1C> <4E1C> <B6AB>
+<4E1D> <4E1D> <CBBF>
+<4E1E> <4E1E> <D8A9>
+<4E22> <4E22> <B6AA>
+<4E24> <4E24> <C1BD>
+<4E25> <4E25> <D1CF>
+<4E27> <4E27> <C9A5>
+<4E28> <4E28> <D8AD>
+<4E2A> <4E2A> <B8F6>
+<4E2B> <4E2B> <D1BE>
+<4E2C> <4E2C> <E3DC>
+<4E2D> <4E2D> <D6D0>
+<4E30> <4E30> <B7E1>
+<4E32> <4E32> <B4AE>
+<4E34> <4E34> <C1D9>
+<4E36> <4E36> <D8BC>
+<4E38> <4E38> <CDE8>
+<4E39> <4E39> <B5A4>
+<4E3A> <4E3A> <CEAA>
+<4E3B> <4E3B> <D6F7>
+<4E3D> <4E3D> <C0F6>
+<4E3E> <4E3E> <BED9>
+<4E3F> <4E3F> <D8AF>
+<4E43> <4E43> <C4CB>
+<4E45> <4E45> <BEC3>
+<4E47> <4E47> <D8B1>
+<4E48> <4E48> <C3B4>
+<4E49> <4E49> <D2E5>
+<4E4B> <4E4B> <D6AE>
+<4E4C> <4E4C> <CEDA>
+<4E4D> <4E4D> <D5A7>
+<4E4E> <4E4E> <BAF5>
+<4E4F> <4E4F> <B7A6>
+<4E50> <4E50> <C0D6>
+<4E52> <4E52> <C6B9>
+<4E53> <4E53> <C5D2>
+<4E54> <4E54> <C7C7>
+<4E56> <4E56> <B9D4>
+<4E58> <4E58> <B3CB>
+endbfrange
+
+100 beginbfrange
+<4E59> <4E59> <D2D2>
+<4E5C> <4E5C> <D8BF>
+<4E5D> <4E5D> <BEC5>
+<4E5E> <4E5E> <C6F2>
+<4E5F> <4E5F> <D2B2>
+<4E60> <4E60> <CFB0>
+<4E61> <4E61> <CFE7>
+<4E66> <4E66> <CAE9>
+<4E69> <4E69> <D8C0>
+<4E70> <4E70> <C2F2>
+<4E71> <4E71> <C2D2>
+<4E73> <4E73> <C8E9>
+<4E7E> <4E7E> <C7AC>
+<4E82> <4E82> <C2D2>
+<4E86> <4E86> <C1CB>
+<4E88> <4E88> <D3E8>
+<4E89> <4E89> <D5F9>
+<4E8B> <4E8B> <CAC2>
+<4E8C> <4E8C> <B6FE>
+<4E8D> <4E8D> <D8A1>
+<4E8E> <4E8E> <D3DA>
+<4E8F> <4E8F> <BFF7>
+<4E91> <4E91> <D4C6>
+<4E92> <4E92> <BBA5>
+<4E93> <4E93> <D8C1>
+<4E94> <4E94> <CEE5>
+<4E95> <4E95> <BEAE>
+<4E98> <4E98> <D8A8>
+<4E9A> <4E9A> <D1C7>
+<4E9B> <4E9B> <D0A9>
+<4E9E> <4E9E> <D1C7>
+<4E9F> <4E9F> <D8BD>
+<4EA0> <4EA0> <D9EF>
+<4EA1> <4EA1> <CDF6>
+<4EA2> <4EA2> <BFBA>
+<4EA4> <4EA4> <BDBB>
+<4EA5> <4EA5> <BAA5>
+<4EA6> <4EA6> <D2E0>
+<4EA7> <4EA7> <B2FA>
+<4EA8> <4EA8> <BAE0>
+<4EA9> <4EA9> <C4B6>
+<4EAB> <4EAB> <CFED>
+<4EAC> <4EAC> <BEA9>
+<4EAD> <4EAD> <CDA4>
+<4EAE> <4EAE> <C1C1>
+<4EB2> <4EB2> <C7D7>
+<4EB3> <4EB3> <D9F1>
+<4EB5> <4EB5> <D9F4>
+<4EBA> <4EBA> <C8CB>
+<4EBB> <4EBB> <D8E9>
+<4EBF> <4EBF> <D2DA>
+<4EC0> <4EC0> <CAB2>
+<4EC1> <4EC1> <C8CA>
+<4EC2> <4EC2> <D8EC>
+<4EC3> <4EC3> <D8EA>
+<4EC4> <4EC4> <D8C6>
+<4EC5> <4EC5> <BDF6>
+<4EC6> <4EC6> <C6CD>
+<4EC7> <4EC7> <B3F0>
+<4EC9> <4EC9> <D8EB>
+<4ECA> <4ECA> <BDF1>
+<4ECB> <4ECB> <BDE9>
+<4ECD> <4ECD> <C8D4>
+<4ECE> <4ECE> <B4D3>
+<4ED1> <4ED1> <C2D8>
+<4ED3> <4ED3> <B2D6>
+<4ED4> <4ED4> <D7D0>
+<4ED5> <4ED5> <CACB>
+<4ED6> <4ED6> <CBFB>
+<4ED7> <4ED7> <D5CC>
+<4ED8> <4ED8> <B8B6>
+<4ED9> <4ED9> <CFC9>
+<4EDD> <4EDD> <D9DA>
+<4EDE> <4EDE> <D8F0>
+<4EDF> <4EDF> <C7AA>
+<4EE1> <4EE1> <D8EE>
+<4EE3> <4EE3> <B4FA>
+<4EE4> <4EE4> <C1EE>
+<4EE5> <4EE5> <D2D4>
+<4EE8> <4EE8> <D8ED>
+<4EEA> <4EEA> <D2C7>
+<4EEB> <4EEB> <D8EF>
+<4EEC> <4EEC> <C3C7>
+<4EF0> <4EF0> <D1F6>
+<4EF2> <4EF2> <D6D9>
+<4EF3> <4EF3> <D8F2>
+<4EF5> <4EF5> <D8F5>
+<4EF6> <4EF6> <BCFE>
+<4EF7> <4EF7> <BCDB>
+<4EFB> <4EFB> <C8CE>
+<4EFD> <4EFD> <B7DD>
+<4EFF> <4EFF> <B7C2>
+<4F01> <4F01> <C6F3>
+<4F09> <4F09> <D8F8>
+<4F0A> <4F0A> <D2C1>
+<4F0D> <4F0D> <CEE9>
+<4F0E> <4F0E> <BCBF>
+<4F0F> <4F0F> <B7FC>
+<4F10> <4F10> <B7A5>
+<4F11> <4F11> <D0DD>
+endbfrange
+
+100 beginbfrange
+<4F17> <4F17> <D6DA>
+<4F18> <4F18> <D3C5>
+<4F19> <4F19> <BBEF>
+<4F1A> <4F1A> <BBE1>
+<4F1B> <4F1B> <D8F1>
+<4F1E> <4F1E> <C9A1>
+<4F1F> <4F1F> <CEB0>
+<4F20> <4F20> <B4AB>
+<4F22> <4F22> <D8F3>
+<4F24> <4F24> <C9CB>
+<4F25> <4F25> <D8F6>
+<4F26> <4F26> <C2D7>
+<4F27> <4F27> <D8F7>
+<4F2A> <4F2A> <CEB1>
+<4F2B> <4F2B> <D8F9>
+<4F2F> <4F2F> <B2AE>
+<4F30> <4F30> <B9C0>
+<4F32> <4F32> <D9A3>
+<4F34> <4F34> <B0E9>
+<4F36> <4F36> <C1E6>
+<4F38> <4F38> <C9EC>
+<4F3A> <4F3A> <CBC5>
+<4F3C> <4F3C> <CBC6>
+<4F3D> <4F3D> <D9A4>
+<4F43> <4F43> <B5E8>
+<4F46> <4F46> <B5AB>
+<4F4D> <4F4D> <CEBB>
+<4F4E> <4F4E> <B5CD>
+<4F4F> <4F4F> <D7A1>
+<4F50> <4F50> <D7F4>
+<4F51> <4F51> <D3D3>
+<4F53> <4F53> <CCE5>
+<4F55> <4F55> <BACE>
+<4F57> <4F57> <D9A2>
+<4F58> <4F58> <D9DC>
+<4F59> <4F59> <D3E0>
+<4F5A> <4F5A> <D8FD>
+<4F5B> <4F5B> <B7F0>
+<4F5C> <4F5C> <D7F7>
+<4F5D> <4F5D> <D8FE>
+<4F5E> <4F5E> <D8FA>
+<4F5F> <4F5F> <D9A1>
+<4F60> <4F60> <C4E3>
+<4F63> <4F63> <D3B6>
+<4F64> <4F64> <D8F4>
+<4F65> <4F65> <D9DD>
+<4F67> <4F67> <D8FB>
+<4F69> <4F69> <C5E5>
+<4F6C> <4F6C> <C0D0>
+<4F6F> <4F6F> <D1F0>
+<4F70> <4F70> <B0DB>
+<4F73> <4F73> <BCD1>
+<4F74> <4F74> <D9A6>
+<4F76> <4F76> <D9A5>
+<4F7B> <4F7B> <D9AC>
+<4F7C> <4F7C> <D9AE>
+<4F7E> <4F7E> <D9AB>
+<4F7F> <4F7F> <CAB9>
+<4F83> <4F83> <D9A9>
+<4F84> <4F84> <D6B6>
+<4F86> <4F86> <C0B4>
+<4F88> <4F88> <B3DE>
+<4F89> <4F89> <D9A8>
+<4F8B> <4F8B> <C0FD>
+<4F8D> <4F8D> <CACC>
+<4F8F> <4F8F> <D9AA>
+<4F91> <4F91> <D9A7>
+<4F94> <4F94> <D9B0>
+<4F96> <4F96> <C2D8>
+<4F97> <4F97> <B6B1>
+<4F9B> <4F9B> <B9A9>
+<4F9D> <4F9D> <D2C0>
+<4FA0> <4FA0> <CFC0>
+<4FA3> <4FA3> <C2C2>
+<4FA5> <4FA5> <BDC4>
+<4FA6> <4FA6> <D5EC>
+<4FA7> <4FA7> <B2E0>
+<4FA8> <4FA8> <C7C8>
+<4FA9> <4FA9> <BFEB>
+<4FAA> <4FAA> <D9AD>
+<4FAC> <4FAC> <D9AF>
+<4FAE> <4FAE> <CEEA>
+<4FAF> <4FAF> <BAEE>
+<4FB5> <4FB5> <C7D6>
+<4FBF> <4FBF> <B1E3>
+<4FC2> <4FC2> <CFB5>
+<4FC3> <4FC3> <B4D9>
+<4FC4> <4FC4> <B6ED>
+<4FC5> <4FC5> <D9B4>
+<4FCA> <4FCA> <BFA1>
+<4FCE> <4FCE> <D9DE>
+<4FCF> <4FCF> <C7CE>
+<4FD0> <4FD0> <C0FE>
+<4FD1> <4FD1> <D9B8>
+<4FD7> <4FD7> <CBD7>
+<4FD8> <4FD8> <B7FD>
+<4FDA> <4FDA> <D9B5>
+<4FDC> <4FDC> <D9B7>
+<4FDD> <4FDD> <B1A3>
+<4FDE> <4FDE> <D3E1>
+endbfrange
+
+100 beginbfrange
+<4FDF> <4FDF> <D9B9>
+<4FE0> <4FE0> <CFC0>
+<4FE1> <4FE1> <D0C5>
+<4FE3> <4FE3> <D9B6>
+<4FE6> <4FE6> <D9B1>
+<4FE8> <4FE8> <D9B2>
+<4FE9> <4FE9> <C1A9>
+<4FEA> <4FEA> <D9B3>
+<4FED> <4FED> <BCF3>
+<4FEE> <4FEE> <D0DE>
+<4FEF> <4FEF> <B8A9>
+<4FF1> <4FF1> <BEE3>
+<4FF3> <4FF3> <D9BD>
+<4FF8> <4FF8> <D9BA>
+<4FFA> <4FFA> <B0B3>
+<4FFE> <4FFE> <D9C2>
+<5000> <5000> <D8F6>
+<5006> <5006> <C1A9>
+<5009> <5009> <B2D6>
+<500B> <500B> <B8F6>
+<500C> <500C> <D9C4>
+<500D> <500D> <B1B6>
+<500F> <500F> <D9BF>
+<5011> <5011> <C3C7>
+<5012> <5012> <B5B9>
+<5014> <5014> <BEF3>
+<5018> <5018> <CCC8>
+<5019> <5019> <BAF2>
+<501A> <501A> <D2D0>
+<501C> <501C> <D9C3>
+<501F> <501F> <BDE8>
+<5021> <5021> <B3AB>
+<5025> <5025> <D9C5>
+<5026> <5026> <BEEB>
+<5028> <5028> <D9C6>
+<5029> <5029> <D9BB>
+<502A> <502A> <C4DF>
+<502B> <502B> <C2D7>
+<502C> <502C> <D9BE>
+<502D> <502D> <D9C1>
+<502E> <502E> <D9C0>
+<503A> <503A> <D5AE>
+<503C> <503C> <D6B5>
+<503E> <503E> <C7E3>
+<5043> <5043> <D9C8>
+<5047> <5047> <BCD9>
+<5048> <5048> <D9CA>
+<5049> <5049> <CEB0>
+<504C> <504C> <D9BC>
+<504E> <504E> <D9CB>
+<504F> <504F> <C6AB>
+<5055> <5055> <D9C9>
+<505A> <505A> <D7F6>
+<505C> <505C> <CDA3>
+<5065> <5065> <BDA1>
+<506C> <506C> <D9CC>
+<5074> <5074> <B2E0>
+<5075> <5075> <D5EC>
+<5076> <5076> <C5BC>
+<5077> <5077> <CDB5>
+<507B> <507B> <D9CD>
+<507E> <507E> <D9C7>
+<507F> <507F> <B3A5>
+<5080> <5080> <BFFE>
+<5085> <5085> <B8B5>
+<5088> <5088> <C0FC>
+<508D> <508D> <B0F8>
+<5096> <5096> <D8F7>
+<5098> <5098> <C9A1>
+<5099> <5099> <B1B8>
+<50A2> <50A2> <BCD2>
+<50A3> <50A3> <B4F6>
+<50A5> <50A5> <D9CE>
+<50A7> <50A7> <D9CF>
+<50A8> <50A8> <B4A2>
+<50A9> <50A9> <D9D0>
+<50AC> <50AC> <B4DF>
+<50AD> <50AD> <D3B6>
+<50B2> <50B2> <B0C1>
+<50B3> <50B3> <B4AB>
+<50B4> <50B4> <D8F1>
+<50B5> <50B5> <D5AE>
+<50B7> <50B7> <C9CB>
+<50BA> <50BA> <D9D1>
+<50BB> <50BB> <C9B5>
+<50BE> <50BE> <C7E3>
+<50C2> <50C2> <D9CD>
+<50C5> <50C5> <BDF6>
+<50C9> <50C9> <D9DD>
+<50CF> <50CF> <CFF1>
+<50D1> <50D1> <C7C8>
+<50D5> <50D5> <C6CD>
+<50D6> <50D6> <D9D2>
+<50DA> <50DA> <C1C5>
+<50DE> <50DE> <CEB1>
+<50E5> <50E5> <BDC4>
+<50E6> <50E6> <D9D6>
+<50E7> <50E7> <C9AE>
+<50E8> <50E8> <D9C7>
+<50EC> <50EC> <D9D5>
+endbfrange
+
+100 beginbfrange
+<50ED> <50ED> <D9D4>
+<50EE> <50EE> <D9D7>
+<50F3> <50F3> <CBDB>
+<50F5> <50F5> <BDA9>
+<50F9> <50F9> <BCDB>
+<50FB> <50FB> <C6A7>
+<5100> <5100> <D2C7>
+<5102> <5102> <D9AF>
+<5104> <5104> <D2DA>
+<5106> <5106> <D9D3>
+<5107> <5107> <D9D8>
+<5108> <5108> <BFEB>
+<5109> <5109> <BCF3>
+<510B> <510B> <D9D9>
+<5110> <5110> <D9CF>
+<5112> <5112> <C8E5>
+<5114> <5114> <D9B1>
+<5115> <5115> <D9AD>
+<5118> <5118> <BEA1>
+<511F> <511F> <B3A5>
+<5121> <5121> <C0DC>
+<512A> <512A> <D3C5>
+<5132> <5132> <B4A2>
+<5137> <5137> <D9B3>
+<513A> <513A> <D9D0>
+<513B> <513B> <D9CE>
+<513C> <513C> <D9B2>
+<513F> <513F> <B6F9>
+<5140> <5140> <D8A3>
+<5141> <5141> <D4CA>
+<5143> <5143> <D4AA>
+<5144> <5144> <D0D6>
+<5145> <5145> <B3E4>
+<5146> <5146> <D5D7>
+<5148> <5148> <CFC8>
+<5149> <5149> <B9E2>
+<514B> <514B> <BFCB>
+<514D> <514D> <C3E2>
+<5151> <5151> <B6D2>
+<5152> <5152> <B6F9>
+<5154> <5154> <CDC3>
+<5155> <5155> <D9EE>
+<5156> <5156> <D9F0>
+<515A> <515A> <B5B3>
+<515C> <515C> <B6B5>
+<5162> <5162> <BEA4>
+<5165> <5165> <C8EB>
+<5168> <5168> <C8AB>
+<5169> <5169> <C1BD>
+<516B> <516B> <B0CB>
+<516C> <516C> <B9AB>
+<516D> <516D> <C1F9>
+<516E> <516E> <D9E2>
+<5170> <5170> <C0BC>
+<5171> <5171> <B9B2>
+<5173> <5173> <B9D8>
+<5174> <5174> <D0CB>
+<5175> <5175> <B1F8>
+<5176> <5176> <C6E4>
+<5177> <5177> <BEDF>
+<5178> <5178> <B5E4>
+<5179> <5179> <D7C8>
+<517B> <517B> <D1F8>
+<517C> <517C> <BCE6>
+<517D> <517D> <CADE>
+<5180> <5180> <BCBD>
+<5181> <5181> <D9E6>
+<5182> <5182> <D8E7>
+<5185> <5185> <C4DA>
+<5188> <5188> <B8D4>
+<5189> <5189> <C8BD>
+<518C> <518C> <B2E1>
+<518D> <518D> <D4D9>
+<5192> <5192> <C3B0>
+<5195> <5195> <C3E1>
+<5196> <5196> <DAA2>
+<5197> <5197> <C8DF>
+<5199> <5199> <D0B4>
+<519B> <519B> <BEFC>
+<519C> <519C> <C5A9>
+<51A0> <51A0> <B9DA>
+<51A2> <51A2> <DAA3>
+<51A4> <51A4> <D4A9>
+<51A5> <51A5> <DAA4>
+<51AB> <51AB> <D9FB>
+<51AC> <51AC> <B6AC>
+<51AF> <51AF> <B7EB>
+<51B0> <51B0> <B1F9>
+<51B1> <51B1> <D9FC>
+<51B2> <51B2> <B3E5>
+<51B3> <51B3> <BEF6>
+<51B5> <51B5> <BFF6>
+<51B6> <51B6> <D2B1>
+<51B7> <51B7> <C0E4>
+<51BB> <51BB> <B6B3>
+<51BC> <51BC> <D9FE>
+<51BD> <51BD> <D9FD>
+<51C0> <51C0> <BEBB>
+<51C4> <51C4> <C6E0>
+<51C6> <51C6> <D7BC>
+endbfrange
+
+100 beginbfrange
+<51C7> <51C7> <DAA1>
+<51C9> <51C9> <C1B9>
+<51CB> <51CB> <B5F2>
+<51CC> <51CC> <C1E8>
+<51CD> <51CD> <B6B3>
+<51CF> <51CF> <BCF5>
+<51D1> <51D1> <B4D5>
+<51DB> <51DB> <C1DD>
+<51DD> <51DD> <C4FD>
+<51E0> <51E0> <BCB8>
+<51E1> <51E1> <B7B2>
+<51E4> <51E4> <B7EF>
+<51EB> <51EB> <D9EC>
+<51ED> <51ED> <C6BE>
+<51EF> <51EF> <BFAD>
+<51F0> <51F0> <BBCB>
+<51F1> <51F1> <BFAD>
+<51F3> <51F3> <B5CA>
+<51F5> <51F5> <DBC9>
+<51F6> <51F6> <D0D7>
+<51F8> <51F8> <CDB9>
+<51F9> <51F9> <B0BC>
+<51FA> <51FA> <B3F6>
+<51FB> <51FB> <BBF7>
+<51FC> <51FC> <DBCA>
+<51FD> <51FD> <BAAF>
+<51FF> <51FF> <D4E4>
+<5200> <5200> <B5B6>
+<5201> <5201> <B5F3>
+<5202> <5202> <D8D6>
+<5203> <5203> <C8D0>
+<5206> <5206> <B7D6>
+<5207> <5207> <C7D0>
+<5208> <5208> <D8D7>
+<520A> <520A> <BFAF>
+<520D> <520D> <DBBB>
+<520E> <520E> <D8D8>
+<5211> <5211> <D0CC>
+<5212> <5212> <BBAE>
+<5216> <5216> <EBBE>
+<5217> <5217> <C1D0>
+<5218> <5218> <C1F5>
+<5219> <5219> <D4F2>
+<521A> <521A> <B8D5>
+<521B> <521B> <B4B4>
+<521D> <521D> <B3F5>
+<5220> <5220> <C9BE>
+<5224> <5224> <C5D0>
+<5228> <5228> <C5D9>
+<5229> <5229> <C0FB>
+<522B> <522B> <B1F0>
+<522D> <522D> <D8D9>
+<522E> <522E> <B9CE>
+<5230> <5230> <B5BD>
+<5233> <5233> <D8DA>
+<5236> <5236> <D6C6>
+<5237> <5237> <CBA2>
+<5238> <5238> <C8AF>
+<5239> <5239> <C9B2>
+<523A> <523A> <B4CC>
+<523B> <523B> <BFCC>
+<523D> <523D> <B9F4>
+<523F> <5240> <D8DB>
+<5241> <5241> <B6E7>
+<5242> <5242> <BCC1>
+<5243> <5243> <CCEA>
+<5244> <5244> <D8D9>
+<5247> <5247> <D4F2>
+<524A> <524A> <CFF7>
+<524B> <524B> <BFCB>
+<524C> <524C> <D8DD>
+<524D> <524D> <C7B0>
+<5250> <5250> <B9D0>
+<5251> <5251> <BDA3>
+<5254> <5254> <CCDE>
+<5256> <5256> <C6CA>
+<525B> <525B> <B8D5>
+<525C> <525C> <D8E0>
+<525E> <525E> <D8DE>
+<5261> <5261> <D8DF>
+<5265> <5265> <B0FE>
+<5267> <5267> <BEE7>
+<5269> <5269> <CAA3>
+<526A> <526A> <BCF4>
+<526E> <526E> <B9D0>
+<526F> <526F> <B8B1>
+<5272> <5272> <B8EE>
+<5274> <5274> <D8DC>
+<5275> <5275> <B4B4>
+<527D> <527D> <D8E2>
+<527F> <527F> <BDCB>
+<5281> <5281> <D8E4>
+<5282> <5282> <D8E3>
+<5283> <5283> <BBAE>
+<5287> <5287> <BEE7>
+<5288> <5288> <C5FC>
+<5289> <5289> <C1F5>
+<528A> <528A> <B9F4>
+<528C> <528C> <D8DB>
+<528D> <528D> <BDA3>
+endbfrange
+
+100 beginbfrange
+<5290> <5290> <D8E5>
+<5291> <5291> <BCC1>
+<5293> <5293> <D8E6>
+<529B> <529B> <C1A6>
+<529D> <529D> <C8B0>
+<529E> <529E> <B0EC>
+<529F> <529F> <B9A6>
+<52A0> <52A0> <BCD3>
+<52A1> <52A1> <CEF1>
+<52A2> <52A2> <DBBD>
+<52A3> <52A3> <C1D3>
+<52A8> <52A8> <B6AF>
+<52A9> <52A9> <D6FA>
+<52AA> <52AA> <C5AC>
+<52AB> <52AB> <BDD9>
+<52AC> <52AD> <DBBE>
+<52B1> <52B1> <C0F8>
+<52B2> <52B2> <BEA2>
+<52B3> <52B3> <C0CD>
+<52BE> <52BE> <DBC0>
+<52BF> <52BF> <CAC6>
+<52C1> <52C1> <BEA2>
+<52C3> <52C3> <B2AA>
+<52C7> <52C7> <D3C2>
+<52C9> <52C9> <C3E3>
+<52CB> <52CB> <D1AB>
+<52D0> <52D0> <DBC2>
+<52D2> <52D2> <C0D5>
+<52D5> <52D5> <B6AF>
+<52D6> <52D6> <DBC3>
+<52D8> <52D8> <BFB1>
+<52D9> <52D9> <CEF1>
+<52DB> <52DB> <D1AB>
+<52DD> <52DD> <CAA4>
+<52DE> <52DE> <C0CD>
+<52DF> <52DF> <C4BC>
+<52E2> <52E2> <CAC6>
+<52E4> <52E4> <C7DA>
+<52F0> <52F0> <DBC4>
+<52F1> <52F1> <DBBD>
+<52F5> <52F5> <C0F8>
+<52F8> <52F8> <C8B0>
+<52F9> <52F9> <D9E8>
+<52FA> <52FA> <C9D7>
+<52FE> <52FE> <B9B4>
+<52FF> <52FF> <CEF0>
+<5300> <5300> <D4C8>
+<5305> <5305> <B0FC>
+<5306> <5306> <B4D2>
+<5308> <5308> <D0D9>
+<530D> <530D> <D9E9>
+<530F> <530F> <DECB>
+<5310> <5310> <D9EB>
+<5315> <5315> <D8B0>
+<5316> <5316> <BBAF>
+<5317> <5317> <B1B1>
+<5319> <5319> <B3D7>
+<531A> <531A> <D8CE>
+<531D> <531D> <D4D1>
+<5320> <5320> <BDB3>
+<5321> <5321> <BFEF>
+<5323> <5323> <CFBB>
+<5326> <5326> <D8D0>
+<532A> <532A> <B7CB>
+<532D> <532D> <D8D0>
+<532E> <532E> <D8D1>
+<532F> <532F> <BBE3>
+<5331> <5331> <D8D1>
+<5339> <5339> <C6A5>
+<533A> <533A> <C7F8>
+<533B> <533B> <D2BD>
+<533E> <533E> <D8D2>
+<533F> <533F> <C4E4>
+<5340> <5340> <C7F8>
+<5341> <5341> <CAAE>
+<5343> <5343> <C7A7>
+<5345> <5345> <D8A6>
+<5347> <5347> <C9FD>
+<5348> <5348> <CEE7>
+<5349> <5349> <BBDC>
+<534A> <534A> <B0EB>
+<534E> <534E> <BBAA>
+<534F> <534F> <D0AD>
+<5351> <5351> <B1B0>
+<5352> <5352> <D7E4>
+<5353> <5353> <D7BF>
+<5354> <5354> <D0AD>
+<5355> <5355> <B5A5>
+<5356> <5356> <C2F4>
+<5357> <5357> <C4CF>
+<535A> <535A> <B2A9>
+<535C> <535C> <B2B7>
+<535E> <535E> <B1E5>
+<535F> <535F> <DFB2>
+<5360> <5360> <D5BC>
+<5361> <5361> <BFA8>
+<5362> <5362> <C2AC>
+<5363> <5363> <D8D5>
+<5364> <5364> <C2B1>
+<5366> <5366> <D8D4>
+endbfrange
+
+100 beginbfrange
+<5367> <5367> <CED4>
+<5369> <5369> <DAE0>
+<536B> <536B> <CEC0>
+<536E> <536E> <D8B4>
+<536F> <536F> <C3AE>
+<5370> <5370> <D3A1>
+<5371> <5371> <CEA3>
+<5373> <5373> <BCB4>
+<5374> <5374> <C8B4>
+<5375> <5375> <C2D1>
+<5377> <5377> <BEED>
+<5378> <5378> <D0B6>
+<537A> <537A> <DAE1>
+<537F> <537F> <C7E4>
+<5382> <5382> <B3A7>
+<5384> <5384> <B6F2>
+<5385> <5385> <CCFC>
+<5386> <5386> <C0FA>
+<5389> <5389> <C0F7>
+<538B> <538B> <D1B9>
+<538C> <538C> <D1E1>
+<538D> <538D> <D8C7>
+<5395> <5395> <B2DE>
+<5398> <5398> <C0E5>
+<5399> <5399> <D8C7>
+<539A> <539A> <BAF1>
+<539D> <539D> <D8C8>
+<539F> <539F> <D4AD>
+<53A0> <53A0> <B2DE>
+<53A2> <53A2> <CFE1>
+<53A3> <53A3> <D8C9>
+<53A5> <53A5> <D8CA>
+<53A6> <53A6> <CFC3>
+<53A8> <53A8> <B3F8>
+<53A9> <53A9> <BEC7>
+<53AD> <53AD> <D1E1>
+<53AE> <53AE> <D8CB>
+<53B2> <53B2> <C0F7>
+<53B4> <53B4> <D8C9>
+<53B6> <53B6> <DBCC>
+<53BB> <53BB> <C8A5>
+<53BF> <53BF> <CFD8>
+<53C1> <53C1> <C8FE>
+<53C2> <53C2> <B2CE>
+<53C3> <53C3> <B2CE>
+<53C8> <53C8> <D3D6>
+<53C9> <53C9> <B2E6>
+<53CA> <53CA> <BCB0>
+<53CB> <53CB> <D3D1>
+<53CC> <53CC> <CBAB>
+<53CD> <53CD> <B7B4>
+<53D1> <53D1> <B7A2>
+<53D4> <53D4> <CAE5>
+<53D6> <53D6> <C8A1>
+<53D7> <53D7> <CADC>
+<53D8> <53D8> <B1E4>
+<53D9> <53D9> <D0F0>
+<53DB> <53DB> <C5D1>
+<53DF> <53DF> <DBC5>
+<53E0> <53E0> <B5FE>
+<53E2> <53E2> <B4D4>
+<53E3> <53E3> <BFDA>
+<53E4> <53E4> <B9C5>
+<53E5> <53E5> <BEE4>
+<53E6> <53E6> <C1ED>
+<53E8> <53E8> <DFB6>
+<53E9> <53E9> <DFB5>
+<53EA> <53EA> <D6BB>
+<53EB> <53EB> <BDD0>
+<53EC> <53EC> <D5D9>
+<53ED> <53ED> <B0C8>
+<53EE> <53EE> <B6A3>
+<53EF> <53EF> <BFC9>
+<53F0> <53F0> <CCA8>
+<53F1> <53F1> <DFB3>
+<53F2> <53F2> <CAB7>
+<53F3> <53F3> <D3D2>
+<53F5> <53F5> <D8CF>
+<53F6> <53F6> <D2B6>
+<53F7> <53F7> <BAC5>
+<53F8> <53F8> <CBBE>
+<53F9> <53F9> <CCBE>
+<53FB> <53FB> <DFB7>
+<53FC> <53FC> <B5F0>
+<53FD> <53FD> <DFB4>
+<5401> <5401> <D3F5>
+<5403> <5403> <B3D4>
+<5404> <5404> <B8F7>
+<5406> <5406> <DFBA>
+<5408> <5408> <BACF>
+<5409> <5409> <BCAA>
+<540A> <540A> <B5F5>
+<540C> <540C> <CDAC>
+<540D> <540D> <C3FB>
+<540E> <540E> <BAF3>
+<540F> <540F> <C0F4>
+<5410> <5410> <CDC2>
+<5411> <5411> <CFF2>
+<5412> <5412> <DFB8>
+<5413> <5413> <CFC5>
+endbfrange
+
+100 beginbfrange
+<5415> <5415> <C2C0>
+<5416> <5416> <DFB9>
+<5417> <5417> <C2F0>
+<541B> <541B> <BEFD>
+<541D> <541D> <C1DF>
+<541E> <541E> <CDCC>
+<541F> <541F> <D2F7>
+<5420> <5420> <B7CD>
+<5421> <5421> <DFC1>
+<5423> <5423> <DFC4>
+<5426> <5426> <B7F1>
+<5427> <5427> <B0C9>
+<5428> <5428> <B6D6>
+<5429> <5429> <B7D4>
+<542B> <542B> <BAAC>
+<542C> <542C> <CCFD>
+<542D> <542D> <BFD4>
+<542E> <542E> <CBB1>
+<542F> <542F> <C6F4>
+<5431> <5431> <D6A8>
+<5432> <5432> <DFC5>
+<5434> <5434> <CEE2>
+<5435> <5435> <B3B3>
+<5438> <5438> <CEFC>
+<5439> <5439> <B4B5>
+<543B> <543B> <CEC7>
+<543C> <543C> <BAF0>
+<543E> <543E> <CEE1>
+<5440> <5440> <D1BD>
+<5443> <5443> <DFC0>
+<5446> <5446> <B4F4>
+<5448> <5448> <B3CA>
+<544A> <544A> <B8E6>
+<544B> <544B> <DFBB>
+<5450> <5450> <C4C5>
+<5452> <5454> <DFBC>
+<5455> <5455> <C5BB>
+<5456> <5456> <DFBF>
+<5457> <5457> <DFC2>
+<5458> <5458> <D4B1>
+<5459> <5459> <DFC3>
+<545B> <545B> <C7BA>
+<545C> <545C> <CED8>
+<5462> <5462> <C4D8>
+<5464> <5464> <DFCA>
+<5466> <5466> <DFCF>
+<5468> <5468> <D6DC>
+<5471> <5471> <DFC9>
+<5472> <5472> <DFDA>
+<5473> <5473> <CEB6>
+<5475> <5475> <BAC7>
+<5476> <5476> <DFCE>
+<5477> <5477> <DFC8>
+<5478> <5478> <C5DE>
+<547B> <547B> <C9EB>
+<547C> <547C> <BAF4>
+<547D> <547D> <C3FC>
+<5480> <5480> <BED7>
+<5482> <5482> <DFC6>
+<5484> <5484> <DFCD>
+<5486> <5486> <C5D8>
+<548B> <548B> <D5A6>
+<548C> <548C> <BACD>
+<548E> <548E> <BECC>
+<548F> <548F> <D3BD>
+<5490> <5490> <B8C0>
+<5492> <5492> <D6E4>
+<5494> <5494> <DFC7>
+<5495> <5495> <B9BE>
+<5496> <5496> <BFA7>
+<5499> <5499> <C1FC>
+<549A> <549B> <DFCB>
+<549D> <549D> <DFD0>
+<54A3> <54A3> <DFDB>
+<54A4> <54A4> <DFE5>
+<54A6> <54A6> <DFD7>
+<54A7> <54A7> <DFD6>
+<54A8> <54A8> <D7C9>
+<54A9> <54AA> <DFE3>
+<54AB> <54AB> <E5EB>
+<54AC> <54AC> <D2A7>
+<54AD> <54AD> <DFD2>
+<54AF> <54AF> <BFA9>
+<54B1> <54B1> <D4DB>
+<54B3> <54B3> <BFC8>
+<54B4> <54B4> <DFD4>
+<54B8> <54B8> <CFCC>
+<54BB> <54BB> <DFDD>
+<54BC> <54BC> <DFC3>
+<54BD> <54BD> <D1CA>
+<54BF> <54BF> <DFDE>
+<54C0> <54C0> <B0A7>
+<54C1> <54C1> <C6B7>
+<54C2> <54C2> <DFD3>
+<54C4> <54C4> <BAE5>
+<54C6> <54C6> <B6DF>
+<54C7> <54C7> <CDDB>
+<54C8> <54C8> <B9FE>
+<54C9> <54C9> <D4D5>
+<54CC> <54CC> <DFDF>
+endbfrange
+
+100 beginbfrange
+<54CD> <54CD> <CFEC>
+<54CE> <54CE> <B0A5>
+<54CF> <54CF> <DFE7>
+<54D0> <54D0> <DFD1>
+<54D1> <54D1> <D1C6>
+<54D2> <54D2> <DFD5>
+<54D3> <54D4> <DFD8>
+<54D5> <54D5> <DFDC>
+<54D7> <54D7> <BBA9>
+<54D9> <54DA> <DFE0>
+<54DC> <54DC> <DFE2>
+<54DD> <54DD> <DFE6>
+<54DE> <54DE> <DFE8>
+<54DF> <54DF> <D3B4>
+<54E1> <54E1> <D4B1>
+<54E5> <54E5> <B8E7>
+<54E6> <54E6> <C5B6>
+<54E7> <54E7> <DFEA>
+<54E8> <54E8> <C9DA>
+<54E9> <54E9> <C1A8>
+<54EA> <54EA> <C4C4>
+<54ED> <54ED> <BFDE>
+<54EE> <54EE> <CFF8>
+<54F2> <54F2> <D5DC>
+<54F3> <54F3> <DFEE>
+<54FA> <54FA> <B2B8>
+<54FC> <54FC> <BADF>
+<54FD> <54FD> <DFEC>
+<54FF> <54FF> <DBC1>
+<5501> <5501> <D1E4>
+<5504> <5504> <DFC2>
+<5506> <5506> <CBF4>
+<5507> <5507> <B4BD>
+<5509> <5509> <B0A6>
+<550F> <550F> <DFF1>
+<5510> <5510> <CCC6>
+<5511> <5511> <DFF2>
+<5514> <5514> <DFED>
+<551B> <551B> <DFE9>
+<5520> <5520> <DFEB>
+<5522> <5523> <DFEF>
+<5524> <5524> <BBBD>
+<5527> <5527> <DFF3>
+<552A> <552A> <DFF4>
+<552C> <552C> <BBA3>
+<552E> <552E> <CADB>
+<552F> <552F> <CEA8>
+<5530> <5530> <E0A7>
+<5531> <5531> <B3AA>
+<5533> <5533> <E0A6>
+<5537> <5537> <E0A1>
+<553C> <553C> <DFFE>
+<553E> <553E> <CDD9>
+<553F> <553F> <DFFC>
+<5541> <5541> <DFFA>
+<5543> <5543> <BFD0>
+<5544> <5544> <D7C4>
+<5546> <5546> <C9CC>
+<5549> <5549> <DFF8>
+<554A> <554A> <B0A1>
+<554F> <554F> <CECA>
+<5550> <5550> <DFFD>
+<5553> <5553> <C6F4>
+<5555> <5555> <DFFB>
+<5556> <5556> <E0A2>
+<555C> <555C> <E0A8>
+<555E> <555E> <D1C6>
+<5561> <5561> <B7C8>
+<5564> <5564> <C6A1>
+<5565> <5565> <C9B6>
+<5566> <5566> <C0B2>
+<5567> <5567> <DFF5>
+<556A> <556A> <C5BE>
+<556C> <556C> <D8C4>
+<556D> <556D> <DFF9>
+<556E> <556E> <C4F6>
+<5575> <5577> <E0A3>
+<5578> <5578> <D0A5>
+<557B> <557B> <E0B4>
+<557C> <557C> <CCE4>
+<557E> <557E> <E0B1>
+<5580> <5580> <BFA6>
+<5581> <5581> <E0AF>
+<5582> <5582> <CEB9>
+<5583> <5583> <E0AB>
+<5584> <5584> <C9C6>
+<5587> <5587> <C0AE>
+<5588> <5588> <E0AE>
+<5589> <5589> <BAED>
+<558A> <558A> <BAB0>
+<558B> <558B> <E0A9>
+<558F> <558F> <DFF6>
+<5591> <5591> <E0B3>
+<5594> <5594> <E0B8>
+<5598> <5598> <B4AD>
+<5599> <5599> <E0B9>
+<559C> <559C> <CFB2>
+<559D> <559D> <BAC8>
+<559F> <559F> <E0B0>
+<55A7> <55A7> <D0FA>
+endbfrange
+
+100 beginbfrange
+<55AA> <55AA> <C9A5>
+<55AC> <55AC> <C7C7>
+<55AE> <55AE> <B5A5>
+<55B1> <55B1> <E0AC>
+<55B2> <55B2> <D3B4>
+<55B3> <55B3> <D4FB>
+<55B5> <55B5> <DFF7>
+<55B7> <55B7> <C5E7>
+<55B9> <55B9> <E0AD>
+<55BB> <55BB> <D3F7>
+<55BD> <55BE> <E0B6>
+<55C4> <55C4> <E0C4>
+<55C5> <55C5> <D0E1>
+<55C6> <55C6> <C7BA>
+<55C7> <55C7> <D8C4>
+<55C9> <55C9> <E0BC>
+<55CC> <55CD> <E0C9>
+<55CE> <55CE> <C2F0>
+<55D1> <55D1> <E0BE>
+<55D2> <55D2> <E0AA>
+<55D3> <55D3> <C9A4>
+<55D4> <55D4> <E0C1>
+<55D6> <55D6> <E0B2>
+<55DA> <55DA> <CED8>
+<55DC> <55DC> <CAC8>
+<55DD> <55DD> <E0C3>
+<55DF> <55DF> <E0B5>
+<55E1> <55E1> <CECB>
+<55E3> <55E3> <CBC3>
+<55E4> <55E4> <E0CD>
+<55E5> <55E5> <E0C6>
+<55E6> <55E6> <E0C2>
+<55E8> <55E8> <E0CB>
+<55E9> <55E9> <DFEF>
+<55EA> <55EA> <E0BA>
+<55EB> <55EC> <E0BF>
+<55EF> <55EF> <E0C5>
+<55F2> <55F3> <E0C7>
+<55F5> <55F5> <E0CC>
+<55F6> <55F6> <DFD9>
+<55F7> <55F7> <E0BB>
+<55FD> <55FD> <CBD4>
+<55FE> <55FE> <E0D5>
+<5600> <5600> <E0D6>
+<5601> <5601> <E0D2>
+<5606> <5606> <CCBE>
+<5608> <5608> <E0D0>
+<5609> <5609> <BCCE>
+<560C> <560C> <E0D1>
+<560D> <560D> <E0B6>
+<560E> <560E> <B8C2>
+<560F> <560F> <D8C5>
+<5614> <5614> <C5BB>
+<5616> <5616> <DFF5>
+<5617> <5617> <B3A2>
+<5618> <5618> <D0EA>
+<561B> <561B> <C2EF>
+<561C> <561C> <DFE9>
+<561E> <561E> <E0CF>
+<561F> <561F> <E0BD>
+<5623> <5623> <E0D4>
+<5624> <5624> <E0D3>
+<5627> <5627> <E0D7>
+<5629> <5629> <BBA9>
+<562C> <562C> <E0DC>
+<562D> <562D> <E0D8>
+<562E> <562E> <DFEB>
+<562F> <562F> <D0A5>
+<5630> <5630> <DFB4>
+<5631> <5631> <D6F6>
+<5632> <5632> <B3B0>
+<5634> <5634> <D7EC>
+<5635> <5635> <DFD8>
+<5636> <5636> <CBBB>
+<5638> <5638> <DFBC>
+<5639> <5639> <E0DA>
+<563B> <563B> <CEFB>
+<563F> <563F> <BAD9>
+<5641> <5641> <B6F1>
+<564C> <564C> <E0E1>
+<564D> <564D> <E0DD>
+<564E> <564E> <D2AD>
+<5654> <5654> <E0E2>
+<5657> <5657> <E0DB>
+<5658> <5658> <E0D9>
+<5659> <5659> <E0DF>
+<565C> <565C> <E0E0>
+<565D> <565D> <DFD0>
+<5660> <5660> <DFD5>
+<5662> <5662> <E0DE>
+<5664> <5664> <E0E4>
+<5665> <5665> <DFE6>
+<5666> <5666> <DFDC>
+<5668> <5668> <C6F7>
+<5669> <5669> <D8AC>
+<566A> <566A> <D4EB>
+<566B> <566B> <E0E6>
+<566C> <566C> <CAC9>
+<566F> <566F> <E0C8>
+<5671> <5671> <E0E5>
+endbfrange
+
+100 beginbfrange
+<5672> <5672> <DFE0>
+<5674> <5674> <C5E7>
+<5676> <5676> <B8C1>
+<5678> <5678> <B6D6>
+<5679> <5679> <B5B1>
+<567B> <567C> <E0E7>
+<5680> <5680> <DFCC>
+<5685> <5685> <E0E9>
+<5686> <5686> <E0E3>
+<5687> <5687> <CFC5>
+<568C> <568C> <DFE2>
+<568E> <568E> <BABF>
+<568F> <568F> <CCE7>
+<5693> <5693> <E0EA>
+<5695> <5695> <E0E0>
+<5699> <5699> <C4F6>
+<56A3> <56A3> <CFF9>
+<56A6> <56A6> <DFBF>
+<56A8> <56A8> <C1FC>
+<56AE> <56AE> <CFF2>
+<56AF> <56AF> <E0EB>
+<56B3> <56B3> <E0B7>
+<56B4> <56B4> <D1CF>
+<56B6> <56B6> <E0D3>
+<56B7> <56B7> <C8C2>
+<56BC> <56BC> <BDC0>
+<56C0> <56C0> <DFF9>
+<56C1> <56C1> <E0BF>
+<56C2> <56C2> <CFF9>
+<56C5> <56C5> <D9E6>
+<56C8> <56C8> <DFBD>
+<56C9> <56C9> <C2DE>
+<56CA> <56CA> <C4D2>
+<56CC> <56CC> <CBD5>
+<56D1> <56D1> <D6F6>
+<56D4> <56D4> <E0EC>
+<56D7> <56D7> <E0ED>
+<56DA> <56DA> <C7F4>
+<56DB> <56DB> <CBC4>
+<56DD> <56DD> <E0EE>
+<56DE> <56DE> <BBD8>
+<56DF> <56DF> <D8B6>
+<56E0> <56E0> <D2F2>
+<56E1> <56E1> <E0EF>
+<56E2> <56E2> <CDC5>
+<56E4> <56E4> <B6DA>
+<56EB> <56EB> <E0F1>
+<56ED> <56ED> <D4B0>
+<56F0> <56F0> <C0A7>
+<56F1> <56F1> <B4D1>
+<56F4> <56F4> <CEA7>
+<56F5> <56F5> <E0F0>
+<56F9> <56F9> <E0F2>
+<56FA> <56FA> <B9CC>
+<56FD> <56FD> <B9FA>
+<56FE> <56FE> <CDBC>
+<56FF> <56FF> <E0F3>
+<5703> <5703> <C6D4>
+<5704> <5704> <E0F4>
+<5706> <5706> <D4B2>
+<5707> <5707> <E0F0>
+<5708> <5708> <C8A6>
+<5709> <5709> <E0F6>
+<570A> <570A> <E0F5>
+<570B> <570B> <B9FA>
+<570D> <570D> <CEA7>
+<5712> <5712> <D4B0>
+<5713> <5713> <D4B2>
+<5716> <5716> <CDBC>
+<5718> <5718> <CDC5>
+<571C> <571C> <E0F7>
+<571F> <571F> <CDC1>
+<5723> <5723> <CAA5>
+<5728> <5728> <D4DA>
+<5729> <5729> <DBD7>
+<572A> <572A> <DBD9>
+<572C> <572C> <DBD8>
+<572D> <572D> <B9E7>
+<572E> <572F> <DBDC>
+<5730> <5730> <B5D8>
+<5733> <5733> <DBDA>
+<5739> <5739> <DBDB>
+<573A> <573A> <B3A1>
+<573B> <573B> <DBDF>
+<573E> <573E> <BBF8>
+<5740> <5740> <D6B7>
+<5742> <5742> <DBE0>
+<5747> <5747> <BEF9>
+<574A> <574A> <B7BB>
+<574C> <574C> <DBD0>
+<574D> <574D> <CCAE>
+<574E> <574E> <BFB2>
+<574F> <574F> <BBB5>
+<5750> <5750> <D7F8>
+<5751> <5751> <BFD3>
+<5757> <5757> <BFE9>
+<575A> <575A> <BCE1>
+<575B> <575B> <CCB3>
+<575C> <575C> <DBDE>
+<575D> <575D> <B0D3>
+endbfrange
+
+100 beginbfrange
+<575E> <575E> <CEEB>
+<575F> <575F> <B7D8>
+<5760> <5760> <D7B9>
+<5761> <5761> <C6C2>
+<5764> <5764> <C0A4>
+<5766> <5766> <CCB9>
+<5768> <5768> <DBE7>
+<5769> <5769> <DBE1>
+<576A> <576A> <C6BA>
+<576B> <576B> <DBE3>
+<576D> <576D> <DBE8>
+<576F> <576F> <C5F7>
+<5773> <5773> <DBEA>
+<5776> <5776> <DBE9>
+<5777> <5777> <BFC0>
+<577B> <577B> <DBE6>
+<577C> <577C> <DBE5>
+<5782> <5782> <B4B9>
+<5783> <5783> <C0AC>
+<5784> <5784> <C2A2>
+<5785> <5785> <DBE2>
+<5786> <5786> <DBE4>
+<578B> <578B> <D0CD>
+<578C> <578C> <DBED>
+<5792> <5792> <C0DD>
+<5793> <5793> <DBF2>
+<579B> <579B> <B6E2>
+<57A0> <57A0> <DBF3>
+<57A1> <57A1> <DBD2>
+<57A2> <57A2> <B9B8>
+<57A3> <57A3> <D4AB>
+<57A4> <57A4> <DBEC>
+<57A6> <57A6> <BFD1>
+<57A7> <57A7> <DBF0>
+<57A9> <57A9> <DBD1>
+<57AB> <57AB> <B5E6>
+<57AD> <57AD> <DBEB>
+<57AE> <57AE> <BFE5>
+<57B2> <57B2> <DBEE>
+<57B4> <57B4> <DBF1>
+<57B8> <57B8> <DBF9>
+<57C2> <57C2> <B9A1>
+<57C3> <57C3> <B0A3>
+<57CB> <57CB> <C2F1>
+<57CE> <57CE> <B3C7>
+<57CF> <57CF> <DBEF>
+<57D2> <57D2> <DBF8>
+<57D4> <57D4> <C6D2>
+<57D5> <57D5> <DBF4>
+<57D8> <57D8> <DBF5>
+<57D9> <57D9> <DBF7>
+<57DA> <57DA> <DBF6>
+<57DD> <57DD> <DBFE>
+<57DF> <57DF> <D3F2>
+<57E0> <57E0> <B2BA>
+<57E1> <57E1> <DBEB>
+<57E4> <57E4> <DBFD>
+<57ED> <57ED> <DCA4>
+<57EF> <57EF> <DBFB>
+<57F4> <57F4> <DBFA>
+<57F7> <57F7> <D6B4>
+<57F8> <57F8> <DBFC>
+<57F9> <57F9> <C5E0>
+<57FA> <57FA> <BBF9>
+<57FD> <57FD> <DCA3>
+<5800> <5800> <DCA5>
+<5802> <5802> <CCC3>
+<5805> <5805> <BCE1>
+<5806> <5806> <B6D1>
+<5807> <5807> <DDC0>
+<580A> <580A> <DBD1>
+<580B> <580B> <DCA1>
+<580D> <580D> <DCA2>
+<5811> <5811> <C7B5>
+<5815> <5815> <B6E9>
+<5816> <5816> <DBF1>
+<5819> <5819> <DCA7>
+<581D> <581D> <DBF6>
+<581E> <581E> <DCA6>
+<5820> <5820> <DCA9>
+<5821> <5821> <B1A4>
+<5824> <5824> <B5CC>
+<582A> <582A> <BFB0>
+<582F> <582F> <D2A2>
+<5830> <5830> <D1DF>
+<5831> <5831> <B1A8>
+<5834> <5834> <B3A1>
+<5835> <5835> <B6C2>
+<5844> <5844> <DCA8>
+<584A> <584A> <BFE9>
+<584B> <584B> <DCE3>
+<584C> <584C> <CBFA>
+<584D> <584D> <EBF3>
+<584F> <584F> <DBEE>
+<5851> <5851> <CBDC>
+<5852> <5852> <DBF5>
+<5854> <5854> <CBFE>
+<5857> <5857> <CDBF>
+<5858> <5858> <CCC1>
+<585E> <585E> <C8FB>
+endbfrange
+
+100 beginbfrange
+<5862> <5862> <CEEB>
+<5864> <5864> <DBF7>
+<5865> <5865> <DCAA>
+<586B> <586B> <CCEE>
+<586C> <586C> <DCAB>
+<5875> <5875> <B3BE>
+<5879> <5879> <C7B5>
+<587E> <587E> <DBD3>
+<5880> <5880> <DCAF>
+<5881> <5881> <DCAC>
+<5883> <5883> <BEB3>
+<5885> <5885> <CAFB>
+<5889> <5889> <DCAD>
+<588A> <588A> <B5E6>
+<5892> <5892> <C9CA>
+<5893> <5893> <C4B9>
+<5899> <5899> <C7BD>
+<589A> <589A> <DCAE>
+<589C> <589C> <D7B9>
+<589E> <589E> <D4F6>
+<589F> <589F> <D0E6>
+<58A8> <58A8> <C4AB>
+<58A9> <58A9> <B6D5>
+<58AE> <58AE> <B6E9>
+<58B3> <58B3> <B7D8>
+<58BB> <58BB> <C7BD>
+<58BC> <58BC> <DBD4>
+<58BE> <58BE> <BFD1>
+<58C1> <58C1> <B1DA>
+<58C5> <58C5> <DBD5>
+<58C7> <58C7> <CCB3>
+<58D1> <58D1> <DBD6>
+<58D3> <58D3> <D1B9>
+<58D5> <58D5> <BABE>
+<58D8> <58D8> <C0DD>
+<58D9> <58D9> <DBDB>
+<58DA> <58DA> <DBE4>
+<58DE> <58DE> <BBB5>
+<58DF> <58DF> <C2A2>
+<58E0> <58E0> <DBE2>
+<58E2> <58E2> <DBDE>
+<58E4> <58E4> <C8C0>
+<58E9> <58E9> <B0D3>
+<58EB> <58EB> <CABF>
+<58EC> <58EC> <C8C9>
+<58EE> <58EE> <D7B3>
+<58EF> <58EF> <D7B3>
+<58F0> <58F0> <C9F9>
+<58F3> <58F3> <BFC7>
+<58F6> <58F6> <BAF8>
+<58F9> <58F9> <D2BC>
+<58FA> <58FA> <BAF8>
+<58FD> <58FD> <CAD9>
+<5902> <5902> <E2BA>
+<5904> <5904> <B4A6>
+<5907> <5907> <B1B8>
+<590D> <590D> <B8B4>
+<590F> <590F> <CFC4>
+<5914> <5914> <D9E7>
+<5915> <5915> <CFA6>
+<5916> <5916> <CDE2>
+<5919> <5919> <D9ED>
+<591A> <591A> <B6E0>
+<591C> <591C> <D2B9>
+<591F> <591F> <B9BB>
+<5922> <5922> <C3CE>
+<5924> <5924> <E2B9>
+<5925> <5925> <E2B7>
+<5927> <5927> <B4F3>
+<5929> <5929> <CCEC>
+<592A> <592A> <CCAB>
+<592B> <592B> <B7F2>
+<592D> <592D> <D8B2>
+<592E> <592E> <D1EB>
+<592F> <592F> <BABB>
+<5931> <5931> <CAA7>
+<5934> <5934> <CDB7>
+<5937> <5937> <D2C4>
+<5938> <5938> <BFE4>
+<5939> <5939> <BCD0>
+<593A> <593A> <B6E1>
+<593C> <593C> <DEC5>
+<593E> <593E> <BCD0>
+<5941> <5941> <DEC6>
+<5942> <5942> <DBBC>
+<5944> <5944> <D1D9>
+<5947> <5947> <C6E6>
+<5948> <5948> <C4CE>
+<5949> <5949> <B7EE>
+<594B> <594B> <B7DC>
+<594E> <594E> <BFFC>
+<594F> <594F> <D7E0>
+<5951> <5951> <C6F5>
+<5954> <5954> <B1BC>
+<5955> <5955> <DEC8>
+<5956> <5956> <BDB1>
+<5957> <5957> <CCD7>
+<5958> <5958> <DECA>
+<595A> <595A> <DEC9>
+<5960> <5960> <B5EC>
+endbfrange
+
+100 beginbfrange
+<5962> <5962> <C9DD>
+<5965> <5965> <B0C2>
+<5969> <5969> <DEC6>
+<596A> <596A> <B6E1>
+<596C> <596C> <BDB1>
+<596E> <596E> <B7DC>
+<5973> <5973> <C5AE>
+<5974> <5974> <C5AB>
+<5976> <5976> <C4CC>
+<5978> <5978> <BCE9>
+<5979> <5979> <CBFD>
+<597D> <597D> <BAC3>
+<5981> <5981> <E5F9>
+<5982> <5982> <C8E7>
+<5983> <5983> <E5FA>
+<5984> <5984> <CDFD>
+<5986> <5986> <D7B1>
+<5987> <5987> <B8BE>
+<5988> <5988> <C2E8>
+<598A> <598A> <C8D1>
+<598D> <598D> <E5FB>
+<5992> <5992> <B6CA>
+<5993> <5993> <BCCB>
+<5996> <5996> <D1FD>
+<5997> <5997> <E6A1>
+<5999> <5999> <C3EE>
+<599D> <599D> <D7B1>
+<599E> <599E> <E6A4>
+<59A3> <59A3> <E5FE>
+<59A4> <59A4> <E6A5>
+<59A5> <59A5> <CDD7>
+<59A8> <59A8> <B7C1>
+<59A9> <59AA> <E5FC>
+<59AB> <59AB> <E6A3>
+<59AE> <59AE> <C4DD>
+<59AF> <59AF> <E6A8>
+<59B2> <59B2> <E6A7>
+<59B9> <59B9> <C3C3>
+<59BB> <59BB> <C6DE>
+<59BE> <59BE> <E6AA>
+<59C6> <59C6> <C4B7>
+<59CA> <59CA> <E6A2>
+<59CB> <59CB> <CABC>
+<59D0> <59D0> <BDE3>
+<59D1> <59D1> <B9C3>
+<59D2> <59D2> <E6A6>
+<59D3> <59D3> <D0D5>
+<59D4> <59D4> <CEAF>
+<59D7> <59D7> <E6A9>
+<59D8> <59D8> <E6B0>
+<59DA> <59DA> <D2A6>
+<59DC> <59DC> <BDAA>
+<59DD> <59DD> <E6AD>
+<59E3> <59E3> <E6AF>
+<59E5> <59E5> <C0D1>
+<59E8> <59E8> <D2CC>
+<59EC> <59EC> <BCA7>
+<59F9> <59F9> <E6B1>
+<59FB> <59FB> <D2F6>
+<59FF> <59FF> <D7CB>
+<5A01> <5A01> <CDFE>
+<5A03> <5A03> <CDDE>
+<5A04> <5A04> <C2A6>
+<5A05> <5A06> <E6AB>
+<5A07> <5A07> <BDBF>
+<5A08> <5A08> <E6AE>
+<5A09> <5A09> <E6B3>
+<5A0C> <5A0C> <E6B2>
+<5A11> <5A11> <E6B6>
+<5A13> <5A13> <E6B8>
+<5A18> <5A18> <C4EF>
+<5A1C> <5A1C> <C4C8>
+<5A1F> <5A1F> <BEEA>
+<5A20> <5A20> <C9EF>
+<5A23> <5A23> <E6B7>
+<5A25> <5A25> <B6F0>
+<5A29> <5A29> <C3E4>
+<5A31> <5A31> <D3E9>
+<5A32> <5A32> <E6B4>
+<5A34> <5A34> <E6B5>
+<5A36> <5A36> <C8A2>
+<5A3C> <5A3C> <E6BD>
+<5A40> <5A40> <E6B9>
+<5A41> <5A41> <C2A6>
+<5A46> <5A46> <C6C5>
+<5A49> <5A49> <CDF1>
+<5A4A> <5A4A> <E6BB>
+<5A55> <5A55> <E6BC>
+<5A5A> <5A5A> <BBE9>
+<5A62> <5A62> <E6BE>
+<5A66> <5A66> <B8BE>
+<5A67> <5A67> <E6BA>
+<5A6A> <5A6A> <C0B7>
+<5A6D> <5A6D> <E6AB>
+<5A74> <5A74> <D3A4>
+<5A75> <5A75> <E6BF>
+<5A76> <5A76> <C9F4>
+<5A77> <5A77> <E6C3>
+<5A7A> <5A7A> <E6C4>
+<5A7F> <5A7F> <D0F6>
+endbfrange
+
+100 beginbfrange
+<5A92> <5A92> <C3BD>
+<5A9A> <5A9A> <C3C4>
+<5A9B> <5A9B> <E6C2>
+<5AA7> <5AA7> <E6B4>
+<5AAA> <5AAA> <E6C1>
+<5AB2> <5AB2> <E6C7>
+<5AB3> <5AB3> <CFB1>
+<5AB5> <5AB5> <EBF4>
+<5AB8> <5AB8> <E6CA>
+<5ABD> <5ABD> <C2E8>
+<5ABE> <5ABE> <E6C5>
+<5AC1> <5AC1> <BCDE>
+<5AC2> <5AC2> <C9A9>
+<5AC9> <5AC9> <BCB5>
+<5ACC> <5ACC> <CFD3>
+<5AD2> <5AD2> <E6C8>
+<5AD4> <5AD4> <E6C9>
+<5AD6> <5AD6> <E6CE>
+<5AD7> <5AD7> <E5FD>
+<5AD8> <5AD8> <E6D0>
+<5ADC> <5ADC> <E6D1>
+<5AE0> <5AE0> <E6CB>
+<5AE1> <5AE1> <B5D5>
+<5AE3> <5AE3> <E6CC>
+<5AE6> <5AE6> <E6CF>
+<5AE9> <5AE9> <C4DB>
+<5AEB> <5AEB> <E6C6>
+<5AF1> <5AF1> <E6CD>
+<5AF5> <5AF5> <E5FC>
+<5AFB> <5AFB> <E6B5>
+<5B00> <5B00> <E6A3>
+<5B08> <5B08> <E6AC>
+<5B09> <5B09> <E6D2>
+<5B0B> <5B0B> <E6BF>
+<5B0C> <5B0C> <BDBF>
+<5B16> <5B16> <E6D4>
+<5B17> <5B17> <E6D3>
+<5B19> <5B19> <E6CD>
+<5B21> <5B21> <E6C8>
+<5B2A> <5B2A> <E6C9>
+<5B30> <5B30> <D3A4>
+<5B32> <5B32> <E6D5>
+<5B34> <5B34> <D9F8>
+<5B37> <5B37> <E6D6>
+<5B38> <5B38> <C9F4>
+<5B40> <5B40> <E6D7>
+<5B4C> <5B4C> <E6AE>
+<5B50> <5B50> <D7D3>
+<5B51> <5B51> <E6DD>
+<5B53> <5B53> <E6DE>
+<5B54> <5B54> <BFD7>
+<5B55> <5B55> <D4D0>
+<5B57> <5B57> <D7D6>
+<5B58> <5B58> <B4E6>
+<5B59> <5B59> <CBEF>
+<5B5A> <5B5A> <E6DA>
+<5B5B> <5B5B> <D8C3>
+<5B5C> <5B5C> <D7CE>
+<5B5D> <5B5D> <D0A2>
+<5B5F> <5B5F> <C3CF>
+<5B62> <5B62> <E6DF>
+<5B63> <5B63> <BCBE>
+<5B64> <5B64> <B9C2>
+<5B65> <5B65> <E6DB>
+<5B66> <5B66> <D1A7>
+<5B69> <5B69> <BAA2>
+<5B6A> <5B6A> <C2CF>
+<5B6B> <5B6B> <CBEF>
+<5B6C> <5B6C> <D8AB>
+<5B70> <5B70> <CAEB>
+<5B71> <5B71> <E5EE>
+<5B73> <5B73> <E6DC>
+<5B75> <5B75> <B7F5>
+<5B78> <5B78> <D1A7>
+<5B7A> <5B7A> <C8E6>
+<5B7D> <5B7D> <C4F5>
+<5B7F> <5B7F> <C2CF>
+<5B80> <5B80> <E5B2>
+<5B81> <5B81> <C4FE>
+<5B83> <5B83> <CBFC>
+<5B84> <5B84> <E5B3>
+<5B85> <5B85> <D5AC>
+<5B87> <5B87> <D3EE>
+<5B88> <5B88> <CAD8>
+<5B89> <5B89> <B0B2>
+<5B8B> <5B8B> <CBCE>
+<5B8C> <5B8C> <CDEA>
+<5B8F> <5B8F> <BAEA>
+<5B93> <5B93> <E5B5>
+<5B95> <5B95> <E5B4>
+<5B97> <5B97> <D7DA>
+<5B98> <5B98> <B9D9>
+<5B99> <5B99> <D6E6>
+<5B9A> <5B9A> <B6A8>
+<5B9B> <5B9B> <CDF0>
+<5B9C> <5B9C> <D2CB>
+<5B9D> <5B9D> <B1A6>
+<5B9E> <5B9E> <CAB5>
+<5BA0> <5BA0> <B3E8>
+<5BA1> <5BA1> <C9F3>
+endbfrange
+
+100 beginbfrange
+<5BA2> <5BA2> <BFCD>
+<5BA3> <5BA3> <D0FB>
+<5BA4> <5BA4> <CAD2>
+<5BA5> <5BA5> <E5B6>
+<5BA6> <5BA6> <BBC2>
+<5BAA> <5BAA> <CFDC>
+<5BAB> <5BAB> <B9AC>
+<5BB0> <5BB0> <D4D7>
+<5BB3> <5BB3> <BAA6>
+<5BB4> <5BB4> <D1E7>
+<5BB5> <5BB5> <CFFC>
+<5BB6> <5BB6> <BCD2>
+<5BB8> <5BB8> <E5B7>
+<5BB9> <5BB9> <C8DD>
+<5BBD> <5BBD> <BFED>
+<5BBE> <5BBE> <B1F6>
+<5BBF> <5BBF> <CBDE>
+<5BC2> <5BC2> <BCC5>
+<5BC4> <5BC4> <BCC4>
+<5BC5> <5BC5> <D2FA>
+<5BC6> <5BC6> <C3DC>
+<5BC7> <5BC7> <BFDC>
+<5BCC> <5BCC> <B8BB>
+<5BD0> <5BD0> <C3C2>
+<5BD2> <5BD2> <BAAE>
+<5BD3> <5BD3> <D4A2>
+<5BDD> <5BDD> <C7DE>
+<5BDE> <5BDE> <C4AF>
+<5BDF> <5BDF> <B2EC>
+<5BE1> <5BE1> <B9D1>
+<5BE2> <5BE2> <C7DE>
+<5BE4> <5BE4> <E5BB>
+<5BE5> <5BE5> <C1C8>
+<5BE6> <5BE6> <CAB5>
+<5BE7> <5BE7> <C4FE>
+<5BE8> <5BE8> <D5AF>
+<5BE9> <5BE9> <C9F3>
+<5BEB> <5BEB> <D0B4>
+<5BEC> <5BEC> <BFED>
+<5BEE> <5BEE> <E5BC>
+<5BF0> <5BF0> <E5BE>
+<5BF5> <5BF5> <B3E8>
+<5BF6> <5BF6> <B1A6>
+<5BF8> <5BF8> <B4E7>
+<5BF9> <5BF9> <B6D4>
+<5BFA> <5BFA> <CBC2>
+<5BFB> <5BFB> <D1B0>
+<5BFC> <5BFC> <B5BC>
+<5BFF> <5BFF> <CAD9>
+<5C01> <5C01> <B7E2>
+<5C04> <5C04> <C9E4>
+<5C06> <5C06> <BDAB>
+<5C07> <5C07> <BDAB>
+<5C08> <5C08> <D7A8>
+<5C09> <5C09> <CEBE>
+<5C0A> <5C0A> <D7F0>
+<5C0B> <5C0B> <D1B0>
+<5C0D> <5C0D> <B6D4>
+<5C0E> <5C0E> <B5BC>
+<5C0F> <5C0F> <D0A1>
+<5C11> <5C11> <C9D9>
+<5C14> <5C14> <B6FB>
+<5C15> <5C15> <E6D8>
+<5C16> <5C16> <BCE2>
+<5C18> <5C18> <B3BE>
+<5C1A> <5C1A> <C9D0>
+<5C1C> <5C1C> <E6D9>
+<5C1D> <5C1D> <B3A2>
+<5C22> <5C22> <DECC>
+<5C24> <5C24> <D3C8>
+<5C25> <5C25> <DECD>
+<5C27> <5C27> <D2A2>
+<5C2C> <5C2C> <DECE>
+<5C31> <5C31> <BECD>
+<5C34> <5C34> <DECF>
+<5C37> <5C37> <DECF>
+<5C38> <5C38> <CAAC>
+<5C39> <5C39> <D2FC>
+<5C3A> <5C3A> <B3DF>
+<5C3B> <5C3B> <E5EA>
+<5C3C> <5C3C> <C4E1>
+<5C3D> <5C3D> <BEA1>
+<5C3E> <5C3E> <CEB2>
+<5C3F> <5C3F> <C4F2>
+<5C40> <5C40> <BED6>
+<5C41> <5C41> <C6A8>
+<5C42> <5C42> <B2E3>
+<5C45> <5C45> <BED3>
+<5C48> <5C48> <C7FC>
+<5C49> <5C49> <CCEB>
+<5C4A> <5C4A> <BDEC>
+<5C4B> <5C4B> <CEDD>
+<5C4E> <5C4E> <CABA>
+<5C4F> <5C4F> <C6C1>
+<5C50> <5C50> <E5EC>
+<5C51> <5C51> <D0BC>
+<5C55> <5C55> <D5B9>
+<5C59> <5C59> <E5ED>
+<5C5E> <5C5E> <CAF4>
+<5C60> <5C60> <CDC0>
+endbfrange
+
+100 beginbfrange
+<5C61> <5C61> <C2C5>
+<5C62> <5C62> <C2C5>
+<5C63> <5C63> <E5EF>
+<5C64> <5C64> <B2E3>
+<5C65> <5C65> <C2C4>
+<5C66> <5C66> <E5F0>
+<5C68> <5C68> <E5F0>
+<5C6C> <5C6C> <CAF4>
+<5C6E> <5C6E> <E5F8>
+<5C6F> <5C6F> <CDCD>
+<5C71> <5C71> <C9BD>
+<5C79> <5C79> <D2D9>
+<5C7A> <5C7A> <E1A8>
+<5C7F> <5C7F> <D3EC>
+<5C81> <5C81> <CBEA>
+<5C82> <5C82> <C6F1>
+<5C88> <5C88> <E1AC>
+<5C8C> <5C8C> <E1A7>
+<5C8D> <5C8D> <E1A9>
+<5C90> <5C90> <E1AA>
+<5C91> <5C91> <E1AF>
+<5C94> <5C94> <B2ED>
+<5C96> <5C96> <E1AB>
+<5C97> <5C97> <B8DA>
+<5C98> <5C99> <E1AD>
+<5C9A> <5C9A> <E1B0>
+<5C9B> <5C9B> <B5BA>
+<5C9C> <5C9C> <E1B1>
+<5CA1> <5CA1> <B8D4>
+<5CA2> <5CA2> <E1B3>
+<5CA3> <5CA3> <E1B8>
+<5CA9> <5CA9> <D1D2>
+<5CAB> <5CAB> <E1B6>
+<5CAC> <5CAC> <E1B5>
+<5CAD> <5CAD> <C1EB>
+<5CB1> <5CB1> <E1B7>
+<5CB3> <5CB3> <D4C0>
+<5CB5> <5CB5> <E1B2>
+<5CB7> <5CB7> <E1BA>
+<5CB8> <5CB8> <B0B6>
+<5CBD> <5CBD> <E1B4>
+<5CBF> <5CBF> <BFF9>
+<5CC1> <5CC1> <E1B9>
+<5CC4> <5CC4> <E1BB>
+<5CCB> <5CCB> <E1BE>
+<5CD2> <5CD2> <E1BC>
+<5CD9> <5CD9> <D6C5>
+<5CE1> <5CE1> <CFBF>
+<5CE4> <5CE4> <E1BD>
+<5CE5> <5CE5> <E1BF>
+<5CE6> <5CE6> <C2CD>
+<5CE8> <5CE8> <B6EB>
+<5CEA> <5CEA> <D3F8>
+<5CED> <5CED> <C7CD>
+<5CF0> <5CF0> <B7E5>
+<5CF4> <5CF4> <E1AD>
+<5CF6> <5CF6> <B5BA>
+<5CFB> <5CFB> <BEFE>
+<5CFD> <5CFD> <CFBF>
+<5D02> <5D03> <E1C0>
+<5D06> <5D06> <E1C7>
+<5D07> <5D07> <B3E7>
+<5D0D> <5D0D> <E1C1>
+<5D0E> <5D0E> <C6E9>
+<5D14> <5D14> <B4DE>
+<5D16> <5D16> <D1C2>
+<5D17> <5D17> <B8DA>
+<5D1B> <5D1B> <E1C8>
+<5D1E> <5D1E> <E1C6>
+<5D24> <5D24> <E1C5>
+<5D26> <5D26> <E1C3>
+<5D27> <5D27> <E1C2>
+<5D29> <5D29> <B1C0>
+<5D2C> <5D2C> <E1B4>
+<5D2D> <5D2D> <D5B8>
+<5D2E> <5D2E> <E1C4>
+<5D34> <5D34> <E1CB>
+<5D3D> <5D3D> <E1CC>
+<5D3E> <5D3E> <E1CA>
+<5D47> <5D47> <EFFA>
+<5D4A> <5D4A> <E1D3>
+<5D4B> <5D4B> <E1D2>
+<5D4C> <5D4C> <C7B6>
+<5D50> <5D50> <E1B0>
+<5D58> <5D58> <E1C9>
+<5D5B> <5D5B> <E1CE>
+<5D5D> <5D5D> <E1D0>
+<5D69> <5D69> <E1D4>
+<5D6B> <5D6B> <E1D1>
+<5D6C> <5D6C> <E1CD>
+<5D6F> <5D6F> <E1CF>
+<5D74> <5D74> <E1D5>
+<5D81> <5D81> <E1D0>
+<5D82> <5D82> <E1D6>
+<5D84> <5D84> <D5B8>
+<5D87> <5D87> <E1AB>
+<5D97> <5D97> <E1C0>
+<5D99> <5D99> <E1D7>
+<5D9D> <5D9D> <E1D8>
+<5DA0> <5DA0> <E1BD>
+endbfrange
+
+100 beginbfrange
+<5DA7> <5DA7> <E1BB>
+<5DB7> <5DB7> <E1DA>
+<5DB8> <5DB8> <E1C9>
+<5DBA> <5DBA> <C1EB>
+<5DBC> <5DBC> <D3EC>
+<5DC5> <5DC5> <E1DB>
+<5DCB> <5DCB> <BFF9>
+<5DCD> <5DCD> <CEA1>
+<5DD2> <5DD2> <C2CD>
+<5DD4> <5DD4> <E1DB>
+<5DDB> <5DDB> <E7DD>
+<5DDD> <5DDD> <B4A8>
+<5DDE> <5DDE> <D6DD>
+<5DE1> <5DE1> <D1B2>
+<5DE2> <5DE2> <B3B2>
+<5DE5> <5DE5> <B9A4>
+<5DE6> <5DE6> <D7F3>
+<5DE7> <5DE7> <C7C9>
+<5DE8> <5DE8> <BEDE>
+<5DE9> <5DE9> <B9AE>
+<5DEB> <5DEB> <CED7>
+<5DEE> <5DEE> <B2EE>
+<5DEF> <5DEF> <DBCF>
+<5DF0> <5DF0> <DBCF>
+<5DF1> <5DF1> <BCBA>
+<5DF2> <5DF2> <D2D1>
+<5DF3> <5DF3> <CBC8>
+<5DF4> <5DF4> <B0CD>
+<5DF7> <5DF7> <CFEF>
+<5DFD> <5DFD> <D9E3>
+<5DFE> <5DFE> <BDED>
+<5E01> <5E01> <B1D2>
+<5E02> <5E02> <CAD0>
+<5E03> <5E03> <B2BC>
+<5E05> <5E05> <CBA7>
+<5E06> <5E06> <B7AB>
+<5E08> <5E08> <CAA6>
+<5E0C> <5E0C> <CFA3>
+<5E0F> <5E0F> <E0F8>
+<5E10> <5E10> <D5CA>
+<5E11> <5E11> <E0FB>
+<5E14> <5E14> <E0FA>
+<5E15> <5E15> <C5C1>
+<5E16> <5E16> <CCFB>
+<5E18> <5E18> <C1B1>
+<5E19> <5E19> <E0F9>
+<5E1A> <5E1A> <D6E3>
+<5E1B> <5E1B> <B2AF>
+<5E1C> <5E1C> <D6C4>
+<5E1D> <5E1D> <B5DB>
+<5E25> <5E25> <CBA7>
+<5E26> <5E26> <B4F8>
+<5E27> <5E27> <D6A1>
+<5E2B> <5E2B> <CAA6>
+<5E2D> <5E2D> <CFAF>
+<5E2E> <5E2E> <B0EF>
+<5E31> <5E31> <E0FC>
+<5E33> <5E33> <D5CA>
+<5E36> <5E36> <B4F8>
+<5E37> <5E37> <E1A1>
+<5E38> <5E38> <B3A3>
+<5E3B> <5E3C> <E0FD>
+<5E3D> <5E3D> <C3B1>
+<5E40> <5E40> <D6A1>
+<5E42> <5E42> <C3DD>
+<5E43> <5E43> <E0F8>
+<5E44> <5E44> <E1A2>
+<5E45> <5E45> <B7F9>
+<5E4C> <5E4C> <BBCF>
+<5E54> <5E54> <E1A3>
+<5E55> <5E55> <C4BB>
+<5E57> <5E57> <E0FE>
+<5E58> <5E58> <E0FD>
+<5E5B> <5E5B> <E1A4>
+<5E5E> <5E5E> <E1A5>
+<5E5F> <5E5F> <D6C4>
+<5E61> <5E61> <E1A6>
+<5E62> <5E62> <B4B1>
+<5E63> <5E63> <B1D2>
+<5E6B> <5E6B> <B0EF>
+<5E6C> <5E6C> <E0FC>
+<5E72> <5E72> <B8C9>
+<5E73> <5E73> <C6BD>
+<5E74> <5E74> <C4EA>
+<5E76> <5E76> <B2A2>
+<5E78> <5E78> <D0D2>
+<5E79> <5E79> <B8C9>
+<5E7A> <5E7A> <E7DB>
+<5E7B> <5E7B> <BBC3>
+<5E7C> <5E7C> <D3D7>
+<5E7D> <5E7D> <D3C4>
+<5E7E> <5E7E> <BCB8>
+<5E7F> <5E7F> <B9E3>
+<5E80> <5E80> <E2CF>
+<5E84> <5E84> <D7AF>
+<5E86> <5E86> <C7EC>
+<5E87> <5E87> <B1D3>
+<5E8A> <5E8A> <B4B2>
+<5E8B> <5E8B> <E2D1>
+<5E8F> <5E8F> <D0F2>
+endbfrange
+
+100 beginbfrange
+<5E90> <5E90> <C2AE>
+<5E91> <5E91> <E2D0>
+<5E93> <5E93> <BFE2>
+<5E94> <5E94> <D3A6>
+<5E95> <5E95> <B5D7>
+<5E96> <5E96> <E2D2>
+<5E97> <5E97> <B5EA>
+<5E99> <5E99> <C3ED>
+<5E9A> <5E9A> <B8FD>
+<5E9C> <5E9C> <B8AE>
+<5E9E> <5E9E> <C5D3>
+<5E9F> <5E9F> <B7CF>
+<5EA0> <5EA0> <E2D4>
+<5EA5> <5EA5> <E2D3>
+<5EA6> <5EA6> <B6C8>
+<5EA7> <5EA7> <D7F9>
+<5EAB> <5EAB> <BFE2>
+<5EAD> <5EAD> <CDA5>
+<5EB3> <5EB3> <E2D8>
+<5EB5> <5EB5> <E2D6>
+<5EB6> <5EB6> <CAFC>
+<5EB7> <5EB7> <BFB5>
+<5EB8> <5EB8> <D3B9>
+<5EB9> <5EB9> <E2D5>
+<5EBE> <5EBE> <E2D7>
+<5EC9> <5EC9> <C1AE>
+<5ECA> <5ECA> <C0C8>
+<5ED1> <5ED1> <E2DB>
+<5ED2> <5ED2> <E2DA>
+<5ED3> <5ED3> <C0AA>
+<5ED6> <5ED6> <C1CE>
+<5EDB> <5EDB> <E2DC>
+<5EDF> <5EDF> <C3ED>
+<5EE0> <5EE0> <B3A7>
+<5EE1> <5EE1> <E2D0>
+<5EE2> <5EE2> <B7CF>
+<5EE3> <5EE3> <B9E3>
+<5EE8> <5EE8> <E2DD>
+<5EEA> <5EEA> <E2DE>
+<5EEC> <5EEC> <C2AE>
+<5EF3> <5EF3> <CCFC>
+<5EF4> <5EF4> <DBC8>
+<5EF6> <5EF6> <D1D3>
+<5EF7> <5EF7> <CDA2>
+<5EFA> <5EFA> <BDA8>
+<5EFE> <5EFE> <DEC3>
+<5EFF> <5EFF> <D8A5>
+<5F00> <5F00> <BFAA>
+<5F01> <5F01> <DBCD>
+<5F02> <5F02> <D2EC>
+<5F03> <5F03> <C6FA>
+<5F04> <5F04> <C5AA>
+<5F08> <5F08> <DEC4>
+<5F0A> <5F0A> <B1D7>
+<5F0B> <5F0B> <DFAE>
+<5F0F> <5F0F> <CABD>
+<5F11> <5F11> <DFB1>
+<5F13> <5F13> <B9AD>
+<5F15> <5F15> <D2FD>
+<5F17> <5F17> <B8A5>
+<5F18> <5F18> <BAEB>
+<5F1B> <5F1B> <B3DA>
+<5F1F> <5F1F> <B5DC>
+<5F20> <5F20> <D5C5>
+<5F25> <5F25> <C3D6>
+<5F26> <5F26> <CFD2>
+<5F27> <5F27> <BBA1>
+<5F29> <5F29> <E5F3>
+<5F2A> <5F2A> <E5F2>
+<5F2D> <5F2D> <E5F4>
+<5F2F> <5F2F> <CDE4>
+<5F31> <5F31> <C8F5>
+<5F33> <5F33> <E5F2>
+<5F35> <5F35> <D5C5>
+<5F39> <5F39> <B5AF>
+<5F3A> <5F3A> <C7BF>
+<5F3C> <5F3C> <E5F6>
+<5F40> <5F40> <ECB0>
+<5F46> <5F46> <B1F0>
+<5F48> <5F48> <B5AF>
+<5F4C> <5F4C> <C3D6>
+<5F4E> <5F4E> <CDE4>
+<5F50> <5F50> <E5E6>
+<5F52> <5F52> <B9E9>
+<5F53> <5F53> <B5B1>
+<5F55> <5F55> <C2BC>
+<5F56> <5F56> <E5E8>
+<5F57> <5F57> <E5E7>
+<5F58> <5F58> <E5E9>
+<5F59> <5F59> <BBE3>
+<5F5D> <5F5D> <D2CD>
+<5F61> <5F61> <E1EA>
+<5F62> <5F62> <D0CE>
+<5F64> <5F64> <CDAE>
+<5F66> <5F66> <D1E5>
+<5F69> <5F69> <B2CA>
+<5F6A> <5F6A> <B1EB>
+<5F6C> <5F6C> <B1F2>
+<5F6D> <5F6D> <C5ED>
+<5F70> <5F70> <D5C3>
+endbfrange
+
+100 beginbfrange
+<5F71> <5F71> <D3B0>
+<5F73> <5F73> <E1DC>
+<5F77> <5F77> <E1DD>
+<5F79> <5F79> <D2DB>
+<5F7B> <5F7B> <B3B9>
+<5F7C> <5F7C> <B1CB>
+<5F80> <5F80> <CDF9>
+<5F81> <5F81> <D5F7>
+<5F82> <5F82> <E1DE>
+<5F84> <5F84> <BEB6>
+<5F85> <5F85> <B4FD>
+<5F87> <5F87> <E1DF>
+<5F88> <5F88> <BADC>
+<5F89> <5F89> <E1E0>
+<5F8A> <5F8A> <BBB2>
+<5F8B> <5F8B> <C2C9>
+<5F8C> <5F8C> <E1E1>
+<5F90> <5F90> <D0EC>
+<5F91> <5F91> <BEB6>
+<5F92> <5F92> <CDBD>
+<5F95> <5F95> <E1E2>
+<5F97> <5F97> <B5C3>
+<5F98> <5F98> <C5C7>
+<5F99> <5F99> <E1E3>
+<5F9C> <5F9C> <E1E4>
+<5F9E> <5F9E> <B4D3>
+<5FA0> <5FA0> <E1E2>
+<5FA1> <5FA1> <D3F9>
+<5FA8> <5FA8> <E1E5>
+<5FA9> <5FA9> <B8B4>
+<5FAA> <5FAA> <D1AD>
+<5FAD> <5FAD> <E1E6>
+<5FAE> <5FAE> <CEA2>
+<5FB5> <5FB5> <E1E7>
+<5FB7> <5FB7> <B5C2>
+<5FB9> <5FB9> <B3B9>
+<5FBC> <5FBC> <E1E8>
+<5FBD> <5FBD> <BBD5>
+<5FC3> <5FC3> <D0C4>
+<5FC4> <5FC4> <E2E0>
+<5FC5> <5FC5> <B1D8>
+<5FC6> <5FC6> <D2E4>
+<5FC9> <5FC9> <E2E1>
+<5FCC> <5FCC> <BCC9>
+<5FCD> <5FCD> <C8CC>
+<5FCF> <5FCF> <E2E3>
+<5FD0> <5FD0> <ECFE>
+<5FD1> <5FD1> <ECFD>
+<5FD2> <5FD2> <DFAF>
+<5FD6> <5FD6> <E2E2>
+<5FD7> <5FD7> <D6BE>
+<5FD8> <5FD8> <CDFC>
+<5FD9> <5FD9> <C3A6>
+<5FDD> <5FDD> <E3C3>
+<5FE0> <5FE0> <D6D2>
+<5FE1> <5FE1> <E2E7>
+<5FE4> <5FE4> <E2E8>
+<5FE7> <5FE7> <D3C7>
+<5FEA> <5FEA> <E2EC>
+<5FEB> <5FEB> <BFEC>
+<5FED> <5FED> <E2ED>
+<5FEE> <5FEE> <E2E5>
+<5FF1> <5FF1> <B3C0>
+<5FF5> <5FF5> <C4EE>
+<5FF8> <5FF8> <E2EE>
+<5FFB> <5FFB> <D0C3>
+<5FFD> <5FFD> <BAF6>
+<5FFE> <5FFE> <E2E9>
+<5FFF> <5FFF> <B7DE>
+<6000> <6000> <BBB3>
+<6001> <6001> <CCAC>
+<6002> <6002> <CBCB>
+<6003> <6003> <E2E4>
+<6004> <6004> <E2E6>
+<6005> <6006> <E2EA>
+<600A> <600A> <E2F7>
+<600D> <600D> <E2F4>
+<600E> <600E> <D4F5>
+<600F> <600F> <E2F3>
+<6012> <6012> <C5AD>
+<6014> <6014> <D5FA>
+<6015> <6015> <C5C2>
+<6016> <6016> <B2C0>
+<6019> <6019> <E2EF>
+<601B> <601B> <E2F2>
+<601C> <601C> <C1AF>
+<601D> <601D> <CBBC>
+<6020> <6020> <B5A1>
+<6021> <6021> <E2F9>
+<6025> <6025> <BCB1>
+<6026> <6026> <E2F1>
+<6027> <6027> <D0D4>
+<6028> <6028> <D4B9>
+<6029> <6029> <E2F5>
+<602A> <602A> <B9D6>
+<602B> <602B> <E2F6>
+<602F> <602F> <C7D3>
+<6035> <6035> <E2F0>
+<603B> <603B> <D7DC>
+<603C> <603C> <EDA1>
+endbfrange
+
+100 beginbfrange
+<603F> <603F> <E2F8>
+<6041> <6041> <EDA5>
+<6042> <6042> <E2FE>
+<6043> <6043> <CAD1>
+<604B> <604B> <C1B5>
+<604D> <604D> <BBD0>
+<6050> <6050> <BFD6>
+<6052> <6052> <BAE3>
+<6055> <6055> <CBA1>
+<6059> <6059> <EDA6>
+<605A> <605A> <EDA3>
+<605D> <605D> <EDA2>
+<6062> <6062> <BBD6>
+<6063> <6063> <EDA7>
+<6064> <6064> <D0F4>
+<6067> <6067> <EDA4>
+<6068> <6068> <BADE>
+<6069> <6069> <B6F7>
+<606A> <606A> <E3A1>
+<606B> <606B> <B6B2>
+<606C> <606C> <CCF1>
+<606D> <606D> <B9A7>
+<606F> <606F> <CFA2>
+<6070> <6070> <C7A1>
+<6073> <6073> <BFD2>
+<6076> <6076> <B6F1>
+<6078> <6079> <E2FA>
+<607A> <607A> <E2FD>
+<607B> <607B> <E2FC>
+<607C> <607C> <C4D5>
+<607D> <607D> <E3A2>
+<607F> <607F> <D3C1>
+<6083> <6083> <E3A7>
+<6084> <6084> <C7C4>
+<6089> <6089> <CFA4>
+<608C> <608C> <E3A9>
+<608D> <608D> <BAB7>
+<6092> <6092> <E3A8>
+<6094> <6094> <BBDA>
+<6096> <6096> <E3A3>
+<609A> <609A> <E3A4>
+<609B> <609B> <E3AA>
+<609D> <609D> <E3A6>
+<609F> <609F> <CEF2>
+<60A0> <60A0> <D3C6>
+<60A3> <60A3> <BBBC>
+<60A6> <60A6> <D4C3>
+<60A8> <60A8> <C4FA>
+<60AB> <60AB> <EDA8>
+<60AC> <60AC> <D0FC>
+<60AD> <60AD> <E3A5>
+<60AF> <60AF> <C3F5>
+<60B1> <60B1> <E3AD>
+<60B2> <60B2> <B1AF>
+<60B4> <60B4> <E3B2>
+<60B5> <60B5> <E2EA>
+<60B6> <60B6> <C3C6>
+<60B8> <60B8> <BCC2>
+<60BB> <60BB> <E3AC>
+<60BC> <60BC> <B5BF>
+<60C5> <60C5> <C7E9>
+<60C6> <60C6> <E3B0>
+<60CA> <60CA> <BEAA>
+<60CB> <60CB> <CDEF>
+<60D1> <60D1> <BBF3>
+<60D5> <60D5> <CCE8>
+<60D8> <60D8> <E3AF>
+<60DA> <60DA> <E3B1>
+<60DC> <60DC> <CFA7>
+<60DD> <60DD> <E3AE>
+<60DF> <60DF> <CEA9>
+<60E0> <60E0> <BBDD>
+<60E1> <60E1> <B6F1>
+<60E6> <60E6> <B5EB>
+<60E7> <60E7> <BEE5>
+<60E8> <60E8> <B2D2>
+<60E9> <60E9> <B3CD>
+<60EB> <60EB> <B1B9>
+<60EC> <60EC> <E3AB>
+<60ED> <60ED> <B2D1>
+<60EE> <60EE> <B5AC>
+<60EF> <60EF> <B9DF>
+<60F0> <60F0> <B6E8>
+<60F1> <60F1> <C4D5>
+<60F2> <60F2> <E3A2>
+<60F3> <60F3> <CFEB>
+<60F4> <60F4> <E3B7>
+<60F6> <60F6> <BBCC>
+<60F9> <60F9> <C8C7>
+<60FA> <60FA> <D0CA>
+<60FB> <60FB> <E2FC>
+<6100> <6100> <E3B8>
+<6101> <6101> <B3EE>
+<6106> <6106> <EDA9>
+<6108> <6108> <D3FA>
+<6109> <6109> <D3E4>
+<610D> <610D> <EDAA>
+<610E> <610E> <E3B9>
+<610F> <610F> <D2E2>
+<6115> <6115> <E3B5>
+endbfrange
+
+100 beginbfrange
+<611A> <611A> <D3DE>
+<611B> <611B> <B0AE>
+<611C> <611C> <E3AB>
+<611F> <611F> <B8D0>
+<6120> <6120> <E3B3>
+<6123> <6123> <E3B6>
+<6124> <6124> <B7DF>
+<6126> <6126> <E3B4>
+<6127> <6127> <C0A2>
+<612B> <612B> <E3BA>
+<6134> <6134> <E2EB>
+<6137> <6137> <E2FD>
+<613E> <613E> <E2E9>
+<613F> <613F> <D4B8>
+<6148> <6148> <B4C8>
+<614A> <614A> <E3BB>
+<614B> <614B> <CCAC>
+<614C> <614C> <BBC5>
+<614E> <614E> <C9F7>
+<6151> <6151> <C9E5>
+<6155> <6155> <C4BD>
+<6158> <6158> <B2D2>
+<615A> <615A> <B2D1>
+<615D> <615D> <EDAB>
+<615F> <615F> <E2FA>
+<6162> <6162> <C2FD>
+<6163> <6163> <B9DF>
+<6164> <6164> <EDA8>
+<6167> <6167> <BBDB>
+<6168> <6168> <BFAE>
+<616A> <616A> <E2E6>
+<616B> <616B> <CBCB>
+<616E> <616E> <C2C7>
+<6170> <6170> <CEBF>
+<6173> <6173> <E3A5>
+<6175> <6175> <E3BC>
+<6176> <6176> <C7EC>
+<6177> <6177> <BFB6>
+<6182> <6182> <D3C7>
+<618A> <618A> <B1B9>
+<618B> <618B> <B1EF>
+<618E> <618E> <D4F7>
+<6190> <6190> <C1AF>
+<6191> <6191> <C6BE>
+<6192> <6192> <E3B4>
+<6194> <6194> <E3BE>
+<619A> <619A> <B5AC>
+<619D> <619D> <EDAD>
+<61A4> <61A4> <B7DF>
+<61A7> <61A7> <E3BF>
+<61A8> <61A8> <BAA9>
+<61A9> <61A9> <EDAC>
+<61AB> <61AB> <C3F5>
+<61AC> <61AC> <E3BD>
+<61AE> <61AE> <E2E4>
+<61B2> <61B2> <CFDC>
+<61B6> <61B6> <D2E4>
+<61B7> <61B7> <E3C0>
+<61BE> <61BE> <BAB6>
+<61C2> <61C2> <B6AE>
+<61C7> <61C7> <BFD2>
+<61C8> <61C8> <D0B8>
+<61C9> <61C9> <D3A6>
+<61CA> <61CA> <B0C3>
+<61CB> <61CB> <EDAE>
+<61CC> <61CC> <E2F8>
+<61D1> <61D1> <EDAF>
+<61D2> <61D2> <C0C1>
+<61D4> <61D4> <E3C1>
+<61DE> <61DE> <C3C9>
+<61DF> <61DF> <EDA1>
+<61E3> <61E3> <EDAF>
+<61E6> <61E6> <C5B3>
+<61E8> <61E8> <E2FB>
+<61F2> <61F2> <B3CD>
+<61F5> <61F5> <E3C2>
+<61F6> <61F6> <C0C1>
+<61F7> <61F7> <BBB3>
+<61F8> <61F8> <D0FC>
+<61FA> <61FA> <E2E3>
+<61FC> <61FC> <BEE5>
+<61FE> <61FE> <C9E5>
+<61FF> <61FF> <DCB2>
+<6200> <6200> <C1B5>
+<6206> <6206> <EDB0>
+<6207> <6207> <EDB0>
+<6208> <6208> <B8EA>
+<620A> <620A> <CEEC>
+<620B> <620B> <EAA7>
+<620C> <620C> <D0E7>
+<620D> <620D> <CAF9>
+<620E> <620E> <C8D6>
+<620F> <620F> <CFB7>
+<6210> <6210> <B3C9>
+<6211> <6211> <CED2>
+<6212> <6212> <BDE4>
+<6214> <6214> <EAA7>
+<6215> <6215> <E3DE>
+<6216> <6216> <BBF2>
+<6217> <6217> <EAA8>
+endbfrange
+
+100 beginbfrange
+<6218> <6218> <D5BD>
+<621A> <621A> <C6DD>
+<621B> <621B> <EAA9>
+<621F> <621F> <EAAA>
+<6221> <6221> <EAAC>
+<6222> <6222> <EAAB>
+<6224> <6224> <EAAE>
+<6225> <6225> <EAAD>
+<6227> <6227> <EAA8>
+<622A> <622A> <BDD8>
+<622C> <622C> <EAAF>
+<622E> <622E> <C2BE>
+<6230> <6230> <D5BD>
+<6232> <6232> <CFB7>
+<6233> <6233> <B4C1>
+<6234> <6234> <B4F7>
+<6237> <6237> <BBA7>
+<623D> <623D> <ECE6>
+<623E> <623E> <ECE5>
+<623F> <623F> <B7BF>
+<6240> <6240> <CBF9>
+<6241> <6241> <B1E2>
+<6243> <6243> <ECE7>
+<6247> <6247> <C9C8>
+<6248> <6249> <ECE8>
+<624B> <624B> <CAD6>
+<624C> <624C> <DED0>
+<624D> <624D> <B2C5>
+<624E> <624E> <D4FA>
+<6251> <6251> <C6CB>
+<6252> <6252> <B0C7>
+<6253> <6253> <B4F2>
+<6254> <6254> <C8D3>
+<6258> <6258> <CDD0>
+<625B> <625B> <BFB8>
+<6263> <6263> <BFDB>
+<6266> <6266> <C7A4>
+<6267> <6267> <D6B4>
+<6269> <6269> <C0A9>
+<626A> <626A> <DED1>
+<626B> <626B> <C9A8>
+<626C> <626C> <D1EF>
+<626D> <626D> <C5A4>
+<626E> <626E> <B0E7>
+<626F> <626F> <B3B6>
+<6270> <6270> <C8C5>
+<6273> <6273> <B0E2>
+<6276> <6276> <B7F6>
+<6279> <6279> <C5FA>
+<627C> <627C> <B6F3>
+<627E> <627E> <D5D2>
+<627F> <627F> <B3D0>
+<6280> <6280> <BCBC>
+<6284> <6284> <B3AD>
+<6289> <6289> <BEF1>
+<628A> <628A> <B0D1>
+<6291> <6291> <D2D6>
+<6292> <6292> <CAE3>
+<6293> <6293> <D7A5>
+<6295> <6295> <CDB6>
+<6296> <6296> <B6B6>
+<6297> <6297> <BFB9>
+<6298> <6298> <D5DB>
+<629A> <629A> <B8A7>
+<629B> <629B> <C5D7>
+<629F> <629F> <DED2>
+<62A0> <62A0> <BFD9>
+<62A1> <62A1> <C2D5>
+<62A2> <62A2> <C7C0>
+<62A4> <62A4> <BBA4>
+<62A5> <62A5> <B1A8>
+<62A8> <62A8> <C5EA>
+<62AB> <62AB> <C5FB>
+<62AC> <62AC> <CCA7>
+<62B1> <62B1> <B1A7>
+<62B5> <62B5> <B5D6>
+<62B9> <62B9> <C4A8>
+<62BB> <62BB> <DED3>
+<62BC> <62BC> <D1BA>
+<62BD> <62BD> <B3E9>
+<62BF> <62BF> <C3F2>
+<62C2> <62C2> <B7F7>
+<62C4> <62C4> <D6F4>
+<62C5> <62C5> <B5A3>
+<62C6> <62C6> <B2F0>
+<62C7> <62C7> <C4B4>
+<62C8> <62C8> <C4E9>
+<62C9> <62C9> <C0AD>
+<62CA> <62CA> <DED4>
+<62CC> <62CC> <B0E8>
+<62CD> <62CD> <C5C4>
+<62CE> <62CE> <C1E0>
+<62D0> <62D0> <B9D5>
+<62D2> <62D2> <BEDC>
+<62D3> <62D3> <CDD8>
+<62D4> <62D4> <B0CE>
+<62D6> <62D6> <CDCF>
+<62D7> <62D7> <DED6>
+<62D8> <62D8> <BED0>
+<62D9> <62D9> <D7BE>
+endbfrange
+
+100 beginbfrange
+<62DA> <62DA> <DED5>
+<62DB> <62DB> <D5D0>
+<62DC> <62DC> <B0DD>
+<62DF> <62DF> <C4E2>
+<62E2> <62E2> <C2A3>
+<62E3> <62E3> <BCF0>
+<62E5> <62E5> <D3B5>
+<62E6> <62E6> <C0B9>
+<62E7> <62E7> <C5A1>
+<62E8> <62E8> <B2A6>
+<62E9> <62E9> <D4F1>
+<62EC> <62EC> <C0A8>
+<62ED> <62ED> <CAC3>
+<62EE> <62EE> <DED7>
+<62EF> <62EF> <D5FC>
+<62F1> <62F1> <B9B0>
+<62F3> <62F3> <C8AD>
+<62F4> <62F4> <CBA9>
+<62F6> <62F6> <DED9>
+<62F7> <62F7> <BFBD>
+<62FC> <62FC> <C6B4>
+<62FD> <62FD> <D7A7>
+<62FE> <62FE> <CAB0>
+<62FF> <62FF> <C4C3>
+<6301> <6301> <B3D6>
+<6302> <6302> <B9D2>
+<6307> <6307> <D6B8>
+<6308> <6308> <EAFC>
+<6309> <6309> <B0B4>
+<630E> <630E> <BFE6>
+<6311> <6311> <CCF4>
+<6316> <6316> <CDDA>
+<631A> <631A> <D6BF>
+<631B> <631B> <C2CE>
+<631D> <631D> <CECE>
+<631E> <631E> <CCA2>
+<631F> <631F> <D0AE>
+<6320> <6320> <C4D3>
+<6321> <6321> <B5B2>
+<6322> <6322> <DED8>
+<6323> <6323> <D5F5>
+<6324> <6324> <BCB7>
+<6325> <6325> <BBD3>
+<6328> <6328> <B0A4>
+<632A> <632A> <C5B2>
+<632B> <632B> <B4EC>
+<632F> <632F> <D5F1>
+<6332> <6332> <EAFD>
+<6339> <6339> <DEDA>
+<633A> <633A> <CDA6>
+<633D> <633D> <CDEC>
+<633E> <633E> <D0AE>
+<6342> <6342> <CEE6>
+<6343> <6343> <DEDC>
+<6345> <6345> <CDB1>
+<6346> <6346> <C0A6>
+<6349> <6349> <D7BD>
+<634B> <634B> <DEDB>
+<634C> <634C> <B0C6>
+<634D> <634D> <BAB4>
+<634E> <634E> <C9D3>
+<634F> <634F> <C4F3>
+<6350> <6350> <BEE8>
+<6355> <6355> <B2B6>
+<635E> <635E> <C0CC>
+<635F> <635F> <CBF0>
+<6361> <6361> <BCF1>
+<6362> <6362> <BBBB>
+<6363> <6363> <B5B7>
+<6367> <6367> <C5F5>
+<6368> <6368> <C9E1>
+<6369> <6369> <DEE6>
+<636B> <636B> <DED1>
+<636D> <636D> <DEE3>
+<636E> <636E> <BEDD>
+<6371> <6371> <DEDF>
+<6372> <6372> <BEED>
+<6376> <6376> <B4B7>
+<6377> <6377> <BDDD>
+<637A> <637A> <DEE0>
+<637B> <637B> <C4ED>
+<6380> <6380> <CFC6>
+<6382> <6382> <B5E0>
+<6383> <6383> <C9A8>
+<6384> <6384> <C2D5>
+<6387> <6387> <B6DE>
+<6388> <6388> <CADA>
+<6389> <6389> <B5F4>
+<638A> <638A> <DEE5>
+<638C> <638C> <D5C6>
+<638E> <638E> <DEE1>
+<638F> <638F> <CCCD>
+<6390> <6390> <C6FE>
+<6392> <6392> <C5C5>
+<6396> <6396> <D2B4>
+<6398> <6398> <BEF2>
+<63A0> <63A0> <C2D3>
+<63A2> <63A2> <CCBD>
+<63A3> <63A3> <B3B8>
+<63A5> <63A5> <BDD3>
+endbfrange
+
+100 beginbfrange
+<63A7> <63A7> <BFD8>
+<63A8> <63A8> <CDC6>
+<63A9> <63A9> <D1DA>
+<63AA> <63AA> <B4EB>
+<63AC> <63AC> <DEE4>
+<63AD> <63AD> <DEDD>
+<63AE> <63AE> <DEE7>
+<63B0> <63B0> <EAFE>
+<63B3> <63B3> <C2B0>
+<63B4> <63B4> <DEE2>
+<63B7> <63B7> <D6C0>
+<63B8> <63B8> <B5A7>
+<63BA> <63BA> <B2F4>
+<63BC> <63BC> <DEE8>
+<63BE> <63BE> <DEF2>
+<63C0> <63C0> <BCF0>
+<63C4> <63C4> <DEED>
+<63C6> <63C6> <DEF1>
+<63C9> <63C9> <C8E0>
+<63CD> <63CD> <D7E1>
+<63CE> <63CE> <DEEF>
+<63CF> <63CF> <C3E8>
+<63D0> <63D0> <CCE1>
+<63D2> <63D2> <B2E5>
+<63D6> <63D6> <D2BE>
+<63DA> <63DA> <D1EF>
+<63DE> <63DE> <DEEE>
+<63E0> <63E0> <DEEB>
+<63E1> <63E1> <CED5>
+<63E3> <63E3> <B4A7>
+<63E9> <63E9> <BFAB>
+<63EA> <63EA> <BEBE>
+<63ED> <63ED> <BDD2>
+<63EE> <63EE> <BBD3>
+<63F2> <63F2> <DEE9>
+<63F4> <63F4> <D4AE>
+<63F6> <63F6> <DEDE>
+<63F8> <63F8> <DEEA>
+<63FD> <63FD> <C0BF>
+<63FF> <63FF> <DEEC>
+<6400> <6400> <B2F3>
+<6401> <6401> <B8E9>
+<6402> <6402> <C2A7>
+<6405> <6405> <BDC1>
+<640B> <640B> <DEF5>
+<640C> <640C> <DEF8>
+<640D> <640D> <CBF0>
+<640F> <640F> <B2AB>
+<6410> <6410> <B4A4>
+<6413> <6413> <B4EA>
+<6414> <6414> <C9A6>
+<6417> <6417> <B5B7>
+<641B> <641B> <DEF6>
+<641C> <641C> <CBD1>
+<641E> <641E> <B8E3>
+<6420> <6420> <DEF7>
+<6421> <6421> <DEFA>
+<6426> <6426> <DEF9>
+<642A> <642A> <CCC2>
+<642C> <642C> <B0E1>
+<642D> <642D> <B4EE>
+<6434> <6434> <E5BA>
+<6436> <6436> <C7C0>
+<643A> <643A> <D0AF>
+<643D> <643D> <B2EB>
+<643F> <643F> <EBA1>
+<6441> <6441> <DEF4>
+<6444> <6444> <C9E3>
+<6445> <6445> <DEF3>
+<6446> <6446> <B0DA>
+<6447> <6447> <D2A1>
+<6448> <6448> <B1F7>
+<644A> <644A> <CCAF>
+<6451> <6451> <DEE2>
+<6452> <6452> <DEF0>
+<6454> <6454> <CBA4>
+<6458> <6458> <D5AA>
+<645C> <645C> <DEE8>
+<645E> <645E> <DEFB>
+<645F> <645F> <C2A7>
+<6467> <6467> <B4DD>
+<6469> <6469> <C4A6>
+<646D> <646D> <DEFD>
+<646F> <646F> <D6BF>
+<6473> <6473> <BFD9>
+<6476> <6476> <DED2>
+<6478> <6478> <C3FE>
+<6479> <6479> <C4A1>
+<647A> <647A> <DFA1>
+<647B> <647B> <B2F4>
+<6482> <6482> <C1CC>
+<6484> <6484> <DEFC>
+<6485> <6485> <BEEF>
+<6487> <6487> <C6B2>
+<6488> <6488> <C0CC>
+<6491> <6491> <B3C5>
+<6492> <6492> <C8F6>
+<6493> <6493> <C4D3>
+<6495> <6495> <CBBA>
+<6496> <6496> <DEFE>
+endbfrange
+
+100 beginbfrange
+<6499> <6499> <DFA4>
+<649E> <649E> <D7B2>
+<649F> <649F> <DED8>
+<64A3> <64A3> <B5A7>
+<64A4> <64A4> <B3B7>
+<64A5> <64A5> <B2A6>
+<64A9> <64A9> <C1C3>
+<64AB> <64AB> <B8A7>
+<64AC> <64AC> <C7CB>
+<64AD> <64AD> <B2A5>
+<64AE> <64AE> <B4E9>
+<64B0> <64B0> <D7AB>
+<64B2> <64B2> <C6CB>
+<64B3> <64B3> <DEEC>
+<64B5> <64B5> <C4EC>
+<64B7> <64B8> <DFA2>
+<64BA> <64BA> <DFA5>
+<64BB> <64BB> <CCA2>
+<64BC> <64BC> <BAB3>
+<64BE> <64BE> <CECE>
+<64BF> <64BF> <BCF1>
+<64C0> <64C0> <DFA6>
+<64C1> <64C1> <D3B5>
+<64C2> <64C2> <C0DE>
+<64C4> <64C4> <C2B0>
+<64C5> <64C5> <C9C3>
+<64C7> <64C7> <D4F1>
+<64CA> <64CA> <BBF7>
+<64CB> <64CB> <B5B2>
+<64CD> <64CD> <B2D9>
+<64CE> <64CE> <C7E6>
+<64D0> <64D0> <DFA7>
+<64D2> <64D2> <C7DC>
+<64D4> <64D4> <B5A3>
+<64D7> <64D7> <DFA8>
+<64D8> <64D8> <EBA2>
+<64DA> <64DA> <BEDD>
+<64DE> <64DE> <CBD3>
+<64E0> <64E0> <BCB7>
+<64E2> <64E2> <DFAA>
+<64E4> <64E4> <DFA9>
+<64E6> <64E6> <B2C1>
+<64EC> <64EC> <C4E2>
+<64EF> <64EF> <B1F7>
+<64F0> <64F0> <C5A1>
+<64F1> <64F1> <B8E9>
+<64F2> <64F2> <D6C0>
+<64F4> <64F4> <C0A9>
+<64F7> <64F7> <DFA2>
+<64FA> <64FA> <B0DA>
+<64FB> <64FB> <CBD3>
+<64FC> <64FC> <DFA3>
+<64FE> <64FE> <C8C5>
+<6500> <6500> <C5CA>
+<6504> <6504> <DEF3>
+<6506> <6506> <C4EC>
+<6509> <6509> <DFAB>
+<650F> <650F> <C2A3>
+<6512> <6512> <D4DC>
+<6514> <6514> <C0B9>
+<6516> <6516> <DEFC>
+<6518> <6518> <C8C1>
+<6519> <6519> <B2F3>
+<651B> <651B> <DFA5>
+<651D> <651D> <C9E3>
+<6522> <6522> <D4DC>
+<6523> <6523> <C2CE>
+<6524> <6524> <CCAF>
+<6525> <6525> <DFAC>
+<652A> <652A> <BDC1>
+<652B> <652B> <BEF0>
+<652C> <652C> <C0BF>
+<652E> <652E> <DFAD>
+<652F> <652F> <D6A7>
+<6534> <6534> <EAB7>
+<6535> <6535> <EBB6>
+<6536> <6536> <CAD5>
+<6538> <6538> <D8FC>
+<6539> <6539> <B8C4>
+<653B> <653B> <B9A5>
+<653E> <653E> <B7C5>
+<653F> <653F> <D5FE>
+<6545> <6545> <B9CA>
+<6548> <6548> <D0A7>
+<6549> <6549> <F4CD>
+<654C> <654C> <B5D0>
+<654F> <654F> <C3F4>
+<6551> <6551> <BEC8>
+<6555> <6555> <EBB7>
+<6556> <6556> <B0BD>
+<6557> <6557> <B0DC>
+<6559> <6559> <BDCC>
+<655B> <655B> <C1B2>
+<655D> <655D> <B1D6>
+<655E> <655E> <B3A8>
+<6562> <6562> <B8D2>
+<6563> <6563> <C9A2>
+<6566> <6566> <B6D8>
+<656B> <656B> <EBB8>
+<656C> <656C> <BEB4>
+endbfrange
+
+100 beginbfrange
+<6570> <6570> <CAFD>
+<6572> <6572> <C7C3>
+<6574> <6574> <D5FB>
+<6575> <6575> <B5D0>
+<6577> <6577> <B7F3>
+<6578> <6578> <CAFD>
+<6582> <6582> <C1B2>
+<6583> <6583> <B1D0>
+<6587> <6587> <CEC4>
+<658B> <658B> <D5AB>
+<658C> <658C> <B1F3>
+<6590> <6590> <ECB3>
+<6591> <6591> <B0DF>
+<6593> <6593> <ECB5>
+<6595> <6595> <ECB5>
+<6597> <6597> <B6B7>
+<6599> <6599> <C1CF>
+<659B> <659B> <F5FA>
+<659C> <659C> <D0B1>
+<659F> <659F> <D5E5>
+<65A1> <65A1> <CED3>
+<65A4> <65A4> <BDEF>
+<65A5> <65A5> <B3E2>
+<65A7> <65A7> <B8AB>
+<65A9> <65A9> <D5B6>
+<65AB> <65AB> <EDBD>
+<65AC> <65AC> <D5B6>
+<65AD> <65AD> <B6CF>
+<65AF> <65AF> <CBB9>
+<65B0> <65B0> <D0C2>
+<65B7> <65B7> <B6CF>
+<65B9> <65B9> <B7BD>
+<65BC> <65BC> <ECB6>
+<65BD> <65BD> <CAA9>
+<65C1> <65C1> <C5D4>
+<65C3> <65C3> <ECB9>
+<65C4> <65C4> <ECB8>
+<65C5> <65C5> <C2C3>
+<65C6> <65C6> <ECB7>
+<65CB> <65CB> <D0FD>
+<65CC> <65CC> <ECBA>
+<65CE> <65CE> <ECBB>
+<65CF> <65CF> <D7E5>
+<65D2> <65D2> <ECBC>
+<65D6> <65D6> <ECBD>
+<65D7> <65D7> <C6EC>
+<65E0> <65E0> <CEDE>
+<65E2> <65E2> <BCC8>
+<65E5> <65E5> <C8D5>
+<65E6> <65E6> <B5A9>
+<65E7> <65E7> <BEC9>
+<65E8> <65E8> <D6BC>
+<65E9> <65E9> <D4E7>
+<65EC> <65EC> <D1AE>
+<65ED> <65ED> <D0F1>
+<65EE> <65F0> <EAB8>
+<65F1> <65F1> <BAB5>
+<65F6> <65F6> <CAB1>
+<65F7> <65F7> <BFF5>
+<65FA> <65FA> <CDFA>
+<6600> <6600> <EAC0>
+<6602> <6602> <B0BA>
+<6603> <6603> <EABE>
+<6606> <6606> <C0A5>
+<660A> <660A> <EABB>
+<660C> <660C> <B2FD>
+<660E> <660E> <C3F7>
+<660F> <660F> <BBE8>
+<6613> <6613> <D2D7>
+<6614> <6614> <CEF4>
+<6615> <6615> <EABF>
+<6619> <6619> <EABC>
+<661D> <661D> <EAC3>
+<661F> <661F> <D0C7>
+<6620> <6620> <D3B3>
+<6625> <6625> <B4BA>
+<6627> <6627> <C3C1>
+<6628> <6628> <D7F2>
+<662D> <662D> <D5D1>
+<662F> <662F> <CAC7>
+<6631> <6631> <EAC5>
+<6634> <6634> <EAC4>
+<6635> <6635> <EAC7>
+<6636> <6636> <EAC6>
+<663C> <663C> <D6E7>
+<663E> <663E> <CFD4>
+<6641> <6641> <EACB>
+<6642> <6642> <CAB1>
+<6643> <6643> <BBCE>
+<664B> <664B> <BDFA>
+<664C> <664C> <C9CE>
+<664F> <664F> <EACC>
+<6652> <6652> <C9B9>
+<6653> <6653> <CFFE>
+<6654> <6654> <EACA>
+<6655> <6655> <D4CE>
+<6656> <6656> <EACD>
+<6657> <6657> <EACF>
+<665A> <665A> <CDED>
+<665D> <665D> <D6E7>
+endbfrange
+
+100 beginbfrange
+<665F> <665F> <EAC9>
+<6661> <6661> <EACE>
+<6664> <6664> <CEEE>
+<6666> <6666> <BBDE>
+<6668> <6668> <B3BF>
+<666E> <666E> <C6D5>
+<666F> <666F> <BEB0>
+<6670> <6670> <CEFA>
+<6674> <6674> <C7E7>
+<6676> <6676> <BEA7>
+<6677> <6677> <EAD0>
+<667A> <667A> <D6C7>
+<667E> <667E> <C1C0>
+<6682> <6682> <D4DD>
+<6684> <6684> <EAD1>
+<6687> <6687> <CFBE>
+<6688> <6688> <D4CE>
+<6689> <6689> <EACD>
+<668C> <668C> <EAD2>
+<6691> <6691> <CAEE>
+<6696> <6696> <C5AF>
+<6697> <6697> <B0B5>
+<669D> <669D> <EAD4>
+<66A2> <66A2> <B3A9>
+<66A7> <66A7> <EAD3>
+<66A8> <66A8> <F4DF>
+<66AB> <66AB> <D4DD>
+<66AE> <66AE> <C4BA>
+<66B4> <66B4> <B1A9>
+<66B9> <66B9> <E5DF>
+<66BE> <66BE> <EAD5>
+<66C4> <66C4> <EACA>
+<66C6> <66C6> <C0FA>
+<66C7> <66C7> <EABC>
+<66C9> <66C9> <CFFE>
+<66D6> <66D6> <EAD3>
+<66D9> <66D9> <CAEF>
+<66DB> <66DC> <EAD6>
+<66DD> <66DD> <C6D8>
+<66E0> <66E0> <BFF5>
+<66E6> <66E6> <EAD8>
+<66E9> <66E9> <EAD9>
+<66EC> <66EC> <C9B9>
+<66F0> <66F0> <D4BB>
+<66F2> <66F2> <C7FA>
+<66F3> <66F3> <D2B7>
+<66F4> <66F4> <B8FC>
+<66F7> <66F7> <EAC2>
+<66F8> <66F8> <CAE9>
+<66F9> <66F9> <B2DC>
+<66FC> <66FC> <C2FC>
+<66FE> <66FE> <D4F8>
+<66FF> <66FF> <CCE6>
+<6700> <6700> <D7EE>
+<6703> <6703> <BBE1>
+<6708> <6708> <D4C2>
+<6709> <6709> <D3D0>
+<670A> <670A> <EBC3>
+<670B> <670B> <C5F3>
+<670D> <670D> <B7FE>
+<6710> <6710> <EBD4>
+<6714> <6714> <CBB7>
+<6715> <6715> <EBDE>
+<6717> <6717> <C0CA>
+<671B> <671B> <CDFB>
+<671D> <671D> <B3AF>
+<671F> <671F> <C6DA>
+<6726> <6726> <EBFC>
+<6727> <6727> <EBCA>
+<6728> <6728> <C4BE>
+<672A> <672A> <CEB4>
+<672B> <672B> <C4A9>
+<672C> <672C> <B1BE>
+<672D> <672D> <D4FD>
+<672F> <672F> <CAF5>
+<6731> <6731> <D6EC>
+<6734> <6734> <C6D3>
+<6735> <6735> <B6E4>
+<673A> <673A> <BBFA>
+<673D> <673D> <D0E0>
+<6740> <6740> <C9B1>
+<6742> <6742> <D4D3>
+<6743> <6743> <C8A8>
+<6746> <6746> <B8CB>
+<6748> <6748> <E8BE>
+<6749> <6749> <C9BC>
+<674C> <674C> <E8BB>
+<674E> <674E> <C0EE>
+<674F> <674F> <D0D3>
+<6750> <6750> <B2C4>
+<6751> <6751> <B4E5>
+<6753> <6753> <E8BC>
+<6756> <6756> <D5C8>
+<675C> <675C> <B6C5>
+<675E> <675E> <E8BD>
+<675F> <675F> <CAF8>
+<6760> <6760> <B8DC>
+<6761> <6761> <CCF5>
+<6765> <6765> <C0B4>
+<6768> <6768> <D1EE>
+endbfrange
+
+100 beginbfrange
+<6769> <6769> <E8BF>
+<676A> <676A> <E8C2>
+<676D> <676D> <BABC>
+<676F> <676F> <B1AD>
+<6770> <6770> <BDDC>
+<6771> <6771> <B6AB>
+<6772> <6772> <EABD>
+<6773> <6773> <E8C3>
+<6775> <6775> <E8C6>
+<6777> <6777> <E8CB>
+<677C> <677C> <E8CC>
+<677E> <677E> <CBC9>
+<677F> <677F> <B0E5>
+<6781> <6781> <BCAB>
+<6784> <6784> <B9B9>
+<6787> <6787> <E8C1>
+<6789> <6789> <CDF7>
+<678B> <678B> <E8CA>
+<6790> <6790> <CEF6>
+<6795> <6795> <D5ED>
+<6797> <6797> <C1D6>
+<6798> <6798> <E8C4>
+<679A> <679A> <C3B6>
+<679C> <679C> <B9FB>
+<679D> <679D> <D6A6>
+<679E> <679E> <E8C8>
+<67A2> <67A2> <CAE0>
+<67A3> <67A3> <D4E6>
+<67A5> <67A5> <E8C0>
+<67A7> <67A7> <E8C5>
+<67A8> <67A8> <E8C7>
+<67AA> <67AA> <C7B9>
+<67AB> <67AB> <B7E3>
+<67AD> <67AD> <E8C9>
+<67AF> <67AF> <BFDD>
+<67B0> <67B0> <E8D2>
+<67B3> <67B3> <E8D7>
+<67B5> <67B5> <E8D5>
+<67B6> <67B6> <BCDC>
+<67B7> <67B7> <BCCF>
+<67B8> <67B8> <E8DB>
+<67C1> <67C1> <E8DE>
+<67C3> <67C3> <E8DA>
+<67C4> <67C4> <B1FA>
+<67CF> <67CF> <B0D8>
+<67D0> <67D0> <C4B3>
+<67D1> <67D1> <B8CC>
+<67D2> <67D2> <C6E2>
+<67D3> <67D3> <C8BE>
+<67D4> <67D4> <C8E1>
+<67D8> <67D8> <E8CF>
+<67D9> <67D9> <E8D4>
+<67DA> <67DA> <E8D6>
+<67DC> <67DC> <B9F1>
+<67DD> <67DD> <E8D8>
+<67DE> <67DE> <D7F5>
+<67E0> <67E0> <C4FB>
+<67E2> <67E2> <E8DC>
+<67E5> <67E5> <B2E9>
+<67E9> <67E9> <E8D1>
+<67EC> <67EC> <BCED>
+<67EF> <67EF> <BFC2>
+<67F0> <67F0> <E8CD>
+<67F1> <67F1> <D6F9>
+<67F3> <67F3> <C1F8>
+<67F4> <67F4> <B2F1>
+<67FD> <67FD> <E8DF>
+<67FF> <67FF> <CAC1>
+<6800> <6800> <E8D9>
+<6805> <6805> <D5A4>
+<6807> <6807> <B1EA>
+<6808> <6808> <D5BB>
+<6809> <6809> <E8CE>
+<680A> <680A> <E8D0>
+<680B> <680B> <B6B0>
+<680C> <680C> <E8D3>
+<680E> <680E> <E8DD>
+<680F> <680F> <C0B8>
+<6811> <6811> <CAF7>
+<6813> <6813> <CBA8>
+<6816> <6816> <C6DC>
+<6817> <6817> <C0F5>
+<681D> <681D> <E8E9>
+<6821> <6821> <D0A3>
+<6829> <6829> <E8F2>
+<682A> <682A> <D6EA>
+<6832> <6833> <E8E0>
+<6837> <6837> <D1F9>
+<6838> <6838> <BACB>
+<6839> <6839> <B8F9>
+<683C> <683C> <B8F1>
+<683D> <683D> <D4D4>
+<683E> <683E> <E8EF>
+<6840> <6840> <E8EE>
+<6841> <6841> <E8EC>
+<6842> <6842> <B9F0>
+<6843> <6843> <CCD2>
+<6844> <6844> <E8E6>
+<6845> <6845> <CEA6>
+<6846> <6846> <BFF2>
+endbfrange
+
+100 beginbfrange
+<6848> <6848> <B0B8>
+<6849> <6849> <E8F1>
+<684A> <684A> <E8F0>
+<684C> <684C> <D7C0>
+<684E> <684E> <E8E4>
+<6850> <6850> <CDA9>
+<6851> <6851> <C9A3>
+<6853> <6853> <BBB8>
+<6854> <6854> <BDDB>
+<6855> <6855> <E8EA>
+<6860> <6861> <E8E2>
+<6862> <6862> <E8E5>
+<6863> <6863> <B5B5>
+<6864> <6864> <E8E7>
+<6865> <6865> <C7C5>
+<6866> <6866> <E8EB>
+<6867> <6867> <E8ED>
+<6868> <6868> <BDB0>
+<6869> <6869> <D7AE>
+<686B> <686B> <E8F8>
+<6874> <6874> <E8F5>
+<6876> <6876> <CDB0>
+<6877> <6877> <E8F6>
+<6881> <6881> <C1BA>
+<6883> <6883> <E8E8>
+<6885> <6885> <C3B7>
+<6886> <6886> <B0F0>
+<688F> <688F> <E8F4>
+<6893> <6893> <E8F7>
+<6897> <6897> <B9A3>
+<6898> <6898> <E8C5>
+<689D> <689D> <CCF5>
+<689F> <689F> <E8C9>
+<68A2> <68A2> <C9D2>
+<68A6> <68A6> <C3CE>
+<68A7> <68A7> <CEE0>
+<68A8> <68A8> <C0E6>
+<68AD> <68AD> <CBF3>
+<68AF> <68AF> <CCDD>
+<68B0> <68B0> <D0B5>
+<68B3> <68B3> <CAE1>
+<68B5> <68B5> <E8F3>
+<68C0> <68C0> <BCEC>
+<68C2> <68C2> <E8F9>
+<68C9> <68C9> <C3DE>
+<68CB> <68CB> <C6E5>
+<68CD> <68CD> <B9F7>
+<68D2> <68D2> <B0F4>
+<68D5> <68D5> <D7D8>
+<68D6> <68D6> <E8C7>
+<68D7> <68D7> <D4E6>
+<68D8> <68D8> <BCAC>
+<68DA> <68DA> <C5EF>
+<68DF> <68DF> <B6B0>
+<68E0> <68E0> <CCC4>
+<68E3> <68E3> <E9A6>
+<68E7> <68E7> <D5BB>
+<68EE> <68EE> <C9AD>
+<68F0> <68F0> <E9A2>
+<68F1> <68F1> <C0E2>
+<68F5> <68F5> <BFC3>
+<68F9> <68F9> <E8FE>
+<68FA> <68FA> <B9D7>
+<68FC> <68FC> <E8FB>
+<6901> <6901> <E9A4>
+<6905> <6905> <D2CE>
+<690B> <690B> <E9A3>
+<690D> <690D> <D6B2>
+<690E> <690E> <D7B5>
+<690F> <690F> <E8E2>
+<6910> <6910> <E9A7>
+<6912> <6912> <BDB7>
+<691F> <6920> <E8FC>
+<6924> <6924> <E9A1>
+<692D> <692D> <CDD6>
+<6930> <6930> <D2AC>
+<6934> <6934> <E9B2>
+<6939> <6939> <E9A9>
+<693D> <693D> <B4AA>
+<693F> <693F> <B4BB>
+<6942> <6942> <E9AB>
+<694A> <694A> <D1EE>
+<6953> <6953> <B7E3>
+<6954> <6954> <D0A8>
+<6957> <6957> <E9A5>
+<695A> <695A> <B3FE>
+<695D> <695D> <E9AC>
+<695E> <695E> <C0E3>
+<6960> <6960> <E9AA>
+<6963> <6963> <E9B9>
+<6966> <6966> <E9B8>
+<6968> <6968> <E8E5>
+<696B> <696B> <E9AE>
+<696D> <696D> <D2B5>
+<696E> <696E> <E8FA>
+<6971> <6971> <E9A8>
+<6975> <6975> <BCAB>
+<6977> <6977> <BFAC>
+<6978> <6978> <E9B1>
+<6979> <6979> <E9BA>
+endbfrange
+
+100 beginbfrange
+<697C> <697C> <C2A5>
+<6980> <6980> <E9AF>
+<6982> <6982> <B8C5>
+<6984> <6984> <E9AD>
+<6986> <6986> <D3DC>
+<6987> <6988> <E9B4>
+<6989> <6989> <E9B7>
+<698D> <698D> <E9C7>
+<6994> <6994> <C0C6>
+<6995> <6995> <E9C5>
+<6998> <6998> <E9B0>
+<699B> <699B> <E9BB>
+<699C> <699C> <B0F1>
+<69A7> <69A7> <E9BC>
+<69A8> <69A8> <D5A5>
+<69AA> <69AA> <E8BF>
+<69AB> <69AB> <E9BE>
+<69AD> <69AD> <E9BF>
+<69AE> <69AE> <C8D9>
+<69B1> <69B1> <E9C1>
+<69B4> <69B4> <C1F1>
+<69B7> <69B7> <C8B6>
+<69BB> <69BB> <E9BD>
+<69BF> <69BF> <E8E7>
+<69C1> <69C1> <E9C2>
+<69CA> <69CA> <E9C3>
+<69CB> <69CB> <B9B9>
+<69CC> <69CC> <E9B3>
+<69CD> <69CD> <C7B9>
+<69CE> <69CE> <E9B6>
+<69D0> <69D0> <BBB1>
+<69D4> <69D4> <E9C0>
+<69DB> <69DB> <BCF7>
+<69DF> <69DF> <E9C4>
+<69E0> <69E0> <E9C6>
+<69E7> <69E7> <E8FD>
+<69ED> <69ED> <E9CA>
+<69F2> <69F2> <E9CE>
+<69F3> <69F3> <BDB0>
+<69FD> <69FD> <B2DB>
+<69FF> <69FF> <E9C8>
+<6A01> <6A01> <D7AE>
+<6A02> <6A02> <C0D6>
+<6A05> <6A05> <E8C8>
+<6A0A> <6A0A> <B7AE>
+<6A13> <6A13> <C2A5>
+<6A17> <6A18> <E9CB>
+<6A19> <6A19> <B1EA>
+<6A1E> <6A1E> <CAE0>
+<6A1F> <6A1F> <D5C1>
+<6A21> <6A21> <C4A3>
+<6A23> <6A23> <D1F9>
+<6A28> <6A28> <E9D8>
+<6A2A> <6A2A> <BAE1>
+<6A2F> <6A2F> <E9C9>
+<6A31> <6A31> <D3A3>
+<6A35> <6A35> <E9D4>
+<6A38> <6A38> <C6D3>
+<6A39> <6A39> <CAF7>
+<6A3A> <6A3A> <E8EB>
+<6A3D> <6A3D> <E9D7>
+<6A3E> <6A3E> <E9D0>
+<6A44> <6A44> <E9CF>
+<6A47> <6A47> <C7C1>
+<6A48> <6A48> <E8E3>
+<6A4B> <6A4B> <C7C5>
+<6A50> <6A50> <E9D2>
+<6A58> <6A58> <E9D9>
+<6A59> <6A59> <B3C8>
+<6A5B> <6A5B> <E9D3>
+<6A5F> <6A5F> <BBFA>
+<6A61> <6A61> <CFF0>
+<6A62> <6A62> <CDD6>
+<6A65> <6A65> <E9CD>
+<6A71> <6A71> <B3F7>
+<6A79> <6A79> <E9D6>
+<6A7C> <6A7C> <E9DA>
+<6A80> <6A80> <CCB4>
+<6A84> <6A84> <CFAD>
+<6A89> <6A89> <E8DF>
+<6A8E> <6A8E> <E9D5>
+<6A90> <6A90> <E9DC>
+<6A91> <6A91> <E9DB>
+<6A94> <6A94> <B5B5>
+<6A97> <6A97> <E9DE>
+<6A9C> <6A9C> <E8ED>
+<6AA0> <6AA0> <E9D1>
+<6AA2> <6AA2> <BCEC>
+<6AA3> <6AA3> <E9C9>
+<6AA9> <6AA9> <E9DD>
+<6AAB> <6AAB> <E9DF>
+<6AAC> <6AAC> <C3CA>
+<6AAF> <6AAF> <CCA8>
+<6AB3> <6AB3> <E9C4>
+<6AB8> <6AB8> <C4FB>
+<6ABB> <6ABB> <BCF7>
+<6AC3> <6AC3> <B9F1>
+<6AD3> <6AD3> <E9D6>
+<6ADA> <6ADA> <E9B5>
+<6ADB> <6ADB> <E8CE>
+endbfrange
+
+100 beginbfrange
+<6ADD> <6ADD> <E8FC>
+<6ADE> <6ADE> <E9DA>
+<6ADF> <6ADF> <E8DD>
+<6AE7> <6AE7> <E9C6>
+<6AE8> <6AE8> <E8D3>
+<6AEA> <6AEA> <E8C0>
+<6AEC> <6AEC> <E9B4>
+<6AF3> <6AF3> <E8D0>
+<6AF8> <6AF8> <E9B7>
+<6AFB> <6AFB> <D3A3>
+<6B04> <6B04> <C0B8>
+<6B0A> <6B0A> <C8A8>
+<6B0F> <6B0F> <E9A1>
+<6B12> <6B12> <E8EF>
+<6B16> <6B16> <E9AD>
+<6B1E> <6B1E> <E8F9>
+<6B20> <6B20> <C7B7>
+<6B21> <6B21> <B4CE>
+<6B22> <6B22> <BBB6>
+<6B23> <6B23> <D0C0>
+<6B24> <6B24> <ECA3>
+<6B27> <6B27> <C5B7>
+<6B32> <6B32> <D3FB>
+<6B37> <6B37> <ECA4>
+<6B39> <6B39> <ECA5>
+<6B3A> <6B3A> <C6DB>
+<6B3D> <6B3D> <C7D5>
+<6B3E> <6B3E> <BFEE>
+<6B43> <6B43> <ECA6>
+<6B46> <6B46> <ECA7>
+<6B47> <6B47> <D0AA>
+<6B49> <6B49> <C7B8>
+<6B4C> <6B4C> <B8E8>
+<6B50> <6B50> <C5B7>
+<6B59> <6B59> <ECA8>
+<6B5F> <6B5F> <ECA3>
+<6B61> <6B61> <BBB6>
+<6B62> <6B62> <D6B9>
+<6B63> <6B63> <D5FD>
+<6B64> <6B64> <B4CB>
+<6B65> <6B65> <B2BD>
+<6B66> <6B66> <CEE4>
+<6B67> <6B67> <C6E7>
+<6B6A> <6B6A> <CDE1>
+<6B72> <6B72> <CBEA>
+<6B77> <6B77> <C0FA>
+<6B78> <6B78> <B9E9>
+<6B79> <6B79> <B4F5>
+<6B7B> <6B7B> <CBC0>
+<6B7C> <6B7C> <BCDF>
+<6B81> <6B82> <E9E2>
+<6B83> <6B83> <D1EA>
+<6B84> <6B84> <E9E5>
+<6B86> <6B86> <B4F9>
+<6B87> <6B87> <E9E4>
+<6B89> <6B89> <D1B3>
+<6B8A> <6B8A> <CAE2>
+<6B8B> <6B8B> <B2D0>
+<6B8D> <6B8D> <E9E8>
+<6B92> <6B93> <E9E6>
+<6B96> <6B96> <D6B3>
+<6B98> <6B98> <B2D0>
+<6B9A> <6B9B> <E9E9>
+<6B9E> <6B9E> <E9E6>
+<6BA1> <6BA1> <E9EB>
+<6BA4> <6BA4> <E9E4>
+<6BAA> <6BAA> <E9EC>
+<6BAB> <6BAB> <E9E9>
+<6BAE> <6BAE> <E9E7>
+<6BAF> <6BAF> <E9EB>
+<6BB2> <6BB2> <BCDF>
+<6BB3> <6BB3> <ECAF>
+<6BB4> <6BB4> <C5B9>
+<6BB5> <6BB5> <B6CE>
+<6BB7> <6BB7> <D2F3>
+<6BBA> <6BBA> <C9B1>
+<6BBB> <6BBB> <BFC7>
+<6BBF> <6BBF> <B5EE>
+<6BC1> <6BC1> <BBD9>
+<6BC2> <6BC2> <ECB1>
+<6BC5> <6BC5> <D2E3>
+<6BC6> <6BC6> <C5B9>
+<6BCB> <6BCB> <CEE3>
+<6BCD> <6BCD> <C4B8>
+<6BCF> <6BCF> <C3BF>
+<6BD2> <6BD2> <B6BE>
+<6BD3> <6BD3> <D8B9>
+<6BD4> <6BD4> <B1C8>
+<6BD5> <6BD5> <B1CF>
+<6BD6> <6BD6> <B1D1>
+<6BD7> <6BD7> <C5FE>
+<6BD9> <6BD9> <B1D0>
+<6BDB> <6BDB> <C3AB>
+<6BE1> <6BE1> <D5B1>
+<6BEA> <6BEA> <EBA4>
+<6BEB> <6BEB> <BAC1>
+<6BEF> <6BEF> <CCBA>
+<6BF3> <6BF3> <EBA5>
+<6BF5> <6BF5> <EBA7>
+<6BF9> <6BF9> <EBA8>
+endbfrange
+
+100 beginbfrange
+<6BFD> <6BFD> <EBA6>
+<6BFF> <6BFF> <EBA7>
+<6C05> <6C05> <EBA9>
+<6C06> <6C06> <EBAB>
+<6C07> <6C07> <EBAA>
+<6C08> <6C08> <D5B1>
+<6C0C> <6C0C> <EBAA>
+<6C0D> <6C0D> <EBAC>
+<6C0F> <6C0F> <CACF>
+<6C10> <6C10> <D8B5>
+<6C11> <6C11> <C3F1>
+<6C13> <6C13> <C3A5>
+<6C14> <6C14> <C6F8>
+<6C15> <6C15> <EBAD>
+<6C16> <6C16> <C4CA>
+<6C18> <6C1A> <EBAE>
+<6C1B> <6C1B> <B7D5>
+<6C1F> <6C1F> <B7FA>
+<6C21> <6C21> <EBB1>
+<6C22> <6C22> <C7E2>
+<6C23> <6C23> <C6F8>
+<6C24> <6C24> <EBB3>
+<6C26> <6C26> <BAA4>
+<6C27> <6C27> <D1F5>
+<6C28> <6C28> <B0B1>
+<6C29> <6C29> <EBB2>
+<6C2A> <6C2A> <EBB4>
+<6C2B> <6C2B> <C7E2>
+<6C2C> <6C2C> <EBB2>
+<6C2E> <6C2E> <B5AA>
+<6C2F> <6C2F> <C2C8>
+<6C30> <6C30> <C7E8>
+<6C32> <6C32> <EBB5>
+<6C34> <6C34> <CBAE>
+<6C35> <6C35> <E3DF>
+<6C38> <6C38> <D3C0>
+<6C3D> <6C3D> <D9DB>
+<6C40> <6C40> <CDA1>
+<6C41> <6C41> <D6AD>
+<6C42> <6C42> <C7F3>
+<6C46> <6C46> <D9E0>
+<6C47> <6C47> <BBE3>
+<6C49> <6C49> <BABA>
+<6C4A> <6C4A> <E3E2>
+<6C50> <6C50> <CFAB>
+<6C54> <6C54> <E3E0>
+<6C55> <6C55> <C9C7>
+<6C57> <6C57> <BAB9>
+<6C5B> <6C5B> <D1B4>
+<6C5C> <6C5C> <E3E1>
+<6C5D> <6C5D> <C8EA>
+<6C5E> <6C5E> <B9AF>
+<6C5F> <6C5F> <BDAD>
+<6C60> <6C60> <B3D8>
+<6C61> <6C61> <CEDB>
+<6C64> <6C64> <CCC0>
+<6C68> <6C69> <E3E8>
+<6C6A> <6C6A> <CDF4>
+<6C70> <6C70> <CCAD>
+<6C72> <6C72> <BCB3>
+<6C74> <6C74> <E3EA>
+<6C76> <6C76> <E3EB>
+<6C79> <6C79> <D0DA>
+<6C7D> <6C7D> <C6FB>
+<6C7E> <6C7E> <B7DA>
+<6C81> <6C81> <C7DF>
+<6C82> <6C82> <D2CA>
+<6C83> <6C83> <CED6>
+<6C85> <6C85> <E3E4>
+<6C86> <6C86> <E3EC>
+<6C88> <6C88> <C9F2>
+<6C89> <6C89> <B3C1>
+<6C8C> <6C8C> <E3E7>
+<6C8F> <6C8F> <C6E3>
+<6C90> <6C90> <E3E5>
+<6C93> <6C93> <EDB3>
+<6C94> <6C94> <E3E6>
+<6C99> <6C99> <C9B3>
+<6C9B> <6C9B> <C5E6>
+<6C9F> <6C9F> <B9B5>
+<6CA1> <6CA1> <C3BB>
+<6CA3> <6CA3> <E3E3>
+<6CA4> <6CA4> <C5BD>
+<6CA5> <6CA5> <C1A4>
+<6CA6> <6CA6> <C2D9>
+<6CA7> <6CA7> <B2D7>
+<6CA9> <6CA9> <E3ED>
+<6CAA> <6CAA> <BBA6>
+<6CAB> <6CAB> <C4AD>
+<6CAD> <6CAD> <E3F0>
+<6CAE> <6CAE> <BEDA>
+<6CB1> <6CB1> <E3FB>
+<6CB2> <6CB2> <E3F5>
+<6CB3> <6CB3> <BAD3>
+<6CB8> <6CB8> <B7D0>
+<6CB9> <6CB9> <D3CD>
+<6CBB> <6CBB> <D6CE>
+<6CBC> <6CBC> <D5D3>
+<6CBD> <6CBD> <B9C1>
+<6CBE> <6CBE> <D5B4>
+endbfrange
+
+100 beginbfrange
+<6CBF> <6CBF> <D1D8>
+<6CC4> <6CC4> <D0B9>
+<6CC5> <6CC5> <C7F6>
+<6CC9> <6CC9> <C8AA>
+<6CCA> <6CCA> <B2B4>
+<6CCC> <6CCC> <C3DA>
+<6CD0> <6CD0> <E3EE>
+<6CD3> <6CD3> <E3FC>
+<6CD4> <6CD4> <E3EF>
+<6CD5> <6CD5> <B7A8>
+<6CD6> <6CD6> <E3F7>
+<6CD7> <6CD7> <E3F4>
+<6CDB> <6CDB> <B7BA>
+<6CDE> <6CDE> <C5A2>
+<6CE0> <6CE0> <E3F6>
+<6CE1> <6CE1> <C5DD>
+<6CE2> <6CE2> <B2A8>
+<6CE3> <6CE3> <C6FC>
+<6CE5> <6CE5> <C4E0>
+<6CE8> <6CE8> <D7A2>
+<6CEA> <6CEA> <C0E1>
+<6CEB> <6CEB> <E3F9>
+<6CEE> <6CEE> <E3FA>
+<6CEF> <6CEF> <E3FD>
+<6CF0> <6CF0> <CCA9>
+<6CF1> <6CF1> <E3F3>
+<6CF3> <6CF3> <D3BE>
+<6CF5> <6CF5> <B1C3>
+<6CF6> <6CF6> <EDB4>
+<6CF7> <6CF8> <E3F1>
+<6CFA> <6CFA> <E3F8>
+<6CFB> <6CFB> <D0BA>
+<6CFC> <6CFC> <C6C3>
+<6CFD> <6CFD> <D4F3>
+<6CFE> <6CFE> <E3FE>
+<6D01> <6D01> <BDE0>
+<6D04> <6D04> <E4A7>
+<6D07> <6D07> <E4A6>
+<6D0B> <6D0B> <D1F3>
+<6D0C> <6D0C> <E4A3>
+<6D0E> <6D0E> <E4A9>
+<6D12> <6D12> <C8F7>
+<6D17> <6D17> <CFB4>
+<6D19> <6D19> <E4A8>
+<6D1A> <6D1A> <E4AE>
+<6D1B> <6D1B> <C2E5>
+<6D1E> <6D1E> <B6B4>
+<6D25> <6D25> <BDF2>
+<6D27> <6D27> <E4A2>
+<6D2A> <6D2A> <BAE9>
+<6D2B> <6D2B> <E4AA>
+<6D2E> <6D2E> <E4AC>
+<6D31> <6D31> <B6FD>
+<6D32> <6D32> <D6DE>
+<6D33> <6D33> <E4B2>
+<6D35> <6D35> <E4AD>
+<6D39> <6D39> <E4A1>
+<6D3B> <6D3B> <BBEE>
+<6D3C> <6D3C> <CDDD>
+<6D3D> <6D3D> <C7A2>
+<6D3E> <6D3E> <C5C9>
+<6D41> <6D41> <C1F7>
+<6D43> <6D43> <E4A4>
+<6D45> <6D45> <C7B3>
+<6D46> <6D46> <BDAC>
+<6D47> <6D47> <BDBD>
+<6D48> <6D48> <E4A5>
+<6D4A> <6D4A> <D7C7>
+<6D4B> <6D4B> <B2E2>
+<6D4D> <6D4D> <E4AB>
+<6D4E> <6D4E> <BCC3>
+<6D4F> <6D4F> <E4AF>
+<6D51> <6D51> <BBEB>
+<6D52> <6D52> <E4B0>
+<6D53> <6D53> <C5A8>
+<6D54> <6D54> <E4B1>
+<6D59> <6D59> <D5E3>
+<6D5A> <6D5A> <BFA3>
+<6D5C> <6D5C> <E4BA>
+<6D5E> <6D5E> <E4B7>
+<6D60> <6D60> <E4BB>
+<6D63> <6D63> <E4BD>
+<6D66> <6D66> <C6D6>
+<6D69> <6D69> <BAC6>
+<6D6A> <6D6A> <C0CB>
+<6D6E> <6D6E> <B8A1>
+<6D6F> <6D6F> <E4B4>
+<6D74> <6D74> <D4A1>
+<6D77> <6D77> <BAA3>
+<6D78> <6D78> <BDFE>
+<6D79> <6D79> <E4A4>
+<6D7C> <6D7C> <E4BC>
+<6D82> <6D82> <CDBF>
+<6D85> <6D85> <C4F9>
+<6D87> <6D87> <E3FE>
+<6D88> <6D88> <CFFB>
+<6D89> <6D89> <C9E6>
+<6D8C> <6D8C> <D3BF>
+<6D8E> <6D8E> <CFD1>
+<6D91> <6D91> <E4B3>
+endbfrange
+
+100 beginbfrange
+<6D93> <6D94> <E4B8>
+<6D95> <6D95> <CCE9>
+<6D9B> <6D9B> <CCCE>
+<6D9D> <6D9D> <C0D4>
+<6D9E> <6D9E> <E4B5>
+<6D9F> <6D9F> <C1B0>
+<6DA0> <6DA0> <E4B6>
+<6DA1> <6DA1> <CED0>
+<6DA3> <6DA3> <BBC1>
+<6DA4> <6DA4> <B5D3>
+<6DA6> <6DA6> <C8F3>
+<6DA7> <6DA7> <BDA7>
+<6DA8> <6DA8> <D5C7>
+<6DA9> <6DA9> <C9AC>
+<6DAA> <6DAA> <B8A2>
+<6DAB> <6DAB> <E4CA>
+<6DAE> <6DAE> <E4CC>
+<6DAF> <6DAF> <D1C4>
+<6DB2> <6DB2> <D2BA>
+<6DB5> <6DB5> <BAAD>
+<6DB8> <6DB8> <BAD4>
+<6DBF> <6DBF> <E4C3>
+<6DC0> <6DC0> <B5ED>
+<6DC4> <6DC4> <D7CD>
+<6DC5> <6DC5> <E4C0>
+<6DC6> <6DC6> <CFFD>
+<6DC7> <6DC7> <E4BF>
+<6DCB> <6DCB> <C1DC>
+<6DCC> <6DCC> <CCCA>
+<6DD1> <6DD1> <CAE7>
+<6DD6> <6DD6> <C4D7>
+<6DD8> <6DD8> <CCD4>
+<6DD9> <6DD9> <E4C8>
+<6DDD> <6DDD> <E4C7>
+<6DDE> <6DDE> <E4C1>
+<6DE0> <6DE0> <E4C4>
+<6DE1> <6DE1> <B5AD>
+<6DE4> <6DE4> <D3D9>
+<6DE6> <6DE6> <E4C6>
+<6DEA> <6DEA> <C2D9>
+<6DEB> <6DEB> <D2F9>
+<6DEC> <6DEC> <B4E3>
+<6DEE> <6DEE> <BBB4>
+<6DF1> <6DF1> <C9EE>
+<6DF3> <6DF3> <B4BE>
+<6DF5> <6DF5> <D4A8>
+<6DF6> <6DF6> <E4B5>
+<6DF7> <6DF7> <BBEC>
+<6DF9> <6DF9> <D1CD>
+<6DFA> <6DFA> <C7B3>
+<6DFB> <6DFB> <CCED>
+<6DFC> <6DFC> <EDB5>
+<6E05> <6E05> <C7E5>
+<6E0A> <6E0A> <D4A8>
+<6E0C> <6E0C> <E4CB>
+<6E0D> <6E0D> <D7D5>
+<6E0E> <6E0E> <E4C2>
+<6E10> <6E10> <BDA5>
+<6E11> <6E11> <E4C5>
+<6E14> <6E14> <D3E6>
+<6E16> <6E16> <E4C9>
+<6E17> <6E17> <C9F8>
+<6E1A> <6E1A> <E4BE>
+<6E1D> <6E1D> <D3E5>
+<6E20> <6E20> <C7FE>
+<6E21> <6E21> <B6C9>
+<6E23> <6E23> <D4FC>
+<6E24> <6E24> <B2B3>
+<6E25> <6E25> <E4D7>
+<6E26> <6E26> <CED0>
+<6E29> <6E29> <CEC2>
+<6E2B> <6E2B> <E4CD>
+<6E2C> <6E2C> <B2E2>
+<6E2D> <6E2D> <CEBC>
+<6E2F> <6E2F> <B8DB>
+<6E32> <6E32> <E4D6>
+<6E34> <6E34> <BFCA>
+<6E38> <6E38> <D3CE>
+<6E3A> <6E3A> <C3EC>
+<6E3E> <6E3E> <BBEB>
+<6E43> <6E43> <C5C8>
+<6E44> <6E44> <E4D8>
+<6E4D> <6E4D> <CDC4>
+<6E4E> <6E4E> <E4CF>
+<6E53> <6E54> <E4D4>
+<6E56> <6E56> <BAFE>
+<6E58> <6E58> <CFE6>
+<6E5B> <6E5B> <D5BF>
+<6E5E> <6E5E> <E4A5>
+<6E5F> <6E5F> <E4D2>
+<6E6B> <6E6B> <E4D0>
+<6E6E> <6E6E> <E4CE>
+<6E6F> <6E6F> <CCC0>
+<6E7E> <6E7E> <CDE5>
+<6E7F> <6E7F> <CAAA>
+<6E83> <6E83> <C0A3>
+<6E85> <6E85> <BDA6>
+<6E86> <6E86> <E4D3>
+<6E89> <6E89> <B8C8>
+<6E8F> <6E8F> <E4E7>
+endbfrange
+
+100 beginbfrange
+<6E90> <6E90> <D4B4>
+<6E96> <6E96> <D7BC>
+<6E98> <6E98> <E4DB>
+<6E9C> <6E9C> <C1EF>
+<6E9D> <6E9D> <B9B5>
+<6E9F> <6E9F> <E4E9>
+<6EA2> <6EA2> <D2E7>
+<6EA5> <6EA5> <E4DF>
+<6EA7> <6EA7> <E4E0>
+<6EAA> <6EAA> <CFAA>
+<6EAF> <6EAF> <CBDD>
+<6EB1> <6EB1> <E4DA>
+<6EB2> <6EB2> <E4D1>
+<6EB4> <6EB4> <E4E5>
+<6EB6> <6EB6> <C8DC>
+<6EB7> <6EB7> <E4E3>
+<6EBA> <6EBA> <C4E7>
+<6EBB> <6EBB> <E4E2>
+<6EBD> <6EBD> <E4E1>
+<6EC1> <6EC1> <B3FC>
+<6EC2> <6EC2> <E4E8>
+<6EC4> <6EC4> <B2D7>
+<6EC5> <6EC5> <C3F0>
+<6EC7> <6EC7> <B5E1>
+<6ECB> <6ECB> <D7CC>
+<6ECC> <6ECC> <B5D3>
+<6ECE> <6ECE> <DCFE>
+<6ECF> <6ECF> <E4E6>
+<6ED1> <6ED1> <BBAC>
+<6ED3> <6ED3> <D7D2>
+<6ED4> <6ED4> <CCCF>
+<6ED5> <6ED5> <EBF8>
+<6ED7> <6ED7> <E4E4>
+<6EDA> <6EDA> <B9F6>
+<6EDE> <6EDE> <D6CD>
+<6EDF> <6EDF> <E4D9>
+<6EE0> <6EE0> <E4DC>
+<6EE1> <6EE1> <C2FA>
+<6EE2> <6EE2> <E4DE>
+<6EE4> <6EE4> <C2CB>
+<6EE5> <6EE5> <C0C4>
+<6EE6> <6EE6> <C2D0>
+<6EE8> <6EE8> <B1F5>
+<6EE9> <6EE9> <CCB2>
+<6EEC> <6EEC> <BBA6>
+<6EEF> <6EEF> <D6CD>
+<6EF2> <6EF2> <C9F8>
+<6EF4> <6EF4> <B5CE>
+<6EF7> <6EF7> <C2B1>
+<6EF8> <6EF8> <E4B0>
+<6EF9> <6EF9> <E4EF>
+<6EFF> <6EFF> <C2FA>
+<6F01> <6F01> <D3E6>
+<6F02> <6F02> <C6AF>
+<6F06> <6F06> <C6E1>
+<6F09> <6F09> <E4F5>
+<6F0F> <6F0F> <C2A9>
+<6F13> <6F13> <C0EC>
+<6F14> <6F14> <D1DD>
+<6F15> <6F15> <E4EE>
+<6F1A> <6F1A> <C5BD>
+<6F20> <6F20> <C4AE>
+<6F22> <6F22> <BABA>
+<6F23> <6F23> <C1B0>
+<6F24> <6F24> <E4ED>
+<6F29> <6F29> <E4F6>
+<6F2A> <6F2A> <E4F4>
+<6F2B> <6F2B> <C2FE>
+<6F2C> <6F2C> <D7D5>
+<6F2D> <6F2D> <E4DD>
+<6F2F> <6F2F> <E4F0>
+<6F31> <6F31> <CAFE>
+<6F32> <6F32> <D5C7>
+<6F33> <6F33> <D5C4>
+<6F36> <6F36> <E4F1>
+<6F38> <6F38> <BDA5>
+<6F3E> <6F3E> <D1FA>
+<6F3F> <6F3F> <BDAC>
+<6F41> <6F41> <F2A3>
+<6F46> <6F47> <E4EB>
+<6F4B> <6F4B> <E4F2>
+<6F4D> <6F4D> <CEAB>
+<6F51> <6F51> <C6C3>
+<6F54> <6F54> <BDE0>
+<6F58> <6F58> <C5CB>
+<6F59> <6F59> <E3ED>
+<6F5C> <6F5C> <C7B1>
+<6F5E> <6F5E> <C2BA>
+<6F62> <6F62> <E4EA>
+<6F64> <6F64> <C8F3>
+<6F66> <6F66> <C1CA>
+<6F6D> <6F6D> <CCB6>
+<6F6E> <6F6E> <B3B1>
+<6F6F> <6F6F> <E4B1>
+<6F70> <6F70> <C0A3>
+<6F72> <6F72> <E4FB>
+<6F74> <6F74> <E4F3>
+<6F77> <6F77> <E4E4>
+<6F78> <6F78> <E4FA>
+<6F7A> <6F7A> <E4FD>
+endbfrange
+
+100 beginbfrange
+<6F7C> <6F7C> <E4FC>
+<6F7F> <6F7F> <E4B6>
+<6F80> <6F80> <C9AC>
+<6F84> <6F84> <B3CE>
+<6F86> <6F86> <BDBD>
+<6F87> <6F87> <C0D4>
+<6F88> <6F88> <B3BA>
+<6F89> <6F89> <E4F7>
+<6F8C> <6F8C> <E4F9>
+<6F8D> <6F8D> <E4F8>
+<6F8E> <6F8E> <C5EC>
+<6F97> <6F97> <BDA7>
+<6F9C> <6F9C> <C0BD>
+<6FA0> <6FA0> <E4C5>
+<6FA1> <6FA1> <D4E8>
+<6FA4> <6FA4> <D4F3>
+<6FA7> <6FA7> <E5A2>
+<6FA9> <6FA9> <EDB4>
+<6FAE> <6FAE> <E4AB>
+<6FB1> <6FB1> <B5ED>
+<6FB3> <6FB3> <B0C4>
+<6FB6> <6FB6> <E5A4>
+<6FB9> <6FB9> <E5A3>
+<6FC0> <6FC0> <BCA4>
+<6FC1> <6FC1> <D7C7>
+<6FC2> <6FC2> <E5A5>
+<6FC3> <6FC3> <C5A8>
+<6FC9> <6FC9> <E5A1>
+<6FD1> <6FD1> <E4FE>
+<6FD2> <6FD2> <B1F4>
+<6FD5> <6FD5> <CAAA>
+<6FD8> <6FD8> <C5A2>
+<6FDB> <6FDB> <C3C9>
+<6FDE> <6FDE> <E5A8>
+<6FDF> <6FDF> <BCC3>
+<6FE0> <6FE0> <E5A9>
+<6FE1> <6FE1> <E5A6>
+<6FE4> <6FE4> <CCCE>
+<6FEB> <6FEB> <C0C4>
+<6FEE> <6FEE> <E5A7>
+<6FEF> <6FEF> <E5AA>
+<6FF0> <6FF0> <CEAB>
+<6FF1> <6FF1> <B1F5>
+<6FFA> <6FFA> <BDA6>
+<6FFC> <6FFC> <E3F8>
+<6FFE> <6FFE> <C2CB>
+<7005> <7005> <E4DE>
+<7006> <7006> <E4C2>
+<7009> <7009> <D0BA>
+<700B> <700B> <E4C9>
+<700F> <700F> <E4AF>
+<7011> <7011> <C6D9>
+<7015> <7015> <B1F4>
+<7018> <7018> <E3F2>
+<701A> <701A> <E5AB>
+<701B> <701B> <E5AD>
+<701D> <701D> <C1A4>
+<701F> <701F> <E4EC>
+<7020> <7020> <E4EB>
+<7023> <7023> <E5AC>
+<7027> <7027> <E3F1>
+<7028> <7028> <E4FE>
+<7030> <7030> <C3D6>
+<7032> <7032> <E4F2>
+<7035> <7035> <E5AF>
+<7039> <7039> <E5AE>
+<703E> <703E> <C0BD>
+<7043> <7043> <E3E3>
+<7044> <7044> <E4DC>
+<704C> <704C> <B9E0>
+<704F> <704F> <E5B0>
+<7051> <7051> <C8F7>
+<7055> <7055> <C0EC>
+<7058> <7058> <CCB2>
+<705D> <705D> <E5B0>
+<705E> <705E> <E5B1>
+<7063> <7063> <CDE5>
+<7064> <7064> <C2D0>
+<7067> <7067> <E4D9>
+<706B> <706B> <BBF0>
+<706C> <706C> <ECE1>
+<706D> <706D> <C3F0>
+<706F> <706F> <B5C6>
+<7070> <7070> <BBD2>
+<7075> <7075> <C1E9>
+<7076> <7076> <D4EE>
+<7078> <7078> <BEC4>
+<707C> <707C> <D7C6>
+<707E> <707E> <D4D6>
+<707F> <707F> <B2D3>
+<7080> <7080> <ECBE>
+<7085> <7085> <EAC1>
+<7089> <7089> <C2AF>
+<708A> <708A> <B4B6>
+<708E> <708E> <D1D7>
+<7092> <7092> <B3B4>
+<7094> <7094> <C8B2>
+<7095> <7095> <BFBB>
+<7096> <7096> <ECC0>
+<7099> <7099> <D6CB>
+endbfrange
+
+100 beginbfrange
+<709C> <709C> <ECBF>
+<709D> <709D> <ECC1>
+<70AB> <70AB> <ECC5>
+<70AC> <70AC> <BEE6>
+<70AD> <70AD> <CCBF>
+<70AE> <70AE> <C5DA>
+<70AF> <70AF> <BEBC>
+<70B1> <70B1> <ECC6>
+<70B3> <70B3> <B1FE>
+<70B7> <70B7> <ECC4>
+<70B8> <70B8> <D5A8>
+<70B9> <70B9> <B5E3>
+<70BB> <70BB> <ECC2>
+<70BC> <70BC> <C1B6>
+<70BD> <70BD> <B3E3>
+<70C0> <70C0> <ECC3>
+<70C1> <70C1> <CBB8>
+<70C2> <70C2> <C0C3>
+<70C3> <70C3> <CCFE>
+<70C8> <70C8> <C1D2>
+<70CA> <70CA> <ECC8>
+<70CF> <70CF> <CEDA>
+<70D8> <70D8> <BAE6>
+<70D9> <70D9> <C0D3>
+<70DB> <70DB> <D6F2>
+<70DF> <70DF> <D1CC>
+<70E4> <70E4> <BFBE>
+<70E6> <70E6> <B7B3>
+<70E7> <70E7> <C9D5>
+<70E8> <70E8> <ECC7>
+<70E9> <70E9> <BBE2>
+<70EB> <70EB> <CCCC>
+<70EC> <70EC> <BDFD>
+<70ED> <70ED> <C8C8>
+<70EF> <70EF> <CFA9>
+<70F4> <70F4> <CCFE>
+<70F7> <70F7> <CDE9>
+<70F9> <70F9> <C5EB>
+<70FD> <70FD> <B7E9>
+<7109> <7109> <D1C9>
+<710A> <710A> <BAB8>
+<7110> <7110> <ECC9>
+<7113> <7113> <ECCA>
+<7115> <7115> <BBC0>
+<7116> <7116> <ECCB>
+<7118> <7118> <ECE2>
+<7119> <7119> <B1BA>
+<711A> <711A> <B7D9>
+<7121> <7121> <CEDE>
+<7126> <7126> <BDB9>
+<712F> <712F> <ECCC>
+<7130> <7130> <D1E6>
+<7131> <7131> <ECCD>
+<7136> <7136> <C8BB>
+<7145> <7145> <ECD1>
+<7149> <7149> <C1B6>
+<714A> <714A> <ECD3>
+<714C> <714C> <BBCD>
+<714E> <714E> <BCE5>
+<7152> <7152> <ECBF>
+<715C> <715C> <ECCF>
+<715E> <715E> <C9B7>
+<7162> <7162> <DCE4>
+<7164> <7164> <C3BA>
+<7166> <7166> <ECE3>
+<7167> <7167> <D5D5>
+<7168> <7168> <ECD0>
+<7169> <7169> <B7B3>
+<716C> <716C> <ECBE>
+<716E> <716E> <D6F3>
+<7172> <7172> <ECD2>
+<7173> <7173> <ECCE>
+<7178> <7178> <ECD4>
+<717A> <717A> <ECD5>
+<717D> <717D> <C9BF>
+<7184> <7184> <CFA8>
+<718A> <718A> <D0DC>
+<718F> <718F> <D1AC>
+<7192> <7192> <D3AB>
+<7194> <7194> <C8DB>
+<7197> <7197> <ECC1>
+<7198> <7198> <ECD6>
+<7199> <7199> <CEF5>
+<719F> <719F> <CAEC>
+<71A0> <71A0> <ECDA>
+<71A8> <71A8> <ECD9>
+<71AC> <71AC> <B0BE>
+<71B1> <71B1> <C8C8>
+<71B3> <71B3> <ECD7>
+<71B5> <71B5> <ECD8>
+<71B9> <71B9> <ECE4>
+<71BE> <71BE> <B3E3>
+<71C1> <71C1> <ECC7>
+<71C3> <71C3> <C8BC>
+<71C8> <71C8> <B5C6>
+<71CE> <71CE> <C1C7>
+<71D2> <71D2> <C9D5>
+<71D4> <71D4> <ECDC>
+<71D5> <71D5> <D1E0>
+<71D9> <71D9> <CCCC>
+endbfrange
+
+100 beginbfrange
+<71DC> <71DC> <ECCB>
+<71DF> <71DF> <D3AA>
+<71E0> <71E0> <ECDB>
+<71E5> <71E5> <D4EF>
+<71E6> <71E6> <B2D3>
+<71E7> <71E7> <ECDD>
+<71ED> <71ED> <D6F2>
+<71EE> <71EE> <DBC6>
+<71F4> <71F4> <BBE2>
+<71F9> <71F9> <ECDE>
+<71FC> <71FC> <BDFD>
+<71FE> <71FE> <ECE2>
+<7206> <7206> <B1AC>
+<720D> <720D> <CBB8>
+<7210> <7210> <C2AF>
+<721B> <721B> <C0C3>
+<721D> <721D> <ECDF>
+<7228> <7228> <ECE0>
+<722A> <722A> <D7A6>
+<722C> <722C> <C5C0>
+<7230> <7230> <EBBC>
+<7231> <7231> <B0AE>
+<7232> <7232> <CEAA>
+<7235> <7235> <BEF4>
+<7236> <7236> <B8B8>
+<7237> <7237> <D2AF>
+<7238> <7238> <B0D6>
+<7239> <7239> <B5F9>
+<723A> <723A> <D2AF>
+<723B> <723B> <D8B3>
+<723D> <723D> <CBAC>
+<723E> <723E> <B6FB>
+<723F> <723F> <E3DD>
+<7247> <7247> <C6AC>
+<7248> <7248> <B0E6>
+<724C> <724C> <C5C6>
+<724D> <724D> <EBB9>
+<7252> <7252> <EBBA>
+<7256> <7256> <EBBB>
+<7258> <7258> <EBB9>
+<7259> <7259> <D1C0>
+<725B> <725B> <C5A3>
+<725D> <725D> <EAF2>
+<725F> <725F> <C4B2>
+<7261> <7261> <C4B5>
+<7262> <7262> <C0CE>
+<7266> <7266> <EAF3>
+<7267> <7267> <C4C1>
+<7269> <7269> <CEEF>
+<726E> <726E> <EAF0>
+<726F> <726F> <EAF4>
+<7272> <7272> <C9FC>
+<7275> <7275> <C7A3>
+<7279> <7279> <CCD8>
+<727A> <727A> <CEFE>
+<727D> <727D> <C7A3>
+<727E> <727F> <EAF5>
+<7280> <7280> <CFAC>
+<7281> <7281> <C0E7>
+<7284> <7284> <EAF7>
+<728A> <728A> <B6BF>
+<728B> <728B> <EAF8>
+<728D> <728D> <EAF9>
+<728F> <728F> <EAFA>
+<7292> <7292> <EAFB>
+<7296> <7296> <DCFD>
+<729F> <729F> <EAF1>
+<72A2> <72A2> <B6BF>
+<72A7> <72A7> <CEFE>
+<72AC> <72AC> <C8AE>
+<72AD> <72AD> <E1EB>
+<72AF> <72AF> <B7B8>
+<72B0> <72B0> <E1EC>
+<72B4> <72B4> <E1ED>
+<72B6> <72B6> <D7B4>
+<72B7> <72B8> <E1EE>
+<72B9> <72B9> <D3CC>
+<72C0> <72C0> <D7B4>
+<72C1> <72C1> <E1F1>
+<72C2> <72C2> <BFF1>
+<72C3> <72C3> <E1F0>
+<72C4> <72C4> <B5D2>
+<72C8> <72C8> <B1B7>
+<72CD> <72CD> <E1F3>
+<72CE> <72CE> <E1F2>
+<72D0> <72D0> <BAFC>
+<72D2> <72D2> <E1F4>
+<72D7> <72D7> <B9B7>
+<72D9> <72D9> <BED1>
+<72DE> <72DE> <C4FC>
+<72E0> <72E0> <BADD>
+<72E1> <72E1> <BDC6>
+<72E8> <72E8> <E1F5>
+<72E9> <72E9> <E1F7>
+<72EC> <72EC> <B6C0>
+<72ED> <72ED> <CFC1>
+<72EE> <72EE> <CAA8>
+<72EF> <72EF> <E1F6>
+<72F0> <72F0> <D5F8>
+<72F1> <72F1> <D3FC>
+endbfrange
+
+100 beginbfrange
+<72F2> <72F2> <E1F8>
+<72F3> <72F3> <E1FC>
+<72F4> <72F4> <E1F9>
+<72F7> <72F7> <E1FA>
+<72F8> <72F8> <C0EA>
+<72F9> <72F9> <CFC1>
+<72FA> <72FA> <E1FE>
+<72FB> <72FB> <E2A1>
+<72FC> <72FC> <C0C7>
+<72FD> <72FD> <B1B7>
+<7301> <7301> <E1FB>
+<7303> <7303> <E1FD>
+<730A> <730A> <E2A5>
+<730E> <730E> <C1D4>
+<7313> <7313> <E2A3>
+<7315> <7315> <E2A8>
+<7316> <7316> <B2FE>
+<7317> <7317> <E2A2>
+<731B> <731B> <C3CD>
+<731C> <731C> <B2C2>
+<731D> <731D> <E2A7>
+<731E> <731E> <E2A6>
+<7321> <7321> <E2A4>
+<7322> <7322> <E2A9>
+<7325> <7325> <E2AB>
+<7329> <7329> <D0C9>
+<732A> <732A> <D6ED>
+<732B> <732B> <C3A8>
+<732C> <732C> <E2AC>
+<732E> <732E> <CFD7>
+<7331> <7331> <E2AE>
+<7334> <7334> <BAEF>
+<7336> <7336> <D3CC>
+<7337> <7337> <E9E0>
+<7338> <7338> <E2AD>
+<7339> <7339> <E2AA>
+<733B> <733B> <E1F8>
+<733E> <733E> <BBAB>
+<733F> <733F> <D4B3>
+<7341> <7341> <E1EF>
+<7344> <7344> <D3FC>
+<7345> <7345> <CAA8>
+<734D> <734D> <E2B0>
+<7350> <7350> <E2AF>
+<7352> <7352> <E9E1>
+<7357> <7357> <E2B1>
+<7360> <7360> <E2B2>
+<7368> <7368> <B6C0>
+<736A> <736A> <E1F6>
+<736B> <736B> <E1FD>
+<736C> <736C> <E2B3>
+<736D> <736D> <CCA1>
+<736F> <736F> <E2B4>
+<7370> <7370> <C4FC>
+<7372> <7372> <BBF1>
+<7375> <7375> <C1D4>
+<7377> <7377> <E1EE>
+<7378> <7378> <CADE>
+<737A> <737A> <CCA1>
+<737B> <737B> <CFD7>
+<737C> <737C> <E2A8>
+<737E> <737E> <E2B5>
+<7380> <7380> <E2A4>
+<7384> <7384> <D0FE>
+<7387> <7387> <C2CA>
+<7389> <7389> <D3F1>
+<738B> <738B> <CDF5>
+<738E> <738E> <E7E0>
+<7391> <7391> <E7E1>
+<7396> <7396> <BEC1>
+<739B> <739B> <C2EA>
+<739F> <739F> <E7E4>
+<73A2> <73A2> <E7E3>
+<73A9> <73A9> <CDE6>
+<73AB> <73AB> <C3B5>
+<73AE> <73AE> <E7E2>
+<73AF> <73AF> <BBB7>
+<73B0> <73B0> <CFD6>
+<73B2> <73B2> <C1E1>
+<73B3> <73B3> <E7E9>
+<73B7> <73B7> <E7E8>
+<73BA> <73BA> <E7F4>
+<73BB> <73BB> <B2A3>
+<73C0> <73C0> <E7EA>
+<73C2> <73C2> <E7E6>
+<73C8> <73C8> <E7EC>
+<73C9> <73C9> <E7EB>
+<73CA> <73CA> <C9BA>
+<73CD> <73CD> <D5E4>
+<73CF> <73CF> <E7E5>
+<73D0> <73D0> <B7A9>
+<73D1> <73D1> <E7E7>
+<73D9> <73D9> <E7EE>
+<73DE> <73DE> <E7F3>
+<73E0> <73E0> <D6E9>
+<73E5> <73E5> <E7ED>
+<73E7> <73E7> <E7F2>
+<73E9> <73E9> <E7F1>
+<73ED> <73ED> <B0E0>
+<73F2> <73F2> <E7F5>
+endbfrange
+
+100 beginbfrange
+<73FE> <73FE> <CFD6>
+<7403> <7403> <C7F2>
+<7405> <7405> <C0C5>
+<7406> <7406> <C0ED>
+<7409> <7409> <C1F0>
+<740A> <740A> <E7F0>
+<740F> <740F> <E7F6>
+<7410> <7410> <CBF6>
+<741A> <741A> <E8A2>
+<741B> <741B> <E8A1>
+<7422> <7422> <D7C1>
+<7425> <7425> <E7FA>
+<7426> <7426> <E7F9>
+<7428> <7428> <E7FB>
+<742A> <742A> <E7F7>
+<742C> <742C> <E7FE>
+<742E> <742E> <E7FD>
+<7430> <7430> <E7FC>
+<7433> <7433> <C1D5>
+<7434> <7434> <C7D9>
+<7435> <7435> <C5FD>
+<7436> <7436> <C5C3>
+<743C> <743C> <C7ED>
+<743F> <743F> <E7F5>
+<7441> <7441> <E8A3>
+<744B> <744B> <E7E2>
+<7455> <7455> <E8A6>
+<7457> <7457> <E8A5>
+<7459> <7459> <E8A7>
+<745A> <745A> <BAF7>
+<745B> <745B> <E7F8>
+<745C> <745C> <E8A4>
+<745E> <745E> <C8F0>
+<745F> <745F> <C9AA>
+<7463> <7463> <CBF6>
+<7469> <7469> <D3A8>
+<746A> <746A> <C2EA>
+<746D> <746D> <E8A9>
+<7470> <7470> <B9E5>
+<7476> <7476> <D1FE>
+<7477> <7477> <E8A8>
+<747E> <747E> <E8AA>
+<7480> <7481> <E8AD>
+<7483> <7483> <C1A7>
+<7487> <7487> <E8AF>
+<7489> <7489> <E7F6>
+<748B> <748B> <E8B0>
+<748E> <748E> <E8AC>
+<7490> <7490> <E8B4>
+<749C> <749C> <E8AB>
+<749E> <749E> <E8B1>
+<74A3> <74A3> <E7E1>
+<74A6> <74A6> <E8A8>
+<74A7> <74A7> <E8B5>
+<74A8> <74A9> <E8B2>
+<74B0> <74B0> <BBB7>
+<74BA> <74BA> <E8B7>
+<74BD> <74BD> <E7F4>
+<74CA> <74CA> <C7ED>
+<74CF> <74CF> <E7E7>
+<74D2> <74D2> <E8B6>
+<74D4> <74D4> <E8AC>
+<74DA> <74DA> <E8B6>
+<74DC> <74DC> <B9CF>
+<74DE> <74DE> <F0AC>
+<74E0> <74E0> <F0AD>
+<74E2> <74E2> <C6B0>
+<74E3> <74E3> <B0EA>
+<74E4> <74E4> <C8BF>
+<74E6> <74E6> <CDDF>
+<74EE> <74EE> <CECD>
+<74EF> <74EF> <EAB1>
+<74F4> <74F4> <EAB2>
+<74F6> <74F6> <C6BF>
+<74F7> <74F7> <B4C9>
+<74FF> <74FF> <EAB3>
+<7504> <7504> <D5E7>
+<750C> <750C> <EAB1>
+<750D> <750D> <DDF9>
+<750F> <750F> <EAB4>
+<7511> <7511> <EAB5>
+<7513> <7513> <EAB6>
+<7518> <7518> <B8CA>
+<7519> <7519> <DFB0>
+<751A> <751A> <C9F5>
+<751C> <751C> <CCF0>
+<751F> <751F> <C9FA>
+<7523> <7523> <B2FA>
+<7525> <7525> <C9FB>
+<7528> <7528> <D3C3>
+<7529> <7529> <CBA6>
+<752B> <752B> <B8A6>
+<752C> <752C> <F0AE>
+<752D> <752D> <B1C2>
+<752F> <752F> <E5B8>
+<7530> <7530> <CCEF>
+<7531> <7531> <D3C9>
+<7532> <7532> <BCD7>
+<7533> <7533> <C9EA>
+<7535> <7535> <B5E7>
+endbfrange
+
+100 beginbfrange
+<7537> <7537> <C4D0>
+<7538> <7538> <B5E9>
+<753A> <753A> <EEAE>
+<753B> <753B> <BBAD>
+<753E> <753E> <E7DE>
+<7540> <7540> <EEAF>
+<7545> <7545> <B3A9>
+<7548> <7548> <EEB2>
+<754B> <754B> <EEB1>
+<754C> <754C> <BDE7>
+<754E> <754E> <EEB0>
+<754F> <754F> <CEB7>
+<7554> <7554> <C5CF>
+<7559> <7559> <C1F4>
+<755A> <755A> <DBCE>
+<755B> <755B> <EEB3>
+<755C> <755C> <D0F3>
+<755D> <755D> <C4B6>
+<7562> <7562> <B1CF>
+<7565> <7565> <C2D4>
+<7566> <7566> <C6E8>
+<756A> <756A> <B7AC>
+<756B> <756B> <BBAD>
+<7572> <7572> <EEB4>
+<7574> <7574> <B3EB>
+<7576> <7576> <B5B1>
+<7578> <7578> <BBFB>
+<7579> <7579> <EEB5>
+<757F> <757F> <E7DC>
+<7583> <7583> <EEB6>
+<7586> <7586> <BDAE>
+<7587> <7587> <B3EB>
+<758B> <758B> <F1E2>
+<758F> <758F> <CAE8>
+<7591> <7591> <D2C9>
+<7592> <7592> <F0DA>
+<7594> <7594> <F0DB>
+<7596> <7596> <F0DC>
+<7597> <7597> <C1C6>
+<7599> <7599> <B8ED>
+<759A> <759A> <BECE>
+<759D> <759D> <F0DE>
+<759F> <759F> <C5B1>
+<75A0> <75A0> <F0DD>
+<75A1> <75A1> <D1F1>
+<75A3> <75A3> <F0E0>
+<75A4> <75A4> <B0CC>
+<75A5> <75A5> <BDEA>
+<75AB> <75AB> <D2DF>
+<75AC> <75AC> <F0DF>
+<75AE> <75AE> <B4AF>
+<75AF> <75AF> <B7E8>
+<75B0> <75B0> <F0E6>
+<75B1> <75B1> <F0E5>
+<75B2> <75B2> <C6A3>
+<75B3> <75B4> <F0E1>
+<75B5> <75B5> <B4C3>
+<75B8> <75B8> <F0E3>
+<75B9> <75B9> <D5EE>
+<75BC> <75BC> <CCDB>
+<75BD> <75BD> <BED2>
+<75BE> <75BE> <BCB2>
+<75C2> <75C2> <F0E8>
+<75C3> <75C3> <F0E7>
+<75C4> <75C4> <F0E4>
+<75C5> <75C5> <B2A1>
+<75C7> <75C7> <D6A2>
+<75C8> <75C8> <D3B8>
+<75C9> <75C9> <BEB7>
+<75CA> <75CA> <C8AC>
+<75CD> <75CD> <F0EA>
+<75D2> <75D2> <D1F7>
+<75D4> <75D4> <D6CC>
+<75D5> <75D5> <BADB>
+<75D6> <75D6> <F0E9>
+<75D8> <75D8> <B6BB>
+<75D9> <75D9> <BEB7>
+<75DB> <75DB> <CDB4>
+<75DE> <75DE> <C6A6>
+<75E2> <75E2> <C1A1>
+<75E3> <75E3> <F0EB>
+<75E4> <75E4> <F0EE>
+<75E6> <75E6> <F0ED>
+<75E7> <75E7> <F0F0>
+<75E8> <75E8> <F0EC>
+<75EA> <75EA> <BBBE>
+<75EB> <75EB> <F0EF>
+<75F0> <75F0> <CCB5>
+<75F1> <75F1> <F0F2>
+<75F4> <75F4> <B3D5>
+<75F9> <75F9> <B1D4>
+<75FC> <75FC> <F0F3>
+<75FF> <75FF> <F0F4>
+<7600> <7600> <F0F6>
+<7601> <7601> <B4E1>
+<7602> <7602> <F0E9>
+<7603> <7603> <F0F1>
+<7605> <7605> <F0F7>
+<760A> <760A> <F0FA>
+<760B> <760B> <B7E8>
+endbfrange
+
+100 beginbfrange
+<760C> <760C> <F0F8>
+<760D> <760D> <D1F1>
+<7610> <7610> <F0F5>
+<7615> <7615> <F0FD>
+<7617> <7617> <F0F9>
+<7618> <7618> <F0FC>
+<7619> <7619> <F0FE>
+<761B> <761B> <F1A1>
+<761E> <761E> <F0F9>
+<761F> <761F> <CEC1>
+<7620> <7620> <F1A4>
+<7621> <7621> <B4AF>
+<7622> <7622> <F1A3>
+<7624> <7624> <C1F6>
+<7625> <7625> <F0FB>
+<7626> <7626> <CADD>
+<7627> <7627> <C5B1>
+<7629> <7629> <B4F1>
+<762A> <762A> <B1F1>
+<762B> <762B> <CCB1>
+<762D> <762D> <F1A6>
+<7630> <7630> <F1A7>
+<7633> <7633> <F1AC>
+<7634> <7634> <D5CE>
+<7635> <7635> <F1A9>
+<7638> <7638> <C8B3>
+<763B> <763B> <F0FC>
+<763C> <763C> <F1A2>
+<763E> <763E> <F1AB>
+<763F> <763F> <F1A8>
+<7640> <7640> <F1A5>
+<7642> <7642> <C1C6>
+<7643> <7643> <F1AA>
+<7646> <7646> <F0EC>
+<7647> <7647> <F0EF>
+<7649> <7649> <F0F7>
+<764C> <764C> <B0A9>
+<764D> <764D> <F1AD>
+<7654> <7654> <F1AF>
+<7656> <7656> <F1B1>
+<7658> <7658> <F0DD>
+<765C> <765C> <F1B0>
+<765E> <765E> <F1AE>
+<765F> <765F> <B1F1>
+<7662> <7662> <D1F7>
+<7663> <7663> <D1A2>
+<7664> <7664> <F0DC>
+<7665> <7665> <D6A2>
+<7667> <7667> <F0DF>
+<7669> <7669> <F1AE>
+<766B> <766B> <F1B2>
+<766C> <766C> <D1A2>
+<766D> <766D> <F1A8>
+<766E> <766E> <F1AB>
+<766F> <766F> <F1B3>
+<7670> <7670> <D3B8>
+<7671> <7671> <CCB1>
+<7672> <7672> <F1B2>
+<7678> <7678> <B9EF>
+<767B> <767B> <B5C7>
+<767C> <767C> <B7A2>
+<767D> <767D> <B0D7>
+<767E> <767E> <B0D9>
+<7682> <7682> <D4ED>
+<7684> <7684> <B5C4>
+<7686> <7686> <BDD4>
+<7687> <7687> <BBCA>
+<7688> <7688> <F0A7>
+<768B> <768B> <B8DE>
+<768E> <768E> <F0A8>
+<7691> <7691> <B0A8>
+<7693> <7693> <F0A9>
+<7696> <7696> <CDEE>
+<7699> <7699> <F0AA>
+<769A> <769A> <B0A8>
+<76A4> <76A4> <F0AB>
+<76AE> <76AE> <C6A4>
+<76B1> <76B1> <D6E5>
+<76B2> <76B2> <F1E4>
+<76B4> <76B4> <F1E5>
+<76B8> <76B8> <F1E4>
+<76BA> <76BA> <D6E5>
+<76BF> <76BF> <C3F3>
+<76C2> <76C2> <D3DB>
+<76C5> <76C5> <D6D1>
+<76C6> <76C6> <C5E8>
+<76C8> <76C8> <D3AF>
+<76CA> <76CA> <D2E6>
+<76CD> <76CD> <EEC1>
+<76CE> <76CE> <B0BB>
+<76CF> <76CF> <D5B5>
+<76D0> <76D0> <D1CE>
+<76D1> <76D1> <BCE0>
+<76D2> <76D2> <BAD0>
+<76D4> <76D4> <BFF8>
+<76D6> <76D6> <B8C7>
+<76D7> <76D7> <B5C1>
+<76D8> <76D8> <C5CC>
+<76DB> <76DB> <CAA2>
+<76DE> <76DE> <D5B5>
+endbfrange
+
+100 beginbfrange
+<76DF> <76DF> <C3CB>
+<76E1> <76E1> <BEA1>
+<76E3> <76E3> <BCE0>
+<76E4> <76E4> <C5CC>
+<76E5> <76E5> <EEC2>
+<76E7> <76E7> <C2AC>
+<76EE> <76EE> <C4BF>
+<76EF> <76EF> <B6A2>
+<76F1> <76F1> <EDEC>
+<76F2> <76F2> <C3A4>
+<76F4> <76F4> <D6B1>
+<76F8> <76F8> <CFE0>
+<76F9> <76F9> <EDEF>
+<76FC> <76FC> <C5CE>
+<76FE> <76FE> <B6DC>
+<7701> <7701> <CAA1>
+<7704> <7704> <EDED>
+<7707> <7708> <EDF0>
+<7709> <7709> <C3BC>
+<770B> <770B> <BFB4>
+<770D> <770D> <EDEE>
+<7719> <7719> <EDF4>
+<771A> <771A> <EDF2>
+<771F> <771F> <D5E6>
+<7720> <7720> <C3DF>
+<7722> <7722> <EDF3>
+<7726> <7726> <EDF6>
+<7728> <7728> <D5A3>
+<7729> <7729> <D1A3>
+<772D> <772D> <EDF5>
+<772F> <772F> <C3D0>
+<7735> <7735> <EDF7>
+<7736> <7736> <BFF4>
+<7737> <7737> <BEEC>
+<7738> <7738> <EDF8>
+<773A> <773A> <CCF7>
+<773C> <773C> <D1DB>
+<7740> <7740> <D7C5>
+<7741> <7741> <D5F6>
+<7743> <7743> <EDFC>
+<7747> <7747> <EDFB>
+<774F> <774F> <C0A7>
+<7750> <7751> <EDF9>
+<775A> <775A> <EDFD>
+<775B> <775B> <BEA6>
+<775E> <775E> <EDF9>
+<7761> <7761> <CBAF>
+<7762> <7762> <EEA1>
+<7763> <7763> <B6BD>
+<7765> <7765> <EEA2>
+<7766> <7766> <C4C0>
+<7768> <7768> <EDFE>
+<776B> <776B> <BDDE>
+<776C> <776C> <B2C7>
+<7779> <7779> <B6C3>
+<777D> <777D> <EEA5>
+<777E> <777E> <D8BA>
+<777F> <777F> <EEA3>
+<7780> <7780> <EEA6>
+<7784> <7784> <C3E9>
+<7785> <7785> <B3F2>
+<778C> <778C> <EEA7>
+<778D> <778D> <EEA4>
+<778E> <778E> <CFB9>
+<7791> <7791> <EEA8>
+<7792> <7792> <C2F7>
+<7798> <7798> <EDEE>
+<779E> <779E> <C2F7>
+<779F> <77A0> <EEA9>
+<77A2> <77A2> <DEAB>
+<77A5> <77A5> <C6B3>
+<77A7> <77A7> <C7C6>
+<77A9> <77A9> <D6F5>
+<77AA> <77AA> <B5C9>
+<77AC> <77AC> <CBB2>
+<77AD> <77AD> <C1CB>
+<77B0> <77B0> <EEAB>
+<77B3> <77B3> <CDAB>
+<77B5> <77B5> <EEAC>
+<77BB> <77BB> <D5B0>
+<77BC> <77BC> <EDFA>
+<77BD> <77BD> <EEAD>
+<77BF> <77BF> <F6C4>
+<77C7> <77C7> <C3C9>
+<77CD> <77CD> <DBC7>
+<77D7> <77D7> <B4A3>
+<77DA> <77DA> <D6F5>
+<77DB> <77DB> <C3AC>
+<77DC> <77DC> <F1E6>
+<77E2> <77E2> <CAB8>
+<77E3> <77E3> <D2D3>
+<77E5> <77E5> <D6AA>
+<77E7> <77E7> <EFF2>
+<77E9> <77E9> <BED8>
+<77EB> <77EB> <BDC3>
+<77EC> <77EC> <EFF3>
+<77ED> <77ED> <B6CC>
+<77EE> <77EE> <B0AB>
+<77EF> <77EF> <BDC3>
+<77F3> <77F3> <CAAF>
+endbfrange
+
+100 beginbfrange
+<77F6> <77F6> <EDB6>
+<77F8> <77F8> <EDB7>
+<77FD> <77FD> <CEF9>
+<77FE> <77FE> <B7AF>
+<77FF> <77FF> <BFF3>
+<7800> <7800> <EDB8>
+<7801> <7801> <C2EB>
+<7802> <7802> <C9B0>
+<7809> <7809> <EDB9>
+<780C> <780C> <C6F6>
+<780D> <780D> <BFB3>
+<7811> <7811> <EDBC>
+<7812> <7812> <C5F8>
+<7814> <7814> <D1D0>
+<7816> <7816> <D7A9>
+<7817> <7818> <EDBA>
+<781A> <781A> <D1E2>
+<781C> <781D> <EDBF>
+<781F> <781F> <EDC4>
+<7823> <7823> <EDC8>
+<7825> <7825> <EDC6>
+<7826> <7826> <EDCE>
+<7827> <7827> <D5E8>
+<7829> <7829> <EDC9>
+<782C> <782C> <EDC7>
+<782D> <782D> <EDBE>
+<7830> <7830> <C5E9>
+<7834> <7834> <C6C6>
+<7837> <7837> <C9E9>
+<7838> <7838> <D4D2>
+<7839> <783B> <EDC1>
+<783C> <783C> <EDC5>
+<783E> <783E> <C0F9>
+<7840> <7840> <B4A1>
+<7843> <7843> <D6EC>
+<7845> <7845> <B9E8>
+<7847> <7847> <EDD0>
+<784C> <784C> <EDD1>
+<784E> <784E> <EDCA>
+<7850> <7850> <EDCF>
+<7852> <7852> <CEF8>
+<7855> <7855> <CBB6>
+<7856> <7857> <EDCC>
+<785D> <785D> <CFF5>
+<7864> <7864> <EDCC>
+<7868> <7868> <EDBA>
+<786A> <786A> <EDD2>
+<786B> <786B> <C1F2>
+<786C> <786C> <D3B2>
+<786D> <786D> <EDCB>
+<786E> <786E> <C8B7>
+<786F> <786F> <D1E2>
+<7877> <7877> <BCEF>
+<787C> <787C> <C5F0>
+<7887> <7887> <EDD6>
+<7889> <7889> <B5EF>
+<788C> <788C> <C2B5>
+<788D> <788D> <B0AD>
+<788E> <788E> <CBE9>
+<7891> <7891> <B1AE>
+<7893> <7893> <EDD4>
+<7897> <7897> <CDEB>
+<7898> <7898> <B5E2>
+<789A> <789A> <EDD5>
+<789B> <789B> <EDD3>
+<789C> <789C> <EDD7>
+<789F> <789F> <B5FA>
+<78A1> <78A1> <EDD8>
+<78A3> <78A3> <EDD9>
+<78A5> <78A5> <EDDC>
+<78A7> <78A7> <B1CC>
+<78A9> <78A9> <CBB6>
+<78AD> <78AD> <EDB8>
+<78B0> <78B0> <C5F6>
+<78B1> <78B1> <BCEE>
+<78B2> <78B2> <EDDA>
+<78B3> <78B3> <CCBC>
+<78B4> <78B4> <B2EA>
+<78B8> <78B8> <EDBF>
+<78B9> <78B9> <EDDB>
+<78BA> <78BA> <C8B7>
+<78BC> <78BC> <C2EB>
+<78BE> <78BE> <C4EB>
+<78C1> <78C1> <B4C5>
+<78C5> <78C5> <B0F5>
+<78C9> <78C9> <EDDF>
+<78CA> <78CA> <C0DA>
+<78CB> <78CB> <B4E8>
+<78D0> <78D0> <C5CD>
+<78D4> <78D4> <EDDD>
+<78D5> <78D5> <BFC4>
+<78D9> <78D9> <EDDE>
+<78DA> <78DA> <D7A9>
+<78E3> <78E3> <EDD7>
+<78E7> <78E7> <EDD3>
+<78E8> <78E8> <C4A5>
+<78EC> <78EC> <EDE0>
+<78EF> <78EF> <EDB6>
+<78F2> <78F2> <EDE1>
+<78F4> <78F4> <EDE3>
+endbfrange
+
+100 beginbfrange
+<78F7> <78F7> <C1D7>
+<78FA> <78FA> <BBC7>
+<78FD> <78FD> <EDCD>
+<7901> <7901> <BDB8>
+<7905> <7905> <EDE2>
+<790E> <790E> <B4A1>
+<7913> <7913> <EDE4>
+<7919> <7919> <B0AD>
+<791E> <791E> <EDE6>
+<7924> <7924> <EDE5>
+<7926> <7926> <BFF3>
+<792A> <792A> <EDC2>
+<792B> <792B> <C0F9>
+<792C> <792C> <B7AF>
+<7931> <7931> <EDC3>
+<7934> <7934> <EDE7>
+<793A> <793A> <CABE>
+<793B> <793B> <ECEA>
+<793C> <793C> <C0F1>
+<793E> <793E> <C9E7>
+<7940> <7940> <ECEB>
+<7941> <7941> <C6EE>
+<7946> <7946> <ECEC>
+<7948> <7948> <C6ED>
+<7949> <7949> <ECED>
+<7953> <7953> <ECF0>
+<7956> <7956> <D7E6>
+<7957> <7957> <ECF3>
+<795A> <795A> <ECF1>
+<795B> <795C> <ECEE>
+<795D> <795D> <D7A3>
+<795E> <795E> <C9F1>
+<795F> <795F> <CBEE>
+<7960> <7960> <ECF4>
+<7962> <7962> <ECF2>
+<7965> <7965> <CFE9>
+<7967> <7967> <ECF6>
+<7968> <7968> <C6B1>
+<796D> <796D> <BCC0>
+<796F> <796F> <ECF5>
+<7977> <7977> <B5BB>
+<7978> <7978> <BBF6>
+<797A> <797A> <ECF7>
+<7980> <7980> <D9F7>
+<7981> <7981> <BDFB>
+<7984> <7984> <C2BB>
+<7985> <7985> <ECF8>
+<798A> <798A> <ECF9>
+<798D> <798D> <BBF6>
+<798E> <798E> <ECF5>
+<798F> <798F> <B8A3>
+<799A> <799A> <ECFA>
+<79A6> <79A6> <D3F9>
+<79A7> <79A7> <ECFB>
+<79AA> <79AA> <ECF8>
+<79AE> <79AE> <C0F1>
+<79B0> <79B0> <ECF2>
+<79B1> <79B1> <B5BB>
+<79B3> <79B3> <ECFC>
+<79B9> <79B9> <D3ED>
+<79BA> <79BA> <D8AE>
+<79BB> <79BB> <C0EB>
+<79BD> <79BD> <C7DD>
+<79BE> <79BE> <BACC>
+<79C0> <79C0> <D0E3>
+<79C1> <79C1> <CBBD>
+<79C3> <79C3> <CDBA>
+<79C6> <79C6> <B8D1>
+<79C9> <79C9> <B1FC>
+<79CB> <79CB> <C7EF>
+<79CD> <79CD> <D6D6>
+<79D1> <79D1> <BFC6>
+<79D2> <79D2> <C3EB>
+<79D5> <79D5> <EFF5>
+<79D8> <79D8> <C3D8>
+<79DF> <79DF> <D7E2>
+<79E3> <79E3> <EFF7>
+<79E4> <79E4> <B3D3>
+<79E6> <79E6> <C7D8>
+<79E7> <79E7> <D1ED>
+<79E9> <79E9> <D6C8>
+<79EB> <79EB> <EFF8>
+<79ED> <79ED> <EFF6>
+<79EF> <79EF> <BBFD>
+<79F0> <79F0> <B3C6>
+<79F8> <79F8> <BDD5>
+<79FB> <79FB> <D2C6>
+<79FD> <79FD> <BBE0>
+<7A00> <7A00> <CFA1>
+<7A02> <7A02> <EFFC>
+<7A03> <7A03> <EFFB>
+<7A06> <7A06> <EFF9>
+<7A0B> <7A0B> <B3CC>
+<7A0D> <7A0D> <C9D4>
+<7A0E> <7A0E> <CBB0>
+<7A14> <7A14> <EFFE>
+<7A17> <7A17> <B0DE>
+<7A1A> <7A1A> <D6C9>
+<7A1E> <7A1E> <EFFD>
+<7A20> <7A20> <B3ED>
+endbfrange
+
+100 beginbfrange
+<7A23> <7A23> <F6D5>
+<7A2E> <7A2E> <D6D6>
+<7A31> <7A31> <B3C6>
+<7A33> <7A33> <CEC8>
+<7A37> <7A37> <F0A2>
+<7A39> <7A39> <F0A1>
+<7A3B> <7A3B> <B5BE>
+<7A3C> <7A3C> <BCDA>
+<7A3D> <7A3D> <BBFC>
+<7A3F> <7A3F> <B8E5>
+<7A40> <7A40> <B9C8>
+<7A46> <7A46> <C4C2>
+<7A4C> <7A4C> <F6D5>
+<7A4D> <7A4D> <BBFD>
+<7A4E> <7A4E> <D3B1>
+<7A51> <7A51> <F0A3>
+<7A57> <7A57> <CBEB>
+<7A61> <7A61> <F0A3>
+<7A62> <7A62> <BBE0>
+<7A69> <7A69> <CEC8>
+<7A6B> <7A6B> <BBF1>
+<7A70> <7A70> <F0A6>
+<7A74> <7A74> <D1A8>
+<7A76> <7A76> <BEBF>
+<7A77> <7A77> <C7EE>
+<7A78> <7A79> <F1B6>
+<7A7A> <7A7A> <BFD5>
+<7A7F> <7A7F> <B4A9>
+<7A80> <7A80> <F1B8>
+<7A81> <7A81> <CDBB>
+<7A83> <7A83> <C7D4>
+<7A84> <7A84> <D5AD>
+<7A86> <7A86> <F1B9>
+<7A88> <7A88> <F1BA>
+<7A8D> <7A8D> <C7CF>
+<7A91> <7A91> <D2A4>
+<7A92> <7A92> <D6CF>
+<7A95> <7A95> <F1BB>
+<7A96> <7A96> <BDD1>
+<7A97> <7A97> <B4B0>
+<7A98> <7A98> <BEBD>
+<7A9C> <7A9C> <B4DC>
+<7A9D> <7A9D> <CED1>
+<7A9F> <7A9F> <BFDF>
+<7AA0> <7AA0> <F1BD>
+<7AA5> <7AA5> <BFFA>
+<7AA6> <7AA6> <F1BC>
+<7AA8> <7AA8> <F1BF>
+<7AA9> <7AA9> <CED1>
+<7AAA> <7AAA> <CDDD>
+<7AAC> <7AAC> <F1BE>
+<7AAD> <7AAD> <F1C0>
+<7AAE> <7AAE> <C7EE>
+<7AB3> <7AB3> <F1C1>
+<7AB6> <7AB6> <F1C0>
+<7ABA> <7ABA> <BFFA>
+<7ABF> <7ABF> <C1FE>
+<7AC4> <7AC4> <B4DC>
+<7AC5> <7AC5> <C7CF>
+<7AC7> <7AC7> <F1BC>
+<7AC8> <7AC8> <D4EE>
+<7ACA> <7ACA> <C7D4>
+<7ACB> <7ACB> <C1A2>
+<7AD6> <7AD6> <CAFA>
+<7AD9> <7AD9> <D5BE>
+<7ADE> <7ADE> <BEBA>
+<7ADF> <7ADF> <BEB9>
+<7AE0> <7AE0> <D5C2>
+<7AE3> <7AE3> <BFA2>
+<7AE5> <7AE5> <CDAF>
+<7AE6> <7AE6> <F1B5>
+<7AEA> <7AEA> <CAFA>
+<7AED> <7AED> <BDDF>
+<7AEF> <7AEF> <B6CB>
+<7AF6> <7AF6> <BEBA>
+<7AF9> <7AF9> <D6F1>
+<7AFA> <7AFA> <F3C3>
+<7AFD> <7AFD> <F3C4>
+<7AFF> <7AFF> <B8CD>
+<7B03> <7B04> <F3C6>
+<7B06> <7B06> <B0CA>
+<7B08> <7B08> <F3C5>
+<7B0A> <7B0A> <F3C9>
+<7B0B> <7B0B> <CBF1>
+<7B0F> <7B0F> <F3CB>
+<7B11> <7B11> <D0A6>
+<7B14> <7B14> <B1CA>
+<7B15> <7B15> <F3C8>
+<7B19> <7B19> <F3CF>
+<7B1B> <7B1B> <B5D1>
+<7B1E> <7B1E> <F3D7>
+<7B20> <7B20> <F3D2>
+<7B24> <7B24> <F3D4>
+<7B25> <7B25> <F3D3>
+<7B26> <7B26> <B7FB>
+<7B28> <7B28> <B1BF>
+<7B2A> <7B2A> <F3CE>
+<7B2B> <7B2B> <F3CA>
+<7B2C> <7B2C> <B5DA>
+<7B2E> <7B2E> <F3D0>
+endbfrange
+
+100 beginbfrange
+<7B31> <7B31> <F3D1>
+<7B33> <7B33> <F3D5>
+<7B38> <7B38> <F3CD>
+<7B3A> <7B3A> <BCE3>
+<7B3C> <7B3C> <C1FD>
+<7B3E> <7B3E> <F3D6>
+<7B45> <7B45> <F3DA>
+<7B46> <7B46> <B1CA>
+<7B47> <7B47> <F3CC>
+<7B49> <7B49> <B5C8>
+<7B4B> <7B4B> <BDEE>
+<7B4C> <7B4C> <F3DC>
+<7B4F> <7B4F> <B7A4>
+<7B50> <7B50> <BFF0>
+<7B51> <7B51> <D6FE>
+<7B52> <7B52> <CDB2>
+<7B54> <7B54> <B4F0>
+<7B56> <7B56> <B2DF>
+<7B58> <7B58> <F3D8>
+<7B5A> <7B5A> <F3D9>
+<7B5B> <7B5B> <C9B8>
+<7B5D> <7B5D> <F3DD>
+<7B60> <7B60> <F3DE>
+<7B62> <7B62> <F3E1>
+<7B67> <7B67> <F3C8>
+<7B6E> <7B6E> <F3DF>
+<7B71> <7B71> <F3E3>
+<7B72> <7B72> <F3E2>
+<7B75> <7B75> <F3DB>
+<7B77> <7B77> <BFEA>
+<7B79> <7B79> <B3EF>
+<7B7B> <7B7B> <F3E0>
+<7B7E> <7B7E> <C7A9>
+<7B80> <7B80> <BCF2>
+<7B85> <7B85> <F3EB>
+<7B8B> <7B8B> <BCE3>
+<7B8D> <7B8D> <B9BF>
+<7B90> <7B90> <F3E4>
+<7B94> <7B94> <B2AD>
+<7B95> <7B95> <BBFE>
+<7B97> <7B97> <CBE3>
+<7B9C> <7B9C> <F3ED>
+<7B9D> <7B9D> <F3E9>
+<7BA1> <7BA1> <B9DC>
+<7BA2> <7BA2> <F3EE>
+<7BA6> <7BA7> <F3E5>
+<7BA8> <7BA8> <F3EA>
+<7BA9> <7BA9> <C2E1>
+<7BAA> <7BAA> <F3EC>
+<7BAB> <7BAB> <F3EF>
+<7BAC> <7BAC> <F3E8>
+<7BAD> <7BAD> <BCFD>
+<7BB1> <7BB1> <CFE4>
+<7BB4> <7BB4> <F3F0>
+<7BB8> <7BB8> <F3E7>
+<7BC0> <7BC0> <BDDA>
+<7BC1> <7BC1> <F3F2>
+<7BC4> <7BC4> <B7B6>
+<7BC6> <7BC6> <D7AD>
+<7BC7> <7BC7> <C6AA>
+<7BC9> <7BC9> <D6FE>
+<7BCB> <7BCB> <F3E6>
+<7BCC> <7BCC> <F3F3>
+<7BD1> <7BD1> <F3F1>
+<7BD3> <7BD3> <C2A8>
+<7BD9> <7BD9> <B8DD>
+<7BDA> <7BDA> <F3F5>
+<7BDD> <7BDD> <F3F4>
+<7BE1> <7BE1> <B4DB>
+<7BE4> <7BE4> <F3C6>
+<7BE5> <7BE6> <F3F6>
+<7BE9> <7BE9> <C9B8>
+<7BEA> <7BEA> <F3F8>
+<7BEE> <7BEE> <C0BA>
+<7BF1> <7BF1> <C0E9>
+<7BF3> <7BF3> <F3D9>
+<7BF7> <7BF7> <C5F1>
+<7BFC> <7BFC> <F3FB>
+<7BFE> <7BFE> <F3FA>
+<7C00> <7C00> <F3E5>
+<7C07> <7C07> <B4D8>
+<7C0B> <7C0B> <F3FE>
+<7C0C> <7C0C> <F3F9>
+<7C0D> <7C0D> <C2A8>
+<7C0F> <7C0F> <F3FC>
+<7C16> <7C16> <F3FD>
+<7C1E> <7C1E> <F3EC>
+<7C1F> <7C1F> <F4A1>
+<7C21> <7C21> <BCF2>
+<7C23> <7C23> <F3F1>
+<7C26> <7C26> <F4A3>
+<7C27> <7C27> <BBC9>
+<7C2A> <7C2A> <F4A2>
+<7C2B> <7C2B> <F3EF>
+<7C38> <7C38> <F4A4>
+<7C3D> <7C3D> <C7A9>
+<7C3E> <7C3E> <C1B1>
+<7C3F> <7C3F> <B2BE>
+<7C40> <7C40> <F4A6>
+<7C41> <7C41> <F4A5>
+endbfrange
+
+100 beginbfrange
+<7C43> <7C43> <C0BA>
+<7C4C> <7C4C> <B3EF>
+<7C4D> <7C4D> <BCAE>
+<7C5C> <7C5C> <F3EA>
+<7C5F> <7C5F> <F4A5>
+<7C60> <7C60> <C1FD>
+<7C64> <7C64> <C7A9>
+<7C69> <7C69> <F3D6>
+<7C6A> <7C6A> <F3FD>
+<7C6C> <7C6C> <C0E9>
+<7C6E> <7C6E> <C2E1>
+<7C72> <7C72> <D3F5>
+<7C73> <7C73> <C3D7>
+<7C74> <7C74> <D9E1>
+<7C7B> <7C7B> <C0E0>
+<7C7C> <7C7C> <F4CC>
+<7C7D> <7C7D> <D7D1>
+<7C89> <7C89> <B7DB>
+<7C91> <7C91> <F4CE>
+<7C92> <7C92> <C1A3>
+<7C95> <7C95> <C6C9>
+<7C97> <7C97> <B4D6>
+<7C98> <7C98> <D5B3>
+<7C9C> <7C9C> <F4D0>
+<7C9D> <7C9D> <F4CF>
+<7C9E> <7C9E> <F4D1>
+<7C9F> <7C9F> <CBDA>
+<7CA2> <7CA2> <F4D2>
+<7CA4> <7CA4> <D4C1>
+<7CA5> <7CA5> <D6E0>
+<7CAA> <7CAA> <B7E0>
+<7CAE> <7CAE> <C1B8>
+<7CB1> <7CB1> <C1BB>
+<7CB2> <7CB2> <F4D3>
+<7CB3> <7CB3> <BEAC>
+<7CB9> <7CB9> <B4E2>
+<7CBC> <7CBD> <F4D4>
+<7CBE> <7CBE> <BEAB>
+<7CC1> <7CC1> <F4D6>
+<7CC5> <7CC5> <F4DB>
+<7CC7> <7CC7> <F4D7>
+<7CC8> <7CC8> <F4DA>
+<7CCA> <7CCA> <BAFD>
+<7CCC> <7CCD> <F4D8>
+<7CD5> <7CD5> <B8E2>
+<7CD6> <7CD6> <CCC7>
+<7CD7> <7CD7> <F4DC>
+<7CD9> <7CD9> <B2DA>
+<7CDC> <7CDC> <C3D3>
+<7CDD> <7CDD> <F4D6>
+<7CDE> <7CDE> <B7E0>
+<7CDF> <7CDF> <D4E3>
+<7CE0> <7CE0> <BFB7>
+<7CE7> <7CE7> <C1B8>
+<7CE8> <7CE8> <F4DD>
+<7CEF> <7CEF> <C5B4>
+<7CF0> <7CF0> <CDC5>
+<7CF2> <7CF2> <F4CF>
+<7CF4> <7CF4> <D9E1>
+<7CF6> <7CF6> <F4D0>
+<7CF8> <7CF8> <F4E9>
+<7CF9> <7CF9> <E6F9>
+<7CFB> <7CFB> <CFB5>
+<7CFE> <7CFE> <BEC0>
+<7D00> <7D00> <BCCD>
+<7D02> <7D02> <E6FB>
+<7D04> <7D04> <D4BC>
+<7D05> <7D05> <BAEC>
+<7D06> <7D06> <E6FA>
+<7D07> <7D07> <E6FC>
+<7D08> <7D08> <E6FD>
+<7D09> <7D09> <C8D2>
+<7D0A> <7D0A> <CEC9>
+<7D0B> <7D0B> <CEC6>
+<7D0D> <7D0D> <C4C9>
+<7D10> <7D10> <C5A6>
+<7D13> <7D13> <E7A3>
+<7D14> <7D14> <B4BF>
+<7D15> <7D15> <E7A2>
+<7D17> <7D17> <C9B4>
+<7D19> <7D19> <D6BD>
+<7D1A> <7D1A> <BCB6>
+<7D1B> <7D1B> <B7D7>
+<7D1C> <7D1C> <E7A1>
+<7D20> <7D20> <CBD8>
+<7D21> <7D21> <B7C4>
+<7D22> <7D22> <CBF7>
+<7D27> <7D27> <BDF4>
+<7D2B> <7D2B> <D7CF>
+<7D2F> <7D2F> <C0DB>
+<7D30> <7D30> <CFB8>
+<7D31> <7D31> <E7A6>
+<7D32> <7D32> <E7A5>
+<7D33> <7D33> <C9F0>
+<7D39> <7D39> <C9DC>
+<7D3A> <7D3A> <E7A4>
+<7D3C> <7D3C> <E7A8>
+<7D3F> <7D3F> <E7AA>
+<7D40> <7D40> <E7A9>
+<7D42> <7D42> <D6D5>
+endbfrange
+
+100 beginbfrange
+<7D44> <7D44> <D7E9>
+<7D46> <7D46> <B0ED>
+<7D4E> <7D4E> <E7AC>
+<7D50> <7D50> <BDE1>
+<7D5D> <7D5D> <E7AB>
+<7D5E> <7D5E> <BDCA>
+<7D61> <7D61> <C2E7>
+<7D62> <7D62> <D1A4>
+<7D66> <7D66> <B8F8>
+<7D68> <7D68> <C8DE>
+<7D6E> <7D6E> <D0F5>
+<7D71> <7D71> <CDB3>
+<7D72> <7D72> <CBBF>
+<7D73> <7D73> <E7AD>
+<7D76> <7D76> <BEF8>
+<7D77> <7D77> <F4EA>
+<7D79> <7D79> <BEEE>
+<7D81> <7D81> <B0F3>
+<7D83> <7D83> <E7AF>
+<7D86> <7D86> <E7AE>
+<7D88> <7D88> <E7B0>
+<7D89> <7D89> <D0E5>
+<7D8F> <7D8F> <CBE7>
+<7D93> <7D93> <BEAD>
+<7D9C> <7D9C> <D7DB>
+<7D9E> <7D9E> <E7B6>
+<7DA2> <7DA2> <B3F1>
+<7DA3> <7DA3> <E7B9>
+<7DA6> <7DA6> <F4EB>
+<7DAB> <7DAB> <CFDF>
+<7DAC> <7DAC> <E7B7>
+<7DAD> <7DAD> <CEAC>
+<7DAE> <7DAE> <F4EC>
+<7DB0> <7DB0> <E7BA>
+<7DB1> <7DB1> <B8D9>
+<7DB2> <7DB2> <CDF8>
+<7DB3> <7DB3> <B1C1>
+<7DB4> <7DB4> <D7BA>
+<7DB8> <7DB8> <C2DA>
+<7DB9> <7DB9> <E7B8>
+<7DBA> <7DBA> <E7B2>
+<7DBB> <7DBB> <D5C0>
+<7DBD> <7DBD> <B4C2>
+<7DBE> <7DBE> <E7B1>
+<7DBF> <7DBF> <C3E0>
+<7DC4> <7DC4> <E7B5>
+<7DC7> <7DC7> <E7BB>
+<7DCA> <7DCA> <BDF4>
+<7DCB> <7DCB> <E7B3>
+<7DD1> <7DD1> <C2CC>
+<7DD2> <7DD2> <D0F7>
+<7DD4> <7DD4> <E7B4>
+<7DD7> <7DD7> <E7BD>
+<7DD8> <7DD8> <BCEA>
+<7DD9> <7DD9> <E7BC>
+<7DDD> <7DDD> <BCA9>
+<7DDE> <7DDE> <B6D0>
+<7DE0> <7DE0> <B5DE>
+<7DE1> <7DE1> <E7C5>
+<7DE3> <7DE3> <D4B5>
+<7DE6> <7DE6> <E7C1>
+<7DE8> <7DE8> <B1E0>
+<7DE9> <7DE9> <BBBA>
+<7DEC> <7DEC> <C3E5>
+<7DEF> <7DEF> <CEB3>
+<7DF1> <7DF1> <E7C3>
+<7DF2> <7DF2> <E7BF>
+<7DF4> <7DF4> <C1B7>
+<7DF6> <7DF6> <E7C2>
+<7DF9> <7DF9> <E7BE>
+<7DFB> <7DFB> <D6C2>
+<7E08> <7E08> <DDD3>
+<7E09> <7E09> <E7C6>
+<7E0A> <7E0A> <E7CB>
+<7E0B> <7E0B> <E7C4>
+<7E10> <7E10> <E7A7>
+<7E11> <7E11> <E7CC>
+<7E1B> <7E1B> <B8BF>
+<7E1D> <7E1D> <E7C7>
+<7E1E> <7E1E> <E7C9>
+<7E1F> <7E1F> <E7C8>
+<7E23> <7E23> <CFD8>
+<7E27> <7E27> <CCD0>
+<7E2B> <7E2B> <B7EC>
+<7E2D> <7E2D> <E7CA>
+<7E2E> <7E2E> <CBF5>
+<7E31> <7E31> <D7DD>
+<7E32> <7E32> <E7D0>
+<7E34> <7E34> <CFCB>
+<7E35> <7E35> <E7CF>
+<7E36> <7E36> <F4EA>
+<7E37> <7E37> <C2C6>
+<7E39> <7E39> <E7CE>
+<7E3B> <7E3B> <F7E3>
+<7E3D> <7E3D> <D7DC>
+<7E3E> <7E3E> <BCA8>
+<7E41> <7E41> <B7B1>
+<7E45> <7E45> <E7D2>
+<7E46> <7E46> <E7D1>
+<7E47> <7E47> <F4ED>
+endbfrange
+
+100 beginbfrange
+<7E52> <7E52> <E7D5>
+<7E54> <7E54> <D6AF>
+<7E55> <7E55> <C9C9>
+<7E5A> <7E5A> <E7D4>
+<7E5E> <7E5E> <C8C6>
+<7E62> <7E62> <E7C0>
+<7E69> <7E69> <C9FE>
+<7E6A> <7E6A> <BBE6>
+<7E6B> <7E6B> <CFB5>
+<7E6D> <7E6D> <BCEB>
+<7E6E> <7E6E> <E7D6>
+<7E6F> <7E6F> <E7D9>
+<7E70> <7E70> <E7D8>
+<7E73> <7E73> <BDC9>
+<7E79> <7E79> <D2EF>
+<7E7C> <7E7C> <BCCC>
+<7E7D> <7E7D> <E7CD>
+<7E7E> <7E7E> <E7D7>
+<7E82> <7E82> <D7EB>
+<7E88> <7E88> <E7D3>
+<7E8A> <7E8A> <E6FE>
+<7E8C> <7E8C> <D0F8>
+<7E8D> <7E8D> <C0DB>
+<7E8F> <7E8F> <B2F8>
+<7E93> <7E93> <D3A7>
+<7E94> <7E94> <B2C5>
+<7E96> <7E96> <CFCB>
+<7E98> <7E98> <E7DA>
+<7E9B> <7E9B> <F4EE>
+<7E9C> <7E9C> <C0C2>
+<7E9F> <7E9F> <E6F9>
+<7EA0> <7EA0> <BEC0>
+<7EA1> <7EA1> <E6FA>
+<7EA2> <7EA2> <BAEC>
+<7EA3> <7EA3> <E6FB>
+<7EA4> <7EA4> <CFCB>
+<7EA5> <7EA5> <E6FC>
+<7EA6> <7EA6> <D4BC>
+<7EA7> <7EA7> <BCB6>
+<7EA8> <7EA9> <E6FD>
+<7EAA> <7EAA> <BCCD>
+<7EAB> <7EAB> <C8D2>
+<7EAC> <7EAC> <CEB3>
+<7EAD> <7EAD> <E7A1>
+<7EAF> <7EAF> <B4BF>
+<7EB0> <7EB0> <E7A2>
+<7EB1> <7EB1> <C9B4>
+<7EB2> <7EB2> <B8D9>
+<7EB3> <7EB3> <C4C9>
+<7EB5> <7EB5> <D7DD>
+<7EB6> <7EB6> <C2DA>
+<7EB7> <7EB7> <B7D7>
+<7EB8> <7EB8> <D6BD>
+<7EB9> <7EB9> <CEC6>
+<7EBA> <7EBA> <B7C4>
+<7EBD> <7EBD> <C5A6>
+<7EBE> <7EBE> <E7A3>
+<7EBF> <7EBF> <CFDF>
+<7EC0> <7EC2> <E7A4>
+<7EC3> <7EC3> <C1B7>
+<7EC4> <7EC4> <D7E9>
+<7EC5> <7EC5> <C9F0>
+<7EC6> <7EC6> <CFB8>
+<7EC7> <7EC7> <D6AF>
+<7EC8> <7EC8> <D6D5>
+<7EC9> <7EC9> <E7A7>
+<7ECA> <7ECA> <B0ED>
+<7ECB> <7ECC> <E7A8>
+<7ECD> <7ECD> <C9DC>
+<7ECE> <7ECE> <D2EF>
+<7ECF> <7ECF> <BEAD>
+<7ED0> <7ED0> <E7AA>
+<7ED1> <7ED1> <B0F3>
+<7ED2> <7ED2> <C8DE>
+<7ED3> <7ED3> <BDE1>
+<7ED4> <7ED4> <E7AB>
+<7ED5> <7ED5> <C8C6>
+<7ED7> <7ED7> <E7AC>
+<7ED8> <7ED8> <BBE6>
+<7ED9> <7ED9> <B8F8>
+<7EDA> <7EDA> <D1A4>
+<7EDB> <7EDB> <E7AD>
+<7EDC> <7EDC> <C2E7>
+<7EDD> <7EDD> <BEF8>
+<7EDE> <7EDE> <BDCA>
+<7EDF> <7EDF> <CDB3>
+<7EE0> <7EE1> <E7AE>
+<7EE2> <7EE2> <BEEE>
+<7EE3> <7EE3> <D0E5>
+<7EE5> <7EE5> <CBE7>
+<7EE6> <7EE6> <CCD0>
+<7EE7> <7EE7> <BCCC>
+<7EE8> <7EE8> <E7B0>
+<7EE9> <7EE9> <BCA8>
+<7EEA> <7EEA> <D0F7>
+<7EEB> <7EEB> <E7B1>
+<7EED> <7EED> <D0F8>
+<7EEE> <7EEF> <E7B2>
+<7EF0> <7EF0> <B4C2>
+<7EF1> <7EF2> <E7B4>
+endbfrange
+
+100 beginbfrange
+<7EF3> <7EF3> <C9FE>
+<7EF4> <7EF4> <CEAC>
+<7EF5> <7EF5> <C3E0>
+<7EF6> <7EF6> <E7B7>
+<7EF7> <7EF7> <B1C1>
+<7EF8> <7EF8> <B3F1>
+<7EFA> <7EFB> <E7B8>
+<7EFC> <7EFC> <D7DB>
+<7EFD> <7EFD> <D5C0>
+<7EFE> <7EFE> <E7BA>
+<7EFF> <7EFF> <C2CC>
+<7F00> <7F00> <D7BA>
+<7F01> <7F03> <E7BB>
+<7F04> <7F04> <BCEA>
+<7F05> <7F05> <C3E5>
+<7F06> <7F06> <C0C2>
+<7F07> <7F08> <E7BE>
+<7F09> <7F09> <BCA9>
+<7F0B> <7F0C> <E7C0>
+<7F0D> <7F0D> <E7B6>
+<7F0E> <7F0E> <B6D0>
+<7F0F> <7F0F> <E7C2>
+<7F11> <7F12> <E7C3>
+<7F13> <7F13> <BBBA>
+<7F14> <7F14> <B5DE>
+<7F15> <7F15> <C2C6>
+<7F16> <7F16> <B1E0>
+<7F17> <7F17> <E7C5>
+<7F18> <7F18> <D4B5>
+<7F19> <7F19> <E7C6>
+<7F1A> <7F1A> <B8BF>
+<7F1B> <7F1B> <E7C8>
+<7F1C> <7F1C> <E7C7>
+<7F1D> <7F1D> <B7EC>
+<7F1F> <7F1F> <E7C9>
+<7F20> <7F20> <B2F8>
+<7F21> <7F27> <E7CA>
+<7F28> <7F28> <D3A7>
+<7F29> <7F29> <CBF5>
+<7F2A> <7F2D> <E7D1>
+<7F2E> <7F2E> <C9C9>
+<7F2F> <7F33> <E7D5>
+<7F34> <7F34> <BDC9>
+<7F35> <7F35> <E7DA>
+<7F36> <7F36> <F3BE>
+<7F38> <7F38> <B8D7>
+<7F3A> <7F3A> <C8B1>
+<7F42> <7F42> <F3BF>
+<7F44> <7F45> <F3C0>
+<7F4C> <7F4C> <F3BF>
+<7F4E> <7F4E> <CCB3>
+<7F50> <7F50> <B9DE>
+<7F51> <7F51> <CDF8>
+<7F54> <7F54> <D8E8>
+<7F55> <7F55> <BAB1>
+<7F57> <7F57> <C2DE>
+<7F58> <7F58> <EEB7>
+<7F5A> <7F5A> <B7A3>
+<7F5F> <7F5F> <EEB9>
+<7F61> <7F61> <EEB8>
+<7F62> <7F62> <B0D5>
+<7F68> <7F68> <EEBB>
+<7F69> <7F69> <D5D6>
+<7F6A> <7F6A> <D7EF>
+<7F6E> <7F6E> <D6C3>
+<7F70> <7F70> <B7A3>
+<7F71> <7F71> <EEBD>
+<7F72> <7F72> <CAF0>
+<7F74> <7F74> <EEBC>
+<7F77> <7F77> <B0D5>
+<7F79> <7F79> <EEBE>
+<7F7E> <7F7E> <EEC0>
+<7F81> <7F81> <EEBF>
+<7F85> <7F85> <C2DE>
+<7F86> <7F86> <EEBC>
+<7F88> <7F88> <EEBF>
+<7F8A> <7F8A> <D1F2>
+<7F8C> <7F8C> <C7BC>
+<7F8E> <7F8E> <C3C0>
+<7F94> <7F94> <B8E1>
+<7F9A> <7F9A> <C1E7>
+<7F9D> <7F9D> <F4C6>
+<7F9E> <7F9E> <D0DF>
+<7F9F> <7F9F> <F4C7>
+<7FA1> <7FA1> <CFDB>
+<7FA4> <7FA4> <C8BA>
+<7FA5> <7FA5> <F4C7>
+<7FA7> <7FA7> <F4C8>
+<7FA9> <7FA9> <D2E5>
+<7FAF> <7FB0> <F4C9>
+<7FB2> <7FB2> <F4CB>
+<7FB8> <7FB8> <D9FA>
+<7FB9> <7FB9> <B8FE>
+<7FBC> <7FBC> <E5F1>
+<7FBD> <7FBD> <D3F0>
+<7FBF> <7FBF> <F4E0>
+<7FC1> <7FC1> <CECC>
+<7FC5> <7FC5> <B3E1>
+<7FCA> <7FCA> <F1B4>
+<7FCC> <7FCC> <D2EE>
+endbfrange
+
+100 beginbfrange
+<7FCE> <7FCE> <F4E1>
+<7FD2> <7FD2> <CFB0>
+<7FD4> <7FD4> <CFE8>
+<7FD5> <7FD5> <F4E2>
+<7FD8> <7FD8> <C7CC>
+<7FDF> <7FDF> <B5D4>
+<7FE0> <7FE0> <B4E4>
+<7FE1> <7FE1> <F4E4>
+<7FE5> <7FE5> <F4E3>
+<7FE6> <7FE6> <F4E5>
+<7FE9> <7FE9> <F4E6>
+<7FEE> <7FEE> <F4E7>
+<7FF0> <7FF0> <BAB2>
+<7FF1> <7FF1> <B0BF>
+<7FF3> <7FF3> <F4E8>
+<7FF9> <7FF9> <C7CC>
+<7FFB> <7FFB> <B7AD>
+<7FFC> <7FFC> <D2ED>
+<8000> <8000> <D2AB>
+<8001> <8001> <C0CF>
+<8003> <8003> <BFBC>
+<8004> <8004> <EBA3>
+<8005> <8005> <D5DF>
+<8006> <8006> <EAC8>
+<800B> <800B> <F1F3>
+<800C> <800C> <B6F8>
+<800D> <800D> <CBA3>
+<8010> <8010> <C4CD>
+<8012> <8012> <F1E7>
+<8014> <8014> <F1E8>
+<8015> <8015> <B8FB>
+<8016> <8016> <F1E9>
+<8017> <8017> <BAC4>
+<8018> <8018> <D4C5>
+<8019> <8019> <B0D2>
+<801C> <801C> <F1EA>
+<8020> <8020> <F1EB>
+<8022> <8022> <F1EC>
+<8025> <8027> <F1ED>
+<8028> <8028> <F1F1>
+<8029> <8029> <F1F0>
+<802A> <802A> <C5D5>
+<802C> <802C> <F1EF>
+<802E> <802E> <F1EC>
+<8031> <8031> <F1F2>
+<8033> <8033> <B6FA>
+<8035> <8035> <F1F4>
+<8036> <8036> <D2AE>
+<8037> <8037> <DEC7>
+<8038> <8038> <CBCA>
+<803B> <803B> <B3DC>
+<803D> <803D> <B5A2>
+<803F> <803F> <B9A2>
+<8042> <8042> <C4F4>
+<8043> <8043> <F1F5>
+<8046> <8046> <F1F6>
+<804A> <804A> <C1C4>
+<804B> <804B> <C1FB>
+<804C> <804C> <D6B0>
+<804D> <804D> <F1F7>
+<8052> <8052> <F1F8>
+<8054> <8054> <C1AA>
+<8056> <8056> <CAA5>
+<8058> <8058> <C6B8>
+<805A> <805A> <BEDB>
+<805E> <805E> <CEC5>
+<8069> <8069> <F1F9>
+<806A> <806A> <B4CF>
+<806F> <806F> <C1AA>
+<8070> <8070> <B4CF>
+<8071> <8071> <F1FA>
+<8072> <8072> <C9F9>
+<8073> <8073> <CBCA>
+<8075> <8075> <F1F9>
+<8076> <8076> <C4F4>
+<8077> <8077> <D6B0>
+<8079> <8079> <F1F7>
+<807D> <807D> <CCFD>
+<807E> <807E> <C1FB>
+<807F> <807F> <EDB2>
+<8080> <8080> <EDB1>
+<8083> <8083> <CBE0>
+<8084> <8084> <D2DE>
+<8085> <8085> <CBE0>
+<8086> <8086> <CBC1>
+<8087> <8087> <D5D8>
+<8089> <8089> <C8E2>
+<808B> <808B> <C0DF>
+<808C> <808C> <BCA1>
+<8093> <8093> <EBC1>
+<8096> <8096> <D0A4>
+<8098> <8098> <D6E2>
+<809A> <809A> <B6C7>
+<809B> <809B> <B8D8>
+<809C> <809C> <EBC0>
+<809D> <809D> <B8CE>
+<809F> <809F> <EBBF>
+<80A0> <80A0> <B3A6>
+<80A1> <80A1> <B9C9>
+<80A2> <80A2> <D6AB>
+endbfrange
+
+100 beginbfrange
+<80A4> <80A4> <B7F4>
+<80A5> <80A5> <B7CA>
+<80A9> <80A9> <BCE7>
+<80AA> <80AA> <B7BE>
+<80AB> <80AB> <EBC6>
+<80AD> <80AD> <EBC7>
+<80AE> <80AE> <B0B9>
+<80AF> <80AF> <BFCF>
+<80B1> <80B1> <EBC5>
+<80B2> <80B2> <D3FD>
+<80B4> <80B4> <EBC8>
+<80B7> <80B7> <EBC9>
+<80BA> <80BA> <B7CE>
+<80BC> <80BC> <EBC2>
+<80BD> <80BD> <EBC4>
+<80BE> <80BE> <C9F6>
+<80BF> <80BF> <D6D7>
+<80C0> <80C0> <D5CD>
+<80C1> <80C1> <D0B2>
+<80C2> <80C2> <EBCF>
+<80C3> <80C3> <CEB8>
+<80C4> <80C4> <EBD0>
+<80C6> <80C6> <B5A8>
+<80CC> <80CC> <B1B3>
+<80CD> <80CD> <EBD2>
+<80CE> <80CE> <CCA5>
+<80D6> <80D6> <C5D6>
+<80D7> <80D7> <EBD3>
+<80D9> <80D9> <EBD1>
+<80DA> <80DA> <C5DF>
+<80DB> <80DB> <EBCE>
+<80DC> <80DC> <CAA4>
+<80DD> <80DD> <EBD5>
+<80DE> <80DE> <B0FB>
+<80E1> <80E1> <BAFA>
+<80E4> <80E4> <D8B7>
+<80E5> <80E5> <F1E3>
+<80E7> <80EA> <EBCA>
+<80EB> <80EB> <EBD6>
+<80EC> <80EC> <E6C0>
+<80ED> <80ED> <EBD9>
+<80EF> <80EF> <BFE8>
+<80F0> <80F0> <D2C8>
+<80F1> <80F1> <EBD7>
+<80F2> <80F2> <EBDC>
+<80F3> <80F3> <B8EC>
+<80F4> <80F4> <EBD8>
+<80F6> <80F6> <BDBA>
+<80F8> <80F8> <D0D8>
+<80FA> <80FA> <B0B7>
+<80FC> <80FC> <EBDD>
+<80FD> <80FD> <C4DC>
+<8102> <8102> <D6AC>
+<8105> <8105> <D0B2>
+<8106> <8106> <B4E0>
+<8109> <8109> <C2F6>
+<810A> <810A> <BCB9>
+<810D> <810E> <EBDA>
+<810F> <810F> <D4E0>
+<8110> <8110> <C6EA>
+<8111> <8111> <C4D4>
+<8112> <8112> <EBDF>
+<8113> <8113> <C5A7>
+<8114> <8114> <D9F5>
+<8116> <8116> <B2B1>
+<8118> <8118> <EBE4>
+<811A> <811A> <BDC5>
+<811B> <811B> <EBD6>
+<811E> <811E> <EBE2>
+<812C> <812C> <EBE3>
+<812F> <812F> <B8AC>
+<8131> <8131> <CDD1>
+<8132> <8132> <EBE5>
+<8136> <8136> <EBE1>
+<8138> <8138> <C1B3>
+<8139> <8139> <D5CD>
+<813E> <813E> <C6A2>
+<8146> <8146> <CCF3>
+<8148> <8148> <EBE6>
+<814A> <814A> <C0B0>
+<814B> <814B> <D2B8>
+<814C> <814C> <EBE7>
+<814E> <814E> <C9F6>
+<8150> <8150> <B8AF>
+<8151> <8151> <B8AD>
+<8153> <8153> <EBE8>
+<8154> <8154> <C7BB>
+<8155> <8155> <CDF3>
+<8156> <8156> <EBCB>
+<8159> <815A> <EBEA>
+<8160> <8160> <EBED>
+<8161> <8161> <EBE1>
+<8165> <8165> <D0C8>
+<8166> <8166> <C4D4>
+<8167> <8167> <EBF2>
+<8169> <8169> <EBEE>
+<816B> <816B> <D6D7>
+<816D> <816D> <EBF1>
+<816E> <816E> <C8F9>
+<8170> <8170> <D1FC>
+endbfrange
+
+100 beginbfrange
+<8171> <8171> <EBEC>
+<8174> <8174> <EBE9>
+<8178> <8178> <B3A6>
+<8179> <8179> <B8B9>
+<817A> <817A> <CFD9>
+<817B> <817B> <C4E5>
+<817C> <817D> <EBEF>
+<817E> <817E> <CCDA>
+<817F> <817F> <CDC8>
+<8180> <8180> <B0F2>
+<8182> <8182> <EBF6>
+<8188> <8188> <EBF5>
+<818A> <818A> <B2B2>
+<818F> <818F> <B8E0>
+<8191> <8191> <EBF7>
+<8198> <8198> <B1EC>
+<819A> <819A> <B7F4>
+<819B> <819B> <CCC5>
+<819C> <819C> <C4A4>
+<819D> <819D> <CFA5>
+<81A0> <81A0> <BDBA>
+<81A3> <81A3> <EBF9>
+<81A6> <81A6> <ECA2>
+<81A8> <81A8> <C5F2>
+<81A9> <81A9> <C4E5>
+<81AA> <81AA> <EBFA>
+<81B3> <81B3> <C9C5>
+<81BA> <81BA> <E2DF>
+<81BB> <81BB> <EBFE>
+<81BD> <81BD> <B5A8>
+<81BE> <81BE> <EBDA>
+<81BF> <81BF> <C5A7>
+<81C0> <81C0> <CDCE>
+<81C1> <81C1> <ECA1>
+<81C2> <81C2> <B1DB>
+<81C3> <81C3> <D3B7>
+<81C6> <81C6> <D2DC>
+<81C9> <81C9> <C1B3>
+<81CA> <81CA> <EBFD>
+<81CC> <81CC> <EBFB>
+<81CD> <81CD> <C6EA>
+<81CF> <81CF> <EBF7>
+<81D8> <81D8> <C0B0>
+<81DA> <81DA> <EBCD>
+<81DF> <81DF> <D4E0>
+<81E0> <81E0> <D9F5>
+<81E3> <81E3> <B3BC>
+<81E7> <81E7> <EAB0>
+<81E8> <81E8> <C1D9>
+<81EA> <81EA> <D7D4>
+<81EC> <81EC> <F4AB>
+<81ED> <81ED> <B3F4>
+<81F3> <81F4> <D6C1>
+<81FA> <81FA> <CCA8>
+<81FB> <81FB> <D5E9>
+<81FC> <81FC> <BECA>
+<81FE> <81FE> <F4A7>
+<8200> <8200> <D2A8>
+<8201> <8202> <F4A8>
+<8204> <8204> <F4AA>
+<8205> <8205> <BECB>
+<8206> <8206> <D3DF>
+<8207> <8207> <D3EB>
+<8208> <8208> <D0CB>
+<8209> <8209> <BED9>
+<820A> <820A> <BEC9>
+<820C> <820D> <C9E0>
+<8210> <8210> <F3C2>
+<8212> <8212> <CAE6>
+<8214> <8214> <CCF2>
+<821B> <821B> <E2B6>
+<821C> <821C> <CBB4>
+<821E> <821E> <CEE8>
+<821F> <821F> <D6DB>
+<8221> <8223> <F4AD>
+<8228> <8228> <F4B2>
+<822A> <822A> <BABD>
+<822B> <822B> <F4B3>
+<822C> <822C> <B0E3>
+<822D> <822D> <F4B0>
+<822F> <822F> <F4B1>
+<8230> <8230> <BDA2>
+<8231> <8231> <B2D5>
+<8233> <8234> <F4B6>
+<8235> <8235> <B6E6>
+<8236> <8236> <B2B0>
+<8237> <8237> <CFCF>
+<8238> <8238> <F4B4>
+<8239> <8239> <B4AC>
+<823B> <823B> <F4B5>
+<823E> <823E> <F4B8>
+<8244> <8244> <F4B9>
+<8247> <8247> <CDA7>
+<8249> <8249> <F4BA>
+<824B> <824B> <F4BB>
+<824F> <824F> <F4BC>
+<8258> <8258> <CBD2>
+<8259> <8259> <B2D5>
+<825A> <825A> <F4BD>
+<825F> <825F> <F4BE>
+endbfrange
+
+100 beginbfrange
+<8264> <8264> <F4AF>
+<8266> <8266> <BDA2>
+<8268> <8268> <F4BF>
+<826B> <826B> <F4B5>
+<826E> <826E> <F4DE>
+<826F> <826F> <C1BC>
+<8270> <8270> <BCE8>
+<8271> <8271> <BCE8>
+<8272> <8272> <C9AB>
+<8273> <8273> <D1DE>
+<8274> <8274> <E5F5>
+<8277> <8277> <D1DE>
+<8279> <8279> <DCB3>
+<827A> <827A> <D2D5>
+<827D> <827D> <DCB4>
+<827E> <827E> <B0AC>
+<827F> <827F> <DCB5>
+<8282> <8282> <BDDA>
+<8284> <8284> <DCB9>
+<8288> <8288> <D8C2>
+<828A> <828A> <DCB7>
+<828B> <828B> <D3F3>
+<828D> <828D> <C9D6>
+<828E> <828E> <DCBA>
+<828F> <828F> <DCB6>
+<8291> <8291> <DCBB>
+<8292> <8292> <C3A2>
+<8297> <8297> <DCBC>
+<8298> <8298> <DCC5>
+<8299> <8299> <DCBD>
+<829C> <829C> <CEDF>
+<829D> <829D> <D6A5>
+<829F> <829F> <DCCF>
+<82A1> <82A1> <DCCD>
+<82A4> <82A4> <DCD2>
+<82A5> <82A5> <BDE6>
+<82A6> <82A6> <C2AB>
+<82A8> <82A8> <DCB8>
+<82A9> <82A9> <DCCB>
+<82AA> <82AA> <DCCE>
+<82AB> <82AB> <DCBE>
+<82AC> <82AC> <B7D2>
+<82AD> <82AD> <B0C5>
+<82AE> <82AE> <DCC7>
+<82AF> <82AF> <D0BE>
+<82B0> <82B0> <DCC1>
+<82B1> <82B1> <BBA8>
+<82B3> <82B3> <B7BC>
+<82B4> <82B4> <DCCC>
+<82B7> <82B7> <DCC6>
+<82B8> <82B8> <DCBF>
+<82B9> <82B9> <C7DB>
+<82BB> <82BB> <DBBB>
+<82BD> <82BD> <D1BF>
+<82BE> <82BE> <DCC0>
+<82C1> <82C1> <DCCA>
+<82C4> <82C4> <DCD0>
+<82C7> <82C7> <CEAD>
+<82C8> <82C8> <DCC2>
+<82CA> <82CA> <DCC3>
+<82CB> <82CC> <DCC8>
+<82CD> <82CD> <B2D4>
+<82CE> <82CE> <DCD1>
+<82CF> <82CF> <CBD5>
+<82D1> <82D1> <D4B7>
+<82D2> <82D2> <DCDB>
+<82D3> <82D3> <DCDF>
+<82D4> <82D4> <CCA6>
+<82D5> <82D5> <DCE6>
+<82D7> <82D7> <C3E7>
+<82D8> <82D8> <DCDC>
+<82DB> <82DB> <BFC1>
+<82DC> <82DC> <DCD9>
+<82DE> <82DE> <B0FA>
+<82DF> <82DF> <B9B6>
+<82E0> <82E0> <DCE5>
+<82E1> <82E1> <DCD3>
+<82E3> <82E3> <DCC4>
+<82E4> <82E4> <DCD6>
+<82E5> <82E5> <C8F4>
+<82E6> <82E6> <BFE0>
+<82E7> <82E7> <DCD1>
+<82EB> <82EB> <C9BB>
+<82EF> <82EF> <B1BD>
+<82F1> <82F1> <D3A2>
+<82F4> <82F4> <DCDA>
+<82F7> <82F7> <DCD5>
+<82F9> <82F9> <C6BB>
+<82FB> <82FB> <DCDE>
+<8301> <8301> <D7C2>
+<8302> <8302> <C3AF>
+<8303> <8303> <B7B6>
+<8304> <8304> <C7D1>
+<8305> <8305> <C3A9>
+<8306> <8306> <DCE2>
+<8307> <8307> <DCD8>
+<8308> <8308> <DCEB>
+<8309> <8309> <DCD4>
+<830C> <830C> <DCDD>
+<830E> <830E> <BEA5>
+endbfrange
+
+100 beginbfrange
+<830F> <830F> <DCD7>
+<8311> <8311> <DCE0>
+<8314> <8315> <DCE3>
+<8317> <8317> <DCF8>
+<831A> <831A> <DCE1>
+<831B> <831B> <DDA2>
+<831C> <831C> <DCE7>
+<8327> <8327> <BCEB>
+<8328> <8328> <B4C4>
+<832B> <832B> <C3A3>
+<832C> <832C> <B2E7>
+<832D> <832D> <DCFA>
+<832F> <832F> <DCF2>
+<8331> <8331> <DCEF>
+<8333> <8333> <DCFC>
+<8334> <8334> <DCEE>
+<8335> <8335> <D2F0>
+<8336> <8336> <B2E8>
+<8338> <8338> <C8D7>
+<8339> <8339> <C8E3>
+<833A> <833A> <DCFB>
+<833C> <833C> <DCED>
+<8340> <8340> <DCF7>
+<8343> <8343> <DCF5>
+<8346> <8346> <BEA3>
+<8347> <8347> <DCF4>
+<8349> <8349> <B2DD>
+<834F> <834F> <DCF3>
+<8350> <8350> <BCF6>
+<8351> <8351> <DCE8>
+<8352> <8352> <BBC4>
+<8354> <8354> <C0F3>
+<835A> <835A> <BCD4>
+<835B> <835C> <DCE9>
+<835E> <835E> <DCF1>
+<835F> <835F> <DCF6>
+<8360> <8360> <DCF9>
+<8361> <8361> <B5B4>
+<8363> <8363> <C8D9>
+<8364> <8364> <BBE7>
+<8365> <8365> <DCFE>
+<8366> <8366> <DCFD>
+<8367> <8367> <D3AB>
+<8368> <8368> <DDA1>
+<8369> <8369> <DDA3>
+<836A> <836A> <DDA5>
+<836B> <836B> <D2F1>
+<836C> <836C> <DDA4>
+<836D> <836E> <DDA6>
+<836F> <836F> <D2A9>
+<8377> <8377> <BAC9>
+<8378> <8378> <DDA9>
+<837B> <837B> <DDB6>
+<837C> <837C> <DDB1>
+<837D> <837D> <DDB4>
+<8385> <8385> <DDB0>
+<8386> <8386> <C6CE>
+<8389> <8389> <C0F2>
+<838A> <838A> <D7AF>
+<838E> <838E> <C9AF>
+<8392> <8392> <DCEC>
+<8393> <8393> <DDAE>
+<8396> <8396> <BEA5>
+<8398> <8398> <DDB7>
+<839B> <839B> <DCF0>
+<839C> <839C> <DDAF>
+<839E> <839E> <DDB8>
+<83A0> <83A0> <DDAC>
+<83A2> <83A2> <BCD4>
+<83A7> <83A7> <DCC8>
+<83A8> <83A8> <DDB9>
+<83A9> <83A9> <DDB3>
+<83AA> <83AA> <DDAD>
+<83AB> <83AB> <C4AA>
+<83B0> <83B0> <DDA8>
+<83B1> <83B1> <C0B3>
+<83B2> <83B2> <C1AB>
+<83B3> <83B4> <DDAA>
+<83B6> <83B6> <DDB2>
+<83B7> <83B7> <BBF1>
+<83B8> <83B8> <DDB5>
+<83B9> <83B9> <D3A8>
+<83BA> <83BA> <DDBA>
+<83BC> <83BC> <DDBB>
+<83BD> <83BD> <C3A7>
+<83C0> <83C0> <DDD2>
+<83C1> <83C1> <DDBC>
+<83C5> <83C5> <DDD1>
+<83C7> <83C7> <B9BD>
+<83CA> <83CA> <BED5>
+<83CC> <83CC> <BEFA>
+<83CF> <83CF> <BACA>
+<83D4> <83D4> <DDCA>
+<83D6> <83D6> <DDC5>
+<83D8> <83D8> <DDBF>
+<83DC> <83DC> <B2CB>
+<83DD> <83DD> <DDC3>
+<83DF> <83DF> <DDCB>
+<83E0> <83E0> <B2A4>
+<83E1> <83E1> <DDD5>
+endbfrange
+
+100 beginbfrange
+<83E5> <83E5> <DDBE>
+<83E9> <83E9> <C6D0>
+<83EA> <83EA> <DDD0>
+<83EF> <83EF> <BBAA>
+<83F0> <83F0> <DDD4>
+<83F1> <83F1> <C1E2>
+<83F2> <83F2> <B7C6>
+<83F8> <83F9> <DDCE>
+<83FD> <83FD> <DDC4>
+<8401> <8401> <DDBD>
+<8403> <8403> <DDCD>
+<8404> <8404> <CCD1>
+<8406> <8406> <DDC9>
+<8407> <8407> <DCC9>
+<840A> <840A> <C0B3>
+<840B> <840B> <DDC2>
+<840C> <840C> <C3C8>
+<840D> <840D> <C6BC>
+<840E> <840E> <CEAE>
+<840F> <840F> <DDCC>
+<8411> <8411> <DDC8>
+<8418> <8418> <DDC1>
+<841C> <841C> <DDC6>
+<841D> <841D> <C2DC>
+<8424> <8425> <D3A9>
+<8426> <8426> <DDD3>
+<8427> <8427> <CFF4>
+<8428> <8428> <C8F8>
+<842C> <842C> <CDF2>
+<8431> <8431> <DDE6>
+<8435> <8435> <DDAB>
+<8438> <8438> <DDC7>
+<843C> <843C> <DDE0>
+<843D> <843D> <C2E4>
+<8446> <8446> <DDE1>
+<8449> <8449> <D2B6>
+<8451> <8451> <DDD7>
+<8452> <8452> <DDA6>
+<8457> <8457> <D6F8>
+<8459> <8459> <DDD9>
+<845A> <845A> <DDD8>
+<845B> <845B> <B8F0>
+<845C> <845C> <DDD6>
+<8461> <8461> <C6CF>
+<8463> <8463> <B6AD>
+<8464> <8464> <DDA7>
+<8466> <8466> <CEAD>
+<8469> <8469> <DDE2>
+<846B> <846B> <BAF9>
+<846C> <846C> <D4E1>
+<846D> <846D> <DDE7>
+<846F> <846F> <D2A9>
+<8471> <8471> <B4D0>
+<8473> <8473> <DDDA>
+<8475> <8475> <BFFB>
+<8476> <8476> <DDE3>
+<8477> <8477> <BBE7>
+<8478> <8478> <DDDF>
+<847A> <847A> <DDDD>
+<8482> <8482> <B5D9>
+<8487> <8488> <DDDB>
+<8489> <8489> <DDDE>
+<848B> <848B> <BDAF>
+<848C> <848C> <DDE4>
+<848E> <848E> <DDE5>
+<8493> <8493> <DDBB>
+<8494> <8494> <DDAA>
+<8497> <8497> <DDF5>
+<8499> <8499> <C3C9>
+<849C> <849C> <CBE2>
+<84A1> <84A1> <DDF2>
+<84AF> <84AF> <D8E1>
+<84B2> <84B2> <C6D1>
+<84B4> <84B4> <DDF4>
+<84B8> <84B8> <D5F4>
+<84B9> <84B9> <DDF3>
+<84BA> <84BA> <DDF0>
+<84BC> <84BC> <B2D4>
+<84BD> <84BD> <DDEC>
+<84BF> <84BF> <DDEF>
+<84C0> <84C0> <DDA5>
+<84C1> <84C1> <DDE8>
+<84C4> <84C4> <D0EE>
+<84C9> <84C9> <C8D8>
+<84CA> <84CA> <DDEE>
+<84CB> <84CB> <B8C7>
+<84CD> <84CD> <DDE9>
+<84D0> <84D0> <DDEA>
+<84D1> <84D1> <CBF2>
+<84D3> <84D3> <DDED>
+<84D6> <84D6> <B1CD>
+<84DD> <84DD> <C0B6>
+<84DF> <84DF> <BCBB>
+<84E0> <84E0> <DDF1>
+<84E3> <84E3> <DDF7>
+<84E5> <84E5> <DDF6>
+<84E6> <84E6> <DDEB>
+<84EC> <84EC> <C5EE>
+<84EE> <84EE> <C1AB>
+<84EF> <84EF> <DCCA>
+endbfrange
+
+100 beginbfrange
+<84F0> <84F0> <DDFB>
+<84FC> <84FC> <DEA4>
+<84FD> <84FD> <DCEA>
+<84FF> <84FF> <DEA3>
+<850C> <850C> <DDF8>
+<8511> <8511> <C3EF>
+<8513> <8513> <C2FB>
+<8514> <8514> <B2B7>
+<8517> <8517> <D5E1>
+<851A> <851A> <CEB5>
+<851E> <851E> <DDE4>
+<851F> <851F> <DDFD>
+<8521> <8521> <B2CC>
+<8523> <8523> <BDAF>
+<8526> <8526> <DCE0>
+<852B> <852B> <C4E8>
+<852C> <852C> <CADF>
+<852D> <852D> <D2F1>
+<8537> <8537> <C7BE>
+<8538> <8538> <DDFA>
+<8539> <8539> <DDFC>
+<853A> <853A> <DDFE>
+<853B> <853B> <DEA2>
+<853C> <853C> <B0AA>
+<853D> <853D> <B1CE>
+<8541> <8541> <DDA1>
+<8543> <8543> <DEAC>
+<8546> <8546> <DDDB>
+<8548> <8548> <DEA6>
+<8549> <8549> <BDB6>
+<854A> <854A> <C8EF>
+<854E> <854E> <DCF1>
+<8552> <8552> <DDA4>
+<8553> <8553> <DCBF>
+<8555> <8555> <DDB5>
+<8556> <8556> <DEA1>
+<8558> <8558> <DCE9>
+<8559> <8559> <DEA5>
+<855E> <855E> <DEA9>
+<8562> <8562> <DDDE>
+<8564> <8564> <DEA8>
+<8568> <8568> <DEA7>
+<8569> <8569> <B5B4>
+<856A> <856A> <CEDF>
+<856D> <856D> <CFF4>
+<8572> <8572> <DEAD>
+<8574> <8574> <D4CC>
+<8577> <8577> <DDF7>
+<8579> <8579> <DEB3>
+<857A> <857A> <DEAA>
+<857B> <857B> <DEAE>
+<857E> <857E> <C0D9>
+<8584> <8584> <B1A1>
+<8585> <8585> <DEB6>
+<8587> <8587> <DEB1>
+<8588> <8588> <DCF6>
+<858A> <858A> <BCBB>
+<858C> <858C> <DCBC>
+<858F> <858F> <DEB2>
+<8591> <8591> <BDAA>
+<8594> <8594> <C7BE>
+<859B> <859B> <D1A6>
+<859C> <859C> <DEB5>
+<859F> <859F> <DDB2>
+<85A4> <85A4> <DEAF>
+<85A6> <85A6> <BCF6>
+<85A8> <85A8> <DEB0>
+<85A9> <85A9> <C8F8>
+<85AA> <85AA> <D0BD>
+<85AE> <85AE> <DEB4>
+<85AF> <85AF> <CAED>
+<85B0> <85B0> <DEB9>
+<85B7> <85B7> <DEB8>
+<85B9> <85B9> <DEB7>
+<85BA> <85BA> <DCF9>
+<85C1> <85C1> <DEBB>
+<85C9> <85C9> <BDE5>
+<85CD> <85CD> <C0B6>
+<85CE> <85CE> <DDA3>
+<85CF> <85CF> <B2D8>
+<85D0> <85D0> <C3EA>
+<85D3> <85D3> <DEBA>
+<85D5> <85D5> <C5BA>
+<85DC> <85DC> <DEBC>
+<85DD> <85DD> <D2D5>
+<85E4> <85E4> <CCD9>
+<85E5> <85E5> <D2A9>
+<85E9> <85E9> <B7AA>
+<85EA> <85EA> <DEB4>
+<85F4> <85F4> <D4CC>
+<85F6> <85F6> <DCC2>
+<85F9> <85F9> <B0AA>
+<85FA> <85FA> <DDFE>
+<85FB> <85FB> <D4E5>
+<85FF> <85FF> <DEBD>
+<8604> <8604> <DEAD>
+<8605> <8605> <DEBF>
+<8606> <8606> <C2AB>
+<8607> <8607> <CBD5>
+<860B> <860B> <C6BB>
+endbfrange
+
+100 beginbfrange
+<8611> <8611> <C4A2>
+<8616> <8616> <DEC1>
+<861A> <861A> <DEBA>
+<861E> <861E> <DDFC>
+<8622> <8622> <DCD7>
+<8627> <8627> <DEBE>
+<8629> <8629> <DEC0>
+<862D> <862D> <C0BC>
+<8638> <8638> <D5BA>
+<863A> <863A> <DDF1>
+<863C> <863C> <DEC2>
+<863F> <863F> <C2DC>
+<864D> <864D> <F2AE>
+<864E> <864E> <BBA2>
+<864F> <864F> <C2B2>
+<8650> <8650> <C5B0>
+<8651> <8651> <C2C7>
+<8654> <8654> <F2AF>
+<8655> <8655> <B4A6>
+<865A> <865A> <D0E9>
+<865C> <865C> <C2B2>
+<865E> <865E> <D3DD>
+<865F> <865F> <BAC5>
+<8662> <8662> <EBBD>
+<8667> <8667> <BFF7>
+<866B> <866B> <B3E6>
+<866C> <866C> <F2B0>
+<866E> <866E> <F2B1>
+<8671> <8671> <CAAD>
+<8679> <8679> <BAE7>
+<867A> <867A> <F2B3>
+<867B> <867B> <F2B5>
+<867C> <867C> <F2B4>
+<867D> <867D> <CBE4>
+<867E> <867E> <CFBA>
+<867F> <867F> <F2B2>
+<8680> <8680> <CAB4>
+<8681> <8681> <D2CF>
+<8682> <8682> <C2EC>
+<868A> <868A> <CEC3>
+<868B> <868B> <F2B8>
+<868C> <868C> <B0F6>
+<868D> <868D> <F2B7>
+<8693> <8693> <F2BE>
+<8695> <8695> <B2CF>
+<869C> <869C> <D1C1>
+<869D> <869D> <F2BA>
+<86A3> <86A3> <F2BC>
+<86A4> <86A4> <D4E9>
+<86A7> <86A7> <F2BB>
+<86A8> <86A8> <F2B6>
+<86A9> <86A9> <F2BF>
+<86AA> <86AA> <F2BD>
+<86AC> <86AC> <F2B9>
+<86AF> <86AF> <F2C7>
+<86B0> <86B0> <F2C4>
+<86B1> <86B1> <F2C6>
+<86B4> <86B4> <F2CA>
+<86B5> <86B5> <F2C2>
+<86B6> <86B6> <F2C0>
+<86BA> <86BA> <F2C5>
+<86C0> <86C0> <D6FB>
+<86C4> <86C4> <F2C1>
+<86C6> <86C6> <C7F9>
+<86C7> <86C7> <C9DF>
+<86C9> <86C9> <F2C8>
+<86CA> <86CA> <B9C6>
+<86CB> <86CB> <B5B0>
+<86CE> <86CE> <F2C3>
+<86CF> <86CF> <F2C9>
+<86D0> <86D0> <F2D0>
+<86D1> <86D1> <F2D6>
+<86D4> <86D4> <BBD7>
+<86D8> <86D8> <F2D5>
+<86D9> <86D9> <CDDC>
+<86DB> <86DB> <D6EB>
+<86DE> <86DE> <F2D2>
+<86DF> <86DF> <F2D4>
+<86E4> <86E4> <B8F2>
+<86E9> <86E9> <F2CB>
+<86ED> <86ED> <F2CE>
+<86EE> <86EE> <C2F9>
+<86F0> <86F0> <D5DD>
+<86F1> <86F2> <F2CC>
+<86F3> <86F3> <F2CF>
+<86F4> <86F4> <F2D3>
+<86F8> <86F8> <F2D9>
+<86F9> <86F9> <D3BC>
+<86FA> <86FA> <F2CC>
+<86FE> <86FE> <B6EA>
+<8700> <8700> <CAF1>
+<8702> <8702> <B7E4>
+<8703> <8703> <F2D7>
+<8706> <8706> <F2B9>
+<8707> <8707> <F2D8>
+<8708> <8708> <F2DA>
+<8709> <8709> <F2DD>
+<870A> <870A> <F2DB>
+<870D> <870D> <F2DC>
+<8712> <8712> <D1D1>
+endbfrange
+
+100 beginbfrange
+<8713> <8713> <F2D1>
+<8715> <8715> <CDC9>
+<8717> <8717> <CECF>
+<8718> <8718> <D6A9>
+<871A> <871A> <F2E3>
+<871C> <871C> <C3DB>
+<871E> <871E> <F2E0>
+<8721> <8721> <C0AF>
+<8722> <8722> <F2EC>
+<8723> <8723> <F2DE>
+<8725> <8725> <F2E1>
+<8729> <8729> <F2E8>
+<872E> <872E> <F2E2>
+<8731> <8731> <F2E7>
+<8734> <8734> <F2E6>
+<8737> <8737> <F2E9>
+<873B> <873B> <F2DF>
+<873E> <873E> <F2E4>
+<873F> <873F> <F2EA>
+<8747> <8747> <D3AC>
+<8748> <8748> <F2E5>
+<8749> <8749> <B2F5>
+<874C> <874C> <F2F2>
+<874E> <874E> <D0AB>
+<8753> <8753> <F2F5>
+<8755> <8755> <CAB4>
+<8757> <8757> <BBC8>
+<8759> <8759> <F2F9>
+<8760> <8760> <F2F0>
+<8763> <8763> <F2F6>
+<8764> <8764> <F2F8>
+<8765> <8765> <F2FA>
+<8766> <8766> <CFBA>
+<876E> <876E> <F2F3>
+<8770> <8770> <F2F1>
+<8774> <8774> <BAFB>
+<8776> <8776> <B5FB>
+<8778> <8778> <CECF>
+<877B> <877B> <F2EF>
+<877C> <877C> <F2F7>
+<877D> <877E> <F2ED>
+<8782> <8782> <F2EB>
+<8783> <8783> <F3A6>
+<8784> <8784> <F2CF>
+<8785> <8785> <F3A3>
+<8788> <8788> <F3A2>
+<878B> <878B> <F2F4>
+<878D> <878D> <C8DA>
+<8793> <8793> <F2FB>
+<8797> <8797> <F3A5>
+<879E> <879E> <C2EC>
+<879F> <879F> <C3F8>
+<87A2> <87A2> <D3A9>
+<87A8> <87A8> <F2FD>
+<87AB> <87AB> <F3A7>
+<87AC> <87AC> <F3A9>
+<87AD> <87AD> <F3A4>
+<87AF> <87AF> <F2FC>
+<87B3> <87B3> <F3AB>
+<87B5> <87B5> <F3AA>
+<87BA> <87BA> <C2DD>
+<87BB> <87BB> <F2F7>
+<87BD> <87BD> <F3AE>
+<87C0> <87C0> <F3B0>
+<87C4> <87C4> <D5DD>
+<87C6> <87C6> <F3A1>
+<87C8> <87C8> <F2E5>
+<87CA> <87CA> <F3B1>
+<87CB> <87CB> <F3AC>
+<87CE> <87CE> <F2FD>
+<87D1> <87D1> <F3AF>
+<87D2> <87D2> <F2FE>
+<87D3> <87D3> <F3AD>
+<87DB> <87DB> <F3B2>
+<87E0> <87E0> <F3B4>
+<87E3> <87E3> <F2B1>
+<87E5> <87E5> <F3A8>
+<87EA> <87EA> <F3B3>
+<87EC> <87EC> <B2F5>
+<87EE> <87EE> <F3B5>
+<87EF> <87EF> <F2CD>
+<87F2> <87F2> <B3E6>
+<87F6> <87F6> <F2C9>
+<87F9> <87F9> <D0B7>
+<87FB> <87FB> <D2CF>
+<87FE> <87FE> <F3B8>
+<8803> <8803> <D9F9>
+<8805> <8805> <D3AC>
+<8806> <8806> <F2B2>
+<880A> <880A> <F3B9>
+<8810> <8810> <F2D3>
+<8811> <8811> <F2EE>
+<8813> <8813> <F3B7>
+<8815> <8815> <C8E4>
+<8816> <8816> <F3B6>
+<881B> <881B> <F3BA>
+<881F> <881F> <C0AF>
+<8821> <8821> <F3BB>
+<8822> <8822> <B4C0>
+<8823> <8823> <F2C3>
+endbfrange
+
+100 beginbfrange
+<8831> <8831> <B9C6>
+<8832> <8832> <EEC3>
+<8836> <8836> <B2CF>
+<8839> <8839> <F3BC>
+<883B> <883B> <C2F9>
+<883C> <883C> <F3BD>
+<8840> <8840> <D1AA>
+<8844> <8844> <F4AC>
+<8845> <8845> <D0C6>
+<8846> <8846> <D6DA>
+<884A> <884A> <C3EF>
+<884C> <884C> <D0D0>
+<884D> <884D> <D1DC>
+<8853> <8853> <CAF5>
+<8854> <8854> <CFCE>
+<8857> <8857> <BDD6>
+<8859> <8859> <D1C3>
+<885B> <885B> <CEC0>
+<885D> <885D> <B3E5>
+<8861> <8861> <BAE2>
+<8862> <8862> <E1E9>
+<8863> <8863> <D2C2>
+<8864> <8864> <F1C2>
+<8865> <8865> <B2B9>
+<8868> <8868> <B1ED>
+<8869> <8869> <F1C3>
+<886B> <886B> <C9C0>
+<886C> <886C> <B3C4>
+<886E> <886E> <D9F2>
+<8870> <8870> <CBA5>
+<8872> <8872> <F1C4>
+<8877> <8877> <D6D4>
+<8879> <8879> <D6BB>
+<887D> <887D> <F1C5>
+<887E> <887E> <F4C0>
+<887F> <887F> <F1C6>
+<8881> <8881> <D4AC>
+<8882> <8882> <F1C7>
+<8884> <8884> <B0C0>
+<8885> <8885> <F4C1>
+<8888> <8888> <F4C2>
+<888B> <888B> <B4FC>
+<888D> <888D> <C5DB>
+<8892> <8892> <CCBB>
+<8896> <8896> <D0E4>
+<889C> <889C> <CDE0>
+<88A2> <88A2> <F1C8>
+<88A4> <88A4> <D9F3>
+<88AB> <88AB> <B1BB>
+<88AD> <88AD> <CFAE>
+<88B1> <88B1> <B8A4>
+<88B7> <88B7> <F1CA>
+<88BC> <88BC> <F1CB>
+<88C1> <88C1> <B2C3>
+<88C2> <88C2> <C1D1>
+<88C5> <88C5> <D7B0>
+<88C6> <88C6> <F1C9>
+<88C9> <88C9> <F1CC>
+<88CA> <88CA> <F4C1>
+<88CE> <88CE> <F1CE>
+<88CF> <88CF> <C0EF>
+<88D2> <88D2> <D9F6>
+<88D4> <88D4> <D2E1>
+<88D5> <88D5> <D4A3>
+<88D8> <88D8> <F4C3>
+<88D9> <88D9> <C8B9>
+<88DC> <88DC> <B2B9>
+<88DD> <88DD> <D7B0>
+<88DF> <88DF> <F4C4>
+<88E2> <88E2> <F1CD>
+<88E3> <88E3> <F1CF>
+<88E4> <88E4> <BFE3>
+<88E5> <88E5> <F1D0>
+<88E8> <88E8> <F1D4>
+<88F0> <88F0> <F1D6>
+<88F1> <88F1> <F1D1>
+<88F3> <88F3> <C9D1>
+<88F4> <88F4> <C5E1>
+<88F8> <88F8> <C2E3>
+<88F9> <88F9> <B9FC>
+<88FC> <88FC> <F1D3>
+<88FD> <88FD> <D6C6>
+<88FE> <88FE> <F1D5>
+<8902> <8902> <B9D3>
+<8907> <8907> <B8B4>
+<890A> <890A> <F1DB>
+<8910> <8910> <BAD6>
+<8912> <8912> <B0FD>
+<8913> <8913> <F1D9>
+<8919> <8919> <F1D8>
+<891A> <891A> <F1D2>
+<891B> <891B> <F1DA>
+<8921> <8921> <F1D7>
+<8925> <8925> <C8EC>
+<892A> <892A> <CDCA>
+<892B> <892B> <F1DD>
+<8930> <8930> <E5BD>
+<8932> <8932> <BFE3>
+<8933> <8933> <F1CD>
+<8934> <8934> <F1DC>
+endbfrange
+
+100 beginbfrange
+<8936> <8936> <F1DE>
+<8938> <8938> <F1DA>
+<893B> <893B> <D9F4>
+<8941> <8941> <F1DF>
+<8944> <8944> <CFE5>
+<8947> <8947> <F1D0>
+<8956> <8956> <B0C0>
+<895D> <895D> <F1CF>
+<895E> <895E> <F4C5>
+<895F> <895F> <BDF3>
+<8960> <8960> <F1C9>
+<8964> <8964> <F1DC>
+<8966> <8966> <F1E0>
+<896A> <896A> <CDE0>
+<896C> <896C> <B0DA>
+<896F> <896F> <B3C4>
+<8972> <8972> <CFAE>
+<897B> <897B> <F1E1>
+<897F> <897F> <CEF7>
+<8981> <8981> <D2AA>
+<8983> <8983> <F1FB>
+<8986> <8986> <B8B2>
+<898B> <898B> <BCFB>
+<898F> <898F> <B9E6>
+<8993> <8993> <C3D9>
+<8996> <8996> <CAD3>
+<8998> <8998> <EAE8>
+<89A1> <89A1> <EAEA>
+<89A6> <89A6> <EAEC>
+<89AA> <89AA> <C7D7>
+<89AC> <89AC> <EAE9>
+<89AF> <89AF> <EAED>
+<89B2> <89B2> <EAEE>
+<89B7> <89B7> <EAEF>
+<89BA> <89BA> <BEF5>
+<89BD> <89BD> <C0C0>
+<89BF> <89BF> <EAEB>
+<89C0> <89C0> <B9DB>
+<89C1> <89C1> <BCFB>
+<89C2> <89C2> <B9DB>
+<89C4> <89C4> <B9E6>
+<89C5> <89C5> <C3D9>
+<89C6> <89C6> <CAD3>
+<89C7> <89C7> <EAE8>
+<89C8> <89C8> <C0C0>
+<89C9> <89C9> <BEF5>
+<89CA> <89CC> <EAE9>
+<89CE> <89D1> <EAEC>
+<89D2> <89D2> <BDC7>
+<89D6> <89D6> <F5FB>
+<89DA> <89DA> <F5FD>
+<89DC> <89DC> <F5FE>
+<89DE> <89DE> <F5FC>
+<89E3> <89E3> <BDE2>
+<89E5> <89E5> <F6A1>
+<89E6> <89E6> <B4A5>
+<89EB> <89EB> <F6A2>
+<89EF> <89EF> <F6A3>
+<89F3> <89F3> <ECB2>
+<89F4> <89F4> <F5FC>
+<89F6> <89F6> <F6A3>
+<89F8> <89F8> <B4A5>
+<8A00> <8A00> <D1D4>
+<8A01> <8A01> <DAA5>
+<8A02> <8A02> <B6A9>
+<8A03> <8A03> <B8BC>
+<8A07> <8A07> <D9EA>
+<8A08> <8A08> <BCC6>
+<8A0A> <8A0A> <D1B6>
+<8A0C> <8A0C> <DAA7>
+<8A0E> <8A0E> <CCD6>
+<8A10> <8A10> <DAA6>
+<8A13> <8A13> <D1B5>
+<8A15> <8A15> <DAA8>
+<8A16> <8A16> <C6FD>
+<8A18> <8A18> <BCC7>
+<8A1B> <8A1B> <B6EF>
+<8A1D> <8A1D> <D1C8>
+<8A1F> <8A1F> <CBCF>
+<8A23> <8A23> <BEF7>
+<8A25> <8A25> <DAAB>
+<8A2A> <8A2A> <B7C3>
+<8A2D> <8A2D> <C9E8>
+<8A31> <8A31> <D0ED>
+<8A34> <8A34> <CBDF>
+<8A36> <8A36> <DAAD>
+<8A3A> <8A3A> <D5EF>
+<8A3E> <8A3E> <F6A4>
+<8A41> <8A41> <DAAC>
+<8A46> <8A46> <DAAE>
+<8A48> <8A48> <EEBA>
+<8A4E> <8A4E> <DAAA>
+<8A50> <8A50> <D5A9>
+<8A52> <8A52> <DAB1>
+<8A54> <8A54> <DAAF>
+<8A55> <8A55> <C6C0>
+<8A58> <8A58> <DAB0>
+<8A5B> <8A5B> <D7E7>
+<8A5E> <8A5E> <B4CA>
+<8A61> <8A61> <DABC>
+endbfrange
+
+100 beginbfrange
+<8A62> <8A62> <D1AF>
+<8A63> <8A63> <D2E8>
+<8A66> <8A66> <CAD4>
+<8A69> <8A69> <CAAB>
+<8A6B> <8A6B> <B2EF>
+<8A6C> <8A6C> <DAB8>
+<8A6D> <8A6D> <B9EE>
+<8A6E> <8A6E> <DAB9>
+<8A70> <8A70> <DAB5>
+<8A71> <8A71> <BBB0>
+<8A72> <8A72> <B8C3>
+<8A73> <8A73> <CFEA>
+<8A75> <8A75> <DAB7>
+<8A79> <8A79> <D5B2>
+<8A7C> <8A7C> <DAB6>
+<8A7F> <8A7F> <DAB4>
+<8A84> <8A84> <DAB3>
+<8A85> <8A85> <D6EF>
+<8A86> <8A86> <DAB2>
+<8A87> <8A87> <BFE4>
+<8A89> <8A89> <D3FE>
+<8A8A> <8A8A> <CCDC>
+<8A8D> <8A8D> <C8CF>
+<8A91> <8A91> <DABF>
+<8A92> <8A92> <DAC0>
+<8A93> <8A93> <CAC4>
+<8A95> <8A95> <B5AE>
+<8A98> <8A98> <D3D5>
+<8A9A> <8A9A> <DABD>
+<8A9E> <8A9E> <D3EF>
+<8AA0> <8AA0> <B3CF>
+<8AA1> <8AA1> <BDEB>
+<8AA3> <8AA3> <CEDC>
+<8AA4> <8AA4> <CEF3>
+<8AA5> <8AA5> <DABE>
+<8AA6> <8AA6> <CBD0>
+<8AA8> <8AA8> <BBE5>
+<8AAC> <8AAC> <CBB5>
+<8AB0> <8AB0> <CBAD>
+<8AB2> <8AB2> <BFCE>
+<8AB6> <8AB6> <DAC7>
+<8AB9> <8AB9> <B7CC>
+<8ABC> <8ABC> <D2EA>
+<8ABF> <8ABF> <B5F7>
+<8AC2> <8AC2> <DAC6>
+<8AC4> <8AC4> <D7BB>
+<8AC7> <8AC7> <CCB8>
+<8AC9> <8AC9> <DAC3>
+<8ACB> <8ACB> <C7EB>
+<8ACD> <8ACD> <DABA>
+<8ACF> <8ACF> <DAC1>
+<8AD1> <8AD1> <DAC2>
+<8AD2> <8AD2> <C1C2>
+<8AD6> <8AD6> <C2DB>
+<8AD7> <8AD7> <DAC5>
+<8ADB> <8ADB> <DAC4>
+<8ADC> <8ADC> <B5FD>
+<8ADE> <8ADE> <DAD2>
+<8AE2> <8AE2> <DABB>
+<8AE4> <8AE4> <DACC>
+<8AE6> <8AE6> <DAD0>
+<8AE7> <8AE7> <D0B3>
+<8AEB> <8AEB> <DAC9>
+<8AED> <8AED> <DACD>
+<8AEE> <8AEE> <DAD1>
+<8AF1> <8AF1> <BBE4>
+<8AF3> <8AF3> <DACF>
+<8AF6> <8AF6> <DAC8>
+<8AF7> <8AF7> <B7ED>
+<8AF8> <8AF8> <D6EE>
+<8AFA> <8AFA> <D1E8>
+<8AFC> <8AFC> <DACE>
+<8AFE> <8AFE> <C5B5>
+<8B00> <8B00> <C4B1>
+<8B01> <8B01> <DACB>
+<8B02> <8B02> <CEBD>
+<8B04> <8B04> <CCDC>
+<8B05> <8B05> <D6DF>
+<8B07> <8B07> <E5C0>
+<8B0A> <8B0A> <BBD1>
+<8B0E> <8B0E> <C3D5>
+<8B10> <8B10> <DAD7>
+<8B14> <8B14> <DACA>
+<8B16> <8B16> <DAD5>
+<8B17> <8B17> <B0F9>
+<8B19> <8B19> <C7AB>
+<8B1A> <8B1A> <DAD6>
+<8B1B> <8B1B> <BDB2>
+<8B1D> <8B1D> <D0BB>
+<8B21> <8B21> <D2A5>
+<8B26> <8B26> <F6A5>
+<8B28> <8B28> <DAD3>
+<8B2B> <8B2B> <DAD8>
+<8B2C> <8B2C> <C3FD>
+<8B2D> <8B2D> <DAD9>
+<8B33> <8B33> <DAA9>
+<8B39> <8B39> <BDF7>
+<8B3E> <8B3E> <C3A1>
+<8B49> <8B49> <D6A4>
+<8B4E> <8B4E> <DADC>
+endbfrange
+
+100 beginbfrange
+<8B4F> <8B4F> <BCA5>
+<8B56> <8B56> <DADA>
+<8B58> <8B58> <CAB6>
+<8B59> <8B59> <DADB>
+<8B5A> <8B5A> <CCB7>
+<8B5C> <8B5C> <C6D7>
+<8B66> <8B66> <BEAF>
+<8B6B> <8B6B> <DADE>
+<8B6C> <8B6C> <C6A9>
+<8B6F> <8B6F> <D2EB>
+<8B70> <8B70> <D2E9>
+<8B74> <8B74> <C7B4>
+<8B77> <8B77> <BBA4>
+<8B7D> <8B7D> <D3FE>
+<8B80> <8B80> <B6C1>
+<8B8A> <8B8A> <B1E4>
+<8B8E> <8B8E> <F6C5>
+<8B92> <8B92> <B2F7>
+<8B93> <8B93> <C8C3>
+<8B95> <8B95> <C0BE>
+<8B96> <8B96> <DADF>
+<8B9C> <8B9C> <DAD4>
+<8B9E> <8B9E> <DADD>
+<8BA0> <8BA0> <DAA5>
+<8BA1> <8BA1> <BCC6>
+<8BA2> <8BA2> <B6A9>
+<8BA3> <8BA3> <B8BC>
+<8BA4> <8BA4> <C8CF>
+<8BA5> <8BA5> <BCA5>
+<8BA6> <8BA7> <DAA6>
+<8BA8> <8BA8> <CCD6>
+<8BA9> <8BA9> <C8C3>
+<8BAA> <8BAA> <DAA8>
+<8BAB> <8BAB> <C6FD>
+<8BAD> <8BAD> <D1B5>
+<8BAE> <8BAE> <D2E9>
+<8BAF> <8BAF> <D1B6>
+<8BB0> <8BB0> <BCC7>
+<8BB2> <8BB2> <BDB2>
+<8BB3> <8BB3> <BBE4>
+<8BB4> <8BB5> <DAA9>
+<8BB6> <8BB6> <D1C8>
+<8BB7> <8BB7> <DAAB>
+<8BB8> <8BB8> <D0ED>
+<8BB9> <8BB9> <B6EF>
+<8BBA> <8BBA> <C2DB>
+<8BBC> <8BBC> <CBCF>
+<8BBD> <8BBD> <B7ED>
+<8BBE> <8BBE> <C9E8>
+<8BBF> <8BBF> <B7C3>
+<8BC0> <8BC0> <BEF7>
+<8BC1> <8BC1> <D6A4>
+<8BC2> <8BC3> <DAAC>
+<8BC4> <8BC4> <C6C0>
+<8BC5> <8BC5> <D7E7>
+<8BC6> <8BC6> <CAB6>
+<8BC8> <8BC8> <D5A9>
+<8BC9> <8BC9> <CBDF>
+<8BCA> <8BCA> <D5EF>
+<8BCB> <8BCB> <DAAE>
+<8BCC> <8BCC> <D6DF>
+<8BCD> <8BCD> <B4CA>
+<8BCE> <8BCE> <DAB0>
+<8BCF> <8BCF> <DAAF>
+<8BD1> <8BD1> <D2EB>
+<8BD2> <8BD4> <DAB1>
+<8BD5> <8BD5> <CAD4>
+<8BD6> <8BD6> <DAB4>
+<8BD7> <8BD7> <CAAB>
+<8BD8> <8BD9> <DAB5>
+<8BDA> <8BDA> <B3CF>
+<8BDB> <8BDB> <D6EF>
+<8BDC> <8BDC> <DAB7>
+<8BDD> <8BDD> <BBB0>
+<8BDE> <8BDE> <B5AE>
+<8BDF> <8BE0> <DAB8>
+<8BE1> <8BE1> <B9EE>
+<8BE2> <8BE2> <D1AF>
+<8BE3> <8BE3> <D2E8>
+<8BE4> <8BE4> <DABA>
+<8BE5> <8BE5> <B8C3>
+<8BE6> <8BE6> <CFEA>
+<8BE7> <8BE7> <B2EF>
+<8BE8> <8BE9> <DABB>
+<8BEB> <8BEB> <BDEB>
+<8BEC> <8BEC> <CEDC>
+<8BED> <8BED> <D3EF>
+<8BEE> <8BEE> <DABD>
+<8BEF> <8BEF> <CEF3>
+<8BF0> <8BF0> <DABE>
+<8BF1> <8BF1> <D3D5>
+<8BF2> <8BF2> <BBE5>
+<8BF3> <8BF3> <DABF>
+<8BF4> <8BF4> <CBB5>
+<8BF5> <8BF5> <CBD0>
+<8BF6> <8BF6> <DAC0>
+<8BF7> <8BF7> <C7EB>
+<8BF8> <8BF8> <D6EE>
+<8BF9> <8BF9> <DAC1>
+<8BFA> <8BFA> <C5B5>
+endbfrange
+
+100 beginbfrange
+<8BFB> <8BFB> <B6C1>
+<8BFC> <8BFC> <DAC2>
+<8BFD> <8BFD> <B7CC>
+<8BFE> <8BFE> <BFCE>
+<8BFF> <8BFF> <DAC3>
+<8C00> <8C00> <DAC4>
+<8C01> <8C01> <CBAD>
+<8C02> <8C02> <DAC5>
+<8C03> <8C03> <B5F7>
+<8C04> <8C04> <DAC6>
+<8C05> <8C05> <C1C2>
+<8C06> <8C06> <D7BB>
+<8C07> <8C07> <DAC7>
+<8C08> <8C08> <CCB8>
+<8C0A> <8C0A> <D2EA>
+<8C0B> <8C0B> <C4B1>
+<8C0C> <8C0C> <DAC8>
+<8C0D> <8C0D> <B5FD>
+<8C0E> <8C0E> <BBD1>
+<8C0F> <8C0F> <DAC9>
+<8C10> <8C10> <D0B3>
+<8C11> <8C12> <DACA>
+<8C13> <8C13> <CEBD>
+<8C14> <8C16> <DACC>
+<8C17> <8C17> <B2F7>
+<8C18> <8C18> <DAD1>
+<8C19> <8C19> <DACF>
+<8C1A> <8C1A> <D1E8>
+<8C1B> <8C1B> <DAD0>
+<8C1C> <8C1C> <C3D5>
+<8C1D> <8C1D> <DAD2>
+<8C1F> <8C21> <DAD3>
+<8C22> <8C22> <D0BB>
+<8C23> <8C23> <D2A5>
+<8C24> <8C24> <B0F9>
+<8C25> <8C25> <DAD6>
+<8C26> <8C26> <C7AB>
+<8C27> <8C27> <DAD7>
+<8C28> <8C28> <BDF7>
+<8C29> <8C29> <C3A1>
+<8C2A> <8C2B> <DAD8>
+<8C2C> <8C2C> <C3FD>
+<8C2D> <8C2D> <CCB7>
+<8C2E> <8C2F> <DADA>
+<8C30> <8C30> <C0BE>
+<8C31> <8C31> <C6D7>
+<8C32> <8C33> <DADC>
+<8C34> <8C34> <C7B4>
+<8C35> <8C36> <DADE>
+<8C37> <8C37> <B9C8>
+<8C41> <8C41> <BBED>
+<8C46> <8C46> <B6B9>
+<8C47> <8C47> <F4F8>
+<8C48> <8C48> <C6F1>
+<8C49> <8C49> <F4F9>
+<8C4C> <8C4C> <CDE3>
+<8C50> <8C50> <B7E1>
+<8C55> <8C55> <F5B9>
+<8C5A> <8C5A> <EBE0>
+<8C61> <8C61> <CFF3>
+<8C62> <8C62> <BBBF>
+<8C6A> <8C6A> <BAC0>
+<8C6B> <8C6B> <D4A5>
+<8C73> <8C73> <E1D9>
+<8C78> <8C78> <F5F4>
+<8C79> <8C79> <B1AA>
+<8C7A> <8C7A> <B2F2>
+<8C82> <8C82> <F5F5>
+<8C85> <8C85> <F5F7>
+<8C89> <8C89> <BAD1>
+<8C8A> <8C8A> <F5F6>
+<8C8C> <8C8C> <C3B2>
+<8C94> <8C94> <F5F9>
+<8C98> <8C98> <F5F8>
+<8C9D> <8C9D> <B1B4>
+<8C9E> <8C9E> <D5EA>
+<8CA0> <8CA0> <B8BA>
+<8CA1> <8CA1> <B2C6>
+<8CA2> <8CA2> <B9B1>
+<8CA7> <8CA7> <C6B6>
+<8CA8> <8CA8> <BBF5>
+<8CA9> <8CA9> <B7B7>
+<8CAA> <8CAA> <CCB0>
+<8CAB> <8CAB> <B9E1>
+<8CAC> <8CAC> <D4F0>
+<8CAF> <8CAF> <D6FC>
+<8CB0> <8CB0> <EADB>
+<8CB2> <8CB2> <EADF>
+<8CB3> <8CB3> <B7A1>
+<8CB4> <8CB4> <B9F3>
+<8CB6> <8CB6> <B1E1>
+<8CB7> <8CB7> <C2F2>
+<8CB8> <8CB8> <B4FB>
+<8CBA> <8CBA> <EADC>
+<8CBB> <8CBB> <B7D1>
+<8CBC> <8CBC> <CCF9>
+<8CBD> <8CBD> <EADD>
+<8CBF> <8CBF> <C3B3>
+<8CC0> <8CC0> <BAD8>
+<8CC1> <8CC1> <EADA>
+endbfrange
+
+100 beginbfrange
+<8CC2> <8CC2> <C2B8>
+<8CC3> <8CC3> <C1DE>
+<8CC4> <8CC4> <BBDF>
+<8CC5> <8CC5> <EAE0>
+<8CC7> <8CC7> <D7CA>
+<8CC8> <8CC8> <BCD6>
+<8CCA> <8CCA> <D4F4>
+<8CD1> <8CD1> <EAE2>
+<8CD2> <8CD2> <C9DE>
+<8CD3> <8CD3> <B1F6>
+<8CD5> <8CD5> <EAE4>
+<8CDA> <8CDA> <EAE3>
+<8CDC> <8CDC> <B4CD>
+<8CDE> <8CDE> <C9CD>
+<8CE0> <8CE0> <C5E2>
+<8CE1> <8CE1> <E2D9>
+<8CE2> <8CE2> <CFCD>
+<8CE3> <8CE3> <C2F4>
+<8CE4> <8CE4> <BCFA>
+<8CE6> <8CE6> <B8B3>
+<8CE7> <8CE7> <EAE6>
+<8CEA> <8CEA> <D6CA>
+<8CEB> <8CEB> <EAE5>
+<8CEC> <8CEC> <D5CB>
+<8CED> <8CED> <B6C4>
+<8CF4> <8CF4> <C0B5>
+<8CFA> <8CFA> <D7AC>
+<8CFB> <8CFB> <EAE7>
+<8CFC> <8CFC> <B9BA>
+<8CFD> <8CFD> <C8FC>
+<8CFE> <8CFE> <D8D3>
+<8D04> <8D04> <EADE>
+<8D05> <8D05> <D7B8>
+<8D08> <8D08> <D4F9>
+<8D0A> <8D0A> <D4DE>
+<8D0B> <8D0B> <D8CD>
+<8D0D> <8D0D> <C9C4>
+<8D0F> <8D0F> <D3AE>
+<8D10> <8D10> <EAE1>
+<8D16> <8D16> <CAEA>
+<8D1B> <8D1B> <B8D3>
+<8D1C> <8D1C> <D4DF>
+<8D1D> <8D1D> <B1B4>
+<8D1E> <8D1E> <D5EA>
+<8D1F> <8D1F> <B8BA>
+<8D21> <8D21> <B9B1>
+<8D22> <8D22> <B2C6>
+<8D23> <8D23> <D4F0>
+<8D24> <8D24> <CFCD>
+<8D25> <8D25> <B0DC>
+<8D26> <8D26> <D5CB>
+<8D27> <8D27> <BBF5>
+<8D28> <8D28> <D6CA>
+<8D29> <8D29> <B7B7>
+<8D2A> <8D2A> <CCB0>
+<8D2B> <8D2B> <C6B6>
+<8D2C> <8D2C> <B1E1>
+<8D2D> <8D2D> <B9BA>
+<8D2E> <8D2E> <D6FC>
+<8D2F> <8D2F> <B9E1>
+<8D30> <8D30> <B7A1>
+<8D31> <8D31> <BCFA>
+<8D32> <8D33> <EADA>
+<8D34> <8D34> <CCF9>
+<8D35> <8D35> <B9F3>
+<8D36> <8D36> <EADC>
+<8D37> <8D37> <B4FB>
+<8D38> <8D38> <C3B3>
+<8D39> <8D39> <B7D1>
+<8D3A> <8D3A> <BAD8>
+<8D3B> <8D3B> <EADD>
+<8D3C> <8D3C> <D4F4>
+<8D3D> <8D3D> <EADE>
+<8D3E> <8D3E> <BCD6>
+<8D3F> <8D3F> <BBDF>
+<8D40> <8D40> <EADF>
+<8D41> <8D41> <C1DE>
+<8D42> <8D42> <C2B8>
+<8D43> <8D43> <D4DF>
+<8D44> <8D44> <D7CA>
+<8D45> <8D46> <EAE0>
+<8D47> <8D47> <EAE4>
+<8D48> <8D49> <EAE2>
+<8D4A> <8D4A> <C9DE>
+<8D4B> <8D4B> <B8B3>
+<8D4C> <8D4C> <B6C4>
+<8D4D> <8D4D> <EAE5>
+<8D4E> <8D4E> <CAEA>
+<8D4F> <8D4F> <C9CD>
+<8D50> <8D50> <B4CD>
+<8D53> <8D53> <E2D9>
+<8D54> <8D54> <C5E2>
+<8D55> <8D55> <EAE6>
+<8D56> <8D56> <C0B5>
+<8D58> <8D58> <D7B8>
+<8D59> <8D59> <EAE7>
+<8D5A> <8D5A> <D7AC>
+<8D5B> <8D5B> <C8FC>
+<8D5C> <8D5C> <D8D3>
+<8D5D> <8D5D> <D8CD>
+endbfrange
+
+100 beginbfrange
+<8D5E> <8D5E> <D4DE>
+<8D60> <8D60> <D4F9>
+<8D61> <8D61> <C9C4>
+<8D62> <8D62> <D3AE>
+<8D63> <8D63> <B8D3>
+<8D64> <8D64> <B3E0>
+<8D66> <8D66> <C9E2>
+<8D67> <8D67> <F4F6>
+<8D6B> <8D6B> <BAD5>
+<8D6D> <8D6D> <F4F7>
+<8D70> <8D70> <D7DF>
+<8D73> <8D73> <F4F1>
+<8D74> <8D74> <B8B0>
+<8D75> <8D75> <D5D4>
+<8D76> <8D76> <B8CF>
+<8D77> <8D77> <C6F0>
+<8D81> <8D81> <B3C3>
+<8D84> <8D84> <F4F2>
+<8D85> <8D85> <B3AC>
+<8D8A> <8D8A> <D4BD>
+<8D8B> <8D8B> <C7F7>
+<8D91> <8D91> <F4F4>
+<8D94> <8D94> <F4F3>
+<8D95> <8D95> <B8CF>
+<8D99> <8D99> <D5D4>
+<8D9F> <8D9F> <CCCB>
+<8DA3> <8DA3> <C8A4>
+<8DA8> <8DA8> <C7F7>
+<8DB1> <8DB1> <F4F5>
+<8DB2> <8DB2> <F4F5>
+<8DB3> <8DB3> <D7E3>
+<8DB4> <8DB4> <C5BF>
+<8DB5> <8DB5> <F5C0>
+<8DB8> <8DB8> <F5BB>
+<8DBA> <8DBA> <F5C3>
+<8DBC> <8DBC> <F5C2>
+<8DBE> <8DBE> <D6BA>
+<8DBF> <8DBF> <F5C1>
+<8DC3> <8DC3> <D4BE>
+<8DC4> <8DC4> <F5C4>
+<8DC6> <8DC6> <F5CC>
+<8DCB> <8DCB> <B0CF>
+<8DCC> <8DCC> <B5F8>
+<8DCE> <8DCF> <F5C9>
+<8DD1> <8DD1> <C5DC>
+<8DD6> <8DD7> <F5C5>
+<8DDA> <8DDA> <F5C7>
+<8DDB> <8DDB> <F5CB>
+<8DDD> <8DDD> <BEE0>
+<8DDE> <8DDE> <F5C8>
+<8DDF> <8DDF> <B8FA>
+<8DE3> <8DE3> <F5D0>
+<8DE4> <8DE4> <F5D3>
+<8DE8> <8DE8> <BFE7>
+<8DEA> <8DEA> <B9F2>
+<8DEB> <8DEB> <F5BC>
+<8DEC> <8DEC> <F5CD>
+<8DEF> <8DEF> <C2B7>
+<8DF3> <8DF3> <CCF8>
+<8DF5> <8DF5> <BCF9>
+<8DF7> <8DF8> <F5CE>
+<8DF9> <8DF9> <F5D1>
+<8DFA> <8DFA> <B6E5>
+<8DFB> <8DFB> <F5D2>
+<8DFD> <8DFD> <F5D5>
+<8E05> <8E05> <F5BD>
+<8E09> <8E09> <F5D4>
+<8E0A> <8E0A> <D3BB>
+<8E0C> <8E0C> <B3EC>
+<8E0F> <8E0F> <CCA4>
+<8E10> <8E10> <BCF9>
+<8E14> <8E14> <F5D6>
+<8E1D> <8E1D> <F5D7>
+<8E1E> <8E1E> <BEE1>
+<8E1F> <8E1F> <F5D8>
+<8E22> <8E22> <CCDF>
+<8E23> <8E23> <F5DB>
+<8E29> <8E29> <B2C8>
+<8E2A> <8E2A> <D7D9>
+<8E2C> <8E2C> <F5D9>
+<8E2E> <8E2E> <F5DA>
+<8E2F> <8E2F> <F5DC>
+<8E31> <8E31> <F5E2>
+<8E34> <8E34> <D3BB>
+<8E35> <8E35> <F5E0>
+<8E39> <8E39> <F5DF>
+<8E3A> <8E3A> <F5DD>
+<8E3D> <8E3D> <F5E1>
+<8E40> <8E40> <F5DE>
+<8E41> <8E42> <F5E4>
+<8E44> <8E44> <CCE3>
+<8E47> <8E47> <E5BF>
+<8E48> <8E48> <B5B8>
+<8E49> <8E49> <F5E3>
+<8E4A> <8E4A> <F5E8>
+<8E4B> <8E4B> <CCA3>
+<8E4C> <8E4C> <F5C4>
+<8E51> <8E52> <F5E6>
+<8E55> <8E55> <F5CF>
+<8E59> <8E59> <F5BE>
+endbfrange
+
+100 beginbfrange
+<8E63> <8E63> <F5E7>
+<8E66> <8E66> <B1C4>
+<8E69> <8E69> <F5BF>
+<8E6C> <8E6C> <B5C5>
+<8E6D> <8E6D> <B2E4>
+<8E6F> <8E6F> <F5EC>
+<8E70> <8E70> <F5E9>
+<8E72> <8E72> <B6D7>
+<8E74> <8E74> <F5ED>
+<8E76> <8E76> <F5EA>
+<8E7A> <8E7A> <F5CE>
+<8E7C> <8E7C> <F5EB>
+<8E7F> <8E7F> <B4DA>
+<8E81> <8E81> <D4EA>
+<8E85> <8E85> <F5EE>
+<8E87> <8E87> <B3F9>
+<8E89> <8E89> <F5BB>
+<8E8A> <8E8A> <B3EC>
+<8E8B> <8E8B> <F5D2>
+<8E8D> <8E8D> <D4BE>
+<8E8F> <8E8F> <F5EF>
+<8E90> <8E90> <F5F1>
+<8E91> <8E91> <F5DC>
+<8E92> <8E92> <F5C8>
+<8E93> <8E93> <F5D9>
+<8E94> <8E94> <F5F0>
+<8E9A> <8E9A> <F5D1>
+<8E9C> <8E9C> <F5F2>
+<8E9E> <8E9E> <F5F3>
+<8EA1> <8EA1> <F5E6>
+<8EA5> <8EA5> <B4DA>
+<8EA6> <8EA6> <F5F2>
+<8EAA> <8EAA> <F5EF>
+<8EAB> <8EAB> <C9ED>
+<8EAC> <8EAC> <B9AA>
+<8EAF> <8EAF> <C7FB>
+<8EB2> <8EB2> <B6E3>
+<8EBA> <8EBA> <CCC9>
+<8EC0> <8EC0> <C7FB>
+<8ECA> <8ECA> <B3B5>
+<8ECB> <8ECB> <D4FE>
+<8ECC> <8ECC> <B9EC>
+<8ECD> <8ECD> <BEFC>
+<8ECE> <8ECE> <EAA6>
+<8ED2> <8ED2> <D0F9>
+<8ED4> <8ED4> <E9ED>
+<8EDB> <8EDB> <E9EE>
+<8EDF> <8EDF> <C8ED>
+<8EE4> <8EE4> <E9F5>
+<8EEB> <8EEB> <E9F4>
+<8EF2> <8EF2> <E9EF>
+<8EF8> <8EF8> <D6E1>
+<8EF9> <8EF9> <E9F2>
+<8EFA> <8EFA> <E9F7>
+<8EFB> <8EFB> <E9F0>
+<8EFC> <8EFC> <E9F3>
+<8EFE> <8EFE> <E9F8>
+<8F03> <8F03> <BDCF>
+<8F05> <8F05> <E9FB>
+<8F07> <8F07> <E9FA>
+<8F09> <8F09> <D4D8>
+<8F0A> <8F0A> <E9F9>
+<8F12> <8F12> <E9FC>
+<8F14> <8F14> <B8A8>
+<8F15> <8F15> <C7E1>
+<8F1B> <8F1B> <C1BE>
+<8F1C> <8F1C> <EAA2>
+<8F1D> <8F1D> <BBD4>
+<8F1E> <8F1E> <E9FE>
+<8F1F> <8F1F> <EAA1>
+<8F25> <8F25> <B9F5>
+<8F26> <8F26> <E9FD>
+<8F29> <8F29> <B1B2>
+<8F2A> <8F2A> <C2D6>
+<8F2F> <8F2F> <BCAD>
+<8F33> <8F33> <EAA3>
+<8F38> <8F38> <CAE4>
+<8F3B> <8F3B> <B7F8>
+<8F3E> <8F3E> <D5B7>
+<8F3F> <8F3F> <D3DF>
+<8F42> <8F42> <ECB1>
+<8F44> <8F44> <CFBD>
+<8F45> <8F45> <D4AF>
+<8F46> <8F46> <EAA4>
+<8F49> <8F49> <D7AA>
+<8F4D> <8F4D> <D5DE>
+<8F4E> <8F4E> <BDCE>
+<8F54> <8F54> <EAA5>
+<8F5F> <8F5F> <BAE4>
+<8F61> <8F61> <E0CE>
+<8F62> <8F62> <E9F6>
+<8F64> <8F64> <E9F1>
+<8F66> <8F66> <B3B5>
+<8F67> <8F67> <D4FE>
+<8F68> <8F68> <B9EC>
+<8F69> <8F69> <D0F9>
+<8F6B> <8F6B> <E9ED>
+<8F6C> <8F6C> <D7AA>
+<8F6D> <8F6D> <E9EE>
+<8F6E> <8F6E> <C2D6>
+endbfrange
+
+100 beginbfrange
+<8F6F> <8F6F> <C8ED>
+<8F70> <8F70> <BAE4>
+<8F71> <8F73> <E9EF>
+<8F74> <8F74> <D6E1>
+<8F75> <8F76> <E9F2>
+<8F77> <8F77> <E9F5>
+<8F78> <8F78> <E9F4>
+<8F79> <8F7A> <E9F6>
+<8F7B> <8F7B> <C7E1>
+<8F7C> <8F7C> <E9F8>
+<8F7D> <8F7D> <D4D8>
+<8F7E> <8F7E> <E9F9>
+<8F7F> <8F7F> <BDCE>
+<8F81> <8F82> <E9FA>
+<8F83> <8F83> <BDCF>
+<8F84> <8F84> <E9FC>
+<8F85> <8F85> <B8A8>
+<8F86> <8F86> <C1BE>
+<8F87> <8F87> <E9FD>
+<8F88> <8F88> <B1B2>
+<8F89> <8F89> <BBD4>
+<8F8A> <8F8A> <B9F5>
+<8F8B> <8F8B> <E9FE>
+<8F8D> <8F8F> <EAA1>
+<8F90> <8F90> <B7F8>
+<8F91> <8F91> <BCAD>
+<8F93> <8F93> <CAE4>
+<8F94> <8F94> <E0CE>
+<8F95> <8F95> <D4AF>
+<8F96> <8F96> <CFBD>
+<8F97> <8F97> <D5B7>
+<8F98> <8F98> <EAA4>
+<8F99> <8F99> <D5DE>
+<8F9A> <8F9A> <EAA5>
+<8F9B> <8F9B> <D0C1>
+<8F9C> <8F9C> <B9BC>
+<8F9E> <8F9E> <B4C7>
+<8F9F> <8F9F> <B1D9>
+<8FA3> <8FA3> <C0B1>
+<8FA6> <8FA6> <B0EC>
+<8FA8> <8FA9> <B1E6>
+<8FAB> <8FAB> <B1E8>
+<8FAD> <8FAD> <B4C7>
+<8FAE> <8FAE> <B1E8>
+<8FAF> <8FAF> <B1E7>
+<8FB0> <8FB0> <B3BD>
+<8FB1> <8FB1> <C8E8>
+<8FB2> <8FB2> <C5A9>
+<8FB6> <8FB6> <E5C1>
+<8FB9> <8FB9> <B1DF>
+<8FBD> <8FBD> <C1C9>
+<8FBE> <8FBE> <B4EF>
+<8FC1> <8FC1> <C7A8>
+<8FC2> <8FC2> <D3D8>
+<8FC4> <8FC4> <C6F9>
+<8FC5> <8FC5> <D1B8>
+<8FC7> <8FC7> <B9FD>
+<8FC8> <8FC8> <C2F5>
+<8FCE> <8FCE> <D3AD>
+<8FD0> <8FD0> <D4CB>
+<8FD1> <8FD1> <BDFC>
+<8FD3> <8FD3> <E5C2>
+<8FD4> <8FD4> <B7B5>
+<8FD5> <8FD5> <E5C3>
+<8FD8> <8FD8> <BBB9>
+<8FD9> <8FD9> <D5E2>
+<8FDB> <8FDB> <BDF8>
+<8FDC> <8FDC> <D4B6>
+<8FDD> <8FDD> <CEA5>
+<8FDE> <8FDE> <C1AC>
+<8FDF> <8FDF> <B3D9>
+<8FE2> <8FE2> <CCF6>
+<8FE4> <8FE4> <E5C6>
+<8FE5> <8FE5> <E5C4>
+<8FE6> <8FE6> <E5C8>
+<8FE8> <8FE8> <E5CA>
+<8FE9> <8FE9> <E5C7>
+<8FEA> <8FEA> <B5CF>
+<8FEB> <8FEB> <C6C8>
+<8FED> <8FED> <B5FC>
+<8FEE> <8FEE> <E5C5>
+<8FF0> <8FF0> <CAF6>
+<8FF3> <8FF3> <E5C9>
+<8FF4> <8FF4> <BBD8>
+<8FF7> <8FF7> <C3D4>
+<8FF8> <8FF8> <B1C5>
+<8FF9> <8FF9> <BCA3>
+<8FFD> <8FFD> <D7B7>
+<9000> <9000> <CDCB>
+<9001> <9001> <CBCD>
+<9002> <9002> <CACA>
+<9003> <9003> <CCD3>
+<9004> <9004> <E5CC>
+<9005> <9005> <E5CB>
+<9006> <9006> <C4E6>
+<9009> <9009> <D1A1>
+<900A> <900A> <D1B7>
+<900B> <900B> <E5CD>
+<900D> <900D> <E5D0>
+<900F> <900F> <CDB8>
+endbfrange
+
+100 beginbfrange
+<9010> <9010> <D6F0>
+<9011> <9011> <E5CF>
+<9012> <9012> <B5DD>
+<9014> <9014> <CDBE>
+<9015> <9015> <E5C9>
+<9016> <9016> <E5D1>
+<9017> <9017> <B6BA>
+<9019> <9019> <D5E2>
+<901A> <901A> <CDA8>
+<901B> <901B> <B9E4>
+<901D> <901D> <CAC5>
+<901E> <901E> <B3D1>
+<901F> <901F> <CBD9>
+<9020> <9020> <D4EC>
+<9021> <9021> <E5D2>
+<9022> <9022> <B7EA>
+<9023> <9023> <C1AC>
+<9026> <9026> <E5CE>
+<902D> <902D> <E5D5>
+<902E> <902E> <B4FE>
+<902F> <902F> <E5D6>
+<9032> <9032> <BDF8>
+<9035> <9036> <E5D3>
+<9038> <9038> <D2DD>
+<903B> <903B> <C2DF>
+<903C> <903C> <B1C6>
+<903E> <903E> <D3E2>
+<9041> <9041> <B6DD>
+<9042> <9042> <CBEC>
+<9044> <9044> <E5D7>
+<9047> <9047> <D3F6>
+<904B> <904B> <D4CB>
+<904D> <904D> <B1E9>
+<904E> <904E> <B9FD>
+<904F> <904F> <B6F4>
+<9050> <9050> <E5DA>
+<9051> <9052> <E5D8>
+<9053> <9053> <B5C0>
+<9054> <9054> <B4EF>
+<9055> <9055> <CEA5>
+<9057> <9057> <D2C5>
+<9058> <9058> <E5DC>
+<905B> <905B> <E5DE>
+<905C> <905C> <D1B7>
+<905E> <905E> <B5DD>
+<9060> <9060> <D4B6>
+<9062> <9062> <E5DD>
+<9063> <9063> <C7B2>
+<9065> <9065> <D2A3>
+<9068> <9068> <E5DB>
+<9069> <9069> <CACA>
+<906D> <906D> <D4E2>
+<906E> <906E> <D5DA>
+<9072> <9072> <B3D9>
+<9074> <9074> <E5E0>
+<9075> <9075> <D7F1>
+<9077> <9077> <C7A8>
+<9078> <9078> <D1A1>
+<907A> <907A> <D2C5>
+<907C> <907C> <C1C9>
+<907D> <907D> <E5E1>
+<907F> <907F> <B1DC>
+<9080> <9080> <D1FB>
+<9081> <9081> <C2F5>
+<9082> <9082> <E5E2>
+<9083> <9083> <E5E4>
+<9084> <9084> <BBB9>
+<9087> <9087> <E5C7>
+<9088> <9088> <E5E3>
+<908A> <908A> <B1DF>
+<908B> <908B> <E5E5>
+<908F> <908F> <C2DF>
+<9090> <9090> <E5CE>
+<9091> <9091> <D2D8>
+<9093> <9093> <B5CB>
+<9095> <9095> <E7DF>
+<9097> <9097> <DAF5>
+<9099> <9099> <DAF8>
+<909B> <909B> <DAF6>
+<909D> <909D> <DAF7>
+<90A1> <90A1> <DAFA>
+<90A2> <90A2> <D0CF>
+<90A3> <90A3> <C4C7>
+<90A6> <90A6> <B0EE>
+<90AA> <90AA> <D0B0>
+<90AC> <90AC> <DAF9>
+<90AE> <90AE> <D3CA>
+<90AF> <90AF> <BAAA>
+<90B0> <90B0> <DBA2>
+<90B1> <90B1> <C7F1>
+<90B3> <90B3> <DAFC>
+<90B4> <90B4> <DAFB>
+<90B5> <90B5> <C9DB>
+<90B6> <90B6> <DAFD>
+<90B8> <90B8> <DBA1>
+<90B9> <90B9> <D7DE>
+<90BA> <90BA> <DAFE>
+<90BB> <90BB> <C1DA>
+<90BE> <90BE> <DBA5>
+<90C1> <90C1> <D3F4>
+endbfrange
+
+100 beginbfrange
+<90C4> <90C4> <DBA7>
+<90C5> <90C5> <DBA4>
+<90C7> <90C7> <DBA8>
+<90CA> <90CA> <BDBC>
+<90CE> <90CE> <C0C9>
+<90CF> <90CF> <DBA3>
+<90D0> <90D0> <DBA6>
+<90D1> <90D1> <D6A3>
+<90D3> <90D3> <DBA9>
+<90D7> <90D7> <DBAD>
+<90DB> <90DB> <DBAE>
+<90DC> <90DC> <DBAC>
+<90DD> <90DD> <BAC2>
+<90DF> <90DF> <DBA3>
+<90E1> <90E1> <BFA4>
+<90E2> <90E2> <DBAB>
+<90E6> <90E6> <DBAA>
+<90E7> <90E7> <D4C7>
+<90E8> <90E8> <B2BF>
+<90EB> <90EB> <DBAF>
+<90ED> <90ED> <B9F9>
+<90EF> <90EF> <DBB0>
+<90F4> <90F4> <B3BB>
+<90F5> <90F5> <D3CA>
+<90F8> <90F8> <B5A6>
+<90FD> <90FD> <B6BC>
+<90FE> <90FE> <DBB1>
+<9102> <9102> <B6F5>
+<9104> <9104> <DBB2>
+<9106> <9106> <DBA9>
+<9109> <9109> <CFE7>
+<9112> <9112> <D7DE>
+<9114> <9114> <DAF9>
+<9116> <9116> <D4C7>
+<9119> <9119> <B1C9>
+<911E> <911E> <DBB4>
+<9122> <9122> <DBB3>
+<9123> <9123> <DBB5>
+<9127> <9127> <B5CB>
+<912D> <912D> <D6A3>
+<912F> <912F> <DBB7>
+<9130> <9130> <C1DA>
+<9131> <9131> <DBB6>
+<9132> <9132> <B5A6>
+<9134> <9134> <DAFE>
+<9136> <9136> <DBA6>
+<9139> <9139> <DBB8>
+<913A> <913A> <DAF7>
+<9143> <9143> <DBB9>
+<9146> <9146> <DBBA>
+<9148> <9148> <DBAA>
+<9149> <9149> <D3CF>
+<914A> <914A> <F4FA>
+<914B> <914B> <C7F5>
+<914C> <914C> <D7C3>
+<914D> <914D> <C5E4>
+<914E> <914F> <F4FC>
+<9150> <9150> <F4FB>
+<9152> <9152> <BEC6>
+<9157> <9157> <D0EF>
+<915A> <915A> <B7D3>
+<915D> <915D> <D4CD>
+<915E> <915E> <CCAA>
+<9161> <9161> <F5A2>
+<9162> <9162> <F5A1>
+<9163> <9163> <BAA8>
+<9164> <9164> <F4FE>
+<9165> <9165> <CBD6>
+<9169> <9169> <F5A4>
+<916A> <916A> <C0D2>
+<916C> <916C> <B3EA>
+<916E> <916E> <CDAA>
+<916F> <916F> <F5A5>
+<9170> <9170> <F5A3>
+<9171> <9171> <BDB4>
+<9172> <9172> <F5A8>
+<9174> <9174> <F5A9>
+<9175> <9175> <BDCD>
+<9176> <9176> <C3B8>
+<9177> <9177> <BFE1>
+<9178> <9178> <CBE1>
+<9179> <9179> <F5AA>
+<917D> <917E> <F5A6>
+<917F> <917F> <C4F0>
+<9185> <9185> <F5AC>
+<9187> <9187> <B4BC>
+<9189> <9189> <D7ED>
+<918B> <918B> <B4D7>
+<918C> <918C> <F5AB>
+<918D> <918D> <F5AE>
+<9190> <9190> <F5AD>
+<9191> <9191> <F5AF>
+<9192> <9192> <D0D1>
+<9196> <9196> <D4CD>
+<919A> <919A> <C3D1>
+<919B> <919B> <C8A9>
+<919C> <919C> <B3F3>
+<91A2> <91A3> <F5B0>
+<91AA> <91AA> <F5B2>
+<91AB> <91AB> <D2BD>
+endbfrange
+
+100 beginbfrange
+<91AC> <91AC> <BDB4>
+<91AD> <91AF> <F5B3>
+<91B4> <91B4> <F5B7>
+<91B5> <91B5> <F5B6>
+<91BA> <91BA> <F5B8>
+<91C0> <91C0> <C4F0>
+<91C1> <91C1> <D0C6>
+<91C3> <91C3> <F5A7>
+<91C5> <91C5> <F5A6>
+<91C7> <91C7> <B2C9>
+<91C9> <91C9> <D3D4>
+<91CA> <91CA> <CACD>
+<91CB> <91CB> <CACD>
+<91CC> <91CC> <C0EF>
+<91CD> <91CD> <D6D8>
+<91CE> <91CE> <D2B0>
+<91CF> <91CF> <C1BF>
+<91D1> <91D1> <BDF0>
+<91D2> <91D2> <EEC4>
+<91D3> <91D3> <EEC5>
+<91D4> <91D4> <EEC6>
+<91D5> <91D5> <EEC9>
+<91D7> <91D7> <EEC8>
+<91D8> <91D8> <B6A4>
+<91D9> <91D9> <EEC7>
+<91DC> <91DC> <B8AA>
+<91DD> <91DD> <D5EB>
+<91E3> <91E3> <B5F6>
+<91E4> <91E4> <EECC>
+<91E7> <91E7> <EECB>
+<91E9> <91E9> <B7B0>
+<91F5> <91F5> <EECE>
+<91F7> <91F7> <EECA>
+<91F9> <91F9> <EECF>
+<91FA> <91FA> <C7A5>
+<9200> <9200> <EED9>
+<9201> <9201> <EED5>
+<9204> <9204> <EED7>
+<9208> <9208> <EED0>
+<9209> <9209> <C4C6>
+<920D> <920D> <B6DB>
+<920E> <920E> <B9B3>
+<9210> <9210> <EED4>
+<9211> <9211> <EED3>
+<9214> <9214> <B3AE>
+<9215> <9215> <C5A5>
+<921E> <921E> <BEFB>
+<9223> <9223> <B8C6>
+<9225> <9225> <EED8>
+<9226> <9226> <EED1>
+<9227> <9227> <EED6>
+<922E> <922E> <EEEA>
+<9230> <9230> <EEE6>
+<9233> <9233> <EEDD>
+<9234> <9234> <C1E5>
+<9237> <9237> <EEDC>
+<9238> <9238> <EEE0>
+<9239> <9239> <EEEB>
+<923A> <923A> <EEDA>
+<923D> <923D> <EEDF>
+<923E> <923E> <D3CB>
+<923F> <923F> <EEE4>
+<9240> <9240> <BCD8>
+<9245> <9245> <EED2>
+<9248> <9248> <EEE8>
+<9249> <9249> <EEE7>
+<924D> <924D> <EEE9>
+<9251> <9251> <B2AC>
+<9255> <9255> <EEDE>
+<9257> <9257> <C7AF>
+<925A> <925A> <C3AD>
+<925B> <925B> <C7A6>
+<925E> <925E> <EEE1>
+<9262> <9262> <B2A7>
+<9266> <9266> <EEDB>
+<926C> <926C> <EEE2>
+<926D> <926D> <EEE3>
+<9274> <9274> <BCF8>
+<9278> <9278> <BDC2>
+<927A> <927A> <EEEF>
+<927B> <927B> <B8F5>
+<927F> <927F> <EEFE>
+<9280> <9280> <D2F8>
+<9283> <9283> <EFA5>
+<9285> <9285> <CDAD>
+<928E> <928E> <F6C6>
+<9291> <9291> <CFB3>
+<9293> <9293> <EEFD>
+<9296> <9296> <EEF9>
+<9298> <9298> <C3FA>
+<929A> <929A> <EFA2>
+<929C> <929C> <CFCE>
+<92A0> <92A0> <EEEE>
+<92A3> <92A3> <EFA8>
+<92A5> <92A5> <D2BF>
+<92A6> <92A6> <EEF7>
+<92A8> <92A8> <EFA7>
+<92A9> <92A9> <EEFB>
+<92AA> <92AA> <EEF0>
+<92AB> <92AB> <EFA4>
+endbfrange
+
+100 beginbfrange
+<92AC> <92AC> <EEED>
+<92AE> <92AE> <F6C7>
+<92B1> <92B1> <EEF6>
+<92B7> <92B7> <CFFA>
+<92B9> <92B9> <D0E2>
+<92BB> <92BB> <CCE0>
+<92BC> <92BC> <EFB1>
+<92C1> <92C1> <C2C1>
+<92C3> <92C3> <EFB6>
+<92C5> <92C5> <D0BF>
+<92C7> <92C7> <B1B5>
+<92C8> <92C8> <F6C8>
+<92CC> <92CC> <EEFA>
+<92CF> <92CF> <EEF2>
+<92D2> <92D2> <B7E6>
+<92DD> <92DD> <EFB2>
+<92DF> <92DF> <EFB7>
+<92E3> <92E3> <EEF4>
+<92E4> <92E4> <B3FA>
+<92E5> <92E5> <EFAD>
+<92E6> <92E6> <EFB8>
+<92E8> <92E8> <EFB0>
+<92EA> <92EA> <C6CC>
+<92ED> <92ED> <C8F1>
+<92EE> <92EE> <EEF1>
+<92EF> <92EF> <EFAF>
+<92F0> <92F0> <EFAE>
+<92F1> <92F1> <EFAB>
+<92F6> <92F6> <EFB3>
+<92F8> <92F8> <BEE2>
+<92FC> <92FC> <B8D6>
+<9301> <9301> <EFBE>
+<9306> <9306> <EFBA>
+<9307> <9307> <EFC2>
+<9308> <9308> <EFC3>
+<9310> <9310> <D7B6>
+<9312> <9312> <EFB9>
+<9315> <9315> <EFBF>
+<9318> <9318> <B4B8>
+<9319> <9319> <EFC5>
+<931A> <931A> <EFA3>
+<931B> <931B> <EFBC>
+<931F> <931F> <EFC4>
+<9320> <9320> <B6A7>
+<9322> <9322> <C7AE>
+<9326> <9326> <BDF5>
+<9328> <9328> <C3AA>
+<932B> <932B> <CEFD>
+<932E> <932E> <EFC0>
+<932F> <932F> <B4ED>
+<9332> <9332> <C2BC>
+<9333> <9333> <C3CC>
+<9336> <9336> <B1ED>
+<9338> <9338> <EFAA>
+<933E> <933E> <F6C9>
+<9340> <9340> <EFBD>
+<9341> <9341> <CFC7>
+<9343> <9343> <EFC1>
+<9346> <9346> <EECD>
+<9347> <9347> <EFC7>
+<934B> <934B> <B9F8>
+<934D> <934D> <B6C6>
+<9354> <9354> <EFC9>
+<9358> <9358> <D5A1>
+<935B> <935B> <B6CD>
+<9364> <9364> <EFCA>
+<9365> <9365> <EFC6>
+<9369> <9369> <EFBB>
+<936A> <936A> <F6CA>
+<936C> <936C> <C7C2>
+<9370> <9370> <EFCC>
+<9375> <9375> <BCFC>
+<9376> <9376> <EFC8>
+<937A> <937A> <D5E0>
+<937E> <937E> <EFF1>
+<9382> <9382> <C3BE>
+<9384> <9384> <EFCD>
+<9387> <9387> <EFD1>
+<938A> <938A> <B0F7>
+<938F> <938F> <F6CC>
+<9396> <9396> <CBF8>
+<9398> <9398> <EFD3>
+<93A2> <93A2> <CED9>
+<93A3> <93A3> <DDF6>
+<93A6> <93A6> <EFD6>
+<93A7> <93A7> <EEF8>
+<93A9> <93A9> <EFA1>
+<93AA> <93AA> <EFCB>
+<93AC> <93AC> <B8E4>
+<93AE> <93AE> <D5F2>
+<93B0> <93B0> <EFD7>
+<93B3> <93B3> <C4F8>
+<93B5> <93B5> <EFD8>
+<93B8> <93B8> <EFD4>
+<93BF> <93BF> <EFD5>
+<93C3> <93C3> <EFDF>
+<93C7> <93C7> <EFE0>
+<93C8> <93C8> <C1B4>
+<93CA> <93CA> <F6CB>
+<93CC> <93CC> <EFD2>
+endbfrange
+
+100 beginbfrange
+<93CD> <93CD> <EFDD>
+<93D1> <93D1> <EFE1>
+<93D6> <93D6> <F7E9>
+<93D7> <93D7> <EFAC>
+<93D8> <93D8> <EFCF>
+<93DC> <93DC> <EFDB>
+<93DD> <93DD> <EFDC>
+<93DE> <93DE> <EFDE>
+<93DF> <93DF> <B2F9>
+<93E1> <93E1> <BEB5>
+<93E2> <93E2> <EFDA>
+<93E4> <93E4> <EFCE>
+<93E8> <93E8> <F6C9>
+<93F5> <93F5> <EEFC>
+<93F7> <93F7> <EFE4>
+<93F9> <93F9> <EFEA>
+<9403> <9403> <EEF3>
+<940B> <940B> <EFA6>
+<9410> <9410> <C1CD>
+<9412> <9412> <EFA9>
+<9413> <9413> <EFE6>
+<9414> <9414> <EFE2>
+<9418> <9418> <D6D3>
+<9419> <9419> <EFEB>
+<941D> <941D> <EFE3>
+<9420> <9420> <EFE8>
+<9426> <9426> <EFB4>
+<9427> <9427> <EFB5>
+<9428> <9428> <EFD0>
+<942E> <942E> <C1AD>
+<9432> <9432> <EFED>
+<9433> <9433> <C0D8>
+<9435> <9435> <CCFA>
+<9438> <9438> <EEEC>
+<943A> <943A> <EEF5>
+<943E> <943E> <F6CD>
+<943F> <943F> <EFEE>
+<9444> <9444> <D6FD>
+<944A> <944A> <EFEC>
+<944C> <944C> <EFD9>
+<9452> <9452> <BCF8>
+<9454> <9454> <EFEF>
+<9460> <9460> <EEE5>
+<9463> <9463> <EFF0>
+<9465> <9465> <EFE5>
+<946B> <946B> <F6CE>
+<946D> <946D> <EFE7>
+<9470> <9470> <D4BF>
+<9472> <9472> <CFE2>
+<9477> <9477> <C4F7>
+<9479> <9479> <EFE9>
+<947C> <947C> <C2E0>
+<947D> <947D> <D7EA>
+<947E> <947E> <F6C7>
+<947F> <947F> <D4E4>
+<9485> <9487> <EEC4>
+<9488> <9488> <D5EB>
+<9489> <9489> <B6A4>
+<948A> <948A> <EEC8>
+<948B> <948B> <EEC7>
+<948C> <948D> <EEC9>
+<948E> <948E> <C7A5>
+<948F> <9490> <EECB>
+<9492> <9492> <B7B0>
+<9493> <9493> <B5F6>
+<9494> <9494> <EECD>
+<9495> <9495> <EECF>
+<9497> <9497> <EECE>
+<9499> <9499> <B8C6>
+<949A> <949C> <EED0>
+<949D> <949D> <B6DB>
+<949E> <949E> <B3AE>
+<949F> <949F> <D6D3>
+<94A0> <94A0> <C4C6>
+<94A1> <94A1> <B1B5>
+<94A2> <94A2> <B8D6>
+<94A3> <94A4> <EED3>
+<94A5> <94A5> <D4BF>
+<94A6> <94A6> <C7D5>
+<94A7> <94A7> <BEFB>
+<94A8> <94A8> <CED9>
+<94A9> <94A9> <B9B3>
+<94AA> <94AA> <EED6>
+<94AB> <94AB> <EED5>
+<94AC> <94AC> <EED8>
+<94AD> <94AD> <EED7>
+<94AE> <94AE> <C5A5>
+<94AF> <94B0> <EED9>
+<94B1> <94B1> <C7AE>
+<94B2> <94B2> <EEDB>
+<94B3> <94B3> <C7AF>
+<94B4> <94B4> <EEDC>
+<94B5> <94B5> <B2A7>
+<94B6> <94BA> <EEDD>
+<94BB> <94BB> <D7EA>
+<94BC> <94BD> <EEE2>
+<94BE> <94BE> <BCD8>
+<94BF> <94BF> <EEE4>
+<94C0> <94C0> <D3CB>
+<94C1> <94C1> <CCFA>
+endbfrange
+
+100 beginbfrange
+<94C2> <94C2> <B2AC>
+<94C3> <94C3> <C1E5>
+<94C4> <94C4> <EEE5>
+<94C5> <94C5> <C7A6>
+<94C6> <94C6> <C3AD>
+<94C8> <94CE> <EEE6>
+<94D0> <94D2> <EEED>
+<94D5> <94D7> <EEF0>
+<94D8> <94D8> <EEF4>
+<94D9> <94D9> <EEF3>
+<94DB> <94DB> <EEF5>
+<94DC> <94DC> <CDAD>
+<94DD> <94DD> <C2C1>
+<94DE> <94E0> <EEF6>
+<94E1> <94E1> <D5A1>
+<94E2> <94E2> <EEF9>
+<94E3> <94E3> <CFB3>
+<94E4> <94E5> <EEFA>
+<94E7> <94E8> <EEFC>
+<94E9> <94E9> <EFA1>
+<94EA> <94EA> <EEFE>
+<94EB> <94EB> <EFA2>
+<94EC> <94EC> <B8F5>
+<94ED> <94ED> <C3FA>
+<94EE> <94EF> <EFA3>
+<94F0> <94F0> <BDC2>
+<94F1> <94F1> <D2BF>
+<94F2> <94F2> <B2F9>
+<94F3> <94F5> <EFA5>
+<94F6> <94F6> <D2F8>
+<94F7> <94F7> <EFA8>
+<94F8> <94F8> <D6FD>
+<94F9> <94F9> <EFA9>
+<94FA> <94FA> <C6CC>
+<94FC> <94FD> <EFAA>
+<94FE> <94FE> <C1B4>
+<94FF> <94FF> <EFAC>
+<9500> <9500> <CFFA>
+<9501> <9501> <CBF8>
+<9502> <9502> <EFAE>
+<9503> <9503> <EFAD>
+<9504> <9504> <B3FA>
+<9505> <9505> <B9F8>
+<9506> <9507> <EFAF>
+<9508> <9508> <D0E2>
+<9509> <950A> <EFB1>
+<950B> <950B> <B7E6>
+<950C> <950C> <D0BF>
+<950D> <950F> <EFB3>
+<9510> <9510> <C8F1>
+<9511> <9511> <CCE0>
+<9512> <9516> <EFB6>
+<9517> <9517> <D5E0>
+<9518> <9518> <EFBB>
+<9519> <9519> <B4ED>
+<951A> <951A> <C3AA>
+<951B> <951B> <EFBC>
+<951D> <951F> <EFBD>
+<9521> <9521> <CEFD>
+<9522> <9522> <EFC0>
+<9523> <9523> <C2E0>
+<9524> <9524> <B4B8>
+<9525> <9525> <D7B6>
+<9526> <9526> <BDF5>
+<9528> <9528> <CFC7>
+<9529> <9529> <EFC3>
+<952A> <952B> <EFC1>
+<952C> <952C> <EFC4>
+<952D> <952D> <B6A7>
+<952E> <952E> <BCFC>
+<952F> <952F> <BEE2>
+<9530> <9530> <C3CC>
+<9531> <9532> <EFC5>
+<9534> <9534> <EFC7>
+<9535> <9535> <EFCF>
+<9536> <9538> <EFC8>
+<9539> <9539> <C7C2>
+<953A> <953A> <EFF1>
+<953B> <953B> <B6CD>
+<953C> <953C> <EFCB>
+<953E> <953F> <EFCC>
+<9540> <9540> <B6C6>
+<9541> <9541> <C3BE>
+<9542> <9542> <EFCE>
+<9544> <9546> <EFD0>
+<9547> <9547> <D5F2>
+<9549> <9549> <EFD3>
+<954A> <954A> <C4F7>
+<954C> <954C> <EFD4>
+<954D> <954D> <C4F8>
+<954E> <954F> <EFD5>
+<9550> <9550> <B8E4>
+<9551> <9551> <B0F7>
+<9552> <9554> <EFD7>
+<9556> <9559> <EFDA>
+<955B> <955B> <EFDE>
+<955C> <955C> <BEB5>
+<955D> <955D> <EFE1>
+<955E> <955F> <EFDF>
+<9561> <9562> <EFE2>
+endbfrange
+
+100 beginbfrange
+<9563> <9563> <C1CD>
+<9564> <956C> <EFE4>
+<956D> <956D> <C0D8>
+<956F> <956F> <EFED>
+<9570> <9570> <C1AD>
+<9571> <9573> <EFEE>
+<9576> <9576> <CFE2>
+<9577> <9577> <B3A4>
+<957F> <957F> <B3A4>
+<9580> <9580> <C3C5>
+<9582> <9582> <E3C5>
+<9583> <9583> <C9C1>
+<9586> <9586> <E3C6>
+<9589> <9589> <B1D5>
+<958B> <958B> <BFAA>
+<958C> <958C> <E3CA>
+<958E> <958E> <E3C8>
+<958F> <958F> <C8F2>
+<9591> <9591> <CFD0>
+<9593> <9593> <BCE4>
+<9594> <9594> <E3C9>
+<9598> <9598> <D5A2>
+<95A1> <95A1> <BAD2>
+<95A3> <95A3> <B8F3>
+<95A4> <95A4> <BACF>
+<95A5> <95A5> <B7A7>
+<95A8> <95A8> <B9EB>
+<95A9> <95A9> <C3F6>
+<95AB> <95AB> <E3CD>
+<95AC> <95AC> <E3CF>
+<95AD> <95AD> <E3CC>
+<95B2> <95B2> <D4C4>
+<95B6> <95B6> <E3D1>
+<95B9> <95B9> <D1CB>
+<95BB> <95BB> <D1D6>
+<95BC> <95BC> <E3D5>
+<95BD> <95BD> <E3D4>
+<95BE> <95BE> <E3D0>
+<95BF> <95BF> <E3D3>
+<95C3> <95C3> <E3D6>
+<95C6> <95C6> <B0E5>
+<95C8> <95C8> <E3C7>
+<95CA> <95CA> <C0AB>
+<95CB> <95CB> <E3D7>
+<95CC> <95CC> <C0BB>
+<95D0> <95D0> <E3D9>
+<95D4> <95D4> <E3D8>
+<95D5> <95D5> <E3DA>
+<95D6> <95D6> <B4B3>
+<95DC> <95DC> <B9D8>
+<95DE> <95DE> <E3DB>
+<95E1> <95E1> <B2FB>
+<95E2> <95E2> <B1D9>
+<95E5> <95E5> <E3CB>
+<95E8> <95E8> <C3C5>
+<95E9> <95E9> <E3C5>
+<95EA> <95EA> <C9C1>
+<95EB> <95EB> <E3C6>
+<95ED> <95ED> <B1D5>
+<95EE> <95EE> <CECA>
+<95EF> <95EF> <B4B3>
+<95F0> <95F0> <C8F2>
+<95F1> <95F1> <E3C7>
+<95F2> <95F2> <CFD0>
+<95F3> <95F3> <E3C8>
+<95F4> <95F4> <BCE4>
+<95F5> <95F6> <E3C9>
+<95F7> <95F7> <C3C6>
+<95F8> <95F8> <D5A2>
+<95F9> <95F9> <C4D6>
+<95FA> <95FA> <B9EB>
+<95FB> <95FB> <CEC5>
+<95FC> <95FC> <E3CB>
+<95FD> <95FD> <C3F6>
+<95FE> <95FE> <E3CC>
+<9600> <9600> <B7A7>
+<9601> <9601> <B8F3>
+<9602> <9602> <BAD2>
+<9603> <9604> <E3CD>
+<9605> <9605> <D4C4>
+<9606> <9606> <E3CF>
+<9608> <9608> <E3D0>
+<9609> <9609> <D1CB>
+<960A> <960D> <E3D1>
+<960E> <960E> <D1D6>
+<960F> <960F> <E3D5>
+<9610> <9610> <B2FB>
+<9611> <9611> <C0BB>
+<9612> <9612> <E3D6>
+<9614> <9614> <C0AB>
+<9615> <9617> <E3D7>
+<9619> <961A> <E3DA>
+<961C> <961C> <B8B7>
+<961D> <961D> <DAE2>
+<961F> <961F> <B6D3>
+<9621> <9621> <DAE4>
+<9622> <9622> <DAE3>
+<962A> <962A> <DAE6>
+<962E> <962E> <C8EE>
+<9631> <9631> <DAE5>
+endbfrange
+
+100 beginbfrange
+<9632> <9632> <B7C0>
+<9633> <9633> <D1F4>
+<9634> <9634> <D2F5>
+<9635> <9635> <D5F3>
+<9636> <9636> <BDD7>
+<963B> <963B> <D7E8>
+<963C> <963C> <DAE8>
+<963D> <963D> <DAE7>
+<963F> <963F> <B0A2>
+<9640> <9640> <CDD3>
+<9642> <9642> <DAE9>
+<9644> <9644> <B8BD>
+<9645> <9645> <BCCA>
+<9646> <9646> <C2BD>
+<9647> <9647> <C2A4>
+<9648> <9648> <B3C2>
+<9649> <9649> <DAEA>
+<964B> <964B> <C2AA>
+<964C> <964C> <C4B0>
+<964D> <964D> <BDB5>
+<9650> <9650> <CFDE>
+<9654> <9654> <DAEB>
+<9655> <9655> <C9C2>
+<9658> <9658> <DAEA>
+<965B> <965B> <B1DD>
+<965D> <965D> <C9C2>
+<965F> <965F> <DAEC>
+<9661> <9661> <B6B8>
+<9662> <9662> <D4BA>
+<9663> <9663> <D5F3>
+<9664> <9664> <B3FD>
+<9667> <9667> <DAED>
+<9668> <9668> <D4C9>
+<9669> <9669> <CFD5>
+<966A> <966A> <C5E3>
+<966C> <966C> <DAEE>
+<9670> <9670> <D2F5>
+<9672> <9672> <DAEF>
+<9673> <9673> <B3C2>
+<9674> <9674> <DAF0>
+<9675> <9675> <C1EA>
+<9676> <9676> <CCD5>
+<9677> <9677> <CFDD>
+<9678> <9678> <C2BD>
+<967D> <967D> <D1F4>
+<9685> <9685> <D3E7>
+<9686> <9686> <C2A1>
+<9688> <9688> <DAF1>
+<968A> <968A> <B6D3>
+<968B> <968B> <CBE5>
+<968D> <968D> <DAF2>
+<968E> <968E> <BDD7>
+<968F> <968F> <CBE6>
+<9690> <9690> <D2FE>
+<9694> <9694> <B8F4>
+<9695> <9695> <D4C9>
+<9697> <9697> <DAF3>
+<9698> <9698> <B0AF>
+<9699> <9699> <CFB6>
+<969B> <969B> <BCCA>
+<969C> <969C> <D5CF>
+<96A7> <96A7> <CBED>
+<96A8> <96A8> <CBE6>
+<96AA> <96AA> <CFD5>
+<96B0> <96B0> <DAF4>
+<96B1> <96B1> <D2FE>
+<96B3> <96B3> <E3C4>
+<96B4> <96B4> <C2A4>
+<96B6> <96B6> <C1A5>
+<96B8> <96B8> <C1A5>
+<96B9> <96B9> <F6BF>
+<96BB> <96BB> <D6BB>
+<96BC> <96BD> <F6C0>
+<96BE> <96BE> <C4D1>
+<96C0> <96C0> <C8B8>
+<96C1> <96C1> <D1E3>
+<96C4> <96C4> <D0DB>
+<96C5> <96C5> <D1C5>
+<96C6> <96C6> <BCAF>
+<96C7> <96C7> <B9CD>
+<96C9> <96C9> <EFF4>
+<96CC> <96CC> <B4C6>
+<96CD> <96CD> <D3BA>
+<96CE> <96CE> <F6C2>
+<96CF> <96CF> <B3FB>
+<96D2> <96D2> <F6C3>
+<96D5> <96D5> <B5F1>
+<96D6> <96D6> <CBE4>
+<96D9> <96D9> <CBAB>
+<96DB> <96DB> <B3FB>
+<96DC> <96DC> <D4D3>
+<96E0> <96E0> <F6C5>
+<96E2> <96E2> <C0EB>
+<96E3> <96E3> <C4D1>
+<96E8> <96E8> <D3EA>
+<96E9> <96E9> <F6A7>
+<96EA> <96EA> <D1A9>
+<96EF> <96EF> <F6A9>
+<96F2> <96F2> <D4C6>
+<96F3> <96F3> <F6A8>
+endbfrange
+
+100 beginbfrange
+<96F6> <96F6> <C1E3>
+<96F7> <96F7> <C0D7>
+<96F9> <96F9> <B1A2>
+<96FB> <96FB> <B5E7>
+<96FE> <96FE> <CEED>
+<9700> <9700> <D0E8>
+<9701> <9701> <F6AB>
+<9704> <9704> <CFF6>
+<9706> <9706> <F6AA>
+<9707> <9707> <D5F0>
+<9708> <9708> <F6AC>
+<9709> <9709> <C3B9>
+<970D> <970D> <BBF4>
+<970E> <970E> <F6AE>
+<970F> <970F> <F6AD>
+<9713> <9713> <C4DE>
+<9716> <9716> <C1D8>
+<971C> <971C> <CBAA>
+<971E> <971E> <CFBC>
+<9727> <9727> <CEED>
+<972A> <972A> <F6AF>
+<972D> <972D> <F6B0>
+<9730> <9730> <F6B1>
+<9732> <9732> <C2B6>
+<9738> <9738> <B0D4>
+<9739> <9739> <C5F9>
+<973D> <973D> <F6AB>
+<973E> <973E> <F6B2>
+<9742> <9742> <F6A8>
+<9744> <9744> <F6B0>
+<9748> <9748> <C1E9>
+<9752> <9752> <C7E0>
+<9753> <9753> <F6A6>
+<9756> <9756> <BEB8>
+<9759> <9759> <BEB2>
+<975A> <975A> <F6A6>
+<975B> <975B> <B5E5>
+<975E> <975E> <B7C7>
+<9760> <9760> <BFBF>
+<9761> <9761> <C3D2>
+<9762> <9762> <C3E6>
+<9765> <9765> <D8CC>
+<9768> <9768> <D8CC>
+<9769> <9769> <B8EF>
+<9773> <9773> <BDF9>
+<9774> <9774> <D1A5>
+<9776> <9776> <B0D0>
+<977C> <977C> <F7B0>
+<9785> <9785> <F7B1>
+<978B> <978B> <D0AC>
+<978D> <978D> <B0B0>
+<978F> <978F> <B9AE>
+<9791> <9792> <F7B2>
+<9794> <9794> <F7B4>
+<9798> <9798> <C7CA>
+<97A0> <97A0> <BECF>
+<97A3> <97A3> <F7B7>
+<97A6> <97A6> <C7EF>
+<97AB> <97AB> <F7B6>
+<97AD> <97AD> <B1DE>
+<97AF> <97AF> <F7B5>
+<97B2> <97B2> <F7B8>
+<97B4> <97B4> <F7B9>
+<97BD> <97BD> <F7B3>
+<97C3> <97C3> <F7B2>
+<97C6> <97C6> <C7A7>
+<97C9> <97C9> <F7B5>
+<97CB> <97CB> <CEA4>
+<97CC> <97CC> <C8CD>
+<97D3> <97D3> <BAAB>
+<97D9> <97D9> <E8B8>
+<97DC> <97DC> <E8BA>
+<97DE> <97DE> <E8B9>
+<97E6> <97E6> <CEA4>
+<97E7> <97E7> <C8CD>
+<97E9> <97E9> <BAAB>
+<97EA> <97EC> <E8B8>
+<97ED> <97ED> <BEC2>
+<97F3> <97F3> <D2F4>
+<97F5> <97F5> <D4CF>
+<97F6> <97F6> <C9D8>
+<97FF> <97FF> <CFEC>
+<9801> <9801> <D2B3>
+<9802> <9802> <B6A5>
+<9803> <9803> <C7EA>
+<9805> <9805> <CFEE>
+<9806> <9806> <CBB3>
+<9807> <9807> <F1FC>
+<9808> <9808> <D0EB>
+<980A> <980A> <E7EF>
+<980C> <980C> <CBCC>
+<980E> <980E> <F1FD>
+<980F> <980F> <F1FE>
+<9810> <9810> <D4A4>
+<9811> <9811> <CDE7>
+<9812> <9812> <B0E4>
+<9813> <9813> <B6D9>
+<9817> <9817> <C6C4>
+<9818> <9818> <C1EC>
+<981C> <981C> <F2A2>
+endbfrange
+
+100 beginbfrange
+<9821> <9821> <F2A1>
+<9824> <9824> <D2C3>
+<9826> <9826> <F2A4>
+<982D> <982D> <CDB7>
+<9830> <9830> <BCD5>
+<9837> <9837> <F2A5>
+<9838> <9838> <BEB1>
+<983B> <983B> <C6B5>
+<983D> <983D> <CDC7>
+<9846> <9846> <BFC5>
+<984C> <984C> <CCE2>
+<984D> <984D> <B6EE>
+<984E> <984E> <F2A6>
+<9853> <9853> <F2A7>
+<9854> <9854> <D1D5>
+<9858> <9858> <D4B8>
+<9859> <9859> <F2AA>
+<985B> <985B> <B5DF>
+<985E> <985E> <C0E0>
+<9862> <9862> <F2A9>
+<9865> <9865> <F2AB>
+<9867> <9867> <B9CB>
+<986B> <986B> <B2FC>
+<986C> <986C> <F2AC>
+<986F> <986F> <CFD4>
+<9870> <9870> <F2AD>
+<9871> <9871> <C2AD>
+<9873> <9873> <F2A8>
+<9874> <9874> <C8A7>
+<9875> <9875> <D2B3>
+<9876> <9876> <B6A5>
+<9877> <9877> <C7EA>
+<9878> <9878> <F1FC>
+<9879> <9879> <CFEE>
+<987A> <987A> <CBB3>
+<987B> <987B> <D0EB>
+<987C> <987C> <E7EF>
+<987D> <987D> <CDE7>
+<987E> <987E> <B9CB>
+<987F> <987F> <B6D9>
+<9880> <9880> <F1FD>
+<9881> <9881> <B0E4>
+<9882> <9882> <CBCC>
+<9883> <9883> <F1FE>
+<9884> <9884> <D4A4>
+<9885> <9885> <C2AD>
+<9886> <9886> <C1EC>
+<9887> <9887> <C6C4>
+<9888> <9888> <BEB1>
+<9889> <9889> <F2A1>
+<988A> <988A> <BCD5>
+<988C> <988D> <F2A2>
+<988F> <988F> <F2A4>
+<9890> <9890> <D2C3>
+<9891> <9891> <C6B5>
+<9893> <9893> <CDC7>
+<9894> <9894> <F2A5>
+<9896> <9896> <D3B1>
+<9897> <9897> <BFC5>
+<9898> <9898> <CCE2>
+<989A> <989B> <F2A6>
+<989C> <989C> <D1D5>
+<989D> <989D> <B6EE>
+<989E> <989F> <F2A8>
+<98A0> <98A0> <B5DF>
+<98A1> <98A2> <F2AA>
+<98A4> <98A4> <B2FC>
+<98A5> <98A6> <F2AC>
+<98A7> <98A7> <C8A7>
+<98A8> <98A8> <B7E7>
+<98AE> <98AE> <ECA9>
+<98AF> <98AF> <ECAA>
+<98B1> <98B1> <CCA8>
+<98B3> <98B3> <B9CE>
+<98B6> <98B6> <ECAB>
+<98BC> <98BC> <ECAC>
+<98C4> <98C4> <C6AE>
+<98C6> <98C6> <ECAD>
+<98C8> <98C8> <ECAE>
+<98CE> <98CE> <B7E7>
+<98D1> <98D3> <ECA9>
+<98D5> <98D5> <ECAC>
+<98D8> <98D8> <C6AE>
+<98D9> <98DA> <ECAD>
+<98DB> <98DB> <B7C9>
+<98DE> <98DE> <B7C9>
+<98DF> <98DF> <CAB3>
+<98E0> <98E0> <E2BB>
+<98E2> <98E2> <BCA2>
+<98E7> <98E7> <E2B8>
+<98E8> <98E8> <F7CF>
+<98E9> <98E9> <E2BD>
+<98EA> <98EA> <E2BF>
+<98EB> <98EB> <E2C0>
+<98ED> <98ED> <E2C1>
+<98EF> <98EF> <B7B9>
+<98F2> <98F2> <D2FB>
+<98F4> <98F4> <E2C2>
+<98FC> <98FC> <CBC7>
+<98FD> <98FD> <B1A5>
+endbfrange
+
+100 beginbfrange
+<98FE> <98FE> <CACE>
+<9903> <9903> <BDC8>
+<9905> <9905> <B1FD>
+<9909> <9909> <E2C3>
+<990A> <990A> <D1F8>
+<990C> <990C> <B6FC>
+<990D> <990D> <F7D0>
+<9910> <9910> <B2CD>
+<9911> <9911> <E2C4>
+<9912> <9912> <C4D9>
+<9913> <9913> <B6F6>
+<9918> <9918> <D3E0>
+<991B> <991B> <E2C6>
+<991E> <991E> <BDA4>
+<9921> <9921> <CFDA>
+<9928> <9928> <B9DD>
+<992E> <992E> <F7D1>
+<9933> <9933> <E2BC>
+<9937> <9937> <E2C7>
+<993C> <993C> <E2BE>
+<993E> <993E> <C1F3>
+<993F> <993F> <E2C8>
+<9943> <9943> <E2C9>
+<9945> <9945> <C2F8>
+<9948> <9948> <E2CA>
+<9949> <9949> <E2CB>
+<994A> <994A> <E2CC>
+<994B> <994B> <C0A1>
+<994C> <994C> <E2CD>
+<9951> <9951> <BCA2>
+<9952> <9952> <C8C4>
+<9954> <9954> <F7D3>
+<9955> <9955> <F7D2>
+<9957> <9957> <F7CF>
+<995C> <995C> <F7D0>
+<995E> <995E> <B2F6>
+<9962> <9962> <E2CE>
+<9963> <9963> <E2BB>
+<9965> <9965> <BCA2>
+<9967> <996C> <E2BC>
+<996D> <996D> <B7B9>
+<996E> <996E> <D2FB>
+<996F> <996F> <BDA4>
+<9970> <9970> <CACE>
+<9971> <9971> <B1A5>
+<9972> <9972> <CBC7>
+<9974> <9974> <E2C2>
+<9975> <9975> <B6FC>
+<9976> <9976> <C8C4>
+<9977> <9977> <E2C3>
+<997A> <997A> <BDC8>
+<997C> <997C> <B1FD>
+<997D> <997D> <E2C4>
+<997F> <997F> <B6F6>
+<9980> <9980> <E2C5>
+<9981> <9981> <C4D9>
+<9984> <9984> <E2C6>
+<9985> <9985> <CFDA>
+<9986> <9986> <B9DD>
+<9987> <9987> <E2C7>
+<9988> <9988> <C0A1>
+<998A> <998A> <E2C8>
+<998B> <998B> <B2F6>
+<998D> <998D> <E2C9>
+<998F> <998F> <C1F3>
+<9990> <9991> <E2CA>
+<9992> <9992> <C2F8>
+<9993> <9995> <E2CC>
+<9996> <9996> <CAD7>
+<9997> <9997> <D8B8>
+<9998> <9998> <D9E5>
+<9999> <9999> <CFE3>
+<99A5> <99A5> <F0A5>
+<99A8> <99A8> <DCB0>
+<99AC> <99AC> <C2ED>
+<99AD> <99AD> <D4A6>
+<99AE> <99AE> <B7EB>
+<99B1> <99B1> <CDD4>
+<99B3> <99B3> <B3DB>
+<99B4> <99B4> <D1B1>
+<99C1> <99C1> <B2B5>
+<99D0> <99D0> <D7A4>
+<99D1> <99D1> <E6E5>
+<99D2> <99D2> <BED4>
+<99D4> <99D4> <E6E0>
+<99D5> <99D5> <BCDD>
+<99D8> <99D8> <E6E6>
+<99D9> <99D9> <E6E2>
+<99DB> <99DB> <CABB>
+<99DD> <99DD> <CDD5>
+<99DF> <99DF> <E6E1>
+<99E1> <99E1> <C2EE>
+<99E2> <99E2> <E6E9>
+<99ED> <99ED> <BAA7>
+<99F1> <99F1> <C2E6>
+<99FF> <99FF> <BFA5>
+<9A01> <9A01> <B3D2>
+<9A05> <9A05> <E6ED>
+<9A0D> <9A0D> <E6EC>
+<9A0E> <9A0E> <C6EF>
+endbfrange
+
+100 beginbfrange
+<9A0F> <9A0F> <E6EB>
+<9A16> <9A16> <E6F0>
+<9A19> <9A19> <C6AD>
+<9A2B> <9A2B> <E5B9>
+<9A2D> <9A2D> <E6EF>
+<9A2E> <9A2E> <E6F2>
+<9A30> <9A30> <CCDA>
+<9A36> <9A36> <E6E3>
+<9A37> <9A37> <C9A7>
+<9A38> <9A38> <E6F3>
+<9A3E> <9A3E> <C2E2>
+<9A40> <9A40> <DDEB>
+<9A41> <9A41> <E6F1>
+<9A42> <9A42> <E6EE>
+<9A43> <9A43> <E6F4>
+<9A44> <9A44> <E6F5>
+<9A45> <9A45> <C7FD>
+<9A4A> <9A4A> <E6E8>
+<9A4D> <9A4D> <E6E7>
+<9A4F> <9A4F> <E6F6>
+<9A55> <9A55> <BDBE>
+<9A57> <9A57> <D1E9>
+<9A5A> <9A5A> <BEAA>
+<9A5B> <9A5B> <E6E4>
+<9A5F> <9A5F> <D6E8>
+<9A62> <9A62> <C2BF>
+<9A64> <9A64> <E6F8>
+<9A65> <9A65> <E6F7>
+<9A6A> <9A6A> <E6EA>
+<9A6C> <9A6C> <C2ED>
+<9A6D> <9A6D> <D4A6>
+<9A6E> <9A6E> <CDD4>
+<9A6F> <9A6F> <D1B1>
+<9A70> <9A70> <B3DB>
+<9A71> <9A71> <C7FD>
+<9A73> <9A73> <B2B5>
+<9A74> <9A74> <C2BF>
+<9A75> <9A75> <E6E0>
+<9A76> <9A76> <CABB>
+<9A77> <9A78> <E6E1>
+<9A79> <9A79> <BED4>
+<9A7A> <9A7A> <E6E3>
+<9A7B> <9A7B> <D7A4>
+<9A7C> <9A7C> <CDD5>
+<9A7D> <9A7D> <E6E5>
+<9A7E> <9A7E> <BCDD>
+<9A7F> <9A7F> <E6E4>
+<9A80> <9A81> <E6E6>
+<9A82> <9A82> <C2EE>
+<9A84> <9A84> <BDBE>
+<9A85> <9A85> <E6E8>
+<9A86> <9A86> <C2E6>
+<9A87> <9A87> <BAA7>
+<9A88> <9A88> <E6E9>
+<9A8A> <9A8A> <E6EA>
+<9A8B> <9A8B> <B3D2>
+<9A8C> <9A8C> <D1E9>
+<9A8F> <9A8F> <BFA5>
+<9A90> <9A90> <E6EB>
+<9A91> <9A91> <C6EF>
+<9A92> <9A93> <E6EC>
+<9A96> <9A96> <E6EE>
+<9A97> <9A97> <C6AD>
+<9A98> <9A98> <E6EF>
+<9A9A> <9A9A> <C9A7>
+<9A9B> <9A9D> <E6F0>
+<9A9E> <9A9E> <E5B9>
+<9A9F> <9AA0> <E6F3>
+<9AA1> <9AA1> <C2E2>
+<9AA2> <9AA3> <E6F5>
+<9AA4> <9AA4> <D6E8>
+<9AA5> <9AA5> <E6F7>
+<9AA7> <9AA7> <E6F8>
+<9AA8> <9AA8> <B9C7>
+<9AAF> <9AAF> <B0B9>
+<9AB0> <9AB0> <F7BB>
+<9AB1> <9AB1> <F7BA>
+<9AB6> <9AB6> <F7BE>
+<9AB7> <9AB7> <F7BC>
+<9AB8> <9AB8> <BAA1>
+<9ABA> <9ABA> <F7BF>
+<9ABC> <9ABC> <F7C0>
+<9AC0> <9AC0> <F7C2>
+<9AC1> <9AC1> <F7C1>
+<9AC2> <9AC2> <F7C4>
+<9AC5> <9AC5> <F7C3>
+<9ACB> <9ACC> <F7C5>
+<9ACF> <9ACF> <F7C3>
+<9AD1> <9AD1> <F7C7>
+<9AD2> <9AD2> <D4E0>
+<9AD3> <9AD3> <CBE8>
+<9AD4> <9AD4> <CCE5>
+<9AD5> <9AD5> <F7C6>
+<9AD6> <9AD6> <F7C5>
+<9AD8> <9AD8> <B8DF>
+<9ADF> <9ADF> <F7D4>
+<9AE1> <9AE1> <F7D5>
+<9AE6> <9AE6> <F7D6>
+<9AEB> <9AEB> <F7D8>
+<9AED> <9AED> <F7DA>
+endbfrange
+
+100 beginbfrange
+<9AEE> <9AEE> <B7A2>
+<9AEF> <9AEF> <F7D7>
+<9AF9> <9AF9> <F7DB>
+<9AFB> <9AFB> <F7D9>
+<9B03> <9B03> <D7D7>
+<9B06> <9B06> <CBC9>
+<9B08> <9B08> <F7DC>
+<9B0D> <9B0D> <BAFA>
+<9B0F> <9B0F> <F7DD>
+<9B13> <9B13> <F7DE>
+<9B1A> <9B1A> <D0EB>
+<9B1F> <9B1F> <F7DF>
+<9B22> <9B22> <F7DE>
+<9B23> <9B23> <F7E0>
+<9B25> <9B25> <B6B7>
+<9B27> <9B27> <C4D6>
+<9B29> <9B29> <E3D2>
+<9B2E> <9B2E> <E3CE>
+<9B2F> <9B2F> <DBCB>
+<9B31> <9B31> <D3F4>
+<9B32> <9B32> <D8AA>
+<9B3B> <9B3B> <E5F7>
+<9B3C> <9B3C> <B9ED>
+<9B41> <9B41> <BFFD>
+<9B42> <9B42> <BBEA>
+<9B43> <9B43> <F7C9>
+<9B44> <9B44> <C6C7>
+<9B45> <9B45> <F7C8>
+<9B47> <9B47> <F7CA>
+<9B48> <9B48> <F7CC>
+<9B49> <9B49> <F7CB>
+<9B4D> <9B4D> <F7CD>
+<9B4E> <9B4E> <F7CB>
+<9B4F> <9B4F> <CEBA>
+<9B51> <9B51> <F7CE>
+<9B54> <9B54> <C4A7>
+<9B58> <9B58> <F7CA>
+<9B5A> <9B5A> <D3E3>
+<9B6F> <9B6F> <C2B3>
+<9B74> <9B74> <F6D0>
+<9B77> <9B77> <F6CF>
+<9B81> <9B81> <F6D1>
+<9B83> <9B83> <F6D2>
+<9B8E> <9B8E> <F6D3>
+<9B90> <9B90> <F6D8>
+<9B91> <9B91> <B1AB>
+<9B92> <9B92> <F6D6>
+<9B9A> <9B9A> <F6DA>
+<9B9D> <9B9D> <F6DF>
+<9B9E> <9B9E> <F6DC>
+<9BAA> <9BAA> <F6DB>
+<9BAB> <9BAB> <F6DE>
+<9BAD> <9BAD> <F6D9>
+<9BAE> <9BAE> <CFCA>
+<9BC0> <9BC0> <F6E7>
+<9BC1> <9BC1> <F6E1>
+<9BC7> <9BC7> <F6E9>
+<9BC9> <9BC9> <C0F0>
+<9BCA> <9BCA> <F6E8>
+<9BD4> <9BD4> <F6F6>
+<9BD6> <9BD6> <F6EB>
+<9BDB> <9BDB> <F6F4>
+<9BDD> <9BDD> <F6F1>
+<9BE1> <9BE1> <F6EE>
+<9BE2> <9BE2> <F6F2>
+<9BE4> <9BE4> <F6EF>
+<9BE7> <9BE7> <F6F0>
+<9BE8> <9BE8> <BEA8>
+<9BEA> <9BEA> <F6EC>
+<9BEB> <9BEB> <F6ED>
+<9BF0> <9BF0> <F6F3>
+<9BF4> <9BF4> <F6F5>
+<9BFD> <9BFD> <F6EA>
+<9BFF> <9BFF> <F6FD>
+<9C08> <9C08> <F6F8>
+<9C09> <9C09> <F6FC>
+<9C0D> <9C0D> <F6FA>
+<9C10> <9C10> <F6F9>
+<9C12> <9C12> <F6FB>
+<9C13> <9C13> <C8FA>
+<9C20> <9C20> <F6FE>
+<9C23> <9C23> <F6E5>
+<9C25> <9C25> <F7A4>
+<9C28> <9C28> <F7A3>
+<9C29> <9C29> <F7A5>
+<9C2D> <9C2D> <F7A2>
+<9C31> <9C31> <F6E3>
+<9C32> <9C32> <F7A1>
+<9C33> <9C33> <F7A6>
+<9C35> <9C35> <F7AA>
+<9C37> <9C37> <F6E6>
+<9C39> <9C39> <F6E4>
+<9C3B> <9C3B> <F7A9>
+<9C3E> <9C3E> <F7A7>
+<9C45> <9C45> <F7AB>
+<9C48> <9C48> <F7A8>
+<9C49> <9C49> <B1EE>
+<9C52> <9C52> <F7AE>
+<9C54> <9C54> <F7AD>
+<9C56> <9C56> <F7AC>
+endbfrange
+
+100 beginbfrange
+<9C57> <9C57> <C1DB>
+<9C58> <9C58> <F6E0>
+<9C5D> <9C5D> <F6F7>
+<9C5F> <9C5F> <F6D7>
+<9C67> <9C67> <F7AF>
+<9C6D> <9C6D> <F6DD>
+<9C78> <9C78> <F6D4>
+<9C7A> <9C7A> <F6E2>
+<9C7C> <9C7C> <D3E3>
+<9C7F> <9C7F> <F6CF>
+<9C81> <9C81> <C2B3>
+<9C82> <9C82> <F6D0>
+<9C85> <9C88> <F6D1>
+<9C8B> <9C8B> <F6D6>
+<9C8D> <9C8D> <B1AB>
+<9C8E> <9C8E> <F6D7>
+<9C90> <9C92> <F6D8>
+<9C94> <9C95> <F6DB>
+<9C9A> <9C9B> <F6DD>
+<9C9C> <9C9C> <CFCA>
+<9C9E> <9CA3> <F6DF>
+<9CA4> <9CA4> <C0F0>
+<9CA5> <9CA9> <F6E5>
+<9CAB> <9CAB> <F6EA>
+<9CAD> <9CAE> <F6EB>
+<9CB0> <9CB7> <F6ED>
+<9CB8> <9CB8> <BEA8>
+<9CBA> <9CBD> <F6F5>
+<9CC3> <9CC3> <C8FA>
+<9CC4> <9CC7> <F6F9>
+<9CCA> <9CCB> <F6FD>
+<9CCC> <9CD0> <F7A1>
+<9CD3> <9CD5> <F7A6>
+<9CD6> <9CD6> <B1EE>
+<9CD7> <9CD9> <F7A9>
+<9CDC> <9CDD> <F7AC>
+<9CDE> <9CDE> <C1DB>
+<9CDF> <9CDF> <F7AE>
+<9CE2> <9CE2> <F7AF>
+<9CE5> <9CE5> <C4F1>
+<9CE9> <9CE9> <F0AF>
+<9CEC> <9CEC> <D9EC>
+<9CF3> <9CF3> <B7EF>
+<9CF4> <9CF4> <C3F9>
+<9CF6> <9CF6> <F0B0>
+<9D06> <9D06> <F0B2>
+<9D07> <9D07> <F0B1>
+<9D09> <9D09> <D1BB>
+<9D15> <9D15> <CDD2>
+<9D1B> <9D1B> <D4A7>
+<9D1D> <9D1D> <F0B6>
+<9D1F> <9D1F> <F0B7>
+<9D23> <9D23> <F0B3>
+<9D26> <9D26> <D1EC>
+<9D28> <9D28> <D1BC>
+<9D2F> <9D2F> <F0B9>
+<9D30> <9D30> <F0BB>
+<9D3B> <9D3B> <BAE8>
+<9D3F> <9D3F> <B8EB>
+<9D42> <9D42> <F0BC>
+<9D51> <9D51> <BEE9>
+<9D52> <9D52> <F0C1>
+<9D53> <9D53> <F0BE>
+<9D5C> <9D5C> <F0C3>
+<9D5D> <9D5D> <B6EC>
+<9D60> <9D60> <F0C0>
+<9D61> <9D61> <F0C4>
+<9D6A> <9D6A> <F0C6>
+<9D6C> <9D6C> <C5F4>
+<9D6F> <9D6F> <F0C7>
+<9D72> <9D72> <C8B5>
+<9D87> <9D87> <F0B4>
+<9D89> <9D89> <F0C8>
+<9D93> <9D93> <F0C5>
+<9D98> <9D98> <F0C9>
+<9D9A> <9D9A> <F0CA>
+<9DA5> <9DA5> <F0CC>
+<9DA9> <9DA9> <F0CD>
+<9DAF> <9DAF> <DDBA>
+<9DB4> <9DB4> <BAD7>
+<9DBB> <9DBB> <F7BD>
+<9DBC> <9DBC> <F0CF>
+<9DC0> <9DC0> <F0CB>
+<9DC2> <9DC2> <F0CE>
+<9DC4> <9DC4> <BCA6>
+<9DD3> <9DD3> <F0D1>
+<9DD7> <9DD7> <C5B8>
+<9DD9> <9DD9> <F0BA>
+<9DDA> <9DDA> <F0D2>
+<9DE5> <9DE5> <F0B8>
+<9DE6> <9DE6> <F0D4>
+<9DEF> <9DEF> <F0D3>
+<9DF2> <9DF2> <F0D5>
+<9DF3> <9DF3> <F0C2>
+<9DF8> <9DF8> <F0D6>
+<9DF9> <9DF9> <D3A5>
+<9DFA> <9DFA> <F0D8>
+<9E0C> <9E0C> <F0D7>
+<9E15> <9E15> <F0B5>
+<9E1A> <9E1A> <F0D0>
+endbfrange
+
+100 beginbfrange
+<9E1B> <9E1B> <F0D9>
+<9E1D> <9E1D> <F0BF>
+<9E1E> <9E1E> <F0BD>
+<9E1F> <9E1F> <C4F1>
+<9E20> <9E20> <F0AF>
+<9E21> <9E21> <BCA6>
+<9E22> <9E22> <F0B0>
+<9E23> <9E23> <C3F9>
+<9E25> <9E25> <C5B8>
+<9E26> <9E26> <D1BB>
+<9E28> <9E2C> <F0B1>
+<9E2D> <9E2D> <D1BC>
+<9E2F> <9E2F> <D1EC>
+<9E31> <9E31> <F0B7>
+<9E32> <9E32> <F0B6>
+<9E33> <9E33> <D4A7>
+<9E35> <9E35> <CDD2>
+<9E36> <9E36> <F0B8>
+<9E37> <9E37> <F0BA>
+<9E38> <9E38> <F0B9>
+<9E39> <9E3A> <F0BB>
+<9E3D> <9E3D> <B8EB>
+<9E3E> <9E3E> <F0BD>
+<9E3F> <9E3F> <BAE8>
+<9E41> <9E42> <F0BE>
+<9E43> <9E43> <BEE9>
+<9E44> <9E44> <F0C0>
+<9E45> <9E45> <B6EC>
+<9E46> <9E49> <F0C1>
+<9E4A> <9E4A> <C8B5>
+<9E4B> <9E4C> <F0C5>
+<9E4E> <9E4E> <F0C7>
+<9E4F> <9E4F> <C5F4>
+<9E51> <9E51> <F0C8>
+<9E55> <9E55> <F0C9>
+<9E57> <9E57> <F0CA>
+<9E58> <9E58> <F7BD>
+<9E5A> <9E5C> <F0CB>
+<9E5E> <9E5E> <F0CE>
+<9E63> <9E63> <F0CF>
+<9E64> <9E64> <BAD7>
+<9E66> <9E6C> <F0D0>
+<9E6D> <9E6D> <F0D8>
+<9E70> <9E70> <D3A5>
+<9E71> <9E71> <F0D7>
+<9E73> <9E73> <F0D9>
+<9E75> <9E75> <C2B1>
+<9E79> <9E79> <CFCC>
+<9E7A> <9E7A> <F5BA>
+<9E7C> <9E7C> <BCEF>
+<9E7D> <9E7D> <D1CE>
+<9E7E> <9E7E> <F5BA>
+<9E7F> <9E7F> <C2B9>
+<9E82> <9E82> <F7E4>
+<9E87> <9E88> <F7E5>
+<9E8B> <9E8B> <F7E7>
+<9E92> <9E92> <F7E8>
+<9E93> <9E93> <C2B4>
+<9E97> <9E97> <C0F6>
+<9E9D> <9E9D> <F7EA>
+<9E9F> <9E9F> <F7EB>
+<9EA5> <9EA5> <C2F3>
+<9EA6> <9EA6> <C2F3>
+<9EA9> <9EA9> <F4EF>
+<9EAF> <9EAF> <C7FA>
+<9EB4> <9EB4> <F4F0>
+<9EB5> <9EB5> <C3E6>
+<9EB8> <9EB8> <F4EF>
+<9EBB> <9EBB> <C2E9>
+<9EBD> <9EBE> <F7E1>
+<9EC4> <9EC4> <BBC6>
+<9EC9> <9EC9> <D9E4>
+<9ECC> <9ECC> <D9E4>
+<9ECD> <9ECD> <CAF2>
+<9ECE> <9ECE> <C0E8>
+<9ECF> <9ECF> <F0A4>
+<9ED1> <9ED1> <BADA>
+<9ED4> <9ED4> <C7AD>
+<9ED8> <9ED8> <C4AC>
+<9EDB> <9EDD> <F7EC>
+<9EDE> <9EDE> <B5E3>
+<9EDF> <9EDF> <F7F0>
+<9EE0> <9EE0> <F7EF>
+<9EE2> <9EE2> <F7F1>
+<9EE5> <9EE5> <F7F4>
+<9EE7> <9EE7> <F7F3>
+<9EE8> <9EE8> <B5B3>
+<9EE9> <9EE9> <F7F2>
+<9EEA> <9EEA> <F7F5>
+<9EEF> <9EEF> <F7F6>
+<9EF2> <9EF2> <F7F5>
+<9EF4> <9EF4> <C3B9>
+<9EF7> <9EF7> <F7F2>
+<9EF9> <9EF9> <EDE9>
+<9EFB> <9EFC> <EDEA>
+<9EFD> <9EFD> <F6BC>
+<9EFE> <9EFE> <F6BC>
+<9EFF> <9EFF> <F6BD>
+<9F09> <9F09> <F6BE>
+<9F0B> <9F0B> <F6BD>
+endbfrange
+
+80 beginbfrange
+<9F0D> <9F0D> <F6BE>
+<9F0E> <9F0E> <B6A6>
+<9F10> <9F10> <D8BE>
+<9F13> <9F13> <B9C4>
+<9F15> <9F15> <B6AC>
+<9F17> <9F17> <D8BB>
+<9F19> <9F19> <DCB1>
+<9F20> <9F20> <CAF3>
+<9F22> <9F22> <F7F7>
+<9F2C> <9F2C> <F7F8>
+<9F2F> <9F2F> <F7F9>
+<9F37> <9F37> <F7FB>
+<9F39> <9F39> <F7FA>
+<9F3B> <9F3B> <B1C7>
+<9F3D> <9F3E> <F7FC>
+<9F44> <9F44> <F7FE>
+<9F4A> <9F4A> <C6EB>
+<9F4B> <9F4B> <D5AB>
+<9F4F> <9F4F> <ECB4>
+<9F50> <9F50> <C6EB>
+<9F51> <9F51> <ECB4>
+<9F52> <9F52> <B3DD>
+<9F54> <9F54> <F6B3>
+<9F59> <9F59> <F6B5>
+<9F5C> <9F5C> <F6B7>
+<9F5F> <9F5F> <F6B4>
+<9F60> <9F60> <F6B6>
+<9F61> <9F61> <C1E4>
+<9F63> <9F63> <B3F6>
+<9F66> <9F66> <F6B8>
+<9F6A> <9F6A> <F6BA>
+<9F6C> <9F6C> <F6B9>
+<9F72> <9F72> <C8A3>
+<9F77> <9F77> <F6BB>
+<9F7F> <9F7F> <B3DD>
+<9F80> <9F80> <F6B3>
+<9F83> <9F83> <F6B4>
+<9F84> <9F84> <C1E4>
+<9F85> <9F8A> <F6B5>
+<9F8B> <9F8B> <C8A3>
+<9F8C> <9F8C> <F6BB>
+<9F8D> <9F8D> <C1FA>
+<9F90> <9F90> <C5D3>
+<9F94> <9F94> <B9A8>
+<9F95> <9F95> <EDE8>
+<9F99> <9F99> <C1FA>
+<9F9A> <9F9A> <B9A8>
+<9F9B> <9F9B> <EDE8>
+<9F9C> <9F9C> <B9EA>
+<9F9F> <9F9F> <B9EA>
+<9FA0> <9FA0> <D9DF>
+<E7C7> <E7C7> <A8BC>
+<F880> <F881> <81>
+<FE31> <FE31> <A6F2>
+<FE33> <FE34> <A6F4>
+<FE35> <FE36> <A6E0>
+<FE37> <FE38> <A6F0>
+<FE39> <FE3A> <A6E2>
+<FE3B> <FE3C> <A6EE>
+<FE3D> <FE3E> <A6E6>
+<FE3F> <FE40> <A6E4>
+<FE41> <FE44> <A6E8>
+<FE50> <FE50> <A3AC>
+<FE51> <FE51> <A1A2>
+<FE52> <FE52> <A3AE>
+<FE54> <FE54> <A3BB>
+<FE55> <FE55> <A3BA>
+<FE56> <FE56> <A3BF>
+<FE57> <FE57> <A3A1>
+<FE59> <FE5A> <A3A8>
+<FE5B> <FE5B> <A3FB>
+<FE5C> <FE5C> <A3FD>
+<FE5D> <FE5E> <A1B2>
+<FF01> <FF03> <A3A1>
+<FF04> <FF04> <A1E7>
+<FF05> <FF5D> <A3A5>
+<FF5E> <FF5E> <A1AB>
+<FFE0> <FFE1> <A1E9>
+<FFE3> <FFE3> <A3FE>
+<FFE5> <FFE5> <A3A4>
+endbfrange
+
+endcmap
+CMapName currentdict /CMap defineresource pop
+end
+end
+
+%%EndResource
+%%EOF
diff --git a/src/main/resources/Resources/cmap/UCS2-KSCms-UHC b/src/main/resources/Resources/cmap/UCS2-KSCms-UHC
new file mode 100644
index 0000000..e2e445b
--- /dev/null
+++ b/src/main/resources/Resources/cmap/UCS2-KSCms-UHC
@@ -0,0 +1,9070 @@
+%!PS-Adobe-3.0 Resource-CMap
+%%DocumentNeededResources: ProcSet (CIDInit)
+%%IncludeResource: ProcSet (CIDInit)
+%%BeginResource: CMap (UCS2-KSCms-UHC)
+%%Title: (UCS2-KSCms-UHC)
+%%Version: 4.002
+%%Copyright: -----------------------------------------------------------
+%%Copyright: Copyright 1990-1999 Adobe Systems Incorporated.
+%%Copyright: All Rights Reserved.
+%%Copyright:
+%%Copyright: Patents Pending
+%%Copyright:
+%%Copyright: NOTICE: All information contained herein is the property
+%%Copyright: of Adobe Systems Incorporated.
+%%Copyright:
+%%Copyright: Permission is granted for redistribution of this file
+%%Copyright: provided this copyright notice is maintained intact and
+%%Copyright: that the contents of this file are not altered in any
+%%Copyright: way from its original form.
+%%Copyright:
+%%Copyright: PostScript and Display PostScript are trademarks of
+%%Copyright: Adobe Systems Incorporated which may be registered in
+%%Copyright: certain jurisdictions.
+%%Copyright: -----------------------------------------------------------
+%%EndComments
+
+/CIDInit /ProcSet findresource begin
+
+12 dict begin
+
+begincmap
+
+/CIDSystemInfo 3 dict dup begin
+ /Registry (Adobe) def
+ /Ordering (UCS2_KCSms_UHC) def
+ /Supplement 1 def
+end def
+
+/CMapName /UCS2-KSCms-UHC def
+/CMapVersion 4.002 def
+/CMapType 1 def
+/WMode 0 def
+
+1 begincodespacerange
+<0000> <FFFF>
+endcodespacerange
+
+100 beginbfrange
+<0000> <0080> <00>
+<00A1> <00A1> <A2AE>
+<00A2> <00A3> <A1CB>
+<00A4> <00A4> <A2B4>
+<00A5> <00A5> <A1CD>
+<00A6> <00A6> <7C>
+<00A7> <00A7> <A1D7>
+<00A8> <00A8> <A1A7>
+<00A9> <00A9> <A8CF>
+<00AA> <00AA> <A8A3>
+<00AB> <00AB> <A1EC>
+<00AC> <00AC> <A1FE>
+<00AD> <00AD> <A1A9>
+<00AE> <00AE> <52>
+<00B0> <00B0> <A1C6>
+<00B1> <00B1> <A1BE>
+<00B2> <00B3> <A9F7>
+<00B4> <00B4> <A2A5>
+<00B5> <00B5> <A5EC>
+<00B6> <00B6> <A2D2>
+<00B7> <00B7> <A1A4>
+<00B8> <00B8> <A2AC>
+<00B9> <00B9> <A9F6>
+<00BA> <00BA> <A8AC>
+<00BB> <00BB> <A1ED>
+<00BC> <00BC> <A8F9>
+<00BD> <00BD> <A8F6>
+<00BE> <00BE> <A8FA>
+<00BF> <00BF> <A2AF>
+<00C0> <00C0> <41>
+<00C1> <00C1> <41>
+<00C2> <00C2> <41>
+<00C3> <00C3> <41>
+<00C4> <00C4> <41>
+<00C5> <00C5> <41>
+<00C6> <00C6> <A8A1>
+<00C7> <00C7> <43>
+<00C8> <00C8> <45>
+<00C9> <00C9> <45>
+<00CA> <00CA> <45>
+<00CB> <00CB> <45>
+<00CC> <00CC> <49>
+<00CD> <00CD> <49>
+<00CE> <00CE> <49>
+<00CF> <00CF> <49>
+<00D0> <00D0> <A8A2>
+<00D1> <00D2> <4E>
+<00D3> <00D3> <4F>
+<00D4> <00D4> <4F>
+<00D5> <00D5> <4F>
+<00D6> <00D6> <4F>
+<00D7> <00D7> <A1BF>
+<00D8> <00D8> <A8AA>
+<00D9> <00D9> <55>
+<00DA> <00DA> <55>
+<00DB> <00DB> <55>
+<00DC> <00DC> <55>
+<00DD> <00DD> <59>
+<00DE> <00DE> <A8AD>
+<00DF> <00DF> <A9AC>
+<00E0> <00E0> <61>
+<00E1> <00E1> <61>
+<00E2> <00E2> <61>
+<00E3> <00E3> <61>
+<00E4> <00E4> <61>
+<00E5> <00E5> <61>
+<00E6> <00E6> <A9A1>
+<00E7> <00E7> <63>
+<00E8> <00E8> <65>
+<00E9> <00E9> <65>
+<00EA> <00EA> <65>
+<00EB> <00EB> <65>
+<00EC> <00EC> <69>
+<00ED> <00ED> <69>
+<00EE> <00EE> <69>
+<00EF> <00EF> <69>
+<00F0> <00F0> <A9A3>
+<00F1> <00F2> <6E>
+<00F3> <00F3> <6F>
+<00F4> <00F4> <6F>
+<00F5> <00F5> <6F>
+<00F6> <00F6> <6F>
+<00F7> <00F7> <A1C0>
+<00F8> <00F8> <A9AA>
+<00F9> <00F9> <75>
+<00FA> <00FA> <75>
+<00FB> <00FB> <75>
+<00FC> <00FC> <75>
+<00FD> <00FD> <79>
+<00FE> <00FE> <A9AD>
+<00FF> <00FF> <79>
+<0110> <0110> <A9A2>
+<0111> <0111> <A9A2>
+<0126> <0126> <A8A4>
+<0127> <0127> <A9A4>
+<0131> <0131> <A9A5>
+<0132> <0132> <A8A6>
+<0133> <0133> <A9A6>
+<0138> <0138> <A9A7>
+<013F> <013F> <A8A8>
+endbfrange
+
+100 beginbfrange
+<0140> <0140> <A9A8>
+<0141> <0141> <A8A9>
+<0142> <0142> <A9A9>
+<0149> <0149> <A9B0>
+<014A> <014A> <A8AF>
+<014B> <014B> <A9AF>
+<0152> <0152> <A8AB>
+<0153> <0153> <A9AB>
+<0166> <0166> <A8AE>
+<0167> <0167> <A9AE>
+<02C7> <02C7> <A2A7>
+<02D0> <02D0> <A2B0>
+<02D8> <02D8> <A2A8>
+<02D9> <02D9> <A2AB>
+<02DA> <02DA> <A2AA>
+<02DB> <02DB> <A2AD>
+<02DC> <02DC> <A2A6>
+<02DD> <02DD> <A2A9>
+<0391> <03A1> <A5C1>
+<03A3> <03A9> <A5D2>
+<03B1> <03C1> <A5E1>
+<03C3> <03C9> <A5F2>
+<0401> <0401> <ACA7>
+<0410> <0415> <ACA1>
+<0416> <042F> <ACA8>
+<0430> <0435> <ACD1>
+<0436> <044F> <ACD8>
+<0451> <0451> <ACD7>
+<1100> <1101> <A4A1>
+<1102> <1102> <A4A4>
+<1103> <1105> <A4A7>
+<1106> <1108> <A4B1>
+<1109> <1112> <A4B5>
+<1114> <1115> <A4D5>
+<111A> <111A> <A4DD>
+<111C> <111C> <A4DE>
+<111D> <111E> <A4E1>
+<1120> <1120> <A4E3>
+<1121> <1121> <A4B4>
+<1122> <1123> <A4E4>
+<1127> <1127> <A4E6>
+<1129> <1129> <A4E7>
+<112B> <112F> <A4E8>
+<1132> <1132> <A4ED>
+<1136> <1136> <A4EE>
+<113C> <113D> <A4B5>
+<113E> <113F> <A4B5>
+<1140> <1140> <A4EF>
+<1145> <1146> <A4F2>
+<1147> <1147> <A4F0>
+<114C> <114C> <A4B7>
+<114E> <114F> <A4B8>
+<1150> <1151> <A4B8>
+<1154> <1154> <A4BA>
+<1155> <1155> <A4BA>
+<1157> <1159> <A4F4>
+<115F> <115F> <A4D4>
+<1161> <1175> <A4BF>
+<1184> <1185> <A4F7>
+<1188> <1188> <A4F9>
+<1191> <1192> <A4FA>
+<1194> <1194> <A4FC>
+<119E> <119E> <A4FD>
+<11A1> <11A1> <A4FE>
+<11A8> <11AE> <A4A1>
+<11AF> <11B8> <A4A9>
+<11B9> <11BD> <A4B4>
+<11BE> <11C2> <A4BA>
+<11C6> <11C8> <A4D6>
+<11CC> <11CC> <A4D9>
+<11CE> <11CE> <A4DA>
+<11D3> <11D3> <A4DB>
+<11D7> <11D7> <A4DC>
+<11D9> <11D9> <A4DD>
+<11DC> <11DD> <A4DE>
+<11DF> <11DF> <A4E0>
+<11E6> <11E6> <A4E8>
+<11E7> <11E7> <A4EA>
+<11E8> <11E8> <A4EC>
+<11EA> <11EA> <A4ED>
+<11EB> <11EB> <A4EF>
+<11EE> <11EE> <A4F0>
+<11F0> <11F0> <A4B7>
+<11F1> <11F2> <A4F2>
+<11F4> <11F4> <A4F4>
+<11F9> <11F9> <A4F6>
+<2010> <2010> <A1A9>
+<2013> <2014> <A1A9>
+<2015> <2016> <A1AA>
+<2018> <2019> <A1AE>
+<201C> <201D> <A1B0>
+<2020> <2021> <A2D3>
+<2022> <2022> <A1A4>
+<2025> <2026> <A1A5>
+<2027> <2027> <A1A4>
+<2030> <2030> <A2B6>
+<2032> <2033> <A1C7>
+<203B> <203B> <A1D8>
+<203E> <203E> <A3FE>
+<2074> <2074> <A9F9>
+endbfrange
+
+100 beginbfrange
+<207F> <207F> <A9FA>
+<2081> <2084> <A9FB>
+<20A9> <20A9> <5C>
+<2103> <2103> <A1C9>
+<2109> <2109> <A2B5>
+<2113> <2113> <A7A4>
+<2116> <2116> <A2E0>
+<2121> <2121> <A2E5>
+<2122> <2122> <A2E2>
+<2126> <2126> <A7D9>
+<212B> <212B> <A1CA>
+<2153> <2154> <A8F7>
+<215B> <215E> <A8FB>
+<2160> <2169> <A5B0>
+<2170> <2179> <A5A1>
+<2190> <2191> <A1E7>
+<2192> <2192> <A1E6>
+<2193> <2194> <A1E9>
+<2195> <2195> <A2D5>
+<2196> <2196> <A2D8>
+<2197> <2197> <A2D6>
+<2198> <2198> <A2D9>
+<2199> <2199> <A2D7>
+<21D2> <21D2> <A2A1>
+<21D4> <21D4> <A2A2>
+<2200> <2200> <A2A3>
+<2202> <2202> <A1D3>
+<2203> <2203> <A2A4>
+<2207> <2207> <A1D4>
+<2208> <2208> <A1F4>
+<220B> <220B> <A1F5>
+<220F> <220F> <A2B3>
+<2211> <2211> <A2B2>
+<221A> <221A> <A1EE>
+<221D> <221D> <A1F0>
+<221E> <221E> <A1C4>
+<2220> <2220> <A1D0>
+<2225> <2225> <A1AB>
+<2227> <2228> <A1FC>
+<2229> <2229> <A1FB>
+<222A> <222A> <A1FA>
+<222B> <222C> <A1F2>
+<222E> <222E> <A2B1>
+<2234> <2234> <A1C5>
+<2235> <2235> <A1F1>
+<2236> <2236> <A2B0>
+<223C> <223C> <A1AD>
+<223D> <223D> <A1EF>
+<2252> <2252> <A1D6>
+<2260> <2260> <A1C1>
+<2261> <2261> <A1D5>
+<2264> <2265> <A1C2>
+<226A> <226B> <A1EC>
+<2282> <2283> <A1F8>
+<2286> <2287> <A1F6>
+<2299> <2299> <A2C1>
+<22A5> <22A5> <A1D1>
+<22EF> <22EF> <A1A6>
+<2312> <2312> <A1D2>
+<2460> <246E> <A8E7>
+<2474> <2482> <A9E7>
+<249C> <24B5> <A9CD>
+<24B6> <24CF> <A8CD>
+<24D0> <24E9> <A8CD>
+<2500> <2500> <A6A1>
+<2501> <2501> <A6AC>
+<2502> <2502> <A6A2>
+<2503> <2503> <A6AD>
+<250C> <250C> <A6A3>
+<250D> <250D> <A6C8>
+<250E> <250E> <A6C7>
+<250F> <250F> <A6AE>
+<2510> <2510> <A6A4>
+<2511> <2511> <A6C2>
+<2512> <2512> <A6C1>
+<2513> <2513> <A6AF>
+<2514> <2514> <A6A6>
+<2515> <2515> <A6C6>
+<2516> <2516> <A6C5>
+<2517> <2517> <A6B1>
+<2518> <2518> <A6A5>
+<2519> <2519> <A6C4>
+<251A> <251A> <A6C3>
+<251B> <251B> <A6B0>
+<251C> <251C> <A6A7>
+<251D> <251D> <A6BC>
+<251E> <251F> <A6C9>
+<2520> <2520> <A6B7>
+<2521> <2522> <A6CB>
+<2523> <2523> <A6B2>
+<2524> <2524> <A6A9>
+<2525> <2525> <A6BE>
+<2526> <2527> <A6CD>
+<2528> <2528> <A6B9>
+<2529> <252A> <A6CF>
+<252B> <252B> <A6B4>
+<252C> <252C> <A6A8>
+<252D> <252E> <A6D1>
+<252F> <252F> <A6B8>
+<2530> <2530> <A6BD>
+endbfrange
+
+100 beginbfrange
+<2531> <2532> <A6D3>
+<2533> <2533> <A6B3>
+<2534> <2534> <A6AA>
+<2535> <2536> <A6D5>
+<2537> <2537> <A6BA>
+<2538> <2538> <A6BF>
+<2539> <253A> <A6D7>
+<253B> <253B> <A6B5>
+<253C> <253C> <A6AB>
+<253D> <253E> <A6D9>
+<253F> <253F> <A6BB>
+<2540> <2541> <A6DB>
+<2542> <2542> <A6C0>
+<2543> <254A> <A6DD>
+<254B> <254B> <A6B6>
+<2592> <2592> <A2C6>
+<2595> <2595> <A3FC>
+<25A0> <25A0> <A1E1>
+<25A1> <25A1> <A1E0>
+<25A3> <25A3> <A2C3>
+<25A4> <25A5> <A2C7>
+<25A6> <25A6> <A2CB>
+<25A7> <25A7> <A2CA>
+<25A8> <25A8> <A2C9>
+<25A9> <25A9> <A2CC>
+<25B2> <25B2> <A1E3>
+<25B3> <25B3> <A1E2>
+<25B6> <25B6> <A2BA>
+<25B7> <25B7> <A2B9>
+<25BC> <25BC> <A1E5>
+<25BD> <25BD> <A1E4>
+<25C0> <25C0> <A2B8>
+<25C1> <25C1> <A2B7>
+<25C6> <25C6> <A1DF>
+<25C7> <25C7> <A1DE>
+<25C8> <25C8> <A2C2>
+<25C9> <25C9> <A2C1>
+<25CB> <25CB> <A1DB>
+<25CE> <25CE> <A1DD>
+<25CF> <25CF> <A1DC>
+<25D0> <25D1> <A2C4>
+<2605> <2605> <A1DA>
+<2606> <2606> <A1D9>
+<2609> <2609> <A2C1>
+<260E> <260E> <A2CF>
+<260F> <260F> <A2CE>
+<261C> <261C> <A2D0>
+<261E> <261E> <A2D1>
+<2640> <2640> <A1CF>
+<2642> <2642> <A1CE>
+<2660> <2661> <A2BC>
+<2663> <2663> <A2C0>
+<2664> <2664> <A2BB>
+<2665> <2665> <A2BE>
+<2667> <2667> <A2BF>
+<2668> <2668> <A2CD>
+<2669> <266A> <A2DB>
+<266C> <266C> <A2DD>
+<266D> <266D> <A2DA>
+<3000> <3002> <A1A1>
+<3003> <3003> <A1A8>
+<3008> <3011> <A1B4>
+<3013> <3013> <A1EB>
+<3014> <3015> <A1B2>
+<301C> <301C> <A1AD>
+<3041> <3093> <AAA1>
+<30A1> <30F6> <ABA1>
+<30FB> <30FB> <A1A4>
+<3131> <318E> <A4A1>
+<3192> <3192> <ECE9>
+<3193> <3193> <ECA3>
+<3194> <3194> <DFB2>
+<3195> <3195> <DECC>
+<3196> <3196> <DFBE>
+<3197> <3197> <F1E9>
+<3198> <3198> <F9BB>
+<3199> <3199> <CBA3>
+<319A> <319A> <EBE0>
+<319B> <319B> <DCB0>
+<319C> <319C> <EFCB>
+<319D> <319D> <F4B8>
+<319E> <319E> <F2A2>
+<319F> <319F> <ECD1>
+<3200> <321B> <A9B1>
+<321C> <321C> <A2DF>
+<3220> <3220> <ECE9>
+<3221> <3221> <ECA3>
+<3222> <3222> <DFB2>
+<3223> <3223> <DECC>
+<3224> <3224> <E7E9>
+<3225> <3225> <D7BF>
+<3226> <3226> <F6D2>
+<3227> <3227> <F8A2>
+<3228> <3228> <CEFA>
+<3229> <3229> <E4A8>
+<322A> <322A> <EAC5>
+<322B> <322B> <FBFD>
+<322C> <322C> <E2A9>
+<322D> <322D> <D9CA>
+<322E> <322E> <D1D1>
+endbfrange
+
+100 beginbfrange
+<322F> <322F> <F7CF>
+<3230> <3230> <ECED>
+<3231> <3231> <F1BB>
+<3232> <3232> <EAF3>
+<3233> <3233> <DEE4>
+<3234> <3234> <D9A3>
+<3235> <3235> <F7E5>
+<3236> <3236> <EEAF>
+<3237> <3237> <F5E6>
+<3238> <3238> <D6CC>
+<3239> <3239> <D3DB>
+<323A> <323A> <FBBC>
+<323B> <323B> <F9CA>
+<323C> <323C> <CAF8>
+<323D> <323D> <D0EA>
+<323E> <323E> <EDC0>
+<323F> <323F> <FAF0>
+<3240> <3240> <F0AE>
+<3241> <3241> <FDCC>
+<3242> <3242> <EDBB>
+<3243> <3243> <F2B8>
+<3260> <327B> <A8B1>
+<327F> <327F> <A2DE>
+<3280> <3280> <ECE9>
+<3281> <3281> <ECA3>
+<3282> <3282> <DFB2>
+<3283> <3283> <DECC>
+<3284> <3284> <E7E9>
+<3285> <3285> <D7BF>
+<3286> <3286> <F6D2>
+<3287> <3287> <F8A2>
+<3288> <3288> <CEFA>
+<3289> <3289> <E4A8>
+<328A> <328A> <EAC5>
+<328B> <328B> <FBFD>
+<328C> <328C> <E2A9>
+<328D> <328D> <D9CA>
+<328E> <328E> <D1D1>
+<328F> <328F> <F7CF>
+<3290> <3290> <ECED>
+<3291> <3291> <F1BB>
+<3292> <3292> <EAF3>
+<3293> <3293> <DEE4>
+<3294> <3294> <D9A3>
+<3295> <3295> <F7E5>
+<3296> <3296> <EEAF>
+<3297> <3297> <F5E6>
+<3298> <3298> <D6CC>
+<3299> <3299> <DDFA>
+<329A> <329A> <D1FB>
+<329B> <329B> <D2B3>
+<329C> <329C> <EEEA>
+<329D> <329D> <E9D0>
+<329E> <329E> <ECD4>
+<329F> <329F> <F1BC>
+<32A0> <32A0> <FAA3>
+<32A1> <32A1> <FDCC>
+<32A2> <32A2> <DED0>
+<32A3> <32A3> <EFE1>
+<32A4> <32A4> <DFBE>
+<32A5> <32A5> <F1E9>
+<32A6> <32A6> <F9BB>
+<32A7> <32A7> <F1A7>
+<32A8> <32A8> <E9D3>
+<32A9> <32A9> <ECA2>
+<32AA> <32AA> <F0F3>
+<32AB> <32AB> <F9CA>
+<32AC> <32AC> <CAF8>
+<32AD> <32AD> <D0EA>
+<32AE> <32AE> <EDC0>
+<32AF> <32AF> <FAF0>
+<32B0> <32B0> <E5A8>
+<3380> <3384> <A7C9>
+<3388> <3389> <A7BA>
+<338A> <338C> <A7DC>
+<338D> <338F> <A7B6>
+<3390> <3394> <A7D4>
+<3395> <3397> <A7A1>
+<3398> <3398> <A7A5>
+<3399> <33A2> <A7AB>
+<33A3> <33A6> <A7A7>
+<33A7> <33A8> <A7BD>
+<33A9> <33AC> <A7E5>
+<33AD> <33AF> <A7E1>
+<33B0> <33B9> <A7BF>
+<33BA> <33BF> <A7CE>
+<33C0> <33C1> <A7DA>
+<33C2> <33C2> <A2E3>
+<33C3> <33C3> <A7EC>
+<33C4> <33C4> <A7A6>
+<33C5> <33C5> <A7E0>
+<33C6> <33C6> <A7EF>
+<33C7> <33C7> <A2E1>
+<33C8> <33C8> <A7BC>
+<33C9> <33C9> <A7ED>
+<33CA> <33CA> <A7B5>
+<33CF> <33CF> <A7B9>
+<33D0> <33D0> <A7EA>
+<33D3> <33D3> <A7EB>
+<33D6> <33D6> <A7DF>
+endbfrange
+
+100 beginbfrange
+<33D8> <33D8> <A2E4>
+<33DB> <33DB> <A7E4>
+<33DC> <33DC> <A7EE>
+<33DD> <33DD> <A7E9>
+<4E00> <4E00> <ECE9>
+<4E01> <4E01> <EFCB>
+<4E03> <4E03> <F6D2>
+<4E07> <4E07> <D8B2>
+<4E08> <4E08> <EDDB>
+<4E09> <4E09> <DFB2>
+<4E0A> <4E0A> <DFBE>
+<4E0B> <4E0B> <F9BB>
+<4E0D> <4E0D> <DCF4>
+<4E11> <4E11> <F5E4>
+<4E14> <4E14> <F3A6>
+<4E15> <4E15> <DDE0>
+<4E16> <4E16> <E1A6>
+<4E18> <4E18> <CEF8>
+<4E19> <4E19> <DCB0>
+<4E1E> <4E1E> <E3AA>
+<4E2D> <4E2D> <F1E9>
+<4E32> <4E32> <CDFA>
+<4E38> <4E38> <FCAF>
+<4E39> <4E39> <D3A1>
+<4E3B> <4E3B> <F1AB>
+<4E42> <4E42> <E7D1>
+<4E43> <4E43> <D2AC>
+<4E45> <4E45> <CEF9>
+<4E4B> <4E4B> <F1FD>
+<4E4D> <4E4D> <DEBF>
+<4E4E> <4E4E> <FBBA>
+<4E4F> <4E4F> <F9B9>
+<4E56> <4E56> <CED2>
+<4E58> <4E58> <E3AB>
+<4E59> <4E59> <EBE0>
+<4E5D> <4E5D> <CEFA>
+<4E5E> <4E5E> <CBF7>
+<4E5F> <4E5F> <E5A5>
+<4E6B> <4E6B> <CAE1>
+<4E6D> <4E6D> <D4CC>
+<4E73> <4E73> <EAE1>
+<4E76> <4E76> <DCE3>
+<4E77> <4E77> <DFAD>
+<4E7E> <4E7E> <CBEB>
+<4E82> <4E82> <D5AF>
+<4E86> <4E86> <D6F5>
+<4E88> <4E88> <E5F8>
+<4E8B> <4E8B> <DEC0>
+<4E8C> <4E8C> <ECA3>
+<4E8E> <4E8E> <E9CD>
+<4E90> <4E90> <EAA7>
+<4E91> <4E91> <E9F6>
+<4E92> <4E92> <FBBB>
+<4E94> <4E94> <E7E9>
+<4E95> <4E95> <EFCC>
+<4E98> <4E98> <D0E6>
+<4E9B> <4E9B> <DEC1>
+<4E9E> <4E9E> <E4AC>
+<4EA1> <4EA1> <D8CC>
+<4EA2> <4EA2> <F9F1>
+<4EA4> <4EA4> <CEDF>
+<4EA5> <4EA5> <FAA4>
+<4EA6> <4EA6> <E6B2>
+<4EA8> <4EA8> <FAFB>
+<4EAB> <4EAB> <FABD>
+<4EAC> <4EAC> <CCC8>
+<4EAD> <4EAD> <EFCD>
+<4EAE> <4EAE> <D5D5>
+<4EB6> <4EB6> <D3A2>
+<4EBA> <4EBA> <ECD1>
+<4EC0> <4EC0> <E4A7>
+<4EC1> <4EC1> <ECD2>
+<4EC4> <4EC4> <F6B1>
+<4EC7> <4EC7> <CEFB>
+<4ECA> <4ECA> <D0D1>
+<4ECB> <4ECB> <CBBF>
+<4ECD> <4ECD> <EDA4>
+<4ED4> <4ED4> <EDA8>
+<4ED5> <4ED5> <DEC2>
+<4ED6> <4ED6> <F6E2>
+<4ED7> <4ED7> <EDDC>
+<4ED8> <4ED8> <DCF5>
+<4ED9> <4ED9> <E0B9>
+<4EDD> <4EDD> <D4CE>
+<4EDF> <4EDF> <F4B5>
+<4EE3> <4EE3> <D3DB>
+<4EE4> <4EE4> <D6B5>
+<4EE5> <4EE5> <ECA4>
+<4EF0> <4EF0> <E4E6>
+<4EF2> <4EF2> <F1EA>
+<4EF6> <4EF6> <CBEC>
+<4EF7> <4EF7> <CBC0>
+<4EFB> <4EFB> <ECF2>
+<4F01> <4F01> <D0EA>
+<4F09> <4F09> <F9F2>
+<4F0A> <4F0A> <ECA5>
+<4F0B> <4F0B> <D0DF>
+<4F0D> <4F0D> <E7EA>
+<4F0E> <4F0E> <D0EB>
+<4F0F> <4F0F> <DCD1>
+endbfrange
+
+100 beginbfrange
+<4F10> <4F10> <DBE9>
+<4F11> <4F11> <FDCC>
+<4F2F> <4F2F> <DBD7>
+<4F34> <4F34> <DAE1>
+<4F36> <4F36> <D6B6>
+<4F38> <4F38> <E3DF>
+<4F3A> <4F3A> <DEC3>
+<4F3C> <4F3C> <DEC4>
+<4F3D> <4F3D> <CAA1>
+<4F43> <4F43> <EEEC>
+<4F46> <4F46> <D3A3>
+<4F47> <4F47> <EEB7>
+<4F48> <4F48> <F8CF>
+<4F4D> <4F4D> <EAC8>
+<4F4E> <4F4E> <EEB8>
+<4F4F> <4F4F> <F1AC>
+<4F50> <4F50> <F1A5>
+<4F51> <4F51> <E9CE>
+<4F55> <4F55> <F9BC>
+<4F59> <4F59> <E5F9>
+<4F5A> <4F5A> <ECEA>
+<4F5B> <4F5B> <DDD6>
+<4F5C> <4F5C> <EDC2>
+<4F69> <4F69> <F8A5>
+<4F6F> <4F6F> <E5BA>
+<4F70> <4F70> <DBD8>
+<4F73> <4F73> <CAA2>
+<4F76> <4F76> <D1CD>
+<4F7A> <4F7A> <EEED>
+<4F7E> <4F7E> <ECEB>
+<4F7F> <4F7F> <DEC5>
+<4F81> <4F81> <E3E0>
+<4F83> <4F83> <CAC9>
+<4F84> <4F84> <F2E9>
+<4F86> <4F86> <D5CE>
+<4F88> <4F88> <F6B6>
+<4F8A> <4F8A> <CEC2>
+<4F8B> <4F8B> <D6C7>
+<4F8D> <4F8D> <E3B4>
+<4F8F> <4F8F> <F1AD>
+<4F91> <4F91> <EAE2>
+<4F96> <4F96> <D7C2>
+<4F98> <4F98> <F3A7>
+<4F9B> <4F9B> <CDEA>
+<4F9D> <4F9D> <EBEE>
+<4FAE> <4FAE> <D9B2>
+<4FAF> <4FAF> <FDA5>
+<4FB5> <4FB5> <F6D5>
+<4FB6> <4FB6> <D5E2>
+<4FBF> <4FBF> <F8B5>
+<4FC2> <4FC2> <CCF5>
+<4FC3> <4FC3> <F5B5>
+<4FC4> <4FC4> <E4AD>
+<4FC9> <4FC9> <E7EB>
+<4FCA> <4FCA> <F1D5>
+<4FCE> <4FCE> <F0BB>
+<4FD1> <4FD1> <E9B5>
+<4FD3> <4FD3> <CCC9>
+<4FD4> <4FD4> <FAD5>
+<4FD7> <4FD7> <E1D4>
+<4FDA> <4FDA> <D7D6>
+<4FDD> <4FDD> <DCC1>
+<4FDF> <4FDF> <DEC6>
+<4FE0> <4FE0> <FAEF>
+<4FE1> <4FE1> <E3E1>
+<4FEE> <4FEE> <E1F3>
+<4FEF> <4FEF> <DCF6>
+<4FF1> <4FF1> <CEFC>
+<4FF3> <4FF3> <DBC4>
+<4FF5> <4FF5> <F8F1>
+<4FF8> <4FF8> <DCE4>
+<4FFA> <4FFA> <E5EF>
+<5002> <5002> <DCB1>
+<5006> <5006> <D5D6>
+<5009> <5009> <F3DA>
+<500B> <500B> <CBC1>
+<500D> <500D> <DBC3>
+<5011> <5011> <D9FA>
+<5012> <5012> <D3EE>
+<5016> <5016> <FAB8>
+<5019> <5019> <FDA6>
+<501A> <501A> <EBEF>
+<501C> <501C> <F4A6>
+<501E> <501E> <CCCA>
+<501F> <501F> <F3A8>
+<5021> <5021> <F3DB>
+<5023> <5023> <DBA7>
+<5024> <5024> <F6B7>
+<5026> <5026> <CFE6>
+<5027> <5027> <F0F2>
+<5028> <5028> <CBDA>
+<502A> <502A> <E7D2>
+<502B> <502B> <D7C3>
+<502C> <502C> <F6F0>
+<502D> <502D> <E8DE>
+<503B> <503B> <E5A6>
+<5043> <5043> <E5E7>
+<5047> <5047> <CAA3>
+<5048> <5048> <CCA7>
+<5049> <5049> <EAC9>
+endbfrange
+
+100 beginbfrange
+<504F> <504F> <F8B6>
+<5055> <5055> <FAA5>
+<505A> <505A> <F1AE>
+<505C> <505C> <EFCE>
+<5065> <5065> <CBED>
+<5074> <5074> <F6B0>
+<5075> <5075> <EFCF>
+<5076> <5076> <E9CF>
+<5078> <5078> <F7DE>
+<5080> <5080> <CED3>
+<5085> <5085> <DCF7>
+<508D> <508D> <DBA8>
+<5091> <5091> <CBF8>
+<5098> <5098> <DFA1>
+<5099> <5099> <DDE1>
+<50AC> <50AC> <F5CA>
+<50AD> <50AD> <E9B6>
+<50B2> <50B2> <E7EC>
+<50B3> <50B3> <EEEE>
+<50B5> <50B5> <F3F0>
+<50B7> <50B7> <DFBF>
+<50BE> <50BE> <CCCB>
+<50C5> <50C5> <D0C1>
+<50C9> <50C9> <F4D2>
+<50CA> <50CA> <E0BA>
+<50CF> <50CF> <DFC0>
+<50D1> <50D1> <CEE0>
+<50D5> <50D5> <DCD2>
+<50D6> <50D6> <FDEA>
+<50DA> <50DA> <D6F6>
+<50DE> <50DE> <EACA>
+<50E5> <50E5> <E8E9>
+<50E7> <50E7> <E3AC>
+<50ED> <50ED> <F3D0>
+<50F9> <50F9> <CAA4>
+<50FB> <50FB> <DBF8>
+<50FF> <50FF> <DEC7>
+<5100> <5100> <EBF0>
+<5101> <5101> <F1D6>
+<5104> <5104> <E5E2>
+<5106> <5106> <CCCC>
+<5109> <5109> <CBFB>
+<5112> <5112> <EAE3>
+<511F> <511F> <DFC1>
+<5121> <5121> <D6ED>
+<512A> <512A> <E9D0>
+<5132> <5132> <EEB9>
+<5137> <5137> <D5E3>
+<513A> <513A> <D1D3>
+<513C> <513C> <E5F0>
+<5140> <5140> <E8B4>
+<5141> <5141> <EBC3>
+<5143> <5143> <EAAA>
+<5144> <5144> <FAFC>
+<5145> <5145> <F5F6>
+<5146> <5146> <F0BC>
+<5147> <5147> <FDD4>
+<5148> <5148> <E0BB>
+<5149> <5149> <CEC3>
+<514B> <514B> <D0BA>
+<514C> <514C> <F7BA>
+<514D> <514D> <D8F3>
+<514E> <514E> <F7CD>
+<5152> <5152> <E4AE>
+<515C> <515C> <D4DF>
+<5162> <5162> <D0E7>
+<5165> <5165> <ECFD>
+<5167> <5167> <D2AE>
+<5168> <5168> <EEEF>
+<5169> <5169> <D5D7>
+<516A> <516A> <EAE4>
+<516B> <516B> <F8A2>
+<516C> <516C> <CDEB>
+<516D> <516D> <D7BF>
+<516E> <516E> <FBB1>
+<5171> <5171> <CDEC>
+<5175> <5175> <DCB2>
+<5176> <5176> <D0EC>
+<5177> <5177> <CEFD>
+<5178> <5178> <EEF0>
+<517C> <517C> <CCC2>
+<5180> <5180> <D0ED>
+<5186> <5186> <E5F7>
+<518A> <518A> <F3FC>
+<518D> <518D> <EEA2>
+<5192> <5192> <D9B3>
+<5195> <5195> <D8F4>
+<5197> <5197> <E9B7>
+<51A0> <51A0> <CEAE>
+<51A5> <51A5> <D9A2>
+<51AA> <51AA> <D8F1>
+<51AC> <51AC> <D4CF>
+<51B6> <51B6> <E5A7>
+<51B7> <51B7> <D5D2>
+<51BD> <51BD> <D6A9>
+<51C4> <51C4> <F4A2>
+<51C6> <51C6> <F1D7>
+<51C9> <51C9> <D5D8>
+<51CB> <51CB> <F0BD>
+<51CC> <51CC> <D7D0>
+endbfrange
+
+100 beginbfrange
+<51CD> <51CD> <D4D0>
+<51DC> <51DC> <D7CF>
+<51DD> <51DD> <EBEA>
+<51DE> <51DE> <FDEB>
+<51E1> <51E1> <DBED>
+<51F0> <51F0> <FCC5>
+<51F1> <51F1> <CBC2>
+<51F6> <51F6> <FDD5>
+<51F8> <51F8> <F4C8>
+<51F9> <51F9> <E8EA>
+<51FA> <51FA> <F5F3>
+<51FD> <51FD> <F9DE>
+<5200> <5200> <D3EF>
+<5203> <5203> <ECD3>
+<5206> <5206> <DDC2>
+<5207> <5207> <EFB7>
+<5208> <5208> <E7D4>
+<520A> <520A> <CACA>
+<520E> <520E> <D9FB>
+<5211> <5211> <FAFD>
+<5217> <5217> <D6AA>
+<521D> <521D> <F4F8>
+<5224> <5224> <F7F7>
+<5225> <5225> <DCAC>
+<5229> <5229> <D7D7>
+<522A> <522A> <DFA2>
+<522E> <522E> <CEBE>
+<5230> <5230> <D3F0>
+<5236> <5236> <F0A4>
+<5237> <5237> <E1EC>
+<5238> <5238> <CFE7>
+<5239> <5239> <F3CB>
+<523A> <523A> <EDA9>
+<523B> <523B> <CABE>
+<5243> <5243> <F4EF>
+<5247> <5247> <F6CE>
+<524A> <524A> <DEFB>
+<524B> <524B> <D0BB>
+<524C> <524C> <D5B7>
+<524D> <524D> <EEF1>
+<5254> <5254> <F4A8>
+<5256> <5256> <DCF8>
+<525B> <525B> <CBA7>
+<525D> <525D> <DACE>
+<5261> <5261> <E0E6>
+<5269> <5269> <EDA5>
+<526A> <526A> <EEF2>
+<526F> <526F> <DCF9>
+<5272> <5272> <F9DC>
+<5275> <5275> <F3DC>
+<527D> <527D> <F8F2>
+<527F> <527F> <F4F9>
+<5283> <5283> <FCF1>
+<5287> <5287> <D0BC>
+<5288> <5288> <DBF9>
+<5289> <5289> <D7B1>
+<528D> <528D> <CBFC>
+<5291> <5291> <F0A5>
+<5292> <5292> <CBFD>
+<529B> <529B> <D5F4>
+<529F> <529F> <CDED>
+<52A0> <52A0> <CAA5>
+<52A3> <52A3> <D6AB>
+<52A4> <52A4> <D0C2>
+<52A9> <52A9> <F0BE>
+<52AA> <52AA> <D2BD>
+<52AB> <52AB> <CCA4>
+<52BE> <52BE> <FAB6>
+<52C1> <52C1> <CCCD>
+<52C3> <52C3> <DAFA>
+<52C5> <52C5> <F6CF>
+<52C7> <52C7> <E9B8>
+<52C9> <52C9> <D8F5>
+<52CD> <52CD> <CCCE>
+<52D2> <52D2> <D7CD>
+<52D5> <52D5> <D4D1>
+<52D6> <52D6> <E9ED>
+<52D8> <52D8> <CAEB>
+<52D9> <52D9> <D9E2>
+<52DB> <52DB> <FDB2>
+<52DD> <52DD> <E3AD>
+<52DE> <52DE> <D6CC>
+<52DF> <52DF> <D9B4>
+<52E2> <52E2> <E1A7>
+<52E3> <52E3> <EED3>
+<52E4> <52E4> <D0C3>
+<52F3> <52F3> <FDB3>
+<52F5> <52F5> <D5E4>
+<52F8> <52F8> <CFE8>
+<52FA> <52FA> <EDC3>
+<52FB> <52FB> <D0B2>
+<52FE> <52FE> <CEFE>
+<52FF> <52FF> <DAA8>
+<5305> <5305> <F8D0>
+<5308> <5308> <FDD6>
+<530D> <530D> <F8D1>
+<530F> <530F> <F8D2>
+<5310> <5310> <DCD3>
+<5315> <5315> <DDE2>
+<5316> <5316> <FBF9>
+endbfrange
+
+100 beginbfrange
+<5317> <5317> <DDC1>
+<5319> <5319> <E3B5>
+<5320> <5320> <EDDD>
+<5321> <5321> <CEC4>
+<5323> <5323> <CBA1>
+<532A> <532A> <DDE3>
+<532F> <532F> <FCDD>
+<5339> <5339> <F9AF>
+<533F> <533F> <D2FB>
+<5340> <5340> <CFA1>
+<5341> <5341> <E4A8>
+<5343> <5343> <F4B6>
+<5344> <5344> <ECFE>
+<5347> <5347> <E3AE>
+<5348> <5348> <E7ED>
+<5349> <5349> <FDC1>
+<534A> <534A> <DAE2>
+<534D> <534D> <D8B3>
+<5351> <5351> <DDE4>
+<5352> <5352> <F0EF>
+<5353> <5353> <F6F1>
+<5354> <5354> <FAF0>
+<5357> <5357> <D1F5>
+<535A> <535A> <DACF>
+<535C> <535C> <DCD4>
+<535E> <535E> <DCA6>
+<5360> <5360> <EFBF>
+<5366> <5366> <CECF>
+<5368> <5368> <E0D9>
+<536F> <536F> <D9D6>
+<5370> <5370> <ECD4>
+<5371> <5371> <EACB>
+<5374> <5374> <CABF>
+<5375> <5375> <D5B0>
+<5377> <5377> <CFE9>
+<537D> <537D> <F1ED>
+<537F> <537F> <CCCF>
+<5384> <5384> <E4F8>
+<5393> <5393> <E4ED>
+<5398> <5398> <D7D8>
+<539A> <539A> <FDA7>
+<539F> <539F> <EAAB>
+<53A0> <53A0> <F6B2>
+<53A5> <53A5> <CFF0>
+<53A6> <53A6> <F9BD>
+<53AD> <53AD> <E6F4>
+<53BB> <53BB> <CBDB>
+<53C3> <53C3> <F3D1>
+<53C8> <53C8> <E9D1>
+<53C9> <53C9> <F3A9>
+<53CA> <53CA> <D0E0>
+<53CB> <53CB> <E9D2>
+<53CD> <53CD> <DAE3>
+<53D4> <53D4> <E2D2>
+<53D6> <53D6> <F6A2>
+<53D7> <53D7> <E1F4>
+<53DB> <53DB> <DAE4>
+<53E1> <53E1> <E7D5>
+<53E2> <53E2> <F5BF>
+<53E3> <53E3> <CFA2>
+<53E4> <53E4> <CDAF>
+<53E5> <53E5> <CFA3>
+<53E9> <53E9> <CDB0>
+<53EA> <53EA> <F1FE>
+<53EB> <53EB> <D0A3>
+<53EC> <53EC> <E1AF>
+<53ED> <53ED> <F8A3>
+<53EF> <53EF> <CAA6>
+<53F0> <53F0> <F7BB>
+<53F1> <53F1> <F2EA>
+<53F2> <53F2> <DEC8>
+<53F3> <53F3> <E9D3>
+<53F8> <53F8> <DEC9>
+<5403> <5403> <FDDE>
+<5404> <5404> <CAC0>
+<5408> <5408> <F9EA>
+<5409> <5409> <D1CE>
+<540A> <540A> <EED4>
+<540C> <540C> <D4D2>
+<540D> <540D> <D9A3>
+<540E> <540E> <FDA8>
+<540F> <540F> <D7D9>
+<5410> <5410> <F7CE>
+<5411> <5411> <FABE>
+<541B> <541B> <CFD6>
+<541D> <541D> <D7F0>
+<541F> <541F> <EBE1>
+<5420> <5420> <F8C5>
+<5426> <5426> <DCFA>
+<5429> <5429> <DDC3>
+<542B> <542B> <F9DF>
+<5433> <5433> <E7EF>
+<5438> <5438> <FDE5>
+<5439> <5439> <F6A3>
+<543B> <543B> <D9FC>
+<543C> <543C> <FDA9>
+<543E> <543E> <E7EE>
+<5442> <5442> <D5E5>
+<5448> <5448> <EFD0>
+<544A> <544A> <CDB1>
+endbfrange
+
+100 beginbfrange
+<5451> <5451> <F7A2>
+<5468> <5468> <F1B2>
+<546A> <546A> <F1B1>
+<5471> <5471> <CDB2>
+<5473> <5473> <DAAB>
+<5475> <5475> <CAA7>
+<547B> <547B> <E3E2>
+<547C> <547C> <FBBC>
+<547D> <547D> <D9A4>
+<5480> <5480> <EEBA>
+<5486> <5486> <F8D3>
+<548C> <548C> <FBFA>
+<548E> <548E> <CFA4>
+<5490> <5490> <DCFB>
+<54A4> <54A4> <F6E3>
+<54A8> <54A8> <EDAA>
+<54AB> <54AB> <F2A1>
+<54AC> <54AC> <CEE1>
+<54B3> <54B3> <FAA6>
+<54B8> <54B8> <F9E0>
+<54BD> <54BD> <ECD6>
+<54C0> <54C0> <E4EE>
+<54C1> <54C1> <F9A1>
+<54C4> <54C4> <FBEF>
+<54C8> <54C8> <F9EB>
+<54C9> <54C9> <EEA3>
+<54E1> <54E1> <EAAC>
+<54E5> <54E5> <CAA8>
+<54E8> <54E8> <F4FA>
+<54ED> <54ED> <CDD6>
+<54EE> <54EE> <FCF6>
+<54F2> <54F2> <F4C9>
+<54FA> <54FA> <F8D4>
+<5504> <5504> <F8A6>
+<5506> <5506> <DECA>
+<5507> <5507> <F2C6>
+<550E> <550E> <D7DA>
+<5510> <5510> <D3D0>
+<551C> <551C> <D8C5>
+<552F> <552F> <EAE6>
+<5531> <5531> <F3DD>
+<5535> <5535> <E4DA>
+<553E> <553E> <F6E4>
+<5544> <5544> <F6F2>
+<5546> <5546> <DFC2>
+<554F> <554F> <D9FD>
+<5553> <5553> <CCF6>
+<5556> <5556> <D3BA>
+<555E> <555E> <E4AF>
+<5563> <5563> <F9E1>
+<557C> <557C> <F0A6>
+<5580> <5580> <CBD3>
+<5584> <5584> <E0BC>
+<5586> <5586> <F4CA>
+<5587> <5587> <D4FA>
+<5589> <5589> <FDAA>
+<558A> <558A> <F9E2>
+<5598> <5598> <F4B7>
+<5599> <5599> <FDC2>
+<559A> <559A> <FCB0>
+<559C> <559C> <FDEC>
+<559D> <559D> <CAE2>
+<55A7> <55A7> <FDBD>
+<55A9> <55A9> <EAE7>
+<55AA> <55AA> <DFC3>
+<55AB> <55AB> <D1D2>
+<55AC> <55AC> <CEE2>
+<55AE> <55AE> <D3A4>
+<55C5> <55C5> <FDAB>
+<55C7> <55C7> <DFE0>
+<55D4> <55D4> <F2C7>
+<55DA> <55DA> <E7F0>
+<55DC> <55DC> <D0EE>
+<55DF> <55DF> <F3AA>
+<55E3> <55E3> <DECB>
+<55E4> <55E4> <F6B8>
+<55FD> <55FD> <E1F5>
+<55FE> <55FE> <F1B3>
+<5606> <5606> <F7A3>
+<5609> <5609> <CAA9>
+<5614> <5614> <CFA5>
+<5617> <5617> <DFC4>
+<562F> <562F> <E1B0>
+<5632> <5632> <F0BF>
+<5634> <5634> <F6A4>
+<5636> <5636> <E3B6>
+<5653> <5653> <FAC6>
+<5668> <5668> <D0EF>
+<566B> <566B> <FDED>
+<5674> <5674> <DDC4>
+<5686> <5686> <FCF7>
+<56A5> <56A5> <E6BF>
+<56AC> <56AC> <DEAD>
+<56AE> <56AE> <FABF>
+<56B4> <56B4> <E5F1>
+<56BC> <56BC> <EDC4>
+<56CA> <56CA> <D2A5>
+<56CD> <56CD> <FDEE>
+<56D1> <56D1> <F5B6>
+<56DA> <56DA> <E1F6>
+endbfrange
+
+100 beginbfrange
+<56DB> <56DB> <DECC>
+<56DE> <56DE> <FCDE>
+<56E0> <56E0> <ECD7>
+<56F0> <56F0> <CDDD>
+<56F9> <56F9> <D6B7>
+<56FA> <56FA> <CDB3>
+<5703> <5703> <F8D5>
+<5704> <5704> <E5D8>
+<5708> <5708> <CFEA>
+<570B> <570B> <CFD0>
+<570D> <570D> <EACC>
+<5712> <5712> <EAAE>
+<5713> <5713> <EAAD>
+<5716> <5716> <D3F1>
+<5718> <5718> <D3A5>
+<571F> <571F> <F7CF>
+<5728> <5728> <EEA4>
+<572D> <572D> <D0A4>
+<5730> <5730> <F2A2>
+<573B> <573B> <D0F0>
+<5740> <5740> <F2A3>
+<5742> <5742> <F7F8>
+<5747> <5747> <D0B3>
+<574A> <574A> <DBA9>
+<574D> <574D> <D3BB>
+<574E> <574E> <CAEC>
+<5750> <5750> <F1A6>
+<5751> <5751> <CBD5>
+<5761> <5761> <F7E7>
+<5764> <5764> <CDDE>
+<5766> <5766> <F7A4>
+<576A> <576A> <F8C0>
+<576E> <576E> <D3DD>
+<5770> <5770> <CCD0>
+<5775> <5775> <CFA6>
+<577C> <577C> <F6F3>
+<5782> <5782> <E1F7>
+<5788> <5788> <D3DC>
+<578B> <578B> <FAFE>
+<5793> <5793> <FAA7>
+<57A0> <57A0> <EBD9>
+<57A2> <57A2> <CFA7>
+<57A3> <57A3> <EAAF>
+<57C3> <57C3> <E4EF>
+<57C7> <57C7> <E9B9>
+<57C8> <57C8> <F1D8>
+<57CB> <57CB> <D8D8>
+<57CE> <57CE> <E0F2>
+<57DF> <57DF> <E6B4>
+<57E0> <57E0> <DCFC>
+<57F0> <57F0> <F3F1>
+<57F4> <57F4> <E3D0>
+<57F7> <57F7> <F2FB>
+<57F9> <57F9> <DBC6>
+<57FA> <57FA> <D0F1>
+<57FC> <57FC> <D0F2>
+<5800> <5800> <CFDC>
+<5802> <5802> <D3D1>
+<5805> <5805> <CCB1>
+<5806> <5806> <F7D8>
+<5808> <5808> <CBA8>
+<5809> <5809> <EBBC>
+<580A> <580A> <E4BE>
+<581E> <581E> <F4DC>
+<5821> <5821> <DCC2>
+<5824> <5824> <F0A7>
+<5827> <5827> <E6C0>
+<582A> <582A> <CAED>
+<582F> <582F> <E8EB>
+<5830> <5830> <E5E8>
+<5831> <5831> <DCC3>
+<5834> <5834> <EDDE>
+<5835> <5835> <D3F2>
+<583A> <583A> <CCF7>
+<584A> <584A> <CED4>
+<584B> <584B> <E7AB>
+<584F> <584F> <CBC3>
+<5851> <5851> <E1B1>
+<5854> <5854> <F7B2>
+<5857> <5857> <D3F3>
+<5858> <5858> <D3D2>
+<585A> <585A> <F5C0>
+<585E> <585E> <DFDD>
+<5861> <5861> <EEF3>
+<5862> <5862> <E7F1>
+<5864> <5864> <FDB4>
+<5875> <5875> <F2C8>
+<5879> <5879> <F3D2>
+<587C> <587C> <EEF4>
+<587E> <587E> <E2D3>
+<5883> <5883> <CCD1>
+<5885> <5885> <DFEA>
+<5889> <5889> <E9BA>
+<5893> <5893> <D9D7>
+<589C> <589C> <F5CD>
+<589E> <589E> <F1F2>
+<589F> <589F> <FAC7>
+<58A8> <58A8> <D9F8>
+<58A9> <58A9> <D4C2>
+<58AE> <58AE> <F6E5>
+endbfrange
+
+100 beginbfrange
+<58B3> <58B3> <DDC5>
+<58BA> <58BA> <E7F2>
+<58BB> <58BB> <EDDF>
+<58BE> <58BE> <CACB>
+<58C1> <58C1> <DBFA>
+<58C5> <58C5> <E8B5>
+<58C7> <58C7> <D3A6>
+<58CE> <58CE> <FDB5>
+<58D1> <58D1> <F9C9>
+<58D3> <58D3> <E4E2>
+<58D5> <58D5> <FBBD>
+<58D8> <58D8> <D7A4>
+<58D9> <58D9> <CEC5>
+<58DE> <58DE> <CED5>
+<58DF> <58DF> <D6E6>
+<58E4> <58E4> <E5BD>
+<58EB> <58EB> <DECD>
+<58EC> <58EC> <ECF3>
+<58EF> <58EF> <EDE0>
+<58F9> <58F9> <ECEC>
+<58FA> <58FA> <FBBE>
+<58FB> <58FB> <DFEB>
+<58FD> <58FD> <E1F8>
+<590F> <590F> <F9BE>
+<5914> <5914> <D0F3>
+<5915> <5915> <E0AA>
+<5916> <5916> <E8E2>
+<5919> <5919> <E2D4>
+<591A> <591A> <D2FD>
+<591C> <591C> <E5A8>
+<5922> <5922> <D9D3>
+<5927> <5927> <D3DE>
+<5929> <5929> <F4B8>
+<592A> <592A> <F7BC>
+<592B> <592B> <DCFD>
+<592D> <592D> <E8EC>
+<592E> <592E> <E4E7>
+<5931> <5931> <E3F7>
+<5937> <5937> <ECA8>
+<593E> <593E> <FAF1>
+<5944> <5944> <E5F2>
+<5947> <5947> <D0F4>
+<5948> <5948> <D2AF>
+<5949> <5949> <DCE5>
+<594E> <594E> <D0A5>
+<594F> <594F> <F1B4>
+<5950> <5950> <FCB1>
+<5951> <5951> <CCF8>
+<5954> <5954> <DDC6>
+<5955> <5955> <FAD1>
+<5957> <5957> <F7DF>
+<595A> <595A> <FAA8>
+<5960> <5960> <EEF5>
+<5962> <5962> <DECE>
+<5967> <5967> <E7F3>
+<596A> <596A> <F7AC>
+<596B> <596B> <EBC4>
+<596C> <596C> <EDE1>
+<596D> <596D> <E0AB>
+<596E> <596E> <DDC7>
+<5973> <5973> <D2B3>
+<5974> <5974> <D2BF>
+<5978> <5978> <CACC>
+<597D> <597D> <FBBF>
+<5982> <5982> <E5FD>
+<5983> <5983> <DDE5>
+<5984> <5984> <D8CD>
+<598A> <598A> <ECF4>
+<5993> <5993> <D0F5>
+<5996> <5996> <E8ED>
+<5997> <5997> <D0D2>
+<5999> <5999> <D9D8>
+<59A5> <59A5> <F6E6>
+<59A8> <59A8> <DBAA>
+<59AC> <59AC> <F7E0>
+<59B9> <59B9> <D8D9>
+<59BB> <59BB> <F4A3>
+<59BE> <59BE> <F4DD>
+<59C3> <59C3> <EFD1>
+<59C6> <59C6> <D9B5>
+<59C9> <59C9> <EDAB>
+<59CB> <59CB> <E3B7>
+<59D0> <59D0> <EEBB>
+<59D1> <59D1> <CDB4>
+<59D3> <59D3> <E0F3>
+<59D4> <59D4> <EACD>
+<59D9> <59D9> <ECF5>
+<59DA> <59DA> <E8EE>
+<59DC> <59DC> <CBA9>
+<59DD> <59DD> <F1AF>
+<59E6> <59E6> <CACD>
+<59E8> <59E8> <ECA9>
+<59EA> <59EA> <F2EB>
+<59EC> <59EC> <FDEF>
+<59EE> <59EE> <F9F3>
+<59F8> <59F8> <E6C1>
+<59FB> <59FB> <ECD8>
+<59FF> <59FF> <EDAC>
+<5A01> <5A01> <EACE>
+<5A03> <5A03> <E8DF>
+endbfrange
+
+100 beginbfrange
+<5A11> <5A11> <DECF>
+<5A18> <5A18> <D2A6>
+<5A1B> <5A1B> <E7F4>
+<5A1C> <5A1C> <D1D6>
+<5A1F> <5A1F> <E6C2>
+<5A20> <5A20> <E3E3>
+<5A25> <5A25> <E4B0>
+<5A29> <5A29> <D8B4>
+<5A36> <5A36> <F6A5>
+<5A3C> <5A3C> <F3DE>
+<5A41> <5A41> <D7A5>
+<5A46> <5A46> <F7E8>
+<5A49> <5A49> <E8C6>
+<5A5A> <5A5A> <FBE6>
+<5A62> <5A62> <DDE6>
+<5A66> <5A66> <DCFE>
+<5A92> <5A92> <D8DA>
+<5A9A> <5A9A> <DAAC>
+<5A9B> <5A9B> <EAB0>
+<5AA4> <5AA4> <E3B8>
+<5AC1> <5AC1> <CAAA>
+<5AC2> <5AC2> <E1F9>
+<5AC4> <5AC4> <EAB1>
+<5AC9> <5AC9> <F2EC>
+<5ACC> <5ACC> <FAEE>
+<5AE1> <5AE1> <EED5>
+<5AE6> <5AE6> <F9F4>
+<5AE9> <5AE9> <D2EC>
+<5B05> <5B05> <FBFB>
+<5B09> <5B09> <FDF0>
+<5B0B> <5B0B> <E0BD>
+<5B0C> <5B0C> <CEE3>
+<5B16> <5B16> <F8C6>
+<5B2A> <5B2A> <DEAE>
+<5B40> <5B40> <DFC5>
+<5B43> <5B43> <E5BE>
+<5B50> <5B50> <EDAD>
+<5B51> <5B51> <FAEA>
+<5B54> <5B54> <CDEE>
+<5B55> <5B55> <EDA6>
+<5B57> <5B57> <EDAE>
+<5B58> <5B58> <F0ED>
+<5B5A> <5B5A> <DDA1>
+<5B5C> <5B5C> <EDAF>
+<5B5D> <5B5D> <FCF8>
+<5B5F> <5B5F> <D8EB>
+<5B63> <5B63> <CCF9>
+<5B64> <5B64> <CDB5>
+<5B69> <5B69> <FAA9>
+<5B6B> <5B6B> <E1DD>
+<5B70> <5B70> <E2D5>
+<5B71> <5B71> <EDCF>
+<5B75> <5B75> <DDA2>
+<5B78> <5B78> <F9CA>
+<5B7A> <5B7A> <EAE8>
+<5B7C> <5B7C> <E5ED>
+<5B85> <5B85> <D3EB>
+<5B87> <5B87> <E9D4>
+<5B88> <5B88> <E1FA>
+<5B89> <5B89> <E4CC>
+<5B8B> <5B8B> <E1E4>
+<5B8C> <5B8C> <E8C7>
+<5B8F> <5B8F> <CEDB>
+<5B93> <5B93> <DCD5>
+<5B95> <5B95> <F7B5>
+<5B96> <5B96> <FCF3>
+<5B97> <5B97> <F0F3>
+<5B98> <5B98> <CEAF>
+<5B99> <5B99> <F1B5>
+<5B9A> <5B9A> <EFD2>
+<5B9B> <5B9B> <E8C8>
+<5B9C> <5B9C> <EBF1>
+<5BA2> <5BA2> <CBD4>
+<5BA3> <5BA3> <E0BE>
+<5BA4> <5BA4> <E3F8>
+<5BA5> <5BA5> <EAE9>
+<5BA6> <5BA6> <FCB2>
+<5BAC> <5BAC> <E0F4>
+<5BAE> <5BAE> <CFE0>
+<5BB0> <5BB0> <EEA5>
+<5BB3> <5BB3> <FAAA>
+<5BB4> <5BB4> <E6C3>
+<5BB5> <5BB5> <E1B2>
+<5BB6> <5BB6> <CAAB>
+<5BB8> <5BB8> <E3E4>
+<5BB9> <5BB9> <E9BB>
+<5BBF> <5BBF> <E2D6>
+<5BC0> <5BC0> <F3F2>
+<5BC2> <5BC2> <EED6>
+<5BC3> <5BC3> <EAB2>
+<5BC4> <5BC4> <D0F6>
+<5BC5> <5BC5> <ECD9>
+<5BC6> <5BC6> <DACB>
+<5BC7> <5BC7> <CFA8>
+<5BCC> <5BCC> <DDA3>
+<5BD0> <5BD0> <D8DB>
+<5BD2> <5BD2> <F9CE>
+<5BD3> <5BD3> <E9D5>
+<5BD4> <5BD4> <E3D1>
+<5BD7> <5BD7> <D2BC>
+endbfrange
+
+100 beginbfrange
+<5BDE> <5BDE> <D8AC>
+<5BDF> <5BDF> <F3CC>
+<5BE1> <5BE1> <CDFB>
+<5BE2> <5BE2> <F6D6>
+<5BE4> <5BE4> <E7F5>
+<5BE5> <5BE5> <E8EF>
+<5BE6> <5BE6> <E3F9>
+<5BE7> <5BE7> <D2BB>
+<5BE8> <5BE8> <F3F3>
+<5BE9> <5BE9> <E3FB>
+<5BEB> <5BEB> <DED0>
+<5BEC> <5BEC> <CEB0>
+<5BEE> <5BEE> <D6F7>
+<5BEF> <5BEF> <F1D9>
+<5BF5> <5BF5> <F5C1>
+<5BF6> <5BF6> <DCC4>
+<5BF8> <5BF8> <F5BB>
+<5BFA> <5BFA> <DED1>
+<5C01> <5C01> <DCE6>
+<5C04> <5C04> <DED2>
+<5C07> <5C07> <EDE2>
+<5C08> <5C08> <EEF6>
+<5C09> <5C09> <EACF>
+<5C0A> <5C0A> <F0EE>
+<5C0B> <5C0B> <E3FC>
+<5C0D> <5C0D> <D3DF>
+<5C0E> <5C0E> <D3F4>
+<5C0F> <5C0F> <E1B3>
+<5C11> <5C11> <E1B4>
+<5C16> <5C16> <F4D3>
+<5C19> <5C19> <DFC6>
+<5C24> <5C24> <E9D6>
+<5C28> <5C28> <DBAB>
+<5C31> <5C31> <F6A6>
+<5C38> <5C38> <E3B9>
+<5C39> <5C39> <EBC5>
+<5C3A> <5C3A> <F4A9>
+<5C3B> <5C3B> <CDB6>
+<5C3C> <5C3C> <D2F9>
+<5C3E> <5C3E> <DAAD>
+<5C3F> <5C3F> <D2E3>
+<5C40> <5C40> <CFD1>
+<5C45> <5C45> <CBDC>
+<5C46> <5C46> <CCFA>
+<5C48> <5C48> <CFDD>
+<5C4B> <5C4B> <E8A9>
+<5C4D> <5C4D> <E3BB>
+<5C4E> <5C4E> <E3BA>
+<5C51> <5C51> <E0DA>
+<5C55> <5C55> <EEF7>
+<5C5B> <5C5B> <DCB3>
+<5C60> <5C60> <D3F5>
+<5C62> <5C62> <D7A6>
+<5C64> <5C64> <F6B5>
+<5C65> <5C65> <D7DB>
+<5C6C> <5C6C> <E1D5>
+<5C6F> <5C6F> <D4EA>
+<5C71> <5C71> <DFA3>
+<5C79> <5C79> <FDDF>
+<5C90> <5C90> <D0F7>
+<5C91> <5C91> <EDD4>
+<5CA1> <5CA1> <CBAA>
+<5CA9> <5CA9> <E4DB>
+<5CAB> <5CAB> <E1FB>
+<5CAC> <5CAC> <CBA2>
+<5CB1> <5CB1> <D3E0>
+<5CB3> <5CB3> <E4BF>
+<5CB5> <5CB5> <FBC0>
+<5CB7> <5CB7> <DABE>
+<5CB8> <5CB8> <E4CD>
+<5CBA> <5CBA> <D6B9>
+<5CBE> <5CBE> <EFC0>
+<5CC0> <5CC0> <E1FC>
+<5CD9> <5CD9> <F6B9>
+<5CE0> <5CE0> <DFC7>
+<5CE8> <5CE8> <E4B1>
+<5CEF> <5CF0> <DCE7>
+<5CF4> <5CF4> <FAD6>
+<5CF6> <5CF6> <D3F6>
+<5CFB> <5CFB> <F1DA>
+<5CFD> <5CFD> <FAF2>
+<5D07> <5D07> <E2FD>
+<5D0D> <5D0D> <D5CF>
+<5D0E> <5D0E> <D0F8>
+<5D11> <5D11> <CDDF>
+<5D14> <5D14> <F5CB>
+<5D16> <5D16> <E4F0>
+<5D17> <5D17> <CBAB>
+<5D19> <5D19> <D7C4>
+<5D27> <5D27> <E2FE>
+<5D29> <5D29> <DDDA>
+<5D4B> <5D4B> <DAAE>
+<5D4C> <5D4C> <CAEE>
+<5D50> <5D50> <D5B9>
+<5D69> <5D69> <E3A1>
+<5D6C> <5D6C> <E8E3>
+<5D6F> <5D6F> <F3AB>
+<5D87> <5D87> <CFA9>
+<5D8B> <5D8B> <D3F7>
+<5D9D> <5D9D> <D4F1>
+endbfrange
+
+100 beginbfrange
+<5DA0> <5DA0> <CEE4>
+<5DA2> <5DA2> <E8F2>
+<5DAA> <5DAA> <E5F5>
+<5DB8> <5DB8> <E7AE>
+<5DBA> <5DBA> <D6BA>
+<5DBC> <5DBC> <DFEC>
+<5DBD> <5DBD> <E4C0>
+<5DCD> <5DCD> <E8E4>
+<5DD2> <5DD2> <D8B5>
+<5DD6> <5DD6> <E4DC>
+<5DDD> <5DDD> <F4B9>
+<5DDE> <5DDE> <F1B6>
+<5DE1> <5DE1> <E2DE>
+<5DE2> <5DE2> <E1B5>
+<5DE5> <5DE5> <CDEF>
+<5DE6> <5DE6> <F1A7>
+<5DE7> <5DE7> <CEE5>
+<5DE8> <5DE8> <CBDD>
+<5DEB> <5DEB> <D9E3>
+<5DEE> <5DEE> <F3AC>
+<5DF1> <5DF1> <D0F9>
+<5DF2> <5DF2> <ECAB>
+<5DF3> <5DF3> <DED3>
+<5DF4> <5DF4> <F7E9>
+<5DF7> <5DF7> <F9F5>
+<5DFD> <5DFD> <E1DE>
+<5DFE> <5DFE> <CBEE>
+<5E02> <5E02> <E3BC>
+<5E03> <5E03> <F8D6>
+<5E06> <5E06> <DBEE>
+<5E0C> <5E0C> <FDF1>
+<5E11> <5E11> <F7B6>
+<5E16> <5E16> <F4DE>
+<5E19> <5E19> <F2ED>
+<5E1B> <5E1B> <DBD9>
+<5E1D> <5E1D> <F0A8>
+<5E25> <5E25> <E1FD>
+<5E2B> <5E2B> <DED4>
+<5E2D> <5E2D> <E0AC>
+<5E33> <5E33> <EDE3>
+<5E36> <5E36> <D3E1>
+<5E38> <5E38> <DFC8>
+<5E3D> <5E3D> <D9B6>
+<5E3F> <5E3F> <FDAC>
+<5E40> <5E40> <EFD3>
+<5E44> <5E44> <E4C1>
+<5E45> <5E45> <F8EB>
+<5E47> <5E47> <DBAC>
+<5E4C> <5E4C> <FCC6>
+<5E55> <5E55> <D8AD>
+<5E5F> <5E5F> <F6BA>
+<5E61> <5E61> <DBDF>
+<5E62> <5E62> <D3D3>
+<5E63> <5E63> <F8C7>
+<5E72> <5E72> <CACE>
+<5E73> <5E73> <F8C1>
+<5E74> <5E74> <D2B4>
+<5E77> <5E77> <DCB4>
+<5E78> <5E78> <FAB9>
+<5E79> <5E79> <CACF>
+<5E7B> <5E7B> <FCB3>
+<5E7C> <5E7D> <EAEA>
+<5E7E> <5E7E> <D0FA>
+<5E84> <5E84> <EDE4>
+<5E87> <5E87> <DDE7>
+<5E8A> <5E8A> <DFC9>
+<5E8F> <5E8F> <DFED>
+<5E95> <5E95> <EEBC>
+<5E97> <5E97> <EFC1>
+<5E9A> <5E9A> <CCD2>
+<5E9C> <5E9C> <DDA4>
+<5EA0> <5EA0> <DFCA>
+<5EA6> <5EA6> <D3F8>
+<5EA7> <5EA7> <F1A8>
+<5EAB> <5EAB> <CDB7>
+<5EAD> <5EAD> <EFD4>
+<5EB5> <5EB5> <E4DD>
+<5EB6> <5EB6> <DFEE>
+<5EB7> <5EB7> <CBAC>
+<5EB8> <5EB8> <E9BC>
+<5EBE> <5EBE> <EAEC>
+<5EC2> <5EC2> <DFCB>
+<5EC8> <5EC8> <F9BF>
+<5EC9> <5EC9> <D6AF>
+<5ECA> <5ECA> <D5C6>
+<5ED0> <5ED0> <CFAA>
+<5ED3> <5ED3> <CEA9>
+<5ED6> <5ED6> <D6F8>
+<5EDA> <5EDA> <F1B7>
+<5EDB> <5EDB> <EEF8>
+<5EDF> <5EDF> <D9D9>
+<5EE0> <5EE0> <F3DF>
+<5EE2> <5EE2> <F8C8>
+<5EE3> <5EE3> <CEC6>
+<5EEC> <5EEC> <D5E6>
+<5EF3> <5EF3> <F4E6>
+<5EF6> <5EF6> <E6C5>
+<5EF7> <5EF7> <EFD5>
+<5EFA> <5EFA> <CBEF>
+<5EFB> <5EFB> <FCDF>
+endbfrange
+
+100 beginbfrange
+<5F01> <5F01> <DCA7>
+<5F04> <5F04> <D6E7>
+<5F0A> <5F0A> <F8C9>
+<5F0F> <5F0F> <E3D2>
+<5F11> <5F11> <E3BD>
+<5F13> <5F13> <CFE1>
+<5F14> <5F14> <F0C0>
+<5F15> <5F15> <ECDA>
+<5F17> <5F17> <DDD7>
+<5F18> <5F18> <FBF0>
+<5F1B> <5F1B> <ECAC>
+<5F1F> <5F1F> <F0A9>
+<5F26> <5F26> <FAD7>
+<5F27> <5F27> <FBC1>
+<5F29> <5F29> <D2C0>
+<5F31> <5F31> <E5B0>
+<5F35> <5F35> <EDE5>
+<5F3A> <5F3A> <CBAD>
+<5F3C> <5F3C> <F9B0>
+<5F48> <5F48> <F7A5>
+<5F4A> <5F4A> <CBAE>
+<5F4C> <5F4C> <DAAF>
+<5F4E> <5F4E> <D8B6>
+<5F56> <5F56> <D3A7>
+<5F57> <5F57> <FBB2>
+<5F59> <5F59> <FDC4>
+<5F5B> <5F5B> <ECAD>
+<5F62> <5F62> <FBA1>
+<5F66> <5F66> <E5E9>
+<5F67> <5F67> <E9EE>
+<5F69> <5F69> <F3F4>
+<5F6A> <5F6A> <F8F3>
+<5F6B> <5F6B> <F0C1>
+<5F6C> <5F6C> <DEAF>
+<5F6D> <5F6D> <F8B0>
+<5F70> <5F70> <F3E0>
+<5F71> <5F71> <E7AF>
+<5F77> <5F77> <DBAD>
+<5F79> <5F79> <E6B5>
+<5F7C> <5F7C> <F9A8>
+<5F7F> <5F7F> <DDD8>
+<5F80> <5F80> <E8D9>
+<5F81> <5F81> <EFD6>
+<5F85> <5F85> <D3E2>
+<5F87> <5F87> <E2DF>
+<5F8A> <5F8A> <FCE0>
+<5F8B> <5F8B> <D7C8>
+<5F8C> <5F8C> <FDAD>
+<5F90> <5F90> <DFEF>
+<5F91> <5F91> <CCD3>
+<5F92> <5F92> <D3F9>
+<5F97> <5F97> <D4F0>
+<5F98> <5F98> <DBC7>
+<5F99> <5F99> <DED5>
+<5F9E> <5F9E> <F0F4>
+<5FA0> <5FA0> <D5D0>
+<5FA1> <5FA1> <E5D9>
+<5FA8> <5FA8> <FCC7>
+<5FA9> <5FA9> <DCD6>
+<5FAA> <5FAA> <E2E0>
+<5FAE> <5FAE> <DAB0>
+<5FB5> <5FB5> <F3A3>
+<5FB7> <5FB7> <D3EC>
+<5FB9> <5FB9> <F4CB>
+<5FBD> <5FBD> <FDC5>
+<5FC3> <5FC3> <E3FD>
+<5FC5> <5FC5> <F9B1>
+<5FCC> <5FCC> <D0FB>
+<5FCD> <5FCD> <ECDB>
+<5FD6> <5FD6> <F5BC>
+<5FD7> <5FD7> <F2A4>
+<5FD8> <5FD9> <D8CE>
+<5FE0> <5FE0> <F5F7>
+<5FEB> <5FEB> <F6E1>
+<5FF5> <5FF5> <D2B7>
+<5FFD> <5FFD> <FBEC>
+<5FFF> <5FFF> <DDC8>
+<600F> <600F> <E4E8>
+<6012> <6012> <D2C1>
+<6016> <6016> <F8D7>
+<601C> <601C> <D6BB>
+<601D> <601D> <DED6>
+<6020> <6020> <F7BD>
+<6021> <6021> <ECAE>
+<6025> <6025> <D0E1>
+<6027> <6027> <E0F5>
+<6028> <6028> <EAB3>
+<602A> <602A> <CED6>
+<602F> <602F> <CCA5>
+<6041> <6041> <ECF6>
+<6042> <6042> <E2E1>
+<6043> <6043> <E3BE>
+<604D> <604D> <FCC8>
+<6050> <6050> <CDF0>
+<6052> <6052> <F9F6>
+<6055> <6055> <DFF0>
+<6059> <6059> <E5BF>
+<605D> <605D> <CEBF>
+<6062> <6062> <FCE1>
+<6063> <6063> <EDB0>
+endbfrange
+
+100 beginbfrange
+<6064> <6064> <FDD1>
+<6065> <6065> <F6BB>
+<6068> <6068> <F9CF>
+<6069> <6069> <EBDA>
+<606A> <606A> <CAC1>
+<606C> <606C> <D2B8>
+<606D> <606D> <CDF1>
+<606F> <606F> <E3D3>
+<6070> <6070> <FDE6>
+<6085> <6085> <E6ED>
+<6089> <6089> <E3FA>
+<608C> <608C> <F0AA>
+<608D> <608D> <F9D0>
+<6094> <6094> <FCE2>
+<6096> <6096> <F8A7>
+<609A> <609A> <E1E5>
+<609B> <609B> <EEF9>
+<609F> <609F> <E7F6>
+<60A0> <60A0> <EAED>
+<60A3> <60A3> <FCB4>
+<60A4> <60A4> <F5C2>
+<60A7> <60A7> <D7DC>
+<60B0> <60B0> <F0F5>
+<60B2> <60B2> <DDE8>
+<60B3> <60B3> <D3ED>
+<60B4> <60B4> <F5FC>
+<60B6> <60B6> <DABF>
+<60B8> <60B8> <CCFB>
+<60BC> <60BC> <D3FA>
+<60BD> <60BD> <F4A4>
+<60C5> <60C5> <EFD7>
+<60C7> <60C7> <D4C3>
+<60D1> <60D1> <FBE3>
+<60DA> <60DA> <FBED>
+<60DC> <60DC> <E0AD>
+<60DF> <60DF> <EAEE>
+<60E0> <60E0> <FBB3>
+<60E1> <60E1> <E4C2>
+<60F0> <60F0> <F6E7>
+<60F1> <60F1> <D2DD>
+<60F3> <60F3> <DFCC>
+<60F6> <60F6> <FCC9>
+<60F9> <60F9> <E5A9>
+<60FA> <60FA> <E0F6>
+<60FB> <60FB> <F6B3>
+<6101> <6101> <E1FE>
+<6106> <6106> <CBF0>
+<6108> <6109> <EAEF>
+<610D> <610D> <DAC0>
+<610E> <610E> <F8B4>
+<610F> <610F> <EBF2>
+<6115> <6115> <E4C3>
+<611A> <611A> <E9D7>
+<611B> <611B> <E4F1>
+<611F> <611F> <CAEF>
+<6127> <6127> <CED7>
+<6130> <6130> <FCCA>
+<6134> <6134> <F3E1>
+<6137> <6137> <CBC4>
+<613C> <613C> <E3E5>
+<613E> <613E> <CBC5>
+<613F> <613F> <EAB4>
+<6142> <6142> <E9BD>
+<6144> <6144> <D7C9>
+<6147> <6147> <EBDB>
+<6148> <6148> <EDB1>
+<614A> <614A> <CCC3>
+<614B> <614B> <F7BE>
+<614C> <614C> <FCCB>
+<6153> <6153> <F8F4>
+<6155> <6155> <D9B7>
+<6158> <6159> <F3D3>
+<615D> <615D> <F7E4>
+<615F> <615F> <F7D1>
+<6162> <6162> <D8B7>
+<6163> <6163> <CEB1>
+<6164> <6164> <CAC2>
+<6167> <6167> <FBB4>
+<6168> <6168> <CBC6>
+<616B> <616B> <F0F6>
+<616E> <616E> <D5E7>
+<6170> <6170> <EAD0>
+<6176> <6176> <CCD4>
+<6177> <6177> <CBAF>
+<617D> <617D> <F4AA>
+<617E> <617E> <E9AF>
+<6181> <6181> <F5C3>
+<6182> <6182> <E9D8>
+<618A> <618A> <DDE9>
+<618E> <618E> <F1F3>
+<6190> <6190> <D5FB>
+<6191> <6191> <DEBB>
+<6194> <6194> <F4FB>
+<6198> <6198> <FDF3>
+<6199> <6199> <FDF2>
+<619A> <619A> <F7A6>
+<61A4> <61A4> <DDC9>
+<61A7> <61A7> <D4D3>
+<61A9> <61A9> <CCA8>
+<61AB> <61AB> <DAC1>
+endbfrange
+
+100 beginbfrange
+<61AC> <61AC> <CCD5>
+<61AE> <61AE> <D9E4>
+<61B2> <61B2> <FACA>
+<61B6> <61B6> <E5E3>
+<61BA> <61BA> <D3BC>
+<61BE> <61BE> <CAF0>
+<61C3> <61C3> <D0C4>
+<61C7> <61C7> <CAD0>
+<61C8> <61C8> <FAAB>
+<61C9> <61C9> <EBEB>
+<61CA> <61CA> <E7F8>
+<61CB> <61CB> <D9E5>
+<61E6> <61E6> <D1D7>
+<61F2> <61F2> <F3A4>
+<61F6> <61F6> <D4FB>
+<61F7> <61F7> <FCE3>
+<61F8> <61F8> <FAD8>
+<61FA> <61FA> <F3D5>
+<61FC> <61FC> <CFAB>
+<61FF> <61FF> <EBF3>
+<6200> <6200> <D5FC>
+<6207> <6207> <D3D4>
+<6208> <6208> <CDFC>
+<620A> <620A> <D9E6>
+<620C> <620C> <E2F9>
+<620D> <620D> <E2A1>
+<620E> <620E> <EBD4>
+<6210> <6210> <E0F7>
+<6211> <6211> <E4B2>
+<6212> <6212> <CCFC>
+<6216> <6216> <FBE4>
+<621A> <621A> <F4AB>
+<621F> <621F> <D0BD>
+<6221> <6221> <CAF1>
+<622A> <622A> <EFB8>
+<622E> <622E> <D7C0>
+<6230> <6230> <EEFA>
+<6231> <6231> <FDF4>
+<6234> <6234> <D3E3>
+<6236> <6236> <FBC2>
+<623E> <623E> <D5E8>
+<623F> <623F> <DBAE>
+<6240> <6240> <E1B6>
+<6241> <6241> <F8B7>
+<6247> <6247> <E0BF>
+<6248> <6248> <FBC3>
+<6249> <6249> <DDEA>
+<624B> <624B> <E2A2>
+<624D> <624D> <EEA6>
+<6253> <6253> <F6E8>
+<6258> <6258> <F6F5>
+<626E> <626E> <DDCA>
+<6271> <6271> <D0E2>
+<6276> <6276> <DDA6>
+<6279> <6279> <DDEB>
+<627C> <627C> <E4F9>
+<627F> <627F> <E3AF>
+<6280> <6280> <D0FC>
+<6284> <6284> <F4FC>
+<6289> <6289> <CCBC>
+<628A> <628A> <F7EA>
+<6291> <6291> <E5E4>
+<6292> <6292> <DFF1>
+<6295> <6295> <F7E1>
+<6297> <6297> <F9F7>
+<6298> <6298> <EFB9>
+<629B> <629B> <F8D8>
+<62AB> <62AB> <F9A9>
+<62B1> <62B1> <F8D9>
+<62B5> <62B5> <EEBD>
+<62B9> <62B9> <D8C6>
+<62BC> <62BC> <E4E3>
+<62BD> <62BD> <F5CE>
+<62C2> <62C2> <DDD9>
+<62C7> <62C7> <D9E7>
+<62C8> <62C8> <D2B9>
+<62C9> <62C9> <D5C3>
+<62CC> <62CC> <DAE5>
+<62CD> <62CD> <DAD0>
+<62CF> <62CF> <D1D9>
+<62D0> <62D0> <CED8>
+<62D2> <62D2> <CBDE>
+<62D3> <62D3> <F4AC>
+<62D4> <62D4> <DAFB>
+<62D6> <62D6> <F6E9>
+<62D7> <62D7> <E8F3>
+<62D8> <62D8> <CFAC>
+<62D9> <62D9> <F0F0>
+<62DB> <62DB> <F4FD>
+<62DC> <62DC> <DBC8>
+<62EC> <62EC> <CEC0>
+<62ED> <62ED> <E3D4>
+<62EE> <62EE> <D1CF>
+<62EF> <62EF> <F1F5>
+<62F1> <62F1> <CDF2>
+<62F3> <62F3> <CFEB>
+<62F7> <62F7> <CDB8>
+<62FE> <62FE> <E3A6>
+<62FF> <62FF> <D1DA>
+<6301> <6301> <F2A5>
+endbfrange
+
+100 beginbfrange
+<6307> <6307> <F2A6>
+<6309> <6309> <E4CE>
+<6311> <6311> <D3FB>
+<632B> <632B> <F1A9>
+<632F> <632F> <F2C9>
+<633A> <633A> <EFD8>
+<633B> <633B> <E6C9>
+<633D> <633D> <D8B8>
+<633E> <633E> <FAF3>
+<6349> <6349> <F3B5>
+<634C> <634C> <F8A4>
+<634F> <634F> <D1F3>
+<6350> <6350> <E6C8>
+<6355> <6355> <F8DA>
+<6367> <6367> <DCE9>
+<6368> <6368> <DED7>
+<636E> <636E> <CBDF>
+<6372> <6372> <CFEC>
+<6377> <6377> <F4DF>
+<637A> <637A> <D1F4>
+<637B> <637B> <D2BA>
+<637F> <637F> <DFF2>
+<6383> <6383> <E1B7>
+<6388> <6388> <E2A3>
+<6389> <6389> <D3FC>
+<638C> <638C> <EDE6>
+<6392> <6392> <DBC9>
+<6396> <6396> <E4FA>
+<6398> <6398> <CFDE>
+<639B> <639B> <CED0>
+<63A0> <63A0> <D5D3>
+<63A1> <63A1> <F3F5>
+<63A2> <63A2> <F7AE>
+<63A5> <63A5> <EFC8>
+<63A7> <63A7> <CDF3>
+<63A8> <63A8> <F5CF>
+<63A9> <63A9> <E5F3>
+<63AA> <63AA> <F0C2>
+<63C0> <63C0> <CAD1>
+<63C4> <63C4> <EAF1>
+<63C6> <63C6> <D0A6>
+<63CF> <63CF> <D9DA>
+<63D0> <63D0> <F0AB>
+<63D6> <63D6> <EBE7>
+<63DA> <63DA> <E5C0>
+<63DB> <63DB> <FCB5>
+<63E1> <63E1> <E4C4>
+<63ED> <63ED> <CCA9>
+<63EE> <63EE> <FDC6>
+<63F4> <63F4> <EAB5>
+<63F6> <63F6> <E5AA>
+<63F7> <63F7> <DFBA>
+<640D> <640D> <E1DF>
+<640F> <640F> <DAD1>
+<6414> <6414> <E1B8>
+<6416> <6416> <E8F4>
+<6417> <6417> <D3FD>
+<641C> <641C> <E2A4>
+<6422> <6422> <F2CA>
+<642C> <642C> <DAE6>
+<642D> <642D> <F7B3>
+<643A> <643A> <FDCD>
+<643E> <643E> <F3B6>
+<6458> <6458> <EED7>
+<6460> <6460> <F5C4>
+<6469> <6469> <D8A4>
+<646F> <646F> <F2A7>
+<6478> <6479> <D9B8>
+<647A> <647A> <EFC9>
+<6488> <6488> <D6CE>
+<6491> <6491> <F7CB>
+<6492> <6492> <DFAE>
+<6493> <6493> <E8F5>
+<649A> <649A> <D2B5>
+<649E> <649E> <D3D5>
+<64A4> <64A4> <F4CC>
+<64A5> <64A5> <DAFC>
+<64AB> <64AB> <D9E8>
+<64AD> <64AD> <F7EB>
+<64AE> <64AE> <F5C9>
+<64B0> <64B0> <F3BC>
+<64B2> <64B2> <DAD2>
+<64BB> <64BB> <D3B5>
+<64C1> <64C1> <E8B6>
+<64C4> <64C4> <D6CF>
+<64C5> <64C5> <F4BA>
+<64C7> <64C7> <F7C9>
+<64CA> <64CA> <CCAA>
+<64CD> <64CD> <F0C3>
+<64CE> <64CE> <CCD6>
+<64D2> <64D2> <D0D3>
+<64D4> <64D4> <D3BD>
+<64D8> <64D8> <DBFB>
+<64DA> <64DA> <CBE0>
+<64E1> <64E1> <D3E4>
+<64E2> <64E2> <F6F7>
+<64E5> <64E5> <D5BA>
+<64E6> <64E6> <F3CD>
+<64E7> <64E7> <CBE1>
+<64EC> <64EC> <EBF4>
+endbfrange
+
+100 beginbfrange
+<64F2> <64F2> <F4AD>
+<64F4> <64F4> <FCAA>
+<64FA> <64FA> <F7EC>
+<64FE> <64FE> <E8F6>
+<6500> <6500> <DAE7>
+<6504> <6504> <F7CC>
+<6518> <6518> <E5C1>
+<651D> <651D> <E0EE>
+<6523> <6523> <D5FD>
+<652A> <652A> <CEE6>
+<652B> <652B> <FCAB>
+<652C> <652C> <D5BB>
+<652F> <652F> <F2A8>
+<6536> <6536> <E2A5>
+<6537> <6537> <CDB9>
+<6538> <6538> <EAF2>
+<6539> <6539> <CBC7>
+<653B> <653B> <CDF4>
+<653E> <653E> <DBAF>
+<653F> <653F> <EFD9>
+<6545> <6545> <CDBA>
+<6548> <6548> <FCF9>
+<654D> <654D> <DFF3>
+<654E> <654E> <CEE7>
+<654F> <654F> <DAC2>
+<6551> <6551> <CFAD>
+<6556> <6556> <E7F9>
+<6557> <6557> <F8A8>
+<655E> <655E> <F3E2>
+<6562> <6562> <CAF2>
+<6563> <6563> <DFA4>
+<6566> <6566> <D4C4>
+<656C> <656C> <CCD7>
+<656D> <656D> <E5C2>
+<6572> <6572> <CDBB>
+<6574> <6574> <EFDA>
+<6575> <6575> <EED8>
+<6577> <6577> <DDA7>
+<6578> <6578> <E2A6>
+<657E> <657E> <E0C0>
+<6582> <6582> <D6B0>
+<6583> <6583> <F8CA>
+<6585> <6585> <FCFA>
+<6587> <6587> <D9FE>
+<658C> <658C> <DEB0>
+<6590> <6590> <DDEC>
+<6591> <6591> <DAE8>
+<6597> <6597> <D4E0>
+<6599> <6599> <D6F9>
+<659B> <659B> <CDD7>
+<659C> <659C> <DED8>
+<659F> <659F> <F2F8>
+<65A1> <65A1> <E4D6>
+<65A4> <65A4> <D0C5>
+<65A5> <65A5> <F4AE>
+<65A7> <65A7> <DDA8>
+<65AB> <65AB> <EDC5>
+<65AC> <65AC> <F3D6>
+<65AF> <65AF> <DED9>
+<65B0> <65B0> <E3E6>
+<65B7> <65B7> <D3A8>
+<65B9> <65B9> <DBB0>
+<65BC> <65BC> <E5DA>
+<65BD> <65BD> <E3BF>
+<65C1> <65C1> <DBB1>
+<65C5> <65C5> <D5E9>
+<65CB> <65CB> <E0C1>
+<65CC> <65CC> <EFDB>
+<65CF> <65CF> <F0E9>
+<65D2> <65D2> <D7B2>
+<65D7> <65D7> <D0FD>
+<65E0> <65E0> <D9E9>
+<65E3> <65E3> <D0FE>
+<65E5> <65E5> <ECED>
+<65E6> <65E6> <D3A9>
+<65E8> <65E8> <F2A9>
+<65E9> <65E9> <F0C4>
+<65EC> <65EC> <E2E2>
+<65ED> <65ED> <E9EF>
+<65F1> <65F1> <F9D1>
+<65F4> <65F4> <E9D9>
+<65FA> <65FA> <E8DA>
+<65FB> <65FC> <DAC3>
+<65FD> <65FD> <D4C5>
+<65FF> <65FF> <E7FA>
+<6606> <6606> <CDE0>
+<6607> <6607> <E3B0>
+<6609> <6609> <DBB2>
+<660A> <660A> <FBC4>
+<660C> <660C> <F3E3>
+<660E> <660E> <D9A5>
+<660F> <660F> <FBE7>
+<6610> <6610> <DDCB>
+<6611> <6611> <D0D4>
+<6613> <6613> <E6B6>
+<6614> <6614> <E0AE>
+<6615> <6615> <FDDA>
+<661E> <661E> <DCB5>
+<661F> <661F> <E0F8>
+<6620> <6620> <E7B1>
+endbfrange
+
+100 beginbfrange
+<6625> <6625> <F5F0>
+<6627> <6627> <D8DC>
+<6628> <6628> <EDC6>
+<662D> <662D> <E1B9>
+<662F> <662F> <E3C0>
+<6630> <6630> <F9C0>
+<6631> <6631> <E9F0>
+<6634> <6634> <D9DB>
+<6636> <6636> <F3E4>
+<663A> <663A> <DCB6>
+<663B> <663B> <E4E9>
+<6641> <6641> <F0C5>
+<6642> <6642> <E3C1>
+<6643> <6644> <FCCC>
+<6649> <6649> <F2CB>
+<664B> <664B> <F2CC>
+<664F> <664F> <E4CF>
+<6659> <6659> <F1DB>
+<665B> <665B> <FAD9>
+<665D> <665D> <F1B8>
+<665E> <665E> <FDF5>
+<665F> <665F> <E0F9>
+<6664> <6664> <E7FB>
+<6665> <6665> <FCB7>
+<6666> <6666> <FCE4>
+<6667> <6667> <FBC5>
+<6668> <6668> <E3E7>
+<6669> <6669> <D8B9>
+<666B> <666B> <F6F8>
+<666E> <666E> <DCC5>
+<666F> <666F> <CCD8>
+<6673> <6673> <E0AF>
+<6674> <6674> <F4E7>
+<6676> <6676> <EFDC>
+<6677> <6677> <CFFC>
+<6678> <6678> <EFDD>
+<667A> <667A> <F2AA>
+<6684> <6684> <FDBE>
+<6687> <6687> <CAAC>
+<6688> <6688> <FDBB>
+<6689> <6689> <FDC7>
+<668E> <668E> <E7B2>
+<6690> <6690> <EAD1>
+<6691> <6691> <DFF4>
+<6696> <6696> <D1EC>
+<6697> <6697> <E4DE>
+<6698> <6698> <E5C3>
+<669D> <669D> <D9A6>
+<66A0> <66A0> <CDBC>
+<66A2> <66A2> <F3E5>
+<66AB> <66AB> <EDD5>
+<66AE> <66AE> <D9BA>
+<66B2> <66B2> <EDE7>
+<66B3> <66B3> <FBB5>
+<66B4> <66B4> <F8EC>
+<66B9> <66B9> <E0E7>
+<66BB> <66BB> <CCD9>
+<66BE> <66BE> <D4C6>
+<66C4> <66C4> <E7A5>
+<66C6> <66C6> <D5F5>
+<66C7> <66C7> <D3BE>
+<66C9> <66C9> <FCFB>
+<66D6> <66D6> <E4F2>
+<66D9> <66D9> <DFF5>
+<66DC> <66DC> <E8F8>
+<66DD> <66DD> <F8ED>
+<66E0> <66E0> <CEC7>
+<66E6> <66E6> <FDF6>
+<66F0> <66F0> <E8D8>
+<66F2> <66F2> <CDD8>
+<66F3> <66F3> <E7D6>
+<66F4> <66F4> <CCDA>
+<66F7> <66F7> <CAE3>
+<66F8> <66F8> <DFF6>
+<66F9> <66F9> <F0C7>
+<66FA> <66FA> <F0C6>
+<66FC> <66FC> <D8BA>
+<66FE> <66FE> <F1F4>
+<66FF> <66FF> <F4F0>
+<6700> <6700> <F5CC>
+<6703> <6703> <FCE5>
+<6708> <6708> <EAC5>
+<6709> <6709> <EAF3>
+<670B> <670B> <DDDB>
+<670D> <670D> <DCD7>
+<6714> <6714> <DEFD>
+<6715> <6715> <F2F9>
+<6717> <6717> <D5C7>
+<671B> <671B> <D8D0>
+<671D> <671D> <F0C8>
+<671E> <671F> <D1A1>
+<6726> <6726> <D9D4>
+<6727> <6727> <D6E8>
+<6728> <6728> <D9CA>
+<672A> <672A> <DAB1>
+<672B> <672B> <D8C7>
+<672C> <672C> <DCE2>
+<672D> <672D> <F3CE>
+<672E> <672E> <F5F4>
+<6731> <6731> <F1B9>
+endbfrange
+
+100 beginbfrange
+<6734> <6734> <DAD3>
+<6736> <6736> <F6EA>
+<673A> <673A> <CFF5>
+<673D> <673D> <FDAE>
+<6746> <6746> <CAD2>
+<6749> <6749> <DFB4>
+<674E> <674E> <D7DD>
+<674F> <674F> <FABA>
+<6750> <6750> <EEA7>
+<6751> <6751> <F5BD>
+<6753> <6753> <F8F5>
+<6756> <6756> <EDE8>
+<675C> <675C> <D4E1>
+<675E> <675E> <D1A3>
+<675F> <675F> <E1D6>
+<676D> <676D> <F9F8>
+<676F> <676F> <DBCA>
+<6770> <6770> <CBF9>
+<6771> <6771> <D4D4>
+<6773> <6773> <D9DC>
+<6775> <6775> <EEBE>
+<6777> <6777> <F7ED>
+<677B> <677B> <D2EE>
+<677E> <677E> <E1E6>
+<677F> <677F> <F7F9>
+<6787> <6787> <DDED>
+<6789> <6789> <E8DB>
+<678B> <678B> <DBB3>
+<678F> <678F> <D1F7>
+<6790> <6790> <E0B0>
+<6793> <6793> <D4E2>
+<6795> <6795> <F6D7>
+<6797> <6797> <D7F9>
+<679A> <679A> <D8DD>
+<679C> <679C> <CDFD>
+<679D> <679D> <F2AB>
+<67AF> <67AF> <CDBD>
+<67B0> <67B0> <F8C2>
+<67B3> <67B3> <F2AC>
+<67B6> <67B7> <CAAD>
+<67B8> <67B8> <CFAE>
+<67BE> <67BE> <E3C2>
+<67C4> <67C4> <DCB7>
+<67CF> <67CF> <DBDA>
+<67D0> <67D0> <D9BB>
+<67D1> <67D1> <CAF3>
+<67D2> <67D2> <F6D3>
+<67D3> <67D3> <E6F8>
+<67D4> <67D4> <EAF5>
+<67DA> <67DA> <EAF6>
+<67DD> <67DD> <F6F9>
+<67E9> <67E9> <CFAF>
+<67EC> <67EC> <CAD3>
+<67EF> <67EF> <CAAF>
+<67F0> <67F0> <D2B0>
+<67F1> <67F1> <F1BA>
+<67F3> <67F3> <D7B3>
+<67F4> <67F4> <E3C3>
+<67F5> <67F5> <F3FD>
+<67F6> <67F6> <DEDA>
+<67FB> <67FB> <DEDB>
+<67FE> <67FE> <EFDE>
+<6812> <6812> <E2E3>
+<6813> <6813> <EEFB>
+<6816> <6816> <DFF7>
+<6817> <6817> <D7CA>
+<6821> <6821> <CEE8>
+<6822> <6822> <DBDB>
+<682A> <682A> <F1BB>
+<682F> <682F> <E9F1>
+<6838> <6838> <FAB7>
+<6839> <6839> <D0C6>
+<683C> <683C> <CCAB>
+<683D> <683D> <EEA8>
+<6840> <6840> <CBFA>
+<6841> <6841> <F9F9>
+<6842> <6842> <CCFD>
+<6843> <6843> <D3FE>
+<6848> <6848> <E4D0>
+<684E> <684E> <F2EE>
+<6850> <6850> <D4D5>
+<6851> <6851> <DFCD>
+<6853> <6853> <FCB8>
+<6854> <6854> <D1D0>
+<686D> <686D> <F2CD>
+<6876> <6876> <F7D2>
+<687F> <687F> <CAD4>
+<6881> <6881> <D5D9>
+<6885> <6885> <D8DE>
+<688F> <688F> <CDD9>
+<6893> <6893> <EEA9>
+<6894> <6894> <F6BC>
+<6897> <6897> <CCDB>
+<689D> <689D> <F0C9>
+<689F> <689F> <FCFC>
+<68A1> <68A1> <E8C9>
+<68A2> <68A2> <F4FE>
+<68A7> <68A7> <E7FC>
+<68A8> <68A8> <D7DE>
+<68AD> <68AD> <DEDC>
+endbfrange
+
+100 beginbfrange
+<68AF> <68AF> <F0AC>
+<68B0> <68B0> <CCFE>
+<68B1> <68B1> <CDE1>
+<68B3> <68B3> <E1BA>
+<68B5> <68B5> <DBEF>
+<68B6> <68B6> <DAB2>
+<68C4> <68C4> <D1A5>
+<68C5> <68C5> <DCB8>
+<68C9> <68C9> <D8F6>
+<68CB> <68CB> <D1A4>
+<68CD> <68CD> <CDE2>
+<68D2> <68D2> <DCEA>
+<68D5> <68D5> <F0F7>
+<68D7> <68D7> <F0CA>
+<68D8> <68D8> <D0BE>
+<68DA> <68DA> <DDDC>
+<68DF> <68DF> <D4D6>
+<68E0> <68E0> <D3D6>
+<68E7> <68E7> <EDD0>
+<68E8> <68E8> <CDA1>
+<68EE> <68EE> <DFB5>
+<68F2> <68F2> <DFF8>
+<68F9> <68F9> <D4A1>
+<68FA> <68FA> <CEB2>
+<6900> <6900> <E8CA>
+<6905> <6905> <EBF5>
+<690D> <690D> <E3D5>
+<690E> <690E> <F5D0>
+<6912> <6912> <F5A1>
+<6927> <6927> <D9A7>
+<6930> <6930> <E5AB>
+<693D> <693D> <E6CB>
+<693F> <693F> <F5F1>
+<694A> <694A> <E5C5>
+<6953> <6953> <F9A3>
+<6954> <6954> <E0DB>
+<6955> <6955> <F6EB>
+<6957> <6957> <CBF1>
+<6959> <6959> <D9EA>
+<695A> <695A> <F5A2>
+<695E> <695E> <D7D1>
+<6960> <6960> <D1F8>
+<6961> <6962> <EAF8>
+<6963> <6963> <DAB3>
+<6968> <6968> <EFDF>
+<696B> <696B> <F1EF>
+<696D> <696D> <E5F6>
+<696E> <696E> <EEBF>
+<696F> <696F> <E2E4>
+<6975> <6975> <D0BF>
+<6977> <6977> <FAAC>
+<6978> <6978> <F5D1>
+<6979> <6979> <E7B3>
+<6995> <6995> <E9BE>
+<699B> <699B> <F2CE>
+<699C> <699C> <DBB4>
+<69A5> <69A5> <FCCE>
+<69A7> <69A7> <DDEE>
+<69AE> <69AE> <E7B4>
+<69B4> <69B4> <D7B4>
+<69BB> <69BB> <F7B4>
+<69C1> <69C1> <CDBE>
+<69C3> <69C3> <DAE9>
+<69CB> <69CB> <CFB0>
+<69CC> <69CC> <F7D9>
+<69CD> <69CD> <F3E6>
+<69D0> <69D0> <CED9>
+<69E8> <69E8> <CEAA>
+<69EA> <69EA> <CBC8>
+<69FB> <69FB> <D0A7>
+<69FD> <69FD> <F0CB>
+<69FF> <69FF> <D0C7>
+<6A02> <6A02> <E4C5>
+<6A0A> <6A0A> <DBE0>
+<6A11> <6A11> <D5DA>
+<6A13> <6A13> <D7A7>
+<6A17> <6A17> <EEC0>
+<6A19> <6A19> <F8F6>
+<6A1E> <6A1E> <F5D2>
+<6A1F> <6A1F> <EDE9>
+<6A21> <6A21> <D9BC>
+<6A23> <6A23> <E5C6>
+<6A35> <6A35> <F5A3>
+<6A38> <6A38> <DAD4>
+<6A39> <6A39> <E2A7>
+<6A3A> <6A3A> <FBFC>
+<6A3D> <6A3D> <F1DC>
+<6A44> <6A44> <CAF4>
+<6A48> <6A48> <E8FA>
+<6A4B> <6A4B> <CEE9>
+<6A52> <6A52> <E9F8>
+<6A53> <6A53> <E2E5>
+<6A58> <6A58> <D0B9>
+<6A59> <6A59> <D4F2>
+<6A5F> <6A5F> <D1A6>
+<6A61> <6A61> <DFCE>
+<6A6B> <6A6B> <FCF4>
+<6A80> <6A80> <D3AA>
+<6A84> <6A84> <CCAC>
+<6A89> <6A89> <EFE0>
+endbfrange
+
+100 beginbfrange
+<6A8D> <6A8D> <E5E5>
+<6A8E> <6A8E> <D0D5>
+<6A97> <6A97> <DBFC>
+<6A9C> <6A9C> <FCE6>
+<6AA2> <6AA2> <CBFE>
+<6AA3> <6AA3> <EDEA>
+<6AB3> <6AB3> <DEB1>
+<6ABB> <6ABB> <F9E3>
+<6AC2> <6AC2> <D4A2>
+<6AC3> <6AC3> <CFF6>
+<6AD3> <6AD3> <D6D0>
+<6ADA> <6ADA> <D5EA>
+<6ADB> <6ADB> <F1EE>
+<6AF6> <6AF6> <FACB>
+<6AFB> <6AFB> <E5A1>
+<6B04> <6B04> <D5B1>
+<6B0A> <6B0A> <CFED>
+<6B0C> <6B0C> <EDEB>
+<6B12> <6B12> <D5B2>
+<6B16> <6B16> <D5BC>
+<6B20> <6B20> <FDE2>
+<6B21> <6B21> <F3AD>
+<6B23> <6B23> <FDDB>
+<6B32> <6B32> <E9B0>
+<6B3A> <6B3A> <D1A7>
+<6B3D> <6B3D> <FDE3>
+<6B3E> <6B3E> <CEB3>
+<6B46> <6B46> <FDE4>
+<6B47> <6B47> <FACE>
+<6B4C> <6B4C> <CAB0>
+<6B4E> <6B4E> <F7A7>
+<6B50> <6B50> <CFB1>
+<6B5F> <6B5F> <E6A2>
+<6B61> <6B61> <FCB6>
+<6B62> <6B62> <F2AD>
+<6B63> <6B63> <EFE1>
+<6B64> <6B64> <F3AE>
+<6B65> <6B65> <DCC6>
+<6B66> <6B66> <D9EB>
+<6B6A> <6B6A> <E8E0>
+<6B72> <6B72> <E1A8>
+<6B77> <6B77> <D5F6>
+<6B78> <6B78> <CFFD>
+<6B7B> <6B7B> <DEDD>
+<6B7F> <6B7F> <D9D1>
+<6B83> <6B83> <E4EA>
+<6B84> <6B84> <F2CF>
+<6B86> <6B86> <F7BF>
+<6B89> <6B89> <E2E6>
+<6B8A> <6B8A> <E2A8>
+<6B96> <6B96> <E3D6>
+<6B98> <6B98> <EDD1>
+<6B9E> <6B9E> <E9F9>
+<6BAE> <6BAE> <D6B1>
+<6BAF> <6BAF> <DEB2>
+<6BB2> <6BB2> <E0E8>
+<6BB5> <6BB5> <D3AB>
+<6BB7> <6BB7> <EBDC>
+<6BBA> <6BBA> <DFAF>
+<6BBC> <6BBC> <CAC3>
+<6BBF> <6BBF> <EEFC>
+<6BC1> <6BC1> <FDC3>
+<6BC5> <6BC5> <EBF6>
+<6BC6> <6BC6> <CFB2>
+<6BCB> <6BCB> <D9EC>
+<6BCD> <6BCD> <D9BD>
+<6BCF> <6BCF> <D8DF>
+<6BD2> <6BD2> <D4B8>
+<6BD3> <6BD3> <EBBE>
+<6BD4> <6BD4> <DDEF>
+<6BD6> <6BD8> <DDF0>
+<6BDB> <6BDB> <D9BE>
+<6BEB> <6BEB> <FBC6>
+<6BEC> <6BEC> <CFB3>
+<6C08> <6C08> <EEFD>
+<6C0F> <6C0F> <E4AB>
+<6C11> <6C11> <DAC5>
+<6C13> <6C13> <D8EC>
+<6C23> <6C23> <D1A8>
+<6C34> <6C34> <E2A9>
+<6C37> <6C37> <DEBC>
+<6C38> <6C38> <E7B5>
+<6C3E> <6C3E> <DBF0>
+<6C40> <6C40> <EFE2>
+<6C41> <6C41> <F1F0>
+<6C42> <6C42> <CFB4>
+<6C4E> <6C4E> <DBF1>
+<6C50> <6C50> <E0B1>
+<6C55> <6C55> <DFA5>
+<6C57> <6C57> <F9D2>
+<6C5A> <6C5A> <E7FD>
+<6C5D> <6C5D> <E6A3>
+<6C5E> <6C5E> <FBF1>
+<6C5F> <6C5F> <CBB0>
+<6C60> <6C60> <F2AE>
+<6C68> <6C68> <CDE7>
+<6C6A> <6C6A> <E8DC>
+<6C6D> <6C6D> <E7D7>
+<6C70> <6C70> <F7C0>
+<6C72> <6C72> <D0E3>
+endbfrange
+
+100 beginbfrange
+<6C76> <6C76> <DAA1>
+<6C7A> <6C7A> <CCBD>
+<6C7D> <6C7D> <D1A9>
+<6C7E> <6C7E> <DDCC>
+<6C81> <6C81> <E3FE>
+<6C82> <6C82> <D1AA>
+<6C83> <6C83> <E8AA>
+<6C85> <6C85> <EAB6>
+<6C86> <6C86> <F9FA>
+<6C87> <6C87> <E6CC>
+<6C88> <6C88> <F6D8>
+<6C8C> <6C8C> <D4C7>
+<6C90> <6C90> <D9CB>
+<6C92> <6C92> <D9D2>
+<6C93> <6C93> <D3CB>
+<6C94> <6C94> <D8F7>
+<6C95> <6C95> <DAA9>
+<6C96> <6C96> <F5F8>
+<6C99> <6C99> <DEDE>
+<6C9A> <6C9A> <F2AF>
+<6C9B> <6C9B> <F8A9>
+<6CAB> <6CAB> <D8C8>
+<6CAE> <6CAE> <EEC1>
+<6CB3> <6CB3> <F9C1>
+<6CB8> <6CB8> <DDF3>
+<6CB9> <6CB9> <EAFA>
+<6CBB> <6CBB> <F6BD>
+<6CBC> <6CBC> <E1BB>
+<6CBD> <6CBD> <CDBF>
+<6CBE> <6CBE> <F4D4>
+<6CBF> <6CBF> <E6CD>
+<6CC1> <6CC1> <FCCF>
+<6CC2> <6CC2> <FBA2>
+<6CC4> <6CC4> <E0DC>
+<6CC9> <6CC9> <F4BB>
+<6CCA> <6CCA> <DAD5>
+<6CCC> <6CCC> <F9B2>
+<6CD3> <6CD3> <FBF2>
+<6CD5> <6CD5> <DBF6>
+<6CD7> <6CD7> <DEDF>
+<6CDB> <6CDB> <DBF2>
+<6CE1> <6CE1> <F8DC>
+<6CE2> <6CE2> <F7EE>
+<6CE3> <6CE3> <EBE8>
+<6CE5> <6CE5> <D2FA>
+<6CE8> <6CE8> <F1BC>
+<6CEB> <6CEB> <FADA>
+<6CEE> <6CEE> <DAEA>
+<6CEF> <6CEF> <DAC6>
+<6CF0> <6CF0> <F7C1>
+<6CF3> <6CF3> <E7B6>
+<6D0B> <6D0B> <E5C7>
+<6D0C> <6D0C> <D6AC>
+<6D11> <6D11> <DCC7>
+<6D17> <6D17> <E1A9>
+<6D19> <6D19> <E2AA>
+<6D1B> <6D1B> <D5A6>
+<6D1E> <6D1E> <D4D7>
+<6D25> <6D25> <F2D0>
+<6D27> <6D27> <EAFB>
+<6D29> <6D29> <E0DD>
+<6D2A> <6D2A> <FBF3>
+<6D32> <6D32> <F1BD>
+<6D35> <6D35> <E2E7>
+<6D36> <6D36> <FDD7>
+<6D38> <6D38> <CEC8>
+<6D39> <6D39> <EAB7>
+<6D3B> <6D3B> <FCC0>
+<6D3D> <6D3D> <FDE7>
+<6D3E> <6D3E> <F7EF>
+<6D41> <6D41> <D7B5>
+<6D59> <6D59> <EFBA>
+<6D5A> <6D5A> <F1DD>
+<6D5C> <6D5C> <DEB3>
+<6D63> <6D63> <E8CB>
+<6D66> <6D66> <F8DD>
+<6D69> <6D69> <FBC7>
+<6D6A> <6D6A> <D5C8>
+<6D6C> <6D6C> <D7DF>
+<6D6E> <6D6E> <DDA9>
+<6D74> <6D74> <E9B1>
+<6D77> <6D77> <FAAD>
+<6D78> <6D78> <F6D9>
+<6D79> <6D79> <FAF4>
+<6D7F> <6D7F> <F8AA>
+<6D85> <6D85> <E6EE>
+<6D87> <6D87> <CCDC>
+<6D88> <6D88> <E1BC>
+<6D89> <6D89> <E0EF>
+<6D8C> <6D8C> <E9BF>
+<6D8D> <6D8D> <FCFD>
+<6D8E> <6D8E> <E6CE>
+<6D91> <6D91> <E1D7>
+<6D93> <6D93> <E6CF>
+<6D95> <6D95> <F4F1>
+<6DAF> <6DAF> <E4F3>
+<6DB2> <6DB2> <E4FB>
+<6DB5> <6DB5> <F9E4>
+<6DC0> <6DC0> <EFE3>
+<6DC3> <6DC3> <CFEE>
+endbfrange
+
+100 beginbfrange
+<6DC4> <6DC4> <F6BE>
+<6DC5> <6DC5> <E0B2>
+<6DC6> <6DC6> <FCFE>
+<6DC7> <6DC7> <D1AB>
+<6DCB> <6DCB> <D7FA>
+<6DCF> <6DCF> <FBC8>
+<6DD1> <6DD1> <E2D7>
+<6DD8> <6DD8> <D4A3>
+<6DD9> <6DD9> <F0F8>
+<6DDA> <6DDA> <D7A8>
+<6DDE> <6DDE> <E1E7>
+<6DE1> <6DE1> <D3BF>
+<6DE8> <6DE8> <EFE4>
+<6DEA> <6DEA> <D7C5>
+<6DEB> <6DEB> <EBE2>
+<6DEE> <6DEE> <FCE7>
+<6DF1> <6DF1> <E4A2>
+<6DF3> <6DF3> <E2E8>
+<6DF5> <6DF5> <E6D0>
+<6DF7> <6DF7> <FBE8>
+<6DF8> <6DF8> <F4E8>
+<6DF9> <6DF9> <E5F4>
+<6DFA> <6DFA> <F4BC>
+<6DFB> <6DFB> <F4D5>
+<6E17> <6E17> <DFB6>
+<6E19> <6E19> <FCB9>
+<6E1A> <6E1A> <EEC2>
+<6E1B> <6E1B> <CAF5>
+<6E1F> <6E1F> <EFE5>
+<6E20> <6E20> <CBE2>
+<6E21> <6E21> <D4A4>
+<6E23> <6E23> <DEE0>
+<6E24> <6E24> <DAFD>
+<6E25> <6E25> <E4C6>
+<6E26> <6E26> <E8BE>
+<6E2B> <6E2B> <E0DE>
+<6E2C> <6E2C> <F6B4>
+<6E2D> <6E2D> <EAD2>
+<6E2F> <6E2F> <F9FB>
+<6E32> <6E32> <E0C2>
+<6E34> <6E34> <CAE4>
+<6E36> <6E36> <E7B7>
+<6E38> <6E38> <EAFD>
+<6E3A> <6E3A> <D9DD>
+<6E3C> <6E3C> <DAB4>
+<6E3D> <6E3D> <EEAA>
+<6E3E> <6E3E> <FBE9>
+<6E43> <6E43> <DBCB>
+<6E44> <6E44> <DAB5>
+<6E4A> <6E4A> <F1BE>
+<6E4D> <6E4D> <D3AC>
+<6E56> <6E56> <FBC9>
+<6E58> <6E58> <DFCF>
+<6E5B> <6E5B> <D3C0>
+<6E5C> <6E5C> <E3D7>
+<6E5E> <6E5E> <EFE6>
+<6E5F> <6E5F> <FCD0>
+<6E67> <6E67> <E9C0>
+<6E6B> <6E6B> <F5D3>
+<6E6E> <6E6E> <ECDC>
+<6E6F> <6E6F> <F7B7>
+<6E72> <6E72> <EAB8>
+<6E73> <6E73> <D1F9>
+<6E7A> <6E7A> <DCC8>
+<6E90> <6E90> <EAB9>
+<6E96> <6E96> <F1DE>
+<6E9C> <6E9C> <D7B6>
+<6E9D> <6E9D> <CFB5>
+<6E9F> <6E9F> <D9A8>
+<6EA2> <6EA2> <ECEE>
+<6EA5> <6EA5> <DDAA>
+<6EAA> <6EAA> <CDA2>
+<6EAB> <6EAB> <E8AE>
+<6EAF> <6EAF> <E1BD>
+<6EB1> <6EB1> <F2D1>
+<6EB6> <6EB6> <E9C1>
+<6EBA> <6EBA> <D2FC>
+<6EC2> <6EC2> <DBB5>
+<6EC4> <6EC4> <F3E7>
+<6EC5> <6EC5> <D8FE>
+<6EC9> <6EC9> <FCD1>
+<6ECB> <6ECB> <EDB2>
+<6ECC> <6ECC> <F4AF>
+<6ECE> <6ECE> <FBA3>
+<6ED1> <6ED1> <FCC1>
+<6ED3> <6ED3> <EEAB>
+<6ED4> <6ED4> <D4A5>
+<6EEF> <6EEF> <F4F2>
+<6EF4> <6EF4> <EED9>
+<6EF8> <6EF8> <FBCA>
+<6EFE> <6EFE> <CDE3>
+<6EFF> <6EFF> <D8BB>
+<6F01> <6F01> <E5DB>
+<6F02> <6F02> <F8F7>
+<6F06> <6F06> <F6D4>
+<6F0F> <6F0F> <D7A9>
+<6F11> <6F11> <CBC9>
+<6F14> <6F14> <E6D1>
+<6F15> <6F15> <F0CC>
+<6F20> <6F20> <D8AE>
+endbfrange
+
+100 beginbfrange
+<6F22> <6F22> <F9D3>
+<6F23> <6F23> <D5FE>
+<6F2B> <6F2B> <D8BC>
+<6F2C> <6F2C> <F2B0>
+<6F31> <6F31> <E2AB>
+<6F32> <6F32> <F3E8>
+<6F38> <6F38> <EFC2>
+<6F3F> <6F3F> <EDEC>
+<6F41> <6F41> <E7B8>
+<6F51> <6F51> <DAFE>
+<6F54> <6F54> <CCBE>
+<6F57> <6F57> <F2FC>
+<6F58> <6F58> <DAEB>
+<6F5A> <6F5A> <E2D8>
+<6F5B> <6F5B> <EDD6>
+<6F5E> <6F5E> <D6D1>
+<6F5F> <6F5F> <E0B3>
+<6F62> <6F62> <FCD2>
+<6F64> <6F64> <EBC8>
+<6F6D> <6F6D> <D3C1>
+<6F6E> <6F6E> <F0CD>
+<6F70> <6F70> <CFF7>
+<6F7A> <6F7A> <EDD2>
+<6F7C> <6F7C> <D4D8>
+<6F7D> <6F7D> <DCC9>
+<6F7E> <6F7E> <D7F1>
+<6F81> <6F81> <DFBB>
+<6F84> <6F84> <F3A5>
+<6F88> <6F88> <F4CD>
+<6F8D> <6F8D> <F1BF>
+<6F8E> <6F8E> <F8B1>
+<6F90> <6F90> <E9FA>
+<6F94> <6F94> <FBCB>
+<6F97> <6F97> <CAD5>
+<6FA3> <6FA3> <F9D4>
+<6FA4> <6FA4> <F7CA>
+<6FA7> <6FA7> <D6C8>
+<6FAE> <6FAE> <FCE8>
+<6FAF> <6FAF> <F3BD>
+<6FB1> <6FB1> <EEFE>
+<6FB3> <6FB3> <E7FE>
+<6FB9> <6FB9> <D3C2>
+<6FBE> <6FBE> <D3B6>
+<6FC0> <6FC0> <CCAD>
+<6FC1> <6FC1> <F6FA>
+<6FC2> <6FC2> <D6B2>
+<6FC3> <6FC3> <D2D8>
+<6FCA> <6FCA> <E7D8>
+<6FD5> <6FD5> <E3A5>
+<6FDA> <6FDA> <E7B9>
+<6FDF> <6FDF> <F0AD>
+<6FE0> <6FE0> <FBCC>
+<6FE1> <6FE1> <EBA1>
+<6FE4> <6FE4> <D4A6>
+<6FE9> <6FE9> <FBCD>
+<6FEB> <6FEB> <D5BD>
+<6FEC> <6FEC> <F1DF>
+<6FEF> <6FEF> <F6FB>
+<6FF1> <6FF1> <DEB4>
+<6FFE> <6FFE> <D5EB>
+<7001> <7001> <E5C8>
+<7005> <7005> <FBA4>
+<7006> <7006> <D4B9>
+<7009> <7009> <DEE1>
+<700B> <700B> <E4A3>
+<700F> <700F> <D7B7>
+<7011> <7011> <F8EE>
+<7015> <7015> <DEB5>
+<7018> <7018> <D6D2>
+<701A> <701A> <F9D5>
+<701B> <701B> <E7BA>
+<701C> <701C> <EBD5>
+<701D> <701D> <D5F7>
+<701E> <701E> <EFE7>
+<701F> <701F> <E1BE>
+<7023> <7023> <FAAE>
+<7027> <7027> <D6E9>
+<7028> <7028> <D6EE>
+<702F> <702F> <E7BB>
+<7037> <7037> <ECCB>
+<703E> <703E> <D5B3>
+<704C> <704C> <CEB4>
+<7050> <7050> <FBA5>
+<7051> <7051> <E1EE>
+<7058> <7058> <F7A8>
+<705D> <705D> <FBCE>
+<7063> <7063> <D8BD>
+<706B> <706B> <FBFD>
+<7070> <7070> <FCE9>
+<7078> <7078> <CFB6>
+<707C> <707C> <EDC7>
+<707D> <707D> <EEAC>
+<7085> <7085> <CCDD>
+<708A> <708A> <F6A7>
+<708E> <708E> <E6FA>
+<7092> <7092> <F5A4>
+<7098> <7098> <FDDC>
+<7099> <7099> <EDB3>
+<709A> <709A> <CEC9>
+<70A1> <70A1> <EFE8>
+endbfrange
+
+100 beginbfrange
+<70A4> <70A4> <E1BF>
+<70AB> <70AB> <FADB>
+<70AC> <70AC> <CBE3>
+<70AD> <70AD> <F7A9>
+<70AF> <70AF> <FBA6>
+<70B3> <70B3> <DCB9>
+<70B7> <70B7> <F1C0>
+<70B8> <70B8> <EDC8>
+<70B9> <70B9> <EFC3>
+<70C8> <70C8> <D6AD>
+<70CB> <70CB> <FDCE>
+<70CF> <70CF> <E8A1>
+<70D8> <70D8> <FBF4>
+<70D9> <70D9> <D5A7>
+<70DD> <70DD> <F1F6>
+<70DF> <70DF> <E6D3>
+<70F1> <70F1> <CCDE>
+<70F9> <70F9> <F8B2>
+<70FD> <70FD> <DCEB>
+<7104> <7104> <FDB6>
+<7109> <7109> <E5EA>
+<710C> <710C> <F1E0>
+<7119> <7119> <DBCC>
+<711A> <711A> <DDCD>
+<711E> <711E> <D4C8>
+<7121> <7121> <D9ED>
+<7126> <7126> <F5A5>
+<7130> <7130> <E6FB>
+<7136> <7136> <E6D4>
+<7147> <7147> <FDC8>
+<7149> <7149> <D6A1>
+<714A> <714A> <FDBF>
+<714C> <714C> <FCD3>
+<714E> <714E> <EFA1>
+<7150> <7150> <E7BC>
+<7156> <7156> <D1EE>
+<7159> <7159> <E6D5>
+<715C> <715C> <E9F2>
+<715E> <715E> <DFB0>
+<7164> <7164> <D8E0>
+<7165> <7165> <FCBA>
+<7166> <7166> <FDAF>
+<7167> <7167> <F0CE>
+<7169> <7169> <DBE1>
+<716C> <716C> <E5C9>
+<716E> <716E> <EDB4>
+<717D> <717D> <E0C3>
+<7184> <7184> <E3D8>
+<7189> <7189> <E9FB>
+<718A> <718A> <EAA8>
+<718F> <718F> <FDB7>
+<7192> <7192> <FBA7>
+<7194> <7194> <E9C2>
+<7199> <7199> <FDF7>
+<719F> <719F> <E2D9>
+<71A2> <71A2> <DCEC>
+<71AC> <71AC> <E8A2>
+<71B1> <71B1> <E6F0>
+<71B9> <71BA> <FDF8>
+<71BE> <71BE> <F6BF>
+<71C1> <71C1> <E7A7>
+<71C3> <71C3> <E6D7>
+<71C8> <71C8> <D4F3>
+<71C9> <71C9> <D4C9>
+<71CE> <71CE> <D6FA>
+<71D0> <71D0> <D7F2>
+<71D2> <71D2> <E1C0>
+<71D4> <71D4> <DBE2>
+<71D5> <71D5> <E6D8>
+<71DF> <71DF> <E7BD>
+<71E5> <71E5> <F0CF>
+<71E6> <71E6> <F3BE>
+<71E7> <71E7> <E2AC>
+<71ED> <71ED> <F5B7>
+<71EE> <71EE> <E0F0>
+<71FB> <71FB> <FDB8>
+<71FC> <71FC> <E3E8>
+<71FE> <71FE> <D4A7>
+<71FF> <71FF> <E8FC>
+<7200> <7200> <FAD2>
+<7206> <7206> <F8EF>
+<7210> <7210> <D6D3>
+<721B> <721B> <D5B4>
+<722A> <722A> <F0D0>
+<722C> <722C> <F7F0>
+<722D> <722D> <EEB3>
+<7230> <7230> <EABA>
+<7232> <7232> <EAD3>
+<7235> <7235> <EDC9>
+<7236> <7236> <DDAB>
+<723A> <723A> <E5AC>
+<723B> <723B> <FDA1>
+<723D> <723D> <DFD0>
+<723E> <723E> <ECB3>
+<7240> <7240> <DFD1>
+<7246> <7246> <EDED>
+<7247> <7247> <F8B8>
+<7248> <7248> <F7FA>
+<724C> <724C> <F8AB>
+<7252> <7252> <F4E0>
+endbfrange
+
+100 beginbfrange
+<7258> <7258> <D4BA>
+<7259> <7259> <E4B3>
+<725B> <725B> <E9DA>
+<725D> <725D> <DEB6>
+<725F> <725F> <D9BF>
+<7261> <7261> <D9C0>
+<7262> <7262> <D6EF>
+<7267> <7267> <D9CC>
+<7269> <7269> <DAAA>
+<7272> <7272> <DFE5>
+<7279> <7279> <F7E5>
+<727D> <727D> <CCB2>
+<7280> <7280> <DFF9>
+<7281> <7281> <D7E0>
+<72A2> <72A2> <D4BB>
+<72A7> <72A7> <FDFA>
+<72AC> <72AC> <CCB3>
+<72AF> <72AF> <DBF3>
+<72C0> <72C0> <DFD2>
+<72C2> <72C2> <CECA>
+<72C4> <72C4> <EEDA>
+<72CE> <72CE> <E4E4>
+<72D0> <72D0> <FBCF>
+<72D7> <72D7> <CFB7>
+<72D9> <72D9> <EEC3>
+<72E1> <72E1> <CEEA>
+<72E9> <72E9> <E2AD>
+<72F8> <72F8> <D7E1>
+<72F9> <72F9> <FAF5>
+<72FC> <72FC> <D5C9>
+<72FD> <72FD> <F8AC>
+<730A> <730A> <E7D9>
+<7316> <7316> <F3E9>
+<731B> <731B> <D8ED>
+<731C> <731C> <E3C4>
+<731D> <731D> <F0F1>
+<7325> <7325> <E8E5>
+<7329> <7329> <E0FA>
+<732A> <732A> <EEC4>
+<732B> <732B> <D9DE>
+<7336> <7337> <EBA2>
+<733E> <733E> <FCC2>
+<733F> <733F> <EABB>
+<7344> <7344> <E8AB>
+<7345> <7345> <DEE2>
+<7350> <7350> <EDEF>
+<7352> <7352> <E8A3>
+<7357> <7357> <CFF1>
+<7368> <7368> <D4BC>
+<736A> <736A> <FCEA>
+<7370> <7370> <E7BE>
+<7372> <7372> <FCF2>
+<7375> <7375> <D6B4>
+<7378> <7378> <E2AE>
+<737A> <737A> <D3B7>
+<737B> <737B> <FACC>
+<7384> <7384> <FADC>
+<7386> <7386> <EDB5>
+<7387> <7387> <E1E3>
+<7389> <7389> <E8AC>
+<738B> <738B> <E8DD>
+<738E> <738E> <EFE9>
+<7394> <7394> <F4BD>
+<7396> <7396> <CFB8>
+<7397> <7397> <E9DB>
+<7398> <7398> <D1AC>
+<739F> <739F> <DAC7>
+<73A7> <73A7> <EBC9>
+<73A9> <73A9> <E8CC>
+<73AD> <73AD> <DEB7>
+<73B2> <73B2> <D6BC>
+<73B3> <73B3> <D3E5>
+<73B9> <73B9> <FADD>
+<73C0> <73C0> <DAD6>
+<73C2> <73C2> <CAB1>
+<73C9> <73C9> <DAC8>
+<73CA> <73CA> <DFA6>
+<73CC> <73CC> <F9B3>
+<73CD> <73CD> <F2D2>
+<73CF> <73CF> <CAC4>
+<73D6> <73D6> <CECB>
+<73D9> <73D9> <CDF5>
+<73DD> <73DD> <FDB0>
+<73DE> <73DE> <D5A8>
+<73E0> <73E0> <F1C1>
+<73E3> <73E3> <E2E9>
+<73E4> <73E4> <DCCA>
+<73E5> <73E5> <ECB4>
+<73E6> <73E6> <FAC0>
+<73E9> <73E9> <FBA8>
+<73EA> <73EA> <D0A8>
+<73ED> <73ED> <DAEC>
+<73F7> <73F7> <D9EE>
+<73F9> <73F9> <E0FB>
+<73FD> <73FD> <EFEA>
+<73FE> <73FE> <FADE>
+<7401> <7401> <E0C4>
+<7403> <7403> <CFB9>
+<7405> <7405> <D5CA>
+<7406> <7406> <D7E2>
+endbfrange
+
+100 beginbfrange
+<7407> <7407> <E2AF>
+<7409> <7409> <D7B8>
+<7413> <7413> <E8CD>
+<741B> <741B> <F6DA>
+<7420> <7420> <EFA2>
+<7421> <7421> <E2DA>
+<7422> <7422> <F6FC>
+<7425> <7425> <FBD0>
+<7426> <7426> <D1AD>
+<7428> <7428> <CDE4>
+<742A> <742A> <D1AE>
+<742B> <742B> <DCED>
+<742C> <742C> <E8CE>
+<742E> <742E> <F0F9>
+<742F> <742F> <CEB5>
+<7430> <7430> <E6FC>
+<7433> <7433> <D7FB>
+<7434> <7434> <D0D6>
+<7435> <7435> <DDF5>
+<7436> <7436> <F7F1>
+<7438> <7438> <F6FD>
+<743A> <743A> <DBF7>
+<743F> <743F> <FBEA>
+<7440> <7440> <E9DC>
+<7441> <7441> <D9C1>
+<7443> <7443> <F5F2>
+<7444> <7444> <E0C5>
+<744B> <744B> <EAD4>
+<7455> <7455> <F9C2>
+<7457> <7457> <EABC>
+<7459> <7459> <D2C5>
+<745A> <745A> <FBD1>
+<745B> <745B> <E7C0>
+<745C> <745C> <EBA5>
+<745E> <745E> <DFFA>
+<745F> <745F> <E3A2>
+<7460> <7460> <D7B9>
+<7462> <7462> <E9C3>
+<7464> <7464> <E8FD>
+<7465> <7465> <E8AF>
+<7468> <7468> <F2D3>
+<7469> <7469> <FBA9>
+<746A> <746A> <D8A5>
+<746F> <746F> <D5CB>
+<747E> <747E> <D0C8>
+<7482> <7482> <D1AF>
+<7483> <7483> <D7E3>
+<7487> <7487> <E0C6>
+<7489> <7489> <D6A2>
+<748B> <748B> <EDF0>
+<7498> <7498> <D7F3>
+<749C> <749C> <FCD4>
+<749E> <749E> <DAD7>
+<749F> <749F> <CCDF>
+<74A1> <74A1> <F2D4>
+<74A3> <74A3> <D1B0>
+<74A5> <74A5> <CCE0>
+<74A7> <74A7> <DBFD>
+<74A8> <74A8> <F3BF>
+<74AA> <74AA> <F0D1>
+<74B0> <74B0> <FCBB>
+<74B2> <74B2> <E2B0>
+<74B5> <74B5> <E6A5>
+<74B9> <74B9> <E2DB>
+<74BD> <74BD> <DFDE>
+<74BF> <74BF> <E0C7>
+<74C6> <74C6> <F2EF>
+<74CA> <74CA> <CCE1>
+<74CF> <74CF> <D6EA>
+<74D4> <74D4> <E7C2>
+<74D8> <74D8> <CEB6>
+<74DA> <74DA> <F3C0>
+<74DC> <74DC> <CDFE>
+<74E0> <74E0> <FBD2>
+<74E2> <74E2> <F8F8>
+<74E3> <74E3> <F7FB>
+<74E6> <74E6> <E8BF>
+<74EE> <74EE> <E8B7>
+<74F7> <74F7> <EDB6>
+<7501> <7501> <DCBA>
+<7504> <7504> <CCB4>
+<7511> <7511> <F1F7>
+<7515> <7515> <E8B8>
+<7518> <7518> <CAF6>
+<751A> <751A> <E4A4>
+<751B> <751B> <F4D6>
+<751F> <751F> <DFE6>
+<7523> <7523> <DFA7>
+<7525> <7525> <DFE7>
+<7526> <7526> <E1C1>
+<7528> <7528> <E9C4>
+<752B> <752B> <DCCB>
+<752C> <752C> <E9C5>
+<7530> <7530> <EFA3>
+<7531> <7531> <EBA6>
+<7532> <7532> <CBA3>
+<7533> <7533> <E3E9>
+<7537> <7537> <D1FB>
+<7538> <7538> <EFA4>
+<753A> <753A> <EFEB>
+endbfrange
+
+100 beginbfrange
+<7547> <7547> <D0B4>
+<754C> <754C> <CDA3>
+<754F> <754F> <E8E6>
+<7551> <7551> <EFA5>
+<7553> <7553> <D3CC>
+<7554> <7554> <DAED>
+<7559> <7559> <D7BA>
+<755B> <755B> <F2D5>
+<755C> <755C> <F5E5>
+<755D> <755D> <D9EF>
+<7562> <7562> <F9B4>
+<7565> <7565> <D5D4>
+<7566> <7566> <FDCF>
+<756A> <756A> <DBE3>
+<756F> <756F> <F1E1>
+<7570> <7570> <ECB6>
+<7575> <7575> <FBFE>
+<7576> <7576> <D3D7>
+<7578> <7578> <D1B1>
+<757A> <757A> <CBB1>
+<757F> <757F> <D1B2>
+<7586> <7586> <CBB2>
+<7587> <7587> <F1C2>
+<758A> <758A> <F4E1>
+<758B> <758B> <F9B5>
+<758E> <758E> <E1C3>
+<758F> <758F> <E1C2>
+<7591> <7591> <EBF7>
+<759D> <759D> <DFA8>
+<75A5> <75A5> <CBCA>
+<75AB> <75AB> <E6B9>
+<75B1> <75B1> <F8DE>
+<75B2> <75B2> <F9AA>
+<75B3> <75B3> <CAF7>
+<75B5> <75B5> <EDB7>
+<75B8> <75B8> <D3B8>
+<75B9> <75B9> <F2D6>
+<75BC> <75BC> <D4D9>
+<75BD> <75BD> <EEC5>
+<75BE> <75BE> <F2F0>
+<75C2> <75C2> <CAB2>
+<75C5> <75C5> <DCBB>
+<75C7> <75C7> <F1F8>
+<75CD> <75CD> <ECB7>
+<75D2> <75D2> <E5CA>
+<75D4> <75D4> <F6C0>
+<75D5> <75D5> <FDDD>
+<75D8> <75D8> <D4E3>
+<75D9> <75D9> <CCE2>
+<75DB> <75DB> <F7D4>
+<75E2> <75E2> <D7E5>
+<75F0> <75F0> <D3C3>
+<75F2> <75F2> <D8A6>
+<75F4> <75F4> <F6C1>
+<75FA> <75FA> <DDF6>
+<75FC> <75FC> <CDC0>
+<7600> <7600> <E5DC>
+<760D> <760D> <E5CB>
+<7619> <7619> <E1C4>
+<761F> <761F> <E8B0>
+<7620> <7620> <F4B0>
+<7621> <7621> <F3EA>
+<7622> <7622> <DAEE>
+<7624> <7624> <D7BB>
+<7626> <7626> <E2B1>
+<763B> <763B> <D7AA>
+<7642> <7642> <D6FB>
+<764C> <764C> <E4DF>
+<764E> <764E> <CAD6>
+<7652> <7652> <EBA8>
+<7656> <7656> <DBFE>
+<7661> <7661> <F6C2>
+<7664> <7664> <EFBB>
+<7669> <7669> <D4FD>
+<766C> <766C> <E0C8>
+<7670> <7670> <E8B9>
+<7672> <7672> <EFA6>
+<7678> <7678> <CDA4>
+<767B> <767B> <D4F4>
+<767C> <767C> <DBA1>
+<767D> <767E> <DBDC>
+<7684> <7684> <EEDC>
+<7686> <7686> <CBCB>
+<7687> <7687> <FCD5>
+<768E> <768E> <CEEB>
+<7690> <7690> <CDC1>
+<7693> <7693> <FBD3>
+<76AE> <76AE> <F9AB>
+<76BA> <76BA> <F5D4>
+<76BF> <76BF> <D9A9>
+<76C2> <76C2> <E9DD>
+<76C3> <76C3> <DBCD>
+<76C6> <76C6> <DDCE>
+<76C8> <76C8> <E7C3>
+<76CA> <76CA> <ECCC>
+<76D2> <76D2> <F9EC>
+<76D6> <76D6> <CBCC>
+<76DB> <76DB> <E0FC>
+<76DC> <76DC> <D4A8>
+<76DE> <76DE> <EDD3>
+endbfrange
+
+100 beginbfrange
+<76DF> <76DF> <D8EF>
+<76E1> <76E1> <F2D7>
+<76E3> <76E3> <CAF8>
+<76E4> <76E4> <DAEF>
+<76E7> <76E7> <D6D4>
+<76EE> <76EE> <D9CD>
+<76F2> <76F2> <D8EE>
+<76F4> <76F4> <F2C1>
+<76F8> <76F8> <DFD3>
+<76FC> <76FC> <DAF0>
+<76FE> <76FE> <E2EA>
+<7701> <7701> <E0FD>
+<7704> <7704> <D8F8>
+<7708> <7708> <F7AF>
+<7709> <7709> <DAB6>
+<770B> <770B> <CAD7>
+<771E> <771E> <F2D8>
+<7720> <7720> <D8F9>
+<7729> <7729> <FADF>
+<7737> <7737> <CFEF>
+<7738> <7738> <D9C2>
+<773A> <773A> <F0D2>
+<773C> <773C> <E4D1>
+<7740> <7740> <F3B7>
+<774D> <774D> <FAE0>
+<775B> <775B> <EFEC>
+<7761> <7761> <E2B2>
+<7763> <7763> <D4BD>
+<7766> <7766> <D9CE>
+<776B> <776B> <F4E2>
+<7779> <7779> <D4A9>
+<777E> <777E> <CDC2>
+<777F> <777F> <E7DA>
+<778B> <778B> <F2D9>
+<7791> <7791> <D9AA>
+<779E> <779E> <D8BE>
+<77A5> <77A5> <DCAD>
+<77AC> <77AC> <E2EB>
+<77AD> <77AD> <D6FC>
+<77B0> <77B0> <CAF9>
+<77B3> <77B3> <D4DA>
+<77BB> <77BB> <F4D7>
+<77BC> <77BC> <CCA1>
+<77BF> <77BF> <CFBA>
+<77D7> <77D7> <F5B8>
+<77DB> <77DB> <D9C3>
+<77DC> <77DC> <D0E8>
+<77E2> <77E2> <E3C5>
+<77E3> <77E3> <EBF8>
+<77E5> <77E5> <F2B1>
+<77E9> <77E9> <CFBB>
+<77ED> <77ED> <D3AD>
+<77EE> <77EE> <E8E1>
+<77EF> <77EF> <CEEC>
+<77F3> <77F3> <E0B4>
+<7802> <7802> <DEE3>
+<7812> <7812> <DDF7>
+<7825> <7825> <F2B2>
+<7826> <7826> <F3F6>
+<7827> <7827> <F6DB>
+<782C> <782C> <D7FE>
+<7832> <7832> <F8DF>
+<7834> <7834> <F7F2>
+<7845> <7845> <D0A9>
+<784F> <784F> <E6DA>
+<785D> <785D> <F5A6>
+<786B> <786B> <D7BC>
+<786C> <786C> <CCE3>
+<786F> <786F> <E6DB>
+<787C> <787C> <DDDD>
+<7881> <7881> <D1B3>
+<7887> <7887> <EFED>
+<788C> <788C> <D6DE>
+<788D> <788D> <E4F4>
+<788E> <788E> <E1EF>
+<7891> <7891> <DDF8>
+<7897> <7897> <E8CF>
+<78A3> <78A3> <CAE5>
+<78A7> <78A7> <DCA1>
+<78A9> <78A9> <E0B5>
+<78BA> <78BB> <FCAC>
+<78BC> <78BC> <D8A7>
+<78C1> <78C1> <EDB8>
+<78C5> <78C5> <DBB6>
+<78CA> <78CA> <D6F0>
+<78CB> <78CB> <F3AF>
+<78CE> <78CE> <CDA5>
+<78D0> <78D0> <DAF1>
+<78E8> <78E8> <D8A8>
+<78EC> <78EC> <CCE4>
+<78EF> <78EF> <D1B4>
+<78F5> <78F5> <CAD8>
+<78FB> <78FB> <DAF2>
+<7901> <7901> <F5A7>
+<790E> <790E> <F5A8>
+<7916> <7916> <E6A6>
+<792A> <792A> <D5EC>
+<792B> <792B> <D5F8>
+<792C> <792C> <DAF3>
+<793A> <793A> <E3C6>
+endbfrange
+
+100 beginbfrange
+<793E> <793E> <DEE4>
+<7940> <7940> <DEE5>
+<7941> <7941> <D1B5>
+<7947> <7948> <D1B6>
+<7949> <7949> <F2B3>
+<7950> <7950> <E9DE>
+<7956> <7956> <F0D3>
+<7957> <7957> <F2B4>
+<795A> <795A> <F0D4>
+<795B> <795B> <CBE4>
+<795C> <795C> <FBD4>
+<795D> <795D> <F5E6>
+<795E> <795E> <E3EA>
+<7960> <7960> <DEE6>
+<7965> <7965> <DFD4>
+<7968> <7968> <F8F9>
+<796D> <796D> <F0AE>
+<797A> <797A> <D1B8>
+<797F> <797F> <D6DF>
+<7981> <7981> <D0D7>
+<798D> <798D> <FCA1>
+<798E> <798E> <EFEE>
+<798F> <798F> <DCD8>
+<7991> <7991> <E9DF>
+<79A6> <79A6> <E5DD>
+<79A7> <79A7> <FDFB>
+<79AA> <79AA> <E0C9>
+<79AE> <79AE> <D6C9>
+<79B1> <79B1> <D4AA>
+<79B3> <79B3> <E5CC>
+<79B9> <79B9> <E9E0>
+<79BD> <79BD> <D0D8>
+<79BE> <79BE> <FCA2>
+<79BF> <79BF> <D4BE>
+<79C0> <79C0> <E2B3>
+<79C1> <79C1> <DEE7>
+<79C9> <79C9> <DCBC>
+<79CA> <79CA> <D2B6>
+<79CB> <79CB> <F5D5>
+<79D1> <79D1> <CEA1>
+<79D2> <79D2> <F5A9>
+<79D5> <79D5> <DDF9>
+<79D8> <79D8> <DDFA>
+<79DF> <79DF> <F0D5>
+<79E4> <79E4> <F6DF>
+<79E6> <79E6> <F2DA>
+<79E7> <79E7> <E4EB>
+<79E9> <79E9> <F2F1>
+<79FB> <79FB> <ECB9>
+<7A00> <7A00> <FDFC>
+<7A05> <7A05> <E1AA>
+<7A08> <7A08> <CAD9>
+<7A0B> <7A0B> <EFEF>
+<7A0D> <7A0D> <F5AA>
+<7A14> <7A14> <ECF9>
+<7A17> <7A17> <F8AD>
+<7A19> <7A19> <F2C2>
+<7A1A> <7A1A> <F6C3>
+<7A1C> <7A1C> <D7D2>
+<7A1F> <7A1F> <F9A2>
+<7A20> <7A20> <F0D6>
+<7A2E> <7A2E> <F0FA>
+<7A31> <7A31> <F6E0>
+<7A36> <7A36> <E9F3>
+<7A37> <7A37> <F2C3>
+<7A3B> <7A3B> <D4AB>
+<7A3C> <7A3C> <CAB3>
+<7A3D> <7A3D> <CDA6>
+<7A3F> <7A3F> <CDC3>
+<7A40> <7A40> <CDDA>
+<7A46> <7A46> <D9CF>
+<7A49> <7A49> <F6C4>
+<7A4D> <7A4D> <EEDD>
+<7A4E> <7A4E> <E7C4>
+<7A57> <7A57> <E2B4>
+<7A61> <7A61> <DFE2>
+<7A62> <7A62> <E7DB>
+<7A69> <7A69> <E8B1>
+<7A6B> <7A6B> <FCAE>
+<7A70> <7A70> <E5CD>
+<7A74> <7A74> <FAEB>
+<7A76> <7A76> <CFBC>
+<7A79> <7A79> <CFE2>
+<7A7A> <7A7A> <CDF6>
+<7A7D> <7A7D> <EFF0>
+<7A7F> <7A7F> <F4BE>
+<7A81> <7A81> <D4CD>
+<7A84> <7A84> <F3B8>
+<7A88> <7A88> <E9A1>
+<7A92> <7A92> <F2F2>
+<7A93> <7A93> <F3EB>
+<7A95> <7A95> <F0D7>
+<7A98> <7A98> <CFD7>
+<7A9F> <7A9F> <CFDF>
+<7AA9> <7AAA> <E8C0>
+<7AAE> <7AAE> <CFE3>
+<7AAF> <7AAF> <E9A2>
+<7ABA> <7ABA> <D0AA>
+<7AC4> <7AC4> <F3C1>
+<7AC5> <7AC5> <D0AB>
+endbfrange
+
+100 beginbfrange
+<7AC7> <7AC7> <D4E4>
+<7ACA> <7ACA> <EFBC>
+<7ACB> <7ACB> <D8A1>
+<7AD7> <7AD7> <D9DF>
+<7AD9> <7AD9> <F3D7>
+<7ADD> <7ADD> <DCBD>
+<7ADF> <7ADF> <CCE5>
+<7AE0> <7AE0> <EDF1>
+<7AE3> <7AE3> <F1E2>
+<7AE5> <7AE5> <D4DB>
+<7AEA> <7AEA> <E2B5>
+<7AED> <7AED> <CAE6>
+<7AEF> <7AEF> <D3AE>
+<7AF6> <7AF6> <CCE6>
+<7AF9> <7AF9> <F1D3>
+<7AFA> <7AFA> <F5E7>
+<7AFF> <7AFF> <CADA>
+<7B0F> <7B0F> <FBEE>
+<7B11> <7B11> <E1C5>
+<7B19> <7B19> <DFE9>
+<7B1B> <7B1B> <EEDE>
+<7B1E> <7B1E> <F7C2>
+<7B20> <7B20> <D8A2>
+<7B26> <7B26> <DDAC>
+<7B2C> <7B2C> <F0AF>
+<7B2D> <7B2D> <D6BD>
+<7B39> <7B39> <E1AB>
+<7B46> <7B46> <F9B6>
+<7B49> <7B49> <D4F5>
+<7B4B> <7B4B> <D0C9>
+<7B4C> <7B4C> <EFA7>
+<7B4D> <7B4D> <E2EC>
+<7B4F> <7B4F> <DBEA>
+<7B50> <7B50> <CECC>
+<7B51> <7B51> <F5E8>
+<7B52> <7B52> <F7D5>
+<7B54> <7B54> <D3CD>
+<7B56> <7B56> <F3FE>
+<7B60> <7B60> <D0B5>
+<7B6C> <7B6C> <E0FE>
+<7B6E> <7B6E> <DFFB>
+<7B75> <7B75> <E6DD>
+<7B7D> <7B7D> <E8A4>
+<7B87> <7B87> <CBCD>
+<7B8B> <7B8B> <EFA8>
+<7B8F> <7B8F> <EEB4>
+<7B94> <7B94> <DAD8>
+<7B95> <7B95> <D1B9>
+<7B97> <7B97> <DFA9>
+<7B9A> <7B9A> <F3B0>
+<7B9D> <7B9D> <CCC4>
+<7BA1> <7BA1> <CEB7>
+<7BAD> <7BAD> <EFA9>
+<7BB1> <7BB1> <DFD5>
+<7BB4> <7BB4> <EDD7>
+<7BB8> <7BB8> <EEC6>
+<7BC0> <7BC0> <EFBD>
+<7BC1> <7BC1> <FCD6>
+<7BC4> <7BC4> <DBF4>
+<7BC6> <7BC6> <EFAA>
+<7BC7> <7BC7> <F8B9>
+<7BC9> <7BC9> <F5E9>
+<7BD2> <7BD2> <E3D9>
+<7BE0> <7BE0> <E1C6>
+<7BE4> <7BE4> <D4BF>
+<7BE9> <7BE9> <DEE8>
+<7C07> <7C07> <F0EA>
+<7C12> <7C12> <F3C2>
+<7C1E> <7C1E> <D3AF>
+<7C21> <7C21> <CADB>
+<7C27> <7C27> <FCD7>
+<7C2A> <7C2A> <EDD8>
+<7C2B> <7C2B> <E1C7>
+<7C3D> <7C3D> <F4D8>
+<7C3E> <7C3E> <D6B3>
+<7C3F> <7C3F> <DDAD>
+<7C43> <7C43> <D5BE>
+<7C4C> <7C4C> <F1C3>
+<7C4D> <7C4D> <EEDF>
+<7C60> <7C60> <D6EB>
+<7C64> <7C64> <F4D9>
+<7C6C> <7C6C> <D7E6>
+<7C73> <7C73> <DAB7>
+<7C83> <7C83> <DDFB>
+<7C89> <7C89> <DDCF>
+<7C92> <7C92> <D8A3>
+<7C95> <7C95> <DAD9>
+<7C97> <7C97> <F0D8>
+<7C98> <7C98> <EFC4>
+<7C9F> <7C9F> <E1D8>
+<7CA5> <7CA5> <F1D4>
+<7CA7> <7CA7> <EDF2>
+<7CAE> <7CAE> <D5DB>
+<7CB1> <7CB1> <D5DC>
+<7CB2> <7CB2> <F3C4>
+<7CB3> <7CB3> <CBD7>
+<7CB9> <7CB9> <E2B6>
+<7CBE> <7CBE> <EFF1>
+<7CCA> <7CCA> <FBD5>
+<7CD6> <7CD6> <D3D8>
+endbfrange
+
+100 beginbfrange
+<7CDE> <7CDE> <DDD0>
+<7CDF> <7CDF> <F0D9>
+<7CE0> <7CE0> <CBB3>
+<7CE7> <7CE7> <D5DD>
+<7CFB> <7CFB> <CDA7>
+<7CFE> <7CFE> <D0AC>
+<7D00> <7D00> <D1BA>
+<7D02> <7D02> <F1C4>
+<7D04> <7D04> <E5B3>
+<7D05> <7D05> <FBF5>
+<7D06> <7D06> <E9E1>
+<7D07> <7D07> <FDE0>
+<7D08> <7D08> <FCBC>
+<7D0A> <7D0B> <DAA2>
+<7D0D> <7D0D> <D2A1>
+<7D10> <7D10> <D2EF>
+<7D14> <7D14> <E2ED>
+<7D17> <7D17> <DEE9>
+<7D18> <7D18> <CEDC>
+<7D19> <7D19> <F2B5>
+<7D1A> <7D1A> <D0E4>
+<7D1B> <7D1B> <DDD1>
+<7D20> <7D20> <E1C8>
+<7D21> <7D21> <DBB7>
+<7D22> <7D22> <DFE3>
+<7D2B> <7D2B> <EDB9>
+<7D2C> <7D2C> <F1C5>
+<7D2E> <7D2E> <F3CF>
+<7D2F> <7D2F> <D7AB>
+<7D30> <7D30> <E1AC>
+<7D33> <7D33> <E3EB>
+<7D35> <7D35> <EEC7>
+<7D39> <7D39> <E1C9>
+<7D3A> <7D3A> <CAFA>
+<7D42> <7D42> <F0FB>
+<7D43> <7D43> <FAE1>
+<7D44> <7D44> <F0DA>
+<7D45> <7D45> <CCE7>
+<7D46> <7D46> <DAF4>
+<7D50> <7D50> <CCBF>
+<7D5E> <7D5E> <CEED>
+<7D61> <7D61> <D5A9>
+<7D62> <7D62> <FAE2>
+<7D66> <7D66> <D0E5>
+<7D68> <7D68> <EBD6>
+<7D6A> <7D6A> <ECDF>
+<7D6E> <7D6E> <DFFC>
+<7D71> <7D71> <F7D6>
+<7D72> <7D72> <DEEA>
+<7D73> <7D73> <CBB4>
+<7D76> <7D76> <EFBE>
+<7D79> <7D79> <CCB5>
+<7D7F> <7D7F> <CFBD>
+<7D8E> <7D8E> <EFF2>
+<7D8F> <7D8F> <E2B7>
+<7D93> <7D93> <CCE8>
+<7D9C> <7D9C> <F0FC>
+<7DA0> <7DA0> <D6E0>
+<7DA2> <7DA2> <F1C6>
+<7DAC> <7DAC> <E2B8>
+<7DAD> <7DAD> <EBAB>
+<7DB1> <7DB1> <CBB5>
+<7DB2> <7DB2> <D8D1>
+<7DB4> <7DB4> <F4CE>
+<7DB5> <7DB5> <F3F7>
+<7DB8> <7DB8> <D7C6>
+<7DBA> <7DBA> <D1BB>
+<7DBB> <7DBB> <F7AA>
+<7DBD> <7DBD> <EDCA>
+<7DBE> <7DBE> <D7D3>
+<7DBF> <7DBF> <D8FA>
+<7DC7> <7DC7> <F6C5>
+<7DCA> <7DCA> <D1CC>
+<7DCB> <7DCB> <DDFC>
+<7DD6> <7DD6> <DFFD>
+<7DD8> <7DD8> <F9E5>
+<7DDA> <7DDA> <E0CA>
+<7DDD> <7DDD> <F2FD>
+<7DDE> <7DDE> <D3B0>
+<7DE0> <7DE0> <F4F3>
+<7DE1> <7DE1> <DAC9>
+<7DE3> <7DE3> <E6DE>
+<7DE8> <7DE8> <F8BA>
+<7DE9> <7DE9> <E8D0>
+<7DEC> <7DEC> <D8FB>
+<7DEF> <7DEF> <EAD5>
+<7DF4> <7DF4> <D6A3>
+<7DFB> <7DFB> <F6C6>
+<7E09> <7E09> <F2DB>
+<7E0A> <7E0A> <E4FC>
+<7E15> <7E15> <E8B2>
+<7E1B> <7E1B> <DADA>
+<7E1D> <7E1D> <F2DC>
+<7E1E> <7E1E> <FBD6>
+<7E1F> <7E1F> <E9B2>
+<7E21> <7E21> <EEAD>
+<7E23> <7E23> <FAE3>
+<7E2B> <7E2B> <DCEE>
+<7E2E> <7E2E> <F5EA>
+<7E2F> <7E2F> <E6E0>
+endbfrange
+
+100 beginbfrange
+<7E31> <7E31> <F0FD>
+<7E37> <7E37> <D7AC>
+<7E3D> <7E3D> <F5C5>
+<7E3E> <7E3E> <EEE0>
+<7E41> <7E41> <DBE5>
+<7E43> <7E43> <DDDE>
+<7E46> <7E46> <D9F0>
+<7E47> <7E47> <E9A3>
+<7E52> <7E52> <F1F9>
+<7E54> <7E54> <F2C4>
+<7E55> <7E55> <E0CB>
+<7E5E> <7E5E> <E9A4>
+<7E61> <7E61> <E2B9>
+<7E69> <7E69> <E3B1>
+<7E6A> <7E6A> <FCEB>
+<7E6B> <7E6B> <CDA8>
+<7E6D> <7E6D> <CCB6>
+<7E70> <7E70> <F0DB>
+<7E79> <7E79> <E6BA>
+<7E7C> <7E7C> <CDA9>
+<7E82> <7E82> <F3C3>
+<7E8C> <7E8C> <E1D9>
+<7E8F> <7E8F> <EFAB>
+<7E93> <7E93> <E7C5>
+<7E96> <7E96> <E0E9>
+<7E98> <7E98> <F3C5>
+<7E9B> <7E9B> <D4C0>
+<7E9C> <7E9C> <D5BF>
+<7F36> <7F36> <DDAE>
+<7F38> <7F38> <F9FC>
+<7F3A> <7F3A> <CCC0>
+<7F4C> <7F4C> <E5A2>
+<7F50> <7F50> <CEB8>
+<7F54> <7F54> <D8D2>
+<7F55> <7F55> <F9D6>
+<7F6A> <7F6A> <F1AA>
+<7F6B> <7F6B> <CED1>
+<7F6E> <7F6E> <F6C7>
+<7F70> <7F70> <DBEB>
+<7F72> <7F72> <DFFE>
+<7F75> <7F75> <D8E1>
+<7F77> <7F77> <F7F3>
+<7F79> <7F79> <D7E7>
+<7F85> <7F85> <D4FE>
+<7F88> <7F88> <D1BC>
+<7F8A> <7F8A> <E5CF>
+<7F8C> <7F8C> <CBB6>
+<7F8E> <7F8E> <DAB8>
+<7F94> <7F94> <CDC4>
+<7F9A> <7F9A> <D6BE>
+<7F9E> <7F9E> <E2BA>
+<7FA4> <7FA4> <CFD8>
+<7FA8> <7FA8> <E0CC>
+<7FA9> <7FA9> <EBF9>
+<7FB2> <7FB2> <FDFD>
+<7FB8> <7FB8> <D7E8>
+<7FB9> <7FB9> <CBD8>
+<7FBD> <7FBD> <E9E2>
+<7FC1> <7FC1> <E8BA>
+<7FC5> <7FC5> <E3C7>
+<7FCA> <7FCA> <ECCD>
+<7FCC> <7FCC> <ECCE>
+<7FCE> <7FCE> <D6BF>
+<7FD2> <7FD2> <E3A7>
+<7FD4> <7FD4> <DFD6>
+<7FD5> <7FD5> <FDE8>
+<7FDF> <7FDF> <EEE1>
+<7FE0> <7FE0> <F6A8>
+<7FE1> <7FE1> <DDFD>
+<7FE9> <7FE9> <F8BB>
+<7FEB> <7FEB> <E8D1>
+<7FF0> <7FF0> <F9D7>
+<7FF9> <7FF9> <CEEE>
+<7FFC> <7FFC> <ECCF>
+<8000> <8000> <E9A5>
+<8001> <8001> <D6D5>
+<8003> <8003> <CDC5>
+<8005> <8005> <EDBA>
+<8006> <8006> <D1BD>
+<8009> <8009> <CFBE>
+<800C> <800C> <ECBB>
+<8010> <8010> <D2B1>
+<8015> <8015> <CCE9>
+<8017> <8017> <D9C4>
+<8018> <8018> <E9FC>
+<802D> <802D> <D1BE>
+<8033> <8033> <ECBC>
+<8036> <8036> <E5AD>
+<803D> <803D> <F7B0>
+<803F> <803F> <CCEA>
+<8043> <8043> <D3C4>
+<8046> <8046> <D6C0>
+<804A> <804A> <D6FD>
+<8056> <8056> <E1A1>
+<8058> <8058> <DEBD>
+<805A> <805A> <F6A9>
+<805E> <805E> <DAA4>
+<806F> <806F> <D6A4>
+<8070> <8070> <F5C6>
+<8072> <8072> <E1A2>
+endbfrange
+
+100 beginbfrange
+<8073> <8073> <E9C6>
+<8077> <8077> <F2C5>
+<807D> <807D> <F4E9>
+<807E> <807E> <D6EC>
+<807F> <807F> <EBD3>
+<8084> <8084> <ECBD>
+<8085> <8085> <E2DC>
+<8086> <8086> <DEEB>
+<8087> <8087> <F0DC>
+<8089> <8089> <EBBF>
+<808B> <808B> <D7CE>
+<808C> <808C> <D1BF>
+<8096> <8096> <F5AB>
+<809B> <809B> <F9FD>
+<809D> <809D> <CADC>
+<80A1> <80A1> <CDC6>
+<80A2> <80A2> <F2B6>
+<80A5> <80A5> <DDFE>
+<80A9> <80A9> <CCB7>
+<80AA> <80AA> <DBB8>
+<80AF> <80AF> <D0E9>
+<80B1> <80B1> <CEDD>
+<80B2> <80B2> <EBC0>
+<80B4> <80B4> <FDA2>
+<80BA> <80BA> <F8CB>
+<80C3> <80C3> <EAD6>
+<80C4> <80C4> <F1B0>
+<80CC> <80CC> <DBCE>
+<80CE> <80CE> <F7C3>
+<80DA> <80DA> <DBCF>
+<80DB> <80DB> <CBA4>
+<80DE> <80DE> <F8E0>
+<80E1> <80E1> <FBD7>
+<80E4> <80E4> <EBCA>
+<80E5> <80E5> <E0A1>
+<80F1> <80F1> <CECD>
+<80F4> <80F4> <D4DC>
+<80F8> <80F8> <FDD8>
+<80FD> <80FD> <D2F6>
+<8102> <8102> <F2B7>
+<8105> <8105> <FAF6>
+<8106> <8106> <F6AA>
+<8107> <8107> <FAF7>
+<8108> <8108> <D8E6>
+<810A> <810A> <F4B1>
+<8118> <8118> <E8D2>
+<811A> <811A> <CAC5>
+<811B> <811B> <CCEB>
+<8123> <8123> <E2EE>
+<8129> <8129> <E2BB>
+<812B> <812B> <F7AD>
+<812F> <812F> <F8E1>
+<8139> <8139> <F3EC>
+<813E> <813E> <DEA1>
+<814B> <814B> <E4FD>
+<814E> <814E> <E3EC>
+<8150> <8151> <DDAF>
+<8154> <8154> <CBB7>
+<8155> <8155> <E8D3>
+<8165> <8165> <E1A3>
+<8166> <8166> <D2E0>
+<816B> <816B> <F0FE>
+<8170> <8170> <E9A6>
+<8171> <8171> <CBF2>
+<8178> <8178> <EDF3>
+<8179> <8179> <DCD9>
+<817A> <817A> <E0CD>
+<817F> <817F> <F7DA>
+<8180> <8180> <DBB9>
+<8188> <8188> <CCAE>
+<818A> <818A> <DADB>
+<818F> <818F> <CDC7>
+<819A> <819A> <DDB1>
+<819C> <819C> <D8AF>
+<819D> <819D> <E3A3>
+<81A0> <81A0> <CEEF>
+<81A3> <81A3> <F2F3>
+<81A8> <81A8> <F8B3>
+<81B3> <81B3> <E0CE>
+<81B5> <81B5> <F5FD>
+<81BA> <81BA> <EBEC>
+<81BD> <81BD> <D3C5>
+<81BE> <81BE> <FCEC>
+<81BF> <81BF> <D2DB>
+<81C0> <81C0> <D4EB>
+<81C2> <81C2> <DEA2>
+<81C6> <81C6> <E5E6>
+<81CD> <81CD> <F0B0>
+<81D8> <81D8> <D5C4>
+<81DF> <81DF> <EDF4>
+<81E3> <81E3> <E3ED>
+<81E5> <81E5> <E8C2>
+<81E7> <81E7> <EDF5>
+<81E8> <81E8> <D7FC>
+<81EA> <81EA> <EDBB>
+<81ED> <81ED> <F6AB>
+<81F3> <81F3> <F2B8>
+<81F4> <81F4> <F6C8>
+<81FA> <81FA> <D3E6>
+<81FB> <81FB> <F2DD>
+endbfrange
+
+100 beginbfrange
+<81FC> <81FC> <CFBF>
+<81FE> <81FE> <EBAC>
+<8205> <8205> <CFC0>
+<8207> <8207> <E6A8>
+<8208> <8208> <FDE9>
+<820A> <820A> <CFC1>
+<820C> <820C> <E0DF>
+<820D> <820D> <DEEC>
+<8212> <8212> <E0A2>
+<821B> <821B> <F4BF>
+<821C> <821C> <E2EF>
+<821E> <821E> <D9F1>
+<821F> <821F> <F1C7>
+<8221> <8221> <CBB8>
+<822A> <822A> <F9FE>
+<822B> <822B> <DBBA>
+<822C> <822C> <DAF5>
+<8235> <8235> <F6EC>
+<8236> <8236> <DADC>
+<8237> <8237> <FAE4>
+<8239> <8239> <E0CF>
+<8240> <8240> <DDB2>
+<8245> <8245> <E6A9>
+<8247> <8247> <EFF3>
+<8259> <8259> <F3ED>
+<8264> <8264> <EBFA>
+<8266> <8266> <F9E6>
+<826E> <826E> <CADD>
+<826F> <826F> <D5DE>
+<8271> <8271> <CADE>
+<8272> <8272> <DFE4>
+<8276> <8276> <E6FD>
+<8278> <8278> <F5AC>
+<827E> <827E> <E4F5>
+<828B> <828B> <E9E3>
+<828D> <828D> <EDCB>
+<828E> <828E> <CFE4>
+<8292> <8292> <D8D3>
+<8299> <8299> <DDB3>
+<829A> <829A> <D4EC>
+<829D> <829D> <F2B9>
+<829F> <829F> <DFB7>
+<82A5> <82A5> <CBCE>
+<82A6> <82A6> <FBD8>
+<82A9> <82A9> <D0D9>
+<82AC> <82AC> <DDD2>
+<82AD> <82AD> <F7F4>
+<82AE> <82AE> <E7DC>
+<82AF> <82AF> <E4A5>
+<82B1> <82B1> <FCA3>
+<82B3> <82B3> <DBBB>
+<82B7> <82B7> <F2BA>
+<82B8> <82B8> <E9FD>
+<82B9> <82B9> <D0CA>
+<82BB> <82BB> <F5D6>
+<82BC> <82BC> <D9C5>
+<82BD> <82BD> <E4B4>
+<82BF> <82BF> <EDA7>
+<82D1> <82D1> <EABD>
+<82D2> <82D2> <E6FE>
+<82D4> <82D4> <F7C4>
+<82D5> <82D5> <F5AD>
+<82D7> <82D7> <D9E0>
+<82DB> <82DB> <CAB4>
+<82DE> <82DE> <F8E2>
+<82DF> <82DF> <CFC2>
+<82E1> <82E1> <ECBE>
+<82E5> <82E5> <E5B4>
+<82E6> <82E6> <CDC8>
+<82E7> <82E7> <EEC8>
+<82F1> <82F1> <E7C8>
+<82FD> <82FD> <CDC9>
+<82FE> <82FE> <F9B7>
+<8301> <8301> <F1E8>
+<8302> <8302> <D9F2>
+<8303> <8303> <DBF5>
+<8304> <8304> <CAB5>
+<8305> <8305> <D9C6>
+<8309> <8309> <D8C9>
+<8317> <8317> <D9AB>
+<8328> <8328> <EDBC>
+<832B> <832B> <D8D4>
+<832F> <832F> <DCDA>
+<8331> <8331> <E2BC>
+<8334> <8334> <FCED>
+<8335> <8335> <ECE0>
+<8336> <8336> <D2FE>
+<8338> <8338> <E9C7>
+<8339> <8339> <E6AA>
+<8340> <8340> <E2F0>
+<8347> <8347> <FABB>
+<8349> <8349> <F5AE>
+<834A> <834A> <FBAA>
+<834F> <834F> <ECFB>
+<8351> <8351> <ECBF>
+<8352> <8352> <FCD8>
+<8373> <8373> <D4E5>
+<8377> <8377> <F9C3>
+<837B> <837B> <EEE2>
+<8389> <8389> <D7E9>
+endbfrange
+
+100 beginbfrange
+<838A> <838A> <EDF6>
+<838E> <838E> <DEED>
+<8396> <8396> <CCEC>
+<8398> <8398> <E3EE>
+<839E> <839E> <E8D4>
+<83A2> <83A2> <FAF8>
+<83A9> <83A9> <DDB4>
+<83AA> <83AA> <E4B5>
+<83AB> <83AB> <D8B0>
+<83BD> <83BD> <D8D5>
+<83C1> <83C1> <F4EA>
+<83C5> <83C5> <CEB9>
+<83C9> <83C9> <D6E1>
+<83CA> <83CA> <CFD2>
+<83CC> <83CC> <D0B6>
+<83D3> <83D3> <CEA2>
+<83D6> <83D6> <F3EE>
+<83DC> <83DC> <F3F8>
+<83E9> <83E9> <DCCC>
+<83EB> <83EB> <D0CB>
+<83EF> <83EF> <FCA4>
+<83F0> <83F0> <CDCA>
+<83F1> <83F1> <D7D4>
+<83F2> <83F2> <DEA3>
+<83F4> <83F4> <E4E0>
+<83F9> <83F9> <EEC9>
+<83FD> <83FD> <E2DD>
+<8403> <8403> <F5FE>
+<8404> <8404> <D4AC>
+<840A> <840A> <D5D1>
+<840C> <840C> <D8F0>
+<840D> <840D> <F8C3>
+<840E> <840E> <EAD7>
+<8429> <8429> <F5D7>
+<842C> <842C> <D8BF>
+<8431> <8431> <FDC0>
+<8438> <8438> <EBAD>
+<843D> <843D> <D5AA>
+<8449> <8449> <E7A8>
+<8457> <8457> <EECA>
+<845B> <845B> <CAE7>
+<8461> <8461> <F8E3>
+<8463> <8463> <D4DD>
+<8466> <8466> <EAD8>
+<846B> <846B> <FBD9>
+<846C> <846C> <EDF7>
+<846F> <846F> <E5B5>
+<8475> <8475> <D0AD>
+<847A> <847A> <F1F1>
+<8490> <8490> <E2BD>
+<8494> <8494> <E3C8>
+<8499> <8499> <D9D5>
+<849C> <849C> <DFAA>
+<84A1> <84A1> <DBBC>
+<84B2> <84B2> <F8E4>
+<84B8> <84B8> <F1FA>
+<84BB> <84BB> <E5B6>
+<84BC> <84BC> <F3EF>
+<84BF> <84BF> <FBDA>
+<84C0> <84C0> <E1E0>
+<84C2> <84C2> <D9AC>
+<84C4> <84C4> <F5EB>
+<84C6> <84C6> <E0B6>
+<84C9> <84C9> <E9C8>
+<84CB> <84CB> <CBCF>
+<84CD> <84CD> <E3C9>
+<84D1> <84D1> <DEEE>
+<84DA> <84DA> <E2BE>
+<84EC> <84EC> <DCEF>
+<84EE> <84EE> <D6A5>
+<84F4> <84F4> <E2F1>
+<84FC> <84FC> <D6FE>
+<8511> <8511> <D9A1>
+<8513> <8513> <D8C0>
+<8514> <8514> <DCDB>
+<8517> <8517> <EDBD>
+<8518> <8518> <DFB8>
+<851A> <851A> <EAA5>
+<851E> <851E> <D7AD>
+<8521> <8521> <F3F9>
+<8523> <8523> <EDF8>
+<8525> <8525> <F5C7>
+<852C> <852C> <E1CA>
+<852D> <852D> <EBE3>
+<852F> <852F> <F2DE>
+<853D> <853D> <F8CC>
+<853F> <853F> <EAD9>
+<8541> <8541> <D3C6>
+<8543> <8543> <DBE6>
+<8549> <8549> <F5AF>
+<854E> <854E> <CEF0>
+<8553> <8553> <E9FE>
+<8559> <8559> <FBB6>
+<8563> <8563> <E2F2>
+<8568> <8568> <CFF2>
+<8569> <8569> <F7B9>
+<856A> <856A> <D9F3>
+<856D> <856D> <E1CB>
+<8584> <8584> <DADD>
+<8587> <8587> <DAB9>
+endbfrange
+
+100 beginbfrange
+<858F> <858F> <EBFB>
+<8591> <8591> <CBB9>
+<8594> <8594> <EDF9>
+<859B> <859B> <E0E0>
+<85A6> <85A6> <F4C0>
+<85A8> <85A8> <FDBC>
+<85A9> <85A9> <DFB1>
+<85AA> <85AA> <E3EF>
+<85AF> <85AF> <E0A3>
+<85B0> <85B0> <FDB9>
+<85BA> <85BA> <F0B1>
+<85C1> <85C1> <CDCB>
+<85C9> <85C9> <EDBE>
+<85CD> <85CD> <D5C0>
+<85CE> <85CE> <E3F0>
+<85CF> <85CF> <EDFA>
+<85D5> <85D5> <E9E4>
+<85DC> <85DC> <D5ED>
+<85DD> <85DD> <E7DD>
+<85E4> <85E4> <D4F6>
+<85E5> <85E5> <E5B7>
+<85E9> <85E9> <DBE7>
+<85EA> <85EA> <E2BF>
+<85F7> <85F7> <EECB>
+<85FA> <85FA> <D7F4>
+<85FB> <85FB> <F0DD>
+<85FF> <85FF> <CEAB>
+<8602> <8602> <E7DE>
+<8606> <8606> <D6D6>
+<8607> <8607> <E1CC>
+<860A> <860A> <E8B3>
+<8616> <8616> <E5EE>
+<8617> <8617> <DCA2>
+<861A> <861A> <E0D0>
+<862D> <862D> <D5B5>
+<863F> <863F> <D5A1>
+<864E> <864E> <FBDB>
+<8650> <8650> <F9CB>
+<8654> <8654> <CBF3>
+<8655> <8655> <F4A5>
+<865B> <865B> <FAC8>
+<865C> <865C> <D6D7>
+<865E> <865E> <E9E5>
+<865F> <865F> <FBDC>
+<8667> <8667> <FDD0>
+<8679> <8679> <FBF6>
+<868A> <868A> <DAA5>
+<868C> <868C> <DBBD>
+<8693> <8693> <ECE2>
+<86A3> <86A3> <CDF7>
+<86A4> <86A4> <F0DE>
+<86A9> <86A9> <F6C9>
+<86C7> <86C7> <DEEF>
+<86CB> <86CB> <D3B1>
+<86D4> <86D4> <FCEE>
+<86D9> <86D9> <E8C3>
+<86DB> <86DB> <F1C8>
+<86DF> <86DF> <CEF1>
+<86E4> <86E4> <F9ED>
+<86ED> <86ED> <F2F4>
+<86FE> <86FE> <E4B6>
+<8700> <8700> <F5B9>
+<8702> <8702> <DCF0>
+<8703> <8703> <E3F1>
+<8708> <8708> <E8A5>
+<8718> <8718> <F2BB>
+<871A> <871A> <DEA4>
+<871C> <871C> <DACC>
+<874E> <874E> <CAE9>
+<8755> <8755> <E3DA>
+<8757> <8757> <FCD9>
+<875F> <875F> <EADA>
+<8766> <8766> <F9C4>
+<8768> <8768> <E3A4>
+<8774> <8774> <FBDD>
+<8776> <8776> <EFCA>
+<8778> <8778> <E8C4>
+<8782> <8782> <D5CC>
+<878D> <878D> <EBD7>
+<879F> <879F> <D9AD>
+<87A2> <87A2> <FBAB>
+<87B3> <87B3> <D3D9>
+<87BA> <87BA> <D5A2>
+<87C4> <87C4> <F6DE>
+<87E0> <87E0> <DAF6>
+<87EC> <87EC> <E0D1>
+<87EF> <87EF> <E9A8>
+<87F2> <87F2> <F5F9>
+<87F9> <87F9> <FAAF>
+<87FB> <87FB> <EBFC>
+<87FE> <87FE> <E0EA>
+<8805> <8805> <E3B2>
+<881F> <881F> <D5C5>
+<8822> <8822> <F1E3>
+<8823> <8823> <D5EE>
+<8831> <8831> <CDCC>
+<8836> <8836> <EDD9>
+<883B> <883B> <D8C1>
+<8840> <8840> <FAEC>
+<8846> <8846> <F1EB>
+endbfrange
+
+100 beginbfrange
+<884C> <884C> <FABC>
+<884D> <884D> <E6E2>
+<8852> <8852> <FAE5>
+<8853> <8853> <E2FA>
+<8857> <8857> <CAB6>
+<8859> <8859> <E4B7>
+<885B> <885B> <EADB>
+<885D> <885D> <F5FA>
+<8861> <8861> <FBAC>
+<8862> <8862> <CFC3>
+<8863> <8863> <EBFD>
+<8868> <8868> <F8FA>
+<886B> <886B> <DFB9>
+<8870> <8870> <E1F1>
+<8872> <8872> <D2A4>
+<8877> <8877> <F5FB>
+<887E> <887F> <D0DA>
+<8881> <8881> <EABE>
+<8882> <8882> <D9B1>
+<8888> <8888> <CAB7>
+<888B> <888B> <D3E7>
+<888D> <888D> <F8E5>
+<8892> <8892> <D3B2>
+<8896> <8896> <E2C0>
+<8897> <8897> <F2DF>
+<889E> <889E> <CDE5>
+<88AB> <88AB> <F9AC>
+<88B4> <88B4> <CDCD>
+<88C1> <88C1> <EEAE>
+<88C2> <88C2> <D6AE>
+<88CF> <88CF> <D7EA>
+<88D4> <88D4> <E7E0>
+<88D5> <88D5> <EBAE>
+<88D9> <88D9> <CFD9>
+<88DC> <88DC> <DCCD>
+<88DD> <88DD> <EDFB>
+<88DF> <88DF> <DEF0>
+<88E1> <88E1> <D7EB>
+<88E8> <88E8> <DEA5>
+<88F3> <88F3> <DFD7>
+<88F4> <88F5> <DBD0>
+<88F8> <88F8> <D5A3>
+<88FD> <88FD> <F0B2>
+<8907> <8907> <DCDC>
+<8910> <8910> <CAE8>
+<8912> <8912> <F8E6>
+<8913> <8913> <DCCE>
+<8918> <8918> <EADC>
+<8919> <8919> <DBD2>
+<8925> <8925> <E9B3>
+<892A> <892A> <F7DB>
+<8936> <8936> <E3A8>
+<8938> <8938> <D7AE>
+<893B> <893B> <E0E1>
+<8941> <8941> <CBBA>
+<8944> <8944> <E5D1>
+<895F> <895F> <D0DC>
+<8964> <8964> <D5C1>
+<896A> <896A> <D8CA>
+<8972> <8972> <E3A9>
+<897F> <897F> <E0A4>
+<8981> <8981> <E9A9>
+<8983> <8983> <D3C7>
+<8986> <8986> <DCDD>
+<8987> <8987> <F8AE>
+<898B> <898B> <CCB8>
+<898F> <898F> <D0AE>
+<8993> <8993> <D8F2>
+<8996> <8996> <E3CA>
+<89A1> <89A1> <CCAF>
+<89A9> <89A9> <D4AD>
+<89AA> <89AA> <F6D1>
+<89B2> <89B2> <D0CC>
+<89BA> <89BA> <CAC6>
+<89BD> <89BD> <D5C2>
+<89C0> <89C0> <CEBA>
+<89D2> <89D2> <CAC7>
+<89E3> <89E3> <FAB0>
+<89F4> <89F4> <DFD8>
+<89F8> <89F8> <F5BA>
+<8A00> <8A00> <E5EB>
+<8A02> <8A02> <EFF4>
+<8A03> <8A03> <DDB5>
+<8A08> <8A08> <CDAA>
+<8A0A> <8A0A> <E3F2>
+<8A0C> <8A0C> <FBF7>
+<8A0E> <8A0E> <F7D0>
+<8A13> <8A13> <FDBA>
+<8A16> <8A16> <FDE1>
+<8A17> <8A17> <F6FE>
+<8A18> <8A18> <D1C0>
+<8A1B> <8A1B> <E8C5>
+<8A1D> <8A1D> <E4B8>
+<8A1F> <8A1F> <E1E8>
+<8A23> <8A23> <CCC1>
+<8A25> <8A25> <D2ED>
+<8A2A> <8A2A> <DBBE>
+<8A2D> <8A2D> <E0E2>
+<8A31> <8A31> <FAC9>
+<8A34> <8A34> <E1CD>
+endbfrange
+
+100 beginbfrange
+<8A36> <8A36> <CAB8>
+<8A3A> <8A3A> <F2E0>
+<8A3B> <8A3B> <F1C9>
+<8A50> <8A50> <DEF1>
+<8A54> <8A54> <F0DF>
+<8A55> <8A55> <F8C4>
+<8A5B> <8A5B> <EECC>
+<8A5E> <8A5E> <DEF2>
+<8A60> <8A60> <E7C9>
+<8A62> <8A62> <E2F3>
+<8A63> <8A63> <E7E1>
+<8A66> <8A66> <E3CB>
+<8A69> <8A69> <E3CC>
+<8A6D> <8A6D> <CFF8>
+<8A6E> <8A6E> <EFAC>
+<8A70> <8A70> <FDFE>
+<8A71> <8A71> <FCA5>
+<8A72> <8A72> <FAB1>
+<8A73> <8A73> <DFD9>
+<8A75> <8A75> <E0D2>
+<8A79> <8A79> <F4DA>
+<8A85> <8A85> <F1CA>
+<8A87> <8A87> <CEA3>
+<8A8C> <8A8C> <F2BC>
+<8A8D> <8A8D> <ECE3>
+<8A93> <8A93> <E0A5>
+<8A95> <8A95> <F7AB>
+<8A98> <8A98> <EBAF>
+<8A9E> <8A9E> <E5DE>
+<8AA0> <8AA0> <E1A4>
+<8AA1> <8AA1> <CDAB>
+<8AA3> <8AA3> <D9F4>
+<8AA4> <8AA4> <E8A6>
+<8AA5> <8AA5> <CDCE>
+<8AA6> <8AA6> <E1E9>
+<8AA8> <8AA8> <FCEF>
+<8AAA> <8AAA> <E0E3>
+<8AB0> <8AB0> <E2C1>
+<8AB2> <8AB2> <CEA4>
+<8AB9> <8AB9> <DEA6>
+<8ABC> <8ABC> <EBFE>
+<8ABE> <8ABE> <EBDD>
+<8ABF> <8ABF> <F0E0>
+<8AC2> <8AC2> <F4DB>
+<8AC4> <8AC4> <E2F4>
+<8AC7> <8AC7> <D3C8>
+<8ACB> <8ACB> <F4EB>
+<8ACD> <8ACD> <EEB5>
+<8ACF> <8ACF> <F5D8>
+<8AD2> <8AD2> <D5DF>
+<8AD6> <8AD6> <D6E5>
+<8ADB> <8ADB> <EBB0>
+<8ADC> <8ADC> <F4E3>
+<8AE1> <8AE1> <E3CD>
+<8AE6> <8AE6> <F4F4>
+<8AE7> <8AE7> <FAB2>
+<8AEA> <8AEA> <EFF5>
+<8AEB> <8AEB> <CADF>
+<8AED> <8AED> <EBB1>
+<8AEE> <8AEE> <EDBF>
+<8AF1> <8AF1> <FDC9>
+<8AF6> <8AF6> <E4A6>
+<8AF7> <8AF7> <F9A4>
+<8AF8> <8AF8> <F0B3>
+<8AFA> <8AFA> <E5EC>
+<8AFE> <8AFE> <D1E7>
+<8B00> <8B00> <D9C7>
+<8B01> <8B01> <E4D7>
+<8B02> <8B02> <EADD>
+<8B04> <8B04> <D4F7>
+<8B0E> <8B0E> <DABA>
+<8B10> <8B10> <DACD>
+<8B14> <8B14> <F9CC>
+<8B16> <8B16> <E1DA>
+<8B17> <8B17> <DBBF>
+<8B19> <8B19> <CCC5>
+<8B1A> <8B1A> <ECD0>
+<8B1B> <8B1B> <CBBB>
+<8B1D> <8B1D> <DEF3>
+<8B20> <8B20> <E9AA>
+<8B28> <8B28> <D9C8>
+<8B2B> <8B2B> <EEE3>
+<8B2C> <8B2C> <D7BD>
+<8B33> <8B33> <CFC4>
+<8B39> <8B39> <D0CD>
+<8B41> <8B41> <FCA6>
+<8B49> <8B49> <F1FB>
+<8B4E> <8B4E> <FDD2>
+<8B4F> <8B4F> <D1C1>
+<8B58> <8B58> <E3DB>
+<8B5A> <8B5A> <D3C9>
+<8B5C> <8B5C> <DCCF>
+<8B66> <8B66> <CCED>
+<8B6C> <8B6C> <DEA7>
+<8B6F> <8B6F> <E6BB>
+<8B70> <8B70> <ECA1>
+<8B74> <8B74> <CCB9>
+<8B77> <8B77> <FBDE>
+<8B7D> <8B7D> <E7E2>
+<8B80> <8B80> <D4C1>
+endbfrange
+
+100 beginbfrange
+<8B8A> <8B8A> <DCA8>
+<8B90> <8B90> <E2C2>
+<8B92> <8B92> <F3D8>
+<8B93> <8B93> <E5D3>
+<8B96> <8B96> <F3D9>
+<8B9A> <8B9A> <F3C6>
+<8C37> <8C37> <CDDB>
+<8C3F> <8C3F> <CDAC>
+<8C41> <8C41> <FCC3>
+<8C46> <8C46> <D4E7>
+<8C48> <8C48> <D1C2>
+<8C4A> <8C4A> <F9A5>
+<8C4C> <8C4C> <E8D5>
+<8C55> <8C55> <E3CE>
+<8C5A> <8C5A> <D4CA>
+<8C61> <8C61> <DFDA>
+<8C6A> <8C6A> <FBDF>
+<8C6B> <8C6B> <E7E3>
+<8C79> <8C79> <F8FB>
+<8C7A> <8C7A> <E3CF>
+<8C82> <8C82> <F5B0>
+<8C8A> <8C8A> <D8E7>
+<8C8C> <8C8C> <D9C9>
+<8C9D> <8C9D> <F8AF>
+<8C9E> <8C9E> <EFF6>
+<8CA0> <8CA0> <DDB6>
+<8CA1> <8CA1> <EEAF>
+<8CA2> <8CA2> <CDF8>
+<8CA7> <8CA7> <DEB8>
+<8CA8> <8CA8> <FCA7>
+<8CA9> <8CA9> <F7FC>
+<8CAA> <8CAA> <F7B1>
+<8CAB> <8CAB> <CEBB>
+<8CAC> <8CAC> <F4A1>
+<8CAF> <8CAF> <EECD>
+<8CB0> <8CB0> <E1AE>
+<8CB3> <8CB3> <ECC3>
+<8CB4> <8CB4> <CFFE>
+<8CB6> <8CB6> <F8BF>
+<8CB7> <8CB7> <D8E2>
+<8CB8> <8CB8> <D3E8>
+<8CBB> <8CBB> <DEA8>
+<8CBC> <8CBC> <F4E4>
+<8CBD> <8CBD> <ECC2>
+<8CBF> <8CBF> <D9F5>
+<8CC0> <8CC0> <F9C5>
+<8CC1> <8CC1> <DDD3>
+<8CC2> <8CC2> <D6F1>
+<8CC3> <8CC3> <ECFC>
+<8CC4> <8CC4> <FCF0>
+<8CC7> <8CC7> <EDC0>
+<8CC8> <8CC8> <CAB9>
+<8CCA> <8CCA> <EEE4>
+<8CD1> <8CD1> <F2E1>
+<8CD3> <8CD3> <DEB9>
+<8CDA> <8CDA> <D6F2>
+<8CDC> <8CDC> <DEF4>
+<8CDE> <8CDE> <DFDB>
+<8CE0> <8CE0> <DBD3>
+<8CE2> <8CE2> <FAE7>
+<8CE3> <8CE3> <D8E3>
+<8CE4> <8CE4> <F4C1>
+<8CE6> <8CE6> <DDB7>
+<8CEA> <8CEA> <F2F5>
+<8CED> <8CED> <D4AE>
+<8CF4> <8CF4> <D6F3>
+<8CFB> <8CFB> <DDB8>
+<8CFC> <8CFC> <CFC5>
+<8CFD> <8CFD> <DFDF>
+<8D04> <8D04> <F2BE>
+<8D05> <8D05> <F6A1>
+<8D07> <8D07> <EBCB>
+<8D08> <8D08> <F1FC>
+<8D0A> <8D0A> <F3C7>
+<8D0D> <8D0D> <E0EB>
+<8D13> <8D13> <EDFC>
+<8D16> <8D16> <E1DB>
+<8D64> <8D64> <EEE5>
+<8D66> <8D66> <DEF5>
+<8D6B> <8D6B> <FAD3>
+<8D70> <8D70> <F1CB>
+<8D73> <8D73> <D0AF>
+<8D74> <8D74> <DDB9>
+<8D77> <8D77> <D1C3>
+<8D85> <8D85> <F5B1>
+<8D8A> <8D8A> <EAC6>
+<8D99> <8D99> <F0E1>
+<8DA3> <8DA3> <F6AC>
+<8DA8> <8DA8> <F5D9>
+<8DB3> <8DB3> <F0EB>
+<8DBA> <8DBA> <DDBA>
+<8DBE> <8DBE> <F2BF>
+<8DC6> <8DC6> <F7C5>
+<8DCB> <8DCB> <DBA2>
+<8DCC> <8DCC> <F2F6>
+<8DCF> <8DCF> <CABA>
+<8DDB> <8DDB> <F7F5>
+<8DDD> <8DDD> <CBE5>
+<8DE1> <8DE1> <EEE6>
+<8DE3> <8DE3> <E0D3>
+endbfrange
+
+100 beginbfrange
+<8DE8> <8DE8> <CEA5>
+<8DEF> <8DEF> <D6D8>
+<8DF3> <8DF3> <D4AF>
+<8E0A> <8E0A> <E9C9>
+<8E0F> <8E0F> <D3CE>
+<8E10> <8E10> <F4C2>
+<8E1E> <8E1E> <CBE6>
+<8E2A> <8E2A> <F1A1>
+<8E30> <8E30> <EBB2>
+<8E35> <8E35> <F1A2>
+<8E42> <8E42> <EBB3>
+<8E44> <8E44> <F0B4>
+<8E47> <8E47> <CBF4>
+<8E48> <8E48> <D4B0>
+<8E49> <8E49> <F3B2>
+<8E4A> <8E4A> <FBB7>
+<8E59> <8E59> <F5EC>
+<8E5F> <8E5F> <EEE7>
+<8E60> <8E60> <F4B2>
+<8E74> <8E74> <F5ED>
+<8E76> <8E76> <CFF3>
+<8E81> <8E81> <F0E2>
+<8E87> <8E87> <EECE>
+<8E8A> <8E8A> <F1CC>
+<8E8D> <8E8D> <E5B8>
+<8EAA> <8EAA> <D7F5>
+<8EAB> <8EAB> <E3F3>
+<8EAC> <8EAC> <CFE5>
+<8EC0> <8EC0> <CFC6>
+<8ECA> <8ECA> <F3B3>
+<8ECB> <8ECB> <E4D8>
+<8ECC> <8ECC> <CFF9>
+<8ECD> <8ECD> <CFDA>
+<8ED2> <8ED2> <FACD>
+<8EDF> <8EDF> <E6E3>
+<8EEB> <8EEB> <F2E2>
+<8EF8> <8EF8> <F5EE>
+<8EFB> <8EFB> <CABB>
+<8EFE> <8EFE> <E3DC>
+<8F03> <8F03> <CEF2>
+<8F05> <8F05> <D6D9>
+<8F09> <8F09> <EEB0>
+<8F12> <8F12> <F4E5>
+<8F13> <8F13> <D8C2>
+<8F14> <8F14> <DCD0>
+<8F15> <8F15> <CCEE>
+<8F1B> <8F1B> <D5E0>
+<8F1C> <8F1C> <F6CA>
+<8F1D> <8F1D> <FDCA>
+<8F1E> <8F1E> <D8D6>
+<8F1F> <8F1F> <F4CF>
+<8F26> <8F26> <D6A6>
+<8F27> <8F27> <DCBE>
+<8F29> <8F29> <DBD4>
+<8F2A> <8F2A> <D7C7>
+<8F2F> <8F2F> <F2FE>
+<8F33> <8F33> <F1CD>
+<8F38> <8F38> <E2C3>
+<8F39> <8F39> <DCDE>
+<8F3B> <8F3B> <DCDF>
+<8F3E> <8F3E> <EFAD>
+<8F3F> <8F3F> <E6AB>
+<8F44> <8F44> <F9DD>
+<8F45> <8F45> <EABF>
+<8F49> <8F49> <EFAE>
+<8F4D> <8F4D> <F4D0>
+<8F4E> <8F4E> <CEF3>
+<8F5D> <8F5D> <E6AC>
+<8F5F> <8F5F> <CEDE>
+<8F62> <8F62> <D5F9>
+<8F9B> <8F9B> <E3F4>
+<8F9C> <8F9C> <CDD0>
+<8FA3> <8FA3> <D5B8>
+<8FA6> <8FA6> <F7FD>
+<8FA8> <8FA8> <DCA9>
+<8FAD> <8FAD> <DEF6>
+<8FAF> <8FAF> <DCAA>
+<8FB0> <8FB0> <F2E3>
+<8FB1> <8FB1> <E9B4>
+<8FB2> <8FB2> <D2DC>
+<8FC2> <8FC2> <E9E6>
+<8FC5> <8FC5> <E3F6>
+<8FCE> <8FCE> <E7CA>
+<8FD1> <8FD1> <D0CE>
+<8FD4> <8FD4> <DAF7>
+<8FE6> <8FE6> <CABC>
+<8FEA> <8FEA> <EEE8>
+<8FEB> <8FEB> <DADE>
+<8FED> <8FED> <F2F7>
+<8FF0> <8FF0> <E2FB>
+<8FF2> <8FF2> <CCA6>
+<8FF7> <8FF7> <DABB>
+<8FF9> <8FF9> <EEE9>
+<8FFD> <8FFD> <F5DA>
+<9000> <9000> <F7DC>
+<9001> <9001> <E1EA>
+<9002> <9002> <CEC1>
+<9003> <9003> <D4B1>
+<9005> <9005> <FDB1>
+<9006> <9006> <E6BD>
+endbfrange
+
+100 beginbfrange
+<9008> <9008> <FBAD>
+<900B> <900B> <F8E7>
+<900D> <900D> <E1CE>
+<900F> <900F> <F7E2>
+<9010> <9010> <F5EF>
+<9011> <9011> <CFC7>
+<9014> <9014> <D4B2>
+<9015> <9015> <CCEF>
+<9017> <9017> <D4E8>
+<9019> <9019> <EECF>
+<901A> <901A> <F7D7>
+<901D> <901D> <E0A6>
+<901E> <901E> <D6C1>
+<901F> <901F> <E1DC>
+<9020> <9020> <F0E3>
+<9021> <9021> <F1E4>
+<9022> <9022> <DCF1>
+<9023> <9023> <D6A7>
+<902E> <902E> <F4F5>
+<9031> <9031> <F1CE>
+<9032> <9032> <F2E4>
+<9035> <9035> <D0B0>
+<9038> <9038> <ECEF>
+<903C> <903C> <F9BA>
+<903E> <903E> <EBB5>
+<9041> <9041> <D4ED>
+<9042> <9042> <E2C4>
+<9047> <9047> <E9E7>
+<904A> <904A> <EBB4>
+<904B> <904B> <EAA1>
+<904D> <904D> <F8BC>
+<904E> <904E> <CEA6>
+<9050> <9050> <F9C6>
+<9051> <9051> <FCDA>
+<9053> <9053> <D4B3>
+<9054> <9054> <D3B9>
+<9055> <9055> <EADE>
+<9059> <9059> <E9AB>
+<905C> <905C> <E1E1>
+<905D> <905D> <D3CF>
+<905E> <905E> <F4F6>
+<9060> <9060> <EAC0>
+<9061> <9061> <E1CF>
+<9063> <9063> <CCBA>
+<9069> <9069> <EEEA>
+<906D> <906D> <F0E4>
+<906E> <906E> <F3B4>
+<906F> <906F> <D4EE>
+<9072> <9072> <F2C0>
+<9075> <9075> <F1E5>
+<9077> <9077> <F4C3>
+<9078> <9078> <E0D4>
+<907A> <907A> <EBB6>
+<907C> <907C> <D7A1>
+<907D> <907D> <CBE8>
+<907F> <907F> <F9AD>
+<9080> <9080> <E9AD>
+<9081> <9081> <D8E4>
+<9082> <9082> <FAB3>
+<9083> <9083> <E2C5>
+<9084> <9084> <FCBD>
+<9087> <9087> <ECC4>
+<9088> <9088> <D8B1>
+<908A> <908A> <DCAB>
+<908F> <908F> <D5A4>
+<9091> <9091> <EBE9>
+<9095> <9095> <E8BB>
+<9099> <9099> <D8D7>
+<90A2> <90A2> <FBAE>
+<90A3> <90A3> <D1E1>
+<90A6> <90A6> <DBC0>
+<90A8> <90A8> <F5BE>
+<90AA> <90AA> <DEF7>
+<90AF> <90AF> <CAFB>
+<90B0> <90B0> <F7C6>
+<90B1> <90B1> <CFC8>
+<90B5> <90B5> <E1D0>
+<90B8> <90B8> <EED0>
+<90C1> <90C1> <E9F4>
+<90CA> <90CA> <CEF4>
+<90DE> <90DE> <D5CD>
+<90E1> <90E1> <CFDB>
+<90E8> <90E8> <DDBB>
+<90ED> <90ED> <CEAC>
+<90F5> <90F5> <E9E8>
+<90FD> <90FD> <D4B4>
+<9102> <9102> <E4C7>
+<9112> <9112> <F5DB>
+<9115> <9115> <FAC1>
+<9119> <9119> <DEA9>
+<9127> <9127> <D4F8>
+<912D> <912D> <EFF7>
+<9132> <9132> <D3B3>
+<9149> <9149> <EBB7>
+<914A> <914A> <EFF8>
+<914B> <914B> <F5DC>
+<914C> <914C> <EDCC>
+<914D> <914D> <DBD5>
+<914E> <914E> <F1CF>
+<9152> <9152> <F1D0>
+endbfrange
+
+100 beginbfrange
+<9162> <9162> <F5B2>
+<9169> <9169> <D9AE>
+<916A> <916A> <D5AC>
+<916C> <916C> <E2C6>
+<9175> <9175> <FDA3>
+<9177> <9177> <FBE5>
+<9178> <9178> <DFAB>
+<9187> <9187> <E2F5>
+<9189> <9189> <F6AD>
+<918B> <918B> <F5B3>
+<918D> <918D> <F0B5>
+<9192> <9192> <E1A5>
+<919C> <919C> <F5DD>
+<91AB> <91AB> <ECA2>
+<91AC> <91AC> <EDFD>
+<91AE> <91AE> <F5B4>
+<91AF> <91AF> <FBB8>
+<91B1> <91B1> <DBA3>
+<91B4> <91B4> <D6CA>
+<91B5> <91B5> <CBD9>
+<91C0> <91C0> <E5D4>
+<91C7> <91C7> <F3FA>
+<91C9> <91C9> <EBB8>
+<91CB> <91CB> <E0B7>
+<91CC> <91CC> <D7EC>
+<91CD> <91CD> <F1EC>
+<91CE> <91CE> <E5AF>
+<91CF> <91CF> <D5E1>
+<91D0> <91D0> <D7ED>
+<91D1> <91D1> <D1D1>
+<91D7> <91D7> <E1F2>
+<91D8> <91D8> <EFF9>
+<91DC> <91DC> <DDBC>
+<91DD> <91DD> <F6DC>
+<91E3> <91E3> <F0E5>
+<91E7> <91E7> <F4C4>
+<91EA> <91EA> <E9E9>
+<91F5> <91F5> <F3FB>
+<920D> <920D> <D4EF>
+<9210> <9210> <CCA2>
+<9211> <9211> <F7FE>
+<9212> <9212> <DFBC>
+<9217> <9217> <EBCD>
+<921E> <921E> <D0B7>
+<9234> <9234> <D6C2>
+<923A> <923A> <E8AD>
+<923F> <923F> <EFAF>
+<9240> <9240> <CBA5>
+<9245> <9245> <CBE9>
+<9249> <9249> <FAE8>
+<9257> <9257> <CCC6>
+<925B> <925B> <E6E7>
+<925E> <925E> <EAC7>
+<9262> <9262> <DBA4>
+<9264> <9264> <CFC9>
+<9265> <9265> <E2FC>
+<9266> <9266> <EFFA>
+<9280> <9280> <EBDE>
+<9283> <9283> <F5C8>
+<9285> <9285> <D4DE>
+<9291> <9291> <E0D5>
+<9293> <9293> <EFB0>
+<9296> <9296> <E2C7>
+<9298> <9298> <D9AF>
+<929C> <929C> <F9E7>
+<92B3> <92B3> <E7E5>
+<92B6> <92B6> <CFCA>
+<92B7> <92B7> <E1D1>
+<92B9> <92B9> <E2C8>
+<92CC> <92CC> <EFFB>
+<92CF> <92CF> <FAF9>
+<92D2> <92D2> <DCF2>
+<92E4> <92E4> <E0A7>
+<92EA> <92EA> <F8E8>
+<92F8> <92F8> <CBEA>
+<92FC> <92FC> <CBBC>
+<9304> <9304> <D6E2>
+<9310> <9310> <F5DE>
+<9318> <9318> <F5DF>
+<931A> <931A> <EEB6>
+<931E> <931E> <E2F6>
+<931F> <931F> <D3CA>
+<9320> <9320> <EFFC>
+<9321> <9321> <D1C4>
+<9322> <9322> <EFB1>
+<9324> <9324> <D1C5>
+<9326> <9326> <D0DE>
+<9328> <9328> <D9E1>
+<932B> <932B> <E0B8>
+<932E> <932E> <CDD1>
+<932F> <932F> <F3B9>
+<9348> <9348> <E7CC>
+<934A> <934A> <D6A8>
+<934B> <934B> <CEA7>
+<934D> <934D> <D4B5>
+<9354> <9354> <E4C8>
+<935B> <935B> <D3B4>
+<936E> <936E> <EBB9>
+<9375> <9375> <CBF5>
+<937C> <937C> <F6DD>
+endbfrange
+
+100 beginbfrange
+<937E> <937E> <F1A3>
+<938C> <938C> <CCC7>
+<9394> <9394> <E9CA>
+<9396> <9396> <E1F0>
+<939A> <939A> <F5E0>
+<93A3> <93A3> <FBAF>
+<93A7> <93A7> <CBD1>
+<93AC> <93AC> <FBE0>
+<93AD> <93AD> <F2E5>
+<93B0> <93B0> <ECF0>
+<93C3> <93C3> <F0EC>
+<93D1> <93D1> <EEEB>
+<93DE> <93DE> <E9CB>
+<93E1> <93E1> <CCF0>
+<93E4> <93E4> <D7AF>
+<93F6> <93F6> <F3A1>
+<9404> <9404> <FCF5>
+<9418> <9418> <F1A4>
+<9425> <9425> <E0D6>
+<942B> <942B> <EFB2>
+<9435> <9435> <F4D1>
+<9438> <9438> <F7A1>
+<9444> <9444> <F1D1>
+<9451> <9452> <CAFC>
+<945B> <945B> <CECE>
+<947D> <947D> <F3C8>
+<947F> <947F> <F3BA>
+<9577> <9577> <EDFE>
+<9580> <9580> <DAA6>
+<9583> <9583> <E0EC>
+<9589> <9589> <F8CD>
+<958B> <958B> <CBD2>
+<958F> <958F> <EBCE>
+<9591> <9592> <F9D8>
+<9593> <9593> <CAE0>
+<9594> <9594> <DACA>
+<9598> <9598> <CBA6>
+<95A3> <95A3> <CAC8>
+<95A4> <95A4> <F9EE>
+<95A5> <95A5> <DBEC>
+<95A8> <95A8> <D0B1>
+<95AD> <95AD> <D5EF>
+<95B1> <95B1> <E6F3>
+<95BB> <95BB> <E7A2>
+<95BC> <95BC> <E4D9>
+<95C7> <95C7> <E4E1>
+<95CA> <95CA> <FCC4>
+<95D4> <95D4> <F9EF>
+<95D5> <95D5> <CFF4>
+<95D6> <95D6> <F7E6>
+<95DC> <95DC> <CEBC>
+<95E1> <95E1> <F4C5>
+<95E2> <95E2> <DCA3>
+<961C> <961C> <DDBD>
+<9621> <9621> <F4C6>
+<962A> <962A> <F8A1>
+<962E> <962E> <E8D6>
+<9632> <9632> <DBC1>
+<963B> <963B> <F0E6>
+<963F> <963F> <E4B9>
+<9640> <9640> <F6ED>
+<9642> <9642> <F9AE>
+<9644> <9644> <DDBE>
+<964B> <964B> <D7B0>
+<964C> <964C> <D8E8>
+<964D> <964D> <CBBD>
+<9650> <9650> <F9DA>
+<965B> <965B> <F8CE>
+<965C> <965C> <F9F0>
+<965D> <965D> <E0ED>
+<965E> <965E> <E3B3>
+<965F> <965F> <F4B3>
+<9662> <9662> <EAC2>
+<9663> <9663> <F2E6>
+<9664> <9664> <F0B6>
+<966A> <966A> <DBD6>
+<9670> <9670> <EBE4>
+<9673> <9673> <F2E7>
+<9675> <9675> <D7D5>
+<9676> <9676> <D4B6>
+<9677> <9677> <F9E8>
+<9678> <9678> <D7C1>
+<967D> <967D> <E5D5>
+<9685> <9685> <E9EA>
+<9686> <9686> <D7CC>
+<968A> <968A> <D3E9>
+<968B> <968B> <E2C9>
+<968D> <968D> <FCDB>
+<968E> <968E> <CDAD>
+<9694> <9694> <CCB0>
+<9695> <9695> <EAA2>
+<9698> <9698> <E4F6>
+<9699> <9699> <D0C0>
+<969B> <969B> <F0B7>
+<969C> <969C> <EEA1>
+<96A3> <96A3> <D7F6>
+<96A7> <96A8> <E2CA>
+<96AA> <96AA> <FACF>
+<96B1> <96B1> <EBDF>
+<96B7> <96B7> <D6CB>
+endbfrange
+
+100 beginbfrange
+<96BB> <96BB> <F4B4>
+<96C0> <96C0> <EDCD>
+<96C1> <96C1> <E4D2>
+<96C4> <96C4> <EAA9>
+<96C5> <96C5> <E4BA>
+<96C6> <96C6> <F3A2>
+<96C7> <96C7> <CDD2>
+<96C9> <96C9> <F6CB>
+<96CB> <96CB> <F1E6>
+<96CC> <96CC> <EDC1>
+<96CD> <96CD> <E8BC>
+<96CE> <96CE> <EED1>
+<96D5> <96D5> <F0E7>
+<96D6> <96D6> <E2CC>
+<96D9> <96D9> <E4AA>
+<96DB> <96DB> <F5E1>
+<96DC> <96DC> <EDDA>
+<96E2> <96E2> <D7EE>
+<96E3> <96E3> <D1F1>
+<96E8> <96E9> <E9EB>
+<96EA> <96EA> <E0E4>
+<96EF> <96EF> <DAA7>
+<96F0> <96F0> <DDD4>
+<96F2> <96F2> <EAA3>
+<96F6> <96F6> <D6C3>
+<96F7> <96F7> <D6F4>
+<96F9> <96F9> <DADF>
+<96FB> <96FB> <EFB3>
+<9700> <9700> <E2CD>
+<9706> <9706> <EFFD>
+<9707> <9707> <F2E8>
+<9711> <9711> <EFC5>
+<9713> <9713> <E7E7>
+<9716> <9716> <D7FD>
+<9719> <9719> <E7CE>
+<971C> <971C> <DFDC>
+<971E> <971E> <F9C7>
+<9727> <9727> <D9F6>
+<9730> <9730> <DFAC>
+<9732> <9732> <D6DA>
+<9739> <9739> <DCA4>
+<973D> <973D> <F0B8>
+<9742> <9742> <D5FA>
+<9744> <9744> <E4F7>
+<9748> <9748> <D6C4>
+<9751> <9751> <F4EC>
+<9756> <9756> <EFFE>
+<975C> <975C> <F0A1>
+<975E> <975E> <DEAA>
+<9761> <9761> <DABC>
+<9762> <9762> <D8FC>
+<9769> <9769> <FAD4>
+<976D> <976D> <ECE5>
+<9774> <9774> <FCA8>
+<9777> <9777> <ECE6>
+<977A> <977A> <D8CB>
+<978B> <978B> <FBB9>
+<978D> <978D> <E4D3>
+<978F> <978F> <CDF9>
+<97A0> <97A0> <CFD3>
+<97A8> <97A8> <CAEA>
+<97AB> <97AB> <CFD4>
+<97AD> <97AD> <F8BD>
+<97C6> <97C6> <F4C7>
+<97CB> <97CB> <EADF>
+<97D3> <97D3> <F9DB>
+<97DC> <97DC> <D4B7>
+<97F3> <97F3> <EBE5>
+<97F6> <97F6> <E1D2>
+<97FB> <97FB> <EAA4>
+<97FF> <97FF> <FAC2>
+<9800> <9800> <FBE1>
+<9801> <9801> <FAED>
+<9802> <9802> <F0A2>
+<9803> <9803> <CCF1>
+<9805> <9805> <FAA3>
+<9806> <9806> <E2F7>
+<9808> <9808> <E2CE>
+<980A> <980A> <E9F5>
+<980C> <980C> <E1EB>
+<9810> <9810> <E7E8>
+<9811> <9811> <E8D7>
+<9812> <9812> <DAF8>
+<9813> <9813> <D4CB>
+<9817> <9817> <F7F6>
+<9818> <9818> <D6C5>
+<982D> <982D> <D4E9>
+<9830> <9830> <FAFA>
+<9838> <9838> <CCF2>
+<9839> <9839> <F7DD>
+<983B> <983B> <DEBA>
+<9846> <9846> <CEA8>
+<984C> <984C> <F0B9>
+<984D> <984D> <E4FE>
+<984E> <984E> <E4C9>
+<9854> <9854> <E4D4>
+<9858> <9858> <EAC3>
+<985A> <985A> <EFB4>
+<985E> <985E> <D7BE>
+<9865> <9865> <FBE2>
+endbfrange
+
+100 beginbfrange
+<9867> <9867> <CDD3>
+<986B> <986B> <EFB5>
+<986F> <986F> <FAE9>
+<98A8> <98A8> <F9A6>
+<98AF> <98AF> <DFBD>
+<98B1> <98B1> <F7C7>
+<98C4> <98C4> <F8FD>
+<98C7> <98C7> <F8FC>
+<98DB> <98DB> <DEAB>
+<98DC> <98DC> <DBE8>
+<98DF> <98DF> <E3DD>
+<98E1> <98E1> <E1E2>
+<98E2> <98E2> <D1C6>
+<98ED> <98ED> <F6D0>
+<98EE> <98EE> <EBE6>
+<98EF> <98EF> <DAF9>
+<98F4> <98F4> <ECC7>
+<98FC> <98FC> <DEF8>
+<98FD> <98FD> <F8E9>
+<98FE> <98FE> <E3DE>
+<9903> <9903> <CEF5>
+<9909> <9909> <FAC3>
+<990A> <990A> <E5D7>
+<990C> <990C> <ECC8>
+<9910> <9910> <F3C9>
+<9913> <9913> <E4BB>
+<9918> <9918> <E6AE>
+<991E> <991E> <EFB6>
+<9920> <9920> <DCBF>
+<9928> <9928> <CEBD>
+<9945> <9945> <D8C3>
+<9949> <9949> <D0CF>
+<994B> <994B> <CFFA>
+<994C> <994C> <F3CA>
+<994D> <994D> <E0D7>
+<9951> <9951> <D1C7>
+<9952> <9952> <E9AE>
+<9954> <9954> <E8BD>
+<9957> <9957> <FAC4>
+<9996> <9996> <E2CF>
+<9999> <9999> <FAC5>
+<999D> <999D> <F9B8>
+<99A5> <99A5> <DCE0>
+<99A8> <99A8> <FBB0>
+<99AC> <99AC> <D8A9>
+<99AD> <99AD> <E5DF>
+<99AE> <99AE> <F9A7>
+<99B1> <99B1> <F6EE>
+<99B3> <99B3> <F6CC>
+<99B4> <99B4> <E2F8>
+<99B9> <99B9> <ECF1>
+<99C1> <99C1> <DAE0>
+<99D0> <99D0> <F1D2>
+<99D1> <99D1> <D2CC>
+<99D2> <99D2> <CFCB>
+<99D5> <99D5> <CABD>
+<99D9> <99D9> <DDBF>
+<99DD> <99DD> <F6EF>
+<99DF> <99DF> <DEF9>
+<99ED> <99ED> <FAB4>
+<99F1> <99F1> <D5AD>
+<99FF> <99FF> <F1E7>
+<9A01> <9A01> <DEBE>
+<9A08> <9A08> <DCC0>
+<9A0E> <9A0F> <D1C8>
+<9A19> <9A19> <F8BE>
+<9A2B> <9A2B> <CBF6>
+<9A30> <9A30> <D4F9>
+<9A36> <9A36> <F5E2>
+<9A37> <9A37> <E1D3>
+<9A40> <9A40> <D8E9>
+<9A43> <9A43> <F8FE>
+<9A45> <9A45> <CFCC>
+<9A4D> <9A4D> <FDA4>
+<9A55> <9A55> <CEF6>
+<9A57> <9A57> <FAD0>
+<9A5A> <9A5A> <CCF3>
+<9A5B> <9A5B> <E6BE>
+<9A5F> <9A5F> <F6AE>
+<9A62> <9A62> <D5F0>
+<9A65> <9A65> <D1CA>
+<9A69> <9A69> <FCBE>
+<9A6A> <9A6A> <D5F1>
+<9AA8> <9AA8> <CDE9>
+<9AB8> <9AB8> <FAB5>
+<9AD3> <9AD3> <E2D0>
+<9AD4> <9AD4> <F4F7>
+<9AD8> <9AD8> <CDD4>
+<9AE5> <9AE5> <E7A3>
+<9AEE> <9AEE> <DBA5>
+<9B1A> <9B1A> <E2D1>
+<9B27> <9B27> <D7A2>
+<9B2A> <9B2A> <F7E3>
+<9B31> <9B31> <EAA6>
+<9B3C> <9B3C> <D0A1>
+<9B41> <9B41> <CEDA>
+<9B42> <9B42> <FBEB>
+<9B43> <9B43> <DBA6>
+<9B44> <9B44> <DBDE>
+<9B45> <9B45> <D8E5>
+endbfrange
+
+100 beginbfrange
+<9B4F> <9B4F> <EAE0>
+<9B54> <9B54> <D8AA>
+<9B5A> <9B5A> <E5E0>
+<9B6F> <9B6F> <D6DB>
+<9B8E> <9B8E> <EFC6>
+<9B91> <9B91> <F8EA>
+<9B9F> <9B9F> <E4D5>
+<9BAB> <9BAB> <CEF7>
+<9BAE> <9BAE> <E0D8>
+<9BC9> <9BC9> <D7EF>
+<9BD6> <9BD6> <F4ED>
+<9BE4> <9BE4> <CDE6>
+<9BE8> <9BE8> <CCF4>
+<9C0D> <9C0D> <F5E3>
+<9C10> <9C10> <E4CA>
+<9C12> <9C12> <DCE1>
+<9C15> <9C15> <F9C8>
+<9C25> <9C25> <FCBF>
+<9C32> <9C32> <E8A7>
+<9C3B> <9C3B> <D8C4>
+<9C47> <9C47> <CBBE>
+<9C49> <9C49> <DCAE>
+<9C57> <9C57> <D7F7>
+<9CE5> <9CE5> <F0E8>
+<9CE7> <9CE7> <DDC0>
+<9CE9> <9CE9> <CFCD>
+<9CF3> <9CF3> <DCF3>
+<9CF4> <9CF4> <D9B0>
+<9CF6> <9CF6> <E6E9>
+<9D09> <9D09> <E4BC>
+<9D1B> <9D1B> <EAC4>
+<9D26> <9D26> <E4EC>
+<9D28> <9D28> <E4E5>
+<9D3B> <9D3B> <FBF8>
+<9D51> <9D51> <CCBB>
+<9D5D> <9D5D> <E4BD>
+<9D60> <9D60> <CDDC>
+<9D61> <9D61> <D9F7>
+<9D6C> <9D6C> <DDDF>
+<9D72> <9D72> <EDCE>
+<9DA9> <9DA9> <D9D0>
+<9DAF> <9DAF> <E5A3>
+<9DB4> <9DB4> <F9CD>
+<9DC4> <9DC4> <CDAE>
+<9DD7> <9DD7> <CFCE>
+<9DF2> <9DF2> <F6AF>
+<9DF8> <9DF8> <FDD3>
+<9DF9> <9DF9> <EBED>
+<9DFA> <9DFA> <D6DC>
+<9E1A> <9E1A> <E5A4>
+<9E1E> <9E1E> <D5B6>
+<9E75> <9E75> <D6DD>
+<9E79> <9E79> <F9E9>
+<9E7D> <9E7D> <E7A4>
+<9E7F> <9E7F> <D6E3>
+<9E92> <9E92> <D1CB>
+<9E93> <9E93> <D6E4>
+<9E97> <9E97> <D5F2>
+<9E9D> <9E9D> <DEFA>
+<9E9F> <9E9F> <D7F8>
+<9EA5> <9EA5> <D8EA>
+<9EB4> <9EB4> <CFD5>
+<9EB5> <9EB5> <D8FD>
+<9EBB> <9EBB> <D8AB>
+<9EBE> <9EBE> <FDCB>
+<9EC3> <9EC3> <FCDC>
+<9ECD> <9ECD> <E0A8>
+<9ECE> <9ECE> <D5F3>
+<9ED1> <9ED1> <FDD9>
+<9ED4> <9ED4> <CCA3>
+<9ED8> <9ED8> <D9F9>
+<9EDB> <9EDB> <D3EA>
+<9EDC> <9EDC> <F5F5>
+<9EDE> <9EDE> <EFC7>
+<9EE8> <9EE8> <D3DA>
+<9EF4> <9EF4> <DABD>
+<9F07> <9F07> <E8A8>
+<9F08> <9F08> <DCAF>
+<9F0E> <9F0E> <F0A3>
+<9F13> <9F13> <CDD5>
+<9F20> <9F20> <E0A9>
+<9F3B> <9F3B> <DEAC>
+<9F4A> <9F4A> <F0BA>
+<9F4B> <9F4B> <EEB1>
+<9F4E> <9F4E> <EEB2>
+<9F52> <9F52> <F6CD>
+<9F5F> <9F5F> <EED2>
+<9F61> <9F61> <D6C6>
+<9F67> <9F67> <E0E5>
+<9F6A> <9F6A> <F3BB>
+<9F6C> <9F6C> <E5E1>
+<9F77> <9F77> <E4CB>
+<9F8D> <9F8D> <D7A3>
+<9F90> <9F90> <DBC2>
+<9F95> <9F95> <CAFE>
+<9F9C> <9F9C> <CFCF>
+<AC00> <AC01> <B0A1>
+<AC02> <AC03> <8141>
+<AC04> <AC04> <B0A3>
+<AC05> <AC06> <8143>
+endbfrange
+
+100 beginbfrange
+<AC07> <AC0A> <B0A4>
+<AC0B> <AC0F> <8145>
+<AC10> <AC17> <B0A8>
+<AC18> <AC18> <814A>
+<AC19> <AC1D> <B0B0>
+<AC1E> <AC1F> <814B>
+<AC20> <AC20> <B0B5>
+<AC21> <AC23> <814D>
+<AC24> <AC24> <B0B6>
+<AC25> <AC2B> <8150>
+<AC2C> <AC2D> <B0B7>
+<AC2E> <AC2E> <8157>
+<AC2F> <AC31> <B0B9>
+<AC32> <AC34> <8158>
+<AC35> <AC37> <8161>
+<AC38> <AC39> <B0BC>
+<AC3A> <AC3B> <8164>
+<AC3C> <AC3C> <B0BE>
+<AC3D> <AC3F> <8166>
+<AC40> <AC40> <B0BF>
+<AC41> <AC4A> <8169>
+<AC4B> <AC4B> <B0C0>
+<AC4C> <AC4C> <8173>
+<AC4D> <AC4D> <B0C1>
+<AC4E> <AC53> <8174>
+<AC54> <AC54> <B0C2>
+<AC55> <AC55> <817A>
+<AC56> <AC57> <8181>
+<AC58> <AC58> <B0C3>
+<AC59> <AC5B> <8183>
+<AC5C> <AC5C> <B0C4>
+<AC5D> <AC6F> <8186>
+<AC70> <AC71> <B0C5>
+<AC72> <AC73> <8199>
+<AC74> <AC74> <B0C7>
+<AC75> <AC76> <819B>
+<AC77> <AC78> <B0C8>
+<AC79> <AC79> <819D>
+<AC7A> <AC7A> <B0CA>
+<AC7B> <AC7F> <819E>
+<AC80> <AC81> <B0CB>
+<AC82> <AC82> <81A3>
+<AC83> <AC86> <B0CD>
+<AC87> <AC88> <81A4>
+<AC89> <AC8C> <B0D1>
+<AC8D> <AC8F> <81A6>
+<AC90> <AC90> <B0D5>
+<AC91> <AC93> <81A9>
+<AC94> <AC94> <B0D6>
+<AC95> <AC9B> <81AC>
+<AC9C> <AC9D> <B0D7>
+<AC9E> <AC9E> <81B3>
+<AC9F> <ACA1> <B0D9>
+<ACA2> <ACA7> <81B4>
+<ACA8> <ACAA> <B0DC>
+<ACAB> <ACAB> <81BA>
+<ACAC> <ACAC> <B0DF>
+<ACAD> <ACAE> <81BB>
+<ACAF> <ACB0> <B0E0>
+<ACB1> <ACB7> <81BD>
+<ACB8> <ACB9> <B0E2>
+<ACBA> <ACBA> <81C4>
+<ACBB> <ACBD> <B0E4>
+<ACBE> <ACC0> <81C5>
+<ACC1> <ACC1> <B0E7>
+<ACC2> <ACC3> <81C8>
+<ACC4> <ACC4> <B0E8>
+<ACC5> <ACC7> <81CA>
+<ACC8> <ACC8> <B0E9>
+<ACC9> <ACCB> <81CD>
+<ACCC> <ACCC> <B0EA>
+<ACCD> <ACD4> <81D0>
+<ACD5> <ACD5> <B0EB>
+<ACD6> <ACD6> <81D8>
+<ACD7> <ACD7> <B0EC>
+<ACD8> <ACDF> <81D9>
+<ACE0> <ACE1> <B0ED>
+<ACE2> <ACE3> <81E1>
+<ACE4> <ACE4> <B0EF>
+<ACE5> <ACE6> <81E3>
+<ACE7> <ACE8> <B0F0>
+<ACE9> <ACE9> <81E5>
+<ACEA> <ACEA> <B0F2>
+<ACEB> <ACEB> <81E6>
+<ACEC> <ACEC> <B0F3>
+<ACED> <ACEE> <81E7>
+<ACEF> <ACF1> <B0F4>
+<ACF2> <ACF2> <81E9>
+<ACF3> <ACF3> <B0F7>
+<ACF4> <ACF4> <81EA>
+<ACF5> <ACF6> <B0F8>
+<ACF7> <ACFB> <81EB>
+<ACFC> <ACFD> <B0FA>
+<ACFE> <ACFF> <81F0>
+<AD00> <AD00> <B0FC>
+<AD01> <AD03> <81F2>
+<AD04> <AD04> <B0FD>
+<AD05> <AD05> <81F5>
+<AD06> <AD06> <B0FE>
+<AD07> <AD0B> <81F6>
+endbfrange
+
+100 beginbfrange
+<AD0C> <AD0D> <B1A1>
+<AD0E> <AD0E> <81FB>
+<AD0F> <AD0F> <B1A3>
+<AD10> <AD10> <81FC>
+<AD11> <AD11> <B1A4>
+<AD12> <AD13> <81FD>
+<AD14> <AD17> <8241>
+<AD18> <AD18> <B1A5>
+<AD19> <AD1B> <8245>
+<AD1C> <AD1C> <B1A6>
+<AD1D> <AD1F> <8248>
+<AD20> <AD20> <B1A7>
+<AD21> <AD28> <824B>
+<AD29> <AD29> <B1A8>
+<AD2A> <AD2B> <8253>
+<AD2C> <AD2D> <B1A9>
+<AD2E> <AD33> <8255>
+<AD34> <AD35> <B1AB>
+<AD36> <AD37> <8261>
+<AD38> <AD38> <B1AD>
+<AD39> <AD3B> <8263>
+<AD3C> <AD3C> <B1AE>
+<AD3D> <AD43> <8266>
+<AD44> <AD45> <B1AF>
+<AD46> <AD46> <826D>
+<AD47> <AD47> <B1B1>
+<AD48> <AD48> <826E>
+<AD49> <AD49> <B1B2>
+<AD4A> <AD4F> <826F>
+<AD50> <AD50> <B1B3>
+<AD51> <AD53> <8275>
+<AD54> <AD54> <B1B4>
+<AD55> <AD57> <8278>
+<AD58> <AD58> <B1B5>
+<AD59> <AD60> <8281>
+<AD61> <AD61> <B1B6>
+<AD62> <AD62> <8289>
+<AD63> <AD63> <B1B7>
+<AD64> <AD6B> <828A>
+<AD6C> <AD6D> <B1B8>
+<AD6E> <AD6F> <8292>
+<AD70> <AD70> <B1BA>
+<AD71> <AD72> <8294>
+<AD73> <AD76> <B1BB>
+<AD77> <AD7A> <8296>
+<AD7B> <AD7D> <B1BF>
+<AD7E> <AD7E> <829A>
+<AD7F> <AD7F> <B1C2>
+<AD80> <AD80> <829B>
+<AD81> <AD82> <B1C3>
+<AD83> <AD87> <829C>
+<AD88> <AD89> <B1C5>
+<AD8A> <AD8B> <82A1>
+<AD8C> <AD8C> <B1C7>
+<AD8D> <AD8F> <82A3>
+<AD90> <AD90> <B1C8>
+<AD91> <AD9B> <82A6>
+<AD9C> <AD9D> <B1C9>
+<AD9E> <ADA3> <82B1>
+<ADA4> <ADA4> <B1CB>
+<ADA5> <ADB6> <82B7>
+<ADB7> <ADB7> <B1CC>
+<ADB8> <ADBF> <82C9>
+<ADC0> <ADC1> <B1CD>
+<ADC2> <ADC3> <82D1>
+<ADC4> <ADC4> <B1CF>
+<ADC5> <ADC7> <82D3>
+<ADC8> <ADC8> <B1D0>
+<ADC9> <ADCF> <82D6>
+<ADD0> <ADD1> <B1D1>
+<ADD2> <ADD2> <82DD>
+<ADD3> <ADD3> <B1D3>
+<ADD4> <ADDB> <82DE>
+<ADDC> <ADDC> <B1D4>
+<ADDD> <ADDF> <82E6>
+<ADE0> <ADE0> <B1D5>
+<ADE1> <ADE3> <82E9>
+<ADE4> <ADE4> <B1D6>
+<ADE5> <ADF7> <82EC>
+<ADF8> <ADF9> <B1D7>
+<ADFA> <ADFB> <8341>
+<ADFC> <ADFC> <B1D9>
+<ADFD> <ADFE> <8343>
+<ADFF> <ADFF> <B1DA>
+<AE00> <AE01> <B1DB>
+<AE02> <AE07> <8345>
+<AE08> <AE09> <B1DD>
+<AE0A> <AE0A> <834B>
+<AE0B> <AE0B> <B1DF>
+<AE0C> <AE0C> <834C>
+<AE0D> <AE0D> <B1E0>
+<AE0E> <AE13> <834D>
+<AE14> <AE14> <B1E1>
+<AE15> <AE1C> <8353>
+<AE1D> <AE2F> <8361>
+<AE30> <AE31> <B1E2>
+<AE32> <AE33> <8374>
+<AE34> <AE34> <B1E4>
+<AE35> <AE36> <8376>
+<AE37> <AE38> <B1E5>
+endbfrange
+
+100 beginbfrange
+<AE39> <AE39> <8378>
+<AE3A> <AE3A> <B1E7>
+<AE3B> <AE3C> <8379>
+<AE3D> <AE3F> <8381>
+<AE40> <AE41> <B1E8>
+<AE42> <AE42> <8384>
+<AE43> <AE43> <B1EA>
+<AE44> <AE44> <8385>
+<AE45> <AE46> <B1EB>
+<AE47> <AE49> <8386>
+<AE4A> <AE4A> <B1ED>
+<AE4B> <AE4B> <8389>
+<AE4C> <AE4E> <B1EE>
+<AE4F> <AE4F> <838A>
+<AE50> <AE50> <B1F1>
+<AE51> <AE53> <838B>
+<AE54> <AE54> <B1F2>
+<AE55> <AE55> <838E>
+<AE56> <AE56> <B1F3>
+<AE57> <AE5B> <838F>
+<AE5C> <AE5D> <B1F4>
+<AE5E> <AE5E> <8394>
+<AE5F> <AE61> <B1F6>
+<AE62> <AE64> <8395>
+<AE65> <AE65> <B1F9>
+<AE66> <AE67> <8398>
+<AE68> <AE69> <B1FA>
+<AE6A> <AE6B> <839A>
+<AE6C> <AE6C> <B1FC>
+<AE6D> <AE6F> <839C>
+<AE70> <AE70> <B1FD>
+<AE71> <AE77> <839F>
+<AE78> <AE78> <B1FE>
+<AE79> <AE79> <B2A1>
+<AE7A> <AE7A> <83A6>
+<AE7B> <AE7D> <B2A2>
+<AE7E> <AE83> <83A7>
+<AE84> <AE85> <B2A5>
+<AE86> <AE8B> <83AD>
+<AE8C> <AE8C> <B2A7>
+<AE8D> <AEBB> <83B3>
+<AEBC> <AEBE> <B2A8>
+<AEBF> <AEBF> <83E2>
+<AEC0> <AEC0> <B2AB>
+<AEC1> <AEC3> <83E3>
+<AEC4> <AEC4> <B2AC>
+<AEC5> <AECB> <83E6>
+<AECC> <AECD> <B2AD>
+<AECE> <AECE> <83ED>
+<AECF> <AED1> <B2AF>
+<AED2> <AED7> <83EE>
+<AED8> <AED9> <B2B2>
+<AEDA> <AEDB> <83F4>
+<AEDC> <AEDC> <B2B4>
+<AEDD> <AEE5> <83F6>
+<AEE6> <AEE7> <8441>
+<AEE8> <AEE8> <B2B5>
+<AEE9> <AEEA> <8443>
+<AEEB> <AEEB> <B2B6>
+<AEEC> <AEEC> <8445>
+<AEED> <AEED> <B2B7>
+<AEEE> <AEF3> <8446>
+<AEF4> <AEF4> <B2B8>
+<AEF5> <AEF7> <844C>
+<AEF8> <AEF8> <B2B9>
+<AEF9> <AEFB> <844F>
+<AEFC> <AEFC> <B2BA>
+<AEFD> <AEFF> <8452>
+<AF00> <AF05> <8455>
+<AF06> <AF06> <8461>
+<AF07> <AF08> <B2BB>
+<AF09> <AF0C> <8462>
+<AF0D> <AF0D> <B2BD>
+<AF0E> <AF0F> <8466>
+<AF10> <AF10> <B2BE>
+<AF11> <AF23> <8468>
+<AF24> <AF2B> <8481>
+<AF2C> <AF2D> <B2BF>
+<AF2E> <AF2F> <8489>
+<AF30> <AF30> <B2C1>
+<AF31> <AF31> <848B>
+<AF32> <AF32> <B2C2>
+<AF33> <AF33> <848C>
+<AF34> <AF34> <B2C3>
+<AF35> <AF3B> <848D>
+<AF3C> <AF3D> <B2C4>
+<AF3E> <AF3E> <8494>
+<AF3F> <AF3F> <B2C6>
+<AF40> <AF40> <8495>
+<AF41> <AF43> <B2C7>
+<AF44> <AF47> <8496>
+<AF48> <AF49> <B2CA>
+<AF4A> <AF4F> <849A>
+<AF50> <AF50> <B2CC>
+<AF51> <AF5B> <84A0>
+<AF5C> <AF5D> <B2CD>
+<AF5E> <AF63> <84AB>
+<AF64> <AF65> <B2CF>
+<AF66> <AF78> <84B1>
+<AF79> <AF79> <B2D1>
+endbfrange
+
+100 beginbfrange
+<AF7A> <AF7F> <84C4>
+<AF80> <AF80> <B2D2>
+<AF81> <AF83> <84CA>
+<AF84> <AF84> <B2D3>
+<AF85> <AF87> <84CD>
+<AF88> <AF88> <B2D4>
+<AF89> <AF8F> <84D0>
+<AF90> <AF91> <B2D5>
+<AF92> <AF94> <84D7>
+<AF95> <AF95> <B2D7>
+<AF96> <AF9B> <84DA>
+<AF9C> <AF9C> <B2D8>
+<AF9D> <AFB7> <84E0>
+<AFB8> <AFB9> <B2D9>
+<AFBA> <AFBB> <84FB>
+<AFBC> <AFBC> <B2DB>
+<AFBD> <AFBE> <84FD>
+<AFBF> <AFBF> <8541>
+<AFC0> <AFC0> <B2DC>
+<AFC1> <AFC6> <8542>
+<AFC7> <AFC9> <B2DD>
+<AFCA> <AFCA> <8548>
+<AFCB> <AFCB> <B2E0>
+<AFCC> <AFCC> <8549>
+<AFCD> <AFCE> <B2E1>
+<AFCF> <AFD3> <854A>
+<AFD4> <AFD4> <B2E3>
+<AFD5> <AFDB> <854F>
+<AFDC> <AFDC> <B2E4>
+<AFDD> <AFE1> <8556>
+<AFE2> <AFE7> <8561>
+<AFE8> <AFE9> <B2E5>
+<AFEA> <AFEF> <8567>
+<AFF0> <AFF1> <B2E7>
+<AFF2> <AFF3> <856D>
+<AFF4> <AFF4> <B2E9>
+<AFF5> <AFF7> <856F>
+<AFF8> <AFF8> <B2EA>
+<AFF9> <AFFF> <8572>
+<B000> <B001> <B2EB>
+<B002> <B003> <8579>
+<B004> <B004> <B2ED>
+<B005> <B00B> <8581>
+<B00C> <B00C> <B2EE>
+<B00D> <B00F> <8588>
+<B010> <B010> <B2EF>
+<B011> <B013> <858B>
+<B014> <B014> <B2F0>
+<B015> <B01B> <858E>
+<B01C> <B01D> <B2F1>
+<B01E> <B027> <8595>
+<B028> <B028> <B2F3>
+<B029> <B043> <859F>
+<B044> <B045> <B2F4>
+<B046> <B047> <85BA>
+<B048> <B048> <B2F6>
+<B049> <B049> <85BC>
+<B04A> <B04A> <B2F7>
+<B04B> <B04B> <85BD>
+<B04C> <B04C> <B2F8>
+<B04D> <B04D> <85BE>
+<B04E> <B04E> <B2F9>
+<B04F> <B052> <85BF>
+<B053> <B055> <B2FA>
+<B056> <B056> <85C3>
+<B057> <B057> <B2FD>
+<B058> <B058> <85C4>
+<B059> <B059> <B2FE>
+<B05A> <B05C> <85C5>
+<B05D> <B05D> <B3A1>
+<B05E> <B07B> <85C8>
+<B07C> <B07D> <B3A2>
+<B07E> <B07F> <85E6>
+<B080> <B080> <B3A4>
+<B081> <B083> <85E8>
+<B084> <B084> <B3A5>
+<B085> <B08B> <85EB>
+<B08C> <B08D> <B3A6>
+<B08E> <B08E> <85F2>
+<B08F> <B08F> <B3A8>
+<B090> <B090> <85F3>
+<B091> <B091> <B3A9>
+<B092> <B097> <85F4>
+<B098> <B09A> <B3AA>
+<B09B> <B09B> <85FA>
+<B09C> <B09C> <B3AD>
+<B09D> <B09E> <85FB>
+<B09F> <B0A2> <B3AE>
+<B0A3> <B0A4> <85FD>
+<B0A5> <B0A7> <8641>
+<B0A8> <B0A9> <B3B2>
+<B0AA> <B0AA> <8644>
+<B0AB> <B0AF> <B3B4>
+<B0B0> <B0B0> <8645>
+<B0B1> <B0B1> <B3B9>
+<B0B2> <B0B2> <8646>
+<B0B3> <B0B5> <B3BA>
+<B0B6> <B0B7> <8647>
+<B0B8> <B0B8> <B3BD>
+<B0B9> <B0BB> <8649>
+endbfrange
+
+100 beginbfrange
+<B0BC> <B0BC> <B3BE>
+<B0BD> <B0C3> <864C>
+<B0C4> <B0C5> <B3BF>
+<B0C6> <B0C6> <8653>
+<B0C7> <B0C9> <B3C1>
+<B0CA> <B0CF> <8654>
+<B0D0> <B0D1> <B3C4>
+<B0D2> <B0D2> <865A>
+<B0D3> <B0D3> <8661>
+<B0D4> <B0D4> <B3C6>
+<B0D5> <B0D7> <8662>
+<B0D8> <B0D8> <B3C7>
+<B0D9> <B0DF> <8665>
+<B0E0> <B0E0> <B3C8>
+<B0E1> <B0E4> <866C>
+<B0E5> <B0E5> <B3C9>
+<B0E6> <B0F0> <8670>
+<B0F1> <B0FF> <8681>
+<B100> <B107> <8690>
+<B108> <B109> <B3CA>
+<B10A> <B10A> <8698>
+<B10B> <B10C> <B3CC>
+<B10D> <B10F> <8699>
+<B110> <B110> <B3CE>
+<B111> <B111> <869C>
+<B112> <B113> <B3CF>
+<B114> <B117> <869D>
+<B118> <B119> <B3D1>
+<B11A> <B11A> <86A1>
+<B11B> <B11D> <B3D3>
+<B11E> <B122> <86A2>
+<B123> <B125> <B3D6>
+<B126> <B127> <86A7>
+<B128> <B128> <B3D9>
+<B129> <B12B> <86A9>
+<B12C> <B12C> <B3DA>
+<B12D> <B133> <86AC>
+<B134> <B135> <B3DB>
+<B136> <B136> <86B3>
+<B137> <B139> <B3DD>
+<B13A> <B13F> <86B4>
+<B140> <B141> <B3E0>
+<B142> <B143> <86BA>
+<B144> <B144> <B3E2>
+<B145> <B147> <86BC>
+<B148> <B148> <B3E3>
+<B149> <B14F> <86BF>
+<B150> <B151> <B3E4>
+<B152> <B153> <86C6>
+<B154> <B155> <B3E6>
+<B156> <B157> <86C8>
+<B158> <B158> <B3E8>
+<B159> <B15B> <86CA>
+<B15C> <B15C> <B3E9>
+<B15D> <B15F> <86CD>
+<B160> <B160> <B3EA>
+<B161> <B177> <86D0>
+<B178> <B179> <B3EB>
+<B17A> <B17B> <86E7>
+<B17C> <B17C> <B3ED>
+<B17D> <B17F> <86E9>
+<B180> <B180> <B3EE>
+<B181> <B181> <86EC>
+<B182> <B182> <B3EF>
+<B183> <B187> <86ED>
+<B188> <B189> <B3F0>
+<B18A> <B18A> <86F2>
+<B18B> <B18B> <B3F2>
+<B18C> <B18C> <86F3>
+<B18D> <B18D> <B3F3>
+<B18E> <B191> <86F4>
+<B192> <B194> <B3F4>
+<B195> <B197> <86F8>
+<B198> <B198> <B3F7>
+<B199> <B19B> <86FB>
+<B19C> <B19C> <B3F8>
+<B19D> <B19D> <86FE>
+<B19E> <B1A7> <8741>
+<B1A8> <B1A8> <B3F9>
+<B1A9> <B1B8> <874B>
+<B1B9> <B1CB> <8761>
+<B1CC> <B1CC> <B3FA>
+<B1CD> <B1CF> <8774>
+<B1D0> <B1D0> <B3FB>
+<B1D1> <B1D3> <8777>
+<B1D4> <B1D4> <B3FC>
+<B1D5> <B1D5> <877A>
+<B1D6> <B1DB> <8781>
+<B1DC> <B1DD> <B3FD>
+<B1DE> <B1DE> <8787>
+<B1DF> <B1DF> <B4A1>
+<B1E0> <B1E7> <8788>
+<B1E8> <B1E9> <B4A2>
+<B1EA> <B1EB> <8790>
+<B1EC> <B1EC> <B4A4>
+<B1ED> <B1EF> <8792>
+<B1F0> <B1F0> <B4A5>
+<B1F1> <B1F8> <8795>
+<B1F9> <B1F9> <B4A6>
+<B1FA> <B1FA> <879D>
+endbfrange
+
+100 beginbfrange
+<B1FB> <B1FB> <B4A7>
+<B1FC> <B1FC> <879E>
+<B1FD> <B1FD> <B4A8>
+<B1FE> <B1FF> <879F>
+<B200> <B203> <87A1>
+<B204> <B205> <B4A9>
+<B206> <B207> <87A5>
+<B208> <B208> <B4AB>
+<B209> <B20A> <87A7>
+<B20B> <B20C> <B4AC>
+<B20D> <B213> <87A9>
+<B214> <B215> <B4AE>
+<B216> <B216> <87B0>
+<B217> <B217> <B4B0>
+<B218> <B218> <87B1>
+<B219> <B219> <B4B1>
+<B21A> <B21F> <87B2>
+<B220> <B220> <B4B2>
+<B221> <B233> <87B8>
+<B234> <B234> <B4B3>
+<B235> <B23B> <87CB>
+<B23C> <B23C> <B4B4>
+<B23D> <B257> <87D2>
+<B258> <B258> <B4B5>
+<B259> <B25B> <87ED>
+<B25C> <B25C> <B4B6>
+<B25D> <B25F> <87F0>
+<B260> <B260> <B4B7>
+<B261> <B267> <87F3>
+<B268> <B269> <B4B8>
+<B26A> <B26E> <87FA>
+<B26F> <B273> <8841>
+<B274> <B275> <B4BA>
+<B276> <B27B> <8846>
+<B27C> <B27C> <B4BC>
+<B27D> <B283> <884C>
+<B284> <B285> <B4BD>
+<B286> <B288> <8853>
+<B289> <B289> <B4BF>
+<B28A> <B28E> <8856>
+<B28F> <B28F> <8861>
+<B290> <B291> <B4C0>
+<B292> <B293> <8862>
+<B294> <B294> <B4C2>
+<B295> <B297> <8864>
+<B298> <B29A> <B4C3>
+<B29B> <B29F> <8867>
+<B2A0> <B2A1> <B4C6>
+<B2A2> <B2A2> <886C>
+<B2A3> <B2A3> <B4C8>
+<B2A4> <B2A4> <886D>
+<B2A5> <B2A6> <B4C9>
+<B2A7> <B2A9> <886E>
+<B2AA> <B2AA> <B4CB>
+<B2AB> <B2AB> <8871>
+<B2AC> <B2AC> <B4CC>
+<B2AD> <B2AF> <8872>
+<B2B0> <B2B0> <B4CD>
+<B2B1> <B2B3> <8875>
+<B2B4> <B2B4> <B4CE>
+<B2B5> <B2B7> <8878>
+<B2B8> <B2C7> <8881>
+<B2C8> <B2C9> <B4CF>
+<B2CA> <B2CB> <8891>
+<B2CC> <B2CC> <B4D1>
+<B2CD> <B2CF> <8893>
+<B2D0> <B2D0> <B4D2>
+<B2D1> <B2D1> <8896>
+<B2D2> <B2D2> <B4D3>
+<B2D3> <B2D7> <8897>
+<B2D8> <B2D9> <B4D4>
+<B2DA> <B2DA> <889C>
+<B2DB> <B2DB> <B4D6>
+<B2DC> <B2DC> <889D>
+<B2DD> <B2DD> <B4D7>
+<B2DE> <B2E1> <889E>
+<B2E2> <B2E2> <B4D8>
+<B2E3> <B2E3> <88A2>
+<B2E4> <B2E6> <B4D9>
+<B2E7> <B2E7> <88A3>
+<B2E8> <B2E8> <B4DC>
+<B2E9> <B2EA> <88A4>
+<B2EB> <B2EF> <B4DD>
+<B2F0> <B2F2> <88A6>
+<B2F3> <B2F5> <B4E2>
+<B2F6> <B2F6> <88A9>
+<B2F7> <B2FB> <B4E5>
+<B2FC> <B2FE> <88AA>
+<B2FF> <B2FF> <B4EA>
+<B300> <B301> <B4EB>
+<B302> <B303> <88AD>
+<B304> <B304> <B4ED>
+<B305> <B307> <88AF>
+<B308> <B308> <B4EE>
+<B309> <B30F> <88B2>
+<B310> <B311> <B4EF>
+<B312> <B312> <88B9>
+<B313> <B315> <B4F1>
+<B316> <B31B> <88BA>
+<B31C> <B31C> <B4F4>
+endbfrange
+
+100 beginbfrange
+<B31D> <B353> <88C0>
+<B354> <B356> <B4F5>
+<B357> <B357> <88F7>
+<B358> <B358> <B4F8>
+<B359> <B35A> <88F8>
+<B35B> <B35C> <B4F9>
+<B35D> <B35D> <88FA>
+<B35E> <B35F> <B4FB>
+<B360> <B363> <88FB>
+<B364> <B365> <B4FD>
+<B366> <B366> <8941>
+<B367> <B367> <B5A1>
+<B368> <B368> <8942>
+<B369> <B369> <B5A2>
+<B36A> <B36A> <8943>
+<B36B> <B36B> <B5A3>
+<B36C> <B36D> <8944>
+<B36E> <B36E> <B5A4>
+<B36F> <B36F> <8946>
+<B370> <B371> <B5A5>
+<B372> <B373> <8947>
+<B374> <B374> <B5A7>
+<B375> <B377> <8949>
+<B378> <B378> <B5A8>
+<B379> <B37F> <894C>
+<B380> <B381> <B5A9>
+<B382> <B382> <8953>
+<B383> <B385> <B5AB>
+<B386> <B38B> <8954>
+<B38C> <B38C> <B5AE>
+<B38D> <B38D> <895A>
+<B38E> <B38F> <8961>
+<B390> <B390> <B5AF>
+<B391> <B393> <8963>
+<B394> <B394> <B5B0>
+<B395> <B39F> <8966>
+<B3A0> <B3A1> <B5B1>
+<B3A2> <B3A7> <8971>
+<B3A8> <B3A8> <B5B3>
+<B3A9> <B3AB> <8977>
+<B3AC> <B3AC> <B5B4>
+<B3AD> <B3AD> <897A>
+<B3AE> <B3C3> <8981>
+<B3C4> <B3C5> <B5B5>
+<B3C6> <B3C7> <8997>
+<B3C8> <B3C8> <B5B7>
+<B3C9> <B3CA> <8999>
+<B3CB> <B3CC> <B5B8>
+<B3CD> <B3CD> <899B>
+<B3CE> <B3CE> <B5BA>
+<B3CF> <B3CF> <899C>
+<B3D0> <B3D0> <B5BB>
+<B3D1> <B3D3> <899D>
+<B3D4> <B3D5> <B5BC>
+<B3D6> <B3D6> <89A0>
+<B3D7> <B3D7> <B5BE>
+<B3D8> <B3D8> <89A1>
+<B3D9> <B3D9> <B5BF>
+<B3DA> <B3DA> <89A2>
+<B3DB> <B3DB> <B5C0>
+<B3DC> <B3DC> <89A3>
+<B3DD> <B3DD> <B5C1>
+<B3DE> <B3DF> <89A4>
+<B3E0> <B3E0> <B5C2>
+<B3E1> <B3E3> <89A6>
+<B3E4> <B3E4> <B5C3>
+<B3E5> <B3E7> <89A9>
+<B3E8> <B3E8> <B5C4>
+<B3E9> <B3FB> <89AC>
+<B3FC> <B3FC> <B5C5>
+<B3FD> <B3FF> <89BF>
+<B400> <B40F> <89C2>
+<B410> <B410> <B5C6>
+<B411> <B417> <89D2>
+<B418> <B418> <B5C7>
+<B419> <B41B> <89D9>
+<B41C> <B41C> <B5C8>
+<B41D> <B41F> <89DC>
+<B420> <B420> <B5C9>
+<B421> <B427> <89DF>
+<B428> <B429> <B5CA>
+<B42A> <B42A> <89E6>
+<B42B> <B42B> <B5CC>
+<B42C> <B433> <89E7>
+<B434> <B434> <B5CD>
+<B435> <B444> <89EF>
+<B445> <B44F> <8A41>
+<B450> <B451> <B5CE>
+<B452> <B453> <8A4C>
+<B454> <B454> <B5D0>
+<B455> <B457> <8A4E>
+<B458> <B458> <B5D1>
+<B459> <B45F> <8A51>
+<B460> <B461> <B5D2>
+<B462> <B462> <8A58>
+<B463> <B463> <B5D4>
+<B464> <B464> <8A59>
+<B465> <B465> <B5D5>
+<B466> <B466> <8A5A>
+<B467> <B46B> <8A61>
+endbfrange
+
+100 beginbfrange
+<B46C> <B46C> <B5D6>
+<B46D> <B47F> <8A66>
+<B480> <B480> <B5D7>
+<B481> <B482> <8A79>
+<B483> <B487> <8A81>
+<B488> <B488> <B5D8>
+<B489> <B49C> <8A86>
+<B49D> <B49D> <B5D9>
+<B49E> <B4A3> <8A9A>
+<B4A4> <B4A4> <B5DA>
+<B4A5> <B4A7> <8AA0>
+<B4A8> <B4A8> <B5DB>
+<B4A9> <B4AB> <8AA3>
+<B4AC> <B4AC> <B5DC>
+<B4AD> <B4B4> <8AA6>
+<B4B5> <B4B5> <B5DD>
+<B4B6> <B4B6> <8AAE>
+<B4B7> <B4B7> <B5DE>
+<B4B8> <B4B8> <8AAF>
+<B4B9> <B4B9> <B5DF>
+<B4BA> <B4BF> <8AB0>
+<B4C0> <B4C0> <B5E0>
+<B4C1> <B4C3> <8AB6>
+<B4C4> <B4C4> <B5E1>
+<B4C5> <B4C7> <8AB9>
+<B4C8> <B4C8> <B5E2>
+<B4C9> <B4CF> <8ABC>
+<B4D0> <B4D0> <B5E3>
+<B4D1> <B4D4> <8AC3>
+<B4D5> <B4D5> <B5E4>
+<B4D6> <B4DB> <8AC7>
+<B4DC> <B4DD> <B5E5>
+<B4DE> <B4DF> <8ACD>
+<B4E0> <B4E0> <B5E7>
+<B4E1> <B4E2> <8ACF>
+<B4E3> <B4E4> <B5E8>
+<B4E5> <B4E5> <8AD1>
+<B4E6> <B4E6> <B5EA>
+<B4E7> <B4EB> <8AD2>
+<B4EC> <B4ED> <B5EB>
+<B4EE> <B4EE> <8AD7>
+<B4EF> <B4EF> <B5ED>
+<B4F0> <B4F0> <8AD8>
+<B4F1> <B4F1> <B5EE>
+<B4F2> <B4F7> <8AD9>
+<B4F8> <B4F8> <B5EF>
+<B4F9> <B4FF> <8ADF>
+<B500> <B513> <8AE6>
+<B514> <B515> <B5F0>
+<B516> <B517> <8AFA>
+<B518> <B518> <B5F2>
+<B519> <B51A> <8AFC>
+<B51B> <B51C> <B5F3>
+<B51D> <B51D> <8AFE>
+<B51E> <B523> <8B41>
+<B524> <B525> <B5F5>
+<B526> <B526> <8B47>
+<B527> <B52A> <B5F7>
+<B52B> <B52F> <8B48>
+<B530> <B531> <B5FB>
+<B532> <B533> <8B4D>
+<B534> <B534> <B5FD>
+<B535> <B537> <8B4F>
+<B538> <B538> <B5FE>
+<B539> <B53F> <8B52>
+<B540> <B541> <B6A1>
+<B542> <B542> <8B59>
+<B543> <B545> <B6A3>
+<B546> <B546> <8B5A>
+<B547> <B54A> <8B61>
+<B54B> <B54D> <B6A6>
+<B54E> <B54F> <8B65>
+<B550> <B550> <B6A9>
+<B551> <B553> <8B67>
+<B554> <B554> <B6AA>
+<B555> <B55B> <8B6A>
+<B55C> <B55D> <B6AB>
+<B55E> <B55E> <8B71>
+<B55F> <B561> <B6AD>
+<B562> <B56A> <8B72>
+<B56B> <B59F> <8B81>
+<B5A0> <B5A1> <B6B0>
+<B5A2> <B5A3> <8BB6>
+<B5A4> <B5A4> <B6B2>
+<B5A5> <B5A7> <8BB8>
+<B5A8> <B5A8> <B6B3>
+<B5A9> <B5A9> <8BBB>
+<B5AA> <B5AB> <B6B4>
+<B5AC> <B5AF> <8BBC>
+<B5B0> <B5B1> <B6B6>
+<B5B2> <B5B2> <8BC0>
+<B5B3> <B5B5> <B6B8>
+<B5B6> <B5BA> <8BC1>
+<B5BB> <B5BD> <B6BB>
+<B5BE> <B5BF> <8BC6>
+<B5C0> <B5C0> <B6BE>
+<B5C1> <B5C3> <8BC8>
+<B5C4> <B5C4> <B6BF>
+<B5C5> <B5CB> <8BCB>
+<B5CC> <B5CD> <B6C0>
+endbfrange
+
+100 beginbfrange
+<B5CE> <B5CE> <8BD2>
+<B5CF> <B5D1> <B6C2>
+<B5D2> <B5D7> <8BD3>
+<B5D8> <B5D8> <B6C5>
+<B5D9> <B5EB> <8BD9>
+<B5EC> <B5EC> <B6C6>
+<B5ED> <B5FF> <8BEC>
+<B600> <B60F> <8C41>
+<B610> <B611> <B6C7>
+<B612> <B613> <8C51>
+<B614> <B614> <B6C9>
+<B615> <B617> <8C53>
+<B618> <B618> <B6CA>
+<B619> <B61D> <8C56>
+<B61E> <B624> <8C61>
+<B625> <B625> <B6CB>
+<B626> <B62B> <8C68>
+<B62C> <B62C> <B6CC>
+<B62D> <B633> <8C6E>
+<B634> <B634> <B6CD>
+<B635> <B63A> <8C75>
+<B63B> <B647> <8C81>
+<B648> <B648> <B6CE>
+<B649> <B663> <8C8E>
+<B664> <B664> <B6CF>
+<B665> <B667> <8CA9>
+<B668> <B668> <B6D0>
+<B669> <B69B> <8CAC>
+<B69C> <B69D> <B6D1>
+<B69E> <B69F> <8CDF>
+<B6A0> <B6A0> <B6D3>
+<B6A1> <B6A3> <8CE1>
+<B6A4> <B6A4> <B6D4>
+<B6A5> <B6AA> <8CE4>
+<B6AB> <B6AC> <B6D5>
+<B6AD> <B6B0> <8CEA>
+<B6B1> <B6B1> <B6D7>
+<B6B2> <B6C2> <8CEE>
+<B6C3> <B6D3> <8D41>
+<B6D4> <B6D4> <B6D8>
+<B6D5> <B6DD> <8D52>
+<B6DE> <B6EF> <8D61>
+<B6F0> <B6F0> <B6D9>
+<B6F1> <B6F3> <8D73>
+<B6F4> <B6F4> <B6DA>
+<B6F5> <B6F7> <8D76>
+<B6F8> <B6F8> <B6DB>
+<B6F9> <B6FA> <8D79>
+<B6FB> <B6FF> <8D81>
+<B700> <B701> <B6DC>
+<B702> <B704> <8D86>
+<B705> <B705> <B6DE>
+<B706> <B727> <8D89>
+<B728> <B729> <B6DF>
+<B72A> <B72B> <8DAB>
+<B72C> <B72C> <B6E1>
+<B72D> <B72E> <8DAD>
+<B72F> <B730> <B6E2>
+<B731> <B737> <8DAF>
+<B738> <B739> <B6E4>
+<B73A> <B73A> <8DB6>
+<B73B> <B73B> <B6E6>
+<B73C> <B743> <8DB7>
+<B744> <B744> <B6E7>
+<B745> <B747> <8DBF>
+<B748> <B748> <B6E8>
+<B749> <B74B> <8DC2>
+<B74C> <B74C> <B6E9>
+<B74D> <B753> <8DC5>
+<B754> <B755> <B6EA>
+<B756> <B75F> <8DCC>
+<B760> <B760> <B6EC>
+<B761> <B763> <8DD6>
+<B764> <B764> <B6ED>
+<B765> <B767> <8DD9>
+<B768> <B768> <B6EE>
+<B769> <B76F> <8DDC>
+<B770> <B771> <B6EF>
+<B772> <B772> <8DE3>
+<B773> <B773> <B6F1>
+<B774> <B774> <8DE4>
+<B775> <B775> <B6F2>
+<B776> <B77B> <8DE5>
+<B77C> <B77D> <B6F3>
+<B77E> <B77F> <8DEB>
+<B780> <B780> <B6F5>
+<B781> <B783> <8DED>
+<B784> <B784> <B6F6>
+<B785> <B78B> <8DF0>
+<B78C> <B78D> <B6F7>
+<B78E> <B78E> <8DF7>
+<B78F> <B792> <B6F9>
+<B793> <B795> <8DF8>
+<B796> <B797> <B6FD>
+<B798> <B799> <B7A1>
+<B79A> <B79B> <8DFB>
+<B79C> <B79C> <B7A3>
+<B79D> <B79E> <8DFD>
+<B79F> <B79F> <8E41>
+<B7A0> <B7A0> <B7A4>
+endbfrange
+
+100 beginbfrange
+<B7A1> <B7A7> <8E42>
+<B7A8> <B7A9> <B7A5>
+<B7AA> <B7AA> <8E49>
+<B7AB> <B7AD> <B7A7>
+<B7AE> <B7B3> <8E4A>
+<B7B4> <B7B5> <B7AA>
+<B7B6> <B7B7> <8E50>
+<B7B8> <B7B8> <B7AC>
+<B7B9> <B7C1> <8E52>
+<B7C2> <B7C6> <8E61>
+<B7C7> <B7C7> <B7AD>
+<B7C8> <B7C8> <8E66>
+<B7C9> <B7C9> <B7AE>
+<B7CA> <B7DD> <8E67>
+<B7DE> <B7EB> <8E81>
+<B7EC> <B7ED> <B7AF>
+<B7EE> <B7EF> <8E8F>
+<B7F0> <B7F0> <B7B1>
+<B7F1> <B7F3> <8E91>
+<B7F4> <B7F4> <B7B2>
+<B7F5> <B7FB> <8E94>
+<B7FC> <B7FD> <B7B3>
+<B7FE> <B7FE> <8E9B>
+<B7FF> <B7FF> <B7B5>
+<B800> <B801> <B7B6>
+<B802> <B806> <8E9C>
+<B807> <B809> <B7B8>
+<B80A> <B80B> <8EA1>
+<B80C> <B80C> <B7BB>
+<B80D> <B80F> <8EA3>
+<B810> <B810> <B7BC>
+<B811> <B817> <8EA6>
+<B818> <B819> <B7BD>
+<B81A> <B81A> <8EAD>
+<B81B> <B81B> <B7BF>
+<B81C> <B81C> <8EAE>
+<B81D> <B81D> <B7C0>
+<B81E> <B823> <8EAF>
+<B824> <B825> <B7C1>
+<B826> <B827> <8EB5>
+<B828> <B828> <B7C3>
+<B829> <B82B> <8EB7>
+<B82C> <B82C> <B7C4>
+<B82D> <B833> <8EBA>
+<B834> <B835> <B7C5>
+<B836> <B836> <8EC1>
+<B837> <B839> <B7C7>
+<B83A> <B83F> <8EC2>
+<B840> <B840> <B7CA>
+<B841> <B843> <8EC8>
+<B844> <B844> <B7CB>
+<B845> <B850> <8ECB>
+<B851> <B851> <B7CC>
+<B852> <B852> <8ED7>
+<B853> <B853> <B7CD>
+<B854> <B85B> <8ED8>
+<B85C> <B85D> <B7CE>
+<B85E> <B85F> <8EE0>
+<B860> <B860> <B7D0>
+<B861> <B863> <8EE2>
+<B864> <B864> <B7D1>
+<B865> <B86B> <8EE5>
+<B86C> <B86D> <B7D2>
+<B86E> <B86E> <8EEC>
+<B86F> <B86F> <B7D4>
+<B870> <B870> <8EED>
+<B871> <B871> <B7D5>
+<B872> <B877> <8EEE>
+<B878> <B878> <B7D6>
+<B879> <B87B> <8EF4>
+<B87C> <B87C> <B7D7>
+<B87D> <B884> <8EF7>
+<B885> <B88C> <8F41>
+<B88D> <B88D> <B7D8>
+<B88E> <B89F> <8F49>
+<B8A0> <B8A7> <8F61>
+<B8A8> <B8A8> <B7D9>
+<B8A9> <B8AF> <8F69>
+<B8B0> <B8B0> <B7DA>
+<B8B1> <B8B3> <8F70>
+<B8B4> <B8B4> <B7DB>
+<B8B5> <B8B7> <8F73>
+<B8B8> <B8B8> <B7DC>
+<B8B9> <B8BD> <8F76>
+<B8BE> <B8BF> <8F81>
+<B8C0> <B8C1> <B7DD>
+<B8C2> <B8C2> <8F83>
+<B8C3> <B8C3> <B7DF>
+<B8C4> <B8C4> <8F84>
+<B8C5> <B8C5> <B7E0>
+<B8C6> <B8CB> <8F85>
+<B8CC> <B8CC> <B7E1>
+<B8CD> <B8CF> <8F8B>
+<B8D0> <B8D0> <B7E2>
+<B8D1> <B8D3> <8F8E>
+<B8D4> <B8D4> <B7E3>
+<B8D5> <B8DC> <8F91>
+<B8DD> <B8DD> <B7E4>
+<B8DE> <B8DE> <8F99>
+<B8DF> <B8DF> <B7E5>
+endbfrange
+
+100 beginbfrange
+<B8E0> <B8E0> <8F9A>
+<B8E1> <B8E1> <B7E6>
+<B8E2> <B8E7> <8F9B>
+<B8E8> <B8E9> <B7E7>
+<B8EA> <B8EB> <8FA1>
+<B8EC> <B8EC> <B7E9>
+<B8ED> <B8EF> <8FA3>
+<B8F0> <B8F0> <B7EA>
+<B8F1> <B8F7> <8FA6>
+<B8F8> <B8F9> <B7EB>
+<B8FA> <B8FA> <8FAD>
+<B8FB> <B8FB> <B7ED>
+<B8FC> <B8FC> <8FAE>
+<B8FD> <B8FD> <B7EE>
+<B8FE> <B8FF> <8FAF>
+<B900> <B903> <8FB1>
+<B904> <B904> <B7EF>
+<B905> <B917> <8FB5>
+<B918> <B918> <B7F0>
+<B919> <B91F> <8FC8>
+<B920> <B920> <B7F1>
+<B921> <B93B> <8FCF>
+<B93C> <B93D> <B7F2>
+<B93E> <B93F> <8FEA>
+<B940> <B940> <B7F4>
+<B941> <B943> <8FEC>
+<B944> <B944> <B7F5>
+<B945> <B94B> <8FEF>
+<B94C> <B94C> <B7F6>
+<B94D> <B94E> <8FF6>
+<B94F> <B94F> <B7F7>
+<B950> <B950> <8FF8>
+<B951> <B951> <B7F8>
+<B952> <B957> <8FF9>
+<B958> <B959> <B7F9>
+<B95A> <B95B> <9041>
+<B95C> <B95C> <B7FB>
+<B95D> <B95F> <9043>
+<B960> <B960> <B7FC>
+<B961> <B967> <9046>
+<B968> <B969> <B7FD>
+<B96A> <B96A> <904D>
+<B96B> <B96B> <B8A1>
+<B96C> <B96C> <904E>
+<B96D> <B96D> <B8A2>
+<B96E> <B973> <904F>
+<B974> <B975> <B8A3>
+<B976> <B977> <9055>
+<B978> <B978> <B8A5>
+<B979> <B97B> <9057>
+<B97C> <B97C> <B8A6>
+<B97D> <B97D> <905A>
+<B97E> <B983> <9061>
+<B984> <B985> <B8A7>
+<B986> <B986> <9067>
+<B987> <B987> <B8A9>
+<B988> <B988> <9068>
+<B989> <B98A> <B8AA>
+<B98B> <B98C> <9069>
+<B98D> <B98E> <B8AC>
+<B98F> <B99E> <906B>
+<B99F> <B9AB> <9081>
+<B9AC> <B9AD> <B8AE>
+<B9AE> <B9AF> <908E>
+<B9B0> <B9B0> <B8B0>
+<B9B1> <B9B3> <9090>
+<B9B4> <B9B4> <B8B1>
+<B9B5> <B9BB> <9093>
+<B9BC> <B9BD> <B8B2>
+<B9BE> <B9BE> <909A>
+<B9BF> <B9BF> <B8B4>
+<B9C0> <B9C0> <909B>
+<B9C1> <B9C1> <B8B5>
+<B9C2> <B9C7> <909C>
+<B9C8> <B9C9> <B8B6>
+<B9CA> <B9CB> <90A2>
+<B9CC> <B9CC> <B8B8>
+<B9CD> <B9CD> <90A4>
+<B9CE> <B9D2> <B8B9>
+<B9D3> <B9D7> <90A5>
+<B9D8> <B9D9> <B8BE>
+<B9DA> <B9DA> <90AA>
+<B9DB> <B9DB> <B8C0>
+<B9DC> <B9DC> <90AB>
+<B9DD> <B9DE> <B8C1>
+<B9DF> <B9E0> <90AC>
+<B9E1> <B9E1> <B8C3>
+<B9E2> <B9E2> <90AE>
+<B9E3> <B9E5> <B8C4>
+<B9E6> <B9E7> <90AF>
+<B9E8> <B9E8> <B8C7>
+<B9E9> <B9EB> <90B1>
+<B9EC> <B9EC> <B8C8>
+<B9ED> <B9F3> <90B4>
+<B9F4> <B9F5> <B8C9>
+<B9F6> <B9F6> <90BB>
+<B9F7> <B9FA> <B8CB>
+<B9FB> <B9FF> <90BC>
+<BA00> <BA01> <B8CF>
+<BA02> <BA07> <90C1>
+endbfrange
+
+100 beginbfrange
+<BA08> <BA08> <B8D1>
+<BA09> <BA14> <90C7>
+<BA15> <BA15> <B8D2>
+<BA16> <BA37> <90D3>
+<BA38> <BA39> <B8D3>
+<BA3A> <BA3B> <90F5>
+<BA3C> <BA3C> <B8D5>
+<BA3D> <BA3F> <90F7>
+<BA40> <BA40> <B8D6>
+<BA41> <BA41> <90FA>
+<BA42> <BA42> <B8D7>
+<BA43> <BA46> <90FB>
+<BA47> <BA47> <9141>
+<BA48> <BA49> <B8D8>
+<BA4A> <BA4A> <9142>
+<BA4B> <BA4B> <B8DA>
+<BA4C> <BA4C> <9143>
+<BA4D> <BA4E> <B8DB>
+<BA4F> <BA52> <9144>
+<BA53> <BA55> <B8DD>
+<BA56> <BA57> <9148>
+<BA58> <BA58> <B8E0>
+<BA59> <BA5B> <914A>
+<BA5C> <BA5C> <B8E1>
+<BA5D> <BA63> <914D>
+<BA64> <BA65> <B8E2>
+<BA66> <BA66> <9154>
+<BA67> <BA69> <B8E4>
+<BA6A> <BA6F> <9155>
+<BA70> <BA71> <B8E7>
+<BA72> <BA73> <9161>
+<BA74> <BA74> <B8E9>
+<BA75> <BA77> <9163>
+<BA78> <BA78> <B8EA>
+<BA79> <BA82> <9166>
+<BA83> <BA85> <B8EB>
+<BA86> <BA86> <9170>
+<BA87> <BA87> <B8EE>
+<BA88> <BA8B> <9171>
+<BA8C> <BA8C> <B8EF>
+<BA8D> <BA92> <9175>
+<BA93> <BAA7> <9181>
+<BAA8> <BAA9> <B8F0>
+<BAAA> <BAAA> <9196>
+<BAAB> <BAAC> <B8F2>
+<BAAD> <BAAF> <9197>
+<BAB0> <BAB0> <B8F4>
+<BAB1> <BAB1> <919A>
+<BAB2> <BAB2> <B8F5>
+<BAB3> <BAB7> <919B>
+<BAB8> <BAB9> <B8F6>
+<BABA> <BABA> <91A0>
+<BABB> <BABB> <B8F8>
+<BABC> <BABC> <91A1>
+<BABD> <BABD> <B8F9>
+<BABE> <BAC3> <91A2>
+<BAC4> <BAC4> <B8FA>
+<BAC5> <BAC7> <91A8>
+<BAC8> <BAC8> <B8FB>
+<BAC9> <BAD7> <91AB>
+<BAD8> <BAD9> <B8FC>
+<BADA> <BAFB> <91BA>
+<BAFC> <BAFC> <B8FE>
+<BAFD> <BAFF> <91DC>
+<BB00> <BB00> <B9A1>
+<BB01> <BB03> <91DF>
+<BB04> <BB04> <B9A2>
+<BB05> <BB0C> <91E2>
+<BB0D> <BB0D> <B9A3>
+<BB0E> <BB0E> <91EA>
+<BB0F> <BB0F> <B9A4>
+<BB10> <BB10> <91EB>
+<BB11> <BB11> <B9A5>
+<BB12> <BB17> <91EC>
+<BB18> <BB18> <B9A6>
+<BB19> <BB1B> <91F2>
+<BB1C> <BB1C> <B9A7>
+<BB1D> <BB1F> <91F5>
+<BB20> <BB20> <B9A8>
+<BB21> <BB27> <91F8>
+<BB28> <BB28> <9241>
+<BB29> <BB29> <B9A9>
+<BB2A> <BB2A> <9242>
+<BB2B> <BB2B> <B9AA>
+<BB2C> <BB33> <9243>
+<BB34> <BB36> <B9AB>
+<BB37> <BB37> <924B>
+<BB38> <BB38> <B9AE>
+<BB39> <BB3A> <924C>
+<BB3B> <BB3E> <B9AF>
+<BB3F> <BB43> <924E>
+<BB44> <BB45> <B9B3>
+<BB46> <BB46> <9253>
+<BB47> <BB47> <B9B5>
+<BB48> <BB48> <9254>
+<BB49> <BB49> <B9B6>
+<BB4A> <BB4C> <9255>
+<BB4D> <BB4D> <B9B7>
+<BB4E> <BB4E> <9258>
+<BB4F> <BB50> <B9B8>
+endbfrange
+
+100 beginbfrange
+<BB51> <BB52> <9259>
+<BB53> <BB53> <9261>
+<BB54> <BB54> <B9BA>
+<BB55> <BB57> <9262>
+<BB58> <BB58> <B9BB>
+<BB59> <BB60> <9265>
+<BB61> <BB61> <B9BC>
+<BB62> <BB62> <926D>
+<BB63> <BB63> <B9BD>
+<BB64> <BB6B> <926E>
+<BB6C> <BB6C> <B9BE>
+<BB6D> <BB71> <9276>
+<BB72> <BB87> <9281>
+<BB88> <BB88> <B9BF>
+<BB89> <BB8B> <9297>
+<BB8C> <BB8C> <B9C0>
+<BB8D> <BB8F> <929A>
+<BB90> <BB90> <B9C1>
+<BB91> <BBA3> <929D>
+<BBA4> <BBA4> <B9C2>
+<BBA5> <BBA7> <92B0>
+<BBA8> <BBA8> <B9C3>
+<BBA9> <BBAB> <92B3>
+<BBAC> <BBAC> <B9C4>
+<BBAD> <BBB3> <92B6>
+<BBB4> <BBB4> <B9C5>
+<BBB5> <BBB6> <92BD>
+<BBB7> <BBB7> <B9C6>
+<BBB8> <BBBF> <92BF>
+<BBC0> <BBC0> <B9C7>
+<BBC1> <BBC3> <92C7>
+<BBC4> <BBC4> <B9C8>
+<BBC5> <BBC7> <92CA>
+<BBC8> <BBC8> <B9C9>
+<BBC9> <BBCF> <92CD>
+<BBD0> <BBD0> <B9CA>
+<BBD1> <BBD2> <92D4>
+<BBD3> <BBD3> <B9CB>
+<BBD4> <BBF7> <92D6>
+<BBF8> <BBF9> <B9CC>
+<BBFA> <BBFB> <92FA>
+<BBFC> <BBFC> <B9CE>
+<BBFD> <BBFE> <92FC>
+<BBFF> <BBFF> <B9CF>
+<BC00> <BC00> <B9D0>
+<BC01> <BC01> <92FE>
+<BC02> <BC02> <B9D1>
+<BC03> <BC07> <9341>
+<BC08> <BC09> <B9D2>
+<BC0A> <BC0A> <9346>
+<BC0B> <BC0D> <B9D4>
+<BC0E> <BC0E> <9347>
+<BC0F> <BC0F> <B9D7>
+<BC10> <BC10> <9348>
+<BC11> <BC11> <B9D8>
+<BC12> <BC13> <9349>
+<BC14> <BC18> <B9D9>
+<BC19> <BC1A> <934B>
+<BC1B> <BC1F> <B9DE>
+<BC20> <BC23> <934D>
+<BC24> <BC25> <B9E3>
+<BC26> <BC26> <9351>
+<BC27> <BC27> <B9E5>
+<BC28> <BC28> <9352>
+<BC29> <BC29> <B9E6>
+<BC2A> <BC2C> <9353>
+<BC2D> <BC2D> <B9E7>
+<BC2E> <BC2F> <9356>
+<BC30> <BC31> <B9E8>
+<BC32> <BC33> <9358>
+<BC34> <BC34> <B9EA>
+<BC35> <BC35> <935A>
+<BC36> <BC37> <9361>
+<BC38> <BC38> <B9EB>
+<BC39> <BC3F> <9363>
+<BC40> <BC41> <B9EC>
+<BC42> <BC42> <936A>
+<BC43> <BC45> <B9EE>
+<BC46> <BC48> <936B>
+<BC49> <BC49> <B9F1>
+<BC4A> <BC4B> <936E>
+<BC4C> <BC4D> <B9F2>
+<BC4E> <BC4F> <9370>
+<BC50> <BC50> <B9F4>
+<BC51> <BC59> <9372>
+<BC5A> <BC5C> <9381>
+<BC5D> <BC5D> <B9F5>
+<BC5E> <BC83> <9384>
+<BC84> <BC85> <B9F6>
+<BC86> <BC87> <93AA>
+<BC88> <BC88> <B9F8>
+<BC89> <BC8A> <93AC>
+<BC8B> <BC8C> <B9F9>
+<BC8D> <BC8D> <93AE>
+<BC8E> <BC8E> <B9FB>
+<BC8F> <BC93> <93AF>
+<BC94> <BC95> <B9FC>
+<BC96> <BC96> <93B4>
+<BC97> <BC97> <B9FE>
+<BC98> <BC98> <93B5>
+endbfrange
+
+100 beginbfrange
+<BC99> <BC9A> <BAA1>
+<BC9B> <BC9F> <93B6>
+<BCA0> <BCA1> <BAA3>
+<BCA2> <BCA3> <93BB>
+<BCA4> <BCA4> <BAA5>
+<BCA5> <BCA6> <93BD>
+<BCA7> <BCA8> <BAA6>
+<BCA9> <BCAF> <93BF>
+<BCB0> <BCB1> <BAA8>
+<BCB2> <BCB2> <93C6>
+<BCB3> <BCB5> <BAAA>
+<BCB6> <BCBB> <93C7>
+<BCBC> <BCBD> <BAAD>
+<BCBE> <BCBF> <93CD>
+<BCC0> <BCC0> <BAAF>
+<BCC1> <BCC3> <93CF>
+<BCC4> <BCC4> <BAB0>
+<BCC5> <BCCC> <93D2>
+<BCCD> <BCCD> <BAB1>
+<BCCE> <BCCE> <93DA>
+<BCCF> <BCD1> <BAB2>
+<BCD2> <BCD4> <93DB>
+<BCD5> <BCD5> <BAB5>
+<BCD6> <BCD7> <93DE>
+<BCD8> <BCD8> <BAB6>
+<BCD9> <BCDB> <93E0>
+<BCDC> <BCDC> <BAB7>
+<BCDD> <BCF3> <93E3>
+<BCF4> <BCF6> <BAB8>
+<BCF7> <BCF7> <93FA>
+<BCF8> <BCF8> <BABB>
+<BCF9> <BCFB> <93FB>
+<BCFC> <BCFC> <BABC>
+<BCFD> <BCFD> <93FE>
+<BCFE> <BCFF> <9441>
+<BD00> <BD03> <9443>
+<BD04> <BD05> <BABD>
+<BD06> <BD06> <9447>
+<BD07> <BD07> <BABF>
+<BD08> <BD08> <9448>
+<BD09> <BD09> <BAC0>
+<BD0A> <BD0F> <9449>
+<BD10> <BD10> <BAC1>
+<BD11> <BD13> <944F>
+<BD14> <BD14> <BAC2>
+<BD15> <BD1D> <9452>
+<BD1E> <BD23> <9461>
+<BD24> <BD24> <BAC3>
+<BD25> <BD2B> <9467>
+<BD2C> <BD2C> <BAC4>
+<BD2D> <BD39> <946E>
+<BD3A> <BD3F> <9481>
+<BD40> <BD40> <BAC5>
+<BD41> <BD47> <9487>
+<BD48> <BD49> <BAC6>
+<BD4A> <BD4B> <948E>
+<BD4C> <BD4C> <BAC8>
+<BD4D> <BD4F> <9490>
+<BD50> <BD50> <BAC9>
+<BD51> <BD57> <9493>
+<BD58> <BD59> <BACA>
+<BD5A> <BD63> <949A>
+<BD64> <BD64> <BACC>
+<BD65> <BD67> <94A4>
+<BD68> <BD68> <BACD>
+<BD69> <BD7F> <94A7>
+<BD80> <BD81> <BACE>
+<BD82> <BD83> <94BE>
+<BD84> <BD84> <BAD0>
+<BD85> <BD86> <94C0>
+<BD87> <BD8A> <BAD1>
+<BD8B> <BD8F> <94C2>
+<BD90> <BD91> <BAD5>
+<BD92> <BD92> <94C7>
+<BD93> <BD93> <BAD7>
+<BD94> <BD94> <94C8>
+<BD95> <BD95> <BAD8>
+<BD96> <BD98> <94C9>
+<BD99> <BD9A> <BAD9>
+<BD9B> <BD9B> <94CC>
+<BD9C> <BD9C> <BADB>
+<BD9D> <BDA3> <94CD>
+<BDA4> <BDA4> <BADC>
+<BDA5> <BDAF> <94D4>
+<BDB0> <BDB0> <BADD>
+<BDB1> <BDB7> <94DF>
+<BDB8> <BDB8> <BADE>
+<BDB9> <BDD1> <94E6>
+<BDD2> <BDD3> <9541>
+<BDD4> <BDD5> <BADF>
+<BDD6> <BDD7> <9543>
+<BDD8> <BDD8> <BAE1>
+<BDD9> <BDDB> <9545>
+<BDDC> <BDDC> <BAE2>
+<BDDD> <BDE8> <9548>
+<BDE9> <BDE9> <BAE3>
+<BDEA> <BDEF> <9554>
+<BDF0> <BDF0> <BAE4>
+<BDF1> <BDF1> <955A>
+<BDF2> <BDF3> <9561>
+endbfrange
+
+100 beginbfrange
+<BDF4> <BDF4> <BAE5>
+<BDF5> <BDF7> <9563>
+<BDF8> <BDF8> <BAE6>
+<BDF9> <BDFF> <9566>
+<BE00> <BE00> <BAE7>
+<BE01> <BE02> <956D>
+<BE03> <BE03> <BAE8>
+<BE04> <BE04> <956F>
+<BE05> <BE05> <BAE9>
+<BE06> <BE0B> <9570>
+<BE0C> <BE0D> <BAEA>
+<BE0E> <BE0F> <9576>
+<BE10> <BE10> <BAEC>
+<BE11> <BE13> <9578>
+<BE14> <BE14> <BAED>
+<BE15> <BE1B> <9581>
+<BE1C> <BE1D> <BAEE>
+<BE1E> <BE1E> <9588>
+<BE1F> <BE1F> <BAF0>
+<BE20> <BE43> <9589>
+<BE44> <BE45> <BAF1>
+<BE46> <BE47> <95AD>
+<BE48> <BE48> <BAF3>
+<BE49> <BE4B> <95AF>
+<BE4C> <BE4C> <BAF4>
+<BE4D> <BE4D> <95B2>
+<BE4E> <BE4E> <BAF5>
+<BE4F> <BE53> <95B3>
+<BE54> <BE55> <BAF6>
+<BE56> <BE56> <95B8>
+<BE57> <BE57> <BAF8>
+<BE58> <BE58> <95B9>
+<BE59> <BE5B> <BAF9>
+<BE5C> <BE5F> <95BA>
+<BE60> <BE61> <BAFC>
+<BE62> <BE63> <95BE>
+<BE64> <BE64> <BAFE>
+<BE65> <BE67> <95C0>
+<BE68> <BE68> <BBA1>
+<BE69> <BE69> <95C3>
+<BE6A> <BE6A> <BBA2>
+<BE6B> <BE6F> <95C4>
+<BE70> <BE71> <BBA3>
+<BE72> <BE72> <95C9>
+<BE73> <BE75> <BBA5>
+<BE76> <BE7A> <95CA>
+<BE7B> <BE7D> <BBA8>
+<BE7E> <BE7F> <95CF>
+<BE80> <BE80> <BBAB>
+<BE81> <BE83> <95D1>
+<BE84> <BE84> <BBAC>
+<BE85> <BE8B> <95D4>
+<BE8C> <BE8D> <BBAD>
+<BE8E> <BE8E> <95DB>
+<BE8F> <BE91> <BBAF>
+<BE92> <BE97> <95DC>
+<BE98> <BE99> <BBB2>
+<BE9A> <BEA7> <95E2>
+<BEA8> <BEA8> <BBB4>
+<BEA9> <BEB7> <95F0>
+<BEB8> <BECF> <9641>
+<BED0> <BED1> <BBB5>
+<BED2> <BED3> <9659>
+<BED4> <BED4> <BBB7>
+<BED5> <BED6> <9661>
+<BED7> <BED8> <BBB8>
+<BED9> <BEDF> <9663>
+<BEE0> <BEE0> <BBBA>
+<BEE1> <BEE2> <966A>
+<BEE3> <BEE5> <BBBB>
+<BEE6> <BEEB> <966C>
+<BEEC> <BEEC> <BBBE>
+<BEED> <BEF5> <9672>
+<BEF6> <BEFF> <9681>
+<BF00> <BF00> <968B>
+<BF01> <BF01> <BBBF>
+<BF02> <BF07> <968C>
+<BF08> <BF09> <BBC0>
+<BF0A> <BF17> <9692>
+<BF18> <BF19> <BBC2>
+<BF1A> <BF1A> <96A0>
+<BF1B> <BF1D> <BBC4>
+<BF1E> <BF3F> <96A1>
+<BF40> <BF41> <BBC7>
+<BF42> <BF43> <96C3>
+<BF44> <BF44> <BBC9>
+<BF45> <BF47> <96C5>
+<BF48> <BF48> <BBCA>
+<BF49> <BF4F> <96C8>
+<BF50> <BF51> <BBCB>
+<BF52> <BF54> <96CF>
+<BF55> <BF55> <BBCD>
+<BF56> <BF82> <96D2>
+<BF83> <BF93> <9741>
+<BF94> <BF94> <BBCE>
+<BF95> <BF9D> <9752>
+<BF9E> <BFAF> <9761>
+<BFB0> <BFB0> <BBCF>
+<BFB1> <BFB8> <9773>
+<BFB9> <BFC4> <9781>
+endbfrange
+
+100 beginbfrange
+<BFC5> <BFC5> <BBD0>
+<BFC6> <BFCB> <978D>
+<BFCC> <BFCD> <BBD1>
+<BFCE> <BFCF> <9793>
+<BFD0> <BFD0> <BBD3>
+<BFD1> <BFD3> <9795>
+<BFD4> <BFD4> <BBD4>
+<BFD5> <BFDB> <9798>
+<BFDC> <BFDC> <BBD5>
+<BFDD> <BFDE> <979F>
+<BFDF> <BFDF> <BBD6>
+<BFE0> <BFE0> <97A1>
+<BFE1> <BFE1> <BBD7>
+<BFE2> <BFFF> <97A2>
+<C000> <C03B> <97C0>
+<C03C> <C03C> <BBD8>
+<C03D> <C03F> <97FC>
+<C040> <C050> <9841>
+<C051> <C051> <BBD9>
+<C052> <C057> <9852>
+<C058> <C058> <BBDA>
+<C059> <C05B> <9858>
+<C05C> <C05C> <BBDB>
+<C05D> <C05F> <9861>
+<C060> <C060> <BBDC>
+<C061> <C067> <9864>
+<C068> <C069> <BBDD>
+<C06A> <C079> <986B>
+<C07A> <C08F> <9881>
+<C090> <C091> <BBDF>
+<C092> <C093> <9897>
+<C094> <C094> <BBE1>
+<C095> <C097> <9899>
+<C098> <C098> <BBE2>
+<C099> <C09F> <989C>
+<C0A0> <C0A1> <BBE3>
+<C0A2> <C0A2> <98A3>
+<C0A3> <C0A3> <BBE5>
+<C0A4> <C0A4> <98A4>
+<C0A5> <C0A5> <BBE6>
+<C0A6> <C0AB> <98A5>
+<C0AC> <C0AD> <BBE7>
+<C0AE> <C0AE> <98AB>
+<C0AF> <C0B0> <BBE9>
+<C0B1> <C0B2> <98AC>
+<C0B3> <C0B6> <BBEB>
+<C0B7> <C0BB> <98AE>
+<C0BC> <C0BD> <BBEF>
+<C0BE> <C0BE> <98B3>
+<C0BF> <C0C1> <BBF1>
+<C0C2> <C0C4> <98B4>
+<C0C5> <C0C5> <BBF4>
+<C0C6> <C0C7> <98B7>
+<C0C8> <C0C9> <BBF5>
+<C0CA> <C0CB> <98B9>
+<C0CC> <C0CC> <BBF7>
+<C0CD> <C0CF> <98BB>
+<C0D0> <C0D0> <BBF8>
+<C0D1> <C0D7> <98BE>
+<C0D8> <C0D9> <BBF9>
+<C0DA> <C0DA> <98C5>
+<C0DB> <C0DD> <BBFB>
+<C0DE> <C0E3> <98C6>
+<C0E4> <C0E4> <BBFE>
+<C0E5> <C0E5> <BCA1>
+<C0E6> <C0E7> <98CC>
+<C0E8> <C0E8> <BCA2>
+<C0E9> <C0EB> <98CE>
+<C0EC> <C0EC> <BCA3>
+<C0ED> <C0F3> <98D1>
+<C0F4> <C0F5> <BCA4>
+<C0F6> <C0F6> <98D8>
+<C0F7> <C0F7> <BCA6>
+<C0F8> <C0F8> <98D9>
+<C0F9> <C0F9> <BCA7>
+<C0FA> <C0FF> <98DA>
+<C100> <C100> <BCA8>
+<C101> <C103> <98E0>
+<C104> <C104> <BCA9>
+<C105> <C107> <98E3>
+<C108> <C108> <BCAA>
+<C109> <C10F> <98E6>
+<C110> <C110> <BCAB>
+<C111> <C114> <98ED>
+<C115> <C115> <BCAC>
+<C116> <C11B> <98F1>
+<C11C> <C120> <BCAD>
+<C121> <C122> <98F7>
+<C123> <C124> <BCB2>
+<C125> <C125> <98F9>
+<C126> <C127> <BCB4>
+<C128> <C12B> <98FA>
+<C12C> <C12D> <BCB6>
+<C12E> <C12E> <98FE>
+<C12F> <C131> <BCB8>
+<C132> <C135> <9941>
+<C136> <C136> <BCBB>
+<C137> <C137> <9945>
+<C138> <C139> <BCBC>
+<C13A> <C13B> <9946>
+endbfrange
+
+100 beginbfrange
+<C13C> <C13C> <BCBE>
+<C13D> <C13F> <9948>
+<C140> <C140> <BCBF>
+<C141> <C147> <994B>
+<C148> <C149> <BCC0>
+<C14A> <C14A> <9952>
+<C14B> <C14D> <BCC2>
+<C14E> <C153> <9953>
+<C154> <C155> <BCC5>
+<C156> <C157> <9959>
+<C158> <C158> <BCC7>
+<C159> <C15B> <9961>
+<C15C> <C15C> <BCC8>
+<C15D> <C163> <9964>
+<C164> <C165> <BCC9>
+<C166> <C166> <996B>
+<C167> <C169> <BCCB>
+<C16A> <C16F> <996C>
+<C170> <C170> <BCCE>
+<C171> <C173> <9972>
+<C174> <C174> <BCCF>
+<C175> <C177> <9975>
+<C178> <C178> <BCD0>
+<C179> <C17B> <9978>
+<C17C> <C184> <9981>
+<C185> <C185> <BCD1>
+<C186> <C18B> <998A>
+<C18C> <C18E> <BCD2>
+<C18F> <C18F> <9990>
+<C190> <C190> <BCD5>
+<C191> <C193> <9991>
+<C194> <C194> <BCD6>
+<C195> <C195> <9994>
+<C196> <C196> <BCD7>
+<C197> <C19B> <9995>
+<C19C> <C19D> <BCD8>
+<C19E> <C19E> <999A>
+<C19F> <C19F> <BCDA>
+<C1A0> <C1A0> <999B>
+<C1A1> <C1A1> <BCDB>
+<C1A2> <C1A4> <999C>
+<C1A5> <C1A5> <BCDC>
+<C1A6> <C1A7> <999F>
+<C1A8> <C1A9> <BCDD>
+<C1AA> <C1AB> <99A1>
+<C1AC> <C1AC> <BCDF>
+<C1AD> <C1AF> <99A3>
+<C1B0> <C1B0> <BCE0>
+<C1B1> <C1BC> <99A6>
+<C1BD> <C1BD> <BCE1>
+<C1BE> <C1C3> <99B2>
+<C1C4> <C1C4> <BCE2>
+<C1C5> <C1C7> <99B8>
+<C1C8> <C1C8> <BCE3>
+<C1C9> <C1CB> <99BB>
+<C1CC> <C1CC> <BCE4>
+<C1CD> <C1D3> <99BE>
+<C1D4> <C1D4> <BCE5>
+<C1D5> <C1D6> <99C5>
+<C1D7> <C1D8> <BCE6>
+<C1D9> <C1DF> <99C7>
+<C1E0> <C1E0> <BCE8>
+<C1E1> <C1E3> <99CE>
+<C1E4> <C1E4> <BCE9>
+<C1E5> <C1E7> <99D1>
+<C1E8> <C1E8> <BCEA>
+<C1E9> <C1EF> <99D4>
+<C1F0> <C1F1> <BCEB>
+<C1F2> <C1F2> <99DB>
+<C1F3> <C1F3> <BCED>
+<C1F4> <C1FB> <99DC>
+<C1FC> <C1FD> <BCEE>
+<C1FE> <C1FF> <99E4>
+<C200> <C200> <BCF0>
+<C201> <C203> <99E6>
+<C204> <C204> <BCF1>
+<C205> <C20B> <99E9>
+<C20C> <C20D> <BCF2>
+<C20E> <C20E> <99F0>
+<C20F> <C20F> <BCF4>
+<C210> <C210> <99F1>
+<C211> <C211> <BCF5>
+<C212> <C217> <99F2>
+<C218> <C219> <BCF6>
+<C21A> <C21B> <99F8>
+<C21C> <C21C> <BCF8>
+<C21D> <C21E> <99FA>
+<C21F> <C220> <BCF9>
+<C221> <C223> <99FC>
+<C224> <C227> <9A41>
+<C228> <C229> <BCFB>
+<C22A> <C22A> <9A45>
+<C22B> <C22B> <BCFD>
+<C22C> <C22C> <9A46>
+<C22D> <C22D> <BCFE>
+<C22E> <C22E> <9A47>
+<C22F> <C22F> <BDA1>
+<C230> <C230> <9A48>
+<C231> <C232> <BDA2>
+<C233> <C233> <9A49>
+endbfrange
+
+100 beginbfrange
+<C234> <C234> <BDA4>
+<C235> <C245> <9A4A>
+<C246> <C247> <9A61>
+<C248> <C248> <BDA5>
+<C249> <C24F> <9A63>
+<C250> <C251> <BDA6>
+<C252> <C253> <9A6A>
+<C254> <C254> <BDA8>
+<C255> <C257> <9A6C>
+<C258> <C258> <BDA9>
+<C259> <C25F> <9A6F>
+<C260> <C260> <BDAA>
+<C261> <C264> <9A76>
+<C265> <C265> <BDAB>
+<C266> <C266> <9A7A>
+<C267> <C26B> <9A81>
+<C26C> <C26D> <BDAC>
+<C26E> <C26F> <9A86>
+<C270> <C270> <BDAE>
+<C271> <C273> <9A88>
+<C274> <C274> <BDAF>
+<C275> <C27B> <9A8B>
+<C27C> <C27D> <BDB0>
+<C27E> <C27E> <9A92>
+<C27F> <C27F> <BDB2>
+<C280> <C280> <9A93>
+<C281> <C281> <BDB3>
+<C282> <C287> <9A94>
+<C288> <C289> <BDB4>
+<C28A> <C28F> <9A9A>
+<C290> <C290> <BDB6>
+<C291> <C297> <9AA0>
+<C298> <C298> <BDB7>
+<C299> <C29A> <9AA7>
+<C29B> <C29B> <BDB8>
+<C29C> <C29C> <9AA9>
+<C29D> <C29D> <BDB9>
+<C29E> <C2A3> <9AAA>
+<C2A4> <C2A5> <BDBA>
+<C2A6> <C2A7> <9AB0>
+<C2A8> <C2A8> <BDBC>
+<C2A9> <C2AB> <9AB2>
+<C2AC> <C2AD> <BDBD>
+<C2AE> <C2B3> <9AB5>
+<C2B4> <C2B5> <BDBF>
+<C2B6> <C2B6> <9ABB>
+<C2B7> <C2B7> <BDC1>
+<C2B8> <C2B8> <9ABC>
+<C2B9> <C2B9> <BDC2>
+<C2BA> <C2DB> <9ABD>
+<C2DC> <C2DD> <BDC3>
+<C2DE> <C2DF> <9ADF>
+<C2E0> <C2E0> <BDC5>
+<C2E1> <C2E2> <9AE1>
+<C2E3> <C2E4> <BDC6>
+<C2E5> <C2EA> <9AE3>
+<C2EB> <C2ED> <BDC8>
+<C2EE> <C2EE> <9AE9>
+<C2EF> <C2EF> <BDCB>
+<C2F0> <C2F0> <9AEA>
+<C2F1> <C2F1> <BDCC>
+<C2F2> <C2F5> <9AEB>
+<C2F6> <C2F6> <BDCD>
+<C2F7> <C2F7> <9AEF>
+<C2F8> <C2F9> <BDCE>
+<C2FA> <C2FA> <9AF0>
+<C2FB> <C2FC> <BDD0>
+<C2FD> <C2FF> <9AF1>
+<C300> <C300> <BDD2>
+<C301> <C307> <9AF4>
+<C308> <C309> <BDD3>
+<C30A> <C30B> <9AFB>
+<C30C> <C30D> <BDD5>
+<C30E> <C30F> <9AFD>
+<C310> <C312> <9B41>
+<C313> <C315> <BDD7>
+<C316> <C317> <9B44>
+<C318> <C318> <BDDA>
+<C319> <C31B> <9B46>
+<C31C> <C31C> <BDDB>
+<C31D> <C323> <9B49>
+<C324> <C325> <BDDC>
+<C326> <C327> <9B50>
+<C328> <C329> <BDDE>
+<C32A> <C332> <9B52>
+<C333> <C344> <9B61>
+<C345> <C345> <BDE0>
+<C346> <C34D> <9B73>
+<C34E> <C367> <9B81>
+<C368> <C369> <BDE1>
+<C36A> <C36B> <9B9B>
+<C36C> <C36C> <BDE3>
+<C36D> <C36F> <9B9D>
+<C370> <C370> <BDE4>
+<C371> <C371> <9BA0>
+<C372> <C372> <BDE5>
+<C373> <C377> <9BA1>
+<C378> <C379> <BDE6>
+<C37A> <C37B> <9BA6>
+<C37C> <C37D> <BDE8>
+endbfrange
+
+100 beginbfrange
+<C37E> <C383> <9BA8>
+<C384> <C384> <BDEA>
+<C385> <C387> <9BAE>
+<C388> <C388> <BDEB>
+<C389> <C38B> <9BB1>
+<C38C> <C38C> <BDEC>
+<C38D> <C3BF> <9BB4>
+<C3C0> <C3C0> <BDED>
+<C3C1> <C3D7> <9BE7>
+<C3D8> <C3D9> <BDEE>
+<C3DA> <C3DA> <9BFE>
+<C3DB> <C3DB> <9C41>
+<C3DC> <C3DC> <BDF0>
+<C3DD> <C3DE> <9C42>
+<C3DF> <C3E0> <BDF1>
+<C3E1> <C3E1> <9C44>
+<C3E2> <C3E2> <BDF3>
+<C3E3> <C3E7> <9C45>
+<C3E8> <C3E9> <BDF4>
+<C3EA> <C3EC> <9C4A>
+<C3ED> <C3ED> <BDF6>
+<C3EE> <C3F3> <9C4D>
+<C3F4> <C3F5> <BDF7>
+<C3F6> <C3F7> <9C53>
+<C3F8> <C3F8> <BDF9>
+<C3F9> <C3FE> <9C55>
+<C3FF> <C3FF> <9C61>
+<C400> <C407> <9C62>
+<C408> <C408> <BDFA>
+<C409> <C40F> <9C6A>
+<C410> <C410> <BDFB>
+<C411> <C41A> <9C71>
+<C41B> <C423> <9C81>
+<C424> <C424> <BDFC>
+<C425> <C42B> <9C8A>
+<C42C> <C42C> <BDFD>
+<C42D> <C42F> <9C91>
+<C430> <C430> <BDFE>
+<C431> <C433> <9C94>
+<C434> <C434> <BEA1>
+<C435> <C43B> <9C97>
+<C43C> <C43D> <BEA2>
+<C43E> <C447> <9C9E>
+<C448> <C448> <BEA4>
+<C449> <C463> <9CA8>
+<C464> <C465> <BEA5>
+<C466> <C467> <9CC3>
+<C468> <C468> <BEA7>
+<C469> <C46B> <9CC5>
+<C46C> <C46C> <BEA8>
+<C46D> <C473> <9CC8>
+<C474> <C475> <BEA9>
+<C476> <C478> <9CCF>
+<C479> <C479> <BEAB>
+<C47A> <C47F> <9CD2>
+<C480> <C480> <BEAC>
+<C481> <C493> <9CD8>
+<C494> <C494> <BEAD>
+<C495> <C49B> <9CEB>
+<C49C> <C49C> <BEAE>
+<C49D> <C4A9> <9CF2>
+<C4AA> <C4B7> <9D41>
+<C4B8> <C4B8> <BEAF>
+<C4B9> <C4BB> <9D4F>
+<C4BC> <C4BC> <BEB0>
+<C4BD> <C4C5> <9D52>
+<C4C6> <C4DF> <9D61>
+<C4E0> <C4E8> <9D81>
+<C4E9> <C4E9> <BEB1>
+<C4EA> <C4EF> <9D8A>
+<C4F0> <C4F1> <BEB2>
+<C4F2> <C4F3> <9D90>
+<C4F4> <C4F4> <BEB4>
+<C4F5> <C4F7> <9D92>
+<C4F8> <C4F8> <BEB5>
+<C4F9> <C4F9> <9D95>
+<C4FA> <C4FA> <BEB6>
+<C4FB> <C4FE> <9D96>
+<C4FF> <C4FF> <BEB7>
+<C500> <C501> <BEB8>
+<C502> <C50B> <9D9A>
+<C50C> <C50C> <BEBA>
+<C50D> <C50F> <9DA4>
+<C510> <C510> <BEBB>
+<C511> <C513> <9DA7>
+<C514> <C514> <BEBC>
+<C515> <C51B> <9DAA>
+<C51C> <C51C> <BEBD>
+<C51D> <C527> <9DB1>
+<C528> <C529> <BEBE>
+<C52A> <C52B> <9DBC>
+<C52C> <C52C> <BEC0>
+<C52D> <C52F> <9DBE>
+<C530> <C530> <BEC1>
+<C531> <C537> <9DC1>
+<C538> <C539> <BEC2>
+<C53A> <C53A> <9DC8>
+<C53B> <C53B> <BEC4>
+<C53C> <C53C> <9DC9>
+<C53D> <C53D> <BEC5>
+endbfrange
+
+100 beginbfrange
+<C53E> <C543> <9DCA>
+<C544> <C545> <BEC6>
+<C546> <C547> <9DD0>
+<C548> <C54A> <BEC8>
+<C54B> <C54B> <9DD2>
+<C54C> <C54E> <BECB>
+<C54F> <C552> <9DD3>
+<C553> <C555> <BECE>
+<C556> <C556> <9DD7>
+<C557> <C559> <BED1>
+<C55A> <C55C> <9DD8>
+<C55D> <C55E> <BED4>
+<C55F> <C55F> <9DDB>
+<C560> <C561> <BED6>
+<C562> <C563> <9DDC>
+<C564> <C564> <BED8>
+<C565> <C567> <9DDE>
+<C568> <C568> <BED9>
+<C569> <C56F> <9DE1>
+<C570> <C571> <BEDA>
+<C572> <C572> <9DE8>
+<C573> <C575> <BEDC>
+<C576> <C57B> <9DE9>
+<C57C> <C57D> <BEDF>
+<C57E> <C57F> <9DEF>
+<C580> <C580> <BEE1>
+<C581> <C583> <9DF1>
+<C584> <C584> <BEE2>
+<C585> <C586> <9DF4>
+<C587> <C587> <BEE3>
+<C588> <C58B> <9DF6>
+<C58C> <C58D> <BEE4>
+<C58E> <C58E> <9DFA>
+<C58F> <C58F> <BEE6>
+<C590> <C590> <9DFB>
+<C591> <C591> <BEE7>
+<C592> <C594> <9DFC>
+<C595> <C595> <BEE8>
+<C596> <C596> <9E41>
+<C597> <C598> <BEE9>
+<C599> <C59B> <9E42>
+<C59C> <C59C> <BEEB>
+<C59D> <C59F> <9E45>
+<C5A0> <C5A0> <BEEC>
+<C5A1> <C5A8> <9E48>
+<C5A9> <C5A9> <BEED>
+<C5AA> <C5B3> <9E50>
+<C5B4> <C5B5> <BEEE>
+<C5B6> <C5B6> <9E5A>
+<C5B7> <C5B7> <9E61>
+<C5B8> <C5B9> <BEF0>
+<C5BA> <C5BA> <9E62>
+<C5BB> <C5BE> <BEF2>
+<C5BF> <C5C3> <9E63>
+<C5C4> <C5CA> <BEF6>
+<C5CB> <C5CB> <9E68>
+<C5CC> <C5CC> <BEFD>
+<C5CD> <C5CD> <9E69>
+<C5CE> <C5CE> <BEFE>
+<C5CF> <C5CF> <9E6A>
+<C5D0> <C5D1> <BFA1>
+<C5D2> <C5D3> <9E6B>
+<C5D4> <C5D4> <BFA3>
+<C5D5> <C5D7> <9E6D>
+<C5D8> <C5D8> <BFA4>
+<C5D9> <C5DF> <9E70>
+<C5E0> <C5E1> <BFA5>
+<C5E2> <C5E2> <9E77>
+<C5E3> <C5E3> <BFA7>
+<C5E4> <C5E4> <9E78>
+<C5E5> <C5E5> <BFA8>
+<C5E6> <C5E7> <9E79>
+<C5E8> <C5EB> <9E81>
+<C5EC> <C5EE> <BFA9>
+<C5EF> <C5EF> <9E85>
+<C5F0> <C5F0> <BFAC>
+<C5F1> <C5F3> <9E86>
+<C5F4> <C5F4> <BFAD>
+<C5F5> <C5F5> <9E89>
+<C5F6> <C5F7> <BFAE>
+<C5F8> <C5FB> <9E8A>
+<C5FC> <C5FF> <BFB0>
+<C600> <C601> <BFB4>
+<C602> <C604> <9E8E>
+<C605> <C608> <BFB6>
+<C609> <C60B> <9E91>
+<C60C> <C60C> <BFBA>
+<C60D> <C60F> <9E94>
+<C610> <C610> <BFBB>
+<C611> <C617> <9E97>
+<C618> <C619> <BFBC>
+<C61A> <C61A> <9E9E>
+<C61B> <C61C> <BFBE>
+<C61D> <C623> <9E9F>
+<C624> <C625> <BFC0>
+<C626> <C627> <9EA6>
+<C628> <C628> <BFC2>
+<C629> <C62B> <9EA8>
+<C62C> <C62E> <BFC3>
+<C62F> <C62F> <9EAB>
+endbfrange
+
+100 beginbfrange
+<C630> <C630> <BFC6>
+<C631> <C632> <9EAC>
+<C633> <C635> <BFC7>
+<C636> <C636> <9EAE>
+<C637> <C637> <BFCA>
+<C638> <C638> <9EAF>
+<C639> <C639> <BFCB>
+<C63A> <C63A> <9EB0>
+<C63B> <C63B> <BFCC>
+<C63C> <C63F> <9EB1>
+<C640> <C641> <BFCD>
+<C642> <C643> <9EB5>
+<C644> <C644> <BFCF>
+<C645> <C647> <9EB7>
+<C648> <C648> <BFD0>
+<C649> <C64F> <9EBA>
+<C650> <C651> <BFD1>
+<C652> <C652> <9EC1>
+<C653> <C655> <BFD3>
+<C656> <C65B> <9EC2>
+<C65C> <C65D> <BFD6>
+<C65E> <C65F> <9EC8>
+<C660> <C660> <BFD8>
+<C661> <C66B> <9ECA>
+<C66C> <C66C> <BFD9>
+<C66D> <C66E> <9ED5>
+<C66F> <C66F> <BFDA>
+<C670> <C670> <9ED7>
+<C671> <C671> <BFDB>
+<C672> <C677> <9ED8>
+<C678> <C679> <BFDC>
+<C67A> <C67B> <9EDE>
+<C67C> <C67C> <BFDE>
+<C67D> <C67F> <9EE0>
+<C680> <C680> <BFDF>
+<C681> <C687> <9EE3>
+<C688> <C689> <BFE0>
+<C68A> <C68A> <9EEA>
+<C68B> <C68B> <BFE2>
+<C68C> <C68C> <9EEB>
+<C68D> <C68D> <BFE3>
+<C68E> <C693> <9EEC>
+<C694> <C695> <BFE4>
+<C696> <C697> <9EF2>
+<C698> <C698> <BFE6>
+<C699> <C69B> <9EF4>
+<C69C> <C69C> <BFE7>
+<C69D> <C6A3> <9EF7>
+<C6A4> <C6A5> <BFE8>
+<C6A6> <C6A6> <9EFE>
+<C6A7> <C6A7> <BFEA>
+<C6A8> <C6A8> <9F41>
+<C6A9> <C6A9> <BFEB>
+<C6AA> <C6AF> <9F42>
+<C6B0> <C6B1> <BFEC>
+<C6B2> <C6B3> <9F48>
+<C6B4> <C6B4> <BFEE>
+<C6B5> <C6B7> <9F4A>
+<C6B8> <C6BA> <BFEF>
+<C6BB> <C6BF> <9F4D>
+<C6C0> <C6C1> <BFF2>
+<C6C2> <C6C2> <9F52>
+<C6C3> <C6C3> <BFF4>
+<C6C4> <C6C4> <9F53>
+<C6C5> <C6C5> <BFF5>
+<C6C6> <C6CB> <9F54>
+<C6CC> <C6CD> <BFF6>
+<C6CE> <C6CE> <9F5A>
+<C6CF> <C6CF> <9F61>
+<C6D0> <C6D0> <BFF8>
+<C6D1> <C6D3> <9F62>
+<C6D4> <C6D4> <BFF9>
+<C6D5> <C6DB> <9F65>
+<C6DC> <C6DD> <BFFA>
+<C6DE> <C6DF> <9F6C>
+<C6E0> <C6E1> <BFFC>
+<C6E2> <C6E7> <9F6E>
+<C6E8> <C6E8> <BFFE>
+<C6E9> <C6E9> <C0A1>
+<C6EA> <C6EB> <9F74>
+<C6EC> <C6EC> <C0A2>
+<C6ED> <C6EF> <9F76>
+<C6F0> <C6F0> <C0A3>
+<C6F1> <C6F2> <9F79>
+<C6F3> <C6F7> <9F81>
+<C6F8> <C6F9> <C0A4>
+<C6FA> <C6FC> <9F86>
+<C6FD> <C6FD> <C0A6>
+<C6FE> <C6FF> <9F89>
+<C700> <C703> <9F8B>
+<C704> <C705> <C0A7>
+<C706> <C707> <9F8F>
+<C708> <C708> <C0A9>
+<C709> <C70B> <9F91>
+<C70C> <C70C> <C0AA>
+<C70D> <C713> <9F94>
+<C714> <C715> <C0AB>
+<C716> <C716> <9F9B>
+<C717> <C717> <C0AD>
+<C718> <C718> <9F9C>
+endbfrange
+
+100 beginbfrange
+<C719> <C719> <C0AE>
+<C71A> <C71F> <9F9D>
+<C720> <C721> <C0AF>
+<C722> <C723> <9FA3>
+<C724> <C724> <C0B1>
+<C725> <C727> <9FA5>
+<C728> <C728> <C0B2>
+<C729> <C72F> <9FA8>
+<C730> <C731> <C0B3>
+<C732> <C732> <9FAF>
+<C733> <C733> <C0B5>
+<C734> <C734> <9FB0>
+<C735> <C735> <C0B6>
+<C736> <C736> <9FB1>
+<C737> <C737> <C0B7>
+<C738> <C73B> <9FB2>
+<C73C> <C73D> <C0B8>
+<C73E> <C73F> <9FB6>
+<C740> <C740> <C0BA>
+<C741> <C743> <9FB8>
+<C744> <C744> <C0BB>
+<C745> <C749> <9FBB>
+<C74A> <C74A> <C0BC>
+<C74B> <C74B> <9FC0>
+<C74C> <C74D> <C0BD>
+<C74E> <C74E> <9FC1>
+<C74F> <C74F> <C0BF>
+<C750> <C750> <9FC2>
+<C751> <C758> <C0C0>
+<C759> <C75B> <9FC3>
+<C75C> <C75C> <C0C8>
+<C75D> <C75F> <9FC6>
+<C760> <C760> <C0C9>
+<C761> <C767> <9FC9>
+<C768> <C768> <C0CA>
+<C769> <C76A> <9FD0>
+<C76B> <C76B> <C0CB>
+<C76C> <C773> <9FD2>
+<C774> <C775> <C0CC>
+<C776> <C777> <9FDA>
+<C778> <C778> <C0CE>
+<C779> <C77B> <9FDC>
+<C77C> <C77E> <C0CF>
+<C77F> <C782> <9FDF>
+<C783> <C785> <C0D2>
+<C786> <C786> <9FE3>
+<C787> <C78A> <C0D5>
+<C78B> <C78D> <9FE4>
+<C78E> <C78E> <C0D9>
+<C78F> <C78F> <9FE7>
+<C790> <C791> <C0DA>
+<C792> <C793> <9FE8>
+<C794> <C794> <C0DC>
+<C795> <C795> <9FEA>
+<C796> <C798> <C0DD>
+<C799> <C799> <9FEB>
+<C79A> <C79A> <C0E0>
+<C79B> <C79F> <9FEC>
+<C7A0> <C7A1> <C0E1>
+<C7A2> <C7A2> <9FF1>
+<C7A3> <C7A6> <C0E3>
+<C7A7> <C7AB> <9FF2>
+<C7AC> <C7AD> <C0E7>
+<C7AE> <C7AF> <9FF7>
+<C7B0> <C7B0> <C0E9>
+<C7B1> <C7B3> <9FF9>
+<C7B4> <C7B4> <C0EA>
+<C7B5> <C7B7> <9FFC>
+<C7B8> <C7BB> <A041>
+<C7BC> <C7BD> <C0EB>
+<C7BE> <C7BE> <A045>
+<C7BF> <C7C1> <C0ED>
+<C7C2> <C7C7> <A046>
+<C7C8> <C7C9> <C0F0>
+<C7CA> <C7CB> <A04C>
+<C7CC> <C7CC> <C0F2>
+<C7CD> <C7CD> <A04E>
+<C7CE> <C7CE> <C0F3>
+<C7CF> <C7CF> <A04F>
+<C7D0> <C7D0> <C0F4>
+<C7D1> <C7D7> <A050>
+<C7D8> <C7D8> <C0F5>
+<C7D9> <C7DC> <A057>
+<C7DD> <C7DD> <C0F6>
+<C7DE> <C7E3> <A061>
+<C7E4> <C7E4> <C0F7>
+<C7E5> <C7E7> <A067>
+<C7E8> <C7E8> <C0F8>
+<C7E9> <C7EB> <A06A>
+<C7EC> <C7EC> <C0F9>
+<C7ED> <C7FA> <A06D>
+<C7FB> <C7FF> <A081>
+<C800> <C801> <C0FA>
+<C802> <C803> <A086>
+<C804> <C804> <C0FC>
+<C805> <C807> <A088>
+<C808> <C808> <C0FD>
+<C809> <C809> <A08B>
+<C80A> <C80A> <C0FE>
+<C80B> <C80F> <A08C>
+endbfrange
+
+100 beginbfrange
+<C810> <C811> <C1A1>
+<C812> <C812> <A091>
+<C813> <C813> <C1A3>
+<C814> <C814> <A092>
+<C815> <C816> <C1A4>
+<C817> <C81B> <A093>
+<C81C> <C81D> <C1A6>
+<C81E> <C81F> <A098>
+<C820> <C820> <C1A8>
+<C821> <C823> <A09A>
+<C824> <C824> <C1A9>
+<C825> <C82B> <A09D>
+<C82C> <C82D> <C1AA>
+<C82E> <C82E> <A0A4>
+<C82F> <C82F> <C1AC>
+<C830> <C830> <A0A5>
+<C831> <C831> <C1AD>
+<C832> <C837> <A0A6>
+<C838> <C838> <C1AE>
+<C839> <C83B> <A0AC>
+<C83C> <C83C> <C1AF>
+<C83D> <C83F> <A0AF>
+<C840> <C840> <C1B0>
+<C841> <C847> <A0B2>
+<C848> <C849> <C1B1>
+<C84A> <C84B> <A0B9>
+<C84C> <C84D> <C1B3>
+<C84E> <C853> <A0BB>
+<C854> <C854> <C1B5>
+<C855> <C86F> <A0C1>
+<C870> <C871> <C1B6>
+<C872> <C873> <A0DC>
+<C874> <C874> <C1B8>
+<C875> <C877> <A0DE>
+<C878> <C878> <C1B9>
+<C879> <C879> <A0E1>
+<C87A> <C87A> <C1BA>
+<C87B> <C87F> <A0E2>
+<C880> <C881> <C1BB>
+<C882> <C882> <A0E7>
+<C883> <C883> <C1BD>
+<C884> <C884> <A0E8>
+<C885> <C887> <C1BE>
+<C888> <C88A> <A0E9>
+<C88B> <C88D> <C1C1>
+<C88E> <C893> <A0EC>
+<C894> <C894> <C1C4>
+<C895> <C89C> <A0F2>
+<C89D> <C89D> <C1C5>
+<C89E> <C89E> <A0FA>
+<C89F> <C89F> <C1C6>
+<C8A0> <C8A0> <A0FB>
+<C8A1> <C8A1> <C1C7>
+<C8A2> <C8A4> <A0FC>
+<C8A5> <C8A7> <A141>
+<C8A8> <C8A8> <C1C8>
+<C8A9> <C8BB> <A144>
+<C8BC> <C8BD> <C1C9>
+<C8BE> <C8C1> <A157>
+<C8C2> <C8C3> <A161>
+<C8C4> <C8C4> <C1CB>
+<C8C5> <C8C7> <A163>
+<C8C8> <C8C8> <C1CC>
+<C8C9> <C8CB> <A166>
+<C8CC> <C8CC> <C1CD>
+<C8CD> <C8D3> <A169>
+<C8D4> <C8D5> <C1CE>
+<C8D6> <C8D6> <A170>
+<C8D7> <C8D7> <C1D0>
+<C8D8> <C8D8> <A171>
+<C8D9> <C8D9> <C1D1>
+<C8DA> <C8DF> <A172>
+<C8E0> <C8E1> <C1D2>
+<C8E2> <C8E3> <A178>
+<C8E4> <C8E4> <C1D4>
+<C8E5> <C8E5> <A17A>
+<C8E6> <C8F4> <A181>
+<C8F5> <C8F5> <C1D5>
+<C8F6> <C8FB> <A190>
+<C8FC> <C8FD> <C1D6>
+<C8FE> <C8FF> <A196>
+<C900> <C900> <C1D8>
+<C901> <C903> <A198>
+<C904> <C906> <C1D9>
+<C907> <C90B> <A19B>
+<C90C> <C90D> <C1DC>
+<C90E> <C90E> <A1A0>
+<C90F> <C90F> <C1DE>
+<C910> <C910> <A241>
+<C911> <C911> <C1DF>
+<C912> <C917> <A242>
+<C918> <C918> <C1E0>
+<C919> <C92B> <A248>
+<C92C> <C92C> <C1E1>
+<C92D> <C933> <A261>
+<C934> <C934> <C1E2>
+<C935> <C947> <A268>
+<C948> <C94F> <A281>
+<C950> <C951> <C1E3>
+<C952> <C953> <A289>
+endbfrange
+
+100 beginbfrange
+<C954> <C954> <C1E5>
+<C955> <C957> <A28B>
+<C958> <C958> <C1E6>
+<C959> <C95F> <A28E>
+<C960> <C961> <C1E7>
+<C962> <C962> <A295>
+<C963> <C963> <C1E9>
+<C964> <C96B> <A296>
+<C96C> <C96C> <C1EA>
+<C96D> <C96F> <A29E>
+<C970> <C970> <C1EB>
+<C971> <C973> <A341>
+<C974> <C974> <C1EC>
+<C975> <C97B> <A344>
+<C97C> <C97C> <C1ED>
+<C97D> <C987> <A34B>
+<C988> <C989> <C1EE>
+<C98A> <C98B> <A356>
+<C98C> <C98C> <C1F0>
+<C98D> <C98F> <A358>
+<C990> <C990> <C1F1>
+<C991> <C997> <A361>
+<C998> <C999> <C1F2>
+<C99A> <C99A> <A368>
+<C99B> <C99B> <C1F4>
+<C99C> <C99C> <A369>
+<C99D> <C99D> <C1F5>
+<C99E> <C9AE> <A36A>
+<C9AF> <C9BF> <A381>
+<C9C0> <C9C1> <C1F6>
+<C9C2> <C9C3> <A392>
+<C9C4> <C9C4> <C1F8>
+<C9C5> <C9C6> <A394>
+<C9C7> <C9C8> <C1F9>
+<C9C9> <C9C9> <A396>
+<C9CA> <C9CA> <C1FB>
+<C9CB> <C9CF> <A397>
+<C9D0> <C9D1> <C1FC>
+<C9D2> <C9D2> <A39C>
+<C9D3> <C9D3> <C1FE>
+<C9D4> <C9D4> <A39D>
+<C9D5> <C9D6> <C2A1>
+<C9D7> <C9D8> <A39E>
+<C9D9> <C9DA> <C2A3>
+<C9DB> <C9DB> <A3A0>
+<C9DC> <C9DD> <C2A5>
+<C9DE> <C9DF> <A441>
+<C9E0> <C9E0> <C2A7>
+<C9E1> <C9E1> <A443>
+<C9E2> <C9E2> <C2A8>
+<C9E3> <C9E3> <A444>
+<C9E4> <C9E4> <C2A9>
+<C9E5> <C9E6> <A445>
+<C9E7> <C9E7> <C2AA>
+<C9E8> <C9EB> <A447>
+<C9EC> <C9ED> <C2AB>
+<C9EE> <C9EE> <A44B>
+<C9EF> <C9F1> <C2AD>
+<C9F2> <C9F7> <A44C>
+<C9F8> <C9F9> <C2B0>
+<C9FA> <C9FB> <A452>
+<C9FC> <C9FC> <C2B2>
+<C9FD> <C9FF> <A454>
+<CA00> <CA00> <C2B3>
+<CA01> <CA04> <A457>
+<CA05> <CA07> <A461>
+<CA08> <CA09> <C2B4>
+<CA0A> <CA0A> <A464>
+<CA0B> <CA0D> <C2B6>
+<CA0E> <CA13> <A465>
+<CA14> <CA14> <C2B9>
+<CA15> <CA17> <A46B>
+<CA18> <CA18> <C2BA>
+<CA19> <CA25> <A46E>
+<CA26> <CA28> <A481>
+<CA29> <CA29> <C2BB>
+<CA2A> <CA46> <A484>
+<CA47> <CA4B> <A541>
+<CA4C> <CA4D> <C2BC>
+<CA4E> <CA4F> <A546>
+<CA50> <CA50> <C2BE>
+<CA51> <CA53> <A548>
+<CA54> <CA54> <C2BF>
+<CA55> <CA5B> <A54B>
+<CA5C> <CA5D> <C2C0>
+<CA5E> <CA5E> <A552>
+<CA5F> <CA61> <C2C2>
+<CA62> <CA67> <A553>
+<CA68> <CA68> <C2C5>
+<CA69> <CA6A> <A559>
+<CA6B> <CA7C> <A561>
+<CA7D> <CA7D> <C2C6>
+<CA7E> <CA83> <A573>
+<CA84> <CA84> <C2C7>
+<CA85> <CA86> <A579>
+<CA87> <CA97> <A581>
+<CA98> <CA98> <C2C8>
+<CA99> <CAA7> <A592>
+<CAA8> <CABB> <A641>
+<CABC> <CABD> <C2C9>
+endbfrange
+
+100 beginbfrange
+<CABE> <CABF> <A655>
+<CAC0> <CAC0> <C2CB>
+<CAC1> <CAC3> <A657>
+<CAC4> <CAC4> <C2CC>
+<CAC5> <CAC5> <A65A>
+<CAC6> <CACB> <A661>
+<CACC> <CACD> <C2CD>
+<CACE> <CACE> <A667>
+<CACF> <CACF> <C2CF>
+<CAD0> <CAD0> <A668>
+<CAD1> <CAD1> <C2D0>
+<CAD2> <CAD2> <A669>
+<CAD3> <CAD3> <C2D1>
+<CAD4> <CAD7> <A66A>
+<CAD8> <CAD9> <C2D2>
+<CADA> <CADF> <A66E>
+<CAE0> <CAE0> <C2D4>
+<CAE1> <CAE7> <A674>
+<CAE8> <CAEB> <A681>
+<CAEC> <CAEC> <C2D5>
+<CAED> <CAF3> <A685>
+<CAF4> <CAF4> <C2D6>
+<CAF5> <CAFF> <A68C>
+<CB00> <CB07> <A697>
+<CB08> <CB08> <C2D7>
+<CB09> <CB0A> <A69F>
+<CB0B> <CB0F> <A741>
+<CB10> <CB10> <C2D8>
+<CB11> <CB13> <A746>
+<CB14> <CB14> <C2D9>
+<CB15> <CB17> <A749>
+<CB18> <CB18> <C2DA>
+<CB19> <CB1F> <A74C>
+<CB20> <CB21> <C2DB>
+<CB22> <CB29> <A753>
+<CB2A> <CB40> <A761>
+<CB41> <CB41> <C2DD>
+<CB42> <CB44> <A778>
+<CB45> <CB47> <A781>
+<CB48> <CB49> <C2DE>
+<CB4A> <CB4B> <A784>
+<CB4C> <CB4C> <C2E0>
+<CB4D> <CB4F> <A786>
+<CB50> <CB50> <C2E1>
+<CB51> <CB57> <A789>
+<CB58> <CB59> <C2E2>
+<CB5A> <CB5C> <A790>
+<CB5D> <CB5D> <C2E4>
+<CB5E> <CB63> <A793>
+<CB64> <CB64> <C2E5>
+<CB65> <CB6C> <A799>
+<CB6D> <CB77> <A841>
+<CB78> <CB79> <C2E6>
+<CB7A> <CB88> <A84C>
+<CB89> <CB9B> <A861>
+<CB9C> <CB9C> <C2E8>
+<CB9D> <CBA3> <A874>
+<CBA4> <CBB7> <A881>
+<CBB8> <CBB8> <C2E9>
+<CBB9> <CBC4> <A895>
+<CBC5> <CBD3> <A941>
+<CBD4> <CBD4> <C2EA>
+<CBD5> <CBDF> <A950>
+<CBE0> <CBE3> <A961>
+<CBE4> <CBE4> <C2EB>
+<CBE5> <CBE6> <A965>
+<CBE7> <CBE7> <C2EC>
+<CBE8> <CBE8> <A967>
+<CBE9> <CBE9> <C2ED>
+<CBEA> <CBFC> <A968>
+<CBFD> <CBFF> <A981>
+<CC00> <CC0B> <A984>
+<CC0C> <CC0D> <C2EE>
+<CC0E> <CC0F> <A990>
+<CC10> <CC10> <C2F0>
+<CC11> <CC13> <A992>
+<CC14> <CC14> <C2F1>
+<CC15> <CC1B> <A995>
+<CC1C> <CC1D> <C2F2>
+<CC1E> <CC20> <A99C>
+<CC21> <CC22> <C2F4>
+<CC23> <CC24> <A99F>
+<CC25> <CC26> <AA41>
+<CC27> <CC29> <C2F6>
+<CC2A> <CC2B> <AA43>
+<CC2C> <CC2C> <C2F9>
+<CC2D> <CC2D> <AA45>
+<CC2E> <CC2E> <C2FA>
+<CC2F> <CC2F> <AA46>
+<CC30> <CC30> <C2FB>
+<CC31> <CC37> <AA47>
+<CC38> <CC39> <C2FC>
+<CC3A> <CC3A> <AA4E>
+<CC3B> <CC3B> <C2FE>
+<CC3C> <CC3E> <C3A1>
+<CC3F> <CC43> <AA4F>
+<CC44> <CC45> <C3A4>
+<CC46> <CC47> <AA54>
+<CC48> <CC48> <C3A6>
+<CC49> <CC4B> <AA56>
+endbfrange
+
+100 beginbfrange
+<CC4C> <CC4C> <C3A7>
+<CC4D> <CC4E> <AA59>
+<CC4F> <CC53> <AA61>
+<CC54> <CC55> <C3A8>
+<CC56> <CC56> <AA66>
+<CC57> <CC59> <C3AA>
+<CC5A> <CC5F> <AA67>
+<CC60> <CC60> <C3AD>
+<CC61> <CC63> <AA6D>
+<CC64> <CC64> <C3AE>
+<CC65> <CC65> <AA70>
+<CC66> <CC66> <C3AF>
+<CC67> <CC67> <AA71>
+<CC68> <CC68> <C3B0>
+<CC69> <CC6F> <AA72>
+<CC70> <CC70> <C3B1>
+<CC71> <CC72> <AA79>
+<CC73> <CC74> <AA81>
+<CC75> <CC75> <C3B2>
+<CC76> <CC93> <AA83>
+<CC94> <CC97> <AB41>
+<CC98> <CC99> <C3B3>
+<CC9A> <CC9B> <AB45>
+<CC9C> <CC9C> <C3B5>
+<CC9D> <CC9F> <AB47>
+<CCA0> <CCA0> <C3B6>
+<CCA1> <CCA7> <AB4A>
+<CCA8> <CCA9> <C3B7>
+<CCAA> <CCAA> <AB51>
+<CCAB> <CCAD> <C3B9>
+<CCAE> <CCB3> <AB52>
+<CCB4> <CCB5> <C3BC>
+<CCB6> <CCB7> <AB58>
+<CCB8> <CCB8> <C3BE>
+<CCB9> <CCB9> <AB5A>
+<CCBA> <CCBB> <AB61>
+<CCBC> <CCBC> <C3BF>
+<CCBD> <CCC3> <AB63>
+<CCC4> <CCC5> <C3C0>
+<CCC6> <CCC6> <AB6A>
+<CCC7> <CCC7> <C3C2>
+<CCC8> <CCC8> <AB6B>
+<CCC9> <CCC9> <C3C3>
+<CCCA> <CCCF> <AB6C>
+<CCD0> <CCD0> <C3C4>
+<CCD1> <CCD3> <AB72>
+<CCD4> <CCD4> <C3C5>
+<CCD5> <CCDA> <AB75>
+<CCDB> <CCE3> <AB81>
+<CCE4> <CCE4> <C3C6>
+<CCE5> <CCEB> <AB8A>
+<CCEC> <CCEC> <C3C7>
+<CCED> <CCEF> <AB91>
+<CCF0> <CCF0> <C3C8>
+<CCF1> <CCFD> <AB94>
+<CCFE> <CCFF> <AC41>
+<CD00> <CD00> <AC43>
+<CD01> <CD01> <C3C9>
+<CD02> <CD07> <AC44>
+<CD08> <CD09> <C3CA>
+<CD0A> <CD0B> <AC4A>
+<CD0C> <CD0C> <C3CC>
+<CD0D> <CD0F> <AC4C>
+<CD10> <CD10> <C3CD>
+<CD11> <CD17> <AC4F>
+<CD18> <CD19> <C3CE>
+<CD1A> <CD1A> <AC56>
+<CD1B> <CD1B> <C3D0>
+<CD1C> <CD1C> <AC57>
+<CD1D> <CD1D> <C3D1>
+<CD1E> <CD20> <AC58>
+<CD21> <CD23> <AC61>
+<CD24> <CD24> <C3D2>
+<CD25> <CD27> <AC64>
+<CD28> <CD28> <C3D3>
+<CD29> <CD2B> <AC67>
+<CD2C> <CD2C> <C3D4>
+<CD2D> <CD38> <AC6A>
+<CD39> <CD39> <C3D5>
+<CD3A> <CD3E> <AC76>
+<CD3F> <CD5B> <AC81>
+<CD5C> <CD5C> <C3D6>
+<CD5D> <CD5F> <AC9E>
+<CD60> <CD60> <C3D7>
+<CD61> <CD63> <AD41>
+<CD64> <CD64> <C3D8>
+<CD65> <CD6B> <AD44>
+<CD6C> <CD6D> <C3D9>
+<CD6E> <CD6E> <AD4B>
+<CD6F> <CD6F> <C3DB>
+<CD70> <CD70> <AD4C>
+<CD71> <CD71> <C3DC>
+<CD72> <CD77> <AD4D>
+<CD78> <CD78> <C3DD>
+<CD79> <CD80> <AD53>
+<CD81> <CD87> <AD61>
+<CD88> <CD88> <C3DE>
+<CD89> <CD93> <AD68>
+<CD94> <CD95> <C3DF>
+<CD96> <CD97> <AD73>
+endbfrange
+
+100 beginbfrange
+<CD98> <CD98> <C3E1>
+<CD99> <CD9B> <AD75>
+<CD9C> <CD9C> <C3E2>
+<CD9D> <CD9F> <AD78>
+<CDA0> <CDA3> <AD81>
+<CDA4> <CDA5> <C3E3>
+<CDA6> <CDA6> <AD85>
+<CDA7> <CDA7> <C3E5>
+<CDA8> <CDA8> <AD86>
+<CDA9> <CDA9> <C3E6>
+<CDAA> <CDAF> <AD87>
+<CDB0> <CDB0> <C3E7>
+<CDB1> <CDC3> <AD8D>
+<CDC4> <CDC4> <C3E8>
+<CDC5> <CDC5> <ADA0>
+<CDC6> <CDCB> <AE41>
+<CDCC> <CDCC> <C3E9>
+<CDCD> <CDCF> <AE47>
+<CDD0> <CDD0> <C3EA>
+<CDD1> <CDE1> <AE4A>
+<CDE2> <CDE7> <AE61>
+<CDE8> <CDE8> <C3EB>
+<CDE9> <CDEB> <AE67>
+<CDEC> <CDEC> <C3EC>
+<CDED> <CDEF> <AE6A>
+<CDF0> <CDF0> <C3ED>
+<CDF1> <CDF7> <AE6D>
+<CDF8> <CDF9> <C3EE>
+<CDFA> <CDFA> <AE74>
+<CDFB> <CDFB> <C3F0>
+<CDFC> <CDFC> <AE75>
+<CDFD> <CDFD> <C3F1>
+<CDFE> <CDFF> <AE76>
+<CE00> <CE02> <AE78>
+<CE03> <CE03> <AE81>
+<CE04> <CE04> <C3F2>
+<CE05> <CE07> <AE82>
+<CE08> <CE08> <C3F3>
+<CE09> <CE0B> <AE85>
+<CE0C> <CE0C> <C3F4>
+<CE0D> <CE13> <AE88>
+<CE14> <CE14> <C3F5>
+<CE15> <CE18> <AE8F>
+<CE19> <CE19> <C3F6>
+<CE1A> <CE1F> <AE93>
+<CE20> <CE21> <C3F7>
+<CE22> <CE23> <AE99>
+<CE24> <CE24> <C3F9>
+<CE25> <CE27> <AE9B>
+<CE28> <CE28> <C3FA>
+<CE29> <CE2B> <AE9E>
+<CE2C> <CE2F> <AF41>
+<CE30> <CE31> <C3FB>
+<CE32> <CE32> <AF45>
+<CE33> <CE33> <C3FD>
+<CE34> <CE34> <AF46>
+<CE35> <CE35> <C3FE>
+<CE36> <CE49> <AF47>
+<CE4A> <CE57> <AF61>
+<CE58> <CE59> <C4A1>
+<CE5A> <CE5B> <AF6F>
+<CE5C> <CE5C> <C4A3>
+<CE5D> <CE5E> <AF71>
+<CE5F> <CE61> <C4A4>
+<CE62> <CE67> <AF73>
+<CE68> <CE69> <C4A7>
+<CE6A> <CE6A> <AF79>
+<CE6B> <CE6B> <C4A9>
+<CE6C> <CE6C> <AF7A>
+<CE6D> <CE6D> <C4AA>
+<CE6E> <CE73> <AF81>
+<CE74> <CE75> <C4AB>
+<CE76> <CE77> <AF87>
+<CE78> <CE78> <C4AD>
+<CE79> <CE7B> <AF89>
+<CE7C> <CE7C> <C4AE>
+<CE7D> <CE83> <AF8C>
+<CE84> <CE85> <C4AF>
+<CE86> <CE86> <AF93>
+<CE87> <CE87> <C4B1>
+<CE88> <CE88> <AF94>
+<CE89> <CE89> <C4B2>
+<CE8A> <CE8F> <AF95>
+<CE90> <CE91> <C4B3>
+<CE92> <CE93> <AF9B>
+<CE94> <CE94> <C4B5>
+<CE95> <CE97> <AF9D>
+<CE98> <CE98> <C4B6>
+<CE99> <CE99> <AFA0>
+<CE9A> <CE9F> <B041>
+<CEA0> <CEA1> <C4B7>
+<CEA2> <CEA2> <B047>
+<CEA3> <CEA5> <C4B9>
+<CEA6> <CEAB> <B048>
+<CEAC> <CEAD> <C4BC>
+<CEAE> <CEBA> <B04E>
+<CEBB> <CEC0> <B061>
+<CEC1> <CEC1> <C4BE>
+<CEC2> <CED5> <B067>
+<CED6> <CEE3> <B081>
+endbfrange
+
+100 beginbfrange
+<CEE4> <CEE5> <C4BF>
+<CEE6> <CEE7> <B08F>
+<CEE8> <CEE8> <C4C1>
+<CEE9> <CEEA> <B091>
+<CEEB> <CEEC> <C4C2>
+<CEED> <CEF3> <B093>
+<CEF4> <CEF5> <C4C4>
+<CEF6> <CEF6> <B09A>
+<CEF7> <CEF9> <C4C6>
+<CEFA> <CEFF> <B09B>
+<CF00> <CF01> <C4C9>
+<CF02> <CF03> <B141>
+<CF04> <CF04> <C4CB>
+<CF05> <CF07> <B143>
+<CF08> <CF08> <C4CC>
+<CF09> <CF0F> <B146>
+<CF10> <CF11> <C4CD>
+<CF12> <CF12> <B14D>
+<CF13> <CF13> <C4CF>
+<CF14> <CF14> <B14E>
+<CF15> <CF15> <C4D0>
+<CF16> <CF1B> <B14F>
+<CF1C> <CF1C> <C4D1>
+<CF1D> <CF1F> <B155>
+<CF20> <CF20> <C4D2>
+<CF21> <CF23> <B158>
+<CF24> <CF24> <C4D3>
+<CF25> <CF2B> <B161>
+<CF2C> <CF2D> <C4D4>
+<CF2E> <CF2E> <B168>
+<CF2F> <CF31> <C4D6>
+<CF32> <CF37> <B169>
+<CF38> <CF38> <C4D9>
+<CF39> <CF44> <B16F>
+<CF45> <CF53> <B181>
+<CF54> <CF55> <C4DA>
+<CF56> <CF57> <B190>
+<CF58> <CF58> <C4DC>
+<CF59> <CF5B> <B192>
+<CF5C> <CF5C> <C4DD>
+<CF5D> <CF63> <B195>
+<CF64> <CF65> <C4DE>
+<CF66> <CF66> <B19C>
+<CF67> <CF67> <C4E0>
+<CF68> <CF68> <B19D>
+<CF69> <CF69> <C4E1>
+<CF6A> <CF6C> <B19E>
+<CF6D> <CF6F> <B241>
+<CF70> <CF71> <C4E2>
+<CF72> <CF73> <B244>
+<CF74> <CF74> <C4E4>
+<CF75> <CF77> <B246>
+<CF78> <CF78> <C4E5>
+<CF79> <CF7F> <B249>
+<CF80> <CF80> <C4E6>
+<CF81> <CF84> <B250>
+<CF85> <CF85> <C4E7>
+<CF86> <CF8B> <B254>
+<CF8C> <CF8C> <C4E8>
+<CF8D> <CF8D> <B25A>
+<CF8E> <CFA0> <B261>
+<CFA1> <CFA1> <C4E9>
+<CFA2> <CFA7> <B274>
+<CFA8> <CFA8> <C4EA>
+<CFA9> <CFA9> <B27A>
+<CFAA> <CFAF> <B281>
+<CFB0> <CFB0> <C4EB>
+<CFB1> <CFC3> <B287>
+<CFC4> <CFC4> <C4EC>
+<CFC5> <CFCB> <B29A>
+<CFCC> <CFDF> <B341>
+<CFE0> <CFE1> <C4ED>
+<CFE2> <CFE3> <B355>
+<CFE4> <CFE4> <C4EF>
+<CFE5> <CFE7> <B357>
+<CFE8> <CFE8> <C4F0>
+<CFE9> <CFE9> <B35A>
+<CFEA> <CFEF> <B361>
+<CFF0> <CFF1> <C4F1>
+<CFF2> <CFF2> <B367>
+<CFF3> <CFF3> <C4F3>
+<CFF4> <CFF4> <B368>
+<CFF5> <CFF5> <C4F4>
+<CFF6> <CFFB> <B369>
+<CFFC> <CFFC> <C4F5>
+<CFFD> <CFFF> <B36F>
+<D000> <D000> <C4F6>
+<D001> <D003> <B372>
+<D004> <D004> <C4F7>
+<D005> <D00A> <B375>
+<D00B> <D010> <B381>
+<D011> <D011> <C4F8>
+<D012> <D017> <B387>
+<D018> <D018> <C4F9>
+<D019> <D02C> <B38D>
+<D02D> <D02D> <C4FA>
+<D02E> <D033> <B441>
+<D034> <D035> <C4FB>
+<D036> <D037> <B447>
+<D038> <D038> <C4FD>
+endbfrange
+
+100 beginbfrange
+<D039> <D03B> <B449>
+<D03C> <D03C> <C4FE>
+<D03D> <D043> <B44C>
+<D044> <D045> <C5A1>
+<D046> <D046> <B453>
+<D047> <D047> <C5A3>
+<D048> <D048> <B454>
+<D049> <D049> <C5A4>
+<D04A> <D04F> <B455>
+<D050> <D050> <C5A5>
+<D051> <D053> <B461>
+<D054> <D054> <C5A6>
+<D055> <D057> <B464>
+<D058> <D058> <C5A7>
+<D059> <D05F> <B467>
+<D060> <D060> <C5A8>
+<D061> <D06B> <B46E>
+<D06C> <D06D> <C5A9>
+<D06E> <D06F> <B479>
+<D070> <D070> <C5AB>
+<D071> <D073> <B481>
+<D074> <D074> <C5AC>
+<D075> <D07B> <B484>
+<D07C> <D07D> <C5AD>
+<D07E> <D080> <B48B>
+<D081> <D081> <C5AF>
+<D082> <D094> <B48E>
+<D095> <D0A3> <B541>
+<D0A4> <D0A5> <C5B0>
+<D0A6> <D0A7> <B550>
+<D0A8> <D0A8> <C5B2>
+<D0A9> <D0AB> <B552>
+<D0AC> <D0AC> <C5B3>
+<D0AD> <D0B2> <B555>
+<D0B3> <D0B3> <B561>
+<D0B4> <D0B5> <C5B4>
+<D0B6> <D0B6> <B562>
+<D0B7> <D0B7> <C5B6>
+<D0B8> <D0B8> <B563>
+<D0B9> <D0B9> <C5B7>
+<D0BA> <D0BF> <B564>
+<D0C0> <D0C1> <C5B8>
+<D0C2> <D0C3> <B56A>
+<D0C4> <D0C4> <C5BA>
+<D0C5> <D0C7> <B56C>
+<D0C8> <D0C9> <C5BB>
+<D0CA> <D0CF> <B56F>
+<D0D0> <D0D1> <C5BD>
+<D0D2> <D0D2> <B575>
+<D0D3> <D0D5> <C5BF>
+<D0D6> <D0DA> <B576>
+<D0DB> <D0DB> <B581>
+<D0DC> <D0DD> <C5C2>
+<D0DE> <D0DF> <B582>
+<D0E0> <D0E0> <C5C4>
+<D0E1> <D0E3> <B584>
+<D0E4> <D0E4> <C5C5>
+<D0E5> <D0EB> <B587>
+<D0EC> <D0ED> <C5C6>
+<D0EE> <D0EE> <B58E>
+<D0EF> <D0F1> <C5C8>
+<D0F2> <D0F7> <B58F>
+<D0F8> <D0F8> <C5CB>
+<D0F9> <D0FF> <B595>
+<D100> <D104> <B59C>
+<D105> <D10C> <B641>
+<D10D> <D10D> <C5CC>
+<D10E> <D11F> <B649>
+<D120> <D12F> <B661>
+<D130> <D131> <C5CD>
+<D132> <D133> <B671>
+<D134> <D134> <C5CF>
+<D135> <D137> <B673>
+<D138> <D138> <C5D0>
+<D139> <D139> <B676>
+<D13A> <D13A> <C5D1>
+<D13B> <D13E> <B677>
+<D13F> <D13F> <B681>
+<D140> <D141> <C5D2>
+<D142> <D142> <B682>
+<D143> <D145> <C5D4>
+<D146> <D14B> <B683>
+<D14C> <D14D> <C5D7>
+<D14E> <D14F> <B689>
+<D150> <D150> <C5D9>
+<D151> <D153> <B68B>
+<D154> <D154> <C5DA>
+<D155> <D15B> <B68E>
+<D15C> <D15D> <C5DB>
+<D15E> <D15E> <B695>
+<D15F> <D15F> <C5DD>
+<D160> <D160> <B696>
+<D161> <D161> <C5DE>
+<D162> <D167> <B697>
+<D168> <D168> <C5DF>
+<D169> <D16B> <B69D>
+<D16C> <D16C> <C5E0>
+<D16D> <D16D> <B6A0>
+<D16E> <D17B> <B741>
+<D17C> <D17C> <C5E1>
+endbfrange
+
+100 beginbfrange
+<D17D> <D183> <B74F>
+<D184> <D184> <C5E2>
+<D185> <D187> <B756>
+<D188> <D188> <C5E3>
+<D189> <D18A> <B759>
+<D18B> <D19F> <B761>
+<D1A0> <D1A1> <C5E4>
+<D1A2> <D1A3> <B776>
+<D1A4> <D1A4> <C5E6>
+<D1A5> <D1A7> <B778>
+<D1A8> <D1A8> <C5E7>
+<D1A9> <D1AF> <B781>
+<D1B0> <D1B1> <C5E8>
+<D1B2> <D1B2> <B788>
+<D1B3> <D1B3> <C5EA>
+<D1B4> <D1B4> <B789>
+<D1B5> <D1B5> <C5EB>
+<D1B6> <D1B9> <B78A>
+<D1BA> <D1BA> <C5EC>
+<D1BB> <D1BB> <B78E>
+<D1BC> <D1BC> <C5ED>
+<D1BD> <D1BF> <B78F>
+<D1C0> <D1C0> <C5EE>
+<D1C1> <D1CF> <B792>
+<D1D0> <D1D7> <B841>
+<D1D8> <D1D8> <C5EF>
+<D1D9> <D1EA> <B849>
+<D1EB> <D1F3> <B861>
+<D1F4> <D1F4> <C5F0>
+<D1F5> <D1F7> <B86A>
+<D1F8> <D1F8> <C5F1>
+<D1F9> <D1FF> <B86D>
+<D200> <D206> <B874>
+<D207> <D207> <C5F2>
+<D208> <D208> <B881>
+<D209> <D209> <C5F3>
+<D20A> <D20F> <B882>
+<D210> <D210> <C5F4>
+<D211> <D229> <B888>
+<D22A> <D22B> <B941>
+<D22C> <D22D> <C5F5>
+<D22E> <D22F> <B943>
+<D230> <D230> <C5F7>
+<D231> <D233> <B945>
+<D234> <D234> <C5F8>
+<D235> <D23B> <B948>
+<D23C> <D23D> <C5F9>
+<D23E> <D23E> <B94F>
+<D23F> <D23F> <C5FB>
+<D240> <D240> <B950>
+<D241> <D241> <C5FC>
+<D242> <D247> <B951>
+<D248> <D248> <C5FD>
+<D249> <D24C> <B957>
+<D24D> <D25B> <B961>
+<D25C> <D25C> <C5FE>
+<D25D> <D263> <B970>
+<D264> <D264> <C6A1>
+<D265> <D268> <B977>
+<D269> <D27F> <B981>
+<D280> <D281> <C6A2>
+<D282> <D283> <B998>
+<D284> <D284> <C6A4>
+<D285> <D287> <B99A>
+<D288> <D288> <C6A5>
+<D289> <D28C> <B99D>
+<D28D> <D28F> <BA41>
+<D290> <D291> <C6A6>
+<D292> <D294> <BA44>
+<D295> <D295> <C6A8>
+<D296> <D29B> <BA47>
+<D29C> <D29C> <C6A9>
+<D29D> <D29F> <BA4D>
+<D2A0> <D2A0> <C6AA>
+<D2A1> <D2A3> <BA50>
+<D2A4> <D2A4> <C6AB>
+<D2A5> <D2AB> <BA53>
+<D2AC> <D2AC> <C6AC>
+<D2AD> <D2AD> <BA5A>
+<D2AE> <D2B0> <BA61>
+<D2B1> <D2B1> <C6AD>
+<D2B2> <D2B7> <BA64>
+<D2B8> <D2B9> <C6AE>
+<D2BA> <D2BB> <BA6A>
+<D2BC> <D2BC> <C6B0>
+<D2BD> <D2BE> <BA6C>
+<D2BF> <D2C0> <C6B1>
+<D2C1> <D2C1> <BA6E>
+<D2C2> <D2C2> <C6B3>
+<D2C3> <D2C7> <BA6F>
+<D2C8> <D2C9> <C6B4>
+<D2CA> <D2CA> <BA74>
+<D2CB> <D2CB> <C6B6>
+<D2CC> <D2D1> <BA75>
+<D2D2> <D2D3> <BA81>
+<D2D4> <D2D4> <C6B7>
+<D2D5> <D2D7> <BA83>
+<D2D8> <D2D8> <C6B8>
+<D2D9> <D2DB> <BA86>
+<D2DC> <D2DC> <C6B9>
+endbfrange
+
+100 beginbfrange
+<D2DD> <D2E3> <BA89>
+<D2E4> <D2E5> <C6BA>
+<D2E6> <D2EF> <BA90>
+<D2F0> <D2F1> <C6BC>
+<D2F2> <D2F3> <BA9A>
+<D2F4> <D2F4> <C6BE>
+<D2F5> <D2F7> <BA9C>
+<D2F8> <D2F8> <C6BF>
+<D2F9> <D2FA> <BA9F>
+<D2FB> <D2FF> <BB41>
+<D300> <D301> <C6C0>
+<D302> <D302> <BB46>
+<D303> <D303> <C6C2>
+<D304> <D304> <BB47>
+<D305> <D305> <C6C3>
+<D306> <D30B> <BB48>
+<D30C> <D30E> <C6C4>
+<D30F> <D30F> <BB4E>
+<D310> <D310> <C6C7>
+<D311> <D313> <BB4F>
+<D314> <D314> <C6C8>
+<D315> <D315> <BB52>
+<D316> <D316> <C6C9>
+<D317> <D31B> <BB53>
+<D31C> <D31D> <C6CA>
+<D31E> <D31E> <BB58>
+<D31F> <D321> <C6CC>
+<D322> <D323> <BB59>
+<D324> <D324> <BB61>
+<D325> <D325> <C6CF>
+<D326> <D327> <BB62>
+<D328> <D329> <C6D0>
+<D32A> <D32B> <BB64>
+<D32C> <D32C> <C6D2>
+<D32D> <D32F> <BB66>
+<D330> <D330> <C6D3>
+<D331> <D337> <BB69>
+<D338> <D339> <C6D4>
+<D33A> <D33A> <BB70>
+<D33B> <D33D> <C6D6>
+<D33E> <D343> <BB71>
+<D344> <D345> <C6D9>
+<D346> <D349> <BB77>
+<D34A> <D369> <BB81>
+<D36A> <D37B> <BC41>
+<D37C> <D37D> <C6DB>
+<D37E> <D37F> <BC53>
+<D380> <D380> <C6DD>
+<D381> <D383> <BC55>
+<D384> <D384> <C6DE>
+<D385> <D387> <BC58>
+<D388> <D38B> <BC61>
+<D38C> <D38D> <C6DF>
+<D38E> <D38E> <BC65>
+<D38F> <D391> <C6E1>
+<D392> <D397> <BC66>
+<D398> <D399> <C6E4>
+<D39A> <D39B> <BC6C>
+<D39C> <D39C> <C6E6>
+<D39D> <D39F> <BC6E>
+<D3A0> <D3A0> <C6E7>
+<D3A1> <D3A7> <BC71>
+<D3A8> <D3A9> <C6E8>
+<D3AA> <D3AA> <BC78>
+<D3AB> <D3AB> <C6EA>
+<D3AC> <D3AC> <BC79>
+<D3AD> <D3AD> <C6EB>
+<D3AE> <D3AE> <BC7A>
+<D3AF> <D3B3> <BC81>
+<D3B4> <D3B4> <C6EC>
+<D3B5> <D3B7> <BC86>
+<D3B8> <D3B8> <C6ED>
+<D3B9> <D3BB> <BC89>
+<D3BC> <D3BC> <C6EE>
+<D3BD> <D3C3> <BC8C>
+<D3C4> <D3C5> <C6EF>
+<D3C6> <D3C7> <BC93>
+<D3C8> <D3C9> <C6F1>
+<D3CA> <D3CF> <BC95>
+<D3D0> <D3D0> <C6F3>
+<D3D1> <D3D6> <BC9B>
+<D3D7> <D3D7> <BD41>
+<D3D8> <D3D8> <C6F4>
+<D3D9> <D3E0> <BD42>
+<D3E1> <D3E1> <C6F5>
+<D3E2> <D3E2> <BD4A>
+<D3E3> <D3E3> <C6F6>
+<D3E4> <D3EB> <BD4B>
+<D3EC> <D3ED> <C6F7>
+<D3EE> <D3EF> <BD53>
+<D3F0> <D3F0> <C6F9>
+<D3F1> <D3F3> <BD55>
+<D3F4> <D3F4> <C6FA>
+<D3F5> <D3F7> <BD58>
+<D3F8> <D3FB> <BD61>
+<D3FC> <D3FD> <C6FB>
+<D3FE> <D3FE> <BD65>
+<D3FF> <D3FF> <C6FD>
+<D400> <D400> <BD66>
+<D401> <D401> <C6FE>
+endbfrange
+
+100 beginbfrange
+<D402> <D407> <BD67>
+<D408> <D408> <C7A1>
+<D409> <D416> <BD6D>
+<D417> <D41C> <BD81>
+<D41D> <D41D> <C7A2>
+<D41E> <D437> <BD87>
+<D438> <D43F> <BE41>
+<D440> <D440> <C7A3>
+<D441> <D443> <BE49>
+<D444> <D444> <C7A4>
+<D445> <D453> <BE4C>
+<D454> <D45B> <BE61>
+<D45C> <D45C> <C7A5>
+<D45D> <D45F> <BE69>
+<D460> <D460> <C7A6>
+<D461> <D463> <BE6C>
+<D464> <D464> <C7A7>
+<D465> <D46C> <BE6F>
+<D46D> <D46D> <C7A8>
+<D46E> <D46E> <BE77>
+<D46F> <D46F> <C7A9>
+<D470> <D472> <BE78>
+<D473> <D477> <BE81>
+<D478> <D479> <C7AA>
+<D47A> <D47B> <BE86>
+<D47C> <D47C> <C7AC>
+<D47D> <D47E> <BE88>
+<D47F> <D480> <C7AD>
+<D481> <D481> <BE8A>
+<D482> <D482> <C7AF>
+<D483> <D487> <BE8B>
+<D488> <D489> <C7B0>
+<D48A> <D48A> <BE90>
+<D48B> <D48B> <C7B2>
+<D48C> <D48C> <BE91>
+<D48D> <D48D> <C7B3>
+<D48E> <D493> <BE92>
+<D494> <D494> <C7B4>
+<D495> <D49D> <BE98>
+<D49E> <D4A8> <BF41>
+<D4A9> <D4A9> <C7B5>
+<D4AA> <D4B8> <BF4C>
+<D4B9> <D4CB> <BF61>
+<D4CC> <D4CC> <C7B6>
+<D4CD> <D4CF> <BF74>
+<D4D0> <D4D0> <C7B7>
+<D4D1> <D4D3> <BF77>
+<D4D4> <D4D4> <C7B8>
+<D4D5> <D4D5> <BF7A>
+<D4D6> <D4DB> <BF81>
+<D4DC> <D4DC> <C7B9>
+<D4DD> <D4DE> <BF87>
+<D4DF> <D4DF> <C7BA>
+<D4E0> <D4E7> <BF89>
+<D4E8> <D4E8> <C7BB>
+<D4E9> <D4EB> <BF91>
+<D4EC> <D4EC> <C7BC>
+<D4ED> <D4EF> <BF94>
+<D4F0> <D4F0> <C7BD>
+<D4F1> <D4F7> <BF97>
+<D4F8> <D4F8> <C7BE>
+<D4F9> <D4FA> <BF9E>
+<D4FB> <D4FB> <C7BF>
+<D4FC> <D4FC> <BFA0>
+<D4FD> <D4FD> <C7C0>
+<D4FE> <D4FF> <C041>
+<D500> <D503> <C043>
+<D504> <D504> <C7C1>
+<D505> <D507> <C047>
+<D508> <D508> <C7C2>
+<D509> <D50B> <C04A>
+<D50C> <D50C> <C7C3>
+<D50D> <D513> <C04D>
+<D514> <D515> <C7C4>
+<D516> <D516> <C054>
+<D517> <D517> <C7C6>
+<D518> <D51D> <C055>
+<D51E> <D537> <C061>
+<D538> <D53B> <C081>
+<D53C> <D53D> <C7C7>
+<D53E> <D53F> <C085>
+<D540> <D540> <C7C9>
+<D541> <D543> <C087>
+<D544> <D544> <C7CA>
+<D545> <D54B> <C08A>
+<D54C> <D54D> <C7CB>
+<D54E> <D54E> <C091>
+<D54F> <D54F> <C7CD>
+<D550> <D550> <C092>
+<D551> <D551> <C7CE>
+<D552> <D557> <C093>
+<D558> <D559> <C7CF>
+<D55A> <D55B> <C099>
+<D55C> <D55C> <C7D1>
+<D55D> <D55F> <C09B>
+<D560> <D560> <C7D2>
+<D561> <D563> <C09E>
+<D564> <D564> <C141>
+<D565> <D565> <C7D3>
+<D566> <D567> <C142>
+endbfrange
+
+100 beginbfrange
+<D568> <D569> <C7D4>
+<D56A> <D56A> <C144>
+<D56B> <D56B> <C7D6>
+<D56C> <D56C> <C145>
+<D56D> <D56D> <C7D7>
+<D56E> <D573> <C146>
+<D574> <D575> <C7D8>
+<D576> <D577> <C14C>
+<D578> <D578> <C7DA>
+<D579> <D57B> <C14E>
+<D57C> <D57C> <C7DB>
+<D57D> <D583> <C151>
+<D584> <D585> <C7DC>
+<D586> <D586> <C158>
+<D587> <D589> <C7DE>
+<D58A> <D58B> <C159>
+<D58C> <D58F> <C161>
+<D590> <D590> <C7E1>
+<D591> <D5A4> <C165>
+<D5A5> <D5A5> <C7E2>
+<D5A6> <D5A7> <C179>
+<D5A8> <D5C7> <C181>
+<D5C8> <D5C9> <C7E3>
+<D5CA> <D5CB> <C241>
+<D5CC> <D5CC> <C7E5>
+<D5CD> <D5CF> <C243>
+<D5D0> <D5D0> <C7E6>
+<D5D1> <D5D1> <C246>
+<D5D2> <D5D2> <C7E7>
+<D5D3> <D5D7> <C247>
+<D5D8> <D5D9> <C7E8>
+<D5DA> <D5DA> <C24C>
+<D5DB> <D5DB> <C7EA>
+<D5DC> <D5DC> <C24D>
+<D5DD> <D5DD> <C7EB>
+<D5DE> <D5E3> <C24E>
+<D5E4> <D5E5> <C7EC>
+<D5E6> <D5E7> <C254>
+<D5E8> <D5E8> <C7EE>
+<D5E9> <D5EB> <C256>
+<D5EC> <D5EC> <C7EF>
+<D5ED> <D5EE> <C259>
+<D5EF> <D5F3> <C261>
+<D5F4> <D5F5> <C7F0>
+<D5F6> <D5F6> <C266>
+<D5F7> <D5F7> <C7F2>
+<D5F8> <D5F8> <C267>
+<D5F9> <D5F9> <C7F3>
+<D5FA> <D5FF> <C268>
+<D600> <D601> <C7F4>
+<D602> <D603> <C26E>
+<D604> <D604> <C7F6>
+<D605> <D607> <C270>
+<D608> <D608> <C7F7>
+<D609> <D60F> <C273>
+<D610> <D611> <C7F8>
+<D612> <D612> <C27A>
+<D613> <D615> <C7FA>
+<D616> <D61B> <C281>
+<D61C> <D61C> <C7FD>
+<D61D> <D61F> <C287>
+<D620> <D620> <C7FE>
+<D621> <D623> <C28A>
+<D624> <D624> <C8A1>
+<D625> <D62C> <C28D>
+<D62D> <D62D> <C8A2>
+<D62E> <D637> <C295>
+<D638> <D639> <C8A3>
+<D63A> <D63B> <C29F>
+<D63C> <D63C> <C8A5>
+<D63D> <D63F> <C341>
+<D640> <D640> <C8A6>
+<D641> <D644> <C344>
+<D645> <D645> <C8A7>
+<D646> <D647> <C348>
+<D648> <D649> <C8A8>
+<D64A> <D64A> <C34A>
+<D64B> <D64B> <C8AA>
+<D64C> <D64C> <C34B>
+<D64D> <D64D> <C8AB>
+<D64E> <D650> <C34C>
+<D651> <D651> <C8AC>
+<D652> <D653> <C34F>
+<D654> <D655> <C8AD>
+<D656> <D657> <C351>
+<D658> <D658> <C8AF>
+<D659> <D65B> <C353>
+<D65C> <D65C> <C8B0>
+<D65D> <D661> <C356>
+<D662> <D666> <C361>
+<D667> <D667> <C8B1>
+<D668> <D668> <C366>
+<D669> <D669> <C8B2>
+<D66A> <D66F> <C367>
+<D670> <D671> <C8B3>
+<D672> <D673> <C36D>
+<D674> <D674> <C8B5>
+<D675> <D680> <C36F>
+<D681> <D682> <C381>
+<D683> <D683> <C8B6>
+endbfrange
+
+100 beginbfrange
+<D684> <D684> <C383>
+<D685> <D685> <C8B7>
+<D686> <D68B> <C384>
+<D68C> <D68D> <C8B8>
+<D68E> <D68F> <C38A>
+<D690> <D690> <C8BA>
+<D691> <D693> <C38C>
+<D694> <D694> <C8BB>
+<D695> <D69C> <C38F>
+<D69D> <D69D> <C8BC>
+<D69E> <D69E> <C397>
+<D69F> <D69F> <C8BD>
+<D6A0> <D6A0> <C398>
+<D6A1> <D6A1> <C8BE>
+<D6A2> <D6A7> <C399>
+<D6A8> <D6A8> <C8BF>
+<D6A9> <D6AA> <C39F>
+<D6AB> <D6AB> <C441>
+<D6AC> <D6AC> <C8C0>
+<D6AD> <D6AF> <C442>
+<D6B0> <D6B0> <C8C1>
+<D6B1> <D6B8> <C445>
+<D6B9> <D6B9> <C8C2>
+<D6BA> <D6BA> <C44D>
+<D6BB> <D6BB> <C8C3>
+<D6BC> <D6C3> <C44E>
+<D6C4> <D6C5> <C8C4>
+<D6C6> <D6C7> <C456>
+<D6C8> <D6C8> <C8C6>
+<D6C9> <D6CB> <C458>
+<D6CC> <D6CC> <C8C7>
+<D6CD> <D6D0> <C461>
+<D6D1> <D6D1> <C8C8>
+<D6D2> <D6D3> <C465>
+<D6D4> <D6D4> <C8C9>
+<D6D5> <D6D6> <C467>
+<D6D7> <D6D7> <C8CA>
+<D6D8> <D6D8> <C469>
+<D6D9> <D6D9> <C8CB>
+<D6DA> <D6DF> <C46A>
+<D6E0> <D6E0> <C8CC>
+<D6E1> <D6E3> <C470>
+<D6E4> <D6E4> <C8CD>
+<D6E5> <D6E7> <C473>
+<D6E8> <D6E8> <C8CE>
+<D6E9> <D6ED> <C476>
+<D6EE> <D6EF> <C481>
+<D6F0> <D6F0> <C8CF>
+<D6F1> <D6F4> <C483>
+<D6F5> <D6F5> <C8D0>
+<D6F6> <D6FB> <C487>
+<D6FC> <D6FD> <C8D1>
+<D6FE> <D6FF> <C48D>
+<D700> <D700> <C8D3>
+<D701> <D703> <C48F>
+<D704> <D704> <C8D4>
+<D705> <D710> <C492>
+<D711> <D711> <C8D5>
+<D712> <D714> <C49E>
+<D715> <D717> <C541>
+<D718> <D719> <C8D6>
+<D71A> <D71B> <C544>
+<D71C> <D71C> <C8D8>
+<D71D> <D71F> <C546>
+<D720> <D720> <C8D9>
+<D721> <D727> <C549>
+<D728> <D729> <C8DA>
+<D72A> <D72A> <C550>
+<D72B> <D72B> <C8DC>
+<D72C> <D72C> <C551>
+<D72D> <D72D> <C8DD>
+<D72E> <D733> <C552>
+<D734> <D735> <C8DE>
+<D736> <D737> <C558>
+<D738> <D738> <C8E0>
+<D739> <D739> <C55A>
+<D73A> <D73B> <C561>
+<D73C> <D73C> <C8E1>
+<D73D> <D743> <C563>
+<D744> <D744> <C8E2>
+<D745> <D746> <C56A>
+<D747> <D747> <C8E3>
+<D748> <D748> <C56C>
+<D749> <D749> <C8E4>
+<D74A> <D74F> <C56D>
+<D750> <D751> <C8E5>
+<D752> <D753> <C573>
+<D754> <D754> <C8E7>
+<D755> <D755> <C575>
+<D756> <D759> <C8E8>
+<D75A> <D75E> <C576>
+<D75F> <D75F> <C581>
+<D760> <D761> <C8EC>
+<D762> <D762> <C582>
+<D763> <D763> <C8EE>
+<D764> <D764> <C583>
+<D765> <D765> <C8EF>
+<D766> <D768> <C584>
+<D769> <D769> <C8F0>
+<D76A> <D76B> <C587>
+endbfrange
+
+100 beginbfrange
+<D76C> <D76C> <C8F1>
+<D76D> <D76F> <C589>
+<D770> <D770> <C8F2>
+<D771> <D773> <C58C>
+<D774> <D774> <C8F3>
+<D775> <D77B> <C58F>
+<D77C> <D77D> <C8F4>
+<D77E> <D780> <C596>
+<D781> <D781> <C8F6>
+<D782> <D787> <C599>
+<D788> <D789> <C8F7>
+<D78A> <D78B> <C59F>
+<D78C> <D78C> <C8F9>
+<D78D> <D78F> <C641>
+<D790> <D790> <C8FA>
+<D791> <D797> <C644>
+<D798> <D799> <C8FB>
+<D79A> <D79A> <C64B>
+<D79B> <D79B> <C8FD>
+<D79C> <D79C> <C64C>
+<D79D> <D79D> <C8FE>
+<D79E> <D7A3> <C64D>
+<E000> <E05D> <C9A1>
+<E05E> <E0BB> <FEA1>
+<F8F7> <F8F7> <FF>
+<F900> <F900> <CBD0>
+<F901> <F901> <CBD6>
+<F902> <F902> <CBE7>
+<F903> <F903> <CDCF>
+<F904> <F904> <CDE8>
+<F905> <F905> <CEAD>
+<F906> <F906> <CFFB>
+<F907> <F907> <D0A2>
+<F908> <F908> <D0B8>
+<F909> <F909> <D0D0>
+<F90A> <F90A> <D0DD>
+<F90B> <F90C> <D1D4>
+<F90D> <F90D> <D1D8>
+<F90E> <F913> <D1DB>
+<F914> <F918> <D1E2>
+<F919> <F91C> <D1E8>
+<F91D> <F91D> <D1ED>
+<F91E> <F91F> <D1EF>
+<F920> <F920> <D1F2>
+<F921> <F921> <D1F6>
+<F922> <F922> <D1FA>
+<F923> <F925> <D1FC>
+<F926> <F927> <D2A2>
+<F928> <F92C> <D2A7>
+<F92D> <F92D> <D2AD>
+<F92E> <F92E> <D2B2>
+<F92F> <F92F> <D2BE>
+<F930> <F932> <D2C2>
+<F933> <F938> <D2C6>
+<F939> <F943> <D2CD>
+<F944> <F945> <D2D9>
+<F946> <F947> <D2DE>
+<F948> <F949> <D2E1>
+<F94A> <F951> <D2E4>
+<F952> <F957> <D2F0>
+<F958> <F959> <D2F7>
+<F95A> <F95A> <D4E6>
+<F95B> <F95B> <D4FC>
+<F95C> <F95C> <D5A5>
+<F95D> <F95D> <D5AB>
+<F95E> <F95E> <D5AE>
+<F95F> <F95F> <D6B8>
+<F960> <F960> <D6CD>
+<F961> <F961> <D7CB>
+<F962> <F962> <D7E4>
+<F963> <F963> <DBC5>
+<F964> <F964> <DBE4>
+<F965> <F965> <DCA5>
+<F966> <F966> <DDA5>
+<F967> <F967> <DDD5>
+<F968> <F968> <DDF4>
+<F969> <F969> <DEFC>
+<F96A> <F96A> <DEFE>
+<F96B> <F96B> <DFB3>
+<F96C> <F96C> <DFE1>
+<F96D> <F96D> <DFE8>
+<F96E> <F96E> <E0F1>
+<F96F> <F96F> <E1AD>
+<F970> <F970> <E1ED>
+<F971> <F971> <E3F5>
+<F972> <F972> <E4A1>
+<F973> <F973> <E4A9>
+<F974> <F974> <E5AE>
+<F975> <F976> <E5B1>
+<F977> <F977> <E5B9>
+<F978> <F979> <E5BB>
+<F97A> <F97A> <E5C4>
+<F97B> <F97B> <E5CE>
+<F97C> <F97C> <E5D0>
+<F97D> <F97D> <E5D2>
+<F97E> <F97E> <E5D6>
+<F97F> <F981> <E5FA>
+<F982> <F982> <E5FE>
+<F983> <F983> <E6A1>
+<F984> <F984> <E6A4>
+endbfrange
+
+100 beginbfrange
+<F985> <F985> <E6A7>
+<F986> <F986> <E6AD>
+<F987> <F989> <E6AF>
+<F98A> <F98A> <E6B3>
+<F98B> <F98C> <E6B7>
+<F98D> <F98D> <E6BC>
+<F98E> <F98E> <E6C4>
+<F98F> <F990> <E6C6>
+<F991> <F991> <E6CA>
+<F992> <F992> <E6D2>
+<F993> <F993> <E6D6>
+<F994> <F994> <E6D9>
+<F995> <F995> <E6DC>
+<F996> <F996> <E6DF>
+<F997> <F997> <E6E1>
+<F998> <F99A> <E6E4>
+<F99B> <F99B> <E6E8>
+<F99C> <F99E> <E6EA>
+<F99F> <F99F> <E6EF>
+<F9A0> <F9A1> <E6F1>
+<F9A2> <F9A4> <E6F5>
+<F9A5> <F9A5> <E6F9>
+<F9A6> <F9A6> <E7A1>
+<F9A7> <F9A7> <E7A6>
+<F9A8> <F9A9> <E7A9>
+<F9AA> <F9AB> <E7AC>
+<F9AC> <F9AC> <E7B0>
+<F9AD> <F9AD> <E7BF>
+<F9AE> <F9AE> <E7C1>
+<F9AF> <F9B0> <E7C6>
+<F9B1> <F9B1> <E7CB>
+<F9B2> <F9B2> <E7CD>
+<F9B3> <F9B4> <E7CF>
+<F9B5> <F9B5> <E7D3>
+<F9B6> <F9B6> <E7DF>
+<F9B7> <F9B7> <E7E4>
+<F9B8> <F9B8> <E7E6>
+<F9B9> <F9B9> <E7F7>
+<F9BA> <F9BB> <E8E7>
+<F9BC> <F9BD> <E8F0>
+<F9BE> <F9BE> <E8F7>
+<F9BF> <F9BF> <E8F9>
+<F9C0> <F9C0> <E8FB>
+<F9C1> <F9C1> <E8FE>
+<F9C2> <F9C2> <E9A7>
+<F9C3> <F9C3> <E9AC>
+<F9C4> <F9C4> <E9CC>
+<F9C5> <F9C5> <E9F7>
+<F9C6> <F9C6> <EAC1>
+<F9C7> <F9C7> <EAE5>
+<F9C8> <F9C8> <EAF4>
+<F9C9> <F9C9> <EAF7>
+<F9CA> <F9CA> <EAFC>
+<F9CB> <F9CB> <EAFE>
+<F9CC> <F9CC> <EBA4>
+<F9CD> <F9CD> <EBA7>
+<F9CE> <F9CF> <EBA9>
+<F9D0> <F9D1> <EBBA>
+<F9D2> <F9D2> <EBBD>
+<F9D3> <F9D4> <EBC1>
+<F9D5> <F9D6> <EBC6>
+<F9D7> <F9D7> <EBCC>
+<F9D8> <F9DB> <EBCF>
+<F9DC> <F9DC> <EBD8>
+<F9DD> <F9DE> <ECA6>
+<F9DF> <F9DF> <ECAA>
+<F9E0> <F9E3> <ECAF>
+<F9E4> <F9E4> <ECB5>
+<F9E5> <F9E5> <ECB8>
+<F9E6> <F9E6> <ECBA>
+<F9E7> <F9E8> <ECC0>
+<F9E9> <F9EA> <ECC5>
+<F9EB> <F9EC> <ECC9>
+<F9ED> <F9ED> <ECD5>
+<F9EE> <F9EF> <ECDD>
+<F9F0> <F9F0> <ECE1>
+<F9F1> <F9F1> <ECE4>
+<F9F2> <F9F3> <ECE7>
+<F9F4> <F9F5> <ECF7>
+<F9F6> <F9F6> <ECFA>
+<F9F7> <F9F9> <EDA1>
+<F9FA> <F9FA> <EDEE>
+<F9FB> <F9FB> <EEDB>
+<F9FC> <F9FC> <F2BD>
+<F9FD> <F9FD> <F2FA>
+<F9FE> <F9FE> <F3B1>
+<F9FF> <F9FF> <F4A7>
+<FA00> <FA00> <F4EE>
+<FA01> <FA01> <F6F4>
+<FA02> <FA02> <F6F6>
+<FA03> <FA03> <F7B8>
+<FA04> <FA04> <F7C8>
+<FA05> <FA05> <F7D3>
+<FA06> <FA06> <F8DB>
+<FA07> <FA07> <F8F0>
+<FA08> <FA09> <FAA1>
+<FA0A> <FA0A> <FAE6>
+<FA0B> <FA0B> <FCA9>
+<FA0C> <FA0C> <E8B4>
+<FA10> <FA10> <F5C0>
+endbfrange
+
+52 beginbfrange
+<FA12> <FA12> <F4E7>
+<FA15> <FA15> <FDEB>
+<FA17> <FA17> <ECCC>
+<FA19> <FA19> <E3EA>
+<FA1A> <FA1A> <DFD4>
+<FA1B> <FA1B> <DCD8>
+<FA1C> <FA1C> <EFFE>
+<FA1D> <FA1D> <EFF1>
+<FA1E> <FA1E> <E9E2>
+<FA22> <FA22> <F0B3>
+<FA25> <FA25> <ECEF>
+<FA26> <FA26> <D4B4>
+<FA2A> <FA2A> <DAF9>
+<FA2B> <FA2B> <DEF8>
+<FA2C> <FA2C> <CEBD>
+<FA2D> <FA2D> <F9CD>
+<FE31> <FE31> <A3FC>
+<FE33> <FE33> <A3DF>
+<FE35> <FE36> <A3A8>
+<FE37> <FE37> <A3FB>
+<FE38> <FE38> <A3FD>
+<FE39> <FE3A> <A1B2>
+<FE3B> <FE3C> <A1BC>
+<FE3D> <FE3E> <A1B6>
+<FE3F> <FE40> <A1B4>
+<FE41> <FE44> <A1B8>
+<FE50> <FE50> <A3AC>
+<FE51> <FE51> <A1A2>
+<FE52> <FE52> <A3AE>
+<FE54> <FE54> <A3BB>
+<FE55> <FE55> <A3BA>
+<FE56> <FE56> <A3BF>
+<FE57> <FE57> <A3A1>
+<FE59> <FE5A> <A3A8>
+<FE5B> <FE5B> <A3FB>
+<FE5C> <FE5C> <A3FD>
+<FE5D> <FE5E> <A1B2>
+<FF01> <FF3B> <A3A1>
+<FF3C> <FF3C> <A1AC>
+<FF3D> <FF5D> <A3DD>
+<FF5E> <FF5E> <A2A6>
+<FFA0> <FFA0> <A4D4>
+<FFA1> <FFBE> <A4A1>
+<FFC2> <FFC7> <A4BF>
+<FFCA> <FFCF> <A4C5>
+<FFD2> <FFD7> <A4CB>
+<FFDA> <FFDC> <A4D1>
+<FFE0> <FFE1> <A1CB>
+<FFE2> <FFE2> <A1FE>
+<FFE3> <FFE3> <A3FE>
+<FFE5> <FFE5> <A1CD>
+<FFE6> <FFE6> <A3DC>
+endbfrange
+
+endcmap
+CMapName currentdict /CMap defineresource pop
+end
+end
+
+%%EndResource
+%%EOF
diff --git a/src/main/resources/Resources/cmap/UCS2-KSCpc-EUC b/src/main/resources/Resources/cmap/UCS2-KSCpc-EUC
new file mode 100644
index 0000000..62a0fa4
--- /dev/null
+++ b/src/main/resources/Resources/cmap/UCS2-KSCpc-EUC
@@ -0,0 +1,7076 @@
+%!PS-Adobe-3.0 Resource-CMap
+%%DocumentNeededResources: ProcSet (CIDInit)
+%%IncludeResource: ProcSet (CIDInit)
+%%BeginResource: CMap (UCS2-KSCpc-EUC)
+%%Title: (UCS2-KSCpc-EUC)
+%%Version: 4.002
+%%Copyright: -----------------------------------------------------------
+%%Copyright: Copyright 1990-1999 Adobe Systems Incorporated.
+%%Copyright: All Rights Reserved.
+%%Copyright:
+%%Copyright: Patents Pending
+%%Copyright:
+%%Copyright: NOTICE: All information contained herein is the property
+%%Copyright: of Adobe Systems Incorporated.
+%%Copyright:
+%%Copyright: Permission is granted for redistribution of this file
+%%Copyright: provided this copyright notice is maintained intact and
+%%Copyright: that the contents of this file are not altered in any
+%%Copyright: way from its original form.
+%%Copyright:
+%%Copyright: PostScript and Display PostScript are trademarks of
+%%Copyright: Adobe Systems Incorporated which may be registered in
+%%Copyright: certain jurisdictions.
+%%Copyright: -----------------------------------------------------------
+%%EndComments
+
+/CIDInit /ProcSet findresource begin
+
+12 dict begin
+
+begincmap
+
+/CIDSystemInfo 3 dict dup begin
+ /Registry (Adobe) def
+ /Ordering (UCS2_KSCpc_EUC) def
+ /Supplement 1 def
+end def
+
+/CMapName /UCS2-KSCpc-EUC def
+/CMapVersion 4.002 def
+/CMapType 1 def
+/WMode 0 def
+
+1 begincodespacerange
+<0000> <FFFF>
+endcodespacerange
+
+100 beginbfrange
+<0000> <007F> <00>
+<0085> <009F> <85>
+<00A0> <00A0> <80>
+<00A1> <00A1> <A2AE>
+<00A2> <00A3> <A1CB>
+<00A4> <00A4> <A2B4>
+<00A5> <00A5> <A1CD>
+<00A7> <00A7> <A1D7>
+<00A8> <00A8> <A1A7>
+<00A9> <00A9> <83>
+<00AA> <00AA> <A8A3>
+<00AB> <00AB> <A65C>
+<00AC> <00AC> <A1FE>
+<00AD> <00AD> <A1A9>
+<00B0> <00B0> <A1C6>
+<00B1> <00B1> <A1BE>
+<00B2> <00B3> <A9F7>
+<00B4> <00B4> <A2A5>
+<00B6> <00B6> <A2D2>
+<00B7> <00B7> <A1A4>
+<00B8> <00B8> <A2AC>
+<00B9> <00B9> <A9F6>
+<00BA> <00BA> <A8AC>
+<00BB> <00BB> <A65D>
+<00BC> <00BC> <A8F9>
+<00BD> <00BD> <A8F6>
+<00BE> <00BE> <A8FA>
+<00BF> <00BF> <A2AF>
+<00C6> <00C6> <A8A1>
+<00D0> <00D0> <A8A2>
+<00D7> <00D7> <A1BF>
+<00D8> <00D8> <A8AA>
+<00DE> <00DE> <A8AD>
+<00DF> <00DF> <A9AC>
+<00E6> <00E6> <A9A1>
+<00F0> <00F0> <A9A3>
+<00F7> <00F7> <A1C0>
+<00F8> <00F8> <A9AA>
+<00FE> <00FE> <A9AD>
+<0111> <0111> <A9A2>
+<0126> <0126> <A8A4>
+<0127> <0127> <A9A4>
+<0131> <0131> <A9A5>
+<0132> <0132> <A8A6>
+<0133> <0133> <A9A6>
+<0138> <0138> <A9A7>
+<013F> <013F> <A8A8>
+<0140> <0140> <A9A8>
+<0141> <0141> <A8A9>
+<0142> <0142> <A9A9>
+<0149> <0149> <A9B0>
+<014A> <014A> <A8AF>
+<014B> <014B> <A9AF>
+<0152> <0152> <A8AB>
+<0153> <0153> <A9AB>
+<0166> <0166> <A8AE>
+<0167> <0167> <A9AE>
+<02BC> <02BC> <A198>
+<02C7> <02C7> <A2A7>
+<02D0> <02D0> <A2B0>
+<02D8> <02D8> <A2A8>
+<02D9> <02D9> <A2AB>
+<02DA> <02DA> <A2AA>
+<02DB> <02DB> <A2AD>
+<02DC> <02DC> <A2A6>
+<02DD> <02DD> <A2A9>
+<0391> <03A1> <A5C1>
+<03A3> <03A9> <A5D2>
+<03B1> <03C1> <A5E1>
+<03C3> <03C9> <A5F2>
+<0401> <0401> <ACA7>
+<0410> <0415> <ACA1>
+<0416> <042F> <ACA8>
+<0430> <0435> <ACD1>
+<0436> <044F> <ACD8>
+<0451> <0451> <ACD7>
+<2010> <2010> <82>
+<2013> <2014> <A1A9>
+<2015> <2016> <A1AA>
+<2018> <2019> <A1AE>
+<201B> <201B> <A170>
+<201C> <201D> <A1B0>
+<201F> <201F> <A16F>
+<2020> <2021> <A2D3>
+<2022> <2022> <A655>
+<2025> <2026> <A1A5>
+<2027> <2027> <A1A4>
+<2030> <2030> <A2B6>
+<2032> <2033> <A1C7>
+<2034> <2034> <A5DE>
+<2035> <2035> <ADAD>
+<2036> <2036> <ADAB>
+<2039> <203A> <A65A>
+<203B> <203B> <A1D8>
+<203C> <203C> <A784>
+<203E> <203E> <A3FE>
+<2042> <2042> <A64D>
+<2074> <2074> <A9F9>
+<207A> <207B> <A171>
+<207C> <207C> <A17A>
+endbfrange
+
+100 beginbfrange
+<207D> <207E> <A17C>
+<207F> <207F> <A9FA>
+<2081> <2084> <A9FB>
+<20A9> <20A9> <81>
+<2103> <2103> <A1C9>
+<2109> <2109> <A2B5>
+<2113> <2113> <A7A4>
+<2116> <2116> <A2E0>
+<2121> <2121> <A2E5>
+<2122> <2122> <A2E2>
+<2126> <2126> <A7D9>
+<212B> <212B> <A1CA>
+<2153> <2154> <A8F7>
+<215B> <215E> <A8FB>
+<2160> <2169> <A5B0>
+<2170> <2179> <A5A1>
+<2190> <2191> <A1E7>
+<2192> <2192> <A1E6>
+<2193> <2194> <A1E9>
+<2195> <2195> <A2D5>
+<2196> <2196> <A2D8>
+<2197> <2197> <A2D6>
+<2198> <2198> <A2D9>
+<2199> <2199> <A2D7>
+<21B0> <21B0> <A882>
+<21B1> <21B1> <A87C>
+<21B2> <21B2> <A87B>
+<21B3> <21B3> <A883>
+<21B4> <21B4> <A881>
+<21BC> <21BC> <A892>
+<21C0> <21C0> <A893>
+<21C4> <21C5> <A89E>
+<21CD> <21CD> <A84B>
+<21CF> <21CF> <A84A>
+<21D0> <21D0> <A849>
+<21D1> <21D1> <A871>
+<21D2> <21D2> <A2A1>
+<21D3> <21D3> <A872>
+<21D4> <21D4> <A2A2>
+<21E0> <21E0> <AC6A>
+<21E1> <21E1> <AC6C>
+<21E2> <21E2> <AC6B>
+<21E3> <21E3> <AC6D>
+<21E6> <21E6> <AC72>
+<21E7> <21E7> <AC74>
+<21E8> <21E8> <AC73>
+<21E9> <21E9> <AC75>
+<2200> <2200> <A2A3>
+<2202> <2202> <A1D3>
+<2203> <2203> <A2A4>
+<2206> <2206> <A751>
+<2207> <2207> <A1D4>
+<2208> <2208> <A1F4>
+<2209> <2209> <A773>
+<220B> <220B> <A1F5>
+<220C> <220C> <A774>
+<220F> <220F> <A2B3>
+<2211> <2211> <A2B2>
+<2213> <2213> <A75C>
+<221A> <221A> <A1EE>
+<221D> <221D> <A1F0>
+<221E> <221E> <A1C4>
+<221F> <221F> <A753>
+<2220> <2220> <A1D0>
+<2222> <2222> <A768>
+<2225> <2226> <A1AB>
+<2227> <2228> <A1FC>
+<2229> <2229> <A1FB>
+<222A> <222A> <A1FA>
+<222B> <222C> <A1F2>
+<222E> <222E> <A2B1>
+<2234> <2234> <A1C5>
+<2235> <2235> <A1F1>
+<2236> <2236> <A2B0>
+<2237> <2237> <A2FE>
+<223C> <223C> <A1AD>
+<223D> <223D> <A1EF>
+<2243> <2243> <A49A>
+<2245> <2245> <A499>
+<2248> <2248> <A49B>
+<2250> <2250> <A769>
+<2251> <2251> <A759>
+<2252> <2252> <A1D6>
+<2253> <2253> <A758>
+<225A> <225A> <A777>
+<2260> <2260> <A1C1>
+<2261> <2261> <A1D5>
+<2262> <2262> <A764>
+<2264> <2265> <A1C2>
+<2266> <2267> <A75A>
+<226A> <226B> <A1EC>
+<226E> <226F> <A76F>
+<2270> <2273> <A487>
+<2276> <2277> <A48F>
+<2279> <2279> <A491>
+<227A> <227B> <A481>
+<2280> <2281> <A485>
+<2282> <2283> <A1F8>
+<2284> <2284> <A772>
+<2285> <2285> <A771>
+endbfrange
+
+100 beginbfrange
+<2286> <2287> <A1F6>
+<228A> <228A> <A48C>
+<228B> <228B> <A48E>
+<2295> <2297> <A75D>
+<2299> <2299> <A2C1>
+<22A3> <22A3> <A76C>
+<22A4> <22A4> <A49D>
+<22A5> <22A5> <A1D1>
+<22BB> <22BC> <A775>
+<22CE> <22CF> <A483>
+<22DA> <22DB> <A492>
+<22EE> <22EE> <A2FD>
+<22EF> <22EF> <FF>
+<2306> <2306> <A778>
+<2312> <2312> <A1D2>
+<2314> <2314> <A761>
+<2460> <246E> <A8E7>
+<246F> <2473> <A7F0>
+<2474> <2482> <A9E7>
+<2483> <2487> <AAF4>
+<249C> <24B5> <A9CD>
+<24B6> <24CF> <A386>
+<24D0> <24E9> <A8CD>
+<2500> <2500> <A6A1>
+<2501> <2501> <A6AC>
+<2502> <2502> <A6A2>
+<2503> <2503> <A6AD>
+<250C> <250C> <A6A3>
+<250D> <250D> <A6C8>
+<250E> <250E> <A6C7>
+<250F> <250F> <A6AE>
+<2510> <2510> <A6A4>
+<2511> <2511> <A6C2>
+<2512> <2512> <A6C1>
+<2513> <2513> <A6AF>
+<2514> <2514> <A6A6>
+<2515> <2515> <A6C6>
+<2516> <2516> <A6C5>
+<2517> <2517> <A6B1>
+<2518> <2518> <A6A5>
+<2519> <2519> <A6C4>
+<251A> <251A> <A6C3>
+<251B> <251B> <A6B0>
+<251C> <251C> <A6A7>
+<251D> <251D> <A6BC>
+<251E> <251F> <A6C9>
+<2520> <2520> <A6B7>
+<2521> <2522> <A6CB>
+<2523> <2523> <A6B2>
+<2524> <2524> <A6A9>
+<2525> <2525> <A6BE>
+<2526> <2527> <A6CD>
+<2528> <2528> <A6B9>
+<2529> <252A> <A6CF>
+<252B> <252B> <A6B4>
+<252C> <252C> <A6A8>
+<252D> <252E> <A6D1>
+<252F> <252F> <A6B8>
+<2530> <2530> <A6BD>
+<2531> <2532> <A6D3>
+<2533> <2533> <A6B3>
+<2534> <2534> <A6AA>
+<2535> <2536> <A6D5>
+<2537> <2537> <A6BA>
+<2538> <2538> <A6BF>
+<2539> <253A> <A6D7>
+<253B> <253B> <A6B5>
+<253C> <253C> <A6AB>
+<253D> <253E> <A6D9>
+<253F> <253F> <A6BB>
+<2540> <2541> <A6DB>
+<2542> <2542> <A6C0>
+<2543> <254A> <A6DD>
+<254B> <254B> <A6B6>
+<2592> <2592> <A2C6>
+<2595> <2595> <A3FC>
+<25A0> <25A0> <A1E1>
+<25A1> <25A1> <A1E0>
+<25A3> <25A3> <A2C3>
+<25A4> <25A5> <A2C7>
+<25A6> <25A6> <A2CB>
+<25A7> <25A7> <A2CA>
+<25A8> <25A8> <A2C9>
+<25A9> <25A9> <A2CC>
+<25B1> <25B1> <A766>
+<25B2> <25B2> <A1E3>
+<25B3> <25B3> <A1E2>
+<25B5> <25B5> <A795>
+<25B6> <25B6> <A2BA>
+<25B7> <25B7> <A2B9>
+<25B9> <25B9> <A796>
+<25BC> <25BC> <A1E5>
+<25BD> <25BD> <A1E4>
+<25BF> <25BF> <A794>
+<25C0> <25C0> <A2B8>
+<25C1> <25C1> <A2B7>
+<25C3> <25C3> <A797>
+<25C6> <25C6> <A1DF>
+<25C7> <25C7> <A1DE>
+<25C8> <25C8> <A2C2>
+endbfrange
+
+100 beginbfrange
+<25C9> <25C9> <A2C1>
+<25CA> <25CA> <A79C>
+<25CB> <25CB> <A1DB>
+<25CC> <25CC> <A675>
+<25CE> <25CE> <A1DD>
+<25CF> <25CF> <A1DC>
+<25D0> <25D1> <A2C4>
+<25E6> <25E6> <A790>
+<25EF> <25EF> <A66F>
+<2605> <2605> <A1DA>
+<2606> <2606> <A1D9>
+<2609> <2609> <A2C1>
+<260E> <260E> <A2CF>
+<260F> <260F> <A2CE>
+<261C> <261C> <A2D0>
+<261D> <261D> <AC8D>
+<261E> <261E> <A2D1>
+<261F> <261F> <AC8E>
+<262F> <262F> <A693>
+<2640> <2640> <A1CF>
+<2642> <2642> <A1CE>
+<2660> <2661> <A2BC>
+<2663> <2663> <A2C0>
+<2664> <2664> <A2BB>
+<2665> <2665> <A2BE>
+<2667> <2667> <A2BF>
+<2668> <2668> <A2CD>
+<2669> <266A> <A2DB>
+<266C> <266C> <A2DD>
+<266D> <266D> <A2DA>
+<266F> <266F> <A648>
+<2716> <2716> <A66D>
+<271A> <271A> <A66C>
+<273D> <273D> <A652>
+<2756> <2756> <A673>
+<2776> <277F> <A6E5>
+<278A> <2793> <A355>
+<3000> <3002> <A1A1>
+<3003> <3003> <A1A8>
+<3008> <3011> <A1B4>
+<3012> <3012> <A742>
+<3013> <3013> <A1EB>
+<3014> <3015> <A1B2>
+<3016> <3019> <A15D>
+<301C> <301C> <A1AD>
+<301E> <301F> <ADA9>
+<3020> <3020> <A69E>
+<3036> <3036> <A743>
+<3041> <3093> <AAA1>
+<30A1> <30F6> <ABA1>
+<30FB> <30FB> <A1A4>
+<3131> <318E> <A4A1>
+<3200> <321B> <A9B1>
+<321C> <321C> <A2DF>
+<3231> <3231> <A79D>
+<3239> <3239> <A79E>
+<3260> <327B> <A8B1>
+<327F> <327F> <A2DE>
+<328A> <328F> <AD71>
+<3290> <3290> <AD70>
+<3294> <3294> <AB5C>
+<329E> <329E> <A782>
+<32A5> <32A5> <AB6C>
+<3380> <3384> <A7C9>
+<3388> <3389> <A7BA>
+<338A> <338C> <A7DC>
+<338D> <338F> <A7B6>
+<3390> <3394> <A7D4>
+<3395> <3397> <A7A1>
+<3398> <3398> <A7A5>
+<3399> <33A2> <A7AB>
+<33A3> <33A6> <A7A7>
+<33A7> <33A8> <A7BD>
+<33A9> <33AC> <A7E5>
+<33AD> <33AF> <A7E1>
+<33B0> <33B9> <A7BF>
+<33BA> <33BF> <A7CE>
+<33C0> <33C1> <A7DA>
+<33C2> <33C2> <A2E3>
+<33C3> <33C3> <A7EC>
+<33C4> <33C4> <A7A6>
+<33C5> <33C5> <A7E0>
+<33C6> <33C6> <A7EF>
+<33C7> <33C7> <A2E1>
+<33C8> <33C8> <A7BC>
+<33C9> <33C9> <A7ED>
+<33CA> <33CA> <A7B5>
+<33CB> <33CB> <A79F>
+<33CF> <33CF> <A7B9>
+<33D0> <33D0> <A7EA>
+<33D3> <33D3> <A7EB>
+<33D6> <33D6> <A7DF>
+<33D8> <33D8> <A2E4>
+<33DB> <33DB> <A7E4>
+<33DC> <33DC> <A7EE>
+<33DD> <33DD> <A7E9>
+<4E00> <4E00> <ECE9>
+<4E01> <4E01> <EFCB>
+<4E03> <4E03> <F6D2>
+<4E07> <4E07> <D8B2>
+endbfrange
+
+100 beginbfrange
+<4E08> <4E08> <EDDB>
+<4E09> <4E09> <DFB2>
+<4E0A> <4E0A> <DFBE>
+<4E0B> <4E0B> <F9BB>
+<4E0D> <4E0D> <DCF4>
+<4E11> <4E11> <F5E4>
+<4E14> <4E14> <F3A6>
+<4E15> <4E15> <DDE0>
+<4E16> <4E16> <E1A6>
+<4E18> <4E18> <CEF8>
+<4E19> <4E19> <DCB0>
+<4E1E> <4E1E> <E3AA>
+<4E2D> <4E2D> <F1E9>
+<4E32> <4E32> <CDFA>
+<4E38> <4E38> <FCAF>
+<4E39> <4E39> <D3A1>
+<4E3B> <4E3B> <F1AB>
+<4E42> <4E42> <E7D1>
+<4E43> <4E43> <D2AC>
+<4E45> <4E45> <CEF9>
+<4E4B> <4E4B> <F1FD>
+<4E4D> <4E4D> <DEBF>
+<4E4E> <4E4E> <FBBA>
+<4E4F> <4E4F> <F9B9>
+<4E56> <4E56> <CED2>
+<4E58> <4E58> <E3AB>
+<4E59> <4E59> <EBE0>
+<4E5D> <4E5D> <CEFA>
+<4E5E> <4E5E> <CBF7>
+<4E5F> <4E5F> <E5A5>
+<4E6B> <4E6B> <CAE1>
+<4E6D> <4E6D> <D4CC>
+<4E73> <4E73> <EAE1>
+<4E76> <4E76> <DCE3>
+<4E77> <4E77> <DFAD>
+<4E7E> <4E7E> <CBEB>
+<4E82> <4E82> <D5AF>
+<4E86> <4E86> <D6F5>
+<4E88> <4E88> <E5F8>
+<4E8B> <4E8B> <DEC0>
+<4E8C> <4E8C> <ECA3>
+<4E8E> <4E8E> <E9CD>
+<4E90> <4E90> <EAA7>
+<4E91> <4E91> <E9F6>
+<4E92> <4E92> <FBBB>
+<4E94> <4E94> <E7E9>
+<4E95> <4E95> <EFCC>
+<4E98> <4E98> <D0E6>
+<4E9B> <4E9B> <DEC1>
+<4E9E> <4E9E> <E4AC>
+<4EA1> <4EA1> <D8CC>
+<4EA2> <4EA2> <F9F1>
+<4EA4> <4EA4> <CEDF>
+<4EA5> <4EA5> <FAA4>
+<4EA6> <4EA6> <E6B2>
+<4EA8> <4EA8> <FAFB>
+<4EAB> <4EAB> <FABD>
+<4EAC> <4EAC> <CCC8>
+<4EAD> <4EAD> <EFCD>
+<4EAE> <4EAE> <D5D5>
+<4EB6> <4EB6> <D3A2>
+<4EBA> <4EBA> <ECD1>
+<4EC0> <4EC0> <E4A7>
+<4EC1> <4EC1> <ECD2>
+<4EC4> <4EC4> <F6B1>
+<4EC7> <4EC7> <CEFB>
+<4ECA> <4ECA> <D0D1>
+<4ECB> <4ECB> <CBBF>
+<4ECD> <4ECD> <EDA4>
+<4ED4> <4ED4> <EDA8>
+<4ED5> <4ED5> <DEC2>
+<4ED6> <4ED6> <F6E2>
+<4ED7> <4ED7> <EDDC>
+<4ED8> <4ED8> <DCF5>
+<4ED9> <4ED9> <E0B9>
+<4EDD> <4EDD> <D4CE>
+<4EDF> <4EDF> <F4B5>
+<4EE3> <4EE3> <D3DB>
+<4EE4> <4EE4> <D6B5>
+<4EE5> <4EE5> <ECA4>
+<4EF0> <4EF0> <E4E6>
+<4EF2> <4EF2> <F1EA>
+<4EF6> <4EF6> <CBEC>
+<4EF7> <4EF7> <CBC0>
+<4EFB> <4EFB> <ECF2>
+<4F01> <4F01> <D0EA>
+<4F09> <4F09> <F9F2>
+<4F0A> <4F0A> <ECA5>
+<4F0B> <4F0B> <D0DF>
+<4F0D> <4F0D> <E7EA>
+<4F0E> <4F0E> <D0EB>
+<4F0F> <4F0F> <DCD1>
+<4F10> <4F10> <DBE9>
+<4F11> <4F11> <FDCC>
+<4F2F> <4F2F> <DBD7>
+<4F34> <4F34> <DAE1>
+<4F36> <4F36> <D6B6>
+<4F38> <4F38> <E3DF>
+<4F3A> <4F3A> <DEC3>
+<4F3C> <4F3C> <DEC4>
+endbfrange
+
+100 beginbfrange
+<4F3D> <4F3D> <CAA1>
+<4F43> <4F43> <EEEC>
+<4F46> <4F46> <D3A3>
+<4F47> <4F47> <EEB7>
+<4F48> <4F48> <F8CF>
+<4F4D> <4F4D> <EAC8>
+<4F4E> <4F4E> <EEB8>
+<4F4F> <4F4F> <F1AC>
+<4F50> <4F50> <F1A5>
+<4F51> <4F51> <E9CE>
+<4F55> <4F55> <F9BC>
+<4F59> <4F59> <E5F9>
+<4F5A> <4F5A> <ECEA>
+<4F5B> <4F5B> <DDD6>
+<4F5C> <4F5C> <EDC2>
+<4F69> <4F69> <F8A5>
+<4F6F> <4F6F> <E5BA>
+<4F70> <4F70> <DBD8>
+<4F73> <4F73> <CAA2>
+<4F76> <4F76> <D1CD>
+<4F7A> <4F7A> <EEED>
+<4F7E> <4F7E> <ECEB>
+<4F7F> <4F7F> <DEC5>
+<4F81> <4F81> <E3E0>
+<4F83> <4F83> <CAC9>
+<4F84> <4F84> <F2E9>
+<4F86> <4F86> <D5CE>
+<4F88> <4F88> <F6B6>
+<4F8A> <4F8A> <CEC2>
+<4F8B> <4F8B> <D6C7>
+<4F8D> <4F8D> <E3B4>
+<4F8F> <4F8F> <F1AD>
+<4F91> <4F91> <EAE2>
+<4F96> <4F96> <D7C2>
+<4F98> <4F98> <F3A7>
+<4F9B> <4F9B> <CDEA>
+<4F9D> <4F9D> <EBEE>
+<4FAE> <4FAE> <D9B2>
+<4FAF> <4FAF> <FDA5>
+<4FB5> <4FB5> <F6D5>
+<4FB6> <4FB6> <D5E2>
+<4FBF> <4FBF> <F8B5>
+<4FC2> <4FC2> <CCF5>
+<4FC3> <4FC3> <F5B5>
+<4FC4> <4FC4> <E4AD>
+<4FC9> <4FC9> <E7EB>
+<4FCA> <4FCA> <F1D5>
+<4FCE> <4FCE> <F0BB>
+<4FD1> <4FD1> <E9B5>
+<4FD3> <4FD3> <CCC9>
+<4FD4> <4FD4> <FAD5>
+<4FD7> <4FD7> <E1D4>
+<4FDA> <4FDA> <D7D6>
+<4FDD> <4FDD> <DCC1>
+<4FDF> <4FDF> <DEC6>
+<4FE0> <4FE0> <FAEF>
+<4FE1> <4FE1> <E3E1>
+<4FEE> <4FEE> <E1F3>
+<4FEF> <4FEF> <DCF6>
+<4FF1> <4FF1> <CEFC>
+<4FF3> <4FF3> <DBC4>
+<4FF5> <4FF5> <F8F1>
+<4FF8> <4FF8> <DCE4>
+<4FFA> <4FFA> <E5EF>
+<5002> <5002> <DCB1>
+<5006> <5006> <D5D6>
+<5009> <5009> <F3DA>
+<500B> <500B> <CBC1>
+<500D> <500D> <DBC3>
+<5011> <5011> <D9FA>
+<5012> <5012> <D3EE>
+<5016> <5016> <FAB8>
+<5019> <5019> <FDA6>
+<501A> <501A> <EBEF>
+<501C> <501C> <F4A6>
+<501E> <501E> <CCCA>
+<501F> <501F> <F3A8>
+<5021> <5021> <F3DB>
+<5023> <5023> <DBA7>
+<5024> <5024> <F6B7>
+<5026> <5026> <CFE6>
+<5027> <5027> <F0F2>
+<5028> <5028> <CBDA>
+<502A> <502A> <E7D2>
+<502B> <502B> <D7C3>
+<502C> <502C> <F6F0>
+<502D> <502D> <E8DE>
+<503B> <503B> <E5A6>
+<5043> <5043> <E5E7>
+<5047> <5047> <CAA3>
+<5048> <5048> <CCA7>
+<5049> <5049> <EAC9>
+<504F> <504F> <F8B6>
+<5055> <5055> <FAA5>
+<505A> <505A> <F1AE>
+<505C> <505C> <EFCE>
+<5065> <5065> <CBED>
+<5074> <5074> <F6B0>
+<5075> <5075> <EFCF>
+<5076> <5076> <E9CF>
+endbfrange
+
+100 beginbfrange
+<5078> <5078> <F7DE>
+<5080> <5080> <CED3>
+<5085> <5085> <DCF7>
+<508D> <508D> <DBA8>
+<5091> <5091> <CBF8>
+<5098> <5098> <DFA1>
+<5099> <5099> <DDE1>
+<50AC> <50AC> <F5CA>
+<50AD> <50AD> <E9B6>
+<50B2> <50B2> <E7EC>
+<50B3> <50B3> <EEEE>
+<50B5> <50B5> <F3F0>
+<50B7> <50B7> <DFBF>
+<50BE> <50BE> <CCCB>
+<50C5> <50C5> <D0C1>
+<50C9> <50C9> <F4D2>
+<50CA> <50CA> <E0BA>
+<50CF> <50CF> <DFC0>
+<50D1> <50D1> <CEE0>
+<50D5> <50D5> <DCD2>
+<50D6> <50D6> <FDEA>
+<50DA> <50DA> <D6F6>
+<50DE> <50DE> <EACA>
+<50E5> <50E5> <E8E9>
+<50E7> <50E7> <E3AC>
+<50ED> <50ED> <F3D0>
+<50F9> <50F9> <CAA4>
+<50FB> <50FB> <DBF8>
+<50FF> <50FF> <DEC7>
+<5100> <5100> <EBF0>
+<5101> <5101> <F1D6>
+<5104> <5104> <E5E2>
+<5106> <5106> <CCCC>
+<5109> <5109> <CBFB>
+<5112> <5112> <EAE3>
+<511F> <511F> <DFC1>
+<5121> <5121> <D6ED>
+<512A> <512A> <E9D0>
+<5132> <5132> <EEB9>
+<5137> <5137> <D5E3>
+<513A> <513A> <D1D3>
+<513C> <513C> <E5F0>
+<5140> <5140> <E8B4>
+<5141> <5141> <EBC3>
+<5143> <5143> <EAAA>
+<5144> <5144> <FAFC>
+<5145> <5145> <F5F6>
+<5146> <5146> <F0BC>
+<5147> <5147> <FDD4>
+<5148> <5148> <E0BB>
+<5149> <5149> <CEC3>
+<514B> <514B> <D0BA>
+<514C> <514C> <F7BA>
+<514D> <514D> <D8F3>
+<514E> <514E> <F7CD>
+<5152> <5152> <E4AE>
+<515C> <515C> <D4DF>
+<5162> <5162> <D0E7>
+<5165> <5165> <ECFD>
+<5167> <5167> <D2AE>
+<5168> <5168> <EEEF>
+<5169> <5169> <D5D7>
+<516A> <516A> <EAE4>
+<516B> <516B> <F8A2>
+<516C> <516C> <CDEB>
+<516D> <516D> <D7BF>
+<516E> <516E> <FBB1>
+<5171> <5171> <CDEC>
+<5175> <5175> <DCB2>
+<5176> <5176> <D0EC>
+<5177> <5177> <CEFD>
+<5178> <5178> <EEF0>
+<517C> <517C> <CCC2>
+<5180> <5180> <D0ED>
+<5186> <5186> <E5F7>
+<518A> <518A> <F3FC>
+<518D> <518D> <EEA2>
+<5192> <5192> <D9B3>
+<5195> <5195> <D8F4>
+<5197> <5197> <E9B7>
+<51A0> <51A0> <CEAE>
+<51A5> <51A5> <D9A2>
+<51AA> <51AA> <D8F1>
+<51AC> <51AC> <D4CF>
+<51B6> <51B6> <E5A7>
+<51B7> <51B7> <D5D2>
+<51BD> <51BD> <D6A9>
+<51C4> <51C4> <F4A2>
+<51C6> <51C6> <F1D7>
+<51C9> <51C9> <D5D8>
+<51CB> <51CB> <F0BD>
+<51CC> <51CC> <D7D0>
+<51CD> <51CD> <D4D0>
+<51DC> <51DC> <D7CF>
+<51DD> <51DD> <EBEA>
+<51DE> <51DE> <FDEB>
+<51E1> <51E1> <DBED>
+<51F0> <51F0> <FCC5>
+<51F1> <51F1> <CBC2>
+<51F6> <51F6> <FDD5>
+endbfrange
+
+100 beginbfrange
+<51F8> <51F8> <F4C8>
+<51F9> <51F9> <E8EA>
+<51FA> <51FA> <F5F3>
+<51FD> <51FD> <F9DE>
+<5200> <5200> <D3EF>
+<5203> <5203> <ECD3>
+<5206> <5206> <DDC2>
+<5207> <5207> <EFB7>
+<5208> <5208> <E7D4>
+<520A> <520A> <CACA>
+<520E> <520E> <D9FB>
+<5211> <5211> <FAFD>
+<5217> <5217> <D6AA>
+<521D> <521D> <F4F8>
+<5224> <5224> <F7F7>
+<5225> <5225> <DCAC>
+<5229> <5229> <D7D7>
+<522A> <522A> <DFA2>
+<522E> <522E> <CEBE>
+<5230> <5230> <D3F0>
+<5236> <5236> <F0A4>
+<5237> <5237> <E1EC>
+<5238> <5238> <CFE7>
+<5239> <5239> <F3CB>
+<523A> <523A> <EDA9>
+<523B> <523B> <CABE>
+<5243> <5243> <F4EF>
+<5247> <5247> <F6CE>
+<524A> <524A> <DEFB>
+<524B> <524B> <D0BB>
+<524C> <524C> <D5B7>
+<524D> <524D> <EEF1>
+<5254> <5254> <F4A8>
+<5256> <5256> <DCF8>
+<525B> <525B> <CBA7>
+<525D> <525D> <DACE>
+<5261> <5261> <E0E6>
+<5269> <5269> <EDA5>
+<526A> <526A> <EEF2>
+<526F> <526F> <DCF9>
+<5272> <5272> <F9DC>
+<5275> <5275> <F3DC>
+<527D> <527D> <F8F2>
+<527F> <527F> <F4F9>
+<5283> <5283> <FCF1>
+<5287> <5287> <D0BC>
+<5288> <5288> <DBF9>
+<5289> <5289> <D7B1>
+<528D> <528D> <CBFC>
+<5291> <5291> <F0A5>
+<5292> <5292> <CBFD>
+<529B> <529B> <D5F4>
+<529F> <529F> <CDED>
+<52A0> <52A0> <CAA5>
+<52A3> <52A3> <D6AB>
+<52A4> <52A4> <D0C2>
+<52A9> <52A9> <F0BE>
+<52AA> <52AA> <D2BD>
+<52AB> <52AB> <CCA4>
+<52BE> <52BE> <FAB6>
+<52C1> <52C1> <CCCD>
+<52C3> <52C3> <DAFA>
+<52C5> <52C5> <F6CF>
+<52C7> <52C7> <E9B8>
+<52C9> <52C9> <D8F5>
+<52CD> <52CD> <CCCE>
+<52D2> <52D2> <D7CD>
+<52D5> <52D5> <D4D1>
+<52D6> <52D6> <E9ED>
+<52D8> <52D8> <CAEB>
+<52D9> <52D9> <D9E2>
+<52DB> <52DB> <FDB2>
+<52DD> <52DD> <E3AD>
+<52DE> <52DE> <D6CC>
+<52DF> <52DF> <D9B4>
+<52E2> <52E2> <E1A7>
+<52E3> <52E3> <EED3>
+<52E4> <52E4> <D0C3>
+<52F3> <52F3> <FDB3>
+<52F5> <52F5> <D5E4>
+<52F8> <52F8> <CFE8>
+<52FA> <52FA> <EDC3>
+<52FB> <52FB> <D0B2>
+<52FE> <52FE> <CEFE>
+<52FF> <52FF> <DAA8>
+<5305> <5305> <F8D0>
+<5308> <5308> <FDD6>
+<530D> <530D> <F8D1>
+<530F> <530F> <F8D2>
+<5310> <5310> <DCD3>
+<5315> <5315> <DDE2>
+<5316> <5316> <FBF9>
+<5317> <5317> <DDC1>
+<5319> <5319> <E3B5>
+<5320> <5320> <EDDD>
+<5321> <5321> <CEC4>
+<5323> <5323> <CBA1>
+<532A> <532A> <DDE3>
+<532F> <532F> <FCDD>
+<5339> <5339> <F9AF>
+endbfrange
+
+100 beginbfrange
+<533F> <533F> <D2FB>
+<5340> <5340> <CFA1>
+<5341> <5341> <E4A8>
+<5343> <5343> <F4B6>
+<5344> <5344> <ECFE>
+<5347> <5347> <E3AE>
+<5348> <5348> <E7ED>
+<5349> <5349> <FDC1>
+<534A> <534A> <DAE2>
+<534D> <534D> <D8B3>
+<5351> <5351> <DDE4>
+<5352> <5352> <F0EF>
+<5353> <5353> <F6F1>
+<5354> <5354> <FAF0>
+<5357> <5357> <D1F5>
+<535A> <535A> <DACF>
+<535C> <535C> <DCD4>
+<535E> <535E> <DCA6>
+<5360> <5360> <EFBF>
+<5366> <5366> <CECF>
+<5368> <5368> <E0D9>
+<536F> <536F> <D9D6>
+<5370> <5370> <ECD4>
+<5371> <5371> <EACB>
+<5374> <5374> <CABF>
+<5375> <5375> <D5B0>
+<5377> <5377> <CFE9>
+<537D> <537D> <F1ED>
+<537F> <537F> <CCCF>
+<5384> <5384> <E4F8>
+<5393> <5393> <E4ED>
+<5398> <5398> <D7D8>
+<539A> <539A> <FDA7>
+<539F> <539F> <EAAB>
+<53A0> <53A0> <F6B2>
+<53A5> <53A5> <CFF0>
+<53A6> <53A6> <F9BD>
+<53AD> <53AD> <E6F4>
+<53BB> <53BB> <CBDB>
+<53C3> <53C3> <F3D1>
+<53C8> <53C8> <E9D1>
+<53C9> <53C9> <F3A9>
+<53CA> <53CA> <D0E0>
+<53CB> <53CB> <E9D2>
+<53CD> <53CD> <DAE3>
+<53D4> <53D4> <E2D2>
+<53D6> <53D6> <F6A2>
+<53D7> <53D7> <E1F4>
+<53DB> <53DB> <DAE4>
+<53E1> <53E1> <E7D5>
+<53E2> <53E2> <F5BF>
+<53E3> <53E3> <CFA2>
+<53E4> <53E4> <CDAF>
+<53E5> <53E5> <CFA3>
+<53E9> <53E9> <CDB0>
+<53EA> <53EA> <F1FE>
+<53EB> <53EB> <D0A3>
+<53EC> <53EC> <E1AF>
+<53ED> <53ED> <F8A3>
+<53EF> <53EF> <CAA6>
+<53F0> <53F0> <F7BB>
+<53F1> <53F1> <F2EA>
+<53F2> <53F2> <DEC8>
+<53F3> <53F3> <E9D3>
+<53F8> <53F8> <DEC9>
+<5403> <5403> <FDDE>
+<5404> <5404> <CAC0>
+<5408> <5408> <F9EA>
+<5409> <5409> <D1CE>
+<540A> <540A> <EED4>
+<540C> <540C> <D4D2>
+<540D> <540D> <D9A3>
+<540E> <540E> <FDA8>
+<540F> <540F> <D7D9>
+<5410> <5410> <F7CE>
+<5411> <5411> <FABE>
+<541B> <541B> <CFD6>
+<541D> <541D> <D7F0>
+<541F> <541F> <EBE1>
+<5420> <5420> <F8C5>
+<5426> <5426> <DCFA>
+<5429> <5429> <DDC3>
+<542B> <542B> <F9DF>
+<5433> <5433> <E7EF>
+<5438> <5438> <FDE5>
+<5439> <5439> <F6A3>
+<543B> <543B> <D9FC>
+<543C> <543C> <FDA9>
+<543E> <543E> <E7EE>
+<5442> <5442> <D5E5>
+<5448> <5448> <EFD0>
+<544A> <544A> <CDB1>
+<5451> <5451> <F7A2>
+<5468> <5468> <F1B2>
+<546A> <546A> <F1B1>
+<5471> <5471> <CDB2>
+<5473> <5473> <DAAB>
+<5475> <5475> <CAA7>
+<547B> <547B> <E3E2>
+<547C> <547C> <FBBC>
+endbfrange
+
+100 beginbfrange
+<547D> <547D> <D9A4>
+<5480> <5480> <EEBA>
+<5486> <5486> <F8D3>
+<548C> <548C> <FBFA>
+<548E> <548E> <CFA4>
+<5490> <5490> <DCFB>
+<54A4> <54A4> <F6E3>
+<54A8> <54A8> <EDAA>
+<54AB> <54AB> <F2A1>
+<54AC> <54AC> <CEE1>
+<54B3> <54B3> <FAA6>
+<54B8> <54B8> <F9E0>
+<54BD> <54BD> <ECD6>
+<54C0> <54C0> <E4EE>
+<54C1> <54C1> <F9A1>
+<54C4> <54C4> <FBEF>
+<54C8> <54C8> <F9EB>
+<54C9> <54C9> <EEA3>
+<54E1> <54E1> <EAAC>
+<54E5> <54E5> <CAA8>
+<54E8> <54E8> <F4FA>
+<54ED> <54ED> <CDD6>
+<54EE> <54EE> <FCF6>
+<54F2> <54F2> <F4C9>
+<54FA> <54FA> <F8D4>
+<5504> <5504> <F8A6>
+<5506> <5506> <DECA>
+<5507> <5507> <F2C6>
+<550E> <550E> <D7DA>
+<5510> <5510> <D3D0>
+<551C> <551C> <D8C5>
+<552F> <552F> <EAE6>
+<5531> <5531> <F3DD>
+<5535> <5535> <E4DA>
+<553E> <553E> <F6E4>
+<5544> <5544> <F6F2>
+<5546> <5546> <DFC2>
+<554F> <554F> <D9FD>
+<5553> <5553> <CCF6>
+<5556> <5556> <D3BA>
+<555E> <555E> <E4AF>
+<5563> <5563> <F9E1>
+<557C> <557C> <F0A6>
+<5580> <5580> <CBD3>
+<5584> <5584> <E0BC>
+<5586> <5586> <F4CA>
+<5587> <5587> <D4FA>
+<5589> <5589> <FDAA>
+<558A> <558A> <F9E2>
+<5598> <5598> <F4B7>
+<5599> <5599> <FDC2>
+<559A> <559A> <FCB0>
+<559C> <559C> <FDEC>
+<559D> <559D> <CAE2>
+<55A7> <55A7> <FDBD>
+<55A9> <55A9> <EAE7>
+<55AA> <55AA> <DFC3>
+<55AB> <55AB> <D1D2>
+<55AC> <55AC> <CEE2>
+<55AE> <55AE> <D3A4>
+<55C5> <55C5> <FDAB>
+<55C7> <55C7> <DFE0>
+<55D4> <55D4> <F2C7>
+<55DA> <55DA> <E7F0>
+<55DC> <55DC> <D0EE>
+<55DF> <55DF> <F3AA>
+<55E3> <55E3> <DECB>
+<55E4> <55E4> <F6B8>
+<55FD> <55FD> <E1F5>
+<55FE> <55FE> <F1B3>
+<5606> <5606> <F7A3>
+<5609> <5609> <CAA9>
+<5614> <5614> <CFA5>
+<5617> <5617> <DFC4>
+<562F> <562F> <E1B0>
+<5632> <5632> <F0BF>
+<5634> <5634> <F6A4>
+<5636> <5636> <E3B6>
+<5653> <5653> <FAC6>
+<5668> <5668> <D0EF>
+<566B> <566B> <FDED>
+<5674> <5674> <DDC4>
+<5686> <5686> <FCF7>
+<56A5> <56A5> <E6BF>
+<56AC> <56AC> <DEAD>
+<56AE> <56AE> <FABF>
+<56B4> <56B4> <E5F1>
+<56BC> <56BC> <EDC4>
+<56CA> <56CA> <D2A5>
+<56CD> <56CD> <FDEE>
+<56D1> <56D1> <F5B6>
+<56DA> <56DA> <E1F6>
+<56DB> <56DB> <DECC>
+<56DE> <56DE> <FCDE>
+<56E0> <56E0> <ECD7>
+<56F0> <56F0> <CDDD>
+<56F9> <56F9> <D6B7>
+<56FA> <56FA> <CDB3>
+<5703> <5703> <F8D5>
+<5704> <5704> <E5D8>
+endbfrange
+
+100 beginbfrange
+<5708> <5708> <CFEA>
+<570B> <570B> <CFD0>
+<570D> <570D> <EACC>
+<5712> <5712> <EAAE>
+<5713> <5713> <EAAD>
+<5716> <5716> <D3F1>
+<5718> <5718> <D3A5>
+<571F> <571F> <F7CF>
+<5728> <5728> <EEA4>
+<572D> <572D> <D0A4>
+<5730> <5730> <F2A2>
+<573B> <573B> <D0F0>
+<5740> <5740> <F2A3>
+<5742> <5742> <F7F8>
+<5747> <5747> <D0B3>
+<574A> <574A> <DBA9>
+<574D> <574D> <D3BB>
+<574E> <574E> <CAEC>
+<5750> <5750> <F1A6>
+<5751> <5751> <CBD5>
+<5761> <5761> <F7E7>
+<5764> <5764> <CDDE>
+<5766> <5766> <F7A4>
+<576A> <576A> <F8C0>
+<576E> <576E> <D3DD>
+<5770> <5770> <CCD0>
+<5775> <5775> <CFA6>
+<577C> <577C> <F6F3>
+<5782> <5782> <E1F7>
+<5788> <5788> <D3DC>
+<578B> <578B> <FAFE>
+<5793> <5793> <FAA7>
+<57A0> <57A0> <EBD9>
+<57A2> <57A2> <CFA7>
+<57A3> <57A3> <EAAF>
+<57C3> <57C3> <E4EF>
+<57C7> <57C7> <E9B9>
+<57C8> <57C8> <F1D8>
+<57CB> <57CB> <D8D8>
+<57CE> <57CE> <E0F2>
+<57DF> <57DF> <E6B4>
+<57E0> <57E0> <DCFC>
+<57F0> <57F0> <F3F1>
+<57F4> <57F4> <E3D0>
+<57F7> <57F7> <F2FB>
+<57F9> <57F9> <DBC6>
+<57FA> <57FA> <D0F1>
+<57FC> <57FC> <D0F2>
+<5800> <5800> <CFDC>
+<5802> <5802> <D3D1>
+<5805> <5805> <CCB1>
+<5806> <5806> <F7D8>
+<5808> <5808> <CBA8>
+<5809> <5809> <EBBC>
+<580A> <580A> <E4BE>
+<581E> <581E> <F4DC>
+<5821> <5821> <DCC2>
+<5824> <5824> <F0A7>
+<5827> <5827> <E6C0>
+<582A> <582A> <CAED>
+<582F> <582F> <E8EB>
+<5830> <5830> <E5E8>
+<5831> <5831> <DCC3>
+<5834> <5834> <EDDE>
+<5835> <5835> <D3F2>
+<583A> <583A> <CCF7>
+<584A> <584A> <CED4>
+<584B> <584B> <E7AB>
+<584F> <584F> <CBC3>
+<5851> <5851> <E1B1>
+<5854> <5854> <F7B2>
+<5857> <5857> <D3F3>
+<5858> <5858> <D3D2>
+<585A> <585A> <F5C0>
+<585E> <585E> <DFDD>
+<5861> <5861> <EEF3>
+<5862> <5862> <E7F1>
+<5864> <5864> <FDB4>
+<5875> <5875> <F2C8>
+<5879> <5879> <F3D2>
+<587C> <587C> <EEF4>
+<587E> <587E> <E2D3>
+<5883> <5883> <CCD1>
+<5885> <5885> <DFEA>
+<5889> <5889> <E9BA>
+<5893> <5893> <D9D7>
+<589C> <589C> <F5CD>
+<589E> <589E> <F1F2>
+<589F> <589F> <FAC7>
+<58A8> <58A8> <D9F8>
+<58A9> <58A9> <D4C2>
+<58AE> <58AE> <F6E5>
+<58B3> <58B3> <DDC5>
+<58BA> <58BA> <E7F2>
+<58BB> <58BB> <EDDF>
+<58BE> <58BE> <CACB>
+<58C1> <58C1> <DBFA>
+<58C5> <58C5> <E8B5>
+<58C7> <58C7> <D3A6>
+<58CE> <58CE> <FDB5>
+endbfrange
+
+100 beginbfrange
+<58D1> <58D1> <F9C9>
+<58D3> <58D3> <E4E2>
+<58D5> <58D5> <FBBD>
+<58D8> <58D8> <D7A4>
+<58D9> <58D9> <CEC5>
+<58DE> <58DE> <CED5>
+<58DF> <58DF> <D6E6>
+<58E4> <58E4> <E5BD>
+<58EB> <58EB> <DECD>
+<58EC> <58EC> <ECF3>
+<58EF> <58EF> <EDE0>
+<58F9> <58F9> <ECEC>
+<58FA> <58FA> <FBBE>
+<58FB> <58FB> <DFEB>
+<58FD> <58FD> <E1F8>
+<590F> <590F> <F9BE>
+<5914> <5914> <D0F3>
+<5915> <5915> <E0AA>
+<5916> <5916> <E8E2>
+<5919> <5919> <E2D4>
+<591A> <591A> <D2FD>
+<591C> <591C> <E5A8>
+<5922> <5922> <D9D3>
+<5927> <5927> <D3DE>
+<5929> <5929> <F4B8>
+<592A> <592A> <F7BC>
+<592B> <592B> <DCFD>
+<592D> <592D> <E8EC>
+<592E> <592E> <E4E7>
+<5931> <5931> <E3F7>
+<5937> <5937> <ECA8>
+<593E> <593E> <FAF1>
+<5944> <5944> <E5F2>
+<5947> <5947> <D0F4>
+<5948> <5948> <D2AF>
+<5949> <5949> <DCE5>
+<594E> <594E> <D0A5>
+<594F> <594F> <F1B4>
+<5950> <5950> <FCB1>
+<5951> <5951> <CCF8>
+<5954> <5954> <DDC6>
+<5955> <5955> <FAD1>
+<5957> <5957> <F7DF>
+<595A> <595A> <FAA8>
+<5960> <5960> <EEF5>
+<5962> <5962> <DECE>
+<5967> <5967> <E7F3>
+<596A> <596A> <F7AC>
+<596B> <596B> <EBC4>
+<596C> <596C> <EDE1>
+<596D> <596D> <E0AB>
+<596E> <596E> <DDC7>
+<5973> <5973> <D2B3>
+<5974> <5974> <D2BF>
+<5978> <5978> <CACC>
+<597D> <597D> <FBBF>
+<5982> <5982> <E5FD>
+<5983> <5983> <DDE5>
+<5984> <5984> <D8CD>
+<598A> <598A> <ECF4>
+<5993> <5993> <D0F5>
+<5996> <5996> <E8ED>
+<5997> <5997> <D0D2>
+<5999> <5999> <D9D8>
+<59A5> <59A5> <F6E6>
+<59A8> <59A8> <DBAA>
+<59AC> <59AC> <F7E0>
+<59B9> <59B9> <D8D9>
+<59BB> <59BB> <F4A3>
+<59BE> <59BE> <F4DD>
+<59C3> <59C3> <EFD1>
+<59C6> <59C6> <D9B5>
+<59C9> <59C9> <EDAB>
+<59CB> <59CB> <E3B7>
+<59D0> <59D0> <EEBB>
+<59D1> <59D1> <CDB4>
+<59D3> <59D3> <E0F3>
+<59D4> <59D4> <EACD>
+<59D9> <59D9> <ECF5>
+<59DA> <59DA> <E8EE>
+<59DC> <59DC> <CBA9>
+<59DD> <59DD> <F1AF>
+<59E6> <59E6> <CACD>
+<59E8> <59E8> <ECA9>
+<59EA> <59EA> <F2EB>
+<59EC> <59EC> <FDEF>
+<59EE> <59EE> <F9F3>
+<59F8> <59F8> <E6C1>
+<59FB> <59FB> <ECD8>
+<59FF> <59FF> <EDAC>
+<5A01> <5A01> <EACE>
+<5A03> <5A03> <E8DF>
+<5A11> <5A11> <DECF>
+<5A18> <5A18> <D2A6>
+<5A1B> <5A1B> <E7F4>
+<5A1C> <5A1C> <D1D6>
+<5A1F> <5A1F> <E6C2>
+<5A20> <5A20> <E3E3>
+<5A25> <5A25> <E4B0>
+<5A29> <5A29> <D8B4>
+endbfrange
+
+100 beginbfrange
+<5A36> <5A36> <F6A5>
+<5A3C> <5A3C> <F3DE>
+<5A41> <5A41> <D7A5>
+<5A46> <5A46> <F7E8>
+<5A49> <5A49> <E8C6>
+<5A5A> <5A5A> <FBE6>
+<5A62> <5A62> <DDE6>
+<5A66> <5A66> <DCFE>
+<5A92> <5A92> <D8DA>
+<5A9A> <5A9A> <DAAC>
+<5A9B> <5A9B> <EAB0>
+<5AA4> <5AA4> <E3B8>
+<5AC1> <5AC1> <CAAA>
+<5AC2> <5AC2> <E1F9>
+<5AC4> <5AC4> <EAB1>
+<5AC9> <5AC9> <F2EC>
+<5ACC> <5ACC> <FAEE>
+<5AE1> <5AE1> <EED5>
+<5AE6> <5AE6> <F9F4>
+<5AE9> <5AE9> <D2EC>
+<5B05> <5B05> <FBFB>
+<5B09> <5B09> <FDF0>
+<5B0B> <5B0B> <E0BD>
+<5B0C> <5B0C> <CEE3>
+<5B16> <5B16> <F8C6>
+<5B2A> <5B2A> <DEAE>
+<5B40> <5B40> <DFC5>
+<5B43> <5B43> <E5BE>
+<5B50> <5B50> <EDAD>
+<5B51> <5B51> <FAEA>
+<5B54> <5B54> <CDEE>
+<5B55> <5B55> <EDA6>
+<5B57> <5B57> <EDAE>
+<5B58> <5B58> <F0ED>
+<5B5A> <5B5A> <DDA1>
+<5B5C> <5B5C> <EDAF>
+<5B5D> <5B5D> <FCF8>
+<5B5F> <5B5F> <D8EB>
+<5B63> <5B63> <CCF9>
+<5B64> <5B64> <CDB5>
+<5B69> <5B69> <FAA9>
+<5B6B> <5B6B> <E1DD>
+<5B70> <5B70> <E2D5>
+<5B71> <5B71> <EDCF>
+<5B75> <5B75> <DDA2>
+<5B78> <5B78> <F9CA>
+<5B7A> <5B7A> <EAE8>
+<5B7C> <5B7C> <E5ED>
+<5B85> <5B85> <D3EB>
+<5B87> <5B87> <E9D4>
+<5B88> <5B88> <E1FA>
+<5B89> <5B89> <E4CC>
+<5B8B> <5B8B> <E1E4>
+<5B8C> <5B8C> <E8C7>
+<5B8F> <5B8F> <CEDB>
+<5B93> <5B93> <DCD5>
+<5B95> <5B95> <F7B5>
+<5B96> <5B96> <FCF3>
+<5B97> <5B97> <F0F3>
+<5B98> <5B98> <CEAF>
+<5B99> <5B99> <F1B5>
+<5B9A> <5B9A> <EFD2>
+<5B9B> <5B9B> <E8C8>
+<5B9C> <5B9C> <EBF1>
+<5BA2> <5BA2> <CBD4>
+<5BA3> <5BA3> <E0BE>
+<5BA4> <5BA4> <E3F8>
+<5BA5> <5BA5> <EAE9>
+<5BA6> <5BA6> <FCB2>
+<5BAC> <5BAC> <E0F4>
+<5BAE> <5BAE> <CFE0>
+<5BB0> <5BB0> <EEA5>
+<5BB3> <5BB3> <FAAA>
+<5BB4> <5BB4> <E6C3>
+<5BB5> <5BB5> <E1B2>
+<5BB6> <5BB6> <CAAB>
+<5BB8> <5BB8> <E3E4>
+<5BB9> <5BB9> <E9BB>
+<5BBF> <5BBF> <E2D6>
+<5BC0> <5BC0> <F3F2>
+<5BC2> <5BC2> <EED6>
+<5BC3> <5BC3> <EAB2>
+<5BC4> <5BC4> <D0F6>
+<5BC5> <5BC5> <ECD9>
+<5BC6> <5BC6> <DACB>
+<5BC7> <5BC7> <CFA8>
+<5BCC> <5BCC> <DDA3>
+<5BD0> <5BD0> <D8DB>
+<5BD2> <5BD2> <F9CE>
+<5BD3> <5BD3> <E9D5>
+<5BD4> <5BD4> <E3D1>
+<5BD7> <5BD7> <D2BC>
+<5BDE> <5BDE> <D8AC>
+<5BDF> <5BDF> <F3CC>
+<5BE1> <5BE1> <CDFB>
+<5BE2> <5BE2> <F6D6>
+<5BE4> <5BE4> <E7F5>
+<5BE5> <5BE5> <E8EF>
+<5BE6> <5BE6> <E3F9>
+<5BE7> <5BE7> <D2BB>
+endbfrange
+
+100 beginbfrange
+<5BE8> <5BE8> <F3F3>
+<5BE9> <5BE9> <E3FB>
+<5BEB> <5BEB> <DED0>
+<5BEC> <5BEC> <CEB0>
+<5BEE> <5BEE> <D6F7>
+<5BEF> <5BEF> <F1D9>
+<5BF5> <5BF5> <F5C1>
+<5BF6> <5BF6> <DCC4>
+<5BF8> <5BF8> <F5BB>
+<5BFA> <5BFA> <DED1>
+<5C01> <5C01> <DCE6>
+<5C04> <5C04> <DED2>
+<5C07> <5C07> <EDE2>
+<5C08> <5C08> <EEF6>
+<5C09> <5C09> <EACF>
+<5C0A> <5C0A> <F0EE>
+<5C0B> <5C0B> <E3FC>
+<5C0D> <5C0D> <D3DF>
+<5C0E> <5C0E> <D3F4>
+<5C0F> <5C0F> <E1B3>
+<5C11> <5C11> <E1B4>
+<5C16> <5C16> <F4D3>
+<5C19> <5C19> <DFC6>
+<5C24> <5C24> <E9D6>
+<5C28> <5C28> <DBAB>
+<5C31> <5C31> <F6A6>
+<5C38> <5C38> <E3B9>
+<5C39> <5C39> <EBC5>
+<5C3A> <5C3A> <F4A9>
+<5C3B> <5C3B> <CDB6>
+<5C3C> <5C3C> <D2F9>
+<5C3E> <5C3E> <DAAD>
+<5C3F> <5C3F> <D2E3>
+<5C40> <5C40> <CFD1>
+<5C45> <5C45> <CBDC>
+<5C46> <5C46> <CCFA>
+<5C48> <5C48> <CFDD>
+<5C4B> <5C4B> <E8A9>
+<5C4D> <5C4D> <E3BB>
+<5C4E> <5C4E> <E3BA>
+<5C51> <5C51> <E0DA>
+<5C55> <5C55> <EEF7>
+<5C5B> <5C5B> <DCB3>
+<5C60> <5C60> <D3F5>
+<5C62> <5C62> <D7A6>
+<5C64> <5C64> <F6B5>
+<5C65> <5C65> <D7DB>
+<5C6C> <5C6C> <E1D5>
+<5C6F> <5C6F> <D4EA>
+<5C71> <5C71> <DFA3>
+<5C79> <5C79> <FDDF>
+<5C90> <5C90> <D0F7>
+<5C91> <5C91> <EDD4>
+<5CA1> <5CA1> <CBAA>
+<5CA9> <5CA9> <E4DB>
+<5CAB> <5CAB> <E1FB>
+<5CAC> <5CAC> <CBA2>
+<5CB1> <5CB1> <D3E0>
+<5CB3> <5CB3> <E4BF>
+<5CB5> <5CB5> <FBC0>
+<5CB7> <5CB7> <DABE>
+<5CB8> <5CB8> <E4CD>
+<5CBA> <5CBA> <D6B9>
+<5CBE> <5CBE> <EFC0>
+<5CC0> <5CC0> <E1FC>
+<5CD9> <5CD9> <F6B9>
+<5CE0> <5CE0> <DFC7>
+<5CE8> <5CE8> <E4B1>
+<5CEF> <5CF0> <DCE7>
+<5CF4> <5CF4> <FAD6>
+<5CF6> <5CF6> <D3F6>
+<5CFB> <5CFB> <F1DA>
+<5CFD> <5CFD> <FAF2>
+<5D07> <5D07> <E2FD>
+<5D0D> <5D0D> <D5CF>
+<5D0E> <5D0E> <D0F8>
+<5D11> <5D11> <CDDF>
+<5D14> <5D14> <F5CB>
+<5D16> <5D16> <E4F0>
+<5D17> <5D17> <CBAB>
+<5D19> <5D19> <D7C4>
+<5D27> <5D27> <E2FE>
+<5D29> <5D29> <DDDA>
+<5D4B> <5D4B> <DAAE>
+<5D4C> <5D4C> <CAEE>
+<5D50> <5D50> <D5B9>
+<5D69> <5D69> <E3A1>
+<5D6C> <5D6C> <E8E3>
+<5D6F> <5D6F> <F3AB>
+<5D87> <5D87> <CFA9>
+<5D8B> <5D8B> <D3F7>
+<5D9D> <5D9D> <D4F1>
+<5DA0> <5DA0> <CEE4>
+<5DA2> <5DA2> <E8F2>
+<5DAA> <5DAA> <E5F5>
+<5DB8> <5DB8> <E7AE>
+<5DBA> <5DBA> <D6BA>
+<5DBC> <5DBC> <DFEC>
+<5DBD> <5DBD> <E4C0>
+<5DCD> <5DCD> <E8E4>
+endbfrange
+
+100 beginbfrange
+<5DD2> <5DD2> <D8B5>
+<5DD6> <5DD6> <E4DC>
+<5DDD> <5DDD> <F4B9>
+<5DDE> <5DDE> <F1B6>
+<5DE1> <5DE1> <E2DE>
+<5DE2> <5DE2> <E1B5>
+<5DE5> <5DE5> <CDEF>
+<5DE6> <5DE6> <F1A7>
+<5DE7> <5DE7> <CEE5>
+<5DE8> <5DE8> <CBDD>
+<5DEB> <5DEB> <D9E3>
+<5DEE> <5DEE> <F3AC>
+<5DF1> <5DF1> <D0F9>
+<5DF2> <5DF2> <ECAB>
+<5DF3> <5DF3> <DED3>
+<5DF4> <5DF4> <F7E9>
+<5DF7> <5DF7> <F9F5>
+<5DFD> <5DFD> <E1DE>
+<5DFE> <5DFE> <CBEE>
+<5E02> <5E02> <E3BC>
+<5E03> <5E03> <F8D6>
+<5E06> <5E06> <DBEE>
+<5E0C> <5E0C> <FDF1>
+<5E11> <5E11> <F7B6>
+<5E16> <5E16> <F4DE>
+<5E19> <5E19> <F2ED>
+<5E1B> <5E1B> <DBD9>
+<5E1D> <5E1D> <F0A8>
+<5E25> <5E25> <E1FD>
+<5E2B> <5E2B> <DED4>
+<5E2D> <5E2D> <E0AC>
+<5E33> <5E33> <EDE3>
+<5E36> <5E36> <D3E1>
+<5E38> <5E38> <DFC8>
+<5E3D> <5E3D> <D9B6>
+<5E3F> <5E3F> <FDAC>
+<5E40> <5E40> <EFD3>
+<5E44> <5E44> <E4C1>
+<5E45> <5E45> <F8EB>
+<5E47> <5E47> <DBAC>
+<5E4C> <5E4C> <FCC6>
+<5E55> <5E55> <D8AD>
+<5E5F> <5E5F> <F6BA>
+<5E61> <5E61> <DBDF>
+<5E62> <5E62> <D3D3>
+<5E63> <5E63> <F8C7>
+<5E72> <5E72> <CACE>
+<5E73> <5E73> <F8C1>
+<5E74> <5E74> <D2B4>
+<5E77> <5E77> <DCB4>
+<5E78> <5E78> <FAB9>
+<5E79> <5E79> <CACF>
+<5E7B> <5E7B> <FCB3>
+<5E7C> <5E7D> <EAEA>
+<5E7E> <5E7E> <D0FA>
+<5E84> <5E84> <EDE4>
+<5E87> <5E87> <DDE7>
+<5E8A> <5E8A> <DFC9>
+<5E8F> <5E8F> <DFED>
+<5E95> <5E95> <EEBC>
+<5E97> <5E97> <EFC1>
+<5E9A> <5E9A> <CCD2>
+<5E9C> <5E9C> <DDA4>
+<5EA0> <5EA0> <DFCA>
+<5EA6> <5EA6> <D3F8>
+<5EA7> <5EA7> <F1A8>
+<5EAB> <5EAB> <CDB7>
+<5EAD> <5EAD> <EFD4>
+<5EB5> <5EB5> <E4DD>
+<5EB6> <5EB6> <DFEE>
+<5EB7> <5EB7> <CBAC>
+<5EB8> <5EB8> <E9BC>
+<5EBE> <5EBE> <EAEC>
+<5EC2> <5EC2> <DFCB>
+<5EC8> <5EC8> <F9BF>
+<5EC9> <5EC9> <D6AF>
+<5ECA> <5ECA> <D5C6>
+<5ED0> <5ED0> <CFAA>
+<5ED3> <5ED3> <CEA9>
+<5ED6> <5ED6> <D6F8>
+<5EDA> <5EDA> <F1B7>
+<5EDB> <5EDB> <EEF8>
+<5EDF> <5EDF> <D9D9>
+<5EE0> <5EE0> <F3DF>
+<5EE2> <5EE2> <F8C8>
+<5EE3> <5EE3> <CEC6>
+<5EEC> <5EEC> <D5E6>
+<5EF3> <5EF3> <F4E6>
+<5EF6> <5EF6> <E6C5>
+<5EF7> <5EF7> <EFD5>
+<5EFA> <5EFA> <CBEF>
+<5EFB> <5EFB> <FCDF>
+<5F01> <5F01> <DCA7>
+<5F04> <5F04> <D6E7>
+<5F0A> <5F0A> <F8C9>
+<5F0F> <5F0F> <E3D2>
+<5F11> <5F11> <E3BD>
+<5F13> <5F13> <CFE1>
+<5F14> <5F14> <F0C0>
+<5F15> <5F15> <ECDA>
+endbfrange
+
+100 beginbfrange
+<5F17> <5F17> <DDD7>
+<5F18> <5F18> <FBF0>
+<5F1B> <5F1B> <ECAC>
+<5F1F> <5F1F> <F0A9>
+<5F26> <5F26> <FAD7>
+<5F27> <5F27> <FBC1>
+<5F29> <5F29> <D2C0>
+<5F31> <5F31> <E5B0>
+<5F35> <5F35> <EDE5>
+<5F3A> <5F3A> <CBAD>
+<5F3C> <5F3C> <F9B0>
+<5F48> <5F48> <F7A5>
+<5F4A> <5F4A> <CBAE>
+<5F4C> <5F4C> <DAAF>
+<5F4E> <5F4E> <D8B6>
+<5F56> <5F56> <D3A7>
+<5F57> <5F57> <FBB2>
+<5F59> <5F59> <FDC4>
+<5F5B> <5F5B> <ECAD>
+<5F62> <5F62> <FBA1>
+<5F66> <5F66> <E5E9>
+<5F67> <5F67> <E9EE>
+<5F69> <5F69> <F3F4>
+<5F6A> <5F6A> <F8F3>
+<5F6B> <5F6B> <F0C1>
+<5F6C> <5F6C> <DEAF>
+<5F6D> <5F6D> <F8B0>
+<5F70> <5F70> <F3E0>
+<5F71> <5F71> <E7AF>
+<5F77> <5F77> <DBAD>
+<5F79> <5F79> <E6B5>
+<5F7C> <5F7C> <F9A8>
+<5F7F> <5F7F> <DDD8>
+<5F80> <5F80> <E8D9>
+<5F81> <5F81> <EFD6>
+<5F85> <5F85> <D3E2>
+<5F87> <5F87> <E2DF>
+<5F8A> <5F8A> <FCE0>
+<5F8B> <5F8B> <D7C8>
+<5F8C> <5F8C> <FDAD>
+<5F90> <5F90> <DFEF>
+<5F91> <5F91> <CCD3>
+<5F92> <5F92> <D3F9>
+<5F97> <5F97> <D4F0>
+<5F98> <5F98> <DBC7>
+<5F99> <5F99> <DED5>
+<5F9E> <5F9E> <F0F4>
+<5FA0> <5FA0> <D5D0>
+<5FA1> <5FA1> <E5D9>
+<5FA8> <5FA8> <FCC7>
+<5FA9> <5FA9> <DCD6>
+<5FAA> <5FAA> <E2E0>
+<5FAE> <5FAE> <DAB0>
+<5FB5> <5FB5> <F3A3>
+<5FB7> <5FB7> <D3EC>
+<5FB9> <5FB9> <F4CB>
+<5FBD> <5FBD> <FDC5>
+<5FC3> <5FC3> <E3FD>
+<5FC5> <5FC5> <F9B1>
+<5FCC> <5FCC> <D0FB>
+<5FCD> <5FCD> <ECDB>
+<5FD6> <5FD6> <F5BC>
+<5FD7> <5FD7> <F2A4>
+<5FD8> <5FD9> <D8CE>
+<5FE0> <5FE0> <F5F7>
+<5FEB> <5FEB> <F6E1>
+<5FF5> <5FF5> <D2B7>
+<5FFD> <5FFD> <FBEC>
+<5FFF> <5FFF> <DDC8>
+<600F> <600F> <E4E8>
+<6012> <6012> <D2C1>
+<6016> <6016> <F8D7>
+<601C> <601C> <D6BB>
+<601D> <601D> <DED6>
+<6020> <6020> <F7BD>
+<6021> <6021> <ECAE>
+<6025> <6025> <D0E1>
+<6027> <6027> <E0F5>
+<6028> <6028> <EAB3>
+<602A> <602A> <CED6>
+<602F> <602F> <CCA5>
+<6041> <6041> <ECF6>
+<6042> <6042> <E2E1>
+<6043> <6043> <E3BE>
+<604D> <604D> <FCC8>
+<6050> <6050> <CDF0>
+<6052> <6052> <F9F6>
+<6055> <6055> <DFF0>
+<6059> <6059> <E5BF>
+<605D> <605D> <CEBF>
+<6062> <6062> <FCE1>
+<6063> <6063> <EDB0>
+<6064> <6064> <FDD1>
+<6065> <6065> <F6BB>
+<6068> <6068> <F9CF>
+<6069> <6069> <EBDA>
+<606A> <606A> <CAC1>
+<606C> <606C> <D2B8>
+<606D> <606D> <CDF1>
+<606F> <606F> <E3D3>
+endbfrange
+
+100 beginbfrange
+<6070> <6070> <FDE6>
+<6085> <6085> <E6ED>
+<6089> <6089> <E3FA>
+<608C> <608C> <F0AA>
+<608D> <608D> <F9D0>
+<6094> <6094> <FCE2>
+<6096> <6096> <F8A7>
+<609A> <609A> <E1E5>
+<609B> <609B> <EEF9>
+<609F> <609F> <E7F6>
+<60A0> <60A0> <EAED>
+<60A3> <60A3> <FCB4>
+<60A4> <60A4> <F5C2>
+<60A7> <60A7> <D7DC>
+<60B0> <60B0> <F0F5>
+<60B2> <60B2> <DDE8>
+<60B3> <60B3> <D3ED>
+<60B4> <60B4> <F5FC>
+<60B6> <60B6> <DABF>
+<60B8> <60B8> <CCFB>
+<60BC> <60BC> <D3FA>
+<60BD> <60BD> <F4A4>
+<60C5> <60C5> <EFD7>
+<60C7> <60C7> <D4C3>
+<60D1> <60D1> <FBE3>
+<60DA> <60DA> <FBED>
+<60DC> <60DC> <E0AD>
+<60DF> <60DF> <EAEE>
+<60E0> <60E0> <FBB3>
+<60E1> <60E1> <E4C2>
+<60F0> <60F0> <F6E7>
+<60F1> <60F1> <D2DD>
+<60F3> <60F3> <DFCC>
+<60F6> <60F6> <FCC9>
+<60F9> <60F9> <E5A9>
+<60FA> <60FA> <E0F6>
+<60FB> <60FB> <F6B3>
+<6101> <6101> <E1FE>
+<6106> <6106> <CBF0>
+<6108> <6109> <EAEF>
+<610D> <610D> <DAC0>
+<610E> <610E> <F8B4>
+<610F> <610F> <EBF2>
+<6115> <6115> <E4C3>
+<611A> <611A> <E9D7>
+<611B> <611B> <E4F1>
+<611F> <611F> <CAEF>
+<6127> <6127> <CED7>
+<6130> <6130> <FCCA>
+<6134> <6134> <F3E1>
+<6137> <6137> <CBC4>
+<613C> <613C> <E3E5>
+<613E> <613E> <CBC5>
+<613F> <613F> <EAB4>
+<6142> <6142> <E9BD>
+<6144> <6144> <D7C9>
+<6147> <6147> <EBDB>
+<6148> <6148> <EDB1>
+<614A> <614A> <CCC3>
+<614B> <614B> <F7BE>
+<614C> <614C> <FCCB>
+<6153> <6153> <F8F4>
+<6155> <6155> <D9B7>
+<6158> <6159> <F3D3>
+<615D> <615D> <F7E4>
+<615F> <615F> <F7D1>
+<6162> <6162> <D8B7>
+<6163> <6163> <CEB1>
+<6164> <6164> <CAC2>
+<6167> <6167> <FBB4>
+<6168> <6168> <CBC6>
+<616B> <616B> <F0F6>
+<616E> <616E> <D5E7>
+<6170> <6170> <EAD0>
+<6176> <6176> <CCD4>
+<6177> <6177> <CBAF>
+<617D> <617D> <F4AA>
+<617E> <617E> <E9AF>
+<6181> <6181> <F5C3>
+<6182> <6182> <E9D8>
+<618A> <618A> <DDE9>
+<618E> <618E> <F1F3>
+<6190> <6190> <D5FB>
+<6191> <6191> <DEBB>
+<6194> <6194> <F4FB>
+<6198> <6198> <FDF3>
+<6199> <6199> <FDF2>
+<619A> <619A> <F7A6>
+<61A4> <61A4> <DDC9>
+<61A7> <61A7> <D4D3>
+<61A9> <61A9> <CCA8>
+<61AB> <61AB> <DAC1>
+<61AC> <61AC> <CCD5>
+<61AE> <61AE> <D9E4>
+<61B2> <61B2> <FACA>
+<61B6> <61B6> <E5E3>
+<61BA> <61BA> <D3BC>
+<61BE> <61BE> <CAF0>
+<61C3> <61C3> <D0C4>
+<61C7> <61C7> <CAD0>
+endbfrange
+
+100 beginbfrange
+<61C8> <61C8> <FAAB>
+<61C9> <61C9> <EBEB>
+<61CA> <61CA> <E7F8>
+<61CB> <61CB> <D9E5>
+<61E6> <61E6> <D1D7>
+<61F2> <61F2> <F3A4>
+<61F6> <61F6> <D4FB>
+<61F7> <61F7> <FCE3>
+<61F8> <61F8> <FAD8>
+<61FA> <61FA> <F3D5>
+<61FC> <61FC> <CFAB>
+<61FF> <61FF> <EBF3>
+<6200> <6200> <D5FC>
+<6207> <6207> <D3D4>
+<6208> <6208> <CDFC>
+<620A> <620A> <D9E6>
+<620C> <620C> <E2F9>
+<620D> <620D> <E2A1>
+<620E> <620E> <EBD4>
+<6210> <6210> <E0F7>
+<6211> <6211> <E4B2>
+<6212> <6212> <CCFC>
+<6216> <6216> <FBE4>
+<621A> <621A> <F4AB>
+<621F> <621F> <D0BD>
+<6221> <6221> <CAF1>
+<622A> <622A> <EFB8>
+<622E> <622E> <D7C0>
+<6230> <6230> <EEFA>
+<6231> <6231> <FDF4>
+<6234> <6234> <D3E3>
+<6236> <6236> <FBC2>
+<623E> <623E> <D5E8>
+<623F> <623F> <DBAE>
+<6240> <6240> <E1B6>
+<6241> <6241> <F8B7>
+<6247> <6247> <E0BF>
+<6248> <6248> <FBC3>
+<6249> <6249> <DDEA>
+<624B> <624B> <E2A2>
+<624D> <624D> <EEA6>
+<6253> <6253> <F6E8>
+<6258> <6258> <F6F5>
+<626E> <626E> <DDCA>
+<6271> <6271> <D0E2>
+<6276> <6276> <DDA6>
+<6279> <6279> <DDEB>
+<627C> <627C> <E4F9>
+<627F> <627F> <E3AF>
+<6280> <6280> <D0FC>
+<6284> <6284> <F4FC>
+<6289> <6289> <CCBC>
+<628A> <628A> <F7EA>
+<6291> <6291> <E5E4>
+<6292> <6292> <DFF1>
+<6295> <6295> <F7E1>
+<6297> <6297> <F9F7>
+<6298> <6298> <EFB9>
+<629B> <629B> <F8D8>
+<62AB> <62AB> <F9A9>
+<62B1> <62B1> <F8D9>
+<62B5> <62B5> <EEBD>
+<62B9> <62B9> <D8C6>
+<62BC> <62BC> <E4E3>
+<62BD> <62BD> <F5CE>
+<62C2> <62C2> <DDD9>
+<62C7> <62C7> <D9E7>
+<62C8> <62C8> <D2B9>
+<62C9> <62C9> <D5C3>
+<62CC> <62CC> <DAE5>
+<62CD> <62CD> <DAD0>
+<62CF> <62CF> <D1D9>
+<62D0> <62D0> <CED8>
+<62D2> <62D2> <CBDE>
+<62D3> <62D3> <F4AC>
+<62D4> <62D4> <DAFB>
+<62D6> <62D6> <F6E9>
+<62D7> <62D7> <E8F3>
+<62D8> <62D8> <CFAC>
+<62D9> <62D9> <F0F0>
+<62DB> <62DB> <F4FD>
+<62DC> <62DC> <DBC8>
+<62EC> <62EC> <CEC0>
+<62ED> <62ED> <E3D4>
+<62EE> <62EE> <D1CF>
+<62EF> <62EF> <F1F5>
+<62F1> <62F1> <CDF2>
+<62F3> <62F3> <CFEB>
+<62F7> <62F7> <CDB8>
+<62FE> <62FE> <E3A6>
+<62FF> <62FF> <D1DA>
+<6301> <6301> <F2A5>
+<6307> <6307> <F2A6>
+<6309> <6309> <E4CE>
+<6311> <6311> <D3FB>
+<632B> <632B> <F1A9>
+<632F> <632F> <F2C9>
+<633A> <633A> <EFD8>
+<633B> <633B> <E6C9>
+<633D> <633D> <D8B8>
+endbfrange
+
+100 beginbfrange
+<633E> <633E> <FAF3>
+<6349> <6349> <F3B5>
+<634C> <634C> <F8A4>
+<634F> <634F> <D1F3>
+<6350> <6350> <E6C8>
+<6355> <6355> <F8DA>
+<6367> <6367> <DCE9>
+<6368> <6368> <DED7>
+<636E> <636E> <CBDF>
+<6372> <6372> <CFEC>
+<6377> <6377> <F4DF>
+<637A> <637A> <D1F4>
+<637B> <637B> <D2BA>
+<637F> <637F> <DFF2>
+<6383> <6383> <E1B7>
+<6388> <6388> <E2A3>
+<6389> <6389> <D3FC>
+<638C> <638C> <EDE6>
+<6392> <6392> <DBC9>
+<6396> <6396> <E4FA>
+<6398> <6398> <CFDE>
+<639B> <639B> <CED0>
+<63A0> <63A0> <D5D3>
+<63A1> <63A1> <F3F5>
+<63A2> <63A2> <F7AE>
+<63A5> <63A5> <EFC8>
+<63A7> <63A7> <CDF3>
+<63A8> <63A8> <F5CF>
+<63A9> <63A9> <E5F3>
+<63AA> <63AA> <F0C2>
+<63C0> <63C0> <CAD1>
+<63C4> <63C4> <EAF1>
+<63C6> <63C6> <D0A6>
+<63CF> <63CF> <D9DA>
+<63D0> <63D0> <F0AB>
+<63D6> <63D6> <EBE7>
+<63DA> <63DA> <E5C0>
+<63DB> <63DB> <FCB5>
+<63E1> <63E1> <E4C4>
+<63ED> <63ED> <CCA9>
+<63EE> <63EE> <FDC6>
+<63F4> <63F4> <EAB5>
+<63F6> <63F6> <E5AA>
+<63F7> <63F7> <DFBA>
+<640D> <640D> <E1DF>
+<640F> <640F> <DAD1>
+<6414> <6414> <E1B8>
+<6416> <6416> <E8F4>
+<6417> <6417> <D3FD>
+<641C> <641C> <E2A4>
+<6422> <6422> <F2CA>
+<642C> <642C> <DAE6>
+<642D> <642D> <F7B3>
+<643A> <643A> <FDCD>
+<643E> <643E> <F3B6>
+<6458> <6458> <EED7>
+<6460> <6460> <F5C4>
+<6469> <6469> <D8A4>
+<646F> <646F> <F2A7>
+<6478> <6479> <D9B8>
+<647A> <647A> <EFC9>
+<6488> <6488> <D6CE>
+<6491> <6491> <F7CB>
+<6492> <6492> <DFAE>
+<6493> <6493> <E8F5>
+<649A> <649A> <D2B5>
+<649E> <649E> <D3D5>
+<64A4> <64A4> <F4CC>
+<64A5> <64A5> <DAFC>
+<64AB> <64AB> <D9E8>
+<64AD> <64AD> <F7EB>
+<64AE> <64AE> <F5C9>
+<64B0> <64B0> <F3BC>
+<64B2> <64B2> <DAD2>
+<64BB> <64BB> <D3B5>
+<64C1> <64C1> <E8B6>
+<64C4> <64C4> <D6CF>
+<64C5> <64C5> <F4BA>
+<64C7> <64C7> <F7C9>
+<64CA> <64CA> <CCAA>
+<64CD> <64CD> <F0C3>
+<64CE> <64CE> <CCD6>
+<64D2> <64D2> <D0D3>
+<64D4> <64D4> <D3BD>
+<64D8> <64D8> <DBFB>
+<64DA> <64DA> <CBE0>
+<64E1> <64E1> <D3E4>
+<64E2> <64E2> <F6F7>
+<64E5> <64E5> <D5BA>
+<64E6> <64E6> <F3CD>
+<64E7> <64E7> <CBE1>
+<64EC> <64EC> <EBF4>
+<64F2> <64F2> <F4AD>
+<64F4> <64F4> <FCAA>
+<64FA> <64FA> <F7EC>
+<64FE> <64FE> <E8F6>
+<6500> <6500> <DAE7>
+<6504> <6504> <F7CC>
+<6518> <6518> <E5C1>
+<651D> <651D> <E0EE>
+endbfrange
+
+100 beginbfrange
+<6523> <6523> <D5FD>
+<652A> <652A> <CEE6>
+<652B> <652B> <FCAB>
+<652C> <652C> <D5BB>
+<652F> <652F> <F2A8>
+<6536> <6536> <E2A5>
+<6537> <6537> <CDB9>
+<6538> <6538> <EAF2>
+<6539> <6539> <CBC7>
+<653B> <653B> <CDF4>
+<653E> <653E> <DBAF>
+<653F> <653F> <EFD9>
+<6545> <6545> <CDBA>
+<6548> <6548> <FCF9>
+<654D> <654D> <DFF3>
+<654E> <654E> <CEE7>
+<654F> <654F> <DAC2>
+<6551> <6551> <CFAD>
+<6556> <6556> <E7F9>
+<6557> <6557> <F8A8>
+<655E> <655E> <F3E2>
+<6562> <6562> <CAF2>
+<6563> <6563> <DFA4>
+<6566> <6566> <D4C4>
+<656C> <656C> <CCD7>
+<656D> <656D> <E5C2>
+<6572> <6572> <CDBB>
+<6574> <6574> <EFDA>
+<6575> <6575> <EED8>
+<6577> <6577> <DDA7>
+<6578> <6578> <E2A6>
+<657E> <657E> <E0C0>
+<6582> <6582> <D6B0>
+<6583> <6583> <F8CA>
+<6585> <6585> <FCFA>
+<6587> <6587> <D9FE>
+<658C> <658C> <DEB0>
+<6590> <6590> <DDEC>
+<6591> <6591> <DAE8>
+<6597> <6597> <D4E0>
+<6599> <6599> <D6F9>
+<659B> <659B> <CDD7>
+<659C> <659C> <DED8>
+<659F> <659F> <F2F8>
+<65A1> <65A1> <E4D6>
+<65A4> <65A4> <D0C5>
+<65A5> <65A5> <F4AE>
+<65A7> <65A7> <DDA8>
+<65AB> <65AB> <EDC5>
+<65AC> <65AC> <F3D6>
+<65AF> <65AF> <DED9>
+<65B0> <65B0> <E3E6>
+<65B7> <65B7> <D3A8>
+<65B9> <65B9> <DBB0>
+<65BC> <65BC> <E5DA>
+<65BD> <65BD> <E3BF>
+<65C1> <65C1> <DBB1>
+<65C5> <65C5> <D5E9>
+<65CB> <65CB> <E0C1>
+<65CC> <65CC> <EFDB>
+<65CF> <65CF> <F0E9>
+<65D2> <65D2> <D7B2>
+<65D7> <65D7> <D0FD>
+<65E0> <65E0> <D9E9>
+<65E3> <65E3> <D0FE>
+<65E5> <65E5> <ECED>
+<65E6> <65E6> <D3A9>
+<65E8> <65E8> <F2A9>
+<65E9> <65E9> <F0C4>
+<65EC> <65EC> <E2E2>
+<65ED> <65ED> <E9EF>
+<65F1> <65F1> <F9D1>
+<65F4> <65F4> <E9D9>
+<65FA> <65FA> <E8DA>
+<65FB> <65FC> <DAC3>
+<65FD> <65FD> <D4C5>
+<65FF> <65FF> <E7FA>
+<6606> <6606> <CDE0>
+<6607> <6607> <E3B0>
+<6609> <6609> <DBB2>
+<660A> <660A> <FBC4>
+<660C> <660C> <F3E3>
+<660E> <660E> <D9A5>
+<660F> <660F> <FBE7>
+<6610> <6610> <DDCB>
+<6611> <6611> <D0D4>
+<6613> <6613> <E6B6>
+<6614> <6614> <E0AE>
+<6615> <6615> <FDDA>
+<661E> <661E> <DCB5>
+<661F> <661F> <E0F8>
+<6620> <6620> <E7B1>
+<6625> <6625> <F5F0>
+<6627> <6627> <D8DC>
+<6628> <6628> <EDC6>
+<662D> <662D> <E1B9>
+<662F> <662F> <E3C0>
+<6630> <6630> <F9C0>
+<6631> <6631> <E9F0>
+<6634> <6634> <D9DB>
+endbfrange
+
+100 beginbfrange
+<6636> <6636> <F3E4>
+<663A> <663A> <DCB6>
+<663B> <663B> <E4E9>
+<6641> <6641> <F0C5>
+<6642> <6642> <E3C1>
+<6643> <6644> <FCCC>
+<6649> <6649> <F2CB>
+<664B> <664B> <F2CC>
+<664F> <664F> <E4CF>
+<6659> <6659> <F1DB>
+<665B> <665B> <FAD9>
+<665D> <665D> <F1B8>
+<665E> <665E> <FDF5>
+<665F> <665F> <E0F9>
+<6664> <6664> <E7FB>
+<6665> <6665> <FCB7>
+<6666> <6666> <FCE4>
+<6667> <6667> <FBC5>
+<6668> <6668> <E3E7>
+<6669> <6669> <D8B9>
+<666B> <666B> <F6F8>
+<666E> <666E> <DCC5>
+<666F> <666F> <CCD8>
+<6673> <6673> <E0AF>
+<6674> <6674> <F4E7>
+<6676> <6676> <EFDC>
+<6677> <6677> <CFFC>
+<6678> <6678> <EFDD>
+<667A> <667A> <F2AA>
+<6684> <6684> <FDBE>
+<6687> <6687> <CAAC>
+<6688> <6688> <FDBB>
+<6689> <6689> <FDC7>
+<668E> <668E> <E7B2>
+<6690> <6690> <EAD1>
+<6691> <6691> <DFF4>
+<6696> <6696> <D1EC>
+<6697> <6697> <E4DE>
+<6698> <6698> <E5C3>
+<669D> <669D> <D9A6>
+<66A0> <66A0> <CDBC>
+<66A2> <66A2> <F3E5>
+<66AB> <66AB> <EDD5>
+<66AE> <66AE> <D9BA>
+<66B2> <66B2> <EDE7>
+<66B3> <66B3> <FBB5>
+<66B4> <66B4> <F8EC>
+<66B9> <66B9> <E0E7>
+<66BB> <66BB> <CCD9>
+<66BE> <66BE> <D4C6>
+<66C4> <66C4> <E7A5>
+<66C6> <66C6> <D5F5>
+<66C7> <66C7> <D3BE>
+<66C9> <66C9> <FCFB>
+<66D6> <66D6> <E4F2>
+<66D9> <66D9> <DFF5>
+<66DC> <66DC> <E8F8>
+<66DD> <66DD> <F8ED>
+<66E0> <66E0> <CEC7>
+<66E6> <66E6> <FDF6>
+<66F0> <66F0> <E8D8>
+<66F2> <66F2> <CDD8>
+<66F3> <66F3> <E7D6>
+<66F4> <66F4> <CCDA>
+<66F7> <66F7> <CAE3>
+<66F8> <66F8> <DFF6>
+<66F9> <66F9> <F0C7>
+<66FA> <66FA> <F0C6>
+<66FC> <66FC> <D8BA>
+<66FE> <66FE> <F1F4>
+<66FF> <66FF> <F4F0>
+<6700> <6700> <F5CC>
+<6703> <6703> <FCE5>
+<6708> <6708> <EAC5>
+<6709> <6709> <EAF3>
+<670B> <670B> <DDDB>
+<670D> <670D> <DCD7>
+<6714> <6714> <DEFD>
+<6715> <6715> <F2F9>
+<6717> <6717> <D5C7>
+<671B> <671B> <D8D0>
+<671D> <671D> <F0C8>
+<671E> <671F> <D1A1>
+<6726> <6726> <D9D4>
+<6727> <6727> <D6E8>
+<6728> <6728> <D9CA>
+<672A> <672A> <DAB1>
+<672B> <672B> <D8C7>
+<672C> <672C> <DCE2>
+<672D> <672D> <F3CE>
+<672E> <672E> <F5F4>
+<6731> <6731> <F1B9>
+<6734> <6734> <DAD3>
+<6736> <6736> <F6EA>
+<673A> <673A> <CFF5>
+<673D> <673D> <FDAE>
+<6746> <6746> <CAD2>
+<6749> <6749> <DFB4>
+<674E> <674E> <D7DD>
+<674F> <674F> <FABA>
+endbfrange
+
+100 beginbfrange
+<6750> <6750> <EEA7>
+<6751> <6751> <F5BD>
+<6753> <6753> <F8F5>
+<6756> <6756> <EDE8>
+<675C> <675C> <D4E1>
+<675E> <675E> <D1A3>
+<675F> <675F> <E1D6>
+<676D> <676D> <F9F8>
+<676F> <676F> <DBCA>
+<6770> <6770> <CBF9>
+<6771> <6771> <D4D4>
+<6773> <6773> <D9DC>
+<6775> <6775> <EEBE>
+<6777> <6777> <F7ED>
+<677B> <677B> <D2EE>
+<677E> <677E> <E1E6>
+<677F> <677F> <F7F9>
+<6787> <6787> <DDED>
+<6789> <6789> <E8DB>
+<678B> <678B> <DBB3>
+<678F> <678F> <D1F7>
+<6790> <6790> <E0B0>
+<6793> <6793> <D4E2>
+<6795> <6795> <F6D7>
+<6797> <6797> <D7F9>
+<679A> <679A> <D8DD>
+<679C> <679C> <CDFD>
+<679D> <679D> <F2AB>
+<67AF> <67AF> <CDBD>
+<67B0> <67B0> <F8C2>
+<67B3> <67B3> <F2AC>
+<67B6> <67B7> <CAAD>
+<67B8> <67B8> <CFAE>
+<67BE> <67BE> <E3C2>
+<67C4> <67C4> <DCB7>
+<67CF> <67CF> <DBDA>
+<67D0> <67D0> <D9BB>
+<67D1> <67D1> <CAF3>
+<67D2> <67D2> <F6D3>
+<67D3> <67D3> <E6F8>
+<67D4> <67D4> <EAF5>
+<67DA> <67DA> <EAF6>
+<67DD> <67DD> <F6F9>
+<67E9> <67E9> <CFAF>
+<67EC> <67EC> <CAD3>
+<67EF> <67EF> <CAAF>
+<67F0> <67F0> <D2B0>
+<67F1> <67F1> <F1BA>
+<67F3> <67F3> <D7B3>
+<67F4> <67F4> <E3C3>
+<67F5> <67F5> <F3FD>
+<67F6> <67F6> <DEDA>
+<67FB> <67FB> <DEDB>
+<67FE> <67FE> <EFDE>
+<6812> <6812> <E2E3>
+<6813> <6813> <EEFB>
+<6816> <6816> <DFF7>
+<6817> <6817> <D7CA>
+<6821> <6821> <CEE8>
+<6822> <6822> <DBDB>
+<682A> <682A> <F1BB>
+<682F> <682F> <E9F1>
+<6838> <6838> <FAB7>
+<6839> <6839> <D0C6>
+<683C> <683C> <CCAB>
+<683D> <683D> <EEA8>
+<6840> <6840> <CBFA>
+<6841> <6841> <F9F9>
+<6842> <6842> <CCFD>
+<6843> <6843> <D3FE>
+<6848> <6848> <E4D0>
+<684E> <684E> <F2EE>
+<6850> <6850> <D4D5>
+<6851> <6851> <DFCD>
+<6853> <6853> <FCB8>
+<6854> <6854> <D1D0>
+<686D> <686D> <F2CD>
+<6876> <6876> <F7D2>
+<687F> <687F> <CAD4>
+<6881> <6881> <D5D9>
+<6885> <6885> <D8DE>
+<688F> <688F> <CDD9>
+<6893> <6893> <EEA9>
+<6894> <6894> <F6BC>
+<6897> <6897> <CCDB>
+<689D> <689D> <F0C9>
+<689F> <689F> <FCFC>
+<68A1> <68A1> <E8C9>
+<68A2> <68A2> <F4FE>
+<68A7> <68A7> <E7FC>
+<68A8> <68A8> <D7DE>
+<68AD> <68AD> <DEDC>
+<68AF> <68AF> <F0AC>
+<68B0> <68B0> <CCFE>
+<68B1> <68B1> <CDE1>
+<68B3> <68B3> <E1BA>
+<68B5> <68B5> <DBEF>
+<68B6> <68B6> <DAB2>
+<68C4> <68C4> <D1A5>
+<68C5> <68C5> <DCB8>
+endbfrange
+
+100 beginbfrange
+<68C9> <68C9> <D8F6>
+<68CB> <68CB> <D1A4>
+<68CD> <68CD> <CDE2>
+<68D2> <68D2> <DCEA>
+<68D5> <68D5> <F0F7>
+<68D7> <68D7> <F0CA>
+<68D8> <68D8> <D0BE>
+<68DA> <68DA> <DDDC>
+<68DF> <68DF> <D4D6>
+<68E0> <68E0> <D3D6>
+<68E7> <68E7> <EDD0>
+<68E8> <68E8> <CDA1>
+<68EE> <68EE> <DFB5>
+<68F2> <68F2> <DFF8>
+<68F9> <68F9> <D4A1>
+<68FA> <68FA> <CEB2>
+<6900> <6900> <E8CA>
+<6905> <6905> <EBF5>
+<690D> <690D> <E3D5>
+<690E> <690E> <F5D0>
+<6912> <6912> <F5A1>
+<6927> <6927> <D9A7>
+<6930> <6930> <E5AB>
+<693D> <693D> <E6CB>
+<693F> <693F> <F5F1>
+<694A> <694A> <E5C5>
+<6953> <6953> <F9A3>
+<6954> <6954> <E0DB>
+<6955> <6955> <F6EB>
+<6957> <6957> <CBF1>
+<6959> <6959> <D9EA>
+<695A> <695A> <F5A2>
+<695E> <695E> <D7D1>
+<6960> <6960> <D1F8>
+<6961> <6962> <EAF8>
+<6963> <6963> <DAB3>
+<6968> <6968> <EFDF>
+<696B> <696B> <F1EF>
+<696D> <696D> <E5F6>
+<696E> <696E> <EEBF>
+<696F> <696F> <E2E4>
+<6975> <6975> <D0BF>
+<6977> <6977> <FAAC>
+<6978> <6978> <F5D1>
+<6979> <6979> <E7B3>
+<6995> <6995> <E9BE>
+<699B> <699B> <F2CE>
+<699C> <699C> <DBB4>
+<69A5> <69A5> <FCCE>
+<69A7> <69A7> <DDEE>
+<69AE> <69AE> <E7B4>
+<69B4> <69B4> <D7B4>
+<69BB> <69BB> <F7B4>
+<69C1> <69C1> <CDBE>
+<69C3> <69C3> <DAE9>
+<69CB> <69CB> <CFB0>
+<69CC> <69CC> <F7D9>
+<69CD> <69CD> <F3E6>
+<69D0> <69D0> <CED9>
+<69E8> <69E8> <CEAA>
+<69EA> <69EA> <CBC8>
+<69FB> <69FB> <D0A7>
+<69FD> <69FD> <F0CB>
+<69FF> <69FF> <D0C7>
+<6A02> <6A02> <E4C5>
+<6A0A> <6A0A> <DBE0>
+<6A11> <6A11> <D5DA>
+<6A13> <6A13> <D7A7>
+<6A17> <6A17> <EEC0>
+<6A19> <6A19> <F8F6>
+<6A1E> <6A1E> <F5D2>
+<6A1F> <6A1F> <EDE9>
+<6A21> <6A21> <D9BC>
+<6A23> <6A23> <E5C6>
+<6A35> <6A35> <F5A3>
+<6A38> <6A38> <DAD4>
+<6A39> <6A39> <E2A7>
+<6A3A> <6A3A> <FBFC>
+<6A3D> <6A3D> <F1DC>
+<6A44> <6A44> <CAF4>
+<6A48> <6A48> <E8FA>
+<6A4B> <6A4B> <CEE9>
+<6A52> <6A52> <E9F8>
+<6A53> <6A53> <E2E5>
+<6A58> <6A58> <D0B9>
+<6A59> <6A59> <D4F2>
+<6A5F> <6A5F> <D1A6>
+<6A61> <6A61> <DFCE>
+<6A6B> <6A6B> <FCF4>
+<6A80> <6A80> <D3AA>
+<6A84> <6A84> <CCAC>
+<6A89> <6A89> <EFE0>
+<6A8D> <6A8D> <E5E5>
+<6A8E> <6A8E> <D0D5>
+<6A97> <6A97> <DBFC>
+<6A9C> <6A9C> <FCE6>
+<6AA2> <6AA2> <CBFE>
+<6AA3> <6AA3> <EDEA>
+<6AB3> <6AB3> <DEB1>
+<6ABB> <6ABB> <F9E3>
+endbfrange
+
+100 beginbfrange
+<6AC2> <6AC2> <D4A2>
+<6AC3> <6AC3> <CFF6>
+<6AD3> <6AD3> <D6D0>
+<6ADA> <6ADA> <D5EA>
+<6ADB> <6ADB> <F1EE>
+<6AF6> <6AF6> <FACB>
+<6AFB> <6AFB> <E5A1>
+<6B04> <6B04> <D5B1>
+<6B0A> <6B0A> <CFED>
+<6B0C> <6B0C> <EDEB>
+<6B12> <6B12> <D5B2>
+<6B16> <6B16> <D5BC>
+<6B20> <6B20> <FDE2>
+<6B21> <6B21> <F3AD>
+<6B23> <6B23> <FDDB>
+<6B32> <6B32> <E9B0>
+<6B3A> <6B3A> <D1A7>
+<6B3D> <6B3D> <FDE3>
+<6B3E> <6B3E> <CEB3>
+<6B46> <6B46> <FDE4>
+<6B47> <6B47> <FACE>
+<6B4C> <6B4C> <CAB0>
+<6B4E> <6B4E> <F7A7>
+<6B50> <6B50> <CFB1>
+<6B5F> <6B5F> <E6A2>
+<6B61> <6B61> <FCB6>
+<6B62> <6B62> <F2AD>
+<6B63> <6B63> <EFE1>
+<6B64> <6B64> <F3AE>
+<6B65> <6B65> <DCC6>
+<6B66> <6B66> <D9EB>
+<6B6A> <6B6A> <E8E0>
+<6B72> <6B72> <E1A8>
+<6B77> <6B77> <D5F6>
+<6B78> <6B78> <CFFD>
+<6B7B> <6B7B> <DEDD>
+<6B7F> <6B7F> <D9D1>
+<6B83> <6B83> <E4EA>
+<6B84> <6B84> <F2CF>
+<6B86> <6B86> <F7BF>
+<6B89> <6B89> <E2E6>
+<6B8A> <6B8A> <E2A8>
+<6B96> <6B96> <E3D6>
+<6B98> <6B98> <EDD1>
+<6B9E> <6B9E> <E9F9>
+<6BAE> <6BAE> <D6B1>
+<6BAF> <6BAF> <DEB2>
+<6BB2> <6BB2> <E0E8>
+<6BB5> <6BB5> <D3AB>
+<6BB7> <6BB7> <EBDC>
+<6BBA> <6BBA> <DFAF>
+<6BBC> <6BBC> <CAC3>
+<6BBF> <6BBF> <EEFC>
+<6BC1> <6BC1> <FDC3>
+<6BC5> <6BC5> <EBF6>
+<6BC6> <6BC6> <CFB2>
+<6BCB> <6BCB> <D9EC>
+<6BCD> <6BCD> <D9BD>
+<6BCF> <6BCF> <D8DF>
+<6BD2> <6BD2> <D4B8>
+<6BD3> <6BD3> <EBBE>
+<6BD4> <6BD4> <DDEF>
+<6BD6> <6BD8> <DDF0>
+<6BDB> <6BDB> <D9BE>
+<6BEB> <6BEB> <FBC6>
+<6BEC> <6BEC> <CFB3>
+<6C08> <6C08> <EEFD>
+<6C0F> <6C0F> <E4AB>
+<6C11> <6C11> <DAC5>
+<6C13> <6C13> <D8EC>
+<6C23> <6C23> <D1A8>
+<6C34> <6C34> <E2A9>
+<6C37> <6C37> <DEBC>
+<6C38> <6C38> <E7B5>
+<6C3E> <6C3E> <DBF0>
+<6C40> <6C40> <EFE2>
+<6C41> <6C41> <F1F0>
+<6C42> <6C42> <CFB4>
+<6C4E> <6C4E> <DBF1>
+<6C50> <6C50> <E0B1>
+<6C55> <6C55> <DFA5>
+<6C57> <6C57> <F9D2>
+<6C5A> <6C5A> <E7FD>
+<6C5D> <6C5D> <E6A3>
+<6C5E> <6C5E> <FBF1>
+<6C5F> <6C5F> <CBB0>
+<6C60> <6C60> <F2AE>
+<6C68> <6C68> <CDE7>
+<6C6A> <6C6A> <E8DC>
+<6C6D> <6C6D> <E7D7>
+<6C70> <6C70> <F7C0>
+<6C72> <6C72> <D0E3>
+<6C76> <6C76> <DAA1>
+<6C7A> <6C7A> <CCBD>
+<6C7D> <6C7D> <D1A9>
+<6C7E> <6C7E> <DDCC>
+<6C81> <6C81> <E3FE>
+<6C82> <6C82> <D1AA>
+<6C83> <6C83> <E8AA>
+<6C85> <6C85> <EAB6>
+endbfrange
+
+100 beginbfrange
+<6C86> <6C86> <F9FA>
+<6C87> <6C87> <E6CC>
+<6C88> <6C88> <F6D8>
+<6C8C> <6C8C> <D4C7>
+<6C90> <6C90> <D9CB>
+<6C92> <6C92> <D9D2>
+<6C93> <6C93> <D3CB>
+<6C94> <6C94> <D8F7>
+<6C95> <6C95> <DAA9>
+<6C96> <6C96> <F5F8>
+<6C99> <6C99> <DEDE>
+<6C9A> <6C9A> <F2AF>
+<6C9B> <6C9B> <F8A9>
+<6CAB> <6CAB> <D8C8>
+<6CAE> <6CAE> <EEC1>
+<6CB3> <6CB3> <F9C1>
+<6CB8> <6CB8> <DDF3>
+<6CB9> <6CB9> <EAFA>
+<6CBB> <6CBB> <F6BD>
+<6CBC> <6CBC> <E1BB>
+<6CBD> <6CBD> <CDBF>
+<6CBE> <6CBE> <F4D4>
+<6CBF> <6CBF> <E6CD>
+<6CC1> <6CC1> <FCCF>
+<6CC2> <6CC2> <FBA2>
+<6CC4> <6CC4> <E0DC>
+<6CC9> <6CC9> <F4BB>
+<6CCA> <6CCA> <DAD5>
+<6CCC> <6CCC> <F9B2>
+<6CD3> <6CD3> <FBF2>
+<6CD5> <6CD5> <DBF6>
+<6CD7> <6CD7> <DEDF>
+<6CDB> <6CDB> <DBF2>
+<6CE1> <6CE1> <F8DC>
+<6CE2> <6CE2> <F7EE>
+<6CE3> <6CE3> <EBE8>
+<6CE5> <6CE5> <D2FA>
+<6CE8> <6CE8> <F1BC>
+<6CEB> <6CEB> <FADA>
+<6CEE> <6CEE> <DAEA>
+<6CEF> <6CEF> <DAC6>
+<6CF0> <6CF0> <F7C1>
+<6CF3> <6CF3> <E7B6>
+<6D0B> <6D0B> <E5C7>
+<6D0C> <6D0C> <D6AC>
+<6D11> <6D11> <DCC7>
+<6D17> <6D17> <E1A9>
+<6D19> <6D19> <E2AA>
+<6D1B> <6D1B> <D5A6>
+<6D1E> <6D1E> <D4D7>
+<6D25> <6D25> <F2D0>
+<6D27> <6D27> <EAFB>
+<6D29> <6D29> <E0DD>
+<6D2A> <6D2A> <FBF3>
+<6D32> <6D32> <F1BD>
+<6D35> <6D35> <E2E7>
+<6D36> <6D36> <FDD7>
+<6D38> <6D38> <CEC8>
+<6D39> <6D39> <EAB7>
+<6D3B> <6D3B> <FCC0>
+<6D3D> <6D3D> <FDE7>
+<6D3E> <6D3E> <F7EF>
+<6D41> <6D41> <D7B5>
+<6D59> <6D59> <EFBA>
+<6D5A> <6D5A> <F1DD>
+<6D5C> <6D5C> <DEB3>
+<6D63> <6D63> <E8CB>
+<6D66> <6D66> <F8DD>
+<6D69> <6D69> <FBC7>
+<6D6A> <6D6A> <D5C8>
+<6D6C> <6D6C> <D7DF>
+<6D6E> <6D6E> <DDA9>
+<6D74> <6D74> <E9B1>
+<6D77> <6D77> <FAAD>
+<6D78> <6D78> <F6D9>
+<6D79> <6D79> <FAF4>
+<6D7F> <6D7F> <F8AA>
+<6D85> <6D85> <E6EE>
+<6D87> <6D87> <CCDC>
+<6D88> <6D88> <E1BC>
+<6D89> <6D89> <E0EF>
+<6D8C> <6D8C> <E9BF>
+<6D8D> <6D8D> <FCFD>
+<6D8E> <6D8E> <E6CE>
+<6D91> <6D91> <E1D7>
+<6D93> <6D93> <E6CF>
+<6D95> <6D95> <F4F1>
+<6DAF> <6DAF> <E4F3>
+<6DB2> <6DB2> <E4FB>
+<6DB5> <6DB5> <F9E4>
+<6DC0> <6DC0> <EFE3>
+<6DC3> <6DC3> <CFEE>
+<6DC4> <6DC4> <F6BE>
+<6DC5> <6DC5> <E0B2>
+<6DC6> <6DC6> <FCFE>
+<6DC7> <6DC7> <D1AB>
+<6DCB> <6DCB> <D7FA>
+<6DCF> <6DCF> <FBC8>
+<6DD1> <6DD1> <E2D7>
+<6DD8> <6DD8> <D4A3>
+endbfrange
+
+100 beginbfrange
+<6DD9> <6DD9> <F0F8>
+<6DDA> <6DDA> <D7A8>
+<6DDE> <6DDE> <E1E7>
+<6DE1> <6DE1> <D3BF>
+<6DE8> <6DE8> <EFE4>
+<6DEA> <6DEA> <D7C5>
+<6DEB> <6DEB> <EBE2>
+<6DEE> <6DEE> <FCE7>
+<6DF1> <6DF1> <E4A2>
+<6DF3> <6DF3> <E2E8>
+<6DF5> <6DF5> <E6D0>
+<6DF7> <6DF7> <FBE8>
+<6DF8> <6DF8> <F4E8>
+<6DF9> <6DF9> <E5F4>
+<6DFA> <6DFA> <F4BC>
+<6DFB> <6DFB> <F4D5>
+<6E17> <6E17> <DFB6>
+<6E19> <6E19> <FCB9>
+<6E1A> <6E1A> <EEC2>
+<6E1B> <6E1B> <CAF5>
+<6E1F> <6E1F> <EFE5>
+<6E20> <6E20> <CBE2>
+<6E21> <6E21> <D4A4>
+<6E23> <6E23> <DEE0>
+<6E24> <6E24> <DAFD>
+<6E25> <6E25> <E4C6>
+<6E26> <6E26> <E8BE>
+<6E2B> <6E2B> <E0DE>
+<6E2C> <6E2C> <F6B4>
+<6E2D> <6E2D> <EAD2>
+<6E2F> <6E2F> <F9FB>
+<6E32> <6E32> <E0C2>
+<6E34> <6E34> <CAE4>
+<6E36> <6E36> <E7B7>
+<6E38> <6E38> <EAFD>
+<6E3A> <6E3A> <D9DD>
+<6E3C> <6E3C> <DAB4>
+<6E3D> <6E3D> <EEAA>
+<6E3E> <6E3E> <FBE9>
+<6E43> <6E43> <DBCB>
+<6E44> <6E44> <DAB5>
+<6E4A> <6E4A> <F1BE>
+<6E4D> <6E4D> <D3AC>
+<6E56> <6E56> <FBC9>
+<6E58> <6E58> <DFCF>
+<6E5B> <6E5B> <D3C0>
+<6E5C> <6E5C> <E3D7>
+<6E5E> <6E5E> <EFE6>
+<6E5F> <6E5F> <FCD0>
+<6E67> <6E67> <E9C0>
+<6E6B> <6E6B> <F5D3>
+<6E6E> <6E6E> <ECDC>
+<6E6F> <6E6F> <F7B7>
+<6E72> <6E72> <EAB8>
+<6E73> <6E73> <D1F9>
+<6E7A> <6E7A> <DCC8>
+<6E90> <6E90> <EAB9>
+<6E96> <6E96> <F1DE>
+<6E9C> <6E9C> <D7B6>
+<6E9D> <6E9D> <CFB5>
+<6E9F> <6E9F> <D9A8>
+<6EA2> <6EA2> <ECEE>
+<6EA5> <6EA5> <DDAA>
+<6EAA> <6EAA> <CDA2>
+<6EAB> <6EAB> <E8AE>
+<6EAF> <6EAF> <E1BD>
+<6EB1> <6EB1> <F2D1>
+<6EB6> <6EB6> <E9C1>
+<6EBA> <6EBA> <D2FC>
+<6EC2> <6EC2> <DBB5>
+<6EC4> <6EC4> <F3E7>
+<6EC5> <6EC5> <D8FE>
+<6EC9> <6EC9> <FCD1>
+<6ECB> <6ECB> <EDB2>
+<6ECC> <6ECC> <F4AF>
+<6ECE> <6ECE> <FBA3>
+<6ED1> <6ED1> <FCC1>
+<6ED3> <6ED3> <EEAB>
+<6ED4> <6ED4> <D4A5>
+<6EEF> <6EEF> <F4F2>
+<6EF4> <6EF4> <EED9>
+<6EF8> <6EF8> <FBCA>
+<6EFE> <6EFE> <CDE3>
+<6EFF> <6EFF> <D8BB>
+<6F01> <6F01> <E5DB>
+<6F02> <6F02> <F8F7>
+<6F06> <6F06> <F6D4>
+<6F0F> <6F0F> <D7A9>
+<6F11> <6F11> <CBC9>
+<6F14> <6F14> <E6D1>
+<6F15> <6F15> <F0CC>
+<6F20> <6F20> <D8AE>
+<6F22> <6F22> <F9D3>
+<6F23> <6F23> <D5FE>
+<6F2B> <6F2B> <D8BC>
+<6F2C> <6F2C> <F2B0>
+<6F31> <6F31> <E2AB>
+<6F32> <6F32> <F3E8>
+<6F38> <6F38> <EFC2>
+<6F3F> <6F3F> <EDEC>
+endbfrange
+
+100 beginbfrange
+<6F41> <6F41> <E7B8>
+<6F51> <6F51> <DAFE>
+<6F54> <6F54> <CCBE>
+<6F57> <6F57> <F2FC>
+<6F58> <6F58> <DAEB>
+<6F5A> <6F5A> <E2D8>
+<6F5B> <6F5B> <EDD6>
+<6F5E> <6F5E> <D6D1>
+<6F5F> <6F5F> <E0B3>
+<6F62> <6F62> <FCD2>
+<6F64> <6F64> <EBC8>
+<6F6D> <6F6D> <D3C1>
+<6F6E> <6F6E> <F0CD>
+<6F70> <6F70> <CFF7>
+<6F7A> <6F7A> <EDD2>
+<6F7C> <6F7C> <D4D8>
+<6F7D> <6F7D> <DCC9>
+<6F7E> <6F7E> <D7F1>
+<6F81> <6F81> <DFBB>
+<6F84> <6F84> <F3A5>
+<6F88> <6F88> <F4CD>
+<6F8D> <6F8D> <F1BF>
+<6F8E> <6F8E> <F8B1>
+<6F90> <6F90> <E9FA>
+<6F94> <6F94> <FBCB>
+<6F97> <6F97> <CAD5>
+<6FA3> <6FA3> <F9D4>
+<6FA4> <6FA4> <F7CA>
+<6FA7> <6FA7> <D6C8>
+<6FAE> <6FAE> <FCE8>
+<6FAF> <6FAF> <F3BD>
+<6FB1> <6FB1> <EEFE>
+<6FB3> <6FB3> <E7FE>
+<6FB9> <6FB9> <D3C2>
+<6FBE> <6FBE> <D3B6>
+<6FC0> <6FC0> <CCAD>
+<6FC1> <6FC1> <F6FA>
+<6FC2> <6FC2> <D6B2>
+<6FC3> <6FC3> <D2D8>
+<6FCA> <6FCA> <E7D8>
+<6FD5> <6FD5> <E3A5>
+<6FDA> <6FDA> <E7B9>
+<6FDF> <6FDF> <F0AD>
+<6FE0> <6FE0> <FBCC>
+<6FE1> <6FE1> <EBA1>
+<6FE4> <6FE4> <D4A6>
+<6FE9> <6FE9> <FBCD>
+<6FEB> <6FEB> <D5BD>
+<6FEC> <6FEC> <F1DF>
+<6FEF> <6FEF> <F6FB>
+<6FF1> <6FF1> <DEB4>
+<6FFE> <6FFE> <D5EB>
+<7001> <7001> <E5C8>
+<7005> <7005> <FBA4>
+<7006> <7006> <D4B9>
+<7009> <7009> <DEE1>
+<700B> <700B> <E4A3>
+<700F> <700F> <D7B7>
+<7011> <7011> <F8EE>
+<7015> <7015> <DEB5>
+<7018> <7018> <D6D2>
+<701A> <701A> <F9D5>
+<701B> <701B> <E7BA>
+<701C> <701C> <EBD5>
+<701D> <701D> <D5F7>
+<701E> <701E> <EFE7>
+<701F> <701F> <E1BE>
+<7023> <7023> <FAAE>
+<7027> <7027> <D6E9>
+<7028> <7028> <D6EE>
+<702F> <702F> <E7BB>
+<7037> <7037> <ECCB>
+<703E> <703E> <D5B3>
+<704C> <704C> <CEB4>
+<7050> <7050> <FBA5>
+<7051> <7051> <E1EE>
+<7058> <7058> <F7A8>
+<705D> <705D> <FBCE>
+<7063> <7063> <D8BD>
+<706B> <706B> <FBFD>
+<7070> <7070> <FCE9>
+<7078> <7078> <CFB6>
+<707C> <707C> <EDC7>
+<707D> <707D> <EEAC>
+<7085> <7085> <CCDD>
+<708A> <708A> <F6A7>
+<708E> <708E> <E6FA>
+<7092> <7092> <F5A4>
+<7098> <7098> <FDDC>
+<7099> <7099> <EDB3>
+<709A> <709A> <CEC9>
+<70A1> <70A1> <EFE8>
+<70A4> <70A4> <E1BF>
+<70AB> <70AB> <FADB>
+<70AC> <70AC> <CBE3>
+<70AD> <70AD> <F7A9>
+<70AF> <70AF> <FBA6>
+<70B3> <70B3> <DCB9>
+<70B7> <70B7> <F1C0>
+<70B8> <70B8> <EDC8>
+endbfrange
+
+100 beginbfrange
+<70B9> <70B9> <EFC3>
+<70C8> <70C8> <D6AD>
+<70CB> <70CB> <FDCE>
+<70CF> <70CF> <E8A1>
+<70D8> <70D8> <FBF4>
+<70D9> <70D9> <D5A7>
+<70DD> <70DD> <F1F6>
+<70DF> <70DF> <E6D3>
+<70F1> <70F1> <CCDE>
+<70F9> <70F9> <F8B2>
+<70FD> <70FD> <DCEB>
+<7104> <7104> <FDB6>
+<7109> <7109> <E5EA>
+<710C> <710C> <F1E0>
+<7119> <7119> <DBCC>
+<711A> <711A> <DDCD>
+<711E> <711E> <D4C8>
+<7121> <7121> <D9ED>
+<7126> <7126> <F5A5>
+<7130> <7130> <E6FB>
+<7136> <7136> <E6D4>
+<7147> <7147> <FDC8>
+<7149> <7149> <D6A1>
+<714A> <714A> <FDBF>
+<714C> <714C> <FCD3>
+<714E> <714E> <EFA1>
+<7150> <7150> <E7BC>
+<7156> <7156> <D1EE>
+<7159> <7159> <E6D5>
+<715C> <715C> <E9F2>
+<715E> <715E> <DFB0>
+<7164> <7164> <D8E0>
+<7165> <7165> <FCBA>
+<7166> <7166> <FDAF>
+<7167> <7167> <F0CE>
+<7169> <7169> <DBE1>
+<716C> <716C> <E5C9>
+<716E> <716E> <EDB4>
+<717D> <717D> <E0C3>
+<7184> <7184> <E3D8>
+<7189> <7189> <E9FB>
+<718A> <718A> <EAA8>
+<718F> <718F> <FDB7>
+<7192> <7192> <FBA7>
+<7194> <7194> <E9C2>
+<7199> <7199> <FDF7>
+<719F> <719F> <E2D9>
+<71A2> <71A2> <DCEC>
+<71AC> <71AC> <E8A2>
+<71B1> <71B1> <E6F0>
+<71B9> <71BA> <FDF8>
+<71BE> <71BE> <F6BF>
+<71C1> <71C1> <E7A7>
+<71C3> <71C3> <E6D7>
+<71C8> <71C8> <D4F3>
+<71C9> <71C9> <D4C9>
+<71CE> <71CE> <D6FA>
+<71D0> <71D0> <D7F2>
+<71D2> <71D2> <E1C0>
+<71D4> <71D4> <DBE2>
+<71D5> <71D5> <E6D8>
+<71DF> <71DF> <E7BD>
+<71E5> <71E5> <F0CF>
+<71E6> <71E6> <F3BE>
+<71E7> <71E7> <E2AC>
+<71ED> <71ED> <F5B7>
+<71EE> <71EE> <E0F0>
+<71FB> <71FB> <FDB8>
+<71FC> <71FC> <E3E8>
+<71FE> <71FE> <D4A7>
+<71FF> <71FF> <E8FC>
+<7200> <7200> <FAD2>
+<7206> <7206> <F8EF>
+<7210> <7210> <D6D3>
+<721B> <721B> <D5B4>
+<722A> <722A> <F0D0>
+<722C> <722C> <F7F0>
+<722D> <722D> <EEB3>
+<7230> <7230> <EABA>
+<7232> <7232> <EAD3>
+<7235> <7235> <EDC9>
+<7236> <7236> <DDAB>
+<723A> <723A> <E5AC>
+<723B> <723B> <FDA1>
+<723D> <723D> <DFD0>
+<723E> <723E> <ECB3>
+<7240> <7240> <DFD1>
+<7246> <7246> <EDED>
+<7247> <7247> <F8B8>
+<7248> <7248> <F7FA>
+<724C> <724C> <F8AB>
+<7252> <7252> <F4E0>
+<7258> <7258> <D4BA>
+<7259> <7259> <E4B3>
+<725B> <725B> <E9DA>
+<725D> <725D> <DEB6>
+<725F> <725F> <D9BF>
+<7261> <7261> <D9C0>
+<7262> <7262> <D6EF>
+<7267> <7267> <D9CC>
+endbfrange
+
+100 beginbfrange
+<7269> <7269> <DAAA>
+<7272> <7272> <DFE5>
+<7279> <7279> <F7E5>
+<727D> <727D> <CCB2>
+<7280> <7280> <DFF9>
+<7281> <7281> <D7E0>
+<72A2> <72A2> <D4BB>
+<72A7> <72A7> <FDFA>
+<72AC> <72AC> <CCB3>
+<72AF> <72AF> <DBF3>
+<72C0> <72C0> <DFD2>
+<72C2> <72C2> <CECA>
+<72C4> <72C4> <EEDA>
+<72CE> <72CE> <E4E4>
+<72D0> <72D0> <FBCF>
+<72D7> <72D7> <CFB7>
+<72D9> <72D9> <EEC3>
+<72E1> <72E1> <CEEA>
+<72E9> <72E9> <E2AD>
+<72F8> <72F8> <D7E1>
+<72F9> <72F9> <FAF5>
+<72FC> <72FC> <D5C9>
+<72FD> <72FD> <F8AC>
+<730A> <730A> <E7D9>
+<7316> <7316> <F3E9>
+<731B> <731B> <D8ED>
+<731C> <731C> <E3C4>
+<731D> <731D> <F0F1>
+<7325> <7325> <E8E5>
+<7329> <7329> <E0FA>
+<732A> <732A> <EEC4>
+<732B> <732B> <D9DE>
+<7336> <7337> <EBA2>
+<733E> <733E> <FCC2>
+<733F> <733F> <EABB>
+<7344> <7344> <E8AB>
+<7345> <7345> <DEE2>
+<7350> <7350> <EDEF>
+<7352> <7352> <E8A3>
+<7357> <7357> <CFF1>
+<7368> <7368> <D4BC>
+<736A> <736A> <FCEA>
+<7370> <7370> <E7BE>
+<7372> <7372> <FCF2>
+<7375> <7375> <D6B4>
+<7378> <7378> <E2AE>
+<737A> <737A> <D3B7>
+<737B> <737B> <FACC>
+<7384> <7384> <FADC>
+<7386> <7386> <EDB5>
+<7387> <7387> <E1E3>
+<7389> <7389> <E8AC>
+<738B> <738B> <E8DD>
+<738E> <738E> <EFE9>
+<7394> <7394> <F4BD>
+<7396> <7396> <CFB8>
+<7397> <7397> <E9DB>
+<7398> <7398> <D1AC>
+<739F> <739F> <DAC7>
+<73A7> <73A7> <EBC9>
+<73A9> <73A9> <E8CC>
+<73AD> <73AD> <DEB7>
+<73B2> <73B2> <D6BC>
+<73B3> <73B3> <D3E5>
+<73B9> <73B9> <FADD>
+<73C0> <73C0> <DAD6>
+<73C2> <73C2> <CAB1>
+<73C9> <73C9> <DAC8>
+<73CA> <73CA> <DFA6>
+<73CC> <73CC> <F9B3>
+<73CD> <73CD> <F2D2>
+<73CF> <73CF> <CAC4>
+<73D6> <73D6> <CECB>
+<73D9> <73D9> <CDF5>
+<73DD> <73DD> <FDB0>
+<73DE> <73DE> <D5A8>
+<73E0> <73E0> <F1C1>
+<73E3> <73E3> <E2E9>
+<73E4> <73E4> <DCCA>
+<73E5> <73E5> <ECB4>
+<73E6> <73E6> <FAC0>
+<73E9> <73E9> <FBA8>
+<73EA> <73EA> <D0A8>
+<73ED> <73ED> <DAEC>
+<73F7> <73F7> <D9EE>
+<73F9> <73F9> <E0FB>
+<73FD> <73FD> <EFEA>
+<73FE> <73FE> <FADE>
+<7401> <7401> <E0C4>
+<7403> <7403> <CFB9>
+<7405> <7405> <D5CA>
+<7406> <7406> <D7E2>
+<7407> <7407> <E2AF>
+<7409> <7409> <D7B8>
+<7413> <7413> <E8CD>
+<741B> <741B> <F6DA>
+<7420> <7420> <EFA2>
+<7421> <7421> <E2DA>
+<7422> <7422> <F6FC>
+<7425> <7425> <FBD0>
+endbfrange
+
+100 beginbfrange
+<7426> <7426> <D1AD>
+<7428> <7428> <CDE4>
+<742A> <742A> <D1AE>
+<742B> <742B> <DCED>
+<742C> <742C> <E8CE>
+<742E> <742E> <F0F9>
+<742F> <742F> <CEB5>
+<7430> <7430> <E6FC>
+<7433> <7433> <D7FB>
+<7434> <7434> <D0D6>
+<7435> <7435> <DDF5>
+<7436> <7436> <F7F1>
+<7438> <7438> <F6FD>
+<743A> <743A> <DBF7>
+<743F> <743F> <FBEA>
+<7440> <7440> <E9DC>
+<7441> <7441> <D9C1>
+<7443> <7443> <F5F2>
+<7444> <7444> <E0C5>
+<744B> <744B> <EAD4>
+<7455> <7455> <F9C2>
+<7457> <7457> <EABC>
+<7459> <7459> <D2C5>
+<745A> <745A> <FBD1>
+<745B> <745B> <E7C0>
+<745C> <745C> <EBA5>
+<745E> <745E> <DFFA>
+<745F> <745F> <E3A2>
+<7460> <7460> <D7B9>
+<7462> <7462> <E9C3>
+<7464> <7464> <E8FD>
+<7465> <7465> <E8AF>
+<7468> <7468> <F2D3>
+<7469> <7469> <FBA9>
+<746A> <746A> <D8A5>
+<746F> <746F> <D5CB>
+<747E> <747E> <D0C8>
+<7482> <7482> <D1AF>
+<7483> <7483> <D7E3>
+<7487> <7487> <E0C6>
+<7489> <7489> <D6A2>
+<748B> <748B> <EDF0>
+<7498> <7498> <D7F3>
+<749C> <749C> <FCD4>
+<749E> <749E> <DAD7>
+<749F> <749F> <CCDF>
+<74A1> <74A1> <F2D4>
+<74A3> <74A3> <D1B0>
+<74A5> <74A5> <CCE0>
+<74A7> <74A7> <DBFD>
+<74A8> <74A8> <F3BF>
+<74AA> <74AA> <F0D1>
+<74B0> <74B0> <FCBB>
+<74B2> <74B2> <E2B0>
+<74B5> <74B5> <E6A5>
+<74B9> <74B9> <E2DB>
+<74BD> <74BD> <DFDE>
+<74BF> <74BF> <E0C7>
+<74C6> <74C6> <F2EF>
+<74CA> <74CA> <CCE1>
+<74CF> <74CF> <D6EA>
+<74D4> <74D4> <E7C2>
+<74D8> <74D8> <CEB6>
+<74DA> <74DA> <F3C0>
+<74DC> <74DC> <CDFE>
+<74E0> <74E0> <FBD2>
+<74E2> <74E2> <F8F8>
+<74E3> <74E3> <F7FB>
+<74E6> <74E6> <E8BF>
+<74EE> <74EE> <E8B7>
+<74F7> <74F7> <EDB6>
+<7501> <7501> <DCBA>
+<7504> <7504> <CCB4>
+<7511> <7511> <F1F7>
+<7515> <7515> <E8B8>
+<7518> <7518> <CAF6>
+<751A> <751A> <E4A4>
+<751B> <751B> <F4D6>
+<751F> <751F> <DFE6>
+<7523> <7523> <DFA7>
+<7525> <7525> <DFE7>
+<7526> <7526> <E1C1>
+<7528> <7528> <E9C4>
+<752B> <752B> <DCCB>
+<752C> <752C> <E9C5>
+<7530> <7530> <EFA3>
+<7531> <7531> <EBA6>
+<7532> <7532> <CBA3>
+<7533> <7533> <E3E9>
+<7537> <7537> <D1FB>
+<7538> <7538> <EFA4>
+<753A> <753A> <EFEB>
+<7547> <7547> <D0B4>
+<754C> <754C> <CDA3>
+<754F> <754F> <E8E6>
+<7551> <7551> <EFA5>
+<7553> <7553> <D3CC>
+<7554> <7554> <DAED>
+<7559> <7559> <D7BA>
+<755B> <755B> <F2D5>
+endbfrange
+
+100 beginbfrange
+<755C> <755C> <F5E5>
+<755D> <755D> <D9EF>
+<7562> <7562> <F9B4>
+<7565> <7565> <D5D4>
+<7566> <7566> <FDCF>
+<756A> <756A> <DBE3>
+<756F> <756F> <F1E1>
+<7570> <7570> <ECB6>
+<7575> <7575> <FBFE>
+<7576> <7576> <D3D7>
+<7578> <7578> <D1B1>
+<757A> <757A> <CBB1>
+<757F> <757F> <D1B2>
+<7586> <7586> <CBB2>
+<7587> <7587> <F1C2>
+<758A> <758A> <F4E1>
+<758B> <758B> <F9B5>
+<758E> <758E> <E1C3>
+<758F> <758F> <E1C2>
+<7591> <7591> <EBF7>
+<759D> <759D> <DFA8>
+<75A5> <75A5> <CBCA>
+<75AB> <75AB> <E6B9>
+<75B1> <75B1> <F8DE>
+<75B2> <75B2> <F9AA>
+<75B3> <75B3> <CAF7>
+<75B5> <75B5> <EDB7>
+<75B8> <75B8> <D3B8>
+<75B9> <75B9> <F2D6>
+<75BC> <75BC> <D4D9>
+<75BD> <75BD> <EEC5>
+<75BE> <75BE> <F2F0>
+<75C2> <75C2> <CAB2>
+<75C5> <75C5> <DCBB>
+<75C7> <75C7> <F1F8>
+<75CD> <75CD> <ECB7>
+<75D2> <75D2> <E5CA>
+<75D4> <75D4> <F6C0>
+<75D5> <75D5> <FDDD>
+<75D8> <75D8> <D4E3>
+<75D9> <75D9> <CCE2>
+<75DB> <75DB> <F7D4>
+<75E2> <75E2> <D7E5>
+<75F0> <75F0> <D3C3>
+<75F2> <75F2> <D8A6>
+<75F4> <75F4> <F6C1>
+<75FA> <75FA> <DDF6>
+<75FC> <75FC> <CDC0>
+<7600> <7600> <E5DC>
+<760D> <760D> <E5CB>
+<7619> <7619> <E1C4>
+<761F> <761F> <E8B0>
+<7620> <7620> <F4B0>
+<7621> <7621> <F3EA>
+<7622> <7622> <DAEE>
+<7624> <7624> <D7BB>
+<7626> <7626> <E2B1>
+<763B> <763B> <D7AA>
+<7642> <7642> <D6FB>
+<764C> <764C> <E4DF>
+<764E> <764E> <CAD6>
+<7652> <7652> <EBA8>
+<7656> <7656> <DBFE>
+<7661> <7661> <F6C2>
+<7664> <7664> <EFBB>
+<7669> <7669> <D4FD>
+<766C> <766C> <E0C8>
+<7670> <7670> <E8B9>
+<7672> <7672> <EFA6>
+<7678> <7678> <CDA4>
+<767B> <767B> <D4F4>
+<767C> <767C> <DBA1>
+<767D> <767E> <DBDC>
+<7684> <7684> <EEDC>
+<7686> <7686> <CBCB>
+<7687> <7687> <FCD5>
+<768E> <768E> <CEEB>
+<7690> <7690> <CDC1>
+<7693> <7693> <FBD3>
+<76AE> <76AE> <F9AB>
+<76BA> <76BA> <F5D4>
+<76BF> <76BF> <D9A9>
+<76C2> <76C2> <E9DD>
+<76C3> <76C3> <DBCD>
+<76C6> <76C6> <DDCE>
+<76C8> <76C8> <E7C3>
+<76CA> <76CA> <ECCC>
+<76D2> <76D2> <F9EC>
+<76D6> <76D6> <CBCC>
+<76DB> <76DB> <E0FC>
+<76DC> <76DC> <D4A8>
+<76DE> <76DE> <EDD3>
+<76DF> <76DF> <D8EF>
+<76E1> <76E1> <F2D7>
+<76E3> <76E3> <CAF8>
+<76E4> <76E4> <DAEF>
+<76E7> <76E7> <D6D4>
+<76EE> <76EE> <D9CD>
+<76F2> <76F2> <D8EE>
+<76F4> <76F4> <F2C1>
+endbfrange
+
+100 beginbfrange
+<76F8> <76F8> <DFD3>
+<76FC> <76FC> <DAF0>
+<76FE> <76FE> <E2EA>
+<7701> <7701> <E0FD>
+<7704> <7704> <D8F8>
+<7708> <7708> <F7AF>
+<7709> <7709> <DAB6>
+<770B> <770B> <CAD7>
+<771E> <771E> <F2D8>
+<7720> <7720> <D8F9>
+<7729> <7729> <FADF>
+<7737> <7737> <CFEF>
+<7738> <7738> <D9C2>
+<773A> <773A> <F0D2>
+<773C> <773C> <E4D1>
+<7740> <7740> <F3B7>
+<774D> <774D> <FAE0>
+<775B> <775B> <EFEC>
+<7761> <7761> <E2B2>
+<7763> <7763> <D4BD>
+<7766> <7766> <D9CE>
+<776B> <776B> <F4E2>
+<7779> <7779> <D4A9>
+<777E> <777E> <CDC2>
+<777F> <777F> <E7DA>
+<778B> <778B> <F2D9>
+<7791> <7791> <D9AA>
+<779E> <779E> <D8BE>
+<77A5> <77A5> <DCAD>
+<77AC> <77AC> <E2EB>
+<77AD> <77AD> <D6FC>
+<77B0> <77B0> <CAF9>
+<77B3> <77B3> <D4DA>
+<77BB> <77BB> <F4D7>
+<77BC> <77BC> <CCA1>
+<77BF> <77BF> <CFBA>
+<77D7> <77D7> <F5B8>
+<77DB> <77DB> <D9C3>
+<77DC> <77DC> <D0E8>
+<77E2> <77E2> <E3C5>
+<77E3> <77E3> <EBF8>
+<77E5> <77E5> <F2B1>
+<77E9> <77E9> <CFBB>
+<77ED> <77ED> <D3AD>
+<77EE> <77EE> <E8E1>
+<77EF> <77EF> <CEEC>
+<77F3> <77F3> <E0B4>
+<7802> <7802> <DEE3>
+<7812> <7812> <DDF7>
+<7825> <7825> <F2B2>
+<7826> <7826> <F3F6>
+<7827> <7827> <F6DB>
+<782C> <782C> <D7FE>
+<7832> <7832> <F8DF>
+<7834> <7834> <F7F2>
+<7845> <7845> <D0A9>
+<784F> <784F> <E6DA>
+<785D> <785D> <F5A6>
+<786B> <786B> <D7BC>
+<786C> <786C> <CCE3>
+<786F> <786F> <E6DB>
+<787C> <787C> <DDDD>
+<7881> <7881> <D1B3>
+<7887> <7887> <EFED>
+<788C> <788C> <D6DE>
+<788D> <788D> <E4F4>
+<788E> <788E> <E1EF>
+<7891> <7891> <DDF8>
+<7897> <7897> <E8CF>
+<78A3> <78A3> <CAE5>
+<78A7> <78A7> <DCA1>
+<78A9> <78A9> <E0B5>
+<78BA> <78BB> <FCAC>
+<78BC> <78BC> <D8A7>
+<78C1> <78C1> <EDB8>
+<78C5> <78C5> <DBB6>
+<78CA> <78CA> <D6F0>
+<78CB> <78CB> <F3AF>
+<78CE> <78CE> <CDA5>
+<78D0> <78D0> <DAF1>
+<78E8> <78E8> <D8A8>
+<78EC> <78EC> <CCE4>
+<78EF> <78EF> <D1B4>
+<78F5> <78F5> <CAD8>
+<78FB> <78FB> <DAF2>
+<7901> <7901> <F5A7>
+<790E> <790E> <F5A8>
+<7916> <7916> <E6A6>
+<792A> <792A> <D5EC>
+<792B> <792B> <D5F8>
+<792C> <792C> <DAF3>
+<793A> <793A> <E3C6>
+<793E> <793E> <DEE4>
+<7940> <7940> <DEE5>
+<7941> <7941> <D1B5>
+<7947> <7948> <D1B6>
+<7949> <7949> <F2B3>
+<7950> <7950> <E9DE>
+<7956> <7956> <F0D3>
+<7957> <7957> <F2B4>
+endbfrange
+
+100 beginbfrange
+<795A> <795A> <F0D4>
+<795B> <795B> <CBE4>
+<795C> <795C> <FBD4>
+<795D> <795D> <F5E6>
+<795E> <795E> <E3EA>
+<7960> <7960> <DEE6>
+<7965> <7965> <DFD4>
+<7968> <7968> <F8F9>
+<796D> <796D> <F0AE>
+<797A> <797A> <D1B8>
+<797F> <797F> <D6DF>
+<7981> <7981> <D0D7>
+<798D> <798D> <FCA1>
+<798E> <798E> <EFEE>
+<798F> <798F> <DCD8>
+<7991> <7991> <E9DF>
+<79A6> <79A6> <E5DD>
+<79A7> <79A7> <FDFB>
+<79AA> <79AA> <E0C9>
+<79AE> <79AE> <D6C9>
+<79B1> <79B1> <D4AA>
+<79B3> <79B3> <E5CC>
+<79B9> <79B9> <E9E0>
+<79BD> <79BD> <D0D8>
+<79BE> <79BE> <FCA2>
+<79BF> <79BF> <D4BE>
+<79C0> <79C0> <E2B3>
+<79C1> <79C1> <DEE7>
+<79C9> <79C9> <DCBC>
+<79CA> <79CA> <D2B6>
+<79CB> <79CB> <F5D5>
+<79D1> <79D1> <CEA1>
+<79D2> <79D2> <F5A9>
+<79D5> <79D5> <DDF9>
+<79D8> <79D8> <DDFA>
+<79DF> <79DF> <F0D5>
+<79E4> <79E4> <F6DF>
+<79E6> <79E6> <F2DA>
+<79E7> <79E7> <E4EB>
+<79E9> <79E9> <F2F1>
+<79FB> <79FB> <ECB9>
+<7A00> <7A00> <FDFC>
+<7A05> <7A05> <E1AA>
+<7A08> <7A08> <CAD9>
+<7A0B> <7A0B> <EFEF>
+<7A0D> <7A0D> <F5AA>
+<7A14> <7A14> <ECF9>
+<7A17> <7A17> <F8AD>
+<7A19> <7A19> <F2C2>
+<7A1A> <7A1A> <F6C3>
+<7A1C> <7A1C> <D7D2>
+<7A1F> <7A1F> <F9A2>
+<7A20> <7A20> <F0D6>
+<7A2E> <7A2E> <F0FA>
+<7A31> <7A31> <F6E0>
+<7A36> <7A36> <E9F3>
+<7A37> <7A37> <F2C3>
+<7A3B> <7A3B> <D4AB>
+<7A3C> <7A3C> <CAB3>
+<7A3D> <7A3D> <CDA6>
+<7A3F> <7A3F> <CDC3>
+<7A40> <7A40> <CDDA>
+<7A46> <7A46> <D9CF>
+<7A49> <7A49> <F6C4>
+<7A4D> <7A4D> <EEDD>
+<7A4E> <7A4E> <E7C4>
+<7A57> <7A57> <E2B4>
+<7A61> <7A61> <DFE2>
+<7A62> <7A62> <E7DB>
+<7A69> <7A69> <E8B1>
+<7A6B> <7A6B> <FCAE>
+<7A70> <7A70> <E5CD>
+<7A74> <7A74> <FAEB>
+<7A76> <7A76> <CFBC>
+<7A79> <7A79> <CFE2>
+<7A7A> <7A7A> <CDF6>
+<7A7D> <7A7D> <EFF0>
+<7A7F> <7A7F> <F4BE>
+<7A81> <7A81> <D4CD>
+<7A84> <7A84> <F3B8>
+<7A88> <7A88> <E9A1>
+<7A92> <7A92> <F2F2>
+<7A93> <7A93> <F3EB>
+<7A95> <7A95> <F0D7>
+<7A98> <7A98> <CFD7>
+<7A9F> <7A9F> <CFDF>
+<7AA9> <7AAA> <E8C0>
+<7AAE> <7AAE> <CFE3>
+<7AAF> <7AAF> <E9A2>
+<7ABA> <7ABA> <D0AA>
+<7AC4> <7AC4> <F3C1>
+<7AC5> <7AC5> <D0AB>
+<7AC7> <7AC7> <D4E4>
+<7ACA> <7ACA> <EFBC>
+<7ACB> <7ACB> <D8A1>
+<7AD7> <7AD7> <D9DF>
+<7AD9> <7AD9> <F3D7>
+<7ADD> <7ADD> <DCBD>
+<7ADF> <7ADF> <CCE5>
+<7AE0> <7AE0> <EDF1>
+endbfrange
+
+100 beginbfrange
+<7AE3> <7AE3> <F1E2>
+<7AE5> <7AE5> <D4DB>
+<7AEA> <7AEA> <E2B5>
+<7AED> <7AED> <CAE6>
+<7AEF> <7AEF> <D3AE>
+<7AF6> <7AF6> <CCE6>
+<7AF9> <7AF9> <F1D3>
+<7AFA> <7AFA> <F5E7>
+<7AFF> <7AFF> <CADA>
+<7B0F> <7B0F> <FBEE>
+<7B11> <7B11> <E1C5>
+<7B19> <7B19> <DFE9>
+<7B1B> <7B1B> <EEDE>
+<7B1E> <7B1E> <F7C2>
+<7B20> <7B20> <D8A2>
+<7B26> <7B26> <DDAC>
+<7B2C> <7B2C> <F0AF>
+<7B2D> <7B2D> <D6BD>
+<7B39> <7B39> <E1AB>
+<7B46> <7B46> <F9B6>
+<7B49> <7B49> <D4F5>
+<7B4B> <7B4B> <D0C9>
+<7B4C> <7B4C> <EFA7>
+<7B4D> <7B4D> <E2EC>
+<7B4F> <7B4F> <DBEA>
+<7B50> <7B50> <CECC>
+<7B51> <7B51> <F5E8>
+<7B52> <7B52> <F7D5>
+<7B54> <7B54> <D3CD>
+<7B56> <7B56> <F3FE>
+<7B60> <7B60> <D0B5>
+<7B6C> <7B6C> <E0FE>
+<7B6E> <7B6E> <DFFB>
+<7B75> <7B75> <E6DD>
+<7B7D> <7B7D> <E8A4>
+<7B87> <7B87> <CBCD>
+<7B8B> <7B8B> <EFA8>
+<7B8F> <7B8F> <EEB4>
+<7B94> <7B94> <DAD8>
+<7B95> <7B95> <D1B9>
+<7B97> <7B97> <DFA9>
+<7B9A> <7B9A> <F3B0>
+<7B9D> <7B9D> <CCC4>
+<7BA1> <7BA1> <CEB7>
+<7BAD> <7BAD> <EFA9>
+<7BB1> <7BB1> <DFD5>
+<7BB4> <7BB4> <EDD7>
+<7BB8> <7BB8> <EEC6>
+<7BC0> <7BC0> <EFBD>
+<7BC1> <7BC1> <FCD6>
+<7BC4> <7BC4> <DBF4>
+<7BC6> <7BC6> <EFAA>
+<7BC7> <7BC7> <F8B9>
+<7BC9> <7BC9> <F5E9>
+<7BD2> <7BD2> <E3D9>
+<7BE0> <7BE0> <E1C6>
+<7BE4> <7BE4> <D4BF>
+<7BE9> <7BE9> <DEE8>
+<7C07> <7C07> <F0EA>
+<7C12> <7C12> <F3C2>
+<7C1E> <7C1E> <D3AF>
+<7C21> <7C21> <CADB>
+<7C27> <7C27> <FCD7>
+<7C2A> <7C2A> <EDD8>
+<7C2B> <7C2B> <E1C7>
+<7C3D> <7C3D> <F4D8>
+<7C3E> <7C3E> <D6B3>
+<7C3F> <7C3F> <DDAD>
+<7C43> <7C43> <D5BE>
+<7C4C> <7C4C> <F1C3>
+<7C4D> <7C4D> <EEDF>
+<7C60> <7C60> <D6EB>
+<7C64> <7C64> <F4D9>
+<7C6C> <7C6C> <D7E6>
+<7C73> <7C73> <DAB7>
+<7C83> <7C83> <DDFB>
+<7C89> <7C89> <DDCF>
+<7C92> <7C92> <D8A3>
+<7C95> <7C95> <DAD9>
+<7C97> <7C97> <F0D8>
+<7C98> <7C98> <EFC4>
+<7C9F> <7C9F> <E1D8>
+<7CA5> <7CA5> <F1D4>
+<7CA7> <7CA7> <EDF2>
+<7CAE> <7CAE> <D5DB>
+<7CB1> <7CB1> <D5DC>
+<7CB2> <7CB2> <F3C4>
+<7CB3> <7CB3> <CBD7>
+<7CB9> <7CB9> <E2B6>
+<7CBE> <7CBE> <EFF1>
+<7CCA> <7CCA> <FBD5>
+<7CD6> <7CD6> <D3D8>
+<7CDE> <7CDE> <DDD0>
+<7CDF> <7CDF> <F0D9>
+<7CE0> <7CE0> <CBB3>
+<7CE7> <7CE7> <D5DD>
+<7CFB> <7CFB> <CDA7>
+<7CFE> <7CFE> <D0AC>
+<7D00> <7D00> <D1BA>
+<7D02> <7D02> <F1C4>
+endbfrange
+
+100 beginbfrange
+<7D04> <7D04> <E5B3>
+<7D05> <7D05> <FBF5>
+<7D06> <7D06> <E9E1>
+<7D07> <7D07> <FDE0>
+<7D08> <7D08> <FCBC>
+<7D0A> <7D0B> <DAA2>
+<7D0D> <7D0D> <D2A1>
+<7D10> <7D10> <D2EF>
+<7D14> <7D14> <E2ED>
+<7D17> <7D17> <DEE9>
+<7D18> <7D18> <CEDC>
+<7D19> <7D19> <F2B5>
+<7D1A> <7D1A> <D0E4>
+<7D1B> <7D1B> <DDD1>
+<7D20> <7D20> <E1C8>
+<7D21> <7D21> <DBB7>
+<7D22> <7D22> <DFE3>
+<7D2B> <7D2B> <EDB9>
+<7D2C> <7D2C> <F1C5>
+<7D2E> <7D2E> <F3CF>
+<7D2F> <7D2F> <D7AB>
+<7D30> <7D30> <E1AC>
+<7D33> <7D33> <E3EB>
+<7D35> <7D35> <EEC7>
+<7D39> <7D39> <E1C9>
+<7D3A> <7D3A> <CAFA>
+<7D42> <7D42> <F0FB>
+<7D43> <7D43> <FAE1>
+<7D44> <7D44> <F0DA>
+<7D45> <7D45> <CCE7>
+<7D46> <7D46> <DAF4>
+<7D50> <7D50> <CCBF>
+<7D5E> <7D5E> <CEED>
+<7D61> <7D61> <D5A9>
+<7D62> <7D62> <FAE2>
+<7D66> <7D66> <D0E5>
+<7D68> <7D68> <EBD6>
+<7D6A> <7D6A> <ECDF>
+<7D6E> <7D6E> <DFFC>
+<7D71> <7D71> <F7D6>
+<7D72> <7D72> <DEEA>
+<7D73> <7D73> <CBB4>
+<7D76> <7D76> <EFBE>
+<7D79> <7D79> <CCB5>
+<7D7F> <7D7F> <CFBD>
+<7D8E> <7D8E> <EFF2>
+<7D8F> <7D8F> <E2B7>
+<7D93> <7D93> <CCE8>
+<7D9C> <7D9C> <F0FC>
+<7DA0> <7DA0> <D6E0>
+<7DA2> <7DA2> <F1C6>
+<7DAC> <7DAC> <E2B8>
+<7DAD> <7DAD> <EBAB>
+<7DB1> <7DB1> <CBB5>
+<7DB2> <7DB2> <D8D1>
+<7DB4> <7DB4> <F4CE>
+<7DB5> <7DB5> <F3F7>
+<7DB8> <7DB8> <D7C6>
+<7DBA> <7DBA> <D1BB>
+<7DBB> <7DBB> <F7AA>
+<7DBD> <7DBD> <EDCA>
+<7DBE> <7DBE> <D7D3>
+<7DBF> <7DBF> <D8FA>
+<7DC7> <7DC7> <F6C5>
+<7DCA> <7DCA> <D1CC>
+<7DCB> <7DCB> <DDFC>
+<7DD6> <7DD6> <DFFD>
+<7DD8> <7DD8> <F9E5>
+<7DDA> <7DDA> <E0CA>
+<7DDD> <7DDD> <F2FD>
+<7DDE> <7DDE> <D3B0>
+<7DE0> <7DE0> <F4F3>
+<7DE1> <7DE1> <DAC9>
+<7DE3> <7DE3> <E6DE>
+<7DE8> <7DE8> <F8BA>
+<7DE9> <7DE9> <E8D0>
+<7DEC> <7DEC> <D8FB>
+<7DEF> <7DEF> <EAD5>
+<7DF4> <7DF4> <D6A3>
+<7DFB> <7DFB> <F6C6>
+<7E09> <7E09> <F2DB>
+<7E0A> <7E0A> <E4FC>
+<7E15> <7E15> <E8B2>
+<7E1B> <7E1B> <DADA>
+<7E1D> <7E1D> <F2DC>
+<7E1E> <7E1E> <FBD6>
+<7E1F> <7E1F> <E9B2>
+<7E21> <7E21> <EEAD>
+<7E23> <7E23> <FAE3>
+<7E2B> <7E2B> <DCEE>
+<7E2E> <7E2E> <F5EA>
+<7E2F> <7E2F> <E6E0>
+<7E31> <7E31> <F0FD>
+<7E37> <7E37> <D7AC>
+<7E3D> <7E3D> <F5C5>
+<7E3E> <7E3E> <EEE0>
+<7E41> <7E41> <DBE5>
+<7E43> <7E43> <DDDE>
+<7E46> <7E46> <D9F0>
+<7E47> <7E47> <E9A3>
+endbfrange
+
+100 beginbfrange
+<7E52> <7E52> <F1F9>
+<7E54> <7E54> <F2C4>
+<7E55> <7E55> <E0CB>
+<7E5E> <7E5E> <E9A4>
+<7E61> <7E61> <E2B9>
+<7E69> <7E69> <E3B1>
+<7E6A> <7E6A> <FCEB>
+<7E6B> <7E6B> <CDA8>
+<7E6D> <7E6D> <CCB6>
+<7E70> <7E70> <F0DB>
+<7E79> <7E79> <E6BA>
+<7E7C> <7E7C> <CDA9>
+<7E82> <7E82> <F3C3>
+<7E8C> <7E8C> <E1D9>
+<7E8F> <7E8F> <EFAB>
+<7E93> <7E93> <E7C5>
+<7E96> <7E96> <E0E9>
+<7E98> <7E98> <F3C5>
+<7E9B> <7E9B> <D4C0>
+<7E9C> <7E9C> <D5BF>
+<7F36> <7F36> <DDAE>
+<7F38> <7F38> <F9FC>
+<7F3A> <7F3A> <CCC0>
+<7F4C> <7F4C> <E5A2>
+<7F50> <7F50> <CEB8>
+<7F54> <7F54> <D8D2>
+<7F55> <7F55> <F9D6>
+<7F6A> <7F6A> <F1AA>
+<7F6B> <7F6B> <CED1>
+<7F6E> <7F6E> <F6C7>
+<7F70> <7F70> <DBEB>
+<7F72> <7F72> <DFFE>
+<7F75> <7F75> <D8E1>
+<7F77> <7F77> <F7F3>
+<7F79> <7F79> <D7E7>
+<7F85> <7F85> <D4FE>
+<7F88> <7F88> <D1BC>
+<7F8A> <7F8A> <E5CF>
+<7F8C> <7F8C> <CBB6>
+<7F8E> <7F8E> <DAB8>
+<7F94> <7F94> <CDC4>
+<7F9A> <7F9A> <D6BE>
+<7F9E> <7F9E> <E2BA>
+<7FA4> <7FA4> <CFD8>
+<7FA8> <7FA8> <E0CC>
+<7FA9> <7FA9> <EBF9>
+<7FB2> <7FB2> <FDFD>
+<7FB8> <7FB8> <D7E8>
+<7FB9> <7FB9> <CBD8>
+<7FBD> <7FBD> <E9E2>
+<7FC1> <7FC1> <E8BA>
+<7FC5> <7FC5> <E3C7>
+<7FCA> <7FCA> <ECCD>
+<7FCC> <7FCC> <ECCE>
+<7FCE> <7FCE> <D6BF>
+<7FD2> <7FD2> <E3A7>
+<7FD4> <7FD4> <DFD6>
+<7FD5> <7FD5> <FDE8>
+<7FDF> <7FDF> <EEE1>
+<7FE0> <7FE0> <F6A8>
+<7FE1> <7FE1> <DDFD>
+<7FE9> <7FE9> <F8BB>
+<7FEB> <7FEB> <E8D1>
+<7FF0> <7FF0> <F9D7>
+<7FF9> <7FF9> <CEEE>
+<7FFC> <7FFC> <ECCF>
+<8000> <8000> <E9A5>
+<8001> <8001> <D6D5>
+<8003> <8003> <CDC5>
+<8005> <8005> <EDBA>
+<8006> <8006> <D1BD>
+<8009> <8009> <CFBE>
+<800C> <800C> <ECBB>
+<8010> <8010> <D2B1>
+<8015> <8015> <CCE9>
+<8017> <8017> <D9C4>
+<8018> <8018> <E9FC>
+<802D> <802D> <D1BE>
+<8033> <8033> <ECBC>
+<8036> <8036> <E5AD>
+<803D> <803D> <F7B0>
+<803F> <803F> <CCEA>
+<8043> <8043> <D3C4>
+<8046> <8046> <D6C0>
+<804A> <804A> <D6FD>
+<8056> <8056> <E1A1>
+<8058> <8058> <DEBD>
+<805A> <805A> <F6A9>
+<805E> <805E> <DAA4>
+<806F> <806F> <D6A4>
+<8070> <8070> <F5C6>
+<8072> <8072> <E1A2>
+<8073> <8073> <E9C6>
+<8077> <8077> <F2C5>
+<807D> <807D> <F4E9>
+<807E> <807E> <D6EC>
+<807F> <807F> <EBD3>
+<8084> <8084> <ECBD>
+<8085> <8085> <E2DC>
+<8086> <8086> <DEEB>
+endbfrange
+
+100 beginbfrange
+<8087> <8087> <F0DC>
+<8089> <8089> <EBBF>
+<808B> <808B> <D7CE>
+<808C> <808C> <D1BF>
+<8096> <8096> <F5AB>
+<809B> <809B> <F9FD>
+<809D> <809D> <CADC>
+<80A1> <80A1> <CDC6>
+<80A2> <80A2> <F2B6>
+<80A5> <80A5> <DDFE>
+<80A9> <80A9> <CCB7>
+<80AA> <80AA> <DBB8>
+<80AF> <80AF> <D0E9>
+<80B1> <80B1> <CEDD>
+<80B2> <80B2> <EBC0>
+<80B4> <80B4> <FDA2>
+<80BA> <80BA> <F8CB>
+<80C3> <80C3> <EAD6>
+<80C4> <80C4> <F1B0>
+<80CC> <80CC> <DBCE>
+<80CE> <80CE> <F7C3>
+<80DA> <80DA> <DBCF>
+<80DB> <80DB> <CBA4>
+<80DE> <80DE> <F8E0>
+<80E1> <80E1> <FBD7>
+<80E4> <80E4> <EBCA>
+<80E5> <80E5> <E0A1>
+<80F1> <80F1> <CECD>
+<80F4> <80F4> <D4DC>
+<80F8> <80F8> <FDD8>
+<80FD> <80FD> <D2F6>
+<8102> <8102> <F2B7>
+<8105> <8105> <FAF6>
+<8106> <8106> <F6AA>
+<8107> <8107> <FAF7>
+<8108> <8108> <D8E6>
+<810A> <810A> <F4B1>
+<8118> <8118> <E8D2>
+<811A> <811A> <CAC5>
+<811B> <811B> <CCEB>
+<8123> <8123> <E2EE>
+<8129> <8129> <E2BB>
+<812B> <812B> <F7AD>
+<812F> <812F> <F8E1>
+<8139> <8139> <F3EC>
+<813E> <813E> <DEA1>
+<814B> <814B> <E4FD>
+<814E> <814E> <E3EC>
+<8150> <8151> <DDAF>
+<8154> <8154> <CBB7>
+<8155> <8155> <E8D3>
+<8165> <8165> <E1A3>
+<8166> <8166> <D2E0>
+<816B> <816B> <F0FE>
+<8170> <8170> <E9A6>
+<8171> <8171> <CBF2>
+<8178> <8178> <EDF3>
+<8179> <8179> <DCD9>
+<817A> <817A> <E0CD>
+<817F> <817F> <F7DA>
+<8180> <8180> <DBB9>
+<8188> <8188> <CCAE>
+<818A> <818A> <DADB>
+<818F> <818F> <CDC7>
+<819A> <819A> <DDB1>
+<819C> <819C> <D8AF>
+<819D> <819D> <E3A3>
+<81A0> <81A0> <CEEF>
+<81A3> <81A3> <F2F3>
+<81A8> <81A8> <F8B3>
+<81B3> <81B3> <E0CE>
+<81B5> <81B5> <F5FD>
+<81BA> <81BA> <EBEC>
+<81BD> <81BD> <D3C5>
+<81BE> <81BE> <FCEC>
+<81BF> <81BF> <D2DB>
+<81C0> <81C0> <D4EB>
+<81C2> <81C2> <DEA2>
+<81C6> <81C6> <E5E6>
+<81CD> <81CD> <F0B0>
+<81D8> <81D8> <D5C4>
+<81DF> <81DF> <EDF4>
+<81E3> <81E3> <E3ED>
+<81E5> <81E5> <E8C2>
+<81E7> <81E7> <EDF5>
+<81E8> <81E8> <D7FC>
+<81EA> <81EA> <EDBB>
+<81ED> <81ED> <F6AB>
+<81F3> <81F3> <F2B8>
+<81F4> <81F4> <F6C8>
+<81FA> <81FA> <D3E6>
+<81FB> <81FB> <F2DD>
+<81FC> <81FC> <CFBF>
+<81FE> <81FE> <EBAC>
+<8205> <8205> <CFC0>
+<8207> <8207> <E6A8>
+<8208> <8208> <FDE9>
+<820A> <820A> <CFC1>
+<820C> <820C> <E0DF>
+<820D> <820D> <DEEC>
+endbfrange
+
+100 beginbfrange
+<8212> <8212> <E0A2>
+<821B> <821B> <F4BF>
+<821C> <821C> <E2EF>
+<821E> <821E> <D9F1>
+<821F> <821F> <F1C7>
+<8221> <8221> <CBB8>
+<822A> <822A> <F9FE>
+<822B> <822B> <DBBA>
+<822C> <822C> <DAF5>
+<8235> <8235> <F6EC>
+<8236> <8236> <DADC>
+<8237> <8237> <FAE4>
+<8239> <8239> <E0CF>
+<8240> <8240> <DDB2>
+<8245> <8245> <E6A9>
+<8247> <8247> <EFF3>
+<8259> <8259> <F3ED>
+<8264> <8264> <EBFA>
+<8266> <8266> <F9E6>
+<826E> <826E> <CADD>
+<826F> <826F> <D5DE>
+<8271> <8271> <CADE>
+<8272> <8272> <DFE4>
+<8276> <8276> <E6FD>
+<8278> <8278> <F5AC>
+<827E> <827E> <E4F5>
+<828B> <828B> <E9E3>
+<828D> <828D> <EDCB>
+<828E> <828E> <CFE4>
+<8292> <8292> <D8D3>
+<8299> <8299> <DDB3>
+<829A> <829A> <D4EC>
+<829D> <829D> <F2B9>
+<829F> <829F> <DFB7>
+<82A5> <82A5> <CBCE>
+<82A6> <82A6> <FBD8>
+<82A9> <82A9> <D0D9>
+<82AC> <82AC> <DDD2>
+<82AD> <82AD> <F7F4>
+<82AE> <82AE> <E7DC>
+<82AF> <82AF> <E4A5>
+<82B1> <82B1> <FCA3>
+<82B3> <82B3> <DBBB>
+<82B7> <82B7> <F2BA>
+<82B8> <82B8> <E9FD>
+<82B9> <82B9> <D0CA>
+<82BB> <82BB> <F5D6>
+<82BC> <82BC> <D9C5>
+<82BD> <82BD> <E4B4>
+<82BF> <82BF> <EDA7>
+<82D1> <82D1> <EABD>
+<82D2> <82D2> <E6FE>
+<82D4> <82D4> <F7C4>
+<82D5> <82D5> <F5AD>
+<82D7> <82D7> <D9E0>
+<82DB> <82DB> <CAB4>
+<82DE> <82DE> <F8E2>
+<82DF> <82DF> <CFC2>
+<82E1> <82E1> <ECBE>
+<82E5> <82E5> <E5B4>
+<82E6> <82E6> <CDC8>
+<82E7> <82E7> <EEC8>
+<82F1> <82F1> <E7C8>
+<82FD> <82FD> <CDC9>
+<82FE> <82FE> <F9B7>
+<8301> <8301> <F1E8>
+<8302> <8302> <D9F2>
+<8303> <8303> <DBF5>
+<8304> <8304> <CAB5>
+<8305> <8305> <D9C6>
+<8309> <8309> <D8C9>
+<8317> <8317> <D9AB>
+<8328> <8328> <EDBC>
+<832B> <832B> <D8D4>
+<832F> <832F> <DCDA>
+<8331> <8331> <E2BC>
+<8334> <8334> <FCED>
+<8335> <8335> <ECE0>
+<8336> <8336> <D2FE>
+<8338> <8338> <E9C7>
+<8339> <8339> <E6AA>
+<8340> <8340> <E2F0>
+<8347> <8347> <FABB>
+<8349> <8349> <F5AE>
+<834A> <834A> <FBAA>
+<834F> <834F> <ECFB>
+<8351> <8351> <ECBF>
+<8352> <8352> <FCD8>
+<8373> <8373> <D4E5>
+<8377> <8377> <F9C3>
+<837B> <837B> <EEE2>
+<8389> <8389> <D7E9>
+<838A> <838A> <EDF6>
+<838E> <838E> <DEED>
+<8396> <8396> <CCEC>
+<8398> <8398> <E3EE>
+<839E> <839E> <E8D4>
+<83A2> <83A2> <FAF8>
+<83A9> <83A9> <DDB4>
+<83AA> <83AA> <E4B5>
+endbfrange
+
+100 beginbfrange
+<83AB> <83AB> <D8B0>
+<83BD> <83BD> <D8D5>
+<83C1> <83C1> <F4EA>
+<83C5> <83C5> <CEB9>
+<83C9> <83C9> <D6E1>
+<83CA> <83CA> <CFD2>
+<83CC> <83CC> <D0B6>
+<83D3> <83D3> <CEA2>
+<83D6> <83D6> <F3EE>
+<83DC> <83DC> <F3F8>
+<83E9> <83E9> <DCCC>
+<83EB> <83EB> <D0CB>
+<83EF> <83EF> <FCA4>
+<83F0> <83F0> <CDCA>
+<83F1> <83F1> <D7D4>
+<83F2> <83F2> <DEA3>
+<83F4> <83F4> <E4E0>
+<83F9> <83F9> <EEC9>
+<83FD> <83FD> <E2DD>
+<8403> <8403> <F5FE>
+<8404> <8404> <D4AC>
+<840A> <840A> <D5D1>
+<840C> <840C> <D8F0>
+<840D> <840D> <F8C3>
+<840E> <840E> <EAD7>
+<8429> <8429> <F5D7>
+<842C> <842C> <D8BF>
+<8431> <8431> <FDC0>
+<8438> <8438> <EBAD>
+<843D> <843D> <D5AA>
+<8449> <8449> <E7A8>
+<8457> <8457> <EECA>
+<845B> <845B> <CAE7>
+<8461> <8461> <F8E3>
+<8463> <8463> <D4DD>
+<8466> <8466> <EAD8>
+<846B> <846B> <FBD9>
+<846C> <846C> <EDF7>
+<846F> <846F> <E5B5>
+<8475> <8475> <D0AD>
+<847A> <847A> <F1F1>
+<8490> <8490> <E2BD>
+<8494> <8494> <E3C8>
+<8499> <8499> <D9D5>
+<849C> <849C> <DFAA>
+<84A1> <84A1> <DBBC>
+<84B2> <84B2> <F8E4>
+<84B8> <84B8> <F1FA>
+<84BB> <84BB> <E5B6>
+<84BC> <84BC> <F3EF>
+<84BF> <84BF> <FBDA>
+<84C0> <84C0> <E1E0>
+<84C2> <84C2> <D9AC>
+<84C4> <84C4> <F5EB>
+<84C6> <84C6> <E0B6>
+<84C9> <84C9> <E9C8>
+<84CB> <84CB> <CBCF>
+<84CD> <84CD> <E3C9>
+<84D1> <84D1> <DEEE>
+<84DA> <84DA> <E2BE>
+<84EC> <84EC> <DCEF>
+<84EE> <84EE> <D6A5>
+<84F4> <84F4> <E2F1>
+<84FC> <84FC> <D6FE>
+<8511> <8511> <D9A1>
+<8513> <8513> <D8C0>
+<8514> <8514> <DCDB>
+<8517> <8517> <EDBD>
+<8518> <8518> <DFB8>
+<851A> <851A> <EAA5>
+<851E> <851E> <D7AD>
+<8521> <8521> <F3F9>
+<8523> <8523> <EDF8>
+<8525> <8525> <F5C7>
+<852C> <852C> <E1CA>
+<852D> <852D> <EBE3>
+<852F> <852F> <F2DE>
+<853D> <853D> <F8CC>
+<853F> <853F> <EAD9>
+<8541> <8541> <D3C6>
+<8543> <8543> <DBE6>
+<8549> <8549> <F5AF>
+<854E> <854E> <CEF0>
+<8553> <8553> <E9FE>
+<8559> <8559> <FBB6>
+<8563> <8563> <E2F2>
+<8568> <8568> <CFF2>
+<8569> <8569> <F7B9>
+<856A> <856A> <D9F3>
+<856D> <856D> <E1CB>
+<8584> <8584> <DADD>
+<8587> <8587> <DAB9>
+<858F> <858F> <EBFB>
+<8591> <8591> <CBB9>
+<8594> <8594> <EDF9>
+<859B> <859B> <E0E0>
+<85A6> <85A6> <F4C0>
+<85A8> <85A8> <FDBC>
+<85A9> <85A9> <DFB1>
+<85AA> <85AA> <E3EF>
+endbfrange
+
+100 beginbfrange
+<85AF> <85AF> <E0A3>
+<85B0> <85B0> <FDB9>
+<85BA> <85BA> <F0B1>
+<85C1> <85C1> <CDCB>
+<85C9> <85C9> <EDBE>
+<85CD> <85CD> <D5C0>
+<85CE> <85CE> <E3F0>
+<85CF> <85CF> <EDFA>
+<85D5> <85D5> <E9E4>
+<85DC> <85DC> <D5ED>
+<85DD> <85DD> <E7DD>
+<85E4> <85E4> <D4F6>
+<85E5> <85E5> <E5B7>
+<85E9> <85E9> <DBE7>
+<85EA> <85EA> <E2BF>
+<85F7> <85F7> <EECB>
+<85FA> <85FA> <D7F4>
+<85FB> <85FB> <F0DD>
+<85FF> <85FF> <CEAB>
+<8602> <8602> <E7DE>
+<8606> <8606> <D6D6>
+<8607> <8607> <E1CC>
+<860A> <860A> <E8B3>
+<8616> <8616> <E5EE>
+<8617> <8617> <DCA2>
+<861A> <861A> <E0D0>
+<862D> <862D> <D5B5>
+<863F> <863F> <D5A1>
+<864E> <864E> <FBDB>
+<8650> <8650> <F9CB>
+<8654> <8654> <CBF3>
+<8655> <8655> <F4A5>
+<865B> <865B> <FAC8>
+<865C> <865C> <D6D7>
+<865E> <865E> <E9E5>
+<865F> <865F> <FBDC>
+<8667> <8667> <FDD0>
+<8679> <8679> <FBF6>
+<868A> <868A> <DAA5>
+<868C> <868C> <DBBD>
+<8693> <8693> <ECE2>
+<86A3> <86A3> <CDF7>
+<86A4> <86A4> <F0DE>
+<86A9> <86A9> <F6C9>
+<86C7> <86C7> <DEEF>
+<86CB> <86CB> <D3B1>
+<86D4> <86D4> <FCEE>
+<86D9> <86D9> <E8C3>
+<86DB> <86DB> <F1C8>
+<86DF> <86DF> <CEF1>
+<86E4> <86E4> <F9ED>
+<86ED> <86ED> <F2F4>
+<86FE> <86FE> <E4B6>
+<8700> <8700> <F5B9>
+<8702> <8702> <DCF0>
+<8703> <8703> <E3F1>
+<8708> <8708> <E8A5>
+<8718> <8718> <F2BB>
+<871A> <871A> <DEA4>
+<871C> <871C> <DACC>
+<874E> <874E> <CAE9>
+<8755> <8755> <E3DA>
+<8757> <8757> <FCD9>
+<875F> <875F> <EADA>
+<8766> <8766> <F9C4>
+<8768> <8768> <E3A4>
+<8774> <8774> <FBDD>
+<8776> <8776> <EFCA>
+<8778> <8778> <E8C4>
+<8782> <8782> <D5CC>
+<878D> <878D> <EBD7>
+<879F> <879F> <D9AD>
+<87A2> <87A2> <FBAB>
+<87B3> <87B3> <D3D9>
+<87BA> <87BA> <D5A2>
+<87C4> <87C4> <F6DE>
+<87E0> <87E0> <DAF6>
+<87EC> <87EC> <E0D1>
+<87EF> <87EF> <E9A8>
+<87F2> <87F2> <F5F9>
+<87F9> <87F9> <FAAF>
+<87FB> <87FB> <EBFC>
+<87FE> <87FE> <E0EA>
+<8805> <8805> <E3B2>
+<881F> <881F> <D5C5>
+<8822> <8822> <F1E3>
+<8823> <8823> <D5EE>
+<8831> <8831> <CDCC>
+<8836> <8836> <EDD9>
+<883B> <883B> <D8C1>
+<8840> <8840> <FAEC>
+<8846> <8846> <F1EB>
+<884C> <884C> <FABC>
+<884D> <884D> <E6E2>
+<8852> <8852> <FAE5>
+<8853> <8853> <E2FA>
+<8857> <8857> <CAB6>
+<8859> <8859> <E4B7>
+<885B> <885B> <EADB>
+<885D> <885D> <F5FA>
+endbfrange
+
+100 beginbfrange
+<8861> <8861> <FBAC>
+<8862> <8862> <CFC3>
+<8863> <8863> <EBFD>
+<8868> <8868> <F8FA>
+<886B> <886B> <DFB9>
+<8870> <8870> <E1F1>
+<8872> <8872> <D2A4>
+<8877> <8877> <F5FB>
+<887E> <887F> <D0DA>
+<8881> <8881> <EABE>
+<8882> <8882> <D9B1>
+<8888> <8888> <CAB7>
+<888B> <888B> <D3E7>
+<888D> <888D> <F8E5>
+<8892> <8892> <D3B2>
+<8896> <8896> <E2C0>
+<8897> <8897> <F2DF>
+<889E> <889E> <CDE5>
+<88AB> <88AB> <F9AC>
+<88B4> <88B4> <CDCD>
+<88C1> <88C1> <EEAE>
+<88C2> <88C2> <D6AE>
+<88CF> <88CF> <D7EA>
+<88D4> <88D4> <E7E0>
+<88D5> <88D5> <EBAE>
+<88D9> <88D9> <CFD9>
+<88DC> <88DC> <DCCD>
+<88DD> <88DD> <EDFB>
+<88DF> <88DF> <DEF0>
+<88E1> <88E1> <D7EB>
+<88E8> <88E8> <DEA5>
+<88F3> <88F3> <DFD7>
+<88F4> <88F5> <DBD0>
+<88F8> <88F8> <D5A3>
+<88FD> <88FD> <F0B2>
+<8907> <8907> <DCDC>
+<8910> <8910> <CAE8>
+<8912> <8912> <F8E6>
+<8913> <8913> <DCCE>
+<8918> <8918> <EADC>
+<8919> <8919> <DBD2>
+<8925> <8925> <E9B3>
+<892A> <892A> <F7DB>
+<8936> <8936> <E3A8>
+<8938> <8938> <D7AE>
+<893B> <893B> <E0E1>
+<8941> <8941> <CBBA>
+<8944> <8944> <E5D1>
+<895F> <895F> <D0DC>
+<8964> <8964> <D5C1>
+<896A> <896A> <D8CA>
+<8972> <8972> <E3A9>
+<897F> <897F> <E0A4>
+<8981> <8981> <E9A9>
+<8983> <8983> <D3C7>
+<8986> <8986> <DCDD>
+<8987> <8987> <F8AE>
+<898B> <898B> <CCB8>
+<898F> <898F> <D0AE>
+<8993> <8993> <D8F2>
+<8996> <8996> <E3CA>
+<89A1> <89A1> <CCAF>
+<89A9> <89A9> <D4AD>
+<89AA> <89AA> <F6D1>
+<89B2> <89B2> <D0CC>
+<89BA> <89BA> <CAC6>
+<89BD> <89BD> <D5C2>
+<89C0> <89C0> <CEBA>
+<89D2> <89D2> <CAC7>
+<89E3> <89E3> <FAB0>
+<89F4> <89F4> <DFD8>
+<89F8> <89F8> <F5BA>
+<8A00> <8A00> <E5EB>
+<8A02> <8A02> <EFF4>
+<8A03> <8A03> <DDB5>
+<8A08> <8A08> <CDAA>
+<8A0A> <8A0A> <E3F2>
+<8A0C> <8A0C> <FBF7>
+<8A0E> <8A0E> <F7D0>
+<8A13> <8A13> <FDBA>
+<8A16> <8A16> <FDE1>
+<8A17> <8A17> <F6FE>
+<8A18> <8A18> <D1C0>
+<8A1B> <8A1B> <E8C5>
+<8A1D> <8A1D> <E4B8>
+<8A1F> <8A1F> <E1E8>
+<8A23> <8A23> <CCC1>
+<8A25> <8A25> <D2ED>
+<8A2A> <8A2A> <DBBE>
+<8A2D> <8A2D> <E0E2>
+<8A31> <8A31> <FAC9>
+<8A34> <8A34> <E1CD>
+<8A36> <8A36> <CAB8>
+<8A3A> <8A3A> <F2E0>
+<8A3B> <8A3B> <F1C9>
+<8A50> <8A50> <DEF1>
+<8A54> <8A54> <F0DF>
+<8A55> <8A55> <F8C4>
+<8A5B> <8A5B> <EECC>
+<8A5E> <8A5E> <DEF2>
+endbfrange
+
+100 beginbfrange
+<8A60> <8A60> <E7C9>
+<8A62> <8A62> <E2F3>
+<8A63> <8A63> <E7E1>
+<8A66> <8A66> <E3CB>
+<8A69> <8A69> <E3CC>
+<8A6D> <8A6D> <CFF8>
+<8A6E> <8A6E> <EFAC>
+<8A70> <8A70> <FDFE>
+<8A71> <8A71> <FCA5>
+<8A72> <8A72> <FAB1>
+<8A73> <8A73> <DFD9>
+<8A75> <8A75> <E0D2>
+<8A79> <8A79> <F4DA>
+<8A85> <8A85> <F1CA>
+<8A87> <8A87> <CEA3>
+<8A8C> <8A8C> <F2BC>
+<8A8D> <8A8D> <ECE3>
+<8A93> <8A93> <E0A5>
+<8A95> <8A95> <F7AB>
+<8A98> <8A98> <EBAF>
+<8A9E> <8A9E> <E5DE>
+<8AA0> <8AA0> <E1A4>
+<8AA1> <8AA1> <CDAB>
+<8AA3> <8AA3> <D9F4>
+<8AA4> <8AA4> <E8A6>
+<8AA5> <8AA5> <CDCE>
+<8AA6> <8AA6> <E1E9>
+<8AA8> <8AA8> <FCEF>
+<8AAA> <8AAA> <E0E3>
+<8AB0> <8AB0> <E2C1>
+<8AB2> <8AB2> <CEA4>
+<8AB9> <8AB9> <DEA6>
+<8ABC> <8ABC> <EBFE>
+<8ABE> <8ABE> <EBDD>
+<8ABF> <8ABF> <F0E0>
+<8AC2> <8AC2> <F4DB>
+<8AC4> <8AC4> <E2F4>
+<8AC7> <8AC7> <D3C8>
+<8ACB> <8ACB> <F4EB>
+<8ACD> <8ACD> <EEB5>
+<8ACF> <8ACF> <F5D8>
+<8AD2> <8AD2> <D5DF>
+<8AD6> <8AD6> <D6E5>
+<8ADB> <8ADB> <EBB0>
+<8ADC> <8ADC> <F4E3>
+<8AE1> <8AE1> <E3CD>
+<8AE6> <8AE6> <F4F4>
+<8AE7> <8AE7> <FAB2>
+<8AEA> <8AEA> <EFF5>
+<8AEB> <8AEB> <CADF>
+<8AED> <8AED> <EBB1>
+<8AEE> <8AEE> <EDBF>
+<8AF1> <8AF1> <FDC9>
+<8AF6> <8AF6> <E4A6>
+<8AF7> <8AF7> <F9A4>
+<8AF8> <8AF8> <F0B3>
+<8AFA> <8AFA> <E5EC>
+<8AFE> <8AFE> <D1E7>
+<8B00> <8B00> <D9C7>
+<8B01> <8B01> <E4D7>
+<8B02> <8B02> <EADD>
+<8B04> <8B04> <D4F7>
+<8B0E> <8B0E> <DABA>
+<8B10> <8B10> <DACD>
+<8B14> <8B14> <F9CC>
+<8B16> <8B16> <E1DA>
+<8B17> <8B17> <DBBF>
+<8B19> <8B19> <CCC5>
+<8B1A> <8B1A> <ECD0>
+<8B1B> <8B1B> <CBBB>
+<8B1D> <8B1D> <DEF3>
+<8B20> <8B20> <E9AA>
+<8B28> <8B28> <D9C8>
+<8B2B> <8B2B> <EEE3>
+<8B2C> <8B2C> <D7BD>
+<8B33> <8B33> <CFC4>
+<8B39> <8B39> <D0CD>
+<8B41> <8B41> <FCA6>
+<8B49> <8B49> <F1FB>
+<8B4E> <8B4E> <FDD2>
+<8B4F> <8B4F> <D1C1>
+<8B58> <8B58> <E3DB>
+<8B5A> <8B5A> <D3C9>
+<8B5C> <8B5C> <DCCF>
+<8B66> <8B66> <CCED>
+<8B6C> <8B6C> <DEA7>
+<8B6F> <8B6F> <E6BB>
+<8B70> <8B70> <ECA1>
+<8B74> <8B74> <CCB9>
+<8B77> <8B77> <FBDE>
+<8B7D> <8B7D> <E7E2>
+<8B80> <8B80> <D4C1>
+<8B8A> <8B8A> <DCA8>
+<8B90> <8B90> <E2C2>
+<8B92> <8B92> <F3D8>
+<8B93> <8B93> <E5D3>
+<8B96> <8B96> <F3D9>
+<8B9A> <8B9A> <F3C6>
+<8C37> <8C37> <CDDB>
+<8C3F> <8C3F> <CDAC>
+endbfrange
+
+100 beginbfrange
+<8C41> <8C41> <FCC3>
+<8C46> <8C46> <D4E7>
+<8C48> <8C48> <D1C2>
+<8C4A> <8C4A> <F9A5>
+<8C4C> <8C4C> <E8D5>
+<8C55> <8C55> <E3CE>
+<8C5A> <8C5A> <D4CA>
+<8C61> <8C61> <DFDA>
+<8C6A> <8C6A> <FBDF>
+<8C6B> <8C6B> <E7E3>
+<8C79> <8C79> <F8FB>
+<8C7A> <8C7A> <E3CF>
+<8C82> <8C82> <F5B0>
+<8C8A> <8C8A> <D8E7>
+<8C8C> <8C8C> <D9C9>
+<8C9D> <8C9D> <F8AF>
+<8C9E> <8C9E> <EFF6>
+<8CA0> <8CA0> <DDB6>
+<8CA1> <8CA1> <EEAF>
+<8CA2> <8CA2> <CDF8>
+<8CA7> <8CA7> <DEB8>
+<8CA8> <8CA8> <FCA7>
+<8CA9> <8CA9> <F7FC>
+<8CAA> <8CAA> <F7B1>
+<8CAB> <8CAB> <CEBB>
+<8CAC> <8CAC> <F4A1>
+<8CAF> <8CAF> <EECD>
+<8CB0> <8CB0> <E1AE>
+<8CB3> <8CB3> <ECC3>
+<8CB4> <8CB4> <CFFE>
+<8CB6> <8CB6> <F8BF>
+<8CB7> <8CB7> <D8E2>
+<8CB8> <8CB8> <D3E8>
+<8CBB> <8CBB> <DEA8>
+<8CBC> <8CBC> <F4E4>
+<8CBD> <8CBD> <ECC2>
+<8CBF> <8CBF> <D9F5>
+<8CC0> <8CC0> <F9C5>
+<8CC1> <8CC1> <DDD3>
+<8CC2> <8CC2> <D6F1>
+<8CC3> <8CC3> <ECFC>
+<8CC4> <8CC4> <FCF0>
+<8CC7> <8CC7> <EDC0>
+<8CC8> <8CC8> <CAB9>
+<8CCA> <8CCA> <EEE4>
+<8CD1> <8CD1> <F2E1>
+<8CD3> <8CD3> <DEB9>
+<8CDA> <8CDA> <D6F2>
+<8CDC> <8CDC> <DEF4>
+<8CDE> <8CDE> <DFDB>
+<8CE0> <8CE0> <DBD3>
+<8CE2> <8CE2> <FAE7>
+<8CE3> <8CE3> <D8E3>
+<8CE4> <8CE4> <F4C1>
+<8CE6> <8CE6> <DDB7>
+<8CEA> <8CEA> <F2F5>
+<8CED> <8CED> <D4AE>
+<8CF4> <8CF4> <D6F3>
+<8CFB> <8CFB> <DDB8>
+<8CFC> <8CFC> <CFC5>
+<8CFD> <8CFD> <DFDF>
+<8D04> <8D04> <F2BE>
+<8D05> <8D05> <F6A1>
+<8D07> <8D07> <EBCB>
+<8D08> <8D08> <F1FC>
+<8D0A> <8D0A> <F3C7>
+<8D0D> <8D0D> <E0EB>
+<8D13> <8D13> <EDFC>
+<8D16> <8D16> <E1DB>
+<8D64> <8D64> <EEE5>
+<8D66> <8D66> <DEF5>
+<8D6B> <8D6B> <FAD3>
+<8D70> <8D70> <F1CB>
+<8D73> <8D73> <D0AF>
+<8D74> <8D74> <DDB9>
+<8D77> <8D77> <D1C3>
+<8D85> <8D85> <F5B1>
+<8D8A> <8D8A> <EAC6>
+<8D99> <8D99> <F0E1>
+<8DA3> <8DA3> <F6AC>
+<8DA8> <8DA8> <F5D9>
+<8DB3> <8DB3> <F0EB>
+<8DBA> <8DBA> <DDBA>
+<8DBE> <8DBE> <F2BF>
+<8DC6> <8DC6> <F7C5>
+<8DCB> <8DCB> <DBA2>
+<8DCC> <8DCC> <F2F6>
+<8DCF> <8DCF> <CABA>
+<8DDB> <8DDB> <F7F5>
+<8DDD> <8DDD> <CBE5>
+<8DE1> <8DE1> <EEE6>
+<8DE3> <8DE3> <E0D3>
+<8DE8> <8DE8> <CEA5>
+<8DEF> <8DEF> <D6D8>
+<8DF3> <8DF3> <D4AF>
+<8E0A> <8E0A> <E9C9>
+<8E0F> <8E0F> <D3CE>
+<8E10> <8E10> <F4C2>
+<8E1E> <8E1E> <CBE6>
+<8E2A> <8E2A> <F1A1>
+endbfrange
+
+100 beginbfrange
+<8E30> <8E30> <EBB2>
+<8E35> <8E35> <F1A2>
+<8E42> <8E42> <EBB3>
+<8E44> <8E44> <F0B4>
+<8E47> <8E47> <CBF4>
+<8E48> <8E48> <D4B0>
+<8E49> <8E49> <F3B2>
+<8E4A> <8E4A> <FBB7>
+<8E59> <8E59> <F5EC>
+<8E5F> <8E5F> <EEE7>
+<8E60> <8E60> <F4B2>
+<8E74> <8E74> <F5ED>
+<8E76> <8E76> <CFF3>
+<8E81> <8E81> <F0E2>
+<8E87> <8E87> <EECE>
+<8E8A> <8E8A> <F1CC>
+<8E8D> <8E8D> <E5B8>
+<8EAA> <8EAA> <D7F5>
+<8EAB> <8EAB> <E3F3>
+<8EAC> <8EAC> <CFE5>
+<8EC0> <8EC0> <CFC6>
+<8ECA> <8ECA> <F3B3>
+<8ECB> <8ECB> <E4D8>
+<8ECC> <8ECC> <CFF9>
+<8ECD> <8ECD> <CFDA>
+<8ED2> <8ED2> <FACD>
+<8EDF> <8EDF> <E6E3>
+<8EEB> <8EEB> <F2E2>
+<8EF8> <8EF8> <F5EE>
+<8EFB> <8EFB> <CABB>
+<8EFE> <8EFE> <E3DC>
+<8F03> <8F03> <CEF2>
+<8F05> <8F05> <D6D9>
+<8F09> <8F09> <EEB0>
+<8F12> <8F12> <F4E5>
+<8F13> <8F13> <D8C2>
+<8F14> <8F14> <DCD0>
+<8F15> <8F15> <CCEE>
+<8F1B> <8F1B> <D5E0>
+<8F1C> <8F1C> <F6CA>
+<8F1D> <8F1D> <FDCA>
+<8F1E> <8F1E> <D8D6>
+<8F1F> <8F1F> <F4CF>
+<8F26> <8F26> <D6A6>
+<8F27> <8F27> <DCBE>
+<8F29> <8F29> <DBD4>
+<8F2A> <8F2A> <D7C7>
+<8F2F> <8F2F> <F2FE>
+<8F33> <8F33> <F1CD>
+<8F38> <8F38> <E2C3>
+<8F39> <8F39> <DCDE>
+<8F3B> <8F3B> <DCDF>
+<8F3E> <8F3E> <EFAD>
+<8F3F> <8F3F> <E6AB>
+<8F44> <8F44> <F9DD>
+<8F45> <8F45> <EABF>
+<8F49> <8F49> <EFAE>
+<8F4D> <8F4D> <F4D0>
+<8F4E> <8F4E> <CEF3>
+<8F5D> <8F5D> <E6AC>
+<8F5F> <8F5F> <CEDE>
+<8F62> <8F62> <D5F9>
+<8F9B> <8F9B> <E3F4>
+<8F9C> <8F9C> <CDD0>
+<8FA3> <8FA3> <D5B8>
+<8FA6> <8FA6> <F7FD>
+<8FA8> <8FA8> <DCA9>
+<8FAD> <8FAD> <DEF6>
+<8FAF> <8FAF> <DCAA>
+<8FB0> <8FB0> <F2E3>
+<8FB1> <8FB1> <E9B4>
+<8FB2> <8FB2> <D2DC>
+<8FC2> <8FC2> <E9E6>
+<8FC5> <8FC5> <E3F6>
+<8FCE> <8FCE> <E7CA>
+<8FD1> <8FD1> <D0CE>
+<8FD4> <8FD4> <DAF7>
+<8FE6> <8FE6> <CABC>
+<8FEA> <8FEA> <EEE8>
+<8FEB> <8FEB> <DADE>
+<8FED> <8FED> <F2F7>
+<8FF0> <8FF0> <E2FB>
+<8FF2> <8FF2> <CCA6>
+<8FF7> <8FF7> <DABB>
+<8FF9> <8FF9> <EEE9>
+<8FFD> <8FFD> <F5DA>
+<9000> <9000> <F7DC>
+<9001> <9001> <E1EA>
+<9002> <9002> <CEC1>
+<9003> <9003> <D4B1>
+<9005> <9005> <FDB1>
+<9006> <9006> <E6BD>
+<9008> <9008> <FBAD>
+<900B> <900B> <F8E7>
+<900D> <900D> <E1CE>
+<900F> <900F> <F7E2>
+<9010> <9010> <F5EF>
+<9011> <9011> <CFC7>
+<9014> <9014> <D4B2>
+<9015> <9015> <CCEF>
+endbfrange
+
+100 beginbfrange
+<9017> <9017> <D4E8>
+<9019> <9019> <EECF>
+<901A> <901A> <F7D7>
+<901D> <901D> <E0A6>
+<901E> <901E> <D6C1>
+<901F> <901F> <E1DC>
+<9020> <9020> <F0E3>
+<9021> <9021> <F1E4>
+<9022> <9022> <DCF1>
+<9023> <9023> <D6A7>
+<902E> <902E> <F4F5>
+<9031> <9031> <F1CE>
+<9032> <9032> <F2E4>
+<9035> <9035> <D0B0>
+<9038> <9038> <ECEF>
+<903C> <903C> <F9BA>
+<903E> <903E> <EBB5>
+<9041> <9041> <D4ED>
+<9042> <9042> <E2C4>
+<9047> <9047> <E9E7>
+<904A> <904A> <EBB4>
+<904B> <904B> <EAA1>
+<904D> <904D> <F8BC>
+<904E> <904E> <CEA6>
+<9050> <9050> <F9C6>
+<9051> <9051> <FCDA>
+<9053> <9053> <D4B3>
+<9054> <9054> <D3B9>
+<9055> <9055> <EADE>
+<9059> <9059> <E9AB>
+<905C> <905C> <E1E1>
+<905D> <905D> <D3CF>
+<905E> <905E> <F4F6>
+<9060> <9060> <EAC0>
+<9061> <9061> <E1CF>
+<9063> <9063> <CCBA>
+<9069> <9069> <EEEA>
+<906D> <906D> <F0E4>
+<906E> <906E> <F3B4>
+<906F> <906F> <D4EE>
+<9072> <9072> <F2C0>
+<9075> <9075> <F1E5>
+<9077> <9077> <F4C3>
+<9078> <9078> <E0D4>
+<907A> <907A> <EBB6>
+<907C> <907C> <D7A1>
+<907D> <907D> <CBE8>
+<907F> <907F> <F9AD>
+<9080> <9080> <E9AD>
+<9081> <9081> <D8E4>
+<9082> <9082> <FAB3>
+<9083> <9083> <E2C5>
+<9084> <9084> <FCBD>
+<9087> <9087> <ECC4>
+<9088> <9088> <D8B1>
+<908A> <908A> <DCAB>
+<908F> <908F> <D5A4>
+<9091> <9091> <EBE9>
+<9095> <9095> <E8BB>
+<9099> <9099> <D8D7>
+<90A2> <90A2> <FBAE>
+<90A3> <90A3> <D1E1>
+<90A6> <90A6> <DBC0>
+<90A8> <90A8> <F5BE>
+<90AA> <90AA> <DEF7>
+<90AF> <90AF> <CAFB>
+<90B0> <90B0> <F7C6>
+<90B1> <90B1> <CFC8>
+<90B5> <90B5> <E1D0>
+<90B8> <90B8> <EED0>
+<90C1> <90C1> <E9F4>
+<90CA> <90CA> <CEF4>
+<90DE> <90DE> <D5CD>
+<90E1> <90E1> <CFDB>
+<90E8> <90E8> <DDBB>
+<90ED> <90ED> <CEAC>
+<90F5> <90F5> <E9E8>
+<90FD> <90FD> <D4B4>
+<9102> <9102> <E4C7>
+<9112> <9112> <F5DB>
+<9115> <9115> <FAC1>
+<9119> <9119> <DEA9>
+<9127> <9127> <D4F8>
+<912D> <912D> <EFF7>
+<9132> <9132> <D3B3>
+<9149> <9149> <EBB7>
+<914A> <914A> <EFF8>
+<914B> <914B> <F5DC>
+<914C> <914C> <EDCC>
+<914D> <914D> <DBD5>
+<914E> <914E> <F1CF>
+<9152> <9152> <F1D0>
+<9162> <9162> <F5B2>
+<9169> <9169> <D9AE>
+<916A> <916A> <D5AC>
+<916C> <916C> <E2C6>
+<9175> <9175> <FDA3>
+<9177> <9177> <FBE5>
+<9178> <9178> <DFAB>
+<9187> <9187> <E2F5>
+endbfrange
+
+100 beginbfrange
+<9189> <9189> <F6AD>
+<918B> <918B> <F5B3>
+<918D> <918D> <F0B5>
+<9192> <9192> <E1A5>
+<919C> <919C> <F5DD>
+<91AB> <91AB> <ECA2>
+<91AC> <91AC> <EDFD>
+<91AE> <91AE> <F5B4>
+<91AF> <91AF> <FBB8>
+<91B1> <91B1> <DBA3>
+<91B4> <91B4> <D6CA>
+<91B5> <91B5> <CBD9>
+<91C0> <91C0> <E5D4>
+<91C7> <91C7> <F3FA>
+<91C9> <91C9> <EBB8>
+<91CB> <91CB> <E0B7>
+<91CC> <91CC> <D7EC>
+<91CD> <91CD> <F1EC>
+<91CE> <91CE> <E5AF>
+<91CF> <91CF> <D5E1>
+<91D0> <91D0> <D7ED>
+<91D1> <91D1> <D1D1>
+<91D7> <91D7> <E1F2>
+<91D8> <91D8> <EFF9>
+<91DC> <91DC> <DDBC>
+<91DD> <91DD> <F6DC>
+<91E3> <91E3> <F0E5>
+<91E7> <91E7> <F4C4>
+<91EA> <91EA> <E9E9>
+<91F5> <91F5> <F3FB>
+<920D> <920D> <D4EF>
+<9210> <9210> <CCA2>
+<9211> <9211> <F7FE>
+<9212> <9212> <DFBC>
+<9217> <9217> <EBCD>
+<921E> <921E> <D0B7>
+<9234> <9234> <D6C2>
+<923A> <923A> <E8AD>
+<923F> <923F> <EFAF>
+<9240> <9240> <CBA5>
+<9245> <9245> <CBE9>
+<9249> <9249> <FAE8>
+<9257> <9257> <CCC6>
+<925B> <925B> <E6E7>
+<925E> <925E> <EAC7>
+<9262> <9262> <DBA4>
+<9264> <9264> <CFC9>
+<9265> <9265> <E2FC>
+<9266> <9266> <EFFA>
+<9280> <9280> <EBDE>
+<9283> <9283> <F5C8>
+<9285> <9285> <D4DE>
+<9291> <9291> <E0D5>
+<9293> <9293> <EFB0>
+<9296> <9296> <E2C7>
+<9298> <9298> <D9AF>
+<929C> <929C> <F9E7>
+<92B3> <92B3> <E7E5>
+<92B6> <92B6> <CFCA>
+<92B7> <92B7> <E1D1>
+<92B9> <92B9> <E2C8>
+<92CC> <92CC> <EFFB>
+<92CF> <92CF> <FAF9>
+<92D2> <92D2> <DCF2>
+<92E4> <92E4> <E0A7>
+<92EA> <92EA> <F8E8>
+<92F8> <92F8> <CBEA>
+<92FC> <92FC> <CBBC>
+<9304> <9304> <D6E2>
+<9310> <9310> <F5DE>
+<9318> <9318> <F5DF>
+<931A> <931A> <EEB6>
+<931E> <931E> <E2F6>
+<931F> <931F> <D3CA>
+<9320> <9320> <EFFC>
+<9321> <9321> <D1C4>
+<9322> <9322> <EFB1>
+<9324> <9324> <D1C5>
+<9326> <9326> <D0DE>
+<9328> <9328> <D9E1>
+<932B> <932B> <E0B8>
+<932E> <932E> <CDD1>
+<932F> <932F> <F3B9>
+<9348> <9348> <E7CC>
+<934A> <934A> <D6A8>
+<934B> <934B> <CEA7>
+<934D> <934D> <D4B5>
+<9354> <9354> <E4C8>
+<935B> <935B> <D3B4>
+<936E> <936E> <EBB9>
+<9375> <9375> <CBF5>
+<937C> <937C> <F6DD>
+<937E> <937E> <F1A3>
+<938C> <938C> <CCC7>
+<9394> <9394> <E9CA>
+<9396> <9396> <E1F0>
+<939A> <939A> <F5E0>
+<93A3> <93A3> <FBAF>
+<93A7> <93A7> <CBD1>
+<93AC> <93AC> <FBE0>
+endbfrange
+
+100 beginbfrange
+<93AD> <93AD> <F2E5>
+<93B0> <93B0> <ECF0>
+<93C3> <93C3> <F0EC>
+<93D1> <93D1> <EEEB>
+<93DE> <93DE> <E9CB>
+<93E1> <93E1> <CCF0>
+<93E4> <93E4> <D7AF>
+<93F6> <93F6> <F3A1>
+<9404> <9404> <FCF5>
+<9418> <9418> <F1A4>
+<9425> <9425> <E0D6>
+<942B> <942B> <EFB2>
+<9435> <9435> <F4D1>
+<9438> <9438> <F7A1>
+<9444> <9444> <F1D1>
+<9451> <9452> <CAFC>
+<945B> <945B> <CECE>
+<947D> <947D> <F3C8>
+<947F> <947F> <F3BA>
+<9577> <9577> <EDFE>
+<9580> <9580> <DAA6>
+<9583> <9583> <E0EC>
+<9589> <9589> <F8CD>
+<958B> <958B> <CBD2>
+<958F> <958F> <EBCE>
+<9591> <9592> <F9D8>
+<9593> <9593> <CAE0>
+<9594> <9594> <DACA>
+<9598> <9598> <CBA6>
+<95A3> <95A3> <CAC8>
+<95A4> <95A4> <F9EE>
+<95A5> <95A5> <DBEC>
+<95A8> <95A8> <D0B1>
+<95AD> <95AD> <D5EF>
+<95B1> <95B1> <E6F3>
+<95BB> <95BB> <E7A2>
+<95BC> <95BC> <E4D9>
+<95C7> <95C7> <E4E1>
+<95CA> <95CA> <FCC4>
+<95D4> <95D4> <F9EF>
+<95D5> <95D5> <CFF4>
+<95D6> <95D6> <F7E6>
+<95DC> <95DC> <CEBC>
+<95E1> <95E1> <F4C5>
+<95E2> <95E2> <DCA3>
+<961C> <961C> <DDBD>
+<9621> <9621> <F4C6>
+<962A> <962A> <F8A1>
+<962E> <962E> <E8D6>
+<9632> <9632> <DBC1>
+<963B> <963B> <F0E6>
+<963F> <963F> <E4B9>
+<9640> <9640> <F6ED>
+<9642> <9642> <F9AE>
+<9644> <9644> <DDBE>
+<964B> <964B> <D7B0>
+<964C> <964C> <D8E8>
+<964D> <964D> <CBBD>
+<9650> <9650> <F9DA>
+<965B> <965B> <F8CE>
+<965C> <965C> <F9F0>
+<965D> <965D> <E0ED>
+<965E> <965E> <E3B3>
+<965F> <965F> <F4B3>
+<9662> <9662> <EAC2>
+<9663> <9663> <F2E6>
+<9664> <9664> <F0B6>
+<966A> <966A> <DBD6>
+<9670> <9670> <EBE4>
+<9673> <9673> <F2E7>
+<9675> <9675> <D7D5>
+<9676> <9676> <D4B6>
+<9677> <9677> <F9E8>
+<9678> <9678> <D7C1>
+<967D> <967D> <E5D5>
+<9685> <9685> <E9EA>
+<9686> <9686> <D7CC>
+<968A> <968A> <D3E9>
+<968B> <968B> <E2C9>
+<968D> <968D> <FCDB>
+<968E> <968E> <CDAD>
+<9694> <9694> <CCB0>
+<9695> <9695> <EAA2>
+<9698> <9698> <E4F6>
+<9699> <9699> <D0C0>
+<969B> <969B> <F0B7>
+<969C> <969C> <EEA1>
+<96A3> <96A3> <D7F6>
+<96A7> <96A8> <E2CA>
+<96AA> <96AA> <FACF>
+<96B1> <96B1> <EBDF>
+<96B7> <96B7> <D6CB>
+<96BB> <96BB> <F4B4>
+<96C0> <96C0> <EDCD>
+<96C1> <96C1> <E4D2>
+<96C4> <96C4> <EAA9>
+<96C5> <96C5> <E4BA>
+<96C6> <96C6> <F3A2>
+<96C7> <96C7> <CDD2>
+<96C9> <96C9> <F6CB>
+endbfrange
+
+100 beginbfrange
+<96CB> <96CB> <F1E6>
+<96CC> <96CC> <EDC1>
+<96CD> <96CD> <E8BC>
+<96CE> <96CE> <EED1>
+<96D5> <96D5> <F0E7>
+<96D6> <96D6> <E2CC>
+<96D9> <96D9> <E4AA>
+<96DB> <96DB> <F5E1>
+<96DC> <96DC> <EDDA>
+<96E2> <96E2> <D7EE>
+<96E3> <96E3> <D1F1>
+<96E8> <96E9> <E9EB>
+<96EA> <96EA> <E0E4>
+<96EF> <96EF> <DAA7>
+<96F0> <96F0> <DDD4>
+<96F2> <96F2> <EAA3>
+<96F6> <96F6> <D6C3>
+<96F7> <96F7> <D6F4>
+<96F9> <96F9> <DADF>
+<96FB> <96FB> <EFB3>
+<9700> <9700> <E2CD>
+<9706> <9706> <EFFD>
+<9707> <9707> <F2E8>
+<9711> <9711> <EFC5>
+<9713> <9713> <E7E7>
+<9716> <9716> <D7FD>
+<9719> <9719> <E7CE>
+<971C> <971C> <DFDC>
+<971E> <971E> <F9C7>
+<9727> <9727> <D9F6>
+<9730> <9730> <DFAC>
+<9732> <9732> <D6DA>
+<9739> <9739> <DCA4>
+<973D> <973D> <F0B8>
+<9742> <9742> <D5FA>
+<9744> <9744> <E4F7>
+<9748> <9748> <D6C4>
+<9751> <9751> <F4EC>
+<9756> <9756> <EFFE>
+<975C> <975C> <F0A1>
+<975E> <975E> <DEAA>
+<9761> <9761> <DABC>
+<9762> <9762> <D8FC>
+<9769> <9769> <FAD4>
+<976D> <976D> <ECE5>
+<9774> <9774> <FCA8>
+<9777> <9777> <ECE6>
+<977A> <977A> <D8CB>
+<978B> <978B> <FBB9>
+<978D> <978D> <E4D3>
+<978F> <978F> <CDF9>
+<97A0> <97A0> <CFD3>
+<97A8> <97A8> <CAEA>
+<97AB> <97AB> <CFD4>
+<97AD> <97AD> <F8BD>
+<97C6> <97C6> <F4C7>
+<97CB> <97CB> <EADF>
+<97D3> <97D3> <F9DB>
+<97DC> <97DC> <D4B7>
+<97F3> <97F3> <EBE5>
+<97F6> <97F6> <E1D2>
+<97FB> <97FB> <EAA4>
+<97FF> <97FF> <FAC2>
+<9800> <9800> <FBE1>
+<9801> <9801> <FAED>
+<9802> <9802> <F0A2>
+<9803> <9803> <CCF1>
+<9805> <9805> <FAA3>
+<9806> <9806> <E2F7>
+<9808> <9808> <E2CE>
+<980A> <980A> <E9F5>
+<980C> <980C> <E1EB>
+<9810> <9810> <E7E8>
+<9811> <9811> <E8D7>
+<9812> <9812> <DAF8>
+<9813> <9813> <D4CB>
+<9817> <9817> <F7F6>
+<9818> <9818> <D6C5>
+<982D> <982D> <D4E9>
+<9830> <9830> <FAFA>
+<9838> <9838> <CCF2>
+<9839> <9839> <F7DD>
+<983B> <983B> <DEBA>
+<9846> <9846> <CEA8>
+<984C> <984C> <F0B9>
+<984D> <984D> <E4FE>
+<984E> <984E> <E4C9>
+<9854> <9854> <E4D4>
+<9858> <9858> <EAC3>
+<985A> <985A> <EFB4>
+<985E> <985E> <D7BE>
+<9865> <9865> <FBE2>
+<9867> <9867> <CDD3>
+<986B> <986B> <EFB5>
+<986F> <986F> <FAE9>
+<98A8> <98A8> <F9A6>
+<98AF> <98AF> <DFBD>
+<98B1> <98B1> <F7C7>
+<98C4> <98C4> <F8FD>
+<98C7> <98C7> <F8FC>
+endbfrange
+
+100 beginbfrange
+<98DB> <98DB> <DEAB>
+<98DC> <98DC> <DBE8>
+<98DF> <98DF> <E3DD>
+<98E1> <98E1> <E1E2>
+<98E2> <98E2> <D1C6>
+<98ED> <98ED> <F6D0>
+<98EE> <98EE> <EBE6>
+<98EF> <98EF> <DAF9>
+<98F4> <98F4> <ECC7>
+<98FC> <98FC> <DEF8>
+<98FD> <98FD> <F8E9>
+<98FE> <98FE> <E3DE>
+<9903> <9903> <CEF5>
+<9909> <9909> <FAC3>
+<990A> <990A> <E5D7>
+<990C> <990C> <ECC8>
+<9910> <9910> <F3C9>
+<9913> <9913> <E4BB>
+<9918> <9918> <E6AE>
+<991E> <991E> <EFB6>
+<9920> <9920> <DCBF>
+<9928> <9928> <CEBD>
+<9945> <9945> <D8C3>
+<9949> <9949> <D0CF>
+<994B> <994B> <CFFA>
+<994C> <994C> <F3CA>
+<994D> <994D> <E0D7>
+<9951> <9951> <D1C7>
+<9952> <9952> <E9AE>
+<9954> <9954> <E8BD>
+<9957> <9957> <FAC4>
+<9996> <9996> <E2CF>
+<9999> <9999> <FAC5>
+<999D> <999D> <F9B8>
+<99A5> <99A5> <DCE0>
+<99A8> <99A8> <FBB0>
+<99AC> <99AC> <D8A9>
+<99AD> <99AD> <E5DF>
+<99AE> <99AE> <F9A7>
+<99B1> <99B1> <F6EE>
+<99B3> <99B3> <F6CC>
+<99B4> <99B4> <E2F8>
+<99B9> <99B9> <ECF1>
+<99C1> <99C1> <DAE0>
+<99D0> <99D0> <F1D2>
+<99D1> <99D1> <D2CC>
+<99D2> <99D2> <CFCB>
+<99D5> <99D5> <CABD>
+<99D9> <99D9> <DDBF>
+<99DD> <99DD> <F6EF>
+<99DF> <99DF> <DEF9>
+<99ED> <99ED> <FAB4>
+<99F1> <99F1> <D5AD>
+<99FF> <99FF> <F1E7>
+<9A01> <9A01> <DEBE>
+<9A08> <9A08> <DCC0>
+<9A0E> <9A0F> <D1C8>
+<9A19> <9A19> <F8BE>
+<9A2B> <9A2B> <CBF6>
+<9A30> <9A30> <D4F9>
+<9A36> <9A36> <F5E2>
+<9A37> <9A37> <E1D3>
+<9A40> <9A40> <D8E9>
+<9A43> <9A43> <F8FE>
+<9A45> <9A45> <CFCC>
+<9A4D> <9A4D> <FDA4>
+<9A55> <9A55> <CEF6>
+<9A57> <9A57> <FAD0>
+<9A5A> <9A5A> <CCF3>
+<9A5B> <9A5B> <E6BE>
+<9A5F> <9A5F> <F6AE>
+<9A62> <9A62> <D5F0>
+<9A65> <9A65> <D1CA>
+<9A69> <9A69> <FCBE>
+<9A6A> <9A6A> <D5F1>
+<9AA8> <9AA8> <CDE9>
+<9AB8> <9AB8> <FAB5>
+<9AD3> <9AD3> <E2D0>
+<9AD4> <9AD4> <F4F7>
+<9AD8> <9AD8> <CDD4>
+<9AE5> <9AE5> <E7A3>
+<9AEE> <9AEE> <DBA5>
+<9B1A> <9B1A> <E2D1>
+<9B27> <9B27> <D7A2>
+<9B2A> <9B2A> <F7E3>
+<9B31> <9B31> <EAA6>
+<9B3C> <9B3C> <D0A1>
+<9B41> <9B41> <CEDA>
+<9B42> <9B42> <FBEB>
+<9B43> <9B43> <DBA6>
+<9B44> <9B44> <DBDE>
+<9B45> <9B45> <D8E5>
+<9B4F> <9B4F> <EAE0>
+<9B54> <9B54> <D8AA>
+<9B5A> <9B5A> <E5E0>
+<9B6F> <9B6F> <D6DB>
+<9B8E> <9B8E> <EFC6>
+<9B91> <9B91> <F8EA>
+<9B9F> <9B9F> <E4D5>
+<9BAB> <9BAB> <CEF7>
+endbfrange
+
+100 beginbfrange
+<9BAE> <9BAE> <E0D8>
+<9BC9> <9BC9> <D7EF>
+<9BD6> <9BD6> <F4ED>
+<9BE4> <9BE4> <CDE6>
+<9BE8> <9BE8> <CCF4>
+<9C0D> <9C0D> <F5E3>
+<9C10> <9C10> <E4CA>
+<9C12> <9C12> <DCE1>
+<9C15> <9C15> <F9C8>
+<9C25> <9C25> <FCBF>
+<9C32> <9C32> <E8A7>
+<9C3B> <9C3B> <D8C4>
+<9C47> <9C47> <CBBE>
+<9C49> <9C49> <DCAE>
+<9C57> <9C57> <D7F7>
+<9CE5> <9CE5> <F0E8>
+<9CE7> <9CE7> <DDC0>
+<9CE9> <9CE9> <CFCD>
+<9CF3> <9CF3> <DCF3>
+<9CF4> <9CF4> <D9B0>
+<9CF6> <9CF6> <E6E9>
+<9D09> <9D09> <E4BC>
+<9D1B> <9D1B> <EAC4>
+<9D26> <9D26> <E4EC>
+<9D28> <9D28> <E4E5>
+<9D3B> <9D3B> <FBF8>
+<9D51> <9D51> <CCBB>
+<9D5D> <9D5D> <E4BD>
+<9D60> <9D60> <CDDC>
+<9D61> <9D61> <D9F7>
+<9D6C> <9D6C> <DDDF>
+<9D72> <9D72> <EDCE>
+<9DA9> <9DA9> <D9D0>
+<9DAF> <9DAF> <E5A3>
+<9DB4> <9DB4> <F9CD>
+<9DC4> <9DC4> <CDAE>
+<9DD7> <9DD7> <CFCE>
+<9DF2> <9DF2> <F6AF>
+<9DF8> <9DF8> <FDD3>
+<9DF9> <9DF9> <EBED>
+<9DFA> <9DFA> <D6DC>
+<9E1A> <9E1A> <E5A4>
+<9E1E> <9E1E> <D5B6>
+<9E75> <9E75> <D6DD>
+<9E79> <9E79> <F9E9>
+<9E7D> <9E7D> <E7A4>
+<9E7F> <9E7F> <D6E3>
+<9E92> <9E92> <D1CB>
+<9E93> <9E93> <D6E4>
+<9E97> <9E97> <D5F2>
+<9E9D> <9E9D> <DEFA>
+<9E9F> <9E9F> <D7F8>
+<9EA5> <9EA5> <D8EA>
+<9EB4> <9EB4> <CFD5>
+<9EB5> <9EB5> <D8FD>
+<9EBB> <9EBB> <D8AB>
+<9EBE> <9EBE> <FDCB>
+<9EC3> <9EC3> <FCDC>
+<9ECD> <9ECD> <E0A8>
+<9ECE> <9ECE> <D5F3>
+<9ED1> <9ED1> <FDD9>
+<9ED4> <9ED4> <CCA3>
+<9ED8> <9ED8> <D9F9>
+<9EDB> <9EDB> <D3EA>
+<9EDC> <9EDC> <F5F5>
+<9EDE> <9EDE> <EFC7>
+<9EE8> <9EE8> <D3DA>
+<9EF4> <9EF4> <DABD>
+<9F07> <9F07> <E8A8>
+<9F08> <9F08> <DCAF>
+<9F0E> <9F0E> <F0A3>
+<9F13> <9F13> <CDD5>
+<9F20> <9F20> <E0A9>
+<9F3B> <9F3B> <DEAC>
+<9F4A> <9F4A> <F0BA>
+<9F4B> <9F4B> <EEB1>
+<9F4E> <9F4E> <EEB2>
+<9F52> <9F52> <F6CD>
+<9F5F> <9F5F> <EED2>
+<9F61> <9F61> <D6C6>
+<9F67> <9F67> <E0E5>
+<9F6A> <9F6A> <F3BB>
+<9F6C> <9F6C> <E5E1>
+<9F77> <9F77> <E4CB>
+<9F8D> <9F8D> <D7A3>
+<9F90> <9F90> <DBC2>
+<9F95> <9F95> <CAFE>
+<9F9C> <9F9C> <CFCF>
+<AC00> <AC01> <B0A1>
+<AC04> <AC04> <B0A3>
+<AC07> <AC0A> <B0A4>
+<AC10> <AC17> <B0A8>
+<AC19> <AC1D> <B0B0>
+<AC20> <AC20> <B0B5>
+<AC24> <AC24> <B0B6>
+<AC2C> <AC2D> <B0B7>
+<AC2F> <AC31> <B0B9>
+<AC38> <AC39> <B0BC>
+<AC3C> <AC3C> <B0BE>
+<AC40> <AC40> <B0BF>
+endbfrange
+
+100 beginbfrange
+<AC4B> <AC4B> <B0C0>
+<AC4D> <AC4D> <B0C1>
+<AC54> <AC54> <B0C2>
+<AC58> <AC58> <B0C3>
+<AC5C> <AC5C> <B0C4>
+<AC70> <AC71> <B0C5>
+<AC74> <AC74> <B0C7>
+<AC77> <AC78> <B0C8>
+<AC7A> <AC7A> <B0CA>
+<AC80> <AC81> <B0CB>
+<AC83> <AC86> <B0CD>
+<AC89> <AC8C> <B0D1>
+<AC90> <AC90> <B0D5>
+<AC94> <AC94> <B0D6>
+<AC9C> <AC9D> <B0D7>
+<AC9F> <ACA1> <B0D9>
+<ACA8> <ACAA> <B0DC>
+<ACAC> <ACAC> <B0DF>
+<ACAF> <ACB0> <B0E0>
+<ACB8> <ACB9> <B0E2>
+<ACBB> <ACBD> <B0E4>
+<ACC1> <ACC1> <B0E7>
+<ACC4> <ACC4> <B0E8>
+<ACC8> <ACC8> <B0E9>
+<ACCC> <ACCC> <B0EA>
+<ACD5> <ACD5> <B0EB>
+<ACD7> <ACD7> <B0EC>
+<ACE0> <ACE1> <B0ED>
+<ACE4> <ACE4> <B0EF>
+<ACE7> <ACE8> <B0F0>
+<ACEA> <ACEA> <B0F2>
+<ACEC> <ACEC> <B0F3>
+<ACEF> <ACF1> <B0F4>
+<ACF3> <ACF3> <B0F7>
+<ACF5> <ACF6> <B0F8>
+<ACFC> <ACFD> <B0FA>
+<AD00> <AD00> <B0FC>
+<AD04> <AD04> <B0FD>
+<AD06> <AD06> <B0FE>
+<AD0C> <AD0D> <B1A1>
+<AD0F> <AD0F> <B1A3>
+<AD11> <AD11> <B1A4>
+<AD18> <AD18> <B1A5>
+<AD1C> <AD1C> <B1A6>
+<AD20> <AD20> <B1A7>
+<AD29> <AD29> <B1A8>
+<AD2C> <AD2D> <B1A9>
+<AD34> <AD35> <B1AB>
+<AD38> <AD38> <B1AD>
+<AD3C> <AD3C> <B1AE>
+<AD44> <AD45> <B1AF>
+<AD47> <AD47> <B1B1>
+<AD49> <AD49> <B1B2>
+<AD50> <AD50> <B1B3>
+<AD54> <AD54> <B1B4>
+<AD58> <AD58> <B1B5>
+<AD61> <AD61> <B1B6>
+<AD63> <AD63> <B1B7>
+<AD6C> <AD6D> <B1B8>
+<AD70> <AD70> <B1BA>
+<AD73> <AD76> <B1BB>
+<AD7B> <AD7D> <B1BF>
+<AD7F> <AD7F> <B1C2>
+<AD81> <AD82> <B1C3>
+<AD88> <AD89> <B1C5>
+<AD8C> <AD8C> <B1C7>
+<AD90> <AD90> <B1C8>
+<AD9C> <AD9D> <B1C9>
+<ADA4> <ADA4> <B1CB>
+<ADB7> <ADB7> <B1CC>
+<ADC0> <ADC1> <B1CD>
+<ADC4> <ADC4> <B1CF>
+<ADC8> <ADC8> <B1D0>
+<ADD0> <ADD1> <B1D1>
+<ADD3> <ADD3> <B1D3>
+<ADDC> <ADDC> <B1D4>
+<ADE0> <ADE0> <B1D5>
+<ADE4> <ADE4> <B1D6>
+<ADF8> <ADF9> <B1D7>
+<ADFC> <ADFC> <B1D9>
+<ADFF> <ADFF> <B1DA>
+<AE00> <AE01> <B1DB>
+<AE08> <AE09> <B1DD>
+<AE0B> <AE0B> <B1DF>
+<AE0D> <AE0D> <B1E0>
+<AE14> <AE14> <B1E1>
+<AE30> <AE31> <B1E2>
+<AE34> <AE34> <B1E4>
+<AE37> <AE38> <B1E5>
+<AE3A> <AE3A> <B1E7>
+<AE40> <AE41> <B1E8>
+<AE43> <AE43> <B1EA>
+<AE45> <AE46> <B1EB>
+<AE4A> <AE4A> <B1ED>
+<AE4C> <AE4E> <B1EE>
+<AE50> <AE50> <B1F1>
+<AE54> <AE54> <B1F2>
+<AE56> <AE56> <B1F3>
+<AE5C> <AE5D> <B1F4>
+<AE5F> <AE61> <B1F6>
+endbfrange
+
+100 beginbfrange
+<AE65> <AE65> <B1F9>
+<AE68> <AE69> <B1FA>
+<AE6C> <AE6C> <B1FC>
+<AE70> <AE70> <B1FD>
+<AE78> <AE78> <B1FE>
+<AE79> <AE79> <B2A1>
+<AE7B> <AE7D> <B2A2>
+<AE84> <AE85> <B2A5>
+<AE8C> <AE8C> <B2A7>
+<AEBC> <AEBE> <B2A8>
+<AEC0> <AEC0> <B2AB>
+<AEC4> <AEC4> <B2AC>
+<AECC> <AECD> <B2AD>
+<AECF> <AED1> <B2AF>
+<AED8> <AED9> <B2B2>
+<AEDC> <AEDC> <B2B4>
+<AEE8> <AEE8> <B2B5>
+<AEEB> <AEEB> <B2B6>
+<AEED> <AEED> <B2B7>
+<AEF4> <AEF4> <B2B8>
+<AEF8> <AEF8> <B2B9>
+<AEFC> <AEFC> <B2BA>
+<AF07> <AF08> <B2BB>
+<AF0D> <AF0D> <B2BD>
+<AF10> <AF10> <B2BE>
+<AF2C> <AF2D> <B2BF>
+<AF30> <AF30> <B2C1>
+<AF32> <AF32> <B2C2>
+<AF34> <AF34> <B2C3>
+<AF3C> <AF3D> <B2C4>
+<AF3F> <AF3F> <B2C6>
+<AF41> <AF43> <B2C7>
+<AF48> <AF49> <B2CA>
+<AF50> <AF50> <B2CC>
+<AF5C> <AF5D> <B2CD>
+<AF64> <AF65> <B2CF>
+<AF79> <AF79> <B2D1>
+<AF80> <AF80> <B2D2>
+<AF84> <AF84> <B2D3>
+<AF88> <AF88> <B2D4>
+<AF90> <AF91> <B2D5>
+<AF95> <AF95> <B2D7>
+<AF9C> <AF9C> <B2D8>
+<AFB8> <AFB9> <B2D9>
+<AFBC> <AFBC> <B2DB>
+<AFC0> <AFC0> <B2DC>
+<AFC7> <AFC9> <B2DD>
+<AFCB> <AFCB> <B2E0>
+<AFCD> <AFCE> <B2E1>
+<AFD4> <AFD4> <B2E3>
+<AFDC> <AFDC> <B2E4>
+<AFE8> <AFE9> <B2E5>
+<AFF0> <AFF1> <B2E7>
+<AFF4> <AFF4> <B2E9>
+<AFF8> <AFF8> <B2EA>
+<B000> <B001> <B2EB>
+<B004> <B004> <B2ED>
+<B00C> <B00C> <B2EE>
+<B010> <B010> <B2EF>
+<B014> <B014> <B2F0>
+<B01C> <B01D> <B2F1>
+<B028> <B028> <B2F3>
+<B044> <B045> <B2F4>
+<B048> <B048> <B2F6>
+<B04A> <B04A> <B2F7>
+<B04C> <B04C> <B2F8>
+<B04E> <B04E> <B2F9>
+<B053> <B055> <B2FA>
+<B057> <B057> <B2FD>
+<B059> <B059> <B2FE>
+<B05D> <B05D> <B3A1>
+<B07C> <B07D> <B3A2>
+<B080> <B080> <B3A4>
+<B084> <B084> <B3A5>
+<B08C> <B08D> <B3A6>
+<B08F> <B08F> <B3A8>
+<B091> <B091> <B3A9>
+<B098> <B09A> <B3AA>
+<B09C> <B09C> <B3AD>
+<B09F> <B0A2> <B3AE>
+<B0A8> <B0A9> <B3B2>
+<B0AB> <B0AF> <B3B4>
+<B0B1> <B0B1> <B3B9>
+<B0B3> <B0B5> <B3BA>
+<B0B8> <B0B8> <B3BD>
+<B0BC> <B0BC> <B3BE>
+<B0C4> <B0C5> <B3BF>
+<B0C7> <B0C9> <B3C1>
+<B0D0> <B0D1> <B3C4>
+<B0D4> <B0D4> <B3C6>
+<B0D8> <B0D8> <B3C7>
+<B0E0> <B0E0> <B3C8>
+<B0E5> <B0E5> <B3C9>
+<B108> <B109> <B3CA>
+<B10B> <B10C> <B3CC>
+<B110> <B110> <B3CE>
+<B112> <B113> <B3CF>
+<B118> <B119> <B3D1>
+<B11B> <B11D> <B3D3>
+<B123> <B125> <B3D6>
+endbfrange
+
+100 beginbfrange
+<B128> <B128> <B3D9>
+<B12C> <B12C> <B3DA>
+<B134> <B135> <B3DB>
+<B137> <B139> <B3DD>
+<B140> <B141> <B3E0>
+<B144> <B144> <B3E2>
+<B148> <B148> <B3E3>
+<B150> <B151> <B3E4>
+<B154> <B155> <B3E6>
+<B158> <B158> <B3E8>
+<B15C> <B15C> <B3E9>
+<B160> <B160> <B3EA>
+<B178> <B179> <B3EB>
+<B17C> <B17C> <B3ED>
+<B180> <B180> <B3EE>
+<B182> <B182> <B3EF>
+<B188> <B189> <B3F0>
+<B18B> <B18B> <B3F2>
+<B18D> <B18D> <B3F3>
+<B192> <B194> <B3F4>
+<B198> <B198> <B3F7>
+<B19C> <B19C> <B3F8>
+<B1A8> <B1A8> <B3F9>
+<B1CC> <B1CC> <B3FA>
+<B1D0> <B1D0> <B3FB>
+<B1D4> <B1D4> <B3FC>
+<B1DC> <B1DD> <B3FD>
+<B1DF> <B1DF> <B4A1>
+<B1E8> <B1E9> <B4A2>
+<B1EC> <B1EC> <B4A4>
+<B1F0> <B1F0> <B4A5>
+<B1F9> <B1F9> <B4A6>
+<B1FB> <B1FB> <B4A7>
+<B1FD> <B1FD> <B4A8>
+<B204> <B205> <B4A9>
+<B208> <B208> <B4AB>
+<B20B> <B20C> <B4AC>
+<B214> <B215> <B4AE>
+<B217> <B217> <B4B0>
+<B219> <B219> <B4B1>
+<B220> <B220> <B4B2>
+<B234> <B234> <B4B3>
+<B23C> <B23C> <B4B4>
+<B258> <B258> <B4B5>
+<B25C> <B25C> <B4B6>
+<B260> <B260> <B4B7>
+<B268> <B269> <B4B8>
+<B274> <B275> <B4BA>
+<B27C> <B27C> <B4BC>
+<B284> <B285> <B4BD>
+<B289> <B289> <B4BF>
+<B290> <B291> <B4C0>
+<B294> <B294> <B4C2>
+<B298> <B29A> <B4C3>
+<B2A0> <B2A1> <B4C6>
+<B2A3> <B2A3> <B4C8>
+<B2A5> <B2A6> <B4C9>
+<B2AA> <B2AA> <B4CB>
+<B2AC> <B2AC> <B4CC>
+<B2B0> <B2B0> <B4CD>
+<B2B4> <B2B4> <B4CE>
+<B2C8> <B2C9> <B4CF>
+<B2CC> <B2CC> <B4D1>
+<B2D0> <B2D0> <B4D2>
+<B2D2> <B2D2> <B4D3>
+<B2D8> <B2D9> <B4D4>
+<B2DB> <B2DB> <B4D6>
+<B2DD> <B2DD> <B4D7>
+<B2E2> <B2E2> <B4D8>
+<B2E4> <B2E6> <B4D9>
+<B2E8> <B2E8> <B4DC>
+<B2EB> <B2EF> <B4DD>
+<B2F3> <B2F5> <B4E2>
+<B2F7> <B2FB> <B4E5>
+<B2FF> <B2FF> <B4EA>
+<B300> <B301> <B4EB>
+<B304> <B304> <B4ED>
+<B308> <B308> <B4EE>
+<B310> <B311> <B4EF>
+<B313> <B315> <B4F1>
+<B31C> <B31C> <B4F4>
+<B354> <B356> <B4F5>
+<B358> <B358> <B4F8>
+<B35B> <B35C> <B4F9>
+<B35E> <B35F> <B4FB>
+<B364> <B365> <B4FD>
+<B367> <B367> <B5A1>
+<B369> <B369> <B5A2>
+<B36B> <B36B> <B5A3>
+<B36E> <B36E> <B5A4>
+<B370> <B371> <B5A5>
+<B374> <B374> <B5A7>
+<B378> <B378> <B5A8>
+<B380> <B381> <B5A9>
+<B383> <B385> <B5AB>
+<B38C> <B38C> <B5AE>
+<B390> <B390> <B5AF>
+<B394> <B394> <B5B0>
+<B3A0> <B3A1> <B5B1>
+<B3A8> <B3A8> <B5B3>
+endbfrange
+
+100 beginbfrange
+<B3AC> <B3AC> <B5B4>
+<B3C4> <B3C5> <B5B5>
+<B3C8> <B3C8> <B5B7>
+<B3CB> <B3CC> <B5B8>
+<B3CE> <B3CE> <B5BA>
+<B3D0> <B3D0> <B5BB>
+<B3D4> <B3D5> <B5BC>
+<B3D7> <B3D7> <B5BE>
+<B3D9> <B3D9> <B5BF>
+<B3DB> <B3DB> <B5C0>
+<B3DD> <B3DD> <B5C1>
+<B3E0> <B3E0> <B5C2>
+<B3E4> <B3E4> <B5C3>
+<B3E8> <B3E8> <B5C4>
+<B3FC> <B3FC> <B5C5>
+<B410> <B410> <B5C6>
+<B418> <B418> <B5C7>
+<B41C> <B41C> <B5C8>
+<B420> <B420> <B5C9>
+<B428> <B429> <B5CA>
+<B42B> <B42B> <B5CC>
+<B434> <B434> <B5CD>
+<B450> <B451> <B5CE>
+<B454> <B454> <B5D0>
+<B458> <B458> <B5D1>
+<B460> <B461> <B5D2>
+<B463> <B463> <B5D4>
+<B465> <B465> <B5D5>
+<B46C> <B46C> <B5D6>
+<B480> <B480> <B5D7>
+<B488> <B488> <B5D8>
+<B49D> <B49D> <B5D9>
+<B4A4> <B4A4> <B5DA>
+<B4A8> <B4A8> <B5DB>
+<B4AC> <B4AC> <B5DC>
+<B4B5> <B4B5> <B5DD>
+<B4B7> <B4B7> <B5DE>
+<B4B9> <B4B9> <B5DF>
+<B4C0> <B4C0> <B5E0>
+<B4C4> <B4C4> <B5E1>
+<B4C8> <B4C8> <B5E2>
+<B4D0> <B4D0> <B5E3>
+<B4D5> <B4D5> <B5E4>
+<B4DC> <B4DD> <B5E5>
+<B4E0> <B4E0> <B5E7>
+<B4E3> <B4E4> <B5E8>
+<B4E6> <B4E6> <B5EA>
+<B4EC> <B4ED> <B5EB>
+<B4EF> <B4EF> <B5ED>
+<B4F1> <B4F1> <B5EE>
+<B4F8> <B4F8> <B5EF>
+<B514> <B515> <B5F0>
+<B518> <B518> <B5F2>
+<B51B> <B51C> <B5F3>
+<B524> <B525> <B5F5>
+<B527> <B52A> <B5F7>
+<B530> <B531> <B5FB>
+<B534> <B534> <B5FD>
+<B538> <B538> <B5FE>
+<B540> <B541> <B6A1>
+<B543> <B545> <B6A3>
+<B54B> <B54D> <B6A6>
+<B550> <B550> <B6A9>
+<B554> <B554> <B6AA>
+<B55C> <B55D> <B6AB>
+<B55F> <B561> <B6AD>
+<B5A0> <B5A1> <B6B0>
+<B5A4> <B5A4> <B6B2>
+<B5A8> <B5A8> <B6B3>
+<B5AA> <B5AB> <B6B4>
+<B5B0> <B5B1> <B6B6>
+<B5B3> <B5B5> <B6B8>
+<B5BB> <B5BD> <B6BB>
+<B5C0> <B5C0> <B6BE>
+<B5C4> <B5C4> <B6BF>
+<B5CC> <B5CD> <B6C0>
+<B5CF> <B5D1> <B6C2>
+<B5D8> <B5D8> <B6C5>
+<B5EC> <B5EC> <B6C6>
+<B610> <B611> <B6C7>
+<B614> <B614> <B6C9>
+<B618> <B618> <B6CA>
+<B625> <B625> <B6CB>
+<B62C> <B62C> <B6CC>
+<B634> <B634> <B6CD>
+<B648> <B648> <B6CE>
+<B664> <B664> <B6CF>
+<B668> <B668> <B6D0>
+<B69C> <B69D> <B6D1>
+<B6A0> <B6A0> <B6D3>
+<B6A4> <B6A4> <B6D4>
+<B6AB> <B6AC> <B6D5>
+<B6B1> <B6B1> <B6D7>
+<B6D4> <B6D4> <B6D8>
+<B6F0> <B6F0> <B6D9>
+<B6F4> <B6F4> <B6DA>
+<B6F8> <B6F8> <B6DB>
+<B700> <B701> <B6DC>
+<B705> <B705> <B6DE>
+<B728> <B729> <B6DF>
+endbfrange
+
+100 beginbfrange
+<B72C> <B72C> <B6E1>
+<B72F> <B730> <B6E2>
+<B738> <B739> <B6E4>
+<B73B> <B73B> <B6E6>
+<B744> <B744> <B6E7>
+<B748> <B748> <B6E8>
+<B74C> <B74C> <B6E9>
+<B754> <B755> <B6EA>
+<B760> <B760> <B6EC>
+<B764> <B764> <B6ED>
+<B768> <B768> <B6EE>
+<B770> <B771> <B6EF>
+<B773> <B773> <B6F1>
+<B775> <B775> <B6F2>
+<B77C> <B77D> <B6F3>
+<B780> <B780> <B6F5>
+<B784> <B784> <B6F6>
+<B78C> <B78D> <B6F7>
+<B78F> <B792> <B6F9>
+<B796> <B797> <B6FD>
+<B798> <B799> <B7A1>
+<B79C> <B79C> <B7A3>
+<B7A0> <B7A0> <B7A4>
+<B7A8> <B7A9> <B7A5>
+<B7AB> <B7AD> <B7A7>
+<B7B4> <B7B5> <B7AA>
+<B7B8> <B7B8> <B7AC>
+<B7C7> <B7C7> <B7AD>
+<B7C9> <B7C9> <B7AE>
+<B7EC> <B7ED> <B7AF>
+<B7F0> <B7F0> <B7B1>
+<B7F4> <B7F4> <B7B2>
+<B7FC> <B7FD> <B7B3>
+<B7FF> <B7FF> <B7B5>
+<B800> <B801> <B7B6>
+<B807> <B809> <B7B8>
+<B80C> <B80C> <B7BB>
+<B810> <B810> <B7BC>
+<B818> <B819> <B7BD>
+<B81B> <B81B> <B7BF>
+<B81D> <B81D> <B7C0>
+<B824> <B825> <B7C1>
+<B828> <B828> <B7C3>
+<B82C> <B82C> <B7C4>
+<B834> <B835> <B7C5>
+<B837> <B839> <B7C7>
+<B840> <B840> <B7CA>
+<B844> <B844> <B7CB>
+<B851> <B851> <B7CC>
+<B853> <B853> <B7CD>
+<B85C> <B85D> <B7CE>
+<B860> <B860> <B7D0>
+<B864> <B864> <B7D1>
+<B86C> <B86D> <B7D2>
+<B86F> <B86F> <B7D4>
+<B871> <B871> <B7D5>
+<B878> <B878> <B7D6>
+<B87C> <B87C> <B7D7>
+<B88D> <B88D> <B7D8>
+<B8A8> <B8A8> <B7D9>
+<B8B0> <B8B0> <B7DA>
+<B8B4> <B8B4> <B7DB>
+<B8B8> <B8B8> <B7DC>
+<B8C0> <B8C1> <B7DD>
+<B8C3> <B8C3> <B7DF>
+<B8C5> <B8C5> <B7E0>
+<B8CC> <B8CC> <B7E1>
+<B8D0> <B8D0> <B7E2>
+<B8D4> <B8D4> <B7E3>
+<B8DD> <B8DD> <B7E4>
+<B8DF> <B8DF> <B7E5>
+<B8E1> <B8E1> <B7E6>
+<B8E8> <B8E9> <B7E7>
+<B8EC> <B8EC> <B7E9>
+<B8F0> <B8F0> <B7EA>
+<B8F8> <B8F9> <B7EB>
+<B8FB> <B8FB> <B7ED>
+<B8FD> <B8FD> <B7EE>
+<B904> <B904> <B7EF>
+<B918> <B918> <B7F0>
+<B920> <B920> <B7F1>
+<B93C> <B93D> <B7F2>
+<B940> <B940> <B7F4>
+<B944> <B944> <B7F5>
+<B94C> <B94C> <B7F6>
+<B94F> <B94F> <B7F7>
+<B951> <B951> <B7F8>
+<B958> <B959> <B7F9>
+<B95C> <B95C> <B7FB>
+<B960> <B960> <B7FC>
+<B968> <B969> <B7FD>
+<B96B> <B96B> <B8A1>
+<B96D> <B96D> <B8A2>
+<B974> <B975> <B8A3>
+<B978> <B978> <B8A5>
+<B97C> <B97C> <B8A6>
+<B984> <B985> <B8A7>
+<B987> <B987> <B8A9>
+<B989> <B98A> <B8AA>
+<B98D> <B98E> <B8AC>
+endbfrange
+
+100 beginbfrange
+<B9AC> <B9AD> <B8AE>
+<B9B0> <B9B0> <B8B0>
+<B9B4> <B9B4> <B8B1>
+<B9BC> <B9BD> <B8B2>
+<B9BF> <B9BF> <B8B4>
+<B9C1> <B9C1> <B8B5>
+<B9C8> <B9C9> <B8B6>
+<B9CC> <B9CC> <B8B8>
+<B9CE> <B9D2> <B8B9>
+<B9D8> <B9D9> <B8BE>
+<B9DB> <B9DB> <B8C0>
+<B9DD> <B9DE> <B8C1>
+<B9E1> <B9E1> <B8C3>
+<B9E3> <B9E5> <B8C4>
+<B9E8> <B9E8> <B8C7>
+<B9EC> <B9EC> <B8C8>
+<B9F4> <B9F5> <B8C9>
+<B9F7> <B9FA> <B8CB>
+<BA00> <BA01> <B8CF>
+<BA08> <BA08> <B8D1>
+<BA15> <BA15> <B8D2>
+<BA38> <BA39> <B8D3>
+<BA3C> <BA3C> <B8D5>
+<BA40> <BA40> <B8D6>
+<BA42> <BA42> <B8D7>
+<BA48> <BA49> <B8D8>
+<BA4B> <BA4B> <B8DA>
+<BA4D> <BA4E> <B8DB>
+<BA53> <BA55> <B8DD>
+<BA58> <BA58> <B8E0>
+<BA5C> <BA5C> <B8E1>
+<BA64> <BA65> <B8E2>
+<BA67> <BA69> <B8E4>
+<BA70> <BA71> <B8E7>
+<BA74> <BA74> <B8E9>
+<BA78> <BA78> <B8EA>
+<BA83> <BA85> <B8EB>
+<BA87> <BA87> <B8EE>
+<BA8C> <BA8C> <B8EF>
+<BAA8> <BAA9> <B8F0>
+<BAAB> <BAAC> <B8F2>
+<BAB0> <BAB0> <B8F4>
+<BAB2> <BAB2> <B8F5>
+<BAB8> <BAB9> <B8F6>
+<BABB> <BABB> <B8F8>
+<BABD> <BABD> <B8F9>
+<BAC4> <BAC4> <B8FA>
+<BAC8> <BAC8> <B8FB>
+<BAD8> <BAD9> <B8FC>
+<BAFC> <BAFC> <B8FE>
+<BB00> <BB00> <B9A1>
+<BB04> <BB04> <B9A2>
+<BB0D> <BB0D> <B9A3>
+<BB0F> <BB0F> <B9A4>
+<BB11> <BB11> <B9A5>
+<BB18> <BB18> <B9A6>
+<BB1C> <BB1C> <B9A7>
+<BB20> <BB20> <B9A8>
+<BB29> <BB29> <B9A9>
+<BB2B> <BB2B> <B9AA>
+<BB34> <BB36> <B9AB>
+<BB38> <BB38> <B9AE>
+<BB3B> <BB3E> <B9AF>
+<BB44> <BB45> <B9B3>
+<BB47> <BB47> <B9B5>
+<BB49> <BB49> <B9B6>
+<BB4D> <BB4D> <B9B7>
+<BB4F> <BB50> <B9B8>
+<BB54> <BB54> <B9BA>
+<BB58> <BB58> <B9BB>
+<BB61> <BB61> <B9BC>
+<BB63> <BB63> <B9BD>
+<BB6C> <BB6C> <B9BE>
+<BB88> <BB88> <B9BF>
+<BB8C> <BB8C> <B9C0>
+<BB90> <BB90> <B9C1>
+<BBA4> <BBA4> <B9C2>
+<BBA8> <BBA8> <B9C3>
+<BBAC> <BBAC> <B9C4>
+<BBB4> <BBB4> <B9C5>
+<BBB7> <BBB7> <B9C6>
+<BBC0> <BBC0> <B9C7>
+<BBC4> <BBC4> <B9C8>
+<BBC8> <BBC8> <B9C9>
+<BBD0> <BBD0> <B9CA>
+<BBD3> <BBD3> <B9CB>
+<BBF8> <BBF9> <B9CC>
+<BBFC> <BBFC> <B9CE>
+<BBFF> <BBFF> <B9CF>
+<BC00> <BC00> <B9D0>
+<BC02> <BC02> <B9D1>
+<BC08> <BC09> <B9D2>
+<BC0B> <BC0D> <B9D4>
+<BC0F> <BC0F> <B9D7>
+<BC11> <BC11> <B9D8>
+<BC14> <BC18> <B9D9>
+<BC1B> <BC1F> <B9DE>
+<BC24> <BC25> <B9E3>
+<BC27> <BC27> <B9E5>
+<BC29> <BC29> <B9E6>
+endbfrange
+
+100 beginbfrange
+<BC2D> <BC2D> <B9E7>
+<BC30> <BC31> <B9E8>
+<BC34> <BC34> <B9EA>
+<BC38> <BC38> <B9EB>
+<BC40> <BC41> <B9EC>
+<BC43> <BC45> <B9EE>
+<BC49> <BC49> <B9F1>
+<BC4C> <BC4D> <B9F2>
+<BC50> <BC50> <B9F4>
+<BC5D> <BC5D> <B9F5>
+<BC84> <BC85> <B9F6>
+<BC88> <BC88> <B9F8>
+<BC8B> <BC8C> <B9F9>
+<BC8E> <BC8E> <B9FB>
+<BC94> <BC95> <B9FC>
+<BC97> <BC97> <B9FE>
+<BC99> <BC9A> <BAA1>
+<BCA0> <BCA1> <BAA3>
+<BCA4> <BCA4> <BAA5>
+<BCA7> <BCA8> <BAA6>
+<BCB0> <BCB1> <BAA8>
+<BCB3> <BCB5> <BAAA>
+<BCBC> <BCBD> <BAAD>
+<BCC0> <BCC0> <BAAF>
+<BCC4> <BCC4> <BAB0>
+<BCCD> <BCCD> <BAB1>
+<BCCF> <BCD1> <BAB2>
+<BCD5> <BCD5> <BAB5>
+<BCD8> <BCD8> <BAB6>
+<BCDC> <BCDC> <BAB7>
+<BCF4> <BCF6> <BAB8>
+<BCF8> <BCF8> <BABB>
+<BCFC> <BCFC> <BABC>
+<BD04> <BD05> <BABD>
+<BD07> <BD07> <BABF>
+<BD09> <BD09> <BAC0>
+<BD10> <BD10> <BAC1>
+<BD14> <BD14> <BAC2>
+<BD24> <BD24> <BAC3>
+<BD2C> <BD2C> <BAC4>
+<BD40> <BD40> <BAC5>
+<BD48> <BD49> <BAC6>
+<BD4C> <BD4C> <BAC8>
+<BD50> <BD50> <BAC9>
+<BD58> <BD59> <BACA>
+<BD64> <BD64> <BACC>
+<BD68> <BD68> <BACD>
+<BD80> <BD81> <BACE>
+<BD84> <BD84> <BAD0>
+<BD87> <BD8A> <BAD1>
+<BD90> <BD91> <BAD5>
+<BD93> <BD93> <BAD7>
+<BD95> <BD95> <BAD8>
+<BD99> <BD9A> <BAD9>
+<BD9C> <BD9C> <BADB>
+<BDA4> <BDA4> <BADC>
+<BDB0> <BDB0> <BADD>
+<BDB8> <BDB8> <BADE>
+<BDD4> <BDD5> <BADF>
+<BDD8> <BDD8> <BAE1>
+<BDDC> <BDDC> <BAE2>
+<BDE9> <BDE9> <BAE3>
+<BDF0> <BDF0> <BAE4>
+<BDF4> <BDF4> <BAE5>
+<BDF8> <BDF8> <BAE6>
+<BE00> <BE00> <BAE7>
+<BE03> <BE03> <BAE8>
+<BE05> <BE05> <BAE9>
+<BE0C> <BE0D> <BAEA>
+<BE10> <BE10> <BAEC>
+<BE14> <BE14> <BAED>
+<BE1C> <BE1D> <BAEE>
+<BE1F> <BE1F> <BAF0>
+<BE44> <BE45> <BAF1>
+<BE48> <BE48> <BAF3>
+<BE4C> <BE4C> <BAF4>
+<BE4E> <BE4E> <BAF5>
+<BE54> <BE55> <BAF6>
+<BE57> <BE57> <BAF8>
+<BE59> <BE5B> <BAF9>
+<BE60> <BE61> <BAFC>
+<BE64> <BE64> <BAFE>
+<BE68> <BE68> <BBA1>
+<BE6A> <BE6A> <BBA2>
+<BE70> <BE71> <BBA3>
+<BE73> <BE75> <BBA5>
+<BE7B> <BE7D> <BBA8>
+<BE80> <BE80> <BBAB>
+<BE84> <BE84> <BBAC>
+<BE8C> <BE8D> <BBAD>
+<BE8F> <BE91> <BBAF>
+<BE98> <BE99> <BBB2>
+<BEA8> <BEA8> <BBB4>
+<BED0> <BED1> <BBB5>
+<BED4> <BED4> <BBB7>
+<BED7> <BED8> <BBB8>
+<BEE0> <BEE0> <BBBA>
+<BEE3> <BEE5> <BBBB>
+<BEEC> <BEEC> <BBBE>
+<BF01> <BF01> <BBBF>
+endbfrange
+
+100 beginbfrange
+<BF08> <BF09> <BBC0>
+<BF18> <BF19> <BBC2>
+<BF1B> <BF1D> <BBC4>
+<BF40> <BF41> <BBC7>
+<BF44> <BF44> <BBC9>
+<BF48> <BF48> <BBCA>
+<BF50> <BF51> <BBCB>
+<BF55> <BF55> <BBCD>
+<BF94> <BF94> <BBCE>
+<BFB0> <BFB0> <BBCF>
+<BFC5> <BFC5> <BBD0>
+<BFCC> <BFCD> <BBD1>
+<BFD0> <BFD0> <BBD3>
+<BFD4> <BFD4> <BBD4>
+<BFDC> <BFDC> <BBD5>
+<BFDF> <BFDF> <BBD6>
+<BFE1> <BFE1> <BBD7>
+<C03C> <C03C> <BBD8>
+<C051> <C051> <BBD9>
+<C058> <C058> <BBDA>
+<C05C> <C05C> <BBDB>
+<C060> <C060> <BBDC>
+<C068> <C069> <BBDD>
+<C090> <C091> <BBDF>
+<C094> <C094> <BBE1>
+<C098> <C098> <BBE2>
+<C0A0> <C0A1> <BBE3>
+<C0A3> <C0A3> <BBE5>
+<C0A5> <C0A5> <BBE6>
+<C0AC> <C0AD> <BBE7>
+<C0AF> <C0B0> <BBE9>
+<C0B3> <C0B6> <BBEB>
+<C0BC> <C0BD> <BBEF>
+<C0BF> <C0C1> <BBF1>
+<C0C5> <C0C5> <BBF4>
+<C0C8> <C0C9> <BBF5>
+<C0CC> <C0CC> <BBF7>
+<C0D0> <C0D0> <BBF8>
+<C0D8> <C0D9> <BBF9>
+<C0DB> <C0DD> <BBFB>
+<C0E4> <C0E4> <BBFE>
+<C0E5> <C0E5> <BCA1>
+<C0E8> <C0E8> <BCA2>
+<C0EC> <C0EC> <BCA3>
+<C0F4> <C0F5> <BCA4>
+<C0F7> <C0F7> <BCA6>
+<C0F9> <C0F9> <BCA7>
+<C100> <C100> <BCA8>
+<C104> <C104> <BCA9>
+<C108> <C108> <BCAA>
+<C110> <C110> <BCAB>
+<C115> <C115> <BCAC>
+<C11C> <C120> <BCAD>
+<C123> <C124> <BCB2>
+<C126> <C127> <BCB4>
+<C12C> <C12D> <BCB6>
+<C12F> <C131> <BCB8>
+<C136> <C136> <BCBB>
+<C138> <C139> <BCBC>
+<C13C> <C13C> <BCBE>
+<C140> <C140> <BCBF>
+<C148> <C149> <BCC0>
+<C14B> <C14D> <BCC2>
+<C154> <C155> <BCC5>
+<C158> <C158> <BCC7>
+<C15C> <C15C> <BCC8>
+<C164> <C165> <BCC9>
+<C167> <C169> <BCCB>
+<C170> <C170> <BCCE>
+<C174> <C174> <BCCF>
+<C178> <C178> <BCD0>
+<C185> <C185> <BCD1>
+<C18C> <C18E> <BCD2>
+<C190> <C190> <BCD5>
+<C194> <C194> <BCD6>
+<C196> <C196> <BCD7>
+<C19C> <C19D> <BCD8>
+<C19F> <C19F> <BCDA>
+<C1A1> <C1A1> <BCDB>
+<C1A5> <C1A5> <BCDC>
+<C1A8> <C1A9> <BCDD>
+<C1AC> <C1AC> <BCDF>
+<C1B0> <C1B0> <BCE0>
+<C1BD> <C1BD> <BCE1>
+<C1C4> <C1C4> <BCE2>
+<C1C8> <C1C8> <BCE3>
+<C1CC> <C1CC> <BCE4>
+<C1D4> <C1D4> <BCE5>
+<C1D7> <C1D8> <BCE6>
+<C1E0> <C1E0> <BCE8>
+<C1E4> <C1E4> <BCE9>
+<C1E8> <C1E8> <BCEA>
+<C1F0> <C1F1> <BCEB>
+<C1F3> <C1F3> <BCED>
+<C1FC> <C1FD> <BCEE>
+<C200> <C200> <BCF0>
+<C204> <C204> <BCF1>
+<C20C> <C20D> <BCF2>
+<C20F> <C20F> <BCF4>
+<C211> <C211> <BCF5>
+endbfrange
+
+100 beginbfrange
+<C218> <C219> <BCF6>
+<C21C> <C21C> <BCF8>
+<C21F> <C220> <BCF9>
+<C228> <C229> <BCFB>
+<C22B> <C22B> <BCFD>
+<C22D> <C22D> <BCFE>
+<C22F> <C22F> <BDA1>
+<C231> <C232> <BDA2>
+<C234> <C234> <BDA4>
+<C248> <C248> <BDA5>
+<C250> <C251> <BDA6>
+<C254> <C254> <BDA8>
+<C258> <C258> <BDA9>
+<C260> <C260> <BDAA>
+<C265> <C265> <BDAB>
+<C26C> <C26D> <BDAC>
+<C270> <C270> <BDAE>
+<C274> <C274> <BDAF>
+<C27C> <C27D> <BDB0>
+<C27F> <C27F> <BDB2>
+<C281> <C281> <BDB3>
+<C288> <C289> <BDB4>
+<C290> <C290> <BDB6>
+<C298> <C298> <BDB7>
+<C29B> <C29B> <BDB8>
+<C29D> <C29D> <BDB9>
+<C2A4> <C2A5> <BDBA>
+<C2A8> <C2A8> <BDBC>
+<C2AC> <C2AD> <BDBD>
+<C2B4> <C2B5> <BDBF>
+<C2B7> <C2B7> <BDC1>
+<C2B9> <C2B9> <BDC2>
+<C2DC> <C2DD> <BDC3>
+<C2E0> <C2E0> <BDC5>
+<C2E3> <C2E4> <BDC6>
+<C2EB> <C2ED> <BDC8>
+<C2EF> <C2EF> <BDCB>
+<C2F1> <C2F1> <BDCC>
+<C2F6> <C2F6> <BDCD>
+<C2F8> <C2F9> <BDCE>
+<C2FB> <C2FC> <BDD0>
+<C300> <C300> <BDD2>
+<C308> <C309> <BDD3>
+<C30C> <C30D> <BDD5>
+<C313> <C315> <BDD7>
+<C318> <C318> <BDDA>
+<C31C> <C31C> <BDDB>
+<C324> <C325> <BDDC>
+<C328> <C329> <BDDE>
+<C345> <C345> <BDE0>
+<C368> <C369> <BDE1>
+<C36C> <C36C> <BDE3>
+<C370> <C370> <BDE4>
+<C372> <C372> <BDE5>
+<C378> <C379> <BDE6>
+<C37C> <C37D> <BDE8>
+<C384> <C384> <BDEA>
+<C388> <C388> <BDEB>
+<C38C> <C38C> <BDEC>
+<C3C0> <C3C0> <BDED>
+<C3D8> <C3D9> <BDEE>
+<C3DC> <C3DC> <BDF0>
+<C3DF> <C3E0> <BDF1>
+<C3E2> <C3E2> <BDF3>
+<C3E8> <C3E9> <BDF4>
+<C3ED> <C3ED> <BDF6>
+<C3F4> <C3F5> <BDF7>
+<C3F8> <C3F8> <BDF9>
+<C408> <C408> <BDFA>
+<C410> <C410> <BDFB>
+<C424> <C424> <BDFC>
+<C42C> <C42C> <BDFD>
+<C430> <C430> <BDFE>
+<C434> <C434> <BEA1>
+<C43C> <C43D> <BEA2>
+<C448> <C448> <BEA4>
+<C464> <C465> <BEA5>
+<C468> <C468> <BEA7>
+<C46C> <C46C> <BEA8>
+<C474> <C475> <BEA9>
+<C479> <C479> <BEAB>
+<C480> <C480> <BEAC>
+<C494> <C494> <BEAD>
+<C49C> <C49C> <BEAE>
+<C4B8> <C4B8> <BEAF>
+<C4BC> <C4BC> <BEB0>
+<C4E9> <C4E9> <BEB1>
+<C4F0> <C4F1> <BEB2>
+<C4F4> <C4F4> <BEB4>
+<C4F8> <C4F8> <BEB5>
+<C4FA> <C4FA> <BEB6>
+<C4FF> <C4FF> <BEB7>
+<C500> <C501> <BEB8>
+<C50C> <C50C> <BEBA>
+<C510> <C510> <BEBB>
+<C514> <C514> <BEBC>
+<C51C> <C51C> <BEBD>
+<C528> <C529> <BEBE>
+<C52C> <C52C> <BEC0>
+<C530> <C530> <BEC1>
+endbfrange
+
+100 beginbfrange
+<C538> <C539> <BEC2>
+<C53B> <C53B> <BEC4>
+<C53D> <C53D> <BEC5>
+<C544> <C545> <BEC6>
+<C548> <C54A> <BEC8>
+<C54C> <C54E> <BECB>
+<C553> <C555> <BECE>
+<C557> <C559> <BED1>
+<C55D> <C55E> <BED4>
+<C560> <C561> <BED6>
+<C564> <C564> <BED8>
+<C568> <C568> <BED9>
+<C570> <C571> <BEDA>
+<C573> <C575> <BEDC>
+<C57C> <C57D> <BEDF>
+<C580> <C580> <BEE1>
+<C584> <C584> <BEE2>
+<C587> <C587> <BEE3>
+<C58C> <C58D> <BEE4>
+<C58F> <C58F> <BEE6>
+<C591> <C591> <BEE7>
+<C595> <C595> <BEE8>
+<C597> <C598> <BEE9>
+<C59C> <C59C> <BEEB>
+<C5A0> <C5A0> <BEEC>
+<C5A9> <C5A9> <BEED>
+<C5B4> <C5B5> <BEEE>
+<C5B8> <C5B9> <BEF0>
+<C5BB> <C5BE> <BEF2>
+<C5C4> <C5CA> <BEF6>
+<C5CC> <C5CC> <BEFD>
+<C5CE> <C5CE> <BEFE>
+<C5D0> <C5D1> <BFA1>
+<C5D4> <C5D4> <BFA3>
+<C5D8> <C5D8> <BFA4>
+<C5E0> <C5E1> <BFA5>
+<C5E3> <C5E3> <BFA7>
+<C5E5> <C5E5> <BFA8>
+<C5EC> <C5EE> <BFA9>
+<C5F0> <C5F0> <BFAC>
+<C5F4> <C5F4> <BFAD>
+<C5F6> <C5F7> <BFAE>
+<C5FC> <C5FF> <BFB0>
+<C600> <C601> <BFB4>
+<C605> <C608> <BFB6>
+<C60C> <C60C> <BFBA>
+<C610> <C610> <BFBB>
+<C618> <C619> <BFBC>
+<C61B> <C61C> <BFBE>
+<C624> <C625> <BFC0>
+<C628> <C628> <BFC2>
+<C62C> <C62E> <BFC3>
+<C630> <C630> <BFC6>
+<C633> <C635> <BFC7>
+<C637> <C637> <BFCA>
+<C639> <C639> <BFCB>
+<C63B> <C63B> <BFCC>
+<C640> <C641> <BFCD>
+<C644> <C644> <BFCF>
+<C648> <C648> <BFD0>
+<C650> <C651> <BFD1>
+<C653> <C655> <BFD3>
+<C65C> <C65D> <BFD6>
+<C660> <C660> <BFD8>
+<C66C> <C66C> <BFD9>
+<C66F> <C66F> <BFDA>
+<C671> <C671> <BFDB>
+<C678> <C679> <BFDC>
+<C67C> <C67C> <BFDE>
+<C680> <C680> <BFDF>
+<C688> <C689> <BFE0>
+<C68B> <C68B> <BFE2>
+<C68D> <C68D> <BFE3>
+<C694> <C695> <BFE4>
+<C698> <C698> <BFE6>
+<C69C> <C69C> <BFE7>
+<C6A4> <C6A5> <BFE8>
+<C6A7> <C6A7> <BFEA>
+<C6A9> <C6A9> <BFEB>
+<C6B0> <C6B1> <BFEC>
+<C6B4> <C6B4> <BFEE>
+<C6B8> <C6BA> <BFEF>
+<C6C0> <C6C1> <BFF2>
+<C6C3> <C6C3> <BFF4>
+<C6C5> <C6C5> <BFF5>
+<C6CC> <C6CD> <BFF6>
+<C6D0> <C6D0> <BFF8>
+<C6D4> <C6D4> <BFF9>
+<C6DC> <C6DD> <BFFA>
+<C6E0> <C6E1> <BFFC>
+<C6E8> <C6E8> <BFFE>
+<C6E9> <C6E9> <C0A1>
+<C6EC> <C6EC> <C0A2>
+<C6F0> <C6F0> <C0A3>
+<C6F8> <C6F9> <C0A4>
+<C6FD> <C6FD> <C0A6>
+<C704> <C705> <C0A7>
+<C708> <C708> <C0A9>
+<C70C> <C70C> <C0AA>
+<C714> <C715> <C0AB>
+endbfrange
+
+100 beginbfrange
+<C717> <C717> <C0AD>
+<C719> <C719> <C0AE>
+<C720> <C721> <C0AF>
+<C724> <C724> <C0B1>
+<C728> <C728> <C0B2>
+<C730> <C731> <C0B3>
+<C733> <C733> <C0B5>
+<C735> <C735> <C0B6>
+<C737> <C737> <C0B7>
+<C73C> <C73D> <C0B8>
+<C740> <C740> <C0BA>
+<C744> <C744> <C0BB>
+<C74A> <C74A> <C0BC>
+<C74C> <C74D> <C0BD>
+<C74F> <C74F> <C0BF>
+<C751> <C758> <C0C0>
+<C75C> <C75C> <C0C8>
+<C760> <C760> <C0C9>
+<C768> <C768> <C0CA>
+<C76B> <C76B> <C0CB>
+<C774> <C775> <C0CC>
+<C778> <C778> <C0CE>
+<C77C> <C77E> <C0CF>
+<C783> <C785> <C0D2>
+<C787> <C78A> <C0D5>
+<C78E> <C78E> <C0D9>
+<C790> <C791> <C0DA>
+<C794> <C794> <C0DC>
+<C796> <C798> <C0DD>
+<C79A> <C79A> <C0E0>
+<C7A0> <C7A1> <C0E1>
+<C7A3> <C7A6> <C0E3>
+<C7AC> <C7AD> <C0E7>
+<C7B0> <C7B0> <C0E9>
+<C7B4> <C7B4> <C0EA>
+<C7BC> <C7BD> <C0EB>
+<C7BF> <C7C1> <C0ED>
+<C7C8> <C7C9> <C0F0>
+<C7CC> <C7CC> <C0F2>
+<C7CE> <C7CE> <C0F3>
+<C7D0> <C7D0> <C0F4>
+<C7D8> <C7D8> <C0F5>
+<C7DD> <C7DD> <C0F6>
+<C7E4> <C7E4> <C0F7>
+<C7E8> <C7E8> <C0F8>
+<C7EC> <C7EC> <C0F9>
+<C800> <C801> <C0FA>
+<C804> <C804> <C0FC>
+<C808> <C808> <C0FD>
+<C80A> <C80A> <C0FE>
+<C810> <C811> <C1A1>
+<C813> <C813> <C1A3>
+<C815> <C816> <C1A4>
+<C81C> <C81D> <C1A6>
+<C820> <C820> <C1A8>
+<C824> <C824> <C1A9>
+<C82C> <C82D> <C1AA>
+<C82F> <C82F> <C1AC>
+<C831> <C831> <C1AD>
+<C838> <C838> <C1AE>
+<C83C> <C83C> <C1AF>
+<C840> <C840> <C1B0>
+<C848> <C849> <C1B1>
+<C84C> <C84D> <C1B3>
+<C854> <C854> <C1B5>
+<C870> <C871> <C1B6>
+<C874> <C874> <C1B8>
+<C878> <C878> <C1B9>
+<C87A> <C87A> <C1BA>
+<C880> <C881> <C1BB>
+<C883> <C883> <C1BD>
+<C885> <C887> <C1BE>
+<C88B> <C88D> <C1C1>
+<C894> <C894> <C1C4>
+<C89D> <C89D> <C1C5>
+<C89F> <C89F> <C1C6>
+<C8A1> <C8A1> <C1C7>
+<C8A8> <C8A8> <C1C8>
+<C8BC> <C8BD> <C1C9>
+<C8C4> <C8C4> <C1CB>
+<C8C8> <C8C8> <C1CC>
+<C8CC> <C8CC> <C1CD>
+<C8D4> <C8D5> <C1CE>
+<C8D7> <C8D7> <C1D0>
+<C8D9> <C8D9> <C1D1>
+<C8E0> <C8E1> <C1D2>
+<C8E4> <C8E4> <C1D4>
+<C8F5> <C8F5> <C1D5>
+<C8FC> <C8FD> <C1D6>
+<C900> <C900> <C1D8>
+<C904> <C906> <C1D9>
+<C90C> <C90D> <C1DC>
+<C90F> <C90F> <C1DE>
+<C911> <C911> <C1DF>
+<C918> <C918> <C1E0>
+<C92C> <C92C> <C1E1>
+<C934> <C934> <C1E2>
+<C950> <C951> <C1E3>
+<C954> <C954> <C1E5>
+<C958> <C958> <C1E6>
+endbfrange
+
+100 beginbfrange
+<C960> <C961> <C1E7>
+<C963> <C963> <C1E9>
+<C96C> <C96C> <C1EA>
+<C970> <C970> <C1EB>
+<C974> <C974> <C1EC>
+<C97C> <C97C> <C1ED>
+<C988> <C989> <C1EE>
+<C98C> <C98C> <C1F0>
+<C990> <C990> <C1F1>
+<C998> <C999> <C1F2>
+<C99B> <C99B> <C1F4>
+<C99D> <C99D> <C1F5>
+<C9C0> <C9C1> <C1F6>
+<C9C4> <C9C4> <C1F8>
+<C9C7> <C9C8> <C1F9>
+<C9CA> <C9CA> <C1FB>
+<C9D0> <C9D1> <C1FC>
+<C9D3> <C9D3> <C1FE>
+<C9D5> <C9D6> <C2A1>
+<C9D9> <C9DA> <C2A3>
+<C9DC> <C9DD> <C2A5>
+<C9E0> <C9E0> <C2A7>
+<C9E2> <C9E2> <C2A8>
+<C9E4> <C9E4> <C2A9>
+<C9E7> <C9E7> <C2AA>
+<C9EC> <C9ED> <C2AB>
+<C9EF> <C9F1> <C2AD>
+<C9F8> <C9F9> <C2B0>
+<C9FC> <C9FC> <C2B2>
+<CA00> <CA00> <C2B3>
+<CA08> <CA09> <C2B4>
+<CA0B> <CA0D> <C2B6>
+<CA14> <CA14> <C2B9>
+<CA18> <CA18> <C2BA>
+<CA29> <CA29> <C2BB>
+<CA4C> <CA4D> <C2BC>
+<CA50> <CA50> <C2BE>
+<CA54> <CA54> <C2BF>
+<CA5C> <CA5D> <C2C0>
+<CA5F> <CA61> <C2C2>
+<CA68> <CA68> <C2C5>
+<CA7D> <CA7D> <C2C6>
+<CA84> <CA84> <C2C7>
+<CA98> <CA98> <C2C8>
+<CABC> <CABD> <C2C9>
+<CAC0> <CAC0> <C2CB>
+<CAC4> <CAC4> <C2CC>
+<CACC> <CACD> <C2CD>
+<CACF> <CACF> <C2CF>
+<CAD1> <CAD1> <C2D0>
+<CAD3> <CAD3> <C2D1>
+<CAD8> <CAD9> <C2D2>
+<CAE0> <CAE0> <C2D4>
+<CAEC> <CAEC> <C2D5>
+<CAF4> <CAF4> <C2D6>
+<CB08> <CB08> <C2D7>
+<CB10> <CB10> <C2D8>
+<CB14> <CB14> <C2D9>
+<CB18> <CB18> <C2DA>
+<CB20> <CB21> <C2DB>
+<CB41> <CB41> <C2DD>
+<CB48> <CB49> <C2DE>
+<CB4C> <CB4C> <C2E0>
+<CB50> <CB50> <C2E1>
+<CB58> <CB59> <C2E2>
+<CB5D> <CB5D> <C2E4>
+<CB64> <CB64> <C2E5>
+<CB78> <CB79> <C2E6>
+<CB9C> <CB9C> <C2E8>
+<CBB8> <CBB8> <C2E9>
+<CBD4> <CBD4> <C2EA>
+<CBE4> <CBE4> <C2EB>
+<CBE7> <CBE7> <C2EC>
+<CBE9> <CBE9> <C2ED>
+<CC0C> <CC0D> <C2EE>
+<CC10> <CC10> <C2F0>
+<CC14> <CC14> <C2F1>
+<CC1C> <CC1D> <C2F2>
+<CC21> <CC22> <C2F4>
+<CC27> <CC29> <C2F6>
+<CC2C> <CC2C> <C2F9>
+<CC2E> <CC2E> <C2FA>
+<CC30> <CC30> <C2FB>
+<CC38> <CC39> <C2FC>
+<CC3B> <CC3B> <C2FE>
+<CC3C> <CC3E> <C3A1>
+<CC44> <CC45> <C3A4>
+<CC48> <CC48> <C3A6>
+<CC4C> <CC4C> <C3A7>
+<CC54> <CC55> <C3A8>
+<CC57> <CC59> <C3AA>
+<CC60> <CC60> <C3AD>
+<CC64> <CC64> <C3AE>
+<CC66> <CC66> <C3AF>
+<CC68> <CC68> <C3B0>
+<CC70> <CC70> <C3B1>
+<CC75> <CC75> <C3B2>
+<CC98> <CC99> <C3B3>
+<CC9C> <CC9C> <C3B5>
+<CCA0> <CCA0> <C3B6>
+endbfrange
+
+100 beginbfrange
+<CCA8> <CCA9> <C3B7>
+<CCAB> <CCAD> <C3B9>
+<CCB4> <CCB5> <C3BC>
+<CCB8> <CCB8> <C3BE>
+<CCBC> <CCBC> <C3BF>
+<CCC4> <CCC5> <C3C0>
+<CCC7> <CCC7> <C3C2>
+<CCC9> <CCC9> <C3C3>
+<CCD0> <CCD0> <C3C4>
+<CCD4> <CCD4> <C3C5>
+<CCE4> <CCE4> <C3C6>
+<CCEC> <CCEC> <C3C7>
+<CCF0> <CCF0> <C3C8>
+<CD01> <CD01> <C3C9>
+<CD08> <CD09> <C3CA>
+<CD0C> <CD0C> <C3CC>
+<CD10> <CD10> <C3CD>
+<CD18> <CD19> <C3CE>
+<CD1B> <CD1B> <C3D0>
+<CD1D> <CD1D> <C3D1>
+<CD24> <CD24> <C3D2>
+<CD28> <CD28> <C3D3>
+<CD2C> <CD2C> <C3D4>
+<CD39> <CD39> <C3D5>
+<CD5C> <CD5C> <C3D6>
+<CD60> <CD60> <C3D7>
+<CD64> <CD64> <C3D8>
+<CD6C> <CD6D> <C3D9>
+<CD6F> <CD6F> <C3DB>
+<CD71> <CD71> <C3DC>
+<CD78> <CD78> <C3DD>
+<CD88> <CD88> <C3DE>
+<CD94> <CD95> <C3DF>
+<CD98> <CD98> <C3E1>
+<CD9C> <CD9C> <C3E2>
+<CDA4> <CDA5> <C3E3>
+<CDA7> <CDA7> <C3E5>
+<CDA9> <CDA9> <C3E6>
+<CDB0> <CDB0> <C3E7>
+<CDC4> <CDC4> <C3E8>
+<CDCC> <CDCC> <C3E9>
+<CDD0> <CDD0> <C3EA>
+<CDE8> <CDE8> <C3EB>
+<CDEC> <CDEC> <C3EC>
+<CDF0> <CDF0> <C3ED>
+<CDF8> <CDF9> <C3EE>
+<CDFB> <CDFB> <C3F0>
+<CDFD> <CDFD> <C3F1>
+<CE04> <CE04> <C3F2>
+<CE08> <CE08> <C3F3>
+<CE0C> <CE0C> <C3F4>
+<CE14> <CE14> <C3F5>
+<CE19> <CE19> <C3F6>
+<CE20> <CE21> <C3F7>
+<CE24> <CE24> <C3F9>
+<CE28> <CE28> <C3FA>
+<CE30> <CE31> <C3FB>
+<CE33> <CE33> <C3FD>
+<CE35> <CE35> <C3FE>
+<CE58> <CE59> <C4A1>
+<CE5C> <CE5C> <C4A3>
+<CE5F> <CE61> <C4A4>
+<CE68> <CE69> <C4A7>
+<CE6B> <CE6B> <C4A9>
+<CE6D> <CE6D> <C4AA>
+<CE74> <CE75> <C4AB>
+<CE78> <CE78> <C4AD>
+<CE7C> <CE7C> <C4AE>
+<CE84> <CE85> <C4AF>
+<CE87> <CE87> <C4B1>
+<CE89> <CE89> <C4B2>
+<CE90> <CE91> <C4B3>
+<CE94> <CE94> <C4B5>
+<CE98> <CE98> <C4B6>
+<CEA0> <CEA1> <C4B7>
+<CEA3> <CEA5> <C4B9>
+<CEAC> <CEAD> <C4BC>
+<CEC1> <CEC1> <C4BE>
+<CEE4> <CEE5> <C4BF>
+<CEE8> <CEE8> <C4C1>
+<CEEB> <CEEC> <C4C2>
+<CEF4> <CEF5> <C4C4>
+<CEF7> <CEF9> <C4C6>
+<CF00> <CF01> <C4C9>
+<CF04> <CF04> <C4CB>
+<CF08> <CF08> <C4CC>
+<CF10> <CF11> <C4CD>
+<CF13> <CF13> <C4CF>
+<CF15> <CF15> <C4D0>
+<CF1C> <CF1C> <C4D1>
+<CF20> <CF20> <C4D2>
+<CF24> <CF24> <C4D3>
+<CF2C> <CF2D> <C4D4>
+<CF2F> <CF31> <C4D6>
+<CF38> <CF38> <C4D9>
+<CF54> <CF55> <C4DA>
+<CF58> <CF58> <C4DC>
+<CF5C> <CF5C> <C4DD>
+<CF64> <CF65> <C4DE>
+<CF67> <CF67> <C4E0>
+endbfrange
+
+100 beginbfrange
+<CF69> <CF69> <C4E1>
+<CF70> <CF71> <C4E2>
+<CF74> <CF74> <C4E4>
+<CF78> <CF78> <C4E5>
+<CF80> <CF80> <C4E6>
+<CF85> <CF85> <C4E7>
+<CF8C> <CF8C> <C4E8>
+<CFA1> <CFA1> <C4E9>
+<CFA8> <CFA8> <C4EA>
+<CFB0> <CFB0> <C4EB>
+<CFC4> <CFC4> <C4EC>
+<CFE0> <CFE1> <C4ED>
+<CFE4> <CFE4> <C4EF>
+<CFE8> <CFE8> <C4F0>
+<CFF0> <CFF1> <C4F1>
+<CFF3> <CFF3> <C4F3>
+<CFF5> <CFF5> <C4F4>
+<CFFC> <CFFC> <C4F5>
+<D000> <D000> <C4F6>
+<D004> <D004> <C4F7>
+<D011> <D011> <C4F8>
+<D018> <D018> <C4F9>
+<D02D> <D02D> <C4FA>
+<D034> <D035> <C4FB>
+<D038> <D038> <C4FD>
+<D03C> <D03C> <C4FE>
+<D044> <D045> <C5A1>
+<D047> <D047> <C5A3>
+<D049> <D049> <C5A4>
+<D050> <D050> <C5A5>
+<D054> <D054> <C5A6>
+<D058> <D058> <C5A7>
+<D060> <D060> <C5A8>
+<D06C> <D06D> <C5A9>
+<D070> <D070> <C5AB>
+<D074> <D074> <C5AC>
+<D07C> <D07D> <C5AD>
+<D081> <D081> <C5AF>
+<D0A4> <D0A5> <C5B0>
+<D0A8> <D0A8> <C5B2>
+<D0AC> <D0AC> <C5B3>
+<D0B4> <D0B5> <C5B4>
+<D0B7> <D0B7> <C5B6>
+<D0B9> <D0B9> <C5B7>
+<D0C0> <D0C1> <C5B8>
+<D0C4> <D0C4> <C5BA>
+<D0C8> <D0C9> <C5BB>
+<D0D0> <D0D1> <C5BD>
+<D0D3> <D0D5> <C5BF>
+<D0DC> <D0DD> <C5C2>
+<D0E0> <D0E0> <C5C4>
+<D0E4> <D0E4> <C5C5>
+<D0EC> <D0ED> <C5C6>
+<D0EF> <D0F1> <C5C8>
+<D0F8> <D0F8> <C5CB>
+<D10D> <D10D> <C5CC>
+<D130> <D131> <C5CD>
+<D134> <D134> <C5CF>
+<D138> <D138> <C5D0>
+<D13A> <D13A> <C5D1>
+<D140> <D141> <C5D2>
+<D143> <D145> <C5D4>
+<D14C> <D14D> <C5D7>
+<D150> <D150> <C5D9>
+<D154> <D154> <C5DA>
+<D15C> <D15D> <C5DB>
+<D15F> <D15F> <C5DD>
+<D161> <D161> <C5DE>
+<D168> <D168> <C5DF>
+<D16C> <D16C> <C5E0>
+<D17C> <D17C> <C5E1>
+<D184> <D184> <C5E2>
+<D188> <D188> <C5E3>
+<D1A0> <D1A1> <C5E4>
+<D1A4> <D1A4> <C5E6>
+<D1A8> <D1A8> <C5E7>
+<D1B0> <D1B1> <C5E8>
+<D1B3> <D1B3> <C5EA>
+<D1B5> <D1B5> <C5EB>
+<D1BA> <D1BA> <C5EC>
+<D1BC> <D1BC> <C5ED>
+<D1C0> <D1C0> <C5EE>
+<D1D8> <D1D8> <C5EF>
+<D1F4> <D1F4> <C5F0>
+<D1F8> <D1F8> <C5F1>
+<D207> <D207> <C5F2>
+<D209> <D209> <C5F3>
+<D210> <D210> <C5F4>
+<D22C> <D22D> <C5F5>
+<D230> <D230> <C5F7>
+<D234> <D234> <C5F8>
+<D23C> <D23D> <C5F9>
+<D23F> <D23F> <C5FB>
+<D241> <D241> <C5FC>
+<D248> <D248> <C5FD>
+<D25C> <D25C> <C5FE>
+<D264> <D264> <C6A1>
+<D280> <D281> <C6A2>
+<D284> <D284> <C6A4>
+<D288> <D288> <C6A5>
+endbfrange
+
+100 beginbfrange
+<D290> <D291> <C6A6>
+<D295> <D295> <C6A8>
+<D29C> <D29C> <C6A9>
+<D2A0> <D2A0> <C6AA>
+<D2A4> <D2A4> <C6AB>
+<D2AC> <D2AC> <C6AC>
+<D2B1> <D2B1> <C6AD>
+<D2B8> <D2B9> <C6AE>
+<D2BC> <D2BC> <C6B0>
+<D2BF> <D2C0> <C6B1>
+<D2C2> <D2C2> <C6B3>
+<D2C8> <D2C9> <C6B4>
+<D2CB> <D2CB> <C6B6>
+<D2D4> <D2D4> <C6B7>
+<D2D8> <D2D8> <C6B8>
+<D2DC> <D2DC> <C6B9>
+<D2E4> <D2E5> <C6BA>
+<D2F0> <D2F1> <C6BC>
+<D2F4> <D2F4> <C6BE>
+<D2F8> <D2F8> <C6BF>
+<D300> <D301> <C6C0>
+<D303> <D303> <C6C2>
+<D305> <D305> <C6C3>
+<D30C> <D30E> <C6C4>
+<D310> <D310> <C6C7>
+<D314> <D314> <C6C8>
+<D316> <D316> <C6C9>
+<D31C> <D31D> <C6CA>
+<D31F> <D321> <C6CC>
+<D325> <D325> <C6CF>
+<D328> <D329> <C6D0>
+<D32C> <D32C> <C6D2>
+<D330> <D330> <C6D3>
+<D338> <D339> <C6D4>
+<D33B> <D33D> <C6D6>
+<D344> <D345> <C6D9>
+<D37C> <D37D> <C6DB>
+<D380> <D380> <C6DD>
+<D384> <D384> <C6DE>
+<D38C> <D38D> <C6DF>
+<D38F> <D391> <C6E1>
+<D398> <D399> <C6E4>
+<D39C> <D39C> <C6E6>
+<D3A0> <D3A0> <C6E7>
+<D3A8> <D3A9> <C6E8>
+<D3AB> <D3AB> <C6EA>
+<D3AD> <D3AD> <C6EB>
+<D3B4> <D3B4> <C6EC>
+<D3B8> <D3B8> <C6ED>
+<D3BC> <D3BC> <C6EE>
+<D3C4> <D3C5> <C6EF>
+<D3C8> <D3C9> <C6F1>
+<D3D0> <D3D0> <C6F3>
+<D3D8> <D3D8> <C6F4>
+<D3E1> <D3E1> <C6F5>
+<D3E3> <D3E3> <C6F6>
+<D3EC> <D3ED> <C6F7>
+<D3F0> <D3F0> <C6F9>
+<D3F4> <D3F4> <C6FA>
+<D3FC> <D3FD> <C6FB>
+<D3FF> <D3FF> <C6FD>
+<D401> <D401> <C6FE>
+<D408> <D408> <C7A1>
+<D41D> <D41D> <C7A2>
+<D440> <D440> <C7A3>
+<D444> <D444> <C7A4>
+<D45C> <D45C> <C7A5>
+<D460> <D460> <C7A6>
+<D464> <D464> <C7A7>
+<D46D> <D46D> <C7A8>
+<D46F> <D46F> <C7A9>
+<D478> <D479> <C7AA>
+<D47C> <D47C> <C7AC>
+<D47F> <D480> <C7AD>
+<D482> <D482> <C7AF>
+<D488> <D489> <C7B0>
+<D48B> <D48B> <C7B2>
+<D48D> <D48D> <C7B3>
+<D494> <D494> <C7B4>
+<D4A9> <D4A9> <C7B5>
+<D4CC> <D4CC> <C7B6>
+<D4D0> <D4D0> <C7B7>
+<D4D4> <D4D4> <C7B8>
+<D4DC> <D4DC> <C7B9>
+<D4DF> <D4DF> <C7BA>
+<D4E8> <D4E8> <C7BB>
+<D4EC> <D4EC> <C7BC>
+<D4F0> <D4F0> <C7BD>
+<D4F8> <D4F8> <C7BE>
+<D4FB> <D4FB> <C7BF>
+<D4FD> <D4FD> <C7C0>
+<D504> <D504> <C7C1>
+<D508> <D508> <C7C2>
+<D50C> <D50C> <C7C3>
+<D514> <D515> <C7C4>
+<D517> <D517> <C7C6>
+<D53C> <D53D> <C7C7>
+<D540> <D540> <C7C9>
+<D544> <D544> <C7CA>
+<D54C> <D54D> <C7CB>
+endbfrange
+
+100 beginbfrange
+<D54F> <D54F> <C7CD>
+<D551> <D551> <C7CE>
+<D558> <D559> <C7CF>
+<D55C> <D55C> <C7D1>
+<D560> <D560> <C7D2>
+<D565> <D565> <C7D3>
+<D568> <D569> <C7D4>
+<D56B> <D56B> <C7D6>
+<D56D> <D56D> <C7D7>
+<D574> <D575> <C7D8>
+<D578> <D578> <C7DA>
+<D57C> <D57C> <C7DB>
+<D584> <D585> <C7DC>
+<D587> <D589> <C7DE>
+<D590> <D590> <C7E1>
+<D5A5> <D5A5> <C7E2>
+<D5C8> <D5C9> <C7E3>
+<D5CC> <D5CC> <C7E5>
+<D5D0> <D5D0> <C7E6>
+<D5D2> <D5D2> <C7E7>
+<D5D8> <D5D9> <C7E8>
+<D5DB> <D5DB> <C7EA>
+<D5DD> <D5DD> <C7EB>
+<D5E4> <D5E5> <C7EC>
+<D5E8> <D5E8> <C7EE>
+<D5EC> <D5EC> <C7EF>
+<D5F4> <D5F5> <C7F0>
+<D5F7> <D5F7> <C7F2>
+<D5F9> <D5F9> <C7F3>
+<D600> <D601> <C7F4>
+<D604> <D604> <C7F6>
+<D608> <D608> <C7F7>
+<D610> <D611> <C7F8>
+<D613> <D615> <C7FA>
+<D61C> <D61C> <C7FD>
+<D620> <D620> <C7FE>
+<D624> <D624> <C8A1>
+<D62D> <D62D> <C8A2>
+<D638> <D639> <C8A3>
+<D63C> <D63C> <C8A5>
+<D640> <D640> <C8A6>
+<D645> <D645> <C8A7>
+<D648> <D649> <C8A8>
+<D64B> <D64B> <C8AA>
+<D64D> <D64D> <C8AB>
+<D651> <D651> <C8AC>
+<D654> <D655> <C8AD>
+<D658> <D658> <C8AF>
+<D65C> <D65C> <C8B0>
+<D667> <D667> <C8B1>
+<D669> <D669> <C8B2>
+<D670> <D671> <C8B3>
+<D674> <D674> <C8B5>
+<D683> <D683> <C8B6>
+<D685> <D685> <C8B7>
+<D68C> <D68D> <C8B8>
+<D690> <D690> <C8BA>
+<D694> <D694> <C8BB>
+<D69D> <D69D> <C8BC>
+<D69F> <D69F> <C8BD>
+<D6A1> <D6A1> <C8BE>
+<D6A8> <D6A8> <C8BF>
+<D6AC> <D6AC> <C8C0>
+<D6B0> <D6B0> <C8C1>
+<D6B9> <D6B9> <C8C2>
+<D6BB> <D6BB> <C8C3>
+<D6C4> <D6C5> <C8C4>
+<D6C8> <D6C8> <C8C6>
+<D6CC> <D6CC> <C8C7>
+<D6D1> <D6D1> <C8C8>
+<D6D4> <D6D4> <C8C9>
+<D6D7> <D6D7> <C8CA>
+<D6D9> <D6D9> <C8CB>
+<D6E0> <D6E0> <C8CC>
+<D6E4> <D6E4> <C8CD>
+<D6E8> <D6E8> <C8CE>
+<D6F0> <D6F0> <C8CF>
+<D6F5> <D6F5> <C8D0>
+<D6FC> <D6FD> <C8D1>
+<D700> <D700> <C8D3>
+<D704> <D704> <C8D4>
+<D711> <D711> <C8D5>
+<D718> <D719> <C8D6>
+<D71C> <D71C> <C8D8>
+<D720> <D720> <C8D9>
+<D728> <D729> <C8DA>
+<D72B> <D72B> <C8DC>
+<D72D> <D72D> <C8DD>
+<D734> <D735> <C8DE>
+<D738> <D738> <C8E0>
+<D73C> <D73C> <C8E1>
+<D744> <D744> <C8E2>
+<D747> <D747> <C8E3>
+<D749> <D749> <C8E4>
+<D750> <D751> <C8E5>
+<D754> <D754> <C8E7>
+<D756> <D759> <C8E8>
+<D760> <D761> <C8EC>
+<D763> <D763> <C8EE>
+<D765> <D765> <C8EF>
+endbfrange
+
+100 beginbfrange
+<D769> <D769> <C8F0>
+<D76C> <D76C> <C8F1>
+<D770> <D770> <C8F2>
+<D774> <D774> <C8F3>
+<D77C> <D77D> <C8F4>
+<D781> <D781> <C8F6>
+<D788> <D789> <C8F7>
+<D78C> <D78C> <C8F9>
+<D790> <D790> <C8FA>
+<D798> <D799> <C8FB>
+<D79B> <D79B> <C8FD>
+<D79D> <D79D> <C8FE>
+<F900> <F900> <CBD0>
+<F901> <F901> <CBD6>
+<F902> <F902> <CBE7>
+<F903> <F903> <CDCF>
+<F904> <F904> <CDE8>
+<F905> <F905> <CEAD>
+<F906> <F906> <CFFB>
+<F907> <F907> <D0A2>
+<F908> <F908> <D0B8>
+<F909> <F909> <D0D0>
+<F90A> <F90A> <D0DD>
+<F90B> <F90C> <D1D4>
+<F90D> <F90D> <D1D8>
+<F90E> <F913> <D1DB>
+<F914> <F918> <D1E2>
+<F919> <F91C> <D1E8>
+<F91D> <F91D> <D1ED>
+<F91E> <F91F> <D1EF>
+<F920> <F920> <D1F2>
+<F921> <F921> <D1F6>
+<F922> <F922> <D1FA>
+<F923> <F925> <D1FC>
+<F926> <F927> <D2A2>
+<F928> <F92C> <D2A7>
+<F92D> <F92D> <D2AD>
+<F92E> <F92E> <D2B2>
+<F92F> <F92F> <D2BE>
+<F930> <F932> <D2C2>
+<F933> <F938> <D2C6>
+<F939> <F943> <D2CD>
+<F944> <F945> <D2D9>
+<F946> <F947> <D2DE>
+<F948> <F949> <D2E1>
+<F94A> <F951> <D2E4>
+<F952> <F957> <D2F0>
+<F958> <F959> <D2F7>
+<F95A> <F95A> <D4E6>
+<F95B> <F95B> <D4FC>
+<F95C> <F95C> <D5A5>
+<F95D> <F95D> <D5AB>
+<F95E> <F95E> <D5AE>
+<F95F> <F95F> <D6B8>
+<F960> <F960> <D6CD>
+<F961> <F961> <D7CB>
+<F962> <F962> <D7E4>
+<F963> <F963> <DBC5>
+<F964> <F964> <DBE4>
+<F965> <F965> <DCA5>
+<F966> <F966> <DDA5>
+<F967> <F967> <DDD5>
+<F968> <F968> <DDF4>
+<F969> <F969> <DEFC>
+<F96A> <F96A> <DEFE>
+<F96B> <F96B> <DFB3>
+<F96C> <F96C> <DFE1>
+<F96D> <F96D> <DFE8>
+<F96E> <F96E> <E0F1>
+<F96F> <F96F> <E1AD>
+<F970> <F970> <E1ED>
+<F971> <F971> <E3F5>
+<F972> <F972> <E4A1>
+<F973> <F973> <E4A9>
+<F974> <F974> <E5AE>
+<F975> <F976> <E5B1>
+<F977> <F977> <E5B9>
+<F978> <F979> <E5BB>
+<F97A> <F97A> <E5C4>
+<F97B> <F97B> <E5CE>
+<F97C> <F97C> <E5D0>
+<F97D> <F97D> <E5D2>
+<F97E> <F97E> <E5D6>
+<F97F> <F981> <E5FA>
+<F982> <F982> <E5FE>
+<F983> <F983> <E6A1>
+<F984> <F984> <E6A4>
+<F985> <F985> <E6A7>
+<F986> <F986> <E6AD>
+<F987> <F989> <E6AF>
+<F98A> <F98A> <E6B3>
+<F98B> <F98C> <E6B7>
+<F98D> <F98D> <E6BC>
+<F98E> <F98E> <E6C4>
+<F98F> <F990> <E6C6>
+<F991> <F991> <E6CA>
+<F992> <F992> <E6D2>
+<F993> <F993> <E6D6>
+<F994> <F994> <E6D9>
+<F995> <F995> <E6DC>
+endbfrange
+
+100 beginbfrange
+<F996> <F996> <E6DF>
+<F997> <F997> <E6E1>
+<F998> <F99A> <E6E4>
+<F99B> <F99B> <E6E8>
+<F99C> <F99E> <E6EA>
+<F99F> <F99F> <E6EF>
+<F9A0> <F9A1> <E6F1>
+<F9A2> <F9A4> <E6F5>
+<F9A5> <F9A5> <E6F9>
+<F9A6> <F9A6> <E7A1>
+<F9A7> <F9A7> <E7A6>
+<F9A8> <F9A9> <E7A9>
+<F9AA> <F9AB> <E7AC>
+<F9AC> <F9AC> <E7B0>
+<F9AD> <F9AD> <E7BF>
+<F9AE> <F9AE> <E7C1>
+<F9AF> <F9B0> <E7C6>
+<F9B1> <F9B1> <E7CB>
+<F9B2> <F9B2> <E7CD>
+<F9B3> <F9B4> <E7CF>
+<F9B5> <F9B5> <E7D3>
+<F9B6> <F9B6> <E7DF>
+<F9B7> <F9B7> <E7E4>
+<F9B8> <F9B8> <E7E6>
+<F9B9> <F9B9> <E7F7>
+<F9BA> <F9BB> <E8E7>
+<F9BC> <F9BD> <E8F0>
+<F9BE> <F9BE> <E8F7>
+<F9BF> <F9BF> <E8F9>
+<F9C0> <F9C0> <E8FB>
+<F9C1> <F9C1> <E8FE>
+<F9C2> <F9C2> <E9A7>
+<F9C3> <F9C3> <E9AC>
+<F9C4> <F9C4> <E9CC>
+<F9C5> <F9C5> <E9F7>
+<F9C6> <F9C6> <EAC1>
+<F9C7> <F9C7> <EAE5>
+<F9C8> <F9C8> <EAF4>
+<F9C9> <F9C9> <EAF7>
+<F9CA> <F9CA> <EAFC>
+<F9CB> <F9CB> <EAFE>
+<F9CC> <F9CC> <EBA4>
+<F9CD> <F9CD> <EBA7>
+<F9CE> <F9CF> <EBA9>
+<F9D0> <F9D1> <EBBA>
+<F9D2> <F9D2> <EBBD>
+<F9D3> <F9D4> <EBC1>
+<F9D5> <F9D6> <EBC6>
+<F9D7> <F9D7> <EBCC>
+<F9D8> <F9DB> <EBCF>
+<F9DC> <F9DC> <EBD8>
+<F9DD> <F9DE> <ECA6>
+<F9DF> <F9DF> <ECAA>
+<F9E0> <F9E3> <ECAF>
+<F9E4> <F9E4> <ECB5>
+<F9E5> <F9E5> <ECB8>
+<F9E6> <F9E6> <ECBA>
+<F9E7> <F9E8> <ECC0>
+<F9E9> <F9EA> <ECC5>
+<F9EB> <F9EC> <ECC9>
+<F9ED> <F9ED> <ECD5>
+<F9EE> <F9EF> <ECDD>
+<F9F0> <F9F0> <ECE1>
+<F9F1> <F9F1> <ECE4>
+<F9F2> <F9F3> <ECE7>
+<F9F4> <F9F5> <ECF7>
+<F9F6> <F9F6> <ECFA>
+<F9F7> <F9F9> <EDA1>
+<F9FA> <F9FA> <EDEE>
+<F9FB> <F9FB> <EEDB>
+<F9FC> <F9FC> <F2BD>
+<F9FD> <F9FD> <F2FA>
+<F9FE> <F9FE> <F3B1>
+<F9FF> <F9FF> <F4A7>
+<FA00> <FA00> <F4EE>
+<FA01> <FA01> <F6F4>
+<FA02> <FA02> <F6F6>
+<FA03> <FA03> <F7B8>
+<FA04> <FA04> <F7C8>
+<FA05> <FA05> <F7D3>
+<FA06> <FA06> <F8DB>
+<FA07> <FA07> <F8F0>
+<FA08> <FA09> <FAA1>
+<FA0A> <FA0A> <FAE6>
+<FA0B> <FA0B> <FCA9>
+<FE31> <FE31> <A3FC>
+<FE33> <FE33> <A3DF>
+<FE35> <FE36> <A3A8>
+<FE37> <FE37> <A3FB>
+<FE38> <FE38> <A3FD>
+<FE39> <FE3A> <A1B2>
+<FE3B> <FE3C> <A1BC>
+<FE3D> <FE3E> <A1B6>
+<FE3F> <FE40> <A1B4>
+<FE41> <FE44> <A1B8>
+<FE50> <FE50> <A3AC>
+<FE51> <FE51> <A1A2>
+<FE52> <FE52> <A3AE>
+<FE54> <FE54> <A3BB>
+<FE55> <FE55> <A3BA>
+endbfrange
+
+15 beginbfrange
+<FE56> <FE56> <A3BF>
+<FE57> <FE57> <A3A1>
+<FE59> <FE5A> <A3A8>
+<FE5B> <FE5B> <A3FB>
+<FE5C> <FE5C> <A3FD>
+<FE5D> <FE5E> <A1B2>
+<FF01> <FF3B> <A3A1>
+<FF3C> <FF3C> <A1AC>
+<FF3D> <FF5D> <A3DD>
+<FF5E> <FF5E> <A2A6>
+<FFE0> <FFE1> <A1CB>
+<FFE2> <FFE2> <A1FE>
+<FFE3> <FFE3> <A3FE>
+<FFE5> <FFE5> <A1CD>
+<FFE6> <FFE6> <A3DC>
+endbfrange
+
+endcmap
+CMapName currentdict /CMap defineresource pop
+end
+end
+
+%%EndResource
+%%EOF
diff --git a/src/main/resources/Resources/cmap/UniCNS-UCS2-H b/src/main/resources/Resources/cmap/UniCNS-UCS2-H
new file mode 100644
index 0000000..80061e4
--- /dev/null
+++ b/src/main/resources/Resources/cmap/UniCNS-UCS2-H
@@ -0,0 +1 @@
+%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%IncludeResource: ProcSet (CIDInit) %%BeginResource: CMap (UniCNS-UCS2-H) %%Title: (UniCNS-UCS2-H Adobe CNS1 3) %%Version: 12.001 %%Copyright: ----------------------------------------------------------- %%Copyright: Copyright 1990-2001 Adobe Systems Incorporated. %%Copyright: All Rights Reserved. %%Copyright: %%Copyright: Patents Pending %%Copyright: %%Copyright: NOTICE: All information contained herein is the property %%Copyright: of Adobe Systems Incorporated. %%Copyright: %%Copyright: Permission is granted for redistribution of this file %%Copyright: provided this copyright notice is maintained intact and %%Copyright: that the contents of this file are not altered in any %%Copyright: way from its original form. %%Copyright: %%Copyright: PostScript and Display PostScript are trademarks of %%Copyright: Adobe Systems Incorporated which may be registered in %%Copyright: certain jurisdictions. %%Copyright: ----------------------------------------------------------- %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo 3 dict dup begin /Registry (Adobe) def /Ordering (CNS1) def /Supplement 3 def end def /CMapName /UniCNS-UCS2-H def /CMapVersion 12.001 def /CMapType 1 def /XUID [1 10 25392] def /WMode 0 def 2 begincodespacerange <0000> <D7FF> <E000> <FFFF> endcodespacerange 1 beginnotdefrange <0000> <001f> 1 endnotdefrange 100 begincidrange <0020> <007e> 1 <00a2> <00a3> 262 <00a5> <00a5> 260 <00a7> <00a7> 178 <00a8> <00a8> 13747 <00ac> <00ac> 14049 <00b0> <00b0> 280 <00b1> <00b1> 212 <00b7> <00b7> 115 <00c0> <00c0> 18788 <00c1> <00c1> 18786 <00c8> <00c8> 18792 <00c9> <00c9> 18790 <00ca> <00ca> 18801 <00d2> <00d2> 18796 <00d3> <00d3> 18794 <00d7> <00d7> 210 <00e0> <00e0> 18805 <00e1> <00e1> 18803 <00e8> <00e8> 18810 <00e9> <00e9> 18808 <00ea> <00ea> 18832 <00ec> <00ec> 18814 <00ed> <00ed> 18812 <00f2> <00f2> 18818 <00f3> <00f3> 18816 <00f7> <00f7> 211 <00f8> <00f8> 18840 <00f9> <00f9> 18822 <00fa> <00fa> 18820 <00fc> <00fc> 18827 <0100> <0100> 18785 <0101> <0101> 18802 <0112> <0112> 18789 <0113> <0113> 18807 <011a> <011a> 18791 <011b> <011b> 18809 <012b> <012b> 18811 <014b> <014b> 18841 <014c> <014c> 18793 <014d> <014d> 18815 <0153> <0153> 18839 <016b> <016b> 18819 <01cd> <01cd> 18787 <01ce> <01ce> 18804 <01d0> <01d0> 18813 <01d1> <01d1> 18795 <01d2> <01d2> 18817 <01d4> <01d4> 18821 <01d6> <01d6> 18823 <01d8> <01d8> 18824 <01da> <01da> 18825 <01dc> <01dc> 18826 <0250> <0250> 18835 <0251> <0251> 18806 <0254> <0254> 18837 <025b> <025b> 18836 <0261> <0261> 18833 <026a> <026a> 18843 <0275> <0275> 18838 <0283> <0283> 18834 <028a> <028a> 18842 <02c6> <02c6> 13748 <02c7> <02c7> 504 <02ca> <02ca> 503 <02cb> <02cb> 505 <02d9> <02d9> 502 <0308> <0308> 13747 <0391> <03a1> 417 <03a3> <03a9> 434 <03b1> <03c1> 441 <03c3> <03c9> 458 <0401> <0401> 13936 <0410> <0415> 13930 <0416> <0435> 13937 <0436> <044f> 13970 <0451> <0451> 13969 <1ebe> <1ebe> 18798 <1ebf> <1ebf> 18829 <1ec0> <1ec0> 18800 <1ec1> <1ec1> 18831 <2013> <2013> 121 <2014> <2014> 123 <2018> <2019> 166 <201c> <201d> 168 <2022> <2022> 104 <2025> <2025> 111 <2026> <2026> 110 <2032> <2032> 173 <2035> <2035> 172 <203b> <203b> 177 <203e> <203e> 195 <20ac> <20ac> 17601 <2103> <2103> 266 <2105> <2105> 194 <2109> <2109> 267 <2116> <2116> 14054 <2121> <2121> 14055 <2160> <2169> 343 <2170> <2179> 526 endcidrange 100 begincidrange <2190> <2190> 248 <2191> <2191> 245 <2192> <2192> 247 <2193> <2193> 246 <2196> <2197> 249 <2198> <2198> 252 <2199> <2199> 251 <21b8> <21b9> 13997 <21e7> <21e7> 13996 <221a> <221a> 213 <221e> <221e> 220 <221f> <221f> 233 <2220> <2220> 232 <2223> <2223> 254 <2225> <2225> 253 <2229> <222a> 229 <222b> <222b> 237 <222e> <222e> 238 <2234> <2234> 240 <2235> <2235> 239 <223c> <223c> 228 <2252> <2252> 221 <2260> <2260> 219 <2261> <2261> 222 <2266> <2267> 217 <22a5> <22a5> 231 <22bf> <22bf> 234 <2400> <241f> 562 <2421> <2421> 594 <2460> <2469> 506 <2474> <247d> 516 <2500> <2500> 311 <2502> <2502> 312 <250c> <250c> 314 <2510> <2510> 315 <2514> <2514> 316 <2518> <2518> 317 <251c> <251c> 309 <2524> <2524> 308 <252c> <252c> 307 <2534> <2534> 306 <253c> <253c> 305 <2550> <2550> 322 <2551> <2551> 14090 <2552> <2552> 14072 <2553> <2553> 14081 <2554> <2554> 14063 <2555> <2555> 14074 <2556> <2556> 14083 <2557> <2557> 14065 <2558> <2558> 14078 <2559> <2559> 14087 <255a> <255a> 14069 <255b> <255b> 14080 <255c> <255c> 14089 <255d> <255d> 14071 <255e> <255e> 323 <255f> <255f> 14084 <2560> <2560> 14066 <2561> <2561> 325 <2562> <2562> 14086 <2563> <2563> 14068 <2564> <2564> 14073 <2565> <2565> 14082 <2566> <2566> 14064 <2567> <2567> 14079 <2568> <2568> 14088 <2569> <2569> 14070 <256a> <256a> 324 <256b> <256b> 14085 <256c> <256c> 14067 <256d> <256e> 318 <256f> <256f> 321 <2570> <2570> 320 <2571> <2573> 330 <2581> <2588> 290 <2589> <2589> 304 <258a> <258a> 303 <258b> <258b> 302 <258c> <258c> 301 <258d> <258d> 300 <258e> <258e> 299 <258f> <258f> 298 <2593> <2593> 14096 <2594> <2594> 310 <2595> <2595> 313 <25a0> <25a0> 190 <25a1> <25a1> 189 <25b2> <25b2> 183 <25b3> <25b3> 182 <25bc> <25bc> 192 <25bd> <25bd> 191 <25c6> <25c6> 188 <25c7> <25c7> 187 <25cb> <25cb> 180 <25ce> <25ce> 184 <25cf> <25cf> 181 <25e2> <25e3> 326 <25e4> <25e4> 329 <25e5> <25e5> 328 endcidrange 100 begincidrange <2605> <2605> 186 <2606> <2606> 185 <2609> <2609> 244 <2640> <2640> 241 <2641> <2641> 243 <2642> <2642> 242 <273d> <273d> 13760 <2e80> <2e80> 17608 <2e84> <2e84> 17692 <2e86> <2e88> 17693 <2e8a> <2e8a> 17696 <2e8c> <2e8d> 17697 <2e95> <2e95> 17699 <2e9c> <2e9c> 17700 <2e9d> <2e9d> 732 <2ea5> <2ea5> 17701 <2ea7> <2ea7> 17702 <2eaa> <2eaa> 17703 <2eac> <2eac> 17704 <2eae> <2eae> 17705 <2eb6> <2eb6> 17706 <2ebc> <2ebc> 17707 <2ebe> <2ebe> 17708 <2ec6> <2ec6> 1289 <2eca> <2eca> 17709 <2ecc> <2ecd> 17710 <2ecf> <2ecf> 17712 <2ed6> <2ed7> 17713 <2ede> <2ede> 17715 <2ee3> <2ee3> 2550 <2f33> <2f33> 551 <3000> <3000> 99 <3001> <3002> 101 <3003> <3003> 179 <3005> <3007> 13754 <3008> <3009> 148 <300a> <300b> 144 <300c> <300d> 152 <300e> <300f> 156 <3010> <3011> 140 <3012> <3012> 261 <3014> <3015> 136 <301d> <301e> 170 <3021> <3029> 353 <3041> <3093> 13761 <309b> <309c> 17606 <309d> <309e> 13751 <30a1> <30f6> 13844 <30fc> <30fc> 13757 <30fd> <30fe> 13749 <3105> <3129> 465 <3231> <3231> 14053 <32a3> <32a3> 193 <338e> <338f> 277 <339c> <339e> 272 <33a1> <33a1> 276 <33c4> <33c4> 279 <33ce> <33ce> 275 <33d1> <33d1> 236 <33d2> <33d2> 235 <33d5> <33d5> 271 <3435> <3435> 14781 <3440> <3440> 15463 <344c> <344c> 17811 <3464> <3464> 14981 <3473> <3473> 15813 <347a> <347a> 16435 <347d> <347d> 17815 <347e> <347e> 18083 <3493> <3493> 17310 <3496> <3496> 14300 <34a5> <34a5> 17816 <34af> <34af> 15487 <34bc> <34bc> 17280 <34c1> <34c1> 17659 <34c8> <34c8> 15616 <34df> <34df> 16036 <34e4> <34e4> 15956 <34fb> <34fb> 15818 <3506> <3506> 17206 <353e> <353e> 17639 <3551> <3551> 17825 <3553> <3553> 17317 <3561> <3561> 16600 <356d> <356d> 17828 <3570> <3570> 15151 <3572> <3572> 17829 <3577> <3577> 16075 <3578> <3578> 17273 <3584> <3584> 14843 <3597> <3597> 15149 <3598> <3598> 17840 <35a1> <35a1> 16610 <35a5> <35a5> 17841 <35ad> <35ad> 16124 <35bf> <35bf> 17842 <35c1> <35c1> 17792 <35c5> <35c5> 17844 <35c7> <35c7> 17823 <35ca> <35ca> 15939 endcidrange 100 begincidrange <35ce> <35ce> 16001 <35d2> <35d2> 16329 <35d6> <35d6> 16309 <35db> <35db> 18189 <35dd> <35dd> 17324 <35f1> <35f1> 18070 <35f2> <35f2> 17959 <35f3> <35f3> 16236 <35fb> <35fb> 17864 <35fe> <35fe> 16234 <3609> <3609> 17909 <3618> <3618> 18545 <361a> <361a> 17946 <3623> <3623> 16582 <362d> <362d> 16006 <3635> <3635> 18734 <3639> <3639> 16741 <363e> <363e> 14856 <3647> <3647> 18438 <3648> <3648> 14342 <3649> <3649> 16403 <364e> <364e> 18072 <365f> <365f> 15859 <367a> <367a> 16099 <3681> <3681> 17830 <369a> <369a> 15473 <36a5> <36a5> 18690 <36aa> <36aa> 15152 <36ac> <36ac> 18688 <36b0> <36b0> 15583 <36b1> <36b1> 16589 <36b5> <36b5> 15298 <36b9> <36b9> 18567 <36bc> <36bc> 15615 <36c1> <36c1> 14277 <36c3> <36c3> 16613 <36c4> <36c4> 14597 <36c5> <36c5> 17046 <36c7> <36c7> 15674 <36c8> <36c8> 18464 <36d3> <36d3> 14904 <36d4> <36d4> 15283 <36d6> <36d6> 15628 <36dd> <36dd> 14902 <36e1> <36e1> 14716 <36e2> <36e2> 15581 <36e5> <36e5> 16918 <36e6> <36e6> 16636 <36f5> <36f5> 14872 <3701> <3701> 14900 <3703> <3703> 17935 <3708> <3708> 16639 <370a> <370a> 15573 <370d> <370d> 16952 <371c> <371c> 15870 <3722> <3722> 14713 <3723> <3723> 14720 <3725> <3725> 14409 <372c> <372c> 15500 <372d> <372d> 15671 <3730> <3730> 18780 <3732> <3732> 16646 <3733> <3733> 14743 <373a> <373a> 15958 <3740> <3740> 16898 <3743> <3743> 16438 <3762> <3762> 15798 <376f> <376f> 18379 <3797> <3797> 17901 <37a0> <37a0> 14888 <37b9> <37b9> 17335 <37be> <37be> 14654 <37f2> <37f2> 15265 <37f8> <37f8> 17106 <37fb> <37fb> 16117 <380f> <380f> 17964 <3819> <3819> 14767 <3820> <3820> 17967 <382d> <382d> 16686 <3836> <3836> 16691 <3838> <3838> 17339 <3863> <3863> 18115 <38a0> <38a0> 16709 <38c3> <38c3> 14610 <38cc> <38cc> 16502 <38d1> <38d1> 14997 <38fa> <38fa> 17643 <3908> <3908> 17970 <3914> <3914> 17342 <3927> <3927> 15409 <3932> <3932> 16770 <393f> <393f> 17971 <394d> <394d> 17972 <3963> <3963> 16739 <3980> <3980> 14452 <3989> <3989> 17976 <398a> <398a> 15592 <3992> <3992> 17270 <3999> <3999> 14778 <399b> <399b> 15795 endcidrange 100 begincidrange <39a1> <39a1> 15897 <39a4> <39a4> 15887 <39b8> <39b8> 17979 <39dc> <39dc> 16078 <39e2> <39e2> 18120 <39e5> <39e5> 14651 <39ec> <39ec> 17168 <39f8> <39f8> 17982 <39fb> <39fb> 17221 <39fe> <39fe> 17256 <3a01> <3a01> 16864 <3a03> <3a03> 17984 <3a06> <3a06> 17271 <3a17> <3a17> 16784 <3a18> <3a18> 17295 <3a29> <3a29> 14942 <3a2a> <3a2a> 16095 <3a34> <3a34> 17177 <3a4b> <3a4b> 17988 <3a52> <3a52> 16083 <3a57> <3a57> 16798 <3a5c> <3a5c> 16324 <3a5e> <3a5e> 15111 <3a66> <3a66> 16796 <3a67> <3a67> 17203 <3a97> <3a97> 17991 <3aab> <3aab> 16529 <3abd> <3abd> 17993 <3ade> <3ade> 16716 <3ae0> <3ae0> 14970 <3af0> <3af0> 18098 <3af2> <3af2> 17996 <3afb> <3afb> 15090 <3b0e> <3b0e> 14568 <3b19> <3b19> 18117 <3b22> <3b22> 17998 <3b2b> <3b2b> 18774 <3b39> <3b39> 18251 <3b42> <3b42> 18000 <3b58> <3b58> 18002 <3b60> <3b60> 14650 <3b71> <3b71> 18006 <3b72> <3b72> 18005 <3b7b> <3b7b> 18007 <3b7c> <3b7c> 14426 <3b80> <3b80> 16866 <3b96> <3b96> 15004 <3b99> <3b99> 15000 <3ba1> <3ba1> 16873 <3bbc> <3bbc> 17352 <3bbe> <3bbe> 15793 <3bc2> <3bc2> 16692 <3bc4> <3bc4> 15008 <3bd7> <3bd7> 15020 <3bdd> <3bdd> 18015 <3bec> <3bec> 18020 <3bf2> <3bf2> 18022 <3bf3> <3bf3> 16883 <3bf4> <3bf4> 14958 <3c0d> <3c0d> 16887 <3c11> <3c11> 15936 <3c15> <3c15> 14744 <3c54> <3c54> 15872 <3ccb> <3ccb> 18032 <3ccd> <3ccd> 15589 <3cd1> <3cd1> 16387 <3cd6> <3cd6> 15607 <3cdc> <3cdc> 16462 <3ceb> <3ceb> 16919 <3cef> <3cef> 18037 <3d13> <3d13> 14195 <3d1d> <3d1d> 14652 <3d32> <3d32> 18775 <3d3b> <3d3b> 16965 <3d46> <3d46> 18053 <3d4c> <3d4c> 15595 <3d4e> <3d4e> 16962 <3d51> <3d51> 14570 <3d5f> <3d5f> 16729 <3d62> <3d62> 15454 <3d69> <3d69> 15594 <3d6a> <3d6a> 18057 <3d6f> <3d6f> 15612 <3d75> <3d75> 18058 <3d7d> <3d7d> 15407 <3d85> <3d85> 18763 <3d8a> <3d8a> 18061 <3d8f> <3d8f> 15037 <3d91> <3d91> 18063 <3da5> <3da5> 15702 <3dad> <3dad> 18073 <3db4> <3db4> 16550 <3dbf> <3dbf> 14288 <3dc6> <3dc6> 18654 <3dc7> <3dc7> 16740 <3dcc> <3dcc> 15727 <3dcd> <3dcd> 15091 <3dd3> <3dd3> 14305 <3ddb> <3ddb> 16383 <3de7> <3de7> 14745 endcidrange 100 begincidrange <3de8> <3de8> 16989 <3deb> <3deb> 15962 <3df3> <3df3> 18132 <3df7> <3df7> 18603 <3dfc> <3dfc> 17963 <3dfd> <3dfd> 15380 <3e06> <3e06> 18717 <3e40> <3e40> 16745 <3e43> <3e43> 17261 <3e48> <3e48> 17813 <3e55> <3e55> 17023 <3e74> <3e74> 16098 <3ea8> <3ea8> 17156 <3ea9> <3ea9> 18157 <3eaa> <3eaa> 16501 <3ead> <3ead> 15261 <3eb1> <3eb1> 15064 <3eb8> <3eb8> 14923 <3ebf> <3ebf> 15115 <3ec2> <3ec2> 15320 <3ec7> <3ec7> 14709 <3eca> <3eca> 18161 <3ecc> <3ecc> 15330 <3ed0> <3ed0> 14420 <3ed1> <3ed1> 18162 <3ed6> <3ed6> 15533 <3ed7> <3ed7> 17055 <3eda> <3eda> 15618 <3ede> <3ede> 14834 <3ee1> <3ee1> 15528 <3ee2> <3ee2> 18166 <3ee7> <3ee7> 15324 <3ee9> <3ee9> 15524 <3eeb> <3eeb> 14698 <3ef0> <3ef0> 18167 <3ef3> <3ef3> 15069 <3ef4> <3ef4> 18168 <3efa> <3efa> 18169 <3efc> <3efc> 15336 <3eff> <3eff> 15093 <3f00> <3f00> 15373 <3f04> <3f04> 17091 <3f06> <3f06> 15063 <3f0e> <3f0e> 18171 <3f53> <3f53> 18172 <3f58> <3f58> 15081 <3f59> <3f59> 16521 <3f63> <3f63> 15078 <3f7c> <3f7c> 18176 <3f93> <3f93> 17869 <3fc0> <3fc0> 17359 <3fd7> <3fd7> 17361 <3fdc> <3fdc> 18180 <3fe5> <3fe5> 18143 <3fed> <3fed> 17205 <3ff9> <3ff9> 17879 <3ffa> <3ffa> 17236 <4004> <4004> 16654 <401d> <401d> 18185 <4039> <4039> 18187 <4045> <4045> 18188 <4053> <4053> 17846 <4057> <4057> 14749 <4062> <4062> 15307 <4065> <4065> 16339 <406a> <406a> 18191 <406f> <406f> 18192 <40a8> <40a8> 17365 <40bb> <40bb> 17856 <40bf> <40bf> 16108 <40c8> <40c8> 15118 <40d8> <40d8> 16811 <40df> <40df> 15895 <40fa> <40fa> 16062 <4103> <4103> 17367 <4104> <4104> 16988 <4109> <4109> 18204 <410e> <410e> 15131 <4132> <4132> 15141 <4167> <4167> 18207 <416c> <416c> 14510 <416e> <416e> 15139 <417f> <417f> 15234 <4190> <4190> 18112 <41b2> <41b2> 18208 <41c4> <41c4> 18211 <41ca> <41ca> 14143 <41cf> <41cf> 18214 <41db> <41db> 14271 <41ef> <41ef> 14147 <41f9> <41f9> 15166 <4211> <4211> 15169 <4240> <4240> 14321 <4260> <4260> 18219 <426a> <426a> 15189 <427a> <427a> 18220 <428c> <428c> 18223 <4294> <4294> 18225 <42b5> <42b5> 16400 <42b9> <42b9> 14502 endcidrange 100 begincidrange <42bc> <42bc> 15498 <42f4> <42f4> 15289 <42fb> <42fb> 15598 <42fc> <42fc> 16870 <432b> <432b> 14205 <436e> <436e> 18122 <4397> <4397> 18235 <43ba> <43ba> 17247 <43c1> <43c1> 18069 <43d9> <43d9> 17214 <43df> <43df> 15945 <43ed> <43ed> 18245 <43f2> <43f2> 15944 <4401> <4401> 18250 <4402> <4402> 15219 <4413> <4413> 18255 <4425> <4425> 18257 <442d> <442d> 18258 <447a> <447a> 14255 <448f> <448f> 18264 <449f> <449f> 15074 <44a0> <44a0> 14317 <44a2> <44a2> 16505 <44b0> <44b0> 18268 <44b7> <44b7> 16289 <44c0> <44c0> 15367 <44c5> <44c5> 16912 <44ce> <44ce> 15651 <44dd> <44dd> 14813 <44df> <44df> 15650 <44e4> <44e4> 14306 <44e9> <44e9> 16847 <44ea> <44ea> 15217 <44eb> <44eb> 15602 <44ec> <44ec> 16052 <44f4> <44f4> 14738 <4503> <4503> 18079 <4504> <4504> 18275 <4509> <4509> 15952 <450b> <450b> 14292 <4516> <4516> 14329 <451d> <451d> 14183 <4527> <4527> 14327 <452e> <452e> 15571 <4533> <4533> 15441 <453b> <453b> 18282 <453d> <453d> 14532 <453f> <453f> 15890 <4543> <4543> 14323 <4551> <4551> 15076 <4552> <4552> 16563 <4555> <4555> 16958 <455c> <455c> 14219 <4562> <4562> 18752 <456a> <456a> 14340 <4577> <4577> 18286 <4585> <4585> 14533 <45e9> <45e9> 16100 <4606> <4606> 18291 <460f> <460f> 14357 <4615> <4615> 14403 <4617> <4617> 18292 <465b> <465b> 14365 <467a> <467a> 14825 <4680> <4680> 15617 <46cf> <46cf> 15264 <46d0> <46d0> 15866 <46f5> <46f5> 15263 <4713> <4713> 14387 <4718> <4718> 15815 <474e> <474e> 16060 <477c> <477c> 15821 <4798> <4798> 18305 <47a6> <47a6> 16547 <47b6> <47b6> 16106 <47d5> <47d5> 17178 <47ed> <47ed> 18307 <47f4> <47f4> 17199 <4800> <4800> 17950 <480b> <480b> 17234 <4837> <4837> 18311 <485d> <485d> 16655 <4871> <4871> 15619 <489b> <489b> 15293 <48ad> <48ad> 18321 <48ae> <48ae> 18765 <48d0> <48d0> 15783 <48dd> <48dd> 16672 <48ed> <48ed> 17032 <48f3> <48f3> 16065 <48fa> <48fa> 15940 <4906> <4906> 15303 <4911> <4911> 17796 <491e> <491e> 18324 <4925> <4925> 15375 <492a> <492a> 18094 <492d> <492d> 18125 <4935> <4935> 15555 <493c> <493c> 15352 <493e> <493e> 15622 endcidrange 100 begincidrange <4945> <4945> 18339 <4951> <4951> 18340 <4953> <4953> 17069 <4965> <4965> 14489 <496a> <496a> 18345 <4972> <4972> 14884 <4989> <4989> 14235 <49a1> <49a1> 14519 <49a7> <49a7> 18350 <49df> <49df> 14506 <49e5> <49e5> 18353 <49e7> <49e7> 17953 <4a0f> <4a0f> 14531 <4a1d> <4a1d> 15340 <4a24> <4a24> 18354 <4a35> <4a35> 18356 <4a96> <4a96> 15591 <4ab4> <4ab4> 17249 <4ab8> <4ab8> 15784 <4ad1> <4ad1> 14563 <4ae4> <4ae4> 18359 <4aff> <4aff> 14578 <4b19> <4b19> 18361 <4b2c> <4b2c> 17951 <4b37> <4b37> 16809 <4b6f> <4b6f> 15382 <4b70> <4b70> 18368 <4b72> <4b72> 14588 <4b7b> <4b7b> 15501 <4b7e> <4b7e> 16394 <4b8e> <4b8e> 14839 <4b90> <4b90> 15392 <4b93> <4b93> 14988 <4b96> <4b96> 14658 <4b97> <4b97> 15396 <4b9d> <4b9d> 18370 <4bbd> <4bbd> 15395 <4bbe> <4bbe> 14676 <4bc0> <4bc0> 15836 <4c04> <4c04> 16315 <4c07> <4c07> 16311 <4c0e> <4c0e> 14604 <4c3b> <4c3b> 16188 <4c3e> <4c3e> 17787 <4c5b> <4c5b> 16089 <4c6d> <4c6d> 18377 <4c7d> <4c7d> 15974 <4ca4> <4ca4> 18622 <4cae> <4cae> 15426 <4cb0> <4cb0> 15429 <4cb7> <4cb7> 15905 <4ccd> <4ccd> 17784 <4ce1> <4ce1> 16115 <4ced> <4ced> 16555 <4d09> <4d09> 16086 <4d10> <4d10> 16663 <4d34> <4d34> 14645 <4d91> <4d91> 17397 <4d9c> <4d9c> 18628 <4e00> <4e00> 595 <4e01> <4e01> 597 <4e03> <4e03> 598 <4e04> <4e04> 18686 <4e07> <4e07> 6001 <4e08> <4e08> 617 <4e09> <4e09> 615 <4e0a> <4e0a> 618 <4e0b> <4e0b> 616 <4e0c> <4e0c> 6002 <4e0d> <4e0d> 660 <4e0e> <4e0e> 6010 <4e0f> <4e0f> 6008 <4e10> <4e10> 659 <4e11> <4e11> 658 <4e14> <4e14> 754 <4e15> <4e15> 753 <4e16> <4e16> 752 <4e18> <4e18> 755 <4e19> <4e19> 751 <4e1a> <4e1a> 18685 <4e1c> <4e1c> 18656 <4e1e> <4e1f> 878 <4e21> <4e21> 15725 <4e24> <4e24> 17805 <4e26> <4e26> 1320 <4e28> <4e28> 536 <4e2a> <4e2a> 16215 <4e2b> <4e2b> 619 <4e2c> <4e2c> 17651 <4e2d> <4e2d> 661 <4e2e> <4e2e> 6011 <4e30> <4e30> 662 <4e31> <4e31> 6030 <4e32> <4e32> 1045 <4e33> <4e33> 6388 <4e36> <4e36> 537 <4e37> <4e37> 17687 <4e38> <4e38> 620 <4e39> <4e39> 663 <4e3b> <4e3b> 756 endcidrange 100 begincidrange <4e3c> <4e3c> 6031 <4e3d> <4e3d> 17719 <4e3f> <4e3f> 538 <4e41> <4e41> 13999 <4e42> <4e42> 5996 <4e43> <4e43> 599 <4e45> <4e45> 622 <4e47> <4e47> 6003 <4e48> <4e48> 623 <4e49> <4e49> 16526 <4e4b> <4e4b> 664 <4e4d> <4e4d> 757 <4e4e> <4e4e> 759 <4e4f> <4e4f> 758 <4e52> <4e53> 880 <4e56> <4e56> 1321 <4e58> <4e58> 2097 <4e59> <4e59> 596 <4e5a> <4e5a> 14001 <4e5b> <4e5b> 17637 <4e5c> <4e5c> 5997 <4e5d> <4e5d> 600 <4e5e> <4e5e> 625 <4e5f> <4e5f> 624 <4e69> <4e69> 882 <4e6a> <4e6a> 15845 <4e73> <4e73> 1322 <4e78> <4e78> 15758 <4e7e> <4e7e> 2555 <4e7f> <4e7f> 7733 <4e80> <4e80> 17806 <4e81> <4e81> 17340 <4e82> <4e82> 3518 <4e83> <4e84> 9057 <4e85> <4e85> 539 <4e86> <4e86> 601 <4e87> <4e87> 17807 <4e88> <4e88> 666 <4e89> <4e89> 17820 <4e8b> <4e8b> 1323 <4e8c> <4e8c> 602 <4e8d> <4e8d> 6004 <4e8e> <4e8e> 626 <4e91> <4e91> 667 <4e92> <4e92> 669 <4e93> <4e93> 6012 <4e94> <4e94> 670 <4e95> <4e95> 668 <4e98> <4e98> 14788 <4e99> <4e99> 883 <4e9a> <4e9a> 18645 <4e9b> <4e9b> 1324 <4e9e> <4e9e> 1325 <4e9f> <4e9f> 1699 <4ea0> <4ea0> 540 <4ea1> <4ea1> 627 <4ea2> <4ea2> 671 <4ea4> <4ea4> 884 <4ea5> <4ea5> 886 <4ea6> <4ea6> 885 <4ea8> <4ea8> 1046 <4eab> <4eac> 1326 <4ead> <4eae> 1700 <4eb3> <4eb3> 2098 <4eb6> <4eb6> 9059 <4eb7> <4eb7> 16700 <4eb9> <4eb9> 13175 <4eba> <4eba> 603 <4ebb> <4ebb> 17638 <4ebc> <4ebc> 14769 <4ebf> <4ebf> 17808 <4ec0> <4ec0> 673 <4ec1> <4ec1> 672 <4ec2> <4ec2> 6013 <4ec3> <4ec3> 674 <4ec4> <4ec4> 680 <4ec6> <4ec7> 675 <4ec8> <4ec8> 6015 <4ec9> <4ec9> 6014 <4eca> <4ecb> 678 <4ecd> <4ecd> 677 <4ece> <4ece> 16226 <4ed4> <4ed7> 762 <4ed8> <4ed8> 761 <4ed9> <4ed9> 768 <4eda> <4eda> 6037 <4edc> <4edc> 6033 <4edd> <4edd> 6036 <4ede> <4ede> 769 <4edf> <4edf> 785 <4ee1> <4ee1> 6035 <4ee3> <4ee4> 766 <4ee5> <4ee5> 760 <4ee8> <4ee8> 6032 <4ee9> <4ee9> 6034 <4eea> <4eea> 18635 <4eeb> <4eeb> 17809 <4eee> <4eee> 15734 <4ef0> <4ef0> 899 <4ef1> <4ef1> 6074 endcidrange 100 begincidrange <4ef2> <4ef2> 896 <4ef3> <4ef3> 900 <4ef4> <4ef4> 6084 <4ef5> <4ef5> 6072 <4ef6> <4ef6> 897 <4ef7> <4ef7> 6076 <4ef8> <4ef8> 14765 <4efb> <4efb> 898 <4efd> <4efd> 901 <4eff> <4eff> 887 <4f00> <4f00> 6075 <4f01> <4f01> 902 <4f02> <4f02> 6079 <4f03> <4f03> 14792 <4f04> <4f04> 6083 <4f05> <4f05> 6080 <4f08> <4f08> 6077 <4f09> <4f09> 888 <4f0a> <4f0a> 890 <4f0b> <4f0b> 903 <4f0d> <4f0d> 892 <4f0e> <4f0e> 6069 <4f0f> <4f0f> 895 <4f10> <4f11> 893 <4f12> <4f12> 6085 <4f13> <4f13> 6082 <4f14> <4f14> 6073 <4f15> <4f15> 891 <4f18> <4f18> 6070 <4f19> <4f19> 889 <4f1a> <4f1a> 17724 <4f1d> <4f1d> 6078 <4f22> <4f22> 6081 <4f28> <4f28> 17725 <4f29> <4f29> 14782 <4f2c> <4f2c> 6071 <4f2d> <4f2d> 6191 <4f2f> <4f2f> 1068 <4f30> <4f30> 1055 <4f32> <4f32> 14653 <4f33> <4f33> 6192 <4f34> <4f34> 1052 <4f36> <4f36> 1070 <4f37> <4f37> 17810 <4f38> <4f38> 1060 <4f39> <4f39> 16229 <4f3a> <4f3a> 1059 <4f3b> <4f3b> 6180 <4f3c> <4f3c> 1063 <4f3d> <4f3d> 1058 <4f3e> <4f3e> 6185 <4f3f> <4f3f> 6193 <4f41> <4f41> 6189 <4f42> <4f42> 14795 <4f43> <4f43> 1061 <4f45> <4f45> 15247 <4f46> <4f46> 1064 <4f47> <4f47> 1049 <4f48> <4f48> 1073 <4f49> <4f49> 6182 <4f4b> <4f4b> 14772 <4f4c> <4f4c> 6400 <4f4d> <4f4d> 1047 <4f4e> <4f4e> 1069 <4f4f> <4f4f> 1048 <4f50> <4f51> 1056 <4f52> <4f52> 6187 <4f53> <4f53> 6183 <4f54> <4f54> 1062 <4f55> <4f55> 1054 <4f56> <4f56> 6179 <4f57> <4f57> 1050 <4f58> <4f58> 6190 <4f59> <4f59> 1071 <4f5a> <4f5a> 1074 <4f5b> <4f5b> 1053 <4f5c> <4f5c> 1066 <4f5d> <4f5d> 1072 <4f5e> <4f5e> 1051 <4f5f> <4f5f> 6188 <4f60> <4f60> 1067 <4f61> <4f61> 6194 <4f62> <4f62> 6181 <4f63> <4f63> 1065 <4f64> <4f64> 6184 <4f67> <4f67> 6186 <4f69> <4f69> 1341 <4f6a> <4f6a> 6402 <4f6b> <4f6b> 6414 <4f6c> <4f6c> 1333 <4f6e> <4f6e> 6415 <4f6f> <4f6f> 1328 <4f70> <4f70> 1338 <4f72> <4f72> 15474 <4f73> <4f73> 1331 <4f74> <4f74> 6396 <4f75> <4f75> 1339 <4f76> <4f76> 6395 <4f77> <4f77> 6399 <4f78> <4f78> 6406 endcidrange 100 begincidrange <4f79> <4f79> 6404 <4f7a> <4f7a> 1347 <4f7b> <4f7b> 1342 <4f7c> <4f7c> 6390 <4f7d> <4f7d> 6392 <4f7e> <4f7e> 1344 <4f7f> <4f7f> 1332 <4f80> <4f80> 6393 <4f81> <4f81> 6405 <4f82> <4f82> 6412 <4f83> <4f83> 1337 <4f84> <4f84> 6398 <4f85> <4f85> 6391 <4f86> <4f86> 1336 <4f87> <4f87> 6394 <4f88> <4f88> 1340 <4f89> <4f89> 6397 <4f8a> <4f8a> 14773 <4f8b> <4f8b> 1335 <4f8d> <4f8d> 1330 <4f8f> <4f8f> 1345 <4f90> <4f90> 6407 <4f91> <4f91> 1346 <4f92> <4f92> 6411 <4f94> <4f94> 6409 <4f95> <4f95> 6413 <4f96> <4f96> 1343 <4f97> <4f97> 6401 <4f98> <4f98> 6389 <4f9a> <4f9a> 6403 <4f9b> <4f9b> 1334 <4f9c> <4f9c> 6408 <4f9d> <4f9d> 1329 <4f9e> <4f9e> 6410 <4fa2> <4fa2> 14791 <4fa8> <4fa8> 17726 <4fab> <4fab> 16418 <4fae> <4fae> 1716 <4faf> <4faf> 1704 <4fb0> <4fb0> 15690 <4fb2> <4fb2> 6749 <4fb3> <4fb3> 6757 <4fb5> <4fb5> 1703 <4fb6> <4fb6> 1711 <4fb7> <4fb7> 1723 <4fb9> <4fb9> 6763 <4fba> <4fba> 6761 <4fbb> <4fbb> 6756 <4fbd> <4fbd> 17812 <4fbf> <4fbf> 1705 <4fc0> <4fc0> 6762 <4fc1> <4fc1> 6752 <4fc2> <4fc2> 1719 <4fc3> <4fc3> 1710 <4fc4> <4fc4> 1718 <4fc5> <4fc5> 6747 <4fc7> <4fc7> 6759 <4fc8> <4fc8> 18152 <4fc9> <4fc9> 6750 <4fca> <4fca> 1714 <4fcb> <4fcb> 6751 <4fcc> <4fcc> 14799 <4fcd> <4fcd> 6746 <4fce> <4fce> 1721 <4fcf> <4fcf> 1708 <4fd0> <4fd0> 1717 <4fd1> <4fd1> 1707 <4fd3> <4fd3> 6748 <4fd4> <4fd4> 6753 <4fd6> <4fd6> 6760 <4fd7> <4fd7> 1715 <4fd8> <4fd8> 1712 <4fd9> <4fd9> 6755 <4fda> <4fda> 1720 <4fdb> <4fdb> 6758 <4fdc> <4fdc> 6754 <4fdd> <4fdd> 1709 <4fde> <4fde> 1722 <4fdf> <4fdf> 1713 <4fe0> <4fe0> 1706 <4fe1> <4fe1> 1702 <4fe4> <4fe4> 15462 <4fe5> <4fe5> 14800 <4fec> <4fec> 6764 <4fee> <4fee> 2124 <4fef> <4fef> 2102 <4ff1> <4ff1> 2118 <4ff2> <4ff2> 16168 <4ff3> <4ff3> 2123 <4ff4> <4ff4> 7204 <4ff5> <4ff5> 7203 <4ff6> <4ff7> 7208 <4ff8> <4ff8> 2105 <4ff9> <4ff9> 14259 <4ffa> <4ffa> 2114 <4ffd> <4ffd> 16166 <4ffe> <4ffe> 2127 <5000> <5000> 2115 <5003> <5003> 17814 <5005> <5005> 7197 endcidrange 100 begincidrange <5006> <5006> 2108 <5007> <5007> 7198 <5008> <5008> 16420 <5009> <5009> 2129 <500b> <500b> 2120 <500c> <500d> 2099 <500e> <500e> 7217 <500f> <500f> 2572 <5011> <5011> 2113 <5012> <5012> 2112 <5013> <5013> 7199 <5014> <5014> 2116 <5015> <5015> 7749 <5016> <5016> 2107 <5017> <5017> 7210 <5018> <5018> 2122 <5019> <5019> 2121 <501a> <501a> 2111 <501b> <501b> 7202 <501c> <501c> 7211 <501e> <501e> 7196 <501f> <501f> 2110 <5020> <5020> 7212 <5021> <5021> 2119 <5022> <5022> 7200 <5023> <5023> 2101 <5025> <5025> 2104 <5026> <5026> 2103 <5027> <5027> 7213 <5028> <5028> 2117 <5029> <5029> 2106 <502a> <502a> 2126 <502b> <502b> 2128 <502c> <502c> 7207 <502d> <502d> 2125 <502e> <502e> 14796 <502f> <502f> 7215 <5030> <5030> 7201 <5031> <5031> 7216 <5033> <5033> 7205 <5034> <5034> 14608 <5035> <5035> 7214 <5037> <5037> 7206 <503c> <503c> 2109 <5040> <5040> 7757 <5041> <5041> 7745 <5043> <5043> 2560 <5045> <5045> 7750 <5046> <5046> 7756 <5047> <5047> 2559 <5048> <5048> 7743 <5049> <5049> 2563 <504a> <504a> 7747 <504b> <504b> 7740 <504c> <504c> 2561 <504d> <504d> 7744 <504e> <504e> 2566 <504f> <504f> 2571 <5051> <5051> 7761 <5053> <5053> 7739 <5055> <5055> 2567 <5056> <5056> 16172 <5057> <5057> 7760 <5058> <5058> 14801 <505a> <505a> 2562 <505b> <505b> 7746 <505c> <505c> 2558 <505d> <505d> 7741 <505e> <505e> 7737 <505f> <505f> 7751 <5060> <5060> 7738 <5061> <5061> 7736 <5062> <5062> 7748 <5063> <5064> 7754 <5065> <5065> 2564 <5066> <5066> 15817 <5068> <5068> 8376 <5069> <5069> 7752 <506a> <506a> 7735 <506b> <506b> 7753 <506c> <506c> 14797 <506d> <506d> 2574 <506e> <506e> 7758 <506f> <506f> 2573 <5070> <5070> 7734 <5072> <5072> 7742 <5073> <5073> 7759 <5074> <5074> 2569 <5075> <5075> 2568 <5076> <5076> 2565 <5077> <5077> 2570 <507a> <507a> 2556 <507d> <507d> 2557 <5080> <5080> 3052 <5081> <5081> 14798 <5082> <5082> 8379 <5083> <5083> 8372 <5085> <5085> 3049 <5087> <5087> 8380 <5088> <5088> 17308 endcidrange 100 begincidrange <508b> <508b> 8370 <508c> <508c> 8373 <508d> <508d> 3048 <508e> <508e> 8374 <5090> <5090> 16876 <5091> <5091> 3051 <5092> <5092> 8378 <5094> <5094> 8368 <5095> <5095> 8367 <5096> <5096> 3053 <5098> <5098> 3054 <5099> <5099> 3050 <509a> <509a> 3055 <509b> <509b> 8366 <509c> <509c> 8377 <509d> <509d> 8375 <509e> <509e> 8369 <50a2> <50a2> 3047 <50a3> <50a3> 8371 <50a6> <50a6> 16191 <50ac> <50ac> 3525 <50ad> <50ad> 3519 <50ae> <50ae> 9063 <50af> <50af> 3528 <50b0> <50b0> 9069 <50b1> <50b1> 9072 <50b2> <50b3> 3521 <50b4> <50b4> 9066 <50b5> <50b5> 3520 <50b6> <50b6> 9075 <50b7> <50b7> 3526 <50b8> <50b8> 9076 <50ba> <50ba> 9071 <50bb> <50bb> 3527 <50bd> <50bd> 9060 <50be> <50be> 3524 <50bf> <50bf> 9061 <50c1> <50c1> 9070 <50c2> <50c2> 9068 <50c4> <50c4> 9064 <50c5> <50c5> 3523 <50c6> <50c6> 9062 <50c7> <50c7> 3529 <50c8> <50c8> 9067 <50c9> <50c9> 9074 <50ca> <50ca> 9065 <50cb> <50cb> 9073 <50cd> <50cd> 14789 <50ce> <50ce> 3976 <50cf> <50cf> 3973 <50d0> <50d0> 14545 <50d1> <50d1> 3974 <50d3> <50d3> 9756 <50d4> <50d4> 9748 <50d5> <50d5> 3972 <50d6> <50d6> 3969 <50d7> <50d7> 9749 <50d9> <50d9> 16334 <50da> <50da> 3971 <50db> <50db> 9752 <50dd> <50dd> 9754 <50de> <50de> 16433 <50df> <50df> 15101 <50e0> <50e0> 9761 <50e1> <50e1> 16753 <50e3> <50e3> 9760 <50e4> <50e4> 9755 <50e5> <50e5> 3968 <50e6> <50e6> 9747 <50e7> <50e7> 3966 <50e8> <50e8> 9750 <50e9> <50e9> 3977 <50ea> <50ea> 9753 <50ec> <50ec> 9757 <50ed> <50ed> 3970 <50ee> <50ee> 3967 <50ef> <50ef> 9759 <50f0> <50f0> 9758 <50f1> <50f1> 3975 <50f3> <50f3> 9751 <50f4> <50f4> 15593 <50f5> <50f5> 4357 <50f6> <50f6> 10371 <50f8> <50f8> 10368 <50f9> <50f9> 4358 <50fb> <50fb> 4356 <50fc> <50fc> 14802 <50fd> <50fd> 10375 <50fe> <50fe> 10372 <50ff> <50ff> 10365 <5100> <5100> 4355 <5101> <5101> 16434 <5102> <5102> 4359 <5103> <5103> 10366 <5104> <5104> 4354 <5105> <5105> 4362 <5106> <5107> 10369 <5108> <5109> 4360 <510a> <510a> 10376 <510b> <510c> 10373 endcidrange 100 begincidrange <510d> <510d> 14790 <510e> <510e> 16436 <5110> <5110> 4749 <5111> <5111> 11012 <5112> <5112> 4746 <5113> <5113> 11009 <5114> <5114> 4748 <5115> <5115> 4750 <5117> <5117> 11010 <5118> <5118> 4747 <511a> <511a> 11011 <511c> <511c> 11008 <511f> <511f> 5045 <5120> <5120> 11582 <5121> <5121> 5046 <5122> <5122> 11580 <5124> <5124> 11581 <5125> <5125> 11579 <5126> <5126> 11578 <5129> <5129> 11583 <512a> <512a> 5044 <512b> <512b> 14766 <512d> <512e> 12047 <5130> <5130> 10367 <5131> <5131> 12046 <5132> <5132> 5047 <5133> <5133> 5493 <5134> <5135> 12410 <5137> <5138> 5736 <5139> <5139> 12998 <513a> <513a> 12997 <513b> <513b> 5820 <513c> <513c> 5819 <513d> <513d> 13326 <513f> <513f> 604 <5140> <5140> 628 <5141> <5141> 682 <5143> <5143> 681 <5144> <5144> 771 <5145> <5145> 770 <5146> <5146> 906 <5147> <5147> 905 <5148> <5148> 907 <5149> <5149> 904 <514b> <514b> 1076 <514c> <514c> 1075 <514d> <514d> 1077 <5152> <5152> 1349 <5154> <5154> 1348 <5155> <5155> 1350 <5156> <5156> 17306 <5157> <5157> 1724 <5159> <5159> 281 <515a> <515a> 7218 <515b> <515b> 282 <515c> <515c> 2575 <515d> <515d> 284 <515e> <515e> 283 <515f> <515f> 8381 <5160> <5160> 16442 <5161> <5161> 285 <5162> <5162> 3978 <5163> <5163> 286 <5165> <5165> 605 <5167> <5167> 683 <5168> <5168> 908 <5169> <5169> 1351 <516a> <516a> 16444 <516b> <516b> 606 <516c> <516c> 686 <516d> <516e> 684 <5171> <5171> 909 <5174> <5174> 17727 <5175> <5175> 1078 <5176> <5176> 1353 <5177> <5177> 1352 <5178> <5178> 1354 <5179> <5179> 15054 <517c> <517c> 2130 <5180> <5180> 4751 <5182> <5182> 541 <5186> <5186> 17311 <5187> <5187> 6009 <5188> <5188> 14006 <5189> <518a> 772 <518d> <518d> 910 <518f> <518f> 6195 <5191> <5191> 1726 <5192> <5192> 1725 <5193> <5193> 7220 <5194> <5194> 7219 <5195> <5195> 2576 <5196> <5196> 542 <5197> <5197> 687 <5198> <5198> 6016 <519a> <519a> 16035 <519c> <519c> 17728 <519e> <519e> 6416 <51a0> <51a0> 1727 <51a2> <51a2> 2133 endcidrange 100 begincidrange <51a4> <51a5> 2131 <51a7> <51a7> 16038 <51a8> <51a8> 14810 <51aa> <51aa> 4752 <51ab> <51ab> 543 <51ac> <51ac> 774 <51b0> <51b0> 911 <51b1> <51b1> 6086 <51b2> <51b2> 16456 <51b3> <51b3> 16465 <51b4> <51b4> 15740 <51b5> <51b5> 16402 <51b6> <51b7> 1079 <51b8> <51b8> 16457 <51b9> <51b9> 6196 <51bc> <51bc> 6417 <51bd> <51bd> 1355 <51be> <51be> 6418 <51c3> <51c3> 14811 <51c4> <51c5> 7222 <51c6> <51c6> 2136 <51c7> <51c7> 16938 <51c8> <51c8> 7224 <51c9> <51c9> 16459 <51ca> <51ca> 7221 <51cb> <51cb> 2137 <51cc> <51cc> 2135 <51cd> <51cd> 2134 <51ce> <51ce> 7225 <51cf> <51cf> 16460 <51d0> <51d0> 7762 <51d1> <51d1> 16461 <51d2> <51d2> 15789 <51d3> <51d3> 16463 <51d4> <51d4> 8382 <51d7> <51d7> 9077 <51d8> <51d8> 9762 <51db> <51db> 17818 <51dc> <51dc> 4363 <51dd> <51dd> 4753 <51de> <51de> 11013 <51df> <51df> 16975 <51e0> <51e0> 607 <51e1> <51e1> 621 <51e2> <51e2> 16466 <51e4> <51e4> 17729 <51ed> <51ed> 16468 <51f0> <51f0> 2577 <51f1> <51f1> 3057 <51f3> <51f3> 3979 <51f4> <51f4> 16760 <51f5> <51f5> 5998 <51f6> <51f6> 688 <51f8> <51f8> 777 <51f9> <51fa> 775 <51fc> <51fc> 17819 <51fd> <51fd> 1356 <51fe> <51fe> 16138 <5200> <5201> 608 <5202> <5202> 14003 <5203> <5203> 629 <5205> <5205> 17313 <5206> <5208> 689 <5209> <5209> 6039 <520a> <520a> 778 <520b> <520b> 16473 <520c> <520c> 6038 <520e> <520e> 915 <5210> <5210> 6088 <5211> <5212> 913 <5213> <5213> 6087 <5216> <5216> 916 <5217> <5217> 912 <521c> <521c> 6197 <521d> <521d> 1675 <521e> <521e> 6198 <521f> <521f> 16224 <5220> <5220> 18736 <5221> <5221> 6199 <5224> <5224> 1082 <5225> <5225> 1081 <5226> <5226> 16474 <5227> <5227> 17314 <5228> <5228> 1085 <5229> <522a> 1083 <522e> <522e> 1362 <5230> <5230> 1361 <5231> <5231> 6423 <5232> <5233> 6420 <5234> <5234> 16123 <5235> <5235> 6419 <5236> <5236> 1363 <5237> <5237> 1359 <5238> <5238> 1358 <523a> <523a> 1360 <523b> <523b> 1357 <523c> <523c> 16475 <5241> <5241> 1364 <5243> <5243> 1729 <5244> <5244> 6765 endcidrange 100 begincidrange <5246> <5246> 6422 <5247> <5247> 1734 <5249> <5249> 6766 <524a> <524a> 1730 <524b> <524b> 1733 <524c> <524c> 1732 <524d> <524d> 1731 <524e> <524e> 1728 <5252> <5252> 7228 <5254> <5254> 2140 <5255> <5255> 7231 <5256> <5256> 2138 <5257> <5257> 16477 <5259> <5259> 14820 <525a> <525a> 7227 <525b> <525b> 2141 <525c> <525c> 2139 <525d> <525d> 2142 <525e> <525f> 7229 <5260> <5260> 16169 <5261> <5261> 7226 <5262> <5262> 7232 <5268> <5268> 17945 <5269> <5269> 3061 <526a> <526a> 2578 <526b> <526b> 7763 <526c> <526c> 7765 <526d> <526d> 7764 <526e> <526e> 7766 <526f> <526f> 2579 <5272> <5272> 3058 <5273> <5273> 16195 <5274> <5275> 3059 <5277> <5277> 3531 <5278> <5278> 9079 <5279> <5279> 17315 <527a> <527a> 9078 <527b> <527c> 9080 <527d> <527d> 3532 <527f> <527f> 3530 <5280> <5281> 9763 <5282> <5282> 3981 <5283> <5283> 3980 <5284> <5284> 10102 <5287> <5289> 4364 <528a> <528a> 4368 <528b> <528c> 10377 <528d> <528d> 4367 <528f> <528f> 15807 <5290> <5290> 17821 <5291> <5291> 4754 <5293> <5293> 4755 <5294> <5294> 16478 <5296> <5296> 12412 <5297> <5297> 13000 <5298> <5298> 12999 <5299> <5299> 13327 <529a> <529a> 16232 <529b> <529b> 610 <529f> <529f> 780 <52a0> <52a0> 779 <52a1> <52a1> 17730 <52a3> <52a3> 917 <52a4> <52a4> 14821 <52a6> <52a6> 6089 <52a8> <52a8> 17731 <52a9> <52aa> 1087 <52ab> <52ab> 1086 <52ac> <52ac> 1089 <52ad> <52ae> 6200 <52b5> <52b5> 16476 <52b9> <52b9> 16479 <52bb> <52bb> 1366 <52bc> <52bc> 6424 <52be> <52be> 1365 <52c0> <52c0> 6767 <52c1> <52c1> 1738 <52c2> <52c2> 6768 <52c3> <52c3> 1737 <52c5> <52c5> 16480 <52c7> <52c7> 1735 <52c9> <52c9> 1736 <52cc> <52cc> 16097 <52cd> <52cd> 7233 <52d0> <52d0> 16649 <52d1> <52d1> 16170 <52d2> <52d2> 2580 <52d3> <52d3> 7768 <52d5> <52d5> 2583 <52d6> <52d6> 7767 <52d7> <52d7> 2767 <52d8> <52d8> 2582 <52d9> <52d9> 2581 <52db> <52db> 3064 <52dd> <52dd> 3063 <52de> <52de> 3062 <52df> <52df> 3533 <52e0> <52e0> 16483 <52e1> <52e1> 14823 <52e2> <52e3> 3536 endcidrange 100 begincidrange <52e4> <52e4> 3535 <52e6> <52e6> 3534 <52e9> <52e9> 9765 <52eb> <52eb> 9766 <52ef> <52ef> 10380 <52f0> <52f0> 4369 <52f1> <52f1> 10379 <52f3> <52f3> 4756 <52f4> <52f4> 11584 <52f5> <52f5> 5048 <52f7> <52f7> 12413 <52f8> <52f8> 5641 <52f9> <52f9> 544 <52fa> <52fa> 630 <52fb> <52fb> 692 <52fc> <52fc> 6017 <52fe> <52ff> 693 <5301> <5301> 15737 <5305> <5306> 781 <5308> <5308> 918 <5309> <5309> 6202 <530a> <530b> 6425 <530d> <530d> 1739 <530e> <530e> 7234 <530f> <530f> 2585 <5310> <5310> 2584 <5311> <5311> 8384 <5312> <5312> 8383 <5315> <5315> 611 <5316> <5316> 695 <5317> <5317> 783 <5319> <5319> 2586 <531a> <531a> 5999 <531c> <531c> 6040 <531d> <531d> 784 <531f> <531f> 6091 <5320> <5320> 920 <5321> <5321> 919 <5322> <5322> 6090 <5323> <5323> 1090 <5327> <5327> 17822 <532a> <532a> 2143 <532c> <532c> 16182 <532d> <532d> 7769 <532f> <532f> 3538 <5330> <5330> 9767 <5331> <5331> 3982 <5332> <5332> 16336 <5333> <5333> 16493 <5334> <5334> 11014 <5337> <5337> 12743 <5338> <5338> 545 <5339> <5339> 696 <533b> <533b> 17732 <533c> <533c> 6427 <533d> <533d> 6769 <533e> <533e> 2589 <533f> <5340> 2587 <5341> <5341> 612 <5342> <5342> 18759 <5343> <5343> 631 <5344> <5344> 363 <5345> <5345> 699 <5347> <5347> 698 <5348> <5348> 697 <5349> <5349> 787 <534a> <534a> 786 <534c> <534c> 6041 <534d> <534d> 6092 <534e> <534e> 17733 <5351> <5351> 1370 <5352> <5352> 1367 <5353> <5353> 1369 <5354> <5354> 1368 <5357> <5357> 1740 <535a> <535a> 3065 <535c> <535c> 613 <535d> <535d> 17665 <535e> <535e> 700 <535f> <535f> 17319 <5360> <5360> 789 <5361> <5361> 788 <5363> <5363> 6203 <5364> <5364> 18442 <5366> <5366> 1371 <5367> <5367> 16077 <5369> <5369> 546 <536c> <536c> 6018 <536d> <536d> 16506 <536e> <536e> 791 <536f> <536f> 790 <5370> <5371> 921 <5372> <5372> 6204 <5373> <5373> 1091 <5374> <5374> 16507 <5375> <5375> 1092 <5377> <5379> 1372 <537b> <537b> 1741 <537c> <537c> 6770 <537d> <537d> 18689 endcidrange 100 begincidrange <537e> <537e> 16509 <537f> <537f> 2144 <5382> <5382> 6000 <5384> <5384> 701 <538a> <538a> 6093 <538e> <538f> 6205 <5392> <5392> 6428 <5393> <5393> 16514 <5394> <5394> 6429 <5396> <5396> 6772 <5397> <5397> 6771 <5398> <5398> 6774 <5399> <5399> 6773 <539a> <539a> 1742 <539c> <539c> 7770 <539d> <539d> 2146 <539e> <539e> 7235 <539f> <539f> 2145 <53a0> <53a0> 16516 <53a2> <53a2> 15915 <53a4> <53a4> 8385 <53a5> <53a5> 3066 <53a6> <53a6> 16699 <53a7> <53a7> 8386 <53a8> <53a8> 16702 <53a9> <53a9> 17824 <53aa> <53aa> 16326 <53ab> <53ab> 16517 <53ac> <53ac> 9768 <53ad> <53ad> 3983 <53ae> <53ae> 16518 <53b0> <53b0> 17826 <53b2> <53b2> 4370 <53b4> <53b4> 12414 <53b6> <53b6> 547 <53b9> <53b9> 6019 <53bb> <53bb> 792 <53c1> <53c1> 16523 <53c2> <53c2> 17318 <53c3> <53c3> 2590 <53c5> <53c5> 16524 <53c8> <53c8> 614 <53c9> <53c9> 632 <53ca> <53ca> 703 <53cb> <53cb> 702 <53cc> <53cc> 14518 <53cd> <53cd> 704 <53d0> <53d0> 14842 <53d1> <53d1> 17734 <53d2> <53d2> 15933 <53d4> <53d4> 1376 <53d6> <53d6> 1375 <53d7> <53d7> 1377 <53d8> <53d8> 17735 <53d9> <53d9> 16528 <53da> <53da> 16185 <53db> <53db> 1743 <53df> <53df> 2147 <53e0> <53e0> 16531 <53e1> <53e1> 11015 <53e2> <53e2> 5321 <53e3> <53e3> 633 <53e4> <53e4> 794 <53e5> <53e5> 809 <53e6> <53e6> 804 <53e8> <53e8> 799 <53e9> <53e9> 798 <53ea> <53ea> 805 <53eb> <53eb> 803 <53ec> <53ec> 796 <53ed> <53ed> 810 <53ee> <53ee> 797 <53ef> <53ef> 793 <53f0> <53f0> 808 <53f1> <53f1> 807 <53f2> <53f2> 806 <53f3> <53f3> 795 <53f5> <53f5> 802 <53f6> <53f6> 16534 <53f7> <53f7> 14344 <53f8> <53f8> 801 <53fb> <53fb> 811 <53fc> <53fc> 800 <53fe> <53fe> 16577 <5401> <5401> 928 <5403> <5403> 934 <5404> <5404> 930 <5406> <5406> 936 <5407> <5407> 6094 <5408> <5408> 933 <5409> <5409> 923 <540a> <540a> 926 <540b> <540b> 929 <540c> <540c> 925 <540d> <540d> 932 <540e> <540e> 935 <540f> <540f> 924 <5410> <5410> 927 <5411> <5411> 931 <5412> <5412> 937 endcidrange 100 begincidrange <5413> <5413> 16536 <5414> <5414> 15479 <5416> <5416> 15999 <5418> <5418> 6215 <5419> <5419> 6212 <541a> <541a> 15972 <541b> <541b> 1105 <541c> <541c> 6213 <541d> <541d> 1093 <541e> <541e> 1095 <541f> <541f> 1119 <5420> <5420> 1114 <5421> <5421> 16899 <5423> <5423> 17827 <5424> <5424> 6220 <5425> <5425> 6214 <5426> <5426> 1097 <5427> <5427> 1099 <5428> <5428> 6219 <5429> <5429> 1106 <542a> <542a> 6209 <542b> <542b> 1118 <542c> <542c> 1120 <542d> <542d> 1094 <542e> <542e> 1111 <542f> <542f> 16556 <5430> <5430> 6207 <5431> <5431> 1117 <5432> <5432> 15989 <5433> <5433> 1102 <5435> <5436> 1112 <5437> <5437> 6208 <5438> <5438> 1110 <5439> <5439> 1108 <543b> <543b> 1109 <543c> <543c> 1115 <543d> <543d> 6216 <543e> <543e> 1096 <5440> <5440> 1116 <5441> <5441> 6218 <5442> <5442> 1104 <5443> <5443> 1101 <5445> <5445> 6211 <5446> <5446> 1100 <5447> <5447> 6221 <5448> <5448> 1103 <544a> <544a> 1107 <544b> <544b> 16081 <544d> <544d> 16039 <544e> <544e> 1098 <544f> <544f> 6217 <5454> <5454> 6210 <5460> <5460> 6446 <5461> <5461> 6445 <5462> <5462> 1395 <5463> <5463> 6448 <5464> <5464> 6450 <5465> <5465> 6439 <5466> <5466> 6442 <5467> <5467> 6449 <5468> <5468> 1396 <5469> <5469> 16178 <546a> <546a> 15747 <546b> <546b> 6436 <546c> <546c> 6440 <546d> <546d> 16541 <546f> <546f> 6444 <5470> <5470> 6789 <5471> <5471> 1391 <5472> <5472> 6793 <5473> <5473> 1378 <5474> <5474> 6441 <5475> <5475> 1379 <5476> <5476> 1392 <5477> <5477> 1385 <5478> <5478> 1381 <547a> <547a> 6437 <547b> <547b> 1384 <547c> <547c> 1389 <547d> <547d> 1398 <547e> <547e> 6438 <547f> <547f> 6431 <5480> <5480> 1383 <5481> <5481> 6432 <5482> <5482> 6434 <5484> <5484> 1386 <5485> <5485> 18137 <5486> <5486> 1388 <5487> <5487> 6430 <5488> <5488> 6435 <548b> <548b> 1397 <548c> <548c> 1393 <548d> <548d> 6443 <548e> <548e> 1399 <548f> <548f> 16545 <5490> <5490> 1390 <5491> <5491> 6433 <5492> <5492> 1387 <5493> <5493> 17831 <5494> <5494> 16024 endcidrange 100 begincidrange <5495> <5495> 1382 <5496> <5496> 1380 <5497> <5497> 16010 <5498> <5498> 6447 <549a> <549a> 1394 <549c> <549c> 16230 <549e> <549e> 18413 <54a0> <54a0> 6788 <54a1> <54a1> 6776 <54a2> <54a2> 6791 <54a3> <54a3> 17832 <54a4> <54a4> 16546 <54a5> <54a5> 6778 <54a6> <54a6> 1750 <54a7> <54a7> 1764 <54a8> <54a8> 1746 <54a9> <54a9> 1763 <54aa> <54aa> 1755 <54ab> <54ab> 1760 <54ac> <54ac> 1744 <54ad> <54ad> 6777 <54ae> <54ae> 6783 <54af> <54af> 1759 <54b0> <54b0> 6795 <54b1> <54b1> 1761 <54b2> <54b2> 14148 <54b3> <54b3> 1751 <54b4> <54b4> 17833 <54b6> <54b6> 6785 <54b7> <54b7> 6782 <54b8> <54b8> 1749 <54b9> <54b9> 17834 <54ba> <54ba> 6775 <54bb> <54bb> 1762 <54bc> <54bc> 6790 <54bd> <54bd> 1754 <54be> <54be> 6792 <54bf> <54bf> 1765 <54c0> <54c0> 1745 <54c1> <54c1> 1756 <54c2> <54c2> 1753 <54c3> <54c3> 6780 <54c4> <54c4> 1757 <54c5> <54c6> 6786 <54c7> <54c7> 1752 <54c8> <54c8> 1758 <54c9> <54c9> 1748 <54cb> <54cb> 14755 <54cc> <54cc> 17320 <54cd> <54cd> 14848 <54ce> <54ce> 1747 <54cf> <54cf> 6779 <54d0> <54d0> 17835 <54d6> <54d6> 6784 <54da> <54da> 18723 <54de> <54de> 6794 <54e0> <54e0> 7255 <54e1> <54e1> 2160 <54e2> <54e2> 7237 <54e3> <54e3> 17217 <54e4> <54e4> 7242 <54e5> <54e5> 2153 <54e6> <54e6> 2164 <54e7> <54e7> 7240 <54e8> <54e8> 2148 <54e9> <54e9> 2158 <54ea> <54ea> 2163 <54eb> <54eb> 7247 <54ed> <54ed> 2159 <54ee> <54ee> 2162 <54ef> <54ef> 17836 <54f1> <54f1> 7250 <54f2> <54f2> 2154 <54f3> <54f3> 7241 <54f7> <54f8> 7253 <54fa> <54fa> 2156 <54fb> <54fb> 7252 <54fc> <54fc> 2152 <54fd> <54fd> 2167 <54ff> <54ff> 7244 <5501> <5501> 2150 <5502> <5502> 15564 <5503> <5503> 7257 <5504> <5504> 7245 <5505> <5505> 7249 <5506> <5506> 2155 <5507> <5507> 2166 <5508> <5508> 7246 <5509> <5509> 2161 <550a> <550a> 7251 <550b> <550b> 7258 <550c> <550c> 7785 <550d> <550d> 14963 <550e> <550e> 7256 <550f> <550f> 2168 <5510> <5510> 2149 <5511> <5511> 7248 <5512> <5512> 7239 <5513> <5513> 16041 <5514> <5514> 2157 endcidrange 100 begincidrange <5517> <5517> 7238 <5518> <5518> 17837 <551a> <551a> 7243 <551e> <551e> 16040 <5523> <5523> 17838 <5525> <5525> 17161 <5526> <5526> 7236 <5527> <5527> 2165 <5528> <5528> 17839 <552a> <552a> 7777 <552b> <552b> 16538 <552c> <552c> 2609 <552d> <552d> 7791 <552e> <552e> 2607 <552f> <552f> 2604 <5530> <5530> 7782 <5531> <5531> 2600 <5532> <5532> 7786 <5533> <5533> 2611 <5534> <5534> 7776 <5535> <5535> 7781 <5536> <5536> 7780 <5537> <5537> 2151 <5538> <5538> 2606 <5539> <5539> 7789 <553b> <553b> 7792 <553c> <553c> 7773 <553e> <553e> 3084 <553f> <553f> 17321 <5540> <5540> 7793 <5541> <5541> 2612 <5543> <5543> 2598 <5544> <5544> 2595 <5545> <5545> 7784 <5546> <5546> 2592 <5547> <5547> 16554 <5548> <5548> 7790 <5549> <5549> 16488 <554a> <554a> 2599 <554b> <554b> 7794 <554d> <554d> 7774 <554e> <554e> 7788 <554f> <554f> 2602 <5550> <5550> 7775 <5551> <5551> 7778 <5552> <5552> 7783 <5553> <5553> 17326 <5555> <5555> 2603 <5556> <5556> 2601 <5557> <5557> 2613 <555c> <555c> 2608 <555d> <555d> 16544 <555e> <555e> 2596 <555f> <555f> 2748 <5561> <5561> 2597 <5562> <5562> 7779 <5563> <5563> 2610 <5564> <5564> 2605 <5565> <5565> 7787 <5566> <5566> 2594 <5569> <5569> 16031 <556a> <556a> 2593 <556b> <556b> 15150 <5571> <5571> 15302 <5572> <5572> 16011 <5573> <5573> 16164 <5575> <5576> 7771 <5577> <5577> 8391 <5579> <5579> 17245 <557b> <557b> 3067 <557c> <557c> 3070 <557d> <557d> 8402 <557e> <557e> 3090 <557f> <557f> 8405 <5580> <5580> 3068 <5581> <5581> 8398 <5582> <5582> 3074 <5583> <5583> 3080 <5584> <5584> 3355 <5586> <5586> 16558 <5587> <5587> 3078 <5588> <5588> 8395 <5589> <5589> 3091 <558a> <558a> 3071 <558b> <558b> 3079 <558c> <558c> 8403 <558d> <558d> 9095 <558e> <558e> 8408 <558f> <558f> 8396 <5590> <5590> 17166 <5591> <5591> 8387 <5592> <5592> 8400 <5593> <5593> 8394 <5594> <5594> 3077 <5595> <5595> 8406 <5598> <5598> 3073 <5599> <5599> 3093 <559a> <559a> 3086 <559c> <559c> 3075 <559d> <559d> 3072 endcidrange 100 begincidrange <559f> <559f> 3083 <55a1> <55a1> 8407 <55a2> <55a2> 8393 <55a3> <55a3> 8399 <55a4> <55a4> 8401 <55a5> <55a5> 8389 <55a6> <55a6> 8404 <55a7> <55a7> 3069 <55a8> <55a8> 8388 <55a9> <55a9> 16559 <55aa> <55aa> 3076 <55ab> <55ab> 3092 <55ac> <55ac> 3088 <55ad> <55ad> 8390 <55ae> <55ae> 3082 <55b0> <55b0> 14581 <55b1> <55b1> 3089 <55b2> <55b2> 3085 <55b3> <55b3> 3081 <55b4> <55b4> 14846 <55b5> <55b5> 8397 <55b9> <55b9> 17322 <55ba> <55ba> 16009 <55bb> <55bb> 3087 <55bc> <55bc> 15811 <55bf> <55bf> 9093 <55c0> <55c0> 9089 <55c1> <55c1> 15951 <55c2> <55c2> 9104 <55c3> <55c3> 9082 <55c4> <55c4> 9091 <55c5> <55c6> 3552 <55c7> <55c7> 3545 <55c8> <55c8> 9100 <55c9> <55c9> 3555 <55ca> <55ca> 9087 <55cb> <55cb> 9086 <55cc> <55cc> 9084 <55cd> <55cd> 9102 <55ce> <55ce> 3543 <55cf> <55cf> 9096 <55d0> <55d0> 9085 <55d1> <55d1> 3546 <55d2> <55d2> 9094 <55d3> <55d3> 3541 <55d4> <55d4> 9090 <55d5> <55d5> 9097 <55d6> <55d6> 9099 <55d7> <55d7> 17843 <55d8> <55d8> 17323 <55d9> <55d9> 9103 <55da> <55da> 3550 <55db> <55db> 9083 <55dc> <55dc> 3544 <55dd> <55dd> 9088 <55de> <55de> 16020 <55df> <55df> 3539 <55e1> <55e1> 3551 <55e2> <55e2> 9098 <55e3> <55e4> 3547 <55e5> <55e5> 3554 <55e6> <55e6> 3542 <55e7> <55e7> 287 <55e8> <55e8> 3540 <55e9> <55e9> 9092 <55ea> <55ea> 15996 <55ec> <55ec> 14290 <55ef> <55ef> 3549 <55f0> <55f0> 16008 <55f1> <55f1> 16003 <55f2> <55f2> 9101 <55f5> <55f5> 18310 <55f6> <55f6> 3999 <55f7> <55f7> 3994 <55f9> <55f9> 9783 <55fa> <55fa> 9779 <55fb> <55fb> 17958 <55fc> <55fc> 9773 <55fd> <55fd> 3988 <55fe> <55fe> 3984 <55ff> <55ff> 9782 <5600> <5600> 3985 <5601> <5601> 9776 <5602> <5602> 9778 <5604> <5604> 9781 <5605> <5605> 16002 <5606> <5606> 3990 <5608> <5608> 3997 <5609> <5609> 3991 <560c> <560c> 9771 <560d> <560e> 3992 <560f> <560f> 9774 <5610> <5610> 3998 <5611> <5611> 16205 <5612> <5612> 9772 <5613> <5613> 9777 <5614> <5614> 3989 <5615> <5615> 9770 <5616> <5616> 3995 <5617> <5617> 3987 endcidrange 100 begincidrange <561b> <561b> 3986 <561c> <561c> 9775 <561d> <561d> 9780 <561e> <561e> 15976 <561f> <561f> 3996 <5620> <5620> 16253 <5621> <5621> 17325 <5622> <5622> 15975 <5623> <5623> 18183 <5625> <5625> 15992 <5627> <5627> 9769 <5629> <5629> 4377 <562a> <562a> 10397 <562c> <562c> 10394 <562d> <562d> 15971 <562e> <562e> 4371 <562f> <5630> 4383 <5632> <5632> 4374 <5633> <5633> 10392 <5634> <5634> 4376 <5635> <5635> 10384 <5636> <5636> 4382 <5637> <5637> 16567 <5638> <5638> 10396 <5639> <5639> 4373 <563a> <563a> 10398 <563b> <563b> 4372 <563d> <563d> 10393 <563e> <563e> 10395 <563f> <563f> 4375 <5640> <5640> 10391 <5641> <5641> 10385 <5642> <5642> 10382 <5643> <5643> 15998 <5645> <5645> 8392 <5646> <5646> 10388 <5648> <5648> 10381 <5649> <5649> 10387 <564a> <564a> 10386 <564c> <564c> 10383 <564d> <564d> 16572 <564e> <564e> 4379 <564f> <564f> 16573 <5650> <5650> 18383 <5652> <5652> 17858 <5653> <5653> 4378 <5654> <5654> 17327 <5657> <5657> 4380 <5658> <5658> 10389 <5659> <5659> 4757 <565a> <565a> 10390 <565d> <565d> 16121 <565e> <565e> 11024 <5660> <5660> 11017 <5661> <5661> 14354 <5662> <5662> 4769 <5663> <5663> 11021 <5664> <5664> 4761 <5665> <5665> 4765 <5666> <5666> 11020 <5668> <5668> 4764 <5669> <5669> 4760 <566a> <566a> 4763 <566b> <566b> 4758 <566c> <566c> 4768 <566d> <566d> 11022 <566e> <566e> 11018 <566f> <566f> 4767 <5670> <5670> 11016 <5671> <5671> 4766 <5672> <5672> 11023 <5673> <5673> 11019 <5674> <5674> 4381 <5676> <5676> 4770 <5677> <5677> 11025 <5678> <5678> 4762 <5679> <5679> 4759 <567a> <567a> 15749 <567b> <567b> 16055 <567c> <567c> 16109 <567e> <567e> 11591 <567f> <567f> 11593 <5680> <5680> 5050 <5681> <5681> 11594 <5682> <5682> 11592 <5683> <5683> 11590 <5684> <5684> 11589 <5685> <5685> 5052 <5686> <5686> 11588 <5687> <5687> 5053 <5689> <5689> 17960 <568a> <568a> 14665 <568b> <568b> 15948 <568c> <568d> 11586 <568e> <568e> 5049 <568f> <568f> 5054 <5690> <5690> 5051 <5692> <5692> 14758 <5693> <5693> 11585 <5695> <5695> 5322 endcidrange 100 begincidrange <5697> <5697> 12051 <5698> <5698> 12049 <5699> <5699> 12054 <569a> <569a> 12052 <569c> <569c> 12050 <569d> <569d> 12053 <569e> <569e> 14756 <569f> <569f> 14664 <56a1> <56a1> 17259 <56a4> <56a4> 15560 <56a5> <56a5> 5494 <56a6> <56a7> 12417 <56a8> <56a8> 5495 <56aa> <56aa> 12419 <56ab> <56ab> 12415 <56ac> <56ac> 12420 <56ad> <56ad> 12416 <56ae> <56ae> 5323 <56af> <56af> 17911 <56b1> <56b1> 17983 <56b2> <56b2> 12744 <56b3> <56b3> 12746 <56b4> <56b4> 5644 <56b5> <56b5> 12745 <56b6> <56b6> 5643 <56b7> <56b7> 5642 <56b9> <56b9> 18543 <56bc> <56bc> 5645 <56bd> <56be> 13002 <56bf> <56bf> 15965 <56c0> <56c0> 5739 <56c1> <56c1> 5738 <56c2> <56c2> 5740 <56c3> <56c3> 13001 <56c5> <56c5> 13177 <56c6> <56c6> 13176 <56c8> <56c8> 5821 <56c9> <56c9> 5823 <56ca> <56ca> 5822 <56cb> <56cb> 13178 <56cc> <56cc> 5878 <56cd> <56cd> 13441 <56d1> <56d1> 5919 <56d3> <56d3> 13440 <56d4> <56d4> 13513 <56d6> <56d6> 18570 <56d7> <56d7> 6005 <56da> <56da> 813 <56db> <56db> 812 <56dd> <56dd> 940 <56de> <56de> 939 <56df> <56df> 6096 <56e0> <56e0> 938 <56e1> <56e1> 6095 <56e2> <56e2> 17736 <56e4> <56e4> 1123 <56e5> <56e5> 6224 <56e7> <56e7> 6223 <56ea> <56ea> 1121 <56eb> <56eb> 1124 <56ed> <56ed> 16580 <56ee> <56ee> 6222 <56ef> <56ef> 16579 <56f0> <56f0> 1122 <56f1> <56f1> 16575 <56f7> <56f7> 6451 <56f9> <56f9> 6452 <56fa> <56fa> 1400 <56fd> <56fd> 15716 <56ff> <56ff> 1766 <5700> <5700> 16578 <5701> <5702> 7259 <5703> <5704> 2169 <5707> <5707> 7796 <5708> <5708> 2614 <5709> <5709> 2616 <570a> <570a> 7795 <570b> <570b> 2615 <570c> <570c> 8409 <570d> <570d> 3094 <5712> <5713> 3556 <5714> <5714> 9105 <5715> <5715> 15926 <5716> <5716> 4001 <5718> <5718> 4000 <571a> <571a> 10399 <571b> <571b> 11027 <571c> <571c> 11026 <571d> <571d> 14850 <571e> <571e> 13573 <571f> <571f> 634 <5720> <5720> 6020 <5722> <5723> 6042 <5728> <5728> 943 <5729> <5729> 947 <572a> <572a> 6098 <572c> <572c> 945 <572d> <572d> 944 <572e> <572e> 6097 <572f> <572f> 946 endcidrange 100 begincidrange <5730> <5730> 942 <5732> <5732> 15097 <5733> <5733> 941 <5734> <5734> 6099 <573b> <573b> 1134 <573e> <573e> 1131 <573f> <573f> 18517 <5740> <5740> 1127 <5741> <5741> 6225 <5742> <5742> 16588 <5743> <5743> 16606 <5745> <5745> 6226 <5746> <5746> 16584 <5747> <5747> 1129 <5749> <5749> 6228 <574a> <574a> 1125 <574b> <574b> 6229 <574c> <574c> 6227 <574d> <574d> 1128 <574e> <574e> 1130 <574f> <574f> 1133 <5750> <5750> 1132 <5751> <5751> 1126 <5752> <5752> 6230 <5754> <5754> 18309 <5757> <5757> 18406 <575b> <575b> 14722 <575f> <575f> 16319 <5761> <5761> 1405 <5762> <5762> 6465 <5764> <5764> 1407 <5766> <5766> 1406 <5767> <5767> 16171 <5768> <5768> 6466 <5769> <5769> 1404 <576a> <576a> 1403 <576b> <576b> 6456 <576d> <576d> 6455 <576f> <576f> 6453 <5770> <5770> 6458 <5771> <5771> 6457 <5772> <5772> 6454 <5773> <5774> 6463 <5775> <5775> 6461 <5776> <5776> 6459 <5777> <5777> 1402 <577a> <577a> 16223 <577b> <577b> 6462 <577c> <577c> 1408 <577d> <577d> 6467 <577e> <577e> 18140 <577f> <577f> 14855 <5780> <5780> 6460 <5782> <5782> 1767 <5783> <5783> 1401 <5788> <5788> 18507 <578a> <578a> 15483 <578b> <578b> 1768 <578c> <578c> 6800 <578d> <578d> 14854 <578f> <578f> 6806 <5790> <5790> 16742 <5793> <5793> 1774 <5794> <5794> 6804 <5795> <5795> 6810 <5797> <5797> 6801 <5798> <5798> 6805 <5799> <5799> 6807 <579a> <579a> 6809 <579b> <579b> 6803 <579c> <579c> 17928 <579d> <579d> 6802 <579e> <579f> 6797 <57a0> <57a0> 1769 <57a1> <57a1> 18532 <57a2> <57a2> 1771 <57a3> <57a3> 1770 <57a4> <57a4> 6799 <57a5> <57a5> 6808 <57a7> <57a7> 18708 <57aa> <57aa> 18693 <57ae> <57ae> 1773 <57b4> <57b4> 18241 <57b5> <57b5> 6796 <57b6> <57b6> 7270 <57b8> <57b8> 7269 <57b9> <57b9> 7274 <57ba> <57ba> 7265 <57bb> <57bb> 15481 <57bc> <57bc> 7268 <57bd> <57bd> 7267 <57be> <57be> 14124 <57bf> <57bf> 7271 <57c1> <57c1> 7275 <57c2> <57c2> 2171 <57c3> <57c3> 2174 <57c4> <57c4> 15195 <57c6> <57c6> 7266 <57c7> <57c7> 7272 <57c8> <57c8> 15627 endcidrange 100 begincidrange <57cb> <57cb> 2173 <57cc> <57cc> 7261 <57ce> <57ce> 1772 <57cf> <57cf> 7810 <57d0> <57d0> 7273 <57d2> <57d2> 7264 <57d4> <57d4> 2172 <57d5> <57d5> 7263 <57d7> <57d7> 15485 <57dc> <57dc> 7801 <57dd> <57dd> 14853 <57de> <57de> 16129 <57df> <57df> 2617 <57e0> <57e0> 2621 <57e1> <57e1> 7817 <57e2> <57e2> 7799 <57e3> <57e3> 7813 <57e4> <57e4> 2622 <57e5> <57e5> 7815 <57e6> <57e6> 16591 <57e7> <57e7> 7821 <57e9> <57e9> 7825 <57ec> <57ec> 7816 <57ed> <57ed> 7804 <57ee> <57ee> 7812 <57ef> <57ef> 18260 <57f0> <57f0> 7826 <57f1> <57f1> 7824 <57f2> <57f2> 7814 <57f3> <57f3> 7809 <57f4> <57f4> 7802 <57f5> <57f5> 8417 <57f6> <57f6> 7800 <57f7> <57f7> 2626 <57f8> <57f8> 7807 <57f9> <57f9> 2627 <57fa> <57fa> 2623 <57fb> <57fb> 7797 <57fc> <57fc> 7819 <57fd> <57fd> 7805 <57fe> <57fe> 16527 <5800> <5800> 7803 <5801> <5801> 7822 <5802> <5802> 2624 <5803> <5803> 16593 <5804> <5804> 7828 <5805> <5805> 2618 <5806> <5806> 2620 <5807> <5807> 7811 <5808> <5808> 7806 <5809> <5809> 2175 <580a> <580a> 2619 <580b> <580b> 7808 <580c> <580c> 7823 <580d> <580d> 7827 <580e> <580e> 7818 <5810> <5810> 7820 <5812> <5812> 15626 <5814> <5814> 7798 <5819> <5819> 8412 <581b> <581b> 8421 <581c> <581c> 8420 <581d> <581d> 3102 <581e> <581e> 8413 <5820> <5820> 3103 <5821> <5821> 3101 <5822> <5822> 15400 <5823> <5823> 8415 <5824> <5824> 3098 <5825> <5825> 8419 <5826> <5826> 16596 <5827> <5827> 8414 <5828> <5828> 8416 <5829> <5829> 8410 <582a> <582a> 3096 <582c> <582c> 8429 <582d> <582d> 8428 <582e> <582e> 8425 <582f> <582f> 3095 <5830> <5831> 3099 <5832> <5832> 7262 <5833> <5833> 8422 <5834> <5834> 3097 <5835> <5835> 2625 <5836> <5836> 8424 <5837> <5837> 8411 <5838> <5838> 8427 <5839> <5839> 8426 <583a> <583a> 15730 <583b> <583b> 8430 <583d> <583d> 9119 <583f> <583f> 8423 <5840> <5840> 15746 <5844> <5844> 18363 <5847> <5847> 15042 <5848> <5848> 8418 <5849> <5849> 9111 <584a> <584a> 3567 <584b> <584b> 3570 <584c> <584c> 3565 endcidrange 100 begincidrange <584d> <584d> 9110 <584e> <584e> 9114 <584f> <584f> 9109 <5851> <5851> 3559 <5852> <5852> 3569 <5853> <5853> 9106 <5854> <5854> 3563 <5855> <5855> 9113 <5857> <5857> 3561 <5858> <5858> 3560 <5859> <5859> 9116 <585a> <585a> 3562 <585b> <585b> 9118 <585c> <585c> 18761 <585d> <585d> 9115 <585e> <585e> 3558 <585f> <585f> 17375 <5862> <5862> 3568 <5863> <5863> 9120 <5864> <5864> 9108 <5865> <5865> 9117 <5868> <5868> 9107 <5869> <5869> 15717 <586b> <586b> 3564 <586c> <586c> 14746 <586d> <586d> 3566 <586f> <586f> 9112 <5871> <5871> 9121 <5872> <5872> 15398 <5873> <5873> 17237 <5874> <5874> 9791 <5875> <5875> 4002 <5876> <5876> 9797 <5879> <5879> 4007 <587a> <587a> 9793 <587b> <587b> 9800 <587c> <587c> 9785 <587d> <587d> 4009 <587e> <587e> 4003 <587f> <587f> 9790 <5880> <5880> 4385 <5881> <5881> 9789 <5882> <5882> 9798 <5883> <5883> 4004 <5885> <5885> 4008 <5886> <5886> 9788 <5887> <5887> 9794 <5888> <5888> 9799 <5889> <5889> 9784 <588a> <588a> 4006 <588b> <588b> 9792 <588e> <588e> 9796 <588f> <588f> 9802 <5890> <5890> 9786 <5891> <5891> 9795 <5893> <5893> 4005 <5894> <5894> 9801 <5898> <5898> 9787 <5899> <5899> 17944 <589a> <589a> 18691 <589c> <589c> 4389 <589d> <589d> 10401 <589e> <589e> 4387 <589f> <589f> 4386 <58a0> <58a0> 10403 <58a1> <58a1> 10408 <58a3> <58a3> 10404 <58a5> <58a5> 10407 <58a6> <58a6> 4392 <58a7> <58a7> 16107 <58a8> <58a8> 4744 <58a9> <58a9> 4391 <58aa> <58aa> 16599 <58ab> <58ab> 10400 <58ac> <58ac> 10406 <58ae> <58ae> 4390 <58af> <58af> 10405 <58b0> <58b0> 14244 <58b1> <58b1> 10402 <58b3> <58b3> 4388 <58b5> <58b5> 18496 <58b6> <58b6> 15869 <58ba> <58ba> 11032 <58bb> <58bb> 14059 <58bc> <58bc> 11034 <58bd> <58bd> 11029 <58be> <58be> 4772 <58bf> <58bf> 11031 <58c1> <58c1> 4771 <58c2> <58c2> 11033 <58c5> <58c5> 4774 <58c6> <58c6> 11035 <58c7> <58c7> 4773 <58c8> <58c8> 11028 <58c9> <58c9> 11030 <58cb> <58cb> 14857 <58ce> <58ce> 5058 <58cf> <58cf> 11597 <58d1> <58d1> 5057 <58d2> <58d2> 11598 endcidrange 100 begincidrange <58d3> <58d3> 5056 <58d4> <58d4> 11596 <58d5> <58d5> 5055 <58d6> <58d6> 11595 <58d8> <58d8> 5325 <58d9> <58d9> 5324 <58da> <58da> 12421 <58db> <58db> 12423 <58dc> <58dc> 16602 <58dd> <58dd> 12422 <58de> <58df> 5496 <58e0> <58e0> 16601 <58e2> <58e2> 5498 <58e3> <58e3> 12747 <58e4> <58e4> 5646 <58e7> <58e7> 13329 <58e8> <58e8> 13328 <58e9> <58e9> 5920 <58eb> <58eb> 635 <58ec> <58ec> 705 <58ef> <58ef> 1135 <58f0> <58f0> 17737 <58f2> <58f2> 15720 <58f3> <58f3> 15482 <58f4> <58f4> 6811 <58f9> <58fa> 3104 <58fb> <58fb> 16604 <58fc> <58fc> 9122 <58fd> <58fd> 4010 <58fe> <58fe> 9803 <58ff> <58ff> 10409 <5902> <5902> 548 <5903> <5903> 6021 <5904> <5904> 17738 <5905> <5905> 17817 <5906> <5906> 6231 <5907> <5907> 17739 <590a> <590a> 548 <590c> <590c> 6468 <590d> <590d> 6812 <590e> <590e> 7276 <590f> <590f> 2176 <5911> <5911> 17012 <5912> <5912> 12424 <5914> <5914> 5741 <5915> <5915> 636 <5916> <5916> 814 <5917> <5917> 6044 <5919> <591a> 948 <591c> <591c> 1409 <591f> <591f> 16611 <5920> <5920> 2628 <5922> <5922> 4012 <5924> <5924> 4013 <5925> <5925> 4011 <5927> <5927> 637 <5929> <5929> 706 <592a> <592a> 708 <592b> <592b> 707 <592c> <592c> 6022 <592d> <592d> 709 <592e> <592e> 815 <592f> <592f> 6045 <5931> <5931> 816 <5932> <5932> 17740 <5934> <5934> 17741 <5937> <5938> 950 <593c> <593c> 6100 <593e> <593e> 1136 <5940> <5940> 6232 <5944> <5944> 1413 <5945> <5945> 6469 <5947> <5948> 1411 <5949> <5949> 1410 <594a> <594a> 7277 <594e> <594e> 1778 <594f> <594f> 1777 <5950> <5950> 1779 <5951> <5951> 1776 <5953> <5953> 6813 <5954> <5954> 1414 <5955> <5955> 1775 <5957> <5958> 2177 <595a> <595a> 2179 <595c> <595c> 7829 <5960> <5960> 3106 <5961> <5961> 8431 <5962> <5962> 2629 <5965> <5965> 18514 <5967> <5967> 3571 <5969> <5969> 4015 <596a> <596a> 4014 <596b> <596b> 9804 <596d> <596d> 4393 <596e> <596e> 4775 <5970> <5970> 12055 <5971> <5971> 13179 <5972> <5972> 13330 <5973> <5973> 638 <5974> <5974> 817 endcidrange 100 begincidrange <5975> <5975> 15978 <5976> <5976> 818 <5977> <5977> 6106 <5978> <5978> 953 <5979> <5979> 956 <597b> <597b> 6104 <597c> <597c> 6102 <597d> <597d> 955 <597e> <597e> 6105 <597f> <597f> 6107 <5980> <5980> 6101 <5981> <5981> 958 <5982> <5982> 957 <5983> <5983> 954 <5984> <5984> 952 <5985> <5985> 6103 <5989> <5989> 15664 <598a> <598a> 1147 <598d> <598d> 1144 <598e> <598e> 6237 <598f> <598f> 6240 <5990> <5990> 6239 <5992> <5992> 1138 <5993> <5993> 1146 <5994> <5994> 15513 <5996> <5996> 1143 <5997> <5997> 6236 <5998> <5998> 6234 <5999> <5999> 1142 <599a> <599a> 15280 <599d> <599d> 1137 <599e> <599e> 1140 <599f> <599f> 15791 <59a0> <59a0> 6235 <59a1> <59a1> 6242 <59a2> <59a2> 6238 <59a3> <59a3> 1141 <59a4> <59a4> 1145 <59a5> <59a5> 1148 <59a6> <59a6> 6233 <59a7> <59a7> 6241 <59a8> <59a8> 1139 <59ac> <59ac> 15745 <59ae> <59ae> 1419 <59af> <59af> 1427 <59b0> <59b0> 15576 <59b1> <59b1> 6481 <59b2> <59b2> 6474 <59b3> <59b3> 1428 <59b4> <59b4> 6485 <59b5> <59b5> 6470 <59b6> <59b6> 6477 <59b7> <59b7> 16173 <59b8> <59b8> 14864 <59b9> <59b9> 1418 <59ba> <59ba> 6471 <59bb> <59bb> 1416 <59bc> <59bc> 6478 <59bd> <59bd> 6482 <59be> <59be> 1415 <59c0> <59c0> 6483 <59c1> <59c1> 6476 <59c3> <59c3> 6479 <59c4> <59c4> 15620 <59c5> <59c5> 1430 <59c6> <59c6> 1421 <59c7> <59c7> 6486 <59c8> <59c8> 6484 <59c9> <59c9> 16620 <59ca> <59ca> 1426 <59cb> <59cb> 1424 <59cc> <59cc> 6475 <59cd> <59cd> 1423 <59ce> <59ce> 6473 <59cf> <59cf> 6472 <59d0> <59d0> 1422 <59d1> <59d1> 1420 <59d2> <59d2> 1429 <59d3> <59d3> 1425 <59d4> <59d4> 1417 <59d6> <59d6> 6480 <59d8> <59d8> 1781 <59d9> <59d9> 16625 <59da> <59da> 1788 <59db> <59db> 6827 <59dc> <59dc> 1780 <59dd> <59dd> 6819 <59de> <59de> 6815 <59e0> <59e0> 6831 <59e1> <59e1> 6814 <59e3> <59e3> 1783 <59e4> <59e4> 6824 <59e5> <59e5> 1786 <59e6> <59e6> 1789 <59e8> <59e8> 1784 <59e9> <59e9> 6828 <59ea> <59ea> 1787 <59eb> <59eb> 15705 <59ec> <59ec> 2186 <59ed> <59ed> 6834 endcidrange 100 begincidrange <59ee> <59ee> 6816 <59ef> <59ef> 15672 <59f0> <59f0> 15282 <59f1> <59f1> 6818 <59f2> <59f2> 6825 <59f3> <59f3> 6829 <59f4> <59f4> 6833 <59f5> <59f5> 6830 <59f6> <59f6> 6823 <59f7> <59f7> 6826 <59f8> <59f8> 15946 <59f9> <59f9> 16632 <59fa> <59fa> 6820 <59fb> <59fb> 1791 <59fc> <59fc> 6822 <59fd> <59fd> 6821 <59fe> <59fe> 6832 <59ff> <59ff> 1782 <5a00> <5a00> 6817 <5a01> <5a01> 1790 <5a02> <5a02> 15245 <5a03> <5a03> 1785 <5a09> <5a09> 2192 <5a0a> <5a0a> 7285 <5a0b> <5a0b> 15497 <5a0c> <5a0c> 2191 <5a0d> <5a0d> 15160 <5a0f> <5a0f> 7283 <5a11> <5a11> 2180 <5a12> <5a12> 14867 <5a13> <5a13> 2185 <5a15> <5a15> 7282 <5a16> <5a16> 7279 <5a17> <5a17> 7284 <5a18> <5a18> 2181 <5a19> <5a19> 7278 <5a1b> <5a1b> 2184 <5a1c> <5a1c> 2182 <5a1e> <5a1e> 7286 <5a1f> <5a1f> 2183 <5a20> <5a20> 2187 <5a21> <5a21> 14875 <5a23> <5a23> 2188 <5a24> <5a24> 16616 <5a25> <5a25> 2190 <5a27> <5a27> 15841 <5a29> <5a29> 2189 <5a2a> <5a2a> 15163 <5a2b> <5a2b> 15680 <5a2c> <5a2c> 14863 <5a2d> <5a2e> 7280 <5a33> <5a33> 7287 <5a35> <5a35> 7836 <5a36> <5a36> 2630 <5a37> <5a37> 8445 <5a38> <5a38> 7835 <5a39> <5a39> 7854 <5a3c> <5a3c> 2636 <5a3d> <5a3d> 15040 <5a3e> <5a3e> 7852 <5a40> <5a40> 2635 <5a41> <5a41> 2631 <5a42> <5a42> 7861 <5a43> <5a43> 7845 <5a44> <5a44> 7848 <5a45> <5a45> 14615 <5a46> <5a46> 2639 <5a47> <5a47> 7858 <5a48> <5a48> 7850 <5a49> <5a49> 2632 <5a4a> <5a4a> 2640 <5a4c> <5a4c> 7855 <5a4d> <5a4d> 7853 <5a50> <5a50> 7838 <5a51> <5a51> 7859 <5a52> <5a52> 7847 <5a53> <5a53> 7842 <5a54> <5a54> 17923 <5a55> <5a55> 7832 <5a56> <5a56> 7860 <5a57> <5a57> 7844 <5a58> <5a58> 7831 <5a59> <5a59> 15156 <5a5a> <5a5a> 2638 <5a5b> <5a5b> 7849 <5a5c> <5a5c> 7862 <5a5d> <5a5d> 7846 <5a5e> <5a5e> 7834 <5a5f> <5a5f> 7839 <5a60> <5a60> 7830 <5a61> <5a61> 15667 <5a62> <5a62> 2637 <5a63> <5a63> 16635 <5a64> <5a64> 7843 <5a65> <5a65> 7840 <5a66> <5a66> 2633 <5a67> <5a67> 7833 <5a68> <5a68> 14775 <5a69> <5a69> 7857 <5a6a> <5a6a> 2634 endcidrange 100 begincidrange <5a6b> <5a6b> 14914 <5a6c> <5a6c> 7841 <5a6d> <5a6d> 7837 <5a6e> <5a6e> 15679 <5a70> <5a70> 7856 <5a71> <5a71> 15668 <5a77> <5a77> 3107 <5a78> <5a78> 8438 <5a79> <5a79> 15585 <5a7a> <5a7a> 8435 <5a7b> <5a7b> 8452 <5a7c> <5a7c> 8440 <5a7d> <5a7d> 8453 <5a7e> <5a7e> 14865 <5a7f> <5a7f> 3109 <5a81> <5a81> 14877 <5a82> <5a82> 15665 <5a83> <5a83> 8449 <5a84> <5a84> 8446 <5a86> <5a86> 15233 <5a88> <5a88> 16995 <5a8a> <5a8a> 8447 <5a8b> <5a8b> 8450 <5a8c> <5a8c> 8454 <5a8e> <5a8e> 7851 <5a8f> <5a8f> 8456 <5a90> <5a90> 9142 <5a91> <5a91> 16949 <5a92> <5a92> 3110 <5a93> <5a93> 8457 <5a94> <5a94> 8433 <5a95> <5a95> 8443 <5a96> <5a96> 16640 <5a97> <5a97> 8448 <5a99> <5a99> 14858 <5a9a> <5a9a> 3108 <5a9b> <5a9b> 3111 <5a9c> <5a9c> 8455 <5a9d> <5a9d> 8458 <5a9e> <5a9e> 8437 <5a9f> <5a9f> 8434 <5aa0> <5aa0> 16754 <5aa1> <5aa1> 15580 <5aa2> <5aa2> 8436 <5aa5> <5aa5> 8441 <5aa6> <5aa6> 8439 <5aa7> <5aa7> 3112 <5aa9> <5aa9> 8451 <5aab> <5aab> 16634 <5aac> <5aac> 8442 <5aae> <5aae> 8444 <5aaf> <5aaf> 8432 <5ab0> <5ab0> 9130 <5ab1> <5ab1> 9128 <5ab2> <5ab2> 3580 <5ab3> <5ab3> 3578 <5ab4> <5ab4> 9138 <5ab5> <5ab5> 9129 <5ab6> <5ab6> 9139 <5ab7> <5ab7> 9135 <5ab8> <5ab8> 9127 <5ab9> <5ab9> 9141 <5aba> <5aba> 9126 <5abb> <5abb> 9133 <5abc> <5abc> 3577 <5abd> <5abd> 3576 <5abe> <5abe> 3575 <5abf> <5abf> 9131 <5ac0> <5ac0> 9136 <5ac1> <5ac1> 3572 <5ac2> <5ac2> 3579 <5ac3> <5ac3> 14486 <5ac4> <5ac4> 9124 <5ac6> <5ac6> 9134 <5ac7> <5ac7> 9123 <5ac8> <5ac8> 9132 <5ac9> <5ac9> 3573 <5aca> <5aca> 9137 <5acb> <5acb> 9125 <5acc> <5acc> 3574 <5acd> <5acd> 9140 <5ace> <5ace> 15496 <5acf> <5acf> 17333 <5ad3> <5ad3> 16642 <5ad5> <5ad5> 9808 <5ad6> <5ad6> 4020 <5ad7> <5ad7> 4019 <5ad8> <5ad8> 4021 <5ad9> <5ad9> 9820 <5ada> <5ada> 9810 <5adb> <5adb> 9816 <5adc> <5adc> 9805 <5add> <5add> 9819 <5ade> <5ade> 9818 <5adf> <5adf> 9822 <5ae0> <5ae0> 9815 <5ae1> <5ae1> 4016 <5ae2> <5ae2> 9814 <5ae3> <5ae3> 4022 <5ae4> <5ae4> 15238 endcidrange 100 begincidrange <5ae5> <5ae5> 9807 <5ae6> <5ae6> 4017 <5ae8> <5ae8> 9821 <5ae9> <5ae9> 4018 <5aea> <5aea> 9809 <5aeb> <5aeb> 9812 <5aec> <5aec> 9817 <5aed> <5aed> 9811 <5aee> <5aee> 9806 <5af0> <5af0> 16103 <5af2> <5af2> 14325 <5af3> <5af3> 9813 <5af4> <5af4> 10411 <5af5> <5af5> 4397 <5af6> <5af6> 10414 <5af7> <5af7> 10413 <5af8> <5af8> 10416 <5af9> <5af9> 10418 <5afa> <5afa> 14062 <5afb> <5afb> 4395 <5afd> <5afd> 10412 <5afe> <5afe> 15389 <5aff> <5aff> 10410 <5b01> <5b01> 10419 <5b02> <5b02> 10417 <5b03> <5b03> 10415 <5b05> <5b05> 10421 <5b07> <5b07> 10420 <5b08> <5b08> 4399 <5b09> <5b09> 4394 <5b0b> <5b0b> 4396 <5b0c> <5b0c> 4398 <5b0d> <5b0d> 18687 <5b0f> <5b0f> 10422 <5b10> <5b10> 11042 <5b11> <5b11> 15350 <5b13> <5b13> 11041 <5b14> <5b14> 11040 <5b16> <5b16> 11043 <5b17> <5b17> 11036 <5b19> <5b19> 11037 <5b1a> <5b1a> 11045 <5b1b> <5b1b> 11038 <5b1d> <5b1d> 4776 <5b1e> <5b1e> 11047 <5b1f> <5b1f> 18753 <5b20> <5b20> 11046 <5b21> <5b21> 11039 <5b23> <5b23> 11602 <5b24> <5b24> 5061 <5b25> <5b25> 11600 <5b26> <5b26> 11605 <5b27> <5b27> 11604 <5b28> <5b28> 11044 <5b2a> <5b2a> 5060 <5b2b> <5b2b> 15236 <5b2c> <5b2c> 11603 <5b2d> <5b2d> 11599 <5b2e> <5b2e> 11607 <5b2f> <5b2f> 11606 <5b30> <5b30> 5059 <5b32> <5b32> 11601 <5b34> <5b34> 4777 <5b38> <5b38> 5326 <5b3c> <5b3c> 12056 <5b3d> <5b3f> 12425 <5b40> <5b40> 5647 <5b41> <5b41> 14536 <5b43> <5b43> 5648 <5b44> <5b44> 14916 <5b45> <5b45> 12748 <5b46> <5b46> 17074 <5b47> <5b47> 13005 <5b48> <5b48> 13004 <5b4a> <5b4a> 14541 <5b4b> <5b4c> 13180 <5b4d> <5b4d> 13331 <5b4e> <5b4e> 13442 <5b4f> <5b4f> 14897 <5b50> <5b51> 639 <5b53> <5b53> 641 <5b54> <5b54> 710 <5b55> <5b55> 819 <5b56> <5b56> 6108 <5b57> <5b58> 959 <5b5a> <5b5b> 1151 <5b5c> <5b5c> 1150 <5b5d> <5b5d> 1149 <5b5f> <5b5f> 1431 <5b62> <5b62> 6487 <5b63> <5b63> 1433 <5b64> <5b64> 1432 <5b65> <5b65> 6488 <5b66> <5b66> 17742 <5b68> <5b68> 17949 <5b69> <5b69> 1792 <5b6b> <5b6b> 2193 <5b6c> <5b6c> 7288 <5b6d> <5b6d> 15967 <5b6e> <5b6e> 7864 endcidrange 100 begincidrange <5b70> <5b70> 2641 <5b71> <5b71> 3114 <5b72> <5b72> 7863 <5b73> <5b73> 3113 <5b74> <5b74> 14130 <5b75> <5b75> 4023 <5b76> <5b76> 16650 <5b77> <5b77> 9823 <5b78> <5b78> 4778 <5b7a> <5b7a> 5062 <5b7b> <5b7b> 11608 <5b7c> <5b7c> 16652 <5b7d> <5b7d> 5649 <5b7f> <5b7f> 5824 <5b80> <5b80> 549 <5b81> <5b81> 6046 <5b82> <5b82> 16452 <5b83> <5b83> 820 <5b84> <5b84> 6047 <5b85> <5b85> 963 <5b87> <5b88> 961 <5b89> <5b89> 964 <5b8b> <5b8b> 1154 <5b8c> <5b8c> 1153 <5b8e> <5b8e> 6243 <5b8f> <5b8f> 1155 <5b90> <5b90> 18665 <5b92> <5b92> 6244 <5b93> <5b93> 6489 <5b95> <5b95> 6490 <5b97> <5b97> 1434 <5b98> <5b98> 1436 <5b99> <5b99> 1438 <5b9a> <5b9a> 1435 <5b9b> <5b9b> 1439 <5b9c> <5b9c> 1437 <5b9d> <5b9d> 16662 <5b9e> <5b9f> 17743 <5ba2> <5ba2> 1796 <5ba3> <5ba3> 1793 <5ba4> <5ba4> 1795 <5ba5> <5ba5> 1797 <5ba6> <5ba6> 1794 <5ba7> <5ba7> 7289 <5ba8> <5ba8> 6835 <5baa> <5baa> 16763 <5bac> <5bac> 7291 <5bad> <5bad> 7290 <5bae> <5bae> 2199 <5bb0> <5bb0> 2195 <5bb3> <5bb3> 2196 <5bb4> <5bb4> 2198 <5bb5> <5bb5> 2200 <5bb6> <5bb6> 2197 <5bb8> <5bb8> 2202 <5bb9> <5bb9> 2201 <5bbf> <5bbf> 2646 <5bc0> <5bc0> 7866 <5bc1> <5bc1> 7865 <5bc2> <5bc2> 2645 <5bc3> <5bc3> 16165 <5bc4> <5bc4> 2644 <5bc5> <5bc5> 2643 <5bc6> <5bc6> 2647 <5bc7> <5bc7> 2642 <5bca> <5bca> 8464 <5bcb> <5bcb> 8461 <5bcc> <5bcc> 3116 <5bcd> <5bcd> 8460 <5bce> <5bce> 8465 <5bd0> <5bd0> 3118 <5bd1> <5bd1> 8463 <5bd2> <5bd2> 3115 <5bd3> <5bd3> 3117 <5bd4> <5bd4> 8462 <5bd5> <5bd5> 16657 <5bd6> <5bd6> 9143 <5bd7> <5bd7> 17083 <5bd8> <5bd9> 9144 <5bde> <5bde> 4024 <5bdf> <5bdf> 4032 <5be0> <5be0> 9824 <5be1> <5be1> 4026 <5be2> <5be2> 4030 <5be3> <5be3> 9825 <5be4> <5be4> 4031 <5be5> <5be6> 4027 <5be7> <5be7> 4025 <5be8> <5be8> 4029 <5be9> <5be9> 4402 <5bea> <5bea> 8459 <5beb> <5beb> 4403 <5bec> <5bec> 4401 <5bee> <5bee> 4400 <5bef> <5bef> 11048 <5bf0> <5bf0> 4779 <5bf1> <5bf2> 11609 <5bf3> <5bf3> 16661 <5bf5> <5bf5> 5499 <5bf6> <5bf6> 5650 endcidrange 100 begincidrange <5bf8> <5bf8> 642 <5bfa> <5bfa> 965 <5bff> <5bff> 16605 <5c01> <5c01> 1798 <5c03> <5c03> 7292 <5c04> <5c04> 2203 <5c05> <5c05> 16664 <5c07> <5c07> 2650 <5c08> <5c08> 2649 <5c09> <5c09> 2648 <5c0a> <5c0b> 3119 <5c0c> <5c0c> 8466 <5c0d> <5c0d> 4033 <5c0e> <5c0e> 4780 <5c0f> <5c0f> 643 <5c10> <5c10> 6023 <5c11> <5c11> 711 <5c12> <5c12> 6048 <5c13> <5c13> 16666 <5c14> <5c14> 16668 <5c15> <5c15> 6109 <5c16> <5c16> 966 <5c1a> <5c1a> 1440 <5c1c> <5c1c> 17898 <5c1e> <5c1e> 14889 <5c1f> <5c1f> 9146 <5c20> <5c20> 15753 <5c22> <5c22> 644 <5c23> <5c23> 17640 <5c24> <5c24> 712 <5c25> <5c25> 6110 <5c28> <5c28> 6245 <5c2a> <5c2a> 6246 <5c2c> <5c2c> 1156 <5c30> <5c30> 8467 <5c31> <5c31> 3121 <5c33> <5c33> 9147 <5c37> <5c37> 5063 <5c38> <5c38> 645 <5c39> <5c39> 665 <5c3a> <5c3a> 713 <5c3b> <5c3b> 6049 <5c3c> <5c3c> 821 <5c3e> <5c3e> 1160 <5c3f> <5c3f> 1159 <5c40> <5c41> 1157 <5c44> <5c44> 6491 <5c45> <5c46> 1442 <5c47> <5c47> 6492 <5c48> <5c48> 1441 <5c49> <5c49> 16671 <5c4a> <5c4a> 16220 <5c4b> <5c4b> 1802 <5c4c> <5c4c> 6836 <5c4d> <5c4d> 1801 <5c4e> <5c4f> 1799 <5c50> <5c50> 2206 <5c51> <5c51> 2204 <5c53> <5c53> 16130 <5c54> <5c54> 7294 <5c55> <5c55> 2205 <5c56> <5c56> 7293 <5c58> <5c58> 2194 <5c59> <5c59> 7867 <5c5c> <5c5d> 2652 <5c5e> <5c5e> 15719 <5c60> <5c60> 2651 <5c62> <5c62> 4034 <5c63> <5c63> 9826 <5c64> <5c65> 4404 <5c67> <5c67> 10423 <5c68> <5c68> 5064 <5c69> <5c6a> 12057 <5c6c> <5c6c> 5742 <5c6d> <5c6d> 13443 <5c6e> <5c6e> 6006 <5c6f> <5c6f> 714 <5c71> <5c71> 646 <5c73> <5c73> 6051 <5c74> <5c74> 6050 <5c79> <5c79> 967 <5c7a> <5c7b> 6112 <5c7c> <5c7c> 6111 <5c7e> <5c7e> 6114 <5c85> <5c85> 16673 <5c86> <5c86> 6254 <5c88> <5c88> 6249 <5c89> <5c89> 6251 <5c8a> <5c8a> 6253 <5c8b> <5c8b> 6250 <5c8c> <5c8c> 1164 <5c8d> <5c8d> 6247 <5c8f> <5c8f> 6248 <5c90> <5c91> 1161 <5c92> <5c92> 6252 <5c93> <5c93> 6255 <5c94> <5c94> 1163 <5c95> <5c95> 6256 <5c99> <5c99> 18060 <5c9a> <5c9a> 17745 endcidrange 100 begincidrange <5c9c> <5c9c> 18778 <5c9d> <5c9d> 6506 <5c9e> <5c9e> 14890 <5c9f> <5c9f> 6500 <5ca0> <5ca0> 6495 <5ca1> <5ca1> 1445 <5ca2> <5ca2> 6503 <5ca3> <5ca3> 6501 <5ca4> <5ca4> 6494 <5ca5> <5ca5> 6507 <5ca6> <5ca6> 6510 <5ca7> <5ca7> 6505 <5ca8> <5ca8> 6498 <5ca9> <5ca9> 1447 <5caa> <5caa> 6504 <5cab> <5cab> 1448 <5cac> <5cac> 6499 <5cad> <5cad> 6502 <5cae> <5cae> 6493 <5caf> <5caf> 6497 <5cb0> <5cb0> 6509 <5cb1> <5cb1> 1449 <5cb3> <5cb3> 1450 <5cb5> <5cb5> 6496 <5cb6> <5cb6> 6508 <5cb7> <5cb7> 1444 <5cb8> <5cb8> 1446 <5cba> <5cba> 16683 <5cc1> <5cc1> 17336 <5cc2> <5cc2> 15692 <5cc6> <5cc6> 6853 <5cc7> <5cc7> 6846 <5cc8> <5cc8> 6852 <5cc9> <5cc9> 6845 <5cca> <5cca> 6847 <5ccb> <5ccb> 6841 <5ccc> <5ccc> 6839 <5cce> <5cce> 6854 <5ccf> <5ccf> 6851 <5cd0> <5cd0> 6837 <5cd1> <5cd1> 16147 <5cd2> <5cd2> 1804 <5cd3> <5cd4> 6849 <5cd6> <5cd6> 6848 <5cd7> <5cd7> 6840 <5cd8> <5cd8> 6838 <5cd9> <5cd9> 1803 <5cda> <5cda> 6844 <5cdb> <5cdb> 6842 <5cde> <5cde> 6843 <5cdf> <5cdf> 6855 <5ce5> <5ce5> 17975 <5ce8> <5ce8> 2211 <5ce9> <5ce9> 16674 <5cea> <5cea> 2210 <5cec> <5cec> 7295 <5ced> <5ced> 2207 <5cee> <5cee> 7297 <5cef> <5cef> 16675 <5cf0> <5cf0> 2212 <5cf1> <5cf1> 7298 <5cf4> <5cf4> 2215 <5cf6> <5cf6> 2213 <5cf7> <5cf7> 7299 <5cf8> <5cf8> 6856 <5cf9> <5cf9> 7301 <5cfb> <5cfb> 2209 <5cfd> <5cfd> 2208 <5cff> <5cff> 7296 <5d00> <5d00> 7300 <5d01> <5d01> 2214 <5d06> <5d06> 2655 <5d07> <5d07> 2654 <5d0b> <5d0b> 7869 <5d0c> <5d0c> 7873 <5d0d> <5d0d> 7875 <5d0e> <5d0e> 2656 <5d0f> <5d0f> 7878 <5d10> <5d10> 16679 <5d11> <5d11> 2660 <5d12> <5d12> 7880 <5d14> <5d14> 2662 <5d15> <5d15> 17337 <5d16> <5d16> 2658 <5d17> <5d17> 2666 <5d18> <5d18> 16680 <5d19> <5d19> 2663 <5d1a> <5d1a> 7871 <5d1b> <5d1b> 2657 <5d1d> <5d1d> 7870 <5d1e> <5d1e> 7868 <5d1f> <5d1f> 7882 <5d20> <5d20> 7872 <5d22> <5d22> 2659 <5d23> <5d23> 7881 <5d24> <5d24> 2664 <5d25> <5d25> 7877 <5d26> <5d26> 7876 <5d27> <5d27> 2665 <5d28> <5d28> 7874 endcidrange 100 begincidrange <5d29> <5d29> 2661 <5d2c> <5d2c> 15863 <5d2e> <5d2e> 7883 <5d2f> <5d2f> 18131 <5d30> <5d30> 7879 <5d31> <5d31> 8482 <5d32> <5d32> 8489 <5d33> <5d33> 8478 <5d34> <5d34> 3124 <5d35> <5d35> 8474 <5d36> <5d36> 8490 <5d37> <5d37> 8468 <5d38> <5d38> 8487 <5d39> <5d39> 8485 <5d3a> <5d3a> 8479 <5d3c> <5d3c> 8488 <5d3d> <5d3d> 8481 <5d3e> <5d3e> 17961 <5d3f> <5d3f> 8473 <5d40> <5d40> 8491 <5d41> <5d41> 8471 <5d42> <5d42> 8484 <5d43> <5d43> 8469 <5d45> <5d45> 8492 <5d46> <5d46> 16681 <5d47> <5d47> 3125 <5d48> <5d48> 17962 <5d49> <5d49> 8486 <5d4a> <5d4a> 9150 <5d4b> <5d4b> 8472 <5d4c> <5d4c> 3122 <5d4e> <5d4e> 8476 <5d50> <5d50> 3123 <5d51> <5d51> 8475 <5d52> <5d52> 8480 <5d55> <5d55> 8477 <5d56> <5d56> 17338 <5d57> <5d57> 16330 <5d59> <5d59> 8483 <5d5b> <5d5b> 15829 <5d5e> <5d5e> 9154 <5d62> <5d62> 9157 <5d63> <5d63> 9149 <5d65> <5d65> 9151 <5d67> <5d67> 9156 <5d68> <5d68> 9155 <5d69> <5d69> 3581 <5d6b> <5d6b> 8470 <5d6c> <5d6c> 9153 <5d6f> <5d6f> 3582 <5d70> <5d70> 18148 <5d71> <5d71> 9148 <5d72> <5d72> 9152 <5d74> <5d74> 16111 <5d77> <5d77> 9833 <5d79> <5d79> 9840 <5d7a> <5d7a> 9831 <5d7c> <5d7c> 9838 <5d7d> <5d7d> 9829 <5d7e> <5d7e> 9837 <5d7f> <5d7f> 9841 <5d80> <5d80> 9828 <5d81> <5d81> 9832 <5d82> <5d82> 9827 <5d84> <5d84> 4035 <5d85> <5d85> 15924 <5d86> <5d86> 9830 <5d87> <5d87> 4036 <5d88> <5d88> 9836 <5d89> <5d89> 9835 <5d8a> <5d8a> 9834 <5d8b> <5d8b> 16676 <5d8d> <5d8d> 9839 <5d8e> <5d8e> 16140 <5d92> <5d92> 10427 <5d93> <5d93> 10429 <5d94> <5d94> 4407 <5d95> <5d95> 10430 <5d97> <5d97> 10425 <5d99> <5d99> 10424 <5d9a> <5d9a> 10434 <5d9c> <5d9c> 10432 <5d9d> <5d9d> 4406 <5d9e> <5d9e> 10435 <5d9f> <5d9f> 10426 <5da0> <5da0> 10431 <5da1> <5da1> 10433 <5da2> <5da2> 10428 <5da4> <5da4> 17965 <5da7> <5da7> 11052 <5da8> <5da8> 11057 <5da9> <5da9> 11051 <5daa> <5daa> 11056 <5dab> <5dab> 15929 <5dac> <5dac> 11049 <5dad> <5dad> 11059 <5dae> <5dae> 11055 <5daf> <5daf> 11060 <5db0> <5db0> 11054 <5db1> <5db1> 11050 endcidrange 100 begincidrange <5db2> <5db2> 11058 <5db4> <5db4> 11061 <5db5> <5db5> 11053 <5db6> <5db6> 16728 <5db7> <5db7> 11611 <5db8> <5db8> 5068 <5db9> <5db9> 17966 <5dba> <5dba> 5066 <5dbc> <5dbc> 5065 <5dbd> <5dbd> 5067 <5dc0> <5dc0> 12059 <5dc1> <5dc1> 15359 <5dc2> <5dc2> 12323 <5dc3> <5dc3> 12428 <5dc6> <5dc7> 12749 <5dc9> <5dc9> 5651 <5dcb> <5dcb> 13006 <5dcd> <5dcd> 5743 <5dcf> <5dcf> 13007 <5dd1> <5dd1> 13183 <5dd2> <5dd2> 5826 <5dd4> <5dd4> 5825 <5dd5> <5dd5> 13182 <5dd6> <5dd6> 5879 <5dd7> <5dd7> 16684 <5dd8> <5dd8> 13332 <5ddb> <5ddb> 550 <5ddd> <5ddd> 647 <5dde> <5dde> 968 <5ddf> <5ddf> 6115 <5de0> <5de0> 6257 <5de1> <5de1> 1306 <5de2> <5de2> 2667 <5de5> <5de5> 648 <5de6> <5de6> 824 <5de7> <5de7> 823 <5de8> <5de8> 822 <5deb> <5deb> 1165 <5dee> <5dee> 2216 <5df0> <5df0> 9158 <5df1> <5df3> 649 <5df4> <5df4> 715 <5df5> <5df5> 16225 <5df7> <5df7> 1805 <5df9> <5df9> 6857 <5dfd> <5dfd> 3126 <5dfe> <5dfe> 652 <5dff> <5dff> 6024 <5e02> <5e03> 825 <5e04> <5e04> 6052 <5e06> <5e06> 969 <5e09> <5e09> 16704 <5e0a> <5e0a> 6258 <5e0b> <5e0b> 15754 <5e0c> <5e0c> 1166 <5e0e> <5e0e> 6259 <5e11> <5e11> 1456 <5e12> <5e12> 16174 <5e14> <5e14> 6512 <5e15> <5e15> 1454 <5e16> <5e16> 1453 <5e17> <5e17> 6511 <5e18> <5e18> 1451 <5e19> <5e19> 6513 <5e1a> <5e1a> 1452 <5e1b> <5e1b> 1455 <5e1d> <5e1d> 1806 <5e1f> <5e1f> 1808 <5e20> <5e20> 6861 <5e21> <5e23> 6858 <5e24> <5e24> 6862 <5e25> <5e25> 1807 <5e28> <5e28> 7303 <5e29> <5e29> 7302 <5e2b> <5e2b> 2218 <5e2d> <5e2d> 2217 <5e2e> <5e2e> 16693 <5e33> <5e33> 2670 <5e34> <5e34> 7885 <5e36> <5e36> 2669 <5e37> <5e37> 2671 <5e38> <5e38> 2668 <5e3d> <5e3d> 3128 <5e3e> <5e3e> 7884 <5e40> <5e40> 3129 <5e41> <5e41> 8494 <5e42> <5e42> 17312 <5e43> <5e43> 3130 <5e44> <5e44> 8493 <5e45> <5e45> 3127 <5e48> <5e48> 14892 <5e4a> <5e4a> 9161 <5e4b> <5e4b> 9163 <5e4c> <5e4c> 3583 <5e4d> <5e4d> 9162 <5e4e> <5e4e> 9160 <5e4f> <5e4f> 9159 <5e53> <5e53> 9844 <5e54> <5e54> 4041 <5e55> <5e55> 4039 endcidrange 100 begincidrange <5e57> <5e57> 4040 <5e58> <5e59> 9842 <5e5b> <5e5b> 4037 <5e5c> <5e5c> 10439 <5e5d> <5e5d> 10437 <5e5e> <5e5e> 14891 <5e5f> <5e5f> 4409 <5e60> <5e60> 10438 <5e61> <5e61> 4410 <5e62> <5e62> 4408 <5e63> <5e63> 4038 <5e66> <5e66> 11064 <5e67> <5e68> 11062 <5e69> <5e69> 10436 <5e6a> <5e6a> 11613 <5e6b> <5e6b> 5069 <5e6c> <5e6c> 11612 <5e6d> <5e6e> 12060 <5e6f> <5e6f> 11065 <5e70> <5e70> 12429 <5e72> <5e72> 653 <5e73> <5e73> 827 <5e74> <5e74> 971 <5e75> <5e75> 6116 <5e76> <5e76> 970 <5e78> <5e78> 1457 <5e79> <5e79> 3584 <5e7a> <5e7a> 551 <5e7b> <5e7b> 716 <5e7c> <5e7c> 828 <5e7d> <5e7d> 1809 <5e7e> <5e7e> 3131 <5e7f> <5e7f> 552 <5e80> <5e80> 6053 <5e82> <5e82> 6054 <5e83> <5e83> 16648 <5e84> <5e84> 6117 <5e86> <5e86> 17746 <5e87> <5e87> 1168 <5e88> <5e88> 6263 <5e89> <5e89> 6261 <5e8a> <5e8a> 1169 <5e8b> <5e8b> 6260 <5e8c> <5e8c> 6262 <5e8d> <5e8d> 6264 <5e8f> <5e8f> 1167 <5e95> <5e96> 1461 <5e97> <5e97> 1459 <5e9a> <5e9a> 1458 <5e9b> <5e9b> 6866 <5e9c> <5e9c> 1460 <5ea0> <5ea0> 1810 <5ea2> <5ea2> 6865 <5ea3> <5ea3> 6867 <5ea4> <5ea4> 6864 <5ea5> <5ea5> 6868 <5ea6> <5ea6> 1811 <5ea7> <5ea7> 2221 <5ea8> <5ea8> 7304 <5eaa> <5eaa> 7306 <5eab> <5eab> 2219 <5eac> <5eac> 7307 <5ead> <5ead> 2220 <5eae> <5eae> 7305 <5eb0> <5eb0> 6863 <5eb1> <5eb1> 7886 <5eb2> <5eb3> 7889 <5eb4> <5eb4> 7887 <5eb5> <5eb5> 2675 <5eb6> <5eb6> 2674 <5eb7> <5eb8> 2672 <5eb9> <5eb9> 7888 <5ebd> <5ebd> 17341 <5ebe> <5ebe> 2676 <5ec1> <5ec2> 3133 <5ec4> <5ec4> 3135 <5ec5> <5ec5> 9164 <5ec6> <5ec6> 9166 <5ec7> <5ec7> 9168 <5ec8> <5ec8> 3586 <5ec9> <5ec9> 3585 <5eca> <5eca> 3132 <5ecb> <5ecb> 9167 <5ecc> <5ecc> 9165 <5ecd> <5ecd> 14896 <5ece> <5ece> 9848 <5ed0> <5ed0> 16701 <5ed1> <5ed1> 9846 <5ed2> <5ed2> 9852 <5ed3> <5ed3> 4042 <5ed4> <5ed4> 9853 <5ed5> <5ed5> 9850 <5ed6> <5ed6> 4043 <5ed7> <5ed7> 9847 <5ed8> <5ed8> 9845 <5ed9> <5ed9> 9851 <5eda> <5eda> 4412 <5edb> <5edb> 10441 <5edc> <5edc> 9849 <5edd> <5edd> 4414 endcidrange 100 begincidrange <5ede> <5ede> 10442 <5edf> <5edf> 4413 <5ee0> <5ee0> 4416 <5ee1> <5ee1> 10443 <5ee2> <5ee2> 4411 <5ee3> <5ee3> 4415 <5ee5> <5ee5> 11070 <5ee6> <5ee6> 11068 <5ee7> <5ee7> 11067 <5ee8> <5ee8> 11069 <5ee9> <5ee9> 11066 <5eec> <5eec> 5501 <5eee> <5eef> 12751 <5ef1> <5ef1> 13008 <5ef2> <5ef2> 13184 <5ef3> <5ef3> 5954 <5ef4> <5ef4> 553 <5ef6> <5ef6> 1463 <5ef7> <5ef7> 1170 <5ef8> <5ef8> 14447 <5ef9> <5ef9> 16707 <5efa> <5efa> 1812 <5efb> <5efb> 16708 <5efc> <5efc> 16710 <5efe> <5efe> 654 <5eff> <5eff> 717 <5f01> <5f01> 829 <5f02> <5f02> 6118 <5f04> <5f04> 1171 <5f05> <5f05> 6265 <5f07> <5f07> 6869 <5f08> <5f08> 1813 <5f0a> <5f0a> 4044 <5f0b> <5f0b> 655 <5f0c> <5f0c> 14910 <5f0d> <5f0d> 16713 <5f0e> <5f0e> 14911 <5f0f> <5f0f> 972 <5f12> <5f12> 3587 <5f13> <5f13> 656 <5f14> <5f15> 718 <5f17> <5f17> 831 <5f18> <5f18> 830 <5f1a> <5f1a> 6119 <5f1b> <5f1b> 973 <5f1d> <5f1d> 6266 <5f1f> <5f1f> 1172 <5f22> <5f24> 6515 <5f25> <5f25> 17968 <5f26> <5f27> 1464 <5f28> <5f28> 6514 <5f29> <5f29> 1466 <5f2d> <5f2d> 1814 <5f2e> <5f2e> 6870 <5f30> <5f30> 7309 <5f31> <5f31> 2222 <5f33> <5f33> 7308 <5f35> <5f35> 2677 <5f36> <5f36> 7891 <5f37> <5f37> 2678 <5f38> <5f38> 7892 <5f3a> <5f3a> 16718 <5f3c> <5f3c> 3136 <5f40> <5f40> 9169 <5f43> <5f43> 9855 <5f44> <5f44> 9854 <5f46> <5f46> 4045 <5f48> <5f48> 4417 <5f49> <5f49> 10444 <5f4a> <5f4a> 4781 <5f4b> <5f4b> 11071 <5f4c> <5f4c> 5070 <5f4d> <5f4d> 15269 <5f4e> <5f4e> 5827 <5f4f> <5f4f> 13334 <5f50> <5f50> 554 <5f51> <5f51> 17641 <5f54> <5f54> 6518 <5f56> <5f56> 6871 <5f57> <5f57> 2679 <5f58> <5f58> 8495 <5f59> <5f59> 3588 <5f5c> <5f5c> 15706 <5f5d> <5f5d> 5327 <5f61> <5f61> 555 <5f62> <5f62> 1174 <5f63> <5f63> 16722 <5f64> <5f64> 1173 <5f65> <5f65> 1815 <5f67> <5f67> 7310 <5f69> <5f69> 2681 <5f6a> <5f6a> 2953 <5f6b> <5f6b> 2682 <5f6c> <5f6c> 2680 <5f6d> <5f6d> 3137 <5f6f> <5f6f> 9856 <5f70> <5f70> 4046 <5f71> <5f71> 4418 <5f72> <5f72> 16724 <5f73> <5f73> 6007 endcidrange 100 begincidrange <5f74> <5f74> 6120 <5f76> <5f76> 6268 <5f77> <5f77> 1175 <5f78> <5f78> 6267 <5f79> <5f79> 1176 <5f7b> <5f7b> 16472 <5f7c> <5f7c> 1470 <5f7d> <5f7d> 6521 <5f7e> <5f7e> 6520 <5f7f> <5f7f> 1469 <5f80> <5f81> 1467 <5f82> <5f82> 6519 <5f83> <5f83> 17969 <5f85> <5f85> 1817 <5f86> <5f86> 6872 <5f87> <5f87> 1820 <5f88> <5f88> 1816 <5f89> <5f89> 1822 <5f8a> <5f8b> 1818 <5f8c> <5f8c> 1821 <5f90> <5f90> 2225 <5f91> <5f91> 2224 <5f92> <5f92> 2223 <5f96> <5f96> 7894 <5f97> <5f97> 2683 <5f98> <5f98> 2686 <5f99> <5f99> 2684 <5f9b> <5f9b> 7893 <5f9c> <5f9c> 2689 <5f9e> <5f9e> 2685 <5f9f> <5f9f> 7895 <5fa0> <5fa0> 2688 <5fa1> <5fa1> 2687 <5fa4> <5fa4> 16428 <5fa5> <5fa5> 8497 <5fa6> <5fa6> 8496 <5fa7> <5fa7> 16727 <5fa8> <5fa8> 3140 <5fa9> <5faa> 3138 <5fab> <5fab> 8498 <5fac> <5fac> 3589 <5fad> <5fad> 9171 <5fae> <5fae> 3590 <5faf> <5faf> 9170 <5fb1> <5fb1> 15768 <5fb2> <5fb2> 10445 <5fb5> <5fb5> 4420 <5fb6> <5fb6> 9857 <5fb7> <5fb7> 4419 <5fb9> <5fb9> 4047 <5fba> <5fba> 16287 <5fbb> <5fbb> 11073 <5fbc> <5fbc> 11072 <5fbd> <5fbd> 5071 <5fbe> <5fbe> 11614 <5fbf> <5fbf> 12430 <5fc0> <5fc1> 12753 <5fc3> <5fc3> 720 <5fc4> <5fc4> 17642 <5fc5> <5fc5> 832 <5fc9> <5fc9> 6055 <5fcc> <5fcc> 1178 <5fcd> <5fcd> 1180 <5fcf> <5fcf> 6123 <5fd0> <5fd0> 6271 <5fd1> <5fd1> 6270 <5fd2> <5fd2> 6269 <5fd4> <5fd4> 6122 <5fd5> <5fd5> 6121 <5fd6> <5fd6> 975 <5fd7> <5fd7> 1179 <5fd8> <5fd8> 1177 <5fd9> <5fd9> 974 <5fdb> <5fdb> 14922 <5fdd> <5fdd> 1471 <5fde> <5fde> 6522 <5fdf> <5fdf> 16815 <5fe0> <5fe0> 1472 <5fe1> <5fe1> 6276 <5fe3> <5fe3> 6278 <5fe4> <5fe4> 6277 <5fe5> <5fe5> 6523 <5fe8> <5fe8> 6273 <5fea> <5fea> 1184 <5feb> <5feb> 1182 <5fed> <5fed> 6272 <5fee> <5fee> 6274 <5fef> <5fef> 6280 <5ff1> <5ff1> 1181 <5ff3> <5ff3> 6275 <5ff4> <5ff4> 6284 <5ff5> <5ff5> 1474 <5ff7> <5ff7> 6281 <5ff8> <5ff8> 1183 <5ffa> <5ffa> 6279 <5ffb> <5ffb> 6282 <5ffd> <5ffd> 1473 <5fff> <5fff> 1475 <6000> <6000> 6283 <6009> <6009> 6543 endcidrange 100 begincidrange <600a> <600a> 6530 <600b> <600b> 6528 <600c> <600c> 6542 <600d> <600d> 6537 <600e> <600e> 1827 <600f> <600f> 1476 <6010> <6010> 6538 <6011> <6011> 6541 <6012> <6012> 1823 <6013> <6013> 6540 <6014> <6014> 1477 <6015> <6015> 1482 <6016> <6016> 1480 <6017> <6017> 6531 <6019> <6019> 6526 <601a> <601a> 6533 <601b> <601b> 1487 <601c> <601c> 6544 <601d> <601d> 1824 <601e> <601e> 6534 <6020> <6020> 1825 <6021> <6021> 1483 <6022> <6022> 6536 <6023> <6023> 16773 <6024> <6024> 6887 <6025> <6025> 1826 <6026> <6026> 6525 <6027> <6027> 1484 <6028> <6028> 1828 <6029> <6029> 1485 <602a> <602a> 1481 <602b> <602b> 1486 <602c> <602c> 6535 <602d> <602d> 6524 <602e> <602e> 6539 <602f> <602f> 1478 <6031> <6031> 16737 <6032> <6032> 6527 <6033> <6033> 6532 <6034> <6034> 6529 <6035> <6035> 1479 <6037> <6037> 6873 <6039> <6039> 6874 <603b> <603b> 17747 <6040> <6040> 6884 <6041> <6041> 7314 <6042> <6042> 6885 <6043> <6043> 1834 <6044> <6044> 6888 <6045> <6045> 6878 <6046> <6046> 1833 <6047> <6047> 6880 <6049> <6049> 6881 <604a> <604a> 16500 <604c> <604c> 6883 <604d> <604d> 1829 <6050> <6050> 2229 <6052> <6052> 14060 <6053> <6053> 6879 <6054> <6054> 6875 <6055> <6055> 2230 <6058> <6058> 6889 <6059> <6059> 2226 <605a> <605a> 7312 <605b> <605b> 6882 <605d> <605d> 7311 <605e> <605e> 6877 <605f> <605f> 6886 <6062> <6062> 1832 <6063> <6063> 2227 <6064> <6064> 1838 <6065> <6065> 2228 <6066> <6066> 6890 <6067> <6067> 7313 <6068> <6068> 1831 <6069> <6069> 2232 <606a> <606a> 1837 <606b> <606b> 1836 <606c> <606c> 1835 <606d> <606d> 2231 <606e> <606e> 6891 <606f> <606f> 2233 <6070> <6070> 1830 <6072> <6072> 6876 <6075> <6075> 14934 <6077> <6077> 16389 <607e> <607e> 14919 <607f> <607f> 2690 <6080> <6080> 7317 <6081> <6081> 7319 <6083> <6083> 7321 <6084> <6084> 2234 <6085> <6085> 2240 <6086> <6086> 7898 <6087> <6087> 7325 <6088> <6088> 7316 <6089> <6089> 2692 <608a> <608a> 7896 <608c> <608c> 2239 <608d> <608d> 2237 endcidrange 100 begincidrange <608e> <608e> 7327 <6090> <6090> 7897 <6092> <6092> 7318 <6094> <6094> 2238 <6095> <6095> 7322 <6096> <6096> 2241 <6097> <6097> 7324 <609a> <609a> 2236 <609b> <609b> 7323 <609c> <609c> 7326 <609d> <609d> 7320 <609e> <609e> 16746 <609f> <609f> 2235 <60a0> <60a0> 2693 <60a2> <60a2> 7315 <60a3> <60a3> 2691 <60a4> <60a4> 16385 <60a7> <60a7> 15068 <60a8> <60a8> 2694 <60b0> <60b0> 7900 <60b1> <60b1> 7909 <60b2> <60b2> 3143 <60b3> <60b3> 16748 <60b4> <60b4> 2696 <60b5> <60b5> 2701 <60b6> <60b6> 3144 <60b7> <60b7> 7911 <60b8> <60b8> 2708 <60b9> <60b9> 8500 <60ba> <60ba> 7901 <60bb> <60bb> 2700 <60bc> <60bc> 2703 <60bd> <60bd> 2698 <60be> <60be> 7899 <60bf> <60bf> 7913 <60c0> <60c0> 7916 <60c1> <60c1> 8515 <60c3> <60c3> 7914 <60c4> <60c4> 8504 <60c5> <60c5> 2699 <60c6> <60c6> 2706 <60c7> <60c7> 2710 <60c8> <60c8> 7908 <60c9> <60c9> 8499 <60ca> <60ca> 7912 <60cb> <60cb> 2695 <60cc> <60cc> 8501 <60cd> <60cd> 7915 <60ce> <60ce> 8503 <60cf> <60cf> 7904 <60d1> <60d1> 3141 <60d3> <60d4> 7902 <60d5> <60d5> 2705 <60d7> <60d7> 17973 <60d8> <60d8> 2704 <60d9> <60d9> 7906 <60da> <60da> 2709 <60db> <60db> 7910 <60dc> <60dc> 2702 <60dd> <60dd> 7907 <60de> <60de> 15820 <60df> <60df> 2707 <60e0> <60e0> 3145 <60e1> <60e1> 3142 <60e2> <60e2> 8502 <60e3> <60e3> 15733 <60e4> <60e4> 7905 <60e6> <60e6> 2697 <60e7> <60e7> 15748 <60e8> <60e8> 15739 <60e9> <60e9> 16393 <60f0> <60f0> 3150 <60f1> <60f1> 3154 <60f2> <60f2> 8506 <60f3> <60f3> 3595 <60f4> <60f4> 3152 <60f5> <60f5> 8510 <60f6> <60f6> 3156 <60f7> <60f7> 9172 <60f8> <60f8> 8512 <60f9> <60f9> 3597 <60fa> <60fa> 3148 <60fb> <60fb> 3151 <60fc> <60fc> 8513 <60fd> <60fd> 16296 <60fe> <60fe> 8514 <60ff> <60ff> 8520 <6100> <6100> 3158 <6101> <6101> 3598 <6103> <6103> 8516 <6104> <6104> 8521 <6105> <6105> 8509 <6106> <6106> 3608 <6107> <6107> 15413 <6108> <6108> 3599 <6109> <6109> 3157 <610a> <610a> 8507 <610b> <610b> 8522 <610c> <610c> 15495 <610d> <610d> 3607 endcidrange 100 begincidrange <610e> <610e> 3155 <610f> <610f> 3592 <6110> <6110> 8519 <6112> <6112> 3159 <6113> <6113> 8511 <6114> <6114> 8505 <6115> <6115> 3149 <6116> <6116> 8508 <6118> <6118> 8517 <6119> <6119> 16118 <611a> <611a> 3591 <611b> <611b> 3596 <611c> <611c> 3146 <611d> <611d> 8518 <611f> <611f> 3594 <6123> <6123> 3147 <6127> <6127> 3606 <6128> <6128> 9859 <6129> <6129> 9183 <612b> <612b> 9175 <612c> <612c> 9858 <612e> <612e> 9179 <612f> <612f> 9181 <6130> <6130> 16183 <6132> <6132> 9178 <6134> <6134> 3605 <6136> <6136> 9177 <6137> <6137> 3609 <613b> <613b> 9874 <613d> <613d> 17974 <613e> <613e> 3604 <613f> <613f> 4049 <6140> <6140> 9184 <6141> <6141> 9860 <6142> <6142> 16756 <6144> <6144> 3602 <6145> <6145> 9176 <6146> <6146> 9180 <6147> <6147> 4048 <6148> <6148> 3593 <6149> <614a> 9173 <614b> <614b> 4050 <614c> <614c> 3601 <614d> <614d> 3603 <614e> <614e> 3600 <614f> <614f> 9182 <6150> <6150> 15410 <6152> <6153> 9864 <6154> <6154> 9870 <6155> <6155> 4425 <6156> <6156> 9877 <6158> <6158> 4056 <6159> <6159> 16314 <615a> <615a> 4055 <615b> <615b> 9872 <615c> <615c> 16774 <615d> <615d> 4424 <615e> <615e> 9861 <615f> <615f> 4054 <6160> <6160> 18764 <6161> <6161> 9876 <6162> <6163> 4052 <6164> <6164> 16755 <6165> <6165> 9873 <6166> <6166> 10462 <6167> <6167> 4422 <6168> <6168> 3153 <616a> <616a> 9875 <616b> <616b> 4429 <616c> <616c> 9867 <616e> <616e> 4423 <616f> <616f> 16320 <6170> <6170> 4428 <6171> <6171> 9862 <6172> <6172> 9866 <6173> <6173> 9863 <6174> <6174> 9869 <6175> <6175> 4057 <6176> <6176> 4421 <6177> <6177> 4051 <6179> <6179> 10448 <617a> <617a> 9871 <617c> <617c> 4427 <617d> <617d> 16317 <617e> <617e> 4430 <6180> <6180> 9868 <6181> <6181> 16759 <6182> <6182> 4426 <6183> <6183> 10447 <6187> <6187> 16762 <6189> <6189> 10452 <618a> <618a> 4785 <618b> <618b> 10446 <618c> <618c> 11085 <618d> <618d> 10461 <618e> <618e> 4434 <6190> <6190> 4432 <6191> <6191> 4783 <6192> <6192> 10458 <6193> <6193> 10454 endcidrange 100 begincidrange <6194> <6194> 4438 <6195> <6195> 15840 <6196> <6196> 11076 <6198> <6198> 14933 <6199> <6199> 14932 <619a> <619a> 4436 <619b> <619b> 10453 <619c> <619c> 16386 <619d> <619d> 11074 <619f> <619f> 10457 <61a1> <61a1> 10460 <61a2> <61a2> 10451 <61a4> <61a4> 4437 <61a7> <61a7> 4431 <61a8> <61a8> 11075 <61a9> <61a9> 4784 <61aa> <61aa> 10459 <61ab> <61ab> 4433 <61ac> <61ac> 4435 <61ad> <61ad> 10456 <61ae> <61ae> 4439 <61af> <61af> 10455 <61b0> <61b0> 10450 <61b1> <61b1> 10449 <61b2> <61b2> 4782 <61b3> <61b3> 10463 <61b4> <61b4> 11078 <61b5> <61b5> 11616 <61b6> <61b6> 4787 <61b7> <61b7> 17977 <61b8> <61b8> 11084 <61b9> <61b9> 17343 <61ba> <61ba> 11082 <61bc> <61bc> 11617 <61be> <61be> 4788 <61bf> <61bf> 11083 <61c0> <61c0> 14928 <61c1> <61c1> 11080 <61c2> <61c2> 5073 <61c3> <61c3> 11615 <61c5> <61c5> 11077 <61c6> <61c6> 11079 <61c7> <61c7> 5074 <61c8> <61c8> 4790 <61c9> <61c9> 5072 <61ca> <61ca> 4789 <61cb> <61cb> 5076 <61cc> <61cc> 11081 <61cd> <61cd> 4786 <61cf> <61cf> 17978 <61d0> <61d0> 16769 <61d3> <61d3> 16766 <61d6> <61d6> 12070 <61d8> <61d8> 12062 <61da> <61da> 14513 <61de> <61de> 11623 <61df> <61df> 12063 <61e0> <61e0> 11619 <61e2> <61e2> 16325 <61e3> <61e3> 5328 <61e4> <61e4> 11621 <61e5> <61e5> 11620 <61e6> <61e6> 5075 <61e7> <61e7> 11618 <61e8> <61e8> 11622 <61e9> <61e9> 12071 <61ea> <61ea> 12067 <61eb> <61eb> 12069 <61ed> <61ee> 12064 <61f0> <61f0> 12068 <61f1> <61f1> 12066 <61f2> <61f2> 5502 <61f5> <61f5> 5505 <61f6> <61f6> 5504 <61f7> <61f7> 5503 <61f8> <61f8> 5652 <61f9> <61f9> 12755 <61fa> <61fa> 5653 <61fb> <61fb> 12431 <61fc> <61fc> 5744 <61fd> <61fd> 13009 <61fe> <61fe> 5745 <61ff> <61ff> 5828 <6200> <6200> 5880 <6201> <6201> 13335 <6203> <6204> 13336 <6207> <6207> 13619 <6208> <6208> 721 <6209> <6209> 6056 <620a> <620a> 833 <620c> <620d> 977 <620e> <620e> 976 <6210> <6210> 979 <6211> <6211> 1186 <6212> <6212> 1185 <6214> <6214> 6545 <6215> <6215> 1489 <6216> <6216> 1488 <6219> <6219> 7328 <621a> <621b> 2711 endcidrange 100 begincidrange <621f> <621f> 3160 <6220> <6220> 9185 <6221> <6222> 3610 <6223> <6223> 9187 <6224> <6224> 9189 <6225> <6225> 9188 <6227> <6227> 9879 <6229> <6229> 9878 <622a> <622a> 4058 <622b> <622b> 9880 <622c> <622c> 17980 <622d> <622d> 10464 <622e> <622e> 4440 <6230> <6230> 4791 <6232> <6232> 5077 <6233> <6233> 5329 <6234> <6234> 5078 <6236> <6236> 722 <6237> <6237> 17690 <6239> <6239> 16322 <623a> <623a> 6285 <623d> <623d> 6546 <623e> <623e> 1491 <623f> <623f> 1490 <6240> <6240> 1492 <6241> <6241> 1839 <6242> <6243> 6892 <6246> <6246> 7329 <6247> <6247> 2242 <6248> <6248> 2713 <6249> <6249> 3161 <624a> <624a> 8523 <624b> <624b> 723 <624c> <624c> 17644 <624d> <624d> 657 <624e> <624e> 724 <6250> <6250> 6057 <6251> <6251> 837 <6252> <6252> 836 <6253> <6254> 834 <6258> <6258> 982 <6259> <6259> 6130 <625a> <625a> 6132 <625b> <625b> 981 <625c> <625c> 6124 <625e> <625e> 6125 <6260> <6260> 6131 <6261> <6261> 6127 <6262> <6262> 6129 <6263> <6263> 980 <6264> <6264> 6126 <6265> <6265> 6133 <6266> <6266> 6128 <6268> <6268> 16149 <626d> <626d> 1193 <626e> <626e> 1202 <626f> <626f> 1200 <6270> <6270> 6295 <6271> <6271> 6292 <6272> <6272> 6300 <6273> <6273> 1198 <6274> <6274> 6301 <6276> <6276> 1191 <6277> <6277> 6298 <6279> <6279> 1197 <627a> <627a> 6294 <627b> <627b> 6293 <627c> <627c> 1195 <627d> <627d> 6299 <627e> <627e> 1196 <627f> <627f> 1493 <6280> <6280> 1190 <6281> <6281> 6296 <6282> <6282> 16262 <6283> <6283> 6286 <6284> <6284> 1187 <6285> <6285> 16208 <6286> <6286> 1206 <6287> <6287> 6291 <6288> <6288> 6297 <6289> <6289> 1192 <628a> <628a> 1194 <628c> <628c> 6287 <628e> <628f> 6288 <6290> <6290> 17344 <6291> <6291> 1205 <6292> <6292> 1199 <6293> <6293> 1204 <6294> <6294> 6290 <6295> <6295> 1203 <6296> <6296> 1189 <6297> <6297> 1188 <6298> <6298> 1201 <629d> <629d> 16022 <62a4> <62a4> 14953 <62a6> <62a6> 16321 <62a8> <62a8> 1507 <62a9> <62a9> 6558 <62aa> <62aa> 6551 <62ab> <62ab> 1502 endcidrange 100 begincidrange <62ac> <62ac> 1521 <62ad> <62ad> 6547 <62ae> <62ae> 6554 <62af> <62af> 6556 <62b0> <62b0> 6559 <62b1> <62b1> 1516 <62b3> <62b3> 6555 <62b4> <62b4> 6548 <62b5> <62b5> 1514 <62b6> <62b6> 6552 <62b8> <62b8> 6560 <62b9> <62b9> 1499 <62bb> <62bb> 6557 <62bc> <62bc> 1509 <62bd> <62bd> 1508 <62be> <62be> 6550 <62bf> <62bf> 1497 <62c2> <62c2> 1498 <62c3> <62c3> 15759 <62c4> <62c4> 1496 <62c5> <62c5> 16778 <62c6> <62c6> 1520 <62c7> <62c7> 1512 <62c8> <62c8> 1506 <62c9> <62c9> 1494 <62ca> <62ca> 6553 <62cb> <62cb> 1505 <62cc> <62cc> 1495 <62cd> <62cd> 1513 <62ce> <62ce> 1522 <62cf> <62cf> 6894 <62d0> <62d0> 1510 <62d1> <62d1> 6549 <62d2> <62d2> 1500 <62d3> <62d4> 1503 <62d5> <62d5> 16780 <62d6> <62d7> 1518 <62d8> <62d8> 1517 <62d9> <62d9> 1511 <62da> <62da> 1515 <62db> <62db> 1501 <62dc> <62dc> 1840 <62df> <62df> 16412 <62e5> <62e5> 17981 <62eb> <62eb> 6900 <62ec> <62ec> 1852 <62ed> <62ed> 1844 <62ee> <62ee> 1846 <62ef> <62ef> 1851 <62f0> <62f0> 6912 <62f1> <62f1> 1849 <62f2> <62f2> 7330 <62f3> <62f3> 2243 <62f4> <62f4> 1854 <62f5> <62f5> 6897 <62f6> <62f6> 6905 <62f7> <62f7> 1850 <62f8> <62f8> 6904 <62f9> <62f9> 6901 <62fa> <62fa> 6909 <62fb> <62fb> 6911 <62fc> <62fc> 1843 <62fd> <62fd> 1847 <62fe> <62fe> 1853 <62ff> <62ff> 2245 <6300> <6300> 6906 <6301> <6301> 1845 <6302> <6302> 1856 <6303> <6303> 6899 <6307> <6307> 1848 <6308> <6308> 2244 <6309> <6309> 1842 <630b> <630b> 6896 <630c> <630c> 6903 <630d> <630d> 6895 <630e> <630e> 6898 <630f> <630f> 6902 <6310> <6310> 7331 <6311> <6311> 1855 <6313> <6314> 6907 <6315> <6315> 6910 <6316> <6316> 1841 <6318> <6318> 17345 <6328> <6328> 2259 <6329> <6329> 7343 <632a> <632b> 2257 <632c> <632c> 7333 <632d> <632d> 7349 <632e> <632e> 16093 <632f> <632f> 2248 <6331> <6331> 14949 <6332> <6332> 7917 <6333> <6333> 7351 <6334> <6334> 7345 <6335> <6335> 16150 <6336> <6336> 7336 <6337> <6337> 14947 <6338> <6338> 7354 <6339> <6339> 7339 <633a> <633a> 2254 endcidrange 100 begincidrange <633b> <633b> 7940 <633c> <633c> 7342 <633d> <633d> 2256 <633e> <633e> 2247 <6340> <6340> 7356 <6341> <6341> 7344 <6342> <6342> 2250 <6343> <6343> 7337 <6344> <6345> 7334 <6346> <6346> 2251 <6347> <6347> 7350 <6348> <6348> 7357 <6349> <6349> 2253 <634a> <634a> 7341 <634b> <634b> 7340 <634c> <634c> 2261 <634d> <634d> 2260 <634e> <634e> 2246 <634f> <634f> 2252 <6350> <6350> 2255 <6351> <6351> 7353 <6354> <6354> 7347 <6355> <6355> 2249 <6356> <6356> 7332 <6357> <6357> 7355 <6358> <6358> 7346 <6359> <6359> 7348 <635a> <635a> 7352 <6364> <6364> 16327 <6365> <6365> 7918 <6367> <6367> 2721 <6368> <6368> 2741 <6369> <6369> 2740 <636b> <636b> 2729 <636c> <636c> 16782 <636d> <636d> 7936 <636e> <636e> 7932 <636f> <636f> 7929 <6370> <6370> 7947 <6371> <6371> 2724 <6372> <6372> 2716 <6375> <6375> 7934 <6376> <6376> 3177 <6377> <6377> 2720 <6378> <6378> 7942 <6379> <6379> 17255 <637a> <637a> 2742 <637b> <637b> 2739 <637c> <637c> 7938 <637d> <637d> 7921 <637f> <637f> 16203 <6380> <6380> 2738 <6381> <6381> 7944 <6382> <6382> 7920 <6383> <6383> 2727 <6384> <6384> 2731 <6385> <6385> 7943 <6387> <6387> 7930 <6388> <6388> 2732 <6389> <6389> 2726 <638a> <638a> 7919 <638b> <638b> 16776 <638c> <638c> 3163 <638d> <638d> 7946 <638e> <638e> 7928 <638f> <638f> 2737 <6390> <6390> 7931 <6391> <6391> 7945 <6392> <6392> 2736 <6394> <6394> 8524 <6396> <6396> 2717 <6397> <6397> 7926 <6398> <6398> 2722 <6399> <6399> 2733 <639b> <639b> 2728 <639c> <639c> 7935 <639d> <639d> 7925 <639e> <639e> 7923 <639f> <639f> 7941 <63a0> <63a0> 2714 <63a1> <63a1> 2734 <63a2> <63a2> 2718 <63a3> <63a3> 3162 <63a4> <63a4> 7939 <63a5> <63a5> 2719 <63a7> <63a7> 2715 <63a8> <63a8> 2730 <63a9> <63a9> 2725 <63aa> <63aa> 2723 <63ab> <63ab> 7927 <63ac> <63ac> 2735 <63ad> <63ad> 7924 <63ae> <63ae> 7937 <63af> <63af> 7933 <63b0> <63b0> 8526 <63b1> <63b1> 8525 <63b9> <63b9> 16029 <63bd> <63bd> 7922 <63be> <63be> 8542 <63c0> <63c0> 3165 endcidrange 100 begincidrange <63c1> <63c1> 18088 <63c2> <63c2> 8548 <63c3> <63c3> 8531 <63c4> <63c4> 8545 <63c5> <63c5> 9190 <63c6> <63c6> 3168 <63c7> <63c7> 8549 <63c8> <63c8> 8552 <63c9> <63c9> 3167 <63ca> <63ca> 8534 <63cb> <63cb> 8551 <63cc> <63cc> 8550 <63cd> <63cd> 3169 <63ce> <63ce> 8527 <63cf> <63cf> 3164 <63d0> <63d0> 3172 <63d1> <63d1> 14950 <63d2> <63d2> 3170 <63d3> <63d3> 8547 <63d5> <63d5> 8537 <63d6> <63d6> 3174 <63d7> <63d7> 8554 <63d8> <63d8> 8546 <63d9> <63d9> 8555 <63da> <63da> 3182 <63db> <63db> 3180 <63dc> <63dc> 8544 <63dd> <63dd> 8543 <63de> <63de> 15968 <63df> <63df> 8541 <63e0> <63e0> 8535 <63e1> <63e1> 3173 <63e2> <63e2> 17985 <63e3> <63e3> 3171 <63e4> <63e4> 7338 <63e5> <63e5> 8528 <63e6> <63e6> 18591 <63e7> <63e7> 9220 <63e8> <63e8> 8529 <63e9> <63e9> 3166 <63ea> <63ea> 3179 <63eb> <63eb> 9192 <63ed> <63ee> 3175 <63ef> <63ef> 8530 <63f0> <63f0> 8553 <63f1> <63f1> 9191 <63f2> <63f2> 8538 <63f3> <63f3> 8533 <63f4> <63f4> 3178 <63f5> <63f5> 8539 <63f6> <63f6> 8536 <63f8> <63f8> 16786 <63f9> <63f9> 3183 <63fb> <63fb> 17986 <63fc> <63fc> 16028 <63fe> <63fe> 16030 <6406> <6406> 3626 <6407> <6407> 17987 <6409> <6409> 9195 <640a> <640a> 9214 <640b> <640b> 9219 <640c> <640c> 9207 <640d> <640d> 3622 <640e> <640e> 9224 <640f> <640f> 3619 <6410> <6410> 9193 <6412> <6412> 9194 <6413> <6413> 3612 <6414> <6414> 3621 <6415> <6415> 9201 <6416> <6417> 3624 <6418> <6418> 9202 <641a> <641a> 9215 <641b> <641b> 9221 <641c> <641c> 3620 <641e> <641e> 3614 <641f> <641f> 9200 <6420> <6420> 9196 <6421> <6421> 9223 <6422> <6423> 9205 <6424> <6424> 9197 <6425> <6425> 9217 <6426> <6426> 9208 <6427> <6427> 9218 <6428> <6428> 9210 <642a> <642a> 3615 <642b> <642b> 9881 <642c> <642c> 3618 <642d> <642d> 3616 <642e> <642e> 9222 <642f> <642f> 9213 <6430> <6430> 9209 <6432> <6432> 17881 <6433> <6433> 9198 <6434> <6434> 4068 <6435> <6435> 9212 <6436> <6436> 3623 <6437> <6437> 9204 <6438> <6438> 16785 <6439> <6439> 9203 endcidrange 100 begincidrange <643a> <643a> 16797 <643b> <643b> 14955 <643d> <643d> 3617 <643e> <643e> 3613 <643f> <643f> 9902 <6440> <6440> 9216 <6441> <6441> 9211 <6443> <6443> 9199 <644b> <644b> 9897 <644d> <644d> 9882 <644e> <644e> 9893 <6450> <6450> 9900 <6451> <6451> 4066 <6452> <6452> 3181 <6453> <6453> 9898 <6454> <6454> 4061 <6458> <6458> 4060 <6459> <6459> 9905 <645a> <645a> 17346 <645b> <645b> 9883 <645c> <645c> 9896 <645d> <645d> 9884 <645e> <645e> 9895 <645f> <645f> 4064 <6460> <6460> 9899 <6461> <6461> 8540 <6465> <6465> 9906 <6466> <6466> 9891 <6467> <6467> 4067 <6468> <6468> 10478 <6469> <6469> 4441 <646b> <646b> 9904 <646c> <646c> 9903 <646d> <646d> 4069 <646e> <646e> 10465 <646f> <646f> 4442 <6470> <6470> 10466 <6471> <6471> 14939 <6472> <6473> 9887 <6474> <6474> 9885 <6475> <6475> 9890 <6476> <6476> 9886 <6477> <6477> 9907 <6478> <6478> 4063 <6479> <6479> 4443 <647a> <647a> 4065 <647b> <647b> 4070 <647c> <647c> 17260 <647d> <647d> 9889 <647f> <647f> 9901 <6482> <6482> 9894 <6485> <6485> 10469 <6487> <6487> 4059 <6488> <6488> 4446 <6489> <6489> 11092 <648a> <648a> 10474 <648b> <648b> 10473 <648c> <648c> 10475 <648d> <648d> 17187 <648f> <648f> 10472 <6490> <6490> 4447 <6491> <6491> 17347 <6492> <6492> 4453 <6493> <6493> 4450 <6495> <6495> 4451 <6496> <6496> 10467 <6497> <6497> 10470 <6498> <6498> 10480 <6499> <6499> 4459 <649a> <649a> 4457 <649c> <649c> 10471 <649d> <649d> 8532 <649e> <649e> 4444 <649f> <649f> 10477 <64a0> <64a0> 10468 <64a2> <64a2> 4460 <64a3> <64a3> 10476 <64a4> <64a4> 4062 <64a5> <64a5> 4449 <64a6> <64a6> 9892 <64a9> <64a9> 4452 <64ab> <64ab> 4456 <64ac> <64ac> 4458 <64ad> <64ad> 4455 <64ae> <64ae> 4454 <64af> <64af> 17121 <64b0> <64b0> 4448 <64b1> <64b1> 10479 <64b2> <64b2> 4445 <64b3> <64b3> 4461 <64b4> <64b4> 17216 <64b6> <64b6> 14948 <64bb> <64bc> 4795 <64bd> <64bd> 11091 <64be> <64be> 4805 <64bf> <64bf> 4802 <64c0> <64c0> 17989 <64c1> <64c1> 4793 <64c2> <64c2> 4800 <64c3> <64c3> 11093 endcidrange 100 begincidrange <64c4> <64c4> 4798 <64c5> <64c5> 4792 <64c7> <64c7> 4799 <64c9> <64c9> 11090 <64ca> <64ca> 5080 <64cb> <64cb> 4794 <64cd> <64cd> 4801 <64ce> <64ce> 5079 <64cf> <64cf> 11089 <64d0> <64d0> 11088 <64d2> <64d2> 4803 <64d3> <64d3> 16131 <64d4> <64d4> 4804 <64d6> <64d6> 11087 <64d7> <64d7> 11086 <64d8> <64d8> 5081 <64d9> <64d9> 11096 <64da> <64da> 4797 <64db> <64db> 11094 <64dd> <64dd> 17182 <64e0> <64e0> 5082 <64e1> <64e1> 16793 <64e2> <64e2> 5087 <64e3> <64e3> 11626 <64e4> <64e4> 11628 <64e5> <64e5> 16794 <64e6> <64e6> 5084 <64e7> <64e7> 14248 <64e8> <64e8> 11629 <64e9> <64e9> 11625 <64ea> <64ea> 17226 <64eb> <64eb> 11627 <64ec> <64ec> 5085 <64ed> <64ed> 5088 <64ef> <64ef> 11624 <64f0> <64f0> 5083 <64f1> <64f1> 5086 <64f2> <64f2> 5331 <64f3> <64f3> 11095 <64f4> <64f4> 5330 <64f7> <64f7> 5336 <64f8> <64f8> 12075 <64fa> <64fb> 5334 <64fc> <64fc> 12078 <64fd> <64fd> 12074 <64fe> <64fe> 5332 <64ff> <64ff> 12072 <6500> <6500> 5506 <6501> <6501> 12076 <6503> <6503> 12077 <6504> <6504> 12073 <6506> <6506> 5333 <6507> <6507> 12432 <6509> <6509> 12435 <650a> <650a> 17718 <650c> <650c> 12436 <650d> <650d> 12434 <650e> <650e> 12437 <650f> <650f> 5507 <6510> <6510> 12433 <6511> <6511> 15017 <6513> <6513> 12759 <6514> <6514> 5655 <6515> <6515> 12758 <6516> <6516> 12757 <6517> <6517> 12756 <6518> <6518> 5654 <6519> <6519> 5656 <651b> <651b> 13010 <651c> <651c> 5747 <651d> <651d> 5746 <651e> <651e> 16775 <651f> <651f> 16064 <6520> <6520> 13186 <6521> <6521> 13185 <6522> <6522> 13188 <6523> <6523> 5881 <6524> <6524> 5829 <6525> <6525> 13339 <6526> <6526> 13187 <6529> <6529> 13338 <652a> <652a> 5883 <652b> <652b> 5882 <652c> <652c> 5921 <652d> <652d> 13444 <652e> <652e> 13514 <652f> <652f> 725 <6530> <6530> 15970 <6532> <6532> 8556 <6533> <6533> 11097 <6534> <6534> 556 <6535> <6535> 17645 <6536> <6536> 983 <6537> <6537> 6134 <6538> <6538> 1209 <6539> <6539> 1207 <653b> <653b> 1208 <653d> <653d> 6561 <653e> <653e> 1523 <653f> <653f> 1857 endcidrange 100 begincidrange <6541> <6541> 6913 <6543> <6543> 6914 <6545> <6545> 1858 <6546> <6546> 7359 <6548> <6549> 2262 <654a> <654a> 7358 <654d> <654d> 16799 <654f> <654f> 2749 <6551> <6551> 2745 <6553> <6553> 7948 <6554> <6554> 2752 <6555> <6555> 2751 <6556> <6556> 2744 <6557> <6557> 2747 <6558> <6558> 2750 <6559> <6559> 2746 <655c> <655c> 8560 <655d> <655d> 2743 <655e> <655e> 3184 <655f> <655f> 16805 <6562> <6563> 3186 <6564> <6564> 8559 <6565> <6565> 8562 <6566> <6566> 3185 <6567> <6567> 8557 <6568> <6568> 8561 <656a> <656a> 8558 <656b> <656b> 14956 <656c> <656c> 3627 <656d> <656d> 16804 <656f> <656f> 9225 <6572> <6572> 4071 <6573> <6573> 9908 <6574> <6574> 4806 <6575> <6575> 4462 <6576> <6576> 10481 <6577> <6578> 4463 <6579> <6579> 10483 <657a> <657a> 10482 <657b> <657b> 10484 <657c> <657c> 11099 <657f> <657f> 11098 <6580> <6580> 11631 <6581> <6581> 11630 <6582> <6583> 5089 <6584> <6584> 12438 <6585> <6585> 16803 <6586> <6586> 17992 <6587> <6587> 726 <6588> <6588> 16651 <6589> <6589> 17748 <658c> <658c> 8563 <6590> <6590> 3189 <6591> <6591> 3188 <6592> <6592> 9226 <6594> <6594> 12079 <6595> <6595> 5748 <6596> <6596> 13340 <6597> <6597> 727 <6599> <6599> 2264 <659b> <659b> 2754 <659c> <659c> 2753 <659d> <659e> 8564 <659f> <659f> 3628 <65a0> <65a0> 9909 <65a1> <65a1> 4072 <65a2> <65a2> 11100 <65a4> <65a4> 728 <65a5> <65a5> 838 <65a7> <65a7> 1524 <65a8> <65a8> 6562 <65aa> <65aa> 6915 <65ab> <65ab> 1859 <65ac> <65ac> 2755 <65ae> <65ae> 8566 <65af> <65af> 3190 <65b0> <65b0> 3629 <65b2> <65b3> 10485 <65b5> <65b5> 16807 <65b6> <65b6> 11632 <65b7> <65b7> 5337 <65b8> <65b8> 13515 <65b9> <65b9> 729 <65bb> <65bb> 6563 <65bc> <65bc> 1525 <65bd> <65bd> 1860 <65be> <65be> 15931 <65bf> <65bf> 6916 <65c1> <65c1> 2265 <65c2> <65c2> 7363 <65c3> <65c4> 7361 <65c5> <65c5> 2266 <65c6> <65c6> 7360 <65cb> <65cc> 2757 <65cd> <65cd> 7949 <65ce> <65ce> 2759 <65cf> <65cf> 2756 <65d0> <65d0> 8567 <65d1> <65d1> 16810 <65d2> <65d2> 8568 endcidrange 100 begincidrange <65d3> <65d3> 9227 <65d4> <65d4> 15272 <65d6> <65d6> 4074 <65d7> <65d7> 4073 <65da> <65da> 11633 <65db> <65db> 12080 <65dd> <65dd> 12440 <65de> <65de> 12439 <65df> <65df> 12760 <65e0> <65e0> 557 <65e1> <65e1> 6025 <65e2> <65e2> 1861 <65e3> <65e3> 16814 <65e5> <65e5> 730 <65e6> <65e6> 839 <65e8> <65e8> 985 <65e9> <65e9> 984 <65ec> <65ed> 986 <65ee> <65ee> 6136 <65ef> <65ef> 6135 <65f0> <65f0> 6302 <65f1> <65f1> 1210 <65f2> <65f2> 6305 <65f3> <65f3> 6304 <65f4> <65f4> 6303 <65f5> <65f5> 6306 <65fa> <65fa> 1526 <65fb> <65fb> 6569 <65fc> <65fc> 6565 <65fd> <65fd> 6574 <65ff> <65ff> 17994 <6600> <6600> 1533 <6602> <6602> 1531 <6603> <6603> 6570 <6604> <6604> 6566 <6605> <6605> 6573 <6606> <6606> 1530 <6607> <6607> 1537 <6608> <6608> 6568 <6609> <6609> 6564 <660a> <660a> 1536 <660b> <660b> 6571 <660c> <660c> 1529 <660d> <660d> 6572 <660e> <660e> 1532 <660f> <660f> 1534 <6610> <6610> 6576 <6611> <6611> 6575 <6612> <6612> 6567 <6613> <6613> 1528 <6614> <6614> 1527 <6615> <6615> 1535 <6618> <6618> 16817 <661c> <661c> 6921 <661d> <661d> 6927 <661e> <661e> 14995 <661f> <661f> 1867 <6620> <6620> 1864 <6621> <6621> 6918 <6622> <6622> 6923 <6623> <6623> 17045 <6624> <6624> 1870 <6625> <6625> 1862 <6626> <6626> 6922 <6627> <6627> 1865 <6628> <6628> 1868 <662b> <662b> 6925 <662d> <662d> 1863 <662e> <662e> 6930 <662f> <662f> 1866 <6630> <6630> 14989 <6631> <6631> 1869 <6632> <6632> 6919 <6633> <6633> 6924 <6634> <6634> 6928 <6635> <6635> 6920 <6636> <6636> 6917 <6639> <6639> 6929 <663a> <663a> 6926 <6641> <6641> 2274 <6642> <6642> 2267 <6643> <6643> 2270 <6644> <6644> 16820 <6645> <6645> 2273 <6647> <6647> 7366 <6648> <6648> 15769 <6649> <6649> 2268 <664a> <664a> 7364 <664b> <664b> 16823 <664c> <664c> 2272 <664f> <664f> 2269 <6651> <6651> 7367 <6652> <6652> 2271 <6653> <6653> 17995 <6657> <6657> 16539 <6659> <6659> 7953 <665a> <665a> 2761 <665b> <665b> 7952 <665c> <665c> 7954 <665d> <665d> 2760 endcidrange 100 begincidrange <665e> <665e> 2765 <665f> <665f> 7365 <6661> <6661> 7951 <6662> <6662> 7955 <6663> <6663> 14992 <6664> <6664> 2762 <6665> <6665> 7950 <6666> <6666> 2764 <6667> <6667> 16825 <6668> <6668> 2763 <666a> <666a> 8575 <666b> <666b> 14987 <666c> <666c> 8570 <666e> <666e> 3191 <666f> <666f> 3195 <6670> <6670> 3192 <6671> <6671> 8573 <6672> <6672> 8576 <6673> <6673> 16827 <6674> <6674> 3193 <6676> <6676> 3194 <6677> <6677> 3199 <6678> <6678> 9236 <6679> <6679> 8574 <667a> <667a> 3197 <667b> <667b> 8571 <667c> <667c> 8569 <667d> <667d> 18075 <667e> <667e> 3198 <6680> <6680> 8572 <6684> <6684> 3635 <6685> <6685> 16738 <6686> <6686> 9228 <6687> <6688> 3632 <6689> <6689> 3631 <668a> <668a> 9233 <668b> <668b> 9232 <668c> <668c> 9229 <668d> <668d> 3637 <668e> <668e> 14985 <6690> <6690> 9231 <6691> <6691> 3196 <6692> <6692> 17997 <6694> <6694> 9235 <6695> <6695> 9230 <6696> <6696> 3634 <6697> <6697> 3630 <6698> <6698> 3636 <6699> <6699> 9234 <669a> <669a> 15677 <669d> <669d> 4077 <669f> <669f> 9912 <66a0> <66a0> 9911 <66a1> <66a1> 9910 <66a2> <66a2> 4075 <66a4> <66a4> 16570 <66a8> <66a8> 4076 <66a9> <66a9> 10489 <66aa> <66aa> 10492 <66ab> <66ab> 4466 <66ad> <66ad> 18760 <66ae> <66ae> 4465 <66af> <66af> 10493 <66b0> <66b0> 10488 <66b1> <66b1> 4468 <66b2> <66b2> 10490 <66b3> <66b3> 16565 <66b4> <66b4> 4467 <66b5> <66b5> 10487 <66b6> <66b6> 15891 <66b7> <66b7> 10491 <66b8> <66b8> 4812 <66b9> <66b9> 4809 <66ba> <66ba> 11109 <66bb> <66bb> 11108 <66bd> <66bd> 11107 <66be> <66be> 11102 <66bf> <66bf> 15770 <66c0> <66c0> 11103 <66c4> <66c4> 4810 <66c6> <66c6> 4807 <66c7> <66c7> 4811 <66c8> <66c8> 11101 <66c9> <66c9> 4808 <66ca> <66cb> 11104 <66cc> <66cc> 11110 <66cd> <66cd> 16568 <66ce> <66ce> 14967 <66cf> <66cf> 11106 <66d2> <66d2> 11634 <66d6> <66d6> 5092 <66d8> <66d8> 12083 <66d9> <66d9> 5091 <66da> <66db> 12081 <66dc> <66dc> 5338 <66dd> <66dd> 5509 <66de> <66de> 12441 <66e0> <66e0> 5508 <66e3> <66e4> 12762 <66e6> <66e6> 5657 endcidrange 100 begincidrange <66e8> <66e8> 12761 <66e9> <66e9> 5749 <66eb> <66eb> 13341 <66ec> <66ec> 5884 <66ed> <66ee> 13445 <66f0> <66f0> 731 <66f1> <66f1> 16004 <66f2> <66f3> 988 <66f4> <66f4> 1211 <66f6> <66f6> 6577 <66f7> <66f7> 1871 <66f8> <66f8> 2275 <66f9> <66f9> 2766 <66fc> <66fc> 2591 <66fe> <66ff> 3200 <6700> <6700> 3056 <6701> <6701> 8577 <6702> <6702> 16836 <6703> <6703> 3638 <6704> <6704> 9914 <6705> <6705> 9913 <6708> <6708> 732 <6709> <6709> 990 <670a> <670a> 6578 <670b> <670b> 1539 <670c> <670c> 16354 <670d> <670d> 1538 <670e> <670e> 15777 <670f> <6710> 6931 <6712> <6713> 7368 <6714> <6715> 2276 <6716> <6716> 17999 <6717> <6717> 2278 <6718> <6718> 7956 <671b> <671b> 2768 <671d> <671d> 3203 <671e> <671e> 15755 <671f> <671f> 3202 <6720> <6720> 9237 <6721> <6721> 9506 <6722> <6722> 9915 <6723> <6723> 11111 <6725> <6725> 14239 <6726> <6726> 5339 <6727> <6727> 5658 <6728> <6728> 733 <672a> <672b> 842 <672c> <672c> 841 <672d> <672d> 844 <672e> <672e> 840 <6731> <6731> 993 <6733> <6733> 6144 <6734> <6734> 992 <6735> <6735> 994 <6736> <6736> 15937 <6738> <6738> 6139 <6739> <6739> 6138 <673a> <673a> 6141 <673b> <673b> 6140 <673c> <673c> 6143 <673d> <673d> 991 <673e> <673e> 6137 <673f> <673f> 6142 <6744> <6744> 16411 <6745> <6745> 6307 <6746> <6746> 1221 <6747> <6747> 6308 <6748> <6748> 6312 <6749> <6749> 1220 <674b> <674b> 6316 <674c> <674c> 6311 <674d> <674d> 6314 <674e> <6751> 1213 <6753> <6753> 1223 <6755> <6755> 6310 <6756> <6756> 1218 <6757> <6757> 1224 <6759> <6759> 6309 <675a> <675a> 6315 <675c> <675c> 1217 <675d> <675d> 6313 <675e> <675e> 1219 <675f> <675f> 1212 <6760> <6760> 1222 <6761> <6761> 15718 <6762> <6762> 16843 <6767> <6767> 16842 <676a> <676a> 1560 <676c> <676c> 6580 <676d> <676d> 1540 <676f> <6770> 1550 <6771> <6771> 1543 <6772> <6772> 1561 <6773> <6773> 1545 <6774> <6774> 6588 <6775> <6775> 1556 <6776> <6776> 6583 <6777> <6777> 1546 <6778> <6779> 6598 <677a> <677a> 6591 endcidrange 100 begincidrange <677b> <677b> 6584 <677c> <677c> 1559 <677d> <677d> 6596 <677e> <677e> 1554 <677f> <677f> 1552 <6781> <6781> 6597 <6783> <6783> 6595 <6784> <6784> 6587 <6785> <6785> 6579 <6786> <6786> 6586 <6787> <6787> 1547 <6789> <6789> 1553 <678b> <678b> 1541 <678c> <678c> 6590 <678d> <678d> 6589 <678e> <678e> 6581 <678f> <678f> 18113 <6790> <6790> 1555 <6791> <6791> 6593 <6792> <6792> 6582 <6793> <6793> 1558 <6794> <6794> 6600 <6795> <6795> 1542 <6797> <6797> 1549 <6798> <6798> 6585 <6799> <6799> 6594 <679a> <679a> 1557 <679c> <679c> 1544 <679d> <679d> 1548 <679f> <679f> 6592 <67a0> <67a0> 15738 <67a4> <67a4> 18001 <67ac> <67ac> 16867 <67ae> <67ae> 6964 <67af> <67af> 1879 <67b0> <67b0> 1892 <67b1> <67b1> 16884 <67b2> <67b2> 6959 <67b3> <67b3> 6949 <67b4> <67b4> 1885 <67b5> <67b5> 6947 <67b6> <67b6> 1878 <67b7> <67b7> 6942 <67b8> <67b8> 1888 <67b9> <67b9> 6955 <67ba> <67ba> 6936 <67bb> <67bb> 6938 <67bf> <67bf> 14330 <67c0> <67c0> 6941 <67c1> <67c1> 6933 <67c2> <67c2> 6954 <67c3> <67c3> 6970 <67c4> <67c4> 1883 <67c5> <67c5> 6943 <67c6> <67c6> 6961 <67c8> <67c8> 6935 <67c9> <67ca> 6968 <67cb> <67cb> 6972 <67cc> <67cc> 6963 <67cd> <67cd> 6948 <67ce> <67ce> 6956 <67cf> <67cf> 1889 <67d0> <67d0> 1876 <67d1> <67d1> 1884 <67d2> <67d2> 1896 <67d3> <67d3> 1873 <67d4> <67d4> 1875 <67d6> <67d6> 15192 <67d7> <67d7> 16846 <67d8> <67d8> 6940 <67d9> <67d9> 1893 <67da> <67da> 1886 <67db> <67db> 6966 <67dc> <67dc> 6937 <67dd> <67dd> 1895 <67de> <67de> 1890 <67df> <67df> 6946 <67e2> <67e2> 1894 <67e3> <67e3> 6953 <67e4> <67e4> 6945 <67e5> <67e5> 1887 <67e6> <67e6> 6965 <67e7> <67e7> 6957 <67e9> <67e9> 1881 <67ea> <67ea> 6971 <67eb> <67eb> 6944 <67ec> <67ec> 1877 <67ed> <67ed> 6962 <67ee> <67ee> 6952 <67ef> <67ef> 1882 <67f0> <67f0> 6958 <67f1> <67f1> 1874 <67f2> <67f2> 6934 <67f3> <67f3> 1891 <67f4> <67f4> 2293 <67f5> <67f5> 1880 <67f6> <67f6> 6951 <67f7> <67f7> 6950 <67f8> <67f8> 6939 <67f9> <67f9> 14742 endcidrange 100 begincidrange <67fa> <67fa> 6967 <67fc> <67fc> 6960 <67fe> <67fe> 17749 <67ff> <67ff> 1872 <6800> <6800> 17351 <6801> <6801> 16851 <6802> <6802> 16328 <6803> <6803> 15722 <6804> <6804> 17750 <680d> <680d> 17025 <6810> <6810> 14748 <6812> <6812> 7389 <6813> <6813> 2300 <6814> <6814> 7390 <6816> <6816> 7378 <6817> <6817> 2289 <6818> <6818> 2301 <681a> <681a> 7371 <681b> <681b> 16498 <681c> <681c> 7380 <681d> <681d> 7388 <681e> <681e> 18114 <681f> <681f> 7370 <6820> <6820> 7397 <6821> <6821> 2279 <6822> <6822> 16848 <6825> <6825> 7396 <6826> <6826> 7391 <6828> <6828> 7392 <6829> <6829> 2287 <682a> <682a> 2298 <682b> <682b> 7382 <682d> <682d> 7383 <682e> <682e> 7393 <682f> <682f> 7384 <6831> <6831> 7379 <6832> <6833> 7373 <6834> <6834> 7387 <6835> <6835> 7381 <6836> <6836> 15918 <6837> <6837> 16925 <6838> <6838> 2280 <6839> <6839> 2284 <683a> <683a> 7395 <683b> <683b> 7375 <683c> <683c> 2296 <683d> <683d> 2292 <683e> <683e> 16711 <6840> <6840> 2295 <6841> <6841> 2302 <6842> <6842> 2285 <6843> <6843> 2297 <6844> <6844> 7386 <6845> <6845> 2299 <6846> <6846> 2282 <6847> <6847> 15339 <6848> <6848> 2281 <6849> <6849> 7372 <684a> <684a> 18003 <684b> <684b> 7376 <684c> <684c> 2290 <684d> <684d> 7394 <684e> <684e> 7385 <684f> <684f> 7377 <6850> <6850> 2294 <6851> <6851> 2291 <6853> <6853> 2283 <6854> <6854> 2286 <6855> <6855> 15760 <6856> <6856> 14356 <685d> <685d> 16854 <6865> <6865> 17751 <686b> <686b> 7977 <686d> <686e> 7961 <686f> <686f> 7966 <6871> <6871> 7981 <6872> <6872> 7978 <6874> <6874> 7971 <6875> <6875> 7970 <6876> <6876> 2775 <6877> <6877> 7974 <6878> <6878> 7989 <6879> <6879> 7957 <687b> <687b> 7990 <687c> <687c> 7976 <687d> <687d> 7994 <687e> <687e> 7982 <687f> <687f> 2774 <6880> <6880> 7980 <6881> <6881> 2769 <6882> <6882> 2790 <6883> <6883> 2780 <6884> <6884> 18004 <6885> <6885> 2784 <6886> <6886> 2783 <6887> <6887> 7958 <6888> <6888> 18103 <6889> <6889> 7987 <688a> <688a> 7993 <688b> <688b> 7985 endcidrange 100 begincidrange <688c> <688c> 7992 <688f> <688f> 7973 <6890> <6890> 7959 <6891> <6891> 7991 <6892> <6892> 7975 <6893> <6893> 2772 <6894> <6894> 2785 <6896> <6896> 7984 <6897> <6897> 2778 <6898> <6898> 15018 <689b> <689b> 7983 <689c> <689c> 7960 <689d> <689d> 2786 <689f> <689f> 2788 <68a0> <68a0> 7986 <68a1> <68a1> 2789 <68a2> <68a2> 2771 <68a3> <68a3> 7967 <68a4> <68a4> 7988 <68a6> <68a6> 16612 <68a7> <68a7> 2777 <68a8> <68a8> 2787 <68a9> <68a9> 7969 <68aa> <68aa> 7979 <68ab> <68ab> 7964 <68ac> <68ac> 7968 <68ad> <68ad> 2782 <68ae> <68ae> 7963 <68af> <68af> 2770 <68b0> <68b0> 2779 <68b1> <68b1> 2776 <68b2> <68b2> 7972 <68b3> <68b3> 2288 <68b4> <68b4> 8600 <68b5> <68b5> 2773 <68b6> <68b6> 15006 <68b9> <68b9> 15636 <68bd> <68bd> 17020 <68c3> <68c3> 16860 <68c4> <68c4> 2781 <68c5> <68c5> 15406 <68c6> <68c6> 8603 <68c7> <68c7> 8625 <68c8> <68c8> 8614 <68c9> <68c9> 3223 <68ca> <68ca> 17131 <68cb> <68cb> 3218 <68cc> <68cc> 8597 <68cd> <68cd> 3219 <68ce> <68ce> 8613 <68d0> <68d0> 8606 <68d1> <68d1> 8619 <68d2> <68d2> 3215 <68d3> <68d3> 8579 <68d4> <68d4> 8621 <68d5> <68d5> 3205 <68d6> <68d6> 8587 <68d7> <68d7> 3208 <68d8> <68d8> 3207 <68da> <68da> 3224 <68dc> <68dc> 8581 <68dd> <68de> 8615 <68df> <68df> 3210 <68e0> <68e0> 3206 <68e1> <68e1> 8595 <68e3> <68e3> 3217 <68e4> <68e4> 8590 <68e6> <68e6> 8617 <68e7> <68e7> 3213 <68e8> <68e8> 8609 <68e9> <68e9> 8622 <68ea> <68ea> 8584 <68eb> <68eb> 8589 <68ec> <68ec> 8583 <68ee> <68ee> 3212 <68ef> <68ef> 8602 <68f0> <68f0> 9259 <68f1> <68f1> 8585 <68f2> <68f2> 3216 <68f3> <68f3> 8594 <68f4> <68f4> 8618 <68f5> <68f5> 3211 <68f6> <68f6> 8591 <68f7> <68f7> 8588 <68f8> <68f8> 8605 <68f9> <68f9> 3214 <68fa> <68fa> 3204 <68fb> <68fb> 3226 <68fc> <68fc> 8608 <68fd> <68fd> 8607 <6900> <6900> 16863 <6901> <6901> 16862 <6902> <6902> 17147 <6903> <6903> 17052 <6904> <6904> 8580 <6905> <6905> 3209 <6906> <6906> 8620 <6907> <6907> 8596 <6908> <6908> 8598 <6909> <6909> 18008 endcidrange 100 begincidrange <690a> <690a> 8611 <690b> <690b> 8610 <690c> <690c> 8578 <690d> <690d> 3220 <690e> <690e> 3222 <690f> <690f> 8586 <6910> <6910> 8593 <6911> <6911> 8601 <6912> <6912> 3221 <6913> <6913> 8592 <6914> <6914> 8604 <6915> <6915> 8623 <6917> <6917> 8612 <6918> <6918> 15778 <691a> <691a> 15744 <691b> <691b> 14269 <6925> <6925> 8624 <692a> <692a> 8582 <692c> <692c> 16184 <692f> <692f> 9279 <6930> <6930> 3646 <6932> <6932> 9277 <6933> <6933> 9256 <6934> <6934> 9261 <6935> <6935> 9254 <6936> <6936> 16871 <6937> <6937> 9273 <6938> <6938> 9240 <6939> <6939> 9247 <693b> <693b> 9271 <693c> <693c> 9281 <693d> <693d> 9257 <693e> <693e> 16470 <693f> <693f> 9244 <6940> <6940> 9263 <6941> <6941> 9268 <6942> <6942> 9248 <6943> <6943> 18009 <6944> <6944> 9265 <6945> <6945> 9245 <6946> <6946> 17775 <6948> <6949> 9252 <694a> <694a> 3648 <694b> <694b> 9272 <694c> <694c> 9270 <694e> <694e> 9241 <694f> <694f> 9275 <6951> <6951> 9276 <6952> <6952> 9278 <6953> <6953> 3652 <6954> <6954> 3644 <6955> <6955> 15750 <6956> <6956> 7965 <6957> <6957> 9249 <6958> <6958> 9267 <6959> <6959> 9250 <695a> <695a> 3641 <695b> <695b> 3657 <695c> <695c> 9274 <695d> <695d> 3655 <695e> <695e> 3651 <695f> <695f> 9239 <6960> <6960> 3643 <6961> <6961> 16868 <6962> <6962> 9242 <6963> <6963> 3656 <6964> <6964> 18011 <6965> <6965> 9258 <6966> <6966> 9238 <6967> <6967> 15637 <6968> <6968> 3649 <6969> <6969> 9262 <696a> <696a> 9246 <696b> <696b> 3650 <696c> <696c> 9255 <696d> <696d> 3640 <696e> <696e> 3225 <696f> <696f> 9264 <6970> <6970> 8599 <6971> <6971> 9243 <6972> <6972> 14957 <6973> <6973> 16859 <6974> <6974> 9269 <6975> <6975> 3645 <6976> <6976> 9266 <6977> <6977> 3642 <6978> <6978> 9260 <6979> <6979> 3653 <697a> <697a> 9251 <697b> <697b> 9280 <6980> <6980> 16190 <6982> <6982> 3647 <6983> <6983> 9391 <6985> <6985> 18013 <6986> <6986> 3654 <698a> <698a> 15732 <698d> <698d> 9929 <698e> <698e> 9927 <6990> <6990> 9949 <6991> <6991> 9925 endcidrange 100 begincidrange <6993> <6993> 9943 <6994> <6994> 3639 <6995> <6995> 4080 <6996> <6996> 9921 <6997> <6997> 9948 <6998> <6998> 16872 <6999> <6999> 9926 <699a> <699a> 9940 <699b> <699b> 4085 <699c> <699c> 4078 <699e> <699e> 9946 <699f> <699f> 18012 <69a0> <69a0> 9919 <69a1> <69a1> 9945 <69a2> <69a2> 14128 <69a3> <69a3> 4096 <69a4> <69a4> 9936 <69a5> <69a5> 9952 <69a6> <69a6> 4094 <69a7> <69a7> 9928 <69a8> <69a8> 4079 <69a9> <69a9> 9930 <69aa> <69aa> 9944 <69ab> <69ab> 4088 <69ac> <69ac> 9923 <69ad> <69ad> 4092 <69ae> <69ae> 4082 <69af> <69af> 9932 <69b0> <69b0> 9922 <69b1> <69b1> 9916 <69b2> <69b2> 16374 <69b3> <69b3> 9942 <69b4> <69b4> 4089 <69b5> <69b5> 9951 <69b6> <69b6> 9917 <69b7> <69b7> 4086 <69b9> <69b9> 9938 <69bb> <69bb> 4087 <69bc> <69bc> 9924 <69bd> <69bd> 9935 <69be> <69be> 9931 <69bf> <69bf> 9933 <69c0> <69c0> 16221 <69c1> <69c1> 4081 <69c2> <69c2> 9950 <69c3> <69c3> 4095 <69c4> <69c4> 9934 <69c6> <69c6> 9953 <69c9> <69c9> 9918 <69ca> <69ca> 9939 <69cb> <69cb> 4084 <69cc> <69cc> 4093 <69cd> <69cd> 4091 <69ce> <69ce> 9920 <69cf> <69cf> 9941 <69d0> <69d0> 4090 <69d1> <69d1> 14831 <69d3> <69d3> 4083 <69d4> <69d4> 9937 <69d5> <69d5> 15932 <69d6> <69d6> 18014 <69d9> <69d9> 9947 <69e1> <69e1> 16856 <69e2> <69e2> 10505 <69e4> <69e4> 10501 <69e5> <69e5> 10497 <69e6> <69e6> 10517 <69e7> <69e7> 10514 <69e8> <69e8> 4471 <69e9> <69e9> 15761 <69eb> <69eb> 10521 <69ec> <69ec> 10504 <69ed> <69ed> 4482 <69ee> <69ee> 10511 <69f1> <69f1> 10500 <69f2> <69f2> 10510 <69f3> <69f3> 4479 <69f4> <69f4> 10530 <69f6> <69f6> 10527 <69f7> <69f7> 10513 <69f8> <69f8> 10498 <69f9> <69f9> 16877 <69fa> <69fa> 16839 <69fb> <69fb> 10518 <69fc> <69fc> 10520 <69fd> <69fd> 4475 <69fe> <69fe> 10508 <69ff> <69ff> 10503 <6a00> <6a00> 10494 <6a01> <6a01> 4472 <6a02> <6a02> 4480 <6a03> <6a03> 15913 <6a04> <6a04> 10523 <6a05> <6a05> 4481 <6a06> <6a06> 10495 <6a07> <6a07> 10529 <6a08> <6a08> 10516 <6a09> <6a09> 10522 <6a0a> <6a0a> 4478 <6a0b> <6a0b> 16857 endcidrange 100 begincidrange <6a0c> <6a0c> 15696 <6a0d> <6a0d> 10519 <6a0f> <6a0f> 10526 <6a11> <6a11> 4483 <6a13> <6a13> 4477 <6a14> <6a14> 10512 <6a15> <6a15> 10499 <6a16> <6a16> 10531 <6a17> <6a17> 10496 <6a18> <6a18> 10524 <6a19> <6a19> 4474 <6a1a> <6a1a> 15646 <6a1b> <6a1b> 10506 <6a1c> <6a1c> 15208 <6a1d> <6a1d> 10507 <6a1e> <6a1e> 4473 <6a1f> <6a1f> 4470 <6a20> <6a20> 10502 <6a21> <6a21> 4476 <6a23> <6a23> 4469 <6a25> <6a25> 10525 <6a26> <6a26> 10528 <6a27> <6a27> 10509 <6a28> <6a28> 11124 <6a2b> <6a2b> 15682 <6a2c> <6a2c> 17067 <6a2d> <6a2d> 15135 <6a32> <6a32> 11116 <6a33> <6a33> 15012 <6a34> <6a34> 11112 <6a35> <6a35> 4825 <6a38> <6a38> 4814 <6a39> <6a39> 4819 <6a3a> <6a3a> 4815 <6a3b> <6a3b> 11126 <6a3c> <6a3c> 11137 <6a3d> <6a3d> 4813 <6a3e> <6a3e> 11118 <6a3f> <6a3f> 11127 <6a40> <6a40> 10515 <6a41> <6a41> 11128 <6a44> <6a44> 4820 <6a45> <6a45> 16880 <6a46> <6a46> 11143 <6a47> <6a47> 4824 <6a48> <6a48> 4827 <6a49> <6a49> 11114 <6a4b> <6a4b> 4823 <6a4c> <6a4c> 15019 <6a4d> <6a4e> 11141 <6a4f> <6a4f> 11132 <6a50> <6a50> 11131 <6a51> <6a51> 11123 <6a52> <6a52> 15013 <6a53> <6a53> 14252 <6a54> <6a54> 11133 <6a55> <6a55> 11140 <6a56> <6a56> 11139 <6a57> <6a57> 14298 <6a58> <6a58> 4818 <6a59> <6a59> 4816 <6a5a> <6a5a> 11125 <6a5b> <6a5b> 11122 <6a5d> <6a5d> 11119 <6a5e> <6a5e> 11138 <6a5f> <6a5f> 4826 <6a60> <6a60> 11136 <6a61> <6a61> 4822 <6a62> <6a62> 4821 <6a64> <6a64> 11130 <6a65> <6a65> 18016 <6a66> <6a66> 11113 <6a67> <6a67> 11115 <6a68> <6a68> 11117 <6a69> <6a69> 11135 <6a6a> <6a6a> 11129 <6a6b> <6a6b> 4817 <6a6d> <6a6d> 11120 <6a6f> <6a6f> 11134 <6a71> <6a71> 18018 <6a74> <6a74> 18017 <6a76> <6a76> 11121 <6a7a> <6a7a> 15021 <6a7e> <6a7e> 5100 <6a7f> <6a7f> 11652 <6a80> <6a80> 5093 <6a81> <6a81> 11637 <6a82> <6a82> 18019 <6a83> <6a83> 11648 <6a84> <6a84> 5095 <6a85> <6a85> 11655 <6a87> <6a87> 11644 <6a89> <6a89> 11639 <6a8a> <6a8a> 16694 <6a8c> <6a8c> 11656 <6a8d> <6a8d> 11635 <6a8e> <6a8e> 11646 <6a8f> <6a8f> 15387 <6a90> <6a90> 5102 <6a91> <6a91> 11651 endcidrange 100 begincidrange <6a92> <6a92> 11657 <6a93> <6a93> 11645 <6a94> <6a94> 5094 <6a95> <6a95> 11647 <6a96> <6a96> 11636 <6a97> <6a97> 5101 <6a99> <6a99> 18021 <6a9a> <6a9a> 11654 <6a9b> <6a9b> 11641 <6a9c> <6a9c> 5097 <6a9d> <6a9d> 16882 <6a9e> <6a9e> 11643 <6a9f> <6a9f> 11640 <6aa0> <6aa0> 5103 <6aa1> <6aa1> 11642 <6aa2> <6aa2> 5096 <6aa3> <6aa3> 5099 <6aa4> <6aa4> 11650 <6aa5> <6aa5> 11638 <6aa6> <6aa6> 11653 <6aa7> <6aa7> 14307 <6aa8> <6aa8> 11649 <6aab> <6aab> 18023 <6aac> <6aac> 5341 <6aad> <6aad> 12094 <6aae> <6aaf> 5346 <6ab1> <6ab1> 15955 <6ab2> <6ab2> 15179 <6ab3> <6ab3> 5340 <6ab4> <6ab4> 12093 <6ab5> <6ab5> 18024 <6ab6> <6ab7> 12090 <6ab8> <6ab8> 5344 <6ab9> <6ab9> 12085 <6aba> <6aba> 12089 <6abb> <6abb> 5343 <6abd> <6abd> 12086 <6abe> <6abe> 15009 <6ac2> <6ac2> 5345 <6ac3> <6ac3> 5342 <6ac5> <6ac5> 12084 <6ac6> <6ac6> 12088 <6ac7> <6ac7> 12092 <6ac8> <6ac8> 16885 <6ac9> <6ac9> 15014 <6aca> <6aca> 16204 <6acb> <6acb> 12447 <6acc> <6acc> 12444 <6acd> <6acd> 12453 <6acf> <6acf> 12452 <6ad0> <6ad0> 12450 <6ad1> <6ad1> 12445 <6ad3> <6ad3> 5513 <6ad4> <6ad4> 18025 <6ad8> <6ad8> 15530 <6ad9> <6ad9> 12446 <6ada> <6ada> 5512 <6adb> <6adb> 5098 <6adc> <6adc> 12449 <6add> <6add> 5511 <6ade> <6ade> 12454 <6adf> <6adf> 12448 <6ae0> <6ae0> 12443 <6ae1> <6ae1> 12087 <6ae5> <6ae5> 5510 <6ae7> <6ae7> 12442 <6ae8> <6ae8> 12767 <6aea> <6aea> 12766 <6aeb> <6aeb> 12451 <6aec> <6aec> 5659 <6aee> <6aef> 12770 <6af0> <6af0> 12765 <6af1> <6af1> 12769 <6af3> <6af3> 12764 <6af6> <6af6> 18026 <6af8> <6af8> 13014 <6af9> <6af9> 12768 <6afa> <6afa> 5752 <6afb> <6afb> 5750 <6afc> <6afc> 13012 <6b00> <6b00> 13015 <6b02> <6b02> 13011 <6b03> <6b03> 13013 <6b04> <6b04> 5751 <6b05> <6b05> 15015 <6b08> <6b09> 13190 <6b0a> <6b0a> 5830 <6b0b> <6b0b> 13189 <6b0f> <6b0f> 13344 <6b10> <6b10> 5885 <6b11> <6b12> 13342 <6b13> <6b13> 13447 <6b16> <6b16> 5955 <6b17> <6b17> 13518 <6b18> <6b19> 13516 <6b1a> <6b1a> 13519 <6b1d> <6b1d> 16888 <6b1e> <6b1e> 13620 <6b20> <6b20> 734 <6b21> <6b21> 995 endcidrange 100 begincidrange <6b23> <6b23> 1562 <6b25> <6b25> 6601 <6b28> <6b28> 6973 <6b2c> <6b2c> 7398 <6b2d> <6b2d> 7400 <6b2f> <6b2f> 7399 <6b31> <6b31> 7401 <6b32> <6b32> 2791 <6b33> <6b33> 7996 <6b34> <6b34> 7402 <6b35> <6b35> 16891 <6b36> <6b36> 7995 <6b37> <6b38> 7997 <6b39> <6b39> 8626 <6b3a> <6b3a> 3228 <6b3b> <6b3b> 8627 <6b3c> <6b3c> 8629 <6b3d> <6b3d> 3229 <6b3e> <6b3e> 3227 <6b3f> <6b3f> 8628 <6b41> <6b41> 9287 <6b42> <6b42> 9285 <6b43> <6b43> 9284 <6b45> <6b45> 9283 <6b46> <6b46> 9282 <6b47> <6b47> 3658 <6b48> <6b48> 9286 <6b49> <6b49> 4097 <6b4a> <6b4a> 9954 <6b4b> <6b4b> 9956 <6b4c> <6b4c> 4098 <6b4d> <6b4d> 9955 <6b4e> <6b4e> 4485 <6b50> <6b50> 4484 <6b51> <6b51> 10532 <6b52> <6b52> 16238 <6b54> <6b54> 11145 <6b55> <6b55> 11144 <6b56> <6b56> 11146 <6b57> <6b57> 15022 <6b59> <6b59> 4828 <6b5b> <6b5b> 11658 <6b5c> <6b5c> 5104 <6b5e> <6b5e> 12095 <6b5f> <6b5f> 5348 <6b60> <6b60> 12455 <6b61> <6b61> 5831 <6b62> <6b62> 735 <6b63> <6b63> 845 <6b64> <6b64> 996 <6b65> <6b65> 1225 <6b66> <6b67> 1563 <6b6a> <6b6a> 1897 <6b6d> <6b6d> 7403 <6b6f> <6b6f> 17685 <6b72> <6b72> 3659 <6b74> <6b74> 16892 <6b76> <6b76> 10658 <6b77> <6b77> 4829 <6b78> <6b78> 5349 <6b79> <6b79> 736 <6b7a> <6b7a> 17646 <6b7b> <6b7b> 997 <6b7e> <6b7e> 6603 <6b7f> <6b7f> 1565 <6b80> <6b80> 6602 <6b81> <6b81> 18027 <6b82> <6b82> 6974 <6b83> <6b83> 1898 <6b84> <6b84> 6975 <6b86> <6b86> 1899 <6b88> <6b88> 7405 <6b89> <6b89> 2304 <6b8a> <6b8a> 2303 <6b8c> <6b8c> 8003 <6b8d> <6b8e> 8001 <6b8f> <6b8f> 8000 <6b91> <6b91> 7999 <6b94> <6b94> 8630 <6b95> <6b95> 8633 <6b96> <6b96> 3231 <6b97> <6b97> 8631 <6b98> <6b98> 3230 <6b99> <6b99> 8632 <6b9b> <6b9b> 9288 <6b9e> <6ba0> 9957 <6ba2> <6ba2> 10535 <6ba3> <6ba3> 10534 <6ba4> <6ba4> 4486 <6ba5> <6ba5> 10533 <6ba6> <6ba6> 10536 <6ba7> <6ba7> 11147 <6baa> <6bab> 11148 <6bad> <6bad> 11659 <6bae> <6bae> 5105 <6baf> <6baf> 5350 <6bb0> <6bb0> 12456 <6bb2> <6bb2> 5753 <6bb3> <6bb3> 6026 <6bb5> <6bb5> 1900 endcidrange 100 begincidrange <6bb6> <6bb6> 6976 <6bb7> <6bb7> 2305 <6bba> <6bba> 2792 <6bbc> <6bbc> 3232 <6bbd> <6bbd> 8634 <6bbf> <6bbf> 3661 <6bc0> <6bc0> 3660 <6bc1> <6bc1> 18028 <6bc3> <6bc4> 9960 <6bc5> <6bc6> 4487 <6bc7> <6bc7> 11151 <6bc8> <6bc8> 11150 <6bc9> <6bc9> 12096 <6bca> <6bca> 13345 <6bcb> <6bcb> 737 <6bcc> <6bcc> 6027 <6bcd> <6bcd> 846 <6bcf> <6bcf> 1226 <6bd0> <6bd0> 6317 <6bd2> <6bd2> 1901 <6bd3> <6bd3> 3662 <6bd4> <6bd4> 738 <6bd6> <6bd6> 6977 <6bd7> <6bd7> 1902 <6bd8> <6bd8> 6978 <6bda> <6bda> 5106 <6bdb> <6bdb> 739 <6bdc> <6bdc> 16903 <6bde> <6bde> 6604 <6be0> <6be0> 6979 <6be1> <6be1> 16901 <6be2> <6be2> 7410 <6be3> <6be3> 7409 <6be4> <6be4> 7407 <6be6> <6be6> 7406 <6be7> <6be7> 7411 <6be8> <6be8> 7408 <6bea> <6bea> 18029 <6beb> <6bec> 2793 <6bef> <6bef> 3233 <6bf0> <6bf0> 8635 <6bf2> <6bf3> 8636 <6bf7> <6bf8> 9292 <6bf9> <6bf9> 9291 <6bfa> <6bfa> 16249 <6bfb> <6bfc> 9289 <6bfd> <6bfd> 3663 <6bfe> <6bfe> 9962 <6bff> <6bff> 10539 <6c00> <6c00> 10538 <6c01> <6c01> 10537 <6c02> <6c02> 10540 <6c03> <6c03> 11153 <6c04> <6c04> 11152 <6c05> <6c05> 4830 <6c06> <6c06> 11154 <6c08> <6c08> 5107 <6c09> <6c09> 11660 <6c0b> <6c0b> 12097 <6c0c> <6c0c> 12457 <6c0d> <6c0d> 13192 <6c0f> <6c0f> 740 <6c10> <6c10> 848 <6c11> <6c11> 847 <6c13> <6c13> 1566 <6c14> <6c14> 6028 <6c15> <6c15> 6058 <6c16> <6c16> 998 <6c18> <6c18> 6145 <6c19> <6c1a> 6318 <6c1b> <6c1b> 1567 <6c1c> <6c1c> 14507 <6c1d> <6c1d> 6605 <6c1f> <6c1f> 1903 <6c20> <6c21> 6980 <6c23> <6c23> 2306 <6c24> <6c24> 2310 <6c25> <6c25> 7412 <6c26> <6c26> 2309 <6c27> <6c28> 2307 <6c2a> <6c2a> 8004 <6c2b> <6c2b> 2795 <6c2c> <6c2c> 3236 <6c2e> <6c2f> 3234 <6c30> <6c30> 8638 <6c31> <6c31> 16227 <6c33> <6c33> 4099 <6c34> <6c34> 741 <6c35> <6c35> 17647 <6c36> <6c36> 6059 <6c37> <6c37> 16904 <6c38> <6c38> 849 <6c39> <6c39> 15877 <6c3a> <6c3a> 17648 <6c3b> <6c3b> 6062 <6c3d> <6c3d> 17281 <6c3e> <6c3e> 852 <6c3f> <6c3f> 6061 <6c40> <6c40> 851 <6c41> <6c41> 850 endcidrange 100 begincidrange <6c42> <6c42> 1227 <6c43> <6c43> 6060 <6c46> <6c46> 6146 <6c49> <6c49> 16525 <6c4a> <6c4a> 6150 <6c4b> <6c4c> 6152 <6c4d> <6c4e> 1008 <6c4f> <6c4f> 6149 <6c50> <6c50> 1004 <6c52> <6c52> 6147 <6c54> <6c54> 6151 <6c55> <6c55> 1005 <6c57> <6c57> 1000 <6c58> <6c58> 15290 <6c59> <6c59> 1001 <6c5a> <6c5a> 16908 <6c5b> <6c5b> 1007 <6c5c> <6c5c> 6148 <6c5d> <6c5d> 999 <6c5e> <6c5e> 1228 <6c5f> <6c60> 1002 <6c61> <6c61> 1006 <6c65> <6c65> 6336 <6c66> <6c66> 6334 <6c67> <6c67> 6321 <6c68> <6c68> 1240 <6c69> <6c69> 6328 <6c6a> <6c6a> 1235 <6c6b> <6c6b> 6322 <6c6d> <6c6d> 6330 <6c6e> <6c6e> 16586 <6c6f> <6c6f> 6327 <6c70> <6c70> 1238 <6c71> <6c71> 6326 <6c72> <6c72> 1245 <6c73> <6c73> 6335 <6c74> <6c74> 1247 <6c75> <6c75> 18030 <6c76> <6c76> 1249 <6c78> <6c78> 6320 <6c79> <6c79> 16910 <6c7a> <6c7a> 1236 <6c7b> <6c7b> 6337 <6c7d> <6c7d> 1243 <6c7e> <6c7e> 1246 <6c7f> <6c7f> 14246 <6c80> <6c80> 6628 <6c81> <6c81> 1230 <6c82> <6c82> 1253 <6c83> <6c83> 1244 <6c84> <6c84> 6323 <6c85> <6c85> 1233 <6c86> <6c86> 1248 <6c87> <6c87> 6331 <6c88> <6c89> 1231 <6c8a> <6c8a> 6626 <6c8b> <6c8b> 6324 <6c8c> <6c8c> 1239 <6c8d> <6c8d> 1250 <6c8e> <6c8e> 6338 <6c8f> <6c8f> 6325 <6c90> <6c90> 1237 <6c92> <6c92> 1242 <6c93> <6c93> 6606 <6c94> <6c94> 1251 <6c95> <6c95> 6332 <6c96> <6c96> 1241 <6c98> <6c98> 1252 <6c99> <6c99> 1229 <6c9a> <6c9a> 6329 <6c9b> <6c9b> 1234 <6c9c> <6c9c> 6333 <6c9d> <6c9d> 6627 <6c9f> <6c9f> 14473 <6ca2> <6ca2> 15715 <6caa> <6caa> 18031 <6cab> <6cab> 1579 <6cac> <6cac> 1595 <6cad> <6cad> 6613 <6cae> <6cae> 1586 <6caf> <6caf> 15606 <6cb0> <6cb0> 6634 <6cb1> <6cb1> 1571 <6cb2> <6cb2> 16076 <6cb3> <6cb3> 1574 <6cb4> <6cb4> 6625 <6cb6> <6cb6> 6611 <6cb7> <6cb7> 6615 <6cb8> <6cb8> 1582 <6cb9> <6cb9> 1584 <6cba> <6cba> 6618 <6cbb> <6cbb> 1591 <6cbc> <6cbc> 1577 <6cbd> <6cbe> 1575 <6cbf> <6cbf> 1590 <6cc0> <6cc0> 6630 <6cc1> <6cc1> 1585 <6cc2> <6cc2> 6617 <6cc3> <6cc3> 6619 <6cc4> <6cc4> 1583 endcidrange 100 begincidrange <6cc5> <6cc5> 1588 <6cc6> <6cc6> 6620 <6cc7> <6cc7> 6633 <6cc9> <6cc9> 1904 <6cca> <6cca> 1594 <6ccb> <6ccb> 16496 <6ccc> <6ccc> 1572 <6ccd> <6ccd> 6632 <6cce> <6cce> 16273 <6ccf> <6ccf> 6636 <6cd0> <6cd0> 6616 <6cd1> <6cd1> 6638 <6cd2> <6cd2> 6623 <6cd3> <6cd3> 1581 <6cd4> <6cd4> 6612 <6cd5> <6cd5> 1580 <6cd6> <6cd6> 1598 <6cd7> <6cd7> 1587 <6cd9> <6cd9> 6610 <6cda> <6cda> 6990 <6cdb> <6cdb> 1593 <6cdc> <6cdc> 1597 <6cdd> <6cdd> 6624 <6cde> <6cde> 6629 <6cdf> <6cdf> 15703 <6ce0> <6ce0> 1599 <6ce1> <6ce1> 1592 <6ce2> <6ce2> 1578 <6ce3> <6ce3> 1568 <6ce5> <6ce5> 1573 <6ce7> <6ce7> 6614 <6ce8> <6ce8> 1569 <6ce9> <6ce9> 6637 <6cea> <6cea> 16269 <6ceb> <6ceb> 6608 <6cec> <6cec> 6607 <6ced> <6ced> 6621 <6cee> <6cee> 6609 <6cef> <6cef> 1596 <6cf0> <6cf0> 2311 <6cf1> <6cf1> 1589 <6cf2> <6cf2> 6622 <6cf3> <6cf3> 1570 <6cf5> <6cf5> 1919 <6cf9> <6cf9> 6635 <6d00> <6d00> 6997 <6d01> <6d01> 7000 <6d02> <6d02> 18033 <6d03> <6d03> 7003 <6d04> <6d04> 6992 <6d05> <6d05> 14873 <6d06> <6d06> 18034 <6d07> <6d07> 7006 <6d08> <6d08> 7009 <6d09> <6d09> 7011 <6d0a> <6d0a> 6989 <6d0b> <6d0b> 1905 <6d0c> <6d0c> 1910 <6d0d> <6d0d> 7417 <6d0e> <6d0e> 1926 <6d0f> <6d0f> 7004 <6d10> <6d10> 7012 <6d11> <6d11> 6996 <6d12> <6d12> 6988 <6d16> <6d16> 7444 <6d17> <6d17> 1913 <6d18> <6d18> 7001 <6d19> <6d19> 6993 <6d1a> <6d1a> 6995 <6d1b> <6d1b> 1918 <6d1d> <6d1d> 6998 <6d1e> <6d1e> 1912 <6d1f> <6d1f> 6985 <6d20> <6d20> 7007 <6d22> <6d22> 7010 <6d24> <6d24> 15043 <6d25> <6d25> 1909 <6d26> <6d26> 18035 <6d27> <6d27> 1921 <6d28> <6d28> 6982 <6d29> <6d29> 1923 <6d2a> <6d2a> 1907 <6d2b> <6d2b> 1927 <6d2c> <6d2c> 7008 <6d2d> <6d2d> 6984 <6d2e> <6d2e> 1924 <6d2f> <6d2f> 7438 <6d30> <6d30> 6631 <6d31> <6d31> 1911 <6d32> <6d32> 1906 <6d33> <6d33> 6991 <6d34> <6d34> 6983 <6d35> <6d35> 1925 <6d36> <6d36> 1917 <6d37> <6d37> 7002 <6d38> <6d38> 1922 <6d39> <6d39> 1920 <6d3a> <6d3a> 6994 <6d3b> <6d3b> 1914 <6d3c> <6d3c> 6986 endcidrange 100 begincidrange <6d3d> <6d3e> 1915 <6d3f> <6d3f> 6987 <6d40> <6d40> 7005 <6d41> <6d41> 1908 <6d42> <6d42> 6999 <6d4e> <6d4e> 17752 <6d57> <6d57> 15603 <6d58> <6d58> 7420 <6d59> <6d59> 2319 <6d5a> <6d5a> 2324 <6d5b> <6d5b> 16540 <6d5c> <6d5c> 16930 <6d5e> <6d5e> 7429 <6d5f> <6d5f> 7435 <6d60> <6d60> 7431 <6d61> <6d61> 7418 <6d62> <6d62> 7421 <6d63> <6d64> 7414 <6d65> <6d65> 2331 <6d66> <6d66> 2316 <6d67> <6d67> 7430 <6d68> <6d68> 7439 <6d69> <6d69> 2326 <6d6a> <6d6a> 2312 <6d6c> <6d6c> 2321 <6d6d> <6d6d> 7422 <6d6e> <6d6e> 2323 <6d6f> <6d6f> 7423 <6d70> <6d70> 7433 <6d71> <6d71> 16629 <6d72> <6d72> 14807 <6d74> <6d74> 2325 <6d75> <6d75> 7448 <6d76> <6d76> 7416 <6d77> <6d77> 2318 <6d78> <6d78> 2317 <6d79> <6d79> 2329 <6d7a> <6d7a> 7413 <6d7b> <6d7b> 7446 <6d7c> <6d7c> 7434 <6d7d> <6d7d> 7447 <6d7e> <6d7e> 7441 <6d7f> <6d7f> 7427 <6d80> <6d80> 7442 <6d81> <6d81> 18036 <6d82> <6d82> 7436 <6d83> <6d83> 7445 <6d84> <6d84> 7443 <6d85> <6d85> 2330 <6d86> <6d86> 7428 <6d87> <6d87> 2315 <6d88> <6d88> 2314 <6d89> <6d89> 2322 <6d8a> <6d8a> 2328 <6d8b> <6d8b> 7440 <6d8c> <6d8c> 2327 <6d8d> <6d8d> 7425 <6d8e> <6d8e> 2796 <6d8f> <6d8f> 15848 <6d90> <6d90> 7449 <6d91> <6d91> 7424 <6d92> <6d92> 7419 <6d93> <6d93> 2320 <6d94> <6d94> 2332 <6d95> <6d95> 2313 <6d96> <6d96> 16929 <6d97> <6d97> 7432 <6d98> <6d98> 7437 <6da4> <6da4> 18038 <6da5> <6da5> 15033 <6daa> <6daa> 2830 <6dab> <6dab> 8006 <6dac> <6dac> 8010 <6dae> <6dae> 2811 <6daf> <6daf> 2809 <6db1> <6db1> 18039 <6db2> <6db2> 2800 <6db3> <6db3> 8008 <6db4> <6db4> 8007 <6db5> <6db5> 2820 <6db7> <6db7> 8013 <6db8> <6db8> 2814 <6db9> <6db9> 16379 <6dba> <6dba> 8031 <6dbb> <6dbb> 8043 <6dbc> <6dbc> 2797 <6dbd> <6dbd> 8028 <6dbe> <6dbe> 8021 <6dbf> <6dbf> 2832 <6dc0> <6dc0> 8005 <6dc2> <6dc2> 8033 <6dc4> <6dc4> 2829 <6dc5> <6dc5> 2817 <6dc6> <6dc6> 2828 <6dc7> <6dc7> 2807 <6dc8> <6dc8> 8017 <6dc9> <6dc9> 8035 <6dca> <6dca> 8027 <6dcb> <6dcb> 2808 <6dcc> <6dcc> 2802 endcidrange 100 begincidrange <6dcd> <6dcd> 8041 <6dcf> <6dcf> 8034 <6dd0> <6dd0> 8036 <6dd1> <6dd1> 2810 <6dd2> <6dd2> 2818 <6dd3> <6dd3> 8038 <6dd4> <6dd4> 8015 <6dd5> <6dd5> 8032 <6dd6> <6dd6> 8020 <6dd7> <6dd7> 8040 <6dd8> <6dd8> 2823 <6dd9> <6dd9> 2799 <6dda> <6dda> 2821 <6ddb> <6ddb> 8025 <6ddc> <6ddd> 8023 <6dde> <6dde> 2812 <6ddf> <6ddf> 8019 <6de0> <6de0> 8018 <6de1> <6de1> 2801 <6de2> <6de2> 8012 <6de3> <6de3> 8042 <6de4> <6de4> 2803 <6de5> <6de5> 8022 <6de6> <6de6> 2833 <6de8> <6de8> 2827 <6de9> <6de9> 8011 <6dea> <6dea> 2824 <6deb> <6deb> 2822 <6dec> <6dec> 2831 <6ded> <6ded> 8029 <6dee> <6dee> 2826 <6def> <6def> 7426 <6df0> <6df0> 8030 <6df1> <6df1> 2825 <6df2> <6df2> 8037 <6df3> <6df3> 2798 <6df4> <6df4> 8026 <6df5> <6df5> 2816 <6df6> <6df6> 8014 <6df7> <6df7> 2815 <6df9> <6df9> 2813 <6dfa> <6dfa> 2805 <6dfb> <6dfb> 2804 <6dfc> <6dfc> 8639 <6dfd> <6dfd> 8039 <6e00> <6e00> 8016 <6e02> <6e02> 15610 <6e03> <6e03> 8660 <6e04> <6e04> 15038 <6e05> <6e05> 2806 <6e0a> <6e0a> 15041 <6e0f> <6e0f> 15600 <6e15> <6e15> 18040 <6e18> <6e18> 18041 <6e19> <6e19> 3265 <6e1a> <6e1a> 2819 <6e1b> <6e1b> 3247 <6e1c> <6e1c> 8654 <6e1d> <6e1d> 3261 <6e1f> <6e1f> 8642 <6e20> <6e20> 3244 <6e21> <6e21> 3240 <6e22> <6e22> 8672 <6e23> <6e23> 3246 <6e24> <6e24> 3250 <6e25> <6e25> 3245 <6e26> <6e26> 3254 <6e27> <6e27> 8676 <6e28> <6e28> 8667 <6e29> <6e29> 18042 <6e2a> <6e2a> 17154 <6e2b> <6e2b> 8649 <6e2c> <6e2c> 3259 <6e2d> <6e2d> 3253 <6e2e> <6e2e> 8661 <6e2f> <6e2f> 3237 <6e30> <6e30> 8673 <6e31> <6e31> 8666 <6e32> <6e32> 3241 <6e33> <6e33> 8655 <6e34> <6e34> 3256 <6e35> <6e36> 8684 <6e38> <6e38> 3238 <6e39> <6e39> 8671 <6e3a> <6e3a> 3258 <6e3b> <6e3b> 8659 <6e3c> <6e3d> 8645 <6e3e> <6e3e> 3262 <6e3f> <6e3f> 8650 <6e40> <6e40> 8657 <6e41> <6e41> 8651 <6e43> <6e43> 3260 <6e44> <6e44> 3268 <6e45> <6e45> 8647 <6e46> <6e47> 8640 <6e49> <6e49> 8643 <6e4a> <6e4a> 3243 <6e4b> <6e4b> 8656 <6e4d> <6e4d> 3257 <6e4e> <6e4e> 3266 endcidrange 100 begincidrange <6e4f> <6e4f> 16948 <6e50> <6e50> 16849 <6e51> <6e51> 8658 <6e52> <6e52> 8682 <6e53> <6e53> 8674 <6e54> <6e54> 3239 <6e55> <6e55> 8680 <6e56> <6e56> 3251 <6e58> <6e58> 3249 <6e59> <6e59> 16614 <6e5a> <6e5a> 8686 <6e5b> <6e5b> 3248 <6e5c> <6e5c> 8664 <6e5d> <6e5d> 8652 <6e5e> <6e5e> 8662 <6e5f> <6e5f> 3271 <6e60> <6e60> 8668 <6e61> <6e61> 8665 <6e62> <6e62> 8648 <6e63> <6e63> 3267 <6e64> <6e64> 8678 <6e65> <6e65> 8675 <6e66> <6e66> 8683 <6e67> <6e67> 3242 <6e68> <6e68> 8663 <6e69> <6e69> 3270 <6e6b> <6e6b> 8670 <6e6e> <6e6e> 3252 <6e6f> <6e6f> 3255 <6e71> <6e71> 8669 <6e72> <6e72> 3269 <6e73> <6e73> 8653 <6e74> <6e74> 8009 <6e76> <6e76> 14803 <6e77> <6e77> 8679 <6e78> <6e78> 8677 <6e79> <6e79> 8681 <6e7c> <6e7c> 16931 <6e86> <6e86> 18043 <6e88> <6e88> 8644 <6e89> <6e89> 3264 <6e8b> <6e8b> 15295 <6e8d> <6e8d> 9324 <6e8e> <6e8e> 9323 <6e8f> <6e8f> 9297 <6e90> <6e90> 3669 <6e92> <6e92> 9322 <6e93> <6e94> 9300 <6e96> <6e96> 3679 <6e97> <6e97> 9331 <6e98> <6e98> 3674 <6e99> <6e99> 9321 <6e9a> <6e9a> 17793 <6e9b> <6e9b> 9294 <6e9c> <6e9c> 3680 <6e9d> <6e9d> 3670 <6e9e> <6e9e> 9309 <6e9f> <6e9f> 9299 <6ea0> <6ea0> 9302 <6ea1> <6ea1> 9326 <6ea2> <6ea2> 3664 <6ea3> <6ea3> 9333 <6ea4> <6ea4> 9325 <6ea5> <6ea5> 3673 <6ea6> <6ea6> 9314 <6ea7> <6ea7> 3684 <6eaa> <6eaa> 3683 <6eab> <6eab> 3677 <6eae> <6eae> 9332 <6eaf> <6eaf> 3665 <6eb0> <6eb0> 9312 <6eb1> <6eb1> 9303 <6eb2> <6eb2> 9316 <6eb3> <6eb3> 9328 <6eb4> <6eb4> 3685 <6eb5> <6eb5> 16894 <6eb6> <6eb6> 3667 <6eb7> <6eb7> 9311 <6eb8> <6eb8> 15884 <6eb9> <6eb9> 9304 <6eba> <6eba> 3676 <6ebb> <6ebb> 18045 <6ebc> <6ebc> 3675 <6ebd> <6ebd> 9307 <6ebe> <6ebe> 9317 <6ebf> <6ebf> 9327 <6ec0> <6ec0> 9298 <6ec1> <6ec1> 9308 <6ec2> <6ec2> 3668 <6ec3> <6ec3> 9318 <6ec4> <6ec4> 3681 <6ec5> <6ec5> 3672 <6ec6> <6ec6> 9305 <6ec7> <6ec7> 3671 <6ec8> <6ec8> 9296 <6ec9> <6ec9> 9310 <6eca> <6eca> 9330 <6ecb> <6ecb> 3263 <6ecc> <6ecc> 4127 <6ecd> <6ecd> 9313 endcidrange 100 begincidrange <6ece> <6ece> 9963 <6ecf> <6ecf> 9315 <6ed0> <6ed0> 9329 <6ed1> <6ed1> 3678 <6ed2> <6ed2> 9306 <6ed3> <6ed3> 3666 <6ed4> <6ed4> 3682 <6ed5> <6ed5> 4506 <6ed6> <6ed6> 9295 <6ed8> <6ed8> 9320 <6ed9> <6ed9> 16489 <6eda> <6eda> 18047 <6edb> <6edb> 16431 <6edc> <6edc> 9319 <6edd> <6edd> 17720 <6ee2> <6ee2> 18046 <6ee8> <6ee9> 18049 <6eeb> <6eeb> 9991 <6eec> <6eec> 4124 <6eed> <6eed> 9980 <6eee> <6eee> 9985 <6eef> <6eef> 4113 <6ef1> <6ef1> 9965 <6ef2> <6ef2> 4126 <6ef4> <6ef4> 4104 <6ef5> <6ef5> 9964 <6ef6> <6ef6> 9997 <6ef7> <6ef7> 4128 <6ef8> <6ef8> 9968 <6ef9> <6ef9> 9984 <6efa> <6efa> 16955 <6efb> <6efb> 9970 <6efc> <6efc> 10000 <6efd> <6efd> 9996 <6efe> <6efe> 4102 <6eff> <6eff> 4112 <6f00> <6f00> 10566 <6f01> <6f01> 4125 <6f02> <6f02> 4110 <6f03> <6f03> 9966 <6f04> <6f04> 16932 <6f05> <6f05> 9995 <6f06> <6f06> 4114 <6f07> <6f07> 9992 <6f08> <6f08> 10005 <6f09> <6f09> 9972 <6f0a> <6f0a> 9981 <6f0b> <6f0b> 15034 <6f0c> <6f0c> 15611 <6f0d> <6f0d> 10003 <6f0e> <6f0e> 9993 <6f0f> <6f0f> 4109 <6f12> <6f12> 9979 <6f13> <6f13> 4103 <6f14> <6f14> 4101 <6f15> <6f15> 4119 <6f16> <6f16> 16800 <6f17> <6f17> 18126 <6f18> <6f18> 9977 <6f19> <6f1a> 9974 <6f1c> <6f1c> 9999 <6f1e> <6f1e> 10004 <6f1f> <6f1f> 10002 <6f20> <6f20> 4107 <6f21> <6f21> 10006 <6f22> <6f22> 4111 <6f23> <6f23> 4118 <6f24> <6f24> 18051 <6f25> <6f25> 9967 <6f26> <6f26> 10542 <6f27> <6f27> 9976 <6f29> <6f29> 4105 <6f2a> <6f2a> 4123 <6f2b> <6f2b> 4120 <6f2c> <6f2c> 4108 <6f2d> <6f2d> 9986 <6f2e> <6f2e> 9971 <6f2f> <6f2f> 4121 <6f30> <6f30> 9988 <6f31> <6f31> 4115 <6f32> <6f32> 4117 <6f33> <6f33> 4100 <6f34> <6f34> 18052 <6f35> <6f35> 9990 <6f36> <6f36> 9982 <6f37> <6f37> 9969 <6f38> <6f38> 4116 <6f39> <6f39> 9998 <6f3a> <6f3a> 10001 <6f3b> <6f3b> 9978 <6f3c> <6f3c> 9989 <6f3d> <6f3d> 17026 <6f3e> <6f3e> 4106 <6f3f> <6f3f> 4489 <6f40> <6f40> 9987 <6f41> <6f41> 10541 <6f43> <6f43> 9994 <6f44> <6f44> 16960 <6f4e> <6f4e> 9973 <6f4f> <6f4f> 10551 endcidrange 100 begincidrange <6f50> <6f50> 10561 <6f51> <6f51> 4492 <6f52> <6f52> 10560 <6f53> <6f53> 10572 <6f54> <6f54> 4494 <6f55> <6f55> 10558 <6f56> <6f56> 15954 <6f57> <6f57> 10562 <6f58> <6f58> 4505 <6f5a> <6f5a> 10553 <6f5b> <6f5b> 4497 <6f5c> <6f5c> 16961 <6f5d> <6f5d> 10565 <6f5e> <6f5e> 11162 <6f5f> <6f5f> 4509 <6f60> <6f60> 4508 <6f61> <6f61> 10567 <6f62> <6f62> 10550 <6f63> <6f63> 10577 <6f64> <6f64> 4503 <6f66> <6f66> 4493 <6f67> <6f67> 10570 <6f69> <6f69> 10574 <6f6a> <6f6a> 10579 <6f6b> <6f6b> 10568 <6f6c> <6f6c> 10556 <6f6d> <6f6d> 4496 <6f6e> <6f6e> 4499 <6f6f> <6f6f> 4507 <6f70> <6f70> 4502 <6f72> <6f72> 10559 <6f73> <6f73> 9983 <6f74> <6f74> 16963 <6f76> <6f76> 10555 <6f77> <6f77> 10578 <6f78> <6f78> 4498 <6f79> <6f79> 15294 <6f7a> <6f7a> 4501 <6f7b> <6f7b> 10580 <6f7c> <6f7c> 4490 <6f7d> <6f7d> 10569 <6f7e> <6f7e> 10543 <6f7f> <6f7f> 10575 <6f80> <6f80> 5116 <6f81> <6f81> 18055 <6f82> <6f82> 10557 <6f84> <6f84> 4491 <6f85> <6f85> 10552 <6f86> <6f86> 4495 <6f87> <6f87> 10544 <6f88> <6f88> 4122 <6f89> <6f89> 10548 <6f8a> <6f8a> 16789 <6f8b> <6f8b> 10573 <6f8c> <6f8c> 10549 <6f8d> <6f8d> 10547 <6f8e> <6f8e> 4500 <6f90> <6f90> 10571 <6f92> <6f92> 10546 <6f93> <6f93> 10564 <6f94> <6f94> 10563 <6f95> <6f95> 10576 <6f96> <6f96> 10554 <6f97> <6f97> 4504 <6f9d> <6f9d> 16953 <6f9e> <6f9e> 11165 <6f9f> <6f9f> 16966 <6fa0> <6fa0> 4843 <6fa1> <6fa1> 4833 <6fa2> <6fa2> 11177 <6fa3> <6fa3> 11157 <6fa4> <6fa4> 4835 <6fa5> <6fa5> 11169 <6fa6> <6fa6> 4842 <6fa7> <6fa7> 4837 <6fa8> <6fa8> 11167 <6fa9> <6fa9> 11662 <6faa> <6faa> 11173 <6fab> <6fab> 11179 <6fac> <6fac> 11172 <6fad> <6fad> 11155 <6fae> <6fae> 11170 <6faf> <6faf> 11181 <6fb0> <6fb0> 11183 <6fb1> <6fb1> 4832 <6fb2> <6fb2> 11182 <6fb3> <6fb3> 4838 <6fb4> <6fb4> 4844 <6fb5> <6fb5> 15911 <6fb6> <6fb6> 4841 <6fb8> <6fb8> 11176 <6fb9> <6fb9> 4840 <6fba> <6fba> 11171 <6fbb> <6fbb> 15291 <6fbc> <6fbc> 11159 <6fbd> <6fbd> 11164 <6fbe> <6fbe> 18056 <6fbf> <6fbf> 11175 <6fc0> <6fc0> 4839 <6fc1> <6fc1> 4836 endcidrange 100 begincidrange <6fc2> <6fc2> 4831 <6fc3> <6fc3> 4834 <6fc4> <6fc4> 11163 <6fc6> <6fc6> 10545 <6fc7> <6fc7> 11158 <6fc8> <6fc8> 11161 <6fc9> <6fc9> 11178 <6fca> <6fca> 11166 <6fcb> <6fcb> 11156 <6fcc> <6fcc> 11661 <6fcd> <6fcd> 11180 <6fce> <6fce> 11160 <6fcf> <6fcf> 11174 <6fd3> <6fd3> 16968 <6fd4> <6fd4> 11664 <6fd5> <6fd5> 5120 <6fd8> <6fd8> 5108 <6fd9> <6fd9> 15476 <6fda> <6fda> 15475 <6fdb> <6fdb> 5112 <6fdc> <6fdc> 11666 <6fdd> <6fdd> 11672 <6fde> <6fde> 11670 <6fdf> <6fe0> 5110 <6fe1> <6fe1> 5118 <6fe2> <6fe2> 11673 <6fe3> <6fe3> 11665 <6fe4> <6fe4> 5113 <6fe6> <6fe6> 11669 <6fe7> <6fe7> 11668 <6fe8> <6fe8> 11674 <6fe9> <6fe9> 5119 <6feb> <6feb> 5114 <6fec> <6fec> 5117 <6fed> <6fed> 11667 <6fee> <6fee> 5121 <6fef> <6fef> 5115 <6ff0> <6ff0> 5122 <6ff1> <6ff1> 5109 <6ff2> <6ff2> 11671 <6ff4> <6ff4> 11663 <6ff6> <6ff6> 14501 <6ff7> <6ff7> 12110 <6ff8> <6ff8> 16951 <6ffa> <6ffa> 5355 <6ffb> <6ffb> 12107 <6ffc> <6ffc> 12109 <6ffe> <6ffe> 5353 <6fff> <6fff> 12105 <7000> <7000> 12106 <7001> <7001> 12101 <7003> <7003> 18146 <7004> <7004> 11168 <7005> <7005> 12102 <7006> <7006> 5354 <7007> <7007> 12098 <7009> <7009> 5351 <700a> <700a> 12111 <700b> <700b> 5352 <700c> <700d> 12099 <700e> <700e> 12104 <700f> <700f> 5357 <7011> <7011> 5356 <7014> <7014> 12103 <7015> <7015> 5519 <7016> <7016> 12461 <7017> <7017> 12467 <7018> <7018> 5520 <7019> <7019> 12458 <701a> <701a> 5517 <701b> <701b> 5514 <701c> <701c> 12469 <701d> <701d> 5518 <701e> <701e> 15478 <701f> <701f> 5515 <7020> <7020> 12460 <7021> <7023> 12463 <7024> <7024> 12468 <7026> <7026> 12108 <7027> <7027> 12459 <7028> <7028> 5516 <7029> <7029> 12466 <702a> <702a> 12783 <702b> <702b> 12462 <702c> <702c> 18062 <702f> <702f> 12774 <7030> <7030> 5661 <7031> <7031> 12777 <7032> <7032> 5662 <7033> <7033> 12786 <7034> <7034> 12776 <7035> <7035> 12773 <7037> <7037> 12775 <7038> <7038> 12779 <7039> <7039> 12782 <703a> <703a> 12781 <703b> <703b> 12785 <703c> <703c> 12772 <703e> <703e> 5660 <703f> <703f> 12780 endcidrange 100 begincidrange <7040> <7040> 12784 <7041> <7041> 12787 <7042> <7042> 12778 <7043> <7044> 13016 <7045> <7046> 13021 <7048> <7049> 13019 <704a> <704a> 13018 <704b> <704b> 16980 <704c> <704c> 5754 <7050> <7050> 18064 <7051> <7051> 5832 <7052> <7052> 13196 <7054> <7054> 18065 <7055> <7057> 13193 <7058> <7058> 5833 <705a> <705a> 13347 <705b> <705b> 13346 <705c> <705c> 14418 <705d> <705d> 13450 <705e> <705e> 5922 <705f> <705f> 13448 <7060> <7060> 13451 <7061> <7061> 13449 <7062> <7062> 13520 <7063> <7063> 5956 <7064> <7064> 5970 <7065> <7065> 13596 <7066> <7066> 13574 <7067> <7067> 15605 <7068> <7068> 13595 <7069> <706a> 13639 <706b> <706b> 742 <706c> <706c> 17649 <706f> <706f> 18066 <7070> <7070> 1010 <7071> <7071> 6154 <7074> <7074> 6339 <7075> <7075> 14535 <7076> <7076> 1254 <7078> <7078> 1257 <7079> <7079> 16537 <707a> <707a> 6340 <707c> <707d> 1255 <707e> <707e> 16981 <707f> <707f> 18067 <7081> <7081> 18777 <7082> <7082> 6647 <7083> <7083> 6649 <7084> <7084> 6644 <7085> <7085> 6641 <7086> <7086> 6643 <7089> <7089> 17401 <708a> <708a> 1603 <708b> <708b> 16587 <708e> <708e> 1601 <708f> <708f> 18099 <7091> <7091> 6645 <7092> <7092> 1602 <7093> <7093> 6642 <7094> <7094> 6639 <7095> <7095> 1600 <7096> <7096> 6646 <7098> <7098> 6640 <7099> <7099> 1604 <709a> <709a> 6648 <709f> <709f> 7014 <70a0> <70a0> 18242 <70a1> <70a1> 7018 <70a3> <70a3> 14706 <70a4> <70a4> 1936 <70a5> <70a5> 15543 <70a6> <70a6> 15699 <70a7> <70a7> 16982 <70a9> <70a9> 7021 <70ab> <70ab> 1928 <70ac> <70ac> 1931 <70ad> <70ad> 1933 <70ae> <70ae> 1935 <70af> <70af> 1932 <70b0> <70b0> 7017 <70b1> <70b1> 7016 <70b3> <70b3> 1930 <70b4> <70b5> 7019 <70b7> <70b7> 7013 <70b8> <70b8> 1934 <70b9> <70b9> 15721 <70ba> <70ba> 1929 <70bb> <70bb> 18450 <70bc> <70bc> 17753 <70bd> <70bd> 17008 <70be> <70be> 7015 <70c0> <70c0> 18227 <70c4> <70c4> 15274 <70c5> <70c7> 7463 <70c8> <70c8> 2337 <70ca> <70ca> 2333 <70cb> <70cb> 7454 <70cc> <70cc> 16984 <70cd> <70cd> 7462 <70ce> <70ce> 7467 endcidrange 100 begincidrange <70cf> <70cf> 2338 <70d0> <70d0> 14701 <70d1> <70d1> 7452 <70d2> <70d2> 7458 <70d3> <70d3> 7451 <70d4> <70d4> 7461 <70d5> <70d6> 16985 <70d7> <70d7> 7457 <70d8> <70d8> 2334 <70d9> <70d9> 2336 <70da> <70da> 7466 <70dc> <70dc> 7450 <70dd> <70dd> 7453 <70de> <70de> 7459 <70df> <70df> 16987 <70e0> <70e0> 7460 <70e1> <70e1> 7468 <70e2> <70e2> 7456 <70e4> <70e4> 2335 <70ef> <70ef> 2838 <70f0> <70f0> 8050 <70f1> <70f1> 15048 <70f3> <70f3> 8052 <70f4> <70f4> 8048 <70f5> <70f5> 18272 <70f6> <70f6> 8060 <70f7> <70f7> 8046 <70f8> <70f8> 8059 <70f9> <70f9> 2834 <70fa> <70fa> 8044 <70fb> <70fb> 8690 <70fc> <70fc> 8054 <70fd> <70fd> 2837 <70fe> <70fe> 15630 <70ff> <70ff> 8055 <7100> <7100> 8058 <7102> <7102> 8062 <7104> <7104> 8051 <7105> <7105> 14883 <7106> <7106> 8056 <7109> <710a> 2835 <710b> <710b> 8061 <710c> <710c> 8049 <710d> <710d> 8045 <710e> <710e> 8063 <7110> <7110> 8053 <7113> <7113> 8057 <7117> <7117> 8047 <7119> <711a> 3272 <711b> <711b> 8700 <711c> <711c> 3279 <711d> <711d> 15687 <711e> <711e> 8688 <711f> <711f> 8697 <7120> <7120> 8687 <7121> <7121> 3276 <7122> <7122> 8695 <7123> <7123> 8693 <7125> <7125> 8694 <7126> <7126> 3274 <7128> <7128> 8698 <7129> <7129> 15273 <712b> <712b> 16993 <712c> <712c> 17002 <712e> <712e> 8691 <712f> <712f> 8689 <7130> <7130> 3275 <7131> <7131> 8692 <7132> <7132> 8696 <7133> <7133> 15700 <7134> <7134> 15486 <7135> <7135> 14189 <7136> <7136> 3277 <713a> <713a> 8699 <713b> <713b> 15045 <713e> <713e> 14126 <7140> <7140> 17304 <7141> <7141> 9339 <7142> <7142> 9346 <7143> <7143> 9348 <7144> <7144> 9354 <7145> <7145> 16994 <7146> <7146> 3698 <7147> <7147> 9334 <7149> <7149> 3690 <714a> <714a> 16996 <714b> <714b> 9349 <714c> <714c> 3695 <714d> <714d> 9355 <714e> <714e> 3686 <714f> <714f> 16999 <7150> <7150> 9352 <7151> <7151> 18533 <7152> <7152> 9336 <7153> <7153> 9353 <7154> <7154> 9335 <7156> <7156> 3700 <7158> <7158> 9347 <7159> <7159> 3687 <715a> <715a> 9356 endcidrange 100 begincidrange <715c> <715c> 3692 <715d> <715d> 9340 <715e> <715e> 3697 <715f> <715f> 9351 <7160> <7160> 9338 <7161> <7161> 9345 <7162> <7162> 9341 <7163> <7163> 9337 <7164> <7164> 3689 <7165> <7165> 3696 <7166> <7166> 3694 <7167> <7167> 3691 <7168> <7168> 3699 <7169> <7169> 3688 <716a> <716a> 9344 <716b> <716b> 15557 <716c> <716c> 3693 <716e> <716e> 3278 <7170> <7170> 9350 <7171> <7171> 15808 <7172> <7172> 9342 <7173> <7173> 18407 <7175> <7175> 15597 <7176> <7176> 16384 <7177> <7177> 14679 <7178> <7178> 9343 <717a> <717a> 18724 <717b> <717b> 10014 <717c> <717c> 14389 <717d> <717d> 4131 <717e> <717e> 14704 <7180> <7180> 10010 <7181> <7181> 10016 <7182> <7182> 10012 <7184> <7184> 4133 <7185> <7185> 10011 <7186> <7186> 10015 <7187> <7187> 10007 <7188> <7188> 18182 <7189> <7189> 10009 <718a> <718a> 4132 <718c> <718c> 14826 <718e> <718e> 15675 <718f> <718f> 10013 <7190> <7190> 10008 <7192> <7192> 4134 <7194> <7194> 4129 <7196> <7196> 16991 <7197> <7197> 10017 <7198> <7198> 18461 <7199> <7199> 4130 <719a> <719a> 10586 <719b> <719b> 10583 <719c> <719c> 10595 <719d> <719d> 10589 <719e> <719e> 10591 <719f> <719f> 4510 <71a0> <71a0> 10585 <71a1> <71a1> 10593 <71a2> <71a2> 18625 <71a3> <71a3> 16072 <71a4> <71a4> 10592 <71a5> <71a5> 10590 <71a7> <71a7> 10596 <71a8> <71a8> 4513 <71a9> <71a9> 10587 <71aa> <71aa> 10594 <71ac> <71ac> 4511 <71ad> <71ad> 15901 <71af> <71af> 10582 <71b0> <71b0> 10584 <71b1> <71b1> 4512 <71b2> <71b2> 10581 <71b3> <71b3> 10597 <71b4> <71b4> 16990 <71b5> <71b5> 10588 <71b7> <71b7> 18059 <71b8> <71b8> 11187 <71b9> <71b9> 4851 <71ba> <71ba> 17006 <71bc> <71bc> 11198 <71bd> <71bd> 11196 <71be> <71be> 4845 <71bf> <71bf> 11186 <71c0> <71c1> 11189 <71c2> <71c2> 11185 <71c3> <71c4> 4855 <71c5> <71c5> 11184 <71c6> <71c6> 11199 <71c7> <71c7> 11194 <71c8> <71c8> 4849 <71c9> <71c9> 4846 <71ca> <71ca> 11193 <71cb> <71cb> 11191 <71ce> <71ce> 4852 <71cf> <71cf> 11195 <71d0> <71d0> 4847 <71d1> <71d1> 14141 <71d2> <71d2> 4848 <71d4> <71d4> 11192 endcidrange 100 begincidrange <71d5> <71d5> 4850 <71d6> <71d6> 11188 <71d8> <71d8> 11197 <71d9> <71d9> 4853 <71da> <71db> 11200 <71dc> <71dc> 4854 <71dd> <71dd> 16504 <71df> <71df> 5124 <71e0> <71e0> 5131 <71e1> <71e1> 11675 <71e2> <71e2> 11681 <71e4> <71e4> 11679 <71e5> <71e5> 5127 <71e6> <71e6> 5126 <71e7> <71e7> 5123 <71e8> <71e8> 11677 <71eb> <71eb> 15489 <71ec> <71ec> 5129 <71ed> <71ed> 5128 <71ee> <71ee> 5125 <71f0> <71f0> 11680 <71f1> <71f1> 11676 <71f2> <71f2> 11678 <71f4> <71f4> 5130 <71f5> <71f5> 18158 <71f6> <71f6> 16026 <71f8> <71f8> 5361 <71f9> <71f9> 12114 <71fb> <71fc> 5358 <71fd> <71fd> 12116 <71fe> <71fe> 5360 <71ff> <71ff> 12113 <7201> <7201> 12112 <7202> <7202> 12473 <7203> <7203> 12115 <7205> <7205> 12474 <7206> <7206> 5521 <7207> <7207> 12472 <7209> <7209> 15803 <720a> <720a> 12471 <720c> <720c> 12470 <720d> <720d> 5522 <720e> <720e> 17009 <720f> <720f> 14844 <7210> <7210> 5663 <7213> <7214> 12788 <7215> <7215> 17011 <7216> <7216> 14675 <7217> <7217> 14697 <7219> <7219> 13025 <721a> <721a> 13024 <721b> <721b> 5755 <721d> <721d> 13023 <721e> <721f> 13197 <7222> <7222> 13348 <7223> <7223> 13452 <7224> <7224> 17014 <7226> <7226> 13521 <7227> <7227> 13621 <7228> <7228> 5990 <7229> <7229> 13641 <722a> <722a> 743 <722b> <722b> 17650 <722c> <722d> 1605 <722e> <722e> 17017 <7230> <7230> 1937 <7235> <7235> 5132 <7236> <7236> 744 <7238> <7238> 1607 <7239> <7239> 2339 <723a> <723a> 3701 <723b> <723b> 745 <723d> <723d> 2839 <723e> <723e> 4135 <723f> <723f> 6029 <7240> <7240> 17018 <7241> <7241> 7022 <7242> <7242> 7469 <7244> <7244> 10018 <7246> <7246> 5133 <7247> <7247> 746 <7248> <7248> 1608 <7249> <724a> 7023 <724b> <724b> 8701 <724c> <724c> 3280 <724f> <724f> 9357 <7250> <7250> 15049 <7252> <7252> 3702 <7253> <7253> 10019 <7255> <7255> 17021 <7256> <7256> 4514 <7257> <7257> 17022 <7258> <7258> 5523 <7259> <7259> 747 <725a> <725a> 8702 <725b> <725b> 748 <725c> <725c> 18010 <725d> <725d> 1012 <725e> <725e> 6155 <725f> <725f> 1011 endcidrange 100 begincidrange <7260> <7260> 1260 <7261> <7261> 1259 <7262> <7262> 1258 <7263> <7263> 6341 <7266> <7266> 16059 <7267> <7267> 1609 <7269> <7269> 1610 <726a> <726a> 6650 <726c> <726c> 7025 <726e> <726e> 7028 <726f> <726f> 1939 <7270> <7270> 7026 <7272> <7272> 1938 <7273> <7273> 7027 <7274> <7274> 1940 <7276> <7276> 7472 <7277> <7277> 7471 <7278> <7278> 7470 <7279> <7279> 2340 <727b> <727c> 8065 <727d> <727d> 2840 <727e> <727e> 8064 <727f> <727f> 8067 <7280> <7280> 3282 <7281> <7281> 2841 <7282> <7282> 17027 <7284> <7284> 3281 <7285> <7285> 8706 <7286> <7286> 8705 <7287> <7287> 15050 <7288> <7289> 8703 <728b> <728b> 8707 <728c> <728c> 9359 <728d> <728d> 9358 <728e> <728e> 9362 <728f> <728f> 17353 <7290> <7290> 9361 <7291> <7291> 9360 <7292> <7292> 4136 <7293> <7293> 10022 <7294> <7294> 15051 <7295> <7295> 10021 <7296> <7296> 4137 <7297> <7297> 10020 <7298> <7298> 10598 <729a> <729a> 10599 <729b> <729b> 4515 <729d> <729e> 11202 <729f> <729f> 18234 <72a1> <72a1> 12479 <72a2> <72a2> 5524 <72a3> <72a3> 12478 <72a4> <72a4> 12477 <72a5> <72a6> 12475 <72a7> <72a7> 5756 <72a8> <72a8> 12790 <72a9> <72a9> 13199 <72aa> <72aa> 13522 <72ac> <72ac> 749 <72ad> <72ad> 17652 <72ae> <72ae> 6063 <72af> <72af> 853 <72b0> <72b0> 6064 <72b2> <72b2> 16310 <72b4> <72b5> 6156 <72ba> <72ba> 6347 <72bd> <72bd> 6343 <72bf> <72bf> 6342 <72c0> <72c0> 1611 <72c1> <72c1> 6346 <72c2> <72c2> 1262 <72c3> <72c3> 6344 <72c4> <72c4> 1261 <72c5> <72c5> 6348 <72c6> <72c6> 6345 <72c9> <72c9> 6654 <72ca> <72ca> 7029 <72cb> <72cb> 6652 <72cc> <72cc> 6659 <72cd> <72cd> 17354 <72ce> <72ce> 1612 <72d0> <72d0> 1615 <72d1> <72d1> 6660 <72d2> <72d2> 6656 <72d4> <72d4> 6657 <72d6> <72d6> 6651 <72d7> <72d7> 1614 <72d8> <72d8> 6653 <72d9> <72d9> 1613 <72da> <72da> 6658 <72dc> <72dc> 6655 <72df> <72df> 7033 <72e0> <72e1> 1942 <72e2> <72e2> 16279 <72e3> <72e3> 7036 <72e4> <72e4> 7030 <72e6> <72e6> 7035 <72e8> <72e8> 7031 <72e9> <72e9> 1941 <72ea> <72ea> 7034 endcidrange 100 begincidrange <72eb> <72eb> 7032 <72f3> <72f3> 7478 <72f4> <72f4> 7475 <72f6> <72f6> 7477 <72f7> <72f7> 2345 <72f8> <72f8> 2344 <72f9> <72f9> 2342 <72fa> <72fa> 7474 <72fb> <72fb> 7479 <72fc> <72fc> 2341 <72fd> <72fd> 2343 <72fe> <72fe> 7476 <72ff> <72ff> 8075 <7300> <7300> 7473 <7301> <7301> 7480 <7302> <7302> 16282 <7304> <7304> 16053 <7307> <7307> 8070 <7308> <7308> 8074 <730a> <730a> 8073 <730b> <730b> 8709 <730c> <730c> 8720 <730f> <730f> 8076 <7310> <7310> 18154 <7311> <7311> 8071 <7312> <7312> 8708 <7313> <7313> 2845 <7316> <7316> 2844 <7317> <7317> 8069 <7318> <7318> 8072 <7319> <7319> 2846 <731b> <731b> 2843 <731c> <731c> 2842 <731d> <731d> 8068 <731e> <731e> 8077 <7322> <7322> 8711 <7323> <7323> 8718 <7325> <7325> 3284 <7326> <7326> 8717 <7327> <7327> 8714 <7328> <7328> 17034 <7329> <7329> 3286 <732a> <732a> 15728 <732b> <732b> 17029 <732c> <732c> 16306 <732d> <732d> 8716 <732e> <732e> 17035 <7330> <7330> 8710 <7331> <7331> 8712 <7332> <7332> 8715 <7333> <7333> 8713 <7334> <7334> 3285 <7335> <7335> 8719 <7336> <7336> 3283 <7337> <7337> 3703 <7338> <7338> 18155 <7339> <7339> 17356 <733a> <733a> 9366 <733b> <733b> 9365 <733c> <733c> 9363 <733e> <733e> 3706 <733f> <733f> 3705 <7340> <7340> 9367 <7341> <7341> 18156 <7342> <7342> 9364 <7343> <7343> 10023 <7344> <7344> 4138 <7345> <7345> 3704 <7348> <7348> 17402 <7349> <7349> 9369 <734a> <734a> 9368 <734c> <734c> 10026 <734d> <734d> 10024 <734e> <734e> 4516 <734f> <734f> 16209 <7350> <7350> 4139 <7351> <7351> 10025 <7352> <7352> 10601 <7357> <7357> 4517 <7358> <7358> 10600 <7359> <7359> 10609 <735a> <735a> 10608 <735b> <735b> 10606 <735d> <735d> 10605 <735e> <7360> 10602 <7361> <7361> 10607 <7362> <7362> 10610 <7365> <7365> 11208 <7366> <7367> 11205 <7368> <7368> 4857 <7369> <7369> 11204 <736a> <736a> 11210 <736b> <736b> 11209 <736c> <736c> 11207 <736e> <736f> 11683 <7370> <7370> 5134 <7371> <7371> 16280 <7372> <7372> 5135 <7373> <7373> 11682 <7374> <7374> 16084 endcidrange 100 begincidrange <7375> <7375> 5363 <7376> <7376> 12117 <7377> <7377> 5362 <7378> <7378> 5525 <737a> <737a> 5526 <737b> <737b> 5664 <737c> <737c> 12792 <737d> <737d> 12791 <737e> <737e> 13026 <737f> <737f> 13200 <7380> <7380> 5834 <7381> <7381> 13350 <7382> <7382> 13349 <7383> <7383> 13351 <7384> <7384> 854 <7385> <7385> 7037 <7386> <7386> 2346 <7387> <7387> 2847 <7388> <7388> 8078 <7389> <7389> 855 <738a> <738a> 6065 <738b> <738b> 750 <738e> <738e> 6158 <738f> <738f> 18149 <7392> <7392> 6353 <7393> <7394> 6351 <7395> <7395> 6349 <7396> <7396> 1263 <7397> <7397> 6350 <7398> <7398> 14838 <739c> <739c> 16522 <739d> <739d> 6668 <739e> <739e> 14683 <739f> <739f> 1618 <73a0> <73a0> 6666 <73a1> <73a1> 6662 <73a2> <73a2> 6665 <73a4> <73a4> 6661 <73a5> <73a5> 1620 <73a6> <73a6> 6664 <73a7> <73a7> 16519 <73a8> <73a8> 1617 <73a9> <73a9> 1616 <73aa> <73aa> 17037 <73ab> <73ab> 1619 <73ac> <73ac> 6667 <73ad> <73ad> 6663 <73b2> <73b2> 1947 <73b3> <73b3> 1950 <73b4> <73b4> 7045 <73b5> <73b5> 7044 <73b6> <73b6> 7043 <73b7> <73b7> 1944 <73b8> <73b8> 7052 <73b9> <73b9> 7042 <73bb> <73bb> 1946 <73bc> <73bc> 7485 <73be> <73be> 7049 <73bf> <73bf> 7047 <73c0> <73c0> 1949 <73c2> <73c2> 7039 <73c3> <73c3> 7050 <73c5> <73c5> 7041 <73c6> <73c6> 7051 <73c7> <73c7> 7048 <73c8> <73c8> 7040 <73c9> <73c9> 17040 <73ca> <73ca> 1945 <73cb> <73cb> 7053 <73cc> <73cc> 7038 <73cd> <73cd> 1948 <73ce> <73ce> 16667 <73cf> <73cf> 17036 <73d0> <73d0> 15127 <73d2> <73d2> 7490 <73d3> <73d3> 7481 <73d4> <73d4> 7492 <73d5> <73d5> 16499 <73d6> <73d6> 7484 <73d7> <73d8> 7495 <73d9> <73d9> 7482 <73da> <73da> 7494 <73db> <73db> 7491 <73dc> <73dc> 7489 <73dd> <73dd> 7493 <73de> <73de> 2352 <73e0> <73e0> 2350 <73e1> <73e1> 18160 <73e2> <73e2> 15523 <73e3> <73e3> 7487 <73e4> <73e4> 17061 <73e5> <73e5> 7483 <73e6> <73e6> 15546 <73e7> <73e7> 7486 <73e8> <73e8> 7497 <73e9> <73e9> 7488 <73ea> <73ea> 2351 <73eb> <73eb> 7046 <73ed> <73ed> 2347 <73ee> <73ee> 2349 endcidrange 100 begincidrange <73ef> <73ef> 16401 <73f3> <73f3> 15531 <73f4> <73f4> 8092 <73f5> <73f5> 8081 <73f6> <73f6> 8079 <73f7> <73f7> 17050 <73f8> <73f8> 8080 <73f9> <73f9> 15353 <73fa> <73fa> 8087 <73fb> <73fb> 15532 <73fc> <73fc> 8088 <73fd> <73fd> 8084 <73fe> <73fe> 2852 <73ff> <73ff> 8089 <7400> <7400> 8086 <7401> <7401> 8083 <7403> <7403> 2850 <7404> <7404> 8082 <7405> <7405> 2848 <7406> <7406> 2851 <7407> <7407> 8085 <7408> <7408> 8093 <7409> <7409> 2348 <740a> <740a> 2849 <740b> <740b> 8091 <740c> <740c> 8090 <740d> <740d> 2853 <7411> <7411> 17772 <7412> <7412> 15334 <7414> <7414> 14836 <7415> <7415> 17051 <7416> <7416> 8725 <7417> <7417> 16557 <7419> <7419> 18163 <741a> <741a> 8726 <741b> <741b> 3296 <741c> <741c> 14557 <741d> <741d> 8732 <741e> <741f> 18164 <7420> <7420> 8734 <7421> <7421> 8727 <7422> <7422> 3290 <7423> <7423> 8731 <7424> <7424> 8730 <7425> <7425> 3291 <7426> <7426> 3297 <7428> <7428> 3298 <7429> <7429> 8733 <742a> <742a> 3288 <742b> <742b> 8724 <742c> <742c> 8722 <742d> <742d> 8728 <742e> <742e> 8721 <742f> <742f> 3295 <7430> <7430> 8723 <7431> <7431> 8729 <7432> <7432> 8735 <7433> <7433> 3289 <7434> <7434> 3294 <7435> <7436> 3292 <7437> <7437> 15073 <7438> <7438> 15113 <7439> <7439> 17054 <743a> <743a> 3287 <743c> <743c> 15071 <743f> <743f> 3713 <7440> <7440> 9376 <7441> <7441> 3712 <7442> <7442> 9380 <7443> <7443> 14874 <7444> <7444> 9370 <7445> <7445> 15319 <7446> <7446> 9381 <7447> <7447> 17060 <7448> <7448> 15541 <7449> <7449> 17041 <744a> <744b> 9371 <744d> <744d> 9382 <744e> <744e> 9379 <744f> <7450> 9377 <7451> <7451> 9374 <7452> <7452> 9373 <7453> <7453> 16945 <7454> <7454> 9383 <7455> <7455> 3709 <7456> <7456> 14837 <7457> <7457> 9375 <7459> <7459> 3714 <745a> <745a> 3708 <745b> <745c> 3715 <745d> <745d> 17094 <745e> <745e> 3711 <745f> <745f> 3710 <7460> <7460> 17058 <7462> <7462> 10027 <7463> <7463> 4141 <7464> <7464> 4140 <7465> <7465> 16641 <7467> <7467> 10032 <7468> <7468> 15086 endcidrange 100 begincidrange <7469> <7469> 4518 <746a> <746a> 4142 <746b> <746b> 15335 <746c> <746c> 17064 <746d> <746d> 4144 <746e> <746e> 10033 <746f> <746f> 3707 <7470> <7470> 4143 <7471> <7471> 10029 <7472> <7472> 10031 <7473> <7473> 10028 <7474> <7474> 17065 <7475> <7475> 10030 <7476> <7476> 17062 <7479> <7479> 10620 <747a> <747a> 15057 <747c> <747c> 10619 <747d> <747d> 10616 <747e> <747e> 4521 <747f> <747f> 11211 <7480> <7480> 4522 <7481> <7481> 10615 <7482> <7482> 17068 <7483> <7483> 4520 <7485> <7485> 10617 <7486> <7486> 10614 <7487> <7487> 10611 <7488> <7488> 10618 <7489> <748a> 10612 <748b> <748b> 4519 <748c> <748c> 14881 <748d> <748d> 18077 <7490> <7490> 11688 <7492> <7492> 11215 <7494> <7494> 11214 <7495> <7495> 11216 <7497> <7497> 11685 <7498> <7498> 4860 <7499> <7499> 14835 <749a> <749a> 11212 <749b> <749b> 15114 <749c> <749c> 4858 <749e> <749e> 4862 <749f> <749f> 4861 <74a0> <74a0> 11213 <74a1> <74a1> 11217 <74a3> <74a3> 4859 <74a4> <74a4> 16752 <74a5> <74a5> 11692 <74a6> <74a6> 5138 <74a7> <74a7> 5364 <74a8> <74a8> 5139 <74a9> <74a9> 5136 <74aa> <74aa> 11689 <74ab> <74ab> 11687 <74ad> <74ad> 11690 <74af> <74af> 11693 <74b0> <74b0> 5137 <74b1> <74b1> 11691 <74b2> <74b2> 11686 <74b4> <74b4> 15525 <74b5> <74b5> 12120 <74b6> <74b6> 12123 <74b7> <74b7> 12482 <74b8> <74b8> 12118 <74ba> <74ba> 12793 <74bb> <74bb> 12124 <74bd> <74bd> 5527 <74be> <74be> 12122 <74bf> <74bf> 5365 <74c0> <74c0> 12119 <74c1> <74c1> 12121 <74c2> <74c2> 12125 <74c3> <74c3> 12483 <74c5> <74c5> 12481 <74c8> <74c8> 17077 <74ca> <74ca> 5528 <74cb> <74cb> 12480 <74cc> <74cc> 15070 <74cf> <74cf> 5665 <74d0> <74d0> 15003 <74d3> <74d3> 18170 <74d4> <74d4> 5758 <74d5> <74d5> 13202 <74d6> <74d6> 5757 <74d7> <74d7> 13204 <74d8> <74d8> 13201 <74d9> <74d9> 13203 <74da> <74da> 5886 <74db> <74db> 13453 <74dc> <74dc> 856 <74dd> <74dd> 6669 <74de> <74df> 7498 <74e0> <74e0> 2854 <74e1> <74e1> 9384 <74e2> <74e2> 4863 <74e3> <74e3> 5529 <74e4> <74e4> 5835 <74e5> <74e5> 13454 <74e6> <74e6> 857 endcidrange 100 begincidrange <74e7> <74e7> 16382 <74e8> <74e8> 6670 <74e9> <74e9> 288 <74ec> <74ec> 7054 <74ee> <74ee> 7055 <74f0> <74f0> 16358 <74f1> <74f1> 16283 <74f2> <74f2> 16351 <74f4> <74f5> 7500 <74f6> <74f7> 2855 <74f8> <74f8> 16372 <74fb> <74fb> 8736 <74fd> <74fd> 9387 <74fe> <74fe> 9386 <74ff> <74ff> 9385 <7500> <7500> 10034 <7502> <7503> 10035 <7504> <7504> 4145 <7505> <7505> 16350 <7507> <7507> 10622 <7508> <7508> 10621 <750b> <750b> 11218 <750c> <750d> 4864 <750e> <750e> 17079 <750f> <750f> 11697 <7510> <7512> 11694 <7513> <7513> 12127 <7514> <7514> 12126 <7515> <7515> 5366 <7516> <7516> 12484 <7517> <7517> 13027 <7518> <7518> 858 <7519> <7519> 17795 <751a> <751a> 1951 <751c> <751c> 2857 <751d> <751d> 9388 <751e> <751e> 17080 <751f> <751f> 859 <7521> <7521> 7502 <7522> <7522> 2858 <7525> <7526> 3299 <7528> <7529> 860 <752a> <752a> 6159 <752b> <752b> 1265 <752c> <752c> 1264 <752d> <752d> 1952 <752e> <752e> 7056 <752f> <752f> 8737 <7530> <7533> 862 <7534> <7534> 16007 <7535> <7535> 17754 <7537> <7538> 1266 <7539> <7539> 6355 <753a> <753a> 6354 <753b> <753b> 15867 <753d> <753d> 1621 <753e> <753e> 6673 <753f> <7540> 6671 <7542> <7542> 17357 <7546> <7546> 16192 <7547> <7548> 7057 <754a> <754a> 17087 <754b> <754b> 1956 <754c> <754c> 1954 <754d> <754d> 17086 <754e> <754e> 1955 <754f> <754f> 1953 <7551> <7551> 15614 <7553> <7553> 16363 <7554> <7554> 2353 <7555> <7555> 15082 <7559> <7559> 2357 <755a> <755a> 2356 <755b> <755b> 7503 <755c> <755c> 2355 <755d> <755d> 2354 <755f> <755f> 7504 <7560> <7560> 15729 <7562> <7562> 2861 <7563> <7563> 8095 <7564> <7564> 8094 <7565> <7566> 2859 <7567> <7567> 17088 <756a> <756a> 3302 <756b> <756b> 3301 <756c> <756c> 8739 <756d> <756d> 18173 <756e> <756e> 17089 <756f> <756f> 8738 <7570> <7570> 2862 <7572> <7572> 18174 <7576> <7576> 3717 <7577> <7577> 9390 <7578> <7578> 3718 <7579> <7579> 9389 <757a> <757a> 16207 <757d> <757d> 10037 <757e> <757e> 10623 <757f> <757f> 4523 <7580> <7580> 11219 endcidrange 100 begincidrange <7583> <7583> 15077 <7584> <7584> 11698 <7586> <7586> 5531 <7587> <7587> 5530 <758a> <758a> 5836 <758b> <758b> 866 <758c> <758c> 6674 <758d> <758d> 18175 <758e> <758e> 17093 <758f> <758f> 2863 <7590> <7590> 10038 <7591> <7591> 4146 <7592> <7592> 558 <7594> <7595> 6356 <7598> <7598> 6675 <7599> <759a> 1623 <759d> <759d> 1622 <759e> <759e> 17095 <75a2> <75a3> 1960 <75a4> <75a5> 1958 <75a7> <75a7> 7059 <75aa> <75aa> 7060 <75ab> <75ab> 1957 <75b0> <75b0> 7505 <75b1> <75b1> 16045 <75b2> <75b3> 2361 <75b4> <75b4> 17096 <75b5> <75b5> 2866 <75b6> <75b6> 7511 <75b8> <75b8> 2367 <75b9> <75b9> 2365 <75ba> <75ba> 7512 <75bb> <75bb> 7507 <75bc> <75bc> 2364 <75bd> <75bd> 2363 <75be> <75be> 2358 <75bf> <75bf> 7510 <75c0> <75c0> 7509 <75c1> <75c1> 7506 <75c2> <75c2> 2366 <75c3> <75c3> 16275 <75c4> <75c4> 7508 <75c5> <75c5> 2359 <75c7> <75c7> 2360 <75c8> <75c8> 18177 <75ca> <75ca> 2867 <75cb> <75cc> 8099 <75cd> <75cd> 2868 <75ce> <75ce> 8096 <75cf> <75cf> 8098 <75d0> <75d0> 8102 <75d1> <75d1> 8101 <75d2> <75d2> 8097 <75d4> <75d5> 2864 <75d7> <75d7> 8747 <75d8> <75d8> 3307 <75d9> <75d9> 3306 <75da> <75da> 8741 <75db> <75db> 3304 <75dc> <75dc> 17358 <75dd> <75dd> 8744 <75de> <75de> 3308 <75df> <75df> 8745 <75e0> <75e0> 3309 <75e1> <75e1> 8742 <75e2> <75e2> 3303 <75e3> <75e3> 3305 <75e4> <75e4> 8746 <75e6> <75e6> 8743 <75e7> <75e7> 8740 <75ed> <75ed> 9403 <75ef> <75ef> 9392 <75f0> <75f0> 3720 <75f1> <75f1> 3723 <75f2> <75f2> 3722 <75f3> <75f3> 3727 <75f4> <75f4> 3726 <75f5> <75f5> 9404 <75f6> <75f6> 9402 <75f7> <75f7> 9395 <75f8> <75f8> 9399 <75f9> <75f9> 9398 <75fa> <75fa> 3724 <75fb> <75fb> 9401 <75fc> <75fc> 9397 <75fd> <75fd> 9405 <75fe> <75fe> 9396 <75ff> <75ff> 3725 <7600> <7600> 3719 <7601> <7601> 3721 <7602> <7602> 17097 <7603> <7603> 9394 <7607> <7607> 16271 <7608> <7608> 10040 <7609> <7609> 4150 <760a> <760a> 10044 <760b> <760b> 4149 <760c> <760c> 10041 <760d> <760d> 4148 <760f> <760f> 9393 endcidrange 100 begincidrange <7610> <7610> 9400 <7611> <7611> 10043 <7613> <7613> 4151 <7614> <7614> 10045 <7615> <7615> 10042 <7616> <7616> 10039 <7619> <7619> 10626 <761a> <761a> 10630 <761b> <761b> 10632 <761c> <761c> 10628 <761d> <761d> 10627 <761e> <761e> 10625 <761f> <761f> 4526 <7620> <7620> 4524 <7621> <7622> 4529 <7623> <7623> 10629 <7624> <7624> 4527 <7625> <7625> 10624 <7626> <7626> 4528 <7627> <7627> 4147 <7628> <7628> 10631 <7629> <7629> 4525 <762c> <762c> 17098 <762d> <762d> 11221 <762f> <762f> 11220 <7630> <7630> 11228 <7631> <7631> 11222 <7632> <7632> 11227 <7633> <7633> 11224 <7634> <7634> 4866 <7635> <7635> 11226 <7638> <7638> 4867 <763a> <763a> 4868 <763b> <763b> 15984 <763c> <763c> 11225 <763d> <763d> 11223 <7640> <7640> 16102 <7642> <7642> 5141 <7643> <7643> 11699 <7646> <7646> 5140 <7647> <7647> 11702 <7648> <7649> 11700 <764c> <764c> 5142 <764d> <764d> 18178 <764e> <764e> 15986 <764f> <764f> 17100 <7650> <7650> 12131 <7651> <7651> 17099 <7652> <7652> 5369 <7653> <7653> 12132 <7654> <7654> 16112 <7656> <7656> 5367 <7657> <7657> 12133 <7658> <7658> 5368 <7659> <7659> 12130 <765a> <765a> 12134 <765c> <765c> 12128 <765f> <765f> 5532 <7660> <7660> 12485 <7661> <7661> 5533 <7662> <7662> 5666 <7664> <7664> 12129 <7665> <7665> 5667 <7666> <7666> 16042 <7667> <7667> 16297 <7669> <7669> 5759 <766a> <766a> 13028 <766c> <766c> 5838 <766d> <766d> 13205 <766e> <766e> 5837 <766f> <766f> 17101 <7670> <7670> 13352 <7671> <7672> 5923 <7673> <7673> 15083 <7674> <7674> 18179 <7675> <7675> 13635 <7676> <7676> 559 <7678> <7678> 1962 <7679> <7679> 7061 <767a> <767a> 18181 <767b> <767c> 3310 <767d> <767d> 867 <767e> <767e> 1013 <767f> <767f> 6160 <7680> <7680> 17363 <7681> <7681> 6358 <7682> <7682> 1268 <7684> <7684> 1625 <7686> <7688> 1963 <7689> <7689> 8104 <768a> <768a> 7513 <768b> <768b> 2368 <768c> <768c> 17364 <768e> <768e> 2869 <768f> <768f> 8103 <7690> <7690> 17104 <7692> <7692> 8749 <7693> <7693> 3313 <7695> <7695> 8748 <7696> <7696> 3312 endcidrange 100 begincidrange <7699> <7699> 9406 <769a> <769a> 4531 <769b> <769b> 10636 <769c> <769e> 10633 <76a1> <76a1> 17109 <76a4> <76a4> 11703 <76a5> <76a5> 17110 <76a6> <76a6> 12135 <76aa> <76aa> 12795 <76ab> <76ab> 12794 <76ad> <76ad> 13206 <76ae> <76ae> 868 <76af> <76af> 6676 <76b0> <76b0> 2369 <76b4> <76b4> 3314 <76b5> <76b5> 9407 <76b7> <76b7> 17111 <76b8> <76b8> 10046 <76ba> <76ba> 4532 <76bb> <76bb> 11229 <76bd> <76bd> 12136 <76be> <76be> 12796 <76bf> <76bf> 869 <76c2> <76c2> 1626 <76c3> <76c3> 1968 <76c4> <76c4> 7062 <76c5> <76c5> 1969 <76c6> <76c6> 1967 <76c8> <76c8> 1966 <76c9> <76c9> 7514 <76ca> <76ca> 2370 <76cc> <76cc> 17112 <76cd> <76ce> 2371 <76d2> <76d2> 2871 <76d3> <76d3> 8105 <76d4> <76d4> 2870 <76d6> <76d6> 16213 <76da> <76da> 8750 <76db> <76db> 2872 <76dc> <76dc> 3315 <76dd> <76dd> 9408 <76de> <76df> 3728 <76e1> <76e1> 4152 <76e3> <76e3> 4153 <76e4> <76e4> 4533 <76e5> <76e5> 4870 <76e6> <76e6> 11230 <76e7> <76e7> 4869 <76e9> <76e9> 11704 <76ea> <76ea> 5143 <76ec> <76ec> 12137 <76ed> <76ed> 12797 <76ee> <76ee> 870 <76ef> <76ef> 1269 <76f0> <76f0> 6679 <76f1> <76f1> 6678 <76f2> <76f2> 1627 <76f3> <76f3> 6677 <76f4> <76f4> 1628 <76f5> <76f5> 6680 <76f7> <76f7> 7068 <76f8> <76f8> 1972 <76f9> <76f9> 1971 <76fa> <76fa> 7070 <76fb> <76fb> 7069 <76fc> <76fc> 1976 <76fe> <76fe> 1975 <7701> <7701> 1970 <7703> <7705> 7064 <7707> <7707> 1977 <7708> <7708> 7063 <7709> <7709> 1973 <770a> <770a> 7067 <770b> <770b> 1974 <770c> <770c> 15714 <770e> <770f> 15106 <7710> <7710> 7517 <7711> <7711> 7521 <7712> <7712> 7519 <7713> <7713> 7518 <7715> <7715> 7522 <7719> <771a> 7523 <771b> <771b> 7516 <771d> <771d> 7515 <771e> <771e> 17118 <771f> <7720> 2374 <7722> <7722> 7525 <7723> <7723> 7520 <7724> <7724> 16360 <7725> <7725> 8114 <7726> <7726> 17119 <7727> <7727> 7526 <7728> <7728> 2376 <7729> <7729> 2373 <772b> <772b> 16371 <772d> <772d> 8108 <772f> <772f> 8107 <7731> <7732> 8109 <7733> <7733> 8112 <7734> <7734> 8111 endcidrange 100 begincidrange <7735> <7735> 8116 <7736> <7736> 2876 <7737> <7737> 2873 <7738> <7738> 2877 <7739> <7739> 8106 <773a> <773a> 2878 <773b> <773b> 8115 <773c> <773c> 2875 <773d> <773d> 8113 <773e> <773e> 2874 <7740> <7740> 17120 <7743> <7743> 18186 <7744> <7744> 8753 <7745> <7745> 8755 <7746> <7747> 8751 <774a> <774a> 8756 <774b> <774c> 8758 <774d> <774d> 8754 <774e> <774e> 8757 <774f> <774f> 3316 <7752> <7752> 9412 <7754> <7754> 9417 <7755> <7755> 9409 <7756> <7756> 9413 <7758> <7758> 17123 <7759> <7759> 9418 <775a> <775a> 9414 <775b> <775b> 3730 <775c> <775c> 3738 <775e> <775e> 3733 <775f> <7760> 9410 <7761> <7761> 4157 <7762> <7762> 3741 <7763> <7763> 3734 <7765> <7765> 3739 <7766> <7766> 3732 <7767> <7767> 9416 <7768> <7768> 3740 <7769> <7769> 9415 <776a> <776a> 3736 <776b> <776b> 3731 <776c> <776c> 3737 <776d> <776d> 9419 <776e> <776e> 10051 <776f> <776f> 10053 <7772> <7772> 14699 <7777> <7777> 18089 <7778> <7778> 15104 <7779> <7779> 3735 <777a> <777a> 17175 <777b> <777b> 15108 <777c> <777c> 10048 <777d> <777d> 4155 <777e> <777e> 10054 <777f> <777f> 4156 <7780> <7780> 10052 <7781> <7781> 10047 <7782> <7782> 10050 <7783> <7783> 10055 <7784> <7784> 4154 <7785> <7785> 10049 <7787> <7787> 4535 <7788> <7788> 10640 <7789> <7789> 10639 <778b> <778b> 4538 <778c> <778c> 4536 <778d> <778d> 10637 <778e> <778e> 4534 <778f> <778f> 10638 <7791> <7791> 4537 <7793> <7793> 14381 <7795> <7795> 11238 <7797> <7797> 11240 <7798> <7798> 18190 <7799> <7799> 11239 <779a> <779a> 11231 <779b> <779b> 11235 <779c> <779c> 11234 <779d> <779d> 11232 <779e> <779f> 4872 <77a0> <77a0> 4871 <77a1> <77a1> 11233 <77a2> <77a3> 11236 <77a5> <77a5> 4874 <77a7> <77a7> 5148 <77a8> <77a8> 11712 <77aa> <77aa> 5145 <77ab> <77ab> 11706 <77ac> <77ac> 5147 <77ad> <77ad> 5149 <77af> <77af> 17125 <77b0> <77b0> 5146 <77b1> <77b1> 11711 <77b2> <77b2> 11707 <77b3> <77b3> 5144 <77b4> <77b4> 11710 <77b5> <77b5> 11705 <77b6> <77b6> 11709 <77b7> <77b7> 11708 <77b9> <77b9> 15987 endcidrange 100 begincidrange <77ba> <77ba> 12139 <77bb> <77bc> 5372 <77bd> <77bd> 5370 <77be> <77be> 18193 <77bf> <77bf> 5371 <77c2> <77c2> 12138 <77c3> <77c3> 15281 <77c4> <77c4> 12488 <77c5> <77c5> 16833 <77c7> <77c7> 5534 <77c9> <77ca> 12486 <77cb> <77cb> 18194 <77cc> <77cc> 12798 <77cd> <77cd> 12801 <77ce> <77cf> 12799 <77d0> <77d0> 13029 <77d3> <77d3> 5760 <77d4> <77d4> 13353 <77d5> <77d5> 13455 <77d7> <77d7> 5925 <77d8> <77d9> 13523 <77da> <77da> 5971 <77db> <77db> 871 <77dc> <77dc> 1978 <77de> <77de> 8760 <77e0> <77e0> 9420 <77e2> <77e2> 872 <77e3> <77e3> 1270 <77e5> <77e5> 1629 <77e6> <77e6> 16513 <77e7> <77e8> 7071 <77e9> <77e9> 2377 <77ec> <77ec> 8761 <77ed> <77ed> 3317 <77ee> <77ee> 3742 <77ef> <77ef> 5150 <77f0> <77f0> 11713 <77f1> <77f1> 12489 <77f2> <77f2> 12802 <77f3> <77f3> 873 <77f4> <77f4> 17129 <77f7> <77f7> 6686 <77f8> <77f8> 6681 <77f9> <77f9> 6683 <77fa> <77fa> 6685 <77fb> <77fb> 6684 <77fc> <77fc> 6682 <77fd> <77fd> 1630 <77fe> <77fe> 16341 <7802> <7802> 1979 <7803> <7803> 7081 <7805> <7805> 7076 <7806> <7806> 7073 <7808> <7808> 15942 <7809> <7809> 7080 <780c> <780d> 1981 <780e> <780e> 7079 <780f> <780f> 7078 <7810> <7810> 7077 <7811> <7812> 7074 <7813> <7813> 7082 <7814> <7814> 1980 <7818> <7818> 18195 <781c> <781c> 18196 <781d> <781d> 2381 <781e> <781e> 15123 <781f> <781f> 2387 <7820> <7820> 2386 <7821> <7821> 7535 <7822> <7822> 7529 <7823> <7823> 7527 <7825> <7825> 2384 <7826> <7826> 8123 <7827> <7827> 2379 <7828> <7828> 7532 <7829> <7829> 7536 <782a> <782a> 7538 <782b> <782b> 7534 <782c> <782c> 7528 <782d> <782d> 2385 <782e> <782e> 7533 <782f> <782f> 7531 <7830> <7830> 2378 <7831> <7831> 7539 <7832> <7832> 2388 <7833> <7833> 7537 <7834> <7834> 2382 <7835> <7835> 7530 <7837> <7837> 2383 <7838> <7838> 2380 <7839> <7839> 17366 <783c> <783c> 16410 <783d> <783d> 15466 <7842> <7842> 15044 <7843> <7843> 2880 <7844> <7844> 15403 <7845> <7845> 8124 <7847> <7847> 18197 <7848> <7848> 8117 <7849> <7849> 8119 endcidrange 100 begincidrange <784a> <784a> 8121 <784b> <784b> 15469 <784c> <784c> 8122 <784d> <784d> 8120 <784e> <784e> 2881 <7850> <7850> 8125 <7851> <7851> 18198 <7852> <7852> 8118 <7853> <7853> 16277 <7854> <7854> 15467 <785c> <785c> 8765 <785d> <785d> 3318 <785e> <785e> 8773 <7860> <7860> 8762 <7862> <7862> 8774 <7864> <7865> 8763 <7866> <7866> 18199 <7868> <7868> 8772 <7869> <7869> 8771 <786a> <786a> 8768 <786b> <786b> 2879 <786c> <786c> 3319 <786d> <786d> 8766 <786e> <786e> 8769 <786f> <786f> 3320 <7870> <7870> 8770 <7871> <7871> 8767 <7879> <7879> 9431 <787a> <787a> 16105 <787b> <787b> 9435 <787c> <787c> 3749 <787e> <787e> 10061 <787f> <787f> 3752 <7880> <7880> 9433 <7881> <7881> 14056 <7883> <7883> 9430 <7884> <7884> 9425 <7885> <7886> 9427 <7887> <7887> 9421 <7888> <7888> 15125 <7889> <7889> 3748 <788c> <788c> 3747 <788d> <788d> 15124 <788e> <788e> 3743 <788f> <788f> 9424 <7891> <7891> 3750 <7893> <7893> 3751 <7894> <7894> 9423 <7895> <7895> 9426 <7896> <7896> 9434 <7897> <7898> 3745 <7899> <7899> 9432 <789a> <789a> 9422 <789e> <789e> 10063 <789f> <789f> 4159 <78a0> <78a0> 10065 <78a1> <78a1> 9429 <78a2> <78a2> 10067 <78a3> <78a3> 4163 <78a4> <78a4> 10068 <78a5> <78a5> 10064 <78a7> <78a7> 4160 <78a8> <78a8> 10060 <78a9> <78a9> 4162 <78aa> <78aa> 10057 <78ab> <78ab> 10062 <78ac> <78ac> 10066 <78ad> <78ad> 10059 <78af> <78af> 17132 <78b0> <78b0> 3744 <78b1> <78b1> 17140 <78b2> <78b2> 10056 <78b3> <78b3> 4161 <78b4> <78b4> 10058 <78b6> <78b6> 15468 <78b8> <78b8> 17777 <78b9> <78b9> 15459 <78ba> <78ba> 4541 <78bb> <78bb> 10642 <78bc> <78bc> 4545 <78be> <78be> 4543 <78c1> <78c1> 4158 <78c3> <78c4> 10649 <78c5> <78c5> 4540 <78c7> <78c7> 17133 <78c8> <78c8> 10648 <78c9> <78c9> 10651 <78ca> <78ca> 4542 <78cb> <78cb> 4539 <78cc> <78cc> 10644 <78cd> <78cd> 10641 <78ce> <78ce> 10646 <78cf> <78cf> 10643 <78d0> <78d0> 4546 <78d1> <78d1> 10645 <78d2> <78d2> 15126 <78d3> <78d3> 17134 <78d4> <78d4> 10647 <78d5> <78d5> 4544 <78d7> <78d7> 17138 endcidrange 100 begincidrange <78d8> <78d8> 16268 <78da> <78da> 4876 <78db> <78db> 11247 <78dd> <78dd> 11241 <78de> <78de> 11245 <78df> <78e0> 11251 <78e1> <78e2> 11248 <78e3> <78e3> 11246 <78e5> <78e5> 11243 <78e7> <78e7> 4878 <78e8> <78e8> 4875 <78e9> <78e9> 11242 <78ea> <78ea> 11244 <78ec> <78ec> 4877 <78ed> <78ed> 11250 <78ee> <78ee> 14977 <78ef> <78ef> 5154 <78f0> <78f0> 15162 <78f1> <78f1> 16574 <78f2> <78f2> 11720 <78f3> <78f3> 11714 <78f4> <78f4> 5153 <78f5> <78f5> 14515 <78f7> <78f7> 5151 <78f9> <78f9> 11722 <78fa> <78fa> 5152 <78fb> <78fc> 11717 <78fd> <78fd> 11715 <78fe> <78fe> 11723 <78ff> <78ff> 11719 <7901> <7901> 5155 <7902> <7902> 11716 <7904> <7904> 11724 <7905> <7905> 11721 <7906> <7906> 16335 <7909> <7909> 12143 <790c> <790c> 12140 <790e> <790e> 5374 <7910> <7910> 12144 <7911> <7911> 12146 <7912> <7912> 12145 <7913> <7914> 12141 <7917> <7917> 12494 <7919> <7919> 5535 <791b> <791b> 12491 <791c> <791c> 12493 <791d> <791d> 12490 <791e> <791e> 12495 <7921> <7921> 12492 <7923> <7923> 12804 <7924> <7924> 12807 <7925> <7925> 12803 <7926> <7926> 5668 <7927> <7928> 12805 <7929> <7929> 12808 <792a> <792a> 5669 <792b> <792b> 5671 <792c> <792c> 5670 <792d> <792d> 13030 <792e> <792e> 17136 <792f> <792f> 13032 <7931> <7931> 13031 <7932> <7932> 18203 <7933> <7933> 18202 <7934> <7934> 17139 <7935> <7935> 13207 <7936> <7936> 14211 <7938> <7938> 13456 <7939> <7939> 13525 <793a> <793a> 874 <793b> <793b> 17655 <793c> <793c> 17152 <793d> <793d> 6359 <793e> <793e> 1631 <793f> <793f> 6688 <7940> <7941> 1632 <7942> <7942> 6687 <7944> <7944> 7087 <7945> <7945> 7086 <7946> <7946> 1983 <7947> <7947> 1986 <7948> <7948> 1985 <7949> <7949> 1984 <794a> <794a> 7083 <794b> <794b> 7085 <794c> <794c> 7084 <794f> <794f> 7542 <7950> <7950> 2390 <7951> <7951> 7546 <7952> <7952> 7545 <7953> <7953> 7544 <7954> <7954> 7540 <7955> <7955> 2389 <7956> <7956> 2393 <7957> <7957> 2396 <7958> <7958> 14309 <7959> <7959> 15128 <795a> <795a> 2397 <795b> <795b> 7541 <795c> <795c> 7543 endcidrange 100 begincidrange <795d> <795d> 2395 <795e> <795e> 2394 <795f> <795f> 2392 <7960> <7960> 2391 <7961> <7961> 8132 <7962> <7962> 15997 <7963> <7963> 8130 <7964> <7964> 8126 <7965> <7965> 2882 <7967> <7967> 8127 <7968> <7968> 2883 <7969> <796a> 8128 <796b> <796b> 8131 <796d> <796d> 2884 <7970> <7970> 8778 <7971> <7971> 16744 <7972> <7972> 8777 <7973> <7973> 8776 <7974> <7974> 8775 <7979> <7979> 9439 <797a> <797a> 3753 <797c> <797c> 9436 <797d> <797d> 9438 <797e> <797e> 15910 <797f> <797f> 3754 <7980> <7980> 17148 <7981> <7981> 3755 <7982> <7982> 9437 <7983> <7983> 15862 <7986> <7986> 17145 <7987> <7987> 17800 <7988> <7988> 10077 <798a> <798b> 10070 <798d> <798d> 4166 <798e> <798f> 4164 <7990> <7990> 10079 <7991> <7991> 18205 <7992> <7992> 10078 <7993> <7993> 10075 <7994> <7994> 10074 <7995> <7995> 10073 <7996> <7996> 10072 <7997> <7997> 10076 <7998> <7998> 10069 <7999> <7999> 17404 <799a> <799a> 10652 <799b> <799b> 10657 <799c> <799c> 10655 <799d> <799d> 17150 <799f> <799f> 14686 <79a0> <79a0> 10654 <79a1> <79a1> 10653 <79a2> <79a2> 10656 <79a4> <79a4> 11253 <79a5> <79a5> 15134 <79a6> <79a6> 4879 <79a7> <79a7> 5156 <79a8> <79a8> 11726 <79a9> <79a9> 17153 <79aa> <79aa> 5157 <79ab> <79ab> 11725 <79ac> <79ac> 12148 <79ad> <79ad> 12147 <79ae> <79ae> 5375 <79b0> <79b0> 12496 <79b1> <79b1> 5536 <79b2> <79b2> 12809 <79b3> <79b3> 5839 <79b4> <79b4> 13208 <79b6> <79b6> 13458 <79b7> <79b7> 13457 <79b8> <79b8> 6066 <79b9> <79ba> 1987 <79bb> <79bb> 8133 <79bd> <79bd> 3757 <79be> <79be> 875 <79bf> <79bf> 1273 <79c0> <79c0> 1272 <79c1> <79c1> 1271 <79c4> <79c4> 15565 <79c5> <79c5> 6689 <79c6> <79c6> 17157 <79c8> <79c8> 1635 <79c9> <79c9> 1634 <79cb> <79cb> 1991 <79cc> <79cc> 16947 <79cd> <79cd> 7089 <79ce> <79ce> 7092 <79cf> <79cf> 7090 <79d1> <79d2> 1989 <79d4> <79d4> 17159 <79d5> <79d5> 7088 <79d6> <79d6> 7091 <79d8> <79d8> 2404 <79dc> <79dc> 7553 <79dd> <79dd> 7555 <79de> <79de> 7554 <79df> <79df> 2401 <79e0> <79e0> 7549 <79e2> <79e2> 15450 endcidrange 100 begincidrange <79e3> <79e3> 2399 <79e4> <79e4> 2398 <79e6> <79e6> 2402 <79e7> <79e7> 2400 <79e9> <79e9> 2403 <79ea> <79ea> 7552 <79eb> <79ec> 7547 <79ed> <79ed> 7551 <79ee> <79ee> 7550 <79f1> <79f1> 15143 <79f4> <79f4> 15138 <79f6> <79f7> 8136 <79f8> <79f8> 8135 <79fa> <79fa> 8134 <79fb> <79fb> 2885 <7a00> <7a00> 3325 <7a02> <7a02> 8779 <7a03> <7a03> 8781 <7a04> <7a04> 8783 <7a05> <7a05> 3324 <7a06> <7a06> 18206 <7a08> <7a08> 3322 <7a0a> <7a0a> 8780 <7a0b> <7a0b> 3323 <7a0c> <7a0c> 8782 <7a0d> <7a0d> 3321 <7a10> <7a10> 9449 <7a11> <7a11> 9440 <7a12> <7a12> 9443 <7a13> <7a13> 9447 <7a14> <7a14> 3761 <7a15> <7a15> 9445 <7a17> <7a17> 9444 <7a18> <7a19> 9441 <7a1a> <7a1a> 3759 <7a1b> <7a1b> 9448 <7a1c> <7a1c> 3758 <7a1e> <7a1e> 3763 <7a1f> <7a1f> 3762 <7a20> <7a20> 3760 <7a22> <7a22> 9446 <7a26> <7a26> 10085 <7a28> <7a28> 10084 <7a2b> <7a2b> 10080 <7a2d> <7a2d> 16346 <7a2e> <7a2e> 4167 <7a2f> <7a2f> 10083 <7a30> <7a30> 10082 <7a31> <7a31> 4168 <7a37> <7a37> 4551 <7a39> <7a39> 10659 <7a3a> <7a3a> 15137 <7a3b> <7a3b> 4552 <7a3c> <7a3c> 4548 <7a3d> <7a3d> 4550 <7a3e> <7a3e> 16267 <7a3f> <7a3f> 4547 <7a40> <7a40> 4549 <7a43> <7a43> 14700 <7a44> <7a44> 11254 <7a45> <7a45> 15857 <7a46> <7a46> 4882 <7a47> <7a47> 11256 <7a48> <7a48> 11255 <7a49> <7a49> 14131 <7a4a> <7a4a> 10081 <7a4b> <7a4b> 4884 <7a4c> <7a4c> 4883 <7a4d> <7a4e> 4880 <7a54> <7a54> 11731 <7a56> <7a56> 11729 <7a57> <7a57> 5158 <7a58> <7a58> 11730 <7a5a> <7a5a> 11732 <7a5b> <7a5b> 11728 <7a5c> <7a5c> 11727 <7a5f> <7a5f> 12149 <7a60> <7a60> 5378 <7a61> <7a62> 5376 <7a65> <7a65> 14134 <7a67> <7a68> 12497 <7a69> <7a69> 5538 <7a6b> <7a6b> 5537 <7a6c> <7a6d> 12811 <7a6e> <7a6e> 12810 <7a70> <7a71> 13209 <7a74> <7a74> 876 <7a75> <7a75> 6161 <7a76> <7a76> 1274 <7a78> <7a78> 6690 <7a79> <7a79> 1637 <7a7a> <7a7a> 1636 <7a7b> <7a7b> 6691 <7a7d> <7a7d> 14135 <7a7e> <7a7e> 7094 <7a7f> <7a7f> 1992 <7a80> <7a80> 7093 <7a81> <7a81> 1993 <7a83> <7a83> 15741 <7a84> <7a84> 2405 endcidrange 100 begincidrange <7a85> <7a85> 7558 <7a86> <7a86> 7556 <7a87> <7a87> 7562 <7a88> <7a88> 2406 <7a89> <7a89> 7557 <7a8a> <7a8a> 7561 <7a8b> <7a8c> 7559 <7a8f> <7a8f> 8138 <7a90> <7a90> 8140 <7a91> <7a91> 17368 <7a92> <7a92> 2886 <7a94> <7a94> 8139 <7a95> <7a95> 2887 <7a96> <7a96> 3328 <7a97> <7a97> 3327 <7a98> <7a98> 3326 <7a99> <7a99> 8784 <7a9e> <7a9e> 9452 <7a9f> <7aa0> 3764 <7aa2> <7aa2> 9451 <7aa3> <7aa3> 9450 <7aa8> <7aa8> 10086 <7aa9> <7aa9> 4170 <7aaa> <7aaa> 4169 <7aab> <7aac> 10087 <7aae> <7aae> 4554 <7aaf> <7aaf> 4553 <7ab0> <7ab0> 14138 <7ab1> <7ab1> 11260 <7ab2> <7ab2> 10660 <7ab3> <7ab3> 10662 <7ab4> <7ab4> 10661 <7ab5> <7ab5> 11259 <7ab6> <7ab6> 11257 <7ab7> <7ab7> 11261 <7ab8> <7ab8> 11258 <7aba> <7aba> 4885 <7abb> <7abb> 14137 <7abc> <7abc> 18209 <7abe> <7abe> 11733 <7abf> <7abf> 5159 <7ac0> <7ac1> 11734 <7ac2> <7ac3> 14139 <7ac4> <7ac5> 5379 <7ac7> <7ac7> 5672 <7ac8> <7ac8> 15743 <7ac9> <7ac9> 17776 <7aca> <7aca> 5887 <7acb> <7acb> 877 <7acf> <7acf> 18212 <7ad1> <7ad1> 7095 <7ad3> <7ad3> 16266 <7ad8> <7ad8> 7563 <7ad9> <7ad9> 2407 <7ada> <7ada> 14144 <7adb> <7adb> 18213 <7adc> <7adc> 14673 <7add> <7add> 14145 <7adf> <7adf> 3038 <7ae0> <7ae0> 3037 <7ae2> <7ae2> 15155 <7ae3> <7ae3> 3330 <7ae4> <7ae4> 8786 <7ae5> <7ae5> 3329 <7ae6> <7ae6> 8785 <7ae7> <7ae7> 14429 <7ae9> <7ae9> 14385 <7aea> <7aea> 14146 <7aeb> <7aeb> 9453 <7aed> <7aed> 4171 <7aee> <7aee> 10089 <7aef> <7aef> 4172 <7af6> <7af6> 5673 <7af7> <7af7> 12813 <7af9> <7af9> 1014 <7afa> <7afa> 1638 <7afb> <7afb> 6692 <7afd> <7afd> 1995 <7afe> <7afe> 15165 <7aff> <7aff> 1994 <7b00> <7b01> 7096 <7b04> <7b04> 7565 <7b05> <7b05> 7567 <7b06> <7b06> 2408 <7b08> <7b08> 7569 <7b09> <7b09> 7572 <7b0a> <7b0a> 7570 <7b0b> <7b0b> 14150 <7b0c> <7b0c> 15203 <7b0e> <7b0e> 7571 <7b0f> <7b0f> 7568 <7b10> <7b10> 7564 <7b11> <7b11> 2409 <7b12> <7b12> 7573 <7b13> <7b13> 7566 <7b14> <7b14> 16247 <7b18> <7b18> 8149 <7b19> <7b19> 2893 <7b1a> <7b1a> 8158 <7b1b> <7b1b> 2890 endcidrange 100 begincidrange <7b1d> <7b1d> 8151 <7b1e> <7b1e> 2894 <7b1f> <7b1f> 16145 <7b20> <7b20> 2888 <7b22> <7b22> 8146 <7b23> <7b23> 8159 <7b24> <7b24> 8147 <7b25> <7b25> 8144 <7b26> <7b26> 2892 <7b27> <7b27> 15199 <7b28> <7b28> 2889 <7b29> <7b29> 14152 <7b2a> <7b2a> 8150 <7b2b> <7b2b> 8153 <7b2c> <7b2c> 2891 <7b2d> <7b2d> 8154 <7b2e> <7b2e> 2895 <7b2f> <7b2f> 8155 <7b30> <7b30> 8145 <7b31> <7b31> 8152 <7b32> <7b32> 8156 <7b33> <7b33> 8148 <7b34> <7b34> 8143 <7b35> <7b35> 8141 <7b38> <7b38> 8157 <7b39> <7b39> 15726 <7b3b> <7b3b> 8142 <7b40> <7b40> 8793 <7b42> <7b42> 15853 <7b43> <7b43> 15909 <7b44> <7b44> 8789 <7b45> <7b45> 8795 <7b46> <7b46> 3333 <7b47> <7b47> 8788 <7b48> <7b48> 8790 <7b49> <7b49> 3331 <7b4a> <7b4a> 8787 <7b4b> <7b4b> 3338 <7b4c> <7b4c> 8791 <7b4d> <7b4d> 3337 <7b4e> <7b4e> 8792 <7b4f> <7b4f> 3339 <7b50> <7b50> 3334 <7b51> <7b51> 3340 <7b52> <7b52> 3335 <7b54> <7b54> 3336 <7b55> <7b55> 14151 <7b56> <7b56> 3332 <7b58> <7b58> 8794 <7b60> <7b60> 3768 <7b61> <7b61> 9464 <7b62> <7b62> 18215 <7b63> <7b63> 9467 <7b64> <7b64> 9455 <7b65> <7b65> 9460 <7b66> <7b66> 9454 <7b67> <7b67> 3770 <7b69> <7b69> 9458 <7b6c> <7b6c> 18216 <7b6d> <7b6d> 9456 <7b6e> <7b6e> 3769 <7b6f> <7b6f> 14156 <7b70> <7b70> 9463 <7b71> <7b71> 9462 <7b72> <7b72> 9459 <7b73> <7b73> 9461 <7b74> <7b74> 9457 <7b75> <7b75> 4176 <7b76> <7b76> 9466 <7b77> <7b77> 3766 <7b78> <7b78> 9465 <7b7b> <7b7b> 18217 <7b82> <7b82> 10105 <7b84> <7b84> 4183 <7b85> <7b85> 10100 <7b87> <7b87> 4182 <7b88> <7b88> 10090 <7b8a> <7b8a> 10092 <7b8b> <7b8b> 4175 <7b8c> <7b8c> 10097 <7b8d> <7b8d> 10096 <7b8e> <7b8e> 10099 <7b8f> <7b8f> 4180 <7b90> <7b90> 10094 <7b91> <7b91> 10093 <7b92> <7b92> 14162 <7b94> <7b94> 4179 <7b95> <7b95> 4174 <7b96> <7b96> 10095 <7b97> <7b97> 4177 <7b98> <7b98> 10101 <7b99> <7b99> 10103 <7b9b> <7b9b> 10098 <7b9c> <7b9c> 10091 <7b9d> <7b9d> 4178 <7ba0> <7ba0> 4562 <7ba1> <7ba1> 4173 <7ba2> <7ba2> 14155 <7ba3> <7ba3> 16148 <7ba4> <7ba4> 10104 endcidrange 100 begincidrange <7bac> <7bac> 10666 <7bad> <7bad> 4555 <7baf> <7baf> 10668 <7bb1> <7bb1> 4556 <7bb2> <7bb2> 17948 <7bb4> <7bb4> 4558 <7bb5> <7bb5> 10671 <7bb7> <7bb7> 10663 <7bb8> <7bb8> 4181 <7bb9> <7bb9> 10669 <7bbe> <7bbe> 10665 <7bc0> <7bc0> 3767 <7bc1> <7bc1> 4561 <7bc4> <7bc4> 4557 <7bc6> <7bc7> 4559 <7bc9> <7bc9> 4888 <7bca> <7bca> 10670 <7bcb> <7bcb> 10664 <7bcc> <7bcc> 4563 <7bce> <7bce> 10667 <7bcf> <7bcf> 16152 <7bd0> <7bd0> 14160 <7bd4> <7bd4> 11271 <7bd5> <7bd5> 11266 <7bd8> <7bd8> 11276 <7bd9> <7bd9> 4886 <7bda> <7bda> 11268 <7bdb> <7bdb> 4890 <7bdc> <7bdc> 11274 <7bdd> <7bdd> 11265 <7bde> <7bde> 11262 <7bdf> <7bdf> 11277 <7be0> <7be0> 5165 <7be1> <7be1> 4891 <7be2> <7be2> 11273 <7be3> <7be3> 11263 <7be4> <7be4> 4889 <7be5> <7be5> 11267 <7be6> <7be6> 4893 <7be7> <7be7> 11264 <7be8> <7be8> 11269 <7be9> <7be9> 4892 <7bea> <7bea> 11272 <7beb> <7beb> 11275 <7bf0> <7bf1> 11753 <7bf2> <7bf2> 11738 <7bf3> <7bf3> 11745 <7bf4> <7bf4> 11743 <7bf7> <7bf7> 5163 <7bf8> <7bf8> 11750 <7bf9> <7bf9> 11270 <7bfa> <7bfa> 14167 <7bfb> <7bfb> 11741 <7bfc> <7bfc> 16159 <7bfd> <7bfd> 11751 <7bfe> <7bfe> 5162 <7bff> <7bff> 11740 <7c00> <7c00> 11739 <7c01> <7c01> 11749 <7c02> <7c02> 11746 <7c03> <7c03> 11748 <7c05> <7c05> 11736 <7c06> <7c06> 11752 <7c07> <7c07> 5160 <7c09> <7c09> 11747 <7c0a> <7c0a> 11756 <7c0b> <7c0b> 11744 <7c0c> <7c0c> 5164 <7c0d> <7c0d> 5161 <7c0e> <7c0e> 11742 <7c0f> <7c0f> 11737 <7c10> <7c10> 11755 <7c11> <7c11> 4887 <7c12> <7c12> 18218 <7c15> <7c15> 16481 <7c19> <7c19> 12152 <7c1b> <7c1b> 17369 <7c1c> <7c1c> 12150 <7c1d> <7c1d> 12156 <7c1e> <7c1e> 5384 <7c1f> <7c1f> 12154 <7c20> <7c20> 12153 <7c21> <7c21> 5386 <7c22> <7c22> 12159 <7c23> <7c23> 5385 <7c25> <7c25> 12160 <7c26> <7c26> 12157 <7c27> <7c27> 5382 <7c28> <7c28> 12158 <7c29> <7c29> 12151 <7c2a> <7c2a> 5383 <7c2b> <7c2b> 5381 <7c2c> <7c2c> 12502 <7c2d> <7c2d> 12155 <7c30> <7c30> 12161 <7c33> <7c33> 12499 <7c35> <7c35> 14169 <7c37> <7c37> 5543 <7c38> <7c38> 5541 <7c39> <7c39> 12501 endcidrange 100 begincidrange <7c3b> <7c3b> 12503 <7c3c> <7c3c> 12500 <7c3d> <7c3d> 5542 <7c3e> <7c3f> 5539 <7c40> <7c40> 5544 <7c42> <7c42> 16156 <7c43> <7c43> 5675 <7c44> <7c44> 14171 <7c45> <7c45> 12818 <7c47> <7c47> 12817 <7c48> <7c48> 12815 <7c49> <7c49> 12814 <7c4a> <7c4a> 12816 <7c4c> <7c4c> 5674 <7c4d> <7c4d> 5676 <7c50> <7c50> 5761 <7c51> <7c51> 16312 <7c53> <7c53> 13034 <7c54> <7c54> 13033 <7c56> <7c56> 16127 <7c57> <7c57> 13211 <7c59> <7c59> 13213 <7c5a> <7c5a> 13215 <7c5b> <7c5b> 13214 <7c5c> <7c5c> 13212 <7c5d> <7c5d> 15167 <7c5f> <7c5f> 5841 <7c60> <7c60> 5840 <7c63> <7c63> 5889 <7c64> <7c64> 5888 <7c65> <7c65> 5890 <7c66> <7c66> 13355 <7c67> <7c67> 13354 <7c69> <7c69> 13526 <7c6a> <7c6a> 13459 <7c6b> <7c6b> 13527 <7c6c> <7c6c> 5957 <7c6d> <7c6d> 15168 <7c6e> <7c6e> 5958 <7c6f> <7c6f> 13575 <7c70> <7c70> 16210 <7c72> <7c72> 5995 <7c73> <7c73> 1015 <7c74> <7c74> 18076 <7c75> <7c75> 6693 <7c78> <7c79> 7099 <7c7a> <7c7a> 7098 <7c7b> <7c7b> 18221 <7c7c> <7c7c> 15177 <7c7d> <7c7d> 1996 <7c7e> <7c7e> 16154 <7c7f> <7c81> 7101 <7c83> <7c83> 14172 <7c84> <7c84> 7574 <7c85> <7c85> 7580 <7c86> <7c86> 16157 <7c88> <7c88> 7578 <7c89> <7c89> 2410 <7c8a> <7c8a> 7576 <7c8c> <7c8c> 7577 <7c8d> <7c8d> 7579 <7c8e> <7c8e> 15176 <7c91> <7c91> 7575 <7c92> <7c92> 2896 <7c94> <7c94> 8160 <7c95> <7c95> 2898 <7c96> <7c96> 8162 <7c97> <7c97> 2897 <7c98> <7c98> 8161 <7c9c> <7c9c> 18222 <7c9e> <7c9e> 8797 <7c9f> <7c9f> 3341 <7ca1> <7ca1> 8799 <7ca2> <7ca2> 8796 <7ca3> <7ca3> 8163 <7ca5> <7ca5> 3342 <7ca6> <7ca6> 14174 <7ca7> <7ca7> 14061 <7ca8> <7ca8> 8798 <7cac> <7cac> 14469 <7cae> <7cae> 15178 <7caf> <7caf> 9470 <7cb1> <7cb1> 3771 <7cb2> <7cb2> 9468 <7cb3> <7cb3> 3772 <7cb4> <7cb4> 9469 <7cb5> <7cb5> 3773 <7cb8> <7cb8> 18224 <7cb9> <7cb9> 4184 <7cba> <7cba> 10109 <7cbb> <7cbb> 10106 <7cbc> <7cbc> 10108 <7cbd> <7cbe> 4185 <7cbf> <7cbf> 10107 <7cc2> <7cc2> 16343 <7cc5> <7cc5> 10672 <7cc7> <7cc7> 14177 <7cc8> <7cc8> 10673 <7cc9> <7cc9> 14176 <7cca> <7cca> 4564 endcidrange 100 begincidrange <7ccb> <7ccb> 10675 <7ccc> <7ccc> 10674 <7ccd> <7ccd> 15173 <7cce> <7cce> 289 <7cd0> <7cd1> 11281 <7cd2> <7cd2> 11278 <7cd3> <7cd3> 15708 <7cd4> <7cd4> 11279 <7cd5> <7cd6> 4894 <7cd7> <7cd7> 11280 <7cd9> <7cd9> 5171 <7cda> <7cda> 16345 <7cdc> <7cdc> 5167 <7cdd> <7cdd> 5172 <7cde> <7cde> 5168 <7cdf> <7cdf> 5170 <7ce0> <7ce0> 5166 <7ce2> <7ce2> 5169 <7ce6> <7ce6> 14178 <7ce7> <7ce7> 5387 <7ce8> <7ce8> 11757 <7cea> <7cea> 12505 <7cec> <7cec> 12504 <7ced> <7ced> 17370 <7cee> <7cee> 12819 <7cef> <7cf0> 5677 <7cf1> <7cf1> 13217 <7cf2> <7cf2> 13035 <7cf3> <7cf3> 14180 <7cf4> <7cf4> 13216 <7cf5> <7cf5> 14181 <7cf6> <7cf6> 13528 <7cf7> <7cf7> 13597 <7cf8> <7cf8> 1016 <7cf9> <7cf9> 17656 <7cfb> <7cfb> 1275 <7cfc> <7cfc> 17773 <7cfd> <7cfd> 6694 <7cfe> <7cfe> 1639 <7d00> <7d00> 1999 <7d01> <7d01> 7106 <7d02> <7d02> 1997 <7d03> <7d03> 7104 <7d04> <7d04> 2002 <7d05> <7d05> 1998 <7d06> <7d06> 2003 <7d07> <7d07> 2001 <7d08> <7d08> 7105 <7d09> <7d09> 2000 <7d0a> <7d0a> 2414 <7d0b> <7d0b> 2413 <7d0c> <7d0c> 7591 <7d0d> <7d0d> 2422 <7d0e> <7d0e> 7584 <7d0f> <7d0f> 7590 <7d10> <7d10> 2418 <7d11> <7d11> 7583 <7d12> <7d12> 7589 <7d13> <7d13> 7587 <7d14> <7d14> 2417 <7d15> <7d15> 2419 <7d16> <7d16> 7586 <7d17> <7d17> 2412 <7d18> <7d18> 7585 <7d19> <7d19> 2423 <7d1a> <7d1a> 2420 <7d1b> <7d1b> 2424 <7d1c> <7d1c> 2421 <7d1d> <7d1d> 7582 <7d1e> <7d1e> 7581 <7d1f> <7d1f> 7588 <7d20> <7d20> 2415 <7d21> <7d21> 2411 <7d22> <7d22> 2416 <7d25> <7d25> 16094 <7d28> <7d28> 8178 <7d29> <7d29> 8171 <7d2b> <7d2b> 3347 <7d2c> <7d2c> 8170 <7d2e> <7d2e> 2902 <7d2f> <7d2f> 2909 <7d30> <7d30> 2906 <7d31> <7d31> 2912 <7d32> <7d32> 2911 <7d33> <7d33> 2907 <7d35> <7d35> 8164 <7d36> <7d36> 8167 <7d38> <7d38> 8166 <7d39> <7d39> 2903 <7d3a> <7d3a> 8168 <7d3b> <7d3b> 8177 <7d3c> <7d3c> 2904 <7d3d> <7d3d> 8165 <7d3e> <7d3f> 8174 <7d40> <7d40> 2905 <7d41> <7d41> 8172 <7d42> <7d42> 2910 <7d43> <7d43> 2900 <7d44> <7d44> 2908 <7d45> <7d45> 8169 endcidrange 100 begincidrange <7d46> <7d46> 2899 <7d47> <7d47> 8173 <7d4a> <7d4a> 8176 <7d4d> <7d4d> 16349 <7d4e> <7d4e> 8816 <7d4f> <7d4f> 8807 <7d50> <7d50> 3344 <7d51> <7d51> 8814 <7d52> <7d52> 8811 <7d53> <7d53> 8803 <7d54> <7d54> 8812 <7d55> <7d55> 3346 <7d56> <7d56> 8804 <7d58> <7d58> 8800 <7d5a> <7d5a> 16019 <7d5b> <7d5b> 3779 <7d5c> <7d5c> 8809 <7d5d> <7d5d> 14185 <7d5e> <7d5e> 3343 <7d5f> <7d5f> 8815 <7d61> <7d61> 3350 <7d62> <7d62> 3352 <7d63> <7d63> 8802 <7d66> <7d66> 3351 <7d67> <7d67> 8805 <7d68> <7d68> 3345 <7d69> <7d69> 8813 <7d6a> <7d6a> 8806 <7d6b> <7d6b> 8810 <7d6d> <7d6d> 8808 <7d6e> <7d6e> 3348 <7d6f> <7d6f> 8801 <7d70> <7d70> 3353 <7d71> <7d71> 2901 <7d72> <7d72> 3349 <7d73> <7d73> 3354 <7d79> <7d79> 3775 <7d7a> <7d7a> 9477 <7d7b> <7d7b> 9479 <7d7c> <7d7c> 9481 <7d7d> <7d7d> 9485 <7d7f> <7d7f> 9475 <7d80> <7d80> 9473 <7d81> <7d81> 3777 <7d83> <7d83> 9480 <7d84> <7d84> 9484 <7d85> <7d85> 9476 <7d86> <7d86> 9472 <7d88> <7d88> 9471 <7d89> <7d89> 14187 <7d8c> <7d8c> 9482 <7d8d> <7d8d> 9474 <7d8e> <7d8e> 9478 <7d8f> <7d8f> 3778 <7d91> <7d91> 3776 <7d92> <7d92> 9486 <7d93> <7d93> 3774 <7d94> <7d94> 9483 <7d96> <7d96> 10126 <7d97> <7d97> 15187 <7d9c> <7d9c> 4189 <7d9d> <7d9d> 10118 <7d9e> <7d9e> 4577 <7d9f> <7d9f> 10128 <7da0> <7da0> 4192 <7da1> <7da1> 10132 <7da2> <7da2> 4198 <7da3> <7da3> 10113 <7da4> <7da4> 18135 <7da6> <7da6> 10129 <7da7> <7da7> 10110 <7da8> <7da8> 15516 <7da9> <7da9> 10131 <7daa> <7daa> 10114 <7dab> <7dab> 14188 <7dac> <7dac> 4205 <7dad> <7dad> 4202 <7dae> <7dae> 10130 <7daf> <7daf> 10124 <7db0> <7db0> 4188 <7db1> <7db1> 4196 <7db2> <7db2> 4195 <7db3> <7db3> 14190 <7db4> <7db4> 4194 <7db5> <7db5> 4200 <7db7> <7db7> 10111 <7db8> <7db8> 4201 <7db9> <7db9> 10125 <7dba> <7dba> 4197 <7dbb> <7dbb> 4187 <7dbc> <7dbc> 10127 <7dbd> <7dbe> 4190 <7dbf> <7dbf> 4199 <7dc0> <7dc0> 10116 <7dc1> <7dc1> 10115 <7dc2> <7dc2> 10112 <7dc4> <7dc4> 10120 <7dc5> <7dc5> 10117 <7dc6> <7dc6> 10121 <7dc7> <7dc7> 4204 endcidrange 100 begincidrange <7dc9> <7dc9> 10133 <7dca> <7dca> 4193 <7dcb> <7dcc> 10122 <7dcd> <7dcd> 17774 <7dce> <7dce> 10119 <7dcf> <7dcf> 18229 <7dd0> <7dd0> 18231 <7dd2> <7dd2> 4203 <7dd3> <7dd3> 15182 <7dd4> <7dd4> 18230 <7dd6> <7dd6> 14191 <7dd7> <7dd7> 10680 <7dd8> <7dd8> 4569 <7dd9> <7dd9> 4578 <7dda> <7dda> 4574 <7ddb> <7ddb> 10677 <7ddc> <7ddc> 15180 <7ddd> <7ddd> 4571 <7dde> <7dde> 4575 <7ddf> <7ddf> 10689 <7de0> <7de0> 4565 <7de1> <7de1> 10681 <7de3> <7de3> 4573 <7de4> <7de4> 14194 <7de5> <7de5> 14198 <7de6> <7de6> 10684 <7de7> <7de7> 10679 <7de8> <7de8> 4572 <7de9> <7de9> 4576 <7dea> <7dea> 10678 <7dec> <7dec> 4570 <7dee> <7dee> 10688 <7def> <7def> 4567 <7df0> <7df0> 10687 <7df1> <7df1> 10686 <7df2> <7df2> 4579 <7df3> <7df3> 10440 <7df4> <7df4> 4566 <7df5> <7df5> 14196 <7df6> <7df6> 10685 <7df7> <7df7> 10676 <7df9> <7df9> 4580 <7dfa> <7dfa> 10683 <7dfb> <7dfb> 4568 <7dfd> <7dfd> 18232 <7dfe> <7dfe> 15567 <7e03> <7e03> 10682 <7e07> <7e07> 15181 <7e08> <7e08> 4898 <7e09> <7e09> 4903 <7e0a> <7e0a> 4896 <7e0b> <7e0b> 11295 <7e0c> <7e0c> 11286 <7e0d> <7e0d> 11298 <7e0e> <7e0e> 11290 <7e0f> <7e0f> 11296 <7e10> <7e10> 4904 <7e11> <7e11> 4897 <7e12> <7e12> 11283 <7e13> <7e13> 11289 <7e14> <7e14> 11299 <7e15> <7e15> 11292 <7e16> <7e16> 11297 <7e17> <7e17> 11285 <7e1a> <7e1a> 11293 <7e1b> <7e1b> 4899 <7e1c> <7e1c> 11291 <7e1d> <7e1d> 4902 <7e1e> <7e1e> 4901 <7e1f> <7e20> 11287 <7e21> <7e21> 11284 <7e22> <7e22> 11294 <7e23> <7e23> 4900 <7e24> <7e24> 11301 <7e25> <7e25> 11300 <7e27> <7e27> 14207 <7e29> <7e29> 11768 <7e2a> <7e2a> 11764 <7e2b> <7e2b> 5179 <7e2d> <7e2d> 11758 <7e2e> <7e2e> 5173 <7e2f> <7e2f> 5189 <7e30> <7e30> 11770 <7e31> <7e31> 5181 <7e32> <7e32> 5177 <7e33> <7e33> 11761 <7e34> <7e34> 5184 <7e35> <7e35> 5187 <7e36> <7e36> 11772 <7e37> <7e37> 5176 <7e38> <7e38> 11763 <7e39> <7e39> 5185 <7e3a> <7e3a> 11774 <7e3b> <7e3b> 11771 <7e3c> <7e3c> 11759 <7e3d> <7e3d> 5180 <7e3e> <7e3e> 5174 <7e3f> <7e3f> 5188 <7e40> <7e40> 11766 <7e41> <7e41> 5183 endcidrange 100 begincidrange <7e42> <7e42> 11760 <7e43> <7e43> 5178 <7e44> <7e44> 11773 <7e45> <7e45> 5182 <7e46> <7e46> 5175 <7e47> <7e47> 11767 <7e48> <7e48> 5186 <7e49> <7e49> 11765 <7e4c> <7e4c> 11769 <7e50> <7e50> 12163 <7e51> <7e51> 12169 <7e52> <7e52> 5393 <7e53> <7e53> 12172 <7e54> <7e55> 5388 <7e56> <7e56> 12164 <7e57> <7e57> 12171 <7e58> <7e58> 12166 <7e59> <7e59> 5394 <7e5a> <7e5a> 5391 <7e5c> <7e5c> 12162 <7e5e> <7e5e> 5390 <7e5f> <7e5f> 12168 <7e60> <7e60> 12170 <7e61> <7e61> 5392 <7e62> <7e62> 12167 <7e63> <7e63> 12165 <7e65> <7e65> 18130 <7e67> <7e67> 14182 <7e68> <7e68> 12515 <7e69> <7e6a> 5548 <7e6b> <7e6b> 5545 <7e6d> <7e6d> 5546 <7e6e> <7e6e> 14203 <7e6f> <7e6f> 12511 <7e70> <7e70> 12509 <7e72> <7e72> 12513 <7e73> <7e73> 5550 <7e74> <7e74> 12514 <7e75> <7e75> 12507 <7e76> <7e76> 12506 <7e77> <7e77> 12510 <7e78> <7e78> 12508 <7e79> <7e79> 5547 <7e7a> <7e7a> 12512 <7e7b> <7e7b> 12820 <7e7c> <7e7c> 5681 <7e7d> <7e7d> 5680 <7e7e> <7e7e> 12821 <7e7f> <7e7f> 15953 <7e80> <7e80> 12823 <7e81> <7e81> 12822 <7e82> <7e82> 5682 <7e86> <7e86> 13040 <7e87> <7e88> 13037 <7e8a> <7e8a> 13036 <7e8b> <7e8b> 13039 <7e8c> <7e8c> 5763 <7e8d> <7e8d> 13041 <7e8e> <7e8e> 16073 <7e8f> <7e8f> 5762 <7e91> <7e91> 13218 <7e92> <7e92> 18078 <7e93> <7e93> 5891 <7e94> <7e94> 5893 <7e95> <7e95> 13356 <7e96> <7e96> 5892 <7e97> <7e97> 13460 <7e98> <7e98> 13530 <7e99> <7e99> 13532 <7e9a> <7e9a> 13529 <7e9b> <7e9b> 13531 <7e9c> <7e9c> 5977 <7e9f> <7e9f> 18619 <7ea4> <7ea4> 17755 <7eac> <7eac> 17756 <7eba> <7eba> 17757 <7ec7> <7ec7> 17758 <7ecf> <7ecf> 17759 <7edf> <7edf> 17760 <7f06> <7f06> 17761 <7f36> <7f36> 1017 <7f37> <7f37> 17762 <7f38> <7f38> 2004 <7f39> <7f39> 7455 <7f3a> <7f3a> 2425 <7f3d> <7f3d> 2913 <7f3e> <7f3f> 8817 <7f40> <7f41> 14208 <7f43> <7f43> 11302 <7f44> <7f44> 5190 <7f45> <7f45> 11775 <7f47> <7f47> 14210 <7f48> <7f48> 5395 <7f49> <7f49> 15977 <7f4a> <7f4a> 12517 <7f4b> <7f4b> 12516 <7f4c> <7f4c> 5683 <7f4d> <7f4d> 13042 <7f4e> <7f4e> 15183 <7f4f> <7f4f> 13219 endcidrange 100 begincidrange <7f50> <7f50> 5926 <7f51> <7f51> 6162 <7f52> <7f52> 17654 <7f53> <7f53> 17657 <7f54> <7f54> 1640 <7f55> <7f55> 1276 <7f58> <7f58> 7107 <7f5b> <7f5b> 7597 <7f5c> <7f5c> 7592 <7f5d> <7f5d> 7596 <7f5e> <7f5e> 7594 <7f5f> <7f5f> 2426 <7f60> <7f60> 7595 <7f61> <7f61> 7593 <7f63> <7f63> 8179 <7f65> <7f66> 8819 <7f67> <7f68> 9489 <7f69> <7f6a> 3781 <7f6b> <7f6b> 9488 <7f6c> <7f6c> 9491 <7f6d> <7f6d> 9487 <7f6e> <7f6e> 3780 <7f70> <7f70> 4206 <7f71> <7f71> 16391 <7f72> <7f72> 3783 <7f73> <7f73> 10134 <7f75> <7f75> 4581 <7f76> <7f76> 10690 <7f77> <7f77> 4582 <7f78> <7f78> 16251 <7f79> <7f79> 4905 <7f7a> <7f7a> 11305 <7f7b> <7f7c> 11303 <7f7d> <7f7d> 11778 <7f7e> <7f7e> 11777 <7f7f> <7f7f> 11776 <7f83> <7f83> 12518 <7f85> <7f85> 5551 <7f86> <7f86> 12519 <7f87> <7f87> 13220 <7f88> <7f88> 5927 <7f89> <7f89> 13461 <7f8a> <7f8a> 1018 <7f8b> <7f8b> 1642 <7f8c> <7f8c> 1641 <7f8d> <7f8d> 7109 <7f8e> <7f8e> 2005 <7f8f> <7f8f> 16924 <7f91> <7f91> 7108 <7f92> <7f92> 7599 <7f93> <7f93> 17371 <7f94> <7f94> 2427 <7f95> <7f95> 8180 <7f96> <7f96> 7598 <7f97> <7f97> 14214 <7f9a> <7f9a> 2915 <7f9b> <7f9b> 8183 <7f9c> <7f9d> 8181 <7f9e> <7f9e> 2914 <7fa0> <7fa1> 8822 <7fa2> <7fa2> 8821 <7fa3> <7fa3> 14216 <7fa4> <7fa4> 3786 <7fa5> <7fa5> 9493 <7fa6> <7fa6> 9492 <7fa7> <7fa7> 9494 <7fa8> <7fa8> 3785 <7fa9> <7fa9> 3784 <7fac> <7fac> 10691 <7fad> <7fad> 10693 <7fae> <7fae> 17372 <7faf> <7faf> 4583 <7fb0> <7fb0> 10692 <7fb1> <7fb1> 11306 <7fb2> <7fb2> 4906 <7fb3> <7fb3> 12174 <7fb4> <7fb4> 18233 <7fb5> <7fb5> 12173 <7fb6> <7fb6> 5552 <7fb7> <7fb7> 12520 <7fb8> <7fb8> 5554 <7fb9> <7fb9> 5553 <7fba> <7fba> 12824 <7fbb> <7fbb> 13043 <7fbc> <7fbc> 5764 <7fbd> <7fbd> 1019 <7fbe> <7fbe> 7110 <7fbf> <7fbf> 2006 <7fc0> <7fc0> 7602 <7fc1> <7fc1> 2429 <7fc2> <7fc2> 7601 <7fc3> <7fc3> 7600 <7fc5> <7fc5> 2428 <7fc7> <7fc7> 8189 <7fc9> <7fc9> 8191 <7fca> <7fcb> 8184 <7fcc> <7fcc> 2916 <7fcd> <7fcd> 8186 <7fce> <7fce> 2917 <7fcf> <7fcf> 8190 endcidrange 100 begincidrange <7fd0> <7fd1> 8187 <7fd2> <7fd2> 2918 <7fd4> <7fd5> 3356 <7fd7> <7fd7> 8824 <7fdb> <7fdc> 9495 <7fdd> <7fdd> 15198 <7fde> <7fde> 10138 <7fdf> <7fdf> 4209 <7fe0> <7fe1> 4207 <7fe2> <7fe3> 10135 <7fe5> <7fe5> 10137 <7fe6> <7fe6> 10698 <7fe7> <7fe7> 18153 <7fe8> <7fe8> 10699 <7fe9> <7fe9> 4584 <7fea> <7fea> 10696 <7feb> <7feb> 10695 <7fec> <7fec> 10697 <7fed> <7fed> 10694 <7fee> <7fee> 4909 <7fef> <7fef> 11307 <7ff0> <7ff1> 4907 <7ff2> <7ff2> 11780 <7ff3> <7ff3> 5191 <7ff4> <7ff4> 11779 <7ff5> <7ff5> 12031 <7ff7> <7ff8> 12175 <7ff9> <7ff9> 5396 <7ffa> <7ffa> 14222 <7ffb> <7ffb> 5397 <7ffc> <7ffc> 5192 <7ffd> <7ffe> 12521 <7fff> <7fff> 12825 <8000> <8000> 5684 <8001> <8001> 1020 <8002> <8002> 17661 <8003> <8003> 1021 <8004> <8004> 2431 <8005> <8005> 1643 <8006> <8006> 2430 <8007> <8007> 7111 <8008> <8008> 14225 <800b> <800b> 3358 <800c> <800c> 1022 <800d> <800d> 2008 <800e> <800f> 7112 <8010> <8010> 2007 <8011> <8011> 2009 <8012> <8012> 1023 <8014> <8014> 7114 <8015> <8015> 2433 <8016> <8016> 7603 <8017> <8017> 2435 <8018> <8018> 2432 <8019> <8019> 2434 <801b> <801b> 8194 <801c> <801c> 2919 <801d> <801d> 14226 <801e> <801e> 8193 <801f> <801f> 8192 <8020> <8020> 18236 <8021> <8021> 9497 <8024> <8024> 10139 <8025> <8025> 18237 <8026> <8026> 4585 <8028> <8028> 4910 <8029> <8029> 11309 <802a> <802a> 11308 <802c> <802c> 11781 <802e> <802e> 18238 <802f> <802f> 14228 <8030> <8030> 13044 <8031> <8031> 18239 <8033> <8033> 1024 <8034> <8034> 6360 <8035> <8035> 6695 <8036> <8036> 2010 <8037> <8037> 7115 <8039> <8039> 7605 <803b> <803c> 14231 <803d> <803d> 2436 <803e> <803e> 7604 <803f> <803f> 2437 <8043> <8043> 8196 <8046> <8046> 2921 <8047> <8047> 8195 <8048> <8048> 8197 <804a> <804a> 2920 <804f> <8050> 8826 <8051> <8051> 8825 <8052> <8052> 3359 <8054> <8054> 18240 <8056> <8056> 3787 <8058> <8058> 3788 <805a> <805a> 4211 <805b> <805b> 16357 <805c> <805c> 10141 <805d> <805d> 10140 <805e> <805e> 4210 <8061> <8061> 14233 endcidrange 100 begincidrange <8062> <8062> 16355 <8063> <8063> 16348 <8064> <8064> 10700 <8066> <8066> 16347 <8067> <8067> 10701 <806c> <806c> 11310 <806f> <806f> 5196 <8070> <8070> 5195 <8071> <8072> 5193 <8073> <8073> 5197 <8075> <8075> 12177 <8076> <8076> 5399 <8077> <8077> 5398 <8078> <8078> 12523 <8079> <8079> 12826 <807d> <807d> 5843 <807e> <807e> 5842 <807f> <807f> 1025 <8080> <8080> 17662 <8082> <8082> 7404 <8084> <8084> 3790 <8085> <8085> 3360 <8086> <8086> 3789 <8087> <8087> 4212 <8089> <8089> 1026 <808a> <808a> 6067 <808b> <808c> 1027 <808f> <808f> 6696 <8090> <8090> 6363 <8092> <8092> 6364 <8093> <8093> 1278 <8095> <8095> 6361 <8096> <8096> 1277 <8098> <8098> 1280 <8099> <8099> 6362 <809a> <809a> 1282 <809b> <809b> 1281 <809c> <809c> 6365 <809d> <809d> 1279 <809f> <809f> 17782 <80a1> <80a1> 1648 <80a2> <80a2> 1646 <80a3> <80a3> 6698 <80a5> <80a5> 1645 <80a7> <80a7> 14240 <80a9> <80a9> 1650 <80aa> <80aa> 1652 <80ab> <80ab> 1649 <80ad> <80ad> 6701 <80ae> <80ae> 6697 <80af> <80af> 1653 <80b1> <80b1> 1647 <80b2> <80b2> 1283 <80b4> <80b4> 1651 <80b5> <80b5> 6700 <80b6> <80b6> 16046 <80b7> <80b7> 18243 <80b8> <80b8> 6699 <80ba> <80ba> 1644 <80bc> <80bc> 17778 <80bd> <80bd> 15995 <80c2> <80c2> 7121 <80c3> <80c4> 2014 <80c5> <80c5> 7123 <80c6> <80c6> 15220 <80c7> <80c7> 7117 <80c8> <80c8> 7120 <80c9> <80c9> 7129 <80ca> <80ca> 7127 <80cc> <80cc> 2016 <80cd> <80cd> 7133 <80ce> <80ce> 2019 <80cf> <80cf> 7130 <80d0> <80d0> 7122 <80d1> <80d1> 7119 <80d4> <80d4> 8829 <80d5> <80d5> 7128 <80d6> <80d6> 2011 <80d7> <80d7> 7131 <80d8> <80d8> 7116 <80d9> <80d9> 7125 <80da> <80da> 2013 <80db> <80db> 2018 <80dc> <80dc> 7126 <80dd> <80dd> 2022 <80de> <80de> 2020 <80e0> <80e0> 7118 <80e1> <80e1> 2017 <80e3> <80e3> 7124 <80e4> <80e4> 2021 <80e5> <80e5> 2012 <80e6> <80e6> 7132 <80e9> <80e9> 18244 <80ec> <80ec> 17897 <80ed> <80ed> 2442 <80ef> <80ef> 2451 <80f0> <80f0> 2440 <80f1> <80f1> 2438 <80f2> <80f2> 7607 <80f3> <80f3> 2446 endcidrange 100 begincidrange <80f4> <80f4> 2443 <80f5> <80f5> 7609 <80f6> <80f6> 17780 <80f8> <80f8> 2445 <80f9> <80f9> 7608 <80fa> <80fa> 7606 <80fb> <80fb> 7611 <80fc> <80fc> 2450 <80fd> <80fd> 2448 <80fe> <80fe> 8828 <8100> <8100> 7612 <8101> <8101> 7610 <8102> <8102> 2439 <8103> <8103> 16359 <8105> <8105> 2441 <8106> <8106> 2444 <8107> <8107> 14242 <8108> <8108> 2447 <8109> <8109> 15221 <810a> <810a> 2449 <810c> <810c> 18246 <810e> <810e> 18247 <8112> <8112> 18248 <8114> <8114> 18249 <8115> <8115> 8207 <8116> <8116> 2923 <8117> <8117> 15981 <8118> <8118> 8198 <8119> <8119> 8200 <811a> <811a> 14243 <811b> <811b> 8201 <811d> <811d> 8209 <811e> <811e> 8205 <811f> <811f> 8203 <8121> <8121> 8206 <8122> <8122> 8210 <8123> <8123> 2924 <8124> <8124> 2928 <8125> <8125> 8199 <8127> <8127> 8208 <8129> <8129> 2926 <812a> <812a> 14905 <812b> <812b> 2925 <812c> <812c> 8204 <812d> <812d> 8202 <812f> <812f> 2922 <8130> <8130> 2927 <8132> <8132> 15993 <8134> <8134> 17900 <8137> <8137> 15218 <8139> <8139> 3366 <813a> <813a> 8837 <813d> <813d> 8835 <813e> <813e> 3368 <8142> <8142> 15222 <8143> <8143> 8830 <8144> <8144> 9511 <8146> <8146> 3367 <8147> <8147> 8834 <8148> <8148> 15990 <814a> <814a> 8831 <814b> <814b> 3363 <814c> <814c> 3369 <814d> <814d> 8836 <814e> <814e> 3365 <814f> <814f> 8833 <8150> <8150> 4213 <8151> <8151> 3364 <8152> <8152> 8832 <8153> <8153> 3370 <8154> <8154> 3362 <8155> <8155> 3361 <8156> <8156> 18252 <8159> <815a> 18253 <815b> <815b> 9503 <815c> <815c> 9501 <815e> <815e> 9507 <8160> <8160> 9499 <8161> <8161> 9512 <8162> <8162> 9504 <8164> <8164> 9498 <8165> <8165> 3794 <8166> <8166> 3800 <8167> <8167> 9509 <8169> <8169> 9502 <816b> <816b> 3797 <816d> <816d> 17348 <816e> <816e> 3795 <816f> <816f> 9510 <8170> <8170> 3792 <8171> <8171> 3791 <8172> <8172> 9505 <8173> <8173> 3796 <8174> <8174> 3371 <8176> <8176> 9508 <8177> <8177> 9500 <8178> <8178> 3793 <8179> <817a> 3798 <817c> <817c> 18256 <817f> <817f> 4218 endcidrange 100 begincidrange <8180> <8180> 4214 <8182> <8182> 4219 <8183> <8183> 10144 <8184> <8184> 17349 <8186> <8186> 10143 <8187> <8187> 10145 <8188> <8188> 4216 <8189> <8189> 10142 <818a> <818a> 4217 <818b> <818b> 10148 <818c> <818c> 10147 <818d> <818d> 10146 <818f> <818f> 4215 <8193> <8193> 17350 <8195> <8195> 10705 <8197> <8197> 10708 <8198> <8198> 4591 <8199> <8199> 10707 <819a> <819a> 4590 <819b> <819d> 4586 <819e> <819e> 10704 <819f> <819f> 10703 <81a0> <81a0> 4589 <81a2> <81a2> 10706 <81a3> <81a3> 10702 <81a5> <81a5> 18259 <81a6> <81a6> 11312 <81a7> <81a7> 11322 <81a8> <81a8> 4913 <81a9> <81a9> 4912 <81aa> <81aa> 17252 <81ab> <81ab> 11316 <81ac> <81ac> 11318 <81ae> <81ae> 11313 <81b0> <81b0> 11317 <81b1> <81b1> 11311 <81b2> <81b2> 11320 <81b3> <81b3> 4911 <81b4> <81b4> 11319 <81b5> <81b5> 11315 <81b6> <81b6> 16050 <81b7> <81b7> 11321 <81b9> <81b9> 11314 <81ba> <81ba> 5200 <81bb> <81bb> 11782 <81bc> <81bc> 11788 <81bd> <81bd> 5204 <81be> <81be> 5206 <81bf> <81bf> 5203 <81c0> <81c0> 5202 <81c1> <81c1> 18261 <81c2> <81c2> 5201 <81c3> <81c3> 5199 <81c4> <81c4> 11783 <81c5> <81c5> 11786 <81c6> <81c6> 5198 <81c7> <81c7> 11787 <81c8> <81c8> 16366 <81c9> <81c9> 5205 <81ca> <81ca> 11785 <81cc> <81cc> 11784 <81cd> <81cd> 5400 <81cf> <81cf> 5401 <81d0> <81d0> 12180 <81d1> <81d2> 12178 <81d5> <81d5> 12525 <81d7> <81d7> 12524 <81d8> <81d8> 5555 <81d9> <81d9> 12828 <81da> <81da> 5685 <81db> <81db> 12827 <81dd> <81dd> 13045 <81de> <81de> 13221 <81df> <81df> 5844 <81e0> <81e1> 13533 <81e2> <81e2> 5894 <81e3> <81e3> 1029 <81e4> <81e4> 18262 <81e5> <81e5> 1654 <81e6> <81e6> 8838 <81e7> <81e7> 4220 <81e8> <81e8> 5207 <81e9> <81e9> 11789 <81ea> <81ea> 1030 <81ec> <81ec> 2453 <81ed> <81ed> 2452 <81ee> <81ee> 8839 <81ef> <81ef> 17105 <81f2> <81f2> 11323 <81f3> <81f3> 1031 <81f4> <81f4> 2023 <81f6> <81f6> 15713 <81f7> <81f9> 8840 <81fa> <81fa> 4221 <81fb> <81fb> 4914 <81fc> <81fc> 1032 <81fe> <81fe> 1655 <81ff> <81ff> 7134 <8200> <8200> 2454 <8201> <8201> 7613 endcidrange 100 begincidrange <8202> <8202> 2929 <8204> <8204> 8843 <8205> <8205> 3801 <8207> <8207> 4222 <8208> <8208> 4915 <8209> <8209> 5208 <820a> <820a> 5402 <820b> <820b> 12526 <820c> <820c> 1033 <820d> <820d> 1656 <8210> <8210> 2455 <8211> <8211> 8211 <8212> <8212> 3372 <8214> <8214> 4223 <8215> <8215> 10149 <8216> <8216> 10709 <8218> <8218> 14250 <821a> <821a> 16353 <821b> <821b> 1034 <821c> <821c> 3373 <821d> <821d> 9513 <821e> <821e> 4224 <821f> <821f> 1035 <8220> <8220> 6702 <8221> <8221> 7135 <8222> <8222> 2024 <8225> <8225> 7615 <8226> <8226> 16909 <8228> <8228> 2458 <8229> <8229> 14256 <822a> <822b> 2456 <822c> <822c> 2459 <822d> <822d> 16080 <822f> <822f> 7614 <8232> <8232> 8216 <8233> <8233> 8213 <8234> <8234> 8215 <8235> <8235> 2930 <8236> <8236> 2932 <8237> <8237> 2931 <8238> <8238> 8212 <8239> <8239> 2933 <823a> <823a> 8214 <823c> <823d> 8844 <823e> <823e> 17794 <823f> <823f> 8846 <8240> <8240> 9516 <8242> <8242> 9517 <8244> <8244> 9515 <8245> <8245> 9518 <8247> <8247> 3802 <8249> <8249> 9514 <824b> <824b> 4225 <824e> <824e> 10714 <824f> <824f> 10710 <8250> <8250> 10713 <8251> <8251> 10715 <8252> <8252> 10712 <8253> <8253> 10711 <8254> <8254> 18263 <8255> <8257> 11324 <8258> <8259> 4916 <825a> <825a> 11791 <825b> <825b> 11790 <825c> <825c> 11792 <825e> <825e> 12182 <825f> <825f> 12181 <8261> <8261> 12528 <8262> <8262> 15226 <8263> <8263> 12529 <8264> <8264> 12527 <8265> <8265> 15227 <8266> <8266> 5686 <8268> <8269> 12829 <826b> <826b> 13222 <826c> <826c> 13357 <826d> <826d> 13462 <826e> <826e> 1036 <826f> <826f> 1284 <8271> <8271> 5209 <8272> <8272> 1037 <8274> <8274> 8217 <8275> <8275> 8847 <8276> <8276> 18265 <8277> <8277> 5934 <8278> <8278> 6163 <8279> <8279> 18210 <827a> <827a> 17763 <827b> <827b> 14280 <827c> <827c> 6164 <827d> <827d> 6166 <827e> <827e> 1038 <827f> <827f> 6167 <8280> <8280> 6165 <8283> <8284> 6373 <8285> <8285> 6368 <8287> <8287> 16690 <828a> <828a> 6372 <828b> <828b> 1286 <828d> <828d> 1287 endcidrange 100 begincidrange <828e> <828e> 6369 <828f> <828f> 6367 <8290> <8290> 6366 <8291> <8291> 6370 <8292> <8292> 1285 <8293> <8293> 6371 <8294> <8294> 7136 <8298> <8298> 6707 <8299> <8299> 1659 <829a> <829a> 6706 <829b> <829b> 6708 <829d> <829d> 1658 <829e> <829e> 6713 <829f> <829f> 1662 <82a0> <82a0> 6703 <82a1> <82a1> 6717 <82a2> <82a2> 6723 <82a3> <82a3> 1669 <82a4> <82a4> 6720 <82a5> <82a5> 1666 <82a6> <82a6> 15731 <82a7> <82a7> 6710 <82a8> <82a8> 6716 <82a9> <82a9> 6718 <82aa> <82aa> 14268 <82ab> <82ab> 6705 <82ac> <82ac> 1665 <82ad> <82ad> 1660 <82ae> <82ae> 6711 <82af> <82af> 1667 <82b0> <82b0> 1670 <82b1> <82b1> 1664 <82b3> <82b3> 1657 <82b4> <82b4> 6715 <82b5> <82b5> 6709 <82b6> <82b6> 6722 <82b7> <82b7> 1672 <82b8> <82b8> 1668 <82b9> <82b9> 1663 <82ba> <82ba> 6714 <82bb> <82bb> 2460 <82bc> <82bc> 6712 <82bd> <82bd> 1661 <82be> <82be> 1671 <82c0> <82c0> 6704 <82c2> <82c2> 6719 <82c3> <82c3> 6721 <82c4> <82c4> 17891 <82ca> <82ca> 18266 <82cf> <82cf> 17764 <82d0> <82d0> 14273 <82d1> <82d1> 2041 <82d2> <82d2> 2035 <82d3> <82d3> 2043 <82d4> <82d4> 2040 <82d5> <82d5> 7143 <82d6> <82d6> 7146 <82d7> <82d7> 2036 <82d8> <82d8> 18267 <82d9> <82d9> 7137 <82db> <82db> 2029 <82dc> <82dc> 2039 <82de> <82de> 2042 <82df> <82df> 2044 <82e0> <82e0> 7158 <82e1> <82e1> 7149 <82e2> <82e2> 14281 <82e3> <82e3> 2028 <82e4> <82e4> 7157 <82e5> <82e5> 2032 <82e6> <82e6> 2030 <82e7> <82e7> 2025 <82e8> <82e8> 7141 <82ea> <82ea> 7156 <82eb> <82eb> 7145 <82ec> <82ec> 7148 <82ed> <82ed> 7161 <82ee> <82ee> 16408 <82ef> <82ef> 2045 <82f0> <82f0> 7155 <82f1> <82f1> 2037 <82f2> <82f2> 7150 <82f3> <82f3> 7160 <82f4> <82f4> 7147 <82f5> <82f5> 7151 <82f6> <82f6> 7154 <82f7> <82f7> 15991 <82f9> <82f9> 7139 <82fa> <82fa> 7159 <82fb> <82fb> 7153 <82fc> <82fc> 16685 <82fd> <82fd> 15762 <82fe> <82fe> 7138 <82ff> <82ff> 17374 <8300> <8300> 7142 <8301> <8301> 2038 <8302> <8302> 2033 <8303> <8303> 2026 <8304> <8304> 2031 <8305> <8305> 2027 endcidrange 100 begincidrange <8306> <8306> 2046 <8307> <8307> 7140 <8308> <8308> 7632 <8309> <8309> 2034 <830b> <830b> 16054 <830c> <830c> 7152 <830d> <830d> 6781 <8316> <8316> 7635 <8317> <8317> 2474 <8318> <8318> 14282 <8319> <8319> 7619 <831a> <831a> 14274 <831b> <831b> 7630 <831c> <831c> 7626 <831d> <831d> 14289 <831e> <831e> 7645 <8320> <8320> 7637 <8322> <8322> 7627 <8324> <8324> 7636 <8325> <8325> 7621 <8326> <8326> 7625 <8327> <8327> 7648 <8328> <8328> 2477 <8329> <8329> 7640 <832a> <832a> 7631 <832b> <832b> 2461 <832c> <832c> 7646 <832d> <832d> 7617 <832f> <832f> 7639 <8331> <8331> 2476 <8332> <8332> 2471 <8333> <8333> 7616 <8334> <8334> 2469 <8335> <8335> 2468 <8336> <8336> 2473 <8337> <8337> 7638 <8338> <8338> 2465 <8339> <8339> 2472 <833a> <833a> 7144 <833b> <833b> 8848 <833c> <833c> 7633 <833d> <833d> 15658 <833f> <833f> 7623 <8340> <8340> 2475 <8341> <8341> 7624 <8342> <8342> 7628 <8343> <8343> 2478 <8344> <8344> 7618 <8345> <8345> 7642 <8347> <8347> 7641 <8348> <8348> 7649 <8349> <8349> 2467 <834a> <834a> 2464 <834b> <834b> 7647 <834c> <834c> 7643 <834d> <834d> 7634 <834e> <834e> 7629 <834f> <834f> 2470 <8350> <8350> 2466 <8351> <8351> 7620 <8352> <8352> 2462 <8353> <8353> 7644 <8354> <8354> 2463 <8356> <8356> 7622 <8357> <8357> 18269 <8362> <8362> 14262 <8363> <8363> 16875 <8366> <8366> 15902 <836f> <836f> 17765 <8373> <8373> 8223 <8374> <8374> 8225 <8375> <8375> 8230 <8376> <8376> 8250 <8377> <8377> 2947 <8378> <8378> 2937 <837a> <837a> 8222 <837b> <837c> 2948 <837d> <837d> 8233 <837e> <837e> 8240 <837f> <837f> 8246 <8381> <8381> 8227 <8383> <8383> 8234 <8385> <8385> 14291 <8386> <8386> 2950 <8387> <8387> 8248 <8388> <8388> 8243 <8389> <8389> 2945 <838a> <838a> 2943 <838b> <838b> 8239 <838c> <838c> 8235 <838d> <838d> 8221 <838e> <838e> 2934 <838f> <838f> 8226 <8390> <8390> 8218 <8391> <8391> 14316 <8392> <8392> 2942 <8393> <8393> 2944 <8394> <8394> 8231 <8395> <8395> 8228 <8396> <8396> 2939 endcidrange 100 begincidrange <8397> <8397> 8244 <8398> <8398> 2936 <8399> <8399> 8229 <839a> <839a> 8889 <839b> <839b> 8237 <839c> <839c> 14157 <839d> <839d> 8236 <839e> <839e> 2935 <83a0> <83a0> 2946 <83a2> <83a2> 2938 <83a3> <83a3> 8219 <83a4> <83a4> 8224 <83a5> <83a5> 8241 <83a6> <83a6> 8247 <83a7> <83a7> 2951 <83a8> <83a8> 8220 <83a9> <83a9> 8232 <83aa> <83aa> 8238 <83ab> <83ab> 2941 <83ac> <83ac> 14294 <83ae> <83ae> 8249 <83af> <83af> 8242 <83b0> <83b0> 8245 <83b9> <83b9> 17063 <83bd> <83bd> 2940 <83be> <83be> 16217 <83bf> <83bf> 8864 <83c0> <83c0> 8852 <83c1> <83c1> 3381 <83c2> <83c2> 8881 <83c3> <83c3> 8890 <83c4> <83c4> 8893 <83c5> <83c5> 3379 <83c6> <83c6> 8860 <83c7> <83c7> 8885 <83c8> <83c8> 8861 <83c9> <83c9> 8875 <83ca> <83ca> 3392 <83cb> <83cb> 8871 <83cc> <83cc> 3389 <83cd> <83cd> 16469 <83ce> <83ce> 8872 <83cf> <83cf> 8849 <83d1> <83d1> 8886 <83d3> <83d3> 14296 <83d4> <83d4> 3398 <83d5> <83d5> 8883 <83d6> <83d6> 8873 <83d7> <83d7> 8895 <83d8> <83d8> 8868 <83d9> <83d9> 9550 <83db> <83db> 8898 <83dc> <83dc> 3396 <83dd> <83dd> 8866 <83de> <83de> 8878 <83df> <83df> 3399 <83e0> <83e0> 3378 <83e1> <83e1> 8870 <83e2> <83e2> 8896 <83e3> <83e3> 8863 <83e4> <83e4> 8856 <83e5> <83e5> 8867 <83e7> <83e7> 8855 <83e8> <83e8> 8853 <83e9> <83e9> 3374 <83ea> <83ea> 8887 <83eb> <83eb> 8862 <83ec> <83ec> 8891 <83ed> <83ed> 15660 <83ee> <83ee> 8892 <83ef> <83ef> 3382 <83f0> <83f0> 3387 <83f1> <83f1> 3383 <83f2> <83f2> 3391 <83f3> <83f3> 8882 <83f4> <83f4> 3384 <83f5> <83f5> 8874 <83f6> <83f6> 8858 <83f8> <83f8> 3376 <83f9> <83f9> 8850 <83fa> <83fa> 8884 <83fb> <83fb> 8894 <83fc> <83fc> 8857 <83fd> <83fd> 3390 <83fe> <83fe> 8899 <83ff> <83ff> 8869 <8401> <8401> 8865 <8403> <8403> 3375 <8404> <8404> 3395 <8405> <8405> 18271 <8406> <8406> 8880 <8407> <8407> 3397 <8409> <8409> 8876 <840a> <840a> 3386 <840b> <840b> 3380 <840c> <840c> 3388 <840d> <840d> 3377 <840e> <840e> 3394 <840f> <840f> 8877 <8410> <8410> 8859 endcidrange 100 begincidrange <8411> <8411> 8879 <8412> <8412> 8854 <8413> <8413> 8888 <8414> <8414> 15376 <8416> <8416> 16439 <8418> <8418> 15994 <841b> <841b> 8897 <841c> <841c> 16051 <8420> <8420> 15445 <8421> <8421> 14161 <8423> <8423> 8851 <8424> <8424> 18769 <8426> <8426> 18136 <8429> <8429> 9549 <842b> <842b> 9571 <842c> <842c> 3756 <842d> <842d> 9554 <842e> <842e> 16941 <842f> <842f> 9552 <8430> <8430> 9531 <8431> <8431> 3806 <8432> <8432> 9547 <8433> <8433> 9567 <8434> <8434> 9543 <8435> <8435> 3814 <8436> <8436> 9566 <8437> <8437> 9541 <8438> <8438> 3393 <8439> <8439> 9557 <843a> <843a> 9542 <843b> <843b> 9564 <843c> <843c> 3813 <843d> <843d> 3805 <843e> <843e> 15649 <843f> <843f> 9520 <8440> <8440> 9528 <8442> <8442> 9553 <8443> <8443> 9545 <8444> <8444> 9570 <8445> <8445> 9548 <8446> <8446> 3819 <8447> <8447> 9565 <8448> <8448> 18200 <8449> <8449> 3810 <844a> <844a> 14308 <844b> <844b> 9551 <844c> <844c> 9559 <844d> <844d> 9532 <844e> <844e> 9558 <8450> <8450> 9575 <8451> <8451> 9527 <8452> <8452> 9560 <8453> <8453> 15229 <8454> <8454> 9573 <8455> <8455> 14731 <8456> <8456> 9521 <8457> <8457> 3385 <8458> <8458> 14302 <8459> <8459> 9535 <845a> <845a> 9534 <845b> <845b> 3812 <845c> <845c> 16091 <845d> <845d> 9538 <845e> <845e> 9540 <845f> <845f> 9555 <8460> <8460> 9572 <8461> <8461> 3815 <8462> <8462> 17114 <8463> <8463> 3816 <8464> <8464> 18273 <8465> <8465> 9526 <8466> <8466> 3808 <8467> <8467> 9530 <8468> <8468> 9568 <8469> <8469> 3817 <846b> <846b> 3809 <846c> <846c> 3811 <846d> <846d> 3818 <846e> <846e> 9574 <846f> <846f> 9561 <8470> <8470> 9556 <8471> <8471> 14304 <8472> <8472> 15507 <8473> <8473> 9537 <8474> <8474> 9536 <8475> <8475> 3807 <8476> <8476> 9522 <8477> <8477> 3804 <8478> <8478> 9546 <8479> <8479> 9523 <847a> <847a> 9544 <847d> <847d> 9533 <847e> <847e> 9569 <847f> <847f> 14670 <8480> <8480> 15214 <8482> <8482> 3803 <8486> <8486> 9529 <8488> <8488> 18274 <848d> <848d> 9525 <848e> <848e> 9563 endcidrange 100 begincidrange <848f> <848f> 9524 <8490> <8490> 4238 <8491> <8491> 10189 <8492> <8492> 14166 <8493> <8493> 14318 <8494> <8494> 10172 <8496> <8496> 15133 <8497> <8497> 10150 <8498> <8498> 10180 <8499> <8499> 4230 <849a> <849a> 10165 <849b> <849b> 10175 <849c> <849c> 4233 <849d> <849d> 10168 <849e> <849e> 4231 <849f> <849f> 10153 <84a0> <84a0> 10183 <84a1> <84a1> 10152 <84a2> <84a2> 10171 <84a3> <84a3> 15262 <84a4> <84a4> 10151 <84a7> <84a7> 10169 <84a8> <84a8> 10178 <84a9> <84a9> 10176 <84aa> <84aa> 10164 <84ab> <84ab> 10159 <84ac> <84ac> 10157 <84ad> <84ad> 15756 <84ae> <84ae> 10158 <84af> <84af> 10177 <84b0> <84b0> 10188 <84b1> <84b1> 10166 <84b2> <84b2> 4232 <84b4> <84b4> 10161 <84b6> <84b6> 10181 <84b8> <84b8> 4235 <84b9> <84b9> 10160 <84ba> <84ba> 10154 <84bb> <84bb> 10170 <84bc> <84bc> 4239 <84bd> <84bd> 15436 <84be> <84be> 18276 <84bf> <84bf> 4227 <84c0> <84c0> 4236 <84c1> <84c1> 10162 <84c2> <84c2> 10156 <84c4> <84c4> 4229 <84c5> <84c5> 9562 <84c6> <84c6> 4228 <84c7> <84c7> 10173 <84c9> <84c9> 4226 <84ca> <84ca> 4241 <84cb> <84cb> 4234 <84cc> <84cc> 10174 <84cd> <84cd> 10163 <84ce> <84ce> 10155 <84cf> <84cf> 10182 <84d0> <84d0> 10167 <84d1> <84d1> 4240 <84d2> <84d2> 10186 <84d3> <84d3> 4237 <84d4> <84d4> 10185 <84d6> <84d6> 10179 <84d7> <84d7> 10184 <84da> <84da> 16373 <84db> <84db> 10187 <84de> <84de> 14314 <84e1> <84e1> 18277 <84e2> <84e2> 14261 <84e4> <84e4> 14319 <84e5> <84e5> 15312 <84e7> <84e8> 10755 <84e9> <84e9> 10743 <84ea> <84ea> 10742 <84eb> <84eb> 10738 <84ec> <84ec> 4603 <84ee> <84ee> 4595 <84ef> <84ef> 10758 <84f0> <84f0> 10757 <84f1> <84f1> 9519 <84f2> <84f2> 10735 <84f3> <84f3> 10739 <84f4> <84f4> 10733 <84f6> <84f6> 10752 <84f7> <84f7> 10737 <84f8> <84f8> 18278 <84f9> <84f9> 10759 <84fa> <84fa> 10730 <84fb> <84fb> 10728 <84fc> <84fc> 10740 <84fd> <84fd> 10750 <84fe> <84fe> 10745 <84ff> <84ff> 4605 <8500> <8500> 10719 <8502> <8502> 10749 <8503> <8503> 14730 <8505> <8505> 16619 <8506> <8506> 4606 <8507> <8507> 9539 <8508> <8508> 10731 endcidrange 100 begincidrange <8509> <8509> 10722 <850a> <850a> 10725 <850b> <850b> 10763 <850c> <850c> 10732 <850d> <850d> 10723 <850e> <850e> 10721 <850f> <850f> 10718 <8510> <8510> 18279 <8511> <8511> 4599 <8512> <8512> 10741 <8513> <8513> 4598 <8514> <8514> 4602 <8515> <8515> 10736 <8516> <8516> 10744 <8517> <8517> 4592 <8518> <8518> 10760 <8519> <8519> 10764 <851a> <851a> 4594 <851c> <851c> 10727 <851d> <851d> 10747 <851e> <851e> 10751 <851f> <851f> 10724 <8520> <8520> 10761 <8521> <8521> 4601 <8523> <8523> 4600 <8524> <8524> 10716 <8525> <8525> 4604 <8526> <8526> 10754 <8527> <8527> 10726 <8528> <8528> 10746 <8529> <8529> 10720 <852a> <852a> 10734 <852b> <852b> 10729 <852c> <852d> 4596 <852e> <852e> 10748 <852f> <852f> 10765 <8530> <8530> 10762 <8531> <8531> 10753 <8533> <8533> 16936 <8534> <8534> 14324 <8538> <8538> 18280 <853b> <853b> 10717 <853d> <853d> 4593 <853e> <853e> 11343 <8540> <8540> 11334 <8541> <8541> 11337 <8542> <8542> 16482 <8543> <8543> 4923 <8544> <8544> 11339 <8545> <8545> 11328 <8546> <8546> 11335 <8547> <8547> 11341 <8548> <8548> 4920 <8549> <8549> 4924 <854a> <854a> 4918 <854b> <854b> 14272 <854c> <854c> 16399 <854d> <854d> 11330 <854e> <854e> 11346 <8551> <8551> 11340 <8552> <8552> 18281 <8553> <8553> 11331 <8554> <8554> 11355 <8555> <8555> 11349 <8556> <8556> 11327 <8557> <8557> 11811 <8558> <8558> 11333 <8559> <8559> 4919 <855a> <855a> 14299 <855b> <855b> 11344 <855d> <855d> 11354 <855e> <855e> 4927 <8560> <8560> 11351 <8561> <8561> 11332 <8562> <8562> 11338 <8563> <8563> 11342 <8564> <8564> 11336 <8565> <8565> 11356 <8566> <8566> 11353 <8567> <8567> 11350 <8568> <8569> 4921 <856a> <856a> 4926 <856b> <856b> 11329 <856c> <856c> 11357 <856d> <856d> 4925 <856e> <856e> 11347 <856f> <8570> 18283 <8571> <8571> 11345 <8573> <8573> 14328 <8575> <8575> 11348 <8576> <8576> 11824 <8577> <8577> 11805 <8578> <8578> 11810 <8579> <8579> 11823 <857a> <857a> 11809 <857b> <857b> 11801 <857c> <857c> 11806 <857e> <857e> 5212 <8580> <8580> 11794 <8581> <8581> 11818 endcidrange 100 begincidrange <8582> <8582> 11820 <8583> <8583> 11793 <8584> <8584> 5211 <8585> <8585> 11822 <8586> <8586> 11814 <8587> <8587> 5218 <8588> <8588> 11821 <8589> <8589> 11807 <858a> <858a> 5220 <858b> <858b> 11799 <858c> <858c> 11352 <858d> <858d> 11815 <858e> <858e> 11812 <858f> <858f> 11795 <8590> <8590> 11826 <8591> <8591> 5214 <8594> <8594> 5215 <8595> <8595> 11797 <8596> <8596> 11813 <8598> <8598> 11825 <8599> <8599> 11816 <859a> <859a> 11803 <859b> <859b> 5217 <859c> <859c> 5213 <859d> <859d> 11817 <859e> <859e> 11804 <859f> <859f> 11827 <85a0> <85a0> 11798 <85a1> <85a1> 11808 <85a2> <85a2> 11819 <85a3> <85a3> 11800 <85a4> <85a4> 11802 <85a6> <85a6> 5221 <85a7> <85a7> 11796 <85a8> <85a8> 5219 <85a9> <85a9> 5404 <85aa> <85aa> 5210 <85af> <85af> 5216 <85b0> <85b0> 5408 <85b1> <85b1> 12198 <85b3> <85b3> 12188 <85b4> <85b4> 12183 <85b5> <85b5> 12189 <85b6> <85b6> 12199 <85b7> <85b7> 12203 <85b8> <85b8> 12202 <85b9> <85b9> 5410 <85ba> <85ba> 5409 <85bd> <85bd> 12190 <85be> <85be> 12204 <85bf> <85bf> 12193 <85c0> <85c0> 12185 <85c1> <85c1> 14334 <85c2> <85c2> 12187 <85c3> <85c3> 12186 <85c4> <85c4> 12192 <85c5> <85c5> 12197 <85c6> <85c6> 12184 <85c7> <85c7> 12191 <85c8> <85c8> 12196 <85c9> <85c9> 5407 <85cb> <85cb> 12194 <85cd> <85cd> 5405 <85ce> <85ce> 12195 <85cf> <85cf> 5403 <85d0> <85d0> 5406 <85d1> <85d1> 12545 <85d2> <85d2> 12200 <85d5> <85d5> 5559 <85d7> <85d7> 12537 <85d8> <85d8> 12541 <85d9> <85d9> 12533 <85da> <85da> 12536 <85dc> <85dc> 12544 <85dd> <85dd> 5557 <85de> <85de> 12549 <85df> <85df> 12542 <85e0> <85e0> 18285 <85e1> <85e1> 12534 <85e2> <85e2> 12550 <85e3> <85e3> 12543 <85e4> <85e5> 5560 <85e6> <85e6> 12547 <85e8> <85e8> 12535 <85e9> <85e9> 5556 <85ea> <85ea> 5558 <85eb> <85eb> 12530 <85ec> <85ec> 12538 <85ed> <85ed> 12532 <85ee> <85ee> 15446 <85ef> <85ef> 12548 <85f0> <85f0> 12546 <85f1> <85f1> 12531 <85f2> <85f2> 12539 <85f6> <85f6> 12837 <85f7> <85f7> 5562 <85f8> <85f8> 12540 <85f9> <85f9> 5688 <85fa> <85fa> 5690 <85fb> <85fb> 5687 endcidrange 100 begincidrange <85fc> <85fc> 15440 <85fd> <85fd> 12842 <85fe> <85fe> 12834 <85ff> <85ff> 12832 <8600> <8600> 12836 <8601> <8601> 12833 <8602> <8602> 14336 <8604> <8604> 12838 <8605> <8605> 12840 <8606> <8606> 5691 <8607> <8607> 5693 <8609> <8609> 12839 <860a> <860a> 5694 <860b> <860b> 5692 <860c> <860c> 12841 <860d> <860d> 16484 <8610> <8610> 15231 <8611> <8611> 5689 <8614> <8614> 18110 <8616> <8616> 14331 <8617> <8617> 5765 <8618> <8618> 13046 <8619> <8619> 13052 <861a> <861a> 5767 <861b> <861b> 12835 <861c> <861c> 13051 <861e> <861e> 13058 <861f> <861f> 13049 <8620> <8620> 13056 <8621> <8621> 13055 <8622> <8622> 12831 <8623> <8623> 13050 <8624> <8624> 12201 <8625> <8625> 13059 <8626> <8626> 13048 <8627> <8627> 13053 <8628> <8628> 14341 <8629> <8629> 13057 <862a> <862a> 13047 <862c> <862c> 13226 <862d> <862d> 5766 <862e> <862e> 13054 <862f> <862f> 16286 <8631> <8631> 13362 <8632> <8632> 13227 <8633> <8633> 13225 <8634> <8635> 13223 <8636> <8636> 13228 <8638> <8638> 5895 <8639> <8639> 13360 <863a> <863a> 13358 <863b> <863b> 13363 <863c> <863c> 13361 <863e> <863e> 13364 <863f> <863f> 5896 <8640> <8640> 13359 <8642> <8642> 14529 <8643> <8643> 13463 <8645> <8645> 15206 <8646> <8648> 13535 <864b> <864b> 13630 <864c> <864c> 13622 <864d> <864d> 6168 <864e> <864e> 1673 <8650> <8650> 2047 <8652> <8652> 7651 <8653> <8653> 7650 <8654> <8654> 2479 <8655> <8655> 2952 <8656> <8656> 8252 <8659> <8659> 8251 <865b> <865b> 3400 <865c> <865c> 3821 <865e> <865e> 3820 <865f> <865f> 3822 <8661> <8661> 10190 <8662> <8662> 10766 <8663> <8663> 11358 <8664> <8664> 11360 <8665> <8665> 11359 <8667> <8667> 5222 <8668> <8668> 11828 <8669> <8669> 12205 <866a> <866a> 13598 <866b> <866b> 1039 <866c> <866c> 14355 <866d> <866e> 6726 <866f> <866f> 6725 <8670> <8670> 6724 <8671> <8671> 1674 <8672> <8672> 18287 <8673> <8673> 7165 <8674> <8674> 7163 <8677> <8677> 7162 <8679> <8679> 2048 <867a> <867a> 2050 <867b> <867b> 2049 <867c> <867c> 7164 <867e> <867e> 14346 <8685> <8685> 7663 endcidrange 100 begincidrange <8686> <8686> 7660 <8687> <8687> 7658 <868a> <868a> 2480 <868b> <868b> 7661 <868c> <868c> 2485 <868d> <868d> 7655 <868e> <868e> 7670 <8690> <8690> 7672 <8691> <8691> 7656 <8692> <8692> 18288 <8693> <8693> 2482 <8694> <8694> 7673 <8695> <8695> 7668 <8696> <8696> 7654 <8697> <8697> 7659 <8698> <8698> 7669 <8699> <8699> 7665 <869a> <869a> 7662 <869c> <869c> 2487 <869d> <869d> 7671 <869e> <869e> 7657 <86a0> <86a0> 15240 <86a1> <86a1> 7666 <86a2> <86a2> 7652 <86a3> <86a3> 2486 <86a4> <86a4> 2483 <86a5> <86a5> 7664 <86a7> <86a7> 7667 <86a8> <86a8> 7653 <86a9> <86a9> 2484 <86aa> <86aa> 2481 <86ad> <86ad> 16134 <86af> <86af> 2962 <86b0> <86b0> 8259 <86b1> <86b1> 2961 <86b2> <86b2> 17376 <86b3> <86b3> 8262 <86b4> <86b4> 8265 <86b5> <86b5> 2958 <86b6> <86b6> 2956 <86b7> <86b7> 8254 <86b8> <86b8> 8263 <86b9> <86b9> 8261 <86ba> <86ba> 8258 <86bb> <86bc> 8266 <86bd> <86be> 8269 <86bf> <86bf> 8253 <86c0> <86c0> 2955 <86c1> <86c1> 8256 <86c2> <86c2> 8255 <86c3> <86c3> 8268 <86c4> <86c4> 2957 <86c5> <86c5> 8257 <86c6> <86c6> 2959 <86c7> <86c7> 2954 <86c8> <86c8> 8260 <86c9> <86c9> 2963 <86cb> <86cb> 2960 <86cc> <86cc> 8264 <86d0> <86d0> 3407 <86d1> <86d1> 8914 <86d3> <86d3> 8903 <86d4> <86d4> 3404 <86d6> <86d6> 9581 <86d7> <86d7> 8912 <86d8> <86d8> 8900 <86d9> <86d9> 3402 <86da> <86da> 8905 <86db> <86db> 3405 <86dc> <86dc> 8909 <86dd> <86dd> 8907 <86de> <86de> 3408 <86df> <86df> 3401 <86e2> <86e2> 8901 <86e3> <86e3> 8904 <86e4> <86e4> 3406 <86e6> <86e6> 8902 <86e8> <86e8> 8913 <86e9> <86e9> 8911 <86ea> <86ea> 8906 <86eb> <86eb> 8908 <86ec> <86ec> 8910 <86ed> <86ed> 3403 <86ef> <86ef> 18289 <86f5> <86f5> 9582 <86f6> <86f6> 9588 <86f7> <86f7> 9578 <86f8> <86f8> 9584 <86f9> <86f9> 3823 <86fa> <86fa> 9580 <86fb> <86fb> 3829 <86fe> <86fe> 3828 <8700> <8700> 3827 <8701> <8701> 9587 <8702> <8703> 3830 <8704> <8704> 9577 <8705> <8705> 9590 <8706> <8706> 3832 <8707> <8707> 3826 <8708> <8708> 3825 endcidrange 100 begincidrange <8709> <8709> 9586 <870a> <870a> 3833 <870b> <870b> 9576 <870c> <870c> 9579 <870d> <870d> 9589 <870e> <870e> 9585 <8711> <8711> 10222 <8712> <8712> 10211 <8713> <8713> 3824 <8718> <8718> 4248 <8719> <8719> 10199 <871a> <871a> 10220 <871b> <871b> 10200 <871c> <871c> 4243 <871e> <871e> 10197 <8720> <8720> 10206 <8721> <8721> 10198 <8722> <8722> 4245 <8723> <8723> 10192 <8724> <8724> 10219 <8725> <8725> 4246 <8726> <8727> 10216 <8728> <8728> 10193 <8729> <8729> 4251 <872a> <872a> 10208 <872c> <872c> 10202 <872d> <872d> 10209 <872e> <872e> 10196 <8730> <8730> 10221 <8731> <8731> 10213 <8732> <8732> 10207 <8733> <8733> 10191 <8734> <8734> 4247 <8735> <8735> 10214 <8737> <8737> 4250 <8738> <8738> 10218 <873a> <873a> 10212 <873b> <873b> 4244 <873c> <873c> 10210 <873e> <873e> 10204 <873f> <873f> 4242 <8740> <8740> 10195 <8741> <8741> 10203 <8742> <8742> 10215 <8743> <8743> 10201 <8746> <8746> 10205 <874c> <874c> 4616 <874d> <874d> 9583 <874e> <874e> 10784 <874f> <874f> 10793 <8750> <8750> 10783 <8751> <8751> 10779 <8752> <8752> 10776 <8753> <8753> 4617 <8754> <8754> 10774 <8755> <8755> 4249 <8756> <8756> 10767 <8757> <8757> 4615 <8758> <8758> 10773 <8759> <8759> 4614 <875a> <875a> 10778 <875b> <875b> 10775 <875c> <875c> 10791 <875d> <875d> 10786 <875e> <875e> 10780 <875f> <875f> 10785 <8760> <8760> 4610 <8761> <8761> 10777 <8762> <8762> 10796 <8763> <8764> 10768 <8765> <8765> 10792 <8766> <8766> 4611 <8767> <8767> 10797 <8768> <8768> 4613 <8769> <8769> 10798 <876a> <876a> 10782 <876b> <876b> 10194 <876c> <876c> 10788 <876d> <876d> 10781 <876e> <876e> 10790 <876f> <876f> 10787 <8770> <8770> 15980 <8771> <8771> 14347 <8773> <8773> 10772 <8774> <8774> 4608 <8775> <8775> 10795 <8776> <8776> 4609 <8777> <8777> 10770 <8778> <8778> 4612 <8779> <8779> 11371 <877a> <877a> 10789 <877b> <877b> 10794 <877d> <877d> 16453 <8781> <8781> 11368 <8782> <8782> 4607 <8783> <8783> 4928 <8784> <8784> 11378 <8785> <8785> 11374 <8786> <8786> 16048 <8787> <8787> 11372 endcidrange 100 begincidrange <8788> <8788> 11367 <8789> <8789> 11382 <878b> <878b> 17378 <878c> <878c> 16367 <878d> <878d> 4932 <878f> <878f> 11363 <8790> <8791> 11375 <8792> <8792> 11366 <8793> <8793> 11365 <8794> <8794> 11379 <8796> <8796> 11369 <8797> <8797> 11364 <8798> <8798> 11370 <879a> <879a> 11381 <879b> <879b> 11362 <879c> <879c> 11380 <879d> <879d> 11377 <879e> <879e> 4930 <879f> <879f> 4929 <87a2> <87a2> 4931 <87a3> <87a3> 11373 <87a4> <87a4> 11361 <87a5> <87a5> 15752 <87a9> <87a9> 16364 <87aa> <87aa> 11830 <87ab> <87ab> 5228 <87ac> <87ac> 11834 <87ad> <87ad> 11831 <87ae> <87ae> 11838 <87af> <87af> 11844 <87b0> <87b0> 11833 <87b1> <87b1> 14351 <87b2> <87b2> 11853 <87b3> <87b3> 5225 <87b4> <87b4> 11847 <87b5> <87b5> 11836 <87b6> <87b6> 11848 <87b7> <87b7> 11843 <87b8> <87b8> 11850 <87b9> <87b9> 11835 <87ba> <87ba> 5230 <87bb> <87bb> 5229 <87bc> <87bc> 11837 <87bd> <87bd> 11851 <87be> <87be> 11829 <87bf> <87bf> 11849 <87c0> <87c0> 5223 <87c1> <87c1> 16380 <87c2> <87c2> 11841 <87c3> <87c3> 11840 <87c4> <87c4> 11845 <87c5> <87c5> 11832 <87c6> <87c6> 5227 <87c8> <87c8> 5231 <87c9> <87c9> 11839 <87ca> <87ca> 11846 <87cb> <87cb> 5232 <87cc> <87cc> 11842 <87ce> <87ce> 16365 <87d1> <87d1> 5224 <87d2> <87d2> 5226 <87d3> <87d3> 12218 <87d4> <87d4> 12216 <87d6> <87d6> 16274 <87d7> <87d7> 12222 <87d8> <87d8> 12220 <87d9> <87d9> 12223 <87da> <87da> 14352 <87db> <87db> 12209 <87dc> <87dc> 12217 <87dd> <87dd> 12227 <87de> <87de> 11852 <87df> <87df> 12213 <87e0> <87e0> 5414 <87e1> <87e1> 10771 <87e2> <87e2> 12208 <87e3> <87e3> 12221 <87e4> <87e4> 12215 <87e5> <87e5> 12212 <87e6> <87e6> 12207 <87e7> <87e7> 12206 <87e8> <87e8> 12226 <87ea> <87ea> 12211 <87eb> <87eb> 12210 <87ec> <87ec> 5412 <87ed> <87ed> 12219 <87ee> <87ee> 14349 <87ef> <87ef> 5411 <87f2> <87f2> 5413 <87f3> <87f3> 12214 <87f4> <87f4> 12225 <87f5> <87f5> 16302 <87f6> <87f7> 12554 <87f9> <87f9> 5566 <87fa> <87fa> 12552 <87fb> <87fb> 5563 <87fc> <87fc> 12560 <87fe> <87fe> 5567 <87ff> <87ff> 12562 <8800> <8800> 12551 endcidrange 100 begincidrange <8801> <8801> 12224 <8802> <8802> 12564 <8803> <8803> 12553 <8804> <8804> 16047 <8805> <8805> 5564 <8806> <8806> 12559 <8808> <8808> 12561 <8809> <8809> 12556 <880a> <880a> 12563 <880b> <880b> 12558 <880c> <880c> 12557 <880d> <880d> 5565 <880f> <880f> 14353 <8810> <8811> 12844 <8813> <8813> 12847 <8814> <8815> 5695 <8816> <8816> 12848 <8817> <8817> 12846 <8818> <8818> 16250 <8819> <8819> 12843 <881b> <881b> 13062 <881c> <881c> 13065 <881d> <881d> 13061 <881f> <881f> 5771 <8820> <8820> 13063 <8821> <8821> 5770 <8822> <8822> 5769 <8823> <8823> 5768 <8824> <8824> 13064 <8825> <8825> 13233 <8826> <8826> 13231 <8827> <8827> 15879 <8828> <8828> 13230 <8829> <8829> 13060 <882a> <882a> 13232 <882b> <882b> 13066 <882c> <882c> 13229 <882d> <882d> 15243 <882e> <882e> 13367 <882f> <882f> 13333 <8830> <8830> 13365 <8831> <8831> 5897 <8832> <8832> 13366 <8833> <8833> 13368 <8835> <8835> 13466 <8836> <8836> 5928 <8837> <8837> 13465 <8838> <8838> 13464 <8839> <8839> 5929 <883b> <883b> 5959 <883c> <883c> 13576 <883d> <883d> 13600 <883e> <883e> 13599 <883f> <883f> 13601 <8840> <8840> 1040 <8841> <8841> 7166 <8842> <8842> 16218 <8843> <8844> 7674 <8845> <8846> 14358 <8848> <8848> 8915 <884a> <884a> 13067 <884b> <884b> 13467 <884c> <884c> 1041 <884d> <884d> 2051 <884e> <884e> 7167 <884f> <884f> 14404 <8852> <8852> 8271 <8853> <8853> 2964 <8855> <8855> 8917 <8856> <8856> 8916 <8857> <8857> 3409 <8859> <8859> 3834 <885a> <885a> 10799 <885b> <885b> 4618 <885d> <885d> 4619 <885e> <885e> 14363 <8860> <8860> 14918 <8861> <8861> 4933 <8862> <8862> 5930 <8863> <8863> 1042 <8864> <8864> 17666 <8865> <8865> 15868 <8867> <8867> 7168 <8868> <8868> 1676 <8869> <8869> 7170 <886a> <886a> 7169 <886b> <886b> 2052 <886d> <886d> 7676 <886e> <886e> 15246 <886f> <886f> 7683 <8870> <8870> 2488 <8871> <8871> 7681 <8872> <8872> 7679 <8874> <8874> 7686 <8875> <8876> 7677 <8877> <8877> 2489 <8879> <8879> 2493 <887c> <887c> 7687 <887d> <887d> 2492 <887e> <887e> 7685 endcidrange 100 begincidrange <887f> <887f> 7682 <8880> <8880> 7680 <8881> <8882> 2490 <8883> <8883> 7684 <8884> <8884> 17143 <8887> <8887> 15248 <8888> <8888> 2966 <8889> <8889> 8272 <888b> <888b> 2971 <888c> <888c> 8288 <888d> <888d> 2970 <888e> <888e> 8290 <8891> <8891> 8278 <8892> <8892> 2968 <8893> <8893> 8289 <8895> <8895> 8273 <8896> <8896> 2969 <8897> <8897> 8285 <8898> <8898> 8281 <8899> <8899> 8283 <889a> <889a> 8277 <889b> <889b> 8284 <889c> <889c> 14364 <889e> <889e> 2965 <889f> <889f> 8280 <88a0> <88a0> 16288 <88a1> <88a1> 8279 <88a2> <88a2> 8275 <88a4> <88a4> 8286 <88a7> <88a7> 8282 <88a8> <88a8> 8274 <88aa> <88aa> 8276 <88ab> <88ab> 2967 <88ac> <88ac> 8287 <88ae> <88ae> 18293 <88b1> <88b1> 3412 <88b2> <88b2> 8928 <88b4> <88b5> 14366 <88b6> <88b6> 8924 <88b7> <88b7> 8926 <88b8> <88b8> 8921 <88b9> <88b9> 8920 <88ba> <88ba> 8918 <88bc> <88bc> 8925 <88bd> <88bd> 8927 <88be> <88be> 8923 <88bf> <88bf> 15249 <88c0> <88c0> 8922 <88c1> <88c2> 3410 <88c5> <88c5> 14368 <88c7> <88c7> 16049 <88c9> <88c9> 8930 <88ca> <88ca> 3842 <88cb> <88cb> 9592 <88cc> <88cc> 9598 <88cd> <88ce> 9593 <88cf> <88cf> 14058 <88d0> <88d0> 9599 <88d2> <88d2> 3844 <88d4> <88d4> 3836 <88d5> <88d5> 3843 <88d6> <88d6> 9591 <88d7> <88d7> 8919 <88d8> <88d8> 3839 <88d9> <88d9> 3837 <88da> <88da> 9597 <88db> <88db> 9596 <88dc> <88dc> 3838 <88dd> <88dd> 3840 <88de> <88de> 9595 <88df> <88df> 3835 <88e1> <88e1> 3841 <88e6> <88e6> 15250 <88e7> <88e7> 10224 <88e8> <88e8> 4258 <88eb> <88eb> 10235 <88ec> <88ec> 10234 <88ee> <88ee> 10229 <88ef> <88ef> 4260 <88f0> <88f0> 10233 <88f1> <88f2> 10225 <88f3> <88f3> 4252 <88f4> <88f4> 4254 <88f5> <88f5> 15880 <88f6> <88f6> 10231 <88f7> <88f7> 10223 <88f8> <88f8> 4256 <88f9> <88f9> 4255 <88fa> <88fa> 10227 <88fb> <88fb> 10232 <88fc> <88fc> 10230 <88fd> <88fd> 4257 <88fe> <88fe> 10228 <88ff> <88ff> 18294 <8900> <8900> 17146 <8901> <8901> 8929 <8902> <8902> 4253 <8905> <8905> 10800 <8906> <8906> 10807 <8907> <8907> 4621 endcidrange 100 begincidrange <8909> <8909> 10811 <890a> <890a> 4625 <890b> <890b> 10803 <890c> <890c> 10801 <890e> <890e> 10810 <8910> <8910> 4620 <8911> <8911> 10809 <8912> <8913> 4622 <8914> <8914> 10802 <8915> <8915> 4624 <8916> <8916> 10808 <8917> <8919> 10804 <891a> <891a> 4259 <891e> <891e> 11383 <891f> <891f> 11395 <8921> <8921> 4938 <8922> <8922> 11390 <8923> <8923> 11392 <8924> <8924> 18295 <8925> <8925> 4936 <8926> <8926> 11384 <8927> <8927> 11388 <8929> <8929> 11391 <892a> <892a> 4934 <892b> <892b> 4937 <892c> <892c> 11394 <892d> <892e> 11386 <892f> <892f> 11393 <8930> <8930> 11385 <8931> <8931> 11389 <8932> <8932> 4935 <8933> <8933> 11855 <8935> <8935> 11854 <8936> <8936> 5234 <8937> <8937> 11860 <8938> <8938> 5236 <893b> <893b> 5233 <893c> <893c> 11856 <893d> <893d> 5237 <893e> <893e> 11857 <8941> <8941> 11858 <8942> <8942> 11861 <8943> <8943> 15894 <8944> <8944> 5235 <8946> <8946> 12232 <8947> <8947> 17379 <8949> <8949> 12235 <894b> <894b> 12229 <894c> <894c> 12231 <894d> <894d> 15252 <894f> <894f> 12230 <8950> <8951> 12233 <8952> <8952> 11859 <8953> <8953> 12228 <8954> <8954> 15254 <8956> <8956> 5570 <8957> <8957> 12568 <8958> <8958> 12571 <8959> <8959> 12573 <895a> <895b> 12566 <895c> <895c> 12570 <895d> <895d> 12572 <895e> <895e> 5571 <895f> <895f> 5569 <8960> <8960> 5568 <8961> <8961> 12569 <8962> <8962> 12565 <8963> <8963> 12849 <8964> <8964> 5697 <8965> <8965> 15251 <8966> <8966> 12850 <8969> <8969> 13069 <896a> <896a> 5772 <896b> <896b> 13071 <896c> <896c> 5773 <896d> <896d> 13068 <896e> <896e> 13070 <896f> <896f> 5846 <8971> <8971> 13234 <8972> <8972> 5845 <8973> <8973> 13371 <8974> <8974> 13370 <8976> <8976> 13369 <8977> <8977> 15850 <8979> <897a> 13538 <897b> <897b> 13541 <897c> <897c> 13540 <897e> <897e> 6169 <897f> <897f> 1043 <8980> <8980> 18184 <8981> <8981> 2053 <8982> <8982> 8291 <8983> <8983> 3413 <8985> <8985> 9600 <8986> <8986> 5415 <8987> <8987> 14370 <8988> <8988> 12574 <8989> <8989> 16361 <898a> <898a> 14371 <898b> <898b> 1288 endcidrange 100 begincidrange <898f> <898f> 2973 <8991> <8991> 18296 <8993> <8993> 2972 <8994> <8994> 16352 <8995> <8995> 8931 <8996> <8996> 3414 <8997> <8997> 8933 <8998> <8998> 8932 <899b> <899b> 9601 <899c> <899c> 3845 <899d> <899d> 10236 <899e> <899e> 10239 <899f> <899f> 10238 <89a1> <89a1> 10237 <89a2> <89a2> 10812 <89a3> <89a3> 10814 <89a4> <89a4> 10813 <89a5> <89a5> 15763 <89a6> <89a6> 4940 <89a7> <89a7> 14374 <89a9> <89a9> 14373 <89aa> <89aa> 4939 <89ac> <89ac> 5238 <89ad> <89ad> 11862 <89ae> <89ae> 11864 <89af> <89af> 11863 <89b2> <89b2> 5416 <89b6> <89b6> 12576 <89b7> <89b7> 12575 <89b9> <89b9> 12851 <89ba> <89ba> 5698 <89bc> <89bc> 14375 <89bd> <89bd> 5774 <89be> <89be> 13236 <89bf> <89bf> 13235 <89c0> <89c0> 5960 <89c1> <89c1> 17667 <89c6> <89c6> 17766 <89d2> <89d2> 1289 <89d3> <89d3> 7171 <89d4> <89d4> 2054 <89d5> <89d5> 8294 <89d6> <89d6> 8292 <89d9> <89d9> 8293 <89da> <89db> 8935 <89dc> <89dc> 9608 <89dd> <89dd> 8934 <89df> <89df> 9602 <89e0> <89e0> 9606 <89e1> <89e1> 9605 <89e2> <89e2> 9607 <89e3> <89e3> 3846 <89e4> <89e4> 9604 <89e5> <89e5> 9603 <89e6> <89e6> 9609 <89e7> <89e7> 14377 <89e8> <89e8> 10242 <89e9> <89e9> 10240 <89eb> <89eb> 10241 <89ec> <89ec> 10817 <89ed> <89ed> 10815 <89f0> <89f0> 10816 <89f1> <89f1> 11396 <89f2> <89f3> 11865 <89f4> <89f4> 5417 <89f6> <89f6> 12577 <89f7> <89f7> 12852 <89f8> <89f8> 5699 <89fa> <89fa> 13072 <89fb> <89fb> 13237 <89fc> <89fc> 5847 <89fe> <89fe> 13372 <89ff> <89ff> 13542 <8a00> <8a00> 1290 <8a02> <8a03> 2056 <8a04> <8a04> 7172 <8a07> <8a07> 7173 <8a08> <8a08> 2055 <8a0a> <8a0a> 2499 <8a0c> <8a0c> 2497 <8a0e> <8a0e> 2496 <8a0f> <8a0f> 2503 <8a10> <8a10> 2495 <8a11> <8a11> 2504 <8a12> <8a12> 7688 <8a13> <8a13> 2501 <8a15> <8a15> 2498 <8a16> <8a16> 2502 <8a17> <8a17> 2500 <8a18> <8a18> 2494 <8a1b> <8a1b> 2981 <8a1c> <8a1c> 15267 <8a1d> <8a1d> 2975 <8a1e> <8a1e> 8298 <8a1f> <8a1f> 2980 <8a22> <8a22> 2982 <8a23> <8a23> 2976 <8a25> <8a25> 2977 <8a27> <8a27> 8296 <8a29> <8a29> 17381 endcidrange 100 begincidrange <8a2a> <8a2a> 2974 <8a2b> <8a2b> 15313 <8a2c> <8a2c> 8297 <8a2d> <8a2d> 2979 <8a30> <8a30> 8295 <8a31> <8a31> 2978 <8a34> <8a34> 3425 <8a36> <8a36> 3427 <8a38> <8a38> 18298 <8a39> <8a39> 8939 <8a3a> <8a3a> 3426 <8a3b> <8a3b> 3415 <8a3c> <8a3c> 3419 <8a3d> <8a3d> 15266 <8a3e> <8a3e> 3865 <8a3f> <8a3f> 9614 <8a40> <8a40> 8941 <8a41> <8a41> 3420 <8a44> <8a45> 8944 <8a46> <8a46> 3424 <8a48> <8a48> 8947 <8a49> <8a49> 16368 <8a4a> <8a4a> 8949 <8a4c> <8a4c> 8950 <8a4d> <8a4d> 8938 <8a4e> <8a4e> 8937 <8a4f> <8a4f> 8951 <8a50> <8a50> 3423 <8a51> <8a51> 8948 <8a52> <8a52> 8946 <8a54> <8a54> 3421 <8a55> <8a55> 3417 <8a56> <8a56> 3428 <8a57> <8a58> 8942 <8a59> <8a59> 8940 <8a5b> <8a5b> 3422 <8a5e> <8a5e> 3418 <8a60> <8a60> 3416 <8a61> <8a61> 9613 <8a62> <8a62> 3860 <8a63> <8a63> 3855 <8a66> <8a66> 3850 <8a67> <8a67> 16270 <8a68> <8a68> 3866 <8a69> <8a69> 3851 <8a6b> <8a6b> 3847 <8a6c> <8a6c> 3862 <8a6d> <8a6d> 3859 <8a6e> <8a6e> 3861 <8a70> <8a70> 3852 <8a71> <8a71> 3857 <8a72> <8a73> 3848 <8a74> <8a74> 9621 <8a75> <8a75> 9618 <8a76> <8a76> 9610 <8a77> <8a77> 9615 <8a79> <8a79> 3863 <8a7a> <8a7a> 9622 <8a7b> <8a7b> 3864 <8a7c> <8a7c> 3854 <8a7e> <8a7e> 16293 <8a7f> <8a7f> 9612 <8a81> <8a81> 9620 <8a82> <8a82> 9616 <8a83> <8a83> 9619 <8a84> <8a84> 9617 <8a85> <8a85> 3858 <8a86> <8a86> 9611 <8a87> <8a87> 3853 <8a8b> <8a8b> 10245 <8a8c> <8a8c> 4262 <8a8d> <8a8d> 4265 <8a8f> <8a8f> 10247 <8a90> <8a90> 14383 <8a91> <8a91> 4273 <8a92> <8a92> 10246 <8a93> <8a93> 4267 <8a94> <8a94> 18299 <8a95> <8a95> 4630 <8a96> <8a96> 10248 <8a98> <8a98> 4272 <8a99> <8a99> 10244 <8a9a> <8a9a> 4274 <8a9c> <8a9c> 14380 <8a9e> <8a9e> 4263 <8aa0> <8aa0> 3856 <8aa1> <8aa1> 4266 <8aa3> <8aa3> 4264 <8aa4> <8aa4> 4268 <8aa5> <8aa5> 4270 <8aa6> <8aa6> 4261 <8aa7> <8aa7> 4275 <8aa8> <8aa8> 4271 <8aa9> <8aa9> 14397 <8aaa> <8aaa> 4269 <8aab> <8aab> 10243 <8aaf> <8aaf> 14401 <8ab0> <8ab0> 4637 <8ab2> <8ab2> 4633 <8ab4> <8ab4> 18300 endcidrange 100 begincidrange <8ab6> <8ab6> 4640 <8ab8> <8ab8> 10820 <8ab9> <8ab9> 4641 <8aba> <8aba> 10832 <8abb> <8abb> 10825 <8abc> <8abc> 4626 <8abd> <8abd> 10833 <8abe> <8abe> 10827 <8abf> <8abf> 4636 <8ac0> <8ac0> 10828 <8ac2> <8ac2> 4635 <8ac3> <8ac3> 10831 <8ac4> <8ac4> 4629 <8ac5> <8ac5> 10829 <8ac6> <8ac6> 10819 <8ac7> <8ac7> 4628 <8ac8> <8ac8> 11407 <8ac9> <8ac9> 4634 <8acb> <8acb> 4631 <8acd> <8acd> 4639 <8acf> <8acf> 10818 <8ad1> <8ad1> 10822 <8ad2> <8ad2> 4627 <8ad3> <8ad3> 10821 <8ad4> <8ad5> 10823 <8ad6> <8ad6> 4638 <8ad7> <8ad7> 10826 <8ad8> <8ad8> 10830 <8ad9> <8ad9> 10834 <8ada> <8ada> 14786 <8adb> <8adb> 4642 <8adc> <8adc> 4946 <8add> <8add> 11402 <8ade> <8ade> 11408 <8adf> <8adf> 11405 <8ae0> <8ae0> 11397 <8ae1> <8ae1> 11409 <8ae2> <8ae2> 11398 <8ae4> <8ae4> 11404 <8ae6> <8ae6> 4941 <8ae7> <8ae7> 4947 <8ae8> <8ae8> 11410 <8aea> <8aea> 15833 <8aeb> <8aeb> 4943 <8aed> <8aed> 4953 <8aee> <8aee> 4948 <8aef> <8aef> 11412 <8af0> <8af0> 11406 <8af1> <8af1> 4944 <8af2> <8af2> 11399 <8af3> <8af3> 4954 <8af4> <8af5> 11400 <8af6> <8af6> 4955 <8af7> <8af7> 4952 <8af8> <8af8> 4632 <8afa> <8afa> 4942 <8afb> <8afb> 11413 <8afc> <8afc> 4956 <8afe> <8afe> 4949 <8aff> <8aff> 11411 <8b00> <8b00> 4945 <8b01> <8b02> 4950 <8b04> <8b04> 5246 <8b05> <8b05> 11871 <8b06> <8b06> 11880 <8b07> <8b07> 11877 <8b08> <8b08> 11879 <8b0a> <8b0a> 5243 <8b0b> <8b0b> 11872 <8b0c> <8b0c> 14390 <8b0d> <8b0d> 11878 <8b0e> <8b0e> 5239 <8b0f> <8b0f> 11874 <8b10> <8b10> 5247 <8b11> <8b11> 11870 <8b12> <8b12> 11875 <8b13> <8b13> 11882 <8b14> <8b14> 11403 <8b15> <8b15> 11876 <8b16> <8b16> 11869 <8b17> <8b17> 5240 <8b18> <8b18> 11868 <8b19> <8b19> 5241 <8b1a> <8b1a> 11883 <8b1b> <8b1b> 5242 <8b1c> <8b1c> 11881 <8b1d> <8b1d> 5245 <8b1e> <8b1e> 11867 <8b1f> <8b1f> 14391 <8b20> <8b20> 5244 <8b22> <8b22> 11873 <8b23> <8b23> 12238 <8b24> <8b24> 12252 <8b25> <8b25> 12247 <8b26> <8b26> 12249 <8b27> <8b27> 12237 <8b28> <8b28> 5418 <8b2a> <8b2a> 12236 <8b2b> <8b2b> 5421 <8b2c> <8b2c> 5420 endcidrange 100 begincidrange <8b2d> <8b2d> 16281 <8b2e> <8b2e> 12251 <8b2f> <8b2f> 12243 <8b30> <8b30> 12240 <8b31> <8b31> 12246 <8b33> <8b33> 12239 <8b35> <8b35> 12241 <8b36> <8b36> 12250 <8b37> <8b37> 12248 <8b39> <8b39> 5419 <8b3a> <8b3a> 12255 <8b3b> <8b3b> 12253 <8b3c> <8b3c> 12244 <8b3d> <8b3d> 12254 <8b3e> <8b3e> 12245 <8b3f> <8b3f> 14394 <8b40> <8b40> 12581 <8b41> <8b41> 5572 <8b42> <8b42> 12588 <8b43> <8b43> 16370 <8b45> <8b45> 13075 <8b46> <8b46> 5579 <8b47> <8b47> 12242 <8b48> <8b48> 12579 <8b49> <8b49> 5575 <8b4a> <8b4a> 12580 <8b4b> <8b4b> 12585 <8b4c> <8b4d> 14395 <8b4e> <8b4f> 5577 <8b50> <8b50> 12578 <8b51> <8b51> 12587 <8b52> <8b52> 12589 <8b53> <8b53> 12582 <8b54> <8b54> 12584 <8b55> <8b55> 12586 <8b56> <8b56> 12583 <8b57> <8b57> 12590 <8b58> <8b58> 5574 <8b59> <8b59> 5580 <8b5a> <8b5a> 5576 <8b5c> <8b5c> 5573 <8b5d> <8b5d> 12855 <8b5e> <8b5e> 15800 <8b5f> <8b5f> 5704 <8b60> <8b60> 12853 <8b62> <8b62> 15828 <8b63> <8b63> 12857 <8b65> <8b65> 12858 <8b66> <8b66> 5702 <8b67> <8b67> 12859 <8b68> <8b68> 12856 <8b69> <8b69> 15351 <8b6a> <8b6a> 12854 <8b6b> <8b6b> 5705 <8b6c> <8b6c> 5701 <8b6d> <8b6d> 12860 <8b6f> <8b6f> 5703 <8b70> <8b70> 5700 <8b74> <8b74> 5775 <8b77> <8b77> 5776 <8b78> <8b78> 13074 <8b79> <8b79> 13073 <8b7a> <8b7b> 13076 <8b7d> <8b7d> 5777 <8b7e> <8b7e> 13238 <8b7f> <8b7f> 13243 <8b80> <8b80> 5848 <8b81> <8b81> 15757 <8b82> <8b82> 13240 <8b84> <8b84> 13239 <8b85> <8b85> 13242 <8b86> <8b86> 13241 <8b88> <8b88> 13376 <8b8a> <8b8a> 5898 <8b8b> <8b8b> 13375 <8b8c> <8b8c> 13373 <8b8e> <8b8e> 13374 <8b90> <8b90> 14399 <8b92> <8b92> 5932 <8b93> <8b93> 5931 <8b94> <8b95> 13468 <8b96> <8b96> 5933 <8b98> <8b99> 13543 <8b9a> <8b9a> 5972 <8b9b> <8b9b> 14400 <8b9c> <8b9c> 5978 <8b9e> <8b9e> 13602 <8b9f> <8b9f> 13631 <8ba0> <8ba0> 17669 <8bbe> <8bbe> 17767 <8be2> <8be2> 17768 <8c37> <8c37> 1291 <8c39> <8c39> 8299 <8c3b> <8c3b> 8300 <8c3c> <8c3c> 9623 <8c3d> <8c3d> 10249 <8c3e> <8c3e> 10835 <8c3f> <8c3f> 5249 <8c41> <8c41> 5248 <8c42> <8c42> 12256 endcidrange 100 begincidrange <8c43> <8c43> 12591 <8c45> <8c45> 13377 <8c46> <8c46> 1292 <8c47> <8c47> 7689 <8c48> <8c48> 2505 <8c49> <8c49> 2983 <8c4a> <8c4a> 9625 <8c4b> <8c4b> 9624 <8c4c> <8c4c> 4643 <8c4d> <8c4d> 10836 <8c4e> <8c4e> 4644 <8c4f> <8c4f> 11884 <8c50> <8c50> 5422 <8c51> <8c51> 18301 <8c54> <8c54> 5987 <8c55> <8c55> 1293 <8c56> <8c56> 6728 <8c57> <8c57> 7690 <8c5a> <8c5a> 2984 <8c5c> <8c5d> 8301 <8c5f> <8c5f> 8952 <8c61> <8c61> 3429 <8c62> <8c62> 3867 <8c64> <8c64> 9627 <8c65> <8c65> 9626 <8c66> <8c66> 9628 <8c68> <8c69> 10250 <8c6a> <8c6a> 4276 <8c6b> <8c6b> 4957 <8c6c> <8c6c> 4645 <8c6d> <8c6d> 4958 <8c6f> <8c6f> 11888 <8c70> <8c70> 11885 <8c71> <8c71> 11887 <8c72> <8c72> 11886 <8c73> <8c73> 5250 <8c75> <8c75> 12257 <8c76> <8c76> 12593 <8c77> <8c77> 12592 <8c78> <8c78> 6375 <8c79> <8c79> 2507 <8c7a> <8c7a> 2506 <8c7b> <8c7b> 7691 <8c7d> <8c7d> 8303 <8c80> <8c80> 8954 <8c81> <8c81> 8953 <8c82> <8c82> 3430 <8c84> <8c85> 9630 <8c86> <8c86> 9629 <8c89> <8c89> 3869 <8c8a> <8c8a> 3868 <8c8c> <8c8c> 4278 <8c8d> <8c8d> 4277 <8c8f> <8c8f> 10837 <8c90> <8c90> 11416 <8c91> <8c92> 11414 <8c93> <8c93> 4959 <8c94> <8c94> 11890 <8c95> <8c95> 11889 <8c97> <8c97> 12260 <8c98> <8c98> 12259 <8c99> <8c99> 12258 <8c9a> <8c9a> 12594 <8c9b> <8c9b> 14405 <8c9c> <8c9c> 13603 <8c9d> <8c9d> 1294 <8c9e> <8c9e> 2058 <8c9f> <8c9f> 15277 <8ca0> <8ca0> 2059 <8ca1> <8ca2> 2508 <8ca3> <8ca3> 7693 <8ca4> <8ca4> 7692 <8ca5> <8ca5> 8304 <8ca7> <8ca7> 2990 <8ca8> <8ca8> 2988 <8ca9> <8ca9> 2985 <8caa> <8caa> 2989 <8cab> <8cab> 2987 <8cac> <8cac> 2986 <8cad> <8cad> 16369 <8caf> <8caf> 3431 <8cb0> <8cb0> 8957 <8cb2> <8cb2> 3874 <8cb3> <8cb3> 3433 <8cb4> <8cb4> 3438 <8cb5> <8cb5> 8959 <8cb6> <8cb6> 3440 <8cb7> <8cb7> 3439 <8cb8> <8cb8> 3442 <8cb9> <8cb9> 8958 <8cba> <8cba> 8955 <8cbb> <8cbb> 3436 <8cbc> <8cbc> 3432 <8cbd> <8cbd> 3434 <8cbe> <8cbe> 8956 <8cbf> <8cbf> 3441 <8cc0> <8cc0> 3437 <8cc1> <8cc1> 3435 <8cc2> <8cc2> 3876 <8cc3> <8cc3> 3875 endcidrange 100 begincidrange <8cc4> <8cc4> 3873 <8cc5> <8cc5> 3877 <8cc7> <8cc8> 3871 <8cca> <8cca> 3870 <8ccc> <8ccc> 9632 <8ccd> <8ccd> 16025 <8ccf> <8ccf> 10253 <8cd1> <8cd2> 4280 <8cd3> <8cd3> 4279 <8cd4> <8cd4> 18302 <8cd5> <8cd5> 10252 <8cd6> <8cd6> 14411 <8cd7> <8cd7> 10254 <8cd9> <8cd9> 10840 <8cda> <8cda> 10842 <8cdb> <8cdb> 14417 <8cdc> <8cdc> 4654 <8cdd> <8cdd> 10843 <8cde> <8cde> 4647 <8cdf> <8cdf> 10839 <8ce0> <8ce0> 4646 <8ce1> <8ce1> 4656 <8ce2> <8ce3> 4652 <8ce4> <8ce4> 4649 <8ce5> <8ce5> 10838 <8ce6> <8ce6> 4648 <8ce7> <8ce7> 10844 <8ce8> <8ce8> 10841 <8ce9> <8ce9> 15278 <8cea> <8cea> 4655 <8ceb> <8ceb> 16284 <8cec> <8ced> 4650 <8cee> <8cee> 11418 <8cf0> <8cf0> 11420 <8cf1> <8cf1> 11419 <8cf2> <8cf2> 18303 <8cf3> <8cf3> 11421 <8cf4> <8cf4> 4960 <8cf5> <8cf5> 11417 <8cf7> <8cf7> 16305 <8cf8> <8cf8> 5254 <8cf9> <8cf9> 11891 <8cfa> <8cfa> 5251 <8cfb> <8cfb> 5255 <8cfc> <8cfc> 5253 <8cfd> <8cfd> 5252 <8cfe> <8cfe> 12261 <8d00> <8d00> 12264 <8d02> <8d02> 12263 <8d03> <8d03> 14415 <8d04> <8d04> 12262 <8d05> <8d05> 5423 <8d06> <8d07> 12595 <8d08> <8d08> 5581 <8d09> <8d09> 12597 <8d0a> <8d0a> 5582 <8d0b> <8d0b> 17779 <8d0c> <8d0c> 16278 <8d0d> <8d0d> 5707 <8d0f> <8d0f> 5706 <8d10> <8d10> 13078 <8d11> <8d11> 14419 <8d12> <8d12> 14414 <8d13> <8d13> 5778 <8d14> <8d14> 13079 <8d15> <8d15> 13244 <8d16> <8d17> 5849 <8d18> <8d18> 15983 <8d19> <8d19> 13378 <8d1b> <8d1b> 5935 <8d1c> <8d1c> 18304 <8d1d> <8d1d> 17670 <8d64> <8d64> 1295 <8d66> <8d66> 2992 <8d67> <8d67> 2991 <8d68> <8d69> 9633 <8d6b> <8d6b> 4282 <8d6c> <8d6c> 11422 <8d6d> <8d6d> 4657 <8d6e> <8d6e> 11423 <8d6f> <8d6f> 11892 <8d70> <8d70> 1296 <8d72> <8d72> 7174 <8d73> <8d73> 2061 <8d74> <8d74> 2060 <8d76> <8d76> 7694 <8d77> <8d77> 2510 <8d78> <8d78> 7695 <8d79> <8d79> 8307 <8d7a> <8d7a> 14817 <8d7b> <8d7b> 8306 <8d7d> <8d7d> 8305 <8d80> <8d80> 8961 <8d81> <8d81> 3445 <8d82> <8d82> 16233 <8d84> <8d84> 8960 <8d85> <8d85> 3444 <8d89> <8d89> 8962 <8d8a> <8d8a> 3443 <8d8c> <8d8c> 9636 endcidrange 100 begincidrange <8d8d> <8d8d> 9639 <8d8e> <8d8f> 9637 <8d90> <8d90> 9642 <8d91> <8d91> 9635 <8d92> <8d92> 9643 <8d93> <8d94> 9640 <8d95> <8d95> 4284 <8d96> <8d96> 10255 <8d99> <8d99> 4283 <8d9b> <8d9b> 10848 <8d9c> <8d9c> 10846 <8d9f> <8d9f> 4658 <8da0> <8da0> 10845 <8da1> <8da1> 10847 <8da3> <8da3> 4659 <8da5> <8da5> 11424 <8da6> <8da6> 16375 <8da7> <8da7> 11425 <8da8> <8da8> 5256 <8da9> <8da9> 14422 <8daa> <8daa> 12599 <8dab> <8dab> 12601 <8dac> <8dac> 12598 <8dad> <8dad> 12600 <8dae> <8dae> 12861 <8daf> <8daf> 13080 <8db2> <8db2> 13577 <8db3> <8db3> 1297 <8db4> <8db4> 2062 <8db5> <8db5> 7696 <8db6> <8db6> 7698 <8db7> <8db7> 7697 <8db9> <8db9> 8310 <8dba> <8dba> 2994 <8dbc> <8dbc> 8308 <8dbe> <8dbe> 2993 <8dbf> <8dbf> 8311 <8dc0> <8dc0> 17258 <8dc1> <8dc1> 8312 <8dc2> <8dc2> 8309 <8dc3> <8dc3> 18306 <8dc5> <8dc5> 8974 <8dc6> <8dc6> 3453 <8dc7> <8dc7> 8966 <8dc8> <8dc8> 8972 <8dcb> <8dcb> 3448 <8dcc> <8dcc> 3451 <8dcd> <8dcd> 8965 <8dce> <8dce> 3446 <8dcf> <8dcf> 8969 <8dd0> <8dd0> 9649 <8dd1> <8dd1> 3450 <8dd3> <8dd3> 8964 <8dd4> <8dd4> 16258 <8dd5> <8dd5> 8970 <8dd6> <8dd6> 8967 <8dd7> <8dd7> 8973 <8dd8> <8dd8> 8963 <8dd9> <8dd9> 8971 <8dda> <8dda> 3449 <8ddb> <8ddb> 3452 <8ddc> <8ddc> 8968 <8ddd> <8ddd> 3447 <8ddf> <8ddf> 3879 <8de0> <8de0> 9645 <8de1> <8de1> 3878 <8de2> <8de2> 9652 <8de3> <8de3> 9651 <8de4> <8de4> 3885 <8de6> <8de6> 3886 <8de7> <8de7> 9653 <8de8> <8de8> 3880 <8de9> <8de9> 9650 <8dea> <8dea> 3884 <8deb> <8deb> 9655 <8dec> <8dec> 9646 <8dee> <8dee> 9648 <8def> <8def> 3881 <8df0> <8df0> 9644 <8df1> <8df1> 9647 <8df2> <8df2> 9654 <8df3> <8df3> 3882 <8df4> <8df4> 9656 <8dfa> <8dfa> 3883 <8dfc> <8dfc> 4285 <8dfd> <8dfd> 10260 <8dfe> <8dfe> 10266 <8dff> <8dff> 10258 <8e00> <8e00> 10267 <8e01> <8e01> 16261 <8e02> <8e02> 10257 <8e03> <8e03> 10262 <8e04> <8e04> 10268 <8e05> <8e05> 10265 <8e06> <8e06> 10264 <8e07> <8e07> 10263 <8e09> <8e09> 10256 <8e0a> <8e0a> 10261 <8e0d> <8e0d> 10259 <8e0e> <8e0e> 15966 endcidrange 100 begincidrange <8e0f> <8e0f> 4664 <8e10> <8e10> 4661 <8e11> <8e11> 10857 <8e12> <8e12> 10862 <8e13> <8e13> 10864 <8e14> <8e14> 10861 <8e15> <8e15> 10854 <8e16> <8e16> 10856 <8e17> <8e17> 10866 <8e18> <8e18> 10863 <8e19> <8e19> 10858 <8e1a> <8e1a> 10867 <8e1b> <8e1b> 10855 <8e1c> <8e1c> 10865 <8e1d> <8e1d> 4662 <8e1e> <8e1e> 4668 <8e1f> <8e1f> 4666 <8e20> <8e20> 10849 <8e21> <8e21> 4667 <8e22> <8e22> 4663 <8e23> <8e23> 10850 <8e24> <8e24> 10852 <8e25> <8e25> 10851 <8e26> <8e27> 10859 <8e28> <8e28> 16264 <8e29> <8e29> 4665 <8e2a> <8e2a> 15284 <8e2b> <8e2b> 4660 <8e2d> <8e2d> 16043 <8e2e> <8e2e> 10853 <8e30> <8e30> 11435 <8e31> <8e31> 4962 <8e33> <8e33> 11426 <8e34> <8e34> 4963 <8e35> <8e35> 4966 <8e36> <8e36> 11431 <8e38> <8e38> 11428 <8e39> <8e39> 4965 <8e3a> <8e3a> 18308 <8e3c> <8e3d> 11432 <8e3e> <8e3e> 11427 <8e3f> <8e3f> 11436 <8e40> <8e40> 11429 <8e41> <8e41> 11434 <8e42> <8e42> 4964 <8e44> <8e44> 4961 <8e45> <8e45> 11430 <8e46> <8e46> 17170 <8e47> <8e47> 11898 <8e48> <8e48> 5259 <8e49> <8e49> 5257 <8e4a> <8e4a> 5260 <8e4b> <8e4b> 5258 <8e4c> <8e4c> 11897 <8e4d> <8e4d> 11894 <8e4e> <8e4e> 11893 <8e4f> <8e4f> 16259 <8e50> <8e50> 11896 <8e53> <8e53> 11895 <8e54> <8e54> 12278 <8e55> <8e55> 5429 <8e56> <8e56> 12269 <8e57> <8e57> 12268 <8e59> <8e59> 5424 <8e5a> <8e5a> 12274 <8e5b> <8e5b> 12273 <8e5c> <8e5c> 12265 <8e5d> <8e5d> 12276 <8e5e> <8e5e> 12270 <8e5f> <8e5f> 5428 <8e60> <8e60> 12267 <8e61> <8e61> 12275 <8e62> <8e62> 12266 <8e63> <8e63> 5425 <8e64> <8e64> 5427 <8e65> <8e65> 12271 <8e66> <8e66> 5426 <8e67> <8e67> 12272 <8e68> <8e68> 17229 <8e69> <8e69> 12277 <8e6a> <8e6a> 12605 <8e6c> <8e6c> 5587 <8e6d> <8e6d> 12602 <8e6f> <8e6f> 12606 <8e71> <8e71> 17383 <8e72> <8e72> 5584 <8e73> <8e73> 12604 <8e74> <8e74> 5589 <8e75> <8e75> 16265 <8e76> <8e76> 5586 <8e77> <8e77> 16255 <8e78> <8e78> 12603 <8e7a> <8e7a> 5588 <8e7b> <8e7b> 12607 <8e7c> <8e7c> 5583 <8e7e> <8e7e> 17188 <8e80> <8e80> 15959 <8e81> <8e81> 5709 <8e82> <8e82> 5711 <8e84> <8e84> 12864 endcidrange 100 begincidrange <8e85> <8e85> 5710 <8e86> <8e86> 12862 <8e87> <8e87> 5585 <8e88> <8e88> 12863 <8e89> <8e89> 5708 <8e8a> <8e8a> 5779 <8e8b> <8e8b> 5781 <8e8c> <8e8c> 13082 <8e8d> <8e8d> 5780 <8e8e> <8e8e> 13081 <8e90> <8e90> 13249 <8e91> <8e91> 5851 <8e92> <8e92> 13248 <8e93> <8e93> 5852 <8e94> <8e94> 13246 <8e95> <8e95> 13245 <8e96> <8e97> 13250 <8e98> <8e98> 13379 <8e9a> <8e9a> 13247 <8e9d> <8e9d> 13473 <8e9e> <8ea0> 13470 <8ea1> <8ea1> 5961 <8ea3> <8ea3> 13547 <8ea4> <8ea4> 13546 <8ea5> <8ea5> 13545 <8ea6> <8ea6> 13578 <8ea7> <8ea7> 15285 <8ea8> <8ea8> 13623 <8ea9> <8ea9> 13604 <8eaa> <8eaa> 5979 <8eab> <8eab> 1298 <8eac> <8eac> 2511 <8ead> <8ead> 14430 <8eb0> <8eb0> 17385 <8eb2> <8eb2> 3887 <8eb6> <8eb6> 14431 <8eba> <8eba> 4669 <8ebc> <8ebc> 14496 <8ebd> <8ebd> 11437 <8ec0> <8ec0> 5430 <8ec2> <8ec2> 12608 <8ec3> <8ec3> 14432 <8ec9> <8ec9> 13605 <8eca> <8eca> 1299 <8ecb> <8ecb> 1677 <8ecc> <8ecc> 2064 <8ecd> <8ecd> 2063 <8ece> <8ece> 18312 <8ecf> <8ecf> 2514 <8ed1> <8ed1> 7699 <8ed2> <8ed2> 2512 <8ed3> <8ed3> 7700 <8ed4> <8ed4> 2513 <8ed7> <8ed7> 8317 <8ed8> <8ed8> 8313 <8eda> <8eda> 15806 <8edb> <8edb> 2995 <8edc> <8edc> 8316 <8edd> <8edd> 8315 <8ede> <8ede> 8314 <8edf> <8edf> 2996 <8ee0> <8ee1> 8318 <8ee2> <8ee2> 18313 <8ee4> <8ee4> 18314 <8ee5> <8ee5> 8981 <8ee6> <8ee6> 8979 <8ee7> <8ee8> 8983 <8ee9> <8ee9> 8990 <8eeb> <8eeb> 8986 <8eec> <8eec> 8988 <8eed> <8eed> 18315 <8eee> <8eee> 8980 <8eef> <8eef> 8975 <8ef1> <8ef1> 8987 <8ef2> <8ef2> 18316 <8ef4> <8ef4> 8989 <8ef5> <8ef5> 8982 <8ef6> <8ef6> 8985 <8ef7> <8ef7> 8976 <8ef8> <8ef8> 3455 <8ef9> <8ef9> 8978 <8efa> <8efa> 8977 <8efb> <8efb> 3454 <8efc> <8efc> 3456 <8efe> <8efe> 3890 <8eff> <8eff> 9658 <8f00> <8f00> 9660 <8f01> <8f01> 9659 <8f02> <8f02> 9664 <8f03> <8f03> 3888 <8f05> <8f05> 9661 <8f06> <8f06> 9657 <8f07> <8f08> 9662 <8f09> <8f09> 3889 <8f0a> <8f0a> 3891 <8f0b> <8f0b> 9665 <8f0d> <8f0d> 10272 <8f0e> <8f0e> 10271 <8f10> <8f11> 10269 <8f12> <8f12> 4287 endcidrange 100 begincidrange <8f13> <8f13> 4289 <8f14> <8f14> 4286 <8f15> <8f15> 4288 <8f16> <8f17> 10874 <8f18> <8f18> 10870 <8f19> <8f19> 14434 <8f1a> <8f1a> 10871 <8f1b> <8f1b> 4671 <8f1c> <8f1c> 4676 <8f1d> <8f1d> 4670 <8f1e> <8f1e> 4677 <8f1f> <8f1f> 4672 <8f20> <8f20> 10872 <8f23> <8f23> 10873 <8f24> <8f24> 10869 <8f25> <8f25> 4678 <8f26> <8f26> 4674 <8f29> <8f29> 4673 <8f2a> <8f2a> 4675 <8f2c> <8f2c> 10868 <8f2d> <8f2d> 14435 <8f2e> <8f2e> 11439 <8f2f> <8f2f> 4968 <8f30> <8f30> 15287 <8f32> <8f32> 11441 <8f33> <8f33> 4970 <8f34> <8f34> 11444 <8f35> <8f35> 11440 <8f36> <8f36> 11438 <8f37> <8f37> 11443 <8f38> <8f38> 4969 <8f39> <8f39> 11442 <8f3b> <8f3b> 4967 <8f3e> <8f3e> 5262 <8f3f> <8f3f> 5265 <8f40> <8f40> 11900 <8f41> <8f41> 15623 <8f42> <8f42> 5263 <8f43> <8f43> 11899 <8f44> <8f44> 5261 <8f45> <8f45> 5264 <8f46> <8f48> 12279 <8f49> <8f49> 5431 <8f4a> <8f4a> 15288 <8f4b> <8f4b> 12282 <8f4d> <8f4d> 5432 <8f4e> <8f4e> 5591 <8f4f> <8f50> 12611 <8f51> <8f51> 12610 <8f52> <8f52> 12609 <8f53> <8f53> 12613 <8f54> <8f54> 5590 <8f55> <8f55> 12868 <8f56> <8f57> 12866 <8f58> <8f58> 12869 <8f59> <8f59> 12865 <8f5a> <8f5a> 12870 <8f5b> <8f5b> 13084 <8f5c> <8f5c> 16177 <8f5d> <8f5d> 13085 <8f5e> <8f5e> 13083 <8f5f> <8f5f> 5782 <8f60> <8f60> 13252 <8f61> <8f61> 5853 <8f62> <8f62> 13253 <8f63> <8f63> 13381 <8f64> <8f64> 13380 <8f66> <8f67> 17769 <8f6e> <8f6e> 17771 <8f93> <8f93> 18226 <8f9b> <8f9b> 1300 <8f9c> <8f9c> 3457 <8f9f> <8f9f> 3892 <8fa0> <8fa0> 15764 <8fa3> <8fa3> 4290 <8fa5> <8fa5> 14438 <8fa6> <8fa6> 4972 <8fa8> <8fa8> 4971 <8fad> <8fad> 5592 <8fae> <8fae> 5679 <8faf> <8faf> 5783 <8fb0> <8fb0> 1301 <8fb1> <8fb1> 2515 <8fb2> <8fb2> 3893 <8fb3> <8fb3> 14442 <8fb4> <8fb4> 12614 <8fb5> <8fb5> 560 <8fb6> <8fb6> 18387 <8fb7> <8fb7> 17405 <8fb8> <8fb8> 17142 <8fb9> <8fb9> 18633 <8fba> <8fba> 18631 <8fbb> <8fbc> 15723 <8fbe> <8fbe> 18630 <8fbf> <8fbf> 6377 <8fc1> <8fc1> 18317 <8fc2> <8fc2> 1302 <8fc4> <8fc4> 1305 <8fc5> <8fc5> 1304 <8fc6> <8fc6> 1303 endcidrange 100 begincidrange <8fc9> <8fc9> 6376 <8fca> <8fca> 18318 <8fcb> <8fcb> 6730 <8fcc> <8fcc> 18319 <8fcd> <8fcd> 6732 <8fce> <8fce> 1678 <8fd0> <8fd0> 18606 <8fd1> <8fd1> 1680 <8fd2> <8fd2> 6729 <8fd3> <8fd3> 6731 <8fd4> <8fd4> 1679 <8fd5> <8fd5> 6734 <8fd6> <8fd6> 6733 <8fd7> <8fd7> 6735 <8fda> <8fda> 16331 <8fe0> <8fe0> 7178 <8fe1> <8fe1> 7176 <8fe2> <8fe2> 2067 <8fe3> <8fe3> 7175 <8fe4> <8fe4> 2072 <8fe5> <8fe5> 2069 <8fe6> <8fe6> 2066 <8fe8> <8fe8> 2073 <8fea> <8fea> 2068 <8feb> <8feb> 2071 <8fed> <8fed> 2070 <8fee> <8fee> 7177 <8ff0> <8ff0> 2065 <8ff4> <8ff4> 2521 <8ff5> <8ff5> 7702 <8ff6> <8ff6> 7708 <8ff7> <8ff7> 2518 <8ff8> <8ff8> 2525 <8ff9> <8ff9> 14449 <8ffa> <8ffa> 2520 <8ffb> <8ffb> 7705 <8ffc> <8ffc> 7707 <8ffd> <8ffd> 2523 <8ffe> <8ffe> 7701 <8fff> <8fff> 7704 <9000> <9000> 2519 <9001> <9001> 2516 <9002> <9002> 7703 <9003> <9003> 2522 <9004> <9004> 7706 <9005> <9005> 2524 <9006> <9006> 2517 <9008> <9008> 16096 <900b> <900b> 8321 <900c> <900c> 8324 <900d> <900d> 2998 <900f> <900f> 3008 <9010> <9010> 3004 <9011> <9011> 8322 <9012> <9012> 15950 <9014> <9014> 3012 <9015> <9015> 3005 <9016> <9016> 3010 <9017> <9017> 3000 <9019> <9019> 2997 <901a> <901a> 2999 <901b> <901b> 3011 <901c> <901c> 8323 <901d> <901d> 3003 <901e> <901e> 3006 <901f> <901f> 3002 <9020> <9020> 3007 <9021> <9021> 8325 <9022> <9022> 3009 <9023> <9023> 3001 <9024> <9024> 8320 <902d> <902d> 8991 <902e> <902e> 3458 <902f> <902f> 8993 <9031> <9031> 3460 <9032> <9032> 3462 <9033> <9033> 18320 <9034> <9034> 8992 <9035> <9035> 3459 <9036> <9036> 3463 <9037> <9037> 14454 <9038> <9038> 3461 <903c> <903c> 3899 <903d> <903d> 9670 <903e> <903e> 3907 <903f> <903f> 9667 <9041> <9041> 3908 <9042> <9042> 3897 <9044> <9044> 9668 <9047> <9047> 3902 <9049> <9049> 9669 <904a> <904a> 3895 <904b> <904b> 3894 <904c> <904c> 16144 <904d> <904d> 3905 <904e> <904e> 3904 <904f> <904f> 3903 <9050> <9050> 3901 <9051> <9051> 3906 <9052> <9052> 9666 endcidrange 100 begincidrange <9053> <9053> 3896 <9054> <9054> 3898 <9055> <9055> 3900 <9056> <9056> 15826 <9058> <9058> 4292 <9059> <9059> 4295 <905b> <905b> 4299 <905c> <905c> 4293 <905d> <905d> 4298 <905e> <905e> 4296 <9060> <9060> 4291 <9061> <9061> 14457 <9062> <9062> 4297 <9063> <9063> 4294 <9064> <9064> 15464 <9067> <9067> 10879 <9068> <9068> 4681 <9069> <9069> 4679 <906b> <906b> 10880 <906c> <906c> 15712 <906d> <906d> 4682 <906e> <906e> 4680 <906f> <906f> 10878 <9070> <9070> 10877 <9072> <9072> 4976 <9073> <9073> 10876 <9074> <9074> 4974 <9075> <9075> 4973 <9076> <9076> 11445 <9077> <9077> 4683 <9078> <9078> 4975 <9079> <9079> 11446 <907a> <907a> 4978 <907b> <907b> 11447 <907c> <907c> 4977 <907d> <907d> 5267 <907e> <907e> 11902 <907f> <907f> 5266 <9080> <9080> 5271 <9081> <9082> 5269 <9083> <9083> 5434 <9084> <9084> 5268 <9085> <9085> 11901 <9086> <9086> 11448 <9087> <9087> 5433 <9088> <9088> 5435 <908a> <908b> 5593 <908d> <908d> 12871 <908f> <908f> 5900 <9090> <9090> 5899 <9091> <9091> 1307 <9094> <9094> 6174 <9095> <9095> 2526 <9097> <9098> 6171 <9099> <9099> 6170 <909b> <909b> 6173 <909e> <909e> 6381 <909f> <909f> 6378 <90a0> <90a0> 6383 <90a1> <90a1> 6379 <90a2> <90a2> 1308 <90a3> <90a3> 1311 <90a5> <90a5> 6380 <90a6> <90a6> 1310 <90a7> <90a7> 6382 <90a8> <90a8> 14460 <90aa> <90aa> 1309 <90ae> <90ae> 14464 <90af> <90af> 6738 <90b0> <90b0> 6740 <90b1> <90b1> 1683 <90b2> <90b2> 6736 <90b3> <90b3> 6739 <90b4> <90b4> 6737 <90b5> <90b5> 1681 <90b6> <90b6> 1684 <90b8> <90b8> 1682 <90bb> <90bb> 15300 <90bd> <90bd> 7180 <90be> <90be> 7184 <90bf> <90bf> 7181 <90c1> <90c1> 2076 <90c3> <90c3> 2077 <90c4> <90c4> 14462 <90c5> <90c5> 7183 <90c7> <90c7> 7185 <90c8> <90c8> 7187 <90ca> <90ca> 2074 <90cb> <90cb> 7186 <90ce> <90ce> 2075 <90d4> <90d4> 8332 <90d5> <90d5> 7182 <90d6> <90d6> 7709 <90d7> <90d7> 7718 <90d8> <90d8> 7716 <90d9> <90da> 7711 <90db> <90db> 7717 <90dc> <90dc> 7719 <90dd> <90dd> 2528 <90df> <90df> 7714 endcidrange 100 begincidrange <90e0> <90e0> 7710 <90e1> <90e1> 2527 <90e2> <90e2> 2529 <90e3> <90e3> 7713 <90e4> <90e4> 7720 <90e5> <90e5> 7715 <90e8> <90e8> 3013 <90e9> <90e9> 8335 <90ea> <90ea> 8327 <90eb> <90ec> 8333 <90ed> <90ed> 3014 <90ef> <90ef> 8326 <90f0> <90f0> 8328 <90f1> <90f1> 7179 <90f2> <90f3> 8330 <90f4> <90f4> 8329 <90f5> <90f5> 3465 <90f9> <90f9> 9000 <90fa> <90fa> 11449 <90fb> <90fb> 9001 <90fc> <90fc> 8998 <90fd> <90fd> 3015 <90fe> <90fe> 3467 <90ff> <90ff> 8997 <9100> <9100> 9003 <9101> <9101> 9002 <9102> <9102> 3464 <9103> <9103> 9006 <9104> <9104> 8996 <9105> <9105> 9005 <9106> <9106> 8994 <9107> <9107> 9004 <9108> <9108> 8999 <9109> <9109> 3466 <910b> <910b> 9677 <910d> <910d> 9672 <910e> <910e> 9678 <910f> <910f> 9673 <9110> <9110> 9671 <9111> <9111> 9674 <9112> <9112> 3909 <9114> <9114> 9676 <9116> <9116> 9675 <9117> <9117> 3910 <9118> <9118> 4301 <9119> <9119> 4300 <911a> <911a> 10279 <911b> <911b> 10282 <911c> <911c> 10274 <911d> <911d> 10278 <911e> <911e> 4302 <911f> <911f> 10277 <9120> <9120> 10275 <9121> <9121> 10281 <9122> <9122> 10276 <9123> <9123> 10273 <9124> <9124> 10280 <9126> <9126> 10886 <9127> <9127> 4686 <9128> <9128> 12283 <9129> <912a> 10883 <912b> <912b> 10882 <912c> <912c> 8995 <912d> <912d> 4685 <912e> <912e> 10887 <912f> <912f> 10881 <9130> <9130> 4684 <9131> <9131> 4687 <9132> <9132> 10885 <9133> <9133> 11450 <9134> <9134> 4979 <9135> <9136> 11451 <9138> <9138> 11903 <9139> <9139> 5272 <913a> <913b> 12284 <913e> <913e> 12286 <913f> <913f> 12616 <9140> <9140> 12615 <9141> <9141> 12873 <9143> <9143> 12872 <9144> <9145> 13087 <9146> <9146> 13086 <9147> <9147> 13254 <9148> <9148> 5854 <9149> <9149> 1312 <914a> <914a> 2079 <914b> <914b> 2078 <914c> <914c> 2532 <914d> <914d> 2531 <914e> <914f> 7722 <9150> <9150> 7721 <9151> <9151> 16201 <9152> <9152> 2530 <9153> <9153> 8339 <9155> <9155> 8340 <9156> <9156> 8336 <9157> <9157> 3016 <9158> <9158> 8337 <9159> <9159> 16197 <915a> <915a> 8338 endcidrange 100 begincidrange <915c> <915c> 16199 <915e> <915e> 17387 <915f> <915f> 9009 <9160> <9160> 9011 <9161> <9161> 9007 <9162> <9162> 9010 <9163> <9163> 3468 <9164> <9164> 9008 <9165> <9165> 3469 <9167> <9167> 14466 <9168> <9168> 9186 <9169> <9169> 3913 <916a> <916a> 3912 <916c> <916c> 3911 <916e> <916f> 9679 <9170> <9170> 16056 <9172> <9172> 10284 <9173> <9173> 10286 <9174> <9174> 4306 <9175> <9175> 4303 <9176> <9176> 16027 <9177> <9177> 4305 <9178> <9178> 4304 <9179> <9179> 10285 <917a> <917a> 10283 <917c> <917c> 16239 <9180> <9180> 10894 <9181> <9182> 10891 <9183> <9183> 4691 <9184> <9184> 10893 <9185> <9186> 10888 <9187> <9187> 4688 <9189> <9189> 4689 <918a> <918a> 10890 <918b> <918b> 4690 <918c> <918c> 17388 <918d> <918d> 11456 <918e> <918e> 16206 <918f> <918f> 11457 <9190> <9191> 11454 <9192> <9192> 4980 <9193> <9193> 11453 <9199> <9199> 11907 <919a> <919a> 11904 <919b> <919b> 11906 <919c> <919c> 5275 <919d> <919d> 11910 <919e> <919e> 5274 <919f> <919f> 11908 <91a0> <91a0> 11911 <91a1> <91a1> 11909 <91a2> <91a2> 11905 <91a3> <91a3> 5273 <91a5> <91a5> 12288 <91a7> <91a7> 12289 <91a8> <91a8> 12287 <91a9> <91a9> 14467 <91aa> <91aa> 12291 <91ab> <91ac> 5436 <91ad> <91ad> 12618 <91ae> <91ae> 5596 <91af> <91af> 12290 <91b0> <91b0> 12617 <91b1> <91b1> 5595 <91b2> <91b3> 12876 <91b4> <91b4> 5712 <91b5> <91b5> 12875 <91b6> <91b6> 17903 <91b7> <91b7> 12874 <91b9> <91b9> 13089 <91ba> <91ba> 5784 <91bb> <91bb> 15304 <91bc> <91bc> 13382 <91bd> <91bd> 13475 <91be> <91be> 13474 <91c0> <91c0> 5936 <91c1> <91c1> 5962 <91c2> <91c2> 13476 <91c3> <91c3> 13579 <91c4> <91c4> 14468 <91c5> <91c5> 5980 <91c6> <91c6> 1313 <91c7> <91c7> 1685 <91c9> <91c9> 3914 <91cb> <91cb> 5713 <91cc> <91cc> 1314 <91cd> <91cd> 2080 <91ce> <91ce> 3017 <91cf> <91cf> 3470 <91d0> <91d0> 5438 <91d1> <91d1> 1686 <91d3> <91d3> 7189 <91d4> <91d4> 7188 <91d5> <91d5> 7724 <91d6> <91d6> 16734 <91d7> <91d7> 2535 <91d8> <91d8> 2533 <91d9> <91d9> 2537 <91da> <91da> 7726 <91dc> <91dc> 2536 endcidrange 100 begincidrange <91dd> <91dd> 2534 <91df> <91df> 17722 <91e2> <91e2> 7725 <91e3> <91e3> 3020 <91e4> <91e4> 8346 <91e5> <91e5> 15366 <91e6> <91e6> 3019 <91e7> <91e7> 3021 <91e8> <91e8> 8351 <91e9> <91e9> 3023 <91ea> <91eb> 8348 <91ec> <91ec> 8341 <91ed> <91ed> 3022 <91ee> <91ee> 8352 <91f1> <91f1> 8343 <91f3> <91f3> 8344 <91f4> <91f4> 8342 <91f5> <91f5> 3018 <91f7> <91f7> 8350 <91f8> <91f8> 8345 <91f9> <91f9> 8347 <91fa> <91fa> 15096 <91fd> <91fd> 9023 <91fe> <91fe> 14382 <91ff> <91ff> 9022 <9200> <9200> 9020 <9201> <9201> 9012 <9202> <9202> 9027 <9203> <9203> 9015 <9204> <9204> 9025 <9205> <9205> 9032 <9206> <9206> 9024 <9207> <9207> 3478 <9208> <9208> 16057 <9209> <9209> 3474 <920a> <920a> 9013 <920c> <920c> 9019 <920d> <920d> 3476 <920e> <920e> 14472 <920f> <920f> 9018 <9210> <9210> 3477 <9211> <9211> 3479 <9212> <9212> 9021 <9213> <9213> 18323 <9214> <9215> 3471 <9216> <9216> 9033 <9217> <9217> 9031 <9219> <9219> 9030 <921a> <921a> 9016 <921c> <921c> 9028 <921e> <921e> 3475 <9223> <9223> 3473 <9224> <9224> 9029 <9225> <9225> 9014 <9226> <9226> 9017 <9227> <9227> 9026 <9228> <9228> 18325 <922a> <922a> 15374 <922b> <922b> 15270 <922d> <922d> 10321 <922e> <922e> 9690 <9230> <9230> 9683 <9231> <9231> 9702 <9232> <9232> 9711 <9233> <9233> 9686 <9234> <9234> 3925 <9235> <9235> 15142 <9236> <9236> 9699 <9237> <9237> 3915 <9238> <9238> 3917 <9239> <9239> 3929 <923a> <923a> 9684 <923c> <923c> 16850 <923d> <923d> 3918 <923e> <923e> 3920 <923f> <923f> 3930 <9240> <9240> 3919 <9241> <9241> 14474 <9244> <9244> 14490 <9245> <9245> 3928 <9246> <9246> 9692 <9248> <9248> 9681 <9249> <9249> 3926 <924a> <924a> 9691 <924b> <924b> 3922 <924c> <924c> 9709 <924d> <924d> 3927 <924e> <924e> 9707 <924f> <924f> 9695 <9250> <9250> 9705 <9251> <9251> 3924 <9252> <9252> 9682 <9253> <9253> 9708 <9254> <9254> 9703 <9255> <9255> 15943 <9256> <9256> 9710 <9257> <9257> 3916 <9258> <9258> 18326 <925a> <925a> 3931 <925b> <925b> 3921 endcidrange 100 begincidrange <925d> <925d> 14851 <925e> <925e> 9688 <925f> <925f> 15584 <9260> <9260> 9696 <9261> <9261> 9700 <9262> <9262> 14475 <9263> <9263> 9704 <9264> <9264> 3923 <9265> <9265> 9687 <9266> <9266> 9685 <9267> <9267> 9697 <926b> <926b> 18327 <926c> <926c> 9694 <926d> <926d> 9693 <926e> <926e> 15621 <926f> <926f> 9698 <9270> <9270> 9701 <9272> <9272> 9706 <9276> <9276> 10289 <9277> <9277> 15460 <9278> <9278> 4307 <9279> <9279> 10299 <927a> <927a> 10291 <927b> <927b> 4313 <927c> <927c> 4317 <927d> <927d> 10308 <927e> <927e> 10316 <927f> <927f> 10301 <9280> <9280> 4309 <9281> <9281> 15873 <9282> <9282> 10305 <9283> <9283> 9689 <9284> <9284> 15545 <9285> <9285> 4310 <9286> <9286> 10312 <9287> <9287> 10317 <9288> <9288> 10309 <9289> <9289> 15029 <928a> <928a> 10311 <928b> <928b> 10320 <928c> <928c> 10313 <928d> <928d> 10295 <928e> <928e> 10304 <928f> <928f> 18109 <9291> <9291> 4318 <9293> <9293> 4314 <9294> <9294> 10293 <9295> <9295> 10306 <9296> <9296> 4312 <9297> <9297> 10300 <9298> <9298> 4311 <9299> <9299> 10314 <929a> <929a> 10297 <929b> <929b> 10290 <929c> <929c> 4315 <929d> <929d> 10319 <92a0> <92a0> 10292 <92a1> <92a1> 10310 <92a2> <92a2> 10307 <92a3> <92a3> 10302 <92a4> <92a4> 10288 <92a5> <92a5> 10287 <92a6> <92a6> 10296 <92a7> <92a7> 10315 <92a8> <92a8> 4316 <92a9> <92a9> 10318 <92aa> <92aa> 10294 <92ab> <92ab> 10298 <92ac> <92ac> 4308 <92ae> <92ae> 18329 <92b1> <92b1> 18328 <92b2> <92b2> 4703 <92b3> <92b3> 4698 <92b4> <92b4> 10928 <92b5> <92b5> 10924 <92b6> <92b6> 10900 <92b7> <92b7> 4694 <92b9> <92b9> 14057 <92ba> <92ba> 15349 <92bb> <92bb> 4693 <92bc> <92bc> 4699 <92be> <92be> 15456 <92bf> <92bf> 18330 <92c0> <92c0> 10898 <92c1> <92c1> 4697 <92c2> <92c2> 10910 <92c3> <92c4> 10896 <92c5> <92c5> 4692 <92c6> <92c6> 10927 <92c7> <92c7> 4701 <92c8> <92c8> 10913 <92c9> <92c9> 10918 <92ca> <92ca> 10912 <92cb> <92cb> 11475 <92cc> <92cc> 10908 <92cd> <92cd> 10916 <92ce> <92ce> 10914 <92cf> <92cf> 10901 <92d0> <92d0> 10895 <92d1> <92d1> 10922 endcidrange 100 begincidrange <92d2> <92d2> 4700 <92d3> <92d3> 10923 <92d4> <92d4> 14433 <92d5> <92d5> 10917 <92d7> <92d7> 10906 <92d8> <92d8> 10904 <92d9> <92d9> 10899 <92db> <92db> 16396 <92dd> <92dd> 10907 <92de> <92de> 10920 <92df> <92df> 10903 <92e0> <92e0> 10919 <92e1> <92e1> 10925 <92e3> <92e3> 18331 <92e4> <92e4> 4696 <92e5> <92e5> 15522 <92e6> <92e6> 10915 <92e7> <92e7> 10921 <92e8> <92e8> 10911 <92e9> <92e9> 10905 <92ea> <92ea> 4695 <92eb> <92eb> 18332 <92ec> <92ec> 14692 <92ee> <92ee> 10303 <92ef> <92ef> 10909 <92f0> <92f0> 4702 <92f1> <92f1> 10902 <92f2> <92f2> 15026 <92f3> <92f4> 18333 <92f6> <92f6> 15364 <92f7> <92f7> 11480 <92f8> <92f8> 4983 <92f9> <92f9> 11479 <92fa> <92fa> 11477 <92fb> <92fb> 11495 <92fc> <92fc> 4987 <92fd> <92fd> 18335 <92fe> <92fe> 11492 <92ff> <92ff> 11484 <9300> <9300> 11494 <9301> <9301> 11470 <9302> <9302> 11482 <9303> <9303> 14439 <9304> <9304> 4989 <9306> <9306> 11462 <9307> <9307> 15121 <9308> <9308> 11460 <9309> <9309> 11493 <930b> <930b> 11491 <930c> <930c> 11490 <930d> <930d> 11474 <930e> <930e> 11473 <930f> <930f> 11463 <9310> <9310> 4991 <9312> <9312> 11469 <9313> <9313> 11478 <9314> <9314> 11489 <9315> <9315> 4994 <9316> <9316> 11496 <9318> <9318> 5283 <9319> <9319> 4996 <931a> <931a> 4990 <931b> <931b> 11467 <931d> <931d> 11476 <931e> <931e> 11459 <931f> <931f> 11461 <9320> <9320> 4981 <9321> <9321> 4993 <9322> <9322> 4986 <9323> <9323> 11468 <9324> <9324> 11483 <9325> <9325> 10926 <9326> <9326> 4992 <9327> <9327> 11458 <9328> <9328> 5278 <9329> <9329> 11485 <932a> <932a> 11488 <932b> <932b> 4988 <932c> <932c> 14482 <932d> <932d> 11472 <932e> <932e> 4995 <932f> <932f> 4985 <9330> <9330> 15875 <9331> <9331> 15549 <9333> <9333> 4984 <9334> <9334> 11481 <9335> <9335> 11487 <9336> <9336> 4982 <9338> <9338> 11465 <9339> <9339> 11486 <933c> <933c> 11466 <9340> <9340> 16725 <9341> <9341> 17015 <9342> <9342> 15098 <9343> <9343> 18336 <9344> <9344> 16406 <9345> <9345> 15988 <9346> <9346> 11471 <9347> <9347> 11917 <9348> <9348> 15457 endcidrange 100 begincidrange <9349> <9349> 11922 <934a> <934a> 5280 <934b> <934b> 5282 <934c> <934c> 11928 <934d> <934d> 5276 <934e> <934e> 11942 <934f> <934f> 11934 <9350> <9351> 11923 <9352> <9352> 11933 <9354> <9354> 5289 <9355> <9355> 11932 <9356> <9356> 11916 <9357> <9357> 11931 <9358> <9358> 11919 <9359> <9359> 11943 <935a> <935a> 5288 <935b> <935b> 5286 <935c> <935c> 11920 <935e> <935e> 11939 <935f> <935f> 15547 <9360> <9360> 11925 <9361> <9361> 11938 <9362> <9362> 17000 <9363> <9363> 11940 <9364> <9364> 11915 <9365> <9365> 5281 <9366> <9366> 18108 <9367> <9367> 11941 <9368> <9368> 15344 <9369> <9369> 14689 <936a> <936a> 11929 <936b> <936b> 14483 <936c> <936c> 5285 <936d> <936d> 11926 <936e> <936e> 14824 <9370> <9370> 5287 <9371> <9371> 11935 <9373> <9373> 14494 <9374> <9374> 15588 <9375> <9375> 5279 <9376> <9376> 11921 <9377> <9377> 11936 <9378> <9378> 14585 <9379> <9379> 11930 <937a> <937a> 11464 <937b> <937b> 11937 <937c> <937c> 11918 <937d> <937d> 15397 <937e> <937e> 5284 <9380> <9380> 12308 <9381> <9381> 14693 <9382> <9382> 5277 <9383> <9383> 11913 <9384> <9384> 18337 <9385> <9385> 17085 <9386> <9386> 15552 <9387> <9387> 15072 <9388> <9388> 12305 <9389> <9389> 12298 <938a> <938a> 5440 <938c> <938c> 12293 <938d> <938d> 12309 <938e> <938e> 12300 <938f> <938f> 11927 <9390> <9390> 15676 <9391> <9391> 12311 <9392> <9392> 12294 <9394> <9394> 5439 <9395> <9395> 12304 <9396> <9396> 5441 <9397> <9397> 5449 <9398> <9398> 5447 <9399> <9399> 12306 <939a> <939a> 5448 <939b> <939b> 12296 <939c> <939c> 14764 <939d> <939d> 12297 <939e> <939e> 12302 <939f> <939f> 12307 <93a0> <93a0> 15025 <93a1> <93a1> 11912 <93a2> <93a2> 5442 <93a3> <93a3> 12316 <93a4> <93a4> 12313 <93a5> <93a5> 12640 <93a6> <93a6> 12303 <93a7> <93a7> 12299 <93a8> <93a8> 12314 <93a9> <93a9> 12629 <93aa> <93aa> 12301 <93ac> <93ac> 5445 <93ad> <93ad> 18338 <93ae> <93ae> 5444 <93af> <93af> 11914 <93b0> <93b0> 5446 <93b1> <93b1> 12310 <93b2> <93b2> 12312 <93b3> <93b3> 5443 <93b4> <93b4> 12315 <93b5> <93b5> 12292 endcidrange 100 begincidrange <93b7> <93b7> 12295 <93b8> <93b8> 15504 <93ba> <93ba> 17399 <93bb> <93bb> 15503 <93bd> <93bd> 14887 <93bf> <93bf> 15917 <93c0> <93c0> 12638 <93c2> <93c2> 12622 <93c3> <93c3> 5600 <93c4> <93c4> 12636 <93c6> <93c6> 14762 <93c7> <93c7> 12620 <93c8> <93c8> 5601 <93ca> <93ca> 12631 <93cb> <93cb> 14694 <93cc> <93cc> 12627 <93cd> <93cd> 5606 <93ce> <93ce> 12637 <93cf> <93cf> 12621 <93d0> <93d0> 12624 <93d1> <93d1> 5598 <93d2> <93d2> 12639 <93d3> <93d3> 16609 <93d4> <93d4> 12632 <93d5> <93d5> 12635 <93d6> <93d6> 5604 <93d7> <93d7> 5609 <93d8> <93d8> 5607 <93d9> <93d9> 12628 <93da> <93da> 12623 <93db> <93db> 15455 <93dc> <93dd> 5602 <93de> <93de> 12619 <93df> <93df> 5599 <93e0> <93e0> 14880 <93e1> <93e1> 5597 <93e2> <93e2> 5605 <93e3> <93e3> 12634 <93e4> <93e4> 5608 <93e6> <93e6> 12630 <93e7> <93e7> 12641 <93e8> <93e8> 5610 <93ec> <93ec> 12626 <93ee> <93ee> 12633 <93f0> <93f0> 16959 <93f1> <93f1> 17066 <93f3> <93f3> 14690 <93f5> <93f5> 12890 <93f6> <93f6> 12905 <93f7> <93f7> 12892 <93f8> <93f8> 12899 <93f9> <93f9> 12625 <93fa> <93fa> 12897 <93fb> <93fb> 12880 <93fc> <93fc> 12903 <93fd> <93fd> 5716 <93fe> <93fe> 12884 <93ff> <93ff> 12902 <9400> <9400> 12891 <9401> <9401> 15572 <9403> <9403> 5715 <9404> <9404> 15305 <9406> <9406> 12907 <9407> <9407> 12893 <9408> <9408> 14885 <9409> <9409> 12898 <940a> <940a> 12901 <940b> <940b> 12878 <940c> <940c> 12904 <940d> <940d> 12889 <940e> <940e> 12894 <940f> <940f> 12882 <9410> <9410> 12886 <9411> <9411> 12906 <9412> <9412> 12896 <9413> <9413> 12879 <9414> <9414> 12883 <9415> <9415> 12885 <9416> <9416> 12895 <9417> <9417> 18341 <9418> <9418> 5714 <9419> <9419> 12888 <941b> <941b> 16712 <941d> <941d> 18342 <9420> <9420> 12881 <9424> <9424> 14659 <9425> <9425> 14544 <9426> <9426> 14499 <9427> <9427> 15309 <9428> <9428> 12887 <9429> <9429> 13093 <942a> <942a> 13097 <942b> <942b> 5791 <942c> <942c> 13099 <942d> <942d> 18343 <942e> <942e> 5785 <9430> <9430> 13095 <9431> <9431> 13101 <9432> <9432> 5790 <9433> <9433> 5786 endcidrange 100 begincidrange <9435> <9435> 5787 <9436> <9436> 13092 <9437> <9437> 13098 <9438> <9438> 5789 <9439> <9439> 13096 <943a> <943a> 5788 <943b> <943b> 13091 <943c> <943c> 12900 <943d> <943d> 13094 <943e> <943e> 18344 <943f> <943f> 13090 <9440> <9440> 13100 <9442> <9442> 17010 <9443> <9443> 17013 <9444> <9444> 5855 <9445> <9445> 13261 <9446> <9446> 13264 <9447> <9447> 13260 <9448> <9449> 13262 <944a> <944b> 13257 <944c> <944c> 13255 <944d> <944d> 15461 <944f> <944f> 13259 <9450> <9450> 13256 <9451> <9452> 5856 <9454> <9454> 18346 <9455> <9455> 13384 <9457> <9457> 13386 <9458> <9458> 15408 <945b> <945b> 14495 <945d> <945d> 13385 <945e> <945e> 13387 <9460> <9460> 5902 <9462> <9462> 13383 <9463> <9463> 5901 <9464> <9464> 5903 <9465> <9465> 15838 <9467> <9467> 15032 <9468> <9469> 13478 <946a> <946a> 5937 <946b> <946b> 13477 <946c> <946c> 14206 <946d> <946d> 13549 <946e> <946e> 13548 <946f> <946f> 13550 <9470> <9470> 5964 <9471> <9471> 13551 <9472> <9472> 5963 <9473> <9473> 13552 <9474> <9474> 13580 <9475> <9475> 13583 <9476> <9476> 13582 <9477> <9477> 5973 <9478> <9478> 13581 <9479> <9479> 18347 <947b> <947b> 16795 <947c> <947c> 5983 <947d> <947e> 5981 <947f> <947f> 5988 <9480> <9481> 13625 <9482> <9482> 13624 <9483> <9483> 13632 <9485> <9485> 17671 <949f> <949f> 18565 <94a2> <94a2> 17691 <94c1> <94c1> 18401 <94c3> <94c3> 18399 <94dc> <94dc> 18391 <94f6> <94f6> 18386 <952d> <952d> 18348 <9547> <9547> 18623 <9577> <9577> 1687 <9578> <9578> 17672 <957a> <957a> 8353 <957b> <957b> 9034 <957c> <957c> 10929 <957d> <957d> 12642 <957f> <957f> 17673 <9580> <9580> 1688 <9582> <9582> 2081 <9583> <9583> 2538 <9585> <9585> 14497 <9586> <9586> 8354 <9588> <9588> 8355 <9589> <9589> 3024 <958b> <958b> 3482 <958c> <958c> 9036 <958d> <958d> 9035 <958e> <958e> 3486 <958f> <958f> 3481 <9590> <9590> 9037 <9591> <9591> 3483 <9592> <9592> 3485 <9593> <9593> 3484 <9594> <9594> 3480 <9596> <9596> 15317 <9597> <9597> 15316 <9598> <9598> 3932 <9599> <9599> 15314 <959b> <959b> 9715 endcidrange 100 begincidrange <959c> <959c> 9713 <959e> <959e> 9714 <959f> <959f> 9712 <95a0> <95a0> 14500 <95a1> <95a1> 4319 <95a2> <95a2> 18349 <95a3> <95a3> 4322 <95a4> <95a4> 4324 <95a5> <95a5> 4323 <95a6> <95a6> 14498 <95a7> <95a7> 15315 <95a8> <95a9> 4320 <95aa> <95aa> 17301 <95ab> <95ab> 10931 <95ac> <95ac> 10930 <95ad> <95ad> 4704 <95ae> <95ae> 10932 <95b0> <95b0> 10933 <95b1> <95b1> 4705 <95b5> <95b5> 11504 <95b6> <95b6> 11502 <95b7> <95b7> 11949 <95b9> <95ba> 11500 <95bb> <95bb> 4997 <95bc> <95bc> 11497 <95bd> <95bd> 11505 <95be> <95be> 11499 <95bf> <95bf> 11503 <95c0> <95c0> 11945 <95c3> <95c3> 11947 <95c5> <95c5> 11948 <95c6> <95c6> 5294 <95c7> <95c7> 11944 <95c8> <95c8> 5293 <95c9> <95c9> 11946 <95ca> <95cc> 5290 <95cd> <95cd> 11498 <95d0> <95d0> 5452 <95d1> <95d1> 12319 <95d2> <95d3> 12317 <95d4> <95d4> 5450 <95d5> <95d5> 5453 <95d6> <95d6> 5451 <95da> <95db> 12643 <95dc> <95dc> 5611 <95de> <95de> 12908 <95df> <95df> 12910 <95e0> <95e0> 12909 <95e1> <95e1> 5717 <95e2> <95e2> 5792 <95e3> <95e3> 13104 <95e4> <95e4> 13103 <95e5> <95e5> 13102 <95e8> <95e8> 17674 <95f4> <95f4> 18351 <961c> <961c> 1689 <961d> <961d> 17689 <961e> <961e> 6068 <9620> <9620> 6177 <9621> <9621> 1044 <9622> <9622> 6175 <9623> <9623> 6178 <9624> <9624> 6176 <9628> <9628> 6385 <962a> <962a> 1318 <962c> <962c> 1319 <962d> <962d> 6387 <962e> <962e> 1316 <962f> <962f> 6386 <9630> <9630> 6384 <9631> <9631> 1317 <9632> <9632> 1315 <9633> <9633> 18352 <9638> <9638> 16337 <9639> <9639> 6741 <963a> <963a> 6744 <963b> <963b> 1692 <963c> <963c> 6743 <963d> <963d> 6742 <963f> <963f> 1691 <9640> <9640> 1690 <9641> <9641> 16189 <9642> <9642> 1694 <9643> <9643> 6745 <9644> <9644> 1693 <9645> <9645> 18290 <964a> <964a> 7194 <964b> <964d> 2083 <964e> <964e> 7195 <964f> <964f> 7191 <9650> <9650> 2082 <9651> <9651> 7192 <9653> <9653> 7193 <9654> <9654> 7190 <9656> <9656> 15847 <9658> <9658> 2545 <965b> <965b> 2542 <965c> <965c> 7727 <965d> <965d> 2543 <965e> <965e> 2546 endcidrange 100 begincidrange <965f> <965f> 7728 <9661> <9661> 2541 <9662> <9663> 2539 <9664> <9664> 2544 <9669> <9669> 18270 <966a> <966a> 3025 <966b> <966b> 8358 <966c> <966c> 3033 <966d> <966d> 8357 <966f> <966f> 8360 <9670> <9670> 3029 <9671> <9671> 8359 <9672> <9672> 3494 <9673> <9673> 3027 <9674> <9674> 3030 <9675> <9675> 3026 <9676> <9677> 3031 <9678> <9678> 3028 <967b> <967b> 14508 <967c> <967c> 8356 <967d> <967d> 3490 <967e> <967e> 9039 <9680> <9680> 9043 <9681> <9681> 16198 <9683> <9683> 9042 <9684> <9684> 3495 <9685> <9686> 3491 <9687> <9687> 9038 <9688> <9689> 9040 <968a> <968a> 3487 <968b> <968b> 3489 <968d> <968d> 3493 <968e> <968e> 3488 <968f> <968f> 15326 <9691> <9691> 9718 <9692> <9693> 9716 <9694> <9695> 3934 <9696> <9696> 14509 <9697> <9697> 9719 <9698> <9698> 3933 <9699> <9699> 4325 <969b> <969b> 4327 <969c> <969c> 4326 <969e> <969e> 10322 <96a1> <96a1> 10323 <96a2> <96a2> 10935 <96a3> <96a3> 14511 <96a4> <96a4> 10934 <96a5> <96a5> 17135 <96a7> <96a8> 4998 <96a9> <96a9> 11506 <96aa> <96aa> 5000 <96ac> <96ac> 11952 <96ae> <96ae> 11950 <96b0> <96b0> 11951 <96b1> <96b1> 5295 <96b3> <96b3> 12320 <96b4> <96b4> 5612 <96b6> <96b6> 561 <96b8> <96b8> 5296 <96b9> <96b9> 1695 <96bb> <96bb> 2547 <96bc> <96bc> 7729 <96bd> <96bd> 14517 <96bf> <96bf> 8361 <96c0> <96c0> 3034 <96c1> <96c1> 3496 <96c2> <96c2> 9044 <96c3> <96c3> 9046 <96c4> <96c4> 3498 <96c5> <96c5> 3497 <96c6> <96c7> 3499 <96c8> <96c8> 9045 <96c9> <96ca> 3938 <96cb> <96cb> 3937 <96cc> <96cc> 4328 <96cd> <96cd> 3936 <96ce> <96ce> 9720 <96d2> <96d2> 4329 <96d3> <96d3> 10936 <96d4> <96d4> 11507 <96d5> <96d5> 5001 <96d6> <96d6> 5297 <96d7> <96d7> 12321 <96d8> <96d8> 12325 <96d9> <96d9> 5456 <96da> <96da> 12322 <96db> <96db> 5457 <96dc> <96dc> 5455 <96dd> <96dd> 12326 <96de> <96de> 5458 <96df> <96df> 12324 <96e1> <96e1> 12645 <96e2> <96e2> 5454 <96e3> <96e3> 5613 <96e5> <96e5> 13480 <96e8> <96e8> 1696 <96e9> <96e9> 3036 <96ea> <96ea> 3035 <96ef> <96ef> 3501 endcidrange 100 begincidrange <96f0> <96f0> 9048 <96f1> <96f1> 9047 <96f2> <96f2> 3502 <96f4> <96f4> 14852 <96f5> <96f5> 9724 <96f6> <96f6> 3943 <96f7> <96f7> 3940 <96f8> <96f8> 9723 <96f9> <96f9> 3942 <96fa> <96fa> 9721 <96fb> <96fb> 3941 <96fd> <96fd> 9722 <96ff> <96ff> 10324 <9700> <9700> 4330 <9702> <9702> 10939 <9703> <9703> 16141 <9704> <9704> 4706 <9705> <9705> 10937 <9706> <9707> 4707 <9708> <9708> 10938 <9709> <9709> 4709 <970b> <970b> 11508 <970d> <970d> 5005 <970e> <970e> 5002 <970f> <970f> 5007 <9710> <9710> 11510 <9711> <9711> 5003 <9712> <9712> 11509 <9713> <9713> 5006 <9716> <9716> 5004 <9718> <9718> 11955 <9719> <9719> 11957 <971b> <971b> 14537 <971c> <971c> 5298 <971d> <971d> 11956 <971e> <971e> 5299 <971f> <971f> 11954 <9720> <9720> 11953 <9721> <9721> 16307 <9722> <9722> 12328 <9723> <9723> 12327 <9724> <9724> 5459 <9725> <9725> 12329 <9726> <9726> 12650 <9727> <9727> 5615 <9728> <9728> 12649 <9729> <9729> 12646 <972a> <972a> 5614 <972b> <972c> 12647 <972e> <972f> 12911 <9730> <9730> 5718 <9731> <9731> 14528 <9732> <9732> 5795 <9735> <9735> 13105 <9736> <9736> 14530 <9738> <9739> 5793 <973a> <973a> 13106 <973d> <973e> 5858 <973f> <973f> 13265 <9740> <9740> 18355 <9741> <9741> 15337 <9742> <9742> 5938 <9743> <9743> 13482 <9744> <9744> 5940 <9746> <9746> 13481 <9747> <9747> 13483 <9748> <9748> 5939 <9749> <9749> 13553 <974b> <974b> 13606 <9751> <9751> 17635 <9752> <9752> 1697 <9756> <9756> 3944 <9757> <9757> 14540 <9758> <9758> 10325 <975a> <975a> 10940 <975b> <975c> 5008 <975d> <975d> 15343 <975e> <975e> 1698 <975f> <975f> 14543 <9760> <9760> 4710 <9761> <9761> 5616 <9762> <9762> 2086 <9766> <9766> 5010 <9768> <9768> 5904 <9769> <9769> 2087 <976a> <976a> 8362 <976c> <976c> 9049 <976d> <976d> 16023 <976e> <976e> 9051 <9770> <9770> 9050 <9771> <9771> 15356 <9772> <9772> 9728 <9773> <9773> 9725 <9774> <9774> 3945 <9776> <9776> 3946 <9777> <9778> 9726 <977a> <977a> 10327 <977b> <977b> 10332 <977c> <977c> 4331 <977d> <977d> 10326 endcidrange 100 begincidrange <977e> <977e> 10328 <977f> <977f> 10335 <9780> <9780> 10330 <9781> <9781> 10334 <9782> <9782> 10331 <9783> <9783> 10329 <9784> <9784> 10333 <9785> <9785> 4332 <9787> <9787> 16576 <9788> <9788> 10943 <9789> <9789> 14548 <978a> <978a> 10941 <978b> <978b> 4712 <978d> <978d> 4711 <978e> <978e> 10942 <978f> <978f> 4713 <9794> <9794> 11513 <9797> <9797> 11512 <9798> <9798> 5011 <9799> <9799> 11511 <979a> <979a> 11958 <979b> <979b> 15355 <979c> <979c> 11960 <979d> <979d> 11962 <979e> <979e> 11961 <979f> <979f> 14549 <97a0> <97a0> 5300 <97a1> <97a1> 11959 <97a2> <97a2> 12336 <97a3> <97a3> 5460 <97a4> <97a4> 12334 <97a5> <97a5> 12337 <97a6> <97a6> 5461 <97a8> <97a8> 12332 <97aa> <97aa> 12335 <97ab> <97ab> 12333 <97ac> <97ac> 12330 <97ad> <97ad> 5462 <97ae> <97ae> 12331 <97b1> <97b1> 14550 <97b2> <97b2> 18357 <97b3> <97b3> 12651 <97b4> <97b4> 16179 <97b6> <97b6> 12653 <97b7> <97b7> 12652 <97b8> <97b8> 15765 <97b9> <97b9> 12913 <97ba> <97ba> 16181 <97bb> <97bb> 12914 <97bd> <97bd> 18766 <97be> <97be> 14551 <97bf> <97bf> 13107 <97c0> <97c0> 14552 <97c1> <97c1> 5861 <97c2> <97c2> 18358 <97c3> <97c3> 5860 <97c4> <97c5> 13388 <97c6> <97c6> 5941 <97c7> <97c7> 13484 <97c8> <97c8> 16175 <97c9> <97c9> 5974 <97cb> <97cb> 2088 <97cc> <97cc> 3503 <97cd> <97cd> 10337 <97ce> <97ce> 10336 <97cf> <97cf> 10945 <97d0> <97d0> 10944 <97d2> <97d2> 14553 <97d3> <97d3> 5301 <97d4> <97d4> 11964 <97d5> <97d5> 11963 <97d6> <97d6> 12340 <97d7> <97d7> 12338 <97d8> <97d8> 12341 <97d9> <97d9> 12339 <97dc> <97dc> 5617 <97dd> <97df> 12654 <97e0> <97e0> 14554 <97e1> <97e1> 13108 <97e3> <97e3> 13266 <97e5> <97e5> 13485 <97e6> <97e6> 17676 <97ed> <97ed> 2089 <97ee> <97ee> 14556 <97f0> <97f0> 11514 <97f1> <97f1> 11965 <97f2> <97f2> 14669 <97f3> <97f3> 2090 <97f5> <97f5> 14560 <97f6> <97f6> 4333 <97f8> <97f8> 11515 <97f9> <97f9> 5463 <97fa> <97fa> 12342 <97fb> <97fb> 5618 <97fd> <97fe> 12915 <97ff> <97ff> 5796 <9800> <9800> 13390 <9801> <9801> 2091 <9802> <9803> 3039 <9804> <9804> 8363 endcidrange 100 begincidrange <9805> <9806> 3504 <9807> <9807> 9052 <9808> <9808> 3506 <980a> <980a> 3950 <980c> <980c> 3952 <980d> <980e> 9730 <980f> <980f> 9729 <9810> <9811> 3947 <9812> <9812> 3951 <9813> <9813> 3949 <9814> <9814> 18770 <9815> <9815> 17212 <9816> <9816> 10338 <9817> <9818> 4334 <981b> <981b> 10952 <981c> <981c> 4716 <981d> <981d> 10947 <981e> <981e> 10946 <981f> <981f> 15362 <9820> <9820> 10951 <9821> <9821> 4714 <9823> <9823> 15927 <9824> <9824> 5018 <9826> <9826> 10948 <9827> <9827> 10953 <9828> <9828> 10950 <9829> <9829> 10949 <982b> <982b> 4715 <982d> <982d> 5016 <982e> <982e> 16242 <982f> <982f> 11517 <9830> <9830> 5012 <9832> <9832> 11518 <9833> <9833> 14565 <9834> <9834> 14564 <9835> <9835> 11516 <9837> <9837> 5015 <9838> <9838> 5013 <9839> <9839> 5017 <983b> <983b> 5014 <9841> <9841> 11966 <9843> <9843> 11971 <9844> <9844> 11967 <9845> <9845> 11970 <9846> <9846> 5302 <9847> <9847> 15766 <9848> <9848> 11762 <9849> <9849> 11969 <984a> <984a> 11968 <984b> <984b> 14566 <984c> <984c> 5466 <984d> <984d> 5464 <984e> <984e> 5467 <984f> <984f> 5465 <9850> <9852> 12343 <9853> <9853> 5468 <9857> <9857> 12660 <9858> <9858> 5620 <9859> <9859> 12658 <985b> <985b> 5621 <985c> <985c> 12657 <985d> <985d> 12659 <985e> <985e> 5619 <985f> <985f> 12920 <9860> <9860> 12917 <9862> <9863> 12918 <9864> <9864> 13109 <9865> <9865> 5798 <9866> <9866> 14567 <9867> <9867> 5797 <9869> <9869> 13268 <986a> <986a> 13267 <986b> <986b> 5862 <986c> <986c> 16437 <986f> <986f> 5905 <9870> <9870> 5942 <9871> <9871> 5965 <9872> <9872> 13554 <9873> <9874> 13607 <9875> <9875> 17677 <98a8> <98a8> 2092 <98a9> <98a9> 9053 <98ac> <98ac> 9732 <98ad> <98ae> 10339 <98af> <98af> 4336 <98b1> <98b1> 4337 <98b2> <98b2> 10954 <98b3> <98b3> 4717 <98b4> <98b4> 16243 <98b6> <98b6> 5303 <98b7> <98b7> 14575 <98b8> <98b8> 12346 <98b9> <98b9> 18360 <98ba> <98ba> 5469 <98bb> <98bb> 12663 <98bc> <98bc> 5622 <98bd> <98bd> 12662 <98be> <98be> 12664 <98bf> <98bf> 12661 <98c0> <98c0> 13112 endcidrange 100 begincidrange <98c1> <98c2> 12921 <98c3> <98c3> 15224 <98c4> <98c4> 5719 <98c6> <98c6> 13111 <98c7> <98c7> 14577 <98c8> <98c8> 14576 <98c9> <98c9> 13110 <98ca> <98ca> 14574 <98cb> <98cb> 13269 <98cc> <98cc> 13609 <98ce> <98ce> 17678 <98db> <98db> 2093 <98dc> <98dc> 15371 <98de> <98de> 17679 <98df> <98df> 2094 <98e0> <98e0> 18322 <98e1> <98e1> 14582 <98e2> <98e2> 2548 <98e3> <98e3> 7730 <98e5> <98e5> 8364 <98e6> <98e6> 14583 <98e7> <98e7> 3507 <98e9> <98e9> 3510 <98ea> <98ea> 3508 <98eb> <98eb> 9054 <98ec> <98ec> 14584 <98ed> <98ed> 3512 <98ef> <98ef> 3509 <98f1> <98f1> 18362 <98f2> <98f2> 3511 <98f4> <98f4> 3954 <98f5> <98f5> 17253 <98f6> <98f6> 9733 <98f9> <98f9> 9734 <98fa> <98fa> 10956 <98fc> <98fc> 3953 <98fd> <98fe> 3955 <9900> <9900> 10342 <9902> <9902> 10341 <9903> <9903> 4338 <9905> <9905> 4339 <9907> <9907> 10343 <9908> <9908> 10955 <9909> <9909> 4341 <990a> <990a> 4718 <990c> <990c> 4340 <990e> <990e> 17389 <9910> <9910> 5019 <9911> <9911> 10957 <9912> <9912> 4720 <9913> <9913> 4719 <9914> <9914> 10958 <9915> <9915> 10961 <9916> <9917> 10959 <9918> <9918> 4721 <9919> <9919> 18364 <991a> <991a> 5024 <991b> <991b> 5022 <991c> <991c> 17390 <991e> <991e> 5021 <991f> <991f> 11520 <9921> <9921> 5023 <9924> <9924> 11519 <9925> <9925> 11972 <9927> <9927> 11521 <9928> <9928> 5020 <9929> <9929> 11522 <992a> <992a> 11975 <992b> <992c> 11973 <992d> <992d> 11979 <992e> <992e> 5473 <992f> <992f> 11978 <9930> <9930> 11981 <9931> <9931> 11980 <9932> <9932> 11977 <9933> <9933> 11976 <9935> <9935> 5304 <9937> <9937> 18365 <9938> <9938> 15357 <9939> <9939> 14586 <993a> <993a> 12349 <993b> <993b> 15377 <993c> <993c> 12348 <993d> <993d> 5472 <993e> <993f> 5470 <9940> <9940> 16180 <9941> <9941> 12347 <9942> <9942> 17407 <9943> <9943> 12667 <9945> <9945> 5623 <9947> <9947> 12666 <9948> <9948> 12665 <9949> <9949> 5624 <994a> <994a> 16313 <994b> <994b> 12927 <994c> <994c> 12926 <994d> <994d> 15378 <994e> <994e> 12924 <9950> <9950> 12923 <9951> <9951> 5721 endcidrange 100 begincidrange <9952> <9952> 5720 <9953> <9953> 12928 <9954> <9954> 13270 <9955> <9955> 5863 <9956> <9956> 13114 <9957> <9957> 5799 <9958> <9958> 13113 <9959> <9959> 12925 <995b> <995b> 13271 <995c> <995c> 5906 <995d> <995d> 18366 <995e> <995e> 5966 <995f> <995f> 13555 <9961> <9961> 13610 <9962> <9962> 17391 <9963> <9963> 17680 <9996> <9996> 2095 <9997> <9997> 8365 <9998> <9998> 11982 <9999> <9999> 2096 <999b> <999b> 15381 <999c> <999c> 10345 <999d> <999d> 10344 <999e> <999e> 11523 <99a1> <99a1> 11984 <99a3> <99a3> 11983 <99a4> <99a4> 16835 <99a5> <99a5> 5474 <99a6> <99a7> 12668 <99a8> <99a8> 5722 <99aa> <99aa> 15383 <99ab> <99ab> 13611 <99ac> <99ac> 2549 <99ad> <99ad> 3514 <99ae> <99ae> 3513 <99af> <99af> 9735 <99b0> <99b0> 9737 <99b1> <99b1> 3958 <99b2> <99b2> 9736 <99b3> <99b3> 3957 <99b4> <99b4> 3959 <99b5> <99b5> 9738 <99b8> <99b8> 14667 <99b9> <99b9> 10347 <99ba> <99ba> 10349 <99bb> <99bb> 10348 <99bc> <99bc> 15394 <99bd> <99bd> 10351 <99c1> <99c1> 4342 <99c2> <99c2> 10350 <99c3> <99c3> 10346 <99c4> <99c4> 15735 <99c5> <99c5> 18369 <99c7> <99c7> 10352 <99c9> <99c9> 10968 <99cb> <99cb> 10971 <99cc> <99cc> 10973 <99cd> <99cd> 10963 <99ce> <99ce> 10967 <99cf> <99cf> 10964 <99d0> <99d0> 4723 <99d1> <99d1> 4726 <99d2> <99d2> 4728 <99d3> <99d4> 10965 <99d5> <99d5> 4727 <99d6> <99d6> 10969 <99d7> <99d7> 10972 <99d8> <99d8> 10970 <99d9> <99d9> 4729 <99da> <99da> 16194 <99db> <99db> 4725 <99dc> <99dc> 10962 <99dd> <99dd> 4722 <99df> <99df> 4724 <99e1> <99e1> 14213 <99e2> <99e2> 5026 <99e3> <99e3> 11529 <99e4> <99e4> 11527 <99e5> <99e5> 11526 <99e6> <99e6> 15205 <99e7> <99e7> 11532 <99e9> <99e9> 11531 <99ea> <99ea> 11530 <99ec> <99ec> 11525 <99ed> <99ed> 5025 <99ee> <99ee> 11524 <99f0> <99f0> 11528 <99f1> <99f1> 5027 <99f4> <99f4> 11987 <99f5> <99f5> 14591 <99f6> <99f6> 11991 <99f7> <99f7> 11988 <99f8> <99f8> 11990 <99f9> <99f9> 11989 <99fa> <99fa> 11986 <99fb> <99fb> 11992 <99fc> <99fc> 11995 <99fd> <99fe> 11993 <99ff> <99ff> 5306 <9a01> <9a01> 5305 endcidrange 100 begincidrange <9a02> <9a02> 11985 <9a03> <9a03> 11996 <9a04> <9a04> 12354 <9a05> <9a05> 12357 <9a06> <9a06> 12359 <9a07> <9a07> 12358 <9a09> <9a09> 12352 <9a0a> <9a0a> 12356 <9a0b> <9a0b> 12351 <9a0c> <9a0c> 14592 <9a0d> <9a0d> 12353 <9a0e> <9a0e> 5475 <9a0f> <9a0f> 12350 <9a10> <9a10> 14594 <9a11> <9a11> 12355 <9a14> <9a14> 12682 <9a15> <9a15> 12671 <9a16> <9a16> 5625 <9a19> <9a19> 5626 <9a1a> <9a1a> 12670 <9a1b> <9a1b> 12675 <9a1c> <9a1c> 12681 <9a1d> <9a1d> 12673 <9a1e> <9a1e> 12680 <9a1f> <9a1f> 15212 <9a20> <9a20> 12677 <9a21> <9a21> 15388 <9a22> <9a22> 12676 <9a23> <9a23> 12679 <9a24> <9a24> 12674 <9a25> <9a25> 12672 <9a26> <9a26> 15858 <9a27> <9a27> 12678 <9a29> <9a29> 12935 <9a2a> <9a2a> 12933 <9a2b> <9a2b> 5723 <9a2c> <9a2c> 12932 <9a2d> <9a2d> 12938 <9a2e> <9a2e> 12936 <9a2f> <9a2f> 15390 <9a30> <9a30> 5724 <9a31> <9a31> 12931 <9a32> <9a32> 12929 <9a34> <9a34> 12930 <9a35> <9a35> 5726 <9a36> <9a36> 12934 <9a37> <9a37> 5725 <9a38> <9a38> 12937 <9a39> <9a39> 13115 <9a3a> <9a3a> 13121 <9a3b> <9a3b> 14593 <9a3c> <9a3c> 18371 <9a3d> <9a3d> 13116 <9a3e> <9a3e> 5803 <9a3f> <9a3f> 13122 <9a40> <9a40> 5802 <9a41> <9a41> 13120 <9a42> <9a42> 13119 <9a43> <9a43> 5801 <9a44> <9a44> 13118 <9a45> <9a45> 5800 <9a46> <9a46> 13117 <9a48> <9a48> 13277 <9a49> <9a49> 13279 <9a4a> <9a4a> 13278 <9a4c> <9a4c> 13275 <9a4d> <9a4d> 5865 <9a4e> <9a4e> 13272 <9a4f> <9a4f> 13276 <9a50> <9a50> 13281 <9a52> <9a52> 13280 <9a53> <9a54> 13273 <9a55> <9a55> 5864 <9a56> <9a56> 13391 <9a57> <9a57> 5909 <9a58> <9a58> 14595 <9a59> <9a59> 13392 <9a5a> <9a5b> 5907 <9a5c> <9a5c> 15384 <9a5e> <9a5e> 13486 <9a5f> <9a5f> 5943 <9a60> <9a60> 13584 <9a62> <9a62> 5975 <9a63> <9a63> 15207 <9a64> <9a64> 13612 <9a65> <9a65> 5976 <9a66> <9a67> 13613 <9a68> <9a68> 13628 <9a69> <9a69> 13627 <9a6a> <9a6a> 5991 <9a6b> <9a6b> 13636 <9a6c> <9a6c> 17797 <9a8f> <9a8f> 17798 <9aa8> <9aa8> 2550 <9aab> <9aab> 9740 <9aad> <9aad> 9739 <9aaf> <9ab0> 4343 <9ab1> <9ab1> 10353 <9ab2> <9ab2> 17202 <9ab3> <9ab3> 10974 endcidrange 100 begincidrange <9ab4> <9ab4> 11535 <9ab6> <9ab6> 17392 <9ab7> <9ab7> 4730 <9ab8> <9ab8> 5028 <9ab9> <9ab9> 11533 <9aba> <9aba> 16244 <9abb> <9abb> 11536 <9abc> <9abc> 5029 <9abd> <9abd> 15767 <9abe> <9abe> 11997 <9abf> <9abf> 11534 <9ac0> <9ac0> 12360 <9ac1> <9ac1> 5476 <9ac2> <9ac2> 12683 <9ac6> <9ac6> 12941 <9ac7> <9ac7> 12939 <9aca> <9aca> 12940 <9acd> <9acd> 13123 <9acf> <9acf> 5804 <9ad0> <9ad0> 13282 <9ad1> <9ad1> 5912 <9ad2> <9ad2> 5866 <9ad3> <9ad4> 5910 <9ad5> <9ad5> 13487 <9ad6> <9ad6> 5967 <9ad7> <9ad7> 16298 <9ad8> <9ad8> 2551 <9adc> <9adc> 12361 <9adf> <9adf> 7731 <9ae0> <9ae0> 14600 <9ae1> <9ae1> 3960 <9ae2> <9ae2> 14601 <9ae3> <9ae3> 10354 <9ae6> <9ae6> 4345 <9ae7> <9ae7> 10355 <9aeb> <9aeb> 10976 <9aec> <9aec> 10975 <9aed> <9aed> 5031 <9aee> <9aef> 4731 <9af1> <9af1> 10979 <9af2> <9af2> 10978 <9af3> <9af3> 10977 <9af4> <9af4> 14603 <9af6> <9af6> 11537 <9af7> <9af7> 11540 <9af9> <9af9> 11539 <9afa> <9afa> 11538 <9afb> <9afb> 5030 <9afc> <9afc> 12001 <9afd> <9afd> 11999 <9afe> <9afe> 11998 <9aff> <9aff> 16151 <9b01> <9b01> 12000 <9b02> <9b02> 16146 <9b03> <9b03> 5477 <9b04> <9b05> 12363 <9b06> <9b06> 5478 <9b08> <9b08> 12362 <9b09> <9b09> 16160 <9b0a> <9b0a> 12685 <9b0b> <9b0b> 12684 <9b0c> <9b0c> 12687 <9b0d> <9b0d> 5627 <9b0e> <9b0e> 12686 <9b0f> <9b0f> 18372 <9b10> <9b10> 12942 <9b11> <9b11> 12944 <9b12> <9b12> 12943 <9b14> <9b14> 14605 <9b15> <9b15> 13124 <9b16> <9b16> 13127 <9b17> <9b18> 13125 <9b19> <9b19> 13283 <9b1a> <9b1a> 5867 <9b1e> <9b20> 13393 <9b22> <9b22> 5944 <9b23> <9b23> 5968 <9b24> <9b24> 13615 <9b25> <9b25> 2552 <9b27> <9b27> 4733 <9b28> <9b28> 5032 <9b29> <9b29> 12365 <9b2a> <9b2a> 16153 <9b2b> <9b2b> 13284 <9b2d> <9b2d> 14606 <9b2e> <9b2e> 13585 <9b2f> <9b2f> 7732 <9b31> <9b31> 5992 <9b32> <9b32> 2553 <9b33> <9b33> 11541 <9b34> <9b34> 14609 <9b35> <9b35> 12366 <9b37> <9b37> 12688 <9b39> <9b39> 16128 <9b3a> <9b3a> 13128 <9b3b> <9b3b> 13285 <9b3c> <9b3c> 2554 <9b3e> <9b3f> 10356 <9b40> <9b40> 14613 <9b41> <9b42> 4346 endcidrange 100 begincidrange <9b43> <9b43> 10981 <9b44> <9b44> 4735 <9b45> <9b45> 4734 <9b46> <9b46> 10980 <9b48> <9b48> 12002 <9b4a> <9b4a> 12367 <9b4b> <9b4b> 12369 <9b4c> <9b4c> 12368 <9b4d> <9b4d> 5481 <9b4e> <9b4e> 5480 <9b4f> <9b4f> 5479 <9b50> <9b50> 14612 <9b51> <9b51> 5806 <9b52> <9b52> 13129 <9b54> <9b54> 5805 <9b55> <9b55> 13287 <9b56> <9b56> 13286 <9b58> <9b58> 5945 <9b59> <9b59> 13488 <9b5a> <9b5a> 3041 <9b5b> <9b5b> 9741 <9b5f> <9b5f> 10360 <9b60> <9b61> 10358 <9b64> <9b64> 10990 <9b66> <9b66> 10985 <9b67> <9b67> 10982 <9b68> <9b68> 10989 <9b69> <9b69> 18373 <9b6c> <9b6c> 10991 <9b6f> <9b6f> 4737 <9b70> <9b70> 10988 <9b71> <9b71> 10984 <9b74> <9b74> 10983 <9b75> <9b75> 10987 <9b76> <9b76> 10986 <9b77> <9b77> 4736 <9b7a> <9b7a> 11552 <9b7b> <9b7b> 11547 <9b7c> <9b7c> 11545 <9b7d> <9b7d> 11554 <9b7e> <9b7e> 11546 <9b7f> <9b7f> 15419 <9b80> <9b80> 11542 <9b81> <9b81> 17393 <9b82> <9b82> 11548 <9b83> <9b83> 16921 <9b85> <9b85> 11543 <9b86> <9b86> 12011 <9b87> <9b87> 11544 <9b88> <9b88> 11555 <9b8b> <9b8b> 16110 <9b8d> <9b8d> 17955 <9b8e> <9b8e> 14617 <9b8f> <9b8f> 16301 <9b90> <9b90> 11551 <9b91> <9b91> 5033 <9b92> <9b92> 11550 <9b93> <9b93> 11549 <9b95> <9b95> 11553 <9b97> <9b97> 16241 <9b9a> <9b9a> 12003 <9b9b> <9b9b> 12006 <9b9d> <9b9d> 16214 <9b9e> <9b9e> 12005 <9b9f> <9b9f> 15422 <9ba0> <9ba0> 12013 <9ba1> <9ba1> 12008 <9ba2> <9ba2> 12012 <9ba4> <9ba4> 12010 <9ba5> <9ba5> 12009 <9ba6> <9ba6> 12007 <9ba8> <9ba8> 12004 <9baa> <9baa> 5309 <9bab> <9bab> 5308 <9bad> <9bad> 5310 <9bae> <9bae> 5307 <9baf> <9baf> 12014 <9bb0> <9bb0> 16308 <9bb5> <9bb5> 12375 <9bb6> <9bb6> 12378 <9bb8> <9bb8> 12376 <9bb9> <9bb9> 12380 <9bbd> <9bbd> 12381 <9bbf> <9bbf> 12373 <9bc0> <9bc0> 5486 <9bc1> <9bc1> 12374 <9bc3> <9bc3> 12372 <9bc4> <9bc4> 12379 <9bc6> <9bc6> 12371 <9bc7> <9bc7> 12370 <9bc8> <9bc8> 5485 <9bc9> <9bc9> 5483 <9bca> <9bca> 5482 <9bcf> <9bcf> 15420 <9bd3> <9bd3> 12377 <9bd4> <9bd4> 12697 <9bd5> <9bd5> 12703 <9bd6> <9bd6> 5630 <9bd7> <9bd7> 12698 <9bd9> <9bd9> 12701 endcidrange 100 begincidrange <9bda> <9bda> 12705 <9bdb> <9bdb> 5631 <9bdc> <9bdc> 12700 <9bdd> <9bdd> 18374 <9bde> <9bde> 12692 <9be0> <9be0> 12691 <9be1> <9be1> 12704 <9be2> <9be2> 12695 <9be4> <9be4> 12693 <9be5> <9be5> 12702 <9be6> <9be6> 12694 <9be7> <9be7> 5629 <9be8> <9be8> 5628 <9be9> <9be9> 15297 <9bea> <9beb> 12689 <9bec> <9bec> 12699 <9bed> <9bed> 16087 <9bf0> <9bf0> 12696 <9bf1> <9bf1> 18375 <9bf4> <9bf4> 18376 <9bf7> <9bf7> 12947 <9bf8> <9bf8> 12950 <9bfd> <9bfd> 5484 <9bff> <9bff> 14619 <9c02> <9c02> 14618 <9c05> <9c05> 12948 <9c06> <9c06> 12954 <9c07> <9c07> 12952 <9c08> <9c08> 12946 <9c09> <9c09> 12957 <9c0a> <9c0a> 16186 <9c0b> <9c0b> 12945 <9c0c> <9c0c> 14620 <9c0d> <9c0d> 5728 <9c0e> <9c0e> 12953 <9c10> <9c10> 15418 <9c12> <9c12> 12949 <9c13> <9c13> 5727 <9c14> <9c14> 12956 <9c15> <9c15> 16158 <9c17> <9c17> 12955 <9c1b> <9c1b> 18715 <9c1c> <9c1c> 13132 <9c1d> <9c1d> 13131 <9c1f> <9c1f> 17954 <9c20> <9c20> 18378 <9c21> <9c21> 13138 <9c23> <9c23> 13134 <9c24> <9c24> 13137 <9c25> <9c25> 5808 <9c26> <9c26> 17894 <9c28> <9c29> 13135 <9c2b> <9c2b> 13130 <9c2c> <9c2c> 13133 <9c2d> <9c2d> 5807 <9c2e> <9c2e> 16162 <9c2f> <9c2f> 15751 <9c31> <9c31> 5869 <9c32> <9c32> 13298 <9c33> <9c33> 13293 <9c34> <9c34> 13297 <9c35> <9c35> 15417 <9c36> <9c36> 13300 <9c37> <9c37> 13296 <9c39> <9c39> 13292 <9c3a> <9c3a> 15742 <9c3b> <9c3b> 5871 <9c3c> <9c3c> 13295 <9c3d> <9c3d> 13299 <9c3e> <9c3e> 5870 <9c3f> <9c3f> 13290 <9c40> <9c40> 12951 <9c41> <9c41> 13294 <9c44> <9c44> 13291 <9c45> <9c45> 15985 <9c46> <9c46> 13288 <9c48> <9c48> 13289 <9c49> <9c49> 5868 <9c4a> <9c4a> 13399 <9c4b> <9c4b> 13401 <9c4c> <9c4c> 13404 <9c4d> <9c4d> 13400 <9c4e> <9c4e> 13405 <9c4f> <9c4f> 15414 <9c50> <9c50> 13398 <9c52> <9c52> 13396 <9c53> <9c53> 15415 <9c54> <9c54> 5913 <9c55> <9c55> 13402 <9c56> <9c56> 5915 <9c57> <9c57> 5914 <9c58> <9c58> 13397 <9c59> <9c59> 13403 <9c5d> <9c5d> 16063 <9c5e> <9c5e> 13493 <9c5f> <9c5f> 5946 <9c60> <9c60> 13494 <9c62> <9c62> 13492 <9c63> <9c63> 13489 <9c66> <9c66> 13491 endcidrange 100 begincidrange <9c67> <9c67> 13490 <9c68> <9c68> 13556 <9c6d> <9c6d> 13558 <9c6e> <9c6e> 13557 <9c71> <9c71> 13588 <9c72> <9c72> 16033 <9c73> <9c73> 13587 <9c74> <9c74> 13586 <9c75> <9c75> 13589 <9c77> <9c78> 5984 <9c79> <9c79> 13633 <9c7a> <9c7a> 13637 <9c7b> <9c7b> 15416 <9c7c> <9c7c> 17682 <9ce5> <9ce5> 3042 <9ce6> <9ce6> 9055 <9ce7> <9ce7> 9744 <9ce9> <9ce9> 3961 <9cea> <9cea> 9742 <9ced> <9ced> 9743 <9cf1> <9cf2> 10361 <9cf3> <9cf3> 4350 <9cf4> <9cf4> 4348 <9cf5> <9cf5> 10363 <9cf6> <9cf6> 4349 <9cf7> <9cf7> 10996 <9cf9> <9cf9> 10999 <9cfa> <9cfa> 10993 <9cfb> <9cfb> 11000 <9cfc> <9cfc> 10992 <9cfd> <9cfd> 10994 <9cff> <9cff> 10995 <9d00> <9d00> 10998 <9d02> <9d02> 16187 <9d03> <9d03> 4740 <9d04> <9d04> 11003 <9d05> <9d05> 11002 <9d06> <9d06> 4738 <9d07> <9d07> 10997 <9d08> <9d08> 11001 <9d09> <9d09> 4739 <9d0c> <9d0c> 15430 <9d10> <9d10> 11565 <9d12> <9d12> 5038 <9d14> <9d14> 11560 <9d15> <9d15> 5034 <9d16> <9d16> 15484 <9d17> <9d17> 11557 <9d18> <9d18> 11563 <9d19> <9d19> 11566 <9d1b> <9d1b> 5039 <9d1d> <9d1d> 11562 <9d1e> <9d1e> 11559 <9d1f> <9d1f> 11567 <9d20> <9d20> 11558 <9d21> <9d21> 15425 <9d22> <9d22> 11564 <9d23> <9d23> 5035 <9d25> <9d25> 11556 <9d26> <9d26> 5036 <9d28> <9d28> 5037 <9d29> <9d29> 11561 <9d2d> <9d2d> 12032 <9d2e> <9d2f> 12019 <9d30> <9d30> 12023 <9d31> <9d31> 12021 <9d33> <9d33> 12015 <9d34> <9d34> 16458 <9d36> <9d36> 12018 <9d37> <9d37> 12028 <9d38> <9d38> 12022 <9d39> <9d39> 14638 <9d3b> <9d3b> 5311 <9d3d> <9d3d> 12030 <9d3e> <9d3e> 12027 <9d3f> <9d3f> 5312 <9d40> <9d40> 12029 <9d41> <9d41> 12016 <9d42> <9d43> 12025 <9d44> <9d44> 16299 <9d45> <9d45> 12024 <9d49> <9d49> 18381 <9d4a> <9d4a> 12385 <9d4b> <9d4b> 12387 <9d4c> <9d4c> 12390 <9d4e> <9d4e> 17721 <9d4f> <9d4f> 12384 <9d50> <9d50> 16074 <9d51> <9d51> 5487 <9d52> <9d52> 12392 <9d53> <9d53> 12383 <9d54> <9d54> 12393 <9d56> <9d56> 12389 <9d57> <9d57> 12391 <9d58> <9d58> 12395 <9d59> <9d59> 12388 <9d5a> <9d5a> 12396 <9d5b> <9d5b> 12386 <9d5c> <9d5c> 12382 <9d5d> <9d5d> 5488 endcidrange 100 begincidrange <9d5e> <9d5e> 15982 <9d5f> <9d5f> 12394 <9d60> <9d60> 5489 <9d61> <9d61> 5633 <9d67> <9d67> 12017 <9d68> <9d68> 12731 <9d69> <9d69> 12722 <9d6a> <9d6a> 5635 <9d6b> <9d6b> 12718 <9d6c> <9d6c> 5636 <9d6d> <9d6d> 15276 <9d6e> <9d6e> 17211 <9d6f> <9d6f> 12727 <9d70> <9d70> 12721 <9d71> <9d71> 12711 <9d72> <9d72> 5634 <9d73> <9d73> 12724 <9d74> <9d75> 12719 <9d77> <9d77> 12706 <9d78> <9d78> 12713 <9d79> <9d79> 12728 <9d7b> <9d7b> 12725 <9d7c> <9d7c> 16126 <9d7d> <9d7d> 12717 <9d7e> <9d7e> 14629 <9d7f> <9d7f> 12729 <9d80> <9d80> 12712 <9d81> <9d81> 12707 <9d82> <9d82> 12726 <9d83> <9d83> 14630 <9d84> <9d84> 12709 <9d85> <9d85> 12723 <9d86> <9d86> 12714 <9d87> <9d87> 12730 <9d88> <9d88> 12710 <9d89> <9d89> 5632 <9d8a> <9d8a> 12708 <9d8b> <9d8c> 12715 <9d90> <9d90> 12964 <9d92> <9d92> 12962 <9d93> <9d93> 17395 <9d94> <9d94> 12967 <9d96> <9d96> 12979 <9d97> <9d97> 12970 <9d98> <9d98> 12963 <9d99> <9d99> 12959 <9d9a> <9d9a> 12972 <9d9b> <9d9b> 12965 <9d9c> <9d9c> 12968 <9d9d> <9d9d> 12961 <9d9e> <9d9e> 12975 <9d9f> <9d9f> 12958 <9da0> <9da0> 12966 <9da1> <9da1> 12971 <9da2> <9da2> 12973 <9da3> <9da3> 12976 <9da4> <9da4> 12960 <9da5> <9da5> 15435 <9da6> <9da7> 12980 <9da8> <9da8> 12974 <9da9> <9da9> 12978 <9daa> <9daa> 12969 <9dab> <9dab> 16176 <9dac> <9dac> 13154 <9dad> <9dad> 13157 <9daf> <9daf> 5809 <9db1> <9db1> 13156 <9db2> <9db2> 13161 <9db3> <9db3> 13159 <9db4> <9db4> 5810 <9db5> <9db5> 13150 <9db6> <9db6> 13140 <9db7> <9db7> 13139 <9db8> <9db8> 5812 <9db9> <9dba> 13152 <9dbb> <9dbb> 13149 <9dbc> <9dbc> 13141 <9dbd> <9dbd> 18384 <9dbe> <9dbe> 13146 <9dbf> <9dbf> 12977 <9dc0> <9dc0> 17394 <9dc1> <9dc1> 13142 <9dc2> <9dc2> 5811 <9dc3> <9dc3> 13148 <9dc4> <9dc4> 14633 <9dc5> <9dc5> 13147 <9dc7> <9dc7> 13143 <9dc8> <9dc8> 13155 <9dc9> <9dc9> 17785 <9dca> <9dca> 13144 <9dcb> <9dcb> 13305 <9dcc> <9dcc> 13158 <9dcd> <9dcd> 13160 <9dce> <9dce> 13151 <9dcf> <9dcf> 13145 <9dd0> <9dd0> 13306 <9dd1> <9dd1> 13308 <9dd2> <9dd2> 13302 <9dd3> <9dd3> 5872 <9dd4> <9dd4> 14622 endcidrange 100 begincidrange <9dd5> <9dd5> 13315 <9dd6> <9dd6> 13313 <9dd7> <9dd7> 5873 <9dd8> <9dd8> 13312 <9dd9> <9dd9> 13311 <9dda> <9dda> 13304 <9ddb> <9ddb> 13301 <9ddc> <9ddc> 13307 <9ddd> <9ddd> 13316 <9dde> <9dde> 13303 <9ddf> <9ddf> 13309 <9de1> <9de1> 13414 <9de2> <9de2> 13419 <9de3> <9de3> 13409 <9de4> <9de4> 13412 <9de5> <9de5> 5916 <9de6> <9de6> 13416 <9de8> <9de8> 13423 <9de9> <9de9> 13310 <9deb> <9deb> 13410 <9dec> <9dec> 13420 <9ded> <9ded> 13424 <9dee> <9dee> 13415 <9def> <9def> 13408 <9df0> <9df0> 13418 <9df2> <9df2> 13417 <9df3> <9df3> 13422 <9df4> <9df4> 13421 <9df5> <9df5> 13314 <9df6> <9df6> 13413 <9df7> <9df7> 13407 <9df8> <9df8> 13411 <9df9> <9dfa> 5947 <9dfb> <9dfb> 13406 <9dfc> <9dfc> 18385 <9dfd> <9dfd> 13505 <9dfe> <9dfe> 13496 <9dff> <9dff> 13504 <9e00> <9e01> 13501 <9e02> <9e02> 13495 <9e03> <9e03> 13498 <9e04> <9e04> 13506 <9e05> <9e05> 13500 <9e06> <9e06> 13499 <9e07> <9e07> 13497 <9e09> <9e09> 13503 <9e0a> <9e0a> 17790 <9e0b> <9e0b> 13559 <9e0c> <9e0c> 17786 <9e0d> <9e0d> 13560 <9e0e> <9e0e> 14632 <9e0f> <9e0f> 13562 <9e10> <9e10> 13561 <9e11> <9e11> 13564 <9e12> <9e12> 13563 <9e13> <9e13> 13591 <9e14> <9e14> 13590 <9e15> <9e15> 13616 <9e17> <9e17> 13617 <9e18> <9e18> 15428 <9e19> <9e19> 13629 <9e1a> <9e1a> 5989 <9e1b> <9e1b> 5993 <9e1c> <9e1c> 16260 <9e1d> <9e1d> 13638 <9e1e> <9e1e> 5994 <9e1f> <9e1f> 17683 <9e75> <9e75> 3043 <9e79> <9e79> 5729 <9e7a> <9e7a> 13162 <9e7b> <9e7b> 17400 <9e7c> <9e7d> 5949 <9e7f> <9e7f> 3044 <9e80> <9e80> 9745 <9e81> <9e81> 16143 <9e82> <9e82> 3962 <9e83> <9e83> 11004 <9e84> <9e84> 16246 <9e85> <9e85> 16114 <9e86> <9e87> 11569 <9e88> <9e88> 11568 <9e89> <9e89> 12034 <9e8a> <9e8a> 12033 <9e8b> <9e8b> 5313 <9e8c> <9e8c> 12398 <9e8d> <9e8d> 12035 <9e8e> <9e8e> 12397 <9e90> <9e90> 14641 <9e91> <9e91> 12733 <9e92> <9e92> 5637 <9e93> <9e93> 5639 <9e94> <9e94> 12732 <9e95> <9e95> 14642 <9e96> <9e96> 16316 <9e97> <9e97> 5638 <9e98> <9e98> 16167 <9e99> <9e99> 12982 <9e9a> <9e9a> 12984 <9e9b> <9e9b> 12983 <9e9c> <9e9c> 13163 endcidrange 100 begincidrange <9e9d> <9e9d> 5813 <9e9e> <9e9e> 14643 <9e9f> <9e9f> 5917 <9ea0> <9ea0> 13507 <9ea1> <9ea1> 13565 <9ea2> <9ea2> 14644 <9ea4> <9ea4> 13642 <9ea5> <9ea5> 3045 <9ea6> <9ea6> 18756 <9ea7> <9ea7> 10364 <9ea8> <9ea8> 16245 <9ea9> <9ea9> 4741 <9eaa> <9eaa> 14646 <9eab> <9eab> 16018 <9eac> <9eac> 17396 <9ead> <9ead> 11572 <9eae> <9eae> 11571 <9eaf> <9eaf> 14647 <9eb0> <9eb0> 12036 <9eb1> <9eb1> 18388 <9eb4> <9eb4> 5640 <9eb5> <9eb5> 5730 <9eb6> <9eb6> 13317 <9eb7> <9eb7> 13634 <9ebb> <9ebb> 3046 <9ebc> <9ebc> 4351 <9ebd> <9ebd> 18389 <9ebe> <9ebe> 4742 <9ebf> <9ebf> 15736 <9ec0> <9ec0> 12734 <9ec1> <9ec1> 14649 <9ec2> <9ec2> 13425 <9ec3> <9ec3> 3515 <9ec4> <9ec4> 17684 <9ec6> <9ec6> 18390 <9ec7> <9ec7> 17783 <9ec8> <9ec8> 12037 <9ecc> <9ecc> 5969 <9ecd> <9ecd> 3516 <9ece> <9ece> 4743 <9ecf> <9ecf> 5314 <9ed0> <9ed0> 13426 <9ed1> <9ed1> 3517 <9ed3> <9ed3> 11005 <9ed4> <9ed4> 5041 <9ed5> <9ed6> 11573 <9ed8> <9ed8> 5040 <9eda> <9eda> 12038 <9edb> <9edb> 5318 <9edc> <9edd> 5316 <9ede> <9ede> 5315 <9edf> <9edf> 12399 <9ee0> <9ee0> 5490 <9ee2> <9ee2> 18392 <9ee4> <9ee4> 12986 <9ee5> <9ee5> 12985 <9ee6> <9ee6> 12988 <9ee7> <9ee7> 12987 <9ee8> <9ee8> 5731 <9eeb> <9eeb> 13164 <9eed> <9eed> 13166 <9eee> <9eee> 13165 <9eef> <9eef> 5814 <9ef0> <9ef0> 13318 <9ef1> <9ef1> 18393 <9ef2> <9ef3> 13427 <9ef4> <9ef4> 5918 <9ef5> <9ef5> 13566 <9ef6> <9ef6> 13592 <9ef7> <9ef7> 5986 <9ef8> <9ef8> 18394 <9ef9> <9ef9> 9056 <9efa> <9efa> 11575 <9efb> <9efb> 12039 <9efc> <9efc> 12735 <9efd> <9efd> 9746 <9efe> <9efe> 18382 <9eff> <9eff> 12040 <9f00> <9f00> 12401 <9f01> <9f01> 12400 <9f02> <9f02> 14656 <9f06> <9f06> 13429 <9f07> <9f07> 5951 <9f08> <9f08> 14657 <9f09> <9f09> 13567 <9f0a> <9f0a> 13593 <9f0e> <9f0e> 3963 <9f0f> <9f10> 11006 <9f12> <9f12> 11576 <9f13> <9f13> 3964 <9f15> <9f15> 5491 <9f16> <9f16> 12402 <9f17> <9f17> 14661 <9f18> <9f18> 13168 <9f19> <9f19> 5815 <9f1a> <9f1a> 13169 <9f1b> <9f1b> 13167 <9f1c> <9f1c> 13430 <9f1e> <9f1e> 13508 <9f20> <9f20> 3965 endcidrange 100 begincidrange <9f22> <9f22> 12043 <9f23> <9f23> 12042 <9f24> <9f24> 12041 <9f25> <9f25> 12403 <9f26> <9f26> 16272 <9f27> <9f27> 17952 <9f28> <9f28> 12407 <9f29> <9f29> 12406 <9f2a> <9f2a> 12405 <9f2b> <9f2b> 12404 <9f2c> <9f2c> 5492 <9f2d> <9f2d> 12736 <9f2e> <9f2e> 12990 <9f2f> <9f2f> 5732 <9f30> <9f30> 12989 <9f31> <9f31> 13170 <9f32> <9f32> 13321 <9f33> <9f33> 13320 <9f34> <9f34> 5874 <9f35> <9f35> 13319 <9f36> <9f36> 13433 <9f37> <9f37> 13432 <9f38> <9f38> 13431 <9f39> <9f39> 14663 <9f3b> <9f3b> 4352 <9f3d> <9f3d> 11577 <9f3e> <9f3e> 5319 <9f40> <9f41> 12737 <9f42> <9f42> 13322 <9f43> <9f43> 13434 <9f44> <9f44> 18395 <9f45> <9f45> 14666 <9f46> <9f46> 13509 <9f47> <9f47> 13568 <9f48> <9f48> 13618 <9f49> <9f49> 13644 <9f4a> <9f4a> 4353 <9f4b> <9f4b> 5320 <9f4c> <9f4c> 12408 <9f4d> <9f4d> 12739 <9f4e> <9f4e> 13171 <9f4f> <9f4f> 13435 <9f50> <9f50> 18755 <9f52> <9f52> 4745 <9f53> <9f53> 16256 <9f54> <9f54> 12044 <9f55> <9f55> 12409 <9f56> <9f58> 12740 <9f59> <9f59> 12995 <9f5a> <9f5a> 16163 <9f5b> <9f5b> 12991 <9f5c> <9f5c> 5816 <9f5d> <9f5d> 12994 <9f5e> <9f5e> 12993 <9f5f> <9f5f> 5733 <9f60> <9f60> 12992 <9f61> <9f61> 5735 <9f62> <9f62> 14671 <9f63> <9f63> 5734 <9f64> <9f64> 13173 <9f65> <9f65> 13172 <9f66> <9f67> 5817 <9f69> <9f69> 14672 <9f6a> <9f6a> 5876 <9f6b> <9f6b> 13323 <9f6c> <9f6c> 5875 <9f6e> <9f6f> 13438 <9f70> <9f70> 13437 <9f71> <9f71> 13436 <9f72> <9f72> 5953 <9f74> <9f76> 13510 <9f77> <9f77> 5952 <9f78> <9f78> 13569 <9f79> <9f79> 13572 <9f7a> <9f7a> 13571 <9f7b> <9f7b> 13570 <9f7e> <9f7e> 13643 <9f7f> <9f7f> 18048 <9f8d> <9f8d> 5042 <9f8e> <9f8e> 14674 <9f90> <9f90> 5500 <9f91> <9f91> 12996 <9f92> <9f92> 13174 <9f94> <9f94> 5877 <9f95> <9f95> 13324 <9f98> <9f98> 13645 <9f99> <9f99> 17799 <9f9c> <9f9c> 5043 <9f9f> <9f9f> 17990 <9fa0> <9fa0> 12045 <9fa2> <9fa2> 13325 <9fa4> <9fa4> 13594 <9fa5> <9fa5> 16240 <e000> <e000> 16395 <e002> <e003> 16397 <e009> <e00a> 16404 <e00c> <e00c> 16407 <e00e> <e00e> 16409 <e012> <e016> 16413 <e018> <e018> 16419 endcidrange 100 begincidrange <e01a> <e01e> 16421 <e020> <e020> 16427 <e022> <e023> 16429 <e025> <e025> 16432 <e02d> <e02e> 16440 <e030> <e030> 16443 <e032> <e038> 16445 <e03b> <e03c> 16454 <e045> <e045> 16464 <e04c> <e04c> 16471 <e05a> <e05a> 16485 <e05c> <e05c> 16487 <e05f> <e061> 16490 <e064> <e064> 16495 <e066> <e066> 16497 <e06c> <e06c> 16503 <e071> <e071> 16508 <e074> <e075> 16511 <e078> <e078> 16515 <e07d> <e07d> 16520 <e087> <e087> 16530 <e089> <e08a> 16532 <e08c> <e08c> 16535 <e093> <e094> 16542 <e099> <e09a> 16548 <e09c> <e09e> 16551 <e0a6> <e0a7> 16561 <e0a9> <e0a9> 16564 <e0ab> <e0ab> 16566 <e0ae> <e0ae> 16569 <e0ba> <e0ba> 16581 <e0bc> <e0bc> 16583 <e0be> <e0be> 16585 <e0c3> <e0c3> 16590 <e0c5> <e0c5> 16592 <e0c7> <e0c8> 16594 <e0ca> <e0ca> 16597 <e0d0> <e0d0> 16603 <e0d4> <e0d5> 16607 <e0dc> <e0dc> 16615 <e0df> <e0df> 16618 <e0e2> <e0e5> 16621 <e0e7> <e0e9> 16626 <e0eb> <e0ec> 16630 <e0ee> <e0ee> 16633 <e0f2> <e0f2> 16637 <e0f8> <e0f9> 16643 <e0fb> <e0fb> 16645 <e0fd> <e0fd> 16647 <e103> <e103> 16653 <e106> <e106> 16656 <e109> <e10b> 16658 <e110> <e110> 16665 <e114> <e115> 16669 <e11c> <e11d> 16677 <e121> <e121> 16682 <e126> <e128> 16687 <e130> <e131> 16697 <e136> <e136> 16703 <e139> <e139> 16706 <e141> <e142> 16714 <e145> <e145> 16717 <e147> <e148> 16719 <e14a> <e14a> 16721 <e14d> <e14d> 16723 <e150> <e150> 16726 <e154> <e157> 16730 <e159> <e15a> 16735 <e15d> <e15d> 18767 <e162> <e162> 16743 <e168> <e16a> 16749 <e171> <e172> 16757 <e175> <e175> 16761 <e178> <e179> 16764 <e17b> <e17c> 16767 <e17f> <e180> 16771 <e185> <e185> 16777 <e187> <e187> 16779 <e189> <e189> 16781 <e18b> <e18b> 16783 <e18f> <e190> 16787 <e193> <e193> 16790 <e195> <e195> 18771 <e196> <e196> 16792 <e19f> <e1a0> 16801 <e1a4> <e1a4> 18772 <e1a6> <e1a6> 16808 <e1aa> <e1aa> 16812 <e1ae> <e1ae> 16816 <e1b0> <e1b1> 16818 <e1b3> <e1b4> 16821 <e1b6> <e1b6> 16824 <e1b8> <e1b8> 16826 <e1bb> <e1bb> 18773 <e1bc> <e1bf> 16829 <e1c1> <e1c1> 16834 <e1c4> <e1c5> 16837 <e1c8> <e1c8> 16840 <e1cc> <e1cd> 16844 <e1d4> <e1d5> 16852 endcidrange 100 begincidrange <e1d7> <e1d7> 16855 <e1da> <e1da> 16858 <e1dd> <e1dd> 16861 <e1e2> <e1e2> 16865 <e1e6> <e1e6> 16869 <e1eb> <e1eb> 16874 <e1ef> <e1f0> 16878 <e1f2> <e1f2> 16881 <e1f7> <e1f7> 16886 <e1fa> <e1fa> 16889 <e1fe> <e1fe> 16893 <e200> <e200> 16895 <e201> <e201> 18776 <e202> <e202> 16897 <e205> <e205> 16900 <e207> <e207> 16902 <e20a> <e20c> 16905 <e210> <e210> 16911 <e212> <e216> 16913 <e219> <e219> 16920 <e21b> <e21c> 16922 <e21f> <e221> 16926 <e226> <e228> 16933 <e22a> <e22a> 16937 <e22f> <e22f> 16942 <e231> <e231> 16944 <e233> <e233> 16946 <e237> <e237> 16950 <e23b> <e23b> 16954 <e23d> <e23e> 16956 <e245> <e245> 16964 <e248> <e248> 16967 <e24a> <e24f> 16969 <e251> <e254> 16976 <e261> <e261> 16992 <e268> <e268> 16998 <e26b> <e26b> 17001 <e26d> <e26f> 17003 <e271> <e271> 17007 <e27a> <e27a> 17016 <e27d> <e27d> 17019 <e282> <e282> 17024 <e288> <e289> 17030 <e28b> <e28b> 17033 <e290> <e291> 17038 <e294> <e296> 17042 <e299> <e29b> 17047 <e29f> <e29f> 17053 <e2a1> <e2a1> 18779 <e2a4> <e2a4> 17057 <e2a6> <e2a6> 17059 <e2b2> <e2b5> 17070 <e2b7> <e2b8> 17075 <e2ba> <e2ba> 17078 <e2be> <e2bf> 17081 <e2c1> <e2c1> 17084 <e2c7> <e2c7> 17090 <e2c9> <e2c9> 17092 <e2d4> <e2d4> 17103 <e2d8> <e2d9> 17107 <e2de> <e2de> 17113 <e2e0> <e2e2> 17115 <e2e7> <e2e7> 17122 <e2e9> <e2e9> 17124 <e2eb> <e2ed> 17126 <e2f0> <e2f1> 18781 <e2f8> <e2f8> 17137 <e2fc> <e2fc> 17141 <e2ff> <e2ff> 18783 <e300> <e300> 18784 <e301> <e301> 17144 <e306> <e306> 17149 <e308> <e308> 17151 <e30c> <e30c> 17155 <e30f> <e30f> 17158 <e311> <e311> 14123 <e313> <e313> 14125 <e315> <e315> 14127 <e318> <e318> 14129 <e31b> <e31c> 14132 <e31f> <e31f> 14136 <e325> <e325> 14142 <e32c> <e32c> 14149 <e330> <e331> 14153 <e335> <e336> 14158 <e33b> <e33b> 14164 <e33d> <e33d> 18074 <e342> <e342> 14170 <e345> <e345> 14173 <e348> <e348> 14175 <e352> <e352> 14184 <e354> <e354> 14186 <e35b> <e35c> 14192 <e360> <e360> 14197 <e362> <e362> 14199 <e364> <e365> 14201 <e36f> <e36f> 14212 <e372> <e372> 14215 <e374> <e375> 14217 <e377> <e377> 14220 endcidrange 100 begincidrange <e379> <e379> 14221 <e37b> <e37b> 14223 <e381> <e382> 14229 <e386> <e386> 14234 <e388> <e38a> 14236 <e38d> <e38d> 14241 <e391> <e391> 14245 <e393> <e393> 14247 <e394> <e394> 18080 <e396> <e396> 14249 <e398> <e398> 14251 <e39a> <e39b> 14253 <e39e> <e39e> 18081 <e39f> <e3a0> 14257 <e3a2> <e3a2> 14260 <e3a5> <e3a5> 18082 <e3a6> <e3a9> 14264 <e3ac> <e3ac> 14270 <e3b1> <e3b2> 14275 <e3b4> <e3b5> 14278 <e3b9> <e3bd> 14283 <e3c3> <e3c3> 14293 <e3c8> <e3c8> 14297 <e3cc> <e3cc> 14301 <e3cd> <e3cd> 18084 <e3cf> <e3cf> 14303 <e3d5> <e3d5> 18085 <e3d8> <e3da> 14311 <e3e1> <e3e1> 14320 <e3e3> <e3e3> 14322 <e3e7> <e3e7> 18086 <e3ed> <e3ee> 14332 <e3f0> <e3f0> 14335 <e3f2> <e3f4> 14337 <e3f8> <e3f8> 14343 <e3fa> <e3fa> 14345 <e3fd> <e3fd> 14348 <e3ff> <e3ff> 14350 <e409> <e40b> 14360 <e414> <e414> 14369 <e41b> <e41b> 14376 <e41d> <e41e> 14378 <e423> <e423> 14384 <e425> <e425> 14386 <e426> <e426> 18091 <e428> <e428> 14388 <e42c> <e42d> 14392 <e432> <e432> 14398 <e436> <e436> 14402 <e43a> <e43c> 14406 <e43e> <e43e> 14410 <e440> <e441> 14412 <e444> <e444> 14416 <e448> <e448> 18093 <e44c> <e44e> 14423 <e450> <e451> 14427 <e459> <e45a> 14436 <e45d> <e45e> 14440 <e461> <e463> 14444 <e465> <e465> 14448 <e467> <e469> 18095 <e46a> <e46a> 14451 <e46c> <e46c> 14453 <e46e> <e46f> 14455 <e471> <e472> 14458 <e474> <e474> 14461 <e476> <e476> 14463 <e47e> <e47f> 14470 <e484> <e484> 14476 <e486> <e48a> 14477 <e48d> <e48e> 14484 <e491> <e492> 14487 <e495> <e497> 14491 <e4a1> <e4a1> 18100 <e4a2> <e4a4> 14503 <e4ab> <e4ab> 14512 <e4af> <e4af> 14516 <e4b3> <e4ba> 14520 <e4c1> <e4c1> 14534 <e4c6> <e4c6> 14539 <e4c9> <e4c9> 14542 <e4cd> <e4ce> 14546 <e4d6> <e4d6> 14555 <e4d9> <e4d9> 14558 <e4dc> <e4dd> 14561 <e4e4> <e4e4> 14569 <e4e6> <e4e8> 14571 <e4ee> <e4ef> 14579 <e4f6> <e4f6> 14587 <e4f8> <e4f9> 14589 <e4ff> <e4ff> 14596 <e501> <e502> 14598 <e505> <e505> 14602 <e50a> <e50a> 14607 <e50d> <e50d> 18101 <e50f> <e50f> 14611 <e512> <e512> 14614 <e514> <e514> 14616 <e516> <e516> 18102 <e51a> <e51a> 14621 endcidrange 100 begincidrange <e51c> <e521> 14623 <e524> <e524> 14631 <e528> <e528> 18104 <e529> <e52c> 14634 <e52e> <e52f> 14639 <e537> <e537> 14648 <e53e> <e53e> 14655 <e543> <e543> 14660 <e54b> <e54b> 14668 <e554> <e555> 14677 <e557> <e559> 14680 <e55b> <e55c> 14684 <e55e> <e55f> 14687 <e562> <e562> 14691 <e566> <e567> 14695 <e56d> <e56e> 14702 <e570> <e570> 14705 <e572> <e573> 14707 <e575> <e577> 14710 <e579> <e57a> 14714 <e57c> <e57e> 14717 <e580> <e580> 14721 <e582> <e586> 14723 <e588> <e588> 14729 <e58b> <e590> 14732 <e592> <e594> 14739 <e59a> <e59a> 14747 <e59d> <e5a1> 14750 <e5a4> <e5a4> 14757 <e5a6> <e5a8> 14759 <e5aa> <e5aa> 14763 <e5af> <e5af> 14768 <e5b1> <e5b1> 14770 <e5b2> <e5b2> 18107 <e5b5> <e5b5> 14774 <e5b7> <e5b8> 14776 <e5ba> <e5bb> 14779 <e5be> <e5c0> 14783 <e5c2> <e5c2> 14787 <e5c8> <e5c9> 14793 <e5d7> <e5d9> 14804 <e5db> <e5dc> 14808 <e5df> <e5df> 14812 <e5e1> <e5e3> 14814 <e5e5> <e5e6> 14818 <e5e9> <e5e9> 14822 <e5ee> <e5f1> 14827 <e5f3> <e5f3> 14832 <e5fb> <e5fc> 14840 <e600> <e600> 14845 <e602> <e602> 14847 <e604> <e604> 14849 <e60f> <e612> 14859 <e619> <e61c> 14868 <e621> <e621> 14876 <e623> <e624> 14878 <e627> <e627> 14882 <e62b> <e62b> 14886 <e632> <e634> 14893 <e637> <e638> 14898 <e63a> <e63a> 14901 <e63c> <e63c> 14903 <e63f> <e642> 14906 <e645> <e646> 14912 <e648> <e648> 14915 <e64b> <e64b> 14917 <e64e> <e64f> 14920 <e652> <e655> 14924 <e657> <e659> 14929 <e65d> <e660> 14935 <e662> <e663> 14940 <e665> <e668> 14943 <e66a> <e66a> 18111 <e66e> <e66f> 14951 <e671> <e671> 14954 <e676> <e679> 14959 <e67b> <e67d> 14964 <e67f> <e680> 14968 <e683> <e688> 14971 <e68a> <e68c> 14978 <e68e> <e690> 14982 <e692> <e692> 14986 <e696> <e697> 14990 <e699> <e69a> 14993 <e69c> <e69c> 14996 <e69e> <e69f> 14998 <e6a1> <e6a2> 15001 <e6a6> <e6a6> 15005 <e6ac> <e6ad> 15010 <e6b2> <e6b2> 15016 <e6b9> <e6ba> 15023 <e6bd> <e6be> 15027 <e6c0> <e6c1> 15030 <e6c5> <e6c5> 18116 <e6c7> <e6c7> 15036 <e6ca> <e6ca> 15039 <e6d1> <e6d2> 15046 <e6d7> <e6d8> 15052 <e6da> <e6db> 15055 <e6dd> <e6e1> 15058 endcidrange 100 begincidrange <e6e4> <e6e6> 15065 <e6ee> <e6ee> 15075 <e6f2> <e6f3> 15079 <e6f7> <e6f7> 15084 <e6fa> <e6fc> 15087 <e6ff> <e6ff> 15092 <e701> <e702> 15094 <e706> <e707> 15099 <e709> <e70a> 15102 <e70c> <e70c> 15105 <e710> <e711> 15109 <e713> <e713> 15112 <e717> <e718> 15116 <e71a> <e71b> 15119 <e71d> <e71d> 15122 <e724> <e725> 15129 <e72b> <e72b> 15136 <e72f> <e72f> 15140 <e733> <e737> 15144 <e73c> <e73d> 15153 <e740> <e742> 15157 <e744> <e744> 15161 <e747> <e747> 15164 <e74d> <e74f> 15170 <e751> <e752> 15174 <e75b> <e75d> 15184 <e75f> <e75f> 15188 <e761> <e762> 15190 <e764> <e765> 15193 <e767> <e768> 15196 <e769> <e769> 18119 <e76c> <e76e> 15200 <e770> <e770> 15204 <e775> <e775> 15209 <e777> <e778> 15210 <e77a> <e77a> 15213 <e77c> <e77d> 15215 <e784> <e784> 15223 <e786> <e786> 15225 <e789> <e789> 15228 <e78b> <e78b> 15230 <e78d> <e78d> 15232 <e790> <e790> 15235 <e792> <e792> 15237 <e794> <e794> 15239 <e796> <e797> 15241 <e799> <e799> 15244 <e7a2> <e7a2> 15253 <e7a4> <e7a9> 15255 <e7b1> <e7b1> 15268 <e7b4> <e7b4> 15271 <e7b8> <e7b8> 15275 <e7bc> <e7bc> 15279 <e7c4> <e7c4> 15286 <e7ca> <e7ca> 15292 <e7ce> <e7ce> 15296 <e7d1> <e7d1> 15299 <e7d8> <e7d8> 15306 <e7da> <e7da> 15308 <e7dc> <e7dd> 15310 <e7e4> <e7e4> 15318 <e7e7> <e7e9> 15321 <e7eb> <e7eb> 15325 <e7ed> <e7ef> 15327 <e7f1> <e7f3> 15331 <e7f8> <e7f8> 15338 <e7fb> <e7fc> 15341 <e7ff> <e7ff> 15345 <e800> <e802> 15346 <e808> <e808> 15354 <e80c> <e80c> 15358 <e80e> <e80f> 15360 <e811> <e811> 15363 <e813> <e813> 15365 <e816> <e818> 15368 <e81a> <e81a> 15372 <e821> <e821> 15379 <e827> <e828> 15385 <e82d> <e82d> 15391 <e82f> <e82f> 15393 <e835> <e835> 15399 <e837> <e838> 15401 <e83a> <e83b> 15404 <e841> <e842> 15411 <e84b> <e84b> 15421 <e84d> <e84e> 15423 <e851> <e851> 15427 <e855> <e858> 15431 <e85b> <e85d> 15437 <e860> <e862> 15442 <e865> <e867> 15447 <e869> <e86a> 15451 <e86c> <e86c> 15453 <e871> <e871> 15458 <e878> <e878> 15465 <e87d> <e87f> 15470 <e887> <e887> 15480 <e88f> <e88f> 15488 <e891> <e892> 15490 <e894> <e895> 15493 endcidrange 100 begincidrange <e89a> <e89a> 15499 <e89d> <e89d> 15502 <e8a0> <e8a1> 15505 <e8a3> <e8a7> 15508 <e8a9> <e8aa> 15514 <e8ac> <e8b0> 15517 <e8b5> <e8b6> 15526 <e8b8> <e8b8> 15529 <e8bd> <e8c3> 15534 <e8c5> <e8c5> 15542 <e8c7> <e8c7> 15544 <e8cb> <e8cb> 15548 <e8cd> <e8ce> 15550 <e8d0> <e8d1> 15553 <e8d3> <e8d3> 15556 <e8d5> <e8d6> 15558 <e8d8> <e8da> 15561 <e8dd> <e8dd> 15566 <e8df> <e8e1> 15568 <e8e5> <e8e6> 15574 <e8e8> <e8ea> 15577 <e8ed> <e8ed> 15582 <e8f1> <e8f2> 15586 <e8f5> <e8f5> 15590 <e8fb> <e8fb> 15596 <e8fe> <e8fe> 15599 <e900> <e900> 15601 <e903> <e903> 15604 <e907> <e908> 15608 <e90c> <e90c> 15613 <e917> <e918> 15624 <e91c> <e91c> 15629 <e91e> <e922> 15631 <e925> <e92c> 15638 <e92e> <e92f> 15647 <e933> <e936> 15652 <e938> <e938> 18127 <e93a> <e93a> 15659 <e93c> <e93e> 15661 <e941> <e941> 15666 <e944> <e945> 15669 <e948> <e948> 15673 <e94d> <e94d> 15678 <e950> <e950> 15681 <e952> <e955> 15683 <e957> <e958> 15688 <e95a> <e95a> 15691 <e95c> <e95e> 15693 <e960> <e961> 15697 <e964> <e964> 15701 <e967> <e967> 15704 <e968> <e968> 18129 <e96e> <e96f> 18133 <e973> <e973> 18138 <e974> <e974> 15707 <e975> <e975> 18139 <e977> <e978> 18141 <e97a> <e97b> 18144 <e97d> <e97d> 18147 <e981> <e982> 18150 <e987> <e987> 15709 <e98a> <e98a> 15710 <e98e> <e98e> 15711 <e991> <e991> 18159 <e9b0> <e9b0> 17364 <e9cb> <e9cb> 18201 <e9ef> <e9ef> 18228 <ea43> <ea43> 18297 <eaa9> <eaa9> 18380 <eabf> <eac1> 18396 <eac5> <eac5> 18400 <eac9> <eacc> 18402 <eacf> <ead1> 18408 <ead3> <ead4> 18411 <ead6> <eada> 18414 <eadc> <eadc> 18419 <eade> <eae3> 18420 <eae7> <eaec> 18426 <eaee> <eaee> 18432 <eaf0> <eaf2> 18433 <eaf4> <eaf4> 17328 <eaf5> <eaf6> 18436 <eaf8> <eaf8> 18439 <eaf9> <eaf9> 17330 <eafa> <eafb> 18440 <eafe> <eaff> 18443 <eb00> <eb00> 18445 <eb02> <eb05> 18446 <eb08> <eb0f> 18451 <eb11> <eb12> 18459 <eb15> <eb15> 18462 <eb18> <eb1d> 18465 <eb1f> <eb21> 18471 <eb23> <eb23> 18474 <eb25> <eb25> 18475 <eb27> <eb27> 18476 <eb2a> <eb2a> 18477 <eb2c> <eb39> 18478 <eb3d> <eb3d> 15771 <eb3e> <eb3f> 18492 endcidrange 100 begincidrange <eb41> <eb41> 15773 <eb43> <eb44> 18494 <eb46> <eb46> 15776 <eb4a> <eb4a> 18497 <eb4b> <eb4c> 15779 <eb4d> <eb4e> 18498 <eb4f> <eb50> 15781 <eb53> <eb53> 18500 <eb54> <eb54> 15785 <eb55> <eb56> 18501 <eb57> <eb57> 15786 <eb58> <eb59> 18503 <eb5a> <eb5b> 15787 <eb5d> <eb5d> 15790 <eb5f> <eb5f> 15792 <eb61> <eb61> 15794 <eb62> <eb63> 18505 <eb65> <eb65> 18508 <eb67> <eb67> 18509 <eb68> <eb69> 15796 <eb6b> <eb6b> 15799 <eb6d> <eb6d> 15801 <eb6f> <eb71> 18510 <eb73> <eb73> 18513 <eb74> <eb74> 15804 <eb76> <eb76> 17360 <eb77> <eb77> 18515 <eb78> <eb78> 15805 <eb7a> <eb7a> 18516 <eb7e> <eb7f> 18518 <eb80> <eb81> 15809 <eb83> <eb84> 18520 <eb85> <eb85> 15812 <eb88> <eb88> 18522 <eb89> <eb89> 15814 <eb8a> <eb8a> 18523 <eb8c> <eb8e> 18524 <eb8f> <eb8f> 15816 <eb90> <eb90> 18527 <eb93> <eb93> 15819 <eb95> <eb95> 18528 <eb97> <eb97> 15822 <eb98> <eb9a> 18529 <eb9b> <eb9b> 15823 <eb9f> <eb9f> 18534 <eba0> <eba0> 15825 <eba2> <eba2> 18535 <eba3> <eba3> 15827 <eba5> <eba6> 18536 <eba8> <eba8> 15830 <ebaa> <ebaa> 18538 <ebab> <ebab> 15832 <ebad> <ebad> 15834 <ebae> <ebae> 18539 <ebaf> <ebaf> 15835 <ebb0> <ebb0> 18540 <ebb2> <ebb3> 18541 <ebb4> <ebb4> 15837 <ebb6> <ebb6> 15839 <ebb9> <ebb9> 15842 <ebbc> <ebbc> 15844 <ebbd> <ebbd> 18544 <ebbf> <ebbf> 15846 <ebc2> <ebc2> 15849 <ebc5> <ebc6> 18546 <ebc7> <ebc7> 15851 <ebc8> <ebc8> 18548 <ebca> <ebca> 18549 <ebcc> <ebcd> 15854 <ebce> <ebce> 18550 <ebd0> <ebd0> 18551 <ebd3> <ebd3> 18552 <ebd5> <ebd5> 18553 <ebd7> <ebd8> 15860 <ebda> <ebdb> 18554 <ebdd> <ebdd> 15864 <ebdf> <ebdf> 18556 <ebe1> <ebe1> 18557 <ebe4> <ebe4> 18558 <ebe7> <ebe7> 15871 <ebe8> <ebe9> 18559 <ebeb> <ebec> 18561 <ebee> <ebee> 15874 <ebef> <ebef> 18563 <ebf1> <ebf1> 18564 <ebf2> <ebf2> 15876 <ebf5> <ebf5> 18566 <ebf6> <ebf6> 15878 <ebf9> <ebfb> 15881 <ebfd> <ebfe> 15885 <ec05> <ec06> 15892 <ec08> <ec09> 18568 <ec0c> <ec0c> 15896 <ec0e> <ec10> 15898 <ec13> <ec13> 18571 <ec14> <ec14> 15903 <ec17> <ec18> 15906 <ec19> <ec1c> 18572 <ec1d> <ec1d> 15908 <ec20> <ec20> 18576 endcidrange 100 begincidrange <ec22> <ec22> 15912 <ec24> <ec24> 15914 <ec26> <ec26> 15916 <ec2a> <ec2a> 15920 <ec2b> <ec2b> 18577 <ec2c> <ec2e> 15921 <ec2f> <ec2f> 18578 <ec31> <ec31> 15925 <ec32> <ec32> 18579 <ec35> <ec35> 15928 <ec37> <ec37> 15930 <ec3b> <ec3c> 15934 <ec3f> <ec41> 18580 <ec42> <ec42> 15938 <ec43> <ec43> 18583 <ec44> <ec44> 17384 <ec45> <ec49> 18584 <ec4b> <ec4c> 18589 <ec4f> <ec4f> 18592 <ec52> <ec52> 18593 <ec54> <ec54> 18594 <ec56> <ec58> 18595 <ec5a> <ec5a> 18598 <ec5c> <ec5d> 18599 <ec5f> <ec60> 18601 <ec62> <ec63> 18604 <ec67> <ec67> 18607 <ec68> <ec68> 15949 <ec69> <ec73> 18608 <ec75> <ec76> 18620 <ec79> <ec79> 18624 <ec7b> <ec7b> 18626 <ec7e> <ec7e> 18627 <ec80> <ec80> 18629 <ec84> <ec84> 18632 <ec86> <ec86> 18634 <ec8d> <ec8d> 18636 <ec8e> <ec8e> 15957 <ec91> <ec91> 18638 <ec92> <ec92> 15960 <ec93> <ec94> 18639 <ec95> <ec95> 15961 <ec96> <ec96> 18641 <ec98> <ec98> 18642 <ec99> <ec99> 15963 <ec9a> <ec9b> 18643 <ec9d> <ec9d> 18646 <ec9e> <ec9e> 15964 <eca0> <eca0> 18647 <eca3> <eca4> 18648 <eca7> <eca8> 18650 <ecab> <ecab> 18652 <ecad> <ecad> 18653 <ecaf> <ecaf> 15973 <ecb4> <ecb4> 18655 <ecb6> <ecb6> 15979 <ecb9> <ecbb> 18657 <eccf> <eccf> 16000 <ecd4> <ecd4> 16005 <ecdb> <ecdc> 16012 <ecde> <ecde> 18660 <ecdf> <ece1> 16015 <ece5> <ece5> 16021 <ecf0> <ecf0> 16032 <ecf2> <ecf2> 16034 <ecf5> <ecf5> 16037 <ecfc> <ecfc> 16044 <ed04> <ed04> 18663 <ed07> <ed07> 18664 <ed0a> <ed0a> 18666 <ed0c> <ed11> 18667 <ed13> <ed13> 18673 <ed15> <ed17> 18674 <ed18> <ed18> 16058 <ed1a> <ed1a> 18677 <ed1c> <ed1c> 18678 <ed1d> <ed1d> 16061 <ed1e> <ed1e> 18679 <ed22> <ed22> 18680 <ed24> <ed25> 16066 <ed26> <ed27> 18681 <ed29> <ed29> 16069 <ed2a> <ed2a> 18683 <ed2c> <ed2c> 16071 <ed2d> <ed2d> 18684 <ed3b> <ed3b> 16079 <ed3d> <ed3d> 18692 <ed41> <ed42> 18694 <ed45> <ed45> 18696 <ed47> <ed47> 16085 <ed4a> <ed4b> 18697 <ed4d> <ed4e> 18699 <ed4f> <ed4f> 16090 <ed51> <ed51> 18701 <ed52> <ed52> 16092 <ed53> <ed54> 18702 <ed57> <ed58> 18704 <ed5f> <ed5f> 16101 <ed62> <ed62> 16104 <ed6b> <ed6b> 16113 endcidrange 100 begincidrange <ed71> <ed71> 18706 <ed72> <ed72> 16119 <ed75> <ed75> 18707 <ed77> <ed77> 18709 <ed78> <ed78> 16122 <ed7a> <ed7a> 18710 <ed81> <ed81> 18711 <ed84> <ed85> 16132 <ed86> <ed86> 18712 <ed88> <ed88> 16135 <ed89> <ed8a> 18713 <ed8b> <ed8b> 16136 <ed8e> <ed8e> 16139 <ed91> <ed91> 16142 <eda6> <eda6> 18716 <edc6> <edc6> 16193 <edcf> <edcf> 16202 <edd1> <edd1> 18718 <edd7> <edd7> 18719 <edda> <edda> 16211 <eddb> <eddb> 18720 <eddd> <eddd> 18721 <ede1> <ede1> 16216 <eded> <eded> 16228 <ee08> <ee08> 16254 <ee11> <ee11> 16263 <ee15> <ee15> 18725 <ee1b> <ee1b> 18726 <ee20> <ee20> 16276 <ee22> <ee22> 18727 <ee2a> <ee2a> 16285 <ee30> <ee30> 18728 <ee31> <ee31> 16291 <ee34> <ee34> 16294 <ee48> <ee48> 18729 <ee56> <ee56> 18730 <ee5b> <ee5b> 18731 <ee5d> <ee5d> 16332 <ee60> <ee60> 18732 <ee64> <ee64> 16338 <ee6a> <ee6a> 16344 <ee76> <ee76> 16356 <ee7c> <ee7c> 16362 <ee7e> <ee7e> 18733 <ee91> <ee91> 16381 <ee9c> <ee9c> 18735 <eea1> <eea6> 18737 <eea7> <eea7> 17332 <eea8> <eeaa> 18743 <eeac> <eeb1> 18746 <eeb4> <eeb4> 18754 <eeb7> <eeb7> 18757 <f303> <f318> 17609 <f325> <f325> 18797 <f327> <f327> 18799 <f344> <f344> 18828 <f346> <f346> 18830 <f34a> <f34b> 18844 <f3a0> <f3a1> 17716 <f3ac> <f3ac> 17723 <f3f0> <f3f0> 17781 <f3f9> <f3fa> 17788 <f3fc> <f3fc> 17791 <f408> <f40b> 17801 <f43d> <f43d> 17845 <f440> <f442> 17163 <f444> <f444> 17167 <f446> <f446> 17169 <f448> <f449> 17171 <f44b> <f44b> 17174 <f44d> <f44d> 17176 <f450> <f452> 17179 <f454> <f456> 17183 <f457> <f457> 17847 <f45a> <f45a> 17189 <f45b> <f45b> 17848 <f45c> <f45f> 17191 <f461> <f463> 17196 <f465> <f466> 17200 <f469> <f469> 17204 <f46c> <f46d> 17207 <f46e> <f46e> 17849 <f46f> <f46f> 17210 <f474> <f474> 17850 <f477> <f477> 17851 <f478> <f478> 17219 <f479> <f479> 17852 <f47b> <f47b> 17853 <f47c> <f47e> 17223 <f480> <f481> 17227 <f483> <f483> 17854 <f484> <f485> 17231 <f488> <f488> 17235 <f48b> <f48b> 17238 <f48d> <f490> 17240 <f491> <f491> 17855 <f497> <f498> 17250 <f49b> <f49b> 17254 <f49e> <f49e> 17257 <f4a4> <f4a6> 17263 endcidrange 100 begincidrange <f4a7> <f4a7> 17857 <f4a9> <f4aa> 17268 <f4ad> <f4ad> 17272 <f4af> <f4b0> 17274 <f4b2> <f4b2> 17859 <f4b3> <f4b4> 17278 <f4b7> <f4b7> 17282 <f4ba> <f4c0> 17285 <f4c1> <f4c1> 17860 <f4c3> <f4c5> 17861 <f4c7> <f4ca> 17865 <f4cc> <f4cf> 17870 <f4d1> <f4d5> 17874 <f4d7> <f4d7> 17880 <f4d9> <f4da> 17882 <f4db> <f4dc> 17292 <f4dd> <f4de> 17884 <f4df> <f4df> 17294 <f4e0> <f4e0> 17886 <f4e2> <f4e2> 17887 <f4e3> <f4e3> 17296 <f4e4> <f4e4> 17888 <f4e5> <f4e5> 17297 <f4e6> <f4e6> 17889 <f4e7> <f4e9> 17298 <f4ef> <f4ef> 17893 <f4f2> <f4f2> 17303 <f4f3> <f4f3> 17896 <f4f8> <f4f8> 17899 <f4fc> <f4fc> 17902 <f4fe> <f4ff> 17904 <f500> <f501> 17906 <f503> <f503> 17908 <f505> <f505> 17910 <f507> <f511> 17912 <f513> <f516> 17924 <f518> <f51d> 17929 <f51f> <f526> 17936 <f52a> <f52a> 17947 <f533> <f534> 17956 <f53a> <f53b> 17633 <f53d> <f53d> 17636 <f54e> <f54e> 17653 <f553> <f553> 17658 <f556> <f556> 17660 <f559> <f55a> 17663 <f55e> <f55e> 17668 <f565> <f565> 17675 <f56b> <f56b> 17681 <f572> <f572> 17688 <f694> <f694> 18044 <f69e> <f69e> 18054 <f6ad> <f6ad> 18068 <f6b0> <f6b0> 18071 <f7e5> <f7e6> 13999 <f7e8> <f7e8> 14002 <f7ea> <f7eb> 14004 <f7ed> <f7ee> 14007 <fa0c> <fa0c> 628 <fa0d> <fa0d> 9089 <fe30> <fe30> 109 <fe31> <fe31> 122 <fe33> <fe33> 13743 <fe34> <fe34> 13745 <fe35> <fe36> 130 <fe37> <fe38> 134 <fe39> <fe3a> 138 <fe3b> <fe3c> 142 <fe3d> <fe3e> 146 <fe3f> <fe40> 150 <fe41> <fe42> 154 <fe43> <fe44> 158 <fe49> <fe4a> 199 <fe4b> <fe4c> 203 <fe4d> <fe4e> 201 <fe4f> <fe4f> 13746 <fe50> <fe50> 112 <fe52> <fe52> 114 <fe54> <fe57> 116 <fe59> <fe5e> 160 <fe5f> <fe61> 205 <fe62> <fe66> 223 <fe69> <fe6b> 268 <ff01> <ff01> 108 <ff02> <ff02> 14052 <ff03> <ff03> 174 <ff04> <ff04> 259 <ff05> <ff05> 264 <ff06> <ff06> 175 <ff07> <ff07> 14051 <ff08> <ff09> 128 <ff0a> <ff0a> 176 <ff0b> <ff0b> 208 <ff0c> <ff0c> 100 <ff0d> <ff0d> 209 <ff0e> <ff0e> 103 <ff0f> <ff0f> 257 <ff10> <ff19> 333 <ff1a> <ff1a> 106 <ff1b> <ff1b> 105 endcidrange 18 begincidrange <ff1c> <ff1c> 214 <ff1d> <ff1d> 216 <ff1e> <ff1e> 215 <ff1f> <ff1f> 107 <ff20> <ff20> 265 <ff21> <ff3a> 365 <ff3b> <ff3b> 13758 <ff3c> <ff3c> 258 <ff3d> <ff3d> 13759 <ff3e> <ff3e> 13748 <ff3f> <ff3f> 197 <ff41> <ff5a> 391 <ff5b> <ff5b> 132 <ff5c> <ff5c> 120 <ff5d> <ff5d> 133 <ff64> <ff64> 113 <ffe2> <ffe2> 14049 <ffe4> <ffe4> 14050 endcidrange endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF \ No newline at end of file
diff --git a/src/main/resources/Resources/cmap/UniCNS-UCS2-V b/src/main/resources/Resources/cmap/UniCNS-UCS2-V
new file mode 100644
index 0000000..754e7e4
--- /dev/null
+++ b/src/main/resources/Resources/cmap/UniCNS-UCS2-V
@@ -0,0 +1 @@
+%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%DocumentNeededResources: CMap (UniCNS-UCS2-H) %%IncludeResource: ProcSet (CIDInit) %%IncludeResource: CMap (UniCNS-UCS2-H) %%BeginResource: CMap (UniCNS-UCS2-V) %%Title: (UniCNS-UCS2-V Adobe CNS1 0) %%Version: 10.001 %%Copyright: ----------------------------------------------------------- %%Copyright: Copyright 1990-1999 Adobe Systems Incorporated. %%Copyright: All Rights Reserved. %%Copyright: %%Copyright: Patents Pending %%Copyright: %%Copyright: NOTICE: All information contained herein is the property %%Copyright: of Adobe Systems Incorporated. %%Copyright: %%Copyright: Permission is granted for redistribution of this file %%Copyright: provided this copyright notice is maintained intact and %%Copyright: that the contents of this file are not altered in any %%Copyright: way from its original form. %%Copyright: %%Copyright: PostScript and Display PostScript are trademarks of %%Copyright: Adobe Systems Incorporated which may be registered in %%Copyright: certain jurisdictions. %%Copyright: ----------------------------------------------------------- %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /UniCNS-UCS2-H usecmap /CIDSystemInfo 3 dict dup begin /Registry (Adobe) def /Ordering (CNS1) def /Supplement 0 def end def /CMapName /UniCNS-UCS2-V def /CMapVersion 10.001 def /CMapType 1 def /XUID [1 10 25393] def /WMode 1 def 13 begincidrange <2013> <2013> 120 <2014> <2014> 122 <2025> <2025> 109 <300a> <300b> 146 <3008> <3009> 150 <300c> <300d> 154 <300e> <300f> 158 <3010> <3011> 142 <3014> <3015> 138 <fe4f> <fe4f> 13745 <ff08> <ff09> 130 <ff5b> <ff5b> 134 <ff5d> <ff5d> 135 endcidrange endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF \ No newline at end of file
diff --git a/src/main/resources/Resources/cmap/UniGB-UCS2-H b/src/main/resources/Resources/cmap/UniGB-UCS2-H
new file mode 100644
index 0000000..83c3d69
--- /dev/null
+++ b/src/main/resources/Resources/cmap/UniGB-UCS2-H
@@ -0,0 +1 @@
+%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%IncludeResource: ProcSet (CIDInit) %%BeginResource: CMap (UniGB-UCS2-H) %%Title: (UniGB-UCS2-H Adobe GB1 4) %%Version: 12.001 %%Copyright: ----------------------------------------------------------- %%Copyright: Copyright 1990-2000 Adobe Systems Incorporated. %%Copyright: All Rights Reserved. %%Copyright: %%Copyright: Patents Pending %%Copyright: %%Copyright: NOTICE: All information contained herein is the property %%Copyright: of Adobe Systems Incorporated. %%Copyright: %%Copyright: Permission is granted for redistribution of this file %%Copyright: provided this copyright notice is maintained intact and %%Copyright: that the contents of this file are not altered in any %%Copyright: way from its original form. %%Copyright: %%Copyright: PostScript and Display PostScript are trademarks of %%Copyright: Adobe Systems Incorporated which may be registered in %%Copyright: certain jurisdictions. %%Copyright: ----------------------------------------------------------- %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo 3 dict dup begin /Registry (Adobe) def /Ordering (GB1) def /Supplement 4 def end def /CMapName /UniGB-UCS2-H def /CMapVersion 12.001 def /CMapType 1 def /XUID [1 10 25366] def /WMode 0 def 2 begincodespacerange <0000> <D7FF> <E000> <FFFF> endcodespacerange 1 beginnotdefrange <0000> <001f> 1 endnotdefrange 100 begincidrange <0020> <007e> 1 <00a4> <00a4> 167 <00a5> <00a5> 22354 <00a7> <00a7> 171 <00a8> <00a8> 102 <00b0> <00b0> 162 <00b1> <00b1> 127 <00d7> <00d7> 128 <00e0> <00e0> 671 <00e1> <00e1> 669 <00e8> <00e8> 675 <00e9> <00e9> 673 <00ea> <00ea> 693 <00ec> <00ec> 679 <00ed> <00ed> 677 <00f2> <00f2> 683 <00f3> <00f3> 681 <00f7> <00f7> 129 <00f9> <00f9> 687 <00fa> <00fa> 685 <00fc> <00fc> 692 <0101> <0101> 668 <0113> <0113> 672 <011b> <011b> 674 <012b> <012b> 676 <014d> <014d> 680 <016b> <016b> 684 <01ce> <01ce> 670 <01d0> <01d0> 678 <01d2> <01d2> 682 <01d4> <01d4> 686 <01d6> <01d6> 688 <01d8> <01d8> 689 <01da> <01da> 690 <01dc> <01dc> 691 <01f9> <01f9> 698 <02c7> <02c7> 101 <02c9> <02c9> 100 <02ca> <02cb> 9907 <02d9> <02d9> 9909 <0391> <03a1> 525 <03a3> <03a9> 542 <03b1> <03c1> 549 <03c3> <03c9> 566 <0401> <0401> 608 <0410> <0415> 602 <0416> <0435> 609 <0436> <044f> 642 <0451> <0451> 641 <1e3f> <1e3f> 695 <2010> <2010> 10018 <2013> <2013> 9910 <2014> <2014> 105 <2015> <2015> 9911 <2016> <2016> 107 <2018> <2019> 109 <201c> <201d> 111 <2025> <2025> 9912 <2026> <2026> 108 <2030> <2030> 170 <2032> <2033> 163 <2035> <2035> 9913 <203b> <203b> 184 <20ac> <20ac> 22353 <2103> <2103> 165 <2105> <2105> 9914 <2109> <2109> 9915 <2116> <2116> 172 <2121> <2121> 10016 <2160> <216b> 250 <2170> <2179> 9897 <2190> <2191> 186 <2192> <2192> 185 <2193> <2193> 188 <2196> <2199> 9916 <2208> <2208> 137 <220f> <220f> 134 <2211> <2211> 133 <2215> <2215> 9920 <221a> <221a> 139 <221d> <221d> 151 <221e> <221e> 157 <221f> <221f> 9921 <2220> <2220> 142 <2223> <2223> 9922 <2225> <2225> 141 <2227> <2228> 131 <2229> <2229> 136 <222a> <222a> 135 <222b> <222b> 145 <222e> <222e> 146 <2234> <2234> 159 <2235> <2235> 158 <2236> <2236> 130 <2237> <2237> 138 <223d> <223d> 150 <2248> <2248> 149 <224c> <224c> 148 <2252> <2252> 9923 <2260> <2260> 152 endcidrange 100 begincidrange <2261> <2261> 147 <2264> <2265> 155 <2266> <2267> 9924 <226e> <226f> 153 <2295> <2295> 9988 <2299> <2299> 144 <22a5> <22a5> 140 <22bf> <22bf> 9926 <22ef> <22ef> 108 <2312> <2312> 143 <2460> <2469> 230 <2474> <2487> 210 <2488> <249b> 190 <2500> <254b> 738 <2550> <2573> 9927 <2581> <258f> 9963 <2593> <2595> 9978 <25a0> <25a0> 181 <25a1> <25a1> 180 <25b2> <25b2> 183 <25b3> <25b3> 182 <25bc> <25bd> 9981 <25c6> <25c6> 179 <25c7> <25c7> 178 <25cb> <25cb> 175 <25ce> <25ce> 177 <25cf> <25cf> 176 <25e2> <25e5> 9983 <2605> <2605> 174 <2606> <2606> 173 <2609> <2609> 9987 <2640> <2640> 161 <2642> <2642> 160 <2e80> <2e80> 22428 <2e81> <2e81> 22047 <2e82> <2e83> 22429 <2e84> <2e84> 22051 <2e85> <2e87> 22431 <2e88> <2e88> 22054 <2e89> <2e8a> 22434 <2e8b> <2e8b> 22055 <2e8c> <2e8c> 22060 <2e8d> <2e96> 22436 <2e97> <2e97> 22061 <2e98> <2e99> 22446 <2e9b> <2ea6> 22448 <2ea7> <2ea7> 22074 <2ea8> <2ea9> 22460 <2eaa> <2eaa> 22077 <2eab> <2ead> 22462 <2eae> <2eae> 22080 <2eaf> <2eb2> 22465 <2eb3> <2eb3> 22082 <2eb4> <2eb5> 22469 <2eb6> <2eb7> 22083 <2eb8> <2eba> 22471 <2ebb> <2ebb> 22088 <2ebc> <2ec9> 22474 <2eca> <2eca> 22098 <2ecb> <2ef3> 22488 <2f00> <2f00> 4162 <2f01> <2f01> 4707 <2f02> <2f02> 4722 <2f03> <2f03> 4709 <2f04> <2f04> 4185 <2f05> <2f05> 10131 <2f06> <2f06> 1597 <2f07> <2f07> 4867 <2f08> <2f08> 3238 <2f09> <2f09> 1592 <2f0a> <2f0a> 3270 <2f0b> <2f0b> 982 <2f0c> <2f0c> 4765 <2f0d> <2f0d> 4884 <2f0e> <2f0e> 4879 <2f0f> <2f0f> 2091 <2f10> <2f10> 5017 <2f11> <2f11> 1431 <2f12> <2f12> 2543 <2f13> <2f13> 4860 <2f14> <2f14> 4710 <2f15> <2f15> 4740 <2f16> <2f16> 10778 <2f17> <2f17> 3397 <2f18> <2f18> 1150 <2f19> <2f19> 4946 <2f1a> <2f1a> 1228 <2f1b> <2f1b> 5020 <2f1c> <2f1c> 4283 <2f1d> <2f1d> 2407 <2f1e> <2f1e> 5523 <2f1f> <2f1f> 3698 <2f20> <2f20> 3414 <2f21> <2f21> 5660 <2f22> <2f22> 11565 <2f23> <2f23> 3859 <2f24> <2f24> 1398 <2f25> <2f25> 2927 <2f26> <2f26> 4656 <2f27> <2f27> 5934 endcidrange 100 begincidrange <2f28> <2f28> 1386 <2f29> <2f29> 3948 <2f2a> <2f2a> 5302 <2f2b> <2f2b> 3395 <2f2c> <2f2c> 6004 <2f2d> <2f2d> 3318 <2f2e> <2f2e> 6165 <2f2f> <2f2f> 1789 <2f30> <2f30> 2093 <2f31> <2f31> 2238 <2f32> <2f32> 1732 <2f33> <2f33> 6163 <2f34> <2f34> 1852 <2f35> <2f35> 5016 <2f36> <2f36> 5293 <2f37> <2f37> 5366 <2f38> <2f38> 1798 <2f39> <2f39> 5986 <2f3a> <2f3a> 5614 <2f3b> <2f3b> 5600 <2f3c> <2f3c> 3983 <2f3d> <2f3d> 1765 <2f3e> <2f3e> 12946 <2f3f> <2f3f> 3437 <2f40> <2f40> 4518 <2f41> <2f41> 6409 <2f42> <2f42> 3795 <2f43> <2f43> 1526 <2f44> <2f44> 2240 <2f45> <2f45> 1626 <2f46> <2f46> 3821 <2f47> <2f47> 3248 <2f48> <2f48> 4350 <2f49> <2f49> 4357 <2f4a> <2f4a> 2849 <2f4b> <2f4b> 3124 <2f4c> <2f4c> 4536 <2f4d> <2f4d> 1400 <2f4e> <2f4e> 6589 <2f4f> <2f4f> 3826 <2f50> <2f50> 1073 <2f51> <2f51> 2736 <2f52> <2f52> 3430 <2f53> <2f53> 3095 <2f54> <2f54> 3491 <2f55> <2f55> 2053 <2f56> <2f56> 4611 <2f57> <2f57> 1715 <2f58> <2f58> 4713 <2f59> <2f59> 5789 <2f5a> <2f5a> 3019 <2f5b> <2f5b> 4073 <2f5c> <2f5c> 2916 <2f5d> <2f5d> 3209 <2f5e> <2f5e> 4041 <2f5f> <2f5f> 4310 <2f60> <2f60> 1832 <2f61> <2f61> 3728 <2f62> <2f62> 1733 <2f63> <2f63> 3379 <2f64> <2f64> 4264 <2f65> <2f65> 3650 <2f66> <2f66> 7110 <2f67> <2f67> 7008 <2f68> <2f68> 16063 <2f69> <2f69> 994 <2f6a> <2f6a> 3011 <2f6b> <2f6b> 2808 <2f6c> <2f6c> 2850 <2f6d> <2f6d> 2737 <2f6e> <2f6e> 3407 <2f6f> <2f6f> 3398 <2f70> <2f70> 3413 <2f71> <2f71> 16587 <2f72> <2f72> 1923 <2f73> <2f73> 4049 <2f74> <2f74> 2539 <2f75> <2f75> 4592 <2f76> <2f76> 2780 <2f77> <2f77> 7399 <2f78> <2f78> 7262 <2f79> <2f79> 3753 <2f7a> <2f7a> 4123 <2f7b> <2f7b> 4309 <2f7c> <2f7c> 2490 <2f7d> <2f7d> 1591 <2f7e> <2f7e> 7115 <2f7f> <2f7f> 1593 <2f80> <2f80> 6686 <2f81> <2f81> 3261 <2f82> <2f82> 1249 <2f83> <2f83> 4657 <2f84> <2f84> 4544 <2f85> <2f85> 2297 <2f86> <2f86> 3353 <2f87> <2f87> 5656 <2f88> <2f88> 4570 <2f89> <2f89> 7388 <2f8a> <2f8a> 3300 <2f8b> <2f8b> 17826 endcidrange 100 begincidrange <2f8c> <2f8c> 7152 <2f8d> <2f8d> 1291 <2f8e> <2f8e> 4051 <2f8f> <2f8f> 3995 <2f90> <2f90> 4169 <2f91> <2f91> 18908 <2f92> <2f92> 8086 <2f93> <2f93> 2200 <2f94> <2f94> 4093 <2f95> <2f95> 1825 <2f96> <2f96> 1528 <2f97> <2f97> 7445 <2f98> <2f98> 7504 <2f99> <2f99> 7739 <2f9a> <2f9a> 1285 <2f9b> <2f9b> 4668 <2f9c> <2f9c> 4672 <2f9d> <2f9d> 3366 <2f9e> <2f9e> 7803 <2f9f> <2f9f> 3980 <2fa0> <2fa0> 1250 <2fa1> <2fa1> 19731 <2fa2> <2fa2> 4191 <2fa3> <2fa3> 4276 <2fa4> <2fa4> 19992 <2fa5> <2fa5> 2522 <2fa6> <2fa6> 2241 <2fa7> <2fa7> 7797 <2fa8> <2fa8> 8317 <2fa9> <2fa9> 1714 <2faa> <2faa> 2542 <2fab> <2fab> 7545 <2fac> <2fac> 4303 <2fad> <2fad> 20714 <2fae> <2fae> 1636 <2faf> <2faf> 2795 <2fb0> <2fb0> 1770 <2fb1> <2fb1> 8589 <2fb2> <2fb2> 2289 <2fb3> <2fb3> 4219 <2fb4> <2fb4> 8713 <2fb5> <2fb5> 7936 <2fb6> <2fb6> 7924 <2fb7> <2fb7> 3402 <2fb8> <2fb8> 3438 <2fb9> <2fb9> 3920 <2fba> <2fba> 8301 <2fbb> <2fbb> 1824 <2fbc> <2fbc> 1754 <2fbd> <2fbd> 7660 <2fbe> <2fbe> 7888 <2fbf> <2fbf> 5019 <2fc0> <2fc0> 4704 <2fc1> <2fc1> 1862 <2fc2> <2fc2> 8761 <2fc3> <2fc3> 8348 <2fc4> <2fc4> 9864 <2fc5> <2fc5> 2656 <2fc6> <2fc6> 8305 <2fc7> <2fc7> 2704 <2fc8> <2fc8> 21894 <2fc9> <2fc9> 3465 <2fca> <2fca> 1937 <2fcb> <2fcb> 6741 <2fcc> <2fcc> 9752 <2fcd> <2fcd> 1509 <2fce> <2fce> 1821 <2fcf> <2fcf> 3466 <2fd0> <2fd0> 1072 <2fd1> <2fd1> 8390 <2fd2> <2fd2> 7814 <2fd3> <2fd3> 8247 <2fd4> <2fd4> 7988 <2fd5> <2fd5> 4851 <2ff0> <2ffb> 10060 <3000> <3002> 96 <3003> <3003> 103 <3005> <3005> 104 <3006> <3006> 10024 <3007> <3007> 7703 <3008> <300f> 115 <3010> <3011> 125 <3012> <3012> 9989 <3013> <3013> 189 <3014> <3015> 113 <3016> <3017> 123 <301d> <301e> 9990 <3021> <3029> 9992 <3033> <3035> 22395 <3038> <303a> 22398 <303e> <303e> 10059 <303f> <303f> 22357 <3041> <3093> 356 <3094> <3094> 22375 <309b> <309c> 10020 <309d> <309e> 10025 <30a1> <30f6> 439 <30f7> <30fa> 22390 <30fb> <30fb> 99 <30fc> <30fc> 10019 endcidrange 100 begincidrange <30fd> <30fe> 10022 <3105> <3129> 700 <312a> <312c> 22401 <31a0> <31b7> 22404 <3220> <3229> 240 <3231> <3231> 10017 <32a3> <32a3> 10001 <338e> <338f> 10002 <339c> <339e> 10004 <33a1> <33a1> 10007 <33c4> <33c4> 10008 <33ce> <33ce> 10009 <33d1> <33d2> 10010 <33d5> <33d5> 10012 <3400> <3446> 22529 <3447> <3447> 22053 <3448> <3472> 22600 <3473> <3473> 22052 <3474> <34ff> 22643 <3500> <359d> 22783 <359e> <359e> 22057 <359f> <35ff> 22941 <3600> <360d> 23038 <360e> <360e> 22059 <360f> <3619> 23052 <361a> <361a> 22058 <361b> <36ff> 23063 <3700> <37ff> 23292 <3800> <38ff> 23548 <3900> <3917> 23804 <3918> <3918> 22063 <3919> <396d> 23828 <396e> <396e> 22062 <396f> <39ce> 23913 <39cf> <39cf> 22065 <39d0> <39d0> 22068 <39d1> <39de> 24009 <39df> <39df> 22066 <39e0> <39ff> 24023 <3a00> <3a72> 24055 <3a73> <3a73> 22067 <3a74> <3aff> 24170 <3b00> <3b4d> 24310 <3b4e> <3b4e> 22071 <3b4f> <3bff> 24388 <3c00> <3c6d> 24565 <3c6e> <3c6e> 22072 <3c6f> <3cdf> 24675 <3ce0> <3ce0> 22073 <3ce1> <3cff> 24788 <3d00> <3dff> 24819 <3e00> <3eff> 25075 <3f00> <3fff> 25331 <4000> <4055> 25587 <4056> <4056> 22078 <4057> <40ff> 25673 <4100> <415e> 25842 <415f> <415f> 22079 <4160> <41ff> 25937 <4200> <42ff> 26097 <4300> <4336> 26353 <4337> <4337> 22081 <4338> <43ab> 26408 <43ac> <43ac> 22087 <43ad> <43b0> 26524 <43b1> <43b1> 22086 <43b2> <43dc> 26528 <43dd> <43dd> 22089 <43de> <43ff> 26571 <4400> <44d5> 26605 <44d6> <44d6> 22090 <44d7> <44ff> 26819 <4500> <45ff> 26860 <4600> <464b> 27116 <464c> <464c> 22092 <464d> <4660> 27192 <4661> <4661> 22091 <4662> <46ff> 27212 <4700> <4722> 27370 <4723> <4723> 22094 <4724> <4728> 27405 <4729> <4729> 22095 <472a> <477b> 27410 <477c> <477c> 22096 <477d> <478c> 27492 <478d> <478d> 22097 <478e> <47ff> 27508 <4800> <48ff> 27622 <4900> <4946> 27878 <4947> <4947> 22099 <4948> <4979> 27949 <497a> <497a> 22100 <497b> <497c> 27999 <497d> <497d> 22101 <497e> <4981> 28001 <4982> <4983> 22102 <4984> <4984> 28005 <4985> <4986> 22104 <4987> <499a> 28006 <499b> <499b> 22107 endcidrange 100 begincidrange <499c> <499e> 28026 <499f> <499f> 22106 <49a0> <49b5> 28029 <49b6> <49b6> 22109 <49b7> <49b7> 22108 <49b8> <49ff> 28051 <4a00> <4aff> 28123 <4b00> <4bff> 28379 <4c00> <4c76> 28635 <4c77> <4c77> 22116 <4c78> <4c9e> 28754 <4c9f> <4ca1> 22113 <4ca2> <4ca2> 22117 <4ca3> <4ca3> 22112 <4ca4> <4cff> 28793 <4d00> <4d12> 28885 <4d13> <4d19> 22118 <4d1a> <4dad> 28904 <4dae> <4dae> 22125 <4daf> <4db5> 29052 <4e00> <4e00> 4162 <4e01> <4e01> 1504 <4e02> <4e02> 10072 <4e03> <4e03> 3070 <4e04> <4e06> 10073 <4e07> <4e07> 3747 <4e08> <4e08> 4458 <4e09> <4e09> 3288 <4e0a> <4e0a> 3336 <4e0b> <4e0b> 3887 <4e0c> <4e0c> 4696 <4e0d> <4e0d> 1154 <4e0e> <4e0e> 4304 <4e0f> <4e0f> 10076 <4e10> <4e10> 4698 <4e11> <4e11> 1304 <4e12> <4e12> 10077 <4e13> <4e13> 4613 <4e14> <4e14> 3151 <4e15> <4e15> 4701 <4e16> <4e16> 3415 <4e17> <4e17> 10078 <4e18> <4e18> 3181 <4e19> <4e19> 1124 <4e1a> <4e1a> 4156 <4e1b> <4e1b> 1367 <4e1c> <4e1c> 1514 <4e1d> <4e1d> 3508 <4e1e> <4e1e> 4703 <4e1f> <4e21> 10079 <4e22> <4e22> 1513 <4e23> <4e23> 10082 <4e24> <4e24> 2566 <4e25> <4e25> 4088 <4e26> <4e26> 10083 <4e27> <4e27> 3294 <4e28> <4e28> 4707 <4e29> <4e29> 10084 <4e2a> <4e2a> 1777 <4e2b> <4e2b> 4071 <4e2c> <4e2c> 5788 <4e2d> <4e2d> 4559 <4e2e> <4e2f> 10085 <4e30> <4e30> 1662 <4e31> <4e31> 10087 <4e32> <4e32> 1329 <4e33> <4e33> 10088 <4e34> <4e34> 2594 <4e35> <4e35> 10089 <4e36> <4e36> 4722 <4e37> <4e37> 10090 <4e38> <4e38> 3737 <4e39> <4e39> 1413 <4e3a> <4e3a> 3769 <4e3b> <4e3b> 4598 <4e3c> <4e3c> 10091 <4e3d> <4e3d> 2529 <4e3e> <4e3e> 2312 <4e3f> <4e3f> 4709 <4e40> <4e42> 10092 <4e43> <4e43> 2862 <4e44> <4e44> 10095 <4e45> <4e45> 2290 <4e46> <4e46> 10096 <4e47> <4e47> 4711 <4e48> <4e48> 2745 <4e49> <4e49> 4204 <4e4a> <4e4a> 10097 <4e4b> <4e4b> 4525 <4e4c> <4e4c> 3817 <4e4d> <4e4d> 4424 <4e4e> <4e4e> 1964 <4e4f> <4e4f> 1603 <4e50> <4e50> 2497 <4e51> <4e51> 10098 <4e52> <4e52> 3032 <4e53> <4e53> 2963 <4e54> <4e54> 3140 <4e55> <4e55> 10099 <4e56> <4e56> 1837 endcidrange 100 begincidrange <4e57> <4e57> 10100 <4e58> <4e58> 1264 <4e59> <4e59> 4185 <4e5a> <4e5b> 10101 <4e5c> <4e5c> 4725 <4e5d> <4e5d> 2292 <4e5e> <4e5e> 3089 <4e5f> <4e5f> 4153 <4e60> <4e60> 3869 <4e61> <4e61> 3924 <4e62> <4e65> 10103 <4e66> <4e66> 3456 <4e67> <4e68> 10107 <4e69> <4e69> 4726 <4e6a> <4e6f> 10109 <4e70> <4e70> 2713 <4e71> <4e71> 2681 <4e72> <4e72> 10115 <4e73> <4e73> 3268 <4e74> <4e7d> 10116 <4e7e> <4e7e> 3113 <4e7f> <4e81> 10126 <4e82> <4e82> 8281 <4e83> <4e85> 10129 <4e86> <4e86> 2580 <4e87> <4e87> 10132 <4e88> <4e88> 4301 <4e89> <4e89> 4506 <4e8a> <4e8a> 10133 <4e8b> <4e8b> 3417 <4e8c> <4e8c> 1597 <4e8d> <4e8d> 4695 <4e8e> <4e8e> 4287 <4e8f> <4e8f> 2436 <4e90> <4e90> 10134 <4e91> <4e91> 4361 <4e92> <4e92> 1978 <4e93> <4e93> 4727 <4e94> <4e94> 3828 <4e95> <4e95> 2269 <4e96> <4e97> 10135 <4e98> <4e98> 4702 <4e99> <4e99> 10137 <4e9a> <4e9a> 4080 <4e9b> <4e9b> 3956 <4e9c> <4e9d> 10138 <4e9e> <4e9e> 8689 <4e9f> <4e9f> 4723 <4ea0> <4ea0> 4867 <4ea1> <4ea1> 3751 <4ea2> <4ea2> 2375 <4ea3> <4ea3> 10140 <4ea4> <4ea4> 2188 <4ea5> <4ea5> 1884 <4ea6> <4ea6> 4199 <4ea7> <4ea7> 1217 <4ea8> <4ea8> 1943 <4ea9> <4ea9> 2841 <4eaa> <4eaa> 10141 <4eab> <4eab> 3930 <4eac> <4eac> 2264 <4ead> <4ead> 3669 <4eae> <4eae> 2570 <4eaf> <4eb1> 10142 <4eb2> <4eb2> 3156 <4eb3> <4eb3> 4869 <4eb4> <4eb4> 10145 <4eb5> <4eb5> 4872 <4eb6> <4eb9> 10146 <4eba> <4eba> 3238 <4ebb> <4ebb> 4767 <4ebc> <4ebe> 10150 <4ebf> <4ebf> 4193 <4ec0> <4ec0> 3401 <4ec1> <4ec1> 3237 <4ec2> <4ec2> 4770 <4ec3> <4ec3> 4768 <4ec4> <4ec4> 4732 <4ec5> <4ec5> 2247 <4ec6> <4ec6> 3052 <4ec7> <4ec7> 1301 <4ec8> <4ec8> 10153 <4ec9> <4ec9> 4769 <4eca> <4eca> 2242 <4ecb> <4ecb> 2234 <4ecc> <4ecc> 10154 <4ecd> <4ecd> 3247 <4ece> <4ece> 1366 <4ecf> <4ed0> 10155 <4ed1> <4ed1> 2687 <4ed2> <4ed2> 10157 <4ed3> <4ed3> 1181 <4ed4> <4ed4> 4653 <4ed5> <4ed5> 3426 <4ed6> <4ed6> 3568 <4ed7> <4ed7> 4461 <4ed8> <4ed8> 1713 <4ed9> <4ed9> 3894 <4eda> <4edc> 10158 <4edd> <4edd> 4846 endcidrange 100 begincidrange <4ede> <4ede> 4774 <4edf> <4edf> 3111 <4ee0> <4ee0> 10161 <4ee1> <4ee1> 4772 <4ee2> <4ee2> 10162 <4ee3> <4ee3> 1405 <4ee4> <4ee4> 2615 <4ee5> <4ee5> 4187 <4ee6> <4ee7> 10163 <4ee8> <4ee8> 4771 <4ee9> <4ee9> 10165 <4eea> <4eea> 4174 <4eeb> <4eeb> 4773 <4eec> <4eec> 2764 <4eed> <4eef> 10166 <4ef0> <4ef0> 4127 <4ef1> <4ef1> 10169 <4ef2> <4ef2> 4568 <4ef3> <4ef3> 4776 <4ef4> <4ef4> 10170 <4ef5> <4ef5> 4779 <4ef6> <4ef6> 2161 <4ef7> <4ef7> 2126 <4ef8> <4efa> 10171 <4efb> <4efb> 3241 <4efc> <4efc> 10174 <4efd> <4efd> 1658 <4efe> <4efe> 10175 <4eff> <4eff> 1631 <4f00> <4f00> 10176 <4f01> <4f01> 3090 <4f02> <4f08> 10177 <4f09> <4f09> 4782 <4f0a> <4f0a> 4168 <4f0b> <4f0c> 10184 <4f0d> <4f0d> 3832 <4f0e> <4f0e> 2098 <4f0f> <4f0f> 1689 <4f10> <4f10> 1602 <4f11> <4f11> 4008 <4f12> <4f16> 10186 <4f17> <4f17> 4569 <4f18> <4f18> 4266 <4f19> <4f19> 2052 <4f1a> <4f1a> 2038 <4f1b> <4f1b> 4775 <4f1c> <4f1d> 10191 <4f1e> <4f1e> 3290 <4f1f> <4f1f> 3775 <4f20> <4f20> 1326 <4f21> <4f21> 10193 <4f22> <4f22> 4777 <4f23> <4f23> 10194 <4f24> <4f24> 3332 <4f25> <4f25> 4780 <4f26> <4f26> 2686 <4f27> <4f27> 4781 <4f28> <4f29> 10195 <4f2a> <4f2a> 3776 <4f2b> <4f2b> 4783 <4f2c> <4f2e> 10197 <4f2f> <4f2f> 1141 <4f30> <4f30> 1817 <4f31> <4f31> 10200 <4f32> <4f32> 4791 <4f33> <4f33> 10201 <4f34> <4f34> 1012 <4f35> <4f35> 10202 <4f36> <4f36> 2607 <4f37> <4f37> 10203 <4f38> <4f38> 3365 <4f39> <4f39> 10204 <4f3a> <4f3a> 3514 <4f3b> <4f3b> 10205 <4f3c> <4f3c> 3515 <4f3d> <4f3d> 4792 <4f3e> <4f42> 10206 <4f43> <4f43> 1481 <4f44> <4f45> 10211 <4f46> <4f46> 1420 <4f47> <4f4c> 10213 <4f4d> <4f4d> 3786 <4f4e> <4f4e> 1454 <4f4f> <4f4f> 4606 <4f50> <4f50> 4689 <4f51> <4f51> 4280 <4f52> <4f52> 10219 <4f53> <4f53> 3640 <4f54> <4f54> 10220 <4f55> <4f55> 1925 <4f56> <4f56> 10221 <4f57> <4f57> 4790 <4f58> <4f58> 4848 <4f59> <4f59> 4293 <4f5a> <4f5a> 4787 <4f5b> <4f5b> 1677 <4f5c> <4f5c> 4692 <4f5d> <4f5d> 4788 <4f5e> <4f5e> 4784 <4f5f> <4f5f> 4789 endcidrange 100 begincidrange <4f60> <4f60> 2886 <4f61> <4f62> 10222 <4f63> <4f63> 4251 <4f64> <4f64> 4778 <4f65> <4f65> 4849 <4f66> <4f66> 10224 <4f67> <4f67> 4785 <4f68> <4f68> 10225 <4f69> <4f69> 2982 <4f6a> <4f6b> 10226 <4f6c> <4f6c> 2491 <4f6d> <4f6e> 10228 <4f6f> <4f6f> 4121 <4f70> <4f70> 998 <4f71> <4f72> 10230 <4f73> <4f73> 2116 <4f74> <4f74> 4794 <4f75> <4f75> 10232 <4f76> <4f76> 4793 <4f77> <4f7a> 10233 <4f7b> <4f7b> 4800 <4f7c> <4f7c> 4802 <4f7d> <4f7d> 10237 <4f7e> <4f7e> 4799 <4f7f> <4f7f> 3408 <4f80> <4f82> 10238 <4f83> <4f83> 4797 <4f84> <4f84> 4533 <4f85> <4f85> 10241 <4f86> <4f86> 8178 <4f87> <4f87> 10242 <4f88> <4f88> 1283 <4f89> <4f89> 4796 <4f8a> <4f8a> 10243 <4f8b> <4f8b> 2536 <4f8c> <4f8c> 10244 <4f8d> <4f8d> 3427 <4f8e> <4f8e> 10245 <4f8f> <4f8f> 4798 <4f90> <4f90> 10246 <4f91> <4f91> 4795 <4f92> <4f93> 10247 <4f94> <4f94> 4804 <4f95> <4f95> 10249 <4f96> <4f96> 8285 <4f97> <4f97> 1520 <4f98> <4f9a> 10250 <4f9b> <4f9b> 1794 <4f9c> <4f9c> 10253 <4f9d> <4f9d> 4167 <4f9e> <4f9f> 10254 <4fa0> <4fa0> 3885 <4fa1> <4fa2> 10256 <4fa3> <4fa3> 2665 <4fa4> <4fa4> 10258 <4fa5> <4fa5> 2197 <4fa6> <4fa6> 4493 <4fa7> <4fa7> 1191 <4fa8> <4fa8> 3141 <4fa9> <4fa9> 2424 <4faa> <4faa> 4801 <4fab> <4fab> 10259 <4fac> <4fac> 4803 <4fad> <4fad> 10260 <4fae> <4fae> 3833 <4faf> <4faf> 1957 <4fb0> <4fb4> 10261 <4fb5> <4fb5> 3155 <4fb6> <4fbe> 10266 <4fbf> <4fbf> 1100 <4fc0> <4fc1> 10275 <4fc2> <4fc2> 9884 <4fc3> <4fc3> 1372 <4fc4> <4fc4> 1580 <4fc5> <4fc5> 4808 <4fc6> <4fc9> 10277 <4fca> <4fca> 2350 <4fcb> <4fcd> 10281 <4fce> <4fce> 4850 <4fcf> <4fcf> 3147 <4fd0> <4fd0> 2537 <4fd1> <4fd1> 4812 <4fd2> <4fd6> 10284 <4fd7> <4fd7> 3532 <4fd8> <4fd8> 1690 <4fd9> <4fd9> 10289 <4fda> <4fda> 4809 <4fdb> <4fdb> 10290 <4fdc> <4fdc> 4811 <4fdd> <4fdd> 1036 <4fde> <4fde> 4294 <4fdf> <4fdf> 4813 <4fe0> <4fe0> 8629 <4fe1> <4fe1> 3984 <4fe2> <4fe2> 10291 <4fe3> <4fe3> 4810 <4fe4> <4fe5> 10292 <4fe6> <4fe6> 4805 <4fe7> <4fe7> 10294 <4fe8> <4fe8> 4806 endcidrange 100 begincidrange <4fe9> <4fe9> 2546 <4fea> <4fea> 4807 <4feb> <4fec> 10295 <4fed> <4fed> 2150 <4fee> <4fee> 4009 <4fef> <4fef> 1700 <4ff0> <4ff0> 10297 <4ff1> <4ff1> 2322 <4ff2> <4ff2> 10298 <4ff3> <4ff3> 4817 <4ff4> <4ff7> 10299 <4ff8> <4ff8> 4814 <4ff9> <4ff9> 10303 <4ffa> <4ffa> 958 <4ffb> <4ffd> 10304 <4ffe> <4ffe> 4822 <4fff> <4fff> 10307 <5000> <5000> 8908 <5001> <5005> 10308 <5006> <5006> 8214 <5007> <5008> 10313 <5009> <5009> 7778 <500a> <500a> 10315 <500b> <500b> 7968 <500c> <500c> 4824 <500d> <500d> 1055 <500e> <500e> 10316 <500f> <500f> 4819 <5010> <5010> 10317 <5011> <5011> 8319 <5012> <5012> 1434 <5013> <5013> 10318 <5014> <5014> 2338 <5015> <5017> 10319 <5018> <5018> 3611 <5019> <5019> 1961 <501a> <501a> 4183 <501b> <501b> 10322 <501c> <501c> 4823 <501d> <501e> 10323 <501f> <501f> 2233 <5020> <5020> 10325 <5021> <5021> 1232 <5022> <5024> 10326 <5025> <5025> 4825 <5026> <5026> 2330 <5027> <5027> 10329 <5028> <5028> 4826 <5029> <5029> 4815 <502a> <502a> 2882 <502b> <502b> 8284 <502c> <502c> 4818 <502d> <502d> 4821 <502e> <502e> 4820 <502f> <5039> 10330 <503a> <503a> 4431 <503b> <503b> 10341 <503c> <503c> 4532 <503d> <503d> 10342 <503e> <503e> 3168 <503f> <5042> 10343 <5043> <5043> 4828 <5044> <5046> 10347 <5047> <5047> 2124 <5048> <5048> 4830 <5049> <5049> 8596 <504a> <504b> 10350 <504c> <504c> 4816 <504d> <504d> 10352 <504e> <504e> 4831 <504f> <504f> 3018 <5050> <5054> 10353 <5055> <5055> 4829 <5056> <5059> 10358 <505a> <505a> 4691 <505b> <505b> 10362 <505c> <505c> 3668 <505d> <5064> 10363 <5065> <5065> 2162 <5066> <506b> 10371 <506c> <506c> 4832 <506d> <5073> 10377 <5074> <5074> 7781 <5075> <5075> 8833 <5076> <5076> 2941 <5077> <5077> 3686 <5078> <507a> 10384 <507b> <507b> 4833 <507c> <507d> 10387 <507e> <507e> 4827 <507f> <507f> 1226 <5080> <5080> 2443 <5081> <5084> 10389 <5085> <5085> 1712 <5086> <5087> 10393 <5088> <5088> 2535 <5089> <508c> 10395 <508d> <508d> 1027 <508e> <5095> 10399 <5096> <5096> 8909 endcidrange 100 begincidrange <5097> <5097> 10407 <5098> <5098> 8458 <5099> <5099> 7742 <509a> <50a1> 10408 <50a2> <50a2> 9855 <50a3> <50a3> 1401 <50a4> <50a4> 10416 <50a5> <50a5> 4834 <50a6> <50a6> 10417 <50a7> <50a7> 4835 <50a8> <50a8> 1317 <50a9> <50a9> 4836 <50aa> <50ab> 10418 <50ac> <50ac> 1378 <50ad> <50ad> 8750 <50ae> <50b1> 10420 <50b2> <50b2> 972 <50b3> <50b3> 7830 <50b4> <50b4> 8907 <50b5> <50b5> 8812 <50b6> <50b6> 10424 <50b7> <50b7> 8471 <50b8> <50b9> 10425 <50ba> <50ba> 4837 <50bb> <50bb> 3310 <50bc> <50bd> 10427 <50be> <50be> 8424 <50bf> <50c1> 10429 <50c2> <50c2> 8916 <50c3> <50c4> 10432 <50c5> <50c5> 8121 <50c6> <50c8> 10434 <50c9> <50c9> 8920 <50ca> <50ce> 10437 <50cf> <50cf> 3934 <50d0> <50d0> 10442 <50d1> <50d1> 8415 <50d2> <50d4> 10443 <50d5> <50d5> 8386 <50d6> <50d6> 4838 <50d7> <50d9> 10446 <50da> <50da> 2574 <50db> <50dd> 10449 <50de> <50de> 8597 <50df> <50e4> 10452 <50e5> <50e5> 8108 <50e6> <50e6> 4842 <50e7> <50e7> 3303 <50e8> <50e8> 8915 <50e9> <50eb> 10458 <50ec> <50ec> 4841 <50ed> <50ed> 4840 <50ee> <50ee> 4843 <50ef> <50f2> 10461 <50f3> <50f3> 3536 <50f4> <50f4> 10465 <50f5> <50f5> 2170 <50f6> <50f8> 10466 <50f9> <50f9> 8065 <50fa> <50fa> 10469 <50fb> <50fb> 3014 <50fc> <50ff> 10470 <5100> <5100> 8720 <5101> <5101> 10474 <5102> <5102> 8911 <5103> <5103> 10475 <5104> <5104> 8723 <5105> <5105> 10476 <5106> <5106> 4839 <5107> <5107> 4844 <5108> <5108> 8164 <5109> <5109> 8080 <510a> <510a> 10477 <510b> <510b> 4845 <510c> <510f> 10478 <5110> <5110> 8918 <5111> <5111> 10482 <5112> <5112> 3264 <5113> <5113> 10483 <5114> <5114> 8912 <5115> <5115> 8910 <5116> <5117> 10484 <5118> <5118> 9857 <5119> <511e> 10486 <511f> <511f> 7798 <5120> <5120> 10492 <5121> <5121> 2503 <5122> <5129> 10493 <512a> <512a> 8753 <512b> <5131> 10501 <5132> <5132> 7827 <5133> <5136> 10508 <5137> <5137> 8914 <5138> <5139> 10512 <513a> <513a> 8919 <513b> <513b> 8917 <513c> <513c> 8913 <513d> <513e> 10514 <513f> <513f> 1592 <5140> <5140> 4697 endcidrange 100 begincidrange <5141> <5141> 4365 <5142> <5142> 10516 <5143> <5143> 4333 <5144> <5144> 4001 <5145> <5145> 1289 <5146> <5146> 4472 <5147> <5147> 10517 <5148> <5148> 3893 <5149> <5149> 1851 <514a> <514a> 10518 <514b> <514b> 2392 <514c> <514c> 10519 <514d> <514d> 2791 <514e> <5150> 10520 <5151> <5151> 1553 <5152> <5152> 7909 <5153> <5153> 10523 <5154> <5154> 3700 <5155> <5155> 4866 <5156> <5156> 4868 <5157> <5159> 10524 <515a> <515a> 1428 <515b> <515b> 10527 <515c> <515c> 1524 <515d> <5161> 10528 <5162> <5162> 2259 <5163> <5164> 10533 <5165> <5165> 3270 <5166> <5167> 10535 <5168> <5168> 3206 <5169> <5169> 8229 <516a> <516a> 10537 <516b> <516b> 982 <516c> <516c> 1796 <516d> <516d> 2626 <516e> <516e> 4854 <516f> <516f> 10538 <5170> <5170> 2471 <5171> <5171> 1803 <5172> <5172> 10539 <5173> <5173> 1841 <5174> <5174> 3990 <5175> <5175> 1121 <5176> <5176> 3075 <5177> <5177> 2318 <5178> <5178> 1477 <5179> <5179> 4645 <517a> <517a> 10540 <517b> <517b> 4129 <517c> <517c> 2137 <517d> <517d> 3445 <517e> <517f> 10541 <5180> <5180> 2096 <5181> <5181> 4858 <5182> <5182> 4765 <5183> <5184> 10543 <5185> <5185> 2877 <5186> <5187> 10545 <5188> <5188> 1743 <5189> <5189> 3224 <518a> <518b> 10547 <518c> <518c> 1192 <518d> <518d> 4380 <518e> <5191> 10549 <5192> <5192> 2741 <5193> <5194> 10553 <5195> <5195> 2790 <5196> <5196> 4884 <5197> <5197> 3258 <5198> <5198> 10555 <5199> <5199> 3967 <519a> <519a> 10556 <519b> <519b> 2347 <519c> <519c> 2922 <519d> <519f> 10557 <51a0> <51a0> 1843 <51a1> <51a1> 10560 <51a2> <51a2> 4885 <51a3> <51a3> 10561 <51a4> <51a4> 4332 <51a5> <51a5> 4886 <51a6> <51aa> 10562 <51ab> <51ab> 4879 <51ac> <51ac> 1515 <51ad> <51ae> 10567 <51af> <51af> 1672 <51b0> <51b0> 1122 <51b1> <51b1> 4880 <51b2> <51b2> 1290 <51b3> <51b3> 2341 <51b4> <51b4> 10569 <51b5> <51b5> 2435 <51b6> <51b6> 4152 <51b7> <51b7> 2511 <51b8> <51ba> 10570 <51bb> <51bb> 1522 <51bc> <51bc> 4882 <51bd> <51bd> 4881 <51be> <51bf> 10573 <51c0> <51c0> 2282 endcidrange 100 begincidrange <51c1> <51c3> 10575 <51c4> <51c4> 3071 <51c5> <51c5> 10578 <51c6> <51c6> 4633 <51c7> <51c7> 4883 <51c8> <51c8> 10579 <51c9> <51c9> 2562 <51ca> <51ca> 10580 <51cb> <51cb> 1491 <51cc> <51cc> 2609 <51cd> <51cd> 7887 <51ce> <51ce> 10581 <51cf> <51cf> 2152 <51d0> <51d0> 10582 <51d1> <51d1> 1368 <51d2> <51da> 10583 <51db> <51db> 2598 <51dc> <51dc> 10592 <51dd> <51dd> 2912 <51de> <51df> 10593 <51e0> <51e0> 2091 <51e1> <51e1> 1615 <51e2> <51e3> 10595 <51e4> <51e4> 1676 <51e5> <51ea> 10597 <51eb> <51eb> 4864 <51ec> <51ec> 10603 <51ed> <51ed> 3037 <51ee> <51ee> 10604 <51ef> <51ef> 2362 <51f0> <51f0> 2016 <51f1> <51f1> 8153 <51f2> <51f2> 10605 <51f3> <51f3> 1451 <51f4> <51f4> 10606 <51f5> <51f5> 5017 <51f6> <51f6> 4002 <51f7> <51f7> 10607 <51f8> <51f8> 3690 <51f9> <51f9> 967 <51fa> <51fa> 1307 <51fb> <51fb> 2060 <51fc> <51fc> 5018 <51fd> <51fd> 1894 <51fe> <51fe> 10608 <51ff> <51ff> 4391 <5200> <5200> 1431 <5201> <5201> 1492 <5202> <5202> 4748 <5203> <5203> 3243 <5204> <5205> 10609 <5206> <5206> 1651 <5207> <5207> 3149 <5208> <5208> 4749 <5209> <5209> 10611 <520a> <520a> 2364 <520b> <520c> 10612 <520d> <520d> 5003 <520e> <520e> 4750 <520f> <5210> 10614 <5211> <5211> 3991 <5212> <5212> 1987 <5213> <5215> 10616 <5216> <5216> 6510 <5217> <5217> 2585 <5218> <5218> 2622 <5219> <5219> 4405 <521a> <521a> 1744 <521b> <521b> 1335 <521c> <521c> 10619 <521d> <521d> 1306 <521e> <521f> 10620 <5220> <5220> 3319 <5221> <5223> 10622 <5224> <5224> 2961 <5225> <5227> 10625 <5228> <5228> 2970 <5229> <5229> 2534 <522a> <522a> 10628 <522b> <522b> 1113 <522c> <522c> 10629 <522d> <522d> 4751 <522e> <522e> 1831 <522f> <522f> 10630 <5230> <5230> 1438 <5231> <5232> 10631 <5233> <5233> 4752 <5234> <5235> 10633 <5236> <5236> 4549 <5237> <5237> 3479 <5238> <5238> 3210 <5239> <5239> 3307 <523a> <523a> 1359 <523b> <523b> 2393 <523c> <523c> 10635 <523d> <523d> 1869 <523e> <523e> 10636 <523f> <5240> 4753 <5241> <5241> 1574 <5242> <5242> 2100 endcidrange 100 begincidrange <5243> <5243> 3645 <5244> <5244> 8904 <5245> <5246> 10637 <5247> <5247> 8803 <5248> <5249> 10639 <524a> <524a> 3940 <524b> <524b> 9859 <524c> <524c> 4755 <524d> <524d> 3117 <524e> <524f> 10641 <5250> <5250> 1833 <5251> <5251> 2164 <5252> <5253> 10643 <5254> <5254> 3633 <5255> <5255> 10645 <5256> <5256> 3049 <5257> <525a> 10646 <525b> <525b> 7959 <525c> <525c> 4758 <525d> <525d> 10650 <525e> <525e> 4756 <525f> <5260> 10651 <5261> <5261> 4757 <5262> <5264> 10653 <5265> <5265> 1033 <5266> <5266> 10656 <5267> <5267> 2326 <5268> <5268> 10657 <5269> <5269> 3386 <526a> <526a> 2151 <526b> <526d> 10658 <526e> <526e> 7979 <526f> <526f> 1708 <5270> <5271> 10661 <5272> <5272> 1769 <5273> <5273> 10663 <5274> <5274> 8906 <5275> <5275> 7833 <5276> <527c> 10664 <527d> <527d> 4760 <527e> <527e> 10671 <527f> <527f> 2204 <5280> <5280> 10672 <5281> <5281> 4762 <5282> <5282> 4761 <5283> <5283> 8015 <5284> <5286> 10673 <5287> <5287> 8143 <5288> <5288> 3005 <5289> <5289> 8246 <528a> <528a> 7994 <528b> <528b> 10676 <528c> <528c> 8905 <528d> <528d> 8089 <528e> <528f> 10677 <5290> <5290> 4763 <5291> <5291> 8053 <5292> <5292> 10679 <5293> <5293> 4764 <5294> <529a> 10680 <529b> <529b> 2543 <529c> <529c> 10687 <529d> <529d> 3211 <529e> <529e> 1015 <529f> <529f> 1791 <52a0> <52a0> 2118 <52a1> <52a1> 3840 <52a2> <52a2> 5005 <52a3> <52a3> 2588 <52a4> <52a7> 10688 <52a8> <52a8> 1518 <52a9> <52a9> 4601 <52aa> <52aa> 2925 <52ab> <52ab> 2218 <52ac> <52ad> 5006 <52ae> <52b0> 10692 <52b1> <52b1> 2531 <52b2> <52b2> 2257 <52b3> <52b3> 2488 <52b4> <52bd> 10695 <52be> <52be> 5008 <52bf> <52bf> 3421 <52c0> <52c0> 10705 <52c1> <52c1> 8126 <52c2> <52c2> 10706 <52c3> <52c3> 1137 <52c4> <52c6> 10707 <52c7> <52c7> 4263 <52c8> <52c8> 10710 <52c9> <52c9> 2792 <52ca> <52ca> 10711 <52cb> <52cb> 4052 <52cc> <52cf> 10712 <52d0> <52d0> 5010 <52d1> <52d1> 10716 <52d2> <52d2> 2496 <52d3> <52d4> 10717 <52d5> <52d5> 7885 <52d6> <52d6> 5011 <52d7> <52d7> 10719 endcidrange 100 begincidrange <52d8> <52d8> 2366 <52d9> <52d9> 8617 <52da> <52da> 10720 <52db> <52db> 8678 <52dc> <52dc> 10721 <52dd> <52dd> 8487 <52de> <52de> 8195 <52df> <52df> 2847 <52e0> <52e1> 10722 <52e2> <52e2> 8498 <52e3> <52e3> 10724 <52e4> <52e4> 3159 <52e5> <52ef> 10725 <52f0> <52f0> 5012 <52f1> <52f1> 8995 <52f2> <52f4> 10736 <52f5> <52f5> 8209 <52f6> <52f7> 10739 <52f8> <52f8> 8437 <52f9> <52f9> 4860 <52fa> <52fa> 3344 <52fb> <52fd> 10741 <52fe> <52fe> 1805 <52ff> <52ff> 3839 <5300> <5300> 4363 <5301> <5304> 10744 <5305> <5305> 1031 <5306> <5306> 1365 <5307> <5307> 10748 <5308> <5308> 4004 <5309> <530c> 10749 <530d> <530d> 4861 <530e> <530e> 10753 <530f> <530f> 5301 <5310> <5310> 4863 <5311> <5314> 10754 <5315> <5315> 4710 <5316> <5316> 1988 <5317> <5317> 1050 <5318> <5318> 10758 <5319> <5319> 1276 <531a> <531a> 4740 <531b> <531c> 10759 <531d> <531d> 4372 <531e> <531f> 10761 <5320> <5320> 2180 <5321> <5321> 2428 <5322> <5322> 10763 <5323> <5323> 3880 <5324> <5325> 10764 <5326> <5326> 4742 <5327> <5329> 10766 <532a> <532a> 1640 <532b> <532c> 10769 <532d> <532d> 8901 <532e> <532e> 4743 <532f> <532f> 8030 <5330> <5330> 10771 <5331> <5331> 8902 <5332> <5338> 10772 <5339> <5339> 3012 <533a> <533a> 3189 <533b> <533b> 4164 <533c> <533d> 10779 <533e> <533e> 4744 <533f> <533f> 2887 <5340> <5340> 8431 <5341> <5341> 3397 <5342> <5342> 10781 <5343> <5343> 3108 <5344> <5344> 10782 <5345> <5345> 4700 <5346> <5346> 10783 <5347> <5347> 3382 <5348> <5348> 3830 <5349> <5349> 2033 <534a> <534a> 1014 <534b> <534d> 10784 <534e> <534e> 1983 <534f> <534f> 3960 <5350> <5350> 10787 <5351> <5351> 1049 <5352> <5352> 4673 <5353> <5353> 4636 <5354> <5354> 8656 <5355> <5355> 1414 <5356> <5356> 2715 <5357> <5357> 2866 <5358> <5359> 10788 <535a> <535a> 1136 <535b> <535b> 10790 <535c> <535c> 1150 <535d> <535d> 10791 <535e> <535e> 1102 <535f> <535f> 5370 <5360> <5360> 4445 <5361> <5361> 2357 <5362> <5362> 2643 <5363> <5363> 4747 <5364> <5364> 2648 endcidrange 100 begincidrange <5365> <5365> 10792 <5366> <5366> 4746 <5367> <5367> 3811 <5368> <5368> 10793 <5369> <5369> 4946 <536a> <536a> 10794 <536b> <536b> 3791 <536c> <536d> 10795 <536e> <536e> 4714 <536f> <536f> 2739 <5370> <5370> 4230 <5371> <5371> 3762 <5372> <5372> 10797 <5373> <5373> 2087 <5374> <5374> 3215 <5375> <5375> 2680 <5376> <5376> 10798 <5377> <5377> 2332 <5378> <5378> 3969 <5379> <5379> 10799 <537a> <537a> 4947 <537b> <537e> 10800 <537f> <537f> 3169 <5380> <5381> 10804 <5382> <5382> 1228 <5383> <5383> 10806 <5384> <5384> 1585 <5385> <5385> 3663 <5386> <5386> 2533 <5387> <5388> 10807 <5389> <5389> 2530 <538a> <538a> 10809 <538b> <538b> 4066 <538c> <538c> 4106 <538d> <538d> 4733 <538e> <5394> 10810 <5395> <5395> 1189 <5396> <5397> 10817 <5398> <5398> 2512 <5399> <5399> 8897 <539a> <539a> 1960 <539b> <539c> 10819 <539d> <539d> 4734 <539e> <539e> 10821 <539f> <539f> 4336 <53a0> <53a0> 7780 <53a1> <53a1> 10822 <53a2> <53a2> 3918 <53a3> <53a3> 4735 <53a4> <53a4> 10823 <53a5> <53a5> 4736 <53a6> <53a6> 3888 <53a7> <53a7> 10824 <53a8> <53a8> 1309 <53a9> <53a9> 2294 <53aa> <53ac> 10825 <53ad> <53ad> 8697 <53ae> <53ae> 4737 <53af> <53b1> 10828 <53b2> <53b2> 8208 <53b3> <53b3> 10831 <53b4> <53b4> 8898 <53b5> <53b5> 10832 <53b6> <53b6> 5020 <53b7> <53ba> 10833 <53bb> <53bb> 3200 <53bc> <53be> 10837 <53bf> <53bf> 3909 <53c0> <53c0> 10840 <53c1> <53c1> 3289 <53c2> <53c2> 1173 <53c3> <53c3> 7770 <53c4> <53c7> 10841 <53c8> <53c8> 4283 <53c9> <53c9> 1197 <53ca> <53ca> 2083 <53cb> <53cb> 4278 <53cc> <53cc> 3488 <53cd> <53cd> 1617 <53ce> <53d0> 10845 <53d1> <53d1> 1599 <53d2> <53d3> 10848 <53d4> <53d4> 3452 <53d5> <53d5> 10850 <53d6> <53d6> 3196 <53d7> <53d7> 3443 <53d8> <53d8> 1101 <53d9> <53d9> 4027 <53da> <53da> 10851 <53db> <53db> 2962 <53dc> <53de> 10852 <53df> <53df> 5013 <53e0> <53e0> 1503 <53e1> <53e1> 10855 <53e2> <53e2> 7842 <53e3> <53e3> 2407 <53e4> <53e4> 1822 <53e5> <53e5> 2323 <53e6> <53e6> 2614 <53e7> <53e7> 10856 endcidrange 100 begincidrange <53e8> <53e8> 5374 <53e9> <53e9> 5373 <53ea> <53ea> 4538 <53eb> <53eb> 2209 <53ec> <53ec> 4474 <53ed> <53ed> 979 <53ee> <53ee> 1506 <53ef> <53ef> 2390 <53f0> <53f0> 3579 <53f1> <53f1> 5371 <53f2> <53f2> 3406 <53f3> <53f3> 4279 <53f4> <53f4> 10857 <53f5> <53f5> 4741 <53f6> <53f6> 4157 <53f7> <53f7> 1916 <53f8> <53f8> 3507 <53f9> <53f9> 3601 <53fa> <53fa> 10858 <53fb> <53fb> 5375 <53fc> <53fc> 1489 <53fd> <53fd> 5372 <53fe> <53ff> 10859 <5400> <5400> 10861 <5401> <5401> 4314 <5402> <5402> 10862 <5403> <5403> 1273 <5404> <5404> 1778 <5405> <5405> 10863 <5406> <5406> 5378 <5407> <5407> 10864 <5408> <5408> 1926 <5409> <5409> 2077 <540a> <540a> 1494 <540b> <540b> 10865 <540c> <540c> 3677 <540d> <540d> 2816 <540e> <540e> 1962 <540f> <540f> 2527 <5410> <5410> 3699 <5411> <5411> 3935 <5412> <5412> 5376 <5413> <5413> 3890 <5414> <5414> 10866 <5415> <5415> 2663 <5416> <5416> 5377 <5417> <5417> 2711 <5418> <541a> 10867 <541b> <541b> 2348 <541c> <541c> 10870 <541d> <541d> 2600 <541e> <541e> 3709 <541f> <541f> 4222 <5420> <5420> 1642 <5421> <5421> 5385 <5422> <5422> 10871 <5423> <5423> 5388 <5424> <5425> 10872 <5426> <5426> 1678 <5427> <5427> 980 <5428> <5428> 1557 <5429> <5429> 1649 <542a> <542a> 10874 <542b> <542b> 1891 <542c> <542c> 3664 <542d> <542d> 2401 <542e> <542e> 3494 <542f> <542f> 3091 <5430> <5430> 10875 <5431> <5431> 4519 <5432> <5432> 5389 <5433> <5433> 10876 <5434> <5434> 3825 <5435> <5435> 1240 <5436> <5437> 10877 <5438> <5438> 3851 <5439> <5439> 1336 <543a> <543a> 10879 <543b> <543b> 3798 <543c> <543c> 1959 <543d> <543d> 10880 <543e> <543e> 3824 <543f> <543f> 10881 <5440> <5440> 4070 <5441> <5442> 10882 <5443> <5443> 5384 <5444> <5445> 10884 <5446> <5446> 1399 <5447> <5447> 10886 <5448> <5448> 1263 <5449> <5449> 10887 <544a> <544a> 1761 <544b> <544b> 5379 <544c> <544f> 10888 <5450> <5450> 2856 <5451> <5451> 10892 <5452> <5454> 5380 <5455> <5455> 2940 <5456> <5456> 5383 <5457> <5457> 5386 endcidrange 100 begincidrange <5458> <5458> 4340 <5459> <5459> 5387 <545a> <545a> 10893 <545b> <545b> 3127 <545c> <545c> 3815 <545d> <5461> 10894 <5462> <5462> 2875 <5463> <5463> 10899 <5464> <5464> 5394 <5465> <5465> 10900 <5466> <5466> 5399 <5467> <5467> 10901 <5468> <5468> 4571 <5469> <5470> 10902 <5471> <5471> 5393 <5472> <5472> 5410 <5473> <5473> 3781 <5474> <5474> 10910 <5475> <5475> 1918 <5476> <5476> 5398 <5477> <5477> 5392 <5478> <5478> 2975 <5479> <547a> 10911 <547b> <547b> 3364 <547c> <547c> 1963 <547d> <547d> 2817 <547e> <547f> 10913 <5480> <5480> 2310 <5481> <5481> 10915 <5482> <5482> 5390 <5483> <5483> 10916 <5484> <5484> 5397 <5485> <5485> 10917 <5486> <5486> 2969 <5487> <548a> 10918 <548b> <548b> 4423 <548c> <548c> 1924 <548d> <548d> 10922 <548e> <548e> 2299 <548f> <548f> 4258 <5490> <5490> 1723 <5491> <5491> 10923 <5492> <5492> 4579 <5493> <5493> 10924 <5494> <5494> 5391 <5495> <5495> 1815 <5496> <5496> 2356 <5497> <5498> 10925 <5499> <5499> 2629 <549a> <549b> 5395 <549c> <549c> 10927 <549d> <549d> 5400 <549e> <54a2> 10928 <54a3> <54a3> 5411 <54a4> <54a4> 5421 <54a5> <54a5> 10933 <54a6> <54a6> 5407 <54a7> <54a7> 5406 <54a8> <54a8> 4646 <54a9> <54aa> 5419 <54ab> <54ab> 5991 <54ac> <54ac> 4142 <54ad> <54ad> 5402 <54ae> <54ae> 10934 <54af> <54af> 2358 <54b0> <54b0> 10935 <54b1> <54b1> 4382 <54b2> <54b2> 10936 <54b3> <54b3> 2389 <54b4> <54b4> 5404 <54b5> <54b7> 10937 <54b8> <54b8> 3897 <54b9> <54ba> 10940 <54bb> <54bb> 5413 <54bc> <54bc> 9069 <54bd> <54bd> 4083 <54be> <54be> 10942 <54bf> <54bf> 5414 <54c0> <54c0> 946 <54c1> <54c1> 3030 <54c2> <54c2> 5403 <54c3> <54c3> 10943 <54c4> <54c4> 1948 <54c5> <54c5> 10944 <54c6> <54c6> 1566 <54c7> <54c7> 3724 <54c8> <54c8> 1879 <54c9> <54c9> 4376 <54ca> <54cb> 10945 <54cc> <54cc> 5415 <54cd> <54cd> 3929 <54ce> <54ce> 944 <54cf> <54cf> 5423 <54d0> <54d0> 5401 <54d1> <54d1> 4079 <54d2> <54d2> 5405 <54d3> <54d4> 5408 <54d5> <54d5> 5412 <54d6> <54d6> 10947 <54d7> <54d7> 1982 endcidrange 100 begincidrange <54d8> <54d8> 10948 <54d9> <54da> 5416 <54db> <54db> 10949 <54dc> <54dc> 5418 <54dd> <54dd> 5422 <54de> <54de> 5424 <54df> <54df> 4249 <54e0> <54e0> 10950 <54e1> <54e1> 8775 <54e2> <54e4> 10951 <54e5> <54e5> 1762 <54e6> <54e6> 2935 <54e7> <54e7> 5426 <54e8> <54e8> 3347 <54e9> <54e9> 2545 <54ea> <54ea> 2855 <54eb> <54ec> 10954 <54ed> <54ed> 2411 <54ee> <54ee> 3941 <54ef> <54f1> 10956 <54f2> <54f2> 4477 <54f3> <54f3> 5430 <54f4> <54f9> 10959 <54fa> <54fa> 1151 <54fb> <54fb> 10965 <54fc> <54fc> 1942 <54fd> <54fd> 5428 <54fe> <54fe> 10966 <54ff> <54ff> 5009 <5500> <5500> 10967 <5501> <5501> 4109 <5502> <5503> 10968 <5504> <5504> 9068 <5505> <5505> 10970 <5506> <5506> 3561 <5507> <5507> 1344 <5508> <5508> 10971 <5509> <5509> 945 <550a> <550e> 10972 <550f> <550f> 5433 <5510> <5510> 3609 <5511> <5511> 5434 <5512> <5513> 10977 <5514> <5514> 5429 <5515> <551a> 10979 <551b> <551b> 5425 <551c> <551f> 10985 <5520> <5520> 5427 <5521> <5521> 10989 <5522> <5523> 5431 <5524> <5524> 2002 <5525> <5526> 10990 <5527> <5527> 5435 <5528> <5529> 10992 <552a> <552a> 5436 <552b> <552b> 10994 <552c> <552c> 1976 <552d> <552d> 10995 <552e> <552e> 3442 <552f> <552f> 3767 <5530> <5530> 5453 <5531> <5531> 1231 <5532> <5532> 10996 <5533> <5533> 5452 <5534> <5536> 10997 <5537> <5537> 5447 <5538> <553b> 11000 <553c> <553c> 5446 <553d> <553d> 11004 <553e> <553e> 3722 <553f> <553f> 5444 <5540> <5540> 11005 <5541> <5541> 5442 <5542> <5542> 11006 <5543> <5543> 2397 <5544> <5544> 4641 <5545> <5545> 11007 <5546> <5546> 3333 <5547> <5548> 11008 <5549> <5549> 5440 <554a> <554a> 940 <554b> <554e> 11010 <554f> <554f> 8604 <5550> <5550> 5445 <5551> <5552> 11014 <5553> <5553> 8393 <5554> <5554> 11016 <5555> <5555> 5443 <5556> <5556> 5448 <5557> <555b> 11017 <555c> <555c> 5454 <555d> <555d> 11022 <555e> <555e> 8688 <555f> <5560> 11023 <5561> <5561> 1637 <5562> <5563> 11025 <5564> <5564> 3008 <5565> <5565> 3311 <5566> <5566> 2461 <5567> <5567> 5437 endcidrange 100 begincidrange <5568> <5569> 11027 <556a> <556a> 2943 <556b> <556b> 11029 <556c> <556c> 4730 <556d> <556d> 5441 <556e> <556e> 2905 <556f> <5574> 11030 <5575> <5577> 5449 <5578> <5578> 3952 <5579> <557a> 11036 <557b> <557b> 5466 <557c> <557c> 3639 <557d> <557d> 11038 <557e> <557e> 5463 <557f> <557f> 11039 <5580> <5580> 2355 <5581> <5581> 5461 <5582> <5582> 3784 <5583> <5583> 5457 <5584> <5584> 3327 <5585> <5586> 11040 <5587> <5587> 2457 <5588> <5588> 5460 <5589> <5589> 1956 <558a> <558a> 1895 <558b> <558b> 5455 <558c> <558e> 11042 <558f> <558f> 5438 <5590> <5590> 11045 <5591> <5591> 5465 <5592> <5593> 11046 <5594> <5594> 5470 <5595> <5597> 11048 <5598> <5598> 1328 <5599> <5599> 5471 <559a> <559b> 11051 <559c> <559c> 3871 <559d> <559d> 1919 <559e> <559e> 11053 <559f> <559f> 5462 <55a0> <55a6> 11054 <55a7> <55a7> 4037 <55a8> <55a9> 11061 <55aa> <55aa> 8459 <55ab> <55ab> 11063 <55ac> <55ac> 8414 <55ad> <55ad> 11064 <55ae> <55ae> 7850 <55af> <55b0> 11065 <55b1> <55b1> 5458 <55b2> <55b2> 8748 <55b3> <55b3> 4414 <55b4> <55b4> 11067 <55b5> <55b5> 5439 <55b6> <55b6> 11068 <55b7> <55b7> 2984 <55b8> <55b8> 11069 <55b9> <55b9> 5459 <55ba> <55ba> 11070 <55bb> <55bb> 4316 <55bc> <55bc> 11071 <55bd> <55be> 5468 <55bf> <55c3> 11072 <55c4> <55c4> 5482 <55c5> <55c5> 4012 <55c6> <55c6> 8408 <55c7> <55c7> 8896 <55c8> <55c8> 11077 <55c9> <55c9> 5474 <55ca> <55cb> 11078 <55cc> <55cd> 5487 <55ce> <55ce> 8303 <55cf> <55d0> 11080 <55d1> <55d1> 5476 <55d2> <55d2> 5456 <55d3> <55d3> 3293 <55d4> <55d4> 5479 <55d5> <55d5> 11082 <55d6> <55d6> 5464 <55d7> <55d9> 11083 <55da> <55da> 8609 <55db> <55db> 11086 <55dc> <55dc> 3423 <55dd> <55dd> 5481 <55de> <55de> 11087 <55df> <55df> 5467 <55e0> <55e0> 11088 <55e1> <55e1> 3802 <55e2> <55e2> 11089 <55e3> <55e3> 3512 <55e4> <55e4> 5491 <55e5> <55e5> 5484 <55e6> <55e6> 5480 <55e7> <55e7> 11090 <55e8> <55e8> 5489 <55e9> <55e9> 9081 <55ea> <55ea> 5472 <55eb> <55ec> 5477 <55ed> <55ee> 11091 <55ef> <55ef> 5483 endcidrange 100 begincidrange <55f0> <55f1> 11093 <55f2> <55f3> 5485 <55f4> <55f4> 11095 <55f5> <55f5> 5490 <55f6> <55f6> 9074 <55f7> <55f7> 5473 <55f8> <55fc> 11096 <55fd> <55fd> 3529 <55fe> <55fe> 5499 <55ff> <55ff> 11101 <5600> <5600> 5500 <5601> <5601> 5496 <5602> <5605> 11102 <5606> <5606> 8554 <5607> <5607> 11106 <5608> <5608> 5494 <5609> <5609> 2113 <560a> <560b> 11107 <560c> <560c> 5495 <560d> <560d> 9084 <560e> <560e> 1725 <560f> <560f> 4731 <5610> <5613> 11109 <5614> <5614> 8368 <5615> <5615> 11113 <5616> <5616> 9082 <5617> <5617> 7796 <5618> <5618> 4021 <5619> <561a> 11114 <561b> <561b> 2710 <561c> <561c> 9079 <561d> <561d> 11116 <561e> <561e> 5493 <561f> <561f> 5475 <5620> <5622> 11117 <5623> <5623> 5498 <5624> <5624> 5497 <5625> <5626> 11120 <5627> <5627> 5501 <5628> <5628> 11122 <5629> <5629> 8012 <562a> <562b> 11123 <562c> <562c> 5506 <562d> <562d> 5502 <562e> <562e> 9080 <562f> <562f> 8655 <5630> <5630> 9064 <5631> <5631> 4597 <5632> <5632> 1237 <5633> <5633> 11125 <5634> <5634> 4681 <5635> <5635> 9073 <5636> <5636> 3504 <5637> <5637> 11126 <5638> <5638> 9065 <5639> <5639> 5504 <563a> <563a> 11127 <563b> <563b> 3850 <563c> <563e> 11128 <563f> <563f> 1936 <5640> <5640> 11131 <5641> <5641> 9844 <5642> <564b> 11132 <564c> <564c> 5511 <564d> <564d> 5507 <564e> <564e> 4148 <564f> <5653> 11142 <5654> <5654> 5512 <5655> <5656> 11147 <5657> <5657> 5505 <5658> <5658> 5503 <5659> <5659> 5509 <565a> <565b> 11149 <565c> <565c> 5510 <565d> <565d> 9071 <565e> <565f> 11151 <5660> <5660> 9072 <5661> <5661> 11153 <5662> <5662> 5508 <5663> <5663> 11154 <5664> <5664> 5514 <5665> <5665> 9078 <5666> <5666> 9075 <5667> <5667> 11155 <5668> <5668> 3094 <5669> <5669> 4706 <566a> <566a> 4398 <566b> <566b> 5516 <566c> <566c> 3424 <566d> <566e> 11156 <566f> <566f> 9087 <5670> <5670> 11158 <5671> <5671> 5515 <5672> <5672> 9076 <5673> <5673> 11159 <5674> <5674> 8373 <5675> <5675> 11160 <5676> <5676> 1724 <5677> <5677> 11161 <5678> <5678> 7899 endcidrange 100 begincidrange <5679> <5679> 9842 <567a> <567a> 11162 <567b> <567c> 5517 <567d> <567f> 11163 <5680> <5680> 9070 <5681> <5684> 11166 <5685> <5685> 5519 <5686> <5686> 5513 <5687> <5687> 8631 <5688> <568b> 11170 <568c> <568c> 9077 <568d> <568d> 11174 <568e> <568e> 1910 <568f> <568f> 3642 <5690> <5692> 11175 <5693> <5693> 5520 <5694> <5694> 11178 <5695> <5695> 9090 <5696> <5698> 11179 <5699> <5699> 8350 <569a> <56a2> 11182 <56a3> <56a3> 3942 <56a4> <56a5> 11191 <56a6> <56a6> 9067 <56a7> <56a7> 11193 <56a8> <56a8> 8249 <56a9> <56ad> 11194 <56ae> <56ae> 9887 <56af> <56af> 5521 <56b0> <56b2> 11199 <56b3> <56b3> 9085 <56b4> <56b4> 8693 <56b5> <56b5> 11202 <56b6> <56b6> 9089 <56b7> <56b7> 3229 <56b8> <56bb> 11203 <56bc> <56bc> 2193 <56bd> <56bf> 11207 <56c0> <56c0> 9083 <56c1> <56c1> 9086 <56c2> <56c2> 8652 <56c3> <56c4> 11210 <56c5> <56c5> 8923 <56c6> <56c7> 11212 <56c8> <56c8> 9066 <56c9> <56c9> 9865 <56ca> <56ca> 2869 <56cb> <56cb> 11214 <56cc> <56cc> 9879 <56cd> <56d0> 11215 <56d1> <56d1> 8865 <56d2> <56d3> 11219 <56d4> <56d4> 5522 <56d5> <56d6> 11221 <56d7> <56d7> 5523 <56d8> <56d9> 11223 <56da> <56da> 3185 <56db> <56db> 3513 <56dc> <56dc> 11225 <56dd> <56dd> 5524 <56de> <56de> 2029 <56df> <56df> 4716 <56e0> <56e0> 4217 <56e1> <56e1> 5525 <56e2> <56e2> 3702 <56e3> <56e3> 11226 <56e4> <56e4> 1561 <56e5> <56ea> 11227 <56eb> <56eb> 5527 <56ec> <56ec> 11233 <56ed> <56ed> 4339 <56ee> <56ef> 11234 <56f0> <56f0> 2450 <56f1> <56f1> 1364 <56f2> <56f3> 11236 <56f4> <56f4> 3766 <56f5> <56f5> 5526 <56f6> <56f8> 11238 <56f9> <56f9> 5528 <56fa> <56fa> 1829 <56fb> <56fc> 11241 <56fd> <56fd> 1875 <56fe> <56fe> 3693 <56ff> <56ff> 5529 <5700> <5702> 11243 <5703> <5703> 3059 <5704> <5704> 5530 <5705> <5705> 11246 <5706> <5706> 4341 <5707> <5707> 9091 <5708> <5708> 3201 <5709> <5709> 5532 <570a> <570a> 5531 <570b> <570b> 7997 <570c> <570c> 11247 <570d> <570d> 8591 <570e> <5711> 11248 <5712> <5712> 8774 <5713> <5713> 8776 <5714> <5715> 11252 endcidrange 100 begincidrange <5716> <5716> 8574 <5717> <5717> 11254 <5718> <5718> 8576 <5719> <571b> 11255 <571c> <571c> 5533 <571d> <571e> 11258 <571f> <571f> 3698 <5720> <5722> 11260 <5723> <5723> 3388 <5724> <5727> 11263 <5728> <5728> 4381 <5729> <5729> 5031 <572a> <572a> 5033 <572b> <572b> 11267 <572c> <572c> 5032 <572d> <572d> 1856 <572e> <572f> 5036 <5730> <5730> 1465 <5731> <5732> 11268 <5733> <5733> 5034 <5734> <5738> 11270 <5739> <5739> 5035 <573a> <573a> 1222 <573b> <573b> 5039 <573c> <573d> 11275 <573e> <573e> 2061 <573f> <573f> 11277 <5740> <5740> 4534 <5741> <5741> 11278 <5742> <5742> 5040 <5743> <5746> 11279 <5747> <5747> 2344 <5748> <5749> 11283 <574a> <574a> 1624 <574b> <574b> 11285 <574c> <574c> 5024 <574d> <574d> 3585 <574e> <574e> 2367 <574f> <574f> 1994 <5750> <5750> 4693 <5751> <5751> 2400 <5752> <5756> 11286 <5757> <5757> 2422 <5758> <5759> 11291 <575a> <575a> 2132 <575b> <575b> 3590 <575c> <575c> 5038 <575d> <575d> 990 <575e> <575e> 3834 <575f> <575f> 1653 <5760> <5760> 4630 <5761> <5761> 3041 <5762> <5763> 11293 <5764> <5764> 2447 <5765> <5765> 11295 <5766> <5766> 3596 <5767> <5767> 11296 <5768> <5768> 5047 <5769> <5769> 5041 <576a> <576a> 3033 <576b> <576b> 5043 <576c> <576c> 11297 <576d> <576d> 5048 <576e> <576e> 11298 <576f> <576f> 3000 <5770> <5772> 11299 <5773> <5773> 5050 <5774> <5775> 11302 <5776> <5776> 5049 <5777> <5777> 2381 <5778> <577a> 11304 <577b> <577b> 5046 <577c> <577c> 5045 <577d> <5781> 11307 <5782> <5782> 1340 <5783> <5783> 2455 <5784> <5784> 2633 <5785> <5785> 5042 <5786> <5786> 5044 <5787> <578a> 11312 <578b> <578b> 3992 <578c> <578c> 5053 <578d> <5791> 11316 <5792> <5792> 2504 <5793> <5793> 5058 <5794> <579a> 11321 <579b> <579b> 1569 <579c> <579f> 11328 <57a0> <57a0> 5059 <57a1> <57a1> 5026 <57a2> <57a2> 1809 <57a3> <57a3> 4334 <57a4> <57a4> 5052 <57a5> <57a5> 11332 <57a6> <57a6> 2398 <57a7> <57a7> 5056 <57a8> <57a8> 11333 <57a9> <57a9> 5025 <57aa> <57aa> 11334 <57ab> <57ab> 1479 endcidrange 100 begincidrange <57ac> <57ac> 11335 <57ad> <57ad> 5051 <57ae> <57ae> 2418 <57af> <57b1> 11336 <57b2> <57b2> 5054 <57b3> <57b3> 11339 <57b4> <57b4> 5057 <57b5> <57b7> 11340 <57b8> <57b8> 5065 <57b9> <57c1> 11343 <57c2> <57c2> 1786 <57c3> <57c3> 942 <57c4> <57ca> 11352 <57cb> <57cb> 2712 <57cc> <57cd> 11359 <57ce> <57ce> 1260 <57cf> <57cf> 5055 <57d0> <57d1> 11361 <57d2> <57d2> 5064 <57d3> <57d3> 11363 <57d4> <57d4> 3057 <57d5> <57d5> 5060 <57d6> <57d7> 11364 <57d8> <57d8> 5061 <57d9> <57d9> 5063 <57da> <57da> 5062 <57db> <57dc> 11366 <57dd> <57dd> 5070 <57de> <57de> 11368 <57df> <57df> 4311 <57e0> <57e0> 1153 <57e1> <57e1> 9002 <57e2> <57e3> 11369 <57e4> <57e4> 5069 <57e5> <57ec> 11371 <57ed> <57ed> 5074 <57ee> <57ee> 11379 <57ef> <57ef> 5067 <57f0> <57f3> 11380 <57f4> <57f4> 5066 <57f5> <57f6> 11384 <57f7> <57f7> 8843 <57f8> <57f8> 5068 <57f9> <57f9> 2977 <57fa> <57fa> 2062 <57fb> <57fc> 11386 <57fd> <57fd> 5073 <57fe> <57ff> 11388 <5800> <5800> 5075 <5801> <5801> 11390 <5802> <5802> 3606 <5803> <5804> 11391 <5805> <5805> 8069 <5806> <5806> 1552 <5807> <5807> 5196 <5808> <5809> 11393 <580a> <580a> 8997 <580b> <580b> 5071 <580c> <580c> 11395 <580d> <580d> 5072 <580e> <5810> 11396 <5811> <5811> 3122 <5812> <5814> 11399 <5815> <5815> 1576 <5816> <5816> 9004 <5817> <5818> 11402 <5819> <5819> 5077 <581a> <581c> 11404 <581d> <581d> 9006 <581e> <581e> 5076 <581f> <581f> 11407 <5820> <5820> 5079 <5821> <5821> 1037 <5822> <5823> 11408 <5824> <5824> 1453 <5825> <5829> 11410 <582a> <582a> 2365 <582b> <582e> 11415 <582f> <582f> 8709 <5830> <5830> 4104 <5831> <5831> 7736 <5832> <5833> 11419 <5834> <5834> 7795 <5835> <5835> 1537 <5836> <5843> 11421 <5844> <5844> 5078 <5845> <5849> 11435 <584a> <584a> 8163 <584b> <584b> 9017 <584c> <584c> 3567 <584d> <584d> 6563 <584e> <584e> 11440 <584f> <584f> 9003 <5850> <5850> 11441 <5851> <5851> 3537 <5852> <5852> 9005 <5853> <5853> 11442 <5854> <5854> 3571 <5855> <5856> 11443 <5857> <5857> 8575 endcidrange 100 begincidrange <5858> <5858> 3604 <5859> <585d> 11445 <585e> <585e> 3286 <585f> <5861> 11450 <5862> <5862> 8615 <5863> <5863> 11453 <5864> <5864> 9007 <5865> <5865> 5080 <5866> <586a> 11454 <586b> <586b> 3649 <586c> <586c> 5081 <586d> <5874> 11459 <5875> <5875> 7805 <5876> <5878> 11467 <5879> <5879> 8406 <587a> <587d> 11470 <587e> <587e> 5027 <587f> <587f> 11474 <5880> <5880> 5085 <5881> <5881> 5082 <5882> <5882> 11475 <5883> <5883> 2274 <5884> <5884> 11476 <5885> <5885> 3474 <5886> <5888> 11477 <5889> <5889> 5083 <588a> <588a> 7874 <588b> <5891> 11480 <5892> <5892> 3331 <5893> <5893> 2844 <5894> <5898> 11487 <5899> <5899> 3130 <589a> <589a> 5084 <589b> <589b> 11492 <589c> <589c> 8882 <589d> <589d> 11493 <589e> <589e> 4409 <589f> <589f> 4017 <58a0> <58a7> 11494 <58a8> <58a8> 2830 <58a9> <58a9> 1556 <58aa> <58ad> 11502 <58ae> <58ae> 7903 <58af> <58b2> 11506 <58b3> <58b3> 7929 <58b4> <58ba> 11510 <58bb> <58bb> 8409 <58bc> <58bc> 5028 <58bd> <58bd> 11517 <58be> <58be> 8157 <58bf> <58c0> 11518 <58c1> <58c1> 1091 <58c2> <58c4> 11520 <58c5> <58c5> 5029 <58c6> <58c6> 11523 <58c7> <58c7> 8551 <58c8> <58d0> 11524 <58d1> <58d1> 5030 <58d2> <58d2> 11533 <58d3> <58d3> 8685 <58d4> <58d4> 11534 <58d5> <58d5> 1909 <58d6> <58d7> 11535 <58d8> <58d8> 8199 <58d9> <58d9> 8998 <58da> <58da> 9001 <58db> <58dd> 11537 <58de> <58de> 8018 <58df> <58df> 8251 <58e0> <58e0> 9000 <58e1> <58e1> 11540 <58e2> <58e2> 8999 <58e3> <58e3> 11541 <58e4> <58e4> 3227 <58e5> <58e8> 11542 <58e9> <58e9> 7723 <58ea> <58ea> 11546 <58eb> <58eb> 3414 <58ec> <58ec> 3236 <58ed> <58ed> 11547 <58ee> <58ee> 4624 <58ef> <58ef> 8878 <58f0> <58f0> 3378 <58f1> <58f2> 11548 <58f3> <58f3> 2388 <58f4> <58f5> 11550 <58f6> <58f6> 1967 <58f7> <58f8> 11552 <58f9> <58f9> 4163 <58fa> <58fa> 8009 <58fb> <58fc> 11554 <58fd> <58fd> 8504 <58fe> <58ff> 11556 <5900> <5901> 11558 <5902> <5902> 5660 <5903> <5903> 11560 <5904> <5904> 1321 <5905> <5906> 11561 <5907> <5907> 1057 <5908> <590c> 11563 endcidrange 100 begincidrange <590d> <590d> 1711 <590e> <590e> 11568 <590f> <590f> 3889 <5910> <5913> 11569 <5914> <5914> 4859 <5915> <5915> 3859 <5916> <5916> 3731 <5917> <5918> 11573 <5919> <5919> 4865 <591a> <591a> 1567 <591b> <591b> 11575 <591c> <591c> 4160 <591d> <591e> 11576 <591f> <591f> 1812 <5920> <5921> 11578 <5922> <5922> 8321 <5923> <5923> 11580 <5924> <5924> 5659 <5925> <5925> 5657 <5926> <5926> 11581 <5927> <5927> 1398 <5928> <5928> 11582 <5929> <5929> 3647 <592a> <592a> 3582 <592b> <592b> 1679 <592c> <592c> 11583 <592d> <592d> 4712 <592e> <592e> 4116 <592f> <592f> 1906 <5930> <5930> 11584 <5931> <5931> 3390 <5932> <5933> 11585 <5934> <5934> 3688 <5935> <5936> 11587 <5937> <5937> 4171 <5938> <5938> 2417 <5939> <5939> 2115 <593a> <593a> 1568 <593b> <593b> 11589 <593c> <593c> 5295 <593d> <593d> 11590 <593e> <593e> 8060 <593f> <5940> 11591 <5941> <5941> 5296 <5942> <5942> 5004 <5943> <5943> 11593 <5944> <5944> 4098 <5945> <5946> 11594 <5947> <5947> 3077 <5948> <5948> 2865 <5949> <5949> 1675 <594a> <594a> 11596 <594b> <594b> 1657 <594c> <594d> 11597 <594e> <594e> 2441 <594f> <594f> 4669 <5950> <5950> 11599 <5951> <5951> 3092 <5952> <5953> 11600 <5954> <5954> 1061 <5955> <5955> 5298 <5956> <5956> 2178 <5957> <5957> 3626 <5958> <5958> 5300 <5959> <5959> 11602 <595a> <595a> 5299 <595b> <595f> 11603 <5960> <5960> 1485 <5961> <5961> 11608 <5962> <5962> 3350 <5963> <5964> 11609 <5965> <5965> 973 <5966> <5968> 11611 <5969> <5969> 9051 <596a> <596a> 7902 <596b> <596b> 11614 <596c> <596c> 8098 <596d> <596d> 11615 <596e> <596e> 7930 <596f> <5972> 11616 <5973> <5973> 2927 <5974> <5974> 2924 <5975> <5975> 11620 <5976> <5976> 2863 <5977> <5977> 11621 <5978> <5978> 2140 <5979> <5979> 3570 <597a> <597c> 11622 <597d> <597d> 1914 <597e> <5980> 11625 <5981> <5981> 6005 <5982> <5982> 3266 <5983> <5983> 6006 <5984> <5984> 3758 <5985> <5985> 11628 <5986> <5986> 4622 <5987> <5987> 1721 <5988> <5988> 2703 <5989> <5989> 11629 <598a> <598a> 3244 endcidrange 100 begincidrange <598b> <598c> 11630 <598d> <598d> 6007 <598e> <5991> 11632 <5992> <5992> 1545 <5993> <5993> 2110 <5994> <5995> 11636 <5996> <5996> 4134 <5997> <5997> 6011 <5998> <5998> 11638 <5999> <5999> 2803 <599a> <599c> 11639 <599d> <599d> 8877 <599e> <599e> 6014 <599f> <59a2> 11642 <59a3> <59a3> 6010 <59a4> <59a4> 6015 <59a5> <59a5> 3720 <59a6> <59a7> 11646 <59a8> <59a8> 1630 <59a9> <59aa> 6008 <59ab> <59ab> 6013 <59ac> <59ad> 11648 <59ae> <59ae> 2880 <59af> <59af> 6018 <59b0> <59b1> 11650 <59b2> <59b2> 6017 <59b3> <59b8> 11652 <59b9> <59b9> 2760 <59ba> <59ba> 11658 <59bb> <59bb> 3069 <59bc> <59bd> 11659 <59be> <59be> 6020 <59bf> <59c5> 11661 <59c6> <59c6> 2842 <59c7> <59c9> 11668 <59ca> <59ca> 6012 <59cb> <59cb> 3411 <59cc> <59cf> 11671 <59d0> <59d0> 2228 <59d1> <59d1> 1820 <59d2> <59d2> 6016 <59d3> <59d3> 4000 <59d4> <59d4> 3774 <59d5> <59d6> 11675 <59d7> <59d7> 6019 <59d8> <59d8> 6026 <59d9> <59d9> 11677 <59da> <59da> 4141 <59db> <59db> 11678 <59dc> <59dc> 2171 <59dd> <59dd> 6023 <59de> <59e2> 11679 <59e3> <59e3> 6025 <59e4> <59e4> 11684 <59e5> <59e5> 2492 <59e6> <59e7> 11685 <59e8> <59e8> 4179 <59e9> <59eb> 11687 <59ec> <59ec> 2074 <59ed> <59f8> 11690 <59f9> <59f9> 6027 <59fa> <59fa> 11702 <59fb> <59fb> 4221 <59fc> <59fe> 11703 <59ff> <59ff> 4648 <5a00> <5a00> 11706 <5a01> <5a01> 3759 <5a02> <5a02> 11707 <5a03> <5a03> 3727 <5a04> <5a04> 2637 <5a05> <5a06> 6021 <5a07> <5a07> 2192 <5a08> <5a08> 6024 <5a09> <5a09> 6029 <5a0a> <5a0b> 11708 <5a0c> <5a0c> 6028 <5a0d> <5a10> 11710 <5a11> <5a11> 6032 <5a12> <5a12> 11714 <5a13> <5a13> 6034 <5a14> <5a17> 11715 <5a18> <5a18> 2898 <5a19> <5a1b> 11719 <5a1c> <5a1c> 2859 <5a1d> <5a1e> 11722 <5a1f> <5a1f> 2329 <5a20> <5a20> 3368 <5a21> <5a22> 11724 <5a23> <5a23> 6033 <5a24> <5a24> 11726 <5a25> <5a25> 1583 <5a26> <5a28> 11727 <5a29> <5a29> 2793 <5a2a> <5a30> 11730 <5a31> <5a31> 4302 <5a32> <5a32> 6030 <5a33> <5a33> 11737 <5a34> <5a34> 6031 <5a35> <5a35> 11738 <5a36> <5a36> 3197 endcidrange 100 begincidrange <5a37> <5a3b> 11739 <5a3c> <5a3c> 6039 <5a3d> <5a3f> 11744 <5a40> <5a40> 6035 <5a41> <5a41> 8255 <5a42> <5a45> 11747 <5a46> <5a46> 3044 <5a47> <5a48> 11751 <5a49> <5a49> 3746 <5a4a> <5a4a> 6037 <5a4b> <5a54> 11753 <5a55> <5a55> 6038 <5a56> <5a59> 11763 <5a5a> <5a5a> 2046 <5a5b> <5a61> 11767 <5a62> <5a62> 6040 <5a63> <5a65> 11774 <5a66> <5a66> 7950 <5a67> <5a67> 6036 <5a68> <5a69> 11777 <5a6a> <5a6a> 2466 <5a6b> <5a6c> 11779 <5a6d> <5a6d> 9209 <5a6e> <5a73> 11781 <5a74> <5a74> 4233 <5a75> <5a75> 6041 <5a76> <5a76> 3373 <5a77> <5a77> 6045 <5a78> <5a79> 11787 <5a7a> <5a7a> 6046 <5a7b> <5a7e> 11789 <5a7f> <5a7f> 4033 <5a80> <5a91> 11793 <5a92> <5a92> 2754 <5a93> <5a99> 11811 <5a9a> <5a9a> 2761 <5a9b> <5a9b> 6044 <5a9c> <5aa6> 11818 <5aa7> <5aa7> 9212 <5aa8> <5aa9> 11829 <5aaa> <5aaa> 6043 <5aab> <5ab1> 11831 <5ab2> <5ab2> 6049 <5ab3> <5ab3> 3870 <5ab4> <5ab4> 11838 <5ab5> <5ab5> 6564 <5ab6> <5ab7> 11839 <5ab8> <5ab8> 6052 <5ab9> <5abc> 11841 <5abd> <5abd> 8297 <5abe> <5abe> 6047 <5abf> <5ac0> 11845 <5ac1> <5ac1> 2129 <5ac2> <5ac2> 3298 <5ac3> <5ac8> 11847 <5ac9> <5ac9> 2088 <5aca> <5acb> 11853 <5acc> <5acc> 3904 <5acd> <5ad1> 11855 <5ad2> <5ad2> 6050 <5ad3> <5ad3> 11860 <5ad4> <5ad4> 6051 <5ad5> <5ad5> 11861 <5ad6> <5ad6> 6056 <5ad7> <5ad7> 9207 <5ad8> <5ad8> 6058 <5ad9> <5adb> 11862 <5adc> <5adc> 6059 <5add> <5adf> 11865 <5ae0> <5ae0> 6053 <5ae1> <5ae1> 1462 <5ae2> <5ae2> 11868 <5ae3> <5ae3> 6054 <5ae4> <5ae5> 11869 <5ae6> <5ae6> 6057 <5ae7> <5ae8> 11871 <5ae9> <5ae9> 2878 <5aea> <5aea> 11873 <5aeb> <5aeb> 6048 <5aec> <5af0> 11874 <5af1> <5af1> 6055 <5af2> <5af4> 11879 <5af5> <5af5> 9206 <5af6> <5afa> 11882 <5afb> <5afb> 9213 <5afc> <5aff> 11887 <5b00> <5b00> 9208 <5b01> <5b07> 11891 <5b08> <5b08> 9210 <5b09> <5b09> 6060 <5b0a> <5b0a> 11898 <5b0b> <5b0b> 9214 <5b0c> <5b0c> 8104 <5b0d> <5b15> 11899 <5b16> <5b16> 6062 <5b17> <5b17> 6061 <5b18> <5b18> 11908 <5b19> <5b19> 9217 <5b1a> <5b20> 11909 <5b21> <5b21> 9215 endcidrange 100 begincidrange <5b22> <5b29> 11916 <5b2a> <5b2a> 9216 <5b2b> <5b2f> 11924 <5b30> <5b30> 8737 <5b31> <5b31> 11929 <5b32> <5b32> 6063 <5b33> <5b33> 11930 <5b34> <5b34> 4876 <5b35> <5b36> 11931 <5b37> <5b37> 6064 <5b38> <5b38> 8482 <5b39> <5b3f> 11933 <5b40> <5b40> 6065 <5b41> <5b4b> 11940 <5b4c> <5b4c> 9211 <5b4d> <5b4f> 11951 <5b50> <5b50> 4656 <5b51> <5b51> 6071 <5b52> <5b52> 11954 <5b53> <5b53> 6072 <5b54> <5b54> 2404 <5b55> <5b55> 4371 <5b56> <5b56> 11955 <5b57> <5b57> 4659 <5b58> <5b58> 1385 <5b59> <5b59> 3556 <5b5a> <5b5a> 6068 <5b5b> <5b5b> 4729 <5b5c> <5b5c> 4651 <5b5d> <5b5d> 3949 <5b5e> <5b5e> 11956 <5b5f> <5b5f> 2772 <5b60> <5b61> 11957 <5b62> <5b62> 6073 <5b63> <5b63> 2097 <5b64> <5b64> 1819 <5b65> <5b65> 6069 <5b66> <5b66> 4048 <5b67> <5b68> 11959 <5b69> <5b69> 1881 <5b6a> <5b6a> 2678 <5b6b> <5b6b> 8538 <5b6c> <5b6c> 4705 <5b6d> <5b6f> 11961 <5b70> <5b70> 3458 <5b71> <5b71> 5994 <5b72> <5b72> 11964 <5b73> <5b73> 6070 <5b74> <5b74> 11965 <5b75> <5b75> 1682 <5b76> <5b77> 11966 <5b78> <5b78> 8677 <5b79> <5b79> 11968 <5b7a> <5b7a> 3265 <5b7b> <5b7c> 11969 <5b7d> <5b7d> 2904 <5b7e> <5b7e> 11971 <5b7f> <5b7f> 8279 <5b80> <5b80> 5934 <5b81> <5b81> 2913 <5b82> <5b82> 11972 <5b83> <5b83> 3569 <5b84> <5b84> 5935 <5b85> <5b85> 4429 <5b86> <5b86> 11973 <5b87> <5b87> 4307 <5b88> <5b88> 3439 <5b89> <5b89> 957 <5b8a> <5b8a> 11974 <5b8b> <5b8b> 3523 <5b8c> <5b8c> 3739 <5b8d> <5b8e> 11975 <5b8f> <5b8f> 1953 <5b90> <5b92> 11977 <5b93> <5b93> 5937 <5b94> <5b94> 11980 <5b95> <5b95> 5936 <5b96> <5b96> 11981 <5b97> <5b97> 4663 <5b98> <5b98> 1842 <5b99> <5b99> 4581 <5b9a> <5b9a> 1511 <5b9b> <5b9b> 3745 <5b9c> <5b9c> 4178 <5b9d> <5b9d> 1039 <5b9e> <5b9e> 3404 <5b9f> <5b9f> 11982 <5ba0> <5ba0> 1293 <5ba1> <5ba1> 3372 <5ba2> <5ba2> 2394 <5ba3> <5ba3> 4038 <5ba4> <5ba4> 3433 <5ba5> <5ba5> 5938 <5ba6> <5ba6> 2007 <5ba7> <5ba9> 11983 <5baa> <5baa> 3913 <5bab> <5bab> 1797 <5bac> <5baf> 11986 <5bb0> <5bb0> 4378 <5bb1> <5bb2> 11990 endcidrange 100 begincidrange <5bb3> <5bb3> 1885 <5bb4> <5bb4> 4112 <5bb5> <5bb5> 3945 <5bb6> <5bb6> 2117 <5bb7> <5bb7> 11992 <5bb8> <5bb8> 5939 <5bb9> <5bb9> 3256 <5bba> <5bbc> 11993 <5bbd> <5bbd> 2426 <5bbe> <5bbe> 1119 <5bbf> <5bbf> 3539 <5bc0> <5bc1> 11996 <5bc2> <5bc2> 2104 <5bc3> <5bc3> 11998 <5bc4> <5bc4> 2103 <5bc5> <5bc5> 4225 <5bc6> <5bc6> 2785 <5bc7> <5bc7> 2409 <5bc8> <5bcb> 11999 <5bcc> <5bcc> 1718 <5bcd> <5bcf> 12003 <5bd0> <5bd0> 2759 <5bd1> <5bd1> 12006 <5bd2> <5bd2> 1893 <5bd3> <5bd3> 4325 <5bd4> <5bdc> 12007 <5bdd> <5bdd> 3163 <5bde> <5bde> 2834 <5bdf> <5bdf> 1203 <5be0> <5be0> 12016 <5be1> <5be1> 1834 <5be2> <5be2> 8421 <5be3> <5be3> 12017 <5be4> <5be4> 5943 <5be5> <5be5> 2577 <5be6> <5be6> 8495 <5be7> <5be7> 8355 <5be8> <5be8> 4432 <5be9> <5be9> 8481 <5bea> <5bea> 12018 <5beb> <5beb> 8660 <5bec> <5bec> 8165 <5bed> <5bed> 12019 <5bee> <5bee> 5944 <5bef> <5bef> 12020 <5bf0> <5bf0> 5946 <5bf1> <5bf4> 12021 <5bf5> <5bf5> 7818 <5bf6> <5bf6> 7735 <5bf7> <5bf7> 12025 <5bf8> <5bf8> 1386 <5bf9> <5bf9> 1555 <5bfa> <5bfa> 3511 <5bfb> <5bfb> 4057 <5bfc> <5bfc> 1437 <5bfd> <5bfe> 12026 <5bff> <5bff> 3440 <5c00> <5c00> 12028 <5c01> <5c01> 1663 <5c02> <5c03> 12029 <5c04> <5c04> 3357 <5c05> <5c05> 12031 <5c06> <5c06> 2172 <5c07> <5c07> 8094 <5c08> <5c08> 8870 <5c09> <5c09> 3789 <5c0a> <5c0a> 4685 <5c0b> <5c0b> 8680 <5c0c> <5c0c> 12032 <5c0d> <5c0d> 7898 <5c0e> <5c0e> 7865 <5c0f> <5c0f> 3948 <5c10> <5c10> 12033 <5c11> <5c11> 3346 <5c12> <5c13> 12034 <5c14> <5c14> 1594 <5c15> <5c15> 6066 <5c16> <5c16> 2133 <5c17> <5c17> 12036 <5c18> <5c18> 1251 <5c19> <5c19> 12037 <5c1a> <5c1a> 3337 <5c1b> <5c1b> 12038 <5c1c> <5c1c> 6067 <5c1d> <5c1d> 1223 <5c1e> <5c21> 12039 <5c22> <5c22> 5302 <5c23> <5c23> 12043 <5c24> <5c24> 4269 <5c25> <5c25> 5303 <5c26> <5c26> 12044 <5c27> <5c27> 4137 <5c28> <5c2b> 12045 <5c2c> <5c2c> 5304 <5c2d> <5c30> 12049 <5c31> <5c31> 2300 <5c32> <5c33> 12053 <5c34> <5c34> 5305 <5c35> <5c36> 12055 <5c37> <5c37> 9052 endcidrange 100 begincidrange <5c38> <5c38> 3395 <5c39> <5c39> 4227 <5c3a> <5c3a> 1284 <5c3b> <5c3b> 5990 <5c3c> <5c3c> 2884 <5c3d> <5c3d> 2256 <5c3e> <5c3e> 3777 <5c3f> <5c3f> 2901 <5c40> <5c40> 2309 <5c41> <5c41> 3015 <5c42> <5c42> 1194 <5c43> <5c44> 12057 <5c45> <5c45> 2306 <5c46> <5c47> 12059 <5c48> <5c48> 3193 <5c49> <5c49> 3646 <5c4a> <5c4a> 2237 <5c4b> <5c4b> 3820 <5c4c> <5c4d> 12061 <5c4e> <5c4e> 3409 <5c4f> <5c4f> 3040 <5c50> <5c50> 5992 <5c51> <5c51> 3975 <5c52> <5c54> 12063 <5c55> <5c55> 4442 <5c56> <5c58> 12066 <5c59> <5c59> 5993 <5c5a> <5c5d> 12069 <5c5e> <5c5e> 3467 <5c5f> <5c5f> 12073 <5c60> <5c60> 3697 <5c61> <5c61> 2668 <5c62> <5c62> 8272 <5c63> <5c63> 5995 <5c64> <5c64> 7783 <5c65> <5c65> 2667 <5c66> <5c66> 5996 <5c67> <5c67> 12074 <5c68> <5c68> 9204 <5c69> <5c6b> 12075 <5c6c> <5c6c> 8510 <5c6d> <5c6d> 12078 <5c6e> <5c6e> 6004 <5c6f> <5c6f> 3710 <5c70> <5c70> 12079 <5c71> <5c71> 3318 <5c72> <5c78> 12080 <5c79> <5c79> 4192 <5c7a> <5c7a> 5548 <5c7b> <5c7e> 12087 <5c7f> <5c7f> 4305 <5c80> <5c80> 12091 <5c81> <5c81> 3551 <5c82> <5c82> 3088 <5c83> <5c87> 12092 <5c88> <5c88> 5552 <5c89> <5c8b> 12097 <5c8c> <5c8c> 5547 <5c8d> <5c8d> 5549 <5c8e> <5c8f> 12100 <5c90> <5c90> 5550 <5c91> <5c91> 5555 <5c92> <5c93> 12102 <5c94> <5c94> 1204 <5c95> <5c95> 12104 <5c96> <5c96> 5551 <5c97> <5c97> 1749 <5c98> <5c99> 5553 <5c9a> <5c9a> 5556 <5c9b> <5c9b> 1435 <5c9c> <5c9c> 5557 <5c9d> <5ca0> 12105 <5ca1> <5ca1> 7958 <5ca2> <5ca2> 5559 <5ca3> <5ca3> 5564 <5ca4> <5ca8> 12109 <5ca9> <5ca9> 4091 <5caa> <5caa> 12114 <5cab> <5cab> 5562 <5cac> <5cac> 5561 <5cad> <5cad> 2612 <5cae> <5cb0> 12115 <5cb1> <5cb1> 5563 <5cb2> <5cb2> 12118 <5cb3> <5cb3> 4355 <5cb4> <5cb4> 12119 <5cb5> <5cb5> 5558 <5cb6> <5cb6> 12120 <5cb7> <5cb7> 5566 <5cb8> <5cb8> 961 <5cb9> <5cbc> 12121 <5cbd> <5cbd> 5560 <5cbe> <5cbe> 12125 <5cbf> <5cbf> 2438 <5cc0> <5cc0> 12126 <5cc1> <5cc1> 5565 <5cc2> <5cc3> 12127 <5cc4> <5cc4> 5567 <5cc5> <5cca> 12129 <5ccb> <5ccb> 5570 endcidrange 100 begincidrange <5ccc> <5cd1> 12135 <5cd2> <5cd2> 5568 <5cd3> <5cd8> 12141 <5cd9> <5cd9> 4548 <5cda> <5ce0> 12147 <5ce1> <5ce1> 3884 <5ce2> <5ce3> 12154 <5ce4> <5ce4> 5569 <5ce5> <5ce5> 5571 <5ce6> <5ce6> 2676 <5ce7> <5ce7> 12156 <5ce8> <5ce8> 1578 <5ce9> <5ce9> 12157 <5cea> <5cea> 4317 <5ceb> <5cec> 12158 <5ced> <5ced> 3146 <5cee> <5cef> 12160 <5cf0> <5cf0> 1666 <5cf1> <5cf3> 12162 <5cf4> <5cf4> 9097 <5cf5> <5cf5> 12165 <5cf6> <5cf6> 7863 <5cf7> <5cfa> 12166 <5cfb> <5cfb> 2349 <5cfc> <5cfc> 12170 <5cfd> <5cfd> 8628 <5cfe> <5cff> 12171 <5d00> <5d01> 12173 <5d02> <5d03> 5572 <5d04> <5d05> 12175 <5d06> <5d06> 5579 <5d07> <5d07> 1292 <5d08> <5d0c> 12177 <5d0d> <5d0d> 9103 <5d0e> <5d0e> 3080 <5d0f> <5d13> 12182 <5d14> <5d14> 1377 <5d15> <5d15> 12187 <5d16> <5d16> 4075 <5d17> <5d17> 7962 <5d18> <5d1a> 12188 <5d1b> <5d1b> 5580 <5d1c> <5d1d> 12191 <5d1e> <5d1e> 5578 <5d1f> <5d23> 12193 <5d24> <5d24> 5577 <5d25> <5d25> 12198 <5d26> <5d26> 5575 <5d27> <5d27> 5574 <5d28> <5d28> 12199 <5d29> <5d29> 1065 <5d2a> <5d2b> 12200 <5d2c> <5d2c> 9099 <5d2d> <5d2d> 4441 <5d2e> <5d2e> 5576 <5d2f> <5d33> 12202 <5d34> <5d34> 5583 <5d35> <5d3c> 12207 <5d3d> <5d3d> 5584 <5d3e> <5d3e> 5582 <5d3f> <5d46> 12215 <5d47> <5d47> 6946 <5d48> <5d49> 12223 <5d4a> <5d4a> 5591 <5d4b> <5d4b> 5590 <5d4c> <5d4c> 3123 <5d4d> <5d4f> 12225 <5d50> <5d50> 9098 <5d51> <5d57> 12228 <5d58> <5d58> 5581 <5d59> <5d5a> 12235 <5d5b> <5d5b> 5586 <5d5c> <5d5c> 12237 <5d5d> <5d5d> 5588 <5d5e> <5d68> 12238 <5d69> <5d69> 5592 <5d6a> <5d6a> 12249 <5d6b> <5d6b> 5589 <5d6c> <5d6c> 5585 <5d6d> <5d6e> 12250 <5d6f> <5d6f> 5587 <5d70> <5d73> 12252 <5d74> <5d74> 5593 <5d75> <5d80> 12256 <5d81> <5d81> 9105 <5d82> <5d82> 5594 <5d83> <5d83> 12268 <5d84> <5d84> 8817 <5d85> <5d86> 12269 <5d87> <5d87> 9096 <5d88> <5d96> 12271 <5d97> <5d97> 9102 <5d98> <5d98> 12286 <5d99> <5d99> 5595 <5d9a> <5d9c> 12287 <5d9d> <5d9d> 5596 <5d9e> <5d9f> 12290 <5da0> <5da0> 9101 <5da1> <5da6> 12292 <5da7> <5da7> 9100 endcidrange 100 begincidrange <5da8> <5db6> 12298 <5db7> <5db7> 5598 <5db8> <5db8> 9104 <5db9> <5db9> 12313 <5dba> <5dba> 8243 <5dbb> <5dbb> 12314 <5dbc> <5dbc> 8764 <5dbd> <5dc4> 12315 <5dc5> <5dc5> 5599 <5dc6> <5dca> 12323 <5dcb> <5dcb> 8169 <5dcc> <5dcc> 12328 <5dcd> <5dcd> 3760 <5dce> <5dd1> 12329 <5dd2> <5dd2> 8277 <5dd3> <5dd3> 12333 <5dd4> <5dd4> 9106 <5dd5> <5dda> 12334 <5ddb> <5ddb> 6165 <5ddc> <5ddc> 12340 <5ddd> <5ddd> 1323 <5dde> <5dde> 4572 <5ddf> <5de0> 12341 <5de1> <5de1> 4059 <5de2> <5de2> 1239 <5de3> <5de4> 12343 <5de5> <5de5> 1789 <5de6> <5de6> 4688 <5de7> <5de7> 3142 <5de8> <5de8> 2317 <5de9> <5de9> 1799 <5dea> <5dea> 12345 <5deb> <5deb> 3814 <5dec> <5ded> 12346 <5dee> <5dee> 1205 <5def> <5def> 5023 <5df0> <5df0> 8996 <5df1> <5df1> 2093 <5df2> <5df2> 4184 <5df3> <5df3> 3517 <5df4> <5df4> 984 <5df5> <5df6> 12348 <5df7> <5df7> 3932 <5df8> <5dfc> 12350 <5dfd> <5dfd> 4855 <5dfe> <5dfe> 2238 <5dff> <5dff> 12355 <5e00> <5e00> 12356 <5e01> <5e01> 1083 <5e02> <5e02> 3431 <5e03> <5e03> 1155 <5e04> <5e04> 12357 <5e05> <5e05> 3484 <5e06> <5e06> 1608 <5e07> <5e07> 12358 <5e08> <5e08> 3389 <5e09> <5e0b> 12359 <5e0c> <5e0c> 3856 <5e0d> <5e0e> 12362 <5e0f> <5e0f> 5534 <5e10> <5e10> 4459 <5e11> <5e11> 5537 <5e12> <5e13> 12364 <5e14> <5e14> 5536 <5e15> <5e15> 2946 <5e16> <5e16> 3662 <5e17> <5e17> 12366 <5e18> <5e18> 2554 <5e19> <5e19> 5535 <5e1a> <5e1a> 4578 <5e1b> <5e1b> 1142 <5e1c> <5e1c> 4547 <5e1d> <5e1d> 1468 <5e1e> <5e24> 12367 <5e25> <5e25> 8515 <5e26> <5e26> 1403 <5e27> <5e27> 4512 <5e28> <5e2a> 12374 <5e2b> <5e2b> 8489 <5e2c> <5e2c> 12377 <5e2d> <5e2d> 3868 <5e2e> <5e2e> 1018 <5e2f> <5e30> 12378 <5e31> <5e31> 5538 <5e32> <5e32> 12380 <5e33> <5e33> 8823 <5e34> <5e35> 12381 <5e36> <5e36> 7847 <5e37> <5e37> 5541 <5e38> <5e38> 1224 <5e39> <5e3a> 12383 <5e3b> <5e3c> 5539 <5e3d> <5e3d> 2742 <5e3e> <5e3f> 12385 <5e40> <5e40> 8837 <5e41> <5e41> 12387 <5e42> <5e42> 2786 <5e43> <5e43> 9092 <5e44> <5e44> 5542 <5e45> <5e45> 1686 endcidrange 100 begincidrange <5e46> <5e4b> 12388 <5e4c> <5e4c> 2020 <5e4d> <5e53> 12394 <5e54> <5e54> 5543 <5e55> <5e55> 2846 <5e56> <5e56> 12401 <5e57> <5e57> 9095 <5e58> <5e58> 9094 <5e59> <5e5a> 12402 <5e5b> <5e5b> 5544 <5e5c> <5e5d> 12404 <5e5e> <5e5e> 5545 <5e5f> <5e5f> 8848 <5e60> <5e60> 12406 <5e61> <5e61> 5546 <5e62> <5e62> 1332 <5e63> <5e63> 7748 <5e64> <5e6a> 12407 <5e6b> <5e6b> 7730 <5e6c> <5e6c> 9093 <5e6d> <5e71> 12414 <5e72> <5e72> 1732 <5e73> <5e73> 3036 <5e74> <5e74> 2893 <5e75> <5e75> 12419 <5e76> <5e76> 1129 <5e77> <5e77> 12420 <5e78> <5e78> 3997 <5e79> <5e79> 7955 <5e7a> <5e7a> 6163 <5e7b> <5e7b> 2008 <5e7c> <5e7c> 4284 <5e7d> <5e7d> 4265 <5e7e> <5e7e> 8051 <5e7f> <5e7f> 1852 <5e80> <5e80> 5681 <5e81> <5e83> 12421 <5e84> <5e84> 4620 <5e85> <5e85> 12424 <5e86> <5e86> 3177 <5e87> <5e87> 1084 <5e88> <5e89> 12425 <5e8a> <5e8a> 1333 <5e8b> <5e8b> 5683 <5e8c> <5e8e> 12427 <5e8f> <5e8f> 4029 <5e90> <5e90> 2645 <5e91> <5e91> 5682 <5e92> <5e92> 12430 <5e93> <5e93> 2415 <5e94> <5e94> 4235 <5e95> <5e95> 1464 <5e96> <5e96> 5684 <5e97> <5e97> 1483 <5e98> <5e98> 12431 <5e99> <5e99> 2802 <5e9a> <5e9a> 1784 <5e9b> <5e9b> 12432 <5e9c> <5e9c> 1705 <5e9d> <5e9d> 12433 <5e9e> <5e9e> 2964 <5e9f> <5e9f> 1644 <5ea0> <5ea0> 5686 <5ea1> <5ea4> 12434 <5ea5> <5ea5> 5685 <5ea6> <5ea6> 1543 <5ea7> <5ea7> 4694 <5ea8> <5eaa> 12438 <5eab> <5eab> 8160 <5eac> <5eac> 12441 <5ead> <5ead> 3670 <5eae> <5eb2> 12442 <5eb3> <5eb3> 5690 <5eb4> <5eb4> 12447 <5eb5> <5eb5> 5688 <5eb6> <5eb6> 3475 <5eb7> <5eb7> 2370 <5eb8> <5eb8> 4254 <5eb9> <5eb9> 5687 <5eba> <5ebd> 12448 <5ebe> <5ebe> 5689 <5ebf> <5ec8> 12452 <5ec9> <5ec9> 2551 <5eca> <5eca> 2483 <5ecb> <5ed0> 12462 <5ed1> <5ed1> 5693 <5ed2> <5ed2> 5692 <5ed3> <5ed3> 2453 <5ed4> <5ed5> 12468 <5ed6> <5ed6> 2583 <5ed7> <5eda> 12470 <5edb> <5edb> 5694 <5edc> <5ede> 12474 <5edf> <5edf> 8327 <5ee0> <5ee0> 7800 <5ee1> <5ee1> 9134 <5ee2> <5ee2> 7926 <5ee3> <5ee3> 7985 <5ee4> <5ee7> 12477 <5ee8> <5ee8> 5695 endcidrange 100 begincidrange <5ee9> <5ee9> 12481 <5eea> <5eea> 5696 <5eeb> <5eeb> 12482 <5eec> <5eec> 8261 <5eed> <5ef2> 12483 <5ef3> <5ef3> 8568 <5ef4> <5ef4> 5016 <5ef5> <5ef5> 12489 <5ef6> <5ef6> 4092 <5ef7> <5ef7> 3667 <5ef8> <5ef9> 12490 <5efa> <5efa> 2169 <5efb> <5efd> 12492 <5efe> <5efe> 5293 <5eff> <5eff> 4699 <5f00> <5f00> 2359 <5f01> <5f01> 5021 <5f02> <5f02> 4211 <5f03> <5f03> 3097 <5f04> <5f04> 2923 <5f05> <5f07> 12495 <5f08> <5f08> 5294 <5f09> <5f09> 12498 <5f0a> <5f0a> 1088 <5f0b> <5f0b> 5366 <5f0c> <5f0e> 12499 <5f0f> <5f0f> 3412 <5f10> <5f10> 12502 <5f11> <5f11> 5369 <5f12> <5f12> 12503 <5f13> <5f13> 1798 <5f14> <5f14> 12504 <5f15> <5f15> 4228 <5f16> <5f16> 12505 <5f17> <5f17> 1696 <5f18> <5f18> 1954 <5f19> <5f1a> 12506 <5f1b> <5f1b> 1279 <5f1c> <5f1e> 12508 <5f1f> <5f1f> 1469 <5f20> <5f20> 4454 <5f21> <5f24> 12511 <5f25> <5f25> 2779 <5f26> <5f26> 3903 <5f27> <5f27> 1974 <5f28> <5f28> 12515 <5f29> <5f29> 5999 <5f2a> <5f2a> 5998 <5f2b> <5f2c> 12516 <5f2d> <5f2d> 6000 <5f2e> <5f2e> 12518 <5f2f> <5f2f> 3733 <5f30> <5f30> 12519 <5f31> <5f31> 3280 <5f32> <5f32> 12520 <5f33> <5f33> 9205 <5f34> <5f34> 12521 <5f35> <5f35> 8821 <5f36> <5f38> 12522 <5f39> <5f39> 1424 <5f3a> <5f3a> 3132 <5f3b> <5f3b> 12525 <5f3c> <5f3c> 6002 <5f3d> <5f3f> 12526 <5f40> <5f40> 6590 <5f41> <5f45> 12529 <5f46> <5f46> 9838 <5f47> <5f47> 12534 <5f48> <5f48> 7856 <5f49> <5f4b> 12535 <5f4c> <5f4c> 8323 <5f4d> <5f4d> 12538 <5f4e> <5f4e> 8584 <5f4f> <5f4f> 12539 <5f50> <5f50> 5986 <5f51> <5f51> 12540 <5f52> <5f52> 1858 <5f53> <5f53> 1426 <5f54> <5f54> 12541 <5f55> <5f55> 2659 <5f56> <5f56> 5988 <5f57> <5f57> 5987 <5f58> <5f58> 5989 <5f59> <5f59> 9852 <5f5a> <5f5c> 12542 <5f5d> <5f5d> 4180 <5f5e> <5f60> 12545 <5f61> <5f61> 5614 <5f62> <5f62> 3993 <5f63> <5f63> 12548 <5f64> <5f64> 3679 <5f65> <5f65> 12549 <5f66> <5f66> 4110 <5f67> <5f68> 12550 <5f69> <5f69> 1169 <5f6a> <5f6a> 1108 <5f6b> <5f6b> 12552 <5f6c> <5f6c> 1115 <5f6d> <5f6d> 2990 <5f6e> <5f6f> 12553 endcidrange 100 begincidrange <5f70> <5f70> 4452 <5f71> <5f71> 4245 <5f72> <5f72> 12555 <5f73> <5f73> 5600 <5f74> <5f76> 12556 <5f77> <5f77> 5601 <5f78> <5f78> 12559 <5f79> <5f79> 4194 <5f7a> <5f7a> 12560 <5f7b> <5f7b> 1246 <5f7c> <5f7c> 1076 <5f7d> <5f7f> 12561 <5f80> <5f80> 3754 <5f81> <5f81> 4504 <5f82> <5f82> 5602 <5f83> <5f83> 12564 <5f84> <5f84> 2277 <5f85> <5f85> 1408 <5f86> <5f86> 12565 <5f87> <5f87> 5603 <5f88> <5f88> 1939 <5f89> <5f89> 5604 <5f8a> <5f8a> 1991 <5f8b> <5f8b> 2672 <5f8c> <5f8c> 5605 <5f8d> <5f8f> 12566 <5f90> <5f90> 4023 <5f91> <5f91> 8133 <5f92> <5f92> 3694 <5f93> <5f94> 12569 <5f95> <5f95> 5606 <5f96> <5f96> 12571 <5f97> <5f97> 1444 <5f98> <5f98> 2952 <5f99> <5f99> 5607 <5f9a> <5f9b> 12572 <5f9c> <5f9c> 5608 <5f9d> <5f9d> 12574 <5f9e> <5f9e> 7841 <5f9f> <5f9f> 12575 <5fa0> <5fa0> 9107 <5fa1> <5fa1> 4318 <5fa2> <5fa7> 12576 <5fa8> <5fa8> 5609 <5fa9> <5fa9> 7947 <5faa> <5faa> 4054 <5fab> <5fac> 12582 <5fad> <5fad> 5610 <5fae> <5fae> 3761 <5faf> <5fb4> 12584 <5fb5> <5fb5> 5611 <5fb6> <5fb6> 12590 <5fb7> <5fb7> 1443 <5fb8> <5fb8> 12591 <5fb9> <5fb9> 7804 <5fba> <5fbb> 12592 <5fbc> <5fbc> 5612 <5fbd> <5fbd> 2026 <5fbe> <5fc2> 12594 <5fc3> <5fc3> 3983 <5fc4> <5fc4> 5698 <5fc5> <5fc5> 1089 <5fc6> <5fc6> 4203 <5fc7> <5fc8> 12599 <5fc9> <5fc9> 5699 <5fca> <5fcb> 12601 <5fcc> <5fcc> 2108 <5fcd> <5fcd> 3239 <5fce> <5fce> 12603 <5fcf> <5fcf> 5701 <5fd0> <5fd0> 6668 <5fd1> <5fd1> 6667 <5fd2> <5fd2> 5367 <5fd3> <5fd5> 12604 <5fd6> <5fd6> 5700 <5fd7> <5fd7> 4541 <5fd8> <5fd8> 3757 <5fd9> <5fd9> 2731 <5fda> <5fdc> 12607 <5fdd> <5fdd> 5763 <5fde> <5fdf> 12610 <5fe0> <5fe0> 4561 <5fe1> <5fe1> 5705 <5fe2> <5fe3> 12612 <5fe4> <5fe4> 5706 <5fe5> <5fe6> 12614 <5fe7> <5fe7> 4268 <5fe8> <5fe9> 12616 <5fea> <5fea> 5710 <5feb> <5feb> 2425 <5fec> <5fec> 12618 <5fed> <5fed> 5711 <5fee> <5fee> 5703 <5fef> <5ff0> 12619 <5ff1> <5ff1> 1253 <5ff2> <5ff4> 12621 <5ff5> <5ff5> 2897 <5ff6> <5ff7> 12624 <5ff8> <5ff8> 5712 <5ff9> <5ffa> 12626 endcidrange 100 begincidrange <5ffb> <5ffb> 3982 <5ffc> <5ffc> 12628 <5ffd> <5ffd> 1965 <5ffe> <5ffe> 5707 <5fff> <5fff> 1659 <6000> <6000> 1992 <6001> <6001> 3583 <6002> <6002> 3520 <6003> <6003> 5702 <6004> <6004> 5704 <6005> <6006> 5708 <6007> <6009> 12629 <600a> <600a> 5721 <600b> <600c> 12632 <600d> <600d> 5718 <600e> <600e> 4408 <600f> <600f> 5717 <6010> <6011> 12634 <6012> <6012> 2926 <6013> <6013> 12636 <6014> <6014> 4507 <6015> <6015> 2947 <6016> <6016> 1159 <6017> <6018> 12637 <6019> <6019> 5713 <601a> <601a> 12639 <601b> <601b> 5716 <601c> <601c> 2552 <601d> <601d> 3505 <601e> <601f> 12640 <6020> <6020> 1410 <6021> <6021> 5723 <6022> <6024> 12642 <6025> <6025> 2084 <6026> <6026> 5715 <6027> <6027> 3999 <6028> <6028> 4348 <6029> <6029> 5719 <602a> <602a> 1839 <602b> <602b> 5720 <602c> <602e> 12645 <602f> <602f> 3152 <6030> <6034> 12648 <6035> <6035> 5714 <6036> <603a> 12653 <603b> <603b> 4665 <603c> <603c> 6669 <603d> <603e> 12658 <603f> <603f> 5722 <6040> <6040> 12660 <6041> <6041> 6673 <6042> <6042> 5728 <6043> <6043> 3432 <6044> <604a> 12661 <604b> <604b> 2558 <604c> <604c> 12668 <604d> <604d> 2021 <604e> <604f> 12669 <6050> <6050> 2403 <6051> <6051> 12671 <6052> <6052> 1946 <6053> <6054> 12672 <6055> <6055> 3478 <6056> <6058> 12674 <6059> <6059> 6674 <605a> <605a> 6671 <605b> <605c> 12677 <605d> <605d> 6670 <605e> <6061> 12679 <6062> <6062> 2027 <6063> <6063> 6675 <6064> <6064> 4031 <6065> <6066> 12683 <6067> <6067> 6672 <6068> <6068> 1941 <6069> <6069> 1590 <606a> <606a> 5729 <606b> <606b> 1521 <606c> <606c> 3652 <606d> <606d> 1792 <606e> <606e> 12685 <606f> <606f> 3855 <6070> <6070> 3102 <6071> <6072> 12686 <6073> <6073> 2399 <6074> <6075> 12688 <6076> <6076> 1584 <6077> <6077> 12690 <6078> <6079> 5724 <607a> <607a> 5727 <607b> <607b> 5726 <607c> <607c> 2872 <607d> <607d> 5730 <607e> <607e> 12691 <607f> <607f> 4262 <6080> <6082> 12692 <6083> <6083> 5735 <6084> <6084> 3137 <6085> <6088> 12695 <6089> <6089> 3857 endcidrange 100 begincidrange <608a> <608b> 12699 <608c> <608c> 5737 <608d> <608d> 1902 <608e> <6091> 12701 <6092> <6092> 5736 <6093> <6093> 12705 <6094> <6094> 2031 <6095> <6095> 12706 <6096> <6096> 5731 <6097> <6099> 12707 <609a> <609a> 5732 <609b> <609b> 5738 <609c> <609c> 12710 <609d> <609d> 5734 <609e> <609e> 12711 <609f> <609f> 3841 <60a0> <60a0> 4267 <60a1> <60a2> 12712 <60a3> <60a3> 2001 <60a4> <60a5> 12714 <60a6> <60a6> 4358 <60a7> <60a7> 12716 <60a8> <60a8> 2909 <60a9> <60aa> 12717 <60ab> <60ab> 6676 <60ac> <60ac> 4039 <60ad> <60ad> 5733 <60ae> <60ae> 12719 <60af> <60af> 2810 <60b0> <60b0> 12720 <60b1> <60b1> 5741 <60b2> <60b2> 1048 <60b3> <60b3> 12721 <60b4> <60b4> 5746 <60b5> <60b5> 9140 <60b6> <60b6> 8318 <60b7> <60b7> 12722 <60b8> <60b8> 2101 <60b9> <60ba> 12723 <60bb> <60bb> 5740 <60bc> <60bc> 1440 <60bd> <60c4> 12725 <60c5> <60c5> 3174 <60c6> <60c6> 5744 <60c7> <60c9> 12733 <60ca> <60ca> 2265 <60cb> <60cb> 3744 <60cc> <60d0> 12736 <60d1> <60d1> 2056 <60d2> <60d4> 12741 <60d5> <60d5> 3643 <60d6> <60d7> 12744 <60d8> <60d8> 5743 <60d9> <60d9> 12746 <60da> <60da> 5745 <60db> <60db> 12747 <60dc> <60dc> 3860 <60dd> <60dd> 5742 <60de> <60de> 12748 <60df> <60df> 3768 <60e0> <60e0> 2034 <60e1> <60e1> 7907 <60e2> <60e5> 12749 <60e6> <60e6> 1484 <60e7> <60e7> 2324 <60e8> <60e8> 1177 <60e9> <60e9> 1266 <60ea> <60ea> 12753 <60eb> <60eb> 1058 <60ec> <60ec> 5739 <60ed> <60ed> 1176 <60ee> <60ee> 1421 <60ef> <60ef> 1848 <60f0> <60f0> 1575 <60f1> <60f1> 8341 <60f2> <60f2> 9147 <60f3> <60f3> 3928 <60f4> <60f4> 5751 <60f5> <60f5> 12754 <60f6> <60f6> 2017 <60f7> <60f8> 12755 <60f9> <60f9> 3234 <60fa> <60fa> 3989 <60fb> <60fb> 9145 <60fc> <60ff> 12757 <6100> <6100> 5752 <6101> <6101> 1299 <6102> <6105> 12761 <6106> <6106> 6677 <6107> <6107> 12765 <6108> <6108> 4319 <6109> <6109> 4297 <610a> <610c> 12766 <610d> <610d> 6678 <610e> <610e> 5753 <610f> <610f> 4201 <6110> <6114> 12769 <6115> <6115> 5749 <6116> <6119> 12774 <611a> <611a> 4291 endcidrange 100 begincidrange <611b> <611b> 7720 <611c> <611c> 9149 <611d> <611e> 12778 <611f> <611f> 1739 <6120> <6120> 5747 <6121> <6122> 12780 <6123> <6123> 5750 <6124> <6124> 1660 <6125> <6125> 12782 <6126> <6126> 5748 <6127> <6127> 2445 <6128> <612a> 12783 <612b> <612b> 5754 <612c> <6133> 12786 <6134> <6134> 9141 <6135> <6136> 12794 <6137> <6137> 9146 <6138> <613d> 12796 <613e> <613e> 9139 <613f> <613f> 4347 <6140> <6147> 12802 <6148> <6148> 1355 <6149> <6149> 12810 <614a> <614a> 5755 <614b> <614b> 8546 <614c> <614c> 2010 <614d> <614d> 12811 <614e> <614e> 3376 <614f> <6150> 12812 <6151> <6151> 3358 <6152> <6154> 12814 <6155> <6155> 2848 <6156> <6157> 12817 <6158> <6158> 7774 <6159> <6159> 12819 <615a> <615a> 7773 <615b> <615c> 12820 <615d> <615d> 6679 <615e> <615e> 12822 <615f> <615f> 9143 <6160> <6161> 12823 <6162> <6162> 2724 <6163> <6163> 7983 <6164> <6164> 9439 <6165> <6166> 12825 <6167> <6167> 2032 <6168> <6168> 2363 <6169> <6169> 12827 <616a> <616a> 9138 <616b> <616b> 8526 <616c> <616d> 12828 <616e> <616e> 8274 <616f> <616f> 12830 <6170> <6170> 3790 <6171> <6172> 12831 <6173> <6173> 9148 <6174> <6174> 12833 <6175> <6175> 5756 <6176> <6176> 8427 <6177> <6177> 2371 <6178> <6181> 12834 <6182> <6182> 8754 <6183> <6189> 12844 <618a> <618a> 7743 <618b> <618b> 1112 <618c> <618d> 12851 <618e> <618e> 4410 <618f> <618f> 12853 <6190> <6190> 8219 <6191> <6191> 8380 <6192> <6192> 9150 <6193> <6193> 12854 <6194> <6194> 5758 <6195> <6199> 12855 <619a> <619a> 7854 <619b> <619c> 12860 <619d> <619d> 6681 <619e> <61a3> 12862 <61a4> <61a4> 7931 <61a5> <61a6> 12868 <61a7> <61a7> 5759 <61a8> <61a8> 1888 <61a9> <61a9> 6680 <61aa> <61aa> 12870 <61ab> <61ab> 8329 <61ac> <61ac> 5757 <61ad> <61ad> 12871 <61ae> <61ae> 9137 <61af> <61b1> 12872 <61b2> <61b2> 8644 <61b3> <61b5> 12875 <61b6> <61b6> 8724 <61b7> <61b7> 5760 <61b8> <61bd> 12878 <61be> <61be> 1901 <61bf> <61c1> 12884 <61c2> <61c2> 1517 <61c3> <61c6> 12887 <61c7> <61c7> 8158 <61c8> <61c8> 3971 endcidrange 100 begincidrange <61c9> <61c9> 8739 <61ca> <61ca> 974 <61cb> <61cb> 6682 <61cc> <61cc> 9142 <61cd> <61d0> 12891 <61d1> <61d1> 6683 <61d2> <61d2> 2476 <61d3> <61d3> 12895 <61d4> <61d4> 5761 <61d5> <61dd> 12896 <61de> <61de> 9868 <61df> <61df> 9438 <61e0> <61e2> 12905 <61e3> <61e3> 9440 <61e4> <61e5> 12908 <61e6> <61e6> 2932 <61e7> <61e7> 12910 <61e8> <61e8> 9144 <61e9> <61f1> 12911 <61f2> <61f2> 7809 <61f3> <61f4> 12920 <61f5> <61f5> 5762 <61f6> <61f6> 8190 <61f7> <61f7> 8017 <61f8> <61f8> 8673 <61f9> <61f9> 12922 <61fa> <61fa> 9136 <61fb> <61fb> 12923 <61fc> <61fc> 8142 <61fd> <61fd> 12924 <61fe> <61fe> 8478 <61ff> <61ff> 5088 <6200> <6200> 8225 <6201> <6205> 12925 <6206> <6206> 6684 <6207> <6207> 9441 <6208> <6208> 1765 <6209> <6209> 12930 <620a> <620a> 3835 <620b> <620b> 6393 <620c> <620c> 4018 <620d> <620d> 3472 <620e> <620e> 3249 <620f> <620f> 3876 <6210> <6210> 1262 <6211> <6211> 3809 <6212> <6212> 2229 <6213> <6213> 12931 <6214> <6214> 9379 <6215> <6215> 5790 <6216> <6216> 2055 <6217> <6217> 6394 <6218> <6218> 4446 <6219> <6219> 12932 <621a> <621a> 3068 <621b> <621b> 6395 <621c> <621e> 12933 <621f> <621f> 6396 <6220> <6220> 12936 <6221> <6221> 6398 <6222> <6222> 6397 <6223> <6223> 12937 <6224> <6224> 6400 <6225> <6225> 6399 <6226> <6226> 12938 <6227> <6227> 9380 <6228> <6229> 12939 <622a> <622a> 2217 <622b> <622b> 12941 <622c> <622c> 6401 <622d> <622d> 12942 <622e> <622e> 2661 <622f> <622f> 12943 <6230> <6230> 8819 <6231> <6231> 12944 <6232> <6232> 8624 <6233> <6233> 1348 <6234> <6234> 1402 <6235> <6236> 12945 <6237> <6237> 1980 <6238> <623c> 12947 <623d> <623d> 6644 <623e> <623e> 6643 <623f> <623f> 1628 <6240> <6240> 3566 <6241> <6241> 1099 <6242> <6242> 12952 <6243> <6243> 6645 <6244> <6246> 12953 <6247> <6247> 3329 <6248> <6249> 6646 <624a> <624a> 12956 <624b> <624b> 3437 <624c> <624c> 5306 <624d> <624d> 1164 <624e> <624e> 4413 <624f> <6250> 12957 <6251> <6251> 3050 <6252> <6252> 978 <6253> <6253> 1397 endcidrange 100 begincidrange <6254> <6254> 3246 <6255> <6257> 12959 <6258> <6258> 3713 <6259> <625a> 12962 <625b> <625b> 2373 <625c> <6262> 12964 <6263> <6263> 2408 <6264> <6265> 12971 <6266> <6266> 3105 <6267> <6267> 4531 <6268> <6268> 12973 <6269> <6269> 2452 <626a> <626a> 5307 <626b> <626b> 3297 <626c> <626c> 4120 <626d> <626d> 2917 <626e> <626e> 1010 <626f> <626f> 1243 <6270> <6270> 3232 <6271> <6272> 12974 <6273> <6273> 1005 <6274> <6275> 12976 <6276> <6276> 1683 <6277> <6278> 12978 <6279> <6279> 3003 <627a> <627b> 12980 <627c> <627c> 1586 <627d> <627d> 12982 <627e> <627e> 4467 <627f> <627f> 1269 <6280> <6280> 2095 <6281> <6283> 12983 <6284> <6284> 1234 <6285> <6288> 12986 <6289> <6289> 2336 <628a> <628a> 988 <628b> <6290> 12990 <6291> <6291> 4189 <6292> <6292> 3450 <6293> <6293> 4610 <6294> <6294> 12996 <6295> <6295> 3687 <6296> <6296> 1525 <6297> <6297> 2374 <6298> <6298> 4476 <6299> <6299> 12997 <629a> <629a> 1698 <629b> <629b> 2968 <629c> <629e> 12998 <629f> <629f> 5308 <62a0> <62a0> 2406 <62a1> <62a1> 2684 <62a2> <62a2> 3133 <62a3> <62a3> 13001 <62a4> <62a4> 1977 <62a5> <62a5> 1041 <62a6> <62a7> 13002 <62a8> <62a8> 2987 <62a9> <62aa> 13004 <62ab> <62ab> 3004 <62ac> <62ac> 3578 <62ad> <62b0> 13006 <62b1> <62b1> 1040 <62b2> <62b4> 13010 <62b5> <62b5> 1463 <62b6> <62b8> 13013 <62b9> <62b9> 2827 <62ba> <62ba> 13016 <62bb> <62bb> 5309 <62bc> <62bc> 4067 <62bd> <62bd> 1294 <62be> <62be> 13017 <62bf> <62bf> 2807 <62c0> <62c1> 13018 <62c2> <62c2> 1684 <62c3> <62c3> 13020 <62c4> <62c4> 4595 <62c5> <62c5> 1412 <62c6> <62c6> 1207 <62c7> <62c7> 2839 <62c8> <62c8> 2892 <62c9> <62c9> 2456 <62ca> <62ca> 5310 <62cb> <62cb> 13021 <62cc> <62cc> 1011 <62cd> <62cd> 2949 <62ce> <62ce> 2601 <62cf> <62cf> 13022 <62d0> <62d0> 1838 <62d1> <62d1> 13023 <62d2> <62d2> 2315 <62d3> <62d3> 3721 <62d4> <62d4> 985 <62d5> <62d5> 13024 <62d6> <62d6> 3712 <62d7> <62d7> 5312 <62d8> <62d8> 2303 <62d9> <62d9> 4635 <62da> <62da> 5311 <62db> <62db> 4465 endcidrange 100 begincidrange <62dc> <62dc> 1000 <62dd> <62de> 13025 <62df> <62df> 2885 <62e0> <62e1> 13027 <62e2> <62e2> 2634 <62e3> <62e3> 2147 <62e4> <62e4> 13029 <62e5> <62e5> 4250 <62e6> <62e6> 2468 <62e7> <62e7> 2914 <62e8> <62e8> 1133 <62e9> <62e9> 4404 <62ea> <62eb> 13030 <62ec> <62ec> 2451 <62ed> <62ed> 3418 <62ee> <62ee> 5313 <62ef> <62ef> 4509 <62f0> <62f0> 13032 <62f1> <62f1> 1801 <62f2> <62f2> 13033 <62f3> <62f3> 3208 <62f4> <62f4> 3486 <62f5> <62f5> 13034 <62f6> <62f6> 5315 <62f7> <62f7> 2378 <62f8> <62fb> 13035 <62fc> <62fc> 3027 <62fd> <62fd> 4612 <62fe> <62fe> 3399 <62ff> <62ff> 2854 <6300> <6300> 13039 <6301> <6301> 1275 <6302> <6302> 1835 <6303> <6306> 13040 <6307> <6307> 4535 <6308> <6308> 6478 <6309> <6309> 959 <630a> <630d> 13044 <630e> <630e> 2419 <630f> <6310> 13048 <6311> <6311> 3655 <6312> <6315> 13050 <6316> <6316> 3723 <6317> <6319> 13054 <631a> <631a> 4542 <631b> <631b> 2677 <631c> <631c> 13057 <631d> <631d> 3805 <631e> <631e> 3573 <631f> <631f> 3961 <6320> <6320> 2870 <6321> <6321> 1427 <6322> <6322> 5314 <6323> <6323> 4502 <6324> <6324> 2090 <6325> <6325> 2024 <6326> <6327> 13058 <6328> <6328> 943 <6329> <6329> 13060 <632a> <632a> 2931 <632b> <632b> 1391 <632c> <632e> 13061 <632f> <632f> 4498 <6330> <6331> 13064 <6332> <6332> 6479 <6333> <6338> 13066 <6339> <6339> 5316 <633a> <633a> 3671 <633b> <633c> 13072 <633d> <633d> 3741 <633e> <633e> 8657 <633f> <6341> 13074 <6342> <6342> 3829 <6343> <6343> 5318 <6344> <6344> 13077 <6345> <6345> 3682 <6346> <6346> 2449 <6347> <6348> 13078 <6349> <6349> 4634 <634a> <634a> 13080 <634b> <634b> 5317 <634c> <634c> 977 <634d> <634d> 1899 <634e> <634e> 3340 <634f> <634f> 2902 <6350> <6350> 2327 <6351> <6354> 13081 <6355> <6355> 1149 <6356> <635d> 13085 <635e> <635e> 2487 <635f> <635f> 3557 <6360> <6360> 13093 <6361> <6361> 2148 <6362> <6362> 2000 <6363> <6363> 1432 <6364> <6366> 13094 <6367> <6367> 2998 <6368> <6368> 8476 <6369> <6369> 5328 <636a> <636a> 13097 endcidrange 100 begincidrange <636b> <636b> 9053 <636c> <636c> 13098 <636d> <636d> 5325 <636e> <636e> 2316 <636f> <6370> 13099 <6371> <6371> 5321 <6372> <6372> 9858 <6373> <6375> 13101 <6376> <6376> 1338 <6377> <6377> 2222 <6378> <6379> 13104 <637a> <637a> 5322 <637b> <637b> 2896 <637c> <637f> 13106 <6380> <6380> 3891 <6381> <6381> 13110 <6382> <6382> 1473 <6383> <6383> 8461 <6384> <6384> 8282 <6385> <6386> 13111 <6387> <6387> 1565 <6388> <6388> 3441 <6389> <6389> 1493 <638a> <638a> 5327 <638b> <638b> 13113 <638c> <638c> 4455 <638d> <638d> 13114 <638e> <638e> 5323 <638f> <638f> 3616 <6390> <6390> 3101 <6391> <6391> 13115 <6392> <6392> 2950 <6393> <6395> 13116 <6396> <6396> 4155 <6397> <6397> 13119 <6398> <6398> 2337 <6399> <639f> 13120 <63a0> <63a0> 2682 <63a1> <63a1> 13127 <63a2> <63a2> 3600 <63a3> <63a3> 1245 <63a4> <63a4> 13128 <63a5> <63a5> 2212 <63a6> <63a6> 13129 <63a7> <63a7> 2405 <63a8> <63a8> 3703 <63a9> <63a9> 4099 <63aa> <63aa> 1390 <63ab> <63ab> 13130 <63ac> <63ac> 5326 <63ad> <63ad> 5319 <63ae> <63ae> 5329 <63af> <63af> 13131 <63b0> <63b0> 6480 <63b1> <63b2> 13132 <63b3> <63b3> 2647 <63b4> <63b4> 5324 <63b5> <63b6> 13134 <63b7> <63b7> 4543 <63b8> <63b8> 1416 <63b9> <63b9> 13136 <63ba> <63ba> 1211 <63bb> <63bb> 13137 <63bc> <63bc> 5330 <63bd> <63bd> 13138 <63be> <63be> 5340 <63bf> <63bf> 13139 <63c0> <63c0> 8077 <63c1> <63c3> 13140 <63c4> <63c4> 5335 <63c5> <63c5> 13143 <63c6> <63c6> 5339 <63c7> <63c8> 13144 <63c9> <63c9> 3259 <63ca> <63cc> 13146 <63cd> <63cd> 4670 <63ce> <63ce> 5337 <63cf> <63cf> 2797 <63d0> <63d0> 3636 <63d1> <63d1> 13149 <63d2> <63d2> 1196 <63d3> <63d5> 13150 <63d6> <63d6> 4165 <63d7> <63d9> 13153 <63da> <63da> 8703 <63db> <63dd> 13156 <63de> <63de> 5336 <63df> <63df> 13159 <63e0> <63e0> 5333 <63e1> <63e1> 3812 <63e2> <63e2> 13160 <63e3> <63e3> 1322 <63e4> <63e8> 13161 <63e9> <63e9> 2360 <63ea> <63ea> 2285 <63eb> <63ec> 13166 <63ed> <63ed> 2211 <63ee> <63ee> 8024 <63ef> <63f1> 13168 <63f2> <63f2> 5331 endcidrange 100 begincidrange <63f3> <63f3> 13171 <63f4> <63f4> 4337 <63f5> <63f5> 13172 <63f6> <63f6> 5320 <63f7> <63f7> 13173 <63f8> <63f8> 5332 <63f9> <63fc> 13174 <63fd> <63fd> 2474 <63fe> <63fe> 13178 <63ff> <63ff> 5334 <6400> <6400> 1210 <6401> <6401> 1764 <6402> <6402> 2638 <6403> <6404> 13179 <6405> <6405> 2194 <6406> <640a> 13181 <640b> <640b> 5343 <640c> <640c> 5346 <640d> <640d> 8539 <640e> <640e> 13186 <640f> <640f> 1138 <6410> <6410> 1319 <6411> <6412> 13187 <6413> <6413> 1389 <6414> <6414> 3295 <6415> <6416> 13189 <6417> <6417> 7862 <6418> <641a> 13191 <641b> <641b> 5344 <641c> <641c> 3526 <641d> <641d> 13194 <641e> <641e> 1758 <641f> <641f> 13195 <6420> <6420> 5345 <6421> <6421> 5348 <6422> <6425> 13196 <6426> <6426> 5347 <6427> <6429> 13200 <642a> <642a> 3605 <642b> <642b> 13203 <642c> <642c> 1004 <642d> <642d> 1393 <642e> <6433> 13204 <6434> <6434> 5942 <6435> <6435> 13210 <6436> <6436> 8411 <6437> <6439> 13211 <643a> <643a> 3962 <643b> <643c> 13214 <643d> <643d> 1202 <643e> <643e> 13216 <643f> <643f> 6481 <6440> <6440> 13217 <6441> <6441> 5342 <6442> <6443> 13218 <6444> <6444> 3356 <6445> <6445> 5341 <6446> <6446> 997 <6447> <6447> 4136 <6448> <6448> 1120 <6449> <6449> 13220 <644a> <644a> 3586 <644b> <6450> 13221 <6451> <6451> 9056 <6452> <6452> 5338 <6453> <6453> 13227 <6454> <6454> 3481 <6455> <6457> 13228 <6458> <6458> 4427 <6459> <645b> 13231 <645c> <645c> 9057 <645d> <645d> 13234 <645e> <645e> 5349 <645f> <645f> 8256 <6460> <6466> 13235 <6467> <6467> 1376 <6468> <6468> 13242 <6469> <6469> 2825 <646a> <646c> 13243 <646d> <646d> 5351 <646e> <646e> 13246 <646f> <646f> 8846 <6470> <6472> 13247 <6473> <6473> 8159 <6474> <6475> 13250 <6476> <6476> 9054 <6477> <6477> 13252 <6478> <6479> 2819 <647a> <647a> 5353 <647b> <647b> 7786 <647c> <6481> 13253 <6482> <6482> 2581 <6483> <6483> 13259 <6484> <6484> 5350 <6485> <6485> 2334 <6486> <6486> 13260 <6487> <6487> 3025 <6488> <6488> 8194 <6489> <6490> 13261 <6491> <6491> 1258 endcidrange 100 begincidrange <6492> <6492> 3281 <6493> <6493> 8339 <6494> <6494> 13269 <6495> <6495> 3503 <6496> <6496> 5352 <6497> <6498> 13270 <6499> <6499> 5356 <649a> <649d> 13272 <649e> <649e> 4623 <649f> <649f> 9055 <64a0> <64a2> 13276 <64a3> <64a3> 7852 <64a4> <64a4> 1244 <64a5> <64a5> 7764 <64a6> <64a8> 13279 <64a9> <64a9> 2572 <64aa> <64aa> 13282 <64ab> <64ab> 7944 <64ac> <64ac> 3144 <64ad> <64ad> 1132 <64ae> <64ae> 1388 <64af> <64af> 13283 <64b0> <64b0> 4616 <64b1> <64b1> 13284 <64b2> <64b2> 8384 <64b3> <64b3> 9058 <64b4> <64b4> 13285 <64b5> <64b5> 2895 <64b6> <64b6> 13286 <64b7> <64b8> 5354 <64b9> <64b9> 13287 <64ba> <64ba> 5357 <64bb> <64bb> 8544 <64bc> <64bc> 1898 <64bd> <64bd> 13288 <64be> <64be> 8605 <64bf> <64bf> 8078 <64c0> <64c0> 5358 <64c1> <64c1> 8749 <64c2> <64c2> 2505 <64c3> <64c3> 13289 <64c4> <64c4> 8263 <64c5> <64c5> 3324 <64c6> <64c6> 13290 <64c7> <64c7> 8802 <64c8> <64c9> 13291 <64ca> <64ca> 8039 <64cb> <64cb> 7858 <64cc> <64cc> 13293 <64cd> <64cd> 1184 <64ce> <64ce> 3171 <64cf> <64cf> 13294 <64d0> <64d0> 5359 <64d1> <64d1> 13295 <64d2> <64d2> 3161 <64d3> <64d3> 13296 <64d4> <64d4> 7849 <64d5> <64d6> 13297 <64d7> <64d7> 5360 <64d8> <64d8> 6482 <64d9> <64d9> 13299 <64da> <64da> 8140 <64db> <64dd> 13300 <64de> <64de> 3528 <64df> <64df> 13303 <64e0> <64e0> 8050 <64e1> <64e1> 13304 <64e2> <64e2> 5362 <64e3> <64e3> 13305 <64e4> <64e4> 5361 <64e5> <64e5> 13306 <64e6> <64e6> 1160 <64e7> <64eb> 13307 <64ec> <64ec> 8344 <64ed> <64ee> 13312 <64ef> <64ef> 7762 <64f0> <64f0> 8356 <64f1> <64f1> 7964 <64f2> <64f2> 8847 <64f3> <64f3> 13314 <64f4> <64f4> 8173 <64f5> <64f6> 13315 <64f7> <64f7> 9061 <64f8> <64f9> 13317 <64fa> <64fa> 7725 <64fb> <64fb> 8530 <64fc> <64fc> 9062 <64fd> <64fd> 13319 <64fe> <64fe> 8442 <64ff> <64ff> 13320 <6500> <6500> 2955 <6501> <6503> 13321 <6504> <6504> 9059 <6505> <6505> 13324 <6506> <6506> 8346 <6507> <6508> 13325 <6509> <6509> 5363 <650a> <650e> 13327 <650f> <650f> 8252 <6510> <6511> 13332 endcidrange 100 begincidrange <6512> <6512> 4383 <6513> <6513> 13334 <6514> <6514> 8182 <6515> <6515> 13335 <6516> <6516> 9060 <6517> <6517> 13336 <6518> <6518> 3228 <6519> <6519> 7785 <651a> <651a> 13337 <651b> <651b> 9063 <651c> <651c> 13338 <651d> <651d> 8477 <651e> <6521> 13339 <6522> <6522> 8793 <6523> <6523> 8278 <6524> <6524> 8547 <6525> <6525> 5364 <6526> <6529> 13343 <652a> <652a> 8105 <652b> <652b> 2335 <652c> <652c> 8188 <652d> <652d> 13347 <652e> <652e> 5365 <652f> <652f> 4518 <6530> <6533> 13348 <6534> <6534> 6409 <6535> <6535> 6502 <6536> <6536> 3436 <6537> <6537> 13352 <6538> <6538> 4786 <6539> <6539> 1727 <653a> <653a> 13353 <653b> <653b> 1790 <653c> <653d> 13354 <653e> <653e> 1634 <653f> <653f> 4511 <6540> <6544> 13356 <6545> <6545> 1827 <6546> <6547> 13361 <6548> <6548> 3954 <6549> <6549> 7371 <654a> <654b> 13363 <654c> <654c> 1457 <654d> <654e> 13365 <654f> <654f> 2809 <6550> <6550> 13367 <6551> <6551> 2295 <6552> <6554> 13368 <6555> <6555> 6503 <6556> <6556> 968 <6557> <6557> 7726 <6558> <6558> 13371 <6559> <6559> 2205 <655a> <655a> 13372 <655b> <655b> 2555 <655c> <655c> 13373 <655d> <655d> 1087 <655e> <655e> 1229 <655f> <6561> 13374 <6562> <6562> 1741 <6563> <6563> 3291 <6564> <6565> 13377 <6566> <6566> 1559 <6567> <656a> 13379 <656b> <656b> 6504 <656c> <656c> 2275 <656d> <656f> 13383 <6570> <6570> 3476 <6571> <6571> 13386 <6572> <6572> 3136 <6573> <6573> 13387 <6574> <6574> 4508 <6575> <6575> 7868 <6576> <6576> 13388 <6577> <6577> 1680 <6578> <6578> 8514 <6579> <6581> 13389 <6582> <6582> 8222 <6583> <6583> 7747 <6584> <6586> 13398 <6587> <6587> 3795 <6588> <658a> 13401 <658b> <658b> 4428 <658c> <658c> 1116 <658d> <658f> 13404 <6590> <6590> 6593 <6591> <6591> 1002 <6592> <6592> 13407 <6593> <6593> 6595 <6594> <6594> 13408 <6595> <6595> 9428 <6596> <6596> 13409 <6597> <6597> 1526 <6598> <6598> 13410 <6599> <6599> 2584 <659a> <659a> 13411 <659b> <659b> 7510 <659c> <659c> 3964 <659d> <659e> 13412 <659f> <659f> 4486 endcidrange 100 begincidrange <65a0> <65a0> 13414 <65a1> <65a1> 3810 <65a2> <65a3> 13415 <65a4> <65a4> 2240 <65a5> <65a5> 1287 <65a6> <65a6> 13417 <65a7> <65a7> 1702 <65a8> <65a8> 13418 <65a9> <65a9> 4439 <65aa> <65aa> 13419 <65ab> <65ab> 6697 <65ac> <65ac> 8815 <65ad> <65ad> 1550 <65ae> <65ae> 13420 <65af> <65af> 3502 <65b0> <65b0> 3981 <65b1> <65b6> 13421 <65b7> <65b7> 7895 <65b8> <65b8> 13427 <65b9> <65b9> 1626 <65ba> <65bb> 13428 <65bc> <65bc> 6596 <65bd> <65bd> 3392 <65be> <65c0> 13430 <65c1> <65c1> 2965 <65c2> <65c2> 13433 <65c3> <65c3> 6599 <65c4> <65c4> 6598 <65c5> <65c5> 2666 <65c6> <65c6> 6597 <65c7> <65ca> 13434 <65cb> <65cb> 4040 <65cc> <65cc> 6600 <65cd> <65cd> 13438 <65ce> <65ce> 6601 <65cf> <65cf> 4674 <65d0> <65d1> 13439 <65d2> <65d2> 6602 <65d3> <65d5> 13441 <65d6> <65d6> 6603 <65d7> <65d7> 3083 <65d8> <65df> 13444 <65e0> <65e0> 3821 <65e1> <65e1> 13452 <65e2> <65e2> 2107 <65e3> <65e4> 13453 <65e5> <65e5> 3248 <65e6> <65e6> 1418 <65e7> <65e7> 2296 <65e8> <65e8> 4539 <65e9> <65e9> 4394 <65ea> <65eb> 13455 <65ec> <65ec> 4055 <65ed> <65ed> 4028 <65ee> <65f0> 6410 <65f1> <65f1> 1900 <65f2> <65f5> 13457 <65f6> <65f6> 3400 <65f7> <65f7> 2434 <65f8> <65f9> 13461 <65fa> <65fa> 3755 <65fb> <65ff> 13463 <6600> <6600> 6418 <6601> <6601> 13468 <6602> <6602> 965 <6603> <6603> 6416 <6604> <6605> 13469 <6606> <6606> 2448 <6607> <6609> 13471 <660a> <660a> 6413 <660b> <660b> 13474 <660c> <660c> 1220 <660d> <660d> 13475 <660e> <660e> 2812 <660f> <660f> 2045 <6610> <6612> 13476 <6613> <6613> 4190 <6614> <6614> 3843 <6615> <6615> 6417 <6616> <6618> 13479 <6619> <6619> 6414 <661a> <661c> 13482 <661d> <661d> 6421 <661e> <661e> 13485 <661f> <661f> 3986 <6620> <6620> 4248 <6621> <6624> 13486 <6625> <6625> 1341 <6626> <6626> 13490 <6627> <6627> 2758 <6628> <6628> 4687 <6629> <662c> 13491 <662d> <662d> 4466 <662e> <662e> 13495 <662f> <662f> 3422 <6630> <6630> 13496 <6631> <6631> 6423 <6632> <6633> 13497 <6634> <6634> 6422 <6635> <6635> 6425 endcidrange 100 begincidrange <6636> <6636> 6424 <6637> <663b> 13499 <663c> <663c> 4582 <663d> <663d> 13504 <663e> <663e> 3905 <663f> <6640> 13505 <6641> <6641> 6429 <6642> <6642> 8493 <6643> <6643> 2019 <6644> <664a> 13507 <664b> <664b> 2251 <664c> <664c> 3335 <664d> <664e> 13514 <664f> <664f> 6430 <6650> <6651> 13516 <6652> <6652> 3314 <6653> <6653> 3947 <6654> <6654> 6428 <6655> <6655> 4369 <6656> <6656> 6431 <6657> <6657> 6433 <6658> <6659> 13518 <665a> <665a> 3742 <665b> <665c> 13520 <665d> <665d> 8859 <665e> <665e> 13522 <665f> <665f> 6427 <6660> <6660> 13523 <6661> <6661> 6432 <6662> <6663> 13524 <6664> <6664> 3837 <6665> <6665> 13526 <6666> <6666> 2035 <6667> <6667> 13527 <6668> <6668> 1252 <6669> <666d> 13528 <666e> <666e> 3060 <666f> <666f> 2271 <6670> <6670> 3849 <6671> <6673> 13533 <6674> <6674> 3172 <6675> <6675> 13536 <6676> <6676> 2262 <6677> <6677> 6434 <6678> <6679> 13537 <667a> <667a> 4550 <667b> <667d> 13539 <667e> <667e> 2569 <667f> <6681> 13542 <6682> <6682> 4384 <6683> <6683> 13545 <6684> <6684> 6435 <6685> <6686> 13546 <6687> <6687> 3883 <6688> <6688> 8790 <6689> <6689> 9384 <668a> <668b> 13548 <668c> <668c> 6436 <668d> <6690> 13550 <6691> <6691> 3461 <6692> <6695> 13554 <6696> <6696> 2928 <6697> <6697> 960 <6698> <669c> 13558 <669d> <669d> 6438 <669e> <66a1> 13563 <66a2> <66a2> 7801 <66a3> <66a6> 13567 <66a7> <66a7> 6437 <66a8> <66a8> 7389 <66a9> <66aa> 13571 <66ab> <66ab> 8794 <66ac> <66ad> 13573 <66ae> <66ae> 2845 <66af> <66b3> 13575 <66b4> <66b4> 1042 <66b5> <66b8> 13580 <66b9> <66b9> 5979 <66ba> <66bd> 13584 <66be> <66be> 6439 <66bf> <66c3> 13588 <66c4> <66c4> 9383 <66c5> <66c5> 13593 <66c6> <66c6> 9862 <66c7> <66c7> 9382 <66c8> <66c8> 13594 <66c9> <66c9> 8654 <66ca> <66d5> 13595 <66d6> <66d6> 9385 <66d7> <66d8> 13607 <66d9> <66d9> 3462 <66da> <66da> 13609 <66db> <66dc> 6440 <66dd> <66dd> 3063 <66de> <66df> 13610 <66e0> <66e0> 8167 <66e1> <66e5> 13612 <66e6> <66e6> 6442 <66e7> <66e8> 13617 <66e9> <66e9> 6443 endcidrange 100 begincidrange <66ea> <66eb> 13619 <66ec> <66ec> 8466 <66ed> <66ef> 13621 <66f0> <66f0> 4350 <66f1> <66f1> 13624 <66f2> <66f2> 3191 <66f3> <66f3> 4158 <66f4> <66f4> 1783 <66f5> <66f6> 13625 <66f7> <66f7> 6420 <66f8> <66f8> 8508 <66f9> <66f9> 1187 <66fa> <66fb> 13627 <66fc> <66fc> 2723 <66fd> <66fd> 13629 <66fe> <66fe> 4411 <66ff> <66ff> 3641 <6700> <6700> 4683 <6701> <6702> 13630 <6703> <6703> 8028 <6704> <6707> 13632 <6708> <6708> 4357 <6709> <6709> 4277 <670a> <670a> 6515 <670b> <670b> 2996 <670c> <670c> 13636 <670d> <670d> 1691 <670e> <670f> 13637 <6710> <6710> 6532 <6711> <6713> 13639 <6714> <6714> 3500 <6715> <6715> 6542 <6716> <6716> 13642 <6717> <6717> 2485 <6718> <671a> 13643 <671b> <671b> 3756 <671c> <671c> 13646 <671d> <671d> 1236 <671e> <671e> 13647 <671f> <671f> 3065 <6720> <6725> 13648 <6726> <6726> 6572 <6727> <6727> 9412 <6728> <6728> 2849 <6729> <6729> 13654 <672a> <672a> 3779 <672b> <672b> 2828 <672c> <672c> 1063 <672d> <672d> 4416 <672e> <672e> 13655 <672f> <672f> 3468 <6730> <6730> 13656 <6731> <6731> 4587 <6732> <6733> 13657 <6734> <6734> 3058 <6735> <6735> 1571 <6736> <6739> 13659 <673a> <673a> 2063 <673b> <673c> 13663 <673d> <673d> 4011 <673e> <673f> 13665 <6740> <6740> 3306 <6741> <6741> 13667 <6742> <6742> 4374 <6743> <6743> 3203 <6744> <6745> 13668 <6746> <6746> 1734 <6747> <6747> 13670 <6748> <6748> 6228 <6749> <6749> 3317 <674a> <674b> 13671 <674c> <674c> 6225 <674d> <674d> 13673 <674e> <674e> 2521 <674f> <674f> 3998 <6750> <6750> 1163 <6751> <6751> 1384 <6752> <6752> 13674 <6753> <6753> 6226 <6754> <6755> 13675 <6756> <6756> 4457 <6757> <675b> 13677 <675c> <675c> 1540 <675d> <675d> 13682 <675e> <675e> 6227 <675f> <675f> 3471 <6760> <6760> 1751 <6761> <6761> 3656 <6762> <6764> 13683 <6765> <6765> 2463 <6766> <6767> 13686 <6768> <6768> 4119 <6769> <6769> 6229 <676a> <676a> 6232 <676b> <676c> 13688 <676d> <676d> 1907 <676e> <676e> 13690 <676f> <676f> 1046 <6770> <6770> 2221 <6771> <6771> 7884 endcidrange 100 begincidrange <6772> <6772> 6415 <6773> <6773> 6233 <6774> <6774> 13691 <6775> <6775> 6236 <6776> <6776> 13692 <6777> <6777> 6241 <6778> <677b> 13693 <677c> <677c> 6242 <677d> <677d> 13697 <677e> <677e> 3518 <677f> <677f> 1008 <6780> <6780> 13698 <6781> <6781> 2078 <6782> <6783> 13699 <6784> <6784> 1810 <6785> <6786> 13701 <6787> <6787> 6231 <6788> <6788> 13703 <6789> <6789> 3752 <678a> <678a> 13704 <678b> <678b> 6240 <678c> <678f> 13705 <6790> <6790> 3845 <6791> <6794> 13709 <6795> <6795> 4494 <6796> <6796> 13713 <6797> <6797> 2591 <6798> <6798> 6234 <6799> <6799> 13714 <679a> <679a> 2747 <679b> <679b> 13715 <679c> <679c> 1876 <679d> <679d> 4517 <679e> <679e> 6238 <679f> <67a1> 13716 <67a2> <67a2> 3447 <67a3> <67a3> 4393 <67a4> <67a4> 13719 <67a5> <67a5> 6230 <67a6> <67a6> 13720 <67a7> <67a7> 6235 <67a8> <67a8> 6237 <67a9> <67a9> 13721 <67aa> <67aa> 3126 <67ab> <67ab> 1664 <67ac> <67ac> 13722 <67ad> <67ad> 6239 <67ae> <67ae> 13723 <67af> <67af> 2410 <67b0> <67b0> 6248 <67b1> <67b2> 13724 <67b3> <67b3> 6253 <67b4> <67b4> 13726 <67b5> <67b5> 6251 <67b6> <67b6> 2127 <67b7> <67b7> 2114 <67b8> <67b8> 6257 <67b9> <67c0> 13727 <67c1> <67c1> 6260 <67c2> <67c2> 13735 <67c3> <67c3> 6256 <67c4> <67c4> 1123 <67c5> <67ce> 13736 <67cf> <67cf> 995 <67d0> <67d0> 2838 <67d1> <67d1> 1735 <67d2> <67d2> 3073 <67d3> <67d3> 3225 <67d4> <67d4> 3260 <67d5> <67d7> 13746 <67d8> <67d8> 6245 <67d9> <67d9> 6250 <67da> <67da> 6252 <67db> <67db> 13749 <67dc> <67dc> 1866 <67dd> <67dd> 6254 <67de> <67de> 4690 <67df> <67df> 13750 <67e0> <67e0> 2910 <67e1> <67e1> 13751 <67e2> <67e2> 6258 <67e3> <67e4> 13752 <67e5> <67e5> 1200 <67e6> <67e8> 13754 <67e9> <67e9> 6247 <67ea> <67eb> 13757 <67ec> <67ec> 2144 <67ed> <67ee> 13759 <67ef> <67ef> 2383 <67f0> <67f0> 6243 <67f1> <67f1> 4600 <67f2> <67f2> 13761 <67f3> <67f3> 2625 <67f4> <67f4> 1208 <67f5> <67fc> 13762 <67fd> <67fd> 6261 <67fe> <67fe> 13770 <67ff> <67ff> 3416 <6800> <6800> 6255 <6801> <6804> 13771 endcidrange 100 begincidrange <6805> <6805> 4421 <6806> <6806> 13775 <6807> <6807> 1107 <6808> <6808> 4444 <6809> <6809> 6244 <680a> <680a> 6246 <680b> <680b> 1519 <680c> <680c> 6249 <680d> <680d> 13776 <680e> <680e> 6259 <680f> <680f> 2467 <6810> <6810> 13777 <6811> <6811> 3470 <6812> <6812> 13778 <6813> <6813> 3485 <6814> <6815> 13779 <6816> <6816> 3067 <6817> <6817> 2528 <6818> <681c> 13781 <681d> <681d> 6271 <681e> <6820> 13786 <6821> <6821> 3950 <6822> <6828> 13789 <6829> <6829> 6280 <682a> <682a> 4585 <682b> <6831> 13796 <6832> <6833> 6262 <6834> <6836> 13803 <6837> <6837> 4130 <6838> <6838> 1922 <6839> <6839> 1780 <683a> <683b> 13806 <683c> <683c> 1772 <683d> <683d> 4375 <683e> <683e> 6277 <683f> <683f> 13808 <6840> <6840> 6276 <6841> <6841> 6274 <6842> <6842> 1865 <6843> <6843> 3621 <6844> <6844> 6268 <6845> <6845> 3765 <6846> <6846> 2431 <6847> <6847> 13809 <6848> <6848> 963 <6849> <6849> 6279 <684a> <684a> 6278 <684b> <684b> 13810 <684c> <684c> 4637 <684d> <684d> 13811 <684e> <684e> 6266 <684f> <684f> 13812 <6850> <6850> 3674 <6851> <6851> 3292 <6852> <6852> 13813 <6853> <6853> 1997 <6854> <6854> 2220 <6855> <6855> 6272 <6856> <685f> 13814 <6860> <6861> 6264 <6862> <6862> 6267 <6863> <6863> 1430 <6864> <6864> 6269 <6865> <6865> 3138 <6866> <6866> 6273 <6867> <6867> 6275 <6868> <6868> 2177 <6869> <6869> 4619 <686a> <686a> 13824 <686b> <686b> 6286 <686c> <6873> 13825 <6874> <6874> 6283 <6875> <6875> 13833 <6876> <6876> 3681 <6877> <6877> 6284 <6878> <6880> 13834 <6881> <6881> 2563 <6882> <6882> 13843 <6883> <6883> 6270 <6884> <6884> 13844 <6885> <6885> 2748 <6886> <6886> 1019 <6887> <688e> 13845 <688f> <688f> 6282 <6890> <6892> 13853 <6893> <6893> 6285 <6894> <6896> 13856 <6897> <6897> 1788 <6898> <6898> 9322 <6899> <689c> 13859 <689d> <689d> 8565 <689e> <689e> 13863 <689f> <689f> 9325 <68a0> <68a1> 13864 <68a2> <68a2> 3339 <68a3> <68a5> 13866 <68a6> <68a6> 2771 <68a7> <68a7> 3823 <68a8> <68a8> 2513 <68a9> <68ac> 13869 endcidrange 100 begincidrange <68ad> <68ad> 3560 <68ae> <68ae> 13873 <68af> <68af> 3632 <68b0> <68b0> 3968 <68b1> <68b2> 13874 <68b3> <68b3> 3448 <68b4> <68b4> 13876 <68b5> <68b5> 6281 <68b6> <68bf> 13877 <68c0> <68c0> 2143 <68c1> <68c1> 13887 <68c2> <68c2> 6287 <68c3> <68c8> 13888 <68c9> <68c9> 2787 <68ca> <68ca> 13894 <68cb> <68cb> 3076 <68cc> <68cc> 13895 <68cd> <68cd> 1872 <68ce> <68d1> 13896 <68d2> <68d2> 1023 <68d3> <68d4> 13900 <68d5> <68d5> 4661 <68d6> <68d6> 9323 <68d7> <68d7> 8799 <68d8> <68d8> 2079 <68d9> <68d9> 13902 <68da> <68da> 2992 <68db> <68de> 13903 <68df> <68df> 7886 <68e0> <68e0> 3607 <68e1> <68e2> 13907 <68e3> <68e3> 6298 <68e4> <68e6> 13909 <68e7> <68e7> 8818 <68e8> <68ed> 13912 <68ee> <68ee> 3302 <68ef> <68ef> 13918 <68f0> <68f0> 6294 <68f1> <68f1> 2509 <68f2> <68f4> 13919 <68f5> <68f5> 2384 <68f6> <68f8> 13922 <68f9> <68f9> 6292 <68fa> <68fa> 1840 <68fb> <68fb> 13925 <68fc> <68fc> 6289 <68fd> <68ff> 13926 <6900> <6900> 13929 <6901> <6901> 6296 <6902> <6904> 13930 <6905> <6905> 4181 <6906> <690a> 13933 <690b> <690b> 6295 <690c> <690c> 13938 <690d> <690d> 4529 <690e> <690e> 4626 <690f> <690f> 9331 <6910> <6910> 6299 <6911> <6911> 13939 <6912> <6912> 2184 <6913> <691e> 13940 <691f> <6920> 6290 <6921> <6923> 13952 <6924> <6924> 6293 <6925> <692c> 13955 <692d> <692d> 3719 <692e> <692f> 13963 <6930> <6930> 4147 <6931> <6933> 13965 <6934> <6934> 6310 <6935> <6938> 13968 <6939> <6939> 6301 <693a> <693c> 13972 <693d> <693d> 1325 <693e> <693e> 13975 <693f> <693f> 1342 <6940> <6941> 13976 <6942> <6942> 6303 <6943> <6949> 13978 <694a> <694a> 8702 <694b> <6952> 13985 <6953> <6953> 7934 <6954> <6954> 3955 <6955> <6956> 13993 <6957> <6957> 6297 <6958> <6959> 13995 <695a> <695a> 1315 <695b> <695c> 13997 <695d> <695d> 6304 <695e> <695e> 2510 <695f> <695f> 13999 <6960> <6960> 6302 <6961> <6962> 14000 <6963> <6963> 6317 <6964> <6965> 14002 <6966> <6966> 6316 <6967> <6967> 14004 <6968> <6968> 9333 <6969> <696a> 14005 <696b> <696b> 6306 endcidrange 100 begincidrange <696c> <696c> 14007 <696d> <696d> 8714 <696e> <696e> 6288 <696f> <6970> 14008 <6971> <6971> 6300 <6972> <6974> 14010 <6975> <6975> 8047 <6976> <6976> 14013 <6977> <6977> 2361 <6978> <6978> 6309 <6979> <6979> 6318 <697a> <697b> 14014 <697c> <697c> 2636 <697d> <697f> 14016 <6980> <6980> 6307 <6981> <6981> 14019 <6982> <6982> 1728 <6983> <6983> 14020 <6984> <6984> 6305 <6985> <6985> 14021 <6986> <6986> 4289 <6987> <6988> 6312 <6989> <6989> 6315 <698a> <698c> 14022 <698d> <698d> 6331 <698e> <6993> 14025 <6994> <6994> 2481 <6995> <6995> 6329 <6996> <6997> 14031 <6998> <6998> 6308 <6999> <699a> 14033 <699b> <699b> 6319 <699c> <699c> 1020 <699d> <69a6> 14035 <69a7> <69a7> 6320 <69a8> <69a8> 4422 <69a9> <69a9> 14045 <69aa> <69aa> 9320 <69ab> <69ab> 6322 <69ac> <69ac> 14046 <69ad> <69ad> 6323 <69ae> <69ae> 8448 <69af> <69b0> 14047 <69b1> <69b1> 6325 <69b2> <69b3> 14049 <69b4> <69b4> 2618 <69b5> <69b6> 14051 <69b7> <69b7> 3217 <69b8> <69ba> 14053 <69bb> <69bb> 6321 <69bc> <69be> 14056 <69bf> <69bf> 9334 <69c0> <69c0> 14059 <69c1> <69c1> 6326 <69c2> <69c9> 14060 <69ca> <69ca> 6327 <69cb> <69cb> 7975 <69cc> <69cc> 6311 <69cd> <69cd> 8407 <69ce> <69ce> 6314 <69cf> <69cf> 14068 <69d0> <69d0> 1990 <69d1> <69d3> 14069 <69d4> <69d4> 6324 <69d5> <69da> 14072 <69db> <69db> 2154 <69dc> <69de> 14078 <69df> <69df> 6328 <69e0> <69e0> 6330 <69e1> <69e6> 14081 <69e7> <69e7> 9340 <69e8> <69ec> 14087 <69ed> <69ed> 6334 <69ee> <69f1> 14092 <69f2> <69f2> 6338 <69f3> <69f3> 8097 <69f4> <69fc> 14096 <69fd> <69fd> 1186 <69fe> <69fe> 14105 <69ff> <69ff> 6332 <6a00> <6a00> 14106 <6a01> <6a01> 8874 <6a02> <6a02> 8197 <6a03> <6a04> 14107 <6a05> <6a05> 9324 <6a06> <6a09> 14109 <6a0a> <6a0a> 1611 <6a0b> <6a12> 14113 <6a13> <6a13> 8254 <6a14> <6a16> 14121 <6a17> <6a18> 6335 <6a19> <6a19> 7756 <6a1a> <6a1d> 14124 <6a1e> <6a1e> 8506 <6a1f> <6a1f> 4450 <6a20> <6a20> 14128 <6a21> <6a21> 2822 <6a22> <6a22> 14129 <6a23> <6a23> 8708 <6a24> <6a27> 14130 endcidrange 100 begincidrange <6a28> <6a28> 6348 <6a29> <6a29> 14134 <6a2a> <6a2a> 1944 <6a2b> <6a2e> 14135 <6a2f> <6a2f> 6333 <6a30> <6a30> 14139 <6a31> <6a31> 4232 <6a32> <6a34> 14140 <6a35> <6a35> 6344 <6a36> <6a37> 14143 <6a38> <6a38> 8387 <6a39> <6a39> 8512 <6a3a> <6a3a> 9335 <6a3b> <6a3c> 14145 <6a3d> <6a3d> 6347 <6a3e> <6a3e> 6340 <6a3f> <6a43> 14147 <6a44> <6a44> 6339 <6a45> <6a46> 14152 <6a47> <6a47> 3134 <6a48> <6a48> 9332 <6a49> <6a4a> 14154 <6a4b> <6a4b> 8413 <6a4c> <6a4f> 14156 <6a50> <6a50> 6342 <6a51> <6a57> 14160 <6a58> <6a58> 6349 <6a59> <6a59> 1261 <6a5a> <6a5a> 14167 <6a5b> <6a5b> 6343 <6a5c> <6a5e> 14168 <6a5f> <6a5f> 8040 <6a60> <6a60> 14171 <6a61> <6a61> 3933 <6a62> <6a62> 8581 <6a63> <6a64> 14172 <6a65> <6a65> 6337 <6a66> <6a70> 14174 <6a71> <6a71> 1308 <6a72> <6a78> 14185 <6a79> <6a79> 6346 <6a7a> <6a7b> 14192 <6a7c> <6a7c> 6350 <6a7d> <6a7f> 14194 <6a80> <6a80> 3591 <6a81> <6a83> 14197 <6a84> <6a84> 3866 <6a85> <6a88> 14200 <6a89> <6a89> 9330 <6a8a> <6a8d> 14204 <6a8e> <6a8e> 6345 <6a8f> <6a8f> 14208 <6a90> <6a90> 6352 <6a91> <6a91> 6351 <6a92> <6a93> 14209 <6a94> <6a94> 7861 <6a95> <6a96> 14211 <6a97> <6a97> 6354 <6a98> <6a9b> 14213 <6a9c> <6a9c> 9336 <6a9d> <6a9f> 14217 <6aa0> <6aa0> 6341 <6aa1> <6aa1> 14220 <6aa2> <6aa2> 8075 <6aa3> <6aa3> 9348 <6aa4> <6aa8> 14221 <6aa9> <6aa9> 6353 <6aaa> <6aaa> 14226 <6aab> <6aab> 6355 <6aac> <6aac> 2767 <6aad> <6aae> 14227 <6aaf> <6aaf> 9881 <6ab0> <6ab2> 14229 <6ab3> <6ab3> 9346 <6ab4> <6ab7> 14232 <6ab8> <6ab8> 8353 <6ab9> <6aba> 14236 <6abb> <6abb> 8082 <6abc> <6ac2> 14238 <6ac3> <6ac3> 7992 <6ac4> <6ad2> 14245 <6ad3> <6ad3> 9349 <6ad4> <6ad9> 14260 <6ada> <6ada> 9344 <6adb> <6adb> 9326 <6adc> <6adc> 14266 <6add> <6add> 9339 <6ade> <6ade> 9350 <6adf> <6adf> 9329 <6ae0> <6ae6> 14267 <6ae7> <6ae7> 9347 <6ae8> <6ae8> 9328 <6ae9> <6ae9> 14274 <6aea> <6aea> 9321 <6aeb> <6aeb> 14275 <6aec> <6aec> 9343 <6aed> <6af2> 14276 <6af3> <6af3> 9327 <6af4> <6af7> 14282 <6af8> <6af8> 9345 endcidrange 100 begincidrange <6af9> <6afa> 14286 <6afb> <6afb> 8736 <6afc> <6aff> 14288 <6b00> <6b03> 14292 <6b04> <6b04> 8181 <6b05> <6b09> 14296 <6b0a> <6b0a> 8436 <6b0b> <6b0e> 14301 <6b0f> <6b0f> 9341 <6b10> <6b11> 14305 <6b12> <6b12> 9337 <6b13> <6b15> 14307 <6b16> <6b16> 9342 <6b17> <6b1d> 14310 <6b1e> <6b1e> 9338 <6b1f> <6b1f> 14317 <6b20> <6b20> 3124 <6b21> <6b21> 1361 <6b22> <6b22> 1995 <6b23> <6b23> 3979 <6b24> <6b24> 6577 <6b25> <6b26> 14318 <6b27> <6b27> 2936 <6b28> <6b31> 14320 <6b32> <6b32> 4320 <6b33> <6b36> 14330 <6b37> <6b37> 6578 <6b38> <6b38> 14334 <6b39> <6b39> 6579 <6b3a> <6b3a> 3066 <6b3b> <6b3c> 14335 <6b3d> <6b3d> 8419 <6b3e> <6b3e> 2427 <6b3f> <6b42> 14337 <6b43> <6b43> 6580 <6b44> <6b45> 14341 <6b46> <6b46> 6581 <6b47> <6b47> 3957 <6b48> <6b48> 14343 <6b49> <6b49> 3125 <6b4a> <6b4b> 14344 <6b4c> <6b4c> 1763 <6b4d> <6b4f> 14346 <6b50> <6b50> 8365 <6b51> <6b58> 14349 <6b59> <6b59> 6582 <6b5a> <6b5e> 14357 <6b5f> <6b5f> 9419 <6b60> <6b60> 14362 <6b61> <6b61> 8019 <6b62> <6b62> 4536 <6b63> <6b63> 4510 <6b64> <6b64> 1358 <6b65> <6b65> 1156 <6b66> <6b66> 3827 <6b67> <6b67> 3078 <6b68> <6b69> 14363 <6b6a> <6b6a> 3730 <6b6b> <6b71> 14365 <6b72> <6b72> 8537 <6b73> <6b76> 14372 <6b77> <6b77> 8211 <6b78> <6b78> 7987 <6b79> <6b79> 1400 <6b7a> <6b7a> 14376 <6b7b> <6b7b> 3509 <6b7c> <6b7c> 2130 <6b7d> <6b80> 14377 <6b81> <6b82> 6358 <6b83> <6b83> 4115 <6b84> <6b84> 6361 <6b85> <6b85> 14381 <6b86> <6b86> 1404 <6b87> <6b87> 6360 <6b88> <6b88> 14382 <6b89> <6b89> 4060 <6b8a> <6b8a> 3449 <6b8b> <6b8b> 1175 <6b8c> <6b8c> 14383 <6b8d> <6b8d> 6364 <6b8e> <6b91> 14384 <6b92> <6b93> 6362 <6b94> <6b95> 14388 <6b96> <6b96> 4530 <6b97> <6b97> 14390 <6b98> <6b98> 7772 <6b99> <6b99> 14391 <6b9a> <6b9b> 6365 <6b9c> <6b9d> 14392 <6b9e> <6b9e> 9352 <6b9f> <6ba0> 14394 <6ba1> <6ba1> 6367 <6ba2> <6ba3> 14396 <6ba4> <6ba4> 9351 <6ba5> <6ba9> 14398 <6baa> <6baa> 6368 <6bab> <6bab> 9354 <6bac> <6bad> 14403 <6bae> <6bae> 9353 <6baf> <6baf> 9355 endcidrange 100 begincidrange <6bb0> <6bb1> 14405 <6bb2> <6bb2> 8067 <6bb3> <6bb3> 6589 <6bb4> <6bb4> 2938 <6bb5> <6bb5> 1549 <6bb6> <6bb6> 14407 <6bb7> <6bb7> 4218 <6bb8> <6bb9> 14408 <6bba> <6bba> 8463 <6bbb> <6bbb> 8155 <6bbc> <6bbe> 14410 <6bbf> <6bbf> 1487 <6bc0> <6bc0> 14413 <6bc1> <6bc1> 2030 <6bc2> <6bc2> 6591 <6bc3> <6bc4> 14414 <6bc5> <6bc5> 4202 <6bc6> <6bc6> 8367 <6bc7> <6bca> 14416 <6bcb> <6bcb> 3826 <6bcc> <6bcc> 14420 <6bcd> <6bcd> 2843 <6bce> <6bce> 14421 <6bcf> <6bcf> 2756 <6bd0> <6bd1> 14422 <6bd2> <6bd2> 1533 <6bd3> <6bd3> 4719 <6bd4> <6bd4> 1073 <6bd5> <6bd5> 1080 <6bd6> <6bd6> 1082 <6bd7> <6bd7> 3007 <6bd8> <6bd8> 14424 <6bd9> <6bd9> 1081 <6bda> <6bda> 14425 <6bdb> <6bdb> 2736 <6bdc> <6be0> 14426 <6be1> <6be1> 4434 <6be2> <6be9> 14431 <6bea> <6bea> 6484 <6beb> <6beb> 1912 <6bec> <6bee> 14439 <6bef> <6bef> 3597 <6bf0> <6bf2> 14442 <6bf3> <6bf3> 6485 <6bf4> <6bf4> 14445 <6bf5> <6bf5> 6487 <6bf6> <6bf8> 14446 <6bf9> <6bf9> 6488 <6bfa> <6bfc> 14449 <6bfd> <6bfd> 6486 <6bfe> <6bfe> 14452 <6bff> <6bff> 9408 <6c00> <6c04> 14453 <6c05> <6c05> 6489 <6c06> <6c06> 6491 <6c07> <6c07> 6490 <6c08> <6c08> 8813 <6c09> <6c0b> 14458 <6c0c> <6c0c> 9409 <6c0d> <6c0d> 6492 <6c0e> <6c0e> 14461 <6c0f> <6c0f> 3430 <6c10> <6c10> 4715 <6c11> <6c11> 2806 <6c12> <6c12> 14462 <6c13> <6c13> 2730 <6c14> <6c14> 3095 <6c15> <6c15> 6493 <6c16> <6c16> 2861 <6c17> <6c17> 14463 <6c18> <6c1a> 6494 <6c1b> <6c1b> 1650 <6c1c> <6c1e> 14464 <6c1f> <6c1f> 1687 <6c20> <6c20> 14467 <6c21> <6c21> 6497 <6c22> <6c22> 3167 <6c23> <6c23> 8394 <6c24> <6c24> 6499 <6c25> <6c25> 14468 <6c26> <6c26> 1883 <6c27> <6c27> 4126 <6c28> <6c28> 956 <6c29> <6c29> 6498 <6c2a> <6c2a> 6500 <6c2b> <6c2b> 8423 <6c2c> <6c2c> 9410 <6c2d> <6c2d> 14469 <6c2e> <6c2e> 1419 <6c2f> <6c2f> 2671 <6c30> <6c30> 3173 <6c31> <6c31> 14470 <6c32> <6c32> 6501 <6c33> <6c33> 14471 <6c34> <6c34> 3491 <6c35> <6c35> 5791 <6c36> <6c37> 14472 <6c38> <6c38> 4261 <6c39> <6c3c> 14474 <6c3d> <6c3d> 4847 endcidrange 100 begincidrange <6c3e> <6c3f> 14478 <6c40> <6c40> 3666 <6c41> <6c41> 4524 <6c42> <6c42> 3184 <6c43> <6c45> 14480 <6c46> <6c46> 4852 <6c47> <6c47> 2040 <6c48> <6c48> 14483 <6c49> <6c49> 1905 <6c4a> <6c4a> 5794 <6c4b> <6c4f> 14484 <6c50> <6c50> 3864 <6c51> <6c53> 14489 <6c54> <6c54> 5792 <6c55> <6c55> 3328 <6c56> <6c56> 14492 <6c57> <6c57> 1904 <6c58> <6c5a> 14493 <6c5b> <6c5b> 4061 <6c5c> <6c5c> 5793 <6c5d> <6c5d> 3269 <6c5e> <6c5e> 1800 <6c5f> <6c5f> 2174 <6c60> <6c60> 1277 <6c61> <6c61> 3818 <6c62> <6c63> 14496 <6c64> <6c64> 3603 <6c65> <6c67> 14498 <6c68> <6c69> 5800 <6c6a> <6c6a> 3749 <6c6b> <6c6f> 14501 <6c70> <6c70> 3584 <6c71> <6c71> 14506 <6c72> <6c72> 2086 <6c73> <6c73> 14507 <6c74> <6c74> 5802 <6c75> <6c75> 14508 <6c76> <6c76> 5803 <6c77> <6c78> 14509 <6c79> <6c79> 4005 <6c7a> <6c7c> 14511 <6c7d> <6c7d> 3098 <6c7e> <6c7e> 1655 <6c7f> <6c80> 14514 <6c81> <6c81> 3164 <6c82> <6c82> 4177 <6c83> <6c83> 3813 <6c84> <6c84> 14516 <6c85> <6c85> 5796 <6c86> <6c86> 5804 <6c87> <6c87> 14517 <6c88> <6c88> 3371 <6c89> <6c89> 1254 <6c8a> <6c8b> 14518 <6c8c> <6c8c> 5799 <6c8d> <6c8e> 14520 <6c8f> <6c8f> 3074 <6c90> <6c90> 5797 <6c91> <6c92> 14522 <6c93> <6c93> 6687 <6c94> <6c94> 5798 <6c95> <6c98> 14524 <6c99> <6c99> 3308 <6c9a> <6c9a> 14528 <6c9b> <6c9b> 2983 <6c9c> <6c9e> 14529 <6c9f> <6c9f> 1806 <6ca0> <6ca0> 14532 <6ca1> <6ca1> 2752 <6ca2> <6ca2> 14533 <6ca3> <6ca3> 5795 <6ca4> <6ca4> 2942 <6ca5> <6ca5> 2541 <6ca6> <6ca6> 2688 <6ca7> <6ca7> 1182 <6ca8> <6ca8> 14534 <6ca9> <6ca9> 5805 <6caa> <6caa> 1979 <6cab> <6cab> 2832 <6cac> <6cac> 14535 <6cad> <6cad> 5808 <6cae> <6cae> 2313 <6caf> <6cb0> 14536 <6cb1> <6cb1> 5819 <6cb2> <6cb2> 5813 <6cb3> <6cb3> 1930 <6cb4> <6cb7> 14538 <6cb8> <6cb8> 1645 <6cb9> <6cb9> 4274 <6cba> <6cba> 14542 <6cbb> <6cbb> 4557 <6cbc> <6cbc> 4468 <6cbd> <6cbd> 1818 <6cbe> <6cbe> 4437 <6cbf> <6cbf> 4097 <6cc0> <6cc3> 14543 <6cc4> <6cc4> 3972 <6cc5> <6cc5> 3187 <6cc6> <6cc8> 14547 <6cc9> <6cc9> 3205 endcidrange 100 begincidrange <6cca> <6cca> 1147 <6ccb> <6ccb> 14550 <6ccc> <6ccc> 2783 <6ccd> <6ccf> 14551 <6cd0> <6cd0> 5806 <6cd1> <6cd2> 14554 <6cd3> <6cd3> 5820 <6cd4> <6cd4> 5807 <6cd5> <6cd5> 1605 <6cd6> <6cd6> 5815 <6cd7> <6cd7> 5812 <6cd8> <6cda> 14556 <6cdb> <6cdb> 1623 <6cdc> <6cdd> 14559 <6cde> <6cde> 2915 <6cdf> <6cdf> 14561 <6ce0> <6ce0> 5814 <6ce1> <6ce1> 2974 <6ce2> <6ce2> 1135 <6ce3> <6ce3> 3099 <6ce4> <6ce4> 14562 <6ce5> <6ce5> 2883 <6ce6> <6ce7> 14563 <6ce8> <6ce8> 4607 <6ce9> <6ce9> 14565 <6cea> <6cea> 2508 <6ceb> <6ceb> 5817 <6cec> <6ced> 14566 <6cee> <6cee> 5818 <6cef> <6cef> 5821 <6cf0> <6cf0> 3580 <6cf1> <6cf1> 5811 <6cf2> <6cf2> 14568 <6cf3> <6cf3> 4259 <6cf4> <6cf4> 14569 <6cf5> <6cf5> 1068 <6cf6> <6cf6> 6688 <6cf7> <6cf8> 5809 <6cf9> <6cf9> 14570 <6cfa> <6cfa> 5816 <6cfb> <6cfb> 3973 <6cfc> <6cfc> 3042 <6cfd> <6cfd> 4406 <6cfe> <6cfe> 5822 <6cff> <6cff> 14571 <6d00> <6d00> 14572 <6d01> <6d01> 2225 <6d02> <6d03> 14573 <6d04> <6d04> 5829 <6d05> <6d06> 14575 <6d07> <6d07> 5828 <6d08> <6d0a> 14577 <6d0b> <6d0b> 4124 <6d0c> <6d0c> 5825 <6d0d> <6d0d> 14580 <6d0e> <6d0e> 5831 <6d0f> <6d11> 14581 <6d12> <6d12> 3282 <6d13> <6d16> 14584 <6d17> <6d17> 3873 <6d18> <6d18> 14588 <6d19> <6d19> 5830 <6d1a> <6d1a> 5836 <6d1b> <6d1b> 2700 <6d1c> <6d1d> 14589 <6d1e> <6d1e> 1523 <6d1f> <6d24> 14591 <6d25> <6d25> 2243 <6d26> <6d26> 14597 <6d27> <6d27> 5824 <6d28> <6d29> 14598 <6d2a> <6d2a> 1952 <6d2b> <6d2b> 5832 <6d2c> <6d2d> 14600 <6d2e> <6d2e> 5834 <6d2f> <6d30> 14602 <6d31> <6d31> 1596 <6d32> <6d32> 4573 <6d33> <6d33> 5840 <6d34> <6d34> 14604 <6d35> <6d35> 5835 <6d36> <6d38> 14605 <6d39> <6d39> 5823 <6d3a> <6d3a> 14608 <6d3b> <6d3b> 2051 <6d3c> <6d3c> 3726 <6d3d> <6d3d> 3103 <6d3e> <6d3e> 2954 <6d3f> <6d40> 14609 <6d41> <6d41> 2624 <6d42> <6d42> 14611 <6d43> <6d43> 5826 <6d44> <6d44> 14612 <6d45> <6d45> 3120 <6d46> <6d46> 2173 <6d47> <6d47> 2190 <6d48> <6d48> 5827 <6d49> <6d49> 14613 <6d4a> <6d4a> 4644 <6d4b> <6d4b> 1193 endcidrange 100 begincidrange <6d4c> <6d4c> 14614 <6d4d> <6d4d> 5833 <6d4e> <6d4e> 2102 <6d4f> <6d4f> 5837 <6d50> <6d50> 14615 <6d51> <6d51> 2048 <6d52> <6d52> 5838 <6d53> <6d53> 2921 <6d54> <6d54> 5839 <6d55> <6d58> 14616 <6d59> <6d59> 4484 <6d5a> <6d5a> 2352 <6d5b> <6d5b> 14620 <6d5c> <6d5c> 5848 <6d5d> <6d5d> 14621 <6d5e> <6d5e> 5845 <6d5f> <6d5f> 14622 <6d60> <6d60> 5849 <6d61> <6d62> 14623 <6d63> <6d63> 5851 <6d64> <6d65> 14625 <6d66> <6d66> 3061 <6d67> <6d68> 14627 <6d69> <6d69> 1917 <6d6a> <6d6a> 2486 <6d6b> <6d6d> 14629 <6d6e> <6d6e> 1692 <6d6f> <6d6f> 5842 <6d70> <6d73> 14632 <6d74> <6d74> 4324 <6d75> <6d76> 14636 <6d77> <6d77> 1882 <6d78> <6d78> 2255 <6d79> <6d79> 9180 <6d7a> <6d7b> 14638 <6d7c> <6d7c> 5850 <6d7d> <6d81> 14640 <6d82> <6d82> 3696 <6d83> <6d84> 14645 <6d85> <6d85> 2908 <6d86> <6d86> 14647 <6d87> <6d87> 9179 <6d88> <6d88> 3944 <6d89> <6d89> 3359 <6d8a> <6d8b> 14648 <6d8c> <6d8c> 4260 <6d8d> <6d8d> 14650 <6d8e> <6d8e> 3902 <6d8f> <6d90> 14651 <6d91> <6d91> 5841 <6d92> <6d92> 14653 <6d93> <6d94> 5846 <6d95> <6d95> 3644 <6d96> <6d9a> 14654 <6d9b> <6d9b> 3617 <6d9c> <6d9c> 14659 <6d9d> <6d9d> 2495 <6d9e> <6d9e> 5843 <6d9f> <6d9f> 2553 <6da0> <6da0> 5844 <6da1> <6da1> 3807 <6da2> <6da2> 14660 <6da3> <6da3> 2006 <6da4> <6da4> 1460 <6da5> <6da5> 14661 <6da6> <6da6> 3278 <6da7> <6da7> 2168 <6da8> <6da8> 4456 <6da9> <6da9> 3301 <6daa> <6daa> 1693 <6dab> <6dab> 5864 <6dac> <6dad> 14662 <6dae> <6dae> 5866 <6daf> <6daf> 4077 <6db0> <6db1> 14664 <6db2> <6db2> 4161 <6db3> <6db4> 14666 <6db5> <6db5> 1892 <6db6> <6db7> 14668 <6db8> <6db8> 1931 <6db9> <6dbe> 14670 <6dbf> <6dbf> 5857 <6dc0> <6dc0> 1486 <6dc1> <6dc3> 14676 <6dc4> <6dc4> 4650 <6dc5> <6dc5> 5854 <6dc6> <6dc6> 3946 <6dc7> <6dc7> 5853 <6dc8> <6dca> 14679 <6dcb> <6dcb> 2597 <6dcc> <6dcc> 3613 <6dcd> <6dd0> 14682 <6dd1> <6dd1> 3454 <6dd2> <6dd5> 14686 <6dd6> <6dd6> 2874 <6dd7> <6dd7> 14690 <6dd8> <6dd8> 3623 <6dd9> <6dd9> 5862 <6dda> <6ddc> 14691 <6ddd> <6ddd> 5861 endcidrange 100 begincidrange <6dde> <6dde> 5855 <6ddf> <6ddf> 14694 <6de0> <6de0> 5858 <6de1> <6de1> 1422 <6de2> <6de3> 14695 <6de4> <6de4> 4286 <6de5> <6de5> 14697 <6de6> <6de6> 5860 <6de7> <6de9> 14698 <6dea> <6dea> 8286 <6deb> <6deb> 4224 <6dec> <6dec> 1382 <6ded> <6ded> 14701 <6dee> <6dee> 1993 <6def> <6df0> 14702 <6df1> <6df1> 3367 <6df2> <6df2> 14704 <6df3> <6df3> 1345 <6df4> <6df4> 14705 <6df5> <6df5> 8772 <6df6> <6df6> 9186 <6df7> <6df7> 2049 <6df8> <6df8> 14706 <6df9> <6df9> 4086 <6dfa> <6dfa> 8404 <6dfb> <6dfb> 3648 <6dfc> <6dfc> 6689 <6dfd> <6dff> 14707 <6e00> <6e04> 14710 <6e05> <6e05> 3170 <6e06> <6e09> 14715 <6e0a> <6e0a> 4331 <6e0b> <6e0b> 14719 <6e0c> <6e0c> 5865 <6e0d> <6e0d> 4658 <6e0e> <6e0e> 5856 <6e0f> <6e0f> 14720 <6e10> <6e10> 2166 <6e11> <6e11> 5859 <6e12> <6e13> 14721 <6e14> <6e14> 4299 <6e15> <6e15> 14723 <6e16> <6e16> 5863 <6e17> <6e17> 3377 <6e18> <6e19> 14724 <6e1a> <6e1a> 5852 <6e1b> <6e1c> 14726 <6e1d> <6e1d> 4298 <6e1e> <6e1f> 14728 <6e20> <6e20> 3195 <6e21> <6e21> 1544 <6e22> <6e22> 14730 <6e23> <6e23> 4415 <6e24> <6e24> 1146 <6e25> <6e25> 5877 <6e26> <6e26> 8607 <6e27> <6e28> 14731 <6e29> <6e29> 3793 <6e2a> <6e2a> 14733 <6e2b> <6e2b> 5867 <6e2c> <6e2c> 7782 <6e2d> <6e2d> 3787 <6e2e> <6e2e> 14734 <6e2f> <6e2f> 1750 <6e30> <6e31> 14735 <6e32> <6e32> 5876 <6e33> <6e33> 14737 <6e34> <6e34> 2391 <6e35> <6e37> 14738 <6e38> <6e38> 4275 <6e39> <6e39> 14741 <6e3a> <6e3a> 2801 <6e3b> <6e3d> 14742 <6e3e> <6e3e> 8035 <6e3f> <6e42> 14745 <6e43> <6e43> 2953 <6e44> <6e44> 5878 <6e45> <6e4c> 14749 <6e4d> <6e4d> 3701 <6e4e> <6e4e> 5869 <6e4f> <6e52> 14757 <6e53> <6e54> 5874 <6e55> <6e55> 14761 <6e56> <6e56> 1973 <6e57> <6e57> 14762 <6e58> <6e58> 3923 <6e59> <6e5a> 14763 <6e5b> <6e5b> 4448 <6e5c> <6e5d> 14765 <6e5e> <6e5e> 9181 <6e5f> <6e5f> 5872 <6e60> <6e6a> 14767 <6e6b> <6e6b> 5870 <6e6c> <6e6d> 14778 <6e6e> <6e6e> 5868 <6e6f> <6e6f> 8555 <6e70> <6e7d> 14780 <6e7e> <6e7e> 3734 <6e7f> <6e7f> 3393 <6e80> <6e82> 14794 endcidrange 100 begincidrange <6e83> <6e83> 2446 <6e84> <6e84> 14797 <6e85> <6e85> 2167 <6e86> <6e86> 5873 <6e87> <6e88> 14798 <6e89> <6e89> 1731 <6e8a> <6e8e> 14800 <6e8f> <6e8f> 5893 <6e90> <6e90> 4343 <6e91> <6e95> 14805 <6e96> <6e96> 8885 <6e97> <6e97> 14810 <6e98> <6e98> 5881 <6e99> <6e9b> 14811 <6e9c> <6e9c> 2616 <6e9d> <6e9d> 7974 <6e9e> <6e9e> 14814 <6e9f> <6e9f> 5895 <6ea0> <6ea1> 14815 <6ea2> <6ea2> 4206 <6ea3> <6ea4> 14817 <6ea5> <6ea5> 5885 <6ea6> <6ea6> 14819 <6ea7> <6ea7> 5886 <6ea8> <6ea9> 14820 <6eaa> <6eaa> 3863 <6eab> <6eae> 14822 <6eaf> <6eaf> 3538 <6eb0> <6eb0> 14826 <6eb1> <6eb1> 5880 <6eb2> <6eb2> 5871 <6eb3> <6eb3> 14827 <6eb4> <6eb4> 5891 <6eb5> <6eb5> 14828 <6eb6> <6eb6> 3255 <6eb7> <6eb7> 5889 <6eb8> <6eb9> 14829 <6eba> <6eba> 2890 <6ebb> <6ebb> 5888 <6ebc> <6ebc> 14831 <6ebd> <6ebd> 5887 <6ebe> <6ec0> 14832 <6ec1> <6ec1> 1313 <6ec2> <6ec2> 5894 <6ec3> <6ec3> 14835 <6ec4> <6ec4> 7779 <6ec5> <6ec5> 8328 <6ec6> <6ec6> 14836 <6ec7> <6ec7> 1474 <6ec8> <6eca> 14837 <6ecb> <6ecb> 4649 <6ecc> <6ecc> 7869 <6ecd> <6ecd> 14840 <6ece> <6ece> 9025 <6ecf> <6ecf> 5892 <6ed0> <6ed0> 14841 <6ed1> <6ed1> 1985 <6ed2> <6ed2> 14842 <6ed3> <6ed3> 4655 <6ed4> <6ed4> 3618 <6ed5> <6ed5> 6568 <6ed6> <6ed6> 14843 <6ed7> <6ed7> 5890 <6ed8> <6ed9> 14844 <6eda> <6eda> 1871 <6edb> <6edd> 14846 <6ede> <6ede> 4556 <6edf> <6edf> 5879 <6ee0> <6ee0> 5882 <6ee1> <6ee1> 2721 <6ee2> <6ee2> 5884 <6ee3> <6ee3> 14849 <6ee4> <6ee4> 2674 <6ee5> <6ee5> 2479 <6ee6> <6ee6> 2679 <6ee7> <6ee7> 14850 <6ee8> <6ee8> 1118 <6ee9> <6ee9> 3589 <6eea> <6eeb> 14851 <6eec> <6eec> 8011 <6eed> <6eee> 14853 <6eef> <6eef> 8850 <6ef0> <6ef1> 14855 <6ef2> <6ef2> 8484 <6ef3> <6ef3> 14857 <6ef4> <6ef4> 1455 <6ef5> <6ef6> 14858 <6ef7> <6ef7> 8264 <6ef8> <6ef8> 9184 <6ef9> <6ef9> 5901 <6efa> <6efe> 14860 <6eff> <6eff> 8311 <6f00> <6f00> 14865 <6f01> <6f01> 8762 <6f02> <6f02> 3022 <6f03> <6f05> 14866 <6f06> <6f06> 3072 <6f07> <6f08> 14869 <6f09> <6f09> 5907 <6f0a> <6f0e> 14871 endcidrange 100 begincidrange <6f0f> <6f0f> 2640 <6f10> <6f12> 14876 <6f13> <6f13> 2519 <6f14> <6f14> 4102 <6f15> <6f15> 5900 <6f16> <6f19> 14879 <6f1a> <6f1a> 8369 <6f1b> <6f1f> 14883 <6f20> <6f20> 2833 <6f21> <6f21> 14888 <6f22> <6f22> 8001 <6f23> <6f23> 8220 <6f24> <6f24> 5899 <6f25> <6f28> 14889 <6f29> <6f29> 5908 <6f2a> <6f2a> 5906 <6f2b> <6f2b> 2725 <6f2c> <6f2c> 8888 <6f2d> <6f2d> 5883 <6f2e> <6f2e> 14893 <6f2f> <6f2f> 5902 <6f30> <6f30> 14894 <6f31> <6f31> 3477 <6f32> <6f32> 8822 <6f33> <6f33> 4453 <6f34> <6f35> 14895 <6f36> <6f36> 5903 <6f37> <6f37> 14897 <6f38> <6f38> 8091 <6f39> <6f3d> 14898 <6f3e> <6f3e> 4131 <6f3f> <6f3f> 8095 <6f40> <6f40> 14903 <6f41> <6f41> 9674 <6f42> <6f45> 14904 <6f46> <6f47> 5897 <6f48> <6f4a> 14908 <6f4b> <6f4b> 5904 <6f4c> <6f4c> 14911 <6f4d> <6f4d> 3770 <6f4e> <6f50> 14912 <6f51> <6f51> 8382 <6f52> <6f53> 14915 <6f54> <6f54> 8116 <6f55> <6f57> 14917 <6f58> <6f58> 2956 <6f59> <6f59> 9175 <6f5a> <6f5b> 14920 <6f5c> <6f5c> 3118 <6f5d> <6f5d> 14922 <6f5e> <6f5e> 2657 <6f5f> <6f61> 14923 <6f62> <6f62> 5896 <6f63> <6f63> 14926 <6f64> <6f64> 8453 <6f65> <6f65> 14927 <6f66> <6f66> 2579 <6f67> <6f6c> 14928 <6f6d> <6f6d> 3593 <6f6e> <6f6e> 1238 <6f6f> <6f6f> 9185 <6f70> <6f70> 8172 <6f71> <6f71> 14934 <6f72> <6f72> 5913 <6f73> <6f73> 14935 <6f74> <6f74> 5905 <6f75> <6f76> 14936 <6f77> <6f77> 9194 <6f78> <6f78> 5912 <6f79> <6f79> 14938 <6f7a> <6f7a> 5915 <6f7b> <6f7b> 14939 <6f7c> <6f7c> 5914 <6f7d> <6f7e> 14940 <6f7f> <6f7f> 9187 <6f80> <6f80> 8462 <6f81> <6f83> 14942 <6f84> <6f84> 1267 <6f85> <6f85> 14945 <6f86> <6f86> 8102 <6f87> <6f87> 8196 <6f88> <6f88> 1247 <6f89> <6f89> 5909 <6f8a> <6f8b> 14946 <6f8c> <6f8c> 5911 <6f8d> <6f8d> 5910 <6f8e> <6f8e> 2989 <6f8f> <6f96> 14948 <6f97> <6f97> 8093 <6f98> <6f9b> 14956 <6f9c> <6f9c> 2472 <6f9d> <6f9f> 14960 <6fa0> <6fa0> 9189 <6fa1> <6fa1> 4395 <6fa2> <6fa3> 14963 <6fa4> <6fa4> 8804 <6fa5> <6fa6> 14965 <6fa7> <6fa7> 5918 <6fa8> <6fa8> 14967 <6fa9> <6fa9> 9442 endcidrange 100 begincidrange <6faa> <6fad> 14968 <6fae> <6fae> 9182 <6faf> <6fb0> 14972 <6fb1> <6fb1> 7876 <6fb2> <6fb2> 14974 <6fb3> <6fb3> 975 <6fb4> <6fb5> 14975 <6fb6> <6fb6> 5920 <6fb7> <6fb8> 14977 <6fb9> <6fb9> 5919 <6fba> <6fbf> 14979 <6fc0> <6fc0> 2071 <6fc1> <6fc1> 8886 <6fc2> <6fc2> 5921 <6fc3> <6fc3> 8361 <6fc4> <6fc8> 14985 <6fc9> <6fc9> 5917 <6fca> <6fd0> 14990 <6fd1> <6fd1> 5916 <6fd2> <6fd2> 1117 <6fd3> <6fd4> 14997 <6fd5> <6fd5> 8491 <6fd6> <6fd7> 14999 <6fd8> <6fd8> 8357 <6fd9> <6fda> 15001 <6fdb> <6fdb> 9867 <6fdc> <6fdd> 15003 <6fde> <6fde> 5924 <6fdf> <6fdf> 8054 <6fe0> <6fe0> 5925 <6fe1> <6fe1> 5922 <6fe2> <6fe3> 15005 <6fe4> <6fe4> 8557 <6fe5> <6fea> 15007 <6feb> <6feb> 8193 <6fec> <6fed> 15013 <6fee> <6fee> 5923 <6fef> <6fef> 5926 <6ff0> <6ff0> 8593 <6ff1> <6ff1> 7760 <6ff2> <6ff9> 15015 <6ffa> <6ffa> 8092 <6ffb> <6ffb> 15023 <6ffc> <6ffc> 9178 <6ffd> <6ffd> 15024 <6ffe> <6ffe> 8275 <6fff> <6fff> 15025 <7000> <7004> 15026 <7005> <7005> 9193 <7006> <7006> 9188 <7007> <7008> 15031 <7009> <7009> 8661 <700a> <700a> 15033 <700b> <700b> 9190 <700c> <700e> 15034 <700f> <700f> 9183 <7010> <7010> 15037 <7011> <7011> 3064 <7012> <7014> 15038 <7015> <7015> 7759 <7016> <7017> 15041 <7018> <7018> 9177 <7019> <7019> 15043 <701a> <701a> 5927 <701b> <701b> 5929 <701c> <701c> 15044 <701d> <701d> 8212 <701e> <701e> 15045 <701f> <701f> 9196 <7020> <7020> 9195 <7021> <7022> 15046 <7023> <7023> 5928 <7024> <7026> 15048 <7027> <7027> 9176 <7028> <7028> 9198 <7029> <702f> 15051 <7030> <7030> 9870 <7031> <7031> 15058 <7032> <7032> 9197 <7033> <7034> 15059 <7035> <7035> 5931 <7036> <7038> 15061 <7039> <7039> 5930 <703a> <703d> 15064 <703e> <703e> 8186 <703f> <7042> 15068 <7043> <7043> 9174 <7044> <7044> 9192 <7045> <704b> 15072 <704c> <704c> 1849 <704d> <704e> 15079 <704f> <704f> 5932 <7050> <7050> 15081 <7051> <7051> 8454 <7052> <7054> 15082 <7055> <7055> 8203 <7056> <7057> 15085 <7058> <7058> 8550 <7059> <705c> 15087 <705d> <705d> 9199 endcidrange 100 begincidrange <705e> <705e> 5933 <705f> <7062> 15091 <7063> <7063> 8585 <7064> <7064> 8280 <7065> <7066> 15095 <7067> <7067> 9191 <7068> <706a> 15097 <706b> <706b> 2053 <706c> <706c> 6639 <706d> <706d> 2805 <706e> <706e> 15100 <706f> <706f> 1447 <7070> <7070> 2023 <7071> <7074> 15101 <7075> <7075> 2610 <7076> <7076> 4401 <7077> <7077> 15105 <7078> <7078> 2291 <7079> <707b> 15106 <707c> <707c> 4643 <707d> <707d> 15109 <707e> <707e> 4377 <707f> <707f> 1178 <7080> <7080> 6604 <7081> <7084> 15110 <7085> <7085> 6419 <7086> <7088> 15114 <7089> <7089> 2646 <708a> <708a> 1337 <708b> <708d> 15117 <708e> <708e> 4096 <708f> <7091> 15120 <7092> <7092> 1241 <7093> <7093> 15123 <7094> <7094> 3213 <7095> <7095> 2376 <7096> <7096> 6606 <7097> <7098> 15124 <7099> <7099> 4554 <709a> <709b> 15126 <709c> <709c> 6605 <709d> <709d> 6607 <709e> <70aa> 15128 <70ab> <70ab> 6611 <70ac> <70ac> 2325 <70ad> <70ad> 3602 <70ae> <70ae> 2971 <70af> <70af> 2283 <70b0> <70b0> 15141 <70b1> <70b1> 6612 <70b2> <70b2> 15142 <70b3> <70b3> 1127 <70b4> <70b6> 15143 <70b7> <70b7> 6610 <70b8> <70b8> 4425 <70b9> <70b9> 1476 <70ba> <70ba> 15146 <70bb> <70bb> 6608 <70bc> <70bc> 2559 <70bd> <70bd> 1288 <70be> <70bf> 15147 <70c0> <70c0> 6609 <70c1> <70c1> 3501 <70c2> <70c2> 2478 <70c3> <70c3> 3665 <70c4> <70c7> 15149 <70c8> <70c8> 2587 <70c9> <70c9> 15153 <70ca> <70ca> 6614 <70cb> <70ce> 15154 <70cf> <70cf> 8611 <70d0> <70d7> 15158 <70d8> <70d8> 1949 <70d9> <70d9> 2494 <70da> <70da> 15166 <70db> <70db> 4593 <70dc> <70de> 15167 <70df> <70df> 4085 <70e0> <70e3> 15170 <70e4> <70e4> 2379 <70e5> <70e5> 15174 <70e6> <70e6> 1616 <70e7> <70e7> 3342 <70e8> <70e8> 6613 <70e9> <70e9> 2039 <70ea> <70ea> 15175 <70eb> <70eb> 3615 <70ec> <70ec> 2254 <70ed> <70ed> 3235 <70ee> <70ee> 15176 <70ef> <70ef> 3862 <70f0> <70f3> 15177 <70f4> <70f4> 8570 <70f5> <70f6> 15181 <70f7> <70f7> 3738 <70f8> <70f8> 15183 <70f9> <70f9> 2988 <70fa> <70fc> 15184 <70fd> <70fd> 1670 <70fe> <70ff> 15187 endcidrange 100 begincidrange <7100> <7108> 15189 <7109> <7109> 4082 <710a> <710a> 1903 <710b> <710f> 15198 <7110> <7110> 6615 <7111> <7112> 15203 <7113> <7113> 6616 <7114> <7114> 15205 <7115> <7115> 2005 <7116> <7116> 6617 <7117> <7117> 15206 <7118> <7118> 6640 <7119> <7119> 1059 <711a> <711a> 1654 <711b> <7120> 15207 <7121> <7121> 8613 <7122> <7125> 15213 <7126> <7126> 2186 <7127> <712e> 15217 <712f> <712f> 6618 <7130> <7130> 4111 <7131> <7131> 6619 <7132> <7135> 15225 <7136> <7136> 3222 <7137> <7144> 15229 <7145> <7145> 6623 <7146> <7148> 15243 <7149> <7149> 8226 <714a> <714a> 6625 <714b> <714b> 15246 <714c> <714c> 2018 <714d> <714d> 15247 <714e> <714e> 2136 <714f> <7151> 15248 <7152> <7152> 9430 <7153> <715b> 15251 <715c> <715c> 6621 <715d> <715d> 15260 <715e> <715e> 3312 <715f> <7161> 15261 <7162> <7162> 9018 <7163> <7163> 15264 <7164> <7164> 2751 <7165> <7165> 15265 <7166> <7166> 6641 <7167> <7167> 4470 <7168> <7168> 6622 <7169> <7169> 7918 <716a> <716b> 15266 <716c> <716c> 9429 <716d> <716d> 15268 <716e> <716e> 4594 <716f> <7171> 15269 <7172> <7172> 6624 <7173> <7173> 6620 <7174> <7177> 15272 <7178> <7178> 6626 <7179> <7179> 15276 <717a> <717a> 6627 <717b> <717c> 15277 <717d> <717d> 3320 <717e> <7183> 15279 <7184> <7184> 3861 <7185> <7189> 15285 <718a> <718a> 4007 <718b> <718e> 15290 <718f> <718f> 4053 <7190> <7191> 15294 <7192> <7192> 8744 <7193> <7193> 15296 <7194> <7194> 3254 <7195> <7196> 15297 <7197> <7197> 9431 <7198> <7198> 6628 <7199> <7199> 3844 <719a> <719e> 15299 <719f> <719f> 3459 <71a0> <71a0> 6632 <71a1> <71a7> 15304 <71a8> <71a8> 6631 <71a9> <71ab> 15311 <71ac> <71ac> 969 <71ad> <71b0> 15314 <71b1> <71b1> 8444 <71b2> <71b2> 15318 <71b3> <71b3> 6629 <71b4> <71b4> 15319 <71b5> <71b5> 6630 <71b6> <71b8> 15320 <71b9> <71b9> 6642 <71ba> <71bd> 15323 <71be> <71be> 7815 <71bf> <71c0> 15327 <71c1> <71c1> 9432 <71c2> <71c2> 15329 <71c3> <71c3> 3223 <71c4> <71c7> 15330 <71c8> <71c8> 7866 <71c9> <71cd> 15334 <71ce> <71ce> 2576 endcidrange 100 begincidrange <71cf> <71d1> 15339 <71d2> <71d2> 8473 <71d3> <71d3> 15342 <71d4> <71d4> 6634 <71d5> <71d5> 4105 <71d6> <71d8> 15343 <71d9> <71d9> 8556 <71da> <71db> 15346 <71dc> <71dc> 9433 <71dd> <71de> 15348 <71df> <71df> 8743 <71e0> <71e0> 6633 <71e1> <71e4> 15350 <71e5> <71e5> 4402 <71e6> <71e6> 7775 <71e7> <71e7> 6635 <71e8> <71ec> 15354 <71ed> <71ed> 8863 <71ee> <71ee> 5014 <71ef> <71f3> 15359 <71f4> <71f4> 8029 <71f5> <71f8> 15364 <71f9> <71f9> 6636 <71fa> <71fb> 15368 <71fc> <71fc> 8124 <71fd> <71fd> 15370 <71fe> <71fe> 9434 <71ff> <71ff> 15371 <7200> <7205> 15372 <7206> <7206> 1045 <7207> <720c> 15378 <720d> <720d> 8521 <720e> <720f> 15384 <7210> <7210> 8262 <7211> <721a> 15386 <721b> <721b> 8192 <721c> <721c> 15396 <721d> <721d> 6637 <721e> <7227> 15397 <7228> <7228> 6638 <7229> <7229> 15407 <722a> <722a> 4611 <722b> <722b> 15408 <722c> <722c> 2945 <722d> <722f> 15409 <7230> <7230> 6508 <7231> <7231> 953 <7232> <7232> 8592 <7233> <7234> 15412 <7235> <7235> 2339 <7236> <7236> 1715 <7237> <7237> 4150 <7238> <7238> 993 <7239> <7239> 1498 <723a> <723a> 8712 <723b> <723b> 4713 <723c> <723c> 15414 <723d> <723d> 3489 <723e> <723e> 7910 <723f> <723f> 5789 <7240> <7246> 15415 <7247> <7247> 3019 <7248> <7248> 1009 <7249> <724b> 15422 <724c> <724c> 2951 <724d> <724d> 6505 <724e> <7251> 15425 <7252> <7252> 6506 <7253> <7255> 15429 <7256> <7256> 6507 <7257> <7257> 15432 <7258> <7258> 9411 <7259> <7259> 4073 <725a> <725a> 15433 <725b> <725b> 2916 <725c> <725c> 15434 <725d> <725d> 6468 <725e> <725e> 15435 <725f> <725f> 2837 <7260> <7260> 15436 <7261> <7261> 2840 <7262> <7262> 2489 <7263> <7265> 15437 <7266> <7266> 6469 <7267> <7267> 2852 <7268> <7268> 15440 <7269> <7269> 3838 <726a> <726d> 15441 <726e> <726e> 6466 <726f> <726f> 6470 <7270> <7271> 15445 <7272> <7272> 3381 <7273> <7274> 15447 <7275> <7275> 3104 <7276> <7278> 15449 <7279> <7279> 3627 <727a> <727a> 3853 <727b> <727c> 15452 <727d> <727d> 8396 <727e> <727f> 6471 endcidrange 100 begincidrange <7280> <7280> 3865 <7281> <7281> 2514 <7282> <7283> 15454 <7284> <7284> 6473 <7285> <7289> 15456 <728a> <728a> 1534 <728b> <728b> 6474 <728c> <728c> 15461 <728d> <728d> 6475 <728e> <728e> 15462 <728f> <728f> 6476 <7290> <7291> 15463 <7292> <7292> 6477 <7293> <7295> 15465 <7296> <7296> 9024 <7297> <729e> 15468 <729f> <729f> 6467 <72a0> <72a1> 15476 <72a2> <72a2> 7889 <72a3> <72a6> 15478 <72a7> <72a7> 8620 <72a8> <72ab> 15482 <72ac> <72ac> 3209 <72ad> <72ad> 5615 <72ae> <72ae> 15486 <72af> <72af> 1621 <72b0> <72b0> 5616 <72b1> <72b3> 15487 <72b4> <72b4> 5617 <72b5> <72b5> 15490 <72b6> <72b6> 4625 <72b7> <72b8> 5618 <72b9> <72b9> 4273 <72ba> <72bf> 15491 <72c0> <72c0> 8879 <72c1> <72c1> 5621 <72c2> <72c2> 2430 <72c3> <72c3> 5620 <72c4> <72c4> 1459 <72c5> <72c7> 15497 <72c8> <72c8> 1056 <72c9> <72cc> 15500 <72cd> <72cd> 5623 <72ce> <72ce> 5622 <72cf> <72cf> 15504 <72d0> <72d0> 1971 <72d1> <72d1> 15505 <72d2> <72d2> 5624 <72d3> <72d6> 15506 <72d7> <72d7> 1808 <72d8> <72d8> 15510 <72d9> <72d9> 2304 <72da> <72dd> 15511 <72de> <72de> 2911 <72df> <72df> 15515 <72e0> <72e0> 1940 <72e1> <72e1> 2199 <72e2> <72e7> 15516 <72e8> <72e8> 5625 <72e9> <72e9> 5627 <72ea> <72eb> 15522 <72ec> <72ec> 1535 <72ed> <72ed> 3886 <72ee> <72ee> 3391 <72ef> <72ef> 5626 <72f0> <72f0> 4505 <72f1> <72f1> 4321 <72f2> <72f2> 5628 <72f3> <72f3> 5632 <72f4> <72f4> 5629 <72f5> <72f6> 15524 <72f7> <72f7> 5630 <72f8> <72f8> 2517 <72f9> <72f9> 8630 <72fa> <72fb> 5634 <72fc> <72fc> 2482 <72fd> <72fd> 7741 <72fe> <72ff> 15526 <7300> <7300> 15528 <7301> <7301> 5631 <7302> <7302> 15529 <7303> <7303> 5633 <7304> <7309> 15530 <730a> <730a> 5639 <730b> <730d> 15536 <730e> <730e> 2589 <730f> <7312> 15539 <7313> <7313> 5637 <7314> <7314> 15543 <7315> <7315> 5642 <7316> <7316> 1221 <7317> <7317> 5636 <7318> <731a> 15544 <731b> <731b> 2770 <731c> <731c> 1161 <731d> <731d> 5641 <731e> <731e> 5640 <731f> <7320> 15547 <7321> <7321> 5638 <7322> <7322> 5643 endcidrange 100 begincidrange <7323> <7324> 15549 <7325> <7325> 5645 <7326> <7328> 15551 <7329> <7329> 3988 <732a> <732a> 4588 <732b> <732b> 2733 <732c> <732c> 5646 <732d> <732d> 15554 <732e> <732e> 3908 <732f> <7330> 15555 <7331> <7331> 5648 <7332> <7333> 15557 <7334> <7334> 1958 <7335> <7335> 15559 <7336> <7336> 8757 <7337> <7337> 6356 <7338> <7338> 5647 <7339> <7339> 5644 <733a> <733a> 15560 <733b> <733b> 9111 <733c> <733d> 15561 <733e> <733e> 1984 <733f> <733f> 4342 <7340> <7340> 15563 <7341> <7341> 9109 <7342> <7343> 15564 <7344> <7344> 8767 <7345> <7345> 8490 <7346> <734c> 15566 <734d> <734d> 5650 <734e> <734f> 15573 <7350> <7350> 5649 <7351> <7351> 15575 <7352> <7352> 6357 <7353> <7356> 15576 <7357> <7357> 5651 <7358> <735f> 15580 <7360> <7360> 5652 <7361> <7367> 15588 <7368> <7368> 7890 <7369> <7369> 15595 <736a> <736a> 9110 <736b> <736b> 9112 <736c> <736c> 5653 <736d> <736d> 3572 <736e> <736e> 15596 <736f> <736f> 5654 <7370> <7370> 8354 <7371> <7371> 15597 <7372> <7372> 8036 <7373> <7374> 15598 <7375> <7375> 8235 <7376> <7376> 15600 <7377> <7377> 9108 <7378> <7378> 8505 <7379> <7379> 15601 <737a> <737a> 8543 <737b> <737b> 8641 <737c> <737c> 9114 <737d> <737d> 15602 <737e> <737e> 5655 <737f> <737f> 15603 <7380> <7380> 9113 <7381> <7383> 15604 <7384> <7384> 4041 <7385> <7386> 15607 <7387> <7387> 2673 <7388> <7388> 15609 <7389> <7389> 4310 <738a> <738a> 15610 <738b> <738b> 3750 <738c> <738d> 15611 <738e> <738e> 6168 <738f> <7390> 15613 <7391> <7391> 6169 <7392> <7395> 15615 <7396> <7396> 2288 <7397> <739a> 15619 <739b> <739b> 2705 <739c> <739e> 15623 <739f> <739f> 6172 <73a0> <73a1> 15626 <73a2> <73a2> 6171 <73a3> <73a8> 15628 <73a9> <73a9> 3735 <73aa> <73aa> 15634 <73ab> <73ab> 2746 <73ac> <73ad> 15635 <73ae> <73ae> 6170 <73af> <73af> 1996 <73b0> <73b0> 3907 <73b1> <73b1> 15637 <73b2> <73b2> 2602 <73b3> <73b3> 6177 <73b4> <73b6> 15638 <73b7> <73b7> 6176 <73b8> <73b9> 15641 <73ba> <73ba> 6188 <73bb> <73bb> 1130 <73bc> <73bf> 15643 endcidrange 100 begincidrange <73c0> <73c0> 6178 <73c1> <73c1> 15647 <73c2> <73c2> 6174 <73c3> <73c7> 15648 <73c8> <73c8> 6180 <73c9> <73c9> 6179 <73ca> <73ca> 3315 <73cb> <73cc> 15653 <73cd> <73cd> 4485 <73ce> <73ce> 15655 <73cf> <73cf> 6173 <73d0> <73d0> 1606 <73d1> <73d1> 6175 <73d2> <73d8> 15656 <73d9> <73d9> 6182 <73da> <73dd> 15663 <73de> <73de> 6187 <73df> <73df> 15667 <73e0> <73e0> 4584 <73e1> <73e4> 15668 <73e5> <73e5> 6181 <73e6> <73e6> 15672 <73e7> <73e7> 6186 <73e8> <73e8> 15673 <73e9> <73e9> 6185 <73ea> <73ec> 15674 <73ed> <73ed> 1003 <73ee> <73f1> 15677 <73f2> <73f2> 6189 <73f3> <73fd> 15681 <73fe> <73fe> 8640 <73ff> <73ff> 15692 <7400> <7402> 15693 <7403> <7403> 3183 <7404> <7404> 15696 <7405> <7405> 2480 <7406> <7406> 2520 <7407> <7408> 15697 <7409> <7409> 2617 <740a> <740a> 6184 <740b> <740e> 15699 <740f> <740f> 6190 <7410> <7410> 3563 <7411> <7419> 15703 <741a> <741a> 6200 <741b> <741b> 6199 <741c> <7421> 15712 <7422> <7422> 4638 <7423> <7424> 15718 <7425> <7425> 6194 <7426> <7426> 6193 <7427> <7427> 15720 <7428> <7428> 6195 <7429> <7429> 15721 <742a> <742a> 6191 <742b> <742b> 15722 <742c> <742c> 6198 <742d> <742d> 15723 <742e> <742e> 6197 <742f> <742f> 15724 <7430> <7430> 6196 <7431> <7432> 15725 <7433> <7433> 2590 <7434> <7434> 3158 <7435> <7435> 3006 <7436> <7436> 2948 <7437> <743b> 15727 <743c> <743c> 3178 <743d> <743e> 15732 <743f> <743f> 9312 <7440> <7440> 15734 <7441> <7441> 6201 <7442> <744a> 15735 <744b> <744b> 9308 <744c> <7454> 15744 <7455> <7455> 6204 <7456> <7456> 15753 <7457> <7457> 6203 <7458> <7458> 15754 <7459> <7459> 6205 <745a> <745a> 1966 <745b> <745b> 6192 <745c> <745c> 6202 <745d> <745d> 15755 <745e> <745e> 3275 <745f> <745f> 3299 <7460> <7462> 15756 <7463> <7463> 8541 <7464> <7468> 15759 <7469> <7469> 8741 <746a> <746a> 8298 <746b> <746c> 15764 <746d> <746d> 6207 <746e> <746f> 15766 <7470> <7470> 1854 <7471> <7475> 15768 <7476> <7476> 4135 <7477> <7477> 6206 <7478> <747d> 15773 <747e> <747e> 6208 endcidrange 100 begincidrange <747f> <747f> 15779 <7480> <7481> 6211 <7482> <7482> 15780 <7483> <7483> 2544 <7484> <7486> 15781 <7487> <7487> 6213 <7488> <7488> 15784 <7489> <7489> 9313 <748a> <748a> 15785 <748b> <748b> 6214 <748c> <748d> 15786 <748e> <748e> 6210 <748f> <748f> 15788 <7490> <7490> 6218 <7491> <749b> 15789 <749c> <749c> 6209 <749d> <749d> 15800 <749e> <749e> 6215 <749f> <74a2> 15801 <74a3> <74a3> 9307 <74a4> <74a5> 15805 <74a6> <74a6> 9314 <74a7> <74a7> 6219 <74a8> <74a9> 6216 <74aa> <74af> 15807 <74b0> <74b0> 8020 <74b1> <74b9> 15813 <74ba> <74ba> 6221 <74bb> <74bc> 15822 <74bd> <74bd> 9311 <74be> <74c9> 15824 <74ca> <74ca> 8428 <74cb> <74ce> 15836 <74cf> <74cf> 9309 <74d0> <74d1> 15840 <74d2> <74d2> 6220 <74d3> <74d3> 15842 <74d4> <74d4> 9315 <74d5> <74d9> 15843 <74da> <74da> 9316 <74db> <74db> 15848 <74dc> <74dc> 1832 <74dd> <74dd> 15849 <74de> <74de> 6962 <74df> <74df> 15850 <74e0> <74e0> 6963 <74e1> <74e1> 15851 <74e2> <74e2> 3023 <74e3> <74e3> 1013 <74e4> <74e4> 3226 <74e5> <74e5> 15852 <74e6> <74e6> 3728 <74e7> <74ed> 15853 <74ee> <74ee> 3804 <74ef> <74ef> 6403 <74f0> <74f3> 15860 <74f4> <74f4> 6404 <74f5> <74f5> 15864 <74f6> <74f6> 3038 <74f7> <74f7> 1356 <74f8> <74fe> 15865 <74ff> <74ff> 6405 <7500> <7503> 15872 <7504> <7504> 4488 <7505> <750b> 15876 <750c> <750c> 9381 <750d> <750d> 5253 <750e> <750e> 15883 <750f> <750f> 6406 <7510> <7510> 15884 <7511> <7511> 6407 <7512> <7512> 15885 <7513> <7513> 6408 <7514> <7517> 15886 <7518> <7518> 1733 <7519> <7519> 5368 <751a> <751a> 3374 <751b> <751b> 15890 <751c> <751c> 3651 <751d> <751e> 15891 <751f> <751f> 3379 <7520> <7522> 15893 <7523> <7523> 7792 <7524> <7524> 15896 <7525> <7525> 3380 <7526> <7527> 15897 <7528> <7528> 4264 <7529> <7529> 3483 <752a> <752a> 15899 <752b> <752b> 1697 <752c> <752c> 6964 <752d> <752d> 1067 <752e> <752e> 15900 <752f> <752f> 5940 <7530> <7530> 3650 <7531> <7531> 4270 <7532> <7532> 2122 <7533> <7533> 3363 <7534> <7534> 15901 <7535> <7535> 1480 endcidrange 100 begincidrange <7536> <7536> 15902 <7537> <7537> 2867 <7538> <7538> 1482 <7539> <7539> 15903 <753a> <753a> 6776 <753b> <753b> 1986 <753c> <753d> 15904 <753e> <753e> 6166 <753f> <753f> 15906 <7540> <7540> 6777 <7541> <7544> 15907 <7545> <7545> 1230 <7546> <7547> 15911 <7548> <7548> 6780 <7549> <754a> 15913 <754b> <754b> 6779 <754c> <754c> 2232 <754d> <754d> 15915 <754e> <754e> 6778 <754f> <754f> 3782 <7550> <7553> 15916 <7554> <7554> 2960 <7555> <7558> 15920 <7559> <7559> 2621 <755a> <755a> 5022 <755b> <755b> 6781 <755c> <755c> 4030 <755d> <755d> 8335 <755e> <7561> 15924 <7562> <7562> 7746 <7563> <7564> 15928 <7565> <7565> 2683 <7566> <7566> 3079 <7567> <7569> 15930 <756a> <756a> 1609 <756b> <756b> 8014 <756c> <7571> 15933 <7572> <7572> 6782 <7573> <7573> 15939 <7574> <7574> 1296 <7575> <7575> 15940 <7576> <7576> 7857 <7577> <7577> 15941 <7578> <7578> 2064 <7579> <7579> 6783 <757a> <757e> 15942 <757f> <757f> 6164 <7580> <7582> 15947 <7583> <7583> 6784 <7584> <7585> 15950 <7586> <7586> 2175 <7587> <7587> 7819 <7588> <758a> 15952 <758b> <758b> 7110 <758c> <758e> 15955 <758f> <758f> 3455 <7590> <7590> 15958 <7591> <7591> 4176 <7592> <7592> 7008 <7593> <7593> 15959 <7594> <7594> 7009 <7595> <7595> 15960 <7596> <7596> 7010 <7597> <7597> 2575 <7598> <7598> 15961 <7599> <7599> 1768 <759a> <759a> 2301 <759b> <759c> 15962 <759d> <759d> 7012 <759e> <759e> 15964 <759f> <759f> 2930 <75a0> <75a0> 7011 <75a1> <75a1> 4122 <75a2> <75a2> 15965 <75a3> <75a3> 7014 <75a4> <75a4> 983 <75a5> <75a5> 2235 <75a6> <75aa> 15966 <75ab> <75ab> 4198 <75ac> <75ac> 7013 <75ad> <75ad> 15971 <75ae> <75ae> 1330 <75af> <75af> 1669 <75b0> <75b0> 7020 <75b1> <75b1> 7019 <75b2> <75b2> 3010 <75b3> <75b4> 7015 <75b5> <75b5> 1350 <75b6> <75b7> 15972 <75b8> <75b8> 7017 <75b9> <75b9> 4495 <75ba> <75bb> 15974 <75bc> <75bc> 3630 <75bd> <75bd> 2305 <75be> <75be> 2085 <75bf> <75c1> 15976 <75c2> <75c2> 7022 <75c3> <75c3> 7021 <75c4> <75c4> 7018 <75c5> <75c5> 1128 endcidrange 100 begincidrange <75c6> <75c6> 15979 <75c7> <75c7> 4513 <75c8> <75c8> 4253 <75c9> <75c9> 2278 <75ca> <75ca> 3207 <75cb> <75cc> 15980 <75cd> <75cd> 7024 <75ce> <75d1> 15982 <75d2> <75d2> 4128 <75d3> <75d3> 15986 <75d4> <75d4> 4555 <75d5> <75d5> 1938 <75d6> <75d6> 7023 <75d7> <75d7> 15987 <75d8> <75d8> 1530 <75d9> <75d9> 8134 <75da> <75da> 15988 <75db> <75db> 3685 <75dc> <75dd> 15989 <75de> <75de> 3013 <75df> <75e1> 15991 <75e2> <75e2> 2538 <75e3> <75e3> 7025 <75e4> <75e4> 7028 <75e5> <75e5> 15994 <75e6> <75e6> 7027 <75e7> <75e7> 7030 <75e8> <75e8> 7026 <75e9> <75e9> 15995 <75ea> <75ea> 2003 <75eb> <75eb> 7029 <75ec> <75ef> 15996 <75f0> <75f0> 3592 <75f1> <75f1> 7032 <75f2> <75f3> 16000 <75f4> <75f4> 1274 <75f5> <75f8> 16002 <75f9> <75f9> 1085 <75fa> <75fb> 16006 <75fc> <75fc> 7033 <75fd> <75fe> 16008 <75ff> <75ff> 7034 <7600> <7600> 7036 <7601> <7601> 1380 <7602> <7602> 9646 <7603> <7603> 7031 <7604> <7604> 16010 <7605> <7605> 7037 <7606> <7609> 16011 <760a> <760a> 7040 <760b> <760b> 7937 <760c> <760c> 7038 <760d> <760d> 8704 <760e> <760f> 16015 <7610> <7610> 7035 <7611> <7614> 16017 <7615> <7615> 7043 <7616> <7616> 16021 <7617> <7617> 7039 <7618> <7618> 7042 <7619> <7619> 7044 <761a> <761a> 16022 <761b> <761b> 7045 <761c> <761d> 16023 <761e> <761e> 9650 <761f> <761f> 3792 <7620> <7620> 7048 <7621> <7621> 7831 <7622> <7622> 7047 <7623> <7623> 16025 <7624> <7624> 2623 <7625> <7625> 7041 <7626> <7626> 3444 <7627> <7627> 8363 <7628> <7628> 16026 <7629> <7629> 1396 <762a> <762a> 1114 <762b> <762b> 3588 <762c> <762c> 16027 <762d> <762d> 7050 <762e> <762f> 16028 <7630> <7630> 7051 <7631> <7632> 16030 <7633> <7633> 7056 <7634> <7634> 4463 <7635> <7635> 7053 <7636> <7637> 16032 <7638> <7638> 3214 <7639> <763a> 16034 <763b> <763b> 9651 <763c> <763c> 7046 <763d> <763d> 16036 <763e> <763e> 7055 <763f> <763f> 7052 <7640> <7640> 7049 <7641> <7641> 16037 <7642> <7642> 8232 <7643> <7643> 7054 <7644> <7645> 16038 <7646> <7647> 9647 endcidrange 100 begincidrange <7648> <7648> 16040 <7649> <7649> 9649 <764a> <764b> 16041 <764c> <764c> 948 <764d> <764d> 7057 <764e> <7653> 16043 <7654> <7654> 7059 <7655> <7655> 16049 <7656> <7656> 7061 <7657> <7657> 16050 <7658> <7658> 9644 <7659> <765b> 16051 <765c> <765c> 7060 <765d> <765d> 16054 <765e> <765e> 7058 <765f> <765f> 7758 <7660> <7661> 16055 <7662> <7662> 8706 <7663> <7663> 4043 <7664> <7664> 9643 <7665> <7665> 8838 <7666> <7666> 16057 <7667> <7667> 9645 <7668> <7668> 16058 <7669> <7669> 9654 <766a> <766a> 16059 <766b> <766b> 7062 <766c> <766c> 8675 <766d> <766e> 9652 <766f> <766f> 7063 <7670> <7670> 8751 <7671> <7671> 8549 <7672> <7672> 9655 <7673> <7677> 16060 <7678> <7678> 1864 <7679> <767a> 16065 <767b> <767b> 1448 <767c> <767c> 7913 <767d> <767d> 994 <767e> <767e> 996 <767f> <7681> 16067 <7682> <7682> 4400 <7683> <7683> 16070 <7684> <7684> 1445 <7685> <7685> 16071 <7686> <7686> 2213 <7687> <7687> 2015 <7688> <7688> 6957 <7689> <768a> 16072 <768b> <768b> 1753 <768c> <768d> 16074 <768e> <768e> 6958 <768f> <7690> 16076 <7691> <7691> 947 <7692> <7692> 16078 <7693> <7693> 6959 <7694> <7695> 16079 <7696> <7696> 3743 <7697> <7698> 16081 <7699> <7699> 6960 <769a> <769a> 7717 <769b> <76a3> 16083 <76a4> <76a4> 6961 <76a5> <76ad> 16092 <76ae> <76ae> 3011 <76af> <76b0> 16101 <76b1> <76b1> 4580 <76b2> <76b2> 7112 <76b3> <76b3> 16103 <76b4> <76b4> 7113 <76b5> <76b7> 16104 <76b8> <76b8> 9664 <76b9> <76b9> 16107 <76ba> <76ba> 8858 <76bb> <76be> 16108 <76bf> <76bf> 2808 <76c0> <76c1> 16112 <76c2> <76c2> 4288 <76c3> <76c4> 16114 <76c5> <76c5> 4560 <76c6> <76c6> 2985 <76c7> <76c7> 16116 <76c8> <76c8> 4244 <76c9> <76c9> 16117 <76ca> <76ca> 4205 <76cb> <76cc> 16118 <76cd> <76cd> 6795 <76ce> <76ce> 966 <76cf> <76cf> 4438 <76d0> <76d0> 4087 <76d1> <76d1> 2131 <76d2> <76d2> 1927 <76d3> <76d3> 16120 <76d4> <76d4> 2437 <76d5> <76d5> 16121 <76d6> <76d6> 1730 <76d7> <76d7> 1442 <76d8> <76d8> 2957 <76d9> <76da> 16122 <76db> <76db> 3385 endcidrange 100 begincidrange <76dc> <76dd> 16124 <76de> <76de> 8814 <76df> <76df> 2768 <76e0> <76e0> 16126 <76e1> <76e1> 8125 <76e2> <76e2> 16127 <76e3> <76e3> 8068 <76e4> <76e4> 8370 <76e5> <76e5> 6796 <76e6> <76e6> 16128 <76e7> <76e7> 8259 <76e8> <76ed> 16129 <76ee> <76ee> 2850 <76ef> <76ef> 1505 <76f0> <76f0> 16135 <76f1> <76f1> 6744 <76f2> <76f2> 2729 <76f3> <76f3> 16136 <76f4> <76f4> 4528 <76f5> <76f7> 16137 <76f8> <76f8> 3917 <76f9> <76f9> 6747 <76fa> <76fb> 16140 <76fc> <76fc> 2959 <76fd> <76fd> 16142 <76fe> <76fe> 1563 <76ff> <76ff> 16143 <7700> <7700> 16144 <7701> <7701> 3384 <7702> <7703> 16145 <7704> <7704> 6745 <7705> <7706> 16147 <7707> <7708> 6748 <7709> <7709> 2753 <770a> <770a> 16149 <770b> <770b> 2369 <770c> <770c> 16150 <770d> <770d> 6746 <770e> <7718> 16151 <7719> <7719> 6752 <771a> <771a> 6750 <771b> <771e> 16162 <771f> <771f> 4487 <7720> <7720> 2788 <7721> <7721> 16166 <7722> <7722> 6751 <7723> <7725> 16167 <7726> <7726> 6754 <7727> <7727> 16170 <7728> <7728> 4420 <7729> <7729> 4044 <772a> <772c> 16171 <772d> <772d> 6753 <772e> <772e> 16174 <772f> <772f> 2773 <7730> <7734> 16175 <7735> <7735> 6755 <7736> <7736> 2433 <7737> <7737> 2331 <7738> <7738> 6756 <7739> <7739> 16180 <773a> <773a> 3658 <773b> <773b> 16181 <773c> <773c> 4100 <773d> <773f> 16182 <7740> <7740> 4642 <7741> <7741> 4503 <7742> <7742> 16185 <7743> <7743> 6760 <7744> <7746> 16186 <7747> <7747> 6759 <7748> <774e> 16189 <774f> <774f> 9860 <7750> <7751> 6757 <7752> <7759> 16196 <775a> <775a> 6761 <775b> <775b> 2261 <775c> <775d> 16204 <775e> <775e> 9455 <775f> <7760> 16206 <7761> <7761> 3492 <7762> <7762> 6763 <7763> <7763> 1532 <7764> <7764> 16208 <7765> <7765> 6764 <7766> <7766> 2851 <7767> <7767> 16209 <7768> <7768> 6762 <7769> <776a> 16210 <776b> <776b> 2223 <776c> <776c> 1166 <776d> <7778> 16212 <7779> <7779> 1538 <777a> <777c> 16224 <777d> <777d> 6767 <777e> <777e> 4720 <777f> <777f> 6765 <7780> <7780> 6768 <7781> <7783> 16227 <7784> <7784> 2798 endcidrange 100 begincidrange <7785> <7785> 1303 <7786> <778b> 16230 <778c> <778c> 6769 <778d> <778d> 6766 <778e> <778e> 3878 <778f> <7790> 16236 <7791> <7791> 6770 <7792> <7792> 2718 <7793> <7797> 16238 <7798> <7798> 9454 <7799> <779d> 16243 <779e> <779e> 8308 <779f> <77a0> 6771 <77a1> <77a1> 16248 <77a2> <77a2> 5269 <77a3> <77a4> 16249 <77a5> <77a5> 3026 <77a6> <77a6> 16251 <77a7> <77a7> 3139 <77a8> <77a8> 16252 <77a9> <77a9> 4596 <77aa> <77aa> 1450 <77ab> <77ab> 16253 <77ac> <77ac> 3495 <77ad> <77ad> 9863 <77ae> <77af> 16254 <77b0> <77b0> 6773 <77b1> <77b2> 16256 <77b3> <77b3> 3676 <77b4> <77b4> 16258 <77b5> <77b5> 6774 <77b6> <77ba> 16259 <77bb> <77bb> 4433 <77bc> <77bc> 9456 <77bd> <77bd> 6775 <77be> <77be> 16264 <77bf> <77bf> 7550 <77c0> <77c6> 16265 <77c7> <77c7> 9869 <77c8> <77cc> 16272 <77cd> <77cd> 5015 <77ce> <77d6> 16277 <77d7> <77d7> 1318 <77d8> <77d9> 16286 <77da> <77da> 8864 <77db> <77db> 2737 <77dc> <77dc> 7114 <77dd> <77e1> 16288 <77e2> <77e2> 3407 <77e3> <77e3> 4186 <77e4> <77e4> 16293 <77e5> <77e5> 4521 <77e6> <77e6> 16294 <77e7> <77e7> 6938 <77e8> <77e8> 16295 <77e9> <77e9> 2311 <77ea> <77ea> 16296 <77eb> <77eb> 2196 <77ec> <77ec> 6939 <77ed> <77ed> 1547 <77ee> <77ee> 950 <77ef> <77ef> 8107 <77f0> <77f2> 16297 <77f3> <77f3> 3398 <77f4> <77f5> 16300 <77f6> <77f6> 6690 <77f7> <77f7> 16302 <77f8> <77f8> 6691 <77f9> <77fc> 16303 <77fd> <77fd> 3848 <77fe> <77fe> 1612 <77ff> <77ff> 2432 <7800> <7800> 6692 <7801> <7801> 2706 <7802> <7802> 3305 <7803> <7808> 16307 <7809> <7809> 6693 <780a> <780b> 16313 <780c> <780c> 3093 <780d> <780d> 2368 <780e> <7810> 16315 <7811> <7811> 6696 <7812> <7812> 3001 <7813> <7813> 16318 <7814> <7814> 4089 <7815> <7815> 16319 <7816> <7816> 4614 <7817> <7818> 6694 <7819> <7819> 16320 <781a> <781a> 4107 <781b> <781b> 16321 <781c> <781d> 6699 <781e> <781e> 16322 <781f> <781f> 6704 <7820> <7822> 16323 <7823> <7823> 6708 <7824> <7824> 16326 <7825> <7825> 6706 <7826> <7826> 6714 <7827> <7827> 4489 endcidrange 100 begincidrange <7828> <7828> 16327 <7829> <7829> 6709 <782a> <782b> 16328 <782c> <782c> 6707 <782d> <782d> 6698 <782e> <782f> 16330 <7830> <7830> 2986 <7831> <7833> 16332 <7834> <7834> 3045 <7835> <7836> 16335 <7837> <7837> 3362 <7838> <7838> 4373 <7839> <783b> 6701 <783c> <783c> 6705 <783d> <783d> 16337 <783e> <783e> 2532 <783f> <783f> 16338 <7840> <7840> 1316 <7841> <7842> 16339 <7843> <7843> 9896 <7844> <7844> 16341 <7845> <7845> 1857 <7846> <7846> 16342 <7847> <7847> 6716 <7848> <784b> 16343 <784c> <784c> 6717 <784d> <784d> 16347 <784e> <784e> 6710 <784f> <784f> 16348 <7850> <7850> 6715 <7851> <7851> 16349 <7852> <7852> 3847 <7853> <7854> 16350 <7855> <7855> 3499 <7856> <7857> 6712 <7858> <785c> 16352 <785d> <785d> 3938 <785e> <7863> 16357 <7864> <7864> 9449 <7865> <7867> 16363 <7868> <7868> 9445 <7869> <7869> 16366 <786a> <786a> 6718 <786b> <786b> 2619 <786c> <786c> 4247 <786d> <786d> 6711 <786e> <786e> 3218 <786f> <786f> 8698 <7870> <7876> 16367 <7877> <7877> 2146 <7878> <787b> 16374 <787c> <787c> 2993 <787d> <7886> 16378 <7887> <7887> 6722 <7888> <7888> 16388 <7889> <7889> 1488 <788a> <788b> 16389 <788c> <788c> 2652 <788d> <788d> 952 <788e> <788e> 3550 <788f> <7890> 16391 <7891> <7891> 1047 <7892> <7892> 16393 <7893> <7893> 6720 <7894> <7896> 16394 <7897> <7897> 3740 <7898> <7898> 1475 <7899> <7899> 16397 <789a> <789a> 6721 <789b> <789b> 6719 <789c> <789c> 6723 <789d> <789e> 16398 <789f> <789f> 1499 <78a0> <78a0> 16400 <78a1> <78a1> 6724 <78a2> <78a2> 16401 <78a3> <78a3> 6725 <78a4> <78a4> 16402 <78a5> <78a5> 6728 <78a6> <78a6> 16403 <78a7> <78a7> 1077 <78a8> <78a8> 16404 <78a9> <78a9> 8520 <78aa> <78ac> 16405 <78ad> <78ad> 9444 <78ae> <78af> 16408 <78b0> <78b0> 2999 <78b1> <78b1> 2145 <78b2> <78b2> 6726 <78b3> <78b3> 3599 <78b4> <78b4> 1201 <78b5> <78b7> 16410 <78b8> <78b8> 9446 <78b9> <78b9> 6727 <78ba> <78ba> 8439 <78bb> <78bb> 16413 <78bc> <78bc> 8299 <78bd> <78bd> 16414 <78be> <78be> 2894 <78bf> <78c0> 16415 endcidrange 100 begincidrange <78c1> <78c1> 1352 <78c2> <78c4> 16417 <78c5> <78c5> 1024 <78c6> <78c8> 16420 <78c9> <78c9> 6731 <78ca> <78ca> 2501 <78cb> <78cb> 1387 <78cc> <78cf> 16423 <78d0> <78d0> 2958 <78d1> <78d3> 16427 <78d4> <78d4> 6729 <78d5> <78d5> 2385 <78d6> <78d8> 16430 <78d9> <78d9> 6730 <78da> <78da> 8871 <78db> <78e2> 16433 <78e3> <78e3> 9452 <78e4> <78e6> 16441 <78e7> <78e7> 9451 <78e8> <78e8> 2824 <78e9> <78eb> 16444 <78ec> <78ec> 6732 <78ed> <78ee> 16447 <78ef> <78ef> 9443 <78f0> <78f1> 16449 <78f2> <78f2> 6733 <78f3> <78f3> 16451 <78f4> <78f4> 6735 <78f5> <78f6> 16452 <78f7> <78f7> 2592 <78f8> <78f9> 16454 <78fa> <78fa> 2012 <78fb> <78fc> 16456 <78fd> <78fd> 9450 <78fe> <78ff> 16458 <7900> <7900> 16460 <7901> <7901> 2185 <7902> <7904> 16461 <7905> <7905> 6734 <7906> <790d> 16464 <790e> <790e> 7826 <790f> <7912> 16472 <7913> <7913> 6736 <7914> <7918> 16476 <7919> <7919> 7719 <791a> <791d> 16481 <791e> <791e> 6738 <791f> <7923> 16485 <7924> <7924> 6737 <7925> <7925> 16490 <7926> <7926> 8166 <7927> <7929> 16491 <792a> <792a> 9447 <792b> <792b> 8210 <792c> <792c> 7916 <792d> <7930> 16494 <7931> <7931> 9448 <7932> <7933> 16498 <7934> <7934> 6739 <7935> <7939> 16500 <793a> <793a> 3413 <793b> <793b> 6648 <793c> <793c> 2524 <793d> <793d> 16505 <793e> <793e> 3360 <793f> <793f> 16506 <7940> <7940> 6649 <7941> <7941> 3085 <7942> <7945> 16507 <7946> <7946> 6650 <7947> <7947> 16511 <7948> <7948> 3084 <7949> <7949> 6651 <794a> <7952> 16512 <7953> <7953> 6654 <7954> <7955> 16521 <7956> <7956> 4675 <7957> <7957> 6657 <7958> <7959> 16523 <795a> <795a> 6655 <795b> <795c> 6652 <795d> <795d> 4608 <795e> <795e> 3370 <795f> <795f> 3555 <7960> <7960> 6658 <7961> <7961> 16525 <7962> <7962> 6656 <7963> <7964> 16526 <7965> <7965> 3926 <7966> <7966> 16528 <7967> <7967> 6660 <7968> <7968> 3024 <7969> <796c> 16529 <796d> <796d> 2099 <796e> <796e> 16533 <796f> <796f> 6659 <7970> <7976> 16534 <7977> <7977> 1436 <7978> <7978> 2059 <7979> <7979> 16541 endcidrange 100 begincidrange <797a> <797a> 6661 <797b> <797f> 16542 <7980> <7980> 4875 <7981> <7981> 2252 <7982> <7983> 16547 <7984> <7984> 2658 <7985> <7985> 6662 <7986> <7989> 16549 <798a> <798a> 6663 <798b> <798c> 16553 <798d> <798d> 8038 <798e> <798e> 9436 <798f> <798f> 1694 <7990> <7999> 16555 <799a> <799a> 6664 <799b> <79a5> 16565 <79a6> <79a6> 9890 <79a7> <79a7> 6665 <79a8> <79a9> 16576 <79aa> <79aa> 9437 <79ab> <79ad> 16578 <79ae> <79ae> 8206 <79af> <79af> 16581 <79b0> <79b0> 9435 <79b1> <79b1> 7864 <79b2> <79b2> 16582 <79b3> <79b3> 6666 <79b4> <79b8> 16583 <79b9> <79b9> 4306 <79ba> <79ba> 4708 <79bb> <79bb> 2518 <79bc> <79bc> 16588 <79bd> <79bd> 3162 <79be> <79be> 1923 <79bf> <79bf> 16589 <79c0> <79c0> 4014 <79c1> <79c1> 3506 <79c2> <79c2> 16590 <79c3> <79c3> 3691 <79c4> <79c5> 16591 <79c6> <79c6> 1740 <79c7> <79c8> 16593 <79c9> <79c9> 1125 <79ca> <79ca> 16595 <79cb> <79cb> 3180 <79cc> <79cc> 16596 <79cd> <79cd> 4565 <79ce> <79d0> 16597 <79d1> <79d1> 2387 <79d2> <79d2> 2800 <79d3> <79d4> 16600 <79d5> <79d5> 6941 <79d6> <79d7> 16602 <79d8> <79d8> 2781 <79d9> <79de> 16604 <79df> <79df> 4671 <79e0> <79e2> 16610 <79e3> <79e3> 6943 <79e4> <79e4> 1272 <79e5> <79e5> 16613 <79e6> <79e6> 3157 <79e7> <79e7> 4118 <79e8> <79e8> 16614 <79e9> <79e9> 4551 <79ea> <79ea> 16615 <79eb> <79eb> 6944 <79ec> <79ec> 16616 <79ed> <79ed> 6942 <79ee> <79ee> 16617 <79ef> <79ef> 2066 <79f0> <79f0> 1259 <79f1> <79f7> 16618 <79f8> <79f8> 2214 <79f9> <79fa> 16625 <79fb> <79fb> 4173 <79fc> <79fc> 16627 <79fd> <79fd> 2037 <79fe> <79ff> 16628 <7a00> <7a00> 3854 <7a01> <7a01> 16630 <7a02> <7a02> 6948 <7a03> <7a03> 6947 <7a04> <7a05> 16631 <7a06> <7a06> 6945 <7a07> <7a0a> 16633 <7a0b> <7a0b> 1265 <7a0c> <7a0c> 16637 <7a0d> <7a0d> 3341 <7a0e> <7a0e> 3493 <7a0f> <7a13> 16638 <7a14> <7a14> 6950 <7a15> <7a16> 16643 <7a17> <7a17> 1001 <7a18> <7a19> 16645 <7a1a> <7a1a> 4552 <7a1b> <7a1d> 16647 <7a1e> <7a1e> 6949 <7a1f> <7a1f> 16650 <7a20> <7a20> 1298 <7a21> <7a22> 16651 endcidrange 100 begincidrange <7a23> <7a23> 7567 <7a24> <7a2d> 16653 <7a2e> <7a2e> 8853 <7a2f> <7a30> 16663 <7a31> <7a31> 7808 <7a32> <7a32> 16665 <7a33> <7a33> 3799 <7a34> <7a36> 16666 <7a37> <7a37> 6952 <7a38> <7a38> 16669 <7a39> <7a39> 6951 <7a3a> <7a3a> 16670 <7a3b> <7a3b> 1439 <7a3c> <7a3c> 2125 <7a3d> <7a3d> 2065 <7a3e> <7a3e> 16671 <7a3f> <7a3f> 1760 <7a40> <7a40> 9847 <7a41> <7a45> 16672 <7a46> <7a46> 2853 <7a47> <7a4b> 16677 <7a4c> <7a4c> 9764 <7a4d> <7a4d> 8041 <7a4e> <7a4e> 8747 <7a4f> <7a50> 16682 <7a51> <7a51> 6953 <7a52> <7a56> 16684 <7a57> <7a57> 3552 <7a58> <7a60> 16689 <7a61> <7a61> 9599 <7a62> <7a62> 8027 <7a63> <7a68> 16698 <7a69> <7a69> 8603 <7a6a> <7a6a> 16704 <7a6b> <7a6b> 9853 <7a6c> <7a6f> 16705 <7a70> <7a70> 6956 <7a71> <7a73> 16709 <7a74> <7a74> 4049 <7a75> <7a75> 16712 <7a76> <7a76> 2286 <7a77> <7a77> 3179 <7a78> <7a79> 7066 <7a7a> <7a7a> 2402 <7a7b> <7a7e> 16713 <7a7f> <7a7f> 1324 <7a80> <7a80> 7068 <7a81> <7a81> 3692 <7a82> <7a82> 16717 <7a83> <7a83> 3153 <7a84> <7a84> 4430 <7a85> <7a85> 16718 <7a86> <7a86> 7069 <7a87> <7a87> 16719 <7a88> <7a88> 7070 <7a89> <7a8c> 16720 <7a8d> <7a8d> 3148 <7a8e> <7a90> 16724 <7a91> <7a91> 4139 <7a92> <7a92> 4558 <7a93> <7a94> 16727 <7a95> <7a95> 7071 <7a96> <7a96> 2210 <7a97> <7a97> 1331 <7a98> <7a98> 2284 <7a99> <7a9b> 16729 <7a9c> <7a9c> 1375 <7a9d> <7a9d> 3808 <7a9e> <7a9e> 16732 <7a9f> <7a9f> 2412 <7aa0> <7aa0> 7073 <7aa1> <7aa4> 16733 <7aa5> <7aa5> 2439 <7aa6> <7aa6> 7072 <7aa7> <7aa7> 16737 <7aa8> <7aa8> 7075 <7aa9> <7aa9> 8608 <7aaa> <7aaa> 8582 <7aab> <7aab> 16738 <7aac> <7aac> 7074 <7aad> <7aad> 7076 <7aae> <7aae> 8429 <7aaf> <7ab2> 16739 <7ab3> <7ab3> 7077 <7ab4> <7ab5> 16743 <7ab6> <7ab6> 9657 <7ab7> <7ab9> 16745 <7aba> <7aba> 8170 <7abb> <7abe> 16748 <7abf> <7abf> 2631 <7ac0> <7ac3> 16752 <7ac4> <7ac4> 7844 <7ac5> <7ac5> 8417 <7ac6> <7ac6> 16756 <7ac7> <7ac7> 9656 <7ac8> <7ac8> 8800 <7ac9> <7ac9> 16757 <7aca> <7aca> 8418 <7acb> <7acb> 2539 <7acc> <7ad5> 16758 endcidrange 100 begincidrange <7ad6> <7ad6> 3473 <7ad7> <7ad8> 16768 <7ad9> <7ad9> 4447 <7ada> <7add> 16770 <7ade> <7ade> 2281 <7adf> <7adf> 2280 <7ae0> <7ae0> 4451 <7ae1> <7ae2> 16774 <7ae3> <7ae3> 2351 <7ae4> <7ae4> 16776 <7ae5> <7ae5> 3680 <7ae6> <7ae6> 7065 <7ae7> <7ae9> 16777 <7aea> <7aea> 8513 <7aeb> <7aec> 16780 <7aed> <7aed> 2224 <7aee> <7aee> 16782 <7aef> <7aef> 1546 <7af0> <7af5> 16783 <7af6> <7af6> 8135 <7af7> <7af8> 16789 <7af9> <7af9> 4592 <7afa> <7afa> 7267 <7afb> <7afc> 16791 <7afd> <7afd> 7268 <7afe> <7afe> 16793 <7aff> <7aff> 1736 <7b00> <7b02> 16794 <7b03> <7b04> 7270 <7b05> <7b05> 16797 <7b06> <7b06> 981 <7b07> <7b07> 16798 <7b08> <7b08> 7269 <7b09> <7b09> 16799 <7b0a> <7b0a> 7273 <7b0b> <7b0b> 3558 <7b0c> <7b0e> 16800 <7b0f> <7b0f> 7275 <7b10> <7b10> 16803 <7b11> <7b11> 3953 <7b12> <7b13> 16804 <7b14> <7b14> 1075 <7b15> <7b15> 7272 <7b16> <7b18> 16806 <7b19> <7b19> 7279 <7b1a> <7b1a> 16809 <7b1b> <7b1b> 1458 <7b1c> <7b1d> 16810 <7b1e> <7b1e> 7287 <7b1f> <7b1f> 16812 <7b20> <7b20> 7282 <7b21> <7b23> 16813 <7b24> <7b24> 7284 <7b25> <7b25> 7283 <7b26> <7b26> 1688 <7b27> <7b27> 16816 <7b28> <7b28> 1064 <7b29> <7b29> 16817 <7b2a> <7b2a> 7278 <7b2b> <7b2b> 7274 <7b2c> <7b2c> 1467 <7b2d> <7b2d> 16818 <7b2e> <7b2e> 7280 <7b2f> <7b30> 16819 <7b31> <7b31> 7281 <7b32> <7b32> 16821 <7b33> <7b33> 7285 <7b34> <7b37> 16822 <7b38> <7b38> 7277 <7b39> <7b39> 16826 <7b3a> <7b3a> 2134 <7b3b> <7b3b> 16827 <7b3c> <7b3c> 2630 <7b3d> <7b3d> 16828 <7b3e> <7b3e> 7286 <7b3f> <7b44> 16829 <7b45> <7b45> 7290 <7b46> <7b46> 7745 <7b47> <7b47> 7276 <7b48> <7b48> 16835 <7b49> <7b49> 1449 <7b4a> <7b4a> 16836 <7b4b> <7b4b> 2239 <7b4c> <7b4c> 7292 <7b4d> <7b4e> 16837 <7b4f> <7b4f> 1601 <7b50> <7b50> 2429 <7b51> <7b51> 4605 <7b52> <7b52> 3683 <7b53> <7b53> 16839 <7b54> <7b54> 1395 <7b55> <7b55> 16840 <7b56> <7b56> 1190 <7b57> <7b57> 16841 <7b58> <7b58> 7288 <7b59> <7b59> 16842 <7b5a> <7b5a> 7289 <7b5b> <7b5b> 3313 <7b5c> <7b5c> 16843 <7b5d> <7b5d> 7293 endcidrange 100 begincidrange <7b5e> <7b5f> 16844 <7b60> <7b60> 7294 <7b61> <7b61> 16846 <7b62> <7b62> 7297 <7b63> <7b66> 16847 <7b67> <7b67> 9700 <7b68> <7b6d> 16851 <7b6e> <7b6e> 7295 <7b6f> <7b70> 16857 <7b71> <7b71> 7299 <7b72> <7b72> 7298 <7b73> <7b74> 16859 <7b75> <7b75> 7291 <7b76> <7b76> 16861 <7b77> <7b77> 2423 <7b78> <7b78> 16862 <7b79> <7b79> 1300 <7b7a> <7b7a> 16863 <7b7b> <7b7b> 7296 <7b7c> <7b7d> 16864 <7b7e> <7b7e> 3110 <7b7f> <7b7f> 16866 <7b80> <7b80> 2149 <7b81> <7b84> 16867 <7b85> <7b85> 7307 <7b86> <7b8a> 16871 <7b8b> <7b8b> 8070 <7b8c> <7b8c> 16876 <7b8d> <7b8d> 1816 <7b8e> <7b8f> 16877 <7b90> <7b90> 7300 <7b91> <7b93> 16879 <7b94> <7b94> 1140 <7b95> <7b95> 2067 <7b96> <7b96> 16882 <7b97> <7b97> 3544 <7b98> <7b9b> 16883 <7b9c> <7b9c> 7309 <7b9d> <7b9d> 7305 <7b9e> <7ba0> 16887 <7ba1> <7ba1> 1845 <7ba2> <7ba2> 7310 <7ba3> <7ba5> 16890 <7ba6> <7ba7> 7301 <7ba8> <7ba8> 7306 <7ba9> <7ba9> 2696 <7baa> <7baa> 7308 <7bab> <7bab> 7311 <7bac> <7bac> 7304 <7bad> <7bad> 2160 <7bae> <7bb0> 16893 <7bb1> <7bb1> 3921 <7bb2> <7bb3> 16896 <7bb4> <7bb4> 7312 <7bb5> <7bb7> 16898 <7bb8> <7bb8> 7303 <7bb9> <7bbf> 16901 <7bc0> <7bc0> 8115 <7bc1> <7bc1> 7314 <7bc2> <7bc3> 16908 <7bc4> <7bc4> 7919 <7bc5> <7bc5> 16910 <7bc6> <7bc6> 4618 <7bc7> <7bc7> 3017 <7bc8> <7bc8> 16911 <7bc9> <7bc9> 8868 <7bca> <7bca> 16912 <7bcb> <7bcb> 9704 <7bcc> <7bcc> 7315 <7bcd> <7bd0> 16913 <7bd1> <7bd1> 7313 <7bd2> <7bd2> 16917 <7bd3> <7bd3> 2639 <7bd4> <7bd8> 16918 <7bd9> <7bd9> 1752 <7bda> <7bda> 7317 <7bdb> <7bdc> 16923 <7bdd> <7bdd> 7316 <7bde> <7be0> 16925 <7be1> <7be1> 1374 <7be2> <7be3> 16928 <7be4> <7be4> 9699 <7be5> <7be6> 7318 <7be7> <7be8> 16930 <7be9> <7be9> 8465 <7bea> <7bea> 7320 <7beb> <7bed> 16932 <7bee> <7bee> 2469 <7bef> <7bf0> 16935 <7bf1> <7bf1> 2516 <7bf2> <7bf2> 16937 <7bf3> <7bf3> 9702 <7bf4> <7bf6> 16938 <7bf7> <7bf7> 2994 <7bf8> <7bfb> 16941 <7bfc> <7bfc> 7323 <7bfd> <7bfd> 16945 <7bfe> <7bfe> 7322 <7bff> <7bff> 16946 <7c00> <7c00> 9703 endcidrange 100 begincidrange <7c01> <7c06> 16947 <7c07> <7c07> 1371 <7c08> <7c0a> 16953 <7c0b> <7c0b> 7326 <7c0c> <7c0c> 7321 <7c0d> <7c0d> 8257 <7c0e> <7c0e> 16956 <7c0f> <7c0f> 7324 <7c10> <7c15> 16957 <7c16> <7c16> 7325 <7c17> <7c1d> 16963 <7c1e> <7c1e> 9706 <7c1f> <7c1f> 7327 <7c20> <7c20> 16970 <7c21> <7c21> 8079 <7c22> <7c22> 16971 <7c23> <7c23> 9708 <7c24> <7c25> 16972 <7c26> <7c26> 7329 <7c27> <7c27> 2014 <7c28> <7c29> 16974 <7c2a> <7c2a> 7328 <7c2b> <7c2b> 9707 <7c2c> <7c37> 16976 <7c38> <7c38> 7330 <7c39> <7c3c> 16988 <7c3d> <7c3d> 8400 <7c3e> <7c3e> 8221 <7c3f> <7c3f> 1157 <7c40> <7c40> 7332 <7c41> <7c41> 7331 <7c42> <7c42> 16992 <7c43> <7c43> 8183 <7c44> <7c4b> 16993 <7c4c> <7c4c> 7821 <7c4d> <7c4d> 2081 <7c4e> <7c5b> 17001 <7c5c> <7c5c> 9705 <7c5d> <7c5e> 17015 <7c5f> <7c5f> 9710 <7c60> <7c60> 8250 <7c61> <7c63> 17017 <7c64> <7c64> 9875 <7c65> <7c68> 17020 <7c69> <7c69> 9701 <7c6a> <7c6a> 9709 <7c6b> <7c6b> 17024 <7c6c> <7c6c> 8201 <7c6d> <7c6d> 17025 <7c6e> <7c6e> 8293 <7c6f> <7c71> 17026 <7c72> <7c72> 9891 <7c73> <7c73> 2780 <7c74> <7c74> 4853 <7c75> <7c7a> 17029 <7c7b> <7c7b> 2507 <7c7c> <7c7c> 7370 <7c7d> <7c7d> 4654 <7c7e> <7c88> 17035 <7c89> <7c89> 1656 <7c8a> <7c90> 17046 <7c91> <7c91> 7372 <7c92> <7c92> 2540 <7c93> <7c94> 17053 <7c95> <7c95> 3048 <7c96> <7c96> 17055 <7c97> <7c97> 1369 <7c98> <7c98> 4436 <7c99> <7c9b> 17056 <7c9c> <7c9c> 7374 <7c9d> <7c9d> 7373 <7c9e> <7c9e> 7375 <7c9f> <7c9f> 3535 <7ca0> <7ca1> 17059 <7ca2> <7ca2> 7376 <7ca3> <7ca3> 17061 <7ca4> <7ca4> 4356 <7ca5> <7ca5> 4575 <7ca6> <7ca9> 17062 <7caa> <7caa> 1661 <7cab> <7cad> 17066 <7cae> <7cae> 2561 <7caf> <7cb0> 17069 <7cb1> <7cb1> 2564 <7cb2> <7cb2> 7377 <7cb3> <7cb3> 2267 <7cb4> <7cb8> 17071 <7cb9> <7cb9> 1381 <7cba> <7cbb> 17076 <7cbc> <7cbd> 7378 <7cbe> <7cbe> 2266 <7cbf> <7cc0> 17078 <7cc1> <7cc1> 7380 <7cc2> <7cc4> 17080 <7cc5> <7cc5> 7385 <7cc6> <7cc6> 17083 <7cc7> <7cc7> 7381 <7cc8> <7cc8> 7384 <7cc9> <7cc9> 17084 <7cca> <7cca> 1972 endcidrange 100 begincidrange <7ccb> <7ccb> 17085 <7ccc> <7ccd> 7382 <7cce> <7cd4> 17086 <7cd5> <7cd5> 1757 <7cd6> <7cd6> 3610 <7cd7> <7cd7> 7386 <7cd8> <7cd8> 17093 <7cd9> <7cd9> 1185 <7cda> <7cdb> 17094 <7cdc> <7cdc> 2776 <7cdd> <7cdd> 9717 <7cde> <7cde> 7932 <7cdf> <7cdf> 4390 <7ce0> <7ce0> 2372 <7ce1> <7ce6> 17096 <7ce7> <7ce7> 8228 <7ce8> <7ce8> 7387 <7ce9> <7cee> 17102 <7cef> <7cef> 2933 <7cf0> <7cf0> 9883 <7cf1> <7cf1> 17108 <7cf2> <7cf2> 9715 <7cf3> <7cf3> 17109 <7cf4> <7cf4> 8921 <7cf5> <7cf5> 17110 <7cf6> <7cf6> 9716 <7cf7> <7cf7> 17111 <7cf8> <7cf8> 7399 <7cf9> <7cf9> 9243 <7cfa> <7cfa> 17112 <7cfb> <7cfb> 3874 <7cfc> <7cfd> 17113 <7cfe> <7cfe> 8136 <7cff> <7cff> 17115 <7d00> <7d00> 8059 <7d01> <7d01> 17116 <7d02> <7d02> 9245 <7d03> <7d03> 17117 <7d04> <7d04> 8780 <7d05> <7d05> 8008 <7d06> <7d06> 9244 <7d07> <7d08> 9246 <7d09> <7d09> 8447 <7d0a> <7d0a> 3800 <7d0b> <7d0b> 8602 <7d0c> <7d0c> 17118 <7d0d> <7d0d> 8337 <7d0e> <7d0f> 17119 <7d10> <7d10> 8359 <7d11> <7d12> 17121 <7d13> <7d13> 9251 <7d14> <7d14> 7835 <7d15> <7d15> 9250 <7d16> <7d16> 17123 <7d17> <7d17> 8464 <7d18> <7d18> 17124 <7d19> <7d19> 8845 <7d1a> <7d1a> 8049 <7d1b> <7d1b> 7928 <7d1c> <7d1c> 9249 <7d1d> <7d1f> 17125 <7d20> <7d20> 3533 <7d21> <7d21> 7923 <7d22> <7d22> 3564 <7d23> <7d26> 17128 <7d27> <7d27> 2245 <7d28> <7d2a> 17132 <7d2b> <7d2b> 4652 <7d2c> <7d2e> 17135 <7d2f> <7d2f> 2502 <7d30> <7d30> 8625 <7d31> <7d31> 9254 <7d32> <7d32> 9253 <7d33> <7d33> 8480 <7d34> <7d38> 17138 <7d39> <7d39> 8474 <7d3a> <7d3a> 9252 <7d3b> <7d3b> 17143 <7d3c> <7d3c> 9256 <7d3d> <7d3e> 17144 <7d3f> <7d3f> 9258 <7d40> <7d40> 9257 <7d41> <7d41> 17146 <7d42> <7d42> 8852 <7d43> <7d43> 17147 <7d44> <7d44> 8894 <7d45> <7d45> 17148 <7d46> <7d46> 7729 <7d47> <7d4d> 17149 <7d4e> <7d4e> 9260 <7d4f> <7d4f> 17156 <7d50> <7d50> 8117 <7d51> <7d5c> 17157 <7d5d> <7d5d> 9259 <7d5e> <7d5e> 8111 <7d5f> <7d60> 17169 <7d61> <7d61> 8296 <7d62> <7d62> 8676 <7d63> <7d65> 17171 <7d66> <7d66> 7969 endcidrange 100 begincidrange <7d67> <7d67> 17174 <7d68> <7d68> 8449 <7d69> <7d6d> 17175 <7d6e> <7d6e> 4032 <7d6f> <7d70> 17180 <7d71> <7d71> 8572 <7d72> <7d72> 8522 <7d73> <7d73> 9261 <7d74> <7d75> 17182 <7d76> <7d76> 8148 <7d77> <7d77> 7400 <7d78> <7d78> 17184 <7d79> <7d79> 8145 <7d7a> <7d80> 17185 <7d81> <7d81> 7731 <7d82> <7d82> 17192 <7d83> <7d83> 9263 <7d84> <7d85> 17193 <7d86> <7d86> 9262 <7d87> <7d87> 17195 <7d88> <7d88> 9264 <7d89> <7d89> 8667 <7d8a> <7d8e> 17196 <7d8f> <7d8f> 8536 <7d90> <7d92> 17201 <7d93> <7d93> 8130 <7d94> <7d9b> 17204 <7d9c> <7d9c> 8889 <7d9d> <7d9d> 17212 <7d9e> <7d9e> 9270 <7d9f> <7da1> 17213 <7da2> <7da2> 7822 <7da3> <7da3> 9273 <7da4> <7da5> 17216 <7da6> <7da6> 7401 <7da7> <7daa> 17218 <7dab> <7dab> 8645 <7dac> <7dac> 9271 <7dad> <7dad> 8594 <7dae> <7dae> 7402 <7daf> <7daf> 17222 <7db0> <7db0> 9274 <7db1> <7db1> 7961 <7db2> <7db2> 8588 <7db3> <7db3> 7744 <7db4> <7db4> 8883 <7db5> <7db7> 17223 <7db8> <7db8> 8287 <7db9> <7db9> 9272 <7dba> <7dba> 9266 <7dbb> <7dbb> 8820 <7dbc> <7dbc> 17226 <7dbd> <7dbd> 7836 <7dbe> <7dbe> 9265 <7dbf> <7dbf> 8325 <7dc0> <7dc3> 17227 <7dc4> <7dc4> 9269 <7dc5> <7dc6> 17231 <7dc7> <7dc7> 9275 <7dc8> <7dc9> 17233 <7dca> <7dca> 8119 <7dcb> <7dcb> 9267 <7dcc> <7dd0> 17235 <7dd1> <7dd1> 8276 <7dd2> <7dd2> 8670 <7dd3> <7dd3> 17240 <7dd4> <7dd4> 9268 <7dd5> <7dd6> 17241 <7dd7> <7dd7> 9277 <7dd8> <7dd8> 8073 <7dd9> <7dd9> 9276 <7dda> <7ddc> 17243 <7ddd> <7ddd> 8046 <7dde> <7dde> 7896 <7ddf> <7ddf> 17246 <7de0> <7de0> 7871 <7de1> <7de1> 9285 <7de2> <7de2> 17247 <7de3> <7de3> 8777 <7de4> <7de5> 17248 <7de6> <7de6> 9281 <7de7> <7de7> 17250 <7de8> <7de8> 7751 <7de9> <7de9> 8022 <7dea> <7deb> 17251 <7dec> <7dec> 8326 <7ded> <7dee> 17253 <7def> <7def> 8598 <7df0> <7df0> 17255 <7df1> <7df1> 9283 <7df2> <7df2> 9279 <7df3> <7df3> 17256 <7df4> <7df4> 8227 <7df5> <7df5> 17257 <7df6> <7df6> 9282 <7df7> <7df8> 17258 <7df9> <7df9> 9278 <7dfa> <7dfa> 17260 <7dfb> <7dfb> 9894 <7dfc> <7dff> 17261 endcidrange 100 begincidrange <7e00> <7e07> 17265 <7e08> <7e08> 9038 <7e09> <7e09> 9286 <7e0a> <7e0a> 9291 <7e0b> <7e0b> 9284 <7e0c> <7e0f> 17273 <7e10> <7e10> 9255 <7e11> <7e11> 9292 <7e12> <7e1a> 17277 <7e1b> <7e1b> 7951 <7e1c> <7e1c> 17286 <7e1d> <7e1d> 9287 <7e1e> <7e1e> 9289 <7e1f> <7e1f> 9288 <7e20> <7e22> 17287 <7e23> <7e23> 8642 <7e24> <7e26> 17290 <7e27> <7e27> 8558 <7e28> <7e2a> 17293 <7e2b> <7e2b> 7939 <7e2c> <7e2c> 17296 <7e2d> <7e2d> 9290 <7e2e> <7e2e> 8540 <7e2f> <7e30> 17297 <7e31> <7e31> 8891 <7e32> <7e32> 9296 <7e33> <7e33> 17299 <7e34> <7e34> 9876 <7e35> <7e35> 9295 <7e36> <7e36> 9718 <7e37> <7e37> 8273 <7e38> <7e38> 17300 <7e39> <7e39> 9294 <7e3a> <7e3a> 17301 <7e3b> <7e3b> 7675 <7e3c> <7e3c> 17302 <7e3d> <7e3d> 8890 <7e3e> <7e3e> 8045 <7e3f> <7e40> 17303 <7e41> <7e41> 1614 <7e42> <7e44> 17305 <7e45> <7e45> 9298 <7e46> <7e46> 9297 <7e47> <7e47> 7403 <7e48> <7e51> 17308 <7e52> <7e52> 9301 <7e53> <7e53> 17318 <7e54> <7e54> 8841 <7e55> <7e55> 8470 <7e56> <7e59> 17319 <7e5a> <7e5a> 9300 <7e5b> <7e5d> 17323 <7e5e> <7e5e> 8443 <7e5f> <7e61> 17326 <7e62> <7e62> 9280 <7e63> <7e68> 17329 <7e69> <7e69> 8486 <7e6a> <7e6a> 8033 <7e6b> <7e6b> 9885 <7e6c> <7e6c> 17335 <7e6d> <7e6d> 8074 <7e6e> <7e6e> 9302 <7e6f> <7e6f> 9305 <7e70> <7e70> 9304 <7e71> <7e72> 17336 <7e73> <7e73> 8110 <7e74> <7e78> 17338 <7e79> <7e79> 8730 <7e7a> <7e7b> 17343 <7e7c> <7e7c> 8058 <7e7d> <7e7d> 9293 <7e7e> <7e7e> 9303 <7e7f> <7e81> 17345 <7e82> <7e82> 4680 <7e83> <7e87> 17348 <7e88> <7e88> 9299 <7e89> <7e89> 17353 <7e8a> <7e8a> 9248 <7e8b> <7e8b> 17354 <7e8c> <7e8c> 8671 <7e8d> <7e8d> 9861 <7e8e> <7e8e> 17355 <7e8f> <7e8f> 7790 <7e90> <7e92> 17356 <7e93> <7e93> 8740 <7e94> <7e94> 9840 <7e95> <7e95> 17359 <7e96> <7e96> 8634 <7e97> <7e97> 17360 <7e98> <7e98> 9306 <7e99> <7e9a> 17361 <7e9b> <7e9b> 7404 <7e9c> <7e9c> 8191 <7e9d> <7e9e> 17363 <7e9f> <7e9f> 6099 <7ea0> <7ea0> 2287 <7ea1> <7ea1> 6100 <7ea2> <7ea2> 1955 <7ea3> <7ea3> 6101 <7ea4> <7ea4> 3896 endcidrange 100 begincidrange <7ea5> <7ea5> 6102 <7ea6> <7ea6> 4351 <7ea7> <7ea7> 2089 <7ea8> <7ea9> 6103 <7eaa> <7eaa> 2112 <7eab> <7eab> 3245 <7eac> <7eac> 3778 <7ead> <7ead> 6105 <7eae> <7eae> 17365 <7eaf> <7eaf> 1346 <7eb0> <7eb0> 6106 <7eb1> <7eb1> 3309 <7eb2> <7eb2> 1748 <7eb3> <7eb3> 2860 <7eb4> <7eb4> 17366 <7eb5> <7eb5> 4666 <7eb6> <7eb6> 2689 <7eb7> <7eb7> 1652 <7eb8> <7eb8> 4540 <7eb9> <7eb9> 3797 <7eba> <7eba> 1633 <7ebb> <7ebc> 17367 <7ebd> <7ebd> 2919 <7ebe> <7ebe> 6107 <7ebf> <7ebf> 3916 <7ec0> <7ec2> 6108 <7ec3> <7ec3> 2560 <7ec4> <7ec4> 4678 <7ec5> <7ec5> 3369 <7ec6> <7ec6> 3877 <7ec7> <7ec7> 4526 <7ec8> <7ec8> 4564 <7ec9> <7ec9> 6111 <7eca> <7eca> 1016 <7ecb> <7ecc> 6112 <7ecd> <7ecd> 3349 <7ece> <7ece> 4214 <7ecf> <7ecf> 2268 <7ed0> <7ed0> 6114 <7ed1> <7ed1> 1022 <7ed2> <7ed2> 3257 <7ed3> <7ed3> 2226 <7ed4> <7ed4> 6115 <7ed5> <7ed5> 3233 <7ed6> <7ed6> 17369 <7ed7> <7ed7> 6116 <7ed8> <7ed8> 2043 <7ed9> <7ed9> 1779 <7eda> <7eda> 4045 <7edb> <7edb> 6117 <7edc> <7edc> 2702 <7edd> <7edd> 2343 <7ede> <7ede> 2203 <7edf> <7edf> 3684 <7ee0> <7ee1> 6118 <7ee2> <7ee2> 2333 <7ee3> <7ee3> 4016 <7ee4> <7ee4> 17370 <7ee5> <7ee5> 3548 <7ee6> <7ee6> 3619 <7ee7> <7ee7> 2111 <7ee8> <7ee8> 6120 <7ee9> <7ee9> 2075 <7eea> <7eea> 4034 <7eeb> <7eeb> 6121 <7eec> <7eec> 17371 <7eed> <7eed> 4035 <7eee> <7eef> 6122 <7ef0> <7ef0> 1349 <7ef1> <7ef2> 6124 <7ef3> <7ef3> 3383 <7ef4> <7ef4> 3771 <7ef5> <7ef5> 2789 <7ef6> <7ef6> 6127 <7ef7> <7ef7> 1066 <7ef8> <7ef8> 1302 <7ef9> <7ef9> 17372 <7efa> <7efb> 6128 <7efc> <7efc> 4664 <7efd> <7efd> 4449 <7efe> <7efe> 6130 <7eff> <7eff> 2675 <7f00> <7f00> 4631 <7f01> <7f03> 6131 <7f04> <7f04> 2141 <7f05> <7f05> 2794 <7f06> <7f06> 2477 <7f07> <7f08> 6134 <7f09> <7f09> 2076 <7f0a> <7f0a> 17373 <7f0b> <7f0c> 6136 <7f0d> <7f0d> 6126 <7f0e> <7f0e> 1551 <7f0f> <7f0f> 6138 <7f10> <7f10> 17374 <7f11> <7f12> 6139 <7f13> <7f13> 1999 <7f14> <7f14> 1471 <7f15> <7f15> 2669 <7f16> <7f16> 1097 endcidrange 100 begincidrange <7f17> <7f17> 6141 <7f18> <7f18> 4344 <7f19> <7f19> 6142 <7f1a> <7f1a> 1722 <7f1b> <7f1b> 6144 <7f1c> <7f1c> 6143 <7f1d> <7f1d> 1673 <7f1e> <7f1e> 17375 <7f1f> <7f1f> 6145 <7f20> <7f20> 1215 <7f21> <7f27> 6146 <7f28> <7f28> 4236 <7f29> <7f29> 3562 <7f2a> <7f2d> 6153 <7f2e> <7f2e> 3330 <7f2f> <7f33> 6157 <7f34> <7f34> 2202 <7f35> <7f35> 6162 <7f36> <7f36> 7262 <7f37> <7f37> 17376 <7f38> <7f38> 1746 <7f39> <7f39> 17377 <7f3a> <7f3a> 3212 <7f3b> <7f41> 17378 <7f42> <7f42> 7263 <7f43> <7f43> 17385 <7f44> <7f45> 7264 <7f46> <7f4b> 17386 <7f4c> <7f4c> 9698 <7f4d> <7f4d> 17392 <7f4e> <7f4e> 9882 <7f4f> <7f4f> 17393 <7f50> <7f50> 1847 <7f51> <7f51> 3753 <7f52> <7f53> 17394 <7f54> <7f54> 4766 <7f55> <7f55> 1896 <7f56> <7f56> 17396 <7f57> <7f57> 2693 <7f58> <7f58> 6785 <7f59> <7f59> 17397 <7f5a> <7f5a> 1600 <7f5b> <7f5e> 17398 <7f5f> <7f5f> 6787 <7f60> <7f60> 17402 <7f61> <7f61> 6786 <7f62> <7f62> 992 <7f63> <7f67> 17403 <7f68> <7f68> 6789 <7f69> <7f69> 4471 <7f6a> <7f6a> 4684 <7f6b> <7f6d> 17408 <7f6e> <7f6e> 4546 <7f6f> <7f6f> 17411 <7f70> <7f70> 7914 <7f71> <7f71> 6791 <7f72> <7f72> 3463 <7f73> <7f73> 17412 <7f74> <7f74> 6790 <7f75> <7f76> 17413 <7f77> <7f77> 7724 <7f78> <7f78> 17415 <7f79> <7f79> 6792 <7f7a> <7f7d> 17416 <7f7e> <7f7e> 6794 <7f7f> <7f80> 17420 <7f81> <7f81> 6793 <7f82> <7f84> 17422 <7f85> <7f85> 8290 <7f86> <7f86> 9457 <7f87> <7f87> 17425 <7f88> <7f88> 9458 <7f89> <7f89> 17426 <7f8a> <7f8a> 4123 <7f8b> <7f8b> 17427 <7f8c> <7f8c> 3129 <7f8d> <7f8d> 17428 <7f8e> <7f8e> 2757 <7f8f> <7f93> 17429 <7f94> <7f94> 1756 <7f95> <7f99> 17434 <7f9a> <7f9a> 2608 <7f9b> <7f9c> 17439 <7f9d> <7f9d> 7364 <7f9e> <7f9e> 4010 <7f9f> <7f9f> 7365 <7fa0> <7fa0> 17441 <7fa1> <7fa1> 3912 <7fa2> <7fa3> 17442 <7fa4> <7fa4> 3221 <7fa5> <7fa5> 9714 <7fa6> <7fa6> 17444 <7fa7> <7fa7> 7366 <7fa8> <7fa8> 17445 <7fa9> <7fa9> 8725 <7faa> <7fae> 17446 <7faf> <7fb0> 7367 <7fb1> <7fb1> 17451 <7fb2> <7fb2> 7369 <7fb3> <7fb7> 17452 endcidrange 100 begincidrange <7fb8> <7fb8> 4878 <7fb9> <7fb9> 1785 <7fba> <7fbb> 17457 <7fbc> <7fbc> 5997 <7fbd> <7fbd> 4309 <7fbe> <7fbe> 17459 <7fbf> <7fbf> 7390 <7fc0> <7fc0> 17460 <7fc1> <7fc1> 3803 <7fc2> <7fc4> 17461 <7fc5> <7fc5> 1286 <7fc6> <7fc9> 17464 <7fca> <7fca> 7064 <7fcb> <7fcb> 17468 <7fcc> <7fcc> 4213 <7fcd> <7fcd> 17469 <7fce> <7fce> 7391 <7fcf> <7fd1> 17470 <7fd2> <7fd2> 8622 <7fd3> <7fd3> 17473 <7fd4> <7fd4> 3925 <7fd5> <7fd5> 7392 <7fd6> <7fd7> 17474 <7fd8> <7fd8> 3145 <7fd9> <7fde> 17476 <7fdf> <7fdf> 1461 <7fe0> <7fe0> 1383 <7fe1> <7fe1> 7394 <7fe2> <7fe4> 17482 <7fe5> <7fe5> 7393 <7fe6> <7fe6> 7395 <7fe7> <7fe8> 17485 <7fe9> <7fe9> 7396 <7fea> <7fed> 17487 <7fee> <7fee> 7397 <7fef> <7fef> 17491 <7ff0> <7ff0> 1897 <7ff1> <7ff1> 970 <7ff2> <7ff2> 17492 <7ff3> <7ff3> 7398 <7ff4> <7ff8> 17493 <7ff9> <7ff9> 8416 <7ffa> <7ffa> 17498 <7ffb> <7ffb> 1610 <7ffc> <7ffc> 4212 <7ffd> <7fff> 17499 <8000> <8000> 4146 <8001> <8001> 2490 <8002> <8002> 17502 <8003> <8003> 2377 <8004> <8004> 6483 <8005> <8005> 4480 <8006> <8006> 6426 <8007> <800a> 17503 <800b> <800b> 7127 <800c> <800c> 1591 <800d> <800d> 3480 <800e> <800f> 17507 <8010> <8010> 2864 <8011> <8011> 17509 <8012> <8012> 7115 <8013> <8013> 17510 <8014> <8014> 7116 <8015> <8015> 1782 <8016> <8016> 7117 <8017> <8017> 1915 <8018> <8018> 4360 <8019> <8019> 989 <801a> <801b> 17511 <801c> <801c> 7118 <801d> <801f> 17513 <8020> <8020> 7119 <8021> <8021> 17516 <8022> <8022> 7120 <8023> <8024> 17517 <8025> <8027> 7121 <8028> <8028> 7125 <8029> <8029> 7124 <802a> <802a> 2966 <802b> <802b> 17519 <802c> <802c> 9666 <802d> <802d> 17520 <802e> <802e> 9665 <802f> <8030> 17521 <8031> <8031> 7126 <8032> <8032> 17523 <8033> <8033> 1593 <8034> <8034> 17524 <8035> <8035> 7128 <8036> <8036> 4149 <8037> <8037> 5297 <8038> <8038> 3519 <8039> <803a> 17525 <803b> <803b> 1281 <803c> <803c> 17527 <803d> <803d> 1411 <803e> <803e> 17528 <803f> <803f> 1787 <8040> <8041> 17529 <8042> <8042> 2903 endcidrange 100 begincidrange <8043> <8043> 7129 <8044> <8045> 17531 <8046> <8046> 7130 <8047> <8049> 17533 <804a> <804a> 2573 <804b> <804b> 2628 <804c> <804c> 4527 <804d> <804d> 7131 <804e> <8051> 17536 <8052> <8052> 7132 <8053> <8053> 17540 <8054> <8054> 2547 <8055> <8055> 17541 <8056> <8056> 8488 <8057> <8057> 17542 <8058> <8058> 3031 <8059> <8059> 17543 <805a> <805a> 2314 <805b> <805d> 17544 <805e> <805e> 8601 <805f> <8068> 17547 <8069> <8069> 7133 <806a> <806a> 1362 <806b> <806e> 17557 <806f> <806f> 8215 <8070> <8070> 7840 <8071> <8071> 7134 <8072> <8072> 8485 <8073> <8073> 8525 <8074> <8074> 17561 <8075> <8075> 9668 <8076> <8076> 8349 <8077> <8077> 8842 <8078> <8078> 17562 <8079> <8079> 9667 <807a> <807c> 17563 <807d> <807d> 8569 <807e> <807e> 8248 <807f> <807f> 6686 <8080> <8080> 6685 <8081> <8082> 17566 <8083> <8083> 3541 <8084> <8084> 4197 <8085> <8085> 8533 <8086> <8086> 3510 <8087> <8087> 4473 <8088> <8088> 17568 <8089> <8089> 3261 <808a> <808a> 17569 <808b> <808b> 2506 <808c> <808c> 2068 <808d> <8092> 17570 <8093> <8093> 6513 <8094> <8095> 17576 <8096> <8096> 3951 <8097> <8097> 17578 <8098> <8098> 4577 <8099> <8099> 17579 <809a> <809a> 1542 <809b> <809b> 1747 <809c> <809c> 6512 <809d> <809d> 1737 <809e> <809e> 17580 <809f> <809f> 6511 <80a0> <80a0> 1227 <80a1> <80a1> 1826 <80a2> <80a2> 4522 <80a3> <80a3> 17581 <80a4> <80a4> 1681 <80a5> <80a5> 1639 <80a6> <80a8> 17582 <80a9> <80a9> 2138 <80aa> <80aa> 1627 <80ab> <80ab> 6518 <80ac> <80ac> 17585 <80ad> <80ad> 6519 <80ae> <80ae> 964 <80af> <80af> 2396 <80b0> <80b0> 17586 <80b1> <80b1> 6517 <80b2> <80b2> 4322 <80b3> <80b3> 17587 <80b4> <80b4> 6520 <80b5> <80b6> 17588 <80b7> <80b7> 6521 <80b8> <80b9> 17590 <80ba> <80ba> 1643 <80bb> <80bb> 17592 <80bc> <80bc> 6514 <80bd> <80bd> 6516 <80be> <80be> 3375 <80bf> <80bf> 4566 <80c0> <80c0> 4462 <80c1> <80c1> 3965 <80c2> <80c2> 6527 <80c3> <80c3> 3783 <80c4> <80c4> 6528 <80c5> <80c5> 17593 <80c6> <80c6> 1417 <80c7> <80cb> 17594 endcidrange 100 begincidrange <80cc> <80cc> 1052 <80cd> <80cd> 6530 <80ce> <80ce> 3576 <80cf> <80d5> 17599 <80d6> <80d6> 2967 <80d7> <80d7> 6531 <80d8> <80d8> 17606 <80d9> <80d9> 6529 <80da> <80da> 2976 <80db> <80db> 6526 <80dc> <80dc> 3387 <80dd> <80dd> 6533 <80de> <80de> 1030 <80df> <80e0> 17607 <80e1> <80e1> 1969 <80e2> <80e3> 17609 <80e4> <80e4> 4717 <80e5> <80e5> 7111 <80e6> <80e6> 17611 <80e7> <80ea> 6522 <80eb> <80eb> 6534 <80ec> <80ec> 6042 <80ed> <80ed> 6537 <80ee> <80ee> 17612 <80ef> <80ef> 2421 <80f0> <80f0> 4175 <80f1> <80f1> 6535 <80f2> <80f2> 6540 <80f3> <80f3> 1767 <80f4> <80f4> 6536 <80f5> <80f5> 17613 <80f6> <80f6> 2187 <80f7> <80f7> 17614 <80f8> <80f8> 4003 <80f9> <80f9> 17615 <80fa> <80fa> 962 <80fb> <80fb> 17616 <80fc> <80fc> 6541 <80fd> <80fd> 2879 <80fe> <80ff> 17617 <8100> <8101> 17619 <8102> <8102> 4523 <8103> <8104> 17621 <8105> <8105> 8658 <8106> <8106> 1379 <8107> <8108> 17623 <8109> <8109> 2717 <810a> <810a> 2092 <810b> <810c> 17625 <810d> <810e> 6538 <810f> <810f> 4387 <8110> <8110> 3081 <8111> <8111> 2871 <8112> <8112> 6543 <8113> <8113> 2920 <8114> <8114> 4873 <8115> <8115> 17627 <8116> <8116> 1144 <8117> <8117> 17628 <8118> <8118> 6548 <8119> <8119> 17629 <811a> <811a> 2198 <811b> <811b> 9415 <811c> <811d> 17630 <811e> <811e> 6546 <811f> <812b> 17632 <812c> <812c> 6547 <812d> <812e> 17645 <812f> <812f> 1703 <8130> <8130> 17647 <8131> <8131> 3714 <8132> <8132> 6549 <8133> <8135> 17648 <8136> <8136> 6545 <8137> <8137> 17651 <8138> <8138> 2556 <8139> <8139> 8825 <813a> <813d> 17652 <813e> <813e> 3009 <813f> <8145> 17656 <8146> <8146> 3654 <8147> <8147> 17663 <8148> <8148> 6550 <8149> <8149> 17664 <814a> <814a> 2459 <814b> <814b> 4159 <814c> <814c> 6551 <814d> <814d> 17665 <814e> <814e> 8483 <814f> <814f> 17666 <8150> <8150> 1706 <8151> <8151> 1704 <8152> <8152> 17667 <8153> <8153> 6552 <8154> <8154> 3128 <8155> <8155> 3748 <8156> <8156> 9413 <8157> <8158> 17668 <8159> <815a> 6554 <815b> <815f> 17670 endcidrange 100 begincidrange <8160> <8160> 6557 <8161> <8161> 9417 <8162> <8164> 17675 <8165> <8165> 3987 <8166> <8166> 8340 <8167> <8167> 6562 <8168> <8168> 17678 <8169> <8169> 6558 <816a> <816a> 17679 <816b> <816b> 8854 <816c> <816c> 17680 <816d> <816d> 6561 <816e> <816e> 3284 <816f> <816f> 17681 <8170> <8170> 4133 <8171> <8171> 6556 <8172> <8173> 17682 <8174> <8174> 6553 <8175> <8177> 17684 <8178> <8178> 7799 <8179> <8179> 1716 <817a> <817a> 3910 <817b> <817b> 2888 <817c> <817d> 6559 <817e> <817e> 3629 <817f> <817f> 3705 <8180> <8180> 1021 <8181> <8181> 17687 <8182> <8182> 6566 <8183> <8187> 17688 <8188> <8188> 6565 <8189> <8189> 17693 <818a> <818a> 1145 <818b> <818e> 17694 <818f> <818f> 1755 <8190> <8190> 17698 <8191> <8191> 6567 <8192> <8197> 17699 <8198> <8198> 1109 <8199> <8199> 17705 <819a> <819a> 7942 <819b> <819b> 3608 <819c> <819c> 2823 <819d> <819d> 3858 <819e> <819f> 17706 <81a0> <81a0> 8101 <81a1> <81a2> 17708 <81a3> <81a3> 6569 <81a4> <81a5> 17710 <81a6> <81a6> 6576 <81a7> <81a7> 17712 <81a8> <81a8> 2995 <81a9> <81a9> 8345 <81aa> <81aa> 6570 <81ab> <81b2> 17713 <81b3> <81b3> 3326 <81b4> <81b9> 17721 <81ba> <81ba> 5697 <81bb> <81bb> 6574 <81bc> <81bc> 17727 <81bd> <81bd> 7853 <81be> <81be> 9416 <81bf> <81bf> 8360 <81c0> <81c0> 3711 <81c1> <81c1> 6575 <81c2> <81c2> 1092 <81c3> <81c3> 4252 <81c4> <81c5> 17728 <81c6> <81c6> 4195 <81c7> <81c8> 17730 <81c9> <81c9> 8223 <81ca> <81ca> 6573 <81cb> <81cb> 17732 <81cc> <81cc> 6571 <81cd> <81cd> 8389 <81ce> <81ce> 17733 <81cf> <81cf> 9418 <81d0> <81d7> 17734 <81d8> <81d8> 8176 <81d9> <81d9> 17742 <81da> <81da> 9414 <81db> <81de> 17743 <81df> <81df> 8797 <81e0> <81e0> 8926 <81e1> <81e2> 17747 <81e3> <81e3> 1249 <81e4> <81e6> 17749 <81e7> <81e7> 6402 <81e8> <81e8> 8236 <81e9> <81e9> 17752 <81ea> <81ea> 4657 <81eb> <81eb> 17753 <81ec> <81ec> 7337 <81ed> <81ed> 1305 <81ee> <81f2> 17754 <81f3> <81f4> 4544 <81f5> <81f9> 17759 <81fa> <81fa> 8545 <81fb> <81fb> 4490 <81fc> <81fc> 2297 endcidrange 100 begincidrange <81fd> <81fd> 17764 <81fe> <81fe> 7333 <81ff> <81ff> 17765 <8200> <8200> 4143 <8201> <8202> 7334 <8203> <8203> 17766 <8204> <8204> 7336 <8205> <8205> 2298 <8206> <8206> 4292 <8207> <8207> 8763 <8208> <8208> 8665 <8209> <8209> 8139 <820a> <820a> 8137 <820b> <820b> 17767 <820c> <820d> 3353 <820e> <820f> 17768 <8210> <8210> 7266 <8211> <8211> 17770 <8212> <8212> 3453 <8213> <8213> 17771 <8214> <8214> 3653 <8215> <821a> 17772 <821b> <821b> 5656 <821c> <821c> 3497 <821d> <821d> 17778 <821e> <821e> 3831 <821f> <821f> 4570 <8220> <8220> 17779 <8221> <8223> 7339 <8224> <8227> 17780 <8228> <8228> 7344 <8229> <8229> 17784 <822a> <822a> 1908 <822b> <822b> 7345 <822c> <822c> 1006 <822d> <822d> 7342 <822e> <822e> 17785 <822f> <822f> 7343 <8230> <8230> 2163 <8231> <8231> 1180 <8232> <8232> 17786 <8233> <8234> 7348 <8235> <8235> 1573 <8236> <8236> 1143 <8237> <8237> 3900 <8238> <8238> 7346 <8239> <8239> 1327 <823a> <823a> 17787 <823b> <823b> 7347 <823c> <823d> 17788 <823e> <823e> 7350 <823f> <8243> 17790 <8244> <8244> 7351 <8245> <8246> 17795 <8247> <8247> 3672 <8248> <8248> 17797 <8249> <8249> 7352 <824a> <824a> 17798 <824b> <824b> 7353 <824c> <824e> 17799 <824f> <824f> 7354 <8250> <8257> 17802 <8258> <8258> 3527 <8259> <8259> 7777 <825a> <825a> 7355 <825b> <825e> 17810 <825f> <825f> 7356 <8260> <8263> 17814 <8264> <8264> 9711 <8265> <8265> 17818 <8266> <8266> 8088 <8267> <8267> 17819 <8268> <8268> 7357 <8269> <826a> 17820 <826b> <826b> 9712 <826c> <826d> 17822 <826e> <826e> 7388 <826f> <826f> 2565 <8270> <8270> 2139 <8271> <8271> 8072 <8272> <8272> 3300 <8273> <8273> 4103 <8274> <8274> 6001 <8275> <8276> 17824 <8277> <8277> 8696 <8278> <8278> 17826 <8279> <8279> 5089 <827a> <827a> 4188 <827b> <827c> 17827 <827d> <827d> 5090 <827e> <827e> 951 <827f> <827f> 5091 <8280> <8281> 17829 <8282> <8282> 2219 <8283> <8283> 17831 <8284> <8284> 5095 <8285> <8287> 17832 <8288> <8288> 4728 <8289> <8289> 17835 <828a> <828a> 5093 endcidrange 100 begincidrange <828b> <828b> 4312 <828c> <828c> 17836 <828d> <828d> 3343 <828e> <828e> 5096 <828f> <828f> 5092 <8290> <8290> 17837 <8291> <8291> 5097 <8292> <8292> 2727 <8293> <8296> 17838 <8297> <8297> 5098 <8298> <8298> 5107 <8299> <8299> 5099 <829a> <829b> 17842 <829c> <829c> 3822 <829d> <829d> 4516 <829e> <829e> 17844 <829f> <829f> 5117 <82a0> <82a0> 17845 <82a1> <82a1> 5115 <82a2> <82a3> 17846 <82a4> <82a4> 5120 <82a5> <82a5> 2231 <82a6> <82a6> 2642 <82a7> <82a7> 17848 <82a8> <82a8> 5094 <82a9> <82a9> 5113 <82aa> <82aa> 5116 <82ab> <82ab> 5100 <82ac> <82ac> 1647 <82ad> <82ad> 976 <82ae> <82ae> 5109 <82af> <82af> 3977 <82b0> <82b0> 5103 <82b1> <82b1> 1981 <82b2> <82b2> 17849 <82b3> <82b3> 1625 <82b4> <82b4> 5114 <82b5> <82b6> 17850 <82b7> <82b7> 5108 <82b8> <82b8> 5101 <82b9> <82b9> 3160 <82ba> <82ba> 17852 <82bb> <82bb> 8994 <82bc> <82bc> 17853 <82bd> <82bd> 4072 <82be> <82be> 5102 <82bf> <82c0> 17854 <82c1> <82c1> 5112 <82c2> <82c3> 17856 <82c4> <82c4> 5118 <82c5> <82c6> 17858 <82c7> <82c7> 3772 <82c8> <82c8> 5104 <82c9> <82c9> 17860 <82ca> <82ca> 5105 <82cb> <82cc> 5110 <82cd> <82cd> 1179 <82ce> <82ce> 5119 <82cf> <82cf> 3530 <82d0> <82d0> 17861 <82d1> <82d1> 4346 <82d2> <82d2> 5129 <82d3> <82d3> 5133 <82d4> <82d4> 3577 <82d5> <82d5> 5140 <82d6> <82d6> 17862 <82d7> <82d7> 2796 <82d8> <82d8> 5130 <82d9> <82da> 17863 <82db> <82db> 2382 <82dc> <82dc> 5127 <82dd> <82dd> 17865 <82de> <82de> 1029 <82df> <82df> 1807 <82e0> <82e0> 5139 <82e1> <82e1> 5121 <82e2> <82e2> 17866 <82e3> <82e3> 5106 <82e4> <82e4> 5124 <82e5> <82e5> 3279 <82e6> <82e6> 2413 <82e7> <82e7> 9014 <82e8> <82ea> 17867 <82eb> <82eb> 3316 <82ec> <82ee> 17870 <82ef> <82ef> 1062 <82f0> <82f0> 17873 <82f1> <82f1> 4231 <82f2> <82f3> 17874 <82f4> <82f4> 5128 <82f5> <82f6> 17876 <82f7> <82f7> 5123 <82f8> <82f8> 17878 <82f9> <82f9> 3034 <82fa> <82fa> 17879 <82fb> <82fb> 5132 <82fc> <82ff> 17880 <8300> <8300> 17884 <8301> <8301> 4639 <8302> <8302> 2740 endcidrange 100 begincidrange <8303> <8303> 1619 <8304> <8304> 3150 <8305> <8305> 2734 <8306> <8306> 5136 <8307> <8307> 5126 <8308> <8308> 5145 <8309> <8309> 5122 <830a> <830b> 17885 <830c> <830c> 5131 <830d> <830d> 17887 <830e> <830e> 2260 <830f> <830f> 5125 <8310> <8310> 17888 <8311> <8311> 5134 <8312> <8313> 17889 <8314> <8315> 5137 <8316> <8316> 17891 <8317> <8317> 5158 <8318> <8319> 17892 <831a> <831a> 5135 <831b> <831b> 5166 <831c> <831c> 5141 <831d> <8326> 17894 <8327> <8327> 2142 <8328> <8328> 1351 <8329> <832a> 17904 <832b> <832b> 2728 <832c> <832c> 1198 <832d> <832d> 5160 <832e> <832e> 17906 <832f> <832f> 5152 <8330> <8330> 17907 <8331> <8331> 5149 <8332> <8332> 17908 <8333> <8333> 5162 <8334> <8334> 5148 <8335> <8335> 4215 <8336> <8336> 1199 <8337> <8337> 17909 <8338> <8338> 3250 <8339> <8339> 3262 <833a> <833a> 5161 <833b> <833b> 17910 <833c> <833c> 5147 <833d> <833f> 17911 <8340> <8340> 5157 <8341> <8342> 17914 <8343> <8343> 5155 <8344> <8345> 17916 <8346> <8346> 2258 <8347> <8347> 5154 <8348> <8348> 17918 <8349> <8349> 1188 <834a> <834e> 17919 <834f> <834f> 5153 <8350> <8350> 2153 <8351> <8351> 5142 <8352> <8352> 2009 <8353> <8353> 17924 <8354> <8354> 2526 <8355> <8359> 17925 <835a> <835a> 2119 <835b> <835c> 5143 <835d> <835d> 17930 <835e> <835e> 5151 <835f> <835f> 5156 <8360> <8360> 5159 <8361> <8361> 1429 <8362> <8362> 17931 <8363> <8363> 3252 <8364> <8364> 2044 <8365> <8365> 5164 <8366> <8366> 5163 <8367> <8367> 4240 <8368> <8368> 5165 <8369> <8369> 5167 <836a> <836a> 5169 <836b> <836b> 4216 <836c> <836c> 5168 <836d> <836e> 5170 <836f> <836f> 4144 <8370> <8376> 17932 <8377> <8377> 1920 <8378> <8378> 5173 <8379> <837a> 17939 <837b> <837b> 5186 <837c> <837c> 5181 <837d> <837d> 5184 <837e> <8384> 17941 <8385> <8385> 5180 <8386> <8386> 3053 <8387> <8388> 17948 <8389> <8389> 2525 <838a> <838a> 8875 <838b> <838d> 17950 <838e> <838e> 3304 <838f> <8391> 17953 <8392> <8392> 5146 <8393> <8393> 5178 <8394> <8395> 17956 endcidrange 100 begincidrange <8396> <8396> 8127 <8397> <8397> 17958 <8398> <8398> 5187 <8399> <839a> 17959 <839b> <839b> 5150 <839c> <839c> 5179 <839d> <839d> 17961 <839e> <839e> 5188 <839f> <839f> 17962 <83a0> <83a0> 5176 <83a1> <83a1> 17963 <83a2> <83a2> 8061 <83a3> <83a6> 17964 <83a7> <83a7> 9011 <83a8> <83a8> 5189 <83a9> <83a9> 5183 <83aa> <83aa> 5177 <83ab> <83ab> 2829 <83ac> <83af> 17968 <83b0> <83b0> 5172 <83b1> <83b1> 2462 <83b2> <83b2> 2548 <83b3> <83b4> 5174 <83b5> <83b5> 17972 <83b6> <83b6> 5182 <83b7> <83b7> 2054 <83b8> <83b8> 5185 <83b9> <83b9> 4237 <83ba> <83ba> 5190 <83bb> <83bb> 17973 <83bc> <83bc> 5191 <83bd> <83bd> 2732 <83be> <83bf> 17974 <83c0> <83c0> 5214 <83c1> <83c1> 5192 <83c2> <83c4> 17976 <83c5> <83c5> 5213 <83c6> <83c6> 17979 <83c7> <83c7> 1814 <83c8> <83c9> 17980 <83ca> <83ca> 2308 <83cb> <83cb> 17982 <83cc> <83cc> 2345 <83cd> <83ce> 17983 <83cf> <83cf> 1921 <83d0> <83d3> 17985 <83d4> <83d4> 5206 <83d5> <83d5> 17989 <83d6> <83d6> 5201 <83d7> <83d7> 17990 <83d8> <83d8> 5195 <83d9> <83db> 17991 <83dc> <83dc> 1170 <83dd> <83dd> 5199 <83de> <83de> 17994 <83df> <83df> 5207 <83e0> <83e0> 1131 <83e1> <83e1> 5217 <83e2> <83e4> 17995 <83e5> <83e5> 5194 <83e6> <83e8> 17998 <83e9> <83e9> 3055 <83ea> <83ea> 5212 <83eb> <83ee> 18001 <83ef> <83ef> 8013 <83f0> <83f0> 5216 <83f1> <83f1> 2603 <83f2> <83f2> 1635 <83f3> <83f7> 18005 <83f8> <83f9> 5210 <83fa> <83fc> 18010 <83fd> <83fd> 5200 <83fe> <83ff> 18013 <8400> <8400> 18015 <8401> <8401> 5193 <8402> <8402> 18016 <8403> <8403> 5209 <8404> <8404> 3620 <8405> <8405> 18017 <8406> <8406> 5205 <8407> <8407> 9012 <8408> <8409> 18018 <840a> <840a> 8177 <840b> <840b> 5198 <840c> <840c> 2765 <840d> <840d> 3035 <840e> <840e> 3773 <840f> <840f> 5208 <8410> <8410> 18020 <8411> <8411> 5204 <8412> <8417> 18021 <8418> <8418> 5197 <8419> <841b> 18027 <841c> <841c> 5202 <841d> <841d> 2691 <841e> <8423> 18030 <8424> <8425> 4238 <8426> <8426> 5215 <8427> <8427> 3937 <8428> <8428> 3283 endcidrange 100 begincidrange <8429> <842b> 18036 <842c> <842c> 8587 <842d> <8430> 18039 <8431> <8431> 5234 <8432> <8434> 18043 <8435> <8435> 9033 <8436> <8437> 18046 <8438> <8438> 5203 <8439> <843b> 18048 <843c> <843c> 5228 <843d> <843d> 2699 <843e> <8445> 18051 <8446> <8446> 5229 <8447> <8448> 18059 <8449> <8449> 8715 <844a> <8450> 18061 <8451> <8451> 5219 <8452> <8452> 9030 <8453> <8456> 18068 <8457> <8457> 4599 <8458> <8458> 18072 <8459> <8459> 5221 <845a> <845a> 5220 <845b> <845b> 1771 <845c> <845c> 5218 <845d> <8460> 18073 <8461> <8461> 3054 <8462> <8462> 18077 <8463> <8463> 1516 <8464> <8464> 9031 <8465> <8465> 18078 <8466> <8466> 8595 <8467> <8468> 18079 <8469> <8469> 5230 <846a> <846a> 18081 <846b> <846b> 1968 <846c> <846c> 4388 <846d> <846d> 5235 <846e> <846e> 18082 <846f> <846f> 9889 <8470> <8470> 18083 <8471> <8471> 1363 <8472> <8472> 18084 <8473> <8473> 5222 <8474> <8474> 18085 <8475> <8475> 2440 <8476> <8476> 5231 <8477> <8477> 8034 <8478> <8478> 5227 <8479> <8479> 18086 <847a> <847a> 5225 <847b> <8481> 18087 <8482> <8482> 1466 <8483> <8486> 18094 <8487> <8488> 5223 <8489> <8489> 5226 <848a> <848a> 18098 <848b> <848b> 2176 <848c> <848c> 5232 <848d> <848d> 18099 <848e> <848e> 5233 <848f> <8492> 18100 <8493> <8493> 9037 <8494> <8494> 9032 <8495> <8496> 18104 <8497> <8497> 5249 <8498> <8498> 18106 <8499> <8499> 2766 <849a> <849b> 18107 <849c> <849c> 3543 <849d> <84a0> 18109 <84a1> <84a1> 5246 <84a2> <84ae> 18113 <84af> <84af> 4759 <84b0> <84b1> 18126 <84b2> <84b2> 3056 <84b3> <84b3> 18128 <84b4> <84b4> 5248 <84b5> <84b7> 18129 <84b8> <84b8> 4501 <84b9> <84b9> 5247 <84ba> <84ba> 5244 <84bb> <84bb> 18132 <84bc> <84bc> 7776 <84bd> <84bd> 5240 <84be> <84be> 18133 <84bf> <84bf> 5243 <84c0> <84c0> 9029 <84c1> <84c1> 5236 <84c2> <84c3> 18134 <84c4> <84c4> 4025 <84c5> <84c8> 18136 <84c9> <84c9> 3251 <84ca> <84ca> 5242 <84cb> <84cb> 7954 <84cc> <84cc> 18140 <84cd> <84cd> 5237 <84ce> <84cf> 18141 <84d0> <84d0> 5238 <84d1> <84d1> 3559 endcidrange 100 begincidrange <84d2> <84d2> 18143 <84d3> <84d3> 5241 <84d4> <84d5> 18144 <84d6> <84d6> 1078 <84d7> <84dc> 18146 <84dd> <84dd> 2465 <84de> <84de> 18152 <84df> <84df> 2094 <84e0> <84e0> 5245 <84e1> <84e2> 18153 <84e3> <84e3> 5251 <84e4> <84e4> 18155 <84e5> <84e5> 5250 <84e6> <84e6> 5239 <84e7> <84eb> 18156 <84ec> <84ec> 2991 <84ed> <84ed> 18161 <84ee> <84ee> 8216 <84ef> <84ef> 9013 <84f0> <84f0> 5255 <84f1> <84fb> 18162 <84fc> <84fc> 5262 <84fd> <84fd> 9020 <84fe> <84fe> 18173 <84ff> <84ff> 5261 <8500> <850b> 18174 <850c> <850c> 5252 <850d> <8510> 18186 <8511> <8511> 2804 <8512> <8512> 18190 <8513> <8513> 2722 <8514> <8514> 9839 <8515> <8516> 18191 <8517> <8517> 4482 <8518> <8519> 18193 <851a> <851a> 3780 <851b> <851d> 18195 <851e> <851e> 9041 <851f> <851f> 5257 <8520> <8520> 18198 <8521> <8521> 1171 <8522> <8522> 18199 <8523> <8523> 8096 <8524> <8525> 18200 <8526> <8526> 9016 <8527> <852a> 18202 <852b> <852b> 2891 <852c> <852c> 3446 <852d> <852d> 8731 <852e> <8536> 18206 <8537> <8537> 3131 <8538> <8538> 5254 <8539> <8539> 5256 <853a> <853a> 5258 <853b> <853b> 5260 <853c> <853c> 949 <853d> <853d> 1079 <853e> <8540> 18215 <8541> <8541> 9026 <8542> <8542> 18218 <8543> <8543> 5270 <8544> <8545> 18219 <8546> <8546> 9039 <8547> <8547> 18221 <8548> <8548> 5264 <8549> <8549> 2183 <854a> <854a> 3274 <854b> <854d> 18222 <854e> <854e> 9021 <854f> <8551> 18225 <8552> <8552> 9028 <8553> <8553> 9009 <8554> <8554> 18228 <8555> <8555> 9035 <8556> <8556> 5259 <8557> <8557> 18229 <8558> <8558> 9019 <8559> <8559> 5263 <855a> <855d> 18230 <855e> <855e> 5267 <855f> <8561> 18234 <8562> <8562> 9040 <8563> <8563> 18237 <8564> <8564> 5266 <8565> <8567> 18238 <8568> <8568> 5265 <8569> <8569> 7860 <856a> <856a> 8614 <856b> <856c> 18241 <856d> <856d> 8651 <856e> <8571> 18243 <8572> <8572> 5271 <8573> <8573> 18247 <8574> <8574> 4367 <8575> <8576> 18248 <8577> <8577> 9045 <8578> <8578> 18250 <8579> <8579> 5277 <857a> <857a> 5268 <857b> <857b> 5272 endcidrange 100 begincidrange <857c> <857d> 18251 <857e> <857e> 2500 <857f> <8583> 18253 <8584> <8584> 1034 <8585> <8585> 5280 <8586> <8586> 18258 <8587> <8587> 5275 <8588> <8588> 9022 <8589> <8589> 18259 <858a> <858a> 8052 <858b> <858b> 18260 <858c> <858c> 9008 <858d> <858e> 18261 <858f> <858f> 5276 <8590> <8590> 18263 <8591> <8591> 9856 <8592> <8593> 18264 <8594> <8594> 8410 <8595> <859a> 18266 <859b> <859b> 4047 <859c> <859c> 5279 <859d> <859e> 18272 <859f> <859f> 9034 <85a0> <85a3> 18274 <85a4> <85a4> 5273 <85a5> <85a5> 18278 <85a6> <85a6> 8081 <85a7> <85a7> 18279 <85a8> <85a8> 5274 <85a9> <85a9> 8455 <85aa> <85aa> 3976 <85ab> <85ad> 18280 <85ae> <85ae> 5278 <85af> <85af> 3460 <85b0> <85b0> 5283 <85b1> <85b6> 18283 <85b7> <85b7> 5282 <85b8> <85b8> 18289 <85b9> <85b9> 5281 <85ba> <85ba> 9023 <85bb> <85c0> 18290 <85c1> <85c1> 5285 <85c2> <85c8> 18296 <85c9> <85c9> 2230 <85ca> <85cc> 18303 <85cd> <85cd> 8180 <85ce> <85ce> 9027 <85cf> <85cf> 1183 <85d0> <85d0> 2799 <85d1> <85d2> 18306 <85d3> <85d3> 5284 <85d4> <85d4> 18308 <85d5> <85d5> 2939 <85d6> <85db> 18309 <85dc> <85dc> 5286 <85dd> <85dd> 8722 <85de> <85e3> 18315 <85e4> <85e4> 3628 <85e5> <85e5> 8711 <85e6> <85e8> 18321 <85e9> <85e9> 1607 <85ea> <85ea> 9049 <85eb> <85f3> 18324 <85f4> <85f4> 8788 <85f5> <85f5> 18333 <85f6> <85f6> 9010 <85f7> <85f8> 18334 <85f9> <85f9> 7718 <85fa> <85fa> 9047 <85fb> <85fb> 4392 <85fc> <85fe> 18336 <85ff> <85ff> 5287 <8600> <8603> 18339 <8604> <8604> 9048 <8605> <8605> 5289 <8606> <8606> 8258 <8607> <8607> 8531 <8608> <860a> 18343 <860b> <860b> 8379 <860c> <8610> 18346 <8611> <8611> 2821 <8612> <8615> 18351 <8616> <8616> 5291 <8617> <8619> 18355 <861a> <861a> 9050 <861b> <861d> 18358 <861e> <861e> 9046 <861f> <8621> 18361 <8622> <8622> 9015 <8623> <8626> 18364 <8627> <8627> 5288 <8628> <8628> 18368 <8629> <8629> 5290 <862a> <862c> 18369 <862d> <862d> 8185 <862e> <8637> 18372 <8638> <8638> 4443 <8639> <8639> 18382 <863a> <863a> 9043 <863b> <863b> 18383 endcidrange 100 begincidrange <863c> <863c> 5292 <863d> <863e> 18384 <863f> <863f> 8289 <8640> <864c> 18386 <864d> <864d> 7152 <864e> <864e> 1975 <864f> <864f> 2649 <8650> <8650> 2929 <8651> <8651> 2670 <8652> <8653> 18399 <8654> <8654> 7153 <8655> <8655> 7829 <8656> <8659> 18401 <865a> <865a> 4020 <865b> <865b> 18405 <865c> <865c> 8265 <865d> <865d> 18406 <865e> <865e> 4290 <865f> <865f> 8002 <8660> <8661> 18407 <8662> <8662> 6509 <8663> <8666> 18409 <8667> <8667> 8168 <8668> <866a> 18413 <866b> <866b> 1291 <866c> <866c> 7154 <866d> <866d> 18416 <866e> <866e> 7155 <866f> <8670> 18417 <8671> <8671> 3396 <8672> <8678> 18419 <8679> <8679> 1950 <867a> <867a> 7157 <867b> <867b> 7159 <867c> <867c> 7158 <867d> <867d> 3545 <867e> <867e> 3879 <867f> <867f> 7156 <8680> <8680> 3403 <8681> <8681> 4182 <8682> <8682> 2707 <8683> <8689> 18426 <868a> <868a> 3794 <868b> <868b> 7162 <868c> <868c> 1025 <868d> <868d> 7161 <868e> <8692> 18433 <8693> <8693> 7168 <8694> <8694> 18438 <8695> <8695> 1174 <8696> <869b> 18439 <869c> <869c> 4074 <869d> <869d> 7164 <869e> <86a2> 18445 <86a3> <86a3> 7166 <86a4> <86a4> 4396 <86a5> <86a6> 18450 <86a7> <86a7> 7165 <86a8> <86a8> 7160 <86a9> <86a9> 7169 <86aa> <86aa> 7167 <86ab> <86ab> 18452 <86ac> <86ac> 7163 <86ad> <86ae> 18453 <86af> <86af> 7177 <86b0> <86b0> 7174 <86b1> <86b1> 7176 <86b2> <86b3> 18455 <86b4> <86b4> 7180 <86b5> <86b5> 7172 <86b6> <86b6> 7170 <86b7> <86b9> 18457 <86ba> <86ba> 7175 <86bb> <86bf> 18460 <86c0> <86c0> 4602 <86c1> <86c3> 18465 <86c4> <86c4> 7171 <86c5> <86c5> 18468 <86c6> <86c6> 3190 <86c7> <86c7> 3352 <86c8> <86c8> 18469 <86c9> <86c9> 7178 <86ca> <86ca> 1823 <86cb> <86cb> 1425 <86cc> <86cd> 18470 <86ce> <86ce> 7173 <86cf> <86cf> 7179 <86d0> <86d0> 7186 <86d1> <86d1> 7192 <86d2> <86d3> 18472 <86d4> <86d4> 2028 <86d5> <86d7> 18474 <86d8> <86d8> 7191 <86d9> <86d9> 3725 <86da> <86da> 18477 <86db> <86db> 4586 <86dc> <86dd> 18478 <86de> <86de> 7188 <86df> <86df> 7190 <86e0> <86e3> 18480 endcidrange 100 begincidrange <86e4> <86e4> 1773 <86e5> <86e8> 18484 <86e9> <86e9> 7181 <86ea> <86ec> 18488 <86ed> <86ed> 7184 <86ee> <86ee> 2720 <86ef> <86ef> 18491 <86f0> <86f0> 4478 <86f1> <86f2> 7182 <86f3> <86f3> 7185 <86f4> <86f4> 7189 <86f5> <86f7> 18492 <86f8> <86f8> 7195 <86f9> <86f9> 4257 <86fa> <86fa> 9690 <86fb> <86fd> 18495 <86fe> <86fe> 1577 <86ff> <86ff> 18498 <8700> <8700> 3464 <8701> <8701> 18499 <8702> <8702> 1665 <8703> <8703> 7193 <8704> <8705> 18500 <8706> <8706> 9687 <8707> <8707> 7194 <8708> <8708> 7196 <8709> <8709> 7199 <870a> <870a> 7197 <870b> <870c> 18502 <870d> <870d> 7198 <870e> <8711> 18504 <8712> <8712> 4090 <8713> <8713> 7187 <8714> <8714> 18508 <8715> <8715> 3706 <8716> <8716> 18509 <8717> <8717> 3806 <8718> <8718> 4520 <8719> <8719> 18510 <871a> <871a> 7205 <871b> <871b> 18511 <871c> <871c> 2784 <871d> <871d> 18512 <871e> <871e> 7202 <871f> <8720> 18513 <8721> <8721> 2458 <8722> <8722> 7214 <8723> <8723> 7200 <8724> <8724> 18515 <8725> <8725> 7203 <8726> <8728> 18516 <8729> <8729> 7210 <872a> <872d> 18519 <872e> <872e> 7204 <872f> <8730> 18523 <8731> <8731> 7209 <8732> <8733> 18525 <8734> <8734> 7208 <8735> <8736> 18527 <8737> <8737> 7211 <8738> <873a> 18529 <873b> <873b> 7201 <873c> <873d> 18532 <873e> <873e> 7206 <873f> <873f> 7212 <8740> <8746> 18534 <8747> <8747> 4241 <8748> <8748> 7207 <8749> <8749> 1212 <874a> <874b> 18541 <874c> <874c> 7220 <874d> <874d> 18543 <874e> <874e> 3958 <874f> <8752> 18544 <8753> <8753> 7223 <8754> <8754> 18548 <8755> <8755> 8494 <8756> <8756> 18549 <8757> <8757> 2013 <8758> <8758> 18550 <8759> <8759> 7227 <875a> <875f> 18551 <8760> <8760> 7218 <8761> <8762> 18557 <8763> <8763> 7224 <8764> <8764> 7226 <8765> <8765> 7228 <8766> <8766> 8626 <8767> <876d> 18559 <876e> <876e> 7221 <876f> <876f> 18566 <8770> <8770> 7219 <8771> <8773> 18567 <8774> <8774> 1970 <8775> <8775> 18570 <8776> <8776> 1500 <8777> <8777> 18571 <8778> <8778> 8606 <8779> <877a> 18572 <877b> <877b> 7217 endcidrange 100 begincidrange <877c> <877c> 7225 <877d> <877e> 7215 <877f> <8781> 18574 <8782> <8782> 7213 <8783> <8783> 7238 <8784> <8784> 9692 <8785> <8785> 7235 <8786> <8787> 18577 <8788> <8788> 7234 <8789> <878a> 18579 <878b> <878b> 7222 <878c> <878c> 18581 <878d> <878d> 3253 <878e> <8792> 18582 <8793> <8793> 7229 <8794> <8796> 18587 <8797> <8797> 7237 <8798> <879d> 18590 <879e> <879e> 8300 <879f> <879f> 2813 <87a0> <87a1> 18596 <87a2> <87a2> 8742 <87a3> <87a7> 18598 <87a8> <87a8> 7231 <87a9> <87aa> 18603 <87ab> <87ab> 7239 <87ac> <87ac> 7241 <87ad> <87ad> 7236 <87ae> <87ae> 18605 <87af> <87af> 7230 <87b0> <87b2> 18606 <87b3> <87b3> 7243 <87b4> <87b4> 18609 <87b5> <87b5> 7242 <87b6> <87b9> 18610 <87ba> <87ba> 2692 <87bb> <87bb> 9696 <87bc> <87bc> 18614 <87bd> <87bd> 7246 <87be> <87bf> 18615 <87c0> <87c0> 7248 <87c1> <87c3> 18617 <87c4> <87c4> 8827 <87c5> <87c5> 18620 <87c6> <87c6> 7233 <87c7> <87c7> 18621 <87c8> <87c8> 9694 <87c9> <87c9> 18622 <87ca> <87ca> 7249 <87cb> <87cb> 7244 <87cc> <87cd> 18623 <87ce> <87ce> 9697 <87cf> <87d0> 18625 <87d1> <87d1> 7247 <87d2> <87d2> 7232 <87d3> <87d3> 7245 <87d4> <87da> 18627 <87db> <87db> 7250 <87dc> <87df> 18634 <87e0> <87e0> 7252 <87e1> <87e2> 18638 <87e3> <87e3> 9685 <87e4> <87e4> 18640 <87e5> <87e5> 7240 <87e6> <87e9> 18641 <87ea> <87ea> 7251 <87eb> <87eb> 18645 <87ec> <87ec> 7787 <87ed> <87ed> 18646 <87ee> <87ee> 7253 <87ef> <87ef> 9691 <87f0> <87f1> 18647 <87f2> <87f2> 7817 <87f3> <87f5> 18649 <87f6> <87f6> 9689 <87f7> <87f8> 18652 <87f9> <87f9> 3970 <87fa> <87fa> 18654 <87fb> <87fb> 8721 <87fc> <87fd> 18655 <87fe> <87fe> 7256 <87ff> <87ff> 18657 <8800> <8802> 18658 <8803> <8803> 4877 <8804> <8804> 18661 <8805> <8805> 8745 <8806> <8806> 9686 <8807> <8809> 18662 <880a> <880a> 7257 <880b> <880f> 18665 <8810> <8810> 9693 <8811> <8811> 9695 <8812> <8812> 18670 <8813> <8813> 7255 <8814> <8814> 18671 <8815> <8815> 3263 <8816> <8816> 7254 <8817> <881a> 18672 <881b> <881b> 7258 <881c> <881e> 18676 endcidrange 100 begincidrange <881f> <881f> 8175 <8820> <8820> 18679 <8821> <8821> 7259 <8822> <8822> 1347 <8823> <8823> 9688 <8824> <8830> 18680 <8831> <8831> 7977 <8832> <8832> 6797 <8833> <8835> 18693 <8836> <8836> 7771 <8837> <8838> 18696 <8839> <8839> 7260 <883a> <883a> 18698 <883b> <883b> 8310 <883c> <883c> 7261 <883d> <883f> 18699 <8840> <8840> 4051 <8841> <8843> 18702 <8844> <8844> 7338 <8845> <8845> 3985 <8846> <8846> 8855 <8847> <8849> 18705 <884a> <884a> 9872 <884b> <884b> 18708 <884c> <884c> 3995 <884d> <884d> 4101 <884e> <8852> 18709 <8853> <8853> 8511 <8854> <8854> 3899 <8855> <8856> 18714 <8857> <8857> 2215 <8858> <8858> 18716 <8859> <8859> 4076 <885a> <885a> 18717 <885b> <885b> 8600 <885c> <885c> 18718 <885d> <885d> 7816 <885e> <8860> 18719 <8861> <8861> 1945 <8862> <8862> 5613 <8863> <8863> 4169 <8864> <8864> 7078 <8865> <8865> 1152 <8866> <8867> 18722 <8868> <8868> 1110 <8869> <8869> 7079 <886a> <886a> 18724 <886b> <886b> 3321 <886c> <886c> 1257 <886d> <886d> 18725 <886e> <886e> 4870 <886f> <886f> 18726 <8870> <8870> 3482 <8871> <8871> 18727 <8872> <8872> 7080 <8873> <8876> 18728 <8877> <8877> 4563 <8878> <8878> 18732 <8879> <8879> 8844 <887a> <887c> 18733 <887d> <887d> 7081 <887e> <887e> 7358 <887f> <887f> 7082 <8880> <8880> 18736 <8881> <8881> 4335 <8882> <8882> 7083 <8883> <8883> 18737 <8884> <8884> 971 <8885> <8885> 7359 <8886> <8887> 18738 <8888> <8888> 7360 <8889> <888a> 18740 <888b> <888b> 1407 <888c> <888c> 18742 <888d> <888d> 2972 <888e> <8891> 18743 <8892> <8892> 3598 <8893> <8895> 18747 <8896> <8896> 4015 <8897> <889b> 18750 <889c> <889c> 3729 <889d> <88a1> 18755 <88a2> <88a2> 7084 <88a3> <88a3> 18760 <88a4> <88a4> 4871 <88a5> <88aa> 18761 <88ab> <88ab> 1060 <88ac> <88ac> 18767 <88ad> <88ad> 3867 <88ae> <88b0> 18768 <88b1> <88b1> 1695 <88b2> <88b6> 18771 <88b7> <88b7> 7086 <88b8> <88bb> 18776 <88bc> <88bc> 7087 <88bd> <88c0> 18780 <88c1> <88c1> 1162 <88c2> <88c2> 2586 <88c3> <88c4> 18784 <88c5> <88c5> 4621 endcidrange 100 begincidrange <88c6> <88c6> 7085 <88c7> <88c8> 18786 <88c9> <88c9> 7088 <88ca> <88ca> 9713 <88cb> <88cd> 18788 <88ce> <88ce> 7090 <88cf> <88cf> 8204 <88d0> <88d1> 18791 <88d2> <88d2> 4874 <88d3> <88d3> 18793 <88d4> <88d4> 4200 <88d5> <88d5> 4326 <88d6> <88d7> 18794 <88d8> <88d8> 7361 <88d9> <88d9> 3220 <88da> <88db> 18796 <88dc> <88dc> 7768 <88dd> <88dd> 8876 <88de> <88de> 18798 <88df> <88df> 7362 <88e0> <88e1> 18799 <88e2> <88e2> 7089 <88e3> <88e3> 7091 <88e4> <88e4> 2416 <88e5> <88e5> 7092 <88e6> <88e7> 18801 <88e8> <88e8> 7096 <88e9> <88ef> 18803 <88f0> <88f0> 7098 <88f1> <88f1> 7093 <88f2> <88f2> 18810 <88f3> <88f3> 3338 <88f4> <88f4> 2978 <88f5> <88f7> 18811 <88f8> <88f8> 2698 <88f9> <88f9> 1877 <88fa> <88fb> 18814 <88fc> <88fc> 7095 <88fd> <88fd> 9895 <88fe> <88fe> 7097 <88ff> <88ff> 18816 <8900> <8901> 18817 <8902> <8902> 1836 <8903> <8906> 18819 <8907> <8907> 9846 <8908> <8909> 18823 <890a> <890a> 7103 <890b> <890f> 18825 <8910> <8910> 1933 <8911> <8911> 18830 <8912> <8912> 1032 <8913> <8913> 7101 <8914> <8918> 18831 <8919> <8919> 7100 <891a> <891a> 7094 <891b> <891b> 7102 <891c> <8920> 18836 <8921> <8921> 7099 <8922> <8924> 18841 <8925> <8925> 3271 <8926> <8929> 18844 <892a> <892a> 3707 <892b> <892b> 7105 <892c> <892f> 18848 <8930> <8930> 5945 <8931> <8931> 18852 <8932> <8932> 8161 <8933> <8933> 9659 <8934> <8934> 7104 <8935> <8935> 18853 <8936> <8936> 7106 <8937> <8937> 18854 <8938> <8938> 9662 <8939> <893a> 18855 <893b> <893b> 8925 <893c> <8940> 18857 <8941> <8941> 7107 <8942> <8943> 18862 <8944> <8944> 3922 <8945> <8946> 18864 <8947> <8947> 9661 <8948> <8955> 18866 <8956> <8956> 7722 <8957> <895c> 18880 <895d> <895d> 9660 <895e> <895e> 7363 <895f> <895f> 2244 <8960> <8960> 9658 <8961> <8963> 18886 <8964> <8964> 9663 <8965> <8965> 18889 <8966> <8966> 7108 <8967> <8969> 18890 <896a> <896a> 8583 <896b> <896b> 18893 <896c> <896c> 9835 <896d> <896e> 18894 <896f> <896f> 7807 <8970> <8971> 18896 <8972> <8972> 8621 endcidrange 100 begincidrange <8973> <897a> 18898 <897b> <897b> 7109 <897c> <897e> 18906 <897f> <897f> 3846 <8980> <8980> 18909 <8981> <8981> 4145 <8982> <8982> 18910 <8983> <8983> 7135 <8984> <8985> 18911 <8986> <8986> 1709 <8987> <898a> 18913 <898b> <898b> 8086 <898c> <898e> 18917 <898f> <898f> 7986 <8990> <8992> 18920 <8993> <8993> 8324 <8994> <8995> 18923 <8996> <8996> 8502 <8997> <8997> 18925 <8998> <8998> 9400 <8999> <89a0> 18926 <89a1> <89a1> 9402 <89a2> <89a5> 18934 <89a6> <89a6> 9404 <89a7> <89a9> 18938 <89aa> <89aa> 8420 <89ab> <89ab> 18941 <89ac> <89ac> 9401 <89ad> <89ae> 18942 <89af> <89af> 9405 <89b0> <89b1> 18944 <89b2> <89b2> 9406 <89b3> <89b6> 18946 <89b7> <89b7> 9407 <89b8> <89b9> 18950 <89ba> <89ba> 8146 <89bb> <89bc> 18952 <89bd> <89bd> 8189 <89be> <89be> 18954 <89bf> <89bf> 9403 <89c0> <89c0> 7981 <89c1> <89c1> 2158 <89c2> <89c2> 1844 <89c3> <89c3> 18955 <89c4> <89c4> 1855 <89c5> <89c5> 2782 <89c6> <89c6> 3434 <89c7> <89c7> 6458 <89c8> <89c8> 2475 <89c9> <89c9> 2340 <89ca> <89cc> 6459 <89cd> <89cd> 18956 <89ce> <89d1> 6462 <89d2> <89d2> 2200 <89d3> <89d5> 18957 <89d6> <89d6> 7511 <89d7> <89d9> 18960 <89da> <89da> 7513 <89db> <89db> 18963 <89dc> <89dc> 7514 <89dd> <89dd> 18964 <89de> <89de> 7512 <89df> <89e2> 18965 <89e3> <89e3> 2227 <89e4> <89e4> 18969 <89e5> <89e5> 7515 <89e6> <89e6> 1320 <89e7> <89ea> 18970 <89eb> <89eb> 7516 <89ec> <89ee> 18974 <89ef> <89ef> 7517 <89f0> <89f2> 18977 <89f3> <89f3> 6592 <89f4> <89f4> 9737 <89f5> <89f5> 18980 <89f6> <89f6> 9738 <89f7> <89f7> 18981 <89f8> <89f8> 7828 <89f9> <89ff> 18982 <8a00> <8a00> 4093 <8a01> <8a01> 8927 <8a02> <8a02> 7883 <8a03> <8a03> 7949 <8a04> <8a06> 18989 <8a07> <8a07> 4862 <8a08> <8a08> 8055 <8a09> <8a09> 18992 <8a0a> <8a0a> 8683 <8a0b> <8a0b> 18993 <8a0c> <8a0c> 8929 <8a0d> <8a0d> 18994 <8a0e> <8a0e> 8559 <8a0f> <8a0f> 18995 <8a10> <8a10> 8928 <8a11> <8a12> 18996 <8a13> <8a13> 8682 <8a14> <8a14> 18998 <8a15> <8a15> 8930 <8a16> <8a16> 8395 <8a17> <8a17> 18999 endcidrange 100 begincidrange <8a18> <8a18> 8056 <8a19> <8a1a> 19000 <8a1b> <8a1b> 7906 <8a1c> <8a1c> 19002 <8a1d> <8a1d> 8690 <8a1e> <8a1e> 19003 <8a1f> <8a1f> 8528 <8a20> <8a22> 19004 <8a23> <8a23> 8147 <8a24> <8a24> 19007 <8a25> <8a25> 8933 <8a26> <8a29> 19008 <8a2a> <8a2a> 7922 <8a2b> <8a2c> 19012 <8a2d> <8a2d> 8479 <8a2e> <8a30> 19014 <8a31> <8a31> 8669 <8a32> <8a33> 19017 <8a34> <8a34> 8532 <8a35> <8a35> 19019 <8a36> <8a36> 8935 <8a37> <8a39> 19020 <8a3a> <8a3a> 8834 <8a3b> <8a3d> 19023 <8a3e> <8a3e> 7518 <8a3f> <8a40> 19026 <8a41> <8a41> 8934 <8a42> <8a45> 19028 <8a46> <8a46> 8936 <8a47> <8a47> 19032 <8a48> <8a48> 6788 <8a49> <8a4d> 19033 <8a4e> <8a4e> 8932 <8a4f> <8a4f> 19038 <8a50> <8a50> 8810 <8a51> <8a51> 19039 <8a52> <8a52> 8939 <8a53> <8a53> 19040 <8a54> <8a54> 8937 <8a55> <8a55> 8381 <8a56> <8a57> 19041 <8a58> <8a58> 8938 <8a59> <8a5a> 19043 <8a5b> <8a5b> 8893 <8a5c> <8a5d> 19045 <8a5e> <8a5e> 7838 <8a5f> <8a60> 19047 <8a61> <8a61> 8950 <8a62> <8a62> 8679 <8a63> <8a63> 8726 <8a64> <8a65> 19049 <8a66> <8a66> 8503 <8a67> <8a68> 19051 <8a69> <8a69> 8492 <8a6a> <8a6a> 19053 <8a6b> <8a6b> 7784 <8a6c> <8a6c> 8946 <8a6d> <8a6d> 7991 <8a6e> <8a6e> 8947 <8a6f> <8a6f> 19054 <8a70> <8a70> 8943 <8a71> <8a71> 8016 <8a72> <8a72> 7952 <8a73> <8a73> 8648 <8a74> <8a74> 19055 <8a75> <8a75> 8945 <8a76> <8a78> 19056 <8a79> <8a79> 4435 <8a7a> <8a7b> 19059 <8a7c> <8a7c> 8944 <8a7d> <8a7e> 19061 <8a7f> <8a7f> 8942 <8a80> <8a83> 19063 <8a84> <8a84> 8941 <8a85> <8a85> 8862 <8a86> <8a86> 8940 <8a87> <8a87> 8162 <8a88> <8a88> 19067 <8a89> <8a89> 4323 <8a8a> <8a8a> 3631 <8a8b> <8a8c> 19068 <8a8d> <8a8d> 8446 <8a8e> <8a90> 19070 <8a91> <8a92> 8953 <8a93> <8a93> 3419 <8a94> <8a94> 19073 <8a95> <8a95> 7855 <8a96> <8a97> 19074 <8a98> <8a98> 8758 <8a99> <8a99> 19076 <8a9a> <8a9a> 8951 <8a9b> <8a9d> 19077 <8a9e> <8a9e> 8765 <8a9f> <8a9f> 19080 <8aa0> <8aa0> 7810 <8aa1> <8aa1> 8118 <8aa2> <8aa2> 19081 <8aa3> <8aa3> 8612 <8aa4> <8aa4> 8618 <8aa5> <8aa5> 8952 endcidrange 100 begincidrange <8aa6> <8aa6> 8529 <8aa7> <8aa7> 19082 <8aa8> <8aa8> 8032 <8aa9> <8aab> 19083 <8aac> <8aac> 8519 <8aad> <8aaf> 19086 <8ab0> <8ab0> 8517 <8ab1> <8ab1> 19089 <8ab2> <8ab2> 8156 <8ab3> <8ab5> 19090 <8ab6> <8ab6> 8961 <8ab7> <8ab8> 19093 <8ab9> <8ab9> 7925 <8aba> <8abb> 19095 <8abc> <8abc> 8728 <8abd> <8abe> 19097 <8abf> <8abf> 7878 <8ac0> <8ac1> 19099 <8ac2> <8ac2> 8960 <8ac3> <8ac3> 19101 <8ac4> <8ac4> 8884 <8ac5> <8ac6> 19102 <8ac7> <8ac7> 8553 <8ac8> <8ac8> 19104 <8ac9> <8ac9> 8957 <8aca> <8aca> 19105 <8acb> <8acb> 8426 <8acc> <8acc> 19106 <8acd> <8acd> 8948 <8ace> <8ace> 19107 <8acf> <8acf> 8955 <8ad0> <8ad0> 19108 <8ad1> <8ad1> 8956 <8ad2> <8ad2> 8231 <8ad3> <8ad5> 19109 <8ad6> <8ad6> 8288 <8ad7> <8ad7> 8959 <8ad8> <8ada> 19112 <8adb> <8adb> 8958 <8adc> <8adc> 7879 <8add> <8add> 19115 <8ade> <8ade> 8972 <8adf> <8ae1> 19116 <8ae2> <8ae2> 8949 <8ae3> <8ae3> 19119 <8ae4> <8ae4> 8966 <8ae5> <8ae5> 19120 <8ae6> <8ae6> 8970 <8ae7> <8ae7> 8659 <8ae8> <8aea> 19121 <8aeb> <8aeb> 8963 <8aec> <8aec> 19124 <8aed> <8aed> 8967 <8aee> <8aee> 8971 <8aef> <8af0> 19125 <8af1> <8af1> 8031 <8af2> <8af2> 19127 <8af3> <8af3> 8969 <8af4> <8af5> 19128 <8af6> <8af6> 8962 <8af7> <8af7> 7940 <8af8> <8af8> 8861 <8af9> <8af9> 19130 <8afa> <8afa> 8699 <8afb> <8afb> 19131 <8afc> <8afc> 8968 <8afd> <8afd> 19132 <8afe> <8afe> 8364 <8aff> <8aff> 19133 <8b00> <8b00> 8334 <8b01> <8b01> 8965 <8b02> <8b02> 8599 <8b03> <8b03> 19134 <8b04> <8b04> 8561 <8b05> <8b05> 8856 <8b06> <8b06> 19135 <8b07> <8b07> 5948 <8b08> <8b09> 19136 <8b0a> <8b0a> 8023 <8b0b> <8b0d> 19138 <8b0e> <8b0e> 8322 <8b0f> <8b0f> 19141 <8b10> <8b10> 8977 <8b11> <8b13> 19142 <8b14> <8b14> 8964 <8b15> <8b15> 19145 <8b16> <8b16> 8975 <8b17> <8b17> 7733 <8b18> <8b18> 19146 <8b19> <8b19> 8401 <8b1a> <8b1a> 8976 <8b1b> <8b1b> 8099 <8b1c> <8b1c> 19147 <8b1d> <8b1d> 8662 <8b1e> <8b20> 19148 <8b21> <8b21> 8710 <8b22> <8b25> 19151 <8b26> <8b26> 7519 <8b27> <8b27> 19155 <8b28> <8b28> 8973 endcidrange 100 begincidrange <8b29> <8b2a> 19156 <8b2b> <8b2b> 8978 <8b2c> <8b2c> 8333 <8b2d> <8b2d> 8979 <8b2e> <8b32> 19158 <8b33> <8b33> 8931 <8b34> <8b38> 19163 <8b39> <8b39> 8122 <8b3a> <8b3d> 19168 <8b3e> <8b3e> 8312 <8b3f> <8b48> 19172 <8b49> <8b49> 8840 <8b4a> <8b4d> 19182 <8b4e> <8b4e> 8982 <8b4f> <8b4f> 8043 <8b50> <8b55> 19186 <8b56> <8b56> 8980 <8b57> <8b57> 19192 <8b58> <8b58> 8496 <8b59> <8b59> 8981 <8b5a> <8b5a> 8552 <8b5b> <8b5b> 19193 <8b5c> <8b5c> 8388 <8b5d> <8b65> 19194 <8b66> <8b66> 2270 <8b67> <8b6a> 19203 <8b6b> <8b6b> 8984 <8b6c> <8b6c> 3016 <8b6d> <8b6e> 19207 <8b6f> <8b6f> 8729 <8b70> <8b70> 8727 <8b71> <8b73> 19209 <8b74> <8b74> 8405 <8b75> <8b76> 19212 <8b77> <8b77> 8010 <8b78> <8b7c> 19214 <8b7d> <8b7d> 8768 <8b7e> <8b7f> 19219 <8b80> <8b80> 7891 <8b81> <8b89> 19221 <8b8a> <8b8a> 7753 <8b8b> <8b8d> 19230 <8b8e> <8b8e> 9755 <8b8f> <8b91> 19233 <8b92> <8b92> 7789 <8b93> <8b93> 8440 <8b94> <8b94> 19236 <8b95> <8b95> 8187 <8b96> <8b96> 8985 <8b97> <8b9b> 19237 <8b9c> <8b9c> 8974 <8b9d> <8b9d> 19242 <8b9e> <8b9e> 8983 <8b9f> <8b9f> 19243 <8ba0> <8ba0> 4887 <8ba1> <8ba1> 2105 <8ba2> <8ba2> 1512 <8ba3> <8ba3> 1719 <8ba4> <8ba4> 3242 <8ba5> <8ba5> 2072 <8ba6> <8ba7> 4888 <8ba8> <8ba8> 3625 <8ba9> <8ba9> 3230 <8baa> <8baa> 4890 <8bab> <8bab> 3100 <8bac> <8bac> 19244 <8bad> <8bad> 4062 <8bae> <8bae> 4208 <8baf> <8baf> 4063 <8bb0> <8bb0> 2106 <8bb1> <8bb1> 19245 <8bb2> <8bb2> 2179 <8bb3> <8bb3> 2041 <8bb4> <8bb5> 4891 <8bb6> <8bb6> 4081 <8bb7> <8bb7> 4893 <8bb8> <8bb8> 4024 <8bb9> <8bb9> 1582 <8bba> <8bba> 2690 <8bbb> <8bbb> 19246 <8bbc> <8bbc> 3524 <8bbd> <8bbd> 1674 <8bbe> <8bbe> 3361 <8bbf> <8bbf> 1632 <8bc0> <8bc0> 2342 <8bc1> <8bc1> 4515 <8bc2> <8bc3> 4894 <8bc4> <8bc4> 3039 <8bc5> <8bc5> 4676 <8bc6> <8bc6> 3405 <8bc7> <8bc7> 19247 <8bc8> <8bc8> 4426 <8bc9> <8bc9> 3540 <8bca> <8bca> 4496 <8bcb> <8bcb> 4896 <8bcc> <8bcc> 4574 <8bcd> <8bcd> 1357 <8bce> <8bce> 4898 <8bcf> <8bcf> 4897 <8bd0> <8bd0> 19248 endcidrange 100 begincidrange <8bd1> <8bd1> 4210 <8bd2> <8bd4> 4899 <8bd5> <8bd5> 3435 <8bd6> <8bd6> 4902 <8bd7> <8bd7> 3394 <8bd8> <8bd9> 4903 <8bda> <8bda> 1268 <8bdb> <8bdb> 4590 <8bdc> <8bdc> 4905 <8bdd> <8bdd> 1989 <8bde> <8bde> 1423 <8bdf> <8be0> 4906 <8be1> <8be1> 1863 <8be2> <8be2> 4056 <8be3> <8be3> 4207 <8be4> <8be4> 4908 <8be5> <8be5> 1726 <8be6> <8be6> 3927 <8be7> <8be7> 1206 <8be8> <8be9> 4909 <8bea> <8bea> 19249 <8beb> <8beb> 2236 <8bec> <8bec> 3819 <8bed> <8bed> 4308 <8bee> <8bee> 4911 <8bef> <8bef> 3842 <8bf0> <8bf0> 4912 <8bf1> <8bf1> 4282 <8bf2> <8bf2> 2042 <8bf3> <8bf3> 4913 <8bf4> <8bf4> 3498 <8bf5> <8bf5> 3525 <8bf6> <8bf6> 4914 <8bf7> <8bf7> 3176 <8bf8> <8bf8> 4589 <8bf9> <8bf9> 4915 <8bfa> <8bfa> 2934 <8bfb> <8bfb> 1536 <8bfc> <8bfc> 4916 <8bfd> <8bfd> 1641 <8bfe> <8bfe> 2395 <8bff> <8bff> 4917 <8c00> <8c00> 4918 <8c01> <8c01> 3490 <8c02> <8c02> 4919 <8c03> <8c03> 1496 <8c04> <8c04> 4920 <8c05> <8c05> 2571 <8c06> <8c06> 4632 <8c07> <8c07> 4921 <8c08> <8c08> 3595 <8c09> <8c09> 19250 <8c0a> <8c0a> 4209 <8c0b> <8c0b> 2836 <8c0c> <8c0c> 4922 <8c0d> <8c0d> 1502 <8c0e> <8c0e> 2022 <8c0f> <8c0f> 4923 <8c10> <8c10> 3966 <8c11> <8c12> 4924 <8c13> <8c13> 3788 <8c14> <8c16> 4926 <8c17> <8c17> 1214 <8c18> <8c18> 4931 <8c19> <8c19> 4929 <8c1a> <8c1a> 4113 <8c1b> <8c1b> 4930 <8c1c> <8c1c> 2778 <8c1d> <8c1d> 4932 <8c1e> <8c1e> 19251 <8c1f> <8c21> 4933 <8c22> <8c22> 3974 <8c23> <8c23> 4140 <8c24> <8c24> 1028 <8c25> <8c25> 4936 <8c26> <8c26> 3112 <8c27> <8c27> 4937 <8c28> <8c28> 2248 <8c29> <8c29> 2726 <8c2a> <8c2b> 4938 <8c2c> <8c2c> 2818 <8c2d> <8c2d> 3594 <8c2e> <8c2f> 4940 <8c30> <8c30> 2473 <8c31> <8c31> 3062 <8c32> <8c33> 4942 <8c34> <8c34> 3121 <8c35> <8c36> 4944 <8c37> <8c37> 1825 <8c38> <8c40> 19252 <8c41> <8c41> 2050 <8c42> <8c45> 19261 <8c46> <8c46> 1528 <8c47> <8c47> 7414 <8c48> <8c48> 8392 <8c49> <8c49> 7415 <8c4a> <8c4b> 19265 <8c4c> <8c4c> 3732 <8c4d> <8c4f> 19267 <8c50> <8c50> 7933 endcidrange 100 begincidrange <8c51> <8c54> 19270 <8c55> <8c55> 7445 <8c56> <8c59> 19274 <8c5a> <8c5a> 6544 <8c5b> <8c60> 19278 <8c61> <8c61> 3936 <8c62> <8c62> 2004 <8c63> <8c69> 19284 <8c6a> <8c6a> 1911 <8c6b> <8c6b> 4328 <8c6c> <8c72> 19291 <8c73> <8c73> 5597 <8c74> <8c77> 19298 <8c78> <8c78> 7504 <8c79> <8c79> 1043 <8c7a> <8c7a> 1209 <8c7b> <8c81> 19302 <8c82> <8c82> 7505 <8c83> <8c84> 19309 <8c85> <8c85> 7507 <8c86> <8c88> 19311 <8c89> <8c89> 1928 <8c8a> <8c8a> 7506 <8c8b> <8c8b> 19314 <8c8c> <8c8c> 2743 <8c8d> <8c93> 19315 <8c94> <8c94> 7509 <8c95> <8c97> 19322 <8c98> <8c98> 7508 <8c99> <8c9c> 19325 <8c9d> <8c9d> 7739 <8c9e> <8c9e> 8831 <8c9f> <8c9f> 19329 <8ca0> <8ca0> 7948 <8ca1> <8ca1> 7769 <8ca2> <8ca2> 7972 <8ca3> <8ca6> 19330 <8ca7> <8ca7> 8378 <8ca8> <8ca8> 8037 <8ca9> <8ca9> 7920 <8caa> <8caa> 8548 <8cab> <8cab> 7984 <8cac> <8cac> 8801 <8cad> <8cae> 19334 <8caf> <8caf> 8866 <8cb0> <8cb0> 9387 <8cb1> <8cb1> 19336 <8cb2> <8cb2> 9391 <8cb3> <8cb3> 7912 <8cb4> <8cb4> 7993 <8cb5> <8cb5> 19337 <8cb6> <8cb6> 7752 <8cb7> <8cb7> 8304 <8cb8> <8cb8> 7848 <8cb9> <8cb9> 19338 <8cba> <8cba> 9388 <8cbb> <8cbb> 7927 <8cbc> <8cbc> 8566 <8cbd> <8cbd> 9389 <8cbe> <8cbe> 19339 <8cbf> <8cbf> 8315 <8cc0> <8cc0> 8005 <8cc1> <8cc1> 9386 <8cc2> <8cc2> 8267 <8cc3> <8cc3> 8239 <8cc4> <8cc4> 8026 <8cc5> <8cc5> 9392 <8cc6> <8cc6> 19340 <8cc7> <8cc7> 8887 <8cc8> <8cc8> 8063 <8cc9> <8cc9> 19341 <8cca> <8cca> 8805 <8ccb> <8cd0> 19342 <8cd1> <8cd1> 9394 <8cd2> <8cd2> 8475 <8cd3> <8cd3> 7761 <8cd4> <8cd4> 19348 <8cd5> <8cd5> 9396 <8cd6> <8cd9> 19349 <8cda> <8cda> 9395 <8cdb> <8cdb> 19353 <8cdc> <8cdc> 7839 <8cdd> <8cdd> 19354 <8cde> <8cde> 8472 <8cdf> <8cdf> 19355 <8ce0> <8ce0> 8372 <8ce1> <8ce1> 9135 <8ce2> <8ce2> 8635 <8ce3> <8ce3> 8306 <8ce4> <8ce4> 8085 <8ce5> <8ce5> 19356 <8ce6> <8ce6> 7946 <8ce7> <8ce7> 9398 <8ce8> <8ce9> 19357 <8cea> <8cea> 8849 <8ceb> <8ceb> 9397 <8cec> <8cec> 8824 <8ced> <8ced> 7892 <8cee> <8cf3> 19359 <8cf4> <8cf4> 8179 endcidrange 100 begincidrange <8cf5> <8cf9> 19365 <8cfa> <8cfa> 8873 <8cfb> <8cfb> 9399 <8cfc> <8cfc> 7976 <8cfd> <8cfd> 8457 <8cfe> <8cfe> 8903 <8cff> <8cff> 19370 <8d00> <8d03> 19371 <8d04> <8d04> 9390 <8d05> <8d05> 8881 <8d06> <8d07> 19375 <8d08> <8d08> 8806 <8d09> <8d09> 19377 <8d0a> <8d0a> 8795 <8d0b> <8d0b> 8900 <8d0c> <8d0c> 19378 <8d0d> <8d0d> 8469 <8d0e> <8d0e> 19379 <8d0f> <8d0f> 8746 <8d10> <8d10> 9393 <8d11> <8d15> 19380 <8d16> <8d16> 8509 <8d17> <8d1a> 19385 <8d1b> <8d1b> 7957 <8d1c> <8d1c> 8796 <8d1d> <8d1d> 1053 <8d1e> <8d1e> 4491 <8d1f> <8d1f> 1717 <8d20> <8d20> 19389 <8d21> <8d21> 1802 <8d22> <8d22> 1165 <8d23> <8d23> 4403 <8d24> <8d24> 3898 <8d25> <8d25> 999 <8d26> <8d26> 4460 <8d27> <8d27> 2058 <8d28> <8d28> 4553 <8d29> <8d29> 1620 <8d2a> <8d2a> 3587 <8d2b> <8d2b> 3029 <8d2c> <8d2c> 1098 <8d2d> <8d2d> 1811 <8d2e> <8d2e> 4603 <8d2f> <8d2f> 1850 <8d30> <8d30> 1598 <8d31> <8d31> 2157 <8d32> <8d33> 6444 <8d34> <8d34> 3660 <8d35> <8d35> 1868 <8d36> <8d36> 6446 <8d37> <8d37> 1406 <8d38> <8d38> 2744 <8d39> <8d39> 1646 <8d3a> <8d3a> 1935 <8d3b> <8d3b> 6447 <8d3c> <8d3c> 4407 <8d3d> <8d3d> 6448 <8d3e> <8d3e> 2121 <8d3f> <8d3f> 2036 <8d40> <8d40> 6449 <8d41> <8d41> 2599 <8d42> <8d42> 2655 <8d43> <8d43> 4386 <8d44> <8d44> 4647 <8d45> <8d46> 6450 <8d47> <8d47> 6454 <8d48> <8d49> 6452 <8d4a> <8d4a> 3351 <8d4b> <8d4b> 1710 <8d4c> <8d4c> 1539 <8d4d> <8d4d> 6455 <8d4e> <8d4e> 3457 <8d4f> <8d4f> 3334 <8d50> <8d50> 1360 <8d51> <8d52> 19390 <8d53> <8d53> 5691 <8d54> <8d54> 2979 <8d55> <8d55> 6456 <8d56> <8d56> 2464 <8d57> <8d57> 19392 <8d58> <8d58> 4629 <8d59> <8d59> 6457 <8d5a> <8d5a> 4617 <8d5b> <8d5b> 3287 <8d5c> <8d5c> 4745 <8d5d> <8d5d> 4739 <8d5e> <8d5e> 4385 <8d5f> <8d5f> 19393 <8d60> <8d60> 4412 <8d61> <8d61> 3325 <8d62> <8d62> 4243 <8d63> <8d63> 1742 <8d64> <8d64> 1285 <8d65> <8d65> 19394 <8d66> <8d66> 3355 <8d67> <8d67> 7412 <8d68> <8d6a> 19395 <8d6b> <8d6b> 1932 <8d6c> <8d6c> 19398 <8d6d> <8d6d> 7413 endcidrange 100 begincidrange <8d6e> <8d6f> 19399 <8d70> <8d70> 4668 <8d71> <8d72> 19401 <8d73> <8d73> 7407 <8d74> <8d74> 1707 <8d75> <8d75> 4469 <8d76> <8d76> 1738 <8d77> <8d77> 3087 <8d78> <8d80> 19403 <8d81> <8d81> 1256 <8d82> <8d83> 19412 <8d84> <8d84> 7408 <8d85> <8d85> 1233 <8d86> <8d89> 19414 <8d8a> <8d8a> 4352 <8d8b> <8d8b> 3188 <8d8c> <8d90> 19418 <8d91> <8d91> 7410 <8d92> <8d93> 19423 <8d94> <8d94> 7409 <8d95> <8d95> 7956 <8d96> <8d98> 19425 <8d99> <8d99> 8826 <8d9a> <8d9e> 19428 <8d9f> <8d9f> 3614 <8da0> <8da2> 19433 <8da3> <8da3> 3199 <8da4> <8da7> 19436 <8da8> <8da8> 8430 <8da9> <8db0> 19440 <8db1> <8db1> 7411 <8db2> <8db2> 9720 <8db3> <8db3> 4672 <8db4> <8db4> 2944 <8db5> <8db5> 7452 <8db6> <8db7> 19448 <8db8> <8db8> 7447 <8db9> <8db9> 19450 <8dba> <8dba> 7455 <8dbb> <8dbb> 19451 <8dbc> <8dbc> 7454 <8dbd> <8dbd> 19452 <8dbe> <8dbe> 4537 <8dbf> <8dbf> 7453 <8dc0> <8dc2> 19453 <8dc3> <8dc3> 4353 <8dc4> <8dc4> 7456 <8dc5> <8dc5> 19456 <8dc6> <8dc6> 7464 <8dc7> <8dca> 19457 <8dcb> <8dcb> 986 <8dcc> <8dcc> 1497 <8dcd> <8dcd> 19461 <8dce> <8dcf> 7461 <8dd0> <8dd0> 19462 <8dd1> <8dd1> 2973 <8dd2> <8dd5> 19463 <8dd6> <8dd7> 7457 <8dd8> <8dd9> 19467 <8dda> <8dda> 7459 <8ddb> <8ddb> 7463 <8ddc> <8ddc> 19469 <8ddd> <8ddd> 2319 <8dde> <8dde> 7460 <8ddf> <8ddf> 1781 <8de0> <8de2> 19470 <8de3> <8de3> 7468 <8de4> <8de4> 7471 <8de5> <8de7> 19473 <8de8> <8de8> 2420 <8de9> <8de9> 19476 <8dea> <8dea> 1867 <8deb> <8deb> 7448 <8dec> <8dec> 7465 <8ded> <8dee> 19477 <8def> <8def> 2654 <8df0> <8df2> 19479 <8df3> <8df3> 3659 <8df4> <8df4> 19482 <8df5> <8df5> 2156 <8df6> <8df6> 19483 <8df7> <8df8> 7466 <8df9> <8df9> 7469 <8dfa> <8dfa> 1572 <8dfb> <8dfb> 7470 <8dfc> <8dfc> 19484 <8dfd> <8dfd> 7473 <8dfe> <8dff> 19485 <8e00> <8e04> 19487 <8e05> <8e05> 7449 <8e06> <8e08> 19492 <8e09> <8e09> 7472 <8e0a> <8e0a> 4256 <8e0b> <8e0b> 19495 <8e0c> <8e0c> 1297 <8e0d> <8e0e> 19496 <8e0f> <8e0f> 3575 <8e10> <8e10> 8084 <8e11> <8e13> 19498 <8e14> <8e14> 7474 endcidrange 100 begincidrange <8e15> <8e1c> 19501 <8e1d> <8e1d> 7475 <8e1e> <8e1e> 2320 <8e1f> <8e1f> 7476 <8e20> <8e21> 19509 <8e22> <8e22> 3634 <8e23> <8e23> 7479 <8e24> <8e28> 19511 <8e29> <8e29> 1167 <8e2a> <8e2a> 4662 <8e2b> <8e2b> 19516 <8e2c> <8e2c> 7477 <8e2d> <8e2d> 19517 <8e2e> <8e2e> 7478 <8e2f> <8e2f> 7480 <8e30> <8e30> 19518 <8e31> <8e31> 7486 <8e32> <8e33> 19519 <8e34> <8e34> 8752 <8e35> <8e35> 7484 <8e36> <8e38> 19521 <8e39> <8e39> 7483 <8e3a> <8e3a> 7481 <8e3b> <8e3c> 19524 <8e3d> <8e3d> 7485 <8e3e> <8e3f> 19526 <8e40> <8e40> 7482 <8e41> <8e42> 7488 <8e43> <8e43> 19528 <8e44> <8e44> 3638 <8e45> <8e46> 19529 <8e47> <8e47> 5947 <8e48> <8e48> 1433 <8e49> <8e49> 7487 <8e4a> <8e4a> 7492 <8e4b> <8e4b> 3574 <8e4c> <8e4c> 9725 <8e4d> <8e50> 19531 <8e51> <8e52> 7490 <8e53> <8e54> 19535 <8e55> <8e55> 9728 <8e56> <8e58> 19537 <8e59> <8e59> 7450 <8e5a> <8e62> 19540 <8e63> <8e63> 9734 <8e64> <8e65> 19549 <8e66> <8e66> 1069 <8e67> <8e68> 19551 <8e69> <8e69> 7451 <8e6a> <8e6b> 19553 <8e6c> <8e6c> 1446 <8e6d> <8e6d> 1195 <8e6e> <8e6e> 19555 <8e6f> <8e6f> 7496 <8e70> <8e70> 7493 <8e71> <8e71> 19556 <8e72> <8e72> 1558 <8e73> <8e73> 19557 <8e74> <8e74> 7497 <8e75> <8e75> 19558 <8e76> <8e76> 7494 <8e77> <8e79> 19559 <8e7a> <8e7a> 9727 <8e7b> <8e7b> 19562 <8e7c> <8e7c> 7495 <8e7d> <8e7e> 19563 <8e7f> <8e7f> 1373 <8e80> <8e80> 19565 <8e81> <8e81> 4397 <8e82> <8e84> 19566 <8e85> <8e85> 7498 <8e86> <8e86> 19569 <8e87> <8e87> 1310 <8e88> <8e88> 19570 <8e89> <8e89> 9724 <8e8a> <8e8a> 7820 <8e8b> <8e8b> 9730 <8e8c> <8e8c> 19571 <8e8d> <8e8d> 8781 <8e8e> <8e8e> 19572 <8e8f> <8e8f> 7499 <8e90> <8e90> 7501 <8e91> <8e91> 9732 <8e92> <8e92> 9726 <8e93> <8e93> 9731 <8e94> <8e94> 7500 <8e95> <8e99> 19573 <8e9a> <8e9a> 9729 <8e9b> <8e9b> 19578 <8e9c> <8e9c> 7502 <8e9d> <8e9d> 19579 <8e9e> <8e9e> 7503 <8e9f> <8ea0> 19580 <8ea1> <8ea1> 9733 <8ea2> <8ea4> 19582 <8ea5> <8ea5> 7843 <8ea6> <8ea6> 9736 <8ea7> <8ea9> 19585 <8eaa> <8eaa> 9735 <8eab> <8eab> 3366 endcidrange 100 begincidrange <8eac> <8eac> 1795 <8ead> <8eae> 19588 <8eaf> <8eaf> 3192 <8eb0> <8eb1> 19590 <8eb2> <8eb2> 1570 <8eb3> <8eb9> 19592 <8eba> <8eba> 3612 <8ebb> <8ebf> 19599 <8ec0> <8ec0> 8432 <8ec1> <8ec9> 19604 <8eca> <8eca> 7803 <8ecb> <8ecb> 8807 <8ecc> <8ecc> 7990 <8ecd> <8ecd> 8150 <8ece> <8ece> 6392 <8ecf> <8ed1> 19613 <8ed2> <8ed2> 8672 <8ed3> <8ed3> 19616 <8ed4> <8ed4> 9356 <8ed5> <8eda> 19617 <8edb> <8edb> 9357 <8edc> <8ede> 19623 <8edf> <8edf> 8450 <8ee0> <8ee3> 19626 <8ee4> <8ee4> 9364 <8ee5> <8eea> 19630 <8eeb> <8eeb> 9363 <8eec> <8ef1> 19636 <8ef2> <8ef2> 9358 <8ef3> <8ef7> 19642 <8ef8> <8ef8> 8857 <8ef9> <8ef9> 9361 <8efa> <8efa> 9366 <8efb> <8efb> 9359 <8efc> <8efc> 9362 <8efd> <8efd> 19647 <8efe> <8efe> 9367 <8eff> <8eff> 19648 <8f00> <8f02> 19649 <8f03> <8f03> 8113 <8f04> <8f04> 19652 <8f05> <8f05> 9370 <8f06> <8f06> 19653 <8f07> <8f07> 9369 <8f08> <8f08> 19654 <8f09> <8f09> 8792 <8f0a> <8f0a> 9368 <8f0b> <8f11> 19655 <8f12> <8f12> 9371 <8f13> <8f13> 19662 <8f14> <8f14> 7945 <8f15> <8f15> 8422 <8f16> <8f1a> 19663 <8f1b> <8f1b> 8230 <8f1c> <8f1c> 9375 <8f1d> <8f1d> 8025 <8f1e> <8f1f> 9373 <8f20> <8f24> 19668 <8f25> <8f25> 7995 <8f26> <8f26> 9372 <8f27> <8f28> 19673 <8f29> <8f29> 7738 <8f2a> <8f2a> 8283 <8f2b> <8f2e> 19675 <8f2f> <8f2f> 8048 <8f30> <8f32> 19679 <8f33> <8f33> 9376 <8f34> <8f37> 19682 <8f38> <8f38> 8507 <8f39> <8f3a> 19686 <8f3b> <8f3b> 7943 <8f3c> <8f3d> 19688 <8f3e> <8f3e> 8816 <8f3f> <8f3f> 8759 <8f40> <8f41> 19690 <8f42> <8f42> 9426 <8f43> <8f43> 19692 <8f44> <8f44> 8627 <8f45> <8f45> 8773 <8f46> <8f46> 9377 <8f47> <8f48> 19693 <8f49> <8f49> 8872 <8f4a> <8f4c> 19695 <8f4d> <8f4d> 8828 <8f4e> <8f4e> 8112 <8f4f> <8f53> 19698 <8f54> <8f54> 9378 <8f55> <8f5e> 19703 <8f5f> <8f5f> 8006 <8f60> <8f60> 19713 <8f61> <8f61> 9088 <8f62> <8f62> 9365 <8f63> <8f63> 19714 <8f64> <8f64> 9360 <8f65> <8f65> 19715 <8f66> <8f66> 1242 <8f67> <8f67> 4417 <8f68> <8f68> 1861 <8f69> <8f69> 4036 <8f6a> <8f6a> 19716 endcidrange 100 begincidrange <8f6b> <8f6b> 6369 <8f6c> <8f6c> 4615 <8f6d> <8f6d> 6370 <8f6e> <8f6e> 2685 <8f6f> <8f6f> 3272 <8f70> <8f70> 1947 <8f71> <8f73> 6371 <8f74> <8f74> 4576 <8f75> <8f76> 6374 <8f77> <8f77> 6377 <8f78> <8f78> 6376 <8f79> <8f7a> 6378 <8f7b> <8f7b> 3166 <8f7c> <8f7c> 6380 <8f7d> <8f7d> 4379 <8f7e> <8f7e> 6381 <8f7f> <8f7f> 2207 <8f80> <8f80> 19717 <8f81> <8f82> 6382 <8f83> <8f83> 2208 <8f84> <8f84> 6384 <8f85> <8f85> 1699 <8f86> <8f86> 2567 <8f87> <8f87> 6385 <8f88> <8f88> 1051 <8f89> <8f89> 2025 <8f8a> <8f8a> 1870 <8f8b> <8f8b> 6386 <8f8c> <8f8c> 19718 <8f8d> <8f8f> 6387 <8f90> <8f90> 1685 <8f91> <8f91> 2080 <8f92> <8f92> 19719 <8f93> <8f93> 3451 <8f94> <8f94> 5492 <8f95> <8f95> 4338 <8f96> <8f96> 3882 <8f97> <8f97> 4440 <8f98> <8f98> 6390 <8f99> <8f99> 4479 <8f9a> <8f9a> 6391 <8f9b> <8f9b> 3980 <8f9c> <8f9c> 1813 <8f9d> <8f9d> 19720 <8f9e> <8f9e> 1354 <8f9f> <8f9f> 1090 <8fa0> <8fa2> 19721 <8fa3> <8fa3> 2460 <8fa4> <8fa5> 19724 <8fa6> <8fa6> 7728 <8fa7> <8fa7> 19726 <8fa8> <8fa9> 1103 <8faa> <8faa> 19727 <8fab> <8fab> 1105 <8fac> <8fac> 19728 <8fad> <8fad> 7837 <8fae> <8fae> 7755 <8faf> <8faf> 7754 <8fb0> <8fb0> 1250 <8fb1> <8fb1> 3267 <8fb2> <8fb2> 8362 <8fb3> <8fb5> 19729 <8fb6> <8fb6> 5949 <8fb7> <8fb8> 19732 <8fb9> <8fb9> 1096 <8fba> <8fbc> 19734 <8fbd> <8fbd> 2578 <8fbe> <8fbe> 1394 <8fbf> <8fc0> 19737 <8fc1> <8fc1> 3109 <8fc2> <8fc2> 4285 <8fc3> <8fc3> 19739 <8fc4> <8fc4> 3096 <8fc5> <8fc5> 4065 <8fc6> <8fc6> 19740 <8fc7> <8fc7> 1878 <8fc8> <8fc8> 2716 <8fc9> <8fcd> 19741 <8fce> <8fce> 4242 <8fcf> <8fcf> 19746 <8fd0> <8fd0> 4366 <8fd1> <8fd1> 2253 <8fd2> <8fd2> 19747 <8fd3> <8fd3> 5950 <8fd4> <8fd4> 1618 <8fd5> <8fd5> 5951 <8fd6> <8fd7> 19748 <8fd8> <8fd8> 1998 <8fd9> <8fd9> 4483 <8fda> <8fda> 19750 <8fdb> <8fdb> 2249 <8fdc> <8fdc> 4345 <8fdd> <8fdd> 3764 <8fde> <8fde> 2549 <8fdf> <8fdf> 1278 <8fe0> <8fe1> 19751 <8fe2> <8fe2> 3657 <8fe3> <8fe3> 19753 <8fe4> <8fe4> 5954 <8fe5> <8fe5> 5952 endcidrange 100 begincidrange <8fe6> <8fe6> 5956 <8fe7> <8fe7> 19754 <8fe8> <8fe8> 5958 <8fe9> <8fe9> 5955 <8fea> <8fea> 1456 <8feb> <8feb> 3047 <8fec> <8fec> 19755 <8fed> <8fed> 1501 <8fee> <8fee> 5953 <8fef> <8fef> 19756 <8ff0> <8ff0> 3469 <8ff1> <8ff2> 19757 <8ff3> <8ff3> 5957 <8ff4> <8ff4> 9851 <8ff5> <8ff6> 19759 <8ff7> <8ff7> 2777 <8ff8> <8ff8> 1070 <8ff9> <8ff9> 2070 <8ffa> <8ffc> 19761 <8ffd> <8ffd> 4628 <8ffe> <8fff> 19764 <9000> <9000> 3708 <9001> <9001> 3522 <9002> <9002> 3425 <9003> <9003> 3622 <9004> <9004> 5960 <9005> <9005> 5959 <9006> <9006> 2889 <9007> <9008> 19766 <9009> <9009> 4042 <900a> <900a> 4064 <900b> <900b> 5961 <900c> <900c> 19768 <900d> <900d> 5964 <900e> <900e> 19769 <900f> <900f> 3689 <9010> <9010> 4591 <9011> <9011> 5963 <9012> <9012> 1470 <9013> <9013> 19770 <9014> <9014> 3695 <9015> <9015> 9202 <9016> <9016> 5965 <9017> <9017> 1529 <9018> <9018> 19771 <9019> <9019> 8830 <901a> <901a> 3673 <901b> <901b> 1853 <901c> <901c> 19772 <901d> <901d> 3420 <901e> <901e> 1270 <901f> <901f> 3534 <9020> <9020> 4399 <9021> <9021> 5966 <9022> <9022> 1671 <9023> <9023> 8217 <9024> <9025> 19773 <9026> <9026> 5962 <9027> <902c> 19775 <902d> <902d> 5969 <902e> <902e> 1409 <902f> <902f> 5970 <9030> <9031> 19781 <9032> <9032> 8123 <9033> <9034> 19783 <9035> <9036> 5967 <9037> <9037> 19785 <9038> <9038> 4196 <9039> <903a> 19786 <903b> <903b> 2694 <903c> <903c> 1071 <903d> <903d> 19788 <903e> <903e> 4295 <903f> <9040> 19789 <9041> <9041> 1564 <9042> <9042> 3553 <9043> <9043> 19791 <9044> <9044> 5971 <9045> <9046> 19792 <9047> <9047> 4315 <9048> <904a> 19794 <904b> <904b> 8787 <904c> <904c> 19797 <904d> <904d> 1106 <904e> <904e> 7998 <904f> <904f> 1587 <9050> <9050> 5974 <9051> <9052> 5972 <9053> <9053> 1441 <9054> <9054> 7846 <9055> <9055> 8590 <9056> <9056> 19798 <9057> <9057> 4172 <9058> <9058> 5976 <9059> <905a> 19799 <905b> <905b> 5978 <905c> <905c> 8684 <905d> <905d> 19801 <905e> <905e> 7870 <905f> <905f> 19802 endcidrange 100 begincidrange <9060> <9060> 8778 <9061> <9061> 19803 <9062> <9062> 5977 <9063> <9063> 3119 <9064> <9064> 19804 <9065> <9065> 4138 <9066> <9067> 19805 <9068> <9068> 5975 <9069> <9069> 8499 <906a> <906c> 19807 <906d> <906d> 4389 <906e> <906e> 4475 <906f> <9071> 19810 <9072> <9072> 7812 <9073> <9073> 19813 <9074> <9074> 5980 <9075> <9075> 4686 <9076> <9076> 19814 <9077> <9077> 8399 <9078> <9078> 8674 <9079> <9079> 19815 <907a> <907a> 8719 <907b> <907b> 19816 <907c> <907c> 8233 <907d> <907d> 5981 <907e> <907e> 19817 <907f> <907f> 1093 <9080> <9080> 4132 <9081> <9081> 8307 <9082> <9082> 5982 <9083> <9083> 5984 <9084> <9084> 8021 <9085> <9086> 19818 <9087> <9087> 9201 <9088> <9088> 5983 <9089> <9089> 19820 <908a> <908a> 7750 <908b> <908b> 5985 <908c> <908e> 19821 <908f> <908f> 8291 <9090> <9090> 9203 <9091> <9091> 4191 <9092> <9092> 19824 <9093> <9093> 1452 <9094> <9094> 19825 <9095> <9095> 6167 <9096> <9096> 19826 <9097> <9097> 4967 <9098> <9098> 19827 <9099> <9099> 4970 <909a> <909a> 19828 <909b> <909b> 4968 <909c> <909c> 19829 <909d> <909d> 4969 <909e> <90a0> 19830 <90a1> <90a1> 4972 <90a2> <90a2> 3994 <90a3> <90a3> 2858 <90a4> <90a5> 19833 <90a6> <90a6> 1017 <90a7> <90a9> 19835 <90aa> <90aa> 3963 <90ab> <90ab> 19838 <90ac> <90ac> 4971 <90ad> <90ad> 19839 <90ae> <90ae> 4271 <90af> <90af> 1889 <90b0> <90b0> 4978 <90b1> <90b1> 3182 <90b2> <90b2> 19840 <90b3> <90b3> 4974 <90b4> <90b4> 4973 <90b5> <90b5> 3348 <90b6> <90b6> 4975 <90b7> <90b7> 19841 <90b8> <90b8> 4977 <90b9> <90b9> 4667 <90ba> <90ba> 4976 <90bb> <90bb> 2595 <90bc> <90bd> 19842 <90be> <90be> 4981 <90bf> <90c0> 19844 <90c1> <90c1> 4313 <90c2> <90c3> 19846 <90c4> <90c4> 4983 <90c5> <90c5> 4980 <90c6> <90c6> 19848 <90c7> <90c7> 4984 <90c8> <90c9> 19849 <90ca> <90ca> 2189 <90cb> <90cd> 19851 <90ce> <90ce> 2484 <90cf> <90cf> 4979 <90d0> <90d0> 4982 <90d1> <90d1> 4514 <90d2> <90d2> 19854 <90d3> <90d3> 4985 <90d4> <90d6> 19855 <90d7> <90d7> 4989 <90d8> <90da> 19858 endcidrange 100 begincidrange <90db> <90db> 4990 <90dc> <90dc> 4988 <90dd> <90dd> 1913 <90de> <90de> 19861 <90df> <90df> 8990 <90e0> <90e0> 19862 <90e1> <90e1> 2353 <90e2> <90e2> 4987 <90e3> <90e5> 19863 <90e6> <90e6> 4986 <90e7> <90e7> 4362 <90e8> <90e8> 1158 <90e9> <90ea> 19866 <90eb> <90eb> 4991 <90ec> <90ec> 19868 <90ed> <90ed> 1874 <90ee> <90ee> 19869 <90ef> <90ef> 4992 <90f0> <90f3> 19870 <90f4> <90f4> 1248 <90f5> <90f5> 8755 <90f6> <90f7> 19874 <90f8> <90f8> 1415 <90f9> <90fc> 19876 <90fd> <90fd> 1531 <90fe> <90fe> 4993 <90ff> <90ff> 19880 <9100> <9101> 19881 <9102> <9102> 1588 <9103> <9103> 19883 <9104> <9104> 4994 <9105> <9105> 19884 <9106> <9106> 8992 <9107> <9108> 19885 <9109> <9109> 8647 <910a> <9111> 19887 <9112> <9112> 8892 <9113> <9113> 19895 <9114> <9114> 8988 <9115> <9115> 19896 <9116> <9116> 8785 <9117> <9118> 19897 <9119> <9119> 1074 <911a> <911d> 19899 <911e> <911e> 4996 <911f> <9121> 19903 <9122> <9122> 4995 <9123> <9123> 4997 <9124> <9126> 19906 <9127> <9127> 7867 <9128> <912c> 19909 <912d> <912d> 8839 <912e> <912e> 19914 <912f> <912f> 4999 <9130> <9130> 8237 <9131> <9131> 4998 <9132> <9132> 7851 <9133> <9133> 19915 <9134> <9134> 8989 <9135> <9135> 19916 <9136> <9136> 8991 <9137> <9138> 19917 <9139> <9139> 5000 <913a> <913a> 8987 <913b> <9142> 19919 <9143> <9143> 5001 <9144> <9145> 19927 <9146> <9146> 5002 <9147> <9147> 19929 <9148> <9148> 8993 <9149> <9149> 4276 <914a> <914a> 7416 <914b> <914b> 3186 <914c> <914c> 4640 <914d> <914d> 2981 <914e> <914f> 7418 <9150> <9150> 7417 <9151> <9151> 19930 <9152> <9152> 2293 <9153> <9156> 19931 <9157> <9157> 4026 <9158> <9159> 19935 <915a> <915a> 1648 <915b> <915c> 19937 <915d> <915d> 4368 <915e> <915e> 3581 <915f> <9160> 19939 <9161> <9161> 7422 <9162> <9162> 7421 <9163> <9163> 1887 <9164> <9164> 7420 <9165> <9165> 3531 <9166> <9168> 19941 <9169> <9169> 7424 <916a> <916a> 2493 <916b> <916b> 19944 <916c> <916c> 1295 <916d> <916d> 19945 <916e> <916e> 3675 <916f> <916f> 7425 endcidrange 100 begincidrange <9170> <9170> 7423 <9171> <9171> 2181 <9172> <9172> 7428 <9173> <9173> 19946 <9174> <9174> 7429 <9175> <9175> 2206 <9176> <9176> 2749 <9177> <9177> 2414 <9178> <9178> 3542 <9179> <9179> 7430 <917a> <917c> 19947 <917d> <917e> 7426 <917f> <917f> 2899 <9180> <9184> 19950 <9185> <9185> 7432 <9186> <9186> 19955 <9187> <9187> 1343 <9188> <9188> 19956 <9189> <9189> 4682 <918a> <918a> 19957 <918b> <918b> 1370 <918c> <918c> 7431 <918d> <918d> 7434 <918e> <918f> 19958 <9190> <9190> 7433 <9191> <9191> 7435 <9192> <9192> 3996 <9193> <9195> 19960 <9196> <9196> 8789 <9197> <9199> 19963 <919a> <919a> 2774 <919b> <919b> 3204 <919c> <919c> 7823 <919d> <91a1> 19966 <91a2> <91a3> 7436 <91a4> <91a9> 19971 <91aa> <91aa> 7438 <91ab> <91ab> 8716 <91ac> <91ac> 8100 <91ad> <91af> 7439 <91b0> <91b3> 19977 <91b4> <91b4> 7443 <91b5> <91b5> 7442 <91b6> <91b9> 19981 <91ba> <91ba> 7444 <91bb> <91bf> 19985 <91c0> <91c0> 8347 <91c1> <91c1> 8664 <91c2> <91c2> 19990 <91c3> <91c3> 9722 <91c4> <91c4> 19991 <91c5> <91c5> 9721 <91c6> <91c6> 19992 <91c7> <91c7> 1168 <91c8> <91c8> 19993 <91c9> <91c9> 4281 <91ca> <91ca> 3428 <91cb> <91cb> 8500 <91cc> <91cc> 2522 <91cd> <91cd> 4567 <91ce> <91ce> 4151 <91cf> <91cf> 2568 <91d0> <91d0> 19994 <91d1> <91d1> 2241 <91d2> <91d4> 9459 <91d5> <91d5> 9464 <91d6> <91d6> 19995 <91d7> <91d7> 9463 <91d8> <91d8> 7880 <91d9> <91d9> 9462 <91da> <91db> 19996 <91dc> <91dc> 1701 <91dd> <91dd> 8832 <91de> <91e2> 19998 <91e3> <91e3> 7877 <91e4> <91e4> 9467 <91e5> <91e6> 20003 <91e7> <91e7> 9466 <91e8> <91e8> 20005 <91e9> <91e9> 7917 <91ea> <91f4> 20006 <91f5> <91f5> 9469 <91f6> <91f6> 20017 <91f7> <91f7> 9465 <91f8> <91f8> 20018 <91f9> <91f9> 9470 <91fa> <91fa> 8397 <91fb> <91ff> 20019 <9200> <9200> 9480 <9201> <9201> 9476 <9202> <9203> 20024 <9204> <9204> 9478 <9205> <9207> 20026 <9208> <9208> 9471 <9209> <9209> 8336 <920a> <920c> 20029 <920d> <920d> 7901 <920e> <920e> 7973 <920f> <920f> 20032 <9210> <9210> 9475 endcidrange 100 begincidrange <9211> <9211> 9474 <9212> <9213> 20033 <9214> <9214> 7802 <9215> <9215> 8358 <9216> <921d> 20035 <921e> <921e> 8149 <921f> <9222> 20043 <9223> <9223> 7953 <9224> <9224> 20047 <9225> <9225> 9479 <9226> <9226> 9472 <9227> <9227> 9477 <9228> <922d> 20048 <922e> <922e> 9497 <922f> <922f> 20054 <9230> <9230> 9493 <9231> <9232> 20055 <9233> <9233> 9484 <9234> <9234> 8241 <9235> <9236> 20057 <9237> <9237> 9483 <9238> <9238> 9487 <9239> <9239> 9498 <923a> <923a> 9481 <923b> <923c> 20059 <923d> <923d> 9486 <923e> <923e> 8756 <923f> <923f> 9491 <9240> <9240> 8064 <9241> <9244> 20061 <9245> <9245> 9473 <9246> <9247> 20065 <9248> <9248> 9495 <9249> <9249> 9494 <924a> <924c> 20067 <924d> <924d> 9496 <924e> <9250> 20070 <9251> <9251> 7766 <9252> <9254> 20073 <9255> <9255> 9485 <9256> <9256> 20076 <9257> <9257> 8403 <9258> <9259> 20077 <925a> <925a> 8314 <925b> <925b> 8398 <925c> <925d> 20079 <925e> <925e> 9488 <925f> <9261> 20081 <9262> <9262> 7765 <9263> <9265> 20084 <9266> <9266> 9482 <9267> <926b> 20087 <926c> <926d> 9489 <926e> <9273> 20092 <9274> <9274> 2155 <9275> <9277> 20098 <9278> <9278> 8106 <9279> <9279> 20101 <927a> <927a> 9502 <927b> <927b> 7967 <927c> <927e> 20102 <927f> <927f> 9517 <9280> <9280> 8733 <9281> <9282> 20105 <9283> <9283> 9522 <9284> <9284> 20107 <9285> <9285> 8571 <9286> <928d> 20108 <928e> <928e> 7552 <928f> <9290> 20116 <9291> <9291> 8623 <9292> <9292> 20118 <9293> <9293> 9516 <9294> <9295> 20119 <9296> <9296> 9512 <9297> <9297> 20121 <9298> <9298> 8332 <9299> <9299> 20122 <929a> <929a> 9519 <929b> <929b> 20123 <929c> <929c> 8636 <929d> <929f> 20124 <92a0> <92a0> 9501 <92a1> <92a2> 20127 <92a3> <92a3> 9525 <92a4> <92a4> 20129 <92a5> <92a5> 8717 <92a6> <92a6> 9510 <92a7> <92a7> 20130 <92a8> <92a8> 9524 <92a9> <92a9> 9514 <92aa> <92aa> 9503 <92ab> <92ab> 9521 <92ac> <92ac> 9500 <92ad> <92ad> 20131 <92ae> <92ae> 7553 <92af> <92b0> 20132 <92b1> <92b1> 9509 <92b2> <92b6> 20134 <92b7> <92b7> 8653 endcidrange 100 begincidrange <92b8> <92b8> 20139 <92b9> <92b9> 8666 <92ba> <92ba> 20140 <92bb> <92bb> 8562 <92bc> <92bc> 9534 <92bd> <92c0> 20141 <92c1> <92c1> 8271 <92c2> <92c2> 20145 <92c3> <92c3> 9539 <92c4> <92c4> 20146 <92c5> <92c5> 8663 <92c6> <92c6> 20147 <92c7> <92c7> 7740 <92c8> <92c8> 7554 <92c9> <92cb> 20148 <92cc> <92cc> 9513 <92cd> <92ce> 20151 <92cf> <92cf> 9505 <92d0> <92d1> 20153 <92d2> <92d2> 7935 <92d3> <92dc> 20155 <92dd> <92dd> 9535 <92de> <92de> 20165 <92df> <92df> 9540 <92e0> <92e2> 20166 <92e3> <92e3> 9507 <92e4> <92e4> 7824 <92e5> <92e5> 9530 <92e6> <92e6> 9541 <92e7> <92e7> 20169 <92e8> <92e8> 9533 <92e9> <92e9> 20170 <92ea> <92ea> 8385 <92eb> <92ec> 20171 <92ed> <92ed> 8451 <92ee> <92ee> 9504 <92ef> <92ef> 9532 <92f0> <92f0> 9531 <92f1> <92f1> 9528 <92f2> <92f5> 20173 <92f6> <92f6> 9536 <92f7> <92f7> 20177 <92f8> <92f8> 8141 <92f9> <92fb> 20178 <92fc> <92fc> 7960 <92fd> <92ff> 20181 <9300> <9300> 20184 <9301> <9301> 9547 <9302> <9305> 20185 <9306> <9306> 9543 <9307> <9308> 9551 <9309> <930f> 20189 <9310> <9310> 8880 <9311> <9311> 20196 <9312> <9312> 9542 <9313> <9314> 20197 <9315> <9315> 9548 <9316> <9317> 20199 <9318> <9318> 7834 <9319> <9319> 9554 <931a> <931a> 9520 <931b> <931b> 9545 <931c> <931e> 20201 <931f> <931f> 9553 <9320> <9320> 7882 <9321> <9321> 20204 <9322> <9322> 8402 <9323> <9325> 20205 <9326> <9326> 8120 <9327> <9327> 20208 <9328> <9328> 8313 <9329> <932a> 20209 <932b> <932b> 8619 <932c> <932d> 20211 <932e> <932e> 9549 <932f> <932f> 7845 <9330> <9331> 20213 <9332> <9332> 8268 <9333> <9333> 8320 <9334> <9335> 20215 <9336> <9336> 9837 <9337> <9337> 20217 <9338> <9338> 9527 <9339> <933d> 20218 <933e> <933e> 7555 <933f> <933f> 20223 <9340> <9340> 9546 <9341> <9341> 8632 <9342> <9342> 20224 <9343> <9343> 9550 <9344> <9345> 20225 <9346> <9346> 9468 <9347> <9347> 9556 <9348> <934a> 20227 <934b> <934b> 7996 <934c> <934c> 20230 <934d> <934d> 7893 <934e> <9353> 20231 <9354> <9354> 9558 <9355> <9357> 20237 endcidrange 100 begincidrange <9358> <9358> 8808 <9359> <935a> 20240 <935b> <935b> 7894 <935c> <9363> 20242 <9364> <9364> 9559 <9365> <9365> 9555 <9366> <9368> 20250 <9369> <9369> 9544 <936a> <936a> 7556 <936b> <936b> 20253 <936c> <936c> 8412 <936d> <936f> 20254 <9370> <9370> 9561 <9371> <9374> 20257 <9375> <9375> 8087 <9376> <9376> 9557 <9377> <9379> 20261 <937a> <937a> 8829 <937b> <937d> 20264 <937e> <937e> 9598 <937f> <9381> 20267 <9382> <9382> 8316 <9383> <9383> 20270 <9384> <9384> 9562 <9385> <9386> 20271 <9387> <9387> 9566 <9388> <9389> 20273 <938a> <938a> 7732 <938b> <938e> 20275 <938f> <938f> 7558 <9390> <9395> 20279 <9396> <9396> 8542 <9397> <9397> 20285 <9398> <9398> 9568 <9399> <93a1> 20286 <93a2> <93a2> 8610 <93a3> <93a3> 9044 <93a4> <93a5> 20295 <93a6> <93a6> 9571 <93a7> <93a7> 9511 <93a8> <93a8> 20297 <93a9> <93a9> 9518 <93aa> <93aa> 9560 <93ab> <93ab> 20298 <93ac> <93ac> 7963 <93ad> <93ad> 20299 <93ae> <93ae> 8835 <93af> <93af> 20300 <93b0> <93b0> 9572 <93b1> <93b2> 20301 <93b3> <93b3> 8352 <93b4> <93b4> 20303 <93b5> <93b5> 9573 <93b6> <93b7> 20304 <93b8> <93b8> 9569 <93b9> <93be> 20306 <93bf> <93bf> 9570 <93c0> <93c2> 20312 <93c3> <93c3> 9580 <93c4> <93c6> 20315 <93c7> <93c7> 9581 <93c8> <93c8> 8224 <93c9> <93c9> 20318 <93ca> <93ca> 7557 <93cb> <93cb> 20319 <93cc> <93cc> 9567 <93cd> <93cd> 9578 <93ce> <93d0> 20320 <93d1> <93d1> 9582 <93d2> <93d5> 20323 <93d6> <93d6> 7681 <93d7> <93d7> 9529 <93d8> <93d8> 9564 <93d9> <93db> 20327 <93dc> <93dd> 9576 <93de> <93de> 9579 <93df> <93df> 7791 <93e0> <93e0> 20330 <93e1> <93e1> 8132 <93e2> <93e2> 9575 <93e3> <93e3> 20331 <93e4> <93e4> 9563 <93e5> <93e7> 20332 <93e8> <93e8> 9757 <93e9> <93f4> 20335 <93f5> <93f5> 9515 <93f6> <93f6> 20347 <93f7> <93f7> 9585 <93f8> <93f8> 20348 <93f9> <93f9> 9591 <93fa> <93ff> 20349 <9400> <9402> 20355 <9403> <9403> 9506 <9404> <940a> 20358 <940b> <940b> 9523 <940c> <940f> 20365 <9410> <9410> 8234 <9411> <9411> 20369 <9412> <9412> 9526 <9413> <9413> 9587 endcidrange 100 begincidrange <9414> <9414> 9583 <9415> <9417> 20370 <9418> <9418> 8851 <9419> <9419> 9592 <941a> <941c> 20373 <941d> <941d> 9584 <941e> <941f> 20376 <9420> <9420> 9589 <9421> <9425> 20378 <9426> <9427> 9537 <9428> <9428> 9565 <9429> <942d> 20383 <942e> <942e> 8218 <942f> <9431> 20388 <9432> <9432> 9594 <9433> <9433> 8198 <9434> <9434> 20391 <9435> <9435> 8567 <9436> <9437> 20392 <9438> <9438> 9499 <9439> <9439> 20394 <943a> <943a> 9508 <943b> <943d> 20395 <943e> <943e> 7559 <943f> <943f> 9595 <9440> <9443> 20398 <9444> <9444> 8867 <9445> <9449> 20402 <944a> <944a> 9593 <944b> <944b> 20407 <944c> <944c> 9574 <944d> <9451> 20408 <9452> <9452> 8083 <9453> <9453> 20413 <9454> <9454> 9596 <9455> <945f> 20414 <9460> <9460> 9492 <9461> <9462> 20425 <9463> <9463> 9597 <9464> <9464> 20427 <9465> <9465> 9586 <9466> <946a> 20428 <946b> <946b> 7560 <946c> <946c> 20433 <946d> <946d> 9588 <946e> <946f> 20434 <9470> <9470> 8782 <9471> <9471> 20436 <9472> <9472> 8646 <9473> <9476> 20437 <9477> <9477> 8351 <9478> <9478> 20441 <9479> <9479> 9590 <947a> <947b> 20442 <947c> <947c> 8292 <947d> <947d> 8895 <947e> <947e> 9756 <947f> <947f> 8798 <9480> <9484> 20444 <9485> <9487> 6798 <9488> <9488> 4492 <9489> <9489> 1507 <948a> <948a> 6802 <948b> <948b> 6801 <948c> <948d> 6803 <948e> <948e> 3106 <948f> <9490> 6805 <9491> <9491> 20449 <9492> <9492> 1613 <9493> <9493> 1495 <9494> <9494> 6807 <9495> <9495> 6809 <9496> <9496> 20450 <9497> <9497> 6808 <9498> <9498> 20451 <9499> <9499> 1729 <949a> <949c> 6810 <949d> <949d> 1562 <949e> <949e> 1235 <949f> <949f> 4562 <94a0> <94a0> 2857 <94a1> <94a1> 1054 <94a2> <94a2> 1745 <94a3> <94a4> 6813 <94a5> <94a5> 4354 <94a6> <94a6> 3154 <94a7> <94a7> 2346 <94a8> <94a8> 3816 <94a9> <94a9> 1804 <94aa> <94aa> 6816 <94ab> <94ab> 6815 <94ac> <94ac> 6818 <94ad> <94ad> 6817 <94ae> <94ae> 2918 <94af> <94b0> 6819 <94b1> <94b1> 3115 <94b2> <94b2> 6821 <94b3> <94b3> 3116 <94b4> <94b4> 6822 <94b5> <94b5> 1134 endcidrange 100 begincidrange <94b6> <94ba> 6823 <94bb> <94bb> 4679 <94bc> <94bd> 6828 <94be> <94be> 2123 <94bf> <94bf> 6830 <94c0> <94c0> 4272 <94c1> <94c1> 3661 <94c2> <94c2> 1139 <94c3> <94c3> 2606 <94c4> <94c4> 6831 <94c5> <94c5> 3107 <94c6> <94c6> 2738 <94c7> <94c7> 20452 <94c8> <94ce> 6832 <94cf> <94cf> 20453 <94d0> <94d2> 6839 <94d3> <94d4> 20454 <94d5> <94d7> 6842 <94d8> <94d8> 6846 <94d9> <94d9> 6845 <94da> <94da> 20456 <94db> <94db> 6847 <94dc> <94dc> 3678 <94dd> <94dd> 2664 <94de> <94e0> 6848 <94e1> <94e1> 4418 <94e2> <94e2> 6851 <94e3> <94e3> 3872 <94e4> <94e5> 6852 <94e6> <94e6> 20457 <94e7> <94e8> 6854 <94e9> <94e9> 6857 <94ea> <94ea> 6856 <94eb> <94eb> 6858 <94ec> <94ec> 1776 <94ed> <94ed> 2815 <94ee> <94ef> 6859 <94f0> <94f0> 2195 <94f1> <94f1> 4166 <94f2> <94f2> 1216 <94f3> <94f5> 6861 <94f6> <94f6> 4223 <94f7> <94f7> 6864 <94f8> <94f8> 4604 <94f9> <94f9> 6865 <94fa> <94fa> 3051 <94fb> <94fb> 20458 <94fc> <94fd> 6866 <94fe> <94fe> 2557 <94ff> <94ff> 6868 <9500> <9500> 3943 <9501> <9501> 3565 <9502> <9502> 6870 <9503> <9503> 6869 <9504> <9504> 1311 <9505> <9505> 1873 <9506> <9507> 6871 <9508> <9508> 4013 <9509> <950a> 6873 <950b> <950b> 1667 <950c> <950c> 3978 <950d> <950f> 6875 <9510> <9510> 3276 <9511> <9511> 3635 <9512> <9516> 6878 <9517> <9517> 4481 <9518> <9518> 6883 <9519> <9519> 1392 <951a> <951a> 2735 <951b> <951b> 6884 <951c> <951c> 20459 <951d> <951f> 6885 <9520> <9520> 20460 <9521> <9521> 3852 <9522> <9522> 6888 <9523> <9523> 2695 <9524> <9524> 1339 <9525> <9525> 4627 <9526> <9526> 2246 <9527> <9527> 20461 <9528> <9528> 3892 <9529> <9529> 6891 <952a> <952b> 6889 <952c> <952c> 6892 <952d> <952d> 1510 <952e> <952e> 2159 <952f> <952f> 2321 <9530> <9530> 2769 <9531> <9532> 6893 <9533> <9533> 20462 <9534> <9534> 6895 <9535> <9535> 6903 <9536> <9538> 6896 <9539> <9539> 3135 <953a> <953a> 6937 <953b> <953b> 1548 <953c> <953c> 6899 <953d> <953d> 20463 <953e> <953f> 6900 <9540> <9540> 1541 endcidrange 100 begincidrange <9541> <9541> 2755 <9542> <9542> 6902 <9543> <9543> 20464 <9544> <9546> 6904 <9547> <9547> 4499 <9548> <9548> 20465 <9549> <9549> 6907 <954a> <954a> 2906 <954b> <954b> 20466 <954c> <954c> 6908 <954d> <954d> 2907 <954e> <954f> 6909 <9550> <9550> 1759 <9551> <9551> 1026 <9552> <9554> 6911 <9555> <9555> 20467 <9556> <9559> 6914 <955a> <955a> 20468 <955b> <955b> 6918 <955c> <955c> 2276 <955d> <955d> 6921 <955e> <955f> 6919 <9560> <9560> 20469 <9561> <9562> 6922 <9563> <9563> 2582 <9564> <956c> 6924 <956d> <956d> 2499 <956e> <956e> 20470 <956f> <956f> 6933 <9570> <9570> 2550 <9571> <9573> 6934 <9574> <9575> 20471 <9576> <9576> 3919 <9577> <9577> 7797 <9578> <957e> 20473 <957f> <957f> 1225 <9580> <9580> 8317 <9581> <9581> 20480 <9582> <9582> 9151 <9583> <9583> 8467 <9584> <9585> 20481 <9586> <9586> 9152 <9587> <9588> 20483 <9589> <9589> 7749 <958a> <958a> 20485 <958b> <958b> 8152 <958c> <958c> 9156 <958d> <958d> 20486 <958e> <958e> 9154 <958f> <958f> 8452 <9590> <9590> 20487 <9591> <9591> 8637 <9592> <9592> 20488 <9593> <9593> 8071 <9594> <9594> 9155 <9595> <9597> 20489 <9598> <9598> 8809 <9599> <95a0> 20492 <95a1> <95a1> 8003 <95a2> <95a2> 20500 <95a3> <95a3> 7966 <95a4> <95a4> 9849 <95a5> <95a5> 7915 <95a6> <95a7> 20501 <95a8> <95a8> 7989 <95a9> <95a9> 8330 <95aa> <95aa> 20503 <95ab> <95ab> 9159 <95ac> <95ac> 9161 <95ad> <95ad> 9158 <95ae> <95b1> 20504 <95b2> <95b2> 8783 <95b3> <95b5> 20508 <95b6> <95b6> 9163 <95b7> <95b8> 20511 <95b9> <95b9> 8691 <95ba> <95ba> 20513 <95bb> <95bb> 8695 <95bc> <95bc> 9167 <95bd> <95bd> 9166 <95be> <95be> 9162 <95bf> <95bf> 9165 <95c0> <95c2> 20514 <95c3> <95c3> 9168 <95c4> <95c5> 20517 <95c6> <95c6> 9836 <95c7> <95c7> 20519 <95c8> <95c8> 9153 <95c9> <95c9> 20520 <95ca> <95ca> 8174 <95cb> <95cb> 9169 <95cc> <95cc> 8184 <95cd> <95cf> 20521 <95d0> <95d0> 9171 <95d1> <95d3> 20524 <95d4> <95d4> 9170 <95d5> <95d5> 9172 <95d6> <95d6> 7832 <95d7> <95db> 20527 <95dc> <95dc> 7980 endcidrange 100 begincidrange <95dd> <95dd> 20532 <95de> <95de> 9173 <95df> <95e0> 20533 <95e1> <95e1> 7793 <95e2> <95e2> 9873 <95e3> <95e4> 20535 <95e5> <95e5> 9157 <95e6> <95e7> 20537 <95e8> <95e8> 2762 <95e9> <95e9> 5765 <95ea> <95ea> 3322 <95eb> <95eb> 5766 <95ec> <95ec> 20539 <95ed> <95ed> 1086 <95ee> <95ee> 3801 <95ef> <95ef> 1334 <95f0> <95f0> 3277 <95f1> <95f1> 5767 <95f2> <95f2> 3901 <95f3> <95f3> 5768 <95f4> <95f4> 2135 <95f5> <95f6> 5769 <95f7> <95f7> 2763 <95f8> <95f8> 4419 <95f9> <95f9> 2873 <95fa> <95fa> 1860 <95fb> <95fb> 3796 <95fc> <95fc> 5771 <95fd> <95fd> 2811 <95fe> <95fe> 5772 <95ff> <95ff> 20540 <9600> <9600> 1604 <9601> <9601> 1774 <9602> <9602> 1929 <9603> <9604> 5773 <9605> <9605> 4359 <9606> <9606> 5775 <9607> <9607> 20541 <9608> <9608> 5776 <9609> <9609> 4084 <960a> <960d> 5777 <960e> <960e> 4095 <960f> <960f> 5781 <9610> <9610> 1218 <9611> <9611> 2470 <9612> <9612> 5782 <9613> <9613> 20542 <9614> <9614> 2454 <9615> <9617> 5783 <9618> <9618> 20543 <9619> <961a> 5786 <961b> <961b> 20544 <961c> <961c> 1714 <961d> <961d> 4948 <961e> <961e> 20545 <961f> <961f> 1554 <9620> <9620> 20546 <9621> <9621> 4950 <9622> <9622> 4949 <9623> <9629> 20547 <962a> <962a> 4952 <962b> <962d> 20554 <962e> <962e> 3273 <962f> <9630> 20557 <9631> <9631> 4951 <9632> <9632> 1629 <9633> <9633> 4125 <9634> <9634> 4220 <9635> <9635> 4500 <9636> <9636> 2216 <9637> <963a> 20559 <963b> <963b> 4677 <963c> <963c> 4954 <963d> <963d> 4953 <963e> <963e> 20563 <963f> <963f> 941 <9640> <9640> 3716 <9641> <9641> 20564 <9642> <9642> 4955 <9643> <9643> 20565 <9644> <9644> 1720 <9645> <9645> 2109 <9646> <9646> 2660 <9647> <9647> 2635 <9648> <9648> 1255 <9649> <9649> 4956 <964a> <964a> 20566 <964b> <964b> 2641 <964c> <964c> 2835 <964d> <964d> 2182 <964e> <964f> 20567 <9650> <9650> 3915 <9651> <9653> 20569 <9654> <9654> 4957 <9655> <9655> 3323 <9656> <9657> 20572 <9658> <9658> 8986 <9659> <965a> 20574 <965b> <965b> 1094 <965c> <965c> 20576 endcidrange 100 begincidrange <965d> <965d> 8468 <965e> <965e> 20577 <965f> <965f> 4958 <9660> <9660> 20578 <9661> <9661> 1527 <9662> <9662> 4349 <9663> <9663> 8836 <9664> <9664> 1314 <9665> <9666> 20579 <9667> <9667> 4959 <9668> <9668> 4364 <9669> <9669> 3906 <966a> <966a> 2980 <966b> <966b> 20581 <966c> <966c> 4960 <966d> <966f> 20582 <9670> <9670> 8732 <9671> <9671> 20585 <9672> <9672> 4961 <9673> <9673> 7806 <9674> <9674> 4962 <9675> <9675> 2611 <9676> <9676> 3624 <9677> <9677> 3914 <9678> <9678> 8269 <9679> <967c> 20586 <967d> <967d> 8705 <967e> <9684> 20590 <9685> <9685> 4300 <9686> <9686> 2632 <9687> <9687> 20597 <9688> <9688> 4963 <9689> <9689> 20598 <968a> <968a> 7897 <968b> <968b> 3546 <968c> <968c> 20599 <968d> <968d> 4964 <968e> <968e> 8114 <968f> <968f> 3547 <9690> <9690> 4229 <9691> <9693> 20600 <9694> <9694> 1775 <9695> <9695> 8786 <9696> <9696> 20603 <9697> <9697> 4965 <9698> <9698> 954 <9699> <9699> 3875 <969a> <969a> 20604 <969b> <969b> 8057 <969c> <969c> 4464 <969d> <96a6> 20605 <96a7> <96a7> 3554 <96a8> <96a8> 8535 <96a9> <96a9> 20615 <96aa> <96aa> 8639 <96ab> <96af> 20616 <96b0> <96b0> 4966 <96b1> <96b1> 8735 <96b2> <96b2> 20621 <96b3> <96b3> 5764 <96b4> <96b4> 8253 <96b5> <96b5> 20622 <96b6> <96b6> 2542 <96b7> <96b7> 20623 <96b8> <96b8> 8213 <96b9> <96b9> 7545 <96ba> <96ba> 20624 <96bb> <96bb> 9893 <96bc> <96bd> 7546 <96be> <96be> 2868 <96bf> <96bf> 20625 <96c0> <96c0> 3219 <96c1> <96c1> 4108 <96c2> <96c3> 20626 <96c4> <96c4> 4006 <96c5> <96c5> 4078 <96c6> <96c6> 2082 <96c7> <96c7> 1830 <96c8> <96c8> 20628 <96c9> <96c9> 6940 <96ca> <96cb> 20629 <96cc> <96cc> 1353 <96cd> <96cd> 4255 <96ce> <96ce> 7548 <96cf> <96cf> 1312 <96d0> <96d1> 20631 <96d2> <96d2> 7549 <96d3> <96d4> 20633 <96d5> <96d5> 1490 <96d6> <96d6> 8534 <96d7> <96d8> 20635 <96d9> <96d9> 8516 <96da> <96da> 20637 <96db> <96db> 7825 <96dc> <96dc> 8791 <96dd> <96df> 20638 <96e0> <96e0> 7551 <96e1> <96e1> 20641 <96e2> <96e2> 8202 <96e3> <96e3> 8338 endcidrange 100 begincidrange <96e4> <96e7> 20642 <96e8> <96e8> 4303 <96e9> <96e9> 7521 <96ea> <96ea> 4050 <96eb> <96ee> 20646 <96ef> <96ef> 7523 <96f0> <96f1> 20650 <96f2> <96f2> 8784 <96f3> <96f3> 7522 <96f4> <96f5> 20652 <96f6> <96f6> 2604 <96f7> <96f7> 2498 <96f8> <96f8> 20654 <96f9> <96f9> 1035 <96fa> <96fa> 20655 <96fb> <96fb> 7875 <96fc> <96fd> 20656 <96fe> <96fe> 3836 <96ff> <96ff> 20658 <9700> <9700> 4019 <9701> <9701> 7525 <9702> <9703> 20659 <9704> <9704> 3939 <9705> <9705> 20661 <9706> <9706> 7524 <9707> <9707> 4497 <9708> <9708> 7526 <9709> <9709> 2750 <970a> <970c> 20662 <970d> <970d> 2057 <970e> <970e> 7528 <970f> <970f> 7527 <9710> <9712> 20665 <9713> <9713> 2881 <9714> <9715> 20668 <9716> <9716> 2593 <9717> <971b> 20670 <971c> <971c> 3487 <971d> <971d> 20675 <971e> <971e> 3881 <971f> <9726> 20676 <9727> <9727> 8616 <9728> <9729> 20684 <972a> <972a> 7529 <972b> <972c> 20686 <972d> <972d> 7530 <972e> <972f> 20688 <9730> <9730> 7531 <9731> <9731> 20690 <9732> <9732> 2653 <9733> <9737> 20691 <9738> <9738> 991 <9739> <9739> 3002 <973a> <973c> 20696 <973d> <973d> 9741 <973e> <973e> 7532 <973f> <9741> 20699 <9742> <9742> 9740 <9743> <9743> 20702 <9744> <9744> 9742 <9745> <9747> 20703 <9748> <9748> 8242 <9749> <9751> 20706 <9752> <9752> 3165 <9753> <9753> 7520 <9754> <9755> 20715 <9756> <9756> 2279 <9757> <9758> 20717 <9759> <9759> 2273 <975a> <975a> 9739 <975b> <975b> 1478 <975c> <975d> 20719 <975e> <975e> 1636 <975f> <975f> 20721 <9760> <9760> 2380 <9761> <9761> 2775 <9762> <9762> 2795 <9763> <9764> 20722 <9765> <9765> 4738 <9766> <9767> 20724 <9768> <9768> 8899 <9769> <9769> 1770 <976a> <9772> 20726 <9773> <9773> 2250 <9774> <9774> 4046 <9775> <9775> 20735 <9776> <9776> 987 <9777> <977b> 20736 <977c> <977c> 7624 <977d> <9784> 20741 <9785> <9785> 7625 <9786> <978a> 20749 <978b> <978b> 3959 <978c> <978c> 20754 <978d> <978d> 955 <978e> <978e> 20755 <978f> <978f> 7971 <9790> <9790> 20756 <9791> <9792> 7626 <9793> <9793> 20757 endcidrange 100 begincidrange <9794> <9794> 7628 <9795> <9797> 20758 <9798> <9798> 3143 <9799> <979f> 20761 <97a0> <97a0> 2302 <97a1> <97a2> 20768 <97a3> <97a3> 7631 <97a4> <97a5> 20770 <97a6> <97a6> 9877 <97a7> <97aa> 20772 <97ab> <97ab> 7630 <97ac> <97ac> 20776 <97ad> <97ad> 1095 <97ae> <97ae> 20777 <97af> <97af> 7629 <97b0> <97b1> 20778 <97b2> <97b2> 7632 <97b3> <97b3> 20780 <97b4> <97b4> 7633 <97b5> <97bc> 20781 <97bd> <97bd> 9822 <97be> <97c2> 20789 <97c3> <97c3> 9821 <97c4> <97c5> 20794 <97c6> <97c6> 9874 <97c7> <97c8> 20796 <97c9> <97c9> 9823 <97ca> <97ca> 20798 <97cb> <97cb> 8589 <97cc> <97cc> 8445 <97cd> <97d2> 20799 <97d3> <97d3> 8000 <97d4> <97d8> 20805 <97d9> <97d9> 9317 <97da> <97db> 20810 <97dc> <97dc> 9319 <97dd> <97dd> 20812 <97de> <97de> 9318 <97df> <97e5> 20813 <97e6> <97e6> 3763 <97e7> <97e7> 3240 <97e8> <97e8> 20820 <97e9> <97e9> 1890 <97ea> <97ec> 6222 <97ed> <97ed> 2289 <97ee> <97f2> 20821 <97f3> <97f3> 4219 <97f4> <97f4> 20826 <97f5> <97f5> 4370 <97f6> <97f6> 3345 <97f7> <97fe> 20827 <97ff> <97ff> 8649 <9800> <9800> 20835 <9801> <9801> 8713 <9802> <9802> 7881 <9803> <9803> 8425 <9804> <9804> 20836 <9805> <9805> 8650 <9806> <9806> 8518 <9807> <9807> 9669 <9808> <9808> 8668 <9809> <9809> 20837 <980a> <980a> 9310 <980b> <980b> 20838 <980c> <980c> 8527 <980d> <980d> 20839 <980e> <980f> 9670 <9810> <9810> 8769 <9811> <9811> 8586 <9812> <9812> 7727 <9813> <9813> 7900 <9814> <9816> 20840 <9817> <9817> 8383 <9818> <9818> 8244 <9819> <981b> 20843 <981c> <981c> 9673 <981d> <9820> 20846 <9821> <9821> 9672 <9822> <9823> 20850 <9824> <9824> 8718 <9825> <9825> 20852 <9826> <9826> 9675 <9827> <982c> 20853 <982d> <982d> 8573 <982e> <982f> 20859 <9830> <9830> 8062 <9831> <9836> 20861 <9837> <9837> 9676 <9838> <9838> 8131 <9839> <983a> 20867 <983b> <983b> 8377 <983c> <983c> 20869 <983d> <983d> 8577 <983e> <9845> 20870 <9846> <9846> 8154 <9847> <984b> 20878 <984c> <984c> 8563 <984d> <984d> 7905 <984e> <984e> 9677 <984f> <9852> 20883 endcidrange 100 begincidrange <9853> <9853> 9678 <9854> <9854> 8694 <9855> <9857> 20887 <9858> <9858> 8779 <9859> <9859> 9681 <985a> <985a> 20890 <985b> <985b> 7872 <985c> <985d> 20891 <985e> <985e> 8200 <985f> <9861> 20893 <9862> <9862> 9680 <9863> <9864> 20896 <9865> <9865> 9682 <9866> <9866> 20898 <9867> <9867> 7978 <9868> <986a> 20899 <986b> <986b> 7794 <986c> <986c> 9683 <986d> <986e> 20902 <986f> <986f> 8638 <9870> <9870> 9684 <9871> <9871> 8260 <9872> <9872> 20904 <9873> <9873> 9679 <9874> <9874> 8435 <9875> <9875> 4154 <9876> <9876> 1508 <9877> <9877> 3175 <9878> <9878> 7136 <9879> <9879> 3931 <987a> <987a> 3496 <987b> <987b> 4022 <987c> <987c> 6183 <987d> <987d> 3736 <987e> <987e> 1828 <987f> <987f> 1560 <9880> <9880> 7137 <9881> <9881> 1007 <9882> <9882> 3521 <9883> <9883> 7138 <9884> <9884> 4327 <9885> <9885> 2644 <9886> <9886> 2613 <9887> <9887> 3043 <9888> <9888> 2272 <9889> <9889> 7139 <988a> <988a> 2120 <988b> <988b> 20905 <988c> <988d> 7140 <988e> <988e> 20906 <988f> <988f> 7142 <9890> <9890> 4170 <9891> <9891> 3028 <9892> <9892> 20907 <9893> <9893> 3704 <9894> <9894> 7143 <9895> <9895> 20908 <9896> <9896> 4246 <9897> <9897> 2386 <9898> <9898> 3637 <9899> <9899> 20909 <989a> <989b> 7144 <989c> <989c> 4094 <989d> <989d> 1581 <989e> <989f> 7146 <98a0> <98a0> 1472 <98a1> <98a2> 7148 <98a3> <98a3> 20910 <98a4> <98a4> 1219 <98a5> <98a6> 7150 <98a7> <98a7> 3202 <98a8> <98a8> 7936 <98a9> <98ad> 20911 <98ae> <98af> 9420 <98b0> <98b0> 20916 <98b1> <98b1> 9880 <98b2> <98b2> 20917 <98b3> <98b3> 9848 <98b4> <98b5> 20918 <98b6> <98b6> 9422 <98b7> <98bb> 20920 <98bc> <98bc> 9423 <98bd> <98c3> 20925 <98c4> <98c4> 8376 <98c5> <98c5> 20932 <98c6> <98c6> 9424 <98c7> <98c7> 20933 <98c8> <98c8> 9425 <98c9> <98cd> 20934 <98ce> <98ce> 1668 <98cf> <98d0> 20939 <98d1> <98d3> 6583 <98d4> <98d4> 20941 <98d5> <98d5> 6586 <98d6> <98d7> 20942 <98d8> <98d8> 3021 <98d9> <98da> 6587 <98db> <98db> 7924 <98dc> <98dd> 20944 <98de> <98de> 1638 endcidrange 100 begincidrange <98df> <98df> 3402 <98e0> <98e0> 9115 <98e1> <98e1> 20946 <98e2> <98e2> 9854 <98e3> <98e6> 20947 <98e7> <98e7> 5658 <98e8> <98e8> 7655 <98e9> <98e9> 9117 <98ea> <98eb> 9119 <98ec> <98ec> 20951 <98ed> <98ed> 9121 <98ee> <98ee> 20952 <98ef> <98ef> 7921 <98f0> <98f1> 20953 <98f2> <98f2> 8734 <98f3> <98f3> 20955 <98f4> <98f4> 9122 <98f5> <98fb> 20956 <98fc> <98fc> 8523 <98fd> <98fd> 7734 <98fe> <98fe> 8501 <98ff> <98ff> 20963 <9900> <9902> 20964 <9903> <9903> 8109 <9904> <9904> 20967 <9905> <9905> 7763 <9906> <9908> 20968 <9909> <9909> 9123 <990a> <990a> 8707 <990b> <990b> 20971 <990c> <990c> 7911 <990d> <990d> 7656 <990e> <990f> 20972 <9910> <9910> 1172 <9911> <9911> 9124 <9912> <9912> 8343 <9913> <9913> 7908 <9914> <9917> 20974 <9918> <9918> 8760 <9919> <991a> 20978 <991b> <991b> 9125 <991c> <991d> 20980 <991e> <991e> 8090 <991f> <9920> 20982 <9921> <9921> 8643 <9922> <9927> 20984 <9928> <9928> 7982 <9929> <992d> 20990 <992e> <992e> 7657 <992f> <9932> 20995 <9933> <9933> 9116 <9934> <9936> 20999 <9937> <9937> 9126 <9938> <993b> 21002 <993c> <993c> 9118 <993d> <993d> 21006 <993e> <993e> 8245 <993f> <993f> 9127 <9940> <9942> 21007 <9943> <9943> 9128 <9944> <9944> 21010 <9945> <9945> 8309 <9946> <9947> 21011 <9948> <994a> 9129 <994b> <994b> 8171 <994c> <994c> 9132 <994d> <9950> 21013 <9951> <9951> 8042 <9952> <9952> 8441 <9953> <9953> 21017 <9954> <9954> 7659 <9955> <9955> 7658 <9956> <9956> 21018 <9957> <9957> 9830 <9958> <995b> 21019 <995c> <995c> 9831 <995d> <995d> 21023 <995e> <995e> 7788 <995f> <9961> 21024 <9962> <9962> 9133 <9963> <9963> 5661 <9964> <9964> 21027 <9965> <9965> 2069 <9966> <9966> 21028 <9967> <996c> 5662 <996d> <996d> 1622 <996e> <996e> 4226 <996f> <996f> 2165 <9970> <9970> 3429 <9971> <9971> 1038 <9972> <9972> 3516 <9973> <9973> 21029 <9974> <9974> 5668 <9975> <9975> 1595 <9976> <9976> 3231 <9977> <9977> 5669 <9978> <9979> 21030 <997a> <997a> 2201 <997b> <997b> 21032 <997c> <997c> 1126 endcidrange 100 begincidrange <997d> <997d> 5670 <997e> <997e> 21033 <997f> <997f> 1589 <9980> <9980> 5671 <9981> <9981> 2876 <9982> <9983> 21034 <9984> <9984> 5672 <9985> <9985> 3911 <9986> <9986> 1846 <9987> <9987> 5673 <9988> <9988> 2444 <9989> <9989> 21036 <998a> <998a> 5674 <998b> <998b> 1213 <998c> <998c> 21037 <998d> <998d> 5675 <998e> <998e> 21038 <998f> <998f> 2620 <9990> <9991> 5676 <9992> <9992> 2719 <9993> <9995> 5678 <9996> <9996> 3438 <9997> <9997> 4718 <9998> <9998> 4857 <9999> <9999> 3920 <999a> <99a4> 21039 <99a5> <99a5> 6955 <99a6> <99a7> 21050 <99a8> <99a8> 5086 <99a9> <99ab> 21052 <99ac> <99ac> 8301 <99ad> <99ad> 8770 <99ae> <99ae> 7938 <99af> <99b0> 21055 <99b1> <99b1> 8579 <99b2> <99b2> 21057 <99b3> <99b3> 7813 <99b4> <99b4> 8681 <99b5> <99c0> 21058 <99c1> <99c1> 7767 <99c2> <99cf> 21070 <99d0> <99d0> 8869 <99d1> <99d1> 9223 <99d2> <99d2> 8138 <99d3> <99d3> 21084 <99d4> <99d4> 9218 <99d5> <99d5> 8066 <99d6> <99d7> 21085 <99d8> <99d8> 9224 <99d9> <99d9> 9220 <99da> <99da> 21087 <99db> <99db> 8497 <99dc> <99dc> 21088 <99dd> <99dd> 8580 <99de> <99de> 21089 <99df> <99df> 9219 <99e0> <99e0> 21090 <99e1> <99e1> 8302 <99e2> <99e2> 9227 <99e3> <99ec> 21091 <99ed> <99ed> 7999 <99ee> <99f0> 21101 <99f1> <99f1> 8295 <99f2> <99fe> 21104 <99ff> <99ff> 8151 <9a00> <9a00> 21117 <9a01> <9a01> 7811 <9a02> <9a04> 21118 <9a05> <9a05> 9231 <9a06> <9a0c> 21121 <9a0d> <9a0d> 9230 <9a0e> <9a0e> 8391 <9a0f> <9a0f> 9229 <9a10> <9a15> 21128 <9a16> <9a16> 9234 <9a17> <9a18> 21134 <9a19> <9a19> 8375 <9a1a> <9a2a> 21136 <9a2b> <9a2b> 9200 <9a2c> <9a2c> 21153 <9a2d> <9a2d> 9233 <9a2e> <9a2e> 9236 <9a2f> <9a2f> 21154 <9a30> <9a30> 8560 <9a31> <9a35> 21155 <9a36> <9a36> 9221 <9a37> <9a37> 8460 <9a38> <9a38> 9237 <9a39> <9a3d> 21160 <9a3e> <9a3e> 8294 <9a3f> <9a3f> 21165 <9a40> <9a40> 9042 <9a41> <9a41> 9235 <9a42> <9a42> 9232 <9a43> <9a44> 9238 <9a45> <9a45> 8433 <9a46> <9a49> 21166 <9a4a> <9a4a> 9226 <9a4b> <9a4c> 21170 <9a4d> <9a4d> 9225 endcidrange 100 begincidrange <9a4e> <9a4e> 21172 <9a4f> <9a4f> 9240 <9a50> <9a54> 21173 <9a55> <9a55> 8103 <9a56> <9a56> 21178 <9a57> <9a57> 8700 <9a58> <9a59> 21179 <9a5a> <9a5a> 8129 <9a5b> <9a5b> 9222 <9a5c> <9a5e> 21181 <9a5f> <9a5f> 8860 <9a60> <9a61> 21184 <9a62> <9a62> 8270 <9a63> <9a63> 21186 <9a64> <9a64> 9242 <9a65> <9a65> 9241 <9a66> <9a69> 21187 <9a6a> <9a6a> 9228 <9a6b> <9a6b> 21191 <9a6c> <9a6c> 2708 <9a6d> <9a6d> 4329 <9a6e> <9a6e> 3717 <9a6f> <9a6f> 4058 <9a70> <9a70> 1280 <9a71> <9a71> 3194 <9a72> <9a72> 21192 <9a73> <9a73> 1148 <9a74> <9a74> 2662 <9a75> <9a75> 6074 <9a76> <9a76> 3410 <9a77> <9a78> 6075 <9a79> <9a79> 2307 <9a7a> <9a7a> 6077 <9a7b> <9a7b> 4609 <9a7c> <9a7c> 3718 <9a7d> <9a7d> 6079 <9a7e> <9a7e> 2128 <9a7f> <9a7f> 6078 <9a80> <9a81> 6080 <9a82> <9a82> 2709 <9a83> <9a83> 21193 <9a84> <9a84> 2191 <9a85> <9a85> 6082 <9a86> <9a86> 2701 <9a87> <9a87> 1886 <9a88> <9a88> 6083 <9a89> <9a89> 21194 <9a8a> <9a8a> 6084 <9a8b> <9a8b> 1271 <9a8c> <9a8c> 4114 <9a8d> <9a8e> 21195 <9a8f> <9a8f> 2354 <9a90> <9a90> 6085 <9a91> <9a91> 3086 <9a92> <9a93> 6086 <9a94> <9a95> 21197 <9a96> <9a96> 6088 <9a97> <9a97> 3020 <9a98> <9a98> 6089 <9a99> <9a99> 21199 <9a9a> <9a9a> 3296 <9a9b> <9a9d> 6090 <9a9e> <9a9e> 5941 <9a9f> <9aa0> 6093 <9aa1> <9aa1> 2697 <9aa2> <9aa3> 6095 <9aa4> <9aa4> 4583 <9aa5> <9aa5> 6097 <9aa6> <9aa6> 21200 <9aa7> <9aa7> 6098 <9aa8> <9aa8> 1824 <9aa9> <9aae> 21201 <9aaf> <9aaf> 7721 <9ab0> <9ab0> 7635 <9ab1> <9ab1> 7634 <9ab2> <9ab5> 21207 <9ab6> <9ab6> 7638 <9ab7> <9ab7> 7636 <9ab8> <9ab8> 1880 <9ab9> <9ab9> 21211 <9aba> <9aba> 7639 <9abb> <9abb> 21212 <9abc> <9abc> 7640 <9abd> <9abf> 21213 <9ac0> <9ac0> 7642 <9ac1> <9ac1> 7641 <9ac2> <9ac2> 7644 <9ac3> <9ac4> 21216 <9ac5> <9ac5> 7643 <9ac6> <9aca> 21218 <9acb> <9acc> 7645 <9acd> <9ace> 21223 <9acf> <9acf> 9825 <9ad0> <9ad0> 21225 <9ad1> <9ad1> 7647 <9ad2> <9ad2> 9892 <9ad3> <9ad3> 3549 <9ad4> <9ad4> 8564 <9ad5> <9ad5> 9827 <9ad6> <9ad6> 9826 endcidrange 100 begincidrange <9ad7> <9ad7> 21226 <9ad8> <9ad8> 1754 <9ad9> <9ade> 21227 <9adf> <9adf> 7660 <9ae0> <9ae0> 21233 <9ae1> <9ae1> 7661 <9ae2> <9ae5> 21234 <9ae6> <9ae6> 7662 <9ae7> <9aea> 21238 <9aeb> <9aeb> 7664 <9aec> <9aec> 21242 <9aed> <9aed> 7666 <9aee> <9aee> 9845 <9aef> <9aef> 7663 <9af0> <9af8> 21243 <9af9> <9af9> 7667 <9afa> <9afa> 21252 <9afb> <9afb> 7665 <9afc> <9aff> 21253 <9b00> <9b02> 21257 <9b03> <9b03> 4660 <9b04> <9b05> 21260 <9b06> <9b06> 8524 <9b07> <9b07> 21262 <9b08> <9b08> 7668 <9b09> <9b0c> 21263 <9b0d> <9b0d> 9850 <9b0e> <9b0e> 21267 <9b0f> <9b0f> 7669 <9b10> <9b12> 21268 <9b13> <9b13> 7670 <9b14> <9b19> 21271 <9b1a> <9b1a> 9888 <9b1b> <9b1e> 21277 <9b1f> <9b1f> 7671 <9b20> <9b21> 21281 <9b22> <9b22> 9832 <9b23> <9b23> 7672 <9b24> <9b24> 21283 <9b25> <9b25> 7888 <9b26> <9b26> 21284 <9b27> <9b27> 8342 <9b28> <9b28> 21285 <9b29> <9b29> 9164 <9b2a> <9b2d> 21286 <9b2e> <9b2e> 9160 <9b2f> <9b2f> 5019 <9b30> <9b30> 21290 <9b31> <9b31> 8766 <9b32> <9b32> 4704 <9b33> <9b3a> 21291 <9b3b> <9b3b> 6003 <9b3c> <9b3c> 1862 <9b3d> <9b40> 21299 <9b41> <9b41> 2442 <9b42> <9b42> 2047 <9b43> <9b43> 7649 <9b44> <9b44> 3046 <9b45> <9b45> 7648 <9b46> <9b46> 21303 <9b47> <9b47> 7650 <9b48> <9b48> 7652 <9b49> <9b49> 7651 <9b4a> <9b4c> 21304 <9b4d> <9b4d> 7653 <9b4e> <9b4e> 9829 <9b4f> <9b4f> 3785 <9b50> <9b50> 21307 <9b51> <9b51> 7654 <9b52> <9b53> 21308 <9b54> <9b54> 2826 <9b55> <9b57> 21310 <9b58> <9b58> 9828 <9b59> <9b59> 21313 <9b5a> <9b5a> 8761 <9b5b> <9b6e> 21314 <9b6f> <9b6f> 8266 <9b70> <9b73> 21334 <9b74> <9b74> 9759 <9b75> <9b76> 21338 <9b77> <9b77> 9758 <9b78> <9b80> 21340 <9b81> <9b81> 9760 <9b82> <9b82> 21349 <9b83> <9b83> 9761 <9b84> <9b8d> 21350 <9b8e> <9b8e> 9762 <9b8f> <9b8f> 21360 <9b90> <9b90> 9767 <9b91> <9b91> 7737 <9b92> <9b92> 9765 <9b93> <9b99> 21361 <9b9a> <9b9a> 9769 <9b9b> <9b9c> 21368 <9b9d> <9b9d> 9774 <9b9e> <9b9e> 9771 <9b9f> <9ba9> 21370 <9baa> <9baa> 9770 <9bab> <9bab> 9773 <9bac> <9bac> 21381 endcidrange 100 begincidrange <9bad> <9bad> 9768 <9bae> <9bae> 8633 <9baf> <9bbf> 21382 <9bc0> <9bc0> 9782 <9bc1> <9bc1> 9776 <9bc2> <9bc6> 21399 <9bc7> <9bc7> 9784 <9bc8> <9bc8> 21404 <9bc9> <9bc9> 8205 <9bca> <9bca> 9783 <9bcb> <9bd3> 21405 <9bd4> <9bd4> 9797 <9bd5> <9bd5> 21414 <9bd6> <9bd6> 9786 <9bd7> <9bda> 21415 <9bdb> <9bdb> 9795 <9bdc> <9bdc> 21419 <9bdd> <9bdd> 9792 <9bde> <9be0> 21420 <9be1> <9be1> 9789 <9be2> <9be2> 9793 <9be3> <9be3> 21423 <9be4> <9be4> 9790 <9be5> <9be6> 21424 <9be7> <9be7> 9791 <9be8> <9be8> 8128 <9be9> <9be9> 21426 <9bea> <9beb> 9787 <9bec> <9bef> 21427 <9bf0> <9bf0> 9794 <9bf1> <9bf3> 21431 <9bf4> <9bf4> 9796 <9bf5> <9bfc> 21434 <9bfd> <9bfd> 9785 <9bfe> <9bfe> 21442 <9bff> <9bff> 9804 <9c00> <9c07> 21443 <9c08> <9c08> 9799 <9c09> <9c09> 9803 <9c0a> <9c0c> 21451 <9c0d> <9c0d> 9801 <9c0e> <9c0f> 21454 <9c10> <9c10> 9800 <9c11> <9c11> 21456 <9c12> <9c12> 9802 <9c13> <9c13> 8456 <9c14> <9c1f> 21457 <9c20> <9c20> 9805 <9c21> <9c22> 21469 <9c23> <9c23> 9780 <9c24> <9c24> 21471 <9c25> <9c25> 9809 <9c26> <9c27> 21472 <9c28> <9c28> 9808 <9c29> <9c29> 9810 <9c2a> <9c2c> 21474 <9c2d> <9c2d> 9807 <9c2e> <9c30> 21477 <9c31> <9c31> 9778 <9c32> <9c32> 9806 <9c33> <9c33> 9811 <9c34> <9c34> 21480 <9c35> <9c35> 9815 <9c36> <9c36> 21481 <9c37> <9c37> 9781 <9c38> <9c38> 21482 <9c39> <9c39> 9779 <9c3a> <9c3a> 21483 <9c3b> <9c3b> 9814 <9c3c> <9c3d> 21484 <9c3e> <9c3e> 9812 <9c3f> <9c44> 21486 <9c45> <9c45> 9816 <9c46> <9c47> 21492 <9c48> <9c48> 9813 <9c49> <9c49> 7757 <9c4a> <9c51> 21494 <9c52> <9c52> 9819 <9c53> <9c53> 21502 <9c54> <9c54> 9818 <9c55> <9c55> 21503 <9c56> <9c56> 9817 <9c57> <9c57> 8238 <9c58> <9c58> 9775 <9c59> <9c5c> 21504 <9c5d> <9c5d> 9798 <9c5e> <9c5e> 21508 <9c5f> <9c5f> 9766 <9c60> <9c66> 21509 <9c67> <9c67> 9820 <9c68> <9c6c> 21516 <9c6d> <9c6d> 9772 <9c6e> <9c77> 21521 <9c78> <9c78> 9763 <9c79> <9c79> 21531 <9c7a> <9c7a> 9777 <9c7b> <9c7b> 21532 <9c7c> <9c7c> 4296 <9c7d> <9c7e> 21533 <9c7f> <9c7f> 7561 endcidrange 100 begincidrange <9c80> <9c80> 21535 <9c81> <9c81> 2650 <9c82> <9c82> 7562 <9c83> <9c84> 21536 <9c85> <9c88> 7563 <9c89> <9c8a> 21538 <9c8b> <9c8b> 7568 <9c8c> <9c8c> 21540 <9c8d> <9c8d> 1044 <9c8e> <9c8e> 7569 <9c8f> <9c8f> 21541 <9c90> <9c92> 7570 <9c93> <9c93> 21542 <9c94> <9c95> 7573 <9c96> <9c99> 21543 <9c9a> <9c9b> 7575 <9c9c> <9c9c> 3895 <9c9d> <9c9d> 21547 <9c9e> <9ca3> 7577 <9ca4> <9ca4> 2523 <9ca5> <9ca9> 7583 <9caa> <9caa> 21548 <9cab> <9cab> 7588 <9cac> <9cac> 21549 <9cad> <9cae> 7589 <9caf> <9caf> 21550 <9cb0> <9cb7> 7591 <9cb8> <9cb8> 2263 <9cb9> <9cb9> 21551 <9cba> <9cbd> 7599 <9cbe> <9cc2> 21552 <9cc3> <9cc3> 3285 <9cc4> <9cc7> 7603 <9cc8> <9cc9> 21557 <9cca> <9cd0> 7607 <9cd1> <9cd2> 21559 <9cd3> <9cd5> 7614 <9cd6> <9cd6> 1111 <9cd7> <9cd9> 7617 <9cda> <9cdb> 21561 <9cdc> <9cdd> 7620 <9cde> <9cde> 2596 <9cdf> <9cdf> 7622 <9ce0> <9ce1> 21563 <9ce2> <9ce2> 7623 <9ce3> <9ce4> 21565 <9ce5> <9ce5> 8348 <9ce6> <9ce8> 21567 <9ce9> <9ce9> 9600 <9cea> <9ceb> 21570 <9cec> <9cec> 8924 <9ced> <9cf2> 21572 <9cf3> <9cf3> 7941 <9cf4> <9cf4> 8331 <9cf5> <9cf5> 21578 <9cf6> <9cf6> 9601 <9cf7> <9cff> 21579 <9d00> <9d05> 21588 <9d06> <9d06> 9603 <9d07> <9d07> 9602 <9d08> <9d08> 21594 <9d09> <9d09> 8686 <9d0a> <9d14> 21595 <9d15> <9d15> 8578 <9d16> <9d1a> 21606 <9d1b> <9d1b> 8771 <9d1c> <9d1c> 21611 <9d1d> <9d1d> 9607 <9d1e> <9d1e> 21612 <9d1f> <9d1f> 9608 <9d20> <9d22> 21613 <9d23> <9d23> 9604 <9d24> <9d25> 21616 <9d26> <9d26> 8701 <9d27> <9d27> 21618 <9d28> <9d28> 8687 <9d29> <9d2e> 21619 <9d2f> <9d2f> 9610 <9d30> <9d30> 9612 <9d31> <9d3a> 21625 <9d3b> <9d3b> 8007 <9d3c> <9d3e> 21635 <9d3f> <9d3f> 7965 <9d40> <9d41> 21638 <9d42> <9d42> 9613 <9d43> <9d50> 21640 <9d51> <9d51> 8144 <9d52> <9d52> 9618 <9d53> <9d53> 9615 <9d54> <9d5b> 21654 <9d5c> <9d5c> 9620 <9d5d> <9d5d> 7904 <9d5e> <9d5f> 21662 <9d60> <9d60> 9617 <9d61> <9d61> 9621 <9d62> <9d69> 21664 <9d6a> <9d6a> 9623 <9d6b> <9d6b> 21672 <9d6c> <9d6c> 8374 <9d6d> <9d6e> 21673 endcidrange 100 begincidrange <9d6f> <9d6f> 9624 <9d70> <9d71> 21675 <9d72> <9d72> 8438 <9d73> <9d86> 21677 <9d87> <9d87> 9605 <9d88> <9d88> 21697 <9d89> <9d89> 9625 <9d8a> <9d92> 21698 <9d93> <9d93> 9622 <9d94> <9d97> 21707 <9d98> <9d98> 9626 <9d99> <9d99> 21711 <9d9a> <9d9a> 9627 <9d9b> <9da4> 21712 <9da5> <9da5> 9629 <9da6> <9da8> 21722 <9da9> <9da9> 9630 <9daa> <9dae> 21725 <9daf> <9daf> 9036 <9db0> <9db3> 21730 <9db4> <9db4> 8004 <9db5> <9dba> 21734 <9dbb> <9dbb> 9824 <9dbc> <9dbc> 9632 <9dbd> <9dbf> 21740 <9dc0> <9dc0> 9628 <9dc1> <9dc1> 21743 <9dc2> <9dc2> 9631 <9dc3> <9dc3> 21744 <9dc4> <9dc4> 8044 <9dc5> <9dd2> 21745 <9dd3> <9dd3> 9634 <9dd4> <9dd6> 21759 <9dd7> <9dd7> 8366 <9dd8> <9dd8> 21762 <9dd9> <9dd9> 9611 <9dda> <9dda> 9635 <9ddb> <9de4> 21763 <9de5> <9de5> 9609 <9de6> <9de6> 9637 <9de7> <9dee> 21773 <9def> <9def> 9636 <9df0> <9df1> 21781 <9df2> <9df2> 9638 <9df3> <9df3> 9619 <9df4> <9df7> 21783 <9df8> <9df8> 9639 <9df9> <9df9> 8738 <9dfa> <9dfa> 9641 <9dfb> <9dff> 21787 <9e00> <9e0b> 21792 <9e0c> <9e0c> 9640 <9e0d> <9e14> 21804 <9e15> <9e15> 9606 <9e16> <9e19> 21812 <9e1a> <9e1a> 9633 <9e1b> <9e1b> 9642 <9e1c> <9e1c> 21816 <9e1d> <9e1d> 9616 <9e1e> <9e1e> 9614 <9e1f> <9e1f> 2900 <9e20> <9e20> 6965 <9e21> <9e21> 2073 <9e22> <9e22> 6966 <9e23> <9e23> 2814 <9e24> <9e24> 21817 <9e25> <9e25> 2937 <9e26> <9e26> 4068 <9e27> <9e27> 21818 <9e28> <9e2c> 6967 <9e2d> <9e2d> 4069 <9e2e> <9e2e> 21819 <9e2f> <9e2f> 4117 <9e30> <9e30> 21820 <9e31> <9e31> 6973 <9e32> <9e32> 6972 <9e33> <9e33> 4330 <9e34> <9e34> 21821 <9e35> <9e35> 3715 <9e36> <9e36> 6974 <9e37> <9e37> 6976 <9e38> <9e38> 6975 <9e39> <9e3a> 6977 <9e3b> <9e3c> 21822 <9e3d> <9e3d> 1766 <9e3e> <9e3e> 6979 <9e3f> <9e3f> 1951 <9e40> <9e40> 21824 <9e41> <9e42> 6980 <9e43> <9e43> 2328 <9e44> <9e44> 6982 <9e45> <9e45> 1579 <9e46> <9e49> 6983 <9e4a> <9e4a> 3216 <9e4b> <9e4c> 6987 <9e4d> <9e4d> 21825 <9e4e> <9e4e> 6989 <9e4f> <9e4f> 2997 <9e50> <9e50> 21826 <9e51> <9e51> 6990 endcidrange 100 begincidrange <9e52> <9e54> 21827 <9e55> <9e55> 6991 <9e56> <9e56> 21830 <9e57> <9e57> 6992 <9e58> <9e58> 7637 <9e59> <9e59> 21831 <9e5a> <9e5c> 6993 <9e5d> <9e5d> 21832 <9e5e> <9e5e> 6996 <9e5f> <9e62> 21833 <9e63> <9e63> 6997 <9e64> <9e64> 1934 <9e65> <9e65> 21837 <9e66> <9e6c> 6998 <9e6d> <9e6d> 7006 <9e6e> <9e6f> 21838 <9e70> <9e70> 4234 <9e71> <9e71> 7005 <9e72> <9e72> 21840 <9e73> <9e73> 7007 <9e74> <9e74> 21841 <9e75> <9e75> 9864 <9e76> <9e78> 21842 <9e79> <9e79> 9886 <9e7a> <9e7a> 9723 <9e7b> <9e7b> 21845 <9e7c> <9e7c> 8076 <9e7d> <9e7d> 8692 <9e7e> <9e7e> 7446 <9e7f> <9e7f> 2656 <9e80> <9e81> 21846 <9e82> <9e82> 7676 <9e83> <9e86> 21848 <9e87> <9e88> 7677 <9e89> <9e8a> 21852 <9e8b> <9e8b> 7679 <9e8c> <9e91> 21854 <9e92> <9e92> 7680 <9e93> <9e93> 2651 <9e94> <9e96> 21860 <9e97> <9e97> 8207 <9e98> <9e9c> 21863 <9e9d> <9e9d> 7682 <9e9e> <9e9e> 21868 <9e9f> <9e9f> 7683 <9ea0> <9ea4> 21869 <9ea5> <9ea5> 8305 <9ea6> <9ea6> 2714 <9ea7> <9ea8> 21874 <9ea9> <9ea9> 9719 <9eaa> <9eae> 21876 <9eaf> <9eaf> 9878 <9eb0> <9eb3> 21881 <9eb4> <9eb4> 7406 <9eb5> <9eb5> 9871 <9eb6> <9eb7> 21885 <9eb8> <9eb8> 7405 <9eb9> <9eba> 21887 <9ebb> <9ebb> 2704 <9ebc> <9ebc> 21889 <9ebd> <9ebe> 7673 <9ebf> <9ec3> 21890 <9ec4> <9ec4> 2011 <9ec5> <9ec8> 21895 <9ec9> <9ec9> 4856 <9eca> <9ecb> 21899 <9ecc> <9ecc> 8922 <9ecd> <9ecd> 3465 <9ece> <9ece> 2515 <9ecf> <9ecf> 6954 <9ed0> <9ed0> 21901 <9ed1> <9ed1> 1937 <9ed2> <9ed3> 21902 <9ed4> <9ed4> 3114 <9ed5> <9ed7> 21904 <9ed8> <9ed8> 2831 <9ed9> <9eda> 21907 <9edb> <9edd> 7684 <9ede> <9ede> 7873 <9edf> <9edf> 7688 <9ee0> <9ee0> 7687 <9ee1> <9ee1> 21909 <9ee2> <9ee2> 7689 <9ee3> <9ee4> 21910 <9ee5> <9ee5> 7692 <9ee6> <9ee6> 21912 <9ee7> <9ee7> 7691 <9ee8> <9ee8> 7859 <9ee9> <9ee9> 7690 <9eea> <9eea> 7693 <9eeb> <9eee> 21913 <9eef> <9eef> 7694 <9ef0> <9ef1> 21917 <9ef2> <9ef2> 9834 <9ef3> <9ef3> 21919 <9ef4> <9ef4> 9866 <9ef5> <9ef6> 21920 <9ef7> <9ef7> 9833 <9ef8> <9ef8> 21922 <9ef9> <9ef9> 6741 endcidrange 100 begincidrange <9efa> <9efa> 21923 <9efb> <9efc> 6742 <9efd> <9efd> 9752 <9efe> <9efe> 7542 <9eff> <9eff> 9753 <9f00> <9f08> 21924 <9f09> <9f09> 9754 <9f0a> <9f0a> 21933 <9f0b> <9f0b> 7543 <9f0c> <9f0c> 21934 <9f0d> <9f0d> 7544 <9f0e> <9f0e> 1509 <9f0f> <9f0f> 21935 <9f10> <9f10> 4724 <9f11> <9f12> 21936 <9f13> <9f13> 1821 <9f14> <9f14> 21938 <9f15> <9f15> 9843 <9f16> <9f16> 21939 <9f17> <9f17> 4721 <9f18> <9f18> 21940 <9f19> <9f19> 5087 <9f1a> <9f1f> 21941 <9f20> <9f20> 3466 <9f21> <9f21> 21947 <9f22> <9f22> 7695 <9f23> <9f2b> 21948 <9f2c> <9f2c> 7696 <9f2d> <9f2e> 21957 <9f2f> <9f2f> 7697 <9f30> <9f36> 21959 <9f37> <9f37> 7699 <9f38> <9f38> 21966 <9f39> <9f39> 7698 <9f3a> <9f3a> 21967 <9f3b> <9f3b> 1072 <9f3c> <9f3c> 21968 <9f3d> <9f3e> 7700 <9f3f> <9f43> 21969 <9f44> <9f44> 7702 <9f45> <9f49> 21974 <9f4a> <9f4a> 8390 <9f4b> <9f4b> 8811 <9f4c> <9f4e> 21979 <9f4f> <9f4f> 9427 <9f50> <9f50> 3082 <9f51> <9f51> 6594 <9f52> <9f52> 7814 <9f53> <9f53> 21982 <9f54> <9f54> 9743 <9f55> <9f58> 21983 <9f59> <9f59> 9745 <9f5a> <9f5b> 21987 <9f5c> <9f5c> 9747 <9f5d> <9f5e> 21989 <9f5f> <9f5f> 9744 <9f60> <9f60> 9746 <9f61> <9f61> 8240 <9f62> <9f62> 21991 <9f63> <9f63> 9841 <9f64> <9f65> 21992 <9f66> <9f66> 9748 <9f67> <9f69> 21994 <9f6a> <9f6a> 9750 <9f6b> <9f6b> 21997 <9f6c> <9f6c> 9749 <9f6d> <9f71> 21998 <9f72> <9f72> 8434 <9f73> <9f76> 22003 <9f77> <9f77> 9751 <9f78> <9f7e> 22007 <9f7f> <9f7f> 1282 <9f80> <9f80> 7533 <9f81> <9f82> 22014 <9f83> <9f83> 7534 <9f84> <9f84> 2605 <9f85> <9f8a> 7535 <9f8b> <9f8b> 3198 <9f8c> <9f8c> 7541 <9f8d> <9f8d> 8247 <9f8e> <9f8f> 22016 <9f90> <9f90> 8371 <9f91> <9f93> 22018 <9f94> <9f94> 7970 <9f95> <9f95> 9453 <9f96> <9f98> 22021 <9f99> <9f99> 2627 <9f9a> <9f9a> 1793 <9f9b> <9f9b> 6740 <9f9c> <9f9c> 7988 <9f9d> <9f9e> 22024 <9f9f> <9f9f> 1859 <9fa0> <9fa0> 4851 <9fa1> <9fa5> 22026 <e816> <e818> 22048 <e81e> <e81e> 22056 <e826> <e826> 22064 <e82b> <e82c> 22069 <e831> <e832> 22075 <e83b> <e83b> 22085 endcidrange 25 begincidrange <e843> <e843> 22093 <e854> <e855> 22110 <e864> <e864> 22126 <f92c> <f92c> 22031 <fa0d> <fa0f> 22032 <fa11> <fa11> 22035 <fa13> <fa14> 22036 <fa18> <fa18> 22038 <fa1f> <fa21> 22039 <fa23> <fa24> 22042 <fa27> <fa29> 22044 <fe30> <fe30> 10013 <fe49> <fe52> 10027 <fe54> <fe57> 10037 <fe59> <fe66> 10041 <fe68> <fe6b> 10055 <ff01> <ff03> 262 <ff04> <ff04> 166 <ff05> <ff5d> 266 <ff5e> <ff5e> 106 <ffe0> <ffe1> 168 <ffe2> <ffe2> 10014 <ffe3> <ffe3> 355 <ffe4> <ffe4> 10015 <ffe5> <ffe5> 265 endcidrange endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF \ No newline at end of file
diff --git a/src/main/resources/Resources/cmap/UniGB-UCS2-V b/src/main/resources/Resources/cmap/UniGB-UCS2-V
new file mode 100644
index 0000000..0315238
--- /dev/null
+++ b/src/main/resources/Resources/cmap/UniGB-UCS2-V
@@ -0,0 +1 @@
+%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%DocumentNeededResources: CMap (UniGB-UCS2-H) %%IncludeResource: ProcSet (CIDInit) %%IncludeResource: CMap (UniGB-UCS2-H) %%BeginResource: CMap (UniGB-UCS2-V) %%Title: (UniGB-UCS2-V Adobe GB1 1) %%Version: 10.001 %%Copyright: ----------------------------------------------------------- %%Copyright: Copyright 1990-1998 Adobe Systems Incorporated. %%Copyright: All Rights Reserved. %%Copyright: %%Copyright: Patents Pending %%Copyright: %%Copyright: NOTICE: All information contained herein is the property %%Copyright: of Adobe Systems Incorporated. %%Copyright: %%Copyright: Permission is granted for redistribution of this file %%Copyright: provided this copyright notice is maintained intact and %%Copyright: that the contents of this file are not altered in any %%Copyright: way from its original form. %%Copyright: %%Copyright: PostScript and Display PostScript are trademarks of %%Copyright: Adobe Systems Incorporated which may be registered in %%Copyright: certain jurisdictions. %%Copyright: ----------------------------------------------------------- %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /UniGB-UCS2-H usecmap /CIDSystemInfo 3 dict dup begin /Registry (Adobe) def /Ordering (GB1) def /Supplement 1 def end def /CMapName /UniGB-UCS2-V def /CMapVersion 10.001 def /CMapType 1 def /XUID [1 10 25367] def /WMode 1 def 24 begincidrange <2014> <2014> 598 <2026> <2026> 599 <2225> <2225> 7708 <3001> <3001> 575 <3002> <3002> 574 <3008> <300f> 584 <3010> <3011> 594 <3013> <3013> 7706 <3014> <3015> 582 <3016> <3017> 592 <ff01> <ff01> 578 <ff08> <ff09> 580 <ff0c> <ff0c> 573 <ff0e> <ff0e> 7707 <ff1a> <ff1b> 576 <ff1d> <ff1d> 7708 <ff1f> <ff1f> 579 <ff3b> <ff3b> 7709 <ff3d> <ff3d> 7710 <ff3f> <ff3f> 600 <ff5b> <ff5b> 596 <ff5d> <ff5d> 597 <ff5e> <ff5e> 7704 <ffe3> <ffe3> 7711 endcidrange endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF \ No newline at end of file
diff --git a/src/main/resources/Resources/cmap/UniHojo-UCS2-H b/src/main/resources/Resources/cmap/UniHojo-UCS2-H
new file mode 100644
index 0000000..3e12187
--- /dev/null
+++ b/src/main/resources/Resources/cmap/UniHojo-UCS2-H
@@ -0,0 +1,4418 @@
+%!PS-Adobe-3.0 Resource-CMap
+%%DocumentNeededResources: ProcSet (CIDInit)
+%%IncludeResource: ProcSet (CIDInit)
+%%BeginResource: CMap (UniHojo-UCS2-H)
+%%Title: (UniHojo-UCS2-H Adobe Japan2 0)
+%%Version: 9.001
+%%Copyright: -----------------------------------------------------------
+%%Copyright: Copyright 1990-1998 Adobe Systems Incorporated.
+%%Copyright: All Rights Reserved.
+%%Copyright:
+%%Copyright: Patents Pending
+%%Copyright:
+%%Copyright: NOTICE: All information contained herein is the property
+%%Copyright: of Adobe Systems Incorporated.
+%%Copyright:
+%%Copyright: Permission is granted for redistribution of this file
+%%Copyright: provided this copyright notice is maintained intact and
+%%Copyright: that the contents of this file are not altered in any
+%%Copyright: way from its original form.
+%%Copyright:
+%%Copyright: PostScript and Display PostScript are trademarks of
+%%Copyright: Adobe Systems Incorporated which may be registered in
+%%Copyright: certain jurisdictions.
+%%Copyright: -----------------------------------------------------------
+%%EndComments
+
+/CIDInit /ProcSet findresource begin
+
+12 dict begin
+
+begincmap
+
+/CIDSystemInfo 3 dict dup begin
+ /Registry (Adobe) def
+ /Ordering (Japan2) def
+ /Supplement 0 def
+end def
+
+/CMapName /UniHojo-UCS2-H def
+/CMapVersion 9.001 def
+/CMapType 1 def
+
+/XUID [1 10 25424] def
+
+/WMode 0 def
+
+2 begincodespacerange
+ <0000> <D7FF>
+ <E000> <FFFF>
+endcodespacerange
+
+100 begincidrange
+<007e> <007e> 9
+<00a1> <00a1> 12
+<00a4> <00a4> 20
+<00a6> <00a6> 13
+<00a9> <00a9> 17
+<00aa> <00aa> 16
+<00ae> <00ae> 18
+<00af> <00af> 6
+<00b8> <00b8> 3
+<00ba> <00ba> 15
+<00bf> <00bf> 14
+<00c0> <00c0> 97
+<00c1> <00c1> 96
+<00c2> <00c2> 99
+<00c3> <00c3> 105
+<00c4> <00c4> 98
+<00c5> <00c5> 104
+<00c6> <00c6> 69
+<00c7> <00c7> 109
+<00c8> <00c8> 113
+<00c9> <00c9> 112
+<00ca> <00ca> 115
+<00cb> <00cb> 114
+<00cc> <00cc> 126
+<00cd> <00cd> 125
+<00ce> <00ce> 128
+<00cf> <00cf> 127
+<00d1> <00d1> 142
+<00d2> <00d2> 144
+<00d3> <00d3> 143
+<00d4> <00d4> 146
+<00d5> <00d5> 150
+<00d6> <00d6> 145
+<00d8> <00d8> 76
+<00d9> <00d9> 161
+<00da> <00da> 160
+<00db> <00db> 163
+<00dc> <00dc> 162
+<00dd> <00dd> 176
+<00de> <00de> 79
+<00df> <00df> 93
+<00e0> <00e0> 183
+<00e1> <00e1> 182
+<00e2> <00e2> 185
+<00e3> <00e3> 191
+<00e4> <00e4> 184
+<00e5> <00e5> 190
+<00e6> <00e6> 80
+<00e7> <00e7> 195
+<00e8> <00e8> 199
+<00e9> <00e9> 198
+<00ea> <00ea> 201
+<00eb> <00eb> 200
+<00ec> <00ec> 212
+<00ed> <00ed> 211
+<00ee> <00ee> 214
+<00ef> <00ef> 213
+<00f0> <00f0> 82
+<00f1> <00f1> 227
+<00f2> <00f2> 229
+<00f3> <00f3> 228
+<00f4> <00f4> 231
+<00f5> <00f5> 235
+<00f6> <00f6> 230
+<00f8> <00f8> 91
+<00f9> <00f9> 246
+<00fa> <00fa> 245
+<00fb> <00fb> 248
+<00fc> <00fc> 247
+<00fd> <00fd> 261
+<00fe> <00fe> 95
+<00ff> <00ff> 262
+<0100> <0100> 102
+<0101> <0101> 188
+<0102> <0102> 100
+<0103> <0103> 186
+<0104> <0104> 103
+<0105> <0105> 189
+<0106> <0106> 106
+<0107> <0107> 192
+<0108> <0108> 107
+<0109> <0109> 193
+<010a> <010a> 110
+<010b> <010b> 196
+<010c> <010c> 108
+<010d> <010d> 194
+<010e> <010e> 111
+<010f> <010f> 197
+<0110> <0110> 70
+<0111> <0111> 81
+<0112> <0112> 118
+<0113> <0113> 204
+<0116> <0116> 117
+<0117> <0117> 203
+<0118> <0118> 119
+<0119> <0119> 205
+<011a> <011a> 116
+<011b> <011b> 202
+<011c> <011c> 120
+<011d> <011d> 207
+endcidrange
+
+100 begincidrange
+<011e> <011e> 121
+<011f> <011f> 208
+<0120> <0120> 123
+<0121> <0121> 209
+<0122> <0122> 122
+<0124> <0124> 124
+<0125> <0125> 210
+<0126> <0126> 71
+<0127> <0127> 83
+<0128> <0128> 133
+<0129> <0129> 218
+<012a> <012a> 131
+<012b> <012b> 216
+<012e> <012e> 132
+<012f> <012f> 217
+<0130> <0130> 130
+<0131> <0131> 84
+<0132> <0132> 72
+<0133> <0133> 85
+<0134> <0134> 134
+<0135> <0135> 219
+<0136> <0136> 135
+<0137> <0137> 220
+<0138> <0138> 86
+<0139> <0139> 136
+<013a> <013a> 221
+<013b> <013b> 138
+<013c> <013c> 223
+<013d> <013d> 137
+<013e> <013e> 222
+<013f> <013f> 74
+<0140> <0140> 88
+<0141> <0141> 73
+<0142> <0142> 87
+<0143> <0143> 139
+<0144> <0144> 224
+<0145> <0145> 141
+<0146> <0146> 226
+<0147> <0147> 140
+<0148> <0148> 225
+<0149> <0149> 89
+<014a> <014a> 75
+<014b> <014b> 90
+<014c> <014c> 149
+<014d> <014d> 234
+<0150> <0150> 148
+<0151> <0151> 233
+<0152> <0152> 77
+<0153> <0153> 92
+<0154> <0154> 151
+<0155> <0155> 236
+<0156> <0156> 153
+<0157> <0157> 238
+<0158> <0158> 152
+<0159> <0159> 237
+<015a> <015a> 154
+<015b> <015b> 239
+<015c> <015c> 155
+<015d> <015d> 240
+<015e> <015e> 157
+<015f> <015f> 242
+<0160> <0160> 156
+<0161> <0161> 241
+<0162> <0162> 159
+<0163> <0163> 244
+<0164> <0164> 158
+<0165> <0165> 243
+<0166> <0166> 78
+<0167> <0167> 94
+<0168> <0168> 170
+<0169> <0169> 255
+<016a> <016a> 167
+<016b> <016b> 252
+<016c> <016c> 164
+<016d> <016d> 249
+<016e> <016e> 169
+<016f> <016f> 254
+<0170> <0170> 166
+<0171> <0171> 251
+<0172> <0172> 168
+<0173> <0173> 253
+<0174> <0174> 175
+<0175> <0175> 260
+<0176> <0176> 178
+<0177> <0177> 263
+<0178> <0178> 177
+<0179> <0179> 179
+<017a> <017a> 264
+<017b> <017b> 181
+<017c> <017c> 266
+<017d> <017d> 180
+<017e> <017e> 265
+<01cd> <01cd> 101
+<01ce> <01ce> 187
+<01cf> <01cf> 129
+<01d0> <01d0> 215
+<01d1> <01d1> 147
+<01d2> <01d2> 232
+<01d3> <01d3> 165
+<01d4> <01d4> 250
+endcidrange
+
+100 begincidrange
+<01d5> <01d5> 174
+<01d6> <01d6> 259
+<01d7> <01d7> 171
+<01d8> <01d8> 256
+<01d9> <01d9> 173
+<01da> <01da> 258
+<01db> <01db> 172
+<01dc> <01dc> 257
+<01f5> <01f5> 206
+<02c7> <02c7> 2
+<02d8> <02d8> 1
+<02d9> <02d9> 4
+<02da> <02da> 8
+<02db> <02db> 7
+<02dd> <02dd> 5
+<0384> <0385> 10
+<0386> <0386> 22
+<0388> <038a> 23
+<038c> <038c> 27
+<038e> <038e> 28
+<038f> <038f> 30
+<0390> <0390> 36
+<03aa> <03aa> 26
+<03ab> <03ab> 29
+<03ac> <03af> 31
+<03b0> <03b0> 41
+<03c2> <03c2> 38
+<03ca> <03ca> 35
+<03cb> <03cb> 40
+<03cc> <03cc> 37
+<03cd> <03cd> 39
+<03ce> <03ce> 42
+<0402> <040c> 43
+<040e> <040f> 54
+<0452> <045c> 56
+<045e> <045f> 67
+<2116> <2116> 21
+<2122> <2122> 19
+<4e02> <4e02> 267
+<4e04> <4e05> 268
+<4e0c> <4e0c> 270
+<4e12> <4e12> 271
+<4e1f> <4e1f> 272
+<4e23> <4e24> 273
+<4e28> <4e28> 275
+<4e2b> <4e2b> 276
+<4e2e> <4e30> 277
+<4e35> <4e35> 280
+<4e40> <4e41> 281
+<4e44> <4e44> 283
+<4e47> <4e47> 284
+<4e51> <4e51> 285
+<4e5a> <4e5a> 286
+<4e5c> <4e5c> 287
+<4e63> <4e63> 288
+<4e68> <4e69> 289
+<4e74> <4e75> 291
+<4e79> <4e79> 293
+<4e7f> <4e7f> 294
+<4e8d> <4e8d> 295
+<4e96> <4e97> 296
+<4e9d> <4e9d> 298
+<4eaf> <4eaf> 299
+<4eb9> <4eb9> 300
+<4ec3> <4ec3> 301
+<4ed0> <4ed0> 302
+<4eda> <4edb> 303
+<4ee0> <4ee2> 305
+<4ee8> <4ee8> 308
+<4eef> <4eef> 309
+<4ef1> <4ef1> 310
+<4ef3> <4ef3> 311
+<4ef5> <4ef5> 312
+<4efd> <4eff> 313
+<4f00> <4f00> 316
+<4f02> <4f03> 317
+<4f08> <4f08> 319
+<4f0b> <4f0c> 320
+<4f12> <4f12> 322
+<4f15> <4f17> 323
+<4f19> <4f19> 326
+<4f2e> <4f2e> 327
+<4f31> <4f31> 328
+<4f33> <4f33> 330
+<4f35> <4f35> 331
+<4f37> <4f37> 332
+<4f39> <4f39> 333
+<4f3b> <4f3b> 334
+<4f3e> <4f3e> 335
+<4f40> <4f40> 336
+<4f42> <4f42> 337
+<4f48> <4f49> 338
+<4f4b> <4f4c> 340
+<4f52> <4f52> 342
+<4f54> <4f54> 343
+<4f56> <4f56> 344
+<4f58> <4f58> 345
+<4f5f> <4f5f> 346
+<4f60> <4f60> 329
+<4f63> <4f63> 347
+endcidrange
+
+100 begincidrange
+<4f6a> <4f6a> 348
+<4f6c> <4f6c> 349
+<4f6e> <4f6e> 350
+<4f71> <4f71> 351
+<4f77> <4f7a> 352
+<4f7d> <4f7e> 356
+<4f81> <4f82> 358
+<4f84> <4f85> 360
+<4f89> <4f8a> 362
+<4f8c> <4f8c> 364
+<4f8e> <4f8e> 365
+<4f90> <4f90> 366
+<4f92> <4f94> 367
+<4f97> <4f97> 370
+<4f99> <4f9a> 371
+<4f9e> <4f9f> 373
+<4fb2> <4fb2> 375
+<4fb7> <4fb7> 376
+<4fb9> <4fb9> 377
+<4fbb> <4fbe> 378
+<4fc0> <4fc1> 382
+<4fc5> <4fc6> 384
+<4fc8> <4fc9> 386
+<4fcb> <4fcd> 388
+<4fcf> <4fcf> 391
+<4fd2> <4fd2> 392
+<4fdc> <4fdc> 393
+<4fe0> <4fe0> 394
+<4fe2> <4fe2> 395
+<4ff0> <4ff0> 396
+<4ff2> <4ff2> 397
+<4ffc> <4ffd> 398
+<4fff> <4fff> 400
+<5000> <5001> 401
+<5004> <5004> 403
+<5007> <5007> 404
+<500a> <500a> 405
+<500c> <500c> 406
+<500e> <500e> 407
+<5010> <5010> 408
+<5013> <5013> 409
+<5017> <5018> 410
+<501b> <501e> 412
+<5022> <5022> 416
+<5027> <5027> 417
+<502e> <502e> 418
+<5030> <5030> 419
+<5032> <5033> 420
+<5035> <5035> 422
+<503b> <503b> 446
+<5040> <5042> 423
+<5045> <5046> 426
+<504a> <504a> 428
+<504c> <504c> 429
+<504e> <504e> 430
+<5051> <5053> 431
+<5057> <5057> 434
+<5059> <5059> 435
+<505f> <5060> 436
+<5062> <5063> 438
+<5066> <5067> 440
+<506a> <506a> 442
+<506d> <506d> 443
+<5070> <5071> 444
+<5081> <5081> 447
+<5083> <5084> 448
+<5086> <5086> 450
+<508a> <508a> 451
+<508e> <5090> 452
+<5092> <5094> 455
+<5096> <5096> 458
+<509b> <509c> 459
+<509e> <50a2> 461
+<50aa> <50aa> 466
+<50af> <50b0> 467
+<50b9> <50ba> 469
+<50bd> <50bd> 471
+<50c0> <50c0> 472
+<50c3> <50c4> 473
+<50c7> <50c7> 475
+<50cc> <50cc> 476
+<50ce> <50ce> 477
+<50d0> <50d0> 478
+<50d3> <50d4> 479
+<50d8> <50d8> 481
+<50dc> <50dd> 482
+<50df> <50df> 484
+<50e2> <50e2> 485
+<50e4> <50e4> 486
+<50e6> <50e6> 487
+<50e8> <50e9> 488
+<50ef> <50ef> 490
+<50f1> <50f1> 491
+<50f2> <50f2> 503
+<50f6> <50f6> 492
+<50fa> <50fa> 493
+<50fe> <50fe> 494
+<5103> <5103> 495
+<5106> <5108> 496
+<510b> <510e> 499
+endcidrange
+
+100 begincidrange
+<5110> <5110> 504
+<5117> <5117> 505
+<5119> <5119> 506
+<511b> <511e> 507
+<5123> <5123> 511
+<5127> <5128> 512
+<512c> <512d> 514
+<512f> <512f> 516
+<5131> <5131> 517
+<5133> <5135> 518
+<5138> <5139> 521
+<5142> <5142> 523
+<514a> <514a> 524
+<514f> <514f> 525
+<5153> <5153> 526
+<5155> <5155> 527
+<5157> <5158> 528
+<515f> <515f> 530
+<5164> <5164> 531
+<5166> <5166> 532
+<517e> <517e> 533
+<5183> <5184> 534
+<518b> <518b> 536
+<518e> <518e> 537
+<5198> <5198> 538
+<519d> <519d> 539
+<51a1> <51a1> 540
+<51a3> <51a3> 541
+<51ad> <51ad> 542
+<51b8> <51b8> 543
+<51ba> <51ba> 544
+<51bc> <51bc> 545
+<51be> <51bf> 546
+<51c2> <51c2> 548
+<51c8> <51c8> 549
+<51cf> <51cf> 550
+<51d1> <51d3> 551
+<51d5> <51d5> 554
+<51d8> <51d8> 555
+<51de> <51de> 556
+<51e2> <51e2> 557
+<51e5> <51e5> 558
+<51ee> <51ee> 559
+<51f2> <51f4> 560
+<51f7> <51f7> 563
+<5201> <5202> 564
+<5205> <5205> 566
+<5212> <5213> 567
+<5215> <5216> 569
+<5218> <5218> 571
+<5222> <5222> 572
+<5228> <5228> 573
+<5231> <5232> 574
+<5235> <5235> 576
+<523c> <523c> 577
+<5245> <5245> 578
+<5249> <5249> 579
+<5255> <5255> 580
+<5257> <5258> 581
+<525a> <525a> 583
+<525c> <525c> 584
+<525f> <5261> 585
+<5266> <5266> 588
+<526e> <526e> 589
+<5277> <5279> 590
+<5280> <5280> 593
+<5282> <5282> 594
+<5285> <5285> 595
+<528a> <528a> 596
+<528c> <528c> 597
+<5293> <5293> 598
+<5295> <5298> 599
+<529a> <529a> 603
+<529c> <529c> 604
+<52a4> <52a7> 605
+<52af> <52b0> 609
+<52b6> <52b8> 611
+<52ba> <52bb> 614
+<52bd> <52bd> 616
+<52c0> <52c0> 617
+<52c4> <52c4> 618
+<52c6> <52c6> 619
+<52c8> <52c8> 620
+<52cc> <52cc> 621
+<52cf> <52cf> 622
+<52d1> <52d1> 623
+<52d4> <52d4> 624
+<52d6> <52d6> 625
+<52db> <52dc> 626
+<52e1> <52e1> 628
+<52e5> <52e5> 629
+<52e8> <52ea> 630
+<52ec> <52ec> 633
+<52f0> <52f1> 634
+<52f4> <52f4> 636
+<52f6> <52f7> 637
+<5300> <5300> 639
+<5303> <5303> 640
+<530a> <530c> 641
+<5311> <5311> 644
+endcidrange
+
+100 begincidrange
+<5313> <5313> 645
+<5318> <5318> 646
+<531b> <531c> 647
+<531e> <531f> 649
+<5325> <5325> 651
+<5327> <5329> 652
+<532b> <532d> 655
+<5330> <5330> 658
+<5332> <5332> 659
+<5335> <5335> 660
+<533c> <533e> 661
+<5342> <5342> 664
+<534b> <534b> 666
+<534c> <534c> 665
+<5359> <5359> 667
+<535b> <535b> 668
+<5361> <5361> 669
+<5363> <5363> 670
+<5365> <5365> 671
+<536c> <536d> 672
+<5372> <5372> 674
+<5379> <5379> 675
+<537e> <537e> 676
+<5383> <5383> 677
+<5387> <5388> 678
+<538e> <538e> 680
+<5393> <5394> 681
+<5399> <5399> 683
+<539d> <539d> 684
+<53a1> <53a1> 685
+<53a4> <53a4> 686
+<53aa> <53ab> 687
+<53af> <53af> 689
+<53b2> <53b2> 690
+<53b4> <53b5> 691
+<53b7> <53b8> 693
+<53ba> <53ba> 695
+<53bd> <53bd> 696
+<53c0> <53c0> 697
+<53c5> <53c5> 698
+<53cf> <53cf> 699
+<53d2> <53d3> 700
+<53d5> <53d5> 702
+<53da> <53da> 703
+<53dd> <53de> 704
+<53e0> <53e0> 706
+<53e6> <53e7> 707
+<53f5> <53f5> 709
+<5402> <5402> 710
+<5413> <5413> 711
+<541a> <541a> 712
+<5421> <5421> 713
+<5427> <5428> 714
+<542a> <542a> 716
+<542f> <542f> 717
+<5431> <5431> 718
+<5434> <5435> 719
+<5443> <5444> 721
+<5447> <5447> 723
+<544d> <544d> 724
+<544f> <544f> 725
+<545e> <545e> 726
+<5462> <5462> 727
+<5464> <5464> 728
+<5466> <5467> 729
+<5469> <5469> 731
+<546b> <546b> 732
+<546d> <546e> 733
+<5474> <5474> 735
+<547f> <547f> 736
+<5481> <5481> 737
+<5483> <5483> 738
+<5485> <5485> 739
+<5488> <5489> 740
+<548d> <548d> 742
+<5491> <5491> 743
+<5495> <5496> 744
+<549c> <549c> 746
+<549f> <549f> 747
+<54a1> <54a1> 748
+<54a6> <54a7> 749
+<54a9> <54aa> 751
+<54ad> <54ae> 753
+<54b1> <54b1> 755
+<54b7> <54b7> 756
+<54b9> <54bb> 757
+<54bf> <54bf> 760
+<54c6> <54c6> 761
+<54ca> <54ca> 762
+<54cd> <54ce> 763
+<54e0> <54e0> 765
+<54ea> <54ea> 766
+<54ec> <54ec> 767
+<54ef> <54ef> 768
+<54f6> <54f6> 769
+<54fc> <54fc> 770
+<54fe> <54ff> 771
+<5500> <5501> 773
+<5505> <5505> 775
+<5508> <5509> 776
+endcidrange
+
+100 begincidrange
+<550c> <550e> 778
+<5515> <5515> 781
+<552a> <552b> 782
+<5532> <5532> 784
+<5535> <5536> 785
+<553b> <553d> 787
+<5541> <5541> 790
+<5547> <5547> 791
+<5549> <554a> 792
+<554d> <554d> 794
+<5550> <5551> 795
+<5558> <5558> 797
+<555a> <555b> 798
+<555e> <555e> 800
+<5560> <5561> 801
+<5564> <5564> 803
+<5566> <5566> 804
+<557f> <557f> 805
+<5581> <5582> 806
+<5586> <5586> 808
+<5588> <5588> 809
+<558e> <558f> 810
+<5591> <5594> 812
+<5597> <5597> 816
+<55a3> <55a4> 817
+<55ad> <55ad> 819
+<55b2> <55b2> 820
+<55bf> <55bf> 821
+<55c1> <55c1> 822
+<55c3> <55c3> 823
+<55c6> <55c6> 824
+<55c9> <55c9> 825
+<55cb> <55cc> 826
+<55ce> <55ce> 828
+<55d1> <55d3> 829
+<55d7> <55d8> 832
+<55db> <55db> 834
+<55de> <55de> 835
+<55e2> <55e2> 836
+<55e9> <55e9> 837
+<55f6> <55f6> 838
+<55ff> <55ff> 839
+<5605> <5605> 840
+<5608> <5608> 841
+<560a> <560a> 842
+<560d> <5612> 843
+<5619> <5619> 849
+<562c> <562c> 850
+<5630> <5630> 851
+<5633> <5633> 852
+<5635> <5635> 853
+<5637> <5637> 854
+<5639> <5639> 855
+<563b> <563d> 856
+<563f> <5641> 859
+<5643> <5644> 862
+<5646> <5646> 864
+<5649> <5649> 865
+<564b> <564b> 866
+<564d> <564d> 867
+<564f> <564f> 868
+<5654> <5654> 869
+<565e> <565e> 870
+<5660> <5663> 871
+<5666> <5666> 875
+<5669> <5669> 876
+<566d> <566d> 877
+<566f> <566f> 878
+<5671> <5672> 879
+<5675> <5675> 881
+<5684> <5685> 882
+<5688> <5688> 884
+<568b> <568c> 885
+<5695> <5695> 887
+<5699> <569a> 888
+<569d> <569f> 890
+<56a6> <56a9> 893
+<56ab> <56ad> 897
+<56b1> <56b1> 900
+<56b3> <56b3> 901
+<56b7> <56b7> 902
+<56be> <56be> 903
+<56c5> <56c5> 904
+<56c9> <56cb> 905
+<56cc> <56cd> 910
+<56cf> <56d0> 908
+<56d9> <56d9> 912
+<56dc> <56dd> 913
+<56df> <56df> 915
+<56e1> <56e1> 916
+<56e4> <56e8> 917
+<56eb> <56eb> 923
+<56ed> <56ed> 924
+<56f1> <56f1> 922
+<56f6> <56f7> 925
+<5701> <5702> 927
+<5707> <5707> 929
+<570a> <570a> 930
+<570c> <570c> 931
+<5711> <5711> 932
+endcidrange
+
+100 begincidrange
+<5715> <5715> 933
+<571a> <571b> 934
+<571d> <571d> 936
+<5720> <5720> 937
+<5722> <5725> 938
+<5729> <572a> 942
+<572c> <572c> 944
+<572e> <572f> 945
+<5733> <5734> 947
+<573d> <573f> 949
+<5745> <5746> 952
+<574c> <574d> 954
+<5752> <5752> 956
+<5762> <5762> 957
+<5765> <5765> 958
+<5767> <5768> 959
+<576b> <576b> 961
+<576d> <5771> 962
+<5773> <5775> 967
+<5777> <5777> 970
+<5779> <577c> 971
+<577e> <577e> 975
+<5781> <5781> 976
+<5783> <5783> 977
+<578c> <578c> 978
+<5794> <5794> 979
+<5795> <5795> 988
+<5797> <5797> 980
+<5799> <579a> 981
+<579c> <579f> 983
+<57a1> <57a1> 987
+<57a7> <57a9> 989
+<57ac> <57ac> 992
+<57b8> <57b8> 993
+<57bd> <57bd> 994
+<57c7> <57c8> 995
+<57cc> <57cc> 997
+<57cf> <57cf> 998
+<57d5> <57d5> 999
+<57dd> <57de> 1000
+<57e1> <57e1> 1018
+<57e4> <57e4> 1002
+<57e6> <57e7> 1003
+<57e9> <57e9> 1005
+<57ed> <57ed> 1006
+<57f0> <57f0> 1007
+<57f5> <57f6> 1008
+<57f8> <57f8> 1010
+<57fd> <57ff> 1011
+<5803> <5804> 1014
+<5808> <5809> 1016
+<580c> <580d> 1019
+<581b> <581b> 1021
+<581e> <5820> 1022
+<5826> <5827> 1025
+<582d> <582d> 1027
+<5832> <5832> 1028
+<5839> <5839> 1029
+<583f> <583f> 1030
+<5849> <5849> 1031
+<584c> <584d> 1032
+<584f> <5850> 1034
+<5855> <5855> 1036
+<585f> <585f> 1037
+<5861> <5861> 1038
+<5864> <5864> 1039
+<5867> <5868> 1040
+<5878> <5878> 1042
+<587c> <587c> 1043
+<587f> <5881> 1044
+<5887> <588a> 1047
+<588c> <588d> 1051
+<588f> <5890> 1053
+<5894> <5894> 1055
+<5896> <5896> 1056
+<589d> <589d> 1057
+<58a0> <58a2> 1058
+<58a6> <58a6> 1061
+<58a9> <58a9> 1062
+<58b1> <58b2> 1063
+<58bc> <58bc> 1066
+<58c2> <58c2> 1067
+<58c4> <58c4> 1065
+<58c8> <58c8> 1068
+<58cd> <58ce> 1069
+<58d0> <58d0> 1071
+<58d2> <58d2> 1072
+<58d4> <58d4> 1073
+<58d6> <58d6> 1074
+<58da> <58da> 1075
+<58dd> <58dd> 1076
+<58e1> <58e2> 1077
+<58e9> <58e9> 1079
+<58f3> <58f3> 1080
+<5905> <5906> 1081
+<590b> <590c> 1083
+<5912> <5914> 1085
+<591d> <591d> 1089
+<5921> <5921> 1090
+<5923> <5924> 1091
+endcidrange
+
+100 begincidrange
+<5928> <5928> 1093
+<592f> <5930> 1094
+<5933> <5933> 1096
+<5935> <5936> 1097
+<593f> <593f> 1099
+<5943> <5943> 1100
+<5946> <5946> 1101
+<5952> <5953> 1102
+<5959> <5959> 1104
+<595b> <595b> 1105
+<595d> <595f> 1106
+<5961> <5961> 1109
+<5963> <5963> 1110
+<596b> <596b> 1111
+<596d> <596d> 1112
+<596f> <596f> 1113
+<5972> <5972> 1114
+<5975> <5976> 1115
+<5979> <5979> 1117
+<597b> <597c> 1118
+<598b> <598c> 1120
+<598e> <598e> 1122
+<5992> <5992> 1123
+<5995> <5995> 1124
+<5997> <5997> 1125
+<599f> <599f> 1126
+<59a4> <59a4> 1127
+<59a7> <59a7> 1128
+<59ad> <59b0> 1129
+<59b3> <59b3> 1133
+<59b7> <59b7> 1134
+<59ba> <59ba> 1135
+<59bc> <59bc> 1136
+<59c1> <59c1> 1137
+<59c3> <59c4> 1138
+<59c8> <59c8> 1140
+<59ca> <59ca> 1141
+<59cd> <59cd> 1142
+<59d2> <59d2> 1143
+<59dd> <59df> 1144
+<59e3> <59e4> 1147
+<59e7> <59e7> 1149
+<59ee> <59ef> 1150
+<59f1> <59f2> 1152
+<59f4> <59f4> 1154
+<59f7> <59f7> 1155
+<5a00> <5a00> 1156
+<5a04> <5a04> 1157
+<5a0c> <5a0e> 1158
+<5a12> <5a13> 1161
+<5a1e> <5a1e> 1163
+<5a23> <5a24> 1164
+<5a27> <5a28> 1166
+<5a2a> <5a2a> 1168
+<5a2d> <5a2d> 1169
+<5a30> <5a30> 1170
+<5a44> <5a45> 1171
+<5a47> <5a48> 1173
+<5a4c> <5a4c> 1175
+<5a50> <5a50> 1176
+<5a55> <5a55> 1177
+<5a5e> <5a5e> 1178
+<5a63> <5a63> 1179
+<5a65> <5a65> 1180
+<5a67> <5a67> 1181
+<5a6d> <5a6d> 1182
+<5a77> <5a77> 1183
+<5a7a> <5a7b> 1184
+<5a7e> <5a7e> 1186
+<5a8b> <5a8b> 1187
+<5a90> <5a90> 1188
+<5a93> <5a93> 1189
+<5a96> <5a96> 1190
+<5a99> <5a99> 1191
+<5a9c> <5a9c> 1192
+<5a9e> <5aa0> 1193
+<5aa2> <5aa2> 1196
+<5aa7> <5aa7> 1197
+<5aac> <5aac> 1198
+<5ab1> <5ab3> 1199
+<5ab5> <5ab5> 1202
+<5ab8> <5ab8> 1203
+<5aba> <5abb> 1204
+<5abf> <5abf> 1206
+<5ac4> <5ac4> 1207
+<5ac6> <5ac6> 1208
+<5ac8> <5ac8> 1209
+<5acf> <5acf> 1210
+<5ada> <5ada> 1211
+<5adc> <5adc> 1212
+<5ae0> <5ae0> 1213
+<5ae5> <5ae5> 1214
+<5aea> <5aea> 1215
+<5aee> <5aee> 1216
+<5af5> <5af6> 1217
+<5afd> <5afd> 1219
+<5b00> <5b01> 1220
+<5b08> <5b08> 1222
+<5b17> <5b17> 1223
+<5b19> <5b19> 1225
+endcidrange
+
+100 begincidrange
+<5b1b> <5b1b> 1226
+<5b1d> <5b1d> 1227
+<5b21> <5b21> 1228
+<5b25> <5b25> 1229
+<5b2d> <5b2d> 1230
+<5b34> <5b34> 1224
+<5b38> <5b38> 1231
+<5b41> <5b41> 1232
+<5b4b> <5b4c> 1233
+<5b52> <5b52> 1235
+<5b56> <5b56> 1236
+<5b5e> <5b5e> 1237
+<5b68> <5b68> 1238
+<5b6e> <5b6f> 1239
+<5b7c> <5b7f> 1241
+<5b81> <5b81> 1245
+<5b84> <5b84> 1246
+<5b86> <5b86> 1247
+<5b8a> <5b8a> 1248
+<5b8e> <5b8e> 1249
+<5b90> <5b91> 1250
+<5b93> <5b94> 1252
+<5b96> <5b96> 1254
+<5ba8> <5ba9> 1255
+<5bac> <5bad> 1257
+<5baf> <5baf> 1259
+<5bb1> <5bb2> 1260
+<5bb7> <5bb7> 1262
+<5bba> <5bba> 1263
+<5bbc> <5bbc> 1264
+<5bc0> <5bc1> 1265
+<5bcd> <5bcd> 1267
+<5bcf> <5bcf> 1268
+<5bd6> <5bda> 1269
+<5be0> <5be0> 1274
+<5bef> <5bef> 1275
+<5bf1> <5bf1> 1276
+<5bf4> <5bf4> 1277
+<5bfd> <5bfd> 1278
+<5c0c> <5c0c> 1279
+<5c17> <5c17> 1280
+<5c1e> <5c1f> 1281
+<5c23> <5c23> 1283
+<5c26> <5c26> 1284
+<5c29> <5c29> 1285
+<5c2b> <5c2c> 1286
+<5c2e> <5c2e> 1288
+<5c30> <5c30> 1289
+<5c32> <5c32> 1290
+<5c35> <5c36> 1291
+<5c59> <5c5a> 1293
+<5c5c> <5c5c> 1295
+<5c62> <5c63> 1296
+<5c67> <5c69> 1298
+<5c6d> <5c6d> 1301
+<5c70> <5c70> 1302
+<5c74> <5c75> 1303
+<5c7a> <5c7d> 1305
+<5c87> <5c88> 1309
+<5c8a> <5c8a> 1311
+<5c8f> <5c8f> 1312
+<5c92> <5c92> 1313
+<5c9d> <5c9d> 1314
+<5c9f> <5ca0> 1315
+<5ca2> <5ca3> 1317
+<5ca6> <5ca6> 1319
+<5caa> <5caa> 1320
+<5cb2> <5cb2> 1321
+<5cb4> <5cb5> 1322
+<5cba> <5cba> 1324
+<5cc9> <5cc9> 1325
+<5ccb> <5ccb> 1326
+<5cd2> <5cd2> 1327
+<5cd7> <5cd7> 1329
+<5cdd> <5cdd> 1328
+<5cee> <5cee> 1330
+<5cf1> <5cf2> 1331
+<5cf4> <5cf4> 1333
+<5d01> <5d01> 1334
+<5d06> <5d06> 1335
+<5d0d> <5d0d> 1336
+<5d12> <5d12> 1337
+<5d23> <5d24> 1339
+<5d26> <5d27> 1341
+<5d2b> <5d2b> 1338
+<5d31> <5d31> 1343
+<5d34> <5d34> 1344
+<5d39> <5d39> 1345
+<5d3d> <5d3d> 1346
+<5d3f> <5d3f> 1347
+<5d42> <5d43> 1348
+<5d46> <5d46> 1350
+<5d48> <5d48> 1351
+<5d4a> <5d4a> 1355
+<5d51> <5d51> 1353
+<5d55> <5d55> 1352
+<5d59> <5d59> 1354
+<5d5f> <5d62> 1356
+<5d64> <5d64> 1360
+<5d6a> <5d6a> 1361
+endcidrange
+
+100 begincidrange
+<5d6d> <5d6d> 1362
+<5d70> <5d70> 1363
+<5d79> <5d7a> 1364
+<5d7e> <5d7f> 1366
+<5d81> <5d81> 1368
+<5d83> <5d83> 1369
+<5d88> <5d88> 1370
+<5d8a> <5d8a> 1371
+<5d92> <5d95> 1372
+<5d99> <5d99> 1376
+<5d9b> <5d9b> 1377
+<5d9f> <5da0> 1378
+<5da7> <5da7> 1380
+<5dab> <5dab> 1381
+<5db0> <5db0> 1382
+<5db2> <5db2> 5426
+<5db4> <5db4> 1383
+<5db8> <5db9> 1384
+<5dc3> <5dc3> 1386
+<5dc7> <5dc7> 1387
+<5dcb> <5dcb> 1388
+<5dce> <5dce> 1390
+<5dd0> <5dd0> 1389
+<5dd8> <5dd9> 1391
+<5de0> <5de0> 1393
+<5de4> <5de4> 1394
+<5de9> <5de9> 1395
+<5df8> <5df9> 1396
+<5e00> <5e00> 1398
+<5e07> <5e07> 1399
+<5e0d> <5e0d> 1400
+<5e12> <5e12> 1401
+<5e14> <5e15> 1402
+<5e18> <5e18> 1404
+<5e1f> <5e20> 1405
+<5e28> <5e28> 1408
+<5e2e> <5e2e> 1407
+<5e32> <5e32> 1409
+<5e35> <5e35> 1410
+<5e3e> <5e3e> 1411
+<5e49> <5e49> 1414
+<5e4b> <5e4b> 1412
+<5e50> <5e50> 1413
+<5e51> <5e51> 1415
+<5e56> <5e56> 1416
+<5e58> <5e58> 1417
+<5e5b> <5e5c> 1418
+<5e5e> <5e5e> 1420
+<5e68> <5e68> 1421
+<5e6a> <5e6e> 1422
+<5e70> <5e70> 1427
+<5e80> <5e80> 1428
+<5e8b> <5e8b> 1429
+<5e8e> <5e8e> 1430
+<5ea2> <5ea2> 1431
+<5ea4> <5ea5> 1432
+<5ea8> <5ea8> 1434
+<5eaa> <5eaa> 1435
+<5eac> <5eac> 1436
+<5eb1> <5eb1> 1437
+<5eb3> <5eb3> 1438
+<5ebd> <5ebf> 1439
+<5ec6> <5ec6> 1442
+<5ecb> <5ecb> 1444
+<5ecc> <5ecc> 1443
+<5ece> <5ece> 1445
+<5ed1> <5ed2> 1446
+<5ed4> <5ed5> 1448
+<5edc> <5edc> 1450
+<5ede> <5ede> 1451
+<5ee5> <5ee5> 1452
+<5eeb> <5eeb> 1453
+<5f02> <5f02> 1454
+<5f06> <5f08> 1455
+<5f0e> <5f0e> 1458
+<5f19> <5f19> 1459
+<5f1c> <5f1d> 1460
+<5f21> <5f24> 1462
+<5f28> <5f28> 1466
+<5f2b> <5f2c> 1467
+<5f2e> <5f2e> 1469
+<5f30> <5f30> 1470
+<5f34> <5f34> 1471
+<5f36> <5f36> 1472
+<5f3b> <5f3b> 1473
+<5f3d> <5f3d> 1474
+<5f3f> <5f40> 1475
+<5f44> <5f45> 1477
+<5f47> <5f47> 1479
+<5f4d> <5f4d> 1480
+<5f50> <5f50> 1481
+<5f54> <5f54> 1482
+<5f58> <5f58> 1483
+<5f5b> <5f5b> 1484
+<5f60> <5f60> 1485
+<5f63> <5f64> 1486
+<5f67> <5f67> 1488
+<5f6f> <5f6f> 1489
+<5f72> <5f72> 1490
+<5f74> <5f75> 1491
+endcidrange
+
+100 begincidrange
+<5f78> <5f78> 1493
+<5f7a> <5f7a> 1494
+<5f7d> <5f7e> 1495
+<5f89> <5f89> 1497
+<5f8d> <5f8d> 1498
+<5f8f> <5f8f> 1499
+<5f96> <5f96> 1500
+<5f9c> <5f9d> 1501
+<5fa2> <5fa2> 1503
+<5fa4> <5fa4> 1506
+<5fa7> <5fa7> 1504
+<5fab> <5fab> 1505
+<5fac> <5fac> 1507
+<5faf> <5fb1> 1508
+<5fb8> <5fb8> 1511
+<5fc4> <5fc4> 1512
+<5fc7> <5fc9> 1513
+<5fcb> <5fcb> 1516
+<5fd0> <5fd4> 1517
+<5fde> <5fde> 1522
+<5fe1> <5fe2> 1523
+<5fe8> <5fea> 1525
+<5fec> <5fef> 1528
+<5ff2> <5ff3> 1532
+<5ff6> <5ff6> 1534
+<5ffa> <5ffa> 1535
+<5ffc> <5ffc> 1536
+<6007> <6007> 1537
+<600a> <600a> 1538
+<600d> <600d> 1539
+<6013> <6014> 1540
+<6017> <6018> 1542
+<601a> <601a> 1544
+<601f> <601f> 1545
+<6024> <6024> 1546
+<602d> <602d> 1547
+<6033> <6033> 1548
+<6035> <6035> 1549
+<6040> <6040> 1550
+<6047> <6049> 1551
+<604c> <604c> 1554
+<6051> <6051> 1555
+<6054> <6054> 1556
+<6056> <6057> 1557
+<605d> <605d> 1559
+<6061> <6061> 1560
+<6067> <6067> 1561
+<6071> <6071> 1562
+<607e> <607f> 1563
+<6082> <6082> 1565
+<6086> <6086> 1566
+<6088> <6088> 1567
+<608a> <608a> 1568
+<608e> <608e> 1569
+<6091> <6091> 1570
+<6093> <6093> 1571
+<6095> <6095> 1572
+<6098> <6098> 1573
+<609d> <609e> 1574
+<60a2> <60a2> 1576
+<60a4> <60a5> 1577
+<60a8> <60a8> 1579
+<60b0> <60b1> 1580
+<60b7> <60b7> 1582
+<60bb> <60bb> 1583
+<60be> <60be> 1584
+<60c2> <60c2> 1585
+<60c4> <60c4> 1586
+<60c8> <60cb> 1587
+<60ce> <60cf> 1591
+<60d4> <60d5> 1593
+<60d9> <60d9> 1595
+<60db> <60db> 1596
+<60dd> <60de> 1597
+<60e2> <60e2> 1599
+<60e5> <60e5> 1600
+<60f2> <60f2> 1601
+<60f5> <60f5> 1602
+<60f8> <60f8> 1603
+<60fc> <60fd> 1604
+<6102> <6102> 1606
+<6107> <6107> 1607
+<610a> <610a> 1608
+<610c> <610c> 1609
+<6110> <6114> 1610
+<6116> <6117> 1615
+<6119> <6119> 1617
+<611c> <611c> 1618
+<611e> <611e> 1619
+<6122> <6122> 1620
+<612a> <612b> 1621
+<6130> <6131> 1623
+<6135> <6137> 1625
+<6139> <6139> 1628
+<6141> <6141> 1629
+<6145> <6146> 1630
+<6149> <6149> 1632
+<615e> <615e> 1633
+<6160> <6160> 1634
+<616c> <616c> 1635
+endcidrange
+
+100 begincidrange
+<6172> <6172> 1636
+<6178> <6178> 1637
+<617b> <617c> 1638
+<617f> <6181> 1640
+<6183> <6184> 1643
+<618b> <618b> 1645
+<618d> <618d> 1646
+<6192> <6193> 1647
+<6197> <6198> 1649
+<619c> <619d> 1651
+<619f> <61a0> 1653
+<61a5> <61a5> 1655
+<61a8> <61a8> 1656
+<61aa> <61aa> 1657
+<61ad> <61ad> 1658
+<61b8> <61b9> 1659
+<61bc> <61bc> 1661
+<61c0> <61c2> 1662
+<61ce> <61cf> 1665
+<61d5> <61d5> 1667
+<61dc> <61df> 1668
+<61e1> <61e2> 1672
+<61e5> <61e5> 1676
+<61e7> <61e7> 1674
+<61e9> <61e9> 1675
+<61ec> <61ed> 1677
+<61ef> <61ef> 1679
+<6201> <6201> 1680
+<6203> <6204> 1681
+<6207> <6207> 1683
+<6213> <6213> 1684
+<6215> <6215> 1685
+<621c> <621c> 1686
+<6220> <6220> 1687
+<6222> <6223> 1688
+<6227> <6227> 1690
+<6229> <6229> 1691
+<622b> <622b> 1692
+<6239> <6239> 1693
+<623d> <623d> 1694
+<6242> <6244> 1695
+<6246> <6246> 1698
+<624c> <624c> 1699
+<6250> <6252> 1700
+<6254> <6254> 1703
+<6256> <6256> 1704
+<625a> <625a> 1705
+<625c> <625c> 1706
+<6264> <6264> 1707
+<626d> <626d> 1708
+<626f> <626f> 1709
+<6273> <6273> 1710
+<627a> <627a> 1711
+<627d> <627d> 1712
+<628d> <6290> 1713
+<62a6> <62a6> 1717
+<62a8> <62a8> 1718
+<62b3> <62b3> 1719
+<62b6> <62b7> 1720
+<62ba> <62ba> 1722
+<62be> <62bf> 1723
+<62c4> <62c4> 1725
+<62ce> <62ce> 1726
+<62d5> <62d6> 1727
+<62da> <62da> 1729
+<62ea> <62ea> 1730
+<62f2> <62f2> 1731
+<62f4> <62f4> 1732
+<62fc> <62fd> 1733
+<6303> <6304> 1735
+<630a> <630b> 1737
+<630d> <630d> 1739
+<6310> <6310> 1740
+<6313> <6313> 1741
+<6316> <6316> 1742
+<6318> <6318> 1743
+<6329> <632a> 1744
+<632d> <632d> 1746
+<6335> <6336> 1747
+<6339> <6339> 1749
+<633c> <633c> 1750
+<6341> <6344> 1751
+<6346> <6346> 1755
+<634a> <634b> 1756
+<634e> <634e> 1758
+<6352> <6354> 1759
+<6358> <6358> 1762
+<635b> <635b> 1763
+<6365> <6366> 1764
+<636c> <636d> 1766
+<6371> <6371> 1768
+<6374> <6375> 1769
+<6378> <6378> 1771
+<637c> <637d> 1772
+<637f> <637f> 1774
+<6382> <6382> 1775
+<6384> <6384> 1776
+<6387> <6387> 1777
+<638a> <638a> 1778
+<6390> <6390> 1779
+endcidrange
+
+100 begincidrange
+<6394> <6395> 1780
+<6399> <639a> 1782
+<639e> <639e> 1784
+<63a4> <63a4> 1785
+<63a6> <63a6> 1786
+<63ad> <63af> 1787
+<63bd> <63bd> 1790
+<63c1> <63c1> 1791
+<63c5> <63c5> 1792
+<63c8> <63c8> 1793
+<63ce> <63ce> 1794
+<63d1> <63d1> 1795
+<63d3> <63d5> 1796
+<63dc> <63dc> 1799
+<63e0> <63e0> 1800
+<63e5> <63e5> 1801
+<63ea> <63ea> 1802
+<63ec> <63ec> 1803
+<63f2> <63f3> 1804
+<63f5> <63f5> 1806
+<63f8> <63f9> 1807
+<6409> <640a> 1809
+<6410> <6410> 1811
+<6412> <6412> 1812
+<6414> <6414> 1813
+<6418> <6418> 1814
+<641e> <641e> 1815
+<6420> <6420> 1816
+<6422> <6422> 1817
+<6424> <6425> 1818
+<6429> <642a> 1820
+<642f> <6430> 1822
+<6435> <6435> 1824
+<643d> <643d> 1825
+<643f> <643f> 1826
+<644b> <644b> 1827
+<644f> <644f> 1828
+<6451> <6454> 1829
+<645a> <645d> 1833
+<645f> <6461> 1837
+<6463> <6463> 1840
+<646d> <646d> 1841
+<6473> <6474> 1842
+<647b> <647b> 1844
+<647d> <647d> 1845
+<6485> <6485> 1846
+<6487> <6487> 1847
+<648f> <6491> 1848
+<6498> <6499> 1851
+<649b> <649b> 1853
+<649d> <649d> 1854
+<649f> <649f> 1855
+<64a1> <64a1> 1856
+<64a3> <64a3> 1857
+<64a6> <64a6> 1858
+<64a8> <64a8> 1859
+<64ac> <64ac> 1860
+<64b3> <64b3> 1861
+<64bd> <64bf> 1862
+<64c4> <64c4> 1865
+<64c9> <64cc> 1866
+<64ce> <64ce> 1870
+<64d0> <64d1> 1871
+<64d5> <64d5> 1873
+<64d7> <64d7> 1874
+<64e4> <64e5> 1875
+<64e9> <64ea> 1877
+<64ed> <64ed> 1879
+<64f0> <64f0> 1880
+<64f5> <64f5> 1881
+<64f7> <64f7> 1882
+<64fb> <64fb> 1883
+<64ff> <64ff> 1884
+<6501> <6501> 1885
+<6504> <6504> 1886
+<6508> <650a> 1887
+<650f> <650f> 1890
+<6513> <6514> 1891
+<6516> <6516> 1893
+<6519> <6519> 1894
+<651b> <651b> 1895
+<651e> <651f> 1896
+<6522> <6522> 1898
+<6526> <6526> 1899
+<6529> <6529> 1900
+<652e> <652e> 1901
+<6531> <6531> 1902
+<653a> <653a> 1903
+<653c> <653d> 1904
+<6543> <6543> 1906
+<6547> <6547> 1907
+<6549> <6549> 1908
+<6550> <6550> 1909
+<6552> <6552> 1910
+<6554> <6554> 1911
+<655f> <6560> 1912
+<6567> <6567> 1914
+<656b> <656b> 1915
+<657a> <657a> 1916
+<657d> <657d> 1917
+endcidrange
+
+100 begincidrange
+<6581> <6581> 1918
+<6585> <6585> 1919
+<658a> <658a> 1920
+<6592> <6592> 1921
+<6595> <6595> 1922
+<6598> <6598> 1923
+<659d> <659d> 1924
+<65a0> <65a0> 1925
+<65a3> <65a3> 1926
+<65a6> <65a6> 1927
+<65ae> <65ae> 1928
+<65b2> <65b4> 1929
+<65bf> <65bf> 1932
+<65c2> <65c2> 1933
+<65c8> <65c9> 1934
+<65ce> <65ce> 1936
+<65d0> <65d0> 1937
+<65d4> <65d4> 1938
+<65d6> <65d6> 1939
+<65d8> <65d8> 1940
+<65df> <65df> 1941
+<65f0> <65f0> 1942
+<65f2> <65f2> 1943
+<65f4> <65f5> 1944
+<65f9> <65f9> 1946
+<65fe> <65ff> 1947
+<6600> <6600> 1949
+<6604> <6604> 1950
+<6608> <6609> 1951
+<660d> <660d> 1953
+<6611> <6612> 1954
+<6615> <6616> 1956
+<661d> <661e> 1958
+<6621> <6624> 1960
+<6626> <6626> 1964
+<6629> <662c> 1965
+<662e> <662e> 1969
+<6630> <6631> 1970
+<6633> <6633> 1972
+<6637> <6637> 1974
+<6639> <6639> 1973
+<6640> <6640> 1975
+<6645> <6646> 1976
+<664a> <664a> 1978
+<664c> <664c> 1979
+<664e> <664e> 1981
+<6651> <6651> 1980
+<6657> <6659> 1982
+<665b> <665c> 1985
+<6660> <6661> 1987
+<666a> <666c> 1990
+<6673> <6673> 1994
+<6675> <6675> 1995
+<6677> <6679> 1997
+<667b> <667b> 2000
+<667c> <667c> 2002
+<667e> <667e> 1993
+<667f> <667f> 1996
+<6680> <6680> 2001
+<668b> <668d> 2003
+<6690> <6690> 2006
+<6692> <6692> 2007
+<6699> <669c> 2008
+<669f> <66a0> 2012
+<66a4> <66a4> 2014
+<66ad> <66ad> 2015
+<66b1> <66b2> 2016
+<66b5> <66b5> 2018
+<66bb> <66bb> 2019
+<66bf> <66c0> 2020
+<66c2> <66c3> 2022
+<66c8> <66c8> 2024
+<66cc> <66cc> 2025
+<66ce> <66cf> 2026
+<66d4> <66d4> 2028
+<66db> <66db> 2029
+<66df> <66df> 2030
+<66e8> <66e8> 2031
+<66eb> <66ec> 2032
+<66ee> <66ee> 2034
+<66fa> <66fa> 2035
+<66fb> <66fb> 1989
+<6705> <6705> 2036
+<6707> <6707> 2037
+<670e> <670e> 2038
+<6713> <6713> 2039
+<6719> <6719> 2040
+<671c> <671c> 2041
+<6720> <6720> 2042
+<6722> <6722> 2043
+<6733> <6733> 2044
+<673e> <673e> 2045
+<6745> <6745> 2046
+<6747> <6748> 2047
+<674c> <674c> 2049
+<6754> <6755> 2050
+<675d> <675d> 2052
+<6766> <6766> 2053
+<676c> <676c> 2054
+<676e> <676e> 2055
+endcidrange
+
+100 begincidrange
+<6774> <6774> 2056
+<6776> <6776> 2057
+<677b> <677b> 2058
+<6781> <6781> 2059
+<6784> <6784> 2060
+<678e> <678f> 2061
+<6791> <6791> 2063
+<6793> <6793> 2064
+<6796> <6796> 2065
+<6798> <6799> 2066
+<679b> <679b> 2068
+<67b0> <67b2> 2069
+<67b5> <67b5> 2072
+<67bb> <67bd> 2073
+<67c0> <67c0> 2077
+<67c2> <67c3> 2078
+<67c5> <67c5> 2080
+<67c8> <67c9> 2081
+<67d2> <67d2> 2083
+<67d7> <67d7> 2084
+<67d9> <67d9> 2085
+<67dc> <67dc> 2086
+<67e1> <67e1> 2087
+<67e6> <67e6> 2088
+<67f0> <67f0> 2089
+<67f2> <67f2> 2090
+<67f6> <67f7> 2091
+<67f9> <67f9> 2076
+<6814> <6814> 2094
+<6819> <6819> 2095
+<681d> <681d> 2096
+<681f> <681f> 2097
+<6827> <6827> 2099
+<6828> <6828> 2098
+<682c> <682d> 2100
+<682f> <6831> 2102
+<6833> <6833> 2105
+<683b> <683b> 2106
+<683f> <683f> 2107
+<6844> <6845> 2108
+<684a> <684a> 2110
+<684c> <684c> 2111
+<6852> <6852> 2093
+<6855> <6855> 2112
+<6857> <6858> 2113
+<685b> <685b> 2115
+<686b> <686b> 2116
+<686e> <6872> 2117
+<6875> <6875> 2122
+<6879> <687c> 2123
+<6882> <6882> 2127
+<6884> <6884> 2128
+<6886> <6886> 2129
+<6888> <6888> 2130
+<6896> <6896> 2131
+<6898> <6898> 2132
+<689a> <689a> 2133
+<689c> <689c> 2134
+<68a1> <68a1> 2135
+<68a3> <68a3> 2136
+<68a5> <68a5> 2137
+<68a9> <68aa> 2138
+<68ae> <68ae> 2140
+<68b2> <68b2> 2141
+<68bb> <68bb> 2142
+<68c5> <68c5> 2143
+<68c8> <68c8> 2144
+<68cc> <68cc> 2145
+<68cf> <68d1> 2146
+<68d3> <68d3> 2149
+<68d6> <68d6> 2150
+<68d9> <68d9> 2151
+<68dc> <68dd> 2152
+<68e5> <68e5> 2154
+<68e8> <68e8> 2155
+<68ea> <68ed> 2156
+<68f0> <68f1> 2160
+<68f5> <68f6> 2162
+<68fb> <68fd> 2164
+<6906> <6906> 2167
+<6909> <690a> 2168
+<6910> <6911> 2170
+<6913> <6913> 2172
+<6916> <6917> 2173
+<6931> <6931> 2175
+<6933> <6933> 2176
+<6935> <6935> 2177
+<6938> <6938> 2178
+<693b> <693b> 2179
+<6942> <6942> 2180
+<6945> <6945> 2181
+<6949> <6949> 2182
+<694e> <694e> 2183
+<6957> <6957> 2184
+<695b> <695b> 2185
+<6963> <6966> 2186
+<6968> <6969> 2190
+<696c> <696c> 2192
+<6970> <6972> 2193
+<697a> <697b> 2196
+endcidrange
+
+100 begincidrange
+<697f> <6980> 2198
+<698d> <698d> 2200
+<6992> <6992> 2201
+<6996> <6996> 2202
+<6998> <6998> 2203
+<69a1> <69a1> 2204
+<69a5> <69a6> 2205
+<69a8> <69a8> 2207
+<69ab> <69ab> 2208
+<69ad> <69ad> 2209
+<69af> <69af> 2210
+<69b7> <69b8> 2211
+<69ba> <69ba> 2213
+<69bc> <69bc> 2214
+<69c5> <69c5> 2215
+<69c8> <69c8> 2216
+<69d1> <69d1> 2217
+<69d6> <69d7> 2218
+<69e2> <69e2> 2220
+<69e5> <69e5> 2221
+<69ee> <69ef> 2222
+<69f1> <69f1> 2224
+<69f3> <69f3> 2225
+<69f5> <69f5> 2226
+<69fe> <69fe> 2227
+<6a00> <6a01> 2228
+<6a03> <6a03> 2230
+<6a0f> <6a0f> 2231
+<6a11> <6a11> 2232
+<6a15> <6a15> 2233
+<6a1a> <6a1a> 2234
+<6a1d> <6a1d> 2235
+<6a20> <6a20> 2236
+<6a24> <6a24> 2237
+<6a28> <6a28> 2238
+<6a30> <6a30> 2239
+<6a32> <6a32> 2240
+<6a34> <6a34> 2241
+<6a37> <6a37> 2242
+<6a3b> <6a3b> 2243
+<6a3e> <6a3f> 2244
+<6a45> <6a46> 2246
+<6a49> <6a4a> 2248
+<6a4e> <6a4e> 2250
+<6a50> <6a52> 2251
+<6a55> <6a56> 2254
+<6a5b> <6a5b> 2256
+<6a64> <6a64> 2257
+<6a67> <6a67> 2258
+<6a6a> <6a6a> 2259
+<6a71> <6a71> 2260
+<6a73> <6a73> 2261
+<6a7e> <6a7e> 2262
+<6a81> <6a81> 2263
+<6a83> <6a83> 2264
+<6a86> <6a87> 2265
+<6a89> <6a89> 2267
+<6a8b> <6a8b> 2268
+<6a91> <6a91> 2269
+<6a9b> <6a9b> 2270
+<6a9d> <6a9f> 2271
+<6aa5> <6aa5> 2274
+<6aab> <6aab> 2275
+<6aaf> <6ab1> 2276
+<6ab4> <6ab4> 2279
+<6abd> <6abf> 2280
+<6ac6> <6ac6> 2283
+<6ac8> <6ac8> 2285
+<6ac9> <6ac9> 2284
+<6acc> <6acc> 2286
+<6ad0> <6ad0> 2287
+<6ad4> <6ad6> 2288
+<6adc> <6add> 2291
+<6ae4> <6ae4> 2293
+<6ae7> <6ae7> 2294
+<6aec> <6aec> 2295
+<6af0> <6af2> 2296
+<6afc> <6afd> 2299
+<6b02> <6b03> 2301
+<6b06> <6b07> 2303
+<6b09> <6b09> 2305
+<6b0f> <6b11> 2306
+<6b17> <6b17> 2309
+<6b1b> <6b1b> 2310
+<6b1e> <6b1e> 2311
+<6b24> <6b24> 2312
+<6b28> <6b28> 2313
+<6b2b> <6b2c> 2314
+<6b2f> <6b2f> 2316
+<6b35> <6b36> 2317
+<6b3b> <6b3b> 2319
+<6b3f> <6b3f> 2320
+<6b46> <6b46> 2321
+<6b4a> <6b4a> 2322
+<6b4d> <6b4d> 2323
+<6b52> <6b52> 2324
+<6b56> <6b56> 2325
+<6b58> <6b58> 2326
+<6b5d> <6b5d> 2327
+<6b60> <6b60> 2328
+endcidrange
+
+100 begincidrange
+<6b67> <6b67> 2329
+<6b6b> <6b6b> 2330
+<6b6e> <6b6e> 2331
+<6b70> <6b70> 2332
+<6b75> <6b75> 2333
+<6b7d> <6b7e> 2334
+<6b82> <6b82> 2336
+<6b85> <6b85> 2337
+<6b97> <6b97> 2338
+<6b9b> <6b9b> 2339
+<6b9f> <6ba0> 2340
+<6ba2> <6ba3> 2342
+<6ba8> <6ba9> 2344
+<6bac> <6bae> 2346
+<6bb0> <6bb0> 2349
+<6bb8> <6bb9> 2350
+<6bbd> <6bbe> 2352
+<6bc3> <6bc4> 2354
+<6bc9> <6bc9> 2356
+<6bcc> <6bcc> 2357
+<6bd6> <6bd6> 2358
+<6bda> <6bda> 2359
+<6be1> <6be1> 2360
+<6be3> <6be3> 2361
+<6be6> <6be7> 2362
+<6bee> <6bee> 2364
+<6bf1> <6bf1> 2365
+<6bf7> <6bf7> 2366
+<6bf9> <6bf9> 2367
+<6bff> <6bff> 2368
+<6c02> <6c02> 2369
+<6c04> <6c05> 2370
+<6c09> <6c09> 2372
+<6c0d> <6c0e> 2373
+<6c10> <6c10> 2375
+<6c12> <6c12> 2376
+<6c19> <6c19> 2377
+<6c1f> <6c1f> 2378
+<6c26> <6c28> 2379
+<6c2c> <6c2c> 2382
+<6c2e> <6c2e> 2383
+<6c33> <6c33> 2384
+<6c35> <6c36> 2385
+<6c3a> <6c3b> 2387
+<6c3f> <6c3f> 2389
+<6c4a> <6c4b> 2390
+<6c4d> <6c4d> 2392
+<6c4f> <6c4f> 2393
+<6c52> <6c52> 2394
+<6c54> <6c54> 2395
+<6c59> <6c59> 2396
+<6c5b> <6c5c> 2397
+<6c67> <6c67> 2450
+<6c6b> <6c6b> 2399
+<6c6d> <6c6d> 2400
+<6c6f> <6c6f> 2401
+<6c74> <6c74> 2402
+<6c76> <6c76> 2403
+<6c78> <6c79> 2404
+<6c7b> <6c7b> 2406
+<6c85> <6c87> 2407
+<6c89> <6c89> 2410
+<6c94> <6c95> 2411
+<6c97> <6c98> 2413
+<6c9c> <6c9c> 2415
+<6c9f> <6c9f> 2416
+<6cb0> <6cb0> 2417
+<6cb2> <6cb2> 2418
+<6cb4> <6cb4> 2419
+<6cc2> <6cc2> 2420
+<6cc6> <6cc6> 2421
+<6ccd> <6ccd> 2422
+<6ccf> <6cd2> 2423
+<6cd4> <6cd4> 2427
+<6cd6> <6cd6> 2428
+<6cda> <6cda> 2429
+<6cdc> <6cdc> 2430
+<6ce0> <6ce0> 2431
+<6ce7> <6ce7> 2432
+<6ce9> <6ce9> 2433
+<6ceb> <6cec> 2434
+<6cee> <6cee> 2436
+<6cf2> <6cf2> 2437
+<6cf4> <6cf4> 2438
+<6d04> <6d04> 2439
+<6d07> <6d07> 2440
+<6d0a> <6d0a> 2441
+<6d0e> <6d0f> 2442
+<6d11> <6d11> 2444
+<6d13> <6d13> 2445
+<6d1a> <6d1a> 2446
+<6d26> <6d28> 2447
+<6d2e> <6d2f> 2451
+<6d31> <6d31> 2453
+<6d39> <6d39> 2454
+<6d3c> <6d3c> 2455
+<6d3f> <6d3f> 2456
+<6d57> <6d57> 2457
+<6d5e> <6d5f> 2458
+<6d61> <6d61> 2460
+endcidrange
+
+100 begincidrange
+<6d65> <6d65> 2461
+<6d67> <6d67> 2462
+<6d6f> <6d70> 2463
+<6d7c> <6d7c> 2465
+<6d82> <6d82> 2466
+<6d87> <6d87> 2467
+<6d91> <6d92> 2468
+<6d94> <6d94> 2470
+<6d96> <6d98> 2471
+<6daa> <6daa> 2474
+<6dac> <6dac> 2475
+<6db4> <6db4> 2476
+<6db7> <6db7> 2477
+<6db9> <6db9> 2478
+<6dbd> <6dbd> 2479
+<6dbf> <6dbf> 2480
+<6dc4> <6dc4> 2481
+<6dc8> <6dc8> 2482
+<6dca> <6dca> 2483
+<6dce> <6dcf> 2484
+<6dd6> <6dd6> 2486
+<6ddb> <6ddb> 2487
+<6ddd> <6ddd> 2488
+<6ddf> <6de0> 2489
+<6de2> <6de2> 2491
+<6de5> <6de5> 2492
+<6de9> <6de9> 2493
+<6def> <6df0> 2494
+<6df4> <6df4> 2496
+<6df6> <6df6> 2497
+<6dfc> <6dfc> 2498
+<6e00> <6e00> 2499
+<6e04> <6e04> 2500
+<6e1e> <6e1e> 2501
+<6e22> <6e22> 2502
+<6e27> <6e27> 2503
+<6e32> <6e32> 2504
+<6e36> <6e36> 2505
+<6e39> <6e39> 2506
+<6e3b> <6e3c> 2507
+<6e44> <6e45> 2509
+<6e48> <6e49> 2511
+<6e4b> <6e4b> 2513
+<6e4f> <6e4f> 2514
+<6e51> <6e54> 2515
+<6e57> <6e57> 2519
+<6e5c> <6e5e> 2520
+<6e62> <6e63> 2523
+<6e68> <6e68> 2525
+<6e73> <6e73> 2526
+<6e7b> <6e7b> 2527
+<6e7d> <6e7d> 2528
+<6e8d> <6e8d> 2529
+<6e93> <6e93> 2530
+<6e99> <6e99> 2531
+<6ea0> <6ea0> 2532
+<6ea7> <6ea7> 2533
+<6ead> <6eae> 2534
+<6eb1> <6eb1> 2536
+<6eb3> <6eb3> 2537
+<6ebb> <6ebb> 2538
+<6ebf> <6ec1> 2539
+<6ec3> <6ec3> 2542
+<6ec7> <6ec8> 2543
+<6eca> <6eca> 2545
+<6ecd> <6ecf> 2546
+<6eeb> <6eeb> 2549
+<6eed> <6eee> 2550
+<6ef9> <6ef9> 2552
+<6efb> <6efb> 2553
+<6efd> <6efd> 2554
+<6f04> <6f04> 2555
+<6f08> <6f08> 2556
+<6f0a> <6f0a> 2557
+<6f0c> <6f0d> 2558
+<6f16> <6f16> 2560
+<6f18> <6f18> 2561
+<6f1a> <6f1b> 2562
+<6f26> <6f26> 2564
+<6f29> <6f2a> 2565
+<6f2d> <6f2d> 2573
+<6f2f> <6f30> 2567
+<6f33> <6f33> 2569
+<6f36> <6f36> 2570
+<6f3b> <6f3c> 2571
+<6f4f> <6f4f> 2574
+<6f51> <6f53> 2575
+<6f57> <6f57> 2578
+<6f59> <6f5a> 2579
+<6f5d> <6f5e> 2581
+<6f61> <6f62> 2583
+<6f68> <6f68> 2585
+<6f6c> <6f6c> 2586
+<6f7d> <6f7e> 2587
+<6f83> <6f83> 2589
+<6f87> <6f88> 2590
+<6f8b> <6f8d> 2592
+<6f90> <6f90> 2595
+<6f92> <6f94> 2596
+<6f96> <6f96> 2599
+endcidrange
+
+100 begincidrange
+<6f9a> <6f9a> 2600
+<6f9f> <6fa0> 2601
+<6fa5> <6fa8> 2603
+<6fae> <6fb0> 2607
+<6fb5> <6fb6> 2610
+<6fbc> <6fbc> 2612
+<6fc5> <6fc5> 2613
+<6fc7> <6fc8> 2614
+<6fca> <6fca> 2616
+<6fda> <6fda> 2617
+<6fde> <6fde> 2618
+<6fe8> <6fe9> 2619
+<6ff0> <6ff0> 2621
+<6ff5> <6ff5> 2622
+<6ff9> <6ff9> 2623
+<6ffc> <6ffd> 2624
+<7000> <7000> 2626
+<7005> <7007> 2627
+<700d> <700d> 2630
+<7017> <7017> 2631
+<7020> <7020> 2632
+<7023> <7023> 2633
+<702f> <702f> 2634
+<7034> <7034> 2635
+<7037> <7037> 2636
+<7039> <7039> 2637
+<703c> <703c> 2638
+<7043> <7044> 2639
+<7048> <704b> 2641
+<704e> <704e> 2649
+<7054> <7055> 2645
+<705d> <705e> 2647
+<7064> <7065> 2650
+<706c> <706c> 2652
+<706e> <706e> 2653
+<7075> <7076> 2654
+<707e> <707e> 2656
+<7081> <7081> 2657
+<7085> <7086> 2658
+<7094> <7098> 2660
+<709b> <709b> 2665
+<70a4> <70a4> 2666
+<70ab> <70ab> 2667
+<70b0> <70b1> 2668
+<70b4> <70b4> 2670
+<70b7> <70b7> 2671
+<70ca> <70ca> 2672
+<70d1> <70d1> 2673
+<70d3> <70d6> 2674
+<70d8> <70d8> 2678
+<70dc> <70dc> 2679
+<70e4> <70e4> 2680
+<70fa> <70fa> 2681
+<7103> <7107> 2682
+<710b> <710c> 2687
+<710f> <710f> 2689
+<711e> <711e> 2690
+<7120> <7120> 2691
+<712b> <712b> 2692
+<712d> <712d> 2693
+<712f> <7131> 2694
+<7138> <7138> 2697
+<7141> <7141> 2698
+<7145> <7147> 2699
+<714a> <714b> 2702
+<7150> <7150> 2704
+<7152> <7152> 2705
+<7157> <7157> 2706
+<715a> <715a> 2707
+<715c> <715c> 2708
+<715e> <715e> 2709
+<7160> <7160> 2710
+<7168> <7168> 2711
+<7179> <7179> 2712
+<7180> <7180> 2713
+<7185> <7185> 2714
+<7187> <7187> 2715
+<718c> <718c> 2716
+<7192> <7192> 2717
+<719a> <719b> 2718
+<71a0> <71a0> 2720
+<71a2> <71a2> 2721
+<71af> <71b0> 2722
+<71b2> <71b3> 2724
+<71ba> <71ba> 2726
+<71bf> <71c1> 2727
+<71c4> <71c4> 2730
+<71cb> <71cc> 2731
+<71d3> <71d3> 2733
+<71d6> <71d6> 2734
+<71d9> <71da> 2735
+<71dc> <71dc> 2737
+<71f8> <71f8> 2738
+<71fe> <71fe> 2739
+<7200> <7200> 2740
+<7207> <7209> 2741
+<7213> <7213> 2744
+<7217> <7217> 2745
+<721a> <721a> 2746
+<721d> <721d> 2747
+endcidrange
+
+100 begincidrange
+<721f> <721f> 2748
+<7224> <7224> 2749
+<722b> <722b> 2750
+<722f> <722f> 2751
+<7234> <7234> 2752
+<7238> <7239> 2753
+<7241> <7243> 2755
+<7245> <7245> 2758
+<724e> <7250> 2759
+<7253> <7253> 2762
+<7255> <7256> 2763
+<725a> <725a> 2765
+<725c> <725c> 2766
+<725e> <725e> 2767
+<7260> <7260> 2768
+<7263> <7263> 2769
+<7268> <7268> 2770
+<726b> <726b> 2771
+<726e> <726f> 2772
+<7271> <7271> 2774
+<7277> <7278> 2775
+<727b> <727c> 2777
+<727f> <727f> 2779
+<7284> <7284> 2780
+<7289> <7289> 2781
+<728d> <728e> 2782
+<7293> <7293> 2784
+<729b> <729b> 2785
+<72a8> <72a8> 2786
+<72ad> <72ae> 2787
+<72b1> <72b1> 2789
+<72b4> <72b4> 2790
+<72be> <72be> 2791
+<72c1> <72c1> 2792
+<72c7> <72c7> 2793
+<72c9> <72c9> 2794
+<72cc> <72cc> 2795
+<72d5> <72d6> 2796
+<72d8> <72d8> 2798
+<72df> <72df> 2799
+<72e5> <72e5> 2800
+<72f3> <72f4> 2801
+<72fa> <72fb> 2803
+<72fe> <72fe> 2805
+<7302> <7302> 2806
+<7304> <7305> 2807
+<7307> <7307> 2809
+<730b> <730b> 2810
+<730d> <730d> 2811
+<7312> <7313> 2812
+<7318> <7319> 2814
+<731e> <731e> 2816
+<7322> <7322> 2817
+<7324> <7324> 2818
+<7327> <7328> 2819
+<732c> <732c> 2821
+<7331> <7332> 2822
+<7335> <7335> 2824
+<733a> <733b> 2825
+<733d> <733d> 2827
+<7343> <7343> 2828
+<734d> <734d> 2829
+<7350> <7350> 2830
+<7352> <7352> 2831
+<7356> <7356> 2832
+<7358> <7358> 2833
+<735d> <7360> 2834
+<7366> <7367> 2838
+<7369> <7369> 2840
+<736b> <736c> 2841
+<736e> <736f> 2843
+<7371> <7371> 2845
+<7377> <7377> 2846
+<7379> <7379> 2847
+<737c> <737c> 2848
+<7380> <7381> 2849
+<7383> <7383> 2851
+<7385> <7386> 2852
+<738e> <738e> 2854
+<7390> <7390> 2855
+<7393> <7393> 2856
+<7395> <7395> 2857
+<7397> <7398> 2858
+<739c> <739c> 2860
+<739e> <73a0> 2861
+<73a2> <73a2> 2864
+<73a5> <73a6> 2865
+<73aa> <73ab> 2867
+<73ad> <73ad> 2869
+<73b5> <73b5> 2870
+<73b7> <73b7> 2871
+<73b9> <73b9> 2872
+<73bc> <73bd> 2873
+<73bf> <73bf> 2875
+<73c5> <73c6> 2876
+<73c9> <73c9> 2878
+<73cb> <73cc> 2879
+<73cf> <73cf> 2881
+<73d2> <73d3> 2882
+<73d6> <73d6> 2884
+endcidrange
+
+100 begincidrange
+<73d9> <73d9> 2885
+<73dd> <73dd> 2886
+<73e1> <73e1> 2887
+<73e3> <73e3> 2888
+<73e6> <73e7> 2889
+<73e9> <73e9> 2891
+<73f4> <73f5> 2892
+<73f7> <73f7> 2894
+<73f9> <73fb> 2895
+<73fd> <73fd> 2898
+<73ff> <73ff> 2899
+<7400> <7401> 2900
+<7404> <7404> 2902
+<7407> <7407> 2903
+<740a> <740a> 2904
+<7411> <7411> 2905
+<741a> <741b> 2906
+<7424> <7424> 2908
+<7426> <7426> 2909
+<7428> <7431> 2910
+<7439> <7439> 2920
+<7440> <7440> 2921
+<7443> <7444> 2922
+<7446> <7447> 2924
+<744b> <744b> 2926
+<744d> <744d> 2927
+<7451> <7452> 2928
+<7457> <7457> 2930
+<745d> <745d> 2931
+<7462> <7462> 2932
+<7466> <7468> 2933
+<746b> <746b> 2936
+<746d> <746e> 2937
+<7471> <7472> 2939
+<7480> <7481> 2941
+<7485> <7487> 2943
+<7489> <7489> 2946
+<748f> <7492> 2947
+<7498> <749a> 2951
+<749c> <749c> 2954
+<749f> <74a1> 2955
+<74a3> <74a3> 2958
+<74a6> <74a6> 2959
+<74a8> <74ab> 2960
+<74ae> <74af> 2964
+<74b1> <74b2> 2966
+<74b5> <74b5> 2968
+<74b9> <74b9> 2969
+<74bb> <74bb> 2970
+<74bf> <74bf> 2971
+<74c8> <74c9> 2972
+<74cc> <74cc> 2974
+<74d0> <74d0> 2975
+<74d3> <74d3> 2976
+<74d8> <74d8> 2977
+<74da> <74db> 2978
+<74de> <74df> 2980
+<74e4> <74e4> 2982
+<74e8> <74e8> 2983
+<74ea> <74eb> 2984
+<74ef> <74ef> 2986
+<74f4> <74f4> 2987
+<74fa> <74fc> 2988
+<74ff> <74ff> 2991
+<7506> <7506> 2992
+<7512> <7512> 2993
+<7516> <7517> 2994
+<7520> <7521> 2996
+<7524> <7524> 2998
+<7527> <7527> 2999
+<7529> <752a> 3000
+<752f> <752f> 3002
+<7536> <7536> 3003
+<7539> <7539> 3004
+<753d> <7540> 3005
+<7543> <7543> 3009
+<7547> <7548> 3010
+<754e> <754e> 3012
+<7550> <7550> 3013
+<7552> <7552> 3014
+<7557> <7557> 3015
+<755e> <755f> 3016
+<7561> <7561> 3018
+<756f> <756f> 3019
+<7571> <7571> 3020
+<7579> <757e> 3021
+<7581> <7581> 3027
+<7585> <7585> 3028
+<7590> <7590> 3029
+<7592> <7593> 3030
+<7595> <7595> 3032
+<7599> <7599> 3033
+<759c> <759c> 3034
+<75a2> <75a2> 3035
+<75a4> <75a4> 3036
+<75b4> <75b4> 3037
+<75ba> <75ba> 3038
+<75bf> <75c1> 3039
+<75c4> <75c4> 3042
+<75c6> <75c6> 3043
+endcidrange
+
+100 begincidrange
+<75cc> <75cc> 3044
+<75ce> <75cf> 3045
+<75d7> <75d7> 3047
+<75dc> <75dc> 3048
+<75df> <75e1> 3049
+<75e4> <75e4> 3052
+<75e7> <75e7> 3053
+<75ec> <75ec> 3054
+<75ee> <75ef> 3055
+<75f1> <75f1> 3057
+<75f9> <75f9> 3058
+<7600> <7600> 3059
+<7602> <7604> 3060
+<7607> <7608> 3063
+<760a> <760a> 3065
+<760c> <760c> 3066
+<760f> <760f> 3067
+<7612> <7613> 3068
+<7615> <7616> 3070
+<7619> <7619> 3072
+<761b> <761e> 3073
+<7623> <7623> 3077
+<7625> <7626> 3078
+<7629> <7629> 3080
+<762d> <762d> 3081
+<7632> <7633> 3082
+<7635> <7635> 3084
+<7638> <763a> 3085
+<763c> <763c> 3088
+<7640> <7641> 3090
+<7643> <7645> 3092
+<7649> <7649> 3095
+<764a> <764a> 3089
+<764b> <764b> 3096
+<7655> <7655> 3097
+<7659> <7659> 3098
+<765f> <765f> 3099
+<7664> <7665> 3100
+<766d> <766f> 3102
+<7671> <7671> 3105
+<7674> <7674> 3106
+<7681> <7681> 3107
+<7685> <7685> 3108
+<768c> <768d> 3109
+<7695> <7695> 3111
+<769b> <769d> 3112
+<769f> <76a0> 3115
+<76a2> <76a8> 3117
+<76aa> <76aa> 3124
+<76ad> <76ad> 3125
+<76bd> <76bd> 3126
+<76c1> <76c1> 3127
+<76c5> <76c5> 3128
+<76c9> <76c9> 3129
+<76cb> <76cc> 3130
+<76ce> <76ce> 3132
+<76d4> <76d4> 3133
+<76d9> <76d9> 3134
+<76e0> <76e0> 3135
+<76e6> <76e6> 3136
+<76e8> <76e8> 3137
+<76ec> <76ec> 3138
+<76f0> <76f1> 3139
+<76f6> <76f6> 3141
+<76f9> <76f9> 3142
+<76fc> <76fc> 3143
+<7700> <7700> 3144
+<7706> <7706> 3145
+<770a> <770a> 3146
+<770e> <770e> 3147
+<7712> <7712> 3148
+<7714> <7715> 3149
+<7717> <7717> 3151
+<7719> <771a> 3152
+<771c> <771c> 3154
+<7722> <7722> 3155
+<7728> <7728> 3156
+<772d> <772f> 3157
+<7734> <7736> 3160
+<7739> <7739> 3163
+<773d> <773e> 3164
+<7742> <7742> 3166
+<7745> <7746> 3167
+<774a> <774a> 3169
+<774d> <774f> 3170
+<7752> <7752> 3173
+<7756> <7757> 3174
+<775c> <775c> 3176
+<775e> <7760> 3177
+<7762> <7762> 3180
+<7764> <7764> 3181
+<7767> <7767> 3182
+<776a> <776a> 3183
+<776c> <776c> 3184
+<7770> <7770> 3185
+<7772> <7774> 3186
+<777a> <777a> 3189
+<777d> <777d> 3190
+<7780> <7780> 3191
+<7784> <7784> 3192
+endcidrange
+
+100 begincidrange
+<778c> <778d> 3193
+<7794> <7796> 3195
+<779a> <779a> 3198
+<779f> <779f> 3199
+<77a2> <77a2> 3200
+<77a7> <77a7> 3201
+<77aa> <77aa> 3202
+<77ae> <77af> 3203
+<77b1> <77b1> 3205
+<77b5> <77b5> 3206
+<77be> <77be> 3207
+<77c3> <77c3> 3208
+<77c9> <77c9> 3209
+<77d1> <77d2> 3210
+<77d5> <77d5> 3212
+<77d9> <77d9> 3213
+<77de> <77e0> 3214
+<77e4> <77e4> 3217
+<77e6> <77e6> 3218
+<77ea> <77ea> 3219
+<77ec> <77ec> 3220
+<77f0> <77f1> 3221
+<77f4> <77f4> 3223
+<77f8> <77f8> 3224
+<77fb> <77fb> 3225
+<7805> <7806> 3226
+<7809> <7809> 3228
+<780d> <780e> 3229
+<7811> <7811> 3231
+<781d> <781d> 3232
+<7821> <7823> 3233
+<782d> <782e> 3236
+<7830> <7830> 3238
+<7835> <7835> 3239
+<7837> <7837> 3240
+<7843> <7844> 3241
+<7847> <7848> 3243
+<784c> <784c> 3245
+<784e> <784e> 3246
+<7852> <7852> 3247
+<785c> <785c> 3248
+<785e> <785e> 3249
+<7860> <7861> 3250
+<7863> <7864> 3252
+<7868> <7868> 3254
+<786a> <786a> 3255
+<786e> <786e> 3256
+<787a> <787a> 3257
+<787e> <787e> 3258
+<788a> <788a> 3259
+<788f> <788f> 3260
+<7894> <7894> 3261
+<7898> <7898> 3262
+<789d> <789f> 3264
+<78a1> <78a1> 3263
+<78a4> <78a4> 3267
+<78a8> <78a8> 3268
+<78ac> <78ad> 3269
+<78b0> <78b3> 3271
+<78bb> <78bb> 3275
+<78bd> <78bd> 3276
+<78bf> <78bf> 3277
+<78c7> <78c9> 3278
+<78cc> <78cc> 3281
+<78ce> <78ce> 3282
+<78d2> <78d3> 3283
+<78d5> <78d6> 3285
+<78db> <78db> 3288
+<78df> <78e1> 3289
+<78e4> <78e4> 3287
+<78e6> <78e6> 3292
+<78ea> <78ea> 3293
+<78f2> <78f3> 3294
+<78f6> <78f7> 3297
+<78fa> <78fb> 3299
+<78ff> <78ff> 3301
+<7900> <7900> 3296
+<7906> <7906> 3302
+<790c> <790c> 3303
+<7910> <7910> 3304
+<791a> <791a> 3305
+<791c> <791c> 3306
+<791e> <7920> 3307
+<7925> <7925> 3310
+<7927> <7927> 3311
+<7929> <7929> 3312
+<792d> <792d> 3313
+<7931> <7931> 3314
+<7934> <7935> 3315
+<793b> <793b> 3317
+<793d> <793d> 3318
+<793f> <793f> 3319
+<7944> <7946> 3320
+<794a> <794b> 3323
+<794f> <794f> 3325
+<7951> <7951> 3326
+<7954> <7954> 3327
+<7958> <7958> 3328
+<795b> <795c> 3329
+<7967> <7967> 3331
+endcidrange
+
+100 begincidrange
+<7969> <7969> 3332
+<796b> <796b> 3333
+<7972> <7972> 3334
+<7979> <7979> 3335
+<797b> <797c> 3336
+<797e> <797e> 3338
+<798b> <798c> 3339
+<7991> <7991> 3341
+<7993> <7996> 3342
+<7998> <7998> 3346
+<799b> <799c> 3347
+<79a1> <79a1> 3349
+<79a8> <79a9> 3350
+<79ab> <79ab> 3352
+<79af> <79af> 3353
+<79b1> <79b1> 3354
+<79b4> <79b4> 3355
+<79b8> <79b8> 3356
+<79bb> <79bb> 3357
+<79c2> <79c2> 3358
+<79c4> <79c4> 3359
+<79c7> <79c8> 3360
+<79ca> <79ca> 3362
+<79cf> <79cf> 3363
+<79d4> <79d4> 3364
+<79d6> <79d6> 3365
+<79da> <79da> 3366
+<79dd> <79de> 3367
+<79e0> <79e0> 3369
+<79e2> <79e2> 3370
+<79e5> <79e5> 3371
+<79ea> <79eb> 3372
+<79ed> <79ed> 3374
+<79f1> <79f1> 3375
+<79f8> <79f8> 3376
+<79fc> <79fc> 3377
+<7a02> <7a03> 3378
+<7a07> <7a07> 3380
+<7a09> <7a0a> 3381
+<7a0c> <7a0c> 3383
+<7a11> <7a11> 3384
+<7a15> <7a15> 3385
+<7a1b> <7a1b> 3386
+<7a1e> <7a1e> 3387
+<7a21> <7a21> 3388
+<7a27> <7a27> 3389
+<7a2b> <7a2b> 3390
+<7a2d> <7a2d> 3391
+<7a2f> <7a30> 3392
+<7a34> <7a35> 3394
+<7a38> <7a3a> 3396
+<7a44> <7a45> 3399
+<7a47> <7a48> 3401
+<7a4c> <7a4c> 3403
+<7a55> <7a56> 3404
+<7a59> <7a59> 3406
+<7a5c> <7a5d> 3407
+<7a5f> <7a60> 3409
+<7a65> <7a65> 3411
+<7a67> <7a67> 3412
+<7a6a> <7a6a> 3413
+<7a6d> <7a6d> 3414
+<7a75> <7a75> 3415
+<7a78> <7a78> 3416
+<7a7e> <7a7e> 3417
+<7a80> <7a80> 3418
+<7a82> <7a82> 3419
+<7a85> <7a86> 3420
+<7a8a> <7a8b> 3422
+<7a90> <7a91> 3424
+<7a94> <7a94> 3426
+<7a9e> <7a9e> 3427
+<7aa0> <7aa0> 3428
+<7aa3> <7aa3> 3429
+<7aac> <7aac> 3430
+<7ab3> <7ab3> 3431
+<7ab5> <7ab5> 3432
+<7ab9> <7ab9> 3433
+<7abb> <7abc> 3434
+<7ac6> <7ac6> 3436
+<7ac9> <7ac9> 3437
+<7acc> <7acc> 3438
+<7ace> <7ace> 3439
+<7ad1> <7ad1> 3440
+<7adb> <7adb> 3441
+<7ae8> <7ae9> 3442
+<7aeb> <7aec> 3444
+<7af1> <7af1> 3446
+<7af4> <7af4> 3447
+<7afb> <7afb> 3448
+<7afd> <7afe> 3449
+<7b07> <7b07> 3451
+<7b14> <7b14> 3452
+<7b1f> <7b1f> 3453
+<7b23> <7b23> 3454
+<7b27> <7b27> 3455
+<7b29> <7b2b> 3456
+<7b2d> <7b31> 3459
+<7b34> <7b34> 3464
+<7b3d> <7b3d> 3465
+endcidrange
+
+100 begincidrange
+<7b3f> <7b41> 3466
+<7b47> <7b47> 3469
+<7b4e> <7b4e> 3470
+<7b55> <7b55> 3471
+<7b60> <7b60> 3472
+<7b64> <7b64> 3473
+<7b66> <7b66> 3474
+<7b69> <7b6a> 3475
+<7b6d> <7b6d> 3477
+<7b6f> <7b6f> 3478
+<7b72> <7b73> 3479
+<7b77> <7b77> 3481
+<7b84> <7b84> 3482
+<7b89> <7b89> 3483
+<7b8e> <7b8e> 3484
+<7b90> <7b91> 3485
+<7b96> <7b96> 3487
+<7b9b> <7b9b> 3488
+<7b9e> <7b9e> 3489
+<7ba0> <7ba0> 3490
+<7ba5> <7ba5> 3491
+<7bac> <7bac> 3492
+<7baf> <7bb0> 3493
+<7bb2> <7bb2> 3495
+<7bb5> <7bb6> 3496
+<7bba> <7bbd> 3498
+<7bc2> <7bc2> 3502
+<7bc5> <7bc5> 3503
+<7bc8> <7bc8> 3504
+<7bca> <7bca> 3505
+<7bd4> <7bd4> 3506
+<7bd6> <7bd7> 3507
+<7bd9> <7bdb> 3509
+<7be8> <7be8> 3512
+<7bea> <7bea> 3513
+<7bf2> <7bf2> 3514
+<7bf4> <7bf5> 3515
+<7bf8> <7bfa> 3517
+<7bfc> <7bfc> 3520
+<7bfe> <7bfe> 3521
+<7c01> <7c04> 3522
+<7c06> <7c06> 3526
+<7c09> <7c09> 3527
+<7c0b> <7c0c> 3528
+<7c0e> <7c0f> 3530
+<7c19> <7c19> 3532
+<7c1b> <7c1b> 3533
+<7c20> <7c20> 3534
+<7c25> <7c26> 3535
+<7c28> <7c28> 3537
+<7c2c> <7c2c> 3538
+<7c31> <7c31> 3539
+<7c33> <7c34> 3540
+<7c36> <7c36> 3542
+<7c39> <7c3a> 3543
+<7c46> <7c46> 3545
+<7c4a> <7c4a> 3546
+<7c51> <7c53> 3548
+<7c55> <7c55> 3547
+<7c59> <7c5e> 3551
+<7c61> <7c61> 3557
+<7c63> <7c63> 3558
+<7c67> <7c67> 3559
+<7c69> <7c69> 3560
+<7c6d> <7c6e> 3561
+<7c70> <7c70> 3563
+<7c72> <7c72> 3564
+<7c79> <7c79> 3565
+<7c7c> <7c7d> 3566
+<7c86> <7c87> 3568
+<7c8f> <7c8f> 3570
+<7c94> <7c94> 3571
+<7c9e> <7c9e> 3572
+<7ca0> <7ca0> 3573
+<7ca6> <7ca6> 3574
+<7cb0> <7cb0> 3575
+<7cb6> <7cb7> 3576
+<7cba> <7cbc> 3578
+<7cbf> <7cbf> 3581
+<7cc4> <7cc4> 3582
+<7cc7> <7cc9> 3583
+<7ccd> <7ccd> 3586
+<7ccf> <7ccf> 3587
+<7cd3> <7cd5> 3588
+<7cd7> <7cd7> 3591
+<7cd9> <7cda> 3592
+<7cdd> <7cdd> 3594
+<7ce6> <7ce6> 3595
+<7ce9> <7ce9> 3596
+<7ceb> <7ceb> 3597
+<7cf5> <7cf5> 3598
+<7d03> <7d03> 3599
+<7d07> <7d09> 3600
+<7d0f> <7d0f> 3603
+<7d11> <7d13> 3604
+<7d16> <7d16> 3607
+<7d1d> <7d1e> 3608
+<7d23> <7d23> 3610
+<7d26> <7d26> 3611
+<7d2a> <7d2a> 3612
+endcidrange
+
+100 begincidrange
+<7d2d> <7d2d> 3613
+<7d31> <7d31> 3614
+<7d3c> <7d3e> 3615
+<7d40> <7d41> 3618
+<7d47> <7d48> 3620
+<7d4d> <7d4d> 3622
+<7d51> <7d51> 3623
+<7d53> <7d53> 3624
+<7d57> <7d57> 3625
+<7d59> <7d5a> 3626
+<7d5c> <7d5d> 3628
+<7d65> <7d65> 3630
+<7d67> <7d67> 3631
+<7d6a> <7d6a> 3632
+<7d70> <7d70> 3633
+<7d78> <7d78> 3634
+<7d7a> <7d7b> 3635
+<7d7f> <7d7f> 3637
+<7d81> <7d83> 3638
+<7d85> <7d86> 3641
+<7d88> <7d88> 3643
+<7d8b> <7d8d> 3644
+<7d91> <7d91> 3647
+<7d96> <7d97> 3648
+<7d9d> <7d9e> 3650
+<7da6> <7da7> 3652
+<7daa> <7daa> 3654
+<7db3> <7db3> 3655
+<7db6> <7db7> 3656
+<7db9> <7db9> 3658
+<7dc2> <7dc6> 3659
+<7dcc> <7dce> 3664
+<7dd7> <7dd7> 3667
+<7dd9> <7dd9> 3668
+<7de2> <7de2> 3670
+<7de5> <7de6> 3671
+<7dea> <7deb> 3673
+<7ded> <7ded> 3675
+<7df1> <7df1> 3676
+<7df5> <7df6> 3677
+<7df9> <7dfa> 3679
+<7e00> <7e00> 3669
+<7e08> <7e08> 3681
+<7e10> <7e11> 3682
+<7e15> <7e15> 3684
+<7e17> <7e17> 3685
+<7e1c> <7e1d> 3686
+<7e20> <7e20> 3688
+<7e27> <7e28> 3689
+<7e2c> <7e2d> 3691
+<7e2f> <7e2f> 3693
+<7e33> <7e33> 3694
+<7e36> <7e36> 3695
+<7e3f> <7e3f> 3696
+<7e44> <7e45> 3697
+<7e47> <7e47> 3699
+<7e4e> <7e4e> 3700
+<7e50> <7e50> 3701
+<7e52> <7e52> 3702
+<7e58> <7e58> 3703
+<7e5f> <7e5f> 3704
+<7e61> <7e62> 3705
+<7e65> <7e65> 3707
+<7e6b> <7e6b> 3708
+<7e6e> <7e6f> 3709
+<7e73> <7e73> 3711
+<7e78> <7e78> 3712
+<7e7e> <7e7e> 3713
+<7e81> <7e81> 3714
+<7e86> <7e87> 3715
+<7e8a> <7e8a> 3717
+<7e8d> <7e8d> 3718
+<7e91> <7e91> 3719
+<7e95> <7e95> 3720
+<7e98> <7e98> 3721
+<7e9a> <7e9a> 3722
+<7e9d> <7e9e> 3723
+<7f3b> <7f3b> 3726
+<7f3c> <7f3c> 3725
+<7f3d> <7f3f> 3727
+<7f43> <7f44> 3730
+<7f47> <7f47> 3732
+<7f4f> <7f4f> 3733
+<7f52> <7f53> 3734
+<7f5b> <7f5d> 3736
+<7f61> <7f61> 3739
+<7f63> <7f66> 3740
+<7f6d> <7f6d> 3744
+<7f71> <7f71> 3745
+<7f7d> <7f80> 3746
+<7f8b> <7f8b> 3750
+<7f8d> <7f8d> 3751
+<7f8f> <7f91> 3752
+<7f96> <7f97> 3755
+<7f9c> <7f9c> 3757
+<7fa1> <7fa2> 3758
+<7fa6> <7fa6> 3760
+<7faa> <7faa> 3761
+<7fad> <7fad> 3762
+<7fb4> <7fb4> 3763
+endcidrange
+
+100 begincidrange
+<7fbc> <7fbc> 3764
+<7fbf> <7fc0> 3765
+<7fc3> <7fc3> 3767
+<7fc8> <7fc8> 3768
+<7fce> <7fcf> 3769
+<7fdb> <7fdb> 3771
+<7fdf> <7fdf> 3772
+<7fe3> <7fe3> 3773
+<7fe5> <7fe5> 3774
+<7fe8> <7fe8> 3775
+<7fec> <7fec> 3776
+<7fee> <7fef> 3777
+<7ff2> <7ff2> 3779
+<7ffa> <7ffa> 3780
+<7ffd> <7fff> 3781
+<8007> <8008> 3784
+<800a> <800a> 3786
+<800d> <800f> 3787
+<8011> <8011> 3790
+<8013> <8014> 3791
+<8016> <8016> 3793
+<801d> <8020> 3794
+<8024> <8024> 3798
+<8026> <8026> 3799
+<802c> <802c> 3800
+<802e> <802e> 3801
+<8030> <8030> 3802
+<8034> <8035> 3803
+<8037> <8037> 3805
+<8039> <803a> 3806
+<803c> <803c> 3808
+<803e> <803e> 3809
+<8040> <8040> 3810
+<8044> <8044> 3811
+<8060> <8060> 3812
+<8064> <8064> 3813
+<8066> <8066> 3814
+<806d> <806d> 3815
+<8071> <8071> 3816
+<8075> <8075> 3817
+<8081> <8081> 3818
+<8088> <8088> 3819
+<808e> <808e> 3820
+<809c> <809c> 3821
+<809e> <809e> 3822
+<80a6> <80a7> 3823
+<80ab> <80ab> 3825
+<80b8> <80b9> 3826
+<80c8> <80c8> 3828
+<80cd> <80cd> 3829
+<80cf> <80cf> 3830
+<80d2> <80d2> 3831
+<80d4> <80d5> 3832
+<80d7> <80d8> 3834
+<80e0> <80e0> 3836
+<80ed> <80ee> 3837
+<80f0> <80f0> 3839
+<80f2> <80f3> 3840
+<80f6> <80f6> 3842
+<80f9> <80fa> 3843
+<80fe> <80fe> 3845
+<8103> <8103> 3846
+<810b> <810b> 3847
+<8116> <8118> 3848
+<811c> <811c> 3851
+<811e> <811e> 3852
+<8120> <8120> 3853
+<8124> <8124> 3854
+<8127> <8127> 3855
+<812c> <812c> 3856
+<8130> <8130> 3857
+<8135> <8135> 3858
+<813a> <813a> 3859
+<813c> <813c> 3860
+<8145> <8145> 3861
+<8147> <8147> 3862
+<814a> <814a> 3863
+<814c> <814c> 3864
+<8152> <8152> 3865
+<8157> <8157> 3866
+<8160> <8161> 3867
+<8167> <8169> 3869
+<816d> <816d> 3872
+<816f> <816f> 3873
+<8177> <8177> 3874
+<8181> <8181> 3875
+<8184> <8186> 3877
+<818b> <818b> 3880
+<818e> <818e> 3881
+<8190> <8190> 3876
+<8196> <8196> 3882
+<8198> <8198> 3883
+<819b> <819b> 3884
+<819e> <819e> 3885
+<81a2> <81a2> 3886
+<81ae> <81ae> 3887
+<81b2> <81b2> 3888
+<81b4> <81b4> 3889
+<81bb> <81bb> 3890
+<81c3> <81c3> 3892
+endcidrange
+
+100 begincidrange
+<81c5> <81c5> 3893
+<81ca> <81ca> 3894
+<81cb> <81cb> 3891
+<81ce> <81cf> 3895
+<81d5> <81d5> 3897
+<81d7> <81d7> 3898
+<81db> <81db> 3899
+<81dd> <81de> 3900
+<81e1> <81e1> 3902
+<81e4> <81e4> 3903
+<81eb> <81ec> 3904
+<81f0> <81f2> 3906
+<81f5> <81f6> 3909
+<81f8> <81f9> 3911
+<81fd> <81fd> 3913
+<81ff> <81ff> 3914
+<8200> <8200> 3915
+<8203> <8203> 3916
+<820f> <820f> 3917
+<8213> <8214> 3918
+<8219> <821a> 3920
+<821d> <821d> 3922
+<8221> <8222> 3923
+<8228> <8228> 3925
+<8232> <8232> 3926
+<8234> <8234> 3927
+<823a> <823a> 3928
+<8243> <8246> 3929
+<824b> <824b> 3933
+<824e> <824f> 3934
+<8251> <8251> 3936
+<8256> <8256> 3937
+<825c> <825c> 3938
+<8260> <8260> 3939
+<8263> <8263> 3940
+<8267> <8267> 3941
+<826d> <826d> 3942
+<8274> <8274> 3943
+<827b> <827b> 3944
+<827d> <827d> 3945
+<827f> <8281> 3946
+<8283> <8284> 3949
+<8287> <8287> 3951
+<8289> <828a> 3952
+<828e> <828e> 3954
+<8291> <8291> 3955
+<8294> <8294> 3956
+<8296> <8296> 3957
+<8298> <8298> 3958
+<829a> <829b> 3959
+<82a0> <82a1> 3961
+<82a3> <82a4> 3963
+<82a7> <82aa> 3965
+<82ae> <82ae> 3969
+<82b0> <82b0> 3970
+<82b2> <82b2> 3971
+<82b4> <82b4> 3972
+<82b7> <82b7> 3973
+<82ba> <82ba> 3974
+<82bc> <82bc> 3975
+<82be> <82bf> 3976
+<82c6> <82c6> 3978
+<82d0> <82d0> 3979
+<82d5> <82d5> 3980
+<82da> <82da> 3981
+<82e0> <82e0> 3982
+<82e2> <82e2> 3983
+<82e4> <82e4> 3984
+<82e8> <82e8> 3985
+<82ea> <82ea> 3986
+<82ed> <82ed> 3987
+<82ef> <82ef> 3988
+<82f6> <82f7> 3989
+<82fd> <82fe> 3991
+<8300> <8301> 3993
+<8307> <8308> 3995
+<830a> <830b> 3997
+<831b> <831b> 4000
+<831d> <831f> 4001
+<8321> <8322> 4004
+<832c> <832e> 4006
+<8330> <8330> 4009
+<8333> <8333> 4010
+<8337> <8337> 4011
+<833a> <833a> 4012
+<833c> <833d> 4013
+<8342> <8344> 4015
+<8347> <8347> 4018
+<834d> <834e> 4019
+<8351> <8351> 4021
+<8353> <8353> 4056
+<8354> <8354> 3999
+<8355> <8357> 4022
+<8370> <8370> 4025
+<8378> <8378> 4026
+<837d> <837d> 4027
+<837f> <8380> 4028
+<8382> <8382> 4030
+<8384> <8384> 4031
+<8386> <8386> 4032
+endcidrange
+
+100 begincidrange
+<838d> <838d> 4033
+<8392> <8392> 4034
+<8394> <8395> 4035
+<8398> <8399> 4037
+<839b> <839d> 4039
+<83a6> <83a7> 4042
+<83a9> <83a9> 4044
+<83ac> <83ac> 4045
+<83ad> <83ad> 4070
+<83be> <83c0> 4046
+<83c7> <83c7> 4049
+<83c9> <83c9> 4050
+<83cf> <83d1> 4051
+<83d4> <83d4> 4054
+<83dd> <83dd> 4055
+<83e8> <83e8> 4057
+<83ea> <83ea> 4058
+<83f6> <83f6> 4059
+<83f8> <83f9> 4060
+<83fc> <83fc> 4062
+<8401> <8401> 4063
+<8406> <8406> 4064
+<840a> <840a> 4065
+<840f> <840f> 4066
+<8411> <8411> 4067
+<8415> <8415> 4068
+<8419> <8419> 4069
+<842f> <842f> 4071
+<8439> <8439> 4072
+<8445> <8445> 4073
+<8447> <8448> 4074
+<844a> <844a> 4076
+<844d> <844d> 4077
+<844f> <844f> 4078
+<8451> <8452> 4079
+<8456> <8456> 4081
+<8458> <845a> 4082
+<845c> <845c> 4085
+<8460> <8460> 4086
+<8464> <8465> 4087
+<8467> <8467> 4089
+<846a> <846a> 4090
+<8470> <8470> 4091
+<8473> <8474> 4092
+<8476> <8476> 4094
+<8478> <8478> 4095
+<847c> <847d> 4096
+<8481> <8481> 4098
+<8485> <8485> 4099
+<8492> <8493> 4100
+<8495> <8495> 4102
+<849e> <849e> 4103
+<84a6> <84a6> 4104
+<84a8> <84aa> 4105
+<84af> <84af> 4108
+<84b1> <84b1> 4109
+<84b4> <84b4> 4110
+<84ba> <84ba> 4111
+<84bd> <84be> 4112
+<84c0> <84c0> 4114
+<84c2> <84c2> 4115
+<84c7> <84c8> 4116
+<84cc> <84cc> 4118
+<84cf> <84cf> 4119
+<84d3> <84d3> 4120
+<84dc> <84dc> 4121
+<84e7> <84e7> 4122
+<84ea> <84ea> 4123
+<84ef> <84f2> 4124
+<84f7> <84f7> 4128
+<84fa> <84fb> 4130
+<84fd> <84fd> 4132
+<8502> <8503> 4133
+<8507> <8507> 4135
+<850c> <850c> 4136
+<850e> <850e> 4137
+<8510> <8510> 4138
+<851c> <851c> 4139
+<851e> <851e> 4140
+<8522> <8525> 4141
+<8527> <8527> 4145
+<852a> <852b> 4146
+<852f> <852f> 4148
+<8532> <8532> 4129
+<8533> <8534> 4149
+<8536> <8536> 4151
+<853f> <853f> 4152
+<8546> <8546> 4153
+<854f> <8553> 4154
+<8556> <8556> 4159
+<8559> <8559> 4160
+<855c> <8562> 4161
+<8564> <8564> 4168
+<856b> <856b> 4169
+<856f> <856f> 4170
+<8579> <857b> 4171
+<857d> <857d> 4174
+<857f> <857f> 4175
+<8581> <8581> 4176
+<8585> <8586> 4177
+endcidrange
+
+100 begincidrange
+<8589> <8589> 4179
+<858b> <858c> 4180
+<858f> <858f> 4182
+<8593> <8593> 4183
+<8598> <8598> 4184
+<859d> <859d> 4185
+<859f> <85a0> 4186
+<85a2> <85a2> 4188
+<85a5> <85a5> 4189
+<85a7> <85a7> 4190
+<85ad> <85ad> 4204
+<85b4> <85b4> 4191
+<85b6> <85b8> 4192
+<85bc> <85bf> 4195
+<85c2> <85c2> 4199
+<85c7> <85c7> 4200
+<85ca> <85cb> 4201
+<85ce> <85ce> 4203
+<85d8> <85d8> 4205
+<85da> <85da> 4206
+<85df> <85e0> 4207
+<85e6> <85e6> 4209
+<85e8> <85e8> 4210
+<85ed> <85ed> 4211
+<85f3> <85f3> 4212
+<85f6> <85f6> 4213
+<85fc> <85fc> 4214
+<85ff> <85ff> 4215
+<8600> <8600> 4216
+<8604> <8605> 4217
+<860d> <860e> 4219
+<8610> <8612> 4221
+<8618> <8619> 4224
+<861b> <861b> 4226
+<861e> <861e> 4227
+<8621> <8621> 4228
+<8627> <8627> 4229
+<8629> <8629> 4230
+<8636> <8636> 4231
+<8638> <8638> 4232
+<863a> <863a> 4233
+<863c> <863d> 4234
+<8640> <8640> 4236
+<8641> <8641> 1088
+<8642> <8642> 4237
+<8646> <8646> 4238
+<8652> <8653> 4239
+<8656> <8659> 4241
+<865d> <865d> 4245
+<8660> <8664> 4246
+<8669> <8669> 4251
+<866c> <866c> 4252
+<866f> <866f> 4253
+<8675> <8677> 4254
+<867a> <867a> 4257
+<8688> <8688> 4291
+<868d> <868d> 4258
+<8691> <8691> 4259
+<8696> <8696> 4260
+<8698> <8698> 4261
+<869a> <869a> 4262
+<869c> <869c> 4263
+<86a1> <86a1> 4264
+<86a6> <86a8> 4265
+<86ad> <86ad> 4268
+<86b1> <86b1> 4269
+<86b3> <86b5> 4270
+<86b7> <86b9> 4273
+<86bf> <86c1> 4276
+<86c3> <86c3> 4279
+<86c5> <86c5> 4280
+<86d1> <86d2> 4281
+<86d5> <86d5> 4283
+<86d7> <86d7> 4284
+<86da> <86da> 4285
+<86dc> <86dc> 4286
+<86e0> <86e0> 4287
+<86e3> <86e3> 4288
+<86e5> <86e5> 4289
+<86e7> <86e7> 4290
+<86fa> <86fa> 4292
+<86fc> <86fd> 4293
+<8704> <8705> 4295
+<8707> <8707> 4297
+<870b> <870b> 4298
+<870e> <8710> 4299
+<8713> <8714> 4302
+<8719> <8719> 4304
+<871e> <871f> 4305
+<8721> <8721> 4307
+<8723> <8723> 4308
+<8728> <8728> 4309
+<872e> <872f> 4310
+<8731> <8732> 4312
+<8739> <873a> 4314
+<873c> <873e> 4316
+<8740> <8740> 4319
+<8743> <8743> 4320
+<8745> <8745> 4321
+<874d> <874d> 4322
+endcidrange
+
+100 begincidrange
+<8758> <8758> 4323
+<875d> <875d> 4324
+<8761> <8761> 4325
+<8764> <8765> 4326
+<876f> <876f> 4328
+<8771> <8772> 4329
+<877b> <877b> 4331
+<8783> <8789> 4332
+<878b> <878c> 4339
+<8790> <8790> 4341
+<8793> <8793> 4342
+<8795> <8795> 4343
+<8797> <8799> 4344
+<879e> <879e> 4347
+<87a0> <87a0> 4348
+<87a3> <87a3> 4349
+<87a7> <87a7> 4350
+<87ac> <87ae> 4351
+<87b1> <87b1> 4354
+<87b5> <87b5> 4355
+<87be> <87bf> 4356
+<87c1> <87c1> 4358
+<87c8> <87ca> 4359
+<87ce> <87ce> 4362
+<87d5> <87d6> 4363
+<87d9> <87da> 4365
+<87dc> <87dc> 4367
+<87df> <87df> 4368
+<87e2> <87e4> 4369
+<87ea> <87eb> 4372
+<87ed> <87ed> 4374
+<87f1> <87f1> 4375
+<87f3> <87f3> 4376
+<87f8> <87f8> 4377
+<87fa> <87fa> 4378
+<87ff> <87ff> 4379
+<8801> <8801> 4380
+<8803> <8803> 4381
+<8806> <8806> 4382
+<8809> <880b> 4383
+<8810> <8810> 4386
+<8812> <8814> 4388
+<8818> <8818> 4391
+<8819> <8819> 4387
+<881a> <881c> 4392
+<881e> <881f> 4395
+<8828> <8828> 4397
+<882d> <882e> 4398
+<8830> <8830> 4400
+<8832> <8832> 4401
+<8835> <8835> 4402
+<883a> <883a> 4403
+<883c> <883c> 4404
+<8841> <8841> 4405
+<8843> <8843> 4406
+<8845> <8845> 4407
+<8848> <884b> 4408
+<884e> <884e> 4412
+<8851> <8851> 4413
+<8855> <8856> 4414
+<8858> <8858> 4416
+<885a> <885a> 4417
+<885c> <885c> 4418
+<885f> <8860> 4419
+<8864> <8864> 4421
+<8869> <8869> 4422
+<8871> <8871> 4423
+<8879> <8879> 4424
+<887b> <887b> 4425
+<8880> <8880> 4426
+<8898> <8898> 4427
+<889a> <889c> 4428
+<889f> <88a0> 4431
+<88a8> <88a8> 4433
+<88aa> <88aa> 4434
+<88ba> <88ba> 4435
+<88bd> <88be> 4436
+<88c0> <88c0> 4438
+<88ca> <88ce> 4439
+<88d1> <88d3> 4444
+<88db> <88db> 4447
+<88de> <88de> 4448
+<88e7> <88e7> 4449
+<88ef> <88f1> 4450
+<88f5> <88f5> 4453
+<88f7> <88f7> 4454
+<8901> <8901> 4455
+<8906> <8906> 4456
+<890d> <890f> 4457
+<8915> <8916> 4460
+<8918> <891a> 4462
+<891c> <891c> 4465
+<8920> <8920> 4466
+<8926> <8928> 4467
+<8930> <8932> 4470
+<8935> <8935> 4473
+<8939> <893a> 4474
+<893e> <893e> 4476
+<8940> <8940> 4477
+<8942> <8942> 4478
+endcidrange
+
+100 begincidrange
+<8945> <8946> 4479
+<8949> <8949> 4481
+<894f> <894f> 4482
+<8952> <8952> 4483
+<8957> <8957> 4484
+<895a> <895c> 4485
+<8961> <8963> 4488
+<896b> <896b> 4491
+<896e> <896e> 4492
+<8970> <8970> 4493
+<8973> <8973> 4494
+<8975> <8975> 4495
+<897a> <897d> 4496
+<8989> <8989> 4500
+<898d> <898d> 4501
+<8990> <8990> 4502
+<8994> <8995> 4503
+<899b> <899c> 4505
+<899f> <89a0> 4507
+<89a5> <89a5> 4509
+<89b0> <89b0> 4510
+<89b4> <89b7> 4511
+<89bc> <89bc> 4515
+<89d4> <89d8> 4516
+<89e5> <89e5> 4521
+<89e9> <89e9> 4522
+<89eb> <89eb> 4523
+<89ed> <89ed> 4524
+<89f1> <89f1> 4525
+<89f3> <89f3> 4526
+<89f6> <89f6> 4527
+<89f9> <89f9> 4528
+<89fd> <89fd> 4529
+<89ff> <89ff> 4530
+<8a04> <8a05> 4531
+<8a07> <8a07> 4533
+<8a0f> <8a0f> 4534
+<8a11> <8a12> 4535
+<8a14> <8a15> 4537
+<8a1e> <8a1e> 4539
+<8a20> <8a20> 4540
+<8a22> <8a22> 4541
+<8a24> <8a24> 4542
+<8a26> <8a26> 4543
+<8a2b> <8a2c> 4544
+<8a2f> <8a2f> 4546
+<8a35> <8a35> 4547
+<8a37> <8a37> 4548
+<8a3d> <8a3e> 4549
+<8a40> <8a40> 4551
+<8a43> <8a43> 4552
+<8a45> <8a45> 4553
+<8a47> <8a47> 4554
+<8a49> <8a49> 4555
+<8a4d> <8a4e> 4556
+<8a53> <8a53> 4558
+<8a56> <8a58> 4559
+<8a5c> <8a5d> 4562
+<8a61> <8a61> 4564
+<8a65> <8a65> 4565
+<8a67> <8a67> 4566
+<8a75> <8a77> 4567
+<8a79> <8a7b> 4570
+<8a7e> <8a80> 4573
+<8a83> <8a83> 4576
+<8a86> <8a86> 4577
+<8a8b> <8a8b> 4578
+<8a8f> <8a90> 4579
+<8a92> <8a92> 4581
+<8a96> <8a97> 4582
+<8a99> <8a99> 4584
+<8a9f> <8a9f> 4585
+<8aa7> <8aa7> 4586
+<8aa9> <8aa9> 4587
+<8aae> <8aaf> 4588
+<8ab3> <8ab3> 4590
+<8ab6> <8ab7> 4591
+<8abb> <8abb> 4593
+<8abe> <8abe> 4594
+<8ac3> <8ac3> 4595
+<8ac6> <8ac6> 4596
+<8ac8> <8aca> 4597
+<8ad1> <8ad1> 4600
+<8ad3> <8ad5> 4601
+<8ad7> <8ad7> 4604
+<8add> <8add> 4605
+<8adf> <8adf> 4606
+<8aec> <8aec> 4607
+<8af0> <8af0> 4608
+<8af4> <8af6> 4609
+<8afc> <8afc> 4612
+<8aff> <8aff> 4613
+<8b05> <8b06> 4614
+<8b0a> <8b0a> 4621
+<8b0b> <8b0b> 4616
+<8b11> <8b11> 4617
+<8b1c> <8b1c> 4618
+<8b1e> <8b1f> 4619
+<8b2d> <8b2d> 4622
+<8b30> <8b30> 4623
+endcidrange
+
+100 begincidrange
+<8b37> <8b37> 4624
+<8b3c> <8b3c> 4625
+<8b42> <8b46> 4626
+<8b48> <8b48> 4631
+<8b4d> <8b4d> 4636
+<8b52> <8b54> 4632
+<8b59> <8b59> 4635
+<8b5e> <8b5e> 4637
+<8b63> <8b63> 4638
+<8b6d> <8b6d> 4639
+<8b76> <8b76> 4640
+<8b78> <8b79> 4641
+<8b7c> <8b7c> 4643
+<8b7e> <8b7e> 4644
+<8b81> <8b81> 4645
+<8b84> <8b85> 4646
+<8b8b> <8b8b> 4648
+<8b8d> <8b8d> 4649
+<8b8f> <8b8f> 4650
+<8b94> <8b95> 4651
+<8b9c> <8b9c> 4653
+<8b9e> <8b9f> 4654
+<8c38> <8c39> 4656
+<8c3d> <8c3e> 4658
+<8c45> <8c45> 4660
+<8c47> <8c47> 4661
+<8c49> <8c49> 4662
+<8c4b> <8c4b> 4663
+<8c4f> <8c4f> 4664
+<8c51> <8c51> 4665
+<8c53> <8c54> 4666
+<8c57> <8c58> 4668
+<8c59> <8c59> 4672
+<8c5b> <8c5b> 4670
+<8c5d> <8c5d> 4671
+<8c63> <8c64> 4673
+<8c66> <8c66> 4675
+<8c68> <8c69> 4676
+<8c6d> <8c6d> 4678
+<8c73> <8c73> 4679
+<8c75> <8c76> 4680
+<8c7b> <8c7b> 4682
+<8c7e> <8c7e> 4683
+<8c86> <8c87> 4684
+<8c8b> <8c8b> 4686
+<8c90> <8c90> 4687
+<8c92> <8c93> 4688
+<8c99> <8c99> 4690
+<8c9b> <8c9c> 4691
+<8ca4> <8ca4> 4693
+<8cb9> <8cba> 4694
+<8cc5> <8cc6> 4696
+<8cc9> <8cc9> 4698
+<8ccb> <8ccb> 4699
+<8ccf> <8ccf> 4700
+<8cd5> <8cd5> 4702
+<8cd6> <8cd6> 4701
+<8cd9> <8cd9> 4703
+<8cdd> <8cdd> 4704
+<8ce1> <8ce1> 4705
+<8ce8> <8ce8> 4706
+<8cec> <8cec> 4707
+<8cef> <8cf0> 4708
+<8cf2> <8cf2> 4710
+<8cf5> <8cf5> 4711
+<8cf7> <8cf8> 4712
+<8cfe> <8cff> 4714
+<8d01> <8d01> 4716
+<8d03> <8d03> 4717
+<8d09> <8d09> 4718
+<8d12> <8d12> 4719
+<8d17> <8d17> 4720
+<8d1b> <8d1b> 4721
+<8d65> <8d65> 4722
+<8d69> <8d69> 4723
+<8d6c> <8d6c> 4724
+<8d6e> <8d6e> 4725
+<8d7f> <8d7f> 4726
+<8d82> <8d82> 4727
+<8d84> <8d84> 4728
+<8d88> <8d88> 4729
+<8d8d> <8d8d> 4730
+<8d90> <8d91> 4731
+<8d95> <8d95> 4733
+<8d9e> <8da0> 4734
+<8da6> <8da6> 4737
+<8dab> <8dac> 4738
+<8daf> <8daf> 4740
+<8db2> <8db2> 4741
+<8db5> <8db5> 4742
+<8db7> <8db7> 4743
+<8db9> <8db9> 4744
+<8dbb> <8dbb> 4745
+<8dbc> <8dbc> 4763
+<8dc0> <8dc0> 4746
+<8dc5> <8dc8> 4747
+<8dca> <8dca> 4751
+<8dce> <8dce> 4752
+<8dd1> <8dd1> 4753
+<8dd4> <8dd5> 4754
+endcidrange
+
+100 begincidrange
+<8dd7> <8dd7> 4756
+<8dd9> <8dd9> 4757
+<8de4> <8de5> 4758
+<8de7> <8de7> 4760
+<8dec> <8dec> 4761
+<8df0> <8df0> 4762
+<8df1> <8df2> 4764
+<8df4> <8df4> 4766
+<8dfd> <8dfd> 4767
+<8e01> <8e01> 4768
+<8e04> <8e06> 4769
+<8e0b> <8e0b> 4772
+<8e11> <8e11> 4773
+<8e14> <8e14> 4774
+<8e16> <8e16> 4775
+<8e20> <8e23> 4776
+<8e26> <8e27> 4780
+<8e31> <8e31> 4782
+<8e33> <8e33> 4783
+<8e36> <8e39> 4784
+<8e3d> <8e3d> 4788
+<8e40> <8e41> 4789
+<8e4b> <8e4b> 4791
+<8e4d> <8e4f> 4792
+<8e54> <8e54> 4795
+<8e5b> <8e5e> 4796
+<8e61> <8e62> 4800
+<8e69> <8e69> 4802
+<8e6c> <8e6d> 4803
+<8e6f> <8e71> 4805
+<8e79> <8e7b> 4808
+<8e82> <8e83> 4811
+<8e89> <8e89> 4813
+<8e90> <8e90> 4814
+<8e92> <8e92> 4815
+<8e95> <8e95> 4816
+<8e9a> <8e9b> 4817
+<8e9d> <8e9e> 4819
+<8ea2> <8ea2> 4821
+<8ea7> <8ea7> 4822
+<8ea9> <8ea9> 4823
+<8ead> <8eae> 4824
+<8eb3> <8eb3> 4826
+<8eb5> <8eb5> 4827
+<8eba> <8ebb> 4828
+<8ec0> <8ec1> 4830
+<8ec3> <8ec4> 4832
+<8ec7> <8ec7> 4834
+<8ecf> <8ecf> 4835
+<8ed1> <8ed1> 4836
+<8ed4> <8ed4> 4837
+<8edc> <8edc> 4838
+<8ee8> <8ee8> 4839
+<8eed> <8eed> 4846
+<8eee> <8eee> 4840
+<8ef0> <8ef1> 4841
+<8ef7> <8ef7> 4843
+<8ef9> <8efa> 4844
+<8f00> <8f00> 4847
+<8f02> <8f02> 4848
+<8f07> <8f08> 4849
+<8f0f> <8f10> 4851
+<8f16> <8f18> 4853
+<8f1e> <8f1e> 4856
+<8f20> <8f21> 4857
+<8f23> <8f23> 4859
+<8f25> <8f25> 4860
+<8f27> <8f28> 4861
+<8f2c> <8f2e> 4863
+<8f34> <8f37> 4866
+<8f3a> <8f3a> 4870
+<8f40> <8f41> 4871
+<8f43> <8f43> 4873
+<8f47> <8f47> 4874
+<8f4f> <8f4f> 4875
+<8f51> <8f55> 4876
+<8f58> <8f58> 4881
+<8f5d> <8f5e> 4882
+<8f65> <8f65> 4884
+<8f9d> <8f9d> 4885
+<8fa0> <8fa1> 4886
+<8fa4> <8fa6> 4888
+<8fb5> <8fb6> 4891
+<8fb8> <8fb8> 4893
+<8fbe> <8fbe> 4894
+<8fc0> <8fc1> 4895
+<8fc6> <8fc6> 4897
+<8fca> <8fcb> 4898
+<8fcd> <8fcd> 4900
+<8fd0> <8fd0> 4901
+<8fd2> <8fd3> 4902
+<8fd5> <8fd5> 4904
+<8fe0> <8fe0> 4905
+<8fe3> <8fe4> 4906
+<8fe8> <8fe8> 4908
+<8fee> <8fee> 4909
+<8ff1> <8ff1> 4910
+<8ff5> <8ff6> 4911
+<8ffb> <8ffb> 4913
+<8ffe> <8ffe> 4914
+endcidrange
+
+100 begincidrange
+<9002> <9002> 4915
+<9004> <9004> 4916
+<9008> <9008> 4917
+<900c> <900c> 4918
+<9018> <9018> 4919
+<901b> <901b> 4920
+<9028> <9029> 4921
+<902a> <902a> 4924
+<902c> <902d> 4925
+<902f> <902f> 4923
+<9033> <9034> 4927
+<9037> <9037> 4929
+<903f> <903f> 4930
+<9043> <9044> 4931
+<904c> <904c> 4933
+<905b> <905b> 4934
+<905d> <905d> 4935
+<9062> <9062> 4936
+<9066> <9067> 4937
+<906c> <906c> 4939
+<9070> <9070> 4940
+<9074> <9074> 4941
+<9079> <9079> 4942
+<9085> <9085> 4943
+<9088> <9088> 4944
+<908b> <908c> 4945
+<908e> <908e> 4947
+<9090> <9090> 4948
+<9095> <9095> 4949
+<9097> <9099> 4950
+<909b> <909b> 4953
+<90a0> <90a2> 4954
+<90a5> <90a5> 4957
+<90b0> <90b0> 4958
+<90b2> <90b4> 4959
+<90b6> <90b6> 4962
+<90bd> <90bd> 4963
+<90be> <90be> 4965
+<90c3> <90c5> 4966
+<90c7> <90c8> 4969
+<90cc> <90cc> 4964
+<90d2> <90d2> 4979
+<90d5> <90d5> 4971
+<90d7> <90d9> 4972
+<90dc> <90dd> 4975
+<90df> <90df> 4977
+<90e5> <90e5> 4978
+<90eb> <90eb> 4981
+<90ef> <90f0> 4982
+<90f4> <90f4> 4984
+<90f6> <90f6> 4980
+<90fe> <90ff> 4985
+<9100> <9100> 4987
+<9104> <9106> 4988
+<9108> <9108> 4991
+<910d> <910d> 4992
+<9110> <9110> 4993
+<9114> <9114> 4994
+<9116> <9118> 4995
+<911a> <911a> 4998
+<911c> <911c> 4999
+<911e> <911e> 5000
+<9120> <9120> 5001
+<9122> <9123> 5003
+<9125> <9125> 5002
+<9127> <9127> 5005
+<9129> <9129> 5006
+<912e> <912f> 5007
+<9131> <9131> 5009
+<9134> <9134> 5010
+<9136> <9137> 5011
+<9139> <913a> 5013
+<913c> <913d> 5015
+<9143> <9143> 5017
+<9147> <9148> 5018
+<914f> <914f> 5020
+<9153> <9153> 5021
+<9157> <9157> 5022
+<9159> <915b> 5023
+<9161> <9161> 5026
+<9164> <9164> 5027
+<9167> <9167> 5028
+<916d> <916d> 5029
+<9174> <9174> 5030
+<9179> <917b> 5031
+<9181> <9181> 5034
+<9183> <9183> 5035
+<9185> <9186> 5036
+<918a> <918a> 5038
+<918e> <918e> 5039
+<9191> <9191> 5040
+<9193> <9195> 5041
+<9198> <9198> 5044
+<919e> <919e> 5045
+<91a1> <91a1> 5046
+<91a6> <91a6> 5047
+<91a8> <91a8> 5048
+<91ac> <91ae> 5049
+<91b0> <91b3> 5052
+<91b6> <91b6> 5056
+endcidrange
+
+100 begincidrange
+<91bb> <91bd> 5057
+<91bf> <91bf> 5060
+<91c2> <91c3> 5061
+<91c5> <91c5> 5063
+<91d3> <91d4> 5064
+<91d7> <91d7> 5066
+<91d9> <91da> 5067
+<91de> <91de> 5069
+<91e4> <91e5> 5070
+<91e9> <91ea> 5072
+<91ec> <91f1> 5074
+<91f7> <91f7> 5080
+<91f9> <91f9> 5081
+<91fb> <91fb> 5082
+<91fd> <91fd> 5083
+<9200> <9201> 5084
+<9204> <9207> 5086
+<9209> <920a> 5090
+<920c> <920c> 5092
+<9210> <9210> 5093
+<9212> <9213> 5094
+<9216> <9216> 5096
+<9218> <9218> 5097
+<921c> <921d> 5098
+<9223> <9226> 5100
+<9228> <9228> 5104
+<922e> <9230> 5105
+<9233> <9233> 5108
+<9235> <9236> 5109
+<9238> <923a> 5111
+<923c> <923c> 5114
+<923e> <923e> 5115
+<9240> <9240> 5116
+<9242> <9243> 5117
+<9246> <9247> 5119
+<924a> <924a> 5121
+<924d> <924f> 5122
+<9251> <9251> 5125
+<9258> <9259> 5126
+<925c> <925d> 5128
+<9260> <9261> 5130
+<9265> <9265> 5132
+<9267> <9269> 5133
+<926e> <9270> 5136
+<9275> <9279> 5139
+<927b> <927d> 5144
+<927f> <927f> 5147
+<9288> <928a> 5148
+<928d> <928e> 5151
+<9292> <9292> 5153
+<9297> <9297> 5154
+<9299> <9299> 5155
+<929f> <92a0> 5156
+<92a4> <92a5> 5158
+<92a7> <92a8> 5160
+<92ab> <92ab> 5162
+<92af> <92af> 5163
+<92b2> <92b2> 5164
+<92b6> <92b6> 5165
+<92b8> <92b8> 5166
+<92ba> <92bd> 5167
+<92bf> <92c3> 5171
+<92c5> <92c8> 5176
+<92cb> <92ce> 5180
+<92d0> <92d0> 5184
+<92d3> <92d3> 5185
+<92d5> <92d5> 5186
+<92d7> <92d9> 5187
+<92dc> <92dd> 5190
+<92df> <92e1> 5192
+<92e3> <92e3> 5195
+<92e5> <92e5> 5196
+<92e7> <92e8> 5197
+<92ec> <92ec> 5199
+<92ee> <92ee> 5200
+<92f0> <92f0> 5201
+<92f9> <92f9> 5202
+<92fb> <92fb> 5203
+<92ff> <92ff> 5204
+<9300> <9300> 5205
+<9302> <9302> 5206
+<9308> <9308> 5207
+<930d> <930d> 5208
+<9311> <9311> 5209
+<9314> <9315> 5210
+<931c> <931f> 5212
+<9321> <9321> 5216
+<9324> <9325> 5217
+<9327> <9327> 5219
+<9329> <932a> 5220
+<9333> <9334> 5222
+<9336> <9337> 5224
+<9347> <9349> 5226
+<9350> <9352> 5229
+<9355> <9355> 5232
+<9357> <9358> 5233
+<935a> <935a> 5235
+<935e> <935e> 5236
+<9364> <9365> 5237
+<9367> <9367> 5239
+endcidrange
+
+100 begincidrange
+<9369> <936a> 5240
+<936d> <936d> 5242
+<936f> <9371> 5243
+<9373> <9374> 5246
+<9376> <9376> 5248
+<937a> <937a> 5249
+<937d> <937d> 5250
+<937f> <9382> 5251
+<9388> <9388> 5255
+<938a> <938b> 5256
+<938d> <938d> 5258
+<938f> <938f> 5259
+<9392> <9392> 5260
+<9395> <9395> 5261
+<9398> <9398> 5262
+<939b> <939b> 5263
+<939e> <939e> 5264
+<93a1> <93a1> 5265
+<93a3> <93a4> 5266
+<93a6> <93a6> 5268
+<93a8> <93a8> 5269
+<93a9> <93a9> 5275
+<93ab> <93ab> 5270
+<93b4> <93b6> 5271
+<93ba> <93ba> 5274
+<93c1> <93c1> 5276
+<93c4> <93c7> 5277
+<93c9> <93cd> 5281
+<93d3> <93d3> 5286
+<93d9> <93d9> 5287
+<93dc> <93dc> 5288
+<93de> <93df> 5289
+<93e2> <93e2> 5291
+<93e6> <93e7> 5292
+<93f7> <93f8> 5295
+<93f9> <93f9> 5294
+<93fa> <93fb> 5297
+<93fd> <93fd> 5299
+<9401> <9402> 5300
+<9404> <9404> 5302
+<9408> <9409> 5303
+<940d> <940f> 5305
+<9415> <9417> 5308
+<941f> <941f> 5311
+<942e> <942f> 5312
+<9431> <9434> 5314
+<943b> <943b> 5318
+<943d> <943d> 5320
+<943f> <943f> 5319
+<9443> <9443> 5321
+<9445> <9445> 5322
+<9448> <9448> 5323
+<944a> <944a> 5324
+<944c> <944c> 5325
+<9455> <9455> 5326
+<9459> <9459> 5327
+<945c> <945c> 5328
+<945f> <945f> 5329
+<9461> <9461> 5330
+<9463> <9463> 5331
+<9468> <9468> 5332
+<946b> <946b> 5333
+<946d> <946f> 5334
+<9471> <9472> 5337
+<9483> <9483> 5340
+<9484> <9484> 5339
+<9578> <9579> 5341
+<957e> <957e> 5343
+<9584> <9584> 5344
+<9588> <9588> 5345
+<958c> <958e> 5346
+<959d> <959f> 5349
+<95a1> <95a1> 5352
+<95a6> <95a6> 5353
+<95a9> <95a9> 5354
+<95ab> <95ac> 5355
+<95b4> <95b4> 5357
+<95b6> <95b6> 5358
+<95ba> <95ba> 5359
+<95bd> <95bd> 5360
+<95bf> <95bf> 5361
+<95c6> <95c6> 5362
+<95c8> <95c9> 5363
+<95cb> <95cb> 5365
+<95d0> <95d3> 5366
+<95d9> <95da> 5370
+<95dd> <95e0> 5372
+<95e4> <95e4> 5376
+<95e6> <95e6> 5377
+<961d> <961e> 5378
+<9622> <9622> 5380
+<9624> <9626> 5381
+<962c> <962c> 5384
+<9631> <9631> 5385
+<9633> <9633> 5386
+<9637> <963a> 5387
+<963c> <963d> 5391
+<9641> <9641> 5393
+<9652> <9652> 5394
+<9654> <9654> 5395
+endcidrange
+
+100 begincidrange
+<9656> <9658> 5396
+<9661> <9661> 5399
+<966e> <966e> 5400
+<9674> <9674> 5401
+<967b> <967c> 5402
+<967e> <967f> 5404
+<9681> <9684> 5406
+<9689> <9689> 5410
+<9691> <9691> 5411
+<9696> <9696> 5412
+<969a> <969a> 5413
+<969d> <969d> 5414
+<969f> <969f> 5415
+<96a4> <96a6> 5416
+<96a9> <96a9> 5419
+<96ae> <96af> 5420
+<96b3> <96b3> 5422
+<96ba> <96ba> 5423
+<96ca> <96ca> 5424
+<96d2> <96d2> 5425
+<96d8> <96d8> 5427
+<96da> <96da> 5428
+<96dd> <96df> 5429
+<96e9> <96e9> 5432
+<96ef> <96ef> 5433
+<96f1> <96f1> 5434
+<96fa> <96fa> 5435
+<9702> <9703> 5436
+<9705> <9705> 5438
+<9709> <9709> 5439
+<971a> <971b> 5440
+<971d> <971d> 5442
+<9721> <9723> 5443
+<9728> <9728> 5446
+<9731> <9731> 5447
+<9733> <9733> 5448
+<9741> <9741> 5449
+<9743> <9743> 5450
+<974a> <974a> 5451
+<974e> <974f> 5452
+<9755> <9755> 5454
+<9757> <9758> 5455
+<975a> <975b> 5457
+<9763> <9763> 5459
+<9767> <9767> 5460
+<976a> <976a> 5461
+<976e> <976e> 5462
+<9773> <9773> 5463
+<9776> <9778> 5464
+<977b> <977b> 5467
+<977d> <977d> 5468
+<977f> <9780> 5469
+<9789> <9789> 5471
+<9795> <9797> 5472
+<9799> <979a> 5475
+<979e> <979f> 5477
+<97a2> <97a2> 5479
+<97ac> <97ac> 5480
+<97ae> <97ae> 5481
+<97b1> <97b2> 5482
+<97b5> <97b6> 5484
+<97b8> <97ba> 5486
+<97bc> <97bc> 5489
+<97be> <97bf> 5490
+<97c1> <97c1> 5492
+<97c4> <97c5> 5493
+<97c7> <97c7> 5495
+<97c9> <97ca> 5496
+<97cc> <97ce> 5498
+<97d0> <97d1> 5501
+<97d4> <97d4> 5503
+<97d7> <97d9> 5504
+<97db> <97db> 5510
+<97dd> <97de> 5507
+<97e0> <97e0> 5509
+<97e1> <97e1> 5511
+<97e4> <97e4> 5512
+<97ef> <97ef> 5513
+<97f1> <97f1> 5514
+<97f4> <97f4> 5515
+<97f7> <97f8> 5516
+<97fa> <97fa> 5518
+<9807> <9807> 5519
+<980a> <980a> 5520
+<980d> <980e> 5522
+<9814> <9814> 5524
+<9816> <9816> 5525
+<9819> <9819> 5521
+<981c> <981c> 5526
+<981e> <981e> 5527
+<9820> <9820> 5528
+<9823> <9823> 5529
+<9825> <9825> 5538
+<9826> <9826> 5530
+<982b> <982b> 5531
+<982e> <9830> 5532
+<9832> <9833> 5535
+<9835> <9835> 5537
+<983e> <983e> 5539
+<9844> <9844> 5540
+endcidrange
+
+100 begincidrange
+<9847> <9847> 5541
+<984a> <984a> 5542
+<9851> <9853> 5543
+<9856> <9857> 5546
+<9859> <985a> 5548
+<9862> <9863> 5550
+<9865> <9866> 5552
+<986a> <986a> 5554
+<986c> <986c> 5555
+<98ab> <98ab> 5556
+<98ad> <98ae> 5557
+<98b0> <98b0> 5559
+<98b4> <98b4> 5560
+<98b7> <98b8> 5561
+<98ba> <98bb> 5563
+<98bf> <98bf> 5565
+<98c2> <98c2> 5566
+<98c5> <98c5> 5567
+<98c8> <98c8> 5568
+<98cc> <98cc> 5569
+<98e1> <98e1> 5570
+<98e3> <98e3> 5571
+<98e5> <98e7> 5572
+<98ea> <98ea> 5575
+<98f3> <98f3> 5576
+<98f6> <98f6> 5577
+<9902> <9902> 5578
+<9907> <9908> 5579
+<9911> <9911> 5581
+<9915> <9917> 5582
+<991a> <991c> 5585
+<991f> <991f> 5588
+<9922> <9922> 5589
+<9926> <9927> 5590
+<992b> <992b> 5592
+<9931> <9935> 5593
+<9939> <993c> 5598
+<9940> <9941> 5602
+<9946> <9948> 5604
+<994d> <994e> 5607
+<9954> <9954> 5609
+<9958> <9959> 5610
+<995b> <995c> 5612
+<995e> <9960> 5614
+<999b> <999b> 5617
+<999d> <999d> 5618
+<999f> <999f> 5619
+<99a6> <99a6> 5620
+<99b0> <99b2> 5621
+<99b5> <99b5> 5624
+<99b9> <99ba> 5625
+<99bd> <99bd> 5627
+<99bf> <99bf> 5628
+<99c3> <99c3> 5629
+<99c9> <99c9> 5630
+<99d3> <99d4> 5631
+<99d9> <99da> 5633
+<99dc> <99dc> 5635
+<99de> <99de> 5636
+<99e7> <99e7> 5637
+<99ea> <99ec> 5638
+<99f0> <99f0> 5641
+<99f4> <99f5> 5642
+<99f9> <99f9> 5644
+<99fd> <99fe> 5645
+<9a02> <9a04> 5647
+<9a0b> <9a0c> 5650
+<9a10> <9a11> 5652
+<9a16> <9a16> 5654
+<9a1e> <9a1e> 5655
+<9a20> <9a20> 5656
+<9a22> <9a24> 5657
+<9a27> <9a27> 5660
+<9a2d> <9a2e> 5661
+<9a33> <9a33> 5663
+<9a35> <9a36> 5664
+<9a38> <9a38> 5666
+<9a41> <9a41> 5668
+<9a44> <9a44> 5669
+<9a47> <9a47> 5667
+<9a4a> <9a4c> 5670
+<9a4e> <9a4e> 5673
+<9a51> <9a51> 5674
+<9a54> <9a54> 5675
+<9a56> <9a56> 5676
+<9a5d> <9a5d> 5677
+<9aaa> <9aaa> 5678
+<9aac> <9aac> 5679
+<9aae> <9aaf> 5680
+<9ab2> <9ab2> 5682
+<9ab4> <9ab6> 5683
+<9ab9> <9ab9> 5686
+<9abb> <9abb> 5687
+<9abe> <9abf> 5688
+<9ac1> <9ac1> 5690
+<9ac3> <9ac3> 5691
+<9ac6> <9ac6> 5692
+<9ac8> <9ac8> 5693
+<9ace> <9ace> 5694
+<9ad0> <9ad0> 5695
+endcidrange
+
+100 begincidrange
+<9ad2> <9ad2> 5696
+<9ad5> <9ad7> 5697
+<9adb> <9adc> 5700
+<9ae0> <9ae0> 5702
+<9ae4> <9ae5> 5703
+<9ae7> <9ae7> 5705
+<9ae9> <9ae9> 5706
+<9aec> <9aec> 5707
+<9af2> <9af3> 5708
+<9af5> <9af5> 5710
+<9af9> <9afa> 5711
+<9afd> <9afd> 5713
+<9aff> <9aff> 5714
+<9b00> <9b05> 5715
+<9b08> <9b09> 5721
+<9b0b> <9b0e> 5723
+<9b10> <9b10> 5727
+<9b12> <9b12> 5728
+<9b16> <9b16> 5729
+<9b19> <9b19> 5730
+<9b1b> <9b1c> 5731
+<9b20> <9b20> 5733
+<9b26> <9b26> 5734
+<9b2b> <9b2b> 5735
+<9b2d> <9b2d> 5736
+<9b33> <9b35> 5737
+<9b37> <9b37> 5740
+<9b39> <9b3a> 5741
+<9b3d> <9b3d> 5743
+<9b48> <9b48> 5744
+<9b4b> <9b4c> 5745
+<9b55> <9b57> 5747
+<9b5b> <9b5b> 5750
+<9b5e> <9b5e> 5751
+<9b61> <9b61> 5752
+<9b63> <9b63> 5753
+<9b65> <9b66> 5754
+<9b68> <9b68> 5756
+<9b6a> <9b6e> 5757
+<9b73> <9b73> 5762
+<9b75> <9b75> 5763
+<9b77> <9b79> 5764
+<9b7f> <9b80> 5767
+<9b84> <9b87> 5769
+<9b89> <9b8b> 5773
+<9b8d> <9b8d> 5776
+<9b8f> <9b90> 5777
+<9b94> <9b94> 5779
+<9b9a> <9b9a> 5780
+<9b9d> <9b9e> 5781
+<9ba6> <9ba7> 5783
+<9ba9> <9ba9> 5785
+<9bac> <9bac> 5786
+<9bb0> <9bb2> 5787
+<9bb7> <9bb8> 5790
+<9bbb> <9bbc> 5792
+<9bbe> <9bbf> 5794
+<9bc1> <9bc1> 5796
+<9bc7> <9bc8> 5797
+<9bce> <9bce> 5799
+<9bd0> <9bd0> 5800
+<9bd7> <9bd8> 5801
+<9bdd> <9bdd> 5803
+<9bdf> <9bdf> 5804
+<9be5> <9be5> 5805
+<9be7> <9be7> 5806
+<9bea> <9beb> 5807
+<9bef> <9bef> 5809
+<9bf3> <9bf3> 5810
+<9bf7> <9bfa> 5811
+<9bfd> <9bfd> 5815
+<9bff> <9bff> 5816
+<9c00> <9c00> 5817
+<9c02> <9c02> 5818
+<9c0b> <9c0b> 5819
+<9c0f> <9c0f> 5820
+<9c11> <9c11> 5821
+<9c16> <9c16> 5822
+<9c18> <9c1a> 5823
+<9c1c> <9c1c> 5826
+<9c1e> <9c1e> 5827
+<9c22> <9c23> 5828
+<9c26> <9c2a> 5830
+<9c31> <9c31> 5835
+<9c35> <9c37> 5836
+<9c3d> <9c3d> 5839
+<9c41> <9c41> 5840
+<9c43> <9c45> 5841
+<9c49> <9c4a> 5844
+<9c4e> <9c50> 5846
+<9c53> <9c54> 5849
+<9c56> <9c56> 5851
+<9c58> <9c58> 5852
+<9c5b> <9c5b> 5853
+<9c5c> <9c5c> 5860
+<9c5d> <9c5f> 5854
+<9c63> <9c63> 5857
+<9c68> <9c68> 5862
+<9c69> <9c6a> 5858
+<9c6b> <9c6b> 5861
+endcidrange
+
+100 begincidrange
+<9c6e> <9c6e> 5863
+<9c70> <9c70> 5864
+<9c72> <9c72> 5865
+<9c75> <9c75> 5866
+<9c77> <9c77> 5867
+<9c7b> <9c7b> 5868
+<9ce6> <9ce6> 5869
+<9cf2> <9cf2> 5870
+<9cf7> <9cf7> 5871
+<9cf9> <9cf9> 5872
+<9d02> <9d02> 5874
+<9d0b> <9d0b> 5873
+<9d11> <9d11> 5875
+<9d17> <9d18> 5876
+<9d1c> <9d1e> 5878
+<9d2f> <9d30> 5881
+<9d32> <9d34> 5883
+<9d3a> <9d3a> 5886
+<9d3c> <9d3c> 5887
+<9d3d> <9d3d> 5889
+<9d42> <9d43> 5890
+<9d45> <9d45> 5888
+<9d47> <9d47> 5892
+<9d4a> <9d4a> 5893
+<9d53> <9d54> 5894
+<9d5f> <9d5f> 5896
+<9d62> <9d62> 5898
+<9d63> <9d63> 5897
+<9d65> <9d65> 5899
+<9d69> <9d6b> 5900
+<9d70> <9d70> 5903
+<9d76> <9d77> 5904
+<9d7b> <9d7c> 5906
+<9d7e> <9d7e> 5908
+<9d83> <9d84> 5909
+<9d86> <9d86> 5911
+<9d8a> <9d8a> 5912
+<9d8d> <9d8e> 5913
+<9d92> <9d93> 5915
+<9d95> <9d98> 5917
+<9da1> <9da1> 5921
+<9daa> <9daa> 5922
+<9dac> <9dac> 5923
+<9dae> <9dae> 5924
+<9db1> <9db1> 5925
+<9db5> <9db5> 5926
+<9db9> <9db9> 5927
+<9dbc> <9dbc> 5928
+<9dbf> <9dbf> 5929
+<9dc3> <9dc3> 5930
+<9dc7> <9dc7> 5931
+<9dc9> <9dca> 5932
+<9dd4> <9dd7> 5934
+<9dda> <9dda> 5938
+<9dde> <9de0> 5939
+<9de5> <9de5> 5942
+<9de7> <9de7> 5943
+<9de9> <9de9> 5944
+<9deb> <9deb> 5945
+<9dee> <9dee> 5946
+<9df0> <9df0> 5947
+<9df3> <9df4> 5948
+<9dfe> <9dfe> 5950
+<9e02> <9e02> 5952
+<9e07> <9e07> 5953
+<9e0a> <9e0a> 5951
+<9e0e> <9e0e> 5954
+<9e10> <9e12> 5955
+<9e15> <9e16> 5958
+<9e19> <9e19> 5960
+<9e1c> <9e1d> 5961
+<9e7a> <9e7c> 5963
+<9e80> <9e80> 5966
+<9e82> <9e85> 5967
+<9e87> <9e87> 5971
+<9e8e> <9e8f> 5972
+<9e96> <9e96> 5974
+<9e98> <9e98> 5975
+<9e9b> <9e9b> 5976
+<9e9e> <9e9e> 5977
+<9ea4> <9ea4> 5978
+<9ea8> <9ea8> 5979
+<9eac> <9eac> 5980
+<9eae> <9eb0> 5981
+<9eb3> <9eb5> 5984
+<9ec6> <9ec6> 5987
+<9ec8> <9ec8> 5988
+<9ecb> <9ecb> 5989
+<9ed5> <9ed5> 5990
+<9edf> <9edf> 5991
+<9ee4> <9ee4> 5992
+<9ee7> <9ee7> 5993
+<9eec> <9eee> 5994
+<9ef0> <9ef2> 5997
+<9ef5> <9ef5> 6000
+<9ef8> <9ef8> 6001
+<9eff> <9eff> 6002
+<9f02> <9f03> 6003
+<9f09> <9f09> 6005
+<9f0f> <9f12> 6006
+endcidrange
+
+32 begincidrange
+<9f14> <9f14> 6010
+<9f16> <9f17> 6011
+<9f19> <9f1b> 6013
+<9f1f> <9f1f> 6016
+<9f22> <9f22> 6017
+<9f26> <9f26> 6018
+<9f2a> <9f2b> 6019
+<9f2f> <9f2f> 6021
+<9f31> <9f32> 6022
+<9f34> <9f34> 6024
+<9f37> <9f37> 6025
+<9f39> <9f3a> 6026
+<9f3c> <9f3d> 6028
+<9f3f> <9f3f> 6030
+<9f41> <9f41> 6031
+<9f43> <9f47> 6032
+<9f53> <9f53> 6037
+<9f55> <9f58> 6038
+<9f5a> <9f5a> 6042
+<9f5d> <9f5e> 6043
+<9f68> <9f69> 6045
+<9f6d> <9f71> 6047
+<9f73> <9f73> 6052
+<9f75> <9f75> 6053
+<9f7a> <9f7a> 6054
+<9f7d> <9f7d> 6055
+<9f8f> <9f92> 6056
+<9f94> <9f94> 6060
+<9f96> <9f97> 6061
+<9f9e> <9f9e> 6063
+<9fa1> <9fa3> 6064
+<9fa5> <9fa5> 6067
+endcidrange
+endcmap
+CMapName currentdict /CMap defineresource pop
+end
+end
+
+%%EndResource
+%%EOF
diff --git a/src/main/resources/Resources/cmap/UniJIS-UCS2-H b/src/main/resources/Resources/cmap/UniJIS-UCS2-H
new file mode 100644
index 0000000..638a66d
--- /dev/null
+++ b/src/main/resources/Resources/cmap/UniJIS-UCS2-H
@@ -0,0 +1 @@
+%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%IncludeResource: ProcSet (CIDInit) %%BeginResource: CMap (UniJIS-UCS2-H) %%Title: (UniJIS-UCS2-H Adobe Japan1 4) %%Version: 12.001 %%Copyright: ----------------------------------------------------------- %%Copyright: Copyright 1990-2001 Adobe Systems Incorporated. %%Copyright: All Rights Reserved. %%Copyright: %%Copyright: Patents Pending %%Copyright: %%Copyright: NOTICE: All information contained herein is the property %%Copyright: of Adobe Systems Incorporated. %%Copyright: %%Copyright: Permission is granted for redistribution of this file %%Copyright: provided this copyright notice is maintained intact and %%Copyright: that the contents of this file are not altered in any %%Copyright: way from its original form. %%Copyright: %%Copyright: PostScript and Display PostScript are trademarks of %%Copyright: Adobe Systems Incorporated which may be registered in %%Copyright: certain jurisdictions. %%Copyright: ----------------------------------------------------------- %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo 3 dict dup begin /Registry (Adobe) def /Ordering (Japan1) def /Supplement 4 def end def /CMapName /UniJIS-UCS2-H def /CMapVersion 12.001 def /CMapType 1 def /XUID [1 10 25356] def /WMode 0 def 2 begincodespacerange <0000> <D7FF> <E000> <FFFF> endcodespacerange 1 beginnotdefrange <0000> <001f> 1 endnotdefrange 100 begincidrange <0020> <005b> 1 <005c> <005c> 97 <005d> <007e> 62 <00a1> <00a3> 101 <00a4> <00a4> 107 <00a5> <00a5> 61 <00a6> <00a6> 99 <00a7> <00a7> 720 <00a8> <00a8> 647 <00a9> <00a9> 152 <00aa> <00aa> 140 <00ab> <00ab> 109 <00ac> <00ac> 153 <00ad> <00ad> 151 <00ae> <00ae> 154 <00af> <00af> 129 <00b0> <00b0> 707 <00b1> <00b1> 694 <00b2> <00b3> 157 <00b4> <00b4> 645 <00b5> <00b5> 159 <00b6> <00b6> 778 <00b7> <00b7> 117 <00b8> <00b8> 134 <00b9> <00b9> 160 <00ba> <00ba> 144 <00bb> <00bb> 123 <00bc> <00be> 161 <00bf> <00bf> 126 <00c0> <00c5> 164 <00c6> <00c6> 139 <00c7> <00d6> 170 <00d7> <00d7> 695 <00d8> <00d8> 142 <00d9> <00de> 187 <00df> <00df> 150 <00e0> <00e5> 193 <00e6> <00e6> 145 <00e7> <00f6> 199 <00f7> <00f7> 696 <00f8> <00f8> 148 <00f9> <00ff> 216 <0100> <0100> 9366 <0101> <0101> 9361 <0112> <0112> 9369 <0113> <0113> 9364 <011a> <011a> 9395 <011b> <011b> 9407 <0127> <0127> 12092 <0128> <0128> 9400 <0129> <0129> 9412 <012a> <012a> 9367 <012b> <012b> 9362 <0131> <0131> 146 <0141> <0141> 141 <0142> <0142> 147 <014b> <014b> 9436 <014c> <014c> 9370 <014d> <014d> 9365 <0152> <0152> 143 <0153> <0153> 149 <0160> <0160> 223 <0161> <0161> 227 <0168> <0168> 9405 <0169> <0169> 9417 <016a> <016a> 9368 <016b> <016b> 9363 <016e> <016e> 9404 <016f> <016f> 9416 <0178> <0178> 224 <017d> <017d> 225 <017e> <017e> 229 <01c0> <01c0> 99 <01cd> <01cd> 9394 <01ce> <01ce> 9406 <01cf> <01cf> 9398 <01d0> <01d0> 9410 <01d1> <01d1> 9401 <01d2> <01d2> 9413 <01d3> <01d3> 9403 <01d4> <01d4> 9415 <01fd> <01fd> 9421 <0251> <0251> 9418 <0254> <0254> 9423 <0259> <0259> 9426 <025a> <025a> 9429 <025b> <025b> 9432 <0275> <0275> 9437 <0283> <0283> 9442 <028c> <028c> 9438 <0292> <0292> 9441 <02d0> <02d0> 9443 <0300> <0300> 65 <0301> <0302> 127 <0303> <0303> 95 <0304> <0304> 129 <0305> <0305> 226 <0306> <0308> 130 <030a> <030a> 133 <030b> <030b> 135 endcidrange 100 begincidrange <030c> <030c> 137 <0327> <0327> 134 <0328> <0328> 136 <0332> <0332> 64 <0336> <0336> 138 <0361> <0361> 758 <0391> <03a1> 1011 <03a3> <03a9> 1028 <03b1> <03c1> 1035 <03c3> <03c9> 1052 <03d0> <03d0> 12090 <03d1> <03d1> 12096 <03db> <03db> 12095 <0401> <0401> 1065 <0410> <0415> 1059 <0416> <0435> 1066 <0436> <044f> 1099 <0451> <0451> 1098 <045b> <045b> 12092 <1ebc> <1ebc> 9397 <1ebd> <1ebd> 9409 <2002> <2002> 231 <2003> <2003> 633 <2010> <2010> 662 <2011> <2011> 14 <2012> <2012> 114 <2013> <2013> 114 <2014> <2014> 138 <2015> <2015> 661 <2016> <2016> 666 <2018> <2019> 670 <201a> <201a> 120 <201c> <201d> 672 <201e> <201e> 121 <2020> <2021> 776 <2022> <2022> 119 <2025> <2025> 669 <2026> <2026> 668 <2030> <2030> 772 <2032> <2033> 708 <2039> <203a> 110 <203b> <203b> 734 <203c> <203c> 12111 <203e> <203e> 325 <2044> <2044> 104 <2049> <2049> 12112 <2070> <2070> 9377 <2074> <2079> 9378 <2080> <2089> 9384 <20ac> <20ac> 9354 <20dd> <20dd> 779 <2100> <2100> 11855 <2103> <2103> 710 <2105> <2105> 11859 <2109> <2109> 8305 <210a> <210a> 8304 <210f> <210f> 12092 <2113> <2113> 8025 <2116> <2116> 7610 <2121> <2121> 8055 <2122> <2122> 228 <2126> <2126> 9355 <212b> <212b> 771 <2135> <2135> 12089 <2153> <2154> 9375 <215b> <215e> 9371 <2160> <2169> 7575 <216a> <216b> 8225 <2170> <2179> 8092 <217a> <217b> 8298 <217f> <217f> 8303 <2190> <2191> 737 <2192> <2192> 736 <2193> <2193> 739 <2194> <2194> 12201 <2195> <2195> 12215 <2196> <2197> 12204 <2198> <2199> 12202 <21c4> <21c5> 8310 <21c6> <21c6> 8309 <21cc> <21cc> 12206 <21d0> <21d0> 12200 <21d2> <21d2> 752 <21d4> <21d4> 753 <21e6> <21e6> 8013 <21e7> <21e7> 8012 <21e8> <21e8> 8014 <21e9> <21e9> 8011 <2200> <2200> 754 <2202> <2202> 759 <2203> <2203> 755 <2205> <2205> 12184 <2207> <2207> 760 <2208> <2208> 741 <220a> <220a> 12091 <220b> <220b> 742 <2211> <2211> 7625 <2212> <2212> 693 <2213> <2213> 12118 <221a> <221a> 765 endcidrange 100 begincidrange <221d> <221d> 767 <221e> <221e> 703 <221f> <221f> 7629 <2220> <2220> 756 <2225> <2225> 666 <2227> <2228> 749 <2229> <2229> 748 <222a> <222a> 747 <222b> <222c> 769 <222d> <222d> 8195 <222e> <222e> 7624 <2234> <2234> 704 <2235> <2235> 768 <223c> <223c> 665 <223d> <223d> 766 <2243> <2243> 12120 <2252> <2252> 762 <2260> <2260> 698 <2261> <2261> 761 <2266> <2267> 701 <226a> <226b> 763 <2272> <2273> 12121 <2282> <2283> 745 <2286> <2287> 743 <2295> <2295> 12188 <2296> <2296> 12186 <2297> <2297> 12189 <2298> <2298> 12187 <229d> <229d> 12186 <229e> <229e> 12190 <22a0> <22a0> 12185 <22a5> <22a5> 757 <22bf> <22bf> 7630 <22ee> <22ee> 7897 <22ef> <22ef> 668 <2300> <2300> 12184 <2307> <2307> 12219 <2312> <2312> 758 <244a> <244a> 12116 <2460> <2473> 7555 <2474> <2487> 8071 <2488> <2490> 8062 <249c> <24b5> 8112 <24b6> <24cf> 10339 <24d0> <24e9> 10313 <24ea> <24ea> 8224 <2500> <254b> 7479 <2550> <2550> 8251 <255e> <255e> 8252 <2561> <2561> 8254 <256a> <256a> 8253 <256d> <256e> 8247 <256f> <256f> 8250 <2570> <2570> 8249 <2571> <2573> 8261 <2581> <2588> 8230 <2589> <2589> 8244 <258a> <258a> 8243 <258b> <258b> 8242 <258c> <258c> 8241 <258d> <258d> 8240 <258e> <258e> 8239 <258f> <258f> 8238 <2594> <2595> 8245 <25a0> <25a0> 729 <25a1> <25a1> 728 <25a2> <25a2> 8015 <25aa> <25aa> 12239 <25ab> <25ab> 12237 <25b2> <25b2> 731 <25b3> <25b3> 730 <25b6> <25b6> 12195 <25b7> <25b7> 8010 <25bc> <25bc> 733 <25bd> <25bd> 732 <25c0> <25c0> 12194 <25c1> <25c1> 8009 <25c6> <25c6> 727 <25c7> <25c7> 726 <25c9> <25c9> 8210 <25cb> <25cb> 723 <25cc> <25cc> 10502 <25ce> <25ce> 725 <25cf> <25cf> 724 <25e2> <25e3> 8255 <25e4> <25e4> 8258 <25e5> <25e5> 8257 <25e6> <25e6> 12254 <25ef> <25ef> 779 <2600> <2603> 8215 <2605> <2605> 722 <2606> <2606> 721 <260e> <260e> 8056 <2612> <2612> 12185 <261c> <261d> 8220 <261e> <261e> 8219 <261f> <261f> 8222 <2640> <2640> 706 <2642> <2642> 705 <2660> <2660> 8211 endcidrange 100 begincidrange <2661> <2661> 8017 <2662> <2662> 8019 <2663> <2663> 8213 <2664> <2664> 8018 <2665> <2665> 8212 <2666> <2666> 8214 <2667> <2667> 8016 <2668> <2669> 12098 <266a> <266a> 775 <266c> <266c> 12100 <266d> <266d> 774 <266f> <266f> 773 <2702> <2702> 12176 <271a> <271a> 12241 <2756> <2756> 12259 <2776> <277e> 8286 <27a1> <27a1> 8206 <2e83> <2e83> 14305 <2e85> <2e85> 13856 <2e87> <2e87> 14105 <2e89> <2e89> 14356 <2e8b> <2e8b> 14110 <2e8c> <2e8d> 13833 <2e8e> <2e8e> 4209 <2e8f> <2e8f> 14476 <2e90> <2e90> 4646 <2e92> <2e92> 3762 <2e93> <2e93> 4739 <2e94> <2e94> 4779 <2e95> <2e95> 15391 <2e96> <2e96> 14530 <2e97> <2e97> 13852 <2e98> <2e98> 14561 <2e99> <2e99> 5059 <2e9b> <2e9b> 5089 <2e9f> <2e9f> 3644 <2ea0> <2ea0> 3773 <2ea1> <2ea2> 14689 <2ea3> <2ea3> 14749 <2ea4> <2ea4> 15398 <2ea6> <2ea6> 14157 <2ea8> <2ea8> 14780 <2ea9> <2ea9> 13729 <2eaa> <2eaa> 13995 <2eab> <2eab> 14999 <2eac> <2eac> 2260 <2ead> <2ead> 14905 <2eae> <2eae> 13922 <2eb1> <2eb1> 15000 <2eb2> <2eb2> 14999 <2eb3> <2eb3> 14189 <2eb7> <2eb7> 14078 <2eb9> <2eb9> 14099 <2ebc> <2ebc> 13747 <2ebd> <2ebd> 13646 <2ebe> <2ec0> 14197 <2ec1> <2ec1> 1931 <2ec2> <2ec2> 15114 <2ec3> <2ec3> 13870 <2ec4> <2ec4> 2658 <2ec6> <2ec6> 13682 <2eca> <2eca> 13898 <2ecc> <2ecc> 15403 <2ecd> <2ecd> 15184 <2ecf> <2ecf> 15262 <2ed1> <2ed1> 3029 <2ed2> <2ed2> 15255 <2ed6> <2ed6> 15262 <2ed7> <2ed7> 13645 <2ed8> <2ed8> 2664 <2edd> <2edd> 13847 <2ede> <2ede> 13849 <2edf> <2edf> 13848 <2ee4> <2ee4> 1614 <2ee8> <2ee8> 3380 <2ee9> <2ee9> 1323 <2eeb> <2eeb> 2666 <2eed> <2eed> 2243 <2eef> <2eef> 3965 <2ef2> <2ef2> 1615 <2f00> <2f00> 1200 <2f01> <2f01> 8371 <2f02> <2f02> 4095 <2f03> <2f03> 4097 <2f04> <2f04> 1333 <2f05> <2f05> 4102 <2f06> <2f06> 3275 <2f07> <2f07> 4110 <2f08> <2f08> 2579 <2f09> <2f09> 4208 <2f0a> <2f0a> 3286 <2f0b> <2f0b> 3392 <2f0c> <2f0c> 4219 <2f0d> <2f0d> 4227 <2f0e> <2f0e> 4233 <2f0f> <2f0f> 4243 <2f10> <2f10> 4248 <2f11> <2f11> 3163 <2f12> <2f12> 3991 <2f13> <2f13> 4294 endcidrange 100 begincidrange <2f14> <2f15> 4301 <2f16> <2f16> 4307 <2f17> <2f17> 2375 <2f18> <2f18> 3708 <2f19> <2f19> 4316 <2f1a> <2f1a> 4321 <2f1b> <2f1b> 4328 <2f1c> <2f1c> 3746 <2f1d> <2f1d> 1969 <2f1e> <2f1e> 4459 <2f1f> <2f1f> 3156 <2f20> <2f20> 2204 <2f21> <2f22> 4538 <2f23> <2f23> 3878 <2f24> <2f24> 2887 <2f25> <2f25> 2433 <2f26> <2f26> 2208 <2f27> <2f27> 4622 <2f28> <2f28> 2631 <2f29> <2f29> 2454 <2f2a> <2f2a> 4646 <2f2b> <2f2b> 4648 <2f2c> <2f2c> 4658 <2f2d> <2f2d> 2177 <2f2e> <2f2e> 4716 <2f2f> <2f2f> 1979 <2f30> <2f30> 1918 <2f31> <2f31> 1738 <2f32> <2f32> 1519 <2f33> <2f33> 4739 <2f34> <2f34> 4741 <2f35> <2f35> 4761 <2f36> <2f36> 4763 <2f37> <2f37> 4768 <2f38> <2f38> 1655 <2f39> <2f39> 14521 <2f3a> <2f3a> 4783 <2f3b> <2f3b> 4785 <2f3c> <2f3c> 2554 <2f3d> <2f3d> 4930 <2f3e> <2f3e> 1921 <2f3f> <2f3f> 2326 <2f40> <2f40> 2215 <2f41> <2f41> 5058 <2f42> <2f42> 3592 <2f43> <2f43> 3143 <2f44> <2f44> 1740 <2f45> <2f45> 3661 <2f46> <2f46> 5088 <2f47> <2f47> 3284 <2f48> <2f48> 5132 <2f49> <2f49> 1860 <2f4a> <2f4a> 3814 <2f4b> <2f4b> 1853 <2f4c> <2f4c> 2221 <2f4d> <2f4d> 5349 <2f4e> <2f4e> 5364 <2f4f> <2f4f> 5368 <2f50> <2f50> 3450 <2f51> <2f51> 3807 <2f52> <2f52> 2223 <2f53> <2f53> 5378 <2f54> <2f54> 2603 <2f55> <2f55> 1360 <2f56> <2f56> 3066 <2f57> <2f57> 3541 <2f58> <2f58> 5604 <2f59> <2f59> 5606 <2f5a> <2f5a> 3618 <2f5b> <2f5b> 1383 <2f5c> <2f5c> 1671 <2f5d> <2f5d> 1880 <2f5e> <2f5e> 1904 <2f5f> <2f5f> 1732 <2f60> <2f60> 1245 <2f61> <2f61> 1504 <2f62> <2f62> 1537 <2f63> <2f63> 2652 <2f64> <2f64> 3899 <2f65> <2f65> 3134 <2f66> <2f66> 3479 <2f67> <2f67> 14848 <2f68> <2f68> 5783 <2f69> <2f69> 3368 <2f6a> <2f6a> 3453 <2f6b> <2f6b> 2172 <2f6c> <2f6c> 3816 <2f6d> <2f6d> 3779 <2f6e> <2f6e> 3836 <2f6f> <2f6f> 2676 <2f70> <2f70> 2260 <2f71> <2f71> 14913 <2f72> <2f72> 1363 <2f73> <2f73> 1856 <2f74> <2f74> 3953 <2f75> <2f75> 2971 <2f76> <2f76> 3606 <2f77> <2f77> 2227 <2f78> <2f78> 1544 <2f79> <2f79> 6163 endcidrange 100 begincidrange <2f7a> <2f7a> 3901 <2f7b> <2f7b> 1227 <2f7c> <2f7c> 4061 <2f7d> <2f7d> 2261 <2f7e> <2f7e> 6205 <2f7f> <2f7f> 2262 <2f80> <2f80> 6227 <2f81> <2f81> 3281 <2f82> <2f82> 2569 <2f83> <2f83> 2263 <2f84> <2f84> 2232 <2f85> <2f85> 1235 <2f86> <2f86> 2697 <2f87> <2f87> 2726 <2f88> <2f88> 2360 <2f89> <2f89> 2081 <2f8a> <2f8a> 2541 <2f8b> <2f8b> 6322 <2f8c> <2f8c> 6479 <2f8d> <2f8d> 2988 <2f8e> <2f8e> 1858 <2f8f> <2f8f> 2022 <2f90> <2f90> 1189 <2f91> <2f91> 6635 <2f92> <2f92> 1887 <2f93> <2f93> 1455 <2f94> <2f94> 1908 <2f95> <2f95> 2921 <2f96> <2f96> 3198 <2f97> <2f97> 6742 <2f98> <2f98> 6745 <2f99> <2f99> 1419 <2f9a> <2f9a> 2682 <2f9b> <2f9b> 2808 <2f9c> <2f9c> 2829 <2f9d> <2f9d> 2574 <2f9e> <2f9e> 2306 <2f9f> <2f9f> 2575 <2fa0> <2fa0> 2914 <2fa1> <2fa1> 15183 <2fa2> <2fa2> 3874 <2fa3> <2fa3> 3243 <2fa4> <2fa4> 3428 <2fa5> <2fa5> 3948 <2fa6> <2fa6> 1754 <2fa7> <2fa7> 3029 <2fa8> <2fa8> 3827 <2fa9> <2fa9> 3550 <2faa> <2faa> 7113 <2fab> <2fab> 7115 <2fac> <2fac> 1229 <2fad> <2fad> 8695 <2fae> <2fae> 3463 <2faf> <2faf> 3800 <2fb0> <2fb0> 1461 <2fb1> <2fb1> 7171 <2fb2> <2fb2> 7173 <2fb3> <2fb3> 1339 <2fb4> <2fb4> 3607 <2fb5> <2fb5> 3561 <2fb6> <2fb6> 3464 <2fb7> <2fb7> 2543 <2fb8> <2fb8> 2335 <2fb9> <2fb9> 2035 <2fba> <2fba> 3333 <2fbb> <2fbb> 2062 <2fbc> <2fbc> 2036 <2fbd> <2fbd> 7276 <2fbe> <2fbe> 7293 <2fbf> <2fc0> 7299 <2fc1> <2fc1> 1614 <2fc2> <2fc2> 1685 <2fc3> <2fc3> 3031 <2fc4> <2fc4> 7414 <2fc5> <2fc5> 2267 <2fc6> <2fc6> 7425 <2fc7> <2fc7> 3729 <2fc8> <2fc8> 13323 <2fc9> <2fc9> 1642 <2fca> <2fca> 2055 <2fcb> <2fcb> 7446 <2fcc> <2fcc> 7449 <2fcd> <2fcd> 3102 <2fce> <2fce> 1937 <2fcf> <2fcf> 2767 <2fd0> <2fd0> 3475 <2fd1> <2fd2> 7457 <2fd3> <2fd3> 3966 <2fd4> <2fd5> 7472 <3000> <3002> 633 <3003> <3003> 655 <3004> <3004> 8308 <3005> <3007> 657 <3008> <3011> 682 <3012> <3012> 735 <3013> <3013> 740 <3014> <3015> 676 <301c> <301c> 665 <301d> <301d> 7608 <301f> <301f> 7609 endcidrange 100 begincidrange <3020> <3020> 8058 <3030> <3030> 12218 <3033> <3035> 12108 <3036> <3036> 8057 <3041> <3093> 842 <3094> <3094> 7958 <309b> <309c> 643 <309d> <309e> 653 <30a1> <30f6> 925 <30f7> <30fa> 8313 <30fb> <30fb> 638 <30fc> <30fc> 660 <30fd> <30fe> 651 <3220> <3229> 10126 <322a> <322f> 8198 <3230> <3230> 8197 <3231> <3232> 7618 <3233> <3233> 8143 <3234> <3234> 8141 <3235> <3235> 8148 <3236> <3236> 8147 <3237> <3237> 8204 <3238> <3238> 8142 <3239> <3239> 7620 <323a> <323a> 8151 <323b> <323b> 8149 <323c> <323c> 8144 <323d> <323d> 8139 <323e> <323e> 8146 <323f> <323f> 8140 <3240> <3240> 8150 <3241> <3241> 8205 <3242> <3242> 8145 <3243> <3243> 8138 <3280> <3289> 10461 <328a> <328f> 10472 <3290> <3290> 10471 <3291> <3291> 8161 <3292> <3292> 8160 <3293> <3293> 8162 <3294> <3294> 8156 <3295> <3295> 10495 <3296> <3296> 8165 <3297> <3297> 10492 <3298> <3298> 8158 <3299> <3299> 8223 <329a> <329a> 10489 <329b> <329b> 10488 <329c> <329c> 10494 <329d> <329d> 8319 <329e> <329e> 8191 <329f> <329f> 10479 <32a0> <32a1> 10486 <32a2> <32a2> 10491 <32a3> <32a3> 10490 <32a4> <32a8> 7613 <32a9> <32a9> 8154 <32aa> <32aa> 8157 <32ab> <32ab> 8159 <32ac> <32ac> 8163 <32ad> <32ad> 8153 <32ae> <32ae> 8164 <32af> <32af> 8155 <32b0> <32b0> 8152 <32d0> <32fe> 10413 <3300> <3300> 8048 <3301> <3302> 11874 <3303> <3303> 8042 <3304> <3304> 11876 <3305> <3305> 8183 <3306> <3306> 11877 <3307> <3307> 11881 <3308> <3308> 11879 <3309> <3309> 11884 <330a> <330a> 11882 <330b> <330b> 11886 <330c> <330c> 11888 <330d> <330d> 7595 <330e> <3313> 11889 <3314> <3314> 7586 <3315> <3315> 8041 <3316> <3316> 8039 <3317> <3317> 11896 <3318> <3318> 8040 <3319> <3319> 11898 <331a> <331d> 11900 <331e> <331e> 8051 <331f> <3321> 11904 <3322> <3322> 8038 <3323> <3323> 8043 <3324> <3324> 11907 <3325> <3325> 11909 <3326> <3326> 7596 <3327> <3327> 7590 <3328> <3329> 11912 <332a> <332a> 8052 <332b> <332b> 7598 <332d> <332d> 11915 <332e> <3330> 11918 <3331> <3331> 8049 endcidrange 100 begincidrange <3332> <3332> 11921 <3333> <3333> 8327 <3334> <3335> 11924 <3336> <3336> 7592 <3337> <3337> 11930 <3338> <3338> 11932 <3339> <3339> 8046 <333a> <333a> 11933 <333b> <333b> 8047 <333c> <333c> 11926 <333d> <333d> 11934 <333e> <3340> 11936 <3341> <3341> 11935 <3342> <3342> 8045 <3343> <3346> 11939 <3347> <3347> 8050 <3348> <3348> 11943 <3349> <3349> 7585 <334a> <334a> 7599 <334b> <334c> 11944 <334d> <334d> 7588 <334e> <334e> 8328 <334f> <3350> 11946 <3351> <3351> 7593 <3352> <3352> 11950 <3353> <3353> 11954 <3354> <3354> 11951 <3355> <3356> 11955 <3357> <3357> 8044 <3371> <3371> 11861 <337b> <337b> 8323 <337c> <337c> 7623 <337d> <337d> 7622 <337e> <337e> 7621 <337f> <337f> 8054 <3385> <3387> 8031 <3388> <3389> 8192 <338d> <338d> 11864 <338e> <338f> 7604 <3390> <3390> 8035 <3396> <3396> 8037 <3397> <3397> 8024 <3398> <3398> 8026 <339b> <339b> 11865 <339c> <339e> 7601 <339f> <339f> 8186 <33a0> <33a0> 8020 <33a1> <33a1> 7607 <33a2> <33a2> 8021 <33a3> <33a3> 8187 <33a4> <33a5> 8022 <33a6> <33a6> 8188 <33b0> <33b0> 8030 <33b1> <33b1> 8029 <33b2> <33b2> 8028 <33b3> <33b3> 8027 <33c2> <33c2> 11856 <33c4> <33c4> 7606 <33c8> <33c8> 8194 <33cb> <33cb> 8034 <33cc> <33cc> 8182 <33cd> <33cd> 7611 <33d4> <33d4> 8036 <33d7> <33d8> 11869 <33da> <33da> 11851 <3402> <3402> 13698 <3405> <3405> 15387 <3427> <3427> 13910 <3488> <3488> 15442 <34db> <34db> 15425 <351f> <351f> 13865 <353e> <353e> 14110 <378d> <378d> 13850 <37e2> <37e2> 14123 <3af3> <3af3> 15424 <3b22> <3b22> 15433 <3b88> <3b88> 13965 <3e8a> <3e8a> 15427 <3eda> <3eda> 15432 <3fb1> <3fb1> 14164 <4093> <4093> 15436 <4103> <4103> 15439 <4264> <4264> 14176 <4293> <4293> 15440 <440c> <440c> 15426 <4453> <4453> 14195 <457a> <457a> 15435 <4665> <4665> 15438 <46ae> <46ae> 15441 <4be8> <4be8> 15430 <4e00> <4e00> 1200 <4e01> <4e01> 3000 <4e03> <4e03> 2275 <4e04> <4e05> 14296 <4e07> <4e07> 3754 <4e08> <4e08> 2510 <4e09> <4e09> 2174 <4e0a> <4e0a> 2509 <4e0b> <4e0b> 1340 <4e0d> <4e0d> 3526 endcidrange 100 begincidrange <4e0e> <4e0e> 3881 <4e10> <4e10> 4091 <4e11> <4e11> 1233 <4e14> <4e14> 1484 <4e15> <4e15> 4092 <4e16> <4e16> 2632 <4e17> <4e17> 4311 <4e18> <4e18> 1648 <4e19> <4e19> 3594 <4e1e> <4e1e> 2511 <4e1f> <4e1f> 14298 <4e21> <4e21> 3974 <4e26> <4e26> 3602 <4e28> <4e28> 8371 <4e2a> <4e2a> 4093 <4e2b> <4e2b> 14299 <4e2c> <4e2c> 14157 <4e2d> <4e2d> 2980 <4e2f> <4e30> 14300 <4e31> <4e31> 4094 <4e32> <4e32> 1778 <4e36> <4e36> 4095 <4e37> <4e37> 13981 <4e38> <4e38> 1561 <4e39> <4e39> 2926 <4e3b> <4e3b> 2323 <4e3c> <4e3c> 4096 <4e3f> <4e3f> 4097 <4e40> <4e41> 14302 <4e42> <4e42> 4098 <4e43> <4e43> 3307 <4e44> <4e44> 14304 <4e45> <4e45> 1649 <4e48> <4e48> 14126 <4e4b> <4e4b> 3309 <4e4d> <4e4d> 3259 <4e4e> <4e4e> 1911 <4e4f> <4e4f> 3681 <4e55> <4e55> 6480 <4e56> <4e56> 4099 <4e57> <4e57> 2512 <4e58> <4e58> 4100 <4e59> <4e59> 1333 <4e5a> <4e5a> 14305 <4e5d> <4e5d> 1757 <4e5e> <4e5e> 1956 <4e5f> <4e5f> 3829 <4e62> <4e62> 4659 <4e71> <4e71> 3930 <4e73> <4e73> 3285 <4e7e> <4e7e> 1505 <4e7f> <4e7f> 14306 <4e80> <4e80> 1615 <4e82> <4e82> 4101 <4e85> <4e85> 4102 <4e86> <4e86> 3971 <4e88> <4e88> 3879 <4e89> <4e89> 2794 <4e8a> <4e8a> 4104 <4e8b> <4e8b> 2244 <4e8c> <4e8c> 3275 <4e8d> <4e8d> 14307 <4e8e> <4e8e> 4107 <4e91> <4e91> 1248 <4e92> <4e92> 1939 <4e94> <4e94> 1938 <4e95> <4e95> 1194 <4e96> <4e96> 14308 <4e98> <4e98> 4081 <4e99> <4e99> 4080 <4e9b> <4e9b> 2083 <4e9c> <4e9c> 1125 <4e9e> <4ea0> 4108 <4ea1> <4ea1> 3682 <4ea2> <4ea2> 4111 <4ea4> <4ea4> 1958 <4ea5> <4ea5> 1195 <4ea6> <4ea6> 3744 <4ea8> <4ea8> 1686 <4eab> <4eac> 1687 <4ead> <4ead> 3070 <4eae> <4eae> 3972 <4eb0> <4eb0> 4112 <4eb3> <4eb3> 4113 <4eb6> <4eb6> 4114 <4eb9> <4eb9> 14309 <4eba> <4eba> 2579 <4ebb> <4ebb> 13856 <4ec0> <4ec0> 2372 <4ec1> <4ec1> 2580 <4ec2> <4ec2> 4119 <4ec4> <4ec4> 4117 <4ec6> <4ec6> 4118 <4ec7> <4ec7> 1650 <4eca> <4eca> 2067 <4ecb> <4ecb> 1392 <4ecd> <4ecd> 4116 <4ece> <4ece> 4115 <4ecf> <4ecf> 3577 <4ed0> <4ed0> 14310 endcidrange 100 begincidrange <4ed4> <4ed4> 2196 <4ed5> <4ed5> 2195 <4ed6> <4ed6> 2846 <4ed7> <4ed7> 4120 <4ed8> <4ed8> 3527 <4ed9> <4ed9> 2699 <4edd> <4edd> 656 <4ede> <4ede> 4121 <4edf> <4edf> 4123 <4ee0> <4ee0> 14311 <4ee1> <4ee1> 8372 <4ee3> <4ee3> 2885 <4ee4> <4ee4> 4009 <4ee5> <4ee5> 1166 <4eed> <4eed> 4122 <4eee> <4eee> 1342 <4ef0> <4ef0> 1724 <4ef2> <4ef2> 2981 <4ef6> <4ef6> 1861 <4ef7> <4ef7> 4124 <4efb> <4efb> 3290 <4efc> <4efc> 8373 <4efd> <4efd> 14312 <4eff> <4eff> 14313 <4f00> <4f00> 8374 <4f01> <4f01> 1575 <4f03> <4f03> 8375 <4f09> <4f09> 4125 <4f0a> <4f0a> 1167 <4f0b> <4f0b> 14314 <4f0d> <4f0d> 1940 <4f0e> <4f0e> 1576 <4f0f> <4f0f> 3564 <4f10> <4f10> 3398 <4f11> <4f11> 1651 <4f15> <4f15> 14315 <4f1a> <4f1a> 1393 <4f1c> <4f1c> 4160 <4f1d> <4f1d> 3131 <4f2f> <4f2f> 3362 <4f30> <4f30> 4127 <4f34> <4f34> 3408 <4f36> <4f36> 4010 <4f38> <4f38> 2547 <4f39> <4f39> 8376 <4f3a> <4f3a> 2197 <4f3b> <4f3b> 14317 <4f3c> <4f3c> 2245 <4f3d> <4f3d> 1344 <4f43> <4f43> 3053 <4f46> <4f46> 2912 <4f47> <4f47> 4131 <4f49> <4f49> 14318 <4f4d> <4f4d> 1168 <4f4e> <4f4e> 3071 <4f4f> <4f4f> 2373 <4f50> <4f50> 2084 <4f51> <4f51> 3854 <4f53> <4f53> 2862 <4f54> <4f54> 14319 <4f55> <4f55> 1343 <4f56> <4f56> 8377 <4f57> <4f57> 4130 <4f59> <4f59> 3880 <4f5a> <4f5a> 4126 <4f5b> <4f5b> 4128 <4f5c> <4f5c> 2142 <4f5d> <4f5d> 4129 <4f5e> <4f5e> 4563 <4f60> <4f60> 14316 <4f69> <4f69> 4137 <4f6f> <4f6f> 4140 <4f70> <4f70> 4138 <4f73> <4f73> 1346 <4f75> <4f75> 3595 <4f76> <4f76> 4132 <4f7a> <4f7a> 14320 <4f7b> <4f7b> 4136 <4f7c> <4f7c> 1959 <4f7d> <4f7e> 14321 <4f7f> <4f7f> 2198 <4f83> <4f83> 1506 <4f86> <4f86> 4141 <4f88> <4f88> 4133 <4f8a> <4f8a> 8379 <4f8b> <4f8b> 4011 <4f8d> <4f8d> 2246 <4f8f> <4f8f> 4134 <4f91> <4f91> 4139 <4f92> <4f92> 8378 <4f94> <4f94> 8381 <4f96> <4f96> 4142 <4f97> <4f97> 14323 <4f98> <4f98> 4135 <4f9a> <4f9a> 8380 <4f9b> <4f9b> 1689 <4f9d> <4f9d> 1169 <4fa0> <4fa0> 1690 <4fa1> <4fa1> 1345 <4fab> <4fab> 4564 endcidrange 100 begincidrange <4fad> <4fad> 3751 <4fae> <4fae> 3552 <4faf> <4faf> 1960 <4fb5> <4fb5> 2549 <4fb6> <4fb6> 3967 <4fbe> <4fbe> 14324 <4fbf> <4fbf> 3624 <4fc2> <4fc2> 1806 <4fc3> <4fc3> 2821 <4fc4> <4fc4> 1380 <4fc9> <4fc9> 8364 <4fca> <4fca> 2397 <4fcd> <4fcd> 8382 <4fce> <4fce> 4146 <4fcf> <4fcf> 14325 <4fd0> <4fd0> 4151 <4fd1> <4fd1> 4149 <4fd3> <4fd3> 15407 <4fd4> <4fd4> 4144 <4fd7> <4fd7> 2831 <4fd8> <4fd8> 4147 <4fda> <4fda> 4150 <4fdb> <4fdb> 4148 <4fdd> <4fdd> 3629 <4fdf> <4fdf> 4145 <4fe0> <4fe0> 7660 <4fe1> <4fe1> 2548 <4fe3> <4fe3> 3745 <4fe4> <4fe5> 4152 <4fee> <4fee> 2350 <4fef> <4fef> 4166 <4ff3> <4ff3> 3334 <4ff5> <4ff5> 3496 <4ff6> <4ff6> 4161 <4ff8> <4ff8> 3648 <4ffa> <4ffa> 1334 <4ffd> <4ffd> 14326 <4ffe> <4ffe> 4165 <4fff> <4fff> 8385 <5000> <5001> 14327 <5002> <5002> 13383 <5005> <5005> 4159 <5006> <5006> 4168 <5009> <5009> 2772 <500b> <500b> 1912 <500d> <500d> 3346 <500f> <500f> 5632 <5010> <5010> 14329 <5011> <5011> 4167 <5012> <5012> 3159 <5014> <5014> 4156 <5016> <5016> 1962 <5019> <5019> 1961 <501a> <501a> 4154 <501b> <501b> 14330 <501e> <501e> 8386 <501f> <501f> 2310 <5021> <5021> 4162 <5022> <5022> 8384 <5023> <5023> 3647 <5024> <5024> 2955 <5025> <5025> 4158 <5026> <5026> 1863 <5027> <5027> 14331 <5028> <5028> 4155 <5029> <5029> 4163 <502a> <502a> 4157 <502b> <502b> 3993 <502c> <502c> 4164 <502d> <502d> 4071 <502e> <502e> 14332 <5036> <5036> 1758 <5039> <5039> 1862 <503b> <503b> 14336 <5040> <5040> 8383 <5042> <5042> 8389 <5043> <5043> 4169 <5046> <5046> 8387 <5047> <5047> 4170 <5048> <5048> 4174 <5049> <5049> 1170 <504f> <504f> 3616 <5050> <5050> 4173 <5055> <5055> 4172 <5056> <5056> 4176 <5057> <5057> 14333 <505a> <505a> 4175 <505c> <505c> 3072 <5065> <5065> 1864 <5066> <5066> 14334 <506a> <506a> 14335 <506c> <506c> 4177 <5070> <5070> 8388 <5072> <5072> 2289 <5074> <5074> 2822 <5075> <5075> 3073 <5076> <5076> 1774 <5078> <5078> 4178 <507d> <507d> 1616 <5080> <5080> 4179 endcidrange 100 begincidrange <5085> <5085> 4181 <508d> <508d> 3683 <508f> <508f> 14337 <5091> <5091> 1852 <5094> <5094> 8390 <5096> <5096> 14338 <5098> <5098> 2175 <5099> <5099> 3467 <509a> <509a> 4180 <509c> <509c> 14339 <50ac> <50ac> 2101 <50ad> <50ad> 3885 <50b2> <50b2> 4183 <50b3> <50b3> 4186 <50b4> <50b4> 4182 <50b5> <50b5> 2100 <50b7> <50b7> 2439 <50be> <50be> 1807 <50c2> <50c2> 4187 <50c5> <50c5> 1735 <50c9> <50ca> 4184 <50cc> <50cc> 14340 <50cd> <50cd> 3207 <50cf> <50cf> 2814 <50d1> <50d1> 1691 <50d5> <50d5> 3707 <50d6> <50d6> 4188 <50d8> <50d8> 8392 <50d9> <50d9> 15408 <50da> <50da> 3973 <50de> <50de> 4189 <50e3> <50e3> 4192 <50e5> <50e5> 4190 <50e6> <50e6> 14341 <50e7> <50e7> 2768 <50e9> <50e9> 14342 <50ed> <50ed> 4191 <50ee> <50ee> 4193 <50ef> <50ef> 14343 <50f0> <50f0> 15409 <50f4> <50f4> 8391 <50f5> <50f5> 4195 <50f9> <50f9> 4194 <50fb> <50fb> 3608 <5100> <5100> 1617 <5101> <5102> 4197 <5104> <5104> 1327 <5108> <5108> 14344 <5109> <5109> 4196 <510b> <510b> 14345 <5110> <5110> 14346 <5112> <5112> 2336 <5114> <5114> 4201 <5115> <5115> 4200 <5116> <5116> 4199 <5118> <5118> 4143 <511a> <511a> 4202 <511b> <511b> 14347 <511e> <511e> 14348 <511f> <511f> 2440 <5121> <5121> 4203 <512a> <512a> 3855 <5132> <5132> 3813 <5137> <5137> 4205 <513a> <513a> 4204 <513b> <513b> 4207 <513c> <513c> 4206 <513f> <5140> 4208 <5141> <5141> 1208 <5143> <5143> 1897 <5144> <5144> 1809 <5145> <5145> 2374 <5146> <5146> 3001 <5147> <5147> 1692 <5148> <5148> 2700 <5149> <5149> 1963 <514a> <514a> 8393 <514b> <514b> 2048 <514c> <514c> 4211 <514d> <514d> 3796 <514e> <514e> 3136 <5150> <5150> 2247 <5152> <5152> 4210 <5154> <5154> 4212 <515a> <515a> 3160 <515c> <515c> 1491 <515f> <515f> 14349 <5162> <5162> 4213 <5164> <5164> 8394 <5165> <5165> 3286 <5167> <5167> 13966 <5168> <5168> 2742 <5169> <516a> 4215 <516b> <516b> 3392 <516c> <516c> 1964 <516d> <516d> 4065 <516e> <516e> 4217 <5171> <5171> 1694 <5175> <5175> 3596 <5176> <5176> 2838 endcidrange 100 begincidrange <5177> <5177> 1769 <5178> <5178> 3119 <5179> <5179> 14201 <517c> <517c> 1865 <5180> <5180> 4218 <5182> <5182> 4219 <5185> <5185> 3258 <5186> <5186> 1281 <5189> <5189> 4222 <518a> <518a> 2157 <518c> <518c> 4221 <518d> <518d> 2102 <518f> <518f> 4223 <5190> <5190> 6235 <5191> <5191> 4224 <5192> <5192> 3695 <5193> <5193> 4225 <5195> <5196> 4226 <5197> <5197> 2513 <5199> <5199> 2296 <519d> <519d> 8395 <51a0> <51a0> 1507 <51a1> <51a1> 14350 <51a2> <51a2> 4230 <51a4> <51a4> 4228 <51a5> <51a5> 3785 <51a6> <51a6> 4229 <51a8> <51a8> 3532 <51a9> <51ab> 4231 <51ac> <51ac> 3161 <51b0> <51b0> 4237 <51b1> <51b2> 4235 <51b3> <51b3> 4234 <51b4> <51b4> 2131 <51b5> <51b5> 4238 <51b6> <51b6> 3830 <51b7> <51b7> 4012 <51bc> <51bc> 14351 <51bd> <51bd> 4239 <51be> <51be> 8396 <51c3> <51c3> 15410 <51c4> <51c4> 2636 <51c5> <51c5> 4240 <51c6> <51c6> 2404 <51c9> <51c9> 4241 <51cb> <51cb> 3002 <51cc> <51cc> 3975 <51cd> <51cd> 3162 <51d6> <51d6> 4314 <51db> <51db> 4242 <51dc> <51dc> 8284 <51dd> <51dd> 1725 <51de> <51de> 14352 <51e0> <51e0> 4243 <51e1> <51e1> 3724 <51e6> <51e6> 2418 <51e7> <51e7> 2908 <51e9> <51e9> 4245 <51ea> <51ea> 3260 <51ec> <51ec> 8397 <51ed> <51ed> 4246 <51ee> <51ee> 14353 <51f0> <51f0> 4247 <51f1> <51f1> 1420 <51f4> <51f4> 14354 <51f5> <51f5> 4248 <51f6> <51f6> 1695 <51f8> <51f8> 3236 <51f9> <51f9> 1308 <51fa> <51fa> 2394 <51fd> <51fd> 3381 <51fe> <51fe> 4249 <5200> <5200> 3163 <5201> <5202> 14355 <5203> <5203> 2581 <5204> <5204> 4250 <5206> <5206> 3580 <5207> <5207> 2686 <5208> <5208> 1502 <520a> <520a> 1509 <520b> <520b> 4251 <520e> <520e> 4253 <5211> <5211> 1808 <5213> <5213> 14357 <5214> <5214> 4252 <5215> <5215> 8398 <5217> <5217> 4027 <521d> <521d> 2419 <5224> <5224> 3409 <5225> <5225> 3612 <5227> <5227> 4254 <5229> <5229> 3938 <522a> <522a> 4255 <522e> <522e> 4256 <5230> <5230> 3192 <5233> <5233> 4257 <5236> <5236> 2637 <5237> <5237> 2158 <5238> <5238> 1866 <5239> <5239> 4258 endcidrange 100 begincidrange <523a> <523a> 2199 <523b> <523b> 2049 <5243> <5243> 3074 <5244> <5244> 4260 <5247> <5247> 2823 <5249> <5249> 14358 <524a> <524a> 2143 <524b> <524c> 4261 <524d> <524d> 2738 <524f> <524f> 4259 <5254> <5254> 4264 <5256> <5256> 3684 <525b> <525b> 2038 <525d> <525d> 7774 <525e> <525e> 4263 <5261> <5261> 14359 <5263> <5263> 1867 <5264> <5264> 2126 <5265> <5265> 3363 <5266> <5266> 14360 <5269> <5269> 4267 <526a> <526a> 4265 <526f> <526f> 3565 <5270> <5270> 2514 <5271> <5271> 4274 <5272> <5272> 1474 <5273> <5273> 4268 <5274> <5274> 4266 <5275> <5275> 2769 <527d> <527d> 4270 <527f> <527f> 4269 <5283> <5283> 1442 <5287> <5287> 1846 <5288> <5288> 4275 <5289> <5289> 3957 <528d> <528d> 4271 <5291> <5291> 4276 <5292> <5292> 4273 <5293> <5293> 14361 <5294> <5294> 4272 <529b> <529b> 3991 <529c> <529c> 8399 <529f> <529f> 1965 <52a0> <52a0> 1347 <52a3> <52a3> 4028 <52a6> <52a6> 8400 <52a9> <52a9> 2431 <52aa> <52aa> 3154 <52ab> <52ab> 2039 <52ac> <52ad> 4279 <52af> <52af> 8573 <52b1> <52b1> 4013 <52b4> <52b4> 4049 <52b5> <52b5> 4282 <52b9> <52b9> 1966 <52bc> <52bc> 4281 <52be> <52be> 1421 <52c0> <52c0> 8401 <52c1> <52c1> 4283 <52c3> <52c3> 3716 <52c5> <52c5> 3032 <52c7> <52c7> 3856 <52c8> <52c8> 14362 <52c9> <52c9> 3625 <52cd> <52cd> 4284 <52d0> <52d0> 14056 <52d2> <52d2> 7150 <52d5> <52d5> 3208 <52d7> <52d7> 4285 <52d8> <52d8> 1510 <52d9> <52d9> 3775 <52db> <52db> 8402 <52dd> <52dd> 2441 <52de> <52de> 4286 <52df> <52df> 3639 <52e0> <52e0> 4290 <52e2> <52e2> 2638 <52e3> <52e3> 4287 <52e4> <52e4> 1736 <52e6> <52e6> 4288 <52e7> <52e7> 1511 <52f0> <52f0> 14363 <52f2> <52f2> 1796 <52f3> <52f3> 4291 <52f5> <52f5> 4292 <52f8> <52f9> 4293 <52fa> <52fa> 2311 <52fe> <52fe> 1967 <52ff> <52ff> 3818 <5300> <5300> 8403 <5301> <5301> 3828 <5302> <5302> 3279 <5305> <5305> 3649 <5306> <5306> 4295 <5307> <5307> 8404 <5308> <5308> 4296 <530a> <530b> 14364 <530d> <530d> 4298 <530f> <530f> 4300 <5310> <5310> 4299 endcidrange 100 begincidrange <5315> <5315> 4301 <5316> <5316> 1341 <5317> <5317> 3706 <5319> <5319> 2156 <531a> <531a> 4302 <531d> <531d> 2779 <5320> <5320> 2442 <5321> <5321> 1697 <5323> <5323> 4303 <5324> <5324> 8405 <532a> <532a> 3439 <532f> <532f> 4304 <5331> <5331> 4305 <5333> <5333> 4306 <5338> <5338> 4307 <5339> <5339> 3478 <533a> <533a> 1760 <533b> <533b> 1193 <533e> <533e> 14366 <533f> <533f> 3223 <5340> <5340> 4308 <5341> <5341> 2375 <5343> <5343> 2701 <5345> <5345> 4310 <5346> <5346> 4309 <5347> <5347> 2443 <5348> <5348> 1941 <5349> <5349> 4312 <534a> <534a> 3410 <534b> <534b> 14368 <534c> <534c> 14367 <534d> <534d> 4313 <5351> <5351> 3440 <5352> <5352> 2836 <5353> <5353> 2894 <5354> <5354> 1696 <5357> <5357> 3270 <5358> <5358> 2927 <535a> <535a> 3364 <535c> <535c> 3708 <535e> <535e> 4315 <5360> <5360> 2702 <5361> <5361> 14369 <5366> <5366> 1803 <5369> <5369> 4316 <536c> <536c> 14370 <536e> <536e> 4317 <536f> <536f> 1230 <5370> <5370> 1209 <5371> <5371> 1577 <5372> <5372> 8406 <5373> <5373> 2824 <5374> <5374> 1643 <5375> <5375> 3931 <5377> <5377> 4320 <5378> <5378> 1335 <537b> <537b> 4319 <537d> <537d> 13365 <537f> <537f> 1698 <5382> <5382> 4321 <5384> <5384> 3837 <5389> <5389> 14288 <5393> <5393> 8407 <5396> <5396> 4322 <5398> <5398> 3994 <539a> <539a> 1968 <539f> <539f> 1898 <53a0> <53a0> 4323 <53a5> <53a5> 4325 <53a6> <53a6> 4324 <53a8> <53a8> 2597 <53a9> <53a9> 1243 <53ab> <53ab> 14371 <53ad> <53ad> 1280 <53ae> <53ae> 4326 <53b0> <53b0> 4327 <53b2> <53b2> 8408 <53b3> <53b3> 1899 <53b6> <53b6> 4328 <53bb> <53bb> 1672 <53c2> <53c2> 2176 <53c3> <53c3> 4329 <53c8> <53c8> 3746 <53c9> <53c9> 2085 <53ca> <53ca> 1652 <53cb> <53cb> 3857 <53cc> <53cc> 2770 <53cd> <53cd> 3411 <53ce> <53ce> 2345 <53d4> <53d4> 2385 <53d6> <53d6> 2324 <53d7> <53d7> 2337 <53d9> <53d9> 2432 <53da> <53da> 14372 <53db> <53db> 3412 <53dd> <53dd> 8409 <53df> <53df> 4332 <53e1> <53e1> 1253 <53e2> <53e2> 2771 <53e3> <53e3> 1969 endcidrange 100 begincidrange <53e4> <53e4> 1913 <53e5> <53e5> 1759 <53e6> <53e6> 14373 <53e8> <53e8> 4336 <53e9> <53e9> 2911 <53ea> <53ea> 2910 <53eb> <53eb> 1699 <53ec> <53ec> 2444 <53ed> <53ed> 4337 <53ee> <53ee> 4335 <53ef> <53ef> 1348 <53f0> <53f0> 2886 <53f1> <53f1> 2276 <53f2> <53f2> 2201 <53f3> <53f3> 1224 <53f5> <53f5> 14374 <53f6> <53f6> 1486 <53f7> <53f7> 2040 <53f8> <53f8> 2200 <53fa> <53fa> 4338 <5401> <5401> 4339 <5403> <5403> 1635 <5404> <5404> 1444 <5408> <5408> 2041 <5409> <5409> 1634 <540a> <540a> 3067 <540b> <540b> 1223 <540c> <540c> 3209 <540d> <540d> 3786 <540e> <540e> 1971 <540f> <540f> 3939 <5410> <5410> 3137 <5411> <5411> 1970 <541b> <541b> 1797 <541d> <541d> 4348 <541f> <541f> 1755 <5420> <5420> 3704 <5426> <5426> 3441 <5427> <5427> 14375 <5429> <5429> 4347 <542b> <542b> 1562 <542c> <542d> 4342 <542e> <542e> 4345 <5433> <5433> 13760 <5436> <5436> 4346 <5438> <5438> 1653 <5439> <5439> 2599 <543b> <543b> 3581 <543c> <543c> 4344 <543d> <543d> 4340 <543e> <543e> 1943 <543f> <543f> 13775 <5440> <5440> 4341 <5442> <5442> 4042 <5446> <5446> 3650 <5448> <5448> 3076 <5449> <5449> 1942 <544a> <544a> 2050 <544d> <544d> 14376 <544e> <544e> 4349 <5451> <5451> 3253 <5455> <5455> 14115 <545f> <545f> 4353 <5466> <5466> 14377 <5468> <5468> 2346 <546a> <546a> 2338 <546b> <546b> 14378 <5470> <5470> 4356 <5471> <5471> 4354 <5473> <5473> 3759 <5474> <5474> 14379 <5475> <5475> 4351 <5476> <5476> 4360 <5477> <5477> 4355 <547b> <547b> 4358 <547c> <547c> 1914 <547d> <547d> 3787 <5480> <5480> 4359 <5484> <5484> 4361 <5486> <5486> 4363 <548a> <548a> 8412 <548b> <548b> 2144 <548c> <548c> 4072 <548d> <548d> 14380 <548e> <548e> 4352 <548f> <548f> 4350 <5490> <5490> 4362 <5492> <5492> 4357 <5496> <5496> 14381 <549c> <549c> 8411 <54a1> <54a1> 14382 <54a2> <54a2> 4365 <54a4> <54a4> 4374 <54a5> <54a5> 4367 <54a8> <54a8> 4371 <54a9> <54a9> 8413 <54ab> <54ab> 4372 <54ac> <54ac> 4368 <54ad> <54ad> 14383 <54af> <54af> 4401 endcidrange 100 begincidrange <54b2> <54b2> 2137 <54b3> <54b3> 1423 <54b8> <54b8> 4366 <54b9> <54b9> 14384 <54bc> <54bc> 4376 <54bd> <54bd> 1210 <54be> <54be> 4375 <54bf> <54bf> 14385 <54c0> <54c0> 1129 <54c1> <54c1> 3516 <54c2> <54c2> 4373 <54c4> <54c4> 4369 <54c6> <54c6> 14386 <54c7> <54c7> 4364 <54c8> <54c8> 4370 <54c9> <54c9> 2104 <54cd> <54cd> 14387 <54d8> <54d8> 4377 <54e1> <54e1> 1211 <54e2> <54e2> 4386 <54e5> <54e6> 4378 <54e8> <54e8> 2445 <54e9> <54e9> 3735 <54ed> <54ed> 4384 <54ee> <54ee> 4383 <54f2> <54f2> 3113 <54fa> <54fa> 4385 <54fd> <54fd> 4382 <54ff> <54ff> 8414 <5504> <5504> 1238 <5506> <5506> 2086 <5507> <5507> 2550 <550e> <550e> 14388 <550f> <550f> 4380 <5510> <5510> 3164 <5514> <5514> 4381 <5516> <5516> 1126 <552b> <552b> 14389 <552e> <552e> 4391 <552f> <552f> 3853 <5531> <5531> 2447 <5533> <5533> 4397 <5535> <5535> 14390 <5538> <5538> 4396 <5539> <5539> 4387 <553e> <553e> 2851 <5540> <5540> 4388 <5544> <5544> 2895 <5545> <5545> 4393 <5546> <5546> 2446 <554a> <554a> 14391 <554c> <554c> 4390 <554f> <554f> 3824 <5553> <5553> 1810 <5556> <5557> 4394 <555c> <555c> 4392 <555d> <555d> 4398 <555e> <555e> 7633 <5560> <5561> 14392 <5563> <5563> 4389 <557b> <557b> 4404 <557c> <557c> 4409 <557e> <557e> 4405 <5580> <5580> 4400 <5583> <5583> 4410 <5584> <5584> 2739 <5586> <5586> 8415 <5587> <5587> 4412 <5588> <5588> 14394 <5589> <5589> 1972 <558a> <558a> 4402 <558b> <558b> 3003 <558e> <558e> 14395 <5598> <5598> 4406 <5599> <5599> 4399 <559a> <559a> 1513 <559c> <559c> 1578 <559d> <559d> 1475 <559e> <559e> 4407 <559f> <559f> 4403 <55a7> <55a7> 1868 <55a8> <55a8> 4413 <55a9> <55a9> 4411 <55aa> <55aa> 2773 <55ab> <55ab> 1636 <55ac> <55ac> 1700 <55ae> <55ae> 4408 <55b0> <55b0> 1772 <55b6> <55b6> 1254 <55c4> <55c4> 4417 <55c5> <55c5> 4415 <55c7> <55c7> 4472 <55d4> <55d4> 4420 <55da> <55da> 4414 <55dc> <55dc> 4418 <55df> <55df> 4416 <55e3> <55e3> 2202 <55e4> <55e4> 4419 <55f7> <55f7> 4422 <55f9> <55f9> 4427 endcidrange 100 begincidrange <55fd> <55fd> 4425 <55fe> <55fe> 4424 <5606> <5606> 2928 <5608> <5608> 14396 <5609> <5609> 1349 <560e> <560f> 14397 <5614> <5614> 4421 <5616> <5616> 4423 <5617> <5617> 2448 <5618> <5618> 1237 <561b> <561b> 4426 <5620> <5620> 15389 <5629> <5629> 1374 <562f> <562f> 4437 <5631> <5631> 2532 <5632> <5632> 4433 <5634> <5634> 4431 <5636> <5636> 4432 <5637> <5637> 14399 <5638> <5638> 4434 <563f> <563f> 14400 <5642> <5642> 1247 <5649> <5649> 14401 <564b> <564b> 14402 <564c> <564c> 2747 <564e> <564e> 4428 <564f> <564f> 14403 <5650> <5650> 4429 <5653> <5653> 7963 <565b> <565b> 1496 <5664> <5664> 4436 <5666> <5666> 14404 <5668> <5668> 1579 <5669> <5669> 14405 <566a> <566a> 4439 <566b> <566b> 4435 <566c> <566c> 4438 <566f> <566f> 14406 <5671> <5672> 14407 <5674> <5674> 3582 <5676> <5676> 15411 <5678> <5678> 3245 <567a> <567a> 3404 <5680> <5680> 4441 <5686> <5686> 4440 <5687> <5687> 1443 <568a> <568a> 4442 <568f> <568f> 4445 <5694> <5694> 4444 <5695> <5695> 14409 <5699> <5699> 7654 <569a> <569a> 14410 <56a0> <56a0> 4443 <56a2> <56a2> 3311 <56a5> <56a5> 4446 <56ac> <56ad> 14411 <56ae> <56ae> 4447 <56b1> <56b1> 14413 <56b4> <56b4> 4449 <56b6> <56b6> 4448 <56bc> <56bc> 4451 <56c0> <56c0> 4454 <56c1> <56c1> 4452 <56c2> <56c2> 4450 <56c3> <56c3> 4453 <56c8> <56c8> 4455 <56c9> <56c9> 14414 <56ca> <56ca> 7770 <56ce> <56ce> 4456 <56d1> <56d1> 4457 <56d3> <56d3> 4458 <56d7> <56d7> 4459 <56d8> <56d8> 4220 <56da> <56da> 2344 <56db> <56db> 2203 <56dd> <56dd> 14415 <56de> <56de> 1395 <56e0> <56e0> 1212 <56e3> <56e3> 2946 <56e4> <56e4> 14416 <56ee> <56ee> 4460 <56f0> <56f0> 2068 <56f2> <56f2> 1171 <56f3> <56f3> 2596 <56f9> <56f9> 4461 <56fa> <56fa> 1915 <56fd> <56fd> 2051 <56ff> <56ff> 4463 <5700> <5700> 4462 <5703> <5703> 3632 <5704> <5704> 4464 <5708> <5708> 4466 <5709> <5709> 4465 <570a> <570a> 14417 <570b> <570b> 4467 <570d> <570d> 4468 <570f> <570f> 1869 <5712> <5712> 1282 <5713> <5713> 4469 <5715> <5715> 14418 endcidrange 100 begincidrange <5716> <5716> 4471 <5718> <5718> 4470 <571c> <571c> 4473 <571f> <571f> 3156 <5721> <5721> 13952 <5723> <5723> 14419 <5726> <5726> 4474 <5727> <5727> 1145 <5728> <5728> 2127 <572d> <572d> 1811 <572f> <572f> 14420 <5730> <5730> 2957 <5733> <5734> 14421 <5737> <5738> 4475 <573b> <573b> 4478 <5740> <5740> 4479 <5742> <5742> 2132 <5747> <5747> 1737 <574a> <574a> 3685 <574c> <574c> 14423 <574e> <574e> 4477 <574f> <574f> 4480 <5750> <5750> 2097 <5751> <5751> 1973 <5759> <5759> 8416 <5761> <5761> 4484 <5764> <5764> 2069 <5765> <5765> 8417 <5766> <5766> 2929 <5769> <5769> 4481 <576a> <576a> 3062 <5770> <5770> 14424 <577f> <577f> 4485 <5782> <5782> 2600 <5788> <5788> 4483 <5789> <5789> 4486 <578b> <578b> 1813 <578c> <578c> 14425 <5793> <5793> 4487 <579c> <579c> 14426 <57a0> <57a0> 4488 <57a2> <57a2> 1974 <57a3> <57a3> 1438 <57a4> <57a4> 4490 <57aa> <57aa> 4491 <57ac> <57ac> 8418 <57b0> <57b0> 4492 <57b3> <57b3> 4489 <57b8> <57b8> 14427 <57c0> <57c0> 4482 <57c3> <57c3> 4493 <57c6> <57c6> 4494 <57c7> <57c7> 8420 <57c8> <57c8> 8419 <57cb> <57cb> 3730 <57ce> <57ce> 2515 <57d2> <57d3> 4496 <57d4> <57d4> 4495 <57d6> <57d6> 4499 <57dc> <57dc> 3310 <57df> <57df> 1196 <57e0> <57e0> 3528 <57e3> <57e3> 4500 <57e6> <57e6> 14428 <57ed> <57ed> 14429 <57f4> <57f4> 2533 <57f5> <57f6> 14430 <57f7> <57f7> 2277 <57f9> <57f9> 3347 <57fa> <57fa> 1580 <57fc> <57fc> 2139 <57ff> <57ff> 14432 <5800> <5800> 3719 <5802> <5802> 3210 <5805> <5805> 1870 <5806> <5806> 2863 <5809> <5809> 14433 <580a> <580a> 4498 <580b> <580b> 4501 <5815> <5815> 2852 <5819> <5819> 4502 <581d> <581d> 4503 <5820> <5820> 14434 <5821> <5821> 4505 <5824> <5824> 3077 <582a> <582a> 1514 <582f> <582f> 7474 <5830> <5830> 1283 <5831> <5831> 3651 <5832> <5832> 14435 <5834> <5834> 2516 <5835> <5835> 3138 <583a> <583a> 2134 <583d> <583d> 4511 <5840> <5840> 3597 <5841> <5841> 4005 <584a> <584a> 1396 <584b> <584b> 4507 <5851> <5851> 2748 <5852> <5852> 4510 endcidrange 100 begincidrange <5854> <5854> 3165 <5857> <5857> 3139 <5858> <5858> 3166 <5859> <5859> 3405 <585a> <585a> 3049 <585e> <585e> 2105 <5861> <5861> 7751 <5862> <5862> 4506 <5869> <5869> 1304 <586b> <586b> 3120 <5870> <5870> 4508 <5872> <5872> 4504 <5875> <5875> 2582 <5879> <5879> 4512 <587c> <587c> 14436 <587e> <587e> 2392 <5880> <5880> 14437 <5883> <5883> 1701 <5885> <5885> 4513 <5893> <5893> 3640 <5897> <5897> 2815 <589c> <589c> 3042 <589e> <589e> 8423 <589f> <589f> 4515 <58a8> <58a8> 3709 <58a9> <58a9> 14438 <58ab> <58ab> 4516 <58ae> <58ae> 4521 <58b2> <58b2> 8424 <58b3> <58b3> 3583 <58b8> <58b8> 4520 <58b9> <58b9> 4514 <58ba> <58ba> 4517 <58bb> <58bb> 4519 <58be> <58be> 2070 <58c1> <58c1> 3609 <58c5> <58c5> 4522 <58c7> <58c7> 2947 <58ca> <58ca> 1397 <58cc> <58cc> 2517 <58ce> <58ce> 14439 <58d0> <58d0> 14440 <58d1> <58d1> 4524 <58d3> <58d3> 4523 <58d4> <58d4> 14441 <58d5> <58d5> 2042 <58d7> <58d7> 4525 <58d8> <58d8> 4527 <58d9> <58d9> 4526 <58da> <58da> 14442 <58dc> <58dc> 4529 <58de> <58de> 4518 <58df> <58df> 4531 <58e4> <58e4> 4530 <58e5> <58e5> 4528 <58e9> <58e9> 14443 <58eb> <58eb> 2204 <58ec> <58ec> 2583 <58ee> <58ee> 2774 <58ef> <58ef> 4532 <58f0> <58f0> 2656 <58f1> <58f1> 1201 <58f2> <58f2> 3354 <58f7> <58f7> 3063 <58f9> <58f9> 4534 <58fa> <58fa> 4533 <58fb> <58fd> 4535 <5902> <5902> 4538 <5909> <5909> 3617 <590a> <590a> 4539 <590b> <590b> 8425 <590c> <590c> 14444 <590f> <590f> 1350 <5910> <5910> 4540 <5915> <5915> 3878 <5916> <5916> 1422 <5918> <5918> 4318 <5919> <5919> 2386 <591a> <591a> 2847 <591b> <591b> 4541 <591c> <591c> 3831 <5922> <5922> 3776 <5924> <5924> 14445 <5925> <5925> 4543 <5927> <5927> 2887 <5929> <5929> 3121 <592a> <592a> 2848 <592b> <592b> 3529 <592c> <592d> 4544 <592e> <592e> 1309 <592f> <592f> 14446 <5931> <5931> 2278 <5932> <5932> 4546 <5937> <5937> 1172 <5938> <5938> 4547 <5939> <5939> 14117 <593e> <593e> 4548 <5944> <5944> 1284 <5947> <5947> 1581 <5948> <5948> 3256 endcidrange 100 begincidrange <5949> <5949> 3652 <594e> <594e> 4552 <594f> <594f> 2775 <5950> <5950> 4551 <5951> <5951> 1814 <5953> <5953> 8426 <5954> <5954> 3721 <5955> <5955> 4550 <5957> <5957> 3167 <5958> <5958> 4554 <595a> <595a> 4553 <595b> <595b> 8427 <595d> <595d> 8428 <5960> <5960> 4556 <5961> <5961> 14447 <5962> <5962> 4555 <5963> <5963> 8429 <5965> <5965> 1310 <5967> <5967> 4557 <5968> <5968> 2449 <5969> <5969> 4559 <596a> <596a> 2915 <596c> <596c> 4558 <596d> <596d> 14448 <596e> <596e> 3587 <5973> <5973> 2433 <5974> <5974> 3157 <5978> <5978> 4560 <597d> <597d> 1975 <5981> <5981> 4561 <5982> <5982> 3287 <5983> <5983> 3442 <5984> <5984> 3805 <598a> <598a> 3291 <598d> <598d> 4570 <5993> <5993> 1618 <5996> <5996> 3887 <5999> <5999> 3771 <599b> <599b> 4665 <599d> <599d> 4562 <59a3> <59a3> 4565 <59a4> <59a4> 8430 <59a5> <59a5> 2853 <59a8> <59a8> 3686 <59ac> <59ac> 3140 <59b2> <59b2> 4566 <59b9> <59b9> 3731 <59ba> <59ba> 8431 <59bb> <59bb> 2106 <59be> <59be> 2450 <59c6> <59c6> 4567 <59c9> <59c9> 2206 <59ca> <59ca> 14449 <59cb> <59cb> 2205 <59d0> <59d0> 1149 <59d1> <59d1> 1916 <59d2> <59d2> 14450 <59d3> <59d3> 2639 <59d4> <59d4> 1173 <59d9> <59da> 4571 <59dc> <59dc> 4569 <59dd> <59dd> 14451 <59e3> <59e4> 14452 <59e5> <59e5> 1242 <59e6> <59e6> 1515 <59e8> <59e8> 4568 <59ea> <59ea> 3793 <59eb> <59eb> 3491 <59ec> <59ec> 13997 <59f6> <59f6> 1132 <59fb> <59fb> 1213 <59ff> <59ff> 2207 <5a01> <5a01> 1174 <5a03> <5a03> 1127 <5a04> <5a04> 14454 <5a09> <5a09> 4577 <5a0c> <5a0c> 14455 <5a11> <5a11> 4575 <5a18> <5a18> 3784 <5a1a> <5a1a> 4578 <5a1b> <5a1b> 13761 <5a1c> <5a1c> 4576 <5a1f> <5a1f> 4574 <5a20> <5a20> 2551 <5a23> <5a23> 14456 <5a25> <5a25> 4573 <5a29> <5a29> 3626 <5a2f> <5a2f> 1944 <5a35> <5a36> 4582 <5a3c> <5a3c> 2451 <5a40> <5a40> 4579 <5a41> <5a41> 4050 <5a46> <5a46> 3330 <5a47> <5a47> 14457 <5a49> <5a49> 4581 <5a55> <5a55> 14458 <5a5a> <5a5a> 2071 <5a62> <5a62> 4584 <5a63> <5a63> 14459 <5a66> <5a66> 3530 endcidrange 100 begincidrange <5a6a> <5a6a> 4585 <5a6c> <5a6c> 4580 <5a6d> <5a6d> 14460 <5a7e> <5a7e> 14461 <5a7f> <5a7f> 3783 <5a92> <5a92> 3348 <5a9a> <5a9a> 4586 <5a9b> <5a9b> 3492 <5a9e> <5a9e> 14462 <5aa7> <5aa7> 14463 <5aac> <5aac> 14464 <5ab3> <5ab3> 14465 <5abc> <5abc> 4587 <5abd> <5abd> 4591 <5abe> <5abe> 4588 <5ac1> <5ac1> 1351 <5ac2> <5ac2> 4590 <5ac9> <5ac9> 2279 <5acb> <5acb> 4589 <5acc> <5acc> 1871 <5ad0> <5ad0> 4603 <5ad6> <5ad6> 4596 <5ad7> <5ad7> 4593 <5ae0> <5ae0> 14466 <5ae1> <5ae1> 2978 <5ae3> <5ae3> 4592 <5ae6> <5ae6> 4594 <5ae9> <5ae9> 4595 <5afa> <5afb> 4597 <5b00> <5b00> 14467 <5b09> <5b09> 1582 <5b0b> <5b0b> 4600 <5b0c> <5b0c> 4599 <5b16> <5b16> 4601 <5b19> <5b19> 14468 <5b22> <5b22> 2518 <5b25> <5b25> 14469 <5b2a> <5b2a> 4604 <5b2c> <5b2c> 3064 <5b2d> <5b2d> 14470 <5b30> <5b30> 1255 <5b32> <5b32> 4602 <5b36> <5b36> 4605 <5b3e> <5b3e> 4606 <5b40> <5b40> 4609 <5b41> <5b41> 14471 <5b43> <5b43> 4607 <5b45> <5b45> 4608 <5b50> <5b50> 2208 <5b51> <5b51> 4610 <5b54> <5b54> 1976 <5b55> <5b55> 4611 <5b56> <5b56> 8432 <5b57> <5b57> 2248 <5b58> <5b58> 2840 <5b5a> <5b5b> 4612 <5b5c> <5b5c> 2216 <5b5d> <5b5d> 1977 <5b5f> <5b5f> 3806 <5b63> <5b63> 1602 <5b64> <5b64> 1917 <5b65> <5b65> 4614 <5b66> <5b66> 1462 <5b69> <5b69> 4615 <5b6b> <5b6b> 2841 <5b70> <5b70> 4616 <5b71> <5b71> 4656 <5b73> <5b73> 4617 <5b75> <5b75> 4618 <5b78> <5b78> 4619 <5b7a> <5b7a> 4621 <5b7c> <5b7c> 14472 <5b7e> <5b7f> 14473 <5b80> <5b80> 4622 <5b82> <5b82> 13840 <5b83> <5b83> 4623 <5b85> <5b85> 2896 <5b87> <5b87> 1225 <5b88> <5b88> 2325 <5b89> <5b89> 1158 <5b8a> <5b8a> 14475 <5b8b> <5b8b> 2777 <5b8c> <5b8c> 1516 <5b8d> <5b8d> 2273 <5b8f> <5b8f> 1978 <5b95> <5b95> 3168 <5b97> <5b97> 2347 <5b98> <5b98> 1517 <5b99> <5b99> 2982 <5b9a> <5b9a> 3078 <5b9b> <5b9b> 1148 <5b9c> <5b9c> 1619 <5b9d> <5b9d> 3653 <5b9f> <5b9f> 2286 <5ba2> <5ba2> 1644 <5ba3> <5ba3> 2703 <5ba4> <5ba4> 2280 <5ba5> <5ba5> 3858 <5ba6> <5ba6> 4624 <5bae> <5bae> 1654 endcidrange 100 begincidrange <5bb0> <5bb0> 2107 <5bb3> <5bb3> 1424 <5bb4> <5bb4> 1285 <5bb5> <5bb5> 2452 <5bb6> <5bb6> 1352 <5bb8> <5bb8> 4625 <5bb9> <5bb9> 3888 <5bbf> <5bbf> 2387 <5bc0> <5bc0> 8433 <5bc2> <5bc2> 2320 <5bc3> <5bc3> 4626 <5bc4> <5bc4> 1583 <5bc5> <5bc5> 3242 <5bc6> <5bc6> 3765 <5bc7> <5bc7> 4627 <5bc9> <5bc9> 4628 <5bcc> <5bcc> 3531 <5bd0> <5bd0> 4630 <5bd2> <5bd2> 1508 <5bd3> <5bd3> 1775 <5bd4> <5bd4> 4629 <5bd8> <5bd8> 8435 <5bdb> <5bdb> 1518 <5bdd> <5bdd> 2552 <5bde> <5bde> 4634 <5bdf> <5bdf> 2159 <5be1> <5be1> 1353 <5be2> <5be2> 4633 <5be4> <5be4> 4631 <5be5> <5be5> 4635 <5be6> <5be6> 4632 <5be7> <5be7> 3297 <5be8> <5be8> 5262 <5be9> <5be9> 2553 <5beb> <5beb> 4636 <5bec> <5bec> 8436 <5bee> <5bee> 3976 <5bf0> <5bf0> 4637 <5bf3> <5bf3> 4639 <5bf5> <5bf5> 3004 <5bf6> <5bf6> 4638 <5bf8> <5bf8> 2631 <5bfa> <5bfa> 2249 <5bfe> <5bfe> 2864 <5bff> <5bff> 2339 <5c01> <5c01> 3559 <5c02> <5c02> 2704 <5c04> <5c04> 2297 <5c05> <5c05> 4640 <5c06> <5c06> 2453 <5c07> <5c08> 4641 <5c09> <5c09> 1175 <5c0a> <5c0a> 2842 <5c0b> <5c0b> 2584 <5c0d> <5c0d> 4643 <5c0e> <5c0e> 3211 <5c0f> <5c0f> 2454 <5c11> <5c11> 2455 <5c13> <5c13> 4644 <5c14> <5c14> 14122 <5c16> <5c16> 2705 <5c19> <5c19> 13835 <5c1a> <5c1a> 2456 <5c1e> <5c1e> 8437 <5c20> <5c20> 4645 <5c22> <5c22> 4646 <5c23> <5c23> 14476 <5c24> <5c24> 3820 <5c28> <5c28> 4647 <5c2b> <5c2b> 14477 <5c2d> <5c2d> 1726 <5c30> <5c30> 14478 <5c31> <5c31> 2348 <5c38> <5c39> 4648 <5c3a> <5c3a> 2312 <5c3b> <5c3b> 2546 <5c3c> <5c3c> 3276 <5c3d> <5c3d> 2586 <5c3e> <5c3e> 3468 <5c3f> <5c3f> 3288 <5c40> <5c40> 1729 <5c41> <5c41> 4650 <5c45> <5c45> 1673 <5c46> <5c46> 4651 <5c48> <5c48> 1782 <5c4a> <5c4a> 3239 <5c4b> <5c4b> 1328 <5c4d> <5c4d> 2209 <5c4e> <5c4e> 4652 <5c4f> <5c4f> 4655 <5c50> <5c50> 4654 <5c51> <5c51> 1781 <5c53> <5c53> 4653 <5c55> <5c55> 3122 <5c5b> <5c5b> 7826 <5c5e> <5c5e> 2832 <5c60> <5c60> 3141 <5c61> <5c61> 2292 <5c62> <5c62> 7693 <5c63> <5c63> 14479 endcidrange 100 begincidrange <5c64> <5c64> 2778 <5c65> <5c65> 3940 <5c69> <5c69> 14480 <5c6c> <5c6c> 4657 <5c6e> <5c6e> 4658 <5c6f> <5c6f> 3246 <5c71> <5c71> 2177 <5c76> <5c76> 4660 <5c79> <5c79> 4661 <5c7c> <5c7c> 14481 <5c8c> <5c8c> 4662 <5c90> <5c90> 1584 <5c91> <5c91> 4663 <5c94> <5c94> 4664 <5ca1> <5ca1> 1324 <5ca6> <5ca6> 8438 <5ca8> <5ca8> 2749 <5ca9> <5ca9> 1568 <5cab> <5cab> 4666 <5cac> <5cac> 3764 <5cb1> <5cb1> 2866 <5cb3> <5cb3> 1463 <5cb6> <5cb6> 4668 <5cb7> <5cb7> 4670 <5cb8> <5cb8> 1563 <5cba> <5cba> 8439 <5cbb> <5cbb> 4667 <5cbc> <5cbc> 4669 <5cbe> <5cbe> 4672 <5cc5> <5cc5> 4671 <5cc7> <5cc7> 4673 <5ccb> <5ccb> 14482 <5cd2> <5cd2> 14483 <5cd9> <5cd9> 4674 <5ce0> <5ce0> 3221 <5ce1> <5ce1> 1702 <5ce6> <5ce6> 14124 <5ce8> <5ce8> 1381 <5ce9> <5ce9> 4675 <5cea> <5cea> 4680 <5ced> <5ced> 4678 <5cef> <5cef> 3655 <5cf0> <5cf0> 3654 <5cf4> <5cf4> 14484 <5cf5> <5cf5> 8440 <5cf6> <5cf6> 3169 <5cfa> <5cfa> 4677 <5cfb> <5cfb> 2398 <5cfd> <5cfd> 4676 <5d07> <5d07> 2616 <5d0b> <5d0b> 4681 <5d0e> <5d0e> 2138 <5d11> <5d11> 4687 <5d14> <5d14> 4688 <5d15> <5d15> 4682 <5d16> <5d16> 1425 <5d17> <5d17> 4683 <5d18> <5d18> 4692 <5d19> <5d19> 4691 <5d1a> <5d1a> 4690 <5d1b> <5d1b> 4686 <5d1f> <5d1f> 4685 <5d22> <5d22> 4689 <5d24> <5d24> 14485 <5d26> <5d26> 14486 <5d27> <5d27> 8441 <5d29> <5d29> 3656 <5d42> <5d42> 8444 <5d43> <5d43> 14487 <5d46> <5d46> 14488 <5d4a> <5d4a> 14489 <5d4b> <5d4b> 4696 <5d4c> <5d4c> 4693 <5d4e> <5d4e> 4695 <5d50> <5d50> 3932 <5d52> <5d52> 4694 <5d53> <5d53> 8442 <5d5c> <5d5c> 4684 <5d69> <5d69> 2617 <5d6c> <5d6c> 4697 <5d6d> <5d6d> 8445 <5d6f> <5d6f> 2087 <5d73> <5d73> 4698 <5d76> <5d76> 4699 <5d82> <5d82> 4702 <5d84> <5d84> 4701 <5d87> <5d87> 4700 <5d8b> <5d8b> 3170 <5d8c> <5d8c> 4679 <5d90> <5d90> 4708 <5d92> <5d92> 14490 <5d94> <5d94> 14491 <5d99> <5d99> 14492 <5d9d> <5d9d> 4704 <5da0> <5da0> 14493 <5da2> <5da2> 4703 <5dac> <5dac> 4705 <5dae> <5dae> 4706 <5db2> <5db2> 15269 <5db7> <5db7> 4709 endcidrange 100 begincidrange <5db8> <5db9> 8446 <5dba> <5dba> 4014 <5dbc> <5dbc> 4710 <5dbd> <5dbd> 4707 <5dc9> <5dc9> 4711 <5dcc> <5dcc> 1564 <5dcd> <5dcd> 4712 <5dd0> <5dd0> 8448 <5dd2> <5dd2> 4714 <5dd3> <5dd3> 4713 <5dd6> <5dd6> 4715 <5dd8> <5dd8> 14494 <5ddb> <5ddb> 4716 <5ddd> <5ddd> 2706 <5dde> <5dde> 2349 <5de0> <5de0> 14495 <5de1> <5de1> 2414 <5de2> <5de2> 13362 <5de3> <5de3> 2789 <5de5> <5de5> 1979 <5de6> <5de6> 2088 <5de7> <5de7> 1980 <5de8> <5de8> 1674 <5deb> <5deb> 4717 <5dee> <5dee> 2089 <5df1> <5df1> 1918 <5df2> <5df2> 4718 <5df3> <5df3> 3762 <5df4> <5df4> 3321 <5df5> <5df5> 4719 <5df7> <5df7> 1981 <5df8> <5df8> 14496 <5dfb> <5dfb> 1512 <5dfd> <5dfd> 2917 <5dfe> <5dfe> 1738 <5dff> <5dff> 13794 <5e00> <5e00> 14497 <5e02> <5e02> 2210 <5e03> <5e03> 3533 <5e06> <5e06> 3413 <5e0b> <5e0b> 4720 <5e0c> <5e0c> 1585 <5e11> <5e11> 4723 <5e12> <5e12> 14498 <5e14> <5e15> 14499 <5e16> <5e16> 3005 <5e18> <5e18> 14501 <5e19> <5e19> 4722 <5e1a> <5e1a> 4721 <5e1b> <5e1b> 4724 <5e1d> <5e1d> 3079 <5e25> <5e25> 2601 <5e2b> <5e2b> 2211 <5e2d> <5e2d> 2670 <5e2e> <5e2e> 14502 <5e2f> <5e2f> 2867 <5e30> <5e30> 1596 <5e33> <5e33> 3006 <5e36> <5e37> 4725 <5e38> <5e38> 2519 <5e3d> <5e3d> 3687 <5e40> <5e40> 4729 <5e43> <5e43> 4728 <5e44> <5e44> 4727 <5e45> <5e45> 3567 <5e47> <5e47> 4736 <5e4c> <5e4c> 3720 <5e4e> <5e4e> 4730 <5e54> <5e54> 4732 <5e55> <5e55> 3737 <5e57> <5e57> 4731 <5e58> <5e58> 14503 <5e5f> <5e5f> 4733 <5e61> <5e61> 3388 <5e62> <5e62> 4734 <5e63> <5e63> 3598 <5e64> <5e64> 4735 <5e6b> <5e6c> 14504 <5e72> <5e72> 1519 <5e73> <5e73> 3599 <5e74> <5e74> 3301 <5e75> <5e76> 4737 <5e78> <5e78> 1982 <5e79> <5e79> 1520 <5e7a> <5e7a> 4739 <5e7b> <5e7b> 1900 <5e7c> <5e7c> 3886 <5e7d> <5e7d> 3859 <5e7e> <5e7e> 1586 <5e7f> <5e7f> 4741 <5e81> <5e81> 3007 <5e83> <5e83> 1983 <5e84> <5e84> 2457 <5e87> <5e87> 3443 <5e8a> <5e8a> 2458 <5e8f> <5e8f> 2434 <5e95> <5e95> 3080 <5e96> <5e96> 3657 <5e97> <5e97> 3123 <5e99> <5e99> 14000 endcidrange 100 begincidrange <5e9a> <5e9a> 1984 <5e9c> <5e9c> 3534 <5ea0> <5ea0> 4742 <5ea6> <5ea6> 3155 <5ea7> <5ea7> 2098 <5ea8> <5ea8> 14506 <5eaa> <5eaa> 14507 <5eab> <5eab> 1919 <5ead> <5ead> 3081 <5eb5> <5eb5> 1159 <5eb6> <5eb6> 2424 <5eb7> <5eb7> 1985 <5eb8> <5eb8> 3889 <5ebe> <5ebf> 14508 <5ec1> <5ec2> 4743 <5ec3> <5ec3> 3335 <5ec8> <5ec8> 4745 <5ec9> <5ec9> 4031 <5eca> <5eca> 4051 <5ecb> <5ecb> 14510 <5ecf> <5ecf> 4747 <5ed0> <5ed0> 4746 <5ed2> <5ed2> 14511 <5ed3> <5ed3> 1445 <5ed6> <5ed6> 4748 <5eda> <5edb> 4751 <5edd> <5edd> 4750 <5edf> <5edf> 3506 <5ee0> <5ee0> 2459 <5ee1> <5ee1> 4754 <5ee2> <5ee2> 4753 <5ee3> <5ee3> 4749 <5ee8> <5ee9> 4755 <5eec> <5eec> 4757 <5ef0> <5ef0> 4760 <5ef1> <5ef1> 4758 <5ef3> <5ef3> 4759 <5ef4> <5ef4> 4761 <5ef6> <5ef6> 1286 <5ef7> <5ef7> 3082 <5ef8> <5ef8> 4762 <5efa> <5efa> 1872 <5efb> <5efb> 1398 <5efc> <5efc> 3308 <5efe> <5efe> 4763 <5eff> <5eff> 3283 <5f01> <5f01> 3627 <5f03> <5f03> 4764 <5f04> <5f04> 4052 <5f07> <5f07> 14512 <5f09> <5f09> 4765 <5f0a> <5f0a> 3600 <5f0b> <5f0b> 4768 <5f0c> <5f0c> 4090 <5f0d> <5f0d> 4106 <5f0e> <5f0e> 14513 <5f0f> <5f0f> 2268 <5f10> <5f10> 3277 <5f11> <5f11> 4769 <5f13> <5f13> 1655 <5f14> <5f14> 3008 <5f15> <5f15> 1214 <5f16> <5f16> 4770 <5f17> <5f17> 3574 <5f18> <5f18> 1986 <5f1b> <5f1b> 2958 <5f1c> <5f1d> 14514 <5f1f> <5f1f> 3083 <5f21> <5f21> 8449 <5f22> <5f22> 14516 <5f25> <5f25> 3835 <5f26> <5f26> 1901 <5f27> <5f27> 1920 <5f28> <5f28> 14517 <5f29> <5f29> 4771 <5f2d> <5f2d> 4772 <5f2f> <5f2f> 4778 <5f31> <5f31> 2321 <5f34> <5f34> 8450 <5f35> <5f35> 3009 <5f36> <5f36> 14518 <5f37> <5f37> 1703 <5f38> <5f38> 4773 <5f3a> <5f3a> 13720 <5f3b> <5f3b> 14519 <5f3c> <5f3c> 3485 <5f3e> <5f3e> 2948 <5f40> <5f40> 14520 <5f41> <5f41> 4774 <5f45> <5f45> 8370 <5f48> <5f48> 4775 <5f4a> <5f4a> 1704 <5f4c> <5f4c> 4776 <5f4e> <5f4e> 4777 <5f50> <5f50> 14521 <5f51> <5f51> 4779 <5f53> <5f53> 3184 <5f56> <5f57> 4780 <5f58> <5f58> 14522 <5f59> <5f59> 4782 endcidrange 100 begincidrange <5f5c> <5f5c> 4767 <5f5d> <5f5d> 4766 <5f61> <5f61> 4783 <5f62> <5f62> 1815 <5f64> <5f64> 14523 <5f65> <5f65> 13996 <5f66> <5f66> 3481 <5f67> <5f67> 8451 <5f69> <5f69> 2108 <5f6a> <5f6a> 3497 <5f6b> <5f6b> 3010 <5f6c> <5f6c> 3517 <5f6d> <5f6d> 4784 <5f70> <5f70> 2460 <5f71> <5f71> 1256 <5f73> <5f73> 4785 <5f77> <5f77> 4786 <5f79> <5f79> 3838 <5f7c> <5f7c> 3444 <5f7f> <5f7f> 4789 <5f80> <5f80> 1311 <5f81> <5f81> 2640 <5f82> <5f82> 4788 <5f83> <5f83> 4787 <5f84> <5f84> 1816 <5f85> <5f85> 2868 <5f87> <5f87> 4793 <5f88> <5f88> 4791 <5f89> <5f89> 14524 <5f8a> <5f8a> 4790 <5f8b> <5f8b> 3951 <5f8c> <5f8c> 1945 <5f90> <5f90> 2435 <5f91> <5f91> 4792 <5f92> <5f92> 3142 <5f93> <5f93> 2376 <5f97> <5f97> 3224 <5f98> <5f98> 4796 <5f99> <5f99> 4795 <5f9c> <5f9c> 14525 <5f9e> <5f9e> 4794 <5fa0> <5fa0> 4797 <5fa1> <5fa1> 1946 <5fa4> <5fa4> 14527 <5fa7> <5fa7> 14526 <5fa8> <5fa8> 4798 <5fa9> <5fa9> 3566 <5faa> <5faa> 2405 <5fad> <5fad> 4799 <5fae> <5fae> 3469 <5faf> <5faf> 14528 <5fb3> <5fb3> 3225 <5fb4> <5fb4> 3011 <5fb5> <5fb5> 13368 <5fb7> <5fb7> 8452 <5fb8> <5fb8> 14529 <5fb9> <5fb9> 3114 <5fbc> <5fbc> 4800 <5fbd> <5fbd> 1605 <5fc3> <5fc3> 2554 <5fc4> <5fc4> 14530 <5fc5> <5fc5> 3486 <5fc9> <5fc9> 14531 <5fcc> <5fcc> 1587 <5fcd> <5fcd> 3292 <5fd6> <5fd6> 4801 <5fd7> <5fd7> 2212 <5fd8> <5fd9> 3688 <5fdc> <5fdc> 1312 <5fdd> <5fdd> 4806 <5fde> <5fde> 8453 <5fe0> <5fe0> 2983 <5fe1> <5fe1> 14532 <5fe4> <5fe4> 4803 <5fe9> <5fe9> 14533 <5feb> <5feb> 1399 <5fed> <5fed> 14534 <5ff0> <5ff0> 4854 <5ff1> <5ff1> 4805 <5ff5> <5ff5> 3302 <5ff8> <5ff8> 4804 <5ffb> <5ffb> 4802 <5ffc> <5ffc> 14535 <5ffd> <5ffd> 2060 <5fff> <5fff> 4808 <600e> <600e> 4814 <600f> <600f> 4820 <6010> <6010> 4812 <6012> <6012> 3158 <6015> <6015> 4817 <6016> <6016> 3535 <6017> <6017> 14536 <6019> <6019> 4811 <601a> <601a> 14537 <601b> <601b> 4816 <601c> <601c> 4015 <601d> <601d> 2213 <6020> <6020> 2869 <6021> <6021> 4809 <6025> <6025> 1656 endcidrange 100 begincidrange <6026> <6026> 4819 <6027> <6027> 2641 <6028> <6028> 1287 <6029> <6029> 4813 <602a> <602a> 1400 <602b> <602b> 4818 <602f> <602f> 1705 <6031> <6031> 4815 <6033> <6033> 14538 <603a> <603a> 4821 <6041> <6041> 4823 <6042> <6042> 4833 <6043> <6043> 4831 <6046> <6046> 4828 <604a> <604a> 4827 <604b> <604b> 4032 <604d> <604d> 4829 <6050> <6050> 1706 <6052> <6052> 1987 <6055> <6055> 2436 <6059> <6059> 4836 <605a> <605a> 4822 <605d> <605d> 8454 <605f> <605f> 4826 <6060> <6060> 4810 <6061> <6061> 14539 <6062> <6062> 1402 <6063> <6063> 4830 <6064> <6064> 4832 <6065> <6065> 2959 <6068> <6068> 2072 <6069> <6069> 1336 <606a> <606a> 4824 <606b> <606b> 4835 <606c> <606c> 4834 <606d> <606d> 1707 <606f> <606f> 2825 <6070> <6070> 1476 <6075> <6075> 1817 <6077> <6077> 4825 <607f> <607f> 14540 <6081> <6081> 4837 <6083> <6083> 4840 <6084> <6084> 4842 <6085> <6085> 8455 <6089> <6089> 2281 <608a> <608a> 8456 <608b> <608b> 4848 <608c> <608c> 3084 <608d> <608d> 4838 <6092> <6092> 4846 <6094> <6094> 1401 <6096> <6097> 4844 <609a> <609a> 4841 <609b> <609b> 4843 <609e> <609e> 14541 <609f> <609f> 1947 <60a0> <60a0> 3860 <60a3> <60a3> 1521 <60a4> <60a4> 14542 <60a6> <60a6> 1275 <60a7> <60a7> 4847 <60a9> <60a9> 3312 <60aa> <60aa> 1137 <60b0> <60b0> 14543 <60b2> <60b2> 3445 <60b3> <60b3> 4807 <60b4> <60b4> 4853 <60b5> <60b5> 4857 <60b6> <60b6> 3825 <60b8> <60b8> 4850 <60bc> <60bc> 3171 <60bd> <60bd> 4855 <60c5> <60c5> 2520 <60c6> <60c6> 4856 <60c7> <60c7> 3247 <60cb> <60cb> 14544 <60d1> <60d1> 4077 <60d3> <60d3> 4852 <60d5> <60d5> 8458 <60d8> <60d8> 4858 <60da> <60da> 2061 <60db> <60db> 14545 <60dc> <60dc> 2671 <60de> <60de> 8457 <60df> <60df> 1176 <60e0> <60e0> 4851 <60e1> <60e1> 4849 <60e3> <60e3> 2780 <60e7> <60e7> 4839 <60e8> <60e8> 2178 <60f0> <60f0> 2854 <60f1> <60f1> 4870 <60f2> <60f2> 8460 <60f3> <60f3> 2781 <60f4> <60f4> 4865 <60f6> <60f7> 4862 <60f8> <60f8> 14546 <60f9> <60f9> 2322 <60fa> <60fa> 4866 endcidrange 100 begincidrange <60fb> <60fb> 4869 <6100> <6100> 4864 <6101> <6101> 2351 <6103> <6103> 4867 <6106> <6106> 4861 <6108> <6108> 3848 <6109> <6109> 3847 <610d> <610e> 4871 <610f> <610f> 1177 <6111> <6111> 8461 <6112> <6114> 14547 <6115> <6115> 4860 <611a> <611a> 1770 <611b> <611b> 1130 <611c> <611c> 14550 <611f> <611f> 1522 <6120> <6120> 8459 <6121> <6121> 4868 <6127> <6127> 4876 <6128> <6128> 4875 <612c> <612c> 4880 <6130> <6130> 8463 <6134> <6134> 4881 <6137> <6137> 8462 <613c> <613c> 4879 <613d> <613d> 4882 <613e> <613e> 4874 <613f> <613f> 4878 <6142> <6142> 4883 <6144> <6144> 4884 <6147> <6147> 4873 <6148> <6148> 2250 <614a> <614a> 4877 <614b> <614b> 2870 <614c> <614c> 1988 <614d> <614d> 4859 <614e> <614e> 2555 <6153> <6153> 4897 <6155> <6155> 3641 <6158> <615a> 4887 <615d> <615d> 4896 <615f> <615f> 4895 <6162> <6162> 3755 <6163> <6163> 1523 <6165> <6165> 4893 <6167> <6167> 1819 <6168> <6168> 1426 <616b> <616b> 4890 <616e> <616e> 3968 <616f> <616f> 4892 <6170> <6170> 1178 <6171> <6171> 4894 <6173> <6173> 4885 <6174> <6174> 4891 <6175> <6175> 4898 <6176> <6176> 1818 <6177> <6177> 4886 <617c> <617c> 14551 <617e> <617e> 3911 <6182> <6182> 3861 <6187> <6187> 4901 <618a> <618a> 4905 <618d> <618d> 14552 <618e> <618e> 2816 <6190> <6190> 4033 <6191> <6191> 4906 <6194> <6194> 4903 <6196> <6196> 4900 <6198> <6198> 8464 <6199> <6199> 4899 <619a> <619a> 4904 <619f> <619f> 14553 <61a4> <61a4> 3584 <61a7> <61a7> 3212 <61a8> <61a8> 14554 <61a9> <61a9> 1820 <61ab> <61ab> 4907 <61ac> <61ac> 4902 <61ae> <61ae> 4908 <61b2> <61b2> 1873 <61b6> <61b6> 1329 <61ba> <61ba> 4916 <61be> <61be> 1524 <61c2> <61c2> 14555 <61c3> <61c3> 4914 <61c6> <61c6> 4915 <61c7> <61c7> 2073 <61c8> <61c8> 4913 <61c9> <61c9> 4911 <61ca> <61ca> 4910 <61cb> <61cb> 4917 <61cc> <61cc> 4909 <61cd> <61cd> 4919 <61d0> <61d0> 1403 <61df> <61df> 14556 <61e3> <61e3> 4921 <61e6> <61e6> 4920 <61f2> <61f2> 3012 <61f4> <61f4> 4924 <61f6> <61f6> 4922 endcidrange 100 begincidrange <61f7> <61f7> 4912 <61f8> <61f8> 1874 <61fa> <61fa> 4923 <61fc> <61fc> 4927 <61fd> <61fd> 4926 <61fe> <61fe> 4928 <61ff> <61ff> 4925 <6200> <6200> 4929 <6208> <6209> 4930 <620a> <620a> 3642 <620c> <620c> 4933 <620d> <620d> 4932 <620e> <620e> 2377 <6210> <6210> 2642 <6211> <6211> 1382 <6212> <6212> 1404 <6213> <6213> 8465 <6214> <6214> 4934 <6215> <6215> 14557 <6216> <6216> 1155 <621a> <621a> 2672 <621b> <621b> 4935 <621d> <621d> 6756 <621e> <621e> 4936 <621f> <621f> 1847 <6221> <6221> 4937 <6226> <6226> 2707 <6229> <6229> 14558 <622a> <622a> 4938 <622e> <622e> 4939 <622f> <622f> 1620 <6230> <6230> 4940 <6232> <6233> 4941 <6234> <6234> 2871 <6236> <6236> 13757 <6238> <6238> 1921 <623b> <623b> 3821 <623e> <623e> 13390 <623f> <623f> 3690 <6240> <6240> 2420 <6241> <6241> 4943 <6243> <6243> 14559 <6246> <6246> 14560 <6247> <6247> 2708 <6248> <6248> 6938 <6249> <6249> 3446 <624b> <624b> 2326 <624c> <624c> 14561 <624d> <624d> 2109 <624e> <624e> 4944 <6251> <6251> 14562 <6253> <6253> 2855 <6255> <6255> 3575 <6256> <6256> 14563 <6258> <6258> 2897 <625b> <625b> 4947 <625e> <625e> 4945 <6260> <6260> 4948 <6263> <6263> 4946 <6268> <6268> 4949 <626e> <626e> 3585 <6271> <6271> 1147 <6276> <6276> 3536 <6279> <6279> 3447 <627c> <627c> 4950 <627e> <627e> 4953 <627f> <627f> 2461 <6280> <6280> 1621 <6282> <6282> 4951 <6283> <6283> 4958 <6284> <6284> 2462 <6285> <6285> 13765 <6289> <6289> 4952 <628a> <628a> 3322 <6291> <6291> 3912 <6292> <6293> 4954 <6294> <6294> 4959 <6295> <6295> 3172 <6296> <6296> 4956 <6297> <6297> 1989 <6298> <6298> 2690 <629b> <629b> 4973 <629c> <629c> 3400 <629e> <629e> 2898 <62a6> <62a6> 8466 <62ab> <62ab> 3448 <62ac> <62ac> 5042 <62b1> <62b1> 3658 <62b5> <62b5> 3085 <62b9> <62b9> 3747 <62bb> <62bb> 4962 <62bc> <62bc> 1313 <62bd> <62bd> 2984 <62c2> <62c2> 4971 <62c4> <62c4> 14564 <62c5> <62c5> 2930 <62c6> <62c6> 4965 <62c7> <62c7> 4972 <62c8> <62c8> 4967 <62c9> <62c9> 4974 endcidrange 100 begincidrange <62ca> <62ca> 4970 <62cc> <62cc> 4969 <62cd> <62cd> 3365 <62cf> <62cf> 4963 <62d0> <62d0> 1405 <62d1> <62d1> 4961 <62d2> <62d2> 1675 <62d3> <62d3> 2899 <62d4> <62d4> 4957 <62d7> <62d7> 4960 <62d8> <62d8> 1990 <62d9> <62d9> 2687 <62db> <62db> 2463 <62dc> <62dc> 4968 <62dd> <62dd> 3336 <62e0> <62e0> 1676 <62e1> <62e1> 1446 <62ec> <62ec> 1477 <62ed> <62ed> 2535 <62ee> <62ee> 4976 <62ef> <62ef> 4981 <62f1> <62f1> 4977 <62f3> <62f3> 1875 <62f5> <62f5> 4982 <62f6> <62f6> 2160 <62f7> <62f7> 2043 <62fc> <62fc> 14565 <62fe> <62fe> 2352 <62ff> <62ff> 4964 <6301> <6301> 2251 <6302> <6302> 4979 <6307> <6307> 2214 <6308> <6308> 4980 <6309> <6309> 1160 <630a> <630a> 14566 <630c> <630c> 4975 <630d> <630d> 14567 <6311> <6311> 3013 <6318> <6318> 14568 <6319> <6319> 1677 <631b> <631b> 14135 <631f> <631f> 1708 <6327> <6327> 4978 <6328> <6328> 1131 <632b> <632b> 2099 <632f> <632f> 2556 <6339> <6339> 14569 <633a> <633a> 3086 <633d> <633d> 3432 <633e> <633e> 4984 <633f> <633f> 2784 <6342> <6343> 14570 <6349> <6349> 2826 <634c> <634c> 2169 <634d> <634d> 4985 <634f> <634f> 4987 <6350> <6350> 4983 <6355> <6355> 3633 <6357> <6357> 3033 <635c> <635c> 2782 <6365> <6365> 14572 <6367> <6367> 3659 <6368> <6368> 2298 <6369> <6369> 4999 <636b> <636b> 4998 <636e> <636e> 2622 <6372> <6372> 1876 <6374> <6374> 14573 <6376> <6376> 4992 <6377> <6377> 2465 <637a> <637a> 3264 <637b> <637b> 3303 <637d> <637d> 14574 <6380> <6380> 4990 <6383> <6383> 2783 <6384> <6384> 14575 <6387> <6387> 14576 <6388> <6388> 2340 <6389> <6389> 4995 <638c> <638c> 2464 <638e> <638e> 4989 <638f> <638f> 4994 <6390> <6390> 14577 <6392> <6392> 3337 <6396> <6396> 4988 <6398> <6398> 1783 <639b> <639b> 1467 <639e> <639e> 14578 <639f> <639f> 4996 <63a0> <63a0> 3955 <63a1> <63a1> 2110 <63a2> <63a2> 2931 <63a3> <63a3> 4993 <63a5> <63a5> 2688 <63a7> <63a7> 1991 <63a8> <63a8> 2602 <63a9> <63a9> 1288 <63aa> <63aa> 2750 <63ab> <63ab> 4991 <63ac> <63ac> 1631 endcidrange 100 begincidrange <63b2> <63b2> 1821 <63b4> <63b4> 3051 <63b5> <63b5> 4997 <63bb> <63bb> 2785 <63be> <63be> 5000 <63c0> <63c0> 5002 <63c3> <63c3> 2839 <63c4> <63c4> 5008 <63c6> <63c6> 5003 <63c9> <63c9> 5005 <63cf> <63cf> 3507 <63d0> <63d0> 3087 <63d1> <63d1> 14579 <63d2> <63d2> 5006 <63d6> <63d6> 3862 <63da> <63da> 3890 <63db> <63db> 1525 <63dc> <63dc> 14580 <63e1> <63e1> 1138 <63e3> <63e3> 5004 <63e9> <63e9> 5001 <63ed> <63ed> 13340 <63ee> <63ee> 1588 <63f4> <63f4> 1289 <63f5> <63f5> 8467 <63f6> <63f6> 5007 <63f7> <63f7> 13892 <63fa> <63fa> 3891 <6406> <6406> 5011 <6409> <6409> 14581 <640d> <640d> 2843 <640f> <640f> 5018 <6410> <6410> 14582 <6413> <6413> 5012 <6414> <6414> 7724 <6416> <6416> 5009 <6417> <6417> 5016 <641c> <641c> 4986 <6422> <6422> 14583 <6426> <6426> 5013 <6428> <6428> 5017 <642c> <642c> 3414 <642d> <642d> 3173 <6434> <6434> 5010 <6436> <6436> 5014 <643a> <643a> 1822 <643e> <643e> 2145 <6442> <6442> 2689 <644e> <644e> 5022 <6451> <6451> 7747 <6454> <6454> 14584 <6458> <6458> 3104 <645b> <645b> 14585 <6460> <6460> 8468 <6467> <6467> 5019 <6469> <6469> 3726 <646d> <646d> 14586 <646f> <646f> 5020 <6476> <6476> 5021 <6478> <6478> 3802 <647a> <647a> 2630 <647b> <647b> 14587 <6483> <6483> 1848 <6488> <6488> 5028 <6492> <6492> 2179 <6493> <6493> 5025 <6495> <6495> 5024 <649a> <649a> 3304 <649d> <649d> 8469 <649e> <649e> 3213 <64a4> <64a4> 3115 <64a5> <64a5> 5026 <64a9> <64a9> 5027 <64ab> <64ab> 3553 <64ad> <64ad> 3323 <64ae> <64ae> 2161 <64b0> <64b0> 2709 <64b2> <64b2> 3710 <64b9> <64b9> 1447 <64bb> <64bb> 5034 <64bc> <64bc> 5029 <64be> <64bf> 14588 <64c1> <64c1> 3892 <64c2> <64c2> 5036 <64c5> <64c5> 5032 <64c7> <64c7> 5033 <64ca> <64ca> 13341 <64cd> <64cd> 2786 <64ce> <64ce> 8470 <64d2> <64d2> 5031 <64d4> <64d4> 4966 <64d8> <64d8> 5035 <64da> <64da> 5030 <64e0> <64e1> 5040 <64e2> <64e2> 3105 <64e3> <64e3> 5043 <64e5> <64e5> 14590 <64e6> <64e6> 2162 <64e7> <64e7> 5038 <64ec> <64ec> 1622 endcidrange 100 begincidrange <64ef> <64ef> 5044 <64f1> <64f1> 5037 <64f2> <64f2> 5048 <64f4> <64f4> 5047 <64f6> <64f6> 5046 <64f7> <64f7> 14591 <64fa> <64fa> 5049 <64fb> <64fb> 14592 <64fd> <64fd> 5051 <64fe> <64fe> 2521 <6500> <6500> 5050 <6504> <6504> 14593 <6505> <6505> 5054 <6516> <6516> 14594 <6518> <6518> 5052 <6519> <6519> 14595 <651c> <651c> 5053 <651d> <651d> 5015 <6522> <6522> 7831 <6523> <6523> 5056 <6524> <6524> 5055 <652a> <652a> 5023 <652b> <652b> 5057 <652c> <652c> 5045 <652f> <652f> 2215 <6534> <6535> 5058 <6536> <6536> 5061 <6537> <6537> 5060 <6538> <6538> 5062 <6539> <6539> 1406 <653b> <653b> 1992 <653e> <653e> 3660 <653f> <653f> 2643 <6545> <6545> 1922 <6547> <6547> 14596 <6548> <6548> 5064 <654d> <654d> 5067 <654e> <654e> 8471 <654f> <654f> 3524 <6551> <6551> 1657 <6555> <6555> 5066 <6556> <6556> 5065 <6557> <6557> 3338 <6558> <6558> 5068 <6559> <6559> 1709 <655d> <655d> 5070 <655e> <655e> 5069 <6562> <6562> 1526 <6563> <6563> 2180 <6566> <6566> 3248 <6567> <6567> 14597 <656c> <656c> 1823 <6570> <6570> 2618 <6572> <6572> 5071 <6574> <6574> 2644 <6575> <6575> 3106 <6577> <6577> 3537 <6578> <6578> 5072 <6581> <6581> 14598 <6582> <6583> 5073 <6585> <6585> 14599 <6587> <6587> 3592 <6588> <6588> 4620 <6589> <6589> 2666 <658c> <658c> 3518 <658e> <658e> 2120 <6590> <6590> 3449 <6591> <6591> 3415 <6597> <6597> 3143 <6599> <6599> 3977 <659b> <659b> 5076 <659c> <659c> 2300 <659f> <659f> 5077 <65a1> <65a1> 1146 <65a4> <65a4> 1740 <65a5> <65a5> 2673 <65a7> <65a7> 3538 <65ab> <65ab> 5078 <65ac> <65ac> 2192 <65ad> <65ad> 2949 <65af> <65af> 2217 <65b0> <65b0> 2557 <65b7> <65b7> 5079 <65b9> <65b9> 3661 <65bc> <65bc> 1305 <65bd> <65bd> 2218 <65c1> <65c1> 5082 <65c2> <65c2> 14600 <65c3> <65c3> 5080 <65c4> <65c4> 5083 <65c5> <65c5> 3969 <65c6> <65c6> 5081 <65cb> <65cb> 2719 <65cc> <65cc> 5084 <65cf> <65cf> 2834 <65d2> <65d2> 5085 <65d7> <65d7> 1590 <65d9> <65d9> 5087 <65db> <65db> 5086 <65e0> <65e1> 5088 endcidrange 100 begincidrange <65e2> <65e2> 1591 <65e3> <65e3> 13701 <65e5> <65e5> 3284 <65e6> <65e6> 2932 <65e7> <65e7> 1670 <65e8> <65e8> 2219 <65e9> <65e9> 2787 <65ec> <65ec> 2406 <65ed> <65ed> 1140 <65f0> <65f0> 14601 <65f1> <65f1> 5090 <65f2> <65f2> 14602 <65fa> <65fa> 1314 <65fb> <65fb> 5094 <6600> <6600> 8472 <6602> <6602> 1993 <6603> <6603> 5093 <6606> <6606> 2075 <6607> <6607> 2466 <6609> <6609> 8474 <660a> <660a> 5092 <660c> <660c> 2467 <660e> <660e> 3788 <660f> <660f> 2074 <6613> <6613> 1179 <6614> <6614> 2674 <6615> <6615> 8473 <661c> <661c> 5099 <661e> <661e> 8476 <661f> <661f> 2645 <6620> <6620> 1257 <6624> <6624> 8477 <6625> <6625> 2399 <6627> <6627> 3732 <6628> <6628> 2146 <662c> <662c> 14603 <662d> <662d> 2468 <662e> <662e> 8475 <662f> <662f> 2635 <6631> <6631> 8366 <6634> <6634> 5098 <6635> <6636> 5096 <663b> <663b> 7680 <663c> <663c> 2985 <663f> <663f> 5129 <6641> <6641> 5103 <6642> <6642> 2252 <6643> <6643> 1994 <6644> <6644> 5101 <6649> <6649> 5102 <664b> <664b> 2558 <664c> <664c> 14604 <664f> <664f> 5100 <6652> <6652> 2173 <6657> <6657> 8479 <6659> <6659> 8480 <665b> <665c> 14605 <665d> <665d> 5105 <665e> <665e> 5104 <665f> <665f> 5109 <6661> <6661> 14607 <6662> <6662> 5110 <6663> <6663> 14138 <6664> <6664> 5106 <6665> <6665> 8478 <6666> <6666> 1408 <6667> <6668> 5107 <6669> <6669> 3433 <666b> <666b> 14608 <666e> <666e> 3539 <666f> <666f> 1824 <6670> <6670> 5111 <6673> <6673> 8482 <6674> <6674> 2646 <6676> <6676> 2469 <6677> <6677> 14609 <667a> <667a> 2960 <6681> <6681> 1727 <6683> <6683> 5112 <6684> <6684> 5116 <6687> <6687> 1355 <6688> <6688> 5113 <6689> <6689> 5115 <668e> <668e> 5114 <6691> <6691> 2421 <6696> <6696> 2950 <6697> <6697> 1161 <6698> <6698> 5117 <6699> <6699> 8483 <669d> <669d> 5118 <66a0> <66a0> 8484 <66a2> <66a2> 3014 <66a4> <66a4> 14610 <66a6> <66a6> 4025 <66ab> <66ab> 2193 <66ae> <66ae> 3643 <66b2> <66b2> 8485 <66b4> <66b4> 3691 <66b8> <66b8> 5125 <66b9> <66b9> 5120 endcidrange 100 begincidrange <66bc> <66bc> 5123 <66be> <66be> 5122 <66bf> <66bf> 8486 <66c1> <66c1> 5119 <66c4> <66c4> 5124 <66c6> <66c6> 13397 <66c7> <66c7> 3254 <66c8> <66c8> 14611 <66c9> <66c9> 5121 <66d6> <66d6> 5126 <66d9> <66d9> 2422 <66da> <66da> 5127 <66dc> <66dc> 3893 <66dd> <66dd> 3374 <66e0> <66e0> 5128 <66e6> <66e6> 5130 <66e9> <66e9> 5131 <66ec> <66ec> 14612 <66f0> <66f0> 5132 <66f2> <66f2> 1730 <66f3> <66f3> 1258 <66f4> <66f4> 1995 <66f5> <66f5> 5133 <66f7> <66f7> 5134 <66f8> <66f8> 2427 <66f9> <66f9> 2788 <66fa> <66fa> 8487 <66fb> <66fb> 8369 <66fc> <66fc> 4333 <66fd> <66fd> 2752 <66fe> <66fe> 2751 <66ff> <66ff> 2872 <6700> <6700> 2103 <6703> <6703> 4171 <6705> <6705> 14613 <6708> <6708> 1860 <6709> <6709> 3863 <670b> <670b> 3662 <670d> <670d> 3568 <670e> <670e> 8488 <670f> <670f> 5135 <6713> <6713> 14614 <6714> <6714> 2147 <6715> <6715> 3035 <6716> <6716> 5136 <6717> <6717> 4053 <671b> <671b> 3692 <671d> <671d> 3015 <671e> <671e> 5137 <671f> <671f> 1592 <6726> <6727> 5138 <6728> <6728> 3814 <672a> <672a> 3760 <672b> <672b> 3748 <672c> <672c> 3722 <672d> <672d> 2163 <672e> <672e> 5141 <6731> <6731> 2327 <6733> <6733> 14615 <6734> <6734> 3711 <6736> <6736> 5143 <6737> <6737> 5146 <6738> <6738> 5145 <673a> <673a> 1589 <673d> <673d> 1658 <673f> <673f> 5142 <6741> <6741> 5144 <6743> <6743> 13751 <6746> <6746> 5147 <6748> <6748> 14616 <6749> <6749> 2623 <674c> <674c> 14617 <674e> <674e> 3941 <674f> <674f> 1165 <6750> <6750> 2128 <6751> <6751> 2844 <6753> <6753> 2313 <6756> <6756> 2523 <6759> <6759> 5150 <675c> <675c> 3144 <675e> <675e> 5148 <675f> <675f> 2827 <6760> <6760> 5149 <6761> <6761> 2522 <6762> <6762> 3817 <6763> <6764> 5151 <6765> <6765> 3922 <6766> <6766> 8490 <676a> <676a> 5157 <676d> <676d> 1996 <676e> <676e> 13681 <676f> <676f> 3339 <6770> <6770> 5154 <6771> <6771> 3174 <6772> <6772> 5091 <6773> <6773> 5095 <6775> <6775> 1641 <6776> <6776> 14618 <6777> <6777> 3325 <677b> <677b> 14619 endcidrange 100 begincidrange <677c> <677c> 5156 <677e> <677e> 2470 <677f> <677f> 3416 <6785> <6785> 5162 <6787> <6787> 3470 <6789> <6789> 5153 <678b> <678b> 5159 <678c> <678c> 5158 <6790> <6790> 2675 <6795> <6795> 3739 <6797> <6797> 3995 <679a> <679a> 3733 <679c> <679c> 1356 <679d> <679d> 2220 <67a0> <67a0> 4078 <67a1> <67a1> 5161 <67a2> <67a2> 2619 <67a6> <67a6> 5160 <67a9> <67a9> 5155 <67af> <67af> 1923 <67b0> <67b0> 14620 <67b2> <67b2> 14621 <67b3> <67b3> 5167 <67b4> <67b4> 5165 <67b6> <67b6> 1357 <67b7> <67b7> 5163 <67b8> <67b8> 5169 <67b9> <67b9> 5175 <67bb> <67bb> 8491 <67c0> <67c0> 8493 <67c1> <67c1> 2856 <67c4> <67c4> 3601 <67c6> <67c6> 5177 <67ca> <67ca> 3476 <67ce> <67ce> 5176 <67cf> <67cf> 3366 <67d0> <67d0> 3693 <67d1> <67d1> 1527 <67d3> <67d3> 2715 <67d4> <67d4> 2378 <67d7> <67d7> 14623 <67d8> <67d8> 3055 <67d9> <67d9> 14624 <67da> <67da> 3864 <67dd> <67dd> 5172 <67de> <67de> 5171 <67e2> <67e2> 5173 <67e4> <67e4> 5170 <67e7> <67e7> 5178 <67e9> <67e9> 5168 <67ec> <67ec> 5166 <67ee> <67ee> 5174 <67ef> <67ef> 5164 <67f0> <67f0> 14625 <67f1> <67f1> 2986 <67f3> <67f3> 3844 <67f4> <67f4> 2290 <67f5> <67f5> 2148 <67f9> <67f9> 14622 <67fb> <67fb> 2090 <67fe> <67fe> 3741 <67ff> <67ff> 1439 <6801> <6801> 8494 <6802> <6802> 3050 <6803> <6803> 3234 <6804> <6804> 1259 <6805> <6805> 7687 <6813> <6813> 2710 <6816> <6816> 2648 <6817> <6817> 1792 <681e> <681e> 5180 <6821> <6821> 1997 <6822> <6822> 1498 <6829> <6829> 5182 <682a> <682a> 1490 <682b> <682b> 5188 <682c> <682c> 14626 <6830> <6831> 14627 <6832> <6832> 5185 <6834> <6834> 2711 <6838> <6838> 1449 <6839> <6839> 2076 <683c> <683c> 1448 <683d> <683d> 2111 <6840> <6840> 5183 <6841> <6841> 1851 <6842> <6842> 1825 <6843> <6843> 3175 <6844> <6844> 8495 <6846> <6846> 5181 <6848> <6848> 1162 <684d> <684d> 5184 <684e> <684e> 5186 <6850> <6850> 1733 <6851> <6851> 1794 <6852> <6852> 8492 <6853> <6853> 1528 <6854> <6854> 1637 <6859> <6859> 5189 <685b> <685b> 14629 endcidrange 100 begincidrange <685c> <685c> 2153 <685d> <685d> 3743 <685f> <685f> 2181 <6863> <6863> 5190 <6867> <6867> 3490 <6872> <6872> 14630 <6874> <6874> 5202 <6875> <6875> 14631 <6876> <6876> 1331 <6877> <6877> 5191 <687a> <687a> 14632 <687e> <687e> 5208 <687f> <687f> 5192 <6881> <6881> 3978 <6883> <6883> 5199 <6884> <6884> 14633 <6885> <6885> 3349 <688d> <688d> 5207 <688e> <688e> 7836 <688f> <688f> 5194 <6893> <6893> 1144 <6894> <6894> 5196 <6897> <6897> 1998 <689b> <689b> 5198 <689d> <689d> 5197 <689f> <689f> 5193 <68a0> <68a0> 5204 <68a2> <68a2> 2471 <68a5> <68a5> 14634 <68a6> <68a6> 4542 <68a7> <68a7> 1948 <68a8> <68a8> 3942 <68ad> <68ad> 5195 <68af> <68af> 3088 <68b0> <68b0> 1409 <68b1> <68b1> 2077 <68b2> <68b2> 14635 <68b3> <68b3> 5187 <68b5> <68b5> 5203 <68b6> <68b6> 1471 <68b9> <68b9> 5201 <68ba> <68ba> 5205 <68bc> <68bc> 3176 <68c4> <68c4> 1594 <68c6> <68c6> 5235 <68c8> <68c8> 8367 <68c9> <68c9> 3797 <68ca> <68ca> 5210 <68cb> <68cb> 1593 <68cd> <68cd> 5217 <68cf> <68cf> 8496 <68d0> <68d0> 14636 <68d2> <68d2> 3694 <68d4> <68d4> 5218 <68d5> <68d5> 5220 <68d6> <68d6> 14637 <68d7> <68d7> 5224 <68d8> <68d8> 5212 <68da> <68da> 2920 <68df> <68df> 3177 <68e0> <68e0> 5228 <68e1> <68e1> 5215 <68e3> <68e3> 5225 <68e7> <68e7> 5219 <68e8> <68e8> 14638 <68ed> <68ed> 14639 <68ee> <68ee> 2559 <68ef> <68ef> 5229 <68f0> <68f1> 14640 <68f2> <68f2> 2647 <68f9> <68f9> 5227 <68fa> <68fa> 1529 <68fc> <68fc> 14642 <6900> <6900> 4086 <6901> <6901> 5209 <6904> <6904> 5223 <6905> <6905> 1180 <6908> <6908> 5211 <690b> <690b> 3782 <690c> <690c> 5216 <690d> <690d> 2536 <690e> <690e> 3043 <690f> <690f> 5206 <6911> <6911> 14643 <6912> <6912> 5222 <6913> <6913> 14644 <6919> <6919> 2624 <691a> <691a> 5232 <691b> <691b> 1487 <691c> <691c> 1877 <6921> <6921> 5234 <6922> <6922> 5213 <6923> <6923> 5233 <6925> <6925> 5226 <6926> <6926> 5214 <6928> <6928> 5230 <692a> <692a> 5231 <6930> <6930> 5248 <6934> <6934> 3238 <6935> <6935> 14645 endcidrange 100 begincidrange <6936> <6936> 5221 <6939> <6939> 5244 <693b> <693b> 14646 <693d> <693d> 5246 <693f> <693f> 3060 <694a> <694a> 3894 <6953> <6953> 3560 <6954> <6954> 5241 <6955> <6955> 2858 <6957> <6957> 14647 <6959> <6959> 5247 <695a> <695a> 2753 <695c> <695c> 5238 <695d> <695d> 5251 <695e> <695e> 5250 <6960> <6960> 3271 <6961> <6961> 5249 <6962> <6962> 3266 <6963> <6963> 14648 <6968> <6968> 8498 <696a> <696a> 5253 <696b> <696b> 5240 <696d> <696d> 1728 <696e> <696e> 5243 <696f> <696f> 2407 <6972> <6972> 14649 <6973> <6973> 3350 <6974> <6974> 5245 <6975> <6975> 1731 <6977> <6977> 5237 <6978> <6978> 5239 <6979> <6979> 5236 <697c> <697c> 4054 <697d> <697d> 1464 <697e> <697e> 5242 <697f> <6980> 14650 <6981> <6981> 5252 <6982> <6982> 1427 <698a> <698a> 2135 <698e> <698e> 1279 <6991> <6991> 5269 <6994> <6994> 4055 <6995> <6995> 5272 <6998> <6998> 8500 <699b> <699b> 2560 <699c> <699c> 5271 <69a0> <69a0> 5270 <69a6> <69a6> 14652 <69a7> <69a7> 5267 <69ad> <69ad> 14653 <69ae> <69ae> 5255 <69b1> <69b1> 5284 <69b2> <69b2> 5254 <69b4> <69b4> 5273 <69b7> <69b7> 14654 <69bb> <69bb> 5265 <69be> <69be> 5260 <69bf> <69bf> 5257 <69c1> <69c1> 5258 <69c3> <69c3> 5266 <69c7> <69c7> 7475 <69ca> <69ca> 5263 <69cb> <69cb> 1999 <69cc> <69cc> 3044 <69cd> <69cd> 2790 <69ce> <69ce> 5261 <69d0> <69d0> 5256 <69d3> <69d3> 5259 <69d6> <69d7> 14655 <69d8> <69d8> 3895 <69d9> <69d9> 3736 <69dd> <69dd> 5264 <69de> <69de> 5274 <69e2> <69e2> 8501 <69e7> <69e7> 5282 <69e8> <69e8> 5275 <69ea> <69ea> 13679 <69eb> <69eb> 5288 <69ed> <69ed> 5286 <69f2> <69f2> 5281 <69f6> <69f6> 14143 <69f9> <69f9> 5280 <69fb> <69fb> 3052 <69fd> <69fd> 2791 <69ff> <69ff> 5278 <6a01> <6a01> 14657 <6a02> <6a02> 5276 <6a05> <6a05> 5283 <6a0a> <6a0a> 5289 <6a0b> <6a0b> 3465 <6a0c> <6a0c> 5295 <6a0f> <6a0f> 14658 <6a12> <6a12> 5290 <6a13> <6a13> 5293 <6a14> <6a14> 5287 <6a15> <6a15> 14659 <6a17> <6a17> 2994 <6a19> <6a19> 3498 <6a1b> <6a1b> 5277 <6a1e> <6a1e> 5285 endcidrange 100 begincidrange <6a1f> <6a1f> 2472 <6a21> <6a21> 3803 <6a22> <6a22> 5305 <6a23> <6a23> 5292 <6a28> <6a28> 14660 <6a29> <6a29> 1878 <6a2a> <6a2a> 1315 <6a2b> <6a2b> 1469 <6a2e> <6a2e> 5268 <6a30> <6a30> 8502 <6a34> <6a34> 14661 <6a35> <6a35> 2473 <6a36> <6a36> 5297 <6a38> <6a38> 5304 <6a39> <6a39> 2341 <6a3a> <6a3a> 1488 <6a3d> <6a3d> 2924 <6a3e> <6a3e> 14662 <6a44> <6a44> 5294 <6a45> <6a45> 14663 <6a46> <6a46> 8504 <6a47> <6a47> 5299 <6a48> <6a48> 5303 <6a4b> <6a4b> 1710 <6a50> <6a51> 14664 <6a54> <6a54> 15412 <6a56> <6a56> 14666 <6a58> <6a58> 1638 <6a59> <6a59> 5301 <6a5b> <6a5b> 14667 <6a5f> <6a5f> 1595 <6a61> <6a61> 3235 <6a62> <6a62> 5300 <6a66> <6a66> 5302 <6a6b> <6a6b> 8503 <6a72> <6a72> 5296 <6a73> <6a73> 8505 <6a78> <6a78> 5298 <6a7e> <6a7e> 8506 <6a7f> <6a7f> 1470 <6a80> <6a80> 2951 <6a83> <6a83> 14668 <6a84> <6a84> 5309 <6a89> <6a89> 14669 <6a8d> <6a8d> 5307 <6a8e> <6a8e> 1949 <6a90> <6a90> 5306 <6a91> <6a91> 14670 <6a97> <6a97> 5312 <6a9c> <6a9c> 5179 <6a9d> <6a9f> 14671 <6aa0> <6aa0> 5308 <6aa2> <6aa3> 5310 <6aaa> <6aaa> 5323 <6aac> <6aac> 5319 <6aae> <6aae> 5200 <6ab3> <6ab3> 5318 <6ab8> <6ab8> 5317 <6abb> <6abb> 5314 <6ac1> <6ac1> 5291 <6ac2> <6ac2> 5316 <6ac3> <6ac3> 5315 <6ad1> <6ad1> 5321 <6ad3> <6ad3> 4044 <6ada> <6ada> 5324 <6adb> <6adb> 1779 <6adc> <6adc> 14674 <6ade> <6ade> 5320 <6adf> <6adf> 5322 <6ae2> <6ae2> 8507 <6ae4> <6ae4> 8508 <6ae7> <6ae7> 14675 <6ae8> <6ae8> 3387 <6aea> <6aea> 5325 <6aec> <6aec> 14676 <6afa> <6afa> 5329 <6afb> <6afb> 5326 <6b04> <6b04> 3933 <6b05> <6b05> 5327 <6b0a> <6b0a> 5279 <6b12> <6b12> 5330 <6b16> <6b16> 5331 <6b1d> <6b1d> 1239 <6b1e> <6b1e> 14677 <6b1f> <6b1f> 5333 <6b20> <6b20> 1853 <6b21> <6b21> 2253 <6b23> <6b23> 1741 <6b24> <6b24> 14678 <6b27> <6b27> 1316 <6b32> <6b32> 3913 <6b35> <6b35> 14679 <6b37> <6b37> 5335 <6b38> <6b38> 5334 <6b39> <6b39> 5337 <6b3a> <6b3a> 1623 <6b3d> <6b3d> 1742 <6b3e> <6b3e> 1530 <6b43> <6b43> 5340 <6b46> <6b46> 14680 endcidrange 100 begincidrange <6b47> <6b47> 5339 <6b49> <6b49> 5341 <6b4c> <6b4c> 1358 <6b4e> <6b4e> 2933 <6b50> <6b50> 5342 <6b53> <6b53> 1531 <6b54> <6b54> 5344 <6b56> <6b56> 14681 <6b59> <6b59> 5343 <6b5b> <6b5b> 5345 <6b5f> <6b5f> 5346 <6b60> <6b60> 14682 <6b61> <6b61> 5347 <6b62> <6b62> 2221 <6b63> <6b63> 2649 <6b64> <6b64> 2065 <6b65> <6b65> 13386 <6b66> <6b66> 3554 <6b69> <6b69> 3634 <6b6a> <6b6a> 4074 <6b6f> <6b6f> 2243 <6b72> <6b72> 13785 <6b73> <6b73> 2112 <6b74> <6b74> 4026 <6b77> <6b77> 13398 <6b78> <6b79> 5348 <6b7b> <6b7b> 2222 <6b7f> <6b80> 5350 <6b82> <6b82> 14683 <6b83> <6b83> 5353 <6b84> <6b84> 5352 <6b86> <6b86> 3718 <6b89> <6b89> 2408 <6b8a> <6b8a> 2328 <6b8b> <6b8b> 2194 <6b8d> <6b8d> 5354 <6b95> <6b95> 5356 <6b96> <6b96> 2537 <6b98> <6b98> 5355 <6b9e> <6b9e> 5357 <6ba4> <6ba4> 5358 <6baa> <6bab> 5359 <6baf> <6baf> 5361 <6bb1> <6bb1> 5363 <6bb2> <6bb2> 5362 <6bb3> <6bb3> 5364 <6bb4> <6bb4> 1317 <6bb5> <6bb5> 2952 <6bb7> <6bb7> 5365 <6bba> <6bba> 2164 <6bbb> <6bbb> 1450 <6bbc> <6bbc> 5366 <6bbe> <6bbe> 14684 <6bbf> <6bbf> 3132 <6bc0> <6bc0> 4509 <6bc5> <6bc5> 1597 <6bc6> <6bc6> 5367 <6bcb> <6bcb> 5368 <6bcc> <6bcc> 14148 <6bcd> <6bcd> 3644 <6bce> <6bce> 3734 <6bcf> <6bcf> 13388 <6bd2> <6bd2> 3231 <6bd3> <6bd3> 5369 <6bd4> <6bd4> 3450 <6bd6> <6bd6> 8509 <6bd8> <6bd8> 3471 <6bdb> <6bdb> 3807 <6bdf> <6bdf> 5370 <6be1> <6be1> 14685 <6beb> <6beb> 5372 <6bec> <6bec> 5371 <6bef> <6bef> 5374 <6bf1> <6bf1> 14686 <6bf3> <6bf3> 5373 <6c08> <6c08> 5376 <6c0f> <6c0f> 2223 <6c10> <6c10> 14687 <6c11> <6c11> 3773 <6c13> <6c14> 5377 <6c17> <6c17> 1598 <6c1b> <6c1b> 5379 <6c23> <6c23> 5381 <6c24> <6c24> 5380 <6c33> <6c33> 14688 <6c34> <6c34> 2603 <6c35> <6c35> 14689 <6c37> <6c37> 3499 <6c38> <6c38> 1260 <6c3a> <6c3a> 14690 <6c3e> <6c3e> 3417 <6c3f> <6c3f> 8510 <6c40> <6c40> 3089 <6c41> <6c41> 2379 <6c42> <6c42> 1659 <6c4e> <6c4e> 3418 <6c50> <6c50> 2266 <6c55> <6c55> 5383 <6c57> <6c57> 1532 <6c59> <6c59> 14691 endcidrange 100 begincidrange <6c5a> <6c5a> 1306 <6c5c> <6c5c> 8511 <6c5d> <6c5d> 3274 <6c5e> <6c5e> 5382 <6c5f> <6c5f> 2000 <6c60> <6c60> 2961 <6c62> <6c62> 5384 <6c68> <6c68> 5392 <6c6a> <6c6a> 5385 <6c6f> <6c6f> 8513 <6c70> <6c70> 2849 <6c72> <6c72> 1660 <6c73> <6c73> 5393 <6c76> <6c76> 14692 <6c7a> <6c7a> 1854 <6c7b> <6c7b> 14693 <6c7d> <6c7d> 1599 <6c7e> <6c7e> 5391 <6c81> <6c81> 5389 <6c82> <6c82> 5386 <6c83> <6c83> 3914 <6c85> <6c85> 14694 <6c86> <6c86> 8512 <6c88> <6c88> 3036 <6c8c> <6c8c> 3249 <6c8d> <6c8d> 5387 <6c90> <6c90> 5395 <6c92> <6c92> 5394 <6c93> <6c93> 1785 <6c95> <6c95> 14695 <6c96> <6c96> 1325 <6c99> <6c99> 2091 <6c9a> <6c9a> 5388 <6c9b> <6c9b> 5390 <6c9c> <6c9c> 14696 <6ca1> <6ca1> 3717 <6ca2> <6ca2> 2900 <6caa> <6caa> 14153 <6cab> <6cab> 3749 <6cae> <6cae> 5403 <6cb1> <6cb1> 5404 <6cb3> <6cb3> 1359 <6cb8> <6cb8> 3576 <6cb9> <6cb9> 3849 <6cba> <6cba> 5406 <6cbb> <6cbb> 2255 <6cbc> <6cbc> 2474 <6cbd> <6cbd> 5399 <6cbe> <6cbe> 5405 <6cbf> <6cbf> 1290 <6cc1> <6cc1> 1711 <6cc4> <6cc4> 5396 <6cc5> <6cc5> 5401 <6cc9> <6cc9> 2712 <6cca> <6cca> 3367 <6ccc> <6ccc> 3451 <6cd0> <6cd0> 14697 <6cd3> <6cd3> 5398 <6cd4> <6cd4> 14698 <6cd5> <6cd5> 3663 <6cd6> <6cd6> 14699 <6cd7> <6cd7> 5400 <6cd9> <6cd9> 5409 <6cda> <6cda> 8514 <6cdb> <6cdb> 5407 <6cdd> <6cdd> 5402 <6ce0> <6ce0> 14700 <6ce1> <6ce1> 3664 <6ce2> <6ce2> 3326 <6ce3> <6ce3> 1661 <6ce5> <6ce5> 3103 <6ce8> <6ce8> 2987 <6cea> <6cea> 5410 <6ceb> <6cec> 14701 <6cee> <6cee> 14703 <6cef> <6cef> 5408 <6cf0> <6cf0> 2873 <6cf1> <6cf1> 5397 <6cf3> <6cf3> 1261 <6d01> <6d01> 15413 <6d04> <6d04> 8515 <6d0a> <6d0a> 14704 <6d0b> <6d0b> 3896 <6d0c> <6d0c> 5421 <6d0e> <6d0e> 14705 <6d11> <6d11> 14706 <6d12> <6d12> 5420 <6d17> <6d17> 2714 <6d19> <6d19> 5417 <6d1b> <6d1b> 3926 <6d1e> <6d1e> 3214 <6d1f> <6d1f> 5411 <6d25> <6d25> 3041 <6d29> <6d29> 1262 <6d2a> <6d2a> 2001 <6d2b> <6d2b> 5414 <6d2e> <6d2e> 14707 <6d32> <6d32> 2353 <6d33> <6d33> 5419 <6d35> <6d35> 5418 endcidrange 100 begincidrange <6d36> <6d36> 5413 <6d38> <6d38> 5416 <6d3b> <6d3b> 1478 <6d3d> <6d3d> 5415 <6d3e> <6d3e> 3327 <6d41> <6d41> 3958 <6d44> <6d44> 2524 <6d45> <6d45> 2713 <6d57> <6d57> 14708 <6d59> <6d59> 5427 <6d5a> <6d5a> 5425 <6d5c> <6d5c> 3519 <6d5e> <6d5e> 14709 <6d63> <6d63> 5422 <6d64> <6d64> 5424 <6d65> <6d65> 14710 <6d66> <6d66> 1244 <6d69> <6d69> 2002 <6d6a> <6d6a> 4056 <6d6c> <6d6c> 1435 <6d6e> <6d6e> 3540 <6d6f> <6d6f> 8517 <6d74> <6d74> 3915 <6d77> <6d77> 1410 <6d78> <6d78> 2561 <6d79> <6d79> 5426 <6d82> <6d82> 14711 <6d85> <6d85> 5431 <6d87> <6d87> 8516 <6d88> <6d88> 2475 <6d89> <6d89> 13354 <6d8c> <6d8c> 3866 <6d8e> <6d8e> 5428 <6d93> <6d93> 5423 <6d95> <6d95> 5429 <6d96> <6d96> 8518 <6d99> <6d99> 4006 <6d9b> <6d9b> 3181 <6d9c> <6d9c> 3226 <6dac> <6dac> 8519 <6daf> <6daf> 1428 <6db2> <6db2> 1271 <6db5> <6db5> 5435 <6db8> <6db8> 5438 <6dbc> <6dbc> 3979 <6dbf> <6dbf> 14712 <6dc0> <6dc0> 3918 <6dc4> <6dc4> 14713 <6dc5> <6dc5> 5445 <6dc6> <6dc6> 5439 <6dc7> <6dc7> 5436 <6dca> <6dca> 14714 <6dcb> <6dcb> 3996 <6dcc> <6dcc> 5442 <6dcf> <6dcf> 8520 <6dd0> <6dd0> 15414 <6dd1> <6dd1> 2388 <6dd2> <6dd2> 5444 <6dd5> <6dd5> 5449 <6dd6> <6dd6> 14715 <6dd8> <6dd8> 3179 <6dd9> <6dd9> 5447 <6dda> <6dda> 13395 <6dde> <6dde> 5441 <6de1> <6de1> 2934 <6de4> <6de4> 5448 <6de6> <6de6> 5437 <6de8> <6de8> 5443 <6de9> <6de9> 14716 <6dea> <6dea> 5450 <6deb> <6deb> 1216 <6dec> <6dec> 5440 <6dee> <6dee> 5451 <6df1> <6df1> 2562 <6df2> <6df2> 8522 <6df3> <6df3> 2409 <6df5> <6df5> 3573 <6df7> <6df7> 2078 <6df8> <6df8> 8521 <6df9> <6df9> 5432 <6dfa> <6dfa> 5446 <6dfb> <6dfb> 3124 <6dfc> <6dfc> 8523 <6e05> <6e05> 2650 <6e07> <6e07> 1479 <6e08> <6e08> 2113 <6e09> <6e09> 2476 <6e0a> <6e0a> 5434 <6e0b> <6e0b> 2380 <6e13> <6e13> 1826 <6e15> <6e15> 5433 <6e17> <6e17> 14150 <6e19> <6e19> 5455 <6e1a> <6e1a> 2423 <6e1b> <6e1b> 1902 <6e1d> <6e1d> 5470 <6e1f> <6e1f> 5464 <6e20> <6e20> 1678 <6e21> <6e21> 3145 <6e22> <6e22> 14717 endcidrange 100 begincidrange <6e23> <6e23> 5459 <6e24> <6e24> 5468 <6e25> <6e25> 1139 <6e26> <6e26> 1236 <6e27> <6e27> 8526 <6e29> <6e29> 1337 <6e2b> <6e2b> 5461 <6e2c> <6e2c> 2828 <6e2d> <6e2d> 5452 <6e2e> <6e2e> 5454 <6e2f> <6e2f> 2003 <6e34> <6e34> 13330 <6e38> <6e38> 5471 <6e39> <6e39> 8524 <6e3a> <6e3a> 5466 <6e3c> <6e3c> 8527 <6e3e> <6e3e> 5458 <6e42> <6e42> 15415 <6e43> <6e43> 5465 <6e4a> <6e4a> 3767 <6e4d> <6e4d> 5463 <6e4e> <6e4e> 5467 <6e51> <6e51> 14718 <6e56> <6e56> 1924 <6e58> <6e58> 2477 <6e5b> <6e5b> 2935 <6e5c> <6e5c> 8525 <6e5f> <6e5f> 5457 <6e67> <6e67> 3865 <6e6b> <6e6b> 5460 <6e6e> <6e6e> 5453 <6e6f> <6e6f> 3180 <6e72> <6e72> 5456 <6e76> <6e76> 5462 <6e7e> <6e7e> 4087 <6e7f> <6e7f> 2282 <6e80> <6e80> 3756 <6e82> <6e82> 5472 <6e8c> <6e8c> 3394 <6e8f> <6e8f> 5484 <6e90> <6e90> 1903 <6e96> <6e96> 2410 <6e98> <6e98> 5474 <6e9c> <6e9c> 3959 <6e9d> <6e9d> 2004 <6e9f> <6e9f> 5487 <6ea2> <6ea2> 1202 <6ea5> <6ea5> 5485 <6eaa> <6eaa> 5473 <6eab> <6eab> 13324 <6eaf> <6eaf> 5479 <6eb2> <6eb2> 5481 <6eb6> <6eb6> 3897 <6eb7> <6eb7> 5476 <6eba> <6eba> 3112 <6ebd> <6ebd> 5478 <6ebf> <6ebf> 8528 <6ec2> <6ec2> 5486 <6ec4> <6ec4> 5480 <6ec5> <6ec5> 3795 <6ec7> <6ec7> 14719 <6ec9> <6ec9> 5475 <6eca> <6eca> 14720 <6ecb> <6ecb> 2254 <6ecc> <6ecc> 5499 <6ece> <6ece> 14721 <6ed1> <6ed1> 1480 <6ed3> <6ed3> 5477 <6ed4> <6ed5> 5482 <6ed9> <6ed9> 15416 <6edd> <6edd> 2892 <6ede> <6ede> 2874 <6ee6> <6ee6> 15396 <6eec> <6eec> 5491 <6eef> <6eef> 5497 <6ef2> <6ef2> 5495 <6ef4> <6ef4> 3107 <6ef7> <6ef7> 5502 <6ef8> <6ef8> 5492 <6efd> <6efd> 14722 <6efe> <6efe> 5493 <6eff> <6eff> 5469 <6f01> <6f01> 1683 <6f02> <6f02> 3500 <6f06> <6f06> 2283 <6f09> <6f09> 2057 <6f0f> <6f0f> 4057 <6f11> <6f11> 5489 <6f13> <6f13> 5501 <6f14> <6f14> 1291 <6f15> <6f15> 2792 <6f1a> <6f1a> 14723 <6f20> <6f20> 3375 <6f22> <6f22> 1533 <6f23> <6f23> 4034 <6f2a> <6f2a> 14724 <6f2b> <6f2b> 3757 <6f2c> <6f2c> 3054 <6f2f> <6f2f> 14725 <6f31> <6f31> 5496 endcidrange 100 begincidrange <6f32> <6f32> 5498 <6f33> <6f33> 14726 <6f38> <6f38> 2740 <6f3e> <6f3e> 5500 <6f3f> <6f3f> 5494 <6f41> <6f41> 5488 <6f45> <6f45> 1535 <6f51> <6f51> 7776 <6f54> <6f54> 1855 <6f58> <6f58> 5514 <6f5a> <6f5a> 14727 <6f5b> <6f5b> 5509 <6f5c> <6f5c> 2716 <6f5e> <6f5e> 14728 <6f5f> <6f5f> 1473 <6f62> <6f62> 14729 <6f64> <6f64> 2411 <6f66> <6f66> 5518 <6f6d> <6f6d> 5511 <6f6e> <6f6e> 3016 <6f6f> <6f6f> 5508 <6f70> <6f70> 3061 <6f74> <6f74> 5543 <6f78> <6f78> 5505 <6f7a> <6f7a> 5504 <6f7c> <6f7c> 5513 <6f7d> <6f7d> 14730 <6f80> <6f80> 5507 <6f81> <6f81> 5506 <6f82> <6f82> 5512 <6f84> <6f84> 2629 <6f86> <6f86> 5503 <6f88> <6f88> 8529 <6f8b> <6f8b> 14731 <6f8d> <6f8d> 14732 <6f8e> <6f8e> 5515 <6f91> <6f91> 5516 <6f92> <6f92> 14733 <6f94> <6f94> 14734 <6f97> <6f97> 1534 <6f98> <6f98> 13884 <6f9a> <6f9a> 14735 <6fa1> <6fa1> 5521 <6fa3> <6fa3> 5520 <6fa4> <6fa4> 5522 <6fa7> <6fa8> 14736 <6faa> <6faa> 5525 <6fb1> <6fb1> 3133 <6fb3> <6fb3> 5519 <6fb5> <6fb5> 8530 <6fb6> <6fb6> 14738 <6fb9> <6fb9> 5523 <6fc0> <6fc0> 1849 <6fc1> <6fc1> 2905 <6fc2> <6fc2> 5517 <6fc3> <6fc3> 3313 <6fc6> <6fc6> 5524 <6fd4> <6fd4> 5529 <6fd5> <6fd5> 5527 <6fd8> <6fd8> 5530 <6fda> <6fda> 14739 <6fdb> <6fdb> 5533 <6fde> <6fde> 14740 <6fdf> <6fdf> 5526 <6fe0> <6fe0> 2044 <6fe1> <6fe1> 3294 <6fe4> <6fe4> 5430 <6feb> <6feb> 3934 <6fec> <6fec> 5528 <6fee> <6fee> 5532 <6fef> <6fef> 2901 <6ff1> <6ff1> 5531 <6ff3> <6ff3> 5510 <6ff5> <6ff5> 8531 <6ff6> <6ff6> 7076 <6ff9> <6ff9> 14741 <6ffa> <6ffa> 5536 <6ffe> <6ffe> 5540 <7001> <7001> 5538 <7005> <7005> 8532 <7006> <7006> 7760 <7007> <7007> 8533 <7009> <7009> 5534 <700b> <700b> 5535 <700f> <700f> 5539 <7011> <7011> 5537 <7015> <7015> 3520 <7018> <7018> 5545 <701a> <701a> 5542 <701b> <701b> 5541 <701d> <701d> 5544 <701e> <701e> 3244 <701f> <701f> 5546 <7026> <7026> 2995 <7027> <7027> 2893 <7028> <7028> 8534 <702c> <702c> 2633 <7030> <7030> 5547 <7032> <7032> 5549 <7039> <7039> 14742 endcidrange 100 begincidrange <703c> <703c> 14743 <703e> <703e> 5548 <704a> <704a> 14744 <704c> <704c> 5490 <7051> <7051> 5550 <7054> <7054> 14745 <7058> <7058> 3263 <705d> <705e> 14746 <7063> <7063> 5551 <7064> <7064> 14748 <706b> <706b> 1360 <706c> <706c> 14749 <706f> <706f> 3182 <7070> <7070> 1411 <7078> <7078> 1662 <707c> <707c> 2314 <707d> <707d> 2114 <707e> <707e> 14750 <7081> <7081> 14751 <7085> <7085> 8535 <7089> <7089> 4045 <708a> <708a> 2604 <708e> <708e> 1292 <7092> <7092> 5553 <7095> <7095> 14752 <7099> <7099> 5552 <70ab> <70ab> 8536 <70ac> <70ac> 5556 <70ad> <70ad> 2936 <70ae> <70ae> 5559 <70af> <70af> 5554 <70b3> <70b3> 5558 <70b7> <70b7> 14753 <70b8> <70b8> 5557 <70b9> <70b9> 3130 <70ba> <70ba> 1181 <70bb> <70bb> 8365 <70c8> <70c8> 4029 <70cb> <70cb> 5561 <70cf> <70cf> 1226 <70d3> <70d4> 14754 <70d8> <70d8> 14756 <70d9> <70d9> 5563 <70dc> <70dc> 14757 <70dd> <70dd> 5562 <70df> <70df> 5560 <70f1> <70f1> 5555 <70f9> <70f9> 3665 <70fd> <70fd> 5565 <7104> <7104> 8538 <7107> <7107> 14758 <7109> <7109> 5564 <710f> <710f> 8537 <7114> <7114> 1293 <7119> <7119> 5567 <711a> <711a> 3586 <711c> <711c> 5566 <7120> <7120> 14759 <7121> <7121> 3777 <7126> <7126> 2479 <7130> <7130> 7644 <7131> <7131> 14760 <7136> <7136> 2741 <713c> <713c> 2478 <7146> <7147> 8540 <7149> <7149> 4035 <714a> <714a> 14761 <714c> <714c> 5573 <714e> <714e> 2717 <7152> <7152> 14762 <7155> <7155> 5569 <7156> <7156> 5574 <7159> <7159> 1294 <715c> <715c> 8539 <7160> <7160> 14763 <7162> <7162> 5572 <7164> <7164> 3351 <7165> <7165> 5568 <7166> <7166> 5571 <7167> <7167> 2480 <7169> <7169> 3429 <716c> <716c> 5575 <716e> <716e> 2301 <7179> <7179> 14764 <717d> <717d> 2718 <7184> <7184> 5578 <7188> <7188> 5570 <718a> <718a> 1789 <718f> <718f> 5576 <7192> <7192> 14765 <7194> <7194> 3898 <7195> <7195> 5579 <7199> <7199> 8285 <719f> <719f> 2393 <71a8> <71a8> 5580 <71ac> <71ac> 5581 <71b1> <71b1> 3300 <71b3> <71b3> 14766 <71b9> <71b9> 5583 <71be> <71be> 5584 endcidrange 100 begincidrange <71c1> <71c1> 8543 <71c3> <71c3> 3305 <71c8> <71c8> 3183 <71c9> <71c9> 5586 <71cb> <71cb> 14767 <71ce> <71ce> 5588 <71d0> <71d0> 3997 <71d2> <71d2> 5585 <71d3> <71d3> 14768 <71d4> <71d4> 5587 <71d5> <71d5> 1295 <71d6> <71d6> 14769 <71d7> <71d7> 5582 <71df> <71df> 4430 <71e0> <71e0> 5589 <71e5> <71e5> 2793 <71e6> <71e6> 2182 <71e7> <71e7> 5591 <71ec> <71ec> 5590 <71ed> <71ed> 2538 <71ee> <71ee> 4334 <71f5> <71f5> 5592 <71f9> <71f9> 5594 <71fb> <71fb> 5577 <71fc> <71fc> 5593 <71fe> <71fe> 8544 <71ff> <71ff> 5595 <7200> <7200> 14770 <7206> <7206> 3376 <720d> <720d> 5596 <7210> <7210> 5597 <721b> <721b> 5598 <721d> <721d> 14771 <7228> <7228> 5599 <722a> <722a> 3066 <722b> <722b> 14772 <722c> <722c> 5601 <722d> <722d> 5600 <7230> <7230> 5602 <7232> <7232> 5603 <7235> <7235> 2315 <7236> <7236> 3541 <7238> <7238> 14773 <723a> <723a> 3832 <723b> <723c> 5604 <723d> <723d> 2776 <723e> <723e> 2256 <723f> <7240> 5606 <7241> <7241> 14774 <7246> <7246> 5608 <7247> <7247> 3618 <7248> <7248> 3419 <724b> <724b> 5609 <724c> <724c> 3341 <7252> <7252> 3017 <7253> <7253> 14775 <7255> <7256> 14776 <7258> <7258> 5610 <7259> <7259> 1383 <725b> <725b> 1671 <725c> <725c> 14778 <725d> <725d> 3794 <725f> <725f> 3778 <7261> <7261> 1332 <7262> <7262> 4058 <7267> <7267> 3712 <7269> <7269> 3578 <7272> <7272> 2651 <7274> <7274> 5611 <7279> <7279> 3227 <727d> <727d> 1879 <727e> <727e> 5612 <7280> <7280> 2116 <7281> <7281> 5614 <7282> <7282> 5613 <7287> <7287> 5615 <728d> <728d> 14779 <7292> <7292> 5616 <7296> <7296> 5617 <72a0> <72a0> 1624 <72a2> <72a2> 5618 <72a7> <72a7> 5619 <72ac> <72ac> 1880 <72ad> <72ad> 14780 <72af> <72af> 3420 <72b1> <72b1> 8545 <72b2> <72b2> 5621 <72b4> <72b4> 14781 <72b6> <72b6> 2525 <72b9> <72b9> 5620 <72be> <72be> 8546 <72c0> <72c0> 13355 <72c2> <72c2> 1712 <72c3> <72c3> 5622 <72c4> <72c4> 5624 <72c6> <72c6> 5623 <72c7> <72c7> 14782 <72ce> <72ce> 5625 <72d0> <72d0> 1925 <72d2> <72d2> 5626 endcidrange 100 begincidrange <72d7> <72d7> 1761 <72d9> <72d9> 2754 <72db> <72db> 2063 <72e0> <72e1> 5628 <72e2> <72e2> 5627 <72e9> <72e9> 2329 <72ec> <72ec> 3232 <72ed> <72ed> 1713 <72f7> <72f7> 5631 <72f8> <72f8> 2922 <72f9> <72f9> 5630 <72fb> <72fb> 14783 <72fc> <72fc> 4059 <72fd> <72fd> 3352 <7304> <7305> 14784 <730a> <730a> 5634 <7316> <7316> 5636 <7317> <7317> 5633 <731b> <731b> 3808 <731c> <731c> 5635 <731d> <731d> 5637 <731f> <731f> 3980 <7324> <7324> 8547 <7325> <7325> 5641 <7328> <7328> 14786 <7329> <7329> 5640 <732a> <732a> 2996 <732b> <732b> 3299 <732e> <732e> 1881 <732f> <732f> 5639 <7331> <7331> 14787 <7334> <7334> 5638 <7336> <7337> 3867 <733e> <733e> 5642 <733f> <733f> 1296 <7343> <7343> 14788 <7344> <7344> 2056 <7345> <7345> 2224 <734e> <734f> 5643 <7357> <7357> 5646 <7363> <7363> 2381 <7368> <7368> 5648 <736a> <736a> 5647 <736c> <736c> 14789 <7370> <7370> 5649 <7372> <7372> 1451 <7375> <7375> 5651 <7377> <7377> 8549 <7378> <7378> 5650 <737a> <737a> 5653 <737b> <737b> 5652 <737c> <737c> 14790 <7383> <7383> 14791 <7384> <7384> 1904 <7385> <7386> 14792 <7387> <7387> 3952 <7389> <7389> 1732 <738b> <738b> 1318 <7395> <7395> 14794 <7396> <7396> 1762 <739e> <73a0> 14795 <73a6> <73a6> 14798 <73a8> <73a8> 15423 <73a9> <73a9> 1565 <73ab> <73ab> 14799 <73b2> <73b2> 4016 <73b3> <73b3> 5655 <73b5> <73b5> 14800 <73b7> <73b7> 14801 <73ba> <73ba> 13802 <73bb> <73bb> 5657 <73bc> <73bc> 14802 <73bd> <73bd> 8550 <73c0> <73c0> 5658 <73c2> <73c2> 1361 <73c8> <73c8> 5654 <73c9> <73c9> 8551 <73ca> <73ca> 2183 <73cd> <73cd> 3037 <73ce> <73ce> 5656 <73cf> <73cf> 14803 <73d2> <73d2> 8554 <73d6> <73d6> 8552 <73d9> <73d9> 14804 <73de> <73de> 5661 <73e0> <73e0> 2330 <73e3> <73e3> 8553 <73e4> <73e4> 15417 <73e5> <73e5> 5659 <73e9> <73e9> 14805 <73ea> <73ea> 1812 <73ed> <73ed> 3421 <73ee> <73ee> 5660 <73f1> <73f1> 5687 <73f4> <73f4> 14806 <73f5> <73f5> 8556 <73f8> <73f8> 5666 <73fd> <73fd> 14807 <73fe> <73fe> 1905 <7403> <7403> 1663 endcidrange 100 begincidrange <7404> <7404> 14808 <7405> <7405> 5663 <7406> <7406> 3943 <7407> <7407> 8555 <7409> <7409> 3960 <740a> <740a> 14809 <741a> <741b> 14810 <7421> <7421> 15418 <7422> <7422> 2902 <7424> <7424> 14812 <7425> <7425> 5665 <7426> <7426> 8557 <7428> <7428> 14813 <7429> <7429> 8559 <742a> <742a> 8558 <742c> <742c> 14814 <742e> <742e> 8560 <742f> <7431> 14815 <7432> <7432> 5667 <7433> <7433> 3998 <7434> <7434> 1743 <7435> <7435> 3472 <7436> <7436> 3328 <7439> <7439> 14818 <743a> <743a> 5668 <743f> <743f> 5670 <7441> <7441> 5673 <7444> <7444> 14819 <7447> <7447> 14820 <744b> <744b> 14821 <744d> <744d> 14822 <7451> <7451> 14823 <7455> <7455> 5669 <7457> <7457> 14824 <7459> <7459> 5672 <745a> <745a> 1950 <745b> <745b> 1263 <745c> <745c> 5674 <745e> <745e> 2614 <745f> <745f> 5671 <7460> <7460> 4004 <7462> <7462> 8561 <7463> <7463> 5677 <7464> <7464> 7477 <7466> <7466> 14825 <7469> <7469> 5675 <746a> <746a> 5678 <746b> <746b> 14826 <746f> <746f> 5664 <7470> <7470> 5676 <7471> <7471> 14827 <7473> <7473> 2092 <7476> <7476> 5679 <747e> <747e> 5680 <7480> <7480> 14828 <7483> <7483> 3944 <7485> <7487> 14829 <7489> <7489> 8562 <748b> <748b> 5681 <7490> <7490> 14832 <7498> <7498> 14833 <749c> <749c> 14834 <749e> <749e> 5682 <749f> <749f> 8563 <74a0> <74a0> 14835 <74a2> <74a2> 5662 <74a3> <74a3> 14836 <74a7> <74a7> 5683 <74a8> <74a8> 14837 <74ab> <74ab> 14838 <74b0> <74b0> 1536 <74b5> <74b5> 14839 <74bd> <74bd> 2257 <74bf> <74bf> 14840 <74c8> <74c8> 14841 <74ca> <74ca> 5684 <74cf> <74cf> 5685 <74d4> <74d4> 5686 <74da> <74da> 14842 <74dc> <74dc> 1245 <74de> <74de> 14843 <74e0> <74e0> 5688 <74e2> <74e2> 3501 <74e3> <74e3> 5689 <74e6> <74e6> 1504 <74e7> <74e7> 5690 <74e9> <74e9> 5691 <74ee> <74ee> 5692 <74ef> <74ef> 14160 <74f0> <74f1> 5694 <74f2> <74f2> 5693 <74f6> <74f6> 3525 <74f7> <74f7> 5697 <74f8> <74f8> 5696 <7501> <7501> 8564 <7503> <7503> 5699 <7504> <7504> 5698 <7505> <7505> 5700 <750c> <750c> 5701 <750d> <750d> 5703 endcidrange 100 begincidrange <750e> <750e> 5702 <7511> <7511> 2059 <7513> <7513> 5705 <7515> <7515> 5704 <7518> <7518> 1537 <751a> <751a> 2585 <751c> <751c> 3126 <751e> <751e> 5706 <751f> <751f> 2652 <7522> <7522> 13790 <7523> <7523> 2184 <7525> <7525> 1307 <7526> <7526> 5707 <7528> <7528> 3899 <752b> <752b> 3635 <752c> <752c> 5708 <752f> <752f> 8434 <7530> <7530> 3134 <7531> <7531> 3869 <7532> <7532> 2005 <7533> <7533> 2563 <7537> <7537> 2953 <7538> <7538> 4297 <753a> <753a> 3018 <753b> <753b> 1384 <753c> <753c> 5709 <7544> <7544> 5710 <7546> <7546> 5715 <7549> <7549> 5713 <754a> <754a> 5712 <754b> <754b> 5063 <754c> <754c> 1412 <754d> <754d> 5711 <754e> <754e> 14844 <754f> <754f> 1182 <7551> <7551> 3390 <7554> <7554> 3422 <7559> <7559> 3961 <755a> <755a> 5716 <755b> <755b> 5714 <755c> <755c> 2970 <755d> <755d> 2634 <7560> <7560> 3391 <7562> <7562> 3487 <7564> <7564> 5718 <7565> <7565> 3956 <7566> <7566> 1827 <7567> <7567> 5719 <7569> <7569> 5717 <756a> <756a> 3434 <756b> <756b> 5720 <756c> <756c> 15419 <756d> <756d> 5721 <756f> <756f> 8565 <7570> <7570> 1183 <7573> <7573> 2526 <7574> <7574> 5726 <7575> <7575> 14161 <7576> <7576> 5723 <7577> <7577> 3269 <7578> <7578> 5722 <7579> <7579> 14845 <757f> <757f> 1600 <7581> <7581> 14846 <7582> <7582> 5729 <7586> <7587> 5724 <7589> <7589> 5728 <758a> <758a> 5727 <758b> <758b> 3479 <758e> <758e> 2756 <758f> <758f> 2755 <7590> <7590> 14847 <7591> <7591> 1625 <7592> <7593> 14848 <7594> <7594> 5730 <759a> <759a> 5731 <759d> <759d> 5732 <75a3> <75a3> 5734 <75a5> <75a5> 5733 <75ab> <75ab> 1272 <75b1> <75b1> 5742 <75b2> <75b2> 3452 <75b3> <75b3> 5736 <75b4> <75b4> 14850 <75b5> <75b5> 5738 <75b8> <75b8> 5740 <75b9> <75b9> 2564 <75bc> <75bc> 5741 <75bd> <75bd> 5739 <75be> <75be> 2284 <75c2> <75c2> 5735 <75c3> <75c3> 5737 <75c5> <75c5> 3508 <75c7> <75c7> 2481 <75ca> <75ca> 5744 <75cd> <75cd> 5743 <75d2> <75d2> 5745 <75d4> <75d4> 2258 <75d5> <75d5> 2079 <75d8> <75d8> 3185 endcidrange 100 begincidrange <75d9> <75d9> 5746 <75db> <75db> 3047 <75de> <75de> 5748 <75e2> <75e2> 3945 <75e3> <75e3> 5747 <75e4> <75e4> 14851 <75e9> <75e9> 2795 <75ec> <75ec> 14162 <75f0> <75f0> 5753 <75f2> <75f3> 5755 <75f4> <75f4> 2962 <75f9> <75f9> 14852 <75fa> <75fa> 5754 <75fc> <75fc> 5751 <75fe> <75ff> 5749 <7600> <7600> 14853 <7601> <7601> 5752 <7609> <7609> 5759 <760a> <760a> 14854 <760b> <760b> 5757 <760d> <760d> 5758 <7615> <7616> 14855 <7619> <7619> 14857 <761e> <761e> 14858 <761f> <761f> 5760 <7620> <7622> 5762 <7624> <7624> 5765 <7626> <7626> 7725 <7627> <7627> 5761 <762d> <762d> 14859 <7630> <7630> 5767 <7634> <7634> 5766 <7635> <7635> 14860 <763b> <763b> 5768 <7642> <7642> 3981 <7643> <7643> 14861 <7646> <7646> 5771 <7647> <7648> 5769 <764b> <764b> 14862 <764c> <764c> 1566 <764e> <764e> 14163 <7652> <7652> 3850 <7656> <7656> 3610 <7658> <7658> 5773 <765c> <765c> 5772 <7661> <7662> 5774 <7665> <7665> 14863 <7667> <7667> 5779 <7668> <766a> 5776 <766c> <766c> 5780 <766d> <766d> 14864 <766f> <766f> 14865 <7670> <7670> 5781 <7671> <7671> 14866 <7672> <7672> 5782 <7674> <7674> 14867 <7676> <7676> 5783 <7678> <7678> 5784 <767a> <767a> 3395 <767b> <767b> 3146 <767c> <767c> 5785 <767d> <767d> 3368 <767e> <767e> 3494 <7680> <7680> 5786 <7682> <7682> 8566 <7683> <7683> 5787 <7684> <7684> 3108 <7686> <7686> 1413 <7687> <7687> 2006 <7688> <7688> 5788 <768b> <768b> 5789 <768e> <768e> 5790 <7690> <7690> 2167 <7693> <7693> 5792 <7696> <7696> 5791 <7699> <769a> 5793 <769b> <769b> 8569 <769c> <769c> 8567 <769e> <769e> 8568 <76a4> <76a5> 14868 <76a6> <76a6> 8570 <76ae> <76ae> 3453 <76b0> <76b0> 5795 <76b4> <76b4> 5796 <76b7> <76b7> 7452 <76b8> <76ba> 5797 <76bf> <76bf> 2172 <76c2> <76c2> 5800 <76c3> <76c3> 3340 <76c5> <76c5> 14870 <76c6> <76c6> 3725 <76c8> <76c8> 1264 <76ca> <76ca> 1273 <76cc> <76cc> 14871 <76cd> <76cd> 5801 <76d2> <76d2> 5803 <76d6> <76d6> 5802 <76d7> <76d7> 3178 <76db> <76db> 2653 <76dc> <76dc> 5336 endcidrange 100 begincidrange <76de> <76de> 5804 <76df> <76df> 3789 <76e1> <76e1> 5805 <76e3> <76e3> 1538 <76e4> <76e4> 3435 <76e5> <76e5> 5806 <76e7> <76e7> 5807 <76ea> <76ea> 5808 <76ec> <76ec> 14872 <76ee> <76ee> 3816 <76f2> <76f2> 3809 <76f4> <76f4> 3034 <76f8> <76f8> 2796 <76fb> <76fb> 5810 <76fc> <76fc> 14873 <76fe> <76fe> 2412 <7701> <7701> 2482 <7704> <7704> 5813 <7707> <7707> 5812 <7708> <7708> 5811 <7709> <7709> 3473 <770b> <770b> 1539 <770c> <770c> 1885 <771b> <771b> 5819 <771e> <771e> 5816 <771f> <771f> 2565 <7720> <7720> 3774 <7724> <7724> 5815 <7725> <7726> 5817 <7729> <7729> 5814 <7734> <7734> 14874 <7736> <7736> 14875 <7737> <7738> 5820 <773a> <773a> 3019 <773c> <773c> 1567 <7740> <7740> 2979 <7746> <7746> 8572 <7747> <7747> 5822 <775a> <775a> 5823 <775b> <775b> 5826 <775c> <775c> 14876 <775f> <7760> 14877 <7761> <7761> 2605 <7762> <7762> 7877 <7763> <7763> 3228 <7765> <7765> 5827 <7766> <7766> 3713 <7768> <7768> 5824 <776a> <776a> 14165 <776b> <776b> 5825 <7772> <7772> 14879 <7779> <7779> 5830 <777d> <777d> 14880 <777e> <777e> 5829 <777f> <777f> 5828 <778b> <778b> 5832 <778e> <778e> 5831 <7791> <7791> 5833 <7795> <7795> 14881 <779e> <779e> 5835 <77a0> <77a0> 5834 <77a5> <77a5> 3613 <77a9> <77a9> 14166 <77aa> <77aa> 14882 <77ac> <77ac> 2400 <77ad> <77ad> 3982 <77b0> <77b0> 5836 <77b3> <77b3> 3215 <77b6> <77b6> 5837 <77b9> <77b9> 5838 <77bb> <77bb> 5842 <77bc> <77bd> 5840 <77bf> <77bf> 5839 <77c7> <77c7> 5843 <77cd> <77cd> 5844 <77d7> <77d7> 5845 <77da> <77da> 5846 <77db> <77db> 3779 <77dc> <77dc> 5847 <77e2> <77e2> 3836 <77e3> <77e3> 5848 <77e5> <77e5> 2956 <77e6> <77e6> 14883 <77e7> <77e7> 3360 <77e9> <77e9> 1763 <77ed> <77ed> 2937 <77ee> <77ee> 5849 <77ef> <77ef> 1714 <77f0> <77f0> 14884 <77f3> <77f3> 2676 <77f4> <77f4> 14885 <77fc> <77fc> 5850 <7802> <7802> 2093 <7806> <7806> 14886 <780c> <780c> 5851 <7812> <7812> 5852 <7814> <7814> 1882 <7815> <7815> 2117 <7820> <7820> 5854 <7821> <7821> 8574 endcidrange 100 begincidrange <7822> <7822> 14887 <7825> <7825> 3152 <7826> <7826> 2118 <7827> <7827> 1640 <782d> <782e> 14888 <7830> <7830> 14890 <7832> <7832> 3666 <7834> <7834> 3329 <7835> <7835> 14891 <783a> <783a> 3153 <783f> <783f> 2030 <7845> <7845> 5856 <784e> <784e> 8575 <784f> <784f> 13342 <7851> <7851> 15420 <785d> <785d> 2483 <7864> <7864> 8576 <7868> <7868> 14892 <786b> <786b> 3962 <786c> <786c> 2007 <786f> <786f> 1883 <7872> <7872> 3383 <7874> <7874> 5858 <787a> <787a> 8577 <787c> <787c> 5860 <7881> <7881> 1951 <7886> <7886> 5859 <7887> <7887> 3090 <788c> <788c> 5862 <788d> <788d> 1429 <788e> <788e> 5857 <7891> <7891> 3454 <7893> <7893> 1234 <7895> <7895> 2140 <7897> <7897> 4088 <789a> <789a> 5861 <789e> <789e> 14893 <78a3> <78a3> 5863 <78a7> <78a7> 3611 <78a9> <78a9> 2685 <78aa> <78aa> 5865 <78af> <78af> 5866 <78b5> <78b5> 5864 <78ba> <78ba> 1452 <78bc> <78bc> 5872 <78be> <78be> 5871 <78c1> <78c1> 2259 <78c5> <78c5> 5873 <78c6> <78c6> 5868 <78c8> <78c8> 14894 <78ca> <78ca> 5874 <78cb> <78cb> 5869 <78cc> <78cc> 14895 <78ce> <78ce> 14896 <78d0> <78d0> 3436 <78d1> <78d1> 5867 <78d4> <78d4> 5870 <78da> <78da> 5877 <78e0> <78e1> 14898 <78e4> <78e4> 14897 <78e7> <78e7> 5876 <78e8> <78e8> 3727 <78ec> <78ec> 5875 <78ef> <78ef> 1199 <78f2> <78f2> 14900 <78f4> <78f4> 5879 <78f7> <78f7> 14901 <78fb> <78fb> 14902 <78fd> <78fd> 5878 <7901> <7901> 2484 <7907> <7907> 5880 <790e> <790e> 2757 <7911> <7911> 5882 <7912> <7912> 5881 <7919> <7919> 5883 <7926> <7926> 5853 <792a> <792a> 5855 <792b> <792b> 5885 <792c> <792c> 5884 <7930> <7930> 8578 <7931> <7931> 14903 <7934> <7934> 14904 <793a> <793a> 2260 <793b> <793b> 14905 <793c> <793c> 4017 <793d> <793d> 14906 <793e> <793e> 2302 <7940> <7940> 5886 <7941> <7941> 1805 <7945> <7945> 14907 <7947> <7947> 1626 <7948> <7948> 1601 <7949> <7949> 2225 <7950> <7950> 3870 <7953> <7953> 5892 <7955> <7955> 5891 <7956> <7956> 2758 <7957> <7957> 5888 <795a> <795a> 5890 <795b> <795c> 14908 endcidrange 100 begincidrange <795d> <795d> 2389 <795e> <795e> 2566 <795f> <795f> 5889 <7960> <7960> 5887 <7962> <7962> 3296 <7965> <7965> 2485 <7968> <7968> 3502 <796d> <796d> 2119 <7977> <7977> 3186 <797a> <797a> 5893 <797f> <797f> 5894 <7980> <7980> 5916 <7981> <7981> 1744 <7984> <7984> 4067 <7985> <7985> 2743 <798a> <798a> 5895 <798b> <798b> 14910 <798d> <798d> 1362 <798e> <798e> 3091 <798f> <798f> 3569 <7994> <7994> 8582 <7996> <7996> 14911 <7998> <7998> 14912 <799b> <799b> 8584 <799d> <799d> 5896 <79a6> <79a6> 1684 <79a7> <79a7> 5897 <79aa> <79aa> 5899 <79ae> <79ae> 5900 <79b0> <79b0> 3295 <79b1> <79b1> 7758 <79b3> <79b3> 5901 <79b8> <79b8> 14913 <79b9> <79ba> 5902 <79bb> <79bb> 14914 <79bd> <79bd> 1745 <79be> <79be> 1363 <79bf> <79bf> 3229 <79c0> <79c0> 2354 <79c1> <79c1> 2226 <79c9> <79c9> 5904 <79ca> <79ca> 14915 <79cb> <79cb> 2355 <79d1> <79d1> 1354 <79d2> <79d2> 3509 <79d5> <79d5> 5905 <79d8> <79d8> 3455 <79da> <79da> 14916 <79df> <79df> 2759 <79e1> <79e1> 5908 <79e3> <79e3> 5909 <79e4> <79e4> 3359 <79e6> <79e6> 2567 <79e7> <79e7> 5906 <79e9> <79e9> 2975 <79ec> <79ec> 5907 <79f0> <79f0> 2486 <79fb> <79fb> 1184 <7a00> <7a00> 1603 <7a03> <7a03> 14917 <7a05> <7a05> 13875 <7a08> <7a08> 5910 <7a09> <7a09> 14918 <7a0b> <7a0b> 3092 <7a0d> <7a0d> 5911 <7a0e> <7a0e> 2667 <7a11> <7a11> 14919 <7a14> <7a14> 3769 <7a17> <7a17> 3477 <7a18> <7a19> 5912 <7a1a> <7a1a> 2963 <7a1c> <7a1c> 3983 <7a1e> <7a1e> 14920 <7a1f> <7a1f> 5915 <7a20> <7a20> 5914 <7a2d> <7a2d> 14921 <7a2e> <7a2e> 2331 <7a31> <7a31> 5917 <7a32> <7a32> 1204 <7a37> <7a37> 5920 <7a39> <7a39> 14922 <7a3b> <7a3b> 5918 <7a3c> <7a3c> 1364 <7a3d> <7a3d> 1828 <7a3e> <7a3e> 5919 <7a3f> <7a3f> 2008 <7a40> <7a40> 2052 <7a42> <7a42> 3638 <7a43> <7a43> 5921 <7a45> <7a45> 14923 <7a46> <7a46> 3714 <7a49> <7a49> 5923 <7a4c> <7a4c> 14924 <7a4d> <7a4d> 2677 <7a4e> <7a4e> 1265 <7a4f> <7a4f> 1338 <7a50> <7a50> 1136 <7a57> <7a57> 5922 <7a5d> <7a5d> 14925 <7a60> <7a60> 14926 endcidrange 100 begincidrange <7a61> <7a62> 5924 <7a63> <7a63> 2527 <7a69> <7a69> 5926 <7a6b> <7a6b> 1453 <7a6d> <7a6d> 14927 <7a70> <7a70> 5928 <7a74> <7a74> 1856 <7a76> <7a76> 1664 <7a78> <7a78> 14928 <7a79> <7a79> 5929 <7a7a> <7a7a> 1773 <7a7d> <7a7d> 5930 <7a7f> <7a7f> 2720 <7a81> <7a81> 3237 <7a83> <7a83> 2692 <7a84> <7a84> 2149 <7a88> <7a88> 5931 <7a92> <7a92> 2976 <7a93> <7a93> 2797 <7a95> <7a95> 5933 <7a96> <7a96> 5935 <7a97> <7a97> 5932 <7a98> <7a98> 5934 <7a9f> <7a9f> 1784 <7aa0> <7aa0> 14929 <7aa3> <7aa3> 14930 <7aa9> <7aa9> 5936 <7aaa> <7aaa> 1788 <7aae> <7aae> 1665 <7aaf> <7aaf> 3900 <7ab0> <7ab0> 5938 <7ab3> <7ab3> 14931 <7ab6> <7ab6> 5939 <7aba> <7aba> 1232 <7abb> <7abc> 14932 <7abf> <7abf> 5942 <7ac3> <7ac3> 1492 <7ac4> <7ac4> 5941 <7ac5> <7ac5> 5940 <7ac6> <7ac6> 14934 <7ac7> <7ac7> 5944 <7ac8> <7ac8> 5937 <7aca> <7aca> 5945 <7acb> <7acb> 3953 <7acd> <7acd> 5946 <7acf> <7acf> 5947 <7ad1> <7ad1> 8585 <7ad2> <7ad2> 4549 <7ad3> <7ad3> 5949 <7ad5> <7ad5> 5948 <7ad9> <7ada> 5950 <7adc> <7adc> 3965 <7add> <7add> 5952 <7adf> <7adf> 7176 <7ae0> <7ae0> 2487 <7ae1> <7ae2> 5953 <7ae3> <7ae3> 2401 <7ae5> <7ae5> 3216 <7ae6> <7ae6> 5955 <7ae7> <7ae7> 8586 <7aea> <7aea> 2918 <7aeb> <7aeb> 8588 <7aed> <7aed> 5956 <7aef> <7aef> 2938 <7af0> <7af0> 5957 <7af6> <7af6> 1693 <7af8> <7af8> 4214 <7af9> <7af9> 2971 <7afa> <7afa> 2271 <7aff> <7aff> 1540 <7b02> <7b02> 5958 <7b04> <7b04> 5971 <7b06> <7b06> 5961 <7b07> <7b07> 14935 <7b08> <7b08> 1666 <7b0a> <7b0a> 5960 <7b0b> <7b0b> 5973 <7b0f> <7b0f> 5959 <7b11> <7b11> 2488 <7b14> <7b14> 14936 <7b18> <7b19> 5963 <7b1b> <7b1b> 3109 <7b1e> <7b1e> 5965 <7b20> <7b20> 1468 <7b25> <7b25> 2592 <7b26> <7b26> 3542 <7b27> <7b27> 14937 <7b28> <7b28> 5967 <7b2c> <7b2c> 2888 <7b31> <7b31> 14938 <7b33> <7b33> 5962 <7b35> <7b35> 5966 <7b36> <7b36> 5968 <7b39> <7b39> 2155 <7b45> <7b45> 5975 <7b46> <7b46> 3488 <7b47> <7b47> 14939 <7b48> <7b48> 3386 <7b49> <7b49> 3187 <7b4b> <7b4b> 1746 endcidrange 100 begincidrange <7b4c> <7b4c> 5974 <7b4d> <7b4d> 5972 <7b4e> <7b4e> 14940 <7b4f> <7b4f> 3401 <7b50> <7b50> 5969 <7b51> <7b51> 2972 <7b52> <7b52> 3189 <7b53> <7b53> 14173 <7b54> <7b54> 3188 <7b56> <7b56> 2150 <7b5d> <7b5d> 5993 <7b60> <7b60> 14941 <7b65> <7b65> 5977 <7b67> <7b67> 5979 <7b69> <7b69> 14942 <7b6c> <7b6c> 5982 <7b6d> <7b6d> 14943 <7b6e> <7b6e> 5983 <7b70> <7b71> 5980 <7b72> <7b72> 14944 <7b74> <7b74> 5978 <7b75> <7b75> 5976 <7b7a> <7b7a> 5970 <7b86> <7b86> 3615 <7b87> <7b87> 1365 <7b8b> <7b8b> 5990 <7b8d> <7b8d> 5987 <7b8f> <7b8f> 5992 <7b91> <7b91> 14945 <7b92> <7b92> 5991 <7b94> <7b94> 3369 <7b95> <7b95> 3763 <7b97> <7b97> 2185 <7b98> <7b98> 5985 <7b99> <7b99> 5994 <7b9a> <7b9a> 5989 <7b9c> <7b9c> 5988 <7b9d> <7b9d> 5984 <7b9e> <7b9e> 8589 <7b9f> <7b9f> 5986 <7ba1> <7ba1> 1541 <7baa> <7baa> 2939 <7bad> <7bad> 2721 <7baf> <7baf> 14946 <7bb1> <7bb1> 3382 <7bb4> <7bb4> 5999 <7bb8> <7bb8> 3384 <7bc0> <7bc0> 2693 <7bc1> <7bc1> 5996 <7bc4> <7bc4> 3427 <7bc6> <7bc6> 6000 <7bc7> <7bc7> 3619 <7bc9> <7bc9> 2969 <7bcb> <7bcb> 5995 <7bcc> <7bcc> 5997 <7bcf> <7bcf> 5998 <7bd7> <7bd7> 14947 <7bd9> <7bd9> 14948 <7bdd> <7bdd> 6001 <7be0> <7be0> 2288 <7be4> <7be4> 3230 <7be5> <7be5> 6006 <7be6> <7be6> 6005 <7be9> <7be9> 6002 <7bed> <7bed> 4060 <7bf3> <7bf3> 6011 <7bf6> <7bf6> 6015 <7bf7> <7bf7> 6012 <7c00> <7c00> 6008 <7c07> <7c07> 6009 <7c0b> <7c0b> 14949 <7c0d> <7c0d> 6014 <7c0f> <7c0f> 14950 <7c11> <7c11> 6003 <7c12> <7c12> 4330 <7c13> <7c13> 6010 <7c14> <7c14> 6004 <7c17> <7c17> 6013 <7c1e> <7c1e> 7739 <7c1f> <7c1f> 6019 <7c20> <7c20> 14951 <7c21> <7c21> 1542 <7c23> <7c23> 6016 <7c26> <7c26> 14952 <7c27> <7c27> 6017 <7c2a> <7c2a> 6018 <7c2b> <7c2b> 6021 <7c31> <7c31> 14953 <7c36> <7c36> 14954 <7c37> <7c37> 6020 <7c38> <7c38> 3466 <7c3d> <7c3d> 6022 <7c3e> <7c3e> 4036 <7c3f> <7c3f> 3645 <7c40> <7c40> 6027 <7c43> <7c43> 6024 <7c4c> <7c4c> 6023 <7c4d> <7c4d> 2678 <7c4f> <7c4f> 6026 <7c50> <7c50> 6028 endcidrange 100 begincidrange <7c51> <7c51> 14955 <7c54> <7c54> 6025 <7c56> <7c56> 6032 <7c58> <7c58> 6029 <7c59> <7c59> 14956 <7c5f> <7c5f> 6030 <7c60> <7c60> 6007 <7c64> <7c64> 6031 <7c65> <7c65> 6033 <7c67> <7c67> 14957 <7c6c> <7c6c> 6034 <7c6e> <7c6e> 14958 <7c70> <7c70> 14959 <7c73> <7c73> 3606 <7c75> <7c75> 6035 <7c7b> <7c7b> 14094 <7c7e> <7c7e> 3822 <7c81> <7c81> 1734 <7c82> <7c82> 1791 <7c83> <7c83> 6036 <7c89> <7c89> 3588 <7c8b> <7c8b> 2606 <7c8d> <7c8d> 3772 <7c90> <7c90> 6037 <7c92> <7c92> 3963 <7c95> <7c95> 3370 <7c97> <7c97> 2760 <7c98> <7c98> 3306 <7c9b> <7c9b> 2391 <7c9f> <7c9f> 1156 <7ca1> <7ca1> 6042 <7ca2> <7ca2> 6040 <7ca4> <7ca4> 6038 <7ca5> <7ca5> 1501 <7ca7> <7ca7> 2489 <7ca8> <7ca8> 6043 <7cab> <7cab> 6041 <7cad> <7cad> 6039 <7cae> <7cae> 6047 <7cb1> <7cb1> 6046 <7cb2> <7cb2> 6045 <7cb3> <7cb3> 6044 <7cb9> <7cb9> 6048 <7cbc> <7cbc> 14960 <7cbd> <7cbd> 6049 <7cbe> <7cbe> 2654 <7cbf> <7cbf> 14961 <7cc0> <7cc0> 6050 <7cc2> <7cc2> 6052 <7cc5> <7cc5> 6051 <7cc8> <7cc9> 14962 <7cca> <7cca> 1926 <7cce> <7cce> 2746 <7cd2> <7cd2> 6054 <7cd6> <7cd6> 3190 <7cd7> <7cd7> 14964 <7cd8> <7cd8> 6053 <7cd9> <7cd9> 14965 <7cdc> <7cdc> 6055 <7cdd> <7cdd> 14966 <7cde> <7cde> 3589 <7cdf> <7cdf> 2798 <7ce0> <7ce0> 2009 <7ce2> <7ce2> 6056 <7ce7> <7ce7> 3984 <7ceb> <7ceb> 14967 <7cef> <7cef> 6058 <7cf2> <7cf2> 6059 <7cf4> <7cf4> 6060 <7cf6> <7cf6> 6061 <7cf8> <7cf8> 2227 <7cfa> <7cfa> 6062 <7cfb> <7cfb> 1829 <7cfe> <7cfe> 1668 <7d00> <7d00> 1604 <7d02> <7d02> 6064 <7d04> <7d04> 3839 <7d05> <7d05> 2010 <7d06> <7d06> 6063 <7d07> <7d09> 14968 <7d0a> <7d0a> 6067 <7d0b> <7d0b> 3826 <7d0d> <7d0d> 3314 <7d10> <7d10> 3493 <7d13> <7d13> 14971 <7d14> <7d14> 2413 <7d15> <7d15> 6066 <7d17> <7d17> 2303 <7d18> <7d18> 2011 <7d19> <7d19> 2228 <7d1a> <7d1a> 1667 <7d1b> <7d1b> 3590 <7d1c> <7d1c> 6065 <7d1d> <7d1d> 14972 <7d20> <7d20> 2761 <7d21> <7d21> 3696 <7d22> <7d22> 2151 <7d23> <7d23> 14973 <7d2b> <7d2b> 2229 <7d2c> <7d2c> 3065 endcidrange 100 begincidrange <7d2e> <7d2e> 6070 <7d2f> <7d2f> 4007 <7d30> <7d30> 2121 <7d32> <7d32> 6071 <7d33> <7d33> 2568 <7d35> <7d35> 6073 <7d39> <7d39> 2490 <7d3a> <7d3a> 2080 <7d3f> <7d3f> 6072 <7d41> <7d41> 14974 <7d42> <7d42> 2356 <7d43> <7d43> 1906 <7d44> <7d44> 2762 <7d45> <7d45> 6068 <7d46> <7d46> 6074 <7d48> <7d48> 8591 <7d4b> <7d4b> 6069 <7d4c> <7d4c> 1830 <7d4e> <7d4e> 6077 <7d4f> <7d4f> 6081 <7d50> <7d50> 1857 <7d53> <7d53> 14975 <7d56> <7d56> 6076 <7d59> <7d59> 14976 <7d5b> <7d5b> 6085 <7d5c> <7d5c> 8592 <7d5d> <7d5d> 14977 <7d5e> <7d5e> 2012 <7d61> <7d61> 3927 <7d62> <7d62> 1152 <7d63> <7d63> 6082 <7d66> <7d66> 1669 <7d68> <7d68> 6079 <7d6e> <7d6e> 6080 <7d71> <7d71> 3191 <7d72> <7d72> 6078 <7d73> <7d73> 6075 <7d75> <7d75> 1414 <7d76> <7d76> 2696 <7d79> <7d79> 1884 <7d7a> <7d7a> 14978 <7d7d> <7d7d> 6087 <7d86> <7d86> 14979 <7d89> <7d89> 6084 <7d8b> <7d8c> 14980 <7d8f> <7d8f> 6086 <7d93> <7d93> 6083 <7d99> <7d99> 1831 <7d9a> <7d9a> 2835 <7d9b> <7d9b> 6088 <7d9c> <7d9c> 2800 <7d9f> <7d9f> 6101 <7da0> <7da0> 8594 <7da2> <7da2> 6097 <7da3> <7da3> 6091 <7dab> <7dab> 6095 <7dac> <7dac> 2342 <7dad> <7dad> 1185 <7dae> <7dae> 6090 <7daf> <7daf> 6098 <7db0> <7db0> 6102 <7db1> <7db1> 2013 <7db2> <7db2> 3810 <7db4> <7db4> 3058 <7db5> <7db5> 6092 <7db7> <7db7> 8593 <7db8> <7db8> 6100 <7dba> <7dba> 6089 <7dbb> <7dbb> 2940 <7dbd> <7dbd> 6094 <7dbe> <7dbe> 1153 <7dbf> <7dbf> 3798 <7dc7> <7dc7> 6093 <7dca> <7dca> 1747 <7dcb> <7dcb> 3456 <7dcc> <7dcc> 14982 <7dcf> <7dcf> 2799 <7dd1> <7dd1> 3992 <7dd2> <7dd2> 2425 <7dd5> <7dd5> 6141 <7dd6> <7dd6> 8595 <7dd8> <7dd8> 6103 <7dda> <7dda> 2722 <7ddc> <7ddc> 6099 <7ddd> <7ddd> 6104 <7dde> <7dde> 6106 <7de0> <7de0> 3093 <7de1> <7de1> 6109 <7de3> <7de3> 13322 <7de4> <7de4> 6105 <7de8> <7de8> 3620 <7de9> <7de9> 1543 <7deb> <7deb> 14983 <7dec> <7dec> 3799 <7def> <7def> 1186 <7df1> <7df1> 14984 <7df2> <7df2> 6108 <7df4> <7df4> 4037 <7df9> <7df9> 14985 <7dfb> <7dfb> 6107 endcidrange 100 begincidrange <7e01> <7e01> 1297 <7e04> <7e04> 3268 <7e05> <7e05> 6110 <7e08> <7e08> 14986 <7e09> <7e09> 6117 <7e0a> <7e0a> 6111 <7e0b> <7e0b> 6118 <7e11> <7e11> 14987 <7e12> <7e12> 6114 <7e15> <7e15> 14988 <7e1b> <7e1b> 3377 <7e1e> <7e1e> 2294 <7e1f> <7e1f> 6116 <7e20> <7e20> 14989 <7e21> <7e21> 6113 <7e22> <7e22> 6119 <7e23> <7e23> 6112 <7e26> <7e26> 2382 <7e2b> <7e2b> 3667 <7e2e> <7e2e> 2390 <7e31> <7e31> 6115 <7e32> <7e32> 6127 <7e35> <7e35> 6123 <7e37> <7e37> 6126 <7e39> <7e39> 6124 <7e3a> <7e3a> 6128 <7e3b> <7e3b> 6122 <7e3d> <7e3d> 6096 <7e3e> <7e3e> 2679 <7e41> <7e41> 3423 <7e43> <7e43> 6125 <7e46> <7e46> 6120 <7e47> <7e47> 14990 <7e48> <7e48> 14183 <7e4a> <7e4a> 2723 <7e4b> <7e4b> 1832 <7e4d> <7e4d> 2357 <7e52> <7e52> 8596 <7e54> <7e54> 2539 <7e55> <7e55> 2744 <7e56> <7e56> 6131 <7e59> <7e5a> 6133 <7e5d> <7e5d> 6130 <7e5e> <7e5e> 6132 <7e61> <7e61> 7697 <7e62> <7e62> 14991 <7e66> <7e66> 6121 <7e67> <7e67> 6129 <7e69> <7e69> 6137 <7e6a> <7e6a> 6136 <7e6b> <7e6b> 7671 <7e6d> <7e6d> 3752 <7e6e> <7e6e> 14992 <7e70> <7e70> 1793 <7e73> <7e73> 14993 <7e79> <7e79> 6135 <7e7b> <7e7b> 6139 <7e7c> <7e7c> 6138 <7e7d> <7e7d> 6142 <7e7f> <7e7f> 6144 <7e82> <7e82> 2186 <7e83> <7e83> 6140 <7e88> <7e89> 6145 <7e8a> <7e8a> 8359 <7e8c> <7e8c> 6147 <7e8d> <7e8d> 14994 <7e8e> <7e8e> 6153 <7e8f> <7e8f> 3125 <7e90> <7e90> 6149 <7e91> <7e91> 14995 <7e92> <7e92> 6148 <7e93> <7e94> 6150 <7e96> <7e96> 6152 <7e98> <7e98> 14996 <7e9b> <7e9c> 6154 <7f36> <7f36> 1544 <7f38> <7f38> 6156 <7f3a> <7f3a> 6157 <7f44> <7f44> 14997 <7f45> <7f45> 6158 <7f47> <7f47> 8597 <7f4c> <7f4e> 6159 <7f4f> <7f4f> 14998 <7f50> <7f51> 6162 <7f52> <7f53> 14999 <7f54> <7f54> 6165 <7f55> <7f55> 6164 <7f58> <7f58> 6166 <7f5f> <7f60> 6167 <7f61> <7f61> 15001 <7f67> <7f67> 6171 <7f68> <7f69> 6169 <7f6a> <7f6a> 2129 <7f6b> <7f6b> 1833 <7f6e> <7f6e> 2964 <7f70> <7f70> 3399 <7f72> <7f72> 2426 <7f75> <7f75> 3331 <7f77> <7f77> 3457 <7f78> <7f78> 6172 endcidrange 100 begincidrange <7f79> <7f79> 4918 <7f82> <7f82> 6173 <7f83> <7f83> 6175 <7f85> <7f85> 3919 <7f86> <7f86> 6174 <7f87> <7f87> 6177 <7f88> <7f88> 6176 <7f8a> <7f8a> 3901 <7f8c> <7f8c> 6178 <7f8e> <7f8e> 3474 <7f91> <7f91> 15002 <7f94> <7f94> 6179 <7f9a> <7f9a> 6182 <7f9d> <7f9d> 6181 <7f9e> <7f9e> 6180 <7fa1> <7fa1> 8598 <7fa3> <7fa3> 6183 <7fa4> <7fa4> 1800 <7fa8> <7fa8> 2724 <7fa9> <7fa9> 1627 <7fae> <7fae> 6187 <7faf> <7faf> 6184 <7fb2> <7fb2> 6185 <7fb6> <7fb6> 6188 <7fb8> <7fb8> 6189 <7fb9> <7fb9> 6186 <7fbd> <7fbd> 1227 <7fbf> <7fbf> 15003 <7fc1> <7fc1> 1319 <7fc5> <7fc6> 6191 <7fca> <7fca> 6193 <7fcc> <7fcc> 3916 <7fce> <7fce> 15004 <7fd2> <7fd2> 2358 <7fd4> <7fd4> 6195 <7fd5> <7fd5> 6194 <7fdf> <7fdf> 15005 <7fe0> <7fe0> 2607 <7fe1> <7fe1> 6196 <7fe5> <7fe5> 15006 <7fe6> <7fe6> 6197 <7fe9> <7fe9> 6198 <7feb> <7feb> 1569 <7fec> <7fec> 15007 <7fee> <7fef> 15008 <7ff0> <7ff0> 1545 <7ff3> <7ff3> 6199 <7ff9> <7ff9> 6200 <7ffa> <7ffa> 15010 <7ffb> <7ffb> 3723 <7ffc> <7ffc> 3917 <8000> <8000> 3902 <8001> <8001> 4061 <8002> <8002> 14099 <8003> <8003> 2015 <8004> <8004> 6203 <8005> <8005> 2304 <8006> <8006> 6202 <800b> <800b> 6204 <800c> <800c> 2261 <800e> <800e> 15011 <8010> <8010> 2865 <8011> <8011> 15012 <8012> <8012> 6205 <8014> <8014> 15013 <8015> <8015> 2014 <8017> <8017> 3811 <8018> <8019> 6206 <801c> <801c> 6208 <8021> <8021> 6209 <8024> <8024> 15014 <8026> <8026> 15015 <8028> <8028> 6210 <8033> <8033> 2262 <8036> <8036> 3833 <803a> <803a> 15016 <803b> <803b> 6212 <803c> <803c> 15017 <803d> <803d> 2941 <803f> <803f> 6211 <8046> <8046> 6214 <804a> <804a> 6213 <8052> <8052> 6215 <8056> <8056> 2655 <8058> <8058> 6216 <805a> <805a> 6217 <805e> <805e> 3593 <805f> <805f> 6218 <8060> <8060> 15018 <8061> <8061> 2801 <8062> <8062> 6219 <8068> <8068> 6220 <806f> <806f> 4038 <8070> <8070> 6223 <8071> <8071> 15019 <8072> <8072> 6222 <8073> <8073> 6221 <8074> <8074> 3020 <8075> <8075> 15020 <8076> <8076> 6224 endcidrange 100 begincidrange <8077> <8077> 2540 <8079> <8079> 6225 <807d> <807d> 6226 <807e> <807e> 4062 <807f> <807f> 6227 <8084> <8084> 6228 <8085> <8085> 6230 <8086> <8086> 6229 <8087> <8087> 3385 <8089> <8089> 3281 <808b> <808b> 4068 <808c> <808c> 3389 <8093> <8093> 6232 <8096> <8096> 2491 <8098> <8098> 3484 <809a> <809a> 6233 <809b> <809b> 6231 <809d> <809d> 1546 <809e> <809e> 15021 <80a1> <80a1> 1928 <80a2> <80a2> 2230 <80a5> <80a5> 3458 <80a6> <80a6> 15022 <80a9> <80a9> 1886 <80aa> <80aa> 3697 <80ab> <80ab> 15023 <80ac> <80ac> 6236 <80ad> <80ad> 6234 <80af> <80af> 2016 <80b1> <80b1> 2017 <80b2> <80b2> 1197 <80b4> <80b4> 2136 <80ba> <80ba> 3343 <80c3> <80c3> 1187 <80c4> <80c4> 6241 <80c6> <80c6> 2942 <80cc> <80cc> 3342 <80ce> <80ce> 2875 <80d6> <80d6> 6243 <80d7> <80d8> 15024 <80d9> <80d9> 6239 <80da> <80da> 6242 <80db> <80db> 6237 <80dd> <80dd> 6240 <80de> <80de> 3668 <80e1> <80e1> 1929 <80e4> <80e4> 1217 <80e5> <80e5> 6238 <80ef> <80ef> 6245 <80f1> <80f1> 6246 <80f4> <80f4> 3217 <80f8> <80f8> 1715 <80fc> <80fc> 6257 <80fd> <80fd> 3315 <8102> <8102> 2231 <8105> <8105> 1716 <8106> <8106> 2668 <8107> <8107> 4076 <8108> <8108> 3770 <8109> <8109> 6244 <810a> <810a> 2680 <8116> <8116> 15026 <8118> <8118> 15027 <811a> <811a> 1645 <811b> <811b> 6247 <8123> <8123> 6249 <8129> <8129> 6248 <812b> <812b> 13913 <812f> <812f> 6250 <8131> <8131> 2916 <8133> <8133> 3316 <8139> <8139> 3021 <813a> <813a> 15028 <813e> <813e> 6254 <8141> <8141> 14194 <8146> <8146> 6253 <814a> <814a> 15029 <814b> <814b> 6251 <814c> <814c> 15030 <814e> <814e> 2587 <8150> <8150> 3543 <8151> <8151> 6256 <8153> <8153> 6255 <8154> <8154> 2018 <8155> <8155> 4089 <815f> <815f> 6272 <8165> <8166> 6260 <816b> <816b> 2332 <816e> <816e> 6259 <8170> <8170> 2058 <8171> <8171> 6258 <8174> <8174> 6262 <8178> <8178> 3022 <8179> <8179> 3570 <817a> <817a> 2725 <817f> <817f> 2876 <8180> <8180> 6266 <8181> <8181> 15031 <8182> <8182> 6267 <8183> <8183> 6263 endcidrange 100 begincidrange <8184> <8184> 15032 <8188> <8188> 6264 <818a> <818a> 6265 <818f> <818f> 2019 <8193> <8193> 6273 <8195> <8195> 6269 <819a> <819a> 3544 <819c> <819c> 3738 <819d> <819d> 3482 <81a0> <81a0> 6268 <81a3> <81a3> 6271 <81a4> <81a4> 6270 <81a8> <81a8> 3698 <81a9> <81a9> 6274 <81b0> <81b0> 6275 <81b3> <81b3> 2745 <81b4> <81b4> 15033 <81b5> <81b5> 6276 <81b8> <81b8> 6278 <81ba> <81ba> 6282 <81bd> <81bd> 6279 <81be> <81be> 6277 <81bf> <81bf> 3317 <81c0> <81c0> 6280 <81c2> <81c2> 6281 <81c6> <81c6> 1330 <81c8> <81c8> 6288 <81c9> <81c9> 6283 <81cd> <81cd> 6284 <81cf> <81cf> 15034 <81d1> <81d1> 6285 <81d3> <81d3> 2817 <81d8> <81d8> 6287 <81d9> <81d9> 6286 <81da> <81da> 6289 <81df> <81e0> 6290 <81e3> <81e3> 2569 <81e5> <81e5> 1385 <81e7> <81e7> 6292 <81e8> <81e8> 3999 <81ea> <81ea> 2263 <81ed> <81ed> 2359 <81f3> <81f3> 2232 <81f4> <81f4> 2965 <81f9> <81f9> 15035 <81fa> <81fb> 6293 <81fc> <81fc> 1235 <81fe> <81fe> 6295 <8201> <8202> 6296 <8203> <8203> 15036 <8205> <8205> 6298 <8207> <8207> 6299 <8208> <8208> 1717 <8209> <8209> 5039 <820a> <820a> 6300 <820c> <820c> 2697 <820d> <820d> 6301 <820e> <820e> 2295 <8210> <8210> 6302 <8212> <8212> 4105 <8216> <8216> 6303 <8217> <8217> 3630 <8218> <8218> 1560 <821b> <821b> 2726 <821c> <821c> 2402 <821e> <821e> 3555 <821f> <821f> 2360 <8221> <8221> 15037 <8229> <8229> 6304 <822a> <822a> 2020 <822b> <822b> 6305 <822c> <822c> 3424 <822e> <822e> 6319 <8232> <8232> 15038 <8233> <8233> 6307 <8234> <8234> 15039 <8235> <8235> 2857 <8236> <8236> 3371 <8237> <8237> 1907 <8238> <8238> 6306 <8239> <8239> 2727 <8240> <8240> 6308 <8246> <8246> 15040 <8247> <8247> 3094 <824b> <824b> 15041 <824f> <824f> 15042 <8258> <8258> 6310 <8259> <8259> 6309 <825a> <825a> 6312 <825d> <825d> 6311 <825f> <825f> 6313 <8262> <8262> 6315 <8264> <8264> 6314 <8266> <8266> 1547 <8268> <8268> 6316 <826a> <826b> 6317 <826e> <826e> 2081 <826f> <826f> 3985 <8271> <8271> 6320 <8272> <8272> 2541 endcidrange 100 begincidrange <8276> <8276> 1298 <8277> <8278> 6321 <8279> <8279> 14197 <827e> <827e> 6323 <828b> <828b> 1206 <828d> <828d> 6324 <828e> <828e> 15043 <8292> <8292> 6325 <8299> <8299> 3545 <829d> <829d> 2291 <829f> <829f> 6327 <82a5> <82a5> 1415 <82a6> <82a6> 1142 <82ab> <82ab> 6326 <82ac> <82ac> 6329 <82ad> <82ad> 3332 <82ae> <82ae> 15044 <82af> <82af> 2570 <82b1> <82b1> 1366 <82b3> <82b3> 3669 <82b7> <82b7> 15045 <82b8> <82b8> 1843 <82b9> <82b9> 1748 <82bb> <82bb> 6328 <82bd> <82bd> 1386 <82be> <82be> 15046 <82c5> <82c5> 1503 <82c6> <82c6> 15047 <82d1> <82d1> 1299 <82d2> <82d2> 6333 <82d3> <82d3> 4018 <82d4> <82d4> 2877 <82d7> <82d7> 3510 <82d9> <82d9> 6345 <82db> <82db> 1367 <82dc> <82dc> 6343 <82de> <82de> 6341 <82df> <82df> 6332 <82e1> <82e1> 6330 <82e3> <82e3> 6331 <82e5> <82e5> 2319 <82e6> <82e6> 1764 <82e7> <82e7> 2997 <82eb> <82eb> 3241 <82f1> <82f1> 1267 <82f3> <82f3> 6335 <82f4> <82f4> 6334 <82f9> <82f9> 6340 <82fa> <82fa> 6336 <82fb> <82fb> 6339 <82fe> <82fe> 15048 <8301> <8301> 8600 <8302> <8302> 3804 <8303> <8303> 6338 <8304> <8304> 1368 <8305> <8305> 1499 <8306> <8306> 6342 <8309> <8309> 6344 <830e> <830e> 1834 <8316> <8316> 6348 <8317> <8318> 6357 <831c> <831c> 1135 <8323> <8323> 6365 <8328> <8328> 1205 <832b> <832b> 6356 <832f> <832f> 6355 <8331> <8331> 6350 <8332> <8332> 6349 <8334> <8334> 6347 <8335> <8335> 6346 <8336> <8336> 2977 <8338> <8338> 2907 <8339> <8339> 6352 <8340> <8340> 6351 <8343> <8343> 15049 <8345> <8345> 6354 <8349> <8349> 2802 <834a> <834a> 1835 <834f> <834f> 1251 <8350> <8350> 6353 <8351> <8351> 15050 <8352> <8352> 2021 <8355> <8355> 15051 <8358> <8358> 2803 <8362> <8362> 8601 <8373> <8373> 6371 <8375> <8375> 6372 <8377> <8377> 1369 <837b> <837b> 1326 <837c> <837c> 6369 <837f> <837f> 8602 <8385> <8385> 6359 <8386> <8386> 15052 <8387> <8387> 6367 <8389> <8389> 6374 <838a> <838a> 6368 <838d> <838d> 15053 <838e> <838e> 6366 <8392> <8392> 15054 <8393> <8393> 6337 endcidrange 100 begincidrange <8396> <8396> 6364 <8398> <8398> 15055 <839a> <839a> 6360 <839e> <839e> 1548 <839f> <839f> 6362 <83a0> <83a0> 6373 <83a2> <83a2> 6363 <83a8> <83a8> 6375 <83a9> <83a9> 15056 <83aa> <83aa> 6361 <83ab> <83ab> 3378 <83b1> <83b1> 3923 <83b5> <83b5> 6370 <83bd> <83bd> 6392 <83bf> <83c0> 15057 <83c1> <83c1> 6384 <83c5> <83c5> 2625 <83c7> <83c7> 8603 <83ca> <83ca> 1632 <83cc> <83cc> 1749 <83ce> <83ce> 6379 <83d3> <83d3> 1371 <83d6> <83d6> 2492 <83d8> <83d8> 6382 <83dc> <83dc> 2122 <83df> <83df> 3147 <83e0> <83e0> 6387 <83e9> <83e9> 3646 <83ea> <83ea> 15059 <83eb> <83eb> 6378 <83ef> <83ef> 1370 <83f0> <83f0> 1930 <83f1> <83f1> 3483 <83f2> <83f2> 6388 <83f4> <83f4> 6376 <83f6> <83f6> 8604 <83f7> <83f7> 6385 <83fb> <83fb> 6395 <83fd> <83fd> 6380 <8403> <8403> 6381 <8404> <8404> 3218 <8407> <8407> 6386 <840a> <840a> 7807 <840b> <840b> 6383 <840c> <840c> 3670 <840d> <840d> 6389 <840e> <840e> 1188 <840f> <840f> 15060 <8411> <8411> 15061 <8413> <8413> 6377 <8420> <8420> 6391 <8422> <8422> 6390 <8429> <8429> 3361 <842a> <842a> 6397 <842c> <842c> 6408 <8431> <8431> 1500 <8435> <8435> 6411 <8438> <8438> 6393 <843c> <843c> 6398 <843d> <843d> 3928 <8446> <8446> 6407 <8448> <8448> 8605 <8449> <8449> 3903 <844a> <844a> 15062 <844e> <844e> 3954 <8457> <8457> 2998 <845b> <845b> 1481 <8461> <8461> 3556 <8462> <8462> 6413 <8463> <8463> 3193 <8466> <8466> 1141 <8469> <8469> 6406 <846b> <846b> 6402 <846c> <846c> 2804 <846d> <846d> 6396 <846e> <846e> 6404 <846f> <846f> 6409 <8471> <8471> 3298 <8475> <8475> 1134 <8476> <8476> 15063 <8477> <8477> 6401 <8479> <8479> 6410 <847a> <847a> 3562 <8482> <8482> 6405 <8484> <8484> 6400 <848b> <848b> 2493 <8490> <8490> 2361 <8494> <8494> 2264 <8499> <8499> 3812 <849c> <849c> 3513 <849f> <849f> 6416 <84a1> <84a1> 6425 <84a8> <84a8> 15064 <84ad> <84ad> 6403 <84af> <84af> 15065 <84b2> <84b2> 1493 <84b4> <84b4> 8606 <84b8> <84b8> 2528 <84b9> <84b9> 6414 <84bb> <84bb> 6419 endcidrange 100 begincidrange <84bc> <84bc> 2805 <84bf> <84bf> 6415 <84c0> <84c0> 15066 <84c1> <84c1> 6422 <84c2> <84c2> 15067 <84c4> <84c4> 2973 <84c6> <84c6> 6423 <84c9> <84c9> 3904 <84ca> <84ca> 6412 <84cb> <84cb> 1430 <84cd> <84cd> 6418 <84d0> <84d0> 6421 <84d1> <84d1> 3768 <84d6> <84d6> 6424 <84d9> <84d9> 6417 <84da> <84da> 6420 <84dc> <84dc> 8363 <84ec> <84ec> 3671 <84ee> <84ee> 4039 <84f0> <84f0> 15068 <84f4> <84f4> 6428 <84fc> <84fc> 6435 <84fd> <84fd> 15069 <84ff> <84ff> 6427 <8500> <8500> 2287 <8506> <8506> 6394 <850c> <850c> 15070 <8511> <8511> 3614 <8513> <8513> 3758 <8514> <8514> 6434 <8515> <8515> 6433 <8517> <8518> 6429 <851a> <851a> 1240 <851f> <851f> 6432 <8521> <8521> 6426 <8523> <8523> 7706 <8526> <8526> 3057 <852c> <852c> 6431 <852d> <852d> 1218 <8534> <8534> 15071 <8535> <8535> 2818 <853d> <853d> 3603 <853e> <853e> 7861 <8540> <8540> 6436 <8541> <8541> 6440 <8543> <8543> 3437 <8548> <8548> 6439 <8549> <8549> 2494 <854a> <854a> 2293 <854b> <854b> 6442 <854e> <854e> 1718 <8553> <8553> 8607 <8555> <8555> 6443 <8557> <8557> 3563 <8558> <8558> 6438 <8559> <8559> 8608 <855a> <855a> 6399 <855e> <855e> 15072 <8563> <8563> 6437 <8568> <8568> 4085 <8569> <8569> 3194 <856a> <856a> 3557 <856b> <856b> 8609 <856d> <856d> 6450 <8577> <8577> 6456 <857e> <857e> 6457 <8580> <8580> 6444 <8584> <8584> 3372 <8587> <8587> 6454 <8588> <8588> 6446 <858a> <858a> 6448 <858f> <858f> 15073 <8590> <8590> 6458 <8591> <8591> 6447 <8594> <8594> 6451 <8597> <8597> 1300 <8599> <8599> 3261 <859b> <859b> 6452 <859c> <859c> 6455 <85a4> <85a4> 6445 <85a6> <85a6> 2728 <85a8> <85a8> 6449 <85a9> <85a9> 2165 <85aa> <85aa> 2571 <85ab> <85ab> 1798 <85ac> <85ac> 3840 <85ad> <85ad> 15076 <85ae> <85ae> 3845 <85af> <85af> 2428 <85b0> <85b0> 8611 <85b7> <85b7> 15074 <85b9> <85b9> 6462 <85ba> <85ba> 6460 <85c1> <85c1> 4084 <85c9> <85c9> 6459 <85cd> <85cd> 3935 <85ce> <85ce> 15075 <85cf> <85cf> 6461 <85d0> <85d0> 6463 <85d5> <85d5> 6464 endcidrange 100 begincidrange <85dc> <85dc> 6467 <85dd> <85dd> 6465 <85e4> <85e4> 3195 <85e5> <85e5> 6466 <85e9> <85e9> 3425 <85ea> <85ea> 6453 <85f4> <85f4> 14208 <85f7> <85f7> 2429 <85f9> <85f9> 6468 <85fa> <85fa> 6473 <85fb> <85fb> 2806 <85fe> <85fe> 6472 <8602> <8602> 6441 <8606> <8606> 6474 <8607> <8607> 2763 <860a> <860a> 6469 <860b> <860b> 6471 <8612> <8612> 15077 <8613> <8613> 6470 <8616> <8616> 5328 <8617> <8617> 5313 <861a> <861a> 6476 <8622> <8622> 6475 <8629> <8629> 15078 <862d> <862d> 3936 <862f> <862f> 5809 <8630> <8630> 6477 <863f> <863f> 6478 <864d> <864d> 6479 <864e> <864e> 1931 <8650> <8650> 1646 <8652> <8652> 15079 <8654> <8654> 6481 <8655> <8655> 4244 <865a> <865a> 1679 <865b> <865b> 13336 <865c> <865c> 3970 <865e> <865e> 1771 <865f> <865f> 6482 <8663> <8663> 15080 <8667> <8667> 6483 <866b> <866b> 2988 <866c> <866c> 15081 <866f> <866f> 15082 <8671> <8671> 6484 <8679> <8679> 3282 <867a> <867a> 15083 <867b> <867b> 1150 <867d> <867d> 14214 <868a> <868a> 1379 <868b> <868c> 6489 <868d> <868d> 15084 <8691> <8691> 15085 <8693> <8693> 6485 <8695> <8695> 2187 <8698> <8698> 15086 <86a3> <86a3> 6486 <86a4> <86a4> 3320 <86a7> <86a8> 15087 <86a9> <86aa> 6487 <86ab> <86ab> 6498 <86af> <86af> 6492 <86b0> <86b0> 6495 <86b6> <86b6> 6491 <86c4> <86c4> 6493 <86c6> <86c6> 6494 <86c7> <86c7> 2308 <86c9> <86c9> 6496 <86cb> <86cb> 2943 <86cd> <86cd> 1836 <86ce> <86ce> 1440 <86d4> <86d4> 6499 <86d9> <86d9> 1437 <86db> <86db> 6504 <86de> <86de> 6500 <86df> <86df> 6503 <86e4> <86e4> 3406 <86e9> <86e9> 6501 <86ec> <86ec> 6502 <86ed> <86ed> 3514 <86ee> <86ee> 3438 <86ef> <86ef> 6505 <86f8> <86f8> 2909 <86f9> <86f9> 6515 <86fa> <86fa> 15089 <86fb> <86fb> 6511 <86fd> <86fd> 15090 <86fe> <86fe> 1387 <8700> <8700> 6509 <8702> <8702> 3672 <8703> <8703> 6510 <8706> <8706> 6507 <8708> <8708> 6508 <8709> <8709> 6513 <870a> <870a> 6516 <870b> <870b> 15091 <870d> <870d> 6514 <8711> <8711> 6512 <8712> <8712> 6506 <8713> <8713> 15092 endcidrange 100 begincidrange <8718> <8718> 2966 <8719> <8719> 15093 <871a> <871a> 6523 <871c> <871c> 3766 <871e> <871e> 15094 <8725> <8725> 6521 <8728> <8728> 15095 <8729> <8729> 6522 <8734> <8734> 6517 <8737> <8737> 6519 <873b> <873b> 6520 <873e> <873e> 15096 <873f> <873f> 6518 <8749> <8749> 2698 <874b> <874b> 4063 <874c> <874c> 6527 <874e> <874e> 6528 <8753> <8753> 6534 <8755> <8755> 2544 <8757> <8757> 6530 <8759> <8759> 6533 <875f> <875f> 6525 <8760> <8760> 6524 <8763> <8763> 6535 <8766> <8766> 1372 <8768> <8768> 6531 <876a> <876a> 6536 <876e> <876e> 6532 <8771> <8771> 15097 <8774> <8774> 6529 <8776> <8776> 3023 <8778> <8778> 6526 <877f> <877f> 3358 <8782> <8782> 6540 <8788> <8788> 15098 <878d> <878d> 3877 <8799> <8799> 15099 <879f> <879f> 6539 <87a2> <87a2> 6538 <87ab> <87ab> 6547 <87ac> <87ad> 15100 <87af> <87af> 6541 <87b3> <87b3> 6549 <87b5> <87b5> 15102 <87ba> <87ba> 3920 <87bb> <87bb> 6552 <87bd> <87bd> 6543 <87c0> <87c0> 6544 <87c4> <87c4> 6548 <87c6> <87c6> 6551 <87c7> <87c7> 6550 <87cb> <87cb> 6542 <87d0> <87d0> 6545 <87d2> <87d2> 6562 <87d6> <87d6> 15103 <87e0> <87e0> 6555 <87eb> <87eb> 15104 <87ec> <87ec> 7715 <87ed> <87ed> 15105 <87ef> <87ef> 6553 <87f2> <87f2> 6554 <87f5> <87f5> 15421 <87f6> <87f7> 6559 <87f9> <87f9> 1416 <87fb> <87fb> 1628 <87fe> <87fe> 6558 <8801> <8801> 15106 <8803> <8803> 15107 <8805> <8805> 6537 <8806> <8806> 15108 <8807> <8807> 8614 <880b> <880b> 15109 <880d> <880d> 6557 <880e> <880e> 6561 <880f> <880f> 6556 <8811> <8811> 6563 <8814> <8814> 15110 <8815> <8815> 6565 <8816> <8816> 6564 <881c> <881c> 15111 <881f> <881f> 7813 <8821> <8821> 6567 <8822> <8822> 6566 <8823> <8823> 6497 <8827> <8827> 6571 <8831> <8831> 6568 <8836> <8836> 6569 <8839> <8839> 6570 <883b> <883b> 6572 <8840> <8840> 1858 <8842> <8842> 6574 <8844> <8844> 6573 <8846> <8846> 2362 <884c> <884c> 2022 <884d> <884d> 5412 <8852> <8852> 6575 <8853> <8853> 2395 <8856> <8856> 15112 <8857> <8857> 1431 <8859> <8859> 6576 endcidrange 100 begincidrange <885b> <885b> 1268 <885d> <885d> 2495 <885e> <885e> 6577 <885f> <885f> 15113 <8861> <8861> 2023 <8862> <8862> 6578 <8863> <8863> 1189 <8864> <8864> 15114 <8868> <8868> 3503 <886b> <886b> 6579 <8870> <8870> 2608 <8872> <8872> 6586 <8875> <8875> 6583 <8877> <8877> 2989 <887d> <887d> 6584 <887e> <887e> 6581 <887f> <887f> 1750 <8881> <8881> 6580 <8882> <8882> 6587 <8888> <8888> 1804 <888b> <888b> 2878 <888d> <888d> 6593 <8892> <8892> 6589 <8896> <8896> 2837 <8897> <8897> 6588 <8898> <8898> 15115 <8899> <8899> 6591 <889e> <889e> 6582 <88a2> <88a2> 6592 <88a4> <88a4> 6594 <88aa> <88aa> 15116 <88ab> <88ab> 3459 <88ae> <88ae> 6590 <88b0> <88b0> 6595 <88b1> <88b1> 6597 <88b4> <88b4> 1927 <88b5> <88b5> 6585 <88b7> <88b7> 1157 <88bd> <88be> 15117 <88bf> <88bf> 6596 <88c1> <88c1> 2123 <88c2> <88c2> 4030 <88c3> <88c4> 6598 <88c5> <88c5> 2807 <88c6> <88c6> 14217 <88ca> <88ca> 15119 <88cf> <88cf> 3946 <88d2> <88d2> 15120 <88d4> <88d4> 6600 <88d5> <88d5> 3871 <88d8> <88d9> 6601 <88db> <88db> 15121 <88dc> <88dc> 3636 <88dd> <88dd> 6603 <88df> <88df> 2096 <88e1> <88e1> 3947 <88e8> <88e8> 6608 <88f0> <88f1> 15122 <88f2> <88f2> 6609 <88f3> <88f3> 2496 <88f4> <88f4> 6607 <88f5> <88f5> 8615 <88f8> <88f8> 3921 <88f9> <88f9> 6604 <88fc> <88fc> 6606 <88fd> <88fd> 2657 <88fe> <88fe> 2628 <8902> <8902> 6605 <8904> <8904> 6610 <8906> <8906> 15124 <8907> <8907> 3571 <890a> <890a> 6612 <890c> <890c> 6611 <8910> <8910> 1482 <8912> <8912> 3673 <8913> <8913> 6613 <8918> <891a> 15125 <891c> <891c> 8360 <891d> <891d> 6625 <891e> <891e> 6615 <8925> <8925> 6616 <8927> <8927> 15128 <892a> <892b> 6617 <8930> <8930> 15129 <8936> <8936> 6622 <8938> <8938> 6623 <893b> <893b> 6621 <893e> <893e> 15130 <8941> <8941> 6619 <8943> <8943> 6614 <8944> <8944> 6620 <894c> <894c> 6624 <894d> <894d> 7120 <8956> <8956> 1320 <895e> <895e> 6627 <895f> <895f> 1751 <8960> <8960> 6626 <8964> <8964> 6629 <8966> <8966> 6628 <896a> <896a> 6631 endcidrange 100 begincidrange <896d> <896d> 6630 <896f> <896f> 6632 <8972> <8972> 2363 <8974> <8974> 6633 <8977> <8977> 6634 <897b> <897b> 15131 <897e> <897e> 6635 <897f> <897f> 2658 <8980> <8980> 13870 <8981> <8981> 3905 <8983> <8983> 6636 <8986> <8986> 3572 <8987> <8987> 3324 <8988> <8988> 6637 <898a> <898a> 6638 <898b> <898b> 1887 <898f> <898f> 1606 <8993> <8993> 6639 <8996> <8996> 2233 <8997> <8997> 3319 <8998> <8998> 6640 <899a> <899a> 1454 <89a1> <89a1> 6641 <89a6> <89a6> 6643 <89a7> <89a7> 3937 <89a9> <89a9> 6642 <89aa> <89aa> 2572 <89ac> <89ac> 6644 <89af> <89af> 6645 <89b2> <89b2> 6646 <89b3> <89b3> 1549 <89ba> <89ba> 6647 <89bd> <89bd> 6648 <89bf> <89c0> 6649 <89d2> <89d2> 1455 <89d4> <89d4> 15132 <89d6> <89d6> 15133 <89da> <89da> 6651 <89dc> <89dd> 6652 <89e3> <89e3> 1394 <89e5> <89e5> 15134 <89e6> <89e6> 2542 <89e7> <89e7> 6654 <89f1> <89f1> 15135 <89f4> <89f4> 6655 <89f8> <89f8> 6656 <8a00> <8a00> 1908 <8a01> <8a01> 13756 <8a02> <8a02> 3095 <8a03> <8a03> 6657 <8a07> <8a07> 15136 <8a08> <8a08> 1837 <8a0a> <8a0a> 2588 <8a0c> <8a0c> 6660 <8a0e> <8a0e> 3196 <8a0f> <8a0f> 15137 <8a10> <8a10> 6659 <8a12> <8a12> 8616 <8a13> <8a13> 1799 <8a15> <8a15> 15138 <8a16> <8a16> 6658 <8a17> <8a17> 2903 <8a18> <8a18> 1607 <8a1b> <8a1b> 6661 <8a1d> <8a1d> 6662 <8a1f> <8a1f> 2497 <8a22> <8a22> 15139 <8a23> <8a23> 1859 <8a25> <8a25> 6663 <8a2a> <8a2a> 3674 <8a2d> <8a2d> 2691 <8a31> <8a31> 1680 <8a33> <8a33> 3841 <8a34> <8a34> 2764 <8a36> <8a36> 6664 <8a37> <8a37> 8617 <8a3a> <8a3a> 2573 <8a3b> <8a3b> 2990 <8a3c> <8a3c> 2498 <8a41> <8a41> 6665 <8a46> <8a46> 6668 <8a48> <8a48> 6669 <8a4e> <8a4e> 15140 <8a50> <8a50> 2094 <8a51> <8a51> 2850 <8a52> <8a52> 6667 <8a54> <8a54> 2499 <8a55> <8a55> 3504 <8a5b> <8a5b> 6666 <8a5e> <8a5e> 2234 <8a60> <8a60> 1269 <8a62> <8a62> 6673 <8a63> <8a63> 1838 <8a66> <8a66> 2236 <8a69> <8a69> 2235 <8a6b> <8a6b> 4083 <8a6c> <8a6c> 6672 <8a6d> <8a6d> 6671 <8a6e> <8a6e> 2729 <8a70> <8a70> 1639 endcidrange 100 begincidrange <8a71> <8a71> 4073 <8a72> <8a72> 1432 <8a73> <8a73> 2500 <8a79> <8a79> 8618 <8a7c> <8a7c> 6670 <8a7f> <8a7f> 15141 <8a82> <8a82> 6675 <8a84> <8a84> 6676 <8a85> <8a85> 6674 <8a87> <8a87> 1932 <8a89> <8a89> 3882 <8a8c> <8a8c> 2237 <8a8d> <8a8d> 3293 <8a91> <8a91> 6679 <8a93> <8a93> 2660 <8a95> <8a95> 2944 <8a98> <8a98> 3872 <8a9a> <8a9a> 6682 <8a9e> <8a9e> 1952 <8aa0> <8aa0> 2659 <8aa1> <8aa1> 6678 <8aa3> <8aa3> 6683 <8aa4> <8aa4> 1953 <8aa5> <8aa6> 6680 <8aa7> <8aa7> 8619 <8aa8> <8aa8> 6677 <8aaa> <8aaa> 13880 <8aac> <8aac> 2694 <8aad> <8aad> 3233 <8ab0> <8ab0> 2925 <8ab2> <8ab2> 1373 <8ab9> <8ab9> 3460 <8abc> <8abc> 1629 <8abe> <8abe> 8620 <8abf> <8abf> 3024 <8ac2> <8ac2> 6686 <8ac4> <8ac4> 6684 <8ac7> <8ac7> 2954 <8acb> <8acb> 2661 <8acc> <8acc> 1550 <8acd> <8acd> 6685 <8acf> <8acf> 2593 <8ad2> <8ad2> 3986 <8ad6> <8ad6> 4070 <8ada> <8ada> 6687 <8adb> <8adb> 6698 <8adc> <8adc> 3025 <8ade> <8ade> 6697 <8adf> <8adf> 8621 <8ae0> <8ae0> 6694 <8ae1> <8ae1> 6702 <8ae2> <8ae2> 6695 <8ae4> <8ae4> 6691 <8ae6> <8ae6> 3096 <8ae7> <8ae7> 6690 <8aeb> <8aeb> 6688 <8aed> <8aed> 3851 <8aee> <8aee> 2238 <8af1> <8af1> 6692 <8af3> <8af3> 6689 <8af4> <8af4> 15142 <8af6> <8af6> 8623 <8af7> <8af7> 6696 <8af8> <8af8> 2430 <8afa> <8afa> 1909 <8afe> <8afe> 2906 <8b00> <8b00> 3699 <8b01> <8b01> 1276 <8b02> <8b02> 1190 <8b04> <8b04> 3197 <8b07> <8b07> 6700 <8b0c> <8b0c> 6699 <8b0e> <8b0e> 3262 <8b10> <8b10> 6704 <8b14> <8b14> 6693 <8b16> <8b16> 6703 <8b17> <8b17> 6705 <8b19> <8b19> 1888 <8b1a> <8b1a> 6701 <8b1b> <8b1b> 2024 <8b1d> <8b1d> 2305 <8b1f> <8b1f> 15143 <8b20> <8b20> 6706 <8b21> <8b21> 3906 <8b26> <8b26> 6709 <8b28> <8b28> 6712 <8b2b> <8b2b> 6710 <8b2c> <8b2c> 3495 <8b33> <8b33> 6707 <8b37> <8b37> 15144 <8b39> <8b39> 1752 <8b3e> <8b3e> 6711 <8b41> <8b41> 6713 <8b43> <8b44> 15145 <8b49> <8b49> 6717 <8b4c> <8b4c> 6714 <8b4e> <8b4e> 6716 <8b4f> <8b4f> 6715 <8b53> <8b53> 8624 <8b54> <8b54> 15147 endcidrange 100 begincidrange <8b56> <8b56> 6718 <8b58> <8b58> 2269 <8b5a> <8b5a> 6720 <8b5b> <8b5b> 6719 <8b5c> <8b5c> 3546 <8b5f> <8b5f> 6722 <8b66> <8b66> 1839 <8b6b> <8b6b> 6721 <8b6c> <8b6c> 6723 <8b6f> <8b6f> 6724 <8b70> <8b70> 1630 <8b71> <8b71> 6190 <8b72> <8b72> 2529 <8b74> <8b74> 6725 <8b77> <8b77> 1954 <8b7d> <8b7d> 6726 <8b7f> <8b7f> 8625 <8b80> <8b80> 6727 <8b83> <8b83> 2188 <8b8a> <8b8a> 5075 <8b8c> <8b8c> 6728 <8b8e> <8b8e> 6729 <8b90> <8b90> 2364 <8b92> <8b93> 6730 <8b96> <8b96> 6732 <8b99> <8b9a> 6733 <8b9c> <8b9c> 15148 <8b9e> <8b9e> 15149 <8c37> <8c37> 2921 <8c3a> <8c3a> 6735 <8c3f> <8c3f> 6737 <8c41> <8c41> 6736 <8c46> <8c46> 3198 <8c47> <8c47> 15150 <8c48> <8c48> 6738 <8c4a> <8c4a> 3675 <8c4c> <8c4c> 6739 <8c4e> <8c4e> 6740 <8c50> <8c50> 6741 <8c54> <8c54> 15151 <8c55> <8c55> 6742 <8c5a> <8c5a> 3250 <8c61> <8c61> 2501 <8c62> <8c62> 6743 <8c6a> <8c6a> 2045 <8c6b> <8c6b> 4103 <8c6c> <8c6c> 6744 <8c73> <8c73> 15152 <8c78> <8c78> 6745 <8c79> <8c79> 3505 <8c7a> <8c7a> 6746 <8c7c> <8c7c> 6754 <8c82> <8c82> 6747 <8c85> <8c85> 6749 <8c89> <8c89> 6748 <8c8a> <8c8a> 6750 <8c8c> <8c8c> 3700 <8c8d> <8c8e> 6751 <8c94> <8c94> 6753 <8c98> <8c98> 6755 <8c9d> <8c9d> 1419 <8c9e> <8c9e> 3075 <8ca0> <8ca0> 3547 <8ca1> <8ca1> 2130 <8ca2> <8ca2> 2025 <8ca4> <8ca4> 15153 <8ca7> <8ca7> 3521 <8ca8> <8ca8> 1375 <8ca9> <8ca9> 3426 <8caa> <8caa> 6758 <8cab> <8cab> 1551 <8cac> <8cac> 2681 <8cad> <8cad> 6757 <8cae> <8cae> 6762 <8caf> <8caf> 2999 <8cb0> <8cb0> 3823 <8cb2> <8cb3> 6760 <8cb4> <8cb4> 1608 <8cb6> <8cb6> 6763 <8cb7> <8cb7> 3353 <8cb8> <8cb8> 2879 <8cbb> <8cbb> 3461 <8cbc> <8cbc> 3127 <8cbd> <8cbd> 6759 <8cbf> <8cbf> 3701 <8cc0> <8cc0> 1388 <8cc1> <8cc1> 6765 <8cc2> <8cc2> 4046 <8cc3> <8cc3> 3038 <8cc4> <8cc4> 4075 <8cc7> <8cc7> 2239 <8cc8> <8cc8> 6764 <8cca> <8cca> 2833 <8ccd> <8ccd> 6781 <8cce> <8cce> 2730 <8cd1> <8cd1> 3280 <8cd3> <8cd3> 3522 <8cd9> <8cd9> 15154 <8cda> <8cda> 6768 <8cdb> <8cdb> 2189 endcidrange 100 begincidrange <8cdc> <8cdc> 2240 <8cde> <8cde> 2502 <8ce0> <8ce0> 3355 <8ce1> <8ce1> 15155 <8ce2> <8ce2> 1889 <8ce3> <8ce3> 6767 <8ce4> <8ce4> 6766 <8ce6> <8ce6> 3548 <8cea> <8cea> 2285 <8ced> <8ced> 3148 <8cf0> <8cf0> 8626 <8cf4> <8cf4> 8627 <8cf8> <8cf8> 15156 <8cfa> <8cfb> 6770 <8cfc> <8cfc> 2026 <8cfd> <8cfd> 6769 <8cfe> <8cfe> 15157 <8d04> <8d05> 6772 <8d07> <8d07> 6775 <8d08> <8d08> 2819 <8d0a> <8d0a> 6774 <8d0b> <8d0b> 1570 <8d0d> <8d0d> 6777 <8d0f> <8d0f> 6776 <8d10> <8d10> 6778 <8d12> <8d12> 8628 <8d13> <8d13> 6780 <8d14> <8d14> 6782 <8d16> <8d16> 6783 <8d1b> <8d1b> 15158 <8d64> <8d64> 2682 <8d66> <8d66> 2299 <8d67> <8d67> 6784 <8d69> <8d69> 15159 <8d6b> <8d6b> 1456 <8d6c> <8d6c> 15160 <8d6d> <8d6d> 6785 <8d70> <8d70> 2808 <8d71> <8d71> 6786 <8d73> <8d73> 6787 <8d74> <8d74> 3549 <8d76> <8d76> 8629 <8d77> <8d77> 1609 <8d81> <8d81> 6788 <8d84> <8d84> 15161 <8d85> <8d85> 3026 <8d8a> <8d8a> 1277 <8d8d> <8d8d> 15162 <8d95> <8d95> 15163 <8d99> <8d99> 6789 <8da3> <8da3> 2333 <8da6> <8da6> 15164 <8da8> <8da8> 2620 <8db3> <8db3> 2829 <8dba> <8dba> 6792 <8dbe> <8dbe> 6791 <8dc2> <8dc2> 6790 <8dc6> <8dc6> 15165 <8dcb> <8dcb> 6798 <8dcc> <8dcc> 6796 <8dce> <8dce> 15166 <8dcf> <8dcf> 6793 <8dd6> <8dd6> 6795 <8dda> <8dda> 6794 <8ddb> <8ddb> 6797 <8ddd> <8ddd> 1681 <8ddf> <8ddf> 6801 <8de1> <8de1> 2683 <8de3> <8de3> 6802 <8de4> <8de4> 15167 <8de8> <8de8> 1933 <8dea> <8deb> 6799 <8dec> <8dec> 15168 <8def> <8def> 4047 <8df3> <8df3> 3027 <8df5> <8df5> 2731 <8dfc> <8dfc> 6803 <8dff> <8dff> 6806 <8e08> <8e09> 6804 <8e0a> <8e0a> 3907 <8e0f> <8e0f> 3199 <8e10> <8e10> 6809 <8e1d> <8e1e> 6807 <8e1f> <8e1f> 6810 <8e20> <8e20> 15169 <8e2a> <8e2a> 6824 <8e30> <8e30> 6813 <8e34> <8e34> 6814 <8e35> <8e35> 6812 <8e42> <8e42> 6811 <8e44> <8e44> 3097 <8e47> <8e47> 6816 <8e48> <8e48> 6820 <8e49> <8e49> 6817 <8e4a> <8e4a> 6815 <8e4b> <8e4b> 15170 <8e4c> <8e4c> 6818 <8e50> <8e50> 6819 <8e55> <8e55> 6826 <8e59> <8e59> 6821 endcidrange 100 begincidrange <8e5f> <8e5f> 2684 <8e60> <8e60> 6823 <8e63> <8e63> 6825 <8e64> <8e64> 6822 <8e6c> <8e6c> 15171 <8e70> <8e70> 15172 <8e72> <8e72> 6828 <8e74> <8e74> 2365 <8e76> <8e76> 6827 <8e7a> <8e7a> 15173 <8e7c> <8e7c> 6829 <8e81> <8e81> 6830 <8e84> <8e84> 6833 <8e85> <8e85> 6832 <8e87> <8e87> 6831 <8e8a> <8e8a> 6835 <8e8b> <8e8b> 6834 <8e8d> <8e8d> 3842 <8e91> <8e91> 6837 <8e92> <8e92> 15174 <8e93> <8e93> 6836 <8e94> <8e94> 6838 <8e99> <8e99> 6839 <8ea1> <8ea1> 6841 <8eaa> <8eaa> 6840 <8eab> <8eab> 2574 <8eac> <8eac> 6842 <8eae> <8eae> 15175 <8eaf> <8eaf> 1765 <8eb0> <8eb0> 6843 <8eb1> <8eb1> 6845 <8eb3> <8eb3> 15176 <8eb6> <8eb6> 14083 <8ebe> <8ebe> 6846 <8ec0> <8ec0> 7663 <8ec5> <8ec5> 6847 <8ec6> <8ec6> 6844 <8ec8> <8ec8> 6848 <8eca> <8eca> 2306 <8ecb> <8ecb> 6849 <8ecc> <8ecc> 1610 <8ecd> <8ecd> 1801 <8ecf> <8ecf> 8631 <8ed1> <8ed1> 15177 <8ed2> <8ed2> 1890 <8ed4> <8ed4> 15178 <8edb> <8edb> 6850 <8edf> <8edf> 3272 <8ee2> <8ee2> 3128 <8ee3> <8ee3> 6851 <8eeb> <8eeb> 6854 <8ef8> <8ef8> 2272 <8ef9> <8ef9> 15179 <8efb> <8efb> 6853 <8efc> <8efc> 6852 <8efd> <8efd> 1840 <8efe> <8efe> 6855 <8f03> <8f03> 1457 <8f05> <8f05> 6857 <8f09> <8f09> 2124 <8f0a> <8f0a> 6856 <8f0c> <8f0c> 6865 <8f12> <8f12> 6859 <8f13> <8f13> 6861 <8f14> <8f14> 3637 <8f15> <8f15> 6858 <8f17> <8f17> 15180 <8f19> <8f19> 6860 <8f1b> <8f1b> 6864 <8f1c> <8f1c> 6862 <8f1d> <8f1d> 1611 <8f1f> <8f1f> 6863 <8f26> <8f26> 6866 <8f29> <8f29> 3344 <8f2a> <8f2a> 4000 <8f2f> <8f2f> 2366 <8f33> <8f33> 6867 <8f36> <8f36> 15181 <8f38> <8f38> 3852 <8f39> <8f39> 6869 <8f3b> <8f3b> 6868 <8f3e> <8f3e> 6872 <8f3f> <8f3f> 3883 <8f42> <8f42> 6871 <8f44> <8f44> 1483 <8f45> <8f45> 6870 <8f46> <8f46> 6875 <8f49> <8f49> 6874 <8f4c> <8f4c> 6873 <8f4d> <8f4d> 3116 <8f4e> <8f4e> 6876 <8f57> <8f57> 6877 <8f5c> <8f5c> 6878 <8f5f> <8f5f> 2046 <8f61> <8f61> 1787 <8f62> <8f64> 6879 <8f9b> <8f9b> 2575 <8f9c> <8f9c> 6882 <8f9e> <8f9e> 2265 <8f9f> <8f9f> 6883 endcidrange 100 begincidrange <8fa3> <8fa3> 6884 <8fa6> <8fa6> 15182 <8fa7> <8fa7> 4278 <8fa8> <8fa8> 4277 <8fad> <8fad> 6885 <8fae> <8fae> 6143 <8faf> <8faf> 6886 <8fb0> <8fb0> 2914 <8fb1> <8fb1> 2545 <8fb2> <8fb2> 3318 <8fb5> <8fb6> 15183 <8fb7> <8fb7> 6887 <8fba> <8fba> 3621 <8fbb> <8fbb> 3056 <8fbc> <8fbc> 2064 <8fbf> <8fbf> 2919 <8fc2> <8fc2> 1228 <8fc4> <8fc4> 3750 <8fc5> <8fc5> 2589 <8fc6> <8fc6> 15185 <8fc8> <8fc8> 14233 <8fce> <8fce> 1844 <8fd1> <8fd1> 1753 <8fd4> <8fd4> 3622 <8fda> <8fda> 6888 <8fe0> <8fe0> 15186 <8fe2> <8fe2> 6890 <8fe4> <8fe4> 15187 <8fe5> <8fe5> 6889 <8fe6> <8fe6> 1376 <8fe9> <8fe9> 3278 <8fea> <8fea> 6891 <8feb> <8feb> 3373 <8fed> <8fed> 3117 <8fef> <8fef> 6892 <8ff0> <8ff0> 2396 <8ff4> <8ff4> 6894 <8ff6> <8ff6> 15188 <8ff7> <8ff7> 3790 <8ff8> <8ff8> 6909 <8ff9> <8ffa> 6896 <8ffd> <8ffd> 3045 <9000> <9000> 2880 <9001> <9001> 2809 <9002> <9002> 15189 <9003> <9003> 3200 <9005> <9005> 6895 <9006> <9006> 1647 <900b> <900b> 6904 <900d> <900d> 6901 <900e> <900e> 6914 <900f> <900f> 3201 <9010> <9010> 2974 <9011> <9011> 6898 <9013> <9013> 3098 <9014> <9014> 3149 <9015> <9015> 6899 <9016> <9016> 6903 <9017> <9017> 2598 <9019> <9019> 3357 <901a> <901a> 3048 <901d> <901d> 2662 <901e> <901e> 6902 <901f> <901f> 2830 <9020> <9020> 2820 <9021> <9021> 6900 <9022> <9022> 1133 <9023> <9023> 4040 <9027> <9027> 6905 <902c> <902c> 15190 <902e> <902e> 2881 <9031> <9031> 2367 <9032> <9032> 2576 <9035> <9035> 6907 <9036> <9036> 6906 <9038> <9038> 1203 <9039> <9039> 6908 <903c> <903c> 3489 <903e> <903e> 6916 <9041> <9041> 3251 <9042> <9042> 2609 <9044> <9044> 15191 <9045> <9045> 2967 <9047> <9047> 1776 <9049> <9049> 6915 <904a> <904a> 3873 <904b> <904b> 1249 <904d> <904d> 3623 <904e> <904e> 1377 <904f> <9052> 6910 <9053> <9053> 3219 <9054> <9054> 2913 <9055> <9055> 1191 <9056> <9056> 6917 <9058> <9058> 6918 <9059> <9059> 7476 <905c> <905c> 2845 <905e> <905e> 6919 <9060> <9060> 1301 <9061> <9061> 2766 endcidrange 100 begincidrange <9063> <9063> 1891 <9065> <9065> 3908 <9067> <9067> 8634 <9068> <9068> 6920 <9069> <9069> 3110 <906d> <906d> 2810 <906e> <906e> 2307 <906f> <906f> 6921 <9072> <9072> 6924 <9075> <9075> 2415 <9076> <9076> 6922 <9077> <9077> 2733 <9078> <9078> 2732 <907a> <907a> 1192 <907c> <907c> 3987 <907d> <907d> 6926 <907f> <907f> 3462 <9080> <9080> 6928 <9081> <9081> 6927 <9082> <9082> 6925 <9083> <9083> 5943 <9084> <9084> 1552 <9087> <9087> 6893 <9088> <9088> 15192 <9089> <9089> 6930 <908a> <908a> 6929 <908f> <908f> 6931 <9091> <9091> 3874 <9095> <9095> 15193 <9099> <9099> 15194 <909b> <909b> 15195 <90a2> <90a2> 15196 <90a3> <90a3> 3257 <90a6> <90a6> 3676 <90a8> <90a8> 6932 <90aa> <90aa> 2309 <90af> <90af> 6933 <90b1> <90b1> 6934 <90b4> <90b4> 15197 <90b5> <90b5> 6935 <90b8> <90b8> 3099 <90c1> <90c1> 1198 <90ca> <90ca> 2027 <90ce> <90ce> 4064 <90d7> <90d7> 15198 <90db> <90db> 6939 <90dd> <90dd> 15199 <90de> <90de> 8635 <90e1> <90e1> 1802 <90e2> <90e2> 6936 <90e4> <90e4> 6937 <90e8> <90e8> 3558 <90ed> <90ed> 1458 <90f4> <90f4> 15200 <90f5> <90f5> 3875 <90f7> <90f7> 1719 <90fd> <90fd> 3150 <9102> <9102> 6940 <9112> <9112> 6941 <9115> <9115> 8637 <9117> <9117> 15201 <9119> <9119> 6942 <911c> <911c> 15202 <9127> <9127> 8638 <912d> <912d> 3100 <9130> <9130> 6944 <9131> <9131> 15203 <9132> <9132> 6943 <913a> <913a> 15204 <913d> <913d> 15205 <9148> <9148> 15206 <9149> <9149> 3243 <914a> <914a> 6945 <914b> <914b> 2368 <914c> <914c> 2316 <914d> <914d> 3345 <914e> <914e> 2991 <9152> <9152> 2334 <9154> <9154> 2610 <9156> <9156> 6946 <9158> <9158> 6947 <915b> <915b> 15207 <9161> <9161> 15208 <9162> <9162> 2595 <9163> <9163> 6948 <9164> <9164> 15209 <9165> <9165> 6949 <9169> <9169> 6950 <916a> <916a> 3929 <916c> <916c> 2369 <9172> <9172> 6952 <9173> <9173> 6951 <9175> <9175> 2028 <9177> <9177> 2053 <9178> <9178> 2190 <9182> <9182> 6955 <9187> <9187> 2416 <9189> <9189> 6954 <918b> <918b> 6953 <918d> <918d> 2889 endcidrange 100 begincidrange <918e> <918e> 15210 <9190> <9190> 1955 <9192> <9192> 2663 <9197> <9197> 3396 <919c> <919c> 2371 <919e> <919e> 15211 <91a2> <91a2> 6956 <91a4> <91a4> 2503 <91a8> <91a8> 15212 <91aa> <91aa> 6959 <91ab> <91ab> 6957 <91ac> <91ac> 7707 <91ad> <91ae> 15213 <91af> <91af> 6958 <91b1> <91b1> 7777 <91b2> <91b2> 15215 <91b4> <91b4> 6961 <91b5> <91b5> 6960 <91b8> <91b8> 2530 <91ba> <91ba> 6962 <91bc> <91bc> 15216 <91c0> <91c1> 6963 <91c6> <91c6> 3428 <91c7> <91c7> 2115 <91c8> <91c8> 2317 <91c9> <91c9> 6965 <91cb> <91cb> 6966 <91cc> <91cc> 3948 <91cd> <91cd> 2383 <91ce> <91ce> 3834 <91cf> <91cf> 3988 <91d0> <91d0> 6967 <91d1> <91d1> 1754 <91d6> <91d6> 6968 <91d7> <91d7> 8640 <91d8> <91d8> 3101 <91da> <91da> 8639 <91db> <91db> 6971 <91dc> <91dc> 1494 <91dd> <91dd> 2577 <91de> <91de> 8641 <91df> <91df> 6969 <91e1> <91e1> 6970 <91e3> <91e3> 3068 <91e4> <91e5> 8644 <91e6> <91e6> 3715 <91e7> <91e7> 1780 <91ed> <91ee> 8642 <91f0> <91f0> 15217 <91f5> <91f6> 6973 <91f7> <91f7> 15218 <91fb> <91fb> 15219 <91fc> <91fc> 6972 <91ff> <91ff> 6976 <9206> <9206> 8646 <9207> <9207> 15220 <920a> <920a> 8648 <920d> <920d> 3255 <920e> <920e> 1441 <9210> <9210> 8647 <9211> <9211> 6980 <9214> <9214> 6977 <9215> <9215> 6979 <921e> <921e> 6975 <9228> <9228> 15221 <9229> <9229> 7050 <922c> <922c> 6978 <9233> <9233> 15222 <9234> <9234> 4019 <9237> <9237> 1934 <9238> <9238> 15223 <9239> <9239> 8655 <923a> <923a> 8649 <923c> <923c> 8651 <923f> <923f> 6988 <9240> <9240> 8650 <9243> <9243> 15224 <9244> <9244> 3118 <9245> <9245> 6983 <9247> <9247> 15225 <9248> <9248> 6986 <9249> <9249> 6984 <924b> <924b> 6989 <924e> <924e> 8652 <924f> <924f> 15226 <9250> <9250> 6990 <9251> <9251> 8654 <9257> <9257> 6982 <9259> <9259> 8653 <925a> <925a> 6995 <925b> <925b> 1302 <925e> <925e> 6981 <9260> <9260> 15227 <9262> <9262> 3393 <9264> <9264> 6985 <9266> <9266> 2504 <9267> <9267> 8656 <9271> <9271> 2029 <9277> <9278> 8658 <927e> <927e> 3702 endcidrange 100 begincidrange <9280> <9280> 1756 <9283> <9283> 2384 <9285> <9285> 3220 <9288> <9288> 8362 <9291> <9291> 2735 <9293> <9293> 6993 <9295> <9295> 6987 <9296> <9296> 6992 <9298> <9298> 3791 <929a> <929a> 3028 <929b> <929b> 6994 <929c> <929c> 6991 <92a7> <92a7> 8657 <92ad> <92ad> 2734 <92b3> <92b3> 13652 <92b7> <92b7> 6998 <92b9> <92b9> 6997 <92c2> <92c2> 15228 <92cb> <92cc> 15229 <92cf> <92cf> 6996 <92d0> <92d0> 8663 <92d2> <92d2> 3677 <92d3> <92d3> 8667 <92d5> <92d5> 8665 <92d7> <92d7> 8661 <92d9> <92d9> 8662 <92df> <92df> 15231 <92e0> <92e0> 8666 <92e4> <92e4> 2437 <92e7> <92e7> 8660 <92e9> <92e9> 6999 <92ea> <92ea> 3631 <92ed> <92ed> 1270 <92f2> <92f2> 3512 <92f3> <92f3> 2992 <92f8> <92f8> 1682 <92f9> <92f9> 8368 <92fa> <92fa> 7001 <92fb> <92fb> 8670 <92fc> <92fc> 2031 <92ff> <92ff> 8673 <9302> <9302> 8675 <9304> <9304> 13402 <9306> <9306> 2170 <930d> <930d> 15232 <930f> <930f> 7000 <9310> <9310> 2611 <9315> <9315> 15233 <9318> <9318> 2612 <9319> <9319> 7004 <931a> <931a> 7006 <931d> <931d> 8674 <931e> <931e> 8672 <931f> <931f> 15234 <9320> <9320> 2531 <9321> <9321> 8669 <9322> <9322> 7005 <9323> <9323> 7007 <9325> <9325> 8668 <9326> <9326> 1739 <9327> <9327> 15235 <9328> <9328> 3511 <932b> <932b> 2318 <932c> <932c> 4041 <932e> <932e> 7003 <932f> <932f> 2152 <9332> <9332> 4069 <9335> <9335> 7009 <933a> <933a> 7008 <933b> <933b> 7010 <9344> <9344> 7002 <9347> <9347> 15236 <9348> <9348> 8361 <934a> <934a> 13400 <934b> <934b> 3265 <934d> <934d> 3151 <9352> <9352> 15237 <9354> <9354> 3059 <9356> <9356> 7015 <9357> <9357> 8677 <935b> <935b> 2945 <935c> <935c> 7011 <9360> <9360> 7012 <9365> <9365> 15238 <936a> <936a> 15239 <936c> <936c> 1795 <936d> <936d> 15240 <936e> <936e> 7014 <9370> <9370> 8676 <9375> <9375> 1892 <937c> <937c> 7013 <937e> <937e> 2505 <938c> <938c> 1495 <9394> <9394> 7019 <9396> <9396> 2095 <9397> <9397> 2811 <939a> <939a> 3046 <939b> <939b> 15241 <93a4> <93a4> 8678 <93a7> <93a7> 1433 endcidrange 100 begincidrange <93a9> <93a9> 15243 <93ac> <93ad> 7017 <93ae> <93ae> 3039 <93b0> <93b0> 7016 <93b9> <93b9> 7020 <93ba> <93ba> 15242 <93c1> <93c1> 15244 <93c3> <93c3> 7026 <93c6> <93c6> 8679 <93c8> <93c8> 7029 <93ca> <93ca> 15245 <93d0> <93d0> 7028 <93d1> <93d1> 3111 <93d6> <93d7> 7021 <93d8> <93d8> 7025 <93dd> <93dd> 7027 <93de> <93de> 8680 <93e1> <93e1> 1720 <93e2> <93e2> 15246 <93e4> <93e4> 7030 <93e5> <93e5> 7024 <93e8> <93e8> 7023 <93f8> <93f8> 8681 <93fa> <93fa> 15247 <93fd> <93fd> 15248 <9403> <9403> 7034 <9407> <9407> 7035 <940f> <940f> 15249 <9410> <9410> 7036 <9413> <9413> 7033 <9414> <9414> 7032 <9418> <9418> 2506 <9419> <9419> 3202 <941a> <941a> 7031 <9421> <9421> 7040 <942b> <942b> 7038 <9431> <9431> 8682 <9434> <9434> 15250 <9435> <9435> 7039 <9436> <9436> 7037 <9438> <9438> 2904 <943a> <943a> 7041 <943f> <943f> 15251 <9441> <9441> 7042 <9444> <9444> 7044 <9445> <9445> 8683 <9448> <9448> 8684 <9451> <9451> 1553 <9452> <9452> 7043 <9453> <9453> 3846 <9455> <9455> 15252 <945a> <945a> 7055 <945b> <945b> 7045 <945e> <945e> 7048 <9460> <9460> 7046 <9462> <9462> 7047 <946a> <946a> 7049 <946b> <946b> 15253 <9470> <9470> 7051 <9472> <9472> 15254 <9475> <9475> 7052 <9477> <9477> 7053 <947c> <947c> 7056 <947d> <947d> 7054 <947e> <947e> 7057 <947f> <947f> 7059 <9481> <9481> 7058 <9577> <9577> 3029 <9578> <9578> 15255 <9580> <9580> 3827 <9582> <9582> 7060 <9583> <9583> 2736 <9587> <9587> 7061 <9589> <9589> 3604 <958a> <958a> 7062 <958b> <958b> 1417 <958f> <958f> 1246 <9591> <9591> 1555 <9592> <9592> 8685 <9593> <9593> 1554 <9594> <9594> 7063 <9596> <9596> 7064 <9598> <9599> 7065 <95a0> <95a0> 7067 <95a2> <95a2> 1556 <95a3> <95a3> 1459 <95a4> <95a4> 2032 <95a5> <95a5> 3402 <95a6> <95a6> 15256 <95a7> <95a7> 7069 <95a8> <95a8> 7068 <95a9> <95a9> 15257 <95ab> <95ab> 15258 <95ad> <95ad> 7070 <95b1> <95b1> 13653 <95b2> <95b2> 1278 <95b4> <95b4> 15259 <95b9> <95b9> 7073 <95bb> <95bb> 7072 <95bc> <95bc> 7071 endcidrange 100 begincidrange <95bd> <95bd> 15260 <95be> <95be> 7074 <95c3> <95c3> 7077 <95c7> <95c7> 1163 <95ca> <95ca> 7075 <95cc> <95cc> 7079 <95cd> <95cd> 7078 <95d4> <95d4> 7081 <95d5> <95d5> 7080 <95d6> <95d6> 7082 <95d8> <95d8> 3206 <95da> <95da> 15261 <95dc> <95dc> 7083 <95e1> <95e1> 7084 <95e2> <95e2> 7086 <95e5> <95e5> 7085 <961c> <961c> 3550 <961d> <961d> 15262 <9621> <9621> 7087 <9628> <9628> 7088 <962a> <962a> 2133 <962e> <962f> 7089 <9632> <9632> 3703 <963b> <963b> 2765 <963f> <963f> 1128 <9640> <9640> 2859 <9641> <9641> 15263 <9642> <9642> 7091 <9644> <9644> 3551 <964b> <964b> 7094 <964c> <964c> 7092 <964d> <964d> 2033 <964f> <964f> 7093 <9650> <9650> 1910 <9658> <9658> 15264 <965b> <965b> 3605 <965c> <965c> 7096 <965d> <965d> 7098 <965e> <965e> 7097 <965f> <965f> 7099 <9662> <9662> 1219 <9663> <9663> 2590 <9664> <9664> 2438 <9665> <9665> 1557 <9666> <9666> 7100 <966a> <966a> 3356 <966c> <966c> 7102 <9670> <9670> 1220 <9672> <9672> 7101 <9673> <9673> 3040 <9675> <9675> 3989 <9676> <9676> 3203 <9677> <9677> 7095 <9678> <9678> 3950 <967a> <967a> 1893 <967d> <967d> 3909 <9684> <9684> 15265 <9685> <9685> 1777 <9686> <9686> 3964 <9688> <9688> 1790 <968a> <968a> 2882 <968b> <968b> 6252 <968d> <968d> 7103 <968e> <968e> 1418 <968f> <968f> 2613 <9694> <9694> 1460 <9695> <9695> 7105 <9697> <9697> 7106 <9698> <9698> 7104 <9699> <9699> 1850 <969b> <969b> 2125 <969c> <969c> 2507 <969d> <969d> 8688 <96a0> <96a0> 1221 <96a3> <96a3> 4001 <96a4> <96a4> 15266 <96a7> <96a7> 7108 <96a8> <96a8> 6923 <96a9> <96a9> 15267 <96aa> <96aa> 7107 <96af> <96af> 8689 <96b0> <96b0> 7111 <96b1> <96b2> 7109 <96b4> <96b4> 7112 <96b6> <96b6> 7113 <96b7> <96b7> 4020 <96b8> <96b9> 7114 <96bb> <96bb> 2669 <96bc> <96bc> 3407 <96c0> <96c0> 2627 <96c1> <96c1> 1571 <96c4> <96c4> 3876 <96c5> <96c5> 1389 <96c6> <96c6> 2370 <96c7> <96c7> 1935 <96c9> <96c9> 7118 <96cb> <96cb> 7117 <96cc> <96cc> 2241 <96cd> <96cd> 7119 <96ce> <96ce> 7116 endcidrange 100 begincidrange <96d1> <96d1> 2166 <96d2> <96d2> 15268 <96d5> <96d5> 7123 <96d6> <96d6> 6546 <96d9> <96d9> 4331 <96db> <96db> 2621 <96dc> <96dc> 7121 <96de> <96de> 15270 <96e2> <96e2> 3949 <96e3> <96e3> 3273 <96e8> <96e8> 1229 <96e9> <96e9> 15271 <96ea> <96ea> 2695 <96eb> <96eb> 2274 <96f0> <96f0> 3591 <96f1> <96f1> 15272 <96f2> <96f2> 1250 <96f6> <96f6> 4021 <96f7> <96f7> 3925 <96f9> <96f9> 7124 <96fb> <96fb> 3135 <9700> <9700> 2343 <9702> <9702> 15273 <9704> <9704> 7125 <9706> <9706> 7126 <9707> <9707> 2578 <9708> <9708> 7127 <9709> <9709> 15274 <970a> <970a> 4022 <970d> <970d> 7122 <970e> <970e> 7129 <970f> <970f> 7131 <9711> <9711> 7130 <9713> <9713> 7128 <9716> <9716> 7132 <9719> <9719> 7133 <971c> <971c> 2812 <971e> <971e> 1378 <9724> <9724> 7134 <9727> <9727> 3780 <972a> <972a> 7135 <9730> <9730> 7136 <9732> <9732> 4048 <9733> <9733> 8690 <9738> <9738> 5140 <9739> <9739> 7137 <973b> <973b> 8691 <973d> <973e> 7138 <9742> <9742> 7143 <9743> <9743> 8692 <9744> <9744> 7140 <9746> <9746> 7141 <9748> <9748> 7142 <9749> <9749> 7144 <974d> <974d> 8693 <974f> <974f> 8694 <9751> <9751> 8695 <9752> <9752> 2664 <9755> <9755> 8696 <9756> <9756> 3843 <9759> <9759> 2665 <975a> <975a> 15275 <975c> <975c> 7145 <975e> <975e> 3463 <9760> <9760> 7146 <9761> <9761> 7430 <9762> <9762> 3800 <9763> <9763> 15276 <9764> <9764> 7147 <9766> <9766> 7148 <9768> <9768> 7149 <9769> <9769> 1461 <976b> <976b> 7151 <976d> <976d> 2591 <976e> <976e> 15277 <9771> <9771> 7152 <9773> <9773> 15278 <9774> <9774> 1786 <9779> <9779> 7153 <977a> <977a> 7157 <977c> <977c> 7155 <9781> <9781> 7156 <9784> <9784> 1489 <9785> <9785> 7154 <9786> <9786> 7158 <978b> <978b> 7159 <978d> <978d> 1164 <978f> <9790> 7160 <9798> <9798> 2508 <979a> <979a> 15279 <979c> <979c> 7162 <97a0> <97a0> 1633 <97a2> <97a2> 15280 <97a3> <97a3> 7165 <97a6> <97a6> 7164 <97a8> <97a8> 7163 <97ab> <97ab> 6708 <97ad> <97ad> 3628 <97b3> <97b4> 7166 <97b5> <97b6> 15281 endcidrange 100 begincidrange <97c3> <97c3> 7168 <97c6> <97c6> 7169 <97c8> <97c8> 7170 <97cb> <97cb> 7171 <97d3> <97d3> 1558 <97d9> <97d9> 15283 <97dc> <97dc> 7172 <97de> <97de> 15284 <97ed> <97ed> 7173 <97ee> <97ee> 3289 <97f2> <97f2> 7175 <97f3> <97f3> 1339 <97f4> <97f4> 15285 <97f5> <97f5> 7178 <97f6> <97f6> 7177 <97fb> <97fb> 1222 <97ff> <97ff> 1721 <9801> <9801> 3607 <9802> <9802> 3030 <9803> <9803> 2066 <9805> <9805> 2034 <9806> <9806> 2417 <9808> <9808> 2594 <980a> <980a> 15286 <980c> <980c> 7180 <980e> <980e> 15287 <980f> <980f> 7179 <9810> <9810> 3884 <9811> <9811> 1572 <9812> <9812> 3430 <9813> <9813> 3252 <9817> <9817> 2626 <9818> <9818> 3990 <981a> <981a> 1841 <981e> <981e> 15288 <9821> <9821> 7183 <9823> <9823> 15289 <9824> <9824> 7182 <982b> <982b> 15290 <982c> <982c> 3705 <982d> <982d> 3204 <9830> <9830> 7795 <9834> <9834> 1266 <9837> <9837> 7184 <9838> <9838> 7181 <9839> <9839> 14259 <983b> <983b> 3523 <983c> <983c> 3924 <983d> <983d> 7185 <983e> <983e> 15291 <9846> <9846> 7186 <984b> <984b> 7188 <984c> <984c> 2890 <984d> <984e> 1465 <984f> <984f> 7187 <9852> <9853> 15292 <9854> <9854> 1573 <9855> <9855> 1894 <9857> <9857> 8697 <9858> <9858> 1574 <9859> <9859> 15294 <985a> <985a> 7752 <985b> <985b> 3129 <985e> <985e> 4008 <9865> <9865> 8698 <9867> <9867> 1936 <986b> <986b> 7189 <986c> <986c> 15295 <986f> <9871> 7190 <9873> <9873> 7194 <9874> <9874> 7193 <98a8> <98a8> 3561 <98aa> <98aa> 7195 <98af> <98af> 7196 <98b1> <98b1> 7197 <98b6> <98b6> 7198 <98b8> <98b8> 15296 <98ba> <98ba> 15297 <98bf> <98bf> 15298 <98c3> <98c3> 7200 <98c4> <98c4> 7199 <98c6> <98c6> 7201 <98c8> <98c8> 15299 <98db> <98db> 3464 <98dc> <98dc> 6201 <98df> <98df> 2543 <98e0> <98e0> 13848 <98e2> <98e2> 1612 <98e5> <98e5> 15300 <98e9> <98e9> 7202 <98eb> <98eb> 7203 <98ed> <98ed> 4289 <98ee> <98ee> 5338 <98ef> <98ef> 3431 <98f2> <98f2> 1215 <98f4> <98f4> 1151 <98fc> <98fc> 2242 <98fd> <98fd> 3678 <98fe> <98fe> 2534 <9903> <9903> 7204 endcidrange 100 begincidrange <9905> <9905> 3819 <9909> <9909> 7205 <990a> <990a> 3910 <990c> <990c> 1252 <9910> <9910> 2191 <9912> <9912> 7206 <9913> <9913> 1390 <9914> <9914> 7207 <9918> <9918> 7208 <991d> <991e> 7210 <9920> <9920> 7213 <9921> <9921> 7209 <9924> <9924> 7212 <9927> <9927> 8701 <9928> <9928> 1559 <992c> <992c> 7214 <992e> <992e> 7215 <9932> <9933> 15301 <993d> <993e> 7216 <9940> <9940> 15303 <9942> <9942> 7218 <9945> <9945> 7220 <9949> <9949> 7219 <994b> <994b> 7222 <994c> <994c> 7225 <994d> <994d> 15304 <9950> <9950> 7221 <9951> <9952> 7223 <9955> <9955> 7226 <9957> <9957> 1722 <995c> <995c> 15305 <995f> <995f> 15306 <9996> <9996> 2335 <9997> <9998> 7227 <9999> <9999> 2035 <999e> <999e> 8703 <99a5> <99a5> 7229 <99a8> <99a8> 1436 <99ac> <99ac> 3333 <99ad> <99ae> 7230 <99b1> <99b1> 15307 <99b3> <99b3> 2968 <99b4> <99b4> 3267 <99b9> <99ba> 15308 <99bc> <99bc> 7232 <99c1> <99c1> 3379 <99c4> <99c4> 2860 <99c5> <99c5> 1274 <99c6> <99c6> 1766 <99c8> <99c8> 1767 <99c9> <99c9> 15310 <99d0> <99d0> 2993 <99d1> <99d1> 7237 <99d2> <99d2> 1768 <99d5> <99d5> 1391 <99d8> <99d8> 7236 <99db> <99db> 7234 <99dd> <99dd> 7235 <99df> <99df> 7233 <99e2> <99e2> 7247 <99ed> <99ee> 7238 <99f1> <99f2> 7240 <99f8> <99f8> 7243 <99fb> <99fb> 7242 <99ff> <99ff> 2403 <9a01> <9a01> 7244 <9a02> <9a02> 15311 <9a05> <9a05> 7246 <9a08> <9a08> 14266 <9a0e> <9a0e> 1613 <9a0f> <9a0f> 7245 <9a12> <9a12> 2813 <9a13> <9a13> 1895 <9a16> <9a16> 15312 <9a19> <9a19> 7248 <9a24> <9a24> 15313 <9a27> <9a27> 15314 <9a28> <9a28> 2861 <9a2b> <9a2b> 7249 <9a2d> <9a2e> 15315 <9a30> <9a30> 3205 <9a36> <9a36> 15317 <9a37> <9a37> 7250 <9a38> <9a38> 15318 <9a3e> <9a3e> 7255 <9a40> <9a40> 7253 <9a42> <9a42> 7252 <9a43> <9a43> 7254 <9a45> <9a45> 7251 <9a4a> <9a4a> 15319 <9a4d> <9a4d> 7257 <9a4e> <9a4e> 8704 <9a52> <9a52> 7727 <9a55> <9a55> 7256 <9a56> <9a56> 15320 <9a57> <9a57> 7259 <9a5a> <9a5a> 1723 <9a5b> <9a5b> 7258 <9a5f> <9a5f> 7260 <9a62> <9a62> 7261 endcidrange 100 begincidrange <9a64> <9a64> 7263 <9a65> <9a65> 7262 <9a69> <9a69> 7264 <9a6a> <9a6a> 7266 <9a6b> <9a6b> 7265 <9aa8> <9aa8> 2062 <9aad> <9aad> 7267 <9ab0> <9ab0> 7268 <9ab5> <9ab6> 15321 <9ab8> <9ab8> 1434 <9abc> <9abc> 7269 <9ac0> <9ac0> 7270 <9ac4> <9ac4> 2615 <9acf> <9acf> 7271 <9ad1> <9ad1> 7272 <9ad3> <9ad4> 7273 <9ad8> <9ad8> 2036 <9ad9> <9ad9> 8705 <9adc> <9adc> 8706 <9ade> <9adf> 7275 <9ae2> <9ae3> 7277 <9ae6> <9ae6> 7279 <9aea> <9aea> 3397 <9aeb> <9aeb> 7281 <9aed> <9aed> 3480 <9aee> <9aee> 7282 <9aef> <9aef> 7280 <9af1> <9af1> 7284 <9af4> <9af4> 7283 <9af7> <9af7> 7285 <9af9> <9af9> 15323 <9afb> <9afb> 7286 <9b03> <9b03> 15324 <9b06> <9b06> 7287 <9b18> <9b18> 7288 <9b1a> <9b1a> 7289 <9b1f> <9b1f> 7290 <9b20> <9b20> 15325 <9b22> <9b23> 7291 <9b25> <9b25> 7293 <9b27> <9b2a> 7294 <9b2d> <9b2d> 13372 <9b2e> <9b2f> 7298 <9b31> <9b31> 5332 <9b32> <9b32> 7300 <9b33> <9b34> 15326 <9b3b> <9b3b> 6057 <9b3c> <9b3c> 1614 <9b41> <9b41> 1407 <9b42> <9b42> 2082 <9b43> <9b43> 7302 <9b44> <9b44> 7301 <9b45> <9b45> 3761 <9b4d> <9b4e> 7304 <9b4f> <9b4f> 7303 <9b51> <9b51> 7306 <9b54> <9b54> 3728 <9b58> <9b58> 7307 <9b5a> <9b5a> 1685 <9b6f> <9b6f> 4043 <9b72> <9b72> 8708 <9b73> <9b73> 15328 <9b74> <9b74> 7308 <9b75> <9b75> 8707 <9b79> <9b79> 15329 <9b83> <9b83> 7310 <9b8e> <9b8e> 1154 <9b8f> <9b8f> 8709 <9b91> <9b91> 7311 <9b92> <9b92> 3579 <9b93> <9b93> 7309 <9b96> <9b97> 7312 <9b9f> <9ba0> 7314 <9ba7> <9ba7> 15330 <9ba8> <9ba8> 7316 <9baa> <9baa> 3740 <9bab> <9bab> 2171 <9bad> <9bad> 2154 <9bae> <9bae> 2737 <9bb1> <9bb1> 8710 <9bb4> <9bb4> 7317 <9bb9> <9bb9> 7320 <9bbb> <9bbb> 8711 <9bc0> <9bc0> 7318 <9bc1> <9bc1> 15331 <9bc6> <9bc6> 7321 <9bc7> <9bc7> 15332 <9bc9> <9bc9> 1957 <9bca> <9bca> 7319 <9bcf> <9bcf> 7322 <9bd1> <9bd2> 7323 <9bd4> <9bd4> 7328 <9bd6> <9bd6> 2168 <9bd7> <9bd7> 15333 <9bdb> <9bdb> 2884 <9bdf> <9bdf> 14271 <9be1> <9be1> 7329 <9be2> <9be2> 7326 <9be3> <9be3> 7325 <9be4> <9be4> 7327 endcidrange 100 begincidrange <9be7> <9be7> 15334 <9be8> <9be8> 1845 <9beb> <9beb> 15335 <9bf0> <9bf0> 7333 <9bf1> <9bf1> 7332 <9bf2> <9bf2> 7331 <9bf5> <9bf5> 1143 <9bf7> <9bf7> 15336 <9bfa> <9bfa> 15337 <9bfd> <9bfd> 15338 <9c00> <9c00> 8712 <9c04> <9c04> 7343 <9c06> <9c06> 7339 <9c08> <9c08> 7340 <9c09> <9c09> 7336 <9c0a> <9c0a> 7342 <9c0b> <9c0b> 15339 <9c0c> <9c0c> 7338 <9c0d> <9c0d> 1472 <9c10> <9c10> 4082 <9c12> <9c12> 7341 <9c13> <9c13> 7337 <9c14> <9c14> 7335 <9c15> <9c15> 7334 <9c1b> <9c1b> 7345 <9c21> <9c21> 7348 <9c24> <9c24> 7347 <9c25> <9c25> 7346 <9c27> <9c27> 15340 <9c2a> <9c2a> 15341 <9c2d> <9c2d> 3515 <9c2e> <9c2e> 7344 <9c2f> <9c2f> 1207 <9c30> <9c30> 7349 <9c32> <9c32> 7351 <9c36> <9c36> 15342 <9c39> <9c39> 1485 <9c3a> <9c3a> 7330 <9c3b> <9c3b> 1241 <9c3e> <9c3e> 7353 <9c41> <9c41> 15343 <9c46> <9c46> 7352 <9c47> <9c47> 7350 <9c48> <9c48> 2923 <9c52> <9c52> 3742 <9c53> <9c53> 15344 <9c57> <9c57> 4002 <9c5a> <9c5a> 7354 <9c60> <9c60> 7355 <9c63> <9c63> 15345 <9c67> <9c67> 7356 <9c6a> <9c6a> 15346 <9c76> <9c76> 7357 <9c77> <9c77> 15347 <9c78> <9c78> 7358 <9ce5> <9ce5> 3031 <9ce7> <9ce7> 7359 <9ce9> <9ce9> 3403 <9ceb> <9ceb> 7364 <9cec> <9cec> 7360 <9cf0> <9cf0> 7361 <9cf3> <9cf3> 3679 <9cf4> <9cf4> 3792 <9cf6> <9cf6> 3240 <9d02> <9d02> 15348 <9d03> <9d03> 7365 <9d06> <9d06> 7366 <9d07> <9d07> 3222 <9d08> <9d08> 7363 <9d09> <9d09> 7362 <9d0e> <9d0e> 1322 <9d12> <9d12> 7374 <9d15> <9d15> 7373 <9d1b> <9d1b> 1303 <9d1f> <9d1f> 7371 <9d23> <9d23> 7370 <9d26> <9d26> 7368 <9d28> <9d28> 1497 <9d2a> <9d2a> 7367 <9d2b> <9d2b> 2270 <9d2c> <9d2c> 1321 <9d3b> <9d3b> 2037 <9d3e> <9d3e> 7377 <9d3f> <9d3f> 7376 <9d41> <9d41> 7375 <9d42> <9d42> 15349 <9d44> <9d44> 7372 <9d46> <9d46> 7378 <9d47> <9d47> 15350 <9d48> <9d48> 7379 <9d50> <9d50> 7384 <9d51> <9d51> 7383 <9d59> <9d59> 7385 <9d5c> <9d5c> 1231 <9d5d> <9d5e> 7380 <9d60> <9d60> 2054 <9d61> <9d61> 3781 <9d63> <9d63> 15351 <9d64> <9d64> 7382 <9d69> <9d69> 15352 endcidrange 100 begincidrange <9d6b> <9d6b> 8714 <9d6c> <9d6c> 3680 <9d6f> <9d6f> 7390 <9d70> <9d70> 8713 <9d72> <9d72> 7386 <9d7a> <9d7a> 7391 <9d7c> <9d7c> 15353 <9d7e> <9d7e> 15354 <9d87> <9d87> 7388 <9d89> <9d89> 7387 <9d8d> <9d8d> 15355 <9d8f> <9d8f> 1842 <9d9a> <9d9a> 7392 <9da4> <9da4> 7393 <9da9> <9da9> 7394 <9dab> <9dab> 7389 <9daf> <9daf> 7369 <9db1> <9db1> 15356 <9db2> <9db2> 7395 <9db4> <9db4> 3069 <9db8> <9db8> 7399 <9dba> <9dba> 7400 <9dbb> <9dbb> 7398 <9dc1> <9dc1> 7397 <9dc2> <9dc2> 7403 <9dc3> <9dc3> 15357 <9dc4> <9dc4> 7396 <9dc6> <9dc6> 7401 <9dc7> <9dc7> 15358 <9dcf> <9dcf> 7402 <9dd3> <9dd3> 7405 <9dd6> <9dd6> 15359 <9dd7> <9dd7> 7646 <9dd9> <9dd9> 7404 <9ddf> <9ddf> 15360 <9de6> <9de6> 7407 <9deb> <9deb> 15361 <9ded> <9ded> 7408 <9def> <9def> 7409 <9df2> <9df2> 4079 <9df4> <9df4> 15362 <9df8> <9df8> 7406 <9df9> <9df9> 2891 <9dfa> <9dfa> 2141 <9dfd> <9dfd> 7410 <9e15> <9e15> 15363 <9e19> <9e19> 8716 <9e1a> <9e1b> 7411 <9e1d> <9e1d> 15364 <9e1e> <9e1e> 7413 <9e75> <9e75> 7414 <9e78> <9e78> 1896 <9e79> <9e79> 7415 <9e7c> <9e7c> 7677 <9e7d> <9e7d> 7416 <9e7f> <9e7f> 2267 <9e81> <9e81> 7417 <9e88> <9e88> 7418 <9e8b> <9e8c> 7419 <9e91> <9e91> 7423 <9e92> <9e92> 7421 <9e93> <9e93> 4066 <9e95> <9e95> 7422 <9e97> <9e97> 4023 <9e9d> <9e9d> 7424 <9e9f> <9e9f> 4003 <9ea4> <9ea4> 15365 <9ea5> <9ea5> 7425 <9ea6> <9ea6> 3380 <9ea8> <9ea8> 15366 <9ea9> <9ea9> 7426 <9eaa> <9eaa> 7428 <9eac> <9eac> 15367 <9ead> <9ead> 7429 <9eb4> <9eb4> 7682 <9eb5> <9eb5> 7797 <9eb8> <9eb8> 7427 <9eb9> <9eb9> 2047 <9eba> <9eba> 3801 <9ebb> <9ebb> 3729 <9ebc> <9ebc> 4740 <9ebe> <9ebe> 5375 <9ebf> <9ebf> 3753 <9ec3> <9ec3> 13323 <9ec4> <9ec4> 1323 <9ecc> <9ecc> 7431 <9ecd> <9ecd> 1642 <9ece> <9ed0> 7432 <9ed1> <9ed1> 8717 <9ed2> <9ed2> 2055 <9ed4> <9ed4> 7435 <9ed8> <9ed8> 5645 <9ed9> <9ed9> 3815 <9edb> <9edb> 2883 <9edc> <9edc> 7436 <9edd> <9edd> 7438 <9ede> <9ede> 7437 <9ee0> <9ee0> 7439 <9ee5> <9ee5> 7440 <9ee7> <9ee7> 15368 endcidrange 100 begincidrange <9ee8> <9ee8> 7441 <9eee> <9eee> 15369 <9eef> <9eef> 7442 <9ef4> <9ef4> 7443 <9ef6> <9ef7> 7444 <9ef9> <9ef9> 7446 <9efb> <9efd> 7447 <9f07> <9f08> 7450 <9f0e> <9f0e> 3102 <9f10> <9f10> 15370 <9f12> <9f12> 15371 <9f13> <9f13> 1937 <9f15> <9f15> 7453 <9f17> <9f17> 15372 <9f19> <9f19> 15373 <9f20> <9f20> 2767 <9f21> <9f21> 7454 <9f2c> <9f2c> 7455 <9f2f> <9f2f> 15374 <9f37> <9f37> 15375 <9f39> <9f39> 15376 <9f3b> <9f3b> 3475 <9f3e> <9f3e> 7456 <9f41> <9f41> 15377 <9f45> <9f45> 15378 <9f4a> <9f4a> 7457 <9f4b> <9f4b> 5898 <9f4e> <9f4e> 6779 <9f4f> <9f4f> 7174 <9f52> <9f52> 7458 <9f54> <9f54> 7459 <9f57> <9f57> 15379 <9f5f> <9f61> 7461 <9f62> <9f62> 4024 <9f63> <9f63> 7460 <9f66> <9f67> 7464 <9f68> <9f68> 15380 <9f6a> <9f6a> 7467 <9f6c> <9f6c> 7466 <9f71> <9f71> 15381 <9f72> <9f72> 7469 <9f75> <9f75> 15382 <9f76> <9f76> 7470 <9f77> <9f77> 7468 <9f8d> <9f8d> 3966 <9f90> <9f90> 15383 <9f94> <9f94> 15384 <9f95> <9f95> 7471 <9f9c> <9f9c> 7472 <9f9d> <9f9d> 5927 <9fa0> <9fa0> 7473 <9fa2> <9fa2> 15385 <f929> <f929> 8489 <f9dc> <f9dc> 8686 <fa0e> <fa0e> 8410 <fa0f> <fa10> 8421 <fa11> <fa11> 8443 <fa12> <fa12> 8481 <fa13> <fa13> 8497 <fa14> <fa14> 8499 <fa15> <fa15> 8542 <fa16> <fa16> 8548 <fa17> <fa17> 8571 <fa18> <fa1a> 8579 <fa1b> <fa1b> 8583 <fa1c> <fa1c> 8587 <fa1d> <fa1d> 8590 <fa1e> <fa1e> 8599 <fa1f> <fa1f> 8610 <fa20> <fa21> 8612 <fa22> <fa22> 8622 <fa23> <fa23> 8630 <fa24> <fa25> 8632 <fa26> <fa26> 8636 <fa27> <fa27> 8664 <fa28> <fa28> 8671 <fa29> <fa29> 8687 <fa2a> <fa2b> 8699 <fa2c> <fa2c> 8702 <fa2d> <fa2d> 8715 <fb00> <fb00> 9358 <fb01> <fb02> 112 <fb03> <fb04> 9359 <fe30> <fe30> 7898 <fe31> <fe32> 7892 <fe33> <fe33> 7890 <fe35> <fe36> 7899 <fe37> <fe38> 7905 <fe39> <fe3a> 7901 <fe3b> <fe3c> 7915 <fe3d> <fe3e> 7909 <fe3f> <fe40> 7907 <fe41> <fe44> 7911 <ff01> <ff01> 642 <ff02> <ff02> 8007 <ff03> <ff03> 716 <ff04> <ff04> 712 <ff05> <ff05> 715 <ff06> <ff06> 717 <ff07> <ff07> 8006 endcidrange 33 begincidrange <ff08> <ff09> 674 <ff0a> <ff0a> 718 <ff0b> <ff0b> 692 <ff0c> <ff0c> 636 <ff0d> <ff0d> 693 <ff0e> <ff0e> 637 <ff0f> <ff0f> 663 <ff10> <ff19> 780 <ff1a> <ff1b> 639 <ff1c> <ff1c> 699 <ff1d> <ff1d> 697 <ff1e> <ff1e> 700 <ff1f> <ff1f> 641 <ff20> <ff20> 719 <ff21> <ff3a> 790 <ff3b> <ff3b> 678 <ff3c> <ff3c> 664 <ff3d> <ff3d> 679 <ff3e> <ff3e> 648 <ff3f> <ff3f> 650 <ff40> <ff40> 646 <ff41> <ff5a> 816 <ff5b> <ff5b> 680 <ff5c> <ff5c> 667 <ff5d> <ff5d> 681 <ff5e> <ff5e> 665 <ff61> <ff9f> 327 <ffe0> <ffe1> 713 <ffe2> <ffe2> 751 <ffe3> <ffe3> 649 <ffe4> <ffe4> 8005 <ffe5> <ffe5> 711 <ffe8> <ffe8> 323 endcidrange endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF \ No newline at end of file
diff --git a/src/main/resources/Resources/cmap/UniJIS-UCS2-HW-H b/src/main/resources/Resources/cmap/UniJIS-UCS2-HW-H
new file mode 100644
index 0000000..fecf616
--- /dev/null
+++ b/src/main/resources/Resources/cmap/UniJIS-UCS2-HW-H
@@ -0,0 +1 @@
+%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%DocumentNeededResources: CMap (UniJIS-UCS2-H) %%IncludeResource: ProcSet (CIDInit) %%IncludeResource: CMap (UniJIS-UCS2-H) %%BeginResource: CMap (UniJIS-UCS2-HW-H) %%Title: (UniJIS-UCS2-HW-H Adobe Japan1 2) %%Version: 11.001 %%Copyright: ----------------------------------------------------------- %%Copyright: Copyright 1990-1998 Adobe Systems Incorporated. %%Copyright: All Rights Reserved. %%Copyright: %%Copyright: Patents Pending %%Copyright: %%Copyright: NOTICE: All information contained herein is the property %%Copyright: of Adobe Systems Incorporated. %%Copyright: %%Copyright: Permission is granted for redistribution of this file %%Copyright: provided this copyright notice is maintained intact and %%Copyright: that the contents of this file are not altered in any %%Copyright: way from its original form. %%Copyright: %%Copyright: PostScript and Display PostScript are trademarks of %%Copyright: Adobe Systems Incorporated which may be registered in %%Copyright: certain jurisdictions. %%Copyright: ----------------------------------------------------------- %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /UniJIS-UCS2-H usecmap /CIDSystemInfo 3 dict dup begin /Registry (Adobe) def /Ordering (Japan1) def /Supplement 2 def end def /CMapName /UniJIS-UCS2-HW-H def /CMapVersion 11.001 def /CMapType 1 def /XUID [1 10 25448] def /WMode 0 def 4 begincidrange <0020> <005b> 231 <005c> <005c> 8719 <005d> <007e> 292 <00a5> <00a5> 291 endcidrange endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF \ No newline at end of file
diff --git a/src/main/resources/Resources/cmap/UniJIS-UCS2-HW-V b/src/main/resources/Resources/cmap/UniJIS-UCS2-HW-V
new file mode 100644
index 0000000..1c9025a
--- /dev/null
+++ b/src/main/resources/Resources/cmap/UniJIS-UCS2-HW-V
@@ -0,0 +1 @@
+%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%DocumentNeededResources: CMap (UniJIS-UCS2-H) %%IncludeResource: ProcSet (CIDInit) %%IncludeResource: CMap (UniJIS-UCS2-H) %%BeginResource: CMap (UniJIS-UCS2-HW-V) %%Title: (UniJIS-UCS2-HW-V Adobe Japan1 4) %%Version: 12.001 %%Copyright: ----------------------------------------------------------- %%Copyright: Copyright 1990-2000 Adobe Systems Incorporated. %%Copyright: All Rights Reserved. %%Copyright: %%Copyright: Patents Pending %%Copyright: %%Copyright: NOTICE: All information contained herein is the property %%Copyright: of Adobe Systems Incorporated. %%Copyright: %%Copyright: Permission is granted for redistribution of this file %%Copyright: provided this copyright notice is maintained intact and %%Copyright: that the contents of this file are not altered in any %%Copyright: way from its original form. %%Copyright: %%Copyright: PostScript and Display PostScript are trademarks of %%Copyright: Adobe Systems Incorporated which may be registered in %%Copyright: certain jurisdictions. %%Copyright: ----------------------------------------------------------- %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /UniJIS-UCS2-H usecmap /CIDSystemInfo 3 dict dup begin /Registry (Adobe) def /Ordering (Japan1) def /Supplement 4 def end def /CMapName /UniJIS-UCS2-HW-V def /CMapVersion 12.001 def /CMapType 1 def /XUID [1 10 25449] def /WMode 1 def 100 begincidrange <0020> <005b> 231 <005c> <005c> 8719 <005d> <007e> 292 <00a5> <00a5> 291 <00b0> <00b0> 8269 <2010> <2010> 7893 <2015> <2015> 7892 <2016> <2016> 7895 <2018> <2019> 8281 <201c> <201d> 8279 <2025> <2025> 7898 <2026> <2026> 7897 <2032> <2032> 8273 <2033> <2033> 8283 <2190> <2190> 738 <2191> <2191> 736 <2192> <2192> 739 <2193> <2193> 737 <2195> <2195> 12214 <21c4> <21c4> 8311 <21c5> <21c5> 8310 <21c6> <21c6> 8312 <21e6> <21e6> 8012 <21e7> <21e7> 8014 <21e8> <21e8> 8011 <21e9> <21e9> 8013 <2225> <2225> 7895 <223c> <223c> 7894 <22ef> <22ef> 7897 <2500> <2501> 7481 <2502> <2503> 7479 <2504> <2505> 7485 <2506> <2507> 7483 <2508> <2509> 7489 <250a> <250b> 7487 <250c> <250c> 7495 <250d> <250d> 7497 <250e> <250e> 7496 <250f> <250f> 7498 <2510> <2510> 7503 <2511> <2511> 7505 <2512> <2512> 7504 <2513> <2513> 7506 <2514> <2514> 7491 <2515> <2515> 7493 <2516> <2516> 7492 <2517> <2517> 7494 <2518> <2518> 7499 <2519> <2519> 7501 <251a> <251a> 7500 <251b> <251b> 7502 <251c> <251c> 7523 <251d> <251d> 7527 <251e> <251e> 7525 <251f> <251f> 7524 <2520> <2520> 7526 <2521> <2521> 7529 <2522> <2522> 7528 <2523> <2524> 7530 <2525> <2525> 7535 <2526> <2526> 7533 <2527> <2527> 7532 <2528> <2528> 7534 <2529> <2529> 7537 <252a> <252a> 7536 <252b> <252b> 7538 <252c> <252c> 7515 <252d> <252f> 7517 <2530> <2530> 7516 <2531> <2533> 7520 <2534> <2534> 7507 <2535> <2537> 7509 <2538> <2538> 7508 <2539> <253b> 7512 <253d> <253f> 7543 <2540> <2540> 7541 <2541> <2541> 7540 <2542> <2542> 7542 <2543> <2543> 7547 <2544> <2544> 7549 <2545> <2545> 7546 <2546> <2546> 7548 <2547> <2547> 7553 <2548> <2548> 7552 <2549> <254a> 7550 <261c> <261c> 8221 <261d> <261d> 8219 <261e> <261e> 8222 <261f> <261f> 8220 <2702> <2702> 12178 <27a1> <27a1> 8209 <3001> <3002> 7887 <3008> <3011> 7907 <3013> <3013> 8270 <3014> <3015> 7901 <301c> <301c> 7894 <301d> <301d> 7956 <301f> <301f> 7957 <3041> <3041> 7918 <3043> <3043> 7919 endcidrange 99 begincidrange <3045> <3045> 7920 <3047> <3047> 7921 <3049> <3049> 7922 <3063> <3063> 7923 <3083> <3083> 7924 <3085> <3085> 7925 <3087> <3087> 7926 <308e> <308e> 7927 <309b> <309b> 8272 <309c> <309c> 8271 <30a1> <30a1> 7928 <30a3> <30a3> 7929 <30a5> <30a5> 7930 <30a7> <30a7> 7931 <30a9> <30a9> 7932 <30c3> <30c3> 7933 <30e3> <30e3> 7934 <30e5> <30e5> 7935 <30e7> <30e7> 7936 <30ee> <30ee> 7937 <30f5> <30f6> 7938 <30fc> <30fc> 7891 <3300> <3300> 8350 <3301> <3302> 11958 <3303> <3303> 8338 <3304> <3304> 11960 <3305> <3305> 8333 <3306> <3306> 11961 <3307> <3307> 11965 <3308> <3308> 11963 <3309> <3309> 11968 <330a> <330a> 11966 <330b> <330b> 11970 <330c> <330c> 11972 <330d> <330d> 7950 <330e> <3313> 11973 <3314> <3314> 7941 <3315> <3315> 8340 <3316> <3316> 8330 <3317> <3317> 11980 <3318> <3318> 8339 <3319> <3319> 11982 <331a> <331d> 11984 <331e> <331e> 8353 <331f> <3321> 11988 <3322> <3322> 8329 <3323> <3323> 8348 <3324> <3324> 11991 <3325> <3325> 11993 <3326> <3326> 7951 <3327> <3327> 7945 <3328> <3329> 11996 <332a> <332a> 8356 <332b> <332b> 7953 <332d> <332d> 11999 <332e> <3330> 12002 <3331> <3331> 8358 <3332> <3332> 12005 <3333> <3333> 8334 <3334> <3335> 12008 <3336> <3336> 7947 <3337> <3337> 12014 <3338> <3338> 12016 <3339> <3339> 8343 <333a> <333a> 12017 <333b> <333b> 8349 <333c> <333c> 12010 <333d> <333d> 12018 <333e> <3340> 12020 <3341> <3341> 12019 <3342> <3342> 8347 <3343> <3346> 12023 <3347> <3347> 8357 <3348> <3348> 12027 <3349> <3349> 7940 <334a> <334a> 7954 <334b> <334c> 12028 <334d> <334d> 7943 <334e> <334e> 8337 <334f> <3350> 12030 <3351> <3351> 7948 <3352> <3352> 12034 <3353> <3353> 12038 <3354> <3354> 12035 <3355> <3356> 12039 <3357> <3357> 8344 <337f> <337f> 8324 <ff08> <ff09> 7899 <ff0c> <ff0c> 8268 <ff0e> <ff0e> 8274 <ff1d> <ff1d> 7917 <ff3b> <ff3b> 7903 <ff3d> <ff3d> 7904 <ff3f> <ff3f> 7890 <ff5b> <ff5b> 7905 <ff5c> <ff5c> 7896 <ff5d> <ff5d> 7906 <ff5e> <ff5e> 7894 <ffe3> <ffe3> 7889 endcidrange endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF \ No newline at end of file
diff --git a/src/main/resources/Resources/cmap/UniJIS-UCS2-V b/src/main/resources/Resources/cmap/UniJIS-UCS2-V
new file mode 100644
index 0000000..ebf3f1e
--- /dev/null
+++ b/src/main/resources/Resources/cmap/UniJIS-UCS2-V
@@ -0,0 +1 @@
+%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%DocumentNeededResources: CMap (UniJIS-UCS2-H) %%IncludeResource: ProcSet (CIDInit) %%IncludeResource: CMap (UniJIS-UCS2-H) %%BeginResource: CMap (UniJIS-UCS2-V) %%Title: (UniJIS-UCS2-V Adobe Japan1 4) %%Version: 12.001 %%Copyright: ----------------------------------------------------------- %%Copyright: Copyright 1990-2000 Adobe Systems Incorporated. %%Copyright: All Rights Reserved. %%Copyright: %%Copyright: Patents Pending %%Copyright: %%Copyright: NOTICE: All information contained herein is the property %%Copyright: of Adobe Systems Incorporated. %%Copyright: %%Copyright: Permission is granted for redistribution of this file %%Copyright: provided this copyright notice is maintained intact and %%Copyright: that the contents of this file are not altered in any %%Copyright: way from its original form. %%Copyright: %%Copyright: PostScript and Display PostScript are trademarks of %%Copyright: Adobe Systems Incorporated which may be registered in %%Copyright: certain jurisdictions. %%Copyright: ----------------------------------------------------------- %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /UniJIS-UCS2-H usecmap /CIDSystemInfo 3 dict dup begin /Registry (Adobe) def /Ordering (Japan1) def /Supplement 4 def end def /CMapName /UniJIS-UCS2-V def /CMapVersion 12.001 def /CMapType 1 def /XUID [1 10 25357] def /WMode 1 def 100 begincidrange <00b0> <00b0> 8269 <2010> <2010> 7893 <2015> <2015> 7892 <2016> <2016> 7895 <2018> <2019> 8281 <201c> <201d> 8279 <2025> <2025> 7898 <2026> <2026> 7897 <2032> <2032> 8273 <2033> <2033> 8283 <2190> <2190> 738 <2191> <2191> 736 <2192> <2192> 739 <2193> <2193> 737 <2195> <2195> 12214 <21c4> <21c4> 8311 <21c5> <21c5> 8310 <21c6> <21c6> 8312 <21e6> <21e6> 8012 <21e7> <21e7> 8014 <21e8> <21e8> 8011 <21e9> <21e9> 8013 <2225> <2225> 7895 <223c> <223c> 7894 <22ef> <22ef> 7897 <2500> <2501> 7481 <2502> <2503> 7479 <2504> <2505> 7485 <2506> <2507> 7483 <2508> <2509> 7489 <250a> <250b> 7487 <250c> <250c> 7495 <250d> <250d> 7497 <250e> <250e> 7496 <250f> <250f> 7498 <2510> <2510> 7503 <2511> <2511> 7505 <2512> <2512> 7504 <2513> <2513> 7506 <2514> <2514> 7491 <2515> <2515> 7493 <2516> <2516> 7492 <2517> <2517> 7494 <2518> <2518> 7499 <2519> <2519> 7501 <251a> <251a> 7500 <251b> <251b> 7502 <251c> <251c> 7523 <251d> <251d> 7527 <251e> <251e> 7525 <251f> <251f> 7524 <2520> <2520> 7526 <2521> <2521> 7529 <2522> <2522> 7528 <2523> <2524> 7530 <2525> <2525> 7535 <2526> <2526> 7533 <2527> <2527> 7532 <2528> <2528> 7534 <2529> <2529> 7537 <252a> <252a> 7536 <252b> <252b> 7538 <252c> <252c> 7515 <252d> <252f> 7517 <2530> <2530> 7516 <2531> <2533> 7520 <2534> <2534> 7507 <2535> <2537> 7509 <2538> <2538> 7508 <2539> <253b> 7512 <253d> <253f> 7543 <2540> <2540> 7541 <2541> <2541> 7540 <2542> <2542> 7542 <2543> <2543> 7547 <2544> <2544> 7549 <2545> <2545> 7546 <2546> <2546> 7548 <2547> <2547> 7553 <2548> <2548> 7552 <2549> <254a> 7550 <261c> <261c> 8221 <261d> <261d> 8219 <261e> <261e> 8222 <261f> <261f> 8220 <2702> <2702> 12178 <27a1> <27a1> 8209 <3001> <3002> 7887 <3008> <3011> 7907 <3013> <3013> 8270 <3014> <3015> 7901 <301c> <301c> 7894 <301d> <301d> 7956 <301f> <301f> 7957 <3041> <3041> 7918 <3043> <3043> 7919 <3045> <3045> 7920 <3047> <3047> 7921 <3049> <3049> 7922 <3063> <3063> 7923 endcidrange 95 begincidrange <3083> <3083> 7924 <3085> <3085> 7925 <3087> <3087> 7926 <308e> <308e> 7927 <309b> <309b> 8272 <309c> <309c> 8271 <30a1> <30a1> 7928 <30a3> <30a3> 7929 <30a5> <30a5> 7930 <30a7> <30a7> 7931 <30a9> <30a9> 7932 <30c3> <30c3> 7933 <30e3> <30e3> 7934 <30e5> <30e5> 7935 <30e7> <30e7> 7936 <30ee> <30ee> 7937 <30f5> <30f6> 7938 <30fc> <30fc> 7891 <3300> <3300> 8350 <3301> <3302> 11958 <3303> <3303> 8338 <3304> <3304> 11960 <3305> <3305> 8333 <3306> <3306> 11961 <3307> <3307> 11965 <3308> <3308> 11963 <3309> <3309> 11968 <330a> <330a> 11966 <330b> <330b> 11970 <330c> <330c> 11972 <330d> <330d> 7950 <330e> <3313> 11973 <3314> <3314> 7941 <3315> <3315> 8340 <3316> <3316> 8330 <3317> <3317> 11980 <3318> <3318> 8339 <3319> <3319> 11982 <331a> <331d> 11984 <331e> <331e> 8353 <331f> <3321> 11988 <3322> <3322> 8329 <3323> <3323> 8348 <3324> <3324> 11991 <3325> <3325> 11993 <3326> <3326> 7951 <3327> <3327> 7945 <3328> <3329> 11996 <332a> <332a> 8356 <332b> <332b> 7953 <332d> <332d> 11999 <332e> <3330> 12002 <3331> <3331> 8358 <3332> <3332> 12005 <3333> <3333> 8334 <3334> <3335> 12008 <3336> <3336> 7947 <3337> <3337> 12014 <3338> <3338> 12016 <3339> <3339> 8343 <333a> <333a> 12017 <333b> <333b> 8349 <333c> <333c> 12010 <333d> <333d> 12018 <333e> <3340> 12020 <3341> <3341> 12019 <3342> <3342> 8347 <3343> <3346> 12023 <3347> <3347> 8357 <3348> <3348> 12027 <3349> <3349> 7940 <334a> <334a> 7954 <334b> <334c> 12028 <334d> <334d> 7943 <334e> <334e> 8337 <334f> <3350> 12030 <3351> <3351> 7948 <3352> <3352> 12034 <3353> <3353> 12038 <3354> <3354> 12035 <3355> <3356> 12039 <3357> <3357> 8344 <337f> <337f> 8324 <ff08> <ff09> 7899 <ff0c> <ff0c> 8268 <ff0e> <ff0e> 8274 <ff1d> <ff1d> 7917 <ff3b> <ff3b> 7903 <ff3d> <ff3d> 7904 <ff3f> <ff3f> 7890 <ff5b> <ff5b> 7905 <ff5c> <ff5c> 7896 <ff5d> <ff5d> 7906 <ff5e> <ff5e> 7894 <ffe3> <ffe3> 7889 endcidrange endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF \ No newline at end of file
diff --git a/src/main/resources/Resources/cmap/UniKS-UCS2-H b/src/main/resources/Resources/cmap/UniKS-UCS2-H
new file mode 100644
index 0000000..67eea6a
--- /dev/null
+++ b/src/main/resources/Resources/cmap/UniKS-UCS2-H
@@ -0,0 +1 @@
+%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%IncludeResource: ProcSet (CIDInit) %%BeginResource: CMap (UniKS-UCS2-H) %%Title: (UniKS-UCS2-H Adobe Korea1 1) %%Version: 10.001 %%Copyright: ----------------------------------------------------------- %%Copyright: Copyright 1990-1999 Adobe Systems Incorporated. %%Copyright: All Rights Reserved. %%Copyright: %%Copyright: Patents Pending %%Copyright: %%Copyright: NOTICE: All information contained herein is the property %%Copyright: of Adobe Systems Incorporated. %%Copyright: %%Copyright: Permission is granted for redistribution of this file %%Copyright: provided this copyright notice is maintained intact and %%Copyright: that the contents of this file are not altered in any %%Copyright: way from its original form. %%Copyright: %%Copyright: PostScript and Display PostScript are trademarks of %%Copyright: Adobe Systems Incorporated which may be registered in %%Copyright: certain jurisdictions. %%Copyright: ----------------------------------------------------------- %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo 3 dict dup begin /Registry (Adobe) def /Ordering (Korea1) def /Supplement 1 def end def /CMapName /UniKS-UCS2-H def /CMapVersion 10.001 def /CMapType 1 def /XUID [1 10 25406] def /WMode 0 def 2 begincodespacerange <0000> <D7FF> <E000> <FFFF> endcodespacerange 1 beginnotdefrange <0000> <001f> 1 endnotdefrange 100 begincidrange <0020> <007e> 1 <00a1> <00a1> 208 <00a4> <00a4> 214 <00a7> <00a7> 155 <00a8> <00a8> 107 <00aa> <00aa> 668 <00ab> <00ab> 176 <00b0> <00b0> 138 <00b1> <00b1> 130 <00b2> <00b3> 843 <00b4> <00b4> 199 <00b6> <00b6> 244 <00b8> <00b8> 206 <00b9> <00b9> 842 <00ba> <00ba> 675 <00bb> <00bb> 177 <00bc> <00bc> 751 <00bd> <00bd> 748 <00be> <00be> 752 <00bf> <00bf> 209 <00c6> <00c6> 666 <00d0> <00d0> 667 <00d7> <00d7> 131 <00d8> <00d8> 673 <00de> <00de> 676 <00df> <00df> 768 <00e6> <00e6> 757 <00f0> <00f0> 759 <00f7> <00f7> 132 <00f8> <00f8> 766 <00fe> <00fe> 769 <0111> <0111> 758 <0126> <0126> 669 <0127> <0127> 760 <0131> <0131> 761 <0132> <0132> 670 <0133> <0133> 762 <0138> <0138> 763 <013f> <013f> 671 <0140> <0140> 764 <0141> <0141> 672 <0142> <0142> 765 <0149> <0149> 772 <014a> <014a> 678 <014b> <014b> 771 <0152> <0152> 674 <0153> <0153> 767 <0166> <0166> 677 <0167> <0167> 770 <02bc> <02bc> 8275 <02c7> <02c7> 201 <02d8> <02d8> 202 <02d9> <02d9> 205 <02da> <02da> 204 <02db> <02db> 207 <02dc> <02dc> 200 <02dd> <02dd> 203 <0391> <03a1> 471 <03a3> <03a9> 488 <03b1> <03c1> 495 <03c3> <03c9> 512 <0401> <0401> 1026 <0410> <0415> 1020 <0416> <0435> 1027 <0436> <044f> 1060 <0451> <0451> 1059 <2013> <2014> 109 <2016> <2016> 111 <2018> <2019> 114 <201b> <201b> 8238 <201c> <201d> 116 <201f> <201f> 8237 <2020> <2021> 245 <2022> <2022> 8607 <2025> <2026> 105 <2030> <2030> 216 <2032> <2033> 139 <2034> <2034> 8582 <2035> <2035> 9326 <2036> <2036> 9324 <2039> <203a> 8612 <203b> <203b> 156 <203c> <203c> 8763 <2042> <2042> 8599 <2074> <2074> 845 <207a> <207b> 8239 <207c> <207c> 8248 <207d> <207e> 8250 <207f> <207f> 846 <2081> <2084> 847 <2103> <2103> 141 <2109> <2109> 215 <2113> <2113> 590 <2116> <2116> 258 <2121> <2121> 263 <2122> <2122> 260 <2126> <2126> 643 <212b> <212b> 142 <2153> <2154> 749 <215b> <215e> 753 endcidrange 100 begincidrange <2160> <2169> 461 <2170> <2179> 451 <2190> <2191> 171 <2192> <2192> 170 <2193> <2194> 173 <2195> <2195> 247 <2196> <2196> 250 <2197> <2197> 248 <2198> <2198> 251 <2199> <2199> 249 <21b0> <21b0> 8868 <21b1> <21b1> 8865 <21b2> <21b2> 8864 <21b3> <21b3> 8869 <21b4> <21b4> 8867 <21bc> <21bc> 8884 <21c0> <21c0> 8885 <21c4> <21c5> 8896 <21cd> <21cd> 8816 <21cf> <21cf> 8815 <21d0> <21d0> 8814 <21d1> <21d1> 8854 <21d2> <21d2> 195 <21d3> <21d3> 8855 <21d4> <21d4> 196 <21e0> <21e0> 9190 <21e1> <21e1> 9192 <21e2> <21e2> 9191 <21e3> <21e3> 9193 <21e6> <21e6> 9198 <21e7> <21e7> 9200 <21e8> <21e8> 9199 <21e9> <21e9> 9201 <2200> <2200> 197 <2202> <2202> 151 <2203> <2203> 198 <2206> <2206> 8715 <2207> <2207> 152 <2208> <2208> 184 <2209> <2209> 8749 <220b> <220b> 185 <220c> <220c> 8750 <220f> <220f> 213 <2211> <2211> 212 <2213> <2213> 8726 <221a> <221a> 178 <221d> <221d> 180 <221e> <221e> 136 <221f> <221f> 8717 <2220> <2220> 148 <2222> <2222> 8738 <2225> <2226> 8719 <2227> <2228> 192 <2229> <2229> 191 <222a> <222a> 190 <222b> <222c> 182 <222e> <222e> 211 <2234> <2234> 137 <2235> <2235> 181 <2236> <2236> 210 <2237> <2237> 8321 <223d> <223d> 179 <2243> <2243> 8500 <2245> <2245> 8499 <2248> <2248> 8501 <2250> <2250> 8739 <2251> <2251> 8723 <2252> <2252> 154 <2253> <2253> 8722 <225a> <225a> 8753 <2260> <2260> 133 <2261> <2261> 153 <2262> <2262> 8734 <2264> <2265> 134 <2266> <2267> 8724 <226e> <226f> 8745 <2270> <2273> 8481 <2276> <2277> 8489 <2279> <2279> 8491 <227a> <227b> 8475 <2280> <2281> 8479 <2282> <2283> 188 <2284> <2284> 8748 <2285> <2285> 8747 <2286> <2287> 186 <228a> <228a> 8486 <228b> <228b> 8488 <2295> <2297> 8727 <22a3> <22a3> 8742 <22a4> <22a4> 8503 <22a5> <22a5> 149 <22bb> <22bc> 8751 <22ce> <22cf> 8477 <22da> <22db> 8492 <22ee> <22ee> 8320 <22ef> <22ef> 106 <2306> <2306> 8754 <2312> <2312> 150 <2314> <2314> 8731 <2460> <246e> 733 endcidrange 100 begincidrange <246f> <2473> 8791 <2474> <2482> 827 <2483> <2487> 9042 <249c> <24b5> 801 <24b6> <24cf> 8388 <24d0> <24e9> 707 <2500> <2500> 519 <2501> <2501> 530 <2502> <2502> 520 <2503> <2503> 531 <250c> <250c> 521 <250d> <250d> 558 <250e> <250e> 557 <250f> <250f> 532 <2510> <2510> 522 <2511> <2511> 552 <2512> <2512> 551 <2513> <2513> 533 <2514> <2514> 524 <2515> <2515> 556 <2516> <2516> 555 <2517> <2517> 535 <2518> <2518> 523 <2519> <2519> 554 <251a> <251a> 553 <251b> <251b> 534 <251c> <251c> 525 <251d> <251d> 546 <251e> <251f> 559 <2520> <2520> 541 <2521> <2522> 561 <2523> <2523> 536 <2524> <2524> 527 <2525> <2525> 548 <2526> <2527> 563 <2528> <2528> 543 <2529> <252a> 565 <252b> <252b> 538 <252c> <252c> 526 <252d> <252e> 567 <252f> <252f> 542 <2530> <2530> 547 <2531> <2532> 569 <2533> <2533> 537 <2534> <2534> 528 <2535> <2536> 571 <2537> <2537> 544 <2538> <2538> 549 <2539> <253a> 573 <253b> <253b> 539 <253c> <253c> 529 <253d> <253e> 575 <253f> <253f> 545 <2540> <2541> 577 <2542> <2542> 550 <2543> <254a> 579 <254b> <254b> 540 <2592> <2592> 232 <25a0> <25a0> 165 <25a1> <25a1> 164 <25a3> <25a3> 229 <25a4> <25a5> 233 <25a6> <25a6> 237 <25a7> <25a7> 236 <25a8> <25a8> 235 <25a9> <25a9> 238 <25b1> <25b1> 8736 <25b2> <25b2> 167 <25b3> <25b3> 166 <25b5> <25b5> 8780 <25b6> <25b6> 220 <25b7> <25b7> 219 <25b9> <25b9> 8781 <25bc> <25bc> 169 <25bd> <25bd> 168 <25bf> <25bf> 8779 <25c0> <25c0> 218 <25c1> <25c1> 217 <25c3> <25c3> 8782 <25c6> <25c6> 163 <25c7> <25c7> 162 <25c8> <25c8> 228 <25c9> <25c9> 227 <25ca> <25ca> 8787 <25cb> <25cb> 159 <25cc> <25cc> 8639 <25ce> <25ce> 161 <25cf> <25cf> 160 <25d0> <25d1> 230 <25e6> <25e6> 8775 <25ef> <25ef> 8633 <2605> <2605> 158 <2606> <2606> 157 <260e> <260e> 241 <260f> <260f> 240 <261c> <261c> 242 <261d> <261d> 9222 <261e> <261e> 243 <261f> <261f> 9223 <262f> <262f> 8664 endcidrange 100 begincidrange <2640> <2640> 147 <2642> <2642> 146 <2660> <2661> 222 <2663> <2663> 226 <2664> <2664> 221 <2665> <2665> 224 <2667> <2667> 225 <2668> <2668> 239 <2669> <266a> 253 <266c> <266c> 255 <266d> <266d> 252 <266f> <266f> 8594 <2716> <2716> 8631 <271a> <271a> 8630 <273d> <273d> 8604 <2756> <2756> 8637 <2776> <277f> 8673 <278a> <2793> 8342 <3000> <3002> 101 <3003> <3003> 108 <3008> <3011> 120 <3012> <3012> 8700 <3013> <3013> 175 <3014> <3015> 118 <3016> <3019> 8219 <301e> <301f> 9322 <3020> <3020> 8671 <3036> <3036> 8701 <3041> <3093> 851 <30a1> <30f6> 934 <30fb> <30fb> 104 <30fc> <30fc> 9330 <3131> <3163> 358 <3164> <3164> 101 <3165> <318e> 409 <3200> <321b> 773 <321c> <321c> 257 <3231> <3231> 8788 <3239> <3239> 8789 <3260> <327b> 679 <327f> <327f> 256 <328a> <328f> 9301 <3290> <3290> 9300 <3294> <3294> 9080 <329e> <329e> 8761 <32a5> <32a5> 9096 <3380> <3384> 627 <3388> <3389> 612 <338a> <338c> 646 <338d> <338f> 608 <3390> <3394> 638 <3395> <3397> 587 <3398> <3398> 591 <3399> <33a2> 597 <33a3> <33a6> 593 <33a7> <33a8> 615 <33a9> <33ac> 655 <33ad> <33af> 651 <33b0> <33b9> 617 <33ba> <33bf> 632 <33c0> <33c1> 644 <33c2> <33c2> 261 <33c3> <33c3> 662 <33c4> <33c4> 592 <33c5> <33c5> 650 <33c6> <33c6> 665 <33c7> <33c7> 259 <33c8> <33c8> 614 <33c9> <33c9> 663 <33ca> <33ca> 607 <33cb> <33cb> 8790 <33cf> <33cf> 611 <33d0> <33d0> 660 <33d3> <33d3> 661 <33d6> <33d6> 649 <33d8> <33d8> 262 <33db> <33db> 654 <33dc> <33dc> 664 <33dd> <33dd> 659 <4e00> <4e00> 6460 <4e01> <4e01> 6704 <4e03> <4e03> 7364 <4e07> <4e07> 4670 <4e08> <4e08> 6534 <4e09> <4e09> 5320 <4e0a> <4e0a> 5331 <4e0b> <4e0b> 7616 <4e0d> <4e0d> 5109 <4e11> <4e11> 7288 <4e14> <4e14> 7041 <4e15> <4e15> 5181 <4e16> <4e16> 5492 <4e18> <4e18> 3893 <4e19> <4e19> 5041 <4e1e> <4e1e> 5682 <4e2d> <4e2d> 6922 <4e32> <4e32> 3802 <4e38> <4e38> 7882 <4e39> <4e39> 4192 <4e3b> <4e3b> 6860 endcidrange 100 begincidrange <4e42> <4e42> 6029 <4e43> <4e43> 4154 <4e45> <4e45> 3894 <4e4b> <4e4b> 6942 <4e4d> <4e4d> 5241 <4e4e> <4e4e> 7800 <4e4f> <4e4f> 7614 <4e56> <4e56> 3855 <4e58> <4e58> 5683 <4e59> <4e59> 6380 <4e5d> <4e5d> 3895 <4e5e> <4e5e> 3613 <4e5f> <4e5f> 5862 <4e6b> <4e6b> 3500 <4e6d> <4e6d> 4329 <4e73> <4e73> 6309 <4e76> <4e76> 5092 <4e77> <4e77> 5315 <4e7e> <4e7e> 3601 <4e82> <4e82> 4389 <4e86> <4e86> 4551 <4e88> <4e88> 5934 <4e8b> <4e8b> 5242 <4e8c> <4e8c> 6413 <4e8e> <4e8e> 6197 <4e90> <4e90> 6252 <4e91> <4e91> 6238 <4e92> <4e92> 7801 <4e94> <4e94> 6049 <4e95> <4e95> 6705 <4e98> <4e98> 4058 <4e9b> <4e9b> 5243 <4e9e> <4e9e> 5775 <4ea1> <4ea1> 4696 <4ea2> <4ea2> 7670 <4ea4> <4ea4> 3868 <4ea5> <4ea5> 7685 <4ea6> <4ea6> 5947 <4ea8> <4ea8> 7771 <4eab> <4eab> 7710 <4eac> <4eac> 3660 <4ead> <4ead> 6706 <4eae> <4eae> 4427 <4eb6> <4eb6> 4193 <4eba> <4eba> 6443 <4ec0> <4ec0> 5771 <4ec1> <4ec1> 6444 <4ec4> <4ec4> 7331 <4ec7> <4ec7> 3896 <4eca> <4eca> 4038 <4ecb> <4ecb> 3560 <4ecd> <4ecd> 6479 <4ed4> <4ed4> 6483 <4ed5> <4ed5> 5244 <4ed6> <4ed6> 7380 <4ed7> <4ed7> 6535 <4ed8> <4ed8> 5110 <4ed9> <4ed9> 5418 <4edd> <4edd> 4331 <4edf> <4edf> 7148 <4ee3> <4ee3> 4250 <4ee4> <4ee4> 4489 <4ee5> <4ee5> 6414 <4ef0> <4ef0> 5833 <4ef2> <4ef2> 6923 <4ef6> <4ef6> 3602 <4ef7> <4ef7> 3561 <4efb> <4efb> 6469 <4f01> <4f01> 4062 <4f09> <4f09> 7671 <4f0a> <4f0a> 6415 <4f0b> <4f0b> 4051 <4f0d> <4f0d> 6050 <4f0e> <4f0e> 4063 <4f0f> <4f0f> 5074 <4f10> <4f10> 5005 <4f11> <4f11> 8005 <4f2f> <4f2f> 4988 <4f34> <4f34> 4905 <4f36> <4f36> 4490 <4f38> <4f38> 5735 <4f3a> <4f3a> 5245 <4f3c> <4f3c> 5246 <4f3d> <4f3d> 3436 <4f43> <4f43> 6643 <4f46> <4f46> 4194 <4f47> <4f47> 6591 <4f48> <4f48> 7544 <4f4d> <4f4d> 6284 <4f4e> <4f4e> 6592 <4f4f> <4f4f> 6861 <4f50> <4f50> 6854 <4f51> <4f51> 6198 <4f55> <4f55> 7617 <4f59> <4f59> 5935 <4f5a> <4f5a> 6461 <4f5b> <4f5b> 5171 <4f5c> <4f5c> 6509 <4f69> <4f69> 7502 <4f6f> <4f6f> 5879 endcidrange 100 begincidrange <4f70> <4f70> 4989 <4f73> <4f73> 3437 <4f76> <4f76> 4127 <4f7a> <4f7a> 6644 <4f7e> <4f7e> 6462 <4f7f> <4f7f> 5247 <4f81> <4f81> 5736 <4f83> <4f83> 3476 <4f84> <4f84> 7015 <4f86> <4f86> 4420 <4f88> <4f88> 7336 <4f8a> <4f8a> 3839 <4f8b> <4f8b> 4506 <4f8d> <4f8d> 5692 <4f8f> <4f8f> 6862 <4f91> <4f91> 6310 <4f96> <4f96> 4594 <4f98> <4f98> 7042 <4f9b> <4f9b> 3786 <4f9d> <4f9d> 6394 <4fae> <4fae> 4764 <4faf> <4faf> 7966 <4fb5> <4fb5> 7367 <4fb6> <4fb6> 4440 <4fbf> <4fbf> 7518 <4fc2> <4fc2> 3705 <4fc3> <4fc3> 7241 <4fc4> <4fc4> 5776 <4fc9> <4fc9> 6051 <4fca> <4fca> 6902 <4fce> <4fce> 6782 <4fd1> <4fd1> 6174 <4fd3> <4fd3> 3661 <4fd4> <4fd4> 7734 <4fd7> <4fd7> 5537 <4fda> <4fda> 4613 <4fdd> <4fdd> 5058 <4fdf> <4fdf> 5248 <4fe0> <4fe0> 7759 <4fe1> <4fe1> 5737 <4fee> <4fee> 5567 <4fef> <4fef> 5111 <4ff1> <4ff1> 3897 <4ff3> <4ff3> 4970 <4ff5> <4ff5> 7576 <4ff8> <4ff8> 5093 <4ffa> <4ffa> 5925 <5002> <5002> 5042 <5006> <5006> 4428 <5009> <5009> 7092 <500b> <500b> 3562 <500d> <500d> 4969 <5011> <5011> 4836 <5012> <5012> 4269 <5016> <5016> 7705 <5019> <5019> 7967 <501a> <501a> 6395 <501c> <501c> 7134 <501e> <501e> 3662 <501f> <501f> 7043 <5021> <5021> 7093 <5023> <5023> 4941 <5024> <5024> 7337 <5026> <5026> 3969 <5027> <5027> 6837 <5028> <5028> 3585 <502a> <502a> 6030 <502b> <502b> 4595 <502c> <502c> 7394 <502d> <502d> 6131 <503b> <503b> 5863 <5043> <5043> 5917 <5047> <5047> 3438 <5048> <5048> 3627 <5049> <5049> 6285 <504f> <504f> 7519 <5055> <5055> 7686 <505a> <505a> 6863 <505c> <505c> 6707 <5065> <5065> 3603 <5074> <5074> 7330 <5075> <5075> 6708 <5076> <5076> 6199 <5078> <5078> 7465 <5080> <5080> 3856 <5085> <5085> 5112 <508d> <508d> 4942 <5091> <5091> 3614 <5098> <5098> 5303 <5099> <5099> 5182 <50ac> <50ac> 7262 <50ad> <50ad> 6175 <50b2> <50b2> 6052 <50b3> <50b3> 6645 <50b5> <50b5> 7114 <50b7> <50b7> 5332 <50be> <50be> 3663 <50c5> <50c5> 4023 <50c9> <50c9> 7177 <50ca> <50ca> 5419 endcidrange 100 begincidrange <50cf> <50cf> 5333 <50d1> <50d1> 3869 <50d5> <50d5> 5075 <50d6> <50d6> 8035 <50da> <50da> 4552 <50de> <50de> 6286 <50e5> <50e5> 6140 <50e7> <50e7> 5684 <50ed> <50ed> 7082 <50f9> <50f9> 3439 <50fb> <50fb> 5020 <50ff> <50ff> 5249 <5100> <5100> 6396 <5101> <5101> 6903 <5104> <5104> 5912 <5106> <5106> 3664 <5109> <5109> 3617 <5112> <5112> 6311 <511f> <511f> 5334 <5121> <5121> 4543 <512a> <512a> 6200 <5132> <5132> 6593 <5137> <5137> 4441 <513a> <513a> 4133 <513c> <513c> 5926 <5140> <5140> 6089 <5141> <5141> 6359 <5143> <5143> 6255 <5144> <5144> 7772 <5145> <5145> 7306 <5146> <5146> 6783 <5147> <5147> 8013 <5148> <5148> 5420 <5149> <5149> 3840 <514b> <514b> 4016 <514c> <514c> 7431 <514d> <514d> 4735 <514e> <514e> 7449 <5152> <5152> 5777 <515c> <515c> 4348 <5162> <5162> 4059 <5165> <5165> 6477 <5167> <5167> 4155 <5168> <5168> 6646 <5169> <5169> 4429 <516a> <516a> 6312 <516b> <516b> 7499 <516c> <516c> 3787 <516d> <516d> 4591 <516e> <516e> 7791 <5171> <5171> 3788 <5175> <5175> 5043 <5176> <5176> 4064 <5177> <5177> 3898 <5178> <5178> 6647 <517c> <517c> 3654 <5180> <5180> 4065 <5186> <5186> 5933 <518a> <518a> 7126 <518d> <518d> 6570 <5192> <5192> 4765 <5195> <5195> 4736 <5197> <5197> 6176 <51a0> <51a0> 3819 <51a5> <51a5> 4748 <51aa> <51aa> 4733 <51ac> <51ac> 4332 <51b6> <51b6> 5864 <51b7> <51b7> 4424 <51bd> <51bd> 4477 <51c4> <51c4> 7130 <51c6> <51c6> 6904 <51c9> <51c9> 4430 <51cb> <51cb> 6784 <51cc> <51cc> 4607 <51cd> <51cd> 4333 <51dc> <51dc> 4606 <51dd> <51dd> 6390 <51de> <51de> 8036 <51e1> <51e1> 5009 <51f0> <51f0> 7904 <51f1> <51f1> 3563 <51f6> <51f6> 8014 <51f8> <51f8> 7167 <51f9> <51f9> 6141 <51fa> <51fa> 7303 <51fd> <51fd> 7651 <5200> <5200> 4270 <5203> <5203> 6445 <5206> <5206> 5152 <5207> <5207> 6684 <5208> <5208> 6031 <520a> <520a> 3477 <520e> <520e> 4837 <5211> <5211> 7773 <5217> <5217> 4478 <521d> <521d> 7214 <5224> <5224> 7490 <5225> <5225> 5037 <5229> <5229> 4614 endcidrange 100 begincidrange <522a> <522a> 5304 <522e> <522e> 3835 <5230> <5230> 4271 <5236> <5236> 6759 <5237> <5237> 5561 <5238> <5238> 3970 <5239> <5239> 7077 <523a> <523a> 6484 <523b> <523b> 3465 <5243> <5243> 7205 <5247> <5247> 7360 <524a> <524a> 5301 <524b> <524b> 4017 <524c> <524c> 4397 <524d> <524d> 6648 <5254> <5254> 7135 <5256> <5256> 5113 <525b> <525b> 3536 <525d> <525d> 4886 <5261> <5261> 5463 <5269> <5269> 6480 <526a> <526a> 6649 <526f> <526f> 5114 <5272> <5272> 7649 <5275> <5275> 7094 <527d> <527d> 7577 <527f> <527f> 7215 <5283> <5283> 7948 <5287> <5287> 4018 <5288> <5288> 5021 <5289> <5289> 4577 <528d> <528d> 3618 <5291> <5291> 6760 <5292> <5292> 3619 <529b> <529b> 4458 <529f> <529f> 3789 <52a0> <52a0> 3440 <52a3> <52a3> 4479 <52a4> <52a4> 4024 <52a9> <52a9> 6785 <52aa> <52aa> 4169 <52ab> <52ab> 3624 <52be> <52be> 7703 <52c1> <52c1> 3665 <52c3> <52c3> 4930 <52c5> <52c5> 7361 <52c7> <52c7> 6177 <52c9> <52c9> 4737 <52cd> <52cd> 3666 <52d2> <52d2> 4604 <52d5> <52d5> 4334 <52d6> <52d6> 6229 <52d8> <52d8> 3510 <52d9> <52d9> 4812 <52db> <52db> 7979 <52dd> <52dd> 5685 <52de> <52de> 4511 <52df> <52df> 4766 <52e2> <52e2> 5493 <52e3> <52e3> 6619 <52e4> <52e4> 4025 <52f3> <52f3> 7980 <52f5> <52f5> 4442 <52f8> <52f8> 3971 <52fa> <52fa> 6510 <52fb> <52fb> 4009 <52fe> <52fe> 3899 <52ff> <52ff> 4848 <5305> <5305> 7545 <5308> <5308> 8015 <530d> <530d> 7546 <530f> <530f> 7547 <5310> <5310> 5076 <5315> <5315> 5183 <5316> <5316> 7863 <5317> <5317> 5151 <5319> <5319> 5693 <5320> <5320> 6536 <5321> <5321> 3841 <5323> <5323> 3530 <532a> <532a> 5184 <532f> <532f> 7928 <5339> <5339> 7604 <533f> <533f> 4188 <5340> <5340> 3900 <5341> <5341> 5772 <5343> <5343> 7149 <5344> <5344> 6478 <5347> <5347> 5686 <5348> <5348> 6053 <5349> <5349> 7994 <534a> <534a> 4906 <534d> <534d> 4671 <5351> <5351> 5185 <5352> <5352> 6834 <5353> <5353> 7395 <5354> <5354> 7760 <5357> <5357> 4145 <535a> <535a> 4887 <535c> <535c> 5077 endcidrange 100 begincidrange <535e> <535e> 5031 <5360> <5360> 6692 <5366> <5366> 3852 <5368> <5368> 5450 <536f> <536f> 4800 <5370> <5370> 6446 <5371> <5371> 6287 <5374> <5374> 3466 <5375> <5375> 4390 <5377> <5377> 3972 <537d> <537d> 6926 <537f> <537f> 3667 <5384> <5384> 5851 <5393> <5393> 5840 <5398> <5398> 4615 <539a> <539a> 7968 <539f> <539f> 6256 <53a0> <53a0> 7332 <53a5> <53a5> 3979 <53a6> <53a6> 7618 <53ad> <53ad> 5989 <53bb> <53bb> 3586 <53c3> <53c3> 7083 <53c8> <53c8> 6201 <53c9> <53c9> 7044 <53ca> <53ca> 4052 <53cb> <53cb> 6202 <53cd> <53cd> 4907 <53d4> <53d4> 5628 <53d6> <53d6> 7316 <53d7> <53d7> 5568 <53db> <53db> 4908 <53e1> <53e1> 6032 <53e2> <53e2> 7251 <53e3> <53e3> 3901 <53e4> <53e4> 3729 <53e5> <53e5> 3902 <53e9> <53e9> 3730 <53ea> <53ea> 6943 <53eb> <53eb> 3994 <53ec> <53ec> 5500 <53ed> <53ed> 7500 <53ef> <53ef> 3441 <53f0> <53f0> 7432 <53f1> <53f1> 7016 <53f2> <53f2> 5250 <53f3> <53f3> 6203 <53f8> <53f8> 5251 <5403> <5403> 8023 <5404> <5404> 3467 <5408> <5408> 7663 <5409> <5409> 4128 <540a> <540a> 6620 <540c> <540c> 4335 <540d> <540d> 4749 <540e> <540e> 7969 <540f> <540f> 4616 <5410> <5410> 7450 <5411> <5411> 7711 <541b> <541b> 3953 <541d> <541d> 4638 <541f> <541f> 6381 <5420> <5420> 7534 <5426> <5426> 5115 <5429> <5429> 5153 <542b> <542b> 7652 <5433> <5433> 6055 <5438> <5438> 8030 <5439> <5439> 7317 <543b> <543b> 4838 <543c> <543c> 7970 <543e> <543e> 6054 <5442> <5442> 4443 <5448> <5448> 6709 <544a> <544a> 3731 <5451> <5451> 7408 <5468> <5468> 6867 <546a> <546a> 6866 <5471> <5471> 3732 <5473> <5473> 4851 <5475> <5475> 3442 <547b> <547b> 5738 <547c> <547c> 7802 <547d> <547d> 4750 <5480> <5480> 6594 <5486> <5486> 7548 <548c> <548c> 7864 <548e> <548e> 3903 <5490> <5490> 5116 <54a4> <54a4> 7381 <54a8> <54a8> 6485 <54ab> <54ab> 6944 <54ac> <54ac> 3870 <54b3> <54b3> 7687 <54b8> <54b8> 7653 <54bd> <54bd> 6447 <54c0> <54c0> 5841 <54c1> <54c1> 7590 <54c4> <54c4> 7853 <54c8> <54c8> 7664 endcidrange 100 begincidrange <54c9> <54c9> 6571 <54e1> <54e1> 6257 <54e5> <54e5> 3443 <54e8> <54e8> 7216 <54ed> <54ed> 3767 <54ee> <54ee> 7953 <54f2> <54f2> 7168 <54fa> <54fa> 7549 <5504> <5504> 7503 <5506> <5506> 5252 <5507> <5507> 6980 <550e> <550e> 4617 <5510> <5510> 4239 <551c> <551c> 4689 <552f> <552f> 6313 <5531> <5531> 7095 <5535> <5535> 5821 <553e> <553e> 7382 <5544> <5544> 7396 <5546> <5546> 5335 <554f> <554f> 4839 <5553> <5553> 3706 <5556> <5556> 4217 <555e> <555e> 5778 <5563> <5563> 7654 <557c> <557c> 6761 <5580> <5580> 3579 <5584> <5584> 5421 <5586> <5586> 7169 <5587> <5587> 4374 <5589> <5589> 7971 <558a> <558a> 7655 <5598> <5598> 7150 <5599> <5599> 7995 <559a> <559a> 7883 <559c> <559c> 8037 <559d> <559d> 3501 <55a7> <55a7> 7990 <55a9> <55a9> 6314 <55aa> <55aa> 5336 <55ab> <55ab> 4132 <55ac> <55ac> 3871 <55ae> <55ae> 4195 <55c5> <55c5> 7972 <55c7> <55c7> 5365 <55d4> <55d4> 6981 <55da> <55da> 6056 <55dc> <55dc> 4066 <55df> <55df> 7045 <55e3> <55e3> 5253 <55e4> <55e4> 7338 <55fd> <55fd> 5569 <55fe> <55fe> 6868 <5606> <5606> 7409 <5609> <5609> 3444 <5614> <5614> 3904 <5617> <5617> 5337 <562f> <562f> 5501 <5632> <5632> 6786 <5634> <5634> 7318 <5636> <5636> 5694 <5653> <5653> 7719 <5668> <5668> 4067 <566b> <566b> 8038 <5674> <5674> 5154 <5686> <5686> 7954 <56a5> <56a5> 5956 <56ac> <56ac> 5223 <56ae> <56ae> 7712 <56b4> <56b4> 5927 <56bc> <56bc> 6511 <56ca> <56ca> 4152 <56cd> <56cd> 8039 <56d1> <56d1> 7242 <56da> <56da> 5570 <56db> <56db> 5254 <56de> <56de> 7929 <56e0> <56e0> 6448 <56f0> <56f0> 3774 <56f9> <56f9> 4491 <56fa> <56fa> 3733 <5703> <5703> 7550 <5704> <5704> 5902 <5708> <5708> 3973 <570b> <570b> 3947 <570d> <570d> 6288 <5712> <5712> 6259 <5713> <5713> 6258 <5716> <5716> 4272 <5718> <5718> 4196 <571f> <571f> 7451 <5728> <5728> 6572 <572d> <572d> 3995 <5730> <5730> 6945 <573b> <573b> 4068 <5740> <5740> 6946 <5742> <5742> 7491 <5747> <5747> 4010 <574a> <574a> 4943 <574d> <574d> 4218 endcidrange 100 begincidrange <574e> <574e> 3511 <5750> <5750> 6855 <5751> <5751> 3581 <5761> <5761> 7474 <5764> <5764> 3775 <5766> <5766> 7410 <576a> <576a> 7529 <576e> <576e> 4252 <5770> <5770> 3668 <5775> <5775> 3905 <577c> <577c> 7397 <5782> <5782> 5571 <5788> <5788> 4251 <578b> <578b> 7774 <5793> <5793> 7688 <57a0> <57a0> 6373 <57a2> <57a2> 3906 <57a3> <57a3> 6260 <57c3> <57c3> 5842 <57c7> <57c7> 6178 <57c8> <57c8> 6905 <57cb> <57cb> 4708 <57ce> <57ce> 5474 <57df> <57df> 5948 <57e0> <57e0> 5117 <57f0> <57f0> 7115 <57f4> <57f4> 5720 <57f7> <57f7> 7032 <57f9> <57f9> 4971 <57fa> <57fa> 4069 <57fc> <57fc> 4070 <5800> <5800> 3959 <5802> <5802> 4240 <5805> <5805> 3637 <5806> <5806> 7459 <5808> <5808> 3537 <5809> <5809> 6355 <580a> <580a> 5793 <581e> <581e> 7187 <5821> <5821> 5059 <5824> <5824> 6762 <5827> <5827> 5957 <582a> <582a> 3512 <582f> <582f> 6142 <5830> <5830> 5918 <5831> <5831> 5060 <5834> <5834> 6537 <5835> <5835> 4273 <583a> <583a> 3707 <584a> <584a> 3857 <584b> <584b> 6002 <584f> <584f> 3564 <5851> <5851> 5502 <5854> <5854> 7424 <5857> <5857> 4274 <5858> <5858> 4241 <585a> <585a> 7252 <585e> <585e> 5362 <5861> <5861> 6650 <5862> <5862> 6057 <5864> <5864> 7981 <5875> <5875> 6982 <5879> <5879> 7084 <587c> <587c> 6651 <587e> <587e> 5629 <5883> <5883> 3669 <5885> <5885> 5373 <5889> <5889> 6179 <5893> <5893> 4801 <589c> <589c> 7265 <589e> <589e> 6931 <589f> <589f> 7720 <58a8> <58a8> 4834 <58a9> <58a9> 4319 <58ae> <58ae> 7383 <58b3> <58b3> 5155 <58ba> <58ba> 6058 <58bb> <58bb> 6538 <58be> <58be> 3478 <58c1> <58c1> 5022 <58c5> <58c5> 6090 <58c7> <58c7> 4197 <58ce> <58ce> 7982 <58d1> <58d1> 7630 <58d3> <58d3> 5829 <58d5> <58d5> 7803 <58d8> <58d8> 4564 <58d9> <58d9> 3842 <58de> <58de> 3858 <58df> <58df> 4536 <58e4> <58e4> 5880 <58eb> <58eb> 5255 <58ec> <58ec> 6470 <58ef> <58ef> 6539 <58f9> <58f9> 6463 <58fa> <58fa> 7804 <58fb> <58fb> 5374 <58fd> <58fd> 5572 <590f> <590f> 7619 <5914> <5914> 4071 endcidrange 100 begincidrange <5915> <5915> 5403 <5916> <5916> 6135 <5919> <5919> 5630 <591a> <591a> 4190 <591c> <591c> 5865 <5922> <5922> 4797 <5927> <5927> 4253 <5929> <5929> 7151 <592a> <592a> 7433 <592b> <592b> 5118 <592d> <592d> 6143 <592e> <592e> 5834 <5931> <5931> 5758 <5937> <5937> 6416 <593e> <593e> 7761 <5944> <5944> 5928 <5947> <5947> 4072 <5948> <5948> 4156 <5949> <5949> 5094 <594e> <594e> 3996 <594f> <594f> 6869 <5950> <5950> 7884 <5951> <5951> 3708 <5954> <5954> 5156 <5955> <5955> 7730 <5957> <5957> 7466 <595a> <595a> 7689 <5960> <5960> 6652 <5962> <5962> 5256 <5967> <5967> 6059 <596a> <596a> 7418 <596b> <596b> 6360 <596c> <596c> 6540 <596d> <596d> 5404 <596e> <596e> 5157 <5973> <5973> 4159 <5974> <5974> 4170 <5978> <5978> 3479 <597d> <597d> 7805 <5982> <5982> 5936 <5983> <5983> 5186 <5984> <5984> 4697 <598a> <598a> 6471 <5993> <5993> 4073 <5996> <5996> 6144 <5997> <5997> 4039 <5999> <5999> 4802 <59a5> <59a5> 7384 <59a8> <59a8> 4944 <59ac> <59ac> 7467 <59b9> <59b9> 4709 <59bb> <59bb> 7131 <59be> <59be> 7188 <59c3> <59c3> 6710 <59c6> <59c6> 4767 <59c9> <59c9> 6486 <59cb> <59cb> 5695 <59d0> <59d0> 6595 <59d1> <59d1> 3734 <59d3> <59d3> 5475 <59d4> <59d4> 6289 <59d9> <59d9> 6472 <59da> <59da> 6145 <59dc> <59dc> 3538 <59dd> <59dd> 6864 <59e6> <59e6> 3480 <59e8> <59e8> 6417 <59ea> <59ea> 7017 <59ec> <59ec> 8040 <59ee> <59ee> 7672 <59f8> <59f8> 5958 <59fb> <59fb> 6449 <59ff> <59ff> 6487 <5a01> <5a01> 6290 <5a03> <5a03> 6132 <5a11> <5a11> 5257 <5a18> <5a18> 4153 <5a1b> <5a1b> 6060 <5a1c> <5a1c> 4134 <5a1f> <5a1f> 5959 <5a20> <5a20> 5739 <5a25> <5a25> 5779 <5a29> <5a29> 4672 <5a36> <5a36> 7319 <5a3c> <5a3c> 7096 <5a41> <5a41> 4565 <5a46> <5a46> 7475 <5a49> <5a49> 6107 <5a5a> <5a5a> 7844 <5a62> <5a62> 5187 <5a66> <5a66> 5119 <5a92> <5a92> 4710 <5a9a> <5a9a> 4852 <5a9b> <5a9b> 6261 <5aa4> <5aa4> 5696 <5ac1> <5ac1> 3445 <5ac2> <5ac2> 5573 <5ac4> <5ac4> 6262 <5ac9> <5ac9> 7018 <5acc> <5acc> 7758 endcidrange 100 begincidrange <5ae1> <5ae1> 6621 <5ae6> <5ae6> 7673 <5ae9> <5ae9> 4181 <5b05> <5b05> 7865 <5b09> <5b09> 8041 <5b0b> <5b0b> 5422 <5b0c> <5b0c> 3872 <5b16> <5b16> 7535 <5b2a> <5b2a> 5224 <5b40> <5b40> 5338 <5b43> <5b43> 5881 <5b50> <5b50> 6488 <5b51> <5b51> 7754 <5b54> <5b54> 3790 <5b55> <5b55> 6481 <5b57> <5b57> 6489 <5b58> <5b58> 6832 <5b5a> <5b5a> 5120 <5b5c> <5b5c> 6490 <5b5d> <5b5d> 7955 <5b5f> <5b5f> 4727 <5b63> <5b63> 3709 <5b64> <5b64> 3735 <5b69> <5b69> 7690 <5b6b> <5b6b> 5546 <5b70> <5b70> 5631 <5b71> <5b71> 6522 <5b75> <5b75> 5121 <5b78> <5b78> 7631 <5b7a> <5b7a> 6315 <5b7c> <5b7c> 5923 <5b85> <5b85> 4266 <5b87> <5b87> 6204 <5b88> <5b88> 5574 <5b89> <5b89> 5807 <5b8b> <5b8b> 5553 <5b8c> <5b8c> 6108 <5b8f> <5b8f> 3864 <5b93> <5b93> 5078 <5b95> <5b95> 7427 <5b96> <5b96> 7950 <5b97> <5b97> 6838 <5b98> <5b98> 3820 <5b99> <5b99> 6870 <5b9a> <5b9a> 6711 <5b9b> <5b9b> 6109 <5b9c> <5b9c> 6397 <5ba2> <5ba2> 3580 <5ba3> <5ba3> 5423 <5ba4> <5ba4> 5759 <5ba5> <5ba5> 6316 <5ba6> <5ba6> 7885 <5bac> <5bac> 5476 <5bae> <5bae> 3963 <5bb0> <5bb0> 6573 <5bb3> <5bb3> 7691 <5bb4> <5bb4> 5960 <5bb5> <5bb5> 5503 <5bb6> <5bb6> 3446 <5bb8> <5bb8> 5740 <5bb9> <5bb9> 6180 <5bbf> <5bbf> 5632 <5bc0> <5bc0> 7116 <5bc2> <5bc2> 6622 <5bc3> <5bc3> 6263 <5bc4> <5bc4> 4074 <5bc5> <5bc5> 6450 <5bc6> <5bc6> 4883 <5bc7> <5bc7> 3907 <5bcc> <5bcc> 5122 <5bd0> <5bd0> 4711 <5bd2> <5bd2> 7635 <5bd3> <5bd3> 6205 <5bd4> <5bd4> 5721 <5bd7> <5bd7> 4168 <5bde> <5bde> 4664 <5bdf> <5bdf> 7078 <5be1> <5be1> 3803 <5be2> <5be2> 7368 <5be4> <5be4> 6061 <5be5> <5be5> 6146 <5be6> <5be6> 5760 <5be7> <5be7> 4167 <5be8> <5be8> 7117 <5be9> <5be9> 5762 <5beb> <5beb> 5258 <5bec> <5bec> 3821 <5bee> <5bee> 4553 <5bef> <5bef> 6906 <5bf5> <5bf5> 7253 <5bf6> <5bf6> 5061 <5bf8> <5bf8> 7247 <5bfa> <5bfa> 5259 <5c01> <5c01> 5095 <5c04> <5c04> 5260 <5c07> <5c07> 6541 <5c08> <5c08> 6653 <5c09> <5c09> 6291 <5c0a> <5c0a> 6833 <5c0b> <5c0b> 5763 endcidrange 100 begincidrange <5c0d> <5c0d> 4254 <5c0e> <5c0e> 4275 <5c0f> <5c0f> 5504 <5c11> <5c11> 5505 <5c16> <5c16> 7178 <5c19> <5c19> 5339 <5c24> <5c24> 6206 <5c28> <5c28> 4945 <5c31> <5c31> 7320 <5c38> <5c38> 5697 <5c39> <5c39> 6361 <5c3a> <5c3a> 7136 <5c3b> <5c3b> 3736 <5c3c> <5c3c> 4186 <5c3e> <5c3e> 4853 <5c3f> <5c3f> 4180 <5c40> <5c40> 3948 <5c45> <5c45> 3587 <5c46> <5c46> 3710 <5c48> <5c48> 3960 <5c4b> <5c4b> 6078 <5c4d> <5c4d> 5699 <5c4e> <5c4e> 5698 <5c51> <5c51> 5451 <5c55> <5c55> 6654 <5c5b> <5c5b> 5044 <5c60> <5c60> 4276 <5c62> <5c62> 4566 <5c64> <5c64> 7335 <5c65> <5c65> 4618 <5c6c> <5c6c> 5538 <5c6f> <5c6f> 4358 <5c71> <5c71> 5305 <5c79> <5c79> 8024 <5c90> <5c90> 4075 <5c91> <5c91> 6527 <5ca1> <5ca1> 3539 <5ca9> <5ca9> 5822 <5cab> <5cab> 5575 <5cac> <5cac> 3531 <5cb1> <5cb1> 4255 <5cb3> <5cb3> 5794 <5cb5> <5cb5> 7806 <5cb7> <5cb7> 4870 <5cb8> <5cb8> 5808 <5cba> <5cba> 4492 <5cbe> <5cbe> 6693 <5cc0> <5cc0> 5576 <5cd9> <5cd9> 7339 <5ce0> <5ce0> 5340 <5ce8> <5ce8> 5780 <5cef> <5cf0> 5096 <5cf4> <5cf4> 7735 <5cf6> <5cf6> 4277 <5cfb> <5cfb> 6907 <5cfd> <5cfd> 7762 <5d07> <5d07> 5671 <5d0d> <5d0d> 4421 <5d0e> <5d0e> 4076 <5d11> <5d11> 3776 <5d14> <5d14> 7263 <5d16> <5d16> 5843 <5d17> <5d17> 3540 <5d19> <5d19> 4596 <5d27> <5d27> 5672 <5d29> <5d29> 5175 <5d4b> <5d4b> 4854 <5d4c> <5d4c> 3513 <5d50> <5d50> 4399 <5d69> <5d69> 5673 <5d6c> <5d6c> 6136 <5d6f> <5d6f> 7046 <5d87> <5d87> 3908 <5d8b> <5d8b> 4278 <5d9d> <5d9d> 4365 <5da0> <5da0> 3873 <5da2> <5da2> 6147 <5daa> <5daa> 5931 <5db8> <5db8> 6003 <5dba> <5dba> 4493 <5dbc> <5dbc> 5375 <5dbd> <5dbd> 5795 <5dcd> <5dcd> 6137 <5dd2> <5dd2> 4673 <5dd6> <5dd6> 5823 <5ddd> <5ddd> 7152 <5dde> <5dde> 6871 <5de1> <5de1> 5640 <5de2> <5de2> 5506 <5de5> <5de5> 3791 <5de6> <5de6> 6856 <5de7> <5de7> 3874 <5de8> <5de8> 3588 <5deb> <5deb> 4813 <5dee> <5dee> 7047 <5df1> <5df1> 4077 <5df2> <5df2> 6418 <5df3> <5df3> 5261 <5df4> <5df4> 7476 <5df7> <5df7> 7674 endcidrange 100 begincidrange <5dfd> <5dfd> 5547 <5dfe> <5dfe> 3604 <5e02> <5e02> 5700 <5e03> <5e03> 7551 <5e06> <5e06> 5010 <5e0c> <5e0c> 8042 <5e11> <5e11> 7428 <5e16> <5e16> 7189 <5e19> <5e19> 7019 <5e1b> <5e1b> 4990 <5e1d> <5e1d> 6763 <5e25> <5e25> 5577 <5e2b> <5e2b> 5262 <5e2d> <5e2d> 5405 <5e33> <5e33> 6542 <5e36> <5e36> 4256 <5e38> <5e38> 5341 <5e3d> <5e3d> 4768 <5e3f> <5e3f> 7973 <5e40> <5e40> 6712 <5e44> <5e44> 5796 <5e45> <5e45> 7571 <5e47> <5e47> 4946 <5e4c> <5e4c> 7905 <5e55> <5e55> 4665 <5e5f> <5e5f> 7340 <5e61> <5e61> 4996 <5e62> <5e62> 4242 <5e63> <5e63> 7536 <5e72> <5e72> 3481 <5e73> <5e73> 7530 <5e74> <5e74> 4160 <5e77> <5e77> 5045 <5e78> <5e78> 7706 <5e79> <5e79> 3482 <5e7b> <5e7b> 7886 <5e7c> <5e7d> 6317 <5e7e> <5e7e> 4078 <5e84> <5e84> 6543 <5e87> <5e87> 5188 <5e8a> <5e8a> 5342 <5e8f> <5e8f> 5376 <5e95> <5e95> 6596 <5e97> <5e97> 6694 <5e9a> <5e9a> 3670 <5e9c> <5e9c> 5123 <5ea0> <5ea0> 5343 <5ea6> <5ea6> 4279 <5ea7> <5ea7> 6857 <5eab> <5eab> 3737 <5ead> <5ead> 6713 <5eb5> <5eb5> 5824 <5eb6> <5eb6> 5377 <5eb7> <5eb7> 3541 <5eb8> <5eb8> 6181 <5ebe> <5ebe> 6319 <5ec2> <5ec2> 5344 <5ec8> <5ec8> 7620 <5ec9> <5ec9> 4483 <5eca> <5eca> 4412 <5ed0> <5ed0> 3909 <5ed3> <5ed3> 3815 <5ed6> <5ed6> 4554 <5eda> <5eda> 6872 <5edb> <5edb> 6655 <5edf> <5edf> 4803 <5ee0> <5ee0> 7097 <5ee2> <5ee2> 7537 <5ee3> <5ee3> 3843 <5eec> <5eec> 4444 <5ef3> <5ef3> 7197 <5ef6> <5ef6> 5961 <5ef7> <5ef7> 6714 <5efa> <5efa> 3605 <5efb> <5efb> 7930 <5f01> <5f01> 5032 <5f04> <5f04> 4537 <5f0a> <5f0a> 7538 <5f0f> <5f0f> 5722 <5f11> <5f11> 5701 <5f13> <5f13> 3964 <5f14> <5f14> 6787 <5f15> <5f15> 6451 <5f17> <5f17> 5172 <5f18> <5f18> 7854 <5f1b> <5f1b> 6419 <5f1f> <5f1f> 6764 <5f26> <5f26> 7736 <5f27> <5f27> 7807 <5f29> <5f29> 4171 <5f31> <5f31> 5872 <5f35> <5f35> 6544 <5f3a> <5f3a> 3542 <5f3c> <5f3c> 7605 <5f48> <5f48> 7411 <5f4a> <5f4a> 3543 <5f4c> <5f4c> 4855 <5f4e> <5f4e> 4674 <5f56> <5f56> 4198 <5f57> <5f57> 7792 endcidrange 100 begincidrange <5f59> <5f59> 7997 <5f5b> <5f5b> 6420 <5f62> <5f62> 7775 <5f66> <5f66> 5919 <5f67> <5f67> 6230 <5f69> <5f69> 7118 <5f6a> <5f6a> 7578 <5f6b> <5f6b> 6788 <5f6c> <5f6c> 5225 <5f6d> <5f6d> 7513 <5f70> <5f70> 7098 <5f71> <5f71> 6004 <5f77> <5f77> 4947 <5f79> <5f79> 5949 <5f7c> <5f7c> 7597 <5f7f> <5f7f> 5173 <5f80> <5f80> 6126 <5f81> <5f81> 6715 <5f85> <5f85> 4257 <5f87> <5f87> 5641 <5f8a> <5f8a> 7931 <5f8b> <5f8b> 4600 <5f8c> <5f8c> 7974 <5f90> <5f90> 5378 <5f91> <5f91> 3671 <5f92> <5f92> 4280 <5f97> <5f97> 4364 <5f98> <5f98> 4972 <5f99> <5f99> 5263 <5f9e> <5f9e> 6839 <5fa0> <5fa0> 4422 <5fa1> <5fa1> 5903 <5fa8> <5fa8> 7906 <5fa9> <5fa9> 5079 <5faa> <5faa> 5642 <5fae> <5fae> 4856 <5fb5> <5fb5> 7038 <5fb7> <5fb7> 4267 <5fb9> <5fb9> 7170 <5fbd> <5fbd> 7998 <5fc3> <5fc3> 5764 <5fc5> <5fc5> 7606 <5fcc> <5fcc> 4079 <5fcd> <5fcd> 6452 <5fd6> <5fd6> 7248 <5fd7> <5fd7> 6947 <5fd8> <5fd9> 4698 <5fe0> <5fe0> 7307 <5feb> <5feb> 7379 <5ff5> <5ff5> 4163 <5ffd> <5ffd> 7850 <5fff> <5fff> 5158 <600f> <600f> 5835 <6012> <6012> 4172 <6016> <6016> 7552 <601c> <601c> 4494 <601d> <601d> 5264 <6020> <6020> 7434 <6021> <6021> 6421 <6025> <6025> 4053 <6027> <6027> 5477 <6028> <6028> 6264 <602a> <602a> 3859 <602f> <602f> 3625 <6041> <6041> 6473 <6042> <6042> 5643 <6043> <6043> 5702 <604d> <604d> 7907 <6050> <6050> 3792 <6052> <6052> 7675 <6055> <6055> 5379 <6059> <6059> 5882 <605d> <605d> 3836 <6062> <6062> 7932 <6063> <6063> 6491 <6064> <6064> 8010 <6065> <6065> 7341 <6068> <6068> 7636 <6069> <6069> 6374 <606a> <606a> 3468 <606c> <606c> 4164 <606d> <606d> 3793 <606f> <606f> 5723 <6070> <6070> 8031 <6085> <6085> 5985 <6089> <6089> 5761 <608c> <608c> 6765 <608d> <608d> 7637 <6094> <6094> 7933 <6096> <6096> 7504 <609a> <609a> 5554 <609b> <609b> 6656 <609f> <609f> 6062 <60a0> <60a0> 6320 <60a3> <60a3> 7887 <60a4> <60a4> 7254 <60a7> <60a7> 4619 <60b0> <60b0> 6840 <60b2> <60b2> 5189 <60b3> <60b3> 4268 endcidrange 100 begincidrange <60b4> <60b4> 7312 <60b6> <60b6> 4871 <60b8> <60b8> 3711 <60bc> <60bc> 4281 <60bd> <60bd> 7132 <60c5> <60c5> 6716 <60c7> <60c7> 4320 <60d1> <60d1> 7841 <60da> <60da> 7851 <60dc> <60dc> 5406 <60df> <60df> 6321 <60e0> <60e0> 7793 <60e1> <60e1> 5797 <60f0> <60f0> 7385 <60f1> <60f1> 4178 <60f3> <60f3> 5345 <60f6> <60f6> 7908 <60f9> <60f9> 5866 <60fa> <60fa> 5478 <60fb> <60fb> 7333 <6101> <6101> 5578 <6106> <6106> 3606 <6108> <6109> 6322 <610d> <610d> 4872 <610e> <610e> 7517 <610f> <610f> 6398 <6115> <6115> 5798 <611a> <611a> 6207 <611b> <611b> 5844 <611f> <611f> 3514 <6127> <6127> 3860 <6130> <6130> 7909 <6134> <6134> 7099 <6137> <6137> 3565 <613c> <613c> 5741 <613e> <613e> 3566 <613f> <613f> 6265 <6142> <6142> 6182 <6144> <6144> 4601 <6147> <6147> 6375 <6148> <6148> 6492 <614a> <614a> 3655 <614b> <614b> 7435 <614c> <614c> 7910 <6153> <6153> 7579 <6155> <6155> 4769 <6158> <6159> 7085 <615d> <615d> 7471 <615f> <615f> 7453 <6162> <6162> 4675 <6163> <6163> 3822 <6164> <6164> 3469 <6167> <6167> 7794 <6168> <6168> 3567 <616b> <616b> 6841 <616e> <616e> 4445 <6170> <6170> 6292 <6176> <6176> 3672 <6177> <6177> 3544 <617d> <617d> 7137 <617e> <617e> 6168 <6181> <6181> 7255 <6182> <6182> 6208 <618a> <618a> 5190 <618e> <618e> 6932 <6190> <6190> 4465 <6191> <6191> 5237 <6194> <6194> 7217 <6198> <6198> 8044 <6199> <6199> 8043 <619a> <619a> 7412 <61a4> <61a4> 5159 <61a7> <61a7> 4336 <61a9> <61a9> 3628 <61ab> <61ab> 4873 <61ac> <61ac> 3673 <61ae> <61ae> 4814 <61b2> <61b2> 7723 <61b6> <61b6> 5913 <61ba> <61ba> 4219 <61be> <61be> 3515 <61c3> <61c3> 4026 <61c7> <61c7> 3483 <61c8> <61c8> 7692 <61c9> <61c9> 6391 <61ca> <61ca> 6063 <61cb> <61cb> 4815 <61e6> <61e6> 4135 <61f2> <61f2> 7039 <61f6> <61f6> 4375 <61f7> <61f7> 7934 <61f8> <61f8> 7737 <61fa> <61fa> 7087 <61fc> <61fc> 3910 <61ff> <61ff> 6399 <6200> <6200> 4466 <6207> <6207> 4243 <6208> <6208> 3804 <620a> <620a> 4816 <620c> <620c> 5667 endcidrange 100 begincidrange <620d> <620d> 5579 <620e> <620e> 6369 <6210> <6210> 5479 <6211> <6211> 5781 <6212> <6212> 3712 <6216> <6216> 7842 <621a> <621a> 7138 <621f> <621f> 4019 <6221> <6221> 3516 <622a> <622a> 6685 <622e> <622e> 4592 <6230> <6230> 6657 <6231> <6231> 8045 <6234> <6234> 4258 <6236> <6236> 7808 <623e> <623e> 4446 <623f> <623f> 4948 <6240> <6240> 5507 <6241> <6241> 7520 <6247> <6247> 5424 <6248> <6248> 7809 <6249> <6249> 5191 <624b> <624b> 5580 <624d> <624d> 6574 <6253> <6253> 7386 <6258> <6258> 7398 <626e> <626e> 5160 <6271> <6271> 4054 <6276> <6276> 5124 <6279> <6279> 5192 <627c> <627c> 5852 <627f> <627f> 5687 <6280> <6280> 4080 <6284> <6284> 7218 <6289> <6289> 3648 <628a> <628a> 7477 <6291> <6291> 5914 <6292> <6292> 5380 <6295> <6295> 7468 <6297> <6297> 7676 <6298> <6298> 6686 <629b> <629b> 7553 <62ab> <62ab> 7598 <62b1> <62b1> 7554 <62b5> <62b5> 6597 <62b9> <62b9> 4690 <62bc> <62bc> 5830 <62bd> <62bd> 7266 <62c2> <62c2> 5174 <62c7> <62c7> 4817 <62c8> <62c8> 4165 <62c9> <62c9> 4409 <62cc> <62cc> 4909 <62cd> <62cd> 4888 <62cf> <62cf> 4136 <62d0> <62d0> 3861 <62d2> <62d2> 3589 <62d3> <62d3> 7139 <62d4> <62d4> 4931 <62d6> <62d6> 7387 <62d7> <62d7> 6148 <62d8> <62d8> 3911 <62d9> <62d9> 6835 <62db> <62db> 7219 <62dc> <62dc> 4973 <62ec> <62ec> 3837 <62ed> <62ed> 5724 <62ee> <62ee> 4129 <62ef> <62ef> 6934 <62f1> <62f1> 3794 <62f3> <62f3> 3974 <62f7> <62f7> 3738 <62fe> <62fe> 5678 <62ff> <62ff> 4137 <6301> <6301> 6948 <6307> <6307> 6949 <6309> <6309> 5809 <6311> <6311> 4282 <632b> <632b> 6858 <632f> <632f> 6983 <633a> <633a> 6717 <633b> <633b> 5963 <633d> <633d> 4676 <633e> <633e> 7763 <6349> <6349> 7055 <634c> <634c> 7501 <634f> <634f> 4143 <6350> <6350> 5962 <6355> <6355> 7555 <6367> <6367> 5098 <6368> <6368> 5265 <636e> <636e> 3590 <6372> <6372> 3975 <6377> <6377> 7190 <637a> <637a> 4144 <637b> <637b> 4166 <637f> <637f> 5381 <6383> <6383> 5508 <6388> <6388> 5581 <6389> <6389> 4283 endcidrange 100 begincidrange <638c> <638c> 6545 <6392> <6392> 4974 <6396> <6396> 5853 <6398> <6398> 3961 <639b> <639b> 3853 <63a0> <63a0> 4425 <63a1> <63a1> 7119 <63a2> <63a2> 7420 <63a5> <63a5> 6701 <63a7> <63a7> 3795 <63a8> <63a8> 7267 <63a9> <63a9> 5929 <63aa> <63aa> 6789 <63c0> <63c0> 3484 <63c4> <63c4> 6324 <63c6> <63c6> 3997 <63cf> <63cf> 4804 <63d0> <63d0> 6766 <63d6> <63d6> 6387 <63da> <63da> 5883 <63db> <63db> 7888 <63e1> <63e1> 5799 <63ed> <63ed> 3629 <63ee> <63ee> 7999 <63f4> <63f4> 6266 <63f6> <63f6> 5867 <63f7> <63f7> 5327 <640d> <640d> 5548 <640f> <640f> 4889 <6414> <6414> 5509 <6416> <6416> 6149 <6417> <6417> 4284 <641c> <641c> 5582 <6422> <6422> 6984 <642c> <642c> 4910 <642d> <642d> 7425 <643a> <643a> 8006 <643e> <643e> 7056 <6458> <6458> 6623 <6460> <6460> 7256 <6469> <6469> 4656 <646f> <646f> 6950 <6478> <6479> 4770 <647a> <647a> 6702 <6488> <6488> 4512 <6491> <6491> 7447 <6492> <6492> 5316 <6493> <6493> 6150 <649a> <649a> 4161 <649e> <649e> 4244 <64a4> <64a4> 7171 <64a5> <64a5> 4932 <64ab> <64ab> 4818 <64ad> <64ad> 7478 <64ae> <64ae> 7261 <64b0> <64b0> 7062 <64b2> <64b2> 4890 <64bb> <64bb> 4212 <64c1> <64c1> 6091 <64c4> <64c4> 4513 <64c5> <64c5> 7153 <64c7> <64c7> 7445 <64ca> <64ca> 3630 <64cd> <64cd> 6790 <64ce> <64ce> 3674 <64d2> <64d2> 4040 <64d4> <64d4> 4220 <64d8> <64d8> 5023 <64da> <64da> 3591 <64e1> <64e1> 4259 <64e2> <64e2> 7399 <64e5> <64e5> 4400 <64e6> <64e6> 7079 <64e7> <64e7> 3592 <64ec> <64ec> 6400 <64f2> <64f2> 7140 <64f4> <64f4> 7877 <64fa> <64fa> 7479 <64fe> <64fe> 6151 <6500> <6500> 4911 <6504> <6504> 7448 <6518> <6518> 5884 <651d> <651d> 5471 <6523> <6523> 4467 <652a> <652a> 3875 <652b> <652b> 7878 <652c> <652c> 4401 <652f> <652f> 6951 <6536> <6536> 5583 <6537> <6537> 3739 <6538> <6538> 6325 <6539> <6539> 3568 <653b> <653b> 3796 <653e> <653e> 4949 <653f> <653f> 6718 <6545> <6545> 3740 <6548> <6548> 7956 <654d> <654d> 5382 <654e> <654e> 3876 <654f> <654f> 4874 endcidrange 100 begincidrange <6551> <6551> 3912 <6556> <6556> 6064 <6557> <6557> 7505 <655e> <655e> 7100 <6562> <6562> 3517 <6563> <6563> 5306 <6566> <6566> 4321 <656c> <656c> 3675 <656d> <656d> 5885 <6572> <6572> 3741 <6574> <6574> 6719 <6575> <6575> 6624 <6577> <6577> 5125 <6578> <6578> 5584 <657e> <657e> 5425 <6582> <6582> 4484 <6583> <6583> 7539 <6585> <6585> 7957 <6587> <6587> 4840 <658c> <658c> 5226 <6590> <6590> 5193 <6591> <6591> 4912 <6597> <6597> 4349 <6599> <6599> 4555 <659b> <659b> 3768 <659c> <659c> 5266 <659f> <659f> 7030 <65a1> <65a1> 5817 <65a4> <65a4> 4027 <65a5> <65a5> 7141 <65a7> <65a7> 5126 <65ab> <65ab> 6512 <65ac> <65ac> 7088 <65af> <65af> 5267 <65b0> <65b0> 5742 <65b7> <65b7> 4199 <65b9> <65b9> 4950 <65bc> <65bc> 5904 <65bd> <65bd> 5703 <65c1> <65c1> 4951 <65c5> <65c5> 4447 <65cb> <65cb> 5426 <65cc> <65cc> 6720 <65cf> <65cf> 6828 <65d2> <65d2> 4578 <65d7> <65d7> 4081 <65e0> <65e0> 4819 <65e3> <65e3> 4082 <65e5> <65e5> 6464 <65e6> <65e6> 4200 <65e8> <65e8> 6952 <65e9> <65e9> 6791 <65ec> <65ec> 5644 <65ed> <65ed> 6231 <65f1> <65f1> 7638 <65f4> <65f4> 6209 <65fa> <65fa> 6127 <65fb> <65fc> 4875 <65fd> <65fd> 4322 <65ff> <65ff> 6065 <6606> <6606> 3777 <6607> <6607> 5688 <6609> <6609> 4952 <660a> <660a> 7810 <660c> <660c> 7101 <660e> <660e> 4751 <660f> <660f> 7845 <6610> <6610> 5161 <6611> <6611> 4041 <6613> <6613> 5950 <6614> <6614> 5407 <6615> <6615> 8019 <661e> <661e> 5046 <661f> <661f> 5480 <6620> <6620> 6005 <6625> <6625> 7300 <6627> <6627> 4712 <6628> <6628> 6513 <662d> <662d> 5510 <662f> <662f> 5704 <6630> <6630> 7621 <6631> <6631> 6232 <6634> <6634> 4805 <6636> <6636> 7102 <663a> <663a> 5047 <663b> <663b> 5836 <6641> <6641> 6792 <6642> <6642> 5705 <6643> <6644> 7911 <6649> <6649> 6985 <664b> <664b> 6986 <664f> <664f> 5810 <6659> <6659> 6908 <665b> <665b> 7738 <665d> <665d> 6873 <665e> <665e> 8046 <665f> <665f> 5481 <6664> <6664> 6066 <6665> <6665> 7890 <6666> <6666> 7935 endcidrange 100 begincidrange <6667> <6667> 7811 <6668> <6668> 5743 <6669> <6669> 4677 <666b> <666b> 7400 <666e> <666e> 5062 <666f> <666f> 3676 <6673> <6673> 5408 <6674> <6674> 7198 <6676> <6676> 6721 <6677> <6677> 3990 <6678> <6678> 6722 <667a> <667a> 6953 <6684> <6684> 7991 <6687> <6687> 3447 <6688> <6688> 7988 <6689> <6689> 8000 <668e> <668e> 6006 <6690> <6690> 6293 <6691> <6691> 5383 <6696> <6696> 4140 <6697> <6697> 5825 <6698> <6698> 5886 <669d> <669d> 4752 <66a0> <66a0> 3742 <66a2> <66a2> 7103 <66ab> <66ab> 6528 <66ae> <66ae> 4772 <66b2> <66b2> 6546 <66b3> <66b3> 7795 <66b4> <66b4> 7572 <66b9> <66b9> 5464 <66bb> <66bb> 3677 <66be> <66be> 4323 <66c4> <66c4> 5999 <66c6> <66c6> 4459 <66c7> <66c7> 4221 <66c9> <66c9> 7958 <66d6> <66d6> 5845 <66d9> <66d9> 5384 <66dc> <66dc> 6152 <66dd> <66dd> 7573 <66e0> <66e0> 3844 <66e6> <66e6> 8047 <66f0> <66f0> 6125 <66f2> <66f2> 3769 <66f3> <66f3> 6033 <66f4> <66f4> 3678 <66f7> <66f7> 3502 <66f8> <66f8> 5385 <66f9> <66f9> 6794 <66fa> <66fa> 6793 <66fc> <66fc> 4678 <66fe> <66fe> 6933 <66ff> <66ff> 7206 <6700> <6700> 7264 <6703> <6703> 7936 <6708> <6708> 6281 <6709> <6709> 6326 <670b> <670b> 5176 <670d> <670d> 5080 <6714> <6714> 5302 <6715> <6715> 7031 <6717> <6717> 4413 <671b> <671b> 4700 <671d> <671d> 6795 <671e> <671f> 4083 <6726> <6726> 4798 <6727> <6727> 4538 <6728> <6728> 4788 <672a> <672a> 4857 <672b> <672b> 4691 <672c> <672c> 5091 <672d> <672d> 7080 <672e> <672e> 7304 <6731> <6731> 6874 <6734> <6734> 4891 <6736> <6736> 7388 <673a> <673a> 3984 <673d> <673d> 7975 <6746> <6746> 3485 <6749> <6749> 5321 <674e> <674e> 4620 <674f> <674f> 7707 <6750> <6750> 6575 <6751> <6751> 7249 <6753> <6753> 7580 <6756> <6756> 6547 <675c> <675c> 4350 <675e> <675e> 4085 <675f> <675f> 5539 <676d> <676d> 7677 <676f> <676f> 4975 <6770> <6770> 3615 <6771> <6771> 4337 <6773> <6773> 4806 <6775> <6775> 6598 <6777> <6777> 7480 <677b> <677b> 4183 <677e> <677e> 5555 <677f> <677f> 7492 endcidrange 100 begincidrange <6787> <6787> 5194 <6789> <6789> 6128 <678b> <678b> 4953 <678f> <678f> 4146 <6790> <6790> 5409 <6793> <6793> 4351 <6795> <6795> 7369 <6797> <6797> 4647 <679a> <679a> 4713 <679c> <679c> 3805 <679d> <679d> 6954 <67af> <67af> 3743 <67b0> <67b0> 7531 <67b3> <67b3> 6955 <67b6> <67b7> 3448 <67b8> <67b8> 3913 <67be> <67be> 5706 <67c4> <67c4> 5048 <67cf> <67cf> 4991 <67d0> <67d0> 4773 <67d1> <67d1> 3518 <67d2> <67d2> 7365 <67d3> <67d3> 5990 <67d4> <67d4> 6327 <67da> <67da> 6328 <67dd> <67dd> 7401 <67e9> <67e9> 3914 <67ec> <67ec> 3486 <67ef> <67ef> 3450 <67f0> <67f0> 4157 <67f1> <67f1> 6875 <67f3> <67f3> 4579 <67f4> <67f4> 5707 <67f5> <67f5> 7127 <67f6> <67f6> 5268 <67fb> <67fb> 5269 <67fe> <67fe> 6723 <6812> <6812> 5645 <6813> <6813> 6658 <6816> <6816> 5386 <6817> <6817> 4602 <6821> <6821> 3877 <6822> <6822> 4992 <682a> <682a> 6876 <682f> <682f> 6233 <6838> <6838> 7704 <6839> <6839> 4028 <683c> <683c> 3631 <683d> <683d> 6576 <6840> <6840> 3616 <6841> <6841> 7678 <6842> <6842> 3713 <6843> <6843> 4285 <6848> <6848> 5811 <684e> <684e> 7020 <6850> <6850> 4338 <6851> <6851> 5346 <6853> <6853> 7891 <6854> <6854> 4130 <686d> <686d> 6987 <6876> <6876> 7454 <687f> <687f> 3487 <6881> <6881> 4431 <6885> <6885> 4714 <688f> <688f> 3770 <6893> <6893> 6577 <6894> <6894> 7342 <6897> <6897> 3679 <689d> <689d> 6796 <689f> <689f> 7959 <68a1> <68a1> 6110 <68a2> <68a2> 7220 <68a7> <68a7> 6067 <68a8> <68a8> 4621 <68ad> <68ad> 5270 <68af> <68af> 6767 <68b0> <68b0> 3714 <68b1> <68b1> 3778 <68b3> <68b3> 5511 <68b5> <68b5> 5011 <68b6> <68b6> 4858 <68c4> <68c4> 4087 <68c5> <68c5> 5049 <68c9> <68c9> 4738 <68cb> <68cb> 4086 <68cd> <68cd> 3779 <68d2> <68d2> 5099 <68d5> <68d5> 6842 <68d7> <68d7> 6797 <68d8> <68d8> 4020 <68da> <68da> 5177 <68df> <68df> 4339 <68e0> <68e0> 4245 <68e7> <68e7> 6523 <68e8> <68e8> 3715 <68ee> <68ee> 5322 <68f2> <68f2> 5387 <68f9> <68f9> 4286 <68fa> <68fa> 3823 <6900> <6900> 6111 endcidrange 100 begincidrange <6905> <6905> 6401 <690d> <690d> 5725 <690e> <690e> 7268 <6912> <6912> 7221 <6927> <6927> 4753 <6930> <6930> 5868 <693d> <693d> 5964 <693f> <693f> 7301 <694a> <694a> 5887 <6953> <6953> 7592 <6954> <6954> 5452 <6955> <6955> 7389 <6957> <6957> 3607 <6959> <6959> 4820 <695a> <695a> 7222 <695e> <695e> 4608 <6960> <6960> 4147 <6961> <6962> 6329 <6963> <6963> 4859 <6968> <6968> 6724 <696b> <696b> 6928 <696d> <696d> 5932 <696e> <696e> 6599 <696f> <696f> 5646 <6975> <6975> 4021 <6977> <6977> 7693 <6978> <6978> 7269 <6979> <6979> 6007 <6995> <6995> 6183 <699b> <699b> 6988 <699c> <699c> 4954 <69a5> <69a5> 7913 <69a7> <69a7> 5195 <69ae> <69ae> 6008 <69b4> <69b4> 4580 <69bb> <69bb> 7426 <69c1> <69c1> 3744 <69c3> <69c3> 4913 <69cb> <69cb> 3915 <69cc> <69cc> 7460 <69cd> <69cd> 7104 <69d0> <69d0> 3862 <69e8> <69e8> 3816 <69ea> <69ea> 3569 <69fb> <69fb> 3998 <69fd> <69fd> 6798 <69ff> <69ff> 4029 <6a02> <6a02> 5800 <6a0a> <6a0a> 4997 <6a11> <6a11> 4432 <6a13> <6a13> 4567 <6a17> <6a17> 6600 <6a19> <6a19> 7581 <6a1e> <6a1e> 7270 <6a1f> <6a1f> 6548 <6a21> <6a21> 4774 <6a23> <6a23> 5888 <6a35> <6a35> 7223 <6a38> <6a38> 4892 <6a39> <6a39> 5585 <6a3a> <6a3a> 7866 <6a3d> <6a3d> 6909 <6a44> <6a44> 3519 <6a48> <6a48> 6153 <6a4b> <6a4b> 3878 <6a52> <6a52> 6239 <6a53> <6a53> 5647 <6a58> <6a58> 4015 <6a59> <6a59> 4366 <6a5f> <6a5f> 4088 <6a61> <6a61> 5347 <6a6b> <6a6b> 7951 <6a80> <6a80> 4201 <6a84> <6a84> 3632 <6a89> <6a89> 6725 <6a8d> <6a8d> 5915 <6a8e> <6a8e> 4042 <6a97> <6a97> 5024 <6a9c> <6a9c> 7937 <6aa2> <6aa2> 3620 <6aa3> <6aa3> 6549 <6ab3> <6ab3> 5227 <6abb> <6abb> 7656 <6ac2> <6ac2> 4287 <6ac3> <6ac3> 3985 <6ad3> <6ad3> 4514 <6ada> <6ada> 4448 <6adb> <6adb> 6927 <6af6> <6af6> 7724 <6afb> <6afb> 5858 <6b04> <6b04> 4391 <6b0a> <6b0a> 3976 <6b0c> <6b0c> 6550 <6b12> <6b12> 4392 <6b16> <6b16> 4402 <6b20> <6b20> 8027 <6b21> <6b21> 7048 <6b23> <6b23> 8020 <6b32> <6b32> 6169 <6b3a> <6b3a> 4089 endcidrange 100 begincidrange <6b3d> <6b3d> 8028 <6b3e> <6b3e> 3824 <6b46> <6b46> 8029 <6b47> <6b47> 7727 <6b4c> <6b4c> 3451 <6b4e> <6b4e> 7413 <6b50> <6b50> 3916 <6b5f> <6b5f> 5937 <6b61> <6b61> 7889 <6b62> <6b62> 6956 <6b63> <6b63> 6726 <6b64> <6b64> 7049 <6b65> <6b65> 5063 <6b66> <6b66> 4821 <6b6a> <6b6a> 6133 <6b72> <6b72> 5494 <6b77> <6b77> 4460 <6b78> <6b78> 3991 <6b7b> <6b7b> 5271 <6b7f> <6b7f> 4795 <6b83> <6b83> 5837 <6b84> <6b84> 6989 <6b86> <6b86> 7436 <6b89> <6b89> 5648 <6b8a> <6b8a> 5586 <6b96> <6b96> 5726 <6b98> <6b98> 6524 <6b9e> <6b9e> 6240 <6bae> <6bae> 4485 <6baf> <6baf> 5228 <6bb2> <6bb2> 5465 <6bb5> <6bb5> 4202 <6bb7> <6bb7> 6376 <6bba> <6bba> 5317 <6bbc> <6bbc> 3470 <6bbf> <6bbf> 6659 <6bc1> <6bc1> 7996 <6bc5> <6bc5> 6402 <6bc6> <6bc6> 3917 <6bcb> <6bcb> 4822 <6bcd> <6bcd> 4775 <6bcf> <6bcf> 4715 <6bd2> <6bd2> 4309 <6bd3> <6bd3> 6356 <6bd4> <6bd4> 5196 <6bd6> <6bd8> 5197 <6bdb> <6bdb> 4776 <6beb> <6beb> 7812 <6bec> <6bec> 3918 <6c08> <6c08> 6660 <6c0f> <6c0f> 5774 <6c11> <6c11> 4877 <6c13> <6c13> 4728 <6c23> <6c23> 4090 <6c34> <6c34> 5587 <6c37> <6c37> 5238 <6c38> <6c38> 6009 <6c3e> <6c3e> 5012 <6c40> <6c40> 6727 <6c41> <6c41> 6929 <6c42> <6c42> 3919 <6c4e> <6c4e> 5013 <6c50> <6c50> 5410 <6c55> <6c55> 5307 <6c57> <6c57> 7639 <6c5a> <6c5a> 6068 <6c5d> <6c5d> 5938 <6c5e> <6c5e> 7855 <6c5f> <6c5f> 3545 <6c60> <6c60> 6957 <6c68> <6c68> 3784 <6c6a> <6c6a> 6129 <6c6d> <6c6d> 6034 <6c70> <6c70> 7437 <6c72> <6c72> 4055 <6c76> <6c76> 4841 <6c7a> <6c7a> 3649 <6c7d> <6c7d> 4091 <6c7e> <6c7e> 5162 <6c81> <6c81> 5765 <6c82> <6c82> 4092 <6c83> <6c83> 6079 <6c85> <6c85> 6267 <6c86> <6c86> 7679 <6c87> <6c87> 5965 <6c88> <6c88> 7370 <6c8c> <6c8c> 4324 <6c90> <6c90> 4789 <6c92> <6c92> 4796 <6c93> <6c93> 4234 <6c94> <6c94> 4739 <6c95> <6c95> 4849 <6c96> <6c96> 7308 <6c99> <6c99> 5272 <6c9a> <6c9a> 6958 <6c9b> <6c9b> 7506 <6cab> <6cab> 4692 <6cae> <6cae> 6601 <6cb3> <6cb3> 7622 <6cb8> <6cb8> 5200 endcidrange 100 begincidrange <6cb9> <6cb9> 6331 <6cbb> <6cbb> 7343 <6cbc> <6cbc> 5512 <6cbd> <6cbd> 3745 <6cbe> <6cbe> 7179 <6cbf> <6cbf> 5966 <6cc1> <6cc1> 7914 <6cc2> <6cc2> 7776 <6cc4> <6cc4> 5453 <6cc9> <6cc9> 7154 <6cca> <6cca> 4893 <6ccc> <6ccc> 7607 <6cd3> <6cd3> 7856 <6cd5> <6cd5> 5018 <6cd7> <6cd7> 5273 <6cdb> <6cdb> 5014 <6ce1> <6ce1> 7556 <6ce2> <6ce2> 7481 <6ce3> <6ce3> 6388 <6ce5> <6ce5> 4187 <6ce8> <6ce8> 6877 <6ceb> <6ceb> 7739 <6cee> <6cee> 4914 <6cef> <6cef> 4878 <6cf0> <6cf0> 7438 <6cf3> <6cf3> 6010 <6d0b> <6d0b> 5889 <6d0c> <6d0c> 4480 <6d11> <6d11> 5064 <6d17> <6d17> 5495 <6d19> <6d19> 5588 <6d1b> <6d1b> 4382 <6d1e> <6d1e> 4340 <6d25> <6d25> 6990 <6d27> <6d27> 6332 <6d29> <6d29> 5454 <6d2a> <6d2a> 7857 <6d32> <6d32> 6878 <6d35> <6d35> 5649 <6d36> <6d36> 8016 <6d38> <6d38> 3845 <6d39> <6d39> 6268 <6d3b> <6d3b> 7899 <6d3d> <6d3d> 8032 <6d3e> <6d3e> 7482 <6d41> <6d41> 4581 <6d59> <6d59> 6687 <6d5a> <6d5a> 6910 <6d5c> <6d5c> 5229 <6d63> <6d63> 6112 <6d66> <6d66> 7557 <6d69> <6d69> 7813 <6d6a> <6d6a> 4414 <6d6c> <6d6c> 4622 <6d6e> <6d6e> 5127 <6d74> <6d74> 6170 <6d77> <6d77> 7694 <6d78> <6d78> 7371 <6d79> <6d79> 7764 <6d7f> <6d7f> 7507 <6d85> <6d85> 5986 <6d87> <6d87> 3680 <6d88> <6d88> 5513 <6d89> <6d89> 5472 <6d8c> <6d8c> 6184 <6d8d> <6d8d> 7960 <6d8e> <6d8e> 5967 <6d91> <6d91> 5540 <6d93> <6d93> 5968 <6d95> <6d95> 7207 <6daf> <6daf> 5846 <6db2> <6db2> 5854 <6db5> <6db5> 7657 <6dc0> <6dc0> 6728 <6dc3> <6dc3> 3977 <6dc4> <6dc4> 7344 <6dc5> <6dc5> 5411 <6dc6> <6dc6> 7961 <6dc7> <6dc7> 4093 <6dcb> <6dcb> 4648 <6dcf> <6dcf> 7814 <6dd1> <6dd1> 5633 <6dd8> <6dd8> 4288 <6dd9> <6dd9> 6843 <6dda> <6dda> 4568 <6dde> <6dde> 5556 <6de1> <6de1> 4222 <6de8> <6de8> 6729 <6dea> <6dea> 4597 <6deb> <6deb> 6382 <6dee> <6dee> 7938 <6df1> <6df1> 5766 <6df3> <6df3> 5650 <6df5> <6df5> 5969 <6df7> <6df7> 7846 <6df8> <6df8> 7199 <6df9> <6df9> 5930 <6dfa> <6dfa> 7155 <6dfb> <6dfb> 7180 <6e17> <6e17> 5323 endcidrange 100 begincidrange <6e19> <6e19> 7892 <6e1a> <6e1a> 6602 <6e1b> <6e1b> 3520 <6e1f> <6e1f> 6730 <6e20> <6e20> 3593 <6e21> <6e21> 4289 <6e23> <6e23> 5274 <6e24> <6e24> 4933 <6e25> <6e25> 5801 <6e26> <6e26> 6099 <6e2b> <6e2b> 5455 <6e2c> <6e2c> 7334 <6e2d> <6e2d> 6294 <6e2f> <6e2f> 7680 <6e32> <6e32> 5427 <6e34> <6e34> 3503 <6e36> <6e36> 6011 <6e38> <6e38> 6333 <6e3a> <6e3a> 4807 <6e3c> <6e3c> 4860 <6e3d> <6e3d> 6578 <6e3e> <6e3e> 7847 <6e43> <6e43> 4976 <6e44> <6e44> 4861 <6e4a> <6e4a> 6879 <6e4d> <6e4d> 4203 <6e56> <6e56> 7815 <6e58> <6e58> 5348 <6e5b> <6e5b> 4223 <6e5c> <6e5c> 5727 <6e5e> <6e5e> 6731 <6e5f> <6e5f> 7915 <6e67> <6e67> 6185 <6e6b> <6e6b> 7271 <6e6e> <6e6e> 6453 <6e6f> <6e6f> 7429 <6e72> <6e72> 6269 <6e73> <6e73> 4148 <6e7a> <6e7a> 5065 <6e90> <6e90> 6270 <6e96> <6e96> 6911 <6e9c> <6e9c> 4582 <6e9d> <6e9d> 3920 <6e9f> <6e9f> 4754 <6ea2> <6ea2> 6465 <6ea5> <6ea5> 5128 <6eaa> <6eaa> 3716 <6eab> <6eab> 6083 <6eaf> <6eaf> 5514 <6eb1> <6eb1> 6991 <6eb6> <6eb6> 6186 <6eba> <6eba> 4189 <6ec2> <6ec2> 4955 <6ec4> <6ec4> 7105 <6ec5> <6ec5> 4746 <6ec9> <6ec9> 7916 <6ecb> <6ecb> 6493 <6ecc> <6ecc> 7142 <6ece> <6ece> 7777 <6ed1> <6ed1> 7900 <6ed3> <6ed3> 6579 <6ed4> <6ed4> 4290 <6eef> <6eef> 7208 <6ef4> <6ef4> 6625 <6ef8> <6ef8> 7816 <6efe> <6efe> 3780 <6eff> <6eff> 4679 <6f01> <6f01> 5905 <6f02> <6f02> 7582 <6f06> <6f06> 7366 <6f0f> <6f0f> 4569 <6f11> <6f11> 3570 <6f14> <6f14> 5970 <6f15> <6f15> 6799 <6f20> <6f20> 4666 <6f22> <6f22> 7640 <6f23> <6f23> 4468 <6f2b> <6f2b> 4680 <6f2c> <6f2c> 6959 <6f31> <6f31> 5589 <6f32> <6f32> 7106 <6f38> <6f38> 6695 <6f3f> <6f3f> 6551 <6f41> <6f41> 6012 <6f51> <6f51> 4934 <6f54> <6f54> 3650 <6f57> <6f57> 7033 <6f58> <6f58> 4915 <6f5a> <6f5a> 5634 <6f5b> <6f5b> 6529 <6f5e> <6f5e> 4515 <6f5f> <6f5f> 5412 <6f62> <6f62> 7917 <6f64> <6f64> 6362 <6f6d> <6f6d> 4224 <6f6e> <6f6e> 6800 <6f70> <6f70> 3986 <6f7a> <6f7a> 6525 <6f7c> <6f7c> 4341 <6f7d> <6f7d> 5066 endcidrange 100 begincidrange <6f7e> <6f7e> 4639 <6f81> <6f81> 5328 <6f84> <6f84> 7040 <6f88> <6f88> 7172 <6f8d> <6f8d> 6880 <6f8e> <6f8e> 7514 <6f90> <6f90> 6241 <6f94> <6f94> 7817 <6f97> <6f97> 3488 <6fa3> <6fa3> 7641 <6fa4> <6fa4> 7446 <6fa7> <6fa7> 4507 <6fae> <6fae> 7939 <6faf> <6faf> 7063 <6fb1> <6fb1> 6661 <6fb3> <6fb3> 6069 <6fb9> <6fb9> 4225 <6fbe> <6fbe> 4213 <6fc0> <6fc0> 3633 <6fc1> <6fc1> 7402 <6fc2> <6fc2> 4486 <6fc3> <6fc3> 4175 <6fca> <6fca> 6035 <6fd5> <6fd5> 5677 <6fda> <6fda> 6013 <6fdf> <6fdf> 6768 <6fe0> <6fe0> 7818 <6fe1> <6fe1> 6334 <6fe4> <6fe4> 4291 <6fe9> <6fe9> 7819 <6feb> <6feb> 4403 <6fec> <6fec> 6912 <6fef> <6fef> 7403 <6ff1> <6ff1> 5230 <6ffe> <6ffe> 4449 <7001> <7001> 5890 <7005> <7005> 7778 <7006> <7006> 4310 <7009> <7009> 5275 <700b> <700b> 5767 <700f> <700f> 4583 <7011> <7011> 7574 <7015> <7015> 5231 <7018> <7018> 4516 <701a> <701a> 7642 <701b> <701b> 6014 <701c> <701c> 6370 <701d> <701d> 4461 <701e> <701e> 6732 <701f> <701f> 5515 <7023> <7023> 7695 <7027> <7027> 4539 <7028> <7028> 4544 <702f> <702f> 6015 <7037> <7037> 6437 <703e> <703e> 4393 <704c> <704c> 3825 <7050> <7050> 7779 <7051> <7051> 5562 <7058> <7058> 7414 <705d> <705d> 7820 <7063> <7063> 4681 <706b> <706b> 7867 <7070> <7070> 7940 <7078> <7078> 3921 <707c> <707c> 6514 <707d> <707d> 6580 <7085> <7085> 3681 <708a> <708a> 7321 <708e> <708e> 5991 <7092> <7092> 7224 <7098> <7098> 8021 <7099> <7099> 6494 <709a> <709a> 3846 <70a1> <70a1> 6733 <70a4> <70a4> 5516 <70ab> <70ab> 7740 <70ac> <70ac> 3594 <70ad> <70ad> 7415 <70af> <70af> 7780 <70b3> <70b3> 5050 <70b7> <70b7> 6881 <70b8> <70b8> 6515 <70b9> <70b9> 6696 <70c8> <70c8> 4481 <70cb> <70cb> 8007 <70cf> <70cf> 6070 <70d8> <70d8> 7858 <70d9> <70d9> 4383 <70dd> <70dd> 6935 <70df> <70df> 5971 <70f1> <70f1> 3682 <70f9> <70f9> 7515 <70fd> <70fd> 5100 <7104> <7104> 7983 <7109> <7109> 5920 <710c> <710c> 6913 <7119> <7119> 4977 <711a> <711a> 5163 <711e> <711e> 4325 endcidrange 100 begincidrange <7121> <7121> 4823 <7126> <7126> 7225 <7130> <7130> 5992 <7136> <7136> 5972 <7147> <7147> 8001 <7149> <7149> 4469 <714a> <714a> 7992 <714c> <714c> 7918 <714e> <714e> 6662 <7150> <7150> 6016 <7156> <7156> 4141 <7159> <7159> 5973 <715c> <715c> 6234 <715e> <715e> 5318 <7164> <7164> 4716 <7165> <7165> 7893 <7166> <7166> 7976 <7167> <7167> 6801 <7169> <7169> 4998 <716c> <716c> 5891 <716e> <716e> 6495 <717d> <717d> 5428 <7184> <7184> 5728 <7189> <7189> 6242 <718a> <718a> 6253 <718f> <718f> 7984 <7192> <7192> 7781 <7194> <7194> 6187 <7199> <7199> 8048 <719f> <719f> 5635 <71a2> <71a2> 5101 <71ac> <71ac> 6071 <71b1> <71b1> 5987 <71b9> <71ba> 8049 <71be> <71be> 7345 <71c1> <71c1> 6000 <71c3> <71c3> 5974 <71c8> <71c8> 4367 <71c9> <71c9> 4326 <71ce> <71ce> 4556 <71d0> <71d0> 4640 <71d2> <71d2> 5517 <71d4> <71d4> 4999 <71d5> <71d5> 5975 <71df> <71df> 6017 <71e5> <71e5> 6802 <71e6> <71e6> 7064 <71e7> <71e7> 5590 <71ed> <71ed> 7243 <71ee> <71ee> 5473 <71fb> <71fb> 7985 <71fc> <71fc> 5744 <71fe> <71fe> 4292 <71ff> <71ff> 6154 <7200> <7200> 7731 <7206> <7206> 7575 <7210> <7210> 4517 <721b> <721b> 4394 <722a> <722a> 6803 <722c> <722c> 7483 <722d> <722d> 6587 <7230> <7230> 6271 <7232> <7232> 6295 <7235> <7235> 6516 <7236> <7236> 5129 <723a> <723a> 5869 <723b> <723b> 7962 <723d> <723d> 5349 <723e> <723e> 6422 <7240> <7240> 5350 <7246> <7246> 6552 <7247> <7247> 7521 <7248> <7248> 7493 <724c> <724c> 7508 <7252> <7252> 7191 <7258> <7258> 4311 <7259> <7259> 5782 <725b> <725b> 6210 <725d> <725d> 5232 <725f> <725f> 4777 <7261> <7261> 4778 <7262> <7262> 4545 <7267> <7267> 4790 <7269> <7269> 4850 <7272> <7272> 5369 <7279> <7279> 7472 <727d> <727d> 3638 <7280> <7280> 5388 <7281> <7281> 4623 <72a2> <72a2> 4312 <72a7> <72a7> 8051 <72ac> <72ac> 3639 <72af> <72af> 5015 <72c0> <72c0> 5351 <72c2> <72c2> 3847 <72c4> <72c4> 6626 <72ce> <72ce> 5831 <72d0> <72d0> 7821 <72d7> <72d7> 3922 <72d9> <72d9> 6603 endcidrange 100 begincidrange <72e1> <72e1> 3879 <72e9> <72e9> 5591 <72f8> <72f8> 4624 <72f9> <72f9> 7765 <72fc> <72fc> 4415 <72fd> <72fd> 7509 <730a> <730a> 6036 <7316> <7316> 7107 <731b> <731b> 4729 <731c> <731c> 5708 <731d> <731d> 6836 <7325> <7325> 6138 <7329> <7329> 5482 <732a> <732a> 6604 <732b> <732b> 4808 <7336> <7337> 6335 <733e> <733e> 7901 <733f> <733f> 6272 <7344> <7344> 6080 <7345> <7345> 5276 <7350> <7350> 6553 <7352> <7352> 6072 <7357> <7357> 3980 <7368> <7368> 4313 <736a> <736a> 7941 <7370> <7370> 6018 <7372> <7372> 7949 <7375> <7375> 4488 <7378> <7378> 5592 <737a> <737a> 4214 <737b> <737b> 7725 <7384> <7384> 7741 <7386> <7386> 6496 <7387> <7387> 5552 <7389> <7389> 6081 <738b> <738b> 6130 <738e> <738e> 6734 <7394> <7394> 7156 <7396> <7396> 3923 <7397> <7397> 6211 <7398> <7398> 4094 <739f> <739f> 4879 <73a7> <73a7> 6363 <73a9> <73a9> 6113 <73ad> <73ad> 5233 <73b2> <73b2> 4495 <73b3> <73b3> 4260 <73b9> <73b9> 7742 <73c0> <73c0> 4894 <73c2> <73c2> 3452 <73c9> <73c9> 4880 <73ca> <73ca> 5308 <73cc> <73cc> 7608 <73cd> <73cd> 6992 <73cf> <73cf> 3471 <73d6> <73d6> 3848 <73d9> <73d9> 3797 <73dd> <73dd> 7977 <73de> <73de> 4384 <73e0> <73e0> 6882 <73e3> <73e3> 5651 <73e4> <73e4> 5067 <73e5> <73e5> 6423 <73e6> <73e6> 7713 <73e9> <73e9> 7782 <73ea> <73ea> 3999 <73ed> <73ed> 4916 <73f7> <73f7> 4824 <73f9> <73f9> 5483 <73fd> <73fd> 6735 <73fe> <73fe> 7743 <7401> <7401> 5429 <7403> <7403> 3924 <7405> <7405> 4416 <7406> <7406> 4625 <7407> <7407> 5593 <7409> <7409> 4584 <7413> <7413> 6114 <741b> <741b> 7372 <7420> <7420> 6663 <7421> <7421> 5636 <7422> <7422> 7404 <7425> <7425> 7822 <7426> <7426> 4095 <7428> <7428> 3781 <742a> <742a> 4096 <742b> <742b> 5102 <742c> <742c> 6115 <742e> <742e> 6844 <742f> <742f> 3826 <7430> <7430> 5993 <7433> <7433> 4649 <7434> <7434> 4043 <7435> <7435> 5201 <7436> <7436> 7484 <7438> <7438> 7405 <743a> <743a> 5019 <743f> <743f> 7848 <7440> <7440> 6212 <7441> <7441> 4779 endcidrange 100 begincidrange <7443> <7443> 7302 <7444> <7444> 5430 <744b> <744b> 6296 <7455> <7455> 7623 <7457> <7457> 6273 <7459> <7459> 4173 <745a> <745a> 7823 <745b> <745b> 6019 <745c> <745c> 6337 <745e> <745e> 5389 <745f> <745f> 5674 <7460> <7460> 4585 <7462> <7462> 6188 <7464> <7464> 6155 <7465> <7465> 6084 <7468> <7468> 6993 <7469> <7469> 7783 <746a> <746a> 4657 <746f> <746f> 4417 <747e> <747e> 4030 <7482> <7482> 4097 <7483> <7483> 4626 <7487> <7487> 5431 <7489> <7489> 4470 <748b> <748b> 6554 <7498> <7498> 4641 <749c> <749c> 7919 <749e> <749e> 4895 <749f> <749f> 3683 <74a1> <74a1> 6994 <74a3> <74a3> 4098 <74a5> <74a5> 3684 <74a7> <74a7> 5025 <74a8> <74a8> 7065 <74aa> <74aa> 6804 <74b0> <74b0> 7894 <74b2> <74b2> 5594 <74b5> <74b5> 5939 <74b9> <74b9> 5637 <74bd> <74bd> 5363 <74bf> <74bf> 5432 <74c6> <74c6> 7021 <74ca> <74ca> 3685 <74cf> <74cf> 4540 <74d4> <74d4> 6020 <74d8> <74d8> 3827 <74da> <74da> 7066 <74dc> <74dc> 3806 <74e0> <74e0> 7824 <74e2> <74e2> 7583 <74e3> <74e3> 7494 <74e6> <74e6> 6100 <74ee> <74ee> 6092 <74f7> <74f7> 6497 <7501> <7501> 5051 <7504> <7504> 3640 <7511> <7511> 6936 <7515> <7515> 6093 <7518> <7518> 3521 <751a> <751a> 5768 <751b> <751b> 7181 <751f> <751f> 5370 <7523> <7523> 5309 <7525> <7525> 5371 <7526> <7526> 5518 <7528> <7528> 6189 <752b> <752b> 5068 <752c> <752c> 6190 <7530> <7530> 6664 <7531> <7531> 6338 <7532> <7532> 3532 <7533> <7533> 5745 <7537> <7537> 4149 <7538> <7538> 6665 <753a> <753a> 6736 <7547> <7547> 4011 <754c> <754c> 3717 <754f> <754f> 6139 <7551> <7551> 6666 <7553> <7553> 4235 <7554> <7554> 4917 <7559> <7559> 4586 <755b> <755b> 6995 <755c> <755c> 7289 <755d> <755d> 4825 <7562> <7562> 7609 <7565> <7565> 4426 <7566> <7566> 8008 <756a> <756a> 5000 <756f> <756f> 6914 <7570> <7570> 6424 <7575> <7575> 7868 <7576> <7576> 4246 <7578> <7578> 4099 <757a> <757a> 3546 <757f> <757f> 4100 <7586> <7586> 3547 <7587> <7587> 6883 <758a> <758a> 7192 <758b> <758b> 7610 endcidrange 100 begincidrange <758e> <758e> 5520 <758f> <758f> 5519 <7591> <7591> 6403 <759d> <759d> 5310 <75a5> <75a5> 3571 <75ab> <75ab> 5951 <75b1> <75b1> 7558 <75b2> <75b2> 7599 <75b3> <75b3> 3522 <75b5> <75b5> 6498 <75b8> <75b8> 4215 <75b9> <75b9> 6996 <75bc> <75bc> 4342 <75bd> <75bd> 6605 <75be> <75be> 7022 <75c2> <75c2> 3453 <75c5> <75c5> 5052 <75c7> <75c7> 6937 <75cd> <75cd> 6425 <75d2> <75d2> 5892 <75d4> <75d4> 7346 <75d5> <75d5> 8022 <75d8> <75d8> 4352 <75d9> <75d9> 3686 <75db> <75db> 7455 <75e2> <75e2> 4627 <75f0> <75f0> 4226 <75f2> <75f2> 4658 <75f4> <75f4> 7347 <75fa> <75fa> 5202 <75fc> <75fc> 3746 <7600> <7600> 5906 <760d> <760d> 5893 <7619> <7619> 5521 <761f> <761f> 6085 <7620> <7620> 7143 <7621> <7621> 7108 <7622> <7622> 4918 <7624> <7624> 4587 <7626> <7626> 5595 <763b> <763b> 4570 <7642> <7642> 4557 <764c> <764c> 5826 <764e> <764e> 3489 <7652> <7652> 6339 <7656> <7656> 5026 <7661> <7661> 7348 <7664> <7664> 6688 <7669> <7669> 4376 <766c> <766c> 5433 <7670> <7670> 6094 <7672> <7672> 6667 <7678> <7678> 3718 <767b> <767b> 4368 <767c> <767c> 4935 <767d> <767e> 4993 <7684> <7684> 6627 <7686> <7686> 3572 <7687> <7687> 7920 <768e> <768e> 3880 <7690> <7690> 3747 <7693> <7693> 7825 <76ae> <76ae> 7600 <76ba> <76ba> 7272 <76bf> <76bf> 4755 <76c2> <76c2> 6213 <76c3> <76c3> 4978 <76c6> <76c6> 5164 <76c8> <76c8> 6021 <76ca> <76ca> 6438 <76d2> <76d2> 7665 <76d6> <76d6> 3573 <76db> <76db> 5484 <76dc> <76dc> 4293 <76de> <76de> 6526 <76df> <76df> 4731 <76e1> <76e1> 6997 <76e3> <76e3> 3523 <76e4> <76e4> 4919 <76e7> <76e7> 4518 <76ee> <76ee> 4791 <76f2> <76f2> 4730 <76f4> <76f4> 6975 <76f8> <76f8> 5352 <76fc> <76fc> 4920 <76fe> <76fe> 5652 <7701> <7701> 5485 <7704> <7704> 4740 <7708> <7708> 7421 <7709> <7709> 4862 <770b> <770b> 3490 <771e> <771e> 6998 <7720> <7720> 4741 <7729> <7729> 7744 <7737> <7737> 3978 <7738> <7738> 4780 <773a> <773a> 6805 <773c> <773c> 5812 <7740> <7740> 7057 <774d> <774d> 7745 endcidrange 100 begincidrange <775b> <775b> 6737 <7761> <7761> 5596 <7763> <7763> 4314 <7766> <7766> 4792 <776b> <776b> 7193 <7779> <7779> 4294 <777e> <777e> 3748 <777f> <777f> 6037 <778b> <778b> 6999 <7791> <7791> 4756 <779e> <779e> 4682 <77a5> <77a5> 5038 <77ac> <77ac> 5653 <77ad> <77ad> 4558 <77b0> <77b0> 3524 <77b3> <77b3> 4343 <77bb> <77bb> 7182 <77bc> <77bc> 3621 <77bf> <77bf> 3925 <77d7> <77d7> 7244 <77db> <77db> 4781 <77dc> <77dc> 4060 <77e2> <77e2> 5709 <77e3> <77e3> 6404 <77e5> <77e5> 6960 <77e9> <77e9> 3926 <77ed> <77ed> 4204 <77ee> <77ee> 6134 <77ef> <77ef> 3881 <77f3> <77f3> 5413 <7802> <7802> 5277 <7812> <7812> 5203 <7825> <7825> 6961 <7826> <7826> 7120 <7827> <7827> 7373 <782c> <782c> 4652 <7832> <7832> 7559 <7834> <7834> 7485 <7845> <7845> 4000 <784f> <784f> 5976 <785d> <785d> 7226 <786b> <786b> 4588 <786c> <786c> 3687 <786f> <786f> 5977 <787c> <787c> 5178 <7881> <7881> 4101 <7887> <7887> 6738 <788c> <788c> 4528 <788d> <788d> 5847 <788e> <788e> 5563 <7891> <7891> 5204 <7897> <7897> 6116 <78a3> <78a3> 3504 <78a7> <78a7> 5027 <78a9> <78a9> 5414 <78ba> <78bb> 7879 <78bc> <78bc> 4659 <78c1> <78c1> 6499 <78c5> <78c5> 4956 <78ca> <78ca> 4546 <78cb> <78cb> 7050 <78ce> <78ce> 3719 <78d0> <78d0> 4921 <78e8> <78e8> 4660 <78ec> <78ec> 3688 <78ef> <78ef> 4102 <78f5> <78f5> 3491 <78fb> <78fb> 4922 <7901> <7901> 7227 <790e> <790e> 7228 <7916> <7916> 5940 <792a> <792a> 4450 <792b> <792b> 4462 <792c> <792c> 4923 <793a> <793a> 5710 <793e> <793e> 5278 <7940> <7940> 5279 <7941> <7941> 4103 <7947> <7948> 4104 <7949> <7949> 6962 <7950> <7950> 6214 <7956> <7956> 6806 <7957> <7957> 6963 <795a> <795a> 6807 <795b> <795b> 3595 <795c> <795c> 7826 <795d> <795d> 7290 <795e> <795e> 5746 <7960> <7960> 5280 <7965> <7965> 5353 <7968> <7968> 7584 <796d> <796d> 6769 <797a> <797a> 4106 <797f> <797f> 4529 <7981> <7981> 4044 <798d> <798d> 7869 <798e> <798e> 6739 <798f> <798f> 5081 <7991> <7991> 6215 <79a6> <79a6> 5907 endcidrange 100 begincidrange <79a7> <79a7> 8052 <79aa> <79aa> 5434 <79ae> <79ae> 4508 <79b1> <79b1> 4295 <79b3> <79b3> 5894 <79b9> <79b9> 6216 <79bd> <79bd> 4045 <79be> <79be> 7870 <79bf> <79bf> 4315 <79c0> <79c0> 5597 <79c1> <79c1> 5281 <79c9> <79c9> 5053 <79ca> <79ca> 4162 <79cb> <79cb> 7273 <79d1> <79d1> 3807 <79d2> <79d2> 7229 <79d5> <79d5> 5205 <79d8> <79d8> 5206 <79df> <79df> 6808 <79e4> <79e4> 7377 <79e6> <79e6> 7000 <79e7> <79e7> 5838 <79e9> <79e9> 7023 <79fb> <79fb> 6426 <7a00> <7a00> 8053 <7a05> <7a05> 5496 <7a08> <7a08> 3492 <7a0b> <7a0b> 6740 <7a0d> <7a0d> 7230 <7a14> <7a14> 6474 <7a17> <7a17> 7510 <7a19> <7a19> 6976 <7a1a> <7a1a> 7349 <7a1c> <7a1c> 4609 <7a1f> <7a1f> 7591 <7a20> <7a20> 6809 <7a2e> <7a2e> 6845 <7a31> <7a31> 7378 <7a36> <7a36> 6235 <7a37> <7a37> 6977 <7a3b> <7a3b> 4296 <7a3c> <7a3c> 3454 <7a3d> <7a3d> 3720 <7a3f> <7a3f> 3749 <7a40> <7a40> 3771 <7a46> <7a46> 4793 <7a49> <7a49> 7350 <7a4d> <7a4d> 6628 <7a4e> <7a4e> 6022 <7a57> <7a57> 5598 <7a61> <7a61> 5366 <7a62> <7a62> 6038 <7a69> <7a69> 6086 <7a6b> <7a6b> 7881 <7a70> <7a70> 5895 <7a74> <7a74> 7755 <7a76> <7a76> 3927 <7a79> <7a79> 3965 <7a7a> <7a7a> 3798 <7a7d> <7a7d> 6741 <7a7f> <7a7f> 7157 <7a81> <7a81> 4330 <7a84> <7a84> 7058 <7a88> <7a88> 6156 <7a92> <7a92> 7024 <7a93> <7a93> 7109 <7a95> <7a95> 6810 <7a98> <7a98> 3954 <7a9f> <7a9f> 3962 <7aa9> <7aaa> 6101 <7aae> <7aae> 3966 <7aaf> <7aaf> 6157 <7aba> <7aba> 4001 <7ac4> <7ac4> 7067 <7ac5> <7ac5> 4002 <7ac7> <7ac7> 4353 <7aca> <7aca> 6689 <7acb> <7acb> 4653 <7ad7> <7ad7> 4809 <7ad9> <7ad9> 7089 <7add> <7add> 5054 <7adf> <7adf> 3689 <7ae0> <7ae0> 6555 <7ae3> <7ae3> 6915 <7ae5> <7ae5> 4344 <7aea> <7aea> 5599 <7aed> <7aed> 3505 <7aef> <7aef> 4205 <7af6> <7af6> 3690 <7af9> <7af9> 6900 <7afa> <7afa> 7291 <7aff> <7aff> 3493 <7b0f> <7b0f> 7852 <7b11> <7b11> 5522 <7b19> <7b19> 5372 <7b1b> <7b1b> 6629 <7b1e> <7b1e> 7439 <7b20> <7b20> 4654 <7b26> <7b26> 5130 <7b2c> <7b2c> 6770 endcidrange 100 begincidrange <7b2d> <7b2d> 4496 <7b39> <7b39> 5497 <7b46> <7b46> 7611 <7b49> <7b49> 4369 <7b4b> <7b4b> 4031 <7b4c> <7b4c> 6668 <7b4d> <7b4d> 5654 <7b4f> <7b4f> 5006 <7b50> <7b50> 3849 <7b51> <7b51> 7292 <7b52> <7b52> 7456 <7b54> <7b54> 4236 <7b56> <7b56> 7128 <7b60> <7b60> 4012 <7b6c> <7b6c> 5486 <7b6e> <7b6e> 5390 <7b75> <7b75> 5978 <7b7d> <7b7d> 6073 <7b87> <7b87> 3574 <7b8b> <7b8b> 6669 <7b8f> <7b8f> 6588 <7b94> <7b94> 4896 <7b95> <7b95> 4107 <7b97> <7b97> 5311 <7b9a> <7b9a> 7051 <7b9d> <7b9d> 3656 <7ba1> <7ba1> 3828 <7bad> <7bad> 6670 <7bb1> <7bb1> 5354 <7bb4> <7bb4> 6530 <7bb8> <7bb8> 6606 <7bc0> <7bc0> 6690 <7bc1> <7bc1> 7921 <7bc4> <7bc4> 5016 <7bc6> <7bc6> 6671 <7bc7> <7bc7> 7522 <7bc9> <7bc9> 7293 <7bd2> <7bd2> 5729 <7be0> <7be0> 5523 <7be4> <7be4> 4316 <7be9> <7be9> 5282 <7c07> <7c07> 6829 <7c12> <7c12> 7068 <7c1e> <7c1e> 4206 <7c21> <7c21> 3494 <7c27> <7c27> 7922 <7c2a> <7c2a> 6531 <7c2b> <7c2b> 5524 <7c3d> <7c3d> 7183 <7c3e> <7c3e> 4487 <7c3f> <7c3f> 5131 <7c43> <7c43> 4404 <7c4c> <7c4c> 6884 <7c4d> <7c4d> 6630 <7c60> <7c60> 4541 <7c64> <7c64> 7184 <7c6c> <7c6c> 4628 <7c73> <7c73> 4863 <7c83> <7c83> 5207 <7c89> <7c89> 5165 <7c92> <7c92> 4655 <7c95> <7c95> 4897 <7c97> <7c97> 6811 <7c98> <7c98> 6697 <7c9f> <7c9f> 5541 <7ca5> <7ca5> 6901 <7ca7> <7ca7> 6556 <7cae> <7cae> 4433 <7cb1> <7cb1> 4434 <7cb2> <7cb2> 7070 <7cb3> <7cb3> 3582 <7cb9> <7cb9> 5600 <7cbe> <7cbe> 6742 <7cca> <7cca> 7827 <7cd6> <7cd6> 4247 <7cde> <7cde> 5166 <7cdf> <7cdf> 6812 <7ce0> <7ce0> 3548 <7ce7> <7ce7> 4435 <7cfb> <7cfb> 3721 <7cfe> <7cfe> 4003 <7d00> <7d00> 4108 <7d02> <7d02> 6885 <7d04> <7d04> 5873 <7d05> <7d05> 7859 <7d06> <7d06> 6217 <7d07> <7d07> 8025 <7d08> <7d08> 7895 <7d0a> <7d0b> 4842 <7d0d> <7d0d> 4150 <7d10> <7d10> 4184 <7d14> <7d14> 5655 <7d17> <7d17> 5283 <7d18> <7d18> 3865 <7d19> <7d19> 6964 <7d1a> <7d1a> 4056 <7d1b> <7d1b> 5167 <7d20> <7d20> 5525 <7d21> <7d21> 4957 <7d22> <7d22> 5367 endcidrange 100 begincidrange <7d2b> <7d2b> 6500 <7d2c> <7d2c> 6886 <7d2e> <7d2e> 7081 <7d2f> <7d2f> 4571 <7d30> <7d30> 5498 <7d33> <7d33> 5747 <7d35> <7d35> 6607 <7d39> <7d39> 5526 <7d3a> <7d3a> 3525 <7d42> <7d42> 6846 <7d43> <7d43> 7746 <7d44> <7d44> 6813 <7d45> <7d45> 3691 <7d46> <7d46> 4924 <7d50> <7d50> 3651 <7d5e> <7d5e> 3882 <7d61> <7d61> 4385 <7d62> <7d62> 7747 <7d66> <7d66> 4057 <7d68> <7d68> 6371 <7d6a> <7d6a> 6454 <7d6e> <7d6e> 5391 <7d71> <7d71> 7457 <7d72> <7d72> 5284 <7d73> <7d73> 3549 <7d76> <7d76> 6691 <7d79> <7d79> 3641 <7d7f> <7d7f> 3928 <7d8e> <7d8e> 6743 <7d8f> <7d8f> 5601 <7d93> <7d93> 3692 <7d9c> <7d9c> 6847 <7da0> <7da0> 4530 <7da2> <7da2> 6887 <7dac> <7dac> 5602 <7dad> <7dad> 6340 <7db1> <7db1> 3550 <7db2> <7db2> 4701 <7db4> <7db4> 7173 <7db5> <7db5> 7121 <7db8> <7db8> 4598 <7dba> <7dba> 4109 <7dbb> <7dbb> 7416 <7dbd> <7dbd> 6517 <7dbe> <7dbe> 4610 <7dbf> <7dbf> 4742 <7dc7> <7dc7> 7351 <7dca> <7dca> 4126 <7dcb> <7dcb> 5208 <7dd6> <7dd6> 5392 <7dd8> <7dd8> 7658 <7dda> <7dda> 5435 <7ddd> <7ddd> 7034 <7dde> <7dde> 4207 <7de0> <7de0> 7209 <7de1> <7de1> 4881 <7de3> <7de3> 5979 <7de8> <7de8> 7523 <7de9> <7de9> 6117 <7dec> <7dec> 4743 <7def> <7def> 6297 <7df4> <7df4> 4471 <7dfb> <7dfb> 7352 <7e09> <7e09> 7001 <7e0a> <7e0a> 5855 <7e15> <7e15> 6087 <7e1b> <7e1b> 4898 <7e1d> <7e1d> 7002 <7e1e> <7e1e> 7828 <7e1f> <7e1f> 6171 <7e21> <7e21> 6581 <7e23> <7e23> 7748 <7e2b> <7e2b> 5103 <7e2e> <7e2e> 7294 <7e2f> <7e2f> 5980 <7e31> <7e31> 6848 <7e37> <7e37> 4572 <7e3d> <7e3d> 7257 <7e3e> <7e3e> 6631 <7e41> <7e41> 5001 <7e43> <7e43> 5179 <7e46> <7e46> 4826 <7e47> <7e47> 6158 <7e52> <7e52> 6938 <7e54> <7e54> 6978 <7e55> <7e55> 5436 <7e5e> <7e5e> 6159 <7e61> <7e61> 5603 <7e69> <7e69> 5689 <7e6a> <7e6a> 7942 <7e6b> <7e6b> 3722 <7e6d> <7e6d> 3642 <7e70> <7e70> 6814 <7e79> <7e79> 5952 <7e7c> <7e7c> 3723 <7e82> <7e82> 7069 <7e8c> <7e8c> 5542 <7e8f> <7e8f> 6672 <7e93> <7e93> 6023 <7e96> <7e96> 5466 endcidrange 100 begincidrange <7e98> <7e98> 7071 <7e9b> <7e9b> 4317 <7e9c> <7e9c> 4405 <7f36> <7f36> 5132 <7f38> <7f38> 7681 <7f3a> <7f3a> 3652 <7f4c> <7f4c> 5859 <7f50> <7f50> 3829 <7f54> <7f54> 4702 <7f55> <7f55> 7643 <7f6a> <7f6a> 6859 <7f6b> <7f6b> 3854 <7f6e> <7f6e> 7353 <7f70> <7f70> 5007 <7f72> <7f72> 5393 <7f75> <7f75> 4717 <7f77> <7f77> 7486 <7f79> <7f79> 4629 <7f85> <7f85> 4377 <7f88> <7f88> 4110 <7f8a> <7f8a> 5896 <7f8c> <7f8c> 3551 <7f8e> <7f8e> 4864 <7f94> <7f94> 3750 <7f9a> <7f9a> 4497 <7f9e> <7f9e> 5604 <7fa4> <7fa4> 3955 <7fa8> <7fa8> 5437 <7fa9> <7fa9> 6405 <7fb2> <7fb2> 8054 <7fb8> <7fb8> 4630 <7fb9> <7fb9> 3583 <7fbd> <7fbd> 6218 <7fc1> <7fc1> 6095 <7fc5> <7fc5> 5711 <7fca> <7fca> 6439 <7fcc> <7fcc> 6440 <7fce> <7fce> 4498 <7fd2> <7fd2> 5679 <7fd4> <7fd4> 5355 <7fd5> <7fd5> 8033 <7fdf> <7fdf> 6632 <7fe0> <7fe0> 7322 <7fe1> <7fe1> 5209 <7fe9> <7fe9> 7524 <7feb> <7feb> 6118 <7ff0> <7ff0> 7644 <7ff9> <7ff9> 3883 <7ffc> <7ffc> 6441 <8000> <8000> 6160 <8001> <8001> 4519 <8003> <8003> 3751 <8005> <8005> 6501 <8006> <8006> 4111 <8009> <8009> 3929 <800c> <800c> 6427 <8010> <8010> 4158 <8015> <8015> 3693 <8017> <8017> 4782 <8018> <8018> 6243 <802d> <802d> 4112 <8033> <8033> 6428 <8036> <8036> 5870 <803d> <803d> 7422 <803f> <803f> 3694 <8043> <8043> 4227 <8046> <8046> 4499 <804a> <804a> 4559 <8056> <8056> 5487 <8058> <8058> 5239 <805a> <805a> 7323 <805e> <805e> 4844 <806f> <806f> 4472 <8070> <8070> 7258 <8072> <8072> 5488 <8073> <8073> 6191 <8077> <8077> 6979 <807d> <807d> 7200 <807e> <807e> 4542 <807f> <807f> 6368 <8084> <8084> 6429 <8085> <8085> 5638 <8086> <8086> 5285 <8087> <8087> 6815 <8089> <8089> 6357 <808b> <808b> 4605 <808c> <808c> 4113 <8096> <8096> 7231 <809b> <809b> 7682 <809d> <809d> 3495 <80a1> <80a1> 3752 <80a2> <80a2> 6965 <80a5> <80a5> 5210 <80a9> <80a9> 3643 <80aa> <80aa> 4958 <80af> <80af> 4061 <80b1> <80b1> 3866 <80b2> <80b2> 6358 <80b4> <80b4> 7963 <80ba> <80ba> 7540 endcidrange 100 begincidrange <80c3> <80c3> 6298 <80c4> <80c4> 6865 <80cc> <80cc> 4979 <80ce> <80ce> 7440 <80da> <80da> 4980 <80db> <80db> 3533 <80de> <80de> 7560 <80e1> <80e1> 7829 <80e4> <80e4> 6364 <80e5> <80e5> 5394 <80f1> <80f1> 3850 <80f4> <80f4> 4345 <80f8> <80f8> 8017 <80fd> <80fd> 4185 <8102> <8102> 6966 <8105> <8105> 7766 <8106> <8106> 7324 <8107> <8107> 7767 <8108> <8108> 4722 <810a> <810a> 7144 <8118> <8118> 6119 <811a> <811a> 3472 <811b> <811b> 3695 <8123> <8123> 5656 <8129> <8129> 5605 <812b> <812b> 7419 <812f> <812f> 7561 <8139> <8139> 7110 <813e> <813e> 5211 <814b> <814b> 5856 <814e> <814e> 5748 <8150> <8151> 5133 <8154> <8154> 3552 <8155> <8155> 6120 <8165> <8165> 5489 <8166> <8166> 4179 <816b> <816b> 6849 <8170> <8170> 6161 <8171> <8171> 3608 <8178> <8178> 6557 <8179> <8179> 5082 <817a> <817a> 5438 <817f> <817f> 7461 <8180> <8180> 4959 <8188> <8188> 3634 <818a> <818a> 4899 <818f> <818f> 3753 <819a> <819a> 5135 <819c> <819c> 4667 <819d> <819d> 5675 <81a0> <81a0> 3884 <81a3> <81a3> 7025 <81a8> <81a8> 7516 <81b3> <81b3> 5439 <81b5> <81b5> 7313 <81ba> <81ba> 6392 <81bd> <81bd> 4228 <81be> <81be> 7943 <81bf> <81bf> 4176 <81c0> <81c0> 4359 <81c2> <81c2> 5212 <81c6> <81c6> 5916 <81cd> <81cd> 6771 <81d8> <81d8> 4410 <81df> <81df> 6558 <81e3> <81e3> 5749 <81e5> <81e5> 6103 <81e7> <81e7> 6559 <81e8> <81e8> 4650 <81ea> <81ea> 6502 <81ed> <81ed> 7325 <81f3> <81f3> 6967 <81f4> <81f4> 7354 <81fa> <81fa> 4261 <81fb> <81fb> 7003 <81fc> <81fc> 3930 <81fe> <81fe> 6341 <8205> <8205> 3931 <8207> <8207> 5941 <8208> <8208> 8034 <820a> <820a> 3932 <820c> <820c> 5456 <820d> <820d> 5286 <8212> <8212> 5395 <821b> <821b> 7158 <821c> <821c> 5657 <821e> <821e> 4827 <821f> <821f> 6888 <8221> <8221> 3553 <822a> <822a> 7683 <822b> <822b> 4960 <822c> <822c> 4925 <8235> <8235> 7390 <8236> <8236> 4900 <8237> <8237> 7749 <8239> <8239> 5440 <8240> <8240> 5136 <8245> <8245> 5942 <8247> <8247> 6744 <8259> <8259> 7111 endcidrange 100 begincidrange <8264> <8264> 6406 <8266> <8266> 7659 <826e> <826e> 3496 <826f> <826f> 4436 <8271> <8271> 3497 <8272> <8272> 5368 <8276> <8276> 5994 <8278> <8278> 7232 <827e> <827e> 5848 <828b> <828b> 6219 <828d> <828d> 6518 <828e> <828e> 3967 <8292> <8292> 4703 <8299> <8299> 5137 <829a> <829a> 4360 <829d> <829d> 6968 <829f> <829f> 5324 <82a5> <82a5> 3575 <82a6> <82a6> 7830 <82a9> <82a9> 4046 <82ac> <82ac> 5168 <82ad> <82ad> 7487 <82ae> <82ae> 6039 <82af> <82af> 5769 <82b1> <82b1> 7871 <82b3> <82b3> 4961 <82b7> <82b7> 6969 <82b8> <82b8> 6244 <82b9> <82b9> 4032 <82bb> <82bb> 7274 <82bc> <82bc> 4783 <82bd> <82bd> 5783 <82bf> <82bf> 6482 <82d1> <82d1> 6274 <82d2> <82d2> 5995 <82d4> <82d4> 7441 <82d5> <82d5> 7233 <82d7> <82d7> 4810 <82db> <82db> 3455 <82de> <82de> 7562 <82df> <82df> 3933 <82e1> <82e1> 6430 <82e5> <82e5> 5874 <82e6> <82e6> 3754 <82e7> <82e7> 6608 <82f1> <82f1> 6024 <82fd> <82fd> 3755 <82fe> <82fe> 7612 <8301> <8301> 6921 <8302> <8302> 4828 <8303> <8303> 5017 <8304> <8304> 3456 <8305> <8305> 4784 <8309> <8309> 4693 <8317> <8317> 4757 <8328> <8328> 6503 <832b> <832b> 4704 <832f> <832f> 5083 <8331> <8331> 5606 <8334> <8334> 7944 <8335> <8335> 6455 <8336> <8336> 4191 <8338> <8338> 6192 <8339> <8339> 5943 <8340> <8340> 5658 <8347> <8347> 7708 <8349> <8349> 7234 <834a> <834a> 7784 <834f> <834f> 6475 <8351> <8351> 6431 <8352> <8352> 7923 <8373> <8373> 4354 <8377> <8377> 7624 <837b> <837b> 6633 <8389> <8389> 4631 <838a> <838a> 6560 <838e> <838e> 5287 <8396> <8396> 3696 <8398> <8398> 5750 <839e> <839e> 6121 <83a2> <83a2> 7768 <83a9> <83a9> 5138 <83aa> <83aa> 5784 <83ab> <83ab> 4668 <83bd> <83bd> 4705 <83c1> <83c1> 7201 <83c5> <83c5> 3830 <83c9> <83c9> 4531 <83ca> <83ca> 3949 <83cc> <83cc> 4013 <83d3> <83d3> 3808 <83d6> <83d6> 7112 <83dc> <83dc> 7122 <83e9> <83e9> 5069 <83eb> <83eb> 4033 <83ef> <83ef> 7872 <83f0> <83f0> 3756 <83f1> <83f1> 4611 <83f2> <83f2> 5213 <83f4> <83f4> 5827 endcidrange 100 begincidrange <83f9> <83f9> 6609 <83fd> <83fd> 5639 <8403> <8403> 7314 <8404> <8404> 4297 <840a> <840a> 4423 <840c> <840c> 4732 <840d> <840d> 7532 <840e> <840e> 6299 <8429> <8429> 7275 <842c> <842c> 4683 <8431> <8431> 7993 <8438> <8438> 6342 <843d> <843d> 4386 <8449> <8449> 6001 <8457> <8457> 6610 <845b> <845b> 3506 <8461> <8461> 7563 <8463> <8463> 4346 <8466> <8466> 6300 <846b> <846b> 7831 <846c> <846c> 6561 <846f> <846f> 5875 <8475> <8475> 4004 <847a> <847a> 6930 <8490> <8490> 5607 <8494> <8494> 5712 <8499> <8499> 4799 <849c> <849c> 5312 <84a1> <84a1> 4962 <84b2> <84b2> 7564 <84b8> <84b8> 6939 <84bb> <84bb> 5876 <84bc> <84bc> 7113 <84bf> <84bf> 7832 <84c0> <84c0> 5549 <84c2> <84c2> 4758 <84c4> <84c4> 7295 <84c6> <84c6> 5415 <84c9> <84c9> 6193 <84cb> <84cb> 3576 <84cd> <84cd> 5713 <84d1> <84d1> 5288 <84da> <84da> 5608 <84ec> <84ec> 5104 <84ee> <84ee> 4473 <84f4> <84f4> 5659 <84fc> <84fc> 4560 <8511> <8511> 4747 <8513> <8513> 4684 <8514> <8514> 5084 <8517> <8517> 6504 <8518> <8518> 5325 <851a> <851a> 6250 <851e> <851e> 4573 <8521> <8521> 7123 <8523> <8523> 6562 <8525> <8525> 7259 <852c> <852c> 5527 <852d> <852d> 6383 <852f> <852f> 7004 <853d> <853d> 7541 <853f> <853f> 6301 <8541> <8541> 4229 <8543> <8543> 5002 <8549> <8549> 7235 <854e> <854e> 3885 <8553> <8553> 6245 <8559> <8559> 7796 <8563> <8563> 5660 <8568> <8568> 3981 <8569> <8569> 7430 <856a> <856a> 4829 <856d> <856d> 5528 <8584> <8584> 4901 <8587> <8587> 4865 <858f> <858f> 6407 <8591> <8591> 3554 <8594> <8594> 6563 <859b> <859b> 5457 <85a6> <85a6> 7159 <85a8> <85a8> 7989 <85a9> <85a9> 5319 <85aa> <85aa> 5751 <85af> <85af> 5396 <85b0> <85b0> 7986 <85ba> <85ba> 6772 <85c1> <85c1> 3757 <85c9> <85c9> 6505 <85cd> <85cd> 4406 <85ce> <85ce> 5752 <85cf> <85cf> 6564 <85d5> <85d5> 6220 <85dc> <85dc> 4451 <85dd> <85dd> 6040 <85e4> <85e4> 4370 <85e5> <85e5> 5877 <85e9> <85e9> 5003 <85ea> <85ea> 5609 <85f7> <85f7> 6611 <85fa> <85fa> 4642 endcidrange 100 begincidrange <85fb> <85fb> 6816 <85ff> <85ff> 3817 <8602> <8602> 6041 <8606> <8606> 4520 <8607> <8607> 5529 <860a> <860a> 6088 <8616> <8616> 5924 <8617> <8617> 5028 <861a> <861a> 5441 <862d> <862d> 4395 <863f> <863f> 4378 <864e> <864e> 7833 <8650> <8650> 7632 <8654> <8654> 3609 <8655> <8655> 7133 <865b> <865b> 7721 <865c> <865c> 4521 <865e> <865e> 6221 <865f> <865f> 7834 <8667> <8667> 8009 <8679> <8679> 7860 <868a> <868a> 4845 <868c> <868c> 4963 <8693> <8693> 6456 <86a3> <86a3> 3799 <86a4> <86a4> 6817 <86a9> <86a9> 7355 <86c7> <86c7> 5289 <86cb> <86cb> 4208 <86d4> <86d4> 7945 <86d9> <86d9> 6104 <86db> <86db> 6889 <86df> <86df> 3886 <86e4> <86e4> 7666 <86ed> <86ed> 7026 <86fe> <86fe> 5785 <8700> <8700> 7245 <8702> <8702> 5105 <8703> <8703> 5753 <8708> <8708> 6074 <8718> <8718> 6970 <871a> <871a> 5214 <871c> <871c> 4884 <874e> <874e> 3508 <8755> <8755> 5730 <8757> <8757> 7924 <875f> <875f> 6302 <8766> <8766> 7625 <8768> <8768> 5676 <8774> <8774> 7835 <8776> <8776> 6703 <8778> <8778> 6105 <8782> <8782> 4418 <878d> <878d> 6372 <879f> <879f> 4759 <87a2> <87a2> 7785 <87b3> <87b3> 4248 <87ba> <87ba> 4379 <87c4> <87c4> 7376 <87e0> <87e0> 4926 <87ec> <87ec> 5442 <87ef> <87ef> 6162 <87f2> <87f2> 7309 <87f9> <87f9> 7696 <87fb> <87fb> 6408 <87fe> <87fe> 5467 <8805> <8805> 5690 <881f> <881f> 4411 <8822> <8822> 6916 <8823> <8823> 4452 <8831> <8831> 3758 <8836> <8836> 6532 <883b> <883b> 4685 <8840> <8840> 7756 <8846> <8846> 6924 <884c> <884c> 7709 <884d> <884d> 5981 <8852> <8852> 7750 <8853> <8853> 5668 <8857> <8857> 3457 <8859> <8859> 5786 <885b> <885b> 6303 <885d> <885d> 7310 <8861> <8861> 7786 <8862> <8862> 3934 <8863> <8863> 6409 <8868> <8868> 7585 <886b> <886b> 5326 <8870> <8870> 5565 <8872> <8872> 4151 <8877> <8877> 7311 <887e> <887f> 4047 <8881> <8881> 6275 <8882> <8882> 4763 <8888> <8888> 3458 <888b> <888b> 4262 <888d> <888d> 7565 <8892> <8892> 4209 <8896> <8896> 5610 <8897> <8897> 7005 endcidrange 100 begincidrange <889e> <889e> 3782 <88ab> <88ab> 7601 <88b4> <88b4> 3759 <88c1> <88c1> 6582 <88c2> <88c2> 4482 <88cf> <88cf> 4632 <88d4> <88d4> 6042 <88d5> <88d5> 6343 <88d9> <88d9> 3956 <88dc> <88dc> 5070 <88dd> <88dd> 6565 <88df> <88df> 5290 <88e1> <88e1> 4633 <88e8> <88e8> 5215 <88f3> <88f3> 5356 <88f4> <88f5> 4981 <88f8> <88f8> 4380 <88fd> <88fd> 6773 <8907> <8907> 5085 <8910> <8910> 3507 <8912> <8912> 7566 <8913> <8913> 5071 <8918> <8918> 6304 <8919> <8919> 4983 <8925> <8925> 6172 <892a> <892a> 7462 <8936> <8936> 5680 <8938> <8938> 4574 <893b> <893b> 5458 <8941> <8941> 3555 <8944> <8944> 5897 <895f> <895f> 4049 <8964> <8964> 4407 <896a> <896a> 4694 <8972> <8972> 5681 <897f> <897f> 5397 <8981> <8981> 6163 <8983> <8983> 4230 <8986> <8986> 5086 <8987> <8987> 7511 <898b> <898b> 3644 <898f> <898f> 4005 <8993> <8993> 4734 <8996> <8996> 5714 <89a1> <89a1> 3635 <89a9> <89a9> 4298 <89aa> <89aa> 7363 <89b2> <89b2> 4034 <89ba> <89ba> 3473 <89bd> <89bd> 4408 <89c0> <89c0> 3831 <89d2> <89d2> 3474 <89e3> <89e3> 7697 <89f4> <89f4> 5357 <89f8> <89f8> 7246 <8a00> <8a00> 5921 <8a02> <8a02> 6745 <8a03> <8a03> 5139 <8a08> <8a08> 3724 <8a0a> <8a0a> 5754 <8a0c> <8a0c> 7861 <8a0e> <8a0e> 7452 <8a13> <8a13> 7987 <8a16> <8a16> 8026 <8a17> <8a17> 7406 <8a18> <8a18> 4114 <8a1b> <8a1b> 6106 <8a1d> <8a1d> 5787 <8a1f> <8a1f> 5557 <8a23> <8a23> 3653 <8a25> <8a25> 4182 <8a2a> <8a2a> 4964 <8a2d> <8a2d> 5459 <8a31> <8a31> 7722 <8a34> <8a34> 5530 <8a36> <8a36> 3459 <8a3a> <8a3a> 7006 <8a3b> <8a3b> 6890 <8a50> <8a50> 5291 <8a54> <8a54> 6818 <8a55> <8a55> 7533 <8a5b> <8a5b> 6612 <8a5e> <8a5e> 5292 <8a60> <8a60> 6025 <8a62> <8a62> 5661 <8a63> <8a63> 6043 <8a66> <8a66> 5715 <8a69> <8a69> 5716 <8a6d> <8a6d> 3987 <8a6e> <8a6e> 6673 <8a70> <8a70> 8055 <8a71> <8a71> 7873 <8a72> <8a72> 7698 <8a73> <8a73> 5358 <8a75> <8a75> 5443 <8a79> <8a79> 7185 <8a85> <8a85> 6891 <8a87> <8a87> 3809 <8a8c> <8a8c> 6971 <8a8d> <8a8d> 6457 endcidrange 100 begincidrange <8a93> <8a93> 5398 <8a95> <8a95> 7417 <8a98> <8a98> 6344 <8a9e> <8a9e> 5908 <8aa0> <8aa0> 5490 <8aa1> <8aa1> 3725 <8aa3> <8aa3> 4830 <8aa4> <8aa4> 6075 <8aa5> <8aa5> 3760 <8aa6> <8aa6> 5558 <8aa8> <8aa8> 7946 <8aaa> <8aaa> 5460 <8ab0> <8ab0> 5611 <8ab2> <8ab2> 3810 <8ab9> <8ab9> 5216 <8abc> <8abc> 6410 <8abe> <8abe> 6377 <8abf> <8abf> 6819 <8ac2> <8ac2> 7186 <8ac4> <8ac4> 5662 <8ac7> <8ac7> 4231 <8acb> <8acb> 7202 <8acd> <8acd> 6589 <8acf> <8acf> 7276 <8ad2> <8ad2> 4437 <8ad6> <8ad6> 4535 <8adb> <8adb> 6345 <8adc> <8adc> 7194 <8ae1> <8ae1> 5717 <8ae6> <8ae6> 7210 <8ae7> <8ae7> 7699 <8aea> <8aea> 6746 <8aeb> <8aeb> 3498 <8aed> <8aed> 6346 <8aee> <8aee> 6506 <8af1> <8af1> 8002 <8af6> <8af6> 5770 <8af7> <8af7> 7593 <8af8> <8af8> 6774 <8afa> <8afa> 5922 <8afe> <8afe> 4139 <8b00> <8b00> 4785 <8b01> <8b01> 5818 <8b02> <8b02> 6305 <8b04> <8b04> 4371 <8b0e> <8b0e> 4866 <8b10> <8b10> 4885 <8b14> <8b14> 7633 <8b16> <8b16> 5543 <8b17> <8b17> 4965 <8b19> <8b19> 3657 <8b1a> <8b1a> 6442 <8b1b> <8b1b> 3556 <8b1d> <8b1d> 5293 <8b20> <8b20> 6164 <8b28> <8b28> 4786 <8b2b> <8b2b> 6634 <8b2c> <8b2c> 4589 <8b33> <8b33> 3935 <8b39> <8b39> 4035 <8b41> <8b41> 7874 <8b49> <8b49> 6940 <8b4e> <8b4e> 8011 <8b4f> <8b4f> 4115 <8b58> <8b58> 5731 <8b5a> <8b5a> 4232 <8b5c> <8b5c> 5072 <8b66> <8b66> 3697 <8b6c> <8b6c> 5217 <8b6f> <8b6f> 5953 <8b70> <8b70> 6411 <8b74> <8b74> 3645 <8b77> <8b77> 7836 <8b7d> <8b7d> 6044 <8b80> <8b80> 4318 <8b8a> <8b8a> 5033 <8b90> <8b90> 5612 <8b92> <8b92> 7090 <8b93> <8b93> 5898 <8b96> <8b96> 7091 <8b9a> <8b9a> 7072 <8c37> <8c37> 3772 <8c3f> <8c3f> 3726 <8c41> <8c41> 7902 <8c46> <8c46> 4355 <8c48> <8c48> 4116 <8c4a> <8c4a> 7594 <8c4c> <8c4c> 6122 <8c55> <8c55> 5718 <8c5a> <8c5a> 4327 <8c61> <8c61> 5359 <8c6a> <8c6a> 7837 <8c6b> <8c6b> 6045 <8c79> <8c79> 7586 <8c7a> <8c7a> 5719 <8c82> <8c82> 7236 <8c8a> <8c8a> 4723 <8c8c> <8c8c> 4787 <8c9d> <8c9d> 7512 <8c9e> <8c9e> 6747 endcidrange 100 begincidrange <8ca0> <8ca0> 5140 <8ca1> <8ca1> 6583 <8ca2> <8ca2> 3800 <8ca7> <8ca7> 5234 <8ca8> <8ca8> 7875 <8ca9> <8ca9> 7495 <8caa> <8caa> 7423 <8cab> <8cab> 3832 <8cac> <8cac> 7129 <8caf> <8caf> 6613 <8cb0> <8cb0> 5499 <8cb3> <8cb3> 6433 <8cb4> <8cb4> 3992 <8cb6> <8cb6> 7528 <8cb7> <8cb7> 4718 <8cb8> <8cb8> 4263 <8cbb> <8cbb> 5218 <8cbc> <8cbc> 7195 <8cbd> <8cbd> 6432 <8cbf> <8cbf> 4831 <8cc0> <8cc0> 7626 <8cc1> <8cc1> 5169 <8cc2> <8cc2> 4547 <8cc3> <8cc3> 6476 <8cc4> <8cc4> 7947 <8cc7> <8cc7> 6507 <8cc8> <8cc8> 3460 <8cca> <8cca> 6635 <8cd1> <8cd1> 7007 <8cd3> <8cd3> 5235 <8cda> <8cda> 4548 <8cdc> <8cdc> 5294 <8cde> <8cde> 5360 <8ce0> <8ce0> 4984 <8ce2> <8ce2> 7751 <8ce3> <8ce3> 4719 <8ce4> <8ce4> 7160 <8ce6> <8ce6> 5141 <8cea> <8cea> 7027 <8ced> <8ced> 4299 <8cf4> <8cf4> 4549 <8cfb> <8cfb> 5142 <8cfc> <8cfc> 3936 <8cfd> <8cfd> 5364 <8d04> <8d04> 6972 <8d05> <8d05> 7315 <8d07> <8d07> 6365 <8d08> <8d08> 6941 <8d0a> <8d0a> 7073 <8d0d> <8d0d> 5468 <8d13> <8d13> 6566 <8d16> <8d16> 5544 <8d64> <8d64> 6636 <8d66> <8d66> 5295 <8d6b> <8d6b> 7732 <8d70> <8d70> 6892 <8d73> <8d73> 4006 <8d74> <8d74> 5143 <8d77> <8d77> 4117 <8d85> <8d85> 7237 <8d8a> <8d8a> 6282 <8d99> <8d99> 6820 <8da3> <8da3> 7326 <8da8> <8da8> 7277 <8db3> <8db3> 6830 <8dba> <8dba> 5144 <8dbe> <8dbe> 6973 <8dc6> <8dc6> 7442 <8dcb> <8dcb> 4936 <8dcc> <8dcc> 7028 <8dcf> <8dcf> 3461 <8ddb> <8ddb> 7488 <8ddd> <8ddd> 3596 <8de1> <8de1> 6637 <8de3> <8de3> 5444 <8de8> <8de8> 3811 <8def> <8def> 4522 <8df3> <8df3> 4300 <8e0a> <8e0a> 6194 <8e0f> <8e0f> 4237 <8e10> <8e10> 7161 <8e1e> <8e1e> 3597 <8e2a> <8e2a> 6850 <8e30> <8e30> 6347 <8e35> <8e35> 6851 <8e42> <8e42> 6348 <8e44> <8e44> 6775 <8e47> <8e47> 3610 <8e48> <8e48> 4301 <8e49> <8e49> 7052 <8e4a> <8e4a> 7797 <8e59> <8e59> 7296 <8e5f> <8e5f> 6638 <8e60> <8e60> 7145 <8e74> <8e74> 7297 <8e76> <8e76> 3982 <8e81> <8e81> 6821 <8e87> <8e87> 6614 <8e8a> <8e8a> 6893 <8e8d> <8e8d> 5878 endcidrange 100 begincidrange <8eaa> <8eaa> 4643 <8eab> <8eab> 5755 <8eac> <8eac> 3968 <8ec0> <8ec0> 3937 <8eca> <8eca> 7053 <8ecb> <8ecb> 5819 <8ecc> <8ecc> 3988 <8ecd> <8ecd> 3957 <8ed2> <8ed2> 7726 <8edf> <8edf> 5982 <8eeb> <8eeb> 7008 <8ef8> <8ef8> 7298 <8efb> <8efb> 3462 <8efe> <8efe> 5732 <8f03> <8f03> 3887 <8f05> <8f05> 4523 <8f09> <8f09> 6584 <8f12> <8f12> 7196 <8f13> <8f13> 4686 <8f14> <8f14> 5073 <8f15> <8f15> 3698 <8f1b> <8f1b> 4438 <8f1c> <8f1c> 7356 <8f1d> <8f1d> 8003 <8f1e> <8f1e> 4706 <8f1f> <8f1f> 7174 <8f26> <8f26> 4474 <8f27> <8f27> 5055 <8f29> <8f29> 4985 <8f2a> <8f2a> 4599 <8f2f> <8f2f> 7035 <8f33> <8f33> 6894 <8f38> <8f38> 5613 <8f39> <8f39> 5087 <8f3b> <8f3b> 5088 <8f3e> <8f3e> 6674 <8f3f> <8f3f> 5944 <8f44> <8f44> 7650 <8f45> <8f45> 6276 <8f49> <8f49> 6675 <8f4d> <8f4d> 7175 <8f4e> <8f4e> 3888 <8f5d> <8f5d> 5945 <8f5f> <8f5f> 3867 <8f62> <8f62> 4463 <8f9b> <8f9b> 5756 <8f9c> <8f9c> 3761 <8fa3> <8fa3> 4398 <8fa6> <8fa6> 7496 <8fa8> <8fa8> 5034 <8fad> <8fad> 5296 <8faf> <8faf> 5035 <8fb0> <8fb0> 7009 <8fb1> <8fb1> 6173 <8fb2> <8fb2> 4177 <8fc2> <8fc2> 6222 <8fc5> <8fc5> 5757 <8fce> <8fce> 6026 <8fd1> <8fd1> 4036 <8fd4> <8fd4> 4927 <8fe6> <8fe6> 3463 <8fea> <8fea> 6639 <8feb> <8feb> 4902 <8fed> <8fed> 7029 <8ff0> <8ff0> 5669 <8ff2> <8ff2> 3626 <8ff7> <8ff7> 4867 <8ff9> <8ff9> 6640 <8ffd> <8ffd> 7278 <9000> <9000> 7463 <9001> <9001> 5559 <9002> <9002> 3838 <9003> <9003> 4302 <9005> <9005> 7978 <9006> <9006> 5954 <9008> <9008> 7787 <900b> <900b> 7567 <900d> <900d> 5531 <900f> <900f> 7469 <9010> <9010> 7299 <9011> <9011> 3938 <9014> <9014> 4303 <9015> <9015> 3699 <9017> <9017> 4356 <9019> <9019> 6615 <901a> <901a> 7458 <901d> <901d> 5399 <901e> <901e> 4500 <901f> <901f> 5545 <9020> <9020> 6822 <9021> <9021> 6917 <9022> <9022> 5106 <9023> <9023> 4475 <902e> <902e> 7211 <9031> <9031> 6895 <9032> <9032> 7010 <9035> <9035> 4007 <9038> <9038> 6466 <903c> <903c> 7615 <903e> <903e> 6350 endcidrange 100 begincidrange <9041> <9041> 4361 <9042> <9042> 5614 <9047> <9047> 6223 <904a> <904a> 6349 <904b> <904b> 6246 <904d> <904d> 7525 <904e> <904e> 3812 <9050> <9050> 7627 <9051> <9051> 7925 <9053> <9053> 4304 <9054> <9054> 4216 <9055> <9055> 6306 <9059> <9059> 6165 <905c> <905c> 5550 <905d> <905d> 4238 <905e> <905e> 7212 <9060> <9060> 6277 <9061> <9061> 5532 <9063> <9063> 3646 <9069> <9069> 6641 <906d> <906d> 6823 <906e> <906e> 7054 <906f> <906f> 4362 <9072> <9072> 6974 <9075> <9075> 6918 <9077> <9077> 7162 <9078> <9078> 5445 <907a> <907a> 6351 <907c> <907c> 4561 <907d> <907d> 3598 <907f> <907f> 7602 <9080> <9080> 6166 <9081> <9081> 4720 <9082> <9082> 7700 <9083> <9083> 5615 <9084> <9084> 7896 <9087> <9087> 6434 <9088> <9088> 4669 <908a> <908a> 5036 <908f> <908f> 4381 <9091> <9091> 6389 <9095> <9095> 6096 <9099> <9099> 4707 <90a2> <90a2> 7788 <90a3> <90a3> 4138 <90a6> <90a6> 4966 <90a8> <90a8> 7250 <90aa> <90aa> 5297 <90af> <90af> 3526 <90b0> <90b0> 7443 <90b1> <90b1> 3939 <90b5> <90b5> 5533 <90b8> <90b8> 6616 <90c1> <90c1> 6236 <90ca> <90ca> 3889 <90de> <90de> 4419 <90e1> <90e1> 3958 <90e8> <90e8> 5145 <90ed> <90ed> 3818 <90f5> <90f5> 6224 <90fd> <90fd> 4305 <9102> <9102> 5802 <9112> <9112> 7279 <9115> <9115> 7714 <9119> <9119> 5219 <9127> <9127> 4372 <912d> <912d> 6748 <9132> <9132> 4210 <9149> <9149> 6352 <914a> <914a> 6749 <914b> <914b> 7280 <914c> <914c> 6519 <914d> <914d> 4986 <914e> <914e> 6896 <9152> <9152> 6897 <9162> <9162> 7238 <9169> <9169> 4760 <916a> <916a> 4387 <916c> <916c> 5616 <9175> <9175> 7964 <9177> <9177> 7843 <9178> <9178> 5313 <9187> <9187> 5663 <9189> <9189> 7327 <918b> <918b> 7239 <918d> <918d> 6776 <9192> <9192> 5491 <919c> <919c> 7281 <91ab> <91ab> 6412 <91ac> <91ac> 6567 <91ae> <91ae> 7240 <91af> <91af> 7798 <91b1> <91b1> 4937 <91b4> <91b4> 4509 <91b5> <91b5> 3584 <91c0> <91c0> 5899 <91c7> <91c7> 7124 <91c9> <91c9> 6353 <91cb> <91cb> 5416 <91cc> <91cc> 4634 endcidrange 100 begincidrange <91cd> <91cd> 6925 <91ce> <91ce> 5871 <91cf> <91cf> 4439 <91d0> <91d0> 4635 <91d1> <91d1> 4131 <91d7> <91d7> 5566 <91d8> <91d8> 6750 <91dc> <91dc> 5146 <91dd> <91dd> 7374 <91e3> <91e3> 6824 <91e7> <91e7> 7163 <91ea> <91ea> 6225 <91f5> <91f5> 7125 <920d> <920d> 4363 <9210> <9210> 3622 <9211> <9211> 7497 <9212> <9212> 5329 <9217> <9217> 6366 <921e> <921e> 4014 <9234> <9234> 4501 <923a> <923a> 6082 <923f> <923f> 6676 <9240> <9240> 3534 <9245> <9245> 3599 <9249> <9249> 7752 <9257> <9257> 3658 <925b> <925b> 5983 <925e> <925e> 6283 <9262> <9262> 4938 <9264> <9264> 3940 <9265> <9265> 5670 <9266> <9266> 6751 <9280> <9280> 6378 <9283> <9283> 7260 <9285> <9285> 4347 <9291> <9291> 5446 <9293> <9293> 6677 <9296> <9296> 5617 <9298> <9298> 4761 <929c> <929c> 7660 <92b3> <92b3> 6046 <92b6> <92b6> 3941 <92b7> <92b7> 5534 <92b9> <92b9> 5618 <92cc> <92cc> 6752 <92cf> <92cf> 7769 <92d2> <92d2> 5107 <92e4> <92e4> 5400 <92ea> <92ea> 7568 <92f8> <92f8> 3600 <92fc> <92fc> 3557 <9304> <9304> 4532 <9310> <9310> 7282 <9318> <9318> 7283 <931a> <931a> 6590 <931e> <931e> 5664 <931f> <931f> 4233 <9320> <9320> 6753 <9321> <9321> 4118 <9322> <9322> 6678 <9324> <9324> 4119 <9326> <9326> 4050 <9328> <9328> 4811 <932b> <932b> 5417 <932e> <932e> 3762 <932f> <932f> 7059 <9348> <9348> 6027 <934a> <934a> 4476 <934b> <934b> 3813 <934d> <934d> 4306 <9354> <9354> 5803 <935b> <935b> 4211 <936e> <936e> 6354 <9375> <9375> 3611 <937c> <937c> 7375 <937e> <937e> 6852 <938c> <938c> 3659 <9394> <9394> 6195 <9396> <9396> 5564 <939a> <939a> 7284 <93a3> <93a3> 7789 <93a7> <93a7> 3577 <93ac> <93ac> 7838 <93ad> <93ad> 7011 <93b0> <93b0> 6467 <93c3> <93c3> 6831 <93d1> <93d1> 6642 <93de> <93de> 6196 <93e1> <93e1> 3700 <93e4> <93e4> 4575 <93f6> <93f6> 7036 <9404> <9404> 7952 <9418> <9418> 6853 <9425> <9425> 5447 <942b> <942b> 6679 <9435> <9435> 7176 <9438> <9438> 7407 <9444> <9444> 6898 <9451> <9452> 3527 <945b> <945b> 3851 endcidrange 100 begincidrange <947d> <947d> 7074 <947f> <947f> 7060 <9577> <9577> 6568 <9580> <9580> 4846 <9583> <9583> 5469 <9589> <9589> 7542 <958b> <958b> 3578 <958f> <958f> 6367 <9591> <9592> 7645 <9593> <9593> 3499 <9594> <9594> 4882 <9598> <9598> 3535 <95a3> <95a3> 3475 <95a4> <95a4> 7667 <95a5> <95a5> 5008 <95a8> <95a8> 4008 <95ad> <95ad> 4453 <95b1> <95b1> 5988 <95bb> <95bb> 5996 <95bc> <95bc> 5820 <95c7> <95c7> 5828 <95ca> <95ca> 7903 <95d4> <95d4> 7668 <95d5> <95d5> 3983 <95d6> <95d6> 7473 <95dc> <95dc> 3833 <95e1> <95e1> 7164 <95e2> <95e2> 5029 <961c> <961c> 5147 <9621> <9621> 7165 <962a> <962a> 7498 <962e> <962e> 6123 <9632> <9632> 4967 <963b> <963b> 6825 <963f> <963f> 5788 <9640> <9640> 7391 <9642> <9642> 7603 <9644> <9644> 5148 <964b> <964b> 4576 <964c> <964c> 4724 <964d> <964d> 3558 <9650> <9650> 7647 <965b> <965b> 7543 <965c> <965c> 7669 <965d> <965d> 5470 <965e> <965e> 5691 <965f> <965f> 7146 <9662> <9662> 6278 <9663> <9663> 7012 <9664> <9664> 6777 <966a> <966a> 4987 <9670> <9670> 6384 <9673> <9673> 7013 <9675> <9675> 4612 <9676> <9676> 4307 <9677> <9677> 7661 <9678> <9678> 4593 <967d> <967d> 5900 <9685> <9685> 6226 <9686> <9686> 4603 <968a> <968a> 4264 <968b> <968b> 5619 <968d> <968d> 7926 <968e> <968e> 3727 <9694> <9694> 3636 <9695> <9695> 6247 <9698> <9698> 5849 <9699> <9699> 4022 <969b> <969b> 6778 <969c> <969c> 6569 <96a3> <96a3> 4644 <96a7> <96a8> 5620 <96aa> <96aa> 7728 <96b1> <96b1> 6379 <96b7> <96b7> 4510 <96bb> <96bb> 7147 <96c0> <96c0> 6520 <96c1> <96c1> 5813 <96c4> <96c4> 6254 <96c5> <96c5> 5789 <96c6> <96c6> 7037 <96c7> <96c7> 3763 <96c9> <96c9> 7357 <96cb> <96cb> 6919 <96cc> <96cc> 6508 <96cd> <96cd> 6097 <96ce> <96ce> 6617 <96d5> <96d5> 6826 <96d6> <96d6> 5622 <96d9> <96d9> 5773 <96db> <96db> 7285 <96dc> <96dc> 6533 <96e2> <96e2> 4636 <96e3> <96e3> 4142 <96e8> <96e9> 6227 <96ea> <96ea> 5461 <96ef> <96ef> 4847 <96f0> <96f0> 5170 <96f2> <96f2> 6248 <96f6> <96f6> 4502 endcidrange 100 begincidrange <96f7> <96f7> 4550 <96f9> <96f9> 4903 <96fb> <96fb> 6680 <9700> <9700> 5623 <9706> <9706> 6754 <9707> <9707> 7014 <9711> <9711> 6698 <9713> <9713> 6047 <9716> <9716> 4651 <9719> <9719> 6028 <971c> <971c> 5361 <971e> <971e> 7628 <9727> <9727> 4832 <9730> <9730> 5314 <9732> <9732> 4524 <9739> <9739> 5030 <973d> <973d> 6779 <9742> <9742> 4464 <9744> <9744> 5850 <9748> <9748> 4503 <9751> <9751> 7203 <9756> <9756> 6755 <975c> <975c> 6756 <975e> <975e> 5220 <9761> <9761> 4868 <9762> <9762> 4744 <9769> <9769> 7733 <976d> <976d> 6458 <9774> <9774> 7876 <9777> <9777> 6459 <977a> <977a> 4695 <978b> <978b> 7799 <978d> <978d> 5814 <978f> <978f> 3801 <97a0> <97a0> 3950 <97a8> <97a8> 3509 <97ab> <97ab> 3951 <97ad> <97ad> 7526 <97c6> <97c6> 7166 <97cb> <97cb> 6307 <97d3> <97d3> 7648 <97dc> <97dc> 4308 <97f3> <97f3> 6385 <97f6> <97f6> 5535 <97fb> <97fb> 6249 <97ff> <97ff> 7715 <9800> <9800> 7839 <9801> <9801> 7757 <9802> <9802> 6757 <9803> <9803> 3701 <9805> <9805> 7684 <9806> <9806> 5665 <9808> <9808> 5624 <980a> <980a> 6237 <980c> <980c> 5560 <9810> <9810> 6048 <9811> <9811> 6124 <9812> <9812> 4928 <9813> <9813> 4328 <9817> <9817> 7489 <9818> <9818> 4504 <982d> <982d> 4357 <9830> <9830> 7770 <9838> <9838> 3702 <9839> <9839> 7464 <983b> <983b> 5236 <9846> <9846> 3814 <984c> <984c> 6780 <984d> <984d> 5857 <984e> <984e> 5804 <9854> <9854> 5815 <9858> <9858> 6279 <985a> <985a> 6681 <985e> <985e> 4590 <9865> <9865> 7840 <9867> <9867> 3764 <986b> <986b> 6682 <986f> <986f> 7753 <98a8> <98a8> 7595 <98af> <98af> 5330 <98b1> <98b1> 7444 <98c4> <98c4> 7588 <98c7> <98c7> 7587 <98db> <98db> 5221 <98dc> <98dc> 5004 <98df> <98df> 5733 <98e1> <98e1> 5551 <98e2> <98e2> 4120 <98ed> <98ed> 7362 <98ee> <98ee> 6386 <98ef> <98ef> 4929 <98f4> <98f4> 6435 <98fc> <98fc> 5298 <98fd> <98fd> 7569 <98fe> <98fe> 5734 <9903> <9903> 3890 <9909> <9909> 7716 <990a> <990a> 5901 <990c> <990c> 6436 <9910> <9910> 7075 endcidrange 100 begincidrange <9913> <9913> 5790 <9918> <9918> 5946 <991e> <991e> 6683 <9920> <9920> 5056 <9928> <9928> 3834 <9945> <9945> 4687 <9949> <9949> 4037 <994b> <994b> 3989 <994c> <994c> 7076 <994d> <994d> 5448 <9951> <9951> 4121 <9952> <9952> 6167 <9954> <9954> 6098 <9957> <9957> 7717 <9996> <9996> 5625 <9999> <9999> 7718 <999d> <999d> 7613 <99a5> <99a5> 5089 <99a8> <99a8> 7790 <99ac> <99ac> 4661 <99ad> <99ad> 5909 <99ae> <99ae> 7596 <99b1> <99b1> 7392 <99b3> <99b3> 7358 <99b4> <99b4> 5666 <99b9> <99b9> 6468 <99c1> <99c1> 4904 <99d0> <99d0> 6899 <99d1> <99d1> 4174 <99d2> <99d2> 3942 <99d5> <99d5> 3464 <99d9> <99d9> 5149 <99dd> <99dd> 7393 <99df> <99df> 5299 <99ed> <99ed> 7701 <99f1> <99f1> 4388 <99ff> <99ff> 6920 <9a01> <9a01> 5240 <9a08> <9a08> 5057 <9a0e> <9a0f> 4122 <9a19> <9a19> 7527 <9a2b> <9a2b> 3612 <9a30> <9a30> 4373 <9a36> <9a36> 7286 <9a37> <9a37> 5536 <9a40> <9a40> 4725 <9a43> <9a43> 7589 <9a45> <9a45> 3943 <9a4d> <9a4d> 7965 <9a55> <9a55> 3891 <9a57> <9a57> 7729 <9a5a> <9a5a> 3703 <9a5b> <9a5b> 5955 <9a5f> <9a5f> 7328 <9a62> <9a62> 4454 <9a65> <9a65> 4124 <9a69> <9a69> 7897 <9a6a> <9a6a> 4455 <9aa8> <9aa8> 3785 <9ab8> <9ab8> 7702 <9ad3> <9ad3> 5626 <9ad4> <9ad4> 7213 <9ad8> <9ad8> 3765 <9ae5> <9ae5> 5997 <9aee> <9aee> 4939 <9b1a> <9b1a> 5627 <9b27> <9b27> 4562 <9b2a> <9b2a> 7470 <9b31> <9b31> 6251 <9b3c> <9b3c> 3993 <9b41> <9b41> 3863 <9b42> <9b42> 7849 <9b43> <9b43> 4940 <9b44> <9b44> 4995 <9b45> <9b45> 4721 <9b4f> <9b4f> 6308 <9b54> <9b54> 4662 <9b5a> <9b5a> 5910 <9b6f> <9b6f> 4525 <9b8e> <9b8e> 6699 <9b91> <9b91> 7570 <9b9f> <9b9f> 5816 <9bab> <9bab> 3892 <9bae> <9bae> 5449 <9bc9> <9bc9> 4637 <9bd6> <9bd6> 7204 <9be4> <9be4> 3783 <9be8> <9be8> 3704 <9c0d> <9c0d> 7287 <9c10> <9c10> 5805 <9c12> <9c12> 5090 <9c15> <9c15> 7629 <9c25> <9c25> 7898 <9c32> <9c32> 6076 <9c3b> <9c3b> 4688 <9c47> <9c47> 3559 <9c49> <9c49> 5039 <9c57> <9c57> 4645 <9ce5> <9ce5> 6827 <9ce7> <9ce7> 5150 endcidrange 100 begincidrange <9ce9> <9ce9> 3944 <9cf3> <9cf3> 5108 <9cf4> <9cf4> 4762 <9cf6> <9cf6> 5984 <9d09> <9d09> 5791 <9d1b> <9d1b> 6280 <9d26> <9d26> 5839 <9d28> <9d28> 5832 <9d3b> <9d3b> 7862 <9d51> <9d51> 3647 <9d5d> <9d5d> 5792 <9d60> <9d60> 3773 <9d61> <9d61> 4833 <9d6c> <9d6c> 5180 <9d72> <9d72> 6521 <9da9> <9da9> 4794 <9daf> <9daf> 5860 <9db4> <9db4> 7634 <9dc4> <9dc4> 3728 <9dd7> <9dd7> 3945 <9df2> <9df2> 7329 <9df8> <9df8> 8012 <9df9> <9df9> 6393 <9dfa> <9dfa> 4526 <9e1a> <9e1a> 5861 <9e1e> <9e1e> 4396 <9e75> <9e75> 4527 <9e79> <9e79> 7662 <9e7d> <9e7d> 5998 <9e7f> <9e7f> 4533 <9e92> <9e92> 4125 <9e93> <9e93> 4534 <9e97> <9e97> 4456 <9e9d> <9e9d> 5300 <9e9f> <9e9f> 4646 <9ea5> <9ea5> 4726 <9eb4> <9eb4> 3952 <9eb5> <9eb5> 4745 <9ebb> <9ebb> 4663 <9ebe> <9ebe> 8004 <9ec3> <9ec3> 7927 <9ecd> <9ecd> 5401 <9ece> <9ece> 4457 <9ed1> <9ed1> 8018 <9ed4> <9ed4> 3623 <9ed8> <9ed8> 4835 <9edb> <9edb> 4265 <9edc> <9edc> 7305 <9ede> <9ede> 6700 <9ee8> <9ee8> 4249 <9ef4> <9ef4> 4869 <9f07> <9f07> 6077 <9f08> <9f08> 5040 <9f0e> <9f0e> 6758 <9f13> <9f13> 3766 <9f20> <9f20> 5402 <9f3b> <9f3b> 5222 <9f4a> <9f4a> 6781 <9f4b> <9f4b> 6585 <9f4e> <9f4e> 6586 <9f52> <9f52> 7359 <9f5f> <9f5f> 6618 <9f61> <9f61> 4505 <9f67> <9f67> 5462 <9f6a> <9f6a> 7061 <9f6c> <9f6c> 5911 <9f77> <9f77> 5806 <9f8d> <9f8d> 4563 <9f90> <9f90> 4968 <9f95> <9f95> 3529 <9f9c> <9f9c> 3946 <ac00> <ac01> 1086 <ac02> <ac03> 9333 <ac04> <ac04> 1088 <ac05> <ac06> 9335 <ac07> <ac0a> 1089 <ac0b> <ac0f> 9337 <ac10> <ac17> 1093 <ac18> <ac18> 9342 <ac19> <ac1d> 1101 <ac1e> <ac1f> 9343 <ac20> <ac20> 1106 <ac21> <ac23> 9345 <ac24> <ac24> 1107 <ac25> <ac2b> 9348 <ac2c> <ac2d> 1108 <ac2e> <ac2e> 9355 <ac2f> <ac31> 1110 <ac32> <ac37> 9356 <ac38> <ac39> 1113 <ac3a> <ac3b> 9362 <ac3c> <ac3c> 1115 <ac3d> <ac3f> 9364 <ac40> <ac40> 1116 <ac41> <ac4a> 9367 <ac4b> <ac4b> 1117 <ac4c> <ac4c> 9377 <ac4d> <ac4d> 1118 <ac4e> <ac53> 9378 <ac54> <ac54> 1119 endcidrange 100 begincidrange <ac55> <ac57> 9384 <ac58> <ac58> 1120 <ac59> <ac5b> 9387 <ac5c> <ac5c> 1121 <ac5d> <ac6f> 9390 <ac70> <ac71> 1122 <ac72> <ac73> 9409 <ac74> <ac74> 1124 <ac75> <ac76> 9411 <ac77> <ac78> 1125 <ac79> <ac79> 9413 <ac7a> <ac7a> 1127 <ac7b> <ac7f> 9414 <ac80> <ac81> 1128 <ac82> <ac82> 9419 <ac83> <ac86> 1130 <ac87> <ac88> 9420 <ac89> <ac8c> 1134 <ac8d> <ac8f> 9422 <ac90> <ac90> 1138 <ac91> <ac93> 9425 <ac94> <ac94> 1139 <ac95> <ac9b> 9428 <ac9c> <ac9d> 1140 <ac9e> <ac9e> 9435 <ac9f> <aca1> 1142 <aca2> <aca7> 9436 <aca8> <acaa> 1145 <acab> <acab> 9442 <acac> <acac> 1148 <acad> <acae> 9443 <acaf> <acb0> 1149 <acb1> <acb7> 9445 <acb8> <acb9> 1151 <acba> <acba> 9452 <acbb> <acbd> 1153 <acbe> <acc0> 9453 <acc1> <acc1> 1156 <acc2> <acc3> 9456 <acc4> <acc4> 1157 <acc5> <acc7> 9458 <acc8> <acc8> 1158 <acc9> <accb> 9461 <accc> <accc> 1159 <accd> <acd4> 9464 <acd5> <acd5> 1160 <acd6> <acd6> 9472 <acd7> <acd7> 1161 <acd8> <acdf> 9473 <ace0> <ace1> 1162 <ace2> <ace3> 9481 <ace4> <ace4> 1164 <ace5> <ace6> 9483 <ace7> <ace8> 1165 <ace9> <ace9> 9485 <acea> <acea> 1167 <aceb> <aceb> 9486 <acec> <acec> 1168 <aced> <acee> 9487 <acef> <acf1> 1169 <acf2> <acf2> 9489 <acf3> <acf3> 1172 <acf4> <acf4> 9490 <acf5> <acf6> 1173 <acf7> <acfb> 9491 <acfc> <acfd> 1175 <acfe> <acff> 9496 <ad00> <ad00> 1177 <ad01> <ad03> 9498 <ad04> <ad04> 1178 <ad05> <ad05> 9501 <ad06> <ad06> 1179 <ad07> <ad0b> 9502 <ad0c> <ad0d> 1180 <ad0e> <ad0e> 9507 <ad0f> <ad0f> 1182 <ad10> <ad10> 9508 <ad11> <ad11> 1183 <ad12> <ad17> 9509 <ad18> <ad18> 1184 <ad19> <ad1b> 9515 <ad1c> <ad1c> 1185 <ad1d> <ad1f> 9518 <ad20> <ad20> 1186 <ad21> <ad28> 9521 <ad29> <ad29> 1187 <ad2a> <ad2b> 9529 <ad2c> <ad2d> 1188 <ad2e> <ad33> 9531 <ad34> <ad35> 1190 <ad36> <ad37> 9537 <ad38> <ad38> 1192 <ad39> <ad3b> 9539 <ad3c> <ad3c> 1193 <ad3d> <ad43> 9542 <ad44> <ad45> 1194 <ad46> <ad46> 9549 <ad47> <ad47> 1196 <ad48> <ad48> 9550 <ad49> <ad49> 1197 endcidrange 100 begincidrange <ad4a> <ad4f> 9551 <ad50> <ad50> 1198 <ad51> <ad53> 9557 <ad54> <ad54> 1199 <ad55> <ad57> 9560 <ad58> <ad58> 1200 <ad59> <ad60> 9563 <ad61> <ad61> 1201 <ad62> <ad62> 9571 <ad63> <ad63> 1202 <ad64> <ad6b> 9572 <ad6c> <ad6d> 1203 <ad6e> <ad6f> 9580 <ad70> <ad70> 1205 <ad71> <ad72> 9582 <ad73> <ad76> 1206 <ad77> <ad7a> 9584 <ad7b> <ad7d> 1210 <ad7e> <ad7e> 9588 <ad7f> <ad7f> 1213 <ad80> <ad80> 9589 <ad81> <ad82> 1214 <ad83> <ad87> 9590 <ad88> <ad89> 1216 <ad8a> <ad8b> 9595 <ad8c> <ad8c> 1218 <ad8d> <ad8f> 9597 <ad90> <ad90> 1219 <ad91> <ad9b> 9600 <ad9c> <ad9d> 1220 <ad9e> <ada3> 9611 <ada4> <ada4> 1222 <ada5> <adb6> 9617 <adb7> <adb7> 1223 <adb8> <adbf> 9635 <adc0> <adc1> 1224 <adc2> <adc3> 9643 <adc4> <adc4> 1226 <adc5> <adc7> 9645 <adc8> <adc8> 1227 <adc9> <adcf> 9648 <add0> <add1> 1228 <add2> <add2> 9655 <add3> <add3> 1230 <add4> <addb> 9656 <addc> <addc> 1231 <addd> <addf> 9664 <ade0> <ade0> 1232 <ade1> <ade3> 9667 <ade4> <ade4> 1233 <ade5> <adf7> 9670 <adf8> <adf9> 1234 <adfa> <adfb> 9689 <adfc> <adfc> 1236 <adfd> <adfe> 9691 <adff> <adff> 1237 <ae00> <ae01> 1238 <ae02> <ae07> 9693 <ae08> <ae09> 1240 <ae0a> <ae0a> 9699 <ae0b> <ae0b> 1242 <ae0c> <ae0c> 9700 <ae0d> <ae0d> 1243 <ae0e> <ae13> 9701 <ae14> <ae14> 1244 <ae15> <ae2f> 9707 <ae30> <ae31> 1245 <ae32> <ae33> 9734 <ae34> <ae34> 1247 <ae35> <ae36> 9736 <ae37> <ae38> 1248 <ae39> <ae39> 9738 <ae3a> <ae3a> 1250 <ae3b> <ae3f> 9739 <ae40> <ae41> 1251 <ae42> <ae42> 9744 <ae43> <ae43> 1253 <ae44> <ae44> 9745 <ae45> <ae46> 1254 <ae47> <ae49> 9746 <ae4a> <ae4a> 1256 <ae4b> <ae4b> 9749 <ae4c> <ae4e> 1257 <ae4f> <ae4f> 9750 <ae50> <ae50> 1260 <ae51> <ae53> 9751 <ae54> <ae54> 1261 <ae55> <ae55> 9754 <ae56> <ae56> 1262 <ae57> <ae5b> 9755 <ae5c> <ae5d> 1263 <ae5e> <ae5e> 9760 <ae5f> <ae61> 1265 <ae62> <ae64> 9761 <ae65> <ae65> 1268 <ae66> <ae67> 9764 <ae68> <ae69> 1269 <ae6a> <ae6b> 9766 <ae6c> <ae6c> 1271 <ae6d> <ae6f> 9768 endcidrange 100 begincidrange <ae70> <ae70> 1272 <ae71> <ae77> 9771 <ae78> <ae79> 1273 <ae7a> <ae7a> 9778 <ae7b> <ae7d> 1275 <ae7e> <ae83> 9779 <ae84> <ae85> 1278 <ae86> <ae8b> 9785 <ae8c> <ae8c> 1280 <ae8d> <aebb> 9791 <aebc> <aebe> 1281 <aebf> <aebf> 9838 <aec0> <aec0> 1284 <aec1> <aec3> 9839 <aec4> <aec4> 1285 <aec5> <aecb> 9842 <aecc> <aecd> 1286 <aece> <aece> 9849 <aecf> <aed1> 1288 <aed2> <aed7> 9850 <aed8> <aed9> 1291 <aeda> <aedb> 9856 <aedc> <aedc> 1293 <aedd> <aee7> 9858 <aee8> <aee8> 1294 <aee9> <aeea> 9869 <aeeb> <aeeb> 1295 <aeec> <aeec> 9871 <aeed> <aeed> 1296 <aeee> <aef3> 9872 <aef4> <aef4> 1297 <aef5> <aef7> 9878 <aef8> <aef8> 1298 <aef9> <aefb> 9881 <aefc> <aefc> 1299 <aefd> <aeff> 9884 <af00> <af06> 9887 <af07> <af08> 1300 <af09> <af0c> 9894 <af0d> <af0d> 1302 <af0e> <af0f> 9898 <af10> <af10> 1303 <af11> <af2b> 9900 <af2c> <af2d> 1304 <af2e> <af2f> 9927 <af30> <af30> 1306 <af31> <af31> 9929 <af32> <af32> 1307 <af33> <af33> 9930 <af34> <af34> 1308 <af35> <af3b> 9931 <af3c> <af3d> 1309 <af3e> <af3e> 9938 <af3f> <af3f> 1311 <af40> <af40> 9939 <af41> <af43> 1312 <af44> <af47> 9940 <af48> <af49> 1315 <af4a> <af4f> 9944 <af50> <af50> 1317 <af51> <af5b> 9950 <af5c> <af5d> 1318 <af5e> <af63> 9961 <af64> <af65> 1320 <af66> <af78> 9967 <af79> <af79> 1322 <af7a> <af7f> 9986 <af80> <af80> 1323 <af81> <af83> 9992 <af84> <af84> 1324 <af85> <af87> 9995 <af88> <af88> 1325 <af89> <af8f> 9998 <af90> <af91> 1326 <af92> <af94> 10005 <af95> <af95> 1328 <af96> <af9b> 10008 <af9c> <af9c> 1329 <af9d> <afb7> 10014 <afb8> <afb9> 1330 <afba> <afbb> 10041 <afbc> <afbc> 1332 <afbd> <afbf> 10043 <afc0> <afc0> 1333 <afc1> <afc6> 10046 <afc7> <afc9> 1334 <afca> <afca> 10052 <afcb> <afcb> 1337 <afcc> <afcc> 10053 <afcd> <afce> 1338 <afcf> <afd3> 10054 <afd4> <afd4> 1340 <afd5> <afdb> 10059 <afdc> <afdc> 1341 <afdd> <afe7> 10066 <afe8> <afe9> 1342 <afea> <afef> 10077 <aff0> <aff1> 1344 <aff2> <aff3> 10083 <aff4> <aff4> 1346 endcidrange 100 begincidrange <aff5> <aff7> 10085 <aff8> <aff8> 1347 <aff9> <afff> 10088 <b000> <b001> 1348 <b002> <b003> 10095 <b004> <b004> 1350 <b005> <b00b> 10097 <b00c> <b00c> 1351 <b00d> <b00f> 10104 <b010> <b010> 1352 <b011> <b013> 10107 <b014> <b014> 1353 <b015> <b01b> 10110 <b01c> <b01d> 1354 <b01e> <b027> 10117 <b028> <b028> 1356 <b029> <b043> 10127 <b044> <b045> 1357 <b046> <b047> 10154 <b048> <b048> 1359 <b049> <b049> 10156 <b04a> <b04a> 1360 <b04b> <b04b> 10157 <b04c> <b04c> 1361 <b04d> <b04d> 10158 <b04e> <b04e> 1362 <b04f> <b052> 10159 <b053> <b055> 1363 <b056> <b056> 10163 <b057> <b057> 1366 <b058> <b058> 10164 <b059> <b059> 1367 <b05a> <b05c> 10165 <b05d> <b05d> 1368 <b05e> <b07b> 10168 <b07c> <b07d> 1369 <b07e> <b07f> 10198 <b080> <b080> 1371 <b081> <b083> 10200 <b084> <b084> 1372 <b085> <b08b> 10203 <b08c> <b08d> 1373 <b08e> <b08e> 10210 <b08f> <b08f> 1375 <b090> <b090> 10211 <b091> <b091> 1376 <b092> <b097> 10212 <b098> <b09a> 1377 <b09b> <b09b> 10218 <b09c> <b09c> 1380 <b09d> <b09e> 10219 <b09f> <b0a2> 1381 <b0a3> <b0a7> 10221 <b0a8> <b0a9> 1385 <b0aa> <b0aa> 10226 <b0ab> <b0af> 1387 <b0b0> <b0b0> 10227 <b0b1> <b0b1> 1392 <b0b2> <b0b2> 10228 <b0b3> <b0b5> 1393 <b0b6> <b0b7> 10229 <b0b8> <b0b8> 1396 <b0b9> <b0bb> 10231 <b0bc> <b0bc> 1397 <b0bd> <b0c3> 10234 <b0c4> <b0c5> 1398 <b0c6> <b0c6> 10241 <b0c7> <b0c9> 1400 <b0ca> <b0cf> 10242 <b0d0> <b0d1> 1403 <b0d2> <b0d3> 10248 <b0d4> <b0d4> 1405 <b0d5> <b0d7> 10250 <b0d8> <b0d8> 1406 <b0d9> <b0df> 10253 <b0e0> <b0e0> 1407 <b0e1> <b0e4> 10260 <b0e5> <b0e5> 1408 <b0e6> <b0ff> 10264 <b100> <b107> 10290 <b108> <b109> 1409 <b10a> <b10a> 10298 <b10b> <b10c> 1411 <b10d> <b10f> 10299 <b110> <b110> 1413 <b111> <b111> 10302 <b112> <b113> 1414 <b114> <b117> 10303 <b118> <b119> 1416 <b11a> <b11a> 10307 <b11b> <b11d> 1418 <b11e> <b122> 10308 <b123> <b125> 1421 <b126> <b127> 10313 <b128> <b128> 1424 <b129> <b12b> 10315 <b12c> <b12c> 1425 <b12d> <b133> 10318 <b134> <b135> 1426 <b136> <b136> 10325 endcidrange 100 begincidrange <b137> <b139> 1428 <b13a> <b13f> 10326 <b140> <b141> 1431 <b142> <b143> 10332 <b144> <b144> 1433 <b145> <b147> 10334 <b148> <b148> 1434 <b149> <b14f> 10337 <b150> <b151> 1435 <b152> <b153> 10344 <b154> <b155> 1437 <b156> <b157> 10346 <b158> <b158> 1439 <b159> <b15b> 10348 <b15c> <b15c> 1440 <b15d> <b15f> 10351 <b160> <b160> 1441 <b161> <b177> 10354 <b178> <b179> 1442 <b17a> <b17b> 10377 <b17c> <b17c> 1444 <b17d> <b17f> 10379 <b180> <b180> 1445 <b181> <b181> 10382 <b182> <b182> 1446 <b183> <b187> 10383 <b188> <b189> 1447 <b18a> <b18a> 10388 <b18b> <b18b> 1449 <b18c> <b18c> 10389 <b18d> <b18d> 1450 <b18e> <b191> 10390 <b192> <b194> 1451 <b195> <b197> 10394 <b198> <b198> 1454 <b199> <b19b> 10397 <b19c> <b19c> 1455 <b19d> <b1a7> 10400 <b1a8> <b1a8> 1456 <b1a9> <b1cb> 10411 <b1cc> <b1cc> 1457 <b1cd> <b1cf> 10446 <b1d0> <b1d0> 1458 <b1d1> <b1d3> 10449 <b1d4> <b1d4> 1459 <b1d5> <b1db> 10452 <b1dc> <b1dd> 1460 <b1de> <b1de> 10459 <b1df> <b1df> 1462 <b1e0> <b1e7> 10460 <b1e8> <b1e9> 1463 <b1ea> <b1eb> 10468 <b1ec> <b1ec> 1465 <b1ed> <b1ef> 10470 <b1f0> <b1f0> 1466 <b1f1> <b1f8> 10473 <b1f9> <b1f9> 1467 <b1fa> <b1fa> 10481 <b1fb> <b1fb> 1468 <b1fc> <b1fc> 10482 <b1fd> <b1fd> 1469 <b1fe> <b1ff> 10483 <b200> <b203> 10485 <b204> <b205> 1470 <b206> <b207> 10489 <b208> <b208> 1472 <b209> <b20a> 10491 <b20b> <b20c> 1473 <b20d> <b213> 10493 <b214> <b215> 1475 <b216> <b216> 10500 <b217> <b217> 1477 <b218> <b218> 10501 <b219> <b219> 1478 <b21a> <b21f> 10502 <b220> <b220> 1479 <b221> <b233> 10508 <b234> <b234> 1480 <b235> <b23b> 10527 <b23c> <b23c> 1481 <b23d> <b257> 10534 <b258> <b258> 1482 <b259> <b25b> 10561 <b25c> <b25c> 1483 <b25d> <b25f> 10564 <b260> <b260> 1484 <b261> <b267> 10567 <b268> <b269> 1485 <b26a> <b273> 10574 <b274> <b275> 1487 <b276> <b27b> 10584 <b27c> <b27c> 1489 <b27d> <b283> 10590 <b284> <b285> 1490 <b286> <b288> 10597 <b289> <b289> 1492 <b28a> <b28f> 10600 <b290> <b291> 1493 <b292> <b293> 10606 <b294> <b294> 1495 endcidrange 100 begincidrange <b295> <b297> 10608 <b298> <b29a> 1496 <b29b> <b29f> 10611 <b2a0> <b2a1> 1499 <b2a2> <b2a2> 10616 <b2a3> <b2a3> 1501 <b2a4> <b2a4> 10617 <b2a5> <b2a6> 1502 <b2a7> <b2a9> 10618 <b2aa> <b2aa> 1504 <b2ab> <b2ab> 10621 <b2ac> <b2ac> 1505 <b2ad> <b2af> 10622 <b2b0> <b2b0> 1506 <b2b1> <b2b3> 10625 <b2b4> <b2b4> 1507 <b2b5> <b2c7> 10628 <b2c8> <b2c9> 1508 <b2ca> <b2cb> 10647 <b2cc> <b2cc> 1510 <b2cd> <b2cf> 10649 <b2d0> <b2d0> 1511 <b2d1> <b2d1> 10652 <b2d2> <b2d2> 1512 <b2d3> <b2d7> 10653 <b2d8> <b2d9> 1513 <b2da> <b2da> 10658 <b2db> <b2db> 1515 <b2dc> <b2dc> 10659 <b2dd> <b2dd> 1516 <b2de> <b2e1> 10660 <b2e2> <b2e2> 1517 <b2e3> <b2e3> 10664 <b2e4> <b2e6> 1518 <b2e7> <b2e7> 10665 <b2e8> <b2e8> 1521 <b2e9> <b2ea> 10666 <b2eb> <b2ef> 1522 <b2f0> <b2f2> 10668 <b2f3> <b2f5> 1527 <b2f6> <b2f6> 10671 <b2f7> <b2fb> 1530 <b2fc> <b2fe> 10672 <b2ff> <b2ff> 1535 <b300> <b301> 1536 <b302> <b303> 10675 <b304> <b304> 1538 <b305> <b307> 10677 <b308> <b308> 1539 <b309> <b30f> 10680 <b310> <b311> 1540 <b312> <b312> 10687 <b313> <b315> 1542 <b316> <b31b> 10688 <b31c> <b31c> 1545 <b31d> <b353> 10694 <b354> <b356> 1546 <b357> <b357> 10749 <b358> <b358> 1549 <b359> <b35a> 10750 <b35b> <b35c> 1550 <b35d> <b35d> 10752 <b35e> <b35f> 1552 <b360> <b363> 10753 <b364> <b365> 1554 <b366> <b366> 10757 <b367> <b367> 1556 <b368> <b368> 10758 <b369> <b369> 1557 <b36a> <b36a> 10759 <b36b> <b36b> 1558 <b36c> <b36d> 10760 <b36e> <b36e> 1559 <b36f> <b36f> 10762 <b370> <b371> 1560 <b372> <b373> 10763 <b374> <b374> 1562 <b375> <b377> 10765 <b378> <b378> 1563 <b379> <b37f> 10768 <b380> <b381> 1564 <b382> <b382> 10775 <b383> <b385> 1566 <b386> <b38b> 10776 <b38c> <b38c> 1569 <b38d> <b38f> 10782 <b390> <b390> 1570 <b391> <b393> 10785 <b394> <b394> 1571 <b395> <b39f> 10788 <b3a0> <b3a1> 1572 <b3a2> <b3a7> 10799 <b3a8> <b3a8> 1574 <b3a9> <b3ab> 10805 <b3ac> <b3ac> 1575 <b3ad> <b3c3> 10808 <b3c4> <b3c5> 1576 <b3c6> <b3c7> 10831 <b3c8> <b3c8> 1578 <b3c9> <b3ca> 10833 endcidrange 100 begincidrange <b3cb> <b3cc> 1579 <b3cd> <b3cd> 10835 <b3ce> <b3ce> 1581 <b3cf> <b3cf> 10836 <b3d0> <b3d0> 1582 <b3d1> <b3d3> 10837 <b3d4> <b3d5> 1583 <b3d6> <b3d6> 10840 <b3d7> <b3d7> 1585 <b3d8> <b3d8> 10841 <b3d9> <b3d9> 1586 <b3da> <b3da> 10842 <b3db> <b3db> 1587 <b3dc> <b3dc> 10843 <b3dd> <b3dd> 1588 <b3de> <b3df> 10844 <b3e0> <b3e0> 1589 <b3e1> <b3e3> 10846 <b3e4> <b3e4> 1590 <b3e5> <b3e7> 10849 <b3e8> <b3e8> 1591 <b3e9> <b3fb> 10852 <b3fc> <b3fc> 1592 <b3fd> <b3ff> 10871 <b400> <b40f> 10874 <b410> <b410> 1593 <b411> <b417> 10890 <b418> <b418> 1594 <b419> <b41b> 10897 <b41c> <b41c> 1595 <b41d> <b41f> 10900 <b420> <b420> 1596 <b421> <b427> 10903 <b428> <b429> 1597 <b42a> <b42a> 10910 <b42b> <b42b> 1599 <b42c> <b433> 10911 <b434> <b434> 1600 <b435> <b44f> 10919 <b450> <b451> 1601 <b452> <b453> 10946 <b454> <b454> 1603 <b455> <b457> 10948 <b458> <b458> 1604 <b459> <b45f> 10951 <b460> <b461> 1605 <b462> <b462> 10958 <b463> <b463> 1607 <b464> <b464> 10959 <b465> <b465> 1608 <b466> <b46b> 10960 <b46c> <b46c> 1609 <b46d> <b47f> 10966 <b480> <b480> 1610 <b481> <b487> 10985 <b488> <b488> 1611 <b489> <b49c> 10992 <b49d> <b49d> 1612 <b49e> <b4a3> 11012 <b4a4> <b4a4> 1613 <b4a5> <b4a7> 11018 <b4a8> <b4a8> 1614 <b4a9> <b4ab> 11021 <b4ac> <b4ac> 1615 <b4ad> <b4b4> 11024 <b4b5> <b4b5> 1616 <b4b6> <b4b6> 11032 <b4b7> <b4b7> 1617 <b4b8> <b4b8> 11033 <b4b9> <b4b9> 1618 <b4ba> <b4bf> 11034 <b4c0> <b4c0> 1619 <b4c1> <b4c3> 11040 <b4c4> <b4c4> 1620 <b4c5> <b4c7> 11043 <b4c8> <b4c8> 1621 <b4c9> <b4cf> 11046 <b4d0> <b4d0> 1622 <b4d1> <b4d4> 11053 <b4d5> <b4d5> 1623 <b4d6> <b4db> 11057 <b4dc> <b4dd> 1624 <b4de> <b4df> 11063 <b4e0> <b4e0> 1626 <b4e1> <b4e2> 11065 <b4e3> <b4e4> 1627 <b4e5> <b4e5> 11067 <b4e6> <b4e6> 1629 <b4e7> <b4eb> 11068 <b4ec> <b4ed> 1630 <b4ee> <b4ee> 11073 <b4ef> <b4ef> 1632 <b4f0> <b4f0> 11074 <b4f1> <b4f1> 1633 <b4f2> <b4f7> 11075 <b4f8> <b4f8> 1634 <b4f9> <b4ff> 11081 <b500> <b513> 11088 <b514> <b515> 1635 <b516> <b517> 11108 endcidrange 100 begincidrange <b518> <b518> 1637 <b519> <b51a> 11110 <b51b> <b51c> 1638 <b51d> <b523> 11112 <b524> <b525> 1640 <b526> <b526> 11119 <b527> <b52a> 1642 <b52b> <b52f> 11120 <b530> <b531> 1646 <b532> <b533> 11125 <b534> <b534> 1648 <b535> <b537> 11127 <b538> <b538> 1649 <b539> <b53f> 11130 <b540> <b541> 1650 <b542> <b542> 11137 <b543> <b545> 1652 <b546> <b54a> 11138 <b54b> <b54d> 1655 <b54e> <b54f> 11143 <b550> <b550> 1658 <b551> <b553> 11145 <b554> <b554> 1659 <b555> <b55b> 11148 <b55c> <b55d> 1660 <b55e> <b55e> 11155 <b55f> <b561> 1662 <b562> <b59f> 11156 <b5a0> <b5a1> 1665 <b5a2> <b5a3> 11218 <b5a4> <b5a4> 1667 <b5a5> <b5a7> 11220 <b5a8> <b5a8> 1668 <b5a9> <b5a9> 11223 <b5aa> <b5ab> 1669 <b5ac> <b5af> 11224 <b5b0> <b5b1> 1671 <b5b2> <b5b2> 11228 <b5b3> <b5b5> 1673 <b5b6> <b5ba> 11229 <b5bb> <b5bd> 1676 <b5be> <b5bf> 11234 <b5c0> <b5c0> 1679 <b5c1> <b5c3> 11236 <b5c4> <b5c4> 1680 <b5c5> <b5cb> 11239 <b5cc> <b5cd> 1681 <b5ce> <b5ce> 11246 <b5cf> <b5d1> 1683 <b5d2> <b5d7> 11247 <b5d8> <b5d8> 1686 <b5d9> <b5eb> 11253 <b5ec> <b5ec> 1687 <b5ed> <b5ff> 11272 <b600> <b60f> 11291 <b610> <b611> 1688 <b612> <b613> 11307 <b614> <b614> 1690 <b615> <b617> 11309 <b618> <b618> 1691 <b619> <b624> 11312 <b625> <b625> 1692 <b626> <b62b> 11324 <b62c> <b62c> 1693 <b62d> <b633> 11330 <b634> <b634> 1694 <b635> <b647> 11337 <b648> <b648> 1695 <b649> <b663> 11356 <b664> <b664> 1696 <b665> <b667> 11383 <b668> <b668> 1697 <b669> <b69b> 11386 <b69c> <b69d> 1698 <b69e> <b69f> 11437 <b6a0> <b6a0> 1700 <b6a1> <b6a3> 11439 <b6a4> <b6a4> 1701 <b6a5> <b6aa> 11442 <b6ab> <b6ac> 1702 <b6ad> <b6b0> 11448 <b6b1> <b6b1> 1704 <b6b2> <b6d3> 11452 <b6d4> <b6d4> 1705 <b6d5> <b6ef> 11486 <b6f0> <b6f0> 1706 <b6f1> <b6f3> 11513 <b6f4> <b6f4> 1707 <b6f5> <b6f7> 11516 <b6f8> <b6f8> 1708 <b6f9> <b6ff> 11519 <b700> <b701> 1709 <b702> <b704> 11526 <b705> <b705> 1711 <b706> <b727> 11529 <b728> <b729> 1712 <b72a> <b72b> 11563 <b72c> <b72c> 1714 <b72d> <b72e> 11565 <b72f> <b730> 1715 endcidrange 100 begincidrange <b731> <b737> 11567 <b738> <b739> 1717 <b73a> <b73a> 11574 <b73b> <b73b> 1719 <b73c> <b743> 11575 <b744> <b744> 1720 <b745> <b747> 11583 <b748> <b748> 1721 <b749> <b74b> 11586 <b74c> <b74c> 1722 <b74d> <b753> 11589 <b754> <b755> 1723 <b756> <b75f> 11596 <b760> <b760> 1725 <b761> <b763> 11606 <b764> <b764> 1726 <b765> <b767> 11609 <b768> <b768> 1727 <b769> <b76f> 11612 <b770> <b771> 1728 <b772> <b772> 11619 <b773> <b773> 1730 <b774> <b774> 11620 <b775> <b775> 1731 <b776> <b77b> 11621 <b77c> <b77d> 1732 <b77e> <b77f> 11627 <b780> <b780> 1734 <b781> <b783> 11629 <b784> <b784> 1735 <b785> <b78b> 11632 <b78c> <b78d> 1736 <b78e> <b78e> 11639 <b78f> <b792> 1738 <b793> <b795> 11640 <b796> <b799> 1742 <b79a> <b79b> 11643 <b79c> <b79c> 1746 <b79d> <b79f> 11645 <b7a0> <b7a0> 1747 <b7a1> <b7a7> 11648 <b7a8> <b7a9> 1748 <b7aa> <b7aa> 11655 <b7ab> <b7ad> 1750 <b7ae> <b7b3> 11656 <b7b4> <b7b5> 1753 <b7b6> <b7b7> 11662 <b7b8> <b7b8> 1755 <b7b9> <b7c6> 11664 <b7c7> <b7c7> 1756 <b7c8> <b7c8> 11678 <b7c9> <b7c9> 1757 <b7ca> <b7eb> 11679 <b7ec> <b7ed> 1758 <b7ee> <b7ef> 11713 <b7f0> <b7f0> 1760 <b7f1> <b7f3> 11715 <b7f4> <b7f4> 1761 <b7f5> <b7fb> 11718 <b7fc> <b7fd> 1762 <b7fe> <b7fe> 11725 <b7ff> <b7ff> 1764 <b800> <b801> 1765 <b802> <b806> 11726 <b807> <b809> 1767 <b80a> <b80b> 11731 <b80c> <b80c> 1770 <b80d> <b80f> 11733 <b810> <b810> 1771 <b811> <b817> 11736 <b818> <b819> 1772 <b81a> <b81a> 11743 <b81b> <b81b> 1774 <b81c> <b81c> 11744 <b81d> <b81d> 1775 <b81e> <b823> 11745 <b824> <b825> 1776 <b826> <b827> 11751 <b828> <b828> 1778 <b829> <b82b> 11753 <b82c> <b82c> 1779 <b82d> <b833> 11756 <b834> <b835> 1780 <b836> <b836> 11763 <b837> <b839> 1782 <b83a> <b83f> 11764 <b840> <b840> 1785 <b841> <b843> 11770 <b844> <b844> 1786 <b845> <b850> 11773 <b851> <b851> 1787 <b852> <b852> 11785 <b853> <b853> 1788 <b854> <b85b> 11786 <b85c> <b85d> 1789 <b85e> <b85f> 11794 <b860> <b860> 1791 <b861> <b863> 11796 <b864> <b864> 1792 <b865> <b86b> 11799 endcidrange 100 begincidrange <b86c> <b86d> 1793 <b86e> <b86e> 11806 <b86f> <b86f> 1795 <b870> <b870> 11807 <b871> <b871> 1796 <b872> <b877> 11808 <b878> <b878> 1797 <b879> <b87b> 11814 <b87c> <b87c> 1798 <b87d> <b88c> 11817 <b88d> <b88d> 1799 <b88e> <b8a7> 11833 <b8a8> <b8a8> 1800 <b8a9> <b8af> 11859 <b8b0> <b8b0> 1801 <b8b1> <b8b3> 11866 <b8b4> <b8b4> 1802 <b8b5> <b8b7> 11869 <b8b8> <b8b8> 1803 <b8b9> <b8bf> 11872 <b8c0> <b8c1> 1804 <b8c2> <b8c2> 11879 <b8c3> <b8c3> 1806 <b8c4> <b8c4> 11880 <b8c5> <b8c5> 1807 <b8c6> <b8cb> 11881 <b8cc> <b8cc> 1808 <b8cd> <b8cf> 11887 <b8d0> <b8d0> 1809 <b8d1> <b8d3> 11890 <b8d4> <b8d4> 1810 <b8d5> <b8dc> 11893 <b8dd> <b8dd> 1811 <b8de> <b8de> 11901 <b8df> <b8df> 1812 <b8e0> <b8e0> 11902 <b8e1> <b8e1> 1813 <b8e2> <b8e7> 11903 <b8e8> <b8e9> 1814 <b8ea> <b8eb> 11909 <b8ec> <b8ec> 1816 <b8ed> <b8ef> 11911 <b8f0> <b8f0> 1817 <b8f1> <b8f7> 11914 <b8f8> <b8f9> 1818 <b8fa> <b8fa> 11921 <b8fb> <b8fb> 1820 <b8fc> <b8fc> 11922 <b8fd> <b8fd> 1821 <b8fe> <b8ff> 11923 <b900> <b903> 11925 <b904> <b904> 1822 <b905> <b917> 11929 <b918> <b918> 1823 <b919> <b91f> 11948 <b920> <b920> 1824 <b921> <b93b> 11955 <b93c> <b93d> 1825 <b93e> <b93f> 11982 <b940> <b940> 1827 <b941> <b943> 11984 <b944> <b944> 1828 <b945> <b94b> 11987 <b94c> <b94c> 1829 <b94d> <b94e> 11994 <b94f> <b94f> 1830 <b950> <b950> 11996 <b951> <b951> 1831 <b952> <b957> 11997 <b958> <b959> 1832 <b95a> <b95b> 12003 <b95c> <b95c> 1834 <b95d> <b95f> 12005 <b960> <b960> 1835 <b961> <b967> 12008 <b968> <b969> 1836 <b96a> <b96a> 12015 <b96b> <b96b> 1838 <b96c> <b96c> 12016 <b96d> <b96d> 1839 <b96e> <b973> 12017 <b974> <b975> 1840 <b976> <b977> 12023 <b978> <b978> 1842 <b979> <b97b> 12025 <b97c> <b97c> 1843 <b97d> <b983> 12028 <b984> <b985> 1844 <b986> <b986> 12035 <b987> <b987> 1846 <b988> <b988> 12036 <b989> <b98a> 1847 <b98b> <b98c> 12037 <b98d> <b98e> 1849 <b98f> <b9ab> 12039 <b9ac> <b9ad> 1851 <b9ae> <b9af> 12068 <b9b0> <b9b0> 1853 <b9b1> <b9b3> 12070 <b9b4> <b9b4> 1854 endcidrange 100 begincidrange <b9b5> <b9bb> 12073 <b9bc> <b9bd> 1855 <b9be> <b9be> 12080 <b9bf> <b9bf> 1857 <b9c0> <b9c0> 12081 <b9c1> <b9c1> 1858 <b9c2> <b9c7> 12082 <b9c8> <b9c9> 1859 <b9ca> <b9cb> 12088 <b9cc> <b9cc> 1861 <b9cd> <b9cd> 12090 <b9ce> <b9d2> 1862 <b9d3> <b9d7> 12091 <b9d8> <b9d9> 1867 <b9da> <b9da> 12096 <b9db> <b9db> 1869 <b9dc> <b9dc> 12097 <b9dd> <b9de> 1870 <b9df> <b9e0> 12098 <b9e1> <b9e1> 1872 <b9e2> <b9e2> 12100 <b9e3> <b9e5> 1873 <b9e6> <b9e7> 12101 <b9e8> <b9e8> 1876 <b9e9> <b9eb> 12103 <b9ec> <b9ec> 1877 <b9ed> <b9f3> 12106 <b9f4> <b9f5> 1878 <b9f6> <b9f6> 12113 <b9f7> <b9fa> 1880 <b9fb> <b9ff> 12114 <ba00> <ba01> 1884 <ba02> <ba07> 12119 <ba08> <ba08> 1886 <ba09> <ba14> 12125 <ba15> <ba15> 1887 <ba16> <ba37> 12137 <ba38> <ba39> 1888 <ba3a> <ba3b> 12171 <ba3c> <ba3c> 1890 <ba3d> <ba3f> 12173 <ba40> <ba40> 1891 <ba41> <ba41> 12176 <ba42> <ba42> 1892 <ba43> <ba47> 12177 <ba48> <ba49> 1893 <ba4a> <ba4a> 12182 <ba4b> <ba4b> 1895 <ba4c> <ba4c> 12183 <ba4d> <ba4e> 1896 <ba4f> <ba52> 12184 <ba53> <ba55> 1898 <ba56> <ba57> 12188 <ba58> <ba58> 1901 <ba59> <ba5b> 12190 <ba5c> <ba5c> 1902 <ba5d> <ba63> 12193 <ba64> <ba65> 1903 <ba66> <ba66> 12200 <ba67> <ba69> 1905 <ba6a> <ba6f> 12201 <ba70> <ba71> 1908 <ba72> <ba73> 12207 <ba74> <ba74> 1910 <ba75> <ba77> 12209 <ba78> <ba78> 1911 <ba79> <ba82> 12212 <ba83> <ba85> 1912 <ba86> <ba86> 12222 <ba87> <ba87> 1915 <ba88> <ba8b> 12223 <ba8c> <ba8c> 1916 <ba8d> <baa7> 12227 <baa8> <baa9> 1917 <baaa> <baaa> 12254 <baab> <baac> 1919 <baad> <baaf> 12255 <bab0> <bab0> 1921 <bab1> <bab1> 12258 <bab2> <bab2> 1922 <bab3> <bab7> 12259 <bab8> <bab9> 1923 <baba> <baba> 12264 <babb> <babb> 1925 <babc> <babc> 12265 <babd> <babd> 1926 <babe> <bac3> 12266 <bac4> <bac4> 1927 <bac5> <bac7> 12272 <bac8> <bac8> 1928 <bac9> <bad7> 12275 <bad8> <bad9> 1929 <bada> <bafb> 12290 <bafc> <bafc> 1931 <bafd> <baff> 12324 <bb00> <bb00> 1932 <bb01> <bb03> 12327 <bb04> <bb04> 1933 <bb05> <bb0c> 12330 <bb0d> <bb0d> 1934 endcidrange 100 begincidrange <bb0e> <bb0e> 12338 <bb0f> <bb0f> 1935 <bb10> <bb10> 12339 <bb11> <bb11> 1936 <bb12> <bb17> 12340 <bb18> <bb18> 1937 <bb19> <bb1b> 12346 <bb1c> <bb1c> 1938 <bb1d> <bb1f> 12349 <bb20> <bb20> 1939 <bb21> <bb28> 12352 <bb29> <bb29> 1940 <bb2a> <bb2a> 12360 <bb2b> <bb2b> 1941 <bb2c> <bb33> 12361 <bb34> <bb36> 1942 <bb37> <bb37> 12369 <bb38> <bb38> 1945 <bb39> <bb3a> 12370 <bb3b> <bb3e> 1946 <bb3f> <bb43> 12372 <bb44> <bb45> 1950 <bb46> <bb46> 12377 <bb47> <bb47> 1952 <bb48> <bb48> 12378 <bb49> <bb49> 1953 <bb4a> <bb4c> 12379 <bb4d> <bb4d> 1954 <bb4e> <bb4e> 12382 <bb4f> <bb50> 1955 <bb51> <bb53> 12383 <bb54> <bb54> 1957 <bb55> <bb57> 12386 <bb58> <bb58> 1958 <bb59> <bb60> 12389 <bb61> <bb61> 1959 <bb62> <bb62> 12397 <bb63> <bb63> 1960 <bb64> <bb6b> 12398 <bb6c> <bb6c> 1961 <bb6d> <bb87> 12406 <bb88> <bb88> 1962 <bb89> <bb8b> 12433 <bb8c> <bb8c> 1963 <bb8d> <bb8f> 12436 <bb90> <bb90> 1964 <bb91> <bba3> 12439 <bba4> <bba4> 1965 <bba5> <bba7> 12458 <bba8> <bba8> 1966 <bba9> <bbab> 12461 <bbac> <bbac> 1967 <bbad> <bbb3> 12464 <bbb4> <bbb4> 1968 <bbb5> <bbb6> 12471 <bbb7> <bbb7> 1969 <bbb8> <bbbf> 12473 <bbc0> <bbc0> 1970 <bbc1> <bbc3> 12481 <bbc4> <bbc4> 1971 <bbc5> <bbc7> 12484 <bbc8> <bbc8> 1972 <bbc9> <bbcf> 12487 <bbd0> <bbd0> 1973 <bbd1> <bbd2> 12494 <bbd3> <bbd3> 1974 <bbd4> <bbf7> 12496 <bbf8> <bbf9> 1975 <bbfa> <bbfb> 12532 <bbfc> <bbfc> 1977 <bbfd> <bbfe> 12534 <bbff> <bbff> 1978 <bc00> <bc00> 1979 <bc01> <bc01> 12536 <bc02> <bc02> 1980 <bc03> <bc07> 12537 <bc08> <bc09> 1981 <bc0a> <bc0a> 12542 <bc0b> <bc0d> 1983 <bc0e> <bc0e> 12543 <bc0f> <bc0f> 1986 <bc10> <bc10> 12544 <bc11> <bc11> 1987 <bc12> <bc13> 12545 <bc14> <bc18> 1988 <bc19> <bc1a> 12547 <bc1b> <bc1f> 1993 <bc20> <bc23> 12549 <bc24> <bc25> 1998 <bc26> <bc26> 12553 <bc27> <bc27> 2000 <bc28> <bc28> 12554 <bc29> <bc29> 2001 <bc2a> <bc2c> 12555 <bc2d> <bc2d> 2002 <bc2e> <bc2f> 12558 <bc30> <bc31> 2003 <bc32> <bc33> 12560 <bc34> <bc34> 2005 <bc35> <bc37> 12562 endcidrange 100 begincidrange <bc38> <bc38> 2006 <bc39> <bc3f> 12565 <bc40> <bc41> 2007 <bc42> <bc42> 12572 <bc43> <bc45> 2009 <bc46> <bc48> 12573 <bc49> <bc49> 2012 <bc4a> <bc4b> 12576 <bc4c> <bc4d> 2013 <bc4e> <bc4f> 12578 <bc50> <bc50> 2015 <bc51> <bc5c> 12580 <bc5d> <bc5d> 2016 <bc5e> <bc83> 12592 <bc84> <bc85> 2017 <bc86> <bc87> 12630 <bc88> <bc88> 2019 <bc89> <bc8a> 12632 <bc8b> <bc8c> 2020 <bc8d> <bc8d> 12634 <bc8e> <bc8e> 2022 <bc8f> <bc93> 12635 <bc94> <bc95> 2023 <bc96> <bc96> 12640 <bc97> <bc97> 2025 <bc98> <bc98> 12641 <bc99> <bc9a> 2026 <bc9b> <bc9f> 12642 <bca0> <bca1> 2028 <bca2> <bca3> 12647 <bca4> <bca4> 2030 <bca5> <bca6> 12649 <bca7> <bca8> 2031 <bca9> <bcaf> 12651 <bcb0> <bcb1> 2033 <bcb2> <bcb2> 12658 <bcb3> <bcb5> 2035 <bcb6> <bcbb> 12659 <bcbc> <bcbd> 2038 <bcbe> <bcbf> 12665 <bcc0> <bcc0> 2040 <bcc1> <bcc3> 12667 <bcc4> <bcc4> 2041 <bcc5> <bccc> 12670 <bccd> <bccd> 2042 <bcce> <bcce> 12678 <bccf> <bcd1> 2043 <bcd2> <bcd4> 12679 <bcd5> <bcd5> 2046 <bcd6> <bcd7> 12682 <bcd8> <bcd8> 2047 <bcd9> <bcdb> 12684 <bcdc> <bcdc> 2048 <bcdd> <bcf3> 12687 <bcf4> <bcf6> 2049 <bcf7> <bcf7> 12710 <bcf8> <bcf8> 2052 <bcf9> <bcfb> 12711 <bcfc> <bcfc> 2053 <bcfd> <bcff> 12714 <bd00> <bd03> 12717 <bd04> <bd05> 2054 <bd06> <bd06> 12721 <bd07> <bd07> 2056 <bd08> <bd08> 12722 <bd09> <bd09> 2057 <bd0a> <bd0f> 12723 <bd10> <bd10> 2058 <bd11> <bd13> 12729 <bd14> <bd14> 2059 <bd15> <bd23> 12732 <bd24> <bd24> 2060 <bd25> <bd2b> 12747 <bd2c> <bd2c> 2061 <bd2d> <bd3f> 12754 <bd40> <bd40> 2062 <bd41> <bd47> 12773 <bd48> <bd49> 2063 <bd4a> <bd4b> 12780 <bd4c> <bd4c> 2065 <bd4d> <bd4f> 12782 <bd50> <bd50> 2066 <bd51> <bd57> 12785 <bd58> <bd59> 2067 <bd5a> <bd63> 12792 <bd64> <bd64> 2069 <bd65> <bd67> 12802 <bd68> <bd68> 2070 <bd69> <bd7f> 12805 <bd80> <bd81> 2071 <bd82> <bd83> 12828 <bd84> <bd84> 2073 <bd85> <bd86> 12830 <bd87> <bd8a> 2074 <bd8b> <bd8f> 12832 <bd90> <bd91> 2078 <bd92> <bd92> 12837 <bd93> <bd93> 2080 <bd94> <bd94> 12838 <bd95> <bd95> 2081 endcidrange 100 begincidrange <bd96> <bd98> 12839 <bd99> <bd9a> 2082 <bd9b> <bd9b> 12842 <bd9c> <bd9c> 2084 <bd9d> <bda3> 12843 <bda4> <bda4> 2085 <bda5> <bdaf> 12850 <bdb0> <bdb0> 2086 <bdb1> <bdb7> 12861 <bdb8> <bdb8> 2087 <bdb9> <bdd3> 12868 <bdd4> <bdd5> 2088 <bdd6> <bdd7> 12895 <bdd8> <bdd8> 2090 <bdd9> <bddb> 12897 <bddc> <bddc> 2091 <bddd> <bde8> 12900 <bde9> <bde9> 2092 <bdea> <bdef> 12912 <bdf0> <bdf0> 2093 <bdf1> <bdf3> 12918 <bdf4> <bdf4> 2094 <bdf5> <bdf7> 12921 <bdf8> <bdf8> 2095 <bdf9> <bdff> 12924 <be00> <be00> 2096 <be01> <be02> 12931 <be03> <be03> 2097 <be04> <be04> 12933 <be05> <be05> 2098 <be06> <be0b> 12934 <be0c> <be0d> 2099 <be0e> <be0f> 12940 <be10> <be10> 2101 <be11> <be13> 12942 <be14> <be14> 2102 <be15> <be1b> 12945 <be1c> <be1d> 2103 <be1e> <be1e> 12952 <be1f> <be1f> 2105 <be20> <be43> 12953 <be44> <be45> 2106 <be46> <be47> 12989 <be48> <be48> 2108 <be49> <be4b> 12991 <be4c> <be4c> 2109 <be4d> <be4d> 12994 <be4e> <be4e> 2110 <be4f> <be53> 12995 <be54> <be55> 2111 <be56> <be56> 13000 <be57> <be57> 2113 <be58> <be58> 13001 <be59> <be5b> 2114 <be5c> <be5f> 13002 <be60> <be61> 2117 <be62> <be63> 13006 <be64> <be64> 2119 <be65> <be67> 13008 <be68> <be68> 2120 <be69> <be69> 13011 <be6a> <be6a> 2121 <be6b> <be6f> 13012 <be70> <be71> 2122 <be72> <be72> 13017 <be73> <be75> 2124 <be76> <be7a> 13018 <be7b> <be7d> 2127 <be7e> <be7f> 13023 <be80> <be80> 2130 <be81> <be83> 13025 <be84> <be84> 2131 <be85> <be8b> 13028 <be8c> <be8d> 2132 <be8e> <be8e> 13035 <be8f> <be91> 2134 <be92> <be97> 13036 <be98> <be99> 2137 <be9a> <bea7> 13042 <bea8> <bea8> 2139 <bea9> <becf> 13056 <bed0> <bed1> 2140 <bed2> <bed3> 13095 <bed4> <bed4> 2142 <bed5> <bed6> 13097 <bed7> <bed8> 2143 <bed9> <bedf> 13099 <bee0> <bee0> 2145 <bee1> <bee2> 13106 <bee3> <bee5> 2146 <bee6> <beeb> 13108 <beec> <beec> 2149 <beed> <beff> 13114 <bf00> <bf00> 13133 <bf01> <bf01> 2150 <bf02> <bf07> 13134 <bf08> <bf09> 2151 <bf0a> <bf17> 13140 <bf18> <bf19> 2153 <bf1a> <bf1a> 13154 endcidrange 100 begincidrange <bf1b> <bf1d> 2155 <bf1e> <bf3f> 13155 <bf40> <bf41> 2158 <bf42> <bf43> 13189 <bf44> <bf44> 2160 <bf45> <bf47> 13191 <bf48> <bf48> 2161 <bf49> <bf4f> 13194 <bf50> <bf51> 2162 <bf52> <bf54> 13201 <bf55> <bf55> 2164 <bf56> <bf93> 13204 <bf94> <bf94> 2165 <bf95> <bfaf> 13266 <bfb0> <bfb0> 2166 <bfb1> <bfc4> 13293 <bfc5> <bfc5> 2167 <bfc6> <bfcb> 13313 <bfcc> <bfcd> 2168 <bfce> <bfcf> 13319 <bfd0> <bfd0> 2170 <bfd1> <bfd3> 13321 <bfd4> <bfd4> 2171 <bfd5> <bfdb> 13324 <bfdc> <bfdc> 2172 <bfdd> <bfde> 13331 <bfdf> <bfdf> 2173 <bfe0> <bfe0> 13333 <bfe1> <bfe1> 2174 <bfe2> <bfff> 13334 <c000> <c03b> 13364 <c03c> <c03c> 2175 <c03d> <c050> 13424 <c051> <c051> 2176 <c052> <c057> 13444 <c058> <c058> 2177 <c059> <c05b> 13450 <c05c> <c05c> 2178 <c05d> <c05f> 13453 <c060> <c060> 2179 <c061> <c067> 13456 <c068> <c069> 2180 <c06a> <c08f> 13463 <c090> <c091> 2182 <c092> <c093> 13501 <c094> <c094> 2184 <c095> <c097> 13503 <c098> <c098> 2185 <c099> <c09f> 13506 <c0a0> <c0a1> 2186 <c0a2> <c0a2> 13513 <c0a3> <c0a3> 2188 <c0a4> <c0a4> 13514 <c0a5> <c0a5> 2189 <c0a6> <c0ab> 13515 <c0ac> <c0ad> 2190 <c0ae> <c0ae> 13521 <c0af> <c0b0> 2192 <c0b1> <c0b2> 13522 <c0b3> <c0b6> 2194 <c0b7> <c0bb> 13524 <c0bc> <c0bd> 2198 <c0be> <c0be> 13529 <c0bf> <c0c1> 2200 <c0c2> <c0c4> 13530 <c0c5> <c0c5> 2203 <c0c6> <c0c7> 13533 <c0c8> <c0c9> 2204 <c0ca> <c0cb> 13535 <c0cc> <c0cc> 2206 <c0cd> <c0cf> 13537 <c0d0> <c0d0> 2207 <c0d1> <c0d7> 13540 <c0d8> <c0d9> 2208 <c0da> <c0da> 13547 <c0db> <c0dd> 2210 <c0de> <c0e3> 13548 <c0e4> <c0e5> 2213 <c0e6> <c0e7> 13554 <c0e8> <c0e8> 2215 <c0e9> <c0eb> 13556 <c0ec> <c0ec> 2216 <c0ed> <c0f3> 13559 <c0f4> <c0f5> 2217 <c0f6> <c0f6> 13566 <c0f7> <c0f7> 2219 <c0f8> <c0f8> 13567 <c0f9> <c0f9> 2220 <c0fa> <c0ff> 13568 <c100> <c100> 2221 <c101> <c103> 13574 <c104> <c104> 2222 <c105> <c107> 13577 <c108> <c108> 2223 <c109> <c10f> 13580 <c110> <c110> 2224 <c111> <c114> 13587 <c115> <c115> 2225 <c116> <c11b> 13591 <c11c> <c120> 2226 endcidrange 100 begincidrange <c121> <c122> 13597 <c123> <c124> 2231 <c125> <c125> 13599 <c126> <c127> 2233 <c128> <c12b> 13600 <c12c> <c12d> 2235 <c12e> <c12e> 13604 <c12f> <c131> 2237 <c132> <c135> 13605 <c136> <c136> 2240 <c137> <c137> 13609 <c138> <c139> 2241 <c13a> <c13b> 13610 <c13c> <c13c> 2243 <c13d> <c13f> 13612 <c140> <c140> 2244 <c141> <c147> 13615 <c148> <c149> 2245 <c14a> <c14a> 13622 <c14b> <c14d> 2247 <c14e> <c153> 13623 <c154> <c155> 2250 <c156> <c157> 13629 <c158> <c158> 2252 <c159> <c15b> 13631 <c15c> <c15c> 2253 <c15d> <c163> 13634 <c164> <c165> 2254 <c166> <c166> 13641 <c167> <c169> 2256 <c16a> <c16f> 13642 <c170> <c170> 2259 <c171> <c173> 13648 <c174> <c174> 2260 <c175> <c177> 13651 <c178> <c178> 2261 <c179> <c184> 13654 <c185> <c185> 2262 <c186> <c18b> 13666 <c18c> <c18e> 2263 <c18f> <c18f> 13672 <c190> <c190> 2266 <c191> <c193> 13673 <c194> <c194> 2267 <c195> <c195> 13676 <c196> <c196> 2268 <c197> <c19b> 13677 <c19c> <c19d> 2269 <c19e> <c19e> 13682 <c19f> <c19f> 2271 <c1a0> <c1a0> 13683 <c1a1> <c1a1> 2272 <c1a2> <c1a4> 13684 <c1a5> <c1a5> 2273 <c1a6> <c1a7> 13687 <c1a8> <c1a9> 2274 <c1aa> <c1ab> 13689 <c1ac> <c1ac> 2276 <c1ad> <c1af> 13691 <c1b0> <c1b0> 2277 <c1b1> <c1bc> 13694 <c1bd> <c1bd> 2278 <c1be> <c1c3> 13706 <c1c4> <c1c4> 2279 <c1c5> <c1c7> 13712 <c1c8> <c1c8> 2280 <c1c9> <c1cb> 13715 <c1cc> <c1cc> 2281 <c1cd> <c1d3> 13718 <c1d4> <c1d4> 2282 <c1d5> <c1d6> 13725 <c1d7> <c1d8> 2283 <c1d9> <c1df> 13727 <c1e0> <c1e0> 2285 <c1e1> <c1e3> 13734 <c1e4> <c1e4> 2286 <c1e5> <c1e7> 13737 <c1e8> <c1e8> 2287 <c1e9> <c1ef> 13740 <c1f0> <c1f1> 2288 <c1f2> <c1f2> 13747 <c1f3> <c1f3> 2290 <c1f4> <c1fb> 13748 <c1fc> <c1fd> 2291 <c1fe> <c1ff> 13756 <c200> <c200> 2293 <c201> <c203> 13758 <c204> <c204> 2294 <c205> <c20b> 13761 <c20c> <c20d> 2295 <c20e> <c20e> 13768 <c20f> <c20f> 2297 <c210> <c210> 13769 <c211> <c211> 2298 <c212> <c217> 13770 <c218> <c219> 2299 <c21a> <c21b> 13776 <c21c> <c21c> 2301 <c21d> <c21e> 13778 <c21f> <c220> 2302 endcidrange 100 begincidrange <c221> <c227> 13780 <c228> <c229> 2304 <c22a> <c22a> 13787 <c22b> <c22b> 2306 <c22c> <c22c> 13788 <c22d> <c22d> 2307 <c22e> <c22e> 13789 <c22f> <c22f> 2308 <c230> <c230> 13790 <c231> <c232> 2309 <c233> <c233> 13791 <c234> <c234> 2311 <c235> <c247> 13792 <c248> <c248> 2312 <c249> <c24f> 13811 <c250> <c251> 2313 <c252> <c253> 13818 <c254> <c254> 2315 <c255> <c257> 13820 <c258> <c258> 2316 <c259> <c25f> 13823 <c260> <c260> 2317 <c261> <c264> 13830 <c265> <c265> 2318 <c266> <c26b> 13834 <c26c> <c26d> 2319 <c26e> <c26f> 13840 <c270> <c270> 2321 <c271> <c273> 13842 <c274> <c274> 2322 <c275> <c27b> 13845 <c27c> <c27d> 2323 <c27e> <c27e> 13852 <c27f> <c27f> 2325 <c280> <c280> 13853 <c281> <c281> 2326 <c282> <c287> 13854 <c288> <c289> 2327 <c28a> <c28f> 13860 <c290> <c290> 2329 <c291> <c297> 13866 <c298> <c298> 2330 <c299> <c29a> 13873 <c29b> <c29b> 2331 <c29c> <c29c> 13875 <c29d> <c29d> 2332 <c29e> <c2a3> 13876 <c2a4> <c2a5> 2333 <c2a6> <c2a7> 13882 <c2a8> <c2a8> 2335 <c2a9> <c2ab> 13884 <c2ac> <c2ad> 2336 <c2ae> <c2b3> 13887 <c2b4> <c2b5> 2338 <c2b6> <c2b6> 13893 <c2b7> <c2b7> 2340 <c2b8> <c2b8> 13894 <c2b9> <c2b9> 2341 <c2ba> <c2db> 13895 <c2dc> <c2dd> 2342 <c2de> <c2df> 13929 <c2e0> <c2e0> 2344 <c2e1> <c2e2> 13931 <c2e3> <c2e4> 2345 <c2e5> <c2ea> 13933 <c2eb> <c2ed> 2347 <c2ee> <c2ee> 13939 <c2ef> <c2ef> 2350 <c2f0> <c2f0> 13940 <c2f1> <c2f1> 2351 <c2f2> <c2f5> 13941 <c2f6> <c2f6> 2352 <c2f7> <c2f7> 13945 <c2f8> <c2f9> 2353 <c2fa> <c2fa> 13946 <c2fb> <c2fc> 2355 <c2fd> <c2ff> 13947 <c300> <c300> 2357 <c301> <c307> 13950 <c308> <c309> 2358 <c30a> <c30b> 13957 <c30c> <c30d> 2360 <c30e> <c312> 13959 <c313> <c315> 2362 <c316> <c317> 13964 <c318> <c318> 2365 <c319> <c31b> 13966 <c31c> <c31c> 2366 <c31d> <c323> 13969 <c324> <c325> 2367 <c326> <c327> 13976 <c328> <c329> 2369 <c32a> <c344> 13978 <c345> <c345> 2371 <c346> <c367> 14005 <c368> <c369> 2372 <c36a> <c36b> 14039 <c36c> <c36c> 2374 <c36d> <c36f> 14041 <c370> <c370> 2375 endcidrange 100 begincidrange <c371> <c371> 14044 <c372> <c372> 2376 <c373> <c377> 14045 <c378> <c379> 2377 <c37a> <c37b> 14050 <c37c> <c37d> 2379 <c37e> <c383> 14052 <c384> <c384> 2381 <c385> <c387> 14058 <c388> <c388> 2382 <c389> <c38b> 14061 <c38c> <c38c> 2383 <c38d> <c3bf> 14064 <c3c0> <c3c0> 2384 <c3c1> <c3d7> 14115 <c3d8> <c3d9> 2385 <c3da> <c3db> 14138 <c3dc> <c3dc> 2387 <c3dd> <c3de> 14140 <c3df> <c3e0> 2388 <c3e1> <c3e1> 14142 <c3e2> <c3e2> 2390 <c3e3> <c3e7> 14143 <c3e8> <c3e9> 2391 <c3ea> <c3ec> 14148 <c3ed> <c3ed> 2393 <c3ee> <c3f3> 14151 <c3f4> <c3f5> 2394 <c3f6> <c3f7> 14157 <c3f8> <c3f8> 2396 <c3f9> <c3ff> 14159 <c400> <c407> 14166 <c408> <c408> 2397 <c409> <c40f> 14174 <c410> <c410> 2398 <c411> <c423> 14181 <c424> <c424> 2399 <c425> <c42b> 14200 <c42c> <c42c> 2400 <c42d> <c42f> 14207 <c430> <c430> 2401 <c431> <c433> 14210 <c434> <c434> 2402 <c435> <c43b> 14213 <c43c> <c43d> 2403 <c43e> <c447> 14220 <c448> <c448> 2405 <c449> <c463> 14230 <c464> <c465> 2406 <c466> <c467> 14257 <c468> <c468> 2408 <c469> <c46b> 14259 <c46c> <c46c> 2409 <c46d> <c473> 14262 <c474> <c475> 2410 <c476> <c478> 14269 <c479> <c479> 2412 <c47a> <c47f> 14272 <c480> <c480> 2413 <c481> <c493> 14278 <c494> <c494> 2414 <c495> <c49b> 14297 <c49c> <c49c> 2415 <c49d> <c4b7> 14304 <c4b8> <c4b8> 2416 <c4b9> <c4bb> 14331 <c4bc> <c4bc> 2417 <c4bd> <c4e8> 14334 <c4e9> <c4e9> 2418 <c4ea> <c4ef> 14378 <c4f0> <c4f1> 2419 <c4f2> <c4f3> 14384 <c4f4> <c4f4> 2421 <c4f5> <c4f7> 14386 <c4f8> <c4f8> 2422 <c4f9> <c4f9> 14389 <c4fa> <c4fa> 2423 <c4fb> <c4fe> 14390 <c4ff> <c4ff> 2424 <c500> <c501> 2425 <c502> <c50b> 14394 <c50c> <c50c> 2427 <c50d> <c50f> 14404 <c510> <c510> 2428 <c511> <c513> 14407 <c514> <c514> 2429 <c515> <c51b> 14410 <c51c> <c51c> 2430 <c51d> <c527> 14417 <c528> <c529> 2431 <c52a> <c52b> 14428 <c52c> <c52c> 2433 <c52d> <c52f> 14430 <c530> <c530> 2434 <c531> <c537> 14433 <c538> <c539> 2435 <c53a> <c53a> 14440 <c53b> <c53b> 2437 <c53c> <c53c> 14441 <c53d> <c53d> 2438 endcidrange 100 begincidrange <c53e> <c543> 14442 <c544> <c545> 2439 <c546> <c547> 14448 <c548> <c54a> 2441 <c54b> <c54b> 14450 <c54c> <c54e> 2444 <c54f> <c552> 14451 <c553> <c555> 2447 <c556> <c556> 14455 <c557> <c559> 2450 <c55a> <c55c> 14456 <c55d> <c55e> 2453 <c55f> <c55f> 14459 <c560> <c561> 2455 <c562> <c563> 14460 <c564> <c564> 2457 <c565> <c567> 14462 <c568> <c568> 2458 <c569> <c56f> 14465 <c570> <c571> 2459 <c572> <c572> 14472 <c573> <c575> 2461 <c576> <c57b> 14473 <c57c> <c57d> 2464 <c57e> <c57f> 14479 <c580> <c580> 2466 <c581> <c583> 14481 <c584> <c584> 2467 <c585> <c586> 14484 <c587> <c587> 2468 <c588> <c58b> 14486 <c58c> <c58d> 2469 <c58e> <c58e> 14490 <c58f> <c58f> 2471 <c590> <c590> 14491 <c591> <c591> 2472 <c592> <c594> 14492 <c595> <c595> 2473 <c596> <c596> 14495 <c597> <c598> 2474 <c599> <c59b> 14496 <c59c> <c59c> 2476 <c59d> <c59f> 14499 <c5a0> <c5a0> 2477 <c5a1> <c5a8> 14502 <c5a9> <c5a9> 2478 <c5aa> <c5b3> 14510 <c5b4> <c5b5> 2479 <c5b6> <c5b7> 14520 <c5b8> <c5b9> 2481 <c5ba> <c5ba> 14522 <c5bb> <c5be> 2483 <c5bf> <c5c3> 14523 <c5c4> <c5ca> 2487 <c5cb> <c5cb> 14528 <c5cc> <c5cc> 2494 <c5cd> <c5cd> 14529 <c5ce> <c5ce> 2495 <c5cf> <c5cf> 14530 <c5d0> <c5d1> 2496 <c5d2> <c5d3> 14531 <c5d4> <c5d4> 2498 <c5d5> <c5d7> 14533 <c5d8> <c5d8> 2499 <c5d9> <c5df> 14536 <c5e0> <c5e1> 2500 <c5e2> <c5e2> 14543 <c5e3> <c5e3> 2502 <c5e4> <c5e4> 14544 <c5e5> <c5e5> 2503 <c5e6> <c5eb> 14545 <c5ec> <c5ee> 2504 <c5ef> <c5ef> 14551 <c5f0> <c5f0> 2507 <c5f1> <c5f3> 14552 <c5f4> <c5f4> 2508 <c5f5> <c5f5> 14555 <c5f6> <c5f7> 2509 <c5f8> <c5fb> 14556 <c5fc> <c5ff> 2511 <c600> <c601> 2515 <c602> <c604> 14560 <c605> <c608> 2517 <c609> <c60b> 14563 <c60c> <c60c> 2521 <c60d> <c60f> 14566 <c610> <c610> 2522 <c611> <c617> 14569 <c618> <c619> 2523 <c61a> <c61a> 14576 <c61b> <c61c> 2525 <c61d> <c623> 14577 <c624> <c625> 2527 <c626> <c627> 14584 <c628> <c628> 2529 <c629> <c62b> 14586 <c62c> <c62e> 2530 <c62f> <c62f> 14589 <c630> <c630> 2533 <c631> <c632> 14590 endcidrange 100 begincidrange <c633> <c635> 2534 <c636> <c636> 14592 <c637> <c637> 2537 <c638> <c638> 14593 <c639> <c639> 2538 <c63a> <c63a> 14594 <c63b> <c63b> 2539 <c63c> <c63f> 14595 <c640> <c641> 2540 <c642> <c643> 14599 <c644> <c644> 2542 <c645> <c647> 14601 <c648> <c648> 2543 <c649> <c64f> 14604 <c650> <c651> 2544 <c652> <c652> 14611 <c653> <c655> 2546 <c656> <c65b> 14612 <c65c> <c65d> 2549 <c65e> <c65f> 14618 <c660> <c660> 2551 <c661> <c66b> 14620 <c66c> <c66c> 2552 <c66d> <c66e> 14631 <c66f> <c66f> 2553 <c670> <c670> 14633 <c671> <c671> 2554 <c672> <c677> 14634 <c678> <c679> 2555 <c67a> <c67b> 14640 <c67c> <c67c> 2557 <c67d> <c67f> 14642 <c680> <c680> 2558 <c681> <c687> 14645 <c688> <c689> 2559 <c68a> <c68a> 14652 <c68b> <c68b> 2561 <c68c> <c68c> 14653 <c68d> <c68d> 2562 <c68e> <c693> 14654 <c694> <c695> 2563 <c696> <c697> 14660 <c698> <c698> 2565 <c699> <c69b> 14662 <c69c> <c69c> 2566 <c69d> <c6a3> 14665 <c6a4> <c6a5> 2567 <c6a6> <c6a6> 14672 <c6a7> <c6a7> 2569 <c6a8> <c6a8> 14673 <c6a9> <c6a9> 2570 <c6aa> <c6af> 14674 <c6b0> <c6b1> 2571 <c6b2> <c6b3> 14680 <c6b4> <c6b4> 2573 <c6b5> <c6b7> 14682 <c6b8> <c6ba> 2574 <c6bb> <c6bf> 14685 <c6c0> <c6c1> 2577 <c6c2> <c6c2> 14690 <c6c3> <c6c3> 2579 <c6c4> <c6c4> 14691 <c6c5> <c6c5> 2580 <c6c6> <c6cb> 14692 <c6cc> <c6cd> 2581 <c6ce> <c6cf> 14698 <c6d0> <c6d0> 2583 <c6d1> <c6d3> 14700 <c6d4> <c6d4> 2584 <c6d5> <c6db> 14703 <c6dc> <c6dd> 2585 <c6de> <c6df> 14710 <c6e0> <c6e1> 2587 <c6e2> <c6e7> 14712 <c6e8> <c6e9> 2589 <c6ea> <c6eb> 14718 <c6ec> <c6ec> 2591 <c6ed> <c6ef> 14720 <c6f0> <c6f0> 2592 <c6f1> <c6f7> 14723 <c6f8> <c6f9> 2593 <c6fa> <c6fc> 14730 <c6fd> <c6fd> 2595 <c6fe> <c6ff> 14733 <c700> <c703> 14735 <c704> <c705> 2596 <c706> <c707> 14739 <c708> <c708> 2598 <c709> <c70b> 14741 <c70c> <c70c> 2599 <c70d> <c713> 14744 <c714> <c715> 2600 <c716> <c716> 14751 <c717> <c717> 2602 <c718> <c718> 14752 <c719> <c719> 2603 <c71a> <c71f> 14753 <c720> <c721> 2604 <c722> <c723> 14759 <c724> <c724> 2606 endcidrange 100 begincidrange <c725> <c727> 14761 <c728> <c728> 2607 <c729> <c72f> 14764 <c730> <c731> 2608 <c732> <c732> 14771 <c733> <c733> 2610 <c734> <c734> 14772 <c735> <c735> 2611 <c736> <c736> 14773 <c737> <c737> 2612 <c738> <c73b> 14774 <c73c> <c73d> 2613 <c73e> <c73f> 14778 <c740> <c740> 2615 <c741> <c743> 14780 <c744> <c744> 2616 <c745> <c749> 14783 <c74a> <c74a> 2617 <c74b> <c74b> 14788 <c74c> <c74d> 2618 <c74e> <c74e> 14789 <c74f> <c74f> 2620 <c750> <c750> 14790 <c751> <c758> 2621 <c759> <c75b> 14791 <c75c> <c75c> 2629 <c75d> <c75f> 14794 <c760> <c760> 2630 <c761> <c767> 14797 <c768> <c768> 2631 <c769> <c76a> 14804 <c76b> <c76b> 2632 <c76c> <c773> 14806 <c774> <c775> 2633 <c776> <c777> 14814 <c778> <c778> 2635 <c779> <c77b> 14816 <c77c> <c77e> 2636 <c77f> <c782> 14819 <c783> <c785> 2639 <c786> <c786> 14823 <c787> <c78a> 2642 <c78b> <c78d> 14824 <c78e> <c78e> 2646 <c78f> <c78f> 14827 <c790> <c791> 2647 <c792> <c793> 14828 <c794> <c794> 2649 <c795> <c795> 14830 <c796> <c798> 2650 <c799> <c799> 14831 <c79a> <c79a> 2653 <c79b> <c79f> 14832 <c7a0> <c7a1> 2654 <c7a2> <c7a2> 14837 <c7a3> <c7a6> 2656 <c7a7> <c7ab> 14838 <c7ac> <c7ad> 2660 <c7ae> <c7af> 14843 <c7b0> <c7b0> 2662 <c7b1> <c7b3> 14845 <c7b4> <c7b4> 2663 <c7b5> <c7bb> 14848 <c7bc> <c7bd> 2664 <c7be> <c7be> 14855 <c7bf> <c7c1> 2666 <c7c2> <c7c7> 14856 <c7c8> <c7c9> 2669 <c7ca> <c7cb> 14862 <c7cc> <c7cc> 2671 <c7cd> <c7cd> 14864 <c7ce> <c7ce> 2672 <c7cf> <c7cf> 14865 <c7d0> <c7d0> 2673 <c7d1> <c7d7> 14866 <c7d8> <c7d8> 2674 <c7d9> <c7dc> 14873 <c7dd> <c7dd> 2675 <c7de> <c7e3> 14877 <c7e4> <c7e4> 2676 <c7e5> <c7e7> 14883 <c7e8> <c7e8> 2677 <c7e9> <c7eb> 14886 <c7ec> <c7ec> 2678 <c7ed> <c7ff> 14889 <c800> <c801> 2679 <c802> <c803> 14908 <c804> <c804> 2681 <c805> <c807> 14910 <c808> <c808> 2682 <c809> <c809> 14913 <c80a> <c80a> 2683 <c80b> <c80f> 14914 <c810> <c811> 2684 <c812> <c812> 14919 <c813> <c813> 2686 <c814> <c814> 14920 <c815> <c816> 2687 <c817> <c81b> 14921 <c81c> <c81d> 2689 endcidrange 100 begincidrange <c81e> <c81f> 14926 <c820> <c820> 2691 <c821> <c823> 14928 <c824> <c824> 2692 <c825> <c82b> 14931 <c82c> <c82d> 2693 <c82e> <c82e> 14938 <c82f> <c82f> 2695 <c830> <c830> 14939 <c831> <c831> 2696 <c832> <c837> 14940 <c838> <c838> 2697 <c839> <c83b> 14946 <c83c> <c83c> 2698 <c83d> <c83f> 14949 <c840> <c840> 2699 <c841> <c847> 14952 <c848> <c849> 2700 <c84a> <c84b> 14959 <c84c> <c84d> 2702 <c84e> <c853> 14961 <c854> <c854> 2704 <c855> <c86f> 14967 <c870> <c871> 2705 <c872> <c873> 14994 <c874> <c874> 2707 <c875> <c877> 14996 <c878> <c878> 2708 <c879> <c879> 14999 <c87a> <c87a> 2709 <c87b> <c87f> 15000 <c880> <c881> 2710 <c882> <c882> 15005 <c883> <c883> 2712 <c884> <c884> 15006 <c885> <c887> 2713 <c888> <c88a> 15007 <c88b> <c88d> 2716 <c88e> <c893> 15010 <c894> <c894> 2719 <c895> <c89c> 15016 <c89d> <c89d> 2720 <c89e> <c89e> 15024 <c89f> <c89f> 2721 <c8a0> <c8a0> 15025 <c8a1> <c8a1> 2722 <c8a2> <c8a7> 15026 <c8a8> <c8a8> 2723 <c8a9> <c8bb> 15032 <c8bc> <c8bd> 2724 <c8be> <c8c3> 15051 <c8c4> <c8c4> 2726 <c8c5> <c8c7> 15057 <c8c8> <c8c8> 2727 <c8c9> <c8cb> 15060 <c8cc> <c8cc> 2728 <c8cd> <c8d3> 15063 <c8d4> <c8d5> 2729 <c8d6> <c8d6> 15070 <c8d7> <c8d7> 2731 <c8d8> <c8d8> 15071 <c8d9> <c8d9> 2732 <c8da> <c8df> 15072 <c8e0> <c8e1> 2733 <c8e2> <c8e3> 15078 <c8e4> <c8e4> 2735 <c8e5> <c8f4> 15080 <c8f5> <c8f5> 2736 <c8f6> <c8fb> 15096 <c8fc> <c8fd> 2737 <c8fe> <c8ff> 15102 <c900> <c900> 2739 <c901> <c903> 15104 <c904> <c906> 2740 <c907> <c90b> 15107 <c90c> <c90d> 2743 <c90e> <c90e> 15112 <c90f> <c90f> 2745 <c910> <c910> 15113 <c911> <c911> 2746 <c912> <c917> 15114 <c918> <c918> 2747 <c919> <c92b> 15120 <c92c> <c92c> 2748 <c92d> <c933> 15139 <c934> <c934> 2749 <c935> <c94f> 15146 <c950> <c951> 2750 <c952> <c953> 15173 <c954> <c954> 2752 <c955> <c957> 15175 <c958> <c958> 2753 <c959> <c95f> 15178 <c960> <c961> 2754 <c962> <c962> 15185 <c963> <c963> 2756 <c964> <c96b> 15186 <c96c> <c96c> 2757 <c96d> <c96f> 15194 <c970> <c970> 2758 endcidrange 100 begincidrange <c971> <c973> 15197 <c974> <c974> 2759 <c975> <c97b> 15200 <c97c> <c97c> 2760 <c97d> <c987> 15207 <c988> <c989> 2761 <c98a> <c98b> 15218 <c98c> <c98c> 2763 <c98d> <c98f> 15220 <c990> <c990> 2764 <c991> <c997> 15223 <c998> <c999> 2765 <c99a> <c99a> 15230 <c99b> <c99b> 2767 <c99c> <c99c> 15231 <c99d> <c99d> 2768 <c99e> <c9bf> 15232 <c9c0> <c9c1> 2769 <c9c2> <c9c3> 15266 <c9c4> <c9c4> 2771 <c9c5> <c9c6> 15268 <c9c7> <c9c8> 2772 <c9c9> <c9c9> 15270 <c9ca> <c9ca> 2774 <c9cb> <c9cf> 15271 <c9d0> <c9d1> 2775 <c9d2> <c9d2> 15276 <c9d3> <c9d3> 2777 <c9d4> <c9d4> 15277 <c9d5> <c9d6> 2778 <c9d7> <c9d8> 15278 <c9d9> <c9da> 2780 <c9db> <c9db> 15280 <c9dc> <c9dd> 2782 <c9de> <c9df> 15281 <c9e0> <c9e0> 2784 <c9e1> <c9e1> 15283 <c9e2> <c9e2> 2785 <c9e3> <c9e3> 15284 <c9e4> <c9e4> 2786 <c9e5> <c9e6> 15285 <c9e7> <c9e7> 2787 <c9e8> <c9eb> 15287 <c9ec> <c9ed> 2788 <c9ee> <c9ee> 15291 <c9ef> <c9f1> 2790 <c9f2> <c9f7> 15292 <c9f8> <c9f9> 2793 <c9fa> <c9fb> 15298 <c9fc> <c9fc> 2795 <c9fd> <c9ff> 15300 <ca00> <ca00> 2796 <ca01> <ca07> 15303 <ca08> <ca09> 2797 <ca0a> <ca0a> 15310 <ca0b> <ca0d> 2799 <ca0e> <ca13> 15311 <ca14> <ca14> 2802 <ca15> <ca17> 15317 <ca18> <ca18> 2803 <ca19> <ca28> 15320 <ca29> <ca29> 2804 <ca2a> <ca4b> 15336 <ca4c> <ca4d> 2805 <ca4e> <ca4f> 15370 <ca50> <ca50> 2807 <ca51> <ca53> 15372 <ca54> <ca54> 2808 <ca55> <ca5b> 15375 <ca5c> <ca5d> 2809 <ca5e> <ca5e> 15382 <ca5f> <ca61> 2811 <ca62> <ca67> 15383 <ca68> <ca68> 2814 <ca69> <ca7c> 15389 <ca7d> <ca7d> 2815 <ca7e> <ca83> 15409 <ca84> <ca84> 2816 <ca85> <ca97> 15415 <ca98> <ca98> 2817 <ca99> <cabb> 15434 <cabc> <cabd> 2818 <cabe> <cabf> 15469 <cac0> <cac0> 2820 <cac1> <cac3> 15471 <cac4> <cac4> 2821 <cac5> <cacb> 15474 <cacc> <cacd> 2822 <cace> <cace> 15481 <cacf> <cacf> 2824 <cad0> <cad0> 15482 <cad1> <cad1> 2825 <cad2> <cad2> 15483 <cad3> <cad3> 2826 <cad4> <cad7> 15484 <cad8> <cad9> 2827 <cada> <cadf> 15488 <cae0> <cae0> 2829 <cae1> <caeb> 15494 <caec> <caec> 2830 endcidrange 100 begincidrange <caed> <caf3> 15505 <caf4> <caf4> 2831 <caf5> <caff> 15512 <cb00> <cb07> 15523 <cb08> <cb08> 2832 <cb09> <cb0f> 15531 <cb10> <cb10> 2833 <cb11> <cb13> 15538 <cb14> <cb14> 2834 <cb15> <cb17> 15541 <cb18> <cb18> 2835 <cb19> <cb1f> 15544 <cb20> <cb21> 2836 <cb22> <cb40> 15551 <cb41> <cb41> 2838 <cb42> <cb47> 15582 <cb48> <cb49> 2839 <cb4a> <cb4b> 15588 <cb4c> <cb4c> 2841 <cb4d> <cb4f> 15590 <cb50> <cb50> 2842 <cb51> <cb57> 15593 <cb58> <cb59> 2843 <cb5a> <cb5c> 15600 <cb5d> <cb5d> 2845 <cb5e> <cb63> 15603 <cb64> <cb64> 2846 <cb65> <cb77> 15609 <cb78> <cb79> 2847 <cb7a> <cb9b> 15628 <cb9c> <cb9c> 2849 <cb9d> <cbb7> 15662 <cbb8> <cbb8> 2850 <cbb9> <cbd3> 15689 <cbd4> <cbd4> 2851 <cbd5> <cbe3> 15716 <cbe4> <cbe4> 2852 <cbe5> <cbe6> 15731 <cbe7> <cbe7> 2853 <cbe8> <cbe8> 15733 <cbe9> <cbe9> 2854 <cbea> <cbff> 15734 <cc00> <cc0b> 15756 <cc0c> <cc0d> 2855 <cc0e> <cc0f> 15768 <cc10> <cc10> 2857 <cc11> <cc13> 15770 <cc14> <cc14> 2858 <cc15> <cc1b> 15773 <cc1c> <cc1d> 2859 <cc1e> <cc20> 15780 <cc21> <cc22> 2861 <cc23> <cc26> 15783 <cc27> <cc29> 2863 <cc2a> <cc2b> 15787 <cc2c> <cc2c> 2866 <cc2d> <cc2d> 15789 <cc2e> <cc2e> 2867 <cc2f> <cc2f> 15790 <cc30> <cc30> 2868 <cc31> <cc37> 15791 <cc38> <cc39> 2869 <cc3a> <cc3a> 15798 <cc3b> <cc3e> 2871 <cc3f> <cc43> 15799 <cc44> <cc45> 2875 <cc46> <cc47> 15804 <cc48> <cc48> 2877 <cc49> <cc4b> 15806 <cc4c> <cc4c> 2878 <cc4d> <cc53> 15809 <cc54> <cc55> 2879 <cc56> <cc56> 15816 <cc57> <cc59> 2881 <cc5a> <cc5f> 15817 <cc60> <cc60> 2884 <cc61> <cc63> 15823 <cc64> <cc64> 2885 <cc65> <cc65> 15826 <cc66> <cc66> 2886 <cc67> <cc67> 15827 <cc68> <cc68> 2887 <cc69> <cc6f> 15828 <cc70> <cc70> 2888 <cc71> <cc74> 15835 <cc75> <cc75> 2889 <cc76> <cc97> 15839 <cc98> <cc99> 2890 <cc9a> <cc9b> 15873 <cc9c> <cc9c> 2892 <cc9d> <cc9f> 15875 <cca0> <cca0> 2893 <cca1> <cca7> 15878 <cca8> <cca9> 2894 <ccaa> <ccaa> 15885 <ccab> <ccad> 2896 <ccae> <ccb3> 15886 <ccb4> <ccb5> 2899 <ccb6> <ccb7> 15892 <ccb8> <ccb8> 2901 endcidrange 100 begincidrange <ccb9> <ccbb> 15894 <ccbc> <ccbc> 2902 <ccbd> <ccc3> 15897 <ccc4> <ccc5> 2903 <ccc6> <ccc6> 15904 <ccc7> <ccc7> 2905 <ccc8> <ccc8> 15905 <ccc9> <ccc9> 2906 <ccca> <cccf> 15906 <ccd0> <ccd0> 2907 <ccd1> <ccd3> 15912 <ccd4> <ccd4> 2908 <ccd5> <cce3> 15915 <cce4> <cce4> 2909 <cce5> <cceb> 15930 <ccec> <ccec> 2910 <cced> <ccef> 15937 <ccf0> <ccf0> 2911 <ccf1> <ccff> 15940 <cd00> <cd00> 15955 <cd01> <cd01> 2912 <cd02> <cd07> 15956 <cd08> <cd09> 2913 <cd0a> <cd0b> 15962 <cd0c> <cd0c> 2915 <cd0d> <cd0f> 15964 <cd10> <cd10> 2916 <cd11> <cd17> 15967 <cd18> <cd19> 2917 <cd1a> <cd1a> 15974 <cd1b> <cd1b> 2919 <cd1c> <cd1c> 15975 <cd1d> <cd1d> 2920 <cd1e> <cd23> 15976 <cd24> <cd24> 2921 <cd25> <cd27> 15982 <cd28> <cd28> 2922 <cd29> <cd2b> 15985 <cd2c> <cd2c> 2923 <cd2d> <cd38> 15988 <cd39> <cd39> 2924 <cd3a> <cd5b> 16000 <cd5c> <cd5c> 2925 <cd5d> <cd5f> 16034 <cd60> <cd60> 2926 <cd61> <cd63> 16037 <cd64> <cd64> 2927 <cd65> <cd6b> 16040 <cd6c> <cd6d> 2928 <cd6e> <cd6e> 16047 <cd6f> <cd6f> 2930 <cd70> <cd70> 16048 <cd71> <cd71> 2931 <cd72> <cd77> 16049 <cd78> <cd78> 2932 <cd79> <cd87> 16055 <cd88> <cd88> 2933 <cd89> <cd93> 16070 <cd94> <cd95> 2934 <cd96> <cd97> 16081 <cd98> <cd98> 2936 <cd99> <cd9b> 16083 <cd9c> <cd9c> 2937 <cd9d> <cda3> 16086 <cda4> <cda5> 2938 <cda6> <cda6> 16093 <cda7> <cda7> 2940 <cda8> <cda8> 16094 <cda9> <cda9> 2941 <cdaa> <cdaf> 16095 <cdb0> <cdb0> 2942 <cdb1> <cdc3> 16101 <cdc4> <cdc4> 2943 <cdc5> <cdcb> 16120 <cdcc> <cdcc> 2944 <cdcd> <cdcf> 16127 <cdd0> <cdd0> 2945 <cdd1> <cde7> 16130 <cde8> <cde8> 2946 <cde9> <cdeb> 16153 <cdec> <cdec> 2947 <cded> <cdef> 16156 <cdf0> <cdf0> 2948 <cdf1> <cdf7> 16159 <cdf8> <cdf9> 2949 <cdfa> <cdfa> 16166 <cdfb> <cdfb> 2951 <cdfc> <cdfc> 16167 <cdfd> <cdfd> 2952 <cdfe> <cdff> 16168 <ce00> <ce03> 16170 <ce04> <ce04> 2953 <ce05> <ce07> 16174 <ce08> <ce08> 2954 <ce09> <ce0b> 16177 <ce0c> <ce0c> 2955 <ce0d> <ce13> 16180 <ce14> <ce14> 2956 <ce15> <ce18> 16187 <ce19> <ce19> 2957 endcidrange 100 begincidrange <ce1a> <ce1f> 16191 <ce20> <ce21> 2958 <ce22> <ce23> 16197 <ce24> <ce24> 2960 <ce25> <ce27> 16199 <ce28> <ce28> 2961 <ce29> <ce2f> 16202 <ce30> <ce31> 2962 <ce32> <ce32> 16209 <ce33> <ce33> 2964 <ce34> <ce34> 16210 <ce35> <ce35> 2965 <ce36> <ce57> 16211 <ce58> <ce59> 2966 <ce5a> <ce5b> 16245 <ce5c> <ce5c> 2968 <ce5d> <ce5e> 16247 <ce5f> <ce61> 2969 <ce62> <ce67> 16249 <ce68> <ce69> 2972 <ce6a> <ce6a> 16255 <ce6b> <ce6b> 2974 <ce6c> <ce6c> 16256 <ce6d> <ce6d> 2975 <ce6e> <ce73> 16257 <ce74> <ce75> 2976 <ce76> <ce77> 16263 <ce78> <ce78> 2978 <ce79> <ce7b> 16265 <ce7c> <ce7c> 2979 <ce7d> <ce83> 16268 <ce84> <ce85> 2980 <ce86> <ce86> 16275 <ce87> <ce87> 2982 <ce88> <ce88> 16276 <ce89> <ce89> 2983 <ce8a> <ce8f> 16277 <ce90> <ce91> 2984 <ce92> <ce93> 16283 <ce94> <ce94> 2986 <ce95> <ce97> 16285 <ce98> <ce98> 2987 <ce99> <ce9f> 16288 <cea0> <cea1> 2988 <cea2> <cea2> 16295 <cea3> <cea5> 2990 <cea6> <ceab> 16296 <ceac> <cead> 2993 <ceae> <cec0> 16302 <cec1> <cec1> 2995 <cec2> <cee3> 16321 <cee4> <cee5> 2996 <cee6> <cee7> 16355 <cee8> <cee8> 2998 <cee9> <ceea> 16357 <ceeb> <ceec> 2999 <ceed> <cef3> 16359 <cef4> <cef5> 3001 <cef6> <cef6> 16366 <cef7> <cef9> 3003 <cefa> <ceff> 16367 <cf00> <cf01> 3006 <cf02> <cf03> 16373 <cf04> <cf04> 3008 <cf05> <cf07> 16375 <cf08> <cf08> 3009 <cf09> <cf0f> 16378 <cf10> <cf11> 3010 <cf12> <cf12> 16385 <cf13> <cf13> 3012 <cf14> <cf14> 16386 <cf15> <cf15> 3013 <cf16> <cf1b> 16387 <cf1c> <cf1c> 3014 <cf1d> <cf1f> 16393 <cf20> <cf20> 3015 <cf21> <cf23> 16396 <cf24> <cf24> 3016 <cf25> <cf2b> 16399 <cf2c> <cf2d> 3017 <cf2e> <cf2e> 16406 <cf2f> <cf31> 3019 <cf32> <cf37> 16407 <cf38> <cf38> 3022 <cf39> <cf53> 16413 <cf54> <cf55> 3023 <cf56> <cf57> 16440 <cf58> <cf58> 3025 <cf59> <cf5b> 16442 <cf5c> <cf5c> 3026 <cf5d> <cf63> 16445 <cf64> <cf65> 3027 <cf66> <cf66> 16452 <cf67> <cf67> 3029 <cf68> <cf68> 16453 <cf69> <cf69> 3030 <cf6a> <cf6f> 16454 <cf70> <cf71> 3031 <cf72> <cf73> 16460 <cf74> <cf74> 3033 endcidrange 100 begincidrange <cf75> <cf77> 16462 <cf78> <cf78> 3034 <cf79> <cf7f> 16465 <cf80> <cf80> 3035 <cf81> <cf84> 16472 <cf85> <cf85> 3036 <cf86> <cf8b> 16476 <cf8c> <cf8c> 3037 <cf8d> <cfa0> 16482 <cfa1> <cfa1> 3038 <cfa2> <cfa7> 16502 <cfa8> <cfa8> 3039 <cfa9> <cfaf> 16508 <cfb0> <cfb0> 3040 <cfb1> <cfc3> 16515 <cfc4> <cfc4> 3041 <cfc5> <cfdf> 16534 <cfe0> <cfe1> 3042 <cfe2> <cfe3> 16561 <cfe4> <cfe4> 3044 <cfe5> <cfe7> 16563 <cfe8> <cfe8> 3045 <cfe9> <cfef> 16566 <cff0> <cff1> 3046 <cff2> <cff2> 16573 <cff3> <cff3> 3048 <cff4> <cff4> 16574 <cff5> <cff5> 3049 <cff6> <cffb> 16575 <cffc> <cffc> 3050 <cffd> <cfff> 16581 <d000> <d000> 3051 <d001> <d003> 16584 <d004> <d004> 3052 <d005> <d010> 16587 <d011> <d011> 3053 <d012> <d017> 16599 <d018> <d018> 3054 <d019> <d02c> 16605 <d02d> <d02d> 3055 <d02e> <d033> 16625 <d034> <d035> 3056 <d036> <d037> 16631 <d038> <d038> 3058 <d039> <d03b> 16633 <d03c> <d03c> 3059 <d03d> <d043> 16636 <d044> <d045> 3060 <d046> <d046> 16643 <d047> <d047> 3062 <d048> <d048> 16644 <d049> <d049> 3063 <d04a> <d04f> 16645 <d050> <d050> 3064 <d051> <d053> 16651 <d054> <d054> 3065 <d055> <d057> 16654 <d058> <d058> 3066 <d059> <d05f> 16657 <d060> <d060> 3067 <d061> <d06b> 16664 <d06c> <d06d> 3068 <d06e> <d06f> 16675 <d070> <d070> 3070 <d071> <d073> 16677 <d074> <d074> 3071 <d075> <d07b> 16680 <d07c> <d07d> 3072 <d07e> <d080> 16687 <d081> <d081> 3074 <d082> <d0a3> 16690 <d0a4> <d0a5> 3075 <d0a6> <d0a7> 16724 <d0a8> <d0a8> 3077 <d0a9> <d0ab> 16726 <d0ac> <d0ac> 3078 <d0ad> <d0b3> 16729 <d0b4> <d0b5> 3079 <d0b6> <d0b6> 16736 <d0b7> <d0b7> 3081 <d0b8> <d0b8> 16737 <d0b9> <d0b9> 3082 <d0ba> <d0bf> 16738 <d0c0> <d0c1> 3083 <d0c2> <d0c3> 16744 <d0c4> <d0c4> 3085 <d0c5> <d0c7> 16746 <d0c8> <d0c9> 3086 <d0ca> <d0cf> 16749 <d0d0> <d0d1> 3088 <d0d2> <d0d2> 16755 <d0d3> <d0d5> 3090 <d0d6> <d0db> 16756 <d0dc> <d0dd> 3093 <d0de> <d0df> 16762 <d0e0> <d0e0> 3095 <d0e1> <d0e3> 16764 <d0e4> <d0e4> 3096 <d0e5> <d0eb> 16767 <d0ec> <d0ed> 3097 endcidrange 100 begincidrange <d0ee> <d0ee> 16774 <d0ef> <d0f1> 3099 <d0f2> <d0f7> 16775 <d0f8> <d0f8> 3102 <d0f9> <d0ff> 16781 <d100> <d10c> 16788 <d10d> <d10d> 3103 <d10e> <d12f> 16801 <d130> <d131> 3104 <d132> <d133> 16835 <d134> <d134> 3106 <d135> <d137> 16837 <d138> <d138> 3107 <d139> <d139> 16840 <d13a> <d13a> 3108 <d13b> <d13f> 16841 <d140> <d141> 3109 <d142> <d142> 16846 <d143> <d145> 3111 <d146> <d14b> 16847 <d14c> <d14d> 3114 <d14e> <d14f> 16853 <d150> <d150> 3116 <d151> <d153> 16855 <d154> <d154> 3117 <d155> <d15b> 16858 <d15c> <d15d> 3118 <d15e> <d15e> 16865 <d15f> <d15f> 3120 <d160> <d160> 16866 <d161> <d161> 3121 <d162> <d167> 16867 <d168> <d168> 3122 <d169> <d16b> 16873 <d16c> <d16c> 3123 <d16d> <d17b> 16876 <d17c> <d17c> 3124 <d17d> <d183> 16891 <d184> <d184> 3125 <d185> <d187> 16898 <d188> <d188> 3126 <d189> <d19f> 16901 <d1a0> <d1a1> 3127 <d1a2> <d1a3> 16924 <d1a4> <d1a4> 3129 <d1a5> <d1a7> 16926 <d1a8> <d1a8> 3130 <d1a9> <d1af> 16929 <d1b0> <d1b1> 3131 <d1b2> <d1b2> 16936 <d1b3> <d1b3> 3133 <d1b4> <d1b4> 16937 <d1b5> <d1b5> 3134 <d1b6> <d1b9> 16938 <d1ba> <d1ba> 3135 <d1bb> <d1bb> 16942 <d1bc> <d1bc> 3136 <d1bd> <d1bf> 16943 <d1c0> <d1c0> 3137 <d1c1> <d1d7> 16946 <d1d8> <d1d8> 3138 <d1d9> <d1f3> 16969 <d1f4> <d1f4> 3139 <d1f5> <d1f7> 16996 <d1f8> <d1f8> 3140 <d1f9> <d1ff> 16999 <d200> <d206> 17006 <d207> <d207> 3141 <d208> <d208> 17013 <d209> <d209> 3142 <d20a> <d20f> 17014 <d210> <d210> 3143 <d211> <d22b> 17020 <d22c> <d22d> 3144 <d22e> <d22f> 17047 <d230> <d230> 3146 <d231> <d233> 17049 <d234> <d234> 3147 <d235> <d23b> 17052 <d23c> <d23d> 3148 <d23e> <d23e> 17059 <d23f> <d23f> 3150 <d240> <d240> 17060 <d241> <d241> 3151 <d242> <d247> 17061 <d248> <d248> 3152 <d249> <d25b> 17067 <d25c> <d25c> 3153 <d25d> <d263> 17086 <d264> <d264> 3154 <d265> <d27f> 17093 <d280> <d281> 3155 <d282> <d283> 17120 <d284> <d284> 3157 <d285> <d287> 17122 <d288> <d288> 3158 <d289> <d28f> 17125 <d290> <d291> 3159 <d292> <d294> 17132 <d295> <d295> 3161 endcidrange 100 begincidrange <d296> <d29b> 17135 <d29c> <d29c> 3162 <d29d> <d29f> 17141 <d2a0> <d2a0> 3163 <d2a1> <d2a3> 17144 <d2a4> <d2a4> 3164 <d2a5> <d2ab> 17147 <d2ac> <d2ac> 3165 <d2ad> <d2b0> 17154 <d2b1> <d2b1> 3166 <d2b2> <d2b7> 17158 <d2b8> <d2b9> 3167 <d2ba> <d2bb> 17164 <d2bc> <d2bc> 3169 <d2bd> <d2be> 17166 <d2bf> <d2c0> 3170 <d2c1> <d2c1> 17168 <d2c2> <d2c2> 3172 <d2c3> <d2c7> 17169 <d2c8> <d2c9> 3173 <d2ca> <d2ca> 17174 <d2cb> <d2cb> 3175 <d2cc> <d2d3> 17175 <d2d4> <d2d4> 3176 <d2d5> <d2d7> 17183 <d2d8> <d2d8> 3177 <d2d9> <d2db> 17186 <d2dc> <d2dc> 3178 <d2dd> <d2e3> 17189 <d2e4> <d2e5> 3179 <d2e6> <d2ef> 17196 <d2f0> <d2f1> 3181 <d2f2> <d2f3> 17206 <d2f4> <d2f4> 3183 <d2f5> <d2f7> 17208 <d2f8> <d2f8> 3184 <d2f9> <d2ff> 17211 <d300> <d301> 3185 <d302> <d302> 17218 <d303> <d303> 3187 <d304> <d304> 17219 <d305> <d305> 3188 <d306> <d30b> 17220 <d30c> <d30e> 3189 <d30f> <d30f> 17226 <d310> <d310> 3192 <d311> <d313> 17227 <d314> <d314> 3193 <d315> <d315> 17230 <d316> <d316> 3194 <d317> <d31b> 17231 <d31c> <d31d> 3195 <d31e> <d31e> 17236 <d31f> <d321> 3197 <d322> <d324> 17237 <d325> <d325> 3200 <d326> <d327> 17240 <d328> <d329> 3201 <d32a> <d32b> 17242 <d32c> <d32c> 3203 <d32d> <d32f> 17244 <d330> <d330> 3204 <d331> <d337> 17247 <d338> <d339> 3205 <d33a> <d33a> 17254 <d33b> <d33d> 3207 <d33e> <d343> 17255 <d344> <d345> 3210 <d346> <d37b> 17261 <d37c> <d37d> 3212 <d37e> <d37f> 17315 <d380> <d380> 3214 <d381> <d383> 17317 <d384> <d384> 3215 <d385> <d38b> 17320 <d38c> <d38d> 3216 <d38e> <d38e> 17327 <d38f> <d391> 3218 <d392> <d397> 17328 <d398> <d399> 3221 <d39a> <d39b> 17334 <d39c> <d39c> 3223 <d39d> <d39f> 17336 <d3a0> <d3a0> 3224 <d3a1> <d3a7> 17339 <d3a8> <d3a9> 3225 <d3aa> <d3aa> 17346 <d3ab> <d3ab> 3227 <d3ac> <d3ac> 17347 <d3ad> <d3ad> 3228 <d3ae> <d3b3> 17348 <d3b4> <d3b4> 3229 <d3b5> <d3b7> 17354 <d3b8> <d3b8> 3230 <d3b9> <d3bb> 17357 <d3bc> <d3bc> 3231 <d3bd> <d3c3> 17360 <d3c4> <d3c5> 3232 <d3c6> <d3c7> 17367 <d3c8> <d3c9> 3234 endcidrange 100 begincidrange <d3ca> <d3cf> 17369 <d3d0> <d3d0> 3236 <d3d1> <d3d7> 17375 <d3d8> <d3d8> 3237 <d3d9> <d3e0> 17382 <d3e1> <d3e1> 3238 <d3e2> <d3e2> 17390 <d3e3> <d3e3> 3239 <d3e4> <d3eb> 17391 <d3ec> <d3ed> 3240 <d3ee> <d3ef> 17399 <d3f0> <d3f0> 3242 <d3f1> <d3f3> 17401 <d3f4> <d3f4> 3243 <d3f5> <d3fb> 17404 <d3fc> <d3fd> 3244 <d3fe> <d3fe> 17411 <d3ff> <d3ff> 3246 <d400> <d400> 17412 <d401> <d401> 3247 <d402> <d407> 17413 <d408> <d408> 3248 <d409> <d41c> 17419 <d41d> <d41d> 3249 <d41e> <d43f> 17439 <d440> <d440> 3250 <d441> <d443> 17473 <d444> <d444> 3251 <d445> <d45b> 17476 <d45c> <d45c> 3252 <d45d> <d45f> 17499 <d460> <d460> 3253 <d461> <d463> 17502 <d464> <d464> 3254 <d465> <d46c> 17505 <d46d> <d46d> 3255 <d46e> <d46e> 17513 <d46f> <d46f> 3256 <d470> <d477> 17514 <d478> <d479> 3257 <d47a> <d47b> 17522 <d47c> <d47c> 3259 <d47d> <d47e> 17524 <d47f> <d480> 3260 <d481> <d481> 17526 <d482> <d482> 3262 <d483> <d487> 17527 <d488> <d489> 3263 <d48a> <d48a> 17532 <d48b> <d48b> 3265 <d48c> <d48c> 17533 <d48d> <d48d> 3266 <d48e> <d493> 17534 <d494> <d494> 3267 <d495> <d4a8> 17540 <d4a9> <d4a9> 3268 <d4aa> <d4cb> 17560 <d4cc> <d4cc> 3269 <d4cd> <d4cf> 17594 <d4d0> <d4d0> 3270 <d4d1> <d4d3> 17597 <d4d4> <d4d4> 3271 <d4d5> <d4db> 17600 <d4dc> <d4dc> 3272 <d4dd> <d4de> 17607 <d4df> <d4df> 3273 <d4e0> <d4e7> 17609 <d4e8> <d4e8> 3274 <d4e9> <d4eb> 17617 <d4ec> <d4ec> 3275 <d4ed> <d4ef> 17620 <d4f0> <d4f0> 3276 <d4f1> <d4f7> 17623 <d4f8> <d4f8> 3277 <d4f9> <d4fa> 17630 <d4fb> <d4fb> 3278 <d4fc> <d4fc> 17632 <d4fd> <d4fd> 3279 <d4fe> <d4ff> 17633 <d500> <d503> 17635 <d504> <d504> 3280 <d505> <d507> 17639 <d508> <d508> 3281 <d509> <d50b> 17642 <d50c> <d50c> 3282 <d50d> <d513> 17645 <d514> <d515> 3283 <d516> <d516> 17652 <d517> <d517> 3285 <d518> <d53b> 17653 <d53c> <d53d> 3286 <d53e> <d53f> 17689 <d540> <d540> 3288 <d541> <d543> 17691 <d544> <d544> 3289 <d545> <d54b> 17694 <d54c> <d54d> 3290 <d54e> <d54e> 17701 <d54f> <d54f> 3292 <d550> <d550> 17702 endcidrange 100 begincidrange <d551> <d551> 3293 <d552> <d557> 17703 <d558> <d559> 3294 <d55a> <d55b> 17709 <d55c> <d55c> 3296 <d55d> <d55f> 17711 <d560> <d560> 3297 <d561> <d564> 17714 <d565> <d565> 3298 <d566> <d567> 17718 <d568> <d569> 3299 <d56a> <d56a> 17720 <d56b> <d56b> 3301 <d56c> <d56c> 17721 <d56d> <d56d> 3302 <d56e> <d573> 17722 <d574> <d575> 3303 <d576> <d577> 17728 <d578> <d578> 3305 <d579> <d57b> 17730 <d57c> <d57c> 3306 <d57d> <d583> 17733 <d584> <d585> 3307 <d586> <d586> 17740 <d587> <d589> 3309 <d58a> <d58f> 17741 <d590> <d590> 3312 <d591> <d5a4> 17747 <d5a5> <d5a5> 3313 <d5a6> <d5c7> 17767 <d5c8> <d5c9> 3314 <d5ca> <d5cb> 17801 <d5cc> <d5cc> 3316 <d5cd> <d5cf> 17803 <d5d0> <d5d0> 3317 <d5d1> <d5d1> 17806 <d5d2> <d5d2> 3318 <d5d3> <d5d7> 17807 <d5d8> <d5d9> 3319 <d5da> <d5da> 17812 <d5db> <d5db> 3321 <d5dc> <d5dc> 17813 <d5dd> <d5dd> 3322 <d5de> <d5e3> 17814 <d5e4> <d5e5> 3323 <d5e6> <d5e7> 17820 <d5e8> <d5e8> 3325 <d5e9> <d5eb> 17822 <d5ec> <d5ec> 3326 <d5ed> <d5f3> 17825 <d5f4> <d5f5> 3327 <d5f6> <d5f6> 17832 <d5f7> <d5f7> 3329 <d5f8> <d5f8> 17833 <d5f9> <d5f9> 3330 <d5fa> <d5ff> 17834 <d600> <d601> 3331 <d602> <d603> 17840 <d604> <d604> 3333 <d605> <d607> 17842 <d608> <d608> 3334 <d609> <d60f> 17845 <d610> <d611> 3335 <d612> <d612> 17852 <d613> <d615> 3337 <d616> <d61b> 17853 <d61c> <d61c> 3340 <d61d> <d61f> 17859 <d620> <d620> 3341 <d621> <d623> 17862 <d624> <d624> 3342 <d625> <d62c> 17865 <d62d> <d62d> 3343 <d62e> <d637> 17873 <d638> <d639> 3344 <d63a> <d63b> 17883 <d63c> <d63c> 3346 <d63d> <d63f> 17885 <d640> <d640> 3347 <d641> <d644> 17888 <d645> <d645> 3348 <d646> <d647> 17892 <d648> <d649> 3349 <d64a> <d64a> 17894 <d64b> <d64b> 3351 <d64c> <d64c> 17895 <d64d> <d64d> 3352 <d64e> <d650> 17896 <d651> <d651> 3353 <d652> <d653> 17899 <d654> <d655> 3354 <d656> <d657> 17901 <d658> <d658> 3356 <d659> <d65b> 17903 <d65c> <d65c> 3357 <d65d> <d666> 17906 <d667> <d667> 3358 <d668> <d668> 17916 <d669> <d669> 3359 <d66a> <d66f> 17917 endcidrange 100 begincidrange <d670> <d671> 3360 <d672> <d673> 17923 <d674> <d674> 3362 <d675> <d682> 17925 <d683> <d683> 3363 <d684> <d684> 17939 <d685> <d685> 3364 <d686> <d68b> 17940 <d68c> <d68d> 3365 <d68e> <d68f> 17946 <d690> <d690> 3367 <d691> <d693> 17948 <d694> <d694> 3368 <d695> <d69c> 17951 <d69d> <d69d> 3369 <d69e> <d69e> 17959 <d69f> <d69f> 3370 <d6a0> <d6a0> 17960 <d6a1> <d6a1> 3371 <d6a2> <d6a7> 17961 <d6a8> <d6a8> 3372 <d6a9> <d6ab> 17967 <d6ac> <d6ac> 3373 <d6ad> <d6af> 17970 <d6b0> <d6b0> 3374 <d6b1> <d6b8> 17973 <d6b9> <d6b9> 3375 <d6ba> <d6ba> 17981 <d6bb> <d6bb> 3376 <d6bc> <d6c3> 17982 <d6c4> <d6c5> 3377 <d6c6> <d6c7> 17990 <d6c8> <d6c8> 3379 <d6c9> <d6cb> 17992 <d6cc> <d6cc> 3380 <d6cd> <d6d0> 17995 <d6d1> <d6d1> 3381 <d6d2> <d6d3> 17999 <d6d4> <d6d4> 3382 <d6d5> <d6d6> 18001 <d6d7> <d6d7> 3383 <d6d8> <d6d8> 18003 <d6d9> <d6d9> 3384 <d6da> <d6df> 18004 <d6e0> <d6e0> 3385 <d6e1> <d6e3> 18010 <d6e4> <d6e4> 3386 <d6e5> <d6e7> 18013 <d6e8> <d6e8> 3387 <d6e9> <d6ef> 18016 <d6f0> <d6f0> 3388 <d6f1> <d6f4> 18023 <d6f5> <d6f5> 3389 <d6f6> <d6fb> 18027 <d6fc> <d6fd> 3390 <d6fe> <d6ff> 18033 <d700> <d700> 3392 <d701> <d703> 18035 <d704> <d704> 3393 <d705> <d710> 18038 <d711> <d711> 3394 <d712> <d717> 18050 <d718> <d719> 3395 <d71a> <d71b> 18056 <d71c> <d71c> 3397 <d71d> <d71f> 18058 <d720> <d720> 3398 <d721> <d727> 18061 <d728> <d729> 3399 <d72a> <d72a> 18068 <d72b> <d72b> 3401 <d72c> <d72c> 18069 <d72d> <d72d> 3402 <d72e> <d733> 18070 <d734> <d735> 3403 <d736> <d737> 18076 <d738> <d738> 3405 <d739> <d73b> 18078 <d73c> <d73c> 3406 <d73d> <d743> 18081 <d744> <d744> 3407 <d745> <d746> 18088 <d747> <d747> 3408 <d748> <d748> 18090 <d749> <d749> 3409 <d74a> <d74f> 18091 <d750> <d751> 3410 <d752> <d753> 18097 <d754> <d754> 3412 <d755> <d755> 18099 <d756> <d759> 3413 <d75a> <d75f> 18100 <d760> <d761> 3417 <d762> <d762> 18106 <d763> <d763> 3419 <d764> <d764> 18107 <d765> <d765> 3420 <d766> <d768> 18108 <d769> <d769> 3421 <d76a> <d76b> 18111 endcidrange 100 begincidrange <d76c> <d76c> 3422 <d76d> <d76f> 18113 <d770> <d770> 3423 <d771> <d773> 18116 <d774> <d774> 3424 <d775> <d77b> 18119 <d77c> <d77d> 3425 <d77e> <d780> 18126 <d781> <d781> 3427 <d782> <d787> 18129 <d788> <d789> 3428 <d78a> <d78b> 18135 <d78c> <d78c> 3430 <d78d> <d78f> 18137 <d790> <d790> 3431 <d791> <d797> 18140 <d798> <d799> 3432 <d79a> <d79a> 18147 <d79b> <d79b> 3434 <d79c> <d79c> 18148 <d79d> <d79d> 3435 <d79e> <d7a3> 18149 <f900> <f900> 4116 <f901> <f901> 3678 <f902> <f902> 7053 <f903> <f903> 3460 <f904> <f904> 7900 <f905> <f905> 3802 <f906> <f906> 3902 <f907> <f907> 3946 <f908> <f908> 3946 <f909> <f909> 3708 <f90a> <f90a> 4131 <f90b> <f90b> 4374 <f90c> <f90c> 4156 <f90d> <f913> 4375 <f914> <f914> 5800 <f915> <f917> 4382 <f918> <f91d> 4386 <f91e> <f920> 4394 <f921> <f921> 4399 <f922> <f922> 4403 <f923> <f924> 4406 <f925> <f92b> 4409 <f92c> <f92d> 4419 <f92e> <f92e> 4424 <f92f> <f92f> 4511 <f930> <f931> 4513 <f932> <f937> 4517 <f938> <f93a> 4524 <f93b> <f940> 4528 <f941> <f943> 4535 <f944> <f945> 4541 <f946> <f948> 4545 <f949> <f949> 4550 <f94a> <f94a> 4564 <f94b> <f94e> 4566 <f94f> <f950> 4571 <f951> <f951> 4576 <f952> <f955> 4604 <f956> <f959> 4609 <f95a> <f95a> 4318 <f95b> <f95b> 4136 <f95c> <f95c> 5800 <f95d> <f95d> 4139 <f95e> <f95e> 4192 <f95f> <f95f> 4167 <f960> <f960> 4172 <f961> <f961> 5552 <f962> <f962> 6424 <f963> <f963> 5151 <f964> <f964> 4922 <f965> <f965> 7518 <f966> <f966> 5079 <f967> <f967> 5109 <f968> <f968> 7607 <f969> <f969> 5584 <f96a> <f96a> 5367 <f96b> <f96b> 7083 <f96c> <f96c> 5362 <f96d> <f96d> 5485 <f96e> <f96e> 6001 <f96f> <f96f> 5460 <f970> <f970> 5317 <f971> <f971> 7009 <f972> <f972> 7370 <f973> <f973> 5678 <f974> <f974> 5874 <f975> <f977> 4425 <f978> <f97a> 4429 <f97b> <f97d> 4435 <f97e> <f97e> 4439 <f97f> <f980> 4442 <f981> <f981> 4159 <f982> <f982> 4444 <f983> <f983> 4447 <f984> <f985> 4449 <f986> <f986> 4453 <f987> <f98c> 4455 <f98d> <f98d> 4463 endcidrange 94 begincidrange <f98e> <f98e> 4160 <f98f> <f990> 4465 <f991> <f991> 4161 <f992> <f994> 4468 <f995> <f995> 4162 <f996> <f997> 4471 <f998> <f998> 4474 <f999> <f999> 4473 <f99a> <f99b> 4475 <f99c> <f99d> 4478 <f99e> <f99e> 6447 <f99f> <f9a0> 4481 <f9a1> <f9a1> 5460 <f9a2> <f9a2> 4483 <f9a3> <f9a3> 4163 <f9a4> <f9a4> 4166 <f9a5> <f9a5> 4485 <f9a6> <f9a8> 4487 <f9a9> <f9a9> 4491 <f9aa> <f9aa> 4167 <f9ab> <f9ad> 4493 <f9ae> <f9ae> 7783 <f9af> <f9af> 4497 <f9b0> <f9b0> 4499 <f9b1> <f9b4> 4501 <f9b5> <f9b5> 4506 <f9b6> <f9b8> 4508 <f9b9> <f9b9> 5797 <f9ba> <f9bc> 4551 <f9bd> <f9bd> 4180 <f9be> <f9be> 4555 <f9bf> <f9bf> 5800 <f9c0> <f9c1> 4556 <f9c2> <f9c3> 4560 <f9c4> <f9c4> 4563 <f9c5> <f9c5> 7988 <f9c6> <f9c6> 6123 <f9c7> <f9c7> 4577 <f9c8> <f9c8> 4183 <f9c9> <f9c9> 4579 <f9ca> <f9cb> 4581 <f9cc> <f9cc> 4584 <f9cd> <f9cd> 4586 <f9ce> <f9ce> 4588 <f9cf> <f9cf> 4184 <f9d0> <f9d3> 4590 <f9d4> <f9d6> 4595 <f9d7> <f9da> 4599 <f9db> <f9db> 5552 <f9dc> <f9dc> 4603 <f9dd> <f9dd> 4614 <f9de> <f9de> 4616 <f9df> <f9df> 4618 <f9e0> <f9e0> 5950 <f9e1> <f9e2> 4620 <f9e3> <f9e3> 4187 <f9e4> <f9e4> 4625 <f9e5> <f9e5> 4627 <f9e6> <f9e6> 4629 <f9e7> <f9e9> 4632 <f9ea> <f9ea> 4636 <f9eb> <f9ec> 4188 <f9ed> <f9ed> 4638 <f9ee> <f9f0> 4640 <f9f1> <f9f5> 4644 <f9f6> <f9f6> 4650 <f9f7> <f9f9> 4653 <f9fa> <f9fa> 5351 <f9fb> <f9fb> 6494 <f9fc> <f9fc> 5731 <f9fd> <f9fd> 5771 <f9fe> <f9fe> 4191 <f9ff> <f9ff> 6484 <fa00> <fa00> 6684 <fa01> <fa01> 4279 <fa02> <fa02> 7139 <fa03> <fa03> 4247 <fa04> <fa04> 4266 <fa05> <fa05> 4340 <fa06> <fa06> 7572 <fa07> <fa07> 5088 <fa08> <fa08> 7709 <fa09> <fa09> 3558 <fa0a> <fa0a> 3644 <fa0b> <fa0b> 3815 <ff01> <ff3b> 264 <ff3c> <ff3c> 112 <ff3d> <ff5d> 324 <ff5e> <ff5e> 113 <ffe0> <ffe1> 143 <ffe2> <ffe2> 194 <ffe3> <ffe3> 357 <ffe5> <ffe5> 145 <ffe6> <ffe6> 323 endcidrange endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF \ No newline at end of file
diff --git a/src/main/resources/Resources/cmap/UniKS-UCS2-V b/src/main/resources/Resources/cmap/UniKS-UCS2-V
new file mode 100644
index 0000000..6854e28
--- /dev/null
+++ b/src/main/resources/Resources/cmap/UniKS-UCS2-V
@@ -0,0 +1 @@
+%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%DocumentNeededResources: CMap (UniKS-UCS2-H) %%IncludeResource: ProcSet (CIDInit) %%IncludeResource: CMap (UniKS-UCS2-H) %%BeginResource: CMap (UniKS-UCS2-V) %%Title: (UniKS-UCS2-V Adobe Korea1 1) %%Version: 10.001 %%Copyright: ----------------------------------------------------------- %%Copyright: Copyright 1990-1999 Adobe Systems Incorporated. %%Copyright: All Rights Reserved. %%Copyright: %%Copyright: Patents Pending %%Copyright: %%Copyright: NOTICE: All information contained herein is the property %%Copyright: of Adobe Systems Incorporated. %%Copyright: %%Copyright: Permission is granted for redistribution of this file %%Copyright: provided this copyright notice is maintained intact and %%Copyright: that the contents of this file are not altered in any %%Copyright: way from its original form. %%Copyright: %%Copyright: PostScript and Display PostScript are trademarks of %%Copyright: Adobe Systems Incorporated which may be registered in %%Copyright: certain jurisdictions. %%Copyright: ----------------------------------------------------------- %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /UniKS-UCS2-H usecmap /CIDSystemInfo 3 dict dup begin /Registry (Adobe) def /Ordering (Korea1) def /Supplement 1 def end def /CMapName /UniKS-UCS2-V def /CMapVersion 10.001 def /CMapType 1 def /XUID [1 10 25407] def /WMode 1 def 18 begincidrange <2013> <2014> 8059 <2016> <2016> 8061 <2025> <2025> 8058 <3001> <3002> 8056 <3008> <3011> 8065 <3013> <3013> 8075 <3014> <3015> 8063 <ff01> <ff01> 8076 <ff08> <ff09> 8077 <ff0c> <ff0c> 8079 <ff0e> <ff0e> 8080 <ff1a> <ff1f> 8081 <ff3b> <ff3b> 8087 <ff3d> <ff3d> 8088 <ff3f> <ff3f> 8089 <ff5b> <ff5d> 8090 <ff5e> <ff5e> 8062 <ffe3> <ffe3> 8093 endcidrange endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF \ No newline at end of file
diff --git a/src/main/resources/Resources/cmap/V b/src/main/resources/Resources/cmap/V
new file mode 100644
index 0000000..db34b44
--- /dev/null
+++ b/src/main/resources/Resources/cmap/V
@@ -0,0 +1 @@
+%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%DocumentNeededResources: CMap (H) %%IncludeResource: ProcSet (CIDInit) %%IncludeResource: CMap (H) %%BeginResource: CMap (V) %%Title: (V Adobe Japan1 0) %%Version: 10.001 %%Copyright: ----------------------------------------------------------- %%Copyright: Copyright 1990-1998 Adobe Systems Incorporated. %%Copyright: All Rights Reserved. %%Copyright: %%Copyright: Patents Pending %%Copyright: %%Copyright: NOTICE: All information contained herein is the property %%Copyright: of Adobe Systems Incorporated. %%Copyright: %%Copyright: Permission is granted for redistribution of this file %%Copyright: provided this copyright notice is maintained intact and %%Copyright: that the contents of this file are not altered in any %%Copyright: way from its original form. %%Copyright: %%Copyright: PostScript and Display PostScript are trademarks of %%Copyright: Adobe Systems Incorporated which may be registered in %%Copyright: certain jurisdictions. %%Copyright: ----------------------------------------------------------- %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /H usecmap /CIDSystemInfo 3 dict dup begin /Registry (Adobe) def /Ordering (Japan1) def /Supplement 0 def end def /CMapName /V def /CMapVersion 10.001 def /CMapType 1 def /UIDOffset 850 def /XUID [1 10 25340] def /WMode 1 def 27 begincidrange <2122> <2123> 7887 <2131> <2132> 7889 <213c> <213e> 7891 <2141> <2145> 7894 <214a> <215b> 7899 <2161> <2161> 7917 <2421> <2421> 7918 <2423> <2423> 7919 <2425> <2425> 7920 <2427> <2427> 7921 <2429> <2429> 7922 <2443> <2443> 7923 <2463> <2463> 7924 <2465> <2465> 7925 <2467> <2467> 7926 <246e> <246e> 7927 <2521> <2521> 7928 <2523> <2523> 7929 <2525> <2525> 7930 <2527> <2527> 7931 <2529> <2529> 7932 <2543> <2543> 7933 <2563> <2563> 7934 <2565> <2565> 7935 <2567> <2567> 7936 <256e> <256e> 7937 <2575> <2576> 7938 endcidrange endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF \ No newline at end of file
diff --git a/src/main/resources/Resources/cmap/WP-Symbol b/src/main/resources/Resources/cmap/WP-Symbol
new file mode 100644
index 0000000..881108c
--- /dev/null
+++ b/src/main/resources/Resources/cmap/WP-Symbol
@@ -0,0 +1,87 @@
+%!PS-Adobe-3.0 Resource-CMap
+%%DocumentNeededResources: ProcSet (CIDInit)
+%%IncludeResource: ProcSet (CIDInit)
+%%BeginResource: CMap (WP-Symbol)
+%%Title: (WP-Symbol Adobe Japan1 0)
+%%Version: 6.001
+%%Copyright: -----------------------------------------------------------
+%%Copyright: Copyright 1990-1997 Adobe Systems Incorporated.
+%%Copyright: All Rights Reserved.
+%%Copyright:
+%%Copyright: Patents Pending
+%%Copyright:
+%%Copyright: NOTICE: All information contained herein is the property
+%%Copyright: of Adobe Systems Incorporated.
+%%Copyright:
+%%Copyright: Permission is granted for redistribution of this file
+%%Copyright: provided this copyright notice is maintained intact and
+%%Copyright: that the contents of this file are not altered in any
+%%Copyright: way from its original form.
+%%Copyright:
+%%Copyright: PostScript and Display PostScript are trademarks of
+%%Copyright: Adobe Systems Incorporated which may be registered in
+%%Copyright: certain jurisdictions.
+%%Copyright: -----------------------------------------------------------
+%%EndComments
+
+/CIDInit /ProcSet findresource begin
+
+12 dict begin
+
+begincmap
+
+/CIDSystemInfo 3 dict dup begin
+ /Registry (Adobe) def
+ /Ordering (Japan1) def
+ /Supplement 0 def
+end def
+
+/CMapName /WP-Symbol def
+/CMapVersion 6.001 def
+/CMapType 1 def
+
+/UIDOffset 868 def
+/XUID [1 10 25352] def
+
+/WMode 0 def
+
+1 begincodespacerange
+ <00> <FF>
+endcodespacerange
+
+27 begincidrange
+<01> <01> 8056
+<02> <02> 8058
+<03> <03> 8191
+<04> <04> 8196
+<05> <18> 8061
+<19> <22> 8092
+<23> <23> 8186
+<24> <25> 8020
+<26> <26> 8187
+<27> <28> 8022
+<29> <29> 8188
+<2a> <2a> 8037
+<2b> <2d> 8024
+<2e> <2f> 8189
+<30> <31> 8192
+<32> <33> 7899
+<34> <34> 7894
+<35> <35> 8194
+<36> <36> 8035
+<37> <39> 8027
+<3a> <3a> 8195
+<3b> <54> 8112
+<55> <5d> 8197
+<5e> <5e> 8151
+<61> <71> 8206
+<72> <72> 8057
+<73> <77> 8223
+endcidrange
+endcmap
+CMapName currentdict /CMap defineresource pop
+end
+end
+
+%%EndResource
+%%EOF
diff --git a/src/main/resources/Resources/colorspace-profiles/CMY.pf b/src/main/resources/Resources/colorspace-profiles/CMY.pf
new file mode 100644
index 0000000..acc71dd
--- /dev/null
+++ b/src/main/resources/Resources/colorspace-profiles/CMY.pf
Binary files differ
diff --git a/src/main/resources/Resources/colorspace-profiles/CMYK.pf b/src/main/resources/Resources/colorspace-profiles/CMYK.pf
new file mode 100644
index 0000000..24af49e
--- /dev/null
+++ b/src/main/resources/Resources/colorspace-profiles/CMYK.pf
Binary files differ
diff --git a/src/main/resources/Resources/colorspace-profiles/README.txt b/src/main/resources/Resources/colorspace-profiles/README.txt
new file mode 100644
index 0000000..d3ac504
--- /dev/null
+++ b/src/main/resources/Resources/colorspace-profiles/README.txt
@@ -0,0 +1,9 @@
+Java[tm] Advanced Imaging 1.1.2
+These color profiles were downloaded from
+http://java.sun.com/products/java-media/jai/downloads/download-1_1_2.html
+
+Please read the license in the licenses directory.
+
+The only profile that is actually used is the CMYK.pf, the others are unused but the license states
+that redistribute must include the complete software package so the other profiles are included
+as well. \ No newline at end of file
diff --git a/src/main/resources/Resources/colorspace-profiles/YCC601.pf b/src/main/resources/Resources/colorspace-profiles/YCC601.pf
new file mode 100644
index 0000000..7ee086d
--- /dev/null
+++ b/src/main/resources/Resources/colorspace-profiles/YCC601.pf
Binary files differ
diff --git a/src/main/resources/Resources/colorspace-profiles/YCC601L.pf b/src/main/resources/Resources/colorspace-profiles/YCC601L.pf
new file mode 100644
index 0000000..1f7e66b
--- /dev/null
+++ b/src/main/resources/Resources/colorspace-profiles/YCC601L.pf
Binary files differ
diff --git a/src/main/resources/Resources/colorspace-profiles/YCC709.pf b/src/main/resources/Resources/colorspace-profiles/YCC709.pf
new file mode 100644
index 0000000..d9f5a5a
--- /dev/null
+++ b/src/main/resources/Resources/colorspace-profiles/YCC709.pf
Binary files differ
diff --git a/src/main/resources/Resources/colorspace-profiles/YCC709L.pf b/src/main/resources/Resources/colorspace-profiles/YCC709L.pf
new file mode 100644
index 0000000..7d9a90b
--- /dev/null
+++ b/src/main/resources/Resources/colorspace-profiles/YCC709L.pf
Binary files differ
diff --git a/src/main/resources/Resources/colorspace-profiles/YLINEAR.pf b/src/main/resources/Resources/colorspace-profiles/YLINEAR.pf
new file mode 100644
index 0000000..b42e0cd
--- /dev/null
+++ b/src/main/resources/Resources/colorspace-profiles/YLINEAR.pf
Binary files differ
diff --git a/src/main/resources/Resources/glyphlist.txt b/src/main/resources/Resources/glyphlist.txt
new file mode 100644
index 0000000..8b9811f
--- /dev/null
+++ b/src/main/resources/Resources/glyphlist.txt
@@ -0,0 +1,4296 @@
+# Name: Adobe Glyph List
+# Table version: 2.0
+# Date: September 20, 2002
+#
+# See http://partners.adobe.com/asn/developer/typeforum/unicodegn.html
+#
+# Format: Semicolon-delimited fields:
+# (1) glyph name
+# (2) Unicode scalar value
+A;0041
+AE;00C6
+AEacute;01FC
+AEmacron;01E2
+AEsmall;F7E6
+Aacute;00C1
+Aacutesmall;F7E1
+Abreve;0102
+Abreveacute;1EAE
+Abrevecyrillic;04D0
+Abrevedotbelow;1EB6
+Abrevegrave;1EB0
+Abrevehookabove;1EB2
+Abrevetilde;1EB4
+Acaron;01CD
+Acircle;24B6
+Acircumflex;00C2
+Acircumflexacute;1EA4
+Acircumflexdotbelow;1EAC
+Acircumflexgrave;1EA6
+Acircumflexhookabove;1EA8
+Acircumflexsmall;F7E2
+Acircumflextilde;1EAA
+Acute;F6C9
+Acutesmall;F7B4
+Acyrillic;0410
+Adblgrave;0200
+Adieresis;00C4
+Adieresiscyrillic;04D2
+Adieresismacron;01DE
+Adieresissmall;F7E4
+Adotbelow;1EA0
+Adotmacron;01E0
+Agrave;00C0
+Agravesmall;F7E0
+Ahookabove;1EA2
+Aiecyrillic;04D4
+Ainvertedbreve;0202
+Alpha;0391
+Alphatonos;0386
+Amacron;0100
+Amonospace;FF21
+Aogonek;0104
+Aring;00C5
+Aringacute;01FA
+Aringbelow;1E00
+Aringsmall;F7E5
+Asmall;F761
+Atilde;00C3
+Atildesmall;F7E3
+Aybarmenian;0531
+B;0042
+Bcircle;24B7
+Bdotaccent;1E02
+Bdotbelow;1E04
+Becyrillic;0411
+Benarmenian;0532
+Beta;0392
+Bhook;0181
+Blinebelow;1E06
+Bmonospace;FF22
+Brevesmall;F6F4
+Bsmall;F762
+Btopbar;0182
+C;0043
+Caarmenian;053E
+Cacute;0106
+Caron;F6CA
+Caronsmall;F6F5
+Ccaron;010C
+Ccedilla;00C7
+Ccedillaacute;1E08
+Ccedillasmall;F7E7
+Ccircle;24B8
+Ccircumflex;0108
+Cdot;010A
+Cdotaccent;010A
+Cedillasmall;F7B8
+Chaarmenian;0549
+Cheabkhasiancyrillic;04BC
+Checyrillic;0427
+Chedescenderabkhasiancyrillic;04BE
+Chedescendercyrillic;04B6
+Chedieresiscyrillic;04F4
+Cheharmenian;0543
+Chekhakassiancyrillic;04CB
+Cheverticalstrokecyrillic;04B8
+Chi;03A7
+Chook;0187
+Circumflexsmall;F6F6
+Cmonospace;FF23
+Coarmenian;0551
+Csmall;F763
+D;0044
+DZ;01F1
+DZcaron;01C4
+Daarmenian;0534
+Dafrican;0189
+Dcaron;010E
+Dcedilla;1E10
+Dcircle;24B9
+Dcircumflexbelow;1E12
+Dcroat;0110
+Ddotaccent;1E0A
+Ddotbelow;1E0C
+Decyrillic;0414
+Deicoptic;03EE
+Delta;2206
+Deltagreek;0394
+Dhook;018A
+Dieresis;F6CB
+DieresisAcute;F6CC
+DieresisGrave;F6CD
+Dieresissmall;F7A8
+Digammagreek;03DC
+Djecyrillic;0402
+Dlinebelow;1E0E
+Dmonospace;FF24
+Dotaccentsmall;F6F7
+Dslash;0110
+Dsmall;F764
+Dtopbar;018B
+Dz;01F2
+Dzcaron;01C5
+Dzeabkhasiancyrillic;04E0
+Dzecyrillic;0405
+Dzhecyrillic;040F
+E;0045
+Eacute;00C9
+Eacutesmall;F7E9
+Ebreve;0114
+Ecaron;011A
+Ecedillabreve;1E1C
+Echarmenian;0535
+Ecircle;24BA
+Ecircumflex;00CA
+Ecircumflexacute;1EBE
+Ecircumflexbelow;1E18
+Ecircumflexdotbelow;1EC6
+Ecircumflexgrave;1EC0
+Ecircumflexhookabove;1EC2
+Ecircumflexsmall;F7EA
+Ecircumflextilde;1EC4
+Ecyrillic;0404
+Edblgrave;0204
+Edieresis;00CB
+Edieresissmall;F7EB
+Edot;0116
+Edotaccent;0116
+Edotbelow;1EB8
+Efcyrillic;0424
+Egrave;00C8
+Egravesmall;F7E8
+Eharmenian;0537
+Ehookabove;1EBA
+Eightroman;2167
+Einvertedbreve;0206
+Eiotifiedcyrillic;0464
+Elcyrillic;041B
+Elevenroman;216A
+Emacron;0112
+Emacronacute;1E16
+Emacrongrave;1E14
+Emcyrillic;041C
+Emonospace;FF25
+Encyrillic;041D
+Endescendercyrillic;04A2
+Eng;014A
+Enghecyrillic;04A4
+Enhookcyrillic;04C7
+Eogonek;0118
+Eopen;0190
+Epsilon;0395
+Epsilontonos;0388
+Ercyrillic;0420
+Ereversed;018E
+Ereversedcyrillic;042D
+Escyrillic;0421
+Esdescendercyrillic;04AA
+Esh;01A9
+Esmall;F765
+Eta;0397
+Etarmenian;0538
+Etatonos;0389
+Eth;00D0
+Ethsmall;F7F0
+Etilde;1EBC
+Etildebelow;1E1A
+Euro;20AC
+Ezh;01B7
+Ezhcaron;01EE
+Ezhreversed;01B8
+F;0046
+Fcircle;24BB
+Fdotaccent;1E1E
+Feharmenian;0556
+Feicoptic;03E4
+Fhook;0191
+Fitacyrillic;0472
+Fiveroman;2164
+Fmonospace;FF26
+Fourroman;2163
+Fsmall;F766
+G;0047
+GBsquare;3387
+Gacute;01F4
+Gamma;0393
+Gammaafrican;0194
+Gangiacoptic;03EA
+Gbreve;011E
+Gcaron;01E6
+Gcedilla;0122
+Gcircle;24BC
+Gcircumflex;011C
+Gcommaaccent;0122
+Gdot;0120
+Gdotaccent;0120
+Gecyrillic;0413
+Ghadarmenian;0542
+Ghemiddlehookcyrillic;0494
+Ghestrokecyrillic;0492
+Gheupturncyrillic;0490
+Ghook;0193
+Gimarmenian;0533
+Gjecyrillic;0403
+Gmacron;1E20
+Gmonospace;FF27
+Grave;F6CE
+Gravesmall;F760
+Gsmall;F767
+Gsmallhook;029B
+Gstroke;01E4
+H;0048
+H18533;25CF
+H18543;25AA
+H18551;25AB
+H22073;25A1
+HPsquare;33CB
+Haabkhasiancyrillic;04A8
+Hadescendercyrillic;04B2
+Hardsigncyrillic;042A
+Hbar;0126
+Hbrevebelow;1E2A
+Hcedilla;1E28
+Hcircle;24BD
+Hcircumflex;0124
+Hdieresis;1E26
+Hdotaccent;1E22
+Hdotbelow;1E24
+Hmonospace;FF28
+Hoarmenian;0540
+Horicoptic;03E8
+Hsmall;F768
+Hungarumlaut;F6CF
+Hungarumlautsmall;F6F8
+Hzsquare;3390
+I;0049
+IAcyrillic;042F
+IJ;0132
+IUcyrillic;042E
+Iacute;00CD
+Iacutesmall;F7ED
+Ibreve;012C
+Icaron;01CF
+Icircle;24BE
+Icircumflex;00CE
+Icircumflexsmall;F7EE
+Icyrillic;0406
+Idblgrave;0208
+Idieresis;00CF
+Idieresisacute;1E2E
+Idieresiscyrillic;04E4
+Idieresissmall;F7EF
+Idot;0130
+Idotaccent;0130
+Idotbelow;1ECA
+Iebrevecyrillic;04D6
+Iecyrillic;0415
+Ifraktur;2111
+Igrave;00CC
+Igravesmall;F7EC
+Ihookabove;1EC8
+Iicyrillic;0418
+Iinvertedbreve;020A
+Iishortcyrillic;0419
+Imacron;012A
+Imacroncyrillic;04E2
+Imonospace;FF29
+Iniarmenian;053B
+Iocyrillic;0401
+Iogonek;012E
+Iota;0399
+Iotaafrican;0196
+Iotadieresis;03AA
+Iotatonos;038A
+Ismall;F769
+Istroke;0197
+Itilde;0128
+Itildebelow;1E2C
+Izhitsacyrillic;0474
+Izhitsadblgravecyrillic;0476
+J;004A
+Jaarmenian;0541
+Jcircle;24BF
+Jcircumflex;0134
+Jecyrillic;0408
+Jheharmenian;054B
+Jmonospace;FF2A
+Jsmall;F76A
+K;004B
+KBsquare;3385
+KKsquare;33CD
+Kabashkircyrillic;04A0
+Kacute;1E30
+Kacyrillic;041A
+Kadescendercyrillic;049A
+Kahookcyrillic;04C3
+Kappa;039A
+Kastrokecyrillic;049E
+Kaverticalstrokecyrillic;049C
+Kcaron;01E8
+Kcedilla;0136
+Kcircle;24C0
+Kcommaaccent;0136
+Kdotbelow;1E32
+Keharmenian;0554
+Kenarmenian;053F
+Khacyrillic;0425
+Kheicoptic;03E6
+Khook;0198
+Kjecyrillic;040C
+Klinebelow;1E34
+Kmonospace;FF2B
+Koppacyrillic;0480
+Koppagreek;03DE
+Ksicyrillic;046E
+Ksmall;F76B
+L;004C
+LJ;01C7
+LL;F6BF
+Lacute;0139
+Lambda;039B
+Lcaron;013D
+Lcedilla;013B
+Lcircle;24C1
+Lcircumflexbelow;1E3C
+Lcommaaccent;013B
+Ldot;013F
+Ldotaccent;013F
+Ldotbelow;1E36
+Ldotbelowmacron;1E38
+Liwnarmenian;053C
+Lj;01C8
+Ljecyrillic;0409
+Llinebelow;1E3A
+Lmonospace;FF2C
+Lslash;0141
+Lslashsmall;F6F9
+Lsmall;F76C
+M;004D
+MBsquare;3386
+Macron;F6D0
+Macronsmall;F7AF
+Macute;1E3E
+Mcircle;24C2
+Mdotaccent;1E40
+Mdotbelow;1E42
+Menarmenian;0544
+Mmonospace;FF2D
+Msmall;F76D
+Mturned;019C
+Mu;039C
+N;004E
+NJ;01CA
+Nacute;0143
+Ncaron;0147
+Ncedilla;0145
+Ncircle;24C3
+Ncircumflexbelow;1E4A
+Ncommaaccent;0145
+Ndotaccent;1E44
+Ndotbelow;1E46
+Nhookleft;019D
+Nineroman;2168
+Nj;01CB
+Njecyrillic;040A
+Nlinebelow;1E48
+Nmonospace;FF2E
+Nowarmenian;0546
+Nsmall;F76E
+Ntilde;00D1
+Ntildesmall;F7F1
+Nu;039D
+O;004F
+OE;0152
+OEsmall;F6FA
+Oacute;00D3
+Oacutesmall;F7F3
+Obarredcyrillic;04E8
+Obarreddieresiscyrillic;04EA
+Obreve;014E
+Ocaron;01D1
+Ocenteredtilde;019F
+Ocircle;24C4
+Ocircumflex;00D4
+Ocircumflexacute;1ED0
+Ocircumflexdotbelow;1ED8
+Ocircumflexgrave;1ED2
+Ocircumflexhookabove;1ED4
+Ocircumflexsmall;F7F4
+Ocircumflextilde;1ED6
+Ocyrillic;041E
+Odblacute;0150
+Odblgrave;020C
+Odieresis;00D6
+Odieresiscyrillic;04E6
+Odieresissmall;F7F6
+Odotbelow;1ECC
+Ogoneksmall;F6FB
+Ograve;00D2
+Ogravesmall;F7F2
+Oharmenian;0555
+Ohm;2126
+Ohookabove;1ECE
+Ohorn;01A0
+Ohornacute;1EDA
+Ohorndotbelow;1EE2
+Ohorngrave;1EDC
+Ohornhookabove;1EDE
+Ohorntilde;1EE0
+Ohungarumlaut;0150
+Oi;01A2
+Oinvertedbreve;020E
+Omacron;014C
+Omacronacute;1E52
+Omacrongrave;1E50
+Omega;2126
+Omegacyrillic;0460
+Omegagreek;03A9
+Omegaroundcyrillic;047A
+Omegatitlocyrillic;047C
+Omegatonos;038F
+Omicron;039F
+Omicrontonos;038C
+Omonospace;FF2F
+Oneroman;2160
+Oogonek;01EA
+Oogonekmacron;01EC
+Oopen;0186
+Oslash;00D8
+Oslashacute;01FE
+Oslashsmall;F7F8
+Osmall;F76F
+Ostrokeacute;01FE
+Otcyrillic;047E
+Otilde;00D5
+Otildeacute;1E4C
+Otildedieresis;1E4E
+Otildesmall;F7F5
+P;0050
+Pacute;1E54
+Pcircle;24C5
+Pdotaccent;1E56
+Pecyrillic;041F
+Peharmenian;054A
+Pemiddlehookcyrillic;04A6
+Phi;03A6
+Phook;01A4
+Pi;03A0
+Piwrarmenian;0553
+Pmonospace;FF30
+Psi;03A8
+Psicyrillic;0470
+Psmall;F770
+Q;0051
+Qcircle;24C6
+Qmonospace;FF31
+Qsmall;F771
+R;0052
+Raarmenian;054C
+Racute;0154
+Rcaron;0158
+Rcedilla;0156
+Rcircle;24C7
+Rcommaaccent;0156
+Rdblgrave;0210
+Rdotaccent;1E58
+Rdotbelow;1E5A
+Rdotbelowmacron;1E5C
+Reharmenian;0550
+Rfraktur;211C
+Rho;03A1
+Ringsmall;F6FC
+Rinvertedbreve;0212
+Rlinebelow;1E5E
+Rmonospace;FF32
+Rsmall;F772
+Rsmallinverted;0281
+Rsmallinvertedsuperior;02B6
+S;0053
+SF010000;250C
+SF020000;2514
+SF030000;2510
+SF040000;2518
+SF050000;253C
+SF060000;252C
+SF070000;2534
+SF080000;251C
+SF090000;2524
+SF100000;2500
+SF110000;2502
+SF190000;2561
+SF200000;2562
+SF210000;2556
+SF220000;2555
+SF230000;2563
+SF240000;2551
+SF250000;2557
+SF260000;255D
+SF270000;255C
+SF280000;255B
+SF360000;255E
+SF370000;255F
+SF380000;255A
+SF390000;2554
+SF400000;2569
+SF410000;2566
+SF420000;2560
+SF430000;2550
+SF440000;256C
+SF450000;2567
+SF460000;2568
+SF470000;2564
+SF480000;2565
+SF490000;2559
+SF500000;2558
+SF510000;2552
+SF520000;2553
+SF530000;256B
+SF540000;256A
+Sacute;015A
+Sacutedotaccent;1E64
+Sampigreek;03E0
+Scaron;0160
+Scarondotaccent;1E66
+Scaronsmall;F6FD
+Scedilla;015E
+Schwa;018F
+Schwacyrillic;04D8
+Schwadieresiscyrillic;04DA
+Scircle;24C8
+Scircumflex;015C
+Scommaaccent;0218
+Sdotaccent;1E60
+Sdotbelow;1E62
+Sdotbelowdotaccent;1E68
+Seharmenian;054D
+Sevenroman;2166
+Shaarmenian;0547
+Shacyrillic;0428
+Shchacyrillic;0429
+Sheicoptic;03E2
+Shhacyrillic;04BA
+Shimacoptic;03EC
+Sigma;03A3
+Sixroman;2165
+Smonospace;FF33
+Softsigncyrillic;042C
+Ssmall;F773
+Stigmagreek;03DA
+T;0054
+Tau;03A4
+Tbar;0166
+Tcaron;0164
+Tcedilla;0162
+Tcircle;24C9
+Tcircumflexbelow;1E70
+Tcommaaccent;0162
+Tdotaccent;1E6A
+Tdotbelow;1E6C
+Tecyrillic;0422
+Tedescendercyrillic;04AC
+Tenroman;2169
+Tetsecyrillic;04B4
+Theta;0398
+Thook;01AC
+Thorn;00DE
+Thornsmall;F7FE
+Threeroman;2162
+Tildesmall;F6FE
+Tiwnarmenian;054F
+Tlinebelow;1E6E
+Tmonospace;FF34
+Toarmenian;0539
+Tonefive;01BC
+Tonesix;0184
+Tonetwo;01A7
+Tretroflexhook;01AE
+Tsecyrillic;0426
+Tshecyrillic;040B
+Tsmall;F774
+Twelveroman;216B
+Tworoman;2161
+U;0055
+Uacute;00DA
+Uacutesmall;F7FA
+Ubreve;016C
+Ucaron;01D3
+Ucircle;24CA
+Ucircumflex;00DB
+Ucircumflexbelow;1E76
+Ucircumflexsmall;F7FB
+Ucyrillic;0423
+Udblacute;0170
+Udblgrave;0214
+Udieresis;00DC
+Udieresisacute;01D7
+Udieresisbelow;1E72
+Udieresiscaron;01D9
+Udieresiscyrillic;04F0
+Udieresisgrave;01DB
+Udieresismacron;01D5
+Udieresissmall;F7FC
+Udotbelow;1EE4
+Ugrave;00D9
+Ugravesmall;F7F9
+Uhookabove;1EE6
+Uhorn;01AF
+Uhornacute;1EE8
+Uhorndotbelow;1EF0
+Uhorngrave;1EEA
+Uhornhookabove;1EEC
+Uhorntilde;1EEE
+Uhungarumlaut;0170
+Uhungarumlautcyrillic;04F2
+Uinvertedbreve;0216
+Ukcyrillic;0478
+Umacron;016A
+Umacroncyrillic;04EE
+Umacrondieresis;1E7A
+Umonospace;FF35
+Uogonek;0172
+Upsilon;03A5
+Upsilon1;03D2
+Upsilonacutehooksymbolgreek;03D3
+Upsilonafrican;01B1
+Upsilondieresis;03AB
+Upsilondieresishooksymbolgreek;03D4
+Upsilonhooksymbol;03D2
+Upsilontonos;038E
+Uring;016E
+Ushortcyrillic;040E
+Usmall;F775
+Ustraightcyrillic;04AE
+Ustraightstrokecyrillic;04B0
+Utilde;0168
+Utildeacute;1E78
+Utildebelow;1E74
+V;0056
+Vcircle;24CB
+Vdotbelow;1E7E
+Vecyrillic;0412
+Vewarmenian;054E
+Vhook;01B2
+Vmonospace;FF36
+Voarmenian;0548
+Vsmall;F776
+Vtilde;1E7C
+W;0057
+Wacute;1E82
+Wcircle;24CC
+Wcircumflex;0174
+Wdieresis;1E84
+Wdotaccent;1E86
+Wdotbelow;1E88
+Wgrave;1E80
+Wmonospace;FF37
+Wsmall;F777
+X;0058
+Xcircle;24CD
+Xdieresis;1E8C
+Xdotaccent;1E8A
+Xeharmenian;053D
+Xi;039E
+Xmonospace;FF38
+Xsmall;F778
+Y;0059
+Yacute;00DD
+Yacutesmall;F7FD
+Yatcyrillic;0462
+Ycircle;24CE
+Ycircumflex;0176
+Ydieresis;0178
+Ydieresissmall;F7FF
+Ydotaccent;1E8E
+Ydotbelow;1EF4
+Yericyrillic;042B
+Yerudieresiscyrillic;04F8
+Ygrave;1EF2
+Yhook;01B3
+Yhookabove;1EF6
+Yiarmenian;0545
+Yicyrillic;0407
+Yiwnarmenian;0552
+Ymonospace;FF39
+Ysmall;F779
+Ytilde;1EF8
+Yusbigcyrillic;046A
+Yusbigiotifiedcyrillic;046C
+Yuslittlecyrillic;0466
+Yuslittleiotifiedcyrillic;0468
+Z;005A
+Zaarmenian;0536
+Zacute;0179
+Zcaron;017D
+Zcaronsmall;F6FF
+Zcircle;24CF
+Zcircumflex;1E90
+Zdot;017B
+Zdotaccent;017B
+Zdotbelow;1E92
+Zecyrillic;0417
+Zedescendercyrillic;0498
+Zedieresiscyrillic;04DE
+Zeta;0396
+Zhearmenian;053A
+Zhebrevecyrillic;04C1
+Zhecyrillic;0416
+Zhedescendercyrillic;0496
+Zhedieresiscyrillic;04DC
+Zlinebelow;1E94
+Zmonospace;FF3A
+Zsmall;F77A
+Zstroke;01B5
+a;0061
+aabengali;0986
+aacute;00E1
+aadeva;0906
+aagujarati;0A86
+aagurmukhi;0A06
+aamatragurmukhi;0A3E
+aarusquare;3303
+aavowelsignbengali;09BE
+aavowelsigndeva;093E
+aavowelsigngujarati;0ABE
+abbreviationmarkarmenian;055F
+abbreviationsigndeva;0970
+abengali;0985
+abopomofo;311A
+abreve;0103
+abreveacute;1EAF
+abrevecyrillic;04D1
+abrevedotbelow;1EB7
+abrevegrave;1EB1
+abrevehookabove;1EB3
+abrevetilde;1EB5
+acaron;01CE
+acircle;24D0
+acircumflex;00E2
+acircumflexacute;1EA5
+acircumflexdotbelow;1EAD
+acircumflexgrave;1EA7
+acircumflexhookabove;1EA9
+acircumflextilde;1EAB
+acute;00B4
+acutebelowcmb;0317
+acutecmb;0301
+acutecomb;0301
+acutedeva;0954
+acutelowmod;02CF
+acutetonecmb;0341
+acyrillic;0430
+adblgrave;0201
+addakgurmukhi;0A71
+adeva;0905
+adieresis;00E4
+adieresiscyrillic;04D3
+adieresismacron;01DF
+adotbelow;1EA1
+adotmacron;01E1
+ae;00E6
+aeacute;01FD
+aekorean;3150
+aemacron;01E3
+afii00208;2015
+afii08941;20A4
+afii10017;0410
+afii10018;0411
+afii10019;0412
+afii10020;0413
+afii10021;0414
+afii10022;0415
+afii10023;0401
+afii10024;0416
+afii10025;0417
+afii10026;0418
+afii10027;0419
+afii10028;041A
+afii10029;041B
+afii10030;041C
+afii10031;041D
+afii10032;041E
+afii10033;041F
+afii10034;0420
+afii10035;0421
+afii10036;0422
+afii10037;0423
+afii10038;0424
+afii10039;0425
+afii10040;0426
+afii10041;0427
+afii10042;0428
+afii10043;0429
+afii10044;042A
+afii10045;042B
+afii10046;042C
+afii10047;042D
+afii10048;042E
+afii10049;042F
+afii10050;0490
+afii10051;0402
+afii10052;0403
+afii10053;0404
+afii10054;0405
+afii10055;0406
+afii10056;0407
+afii10057;0408
+afii10058;0409
+afii10059;040A
+afii10060;040B
+afii10061;040C
+afii10062;040E
+afii10063;F6C4
+afii10064;F6C5
+afii10065;0430
+afii10066;0431
+afii10067;0432
+afii10068;0433
+afii10069;0434
+afii10070;0435
+afii10071;0451
+afii10072;0436
+afii10073;0437
+afii10074;0438
+afii10075;0439
+afii10076;043A
+afii10077;043B
+afii10078;043C
+afii10079;043D
+afii10080;043E
+afii10081;043F
+afii10082;0440
+afii10083;0441
+afii10084;0442
+afii10085;0443
+afii10086;0444
+afii10087;0445
+afii10088;0446
+afii10089;0447
+afii10090;0448
+afii10091;0449
+afii10092;044A
+afii10093;044B
+afii10094;044C
+afii10095;044D
+afii10096;044E
+afii10097;044F
+afii10098;0491
+afii10099;0452
+afii10100;0453
+afii10101;0454
+afii10102;0455
+afii10103;0456
+afii10104;0457
+afii10105;0458
+afii10106;0459
+afii10107;045A
+afii10108;045B
+afii10109;045C
+afii10110;045E
+afii10145;040F
+afii10146;0462
+afii10147;0472
+afii10148;0474
+afii10192;F6C6
+afii10193;045F
+afii10194;0463
+afii10195;0473
+afii10196;0475
+afii10831;F6C7
+afii10832;F6C8
+afii10846;04D9
+afii299;200E
+afii300;200F
+afii301;200D
+afii57381;066A
+afii57388;060C
+afii57392;0660
+afii57393;0661
+afii57394;0662
+afii57395;0663
+afii57396;0664
+afii57397;0665
+afii57398;0666
+afii57399;0667
+afii57400;0668
+afii57401;0669
+afii57403;061B
+afii57407;061F
+afii57409;0621
+afii57410;0622
+afii57411;0623
+afii57412;0624
+afii57413;0625
+afii57414;0626
+afii57415;0627
+afii57416;0628
+afii57417;0629
+afii57418;062A
+afii57419;062B
+afii57420;062C
+afii57421;062D
+afii57422;062E
+afii57423;062F
+afii57424;0630
+afii57425;0631
+afii57426;0632
+afii57427;0633
+afii57428;0634
+afii57429;0635
+afii57430;0636
+afii57431;0637
+afii57432;0638
+afii57433;0639
+afii57434;063A
+afii57440;0640
+afii57441;0641
+afii57442;0642
+afii57443;0643
+afii57444;0644
+afii57445;0645
+afii57446;0646
+afii57448;0648
+afii57449;0649
+afii57450;064A
+afii57451;064B
+afii57452;064C
+afii57453;064D
+afii57454;064E
+afii57455;064F
+afii57456;0650
+afii57457;0651
+afii57458;0652
+afii57470;0647
+afii57505;06A4
+afii57506;067E
+afii57507;0686
+afii57508;0698
+afii57509;06AF
+afii57511;0679
+afii57512;0688
+afii57513;0691
+afii57514;06BA
+afii57519;06D2
+afii57534;06D5
+afii57636;20AA
+afii57645;05BE
+afii57658;05C3
+afii57664;05D0
+afii57665;05D1
+afii57666;05D2
+afii57667;05D3
+afii57668;05D4
+afii57669;05D5
+afii57670;05D6
+afii57671;05D7
+afii57672;05D8
+afii57673;05D9
+afii57674;05DA
+afii57675;05DB
+afii57676;05DC
+afii57677;05DD
+afii57678;05DE
+afii57679;05DF
+afii57680;05E0
+afii57681;05E1
+afii57682;05E2
+afii57683;05E3
+afii57684;05E4
+afii57685;05E5
+afii57686;05E6
+afii57687;05E7
+afii57688;05E8
+afii57689;05E9
+afii57690;05EA
+afii57694;FB2A
+afii57695;FB2B
+afii57700;FB4B
+afii57705;FB1F
+afii57716;05F0
+afii57717;05F1
+afii57718;05F2
+afii57723;FB35
+afii57793;05B4
+afii57794;05B5
+afii57795;05B6
+afii57796;05BB
+afii57797;05B8
+afii57798;05B7
+afii57799;05B0
+afii57800;05B2
+afii57801;05B1
+afii57802;05B3
+afii57803;05C2
+afii57804;05C1
+afii57806;05B9
+afii57807;05BC
+afii57839;05BD
+afii57841;05BF
+afii57842;05C0
+afii57929;02BC
+afii61248;2105
+afii61289;2113
+afii61352;2116
+afii61573;202C
+afii61574;202D
+afii61575;202E
+afii61664;200C
+afii63167;066D
+afii64937;02BD
+agrave;00E0
+agujarati;0A85
+agurmukhi;0A05
+ahiragana;3042
+ahookabove;1EA3
+aibengali;0990
+aibopomofo;311E
+aideva;0910
+aiecyrillic;04D5
+aigujarati;0A90
+aigurmukhi;0A10
+aimatragurmukhi;0A48
+ainarabic;0639
+ainfinalarabic;FECA
+aininitialarabic;FECB
+ainmedialarabic;FECC
+ainvertedbreve;0203
+aivowelsignbengali;09C8
+aivowelsigndeva;0948
+aivowelsigngujarati;0AC8
+akatakana;30A2
+akatakanahalfwidth;FF71
+akorean;314F
+alef;05D0
+alefarabic;0627
+alefdageshhebrew;FB30
+aleffinalarabic;FE8E
+alefhamzaabovearabic;0623
+alefhamzaabovefinalarabic;FE84
+alefhamzabelowarabic;0625
+alefhamzabelowfinalarabic;FE88
+alefhebrew;05D0
+aleflamedhebrew;FB4F
+alefmaddaabovearabic;0622
+alefmaddaabovefinalarabic;FE82
+alefmaksuraarabic;0649
+alefmaksurafinalarabic;FEF0
+alefmaksurainitialarabic;FEF3
+alefmaksuramedialarabic;FEF4
+alefpatahhebrew;FB2E
+alefqamatshebrew;FB2F
+aleph;2135
+allequal;224C
+alpha;03B1
+alphatonos;03AC
+amacron;0101
+amonospace;FF41
+ampersand;0026
+ampersandmonospace;FF06
+ampersandsmall;F726
+amsquare;33C2
+anbopomofo;3122
+angbopomofo;3124
+angkhankhuthai;0E5A
+angle;2220
+angbracketleft;3008
+anglebracketleft;3008
+anglebracketleftvertical;FE3F
+anglebracketright;3009
+angbracketright;3009
+anglebracketrightvertical;FE40
+angleleft;2329
+angleright;232A
+angstrom;212B
+anoteleia;0387
+anudattadeva;0952
+anusvarabengali;0982
+anusvaradeva;0902
+anusvaragujarati;0A82
+aogonek;0105
+apaatosquare;3300
+aparen;249C
+apostrophearmenian;055A
+apostrophemod;02BC
+apple;F8FF
+approaches;2250
+approxequal;2248
+approxequalorimage;2252
+approximatelyequal;2245
+araeaekorean;318E
+araeakorean;318D
+arc;2312
+arighthalfring;1E9A
+aring;00E5
+aringacute;01FB
+aringbelow;1E01
+arrowboth;2194
+arrowdashdown;21E3
+arrowdashleft;21E0
+arrowdashright;21E2
+arrowdashup;21E1
+arrowdblboth;21D4
+arrowdbldown;21D3
+arrowdblleft;21D0
+arrowdblright;21D2
+arrowdblup;21D1
+arrowdown;2193
+arrowdownleft;2199
+arrowdownright;2198
+arrowdownwhite;21E9
+arrowheaddownmod;02C5
+arrowheadleftmod;02C2
+arrowheadrightmod;02C3
+arrowheadupmod;02C4
+arrowhorizex;F8E7
+arrowleft;2190
+arrowleftdbl;21D0
+arrowleftdblstroke;21CD
+arrowleftoverright;21C6
+arrowleftwhite;21E6
+arrowright;2192
+arrowrightdblstroke;21CF
+arrowrightheavy;279E
+arrowrightoverleft;21C4
+arrowrightwhite;21E8
+arrowtableft;21E4
+arrowtabright;21E5
+arrowup;2191
+arrowupdn;2195
+arrowupdnbse;21A8
+arrowupdownbase;21A8
+arrowupleft;2196
+arrowupleftofdown;21C5
+arrowupright;2197
+arrowupwhite;21E7
+arrowvertex;F8E6
+asciicircum;005E
+asciicircummonospace;FF3E
+asciitilde;007E
+asciitildemonospace;FF5E
+ascript;0251
+ascriptturned;0252
+asmallhiragana;3041
+asmallkatakana;30A1
+asmallkatakanahalfwidth;FF67
+asterisk;002A
+asteriskaltonearabic;066D
+asteriskarabic;066D
+asteriskmath;2217
+asteriskmonospace;FF0A
+asterisksmall;FE61
+asterism;2042
+asuperior;F6E9
+asymptoticallyequal;2243
+at;0040
+atilde;00E3
+atmonospace;FF20
+atsmall;FE6B
+aturned;0250
+aubengali;0994
+aubopomofo;3120
+audeva;0914
+augujarati;0A94
+augurmukhi;0A14
+aulengthmarkbengali;09D7
+aumatragurmukhi;0A4C
+auvowelsignbengali;09CC
+auvowelsigndeva;094C
+auvowelsigngujarati;0ACC
+avagrahadeva;093D
+aybarmenian;0561
+ayin;05E2
+ayinaltonehebrew;FB20
+ayinhebrew;05E2
+b;0062
+babengali;09AC
+backslash;005C
+backslashmonospace;FF3C
+badeva;092C
+bagujarati;0AAC
+bagurmukhi;0A2C
+bahiragana;3070
+bahtthai;0E3F
+bakatakana;30D0
+bar;007C
+barmonospace;FF5C
+bbopomofo;3105
+bcircle;24D1
+bdotaccent;1E03
+bdotbelow;1E05
+beamedsixteenthnotes;266C
+because;2235
+becyrillic;0431
+beharabic;0628
+behfinalarabic;FE90
+behinitialarabic;FE91
+behiragana;3079
+behmedialarabic;FE92
+behmeeminitialarabic;FC9F
+behmeemisolatedarabic;FC08
+behnoonfinalarabic;FC6D
+bekatakana;30D9
+benarmenian;0562
+bet;05D1
+beta;03B2
+betasymbolgreek;03D0
+betdagesh;FB31
+betdageshhebrew;FB31
+bethebrew;05D1
+betrafehebrew;FB4C
+bhabengali;09AD
+bhadeva;092D
+bhagujarati;0AAD
+bhagurmukhi;0A2D
+bhook;0253
+bihiragana;3073
+bikatakana;30D3
+bilabialclick;0298
+bindigurmukhi;0A02
+birusquare;3331
+blackcircle;25CF
+blackdiamond;25C6
+blackdownpointingtriangle;25BC
+blackleftpointingpointer;25C4
+blackleftpointingtriangle;25C0
+blacklenticularbracketleft;3010
+blacklenticularbracketleftvertical;FE3B
+blacklenticularbracketright;3011
+blacklenticularbracketrightvertical;FE3C
+blacklowerlefttriangle;25E3
+blacklowerrighttriangle;25E2
+blackrectangle;25AC
+blackrightpointingpointer;25BA
+blackrightpointingtriangle;25B6
+blacksmallsquare;25AA
+blacksmilingface;263B
+blacksquare;25A0
+blackstar;2605
+blackupperlefttriangle;25E4
+blackupperrighttriangle;25E5
+blackuppointingsmalltriangle;25B4
+blackuppointingtriangle;25B2
+blank;2423
+blinebelow;1E07
+block;2588
+bmonospace;FF42
+bobaimaithai;0E1A
+bohiragana;307C
+bokatakana;30DC
+bparen;249D
+bqsquare;33C3
+braceex;F8F4
+braceleft;007B
+braceleftbt;F8F3
+braceleftmid;F8F2
+braceleftmonospace;FF5B
+braceleftsmall;FE5B
+bracelefttp;F8F1
+braceleftvertical;FE37
+braceright;007D
+bracerightbt;F8FE
+bracerightmid;F8FD
+bracerightmonospace;FF5D
+bracerightsmall;FE5C
+bracerighttp;F8FC
+bracerightvertical;FE38
+bracketleft;005B
+bracketleftbt;F8F0
+bracketleftex;F8EF
+bracketleftmonospace;FF3B
+bracketlefttp;F8EE
+bracketright;005D
+bracketrightbt;F8FB
+bracketrightex;F8FA
+bracketrightmonospace;FF3D
+bracketrighttp;F8F9
+breve;02D8
+brevebelowcmb;032E
+brevecmb;0306
+breveinvertedbelowcmb;032F
+breveinvertedcmb;0311
+breveinverteddoublecmb;0361
+bridgebelowcmb;032A
+bridgeinvertedbelowcmb;033A
+brokenbar;00A6
+bstroke;0180
+bsuperior;F6EA
+btopbar;0183
+buhiragana;3076
+bukatakana;30D6
+bullet;2022
+bulletinverse;25D8
+bulletoperator;2219
+bullseye;25CE
+c;0063
+caarmenian;056E
+cabengali;099A
+cacute;0107
+cadeva;091A
+cagujarati;0A9A
+cagurmukhi;0A1A
+calsquare;3388
+candrabindubengali;0981
+candrabinducmb;0310
+candrabindudeva;0901
+candrabindugujarati;0A81
+capslock;21EA
+careof;2105
+caron;02C7
+caronbelowcmb;032C
+caroncmb;030C
+carriagereturn;21B5
+cbopomofo;3118
+ccaron;010D
+ccedilla;00E7
+ccedillaacute;1E09
+ccircle;24D2
+ccircumflex;0109
+ccurl;0255
+cdot;010B
+cdotaccent;010B
+cdsquare;33C5
+cedilla;00B8
+cedillacmb;0327
+cent;00A2
+centigrade;2103
+centinferior;F6DF
+centmonospace;FFE0
+centoldstyle;F7A2
+centsuperior;F6E0
+chaarmenian;0579
+chabengali;099B
+chadeva;091B
+chagujarati;0A9B
+chagurmukhi;0A1B
+chbopomofo;3114
+cheabkhasiancyrillic;04BD
+checkmark;2713
+checyrillic;0447
+chedescenderabkhasiancyrillic;04BF
+chedescendercyrillic;04B7
+chedieresiscyrillic;04F5
+cheharmenian;0573
+chekhakassiancyrillic;04CC
+cheverticalstrokecyrillic;04B9
+chi;03C7
+chieuchacirclekorean;3277
+chieuchaparenkorean;3217
+chieuchcirclekorean;3269
+chieuchkorean;314A
+chieuchparenkorean;3209
+chochangthai;0E0A
+chochanthai;0E08
+chochingthai;0E09
+chochoethai;0E0C
+chook;0188
+cieucacirclekorean;3276
+cieucaparenkorean;3216
+cieuccirclekorean;3268
+cieuckorean;3148
+cieucparenkorean;3208
+cieucuparenkorean;321C
+circle;25CB
+circlecopyrt;00A9
+circlemultiply;2297
+circleot;2299
+circleplus;2295
+circlepostalmark;3036
+circlewithlefthalfblack;25D0
+circlewithrighthalfblack;25D1
+circumflex;02C6
+circumflexbelowcmb;032D
+circumflexcmb;0302
+clear;2327
+clickalveolar;01C2
+clickdental;01C0
+clicklateral;01C1
+clickretroflex;01C3
+club;2663
+clubsuitblack;2663
+clubsuitwhite;2667
+cmcubedsquare;33A4
+cmonospace;FF43
+cmsquaredsquare;33A0
+coarmenian;0581
+colon;003A
+colonmonetary;20A1
+colonmonospace;FF1A
+colonsign;20A1
+colonsmall;FE55
+colontriangularhalfmod;02D1
+colontriangularmod;02D0
+comma;002C
+commaabovecmb;0313
+commaaboverightcmb;0315
+commaaccent;F6C3
+commaarabic;060C
+commaarmenian;055D
+commainferior;F6E1
+commamonospace;FF0C
+commareversedabovecmb;0314
+commareversedmod;02BD
+commasmall;FE50
+commasuperior;F6E2
+commaturnedabovecmb;0312
+commaturnedmod;02BB
+compass;263C
+congruent;2245
+contourintegral;222E
+control;2303
+controlACK;0006
+controlBEL;0007
+controlBS;0008
+controlCAN;0018
+controlCR;000D
+controlDC1;0011
+controlDC2;0012
+controlDC3;0013
+controlDC4;0014
+controlDEL;007F
+controlDLE;0010
+controlEM;0019
+controlENQ;0005
+controlEOT;0004
+controlESC;001B
+controlETB;0017
+controlETX;0003
+controlFF;000C
+controlFS;001C
+controlGS;001D
+controlHT;0009
+controlLF;000A
+controlNAK;0015
+controlRS;001E
+controlSI;000F
+controlSO;000E
+controlSOT;0002
+controlSTX;0001
+controlSUB;001A
+controlSYN;0016
+controlUS;001F
+controlVT;000B
+copyright;00A9
+copyrightsans;F8E9
+copyrightserif;F6D9
+cornerbracketleft;300C
+cornerbracketlefthalfwidth;FF62
+cornerbracketleftvertical;FE41
+cornerbracketright;300D
+cornerbracketrighthalfwidth;FF63
+cornerbracketrightvertical;FE42
+corporationsquare;337F
+cosquare;33C7
+coverkgsquare;33C6
+cparen;249E
+cruzeiro;20A2
+cstretched;0297
+curlyand;22CF
+curlyor;22CE
+currency;00A4
+cyrBreve;F6D1
+cyrFlex;F6D2
+cyrbreve;F6D4
+cyrflex;F6D5
+d;0064
+daarmenian;0564
+dabengali;09A6
+dadarabic;0636
+dadeva;0926
+dadfinalarabic;FEBE
+dadinitialarabic;FEBF
+dadmedialarabic;FEC0
+dagesh;05BC
+dageshhebrew;05BC
+dagger;2020
+daggerdbl;2021
+dagujarati;0AA6
+dagurmukhi;0A26
+dahiragana;3060
+dakatakana;30C0
+dalarabic;062F
+dalet;05D3
+daletdagesh;FB33
+daletdageshhebrew;FB33
+dalethatafpatah;05D3 05B2
+dalethatafpatahhebrew;05D3 05B2
+dalethatafsegol;05D3 05B1
+dalethatafsegolhebrew;05D3 05B1
+dalethebrew;05D3
+dalethiriq;05D3 05B4
+dalethiriqhebrew;05D3 05B4
+daletholam;05D3 05B9
+daletholamhebrew;05D3 05B9
+daletpatah;05D3 05B7
+daletpatahhebrew;05D3 05B7
+daletqamats;05D3 05B8
+daletqamatshebrew;05D3 05B8
+daletqubuts;05D3 05BB
+daletqubutshebrew;05D3 05BB
+daletsegol;05D3 05B6
+daletsegolhebrew;05D3 05B6
+daletsheva;05D3 05B0
+daletshevahebrew;05D3 05B0
+dalettsere;05D3 05B5
+dalettserehebrew;05D3 05B5
+dalfinalarabic;FEAA
+dammaarabic;064F
+dammalowarabic;064F
+dammatanaltonearabic;064C
+dammatanarabic;064C
+danda;0964
+dargahebrew;05A7
+dargalefthebrew;05A7
+dasiapneumatacyrilliccmb;0485
+dblGrave;F6D3
+dblanglebracketleft;300A
+dblanglebracketleftvertical;FE3D
+dblanglebracketright;300B
+dblanglebracketrightvertical;FE3E
+dblarchinvertedbelowcmb;032B
+dblarrowleft;21D4
+dblarrowright;21D2
+dbldanda;0965
+dblgrave;F6D6
+dblgravecmb;030F
+dblintegral;222C
+dbllowline;2017
+dbllowlinecmb;0333
+dbloverlinecmb;033F
+dblprimemod;02BA
+dblverticalbar;2016
+dblverticallineabovecmb;030E
+dbopomofo;3109
+dbsquare;33C8
+dcaron;010F
+dcedilla;1E11
+dcircle;24D3
+dcircumflexbelow;1E13
+dcroat;0111
+ddabengali;09A1
+ddadeva;0921
+ddagujarati;0AA1
+ddagurmukhi;0A21
+ddalarabic;0688
+ddalfinalarabic;FB89
+dddhadeva;095C
+ddhabengali;09A2
+ddhadeva;0922
+ddhagujarati;0AA2
+ddhagurmukhi;0A22
+ddotaccent;1E0B
+ddotbelow;1E0D
+decimalseparatorarabic;066B
+decimalseparatorpersian;066B
+decyrillic;0434
+degree;00B0
+dehihebrew;05AD
+dehiragana;3067
+deicoptic;03EF
+dekatakana;30C7
+deleteleft;232B
+deleteright;2326
+delta;03B4
+deltaturned;018D
+denominatorminusonenumeratorbengali;09F8
+dezh;02A4
+dhabengali;09A7
+dhadeva;0927
+dhagujarati;0AA7
+dhagurmukhi;0A27
+dhook;0257
+dialytikatonos;0385
+dialytikatonoscmb;0344
+diamond;2666
+diamondsuitwhite;2662
+dieresis;00A8
+dieresisacute;F6D7
+dieresisbelowcmb;0324
+dieresiscmb;0308
+dieresisgrave;F6D8
+dieresistonos;0385
+dihiragana;3062
+dikatakana;30C2
+dittomark;3003
+divide;00F7
+divides;2223
+divisionslash;2215
+djecyrillic;0452
+dkshade;2593
+dlinebelow;1E0F
+dlsquare;3397
+dmacron;0111
+dmonospace;FF44
+dnblock;2584
+dochadathai;0E0E
+dodekthai;0E14
+dohiragana;3069
+dokatakana;30C9
+dollar;0024
+dollarinferior;F6E3
+dollarmonospace;FF04
+dollaroldstyle;F724
+dollarsmall;FE69
+dollarsuperior;F6E4
+dong;20AB
+dorusquare;3326
+dotaccent;02D9
+dotaccentcmb;0307
+dotbelowcmb;0323
+dotbelowcomb;0323
+dotkatakana;30FB
+dotlessi;0131
+dotlessj;F6BE
+dotlessjstrokehook;0284
+dotmath;22C5
+dottedcircle;25CC
+doubleyodpatah;FB1F
+doubleyodpatahhebrew;FB1F
+downtackbelowcmb;031E
+downtackmod;02D5
+dparen;249F
+dsuperior;F6EB
+dtail;0256
+dtopbar;018C
+duhiragana;3065
+dukatakana;30C5
+dz;01F3
+dzaltone;02A3
+dzcaron;01C6
+dzcurl;02A5
+dzeabkhasiancyrillic;04E1
+dzecyrillic;0455
+dzhecyrillic;045F
+e;0065
+eacute;00E9
+earth;2641
+ebengali;098F
+ebopomofo;311C
+ebreve;0115
+ecandradeva;090D
+ecandragujarati;0A8D
+ecandravowelsigndeva;0945
+ecandravowelsigngujarati;0AC5
+ecaron;011B
+ecedillabreve;1E1D
+echarmenian;0565
+echyiwnarmenian;0587
+ecircle;24D4
+ecircumflex;00EA
+ecircumflexacute;1EBF
+ecircumflexbelow;1E19
+ecircumflexdotbelow;1EC7
+ecircumflexgrave;1EC1
+ecircumflexhookabove;1EC3
+ecircumflextilde;1EC5
+ecyrillic;0454
+edblgrave;0205
+edeva;090F
+edieresis;00EB
+edot;0117
+edotaccent;0117
+edotbelow;1EB9
+eegurmukhi;0A0F
+eematragurmukhi;0A47
+efcyrillic;0444
+egrave;00E8
+egujarati;0A8F
+eharmenian;0567
+ehbopomofo;311D
+ehiragana;3048
+ehookabove;1EBB
+eibopomofo;311F
+eight;0038
+eightarabic;0668
+eightbengali;09EE
+eightcircle;2467
+eightcircleinversesansserif;2791
+eightdeva;096E
+eighteencircle;2471
+eighteenparen;2485
+eighteenperiod;2499
+eightgujarati;0AEE
+eightgurmukhi;0A6E
+eighthackarabic;0668
+eighthangzhou;3028
+eighthnotebeamed;266B
+eightideographicparen;3227
+eightinferior;2088
+eightmonospace;FF18
+eightoldstyle;F738
+eightparen;247B
+eightperiod;248F
+eightpersian;06F8
+eightroman;2177
+eightsuperior;2078
+eightthai;0E58
+einvertedbreve;0207
+eiotifiedcyrillic;0465
+ekatakana;30A8
+ekatakanahalfwidth;FF74
+ekonkargurmukhi;0A74
+ekorean;3154
+elcyrillic;043B
+element;2208
+elevencircle;246A
+elevenparen;247E
+elevenperiod;2492
+elevenroman;217A
+ellipsis;2026
+ellipsisvertical;22EE
+emacron;0113
+emacronacute;1E17
+emacrongrave;1E15
+emcyrillic;043C
+emdash;2014
+emdashvertical;FE31
+emonospace;FF45
+emphasismarkarmenian;055B
+emptyset;2205
+enbopomofo;3123
+encyrillic;043D
+endash;2013
+endashvertical;FE32
+endescendercyrillic;04A3
+eng;014B
+engbopomofo;3125
+enghecyrillic;04A5
+enhookcyrillic;04C8
+enspace;2002
+eogonek;0119
+eokorean;3153
+eopen;025B
+eopenclosed;029A
+eopenreversed;025C
+eopenreversedclosed;025E
+eopenreversedhook;025D
+eparen;24A0
+epsilon;03B5
+epsilontonos;03AD
+equal;003D
+equalmonospace;FF1D
+equalsmall;FE66
+equalsuperior;207C
+equivalence;2261
+erbopomofo;3126
+ercyrillic;0440
+ereversed;0258
+ereversedcyrillic;044D
+escyrillic;0441
+esdescendercyrillic;04AB
+esh;0283
+eshcurl;0286
+eshortdeva;090E
+eshortvowelsigndeva;0946
+eshreversedloop;01AA
+eshsquatreversed;0285
+esmallhiragana;3047
+esmallkatakana;30A7
+esmallkatakanahalfwidth;FF6A
+estimated;212E
+esuperior;F6EC
+eta;03B7
+etarmenian;0568
+etatonos;03AE
+eth;00F0
+etilde;1EBD
+etildebelow;1E1B
+etnahtafoukhhebrew;0591
+etnahtafoukhlefthebrew;0591
+etnahtahebrew;0591
+etnahtalefthebrew;0591
+eturned;01DD
+eukorean;3161
+euro;20AC
+evowelsignbengali;09C7
+evowelsigndeva;0947
+evowelsigngujarati;0AC7
+exclam;0021
+exclamarmenian;055C
+exclamdbl;203C
+exclamdown;00A1
+exclamdownsmall;F7A1
+exclammonospace;FF01
+exclamsmall;F721
+existential;2203
+ezh;0292
+ezhcaron;01EF
+ezhcurl;0293
+ezhreversed;01B9
+ezhtail;01BA
+f;0066
+fadeva;095E
+fagurmukhi;0A5E
+fahrenheit;2109
+fathaarabic;064E
+fathalowarabic;064E
+fathatanarabic;064B
+fbopomofo;3108
+fcircle;24D5
+fdotaccent;1E1F
+feharabic;0641
+feharmenian;0586
+fehfinalarabic;FED2
+fehinitialarabic;FED3
+fehmedialarabic;FED4
+feicoptic;03E5
+female;2640
+ff;FB00
+ffi;FB03
+ffl;FB04
+fi;FB01
+fifteencircle;246E
+fifteenparen;2482
+fifteenperiod;2496
+figuredash;2012
+filledbox;25A0
+filledrect;25AC
+finalkaf;05DA
+finalkafdagesh;FB3A
+finalkafdageshhebrew;FB3A
+finalkafhebrew;05DA
+finalkafqamats;05DA 05B8
+finalkafqamatshebrew;05DA 05B8
+finalkafsheva;05DA 05B0
+finalkafshevahebrew;05DA 05B0
+finalmem;05DD
+finalmemhebrew;05DD
+finalnun;05DF
+finalnunhebrew;05DF
+finalpe;05E3
+finalpehebrew;05E3
+finaltsadi;05E5
+finaltsadihebrew;05E5
+firsttonechinese;02C9
+fisheye;25C9
+fitacyrillic;0473
+five;0035
+fivearabic;0665
+fivebengali;09EB
+fivecircle;2464
+fivecircleinversesansserif;278E
+fivedeva;096B
+fiveeighths;215D
+fivegujarati;0AEB
+fivegurmukhi;0A6B
+fivehackarabic;0665
+fivehangzhou;3025
+fiveideographicparen;3224
+fiveinferior;2085
+fivemonospace;FF15
+fiveoldstyle;F735
+fiveparen;2478
+fiveperiod;248C
+fivepersian;06F5
+fiveroman;2174
+fivesuperior;2075
+fivethai;0E55
+fl;FB02
+florin;0192
+fmonospace;FF46
+fmsquare;3399
+fofanthai;0E1F
+fofathai;0E1D
+fongmanthai;0E4F
+forall;2200
+four;0034
+fourarabic;0664
+fourbengali;09EA
+fourcircle;2463
+fourcircleinversesansserif;278D
+fourdeva;096A
+fourgujarati;0AEA
+fourgurmukhi;0A6A
+fourhackarabic;0664
+fourhangzhou;3024
+fourideographicparen;3223
+fourinferior;2084
+fourmonospace;FF14
+fournumeratorbengali;09F7
+fouroldstyle;F734
+fourparen;2477
+fourperiod;248B
+fourpersian;06F4
+fourroman;2173
+foursuperior;2074
+fourteencircle;246D
+fourteenparen;2481
+fourteenperiod;2495
+fourthai;0E54
+fourthtonechinese;02CB
+fparen;24A1
+fraction;2044
+franc;20A3
+g;0067
+gabengali;0997
+gacute;01F5
+gadeva;0917
+gafarabic;06AF
+gaffinalarabic;FB93
+gafinitialarabic;FB94
+gafmedialarabic;FB95
+gagujarati;0A97
+gagurmukhi;0A17
+gahiragana;304C
+gakatakana;30AC
+gamma;03B3
+gammalatinsmall;0263
+gammasuperior;02E0
+gangiacoptic;03EB
+gbopomofo;310D
+gbreve;011F
+gcaron;01E7
+gcedilla;0123
+gcircle;24D6
+gcircumflex;011D
+gcommaaccent;0123
+gdot;0121
+gdotaccent;0121
+gecyrillic;0433
+gehiragana;3052
+gekatakana;30B2
+geometricallyequal;2251
+gereshaccenthebrew;059C
+gereshhebrew;05F3
+gereshmuqdamhebrew;059D
+germandbls;00DF
+gershayimaccenthebrew;059E
+gershayimhebrew;05F4
+getamark;3013
+ghabengali;0998
+ghadarmenian;0572
+ghadeva;0918
+ghagujarati;0A98
+ghagurmukhi;0A18
+ghainarabic;063A
+ghainfinalarabic;FECE
+ghaininitialarabic;FECF
+ghainmedialarabic;FED0
+ghemiddlehookcyrillic;0495
+ghestrokecyrillic;0493
+gheupturncyrillic;0491
+ghhadeva;095A
+ghhagurmukhi;0A5A
+ghook;0260
+ghzsquare;3393
+gihiragana;304E
+gikatakana;30AE
+gimarmenian;0563
+gimel;05D2
+gimeldagesh;FB32
+gimeldageshhebrew;FB32
+gimelhebrew;05D2
+gjecyrillic;0453
+glottalinvertedstroke;01BE
+glottalstop;0294
+glottalstopinverted;0296
+glottalstopmod;02C0
+glottalstopreversed;0295
+glottalstopreversedmod;02C1
+glottalstopreversedsuperior;02E4
+glottalstopstroke;02A1
+glottalstopstrokereversed;02A2
+gmacron;1E21
+gmonospace;FF47
+gohiragana;3054
+gokatakana;30B4
+gparen;24A2
+gpasquare;33AC
+gradient;2207
+grave;0060
+gravebelowcmb;0316
+gravecmb;0300
+gravecomb;0300
+gravedeva;0953
+gravelowmod;02CE
+gravemonospace;FF40
+gravetonecmb;0340
+greater;003E
+greaterequal;2265
+greaterequalorless;22DB
+greatermonospace;FF1E
+greaterorequivalent;2273
+greaterorless;2277
+greateroverequal;2267
+greatersmall;FE65
+gscript;0261
+gstroke;01E5
+guhiragana;3050
+guillemotleft;00AB
+guillemotright;00BB
+guilsinglleft;2039
+guilsinglright;203A
+gukatakana;30B0
+guramusquare;3318
+gysquare;33C9
+h;0068
+haabkhasiancyrillic;04A9
+haaltonearabic;06C1
+habengali;09B9
+hadescendercyrillic;04B3
+hadeva;0939
+hagujarati;0AB9
+hagurmukhi;0A39
+haharabic;062D
+hahfinalarabic;FEA2
+hahinitialarabic;FEA3
+hahiragana;306F
+hahmedialarabic;FEA4
+haitusquare;332A
+hakatakana;30CF
+hakatakanahalfwidth;FF8A
+halantgurmukhi;0A4D
+hamzaarabic;0621
+hamzadammaarabic;0621 064F
+hamzadammatanarabic;0621 064C
+hamzafathaarabic;0621 064E
+hamzafathatanarabic;0621 064B
+hamzalowarabic;0621
+hamzalowkasraarabic;0621 0650
+hamzalowkasratanarabic;0621 064D
+hamzasukunarabic;0621 0652
+hangulfiller;3164
+hardsigncyrillic;044A
+harpoonleftbarbup;21BC
+harpoonrightbarbup;21C0
+hasquare;33CA
+hatafpatah;05B2
+hatafpatah16;05B2
+hatafpatah23;05B2
+hatafpatah2f;05B2
+hatafpatahhebrew;05B2
+hatafpatahnarrowhebrew;05B2
+hatafpatahquarterhebrew;05B2
+hatafpatahwidehebrew;05B2
+hatafqamats;05B3
+hatafqamats1b;05B3
+hatafqamats28;05B3
+hatafqamats34;05B3
+hatafqamatshebrew;05B3
+hatafqamatsnarrowhebrew;05B3
+hatafqamatsquarterhebrew;05B3
+hatafqamatswidehebrew;05B3
+hatafsegol;05B1
+hatafsegol17;05B1
+hatafsegol24;05B1
+hatafsegol30;05B1
+hatafsegolhebrew;05B1
+hatafsegolnarrowhebrew;05B1
+hatafsegolquarterhebrew;05B1
+hatafsegolwidehebrew;05B1
+hbar;0127
+hbopomofo;310F
+hbrevebelow;1E2B
+hcedilla;1E29
+hcircle;24D7
+hcircumflex;0125
+hdieresis;1E27
+hdotaccent;1E23
+hdotbelow;1E25
+he;05D4
+heart;2665
+heartsuitblack;2665
+heartsuitwhite;2661
+hedagesh;FB34
+hedageshhebrew;FB34
+hehaltonearabic;06C1
+heharabic;0647
+hehebrew;05D4
+hehfinalaltonearabic;FBA7
+hehfinalalttwoarabic;FEEA
+hehfinalarabic;FEEA
+hehhamzaabovefinalarabic;FBA5
+hehhamzaaboveisolatedarabic;FBA4
+hehinitialaltonearabic;FBA8
+hehinitialarabic;FEEB
+hehiragana;3078
+hehmedialaltonearabic;FBA9
+hehmedialarabic;FEEC
+heiseierasquare;337B
+hekatakana;30D8
+hekatakanahalfwidth;FF8D
+hekutaarusquare;3336
+henghook;0267
+herutusquare;3339
+het;05D7
+hethebrew;05D7
+hhook;0266
+hhooksuperior;02B1
+hieuhacirclekorean;327B
+hieuhaparenkorean;321B
+hieuhcirclekorean;326D
+hieuhkorean;314E
+hieuhparenkorean;320D
+hihiragana;3072
+hikatakana;30D2
+hikatakanahalfwidth;FF8B
+hiriq;05B4
+hiriq14;05B4
+hiriq21;05B4
+hiriq2d;05B4
+hiriqhebrew;05B4
+hiriqnarrowhebrew;05B4
+hiriqquarterhebrew;05B4
+hiriqwidehebrew;05B4
+hlinebelow;1E96
+hmonospace;FF48
+hoarmenian;0570
+hohipthai;0E2B
+hohiragana;307B
+hokatakana;30DB
+hokatakanahalfwidth;FF8E
+holam;05B9
+holam19;05B9
+holam26;05B9
+holam32;05B9
+holamhebrew;05B9
+holamnarrowhebrew;05B9
+holamquarterhebrew;05B9
+holamwidehebrew;05B9
+honokhukthai;0E2E
+hookabovecomb;0309
+hookcmb;0309
+hookpalatalizedbelowcmb;0321
+hookretroflexbelowcmb;0322
+hoonsquare;3342
+horicoptic;03E9
+horizontalbar;2015
+horncmb;031B
+hotsprings;2668
+house;2302
+hparen;24A3
+hsuperior;02B0
+hturned;0265
+huhiragana;3075
+huiitosquare;3333
+hukatakana;30D5
+hukatakanahalfwidth;FF8C
+hungarumlaut;02DD
+hungarumlautcmb;030B
+hv;0195
+hyphen;002D
+hypheninferior;F6E5
+hyphenmonospace;FF0D
+hyphensmall;FE63
+hyphensuperior;F6E6
+hyphentwo;2010
+i;0069
+iacute;00ED
+iacyrillic;044F
+ibengali;0987
+ibopomofo;3127
+ibreve;012D
+icaron;01D0
+icircle;24D8
+icircumflex;00EE
+icyrillic;0456
+idblgrave;0209
+ideographearthcircle;328F
+ideographfirecircle;328B
+ideographicallianceparen;323F
+ideographiccallparen;323A
+ideographiccentrecircle;32A5
+ideographicclose;3006
+ideographiccomma;3001
+ideographiccommaleft;FF64
+ideographiccongratulationparen;3237
+ideographiccorrectcircle;32A3
+ideographicearthparen;322F
+ideographicenterpriseparen;323D
+ideographicexcellentcircle;329D
+ideographicfestivalparen;3240
+ideographicfinancialcircle;3296
+ideographicfinancialparen;3236
+ideographicfireparen;322B
+ideographichaveparen;3232
+ideographichighcircle;32A4
+ideographiciterationmark;3005
+ideographiclaborcircle;3298
+ideographiclaborparen;3238
+ideographicleftcircle;32A7
+ideographiclowcircle;32A6
+ideographicmedicinecircle;32A9
+ideographicmetalparen;322E
+ideographicmoonparen;322A
+ideographicnameparen;3234
+ideographicperiod;3002
+ideographicprintcircle;329E
+ideographicreachparen;3243
+ideographicrepresentparen;3239
+ideographicresourceparen;323E
+ideographicrightcircle;32A8
+ideographicsecretcircle;3299
+ideographicselfparen;3242
+ideographicsocietyparen;3233
+ideographicspace;3000
+ideographicspecialparen;3235
+ideographicstockparen;3231
+ideographicstudyparen;323B
+ideographicsunparen;3230
+ideographicsuperviseparen;323C
+ideographicwaterparen;322C
+ideographicwoodparen;322D
+ideographiczero;3007
+ideographmetalcircle;328E
+ideographmooncircle;328A
+ideographnamecircle;3294
+ideographsuncircle;3290
+ideographwatercircle;328C
+ideographwoodcircle;328D
+ideva;0907
+idieresis;00EF
+idieresisacute;1E2F
+idieresiscyrillic;04E5
+idotbelow;1ECB
+iebrevecyrillic;04D7
+iecyrillic;0435
+ieungacirclekorean;3275
+ieungaparenkorean;3215
+ieungcirclekorean;3267
+ieungkorean;3147
+ieungparenkorean;3207
+igrave;00EC
+igujarati;0A87
+igurmukhi;0A07
+ihiragana;3044
+ihookabove;1EC9
+iibengali;0988
+iicyrillic;0438
+iideva;0908
+iigujarati;0A88
+iigurmukhi;0A08
+iimatragurmukhi;0A40
+iinvertedbreve;020B
+iishortcyrillic;0439
+iivowelsignbengali;09C0
+iivowelsigndeva;0940
+iivowelsigngujarati;0AC0
+ij;0133
+ikatakana;30A4
+ikatakanahalfwidth;FF72
+ikorean;3163
+ilde;02DC
+iluyhebrew;05AC
+imacron;012B
+imacroncyrillic;04E3
+imageorapproximatelyequal;2253
+imatragurmukhi;0A3F
+imonospace;FF49
+increment;2206
+infinity;221E
+iniarmenian;056B
+integral;222B
+integralbottom;2321
+integralbt;2321
+integralex;F8F5
+integraltop;2320
+integraltp;2320
+intersection;2229
+intisquare;3305
+invbullet;25D8
+invcircle;25D9
+invsmileface;263B
+iocyrillic;0451
+iogonek;012F
+iota;03B9
+iotadieresis;03CA
+iotadieresistonos;0390
+iotalatin;0269
+iotatonos;03AF
+iparen;24A4
+irigurmukhi;0A72
+ismallhiragana;3043
+ismallkatakana;30A3
+ismallkatakanahalfwidth;FF68
+issharbengali;09FA
+istroke;0268
+isuperior;F6ED
+iterationhiragana;309D
+iterationkatakana;30FD
+itilde;0129
+itildebelow;1E2D
+iubopomofo;3129
+iucyrillic;044E
+ivowelsignbengali;09BF
+ivowelsigndeva;093F
+ivowelsigngujarati;0ABF
+izhitsacyrillic;0475
+izhitsadblgravecyrillic;0477
+j;006A
+jaarmenian;0571
+jabengali;099C
+jadeva;091C
+jagujarati;0A9C
+jagurmukhi;0A1C
+jbopomofo;3110
+jcaron;01F0
+jcircle;24D9
+jcircumflex;0135
+jcrossedtail;029D
+jdotlessstroke;025F
+jecyrillic;0458
+jeemarabic;062C
+jeemfinalarabic;FE9E
+jeeminitialarabic;FE9F
+jeemmedialarabic;FEA0
+jeharabic;0698
+jehfinalarabic;FB8B
+jhabengali;099D
+jhadeva;091D
+jhagujarati;0A9D
+jhagurmukhi;0A1D
+jheharmenian;057B
+jis;3004
+jmonospace;FF4A
+jparen;24A5
+jsuperior;02B2
+k;006B
+kabashkircyrillic;04A1
+kabengali;0995
+kacute;1E31
+kacyrillic;043A
+kadescendercyrillic;049B
+kadeva;0915
+kaf;05DB
+kafarabic;0643
+kafdagesh;FB3B
+kafdageshhebrew;FB3B
+kaffinalarabic;FEDA
+kafhebrew;05DB
+kafinitialarabic;FEDB
+kafmedialarabic;FEDC
+kafrafehebrew;FB4D
+kagujarati;0A95
+kagurmukhi;0A15
+kahiragana;304B
+kahookcyrillic;04C4
+kakatakana;30AB
+kakatakanahalfwidth;FF76
+kappa;03BA
+kappasymbolgreek;03F0
+kapyeounmieumkorean;3171
+kapyeounphieuphkorean;3184
+kapyeounpieupkorean;3178
+kapyeounssangpieupkorean;3179
+karoriisquare;330D
+kashidaautoarabic;0640
+kashidaautonosidebearingarabic;0640
+kasmallkatakana;30F5
+kasquare;3384
+kasraarabic;0650
+kasratanarabic;064D
+kastrokecyrillic;049F
+katahiraprolongmarkhalfwidth;FF70
+kaverticalstrokecyrillic;049D
+kbopomofo;310E
+kcalsquare;3389
+kcaron;01E9
+kcedilla;0137
+kcircle;24DA
+kcommaaccent;0137
+kdotbelow;1E33
+keharmenian;0584
+kehiragana;3051
+kekatakana;30B1
+kekatakanahalfwidth;FF79
+kenarmenian;056F
+kesmallkatakana;30F6
+kgreenlandic;0138
+khabengali;0996
+khacyrillic;0445
+khadeva;0916
+khagujarati;0A96
+khagurmukhi;0A16
+khaharabic;062E
+khahfinalarabic;FEA6
+khahinitialarabic;FEA7
+khahmedialarabic;FEA8
+kheicoptic;03E7
+khhadeva;0959
+khhagurmukhi;0A59
+khieukhacirclekorean;3278
+khieukhaparenkorean;3218
+khieukhcirclekorean;326A
+khieukhkorean;314B
+khieukhparenkorean;320A
+khokhaithai;0E02
+khokhonthai;0E05
+khokhuatthai;0E03
+khokhwaithai;0E04
+khomutthai;0E5B
+khook;0199
+khorakhangthai;0E06
+khzsquare;3391
+kihiragana;304D
+kikatakana;30AD
+kikatakanahalfwidth;FF77
+kiroguramusquare;3315
+kiromeetorusquare;3316
+kirosquare;3314
+kiyeokacirclekorean;326E
+kiyeokaparenkorean;320E
+kiyeokcirclekorean;3260
+kiyeokkorean;3131
+kiyeokparenkorean;3200
+kiyeoksioskorean;3133
+kjecyrillic;045C
+klinebelow;1E35
+klsquare;3398
+kmcubedsquare;33A6
+kmonospace;FF4B
+kmsquaredsquare;33A2
+kohiragana;3053
+kohmsquare;33C0
+kokaithai;0E01
+kokatakana;30B3
+kokatakanahalfwidth;FF7A
+kooposquare;331E
+koppacyrillic;0481
+koreanstandardsymbol;327F
+koroniscmb;0343
+kparen;24A6
+kpasquare;33AA
+ksicyrillic;046F
+ktsquare;33CF
+kturned;029E
+kuhiragana;304F
+kukatakana;30AF
+kukatakanahalfwidth;FF78
+kvsquare;33B8
+kwsquare;33BE
+l;006C
+labengali;09B2
+lacute;013A
+ladeva;0932
+lagujarati;0AB2
+lagurmukhi;0A32
+lakkhangyaothai;0E45
+lamaleffinalarabic;FEFC
+lamalefhamzaabovefinalarabic;FEF8
+lamalefhamzaaboveisolatedarabic;FEF7
+lamalefhamzabelowfinalarabic;FEFA
+lamalefhamzabelowisolatedarabic;FEF9
+lamalefisolatedarabic;FEFB
+lamalefmaddaabovefinalarabic;FEF6
+lamalefmaddaaboveisolatedarabic;FEF5
+lamarabic;0644
+lambda;03BB
+lambdastroke;019B
+lamed;05DC
+lameddagesh;FB3C
+lameddageshhebrew;FB3C
+lamedhebrew;05DC
+lamedholam;05DC 05B9
+lamedholamdagesh;05DC 05B9 05BC
+lamedholamdageshhebrew;05DC 05B9 05BC
+lamedholamhebrew;05DC 05B9
+lamfinalarabic;FEDE
+lamhahinitialarabic;FCCA
+laminitialarabic;FEDF
+lamjeeminitialarabic;FCC9
+lamkhahinitialarabic;FCCB
+lamlamhehisolatedarabic;FDF2
+lammedialarabic;FEE0
+lammeemhahinitialarabic;FD88
+lammeeminitialarabic;FCCC
+lammeemjeeminitialarabic;FEDF FEE4 FEA0
+lammeemkhahinitialarabic;FEDF FEE4 FEA8
+largecircle;25EF
+lbar;019A
+lbelt;026C
+lbopomofo;310C
+lcaron;013E
+lcedilla;013C
+lcircle;24DB
+lcircumflexbelow;1E3D
+lcommaaccent;013C
+ldot;0140
+ldotaccent;0140
+ldotbelow;1E37
+ldotbelowmacron;1E39
+leftangleabovecmb;031A
+lefttackbelowcmb;0318
+less;003C
+lessequal;2264
+lessequalorgreater;22DA
+lessmonospace;FF1C
+lessorequivalent;2272
+lessorgreater;2276
+lessoverequal;2266
+lesssmall;FE64
+lezh;026E
+lfblock;258C
+lhookretroflex;026D
+lira;20A4
+liwnarmenian;056C
+lj;01C9
+ljecyrillic;0459
+ll;F6C0
+lladeva;0933
+llagujarati;0AB3
+llinebelow;1E3B
+llladeva;0934
+llvocalicbengali;09E1
+llvocalicdeva;0961
+llvocalicvowelsignbengali;09E3
+llvocalicvowelsigndeva;0963
+lmiddletilde;026B
+lmonospace;FF4C
+lmsquare;33D0
+lochulathai;0E2C
+logicaland;2227
+logicalnot;00AC
+logicalnotreversed;2310
+logicalor;2228
+lolingthai;0E25
+longs;017F
+lowlinecenterline;FE4E
+lowlinecmb;0332
+lowlinedashed;FE4D
+lozenge;25CA
+lparen;24A7
+lslash;0142
+lsquare;2113
+lsuperior;F6EE
+ltshade;2591
+luthai;0E26
+lvocalicbengali;098C
+lvocalicdeva;090C
+lvocalicvowelsignbengali;09E2
+lvocalicvowelsigndeva;0962
+lxsquare;33D3
+m;006D
+mabengali;09AE
+macron;00AF
+macronbelowcmb;0331
+macroncmb;0304
+macronlowmod;02CD
+macronmonospace;FFE3
+macute;1E3F
+madeva;092E
+magujarati;0AAE
+magurmukhi;0A2E
+mahapakhhebrew;05A4
+mahapakhlefthebrew;05A4
+mahiragana;307E
+maichattawalowleftthai;F895
+maichattawalowrightthai;F894
+maichattawathai;0E4B
+maichattawaupperleftthai;F893
+maieklowleftthai;F88C
+maieklowrightthai;F88B
+maiekthai;0E48
+maiekupperleftthai;F88A
+maihanakatleftthai;F884
+maihanakatthai;0E31
+maitaikhuleftthai;F889
+maitaikhuthai;0E47
+maitholowleftthai;F88F
+maitholowrightthai;F88E
+maithothai;0E49
+maithoupperleftthai;F88D
+maitrilowleftthai;F892
+maitrilowrightthai;F891
+maitrithai;0E4A
+maitriupperleftthai;F890
+maiyamokthai;0E46
+makatakana;30DE
+makatakanahalfwidth;FF8F
+male;2642
+mansyonsquare;3347
+maqafhebrew;05BE
+mars;2642
+masoracirclehebrew;05AF
+masquare;3383
+mbopomofo;3107
+mbsquare;33D4
+mcircle;24DC
+mcubedsquare;33A5
+mdotaccent;1E41
+mdotbelow;1E43
+meemarabic;0645
+meemfinalarabic;FEE2
+meeminitialarabic;FEE3
+meemmedialarabic;FEE4
+meemmeeminitialarabic;FCD1
+meemmeemisolatedarabic;FC48
+meetorusquare;334D
+mehiragana;3081
+meizierasquare;337E
+mekatakana;30E1
+mekatakanahalfwidth;FF92
+mem;05DE
+memdagesh;FB3E
+memdageshhebrew;FB3E
+memhebrew;05DE
+menarmenian;0574
+merkhahebrew;05A5
+merkhakefulahebrew;05A6
+merkhakefulalefthebrew;05A6
+merkhalefthebrew;05A5
+mhook;0271
+mhzsquare;3392
+middledotkatakanahalfwidth;FF65
+middot;00B7
+mieumacirclekorean;3272
+mieumaparenkorean;3212
+mieumcirclekorean;3264
+mieumkorean;3141
+mieumpansioskorean;3170
+mieumparenkorean;3204
+mieumpieupkorean;316E
+mieumsioskorean;316F
+mihiragana;307F
+mikatakana;30DF
+mikatakanahalfwidth;FF90
+minus;2212
+minusbelowcmb;0320
+minuscircle;2296
+minusmod;02D7
+minusplus;2213
+minute;2032
+miribaarusquare;334A
+mirisquare;3349
+mlonglegturned;0270
+mlsquare;3396
+mmcubedsquare;33A3
+mmonospace;FF4D
+mmsquaredsquare;339F
+mohiragana;3082
+mohmsquare;33C1
+mokatakana;30E2
+mokatakanahalfwidth;FF93
+molsquare;33D6
+momathai;0E21
+moverssquare;33A7
+moverssquaredsquare;33A8
+mparen;24A8
+mpasquare;33AB
+mssquare;33B3
+msuperior;F6EF
+mturned;026F
+mu;00B5
+mu1;00B5
+muasquare;3382
+muchgreater;226B
+muchless;226A
+mufsquare;338C
+mugreek;03BC
+mugsquare;338D
+muhiragana;3080
+mukatakana;30E0
+mukatakanahalfwidth;FF91
+mulsquare;3395
+multiply;00D7
+mumsquare;339B
+munahhebrew;05A3
+munahlefthebrew;05A3
+musicalnote;266A
+musicalnotedbl;266B
+musicflatsign;266D
+musicsharpsign;266F
+mussquare;33B2
+muvsquare;33B6
+muwsquare;33BC
+mvmegasquare;33B9
+mvsquare;33B7
+mwmegasquare;33BF
+mwsquare;33BD
+n;006E
+nabengali;09A8
+nabla;2207
+nacute;0144
+nadeva;0928
+nagujarati;0AA8
+nagurmukhi;0A28
+nahiragana;306A
+nakatakana;30CA
+nakatakanahalfwidth;FF85
+napostrophe;0149
+nasquare;3381
+nbopomofo;310B
+nbspace;00A0
+ncaron;0148
+ncedilla;0146
+ncircle;24DD
+ncircumflexbelow;1E4B
+ncommaaccent;0146
+ndotaccent;1E45
+ndotbelow;1E47
+nehiragana;306D
+nekatakana;30CD
+nekatakanahalfwidth;FF88
+newsheqelsign;20AA
+nfsquare;338B
+ngabengali;0999
+ngadeva;0919
+ngagujarati;0A99
+ngagurmukhi;0A19
+ngonguthai;0E07
+nhiragana;3093
+nhookleft;0272
+nhookretroflex;0273
+nieunacirclekorean;326F
+nieunaparenkorean;320F
+nieuncieuckorean;3135
+nieuncirclekorean;3261
+nieunhieuhkorean;3136
+nieunkorean;3134
+nieunpansioskorean;3168
+nieunparenkorean;3201
+nieunsioskorean;3167
+nieuntikeutkorean;3166
+nihiragana;306B
+nikatakana;30CB
+nikatakanahalfwidth;FF86
+nikhahitleftthai;F899
+nikhahitthai;0E4D
+nine;0039
+ninearabic;0669
+ninebengali;09EF
+ninecircle;2468
+ninecircleinversesansserif;2792
+ninedeva;096F
+ninegujarati;0AEF
+ninegurmukhi;0A6F
+ninehackarabic;0669
+ninehangzhou;3029
+nineideographicparen;3228
+nineinferior;2089
+ninemonospace;FF19
+nineoldstyle;F739
+nineparen;247C
+nineperiod;2490
+ninepersian;06F9
+nineroman;2178
+ninesuperior;2079
+nineteencircle;2472
+nineteenparen;2486
+nineteenperiod;249A
+ninethai;0E59
+nj;01CC
+njecyrillic;045A
+nkatakana;30F3
+nkatakanahalfwidth;FF9D
+nlegrightlong;019E
+nlinebelow;1E49
+nmonospace;FF4E
+nmsquare;339A
+nnabengali;09A3
+nnadeva;0923
+nnagujarati;0AA3
+nnagurmukhi;0A23
+nnnadeva;0929
+nohiragana;306E
+nokatakana;30CE
+nokatakanahalfwidth;FF89
+nonbreakingspace;00A0
+nonenthai;0E13
+nonuthai;0E19
+noonarabic;0646
+noonfinalarabic;FEE6
+noonghunnaarabic;06BA
+noonghunnafinalarabic;FB9F
+noonhehinitialarabic;FEE7 FEEC
+nooninitialarabic;FEE7
+noonjeeminitialarabic;FCD2
+noonjeemisolatedarabic;FC4B
+noonmedialarabic;FEE8
+noonmeeminitialarabic;FCD5
+noonmeemisolatedarabic;FC4E
+noonnoonfinalarabic;FC8D
+notcontains;220C
+notelement;2209
+notelementof;2209
+notequal;2260
+notgreater;226F
+notgreaternorequal;2271
+notgreaternorless;2279
+notidentical;2262
+notless;226E
+notlessnorequal;2270
+notparallel;2226
+notprecedes;2280
+notsubset;2284
+notsucceeds;2281
+notsuperset;2285
+nowarmenian;0576
+nparen;24A9
+nssquare;33B1
+nsuperior;207F
+ntilde;00F1
+nu;03BD
+nuhiragana;306C
+nukatakana;30CC
+nukatakanahalfwidth;FF87
+nuktabengali;09BC
+nuktadeva;093C
+nuktagujarati;0ABC
+nuktagurmukhi;0A3C
+numbersign;0023
+numbersignmonospace;FF03
+numbersignsmall;FE5F
+numeralsigngreek;0374
+numeralsignlowergreek;0375
+numero;2116
+nun;05E0
+nundagesh;FB40
+nundageshhebrew;FB40
+nunhebrew;05E0
+nvsquare;33B5
+nwsquare;33BB
+nyabengali;099E
+nyadeva;091E
+nyagujarati;0A9E
+nyagurmukhi;0A1E
+o;006F
+oacute;00F3
+oangthai;0E2D
+obarred;0275
+obarredcyrillic;04E9
+obarreddieresiscyrillic;04EB
+obengali;0993
+obopomofo;311B
+obreve;014F
+ocandradeva;0911
+ocandragujarati;0A91
+ocandravowelsigndeva;0949
+ocandravowelsigngujarati;0AC9
+ocaron;01D2
+ocircle;24DE
+ocircumflex;00F4
+ocircumflexacute;1ED1
+ocircumflexdotbelow;1ED9
+ocircumflexgrave;1ED3
+ocircumflexhookabove;1ED5
+ocircumflextilde;1ED7
+ocyrillic;043E
+odblacute;0151
+odblgrave;020D
+odeva;0913
+odieresis;00F6
+odieresiscyrillic;04E7
+odotbelow;1ECD
+oe;0153
+oekorean;315A
+ogonek;02DB
+ogonekcmb;0328
+ograve;00F2
+ogujarati;0A93
+oharmenian;0585
+ohiragana;304A
+ohookabove;1ECF
+ohorn;01A1
+ohornacute;1EDB
+ohorndotbelow;1EE3
+ohorngrave;1EDD
+ohornhookabove;1EDF
+ohorntilde;1EE1
+ohungarumlaut;0151
+oi;01A3
+oinvertedbreve;020F
+okatakana;30AA
+okatakanahalfwidth;FF75
+okorean;3157
+olehebrew;05AB
+omacron;014D
+omacronacute;1E53
+omacrongrave;1E51
+omdeva;0950
+omega;03C9
+omega1;03D6
+omegacyrillic;0461
+omegalatinclosed;0277
+omegaroundcyrillic;047B
+omegatitlocyrillic;047D
+omegatonos;03CE
+omgujarati;0AD0
+omicron;03BF
+omicrontonos;03CC
+omonospace;FF4F
+one;0031
+onearabic;0661
+onebengali;09E7
+onecircle;2460
+onecircleinversesansserif;278A
+onedeva;0967
+onedotenleader;2024
+oneeighth;215B
+onefitted;F6DC
+onegujarati;0AE7
+onegurmukhi;0A67
+onehackarabic;0661
+onehalf;00BD
+onehangzhou;3021
+oneideographicparen;3220
+oneinferior;2081
+onemonospace;FF11
+onenumeratorbengali;09F4
+oneoldstyle;F731
+oneparen;2474
+oneperiod;2488
+onepersian;06F1
+onequarter;00BC
+oneroman;2170
+onesuperior;00B9
+onethai;0E51
+onethird;2153
+oogonek;01EB
+oogonekmacron;01ED
+oogurmukhi;0A13
+oomatragurmukhi;0A4B
+oopen;0254
+oparen;24AA
+openbullet;25E6
+option;2325
+ordfeminine;00AA
+ordmasculine;00BA
+orthogonal;221F
+oshortdeva;0912
+oshortvowelsigndeva;094A
+oslash;00F8
+oslashacute;01FF
+osmallhiragana;3049
+osmallkatakana;30A9
+osmallkatakanahalfwidth;FF6B
+ostrokeacute;01FF
+osuperior;F6F0
+otcyrillic;047F
+otilde;00F5
+otildeacute;1E4D
+otildedieresis;1E4F
+oubopomofo;3121
+overline;203E
+overlinecenterline;FE4A
+overlinecmb;0305
+overlinedashed;FE49
+overlinedblwavy;FE4C
+overlinewavy;FE4B
+overscore;00AF
+ovowelsignbengali;09CB
+ovowelsigndeva;094B
+ovowelsigngujarati;0ACB
+p;0070
+paampssquare;3380
+paasentosquare;332B
+pabengali;09AA
+pacute;1E55
+padeva;092A
+pagedown;21DF
+pageup;21DE
+pagujarati;0AAA
+pagurmukhi;0A2A
+pahiragana;3071
+paiyannoithai;0E2F
+pakatakana;30D1
+palatalizationcyrilliccmb;0484
+palochkacyrillic;04C0
+pansioskorean;317F
+paragraph;00B6
+parallel;2225
+parenleft;0028
+parenleftaltonearabic;FD3E
+parenleftbt;F8ED
+parenleftex;F8EC
+parenleftinferior;208D
+parenleftmonospace;FF08
+parenleftsmall;FE59
+parenleftsuperior;207D
+parenlefttp;F8EB
+parenleftvertical;FE35
+parenright;0029
+parenrightaltonearabic;FD3F
+parenrightbt;F8F8
+parenrightex;F8F7
+parenrightinferior;208E
+parenrightmonospace;FF09
+parenrightsmall;FE5A
+parenrightsuperior;207E
+parenrighttp;F8F6
+parenrightvertical;FE36
+partialdiff;2202
+paseqhebrew;05C0
+pashtahebrew;0599
+pasquare;33A9
+patah;05B7
+patah11;05B7
+patah1d;05B7
+patah2a;05B7
+patahhebrew;05B7
+patahnarrowhebrew;05B7
+patahquarterhebrew;05B7
+patahwidehebrew;05B7
+pazerhebrew;05A1
+pbopomofo;3106
+pcircle;24DF
+pdotaccent;1E57
+pe;05E4
+pecyrillic;043F
+pedagesh;FB44
+pedageshhebrew;FB44
+peezisquare;333B
+pefinaldageshhebrew;FB43
+peharabic;067E
+peharmenian;057A
+pehebrew;05E4
+pehfinalarabic;FB57
+pehinitialarabic;FB58
+pehiragana;307A
+pehmedialarabic;FB59
+pekatakana;30DA
+pemiddlehookcyrillic;04A7
+perafehebrew;FB4E
+percent;0025
+percentarabic;066A
+percentmonospace;FF05
+percentsmall;FE6A
+period;002E
+periodarmenian;0589
+periodcentered;00B7
+periodhalfwidth;FF61
+periodinferior;F6E7
+periodmonospace;FF0E
+periodsmall;FE52
+periodsuperior;F6E8
+perispomenigreekcmb;0342
+perpendicular;22A5
+perthousand;2030
+peseta;20A7
+pfsquare;338A
+phabengali;09AB
+phadeva;092B
+phagujarati;0AAB
+phagurmukhi;0A2B
+phi;03C6
+phi1;03D5
+phieuphacirclekorean;327A
+phieuphaparenkorean;321A
+phieuphcirclekorean;326C
+phieuphkorean;314D
+phieuphparenkorean;320C
+philatin;0278
+phinthuthai;0E3A
+phisymbolgreek;03D5
+phook;01A5
+phophanthai;0E1E
+phophungthai;0E1C
+phosamphaothai;0E20
+pi;03C0
+pieupacirclekorean;3273
+pieupaparenkorean;3213
+pieupcieuckorean;3176
+pieupcirclekorean;3265
+pieupkiyeokkorean;3172
+pieupkorean;3142
+pieupparenkorean;3205
+pieupsioskiyeokkorean;3174
+pieupsioskorean;3144
+pieupsiostikeutkorean;3175
+pieupthieuthkorean;3177
+pieuptikeutkorean;3173
+pihiragana;3074
+pikatakana;30D4
+pisymbolgreek;03D6
+piwrarmenian;0583
+plus;002B
+plusbelowcmb;031F
+pluscircle;2295
+plusminus;00B1
+plusmod;02D6
+plusmonospace;FF0B
+plussmall;FE62
+plussuperior;207A
+pmonospace;FF50
+pmsquare;33D8
+pohiragana;307D
+pointingindexdownwhite;261F
+pointingindexleftwhite;261C
+pointingindexrightwhite;261E
+pointingindexupwhite;261D
+pokatakana;30DD
+poplathai;0E1B
+postalmark;3012
+postalmarkface;3020
+pparen;24AB
+precedes;227A
+prescription;211E
+primemod;02B9
+primereversed;2035
+product;220F
+projective;2305
+prolongedkana;30FC
+propellor;2318
+propersubset;2282
+propersuperset;2283
+proportion;2237
+proportional;221D
+psi;03C8
+psicyrillic;0471
+psilipneumatacyrilliccmb;0486
+pssquare;33B0
+puhiragana;3077
+pukatakana;30D7
+pvsquare;33B4
+pwsquare;33BA
+q;0071
+qadeva;0958
+qadmahebrew;05A8
+qafarabic;0642
+qaffinalarabic;FED6
+qafinitialarabic;FED7
+qafmedialarabic;FED8
+qamats;05B8
+qamats10;05B8
+qamats1a;05B8
+qamats1c;05B8
+qamats27;05B8
+qamats29;05B8
+qamats33;05B8
+qamatsde;05B8
+qamatshebrew;05B8
+qamatsnarrowhebrew;05B8
+qamatsqatanhebrew;05B8
+qamatsqatannarrowhebrew;05B8
+qamatsqatanquarterhebrew;05B8
+qamatsqatanwidehebrew;05B8
+qamatsquarterhebrew;05B8
+qamatswidehebrew;05B8
+qarneyparahebrew;059F
+qbopomofo;3111
+qcircle;24E0
+qhook;02A0
+qmonospace;FF51
+qof;05E7
+qofdagesh;FB47
+qofdageshhebrew;FB47
+qofhatafpatah;05E7 05B2
+qofhatafpatahhebrew;05E7 05B2
+qofhatafsegol;05E7 05B1
+qofhatafsegolhebrew;05E7 05B1
+qofhebrew;05E7
+qofhiriq;05E7 05B4
+qofhiriqhebrew;05E7 05B4
+qofholam;05E7 05B9
+qofholamhebrew;05E7 05B9
+qofpatah;05E7 05B7
+qofpatahhebrew;05E7 05B7
+qofqamats;05E7 05B8
+qofqamatshebrew;05E7 05B8
+qofqubuts;05E7 05BB
+qofqubutshebrew;05E7 05BB
+qofsegol;05E7 05B6
+qofsegolhebrew;05E7 05B6
+qofsheva;05E7 05B0
+qofshevahebrew;05E7 05B0
+qoftsere;05E7 05B5
+qoftserehebrew;05E7 05B5
+qparen;24AC
+quarternote;2669
+qubuts;05BB
+qubuts18;05BB
+qubuts25;05BB
+qubuts31;05BB
+qubutshebrew;05BB
+qubutsnarrowhebrew;05BB
+qubutsquarterhebrew;05BB
+qubutswidehebrew;05BB
+question;003F
+questionarabic;061F
+questionarmenian;055E
+questiondown;00BF
+questiondownsmall;F7BF
+questiongreek;037E
+questionmonospace;FF1F
+questionsmall;F73F
+quotedbl;0022
+quotedblbase;201E
+quotedblleft;201C
+quotedblmonospace;FF02
+quotedblprime;301E
+quotedblprimereversed;301D
+quotedblright;201D
+quoteleft;2018
+quoteleftreversed;201B
+quotereversed;201B
+quoteright;2019
+quoterightn;0149
+quotesinglbase;201A
+quotesingle;0027
+quotesinglemonospace;FF07
+r;0072
+raarmenian;057C
+rabengali;09B0
+racute;0155
+radeva;0930
+radical;221A
+radicalex;F8E5
+radoverssquare;33AE
+radoverssquaredsquare;33AF
+radsquare;33AD
+rafe;05BF
+rafehebrew;05BF
+ragujarati;0AB0
+ragurmukhi;0A30
+rahiragana;3089
+rakatakana;30E9
+rakatakanahalfwidth;FF97
+ralowerdiagonalbengali;09F1
+ramiddlediagonalbengali;09F0
+ramshorn;0264
+ratio;2236
+rbopomofo;3116
+rcaron;0159
+rcedilla;0157
+rcircle;24E1
+rcommaaccent;0157
+rdblgrave;0211
+rdotaccent;1E59
+rdotbelow;1E5B
+rdotbelowmacron;1E5D
+referencemark;203B
+reflexsubset;2286
+reflexsuperset;2287
+registered;00AE
+registersans;F8E8
+registerserif;F6DA
+reharabic;0631
+reharmenian;0580
+rehfinalarabic;FEAE
+rehiragana;308C
+rehyehaleflamarabic;0631 FEF3 FE8E 0644
+rekatakana;30EC
+rekatakanahalfwidth;FF9A
+resh;05E8
+reshdageshhebrew;FB48
+reshhatafpatah;05E8 05B2
+reshhatafpatahhebrew;05E8 05B2
+reshhatafsegol;05E8 05B1
+reshhatafsegolhebrew;05E8 05B1
+reshhebrew;05E8
+reshhiriq;05E8 05B4
+reshhiriqhebrew;05E8 05B4
+reshholam;05E8 05B9
+reshholamhebrew;05E8 05B9
+reshpatah;05E8 05B7
+reshpatahhebrew;05E8 05B7
+reshqamats;05E8 05B8
+reshqamatshebrew;05E8 05B8
+reshqubuts;05E8 05BB
+reshqubutshebrew;05E8 05BB
+reshsegol;05E8 05B6
+reshsegolhebrew;05E8 05B6
+reshsheva;05E8 05B0
+reshshevahebrew;05E8 05B0
+reshtsere;05E8 05B5
+reshtserehebrew;05E8 05B5
+reversedtilde;223D
+reviahebrew;0597
+reviamugrashhebrew;0597
+revlogicalnot;2310
+rfishhook;027E
+rfishhookreversed;027F
+rhabengali;09DD
+rhadeva;095D
+rho;03C1
+rhook;027D
+rhookturned;027B
+rhookturnedsuperior;02B5
+rhosymbolgreek;03F1
+rhotichookmod;02DE
+rieulacirclekorean;3271
+rieulaparenkorean;3211
+rieulcirclekorean;3263
+rieulhieuhkorean;3140
+rieulkiyeokkorean;313A
+rieulkiyeoksioskorean;3169
+rieulkorean;3139
+rieulmieumkorean;313B
+rieulpansioskorean;316C
+rieulparenkorean;3203
+rieulphieuphkorean;313F
+rieulpieupkorean;313C
+rieulpieupsioskorean;316B
+rieulsioskorean;313D
+rieulthieuthkorean;313E
+rieultikeutkorean;316A
+rieulyeorinhieuhkorean;316D
+rightangle;221F
+righttackbelowcmb;0319
+righttriangle;22BF
+rihiragana;308A
+rikatakana;30EA
+rikatakanahalfwidth;FF98
+ring;02DA
+ringbelowcmb;0325
+ringcmb;030A
+ringhalfleft;02BF
+ringhalfleftarmenian;0559
+ringhalfleftbelowcmb;031C
+ringhalfleftcentered;02D3
+ringhalfright;02BE
+ringhalfrightbelowcmb;0339
+ringhalfrightcentered;02D2
+rinvertedbreve;0213
+rittorusquare;3351
+rlinebelow;1E5F
+rlongleg;027C
+rlonglegturned;027A
+rmonospace;FF52
+rohiragana;308D
+rokatakana;30ED
+rokatakanahalfwidth;FF9B
+roruathai;0E23
+rparen;24AD
+rrabengali;09DC
+rradeva;0931
+rragurmukhi;0A5C
+rreharabic;0691
+rrehfinalarabic;FB8D
+rrvocalicbengali;09E0
+rrvocalicdeva;0960
+rrvocalicgujarati;0AE0
+rrvocalicvowelsignbengali;09C4
+rrvocalicvowelsigndeva;0944
+rrvocalicvowelsigngujarati;0AC4
+rsuperior;F6F1
+rtblock;2590
+rturned;0279
+rturnedsuperior;02B4
+ruhiragana;308B
+rukatakana;30EB
+rukatakanahalfwidth;FF99
+rupeemarkbengali;09F2
+rupeesignbengali;09F3
+rupiah;F6DD
+ruthai;0E24
+rvocalicbengali;098B
+rvocalicdeva;090B
+rvocalicgujarati;0A8B
+rvocalicvowelsignbengali;09C3
+rvocalicvowelsigndeva;0943
+rvocalicvowelsigngujarati;0AC3
+s;0073
+sabengali;09B8
+sacute;015B
+sacutedotaccent;1E65
+sadarabic;0635
+sadeva;0938
+sadfinalarabic;FEBA
+sadinitialarabic;FEBB
+sadmedialarabic;FEBC
+sagujarati;0AB8
+sagurmukhi;0A38
+sahiragana;3055
+sakatakana;30B5
+sakatakanahalfwidth;FF7B
+sallallahoualayhewasallamarabic;FDFA
+samekh;05E1
+samekhdagesh;FB41
+samekhdageshhebrew;FB41
+samekhhebrew;05E1
+saraaathai;0E32
+saraaethai;0E41
+saraaimaimalaithai;0E44
+saraaimaimuanthai;0E43
+saraamthai;0E33
+saraathai;0E30
+saraethai;0E40
+saraiileftthai;F886
+saraiithai;0E35
+saraileftthai;F885
+saraithai;0E34
+saraothai;0E42
+saraueeleftthai;F888
+saraueethai;0E37
+saraueleftthai;F887
+sarauethai;0E36
+sarauthai;0E38
+sarauuthai;0E39
+sbopomofo;3119
+scaron;0161
+scarondotaccent;1E67
+scedilla;015F
+schwa;0259
+schwacyrillic;04D9
+schwadieresiscyrillic;04DB
+schwahook;025A
+scircle;24E2
+scircumflex;015D
+scommaaccent;0219
+sdotaccent;1E61
+sdotbelow;1E63
+sdotbelowdotaccent;1E69
+seagullbelowcmb;033C
+second;2033
+secondtonechinese;02CA
+section;00A7
+seenarabic;0633
+seenfinalarabic;FEB2
+seeninitialarabic;FEB3
+seenmedialarabic;FEB4
+segol;05B6
+segol13;05B6
+segol1f;05B6
+segol2c;05B6
+segolhebrew;05B6
+segolnarrowhebrew;05B6
+segolquarterhebrew;05B6
+segoltahebrew;0592
+segolwidehebrew;05B6
+seharmenian;057D
+sehiragana;305B
+sekatakana;30BB
+sekatakanahalfwidth;FF7E
+semicolon;003B
+semicolonarabic;061B
+semicolonmonospace;FF1B
+semicolonsmall;FE54
+semivoicedmarkkana;309C
+semivoicedmarkkanahalfwidth;FF9F
+sentisquare;3322
+sentosquare;3323
+seven;0037
+sevenarabic;0667
+sevenbengali;09ED
+sevencircle;2466
+sevencircleinversesansserif;2790
+sevendeva;096D
+seveneighths;215E
+sevengujarati;0AED
+sevengurmukhi;0A6D
+sevenhackarabic;0667
+sevenhangzhou;3027
+sevenideographicparen;3226
+seveninferior;2087
+sevenmonospace;FF17
+sevenoldstyle;F737
+sevenparen;247A
+sevenperiod;248E
+sevenpersian;06F7
+sevenroman;2176
+sevensuperior;2077
+seventeencircle;2470
+seventeenparen;2484
+seventeenperiod;2498
+seventhai;0E57
+sfthyphen;00AD
+shaarmenian;0577
+shabengali;09B6
+shacyrillic;0448
+shaddaarabic;0651
+shaddadammaarabic;FC61
+shaddadammatanarabic;FC5E
+shaddafathaarabic;FC60
+shaddafathatanarabic;0651 064B
+shaddakasraarabic;FC62
+shaddakasratanarabic;FC5F
+shade;2592
+shadedark;2593
+shadelight;2591
+shademedium;2592
+shadeva;0936
+shagujarati;0AB6
+shagurmukhi;0A36
+shalshelethebrew;0593
+shbopomofo;3115
+shchacyrillic;0449
+sheenarabic;0634
+sheenfinalarabic;FEB6
+sheeninitialarabic;FEB7
+sheenmedialarabic;FEB8
+sheicoptic;03E3
+sheqel;20AA
+sheqelhebrew;20AA
+sheva;05B0
+sheva115;05B0
+sheva15;05B0
+sheva22;05B0
+sheva2e;05B0
+shevahebrew;05B0
+shevanarrowhebrew;05B0
+shevaquarterhebrew;05B0
+shevawidehebrew;05B0
+shhacyrillic;04BB
+shimacoptic;03ED
+shin;05E9
+shindagesh;FB49
+shindageshhebrew;FB49
+shindageshshindot;FB2C
+shindageshshindothebrew;FB2C
+shindageshsindot;FB2D
+shindageshsindothebrew;FB2D
+shindothebrew;05C1
+shinhebrew;05E9
+shinshindot;FB2A
+shinshindothebrew;FB2A
+shinsindot;FB2B
+shinsindothebrew;FB2B
+shook;0282
+sigma;03C3
+sigma1;03C2
+sigmafinal;03C2
+sigmalunatesymbolgreek;03F2
+sihiragana;3057
+sikatakana;30B7
+sikatakanahalfwidth;FF7C
+siluqhebrew;05BD
+siluqlefthebrew;05BD
+similar;223C
+sindothebrew;05C2
+siosacirclekorean;3274
+siosaparenkorean;3214
+sioscieuckorean;317E
+sioscirclekorean;3266
+sioskiyeokkorean;317A
+sioskorean;3145
+siosnieunkorean;317B
+siosparenkorean;3206
+siospieupkorean;317D
+siostikeutkorean;317C
+six;0036
+sixarabic;0666
+sixbengali;09EC
+sixcircle;2465
+sixcircleinversesansserif;278F
+sixdeva;096C
+sixgujarati;0AEC
+sixgurmukhi;0A6C
+sixhackarabic;0666
+sixhangzhou;3026
+sixideographicparen;3225
+sixinferior;2086
+sixmonospace;FF16
+sixoldstyle;F736
+sixparen;2479
+sixperiod;248D
+sixpersian;06F6
+sixroman;2175
+sixsuperior;2076
+sixteencircle;246F
+sixteencurrencydenominatorbengali;09F9
+sixteenparen;2483
+sixteenperiod;2497
+sixthai;0E56
+slash;002F
+slashmonospace;FF0F
+slong;017F
+slongdotaccent;1E9B
+smileface;263A
+smonospace;FF53
+sofpasuqhebrew;05C3
+softhyphen;00AD
+softsigncyrillic;044C
+sohiragana;305D
+sokatakana;30BD
+sokatakanahalfwidth;FF7F
+soliduslongoverlaycmb;0338
+solidusshortoverlaycmb;0337
+sorusithai;0E29
+sosalathai;0E28
+sosothai;0E0B
+sosuathai;0E2A
+space;0020
+spacehackarabic;0020
+spade;2660
+spadesuitblack;2660
+spadesuitwhite;2664
+sparen;24AE
+squarebelowcmb;033B
+squarecc;33C4
+squarecm;339D
+squarediagonalcrosshatchfill;25A9
+squarehorizontalfill;25A4
+squarekg;338F
+squarekm;339E
+squarekmcapital;33CE
+squareln;33D1
+squarelog;33D2
+squaremg;338E
+squaremil;33D5
+squaremm;339C
+squaremsquared;33A1
+squareorthogonalcrosshatchfill;25A6
+squareupperlefttolowerrightfill;25A7
+squareupperrighttolowerleftfill;25A8
+squareverticalfill;25A5
+squarewhitewithsmallblack;25A3
+srsquare;33DB
+ssabengali;09B7
+ssadeva;0937
+ssagujarati;0AB7
+ssangcieuckorean;3149
+ssanghieuhkorean;3185
+ssangieungkorean;3180
+ssangkiyeokkorean;3132
+ssangnieunkorean;3165
+ssangpieupkorean;3143
+ssangsioskorean;3146
+ssangtikeutkorean;3138
+ssuperior;F6F2
+sterling;00A3
+sterlingmonospace;FFE1
+strokelongoverlaycmb;0336
+strokeshortoverlaycmb;0335
+subset;2282
+subsetnotequal;228A
+subsetorequal;2286
+succeeds;227B
+suchthat;220B
+suhiragana;3059
+sukatakana;30B9
+sukatakanahalfwidth;FF7D
+sukunarabic;0652
+summation;2211
+sun;263C
+superset;2283
+supersetnotequal;228B
+supersetorequal;2287
+svsquare;33DC
+syouwaerasquare;337C
+t;0074
+tabengali;09A4
+tackdown;22A4
+tackleft;22A3
+tadeva;0924
+tagujarati;0AA4
+tagurmukhi;0A24
+taharabic;0637
+tahfinalarabic;FEC2
+tahinitialarabic;FEC3
+tahiragana;305F
+tahmedialarabic;FEC4
+taisyouerasquare;337D
+takatakana;30BF
+takatakanahalfwidth;FF80
+tatweelarabic;0640
+tau;03C4
+tav;05EA
+tavdages;FB4A
+tavdagesh;FB4A
+tavdageshhebrew;FB4A
+tavhebrew;05EA
+tbar;0167
+tbopomofo;310A
+tcaron;0165
+tccurl;02A8
+tcedilla;0163
+tcheharabic;0686
+tchehfinalarabic;FB7B
+tchehinitialarabic;FB7C
+tchehmedialarabic;FB7D
+tchehmeeminitialarabic;FB7C FEE4
+tcircle;24E3
+tcircumflexbelow;1E71
+tcommaaccent;0163
+tdieresis;1E97
+tdotaccent;1E6B
+tdotbelow;1E6D
+tecyrillic;0442
+tedescendercyrillic;04AD
+teharabic;062A
+tehfinalarabic;FE96
+tehhahinitialarabic;FCA2
+tehhahisolatedarabic;FC0C
+tehinitialarabic;FE97
+tehiragana;3066
+tehjeeminitialarabic;FCA1
+tehjeemisolatedarabic;FC0B
+tehmarbutaarabic;0629
+tehmarbutafinalarabic;FE94
+tehmedialarabic;FE98
+tehmeeminitialarabic;FCA4
+tehmeemisolatedarabic;FC0E
+tehnoonfinalarabic;FC73
+tekatakana;30C6
+tekatakanahalfwidth;FF83
+telephone;2121
+telephoneblack;260E
+telishagedolahebrew;05A0
+telishaqetanahebrew;05A9
+tencircle;2469
+tenideographicparen;3229
+tenparen;247D
+tenperiod;2491
+tenroman;2179
+tesh;02A7
+tet;05D8
+tetdagesh;FB38
+tetdageshhebrew;FB38
+tethebrew;05D8
+tetsecyrillic;04B5
+tevirhebrew;059B
+tevirlefthebrew;059B
+thabengali;09A5
+thadeva;0925
+thagujarati;0AA5
+thagurmukhi;0A25
+thalarabic;0630
+thalfinalarabic;FEAC
+thanthakhatlowleftthai;F898
+thanthakhatlowrightthai;F897
+thanthakhatthai;0E4C
+thanthakhatupperleftthai;F896
+theharabic;062B
+thehfinalarabic;FE9A
+thehinitialarabic;FE9B
+thehmedialarabic;FE9C
+thereexists;2203
+therefore;2234
+theta;03B8
+theta1;03D1
+thetasymbolgreek;03D1
+thieuthacirclekorean;3279
+thieuthaparenkorean;3219
+thieuthcirclekorean;326B
+thieuthkorean;314C
+thieuthparenkorean;320B
+thirteencircle;246C
+thirteenparen;2480
+thirteenperiod;2494
+thonangmonthothai;0E11
+thook;01AD
+thophuthaothai;0E12
+thorn;00FE
+thothahanthai;0E17
+thothanthai;0E10
+thothongthai;0E18
+thothungthai;0E16
+thousandcyrillic;0482
+thousandsseparatorarabic;066C
+thousandsseparatorpersian;066C
+three;0033
+threearabic;0663
+threebengali;09E9
+threecircle;2462
+threecircleinversesansserif;278C
+threedeva;0969
+threeeighths;215C
+threegujarati;0AE9
+threegurmukhi;0A69
+threehackarabic;0663
+threehangzhou;3023
+threeideographicparen;3222
+threeinferior;2083
+threemonospace;FF13
+threenumeratorbengali;09F6
+threeoldstyle;F733
+threeparen;2476
+threeperiod;248A
+threepersian;06F3
+threequarters;00BE
+threequartersemdash;F6DE
+threeroman;2172
+threesuperior;00B3
+threethai;0E53
+thzsquare;3394
+tihiragana;3061
+tikatakana;30C1
+tikatakanahalfwidth;FF81
+tikeutacirclekorean;3270
+tikeutaparenkorean;3210
+tikeutcirclekorean;3262
+tikeutkorean;3137
+tikeutparenkorean;3202
+tilde;02DC
+tildebelowcmb;0330
+tildecmb;0303
+tildecomb;0303
+tildedoublecmb;0360
+tildeoperator;223C
+tildeoverlaycmb;0334
+tildeverticalcmb;033E
+timescircle;2297
+tipehahebrew;0596
+tipehalefthebrew;0596
+tippigurmukhi;0A70
+titlocyrilliccmb;0483
+tiwnarmenian;057F
+tlinebelow;1E6F
+tmonospace;FF54
+toarmenian;0569
+tohiragana;3068
+tokatakana;30C8
+tokatakanahalfwidth;FF84
+tonebarextrahighmod;02E5
+tonebarextralowmod;02E9
+tonebarhighmod;02E6
+tonebarlowmod;02E8
+tonebarmidmod;02E7
+tonefive;01BD
+tonesix;0185
+tonetwo;01A8
+tonos;0384
+tonsquare;3327
+topatakthai;0E0F
+tortoiseshellbracketleft;3014
+tortoiseshellbracketleftsmall;FE5D
+tortoiseshellbracketleftvertical;FE39
+tortoiseshellbracketright;3015
+tortoiseshellbracketrightsmall;FE5E
+tortoiseshellbracketrightvertical;FE3A
+totaothai;0E15
+tpalatalhook;01AB
+tparen;24AF
+trademark;2122
+trademarksans;F8EA
+trademarkserif;F6DB
+tretroflexhook;0288
+triagdn;25BC
+triaglf;25C4
+triagrt;25BA
+triagup;25B2
+ts;02A6
+tsadi;05E6
+tsadidagesh;FB46
+tsadidageshhebrew;FB46
+tsadihebrew;05E6
+tsecyrillic;0446
+tsere;05B5
+tsere12;05B5
+tsere1e;05B5
+tsere2b;05B5
+tserehebrew;05B5
+tserenarrowhebrew;05B5
+tserequarterhebrew;05B5
+tserewidehebrew;05B5
+tshecyrillic;045B
+tsuperior;F6F3
+ttabengali;099F
+ttadeva;091F
+ttagujarati;0A9F
+ttagurmukhi;0A1F
+tteharabic;0679
+ttehfinalarabic;FB67
+ttehinitialarabic;FB68
+ttehmedialarabic;FB69
+tthabengali;09A0
+tthadeva;0920
+tthagujarati;0AA0
+tthagurmukhi;0A20
+tturned;0287
+tuhiragana;3064
+tukatakana;30C4
+tukatakanahalfwidth;FF82
+tusmallhiragana;3063
+tusmallkatakana;30C3
+tusmallkatakanahalfwidth;FF6F
+twelvecircle;246B
+twelveparen;247F
+twelveperiod;2493
+twelveroman;217B
+twentycircle;2473
+twentyhangzhou;5344
+twentyparen;2487
+twentyperiod;249B
+two;0032
+twoarabic;0662
+twobengali;09E8
+twocircle;2461
+twocircleinversesansserif;278B
+twodeva;0968
+twodotenleader;2025
+twodotleader;2025
+twodotleadervertical;FE30
+twogujarati;0AE8
+twogurmukhi;0A68
+twohackarabic;0662
+twohangzhou;3022
+twoideographicparen;3221
+twoinferior;2082
+twomonospace;FF12
+twonumeratorbengali;09F5
+twooldstyle;F732
+twoparen;2475
+twoperiod;2489
+twopersian;06F2
+tworoman;2171
+twostroke;01BB
+twosuperior;00B2
+twothai;0E52
+twothirds;2154
+u;0075
+uacute;00FA
+ubar;0289
+ubengali;0989
+ubopomofo;3128
+ubreve;016D
+ucaron;01D4
+ucircle;24E4
+ucircumflex;00FB
+ucircumflexbelow;1E77
+ucyrillic;0443
+udattadeva;0951
+udblacute;0171
+udblgrave;0215
+udeva;0909
+udieresis;00FC
+udieresisacute;01D8
+udieresisbelow;1E73
+udieresiscaron;01DA
+udieresiscyrillic;04F1
+udieresisgrave;01DC
+udieresismacron;01D6
+udotbelow;1EE5
+ugrave;00F9
+ugujarati;0A89
+ugurmukhi;0A09
+uhiragana;3046
+uhookabove;1EE7
+uhorn;01B0
+uhornacute;1EE9
+uhorndotbelow;1EF1
+uhorngrave;1EEB
+uhornhookabove;1EED
+uhorntilde;1EEF
+uhungarumlaut;0171
+uhungarumlautcyrillic;04F3
+uinvertedbreve;0217
+ukatakana;30A6
+ukatakanahalfwidth;FF73
+ukcyrillic;0479
+ukorean;315C
+umacron;016B
+umacroncyrillic;04EF
+umacrondieresis;1E7B
+umatragurmukhi;0A41
+umonospace;FF55
+underscore;005F
+underscoredbl;2017
+underscoremonospace;FF3F
+underscorevertical;FE33
+underscorewavy;FE4F
+union;222A
+universal;2200
+uogonek;0173
+uparen;24B0
+upblock;2580
+upperdothebrew;05C4
+upsilon;03C5
+upsilondieresis;03CB
+upsilondieresistonos;03B0
+upsilonlatin;028A
+upsilontonos;03CD
+uptackbelowcmb;031D
+uptackmod;02D4
+uragurmukhi;0A73
+uring;016F
+ushortcyrillic;045E
+usmallhiragana;3045
+usmallkatakana;30A5
+usmallkatakanahalfwidth;FF69
+ustraightcyrillic;04AF
+ustraightstrokecyrillic;04B1
+utilde;0169
+utildeacute;1E79
+utildebelow;1E75
+uubengali;098A
+uudeva;090A
+uugujarati;0A8A
+uugurmukhi;0A0A
+uumatragurmukhi;0A42
+uuvowelsignbengali;09C2
+uuvowelsigndeva;0942
+uuvowelsigngujarati;0AC2
+uvowelsignbengali;09C1
+uvowelsigndeva;0941
+uvowelsigngujarati;0AC1
+v;0076
+vadeva;0935
+vagujarati;0AB5
+vagurmukhi;0A35
+vakatakana;30F7
+vav;05D5
+vavdagesh;FB35
+vavdagesh65;FB35
+vavdageshhebrew;FB35
+vavhebrew;05D5
+vavholam;FB4B
+vavholamhebrew;FB4B
+vavvavhebrew;05F0
+vavyodhebrew;05F1
+vcircle;24E5
+vdotbelow;1E7F
+vecyrillic;0432
+veharabic;06A4
+vehfinalarabic;FB6B
+vehinitialarabic;FB6C
+vehmedialarabic;FB6D
+vekatakana;30F9
+venus;2640
+verticalbar;007C
+verticallineabovecmb;030D
+verticallinebelowcmb;0329
+verticallinelowmod;02CC
+verticallinemod;02C8
+vewarmenian;057E
+vhook;028B
+vikatakana;30F8
+viramabengali;09CD
+viramadeva;094D
+viramagujarati;0ACD
+visargabengali;0983
+visargadeva;0903
+visargagujarati;0A83
+vmonospace;FF56
+voarmenian;0578
+voicediterationhiragana;309E
+voicediterationkatakana;30FE
+voicedmarkkana;309B
+voicedmarkkanahalfwidth;FF9E
+vokatakana;30FA
+vparen;24B1
+vtilde;1E7D
+vturned;028C
+vuhiragana;3094
+vukatakana;30F4
+w;0077
+wacute;1E83
+waekorean;3159
+wahiragana;308F
+wakatakana;30EF
+wakatakanahalfwidth;FF9C
+wakorean;3158
+wasmallhiragana;308E
+wasmallkatakana;30EE
+wattosquare;3357
+wavedash;301C
+wavyunderscorevertical;FE34
+wawarabic;0648
+wawfinalarabic;FEEE
+wawhamzaabovearabic;0624
+wawhamzaabovefinalarabic;FE86
+wbsquare;33DD
+wcircle;24E6
+wcircumflex;0175
+wdieresis;1E85
+wdotaccent;1E87
+wdotbelow;1E89
+wehiragana;3091
+weierstrass;2118
+wekatakana;30F1
+wekorean;315E
+weokorean;315D
+wgrave;1E81
+whitebullet;25E6
+whitecircle;25CB
+whitecircleinverse;25D9
+whitecornerbracketleft;300E
+whitecornerbracketleftvertical;FE43
+whitecornerbracketright;300F
+whitecornerbracketrightvertical;FE44
+whitediamond;25C7
+whitediamondcontainingblacksmalldiamond;25C8
+whitedownpointingsmalltriangle;25BF
+whitedownpointingtriangle;25BD
+whiteleftpointingsmalltriangle;25C3
+whiteleftpointingtriangle;25C1
+whitelenticularbracketleft;3016
+whitelenticularbracketright;3017
+whiterightpointingsmalltriangle;25B9
+whiterightpointingtriangle;25B7
+whitesmallsquare;25AB
+whitesmilingface;263A
+whitesquare;25A1
+whitestar;2606
+whitetelephone;260F
+whitetortoiseshellbracketleft;3018
+whitetortoiseshellbracketright;3019
+whiteuppointingsmalltriangle;25B5
+whiteuppointingtriangle;25B3
+wihiragana;3090
+wikatakana;30F0
+wikorean;315F
+wmonospace;FF57
+wohiragana;3092
+wokatakana;30F2
+wokatakanahalfwidth;FF66
+won;20A9
+wonmonospace;FFE6
+wowaenthai;0E27
+wparen;24B2
+wring;1E98
+wsuperior;02B7
+wturned;028D
+wynn;01BF
+x;0078
+xabovecmb;033D
+xbopomofo;3112
+xcircle;24E7
+xdieresis;1E8D
+xdotaccent;1E8B
+xeharmenian;056D
+xi;03BE
+xmonospace;FF58
+xparen;24B3
+xsuperior;02E3
+y;0079
+yaadosquare;334E
+yabengali;09AF
+yacute;00FD
+yadeva;092F
+yaekorean;3152
+yagujarati;0AAF
+yagurmukhi;0A2F
+yahiragana;3084
+yakatakana;30E4
+yakatakanahalfwidth;FF94
+yakorean;3151
+yamakkanthai;0E4E
+yasmallhiragana;3083
+yasmallkatakana;30E3
+yasmallkatakanahalfwidth;FF6C
+yatcyrillic;0463
+ycircle;24E8
+ycircumflex;0177
+ydieresis;00FF
+ydotaccent;1E8F
+ydotbelow;1EF5
+yeharabic;064A
+yehbarreearabic;06D2
+yehbarreefinalarabic;FBAF
+yehfinalarabic;FEF2
+yehhamzaabovearabic;0626
+yehhamzaabovefinalarabic;FE8A
+yehhamzaaboveinitialarabic;FE8B
+yehhamzaabovemedialarabic;FE8C
+yehinitialarabic;FEF3
+yehmedialarabic;FEF4
+yehmeeminitialarabic;FCDD
+yehmeemisolatedarabic;FC58
+yehnoonfinalarabic;FC94
+yehthreedotsbelowarabic;06D1
+yekorean;3156
+yen;00A5
+yenmonospace;FFE5
+yeokorean;3155
+yeorinhieuhkorean;3186
+yerahbenyomohebrew;05AA
+yerahbenyomolefthebrew;05AA
+yericyrillic;044B
+yerudieresiscyrillic;04F9
+yesieungkorean;3181
+yesieungpansioskorean;3183
+yesieungsioskorean;3182
+yetivhebrew;059A
+ygrave;1EF3
+yhook;01B4
+yhookabove;1EF7
+yiarmenian;0575
+yicyrillic;0457
+yikorean;3162
+yinyang;262F
+yiwnarmenian;0582
+ymonospace;FF59
+yod;05D9
+yoddagesh;FB39
+yoddageshhebrew;FB39
+yodhebrew;05D9
+yodyodhebrew;05F2
+yodyodpatahhebrew;FB1F
+yohiragana;3088
+yoikorean;3189
+yokatakana;30E8
+yokatakanahalfwidth;FF96
+yokorean;315B
+yosmallhiragana;3087
+yosmallkatakana;30E7
+yosmallkatakanahalfwidth;FF6E
+yotgreek;03F3
+yoyaekorean;3188
+yoyakorean;3187
+yoyakthai;0E22
+yoyingthai;0E0D
+yparen;24B4
+ypogegrammeni;037A
+ypogegrammenigreekcmb;0345
+yr;01A6
+yring;1E99
+ysuperior;02B8
+ytilde;1EF9
+yturned;028E
+yuhiragana;3086
+yuikorean;318C
+yukatakana;30E6
+yukatakanahalfwidth;FF95
+yukorean;3160
+yusbigcyrillic;046B
+yusbigiotifiedcyrillic;046D
+yuslittlecyrillic;0467
+yuslittleiotifiedcyrillic;0469
+yusmallhiragana;3085
+yusmallkatakana;30E5
+yusmallkatakanahalfwidth;FF6D
+yuyekorean;318B
+yuyeokorean;318A
+yyabengali;09DF
+yyadeva;095F
+z;007A
+zaarmenian;0566
+zacute;017A
+zadeva;095B
+zagurmukhi;0A5B
+zaharabic;0638
+zahfinalarabic;FEC6
+zahinitialarabic;FEC7
+zahiragana;3056
+zahmedialarabic;FEC8
+zainarabic;0632
+zainfinalarabic;FEB0
+zakatakana;30B6
+zaqefgadolhebrew;0595
+zaqefqatanhebrew;0594
+zarqahebrew;0598
+zayin;05D6
+zayindagesh;FB36
+zayindageshhebrew;FB36
+zayinhebrew;05D6
+zbopomofo;3117
+zcaron;017E
+zcircle;24E9
+zcircumflex;1E91
+zcurl;0291
+zdot;017C
+zdotaccent;017C
+zdotbelow;1E93
+zecyrillic;0437
+zedescendercyrillic;0499
+zedieresiscyrillic;04DF
+zehiragana;305C
+zekatakana;30BC
+zero;0030
+zeroarabic;0660
+zerobengali;09E6
+zerodeva;0966
+zerogujarati;0AE6
+zerogurmukhi;0A66
+zerohackarabic;0660
+zeroinferior;2080
+zeromonospace;FF10
+zerooldstyle;F730
+zeropersian;06F0
+zerosuperior;2070
+zerothai;0E50
+zerowidthjoiner;FEFF
+zerowidthnonjoiner;200C
+zerowidthspace;200B
+zeta;03B6
+zhbopomofo;3113
+zhearmenian;056A
+zhebrevecyrillic;04C2
+zhecyrillic;0436
+zhedescendercyrillic;0497
+zhedieresiscyrillic;04DD
+zihiragana;3058
+zikatakana;30B8
+zinorhebrew;05AE
+zlinebelow;1E95
+zmonospace;FF5A
+zohiragana;305E
+zokatakana;30BE
+zparen;24B5
+zretroflexhook;0290
+zstroke;01B6
+zuhiragana;305A
+zukatakana;30BA
+#--end
+
+
diff --git a/src/main/resources/Resources/pdfbox.version b/src/main/resources/Resources/pdfbox.version
new file mode 100644
index 0000000..01c8b34
--- /dev/null
+++ b/src/main/resources/Resources/pdfbox.version
@@ -0,0 +1,2 @@
+#Sun Sep 11 16:57:35 EDT 2005
+pdfbox.version=PDFBox-0.7.2
diff --git a/src/main/resources/Resources/ttf/Arial-BoldItalicMT.ttf b/src/main/resources/Resources/ttf/Arial-BoldItalicMT.ttf
new file mode 100644
index 0000000..b55eee3
--- /dev/null
+++ b/src/main/resources/Resources/ttf/Arial-BoldItalicMT.ttf
Binary files differ
diff --git a/src/main/resources/Resources/ttf/Arial-BoldMT.ttf b/src/main/resources/Resources/ttf/Arial-BoldMT.ttf
new file mode 100644
index 0000000..51d6111
--- /dev/null
+++ b/src/main/resources/Resources/ttf/Arial-BoldMT.ttf
Binary files differ
diff --git a/src/main/resources/Resources/ttf/ArialMT.ttf b/src/main/resources/Resources/ttf/ArialMT.ttf
new file mode 100644
index 0000000..58cd6b5
--- /dev/null
+++ b/src/main/resources/Resources/ttf/ArialMT.ttf
Binary files differ
diff --git a/src/main/resources/com/lowagie/text/MPL-1.1.txt b/src/main/resources/com/lowagie/text/MPL-1.1.txt
new file mode 100644
index 0000000..7a45bfe
--- /dev/null
+++ b/src/main/resources/com/lowagie/text/MPL-1.1.txt
@@ -0,0 +1,470 @@
+ MOZILLA PUBLIC LICENSE
+ Version 1.1
+
+ ---------------
+
+1. Definitions.
+
+ 1.0.1. "Commercial Use" means distribution or otherwise making the
+ Covered Code available to a third party.
+
+ 1.1. "Contributor" means each entity that creates or contributes to
+ the creation of Modifications.
+
+ 1.2. "Contributor Version" means the combination of the Original
+ Code, prior Modifications used by a Contributor, and the Modifications
+ made by that particular Contributor.
+
+ 1.3. "Covered Code" means the Original Code or Modifications or the
+ combination of the Original Code and Modifications, in each case
+ including portions thereof.
+
+ 1.4. "Electronic Distribution Mechanism" means a mechanism generally
+ accepted in the software development community for the electronic
+ transfer of data.
+
+ 1.5. "Executable" means Covered Code in any form other than Source
+ Code.
+
+ 1.6. "Initial Developer" means the individual or entity identified
+ as the Initial Developer in the Source Code notice required by Exhibit
+ A.
+
+ 1.7. "Larger Work" means a work which combines Covered Code or
+ portions thereof with code not governed by the terms of this License.
+
+ 1.8. "License" means this document.
+
+ 1.8.1. "Licensable" means having the right to grant, to the maximum
+ extent possible, whether at the time of the initial grant or
+ subsequently acquired, any and all of the rights conveyed herein.
+
+ 1.9. "Modifications" means any addition to or deletion from the
+ substance or structure of either the Original Code or any previous
+ Modifications. When Covered Code is released as a series of files, a
+ Modification is:
+ A. Any addition to or deletion from the contents of a file
+ containing Original Code or previous Modifications.
+
+ B. Any new file that contains any part of the Original Code or
+ previous Modifications.
+
+ 1.10. "Original Code" means Source Code of computer software code
+ which is described in the Source Code notice required by Exhibit A as
+ Original Code, and which, at the time of its release under this
+ License is not already Covered Code governed by this License.
+
+ 1.10.1. "Patent Claims" means any patent claim(s), now owned or
+ hereafter acquired, including without limitation, method, process,
+ and apparatus claims, in any patent Licensable by grantor.
+
+ 1.11. "Source Code" means the preferred form of the Covered Code for
+ making modifications to it, including all modules it contains, plus
+ any associated interface definition files, scripts used to control
+ compilation and installation of an Executable, or source code
+ differential comparisons against either the Original Code or another
+ well known, available Covered Code of the Contributor's choice. The
+ Source Code can be in a compressed or archival form, provided the
+ appropriate decompression or de-archiving software is widely available
+ for no charge.
+
+ 1.12. "You" (or "Your") means an individual or a legal entity
+ exercising rights under, and complying with all of the terms of, this
+ License or a future version of this License issued under Section 6.1.
+ For legal entities, "You" includes any entity which controls, is
+ controlled by, or is under common control with You. For purposes of
+ this definition, "control" means (a) the power, direct or indirect,
+ to cause the direction or management of such entity, whether by
+ contract or otherwise, or (b) ownership of more than fifty percent
+ (50%) of the outstanding shares or beneficial ownership of such
+ entity.
+
+2. Source Code License.
+
+ 2.1. The Initial Developer Grant.
+ The Initial Developer hereby grants You a world-wide, royalty-free,
+ non-exclusive license, subject to third party intellectual property
+ claims:
+ (a) under intellectual property rights (other than patent or
+ trademark) Licensable by Initial Developer to use, reproduce,
+ modify, display, perform, sublicense and distribute the Original
+ Code (or portions thereof) with or without Modifications, and/or
+ as part of a Larger Work; and
+
+ (b) under Patents Claims infringed by the making, using or
+ selling of Original Code, to make, have made, use, practice,
+ sell, and offer for sale, and/or otherwise dispose of the
+ Original Code (or portions thereof).
+
+ (c) the licenses granted in this Section 2.1(a) and (b) are
+ effective on the date Initial Developer first distributes
+ Original Code under the terms of this License.
+
+ (d) Notwithstanding Section 2.1(b) above, no patent license is
+ granted: 1) for code that You delete from the Original Code; 2)
+ separate from the Original Code; or 3) for infringements caused
+ by: i) the modification of the Original Code or ii) the
+ combination of the Original Code with other software or devices.
+
+ 2.2. Contributor Grant.
+ Subject to third party intellectual property claims, each Contributor
+ hereby grants You a world-wide, royalty-free, non-exclusive license
+
+ (a) under intellectual property rights (other than patent or
+ trademark) Licensable by Contributor, to use, reproduce, modify,
+ display, perform, sublicense and distribute the Modifications
+ created by such Contributor (or portions thereof) either on an
+ unmodified basis, with other Modifications, as Covered Code
+ and/or as part of a Larger Work; and
+
+ (b) under Patent Claims infringed by the making, using, or
+ selling of Modifications made by that Contributor either alone
+ and/or in combination with its Contributor Version (or portions
+ of such combination), to make, use, sell, offer for sale, have
+ made, and/or otherwise dispose of: 1) Modifications made by that
+ Contributor (or portions thereof); and 2) the combination of
+ Modifications made by that Contributor with its Contributor
+ Version (or portions of such combination).
+
+ (c) the licenses granted in Sections 2.2(a) and 2.2(b) are
+ effective on the date Contributor first makes Commercial Use of
+ the Covered Code.
+
+ (d) Notwithstanding Section 2.2(b) above, no patent license is
+ granted: 1) for any code that Contributor has deleted from the
+ Contributor Version; 2) separate from the Contributor Version;
+ 3) for infringements caused by: i) third party modifications of
+ Contributor Version or ii) the combination of Modifications made
+ by that Contributor with other software (except as part of the
+ Contributor Version) or other devices; or 4) under Patent Claims
+ infringed by Covered Code in the absence of Modifications made by
+ that Contributor.
+
+3. Distribution Obligations.
+
+ 3.1. Application of License.
+ The Modifications which You create or to which You contribute are
+ governed by the terms of this License, including without limitation
+ Section 2.2. The Source Code version of Covered Code may be
+ distributed only under the terms of this License or a future version
+ of this License released under Section 6.1, and You must include a
+ copy of this License with every copy of the Source Code You
+ distribute. You may not offer or impose any terms on any Source Code
+ version that alters or restricts the applicable version of this
+ License or the recipients' rights hereunder. However, You may include
+ an additional document offering the additional rights described in
+ Section 3.5.
+
+ 3.2. Availability of Source Code.
+ Any Modification which You create or to which You contribute must be
+ made available in Source Code form under the terms of this License
+ either on the same media as an Executable version or via an accepted
+ Electronic Distribution Mechanism to anyone to whom you made an
+ Executable version available; and if made available via Electronic
+ Distribution Mechanism, must remain available for at least twelve (12)
+ months after the date it initially became available, or at least six
+ (6) months after a subsequent version of that particular Modification
+ has been made available to such recipients. You are responsible for
+ ensuring that the Source Code version remains available even if the
+ Electronic Distribution Mechanism is maintained by a third party.
+
+ 3.3. Description of Modifications.
+ You must cause all Covered Code to which You contribute to contain a
+ file documenting the changes You made to create that Covered Code and
+ the date of any change. You must include a prominent statement that
+ the Modification is derived, directly or indirectly, from Original
+ Code provided by the Initial Developer and including the name of the
+ Initial Developer in (a) the Source Code, and (b) in any notice in an
+ Executable version or related documentation in which You describe the
+ origin or ownership of the Covered Code.
+
+ 3.4. Intellectual Property Matters
+ (a) Third Party Claims.
+ If Contributor has knowledge that a license under a third party's
+ intellectual property rights is required to exercise the rights
+ granted by such Contributor under Sections 2.1 or 2.2,
+ Contributor must include a text file with the Source Code
+ distribution titled "LEGAL" which describes the claim and the
+ party making the claim in sufficient detail that a recipient will
+ know whom to contact. If Contributor obtains such knowledge after
+ the Modification is made available as described in Section 3.2,
+ Contributor shall promptly modify the LEGAL file in all copies
+ Contributor makes available thereafter and shall take other steps
+ (such as notifying appropriate mailing lists or newsgroups)
+ reasonably calculated to inform those who received the Covered
+ Code that new knowledge has been obtained.
+
+ (b) Contributor APIs.
+ If Contributor's Modifications include an application programming
+ interface and Contributor has knowledge of patent licenses which
+ are reasonably necessary to implement that API, Contributor must
+ also include this information in the LEGAL file.
+
+ (c) Representations.
+ Contributor represents that, except as disclosed pursuant to
+ Section 3.4(a) above, Contributor believes that Contributor's
+ Modifications are Contributor's original creation(s) and/or
+ Contributor has sufficient rights to grant the rights conveyed by
+ this License.
+
+ 3.5. Required Notices.
+ You must duplicate the notice in Exhibit A in each file of the Source
+ Code. If it is not possible to put such notice in a particular Source
+ Code file due to its structure, then You must include such notice in a
+ location (such as a relevant directory) where a user would be likely
+ to look for such a notice. If You created one or more Modification(s)
+ You may add your name as a Contributor to the notice described in
+ Exhibit A. You must also duplicate this License in any documentation
+ for the Source Code where You describe recipients' rights or ownership
+ rights relating to Covered Code. You may choose to offer, and to
+ charge a fee for, warranty, support, indemnity or liability
+ obligations to one or more recipients of Covered Code. However, You
+ may do so only on Your own behalf, and not on behalf of the Initial
+ Developer or any Contributor. You must make it absolutely clear than
+ any such warranty, support, indemnity or liability obligation is
+ offered by You alone, and You hereby agree to indemnify the Initial
+ Developer and every Contributor for any liability incurred by the
+ Initial Developer or such Contributor as a result of warranty,
+ support, indemnity or liability terms You offer.
+
+ 3.6. Distribution of Executable Versions.
+ You may distribute Covered Code in Executable form only if the
+ requirements of Section 3.1-3.5 have been met for that Covered Code,
+ and if You include a notice stating that the Source Code version of
+ the Covered Code is available under the terms of this License,
+ including a description of how and where You have fulfilled the
+ obligations of Section 3.2. The notice must be conspicuously included
+ in any notice in an Executable version, related documentation or
+ collateral in which You describe recipients' rights relating to the
+ Covered Code. You may distribute the Executable version of Covered
+ Code or ownership rights under a license of Your choice, which may
+ contain terms different from this License, provided that You are in
+ compliance with the terms of this License and that the license for the
+ Executable version does not attempt to limit or alter the recipient's
+ rights in the Source Code version from the rights set forth in this
+ License. If You distribute the Executable version under a different
+ license You must make it absolutely clear that any terms which differ
+ from this License are offered by You alone, not by the Initial
+ Developer or any Contributor. You hereby agree to indemnify the
+ Initial Developer and every Contributor for any liability incurred by
+ the Initial Developer or such Contributor as a result of any such
+ terms You offer.
+
+ 3.7. Larger Works.
+ You may create a Larger Work by combining Covered Code with other code
+ not governed by the terms of this License and distribute the Larger
+ Work as a single product. In such a case, You must make sure the
+ requirements of this License are fulfilled for the Covered Code.
+
+4. Inability to Comply Due to Statute or Regulation.
+
+ If it is impossible for You to comply with any of the terms of this
+ License with respect to some or all of the Covered Code due to
+ statute, judicial order, or regulation then You must: (a) comply with
+ the terms of this License to the maximum extent possible; and (b)
+ describe the limitations and the code they affect. Such description
+ must be included in the LEGAL file described in Section 3.4 and must
+ be included with all distributions of the Source Code. Except to the
+ extent prohibited by statute or regulation, such description must be
+ sufficiently detailed for a recipient of ordinary skill to be able to
+ understand it.
+
+5. Application of this License.
+
+ This License applies to code to which the Initial Developer has
+ attached the notice in Exhibit A and to related Covered Code.
+
+6. Versions of the License.
+
+ 6.1. New Versions.
+ Netscape Communications Corporation ("Netscape") may publish revised
+ and/or new versions of the License from time to time. Each version
+ will be given a distinguishing version number.
+
+ 6.2. Effect of New Versions.
+ Once Covered Code has been published under a particular version of the
+ License, You may always continue to use it under the terms of that
+ version. You may also choose to use such Covered Code under the terms
+ of any subsequent version of the License published by Netscape. No one
+ other than Netscape has the right to modify the terms applicable to
+ Covered Code created under this License.
+
+ 6.3. Derivative Works.
+ If You create or use a modified version of this License (which you may
+ only do in order to apply it to code which is not already Covered Code
+ governed by this License), You must (a) rename Your license so that
+ the phrases "Mozilla", "MOZILLAPL", "MOZPL", "Netscape",
+ "MPL", "NPL" or any confusingly similar phrase do not appear in your
+ license (except to note that your license differs from this License)
+ and (b) otherwise make it clear that Your version of the license
+ contains terms which differ from the Mozilla Public License and
+ Netscape Public License. (Filling in the name of the Initial
+ Developer, Original Code or Contributor in the notice described in
+ Exhibit A shall not of themselves be deemed to be modifications of
+ this License.)
+
+7. DISCLAIMER OF WARRANTY.
+
+ COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS,
+ WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
+ WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF
+ DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING.
+ THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE
+ IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT,
+ YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE
+ COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER
+ OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF
+ ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER.
+
+8. TERMINATION.
+
+ 8.1. This License and the rights granted hereunder will terminate
+ automatically if You fail to comply with terms herein and fail to cure
+ such breach within 30 days of becoming aware of the breach. All
+ sublicenses to the Covered Code which are properly granted shall
+ survive any termination of this License. Provisions which, by their
+ nature, must remain in effect beyond the termination of this License
+ shall survive.
+
+ 8.2. If You initiate litigation by asserting a patent infringement
+ claim (excluding declatory judgment actions) against Initial Developer
+ or a Contributor (the Initial Developer or Contributor against whom
+ You file such action is referred to as "Participant") alleging that:
+
+ (a) such Participant's Contributor Version directly or indirectly
+ infringes any patent, then any and all rights granted by such
+ Participant to You under Sections 2.1 and/or 2.2 of this License
+ shall, upon 60 days notice from Participant terminate prospectively,
+ unless if within 60 days after receipt of notice You either: (i)
+ agree in writing to pay Participant a mutually agreeable reasonable
+ royalty for Your past and future use of Modifications made by such
+ Participant, or (ii) withdraw Your litigation claim with respect to
+ the Contributor Version against such Participant. If within 60 days
+ of notice, a reasonable royalty and payment arrangement are not
+ mutually agreed upon in writing by the parties or the litigation claim
+ is not withdrawn, the rights granted by Participant to You under
+ Sections 2.1 and/or 2.2 automatically terminate at the expiration of
+ the 60 day notice period specified above.
+
+ (b) any software, hardware, or device, other than such Participant's
+ Contributor Version, directly or indirectly infringes any patent, then
+ any rights granted to You by such Participant under Sections 2.1(b)
+ and 2.2(b) are revoked effective as of the date You first made, used,
+ sold, distributed, or had made, Modifications made by that
+ Participant.
+
+ 8.3. If You assert a patent infringement claim against Participant
+ alleging that such Participant's Contributor Version directly or
+ indirectly infringes any patent where such claim is resolved (such as
+ by license or settlement) prior to the initiation of patent
+ infringement litigation, then the reasonable value of the licenses
+ granted by such Participant under Sections 2.1 or 2.2 shall be taken
+ into account in determining the amount or value of any payment or
+ license.
+
+ 8.4. In the event of termination under Sections 8.1 or 8.2 above,
+ all end user license agreements (excluding distributors and resellers)
+ which have been validly granted by You or any distributor hereunder
+ prior to termination shall survive termination.
+
+9. LIMITATION OF LIABILITY.
+
+ UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT
+ (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL
+ DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE,
+ OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR
+ ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY
+ CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL,
+ WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER
+ COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN
+ INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF
+ LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY
+ RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW
+ PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE
+ EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO
+ THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU.
+
+10. U.S. GOVERNMENT END USERS.
+
+ The Covered Code is a "commercial item," as that term is defined in
+ 48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer
+ software" and "commercial computer software documentation," as such
+ terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48
+ C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995),
+ all U.S. Government End Users acquire Covered Code with only those
+ rights set forth herein.
+
+11. MISCELLANEOUS.
+
+ This License represents the complete agreement concerning subject
+ matter hereof. If any provision of this License is held to be
+ unenforceable, such provision shall be reformed only to the extent
+ necessary to make it enforceable. This License shall be governed by
+ California law provisions (except to the extent applicable law, if
+ any, provides otherwise), excluding its conflict-of-law provisions.
+ With respect to disputes in which at least one party is a citizen of,
+ or an entity chartered or registered to do business in the United
+ States of America, any litigation relating to this License shall be
+ subject to the jurisdiction of the Federal Courts of the Northern
+ District of California, with venue lying in Santa Clara County,
+ California, with the losing party responsible for costs, including
+ without limitation, court costs and reasonable attorneys' fees and
+ expenses. The application of the United Nations Convention on
+ Contracts for the International Sale of Goods is expressly excluded.
+ Any law or regulation which provides that the language of a contract
+ shall be construed against the drafter shall not apply to this
+ License.
+
+12. RESPONSIBILITY FOR CLAIMS.
+
+ As between Initial Developer and the Contributors, each party is
+ responsible for claims and damages arising, directly or indirectly,
+ out of its utilization of rights under this License and You agree to
+ work with Initial Developer and Contributors to distribute such
+ responsibility on an equitable basis. Nothing herein is intended or
+ shall be deemed to constitute any admission of liability.
+
+13. MULTIPLE-LICENSED CODE.
+
+ Initial Developer may designate portions of the Covered Code as
+ "Multiple-Licensed". "Multiple-Licensed" means that the Initial
+ Developer permits you to utilize portions of the Covered Code under
+ Your choice of the NPL or the alternative licenses, if any, specified
+ by the Initial Developer in the file described in Exhibit A.
+
+EXHIBIT A -Mozilla Public License.
+
+ ``The contents of this file are subject to the Mozilla Public License
+ Version 1.1 (the "License"); you may not use this file except in
+ compliance with the License. You may obtain a copy of the License at
+ http://www.mozilla.org/MPL/
+
+ Software distributed under the License is distributed on an "AS IS"
+ basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
+ License for the specific language governing rights and limitations
+ under the License.
+
+ The Original Code is ______________________________________.
+
+ The Initial Developer of the Original Code is ________________________.
+ Portions created by ______________________ are Copyright (C) ______
+ _______________________. All Rights Reserved.
+
+ Contributor(s): ______________________________________.
+
+ Alternatively, the contents of this file may be used under the terms
+ of the _____ license (the "[___] License"), in which case the
+ provisions of [______] License are applicable instead of those
+ above. If you wish to allow use of your version of this file only
+ under the terms of the [____] License and not to allow others to use
+ your version of this file under the MPL, indicate your decision by
+ deleting the provisions above and replace them with the notice and
+ other provisions required by the [___] License. If you do not delete
+ the provisions above, a recipient may use your version of this file
+ under either the MPL or the [___] License."
+
+ [NOTE: The text of this Exhibit A may differ slightly from the text of
+ the notices in the Source Code files of the Original Code. You should
+ use the text of this Exhibit A rather than the text found in the
+ Original Code Source Code for Your Modifications.]
+
diff --git a/src/main/resources/com/lowagie/text/lgpl.txt b/src/main/resources/com/lowagie/text/lgpl.txt
new file mode 100644
index 0000000..89315f4
--- /dev/null
+++ b/src/main/resources/com/lowagie/text/lgpl.txt
@@ -0,0 +1,437 @@
+ GNU LIBRARY GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1991 Free Software Foundation, Inc.
+ 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the library GPL. It is
+ numbered 2 because it goes with version 2 of the ordinary GPL.]
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+ This license, the Library General Public License, applies to some
+specially designated Free Software Foundation software, and to any
+other libraries whose authors decide to use it. You can use it for
+your libraries, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if
+you distribute copies of the library, or if you modify it.
+
+ For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you. You must make sure that they, too, receive or can get the source
+code. If you link a program with the library, you must provide
+complete object files to the recipients so that they can relink them
+with the library, after making changes to the library and recompiling
+it. And you must show them these terms so they know their rights.
+
+ Our method of protecting your rights has two steps: (1) copyright
+the library, and (2) offer you this license which gives you legal
+permission to copy, distribute and/or modify the library.
+
+ Also, for each distributor's protection, we want to make certain
+that everyone understands that there is no warranty for this free
+library. If the library is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original
+version, so that any problems introduced by others will not reflect on
+the original authors' reputations.
+.
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that companies distributing free
+software will individually obtain patent licenses, thus in effect
+transforming the program into proprietary software. To prevent this,
+we have made it clear that any patent must be licensed for everyone's
+free use or not licensed at all.
+
+ Most GNU software, including some libraries, is covered by the ordinary
+GNU General Public License, which was designed for utility programs. This
+license, the GNU Library General Public License, applies to certain
+designated libraries. This license is quite different from the ordinary
+one; be sure to read it in full, and don't assume that anything in it is
+the same as in the ordinary license.
+
+ The reason we have a separate public license for some libraries is that
+they blur the distinction we usually make between modifying or adding to a
+program and simply using it. Linking a program with a library, without
+changing the library, is in some sense simply using the library, and is
+analogous to running a utility program or application program. However, in
+a textual and legal sense, the linked executable is a combined work, a
+derivative of the original library, and the ordinary General Public License
+treats it as such.
+
+ Because of this blurred distinction, using the ordinary General
+Public License for libraries did not effectively promote software
+sharing, because most developers did not use the libraries. We
+concluded that weaker conditions might promote sharing better.
+
+ However, unrestricted linking of non-free programs would deprive the
+users of those programs of all benefit from the free status of the
+libraries themselves. This Library General Public License is intended to
+permit developers of non-free programs to use free libraries, while
+preserving your freedom as a user of such programs to change the free
+libraries that are incorporated in them. (We have not seen how to achieve
+this as regards changes in header files, but we have achieved it as regards
+changes in the actual functions of the Library.) The hope is that this
+will lead to faster development of free libraries.
+
+ The precise terms and conditions for copying, distribution and
+modification follow. Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library". The
+former contains code derived from the library, while the latter only
+works together with the library.
+
+ Note that it is possible for a library to be covered by the ordinary
+General Public License rather than by this special one.
+.
+ GNU LIBRARY GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License Agreement applies to any software library which
+contains a notice placed by the copyright holder or other authorized
+party saying it may be distributed under the terms of this Library
+General Public License (also called "this License"). Each licensee is
+addressed as "you".
+
+ A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+ The "Library", below, refers to any such software library or work
+which has been distributed under these terms. A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language. (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+ "Source code" for a work means the preferred form of the work for
+making modifications to it. For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+ Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it). Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+ 1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+ You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+.
+ 2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) The modified work must itself be a software library.
+
+ b) You must cause the files modified to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ c) You must cause the whole of the work to be licensed at no
+ charge to all third parties under the terms of this License.
+
+ d) If a facility in the modified Library refers to a function or a
+ table of data to be supplied by an application program that uses
+ the facility, other than as an argument passed when the facility
+ is invoked, then you must make a good faith effort to ensure that,
+ in the event an application does not supply such function or
+ table, the facility still operates, and performs whatever part of
+ its purpose remains meaningful.
+
+ (For example, a function in a library to compute square roots has
+ a purpose that is entirely well-defined independent of the
+ application. Therefore, Subsection 2d requires that any
+ application-supplied function or table used by this function must
+ be optional: if the application does not supply it, the square
+ root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library. To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License. (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.) Do not make any other change in
+these notices.
+.
+ Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+ This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+ 4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+ If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library". Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+ However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library". The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+ When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library. The
+threshold for this to be true is not precisely defined by law.
+
+ If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work. (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+ Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+.
+ 6. As an exception to the Sections above, you may also compile or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+ You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License. You must supply a copy of this License. If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License. Also, you must do one
+of these things:
+
+ a) Accompany the work with the complete corresponding
+ machine-readable source code for the Library including whatever
+ changes were used in the work (which must be distributed under
+ Sections 1 and 2 above); and, if the work is an executable linked
+ with the Library, with the complete machine-readable "work that
+ uses the Library", as object code and/or source code, so that the
+ user can modify the Library and then relink to produce a modified
+ executable containing the modified Library. (It is understood
+ that the user who changes the contents of definitions files in the
+ Library will not necessarily be able to recompile the application
+ to use the modified definitions.)
+
+ b) Accompany the work with a written offer, valid for at
+ least three years, to give the same user the materials
+ specified in Subsection 6a, above, for a charge no more
+ than the cost of performing this distribution.
+
+ c) If distribution of the work is made by offering access to copy
+ from a designated place, offer equivalent access to copy the above
+ specified materials from the same place.
+
+ d) Verify that the user has already received a copy of these
+ materials or that you have already sent this user a copy.
+
+ For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it. However, as a special exception,
+the source code distributed need not include anything that is normally
+distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+ It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system. Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+.
+ 7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+ a) Accompany the combined library with a copy of the same work
+ based on the Library, uncombined with any other library
+ facilities. This must be distributed under the terms of the
+ Sections above.
+
+ b) Give prominent notice with the combined library of the fact
+ that part of it is a work based on the Library, and explaining
+ where to find the accompanying uncombined form of the same work.
+
+ 8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License. Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License. However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+ 9. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Library or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+ 10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+.
+ 11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all. For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded. In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+ 13. The Free Software Foundation may publish revised and/or new
+versions of the Library General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation. If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+.
+ 14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission. For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this. Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+ NO WARRANTY
+
+ 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+ END OF TERMS AND CONDITIONS
diff --git a/src/main/resources/com/lowagie/text/pdf/fonts/Courier-Bold.afm b/src/main/resources/com/lowagie/text/pdf/fonts/Courier-Bold.afm
new file mode 100644
index 0000000..d25d776
--- /dev/null
+++ b/src/main/resources/com/lowagie/text/pdf/fonts/Courier-Bold.afm
@@ -0,0 +1,342 @@
+StartFontMetrics 4.1
+Comment Copyright (c) 1989, 1990, 1991, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.
+Comment Creation Date: Mon Jun 23 16:28:00 1997
+Comment UniqueID 43048
+Comment VMusage 41139 52164
+FontName Courier-Bold
+FullName Courier Bold
+FamilyName Courier
+Weight Bold
+ItalicAngle 0
+IsFixedPitch true
+CharacterSet ExtendedRoman
+FontBBox -113 -250 749 801
+UnderlinePosition -100
+UnderlineThickness 50
+Version 003.000
+Notice Copyright (c) 1989, 1990, 1991, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.
+EncodingScheme AdobeStandardEncoding
+CapHeight 562
+XHeight 439
+Ascender 629
+Descender -157
+StdHW 84
+StdVW 106
+StartCharMetrics 315
+C 32 ; WX 600 ; N space ; B 0 0 0 0 ;
+C 33 ; WX 600 ; N exclam ; B 202 -15 398 572 ;
+C 34 ; WX 600 ; N quotedbl ; B 135 277 465 562 ;
+C 35 ; WX 600 ; N numbersign ; B 56 -45 544 651 ;
+C 36 ; WX 600 ; N dollar ; B 82 -126 519 666 ;
+C 37 ; WX 600 ; N percent ; B 5 -15 595 616 ;
+C 38 ; WX 600 ; N ampersand ; B 36 -15 546 543 ;
+C 39 ; WX 600 ; N quoteright ; B 171 277 423 562 ;
+C 40 ; WX 600 ; N parenleft ; B 219 -102 461 616 ;
+C 41 ; WX 600 ; N parenright ; B 139 -102 381 616 ;
+C 42 ; WX 600 ; N asterisk ; B 91 219 509 601 ;
+C 43 ; WX 600 ; N plus ; B 71 39 529 478 ;
+C 44 ; WX 600 ; N comma ; B 123 -111 393 174 ;
+C 45 ; WX 600 ; N hyphen ; B 100 203 500 313 ;
+C 46 ; WX 600 ; N period ; B 192 -15 408 171 ;
+C 47 ; WX 600 ; N slash ; B 98 -77 502 626 ;
+C 48 ; WX 600 ; N zero ; B 87 -15 513 616 ;
+C 49 ; WX 600 ; N one ; B 81 0 539 616 ;
+C 50 ; WX 600 ; N two ; B 61 0 499 616 ;
+C 51 ; WX 600 ; N three ; B 63 -15 501 616 ;
+C 52 ; WX 600 ; N four ; B 53 0 507 616 ;
+C 53 ; WX 600 ; N five ; B 70 -15 521 601 ;
+C 54 ; WX 600 ; N six ; B 90 -15 521 616 ;
+C 55 ; WX 600 ; N seven ; B 55 0 494 601 ;
+C 56 ; WX 600 ; N eight ; B 83 -15 517 616 ;
+C 57 ; WX 600 ; N nine ; B 79 -15 510 616 ;
+C 58 ; WX 600 ; N colon ; B 191 -15 407 425 ;
+C 59 ; WX 600 ; N semicolon ; B 123 -111 408 425 ;
+C 60 ; WX 600 ; N less ; B 66 15 523 501 ;
+C 61 ; WX 600 ; N equal ; B 71 118 529 398 ;
+C 62 ; WX 600 ; N greater ; B 77 15 534 501 ;
+C 63 ; WX 600 ; N question ; B 98 -14 501 580 ;
+C 64 ; WX 600 ; N at ; B 16 -15 584 616 ;
+C 65 ; WX 600 ; N A ; B -9 0 609 562 ;
+C 66 ; WX 600 ; N B ; B 30 0 573 562 ;
+C 67 ; WX 600 ; N C ; B 22 -18 560 580 ;
+C 68 ; WX 600 ; N D ; B 30 0 594 562 ;
+C 69 ; WX 600 ; N E ; B 25 0 560 562 ;
+C 70 ; WX 600 ; N F ; B 39 0 570 562 ;
+C 71 ; WX 600 ; N G ; B 22 -18 594 580 ;
+C 72 ; WX 600 ; N H ; B 20 0 580 562 ;
+C 73 ; WX 600 ; N I ; B 77 0 523 562 ;
+C 74 ; WX 600 ; N J ; B 37 -18 601 562 ;
+C 75 ; WX 600 ; N K ; B 21 0 599 562 ;
+C 76 ; WX 600 ; N L ; B 39 0 578 562 ;
+C 77 ; WX 600 ; N M ; B -2 0 602 562 ;
+C 78 ; WX 600 ; N N ; B 8 -12 610 562 ;
+C 79 ; WX 600 ; N O ; B 22 -18 578 580 ;
+C 80 ; WX 600 ; N P ; B 48 0 559 562 ;
+C 81 ; WX 600 ; N Q ; B 32 -138 578 580 ;
+C 82 ; WX 600 ; N R ; B 24 0 599 562 ;
+C 83 ; WX 600 ; N S ; B 47 -22 553 582 ;
+C 84 ; WX 600 ; N T ; B 21 0 579 562 ;
+C 85 ; WX 600 ; N U ; B 4 -18 596 562 ;
+C 86 ; WX 600 ; N V ; B -13 0 613 562 ;
+C 87 ; WX 600 ; N W ; B -18 0 618 562 ;
+C 88 ; WX 600 ; N X ; B 12 0 588 562 ;
+C 89 ; WX 600 ; N Y ; B 12 0 589 562 ;
+C 90 ; WX 600 ; N Z ; B 62 0 539 562 ;
+C 91 ; WX 600 ; N bracketleft ; B 245 -102 475 616 ;
+C 92 ; WX 600 ; N backslash ; B 99 -77 503 626 ;
+C 93 ; WX 600 ; N bracketright ; B 125 -102 355 616 ;
+C 94 ; WX 600 ; N asciicircum ; B 108 250 492 616 ;
+C 95 ; WX 600 ; N underscore ; B 0 -125 600 -75 ;
+C 96 ; WX 600 ; N quoteleft ; B 178 277 428 562 ;
+C 97 ; WX 600 ; N a ; B 35 -15 570 454 ;
+C 98 ; WX 600 ; N b ; B 0 -15 584 626 ;
+C 99 ; WX 600 ; N c ; B 40 -15 545 459 ;
+C 100 ; WX 600 ; N d ; B 20 -15 591 626 ;
+C 101 ; WX 600 ; N e ; B 40 -15 563 454 ;
+C 102 ; WX 600 ; N f ; B 83 0 547 626 ; L i fi ; L l fl ;
+C 103 ; WX 600 ; N g ; B 30 -146 580 454 ;
+C 104 ; WX 600 ; N h ; B 5 0 592 626 ;
+C 105 ; WX 600 ; N i ; B 77 0 523 658 ;
+C 106 ; WX 600 ; N j ; B 63 -146 440 658 ;
+C 107 ; WX 600 ; N k ; B 20 0 585 626 ;
+C 108 ; WX 600 ; N l ; B 77 0 523 626 ;
+C 109 ; WX 600 ; N m ; B -22 0 626 454 ;
+C 110 ; WX 600 ; N n ; B 18 0 592 454 ;
+C 111 ; WX 600 ; N o ; B 30 -15 570 454 ;
+C 112 ; WX 600 ; N p ; B -1 -142 570 454 ;
+C 113 ; WX 600 ; N q ; B 20 -142 591 454 ;
+C 114 ; WX 600 ; N r ; B 47 0 580 454 ;
+C 115 ; WX 600 ; N s ; B 68 -17 535 459 ;
+C 116 ; WX 600 ; N t ; B 47 -15 532 562 ;
+C 117 ; WX 600 ; N u ; B -1 -15 569 439 ;
+C 118 ; WX 600 ; N v ; B -1 0 601 439 ;
+C 119 ; WX 600 ; N w ; B -18 0 618 439 ;
+C 120 ; WX 600 ; N x ; B 6 0 594 439 ;
+C 121 ; WX 600 ; N y ; B -4 -142 601 439 ;
+C 122 ; WX 600 ; N z ; B 81 0 520 439 ;
+C 123 ; WX 600 ; N braceleft ; B 160 -102 464 616 ;
+C 124 ; WX 600 ; N bar ; B 255 -250 345 750 ;
+C 125 ; WX 600 ; N braceright ; B 136 -102 440 616 ;
+C 126 ; WX 600 ; N asciitilde ; B 71 153 530 356 ;
+C 161 ; WX 600 ; N exclamdown ; B 202 -146 398 449 ;
+C 162 ; WX 600 ; N cent ; B 66 -49 518 614 ;
+C 163 ; WX 600 ; N sterling ; B 72 -28 558 611 ;
+C 164 ; WX 600 ; N fraction ; B 25 -60 576 661 ;
+C 165 ; WX 600 ; N yen ; B 10 0 590 562 ;
+C 166 ; WX 600 ; N florin ; B -30 -131 572 616 ;
+C 167 ; WX 600 ; N section ; B 83 -70 517 580 ;
+C 168 ; WX 600 ; N currency ; B 54 49 546 517 ;
+C 169 ; WX 600 ; N quotesingle ; B 227 277 373 562 ;
+C 170 ; WX 600 ; N quotedblleft ; B 71 277 535 562 ;
+C 171 ; WX 600 ; N guillemotleft ; B 8 70 553 446 ;
+C 172 ; WX 600 ; N guilsinglleft ; B 141 70 459 446 ;
+C 173 ; WX 600 ; N guilsinglright ; B 141 70 459 446 ;
+C 174 ; WX 600 ; N fi ; B 12 0 593 626 ;
+C 175 ; WX 600 ; N fl ; B 12 0 593 626 ;
+C 177 ; WX 600 ; N endash ; B 65 203 535 313 ;
+C 178 ; WX 600 ; N dagger ; B 106 -70 494 580 ;
+C 179 ; WX 600 ; N daggerdbl ; B 106 -70 494 580 ;
+C 180 ; WX 600 ; N periodcentered ; B 196 165 404 351 ;
+C 182 ; WX 600 ; N paragraph ; B 6 -70 576 580 ;
+C 183 ; WX 600 ; N bullet ; B 140 132 460 430 ;
+C 184 ; WX 600 ; N quotesinglbase ; B 175 -142 427 143 ;
+C 185 ; WX 600 ; N quotedblbase ; B 65 -142 529 143 ;
+C 186 ; WX 600 ; N quotedblright ; B 61 277 525 562 ;
+C 187 ; WX 600 ; N guillemotright ; B 47 70 592 446 ;
+C 188 ; WX 600 ; N ellipsis ; B 26 -15 574 116 ;
+C 189 ; WX 600 ; N perthousand ; B -113 -15 713 616 ;
+C 191 ; WX 600 ; N questiondown ; B 99 -146 502 449 ;
+C 193 ; WX 600 ; N grave ; B 132 508 395 661 ;
+C 194 ; WX 600 ; N acute ; B 205 508 468 661 ;
+C 195 ; WX 600 ; N circumflex ; B 103 483 497 657 ;
+C 196 ; WX 600 ; N tilde ; B 89 493 512 636 ;
+C 197 ; WX 600 ; N macron ; B 88 505 512 585 ;
+C 198 ; WX 600 ; N breve ; B 83 468 517 631 ;
+C 199 ; WX 600 ; N dotaccent ; B 230 498 370 638 ;
+C 200 ; WX 600 ; N dieresis ; B 128 498 472 638 ;
+C 202 ; WX 600 ; N ring ; B 198 481 402 678 ;
+C 203 ; WX 600 ; N cedilla ; B 205 -206 387 0 ;
+C 205 ; WX 600 ; N hungarumlaut ; B 68 488 588 661 ;
+C 206 ; WX 600 ; N ogonek ; B 169 -199 400 0 ;
+C 207 ; WX 600 ; N caron ; B 103 493 497 667 ;
+C 208 ; WX 600 ; N emdash ; B -10 203 610 313 ;
+C 225 ; WX 600 ; N AE ; B -29 0 602 562 ;
+C 227 ; WX 600 ; N ordfeminine ; B 147 196 453 580 ;
+C 232 ; WX 600 ; N Lslash ; B 39 0 578 562 ;
+C 233 ; WX 600 ; N Oslash ; B 22 -22 578 584 ;
+C 234 ; WX 600 ; N OE ; B -25 0 595 562 ;
+C 235 ; WX 600 ; N ordmasculine ; B 147 196 453 580 ;
+C 241 ; WX 600 ; N ae ; B -4 -15 601 454 ;
+C 245 ; WX 600 ; N dotlessi ; B 77 0 523 439 ;
+C 248 ; WX 600 ; N lslash ; B 77 0 523 626 ;
+C 249 ; WX 600 ; N oslash ; B 30 -24 570 463 ;
+C 250 ; WX 600 ; N oe ; B -18 -15 611 454 ;
+C 251 ; WX 600 ; N germandbls ; B 22 -15 596 626 ;
+C -1 ; WX 600 ; N Idieresis ; B 77 0 523 761 ;
+C -1 ; WX 600 ; N eacute ; B 40 -15 563 661 ;
+C -1 ; WX 600 ; N abreve ; B 35 -15 570 661 ;
+C -1 ; WX 600 ; N uhungarumlaut ; B -1 -15 628 661 ;
+C -1 ; WX 600 ; N ecaron ; B 40 -15 563 667 ;
+C -1 ; WX 600 ; N Ydieresis ; B 12 0 589 761 ;
+C -1 ; WX 600 ; N divide ; B 71 16 529 500 ;
+C -1 ; WX 600 ; N Yacute ; B 12 0 589 784 ;
+C -1 ; WX 600 ; N Acircumflex ; B -9 0 609 780 ;
+C -1 ; WX 600 ; N aacute ; B 35 -15 570 661 ;
+C -1 ; WX 600 ; N Ucircumflex ; B 4 -18 596 780 ;
+C -1 ; WX 600 ; N yacute ; B -4 -142 601 661 ;
+C -1 ; WX 600 ; N scommaaccent ; B 68 -250 535 459 ;
+C -1 ; WX 600 ; N ecircumflex ; B 40 -15 563 657 ;
+C -1 ; WX 600 ; N Uring ; B 4 -18 596 801 ;
+C -1 ; WX 600 ; N Udieresis ; B 4 -18 596 761 ;
+C -1 ; WX 600 ; N aogonek ; B 35 -199 586 454 ;
+C -1 ; WX 600 ; N Uacute ; B 4 -18 596 784 ;
+C -1 ; WX 600 ; N uogonek ; B -1 -199 585 439 ;
+C -1 ; WX 600 ; N Edieresis ; B 25 0 560 761 ;
+C -1 ; WX 600 ; N Dcroat ; B 30 0 594 562 ;
+C -1 ; WX 600 ; N commaaccent ; B 205 -250 397 -57 ;
+C -1 ; WX 600 ; N copyright ; B 0 -18 600 580 ;
+C -1 ; WX 600 ; N Emacron ; B 25 0 560 708 ;
+C -1 ; WX 600 ; N ccaron ; B 40 -15 545 667 ;
+C -1 ; WX 600 ; N aring ; B 35 -15 570 678 ;
+C -1 ; WX 600 ; N Ncommaaccent ; B 8 -250 610 562 ;
+C -1 ; WX 600 ; N lacute ; B 77 0 523 801 ;
+C -1 ; WX 600 ; N agrave ; B 35 -15 570 661 ;
+C -1 ; WX 600 ; N Tcommaaccent ; B 21 -250 579 562 ;
+C -1 ; WX 600 ; N Cacute ; B 22 -18 560 784 ;
+C -1 ; WX 600 ; N atilde ; B 35 -15 570 636 ;
+C -1 ; WX 600 ; N Edotaccent ; B 25 0 560 761 ;
+C -1 ; WX 600 ; N scaron ; B 68 -17 535 667 ;
+C -1 ; WX 600 ; N scedilla ; B 68 -206 535 459 ;
+C -1 ; WX 600 ; N iacute ; B 77 0 523 661 ;
+C -1 ; WX 600 ; N lozenge ; B 66 0 534 740 ;
+C -1 ; WX 600 ; N Rcaron ; B 24 0 599 790 ;
+C -1 ; WX 600 ; N Gcommaaccent ; B 22 -250 594 580 ;
+C -1 ; WX 600 ; N ucircumflex ; B -1 -15 569 657 ;
+C -1 ; WX 600 ; N acircumflex ; B 35 -15 570 657 ;
+C -1 ; WX 600 ; N Amacron ; B -9 0 609 708 ;
+C -1 ; WX 600 ; N rcaron ; B 47 0 580 667 ;
+C -1 ; WX 600 ; N ccedilla ; B 40 -206 545 459 ;
+C -1 ; WX 600 ; N Zdotaccent ; B 62 0 539 761 ;
+C -1 ; WX 600 ; N Thorn ; B 48 0 557 562 ;
+C -1 ; WX 600 ; N Omacron ; B 22 -18 578 708 ;
+C -1 ; WX 600 ; N Racute ; B 24 0 599 784 ;
+C -1 ; WX 600 ; N Sacute ; B 47 -22 553 784 ;
+C -1 ; WX 600 ; N dcaron ; B 20 -15 727 626 ;
+C -1 ; WX 600 ; N Umacron ; B 4 -18 596 708 ;
+C -1 ; WX 600 ; N uring ; B -1 -15 569 678 ;
+C -1 ; WX 600 ; N threesuperior ; B 138 222 433 616 ;
+C -1 ; WX 600 ; N Ograve ; B 22 -18 578 784 ;
+C -1 ; WX 600 ; N Agrave ; B -9 0 609 784 ;
+C -1 ; WX 600 ; N Abreve ; B -9 0 609 784 ;
+C -1 ; WX 600 ; N multiply ; B 81 39 520 478 ;
+C -1 ; WX 600 ; N uacute ; B -1 -15 569 661 ;
+C -1 ; WX 600 ; N Tcaron ; B 21 0 579 790 ;
+C -1 ; WX 600 ; N partialdiff ; B 63 -38 537 728 ;
+C -1 ; WX 600 ; N ydieresis ; B -4 -142 601 638 ;
+C -1 ; WX 600 ; N Nacute ; B 8 -12 610 784 ;
+C -1 ; WX 600 ; N icircumflex ; B 73 0 523 657 ;
+C -1 ; WX 600 ; N Ecircumflex ; B 25 0 560 780 ;
+C -1 ; WX 600 ; N adieresis ; B 35 -15 570 638 ;
+C -1 ; WX 600 ; N edieresis ; B 40 -15 563 638 ;
+C -1 ; WX 600 ; N cacute ; B 40 -15 545 661 ;
+C -1 ; WX 600 ; N nacute ; B 18 0 592 661 ;
+C -1 ; WX 600 ; N umacron ; B -1 -15 569 585 ;
+C -1 ; WX 600 ; N Ncaron ; B 8 -12 610 790 ;
+C -1 ; WX 600 ; N Iacute ; B 77 0 523 784 ;
+C -1 ; WX 600 ; N plusminus ; B 71 24 529 515 ;
+C -1 ; WX 600 ; N brokenbar ; B 255 -175 345 675 ;
+C -1 ; WX 600 ; N registered ; B 0 -18 600 580 ;
+C -1 ; WX 600 ; N Gbreve ; B 22 -18 594 784 ;
+C -1 ; WX 600 ; N Idotaccent ; B 77 0 523 761 ;
+C -1 ; WX 600 ; N summation ; B 15 -10 586 706 ;
+C -1 ; WX 600 ; N Egrave ; B 25 0 560 784 ;
+C -1 ; WX 600 ; N racute ; B 47 0 580 661 ;
+C -1 ; WX 600 ; N omacron ; B 30 -15 570 585 ;
+C -1 ; WX 600 ; N Zacute ; B 62 0 539 784 ;
+C -1 ; WX 600 ; N Zcaron ; B 62 0 539 790 ;
+C -1 ; WX 600 ; N greaterequal ; B 26 0 523 696 ;
+C -1 ; WX 600 ; N Eth ; B 30 0 594 562 ;
+C -1 ; WX 600 ; N Ccedilla ; B 22 -206 560 580 ;
+C -1 ; WX 600 ; N lcommaaccent ; B 77 -250 523 626 ;
+C -1 ; WX 600 ; N tcaron ; B 47 -15 532 703 ;
+C -1 ; WX 600 ; N eogonek ; B 40 -199 563 454 ;
+C -1 ; WX 600 ; N Uogonek ; B 4 -199 596 562 ;
+C -1 ; WX 600 ; N Aacute ; B -9 0 609 784 ;
+C -1 ; WX 600 ; N Adieresis ; B -9 0 609 761 ;
+C -1 ; WX 600 ; N egrave ; B 40 -15 563 661 ;
+C -1 ; WX 600 ; N zacute ; B 81 0 520 661 ;
+C -1 ; WX 600 ; N iogonek ; B 77 -199 523 658 ;
+C -1 ; WX 600 ; N Oacute ; B 22 -18 578 784 ;
+C -1 ; WX 600 ; N oacute ; B 30 -15 570 661 ;
+C -1 ; WX 600 ; N amacron ; B 35 -15 570 585 ;
+C -1 ; WX 600 ; N sacute ; B 68 -17 535 661 ;
+C -1 ; WX 600 ; N idieresis ; B 77 0 523 618 ;
+C -1 ; WX 600 ; N Ocircumflex ; B 22 -18 578 780 ;
+C -1 ; WX 600 ; N Ugrave ; B 4 -18 596 784 ;
+C -1 ; WX 600 ; N Delta ; B 6 0 594 688 ;
+C -1 ; WX 600 ; N thorn ; B -14 -142 570 626 ;
+C -1 ; WX 600 ; N twosuperior ; B 143 230 436 616 ;
+C -1 ; WX 600 ; N Odieresis ; B 22 -18 578 761 ;
+C -1 ; WX 600 ; N mu ; B -1 -142 569 439 ;
+C -1 ; WX 600 ; N igrave ; B 77 0 523 661 ;
+C -1 ; WX 600 ; N ohungarumlaut ; B 30 -15 668 661 ;
+C -1 ; WX 600 ; N Eogonek ; B 25 -199 576 562 ;
+C -1 ; WX 600 ; N dcroat ; B 20 -15 591 626 ;
+C -1 ; WX 600 ; N threequarters ; B -47 -60 648 661 ;
+C -1 ; WX 600 ; N Scedilla ; B 47 -206 553 582 ;
+C -1 ; WX 600 ; N lcaron ; B 77 0 597 626 ;
+C -1 ; WX 600 ; N Kcommaaccent ; B 21 -250 599 562 ;
+C -1 ; WX 600 ; N Lacute ; B 39 0 578 784 ;
+C -1 ; WX 600 ; N trademark ; B -9 230 749 562 ;
+C -1 ; WX 600 ; N edotaccent ; B 40 -15 563 638 ;
+C -1 ; WX 600 ; N Igrave ; B 77 0 523 784 ;
+C -1 ; WX 600 ; N Imacron ; B 77 0 523 708 ;
+C -1 ; WX 600 ; N Lcaron ; B 39 0 637 562 ;
+C -1 ; WX 600 ; N onehalf ; B -47 -60 648 661 ;
+C -1 ; WX 600 ; N lessequal ; B 26 0 523 696 ;
+C -1 ; WX 600 ; N ocircumflex ; B 30 -15 570 657 ;
+C -1 ; WX 600 ; N ntilde ; B 18 0 592 636 ;
+C -1 ; WX 600 ; N Uhungarumlaut ; B 4 -18 638 784 ;
+C -1 ; WX 600 ; N Eacute ; B 25 0 560 784 ;
+C -1 ; WX 600 ; N emacron ; B 40 -15 563 585 ;
+C -1 ; WX 600 ; N gbreve ; B 30 -146 580 661 ;
+C -1 ; WX 600 ; N onequarter ; B -56 -60 656 661 ;
+C -1 ; WX 600 ; N Scaron ; B 47 -22 553 790 ;
+C -1 ; WX 600 ; N Scommaaccent ; B 47 -250 553 582 ;
+C -1 ; WX 600 ; N Ohungarumlaut ; B 22 -18 628 784 ;
+C -1 ; WX 600 ; N degree ; B 86 243 474 616 ;
+C -1 ; WX 600 ; N ograve ; B 30 -15 570 661 ;
+C -1 ; WX 600 ; N Ccaron ; B 22 -18 560 790 ;
+C -1 ; WX 600 ; N ugrave ; B -1 -15 569 661 ;
+C -1 ; WX 600 ; N radical ; B -19 -104 473 778 ;
+C -1 ; WX 600 ; N Dcaron ; B 30 0 594 790 ;
+C -1 ; WX 600 ; N rcommaaccent ; B 47 -250 580 454 ;
+C -1 ; WX 600 ; N Ntilde ; B 8 -12 610 759 ;
+C -1 ; WX 600 ; N otilde ; B 30 -15 570 636 ;
+C -1 ; WX 600 ; N Rcommaaccent ; B 24 -250 599 562 ;
+C -1 ; WX 600 ; N Lcommaaccent ; B 39 -250 578 562 ;
+C -1 ; WX 600 ; N Atilde ; B -9 0 609 759 ;
+C -1 ; WX 600 ; N Aogonek ; B -9 -199 625 562 ;
+C -1 ; WX 600 ; N Aring ; B -9 0 609 801 ;
+C -1 ; WX 600 ; N Otilde ; B 22 -18 578 759 ;
+C -1 ; WX 600 ; N zdotaccent ; B 81 0 520 638 ;
+C -1 ; WX 600 ; N Ecaron ; B 25 0 560 790 ;
+C -1 ; WX 600 ; N Iogonek ; B 77 -199 523 562 ;
+C -1 ; WX 600 ; N kcommaaccent ; B 20 -250 585 626 ;
+C -1 ; WX 600 ; N minus ; B 71 203 529 313 ;
+C -1 ; WX 600 ; N Icircumflex ; B 77 0 523 780 ;
+C -1 ; WX 600 ; N ncaron ; B 18 0 592 667 ;
+C -1 ; WX 600 ; N tcommaaccent ; B 47 -250 532 562 ;
+C -1 ; WX 600 ; N logicalnot ; B 71 103 529 413 ;
+C -1 ; WX 600 ; N odieresis ; B 30 -15 570 638 ;
+C -1 ; WX 600 ; N udieresis ; B -1 -15 569 638 ;
+C -1 ; WX 600 ; N notequal ; B 12 -47 537 563 ;
+C -1 ; WX 600 ; N gcommaaccent ; B 30 -146 580 714 ;
+C -1 ; WX 600 ; N eth ; B 58 -27 543 626 ;
+C -1 ; WX 600 ; N zcaron ; B 81 0 520 667 ;
+C -1 ; WX 600 ; N ncommaaccent ; B 18 -250 592 454 ;
+C -1 ; WX 600 ; N onesuperior ; B 153 230 447 616 ;
+C -1 ; WX 600 ; N imacron ; B 77 0 523 585 ;
+C -1 ; WX 600 ; N Euro ; B 0 0 0 0 ;
+EndCharMetrics
+EndFontMetrics
diff --git a/src/main/resources/com/lowagie/text/pdf/fonts/Courier-BoldOblique.afm b/src/main/resources/com/lowagie/text/pdf/fonts/Courier-BoldOblique.afm
new file mode 100644
index 0000000..9f365ee
--- /dev/null
+++ b/src/main/resources/com/lowagie/text/pdf/fonts/Courier-BoldOblique.afm
@@ -0,0 +1,342 @@
+StartFontMetrics 4.1
+Comment Copyright (c) 1989, 1990, 1991, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.
+Comment Creation Date: Mon Jun 23 16:28:46 1997
+Comment UniqueID 43049
+Comment VMusage 17529 79244
+FontName Courier-BoldOblique
+FullName Courier Bold Oblique
+FamilyName Courier
+Weight Bold
+ItalicAngle -12
+IsFixedPitch true
+CharacterSet ExtendedRoman
+FontBBox -57 -250 869 801
+UnderlinePosition -100
+UnderlineThickness 50
+Version 003.000
+Notice Copyright (c) 1989, 1990, 1991, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.
+EncodingScheme AdobeStandardEncoding
+CapHeight 562
+XHeight 439
+Ascender 629
+Descender -157
+StdHW 84
+StdVW 106
+StartCharMetrics 315
+C 32 ; WX 600 ; N space ; B 0 0 0 0 ;
+C 33 ; WX 600 ; N exclam ; B 215 -15 495 572 ;
+C 34 ; WX 600 ; N quotedbl ; B 211 277 585 562 ;
+C 35 ; WX 600 ; N numbersign ; B 88 -45 641 651 ;
+C 36 ; WX 600 ; N dollar ; B 87 -126 630 666 ;
+C 37 ; WX 600 ; N percent ; B 101 -15 625 616 ;
+C 38 ; WX 600 ; N ampersand ; B 61 -15 595 543 ;
+C 39 ; WX 600 ; N quoteright ; B 229 277 543 562 ;
+C 40 ; WX 600 ; N parenleft ; B 265 -102 592 616 ;
+C 41 ; WX 600 ; N parenright ; B 117 -102 444 616 ;
+C 42 ; WX 600 ; N asterisk ; B 179 219 598 601 ;
+C 43 ; WX 600 ; N plus ; B 114 39 596 478 ;
+C 44 ; WX 600 ; N comma ; B 99 -111 430 174 ;
+C 45 ; WX 600 ; N hyphen ; B 143 203 567 313 ;
+C 46 ; WX 600 ; N period ; B 206 -15 427 171 ;
+C 47 ; WX 600 ; N slash ; B 90 -77 626 626 ;
+C 48 ; WX 600 ; N zero ; B 135 -15 593 616 ;
+C 49 ; WX 600 ; N one ; B 93 0 562 616 ;
+C 50 ; WX 600 ; N two ; B 61 0 594 616 ;
+C 51 ; WX 600 ; N three ; B 71 -15 571 616 ;
+C 52 ; WX 600 ; N four ; B 81 0 559 616 ;
+C 53 ; WX 600 ; N five ; B 77 -15 621 601 ;
+C 54 ; WX 600 ; N six ; B 135 -15 652 616 ;
+C 55 ; WX 600 ; N seven ; B 147 0 622 601 ;
+C 56 ; WX 600 ; N eight ; B 115 -15 604 616 ;
+C 57 ; WX 600 ; N nine ; B 75 -15 592 616 ;
+C 58 ; WX 600 ; N colon ; B 205 -15 480 425 ;
+C 59 ; WX 600 ; N semicolon ; B 99 -111 481 425 ;
+C 60 ; WX 600 ; N less ; B 120 15 613 501 ;
+C 61 ; WX 600 ; N equal ; B 96 118 614 398 ;
+C 62 ; WX 600 ; N greater ; B 97 15 589 501 ;
+C 63 ; WX 600 ; N question ; B 183 -14 592 580 ;
+C 64 ; WX 600 ; N at ; B 65 -15 642 616 ;
+C 65 ; WX 600 ; N A ; B -9 0 632 562 ;
+C 66 ; WX 600 ; N B ; B 30 0 630 562 ;
+C 67 ; WX 600 ; N C ; B 74 -18 675 580 ;
+C 68 ; WX 600 ; N D ; B 30 0 664 562 ;
+C 69 ; WX 600 ; N E ; B 25 0 670 562 ;
+C 70 ; WX 600 ; N F ; B 39 0 684 562 ;
+C 71 ; WX 600 ; N G ; B 74 -18 675 580 ;
+C 72 ; WX 600 ; N H ; B 20 0 700 562 ;
+C 73 ; WX 600 ; N I ; B 77 0 643 562 ;
+C 74 ; WX 600 ; N J ; B 58 -18 721 562 ;
+C 75 ; WX 600 ; N K ; B 21 0 692 562 ;
+C 76 ; WX 600 ; N L ; B 39 0 636 562 ;
+C 77 ; WX 600 ; N M ; B -2 0 722 562 ;
+C 78 ; WX 600 ; N N ; B 8 -12 730 562 ;
+C 79 ; WX 600 ; N O ; B 74 -18 645 580 ;
+C 80 ; WX 600 ; N P ; B 48 0 643 562 ;
+C 81 ; WX 600 ; N Q ; B 83 -138 636 580 ;
+C 82 ; WX 600 ; N R ; B 24 0 617 562 ;
+C 83 ; WX 600 ; N S ; B 54 -22 673 582 ;
+C 84 ; WX 600 ; N T ; B 86 0 679 562 ;
+C 85 ; WX 600 ; N U ; B 101 -18 716 562 ;
+C 86 ; WX 600 ; N V ; B 84 0 733 562 ;
+C 87 ; WX 600 ; N W ; B 79 0 738 562 ;
+C 88 ; WX 600 ; N X ; B 12 0 690 562 ;
+C 89 ; WX 600 ; N Y ; B 109 0 709 562 ;
+C 90 ; WX 600 ; N Z ; B 62 0 637 562 ;
+C 91 ; WX 600 ; N bracketleft ; B 223 -102 606 616 ;
+C 92 ; WX 600 ; N backslash ; B 222 -77 496 626 ;
+C 93 ; WX 600 ; N bracketright ; B 103 -102 486 616 ;
+C 94 ; WX 600 ; N asciicircum ; B 171 250 556 616 ;
+C 95 ; WX 600 ; N underscore ; B -27 -125 585 -75 ;
+C 96 ; WX 600 ; N quoteleft ; B 297 277 487 562 ;
+C 97 ; WX 600 ; N a ; B 61 -15 593 454 ;
+C 98 ; WX 600 ; N b ; B 13 -15 636 626 ;
+C 99 ; WX 600 ; N c ; B 81 -15 631 459 ;
+C 100 ; WX 600 ; N d ; B 60 -15 645 626 ;
+C 101 ; WX 600 ; N e ; B 81 -15 605 454 ;
+C 102 ; WX 600 ; N f ; B 83 0 677 626 ; L i fi ; L l fl ;
+C 103 ; WX 600 ; N g ; B 40 -146 674 454 ;
+C 104 ; WX 600 ; N h ; B 18 0 615 626 ;
+C 105 ; WX 600 ; N i ; B 77 0 546 658 ;
+C 106 ; WX 600 ; N j ; B 36 -146 580 658 ;
+C 107 ; WX 600 ; N k ; B 33 0 643 626 ;
+C 108 ; WX 600 ; N l ; B 77 0 546 626 ;
+C 109 ; WX 600 ; N m ; B -22 0 649 454 ;
+C 110 ; WX 600 ; N n ; B 18 0 615 454 ;
+C 111 ; WX 600 ; N o ; B 71 -15 622 454 ;
+C 112 ; WX 600 ; N p ; B -32 -142 622 454 ;
+C 113 ; WX 600 ; N q ; B 60 -142 685 454 ;
+C 114 ; WX 600 ; N r ; B 47 0 655 454 ;
+C 115 ; WX 600 ; N s ; B 66 -17 608 459 ;
+C 116 ; WX 600 ; N t ; B 118 -15 567 562 ;
+C 117 ; WX 600 ; N u ; B 70 -15 592 439 ;
+C 118 ; WX 600 ; N v ; B 70 0 695 439 ;
+C 119 ; WX 600 ; N w ; B 53 0 712 439 ;
+C 120 ; WX 600 ; N x ; B 6 0 671 439 ;
+C 121 ; WX 600 ; N y ; B -21 -142 695 439 ;
+C 122 ; WX 600 ; N z ; B 81 0 614 439 ;
+C 123 ; WX 600 ; N braceleft ; B 203 -102 595 616 ;
+C 124 ; WX 600 ; N bar ; B 201 -250 505 750 ;
+C 125 ; WX 600 ; N braceright ; B 114 -102 506 616 ;
+C 126 ; WX 600 ; N asciitilde ; B 120 153 590 356 ;
+C 161 ; WX 600 ; N exclamdown ; B 196 -146 477 449 ;
+C 162 ; WX 600 ; N cent ; B 121 -49 605 614 ;
+C 163 ; WX 600 ; N sterling ; B 106 -28 650 611 ;
+C 164 ; WX 600 ; N fraction ; B 22 -60 708 661 ;
+C 165 ; WX 600 ; N yen ; B 98 0 710 562 ;
+C 166 ; WX 600 ; N florin ; B -57 -131 702 616 ;
+C 167 ; WX 600 ; N section ; B 74 -70 620 580 ;
+C 168 ; WX 600 ; N currency ; B 77 49 644 517 ;
+C 169 ; WX 600 ; N quotesingle ; B 303 277 493 562 ;
+C 170 ; WX 600 ; N quotedblleft ; B 190 277 594 562 ;
+C 171 ; WX 600 ; N guillemotleft ; B 62 70 639 446 ;
+C 172 ; WX 600 ; N guilsinglleft ; B 195 70 545 446 ;
+C 173 ; WX 600 ; N guilsinglright ; B 165 70 514 446 ;
+C 174 ; WX 600 ; N fi ; B 12 0 644 626 ;
+C 175 ; WX 600 ; N fl ; B 12 0 644 626 ;
+C 177 ; WX 600 ; N endash ; B 108 203 602 313 ;
+C 178 ; WX 600 ; N dagger ; B 175 -70 586 580 ;
+C 179 ; WX 600 ; N daggerdbl ; B 121 -70 587 580 ;
+C 180 ; WX 600 ; N periodcentered ; B 248 165 461 351 ;
+C 182 ; WX 600 ; N paragraph ; B 61 -70 700 580 ;
+C 183 ; WX 600 ; N bullet ; B 196 132 523 430 ;
+C 184 ; WX 600 ; N quotesinglbase ; B 144 -142 458 143 ;
+C 185 ; WX 600 ; N quotedblbase ; B 34 -142 560 143 ;
+C 186 ; WX 600 ; N quotedblright ; B 119 277 645 562 ;
+C 187 ; WX 600 ; N guillemotright ; B 71 70 647 446 ;
+C 188 ; WX 600 ; N ellipsis ; B 35 -15 587 116 ;
+C 189 ; WX 600 ; N perthousand ; B -45 -15 743 616 ;
+C 191 ; WX 600 ; N questiondown ; B 100 -146 509 449 ;
+C 193 ; WX 600 ; N grave ; B 272 508 503 661 ;
+C 194 ; WX 600 ; N acute ; B 312 508 609 661 ;
+C 195 ; WX 600 ; N circumflex ; B 212 483 607 657 ;
+C 196 ; WX 600 ; N tilde ; B 199 493 643 636 ;
+C 197 ; WX 600 ; N macron ; B 195 505 637 585 ;
+C 198 ; WX 600 ; N breve ; B 217 468 652 631 ;
+C 199 ; WX 600 ; N dotaccent ; B 348 498 493 638 ;
+C 200 ; WX 600 ; N dieresis ; B 246 498 595 638 ;
+C 202 ; WX 600 ; N ring ; B 319 481 528 678 ;
+C 203 ; WX 600 ; N cedilla ; B 168 -206 368 0 ;
+C 205 ; WX 600 ; N hungarumlaut ; B 171 488 729 661 ;
+C 206 ; WX 600 ; N ogonek ; B 143 -199 367 0 ;
+C 207 ; WX 600 ; N caron ; B 238 493 633 667 ;
+C 208 ; WX 600 ; N emdash ; B 33 203 677 313 ;
+C 225 ; WX 600 ; N AE ; B -29 0 708 562 ;
+C 227 ; WX 600 ; N ordfeminine ; B 188 196 526 580 ;
+C 232 ; WX 600 ; N Lslash ; B 39 0 636 562 ;
+C 233 ; WX 600 ; N Oslash ; B 48 -22 673 584 ;
+C 234 ; WX 600 ; N OE ; B 26 0 701 562 ;
+C 235 ; WX 600 ; N ordmasculine ; B 188 196 543 580 ;
+C 241 ; WX 600 ; N ae ; B 21 -15 652 454 ;
+C 245 ; WX 600 ; N dotlessi ; B 77 0 546 439 ;
+C 248 ; WX 600 ; N lslash ; B 77 0 587 626 ;
+C 249 ; WX 600 ; N oslash ; B 54 -24 638 463 ;
+C 250 ; WX 600 ; N oe ; B 18 -15 662 454 ;
+C 251 ; WX 600 ; N germandbls ; B 22 -15 629 626 ;
+C -1 ; WX 600 ; N Idieresis ; B 77 0 643 761 ;
+C -1 ; WX 600 ; N eacute ; B 81 -15 609 661 ;
+C -1 ; WX 600 ; N abreve ; B 61 -15 658 661 ;
+C -1 ; WX 600 ; N uhungarumlaut ; B 70 -15 769 661 ;
+C -1 ; WX 600 ; N ecaron ; B 81 -15 633 667 ;
+C -1 ; WX 600 ; N Ydieresis ; B 109 0 709 761 ;
+C -1 ; WX 600 ; N divide ; B 114 16 596 500 ;
+C -1 ; WX 600 ; N Yacute ; B 109 0 709 784 ;
+C -1 ; WX 600 ; N Acircumflex ; B -9 0 632 780 ;
+C -1 ; WX 600 ; N aacute ; B 61 -15 609 661 ;
+C -1 ; WX 600 ; N Ucircumflex ; B 101 -18 716 780 ;
+C -1 ; WX 600 ; N yacute ; B -21 -142 695 661 ;
+C -1 ; WX 600 ; N scommaaccent ; B 66 -250 608 459 ;
+C -1 ; WX 600 ; N ecircumflex ; B 81 -15 607 657 ;
+C -1 ; WX 600 ; N Uring ; B 101 -18 716 801 ;
+C -1 ; WX 600 ; N Udieresis ; B 101 -18 716 761 ;
+C -1 ; WX 600 ; N aogonek ; B 61 -199 593 454 ;
+C -1 ; WX 600 ; N Uacute ; B 101 -18 716 784 ;
+C -1 ; WX 600 ; N uogonek ; B 70 -199 592 439 ;
+C -1 ; WX 600 ; N Edieresis ; B 25 0 670 761 ;
+C -1 ; WX 600 ; N Dcroat ; B 30 0 664 562 ;
+C -1 ; WX 600 ; N commaaccent ; B 151 -250 385 -57 ;
+C -1 ; WX 600 ; N copyright ; B 53 -18 667 580 ;
+C -1 ; WX 600 ; N Emacron ; B 25 0 670 708 ;
+C -1 ; WX 600 ; N ccaron ; B 81 -15 633 667 ;
+C -1 ; WX 600 ; N aring ; B 61 -15 593 678 ;
+C -1 ; WX 600 ; N Ncommaaccent ; B 8 -250 730 562 ;
+C -1 ; WX 600 ; N lacute ; B 77 0 639 801 ;
+C -1 ; WX 600 ; N agrave ; B 61 -15 593 661 ;
+C -1 ; WX 600 ; N Tcommaaccent ; B 86 -250 679 562 ;
+C -1 ; WX 600 ; N Cacute ; B 74 -18 675 784 ;
+C -1 ; WX 600 ; N atilde ; B 61 -15 643 636 ;
+C -1 ; WX 600 ; N Edotaccent ; B 25 0 670 761 ;
+C -1 ; WX 600 ; N scaron ; B 66 -17 633 667 ;
+C -1 ; WX 600 ; N scedilla ; B 66 -206 608 459 ;
+C -1 ; WX 600 ; N iacute ; B 77 0 609 661 ;
+C -1 ; WX 600 ; N lozenge ; B 145 0 614 740 ;
+C -1 ; WX 600 ; N Rcaron ; B 24 0 659 790 ;
+C -1 ; WX 600 ; N Gcommaaccent ; B 74 -250 675 580 ;
+C -1 ; WX 600 ; N ucircumflex ; B 70 -15 597 657 ;
+C -1 ; WX 600 ; N acircumflex ; B 61 -15 607 657 ;
+C -1 ; WX 600 ; N Amacron ; B -9 0 633 708 ;
+C -1 ; WX 600 ; N rcaron ; B 47 0 655 667 ;
+C -1 ; WX 600 ; N ccedilla ; B 81 -206 631 459 ;
+C -1 ; WX 600 ; N Zdotaccent ; B 62 0 637 761 ;
+C -1 ; WX 600 ; N Thorn ; B 48 0 620 562 ;
+C -1 ; WX 600 ; N Omacron ; B 74 -18 663 708 ;
+C -1 ; WX 600 ; N Racute ; B 24 0 665 784 ;
+C -1 ; WX 600 ; N Sacute ; B 54 -22 673 784 ;
+C -1 ; WX 600 ; N dcaron ; B 60 -15 861 626 ;
+C -1 ; WX 600 ; N Umacron ; B 101 -18 716 708 ;
+C -1 ; WX 600 ; N uring ; B 70 -15 592 678 ;
+C -1 ; WX 600 ; N threesuperior ; B 193 222 526 616 ;
+C -1 ; WX 600 ; N Ograve ; B 74 -18 645 784 ;
+C -1 ; WX 600 ; N Agrave ; B -9 0 632 784 ;
+C -1 ; WX 600 ; N Abreve ; B -9 0 684 784 ;
+C -1 ; WX 600 ; N multiply ; B 104 39 606 478 ;
+C -1 ; WX 600 ; N uacute ; B 70 -15 599 661 ;
+C -1 ; WX 600 ; N Tcaron ; B 86 0 679 790 ;
+C -1 ; WX 600 ; N partialdiff ; B 91 -38 627 728 ;
+C -1 ; WX 600 ; N ydieresis ; B -21 -142 695 638 ;
+C -1 ; WX 600 ; N Nacute ; B 8 -12 730 784 ;
+C -1 ; WX 600 ; N icircumflex ; B 77 0 577 657 ;
+C -1 ; WX 600 ; N Ecircumflex ; B 25 0 670 780 ;
+C -1 ; WX 600 ; N adieresis ; B 61 -15 595 638 ;
+C -1 ; WX 600 ; N edieresis ; B 81 -15 605 638 ;
+C -1 ; WX 600 ; N cacute ; B 81 -15 649 661 ;
+C -1 ; WX 600 ; N nacute ; B 18 0 639 661 ;
+C -1 ; WX 600 ; N umacron ; B 70 -15 637 585 ;
+C -1 ; WX 600 ; N Ncaron ; B 8 -12 730 790 ;
+C -1 ; WX 600 ; N Iacute ; B 77 0 643 784 ;
+C -1 ; WX 600 ; N plusminus ; B 76 24 614 515 ;
+C -1 ; WX 600 ; N brokenbar ; B 217 -175 489 675 ;
+C -1 ; WX 600 ; N registered ; B 53 -18 667 580 ;
+C -1 ; WX 600 ; N Gbreve ; B 74 -18 684 784 ;
+C -1 ; WX 600 ; N Idotaccent ; B 77 0 643 761 ;
+C -1 ; WX 600 ; N summation ; B 15 -10 672 706 ;
+C -1 ; WX 600 ; N Egrave ; B 25 0 670 784 ;
+C -1 ; WX 600 ; N racute ; B 47 0 655 661 ;
+C -1 ; WX 600 ; N omacron ; B 71 -15 637 585 ;
+C -1 ; WX 600 ; N Zacute ; B 62 0 665 784 ;
+C -1 ; WX 600 ; N Zcaron ; B 62 0 659 790 ;
+C -1 ; WX 600 ; N greaterequal ; B 26 0 627 696 ;
+C -1 ; WX 600 ; N Eth ; B 30 0 664 562 ;
+C -1 ; WX 600 ; N Ccedilla ; B 74 -206 675 580 ;
+C -1 ; WX 600 ; N lcommaaccent ; B 77 -250 546 626 ;
+C -1 ; WX 600 ; N tcaron ; B 118 -15 627 703 ;
+C -1 ; WX 600 ; N eogonek ; B 81 -199 605 454 ;
+C -1 ; WX 600 ; N Uogonek ; B 101 -199 716 562 ;
+C -1 ; WX 600 ; N Aacute ; B -9 0 655 784 ;
+C -1 ; WX 600 ; N Adieresis ; B -9 0 632 761 ;
+C -1 ; WX 600 ; N egrave ; B 81 -15 605 661 ;
+C -1 ; WX 600 ; N zacute ; B 81 0 614 661 ;
+C -1 ; WX 600 ; N iogonek ; B 77 -199 546 658 ;
+C -1 ; WX 600 ; N Oacute ; B 74 -18 645 784 ;
+C -1 ; WX 600 ; N oacute ; B 71 -15 649 661 ;
+C -1 ; WX 600 ; N amacron ; B 61 -15 637 585 ;
+C -1 ; WX 600 ; N sacute ; B 66 -17 609 661 ;
+C -1 ; WX 600 ; N idieresis ; B 77 0 561 618 ;
+C -1 ; WX 600 ; N Ocircumflex ; B 74 -18 645 780 ;
+C -1 ; WX 600 ; N Ugrave ; B 101 -18 716 784 ;
+C -1 ; WX 600 ; N Delta ; B 6 0 594 688 ;
+C -1 ; WX 600 ; N thorn ; B -32 -142 622 626 ;
+C -1 ; WX 600 ; N twosuperior ; B 191 230 542 616 ;
+C -1 ; WX 600 ; N Odieresis ; B 74 -18 645 761 ;
+C -1 ; WX 600 ; N mu ; B 49 -142 592 439 ;
+C -1 ; WX 600 ; N igrave ; B 77 0 546 661 ;
+C -1 ; WX 600 ; N ohungarumlaut ; B 71 -15 809 661 ;
+C -1 ; WX 600 ; N Eogonek ; B 25 -199 670 562 ;
+C -1 ; WX 600 ; N dcroat ; B 60 -15 712 626 ;
+C -1 ; WX 600 ; N threequarters ; B 8 -60 699 661 ;
+C -1 ; WX 600 ; N Scedilla ; B 54 -206 673 582 ;
+C -1 ; WX 600 ; N lcaron ; B 77 0 731 626 ;
+C -1 ; WX 600 ; N Kcommaaccent ; B 21 -250 692 562 ;
+C -1 ; WX 600 ; N Lacute ; B 39 0 636 784 ;
+C -1 ; WX 600 ; N trademark ; B 86 230 869 562 ;
+C -1 ; WX 600 ; N edotaccent ; B 81 -15 605 638 ;
+C -1 ; WX 600 ; N Igrave ; B 77 0 643 784 ;
+C -1 ; WX 600 ; N Imacron ; B 77 0 663 708 ;
+C -1 ; WX 600 ; N Lcaron ; B 39 0 757 562 ;
+C -1 ; WX 600 ; N onehalf ; B 22 -60 716 661 ;
+C -1 ; WX 600 ; N lessequal ; B 26 0 671 696 ;
+C -1 ; WX 600 ; N ocircumflex ; B 71 -15 622 657 ;
+C -1 ; WX 600 ; N ntilde ; B 18 0 643 636 ;
+C -1 ; WX 600 ; N Uhungarumlaut ; B 101 -18 805 784 ;
+C -1 ; WX 600 ; N Eacute ; B 25 0 670 784 ;
+C -1 ; WX 600 ; N emacron ; B 81 -15 637 585 ;
+C -1 ; WX 600 ; N gbreve ; B 40 -146 674 661 ;
+C -1 ; WX 600 ; N onequarter ; B 13 -60 707 661 ;
+C -1 ; WX 600 ; N Scaron ; B 54 -22 689 790 ;
+C -1 ; WX 600 ; N Scommaaccent ; B 54 -250 673 582 ;
+C -1 ; WX 600 ; N Ohungarumlaut ; B 74 -18 795 784 ;
+C -1 ; WX 600 ; N degree ; B 173 243 570 616 ;
+C -1 ; WX 600 ; N ograve ; B 71 -15 622 661 ;
+C -1 ; WX 600 ; N Ccaron ; B 74 -18 689 790 ;
+C -1 ; WX 600 ; N ugrave ; B 70 -15 592 661 ;
+C -1 ; WX 600 ; N radical ; B 67 -104 635 778 ;
+C -1 ; WX 600 ; N Dcaron ; B 30 0 664 790 ;
+C -1 ; WX 600 ; N rcommaaccent ; B 47 -250 655 454 ;
+C -1 ; WX 600 ; N Ntilde ; B 8 -12 730 759 ;
+C -1 ; WX 600 ; N otilde ; B 71 -15 643 636 ;
+C -1 ; WX 600 ; N Rcommaaccent ; B 24 -250 617 562 ;
+C -1 ; WX 600 ; N Lcommaaccent ; B 39 -250 636 562 ;
+C -1 ; WX 600 ; N Atilde ; B -9 0 669 759 ;
+C -1 ; WX 600 ; N Aogonek ; B -9 -199 632 562 ;
+C -1 ; WX 600 ; N Aring ; B -9 0 632 801 ;
+C -1 ; WX 600 ; N Otilde ; B 74 -18 669 759 ;
+C -1 ; WX 600 ; N zdotaccent ; B 81 0 614 638 ;
+C -1 ; WX 600 ; N Ecaron ; B 25 0 670 790 ;
+C -1 ; WX 600 ; N Iogonek ; B 77 -199 643 562 ;
+C -1 ; WX 600 ; N kcommaaccent ; B 33 -250 643 626 ;
+C -1 ; WX 600 ; N minus ; B 114 203 596 313 ;
+C -1 ; WX 600 ; N Icircumflex ; B 77 0 643 780 ;
+C -1 ; WX 600 ; N ncaron ; B 18 0 633 667 ;
+C -1 ; WX 600 ; N tcommaaccent ; B 118 -250 567 562 ;
+C -1 ; WX 600 ; N logicalnot ; B 135 103 617 413 ;
+C -1 ; WX 600 ; N odieresis ; B 71 -15 622 638 ;
+C -1 ; WX 600 ; N udieresis ; B 70 -15 595 638 ;
+C -1 ; WX 600 ; N notequal ; B 30 -47 626 563 ;
+C -1 ; WX 600 ; N gcommaaccent ; B 40 -146 674 714 ;
+C -1 ; WX 600 ; N eth ; B 93 -27 661 626 ;
+C -1 ; WX 600 ; N zcaron ; B 81 0 643 667 ;
+C -1 ; WX 600 ; N ncommaaccent ; B 18 -250 615 454 ;
+C -1 ; WX 600 ; N onesuperior ; B 212 230 514 616 ;
+C -1 ; WX 600 ; N imacron ; B 77 0 575 585 ;
+C -1 ; WX 600 ; N Euro ; B 0 0 0 0 ;
+EndCharMetrics
+EndFontMetrics
diff --git a/src/main/resources/com/lowagie/text/pdf/fonts/Courier-Oblique.afm b/src/main/resources/com/lowagie/text/pdf/fonts/Courier-Oblique.afm
new file mode 100644
index 0000000..acacb3d
--- /dev/null
+++ b/src/main/resources/com/lowagie/text/pdf/fonts/Courier-Oblique.afm
@@ -0,0 +1,342 @@
+StartFontMetrics 4.1
+Comment Copyright (c) 1989, 1990, 1991, 1992, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.
+Comment Creation Date: Thu May 1 17:37:52 1997
+Comment UniqueID 43051
+Comment VMusage 16248 75829
+FontName Courier-Oblique
+FullName Courier Oblique
+FamilyName Courier
+Weight Medium
+ItalicAngle -12
+IsFixedPitch true
+CharacterSet ExtendedRoman
+FontBBox -27 -250 849 805
+UnderlinePosition -100
+UnderlineThickness 50
+Version 003.000
+Notice Copyright (c) 1989, 1990, 1991, 1992, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.
+EncodingScheme AdobeStandardEncoding
+CapHeight 562
+XHeight 426
+Ascender 629
+Descender -157
+StdHW 51
+StdVW 51
+StartCharMetrics 315
+C 32 ; WX 600 ; N space ; B 0 0 0 0 ;
+C 33 ; WX 600 ; N exclam ; B 243 -15 464 572 ;
+C 34 ; WX 600 ; N quotedbl ; B 273 328 532 562 ;
+C 35 ; WX 600 ; N numbersign ; B 133 -32 596 639 ;
+C 36 ; WX 600 ; N dollar ; B 108 -126 596 662 ;
+C 37 ; WX 600 ; N percent ; B 134 -15 599 622 ;
+C 38 ; WX 600 ; N ampersand ; B 87 -15 580 543 ;
+C 39 ; WX 600 ; N quoteright ; B 283 328 495 562 ;
+C 40 ; WX 600 ; N parenleft ; B 313 -108 572 622 ;
+C 41 ; WX 600 ; N parenright ; B 137 -108 396 622 ;
+C 42 ; WX 600 ; N asterisk ; B 212 257 580 607 ;
+C 43 ; WX 600 ; N plus ; B 129 44 580 470 ;
+C 44 ; WX 600 ; N comma ; B 157 -112 370 122 ;
+C 45 ; WX 600 ; N hyphen ; B 152 231 558 285 ;
+C 46 ; WX 600 ; N period ; B 238 -15 382 109 ;
+C 47 ; WX 600 ; N slash ; B 112 -80 604 629 ;
+C 48 ; WX 600 ; N zero ; B 154 -15 575 622 ;
+C 49 ; WX 600 ; N one ; B 98 0 515 622 ;
+C 50 ; WX 600 ; N two ; B 70 0 568 622 ;
+C 51 ; WX 600 ; N three ; B 82 -15 538 622 ;
+C 52 ; WX 600 ; N four ; B 108 0 541 622 ;
+C 53 ; WX 600 ; N five ; B 99 -15 589 607 ;
+C 54 ; WX 600 ; N six ; B 155 -15 629 622 ;
+C 55 ; WX 600 ; N seven ; B 182 0 612 607 ;
+C 56 ; WX 600 ; N eight ; B 132 -15 588 622 ;
+C 57 ; WX 600 ; N nine ; B 93 -15 574 622 ;
+C 58 ; WX 600 ; N colon ; B 238 -15 441 385 ;
+C 59 ; WX 600 ; N semicolon ; B 157 -112 441 385 ;
+C 60 ; WX 600 ; N less ; B 96 42 610 472 ;
+C 61 ; WX 600 ; N equal ; B 109 138 600 376 ;
+C 62 ; WX 600 ; N greater ; B 85 42 599 472 ;
+C 63 ; WX 600 ; N question ; B 222 -15 583 572 ;
+C 64 ; WX 600 ; N at ; B 127 -15 582 622 ;
+C 65 ; WX 600 ; N A ; B 3 0 607 562 ;
+C 66 ; WX 600 ; N B ; B 43 0 616 562 ;
+C 67 ; WX 600 ; N C ; B 93 -18 655 580 ;
+C 68 ; WX 600 ; N D ; B 43 0 645 562 ;
+C 69 ; WX 600 ; N E ; B 53 0 660 562 ;
+C 70 ; WX 600 ; N F ; B 53 0 660 562 ;
+C 71 ; WX 600 ; N G ; B 83 -18 645 580 ;
+C 72 ; WX 600 ; N H ; B 32 0 687 562 ;
+C 73 ; WX 600 ; N I ; B 96 0 623 562 ;
+C 74 ; WX 600 ; N J ; B 52 -18 685 562 ;
+C 75 ; WX 600 ; N K ; B 38 0 671 562 ;
+C 76 ; WX 600 ; N L ; B 47 0 607 562 ;
+C 77 ; WX 600 ; N M ; B 4 0 715 562 ;
+C 78 ; WX 600 ; N N ; B 7 -13 712 562 ;
+C 79 ; WX 600 ; N O ; B 94 -18 625 580 ;
+C 80 ; WX 600 ; N P ; B 79 0 644 562 ;
+C 81 ; WX 600 ; N Q ; B 95 -138 625 580 ;
+C 82 ; WX 600 ; N R ; B 38 0 598 562 ;
+C 83 ; WX 600 ; N S ; B 76 -20 650 580 ;
+C 84 ; WX 600 ; N T ; B 108 0 665 562 ;
+C 85 ; WX 600 ; N U ; B 125 -18 702 562 ;
+C 86 ; WX 600 ; N V ; B 105 -13 723 562 ;
+C 87 ; WX 600 ; N W ; B 106 -13 722 562 ;
+C 88 ; WX 600 ; N X ; B 23 0 675 562 ;
+C 89 ; WX 600 ; N Y ; B 133 0 695 562 ;
+C 90 ; WX 600 ; N Z ; B 86 0 610 562 ;
+C 91 ; WX 600 ; N bracketleft ; B 246 -108 574 622 ;
+C 92 ; WX 600 ; N backslash ; B 249 -80 468 629 ;
+C 93 ; WX 600 ; N bracketright ; B 135 -108 463 622 ;
+C 94 ; WX 600 ; N asciicircum ; B 175 354 587 622 ;
+C 95 ; WX 600 ; N underscore ; B -27 -125 584 -75 ;
+C 96 ; WX 600 ; N quoteleft ; B 343 328 457 562 ;
+C 97 ; WX 600 ; N a ; B 76 -15 569 441 ;
+C 98 ; WX 600 ; N b ; B 29 -15 625 629 ;
+C 99 ; WX 600 ; N c ; B 106 -15 608 441 ;
+C 100 ; WX 600 ; N d ; B 85 -15 640 629 ;
+C 101 ; WX 600 ; N e ; B 106 -15 598 441 ;
+C 102 ; WX 600 ; N f ; B 114 0 662 629 ; L i fi ; L l fl ;
+C 103 ; WX 600 ; N g ; B 61 -157 657 441 ;
+C 104 ; WX 600 ; N h ; B 33 0 592 629 ;
+C 105 ; WX 600 ; N i ; B 95 0 515 657 ;
+C 106 ; WX 600 ; N j ; B 52 -157 550 657 ;
+C 107 ; WX 600 ; N k ; B 58 0 633 629 ;
+C 108 ; WX 600 ; N l ; B 95 0 515 629 ;
+C 109 ; WX 600 ; N m ; B -5 0 615 441 ;
+C 110 ; WX 600 ; N n ; B 26 0 585 441 ;
+C 111 ; WX 600 ; N o ; B 102 -15 588 441 ;
+C 112 ; WX 600 ; N p ; B -24 -157 605 441 ;
+C 113 ; WX 600 ; N q ; B 85 -157 682 441 ;
+C 114 ; WX 600 ; N r ; B 60 0 636 441 ;
+C 115 ; WX 600 ; N s ; B 78 -15 584 441 ;
+C 116 ; WX 600 ; N t ; B 167 -15 561 561 ;
+C 117 ; WX 600 ; N u ; B 101 -15 572 426 ;
+C 118 ; WX 600 ; N v ; B 90 -10 681 426 ;
+C 119 ; WX 600 ; N w ; B 76 -10 695 426 ;
+C 120 ; WX 600 ; N x ; B 20 0 655 426 ;
+C 121 ; WX 600 ; N y ; B -4 -157 683 426 ;
+C 122 ; WX 600 ; N z ; B 99 0 593 426 ;
+C 123 ; WX 600 ; N braceleft ; B 233 -108 569 622 ;
+C 124 ; WX 600 ; N bar ; B 222 -250 485 750 ;
+C 125 ; WX 600 ; N braceright ; B 140 -108 477 622 ;
+C 126 ; WX 600 ; N asciitilde ; B 116 197 600 320 ;
+C 161 ; WX 600 ; N exclamdown ; B 225 -157 445 430 ;
+C 162 ; WX 600 ; N cent ; B 151 -49 588 614 ;
+C 163 ; WX 600 ; N sterling ; B 124 -21 621 611 ;
+C 164 ; WX 600 ; N fraction ; B 84 -57 646 665 ;
+C 165 ; WX 600 ; N yen ; B 120 0 693 562 ;
+C 166 ; WX 600 ; N florin ; B -26 -143 671 622 ;
+C 167 ; WX 600 ; N section ; B 104 -78 590 580 ;
+C 168 ; WX 600 ; N currency ; B 94 58 628 506 ;
+C 169 ; WX 600 ; N quotesingle ; B 345 328 460 562 ;
+C 170 ; WX 600 ; N quotedblleft ; B 262 328 541 562 ;
+C 171 ; WX 600 ; N guillemotleft ; B 92 70 652 446 ;
+C 172 ; WX 600 ; N guilsinglleft ; B 204 70 540 446 ;
+C 173 ; WX 600 ; N guilsinglright ; B 170 70 506 446 ;
+C 174 ; WX 600 ; N fi ; B 3 0 619 629 ;
+C 175 ; WX 600 ; N fl ; B 3 0 619 629 ;
+C 177 ; WX 600 ; N endash ; B 124 231 586 285 ;
+C 178 ; WX 600 ; N dagger ; B 217 -78 546 580 ;
+C 179 ; WX 600 ; N daggerdbl ; B 163 -78 546 580 ;
+C 180 ; WX 600 ; N periodcentered ; B 275 189 434 327 ;
+C 182 ; WX 600 ; N paragraph ; B 100 -78 630 562 ;
+C 183 ; WX 600 ; N bullet ; B 224 130 485 383 ;
+C 184 ; WX 600 ; N quotesinglbase ; B 185 -134 397 100 ;
+C 185 ; WX 600 ; N quotedblbase ; B 115 -134 478 100 ;
+C 186 ; WX 600 ; N quotedblright ; B 213 328 576 562 ;
+C 187 ; WX 600 ; N guillemotright ; B 58 70 618 446 ;
+C 188 ; WX 600 ; N ellipsis ; B 46 -15 575 111 ;
+C 189 ; WX 600 ; N perthousand ; B 59 -15 627 622 ;
+C 191 ; WX 600 ; N questiondown ; B 105 -157 466 430 ;
+C 193 ; WX 600 ; N grave ; B 294 497 484 672 ;
+C 194 ; WX 600 ; N acute ; B 348 497 612 672 ;
+C 195 ; WX 600 ; N circumflex ; B 229 477 581 654 ;
+C 196 ; WX 600 ; N tilde ; B 212 489 629 606 ;
+C 197 ; WX 600 ; N macron ; B 232 525 600 565 ;
+C 198 ; WX 600 ; N breve ; B 279 501 576 609 ;
+C 199 ; WX 600 ; N dotaccent ; B 373 537 478 640 ;
+C 200 ; WX 600 ; N dieresis ; B 272 537 579 640 ;
+C 202 ; WX 600 ; N ring ; B 332 463 500 627 ;
+C 203 ; WX 600 ; N cedilla ; B 197 -151 344 10 ;
+C 205 ; WX 600 ; N hungarumlaut ; B 239 497 683 672 ;
+C 206 ; WX 600 ; N ogonek ; B 189 -172 377 4 ;
+C 207 ; WX 600 ; N caron ; B 262 492 614 669 ;
+C 208 ; WX 600 ; N emdash ; B 49 231 661 285 ;
+C 225 ; WX 600 ; N AE ; B 3 0 655 562 ;
+C 227 ; WX 600 ; N ordfeminine ; B 209 249 512 580 ;
+C 232 ; WX 600 ; N Lslash ; B 47 0 607 562 ;
+C 233 ; WX 600 ; N Oslash ; B 94 -80 625 629 ;
+C 234 ; WX 600 ; N OE ; B 59 0 672 562 ;
+C 235 ; WX 600 ; N ordmasculine ; B 210 249 535 580 ;
+C 241 ; WX 600 ; N ae ; B 41 -15 626 441 ;
+C 245 ; WX 600 ; N dotlessi ; B 95 0 515 426 ;
+C 248 ; WX 600 ; N lslash ; B 95 0 587 629 ;
+C 249 ; WX 600 ; N oslash ; B 102 -80 588 506 ;
+C 250 ; WX 600 ; N oe ; B 54 -15 615 441 ;
+C 251 ; WX 600 ; N germandbls ; B 48 -15 617 629 ;
+C -1 ; WX 600 ; N Idieresis ; B 96 0 623 753 ;
+C -1 ; WX 600 ; N eacute ; B 106 -15 612 672 ;
+C -1 ; WX 600 ; N abreve ; B 76 -15 576 609 ;
+C -1 ; WX 600 ; N uhungarumlaut ; B 101 -15 723 672 ;
+C -1 ; WX 600 ; N ecaron ; B 106 -15 614 669 ;
+C -1 ; WX 600 ; N Ydieresis ; B 133 0 695 753 ;
+C -1 ; WX 600 ; N divide ; B 136 48 573 467 ;
+C -1 ; WX 600 ; N Yacute ; B 133 0 695 805 ;
+C -1 ; WX 600 ; N Acircumflex ; B 3 0 607 787 ;
+C -1 ; WX 600 ; N aacute ; B 76 -15 612 672 ;
+C -1 ; WX 600 ; N Ucircumflex ; B 125 -18 702 787 ;
+C -1 ; WX 600 ; N yacute ; B -4 -157 683 672 ;
+C -1 ; WX 600 ; N scommaaccent ; B 78 -250 584 441 ;
+C -1 ; WX 600 ; N ecircumflex ; B 106 -15 598 654 ;
+C -1 ; WX 600 ; N Uring ; B 125 -18 702 760 ;
+C -1 ; WX 600 ; N Udieresis ; B 125 -18 702 753 ;
+C -1 ; WX 600 ; N aogonek ; B 76 -172 569 441 ;
+C -1 ; WX 600 ; N Uacute ; B 125 -18 702 805 ;
+C -1 ; WX 600 ; N uogonek ; B 101 -172 572 426 ;
+C -1 ; WX 600 ; N Edieresis ; B 53 0 660 753 ;
+C -1 ; WX 600 ; N Dcroat ; B 43 0 645 562 ;
+C -1 ; WX 600 ; N commaaccent ; B 145 -250 323 -58 ;
+C -1 ; WX 600 ; N copyright ; B 53 -18 667 580 ;
+C -1 ; WX 600 ; N Emacron ; B 53 0 660 698 ;
+C -1 ; WX 600 ; N ccaron ; B 106 -15 614 669 ;
+C -1 ; WX 600 ; N aring ; B 76 -15 569 627 ;
+C -1 ; WX 600 ; N Ncommaaccent ; B 7 -250 712 562 ;
+C -1 ; WX 600 ; N lacute ; B 95 0 640 805 ;
+C -1 ; WX 600 ; N agrave ; B 76 -15 569 672 ;
+C -1 ; WX 600 ; N Tcommaaccent ; B 108 -250 665 562 ;
+C -1 ; WX 600 ; N Cacute ; B 93 -18 655 805 ;
+C -1 ; WX 600 ; N atilde ; B 76 -15 629 606 ;
+C -1 ; WX 600 ; N Edotaccent ; B 53 0 660 753 ;
+C -1 ; WX 600 ; N scaron ; B 78 -15 614 669 ;
+C -1 ; WX 600 ; N scedilla ; B 78 -151 584 441 ;
+C -1 ; WX 600 ; N iacute ; B 95 0 612 672 ;
+C -1 ; WX 600 ; N lozenge ; B 94 0 519 706 ;
+C -1 ; WX 600 ; N Rcaron ; B 38 0 642 802 ;
+C -1 ; WX 600 ; N Gcommaaccent ; B 83 -250 645 580 ;
+C -1 ; WX 600 ; N ucircumflex ; B 101 -15 572 654 ;
+C -1 ; WX 600 ; N acircumflex ; B 76 -15 581 654 ;
+C -1 ; WX 600 ; N Amacron ; B 3 0 607 698 ;
+C -1 ; WX 600 ; N rcaron ; B 60 0 636 669 ;
+C -1 ; WX 600 ; N ccedilla ; B 106 -151 614 441 ;
+C -1 ; WX 600 ; N Zdotaccent ; B 86 0 610 753 ;
+C -1 ; WX 600 ; N Thorn ; B 79 0 606 562 ;
+C -1 ; WX 600 ; N Omacron ; B 94 -18 628 698 ;
+C -1 ; WX 600 ; N Racute ; B 38 0 670 805 ;
+C -1 ; WX 600 ; N Sacute ; B 76 -20 650 805 ;
+C -1 ; WX 600 ; N dcaron ; B 85 -15 849 629 ;
+C -1 ; WX 600 ; N Umacron ; B 125 -18 702 698 ;
+C -1 ; WX 600 ; N uring ; B 101 -15 572 627 ;
+C -1 ; WX 600 ; N threesuperior ; B 213 240 501 622 ;
+C -1 ; WX 600 ; N Ograve ; B 94 -18 625 805 ;
+C -1 ; WX 600 ; N Agrave ; B 3 0 607 805 ;
+C -1 ; WX 600 ; N Abreve ; B 3 0 607 732 ;
+C -1 ; WX 600 ; N multiply ; B 103 43 607 470 ;
+C -1 ; WX 600 ; N uacute ; B 101 -15 602 672 ;
+C -1 ; WX 600 ; N Tcaron ; B 108 0 665 802 ;
+C -1 ; WX 600 ; N partialdiff ; B 45 -38 546 710 ;
+C -1 ; WX 600 ; N ydieresis ; B -4 -157 683 620 ;
+C -1 ; WX 600 ; N Nacute ; B 7 -13 712 805 ;
+C -1 ; WX 600 ; N icircumflex ; B 95 0 551 654 ;
+C -1 ; WX 600 ; N Ecircumflex ; B 53 0 660 787 ;
+C -1 ; WX 600 ; N adieresis ; B 76 -15 575 620 ;
+C -1 ; WX 600 ; N edieresis ; B 106 -15 598 620 ;
+C -1 ; WX 600 ; N cacute ; B 106 -15 612 672 ;
+C -1 ; WX 600 ; N nacute ; B 26 0 602 672 ;
+C -1 ; WX 600 ; N umacron ; B 101 -15 600 565 ;
+C -1 ; WX 600 ; N Ncaron ; B 7 -13 712 802 ;
+C -1 ; WX 600 ; N Iacute ; B 96 0 640 805 ;
+C -1 ; WX 600 ; N plusminus ; B 96 44 594 558 ;
+C -1 ; WX 600 ; N brokenbar ; B 238 -175 469 675 ;
+C -1 ; WX 600 ; N registered ; B 53 -18 667 580 ;
+C -1 ; WX 600 ; N Gbreve ; B 83 -18 645 732 ;
+C -1 ; WX 600 ; N Idotaccent ; B 96 0 623 753 ;
+C -1 ; WX 600 ; N summation ; B 15 -10 670 706 ;
+C -1 ; WX 600 ; N Egrave ; B 53 0 660 805 ;
+C -1 ; WX 600 ; N racute ; B 60 0 636 672 ;
+C -1 ; WX 600 ; N omacron ; B 102 -15 600 565 ;
+C -1 ; WX 600 ; N Zacute ; B 86 0 670 805 ;
+C -1 ; WX 600 ; N Zcaron ; B 86 0 642 802 ;
+C -1 ; WX 600 ; N greaterequal ; B 98 0 594 710 ;
+C -1 ; WX 600 ; N Eth ; B 43 0 645 562 ;
+C -1 ; WX 600 ; N Ccedilla ; B 93 -151 658 580 ;
+C -1 ; WX 600 ; N lcommaaccent ; B 95 -250 515 629 ;
+C -1 ; WX 600 ; N tcaron ; B 167 -15 587 717 ;
+C -1 ; WX 600 ; N eogonek ; B 106 -172 598 441 ;
+C -1 ; WX 600 ; N Uogonek ; B 124 -172 702 562 ;
+C -1 ; WX 600 ; N Aacute ; B 3 0 660 805 ;
+C -1 ; WX 600 ; N Adieresis ; B 3 0 607 753 ;
+C -1 ; WX 600 ; N egrave ; B 106 -15 598 672 ;
+C -1 ; WX 600 ; N zacute ; B 99 0 612 672 ;
+C -1 ; WX 600 ; N iogonek ; B 95 -172 515 657 ;
+C -1 ; WX 600 ; N Oacute ; B 94 -18 640 805 ;
+C -1 ; WX 600 ; N oacute ; B 102 -15 612 672 ;
+C -1 ; WX 600 ; N amacron ; B 76 -15 600 565 ;
+C -1 ; WX 600 ; N sacute ; B 78 -15 612 672 ;
+C -1 ; WX 600 ; N idieresis ; B 95 0 545 620 ;
+C -1 ; WX 600 ; N Ocircumflex ; B 94 -18 625 787 ;
+C -1 ; WX 600 ; N Ugrave ; B 125 -18 702 805 ;
+C -1 ; WX 600 ; N Delta ; B 6 0 598 688 ;
+C -1 ; WX 600 ; N thorn ; B -24 -157 605 629 ;
+C -1 ; WX 600 ; N twosuperior ; B 230 249 535 622 ;
+C -1 ; WX 600 ; N Odieresis ; B 94 -18 625 753 ;
+C -1 ; WX 600 ; N mu ; B 72 -157 572 426 ;
+C -1 ; WX 600 ; N igrave ; B 95 0 515 672 ;
+C -1 ; WX 600 ; N ohungarumlaut ; B 102 -15 723 672 ;
+C -1 ; WX 600 ; N Eogonek ; B 53 -172 660 562 ;
+C -1 ; WX 600 ; N dcroat ; B 85 -15 704 629 ;
+C -1 ; WX 600 ; N threequarters ; B 73 -56 659 666 ;
+C -1 ; WX 600 ; N Scedilla ; B 76 -151 650 580 ;
+C -1 ; WX 600 ; N lcaron ; B 95 0 667 629 ;
+C -1 ; WX 600 ; N Kcommaaccent ; B 38 -250 671 562 ;
+C -1 ; WX 600 ; N Lacute ; B 47 0 607 805 ;
+C -1 ; WX 600 ; N trademark ; B 75 263 742 562 ;
+C -1 ; WX 600 ; N edotaccent ; B 106 -15 598 620 ;
+C -1 ; WX 600 ; N Igrave ; B 96 0 623 805 ;
+C -1 ; WX 600 ; N Imacron ; B 96 0 628 698 ;
+C -1 ; WX 600 ; N Lcaron ; B 47 0 632 562 ;
+C -1 ; WX 600 ; N onehalf ; B 65 -57 669 665 ;
+C -1 ; WX 600 ; N lessequal ; B 98 0 645 710 ;
+C -1 ; WX 600 ; N ocircumflex ; B 102 -15 588 654 ;
+C -1 ; WX 600 ; N ntilde ; B 26 0 629 606 ;
+C -1 ; WX 600 ; N Uhungarumlaut ; B 125 -18 761 805 ;
+C -1 ; WX 600 ; N Eacute ; B 53 0 670 805 ;
+C -1 ; WX 600 ; N emacron ; B 106 -15 600 565 ;
+C -1 ; WX 600 ; N gbreve ; B 61 -157 657 609 ;
+C -1 ; WX 600 ; N onequarter ; B 65 -57 674 665 ;
+C -1 ; WX 600 ; N Scaron ; B 76 -20 672 802 ;
+C -1 ; WX 600 ; N Scommaaccent ; B 76 -250 650 580 ;
+C -1 ; WX 600 ; N Ohungarumlaut ; B 94 -18 751 805 ;
+C -1 ; WX 600 ; N degree ; B 214 269 576 622 ;
+C -1 ; WX 600 ; N ograve ; B 102 -15 588 672 ;
+C -1 ; WX 600 ; N Ccaron ; B 93 -18 672 802 ;
+C -1 ; WX 600 ; N ugrave ; B 101 -15 572 672 ;
+C -1 ; WX 600 ; N radical ; B 85 -15 765 792 ;
+C -1 ; WX 600 ; N Dcaron ; B 43 0 645 802 ;
+C -1 ; WX 600 ; N rcommaaccent ; B 60 -250 636 441 ;
+C -1 ; WX 600 ; N Ntilde ; B 7 -13 712 729 ;
+C -1 ; WX 600 ; N otilde ; B 102 -15 629 606 ;
+C -1 ; WX 600 ; N Rcommaaccent ; B 38 -250 598 562 ;
+C -1 ; WX 600 ; N Lcommaaccent ; B 47 -250 607 562 ;
+C -1 ; WX 600 ; N Atilde ; B 3 0 655 729 ;
+C -1 ; WX 600 ; N Aogonek ; B 3 -172 607 562 ;
+C -1 ; WX 600 ; N Aring ; B 3 0 607 750 ;
+C -1 ; WX 600 ; N Otilde ; B 94 -18 655 729 ;
+C -1 ; WX 600 ; N zdotaccent ; B 99 0 593 620 ;
+C -1 ; WX 600 ; N Ecaron ; B 53 0 660 802 ;
+C -1 ; WX 600 ; N Iogonek ; B 96 -172 623 562 ;
+C -1 ; WX 600 ; N kcommaaccent ; B 58 -250 633 629 ;
+C -1 ; WX 600 ; N minus ; B 129 232 580 283 ;
+C -1 ; WX 600 ; N Icircumflex ; B 96 0 623 787 ;
+C -1 ; WX 600 ; N ncaron ; B 26 0 614 669 ;
+C -1 ; WX 600 ; N tcommaaccent ; B 165 -250 561 561 ;
+C -1 ; WX 600 ; N logicalnot ; B 155 108 591 369 ;
+C -1 ; WX 600 ; N odieresis ; B 102 -15 588 620 ;
+C -1 ; WX 600 ; N udieresis ; B 101 -15 575 620 ;
+C -1 ; WX 600 ; N notequal ; B 43 -16 621 529 ;
+C -1 ; WX 600 ; N gcommaaccent ; B 61 -157 657 708 ;
+C -1 ; WX 600 ; N eth ; B 102 -15 639 629 ;
+C -1 ; WX 600 ; N zcaron ; B 99 0 624 669 ;
+C -1 ; WX 600 ; N ncommaaccent ; B 26 -250 585 441 ;
+C -1 ; WX 600 ; N onesuperior ; B 231 249 491 622 ;
+C -1 ; WX 600 ; N imacron ; B 95 0 543 565 ;
+C -1 ; WX 600 ; N Euro ; B 0 0 0 0 ;
+EndCharMetrics
+EndFontMetrics
diff --git a/src/main/resources/com/lowagie/text/pdf/fonts/Courier.afm b/src/main/resources/com/lowagie/text/pdf/fonts/Courier.afm
new file mode 100644
index 0000000..be84b6b
--- /dev/null
+++ b/src/main/resources/com/lowagie/text/pdf/fonts/Courier.afm
@@ -0,0 +1,342 @@
+StartFontMetrics 4.1
+Comment Copyright (c) 1989, 1990, 1991, 1992, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.
+Comment Creation Date: Thu May 1 17:27:09 1997
+Comment UniqueID 43050
+Comment VMusage 39754 50779
+FontName Courier
+FullName Courier
+FamilyName Courier
+Weight Medium
+ItalicAngle 0
+IsFixedPitch true
+CharacterSet ExtendedRoman
+FontBBox -23 -250 715 805
+UnderlinePosition -100
+UnderlineThickness 50
+Version 003.000
+Notice Copyright (c) 1989, 1990, 1991, 1992, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.
+EncodingScheme AdobeStandardEncoding
+CapHeight 562
+XHeight 426
+Ascender 629
+Descender -157
+StdHW 51
+StdVW 51
+StartCharMetrics 315
+C 32 ; WX 600 ; N space ; B 0 0 0 0 ;
+C 33 ; WX 600 ; N exclam ; B 236 -15 364 572 ;
+C 34 ; WX 600 ; N quotedbl ; B 187 328 413 562 ;
+C 35 ; WX 600 ; N numbersign ; B 93 -32 507 639 ;
+C 36 ; WX 600 ; N dollar ; B 105 -126 496 662 ;
+C 37 ; WX 600 ; N percent ; B 81 -15 518 622 ;
+C 38 ; WX 600 ; N ampersand ; B 63 -15 538 543 ;
+C 39 ; WX 600 ; N quoteright ; B 213 328 376 562 ;
+C 40 ; WX 600 ; N parenleft ; B 269 -108 440 622 ;
+C 41 ; WX 600 ; N parenright ; B 160 -108 331 622 ;
+C 42 ; WX 600 ; N asterisk ; B 116 257 484 607 ;
+C 43 ; WX 600 ; N plus ; B 80 44 520 470 ;
+C 44 ; WX 600 ; N comma ; B 181 -112 344 122 ;
+C 45 ; WX 600 ; N hyphen ; B 103 231 497 285 ;
+C 46 ; WX 600 ; N period ; B 229 -15 371 109 ;
+C 47 ; WX 600 ; N slash ; B 125 -80 475 629 ;
+C 48 ; WX 600 ; N zero ; B 106 -15 494 622 ;
+C 49 ; WX 600 ; N one ; B 96 0 505 622 ;
+C 50 ; WX 600 ; N two ; B 70 0 471 622 ;
+C 51 ; WX 600 ; N three ; B 75 -15 466 622 ;
+C 52 ; WX 600 ; N four ; B 78 0 500 622 ;
+C 53 ; WX 600 ; N five ; B 92 -15 497 607 ;
+C 54 ; WX 600 ; N six ; B 111 -15 497 622 ;
+C 55 ; WX 600 ; N seven ; B 82 0 483 607 ;
+C 56 ; WX 600 ; N eight ; B 102 -15 498 622 ;
+C 57 ; WX 600 ; N nine ; B 96 -15 489 622 ;
+C 58 ; WX 600 ; N colon ; B 229 -15 371 385 ;
+C 59 ; WX 600 ; N semicolon ; B 181 -112 371 385 ;
+C 60 ; WX 600 ; N less ; B 41 42 519 472 ;
+C 61 ; WX 600 ; N equal ; B 80 138 520 376 ;
+C 62 ; WX 600 ; N greater ; B 66 42 544 472 ;
+C 63 ; WX 600 ; N question ; B 129 -15 492 572 ;
+C 64 ; WX 600 ; N at ; B 77 -15 533 622 ;
+C 65 ; WX 600 ; N A ; B 3 0 597 562 ;
+C 66 ; WX 600 ; N B ; B 43 0 559 562 ;
+C 67 ; WX 600 ; N C ; B 41 -18 540 580 ;
+C 68 ; WX 600 ; N D ; B 43 0 574 562 ;
+C 69 ; WX 600 ; N E ; B 53 0 550 562 ;
+C 70 ; WX 600 ; N F ; B 53 0 545 562 ;
+C 71 ; WX 600 ; N G ; B 31 -18 575 580 ;
+C 72 ; WX 600 ; N H ; B 32 0 568 562 ;
+C 73 ; WX 600 ; N I ; B 96 0 504 562 ;
+C 74 ; WX 600 ; N J ; B 34 -18 566 562 ;
+C 75 ; WX 600 ; N K ; B 38 0 582 562 ;
+C 76 ; WX 600 ; N L ; B 47 0 554 562 ;
+C 77 ; WX 600 ; N M ; B 4 0 596 562 ;
+C 78 ; WX 600 ; N N ; B 7 -13 593 562 ;
+C 79 ; WX 600 ; N O ; B 43 -18 557 580 ;
+C 80 ; WX 600 ; N P ; B 79 0 558 562 ;
+C 81 ; WX 600 ; N Q ; B 43 -138 557 580 ;
+C 82 ; WX 600 ; N R ; B 38 0 588 562 ;
+C 83 ; WX 600 ; N S ; B 72 -20 529 580 ;
+C 84 ; WX 600 ; N T ; B 38 0 563 562 ;
+C 85 ; WX 600 ; N U ; B 17 -18 583 562 ;
+C 86 ; WX 600 ; N V ; B -4 -13 604 562 ;
+C 87 ; WX 600 ; N W ; B -3 -13 603 562 ;
+C 88 ; WX 600 ; N X ; B 23 0 577 562 ;
+C 89 ; WX 600 ; N Y ; B 24 0 576 562 ;
+C 90 ; WX 600 ; N Z ; B 86 0 514 562 ;
+C 91 ; WX 600 ; N bracketleft ; B 269 -108 442 622 ;
+C 92 ; WX 600 ; N backslash ; B 118 -80 482 629 ;
+C 93 ; WX 600 ; N bracketright ; B 158 -108 331 622 ;
+C 94 ; WX 600 ; N asciicircum ; B 94 354 506 622 ;
+C 95 ; WX 600 ; N underscore ; B 0 -125 600 -75 ;
+C 96 ; WX 600 ; N quoteleft ; B 224 328 387 562 ;
+C 97 ; WX 600 ; N a ; B 53 -15 559 441 ;
+C 98 ; WX 600 ; N b ; B 14 -15 575 629 ;
+C 99 ; WX 600 ; N c ; B 66 -15 529 441 ;
+C 100 ; WX 600 ; N d ; B 45 -15 591 629 ;
+C 101 ; WX 600 ; N e ; B 66 -15 548 441 ;
+C 102 ; WX 600 ; N f ; B 114 0 531 629 ; L i fi ; L l fl ;
+C 103 ; WX 600 ; N g ; B 45 -157 566 441 ;
+C 104 ; WX 600 ; N h ; B 18 0 582 629 ;
+C 105 ; WX 600 ; N i ; B 95 0 505 657 ;
+C 106 ; WX 600 ; N j ; B 82 -157 410 657 ;
+C 107 ; WX 600 ; N k ; B 43 0 580 629 ;
+C 108 ; WX 600 ; N l ; B 95 0 505 629 ;
+C 109 ; WX 600 ; N m ; B -5 0 605 441 ;
+C 110 ; WX 600 ; N n ; B 26 0 575 441 ;
+C 111 ; WX 600 ; N o ; B 62 -15 538 441 ;
+C 112 ; WX 600 ; N p ; B 9 -157 555 441 ;
+C 113 ; WX 600 ; N q ; B 45 -157 591 441 ;
+C 114 ; WX 600 ; N r ; B 60 0 559 441 ;
+C 115 ; WX 600 ; N s ; B 80 -15 513 441 ;
+C 116 ; WX 600 ; N t ; B 87 -15 530 561 ;
+C 117 ; WX 600 ; N u ; B 21 -15 562 426 ;
+C 118 ; WX 600 ; N v ; B 10 -10 590 426 ;
+C 119 ; WX 600 ; N w ; B -4 -10 604 426 ;
+C 120 ; WX 600 ; N x ; B 20 0 580 426 ;
+C 121 ; WX 600 ; N y ; B 7 -157 592 426 ;
+C 122 ; WX 600 ; N z ; B 99 0 502 426 ;
+C 123 ; WX 600 ; N braceleft ; B 182 -108 437 622 ;
+C 124 ; WX 600 ; N bar ; B 275 -250 326 750 ;
+C 125 ; WX 600 ; N braceright ; B 163 -108 418 622 ;
+C 126 ; WX 600 ; N asciitilde ; B 63 197 540 320 ;
+C 161 ; WX 600 ; N exclamdown ; B 236 -157 364 430 ;
+C 162 ; WX 600 ; N cent ; B 96 -49 500 614 ;
+C 163 ; WX 600 ; N sterling ; B 84 -21 521 611 ;
+C 164 ; WX 600 ; N fraction ; B 92 -57 509 665 ;
+C 165 ; WX 600 ; N yen ; B 26 0 574 562 ;
+C 166 ; WX 600 ; N florin ; B 4 -143 539 622 ;
+C 167 ; WX 600 ; N section ; B 113 -78 488 580 ;
+C 168 ; WX 600 ; N currency ; B 73 58 527 506 ;
+C 169 ; WX 600 ; N quotesingle ; B 259 328 341 562 ;
+C 170 ; WX 600 ; N quotedblleft ; B 143 328 471 562 ;
+C 171 ; WX 600 ; N guillemotleft ; B 37 70 563 446 ;
+C 172 ; WX 600 ; N guilsinglleft ; B 149 70 451 446 ;
+C 173 ; WX 600 ; N guilsinglright ; B 149 70 451 446 ;
+C 174 ; WX 600 ; N fi ; B 3 0 597 629 ;
+C 175 ; WX 600 ; N fl ; B 3 0 597 629 ;
+C 177 ; WX 600 ; N endash ; B 75 231 525 285 ;
+C 178 ; WX 600 ; N dagger ; B 141 -78 459 580 ;
+C 179 ; WX 600 ; N daggerdbl ; B 141 -78 459 580 ;
+C 180 ; WX 600 ; N periodcentered ; B 222 189 378 327 ;
+C 182 ; WX 600 ; N paragraph ; B 50 -78 511 562 ;
+C 183 ; WX 600 ; N bullet ; B 172 130 428 383 ;
+C 184 ; WX 600 ; N quotesinglbase ; B 213 -134 376 100 ;
+C 185 ; WX 600 ; N quotedblbase ; B 143 -134 457 100 ;
+C 186 ; WX 600 ; N quotedblright ; B 143 328 457 562 ;
+C 187 ; WX 600 ; N guillemotright ; B 37 70 563 446 ;
+C 188 ; WX 600 ; N ellipsis ; B 37 -15 563 111 ;
+C 189 ; WX 600 ; N perthousand ; B 3 -15 600 622 ;
+C 191 ; WX 600 ; N questiondown ; B 108 -157 471 430 ;
+C 193 ; WX 600 ; N grave ; B 151 497 378 672 ;
+C 194 ; WX 600 ; N acute ; B 242 497 469 672 ;
+C 195 ; WX 600 ; N circumflex ; B 124 477 476 654 ;
+C 196 ; WX 600 ; N tilde ; B 105 489 503 606 ;
+C 197 ; WX 600 ; N macron ; B 120 525 480 565 ;
+C 198 ; WX 600 ; N breve ; B 153 501 447 609 ;
+C 199 ; WX 600 ; N dotaccent ; B 249 537 352 640 ;
+C 200 ; WX 600 ; N dieresis ; B 148 537 453 640 ;
+C 202 ; WX 600 ; N ring ; B 218 463 382 627 ;
+C 203 ; WX 600 ; N cedilla ; B 224 -151 362 10 ;
+C 205 ; WX 600 ; N hungarumlaut ; B 133 497 540 672 ;
+C 206 ; WX 600 ; N ogonek ; B 211 -172 407 4 ;
+C 207 ; WX 600 ; N caron ; B 124 492 476 669 ;
+C 208 ; WX 600 ; N emdash ; B 0 231 600 285 ;
+C 225 ; WX 600 ; N AE ; B 3 0 550 562 ;
+C 227 ; WX 600 ; N ordfeminine ; B 156 249 442 580 ;
+C 232 ; WX 600 ; N Lslash ; B 47 0 554 562 ;
+C 233 ; WX 600 ; N Oslash ; B 43 -80 557 629 ;
+C 234 ; WX 600 ; N OE ; B 7 0 567 562 ;
+C 235 ; WX 600 ; N ordmasculine ; B 157 249 443 580 ;
+C 241 ; WX 600 ; N ae ; B 19 -15 570 441 ;
+C 245 ; WX 600 ; N dotlessi ; B 95 0 505 426 ;
+C 248 ; WX 600 ; N lslash ; B 95 0 505 629 ;
+C 249 ; WX 600 ; N oslash ; B 62 -80 538 506 ;
+C 250 ; WX 600 ; N oe ; B 19 -15 559 441 ;
+C 251 ; WX 600 ; N germandbls ; B 48 -15 588 629 ;
+C -1 ; WX 600 ; N Idieresis ; B 96 0 504 753 ;
+C -1 ; WX 600 ; N eacute ; B 66 -15 548 672 ;
+C -1 ; WX 600 ; N abreve ; B 53 -15 559 609 ;
+C -1 ; WX 600 ; N uhungarumlaut ; B 21 -15 580 672 ;
+C -1 ; WX 600 ; N ecaron ; B 66 -15 548 669 ;
+C -1 ; WX 600 ; N Ydieresis ; B 24 0 576 753 ;
+C -1 ; WX 600 ; N divide ; B 87 48 513 467 ;
+C -1 ; WX 600 ; N Yacute ; B 24 0 576 805 ;
+C -1 ; WX 600 ; N Acircumflex ; B 3 0 597 787 ;
+C -1 ; WX 600 ; N aacute ; B 53 -15 559 672 ;
+C -1 ; WX 600 ; N Ucircumflex ; B 17 -18 583 787 ;
+C -1 ; WX 600 ; N yacute ; B 7 -157 592 672 ;
+C -1 ; WX 600 ; N scommaaccent ; B 80 -250 513 441 ;
+C -1 ; WX 600 ; N ecircumflex ; B 66 -15 548 654 ;
+C -1 ; WX 600 ; N Uring ; B 17 -18 583 760 ;
+C -1 ; WX 600 ; N Udieresis ; B 17 -18 583 753 ;
+C -1 ; WX 600 ; N aogonek ; B 53 -172 587 441 ;
+C -1 ; WX 600 ; N Uacute ; B 17 -18 583 805 ;
+C -1 ; WX 600 ; N uogonek ; B 21 -172 590 426 ;
+C -1 ; WX 600 ; N Edieresis ; B 53 0 550 753 ;
+C -1 ; WX 600 ; N Dcroat ; B 30 0 574 562 ;
+C -1 ; WX 600 ; N commaaccent ; B 198 -250 335 -58 ;
+C -1 ; WX 600 ; N copyright ; B 0 -18 600 580 ;
+C -1 ; WX 600 ; N Emacron ; B 53 0 550 698 ;
+C -1 ; WX 600 ; N ccaron ; B 66 -15 529 669 ;
+C -1 ; WX 600 ; N aring ; B 53 -15 559 627 ;
+C -1 ; WX 600 ; N Ncommaaccent ; B 7 -250 593 562 ;
+C -1 ; WX 600 ; N lacute ; B 95 0 505 805 ;
+C -1 ; WX 600 ; N agrave ; B 53 -15 559 672 ;
+C -1 ; WX 600 ; N Tcommaaccent ; B 38 -250 563 562 ;
+C -1 ; WX 600 ; N Cacute ; B 41 -18 540 805 ;
+C -1 ; WX 600 ; N atilde ; B 53 -15 559 606 ;
+C -1 ; WX 600 ; N Edotaccent ; B 53 0 550 753 ;
+C -1 ; WX 600 ; N scaron ; B 80 -15 513 669 ;
+C -1 ; WX 600 ; N scedilla ; B 80 -151 513 441 ;
+C -1 ; WX 600 ; N iacute ; B 95 0 505 672 ;
+C -1 ; WX 600 ; N lozenge ; B 18 0 443 706 ;
+C -1 ; WX 600 ; N Rcaron ; B 38 0 588 802 ;
+C -1 ; WX 600 ; N Gcommaaccent ; B 31 -250 575 580 ;
+C -1 ; WX 600 ; N ucircumflex ; B 21 -15 562 654 ;
+C -1 ; WX 600 ; N acircumflex ; B 53 -15 559 654 ;
+C -1 ; WX 600 ; N Amacron ; B 3 0 597 698 ;
+C -1 ; WX 600 ; N rcaron ; B 60 0 559 669 ;
+C -1 ; WX 600 ; N ccedilla ; B 66 -151 529 441 ;
+C -1 ; WX 600 ; N Zdotaccent ; B 86 0 514 753 ;
+C -1 ; WX 600 ; N Thorn ; B 79 0 538 562 ;
+C -1 ; WX 600 ; N Omacron ; B 43 -18 557 698 ;
+C -1 ; WX 600 ; N Racute ; B 38 0 588 805 ;
+C -1 ; WX 600 ; N Sacute ; B 72 -20 529 805 ;
+C -1 ; WX 600 ; N dcaron ; B 45 -15 715 629 ;
+C -1 ; WX 600 ; N Umacron ; B 17 -18 583 698 ;
+C -1 ; WX 600 ; N uring ; B 21 -15 562 627 ;
+C -1 ; WX 600 ; N threesuperior ; B 155 240 406 622 ;
+C -1 ; WX 600 ; N Ograve ; B 43 -18 557 805 ;
+C -1 ; WX 600 ; N Agrave ; B 3 0 597 805 ;
+C -1 ; WX 600 ; N Abreve ; B 3 0 597 732 ;
+C -1 ; WX 600 ; N multiply ; B 87 43 515 470 ;
+C -1 ; WX 600 ; N uacute ; B 21 -15 562 672 ;
+C -1 ; WX 600 ; N Tcaron ; B 38 0 563 802 ;
+C -1 ; WX 600 ; N partialdiff ; B 17 -38 459 710 ;
+C -1 ; WX 600 ; N ydieresis ; B 7 -157 592 620 ;
+C -1 ; WX 600 ; N Nacute ; B 7 -13 593 805 ;
+C -1 ; WX 600 ; N icircumflex ; B 94 0 505 654 ;
+C -1 ; WX 600 ; N Ecircumflex ; B 53 0 550 787 ;
+C -1 ; WX 600 ; N adieresis ; B 53 -15 559 620 ;
+C -1 ; WX 600 ; N edieresis ; B 66 -15 548 620 ;
+C -1 ; WX 600 ; N cacute ; B 66 -15 529 672 ;
+C -1 ; WX 600 ; N nacute ; B 26 0 575 672 ;
+C -1 ; WX 600 ; N umacron ; B 21 -15 562 565 ;
+C -1 ; WX 600 ; N Ncaron ; B 7 -13 593 802 ;
+C -1 ; WX 600 ; N Iacute ; B 96 0 504 805 ;
+C -1 ; WX 600 ; N plusminus ; B 87 44 513 558 ;
+C -1 ; WX 600 ; N brokenbar ; B 275 -175 326 675 ;
+C -1 ; WX 600 ; N registered ; B 0 -18 600 580 ;
+C -1 ; WX 600 ; N Gbreve ; B 31 -18 575 732 ;
+C -1 ; WX 600 ; N Idotaccent ; B 96 0 504 753 ;
+C -1 ; WX 600 ; N summation ; B 15 -10 585 706 ;
+C -1 ; WX 600 ; N Egrave ; B 53 0 550 805 ;
+C -1 ; WX 600 ; N racute ; B 60 0 559 672 ;
+C -1 ; WX 600 ; N omacron ; B 62 -15 538 565 ;
+C -1 ; WX 600 ; N Zacute ; B 86 0 514 805 ;
+C -1 ; WX 600 ; N Zcaron ; B 86 0 514 802 ;
+C -1 ; WX 600 ; N greaterequal ; B 98 0 502 710 ;
+C -1 ; WX 600 ; N Eth ; B 30 0 574 562 ;
+C -1 ; WX 600 ; N Ccedilla ; B 41 -151 540 580 ;
+C -1 ; WX 600 ; N lcommaaccent ; B 95 -250 505 629 ;
+C -1 ; WX 600 ; N tcaron ; B 87 -15 530 717 ;
+C -1 ; WX 600 ; N eogonek ; B 66 -172 548 441 ;
+C -1 ; WX 600 ; N Uogonek ; B 17 -172 583 562 ;
+C -1 ; WX 600 ; N Aacute ; B 3 0 597 805 ;
+C -1 ; WX 600 ; N Adieresis ; B 3 0 597 753 ;
+C -1 ; WX 600 ; N egrave ; B 66 -15 548 672 ;
+C -1 ; WX 600 ; N zacute ; B 99 0 502 672 ;
+C -1 ; WX 600 ; N iogonek ; B 95 -172 505 657 ;
+C -1 ; WX 600 ; N Oacute ; B 43 -18 557 805 ;
+C -1 ; WX 600 ; N oacute ; B 62 -15 538 672 ;
+C -1 ; WX 600 ; N amacron ; B 53 -15 559 565 ;
+C -1 ; WX 600 ; N sacute ; B 80 -15 513 672 ;
+C -1 ; WX 600 ; N idieresis ; B 95 0 505 620 ;
+C -1 ; WX 600 ; N Ocircumflex ; B 43 -18 557 787 ;
+C -1 ; WX 600 ; N Ugrave ; B 17 -18 583 805 ;
+C -1 ; WX 600 ; N Delta ; B 6 0 598 688 ;
+C -1 ; WX 600 ; N thorn ; B -6 -157 555 629 ;
+C -1 ; WX 600 ; N twosuperior ; B 177 249 424 622 ;
+C -1 ; WX 600 ; N Odieresis ; B 43 -18 557 753 ;
+C -1 ; WX 600 ; N mu ; B 21 -157 562 426 ;
+C -1 ; WX 600 ; N igrave ; B 95 0 505 672 ;
+C -1 ; WX 600 ; N ohungarumlaut ; B 62 -15 580 672 ;
+C -1 ; WX 600 ; N Eogonek ; B 53 -172 561 562 ;
+C -1 ; WX 600 ; N dcroat ; B 45 -15 591 629 ;
+C -1 ; WX 600 ; N threequarters ; B 8 -56 593 666 ;
+C -1 ; WX 600 ; N Scedilla ; B 72 -151 529 580 ;
+C -1 ; WX 600 ; N lcaron ; B 95 0 533 629 ;
+C -1 ; WX 600 ; N Kcommaaccent ; B 38 -250 582 562 ;
+C -1 ; WX 600 ; N Lacute ; B 47 0 554 805 ;
+C -1 ; WX 600 ; N trademark ; B -23 263 623 562 ;
+C -1 ; WX 600 ; N edotaccent ; B 66 -15 548 620 ;
+C -1 ; WX 600 ; N Igrave ; B 96 0 504 805 ;
+C -1 ; WX 600 ; N Imacron ; B 96 0 504 698 ;
+C -1 ; WX 600 ; N Lcaron ; B 47 0 554 562 ;
+C -1 ; WX 600 ; N onehalf ; B 0 -57 611 665 ;
+C -1 ; WX 600 ; N lessequal ; B 98 0 502 710 ;
+C -1 ; WX 600 ; N ocircumflex ; B 62 -15 538 654 ;
+C -1 ; WX 600 ; N ntilde ; B 26 0 575 606 ;
+C -1 ; WX 600 ; N Uhungarumlaut ; B 17 -18 590 805 ;
+C -1 ; WX 600 ; N Eacute ; B 53 0 550 805 ;
+C -1 ; WX 600 ; N emacron ; B 66 -15 548 565 ;
+C -1 ; WX 600 ; N gbreve ; B 45 -157 566 609 ;
+C -1 ; WX 600 ; N onequarter ; B 0 -57 600 665 ;
+C -1 ; WX 600 ; N Scaron ; B 72 -20 529 802 ;
+C -1 ; WX 600 ; N Scommaaccent ; B 72 -250 529 580 ;
+C -1 ; WX 600 ; N Ohungarumlaut ; B 43 -18 580 805 ;
+C -1 ; WX 600 ; N degree ; B 123 269 477 622 ;
+C -1 ; WX 600 ; N ograve ; B 62 -15 538 672 ;
+C -1 ; WX 600 ; N Ccaron ; B 41 -18 540 802 ;
+C -1 ; WX 600 ; N ugrave ; B 21 -15 562 672 ;
+C -1 ; WX 600 ; N radical ; B 3 -15 597 792 ;
+C -1 ; WX 600 ; N Dcaron ; B 43 0 574 802 ;
+C -1 ; WX 600 ; N rcommaaccent ; B 60 -250 559 441 ;
+C -1 ; WX 600 ; N Ntilde ; B 7 -13 593 729 ;
+C -1 ; WX 600 ; N otilde ; B 62 -15 538 606 ;
+C -1 ; WX 600 ; N Rcommaaccent ; B 38 -250 588 562 ;
+C -1 ; WX 600 ; N Lcommaaccent ; B 47 -250 554 562 ;
+C -1 ; WX 600 ; N Atilde ; B 3 0 597 729 ;
+C -1 ; WX 600 ; N Aogonek ; B 3 -172 608 562 ;
+C -1 ; WX 600 ; N Aring ; B 3 0 597 750 ;
+C -1 ; WX 600 ; N Otilde ; B 43 -18 557 729 ;
+C -1 ; WX 600 ; N zdotaccent ; B 99 0 502 620 ;
+C -1 ; WX 600 ; N Ecaron ; B 53 0 550 802 ;
+C -1 ; WX 600 ; N Iogonek ; B 96 -172 504 562 ;
+C -1 ; WX 600 ; N kcommaaccent ; B 43 -250 580 629 ;
+C -1 ; WX 600 ; N minus ; B 80 232 520 283 ;
+C -1 ; WX 600 ; N Icircumflex ; B 96 0 504 787 ;
+C -1 ; WX 600 ; N ncaron ; B 26 0 575 669 ;
+C -1 ; WX 600 ; N tcommaaccent ; B 87 -250 530 561 ;
+C -1 ; WX 600 ; N logicalnot ; B 87 108 513 369 ;
+C -1 ; WX 600 ; N odieresis ; B 62 -15 538 620 ;
+C -1 ; WX 600 ; N udieresis ; B 21 -15 562 620 ;
+C -1 ; WX 600 ; N notequal ; B 15 -16 540 529 ;
+C -1 ; WX 600 ; N gcommaaccent ; B 45 -157 566 708 ;
+C -1 ; WX 600 ; N eth ; B 62 -15 538 629 ;
+C -1 ; WX 600 ; N zcaron ; B 99 0 502 669 ;
+C -1 ; WX 600 ; N ncommaaccent ; B 26 -250 575 441 ;
+C -1 ; WX 600 ; N onesuperior ; B 172 249 428 622 ;
+C -1 ; WX 600 ; N imacron ; B 95 0 505 565 ;
+C -1 ; WX 600 ; N Euro ; B 0 0 0 0 ;
+EndCharMetrics
+EndFontMetrics
diff --git a/src/main/resources/com/lowagie/text/pdf/fonts/Helvetica-Bold.afm b/src/main/resources/com/lowagie/text/pdf/fonts/Helvetica-Bold.afm
new file mode 100644
index 0000000..0d41049
--- /dev/null
+++ b/src/main/resources/com/lowagie/text/pdf/fonts/Helvetica-Bold.afm
@@ -0,0 +1,2827 @@
+StartFontMetrics 4.1
+Comment Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved.
+Comment Creation Date: Thu May 1 12:43:52 1997
+Comment UniqueID 43052
+Comment VMusage 37169 48194
+FontName Helvetica-Bold
+FullName Helvetica Bold
+FamilyName Helvetica
+Weight Bold
+ItalicAngle 0
+IsFixedPitch false
+CharacterSet ExtendedRoman
+FontBBox -170 -228 1003 962
+UnderlinePosition -100
+UnderlineThickness 50
+Version 002.000
+Notice Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved.Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries.
+EncodingScheme AdobeStandardEncoding
+CapHeight 718
+XHeight 532
+Ascender 718
+Descender -207
+StdHW 118
+StdVW 140
+StartCharMetrics 315
+C 32 ; WX 278 ; N space ; B 0 0 0 0 ;
+C 33 ; WX 333 ; N exclam ; B 90 0 244 718 ;
+C 34 ; WX 474 ; N quotedbl ; B 98 447 376 718 ;
+C 35 ; WX 556 ; N numbersign ; B 18 0 538 698 ;
+C 36 ; WX 556 ; N dollar ; B 30 -115 523 775 ;
+C 37 ; WX 889 ; N percent ; B 28 -19 861 710 ;
+C 38 ; WX 722 ; N ampersand ; B 54 -19 701 718 ;
+C 39 ; WX 278 ; N quoteright ; B 69 445 209 718 ;
+C 40 ; WX 333 ; N parenleft ; B 35 -208 314 734 ;
+C 41 ; WX 333 ; N parenright ; B 19 -208 298 734 ;
+C 42 ; WX 389 ; N asterisk ; B 27 387 362 718 ;
+C 43 ; WX 584 ; N plus ; B 40 0 544 506 ;
+C 44 ; WX 278 ; N comma ; B 64 -168 214 146 ;
+C 45 ; WX 333 ; N hyphen ; B 27 215 306 345 ;
+C 46 ; WX 278 ; N period ; B 64 0 214 146 ;
+C 47 ; WX 278 ; N slash ; B -33 -19 311 737 ;
+C 48 ; WX 556 ; N zero ; B 32 -19 524 710 ;
+C 49 ; WX 556 ; N one ; B 69 0 378 710 ;
+C 50 ; WX 556 ; N two ; B 26 0 511 710 ;
+C 51 ; WX 556 ; N three ; B 27 -19 516 710 ;
+C 52 ; WX 556 ; N four ; B 27 0 526 710 ;
+C 53 ; WX 556 ; N five ; B 27 -19 516 698 ;
+C 54 ; WX 556 ; N six ; B 31 -19 520 710 ;
+C 55 ; WX 556 ; N seven ; B 25 0 528 698 ;
+C 56 ; WX 556 ; N eight ; B 32 -19 524 710 ;
+C 57 ; WX 556 ; N nine ; B 30 -19 522 710 ;
+C 58 ; WX 333 ; N colon ; B 92 0 242 512 ;
+C 59 ; WX 333 ; N semicolon ; B 92 -168 242 512 ;
+C 60 ; WX 584 ; N less ; B 38 -8 546 514 ;
+C 61 ; WX 584 ; N equal ; B 40 87 544 419 ;
+C 62 ; WX 584 ; N greater ; B 38 -8 546 514 ;
+C 63 ; WX 611 ; N question ; B 60 0 556 727 ;
+C 64 ; WX 975 ; N at ; B 118 -19 856 737 ;
+C 65 ; WX 722 ; N A ; B 20 0 702 718 ;
+C 66 ; WX 722 ; N B ; B 76 0 669 718 ;
+C 67 ; WX 722 ; N C ; B 44 -19 684 737 ;
+C 68 ; WX 722 ; N D ; B 76 0 685 718 ;
+C 69 ; WX 667 ; N E ; B 76 0 621 718 ;
+C 70 ; WX 611 ; N F ; B 76 0 587 718 ;
+C 71 ; WX 778 ; N G ; B 44 -19 713 737 ;
+C 72 ; WX 722 ; N H ; B 71 0 651 718 ;
+C 73 ; WX 278 ; N I ; B 64 0 214 718 ;
+C 74 ; WX 556 ; N J ; B 22 -18 484 718 ;
+C 75 ; WX 722 ; N K ; B 87 0 722 718 ;
+C 76 ; WX 611 ; N L ; B 76 0 583 718 ;
+C 77 ; WX 833 ; N M ; B 69 0 765 718 ;
+C 78 ; WX 722 ; N N ; B 69 0 654 718 ;
+C 79 ; WX 778 ; N O ; B 44 -19 734 737 ;
+C 80 ; WX 667 ; N P ; B 76 0 627 718 ;
+C 81 ; WX 778 ; N Q ; B 44 -52 737 737 ;
+C 82 ; WX 722 ; N R ; B 76 0 677 718 ;
+C 83 ; WX 667 ; N S ; B 39 -19 629 737 ;
+C 84 ; WX 611 ; N T ; B 14 0 598 718 ;
+C 85 ; WX 722 ; N U ; B 72 -19 651 718 ;
+C 86 ; WX 667 ; N V ; B 19 0 648 718 ;
+C 87 ; WX 944 ; N W ; B 16 0 929 718 ;
+C 88 ; WX 667 ; N X ; B 14 0 653 718 ;
+C 89 ; WX 667 ; N Y ; B 15 0 653 718 ;
+C 90 ; WX 611 ; N Z ; B 25 0 586 718 ;
+C 91 ; WX 333 ; N bracketleft ; B 63 -196 309 722 ;
+C 92 ; WX 278 ; N backslash ; B -33 -19 311 737 ;
+C 93 ; WX 333 ; N bracketright ; B 24 -196 270 722 ;
+C 94 ; WX 584 ; N asciicircum ; B 62 323 522 698 ;
+C 95 ; WX 556 ; N underscore ; B 0 -125 556 -75 ;
+C 96 ; WX 278 ; N quoteleft ; B 69 454 209 727 ;
+C 97 ; WX 556 ; N a ; B 29 -14 527 546 ;
+C 98 ; WX 611 ; N b ; B 61 -14 578 718 ;
+C 99 ; WX 556 ; N c ; B 34 -14 524 546 ;
+C 100 ; WX 611 ; N d ; B 34 -14 551 718 ;
+C 101 ; WX 556 ; N e ; B 23 -14 528 546 ;
+C 102 ; WX 333 ; N f ; B 10 0 318 727 ; L i fi ; L l fl ;
+C 103 ; WX 611 ; N g ; B 40 -217 553 546 ;
+C 104 ; WX 611 ; N h ; B 65 0 546 718 ;
+C 105 ; WX 278 ; N i ; B 69 0 209 725 ;
+C 106 ; WX 278 ; N j ; B 3 -214 209 725 ;
+C 107 ; WX 556 ; N k ; B 69 0 562 718 ;
+C 108 ; WX 278 ; N l ; B 69 0 209 718 ;
+C 109 ; WX 889 ; N m ; B 64 0 826 546 ;
+C 110 ; WX 611 ; N n ; B 65 0 546 546 ;
+C 111 ; WX 611 ; N o ; B 34 -14 578 546 ;
+C 112 ; WX 611 ; N p ; B 62 -207 578 546 ;
+C 113 ; WX 611 ; N q ; B 34 -207 552 546 ;
+C 114 ; WX 389 ; N r ; B 64 0 373 546 ;
+C 115 ; WX 556 ; N s ; B 30 -14 519 546 ;
+C 116 ; WX 333 ; N t ; B 10 -6 309 676 ;
+C 117 ; WX 611 ; N u ; B 66 -14 545 532 ;
+C 118 ; WX 556 ; N v ; B 13 0 543 532 ;
+C 119 ; WX 778 ; N w ; B 10 0 769 532 ;
+C 120 ; WX 556 ; N x ; B 15 0 541 532 ;
+C 121 ; WX 556 ; N y ; B 10 -214 539 532 ;
+C 122 ; WX 500 ; N z ; B 20 0 480 532 ;
+C 123 ; WX 389 ; N braceleft ; B 48 -196 365 722 ;
+C 124 ; WX 280 ; N bar ; B 84 -225 196 775 ;
+C 125 ; WX 389 ; N braceright ; B 24 -196 341 722 ;
+C 126 ; WX 584 ; N asciitilde ; B 61 163 523 343 ;
+C 161 ; WX 333 ; N exclamdown ; B 90 -186 244 532 ;
+C 162 ; WX 556 ; N cent ; B 34 -118 524 628 ;
+C 163 ; WX 556 ; N sterling ; B 28 -16 541 718 ;
+C 164 ; WX 167 ; N fraction ; B -170 -19 336 710 ;
+C 165 ; WX 556 ; N yen ; B -9 0 565 698 ;
+C 166 ; WX 556 ; N florin ; B -10 -210 516 737 ;
+C 167 ; WX 556 ; N section ; B 34 -184 522 727 ;
+C 168 ; WX 556 ; N currency ; B -3 76 559 636 ;
+C 169 ; WX 238 ; N quotesingle ; B 70 447 168 718 ;
+C 170 ; WX 500 ; N quotedblleft ; B 64 454 436 727 ;
+C 171 ; WX 556 ; N guillemotleft ; B 88 76 468 484 ;
+C 172 ; WX 333 ; N guilsinglleft ; B 83 76 250 484 ;
+C 173 ; WX 333 ; N guilsinglright ; B 83 76 250 484 ;
+C 174 ; WX 611 ; N fi ; B 10 0 542 727 ;
+C 175 ; WX 611 ; N fl ; B 10 0 542 727 ;
+C 177 ; WX 556 ; N endash ; B 0 227 556 333 ;
+C 178 ; WX 556 ; N dagger ; B 36 -171 520 718 ;
+C 179 ; WX 556 ; N daggerdbl ; B 36 -171 520 718 ;
+C 180 ; WX 278 ; N periodcentered ; B 58 172 220 334 ;
+C 182 ; WX 556 ; N paragraph ; B -8 -191 539 700 ;
+C 183 ; WX 350 ; N bullet ; B 10 194 340 524 ;
+C 184 ; WX 278 ; N quotesinglbase ; B 69 -146 209 127 ;
+C 185 ; WX 500 ; N quotedblbase ; B 64 -146 436 127 ;
+C 186 ; WX 500 ; N quotedblright ; B 64 445 436 718 ;
+C 187 ; WX 556 ; N guillemotright ; B 88 76 468 484 ;
+C 188 ; WX 1000 ; N ellipsis ; B 92 0 908 146 ;
+C 189 ; WX 1000 ; N perthousand ; B -3 -19 1003 710 ;
+C 191 ; WX 611 ; N questiondown ; B 55 -195 551 532 ;
+C 193 ; WX 333 ; N grave ; B -23 604 225 750 ;
+C 194 ; WX 333 ; N acute ; B 108 604 356 750 ;
+C 195 ; WX 333 ; N circumflex ; B -10 604 343 750 ;
+C 196 ; WX 333 ; N tilde ; B -17 610 350 737 ;
+C 197 ; WX 333 ; N macron ; B -6 604 339 678 ;
+C 198 ; WX 333 ; N breve ; B -2 604 335 750 ;
+C 199 ; WX 333 ; N dotaccent ; B 104 614 230 729 ;
+C 200 ; WX 333 ; N dieresis ; B 6 614 327 729 ;
+C 202 ; WX 333 ; N ring ; B 59 568 275 776 ;
+C 203 ; WX 333 ; N cedilla ; B 6 -228 245 0 ;
+C 205 ; WX 333 ; N hungarumlaut ; B 9 604 486 750 ;
+C 206 ; WX 333 ; N ogonek ; B 71 -228 304 0 ;
+C 207 ; WX 333 ; N caron ; B -10 604 343 750 ;
+C 208 ; WX 1000 ; N emdash ; B 0 227 1000 333 ;
+C 225 ; WX 1000 ; N AE ; B 5 0 954 718 ;
+C 227 ; WX 370 ; N ordfeminine ; B 22 401 347 737 ;
+C 232 ; WX 611 ; N Lslash ; B -20 0 583 718 ;
+C 233 ; WX 778 ; N Oslash ; B 33 -27 744 745 ;
+C 234 ; WX 1000 ; N OE ; B 37 -19 961 737 ;
+C 235 ; WX 365 ; N ordmasculine ; B 6 401 360 737 ;
+C 241 ; WX 889 ; N ae ; B 29 -14 858 546 ;
+C 245 ; WX 278 ; N dotlessi ; B 69 0 209 532 ;
+C 248 ; WX 278 ; N lslash ; B -18 0 296 718 ;
+C 249 ; WX 611 ; N oslash ; B 22 -29 589 560 ;
+C 250 ; WX 944 ; N oe ; B 34 -14 912 546 ;
+C 251 ; WX 611 ; N germandbls ; B 69 -14 579 731 ;
+C -1 ; WX 278 ; N Idieresis ; B -21 0 300 915 ;
+C -1 ; WX 556 ; N eacute ; B 23 -14 528 750 ;
+C -1 ; WX 556 ; N abreve ; B 29 -14 527 750 ;
+C -1 ; WX 611 ; N uhungarumlaut ; B 66 -14 625 750 ;
+C -1 ; WX 556 ; N ecaron ; B 23 -14 528 750 ;
+C -1 ; WX 667 ; N Ydieresis ; B 15 0 653 915 ;
+C -1 ; WX 584 ; N divide ; B 40 -42 544 548 ;
+C -1 ; WX 667 ; N Yacute ; B 15 0 653 936 ;
+C -1 ; WX 722 ; N Acircumflex ; B 20 0 702 936 ;
+C -1 ; WX 556 ; N aacute ; B 29 -14 527 750 ;
+C -1 ; WX 722 ; N Ucircumflex ; B 72 -19 651 936 ;
+C -1 ; WX 556 ; N yacute ; B 10 -214 539 750 ;
+C -1 ; WX 556 ; N scommaaccent ; B 30 -228 519 546 ;
+C -1 ; WX 556 ; N ecircumflex ; B 23 -14 528 750 ;
+C -1 ; WX 722 ; N Uring ; B 72 -19 651 962 ;
+C -1 ; WX 722 ; N Udieresis ; B 72 -19 651 915 ;
+C -1 ; WX 556 ; N aogonek ; B 29 -224 545 546 ;
+C -1 ; WX 722 ; N Uacute ; B 72 -19 651 936 ;
+C -1 ; WX 611 ; N uogonek ; B 66 -228 545 532 ;
+C -1 ; WX 667 ; N Edieresis ; B 76 0 621 915 ;
+C -1 ; WX 722 ; N Dcroat ; B -5 0 685 718 ;
+C -1 ; WX 250 ; N commaaccent ; B 64 -228 199 -50 ;
+C -1 ; WX 737 ; N copyright ; B -11 -19 749 737 ;
+C -1 ; WX 667 ; N Emacron ; B 76 0 621 864 ;
+C -1 ; WX 556 ; N ccaron ; B 34 -14 524 750 ;
+C -1 ; WX 556 ; N aring ; B 29 -14 527 776 ;
+C -1 ; WX 722 ; N Ncommaaccent ; B 69 -228 654 718 ;
+C -1 ; WX 278 ; N lacute ; B 69 0 329 936 ;
+C -1 ; WX 556 ; N agrave ; B 29 -14 527 750 ;
+C -1 ; WX 611 ; N Tcommaaccent ; B 14 -228 598 718 ;
+C -1 ; WX 722 ; N Cacute ; B 44 -19 684 936 ;
+C -1 ; WX 556 ; N atilde ; B 29 -14 527 737 ;
+C -1 ; WX 667 ; N Edotaccent ; B 76 0 621 915 ;
+C -1 ; WX 556 ; N scaron ; B 30 -14 519 750 ;
+C -1 ; WX 556 ; N scedilla ; B 30 -228 519 546 ;
+C -1 ; WX 278 ; N iacute ; B 69 0 329 750 ;
+C -1 ; WX 494 ; N lozenge ; B 10 0 484 745 ;
+C -1 ; WX 722 ; N Rcaron ; B 76 0 677 936 ;
+C -1 ; WX 778 ; N Gcommaaccent ; B 44 -228 713 737 ;
+C -1 ; WX 611 ; N ucircumflex ; B 66 -14 545 750 ;
+C -1 ; WX 556 ; N acircumflex ; B 29 -14 527 750 ;
+C -1 ; WX 722 ; N Amacron ; B 20 0 702 864 ;
+C -1 ; WX 389 ; N rcaron ; B 18 0 373 750 ;
+C -1 ; WX 556 ; N ccedilla ; B 34 -228 524 546 ;
+C -1 ; WX 611 ; N Zdotaccent ; B 25 0 586 915 ;
+C -1 ; WX 667 ; N Thorn ; B 76 0 627 718 ;
+C -1 ; WX 778 ; N Omacron ; B 44 -19 734 864 ;
+C -1 ; WX 722 ; N Racute ; B 76 0 677 936 ;
+C -1 ; WX 667 ; N Sacute ; B 39 -19 629 936 ;
+C -1 ; WX 743 ; N dcaron ; B 34 -14 750 718 ;
+C -1 ; WX 722 ; N Umacron ; B 72 -19 651 864 ;
+C -1 ; WX 611 ; N uring ; B 66 -14 545 776 ;
+C -1 ; WX 333 ; N threesuperior ; B 8 271 326 710 ;
+C -1 ; WX 778 ; N Ograve ; B 44 -19 734 936 ;
+C -1 ; WX 722 ; N Agrave ; B 20 0 702 936 ;
+C -1 ; WX 722 ; N Abreve ; B 20 0 702 936 ;
+C -1 ; WX 584 ; N multiply ; B 40 1 545 505 ;
+C -1 ; WX 611 ; N uacute ; B 66 -14 545 750 ;
+C -1 ; WX 611 ; N Tcaron ; B 14 0 598 936 ;
+C -1 ; WX 494 ; N partialdiff ; B 11 -21 494 750 ;
+C -1 ; WX 556 ; N ydieresis ; B 10 -214 539 729 ;
+C -1 ; WX 722 ; N Nacute ; B 69 0 654 936 ;
+C -1 ; WX 278 ; N icircumflex ; B -37 0 316 750 ;
+C -1 ; WX 667 ; N Ecircumflex ; B 76 0 621 936 ;
+C -1 ; WX 556 ; N adieresis ; B 29 -14 527 729 ;
+C -1 ; WX 556 ; N edieresis ; B 23 -14 528 729 ;
+C -1 ; WX 556 ; N cacute ; B 34 -14 524 750 ;
+C -1 ; WX 611 ; N nacute ; B 65 0 546 750 ;
+C -1 ; WX 611 ; N umacron ; B 66 -14 545 678 ;
+C -1 ; WX 722 ; N Ncaron ; B 69 0 654 936 ;
+C -1 ; WX 278 ; N Iacute ; B 64 0 329 936 ;
+C -1 ; WX 584 ; N plusminus ; B 40 0 544 506 ;
+C -1 ; WX 280 ; N brokenbar ; B 84 -150 196 700 ;
+C -1 ; WX 737 ; N registered ; B -11 -19 748 737 ;
+C -1 ; WX 778 ; N Gbreve ; B 44 -19 713 936 ;
+C -1 ; WX 278 ; N Idotaccent ; B 64 0 214 915 ;
+C -1 ; WX 600 ; N summation ; B 14 -10 585 706 ;
+C -1 ; WX 667 ; N Egrave ; B 76 0 621 936 ;
+C -1 ; WX 389 ; N racute ; B 64 0 384 750 ;
+C -1 ; WX 611 ; N omacron ; B 34 -14 578 678 ;
+C -1 ; WX 611 ; N Zacute ; B 25 0 586 936 ;
+C -1 ; WX 611 ; N Zcaron ; B 25 0 586 936 ;
+C -1 ; WX 549 ; N greaterequal ; B 26 0 523 704 ;
+C -1 ; WX 722 ; N Eth ; B -5 0 685 718 ;
+C -1 ; WX 722 ; N Ccedilla ; B 44 -228 684 737 ;
+C -1 ; WX 278 ; N lcommaaccent ; B 69 -228 213 718 ;
+C -1 ; WX 389 ; N tcaron ; B 10 -6 421 878 ;
+C -1 ; WX 556 ; N eogonek ; B 23 -228 528 546 ;
+C -1 ; WX 722 ; N Uogonek ; B 72 -228 651 718 ;
+C -1 ; WX 722 ; N Aacute ; B 20 0 702 936 ;
+C -1 ; WX 722 ; N Adieresis ; B 20 0 702 915 ;
+C -1 ; WX 556 ; N egrave ; B 23 -14 528 750 ;
+C -1 ; WX 500 ; N zacute ; B 20 0 480 750 ;
+C -1 ; WX 278 ; N iogonek ; B 16 -224 249 725 ;
+C -1 ; WX 778 ; N Oacute ; B 44 -19 734 936 ;
+C -1 ; WX 611 ; N oacute ; B 34 -14 578 750 ;
+C -1 ; WX 556 ; N amacron ; B 29 -14 527 678 ;
+C -1 ; WX 556 ; N sacute ; B 30 -14 519 750 ;
+C -1 ; WX 278 ; N idieresis ; B -21 0 300 729 ;
+C -1 ; WX 778 ; N Ocircumflex ; B 44 -19 734 936 ;
+C -1 ; WX 722 ; N Ugrave ; B 72 -19 651 936 ;
+C -1 ; WX 612 ; N Delta ; B 6 0 608 688 ;
+C -1 ; WX 611 ; N thorn ; B 62 -208 578 718 ;
+C -1 ; WX 333 ; N twosuperior ; B 9 283 324 710 ;
+C -1 ; WX 778 ; N Odieresis ; B 44 -19 734 915 ;
+C -1 ; WX 611 ; N mu ; B 66 -207 545 532 ;
+C -1 ; WX 278 ; N igrave ; B -50 0 209 750 ;
+C -1 ; WX 611 ; N ohungarumlaut ; B 34 -14 625 750 ;
+C -1 ; WX 667 ; N Eogonek ; B 76 -224 639 718 ;
+C -1 ; WX 611 ; N dcroat ; B 34 -14 650 718 ;
+C -1 ; WX 834 ; N threequarters ; B 16 -19 799 710 ;
+C -1 ; WX 667 ; N Scedilla ; B 39 -228 629 737 ;
+C -1 ; WX 400 ; N lcaron ; B 69 0 408 718 ;
+C -1 ; WX 722 ; N Kcommaaccent ; B 87 -228 722 718 ;
+C -1 ; WX 611 ; N Lacute ; B 76 0 583 936 ;
+C -1 ; WX 1000 ; N trademark ; B 44 306 956 718 ;
+C -1 ; WX 556 ; N edotaccent ; B 23 -14 528 729 ;
+C -1 ; WX 278 ; N Igrave ; B -50 0 214 936 ;
+C -1 ; WX 278 ; N Imacron ; B -33 0 312 864 ;
+C -1 ; WX 611 ; N Lcaron ; B 76 0 583 718 ;
+C -1 ; WX 834 ; N onehalf ; B 26 -19 794 710 ;
+C -1 ; WX 549 ; N lessequal ; B 29 0 526 704 ;
+C -1 ; WX 611 ; N ocircumflex ; B 34 -14 578 750 ;
+C -1 ; WX 611 ; N ntilde ; B 65 0 546 737 ;
+C -1 ; WX 722 ; N Uhungarumlaut ; B 72 -19 681 936 ;
+C -1 ; WX 667 ; N Eacute ; B 76 0 621 936 ;
+C -1 ; WX 556 ; N emacron ; B 23 -14 528 678 ;
+C -1 ; WX 611 ; N gbreve ; B 40 -217 553 750 ;
+C -1 ; WX 834 ; N onequarter ; B 26 -19 766 710 ;
+C -1 ; WX 667 ; N Scaron ; B 39 -19 629 936 ;
+C -1 ; WX 667 ; N Scommaaccent ; B 39 -228 629 737 ;
+C -1 ; WX 778 ; N Ohungarumlaut ; B 44 -19 734 936 ;
+C -1 ; WX 400 ; N degree ; B 57 426 343 712 ;
+C -1 ; WX 611 ; N ograve ; B 34 -14 578 750 ;
+C -1 ; WX 722 ; N Ccaron ; B 44 -19 684 936 ;
+C -1 ; WX 611 ; N ugrave ; B 66 -14 545 750 ;
+C -1 ; WX 549 ; N radical ; B 10 -46 512 850 ;
+C -1 ; WX 722 ; N Dcaron ; B 76 0 685 936 ;
+C -1 ; WX 389 ; N rcommaaccent ; B 64 -228 373 546 ;
+C -1 ; WX 722 ; N Ntilde ; B 69 0 654 923 ;
+C -1 ; WX 611 ; N otilde ; B 34 -14 578 737 ;
+C -1 ; WX 722 ; N Rcommaaccent ; B 76 -228 677 718 ;
+C -1 ; WX 611 ; N Lcommaaccent ; B 76 -228 583 718 ;
+C -1 ; WX 722 ; N Atilde ; B 20 0 702 923 ;
+C -1 ; WX 722 ; N Aogonek ; B 20 -224 742 718 ;
+C -1 ; WX 722 ; N Aring ; B 20 0 702 962 ;
+C -1 ; WX 778 ; N Otilde ; B 44 -19 734 923 ;
+C -1 ; WX 500 ; N zdotaccent ; B 20 0 480 729 ;
+C -1 ; WX 667 ; N Ecaron ; B 76 0 621 936 ;
+C -1 ; WX 278 ; N Iogonek ; B -11 -228 222 718 ;
+C -1 ; WX 556 ; N kcommaaccent ; B 69 -228 562 718 ;
+C -1 ; WX 584 ; N minus ; B 40 197 544 309 ;
+C -1 ; WX 278 ; N Icircumflex ; B -37 0 316 936 ;
+C -1 ; WX 611 ; N ncaron ; B 65 0 546 750 ;
+C -1 ; WX 333 ; N tcommaaccent ; B 10 -228 309 676 ;
+C -1 ; WX 584 ; N logicalnot ; B 40 108 544 419 ;
+C -1 ; WX 611 ; N odieresis ; B 34 -14 578 729 ;
+C -1 ; WX 611 ; N udieresis ; B 66 -14 545 729 ;
+C -1 ; WX 549 ; N notequal ; B 15 -49 540 570 ;
+C -1 ; WX 611 ; N gcommaaccent ; B 40 -217 553 850 ;
+C -1 ; WX 611 ; N eth ; B 34 -14 578 737 ;
+C -1 ; WX 500 ; N zcaron ; B 20 0 480 750 ;
+C -1 ; WX 611 ; N ncommaaccent ; B 65 -228 546 546 ;
+C -1 ; WX 333 ; N onesuperior ; B 26 283 237 710 ;
+C -1 ; WX 278 ; N imacron ; B -8 0 285 678 ;
+C -1 ; WX 556 ; N Euro ; B 0 0 0 0 ;
+EndCharMetrics
+StartKernData
+StartKernPairs 2481
+KPX A C -40
+KPX A Cacute -40
+KPX A Ccaron -40
+KPX A Ccedilla -40
+KPX A G -50
+KPX A Gbreve -50
+KPX A Gcommaaccent -50
+KPX A O -40
+KPX A Oacute -40
+KPX A Ocircumflex -40
+KPX A Odieresis -40
+KPX A Ograve -40
+KPX A Ohungarumlaut -40
+KPX A Omacron -40
+KPX A Oslash -40
+KPX A Otilde -40
+KPX A Q -40
+KPX A T -90
+KPX A Tcaron -90
+KPX A Tcommaaccent -90
+KPX A U -50
+KPX A Uacute -50
+KPX A Ucircumflex -50
+KPX A Udieresis -50
+KPX A Ugrave -50
+KPX A Uhungarumlaut -50
+KPX A Umacron -50
+KPX A Uogonek -50
+KPX A Uring -50
+KPX A V -80
+KPX A W -60
+KPX A Y -110
+KPX A Yacute -110
+KPX A Ydieresis -110
+KPX A u -30
+KPX A uacute -30
+KPX A ucircumflex -30
+KPX A udieresis -30
+KPX A ugrave -30
+KPX A uhungarumlaut -30
+KPX A umacron -30
+KPX A uogonek -30
+KPX A uring -30
+KPX A v -40
+KPX A w -30
+KPX A y -30
+KPX A yacute -30
+KPX A ydieresis -30
+KPX Aacute C -40
+KPX Aacute Cacute -40
+KPX Aacute Ccaron -40
+KPX Aacute Ccedilla -40
+KPX Aacute G -50
+KPX Aacute Gbreve -50
+KPX Aacute Gcommaaccent -50
+KPX Aacute O -40
+KPX Aacute Oacute -40
+KPX Aacute Ocircumflex -40
+KPX Aacute Odieresis -40
+KPX Aacute Ograve -40
+KPX Aacute Ohungarumlaut -40
+KPX Aacute Omacron -40
+KPX Aacute Oslash -40
+KPX Aacute Otilde -40
+KPX Aacute Q -40
+KPX Aacute T -90
+KPX Aacute Tcaron -90
+KPX Aacute Tcommaaccent -90
+KPX Aacute U -50
+KPX Aacute Uacute -50
+KPX Aacute Ucircumflex -50
+KPX Aacute Udieresis -50
+KPX Aacute Ugrave -50
+KPX Aacute Uhungarumlaut -50
+KPX Aacute Umacron -50
+KPX Aacute Uogonek -50
+KPX Aacute Uring -50
+KPX Aacute V -80
+KPX Aacute W -60
+KPX Aacute Y -110
+KPX Aacute Yacute -110
+KPX Aacute Ydieresis -110
+KPX Aacute u -30
+KPX Aacute uacute -30
+KPX Aacute ucircumflex -30
+KPX Aacute udieresis -30
+KPX Aacute ugrave -30
+KPX Aacute uhungarumlaut -30
+KPX Aacute umacron -30
+KPX Aacute uogonek -30
+KPX Aacute uring -30
+KPX Aacute v -40
+KPX Aacute w -30
+KPX Aacute y -30
+KPX Aacute yacute -30
+KPX Aacute ydieresis -30
+KPX Abreve C -40
+KPX Abreve Cacute -40
+KPX Abreve Ccaron -40
+KPX Abreve Ccedilla -40
+KPX Abreve G -50
+KPX Abreve Gbreve -50
+KPX Abreve Gcommaaccent -50
+KPX Abreve O -40
+KPX Abreve Oacute -40
+KPX Abreve Ocircumflex -40
+KPX Abreve Odieresis -40
+KPX Abreve Ograve -40
+KPX Abreve Ohungarumlaut -40
+KPX Abreve Omacron -40
+KPX Abreve Oslash -40
+KPX Abreve Otilde -40
+KPX Abreve Q -40
+KPX Abreve T -90
+KPX Abreve Tcaron -90
+KPX Abreve Tcommaaccent -90
+KPX Abreve U -50
+KPX Abreve Uacute -50
+KPX Abreve Ucircumflex -50
+KPX Abreve Udieresis -50
+KPX Abreve Ugrave -50
+KPX Abreve Uhungarumlaut -50
+KPX Abreve Umacron -50
+KPX Abreve Uogonek -50
+KPX Abreve Uring -50
+KPX Abreve V -80
+KPX Abreve W -60
+KPX Abreve Y -110
+KPX Abreve Yacute -110
+KPX Abreve Ydieresis -110
+KPX Abreve u -30
+KPX Abreve uacute -30
+KPX Abreve ucircumflex -30
+KPX Abreve udieresis -30
+KPX Abreve ugrave -30
+KPX Abreve uhungarumlaut -30
+KPX Abreve umacron -30
+KPX Abreve uogonek -30
+KPX Abreve uring -30
+KPX Abreve v -40
+KPX Abreve w -30
+KPX Abreve y -30
+KPX Abreve yacute -30
+KPX Abreve ydieresis -30
+KPX Acircumflex C -40
+KPX Acircumflex Cacute -40
+KPX Acircumflex Ccaron -40
+KPX Acircumflex Ccedilla -40
+KPX Acircumflex G -50
+KPX Acircumflex Gbreve -50
+KPX Acircumflex Gcommaaccent -50
+KPX Acircumflex O -40
+KPX Acircumflex Oacute -40
+KPX Acircumflex Ocircumflex -40
+KPX Acircumflex Odieresis -40
+KPX Acircumflex Ograve -40
+KPX Acircumflex Ohungarumlaut -40
+KPX Acircumflex Omacron -40
+KPX Acircumflex Oslash -40
+KPX Acircumflex Otilde -40
+KPX Acircumflex Q -40
+KPX Acircumflex T -90
+KPX Acircumflex Tcaron -90
+KPX Acircumflex Tcommaaccent -90
+KPX Acircumflex U -50
+KPX Acircumflex Uacute -50
+KPX Acircumflex Ucircumflex -50
+KPX Acircumflex Udieresis -50
+KPX Acircumflex Ugrave -50
+KPX Acircumflex Uhungarumlaut -50
+KPX Acircumflex Umacron -50
+KPX Acircumflex Uogonek -50
+KPX Acircumflex Uring -50
+KPX Acircumflex V -80
+KPX Acircumflex W -60
+KPX Acircumflex Y -110
+KPX Acircumflex Yacute -110
+KPX Acircumflex Ydieresis -110
+KPX Acircumflex u -30
+KPX Acircumflex uacute -30
+KPX Acircumflex ucircumflex -30
+KPX Acircumflex udieresis -30
+KPX Acircumflex ugrave -30
+KPX Acircumflex uhungarumlaut -30
+KPX Acircumflex umacron -30
+KPX Acircumflex uogonek -30
+KPX Acircumflex uring -30
+KPX Acircumflex v -40
+KPX Acircumflex w -30
+KPX Acircumflex y -30
+KPX Acircumflex yacute -30
+KPX Acircumflex ydieresis -30
+KPX Adieresis C -40
+KPX Adieresis Cacute -40
+KPX Adieresis Ccaron -40
+KPX Adieresis Ccedilla -40
+KPX Adieresis G -50
+KPX Adieresis Gbreve -50
+KPX Adieresis Gcommaaccent -50
+KPX Adieresis O -40
+KPX Adieresis Oacute -40
+KPX Adieresis Ocircumflex -40
+KPX Adieresis Odieresis -40
+KPX Adieresis Ograve -40
+KPX Adieresis Ohungarumlaut -40
+KPX Adieresis Omacron -40
+KPX Adieresis Oslash -40
+KPX Adieresis Otilde -40
+KPX Adieresis Q -40
+KPX Adieresis T -90
+KPX Adieresis Tcaron -90
+KPX Adieresis Tcommaaccent -90
+KPX Adieresis U -50
+KPX Adieresis Uacute -50
+KPX Adieresis Ucircumflex -50
+KPX Adieresis Udieresis -50
+KPX Adieresis Ugrave -50
+KPX Adieresis Uhungarumlaut -50
+KPX Adieresis Umacron -50
+KPX Adieresis Uogonek -50
+KPX Adieresis Uring -50
+KPX Adieresis V -80
+KPX Adieresis W -60
+KPX Adieresis Y -110
+KPX Adieresis Yacute -110
+KPX Adieresis Ydieresis -110
+KPX Adieresis u -30
+KPX Adieresis uacute -30
+KPX Adieresis ucircumflex -30
+KPX Adieresis udieresis -30
+KPX Adieresis ugrave -30
+KPX Adieresis uhungarumlaut -30
+KPX Adieresis umacron -30
+KPX Adieresis uogonek -30
+KPX Adieresis uring -30
+KPX Adieresis v -40
+KPX Adieresis w -30
+KPX Adieresis y -30
+KPX Adieresis yacute -30
+KPX Adieresis ydieresis -30
+KPX Agrave C -40
+KPX Agrave Cacute -40
+KPX Agrave Ccaron -40
+KPX Agrave Ccedilla -40
+KPX Agrave G -50
+KPX Agrave Gbreve -50
+KPX Agrave Gcommaaccent -50
+KPX Agrave O -40
+KPX Agrave Oacute -40
+KPX Agrave Ocircumflex -40
+KPX Agrave Odieresis -40
+KPX Agrave Ograve -40
+KPX Agrave Ohungarumlaut -40
+KPX Agrave Omacron -40
+KPX Agrave Oslash -40
+KPX Agrave Otilde -40
+KPX Agrave Q -40
+KPX Agrave T -90
+KPX Agrave Tcaron -90
+KPX Agrave Tcommaaccent -90
+KPX Agrave U -50
+KPX Agrave Uacute -50
+KPX Agrave Ucircumflex -50
+KPX Agrave Udieresis -50
+KPX Agrave Ugrave -50
+KPX Agrave Uhungarumlaut -50
+KPX Agrave Umacron -50
+KPX Agrave Uogonek -50
+KPX Agrave Uring -50
+KPX Agrave V -80
+KPX Agrave W -60
+KPX Agrave Y -110
+KPX Agrave Yacute -110
+KPX Agrave Ydieresis -110
+KPX Agrave u -30
+KPX Agrave uacute -30
+KPX Agrave ucircumflex -30
+KPX Agrave udieresis -30
+KPX Agrave ugrave -30
+KPX Agrave uhungarumlaut -30
+KPX Agrave umacron -30
+KPX Agrave uogonek -30
+KPX Agrave uring -30
+KPX Agrave v -40
+KPX Agrave w -30
+KPX Agrave y -30
+KPX Agrave yacute -30
+KPX Agrave ydieresis -30
+KPX Amacron C -40
+KPX Amacron Cacute -40
+KPX Amacron Ccaron -40
+KPX Amacron Ccedilla -40
+KPX Amacron G -50
+KPX Amacron Gbreve -50
+KPX Amacron Gcommaaccent -50
+KPX Amacron O -40
+KPX Amacron Oacute -40
+KPX Amacron Ocircumflex -40
+KPX Amacron Odieresis -40
+KPX Amacron Ograve -40
+KPX Amacron Ohungarumlaut -40
+KPX Amacron Omacron -40
+KPX Amacron Oslash -40
+KPX Amacron Otilde -40
+KPX Amacron Q -40
+KPX Amacron T -90
+KPX Amacron Tcaron -90
+KPX Amacron Tcommaaccent -90
+KPX Amacron U -50
+KPX Amacron Uacute -50
+KPX Amacron Ucircumflex -50
+KPX Amacron Udieresis -50
+KPX Amacron Ugrave -50
+KPX Amacron Uhungarumlaut -50
+KPX Amacron Umacron -50
+KPX Amacron Uogonek -50
+KPX Amacron Uring -50
+KPX Amacron V -80
+KPX Amacron W -60
+KPX Amacron Y -110
+KPX Amacron Yacute -110
+KPX Amacron Ydieresis -110
+KPX Amacron u -30
+KPX Amacron uacute -30
+KPX Amacron ucircumflex -30
+KPX Amacron udieresis -30
+KPX Amacron ugrave -30
+KPX Amacron uhungarumlaut -30
+KPX Amacron umacron -30
+KPX Amacron uogonek -30
+KPX Amacron uring -30
+KPX Amacron v -40
+KPX Amacron w -30
+KPX Amacron y -30
+KPX Amacron yacute -30
+KPX Amacron ydieresis -30
+KPX Aogonek C -40
+KPX Aogonek Cacute -40
+KPX Aogonek Ccaron -40
+KPX Aogonek Ccedilla -40
+KPX Aogonek G -50
+KPX Aogonek Gbreve -50
+KPX Aogonek Gcommaaccent -50
+KPX Aogonek O -40
+KPX Aogonek Oacute -40
+KPX Aogonek Ocircumflex -40
+KPX Aogonek Odieresis -40
+KPX Aogonek Ograve -40
+KPX Aogonek Ohungarumlaut -40
+KPX Aogonek Omacron -40
+KPX Aogonek Oslash -40
+KPX Aogonek Otilde -40
+KPX Aogonek Q -40
+KPX Aogonek T -90
+KPX Aogonek Tcaron -90
+KPX Aogonek Tcommaaccent -90
+KPX Aogonek U -50
+KPX Aogonek Uacute -50
+KPX Aogonek Ucircumflex -50
+KPX Aogonek Udieresis -50
+KPX Aogonek Ugrave -50
+KPX Aogonek Uhungarumlaut -50
+KPX Aogonek Umacron -50
+KPX Aogonek Uogonek -50
+KPX Aogonek Uring -50
+KPX Aogonek V -80
+KPX Aogonek W -60
+KPX Aogonek Y -110
+KPX Aogonek Yacute -110
+KPX Aogonek Ydieresis -110
+KPX Aogonek u -30
+KPX Aogonek uacute -30
+KPX Aogonek ucircumflex -30
+KPX Aogonek udieresis -30
+KPX Aogonek ugrave -30
+KPX Aogonek uhungarumlaut -30
+KPX Aogonek umacron -30
+KPX Aogonek uogonek -30
+KPX Aogonek uring -30
+KPX Aogonek v -40
+KPX Aogonek w -30
+KPX Aogonek y -30
+KPX Aogonek yacute -30
+KPX Aogonek ydieresis -30
+KPX Aring C -40
+KPX Aring Cacute -40
+KPX Aring Ccaron -40
+KPX Aring Ccedilla -40
+KPX Aring G -50
+KPX Aring Gbreve -50
+KPX Aring Gcommaaccent -50
+KPX Aring O -40
+KPX Aring Oacute -40
+KPX Aring Ocircumflex -40
+KPX Aring Odieresis -40
+KPX Aring Ograve -40
+KPX Aring Ohungarumlaut -40
+KPX Aring Omacron -40
+KPX Aring Oslash -40
+KPX Aring Otilde -40
+KPX Aring Q -40
+KPX Aring T -90
+KPX Aring Tcaron -90
+KPX Aring Tcommaaccent -90
+KPX Aring U -50
+KPX Aring Uacute -50
+KPX Aring Ucircumflex -50
+KPX Aring Udieresis -50
+KPX Aring Ugrave -50
+KPX Aring Uhungarumlaut -50
+KPX Aring Umacron -50
+KPX Aring Uogonek -50
+KPX Aring Uring -50
+KPX Aring V -80
+KPX Aring W -60
+KPX Aring Y -110
+KPX Aring Yacute -110
+KPX Aring Ydieresis -110
+KPX Aring u -30
+KPX Aring uacute -30
+KPX Aring ucircumflex -30
+KPX Aring udieresis -30
+KPX Aring ugrave -30
+KPX Aring uhungarumlaut -30
+KPX Aring umacron -30
+KPX Aring uogonek -30
+KPX Aring uring -30
+KPX Aring v -40
+KPX Aring w -30
+KPX Aring y -30
+KPX Aring yacute -30
+KPX Aring ydieresis -30
+KPX Atilde C -40
+KPX Atilde Cacute -40
+KPX Atilde Ccaron -40
+KPX Atilde Ccedilla -40
+KPX Atilde G -50
+KPX Atilde Gbreve -50
+KPX Atilde Gcommaaccent -50
+KPX Atilde O -40
+KPX Atilde Oacute -40
+KPX Atilde Ocircumflex -40
+KPX Atilde Odieresis -40
+KPX Atilde Ograve -40
+KPX Atilde Ohungarumlaut -40
+KPX Atilde Omacron -40
+KPX Atilde Oslash -40
+KPX Atilde Otilde -40
+KPX Atilde Q -40
+KPX Atilde T -90
+KPX Atilde Tcaron -90
+KPX Atilde Tcommaaccent -90
+KPX Atilde U -50
+KPX Atilde Uacute -50
+KPX Atilde Ucircumflex -50
+KPX Atilde Udieresis -50
+KPX Atilde Ugrave -50
+KPX Atilde Uhungarumlaut -50
+KPX Atilde Umacron -50
+KPX Atilde Uogonek -50
+KPX Atilde Uring -50
+KPX Atilde V -80
+KPX Atilde W -60
+KPX Atilde Y -110
+KPX Atilde Yacute -110
+KPX Atilde Ydieresis -110
+KPX Atilde u -30
+KPX Atilde uacute -30
+KPX Atilde ucircumflex -30
+KPX Atilde udieresis -30
+KPX Atilde ugrave -30
+KPX Atilde uhungarumlaut -30
+KPX Atilde umacron -30
+KPX Atilde uogonek -30
+KPX Atilde uring -30
+KPX Atilde v -40
+KPX Atilde w -30
+KPX Atilde y -30
+KPX Atilde yacute -30
+KPX Atilde ydieresis -30
+KPX B A -30
+KPX B Aacute -30
+KPX B Abreve -30
+KPX B Acircumflex -30
+KPX B Adieresis -30
+KPX B Agrave -30
+KPX B Amacron -30
+KPX B Aogonek -30
+KPX B Aring -30
+KPX B Atilde -30
+KPX B U -10
+KPX B Uacute -10
+KPX B Ucircumflex -10
+KPX B Udieresis -10
+KPX B Ugrave -10
+KPX B Uhungarumlaut -10
+KPX B Umacron -10
+KPX B Uogonek -10
+KPX B Uring -10
+KPX D A -40
+KPX D Aacute -40
+KPX D Abreve -40
+KPX D Acircumflex -40
+KPX D Adieresis -40
+KPX D Agrave -40
+KPX D Amacron -40
+KPX D Aogonek -40
+KPX D Aring -40
+KPX D Atilde -40
+KPX D V -40
+KPX D W -40
+KPX D Y -70
+KPX D Yacute -70
+KPX D Ydieresis -70
+KPX D comma -30
+KPX D period -30
+KPX Dcaron A -40
+KPX Dcaron Aacute -40
+KPX Dcaron Abreve -40
+KPX Dcaron Acircumflex -40
+KPX Dcaron Adieresis -40
+KPX Dcaron Agrave -40
+KPX Dcaron Amacron -40
+KPX Dcaron Aogonek -40
+KPX Dcaron Aring -40
+KPX Dcaron Atilde -40
+KPX Dcaron V -40
+KPX Dcaron W -40
+KPX Dcaron Y -70
+KPX Dcaron Yacute -70
+KPX Dcaron Ydieresis -70
+KPX Dcaron comma -30
+KPX Dcaron period -30
+KPX Dcroat A -40
+KPX Dcroat Aacute -40
+KPX Dcroat Abreve -40
+KPX Dcroat Acircumflex -40
+KPX Dcroat Adieresis -40
+KPX Dcroat Agrave -40
+KPX Dcroat Amacron -40
+KPX Dcroat Aogonek -40
+KPX Dcroat Aring -40
+KPX Dcroat Atilde -40
+KPX Dcroat V -40
+KPX Dcroat W -40
+KPX Dcroat Y -70
+KPX Dcroat Yacute -70
+KPX Dcroat Ydieresis -70
+KPX Dcroat comma -30
+KPX Dcroat period -30
+KPX F A -80
+KPX F Aacute -80
+KPX F Abreve -80
+KPX F Acircumflex -80
+KPX F Adieresis -80
+KPX F Agrave -80
+KPX F Amacron -80
+KPX F Aogonek -80
+KPX F Aring -80
+KPX F Atilde -80
+KPX F a -20
+KPX F aacute -20
+KPX F abreve -20
+KPX F acircumflex -20
+KPX F adieresis -20
+KPX F agrave -20
+KPX F amacron -20
+KPX F aogonek -20
+KPX F aring -20
+KPX F atilde -20
+KPX F comma -100
+KPX F period -100
+KPX J A -20
+KPX J Aacute -20
+KPX J Abreve -20
+KPX J Acircumflex -20
+KPX J Adieresis -20
+KPX J Agrave -20
+KPX J Amacron -20
+KPX J Aogonek -20
+KPX J Aring -20
+KPX J Atilde -20
+KPX J comma -20
+KPX J period -20
+KPX J u -20
+KPX J uacute -20
+KPX J ucircumflex -20
+KPX J udieresis -20
+KPX J ugrave -20
+KPX J uhungarumlaut -20
+KPX J umacron -20
+KPX J uogonek -20
+KPX J uring -20
+KPX K O -30
+KPX K Oacute -30
+KPX K Ocircumflex -30
+KPX K Odieresis -30
+KPX K Ograve -30
+KPX K Ohungarumlaut -30
+KPX K Omacron -30
+KPX K Oslash -30
+KPX K Otilde -30
+KPX K e -15
+KPX K eacute -15
+KPX K ecaron -15
+KPX K ecircumflex -15
+KPX K edieresis -15
+KPX K edotaccent -15
+KPX K egrave -15
+KPX K emacron -15
+KPX K eogonek -15
+KPX K o -35
+KPX K oacute -35
+KPX K ocircumflex -35
+KPX K odieresis -35
+KPX K ograve -35
+KPX K ohungarumlaut -35
+KPX K omacron -35
+KPX K oslash -35
+KPX K otilde -35
+KPX K u -30
+KPX K uacute -30
+KPX K ucircumflex -30
+KPX K udieresis -30
+KPX K ugrave -30
+KPX K uhungarumlaut -30
+KPX K umacron -30
+KPX K uogonek -30
+KPX K uring -30
+KPX K y -40
+KPX K yacute -40
+KPX K ydieresis -40
+KPX Kcommaaccent O -30
+KPX Kcommaaccent Oacute -30
+KPX Kcommaaccent Ocircumflex -30
+KPX Kcommaaccent Odieresis -30
+KPX Kcommaaccent Ograve -30
+KPX Kcommaaccent Ohungarumlaut -30
+KPX Kcommaaccent Omacron -30
+KPX Kcommaaccent Oslash -30
+KPX Kcommaaccent Otilde -30
+KPX Kcommaaccent e -15
+KPX Kcommaaccent eacute -15
+KPX Kcommaaccent ecaron -15
+KPX Kcommaaccent ecircumflex -15
+KPX Kcommaaccent edieresis -15
+KPX Kcommaaccent edotaccent -15
+KPX Kcommaaccent egrave -15
+KPX Kcommaaccent emacron -15
+KPX Kcommaaccent eogonek -15
+KPX Kcommaaccent o -35
+KPX Kcommaaccent oacute -35
+KPX Kcommaaccent ocircumflex -35
+KPX Kcommaaccent odieresis -35
+KPX Kcommaaccent ograve -35
+KPX Kcommaaccent ohungarumlaut -35
+KPX Kcommaaccent omacron -35
+KPX Kcommaaccent oslash -35
+KPX Kcommaaccent otilde -35
+KPX Kcommaaccent u -30
+KPX Kcommaaccent uacute -30
+KPX Kcommaaccent ucircumflex -30
+KPX Kcommaaccent udieresis -30
+KPX Kcommaaccent ugrave -30
+KPX Kcommaaccent uhungarumlaut -30
+KPX Kcommaaccent umacron -30
+KPX Kcommaaccent uogonek -30
+KPX Kcommaaccent uring -30
+KPX Kcommaaccent y -40
+KPX Kcommaaccent yacute -40
+KPX Kcommaaccent ydieresis -40
+KPX L T -90
+KPX L Tcaron -90
+KPX L Tcommaaccent -90
+KPX L V -110
+KPX L W -80
+KPX L Y -120
+KPX L Yacute -120
+KPX L Ydieresis -120
+KPX L quotedblright -140
+KPX L quoteright -140
+KPX L y -30
+KPX L yacute -30
+KPX L ydieresis -30
+KPX Lacute T -90
+KPX Lacute Tcaron -90
+KPX Lacute Tcommaaccent -90
+KPX Lacute V -110
+KPX Lacute W -80
+KPX Lacute Y -120
+KPX Lacute Yacute -120
+KPX Lacute Ydieresis -120
+KPX Lacute quotedblright -140
+KPX Lacute quoteright -140
+KPX Lacute y -30
+KPX Lacute yacute -30
+KPX Lacute ydieresis -30
+KPX Lcommaaccent T -90
+KPX Lcommaaccent Tcaron -90
+KPX Lcommaaccent Tcommaaccent -90
+KPX Lcommaaccent V -110
+KPX Lcommaaccent W -80
+KPX Lcommaaccent Y -120
+KPX Lcommaaccent Yacute -120
+KPX Lcommaaccent Ydieresis -120
+KPX Lcommaaccent quotedblright -140
+KPX Lcommaaccent quoteright -140
+KPX Lcommaaccent y -30
+KPX Lcommaaccent yacute -30
+KPX Lcommaaccent ydieresis -30
+KPX Lslash T -90
+KPX Lslash Tcaron -90
+KPX Lslash Tcommaaccent -90
+KPX Lslash V -110
+KPX Lslash W -80
+KPX Lslash Y -120
+KPX Lslash Yacute -120
+KPX Lslash Ydieresis -120
+KPX Lslash quotedblright -140
+KPX Lslash quoteright -140
+KPX Lslash y -30
+KPX Lslash yacute -30
+KPX Lslash ydieresis -30
+KPX O A -50
+KPX O Aacute -50
+KPX O Abreve -50
+KPX O Acircumflex -50
+KPX O Adieresis -50
+KPX O Agrave -50
+KPX O Amacron -50
+KPX O Aogonek -50
+KPX O Aring -50
+KPX O Atilde -50
+KPX O T -40
+KPX O Tcaron -40
+KPX O Tcommaaccent -40
+KPX O V -50
+KPX O W -50
+KPX O X -50
+KPX O Y -70
+KPX O Yacute -70
+KPX O Ydieresis -70
+KPX O comma -40
+KPX O period -40
+KPX Oacute A -50
+KPX Oacute Aacute -50
+KPX Oacute Abreve -50
+KPX Oacute Acircumflex -50
+KPX Oacute Adieresis -50
+KPX Oacute Agrave -50
+KPX Oacute Amacron -50
+KPX Oacute Aogonek -50
+KPX Oacute Aring -50
+KPX Oacute Atilde -50
+KPX Oacute T -40
+KPX Oacute Tcaron -40
+KPX Oacute Tcommaaccent -40
+KPX Oacute V -50
+KPX Oacute W -50
+KPX Oacute X -50
+KPX Oacute Y -70
+KPX Oacute Yacute -70
+KPX Oacute Ydieresis -70
+KPX Oacute comma -40
+KPX Oacute period -40
+KPX Ocircumflex A -50
+KPX Ocircumflex Aacute -50
+KPX Ocircumflex Abreve -50
+KPX Ocircumflex Acircumflex -50
+KPX Ocircumflex Adieresis -50
+KPX Ocircumflex Agrave -50
+KPX Ocircumflex Amacron -50
+KPX Ocircumflex Aogonek -50
+KPX Ocircumflex Aring -50
+KPX Ocircumflex Atilde -50
+KPX Ocircumflex T -40
+KPX Ocircumflex Tcaron -40
+KPX Ocircumflex Tcommaaccent -40
+KPX Ocircumflex V -50
+KPX Ocircumflex W -50
+KPX Ocircumflex X -50
+KPX Ocircumflex Y -70
+KPX Ocircumflex Yacute -70
+KPX Ocircumflex Ydieresis -70
+KPX Ocircumflex comma -40
+KPX Ocircumflex period -40
+KPX Odieresis A -50
+KPX Odieresis Aacute -50
+KPX Odieresis Abreve -50
+KPX Odieresis Acircumflex -50
+KPX Odieresis Adieresis -50
+KPX Odieresis Agrave -50
+KPX Odieresis Amacron -50
+KPX Odieresis Aogonek -50
+KPX Odieresis Aring -50
+KPX Odieresis Atilde -50
+KPX Odieresis T -40
+KPX Odieresis Tcaron -40
+KPX Odieresis Tcommaaccent -40
+KPX Odieresis V -50
+KPX Odieresis W -50
+KPX Odieresis X -50
+KPX Odieresis Y -70
+KPX Odieresis Yacute -70
+KPX Odieresis Ydieresis -70
+KPX Odieresis comma -40
+KPX Odieresis period -40
+KPX Ograve A -50
+KPX Ograve Aacute -50
+KPX Ograve Abreve -50
+KPX Ograve Acircumflex -50
+KPX Ograve Adieresis -50
+KPX Ograve Agrave -50
+KPX Ograve Amacron -50
+KPX Ograve Aogonek -50
+KPX Ograve Aring -50
+KPX Ograve Atilde -50
+KPX Ograve T -40
+KPX Ograve Tcaron -40
+KPX Ograve Tcommaaccent -40
+KPX Ograve V -50
+KPX Ograve W -50
+KPX Ograve X -50
+KPX Ograve Y -70
+KPX Ograve Yacute -70
+KPX Ograve Ydieresis -70
+KPX Ograve comma -40
+KPX Ograve period -40
+KPX Ohungarumlaut A -50
+KPX Ohungarumlaut Aacute -50
+KPX Ohungarumlaut Abreve -50
+KPX Ohungarumlaut Acircumflex -50
+KPX Ohungarumlaut Adieresis -50
+KPX Ohungarumlaut Agrave -50
+KPX Ohungarumlaut Amacron -50
+KPX Ohungarumlaut Aogonek -50
+KPX Ohungarumlaut Aring -50
+KPX Ohungarumlaut Atilde -50
+KPX Ohungarumlaut T -40
+KPX Ohungarumlaut Tcaron -40
+KPX Ohungarumlaut Tcommaaccent -40
+KPX Ohungarumlaut V -50
+KPX Ohungarumlaut W -50
+KPX Ohungarumlaut X -50
+KPX Ohungarumlaut Y -70
+KPX Ohungarumlaut Yacute -70
+KPX Ohungarumlaut Ydieresis -70
+KPX Ohungarumlaut comma -40
+KPX Ohungarumlaut period -40
+KPX Omacron A -50
+KPX Omacron Aacute -50
+KPX Omacron Abreve -50
+KPX Omacron Acircumflex -50
+KPX Omacron Adieresis -50
+KPX Omacron Agrave -50
+KPX Omacron Amacron -50
+KPX Omacron Aogonek -50
+KPX Omacron Aring -50
+KPX Omacron Atilde -50
+KPX Omacron T -40
+KPX Omacron Tcaron -40
+KPX Omacron Tcommaaccent -40
+KPX Omacron V -50
+KPX Omacron W -50
+KPX Omacron X -50
+KPX Omacron Y -70
+KPX Omacron Yacute -70
+KPX Omacron Ydieresis -70
+KPX Omacron comma -40
+KPX Omacron period -40
+KPX Oslash A -50
+KPX Oslash Aacute -50
+KPX Oslash Abreve -50
+KPX Oslash Acircumflex -50
+KPX Oslash Adieresis -50
+KPX Oslash Agrave -50
+KPX Oslash Amacron -50
+KPX Oslash Aogonek -50
+KPX Oslash Aring -50
+KPX Oslash Atilde -50
+KPX Oslash T -40
+KPX Oslash Tcaron -40
+KPX Oslash Tcommaaccent -40
+KPX Oslash V -50
+KPX Oslash W -50
+KPX Oslash X -50
+KPX Oslash Y -70
+KPX Oslash Yacute -70
+KPX Oslash Ydieresis -70
+KPX Oslash comma -40
+KPX Oslash period -40
+KPX Otilde A -50
+KPX Otilde Aacute -50
+KPX Otilde Abreve -50
+KPX Otilde Acircumflex -50
+KPX Otilde Adieresis -50
+KPX Otilde Agrave -50
+KPX Otilde Amacron -50
+KPX Otilde Aogonek -50
+KPX Otilde Aring -50
+KPX Otilde Atilde -50
+KPX Otilde T -40
+KPX Otilde Tcaron -40
+KPX Otilde Tcommaaccent -40
+KPX Otilde V -50
+KPX Otilde W -50
+KPX Otilde X -50
+KPX Otilde Y -70
+KPX Otilde Yacute -70
+KPX Otilde Ydieresis -70
+KPX Otilde comma -40
+KPX Otilde period -40
+KPX P A -100
+KPX P Aacute -100
+KPX P Abreve -100
+KPX P Acircumflex -100
+KPX P Adieresis -100
+KPX P Agrave -100
+KPX P Amacron -100
+KPX P Aogonek -100
+KPX P Aring -100
+KPX P Atilde -100
+KPX P a -30
+KPX P aacute -30
+KPX P abreve -30
+KPX P acircumflex -30
+KPX P adieresis -30
+KPX P agrave -30
+KPX P amacron -30
+KPX P aogonek -30
+KPX P aring -30
+KPX P atilde -30
+KPX P comma -120
+KPX P e -30
+KPX P eacute -30
+KPX P ecaron -30
+KPX P ecircumflex -30
+KPX P edieresis -30
+KPX P edotaccent -30
+KPX P egrave -30
+KPX P emacron -30
+KPX P eogonek -30
+KPX P o -40
+KPX P oacute -40
+KPX P ocircumflex -40
+KPX P odieresis -40
+KPX P ograve -40
+KPX P ohungarumlaut -40
+KPX P omacron -40
+KPX P oslash -40
+KPX P otilde -40
+KPX P period -120
+KPX Q U -10
+KPX Q Uacute -10
+KPX Q Ucircumflex -10
+KPX Q Udieresis -10
+KPX Q Ugrave -10
+KPX Q Uhungarumlaut -10
+KPX Q Umacron -10
+KPX Q Uogonek -10
+KPX Q Uring -10
+KPX Q comma 20
+KPX Q period 20
+KPX R O -20
+KPX R Oacute -20
+KPX R Ocircumflex -20
+KPX R Odieresis -20
+KPX R Ograve -20
+KPX R Ohungarumlaut -20
+KPX R Omacron -20
+KPX R Oslash -20
+KPX R Otilde -20
+KPX R T -20
+KPX R Tcaron -20
+KPX R Tcommaaccent -20
+KPX R U -20
+KPX R Uacute -20
+KPX R Ucircumflex -20
+KPX R Udieresis -20
+KPX R Ugrave -20
+KPX R Uhungarumlaut -20
+KPX R Umacron -20
+KPX R Uogonek -20
+KPX R Uring -20
+KPX R V -50
+KPX R W -40
+KPX R Y -50
+KPX R Yacute -50
+KPX R Ydieresis -50
+KPX Racute O -20
+KPX Racute Oacute -20
+KPX Racute Ocircumflex -20
+KPX Racute Odieresis -20
+KPX Racute Ograve -20
+KPX Racute Ohungarumlaut -20
+KPX Racute Omacron -20
+KPX Racute Oslash -20
+KPX Racute Otilde -20
+KPX Racute T -20
+KPX Racute Tcaron -20
+KPX Racute Tcommaaccent -20
+KPX Racute U -20
+KPX Racute Uacute -20
+KPX Racute Ucircumflex -20
+KPX Racute Udieresis -20
+KPX Racute Ugrave -20
+KPX Racute Uhungarumlaut -20
+KPX Racute Umacron -20
+KPX Racute Uogonek -20
+KPX Racute Uring -20
+KPX Racute V -50
+KPX Racute W -40
+KPX Racute Y -50
+KPX Racute Yacute -50
+KPX Racute Ydieresis -50
+KPX Rcaron O -20
+KPX Rcaron Oacute -20
+KPX Rcaron Ocircumflex -20
+KPX Rcaron Odieresis -20
+KPX Rcaron Ograve -20
+KPX Rcaron Ohungarumlaut -20
+KPX Rcaron Omacron -20
+KPX Rcaron Oslash -20
+KPX Rcaron Otilde -20
+KPX Rcaron T -20
+KPX Rcaron Tcaron -20
+KPX Rcaron Tcommaaccent -20
+KPX Rcaron U -20
+KPX Rcaron Uacute -20
+KPX Rcaron Ucircumflex -20
+KPX Rcaron Udieresis -20
+KPX Rcaron Ugrave -20
+KPX Rcaron Uhungarumlaut -20
+KPX Rcaron Umacron -20
+KPX Rcaron Uogonek -20
+KPX Rcaron Uring -20
+KPX Rcaron V -50
+KPX Rcaron W -40
+KPX Rcaron Y -50
+KPX Rcaron Yacute -50
+KPX Rcaron Ydieresis -50
+KPX Rcommaaccent O -20
+KPX Rcommaaccent Oacute -20
+KPX Rcommaaccent Ocircumflex -20
+KPX Rcommaaccent Odieresis -20
+KPX Rcommaaccent Ograve -20
+KPX Rcommaaccent Ohungarumlaut -20
+KPX Rcommaaccent Omacron -20
+KPX Rcommaaccent Oslash -20
+KPX Rcommaaccent Otilde -20
+KPX Rcommaaccent T -20
+KPX Rcommaaccent Tcaron -20
+KPX Rcommaaccent Tcommaaccent -20
+KPX Rcommaaccent U -20
+KPX Rcommaaccent Uacute -20
+KPX Rcommaaccent Ucircumflex -20
+KPX Rcommaaccent Udieresis -20
+KPX Rcommaaccent Ugrave -20
+KPX Rcommaaccent Uhungarumlaut -20
+KPX Rcommaaccent Umacron -20
+KPX Rcommaaccent Uogonek -20
+KPX Rcommaaccent Uring -20
+KPX Rcommaaccent V -50
+KPX Rcommaaccent W -40
+KPX Rcommaaccent Y -50
+KPX Rcommaaccent Yacute -50
+KPX Rcommaaccent Ydieresis -50
+KPX T A -90
+KPX T Aacute -90
+KPX T Abreve -90
+KPX T Acircumflex -90
+KPX T Adieresis -90
+KPX T Agrave -90
+KPX T Amacron -90
+KPX T Aogonek -90
+KPX T Aring -90
+KPX T Atilde -90
+KPX T O -40
+KPX T Oacute -40
+KPX T Ocircumflex -40
+KPX T Odieresis -40
+KPX T Ograve -40
+KPX T Ohungarumlaut -40
+KPX T Omacron -40
+KPX T Oslash -40
+KPX T Otilde -40
+KPX T a -80
+KPX T aacute -80
+KPX T abreve -80
+KPX T acircumflex -80
+KPX T adieresis -80
+KPX T agrave -80
+KPX T amacron -80
+KPX T aogonek -80
+KPX T aring -80
+KPX T atilde -80
+KPX T colon -40
+KPX T comma -80
+KPX T e -60
+KPX T eacute -60
+KPX T ecaron -60
+KPX T ecircumflex -60
+KPX T edieresis -60
+KPX T edotaccent -60
+KPX T egrave -60
+KPX T emacron -60
+KPX T eogonek -60
+KPX T hyphen -120
+KPX T o -80
+KPX T oacute -80
+KPX T ocircumflex -80
+KPX T odieresis -80
+KPX T ograve -80
+KPX T ohungarumlaut -80
+KPX T omacron -80
+KPX T oslash -80
+KPX T otilde -80
+KPX T period -80
+KPX T r -80
+KPX T racute -80
+KPX T rcommaaccent -80
+KPX T semicolon -40
+KPX T u -90
+KPX T uacute -90
+KPX T ucircumflex -90
+KPX T udieresis -90
+KPX T ugrave -90
+KPX T uhungarumlaut -90
+KPX T umacron -90
+KPX T uogonek -90
+KPX T uring -90
+KPX T w -60
+KPX T y -60
+KPX T yacute -60
+KPX T ydieresis -60
+KPX Tcaron A -90
+KPX Tcaron Aacute -90
+KPX Tcaron Abreve -90
+KPX Tcaron Acircumflex -90
+KPX Tcaron Adieresis -90
+KPX Tcaron Agrave -90
+KPX Tcaron Amacron -90
+KPX Tcaron Aogonek -90
+KPX Tcaron Aring -90
+KPX Tcaron Atilde -90
+KPX Tcaron O -40
+KPX Tcaron Oacute -40
+KPX Tcaron Ocircumflex -40
+KPX Tcaron Odieresis -40
+KPX Tcaron Ograve -40
+KPX Tcaron Ohungarumlaut -40
+KPX Tcaron Omacron -40
+KPX Tcaron Oslash -40
+KPX Tcaron Otilde -40
+KPX Tcaron a -80
+KPX Tcaron aacute -80
+KPX Tcaron abreve -80
+KPX Tcaron acircumflex -80
+KPX Tcaron adieresis -80
+KPX Tcaron agrave -80
+KPX Tcaron amacron -80
+KPX Tcaron aogonek -80
+KPX Tcaron aring -80
+KPX Tcaron atilde -80
+KPX Tcaron colon -40
+KPX Tcaron comma -80
+KPX Tcaron e -60
+KPX Tcaron eacute -60
+KPX Tcaron ecaron -60
+KPX Tcaron ecircumflex -60
+KPX Tcaron edieresis -60
+KPX Tcaron edotaccent -60
+KPX Tcaron egrave -60
+KPX Tcaron emacron -60
+KPX Tcaron eogonek -60
+KPX Tcaron hyphen -120
+KPX Tcaron o -80
+KPX Tcaron oacute -80
+KPX Tcaron ocircumflex -80
+KPX Tcaron odieresis -80
+KPX Tcaron ograve -80
+KPX Tcaron ohungarumlaut -80
+KPX Tcaron omacron -80
+KPX Tcaron oslash -80
+KPX Tcaron otilde -80
+KPX Tcaron period -80
+KPX Tcaron r -80
+KPX Tcaron racute -80
+KPX Tcaron rcommaaccent -80
+KPX Tcaron semicolon -40
+KPX Tcaron u -90
+KPX Tcaron uacute -90
+KPX Tcaron ucircumflex -90
+KPX Tcaron udieresis -90
+KPX Tcaron ugrave -90
+KPX Tcaron uhungarumlaut -90
+KPX Tcaron umacron -90
+KPX Tcaron uogonek -90
+KPX Tcaron uring -90
+KPX Tcaron w -60
+KPX Tcaron y -60
+KPX Tcaron yacute -60
+KPX Tcaron ydieresis -60
+KPX Tcommaaccent A -90
+KPX Tcommaaccent Aacute -90
+KPX Tcommaaccent Abreve -90
+KPX Tcommaaccent Acircumflex -90
+KPX Tcommaaccent Adieresis -90
+KPX Tcommaaccent Agrave -90
+KPX Tcommaaccent Amacron -90
+KPX Tcommaaccent Aogonek -90
+KPX Tcommaaccent Aring -90
+KPX Tcommaaccent Atilde -90
+KPX Tcommaaccent O -40
+KPX Tcommaaccent Oacute -40
+KPX Tcommaaccent Ocircumflex -40
+KPX Tcommaaccent Odieresis -40
+KPX Tcommaaccent Ograve -40
+KPX Tcommaaccent Ohungarumlaut -40
+KPX Tcommaaccent Omacron -40
+KPX Tcommaaccent Oslash -40
+KPX Tcommaaccent Otilde -40
+KPX Tcommaaccent a -80
+KPX Tcommaaccent aacute -80
+KPX Tcommaaccent abreve -80
+KPX Tcommaaccent acircumflex -80
+KPX Tcommaaccent adieresis -80
+KPX Tcommaaccent agrave -80
+KPX Tcommaaccent amacron -80
+KPX Tcommaaccent aogonek -80
+KPX Tcommaaccent aring -80
+KPX Tcommaaccent atilde -80
+KPX Tcommaaccent colon -40
+KPX Tcommaaccent comma -80
+KPX Tcommaaccent e -60
+KPX Tcommaaccent eacute -60
+KPX Tcommaaccent ecaron -60
+KPX Tcommaaccent ecircumflex -60
+KPX Tcommaaccent edieresis -60
+KPX Tcommaaccent edotaccent -60
+KPX Tcommaaccent egrave -60
+KPX Tcommaaccent emacron -60
+KPX Tcommaaccent eogonek -60
+KPX Tcommaaccent hyphen -120
+KPX Tcommaaccent o -80
+KPX Tcommaaccent oacute -80
+KPX Tcommaaccent ocircumflex -80
+KPX Tcommaaccent odieresis -80
+KPX Tcommaaccent ograve -80
+KPX Tcommaaccent ohungarumlaut -80
+KPX Tcommaaccent omacron -80
+KPX Tcommaaccent oslash -80
+KPX Tcommaaccent otilde -80
+KPX Tcommaaccent period -80
+KPX Tcommaaccent r -80
+KPX Tcommaaccent racute -80
+KPX Tcommaaccent rcommaaccent -80
+KPX Tcommaaccent semicolon -40
+KPX Tcommaaccent u -90
+KPX Tcommaaccent uacute -90
+KPX Tcommaaccent ucircumflex -90
+KPX Tcommaaccent udieresis -90
+KPX Tcommaaccent ugrave -90
+KPX Tcommaaccent uhungarumlaut -90
+KPX Tcommaaccent umacron -90
+KPX Tcommaaccent uogonek -90
+KPX Tcommaaccent uring -90
+KPX Tcommaaccent w -60
+KPX Tcommaaccent y -60
+KPX Tcommaaccent yacute -60
+KPX Tcommaaccent ydieresis -60
+KPX U A -50
+KPX U Aacute -50
+KPX U Abreve -50
+KPX U Acircumflex -50
+KPX U Adieresis -50
+KPX U Agrave -50
+KPX U Amacron -50
+KPX U Aogonek -50
+KPX U Aring -50
+KPX U Atilde -50
+KPX U comma -30
+KPX U period -30
+KPX Uacute A -50
+KPX Uacute Aacute -50
+KPX Uacute Abreve -50
+KPX Uacute Acircumflex -50
+KPX Uacute Adieresis -50
+KPX Uacute Agrave -50
+KPX Uacute Amacron -50
+KPX Uacute Aogonek -50
+KPX Uacute Aring -50
+KPX Uacute Atilde -50
+KPX Uacute comma -30
+KPX Uacute period -30
+KPX Ucircumflex A -50
+KPX Ucircumflex Aacute -50
+KPX Ucircumflex Abreve -50
+KPX Ucircumflex Acircumflex -50
+KPX Ucircumflex Adieresis -50
+KPX Ucircumflex Agrave -50
+KPX Ucircumflex Amacron -50
+KPX Ucircumflex Aogonek -50
+KPX Ucircumflex Aring -50
+KPX Ucircumflex Atilde -50
+KPX Ucircumflex comma -30
+KPX Ucircumflex period -30
+KPX Udieresis A -50
+KPX Udieresis Aacute -50
+KPX Udieresis Abreve -50
+KPX Udieresis Acircumflex -50
+KPX Udieresis Adieresis -50
+KPX Udieresis Agrave -50
+KPX Udieresis Amacron -50
+KPX Udieresis Aogonek -50
+KPX Udieresis Aring -50
+KPX Udieresis Atilde -50
+KPX Udieresis comma -30
+KPX Udieresis period -30
+KPX Ugrave A -50
+KPX Ugrave Aacute -50
+KPX Ugrave Abreve -50
+KPX Ugrave Acircumflex -50
+KPX Ugrave Adieresis -50
+KPX Ugrave Agrave -50
+KPX Ugrave Amacron -50
+KPX Ugrave Aogonek -50
+KPX Ugrave Aring -50
+KPX Ugrave Atilde -50
+KPX Ugrave comma -30
+KPX Ugrave period -30
+KPX Uhungarumlaut A -50
+KPX Uhungarumlaut Aacute -50
+KPX Uhungarumlaut Abreve -50
+KPX Uhungarumlaut Acircumflex -50
+KPX Uhungarumlaut Adieresis -50
+KPX Uhungarumlaut Agrave -50
+KPX Uhungarumlaut Amacron -50
+KPX Uhungarumlaut Aogonek -50
+KPX Uhungarumlaut Aring -50
+KPX Uhungarumlaut Atilde -50
+KPX Uhungarumlaut comma -30
+KPX Uhungarumlaut period -30
+KPX Umacron A -50
+KPX Umacron Aacute -50
+KPX Umacron Abreve -50
+KPX Umacron Acircumflex -50
+KPX Umacron Adieresis -50
+KPX Umacron Agrave -50
+KPX Umacron Amacron -50
+KPX Umacron Aogonek -50
+KPX Umacron Aring -50
+KPX Umacron Atilde -50
+KPX Umacron comma -30
+KPX Umacron period -30
+KPX Uogonek A -50
+KPX Uogonek Aacute -50
+KPX Uogonek Abreve -50
+KPX Uogonek Acircumflex -50
+KPX Uogonek Adieresis -50
+KPX Uogonek Agrave -50
+KPX Uogonek Amacron -50
+KPX Uogonek Aogonek -50
+KPX Uogonek Aring -50
+KPX Uogonek Atilde -50
+KPX Uogonek comma -30
+KPX Uogonek period -30
+KPX Uring A -50
+KPX Uring Aacute -50
+KPX Uring Abreve -50
+KPX Uring Acircumflex -50
+KPX Uring Adieresis -50
+KPX Uring Agrave -50
+KPX Uring Amacron -50
+KPX Uring Aogonek -50
+KPX Uring Aring -50
+KPX Uring Atilde -50
+KPX Uring comma -30
+KPX Uring period -30
+KPX V A -80
+KPX V Aacute -80
+KPX V Abreve -80
+KPX V Acircumflex -80
+KPX V Adieresis -80
+KPX V Agrave -80
+KPX V Amacron -80
+KPX V Aogonek -80
+KPX V Aring -80
+KPX V Atilde -80
+KPX V G -50
+KPX V Gbreve -50
+KPX V Gcommaaccent -50
+KPX V O -50
+KPX V Oacute -50
+KPX V Ocircumflex -50
+KPX V Odieresis -50
+KPX V Ograve -50
+KPX V Ohungarumlaut -50
+KPX V Omacron -50
+KPX V Oslash -50
+KPX V Otilde -50
+KPX V a -60
+KPX V aacute -60
+KPX V abreve -60
+KPX V acircumflex -60
+KPX V adieresis -60
+KPX V agrave -60
+KPX V amacron -60
+KPX V aogonek -60
+KPX V aring -60
+KPX V atilde -60
+KPX V colon -40
+KPX V comma -120
+KPX V e -50
+KPX V eacute -50
+KPX V ecaron -50
+KPX V ecircumflex -50
+KPX V edieresis -50
+KPX V edotaccent -50
+KPX V egrave -50
+KPX V emacron -50
+KPX V eogonek -50
+KPX V hyphen -80
+KPX V o -90
+KPX V oacute -90
+KPX V ocircumflex -90
+KPX V odieresis -90
+KPX V ograve -90
+KPX V ohungarumlaut -90
+KPX V omacron -90
+KPX V oslash -90
+KPX V otilde -90
+KPX V period -120
+KPX V semicolon -40
+KPX V u -60
+KPX V uacute -60
+KPX V ucircumflex -60
+KPX V udieresis -60
+KPX V ugrave -60
+KPX V uhungarumlaut -60
+KPX V umacron -60
+KPX V uogonek -60
+KPX V uring -60
+KPX W A -60
+KPX W Aacute -60
+KPX W Abreve -60
+KPX W Acircumflex -60
+KPX W Adieresis -60
+KPX W Agrave -60
+KPX W Amacron -60
+KPX W Aogonek -60
+KPX W Aring -60
+KPX W Atilde -60
+KPX W O -20
+KPX W Oacute -20
+KPX W Ocircumflex -20
+KPX W Odieresis -20
+KPX W Ograve -20
+KPX W Ohungarumlaut -20
+KPX W Omacron -20
+KPX W Oslash -20
+KPX W Otilde -20
+KPX W a -40
+KPX W aacute -40
+KPX W abreve -40
+KPX W acircumflex -40
+KPX W adieresis -40
+KPX W agrave -40
+KPX W amacron -40
+KPX W aogonek -40
+KPX W aring -40
+KPX W atilde -40
+KPX W colon -10
+KPX W comma -80
+KPX W e -35
+KPX W eacute -35
+KPX W ecaron -35
+KPX W ecircumflex -35
+KPX W edieresis -35
+KPX W edotaccent -35
+KPX W egrave -35
+KPX W emacron -35
+KPX W eogonek -35
+KPX W hyphen -40
+KPX W o -60
+KPX W oacute -60
+KPX W ocircumflex -60
+KPX W odieresis -60
+KPX W ograve -60
+KPX W ohungarumlaut -60
+KPX W omacron -60
+KPX W oslash -60
+KPX W otilde -60
+KPX W period -80
+KPX W semicolon -10
+KPX W u -45
+KPX W uacute -45
+KPX W ucircumflex -45
+KPX W udieresis -45
+KPX W ugrave -45
+KPX W uhungarumlaut -45
+KPX W umacron -45
+KPX W uogonek -45
+KPX W uring -45
+KPX W y -20
+KPX W yacute -20
+KPX W ydieresis -20
+KPX Y A -110
+KPX Y Aacute -110
+KPX Y Abreve -110
+KPX Y Acircumflex -110
+KPX Y Adieresis -110
+KPX Y Agrave -110
+KPX Y Amacron -110
+KPX Y Aogonek -110
+KPX Y Aring -110
+KPX Y Atilde -110
+KPX Y O -70
+KPX Y Oacute -70
+KPX Y Ocircumflex -70
+KPX Y Odieresis -70
+KPX Y Ograve -70
+KPX Y Ohungarumlaut -70
+KPX Y Omacron -70
+KPX Y Oslash -70
+KPX Y Otilde -70
+KPX Y a -90
+KPX Y aacute -90
+KPX Y abreve -90
+KPX Y acircumflex -90
+KPX Y adieresis -90
+KPX Y agrave -90
+KPX Y amacron -90
+KPX Y aogonek -90
+KPX Y aring -90
+KPX Y atilde -90
+KPX Y colon -50
+KPX Y comma -100
+KPX Y e -80
+KPX Y eacute -80
+KPX Y ecaron -80
+KPX Y ecircumflex -80
+KPX Y edieresis -80
+KPX Y edotaccent -80
+KPX Y egrave -80
+KPX Y emacron -80
+KPX Y eogonek -80
+KPX Y o -100
+KPX Y oacute -100
+KPX Y ocircumflex -100
+KPX Y odieresis -100
+KPX Y ograve -100
+KPX Y ohungarumlaut -100
+KPX Y omacron -100
+KPX Y oslash -100
+KPX Y otilde -100
+KPX Y period -100
+KPX Y semicolon -50
+KPX Y u -100
+KPX Y uacute -100
+KPX Y ucircumflex -100
+KPX Y udieresis -100
+KPX Y ugrave -100
+KPX Y uhungarumlaut -100
+KPX Y umacron -100
+KPX Y uogonek -100
+KPX Y uring -100
+KPX Yacute A -110
+KPX Yacute Aacute -110
+KPX Yacute Abreve -110
+KPX Yacute Acircumflex -110
+KPX Yacute Adieresis -110
+KPX Yacute Agrave -110
+KPX Yacute Amacron -110
+KPX Yacute Aogonek -110
+KPX Yacute Aring -110
+KPX Yacute Atilde -110
+KPX Yacute O -70
+KPX Yacute Oacute -70
+KPX Yacute Ocircumflex -70
+KPX Yacute Odieresis -70
+KPX Yacute Ograve -70
+KPX Yacute Ohungarumlaut -70
+KPX Yacute Omacron -70
+KPX Yacute Oslash -70
+KPX Yacute Otilde -70
+KPX Yacute a -90
+KPX Yacute aacute -90
+KPX Yacute abreve -90
+KPX Yacute acircumflex -90
+KPX Yacute adieresis -90
+KPX Yacute agrave -90
+KPX Yacute amacron -90
+KPX Yacute aogonek -90
+KPX Yacute aring -90
+KPX Yacute atilde -90
+KPX Yacute colon -50
+KPX Yacute comma -100
+KPX Yacute e -80
+KPX Yacute eacute -80
+KPX Yacute ecaron -80
+KPX Yacute ecircumflex -80
+KPX Yacute edieresis -80
+KPX Yacute edotaccent -80
+KPX Yacute egrave -80
+KPX Yacute emacron -80
+KPX Yacute eogonek -80
+KPX Yacute o -100
+KPX Yacute oacute -100
+KPX Yacute ocircumflex -100
+KPX Yacute odieresis -100
+KPX Yacute ograve -100
+KPX Yacute ohungarumlaut -100
+KPX Yacute omacron -100
+KPX Yacute oslash -100
+KPX Yacute otilde -100
+KPX Yacute period -100
+KPX Yacute semicolon -50
+KPX Yacute u -100
+KPX Yacute uacute -100
+KPX Yacute ucircumflex -100
+KPX Yacute udieresis -100
+KPX Yacute ugrave -100
+KPX Yacute uhungarumlaut -100
+KPX Yacute umacron -100
+KPX Yacute uogonek -100
+KPX Yacute uring -100
+KPX Ydieresis A -110
+KPX Ydieresis Aacute -110
+KPX Ydieresis Abreve -110
+KPX Ydieresis Acircumflex -110
+KPX Ydieresis Adieresis -110
+KPX Ydieresis Agrave -110
+KPX Ydieresis Amacron -110
+KPX Ydieresis Aogonek -110
+KPX Ydieresis Aring -110
+KPX Ydieresis Atilde -110
+KPX Ydieresis O -70
+KPX Ydieresis Oacute -70
+KPX Ydieresis Ocircumflex -70
+KPX Ydieresis Odieresis -70
+KPX Ydieresis Ograve -70
+KPX Ydieresis Ohungarumlaut -70
+KPX Ydieresis Omacron -70
+KPX Ydieresis Oslash -70
+KPX Ydieresis Otilde -70
+KPX Ydieresis a -90
+KPX Ydieresis aacute -90
+KPX Ydieresis abreve -90
+KPX Ydieresis acircumflex -90
+KPX Ydieresis adieresis -90
+KPX Ydieresis agrave -90
+KPX Ydieresis amacron -90
+KPX Ydieresis aogonek -90
+KPX Ydieresis aring -90
+KPX Ydieresis atilde -90
+KPX Ydieresis colon -50
+KPX Ydieresis comma -100
+KPX Ydieresis e -80
+KPX Ydieresis eacute -80
+KPX Ydieresis ecaron -80
+KPX Ydieresis ecircumflex -80
+KPX Ydieresis edieresis -80
+KPX Ydieresis edotaccent -80
+KPX Ydieresis egrave -80
+KPX Ydieresis emacron -80
+KPX Ydieresis eogonek -80
+KPX Ydieresis o -100
+KPX Ydieresis oacute -100
+KPX Ydieresis ocircumflex -100
+KPX Ydieresis odieresis -100
+KPX Ydieresis ograve -100
+KPX Ydieresis ohungarumlaut -100
+KPX Ydieresis omacron -100
+KPX Ydieresis oslash -100
+KPX Ydieresis otilde -100
+KPX Ydieresis period -100
+KPX Ydieresis semicolon -50
+KPX Ydieresis u -100
+KPX Ydieresis uacute -100
+KPX Ydieresis ucircumflex -100
+KPX Ydieresis udieresis -100
+KPX Ydieresis ugrave -100
+KPX Ydieresis uhungarumlaut -100
+KPX Ydieresis umacron -100
+KPX Ydieresis uogonek -100
+KPX Ydieresis uring -100
+KPX a g -10
+KPX a gbreve -10
+KPX a gcommaaccent -10
+KPX a v -15
+KPX a w -15
+KPX a y -20
+KPX a yacute -20
+KPX a ydieresis -20
+KPX aacute g -10
+KPX aacute gbreve -10
+KPX aacute gcommaaccent -10
+KPX aacute v -15
+KPX aacute w -15
+KPX aacute y -20
+KPX aacute yacute -20
+KPX aacute ydieresis -20
+KPX abreve g -10
+KPX abreve gbreve -10
+KPX abreve gcommaaccent -10
+KPX abreve v -15
+KPX abreve w -15
+KPX abreve y -20
+KPX abreve yacute -20
+KPX abreve ydieresis -20
+KPX acircumflex g -10
+KPX acircumflex gbreve -10
+KPX acircumflex gcommaaccent -10
+KPX acircumflex v -15
+KPX acircumflex w -15
+KPX acircumflex y -20
+KPX acircumflex yacute -20
+KPX acircumflex ydieresis -20
+KPX adieresis g -10
+KPX adieresis gbreve -10
+KPX adieresis gcommaaccent -10
+KPX adieresis v -15
+KPX adieresis w -15
+KPX adieresis y -20
+KPX adieresis yacute -20
+KPX adieresis ydieresis -20
+KPX agrave g -10
+KPX agrave gbreve -10
+KPX agrave gcommaaccent -10
+KPX agrave v -15
+KPX agrave w -15
+KPX agrave y -20
+KPX agrave yacute -20
+KPX agrave ydieresis -20
+KPX amacron g -10
+KPX amacron gbreve -10
+KPX amacron gcommaaccent -10
+KPX amacron v -15
+KPX amacron w -15
+KPX amacron y -20
+KPX amacron yacute -20
+KPX amacron ydieresis -20
+KPX aogonek g -10
+KPX aogonek gbreve -10
+KPX aogonek gcommaaccent -10
+KPX aogonek v -15
+KPX aogonek w -15
+KPX aogonek y -20
+KPX aogonek yacute -20
+KPX aogonek ydieresis -20
+KPX aring g -10
+KPX aring gbreve -10
+KPX aring gcommaaccent -10
+KPX aring v -15
+KPX aring w -15
+KPX aring y -20
+KPX aring yacute -20
+KPX aring ydieresis -20
+KPX atilde g -10
+KPX atilde gbreve -10
+KPX atilde gcommaaccent -10
+KPX atilde v -15
+KPX atilde w -15
+KPX atilde y -20
+KPX atilde yacute -20
+KPX atilde ydieresis -20
+KPX b l -10
+KPX b lacute -10
+KPX b lcommaaccent -10
+KPX b lslash -10
+KPX b u -20
+KPX b uacute -20
+KPX b ucircumflex -20
+KPX b udieresis -20
+KPX b ugrave -20
+KPX b uhungarumlaut -20
+KPX b umacron -20
+KPX b uogonek -20
+KPX b uring -20
+KPX b v -20
+KPX b y -20
+KPX b yacute -20
+KPX b ydieresis -20
+KPX c h -10
+KPX c k -20
+KPX c kcommaaccent -20
+KPX c l -20
+KPX c lacute -20
+KPX c lcommaaccent -20
+KPX c lslash -20
+KPX c y -10
+KPX c yacute -10
+KPX c ydieresis -10
+KPX cacute h -10
+KPX cacute k -20
+KPX cacute kcommaaccent -20
+KPX cacute l -20
+KPX cacute lacute -20
+KPX cacute lcommaaccent -20
+KPX cacute lslash -20
+KPX cacute y -10
+KPX cacute yacute -10
+KPX cacute ydieresis -10
+KPX ccaron h -10
+KPX ccaron k -20
+KPX ccaron kcommaaccent -20
+KPX ccaron l -20
+KPX ccaron lacute -20
+KPX ccaron lcommaaccent -20
+KPX ccaron lslash -20
+KPX ccaron y -10
+KPX ccaron yacute -10
+KPX ccaron ydieresis -10
+KPX ccedilla h -10
+KPX ccedilla k -20
+KPX ccedilla kcommaaccent -20
+KPX ccedilla l -20
+KPX ccedilla lacute -20
+KPX ccedilla lcommaaccent -20
+KPX ccedilla lslash -20
+KPX ccedilla y -10
+KPX ccedilla yacute -10
+KPX ccedilla ydieresis -10
+KPX colon space -40
+KPX comma quotedblright -120
+KPX comma quoteright -120
+KPX comma space -40
+KPX d d -10
+KPX d dcroat -10
+KPX d v -15
+KPX d w -15
+KPX d y -15
+KPX d yacute -15
+KPX d ydieresis -15
+KPX dcroat d -10
+KPX dcroat dcroat -10
+KPX dcroat v -15
+KPX dcroat w -15
+KPX dcroat y -15
+KPX dcroat yacute -15
+KPX dcroat ydieresis -15
+KPX e comma 10
+KPX e period 20
+KPX e v -15
+KPX e w -15
+KPX e x -15
+KPX e y -15
+KPX e yacute -15
+KPX e ydieresis -15
+KPX eacute comma 10
+KPX eacute period 20
+KPX eacute v -15
+KPX eacute w -15
+KPX eacute x -15
+KPX eacute y -15
+KPX eacute yacute -15
+KPX eacute ydieresis -15
+KPX ecaron comma 10
+KPX ecaron period 20
+KPX ecaron v -15
+KPX ecaron w -15
+KPX ecaron x -15
+KPX ecaron y -15
+KPX ecaron yacute -15
+KPX ecaron ydieresis -15
+KPX ecircumflex comma 10
+KPX ecircumflex period 20
+KPX ecircumflex v -15
+KPX ecircumflex w -15
+KPX ecircumflex x -15
+KPX ecircumflex y -15
+KPX ecircumflex yacute -15
+KPX ecircumflex ydieresis -15
+KPX edieresis comma 10
+KPX edieresis period 20
+KPX edieresis v -15
+KPX edieresis w -15
+KPX edieresis x -15
+KPX edieresis y -15
+KPX edieresis yacute -15
+KPX edieresis ydieresis -15
+KPX edotaccent comma 10
+KPX edotaccent period 20
+KPX edotaccent v -15
+KPX edotaccent w -15
+KPX edotaccent x -15
+KPX edotaccent y -15
+KPX edotaccent yacute -15
+KPX edotaccent ydieresis -15
+KPX egrave comma 10
+KPX egrave period 20
+KPX egrave v -15
+KPX egrave w -15
+KPX egrave x -15
+KPX egrave y -15
+KPX egrave yacute -15
+KPX egrave ydieresis -15
+KPX emacron comma 10
+KPX emacron period 20
+KPX emacron v -15
+KPX emacron w -15
+KPX emacron x -15
+KPX emacron y -15
+KPX emacron yacute -15
+KPX emacron ydieresis -15
+KPX eogonek comma 10
+KPX eogonek period 20
+KPX eogonek v -15
+KPX eogonek w -15
+KPX eogonek x -15
+KPX eogonek y -15
+KPX eogonek yacute -15
+KPX eogonek ydieresis -15
+KPX f comma -10
+KPX f e -10
+KPX f eacute -10
+KPX f ecaron -10
+KPX f ecircumflex -10
+KPX f edieresis -10
+KPX f edotaccent -10
+KPX f egrave -10
+KPX f emacron -10
+KPX f eogonek -10
+KPX f o -20
+KPX f oacute -20
+KPX f ocircumflex -20
+KPX f odieresis -20
+KPX f ograve -20
+KPX f ohungarumlaut -20
+KPX f omacron -20
+KPX f oslash -20
+KPX f otilde -20
+KPX f period -10
+KPX f quotedblright 30
+KPX f quoteright 30
+KPX g e 10
+KPX g eacute 10
+KPX g ecaron 10
+KPX g ecircumflex 10
+KPX g edieresis 10
+KPX g edotaccent 10
+KPX g egrave 10
+KPX g emacron 10
+KPX g eogonek 10
+KPX g g -10
+KPX g gbreve -10
+KPX g gcommaaccent -10
+KPX gbreve e 10
+KPX gbreve eacute 10
+KPX gbreve ecaron 10
+KPX gbreve ecircumflex 10
+KPX gbreve edieresis 10
+KPX gbreve edotaccent 10
+KPX gbreve egrave 10
+KPX gbreve emacron 10
+KPX gbreve eogonek 10
+KPX gbreve g -10
+KPX gbreve gbreve -10
+KPX gbreve gcommaaccent -10
+KPX gcommaaccent e 10
+KPX gcommaaccent eacute 10
+KPX gcommaaccent ecaron 10
+KPX gcommaaccent ecircumflex 10
+KPX gcommaaccent edieresis 10
+KPX gcommaaccent edotaccent 10
+KPX gcommaaccent egrave 10
+KPX gcommaaccent emacron 10
+KPX gcommaaccent eogonek 10
+KPX gcommaaccent g -10
+KPX gcommaaccent gbreve -10
+KPX gcommaaccent gcommaaccent -10
+KPX h y -20
+KPX h yacute -20
+KPX h ydieresis -20
+KPX k o -15
+KPX k oacute -15
+KPX k ocircumflex -15
+KPX k odieresis -15
+KPX k ograve -15
+KPX k ohungarumlaut -15
+KPX k omacron -15
+KPX k oslash -15
+KPX k otilde -15
+KPX kcommaaccent o -15
+KPX kcommaaccent oacute -15
+KPX kcommaaccent ocircumflex -15
+KPX kcommaaccent odieresis -15
+KPX kcommaaccent ograve -15
+KPX kcommaaccent ohungarumlaut -15
+KPX kcommaaccent omacron -15
+KPX kcommaaccent oslash -15
+KPX kcommaaccent otilde -15
+KPX l w -15
+KPX l y -15
+KPX l yacute -15
+KPX l ydieresis -15
+KPX lacute w -15
+KPX lacute y -15
+KPX lacute yacute -15
+KPX lacute ydieresis -15
+KPX lcommaaccent w -15
+KPX lcommaaccent y -15
+KPX lcommaaccent yacute -15
+KPX lcommaaccent ydieresis -15
+KPX lslash w -15
+KPX lslash y -15
+KPX lslash yacute -15
+KPX lslash ydieresis -15
+KPX m u -20
+KPX m uacute -20
+KPX m ucircumflex -20
+KPX m udieresis -20
+KPX m ugrave -20
+KPX m uhungarumlaut -20
+KPX m umacron -20
+KPX m uogonek -20
+KPX m uring -20
+KPX m y -30
+KPX m yacute -30
+KPX m ydieresis -30
+KPX n u -10
+KPX n uacute -10
+KPX n ucircumflex -10
+KPX n udieresis -10
+KPX n ugrave -10
+KPX n uhungarumlaut -10
+KPX n umacron -10
+KPX n uogonek -10
+KPX n uring -10
+KPX n v -40
+KPX n y -20
+KPX n yacute -20
+KPX n ydieresis -20
+KPX nacute u -10
+KPX nacute uacute -10
+KPX nacute ucircumflex -10
+KPX nacute udieresis -10
+KPX nacute ugrave -10
+KPX nacute uhungarumlaut -10
+KPX nacute umacron -10
+KPX nacute uogonek -10
+KPX nacute uring -10
+KPX nacute v -40
+KPX nacute y -20
+KPX nacute yacute -20
+KPX nacute ydieresis -20
+KPX ncaron u -10
+KPX ncaron uacute -10
+KPX ncaron ucircumflex -10
+KPX ncaron udieresis -10
+KPX ncaron ugrave -10
+KPX ncaron uhungarumlaut -10
+KPX ncaron umacron -10
+KPX ncaron uogonek -10
+KPX ncaron uring -10
+KPX ncaron v -40
+KPX ncaron y -20
+KPX ncaron yacute -20
+KPX ncaron ydieresis -20
+KPX ncommaaccent u -10
+KPX ncommaaccent uacute -10
+KPX ncommaaccent ucircumflex -10
+KPX ncommaaccent udieresis -10
+KPX ncommaaccent ugrave -10
+KPX ncommaaccent uhungarumlaut -10
+KPX ncommaaccent umacron -10
+KPX ncommaaccent uogonek -10
+KPX ncommaaccent uring -10
+KPX ncommaaccent v -40
+KPX ncommaaccent y -20
+KPX ncommaaccent yacute -20
+KPX ncommaaccent ydieresis -20
+KPX ntilde u -10
+KPX ntilde uacute -10
+KPX ntilde ucircumflex -10
+KPX ntilde udieresis -10
+KPX ntilde ugrave -10
+KPX ntilde uhungarumlaut -10
+KPX ntilde umacron -10
+KPX ntilde uogonek -10
+KPX ntilde uring -10
+KPX ntilde v -40
+KPX ntilde y -20
+KPX ntilde yacute -20
+KPX ntilde ydieresis -20
+KPX o v -20
+KPX o w -15
+KPX o x -30
+KPX o y -20
+KPX o yacute -20
+KPX o ydieresis -20
+KPX oacute v -20
+KPX oacute w -15
+KPX oacute x -30
+KPX oacute y -20
+KPX oacute yacute -20
+KPX oacute ydieresis -20
+KPX ocircumflex v -20
+KPX ocircumflex w -15
+KPX ocircumflex x -30
+KPX ocircumflex y -20
+KPX ocircumflex yacute -20
+KPX ocircumflex ydieresis -20
+KPX odieresis v -20
+KPX odieresis w -15
+KPX odieresis x -30
+KPX odieresis y -20
+KPX odieresis yacute -20
+KPX odieresis ydieresis -20
+KPX ograve v -20
+KPX ograve w -15
+KPX ograve x -30
+KPX ograve y -20
+KPX ograve yacute -20
+KPX ograve ydieresis -20
+KPX ohungarumlaut v -20
+KPX ohungarumlaut w -15
+KPX ohungarumlaut x -30
+KPX ohungarumlaut y -20
+KPX ohungarumlaut yacute -20
+KPX ohungarumlaut ydieresis -20
+KPX omacron v -20
+KPX omacron w -15
+KPX omacron x -30
+KPX omacron y -20
+KPX omacron yacute -20
+KPX omacron ydieresis -20
+KPX oslash v -20
+KPX oslash w -15
+KPX oslash x -30
+KPX oslash y -20
+KPX oslash yacute -20
+KPX oslash ydieresis -20
+KPX otilde v -20
+KPX otilde w -15
+KPX otilde x -30
+KPX otilde y -20
+KPX otilde yacute -20
+KPX otilde ydieresis -20
+KPX p y -15
+KPX p yacute -15
+KPX p ydieresis -15
+KPX period quotedblright -120
+KPX period quoteright -120
+KPX period space -40
+KPX quotedblright space -80
+KPX quoteleft quoteleft -46
+KPX quoteright d -80
+KPX quoteright dcroat -80
+KPX quoteright l -20
+KPX quoteright lacute -20
+KPX quoteright lcommaaccent -20
+KPX quoteright lslash -20
+KPX quoteright quoteright -46
+KPX quoteright r -40
+KPX quoteright racute -40
+KPX quoteright rcaron -40
+KPX quoteright rcommaaccent -40
+KPX quoteright s -60
+KPX quoteright sacute -60
+KPX quoteright scaron -60
+KPX quoteright scedilla -60
+KPX quoteright scommaaccent -60
+KPX quoteright space -80
+KPX quoteright v -20
+KPX r c -20
+KPX r cacute -20
+KPX r ccaron -20
+KPX r ccedilla -20
+KPX r comma -60
+KPX r d -20
+KPX r dcroat -20
+KPX r g -15
+KPX r gbreve -15
+KPX r gcommaaccent -15
+KPX r hyphen -20
+KPX r o -20
+KPX r oacute -20
+KPX r ocircumflex -20
+KPX r odieresis -20
+KPX r ograve -20
+KPX r ohungarumlaut -20
+KPX r omacron -20
+KPX r oslash -20
+KPX r otilde -20
+KPX r period -60
+KPX r q -20
+KPX r s -15
+KPX r sacute -15
+KPX r scaron -15
+KPX r scedilla -15
+KPX r scommaaccent -15
+KPX r t 20
+KPX r tcommaaccent 20
+KPX r v 10
+KPX r y 10
+KPX r yacute 10
+KPX r ydieresis 10
+KPX racute c -20
+KPX racute cacute -20
+KPX racute ccaron -20
+KPX racute ccedilla -20
+KPX racute comma -60
+KPX racute d -20
+KPX racute dcroat -20
+KPX racute g -15
+KPX racute gbreve -15
+KPX racute gcommaaccent -15
+KPX racute hyphen -20
+KPX racute o -20
+KPX racute oacute -20
+KPX racute ocircumflex -20
+KPX racute odieresis -20
+KPX racute ograve -20
+KPX racute ohungarumlaut -20
+KPX racute omacron -20
+KPX racute oslash -20
+KPX racute otilde -20
+KPX racute period -60
+KPX racute q -20
+KPX racute s -15
+KPX racute sacute -15
+KPX racute scaron -15
+KPX racute scedilla -15
+KPX racute scommaaccent -15
+KPX racute t 20
+KPX racute tcommaaccent 20
+KPX racute v 10
+KPX racute y 10
+KPX racute yacute 10
+KPX racute ydieresis 10
+KPX rcaron c -20
+KPX rcaron cacute -20
+KPX rcaron ccaron -20
+KPX rcaron ccedilla -20
+KPX rcaron comma -60
+KPX rcaron d -20
+KPX rcaron dcroat -20
+KPX rcaron g -15
+KPX rcaron gbreve -15
+KPX rcaron gcommaaccent -15
+KPX rcaron hyphen -20
+KPX rcaron o -20
+KPX rcaron oacute -20
+KPX rcaron ocircumflex -20
+KPX rcaron odieresis -20
+KPX rcaron ograve -20
+KPX rcaron ohungarumlaut -20
+KPX rcaron omacron -20
+KPX rcaron oslash -20
+KPX rcaron otilde -20
+KPX rcaron period -60
+KPX rcaron q -20
+KPX rcaron s -15
+KPX rcaron sacute -15
+KPX rcaron scaron -15
+KPX rcaron scedilla -15
+KPX rcaron scommaaccent -15
+KPX rcaron t 20
+KPX rcaron tcommaaccent 20
+KPX rcaron v 10
+KPX rcaron y 10
+KPX rcaron yacute 10
+KPX rcaron ydieresis 10
+KPX rcommaaccent c -20
+KPX rcommaaccent cacute -20
+KPX rcommaaccent ccaron -20
+KPX rcommaaccent ccedilla -20
+KPX rcommaaccent comma -60
+KPX rcommaaccent d -20
+KPX rcommaaccent dcroat -20
+KPX rcommaaccent g -15
+KPX rcommaaccent gbreve -15
+KPX rcommaaccent gcommaaccent -15
+KPX rcommaaccent hyphen -20
+KPX rcommaaccent o -20
+KPX rcommaaccent oacute -20
+KPX rcommaaccent ocircumflex -20
+KPX rcommaaccent odieresis -20
+KPX rcommaaccent ograve -20
+KPX rcommaaccent ohungarumlaut -20
+KPX rcommaaccent omacron -20
+KPX rcommaaccent oslash -20
+KPX rcommaaccent otilde -20
+KPX rcommaaccent period -60
+KPX rcommaaccent q -20
+KPX rcommaaccent s -15
+KPX rcommaaccent sacute -15
+KPX rcommaaccent scaron -15
+KPX rcommaaccent scedilla -15
+KPX rcommaaccent scommaaccent -15
+KPX rcommaaccent t 20
+KPX rcommaaccent tcommaaccent 20
+KPX rcommaaccent v 10
+KPX rcommaaccent y 10
+KPX rcommaaccent yacute 10
+KPX rcommaaccent ydieresis 10
+KPX s w -15
+KPX sacute w -15
+KPX scaron w -15
+KPX scedilla w -15
+KPX scommaaccent w -15
+KPX semicolon space -40
+KPX space T -100
+KPX space Tcaron -100
+KPX space Tcommaaccent -100
+KPX space V -80
+KPX space W -80
+KPX space Y -120
+KPX space Yacute -120
+KPX space Ydieresis -120
+KPX space quotedblleft -80
+KPX space quoteleft -60
+KPX v a -20
+KPX v aacute -20
+KPX v abreve -20
+KPX v acircumflex -20
+KPX v adieresis -20
+KPX v agrave -20
+KPX v amacron -20
+KPX v aogonek -20
+KPX v aring -20
+KPX v atilde -20
+KPX v comma -80
+KPX v o -30
+KPX v oacute -30
+KPX v ocircumflex -30
+KPX v odieresis -30
+KPX v ograve -30
+KPX v ohungarumlaut -30
+KPX v omacron -30
+KPX v oslash -30
+KPX v otilde -30
+KPX v period -80
+KPX w comma -40
+KPX w o -20
+KPX w oacute -20
+KPX w ocircumflex -20
+KPX w odieresis -20
+KPX w ograve -20
+KPX w ohungarumlaut -20
+KPX w omacron -20
+KPX w oslash -20
+KPX w otilde -20
+KPX w period -40
+KPX x e -10
+KPX x eacute -10
+KPX x ecaron -10
+KPX x ecircumflex -10
+KPX x edieresis -10
+KPX x edotaccent -10
+KPX x egrave -10
+KPX x emacron -10
+KPX x eogonek -10
+KPX y a -30
+KPX y aacute -30
+KPX y abreve -30
+KPX y acircumflex -30
+KPX y adieresis -30
+KPX y agrave -30
+KPX y amacron -30
+KPX y aogonek -30
+KPX y aring -30
+KPX y atilde -30
+KPX y comma -80
+KPX y e -10
+KPX y eacute -10
+KPX y ecaron -10
+KPX y ecircumflex -10
+KPX y edieresis -10
+KPX y edotaccent -10
+KPX y egrave -10
+KPX y emacron -10
+KPX y eogonek -10
+KPX y o -25
+KPX y oacute -25
+KPX y ocircumflex -25
+KPX y odieresis -25
+KPX y ograve -25
+KPX y ohungarumlaut -25
+KPX y omacron -25
+KPX y oslash -25
+KPX y otilde -25
+KPX y period -80
+KPX yacute a -30
+KPX yacute aacute -30
+KPX yacute abreve -30
+KPX yacute acircumflex -30
+KPX yacute adieresis -30
+KPX yacute agrave -30
+KPX yacute amacron -30
+KPX yacute aogonek -30
+KPX yacute aring -30
+KPX yacute atilde -30
+KPX yacute comma -80
+KPX yacute e -10
+KPX yacute eacute -10
+KPX yacute ecaron -10
+KPX yacute ecircumflex -10
+KPX yacute edieresis -10
+KPX yacute edotaccent -10
+KPX yacute egrave -10
+KPX yacute emacron -10
+KPX yacute eogonek -10
+KPX yacute o -25
+KPX yacute oacute -25
+KPX yacute ocircumflex -25
+KPX yacute odieresis -25
+KPX yacute ograve -25
+KPX yacute ohungarumlaut -25
+KPX yacute omacron -25
+KPX yacute oslash -25
+KPX yacute otilde -25
+KPX yacute period -80
+KPX ydieresis a -30
+KPX ydieresis aacute -30
+KPX ydieresis abreve -30
+KPX ydieresis acircumflex -30
+KPX ydieresis adieresis -30
+KPX ydieresis agrave -30
+KPX ydieresis amacron -30
+KPX ydieresis aogonek -30
+KPX ydieresis aring -30
+KPX ydieresis atilde -30
+KPX ydieresis comma -80
+KPX ydieresis e -10
+KPX ydieresis eacute -10
+KPX ydieresis ecaron -10
+KPX ydieresis ecircumflex -10
+KPX ydieresis edieresis -10
+KPX ydieresis edotaccent -10
+KPX ydieresis egrave -10
+KPX ydieresis emacron -10
+KPX ydieresis eogonek -10
+KPX ydieresis o -25
+KPX ydieresis oacute -25
+KPX ydieresis ocircumflex -25
+KPX ydieresis odieresis -25
+KPX ydieresis ograve -25
+KPX ydieresis ohungarumlaut -25
+KPX ydieresis omacron -25
+KPX ydieresis oslash -25
+KPX ydieresis otilde -25
+KPX ydieresis period -80
+KPX z e 10
+KPX z eacute 10
+KPX z ecaron 10
+KPX z ecircumflex 10
+KPX z edieresis 10
+KPX z edotaccent 10
+KPX z egrave 10
+KPX z emacron 10
+KPX z eogonek 10
+KPX zacute e 10
+KPX zacute eacute 10
+KPX zacute ecaron 10
+KPX zacute ecircumflex 10
+KPX zacute edieresis 10
+KPX zacute edotaccent 10
+KPX zacute egrave 10
+KPX zacute emacron 10
+KPX zacute eogonek 10
+KPX zcaron e 10
+KPX zcaron eacute 10
+KPX zcaron ecaron 10
+KPX zcaron ecircumflex 10
+KPX zcaron edieresis 10
+KPX zcaron edotaccent 10
+KPX zcaron egrave 10
+KPX zcaron emacron 10
+KPX zcaron eogonek 10
+KPX zdotaccent e 10
+KPX zdotaccent eacute 10
+KPX zdotaccent ecaron 10
+KPX zdotaccent ecircumflex 10
+KPX zdotaccent edieresis 10
+KPX zdotaccent edotaccent 10
+KPX zdotaccent egrave 10
+KPX zdotaccent emacron 10
+KPX zdotaccent eogonek 10
+EndKernPairs
+EndKernData
+EndFontMetrics
diff --git a/src/main/resources/com/lowagie/text/pdf/fonts/Helvetica-BoldOblique.afm b/src/main/resources/com/lowagie/text/pdf/fonts/Helvetica-BoldOblique.afm
new file mode 100644
index 0000000..16845ae
--- /dev/null
+++ b/src/main/resources/com/lowagie/text/pdf/fonts/Helvetica-BoldOblique.afm
@@ -0,0 +1,2827 @@
+StartFontMetrics 4.1
+Comment Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved.
+Comment Creation Date: Thu May 1 12:45:12 1997
+Comment UniqueID 43053
+Comment VMusage 14482 68586
+FontName Helvetica-BoldOblique
+FullName Helvetica Bold Oblique
+FamilyName Helvetica
+Weight Bold
+ItalicAngle -12
+IsFixedPitch false
+CharacterSet ExtendedRoman
+FontBBox -174 -228 1114 962
+UnderlinePosition -100
+UnderlineThickness 50
+Version 002.000
+Notice Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved.Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries.
+EncodingScheme AdobeStandardEncoding
+CapHeight 718
+XHeight 532
+Ascender 718
+Descender -207
+StdHW 118
+StdVW 140
+StartCharMetrics 315
+C 32 ; WX 278 ; N space ; B 0 0 0 0 ;
+C 33 ; WX 333 ; N exclam ; B 94 0 397 718 ;
+C 34 ; WX 474 ; N quotedbl ; B 193 447 529 718 ;
+C 35 ; WX 556 ; N numbersign ; B 60 0 644 698 ;
+C 36 ; WX 556 ; N dollar ; B 67 -115 622 775 ;
+C 37 ; WX 889 ; N percent ; B 136 -19 901 710 ;
+C 38 ; WX 722 ; N ampersand ; B 89 -19 732 718 ;
+C 39 ; WX 278 ; N quoteright ; B 167 445 362 718 ;
+C 40 ; WX 333 ; N parenleft ; B 76 -208 470 734 ;
+C 41 ; WX 333 ; N parenright ; B -25 -208 369 734 ;
+C 42 ; WX 389 ; N asterisk ; B 146 387 481 718 ;
+C 43 ; WX 584 ; N plus ; B 82 0 610 506 ;
+C 44 ; WX 278 ; N comma ; B 28 -168 245 146 ;
+C 45 ; WX 333 ; N hyphen ; B 73 215 379 345 ;
+C 46 ; WX 278 ; N period ; B 64 0 245 146 ;
+C 47 ; WX 278 ; N slash ; B -37 -19 468 737 ;
+C 48 ; WX 556 ; N zero ; B 86 -19 617 710 ;
+C 49 ; WX 556 ; N one ; B 173 0 529 710 ;
+C 50 ; WX 556 ; N two ; B 26 0 619 710 ;
+C 51 ; WX 556 ; N three ; B 65 -19 608 710 ;
+C 52 ; WX 556 ; N four ; B 60 0 598 710 ;
+C 53 ; WX 556 ; N five ; B 64 -19 636 698 ;
+C 54 ; WX 556 ; N six ; B 85 -19 619 710 ;
+C 55 ; WX 556 ; N seven ; B 125 0 676 698 ;
+C 56 ; WX 556 ; N eight ; B 69 -19 616 710 ;
+C 57 ; WX 556 ; N nine ; B 78 -19 615 710 ;
+C 58 ; WX 333 ; N colon ; B 92 0 351 512 ;
+C 59 ; WX 333 ; N semicolon ; B 56 -168 351 512 ;
+C 60 ; WX 584 ; N less ; B 82 -8 655 514 ;
+C 61 ; WX 584 ; N equal ; B 58 87 633 419 ;
+C 62 ; WX 584 ; N greater ; B 36 -8 609 514 ;
+C 63 ; WX 611 ; N question ; B 165 0 671 727 ;
+C 64 ; WX 975 ; N at ; B 186 -19 954 737 ;
+C 65 ; WX 722 ; N A ; B 20 0 702 718 ;
+C 66 ; WX 722 ; N B ; B 76 0 764 718 ;
+C 67 ; WX 722 ; N C ; B 107 -19 789 737 ;
+C 68 ; WX 722 ; N D ; B 76 0 777 718 ;
+C 69 ; WX 667 ; N E ; B 76 0 757 718 ;
+C 70 ; WX 611 ; N F ; B 76 0 740 718 ;
+C 71 ; WX 778 ; N G ; B 108 -19 817 737 ;
+C 72 ; WX 722 ; N H ; B 71 0 804 718 ;
+C 73 ; WX 278 ; N I ; B 64 0 367 718 ;
+C 74 ; WX 556 ; N J ; B 60 -18 637 718 ;
+C 75 ; WX 722 ; N K ; B 87 0 858 718 ;
+C 76 ; WX 611 ; N L ; B 76 0 611 718 ;
+C 77 ; WX 833 ; N M ; B 69 0 918 718 ;
+C 78 ; WX 722 ; N N ; B 69 0 807 718 ;
+C 79 ; WX 778 ; N O ; B 107 -19 823 737 ;
+C 80 ; WX 667 ; N P ; B 76 0 738 718 ;
+C 81 ; WX 778 ; N Q ; B 107 -52 823 737 ;
+C 82 ; WX 722 ; N R ; B 76 0 778 718 ;
+C 83 ; WX 667 ; N S ; B 81 -19 718 737 ;
+C 84 ; WX 611 ; N T ; B 140 0 751 718 ;
+C 85 ; WX 722 ; N U ; B 116 -19 804 718 ;
+C 86 ; WX 667 ; N V ; B 172 0 801 718 ;
+C 87 ; WX 944 ; N W ; B 169 0 1082 718 ;
+C 88 ; WX 667 ; N X ; B 14 0 791 718 ;
+C 89 ; WX 667 ; N Y ; B 168 0 806 718 ;
+C 90 ; WX 611 ; N Z ; B 25 0 737 718 ;
+C 91 ; WX 333 ; N bracketleft ; B 21 -196 462 722 ;
+C 92 ; WX 278 ; N backslash ; B 124 -19 307 737 ;
+C 93 ; WX 333 ; N bracketright ; B -18 -196 423 722 ;
+C 94 ; WX 584 ; N asciicircum ; B 131 323 591 698 ;
+C 95 ; WX 556 ; N underscore ; B -27 -125 540 -75 ;
+C 96 ; WX 278 ; N quoteleft ; B 165 454 361 727 ;
+C 97 ; WX 556 ; N a ; B 55 -14 583 546 ;
+C 98 ; WX 611 ; N b ; B 61 -14 645 718 ;
+C 99 ; WX 556 ; N c ; B 79 -14 599 546 ;
+C 100 ; WX 611 ; N d ; B 82 -14 704 718 ;
+C 101 ; WX 556 ; N e ; B 70 -14 593 546 ;
+C 102 ; WX 333 ; N f ; B 87 0 469 727 ; L i fi ; L l fl ;
+C 103 ; WX 611 ; N g ; B 38 -217 666 546 ;
+C 104 ; WX 611 ; N h ; B 65 0 629 718 ;
+C 105 ; WX 278 ; N i ; B 69 0 363 725 ;
+C 106 ; WX 278 ; N j ; B -42 -214 363 725 ;
+C 107 ; WX 556 ; N k ; B 69 0 670 718 ;
+C 108 ; WX 278 ; N l ; B 69 0 362 718 ;
+C 109 ; WX 889 ; N m ; B 64 0 909 546 ;
+C 110 ; WX 611 ; N n ; B 65 0 629 546 ;
+C 111 ; WX 611 ; N o ; B 82 -14 643 546 ;
+C 112 ; WX 611 ; N p ; B 18 -207 645 546 ;
+C 113 ; WX 611 ; N q ; B 80 -207 665 546 ;
+C 114 ; WX 389 ; N r ; B 64 0 489 546 ;
+C 115 ; WX 556 ; N s ; B 63 -14 584 546 ;
+C 116 ; WX 333 ; N t ; B 100 -6 422 676 ;
+C 117 ; WX 611 ; N u ; B 98 -14 658 532 ;
+C 118 ; WX 556 ; N v ; B 126 0 656 532 ;
+C 119 ; WX 778 ; N w ; B 123 0 882 532 ;
+C 120 ; WX 556 ; N x ; B 15 0 648 532 ;
+C 121 ; WX 556 ; N y ; B 42 -214 652 532 ;
+C 122 ; WX 500 ; N z ; B 20 0 583 532 ;
+C 123 ; WX 389 ; N braceleft ; B 94 -196 518 722 ;
+C 124 ; WX 280 ; N bar ; B 36 -225 361 775 ;
+C 125 ; WX 389 ; N braceright ; B -18 -196 407 722 ;
+C 126 ; WX 584 ; N asciitilde ; B 115 163 577 343 ;
+C 161 ; WX 333 ; N exclamdown ; B 50 -186 353 532 ;
+C 162 ; WX 556 ; N cent ; B 79 -118 599 628 ;
+C 163 ; WX 556 ; N sterling ; B 50 -16 635 718 ;
+C 164 ; WX 167 ; N fraction ; B -174 -19 487 710 ;
+C 165 ; WX 556 ; N yen ; B 60 0 713 698 ;
+C 166 ; WX 556 ; N florin ; B -50 -210 669 737 ;
+C 167 ; WX 556 ; N section ; B 61 -184 598 727 ;
+C 168 ; WX 556 ; N currency ; B 27 76 680 636 ;
+C 169 ; WX 238 ; N quotesingle ; B 165 447 321 718 ;
+C 170 ; WX 500 ; N quotedblleft ; B 160 454 588 727 ;
+C 171 ; WX 556 ; N guillemotleft ; B 135 76 571 484 ;
+C 172 ; WX 333 ; N guilsinglleft ; B 130 76 353 484 ;
+C 173 ; WX 333 ; N guilsinglright ; B 99 76 322 484 ;
+C 174 ; WX 611 ; N fi ; B 87 0 696 727 ;
+C 175 ; WX 611 ; N fl ; B 87 0 695 727 ;
+C 177 ; WX 556 ; N endash ; B 48 227 627 333 ;
+C 178 ; WX 556 ; N dagger ; B 118 -171 626 718 ;
+C 179 ; WX 556 ; N daggerdbl ; B 46 -171 628 718 ;
+C 180 ; WX 278 ; N periodcentered ; B 110 172 276 334 ;
+C 182 ; WX 556 ; N paragraph ; B 98 -191 688 700 ;
+C 183 ; WX 350 ; N bullet ; B 83 194 420 524 ;
+C 184 ; WX 278 ; N quotesinglbase ; B 41 -146 236 127 ;
+C 185 ; WX 500 ; N quotedblbase ; B 36 -146 463 127 ;
+C 186 ; WX 500 ; N quotedblright ; B 162 445 589 718 ;
+C 187 ; WX 556 ; N guillemotright ; B 104 76 540 484 ;
+C 188 ; WX 1000 ; N ellipsis ; B 92 0 939 146 ;
+C 189 ; WX 1000 ; N perthousand ; B 76 -19 1038 710 ;
+C 191 ; WX 611 ; N questiondown ; B 53 -195 559 532 ;
+C 193 ; WX 333 ; N grave ; B 136 604 353 750 ;
+C 194 ; WX 333 ; N acute ; B 236 604 515 750 ;
+C 195 ; WX 333 ; N circumflex ; B 118 604 471 750 ;
+C 196 ; WX 333 ; N tilde ; B 113 610 507 737 ;
+C 197 ; WX 333 ; N macron ; B 122 604 483 678 ;
+C 198 ; WX 333 ; N breve ; B 156 604 494 750 ;
+C 199 ; WX 333 ; N dotaccent ; B 235 614 385 729 ;
+C 200 ; WX 333 ; N dieresis ; B 137 614 482 729 ;
+C 202 ; WX 333 ; N ring ; B 200 568 420 776 ;
+C 203 ; WX 333 ; N cedilla ; B -37 -228 220 0 ;
+C 205 ; WX 333 ; N hungarumlaut ; B 137 604 645 750 ;
+C 206 ; WX 333 ; N ogonek ; B 41 -228 264 0 ;
+C 207 ; WX 333 ; N caron ; B 149 604 502 750 ;
+C 208 ; WX 1000 ; N emdash ; B 48 227 1071 333 ;
+C 225 ; WX 1000 ; N AE ; B 5 0 1100 718 ;
+C 227 ; WX 370 ; N ordfeminine ; B 125 401 465 737 ;
+C 232 ; WX 611 ; N Lslash ; B 34 0 611 718 ;
+C 233 ; WX 778 ; N Oslash ; B 35 -27 894 745 ;
+C 234 ; WX 1000 ; N OE ; B 99 -19 1114 737 ;
+C 235 ; WX 365 ; N ordmasculine ; B 123 401 485 737 ;
+C 241 ; WX 889 ; N ae ; B 56 -14 923 546 ;
+C 245 ; WX 278 ; N dotlessi ; B 69 0 322 532 ;
+C 248 ; WX 278 ; N lslash ; B 40 0 407 718 ;
+C 249 ; WX 611 ; N oslash ; B 22 -29 701 560 ;
+C 250 ; WX 944 ; N oe ; B 82 -14 977 546 ;
+C 251 ; WX 611 ; N germandbls ; B 69 -14 657 731 ;
+C -1 ; WX 278 ; N Idieresis ; B 64 0 494 915 ;
+C -1 ; WX 556 ; N eacute ; B 70 -14 627 750 ;
+C -1 ; WX 556 ; N abreve ; B 55 -14 606 750 ;
+C -1 ; WX 611 ; N uhungarumlaut ; B 98 -14 784 750 ;
+C -1 ; WX 556 ; N ecaron ; B 70 -14 614 750 ;
+C -1 ; WX 667 ; N Ydieresis ; B 168 0 806 915 ;
+C -1 ; WX 584 ; N divide ; B 82 -42 610 548 ;
+C -1 ; WX 667 ; N Yacute ; B 168 0 806 936 ;
+C -1 ; WX 722 ; N Acircumflex ; B 20 0 706 936 ;
+C -1 ; WX 556 ; N aacute ; B 55 -14 627 750 ;
+C -1 ; WX 722 ; N Ucircumflex ; B 116 -19 804 936 ;
+C -1 ; WX 556 ; N yacute ; B 42 -214 652 750 ;
+C -1 ; WX 556 ; N scommaaccent ; B 63 -228 584 546 ;
+C -1 ; WX 556 ; N ecircumflex ; B 70 -14 593 750 ;
+C -1 ; WX 722 ; N Uring ; B 116 -19 804 962 ;
+C -1 ; WX 722 ; N Udieresis ; B 116 -19 804 915 ;
+C -1 ; WX 556 ; N aogonek ; B 55 -224 583 546 ;
+C -1 ; WX 722 ; N Uacute ; B 116 -19 804 936 ;
+C -1 ; WX 611 ; N uogonek ; B 98 -228 658 532 ;
+C -1 ; WX 667 ; N Edieresis ; B 76 0 757 915 ;
+C -1 ; WX 722 ; N Dcroat ; B 62 0 777 718 ;
+C -1 ; WX 250 ; N commaaccent ; B 16 -228 188 -50 ;
+C -1 ; WX 737 ; N copyright ; B 56 -19 835 737 ;
+C -1 ; WX 667 ; N Emacron ; B 76 0 757 864 ;
+C -1 ; WX 556 ; N ccaron ; B 79 -14 614 750 ;
+C -1 ; WX 556 ; N aring ; B 55 -14 583 776 ;
+C -1 ; WX 722 ; N Ncommaaccent ; B 69 -228 807 718 ;
+C -1 ; WX 278 ; N lacute ; B 69 0 528 936 ;
+C -1 ; WX 556 ; N agrave ; B 55 -14 583 750 ;
+C -1 ; WX 611 ; N Tcommaaccent ; B 140 -228 751 718 ;
+C -1 ; WX 722 ; N Cacute ; B 107 -19 789 936 ;
+C -1 ; WX 556 ; N atilde ; B 55 -14 619 737 ;
+C -1 ; WX 667 ; N Edotaccent ; B 76 0 757 915 ;
+C -1 ; WX 556 ; N scaron ; B 63 -14 614 750 ;
+C -1 ; WX 556 ; N scedilla ; B 63 -228 584 546 ;
+C -1 ; WX 278 ; N iacute ; B 69 0 488 750 ;
+C -1 ; WX 494 ; N lozenge ; B 90 0 564 745 ;
+C -1 ; WX 722 ; N Rcaron ; B 76 0 778 936 ;
+C -1 ; WX 778 ; N Gcommaaccent ; B 108 -228 817 737 ;
+C -1 ; WX 611 ; N ucircumflex ; B 98 -14 658 750 ;
+C -1 ; WX 556 ; N acircumflex ; B 55 -14 583 750 ;
+C -1 ; WX 722 ; N Amacron ; B 20 0 718 864 ;
+C -1 ; WX 389 ; N rcaron ; B 64 0 530 750 ;
+C -1 ; WX 556 ; N ccedilla ; B 79 -228 599 546 ;
+C -1 ; WX 611 ; N Zdotaccent ; B 25 0 737 915 ;
+C -1 ; WX 667 ; N Thorn ; B 76 0 716 718 ;
+C -1 ; WX 778 ; N Omacron ; B 107 -19 823 864 ;
+C -1 ; WX 722 ; N Racute ; B 76 0 778 936 ;
+C -1 ; WX 667 ; N Sacute ; B 81 -19 722 936 ;
+C -1 ; WX 743 ; N dcaron ; B 82 -14 903 718 ;
+C -1 ; WX 722 ; N Umacron ; B 116 -19 804 864 ;
+C -1 ; WX 611 ; N uring ; B 98 -14 658 776 ;
+C -1 ; WX 333 ; N threesuperior ; B 91 271 441 710 ;
+C -1 ; WX 778 ; N Ograve ; B 107 -19 823 936 ;
+C -1 ; WX 722 ; N Agrave ; B 20 0 702 936 ;
+C -1 ; WX 722 ; N Abreve ; B 20 0 729 936 ;
+C -1 ; WX 584 ; N multiply ; B 57 1 635 505 ;
+C -1 ; WX 611 ; N uacute ; B 98 -14 658 750 ;
+C -1 ; WX 611 ; N Tcaron ; B 140 0 751 936 ;
+C -1 ; WX 494 ; N partialdiff ; B 43 -21 585 750 ;
+C -1 ; WX 556 ; N ydieresis ; B 42 -214 652 729 ;
+C -1 ; WX 722 ; N Nacute ; B 69 0 807 936 ;
+C -1 ; WX 278 ; N icircumflex ; B 69 0 444 750 ;
+C -1 ; WX 667 ; N Ecircumflex ; B 76 0 757 936 ;
+C -1 ; WX 556 ; N adieresis ; B 55 -14 594 729 ;
+C -1 ; WX 556 ; N edieresis ; B 70 -14 594 729 ;
+C -1 ; WX 556 ; N cacute ; B 79 -14 627 750 ;
+C -1 ; WX 611 ; N nacute ; B 65 0 654 750 ;
+C -1 ; WX 611 ; N umacron ; B 98 -14 658 678 ;
+C -1 ; WX 722 ; N Ncaron ; B 69 0 807 936 ;
+C -1 ; WX 278 ; N Iacute ; B 64 0 528 936 ;
+C -1 ; WX 584 ; N plusminus ; B 40 0 625 506 ;
+C -1 ; WX 280 ; N brokenbar ; B 52 -150 345 700 ;
+C -1 ; WX 737 ; N registered ; B 55 -19 834 737 ;
+C -1 ; WX 778 ; N Gbreve ; B 108 -19 817 936 ;
+C -1 ; WX 278 ; N Idotaccent ; B 64 0 397 915 ;
+C -1 ; WX 600 ; N summation ; B 14 -10 670 706 ;
+C -1 ; WX 667 ; N Egrave ; B 76 0 757 936 ;
+C -1 ; WX 389 ; N racute ; B 64 0 543 750 ;
+C -1 ; WX 611 ; N omacron ; B 82 -14 643 678 ;
+C -1 ; WX 611 ; N Zacute ; B 25 0 737 936 ;
+C -1 ; WX 611 ; N Zcaron ; B 25 0 737 936 ;
+C -1 ; WX 549 ; N greaterequal ; B 26 0 629 704 ;
+C -1 ; WX 722 ; N Eth ; B 62 0 777 718 ;
+C -1 ; WX 722 ; N Ccedilla ; B 107 -228 789 737 ;
+C -1 ; WX 278 ; N lcommaaccent ; B 30 -228 362 718 ;
+C -1 ; WX 389 ; N tcaron ; B 100 -6 608 878 ;
+C -1 ; WX 556 ; N eogonek ; B 70 -228 593 546 ;
+C -1 ; WX 722 ; N Uogonek ; B 116 -228 804 718 ;
+C -1 ; WX 722 ; N Aacute ; B 20 0 750 936 ;
+C -1 ; WX 722 ; N Adieresis ; B 20 0 716 915 ;
+C -1 ; WX 556 ; N egrave ; B 70 -14 593 750 ;
+C -1 ; WX 500 ; N zacute ; B 20 0 599 750 ;
+C -1 ; WX 278 ; N iogonek ; B -14 -224 363 725 ;
+C -1 ; WX 778 ; N Oacute ; B 107 -19 823 936 ;
+C -1 ; WX 611 ; N oacute ; B 82 -14 654 750 ;
+C -1 ; WX 556 ; N amacron ; B 55 -14 595 678 ;
+C -1 ; WX 556 ; N sacute ; B 63 -14 627 750 ;
+C -1 ; WX 278 ; N idieresis ; B 69 0 455 729 ;
+C -1 ; WX 778 ; N Ocircumflex ; B 107 -19 823 936 ;
+C -1 ; WX 722 ; N Ugrave ; B 116 -19 804 936 ;
+C -1 ; WX 612 ; N Delta ; B 6 0 608 688 ;
+C -1 ; WX 611 ; N thorn ; B 18 -208 645 718 ;
+C -1 ; WX 333 ; N twosuperior ; B 69 283 449 710 ;
+C -1 ; WX 778 ; N Odieresis ; B 107 -19 823 915 ;
+C -1 ; WX 611 ; N mu ; B 22 -207 658 532 ;
+C -1 ; WX 278 ; N igrave ; B 69 0 326 750 ;
+C -1 ; WX 611 ; N ohungarumlaut ; B 82 -14 784 750 ;
+C -1 ; WX 667 ; N Eogonek ; B 76 -224 757 718 ;
+C -1 ; WX 611 ; N dcroat ; B 82 -14 789 718 ;
+C -1 ; WX 834 ; N threequarters ; B 99 -19 839 710 ;
+C -1 ; WX 667 ; N Scedilla ; B 81 -228 718 737 ;
+C -1 ; WX 400 ; N lcaron ; B 69 0 561 718 ;
+C -1 ; WX 722 ; N Kcommaaccent ; B 87 -228 858 718 ;
+C -1 ; WX 611 ; N Lacute ; B 76 0 611 936 ;
+C -1 ; WX 1000 ; N trademark ; B 179 306 1109 718 ;
+C -1 ; WX 556 ; N edotaccent ; B 70 -14 593 729 ;
+C -1 ; WX 278 ; N Igrave ; B 64 0 367 936 ;
+C -1 ; WX 278 ; N Imacron ; B 64 0 496 864 ;
+C -1 ; WX 611 ; N Lcaron ; B 76 0 643 718 ;
+C -1 ; WX 834 ; N onehalf ; B 132 -19 858 710 ;
+C -1 ; WX 549 ; N lessequal ; B 29 0 676 704 ;
+C -1 ; WX 611 ; N ocircumflex ; B 82 -14 643 750 ;
+C -1 ; WX 611 ; N ntilde ; B 65 0 646 737 ;
+C -1 ; WX 722 ; N Uhungarumlaut ; B 116 -19 880 936 ;
+C -1 ; WX 667 ; N Eacute ; B 76 0 757 936 ;
+C -1 ; WX 556 ; N emacron ; B 70 -14 595 678 ;
+C -1 ; WX 611 ; N gbreve ; B 38 -217 666 750 ;
+C -1 ; WX 834 ; N onequarter ; B 132 -19 806 710 ;
+C -1 ; WX 667 ; N Scaron ; B 81 -19 718 936 ;
+C -1 ; WX 667 ; N Scommaaccent ; B 81 -228 718 737 ;
+C -1 ; WX 778 ; N Ohungarumlaut ; B 107 -19 908 936 ;
+C -1 ; WX 400 ; N degree ; B 175 426 467 712 ;
+C -1 ; WX 611 ; N ograve ; B 82 -14 643 750 ;
+C -1 ; WX 722 ; N Ccaron ; B 107 -19 789 936 ;
+C -1 ; WX 611 ; N ugrave ; B 98 -14 658 750 ;
+C -1 ; WX 549 ; N radical ; B 112 -46 689 850 ;
+C -1 ; WX 722 ; N Dcaron ; B 76 0 777 936 ;
+C -1 ; WX 389 ; N rcommaaccent ; B 26 -228 489 546 ;
+C -1 ; WX 722 ; N Ntilde ; B 69 0 807 923 ;
+C -1 ; WX 611 ; N otilde ; B 82 -14 646 737 ;
+C -1 ; WX 722 ; N Rcommaaccent ; B 76 -228 778 718 ;
+C -1 ; WX 611 ; N Lcommaaccent ; B 76 -228 611 718 ;
+C -1 ; WX 722 ; N Atilde ; B 20 0 741 923 ;
+C -1 ; WX 722 ; N Aogonek ; B 20 -224 702 718 ;
+C -1 ; WX 722 ; N Aring ; B 20 0 702 962 ;
+C -1 ; WX 778 ; N Otilde ; B 107 -19 823 923 ;
+C -1 ; WX 500 ; N zdotaccent ; B 20 0 583 729 ;
+C -1 ; WX 667 ; N Ecaron ; B 76 0 757 936 ;
+C -1 ; WX 278 ; N Iogonek ; B -41 -228 367 718 ;
+C -1 ; WX 556 ; N kcommaaccent ; B 69 -228 670 718 ;
+C -1 ; WX 584 ; N minus ; B 82 197 610 309 ;
+C -1 ; WX 278 ; N Icircumflex ; B 64 0 484 936 ;
+C -1 ; WX 611 ; N ncaron ; B 65 0 641 750 ;
+C -1 ; WX 333 ; N tcommaaccent ; B 58 -228 422 676 ;
+C -1 ; WX 584 ; N logicalnot ; B 105 108 633 419 ;
+C -1 ; WX 611 ; N odieresis ; B 82 -14 643 729 ;
+C -1 ; WX 611 ; N udieresis ; B 98 -14 658 729 ;
+C -1 ; WX 549 ; N notequal ; B 32 -49 630 570 ;
+C -1 ; WX 611 ; N gcommaaccent ; B 38 -217 666 850 ;
+C -1 ; WX 611 ; N eth ; B 82 -14 670 737 ;
+C -1 ; WX 500 ; N zcaron ; B 20 0 586 750 ;
+C -1 ; WX 611 ; N ncommaaccent ; B 65 -228 629 546 ;
+C -1 ; WX 333 ; N onesuperior ; B 148 283 388 710 ;
+C -1 ; WX 278 ; N imacron ; B 69 0 429 678 ;
+C -1 ; WX 556 ; N Euro ; B 0 0 0 0 ;
+EndCharMetrics
+StartKernData
+StartKernPairs 2481
+KPX A C -40
+KPX A Cacute -40
+KPX A Ccaron -40
+KPX A Ccedilla -40
+KPX A G -50
+KPX A Gbreve -50
+KPX A Gcommaaccent -50
+KPX A O -40
+KPX A Oacute -40
+KPX A Ocircumflex -40
+KPX A Odieresis -40
+KPX A Ograve -40
+KPX A Ohungarumlaut -40
+KPX A Omacron -40
+KPX A Oslash -40
+KPX A Otilde -40
+KPX A Q -40
+KPX A T -90
+KPX A Tcaron -90
+KPX A Tcommaaccent -90
+KPX A U -50
+KPX A Uacute -50
+KPX A Ucircumflex -50
+KPX A Udieresis -50
+KPX A Ugrave -50
+KPX A Uhungarumlaut -50
+KPX A Umacron -50
+KPX A Uogonek -50
+KPX A Uring -50
+KPX A V -80
+KPX A W -60
+KPX A Y -110
+KPX A Yacute -110
+KPX A Ydieresis -110
+KPX A u -30
+KPX A uacute -30
+KPX A ucircumflex -30
+KPX A udieresis -30
+KPX A ugrave -30
+KPX A uhungarumlaut -30
+KPX A umacron -30
+KPX A uogonek -30
+KPX A uring -30
+KPX A v -40
+KPX A w -30
+KPX A y -30
+KPX A yacute -30
+KPX A ydieresis -30
+KPX Aacute C -40
+KPX Aacute Cacute -40
+KPX Aacute Ccaron -40
+KPX Aacute Ccedilla -40
+KPX Aacute G -50
+KPX Aacute Gbreve -50
+KPX Aacute Gcommaaccent -50
+KPX Aacute O -40
+KPX Aacute Oacute -40
+KPX Aacute Ocircumflex -40
+KPX Aacute Odieresis -40
+KPX Aacute Ograve -40
+KPX Aacute Ohungarumlaut -40
+KPX Aacute Omacron -40
+KPX Aacute Oslash -40
+KPX Aacute Otilde -40
+KPX Aacute Q -40
+KPX Aacute T -90
+KPX Aacute Tcaron -90
+KPX Aacute Tcommaaccent -90
+KPX Aacute U -50
+KPX Aacute Uacute -50
+KPX Aacute Ucircumflex -50
+KPX Aacute Udieresis -50
+KPX Aacute Ugrave -50
+KPX Aacute Uhungarumlaut -50
+KPX Aacute Umacron -50
+KPX Aacute Uogonek -50
+KPX Aacute Uring -50
+KPX Aacute V -80
+KPX Aacute W -60
+KPX Aacute Y -110
+KPX Aacute Yacute -110
+KPX Aacute Ydieresis -110
+KPX Aacute u -30
+KPX Aacute uacute -30
+KPX Aacute ucircumflex -30
+KPX Aacute udieresis -30
+KPX Aacute ugrave -30
+KPX Aacute uhungarumlaut -30
+KPX Aacute umacron -30
+KPX Aacute uogonek -30
+KPX Aacute uring -30
+KPX Aacute v -40
+KPX Aacute w -30
+KPX Aacute y -30
+KPX Aacute yacute -30
+KPX Aacute ydieresis -30
+KPX Abreve C -40
+KPX Abreve Cacute -40
+KPX Abreve Ccaron -40
+KPX Abreve Ccedilla -40
+KPX Abreve G -50
+KPX Abreve Gbreve -50
+KPX Abreve Gcommaaccent -50
+KPX Abreve O -40
+KPX Abreve Oacute -40
+KPX Abreve Ocircumflex -40
+KPX Abreve Odieresis -40
+KPX Abreve Ograve -40
+KPX Abreve Ohungarumlaut -40
+KPX Abreve Omacron -40
+KPX Abreve Oslash -40
+KPX Abreve Otilde -40
+KPX Abreve Q -40
+KPX Abreve T -90
+KPX Abreve Tcaron -90
+KPX Abreve Tcommaaccent -90
+KPX Abreve U -50
+KPX Abreve Uacute -50
+KPX Abreve Ucircumflex -50
+KPX Abreve Udieresis -50
+KPX Abreve Ugrave -50
+KPX Abreve Uhungarumlaut -50
+KPX Abreve Umacron -50
+KPX Abreve Uogonek -50
+KPX Abreve Uring -50
+KPX Abreve V -80
+KPX Abreve W -60
+KPX Abreve Y -110
+KPX Abreve Yacute -110
+KPX Abreve Ydieresis -110
+KPX Abreve u -30
+KPX Abreve uacute -30
+KPX Abreve ucircumflex -30
+KPX Abreve udieresis -30
+KPX Abreve ugrave -30
+KPX Abreve uhungarumlaut -30
+KPX Abreve umacron -30
+KPX Abreve uogonek -30
+KPX Abreve uring -30
+KPX Abreve v -40
+KPX Abreve w -30
+KPX Abreve y -30
+KPX Abreve yacute -30
+KPX Abreve ydieresis -30
+KPX Acircumflex C -40
+KPX Acircumflex Cacute -40
+KPX Acircumflex Ccaron -40
+KPX Acircumflex Ccedilla -40
+KPX Acircumflex G -50
+KPX Acircumflex Gbreve -50
+KPX Acircumflex Gcommaaccent -50
+KPX Acircumflex O -40
+KPX Acircumflex Oacute -40
+KPX Acircumflex Ocircumflex -40
+KPX Acircumflex Odieresis -40
+KPX Acircumflex Ograve -40
+KPX Acircumflex Ohungarumlaut -40
+KPX Acircumflex Omacron -40
+KPX Acircumflex Oslash -40
+KPX Acircumflex Otilde -40
+KPX Acircumflex Q -40
+KPX Acircumflex T -90
+KPX Acircumflex Tcaron -90
+KPX Acircumflex Tcommaaccent -90
+KPX Acircumflex U -50
+KPX Acircumflex Uacute -50
+KPX Acircumflex Ucircumflex -50
+KPX Acircumflex Udieresis -50
+KPX Acircumflex Ugrave -50
+KPX Acircumflex Uhungarumlaut -50
+KPX Acircumflex Umacron -50
+KPX Acircumflex Uogonek -50
+KPX Acircumflex Uring -50
+KPX Acircumflex V -80
+KPX Acircumflex W -60
+KPX Acircumflex Y -110
+KPX Acircumflex Yacute -110
+KPX Acircumflex Ydieresis -110
+KPX Acircumflex u -30
+KPX Acircumflex uacute -30
+KPX Acircumflex ucircumflex -30
+KPX Acircumflex udieresis -30
+KPX Acircumflex ugrave -30
+KPX Acircumflex uhungarumlaut -30
+KPX Acircumflex umacron -30
+KPX Acircumflex uogonek -30
+KPX Acircumflex uring -30
+KPX Acircumflex v -40
+KPX Acircumflex w -30
+KPX Acircumflex y -30
+KPX Acircumflex yacute -30
+KPX Acircumflex ydieresis -30
+KPX Adieresis C -40
+KPX Adieresis Cacute -40
+KPX Adieresis Ccaron -40
+KPX Adieresis Ccedilla -40
+KPX Adieresis G -50
+KPX Adieresis Gbreve -50
+KPX Adieresis Gcommaaccent -50
+KPX Adieresis O -40
+KPX Adieresis Oacute -40
+KPX Adieresis Ocircumflex -40
+KPX Adieresis Odieresis -40
+KPX Adieresis Ograve -40
+KPX Adieresis Ohungarumlaut -40
+KPX Adieresis Omacron -40
+KPX Adieresis Oslash -40
+KPX Adieresis Otilde -40
+KPX Adieresis Q -40
+KPX Adieresis T -90
+KPX Adieresis Tcaron -90
+KPX Adieresis Tcommaaccent -90
+KPX Adieresis U -50
+KPX Adieresis Uacute -50
+KPX Adieresis Ucircumflex -50
+KPX Adieresis Udieresis -50
+KPX Adieresis Ugrave -50
+KPX Adieresis Uhungarumlaut -50
+KPX Adieresis Umacron -50
+KPX Adieresis Uogonek -50
+KPX Adieresis Uring -50
+KPX Adieresis V -80
+KPX Adieresis W -60
+KPX Adieresis Y -110
+KPX Adieresis Yacute -110
+KPX Adieresis Ydieresis -110
+KPX Adieresis u -30
+KPX Adieresis uacute -30
+KPX Adieresis ucircumflex -30
+KPX Adieresis udieresis -30
+KPX Adieresis ugrave -30
+KPX Adieresis uhungarumlaut -30
+KPX Adieresis umacron -30
+KPX Adieresis uogonek -30
+KPX Adieresis uring -30
+KPX Adieresis v -40
+KPX Adieresis w -30
+KPX Adieresis y -30
+KPX Adieresis yacute -30
+KPX Adieresis ydieresis -30
+KPX Agrave C -40
+KPX Agrave Cacute -40
+KPX Agrave Ccaron -40
+KPX Agrave Ccedilla -40
+KPX Agrave G -50
+KPX Agrave Gbreve -50
+KPX Agrave Gcommaaccent -50
+KPX Agrave O -40
+KPX Agrave Oacute -40
+KPX Agrave Ocircumflex -40
+KPX Agrave Odieresis -40
+KPX Agrave Ograve -40
+KPX Agrave Ohungarumlaut -40
+KPX Agrave Omacron -40
+KPX Agrave Oslash -40
+KPX Agrave Otilde -40
+KPX Agrave Q -40
+KPX Agrave T -90
+KPX Agrave Tcaron -90
+KPX Agrave Tcommaaccent -90
+KPX Agrave U -50
+KPX Agrave Uacute -50
+KPX Agrave Ucircumflex -50
+KPX Agrave Udieresis -50
+KPX Agrave Ugrave -50
+KPX Agrave Uhungarumlaut -50
+KPX Agrave Umacron -50
+KPX Agrave Uogonek -50
+KPX Agrave Uring -50
+KPX Agrave V -80
+KPX Agrave W -60
+KPX Agrave Y -110
+KPX Agrave Yacute -110
+KPX Agrave Ydieresis -110
+KPX Agrave u -30
+KPX Agrave uacute -30
+KPX Agrave ucircumflex -30
+KPX Agrave udieresis -30
+KPX Agrave ugrave -30
+KPX Agrave uhungarumlaut -30
+KPX Agrave umacron -30
+KPX Agrave uogonek -30
+KPX Agrave uring -30
+KPX Agrave v -40
+KPX Agrave w -30
+KPX Agrave y -30
+KPX Agrave yacute -30
+KPX Agrave ydieresis -30
+KPX Amacron C -40
+KPX Amacron Cacute -40
+KPX Amacron Ccaron -40
+KPX Amacron Ccedilla -40
+KPX Amacron G -50
+KPX Amacron Gbreve -50
+KPX Amacron Gcommaaccent -50
+KPX Amacron O -40
+KPX Amacron Oacute -40
+KPX Amacron Ocircumflex -40
+KPX Amacron Odieresis -40
+KPX Amacron Ograve -40
+KPX Amacron Ohungarumlaut -40
+KPX Amacron Omacron -40
+KPX Amacron Oslash -40
+KPX Amacron Otilde -40
+KPX Amacron Q -40
+KPX Amacron T -90
+KPX Amacron Tcaron -90
+KPX Amacron Tcommaaccent -90
+KPX Amacron U -50
+KPX Amacron Uacute -50
+KPX Amacron Ucircumflex -50
+KPX Amacron Udieresis -50
+KPX Amacron Ugrave -50
+KPX Amacron Uhungarumlaut -50
+KPX Amacron Umacron -50
+KPX Amacron Uogonek -50
+KPX Amacron Uring -50
+KPX Amacron V -80
+KPX Amacron W -60
+KPX Amacron Y -110
+KPX Amacron Yacute -110
+KPX Amacron Ydieresis -110
+KPX Amacron u -30
+KPX Amacron uacute -30
+KPX Amacron ucircumflex -30
+KPX Amacron udieresis -30
+KPX Amacron ugrave -30
+KPX Amacron uhungarumlaut -30
+KPX Amacron umacron -30
+KPX Amacron uogonek -30
+KPX Amacron uring -30
+KPX Amacron v -40
+KPX Amacron w -30
+KPX Amacron y -30
+KPX Amacron yacute -30
+KPX Amacron ydieresis -30
+KPX Aogonek C -40
+KPX Aogonek Cacute -40
+KPX Aogonek Ccaron -40
+KPX Aogonek Ccedilla -40
+KPX Aogonek G -50
+KPX Aogonek Gbreve -50
+KPX Aogonek Gcommaaccent -50
+KPX Aogonek O -40
+KPX Aogonek Oacute -40
+KPX Aogonek Ocircumflex -40
+KPX Aogonek Odieresis -40
+KPX Aogonek Ograve -40
+KPX Aogonek Ohungarumlaut -40
+KPX Aogonek Omacron -40
+KPX Aogonek Oslash -40
+KPX Aogonek Otilde -40
+KPX Aogonek Q -40
+KPX Aogonek T -90
+KPX Aogonek Tcaron -90
+KPX Aogonek Tcommaaccent -90
+KPX Aogonek U -50
+KPX Aogonek Uacute -50
+KPX Aogonek Ucircumflex -50
+KPX Aogonek Udieresis -50
+KPX Aogonek Ugrave -50
+KPX Aogonek Uhungarumlaut -50
+KPX Aogonek Umacron -50
+KPX Aogonek Uogonek -50
+KPX Aogonek Uring -50
+KPX Aogonek V -80
+KPX Aogonek W -60
+KPX Aogonek Y -110
+KPX Aogonek Yacute -110
+KPX Aogonek Ydieresis -110
+KPX Aogonek u -30
+KPX Aogonek uacute -30
+KPX Aogonek ucircumflex -30
+KPX Aogonek udieresis -30
+KPX Aogonek ugrave -30
+KPX Aogonek uhungarumlaut -30
+KPX Aogonek umacron -30
+KPX Aogonek uogonek -30
+KPX Aogonek uring -30
+KPX Aogonek v -40
+KPX Aogonek w -30
+KPX Aogonek y -30
+KPX Aogonek yacute -30
+KPX Aogonek ydieresis -30
+KPX Aring C -40
+KPX Aring Cacute -40
+KPX Aring Ccaron -40
+KPX Aring Ccedilla -40
+KPX Aring G -50
+KPX Aring Gbreve -50
+KPX Aring Gcommaaccent -50
+KPX Aring O -40
+KPX Aring Oacute -40
+KPX Aring Ocircumflex -40
+KPX Aring Odieresis -40
+KPX Aring Ograve -40
+KPX Aring Ohungarumlaut -40
+KPX Aring Omacron -40
+KPX Aring Oslash -40
+KPX Aring Otilde -40
+KPX Aring Q -40
+KPX Aring T -90
+KPX Aring Tcaron -90
+KPX Aring Tcommaaccent -90
+KPX Aring U -50
+KPX Aring Uacute -50
+KPX Aring Ucircumflex -50
+KPX Aring Udieresis -50
+KPX Aring Ugrave -50
+KPX Aring Uhungarumlaut -50
+KPX Aring Umacron -50
+KPX Aring Uogonek -50
+KPX Aring Uring -50
+KPX Aring V -80
+KPX Aring W -60
+KPX Aring Y -110
+KPX Aring Yacute -110
+KPX Aring Ydieresis -110
+KPX Aring u -30
+KPX Aring uacute -30
+KPX Aring ucircumflex -30
+KPX Aring udieresis -30
+KPX Aring ugrave -30
+KPX Aring uhungarumlaut -30
+KPX Aring umacron -30
+KPX Aring uogonek -30
+KPX Aring uring -30
+KPX Aring v -40
+KPX Aring w -30
+KPX Aring y -30
+KPX Aring yacute -30
+KPX Aring ydieresis -30
+KPX Atilde C -40
+KPX Atilde Cacute -40
+KPX Atilde Ccaron -40
+KPX Atilde Ccedilla -40
+KPX Atilde G -50
+KPX Atilde Gbreve -50
+KPX Atilde Gcommaaccent -50
+KPX Atilde O -40
+KPX Atilde Oacute -40
+KPX Atilde Ocircumflex -40
+KPX Atilde Odieresis -40
+KPX Atilde Ograve -40
+KPX Atilde Ohungarumlaut -40
+KPX Atilde Omacron -40
+KPX Atilde Oslash -40
+KPX Atilde Otilde -40
+KPX Atilde Q -40
+KPX Atilde T -90
+KPX Atilde Tcaron -90
+KPX Atilde Tcommaaccent -90
+KPX Atilde U -50
+KPX Atilde Uacute -50
+KPX Atilde Ucircumflex -50
+KPX Atilde Udieresis -50
+KPX Atilde Ugrave -50
+KPX Atilde Uhungarumlaut -50
+KPX Atilde Umacron -50
+KPX Atilde Uogonek -50
+KPX Atilde Uring -50
+KPX Atilde V -80
+KPX Atilde W -60
+KPX Atilde Y -110
+KPX Atilde Yacute -110
+KPX Atilde Ydieresis -110
+KPX Atilde u -30
+KPX Atilde uacute -30
+KPX Atilde ucircumflex -30
+KPX Atilde udieresis -30
+KPX Atilde ugrave -30
+KPX Atilde uhungarumlaut -30
+KPX Atilde umacron -30
+KPX Atilde uogonek -30
+KPX Atilde uring -30
+KPX Atilde v -40
+KPX Atilde w -30
+KPX Atilde y -30
+KPX Atilde yacute -30
+KPX Atilde ydieresis -30
+KPX B A -30
+KPX B Aacute -30
+KPX B Abreve -30
+KPX B Acircumflex -30
+KPX B Adieresis -30
+KPX B Agrave -30
+KPX B Amacron -30
+KPX B Aogonek -30
+KPX B Aring -30
+KPX B Atilde -30
+KPX B U -10
+KPX B Uacute -10
+KPX B Ucircumflex -10
+KPX B Udieresis -10
+KPX B Ugrave -10
+KPX B Uhungarumlaut -10
+KPX B Umacron -10
+KPX B Uogonek -10
+KPX B Uring -10
+KPX D A -40
+KPX D Aacute -40
+KPX D Abreve -40
+KPX D Acircumflex -40
+KPX D Adieresis -40
+KPX D Agrave -40
+KPX D Amacron -40
+KPX D Aogonek -40
+KPX D Aring -40
+KPX D Atilde -40
+KPX D V -40
+KPX D W -40
+KPX D Y -70
+KPX D Yacute -70
+KPX D Ydieresis -70
+KPX D comma -30
+KPX D period -30
+KPX Dcaron A -40
+KPX Dcaron Aacute -40
+KPX Dcaron Abreve -40
+KPX Dcaron Acircumflex -40
+KPX Dcaron Adieresis -40
+KPX Dcaron Agrave -40
+KPX Dcaron Amacron -40
+KPX Dcaron Aogonek -40
+KPX Dcaron Aring -40
+KPX Dcaron Atilde -40
+KPX Dcaron V -40
+KPX Dcaron W -40
+KPX Dcaron Y -70
+KPX Dcaron Yacute -70
+KPX Dcaron Ydieresis -70
+KPX Dcaron comma -30
+KPX Dcaron period -30
+KPX Dcroat A -40
+KPX Dcroat Aacute -40
+KPX Dcroat Abreve -40
+KPX Dcroat Acircumflex -40
+KPX Dcroat Adieresis -40
+KPX Dcroat Agrave -40
+KPX Dcroat Amacron -40
+KPX Dcroat Aogonek -40
+KPX Dcroat Aring -40
+KPX Dcroat Atilde -40
+KPX Dcroat V -40
+KPX Dcroat W -40
+KPX Dcroat Y -70
+KPX Dcroat Yacute -70
+KPX Dcroat Ydieresis -70
+KPX Dcroat comma -30
+KPX Dcroat period -30
+KPX F A -80
+KPX F Aacute -80
+KPX F Abreve -80
+KPX F Acircumflex -80
+KPX F Adieresis -80
+KPX F Agrave -80
+KPX F Amacron -80
+KPX F Aogonek -80
+KPX F Aring -80
+KPX F Atilde -80
+KPX F a -20
+KPX F aacute -20
+KPX F abreve -20
+KPX F acircumflex -20
+KPX F adieresis -20
+KPX F agrave -20
+KPX F amacron -20
+KPX F aogonek -20
+KPX F aring -20
+KPX F atilde -20
+KPX F comma -100
+KPX F period -100
+KPX J A -20
+KPX J Aacute -20
+KPX J Abreve -20
+KPX J Acircumflex -20
+KPX J Adieresis -20
+KPX J Agrave -20
+KPX J Amacron -20
+KPX J Aogonek -20
+KPX J Aring -20
+KPX J Atilde -20
+KPX J comma -20
+KPX J period -20
+KPX J u -20
+KPX J uacute -20
+KPX J ucircumflex -20
+KPX J udieresis -20
+KPX J ugrave -20
+KPX J uhungarumlaut -20
+KPX J umacron -20
+KPX J uogonek -20
+KPX J uring -20
+KPX K O -30
+KPX K Oacute -30
+KPX K Ocircumflex -30
+KPX K Odieresis -30
+KPX K Ograve -30
+KPX K Ohungarumlaut -30
+KPX K Omacron -30
+KPX K Oslash -30
+KPX K Otilde -30
+KPX K e -15
+KPX K eacute -15
+KPX K ecaron -15
+KPX K ecircumflex -15
+KPX K edieresis -15
+KPX K edotaccent -15
+KPX K egrave -15
+KPX K emacron -15
+KPX K eogonek -15
+KPX K o -35
+KPX K oacute -35
+KPX K ocircumflex -35
+KPX K odieresis -35
+KPX K ograve -35
+KPX K ohungarumlaut -35
+KPX K omacron -35
+KPX K oslash -35
+KPX K otilde -35
+KPX K u -30
+KPX K uacute -30
+KPX K ucircumflex -30
+KPX K udieresis -30
+KPX K ugrave -30
+KPX K uhungarumlaut -30
+KPX K umacron -30
+KPX K uogonek -30
+KPX K uring -30
+KPX K y -40
+KPX K yacute -40
+KPX K ydieresis -40
+KPX Kcommaaccent O -30
+KPX Kcommaaccent Oacute -30
+KPX Kcommaaccent Ocircumflex -30
+KPX Kcommaaccent Odieresis -30
+KPX Kcommaaccent Ograve -30
+KPX Kcommaaccent Ohungarumlaut -30
+KPX Kcommaaccent Omacron -30
+KPX Kcommaaccent Oslash -30
+KPX Kcommaaccent Otilde -30
+KPX Kcommaaccent e -15
+KPX Kcommaaccent eacute -15
+KPX Kcommaaccent ecaron -15
+KPX Kcommaaccent ecircumflex -15
+KPX Kcommaaccent edieresis -15
+KPX Kcommaaccent edotaccent -15
+KPX Kcommaaccent egrave -15
+KPX Kcommaaccent emacron -15
+KPX Kcommaaccent eogonek -15
+KPX Kcommaaccent o -35
+KPX Kcommaaccent oacute -35
+KPX Kcommaaccent ocircumflex -35
+KPX Kcommaaccent odieresis -35
+KPX Kcommaaccent ograve -35
+KPX Kcommaaccent ohungarumlaut -35
+KPX Kcommaaccent omacron -35
+KPX Kcommaaccent oslash -35
+KPX Kcommaaccent otilde -35
+KPX Kcommaaccent u -30
+KPX Kcommaaccent uacute -30
+KPX Kcommaaccent ucircumflex -30
+KPX Kcommaaccent udieresis -30
+KPX Kcommaaccent ugrave -30
+KPX Kcommaaccent uhungarumlaut -30
+KPX Kcommaaccent umacron -30
+KPX Kcommaaccent uogonek -30
+KPX Kcommaaccent uring -30
+KPX Kcommaaccent y -40
+KPX Kcommaaccent yacute -40
+KPX Kcommaaccent ydieresis -40
+KPX L T -90
+KPX L Tcaron -90
+KPX L Tcommaaccent -90
+KPX L V -110
+KPX L W -80
+KPX L Y -120
+KPX L Yacute -120
+KPX L Ydieresis -120
+KPX L quotedblright -140
+KPX L quoteright -140
+KPX L y -30
+KPX L yacute -30
+KPX L ydieresis -30
+KPX Lacute T -90
+KPX Lacute Tcaron -90
+KPX Lacute Tcommaaccent -90
+KPX Lacute V -110
+KPX Lacute W -80
+KPX Lacute Y -120
+KPX Lacute Yacute -120
+KPX Lacute Ydieresis -120
+KPX Lacute quotedblright -140
+KPX Lacute quoteright -140
+KPX Lacute y -30
+KPX Lacute yacute -30
+KPX Lacute ydieresis -30
+KPX Lcommaaccent T -90
+KPX Lcommaaccent Tcaron -90
+KPX Lcommaaccent Tcommaaccent -90
+KPX Lcommaaccent V -110
+KPX Lcommaaccent W -80
+KPX Lcommaaccent Y -120
+KPX Lcommaaccent Yacute -120
+KPX Lcommaaccent Ydieresis -120
+KPX Lcommaaccent quotedblright -140
+KPX Lcommaaccent quoteright -140
+KPX Lcommaaccent y -30
+KPX Lcommaaccent yacute -30
+KPX Lcommaaccent ydieresis -30
+KPX Lslash T -90
+KPX Lslash Tcaron -90
+KPX Lslash Tcommaaccent -90
+KPX Lslash V -110
+KPX Lslash W -80
+KPX Lslash Y -120
+KPX Lslash Yacute -120
+KPX Lslash Ydieresis -120
+KPX Lslash quotedblright -140
+KPX Lslash quoteright -140
+KPX Lslash y -30
+KPX Lslash yacute -30
+KPX Lslash ydieresis -30
+KPX O A -50
+KPX O Aacute -50
+KPX O Abreve -50
+KPX O Acircumflex -50
+KPX O Adieresis -50
+KPX O Agrave -50
+KPX O Amacron -50
+KPX O Aogonek -50
+KPX O Aring -50
+KPX O Atilde -50
+KPX O T -40
+KPX O Tcaron -40
+KPX O Tcommaaccent -40
+KPX O V -50
+KPX O W -50
+KPX O X -50
+KPX O Y -70
+KPX O Yacute -70
+KPX O Ydieresis -70
+KPX O comma -40
+KPX O period -40
+KPX Oacute A -50
+KPX Oacute Aacute -50
+KPX Oacute Abreve -50
+KPX Oacute Acircumflex -50
+KPX Oacute Adieresis -50
+KPX Oacute Agrave -50
+KPX Oacute Amacron -50
+KPX Oacute Aogonek -50
+KPX Oacute Aring -50
+KPX Oacute Atilde -50
+KPX Oacute T -40
+KPX Oacute Tcaron -40
+KPX Oacute Tcommaaccent -40
+KPX Oacute V -50
+KPX Oacute W -50
+KPX Oacute X -50
+KPX Oacute Y -70
+KPX Oacute Yacute -70
+KPX Oacute Ydieresis -70
+KPX Oacute comma -40
+KPX Oacute period -40
+KPX Ocircumflex A -50
+KPX Ocircumflex Aacute -50
+KPX Ocircumflex Abreve -50
+KPX Ocircumflex Acircumflex -50
+KPX Ocircumflex Adieresis -50
+KPX Ocircumflex Agrave -50
+KPX Ocircumflex Amacron -50
+KPX Ocircumflex Aogonek -50
+KPX Ocircumflex Aring -50
+KPX Ocircumflex Atilde -50
+KPX Ocircumflex T -40
+KPX Ocircumflex Tcaron -40
+KPX Ocircumflex Tcommaaccent -40
+KPX Ocircumflex V -50
+KPX Ocircumflex W -50
+KPX Ocircumflex X -50
+KPX Ocircumflex Y -70
+KPX Ocircumflex Yacute -70
+KPX Ocircumflex Ydieresis -70
+KPX Ocircumflex comma -40
+KPX Ocircumflex period -40
+KPX Odieresis A -50
+KPX Odieresis Aacute -50
+KPX Odieresis Abreve -50
+KPX Odieresis Acircumflex -50
+KPX Odieresis Adieresis -50
+KPX Odieresis Agrave -50
+KPX Odieresis Amacron -50
+KPX Odieresis Aogonek -50
+KPX Odieresis Aring -50
+KPX Odieresis Atilde -50
+KPX Odieresis T -40
+KPX Odieresis Tcaron -40
+KPX Odieresis Tcommaaccent -40
+KPX Odieresis V -50
+KPX Odieresis W -50
+KPX Odieresis X -50
+KPX Odieresis Y -70
+KPX Odieresis Yacute -70
+KPX Odieresis Ydieresis -70
+KPX Odieresis comma -40
+KPX Odieresis period -40
+KPX Ograve A -50
+KPX Ograve Aacute -50
+KPX Ograve Abreve -50
+KPX Ograve Acircumflex -50
+KPX Ograve Adieresis -50
+KPX Ograve Agrave -50
+KPX Ograve Amacron -50
+KPX Ograve Aogonek -50
+KPX Ograve Aring -50
+KPX Ograve Atilde -50
+KPX Ograve T -40
+KPX Ograve Tcaron -40
+KPX Ograve Tcommaaccent -40
+KPX Ograve V -50
+KPX Ograve W -50
+KPX Ograve X -50
+KPX Ograve Y -70
+KPX Ograve Yacute -70
+KPX Ograve Ydieresis -70
+KPX Ograve comma -40
+KPX Ograve period -40
+KPX Ohungarumlaut A -50
+KPX Ohungarumlaut Aacute -50
+KPX Ohungarumlaut Abreve -50
+KPX Ohungarumlaut Acircumflex -50
+KPX Ohungarumlaut Adieresis -50
+KPX Ohungarumlaut Agrave -50
+KPX Ohungarumlaut Amacron -50
+KPX Ohungarumlaut Aogonek -50
+KPX Ohungarumlaut Aring -50
+KPX Ohungarumlaut Atilde -50
+KPX Ohungarumlaut T -40
+KPX Ohungarumlaut Tcaron -40
+KPX Ohungarumlaut Tcommaaccent -40
+KPX Ohungarumlaut V -50
+KPX Ohungarumlaut W -50
+KPX Ohungarumlaut X -50
+KPX Ohungarumlaut Y -70
+KPX Ohungarumlaut Yacute -70
+KPX Ohungarumlaut Ydieresis -70
+KPX Ohungarumlaut comma -40
+KPX Ohungarumlaut period -40
+KPX Omacron A -50
+KPX Omacron Aacute -50
+KPX Omacron Abreve -50
+KPX Omacron Acircumflex -50
+KPX Omacron Adieresis -50
+KPX Omacron Agrave -50
+KPX Omacron Amacron -50
+KPX Omacron Aogonek -50
+KPX Omacron Aring -50
+KPX Omacron Atilde -50
+KPX Omacron T -40
+KPX Omacron Tcaron -40
+KPX Omacron Tcommaaccent -40
+KPX Omacron V -50
+KPX Omacron W -50
+KPX Omacron X -50
+KPX Omacron Y -70
+KPX Omacron Yacute -70
+KPX Omacron Ydieresis -70
+KPX Omacron comma -40
+KPX Omacron period -40
+KPX Oslash A -50
+KPX Oslash Aacute -50
+KPX Oslash Abreve -50
+KPX Oslash Acircumflex -50
+KPX Oslash Adieresis -50
+KPX Oslash Agrave -50
+KPX Oslash Amacron -50
+KPX Oslash Aogonek -50
+KPX Oslash Aring -50
+KPX Oslash Atilde -50
+KPX Oslash T -40
+KPX Oslash Tcaron -40
+KPX Oslash Tcommaaccent -40
+KPX Oslash V -50
+KPX Oslash W -50
+KPX Oslash X -50
+KPX Oslash Y -70
+KPX Oslash Yacute -70
+KPX Oslash Ydieresis -70
+KPX Oslash comma -40
+KPX Oslash period -40
+KPX Otilde A -50
+KPX Otilde Aacute -50
+KPX Otilde Abreve -50
+KPX Otilde Acircumflex -50
+KPX Otilde Adieresis -50
+KPX Otilde Agrave -50
+KPX Otilde Amacron -50
+KPX Otilde Aogonek -50
+KPX Otilde Aring -50
+KPX Otilde Atilde -50
+KPX Otilde T -40
+KPX Otilde Tcaron -40
+KPX Otilde Tcommaaccent -40
+KPX Otilde V -50
+KPX Otilde W -50
+KPX Otilde X -50
+KPX Otilde Y -70
+KPX Otilde Yacute -70
+KPX Otilde Ydieresis -70
+KPX Otilde comma -40
+KPX Otilde period -40
+KPX P A -100
+KPX P Aacute -100
+KPX P Abreve -100
+KPX P Acircumflex -100
+KPX P Adieresis -100
+KPX P Agrave -100
+KPX P Amacron -100
+KPX P Aogonek -100
+KPX P Aring -100
+KPX P Atilde -100
+KPX P a -30
+KPX P aacute -30
+KPX P abreve -30
+KPX P acircumflex -30
+KPX P adieresis -30
+KPX P agrave -30
+KPX P amacron -30
+KPX P aogonek -30
+KPX P aring -30
+KPX P atilde -30
+KPX P comma -120
+KPX P e -30
+KPX P eacute -30
+KPX P ecaron -30
+KPX P ecircumflex -30
+KPX P edieresis -30
+KPX P edotaccent -30
+KPX P egrave -30
+KPX P emacron -30
+KPX P eogonek -30
+KPX P o -40
+KPX P oacute -40
+KPX P ocircumflex -40
+KPX P odieresis -40
+KPX P ograve -40
+KPX P ohungarumlaut -40
+KPX P omacron -40
+KPX P oslash -40
+KPX P otilde -40
+KPX P period -120
+KPX Q U -10
+KPX Q Uacute -10
+KPX Q Ucircumflex -10
+KPX Q Udieresis -10
+KPX Q Ugrave -10
+KPX Q Uhungarumlaut -10
+KPX Q Umacron -10
+KPX Q Uogonek -10
+KPX Q Uring -10
+KPX Q comma 20
+KPX Q period 20
+KPX R O -20
+KPX R Oacute -20
+KPX R Ocircumflex -20
+KPX R Odieresis -20
+KPX R Ograve -20
+KPX R Ohungarumlaut -20
+KPX R Omacron -20
+KPX R Oslash -20
+KPX R Otilde -20
+KPX R T -20
+KPX R Tcaron -20
+KPX R Tcommaaccent -20
+KPX R U -20
+KPX R Uacute -20
+KPX R Ucircumflex -20
+KPX R Udieresis -20
+KPX R Ugrave -20
+KPX R Uhungarumlaut -20
+KPX R Umacron -20
+KPX R Uogonek -20
+KPX R Uring -20
+KPX R V -50
+KPX R W -40
+KPX R Y -50
+KPX R Yacute -50
+KPX R Ydieresis -50
+KPX Racute O -20
+KPX Racute Oacute -20
+KPX Racute Ocircumflex -20
+KPX Racute Odieresis -20
+KPX Racute Ograve -20
+KPX Racute Ohungarumlaut -20
+KPX Racute Omacron -20
+KPX Racute Oslash -20
+KPX Racute Otilde -20
+KPX Racute T -20
+KPX Racute Tcaron -20
+KPX Racute Tcommaaccent -20
+KPX Racute U -20
+KPX Racute Uacute -20
+KPX Racute Ucircumflex -20
+KPX Racute Udieresis -20
+KPX Racute Ugrave -20
+KPX Racute Uhungarumlaut -20
+KPX Racute Umacron -20
+KPX Racute Uogonek -20
+KPX Racute Uring -20
+KPX Racute V -50
+KPX Racute W -40
+KPX Racute Y -50
+KPX Racute Yacute -50
+KPX Racute Ydieresis -50
+KPX Rcaron O -20
+KPX Rcaron Oacute -20
+KPX Rcaron Ocircumflex -20
+KPX Rcaron Odieresis -20
+KPX Rcaron Ograve -20
+KPX Rcaron Ohungarumlaut -20
+KPX Rcaron Omacron -20
+KPX Rcaron Oslash -20
+KPX Rcaron Otilde -20
+KPX Rcaron T -20
+KPX Rcaron Tcaron -20
+KPX Rcaron Tcommaaccent -20
+KPX Rcaron U -20
+KPX Rcaron Uacute -20
+KPX Rcaron Ucircumflex -20
+KPX Rcaron Udieresis -20
+KPX Rcaron Ugrave -20
+KPX Rcaron Uhungarumlaut -20
+KPX Rcaron Umacron -20
+KPX Rcaron Uogonek -20
+KPX Rcaron Uring -20
+KPX Rcaron V -50
+KPX Rcaron W -40
+KPX Rcaron Y -50
+KPX Rcaron Yacute -50
+KPX Rcaron Ydieresis -50
+KPX Rcommaaccent O -20
+KPX Rcommaaccent Oacute -20
+KPX Rcommaaccent Ocircumflex -20
+KPX Rcommaaccent Odieresis -20
+KPX Rcommaaccent Ograve -20
+KPX Rcommaaccent Ohungarumlaut -20
+KPX Rcommaaccent Omacron -20
+KPX Rcommaaccent Oslash -20
+KPX Rcommaaccent Otilde -20
+KPX Rcommaaccent T -20
+KPX Rcommaaccent Tcaron -20
+KPX Rcommaaccent Tcommaaccent -20
+KPX Rcommaaccent U -20
+KPX Rcommaaccent Uacute -20
+KPX Rcommaaccent Ucircumflex -20
+KPX Rcommaaccent Udieresis -20
+KPX Rcommaaccent Ugrave -20
+KPX Rcommaaccent Uhungarumlaut -20
+KPX Rcommaaccent Umacron -20
+KPX Rcommaaccent Uogonek -20
+KPX Rcommaaccent Uring -20
+KPX Rcommaaccent V -50
+KPX Rcommaaccent W -40
+KPX Rcommaaccent Y -50
+KPX Rcommaaccent Yacute -50
+KPX Rcommaaccent Ydieresis -50
+KPX T A -90
+KPX T Aacute -90
+KPX T Abreve -90
+KPX T Acircumflex -90
+KPX T Adieresis -90
+KPX T Agrave -90
+KPX T Amacron -90
+KPX T Aogonek -90
+KPX T Aring -90
+KPX T Atilde -90
+KPX T O -40
+KPX T Oacute -40
+KPX T Ocircumflex -40
+KPX T Odieresis -40
+KPX T Ograve -40
+KPX T Ohungarumlaut -40
+KPX T Omacron -40
+KPX T Oslash -40
+KPX T Otilde -40
+KPX T a -80
+KPX T aacute -80
+KPX T abreve -80
+KPX T acircumflex -80
+KPX T adieresis -80
+KPX T agrave -80
+KPX T amacron -80
+KPX T aogonek -80
+KPX T aring -80
+KPX T atilde -80
+KPX T colon -40
+KPX T comma -80
+KPX T e -60
+KPX T eacute -60
+KPX T ecaron -60
+KPX T ecircumflex -60
+KPX T edieresis -60
+KPX T edotaccent -60
+KPX T egrave -60
+KPX T emacron -60
+KPX T eogonek -60
+KPX T hyphen -120
+KPX T o -80
+KPX T oacute -80
+KPX T ocircumflex -80
+KPX T odieresis -80
+KPX T ograve -80
+KPX T ohungarumlaut -80
+KPX T omacron -80
+KPX T oslash -80
+KPX T otilde -80
+KPX T period -80
+KPX T r -80
+KPX T racute -80
+KPX T rcommaaccent -80
+KPX T semicolon -40
+KPX T u -90
+KPX T uacute -90
+KPX T ucircumflex -90
+KPX T udieresis -90
+KPX T ugrave -90
+KPX T uhungarumlaut -90
+KPX T umacron -90
+KPX T uogonek -90
+KPX T uring -90
+KPX T w -60
+KPX T y -60
+KPX T yacute -60
+KPX T ydieresis -60
+KPX Tcaron A -90
+KPX Tcaron Aacute -90
+KPX Tcaron Abreve -90
+KPX Tcaron Acircumflex -90
+KPX Tcaron Adieresis -90
+KPX Tcaron Agrave -90
+KPX Tcaron Amacron -90
+KPX Tcaron Aogonek -90
+KPX Tcaron Aring -90
+KPX Tcaron Atilde -90
+KPX Tcaron O -40
+KPX Tcaron Oacute -40
+KPX Tcaron Ocircumflex -40
+KPX Tcaron Odieresis -40
+KPX Tcaron Ograve -40
+KPX Tcaron Ohungarumlaut -40
+KPX Tcaron Omacron -40
+KPX Tcaron Oslash -40
+KPX Tcaron Otilde -40
+KPX Tcaron a -80
+KPX Tcaron aacute -80
+KPX Tcaron abreve -80
+KPX Tcaron acircumflex -80
+KPX Tcaron adieresis -80
+KPX Tcaron agrave -80
+KPX Tcaron amacron -80
+KPX Tcaron aogonek -80
+KPX Tcaron aring -80
+KPX Tcaron atilde -80
+KPX Tcaron colon -40
+KPX Tcaron comma -80
+KPX Tcaron e -60
+KPX Tcaron eacute -60
+KPX Tcaron ecaron -60
+KPX Tcaron ecircumflex -60
+KPX Tcaron edieresis -60
+KPX Tcaron edotaccent -60
+KPX Tcaron egrave -60
+KPX Tcaron emacron -60
+KPX Tcaron eogonek -60
+KPX Tcaron hyphen -120
+KPX Tcaron o -80
+KPX Tcaron oacute -80
+KPX Tcaron ocircumflex -80
+KPX Tcaron odieresis -80
+KPX Tcaron ograve -80
+KPX Tcaron ohungarumlaut -80
+KPX Tcaron omacron -80
+KPX Tcaron oslash -80
+KPX Tcaron otilde -80
+KPX Tcaron period -80
+KPX Tcaron r -80
+KPX Tcaron racute -80
+KPX Tcaron rcommaaccent -80
+KPX Tcaron semicolon -40
+KPX Tcaron u -90
+KPX Tcaron uacute -90
+KPX Tcaron ucircumflex -90
+KPX Tcaron udieresis -90
+KPX Tcaron ugrave -90
+KPX Tcaron uhungarumlaut -90
+KPX Tcaron umacron -90
+KPX Tcaron uogonek -90
+KPX Tcaron uring -90
+KPX Tcaron w -60
+KPX Tcaron y -60
+KPX Tcaron yacute -60
+KPX Tcaron ydieresis -60
+KPX Tcommaaccent A -90
+KPX Tcommaaccent Aacute -90
+KPX Tcommaaccent Abreve -90
+KPX Tcommaaccent Acircumflex -90
+KPX Tcommaaccent Adieresis -90
+KPX Tcommaaccent Agrave -90
+KPX Tcommaaccent Amacron -90
+KPX Tcommaaccent Aogonek -90
+KPX Tcommaaccent Aring -90
+KPX Tcommaaccent Atilde -90
+KPX Tcommaaccent O -40
+KPX Tcommaaccent Oacute -40
+KPX Tcommaaccent Ocircumflex -40
+KPX Tcommaaccent Odieresis -40
+KPX Tcommaaccent Ograve -40
+KPX Tcommaaccent Ohungarumlaut -40
+KPX Tcommaaccent Omacron -40
+KPX Tcommaaccent Oslash -40
+KPX Tcommaaccent Otilde -40
+KPX Tcommaaccent a -80
+KPX Tcommaaccent aacute -80
+KPX Tcommaaccent abreve -80
+KPX Tcommaaccent acircumflex -80
+KPX Tcommaaccent adieresis -80
+KPX Tcommaaccent agrave -80
+KPX Tcommaaccent amacron -80
+KPX Tcommaaccent aogonek -80
+KPX Tcommaaccent aring -80
+KPX Tcommaaccent atilde -80
+KPX Tcommaaccent colon -40
+KPX Tcommaaccent comma -80
+KPX Tcommaaccent e -60
+KPX Tcommaaccent eacute -60
+KPX Tcommaaccent ecaron -60
+KPX Tcommaaccent ecircumflex -60
+KPX Tcommaaccent edieresis -60
+KPX Tcommaaccent edotaccent -60
+KPX Tcommaaccent egrave -60
+KPX Tcommaaccent emacron -60
+KPX Tcommaaccent eogonek -60
+KPX Tcommaaccent hyphen -120
+KPX Tcommaaccent o -80
+KPX Tcommaaccent oacute -80
+KPX Tcommaaccent ocircumflex -80
+KPX Tcommaaccent odieresis -80
+KPX Tcommaaccent ograve -80
+KPX Tcommaaccent ohungarumlaut -80
+KPX Tcommaaccent omacron -80
+KPX Tcommaaccent oslash -80
+KPX Tcommaaccent otilde -80
+KPX Tcommaaccent period -80
+KPX Tcommaaccent r -80
+KPX Tcommaaccent racute -80
+KPX Tcommaaccent rcommaaccent -80
+KPX Tcommaaccent semicolon -40
+KPX Tcommaaccent u -90
+KPX Tcommaaccent uacute -90
+KPX Tcommaaccent ucircumflex -90
+KPX Tcommaaccent udieresis -90
+KPX Tcommaaccent ugrave -90
+KPX Tcommaaccent uhungarumlaut -90
+KPX Tcommaaccent umacron -90
+KPX Tcommaaccent uogonek -90
+KPX Tcommaaccent uring -90
+KPX Tcommaaccent w -60
+KPX Tcommaaccent y -60
+KPX Tcommaaccent yacute -60
+KPX Tcommaaccent ydieresis -60
+KPX U A -50
+KPX U Aacute -50
+KPX U Abreve -50
+KPX U Acircumflex -50
+KPX U Adieresis -50
+KPX U Agrave -50
+KPX U Amacron -50
+KPX U Aogonek -50
+KPX U Aring -50
+KPX U Atilde -50
+KPX U comma -30
+KPX U period -30
+KPX Uacute A -50
+KPX Uacute Aacute -50
+KPX Uacute Abreve -50
+KPX Uacute Acircumflex -50
+KPX Uacute Adieresis -50
+KPX Uacute Agrave -50
+KPX Uacute Amacron -50
+KPX Uacute Aogonek -50
+KPX Uacute Aring -50
+KPX Uacute Atilde -50
+KPX Uacute comma -30
+KPX Uacute period -30
+KPX Ucircumflex A -50
+KPX Ucircumflex Aacute -50
+KPX Ucircumflex Abreve -50
+KPX Ucircumflex Acircumflex -50
+KPX Ucircumflex Adieresis -50
+KPX Ucircumflex Agrave -50
+KPX Ucircumflex Amacron -50
+KPX Ucircumflex Aogonek -50
+KPX Ucircumflex Aring -50
+KPX Ucircumflex Atilde -50
+KPX Ucircumflex comma -30
+KPX Ucircumflex period -30
+KPX Udieresis A -50
+KPX Udieresis Aacute -50
+KPX Udieresis Abreve -50
+KPX Udieresis Acircumflex -50
+KPX Udieresis Adieresis -50
+KPX Udieresis Agrave -50
+KPX Udieresis Amacron -50
+KPX Udieresis Aogonek -50
+KPX Udieresis Aring -50
+KPX Udieresis Atilde -50
+KPX Udieresis comma -30
+KPX Udieresis period -30
+KPX Ugrave A -50
+KPX Ugrave Aacute -50
+KPX Ugrave Abreve -50
+KPX Ugrave Acircumflex -50
+KPX Ugrave Adieresis -50
+KPX Ugrave Agrave -50
+KPX Ugrave Amacron -50
+KPX Ugrave Aogonek -50
+KPX Ugrave Aring -50
+KPX Ugrave Atilde -50
+KPX Ugrave comma -30
+KPX Ugrave period -30
+KPX Uhungarumlaut A -50
+KPX Uhungarumlaut Aacute -50
+KPX Uhungarumlaut Abreve -50
+KPX Uhungarumlaut Acircumflex -50
+KPX Uhungarumlaut Adieresis -50
+KPX Uhungarumlaut Agrave -50
+KPX Uhungarumlaut Amacron -50
+KPX Uhungarumlaut Aogonek -50
+KPX Uhungarumlaut Aring -50
+KPX Uhungarumlaut Atilde -50
+KPX Uhungarumlaut comma -30
+KPX Uhungarumlaut period -30
+KPX Umacron A -50
+KPX Umacron Aacute -50
+KPX Umacron Abreve -50
+KPX Umacron Acircumflex -50
+KPX Umacron Adieresis -50
+KPX Umacron Agrave -50
+KPX Umacron Amacron -50
+KPX Umacron Aogonek -50
+KPX Umacron Aring -50
+KPX Umacron Atilde -50
+KPX Umacron comma -30
+KPX Umacron period -30
+KPX Uogonek A -50
+KPX Uogonek Aacute -50
+KPX Uogonek Abreve -50
+KPX Uogonek Acircumflex -50
+KPX Uogonek Adieresis -50
+KPX Uogonek Agrave -50
+KPX Uogonek Amacron -50
+KPX Uogonek Aogonek -50
+KPX Uogonek Aring -50
+KPX Uogonek Atilde -50
+KPX Uogonek comma -30
+KPX Uogonek period -30
+KPX Uring A -50
+KPX Uring Aacute -50
+KPX Uring Abreve -50
+KPX Uring Acircumflex -50
+KPX Uring Adieresis -50
+KPX Uring Agrave -50
+KPX Uring Amacron -50
+KPX Uring Aogonek -50
+KPX Uring Aring -50
+KPX Uring Atilde -50
+KPX Uring comma -30
+KPX Uring period -30
+KPX V A -80
+KPX V Aacute -80
+KPX V Abreve -80
+KPX V Acircumflex -80
+KPX V Adieresis -80
+KPX V Agrave -80
+KPX V Amacron -80
+KPX V Aogonek -80
+KPX V Aring -80
+KPX V Atilde -80
+KPX V G -50
+KPX V Gbreve -50
+KPX V Gcommaaccent -50
+KPX V O -50
+KPX V Oacute -50
+KPX V Ocircumflex -50
+KPX V Odieresis -50
+KPX V Ograve -50
+KPX V Ohungarumlaut -50
+KPX V Omacron -50
+KPX V Oslash -50
+KPX V Otilde -50
+KPX V a -60
+KPX V aacute -60
+KPX V abreve -60
+KPX V acircumflex -60
+KPX V adieresis -60
+KPX V agrave -60
+KPX V amacron -60
+KPX V aogonek -60
+KPX V aring -60
+KPX V atilde -60
+KPX V colon -40
+KPX V comma -120
+KPX V e -50
+KPX V eacute -50
+KPX V ecaron -50
+KPX V ecircumflex -50
+KPX V edieresis -50
+KPX V edotaccent -50
+KPX V egrave -50
+KPX V emacron -50
+KPX V eogonek -50
+KPX V hyphen -80
+KPX V o -90
+KPX V oacute -90
+KPX V ocircumflex -90
+KPX V odieresis -90
+KPX V ograve -90
+KPX V ohungarumlaut -90
+KPX V omacron -90
+KPX V oslash -90
+KPX V otilde -90
+KPX V period -120
+KPX V semicolon -40
+KPX V u -60
+KPX V uacute -60
+KPX V ucircumflex -60
+KPX V udieresis -60
+KPX V ugrave -60
+KPX V uhungarumlaut -60
+KPX V umacron -60
+KPX V uogonek -60
+KPX V uring -60
+KPX W A -60
+KPX W Aacute -60
+KPX W Abreve -60
+KPX W Acircumflex -60
+KPX W Adieresis -60
+KPX W Agrave -60
+KPX W Amacron -60
+KPX W Aogonek -60
+KPX W Aring -60
+KPX W Atilde -60
+KPX W O -20
+KPX W Oacute -20
+KPX W Ocircumflex -20
+KPX W Odieresis -20
+KPX W Ograve -20
+KPX W Ohungarumlaut -20
+KPX W Omacron -20
+KPX W Oslash -20
+KPX W Otilde -20
+KPX W a -40
+KPX W aacute -40
+KPX W abreve -40
+KPX W acircumflex -40
+KPX W adieresis -40
+KPX W agrave -40
+KPX W amacron -40
+KPX W aogonek -40
+KPX W aring -40
+KPX W atilde -40
+KPX W colon -10
+KPX W comma -80
+KPX W e -35
+KPX W eacute -35
+KPX W ecaron -35
+KPX W ecircumflex -35
+KPX W edieresis -35
+KPX W edotaccent -35
+KPX W egrave -35
+KPX W emacron -35
+KPX W eogonek -35
+KPX W hyphen -40
+KPX W o -60
+KPX W oacute -60
+KPX W ocircumflex -60
+KPX W odieresis -60
+KPX W ograve -60
+KPX W ohungarumlaut -60
+KPX W omacron -60
+KPX W oslash -60
+KPX W otilde -60
+KPX W period -80
+KPX W semicolon -10
+KPX W u -45
+KPX W uacute -45
+KPX W ucircumflex -45
+KPX W udieresis -45
+KPX W ugrave -45
+KPX W uhungarumlaut -45
+KPX W umacron -45
+KPX W uogonek -45
+KPX W uring -45
+KPX W y -20
+KPX W yacute -20
+KPX W ydieresis -20
+KPX Y A -110
+KPX Y Aacute -110
+KPX Y Abreve -110
+KPX Y Acircumflex -110
+KPX Y Adieresis -110
+KPX Y Agrave -110
+KPX Y Amacron -110
+KPX Y Aogonek -110
+KPX Y Aring -110
+KPX Y Atilde -110
+KPX Y O -70
+KPX Y Oacute -70
+KPX Y Ocircumflex -70
+KPX Y Odieresis -70
+KPX Y Ograve -70
+KPX Y Ohungarumlaut -70
+KPX Y Omacron -70
+KPX Y Oslash -70
+KPX Y Otilde -70
+KPX Y a -90
+KPX Y aacute -90
+KPX Y abreve -90
+KPX Y acircumflex -90
+KPX Y adieresis -90
+KPX Y agrave -90
+KPX Y amacron -90
+KPX Y aogonek -90
+KPX Y aring -90
+KPX Y atilde -90
+KPX Y colon -50
+KPX Y comma -100
+KPX Y e -80
+KPX Y eacute -80
+KPX Y ecaron -80
+KPX Y ecircumflex -80
+KPX Y edieresis -80
+KPX Y edotaccent -80
+KPX Y egrave -80
+KPX Y emacron -80
+KPX Y eogonek -80
+KPX Y o -100
+KPX Y oacute -100
+KPX Y ocircumflex -100
+KPX Y odieresis -100
+KPX Y ograve -100
+KPX Y ohungarumlaut -100
+KPX Y omacron -100
+KPX Y oslash -100
+KPX Y otilde -100
+KPX Y period -100
+KPX Y semicolon -50
+KPX Y u -100
+KPX Y uacute -100
+KPX Y ucircumflex -100
+KPX Y udieresis -100
+KPX Y ugrave -100
+KPX Y uhungarumlaut -100
+KPX Y umacron -100
+KPX Y uogonek -100
+KPX Y uring -100
+KPX Yacute A -110
+KPX Yacute Aacute -110
+KPX Yacute Abreve -110
+KPX Yacute Acircumflex -110
+KPX Yacute Adieresis -110
+KPX Yacute Agrave -110
+KPX Yacute Amacron -110
+KPX Yacute Aogonek -110
+KPX Yacute Aring -110
+KPX Yacute Atilde -110
+KPX Yacute O -70
+KPX Yacute Oacute -70
+KPX Yacute Ocircumflex -70
+KPX Yacute Odieresis -70
+KPX Yacute Ograve -70
+KPX Yacute Ohungarumlaut -70
+KPX Yacute Omacron -70
+KPX Yacute Oslash -70
+KPX Yacute Otilde -70
+KPX Yacute a -90
+KPX Yacute aacute -90
+KPX Yacute abreve -90
+KPX Yacute acircumflex -90
+KPX Yacute adieresis -90
+KPX Yacute agrave -90
+KPX Yacute amacron -90
+KPX Yacute aogonek -90
+KPX Yacute aring -90
+KPX Yacute atilde -90
+KPX Yacute colon -50
+KPX Yacute comma -100
+KPX Yacute e -80
+KPX Yacute eacute -80
+KPX Yacute ecaron -80
+KPX Yacute ecircumflex -80
+KPX Yacute edieresis -80
+KPX Yacute edotaccent -80
+KPX Yacute egrave -80
+KPX Yacute emacron -80
+KPX Yacute eogonek -80
+KPX Yacute o -100
+KPX Yacute oacute -100
+KPX Yacute ocircumflex -100
+KPX Yacute odieresis -100
+KPX Yacute ograve -100
+KPX Yacute ohungarumlaut -100
+KPX Yacute omacron -100
+KPX Yacute oslash -100
+KPX Yacute otilde -100
+KPX Yacute period -100
+KPX Yacute semicolon -50
+KPX Yacute u -100
+KPX Yacute uacute -100
+KPX Yacute ucircumflex -100
+KPX Yacute udieresis -100
+KPX Yacute ugrave -100
+KPX Yacute uhungarumlaut -100
+KPX Yacute umacron -100
+KPX Yacute uogonek -100
+KPX Yacute uring -100
+KPX Ydieresis A -110
+KPX Ydieresis Aacute -110
+KPX Ydieresis Abreve -110
+KPX Ydieresis Acircumflex -110
+KPX Ydieresis Adieresis -110
+KPX Ydieresis Agrave -110
+KPX Ydieresis Amacron -110
+KPX Ydieresis Aogonek -110
+KPX Ydieresis Aring -110
+KPX Ydieresis Atilde -110
+KPX Ydieresis O -70
+KPX Ydieresis Oacute -70
+KPX Ydieresis Ocircumflex -70
+KPX Ydieresis Odieresis -70
+KPX Ydieresis Ograve -70
+KPX Ydieresis Ohungarumlaut -70
+KPX Ydieresis Omacron -70
+KPX Ydieresis Oslash -70
+KPX Ydieresis Otilde -70
+KPX Ydieresis a -90
+KPX Ydieresis aacute -90
+KPX Ydieresis abreve -90
+KPX Ydieresis acircumflex -90
+KPX Ydieresis adieresis -90
+KPX Ydieresis agrave -90
+KPX Ydieresis amacron -90
+KPX Ydieresis aogonek -90
+KPX Ydieresis aring -90
+KPX Ydieresis atilde -90
+KPX Ydieresis colon -50
+KPX Ydieresis comma -100
+KPX Ydieresis e -80
+KPX Ydieresis eacute -80
+KPX Ydieresis ecaron -80
+KPX Ydieresis ecircumflex -80
+KPX Ydieresis edieresis -80
+KPX Ydieresis edotaccent -80
+KPX Ydieresis egrave -80
+KPX Ydieresis emacron -80
+KPX Ydieresis eogonek -80
+KPX Ydieresis o -100
+KPX Ydieresis oacute -100
+KPX Ydieresis ocircumflex -100
+KPX Ydieresis odieresis -100
+KPX Ydieresis ograve -100
+KPX Ydieresis ohungarumlaut -100
+KPX Ydieresis omacron -100
+KPX Ydieresis oslash -100
+KPX Ydieresis otilde -100
+KPX Ydieresis period -100
+KPX Ydieresis semicolon -50
+KPX Ydieresis u -100
+KPX Ydieresis uacute -100
+KPX Ydieresis ucircumflex -100
+KPX Ydieresis udieresis -100
+KPX Ydieresis ugrave -100
+KPX Ydieresis uhungarumlaut -100
+KPX Ydieresis umacron -100
+KPX Ydieresis uogonek -100
+KPX Ydieresis uring -100
+KPX a g -10
+KPX a gbreve -10
+KPX a gcommaaccent -10
+KPX a v -15
+KPX a w -15
+KPX a y -20
+KPX a yacute -20
+KPX a ydieresis -20
+KPX aacute g -10
+KPX aacute gbreve -10
+KPX aacute gcommaaccent -10
+KPX aacute v -15
+KPX aacute w -15
+KPX aacute y -20
+KPX aacute yacute -20
+KPX aacute ydieresis -20
+KPX abreve g -10
+KPX abreve gbreve -10
+KPX abreve gcommaaccent -10
+KPX abreve v -15
+KPX abreve w -15
+KPX abreve y -20
+KPX abreve yacute -20
+KPX abreve ydieresis -20
+KPX acircumflex g -10
+KPX acircumflex gbreve -10
+KPX acircumflex gcommaaccent -10
+KPX acircumflex v -15
+KPX acircumflex w -15
+KPX acircumflex y -20
+KPX acircumflex yacute -20
+KPX acircumflex ydieresis -20
+KPX adieresis g -10
+KPX adieresis gbreve -10
+KPX adieresis gcommaaccent -10
+KPX adieresis v -15
+KPX adieresis w -15
+KPX adieresis y -20
+KPX adieresis yacute -20
+KPX adieresis ydieresis -20
+KPX agrave g -10
+KPX agrave gbreve -10
+KPX agrave gcommaaccent -10
+KPX agrave v -15
+KPX agrave w -15
+KPX agrave y -20
+KPX agrave yacute -20
+KPX agrave ydieresis -20
+KPX amacron g -10
+KPX amacron gbreve -10
+KPX amacron gcommaaccent -10
+KPX amacron v -15
+KPX amacron w -15
+KPX amacron y -20
+KPX amacron yacute -20
+KPX amacron ydieresis -20
+KPX aogonek g -10
+KPX aogonek gbreve -10
+KPX aogonek gcommaaccent -10
+KPX aogonek v -15
+KPX aogonek w -15
+KPX aogonek y -20
+KPX aogonek yacute -20
+KPX aogonek ydieresis -20
+KPX aring g -10
+KPX aring gbreve -10
+KPX aring gcommaaccent -10
+KPX aring v -15
+KPX aring w -15
+KPX aring y -20
+KPX aring yacute -20
+KPX aring ydieresis -20
+KPX atilde g -10
+KPX atilde gbreve -10
+KPX atilde gcommaaccent -10
+KPX atilde v -15
+KPX atilde w -15
+KPX atilde y -20
+KPX atilde yacute -20
+KPX atilde ydieresis -20
+KPX b l -10
+KPX b lacute -10
+KPX b lcommaaccent -10
+KPX b lslash -10
+KPX b u -20
+KPX b uacute -20
+KPX b ucircumflex -20
+KPX b udieresis -20
+KPX b ugrave -20
+KPX b uhungarumlaut -20
+KPX b umacron -20
+KPX b uogonek -20
+KPX b uring -20
+KPX b v -20
+KPX b y -20
+KPX b yacute -20
+KPX b ydieresis -20
+KPX c h -10
+KPX c k -20
+KPX c kcommaaccent -20
+KPX c l -20
+KPX c lacute -20
+KPX c lcommaaccent -20
+KPX c lslash -20
+KPX c y -10
+KPX c yacute -10
+KPX c ydieresis -10
+KPX cacute h -10
+KPX cacute k -20
+KPX cacute kcommaaccent -20
+KPX cacute l -20
+KPX cacute lacute -20
+KPX cacute lcommaaccent -20
+KPX cacute lslash -20
+KPX cacute y -10
+KPX cacute yacute -10
+KPX cacute ydieresis -10
+KPX ccaron h -10
+KPX ccaron k -20
+KPX ccaron kcommaaccent -20
+KPX ccaron l -20
+KPX ccaron lacute -20
+KPX ccaron lcommaaccent -20
+KPX ccaron lslash -20
+KPX ccaron y -10
+KPX ccaron yacute -10
+KPX ccaron ydieresis -10
+KPX ccedilla h -10
+KPX ccedilla k -20
+KPX ccedilla kcommaaccent -20
+KPX ccedilla l -20
+KPX ccedilla lacute -20
+KPX ccedilla lcommaaccent -20
+KPX ccedilla lslash -20
+KPX ccedilla y -10
+KPX ccedilla yacute -10
+KPX ccedilla ydieresis -10
+KPX colon space -40
+KPX comma quotedblright -120
+KPX comma quoteright -120
+KPX comma space -40
+KPX d d -10
+KPX d dcroat -10
+KPX d v -15
+KPX d w -15
+KPX d y -15
+KPX d yacute -15
+KPX d ydieresis -15
+KPX dcroat d -10
+KPX dcroat dcroat -10
+KPX dcroat v -15
+KPX dcroat w -15
+KPX dcroat y -15
+KPX dcroat yacute -15
+KPX dcroat ydieresis -15
+KPX e comma 10
+KPX e period 20
+KPX e v -15
+KPX e w -15
+KPX e x -15
+KPX e y -15
+KPX e yacute -15
+KPX e ydieresis -15
+KPX eacute comma 10
+KPX eacute period 20
+KPX eacute v -15
+KPX eacute w -15
+KPX eacute x -15
+KPX eacute y -15
+KPX eacute yacute -15
+KPX eacute ydieresis -15
+KPX ecaron comma 10
+KPX ecaron period 20
+KPX ecaron v -15
+KPX ecaron w -15
+KPX ecaron x -15
+KPX ecaron y -15
+KPX ecaron yacute -15
+KPX ecaron ydieresis -15
+KPX ecircumflex comma 10
+KPX ecircumflex period 20
+KPX ecircumflex v -15
+KPX ecircumflex w -15
+KPX ecircumflex x -15
+KPX ecircumflex y -15
+KPX ecircumflex yacute -15
+KPX ecircumflex ydieresis -15
+KPX edieresis comma 10
+KPX edieresis period 20
+KPX edieresis v -15
+KPX edieresis w -15
+KPX edieresis x -15
+KPX edieresis y -15
+KPX edieresis yacute -15
+KPX edieresis ydieresis -15
+KPX edotaccent comma 10
+KPX edotaccent period 20
+KPX edotaccent v -15
+KPX edotaccent w -15
+KPX edotaccent x -15
+KPX edotaccent y -15
+KPX edotaccent yacute -15
+KPX edotaccent ydieresis -15
+KPX egrave comma 10
+KPX egrave period 20
+KPX egrave v -15
+KPX egrave w -15
+KPX egrave x -15
+KPX egrave y -15
+KPX egrave yacute -15
+KPX egrave ydieresis -15
+KPX emacron comma 10
+KPX emacron period 20
+KPX emacron v -15
+KPX emacron w -15
+KPX emacron x -15
+KPX emacron y -15
+KPX emacron yacute -15
+KPX emacron ydieresis -15
+KPX eogonek comma 10
+KPX eogonek period 20
+KPX eogonek v -15
+KPX eogonek w -15
+KPX eogonek x -15
+KPX eogonek y -15
+KPX eogonek yacute -15
+KPX eogonek ydieresis -15
+KPX f comma -10
+KPX f e -10
+KPX f eacute -10
+KPX f ecaron -10
+KPX f ecircumflex -10
+KPX f edieresis -10
+KPX f edotaccent -10
+KPX f egrave -10
+KPX f emacron -10
+KPX f eogonek -10
+KPX f o -20
+KPX f oacute -20
+KPX f ocircumflex -20
+KPX f odieresis -20
+KPX f ograve -20
+KPX f ohungarumlaut -20
+KPX f omacron -20
+KPX f oslash -20
+KPX f otilde -20
+KPX f period -10
+KPX f quotedblright 30
+KPX f quoteright 30
+KPX g e 10
+KPX g eacute 10
+KPX g ecaron 10
+KPX g ecircumflex 10
+KPX g edieresis 10
+KPX g edotaccent 10
+KPX g egrave 10
+KPX g emacron 10
+KPX g eogonek 10
+KPX g g -10
+KPX g gbreve -10
+KPX g gcommaaccent -10
+KPX gbreve e 10
+KPX gbreve eacute 10
+KPX gbreve ecaron 10
+KPX gbreve ecircumflex 10
+KPX gbreve edieresis 10
+KPX gbreve edotaccent 10
+KPX gbreve egrave 10
+KPX gbreve emacron 10
+KPX gbreve eogonek 10
+KPX gbreve g -10
+KPX gbreve gbreve -10
+KPX gbreve gcommaaccent -10
+KPX gcommaaccent e 10
+KPX gcommaaccent eacute 10
+KPX gcommaaccent ecaron 10
+KPX gcommaaccent ecircumflex 10
+KPX gcommaaccent edieresis 10
+KPX gcommaaccent edotaccent 10
+KPX gcommaaccent egrave 10
+KPX gcommaaccent emacron 10
+KPX gcommaaccent eogonek 10
+KPX gcommaaccent g -10
+KPX gcommaaccent gbreve -10
+KPX gcommaaccent gcommaaccent -10
+KPX h y -20
+KPX h yacute -20
+KPX h ydieresis -20
+KPX k o -15
+KPX k oacute -15
+KPX k ocircumflex -15
+KPX k odieresis -15
+KPX k ograve -15
+KPX k ohungarumlaut -15
+KPX k omacron -15
+KPX k oslash -15
+KPX k otilde -15
+KPX kcommaaccent o -15
+KPX kcommaaccent oacute -15
+KPX kcommaaccent ocircumflex -15
+KPX kcommaaccent odieresis -15
+KPX kcommaaccent ograve -15
+KPX kcommaaccent ohungarumlaut -15
+KPX kcommaaccent omacron -15
+KPX kcommaaccent oslash -15
+KPX kcommaaccent otilde -15
+KPX l w -15
+KPX l y -15
+KPX l yacute -15
+KPX l ydieresis -15
+KPX lacute w -15
+KPX lacute y -15
+KPX lacute yacute -15
+KPX lacute ydieresis -15
+KPX lcommaaccent w -15
+KPX lcommaaccent y -15
+KPX lcommaaccent yacute -15
+KPX lcommaaccent ydieresis -15
+KPX lslash w -15
+KPX lslash y -15
+KPX lslash yacute -15
+KPX lslash ydieresis -15
+KPX m u -20
+KPX m uacute -20
+KPX m ucircumflex -20
+KPX m udieresis -20
+KPX m ugrave -20
+KPX m uhungarumlaut -20
+KPX m umacron -20
+KPX m uogonek -20
+KPX m uring -20
+KPX m y -30
+KPX m yacute -30
+KPX m ydieresis -30
+KPX n u -10
+KPX n uacute -10
+KPX n ucircumflex -10
+KPX n udieresis -10
+KPX n ugrave -10
+KPX n uhungarumlaut -10
+KPX n umacron -10
+KPX n uogonek -10
+KPX n uring -10
+KPX n v -40
+KPX n y -20
+KPX n yacute -20
+KPX n ydieresis -20
+KPX nacute u -10
+KPX nacute uacute -10
+KPX nacute ucircumflex -10
+KPX nacute udieresis -10
+KPX nacute ugrave -10
+KPX nacute uhungarumlaut -10
+KPX nacute umacron -10
+KPX nacute uogonek -10
+KPX nacute uring -10
+KPX nacute v -40
+KPX nacute y -20
+KPX nacute yacute -20
+KPX nacute ydieresis -20
+KPX ncaron u -10
+KPX ncaron uacute -10
+KPX ncaron ucircumflex -10
+KPX ncaron udieresis -10
+KPX ncaron ugrave -10
+KPX ncaron uhungarumlaut -10
+KPX ncaron umacron -10
+KPX ncaron uogonek -10
+KPX ncaron uring -10
+KPX ncaron v -40
+KPX ncaron y -20
+KPX ncaron yacute -20
+KPX ncaron ydieresis -20
+KPX ncommaaccent u -10
+KPX ncommaaccent uacute -10
+KPX ncommaaccent ucircumflex -10
+KPX ncommaaccent udieresis -10
+KPX ncommaaccent ugrave -10
+KPX ncommaaccent uhungarumlaut -10
+KPX ncommaaccent umacron -10
+KPX ncommaaccent uogonek -10
+KPX ncommaaccent uring -10
+KPX ncommaaccent v -40
+KPX ncommaaccent y -20
+KPX ncommaaccent yacute -20
+KPX ncommaaccent ydieresis -20
+KPX ntilde u -10
+KPX ntilde uacute -10
+KPX ntilde ucircumflex -10
+KPX ntilde udieresis -10
+KPX ntilde ugrave -10
+KPX ntilde uhungarumlaut -10
+KPX ntilde umacron -10
+KPX ntilde uogonek -10
+KPX ntilde uring -10
+KPX ntilde v -40
+KPX ntilde y -20
+KPX ntilde yacute -20
+KPX ntilde ydieresis -20
+KPX o v -20
+KPX o w -15
+KPX o x -30
+KPX o y -20
+KPX o yacute -20
+KPX o ydieresis -20
+KPX oacute v -20
+KPX oacute w -15
+KPX oacute x -30
+KPX oacute y -20
+KPX oacute yacute -20
+KPX oacute ydieresis -20
+KPX ocircumflex v -20
+KPX ocircumflex w -15
+KPX ocircumflex x -30
+KPX ocircumflex y -20
+KPX ocircumflex yacute -20
+KPX ocircumflex ydieresis -20
+KPX odieresis v -20
+KPX odieresis w -15
+KPX odieresis x -30
+KPX odieresis y -20
+KPX odieresis yacute -20
+KPX odieresis ydieresis -20
+KPX ograve v -20
+KPX ograve w -15
+KPX ograve x -30
+KPX ograve y -20
+KPX ograve yacute -20
+KPX ograve ydieresis -20
+KPX ohungarumlaut v -20
+KPX ohungarumlaut w -15
+KPX ohungarumlaut x -30
+KPX ohungarumlaut y -20
+KPX ohungarumlaut yacute -20
+KPX ohungarumlaut ydieresis -20
+KPX omacron v -20
+KPX omacron w -15
+KPX omacron x -30
+KPX omacron y -20
+KPX omacron yacute -20
+KPX omacron ydieresis -20
+KPX oslash v -20
+KPX oslash w -15
+KPX oslash x -30
+KPX oslash y -20
+KPX oslash yacute -20
+KPX oslash ydieresis -20
+KPX otilde v -20
+KPX otilde w -15
+KPX otilde x -30
+KPX otilde y -20
+KPX otilde yacute -20
+KPX otilde ydieresis -20
+KPX p y -15
+KPX p yacute -15
+KPX p ydieresis -15
+KPX period quotedblright -120
+KPX period quoteright -120
+KPX period space -40
+KPX quotedblright space -80
+KPX quoteleft quoteleft -46
+KPX quoteright d -80
+KPX quoteright dcroat -80
+KPX quoteright l -20
+KPX quoteright lacute -20
+KPX quoteright lcommaaccent -20
+KPX quoteright lslash -20
+KPX quoteright quoteright -46
+KPX quoteright r -40
+KPX quoteright racute -40
+KPX quoteright rcaron -40
+KPX quoteright rcommaaccent -40
+KPX quoteright s -60
+KPX quoteright sacute -60
+KPX quoteright scaron -60
+KPX quoteright scedilla -60
+KPX quoteright scommaaccent -60
+KPX quoteright space -80
+KPX quoteright v -20
+KPX r c -20
+KPX r cacute -20
+KPX r ccaron -20
+KPX r ccedilla -20
+KPX r comma -60
+KPX r d -20
+KPX r dcroat -20
+KPX r g -15
+KPX r gbreve -15
+KPX r gcommaaccent -15
+KPX r hyphen -20
+KPX r o -20
+KPX r oacute -20
+KPX r ocircumflex -20
+KPX r odieresis -20
+KPX r ograve -20
+KPX r ohungarumlaut -20
+KPX r omacron -20
+KPX r oslash -20
+KPX r otilde -20
+KPX r period -60
+KPX r q -20
+KPX r s -15
+KPX r sacute -15
+KPX r scaron -15
+KPX r scedilla -15
+KPX r scommaaccent -15
+KPX r t 20
+KPX r tcommaaccent 20
+KPX r v 10
+KPX r y 10
+KPX r yacute 10
+KPX r ydieresis 10
+KPX racute c -20
+KPX racute cacute -20
+KPX racute ccaron -20
+KPX racute ccedilla -20
+KPX racute comma -60
+KPX racute d -20
+KPX racute dcroat -20
+KPX racute g -15
+KPX racute gbreve -15
+KPX racute gcommaaccent -15
+KPX racute hyphen -20
+KPX racute o -20
+KPX racute oacute -20
+KPX racute ocircumflex -20
+KPX racute odieresis -20
+KPX racute ograve -20
+KPX racute ohungarumlaut -20
+KPX racute omacron -20
+KPX racute oslash -20
+KPX racute otilde -20
+KPX racute period -60
+KPX racute q -20
+KPX racute s -15
+KPX racute sacute -15
+KPX racute scaron -15
+KPX racute scedilla -15
+KPX racute scommaaccent -15
+KPX racute t 20
+KPX racute tcommaaccent 20
+KPX racute v 10
+KPX racute y 10
+KPX racute yacute 10
+KPX racute ydieresis 10
+KPX rcaron c -20
+KPX rcaron cacute -20
+KPX rcaron ccaron -20
+KPX rcaron ccedilla -20
+KPX rcaron comma -60
+KPX rcaron d -20
+KPX rcaron dcroat -20
+KPX rcaron g -15
+KPX rcaron gbreve -15
+KPX rcaron gcommaaccent -15
+KPX rcaron hyphen -20
+KPX rcaron o -20
+KPX rcaron oacute -20
+KPX rcaron ocircumflex -20
+KPX rcaron odieresis -20
+KPX rcaron ograve -20
+KPX rcaron ohungarumlaut -20
+KPX rcaron omacron -20
+KPX rcaron oslash -20
+KPX rcaron otilde -20
+KPX rcaron period -60
+KPX rcaron q -20
+KPX rcaron s -15
+KPX rcaron sacute -15
+KPX rcaron scaron -15
+KPX rcaron scedilla -15
+KPX rcaron scommaaccent -15
+KPX rcaron t 20
+KPX rcaron tcommaaccent 20
+KPX rcaron v 10
+KPX rcaron y 10
+KPX rcaron yacute 10
+KPX rcaron ydieresis 10
+KPX rcommaaccent c -20
+KPX rcommaaccent cacute -20
+KPX rcommaaccent ccaron -20
+KPX rcommaaccent ccedilla -20
+KPX rcommaaccent comma -60
+KPX rcommaaccent d -20
+KPX rcommaaccent dcroat -20
+KPX rcommaaccent g -15
+KPX rcommaaccent gbreve -15
+KPX rcommaaccent gcommaaccent -15
+KPX rcommaaccent hyphen -20
+KPX rcommaaccent o -20
+KPX rcommaaccent oacute -20
+KPX rcommaaccent ocircumflex -20
+KPX rcommaaccent odieresis -20
+KPX rcommaaccent ograve -20
+KPX rcommaaccent ohungarumlaut -20
+KPX rcommaaccent omacron -20
+KPX rcommaaccent oslash -20
+KPX rcommaaccent otilde -20
+KPX rcommaaccent period -60
+KPX rcommaaccent q -20
+KPX rcommaaccent s -15
+KPX rcommaaccent sacute -15
+KPX rcommaaccent scaron -15
+KPX rcommaaccent scedilla -15
+KPX rcommaaccent scommaaccent -15
+KPX rcommaaccent t 20
+KPX rcommaaccent tcommaaccent 20
+KPX rcommaaccent v 10
+KPX rcommaaccent y 10
+KPX rcommaaccent yacute 10
+KPX rcommaaccent ydieresis 10
+KPX s w -15
+KPX sacute w -15
+KPX scaron w -15
+KPX scedilla w -15
+KPX scommaaccent w -15
+KPX semicolon space -40
+KPX space T -100
+KPX space Tcaron -100
+KPX space Tcommaaccent -100
+KPX space V -80
+KPX space W -80
+KPX space Y -120
+KPX space Yacute -120
+KPX space Ydieresis -120
+KPX space quotedblleft -80
+KPX space quoteleft -60
+KPX v a -20
+KPX v aacute -20
+KPX v abreve -20
+KPX v acircumflex -20
+KPX v adieresis -20
+KPX v agrave -20
+KPX v amacron -20
+KPX v aogonek -20
+KPX v aring -20
+KPX v atilde -20
+KPX v comma -80
+KPX v o -30
+KPX v oacute -30
+KPX v ocircumflex -30
+KPX v odieresis -30
+KPX v ograve -30
+KPX v ohungarumlaut -30
+KPX v omacron -30
+KPX v oslash -30
+KPX v otilde -30
+KPX v period -80
+KPX w comma -40
+KPX w o -20
+KPX w oacute -20
+KPX w ocircumflex -20
+KPX w odieresis -20
+KPX w ograve -20
+KPX w ohungarumlaut -20
+KPX w omacron -20
+KPX w oslash -20
+KPX w otilde -20
+KPX w period -40
+KPX x e -10
+KPX x eacute -10
+KPX x ecaron -10
+KPX x ecircumflex -10
+KPX x edieresis -10
+KPX x edotaccent -10
+KPX x egrave -10
+KPX x emacron -10
+KPX x eogonek -10
+KPX y a -30
+KPX y aacute -30
+KPX y abreve -30
+KPX y acircumflex -30
+KPX y adieresis -30
+KPX y agrave -30
+KPX y amacron -30
+KPX y aogonek -30
+KPX y aring -30
+KPX y atilde -30
+KPX y comma -80
+KPX y e -10
+KPX y eacute -10
+KPX y ecaron -10
+KPX y ecircumflex -10
+KPX y edieresis -10
+KPX y edotaccent -10
+KPX y egrave -10
+KPX y emacron -10
+KPX y eogonek -10
+KPX y o -25
+KPX y oacute -25
+KPX y ocircumflex -25
+KPX y odieresis -25
+KPX y ograve -25
+KPX y ohungarumlaut -25
+KPX y omacron -25
+KPX y oslash -25
+KPX y otilde -25
+KPX y period -80
+KPX yacute a -30
+KPX yacute aacute -30
+KPX yacute abreve -30
+KPX yacute acircumflex -30
+KPX yacute adieresis -30
+KPX yacute agrave -30
+KPX yacute amacron -30
+KPX yacute aogonek -30
+KPX yacute aring -30
+KPX yacute atilde -30
+KPX yacute comma -80
+KPX yacute e -10
+KPX yacute eacute -10
+KPX yacute ecaron -10
+KPX yacute ecircumflex -10
+KPX yacute edieresis -10
+KPX yacute edotaccent -10
+KPX yacute egrave -10
+KPX yacute emacron -10
+KPX yacute eogonek -10
+KPX yacute o -25
+KPX yacute oacute -25
+KPX yacute ocircumflex -25
+KPX yacute odieresis -25
+KPX yacute ograve -25
+KPX yacute ohungarumlaut -25
+KPX yacute omacron -25
+KPX yacute oslash -25
+KPX yacute otilde -25
+KPX yacute period -80
+KPX ydieresis a -30
+KPX ydieresis aacute -30
+KPX ydieresis abreve -30
+KPX ydieresis acircumflex -30
+KPX ydieresis adieresis -30
+KPX ydieresis agrave -30
+KPX ydieresis amacron -30
+KPX ydieresis aogonek -30
+KPX ydieresis aring -30
+KPX ydieresis atilde -30
+KPX ydieresis comma -80
+KPX ydieresis e -10
+KPX ydieresis eacute -10
+KPX ydieresis ecaron -10
+KPX ydieresis ecircumflex -10
+KPX ydieresis edieresis -10
+KPX ydieresis edotaccent -10
+KPX ydieresis egrave -10
+KPX ydieresis emacron -10
+KPX ydieresis eogonek -10
+KPX ydieresis o -25
+KPX ydieresis oacute -25
+KPX ydieresis ocircumflex -25
+KPX ydieresis odieresis -25
+KPX ydieresis ograve -25
+KPX ydieresis ohungarumlaut -25
+KPX ydieresis omacron -25
+KPX ydieresis oslash -25
+KPX ydieresis otilde -25
+KPX ydieresis period -80
+KPX z e 10
+KPX z eacute 10
+KPX z ecaron 10
+KPX z ecircumflex 10
+KPX z edieresis 10
+KPX z edotaccent 10
+KPX z egrave 10
+KPX z emacron 10
+KPX z eogonek 10
+KPX zacute e 10
+KPX zacute eacute 10
+KPX zacute ecaron 10
+KPX zacute ecircumflex 10
+KPX zacute edieresis 10
+KPX zacute edotaccent 10
+KPX zacute egrave 10
+KPX zacute emacron 10
+KPX zacute eogonek 10
+KPX zcaron e 10
+KPX zcaron eacute 10
+KPX zcaron ecaron 10
+KPX zcaron ecircumflex 10
+KPX zcaron edieresis 10
+KPX zcaron edotaccent 10
+KPX zcaron egrave 10
+KPX zcaron emacron 10
+KPX zcaron eogonek 10
+KPX zdotaccent e 10
+KPX zdotaccent eacute 10
+KPX zdotaccent ecaron 10
+KPX zdotaccent ecircumflex 10
+KPX zdotaccent edieresis 10
+KPX zdotaccent edotaccent 10
+KPX zdotaccent egrave 10
+KPX zdotaccent emacron 10
+KPX zdotaccent eogonek 10
+EndKernPairs
+EndKernData
+EndFontMetrics
diff --git a/src/main/resources/com/lowagie/text/pdf/fonts/Helvetica-Oblique.afm b/src/main/resources/com/lowagie/text/pdf/fonts/Helvetica-Oblique.afm
new file mode 100644
index 0000000..57bf472
--- /dev/null
+++ b/src/main/resources/com/lowagie/text/pdf/fonts/Helvetica-Oblique.afm
@@ -0,0 +1,3051 @@
+StartFontMetrics 4.1
+Comment Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved.
+Comment Creation Date: Thu May 1 12:44:31 1997
+Comment UniqueID 43055
+Comment VMusage 14960 69346
+FontName Helvetica-Oblique
+FullName Helvetica Oblique
+FamilyName Helvetica
+Weight Medium
+ItalicAngle -12
+IsFixedPitch false
+CharacterSet ExtendedRoman
+FontBBox -170 -225 1116 931
+UnderlinePosition -100
+UnderlineThickness 50
+Version 002.000
+Notice Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved.Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries.
+EncodingScheme AdobeStandardEncoding
+CapHeight 718
+XHeight 523
+Ascender 718
+Descender -207
+StdHW 76
+StdVW 88
+StartCharMetrics 315
+C 32 ; WX 278 ; N space ; B 0 0 0 0 ;
+C 33 ; WX 278 ; N exclam ; B 90 0 340 718 ;
+C 34 ; WX 355 ; N quotedbl ; B 168 463 438 718 ;
+C 35 ; WX 556 ; N numbersign ; B 73 0 631 688 ;
+C 36 ; WX 556 ; N dollar ; B 69 -115 617 775 ;
+C 37 ; WX 889 ; N percent ; B 147 -19 889 703 ;
+C 38 ; WX 667 ; N ampersand ; B 77 -15 647 718 ;
+C 39 ; WX 222 ; N quoteright ; B 151 463 310 718 ;
+C 40 ; WX 333 ; N parenleft ; B 108 -207 454 733 ;
+C 41 ; WX 333 ; N parenright ; B -9 -207 337 733 ;
+C 42 ; WX 389 ; N asterisk ; B 165 431 475 718 ;
+C 43 ; WX 584 ; N plus ; B 85 0 606 505 ;
+C 44 ; WX 278 ; N comma ; B 56 -147 214 106 ;
+C 45 ; WX 333 ; N hyphen ; B 93 232 357 322 ;
+C 46 ; WX 278 ; N period ; B 87 0 214 106 ;
+C 47 ; WX 278 ; N slash ; B -21 -19 452 737 ;
+C 48 ; WX 556 ; N zero ; B 93 -19 608 703 ;
+C 49 ; WX 556 ; N one ; B 207 0 508 703 ;
+C 50 ; WX 556 ; N two ; B 26 0 617 703 ;
+C 51 ; WX 556 ; N three ; B 75 -19 610 703 ;
+C 52 ; WX 556 ; N four ; B 61 0 576 703 ;
+C 53 ; WX 556 ; N five ; B 68 -19 621 688 ;
+C 54 ; WX 556 ; N six ; B 91 -19 615 703 ;
+C 55 ; WX 556 ; N seven ; B 137 0 669 688 ;
+C 56 ; WX 556 ; N eight ; B 74 -19 607 703 ;
+C 57 ; WX 556 ; N nine ; B 82 -19 609 703 ;
+C 58 ; WX 278 ; N colon ; B 87 0 301 516 ;
+C 59 ; WX 278 ; N semicolon ; B 56 -147 301 516 ;
+C 60 ; WX 584 ; N less ; B 94 11 641 495 ;
+C 61 ; WX 584 ; N equal ; B 63 115 628 390 ;
+C 62 ; WX 584 ; N greater ; B 50 11 597 495 ;
+C 63 ; WX 556 ; N question ; B 161 0 610 727 ;
+C 64 ; WX 1015 ; N at ; B 215 -19 965 737 ;
+C 65 ; WX 667 ; N A ; B 14 0 654 718 ;
+C 66 ; WX 667 ; N B ; B 74 0 712 718 ;
+C 67 ; WX 722 ; N C ; B 108 -19 782 737 ;
+C 68 ; WX 722 ; N D ; B 81 0 764 718 ;
+C 69 ; WX 667 ; N E ; B 86 0 762 718 ;
+C 70 ; WX 611 ; N F ; B 86 0 736 718 ;
+C 71 ; WX 778 ; N G ; B 111 -19 799 737 ;
+C 72 ; WX 722 ; N H ; B 77 0 799 718 ;
+C 73 ; WX 278 ; N I ; B 91 0 341 718 ;
+C 74 ; WX 500 ; N J ; B 47 -19 581 718 ;
+C 75 ; WX 667 ; N K ; B 76 0 808 718 ;
+C 76 ; WX 556 ; N L ; B 76 0 555 718 ;
+C 77 ; WX 833 ; N M ; B 73 0 914 718 ;
+C 78 ; WX 722 ; N N ; B 76 0 799 718 ;
+C 79 ; WX 778 ; N O ; B 105 -19 826 737 ;
+C 80 ; WX 667 ; N P ; B 86 0 737 718 ;
+C 81 ; WX 778 ; N Q ; B 105 -56 826 737 ;
+C 82 ; WX 722 ; N R ; B 88 0 773 718 ;
+C 83 ; WX 667 ; N S ; B 90 -19 713 737 ;
+C 84 ; WX 611 ; N T ; B 148 0 750 718 ;
+C 85 ; WX 722 ; N U ; B 123 -19 797 718 ;
+C 86 ; WX 667 ; N V ; B 173 0 800 718 ;
+C 87 ; WX 944 ; N W ; B 169 0 1081 718 ;
+C 88 ; WX 667 ; N X ; B 19 0 790 718 ;
+C 89 ; WX 667 ; N Y ; B 167 0 806 718 ;
+C 90 ; WX 611 ; N Z ; B 23 0 741 718 ;
+C 91 ; WX 278 ; N bracketleft ; B 21 -196 403 722 ;
+C 92 ; WX 278 ; N backslash ; B 140 -19 291 737 ;
+C 93 ; WX 278 ; N bracketright ; B -14 -196 368 722 ;
+C 94 ; WX 469 ; N asciicircum ; B 42 264 539 688 ;
+C 95 ; WX 556 ; N underscore ; B -27 -125 540 -75 ;
+C 96 ; WX 222 ; N quoteleft ; B 165 470 323 725 ;
+C 97 ; WX 556 ; N a ; B 61 -15 559 538 ;
+C 98 ; WX 556 ; N b ; B 58 -15 584 718 ;
+C 99 ; WX 500 ; N c ; B 74 -15 553 538 ;
+C 100 ; WX 556 ; N d ; B 84 -15 652 718 ;
+C 101 ; WX 556 ; N e ; B 84 -15 578 538 ;
+C 102 ; WX 278 ; N f ; B 86 0 416 728 ; L i fi ; L l fl ;
+C 103 ; WX 556 ; N g ; B 42 -220 610 538 ;
+C 104 ; WX 556 ; N h ; B 65 0 573 718 ;
+C 105 ; WX 222 ; N i ; B 67 0 308 718 ;
+C 106 ; WX 222 ; N j ; B -60 -210 308 718 ;
+C 107 ; WX 500 ; N k ; B 67 0 600 718 ;
+C 108 ; WX 222 ; N l ; B 67 0 308 718 ;
+C 109 ; WX 833 ; N m ; B 65 0 852 538 ;
+C 110 ; WX 556 ; N n ; B 65 0 573 538 ;
+C 111 ; WX 556 ; N o ; B 83 -14 585 538 ;
+C 112 ; WX 556 ; N p ; B 14 -207 584 538 ;
+C 113 ; WX 556 ; N q ; B 84 -207 605 538 ;
+C 114 ; WX 333 ; N r ; B 77 0 446 538 ;
+C 115 ; WX 500 ; N s ; B 63 -15 529 538 ;
+C 116 ; WX 278 ; N t ; B 102 -7 368 669 ;
+C 117 ; WX 556 ; N u ; B 94 -15 600 523 ;
+C 118 ; WX 500 ; N v ; B 119 0 603 523 ;
+C 119 ; WX 722 ; N w ; B 125 0 820 523 ;
+C 120 ; WX 500 ; N x ; B 11 0 594 523 ;
+C 121 ; WX 500 ; N y ; B 15 -214 600 523 ;
+C 122 ; WX 500 ; N z ; B 31 0 571 523 ;
+C 123 ; WX 334 ; N braceleft ; B 92 -196 445 722 ;
+C 124 ; WX 260 ; N bar ; B 46 -225 332 775 ;
+C 125 ; WX 334 ; N braceright ; B 0 -196 354 722 ;
+C 126 ; WX 584 ; N asciitilde ; B 111 180 580 326 ;
+C 161 ; WX 333 ; N exclamdown ; B 77 -195 326 523 ;
+C 162 ; WX 556 ; N cent ; B 95 -115 584 623 ;
+C 163 ; WX 556 ; N sterling ; B 49 -16 634 718 ;
+C 164 ; WX 167 ; N fraction ; B -170 -19 482 703 ;
+C 165 ; WX 556 ; N yen ; B 81 0 699 688 ;
+C 166 ; WX 556 ; N florin ; B -52 -207 654 737 ;
+C 167 ; WX 556 ; N section ; B 76 -191 584 737 ;
+C 168 ; WX 556 ; N currency ; B 60 99 646 603 ;
+C 169 ; WX 191 ; N quotesingle ; B 157 463 285 718 ;
+C 170 ; WX 333 ; N quotedblleft ; B 138 470 461 725 ;
+C 171 ; WX 556 ; N guillemotleft ; B 146 108 554 446 ;
+C 172 ; WX 333 ; N guilsinglleft ; B 137 108 340 446 ;
+C 173 ; WX 333 ; N guilsinglright ; B 111 108 314 446 ;
+C 174 ; WX 500 ; N fi ; B 86 0 587 728 ;
+C 175 ; WX 500 ; N fl ; B 86 0 585 728 ;
+C 177 ; WX 556 ; N endash ; B 51 240 623 313 ;
+C 178 ; WX 556 ; N dagger ; B 135 -159 622 718 ;
+C 179 ; WX 556 ; N daggerdbl ; B 52 -159 623 718 ;
+C 180 ; WX 278 ; N periodcentered ; B 129 190 257 315 ;
+C 182 ; WX 537 ; N paragraph ; B 126 -173 650 718 ;
+C 183 ; WX 350 ; N bullet ; B 91 202 413 517 ;
+C 184 ; WX 222 ; N quotesinglbase ; B 21 -149 180 106 ;
+C 185 ; WX 333 ; N quotedblbase ; B -6 -149 318 106 ;
+C 186 ; WX 333 ; N quotedblright ; B 124 463 448 718 ;
+C 187 ; WX 556 ; N guillemotright ; B 120 108 528 446 ;
+C 188 ; WX 1000 ; N ellipsis ; B 115 0 908 106 ;
+C 189 ; WX 1000 ; N perthousand ; B 88 -19 1029 703 ;
+C 191 ; WX 611 ; N questiondown ; B 85 -201 534 525 ;
+C 193 ; WX 333 ; N grave ; B 170 593 337 734 ;
+C 194 ; WX 333 ; N acute ; B 248 593 475 734 ;
+C 195 ; WX 333 ; N circumflex ; B 147 593 438 734 ;
+C 196 ; WX 333 ; N tilde ; B 125 606 490 722 ;
+C 197 ; WX 333 ; N macron ; B 143 627 468 684 ;
+C 198 ; WX 333 ; N breve ; B 167 595 476 731 ;
+C 199 ; WX 333 ; N dotaccent ; B 249 604 362 706 ;
+C 200 ; WX 333 ; N dieresis ; B 168 604 443 706 ;
+C 202 ; WX 333 ; N ring ; B 214 572 402 756 ;
+C 203 ; WX 333 ; N cedilla ; B 2 -225 232 0 ;
+C 205 ; WX 333 ; N hungarumlaut ; B 157 593 565 734 ;
+C 206 ; WX 333 ; N ogonek ; B 43 -225 249 0 ;
+C 207 ; WX 333 ; N caron ; B 177 593 468 734 ;
+C 208 ; WX 1000 ; N emdash ; B 51 240 1067 313 ;
+C 225 ; WX 1000 ; N AE ; B 8 0 1097 718 ;
+C 227 ; WX 370 ; N ordfeminine ; B 127 405 449 737 ;
+C 232 ; WX 556 ; N Lslash ; B 41 0 555 718 ;
+C 233 ; WX 778 ; N Oslash ; B 43 -19 890 737 ;
+C 234 ; WX 1000 ; N OE ; B 98 -19 1116 737 ;
+C 235 ; WX 365 ; N ordmasculine ; B 141 405 468 737 ;
+C 241 ; WX 889 ; N ae ; B 61 -15 909 538 ;
+C 245 ; WX 278 ; N dotlessi ; B 95 0 294 523 ;
+C 248 ; WX 222 ; N lslash ; B 41 0 347 718 ;
+C 249 ; WX 611 ; N oslash ; B 29 -22 647 545 ;
+C 250 ; WX 944 ; N oe ; B 83 -15 964 538 ;
+C 251 ; WX 611 ; N germandbls ; B 67 -15 658 728 ;
+C -1 ; WX 278 ; N Idieresis ; B 91 0 458 901 ;
+C -1 ; WX 556 ; N eacute ; B 84 -15 587 734 ;
+C -1 ; WX 556 ; N abreve ; B 61 -15 578 731 ;
+C -1 ; WX 556 ; N uhungarumlaut ; B 94 -15 677 734 ;
+C -1 ; WX 556 ; N ecaron ; B 84 -15 580 734 ;
+C -1 ; WX 667 ; N Ydieresis ; B 167 0 806 901 ;
+C -1 ; WX 584 ; N divide ; B 85 -19 606 524 ;
+C -1 ; WX 667 ; N Yacute ; B 167 0 806 929 ;
+C -1 ; WX 667 ; N Acircumflex ; B 14 0 654 929 ;
+C -1 ; WX 556 ; N aacute ; B 61 -15 587 734 ;
+C -1 ; WX 722 ; N Ucircumflex ; B 123 -19 797 929 ;
+C -1 ; WX 500 ; N yacute ; B 15 -214 600 734 ;
+C -1 ; WX 500 ; N scommaaccent ; B 63 -225 529 538 ;
+C -1 ; WX 556 ; N ecircumflex ; B 84 -15 578 734 ;
+C -1 ; WX 722 ; N Uring ; B 123 -19 797 931 ;
+C -1 ; WX 722 ; N Udieresis ; B 123 -19 797 901 ;
+C -1 ; WX 556 ; N aogonek ; B 61 -220 559 538 ;
+C -1 ; WX 722 ; N Uacute ; B 123 -19 797 929 ;
+C -1 ; WX 556 ; N uogonek ; B 94 -225 600 523 ;
+C -1 ; WX 667 ; N Edieresis ; B 86 0 762 901 ;
+C -1 ; WX 722 ; N Dcroat ; B 69 0 764 718 ;
+C -1 ; WX 250 ; N commaaccent ; B 39 -225 172 -40 ;
+C -1 ; WX 737 ; N copyright ; B 54 -19 837 737 ;
+C -1 ; WX 667 ; N Emacron ; B 86 0 762 879 ;
+C -1 ; WX 500 ; N ccaron ; B 74 -15 553 734 ;
+C -1 ; WX 556 ; N aring ; B 61 -15 559 756 ;
+C -1 ; WX 722 ; N Ncommaaccent ; B 76 -225 799 718 ;
+C -1 ; WX 222 ; N lacute ; B 67 0 461 929 ;
+C -1 ; WX 556 ; N agrave ; B 61 -15 559 734 ;
+C -1 ; WX 611 ; N Tcommaaccent ; B 148 -225 750 718 ;
+C -1 ; WX 722 ; N Cacute ; B 108 -19 782 929 ;
+C -1 ; WX 556 ; N atilde ; B 61 -15 592 722 ;
+C -1 ; WX 667 ; N Edotaccent ; B 86 0 762 901 ;
+C -1 ; WX 500 ; N scaron ; B 63 -15 552 734 ;
+C -1 ; WX 500 ; N scedilla ; B 63 -225 529 538 ;
+C -1 ; WX 278 ; N iacute ; B 95 0 448 734 ;
+C -1 ; WX 471 ; N lozenge ; B 88 0 540 728 ;
+C -1 ; WX 722 ; N Rcaron ; B 88 0 773 929 ;
+C -1 ; WX 778 ; N Gcommaaccent ; B 111 -225 799 737 ;
+C -1 ; WX 556 ; N ucircumflex ; B 94 -15 600 734 ;
+C -1 ; WX 556 ; N acircumflex ; B 61 -15 559 734 ;
+C -1 ; WX 667 ; N Amacron ; B 14 0 677 879 ;
+C -1 ; WX 333 ; N rcaron ; B 77 0 508 734 ;
+C -1 ; WX 500 ; N ccedilla ; B 74 -225 553 538 ;
+C -1 ; WX 611 ; N Zdotaccent ; B 23 0 741 901 ;
+C -1 ; WX 667 ; N Thorn ; B 86 0 712 718 ;
+C -1 ; WX 778 ; N Omacron ; B 105 -19 826 879 ;
+C -1 ; WX 722 ; N Racute ; B 88 0 773 929 ;
+C -1 ; WX 667 ; N Sacute ; B 90 -19 713 929 ;
+C -1 ; WX 643 ; N dcaron ; B 84 -15 808 718 ;
+C -1 ; WX 722 ; N Umacron ; B 123 -19 797 879 ;
+C -1 ; WX 556 ; N uring ; B 94 -15 600 756 ;
+C -1 ; WX 333 ; N threesuperior ; B 90 270 436 703 ;
+C -1 ; WX 778 ; N Ograve ; B 105 -19 826 929 ;
+C -1 ; WX 667 ; N Agrave ; B 14 0 654 929 ;
+C -1 ; WX 667 ; N Abreve ; B 14 0 685 926 ;
+C -1 ; WX 584 ; N multiply ; B 50 0 642 506 ;
+C -1 ; WX 556 ; N uacute ; B 94 -15 600 734 ;
+C -1 ; WX 611 ; N Tcaron ; B 148 0 750 929 ;
+C -1 ; WX 476 ; N partialdiff ; B 41 -38 550 714 ;
+C -1 ; WX 500 ; N ydieresis ; B 15 -214 600 706 ;
+C -1 ; WX 722 ; N Nacute ; B 76 0 799 929 ;
+C -1 ; WX 278 ; N icircumflex ; B 95 0 411 734 ;
+C -1 ; WX 667 ; N Ecircumflex ; B 86 0 762 929 ;
+C -1 ; WX 556 ; N adieresis ; B 61 -15 559 706 ;
+C -1 ; WX 556 ; N edieresis ; B 84 -15 578 706 ;
+C -1 ; WX 500 ; N cacute ; B 74 -15 559 734 ;
+C -1 ; WX 556 ; N nacute ; B 65 0 587 734 ;
+C -1 ; WX 556 ; N umacron ; B 94 -15 600 684 ;
+C -1 ; WX 722 ; N Ncaron ; B 76 0 799 929 ;
+C -1 ; WX 278 ; N Iacute ; B 91 0 489 929 ;
+C -1 ; WX 584 ; N plusminus ; B 39 0 618 506 ;
+C -1 ; WX 260 ; N brokenbar ; B 62 -150 316 700 ;
+C -1 ; WX 737 ; N registered ; B 54 -19 837 737 ;
+C -1 ; WX 778 ; N Gbreve ; B 111 -19 799 926 ;
+C -1 ; WX 278 ; N Idotaccent ; B 91 0 377 901 ;
+C -1 ; WX 600 ; N summation ; B 15 -10 671 706 ;
+C -1 ; WX 667 ; N Egrave ; B 86 0 762 929 ;
+C -1 ; WX 333 ; N racute ; B 77 0 475 734 ;
+C -1 ; WX 556 ; N omacron ; B 83 -14 585 684 ;
+C -1 ; WX 611 ; N Zacute ; B 23 0 741 929 ;
+C -1 ; WX 611 ; N Zcaron ; B 23 0 741 929 ;
+C -1 ; WX 549 ; N greaterequal ; B 26 0 620 674 ;
+C -1 ; WX 722 ; N Eth ; B 69 0 764 718 ;
+C -1 ; WX 722 ; N Ccedilla ; B 108 -225 782 737 ;
+C -1 ; WX 222 ; N lcommaaccent ; B 25 -225 308 718 ;
+C -1 ; WX 317 ; N tcaron ; B 102 -7 501 808 ;
+C -1 ; WX 556 ; N eogonek ; B 84 -225 578 538 ;
+C -1 ; WX 722 ; N Uogonek ; B 123 -225 797 718 ;
+C -1 ; WX 667 ; N Aacute ; B 14 0 683 929 ;
+C -1 ; WX 667 ; N Adieresis ; B 14 0 654 901 ;
+C -1 ; WX 556 ; N egrave ; B 84 -15 578 734 ;
+C -1 ; WX 500 ; N zacute ; B 31 0 571 734 ;
+C -1 ; WX 222 ; N iogonek ; B -61 -225 308 718 ;
+C -1 ; WX 778 ; N Oacute ; B 105 -19 826 929 ;
+C -1 ; WX 556 ; N oacute ; B 83 -14 587 734 ;
+C -1 ; WX 556 ; N amacron ; B 61 -15 580 684 ;
+C -1 ; WX 500 ; N sacute ; B 63 -15 559 734 ;
+C -1 ; WX 278 ; N idieresis ; B 95 0 416 706 ;
+C -1 ; WX 778 ; N Ocircumflex ; B 105 -19 826 929 ;
+C -1 ; WX 722 ; N Ugrave ; B 123 -19 797 929 ;
+C -1 ; WX 612 ; N Delta ; B 6 0 608 688 ;
+C -1 ; WX 556 ; N thorn ; B 14 -207 584 718 ;
+C -1 ; WX 333 ; N twosuperior ; B 64 281 449 703 ;
+C -1 ; WX 778 ; N Odieresis ; B 105 -19 826 901 ;
+C -1 ; WX 556 ; N mu ; B 24 -207 600 523 ;
+C -1 ; WX 278 ; N igrave ; B 95 0 310 734 ;
+C -1 ; WX 556 ; N ohungarumlaut ; B 83 -14 677 734 ;
+C -1 ; WX 667 ; N Eogonek ; B 86 -220 762 718 ;
+C -1 ; WX 556 ; N dcroat ; B 84 -15 689 718 ;
+C -1 ; WX 834 ; N threequarters ; B 130 -19 861 703 ;
+C -1 ; WX 667 ; N Scedilla ; B 90 -225 713 737 ;
+C -1 ; WX 299 ; N lcaron ; B 67 0 464 718 ;
+C -1 ; WX 667 ; N Kcommaaccent ; B 76 -225 808 718 ;
+C -1 ; WX 556 ; N Lacute ; B 76 0 555 929 ;
+C -1 ; WX 1000 ; N trademark ; B 186 306 1056 718 ;
+C -1 ; WX 556 ; N edotaccent ; B 84 -15 578 706 ;
+C -1 ; WX 278 ; N Igrave ; B 91 0 351 929 ;
+C -1 ; WX 278 ; N Imacron ; B 91 0 483 879 ;
+C -1 ; WX 556 ; N Lcaron ; B 76 0 570 718 ;
+C -1 ; WX 834 ; N onehalf ; B 114 -19 839 703 ;
+C -1 ; WX 549 ; N lessequal ; B 26 0 666 674 ;
+C -1 ; WX 556 ; N ocircumflex ; B 83 -14 585 734 ;
+C -1 ; WX 556 ; N ntilde ; B 65 0 592 722 ;
+C -1 ; WX 722 ; N Uhungarumlaut ; B 123 -19 801 929 ;
+C -1 ; WX 667 ; N Eacute ; B 86 0 762 929 ;
+C -1 ; WX 556 ; N emacron ; B 84 -15 580 684 ;
+C -1 ; WX 556 ; N gbreve ; B 42 -220 610 731 ;
+C -1 ; WX 834 ; N onequarter ; B 150 -19 802 703 ;
+C -1 ; WX 667 ; N Scaron ; B 90 -19 713 929 ;
+C -1 ; WX 667 ; N Scommaaccent ; B 90 -225 713 737 ;
+C -1 ; WX 778 ; N Ohungarumlaut ; B 105 -19 829 929 ;
+C -1 ; WX 400 ; N degree ; B 169 411 468 703 ;
+C -1 ; WX 556 ; N ograve ; B 83 -14 585 734 ;
+C -1 ; WX 722 ; N Ccaron ; B 108 -19 782 929 ;
+C -1 ; WX 556 ; N ugrave ; B 94 -15 600 734 ;
+C -1 ; WX 453 ; N radical ; B 79 -80 617 762 ;
+C -1 ; WX 722 ; N Dcaron ; B 81 0 764 929 ;
+C -1 ; WX 333 ; N rcommaaccent ; B 30 -225 446 538 ;
+C -1 ; WX 722 ; N Ntilde ; B 76 0 799 917 ;
+C -1 ; WX 556 ; N otilde ; B 83 -14 602 722 ;
+C -1 ; WX 722 ; N Rcommaaccent ; B 88 -225 773 718 ;
+C -1 ; WX 556 ; N Lcommaaccent ; B 76 -225 555 718 ;
+C -1 ; WX 667 ; N Atilde ; B 14 0 699 917 ;
+C -1 ; WX 667 ; N Aogonek ; B 14 -225 654 718 ;
+C -1 ; WX 667 ; N Aring ; B 14 0 654 931 ;
+C -1 ; WX 778 ; N Otilde ; B 105 -19 826 917 ;
+C -1 ; WX 500 ; N zdotaccent ; B 31 0 571 706 ;
+C -1 ; WX 667 ; N Ecaron ; B 86 0 762 929 ;
+C -1 ; WX 278 ; N Iogonek ; B -33 -225 341 718 ;
+C -1 ; WX 500 ; N kcommaaccent ; B 67 -225 600 718 ;
+C -1 ; WX 584 ; N minus ; B 85 216 606 289 ;
+C -1 ; WX 278 ; N Icircumflex ; B 91 0 452 929 ;
+C -1 ; WX 556 ; N ncaron ; B 65 0 580 734 ;
+C -1 ; WX 278 ; N tcommaaccent ; B 63 -225 368 669 ;
+C -1 ; WX 584 ; N logicalnot ; B 106 108 628 390 ;
+C -1 ; WX 556 ; N odieresis ; B 83 -14 585 706 ;
+C -1 ; WX 556 ; N udieresis ; B 94 -15 600 706 ;
+C -1 ; WX 549 ; N notequal ; B 34 -35 623 551 ;
+C -1 ; WX 556 ; N gcommaaccent ; B 42 -220 610 822 ;
+C -1 ; WX 556 ; N eth ; B 81 -15 617 737 ;
+C -1 ; WX 500 ; N zcaron ; B 31 0 571 734 ;
+C -1 ; WX 556 ; N ncommaaccent ; B 65 -225 573 538 ;
+C -1 ; WX 333 ; N onesuperior ; B 166 281 371 703 ;
+C -1 ; WX 278 ; N imacron ; B 95 0 417 684 ;
+C -1 ; WX 556 ; N Euro ; B 0 0 0 0 ;
+EndCharMetrics
+StartKernData
+StartKernPairs 2705
+KPX A C -30
+KPX A Cacute -30
+KPX A Ccaron -30
+KPX A Ccedilla -30
+KPX A G -30
+KPX A Gbreve -30
+KPX A Gcommaaccent -30
+KPX A O -30
+KPX A Oacute -30
+KPX A Ocircumflex -30
+KPX A Odieresis -30
+KPX A Ograve -30
+KPX A Ohungarumlaut -30
+KPX A Omacron -30
+KPX A Oslash -30
+KPX A Otilde -30
+KPX A Q -30
+KPX A T -120
+KPX A Tcaron -120
+KPX A Tcommaaccent -120
+KPX A U -50
+KPX A Uacute -50
+KPX A Ucircumflex -50
+KPX A Udieresis -50
+KPX A Ugrave -50
+KPX A Uhungarumlaut -50
+KPX A Umacron -50
+KPX A Uogonek -50
+KPX A Uring -50
+KPX A V -70
+KPX A W -50
+KPX A Y -100
+KPX A Yacute -100
+KPX A Ydieresis -100
+KPX A u -30
+KPX A uacute -30
+KPX A ucircumflex -30
+KPX A udieresis -30
+KPX A ugrave -30
+KPX A uhungarumlaut -30
+KPX A umacron -30
+KPX A uogonek -30
+KPX A uring -30
+KPX A v -40
+KPX A w -40
+KPX A y -40
+KPX A yacute -40
+KPX A ydieresis -40
+KPX Aacute C -30
+KPX Aacute Cacute -30
+KPX Aacute Ccaron -30
+KPX Aacute Ccedilla -30
+KPX Aacute G -30
+KPX Aacute Gbreve -30
+KPX Aacute Gcommaaccent -30
+KPX Aacute O -30
+KPX Aacute Oacute -30
+KPX Aacute Ocircumflex -30
+KPX Aacute Odieresis -30
+KPX Aacute Ograve -30
+KPX Aacute Ohungarumlaut -30
+KPX Aacute Omacron -30
+KPX Aacute Oslash -30
+KPX Aacute Otilde -30
+KPX Aacute Q -30
+KPX Aacute T -120
+KPX Aacute Tcaron -120
+KPX Aacute Tcommaaccent -120
+KPX Aacute U -50
+KPX Aacute Uacute -50
+KPX Aacute Ucircumflex -50
+KPX Aacute Udieresis -50
+KPX Aacute Ugrave -50
+KPX Aacute Uhungarumlaut -50
+KPX Aacute Umacron -50
+KPX Aacute Uogonek -50
+KPX Aacute Uring -50
+KPX Aacute V -70
+KPX Aacute W -50
+KPX Aacute Y -100
+KPX Aacute Yacute -100
+KPX Aacute Ydieresis -100
+KPX Aacute u -30
+KPX Aacute uacute -30
+KPX Aacute ucircumflex -30
+KPX Aacute udieresis -30
+KPX Aacute ugrave -30
+KPX Aacute uhungarumlaut -30
+KPX Aacute umacron -30
+KPX Aacute uogonek -30
+KPX Aacute uring -30
+KPX Aacute v -40
+KPX Aacute w -40
+KPX Aacute y -40
+KPX Aacute yacute -40
+KPX Aacute ydieresis -40
+KPX Abreve C -30
+KPX Abreve Cacute -30
+KPX Abreve Ccaron -30
+KPX Abreve Ccedilla -30
+KPX Abreve G -30
+KPX Abreve Gbreve -30
+KPX Abreve Gcommaaccent -30
+KPX Abreve O -30
+KPX Abreve Oacute -30
+KPX Abreve Ocircumflex -30
+KPX Abreve Odieresis -30
+KPX Abreve Ograve -30
+KPX Abreve Ohungarumlaut -30
+KPX Abreve Omacron -30
+KPX Abreve Oslash -30
+KPX Abreve Otilde -30
+KPX Abreve Q -30
+KPX Abreve T -120
+KPX Abreve Tcaron -120
+KPX Abreve Tcommaaccent -120
+KPX Abreve U -50
+KPX Abreve Uacute -50
+KPX Abreve Ucircumflex -50
+KPX Abreve Udieresis -50
+KPX Abreve Ugrave -50
+KPX Abreve Uhungarumlaut -50
+KPX Abreve Umacron -50
+KPX Abreve Uogonek -50
+KPX Abreve Uring -50
+KPX Abreve V -70
+KPX Abreve W -50
+KPX Abreve Y -100
+KPX Abreve Yacute -100
+KPX Abreve Ydieresis -100
+KPX Abreve u -30
+KPX Abreve uacute -30
+KPX Abreve ucircumflex -30
+KPX Abreve udieresis -30
+KPX Abreve ugrave -30
+KPX Abreve uhungarumlaut -30
+KPX Abreve umacron -30
+KPX Abreve uogonek -30
+KPX Abreve uring -30
+KPX Abreve v -40
+KPX Abreve w -40
+KPX Abreve y -40
+KPX Abreve yacute -40
+KPX Abreve ydieresis -40
+KPX Acircumflex C -30
+KPX Acircumflex Cacute -30
+KPX Acircumflex Ccaron -30
+KPX Acircumflex Ccedilla -30
+KPX Acircumflex G -30
+KPX Acircumflex Gbreve -30
+KPX Acircumflex Gcommaaccent -30
+KPX Acircumflex O -30
+KPX Acircumflex Oacute -30
+KPX Acircumflex Ocircumflex -30
+KPX Acircumflex Odieresis -30
+KPX Acircumflex Ograve -30
+KPX Acircumflex Ohungarumlaut -30
+KPX Acircumflex Omacron -30
+KPX Acircumflex Oslash -30
+KPX Acircumflex Otilde -30
+KPX Acircumflex Q -30
+KPX Acircumflex T -120
+KPX Acircumflex Tcaron -120
+KPX Acircumflex Tcommaaccent -120
+KPX Acircumflex U -50
+KPX Acircumflex Uacute -50
+KPX Acircumflex Ucircumflex -50
+KPX Acircumflex Udieresis -50
+KPX Acircumflex Ugrave -50
+KPX Acircumflex Uhungarumlaut -50
+KPX Acircumflex Umacron -50
+KPX Acircumflex Uogonek -50
+KPX Acircumflex Uring -50
+KPX Acircumflex V -70
+KPX Acircumflex W -50
+KPX Acircumflex Y -100
+KPX Acircumflex Yacute -100
+KPX Acircumflex Ydieresis -100
+KPX Acircumflex u -30
+KPX Acircumflex uacute -30
+KPX Acircumflex ucircumflex -30
+KPX Acircumflex udieresis -30
+KPX Acircumflex ugrave -30
+KPX Acircumflex uhungarumlaut -30
+KPX Acircumflex umacron -30
+KPX Acircumflex uogonek -30
+KPX Acircumflex uring -30
+KPX Acircumflex v -40
+KPX Acircumflex w -40
+KPX Acircumflex y -40
+KPX Acircumflex yacute -40
+KPX Acircumflex ydieresis -40
+KPX Adieresis C -30
+KPX Adieresis Cacute -30
+KPX Adieresis Ccaron -30
+KPX Adieresis Ccedilla -30
+KPX Adieresis G -30
+KPX Adieresis Gbreve -30
+KPX Adieresis Gcommaaccent -30
+KPX Adieresis O -30
+KPX Adieresis Oacute -30
+KPX Adieresis Ocircumflex -30
+KPX Adieresis Odieresis -30
+KPX Adieresis Ograve -30
+KPX Adieresis Ohungarumlaut -30
+KPX Adieresis Omacron -30
+KPX Adieresis Oslash -30
+KPX Adieresis Otilde -30
+KPX Adieresis Q -30
+KPX Adieresis T -120
+KPX Adieresis Tcaron -120
+KPX Adieresis Tcommaaccent -120
+KPX Adieresis U -50
+KPX Adieresis Uacute -50
+KPX Adieresis Ucircumflex -50
+KPX Adieresis Udieresis -50
+KPX Adieresis Ugrave -50
+KPX Adieresis Uhungarumlaut -50
+KPX Adieresis Umacron -50
+KPX Adieresis Uogonek -50
+KPX Adieresis Uring -50
+KPX Adieresis V -70
+KPX Adieresis W -50
+KPX Adieresis Y -100
+KPX Adieresis Yacute -100
+KPX Adieresis Ydieresis -100
+KPX Adieresis u -30
+KPX Adieresis uacute -30
+KPX Adieresis ucircumflex -30
+KPX Adieresis udieresis -30
+KPX Adieresis ugrave -30
+KPX Adieresis uhungarumlaut -30
+KPX Adieresis umacron -30
+KPX Adieresis uogonek -30
+KPX Adieresis uring -30
+KPX Adieresis v -40
+KPX Adieresis w -40
+KPX Adieresis y -40
+KPX Adieresis yacute -40
+KPX Adieresis ydieresis -40
+KPX Agrave C -30
+KPX Agrave Cacute -30
+KPX Agrave Ccaron -30
+KPX Agrave Ccedilla -30
+KPX Agrave G -30
+KPX Agrave Gbreve -30
+KPX Agrave Gcommaaccent -30
+KPX Agrave O -30
+KPX Agrave Oacute -30
+KPX Agrave Ocircumflex -30
+KPX Agrave Odieresis -30
+KPX Agrave Ograve -30
+KPX Agrave Ohungarumlaut -30
+KPX Agrave Omacron -30
+KPX Agrave Oslash -30
+KPX Agrave Otilde -30
+KPX Agrave Q -30
+KPX Agrave T -120
+KPX Agrave Tcaron -120
+KPX Agrave Tcommaaccent -120
+KPX Agrave U -50
+KPX Agrave Uacute -50
+KPX Agrave Ucircumflex -50
+KPX Agrave Udieresis -50
+KPX Agrave Ugrave -50
+KPX Agrave Uhungarumlaut -50
+KPX Agrave Umacron -50
+KPX Agrave Uogonek -50
+KPX Agrave Uring -50
+KPX Agrave V -70
+KPX Agrave W -50
+KPX Agrave Y -100
+KPX Agrave Yacute -100
+KPX Agrave Ydieresis -100
+KPX Agrave u -30
+KPX Agrave uacute -30
+KPX Agrave ucircumflex -30
+KPX Agrave udieresis -30
+KPX Agrave ugrave -30
+KPX Agrave uhungarumlaut -30
+KPX Agrave umacron -30
+KPX Agrave uogonek -30
+KPX Agrave uring -30
+KPX Agrave v -40
+KPX Agrave w -40
+KPX Agrave y -40
+KPX Agrave yacute -40
+KPX Agrave ydieresis -40
+KPX Amacron C -30
+KPX Amacron Cacute -30
+KPX Amacron Ccaron -30
+KPX Amacron Ccedilla -30
+KPX Amacron G -30
+KPX Amacron Gbreve -30
+KPX Amacron Gcommaaccent -30
+KPX Amacron O -30
+KPX Amacron Oacute -30
+KPX Amacron Ocircumflex -30
+KPX Amacron Odieresis -30
+KPX Amacron Ograve -30
+KPX Amacron Ohungarumlaut -30
+KPX Amacron Omacron -30
+KPX Amacron Oslash -30
+KPX Amacron Otilde -30
+KPX Amacron Q -30
+KPX Amacron T -120
+KPX Amacron Tcaron -120
+KPX Amacron Tcommaaccent -120
+KPX Amacron U -50
+KPX Amacron Uacute -50
+KPX Amacron Ucircumflex -50
+KPX Amacron Udieresis -50
+KPX Amacron Ugrave -50
+KPX Amacron Uhungarumlaut -50
+KPX Amacron Umacron -50
+KPX Amacron Uogonek -50
+KPX Amacron Uring -50
+KPX Amacron V -70
+KPX Amacron W -50
+KPX Amacron Y -100
+KPX Amacron Yacute -100
+KPX Amacron Ydieresis -100
+KPX Amacron u -30
+KPX Amacron uacute -30
+KPX Amacron ucircumflex -30
+KPX Amacron udieresis -30
+KPX Amacron ugrave -30
+KPX Amacron uhungarumlaut -30
+KPX Amacron umacron -30
+KPX Amacron uogonek -30
+KPX Amacron uring -30
+KPX Amacron v -40
+KPX Amacron w -40
+KPX Amacron y -40
+KPX Amacron yacute -40
+KPX Amacron ydieresis -40
+KPX Aogonek C -30
+KPX Aogonek Cacute -30
+KPX Aogonek Ccaron -30
+KPX Aogonek Ccedilla -30
+KPX Aogonek G -30
+KPX Aogonek Gbreve -30
+KPX Aogonek Gcommaaccent -30
+KPX Aogonek O -30
+KPX Aogonek Oacute -30
+KPX Aogonek Ocircumflex -30
+KPX Aogonek Odieresis -30
+KPX Aogonek Ograve -30
+KPX Aogonek Ohungarumlaut -30
+KPX Aogonek Omacron -30
+KPX Aogonek Oslash -30
+KPX Aogonek Otilde -30
+KPX Aogonek Q -30
+KPX Aogonek T -120
+KPX Aogonek Tcaron -120
+KPX Aogonek Tcommaaccent -120
+KPX Aogonek U -50
+KPX Aogonek Uacute -50
+KPX Aogonek Ucircumflex -50
+KPX Aogonek Udieresis -50
+KPX Aogonek Ugrave -50
+KPX Aogonek Uhungarumlaut -50
+KPX Aogonek Umacron -50
+KPX Aogonek Uogonek -50
+KPX Aogonek Uring -50
+KPX Aogonek V -70
+KPX Aogonek W -50
+KPX Aogonek Y -100
+KPX Aogonek Yacute -100
+KPX Aogonek Ydieresis -100
+KPX Aogonek u -30
+KPX Aogonek uacute -30
+KPX Aogonek ucircumflex -30
+KPX Aogonek udieresis -30
+KPX Aogonek ugrave -30
+KPX Aogonek uhungarumlaut -30
+KPX Aogonek umacron -30
+KPX Aogonek uogonek -30
+KPX Aogonek uring -30
+KPX Aogonek v -40
+KPX Aogonek w -40
+KPX Aogonek y -40
+KPX Aogonek yacute -40
+KPX Aogonek ydieresis -40
+KPX Aring C -30
+KPX Aring Cacute -30
+KPX Aring Ccaron -30
+KPX Aring Ccedilla -30
+KPX Aring G -30
+KPX Aring Gbreve -30
+KPX Aring Gcommaaccent -30
+KPX Aring O -30
+KPX Aring Oacute -30
+KPX Aring Ocircumflex -30
+KPX Aring Odieresis -30
+KPX Aring Ograve -30
+KPX Aring Ohungarumlaut -30
+KPX Aring Omacron -30
+KPX Aring Oslash -30
+KPX Aring Otilde -30
+KPX Aring Q -30
+KPX Aring T -120
+KPX Aring Tcaron -120
+KPX Aring Tcommaaccent -120
+KPX Aring U -50
+KPX Aring Uacute -50
+KPX Aring Ucircumflex -50
+KPX Aring Udieresis -50
+KPX Aring Ugrave -50
+KPX Aring Uhungarumlaut -50
+KPX Aring Umacron -50
+KPX Aring Uogonek -50
+KPX Aring Uring -50
+KPX Aring V -70
+KPX Aring W -50
+KPX Aring Y -100
+KPX Aring Yacute -100
+KPX Aring Ydieresis -100
+KPX Aring u -30
+KPX Aring uacute -30
+KPX Aring ucircumflex -30
+KPX Aring udieresis -30
+KPX Aring ugrave -30
+KPX Aring uhungarumlaut -30
+KPX Aring umacron -30
+KPX Aring uogonek -30
+KPX Aring uring -30
+KPX Aring v -40
+KPX Aring w -40
+KPX Aring y -40
+KPX Aring yacute -40
+KPX Aring ydieresis -40
+KPX Atilde C -30
+KPX Atilde Cacute -30
+KPX Atilde Ccaron -30
+KPX Atilde Ccedilla -30
+KPX Atilde G -30
+KPX Atilde Gbreve -30
+KPX Atilde Gcommaaccent -30
+KPX Atilde O -30
+KPX Atilde Oacute -30
+KPX Atilde Ocircumflex -30
+KPX Atilde Odieresis -30
+KPX Atilde Ograve -30
+KPX Atilde Ohungarumlaut -30
+KPX Atilde Omacron -30
+KPX Atilde Oslash -30
+KPX Atilde Otilde -30
+KPX Atilde Q -30
+KPX Atilde T -120
+KPX Atilde Tcaron -120
+KPX Atilde Tcommaaccent -120
+KPX Atilde U -50
+KPX Atilde Uacute -50
+KPX Atilde Ucircumflex -50
+KPX Atilde Udieresis -50
+KPX Atilde Ugrave -50
+KPX Atilde Uhungarumlaut -50
+KPX Atilde Umacron -50
+KPX Atilde Uogonek -50
+KPX Atilde Uring -50
+KPX Atilde V -70
+KPX Atilde W -50
+KPX Atilde Y -100
+KPX Atilde Yacute -100
+KPX Atilde Ydieresis -100
+KPX Atilde u -30
+KPX Atilde uacute -30
+KPX Atilde ucircumflex -30
+KPX Atilde udieresis -30
+KPX Atilde ugrave -30
+KPX Atilde uhungarumlaut -30
+KPX Atilde umacron -30
+KPX Atilde uogonek -30
+KPX Atilde uring -30
+KPX Atilde v -40
+KPX Atilde w -40
+KPX Atilde y -40
+KPX Atilde yacute -40
+KPX Atilde ydieresis -40
+KPX B U -10
+KPX B Uacute -10
+KPX B Ucircumflex -10
+KPX B Udieresis -10
+KPX B Ugrave -10
+KPX B Uhungarumlaut -10
+KPX B Umacron -10
+KPX B Uogonek -10
+KPX B Uring -10
+KPX B comma -20
+KPX B period -20
+KPX C comma -30
+KPX C period -30
+KPX Cacute comma -30
+KPX Cacute period -30
+KPX Ccaron comma -30
+KPX Ccaron period -30
+KPX Ccedilla comma -30
+KPX Ccedilla period -30
+KPX D A -40
+KPX D Aacute -40
+KPX D Abreve -40
+KPX D Acircumflex -40
+KPX D Adieresis -40
+KPX D Agrave -40
+KPX D Amacron -40
+KPX D Aogonek -40
+KPX D Aring -40
+KPX D Atilde -40
+KPX D V -70
+KPX D W -40
+KPX D Y -90
+KPX D Yacute -90
+KPX D Ydieresis -90
+KPX D comma -70
+KPX D period -70
+KPX Dcaron A -40
+KPX Dcaron Aacute -40
+KPX Dcaron Abreve -40
+KPX Dcaron Acircumflex -40
+KPX Dcaron Adieresis -40
+KPX Dcaron Agrave -40
+KPX Dcaron Amacron -40
+KPX Dcaron Aogonek -40
+KPX Dcaron Aring -40
+KPX Dcaron Atilde -40
+KPX Dcaron V -70
+KPX Dcaron W -40
+KPX Dcaron Y -90
+KPX Dcaron Yacute -90
+KPX Dcaron Ydieresis -90
+KPX Dcaron comma -70
+KPX Dcaron period -70
+KPX Dcroat A -40
+KPX Dcroat Aacute -40
+KPX Dcroat Abreve -40
+KPX Dcroat Acircumflex -40
+KPX Dcroat Adieresis -40
+KPX Dcroat Agrave -40
+KPX Dcroat Amacron -40
+KPX Dcroat Aogonek -40
+KPX Dcroat Aring -40
+KPX Dcroat Atilde -40
+KPX Dcroat V -70
+KPX Dcroat W -40
+KPX Dcroat Y -90
+KPX Dcroat Yacute -90
+KPX Dcroat Ydieresis -90
+KPX Dcroat comma -70
+KPX Dcroat period -70
+KPX F A -80
+KPX F Aacute -80
+KPX F Abreve -80
+KPX F Acircumflex -80
+KPX F Adieresis -80
+KPX F Agrave -80
+KPX F Amacron -80
+KPX F Aogonek -80
+KPX F Aring -80
+KPX F Atilde -80
+KPX F a -50
+KPX F aacute -50
+KPX F abreve -50
+KPX F acircumflex -50
+KPX F adieresis -50
+KPX F agrave -50
+KPX F amacron -50
+KPX F aogonek -50
+KPX F aring -50
+KPX F atilde -50
+KPX F comma -150
+KPX F e -30
+KPX F eacute -30
+KPX F ecaron -30
+KPX F ecircumflex -30
+KPX F edieresis -30
+KPX F edotaccent -30
+KPX F egrave -30
+KPX F emacron -30
+KPX F eogonek -30
+KPX F o -30
+KPX F oacute -30
+KPX F ocircumflex -30
+KPX F odieresis -30
+KPX F ograve -30
+KPX F ohungarumlaut -30
+KPX F omacron -30
+KPX F oslash -30
+KPX F otilde -30
+KPX F period -150
+KPX F r -45
+KPX F racute -45
+KPX F rcaron -45
+KPX F rcommaaccent -45
+KPX J A -20
+KPX J Aacute -20
+KPX J Abreve -20
+KPX J Acircumflex -20
+KPX J Adieresis -20
+KPX J Agrave -20
+KPX J Amacron -20
+KPX J Aogonek -20
+KPX J Aring -20
+KPX J Atilde -20
+KPX J a -20
+KPX J aacute -20
+KPX J abreve -20
+KPX J acircumflex -20
+KPX J adieresis -20
+KPX J agrave -20
+KPX J amacron -20
+KPX J aogonek -20
+KPX J aring -20
+KPX J atilde -20
+KPX J comma -30
+KPX J period -30
+KPX J u -20
+KPX J uacute -20
+KPX J ucircumflex -20
+KPX J udieresis -20
+KPX J ugrave -20
+KPX J uhungarumlaut -20
+KPX J umacron -20
+KPX J uogonek -20
+KPX J uring -20
+KPX K O -50
+KPX K Oacute -50
+KPX K Ocircumflex -50
+KPX K Odieresis -50
+KPX K Ograve -50
+KPX K Ohungarumlaut -50
+KPX K Omacron -50
+KPX K Oslash -50
+KPX K Otilde -50
+KPX K e -40
+KPX K eacute -40
+KPX K ecaron -40
+KPX K ecircumflex -40
+KPX K edieresis -40
+KPX K edotaccent -40
+KPX K egrave -40
+KPX K emacron -40
+KPX K eogonek -40
+KPX K o -40
+KPX K oacute -40
+KPX K ocircumflex -40
+KPX K odieresis -40
+KPX K ograve -40
+KPX K ohungarumlaut -40
+KPX K omacron -40
+KPX K oslash -40
+KPX K otilde -40
+KPX K u -30
+KPX K uacute -30
+KPX K ucircumflex -30
+KPX K udieresis -30
+KPX K ugrave -30
+KPX K uhungarumlaut -30
+KPX K umacron -30
+KPX K uogonek -30
+KPX K uring -30
+KPX K y -50
+KPX K yacute -50
+KPX K ydieresis -50
+KPX Kcommaaccent O -50
+KPX Kcommaaccent Oacute -50
+KPX Kcommaaccent Ocircumflex -50
+KPX Kcommaaccent Odieresis -50
+KPX Kcommaaccent Ograve -50
+KPX Kcommaaccent Ohungarumlaut -50
+KPX Kcommaaccent Omacron -50
+KPX Kcommaaccent Oslash -50
+KPX Kcommaaccent Otilde -50
+KPX Kcommaaccent e -40
+KPX Kcommaaccent eacute -40
+KPX Kcommaaccent ecaron -40
+KPX Kcommaaccent ecircumflex -40
+KPX Kcommaaccent edieresis -40
+KPX Kcommaaccent edotaccent -40
+KPX Kcommaaccent egrave -40
+KPX Kcommaaccent emacron -40
+KPX Kcommaaccent eogonek -40
+KPX Kcommaaccent o -40
+KPX Kcommaaccent oacute -40
+KPX Kcommaaccent ocircumflex -40
+KPX Kcommaaccent odieresis -40
+KPX Kcommaaccent ograve -40
+KPX Kcommaaccent ohungarumlaut -40
+KPX Kcommaaccent omacron -40
+KPX Kcommaaccent oslash -40
+KPX Kcommaaccent otilde -40
+KPX Kcommaaccent u -30
+KPX Kcommaaccent uacute -30
+KPX Kcommaaccent ucircumflex -30
+KPX Kcommaaccent udieresis -30
+KPX Kcommaaccent ugrave -30
+KPX Kcommaaccent uhungarumlaut -30
+KPX Kcommaaccent umacron -30
+KPX Kcommaaccent uogonek -30
+KPX Kcommaaccent uring -30
+KPX Kcommaaccent y -50
+KPX Kcommaaccent yacute -50
+KPX Kcommaaccent ydieresis -50
+KPX L T -110
+KPX L Tcaron -110
+KPX L Tcommaaccent -110
+KPX L V -110
+KPX L W -70
+KPX L Y -140
+KPX L Yacute -140
+KPX L Ydieresis -140
+KPX L quotedblright -140
+KPX L quoteright -160
+KPX L y -30
+KPX L yacute -30
+KPX L ydieresis -30
+KPX Lacute T -110
+KPX Lacute Tcaron -110
+KPX Lacute Tcommaaccent -110
+KPX Lacute V -110
+KPX Lacute W -70
+KPX Lacute Y -140
+KPX Lacute Yacute -140
+KPX Lacute Ydieresis -140
+KPX Lacute quotedblright -140
+KPX Lacute quoteright -160
+KPX Lacute y -30
+KPX Lacute yacute -30
+KPX Lacute ydieresis -30
+KPX Lcaron T -110
+KPX Lcaron Tcaron -110
+KPX Lcaron Tcommaaccent -110
+KPX Lcaron V -110
+KPX Lcaron W -70
+KPX Lcaron Y -140
+KPX Lcaron Yacute -140
+KPX Lcaron Ydieresis -140
+KPX Lcaron quotedblright -140
+KPX Lcaron quoteright -160
+KPX Lcaron y -30
+KPX Lcaron yacute -30
+KPX Lcaron ydieresis -30
+KPX Lcommaaccent T -110
+KPX Lcommaaccent Tcaron -110
+KPX Lcommaaccent Tcommaaccent -110
+KPX Lcommaaccent V -110
+KPX Lcommaaccent W -70
+KPX Lcommaaccent Y -140
+KPX Lcommaaccent Yacute -140
+KPX Lcommaaccent Ydieresis -140
+KPX Lcommaaccent quotedblright -140
+KPX Lcommaaccent quoteright -160
+KPX Lcommaaccent y -30
+KPX Lcommaaccent yacute -30
+KPX Lcommaaccent ydieresis -30
+KPX Lslash T -110
+KPX Lslash Tcaron -110
+KPX Lslash Tcommaaccent -110
+KPX Lslash V -110
+KPX Lslash W -70
+KPX Lslash Y -140
+KPX Lslash Yacute -140
+KPX Lslash Ydieresis -140
+KPX Lslash quotedblright -140
+KPX Lslash quoteright -160
+KPX Lslash y -30
+KPX Lslash yacute -30
+KPX Lslash ydieresis -30
+KPX O A -20
+KPX O Aacute -20
+KPX O Abreve -20
+KPX O Acircumflex -20
+KPX O Adieresis -20
+KPX O Agrave -20
+KPX O Amacron -20
+KPX O Aogonek -20
+KPX O Aring -20
+KPX O Atilde -20
+KPX O T -40
+KPX O Tcaron -40
+KPX O Tcommaaccent -40
+KPX O V -50
+KPX O W -30
+KPX O X -60
+KPX O Y -70
+KPX O Yacute -70
+KPX O Ydieresis -70
+KPX O comma -40
+KPX O period -40
+KPX Oacute A -20
+KPX Oacute Aacute -20
+KPX Oacute Abreve -20
+KPX Oacute Acircumflex -20
+KPX Oacute Adieresis -20
+KPX Oacute Agrave -20
+KPX Oacute Amacron -20
+KPX Oacute Aogonek -20
+KPX Oacute Aring -20
+KPX Oacute Atilde -20
+KPX Oacute T -40
+KPX Oacute Tcaron -40
+KPX Oacute Tcommaaccent -40
+KPX Oacute V -50
+KPX Oacute W -30
+KPX Oacute X -60
+KPX Oacute Y -70
+KPX Oacute Yacute -70
+KPX Oacute Ydieresis -70
+KPX Oacute comma -40
+KPX Oacute period -40
+KPX Ocircumflex A -20
+KPX Ocircumflex Aacute -20
+KPX Ocircumflex Abreve -20
+KPX Ocircumflex Acircumflex -20
+KPX Ocircumflex Adieresis -20
+KPX Ocircumflex Agrave -20
+KPX Ocircumflex Amacron -20
+KPX Ocircumflex Aogonek -20
+KPX Ocircumflex Aring -20
+KPX Ocircumflex Atilde -20
+KPX Ocircumflex T -40
+KPX Ocircumflex Tcaron -40
+KPX Ocircumflex Tcommaaccent -40
+KPX Ocircumflex V -50
+KPX Ocircumflex W -30
+KPX Ocircumflex X -60
+KPX Ocircumflex Y -70
+KPX Ocircumflex Yacute -70
+KPX Ocircumflex Ydieresis -70
+KPX Ocircumflex comma -40
+KPX Ocircumflex period -40
+KPX Odieresis A -20
+KPX Odieresis Aacute -20
+KPX Odieresis Abreve -20
+KPX Odieresis Acircumflex -20
+KPX Odieresis Adieresis -20
+KPX Odieresis Agrave -20
+KPX Odieresis Amacron -20
+KPX Odieresis Aogonek -20
+KPX Odieresis Aring -20
+KPX Odieresis Atilde -20
+KPX Odieresis T -40
+KPX Odieresis Tcaron -40
+KPX Odieresis Tcommaaccent -40
+KPX Odieresis V -50
+KPX Odieresis W -30
+KPX Odieresis X -60
+KPX Odieresis Y -70
+KPX Odieresis Yacute -70
+KPX Odieresis Ydieresis -70
+KPX Odieresis comma -40
+KPX Odieresis period -40
+KPX Ograve A -20
+KPX Ograve Aacute -20
+KPX Ograve Abreve -20
+KPX Ograve Acircumflex -20
+KPX Ograve Adieresis -20
+KPX Ograve Agrave -20
+KPX Ograve Amacron -20
+KPX Ograve Aogonek -20
+KPX Ograve Aring -20
+KPX Ograve Atilde -20
+KPX Ograve T -40
+KPX Ograve Tcaron -40
+KPX Ograve Tcommaaccent -40
+KPX Ograve V -50
+KPX Ograve W -30
+KPX Ograve X -60
+KPX Ograve Y -70
+KPX Ograve Yacute -70
+KPX Ograve Ydieresis -70
+KPX Ograve comma -40
+KPX Ograve period -40
+KPX Ohungarumlaut A -20
+KPX Ohungarumlaut Aacute -20
+KPX Ohungarumlaut Abreve -20
+KPX Ohungarumlaut Acircumflex -20
+KPX Ohungarumlaut Adieresis -20
+KPX Ohungarumlaut Agrave -20
+KPX Ohungarumlaut Amacron -20
+KPX Ohungarumlaut Aogonek -20
+KPX Ohungarumlaut Aring -20
+KPX Ohungarumlaut Atilde -20
+KPX Ohungarumlaut T -40
+KPX Ohungarumlaut Tcaron -40
+KPX Ohungarumlaut Tcommaaccent -40
+KPX Ohungarumlaut V -50
+KPX Ohungarumlaut W -30
+KPX Ohungarumlaut X -60
+KPX Ohungarumlaut Y -70
+KPX Ohungarumlaut Yacute -70
+KPX Ohungarumlaut Ydieresis -70
+KPX Ohungarumlaut comma -40
+KPX Ohungarumlaut period -40
+KPX Omacron A -20
+KPX Omacron Aacute -20
+KPX Omacron Abreve -20
+KPX Omacron Acircumflex -20
+KPX Omacron Adieresis -20
+KPX Omacron Agrave -20
+KPX Omacron Amacron -20
+KPX Omacron Aogonek -20
+KPX Omacron Aring -20
+KPX Omacron Atilde -20
+KPX Omacron T -40
+KPX Omacron Tcaron -40
+KPX Omacron Tcommaaccent -40
+KPX Omacron V -50
+KPX Omacron W -30
+KPX Omacron X -60
+KPX Omacron Y -70
+KPX Omacron Yacute -70
+KPX Omacron Ydieresis -70
+KPX Omacron comma -40
+KPX Omacron period -40
+KPX Oslash A -20
+KPX Oslash Aacute -20
+KPX Oslash Abreve -20
+KPX Oslash Acircumflex -20
+KPX Oslash Adieresis -20
+KPX Oslash Agrave -20
+KPX Oslash Amacron -20
+KPX Oslash Aogonek -20
+KPX Oslash Aring -20
+KPX Oslash Atilde -20
+KPX Oslash T -40
+KPX Oslash Tcaron -40
+KPX Oslash Tcommaaccent -40
+KPX Oslash V -50
+KPX Oslash W -30
+KPX Oslash X -60
+KPX Oslash Y -70
+KPX Oslash Yacute -70
+KPX Oslash Ydieresis -70
+KPX Oslash comma -40
+KPX Oslash period -40
+KPX Otilde A -20
+KPX Otilde Aacute -20
+KPX Otilde Abreve -20
+KPX Otilde Acircumflex -20
+KPX Otilde Adieresis -20
+KPX Otilde Agrave -20
+KPX Otilde Amacron -20
+KPX Otilde Aogonek -20
+KPX Otilde Aring -20
+KPX Otilde Atilde -20
+KPX Otilde T -40
+KPX Otilde Tcaron -40
+KPX Otilde Tcommaaccent -40
+KPX Otilde V -50
+KPX Otilde W -30
+KPX Otilde X -60
+KPX Otilde Y -70
+KPX Otilde Yacute -70
+KPX Otilde Ydieresis -70
+KPX Otilde comma -40
+KPX Otilde period -40
+KPX P A -120
+KPX P Aacute -120
+KPX P Abreve -120
+KPX P Acircumflex -120
+KPX P Adieresis -120
+KPX P Agrave -120
+KPX P Amacron -120
+KPX P Aogonek -120
+KPX P Aring -120
+KPX P Atilde -120
+KPX P a -40
+KPX P aacute -40
+KPX P abreve -40
+KPX P acircumflex -40
+KPX P adieresis -40
+KPX P agrave -40
+KPX P amacron -40
+KPX P aogonek -40
+KPX P aring -40
+KPX P atilde -40
+KPX P comma -180
+KPX P e -50
+KPX P eacute -50
+KPX P ecaron -50
+KPX P ecircumflex -50
+KPX P edieresis -50
+KPX P edotaccent -50
+KPX P egrave -50
+KPX P emacron -50
+KPX P eogonek -50
+KPX P o -50
+KPX P oacute -50
+KPX P ocircumflex -50
+KPX P odieresis -50
+KPX P ograve -50
+KPX P ohungarumlaut -50
+KPX P omacron -50
+KPX P oslash -50
+KPX P otilde -50
+KPX P period -180
+KPX Q U -10
+KPX Q Uacute -10
+KPX Q Ucircumflex -10
+KPX Q Udieresis -10
+KPX Q Ugrave -10
+KPX Q Uhungarumlaut -10
+KPX Q Umacron -10
+KPX Q Uogonek -10
+KPX Q Uring -10
+KPX R O -20
+KPX R Oacute -20
+KPX R Ocircumflex -20
+KPX R Odieresis -20
+KPX R Ograve -20
+KPX R Ohungarumlaut -20
+KPX R Omacron -20
+KPX R Oslash -20
+KPX R Otilde -20
+KPX R T -30
+KPX R Tcaron -30
+KPX R Tcommaaccent -30
+KPX R U -40
+KPX R Uacute -40
+KPX R Ucircumflex -40
+KPX R Udieresis -40
+KPX R Ugrave -40
+KPX R Uhungarumlaut -40
+KPX R Umacron -40
+KPX R Uogonek -40
+KPX R Uring -40
+KPX R V -50
+KPX R W -30
+KPX R Y -50
+KPX R Yacute -50
+KPX R Ydieresis -50
+KPX Racute O -20
+KPX Racute Oacute -20
+KPX Racute Ocircumflex -20
+KPX Racute Odieresis -20
+KPX Racute Ograve -20
+KPX Racute Ohungarumlaut -20
+KPX Racute Omacron -20
+KPX Racute Oslash -20
+KPX Racute Otilde -20
+KPX Racute T -30
+KPX Racute Tcaron -30
+KPX Racute Tcommaaccent -30
+KPX Racute U -40
+KPX Racute Uacute -40
+KPX Racute Ucircumflex -40
+KPX Racute Udieresis -40
+KPX Racute Ugrave -40
+KPX Racute Uhungarumlaut -40
+KPX Racute Umacron -40
+KPX Racute Uogonek -40
+KPX Racute Uring -40
+KPX Racute V -50
+KPX Racute W -30
+KPX Racute Y -50
+KPX Racute Yacute -50
+KPX Racute Ydieresis -50
+KPX Rcaron O -20
+KPX Rcaron Oacute -20
+KPX Rcaron Ocircumflex -20
+KPX Rcaron Odieresis -20
+KPX Rcaron Ograve -20
+KPX Rcaron Ohungarumlaut -20
+KPX Rcaron Omacron -20
+KPX Rcaron Oslash -20
+KPX Rcaron Otilde -20
+KPX Rcaron T -30
+KPX Rcaron Tcaron -30
+KPX Rcaron Tcommaaccent -30
+KPX Rcaron U -40
+KPX Rcaron Uacute -40
+KPX Rcaron Ucircumflex -40
+KPX Rcaron Udieresis -40
+KPX Rcaron Ugrave -40
+KPX Rcaron Uhungarumlaut -40
+KPX Rcaron Umacron -40
+KPX Rcaron Uogonek -40
+KPX Rcaron Uring -40
+KPX Rcaron V -50
+KPX Rcaron W -30
+KPX Rcaron Y -50
+KPX Rcaron Yacute -50
+KPX Rcaron Ydieresis -50
+KPX Rcommaaccent O -20
+KPX Rcommaaccent Oacute -20
+KPX Rcommaaccent Ocircumflex -20
+KPX Rcommaaccent Odieresis -20
+KPX Rcommaaccent Ograve -20
+KPX Rcommaaccent Ohungarumlaut -20
+KPX Rcommaaccent Omacron -20
+KPX Rcommaaccent Oslash -20
+KPX Rcommaaccent Otilde -20
+KPX Rcommaaccent T -30
+KPX Rcommaaccent Tcaron -30
+KPX Rcommaaccent Tcommaaccent -30
+KPX Rcommaaccent U -40
+KPX Rcommaaccent Uacute -40
+KPX Rcommaaccent Ucircumflex -40
+KPX Rcommaaccent Udieresis -40
+KPX Rcommaaccent Ugrave -40
+KPX Rcommaaccent Uhungarumlaut -40
+KPX Rcommaaccent Umacron -40
+KPX Rcommaaccent Uogonek -40
+KPX Rcommaaccent Uring -40
+KPX Rcommaaccent V -50
+KPX Rcommaaccent W -30
+KPX Rcommaaccent Y -50
+KPX Rcommaaccent Yacute -50
+KPX Rcommaaccent Ydieresis -50
+KPX S comma -20
+KPX S period -20
+KPX Sacute comma -20
+KPX Sacute period -20
+KPX Scaron comma -20
+KPX Scaron period -20
+KPX Scedilla comma -20
+KPX Scedilla period -20
+KPX Scommaaccent comma -20
+KPX Scommaaccent period -20
+KPX T A -120
+KPX T Aacute -120
+KPX T Abreve -120
+KPX T Acircumflex -120
+KPX T Adieresis -120
+KPX T Agrave -120
+KPX T Amacron -120
+KPX T Aogonek -120
+KPX T Aring -120
+KPX T Atilde -120
+KPX T O -40
+KPX T Oacute -40
+KPX T Ocircumflex -40
+KPX T Odieresis -40
+KPX T Ograve -40
+KPX T Ohungarumlaut -40
+KPX T Omacron -40
+KPX T Oslash -40
+KPX T Otilde -40
+KPX T a -120
+KPX T aacute -120
+KPX T abreve -60
+KPX T acircumflex -120
+KPX T adieresis -120
+KPX T agrave -120
+KPX T amacron -60
+KPX T aogonek -120
+KPX T aring -120
+KPX T atilde -60
+KPX T colon -20
+KPX T comma -120
+KPX T e -120
+KPX T eacute -120
+KPX T ecaron -120
+KPX T ecircumflex -120
+KPX T edieresis -120
+KPX T edotaccent -120
+KPX T egrave -60
+KPX T emacron -60
+KPX T eogonek -120
+KPX T hyphen -140
+KPX T o -120
+KPX T oacute -120
+KPX T ocircumflex -120
+KPX T odieresis -120
+KPX T ograve -120
+KPX T ohungarumlaut -120
+KPX T omacron -60
+KPX T oslash -120
+KPX T otilde -60
+KPX T period -120
+KPX T r -120
+KPX T racute -120
+KPX T rcaron -120
+KPX T rcommaaccent -120
+KPX T semicolon -20
+KPX T u -120
+KPX T uacute -120
+KPX T ucircumflex -120
+KPX T udieresis -120
+KPX T ugrave -120
+KPX T uhungarumlaut -120
+KPX T umacron -60
+KPX T uogonek -120
+KPX T uring -120
+KPX T w -120
+KPX T y -120
+KPX T yacute -120
+KPX T ydieresis -60
+KPX Tcaron A -120
+KPX Tcaron Aacute -120
+KPX Tcaron Abreve -120
+KPX Tcaron Acircumflex -120
+KPX Tcaron Adieresis -120
+KPX Tcaron Agrave -120
+KPX Tcaron Amacron -120
+KPX Tcaron Aogonek -120
+KPX Tcaron Aring -120
+KPX Tcaron Atilde -120
+KPX Tcaron O -40
+KPX Tcaron Oacute -40
+KPX Tcaron Ocircumflex -40
+KPX Tcaron Odieresis -40
+KPX Tcaron Ograve -40
+KPX Tcaron Ohungarumlaut -40
+KPX Tcaron Omacron -40
+KPX Tcaron Oslash -40
+KPX Tcaron Otilde -40
+KPX Tcaron a -120
+KPX Tcaron aacute -120
+KPX Tcaron abreve -60
+KPX Tcaron acircumflex -120
+KPX Tcaron adieresis -120
+KPX Tcaron agrave -120
+KPX Tcaron amacron -60
+KPX Tcaron aogonek -120
+KPX Tcaron aring -120
+KPX Tcaron atilde -60
+KPX Tcaron colon -20
+KPX Tcaron comma -120
+KPX Tcaron e -120
+KPX Tcaron eacute -120
+KPX Tcaron ecaron -120
+KPX Tcaron ecircumflex -120
+KPX Tcaron edieresis -120
+KPX Tcaron edotaccent -120
+KPX Tcaron egrave -60
+KPX Tcaron emacron -60
+KPX Tcaron eogonek -120
+KPX Tcaron hyphen -140
+KPX Tcaron o -120
+KPX Tcaron oacute -120
+KPX Tcaron ocircumflex -120
+KPX Tcaron odieresis -120
+KPX Tcaron ograve -120
+KPX Tcaron ohungarumlaut -120
+KPX Tcaron omacron -60
+KPX Tcaron oslash -120
+KPX Tcaron otilde -60
+KPX Tcaron period -120
+KPX Tcaron r -120
+KPX Tcaron racute -120
+KPX Tcaron rcaron -120
+KPX Tcaron rcommaaccent -120
+KPX Tcaron semicolon -20
+KPX Tcaron u -120
+KPX Tcaron uacute -120
+KPX Tcaron ucircumflex -120
+KPX Tcaron udieresis -120
+KPX Tcaron ugrave -120
+KPX Tcaron uhungarumlaut -120
+KPX Tcaron umacron -60
+KPX Tcaron uogonek -120
+KPX Tcaron uring -120
+KPX Tcaron w -120
+KPX Tcaron y -120
+KPX Tcaron yacute -120
+KPX Tcaron ydieresis -60
+KPX Tcommaaccent A -120
+KPX Tcommaaccent Aacute -120
+KPX Tcommaaccent Abreve -120
+KPX Tcommaaccent Acircumflex -120
+KPX Tcommaaccent Adieresis -120
+KPX Tcommaaccent Agrave -120
+KPX Tcommaaccent Amacron -120
+KPX Tcommaaccent Aogonek -120
+KPX Tcommaaccent Aring -120
+KPX Tcommaaccent Atilde -120
+KPX Tcommaaccent O -40
+KPX Tcommaaccent Oacute -40
+KPX Tcommaaccent Ocircumflex -40
+KPX Tcommaaccent Odieresis -40
+KPX Tcommaaccent Ograve -40
+KPX Tcommaaccent Ohungarumlaut -40
+KPX Tcommaaccent Omacron -40
+KPX Tcommaaccent Oslash -40
+KPX Tcommaaccent Otilde -40
+KPX Tcommaaccent a -120
+KPX Tcommaaccent aacute -120
+KPX Tcommaaccent abreve -60
+KPX Tcommaaccent acircumflex -120
+KPX Tcommaaccent adieresis -120
+KPX Tcommaaccent agrave -120
+KPX Tcommaaccent amacron -60
+KPX Tcommaaccent aogonek -120
+KPX Tcommaaccent aring -120
+KPX Tcommaaccent atilde -60
+KPX Tcommaaccent colon -20
+KPX Tcommaaccent comma -120
+KPX Tcommaaccent e -120
+KPX Tcommaaccent eacute -120
+KPX Tcommaaccent ecaron -120
+KPX Tcommaaccent ecircumflex -120
+KPX Tcommaaccent edieresis -120
+KPX Tcommaaccent edotaccent -120
+KPX Tcommaaccent egrave -60
+KPX Tcommaaccent emacron -60
+KPX Tcommaaccent eogonek -120
+KPX Tcommaaccent hyphen -140
+KPX Tcommaaccent o -120
+KPX Tcommaaccent oacute -120
+KPX Tcommaaccent ocircumflex -120
+KPX Tcommaaccent odieresis -120
+KPX Tcommaaccent ograve -120
+KPX Tcommaaccent ohungarumlaut -120
+KPX Tcommaaccent omacron -60
+KPX Tcommaaccent oslash -120
+KPX Tcommaaccent otilde -60
+KPX Tcommaaccent period -120
+KPX Tcommaaccent r -120
+KPX Tcommaaccent racute -120
+KPX Tcommaaccent rcaron -120
+KPX Tcommaaccent rcommaaccent -120
+KPX Tcommaaccent semicolon -20
+KPX Tcommaaccent u -120
+KPX Tcommaaccent uacute -120
+KPX Tcommaaccent ucircumflex -120
+KPX Tcommaaccent udieresis -120
+KPX Tcommaaccent ugrave -120
+KPX Tcommaaccent uhungarumlaut -120
+KPX Tcommaaccent umacron -60
+KPX Tcommaaccent uogonek -120
+KPX Tcommaaccent uring -120
+KPX Tcommaaccent w -120
+KPX Tcommaaccent y -120
+KPX Tcommaaccent yacute -120
+KPX Tcommaaccent ydieresis -60
+KPX U A -40
+KPX U Aacute -40
+KPX U Abreve -40
+KPX U Acircumflex -40
+KPX U Adieresis -40
+KPX U Agrave -40
+KPX U Amacron -40
+KPX U Aogonek -40
+KPX U Aring -40
+KPX U Atilde -40
+KPX U comma -40
+KPX U period -40
+KPX Uacute A -40
+KPX Uacute Aacute -40
+KPX Uacute Abreve -40
+KPX Uacute Acircumflex -40
+KPX Uacute Adieresis -40
+KPX Uacute Agrave -40
+KPX Uacute Amacron -40
+KPX Uacute Aogonek -40
+KPX Uacute Aring -40
+KPX Uacute Atilde -40
+KPX Uacute comma -40
+KPX Uacute period -40
+KPX Ucircumflex A -40
+KPX Ucircumflex Aacute -40
+KPX Ucircumflex Abreve -40
+KPX Ucircumflex Acircumflex -40
+KPX Ucircumflex Adieresis -40
+KPX Ucircumflex Agrave -40
+KPX Ucircumflex Amacron -40
+KPX Ucircumflex Aogonek -40
+KPX Ucircumflex Aring -40
+KPX Ucircumflex Atilde -40
+KPX Ucircumflex comma -40
+KPX Ucircumflex period -40
+KPX Udieresis A -40
+KPX Udieresis Aacute -40
+KPX Udieresis Abreve -40
+KPX Udieresis Acircumflex -40
+KPX Udieresis Adieresis -40
+KPX Udieresis Agrave -40
+KPX Udieresis Amacron -40
+KPX Udieresis Aogonek -40
+KPX Udieresis Aring -40
+KPX Udieresis Atilde -40
+KPX Udieresis comma -40
+KPX Udieresis period -40
+KPX Ugrave A -40
+KPX Ugrave Aacute -40
+KPX Ugrave Abreve -40
+KPX Ugrave Acircumflex -40
+KPX Ugrave Adieresis -40
+KPX Ugrave Agrave -40
+KPX Ugrave Amacron -40
+KPX Ugrave Aogonek -40
+KPX Ugrave Aring -40
+KPX Ugrave Atilde -40
+KPX Ugrave comma -40
+KPX Ugrave period -40
+KPX Uhungarumlaut A -40
+KPX Uhungarumlaut Aacute -40
+KPX Uhungarumlaut Abreve -40
+KPX Uhungarumlaut Acircumflex -40
+KPX Uhungarumlaut Adieresis -40
+KPX Uhungarumlaut Agrave -40
+KPX Uhungarumlaut Amacron -40
+KPX Uhungarumlaut Aogonek -40
+KPX Uhungarumlaut Aring -40
+KPX Uhungarumlaut Atilde -40
+KPX Uhungarumlaut comma -40
+KPX Uhungarumlaut period -40
+KPX Umacron A -40
+KPX Umacron Aacute -40
+KPX Umacron Abreve -40
+KPX Umacron Acircumflex -40
+KPX Umacron Adieresis -40
+KPX Umacron Agrave -40
+KPX Umacron Amacron -40
+KPX Umacron Aogonek -40
+KPX Umacron Aring -40
+KPX Umacron Atilde -40
+KPX Umacron comma -40
+KPX Umacron period -40
+KPX Uogonek A -40
+KPX Uogonek Aacute -40
+KPX Uogonek Abreve -40
+KPX Uogonek Acircumflex -40
+KPX Uogonek Adieresis -40
+KPX Uogonek Agrave -40
+KPX Uogonek Amacron -40
+KPX Uogonek Aogonek -40
+KPX Uogonek Aring -40
+KPX Uogonek Atilde -40
+KPX Uogonek comma -40
+KPX Uogonek period -40
+KPX Uring A -40
+KPX Uring Aacute -40
+KPX Uring Abreve -40
+KPX Uring Acircumflex -40
+KPX Uring Adieresis -40
+KPX Uring Agrave -40
+KPX Uring Amacron -40
+KPX Uring Aogonek -40
+KPX Uring Aring -40
+KPX Uring Atilde -40
+KPX Uring comma -40
+KPX Uring period -40
+KPX V A -80
+KPX V Aacute -80
+KPX V Abreve -80
+KPX V Acircumflex -80
+KPX V Adieresis -80
+KPX V Agrave -80
+KPX V Amacron -80
+KPX V Aogonek -80
+KPX V Aring -80
+KPX V Atilde -80
+KPX V G -40
+KPX V Gbreve -40
+KPX V Gcommaaccent -40
+KPX V O -40
+KPX V Oacute -40
+KPX V Ocircumflex -40
+KPX V Odieresis -40
+KPX V Ograve -40
+KPX V Ohungarumlaut -40
+KPX V Omacron -40
+KPX V Oslash -40
+KPX V Otilde -40
+KPX V a -70
+KPX V aacute -70
+KPX V abreve -70
+KPX V acircumflex -70
+KPX V adieresis -70
+KPX V agrave -70
+KPX V amacron -70
+KPX V aogonek -70
+KPX V aring -70
+KPX V atilde -70
+KPX V colon -40
+KPX V comma -125
+KPX V e -80
+KPX V eacute -80
+KPX V ecaron -80
+KPX V ecircumflex -80
+KPX V edieresis -80
+KPX V edotaccent -80
+KPX V egrave -80
+KPX V emacron -80
+KPX V eogonek -80
+KPX V hyphen -80
+KPX V o -80
+KPX V oacute -80
+KPX V ocircumflex -80
+KPX V odieresis -80
+KPX V ograve -80
+KPX V ohungarumlaut -80
+KPX V omacron -80
+KPX V oslash -80
+KPX V otilde -80
+KPX V period -125
+KPX V semicolon -40
+KPX V u -70
+KPX V uacute -70
+KPX V ucircumflex -70
+KPX V udieresis -70
+KPX V ugrave -70
+KPX V uhungarumlaut -70
+KPX V umacron -70
+KPX V uogonek -70
+KPX V uring -70
+KPX W A -50
+KPX W Aacute -50
+KPX W Abreve -50
+KPX W Acircumflex -50
+KPX W Adieresis -50
+KPX W Agrave -50
+KPX W Amacron -50
+KPX W Aogonek -50
+KPX W Aring -50
+KPX W Atilde -50
+KPX W O -20
+KPX W Oacute -20
+KPX W Ocircumflex -20
+KPX W Odieresis -20
+KPX W Ograve -20
+KPX W Ohungarumlaut -20
+KPX W Omacron -20
+KPX W Oslash -20
+KPX W Otilde -20
+KPX W a -40
+KPX W aacute -40
+KPX W abreve -40
+KPX W acircumflex -40
+KPX W adieresis -40
+KPX W agrave -40
+KPX W amacron -40
+KPX W aogonek -40
+KPX W aring -40
+KPX W atilde -40
+KPX W comma -80
+KPX W e -30
+KPX W eacute -30
+KPX W ecaron -30
+KPX W ecircumflex -30
+KPX W edieresis -30
+KPX W edotaccent -30
+KPX W egrave -30
+KPX W emacron -30
+KPX W eogonek -30
+KPX W hyphen -40
+KPX W o -30
+KPX W oacute -30
+KPX W ocircumflex -30
+KPX W odieresis -30
+KPX W ograve -30
+KPX W ohungarumlaut -30
+KPX W omacron -30
+KPX W oslash -30
+KPX W otilde -30
+KPX W period -80
+KPX W u -30
+KPX W uacute -30
+KPX W ucircumflex -30
+KPX W udieresis -30
+KPX W ugrave -30
+KPX W uhungarumlaut -30
+KPX W umacron -30
+KPX W uogonek -30
+KPX W uring -30
+KPX W y -20
+KPX W yacute -20
+KPX W ydieresis -20
+KPX Y A -110
+KPX Y Aacute -110
+KPX Y Abreve -110
+KPX Y Acircumflex -110
+KPX Y Adieresis -110
+KPX Y Agrave -110
+KPX Y Amacron -110
+KPX Y Aogonek -110
+KPX Y Aring -110
+KPX Y Atilde -110
+KPX Y O -85
+KPX Y Oacute -85
+KPX Y Ocircumflex -85
+KPX Y Odieresis -85
+KPX Y Ograve -85
+KPX Y Ohungarumlaut -85
+KPX Y Omacron -85
+KPX Y Oslash -85
+KPX Y Otilde -85
+KPX Y a -140
+KPX Y aacute -140
+KPX Y abreve -70
+KPX Y acircumflex -140
+KPX Y adieresis -140
+KPX Y agrave -140
+KPX Y amacron -70
+KPX Y aogonek -140
+KPX Y aring -140
+KPX Y atilde -140
+KPX Y colon -60
+KPX Y comma -140
+KPX Y e -140
+KPX Y eacute -140
+KPX Y ecaron -140
+KPX Y ecircumflex -140
+KPX Y edieresis -140
+KPX Y edotaccent -140
+KPX Y egrave -140
+KPX Y emacron -70
+KPX Y eogonek -140
+KPX Y hyphen -140
+KPX Y i -20
+KPX Y iacute -20
+KPX Y iogonek -20
+KPX Y o -140
+KPX Y oacute -140
+KPX Y ocircumflex -140
+KPX Y odieresis -140
+KPX Y ograve -140
+KPX Y ohungarumlaut -140
+KPX Y omacron -140
+KPX Y oslash -140
+KPX Y otilde -140
+KPX Y period -140
+KPX Y semicolon -60
+KPX Y u -110
+KPX Y uacute -110
+KPX Y ucircumflex -110
+KPX Y udieresis -110
+KPX Y ugrave -110
+KPX Y uhungarumlaut -110
+KPX Y umacron -110
+KPX Y uogonek -110
+KPX Y uring -110
+KPX Yacute A -110
+KPX Yacute Aacute -110
+KPX Yacute Abreve -110
+KPX Yacute Acircumflex -110
+KPX Yacute Adieresis -110
+KPX Yacute Agrave -110
+KPX Yacute Amacron -110
+KPX Yacute Aogonek -110
+KPX Yacute Aring -110
+KPX Yacute Atilde -110
+KPX Yacute O -85
+KPX Yacute Oacute -85
+KPX Yacute Ocircumflex -85
+KPX Yacute Odieresis -85
+KPX Yacute Ograve -85
+KPX Yacute Ohungarumlaut -85
+KPX Yacute Omacron -85
+KPX Yacute Oslash -85
+KPX Yacute Otilde -85
+KPX Yacute a -140
+KPX Yacute aacute -140
+KPX Yacute abreve -70
+KPX Yacute acircumflex -140
+KPX Yacute adieresis -140
+KPX Yacute agrave -140
+KPX Yacute amacron -70
+KPX Yacute aogonek -140
+KPX Yacute aring -140
+KPX Yacute atilde -70
+KPX Yacute colon -60
+KPX Yacute comma -140
+KPX Yacute e -140
+KPX Yacute eacute -140
+KPX Yacute ecaron -140
+KPX Yacute ecircumflex -140
+KPX Yacute edieresis -140
+KPX Yacute edotaccent -140
+KPX Yacute egrave -140
+KPX Yacute emacron -70
+KPX Yacute eogonek -140
+KPX Yacute hyphen -140
+KPX Yacute i -20
+KPX Yacute iacute -20
+KPX Yacute iogonek -20
+KPX Yacute o -140
+KPX Yacute oacute -140
+KPX Yacute ocircumflex -140
+KPX Yacute odieresis -140
+KPX Yacute ograve -140
+KPX Yacute ohungarumlaut -140
+KPX Yacute omacron -70
+KPX Yacute oslash -140
+KPX Yacute otilde -140
+KPX Yacute period -140
+KPX Yacute semicolon -60
+KPX Yacute u -110
+KPX Yacute uacute -110
+KPX Yacute ucircumflex -110
+KPX Yacute udieresis -110
+KPX Yacute ugrave -110
+KPX Yacute uhungarumlaut -110
+KPX Yacute umacron -110
+KPX Yacute uogonek -110
+KPX Yacute uring -110
+KPX Ydieresis A -110
+KPX Ydieresis Aacute -110
+KPX Ydieresis Abreve -110
+KPX Ydieresis Acircumflex -110
+KPX Ydieresis Adieresis -110
+KPX Ydieresis Agrave -110
+KPX Ydieresis Amacron -110
+KPX Ydieresis Aogonek -110
+KPX Ydieresis Aring -110
+KPX Ydieresis Atilde -110
+KPX Ydieresis O -85
+KPX Ydieresis Oacute -85
+KPX Ydieresis Ocircumflex -85
+KPX Ydieresis Odieresis -85
+KPX Ydieresis Ograve -85
+KPX Ydieresis Ohungarumlaut -85
+KPX Ydieresis Omacron -85
+KPX Ydieresis Oslash -85
+KPX Ydieresis Otilde -85
+KPX Ydieresis a -140
+KPX Ydieresis aacute -140
+KPX Ydieresis abreve -70
+KPX Ydieresis acircumflex -140
+KPX Ydieresis adieresis -140
+KPX Ydieresis agrave -140
+KPX Ydieresis amacron -70
+KPX Ydieresis aogonek -140
+KPX Ydieresis aring -140
+KPX Ydieresis atilde -70
+KPX Ydieresis colon -60
+KPX Ydieresis comma -140
+KPX Ydieresis e -140
+KPX Ydieresis eacute -140
+KPX Ydieresis ecaron -140
+KPX Ydieresis ecircumflex -140
+KPX Ydieresis edieresis -140
+KPX Ydieresis edotaccent -140
+KPX Ydieresis egrave -140
+KPX Ydieresis emacron -70
+KPX Ydieresis eogonek -140
+KPX Ydieresis hyphen -140
+KPX Ydieresis i -20
+KPX Ydieresis iacute -20
+KPX Ydieresis iogonek -20
+KPX Ydieresis o -140
+KPX Ydieresis oacute -140
+KPX Ydieresis ocircumflex -140
+KPX Ydieresis odieresis -140
+KPX Ydieresis ograve -140
+KPX Ydieresis ohungarumlaut -140
+KPX Ydieresis omacron -140
+KPX Ydieresis oslash -140
+KPX Ydieresis otilde -140
+KPX Ydieresis period -140
+KPX Ydieresis semicolon -60
+KPX Ydieresis u -110
+KPX Ydieresis uacute -110
+KPX Ydieresis ucircumflex -110
+KPX Ydieresis udieresis -110
+KPX Ydieresis ugrave -110
+KPX Ydieresis uhungarumlaut -110
+KPX Ydieresis umacron -110
+KPX Ydieresis uogonek -110
+KPX Ydieresis uring -110
+KPX a v -20
+KPX a w -20
+KPX a y -30
+KPX a yacute -30
+KPX a ydieresis -30
+KPX aacute v -20
+KPX aacute w -20
+KPX aacute y -30
+KPX aacute yacute -30
+KPX aacute ydieresis -30
+KPX abreve v -20
+KPX abreve w -20
+KPX abreve y -30
+KPX abreve yacute -30
+KPX abreve ydieresis -30
+KPX acircumflex v -20
+KPX acircumflex w -20
+KPX acircumflex y -30
+KPX acircumflex yacute -30
+KPX acircumflex ydieresis -30
+KPX adieresis v -20
+KPX adieresis w -20
+KPX adieresis y -30
+KPX adieresis yacute -30
+KPX adieresis ydieresis -30
+KPX agrave v -20
+KPX agrave w -20
+KPX agrave y -30
+KPX agrave yacute -30
+KPX agrave ydieresis -30
+KPX amacron v -20
+KPX amacron w -20
+KPX amacron y -30
+KPX amacron yacute -30
+KPX amacron ydieresis -30
+KPX aogonek v -20
+KPX aogonek w -20
+KPX aogonek y -30
+KPX aogonek yacute -30
+KPX aogonek ydieresis -30
+KPX aring v -20
+KPX aring w -20
+KPX aring y -30
+KPX aring yacute -30
+KPX aring ydieresis -30
+KPX atilde v -20
+KPX atilde w -20
+KPX atilde y -30
+KPX atilde yacute -30
+KPX atilde ydieresis -30
+KPX b b -10
+KPX b comma -40
+KPX b l -20
+KPX b lacute -20
+KPX b lcommaaccent -20
+KPX b lslash -20
+KPX b period -40
+KPX b u -20
+KPX b uacute -20
+KPX b ucircumflex -20
+KPX b udieresis -20
+KPX b ugrave -20
+KPX b uhungarumlaut -20
+KPX b umacron -20
+KPX b uogonek -20
+KPX b uring -20
+KPX b v -20
+KPX b y -20
+KPX b yacute -20
+KPX b ydieresis -20
+KPX c comma -15
+KPX c k -20
+KPX c kcommaaccent -20
+KPX cacute comma -15
+KPX cacute k -20
+KPX cacute kcommaaccent -20
+KPX ccaron comma -15
+KPX ccaron k -20
+KPX ccaron kcommaaccent -20
+KPX ccedilla comma -15
+KPX ccedilla k -20
+KPX ccedilla kcommaaccent -20
+KPX colon space -50
+KPX comma quotedblright -100
+KPX comma quoteright -100
+KPX e comma -15
+KPX e period -15
+KPX e v -30
+KPX e w -20
+KPX e x -30
+KPX e y -20
+KPX e yacute -20
+KPX e ydieresis -20
+KPX eacute comma -15
+KPX eacute period -15
+KPX eacute v -30
+KPX eacute w -20
+KPX eacute x -30
+KPX eacute y -20
+KPX eacute yacute -20
+KPX eacute ydieresis -20
+KPX ecaron comma -15
+KPX ecaron period -15
+KPX ecaron v -30
+KPX ecaron w -20
+KPX ecaron x -30
+KPX ecaron y -20
+KPX ecaron yacute -20
+KPX ecaron ydieresis -20
+KPX ecircumflex comma -15
+KPX ecircumflex period -15
+KPX ecircumflex v -30
+KPX ecircumflex w -20
+KPX ecircumflex x -30
+KPX ecircumflex y -20
+KPX ecircumflex yacute -20
+KPX ecircumflex ydieresis -20
+KPX edieresis comma -15
+KPX edieresis period -15
+KPX edieresis v -30
+KPX edieresis w -20
+KPX edieresis x -30
+KPX edieresis y -20
+KPX edieresis yacute -20
+KPX edieresis ydieresis -20
+KPX edotaccent comma -15
+KPX edotaccent period -15
+KPX edotaccent v -30
+KPX edotaccent w -20
+KPX edotaccent x -30
+KPX edotaccent y -20
+KPX edotaccent yacute -20
+KPX edotaccent ydieresis -20
+KPX egrave comma -15
+KPX egrave period -15
+KPX egrave v -30
+KPX egrave w -20
+KPX egrave x -30
+KPX egrave y -20
+KPX egrave yacute -20
+KPX egrave ydieresis -20
+KPX emacron comma -15
+KPX emacron period -15
+KPX emacron v -30
+KPX emacron w -20
+KPX emacron x -30
+KPX emacron y -20
+KPX emacron yacute -20
+KPX emacron ydieresis -20
+KPX eogonek comma -15
+KPX eogonek period -15
+KPX eogonek v -30
+KPX eogonek w -20
+KPX eogonek x -30
+KPX eogonek y -20
+KPX eogonek yacute -20
+KPX eogonek ydieresis -20
+KPX f a -30
+KPX f aacute -30
+KPX f abreve -30
+KPX f acircumflex -30
+KPX f adieresis -30
+KPX f agrave -30
+KPX f amacron -30
+KPX f aogonek -30
+KPX f aring -30
+KPX f atilde -30
+KPX f comma -30
+KPX f dotlessi -28
+KPX f e -30
+KPX f eacute -30
+KPX f ecaron -30
+KPX f ecircumflex -30
+KPX f edieresis -30
+KPX f edotaccent -30
+KPX f egrave -30
+KPX f emacron -30
+KPX f eogonek -30
+KPX f o -30
+KPX f oacute -30
+KPX f ocircumflex -30
+KPX f odieresis -30
+KPX f ograve -30
+KPX f ohungarumlaut -30
+KPX f omacron -30
+KPX f oslash -30
+KPX f otilde -30
+KPX f period -30
+KPX f quotedblright 60
+KPX f quoteright 50
+KPX g r -10
+KPX g racute -10
+KPX g rcaron -10
+KPX g rcommaaccent -10
+KPX gbreve r -10
+KPX gbreve racute -10
+KPX gbreve rcaron -10
+KPX gbreve rcommaaccent -10
+KPX gcommaaccent r -10
+KPX gcommaaccent racute -10
+KPX gcommaaccent rcaron -10
+KPX gcommaaccent rcommaaccent -10
+KPX h y -30
+KPX h yacute -30
+KPX h ydieresis -30
+KPX k e -20
+KPX k eacute -20
+KPX k ecaron -20
+KPX k ecircumflex -20
+KPX k edieresis -20
+KPX k edotaccent -20
+KPX k egrave -20
+KPX k emacron -20
+KPX k eogonek -20
+KPX k o -20
+KPX k oacute -20
+KPX k ocircumflex -20
+KPX k odieresis -20
+KPX k ograve -20
+KPX k ohungarumlaut -20
+KPX k omacron -20
+KPX k oslash -20
+KPX k otilde -20
+KPX kcommaaccent e -20
+KPX kcommaaccent eacute -20
+KPX kcommaaccent ecaron -20
+KPX kcommaaccent ecircumflex -20
+KPX kcommaaccent edieresis -20
+KPX kcommaaccent edotaccent -20
+KPX kcommaaccent egrave -20
+KPX kcommaaccent emacron -20
+KPX kcommaaccent eogonek -20
+KPX kcommaaccent o -20
+KPX kcommaaccent oacute -20
+KPX kcommaaccent ocircumflex -20
+KPX kcommaaccent odieresis -20
+KPX kcommaaccent ograve -20
+KPX kcommaaccent ohungarumlaut -20
+KPX kcommaaccent omacron -20
+KPX kcommaaccent oslash -20
+KPX kcommaaccent otilde -20
+KPX m u -10
+KPX m uacute -10
+KPX m ucircumflex -10
+KPX m udieresis -10
+KPX m ugrave -10
+KPX m uhungarumlaut -10
+KPX m umacron -10
+KPX m uogonek -10
+KPX m uring -10
+KPX m y -15
+KPX m yacute -15
+KPX m ydieresis -15
+KPX n u -10
+KPX n uacute -10
+KPX n ucircumflex -10
+KPX n udieresis -10
+KPX n ugrave -10
+KPX n uhungarumlaut -10
+KPX n umacron -10
+KPX n uogonek -10
+KPX n uring -10
+KPX n v -20
+KPX n y -15
+KPX n yacute -15
+KPX n ydieresis -15
+KPX nacute u -10
+KPX nacute uacute -10
+KPX nacute ucircumflex -10
+KPX nacute udieresis -10
+KPX nacute ugrave -10
+KPX nacute uhungarumlaut -10
+KPX nacute umacron -10
+KPX nacute uogonek -10
+KPX nacute uring -10
+KPX nacute v -20
+KPX nacute y -15
+KPX nacute yacute -15
+KPX nacute ydieresis -15
+KPX ncaron u -10
+KPX ncaron uacute -10
+KPX ncaron ucircumflex -10
+KPX ncaron udieresis -10
+KPX ncaron ugrave -10
+KPX ncaron uhungarumlaut -10
+KPX ncaron umacron -10
+KPX ncaron uogonek -10
+KPX ncaron uring -10
+KPX ncaron v -20
+KPX ncaron y -15
+KPX ncaron yacute -15
+KPX ncaron ydieresis -15
+KPX ncommaaccent u -10
+KPX ncommaaccent uacute -10
+KPX ncommaaccent ucircumflex -10
+KPX ncommaaccent udieresis -10
+KPX ncommaaccent ugrave -10
+KPX ncommaaccent uhungarumlaut -10
+KPX ncommaaccent umacron -10
+KPX ncommaaccent uogonek -10
+KPX ncommaaccent uring -10
+KPX ncommaaccent v -20
+KPX ncommaaccent y -15
+KPX ncommaaccent yacute -15
+KPX ncommaaccent ydieresis -15
+KPX ntilde u -10
+KPX ntilde uacute -10
+KPX ntilde ucircumflex -10
+KPX ntilde udieresis -10
+KPX ntilde ugrave -10
+KPX ntilde uhungarumlaut -10
+KPX ntilde umacron -10
+KPX ntilde uogonek -10
+KPX ntilde uring -10
+KPX ntilde v -20
+KPX ntilde y -15
+KPX ntilde yacute -15
+KPX ntilde ydieresis -15
+KPX o comma -40
+KPX o period -40
+KPX o v -15
+KPX o w -15
+KPX o x -30
+KPX o y -30
+KPX o yacute -30
+KPX o ydieresis -30
+KPX oacute comma -40
+KPX oacute period -40
+KPX oacute v -15
+KPX oacute w -15
+KPX oacute x -30
+KPX oacute y -30
+KPX oacute yacute -30
+KPX oacute ydieresis -30
+KPX ocircumflex comma -40
+KPX ocircumflex period -40
+KPX ocircumflex v -15
+KPX ocircumflex w -15
+KPX ocircumflex x -30
+KPX ocircumflex y -30
+KPX ocircumflex yacute -30
+KPX ocircumflex ydieresis -30
+KPX odieresis comma -40
+KPX odieresis period -40
+KPX odieresis v -15
+KPX odieresis w -15
+KPX odieresis x -30
+KPX odieresis y -30
+KPX odieresis yacute -30
+KPX odieresis ydieresis -30
+KPX ograve comma -40
+KPX ograve period -40
+KPX ograve v -15
+KPX ograve w -15
+KPX ograve x -30
+KPX ograve y -30
+KPX ograve yacute -30
+KPX ograve ydieresis -30
+KPX ohungarumlaut comma -40
+KPX ohungarumlaut period -40
+KPX ohungarumlaut v -15
+KPX ohungarumlaut w -15
+KPX ohungarumlaut x -30
+KPX ohungarumlaut y -30
+KPX ohungarumlaut yacute -30
+KPX ohungarumlaut ydieresis -30
+KPX omacron comma -40
+KPX omacron period -40
+KPX omacron v -15
+KPX omacron w -15
+KPX omacron x -30
+KPX omacron y -30
+KPX omacron yacute -30
+KPX omacron ydieresis -30
+KPX oslash a -55
+KPX oslash aacute -55
+KPX oslash abreve -55
+KPX oslash acircumflex -55
+KPX oslash adieresis -55
+KPX oslash agrave -55
+KPX oslash amacron -55
+KPX oslash aogonek -55
+KPX oslash aring -55
+KPX oslash atilde -55
+KPX oslash b -55
+KPX oslash c -55
+KPX oslash cacute -55
+KPX oslash ccaron -55
+KPX oslash ccedilla -55
+KPX oslash comma -95
+KPX oslash d -55
+KPX oslash dcroat -55
+KPX oslash e -55
+KPX oslash eacute -55
+KPX oslash ecaron -55
+KPX oslash ecircumflex -55
+KPX oslash edieresis -55
+KPX oslash edotaccent -55
+KPX oslash egrave -55
+KPX oslash emacron -55
+KPX oslash eogonek -55
+KPX oslash f -55
+KPX oslash g -55
+KPX oslash gbreve -55
+KPX oslash gcommaaccent -55
+KPX oslash h -55
+KPX oslash i -55
+KPX oslash iacute -55
+KPX oslash icircumflex -55
+KPX oslash idieresis -55
+KPX oslash igrave -55
+KPX oslash imacron -55
+KPX oslash iogonek -55
+KPX oslash j -55
+KPX oslash k -55
+KPX oslash kcommaaccent -55
+KPX oslash l -55
+KPX oslash lacute -55
+KPX oslash lcommaaccent -55
+KPX oslash lslash -55
+KPX oslash m -55
+KPX oslash n -55
+KPX oslash nacute -55
+KPX oslash ncaron -55
+KPX oslash ncommaaccent -55
+KPX oslash ntilde -55
+KPX oslash o -55
+KPX oslash oacute -55
+KPX oslash ocircumflex -55
+KPX oslash odieresis -55
+KPX oslash ograve -55
+KPX oslash ohungarumlaut -55
+KPX oslash omacron -55
+KPX oslash oslash -55
+KPX oslash otilde -55
+KPX oslash p -55
+KPX oslash period -95
+KPX oslash q -55
+KPX oslash r -55
+KPX oslash racute -55
+KPX oslash rcaron -55
+KPX oslash rcommaaccent -55
+KPX oslash s -55
+KPX oslash sacute -55
+KPX oslash scaron -55
+KPX oslash scedilla -55
+KPX oslash scommaaccent -55
+KPX oslash t -55
+KPX oslash tcommaaccent -55
+KPX oslash u -55
+KPX oslash uacute -55
+KPX oslash ucircumflex -55
+KPX oslash udieresis -55
+KPX oslash ugrave -55
+KPX oslash uhungarumlaut -55
+KPX oslash umacron -55
+KPX oslash uogonek -55
+KPX oslash uring -55
+KPX oslash v -70
+KPX oslash w -70
+KPX oslash x -85
+KPX oslash y -70
+KPX oslash yacute -70
+KPX oslash ydieresis -70
+KPX oslash z -55
+KPX oslash zacute -55
+KPX oslash zcaron -55
+KPX oslash zdotaccent -55
+KPX otilde comma -40
+KPX otilde period -40
+KPX otilde v -15
+KPX otilde w -15
+KPX otilde x -30
+KPX otilde y -30
+KPX otilde yacute -30
+KPX otilde ydieresis -30
+KPX p comma -35
+KPX p period -35
+KPX p y -30
+KPX p yacute -30
+KPX p ydieresis -30
+KPX period quotedblright -100
+KPX period quoteright -100
+KPX period space -60
+KPX quotedblright space -40
+KPX quoteleft quoteleft -57
+KPX quoteright d -50
+KPX quoteright dcroat -50
+KPX quoteright quoteright -57
+KPX quoteright r -50
+KPX quoteright racute -50
+KPX quoteright rcaron -50
+KPX quoteright rcommaaccent -50
+KPX quoteright s -50
+KPX quoteright sacute -50
+KPX quoteright scaron -50
+KPX quoteright scedilla -50
+KPX quoteright scommaaccent -50
+KPX quoteright space -70
+KPX r a -10
+KPX r aacute -10
+KPX r abreve -10
+KPX r acircumflex -10
+KPX r adieresis -10
+KPX r agrave -10
+KPX r amacron -10
+KPX r aogonek -10
+KPX r aring -10
+KPX r atilde -10
+KPX r colon 30
+KPX r comma -50
+KPX r i 15
+KPX r iacute 15
+KPX r icircumflex 15
+KPX r idieresis 15
+KPX r igrave 15
+KPX r imacron 15
+KPX r iogonek 15
+KPX r k 15
+KPX r kcommaaccent 15
+KPX r l 15
+KPX r lacute 15
+KPX r lcommaaccent 15
+KPX r lslash 15
+KPX r m 25
+KPX r n 25
+KPX r nacute 25
+KPX r ncaron 25
+KPX r ncommaaccent 25
+KPX r ntilde 25
+KPX r p 30
+KPX r period -50
+KPX r semicolon 30
+KPX r t 40
+KPX r tcommaaccent 40
+KPX r u 15
+KPX r uacute 15
+KPX r ucircumflex 15
+KPX r udieresis 15
+KPX r ugrave 15
+KPX r uhungarumlaut 15
+KPX r umacron 15
+KPX r uogonek 15
+KPX r uring 15
+KPX r v 30
+KPX r y 30
+KPX r yacute 30
+KPX r ydieresis 30
+KPX racute a -10
+KPX racute aacute -10
+KPX racute abreve -10
+KPX racute acircumflex -10
+KPX racute adieresis -10
+KPX racute agrave -10
+KPX racute amacron -10
+KPX racute aogonek -10
+KPX racute aring -10
+KPX racute atilde -10
+KPX racute colon 30
+KPX racute comma -50
+KPX racute i 15
+KPX racute iacute 15
+KPX racute icircumflex 15
+KPX racute idieresis 15
+KPX racute igrave 15
+KPX racute imacron 15
+KPX racute iogonek 15
+KPX racute k 15
+KPX racute kcommaaccent 15
+KPX racute l 15
+KPX racute lacute 15
+KPX racute lcommaaccent 15
+KPX racute lslash 15
+KPX racute m 25
+KPX racute n 25
+KPX racute nacute 25
+KPX racute ncaron 25
+KPX racute ncommaaccent 25
+KPX racute ntilde 25
+KPX racute p 30
+KPX racute period -50
+KPX racute semicolon 30
+KPX racute t 40
+KPX racute tcommaaccent 40
+KPX racute u 15
+KPX racute uacute 15
+KPX racute ucircumflex 15
+KPX racute udieresis 15
+KPX racute ugrave 15
+KPX racute uhungarumlaut 15
+KPX racute umacron 15
+KPX racute uogonek 15
+KPX racute uring 15
+KPX racute v 30
+KPX racute y 30
+KPX racute yacute 30
+KPX racute ydieresis 30
+KPX rcaron a -10
+KPX rcaron aacute -10
+KPX rcaron abreve -10
+KPX rcaron acircumflex -10
+KPX rcaron adieresis -10
+KPX rcaron agrave -10
+KPX rcaron amacron -10
+KPX rcaron aogonek -10
+KPX rcaron aring -10
+KPX rcaron atilde -10
+KPX rcaron colon 30
+KPX rcaron comma -50
+KPX rcaron i 15
+KPX rcaron iacute 15
+KPX rcaron icircumflex 15
+KPX rcaron idieresis 15
+KPX rcaron igrave 15
+KPX rcaron imacron 15
+KPX rcaron iogonek 15
+KPX rcaron k 15
+KPX rcaron kcommaaccent 15
+KPX rcaron l 15
+KPX rcaron lacute 15
+KPX rcaron lcommaaccent 15
+KPX rcaron lslash 15
+KPX rcaron m 25
+KPX rcaron n 25
+KPX rcaron nacute 25
+KPX rcaron ncaron 25
+KPX rcaron ncommaaccent 25
+KPX rcaron ntilde 25
+KPX rcaron p 30
+KPX rcaron period -50
+KPX rcaron semicolon 30
+KPX rcaron t 40
+KPX rcaron tcommaaccent 40
+KPX rcaron u 15
+KPX rcaron uacute 15
+KPX rcaron ucircumflex 15
+KPX rcaron udieresis 15
+KPX rcaron ugrave 15
+KPX rcaron uhungarumlaut 15
+KPX rcaron umacron 15
+KPX rcaron uogonek 15
+KPX rcaron uring 15
+KPX rcaron v 30
+KPX rcaron y 30
+KPX rcaron yacute 30
+KPX rcaron ydieresis 30
+KPX rcommaaccent a -10
+KPX rcommaaccent aacute -10
+KPX rcommaaccent abreve -10
+KPX rcommaaccent acircumflex -10
+KPX rcommaaccent adieresis -10
+KPX rcommaaccent agrave -10
+KPX rcommaaccent amacron -10
+KPX rcommaaccent aogonek -10
+KPX rcommaaccent aring -10
+KPX rcommaaccent atilde -10
+KPX rcommaaccent colon 30
+KPX rcommaaccent comma -50
+KPX rcommaaccent i 15
+KPX rcommaaccent iacute 15
+KPX rcommaaccent icircumflex 15
+KPX rcommaaccent idieresis 15
+KPX rcommaaccent igrave 15
+KPX rcommaaccent imacron 15
+KPX rcommaaccent iogonek 15
+KPX rcommaaccent k 15
+KPX rcommaaccent kcommaaccent 15
+KPX rcommaaccent l 15
+KPX rcommaaccent lacute 15
+KPX rcommaaccent lcommaaccent 15
+KPX rcommaaccent lslash 15
+KPX rcommaaccent m 25
+KPX rcommaaccent n 25
+KPX rcommaaccent nacute 25
+KPX rcommaaccent ncaron 25
+KPX rcommaaccent ncommaaccent 25
+KPX rcommaaccent ntilde 25
+KPX rcommaaccent p 30
+KPX rcommaaccent period -50
+KPX rcommaaccent semicolon 30
+KPX rcommaaccent t 40
+KPX rcommaaccent tcommaaccent 40
+KPX rcommaaccent u 15
+KPX rcommaaccent uacute 15
+KPX rcommaaccent ucircumflex 15
+KPX rcommaaccent udieresis 15
+KPX rcommaaccent ugrave 15
+KPX rcommaaccent uhungarumlaut 15
+KPX rcommaaccent umacron 15
+KPX rcommaaccent uogonek 15
+KPX rcommaaccent uring 15
+KPX rcommaaccent v 30
+KPX rcommaaccent y 30
+KPX rcommaaccent yacute 30
+KPX rcommaaccent ydieresis 30
+KPX s comma -15
+KPX s period -15
+KPX s w -30
+KPX sacute comma -15
+KPX sacute period -15
+KPX sacute w -30
+KPX scaron comma -15
+KPX scaron period -15
+KPX scaron w -30
+KPX scedilla comma -15
+KPX scedilla period -15
+KPX scedilla w -30
+KPX scommaaccent comma -15
+KPX scommaaccent period -15
+KPX scommaaccent w -30
+KPX semicolon space -50
+KPX space T -50
+KPX space Tcaron -50
+KPX space Tcommaaccent -50
+KPX space V -50
+KPX space W -40
+KPX space Y -90
+KPX space Yacute -90
+KPX space Ydieresis -90
+KPX space quotedblleft -30
+KPX space quoteleft -60
+KPX v a -25
+KPX v aacute -25
+KPX v abreve -25
+KPX v acircumflex -25
+KPX v adieresis -25
+KPX v agrave -25
+KPX v amacron -25
+KPX v aogonek -25
+KPX v aring -25
+KPX v atilde -25
+KPX v comma -80
+KPX v e -25
+KPX v eacute -25
+KPX v ecaron -25
+KPX v ecircumflex -25
+KPX v edieresis -25
+KPX v edotaccent -25
+KPX v egrave -25
+KPX v emacron -25
+KPX v eogonek -25
+KPX v o -25
+KPX v oacute -25
+KPX v ocircumflex -25
+KPX v odieresis -25
+KPX v ograve -25
+KPX v ohungarumlaut -25
+KPX v omacron -25
+KPX v oslash -25
+KPX v otilde -25
+KPX v period -80
+KPX w a -15
+KPX w aacute -15
+KPX w abreve -15
+KPX w acircumflex -15
+KPX w adieresis -15
+KPX w agrave -15
+KPX w amacron -15
+KPX w aogonek -15
+KPX w aring -15
+KPX w atilde -15
+KPX w comma -60
+KPX w e -10
+KPX w eacute -10
+KPX w ecaron -10
+KPX w ecircumflex -10
+KPX w edieresis -10
+KPX w edotaccent -10
+KPX w egrave -10
+KPX w emacron -10
+KPX w eogonek -10
+KPX w o -10
+KPX w oacute -10
+KPX w ocircumflex -10
+KPX w odieresis -10
+KPX w ograve -10
+KPX w ohungarumlaut -10
+KPX w omacron -10
+KPX w oslash -10
+KPX w otilde -10
+KPX w period -60
+KPX x e -30
+KPX x eacute -30
+KPX x ecaron -30
+KPX x ecircumflex -30
+KPX x edieresis -30
+KPX x edotaccent -30
+KPX x egrave -30
+KPX x emacron -30
+KPX x eogonek -30
+KPX y a -20
+KPX y aacute -20
+KPX y abreve -20
+KPX y acircumflex -20
+KPX y adieresis -20
+KPX y agrave -20
+KPX y amacron -20
+KPX y aogonek -20
+KPX y aring -20
+KPX y atilde -20
+KPX y comma -100
+KPX y e -20
+KPX y eacute -20
+KPX y ecaron -20
+KPX y ecircumflex -20
+KPX y edieresis -20
+KPX y edotaccent -20
+KPX y egrave -20
+KPX y emacron -20
+KPX y eogonek -20
+KPX y o -20
+KPX y oacute -20
+KPX y ocircumflex -20
+KPX y odieresis -20
+KPX y ograve -20
+KPX y ohungarumlaut -20
+KPX y omacron -20
+KPX y oslash -20
+KPX y otilde -20
+KPX y period -100
+KPX yacute a -20
+KPX yacute aacute -20
+KPX yacute abreve -20
+KPX yacute acircumflex -20
+KPX yacute adieresis -20
+KPX yacute agrave -20
+KPX yacute amacron -20
+KPX yacute aogonek -20
+KPX yacute aring -20
+KPX yacute atilde -20
+KPX yacute comma -100
+KPX yacute e -20
+KPX yacute eacute -20
+KPX yacute ecaron -20
+KPX yacute ecircumflex -20
+KPX yacute edieresis -20
+KPX yacute edotaccent -20
+KPX yacute egrave -20
+KPX yacute emacron -20
+KPX yacute eogonek -20
+KPX yacute o -20
+KPX yacute oacute -20
+KPX yacute ocircumflex -20
+KPX yacute odieresis -20
+KPX yacute ograve -20
+KPX yacute ohungarumlaut -20
+KPX yacute omacron -20
+KPX yacute oslash -20
+KPX yacute otilde -20
+KPX yacute period -100
+KPX ydieresis a -20
+KPX ydieresis aacute -20
+KPX ydieresis abreve -20
+KPX ydieresis acircumflex -20
+KPX ydieresis adieresis -20
+KPX ydieresis agrave -20
+KPX ydieresis amacron -20
+KPX ydieresis aogonek -20
+KPX ydieresis aring -20
+KPX ydieresis atilde -20
+KPX ydieresis comma -100
+KPX ydieresis e -20
+KPX ydieresis eacute -20
+KPX ydieresis ecaron -20
+KPX ydieresis ecircumflex -20
+KPX ydieresis edieresis -20
+KPX ydieresis edotaccent -20
+KPX ydieresis egrave -20
+KPX ydieresis emacron -20
+KPX ydieresis eogonek -20
+KPX ydieresis o -20
+KPX ydieresis oacute -20
+KPX ydieresis ocircumflex -20
+KPX ydieresis odieresis -20
+KPX ydieresis ograve -20
+KPX ydieresis ohungarumlaut -20
+KPX ydieresis omacron -20
+KPX ydieresis oslash -20
+KPX ydieresis otilde -20
+KPX ydieresis period -100
+KPX z e -15
+KPX z eacute -15
+KPX z ecaron -15
+KPX z ecircumflex -15
+KPX z edieresis -15
+KPX z edotaccent -15
+KPX z egrave -15
+KPX z emacron -15
+KPX z eogonek -15
+KPX z o -15
+KPX z oacute -15
+KPX z ocircumflex -15
+KPX z odieresis -15
+KPX z ograve -15
+KPX z ohungarumlaut -15
+KPX z omacron -15
+KPX z oslash -15
+KPX z otilde -15
+KPX zacute e -15
+KPX zacute eacute -15
+KPX zacute ecaron -15
+KPX zacute ecircumflex -15
+KPX zacute edieresis -15
+KPX zacute edotaccent -15
+KPX zacute egrave -15
+KPX zacute emacron -15
+KPX zacute eogonek -15
+KPX zacute o -15
+KPX zacute oacute -15
+KPX zacute ocircumflex -15
+KPX zacute odieresis -15
+KPX zacute ograve -15
+KPX zacute ohungarumlaut -15
+KPX zacute omacron -15
+KPX zacute oslash -15
+KPX zacute otilde -15
+KPX zcaron e -15
+KPX zcaron eacute -15
+KPX zcaron ecaron -15
+KPX zcaron ecircumflex -15
+KPX zcaron edieresis -15
+KPX zcaron edotaccent -15
+KPX zcaron egrave -15
+KPX zcaron emacron -15
+KPX zcaron eogonek -15
+KPX zcaron o -15
+KPX zcaron oacute -15
+KPX zcaron ocircumflex -15
+KPX zcaron odieresis -15
+KPX zcaron ograve -15
+KPX zcaron ohungarumlaut -15
+KPX zcaron omacron -15
+KPX zcaron oslash -15
+KPX zcaron otilde -15
+KPX zdotaccent e -15
+KPX zdotaccent eacute -15
+KPX zdotaccent ecaron -15
+KPX zdotaccent ecircumflex -15
+KPX zdotaccent edieresis -15
+KPX zdotaccent edotaccent -15
+KPX zdotaccent egrave -15
+KPX zdotaccent emacron -15
+KPX zdotaccent eogonek -15
+KPX zdotaccent o -15
+KPX zdotaccent oacute -15
+KPX zdotaccent ocircumflex -15
+KPX zdotaccent odieresis -15
+KPX zdotaccent ograve -15
+KPX zdotaccent ohungarumlaut -15
+KPX zdotaccent omacron -15
+KPX zdotaccent oslash -15
+KPX zdotaccent otilde -15
+EndKernPairs
+EndKernData
+EndFontMetrics
diff --git a/src/main/resources/com/lowagie/text/pdf/fonts/Helvetica.afm b/src/main/resources/com/lowagie/text/pdf/fonts/Helvetica.afm
new file mode 100644
index 0000000..9492d8f
--- /dev/null
+++ b/src/main/resources/com/lowagie/text/pdf/fonts/Helvetica.afm
@@ -0,0 +1,3051 @@
+StartFontMetrics 4.1
+Comment Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved.
+Comment Creation Date: Thu May 1 12:38:23 1997
+Comment UniqueID 43054
+Comment VMusage 37069 48094
+FontName Helvetica
+FullName Helvetica
+FamilyName Helvetica
+Weight Medium
+ItalicAngle 0
+IsFixedPitch false
+CharacterSet ExtendedRoman
+FontBBox -166 -225 1000 931
+UnderlinePosition -100
+UnderlineThickness 50
+Version 002.000
+Notice Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved.Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries.
+EncodingScheme AdobeStandardEncoding
+CapHeight 718
+XHeight 523
+Ascender 718
+Descender -207
+StdHW 76
+StdVW 88
+StartCharMetrics 315
+C 32 ; WX 278 ; N space ; B 0 0 0 0 ;
+C 33 ; WX 278 ; N exclam ; B 90 0 187 718 ;
+C 34 ; WX 355 ; N quotedbl ; B 70 463 285 718 ;
+C 35 ; WX 556 ; N numbersign ; B 28 0 529 688 ;
+C 36 ; WX 556 ; N dollar ; B 32 -115 520 775 ;
+C 37 ; WX 889 ; N percent ; B 39 -19 850 703 ;
+C 38 ; WX 667 ; N ampersand ; B 44 -15 645 718 ;
+C 39 ; WX 222 ; N quoteright ; B 53 463 157 718 ;
+C 40 ; WX 333 ; N parenleft ; B 68 -207 299 733 ;
+C 41 ; WX 333 ; N parenright ; B 34 -207 265 733 ;
+C 42 ; WX 389 ; N asterisk ; B 39 431 349 718 ;
+C 43 ; WX 584 ; N plus ; B 39 0 545 505 ;
+C 44 ; WX 278 ; N comma ; B 87 -147 191 106 ;
+C 45 ; WX 333 ; N hyphen ; B 44 232 289 322 ;
+C 46 ; WX 278 ; N period ; B 87 0 191 106 ;
+C 47 ; WX 278 ; N slash ; B -17 -19 295 737 ;
+C 48 ; WX 556 ; N zero ; B 37 -19 519 703 ;
+C 49 ; WX 556 ; N one ; B 101 0 359 703 ;
+C 50 ; WX 556 ; N two ; B 26 0 507 703 ;
+C 51 ; WX 556 ; N three ; B 34 -19 522 703 ;
+C 52 ; WX 556 ; N four ; B 25 0 523 703 ;
+C 53 ; WX 556 ; N five ; B 32 -19 514 688 ;
+C 54 ; WX 556 ; N six ; B 38 -19 518 703 ;
+C 55 ; WX 556 ; N seven ; B 37 0 523 688 ;
+C 56 ; WX 556 ; N eight ; B 38 -19 517 703 ;
+C 57 ; WX 556 ; N nine ; B 42 -19 514 703 ;
+C 58 ; WX 278 ; N colon ; B 87 0 191 516 ;
+C 59 ; WX 278 ; N semicolon ; B 87 -147 191 516 ;
+C 60 ; WX 584 ; N less ; B 48 11 536 495 ;
+C 61 ; WX 584 ; N equal ; B 39 115 545 390 ;
+C 62 ; WX 584 ; N greater ; B 48 11 536 495 ;
+C 63 ; WX 556 ; N question ; B 56 0 492 727 ;
+C 64 ; WX 1015 ; N at ; B 147 -19 868 737 ;
+C 65 ; WX 667 ; N A ; B 14 0 654 718 ;
+C 66 ; WX 667 ; N B ; B 74 0 627 718 ;
+C 67 ; WX 722 ; N C ; B 44 -19 681 737 ;
+C 68 ; WX 722 ; N D ; B 81 0 674 718 ;
+C 69 ; WX 667 ; N E ; B 86 0 616 718 ;
+C 70 ; WX 611 ; N F ; B 86 0 583 718 ;
+C 71 ; WX 778 ; N G ; B 48 -19 704 737 ;
+C 72 ; WX 722 ; N H ; B 77 0 646 718 ;
+C 73 ; WX 278 ; N I ; B 91 0 188 718 ;
+C 74 ; WX 500 ; N J ; B 17 -19 428 718 ;
+C 75 ; WX 667 ; N K ; B 76 0 663 718 ;
+C 76 ; WX 556 ; N L ; B 76 0 537 718 ;
+C 77 ; WX 833 ; N M ; B 73 0 761 718 ;
+C 78 ; WX 722 ; N N ; B 76 0 646 718 ;
+C 79 ; WX 778 ; N O ; B 39 -19 739 737 ;
+C 80 ; WX 667 ; N P ; B 86 0 622 718 ;
+C 81 ; WX 778 ; N Q ; B 39 -56 739 737 ;
+C 82 ; WX 722 ; N R ; B 88 0 684 718 ;
+C 83 ; WX 667 ; N S ; B 49 -19 620 737 ;
+C 84 ; WX 611 ; N T ; B 14 0 597 718 ;
+C 85 ; WX 722 ; N U ; B 79 -19 644 718 ;
+C 86 ; WX 667 ; N V ; B 20 0 647 718 ;
+C 87 ; WX 944 ; N W ; B 16 0 928 718 ;
+C 88 ; WX 667 ; N X ; B 19 0 648 718 ;
+C 89 ; WX 667 ; N Y ; B 14 0 653 718 ;
+C 90 ; WX 611 ; N Z ; B 23 0 588 718 ;
+C 91 ; WX 278 ; N bracketleft ; B 63 -196 250 722 ;
+C 92 ; WX 278 ; N backslash ; B -17 -19 295 737 ;
+C 93 ; WX 278 ; N bracketright ; B 28 -196 215 722 ;
+C 94 ; WX 469 ; N asciicircum ; B -14 264 483 688 ;
+C 95 ; WX 556 ; N underscore ; B 0 -125 556 -75 ;
+C 96 ; WX 222 ; N quoteleft ; B 65 470 169 725 ;
+C 97 ; WX 556 ; N a ; B 36 -15 530 538 ;
+C 98 ; WX 556 ; N b ; B 58 -15 517 718 ;
+C 99 ; WX 500 ; N c ; B 30 -15 477 538 ;
+C 100 ; WX 556 ; N d ; B 35 -15 499 718 ;
+C 101 ; WX 556 ; N e ; B 40 -15 516 538 ;
+C 102 ; WX 278 ; N f ; B 14 0 262 728 ; L i fi ; L l fl ;
+C 103 ; WX 556 ; N g ; B 40 -220 499 538 ;
+C 104 ; WX 556 ; N h ; B 65 0 491 718 ;
+C 105 ; WX 222 ; N i ; B 67 0 155 718 ;
+C 106 ; WX 222 ; N j ; B -16 -210 155 718 ;
+C 107 ; WX 500 ; N k ; B 67 0 501 718 ;
+C 108 ; WX 222 ; N l ; B 67 0 155 718 ;
+C 109 ; WX 833 ; N m ; B 65 0 769 538 ;
+C 110 ; WX 556 ; N n ; B 65 0 491 538 ;
+C 111 ; WX 556 ; N o ; B 35 -14 521 538 ;
+C 112 ; WX 556 ; N p ; B 58 -207 517 538 ;
+C 113 ; WX 556 ; N q ; B 35 -207 494 538 ;
+C 114 ; WX 333 ; N r ; B 77 0 332 538 ;
+C 115 ; WX 500 ; N s ; B 32 -15 464 538 ;
+C 116 ; WX 278 ; N t ; B 14 -7 257 669 ;
+C 117 ; WX 556 ; N u ; B 68 -15 489 523 ;
+C 118 ; WX 500 ; N v ; B 8 0 492 523 ;
+C 119 ; WX 722 ; N w ; B 14 0 709 523 ;
+C 120 ; WX 500 ; N x ; B 11 0 490 523 ;
+C 121 ; WX 500 ; N y ; B 11 -214 489 523 ;
+C 122 ; WX 500 ; N z ; B 31 0 469 523 ;
+C 123 ; WX 334 ; N braceleft ; B 42 -196 292 722 ;
+C 124 ; WX 260 ; N bar ; B 94 -225 167 775 ;
+C 125 ; WX 334 ; N braceright ; B 42 -196 292 722 ;
+C 126 ; WX 584 ; N asciitilde ; B 61 180 523 326 ;
+C 161 ; WX 333 ; N exclamdown ; B 118 -195 215 523 ;
+C 162 ; WX 556 ; N cent ; B 51 -115 513 623 ;
+C 163 ; WX 556 ; N sterling ; B 33 -16 539 718 ;
+C 164 ; WX 167 ; N fraction ; B -166 -19 333 703 ;
+C 165 ; WX 556 ; N yen ; B 3 0 553 688 ;
+C 166 ; WX 556 ; N florin ; B -11 -207 501 737 ;
+C 167 ; WX 556 ; N section ; B 43 -191 512 737 ;
+C 168 ; WX 556 ; N currency ; B 28 99 528 603 ;
+C 169 ; WX 191 ; N quotesingle ; B 59 463 132 718 ;
+C 170 ; WX 333 ; N quotedblleft ; B 38 470 307 725 ;
+C 171 ; WX 556 ; N guillemotleft ; B 97 108 459 446 ;
+C 172 ; WX 333 ; N guilsinglleft ; B 88 108 245 446 ;
+C 173 ; WX 333 ; N guilsinglright ; B 88 108 245 446 ;
+C 174 ; WX 500 ; N fi ; B 14 0 434 728 ;
+C 175 ; WX 500 ; N fl ; B 14 0 432 728 ;
+C 177 ; WX 556 ; N endash ; B 0 240 556 313 ;
+C 178 ; WX 556 ; N dagger ; B 43 -159 514 718 ;
+C 179 ; WX 556 ; N daggerdbl ; B 43 -159 514 718 ;
+C 180 ; WX 278 ; N periodcentered ; B 77 190 202 315 ;
+C 182 ; WX 537 ; N paragraph ; B 18 -173 497 718 ;
+C 183 ; WX 350 ; N bullet ; B 18 202 333 517 ;
+C 184 ; WX 222 ; N quotesinglbase ; B 53 -149 157 106 ;
+C 185 ; WX 333 ; N quotedblbase ; B 26 -149 295 106 ;
+C 186 ; WX 333 ; N quotedblright ; B 26 463 295 718 ;
+C 187 ; WX 556 ; N guillemotright ; B 97 108 459 446 ;
+C 188 ; WX 1000 ; N ellipsis ; B 115 0 885 106 ;
+C 189 ; WX 1000 ; N perthousand ; B 7 -19 994 703 ;
+C 191 ; WX 611 ; N questiondown ; B 91 -201 527 525 ;
+C 193 ; WX 333 ; N grave ; B 14 593 211 734 ;
+C 194 ; WX 333 ; N acute ; B 122 593 319 734 ;
+C 195 ; WX 333 ; N circumflex ; B 21 593 312 734 ;
+C 196 ; WX 333 ; N tilde ; B -4 606 337 722 ;
+C 197 ; WX 333 ; N macron ; B 10 627 323 684 ;
+C 198 ; WX 333 ; N breve ; B 13 595 321 731 ;
+C 199 ; WX 333 ; N dotaccent ; B 121 604 212 706 ;
+C 200 ; WX 333 ; N dieresis ; B 40 604 293 706 ;
+C 202 ; WX 333 ; N ring ; B 75 572 259 756 ;
+C 203 ; WX 333 ; N cedilla ; B 45 -225 259 0 ;
+C 205 ; WX 333 ; N hungarumlaut ; B 31 593 409 734 ;
+C 206 ; WX 333 ; N ogonek ; B 73 -225 287 0 ;
+C 207 ; WX 333 ; N caron ; B 21 593 312 734 ;
+C 208 ; WX 1000 ; N emdash ; B 0 240 1000 313 ;
+C 225 ; WX 1000 ; N AE ; B 8 0 951 718 ;
+C 227 ; WX 370 ; N ordfeminine ; B 24 405 346 737 ;
+C 232 ; WX 556 ; N Lslash ; B -20 0 537 718 ;
+C 233 ; WX 778 ; N Oslash ; B 39 -19 740 737 ;
+C 234 ; WX 1000 ; N OE ; B 36 -19 965 737 ;
+C 235 ; WX 365 ; N ordmasculine ; B 25 405 341 737 ;
+C 241 ; WX 889 ; N ae ; B 36 -15 847 538 ;
+C 245 ; WX 278 ; N dotlessi ; B 95 0 183 523 ;
+C 248 ; WX 222 ; N lslash ; B -20 0 242 718 ;
+C 249 ; WX 611 ; N oslash ; B 28 -22 537 545 ;
+C 250 ; WX 944 ; N oe ; B 35 -15 902 538 ;
+C 251 ; WX 611 ; N germandbls ; B 67 -15 571 728 ;
+C -1 ; WX 278 ; N Idieresis ; B 13 0 266 901 ;
+C -1 ; WX 556 ; N eacute ; B 40 -15 516 734 ;
+C -1 ; WX 556 ; N abreve ; B 36 -15 530 731 ;
+C -1 ; WX 556 ; N uhungarumlaut ; B 68 -15 521 734 ;
+C -1 ; WX 556 ; N ecaron ; B 40 -15 516 734 ;
+C -1 ; WX 667 ; N Ydieresis ; B 14 0 653 901 ;
+C -1 ; WX 584 ; N divide ; B 39 -19 545 524 ;
+C -1 ; WX 667 ; N Yacute ; B 14 0 653 929 ;
+C -1 ; WX 667 ; N Acircumflex ; B 14 0 654 929 ;
+C -1 ; WX 556 ; N aacute ; B 36 -15 530 734 ;
+C -1 ; WX 722 ; N Ucircumflex ; B 79 -19 644 929 ;
+C -1 ; WX 500 ; N yacute ; B 11 -214 489 734 ;
+C -1 ; WX 500 ; N scommaaccent ; B 32 -225 464 538 ;
+C -1 ; WX 556 ; N ecircumflex ; B 40 -15 516 734 ;
+C -1 ; WX 722 ; N Uring ; B 79 -19 644 931 ;
+C -1 ; WX 722 ; N Udieresis ; B 79 -19 644 901 ;
+C -1 ; WX 556 ; N aogonek ; B 36 -220 547 538 ;
+C -1 ; WX 722 ; N Uacute ; B 79 -19 644 929 ;
+C -1 ; WX 556 ; N uogonek ; B 68 -225 519 523 ;
+C -1 ; WX 667 ; N Edieresis ; B 86 0 616 901 ;
+C -1 ; WX 722 ; N Dcroat ; B 0 0 674 718 ;
+C -1 ; WX 250 ; N commaaccent ; B 87 -225 181 -40 ;
+C -1 ; WX 737 ; N copyright ; B -14 -19 752 737 ;
+C -1 ; WX 667 ; N Emacron ; B 86 0 616 879 ;
+C -1 ; WX 500 ; N ccaron ; B 30 -15 477 734 ;
+C -1 ; WX 556 ; N aring ; B 36 -15 530 756 ;
+C -1 ; WX 722 ; N Ncommaaccent ; B 76 -225 646 718 ;
+C -1 ; WX 222 ; N lacute ; B 67 0 264 929 ;
+C -1 ; WX 556 ; N agrave ; B 36 -15 530 734 ;
+C -1 ; WX 611 ; N Tcommaaccent ; B 14 -225 597 718 ;
+C -1 ; WX 722 ; N Cacute ; B 44 -19 681 929 ;
+C -1 ; WX 556 ; N atilde ; B 36 -15 530 722 ;
+C -1 ; WX 667 ; N Edotaccent ; B 86 0 616 901 ;
+C -1 ; WX 500 ; N scaron ; B 32 -15 464 734 ;
+C -1 ; WX 500 ; N scedilla ; B 32 -225 464 538 ;
+C -1 ; WX 278 ; N iacute ; B 95 0 292 734 ;
+C -1 ; WX 471 ; N lozenge ; B 10 0 462 728 ;
+C -1 ; WX 722 ; N Rcaron ; B 88 0 684 929 ;
+C -1 ; WX 778 ; N Gcommaaccent ; B 48 -225 704 737 ;
+C -1 ; WX 556 ; N ucircumflex ; B 68 -15 489 734 ;
+C -1 ; WX 556 ; N acircumflex ; B 36 -15 530 734 ;
+C -1 ; WX 667 ; N Amacron ; B 14 0 654 879 ;
+C -1 ; WX 333 ; N rcaron ; B 61 0 352 734 ;
+C -1 ; WX 500 ; N ccedilla ; B 30 -225 477 538 ;
+C -1 ; WX 611 ; N Zdotaccent ; B 23 0 588 901 ;
+C -1 ; WX 667 ; N Thorn ; B 86 0 622 718 ;
+C -1 ; WX 778 ; N Omacron ; B 39 -19 739 879 ;
+C -1 ; WX 722 ; N Racute ; B 88 0 684 929 ;
+C -1 ; WX 667 ; N Sacute ; B 49 -19 620 929 ;
+C -1 ; WX 643 ; N dcaron ; B 35 -15 655 718 ;
+C -1 ; WX 722 ; N Umacron ; B 79 -19 644 879 ;
+C -1 ; WX 556 ; N uring ; B 68 -15 489 756 ;
+C -1 ; WX 333 ; N threesuperior ; B 5 270 325 703 ;
+C -1 ; WX 778 ; N Ograve ; B 39 -19 739 929 ;
+C -1 ; WX 667 ; N Agrave ; B 14 0 654 929 ;
+C -1 ; WX 667 ; N Abreve ; B 14 0 654 926 ;
+C -1 ; WX 584 ; N multiply ; B 39 0 545 506 ;
+C -1 ; WX 556 ; N uacute ; B 68 -15 489 734 ;
+C -1 ; WX 611 ; N Tcaron ; B 14 0 597 929 ;
+C -1 ; WX 476 ; N partialdiff ; B 13 -38 463 714 ;
+C -1 ; WX 500 ; N ydieresis ; B 11 -214 489 706 ;
+C -1 ; WX 722 ; N Nacute ; B 76 0 646 929 ;
+C -1 ; WX 278 ; N icircumflex ; B -6 0 285 734 ;
+C -1 ; WX 667 ; N Ecircumflex ; B 86 0 616 929 ;
+C -1 ; WX 556 ; N adieresis ; B 36 -15 530 706 ;
+C -1 ; WX 556 ; N edieresis ; B 40 -15 516 706 ;
+C -1 ; WX 500 ; N cacute ; B 30 -15 477 734 ;
+C -1 ; WX 556 ; N nacute ; B 65 0 491 734 ;
+C -1 ; WX 556 ; N umacron ; B 68 -15 489 684 ;
+C -1 ; WX 722 ; N Ncaron ; B 76 0 646 929 ;
+C -1 ; WX 278 ; N Iacute ; B 91 0 292 929 ;
+C -1 ; WX 584 ; N plusminus ; B 39 0 545 506 ;
+C -1 ; WX 260 ; N brokenbar ; B 94 -150 167 700 ;
+C -1 ; WX 737 ; N registered ; B -14 -19 752 737 ;
+C -1 ; WX 778 ; N Gbreve ; B 48 -19 704 926 ;
+C -1 ; WX 278 ; N Idotaccent ; B 91 0 188 901 ;
+C -1 ; WX 600 ; N summation ; B 15 -10 586 706 ;
+C -1 ; WX 667 ; N Egrave ; B 86 0 616 929 ;
+C -1 ; WX 333 ; N racute ; B 77 0 332 734 ;
+C -1 ; WX 556 ; N omacron ; B 35 -14 521 684 ;
+C -1 ; WX 611 ; N Zacute ; B 23 0 588 929 ;
+C -1 ; WX 611 ; N Zcaron ; B 23 0 588 929 ;
+C -1 ; WX 549 ; N greaterequal ; B 26 0 523 674 ;
+C -1 ; WX 722 ; N Eth ; B 0 0 674 718 ;
+C -1 ; WX 722 ; N Ccedilla ; B 44 -225 681 737 ;
+C -1 ; WX 222 ; N lcommaaccent ; B 67 -225 167 718 ;
+C -1 ; WX 317 ; N tcaron ; B 14 -7 329 808 ;
+C -1 ; WX 556 ; N eogonek ; B 40 -225 516 538 ;
+C -1 ; WX 722 ; N Uogonek ; B 79 -225 644 718 ;
+C -1 ; WX 667 ; N Aacute ; B 14 0 654 929 ;
+C -1 ; WX 667 ; N Adieresis ; B 14 0 654 901 ;
+C -1 ; WX 556 ; N egrave ; B 40 -15 516 734 ;
+C -1 ; WX 500 ; N zacute ; B 31 0 469 734 ;
+C -1 ; WX 222 ; N iogonek ; B -31 -225 183 718 ;
+C -1 ; WX 778 ; N Oacute ; B 39 -19 739 929 ;
+C -1 ; WX 556 ; N oacute ; B 35 -14 521 734 ;
+C -1 ; WX 556 ; N amacron ; B 36 -15 530 684 ;
+C -1 ; WX 500 ; N sacute ; B 32 -15 464 734 ;
+C -1 ; WX 278 ; N idieresis ; B 13 0 266 706 ;
+C -1 ; WX 778 ; N Ocircumflex ; B 39 -19 739 929 ;
+C -1 ; WX 722 ; N Ugrave ; B 79 -19 644 929 ;
+C -1 ; WX 612 ; N Delta ; B 6 0 608 688 ;
+C -1 ; WX 556 ; N thorn ; B 58 -207 517 718 ;
+C -1 ; WX 333 ; N twosuperior ; B 4 281 323 703 ;
+C -1 ; WX 778 ; N Odieresis ; B 39 -19 739 901 ;
+C -1 ; WX 556 ; N mu ; B 68 -207 489 523 ;
+C -1 ; WX 278 ; N igrave ; B -13 0 184 734 ;
+C -1 ; WX 556 ; N ohungarumlaut ; B 35 -14 521 734 ;
+C -1 ; WX 667 ; N Eogonek ; B 86 -220 633 718 ;
+C -1 ; WX 556 ; N dcroat ; B 35 -15 550 718 ;
+C -1 ; WX 834 ; N threequarters ; B 45 -19 810 703 ;
+C -1 ; WX 667 ; N Scedilla ; B 49 -225 620 737 ;
+C -1 ; WX 299 ; N lcaron ; B 67 0 311 718 ;
+C -1 ; WX 667 ; N Kcommaaccent ; B 76 -225 663 718 ;
+C -1 ; WX 556 ; N Lacute ; B 76 0 537 929 ;
+C -1 ; WX 1000 ; N trademark ; B 46 306 903 718 ;
+C -1 ; WX 556 ; N edotaccent ; B 40 -15 516 706 ;
+C -1 ; WX 278 ; N Igrave ; B -13 0 188 929 ;
+C -1 ; WX 278 ; N Imacron ; B -17 0 296 879 ;
+C -1 ; WX 556 ; N Lcaron ; B 76 0 537 718 ;
+C -1 ; WX 834 ; N onehalf ; B 43 -19 773 703 ;
+C -1 ; WX 549 ; N lessequal ; B 26 0 523 674 ;
+C -1 ; WX 556 ; N ocircumflex ; B 35 -14 521 734 ;
+C -1 ; WX 556 ; N ntilde ; B 65 0 491 722 ;
+C -1 ; WX 722 ; N Uhungarumlaut ; B 79 -19 644 929 ;
+C -1 ; WX 667 ; N Eacute ; B 86 0 616 929 ;
+C -1 ; WX 556 ; N emacron ; B 40 -15 516 684 ;
+C -1 ; WX 556 ; N gbreve ; B 40 -220 499 731 ;
+C -1 ; WX 834 ; N onequarter ; B 73 -19 756 703 ;
+C -1 ; WX 667 ; N Scaron ; B 49 -19 620 929 ;
+C -1 ; WX 667 ; N Scommaaccent ; B 49 -225 620 737 ;
+C -1 ; WX 778 ; N Ohungarumlaut ; B 39 -19 739 929 ;
+C -1 ; WX 400 ; N degree ; B 54 411 346 703 ;
+C -1 ; WX 556 ; N ograve ; B 35 -14 521 734 ;
+C -1 ; WX 722 ; N Ccaron ; B 44 -19 681 929 ;
+C -1 ; WX 556 ; N ugrave ; B 68 -15 489 734 ;
+C -1 ; WX 453 ; N radical ; B -4 -80 458 762 ;
+C -1 ; WX 722 ; N Dcaron ; B 81 0 674 929 ;
+C -1 ; WX 333 ; N rcommaaccent ; B 77 -225 332 538 ;
+C -1 ; WX 722 ; N Ntilde ; B 76 0 646 917 ;
+C -1 ; WX 556 ; N otilde ; B 35 -14 521 722 ;
+C -1 ; WX 722 ; N Rcommaaccent ; B 88 -225 684 718 ;
+C -1 ; WX 556 ; N Lcommaaccent ; B 76 -225 537 718 ;
+C -1 ; WX 667 ; N Atilde ; B 14 0 654 917 ;
+C -1 ; WX 667 ; N Aogonek ; B 14 -225 654 718 ;
+C -1 ; WX 667 ; N Aring ; B 14 0 654 931 ;
+C -1 ; WX 778 ; N Otilde ; B 39 -19 739 917 ;
+C -1 ; WX 500 ; N zdotaccent ; B 31 0 469 706 ;
+C -1 ; WX 667 ; N Ecaron ; B 86 0 616 929 ;
+C -1 ; WX 278 ; N Iogonek ; B -3 -225 211 718 ;
+C -1 ; WX 500 ; N kcommaaccent ; B 67 -225 501 718 ;
+C -1 ; WX 584 ; N minus ; B 39 216 545 289 ;
+C -1 ; WX 278 ; N Icircumflex ; B -6 0 285 929 ;
+C -1 ; WX 556 ; N ncaron ; B 65 0 491 734 ;
+C -1 ; WX 278 ; N tcommaaccent ; B 14 -225 257 669 ;
+C -1 ; WX 584 ; N logicalnot ; B 39 108 545 390 ;
+C -1 ; WX 556 ; N odieresis ; B 35 -14 521 706 ;
+C -1 ; WX 556 ; N udieresis ; B 68 -15 489 706 ;
+C -1 ; WX 549 ; N notequal ; B 12 -35 537 551 ;
+C -1 ; WX 556 ; N gcommaaccent ; B 40 -220 499 822 ;
+C -1 ; WX 556 ; N eth ; B 35 -15 522 737 ;
+C -1 ; WX 500 ; N zcaron ; B 31 0 469 734 ;
+C -1 ; WX 556 ; N ncommaaccent ; B 65 -225 491 538 ;
+C -1 ; WX 333 ; N onesuperior ; B 43 281 222 703 ;
+C -1 ; WX 278 ; N imacron ; B 5 0 272 684 ;
+C -1 ; WX 556 ; N Euro ; B 0 0 0 0 ;
+EndCharMetrics
+StartKernData
+StartKernPairs 2705
+KPX A C -30
+KPX A Cacute -30
+KPX A Ccaron -30
+KPX A Ccedilla -30
+KPX A G -30
+KPX A Gbreve -30
+KPX A Gcommaaccent -30
+KPX A O -30
+KPX A Oacute -30
+KPX A Ocircumflex -30
+KPX A Odieresis -30
+KPX A Ograve -30
+KPX A Ohungarumlaut -30
+KPX A Omacron -30
+KPX A Oslash -30
+KPX A Otilde -30
+KPX A Q -30
+KPX A T -120
+KPX A Tcaron -120
+KPX A Tcommaaccent -120
+KPX A U -50
+KPX A Uacute -50
+KPX A Ucircumflex -50
+KPX A Udieresis -50
+KPX A Ugrave -50
+KPX A Uhungarumlaut -50
+KPX A Umacron -50
+KPX A Uogonek -50
+KPX A Uring -50
+KPX A V -70
+KPX A W -50
+KPX A Y -100
+KPX A Yacute -100
+KPX A Ydieresis -100
+KPX A u -30
+KPX A uacute -30
+KPX A ucircumflex -30
+KPX A udieresis -30
+KPX A ugrave -30
+KPX A uhungarumlaut -30
+KPX A umacron -30
+KPX A uogonek -30
+KPX A uring -30
+KPX A v -40
+KPX A w -40
+KPX A y -40
+KPX A yacute -40
+KPX A ydieresis -40
+KPX Aacute C -30
+KPX Aacute Cacute -30
+KPX Aacute Ccaron -30
+KPX Aacute Ccedilla -30
+KPX Aacute G -30
+KPX Aacute Gbreve -30
+KPX Aacute Gcommaaccent -30
+KPX Aacute O -30
+KPX Aacute Oacute -30
+KPX Aacute Ocircumflex -30
+KPX Aacute Odieresis -30
+KPX Aacute Ograve -30
+KPX Aacute Ohungarumlaut -30
+KPX Aacute Omacron -30
+KPX Aacute Oslash -30
+KPX Aacute Otilde -30
+KPX Aacute Q -30
+KPX Aacute T -120
+KPX Aacute Tcaron -120
+KPX Aacute Tcommaaccent -120
+KPX Aacute U -50
+KPX Aacute Uacute -50
+KPX Aacute Ucircumflex -50
+KPX Aacute Udieresis -50
+KPX Aacute Ugrave -50
+KPX Aacute Uhungarumlaut -50
+KPX Aacute Umacron -50
+KPX Aacute Uogonek -50
+KPX Aacute Uring -50
+KPX Aacute V -70
+KPX Aacute W -50
+KPX Aacute Y -100
+KPX Aacute Yacute -100
+KPX Aacute Ydieresis -100
+KPX Aacute u -30
+KPX Aacute uacute -30
+KPX Aacute ucircumflex -30
+KPX Aacute udieresis -30
+KPX Aacute ugrave -30
+KPX Aacute uhungarumlaut -30
+KPX Aacute umacron -30
+KPX Aacute uogonek -30
+KPX Aacute uring -30
+KPX Aacute v -40
+KPX Aacute w -40
+KPX Aacute y -40
+KPX Aacute yacute -40
+KPX Aacute ydieresis -40
+KPX Abreve C -30
+KPX Abreve Cacute -30
+KPX Abreve Ccaron -30
+KPX Abreve Ccedilla -30
+KPX Abreve G -30
+KPX Abreve Gbreve -30
+KPX Abreve Gcommaaccent -30
+KPX Abreve O -30
+KPX Abreve Oacute -30
+KPX Abreve Ocircumflex -30
+KPX Abreve Odieresis -30
+KPX Abreve Ograve -30
+KPX Abreve Ohungarumlaut -30
+KPX Abreve Omacron -30
+KPX Abreve Oslash -30
+KPX Abreve Otilde -30
+KPX Abreve Q -30
+KPX Abreve T -120
+KPX Abreve Tcaron -120
+KPX Abreve Tcommaaccent -120
+KPX Abreve U -50
+KPX Abreve Uacute -50
+KPX Abreve Ucircumflex -50
+KPX Abreve Udieresis -50
+KPX Abreve Ugrave -50
+KPX Abreve Uhungarumlaut -50
+KPX Abreve Umacron -50
+KPX Abreve Uogonek -50
+KPX Abreve Uring -50
+KPX Abreve V -70
+KPX Abreve W -50
+KPX Abreve Y -100
+KPX Abreve Yacute -100
+KPX Abreve Ydieresis -100
+KPX Abreve u -30
+KPX Abreve uacute -30
+KPX Abreve ucircumflex -30
+KPX Abreve udieresis -30
+KPX Abreve ugrave -30
+KPX Abreve uhungarumlaut -30
+KPX Abreve umacron -30
+KPX Abreve uogonek -30
+KPX Abreve uring -30
+KPX Abreve v -40
+KPX Abreve w -40
+KPX Abreve y -40
+KPX Abreve yacute -40
+KPX Abreve ydieresis -40
+KPX Acircumflex C -30
+KPX Acircumflex Cacute -30
+KPX Acircumflex Ccaron -30
+KPX Acircumflex Ccedilla -30
+KPX Acircumflex G -30
+KPX Acircumflex Gbreve -30
+KPX Acircumflex Gcommaaccent -30
+KPX Acircumflex O -30
+KPX Acircumflex Oacute -30
+KPX Acircumflex Ocircumflex -30
+KPX Acircumflex Odieresis -30
+KPX Acircumflex Ograve -30
+KPX Acircumflex Ohungarumlaut -30
+KPX Acircumflex Omacron -30
+KPX Acircumflex Oslash -30
+KPX Acircumflex Otilde -30
+KPX Acircumflex Q -30
+KPX Acircumflex T -120
+KPX Acircumflex Tcaron -120
+KPX Acircumflex Tcommaaccent -120
+KPX Acircumflex U -50
+KPX Acircumflex Uacute -50
+KPX Acircumflex Ucircumflex -50
+KPX Acircumflex Udieresis -50
+KPX Acircumflex Ugrave -50
+KPX Acircumflex Uhungarumlaut -50
+KPX Acircumflex Umacron -50
+KPX Acircumflex Uogonek -50
+KPX Acircumflex Uring -50
+KPX Acircumflex V -70
+KPX Acircumflex W -50
+KPX Acircumflex Y -100
+KPX Acircumflex Yacute -100
+KPX Acircumflex Ydieresis -100
+KPX Acircumflex u -30
+KPX Acircumflex uacute -30
+KPX Acircumflex ucircumflex -30
+KPX Acircumflex udieresis -30
+KPX Acircumflex ugrave -30
+KPX Acircumflex uhungarumlaut -30
+KPX Acircumflex umacron -30
+KPX Acircumflex uogonek -30
+KPX Acircumflex uring -30
+KPX Acircumflex v -40
+KPX Acircumflex w -40
+KPX Acircumflex y -40
+KPX Acircumflex yacute -40
+KPX Acircumflex ydieresis -40
+KPX Adieresis C -30
+KPX Adieresis Cacute -30
+KPX Adieresis Ccaron -30
+KPX Adieresis Ccedilla -30
+KPX Adieresis G -30
+KPX Adieresis Gbreve -30
+KPX Adieresis Gcommaaccent -30
+KPX Adieresis O -30
+KPX Adieresis Oacute -30
+KPX Adieresis Ocircumflex -30
+KPX Adieresis Odieresis -30
+KPX Adieresis Ograve -30
+KPX Adieresis Ohungarumlaut -30
+KPX Adieresis Omacron -30
+KPX Adieresis Oslash -30
+KPX Adieresis Otilde -30
+KPX Adieresis Q -30
+KPX Adieresis T -120
+KPX Adieresis Tcaron -120
+KPX Adieresis Tcommaaccent -120
+KPX Adieresis U -50
+KPX Adieresis Uacute -50
+KPX Adieresis Ucircumflex -50
+KPX Adieresis Udieresis -50
+KPX Adieresis Ugrave -50
+KPX Adieresis Uhungarumlaut -50
+KPX Adieresis Umacron -50
+KPX Adieresis Uogonek -50
+KPX Adieresis Uring -50
+KPX Adieresis V -70
+KPX Adieresis W -50
+KPX Adieresis Y -100
+KPX Adieresis Yacute -100
+KPX Adieresis Ydieresis -100
+KPX Adieresis u -30
+KPX Adieresis uacute -30
+KPX Adieresis ucircumflex -30
+KPX Adieresis udieresis -30
+KPX Adieresis ugrave -30
+KPX Adieresis uhungarumlaut -30
+KPX Adieresis umacron -30
+KPX Adieresis uogonek -30
+KPX Adieresis uring -30
+KPX Adieresis v -40
+KPX Adieresis w -40
+KPX Adieresis y -40
+KPX Adieresis yacute -40
+KPX Adieresis ydieresis -40
+KPX Agrave C -30
+KPX Agrave Cacute -30
+KPX Agrave Ccaron -30
+KPX Agrave Ccedilla -30
+KPX Agrave G -30
+KPX Agrave Gbreve -30
+KPX Agrave Gcommaaccent -30
+KPX Agrave O -30
+KPX Agrave Oacute -30
+KPX Agrave Ocircumflex -30
+KPX Agrave Odieresis -30
+KPX Agrave Ograve -30
+KPX Agrave Ohungarumlaut -30
+KPX Agrave Omacron -30
+KPX Agrave Oslash -30
+KPX Agrave Otilde -30
+KPX Agrave Q -30
+KPX Agrave T -120
+KPX Agrave Tcaron -120
+KPX Agrave Tcommaaccent -120
+KPX Agrave U -50
+KPX Agrave Uacute -50
+KPX Agrave Ucircumflex -50
+KPX Agrave Udieresis -50
+KPX Agrave Ugrave -50
+KPX Agrave Uhungarumlaut -50
+KPX Agrave Umacron -50
+KPX Agrave Uogonek -50
+KPX Agrave Uring -50
+KPX Agrave V -70
+KPX Agrave W -50
+KPX Agrave Y -100
+KPX Agrave Yacute -100
+KPX Agrave Ydieresis -100
+KPX Agrave u -30
+KPX Agrave uacute -30
+KPX Agrave ucircumflex -30
+KPX Agrave udieresis -30
+KPX Agrave ugrave -30
+KPX Agrave uhungarumlaut -30
+KPX Agrave umacron -30
+KPX Agrave uogonek -30
+KPX Agrave uring -30
+KPX Agrave v -40
+KPX Agrave w -40
+KPX Agrave y -40
+KPX Agrave yacute -40
+KPX Agrave ydieresis -40
+KPX Amacron C -30
+KPX Amacron Cacute -30
+KPX Amacron Ccaron -30
+KPX Amacron Ccedilla -30
+KPX Amacron G -30
+KPX Amacron Gbreve -30
+KPX Amacron Gcommaaccent -30
+KPX Amacron O -30
+KPX Amacron Oacute -30
+KPX Amacron Ocircumflex -30
+KPX Amacron Odieresis -30
+KPX Amacron Ograve -30
+KPX Amacron Ohungarumlaut -30
+KPX Amacron Omacron -30
+KPX Amacron Oslash -30
+KPX Amacron Otilde -30
+KPX Amacron Q -30
+KPX Amacron T -120
+KPX Amacron Tcaron -120
+KPX Amacron Tcommaaccent -120
+KPX Amacron U -50
+KPX Amacron Uacute -50
+KPX Amacron Ucircumflex -50
+KPX Amacron Udieresis -50
+KPX Amacron Ugrave -50
+KPX Amacron Uhungarumlaut -50
+KPX Amacron Umacron -50
+KPX Amacron Uogonek -50
+KPX Amacron Uring -50
+KPX Amacron V -70
+KPX Amacron W -50
+KPX Amacron Y -100
+KPX Amacron Yacute -100
+KPX Amacron Ydieresis -100
+KPX Amacron u -30
+KPX Amacron uacute -30
+KPX Amacron ucircumflex -30
+KPX Amacron udieresis -30
+KPX Amacron ugrave -30
+KPX Amacron uhungarumlaut -30
+KPX Amacron umacron -30
+KPX Amacron uogonek -30
+KPX Amacron uring -30
+KPX Amacron v -40
+KPX Amacron w -40
+KPX Amacron y -40
+KPX Amacron yacute -40
+KPX Amacron ydieresis -40
+KPX Aogonek C -30
+KPX Aogonek Cacute -30
+KPX Aogonek Ccaron -30
+KPX Aogonek Ccedilla -30
+KPX Aogonek G -30
+KPX Aogonek Gbreve -30
+KPX Aogonek Gcommaaccent -30
+KPX Aogonek O -30
+KPX Aogonek Oacute -30
+KPX Aogonek Ocircumflex -30
+KPX Aogonek Odieresis -30
+KPX Aogonek Ograve -30
+KPX Aogonek Ohungarumlaut -30
+KPX Aogonek Omacron -30
+KPX Aogonek Oslash -30
+KPX Aogonek Otilde -30
+KPX Aogonek Q -30
+KPX Aogonek T -120
+KPX Aogonek Tcaron -120
+KPX Aogonek Tcommaaccent -120
+KPX Aogonek U -50
+KPX Aogonek Uacute -50
+KPX Aogonek Ucircumflex -50
+KPX Aogonek Udieresis -50
+KPX Aogonek Ugrave -50
+KPX Aogonek Uhungarumlaut -50
+KPX Aogonek Umacron -50
+KPX Aogonek Uogonek -50
+KPX Aogonek Uring -50
+KPX Aogonek V -70
+KPX Aogonek W -50
+KPX Aogonek Y -100
+KPX Aogonek Yacute -100
+KPX Aogonek Ydieresis -100
+KPX Aogonek u -30
+KPX Aogonek uacute -30
+KPX Aogonek ucircumflex -30
+KPX Aogonek udieresis -30
+KPX Aogonek ugrave -30
+KPX Aogonek uhungarumlaut -30
+KPX Aogonek umacron -30
+KPX Aogonek uogonek -30
+KPX Aogonek uring -30
+KPX Aogonek v -40
+KPX Aogonek w -40
+KPX Aogonek y -40
+KPX Aogonek yacute -40
+KPX Aogonek ydieresis -40
+KPX Aring C -30
+KPX Aring Cacute -30
+KPX Aring Ccaron -30
+KPX Aring Ccedilla -30
+KPX Aring G -30
+KPX Aring Gbreve -30
+KPX Aring Gcommaaccent -30
+KPX Aring O -30
+KPX Aring Oacute -30
+KPX Aring Ocircumflex -30
+KPX Aring Odieresis -30
+KPX Aring Ograve -30
+KPX Aring Ohungarumlaut -30
+KPX Aring Omacron -30
+KPX Aring Oslash -30
+KPX Aring Otilde -30
+KPX Aring Q -30
+KPX Aring T -120
+KPX Aring Tcaron -120
+KPX Aring Tcommaaccent -120
+KPX Aring U -50
+KPX Aring Uacute -50
+KPX Aring Ucircumflex -50
+KPX Aring Udieresis -50
+KPX Aring Ugrave -50
+KPX Aring Uhungarumlaut -50
+KPX Aring Umacron -50
+KPX Aring Uogonek -50
+KPX Aring Uring -50
+KPX Aring V -70
+KPX Aring W -50
+KPX Aring Y -100
+KPX Aring Yacute -100
+KPX Aring Ydieresis -100
+KPX Aring u -30
+KPX Aring uacute -30
+KPX Aring ucircumflex -30
+KPX Aring udieresis -30
+KPX Aring ugrave -30
+KPX Aring uhungarumlaut -30
+KPX Aring umacron -30
+KPX Aring uogonek -30
+KPX Aring uring -30
+KPX Aring v -40
+KPX Aring w -40
+KPX Aring y -40
+KPX Aring yacute -40
+KPX Aring ydieresis -40
+KPX Atilde C -30
+KPX Atilde Cacute -30
+KPX Atilde Ccaron -30
+KPX Atilde Ccedilla -30
+KPX Atilde G -30
+KPX Atilde Gbreve -30
+KPX Atilde Gcommaaccent -30
+KPX Atilde O -30
+KPX Atilde Oacute -30
+KPX Atilde Ocircumflex -30
+KPX Atilde Odieresis -30
+KPX Atilde Ograve -30
+KPX Atilde Ohungarumlaut -30
+KPX Atilde Omacron -30
+KPX Atilde Oslash -30
+KPX Atilde Otilde -30
+KPX Atilde Q -30
+KPX Atilde T -120
+KPX Atilde Tcaron -120
+KPX Atilde Tcommaaccent -120
+KPX Atilde U -50
+KPX Atilde Uacute -50
+KPX Atilde Ucircumflex -50
+KPX Atilde Udieresis -50
+KPX Atilde Ugrave -50
+KPX Atilde Uhungarumlaut -50
+KPX Atilde Umacron -50
+KPX Atilde Uogonek -50
+KPX Atilde Uring -50
+KPX Atilde V -70
+KPX Atilde W -50
+KPX Atilde Y -100
+KPX Atilde Yacute -100
+KPX Atilde Ydieresis -100
+KPX Atilde u -30
+KPX Atilde uacute -30
+KPX Atilde ucircumflex -30
+KPX Atilde udieresis -30
+KPX Atilde ugrave -30
+KPX Atilde uhungarumlaut -30
+KPX Atilde umacron -30
+KPX Atilde uogonek -30
+KPX Atilde uring -30
+KPX Atilde v -40
+KPX Atilde w -40
+KPX Atilde y -40
+KPX Atilde yacute -40
+KPX Atilde ydieresis -40
+KPX B U -10
+KPX B Uacute -10
+KPX B Ucircumflex -10
+KPX B Udieresis -10
+KPX B Ugrave -10
+KPX B Uhungarumlaut -10
+KPX B Umacron -10
+KPX B Uogonek -10
+KPX B Uring -10
+KPX B comma -20
+KPX B period -20
+KPX C comma -30
+KPX C period -30
+KPX Cacute comma -30
+KPX Cacute period -30
+KPX Ccaron comma -30
+KPX Ccaron period -30
+KPX Ccedilla comma -30
+KPX Ccedilla period -30
+KPX D A -40
+KPX D Aacute -40
+KPX D Abreve -40
+KPX D Acircumflex -40
+KPX D Adieresis -40
+KPX D Agrave -40
+KPX D Amacron -40
+KPX D Aogonek -40
+KPX D Aring -40
+KPX D Atilde -40
+KPX D V -70
+KPX D W -40
+KPX D Y -90
+KPX D Yacute -90
+KPX D Ydieresis -90
+KPX D comma -70
+KPX D period -70
+KPX Dcaron A -40
+KPX Dcaron Aacute -40
+KPX Dcaron Abreve -40
+KPX Dcaron Acircumflex -40
+KPX Dcaron Adieresis -40
+KPX Dcaron Agrave -40
+KPX Dcaron Amacron -40
+KPX Dcaron Aogonek -40
+KPX Dcaron Aring -40
+KPX Dcaron Atilde -40
+KPX Dcaron V -70
+KPX Dcaron W -40
+KPX Dcaron Y -90
+KPX Dcaron Yacute -90
+KPX Dcaron Ydieresis -90
+KPX Dcaron comma -70
+KPX Dcaron period -70
+KPX Dcroat A -40
+KPX Dcroat Aacute -40
+KPX Dcroat Abreve -40
+KPX Dcroat Acircumflex -40
+KPX Dcroat Adieresis -40
+KPX Dcroat Agrave -40
+KPX Dcroat Amacron -40
+KPX Dcroat Aogonek -40
+KPX Dcroat Aring -40
+KPX Dcroat Atilde -40
+KPX Dcroat V -70
+KPX Dcroat W -40
+KPX Dcroat Y -90
+KPX Dcroat Yacute -90
+KPX Dcroat Ydieresis -90
+KPX Dcroat comma -70
+KPX Dcroat period -70
+KPX F A -80
+KPX F Aacute -80
+KPX F Abreve -80
+KPX F Acircumflex -80
+KPX F Adieresis -80
+KPX F Agrave -80
+KPX F Amacron -80
+KPX F Aogonek -80
+KPX F Aring -80
+KPX F Atilde -80
+KPX F a -50
+KPX F aacute -50
+KPX F abreve -50
+KPX F acircumflex -50
+KPX F adieresis -50
+KPX F agrave -50
+KPX F amacron -50
+KPX F aogonek -50
+KPX F aring -50
+KPX F atilde -50
+KPX F comma -150
+KPX F e -30
+KPX F eacute -30
+KPX F ecaron -30
+KPX F ecircumflex -30
+KPX F edieresis -30
+KPX F edotaccent -30
+KPX F egrave -30
+KPX F emacron -30
+KPX F eogonek -30
+KPX F o -30
+KPX F oacute -30
+KPX F ocircumflex -30
+KPX F odieresis -30
+KPX F ograve -30
+KPX F ohungarumlaut -30
+KPX F omacron -30
+KPX F oslash -30
+KPX F otilde -30
+KPX F period -150
+KPX F r -45
+KPX F racute -45
+KPX F rcaron -45
+KPX F rcommaaccent -45
+KPX J A -20
+KPX J Aacute -20
+KPX J Abreve -20
+KPX J Acircumflex -20
+KPX J Adieresis -20
+KPX J Agrave -20
+KPX J Amacron -20
+KPX J Aogonek -20
+KPX J Aring -20
+KPX J Atilde -20
+KPX J a -20
+KPX J aacute -20
+KPX J abreve -20
+KPX J acircumflex -20
+KPX J adieresis -20
+KPX J agrave -20
+KPX J amacron -20
+KPX J aogonek -20
+KPX J aring -20
+KPX J atilde -20
+KPX J comma -30
+KPX J period -30
+KPX J u -20
+KPX J uacute -20
+KPX J ucircumflex -20
+KPX J udieresis -20
+KPX J ugrave -20
+KPX J uhungarumlaut -20
+KPX J umacron -20
+KPX J uogonek -20
+KPX J uring -20
+KPX K O -50
+KPX K Oacute -50
+KPX K Ocircumflex -50
+KPX K Odieresis -50
+KPX K Ograve -50
+KPX K Ohungarumlaut -50
+KPX K Omacron -50
+KPX K Oslash -50
+KPX K Otilde -50
+KPX K e -40
+KPX K eacute -40
+KPX K ecaron -40
+KPX K ecircumflex -40
+KPX K edieresis -40
+KPX K edotaccent -40
+KPX K egrave -40
+KPX K emacron -40
+KPX K eogonek -40
+KPX K o -40
+KPX K oacute -40
+KPX K ocircumflex -40
+KPX K odieresis -40
+KPX K ograve -40
+KPX K ohungarumlaut -40
+KPX K omacron -40
+KPX K oslash -40
+KPX K otilde -40
+KPX K u -30
+KPX K uacute -30
+KPX K ucircumflex -30
+KPX K udieresis -30
+KPX K ugrave -30
+KPX K uhungarumlaut -30
+KPX K umacron -30
+KPX K uogonek -30
+KPX K uring -30
+KPX K y -50
+KPX K yacute -50
+KPX K ydieresis -50
+KPX Kcommaaccent O -50
+KPX Kcommaaccent Oacute -50
+KPX Kcommaaccent Ocircumflex -50
+KPX Kcommaaccent Odieresis -50
+KPX Kcommaaccent Ograve -50
+KPX Kcommaaccent Ohungarumlaut -50
+KPX Kcommaaccent Omacron -50
+KPX Kcommaaccent Oslash -50
+KPX Kcommaaccent Otilde -50
+KPX Kcommaaccent e -40
+KPX Kcommaaccent eacute -40
+KPX Kcommaaccent ecaron -40
+KPX Kcommaaccent ecircumflex -40
+KPX Kcommaaccent edieresis -40
+KPX Kcommaaccent edotaccent -40
+KPX Kcommaaccent egrave -40
+KPX Kcommaaccent emacron -40
+KPX Kcommaaccent eogonek -40
+KPX Kcommaaccent o -40
+KPX Kcommaaccent oacute -40
+KPX Kcommaaccent ocircumflex -40
+KPX Kcommaaccent odieresis -40
+KPX Kcommaaccent ograve -40
+KPX Kcommaaccent ohungarumlaut -40
+KPX Kcommaaccent omacron -40
+KPX Kcommaaccent oslash -40
+KPX Kcommaaccent otilde -40
+KPX Kcommaaccent u -30
+KPX Kcommaaccent uacute -30
+KPX Kcommaaccent ucircumflex -30
+KPX Kcommaaccent udieresis -30
+KPX Kcommaaccent ugrave -30
+KPX Kcommaaccent uhungarumlaut -30
+KPX Kcommaaccent umacron -30
+KPX Kcommaaccent uogonek -30
+KPX Kcommaaccent uring -30
+KPX Kcommaaccent y -50
+KPX Kcommaaccent yacute -50
+KPX Kcommaaccent ydieresis -50
+KPX L T -110
+KPX L Tcaron -110
+KPX L Tcommaaccent -110
+KPX L V -110
+KPX L W -70
+KPX L Y -140
+KPX L Yacute -140
+KPX L Ydieresis -140
+KPX L quotedblright -140
+KPX L quoteright -160
+KPX L y -30
+KPX L yacute -30
+KPX L ydieresis -30
+KPX Lacute T -110
+KPX Lacute Tcaron -110
+KPX Lacute Tcommaaccent -110
+KPX Lacute V -110
+KPX Lacute W -70
+KPX Lacute Y -140
+KPX Lacute Yacute -140
+KPX Lacute Ydieresis -140
+KPX Lacute quotedblright -140
+KPX Lacute quoteright -160
+KPX Lacute y -30
+KPX Lacute yacute -30
+KPX Lacute ydieresis -30
+KPX Lcaron T -110
+KPX Lcaron Tcaron -110
+KPX Lcaron Tcommaaccent -110
+KPX Lcaron V -110
+KPX Lcaron W -70
+KPX Lcaron Y -140
+KPX Lcaron Yacute -140
+KPX Lcaron Ydieresis -140
+KPX Lcaron quotedblright -140
+KPX Lcaron quoteright -160
+KPX Lcaron y -30
+KPX Lcaron yacute -30
+KPX Lcaron ydieresis -30
+KPX Lcommaaccent T -110
+KPX Lcommaaccent Tcaron -110
+KPX Lcommaaccent Tcommaaccent -110
+KPX Lcommaaccent V -110
+KPX Lcommaaccent W -70
+KPX Lcommaaccent Y -140
+KPX Lcommaaccent Yacute -140
+KPX Lcommaaccent Ydieresis -140
+KPX Lcommaaccent quotedblright -140
+KPX Lcommaaccent quoteright -160
+KPX Lcommaaccent y -30
+KPX Lcommaaccent yacute -30
+KPX Lcommaaccent ydieresis -30
+KPX Lslash T -110
+KPX Lslash Tcaron -110
+KPX Lslash Tcommaaccent -110
+KPX Lslash V -110
+KPX Lslash W -70
+KPX Lslash Y -140
+KPX Lslash Yacute -140
+KPX Lslash Ydieresis -140
+KPX Lslash quotedblright -140
+KPX Lslash quoteright -160
+KPX Lslash y -30
+KPX Lslash yacute -30
+KPX Lslash ydieresis -30
+KPX O A -20
+KPX O Aacute -20
+KPX O Abreve -20
+KPX O Acircumflex -20
+KPX O Adieresis -20
+KPX O Agrave -20
+KPX O Amacron -20
+KPX O Aogonek -20
+KPX O Aring -20
+KPX O Atilde -20
+KPX O T -40
+KPX O Tcaron -40
+KPX O Tcommaaccent -40
+KPX O V -50
+KPX O W -30
+KPX O X -60
+KPX O Y -70
+KPX O Yacute -70
+KPX O Ydieresis -70
+KPX O comma -40
+KPX O period -40
+KPX Oacute A -20
+KPX Oacute Aacute -20
+KPX Oacute Abreve -20
+KPX Oacute Acircumflex -20
+KPX Oacute Adieresis -20
+KPX Oacute Agrave -20
+KPX Oacute Amacron -20
+KPX Oacute Aogonek -20
+KPX Oacute Aring -20
+KPX Oacute Atilde -20
+KPX Oacute T -40
+KPX Oacute Tcaron -40
+KPX Oacute Tcommaaccent -40
+KPX Oacute V -50
+KPX Oacute W -30
+KPX Oacute X -60
+KPX Oacute Y -70
+KPX Oacute Yacute -70
+KPX Oacute Ydieresis -70
+KPX Oacute comma -40
+KPX Oacute period -40
+KPX Ocircumflex A -20
+KPX Ocircumflex Aacute -20
+KPX Ocircumflex Abreve -20
+KPX Ocircumflex Acircumflex -20
+KPX Ocircumflex Adieresis -20
+KPX Ocircumflex Agrave -20
+KPX Ocircumflex Amacron -20
+KPX Ocircumflex Aogonek -20
+KPX Ocircumflex Aring -20
+KPX Ocircumflex Atilde -20
+KPX Ocircumflex T -40
+KPX Ocircumflex Tcaron -40
+KPX Ocircumflex Tcommaaccent -40
+KPX Ocircumflex V -50
+KPX Ocircumflex W -30
+KPX Ocircumflex X -60
+KPX Ocircumflex Y -70
+KPX Ocircumflex Yacute -70
+KPX Ocircumflex Ydieresis -70
+KPX Ocircumflex comma -40
+KPX Ocircumflex period -40
+KPX Odieresis A -20
+KPX Odieresis Aacute -20
+KPX Odieresis Abreve -20
+KPX Odieresis Acircumflex -20
+KPX Odieresis Adieresis -20
+KPX Odieresis Agrave -20
+KPX Odieresis Amacron -20
+KPX Odieresis Aogonek -20
+KPX Odieresis Aring -20
+KPX Odieresis Atilde -20
+KPX Odieresis T -40
+KPX Odieresis Tcaron -40
+KPX Odieresis Tcommaaccent -40
+KPX Odieresis V -50
+KPX Odieresis W -30
+KPX Odieresis X -60
+KPX Odieresis Y -70
+KPX Odieresis Yacute -70
+KPX Odieresis Ydieresis -70
+KPX Odieresis comma -40
+KPX Odieresis period -40
+KPX Ograve A -20
+KPX Ograve Aacute -20
+KPX Ograve Abreve -20
+KPX Ograve Acircumflex -20
+KPX Ograve Adieresis -20
+KPX Ograve Agrave -20
+KPX Ograve Amacron -20
+KPX Ograve Aogonek -20
+KPX Ograve Aring -20
+KPX Ograve Atilde -20
+KPX Ograve T -40
+KPX Ograve Tcaron -40
+KPX Ograve Tcommaaccent -40
+KPX Ograve V -50
+KPX Ograve W -30
+KPX Ograve X -60
+KPX Ograve Y -70
+KPX Ograve Yacute -70
+KPX Ograve Ydieresis -70
+KPX Ograve comma -40
+KPX Ograve period -40
+KPX Ohungarumlaut A -20
+KPX Ohungarumlaut Aacute -20
+KPX Ohungarumlaut Abreve -20
+KPX Ohungarumlaut Acircumflex -20
+KPX Ohungarumlaut Adieresis -20
+KPX Ohungarumlaut Agrave -20
+KPX Ohungarumlaut Amacron -20
+KPX Ohungarumlaut Aogonek -20
+KPX Ohungarumlaut Aring -20
+KPX Ohungarumlaut Atilde -20
+KPX Ohungarumlaut T -40
+KPX Ohungarumlaut Tcaron -40
+KPX Ohungarumlaut Tcommaaccent -40
+KPX Ohungarumlaut V -50
+KPX Ohungarumlaut W -30
+KPX Ohungarumlaut X -60
+KPX Ohungarumlaut Y -70
+KPX Ohungarumlaut Yacute -70
+KPX Ohungarumlaut Ydieresis -70
+KPX Ohungarumlaut comma -40
+KPX Ohungarumlaut period -40
+KPX Omacron A -20
+KPX Omacron Aacute -20
+KPX Omacron Abreve -20
+KPX Omacron Acircumflex -20
+KPX Omacron Adieresis -20
+KPX Omacron Agrave -20
+KPX Omacron Amacron -20
+KPX Omacron Aogonek -20
+KPX Omacron Aring -20
+KPX Omacron Atilde -20
+KPX Omacron T -40
+KPX Omacron Tcaron -40
+KPX Omacron Tcommaaccent -40
+KPX Omacron V -50
+KPX Omacron W -30
+KPX Omacron X -60
+KPX Omacron Y -70
+KPX Omacron Yacute -70
+KPX Omacron Ydieresis -70
+KPX Omacron comma -40
+KPX Omacron period -40
+KPX Oslash A -20
+KPX Oslash Aacute -20
+KPX Oslash Abreve -20
+KPX Oslash Acircumflex -20
+KPX Oslash Adieresis -20
+KPX Oslash Agrave -20
+KPX Oslash Amacron -20
+KPX Oslash Aogonek -20
+KPX Oslash Aring -20
+KPX Oslash Atilde -20
+KPX Oslash T -40
+KPX Oslash Tcaron -40
+KPX Oslash Tcommaaccent -40
+KPX Oslash V -50
+KPX Oslash W -30
+KPX Oslash X -60
+KPX Oslash Y -70
+KPX Oslash Yacute -70
+KPX Oslash Ydieresis -70
+KPX Oslash comma -40
+KPX Oslash period -40
+KPX Otilde A -20
+KPX Otilde Aacute -20
+KPX Otilde Abreve -20
+KPX Otilde Acircumflex -20
+KPX Otilde Adieresis -20
+KPX Otilde Agrave -20
+KPX Otilde Amacron -20
+KPX Otilde Aogonek -20
+KPX Otilde Aring -20
+KPX Otilde Atilde -20
+KPX Otilde T -40
+KPX Otilde Tcaron -40
+KPX Otilde Tcommaaccent -40
+KPX Otilde V -50
+KPX Otilde W -30
+KPX Otilde X -60
+KPX Otilde Y -70
+KPX Otilde Yacute -70
+KPX Otilde Ydieresis -70
+KPX Otilde comma -40
+KPX Otilde period -40
+KPX P A -120
+KPX P Aacute -120
+KPX P Abreve -120
+KPX P Acircumflex -120
+KPX P Adieresis -120
+KPX P Agrave -120
+KPX P Amacron -120
+KPX P Aogonek -120
+KPX P Aring -120
+KPX P Atilde -120
+KPX P a -40
+KPX P aacute -40
+KPX P abreve -40
+KPX P acircumflex -40
+KPX P adieresis -40
+KPX P agrave -40
+KPX P amacron -40
+KPX P aogonek -40
+KPX P aring -40
+KPX P atilde -40
+KPX P comma -180
+KPX P e -50
+KPX P eacute -50
+KPX P ecaron -50
+KPX P ecircumflex -50
+KPX P edieresis -50
+KPX P edotaccent -50
+KPX P egrave -50
+KPX P emacron -50
+KPX P eogonek -50
+KPX P o -50
+KPX P oacute -50
+KPX P ocircumflex -50
+KPX P odieresis -50
+KPX P ograve -50
+KPX P ohungarumlaut -50
+KPX P omacron -50
+KPX P oslash -50
+KPX P otilde -50
+KPX P period -180
+KPX Q U -10
+KPX Q Uacute -10
+KPX Q Ucircumflex -10
+KPX Q Udieresis -10
+KPX Q Ugrave -10
+KPX Q Uhungarumlaut -10
+KPX Q Umacron -10
+KPX Q Uogonek -10
+KPX Q Uring -10
+KPX R O -20
+KPX R Oacute -20
+KPX R Ocircumflex -20
+KPX R Odieresis -20
+KPX R Ograve -20
+KPX R Ohungarumlaut -20
+KPX R Omacron -20
+KPX R Oslash -20
+KPX R Otilde -20
+KPX R T -30
+KPX R Tcaron -30
+KPX R Tcommaaccent -30
+KPX R U -40
+KPX R Uacute -40
+KPX R Ucircumflex -40
+KPX R Udieresis -40
+KPX R Ugrave -40
+KPX R Uhungarumlaut -40
+KPX R Umacron -40
+KPX R Uogonek -40
+KPX R Uring -40
+KPX R V -50
+KPX R W -30
+KPX R Y -50
+KPX R Yacute -50
+KPX R Ydieresis -50
+KPX Racute O -20
+KPX Racute Oacute -20
+KPX Racute Ocircumflex -20
+KPX Racute Odieresis -20
+KPX Racute Ograve -20
+KPX Racute Ohungarumlaut -20
+KPX Racute Omacron -20
+KPX Racute Oslash -20
+KPX Racute Otilde -20
+KPX Racute T -30
+KPX Racute Tcaron -30
+KPX Racute Tcommaaccent -30
+KPX Racute U -40
+KPX Racute Uacute -40
+KPX Racute Ucircumflex -40
+KPX Racute Udieresis -40
+KPX Racute Ugrave -40
+KPX Racute Uhungarumlaut -40
+KPX Racute Umacron -40
+KPX Racute Uogonek -40
+KPX Racute Uring -40
+KPX Racute V -50
+KPX Racute W -30
+KPX Racute Y -50
+KPX Racute Yacute -50
+KPX Racute Ydieresis -50
+KPX Rcaron O -20
+KPX Rcaron Oacute -20
+KPX Rcaron Ocircumflex -20
+KPX Rcaron Odieresis -20
+KPX Rcaron Ograve -20
+KPX Rcaron Ohungarumlaut -20
+KPX Rcaron Omacron -20
+KPX Rcaron Oslash -20
+KPX Rcaron Otilde -20
+KPX Rcaron T -30
+KPX Rcaron Tcaron -30
+KPX Rcaron Tcommaaccent -30
+KPX Rcaron U -40
+KPX Rcaron Uacute -40
+KPX Rcaron Ucircumflex -40
+KPX Rcaron Udieresis -40
+KPX Rcaron Ugrave -40
+KPX Rcaron Uhungarumlaut -40
+KPX Rcaron Umacron -40
+KPX Rcaron Uogonek -40
+KPX Rcaron Uring -40
+KPX Rcaron V -50
+KPX Rcaron W -30
+KPX Rcaron Y -50
+KPX Rcaron Yacute -50
+KPX Rcaron Ydieresis -50
+KPX Rcommaaccent O -20
+KPX Rcommaaccent Oacute -20
+KPX Rcommaaccent Ocircumflex -20
+KPX Rcommaaccent Odieresis -20
+KPX Rcommaaccent Ograve -20
+KPX Rcommaaccent Ohungarumlaut -20
+KPX Rcommaaccent Omacron -20
+KPX Rcommaaccent Oslash -20
+KPX Rcommaaccent Otilde -20
+KPX Rcommaaccent T -30
+KPX Rcommaaccent Tcaron -30
+KPX Rcommaaccent Tcommaaccent -30
+KPX Rcommaaccent U -40
+KPX Rcommaaccent Uacute -40
+KPX Rcommaaccent Ucircumflex -40
+KPX Rcommaaccent Udieresis -40
+KPX Rcommaaccent Ugrave -40
+KPX Rcommaaccent Uhungarumlaut -40
+KPX Rcommaaccent Umacron -40
+KPX Rcommaaccent Uogonek -40
+KPX Rcommaaccent Uring -40
+KPX Rcommaaccent V -50
+KPX Rcommaaccent W -30
+KPX Rcommaaccent Y -50
+KPX Rcommaaccent Yacute -50
+KPX Rcommaaccent Ydieresis -50
+KPX S comma -20
+KPX S period -20
+KPX Sacute comma -20
+KPX Sacute period -20
+KPX Scaron comma -20
+KPX Scaron period -20
+KPX Scedilla comma -20
+KPX Scedilla period -20
+KPX Scommaaccent comma -20
+KPX Scommaaccent period -20
+KPX T A -120
+KPX T Aacute -120
+KPX T Abreve -120
+KPX T Acircumflex -120
+KPX T Adieresis -120
+KPX T Agrave -120
+KPX T Amacron -120
+KPX T Aogonek -120
+KPX T Aring -120
+KPX T Atilde -120
+KPX T O -40
+KPX T Oacute -40
+KPX T Ocircumflex -40
+KPX T Odieresis -40
+KPX T Ograve -40
+KPX T Ohungarumlaut -40
+KPX T Omacron -40
+KPX T Oslash -40
+KPX T Otilde -40
+KPX T a -120
+KPX T aacute -120
+KPX T abreve -60
+KPX T acircumflex -120
+KPX T adieresis -120
+KPX T agrave -120
+KPX T amacron -60
+KPX T aogonek -120
+KPX T aring -120
+KPX T atilde -60
+KPX T colon -20
+KPX T comma -120
+KPX T e -120
+KPX T eacute -120
+KPX T ecaron -120
+KPX T ecircumflex -120
+KPX T edieresis -120
+KPX T edotaccent -120
+KPX T egrave -60
+KPX T emacron -60
+KPX T eogonek -120
+KPX T hyphen -140
+KPX T o -120
+KPX T oacute -120
+KPX T ocircumflex -120
+KPX T odieresis -120
+KPX T ograve -120
+KPX T ohungarumlaut -120
+KPX T omacron -60
+KPX T oslash -120
+KPX T otilde -60
+KPX T period -120
+KPX T r -120
+KPX T racute -120
+KPX T rcaron -120
+KPX T rcommaaccent -120
+KPX T semicolon -20
+KPX T u -120
+KPX T uacute -120
+KPX T ucircumflex -120
+KPX T udieresis -120
+KPX T ugrave -120
+KPX T uhungarumlaut -120
+KPX T umacron -60
+KPX T uogonek -120
+KPX T uring -120
+KPX T w -120
+KPX T y -120
+KPX T yacute -120
+KPX T ydieresis -60
+KPX Tcaron A -120
+KPX Tcaron Aacute -120
+KPX Tcaron Abreve -120
+KPX Tcaron Acircumflex -120
+KPX Tcaron Adieresis -120
+KPX Tcaron Agrave -120
+KPX Tcaron Amacron -120
+KPX Tcaron Aogonek -120
+KPX Tcaron Aring -120
+KPX Tcaron Atilde -120
+KPX Tcaron O -40
+KPX Tcaron Oacute -40
+KPX Tcaron Ocircumflex -40
+KPX Tcaron Odieresis -40
+KPX Tcaron Ograve -40
+KPX Tcaron Ohungarumlaut -40
+KPX Tcaron Omacron -40
+KPX Tcaron Oslash -40
+KPX Tcaron Otilde -40
+KPX Tcaron a -120
+KPX Tcaron aacute -120
+KPX Tcaron abreve -60
+KPX Tcaron acircumflex -120
+KPX Tcaron adieresis -120
+KPX Tcaron agrave -120
+KPX Tcaron amacron -60
+KPX Tcaron aogonek -120
+KPX Tcaron aring -120
+KPX Tcaron atilde -60
+KPX Tcaron colon -20
+KPX Tcaron comma -120
+KPX Tcaron e -120
+KPX Tcaron eacute -120
+KPX Tcaron ecaron -120
+KPX Tcaron ecircumflex -120
+KPX Tcaron edieresis -120
+KPX Tcaron edotaccent -120
+KPX Tcaron egrave -60
+KPX Tcaron emacron -60
+KPX Tcaron eogonek -120
+KPX Tcaron hyphen -140
+KPX Tcaron o -120
+KPX Tcaron oacute -120
+KPX Tcaron ocircumflex -120
+KPX Tcaron odieresis -120
+KPX Tcaron ograve -120
+KPX Tcaron ohungarumlaut -120
+KPX Tcaron omacron -60
+KPX Tcaron oslash -120
+KPX Tcaron otilde -60
+KPX Tcaron period -120
+KPX Tcaron r -120
+KPX Tcaron racute -120
+KPX Tcaron rcaron -120
+KPX Tcaron rcommaaccent -120
+KPX Tcaron semicolon -20
+KPX Tcaron u -120
+KPX Tcaron uacute -120
+KPX Tcaron ucircumflex -120
+KPX Tcaron udieresis -120
+KPX Tcaron ugrave -120
+KPX Tcaron uhungarumlaut -120
+KPX Tcaron umacron -60
+KPX Tcaron uogonek -120
+KPX Tcaron uring -120
+KPX Tcaron w -120
+KPX Tcaron y -120
+KPX Tcaron yacute -120
+KPX Tcaron ydieresis -60
+KPX Tcommaaccent A -120
+KPX Tcommaaccent Aacute -120
+KPX Tcommaaccent Abreve -120
+KPX Tcommaaccent Acircumflex -120
+KPX Tcommaaccent Adieresis -120
+KPX Tcommaaccent Agrave -120
+KPX Tcommaaccent Amacron -120
+KPX Tcommaaccent Aogonek -120
+KPX Tcommaaccent Aring -120
+KPX Tcommaaccent Atilde -120
+KPX Tcommaaccent O -40
+KPX Tcommaaccent Oacute -40
+KPX Tcommaaccent Ocircumflex -40
+KPX Tcommaaccent Odieresis -40
+KPX Tcommaaccent Ograve -40
+KPX Tcommaaccent Ohungarumlaut -40
+KPX Tcommaaccent Omacron -40
+KPX Tcommaaccent Oslash -40
+KPX Tcommaaccent Otilde -40
+KPX Tcommaaccent a -120
+KPX Tcommaaccent aacute -120
+KPX Tcommaaccent abreve -60
+KPX Tcommaaccent acircumflex -120
+KPX Tcommaaccent adieresis -120
+KPX Tcommaaccent agrave -120
+KPX Tcommaaccent amacron -60
+KPX Tcommaaccent aogonek -120
+KPX Tcommaaccent aring -120
+KPX Tcommaaccent atilde -60
+KPX Tcommaaccent colon -20
+KPX Tcommaaccent comma -120
+KPX Tcommaaccent e -120
+KPX Tcommaaccent eacute -120
+KPX Tcommaaccent ecaron -120
+KPX Tcommaaccent ecircumflex -120
+KPX Tcommaaccent edieresis -120
+KPX Tcommaaccent edotaccent -120
+KPX Tcommaaccent egrave -60
+KPX Tcommaaccent emacron -60
+KPX Tcommaaccent eogonek -120
+KPX Tcommaaccent hyphen -140
+KPX Tcommaaccent o -120
+KPX Tcommaaccent oacute -120
+KPX Tcommaaccent ocircumflex -120
+KPX Tcommaaccent odieresis -120
+KPX Tcommaaccent ograve -120
+KPX Tcommaaccent ohungarumlaut -120
+KPX Tcommaaccent omacron -60
+KPX Tcommaaccent oslash -120
+KPX Tcommaaccent otilde -60
+KPX Tcommaaccent period -120
+KPX Tcommaaccent r -120
+KPX Tcommaaccent racute -120
+KPX Tcommaaccent rcaron -120
+KPX Tcommaaccent rcommaaccent -120
+KPX Tcommaaccent semicolon -20
+KPX Tcommaaccent u -120
+KPX Tcommaaccent uacute -120
+KPX Tcommaaccent ucircumflex -120
+KPX Tcommaaccent udieresis -120
+KPX Tcommaaccent ugrave -120
+KPX Tcommaaccent uhungarumlaut -120
+KPX Tcommaaccent umacron -60
+KPX Tcommaaccent uogonek -120
+KPX Tcommaaccent uring -120
+KPX Tcommaaccent w -120
+KPX Tcommaaccent y -120
+KPX Tcommaaccent yacute -120
+KPX Tcommaaccent ydieresis -60
+KPX U A -40
+KPX U Aacute -40
+KPX U Abreve -40
+KPX U Acircumflex -40
+KPX U Adieresis -40
+KPX U Agrave -40
+KPX U Amacron -40
+KPX U Aogonek -40
+KPX U Aring -40
+KPX U Atilde -40
+KPX U comma -40
+KPX U period -40
+KPX Uacute A -40
+KPX Uacute Aacute -40
+KPX Uacute Abreve -40
+KPX Uacute Acircumflex -40
+KPX Uacute Adieresis -40
+KPX Uacute Agrave -40
+KPX Uacute Amacron -40
+KPX Uacute Aogonek -40
+KPX Uacute Aring -40
+KPX Uacute Atilde -40
+KPX Uacute comma -40
+KPX Uacute period -40
+KPX Ucircumflex A -40
+KPX Ucircumflex Aacute -40
+KPX Ucircumflex Abreve -40
+KPX Ucircumflex Acircumflex -40
+KPX Ucircumflex Adieresis -40
+KPX Ucircumflex Agrave -40
+KPX Ucircumflex Amacron -40
+KPX Ucircumflex Aogonek -40
+KPX Ucircumflex Aring -40
+KPX Ucircumflex Atilde -40
+KPX Ucircumflex comma -40
+KPX Ucircumflex period -40
+KPX Udieresis A -40
+KPX Udieresis Aacute -40
+KPX Udieresis Abreve -40
+KPX Udieresis Acircumflex -40
+KPX Udieresis Adieresis -40
+KPX Udieresis Agrave -40
+KPX Udieresis Amacron -40
+KPX Udieresis Aogonek -40
+KPX Udieresis Aring -40
+KPX Udieresis Atilde -40
+KPX Udieresis comma -40
+KPX Udieresis period -40
+KPX Ugrave A -40
+KPX Ugrave Aacute -40
+KPX Ugrave Abreve -40
+KPX Ugrave Acircumflex -40
+KPX Ugrave Adieresis -40
+KPX Ugrave Agrave -40
+KPX Ugrave Amacron -40
+KPX Ugrave Aogonek -40
+KPX Ugrave Aring -40
+KPX Ugrave Atilde -40
+KPX Ugrave comma -40
+KPX Ugrave period -40
+KPX Uhungarumlaut A -40
+KPX Uhungarumlaut Aacute -40
+KPX Uhungarumlaut Abreve -40
+KPX Uhungarumlaut Acircumflex -40
+KPX Uhungarumlaut Adieresis -40
+KPX Uhungarumlaut Agrave -40
+KPX Uhungarumlaut Amacron -40
+KPX Uhungarumlaut Aogonek -40
+KPX Uhungarumlaut Aring -40
+KPX Uhungarumlaut Atilde -40
+KPX Uhungarumlaut comma -40
+KPX Uhungarumlaut period -40
+KPX Umacron A -40
+KPX Umacron Aacute -40
+KPX Umacron Abreve -40
+KPX Umacron Acircumflex -40
+KPX Umacron Adieresis -40
+KPX Umacron Agrave -40
+KPX Umacron Amacron -40
+KPX Umacron Aogonek -40
+KPX Umacron Aring -40
+KPX Umacron Atilde -40
+KPX Umacron comma -40
+KPX Umacron period -40
+KPX Uogonek A -40
+KPX Uogonek Aacute -40
+KPX Uogonek Abreve -40
+KPX Uogonek Acircumflex -40
+KPX Uogonek Adieresis -40
+KPX Uogonek Agrave -40
+KPX Uogonek Amacron -40
+KPX Uogonek Aogonek -40
+KPX Uogonek Aring -40
+KPX Uogonek Atilde -40
+KPX Uogonek comma -40
+KPX Uogonek period -40
+KPX Uring A -40
+KPX Uring Aacute -40
+KPX Uring Abreve -40
+KPX Uring Acircumflex -40
+KPX Uring Adieresis -40
+KPX Uring Agrave -40
+KPX Uring Amacron -40
+KPX Uring Aogonek -40
+KPX Uring Aring -40
+KPX Uring Atilde -40
+KPX Uring comma -40
+KPX Uring period -40
+KPX V A -80
+KPX V Aacute -80
+KPX V Abreve -80
+KPX V Acircumflex -80
+KPX V Adieresis -80
+KPX V Agrave -80
+KPX V Amacron -80
+KPX V Aogonek -80
+KPX V Aring -80
+KPX V Atilde -80
+KPX V G -40
+KPX V Gbreve -40
+KPX V Gcommaaccent -40
+KPX V O -40
+KPX V Oacute -40
+KPX V Ocircumflex -40
+KPX V Odieresis -40
+KPX V Ograve -40
+KPX V Ohungarumlaut -40
+KPX V Omacron -40
+KPX V Oslash -40
+KPX V Otilde -40
+KPX V a -70
+KPX V aacute -70
+KPX V abreve -70
+KPX V acircumflex -70
+KPX V adieresis -70
+KPX V agrave -70
+KPX V amacron -70
+KPX V aogonek -70
+KPX V aring -70
+KPX V atilde -70
+KPX V colon -40
+KPX V comma -125
+KPX V e -80
+KPX V eacute -80
+KPX V ecaron -80
+KPX V ecircumflex -80
+KPX V edieresis -80
+KPX V edotaccent -80
+KPX V egrave -80
+KPX V emacron -80
+KPX V eogonek -80
+KPX V hyphen -80
+KPX V o -80
+KPX V oacute -80
+KPX V ocircumflex -80
+KPX V odieresis -80
+KPX V ograve -80
+KPX V ohungarumlaut -80
+KPX V omacron -80
+KPX V oslash -80
+KPX V otilde -80
+KPX V period -125
+KPX V semicolon -40
+KPX V u -70
+KPX V uacute -70
+KPX V ucircumflex -70
+KPX V udieresis -70
+KPX V ugrave -70
+KPX V uhungarumlaut -70
+KPX V umacron -70
+KPX V uogonek -70
+KPX V uring -70
+KPX W A -50
+KPX W Aacute -50
+KPX W Abreve -50
+KPX W Acircumflex -50
+KPX W Adieresis -50
+KPX W Agrave -50
+KPX W Amacron -50
+KPX W Aogonek -50
+KPX W Aring -50
+KPX W Atilde -50
+KPX W O -20
+KPX W Oacute -20
+KPX W Ocircumflex -20
+KPX W Odieresis -20
+KPX W Ograve -20
+KPX W Ohungarumlaut -20
+KPX W Omacron -20
+KPX W Oslash -20
+KPX W Otilde -20
+KPX W a -40
+KPX W aacute -40
+KPX W abreve -40
+KPX W acircumflex -40
+KPX W adieresis -40
+KPX W agrave -40
+KPX W amacron -40
+KPX W aogonek -40
+KPX W aring -40
+KPX W atilde -40
+KPX W comma -80
+KPX W e -30
+KPX W eacute -30
+KPX W ecaron -30
+KPX W ecircumflex -30
+KPX W edieresis -30
+KPX W edotaccent -30
+KPX W egrave -30
+KPX W emacron -30
+KPX W eogonek -30
+KPX W hyphen -40
+KPX W o -30
+KPX W oacute -30
+KPX W ocircumflex -30
+KPX W odieresis -30
+KPX W ograve -30
+KPX W ohungarumlaut -30
+KPX W omacron -30
+KPX W oslash -30
+KPX W otilde -30
+KPX W period -80
+KPX W u -30
+KPX W uacute -30
+KPX W ucircumflex -30
+KPX W udieresis -30
+KPX W ugrave -30
+KPX W uhungarumlaut -30
+KPX W umacron -30
+KPX W uogonek -30
+KPX W uring -30
+KPX W y -20
+KPX W yacute -20
+KPX W ydieresis -20
+KPX Y A -110
+KPX Y Aacute -110
+KPX Y Abreve -110
+KPX Y Acircumflex -110
+KPX Y Adieresis -110
+KPX Y Agrave -110
+KPX Y Amacron -110
+KPX Y Aogonek -110
+KPX Y Aring -110
+KPX Y Atilde -110
+KPX Y O -85
+KPX Y Oacute -85
+KPX Y Ocircumflex -85
+KPX Y Odieresis -85
+KPX Y Ograve -85
+KPX Y Ohungarumlaut -85
+KPX Y Omacron -85
+KPX Y Oslash -85
+KPX Y Otilde -85
+KPX Y a -140
+KPX Y aacute -140
+KPX Y abreve -70
+KPX Y acircumflex -140
+KPX Y adieresis -140
+KPX Y agrave -140
+KPX Y amacron -70
+KPX Y aogonek -140
+KPX Y aring -140
+KPX Y atilde -140
+KPX Y colon -60
+KPX Y comma -140
+KPX Y e -140
+KPX Y eacute -140
+KPX Y ecaron -140
+KPX Y ecircumflex -140
+KPX Y edieresis -140
+KPX Y edotaccent -140
+KPX Y egrave -140
+KPX Y emacron -70
+KPX Y eogonek -140
+KPX Y hyphen -140
+KPX Y i -20
+KPX Y iacute -20
+KPX Y iogonek -20
+KPX Y o -140
+KPX Y oacute -140
+KPX Y ocircumflex -140
+KPX Y odieresis -140
+KPX Y ograve -140
+KPX Y ohungarumlaut -140
+KPX Y omacron -140
+KPX Y oslash -140
+KPX Y otilde -140
+KPX Y period -140
+KPX Y semicolon -60
+KPX Y u -110
+KPX Y uacute -110
+KPX Y ucircumflex -110
+KPX Y udieresis -110
+KPX Y ugrave -110
+KPX Y uhungarumlaut -110
+KPX Y umacron -110
+KPX Y uogonek -110
+KPX Y uring -110
+KPX Yacute A -110
+KPX Yacute Aacute -110
+KPX Yacute Abreve -110
+KPX Yacute Acircumflex -110
+KPX Yacute Adieresis -110
+KPX Yacute Agrave -110
+KPX Yacute Amacron -110
+KPX Yacute Aogonek -110
+KPX Yacute Aring -110
+KPX Yacute Atilde -110
+KPX Yacute O -85
+KPX Yacute Oacute -85
+KPX Yacute Ocircumflex -85
+KPX Yacute Odieresis -85
+KPX Yacute Ograve -85
+KPX Yacute Ohungarumlaut -85
+KPX Yacute Omacron -85
+KPX Yacute Oslash -85
+KPX Yacute Otilde -85
+KPX Yacute a -140
+KPX Yacute aacute -140
+KPX Yacute abreve -70
+KPX Yacute acircumflex -140
+KPX Yacute adieresis -140
+KPX Yacute agrave -140
+KPX Yacute amacron -70
+KPX Yacute aogonek -140
+KPX Yacute aring -140
+KPX Yacute atilde -70
+KPX Yacute colon -60
+KPX Yacute comma -140
+KPX Yacute e -140
+KPX Yacute eacute -140
+KPX Yacute ecaron -140
+KPX Yacute ecircumflex -140
+KPX Yacute edieresis -140
+KPX Yacute edotaccent -140
+KPX Yacute egrave -140
+KPX Yacute emacron -70
+KPX Yacute eogonek -140
+KPX Yacute hyphen -140
+KPX Yacute i -20
+KPX Yacute iacute -20
+KPX Yacute iogonek -20
+KPX Yacute o -140
+KPX Yacute oacute -140
+KPX Yacute ocircumflex -140
+KPX Yacute odieresis -140
+KPX Yacute ograve -140
+KPX Yacute ohungarumlaut -140
+KPX Yacute omacron -70
+KPX Yacute oslash -140
+KPX Yacute otilde -140
+KPX Yacute period -140
+KPX Yacute semicolon -60
+KPX Yacute u -110
+KPX Yacute uacute -110
+KPX Yacute ucircumflex -110
+KPX Yacute udieresis -110
+KPX Yacute ugrave -110
+KPX Yacute uhungarumlaut -110
+KPX Yacute umacron -110
+KPX Yacute uogonek -110
+KPX Yacute uring -110
+KPX Ydieresis A -110
+KPX Ydieresis Aacute -110
+KPX Ydieresis Abreve -110
+KPX Ydieresis Acircumflex -110
+KPX Ydieresis Adieresis -110
+KPX Ydieresis Agrave -110
+KPX Ydieresis Amacron -110
+KPX Ydieresis Aogonek -110
+KPX Ydieresis Aring -110
+KPX Ydieresis Atilde -110
+KPX Ydieresis O -85
+KPX Ydieresis Oacute -85
+KPX Ydieresis Ocircumflex -85
+KPX Ydieresis Odieresis -85
+KPX Ydieresis Ograve -85
+KPX Ydieresis Ohungarumlaut -85
+KPX Ydieresis Omacron -85
+KPX Ydieresis Oslash -85
+KPX Ydieresis Otilde -85
+KPX Ydieresis a -140
+KPX Ydieresis aacute -140
+KPX Ydieresis abreve -70
+KPX Ydieresis acircumflex -140
+KPX Ydieresis adieresis -140
+KPX Ydieresis agrave -140
+KPX Ydieresis amacron -70
+KPX Ydieresis aogonek -140
+KPX Ydieresis aring -140
+KPX Ydieresis atilde -70
+KPX Ydieresis colon -60
+KPX Ydieresis comma -140
+KPX Ydieresis e -140
+KPX Ydieresis eacute -140
+KPX Ydieresis ecaron -140
+KPX Ydieresis ecircumflex -140
+KPX Ydieresis edieresis -140
+KPX Ydieresis edotaccent -140
+KPX Ydieresis egrave -140
+KPX Ydieresis emacron -70
+KPX Ydieresis eogonek -140
+KPX Ydieresis hyphen -140
+KPX Ydieresis i -20
+KPX Ydieresis iacute -20
+KPX Ydieresis iogonek -20
+KPX Ydieresis o -140
+KPX Ydieresis oacute -140
+KPX Ydieresis ocircumflex -140
+KPX Ydieresis odieresis -140
+KPX Ydieresis ograve -140
+KPX Ydieresis ohungarumlaut -140
+KPX Ydieresis omacron -140
+KPX Ydieresis oslash -140
+KPX Ydieresis otilde -140
+KPX Ydieresis period -140
+KPX Ydieresis semicolon -60
+KPX Ydieresis u -110
+KPX Ydieresis uacute -110
+KPX Ydieresis ucircumflex -110
+KPX Ydieresis udieresis -110
+KPX Ydieresis ugrave -110
+KPX Ydieresis uhungarumlaut -110
+KPX Ydieresis umacron -110
+KPX Ydieresis uogonek -110
+KPX Ydieresis uring -110
+KPX a v -20
+KPX a w -20
+KPX a y -30
+KPX a yacute -30
+KPX a ydieresis -30
+KPX aacute v -20
+KPX aacute w -20
+KPX aacute y -30
+KPX aacute yacute -30
+KPX aacute ydieresis -30
+KPX abreve v -20
+KPX abreve w -20
+KPX abreve y -30
+KPX abreve yacute -30
+KPX abreve ydieresis -30
+KPX acircumflex v -20
+KPX acircumflex w -20
+KPX acircumflex y -30
+KPX acircumflex yacute -30
+KPX acircumflex ydieresis -30
+KPX adieresis v -20
+KPX adieresis w -20
+KPX adieresis y -30
+KPX adieresis yacute -30
+KPX adieresis ydieresis -30
+KPX agrave v -20
+KPX agrave w -20
+KPX agrave y -30
+KPX agrave yacute -30
+KPX agrave ydieresis -30
+KPX amacron v -20
+KPX amacron w -20
+KPX amacron y -30
+KPX amacron yacute -30
+KPX amacron ydieresis -30
+KPX aogonek v -20
+KPX aogonek w -20
+KPX aogonek y -30
+KPX aogonek yacute -30
+KPX aogonek ydieresis -30
+KPX aring v -20
+KPX aring w -20
+KPX aring y -30
+KPX aring yacute -30
+KPX aring ydieresis -30
+KPX atilde v -20
+KPX atilde w -20
+KPX atilde y -30
+KPX atilde yacute -30
+KPX atilde ydieresis -30
+KPX b b -10
+KPX b comma -40
+KPX b l -20
+KPX b lacute -20
+KPX b lcommaaccent -20
+KPX b lslash -20
+KPX b period -40
+KPX b u -20
+KPX b uacute -20
+KPX b ucircumflex -20
+KPX b udieresis -20
+KPX b ugrave -20
+KPX b uhungarumlaut -20
+KPX b umacron -20
+KPX b uogonek -20
+KPX b uring -20
+KPX b v -20
+KPX b y -20
+KPX b yacute -20
+KPX b ydieresis -20
+KPX c comma -15
+KPX c k -20
+KPX c kcommaaccent -20
+KPX cacute comma -15
+KPX cacute k -20
+KPX cacute kcommaaccent -20
+KPX ccaron comma -15
+KPX ccaron k -20
+KPX ccaron kcommaaccent -20
+KPX ccedilla comma -15
+KPX ccedilla k -20
+KPX ccedilla kcommaaccent -20
+KPX colon space -50
+KPX comma quotedblright -100
+KPX comma quoteright -100
+KPX e comma -15
+KPX e period -15
+KPX e v -30
+KPX e w -20
+KPX e x -30
+KPX e y -20
+KPX e yacute -20
+KPX e ydieresis -20
+KPX eacute comma -15
+KPX eacute period -15
+KPX eacute v -30
+KPX eacute w -20
+KPX eacute x -30
+KPX eacute y -20
+KPX eacute yacute -20
+KPX eacute ydieresis -20
+KPX ecaron comma -15
+KPX ecaron period -15
+KPX ecaron v -30
+KPX ecaron w -20
+KPX ecaron x -30
+KPX ecaron y -20
+KPX ecaron yacute -20
+KPX ecaron ydieresis -20
+KPX ecircumflex comma -15
+KPX ecircumflex period -15
+KPX ecircumflex v -30
+KPX ecircumflex w -20
+KPX ecircumflex x -30
+KPX ecircumflex y -20
+KPX ecircumflex yacute -20
+KPX ecircumflex ydieresis -20
+KPX edieresis comma -15
+KPX edieresis period -15
+KPX edieresis v -30
+KPX edieresis w -20
+KPX edieresis x -30
+KPX edieresis y -20
+KPX edieresis yacute -20
+KPX edieresis ydieresis -20
+KPX edotaccent comma -15
+KPX edotaccent period -15
+KPX edotaccent v -30
+KPX edotaccent w -20
+KPX edotaccent x -30
+KPX edotaccent y -20
+KPX edotaccent yacute -20
+KPX edotaccent ydieresis -20
+KPX egrave comma -15
+KPX egrave period -15
+KPX egrave v -30
+KPX egrave w -20
+KPX egrave x -30
+KPX egrave y -20
+KPX egrave yacute -20
+KPX egrave ydieresis -20
+KPX emacron comma -15
+KPX emacron period -15
+KPX emacron v -30
+KPX emacron w -20
+KPX emacron x -30
+KPX emacron y -20
+KPX emacron yacute -20
+KPX emacron ydieresis -20
+KPX eogonek comma -15
+KPX eogonek period -15
+KPX eogonek v -30
+KPX eogonek w -20
+KPX eogonek x -30
+KPX eogonek y -20
+KPX eogonek yacute -20
+KPX eogonek ydieresis -20
+KPX f a -30
+KPX f aacute -30
+KPX f abreve -30
+KPX f acircumflex -30
+KPX f adieresis -30
+KPX f agrave -30
+KPX f amacron -30
+KPX f aogonek -30
+KPX f aring -30
+KPX f atilde -30
+KPX f comma -30
+KPX f dotlessi -28
+KPX f e -30
+KPX f eacute -30
+KPX f ecaron -30
+KPX f ecircumflex -30
+KPX f edieresis -30
+KPX f edotaccent -30
+KPX f egrave -30
+KPX f emacron -30
+KPX f eogonek -30
+KPX f o -30
+KPX f oacute -30
+KPX f ocircumflex -30
+KPX f odieresis -30
+KPX f ograve -30
+KPX f ohungarumlaut -30
+KPX f omacron -30
+KPX f oslash -30
+KPX f otilde -30
+KPX f period -30
+KPX f quotedblright 60
+KPX f quoteright 50
+KPX g r -10
+KPX g racute -10
+KPX g rcaron -10
+KPX g rcommaaccent -10
+KPX gbreve r -10
+KPX gbreve racute -10
+KPX gbreve rcaron -10
+KPX gbreve rcommaaccent -10
+KPX gcommaaccent r -10
+KPX gcommaaccent racute -10
+KPX gcommaaccent rcaron -10
+KPX gcommaaccent rcommaaccent -10
+KPX h y -30
+KPX h yacute -30
+KPX h ydieresis -30
+KPX k e -20
+KPX k eacute -20
+KPX k ecaron -20
+KPX k ecircumflex -20
+KPX k edieresis -20
+KPX k edotaccent -20
+KPX k egrave -20
+KPX k emacron -20
+KPX k eogonek -20
+KPX k o -20
+KPX k oacute -20
+KPX k ocircumflex -20
+KPX k odieresis -20
+KPX k ograve -20
+KPX k ohungarumlaut -20
+KPX k omacron -20
+KPX k oslash -20
+KPX k otilde -20
+KPX kcommaaccent e -20
+KPX kcommaaccent eacute -20
+KPX kcommaaccent ecaron -20
+KPX kcommaaccent ecircumflex -20
+KPX kcommaaccent edieresis -20
+KPX kcommaaccent edotaccent -20
+KPX kcommaaccent egrave -20
+KPX kcommaaccent emacron -20
+KPX kcommaaccent eogonek -20
+KPX kcommaaccent o -20
+KPX kcommaaccent oacute -20
+KPX kcommaaccent ocircumflex -20
+KPX kcommaaccent odieresis -20
+KPX kcommaaccent ograve -20
+KPX kcommaaccent ohungarumlaut -20
+KPX kcommaaccent omacron -20
+KPX kcommaaccent oslash -20
+KPX kcommaaccent otilde -20
+KPX m u -10
+KPX m uacute -10
+KPX m ucircumflex -10
+KPX m udieresis -10
+KPX m ugrave -10
+KPX m uhungarumlaut -10
+KPX m umacron -10
+KPX m uogonek -10
+KPX m uring -10
+KPX m y -15
+KPX m yacute -15
+KPX m ydieresis -15
+KPX n u -10
+KPX n uacute -10
+KPX n ucircumflex -10
+KPX n udieresis -10
+KPX n ugrave -10
+KPX n uhungarumlaut -10
+KPX n umacron -10
+KPX n uogonek -10
+KPX n uring -10
+KPX n v -20
+KPX n y -15
+KPX n yacute -15
+KPX n ydieresis -15
+KPX nacute u -10
+KPX nacute uacute -10
+KPX nacute ucircumflex -10
+KPX nacute udieresis -10
+KPX nacute ugrave -10
+KPX nacute uhungarumlaut -10
+KPX nacute umacron -10
+KPX nacute uogonek -10
+KPX nacute uring -10
+KPX nacute v -20
+KPX nacute y -15
+KPX nacute yacute -15
+KPX nacute ydieresis -15
+KPX ncaron u -10
+KPX ncaron uacute -10
+KPX ncaron ucircumflex -10
+KPX ncaron udieresis -10
+KPX ncaron ugrave -10
+KPX ncaron uhungarumlaut -10
+KPX ncaron umacron -10
+KPX ncaron uogonek -10
+KPX ncaron uring -10
+KPX ncaron v -20
+KPX ncaron y -15
+KPX ncaron yacute -15
+KPX ncaron ydieresis -15
+KPX ncommaaccent u -10
+KPX ncommaaccent uacute -10
+KPX ncommaaccent ucircumflex -10
+KPX ncommaaccent udieresis -10
+KPX ncommaaccent ugrave -10
+KPX ncommaaccent uhungarumlaut -10
+KPX ncommaaccent umacron -10
+KPX ncommaaccent uogonek -10
+KPX ncommaaccent uring -10
+KPX ncommaaccent v -20
+KPX ncommaaccent y -15
+KPX ncommaaccent yacute -15
+KPX ncommaaccent ydieresis -15
+KPX ntilde u -10
+KPX ntilde uacute -10
+KPX ntilde ucircumflex -10
+KPX ntilde udieresis -10
+KPX ntilde ugrave -10
+KPX ntilde uhungarumlaut -10
+KPX ntilde umacron -10
+KPX ntilde uogonek -10
+KPX ntilde uring -10
+KPX ntilde v -20
+KPX ntilde y -15
+KPX ntilde yacute -15
+KPX ntilde ydieresis -15
+KPX o comma -40
+KPX o period -40
+KPX o v -15
+KPX o w -15
+KPX o x -30
+KPX o y -30
+KPX o yacute -30
+KPX o ydieresis -30
+KPX oacute comma -40
+KPX oacute period -40
+KPX oacute v -15
+KPX oacute w -15
+KPX oacute x -30
+KPX oacute y -30
+KPX oacute yacute -30
+KPX oacute ydieresis -30
+KPX ocircumflex comma -40
+KPX ocircumflex period -40
+KPX ocircumflex v -15
+KPX ocircumflex w -15
+KPX ocircumflex x -30
+KPX ocircumflex y -30
+KPX ocircumflex yacute -30
+KPX ocircumflex ydieresis -30
+KPX odieresis comma -40
+KPX odieresis period -40
+KPX odieresis v -15
+KPX odieresis w -15
+KPX odieresis x -30
+KPX odieresis y -30
+KPX odieresis yacute -30
+KPX odieresis ydieresis -30
+KPX ograve comma -40
+KPX ograve period -40
+KPX ograve v -15
+KPX ograve w -15
+KPX ograve x -30
+KPX ograve y -30
+KPX ograve yacute -30
+KPX ograve ydieresis -30
+KPX ohungarumlaut comma -40
+KPX ohungarumlaut period -40
+KPX ohungarumlaut v -15
+KPX ohungarumlaut w -15
+KPX ohungarumlaut x -30
+KPX ohungarumlaut y -30
+KPX ohungarumlaut yacute -30
+KPX ohungarumlaut ydieresis -30
+KPX omacron comma -40
+KPX omacron period -40
+KPX omacron v -15
+KPX omacron w -15
+KPX omacron x -30
+KPX omacron y -30
+KPX omacron yacute -30
+KPX omacron ydieresis -30
+KPX oslash a -55
+KPX oslash aacute -55
+KPX oslash abreve -55
+KPX oslash acircumflex -55
+KPX oslash adieresis -55
+KPX oslash agrave -55
+KPX oslash amacron -55
+KPX oslash aogonek -55
+KPX oslash aring -55
+KPX oslash atilde -55
+KPX oslash b -55
+KPX oslash c -55
+KPX oslash cacute -55
+KPX oslash ccaron -55
+KPX oslash ccedilla -55
+KPX oslash comma -95
+KPX oslash d -55
+KPX oslash dcroat -55
+KPX oslash e -55
+KPX oslash eacute -55
+KPX oslash ecaron -55
+KPX oslash ecircumflex -55
+KPX oslash edieresis -55
+KPX oslash edotaccent -55
+KPX oslash egrave -55
+KPX oslash emacron -55
+KPX oslash eogonek -55
+KPX oslash f -55
+KPX oslash g -55
+KPX oslash gbreve -55
+KPX oslash gcommaaccent -55
+KPX oslash h -55
+KPX oslash i -55
+KPX oslash iacute -55
+KPX oslash icircumflex -55
+KPX oslash idieresis -55
+KPX oslash igrave -55
+KPX oslash imacron -55
+KPX oslash iogonek -55
+KPX oslash j -55
+KPX oslash k -55
+KPX oslash kcommaaccent -55
+KPX oslash l -55
+KPX oslash lacute -55
+KPX oslash lcommaaccent -55
+KPX oslash lslash -55
+KPX oslash m -55
+KPX oslash n -55
+KPX oslash nacute -55
+KPX oslash ncaron -55
+KPX oslash ncommaaccent -55
+KPX oslash ntilde -55
+KPX oslash o -55
+KPX oslash oacute -55
+KPX oslash ocircumflex -55
+KPX oslash odieresis -55
+KPX oslash ograve -55
+KPX oslash ohungarumlaut -55
+KPX oslash omacron -55
+KPX oslash oslash -55
+KPX oslash otilde -55
+KPX oslash p -55
+KPX oslash period -95
+KPX oslash q -55
+KPX oslash r -55
+KPX oslash racute -55
+KPX oslash rcaron -55
+KPX oslash rcommaaccent -55
+KPX oslash s -55
+KPX oslash sacute -55
+KPX oslash scaron -55
+KPX oslash scedilla -55
+KPX oslash scommaaccent -55
+KPX oslash t -55
+KPX oslash tcommaaccent -55
+KPX oslash u -55
+KPX oslash uacute -55
+KPX oslash ucircumflex -55
+KPX oslash udieresis -55
+KPX oslash ugrave -55
+KPX oslash uhungarumlaut -55
+KPX oslash umacron -55
+KPX oslash uogonek -55
+KPX oslash uring -55
+KPX oslash v -70
+KPX oslash w -70
+KPX oslash x -85
+KPX oslash y -70
+KPX oslash yacute -70
+KPX oslash ydieresis -70
+KPX oslash z -55
+KPX oslash zacute -55
+KPX oslash zcaron -55
+KPX oslash zdotaccent -55
+KPX otilde comma -40
+KPX otilde period -40
+KPX otilde v -15
+KPX otilde w -15
+KPX otilde x -30
+KPX otilde y -30
+KPX otilde yacute -30
+KPX otilde ydieresis -30
+KPX p comma -35
+KPX p period -35
+KPX p y -30
+KPX p yacute -30
+KPX p ydieresis -30
+KPX period quotedblright -100
+KPX period quoteright -100
+KPX period space -60
+KPX quotedblright space -40
+KPX quoteleft quoteleft -57
+KPX quoteright d -50
+KPX quoteright dcroat -50
+KPX quoteright quoteright -57
+KPX quoteright r -50
+KPX quoteright racute -50
+KPX quoteright rcaron -50
+KPX quoteright rcommaaccent -50
+KPX quoteright s -50
+KPX quoteright sacute -50
+KPX quoteright scaron -50
+KPX quoteright scedilla -50
+KPX quoteright scommaaccent -50
+KPX quoteright space -70
+KPX r a -10
+KPX r aacute -10
+KPX r abreve -10
+KPX r acircumflex -10
+KPX r adieresis -10
+KPX r agrave -10
+KPX r amacron -10
+KPX r aogonek -10
+KPX r aring -10
+KPX r atilde -10
+KPX r colon 30
+KPX r comma -50
+KPX r i 15
+KPX r iacute 15
+KPX r icircumflex 15
+KPX r idieresis 15
+KPX r igrave 15
+KPX r imacron 15
+KPX r iogonek 15
+KPX r k 15
+KPX r kcommaaccent 15
+KPX r l 15
+KPX r lacute 15
+KPX r lcommaaccent 15
+KPX r lslash 15
+KPX r m 25
+KPX r n 25
+KPX r nacute 25
+KPX r ncaron 25
+KPX r ncommaaccent 25
+KPX r ntilde 25
+KPX r p 30
+KPX r period -50
+KPX r semicolon 30
+KPX r t 40
+KPX r tcommaaccent 40
+KPX r u 15
+KPX r uacute 15
+KPX r ucircumflex 15
+KPX r udieresis 15
+KPX r ugrave 15
+KPX r uhungarumlaut 15
+KPX r umacron 15
+KPX r uogonek 15
+KPX r uring 15
+KPX r v 30
+KPX r y 30
+KPX r yacute 30
+KPX r ydieresis 30
+KPX racute a -10
+KPX racute aacute -10
+KPX racute abreve -10
+KPX racute acircumflex -10
+KPX racute adieresis -10
+KPX racute agrave -10
+KPX racute amacron -10
+KPX racute aogonek -10
+KPX racute aring -10
+KPX racute atilde -10
+KPX racute colon 30
+KPX racute comma -50
+KPX racute i 15
+KPX racute iacute 15
+KPX racute icircumflex 15
+KPX racute idieresis 15
+KPX racute igrave 15
+KPX racute imacron 15
+KPX racute iogonek 15
+KPX racute k 15
+KPX racute kcommaaccent 15
+KPX racute l 15
+KPX racute lacute 15
+KPX racute lcommaaccent 15
+KPX racute lslash 15
+KPX racute m 25
+KPX racute n 25
+KPX racute nacute 25
+KPX racute ncaron 25
+KPX racute ncommaaccent 25
+KPX racute ntilde 25
+KPX racute p 30
+KPX racute period -50
+KPX racute semicolon 30
+KPX racute t 40
+KPX racute tcommaaccent 40
+KPX racute u 15
+KPX racute uacute 15
+KPX racute ucircumflex 15
+KPX racute udieresis 15
+KPX racute ugrave 15
+KPX racute uhungarumlaut 15
+KPX racute umacron 15
+KPX racute uogonek 15
+KPX racute uring 15
+KPX racute v 30
+KPX racute y 30
+KPX racute yacute 30
+KPX racute ydieresis 30
+KPX rcaron a -10
+KPX rcaron aacute -10
+KPX rcaron abreve -10
+KPX rcaron acircumflex -10
+KPX rcaron adieresis -10
+KPX rcaron agrave -10
+KPX rcaron amacron -10
+KPX rcaron aogonek -10
+KPX rcaron aring -10
+KPX rcaron atilde -10
+KPX rcaron colon 30
+KPX rcaron comma -50
+KPX rcaron i 15
+KPX rcaron iacute 15
+KPX rcaron icircumflex 15
+KPX rcaron idieresis 15
+KPX rcaron igrave 15
+KPX rcaron imacron 15
+KPX rcaron iogonek 15
+KPX rcaron k 15
+KPX rcaron kcommaaccent 15
+KPX rcaron l 15
+KPX rcaron lacute 15
+KPX rcaron lcommaaccent 15
+KPX rcaron lslash 15
+KPX rcaron m 25
+KPX rcaron n 25
+KPX rcaron nacute 25
+KPX rcaron ncaron 25
+KPX rcaron ncommaaccent 25
+KPX rcaron ntilde 25
+KPX rcaron p 30
+KPX rcaron period -50
+KPX rcaron semicolon 30
+KPX rcaron t 40
+KPX rcaron tcommaaccent 40
+KPX rcaron u 15
+KPX rcaron uacute 15
+KPX rcaron ucircumflex 15
+KPX rcaron udieresis 15
+KPX rcaron ugrave 15
+KPX rcaron uhungarumlaut 15
+KPX rcaron umacron 15
+KPX rcaron uogonek 15
+KPX rcaron uring 15
+KPX rcaron v 30
+KPX rcaron y 30
+KPX rcaron yacute 30
+KPX rcaron ydieresis 30
+KPX rcommaaccent a -10
+KPX rcommaaccent aacute -10
+KPX rcommaaccent abreve -10
+KPX rcommaaccent acircumflex -10
+KPX rcommaaccent adieresis -10
+KPX rcommaaccent agrave -10
+KPX rcommaaccent amacron -10
+KPX rcommaaccent aogonek -10
+KPX rcommaaccent aring -10
+KPX rcommaaccent atilde -10
+KPX rcommaaccent colon 30
+KPX rcommaaccent comma -50
+KPX rcommaaccent i 15
+KPX rcommaaccent iacute 15
+KPX rcommaaccent icircumflex 15
+KPX rcommaaccent idieresis 15
+KPX rcommaaccent igrave 15
+KPX rcommaaccent imacron 15
+KPX rcommaaccent iogonek 15
+KPX rcommaaccent k 15
+KPX rcommaaccent kcommaaccent 15
+KPX rcommaaccent l 15
+KPX rcommaaccent lacute 15
+KPX rcommaaccent lcommaaccent 15
+KPX rcommaaccent lslash 15
+KPX rcommaaccent m 25
+KPX rcommaaccent n 25
+KPX rcommaaccent nacute 25
+KPX rcommaaccent ncaron 25
+KPX rcommaaccent ncommaaccent 25
+KPX rcommaaccent ntilde 25
+KPX rcommaaccent p 30
+KPX rcommaaccent period -50
+KPX rcommaaccent semicolon 30
+KPX rcommaaccent t 40
+KPX rcommaaccent tcommaaccent 40
+KPX rcommaaccent u 15
+KPX rcommaaccent uacute 15
+KPX rcommaaccent ucircumflex 15
+KPX rcommaaccent udieresis 15
+KPX rcommaaccent ugrave 15
+KPX rcommaaccent uhungarumlaut 15
+KPX rcommaaccent umacron 15
+KPX rcommaaccent uogonek 15
+KPX rcommaaccent uring 15
+KPX rcommaaccent v 30
+KPX rcommaaccent y 30
+KPX rcommaaccent yacute 30
+KPX rcommaaccent ydieresis 30
+KPX s comma -15
+KPX s period -15
+KPX s w -30
+KPX sacute comma -15
+KPX sacute period -15
+KPX sacute w -30
+KPX scaron comma -15
+KPX scaron period -15
+KPX scaron w -30
+KPX scedilla comma -15
+KPX scedilla period -15
+KPX scedilla w -30
+KPX scommaaccent comma -15
+KPX scommaaccent period -15
+KPX scommaaccent w -30
+KPX semicolon space -50
+KPX space T -50
+KPX space Tcaron -50
+KPX space Tcommaaccent -50
+KPX space V -50
+KPX space W -40
+KPX space Y -90
+KPX space Yacute -90
+KPX space Ydieresis -90
+KPX space quotedblleft -30
+KPX space quoteleft -60
+KPX v a -25
+KPX v aacute -25
+KPX v abreve -25
+KPX v acircumflex -25
+KPX v adieresis -25
+KPX v agrave -25
+KPX v amacron -25
+KPX v aogonek -25
+KPX v aring -25
+KPX v atilde -25
+KPX v comma -80
+KPX v e -25
+KPX v eacute -25
+KPX v ecaron -25
+KPX v ecircumflex -25
+KPX v edieresis -25
+KPX v edotaccent -25
+KPX v egrave -25
+KPX v emacron -25
+KPX v eogonek -25
+KPX v o -25
+KPX v oacute -25
+KPX v ocircumflex -25
+KPX v odieresis -25
+KPX v ograve -25
+KPX v ohungarumlaut -25
+KPX v omacron -25
+KPX v oslash -25
+KPX v otilde -25
+KPX v period -80
+KPX w a -15
+KPX w aacute -15
+KPX w abreve -15
+KPX w acircumflex -15
+KPX w adieresis -15
+KPX w agrave -15
+KPX w amacron -15
+KPX w aogonek -15
+KPX w aring -15
+KPX w atilde -15
+KPX w comma -60
+KPX w e -10
+KPX w eacute -10
+KPX w ecaron -10
+KPX w ecircumflex -10
+KPX w edieresis -10
+KPX w edotaccent -10
+KPX w egrave -10
+KPX w emacron -10
+KPX w eogonek -10
+KPX w o -10
+KPX w oacute -10
+KPX w ocircumflex -10
+KPX w odieresis -10
+KPX w ograve -10
+KPX w ohungarumlaut -10
+KPX w omacron -10
+KPX w oslash -10
+KPX w otilde -10
+KPX w period -60
+KPX x e -30
+KPX x eacute -30
+KPX x ecaron -30
+KPX x ecircumflex -30
+KPX x edieresis -30
+KPX x edotaccent -30
+KPX x egrave -30
+KPX x emacron -30
+KPX x eogonek -30
+KPX y a -20
+KPX y aacute -20
+KPX y abreve -20
+KPX y acircumflex -20
+KPX y adieresis -20
+KPX y agrave -20
+KPX y amacron -20
+KPX y aogonek -20
+KPX y aring -20
+KPX y atilde -20
+KPX y comma -100
+KPX y e -20
+KPX y eacute -20
+KPX y ecaron -20
+KPX y ecircumflex -20
+KPX y edieresis -20
+KPX y edotaccent -20
+KPX y egrave -20
+KPX y emacron -20
+KPX y eogonek -20
+KPX y o -20
+KPX y oacute -20
+KPX y ocircumflex -20
+KPX y odieresis -20
+KPX y ograve -20
+KPX y ohungarumlaut -20
+KPX y omacron -20
+KPX y oslash -20
+KPX y otilde -20
+KPX y period -100
+KPX yacute a -20
+KPX yacute aacute -20
+KPX yacute abreve -20
+KPX yacute acircumflex -20
+KPX yacute adieresis -20
+KPX yacute agrave -20
+KPX yacute amacron -20
+KPX yacute aogonek -20
+KPX yacute aring -20
+KPX yacute atilde -20
+KPX yacute comma -100
+KPX yacute e -20
+KPX yacute eacute -20
+KPX yacute ecaron -20
+KPX yacute ecircumflex -20
+KPX yacute edieresis -20
+KPX yacute edotaccent -20
+KPX yacute egrave -20
+KPX yacute emacron -20
+KPX yacute eogonek -20
+KPX yacute o -20
+KPX yacute oacute -20
+KPX yacute ocircumflex -20
+KPX yacute odieresis -20
+KPX yacute ograve -20
+KPX yacute ohungarumlaut -20
+KPX yacute omacron -20
+KPX yacute oslash -20
+KPX yacute otilde -20
+KPX yacute period -100
+KPX ydieresis a -20
+KPX ydieresis aacute -20
+KPX ydieresis abreve -20
+KPX ydieresis acircumflex -20
+KPX ydieresis adieresis -20
+KPX ydieresis agrave -20
+KPX ydieresis amacron -20
+KPX ydieresis aogonek -20
+KPX ydieresis aring -20
+KPX ydieresis atilde -20
+KPX ydieresis comma -100
+KPX ydieresis e -20
+KPX ydieresis eacute -20
+KPX ydieresis ecaron -20
+KPX ydieresis ecircumflex -20
+KPX ydieresis edieresis -20
+KPX ydieresis edotaccent -20
+KPX ydieresis egrave -20
+KPX ydieresis emacron -20
+KPX ydieresis eogonek -20
+KPX ydieresis o -20
+KPX ydieresis oacute -20
+KPX ydieresis ocircumflex -20
+KPX ydieresis odieresis -20
+KPX ydieresis ograve -20
+KPX ydieresis ohungarumlaut -20
+KPX ydieresis omacron -20
+KPX ydieresis oslash -20
+KPX ydieresis otilde -20
+KPX ydieresis period -100
+KPX z e -15
+KPX z eacute -15
+KPX z ecaron -15
+KPX z ecircumflex -15
+KPX z edieresis -15
+KPX z edotaccent -15
+KPX z egrave -15
+KPX z emacron -15
+KPX z eogonek -15
+KPX z o -15
+KPX z oacute -15
+KPX z ocircumflex -15
+KPX z odieresis -15
+KPX z ograve -15
+KPX z ohungarumlaut -15
+KPX z omacron -15
+KPX z oslash -15
+KPX z otilde -15
+KPX zacute e -15
+KPX zacute eacute -15
+KPX zacute ecaron -15
+KPX zacute ecircumflex -15
+KPX zacute edieresis -15
+KPX zacute edotaccent -15
+KPX zacute egrave -15
+KPX zacute emacron -15
+KPX zacute eogonek -15
+KPX zacute o -15
+KPX zacute oacute -15
+KPX zacute ocircumflex -15
+KPX zacute odieresis -15
+KPX zacute ograve -15
+KPX zacute ohungarumlaut -15
+KPX zacute omacron -15
+KPX zacute oslash -15
+KPX zacute otilde -15
+KPX zcaron e -15
+KPX zcaron eacute -15
+KPX zcaron ecaron -15
+KPX zcaron ecircumflex -15
+KPX zcaron edieresis -15
+KPX zcaron edotaccent -15
+KPX zcaron egrave -15
+KPX zcaron emacron -15
+KPX zcaron eogonek -15
+KPX zcaron o -15
+KPX zcaron oacute -15
+KPX zcaron ocircumflex -15
+KPX zcaron odieresis -15
+KPX zcaron ograve -15
+KPX zcaron ohungarumlaut -15
+KPX zcaron omacron -15
+KPX zcaron oslash -15
+KPX zcaron otilde -15
+KPX zdotaccent e -15
+KPX zdotaccent eacute -15
+KPX zdotaccent ecaron -15
+KPX zdotaccent ecircumflex -15
+KPX zdotaccent edieresis -15
+KPX zdotaccent edotaccent -15
+KPX zdotaccent egrave -15
+KPX zdotaccent emacron -15
+KPX zdotaccent eogonek -15
+KPX zdotaccent o -15
+KPX zdotaccent oacute -15
+KPX zdotaccent ocircumflex -15
+KPX zdotaccent odieresis -15
+KPX zdotaccent ograve -15
+KPX zdotaccent ohungarumlaut -15
+KPX zdotaccent omacron -15
+KPX zdotaccent oslash -15
+KPX zdotaccent otilde -15
+EndKernPairs
+EndKernData
+EndFontMetrics
diff --git a/src/main/resources/com/lowagie/text/pdf/fonts/Symbol.afm b/src/main/resources/com/lowagie/text/pdf/fonts/Symbol.afm
new file mode 100644
index 0000000..524cfb6
--- /dev/null
+++ b/src/main/resources/com/lowagie/text/pdf/fonts/Symbol.afm
@@ -0,0 +1,213 @@
+StartFontMetrics 4.1
+Comment Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All rights reserved.
+Comment Creation Date: Thu May 1 15:12:25 1997
+Comment UniqueID 43064
+Comment VMusage 30820 39997
+FontName Symbol
+FullName Symbol
+FamilyName Symbol
+Weight Medium
+ItalicAngle 0
+IsFixedPitch false
+CharacterSet Special
+FontBBox -180 -293 1090 1010
+UnderlinePosition -100
+UnderlineThickness 50
+Version 001.008
+Notice Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All rights reserved.
+EncodingScheme FontSpecific
+StdHW 92
+StdVW 85
+StartCharMetrics 190
+C 32 ; WX 250 ; N space ; B 0 0 0 0 ;
+C 33 ; WX 333 ; N exclam ; B 128 -17 240 672 ;
+C 34 ; WX 713 ; N universal ; B 31 0 681 705 ;
+C 35 ; WX 500 ; N numbersign ; B 20 -16 481 673 ;
+C 36 ; WX 549 ; N existential ; B 25 0 478 707 ;
+C 37 ; WX 833 ; N percent ; B 63 -36 771 655 ;
+C 38 ; WX 778 ; N ampersand ; B 41 -18 750 661 ;
+C 39 ; WX 439 ; N suchthat ; B 48 -17 414 500 ;
+C 40 ; WX 333 ; N parenleft ; B 53 -191 300 673 ;
+C 41 ; WX 333 ; N parenright ; B 30 -191 277 673 ;
+C 42 ; WX 500 ; N asteriskmath ; B 65 134 427 551 ;
+C 43 ; WX 549 ; N plus ; B 10 0 539 533 ;
+C 44 ; WX 250 ; N comma ; B 56 -152 194 104 ;
+C 45 ; WX 549 ; N minus ; B 11 233 535 288 ;
+C 46 ; WX 250 ; N period ; B 69 -17 181 95 ;
+C 47 ; WX 278 ; N slash ; B 0 -18 254 646 ;
+C 48 ; WX 500 ; N zero ; B 24 -14 476 685 ;
+C 49 ; WX 500 ; N one ; B 117 0 390 673 ;
+C 50 ; WX 500 ; N two ; B 25 0 475 685 ;
+C 51 ; WX 500 ; N three ; B 43 -14 435 685 ;
+C 52 ; WX 500 ; N four ; B 15 0 469 685 ;
+C 53 ; WX 500 ; N five ; B 32 -14 445 690 ;
+C 54 ; WX 500 ; N six ; B 34 -14 468 685 ;
+C 55 ; WX 500 ; N seven ; B 24 -16 448 673 ;
+C 56 ; WX 500 ; N eight ; B 56 -14 445 685 ;
+C 57 ; WX 500 ; N nine ; B 30 -18 459 685 ;
+C 58 ; WX 278 ; N colon ; B 81 -17 193 460 ;
+C 59 ; WX 278 ; N semicolon ; B 83 -152 221 460 ;
+C 60 ; WX 549 ; N less ; B 26 0 523 522 ;
+C 61 ; WX 549 ; N equal ; B 11 141 537 390 ;
+C 62 ; WX 549 ; N greater ; B 26 0 523 522 ;
+C 63 ; WX 444 ; N question ; B 70 -17 412 686 ;
+C 64 ; WX 549 ; N congruent ; B 11 0 537 475 ;
+C 65 ; WX 722 ; N Alpha ; B 4 0 684 673 ;
+C 66 ; WX 667 ; N Beta ; B 29 0 592 673 ;
+C 67 ; WX 722 ; N Chi ; B -9 0 704 673 ;
+C 68 ; WX 612 ; N Delta ; B 6 0 608 688 ;
+C 69 ; WX 611 ; N Epsilon ; B 32 0 617 673 ;
+C 70 ; WX 763 ; N Phi ; B 26 0 741 673 ;
+C 71 ; WX 603 ; N Gamma ; B 24 0 609 673 ;
+C 72 ; WX 722 ; N Eta ; B 39 0 729 673 ;
+C 73 ; WX 333 ; N Iota ; B 32 0 316 673 ;
+C 74 ; WX 631 ; N theta1 ; B 18 -18 623 689 ;
+C 75 ; WX 722 ; N Kappa ; B 35 0 722 673 ;
+C 76 ; WX 686 ; N Lambda ; B 6 0 680 688 ;
+C 77 ; WX 889 ; N Mu ; B 28 0 887 673 ;
+C 78 ; WX 722 ; N Nu ; B 29 -8 720 673 ;
+C 79 ; WX 722 ; N Omicron ; B 41 -17 715 685 ;
+C 80 ; WX 768 ; N Pi ; B 25 0 745 673 ;
+C 81 ; WX 741 ; N Theta ; B 41 -17 715 685 ;
+C 82 ; WX 556 ; N Rho ; B 28 0 563 673 ;
+C 83 ; WX 592 ; N Sigma ; B 5 0 589 673 ;
+C 84 ; WX 611 ; N Tau ; B 33 0 607 673 ;
+C 85 ; WX 690 ; N Upsilon ; B -8 0 694 673 ;
+C 86 ; WX 439 ; N sigma1 ; B 40 -233 436 500 ;
+C 87 ; WX 768 ; N Omega ; B 34 0 736 688 ;
+C 88 ; WX 645 ; N Xi ; B 40 0 599 673 ;
+C 89 ; WX 795 ; N Psi ; B 15 0 781 684 ;
+C 90 ; WX 611 ; N Zeta ; B 44 0 636 673 ;
+C 91 ; WX 333 ; N bracketleft ; B 86 -155 299 674 ;
+C 92 ; WX 863 ; N therefore ; B 163 0 701 487 ;
+C 93 ; WX 333 ; N bracketright ; B 33 -155 246 674 ;
+C 94 ; WX 658 ; N perpendicular ; B 15 0 652 674 ;
+C 95 ; WX 500 ; N underscore ; B -2 -125 502 -75 ;
+C 96 ; WX 500 ; N radicalex ; B 480 881 1090 917 ;
+C 97 ; WX 631 ; N alpha ; B 41 -18 622 500 ;
+C 98 ; WX 549 ; N beta ; B 61 -223 515 741 ;
+C 99 ; WX 549 ; N chi ; B 12 -231 522 499 ;
+C 100 ; WX 494 ; N delta ; B 40 -19 481 740 ;
+C 101 ; WX 439 ; N epsilon ; B 22 -19 427 502 ;
+C 102 ; WX 521 ; N phi ; B 28 -224 492 673 ;
+C 103 ; WX 411 ; N gamma ; B 5 -225 484 499 ;
+C 104 ; WX 603 ; N eta ; B 0 -202 527 514 ;
+C 105 ; WX 329 ; N iota ; B 0 -17 301 503 ;
+C 106 ; WX 603 ; N phi1 ; B 36 -224 587 499 ;
+C 107 ; WX 549 ; N kappa ; B 33 0 558 501 ;
+C 108 ; WX 549 ; N lambda ; B 24 -17 548 739 ;
+C 109 ; WX 576 ; N mu ; B 33 -223 567 500 ;
+C 110 ; WX 521 ; N nu ; B -9 -16 475 507 ;
+C 111 ; WX 549 ; N omicron ; B 35 -19 501 499 ;
+C 112 ; WX 549 ; N pi ; B 10 -19 530 487 ;
+C 113 ; WX 521 ; N theta ; B 43 -17 485 690 ;
+C 114 ; WX 549 ; N rho ; B 50 -230 490 499 ;
+C 115 ; WX 603 ; N sigma ; B 30 -21 588 500 ;
+C 116 ; WX 439 ; N tau ; B 10 -19 418 500 ;
+C 117 ; WX 576 ; N upsilon ; B 7 -18 535 507 ;
+C 118 ; WX 713 ; N omega1 ; B 12 -18 671 583 ;
+C 119 ; WX 686 ; N omega ; B 42 -17 684 500 ;
+C 120 ; WX 493 ; N xi ; B 27 -224 469 766 ;
+C 121 ; WX 686 ; N psi ; B 12 -228 701 500 ;
+C 122 ; WX 494 ; N zeta ; B 60 -225 467 756 ;
+C 123 ; WX 480 ; N braceleft ; B 58 -183 397 673 ;
+C 124 ; WX 200 ; N bar ; B 65 -293 135 707 ;
+C 125 ; WX 480 ; N braceright ; B 79 -183 418 673 ;
+C 126 ; WX 549 ; N similar ; B 17 203 529 307 ;
+C 160 ; WX 750 ; N Euro ; B 20 -12 714 685 ;
+C 161 ; WX 620 ; N Upsilon1 ; B -2 0 610 685 ;
+C 162 ; WX 247 ; N minute ; B 27 459 228 735 ;
+C 163 ; WX 549 ; N lessequal ; B 29 0 526 639 ;
+C 164 ; WX 167 ; N fraction ; B -180 -12 340 677 ;
+C 165 ; WX 713 ; N infinity ; B 26 124 688 404 ;
+C 166 ; WX 500 ; N florin ; B 2 -193 494 686 ;
+C 167 ; WX 753 ; N club ; B 86 -26 660 533 ;
+C 168 ; WX 753 ; N diamond ; B 142 -36 600 550 ;
+C 169 ; WX 753 ; N heart ; B 117 -33 631 532 ;
+C 170 ; WX 753 ; N spade ; B 113 -36 629 548 ;
+C 171 ; WX 1042 ; N arrowboth ; B 24 -15 1024 511 ;
+C 172 ; WX 987 ; N arrowleft ; B 32 -15 942 511 ;
+C 173 ; WX 603 ; N arrowup ; B 45 0 571 910 ;
+C 174 ; WX 987 ; N arrowright ; B 49 -15 959 511 ;
+C 175 ; WX 603 ; N arrowdown ; B 45 -22 571 888 ;
+C 176 ; WX 400 ; N degree ; B 50 385 350 685 ;
+C 177 ; WX 549 ; N plusminus ; B 10 0 539 645 ;
+C 178 ; WX 411 ; N second ; B 20 459 413 737 ;
+C 179 ; WX 549 ; N greaterequal ; B 29 0 526 639 ;
+C 180 ; WX 549 ; N multiply ; B 17 8 533 524 ;
+C 181 ; WX 713 ; N proportional ; B 27 123 639 404 ;
+C 182 ; WX 494 ; N partialdiff ; B 26 -20 462 746 ;
+C 183 ; WX 460 ; N bullet ; B 50 113 410 473 ;
+C 184 ; WX 549 ; N divide ; B 10 71 536 456 ;
+C 185 ; WX 549 ; N notequal ; B 15 -25 540 549 ;
+C 186 ; WX 549 ; N equivalence ; B 14 82 538 443 ;
+C 187 ; WX 549 ; N approxequal ; B 14 135 527 394 ;
+C 188 ; WX 1000 ; N ellipsis ; B 111 -17 889 95 ;
+C 189 ; WX 603 ; N arrowvertex ; B 280 -120 336 1010 ;
+C 190 ; WX 1000 ; N arrowhorizex ; B -60 220 1050 276 ;
+C 191 ; WX 658 ; N carriagereturn ; B 15 -16 602 629 ;
+C 192 ; WX 823 ; N aleph ; B 175 -18 661 658 ;
+C 193 ; WX 686 ; N Ifraktur ; B 10 -53 578 740 ;
+C 194 ; WX 795 ; N Rfraktur ; B 26 -15 759 734 ;
+C 195 ; WX 987 ; N weierstrass ; B 159 -211 870 573 ;
+C 196 ; WX 768 ; N circlemultiply ; B 43 -17 733 673 ;
+C 197 ; WX 768 ; N circleplus ; B 43 -15 733 675 ;
+C 198 ; WX 823 ; N emptyset ; B 39 -24 781 719 ;
+C 199 ; WX 768 ; N intersection ; B 40 0 732 509 ;
+C 200 ; WX 768 ; N union ; B 40 -17 732 492 ;
+C 201 ; WX 713 ; N propersuperset ; B 20 0 673 470 ;
+C 202 ; WX 713 ; N reflexsuperset ; B 20 -125 673 470 ;
+C 203 ; WX 713 ; N notsubset ; B 36 -70 690 540 ;
+C 204 ; WX 713 ; N propersubset ; B 37 0 690 470 ;
+C 205 ; WX 713 ; N reflexsubset ; B 37 -125 690 470 ;
+C 206 ; WX 713 ; N element ; B 45 0 505 468 ;
+C 207 ; WX 713 ; N notelement ; B 45 -58 505 555 ;
+C 208 ; WX 768 ; N angle ; B 26 0 738 673 ;
+C 209 ; WX 713 ; N gradient ; B 36 -19 681 718 ;
+C 210 ; WX 790 ; N registerserif ; B 50 -17 740 673 ;
+C 211 ; WX 790 ; N copyrightserif ; B 51 -15 741 675 ;
+C 212 ; WX 890 ; N trademarkserif ; B 18 293 855 673 ;
+C 213 ; WX 823 ; N product ; B 25 -101 803 751 ;
+C 214 ; WX 549 ; N radical ; B 10 -38 515 917 ;
+C 215 ; WX 250 ; N dotmath ; B 69 210 169 310 ;
+C 216 ; WX 713 ; N logicalnot ; B 15 0 680 288 ;
+C 217 ; WX 603 ; N logicaland ; B 23 0 583 454 ;
+C 218 ; WX 603 ; N logicalor ; B 30 0 578 477 ;
+C 219 ; WX 1042 ; N arrowdblboth ; B 27 -20 1023 510 ;
+C 220 ; WX 987 ; N arrowdblleft ; B 30 -15 939 513 ;
+C 221 ; WX 603 ; N arrowdblup ; B 39 2 567 911 ;
+C 222 ; WX 987 ; N arrowdblright ; B 45 -20 954 508 ;
+C 223 ; WX 603 ; N arrowdbldown ; B 44 -19 572 890 ;
+C 224 ; WX 494 ; N lozenge ; B 18 0 466 745 ;
+C 225 ; WX 329 ; N angleleft ; B 25 -198 306 746 ;
+C 226 ; WX 790 ; N registersans ; B 50 -20 740 670 ;
+C 227 ; WX 790 ; N copyrightsans ; B 49 -15 739 675 ;
+C 228 ; WX 786 ; N trademarksans ; B 5 293 725 673 ;
+C 229 ; WX 713 ; N summation ; B 14 -108 695 752 ;
+C 230 ; WX 384 ; N parenlefttp ; B 24 -293 436 926 ;
+C 231 ; WX 384 ; N parenleftex ; B 24 -85 108 925 ;
+C 232 ; WX 384 ; N parenleftbt ; B 24 -293 436 926 ;
+C 233 ; WX 384 ; N bracketlefttp ; B 0 -80 349 926 ;
+C 234 ; WX 384 ; N bracketleftex ; B 0 -79 77 925 ;
+C 235 ; WX 384 ; N bracketleftbt ; B 0 -80 349 926 ;
+C 236 ; WX 494 ; N bracelefttp ; B 209 -85 445 925 ;
+C 237 ; WX 494 ; N braceleftmid ; B 20 -85 284 935 ;
+C 238 ; WX 494 ; N braceleftbt ; B 209 -75 445 935 ;
+C 239 ; WX 494 ; N braceex ; B 209 -85 284 935 ;
+C 241 ; WX 329 ; N angleright ; B 21 -198 302 746 ;
+C 242 ; WX 274 ; N integral ; B 2 -107 291 916 ;
+C 243 ; WX 686 ; N integraltp ; B 308 -88 675 920 ;
+C 244 ; WX 686 ; N integralex ; B 308 -88 378 975 ;
+C 245 ; WX 686 ; N integralbt ; B 11 -87 378 921 ;
+C 246 ; WX 384 ; N parenrighttp ; B 54 -293 466 926 ;
+C 247 ; WX 384 ; N parenrightex ; B 382 -85 466 925 ;
+C 248 ; WX 384 ; N parenrightbt ; B 54 -293 466 926 ;
+C 249 ; WX 384 ; N bracketrighttp ; B 22 -80 371 926 ;
+C 250 ; WX 384 ; N bracketrightex ; B 294 -79 371 925 ;
+C 251 ; WX 384 ; N bracketrightbt ; B 22 -80 371 926 ;
+C 252 ; WX 494 ; N bracerighttp ; B 48 -85 284 925 ;
+C 253 ; WX 494 ; N bracerightmid ; B 209 -85 473 935 ;
+C 254 ; WX 494 ; N bracerightbt ; B 48 -75 284 935 ;
+C -1 ; WX 790 ; N apple ; B 56 -3 733 808 ;
+EndCharMetrics
+EndFontMetrics
diff --git a/src/main/resources/com/lowagie/text/pdf/fonts/Times-Bold.afm b/src/main/resources/com/lowagie/text/pdf/fonts/Times-Bold.afm
new file mode 100644
index 0000000..ee718a2
--- /dev/null
+++ b/src/main/resources/com/lowagie/text/pdf/fonts/Times-Bold.afm
@@ -0,0 +1,2588 @@
+StartFontMetrics 4.1
+Comment Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.
+Comment Creation Date: Thu May 1 12:52:56 1997
+Comment UniqueID 43065
+Comment VMusage 41636 52661
+FontName Times-Bold
+FullName Times Bold
+FamilyName Times
+Weight Bold
+ItalicAngle 0
+IsFixedPitch false
+CharacterSet ExtendedRoman
+FontBBox -168 -218 1000 935
+UnderlinePosition -100
+UnderlineThickness 50
+Version 002.000
+Notice Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.Times is a trademark of Linotype-Hell AG and/or its subsidiaries.
+EncodingScheme AdobeStandardEncoding
+CapHeight 676
+XHeight 461
+Ascender 683
+Descender -217
+StdHW 44
+StdVW 139
+StartCharMetrics 315
+C 32 ; WX 250 ; N space ; B 0 0 0 0 ;
+C 33 ; WX 333 ; N exclam ; B 81 -13 251 691 ;
+C 34 ; WX 555 ; N quotedbl ; B 83 404 472 691 ;
+C 35 ; WX 500 ; N numbersign ; B 4 0 496 700 ;
+C 36 ; WX 500 ; N dollar ; B 29 -99 472 750 ;
+C 37 ; WX 1000 ; N percent ; B 124 -14 877 692 ;
+C 38 ; WX 833 ; N ampersand ; B 62 -16 787 691 ;
+C 39 ; WX 333 ; N quoteright ; B 79 356 263 691 ;
+C 40 ; WX 333 ; N parenleft ; B 46 -168 306 694 ;
+C 41 ; WX 333 ; N parenright ; B 27 -168 287 694 ;
+C 42 ; WX 500 ; N asterisk ; B 56 255 447 691 ;
+C 43 ; WX 570 ; N plus ; B 33 0 537 506 ;
+C 44 ; WX 250 ; N comma ; B 39 -180 223 155 ;
+C 45 ; WX 333 ; N hyphen ; B 44 171 287 287 ;
+C 46 ; WX 250 ; N period ; B 41 -13 210 156 ;
+C 47 ; WX 278 ; N slash ; B -24 -19 302 691 ;
+C 48 ; WX 500 ; N zero ; B 24 -13 476 688 ;
+C 49 ; WX 500 ; N one ; B 65 0 442 688 ;
+C 50 ; WX 500 ; N two ; B 17 0 478 688 ;
+C 51 ; WX 500 ; N three ; B 16 -14 468 688 ;
+C 52 ; WX 500 ; N four ; B 19 0 475 688 ;
+C 53 ; WX 500 ; N five ; B 22 -8 470 676 ;
+C 54 ; WX 500 ; N six ; B 28 -13 475 688 ;
+C 55 ; WX 500 ; N seven ; B 17 0 477 676 ;
+C 56 ; WX 500 ; N eight ; B 28 -13 472 688 ;
+C 57 ; WX 500 ; N nine ; B 26 -13 473 688 ;
+C 58 ; WX 333 ; N colon ; B 82 -13 251 472 ;
+C 59 ; WX 333 ; N semicolon ; B 82 -180 266 472 ;
+C 60 ; WX 570 ; N less ; B 31 -8 539 514 ;
+C 61 ; WX 570 ; N equal ; B 33 107 537 399 ;
+C 62 ; WX 570 ; N greater ; B 31 -8 539 514 ;
+C 63 ; WX 500 ; N question ; B 57 -13 445 689 ;
+C 64 ; WX 930 ; N at ; B 108 -19 822 691 ;
+C 65 ; WX 722 ; N A ; B 9 0 689 690 ;
+C 66 ; WX 667 ; N B ; B 16 0 619 676 ;
+C 67 ; WX 722 ; N C ; B 49 -19 687 691 ;
+C 68 ; WX 722 ; N D ; B 14 0 690 676 ;
+C 69 ; WX 667 ; N E ; B 16 0 641 676 ;
+C 70 ; WX 611 ; N F ; B 16 0 583 676 ;
+C 71 ; WX 778 ; N G ; B 37 -19 755 691 ;
+C 72 ; WX 778 ; N H ; B 21 0 759 676 ;
+C 73 ; WX 389 ; N I ; B 20 0 370 676 ;
+C 74 ; WX 500 ; N J ; B 3 -96 479 676 ;
+C 75 ; WX 778 ; N K ; B 30 0 769 676 ;
+C 76 ; WX 667 ; N L ; B 19 0 638 676 ;
+C 77 ; WX 944 ; N M ; B 14 0 921 676 ;
+C 78 ; WX 722 ; N N ; B 16 -18 701 676 ;
+C 79 ; WX 778 ; N O ; B 35 -19 743 691 ;
+C 80 ; WX 611 ; N P ; B 16 0 600 676 ;
+C 81 ; WX 778 ; N Q ; B 35 -176 743 691 ;
+C 82 ; WX 722 ; N R ; B 26 0 715 676 ;
+C 83 ; WX 556 ; N S ; B 35 -19 513 692 ;
+C 84 ; WX 667 ; N T ; B 31 0 636 676 ;
+C 85 ; WX 722 ; N U ; B 16 -19 701 676 ;
+C 86 ; WX 722 ; N V ; B 16 -18 701 676 ;
+C 87 ; WX 1000 ; N W ; B 19 -15 981 676 ;
+C 88 ; WX 722 ; N X ; B 16 0 699 676 ;
+C 89 ; WX 722 ; N Y ; B 15 0 699 676 ;
+C 90 ; WX 667 ; N Z ; B 28 0 634 676 ;
+C 91 ; WX 333 ; N bracketleft ; B 67 -149 301 678 ;
+C 92 ; WX 278 ; N backslash ; B -25 -19 303 691 ;
+C 93 ; WX 333 ; N bracketright ; B 32 -149 266 678 ;
+C 94 ; WX 581 ; N asciicircum ; B 73 311 509 676 ;
+C 95 ; WX 500 ; N underscore ; B 0 -125 500 -75 ;
+C 96 ; WX 333 ; N quoteleft ; B 70 356 254 691 ;
+C 97 ; WX 500 ; N a ; B 25 -14 488 473 ;
+C 98 ; WX 556 ; N b ; B 17 -14 521 676 ;
+C 99 ; WX 444 ; N c ; B 25 -14 430 473 ;
+C 100 ; WX 556 ; N d ; B 25 -14 534 676 ;
+C 101 ; WX 444 ; N e ; B 25 -14 426 473 ;
+C 102 ; WX 333 ; N f ; B 14 0 389 691 ; L i fi ; L l fl ;
+C 103 ; WX 500 ; N g ; B 28 -206 483 473 ;
+C 104 ; WX 556 ; N h ; B 16 0 534 676 ;
+C 105 ; WX 278 ; N i ; B 16 0 255 691 ;
+C 106 ; WX 333 ; N j ; B -57 -203 263 691 ;
+C 107 ; WX 556 ; N k ; B 22 0 543 676 ;
+C 108 ; WX 278 ; N l ; B 16 0 255 676 ;
+C 109 ; WX 833 ; N m ; B 16 0 814 473 ;
+C 110 ; WX 556 ; N n ; B 21 0 539 473 ;
+C 111 ; WX 500 ; N o ; B 25 -14 476 473 ;
+C 112 ; WX 556 ; N p ; B 19 -205 524 473 ;
+C 113 ; WX 556 ; N q ; B 34 -205 536 473 ;
+C 114 ; WX 444 ; N r ; B 29 0 434 473 ;
+C 115 ; WX 389 ; N s ; B 25 -14 361 473 ;
+C 116 ; WX 333 ; N t ; B 20 -12 332 630 ;
+C 117 ; WX 556 ; N u ; B 16 -14 537 461 ;
+C 118 ; WX 500 ; N v ; B 21 -14 485 461 ;
+C 119 ; WX 722 ; N w ; B 23 -14 707 461 ;
+C 120 ; WX 500 ; N x ; B 12 0 484 461 ;
+C 121 ; WX 500 ; N y ; B 16 -205 480 461 ;
+C 122 ; WX 444 ; N z ; B 21 0 420 461 ;
+C 123 ; WX 394 ; N braceleft ; B 22 -175 340 698 ;
+C 124 ; WX 220 ; N bar ; B 66 -218 154 782 ;
+C 125 ; WX 394 ; N braceright ; B 54 -175 372 698 ;
+C 126 ; WX 520 ; N asciitilde ; B 29 173 491 333 ;
+C 161 ; WX 333 ; N exclamdown ; B 82 -203 252 501 ;
+C 162 ; WX 500 ; N cent ; B 53 -140 458 588 ;
+C 163 ; WX 500 ; N sterling ; B 21 -14 477 684 ;
+C 164 ; WX 167 ; N fraction ; B -168 -12 329 688 ;
+C 165 ; WX 500 ; N yen ; B -64 0 547 676 ;
+C 166 ; WX 500 ; N florin ; B 0 -155 498 706 ;
+C 167 ; WX 500 ; N section ; B 57 -132 443 691 ;
+C 168 ; WX 500 ; N currency ; B -26 61 526 613 ;
+C 169 ; WX 278 ; N quotesingle ; B 75 404 204 691 ;
+C 170 ; WX 500 ; N quotedblleft ; B 32 356 486 691 ;
+C 171 ; WX 500 ; N guillemotleft ; B 23 36 473 415 ;
+C 172 ; WX 333 ; N guilsinglleft ; B 51 36 305 415 ;
+C 173 ; WX 333 ; N guilsinglright ; B 28 36 282 415 ;
+C 174 ; WX 556 ; N fi ; B 14 0 536 691 ;
+C 175 ; WX 556 ; N fl ; B 14 0 536 691 ;
+C 177 ; WX 500 ; N endash ; B 0 181 500 271 ;
+C 178 ; WX 500 ; N dagger ; B 47 -134 453 691 ;
+C 179 ; WX 500 ; N daggerdbl ; B 45 -132 456 691 ;
+C 180 ; WX 250 ; N periodcentered ; B 41 248 210 417 ;
+C 182 ; WX 540 ; N paragraph ; B 0 -186 519 676 ;
+C 183 ; WX 350 ; N bullet ; B 35 198 315 478 ;
+C 184 ; WX 333 ; N quotesinglbase ; B 79 -180 263 155 ;
+C 185 ; WX 500 ; N quotedblbase ; B 14 -180 468 155 ;
+C 186 ; WX 500 ; N quotedblright ; B 14 356 468 691 ;
+C 187 ; WX 500 ; N guillemotright ; B 27 36 477 415 ;
+C 188 ; WX 1000 ; N ellipsis ; B 82 -13 917 156 ;
+C 189 ; WX 1000 ; N perthousand ; B 7 -29 995 706 ;
+C 191 ; WX 500 ; N questiondown ; B 55 -201 443 501 ;
+C 193 ; WX 333 ; N grave ; B 8 528 246 713 ;
+C 194 ; WX 333 ; N acute ; B 86 528 324 713 ;
+C 195 ; WX 333 ; N circumflex ; B -2 528 335 704 ;
+C 196 ; WX 333 ; N tilde ; B -16 547 349 674 ;
+C 197 ; WX 333 ; N macron ; B 1 565 331 637 ;
+C 198 ; WX 333 ; N breve ; B 15 528 318 691 ;
+C 199 ; WX 333 ; N dotaccent ; B 103 536 258 691 ;
+C 200 ; WX 333 ; N dieresis ; B -2 537 335 667 ;
+C 202 ; WX 333 ; N ring ; B 60 527 273 740 ;
+C 203 ; WX 333 ; N cedilla ; B 68 -218 294 0 ;
+C 205 ; WX 333 ; N hungarumlaut ; B -13 528 425 713 ;
+C 206 ; WX 333 ; N ogonek ; B 90 -193 319 24 ;
+C 207 ; WX 333 ; N caron ; B -2 528 335 704 ;
+C 208 ; WX 1000 ; N emdash ; B 0 181 1000 271 ;
+C 225 ; WX 1000 ; N AE ; B 4 0 951 676 ;
+C 227 ; WX 300 ; N ordfeminine ; B -1 397 301 688 ;
+C 232 ; WX 667 ; N Lslash ; B 19 0 638 676 ;
+C 233 ; WX 778 ; N Oslash ; B 35 -74 743 737 ;
+C 234 ; WX 1000 ; N OE ; B 22 -5 981 684 ;
+C 235 ; WX 330 ; N ordmasculine ; B 18 397 312 688 ;
+C 241 ; WX 722 ; N ae ; B 33 -14 693 473 ;
+C 245 ; WX 278 ; N dotlessi ; B 16 0 255 461 ;
+C 248 ; WX 278 ; N lslash ; B -22 0 303 676 ;
+C 249 ; WX 500 ; N oslash ; B 25 -92 476 549 ;
+C 250 ; WX 722 ; N oe ; B 22 -14 696 473 ;
+C 251 ; WX 556 ; N germandbls ; B 19 -12 517 691 ;
+C -1 ; WX 389 ; N Idieresis ; B 20 0 370 877 ;
+C -1 ; WX 444 ; N eacute ; B 25 -14 426 713 ;
+C -1 ; WX 500 ; N abreve ; B 25 -14 488 691 ;
+C -1 ; WX 556 ; N uhungarumlaut ; B 16 -14 557 713 ;
+C -1 ; WX 444 ; N ecaron ; B 25 -14 426 704 ;
+C -1 ; WX 722 ; N Ydieresis ; B 15 0 699 877 ;
+C -1 ; WX 570 ; N divide ; B 33 -31 537 537 ;
+C -1 ; WX 722 ; N Yacute ; B 15 0 699 923 ;
+C -1 ; WX 722 ; N Acircumflex ; B 9 0 689 914 ;
+C -1 ; WX 500 ; N aacute ; B 25 -14 488 713 ;
+C -1 ; WX 722 ; N Ucircumflex ; B 16 -19 701 914 ;
+C -1 ; WX 500 ; N yacute ; B 16 -205 480 713 ;
+C -1 ; WX 389 ; N scommaaccent ; B 25 -218 361 473 ;
+C -1 ; WX 444 ; N ecircumflex ; B 25 -14 426 704 ;
+C -1 ; WX 722 ; N Uring ; B 16 -19 701 935 ;
+C -1 ; WX 722 ; N Udieresis ; B 16 -19 701 877 ;
+C -1 ; WX 500 ; N aogonek ; B 25 -193 504 473 ;
+C -1 ; WX 722 ; N Uacute ; B 16 -19 701 923 ;
+C -1 ; WX 556 ; N uogonek ; B 16 -193 539 461 ;
+C -1 ; WX 667 ; N Edieresis ; B 16 0 641 877 ;
+C -1 ; WX 722 ; N Dcroat ; B 6 0 690 676 ;
+C -1 ; WX 250 ; N commaaccent ; B 47 -218 203 -50 ;
+C -1 ; WX 747 ; N copyright ; B 26 -19 721 691 ;
+C -1 ; WX 667 ; N Emacron ; B 16 0 641 847 ;
+C -1 ; WX 444 ; N ccaron ; B 25 -14 430 704 ;
+C -1 ; WX 500 ; N aring ; B 25 -14 488 740 ;
+C -1 ; WX 722 ; N Ncommaaccent ; B 16 -188 701 676 ;
+C -1 ; WX 278 ; N lacute ; B 16 0 297 923 ;
+C -1 ; WX 500 ; N agrave ; B 25 -14 488 713 ;
+C -1 ; WX 667 ; N Tcommaaccent ; B 31 -218 636 676 ;
+C -1 ; WX 722 ; N Cacute ; B 49 -19 687 923 ;
+C -1 ; WX 500 ; N atilde ; B 25 -14 488 674 ;
+C -1 ; WX 667 ; N Edotaccent ; B 16 0 641 901 ;
+C -1 ; WX 389 ; N scaron ; B 25 -14 363 704 ;
+C -1 ; WX 389 ; N scedilla ; B 25 -218 361 473 ;
+C -1 ; WX 278 ; N iacute ; B 16 0 289 713 ;
+C -1 ; WX 494 ; N lozenge ; B 10 0 484 745 ;
+C -1 ; WX 722 ; N Rcaron ; B 26 0 715 914 ;
+C -1 ; WX 778 ; N Gcommaaccent ; B 37 -218 755 691 ;
+C -1 ; WX 556 ; N ucircumflex ; B 16 -14 537 704 ;
+C -1 ; WX 500 ; N acircumflex ; B 25 -14 488 704 ;
+C -1 ; WX 722 ; N Amacron ; B 9 0 689 847 ;
+C -1 ; WX 444 ; N rcaron ; B 29 0 434 704 ;
+C -1 ; WX 444 ; N ccedilla ; B 25 -218 430 473 ;
+C -1 ; WX 667 ; N Zdotaccent ; B 28 0 634 901 ;
+C -1 ; WX 611 ; N Thorn ; B 16 0 600 676 ;
+C -1 ; WX 778 ; N Omacron ; B 35 -19 743 847 ;
+C -1 ; WX 722 ; N Racute ; B 26 0 715 923 ;
+C -1 ; WX 556 ; N Sacute ; B 35 -19 513 923 ;
+C -1 ; WX 672 ; N dcaron ; B 25 -14 681 682 ;
+C -1 ; WX 722 ; N Umacron ; B 16 -19 701 847 ;
+C -1 ; WX 556 ; N uring ; B 16 -14 537 740 ;
+C -1 ; WX 300 ; N threesuperior ; B 3 268 297 688 ;
+C -1 ; WX 778 ; N Ograve ; B 35 -19 743 923 ;
+C -1 ; WX 722 ; N Agrave ; B 9 0 689 923 ;
+C -1 ; WX 722 ; N Abreve ; B 9 0 689 901 ;
+C -1 ; WX 570 ; N multiply ; B 48 16 522 490 ;
+C -1 ; WX 556 ; N uacute ; B 16 -14 537 713 ;
+C -1 ; WX 667 ; N Tcaron ; B 31 0 636 914 ;
+C -1 ; WX 494 ; N partialdiff ; B 11 -21 494 750 ;
+C -1 ; WX 500 ; N ydieresis ; B 16 -205 480 667 ;
+C -1 ; WX 722 ; N Nacute ; B 16 -18 701 923 ;
+C -1 ; WX 278 ; N icircumflex ; B -37 0 300 704 ;
+C -1 ; WX 667 ; N Ecircumflex ; B 16 0 641 914 ;
+C -1 ; WX 500 ; N adieresis ; B 25 -14 488 667 ;
+C -1 ; WX 444 ; N edieresis ; B 25 -14 426 667 ;
+C -1 ; WX 444 ; N cacute ; B 25 -14 430 713 ;
+C -1 ; WX 556 ; N nacute ; B 21 0 539 713 ;
+C -1 ; WX 556 ; N umacron ; B 16 -14 537 637 ;
+C -1 ; WX 722 ; N Ncaron ; B 16 -18 701 914 ;
+C -1 ; WX 389 ; N Iacute ; B 20 0 370 923 ;
+C -1 ; WX 570 ; N plusminus ; B 33 0 537 506 ;
+C -1 ; WX 220 ; N brokenbar ; B 66 -143 154 707 ;
+C -1 ; WX 747 ; N registered ; B 26 -19 721 691 ;
+C -1 ; WX 778 ; N Gbreve ; B 37 -19 755 901 ;
+C -1 ; WX 389 ; N Idotaccent ; B 20 0 370 901 ;
+C -1 ; WX 600 ; N summation ; B 14 -10 585 706 ;
+C -1 ; WX 667 ; N Egrave ; B 16 0 641 923 ;
+C -1 ; WX 444 ; N racute ; B 29 0 434 713 ;
+C -1 ; WX 500 ; N omacron ; B 25 -14 476 637 ;
+C -1 ; WX 667 ; N Zacute ; B 28 0 634 923 ;
+C -1 ; WX 667 ; N Zcaron ; B 28 0 634 914 ;
+C -1 ; WX 549 ; N greaterequal ; B 26 0 523 704 ;
+C -1 ; WX 722 ; N Eth ; B 6 0 690 676 ;
+C -1 ; WX 722 ; N Ccedilla ; B 49 -218 687 691 ;
+C -1 ; WX 278 ; N lcommaaccent ; B 16 -218 255 676 ;
+C -1 ; WX 416 ; N tcaron ; B 20 -12 425 815 ;
+C -1 ; WX 444 ; N eogonek ; B 25 -193 426 473 ;
+C -1 ; WX 722 ; N Uogonek ; B 16 -193 701 676 ;
+C -1 ; WX 722 ; N Aacute ; B 9 0 689 923 ;
+C -1 ; WX 722 ; N Adieresis ; B 9 0 689 877 ;
+C -1 ; WX 444 ; N egrave ; B 25 -14 426 713 ;
+C -1 ; WX 444 ; N zacute ; B 21 0 420 713 ;
+C -1 ; WX 278 ; N iogonek ; B 16 -193 274 691 ;
+C -1 ; WX 778 ; N Oacute ; B 35 -19 743 923 ;
+C -1 ; WX 500 ; N oacute ; B 25 -14 476 713 ;
+C -1 ; WX 500 ; N amacron ; B 25 -14 488 637 ;
+C -1 ; WX 389 ; N sacute ; B 25 -14 361 713 ;
+C -1 ; WX 278 ; N idieresis ; B -37 0 300 667 ;
+C -1 ; WX 778 ; N Ocircumflex ; B 35 -19 743 914 ;
+C -1 ; WX 722 ; N Ugrave ; B 16 -19 701 923 ;
+C -1 ; WX 612 ; N Delta ; B 6 0 608 688 ;
+C -1 ; WX 556 ; N thorn ; B 19 -205 524 676 ;
+C -1 ; WX 300 ; N twosuperior ; B 0 275 300 688 ;
+C -1 ; WX 778 ; N Odieresis ; B 35 -19 743 877 ;
+C -1 ; WX 556 ; N mu ; B 33 -206 536 461 ;
+C -1 ; WX 278 ; N igrave ; B -27 0 255 713 ;
+C -1 ; WX 500 ; N ohungarumlaut ; B 25 -14 529 713 ;
+C -1 ; WX 667 ; N Eogonek ; B 16 -193 644 676 ;
+C -1 ; WX 556 ; N dcroat ; B 25 -14 534 676 ;
+C -1 ; WX 750 ; N threequarters ; B 23 -12 733 688 ;
+C -1 ; WX 556 ; N Scedilla ; B 35 -218 513 692 ;
+C -1 ; WX 394 ; N lcaron ; B 16 0 412 682 ;
+C -1 ; WX 778 ; N Kcommaaccent ; B 30 -218 769 676 ;
+C -1 ; WX 667 ; N Lacute ; B 19 0 638 923 ;
+C -1 ; WX 1000 ; N trademark ; B 24 271 977 676 ;
+C -1 ; WX 444 ; N edotaccent ; B 25 -14 426 691 ;
+C -1 ; WX 389 ; N Igrave ; B 20 0 370 923 ;
+C -1 ; WX 389 ; N Imacron ; B 20 0 370 847 ;
+C -1 ; WX 667 ; N Lcaron ; B 19 0 652 682 ;
+C -1 ; WX 750 ; N onehalf ; B -7 -12 775 688 ;
+C -1 ; WX 549 ; N lessequal ; B 29 0 526 704 ;
+C -1 ; WX 500 ; N ocircumflex ; B 25 -14 476 704 ;
+C -1 ; WX 556 ; N ntilde ; B 21 0 539 674 ;
+C -1 ; WX 722 ; N Uhungarumlaut ; B 16 -19 701 923 ;
+C -1 ; WX 667 ; N Eacute ; B 16 0 641 923 ;
+C -1 ; WX 444 ; N emacron ; B 25 -14 426 637 ;
+C -1 ; WX 500 ; N gbreve ; B 28 -206 483 691 ;
+C -1 ; WX 750 ; N onequarter ; B 28 -12 743 688 ;
+C -1 ; WX 556 ; N Scaron ; B 35 -19 513 914 ;
+C -1 ; WX 556 ; N Scommaaccent ; B 35 -218 513 692 ;
+C -1 ; WX 778 ; N Ohungarumlaut ; B 35 -19 743 923 ;
+C -1 ; WX 400 ; N degree ; B 57 402 343 688 ;
+C -1 ; WX 500 ; N ograve ; B 25 -14 476 713 ;
+C -1 ; WX 722 ; N Ccaron ; B 49 -19 687 914 ;
+C -1 ; WX 556 ; N ugrave ; B 16 -14 537 713 ;
+C -1 ; WX 549 ; N radical ; B 10 -46 512 850 ;
+C -1 ; WX 722 ; N Dcaron ; B 14 0 690 914 ;
+C -1 ; WX 444 ; N rcommaaccent ; B 29 -218 434 473 ;
+C -1 ; WX 722 ; N Ntilde ; B 16 -18 701 884 ;
+C -1 ; WX 500 ; N otilde ; B 25 -14 476 674 ;
+C -1 ; WX 722 ; N Rcommaaccent ; B 26 -218 715 676 ;
+C -1 ; WX 667 ; N Lcommaaccent ; B 19 -218 638 676 ;
+C -1 ; WX 722 ; N Atilde ; B 9 0 689 884 ;
+C -1 ; WX 722 ; N Aogonek ; B 9 -193 699 690 ;
+C -1 ; WX 722 ; N Aring ; B 9 0 689 935 ;
+C -1 ; WX 778 ; N Otilde ; B 35 -19 743 884 ;
+C -1 ; WX 444 ; N zdotaccent ; B 21 0 420 691 ;
+C -1 ; WX 667 ; N Ecaron ; B 16 0 641 914 ;
+C -1 ; WX 389 ; N Iogonek ; B 20 -193 370 676 ;
+C -1 ; WX 556 ; N kcommaaccent ; B 22 -218 543 676 ;
+C -1 ; WX 570 ; N minus ; B 33 209 537 297 ;
+C -1 ; WX 389 ; N Icircumflex ; B 20 0 370 914 ;
+C -1 ; WX 556 ; N ncaron ; B 21 0 539 704 ;
+C -1 ; WX 333 ; N tcommaaccent ; B 20 -218 332 630 ;
+C -1 ; WX 570 ; N logicalnot ; B 33 108 537 399 ;
+C -1 ; WX 500 ; N odieresis ; B 25 -14 476 667 ;
+C -1 ; WX 556 ; N udieresis ; B 16 -14 537 667 ;
+C -1 ; WX 549 ; N notequal ; B 15 -49 540 570 ;
+C -1 ; WX 500 ; N gcommaaccent ; B 28 -206 483 829 ;
+C -1 ; WX 500 ; N eth ; B 25 -14 476 691 ;
+C -1 ; WX 444 ; N zcaron ; B 21 0 420 704 ;
+C -1 ; WX 556 ; N ncommaaccent ; B 21 -218 539 473 ;
+C -1 ; WX 300 ; N onesuperior ; B 28 275 273 688 ;
+C -1 ; WX 278 ; N imacron ; B -8 0 272 637 ;
+C -1 ; WX 500 ; N Euro ; B 0 0 0 0 ;
+EndCharMetrics
+StartKernData
+StartKernPairs 2242
+KPX A C -55
+KPX A Cacute -55
+KPX A Ccaron -55
+KPX A Ccedilla -55
+KPX A G -55
+KPX A Gbreve -55
+KPX A Gcommaaccent -55
+KPX A O -45
+KPX A Oacute -45
+KPX A Ocircumflex -45
+KPX A Odieresis -45
+KPX A Ograve -45
+KPX A Ohungarumlaut -45
+KPX A Omacron -45
+KPX A Oslash -45
+KPX A Otilde -45
+KPX A Q -45
+KPX A T -95
+KPX A Tcaron -95
+KPX A Tcommaaccent -95
+KPX A U -50
+KPX A Uacute -50
+KPX A Ucircumflex -50
+KPX A Udieresis -50
+KPX A Ugrave -50
+KPX A Uhungarumlaut -50
+KPX A Umacron -50
+KPX A Uogonek -50
+KPX A Uring -50
+KPX A V -145
+KPX A W -130
+KPX A Y -100
+KPX A Yacute -100
+KPX A Ydieresis -100
+KPX A p -25
+KPX A quoteright -74
+KPX A u -50
+KPX A uacute -50
+KPX A ucircumflex -50
+KPX A udieresis -50
+KPX A ugrave -50
+KPX A uhungarumlaut -50
+KPX A umacron -50
+KPX A uogonek -50
+KPX A uring -50
+KPX A v -100
+KPX A w -90
+KPX A y -74
+KPX A yacute -74
+KPX A ydieresis -74
+KPX Aacute C -55
+KPX Aacute Cacute -55
+KPX Aacute Ccaron -55
+KPX Aacute Ccedilla -55
+KPX Aacute G -55
+KPX Aacute Gbreve -55
+KPX Aacute Gcommaaccent -55
+KPX Aacute O -45
+KPX Aacute Oacute -45
+KPX Aacute Ocircumflex -45
+KPX Aacute Odieresis -45
+KPX Aacute Ograve -45
+KPX Aacute Ohungarumlaut -45
+KPX Aacute Omacron -45
+KPX Aacute Oslash -45
+KPX Aacute Otilde -45
+KPX Aacute Q -45
+KPX Aacute T -95
+KPX Aacute Tcaron -95
+KPX Aacute Tcommaaccent -95
+KPX Aacute U -50
+KPX Aacute Uacute -50
+KPX Aacute Ucircumflex -50
+KPX Aacute Udieresis -50
+KPX Aacute Ugrave -50
+KPX Aacute Uhungarumlaut -50
+KPX Aacute Umacron -50
+KPX Aacute Uogonek -50
+KPX Aacute Uring -50
+KPX Aacute V -145
+KPX Aacute W -130
+KPX Aacute Y -100
+KPX Aacute Yacute -100
+KPX Aacute Ydieresis -100
+KPX Aacute p -25
+KPX Aacute quoteright -74
+KPX Aacute u -50
+KPX Aacute uacute -50
+KPX Aacute ucircumflex -50
+KPX Aacute udieresis -50
+KPX Aacute ugrave -50
+KPX Aacute uhungarumlaut -50
+KPX Aacute umacron -50
+KPX Aacute uogonek -50
+KPX Aacute uring -50
+KPX Aacute v -100
+KPX Aacute w -90
+KPX Aacute y -74
+KPX Aacute yacute -74
+KPX Aacute ydieresis -74
+KPX Abreve C -55
+KPX Abreve Cacute -55
+KPX Abreve Ccaron -55
+KPX Abreve Ccedilla -55
+KPX Abreve G -55
+KPX Abreve Gbreve -55
+KPX Abreve Gcommaaccent -55
+KPX Abreve O -45
+KPX Abreve Oacute -45
+KPX Abreve Ocircumflex -45
+KPX Abreve Odieresis -45
+KPX Abreve Ograve -45
+KPX Abreve Ohungarumlaut -45
+KPX Abreve Omacron -45
+KPX Abreve Oslash -45
+KPX Abreve Otilde -45
+KPX Abreve Q -45
+KPX Abreve T -95
+KPX Abreve Tcaron -95
+KPX Abreve Tcommaaccent -95
+KPX Abreve U -50
+KPX Abreve Uacute -50
+KPX Abreve Ucircumflex -50
+KPX Abreve Udieresis -50
+KPX Abreve Ugrave -50
+KPX Abreve Uhungarumlaut -50
+KPX Abreve Umacron -50
+KPX Abreve Uogonek -50
+KPX Abreve Uring -50
+KPX Abreve V -145
+KPX Abreve W -130
+KPX Abreve Y -100
+KPX Abreve Yacute -100
+KPX Abreve Ydieresis -100
+KPX Abreve p -25
+KPX Abreve quoteright -74
+KPX Abreve u -50
+KPX Abreve uacute -50
+KPX Abreve ucircumflex -50
+KPX Abreve udieresis -50
+KPX Abreve ugrave -50
+KPX Abreve uhungarumlaut -50
+KPX Abreve umacron -50
+KPX Abreve uogonek -50
+KPX Abreve uring -50
+KPX Abreve v -100
+KPX Abreve w -90
+KPX Abreve y -74
+KPX Abreve yacute -74
+KPX Abreve ydieresis -74
+KPX Acircumflex C -55
+KPX Acircumflex Cacute -55
+KPX Acircumflex Ccaron -55
+KPX Acircumflex Ccedilla -55
+KPX Acircumflex G -55
+KPX Acircumflex Gbreve -55
+KPX Acircumflex Gcommaaccent -55
+KPX Acircumflex O -45
+KPX Acircumflex Oacute -45
+KPX Acircumflex Ocircumflex -45
+KPX Acircumflex Odieresis -45
+KPX Acircumflex Ograve -45
+KPX Acircumflex Ohungarumlaut -45
+KPX Acircumflex Omacron -45
+KPX Acircumflex Oslash -45
+KPX Acircumflex Otilde -45
+KPX Acircumflex Q -45
+KPX Acircumflex T -95
+KPX Acircumflex Tcaron -95
+KPX Acircumflex Tcommaaccent -95
+KPX Acircumflex U -50
+KPX Acircumflex Uacute -50
+KPX Acircumflex Ucircumflex -50
+KPX Acircumflex Udieresis -50
+KPX Acircumflex Ugrave -50
+KPX Acircumflex Uhungarumlaut -50
+KPX Acircumflex Umacron -50
+KPX Acircumflex Uogonek -50
+KPX Acircumflex Uring -50
+KPX Acircumflex V -145
+KPX Acircumflex W -130
+KPX Acircumflex Y -100
+KPX Acircumflex Yacute -100
+KPX Acircumflex Ydieresis -100
+KPX Acircumflex p -25
+KPX Acircumflex quoteright -74
+KPX Acircumflex u -50
+KPX Acircumflex uacute -50
+KPX Acircumflex ucircumflex -50
+KPX Acircumflex udieresis -50
+KPX Acircumflex ugrave -50
+KPX Acircumflex uhungarumlaut -50
+KPX Acircumflex umacron -50
+KPX Acircumflex uogonek -50
+KPX Acircumflex uring -50
+KPX Acircumflex v -100
+KPX Acircumflex w -90
+KPX Acircumflex y -74
+KPX Acircumflex yacute -74
+KPX Acircumflex ydieresis -74
+KPX Adieresis C -55
+KPX Adieresis Cacute -55
+KPX Adieresis Ccaron -55
+KPX Adieresis Ccedilla -55
+KPX Adieresis G -55
+KPX Adieresis Gbreve -55
+KPX Adieresis Gcommaaccent -55
+KPX Adieresis O -45
+KPX Adieresis Oacute -45
+KPX Adieresis Ocircumflex -45
+KPX Adieresis Odieresis -45
+KPX Adieresis Ograve -45
+KPX Adieresis Ohungarumlaut -45
+KPX Adieresis Omacron -45
+KPX Adieresis Oslash -45
+KPX Adieresis Otilde -45
+KPX Adieresis Q -45
+KPX Adieresis T -95
+KPX Adieresis Tcaron -95
+KPX Adieresis Tcommaaccent -95
+KPX Adieresis U -50
+KPX Adieresis Uacute -50
+KPX Adieresis Ucircumflex -50
+KPX Adieresis Udieresis -50
+KPX Adieresis Ugrave -50
+KPX Adieresis Uhungarumlaut -50
+KPX Adieresis Umacron -50
+KPX Adieresis Uogonek -50
+KPX Adieresis Uring -50
+KPX Adieresis V -145
+KPX Adieresis W -130
+KPX Adieresis Y -100
+KPX Adieresis Yacute -100
+KPX Adieresis Ydieresis -100
+KPX Adieresis p -25
+KPX Adieresis quoteright -74
+KPX Adieresis u -50
+KPX Adieresis uacute -50
+KPX Adieresis ucircumflex -50
+KPX Adieresis udieresis -50
+KPX Adieresis ugrave -50
+KPX Adieresis uhungarumlaut -50
+KPX Adieresis umacron -50
+KPX Adieresis uogonek -50
+KPX Adieresis uring -50
+KPX Adieresis v -100
+KPX Adieresis w -90
+KPX Adieresis y -74
+KPX Adieresis yacute -74
+KPX Adieresis ydieresis -74
+KPX Agrave C -55
+KPX Agrave Cacute -55
+KPX Agrave Ccaron -55
+KPX Agrave Ccedilla -55
+KPX Agrave G -55
+KPX Agrave Gbreve -55
+KPX Agrave Gcommaaccent -55
+KPX Agrave O -45
+KPX Agrave Oacute -45
+KPX Agrave Ocircumflex -45
+KPX Agrave Odieresis -45
+KPX Agrave Ograve -45
+KPX Agrave Ohungarumlaut -45
+KPX Agrave Omacron -45
+KPX Agrave Oslash -45
+KPX Agrave Otilde -45
+KPX Agrave Q -45
+KPX Agrave T -95
+KPX Agrave Tcaron -95
+KPX Agrave Tcommaaccent -95
+KPX Agrave U -50
+KPX Agrave Uacute -50
+KPX Agrave Ucircumflex -50
+KPX Agrave Udieresis -50
+KPX Agrave Ugrave -50
+KPX Agrave Uhungarumlaut -50
+KPX Agrave Umacron -50
+KPX Agrave Uogonek -50
+KPX Agrave Uring -50
+KPX Agrave V -145
+KPX Agrave W -130
+KPX Agrave Y -100
+KPX Agrave Yacute -100
+KPX Agrave Ydieresis -100
+KPX Agrave p -25
+KPX Agrave quoteright -74
+KPX Agrave u -50
+KPX Agrave uacute -50
+KPX Agrave ucircumflex -50
+KPX Agrave udieresis -50
+KPX Agrave ugrave -50
+KPX Agrave uhungarumlaut -50
+KPX Agrave umacron -50
+KPX Agrave uogonek -50
+KPX Agrave uring -50
+KPX Agrave v -100
+KPX Agrave w -90
+KPX Agrave y -74
+KPX Agrave yacute -74
+KPX Agrave ydieresis -74
+KPX Amacron C -55
+KPX Amacron Cacute -55
+KPX Amacron Ccaron -55
+KPX Amacron Ccedilla -55
+KPX Amacron G -55
+KPX Amacron Gbreve -55
+KPX Amacron Gcommaaccent -55
+KPX Amacron O -45
+KPX Amacron Oacute -45
+KPX Amacron Ocircumflex -45
+KPX Amacron Odieresis -45
+KPX Amacron Ograve -45
+KPX Amacron Ohungarumlaut -45
+KPX Amacron Omacron -45
+KPX Amacron Oslash -45
+KPX Amacron Otilde -45
+KPX Amacron Q -45
+KPX Amacron T -95
+KPX Amacron Tcaron -95
+KPX Amacron Tcommaaccent -95
+KPX Amacron U -50
+KPX Amacron Uacute -50
+KPX Amacron Ucircumflex -50
+KPX Amacron Udieresis -50
+KPX Amacron Ugrave -50
+KPX Amacron Uhungarumlaut -50
+KPX Amacron Umacron -50
+KPX Amacron Uogonek -50
+KPX Amacron Uring -50
+KPX Amacron V -145
+KPX Amacron W -130
+KPX Amacron Y -100
+KPX Amacron Yacute -100
+KPX Amacron Ydieresis -100
+KPX Amacron p -25
+KPX Amacron quoteright -74
+KPX Amacron u -50
+KPX Amacron uacute -50
+KPX Amacron ucircumflex -50
+KPX Amacron udieresis -50
+KPX Amacron ugrave -50
+KPX Amacron uhungarumlaut -50
+KPX Amacron umacron -50
+KPX Amacron uogonek -50
+KPX Amacron uring -50
+KPX Amacron v -100
+KPX Amacron w -90
+KPX Amacron y -74
+KPX Amacron yacute -74
+KPX Amacron ydieresis -74
+KPX Aogonek C -55
+KPX Aogonek Cacute -55
+KPX Aogonek Ccaron -55
+KPX Aogonek Ccedilla -55
+KPX Aogonek G -55
+KPX Aogonek Gbreve -55
+KPX Aogonek Gcommaaccent -55
+KPX Aogonek O -45
+KPX Aogonek Oacute -45
+KPX Aogonek Ocircumflex -45
+KPX Aogonek Odieresis -45
+KPX Aogonek Ograve -45
+KPX Aogonek Ohungarumlaut -45
+KPX Aogonek Omacron -45
+KPX Aogonek Oslash -45
+KPX Aogonek Otilde -45
+KPX Aogonek Q -45
+KPX Aogonek T -95
+KPX Aogonek Tcaron -95
+KPX Aogonek Tcommaaccent -95
+KPX Aogonek U -50
+KPX Aogonek Uacute -50
+KPX Aogonek Ucircumflex -50
+KPX Aogonek Udieresis -50
+KPX Aogonek Ugrave -50
+KPX Aogonek Uhungarumlaut -50
+KPX Aogonek Umacron -50
+KPX Aogonek Uogonek -50
+KPX Aogonek Uring -50
+KPX Aogonek V -145
+KPX Aogonek W -130
+KPX Aogonek Y -100
+KPX Aogonek Yacute -100
+KPX Aogonek Ydieresis -100
+KPX Aogonek p -25
+KPX Aogonek quoteright -74
+KPX Aogonek u -50
+KPX Aogonek uacute -50
+KPX Aogonek ucircumflex -50
+KPX Aogonek udieresis -50
+KPX Aogonek ugrave -50
+KPX Aogonek uhungarumlaut -50
+KPX Aogonek umacron -50
+KPX Aogonek uogonek -50
+KPX Aogonek uring -50
+KPX Aogonek v -100
+KPX Aogonek w -90
+KPX Aogonek y -34
+KPX Aogonek yacute -34
+KPX Aogonek ydieresis -34
+KPX Aring C -55
+KPX Aring Cacute -55
+KPX Aring Ccaron -55
+KPX Aring Ccedilla -55
+KPX Aring G -55
+KPX Aring Gbreve -55
+KPX Aring Gcommaaccent -55
+KPX Aring O -45
+KPX Aring Oacute -45
+KPX Aring Ocircumflex -45
+KPX Aring Odieresis -45
+KPX Aring Ograve -45
+KPX Aring Ohungarumlaut -45
+KPX Aring Omacron -45
+KPX Aring Oslash -45
+KPX Aring Otilde -45
+KPX Aring Q -45
+KPX Aring T -95
+KPX Aring Tcaron -95
+KPX Aring Tcommaaccent -95
+KPX Aring U -50
+KPX Aring Uacute -50
+KPX Aring Ucircumflex -50
+KPX Aring Udieresis -50
+KPX Aring Ugrave -50
+KPX Aring Uhungarumlaut -50
+KPX Aring Umacron -50
+KPX Aring Uogonek -50
+KPX Aring Uring -50
+KPX Aring V -145
+KPX Aring W -130
+KPX Aring Y -100
+KPX Aring Yacute -100
+KPX Aring Ydieresis -100
+KPX Aring p -25
+KPX Aring quoteright -74
+KPX Aring u -50
+KPX Aring uacute -50
+KPX Aring ucircumflex -50
+KPX Aring udieresis -50
+KPX Aring ugrave -50
+KPX Aring uhungarumlaut -50
+KPX Aring umacron -50
+KPX Aring uogonek -50
+KPX Aring uring -50
+KPX Aring v -100
+KPX Aring w -90
+KPX Aring y -74
+KPX Aring yacute -74
+KPX Aring ydieresis -74
+KPX Atilde C -55
+KPX Atilde Cacute -55
+KPX Atilde Ccaron -55
+KPX Atilde Ccedilla -55
+KPX Atilde G -55
+KPX Atilde Gbreve -55
+KPX Atilde Gcommaaccent -55
+KPX Atilde O -45
+KPX Atilde Oacute -45
+KPX Atilde Ocircumflex -45
+KPX Atilde Odieresis -45
+KPX Atilde Ograve -45
+KPX Atilde Ohungarumlaut -45
+KPX Atilde Omacron -45
+KPX Atilde Oslash -45
+KPX Atilde Otilde -45
+KPX Atilde Q -45
+KPX Atilde T -95
+KPX Atilde Tcaron -95
+KPX Atilde Tcommaaccent -95
+KPX Atilde U -50
+KPX Atilde Uacute -50
+KPX Atilde Ucircumflex -50
+KPX Atilde Udieresis -50
+KPX Atilde Ugrave -50
+KPX Atilde Uhungarumlaut -50
+KPX Atilde Umacron -50
+KPX Atilde Uogonek -50
+KPX Atilde Uring -50
+KPX Atilde V -145
+KPX Atilde W -130
+KPX Atilde Y -100
+KPX Atilde Yacute -100
+KPX Atilde Ydieresis -100
+KPX Atilde p -25
+KPX Atilde quoteright -74
+KPX Atilde u -50
+KPX Atilde uacute -50
+KPX Atilde ucircumflex -50
+KPX Atilde udieresis -50
+KPX Atilde ugrave -50
+KPX Atilde uhungarumlaut -50
+KPX Atilde umacron -50
+KPX Atilde uogonek -50
+KPX Atilde uring -50
+KPX Atilde v -100
+KPX Atilde w -90
+KPX Atilde y -74
+KPX Atilde yacute -74
+KPX Atilde ydieresis -74
+KPX B A -30
+KPX B Aacute -30
+KPX B Abreve -30
+KPX B Acircumflex -30
+KPX B Adieresis -30
+KPX B Agrave -30
+KPX B Amacron -30
+KPX B Aogonek -30
+KPX B Aring -30
+KPX B Atilde -30
+KPX B U -10
+KPX B Uacute -10
+KPX B Ucircumflex -10
+KPX B Udieresis -10
+KPX B Ugrave -10
+KPX B Uhungarumlaut -10
+KPX B Umacron -10
+KPX B Uogonek -10
+KPX B Uring -10
+KPX D A -35
+KPX D Aacute -35
+KPX D Abreve -35
+KPX D Acircumflex -35
+KPX D Adieresis -35
+KPX D Agrave -35
+KPX D Amacron -35
+KPX D Aogonek -35
+KPX D Aring -35
+KPX D Atilde -35
+KPX D V -40
+KPX D W -40
+KPX D Y -40
+KPX D Yacute -40
+KPX D Ydieresis -40
+KPX D period -20
+KPX Dcaron A -35
+KPX Dcaron Aacute -35
+KPX Dcaron Abreve -35
+KPX Dcaron Acircumflex -35
+KPX Dcaron Adieresis -35
+KPX Dcaron Agrave -35
+KPX Dcaron Amacron -35
+KPX Dcaron Aogonek -35
+KPX Dcaron Aring -35
+KPX Dcaron Atilde -35
+KPX Dcaron V -40
+KPX Dcaron W -40
+KPX Dcaron Y -40
+KPX Dcaron Yacute -40
+KPX Dcaron Ydieresis -40
+KPX Dcaron period -20
+KPX Dcroat A -35
+KPX Dcroat Aacute -35
+KPX Dcroat Abreve -35
+KPX Dcroat Acircumflex -35
+KPX Dcroat Adieresis -35
+KPX Dcroat Agrave -35
+KPX Dcroat Amacron -35
+KPX Dcroat Aogonek -35
+KPX Dcroat Aring -35
+KPX Dcroat Atilde -35
+KPX Dcroat V -40
+KPX Dcroat W -40
+KPX Dcroat Y -40
+KPX Dcroat Yacute -40
+KPX Dcroat Ydieresis -40
+KPX Dcroat period -20
+KPX F A -90
+KPX F Aacute -90
+KPX F Abreve -90
+KPX F Acircumflex -90
+KPX F Adieresis -90
+KPX F Agrave -90
+KPX F Amacron -90
+KPX F Aogonek -90
+KPX F Aring -90
+KPX F Atilde -90
+KPX F a -25
+KPX F aacute -25
+KPX F abreve -25
+KPX F acircumflex -25
+KPX F adieresis -25
+KPX F agrave -25
+KPX F amacron -25
+KPX F aogonek -25
+KPX F aring -25
+KPX F atilde -25
+KPX F comma -92
+KPX F e -25
+KPX F eacute -25
+KPX F ecaron -25
+KPX F ecircumflex -25
+KPX F edieresis -25
+KPX F edotaccent -25
+KPX F egrave -25
+KPX F emacron -25
+KPX F eogonek -25
+KPX F o -25
+KPX F oacute -25
+KPX F ocircumflex -25
+KPX F odieresis -25
+KPX F ograve -25
+KPX F ohungarumlaut -25
+KPX F omacron -25
+KPX F oslash -25
+KPX F otilde -25
+KPX F period -110
+KPX J A -30
+KPX J Aacute -30
+KPX J Abreve -30
+KPX J Acircumflex -30
+KPX J Adieresis -30
+KPX J Agrave -30
+KPX J Amacron -30
+KPX J Aogonek -30
+KPX J Aring -30
+KPX J Atilde -30
+KPX J a -15
+KPX J aacute -15
+KPX J abreve -15
+KPX J acircumflex -15
+KPX J adieresis -15
+KPX J agrave -15
+KPX J amacron -15
+KPX J aogonek -15
+KPX J aring -15
+KPX J atilde -15
+KPX J e -15
+KPX J eacute -15
+KPX J ecaron -15
+KPX J ecircumflex -15
+KPX J edieresis -15
+KPX J edotaccent -15
+KPX J egrave -15
+KPX J emacron -15
+KPX J eogonek -15
+KPX J o -15
+KPX J oacute -15
+KPX J ocircumflex -15
+KPX J odieresis -15
+KPX J ograve -15
+KPX J ohungarumlaut -15
+KPX J omacron -15
+KPX J oslash -15
+KPX J otilde -15
+KPX J period -20
+KPX J u -15
+KPX J uacute -15
+KPX J ucircumflex -15
+KPX J udieresis -15
+KPX J ugrave -15
+KPX J uhungarumlaut -15
+KPX J umacron -15
+KPX J uogonek -15
+KPX J uring -15
+KPX K O -30
+KPX K Oacute -30
+KPX K Ocircumflex -30
+KPX K Odieresis -30
+KPX K Ograve -30
+KPX K Ohungarumlaut -30
+KPX K Omacron -30
+KPX K Oslash -30
+KPX K Otilde -30
+KPX K e -25
+KPX K eacute -25
+KPX K ecaron -25
+KPX K ecircumflex -25
+KPX K edieresis -25
+KPX K edotaccent -25
+KPX K egrave -25
+KPX K emacron -25
+KPX K eogonek -25
+KPX K o -25
+KPX K oacute -25
+KPX K ocircumflex -25
+KPX K odieresis -25
+KPX K ograve -25
+KPX K ohungarumlaut -25
+KPX K omacron -25
+KPX K oslash -25
+KPX K otilde -25
+KPX K u -15
+KPX K uacute -15
+KPX K ucircumflex -15
+KPX K udieresis -15
+KPX K ugrave -15
+KPX K uhungarumlaut -15
+KPX K umacron -15
+KPX K uogonek -15
+KPX K uring -15
+KPX K y -45
+KPX K yacute -45
+KPX K ydieresis -45
+KPX Kcommaaccent O -30
+KPX Kcommaaccent Oacute -30
+KPX Kcommaaccent Ocircumflex -30
+KPX Kcommaaccent Odieresis -30
+KPX Kcommaaccent Ograve -30
+KPX Kcommaaccent Ohungarumlaut -30
+KPX Kcommaaccent Omacron -30
+KPX Kcommaaccent Oslash -30
+KPX Kcommaaccent Otilde -30
+KPX Kcommaaccent e -25
+KPX Kcommaaccent eacute -25
+KPX Kcommaaccent ecaron -25
+KPX Kcommaaccent ecircumflex -25
+KPX Kcommaaccent edieresis -25
+KPX Kcommaaccent edotaccent -25
+KPX Kcommaaccent egrave -25
+KPX Kcommaaccent emacron -25
+KPX Kcommaaccent eogonek -25
+KPX Kcommaaccent o -25
+KPX Kcommaaccent oacute -25
+KPX Kcommaaccent ocircumflex -25
+KPX Kcommaaccent odieresis -25
+KPX Kcommaaccent ograve -25
+KPX Kcommaaccent ohungarumlaut -25
+KPX Kcommaaccent omacron -25
+KPX Kcommaaccent oslash -25
+KPX Kcommaaccent otilde -25
+KPX Kcommaaccent u -15
+KPX Kcommaaccent uacute -15
+KPX Kcommaaccent ucircumflex -15
+KPX Kcommaaccent udieresis -15
+KPX Kcommaaccent ugrave -15
+KPX Kcommaaccent uhungarumlaut -15
+KPX Kcommaaccent umacron -15
+KPX Kcommaaccent uogonek -15
+KPX Kcommaaccent uring -15
+KPX Kcommaaccent y -45
+KPX Kcommaaccent yacute -45
+KPX Kcommaaccent ydieresis -45
+KPX L T -92
+KPX L Tcaron -92
+KPX L Tcommaaccent -92
+KPX L V -92
+KPX L W -92
+KPX L Y -92
+KPX L Yacute -92
+KPX L Ydieresis -92
+KPX L quotedblright -20
+KPX L quoteright -110
+KPX L y -55
+KPX L yacute -55
+KPX L ydieresis -55
+KPX Lacute T -92
+KPX Lacute Tcaron -92
+KPX Lacute Tcommaaccent -92
+KPX Lacute V -92
+KPX Lacute W -92
+KPX Lacute Y -92
+KPX Lacute Yacute -92
+KPX Lacute Ydieresis -92
+KPX Lacute quotedblright -20
+KPX Lacute quoteright -110
+KPX Lacute y -55
+KPX Lacute yacute -55
+KPX Lacute ydieresis -55
+KPX Lcommaaccent T -92
+KPX Lcommaaccent Tcaron -92
+KPX Lcommaaccent Tcommaaccent -92
+KPX Lcommaaccent V -92
+KPX Lcommaaccent W -92
+KPX Lcommaaccent Y -92
+KPX Lcommaaccent Yacute -92
+KPX Lcommaaccent Ydieresis -92
+KPX Lcommaaccent quotedblright -20
+KPX Lcommaaccent quoteright -110
+KPX Lcommaaccent y -55
+KPX Lcommaaccent yacute -55
+KPX Lcommaaccent ydieresis -55
+KPX Lslash T -92
+KPX Lslash Tcaron -92
+KPX Lslash Tcommaaccent -92
+KPX Lslash V -92
+KPX Lslash W -92
+KPX Lslash Y -92
+KPX Lslash Yacute -92
+KPX Lslash Ydieresis -92
+KPX Lslash quotedblright -20
+KPX Lslash quoteright -110
+KPX Lslash y -55
+KPX Lslash yacute -55
+KPX Lslash ydieresis -55
+KPX N A -20
+KPX N Aacute -20
+KPX N Abreve -20
+KPX N Acircumflex -20
+KPX N Adieresis -20
+KPX N Agrave -20
+KPX N Amacron -20
+KPX N Aogonek -20
+KPX N Aring -20
+KPX N Atilde -20
+KPX Nacute A -20
+KPX Nacute Aacute -20
+KPX Nacute Abreve -20
+KPX Nacute Acircumflex -20
+KPX Nacute Adieresis -20
+KPX Nacute Agrave -20
+KPX Nacute Amacron -20
+KPX Nacute Aogonek -20
+KPX Nacute Aring -20
+KPX Nacute Atilde -20
+KPX Ncaron A -20
+KPX Ncaron Aacute -20
+KPX Ncaron Abreve -20
+KPX Ncaron Acircumflex -20
+KPX Ncaron Adieresis -20
+KPX Ncaron Agrave -20
+KPX Ncaron Amacron -20
+KPX Ncaron Aogonek -20
+KPX Ncaron Aring -20
+KPX Ncaron Atilde -20
+KPX Ncommaaccent A -20
+KPX Ncommaaccent Aacute -20
+KPX Ncommaaccent Abreve -20
+KPX Ncommaaccent Acircumflex -20
+KPX Ncommaaccent Adieresis -20
+KPX Ncommaaccent Agrave -20
+KPX Ncommaaccent Amacron -20
+KPX Ncommaaccent Aogonek -20
+KPX Ncommaaccent Aring -20
+KPX Ncommaaccent Atilde -20
+KPX Ntilde A -20
+KPX Ntilde Aacute -20
+KPX Ntilde Abreve -20
+KPX Ntilde Acircumflex -20
+KPX Ntilde Adieresis -20
+KPX Ntilde Agrave -20
+KPX Ntilde Amacron -20
+KPX Ntilde Aogonek -20
+KPX Ntilde Aring -20
+KPX Ntilde Atilde -20
+KPX O A -40
+KPX O Aacute -40
+KPX O Abreve -40
+KPX O Acircumflex -40
+KPX O Adieresis -40
+KPX O Agrave -40
+KPX O Amacron -40
+KPX O Aogonek -40
+KPX O Aring -40
+KPX O Atilde -40
+KPX O T -40
+KPX O Tcaron -40
+KPX O Tcommaaccent -40
+KPX O V -50
+KPX O W -50
+KPX O X -40
+KPX O Y -50
+KPX O Yacute -50
+KPX O Ydieresis -50
+KPX Oacute A -40
+KPX Oacute Aacute -40
+KPX Oacute Abreve -40
+KPX Oacute Acircumflex -40
+KPX Oacute Adieresis -40
+KPX Oacute Agrave -40
+KPX Oacute Amacron -40
+KPX Oacute Aogonek -40
+KPX Oacute Aring -40
+KPX Oacute Atilde -40
+KPX Oacute T -40
+KPX Oacute Tcaron -40
+KPX Oacute Tcommaaccent -40
+KPX Oacute V -50
+KPX Oacute W -50
+KPX Oacute X -40
+KPX Oacute Y -50
+KPX Oacute Yacute -50
+KPX Oacute Ydieresis -50
+KPX Ocircumflex A -40
+KPX Ocircumflex Aacute -40
+KPX Ocircumflex Abreve -40
+KPX Ocircumflex Acircumflex -40
+KPX Ocircumflex Adieresis -40
+KPX Ocircumflex Agrave -40
+KPX Ocircumflex Amacron -40
+KPX Ocircumflex Aogonek -40
+KPX Ocircumflex Aring -40
+KPX Ocircumflex Atilde -40
+KPX Ocircumflex T -40
+KPX Ocircumflex Tcaron -40
+KPX Ocircumflex Tcommaaccent -40
+KPX Ocircumflex V -50
+KPX Ocircumflex W -50
+KPX Ocircumflex X -40
+KPX Ocircumflex Y -50
+KPX Ocircumflex Yacute -50
+KPX Ocircumflex Ydieresis -50
+KPX Odieresis A -40
+KPX Odieresis Aacute -40
+KPX Odieresis Abreve -40
+KPX Odieresis Acircumflex -40
+KPX Odieresis Adieresis -40
+KPX Odieresis Agrave -40
+KPX Odieresis Amacron -40
+KPX Odieresis Aogonek -40
+KPX Odieresis Aring -40
+KPX Odieresis Atilde -40
+KPX Odieresis T -40
+KPX Odieresis Tcaron -40
+KPX Odieresis Tcommaaccent -40
+KPX Odieresis V -50
+KPX Odieresis W -50
+KPX Odieresis X -40
+KPX Odieresis Y -50
+KPX Odieresis Yacute -50
+KPX Odieresis Ydieresis -50
+KPX Ograve A -40
+KPX Ograve Aacute -40
+KPX Ograve Abreve -40
+KPX Ograve Acircumflex -40
+KPX Ograve Adieresis -40
+KPX Ograve Agrave -40
+KPX Ograve Amacron -40
+KPX Ograve Aogonek -40
+KPX Ograve Aring -40
+KPX Ograve Atilde -40
+KPX Ograve T -40
+KPX Ograve Tcaron -40
+KPX Ograve Tcommaaccent -40
+KPX Ograve V -50
+KPX Ograve W -50
+KPX Ograve X -40
+KPX Ograve Y -50
+KPX Ograve Yacute -50
+KPX Ograve Ydieresis -50
+KPX Ohungarumlaut A -40
+KPX Ohungarumlaut Aacute -40
+KPX Ohungarumlaut Abreve -40
+KPX Ohungarumlaut Acircumflex -40
+KPX Ohungarumlaut Adieresis -40
+KPX Ohungarumlaut Agrave -40
+KPX Ohungarumlaut Amacron -40
+KPX Ohungarumlaut Aogonek -40
+KPX Ohungarumlaut Aring -40
+KPX Ohungarumlaut Atilde -40
+KPX Ohungarumlaut T -40
+KPX Ohungarumlaut Tcaron -40
+KPX Ohungarumlaut Tcommaaccent -40
+KPX Ohungarumlaut V -50
+KPX Ohungarumlaut W -50
+KPX Ohungarumlaut X -40
+KPX Ohungarumlaut Y -50
+KPX Ohungarumlaut Yacute -50
+KPX Ohungarumlaut Ydieresis -50
+KPX Omacron A -40
+KPX Omacron Aacute -40
+KPX Omacron Abreve -40
+KPX Omacron Acircumflex -40
+KPX Omacron Adieresis -40
+KPX Omacron Agrave -40
+KPX Omacron Amacron -40
+KPX Omacron Aogonek -40
+KPX Omacron Aring -40
+KPX Omacron Atilde -40
+KPX Omacron T -40
+KPX Omacron Tcaron -40
+KPX Omacron Tcommaaccent -40
+KPX Omacron V -50
+KPX Omacron W -50
+KPX Omacron X -40
+KPX Omacron Y -50
+KPX Omacron Yacute -50
+KPX Omacron Ydieresis -50
+KPX Oslash A -40
+KPX Oslash Aacute -40
+KPX Oslash Abreve -40
+KPX Oslash Acircumflex -40
+KPX Oslash Adieresis -40
+KPX Oslash Agrave -40
+KPX Oslash Amacron -40
+KPX Oslash Aogonek -40
+KPX Oslash Aring -40
+KPX Oslash Atilde -40
+KPX Oslash T -40
+KPX Oslash Tcaron -40
+KPX Oslash Tcommaaccent -40
+KPX Oslash V -50
+KPX Oslash W -50
+KPX Oslash X -40
+KPX Oslash Y -50
+KPX Oslash Yacute -50
+KPX Oslash Ydieresis -50
+KPX Otilde A -40
+KPX Otilde Aacute -40
+KPX Otilde Abreve -40
+KPX Otilde Acircumflex -40
+KPX Otilde Adieresis -40
+KPX Otilde Agrave -40
+KPX Otilde Amacron -40
+KPX Otilde Aogonek -40
+KPX Otilde Aring -40
+KPX Otilde Atilde -40
+KPX Otilde T -40
+KPX Otilde Tcaron -40
+KPX Otilde Tcommaaccent -40
+KPX Otilde V -50
+KPX Otilde W -50
+KPX Otilde X -40
+KPX Otilde Y -50
+KPX Otilde Yacute -50
+KPX Otilde Ydieresis -50
+KPX P A -74
+KPX P Aacute -74
+KPX P Abreve -74
+KPX P Acircumflex -74
+KPX P Adieresis -74
+KPX P Agrave -74
+KPX P Amacron -74
+KPX P Aogonek -74
+KPX P Aring -74
+KPX P Atilde -74
+KPX P a -10
+KPX P aacute -10
+KPX P abreve -10
+KPX P acircumflex -10
+KPX P adieresis -10
+KPX P agrave -10
+KPX P amacron -10
+KPX P aogonek -10
+KPX P aring -10
+KPX P atilde -10
+KPX P comma -92
+KPX P e -20
+KPX P eacute -20
+KPX P ecaron -20
+KPX P ecircumflex -20
+KPX P edieresis -20
+KPX P edotaccent -20
+KPX P egrave -20
+KPX P emacron -20
+KPX P eogonek -20
+KPX P o -20
+KPX P oacute -20
+KPX P ocircumflex -20
+KPX P odieresis -20
+KPX P ograve -20
+KPX P ohungarumlaut -20
+KPX P omacron -20
+KPX P oslash -20
+KPX P otilde -20
+KPX P period -110
+KPX Q U -10
+KPX Q Uacute -10
+KPX Q Ucircumflex -10
+KPX Q Udieresis -10
+KPX Q Ugrave -10
+KPX Q Uhungarumlaut -10
+KPX Q Umacron -10
+KPX Q Uogonek -10
+KPX Q Uring -10
+KPX Q period -20
+KPX R O -30
+KPX R Oacute -30
+KPX R Ocircumflex -30
+KPX R Odieresis -30
+KPX R Ograve -30
+KPX R Ohungarumlaut -30
+KPX R Omacron -30
+KPX R Oslash -30
+KPX R Otilde -30
+KPX R T -40
+KPX R Tcaron -40
+KPX R Tcommaaccent -40
+KPX R U -30
+KPX R Uacute -30
+KPX R Ucircumflex -30
+KPX R Udieresis -30
+KPX R Ugrave -30
+KPX R Uhungarumlaut -30
+KPX R Umacron -30
+KPX R Uogonek -30
+KPX R Uring -30
+KPX R V -55
+KPX R W -35
+KPX R Y -35
+KPX R Yacute -35
+KPX R Ydieresis -35
+KPX Racute O -30
+KPX Racute Oacute -30
+KPX Racute Ocircumflex -30
+KPX Racute Odieresis -30
+KPX Racute Ograve -30
+KPX Racute Ohungarumlaut -30
+KPX Racute Omacron -30
+KPX Racute Oslash -30
+KPX Racute Otilde -30
+KPX Racute T -40
+KPX Racute Tcaron -40
+KPX Racute Tcommaaccent -40
+KPX Racute U -30
+KPX Racute Uacute -30
+KPX Racute Ucircumflex -30
+KPX Racute Udieresis -30
+KPX Racute Ugrave -30
+KPX Racute Uhungarumlaut -30
+KPX Racute Umacron -30
+KPX Racute Uogonek -30
+KPX Racute Uring -30
+KPX Racute V -55
+KPX Racute W -35
+KPX Racute Y -35
+KPX Racute Yacute -35
+KPX Racute Ydieresis -35
+KPX Rcaron O -30
+KPX Rcaron Oacute -30
+KPX Rcaron Ocircumflex -30
+KPX Rcaron Odieresis -30
+KPX Rcaron Ograve -30
+KPX Rcaron Ohungarumlaut -30
+KPX Rcaron Omacron -30
+KPX Rcaron Oslash -30
+KPX Rcaron Otilde -30
+KPX Rcaron T -40
+KPX Rcaron Tcaron -40
+KPX Rcaron Tcommaaccent -40
+KPX Rcaron U -30
+KPX Rcaron Uacute -30
+KPX Rcaron Ucircumflex -30
+KPX Rcaron Udieresis -30
+KPX Rcaron Ugrave -30
+KPX Rcaron Uhungarumlaut -30
+KPX Rcaron Umacron -30
+KPX Rcaron Uogonek -30
+KPX Rcaron Uring -30
+KPX Rcaron V -55
+KPX Rcaron W -35
+KPX Rcaron Y -35
+KPX Rcaron Yacute -35
+KPX Rcaron Ydieresis -35
+KPX Rcommaaccent O -30
+KPX Rcommaaccent Oacute -30
+KPX Rcommaaccent Ocircumflex -30
+KPX Rcommaaccent Odieresis -30
+KPX Rcommaaccent Ograve -30
+KPX Rcommaaccent Ohungarumlaut -30
+KPX Rcommaaccent Omacron -30
+KPX Rcommaaccent Oslash -30
+KPX Rcommaaccent Otilde -30
+KPX Rcommaaccent T -40
+KPX Rcommaaccent Tcaron -40
+KPX Rcommaaccent Tcommaaccent -40
+KPX Rcommaaccent U -30
+KPX Rcommaaccent Uacute -30
+KPX Rcommaaccent Ucircumflex -30
+KPX Rcommaaccent Udieresis -30
+KPX Rcommaaccent Ugrave -30
+KPX Rcommaaccent Uhungarumlaut -30
+KPX Rcommaaccent Umacron -30
+KPX Rcommaaccent Uogonek -30
+KPX Rcommaaccent Uring -30
+KPX Rcommaaccent V -55
+KPX Rcommaaccent W -35
+KPX Rcommaaccent Y -35
+KPX Rcommaaccent Yacute -35
+KPX Rcommaaccent Ydieresis -35
+KPX T A -90
+KPX T Aacute -90
+KPX T Abreve -90
+KPX T Acircumflex -90
+KPX T Adieresis -90
+KPX T Agrave -90
+KPX T Amacron -90
+KPX T Aogonek -90
+KPX T Aring -90
+KPX T Atilde -90
+KPX T O -18
+KPX T Oacute -18
+KPX T Ocircumflex -18
+KPX T Odieresis -18
+KPX T Ograve -18
+KPX T Ohungarumlaut -18
+KPX T Omacron -18
+KPX T Oslash -18
+KPX T Otilde -18
+KPX T a -92
+KPX T aacute -92
+KPX T abreve -52
+KPX T acircumflex -52
+KPX T adieresis -52
+KPX T agrave -52
+KPX T amacron -52
+KPX T aogonek -92
+KPX T aring -92
+KPX T atilde -52
+KPX T colon -74
+KPX T comma -74
+KPX T e -92
+KPX T eacute -92
+KPX T ecaron -92
+KPX T ecircumflex -92
+KPX T edieresis -52
+KPX T edotaccent -92
+KPX T egrave -52
+KPX T emacron -52
+KPX T eogonek -92
+KPX T hyphen -92
+KPX T i -18
+KPX T iacute -18
+KPX T iogonek -18
+KPX T o -92
+KPX T oacute -92
+KPX T ocircumflex -92
+KPX T odieresis -92
+KPX T ograve -92
+KPX T ohungarumlaut -92
+KPX T omacron -92
+KPX T oslash -92
+KPX T otilde -92
+KPX T period -90
+KPX T r -74
+KPX T racute -74
+KPX T rcaron -74
+KPX T rcommaaccent -74
+KPX T semicolon -74
+KPX T u -92
+KPX T uacute -92
+KPX T ucircumflex -92
+KPX T udieresis -92
+KPX T ugrave -92
+KPX T uhungarumlaut -92
+KPX T umacron -92
+KPX T uogonek -92
+KPX T uring -92
+KPX T w -74
+KPX T y -34
+KPX T yacute -34
+KPX T ydieresis -34
+KPX Tcaron A -90
+KPX Tcaron Aacute -90
+KPX Tcaron Abreve -90
+KPX Tcaron Acircumflex -90
+KPX Tcaron Adieresis -90
+KPX Tcaron Agrave -90
+KPX Tcaron Amacron -90
+KPX Tcaron Aogonek -90
+KPX Tcaron Aring -90
+KPX Tcaron Atilde -90
+KPX Tcaron O -18
+KPX Tcaron Oacute -18
+KPX Tcaron Ocircumflex -18
+KPX Tcaron Odieresis -18
+KPX Tcaron Ograve -18
+KPX Tcaron Ohungarumlaut -18
+KPX Tcaron Omacron -18
+KPX Tcaron Oslash -18
+KPX Tcaron Otilde -18
+KPX Tcaron a -92
+KPX Tcaron aacute -92
+KPX Tcaron abreve -52
+KPX Tcaron acircumflex -52
+KPX Tcaron adieresis -52
+KPX Tcaron agrave -52
+KPX Tcaron amacron -52
+KPX Tcaron aogonek -92
+KPX Tcaron aring -92
+KPX Tcaron atilde -52
+KPX Tcaron colon -74
+KPX Tcaron comma -74
+KPX Tcaron e -92
+KPX Tcaron eacute -92
+KPX Tcaron ecaron -92
+KPX Tcaron ecircumflex -92
+KPX Tcaron edieresis -52
+KPX Tcaron edotaccent -92
+KPX Tcaron egrave -52
+KPX Tcaron emacron -52
+KPX Tcaron eogonek -92
+KPX Tcaron hyphen -92
+KPX Tcaron i -18
+KPX Tcaron iacute -18
+KPX Tcaron iogonek -18
+KPX Tcaron o -92
+KPX Tcaron oacute -92
+KPX Tcaron ocircumflex -92
+KPX Tcaron odieresis -92
+KPX Tcaron ograve -92
+KPX Tcaron ohungarumlaut -92
+KPX Tcaron omacron -92
+KPX Tcaron oslash -92
+KPX Tcaron otilde -92
+KPX Tcaron period -90
+KPX Tcaron r -74
+KPX Tcaron racute -74
+KPX Tcaron rcaron -74
+KPX Tcaron rcommaaccent -74
+KPX Tcaron semicolon -74
+KPX Tcaron u -92
+KPX Tcaron uacute -92
+KPX Tcaron ucircumflex -92
+KPX Tcaron udieresis -92
+KPX Tcaron ugrave -92
+KPX Tcaron uhungarumlaut -92
+KPX Tcaron umacron -92
+KPX Tcaron uogonek -92
+KPX Tcaron uring -92
+KPX Tcaron w -74
+KPX Tcaron y -34
+KPX Tcaron yacute -34
+KPX Tcaron ydieresis -34
+KPX Tcommaaccent A -90
+KPX Tcommaaccent Aacute -90
+KPX Tcommaaccent Abreve -90
+KPX Tcommaaccent Acircumflex -90
+KPX Tcommaaccent Adieresis -90
+KPX Tcommaaccent Agrave -90
+KPX Tcommaaccent Amacron -90
+KPX Tcommaaccent Aogonek -90
+KPX Tcommaaccent Aring -90
+KPX Tcommaaccent Atilde -90
+KPX Tcommaaccent O -18
+KPX Tcommaaccent Oacute -18
+KPX Tcommaaccent Ocircumflex -18
+KPX Tcommaaccent Odieresis -18
+KPX Tcommaaccent Ograve -18
+KPX Tcommaaccent Ohungarumlaut -18
+KPX Tcommaaccent Omacron -18
+KPX Tcommaaccent Oslash -18
+KPX Tcommaaccent Otilde -18
+KPX Tcommaaccent a -92
+KPX Tcommaaccent aacute -92
+KPX Tcommaaccent abreve -52
+KPX Tcommaaccent acircumflex -52
+KPX Tcommaaccent adieresis -52
+KPX Tcommaaccent agrave -52
+KPX Tcommaaccent amacron -52
+KPX Tcommaaccent aogonek -92
+KPX Tcommaaccent aring -92
+KPX Tcommaaccent atilde -52
+KPX Tcommaaccent colon -74
+KPX Tcommaaccent comma -74
+KPX Tcommaaccent e -92
+KPX Tcommaaccent eacute -92
+KPX Tcommaaccent ecaron -92
+KPX Tcommaaccent ecircumflex -92
+KPX Tcommaaccent edieresis -52
+KPX Tcommaaccent edotaccent -92
+KPX Tcommaaccent egrave -52
+KPX Tcommaaccent emacron -52
+KPX Tcommaaccent eogonek -92
+KPX Tcommaaccent hyphen -92
+KPX Tcommaaccent i -18
+KPX Tcommaaccent iacute -18
+KPX Tcommaaccent iogonek -18
+KPX Tcommaaccent o -92
+KPX Tcommaaccent oacute -92
+KPX Tcommaaccent ocircumflex -92
+KPX Tcommaaccent odieresis -92
+KPX Tcommaaccent ograve -92
+KPX Tcommaaccent ohungarumlaut -92
+KPX Tcommaaccent omacron -92
+KPX Tcommaaccent oslash -92
+KPX Tcommaaccent otilde -92
+KPX Tcommaaccent period -90
+KPX Tcommaaccent r -74
+KPX Tcommaaccent racute -74
+KPX Tcommaaccent rcaron -74
+KPX Tcommaaccent rcommaaccent -74
+KPX Tcommaaccent semicolon -74
+KPX Tcommaaccent u -92
+KPX Tcommaaccent uacute -92
+KPX Tcommaaccent ucircumflex -92
+KPX Tcommaaccent udieresis -92
+KPX Tcommaaccent ugrave -92
+KPX Tcommaaccent uhungarumlaut -92
+KPX Tcommaaccent umacron -92
+KPX Tcommaaccent uogonek -92
+KPX Tcommaaccent uring -92
+KPX Tcommaaccent w -74
+KPX Tcommaaccent y -34
+KPX Tcommaaccent yacute -34
+KPX Tcommaaccent ydieresis -34
+KPX U A -60
+KPX U Aacute -60
+KPX U Abreve -60
+KPX U Acircumflex -60
+KPX U Adieresis -60
+KPX U Agrave -60
+KPX U Amacron -60
+KPX U Aogonek -60
+KPX U Aring -60
+KPX U Atilde -60
+KPX U comma -50
+KPX U period -50
+KPX Uacute A -60
+KPX Uacute Aacute -60
+KPX Uacute Abreve -60
+KPX Uacute Acircumflex -60
+KPX Uacute Adieresis -60
+KPX Uacute Agrave -60
+KPX Uacute Amacron -60
+KPX Uacute Aogonek -60
+KPX Uacute Aring -60
+KPX Uacute Atilde -60
+KPX Uacute comma -50
+KPX Uacute period -50
+KPX Ucircumflex A -60
+KPX Ucircumflex Aacute -60
+KPX Ucircumflex Abreve -60
+KPX Ucircumflex Acircumflex -60
+KPX Ucircumflex Adieresis -60
+KPX Ucircumflex Agrave -60
+KPX Ucircumflex Amacron -60
+KPX Ucircumflex Aogonek -60
+KPX Ucircumflex Aring -60
+KPX Ucircumflex Atilde -60
+KPX Ucircumflex comma -50
+KPX Ucircumflex period -50
+KPX Udieresis A -60
+KPX Udieresis Aacute -60
+KPX Udieresis Abreve -60
+KPX Udieresis Acircumflex -60
+KPX Udieresis Adieresis -60
+KPX Udieresis Agrave -60
+KPX Udieresis Amacron -60
+KPX Udieresis Aogonek -60
+KPX Udieresis Aring -60
+KPX Udieresis Atilde -60
+KPX Udieresis comma -50
+KPX Udieresis period -50
+KPX Ugrave A -60
+KPX Ugrave Aacute -60
+KPX Ugrave Abreve -60
+KPX Ugrave Acircumflex -60
+KPX Ugrave Adieresis -60
+KPX Ugrave Agrave -60
+KPX Ugrave Amacron -60
+KPX Ugrave Aogonek -60
+KPX Ugrave Aring -60
+KPX Ugrave Atilde -60
+KPX Ugrave comma -50
+KPX Ugrave period -50
+KPX Uhungarumlaut A -60
+KPX Uhungarumlaut Aacute -60
+KPX Uhungarumlaut Abreve -60
+KPX Uhungarumlaut Acircumflex -60
+KPX Uhungarumlaut Adieresis -60
+KPX Uhungarumlaut Agrave -60
+KPX Uhungarumlaut Amacron -60
+KPX Uhungarumlaut Aogonek -60
+KPX Uhungarumlaut Aring -60
+KPX Uhungarumlaut Atilde -60
+KPX Uhungarumlaut comma -50
+KPX Uhungarumlaut period -50
+KPX Umacron A -60
+KPX Umacron Aacute -60
+KPX Umacron Abreve -60
+KPX Umacron Acircumflex -60
+KPX Umacron Adieresis -60
+KPX Umacron Agrave -60
+KPX Umacron Amacron -60
+KPX Umacron Aogonek -60
+KPX Umacron Aring -60
+KPX Umacron Atilde -60
+KPX Umacron comma -50
+KPX Umacron period -50
+KPX Uogonek A -60
+KPX Uogonek Aacute -60
+KPX Uogonek Abreve -60
+KPX Uogonek Acircumflex -60
+KPX Uogonek Adieresis -60
+KPX Uogonek Agrave -60
+KPX Uogonek Amacron -60
+KPX Uogonek Aogonek -60
+KPX Uogonek Aring -60
+KPX Uogonek Atilde -60
+KPX Uogonek comma -50
+KPX Uogonek period -50
+KPX Uring A -60
+KPX Uring Aacute -60
+KPX Uring Abreve -60
+KPX Uring Acircumflex -60
+KPX Uring Adieresis -60
+KPX Uring Agrave -60
+KPX Uring Amacron -60
+KPX Uring Aogonek -60
+KPX Uring Aring -60
+KPX Uring Atilde -60
+KPX Uring comma -50
+KPX Uring period -50
+KPX V A -135
+KPX V Aacute -135
+KPX V Abreve -135
+KPX V Acircumflex -135
+KPX V Adieresis -135
+KPX V Agrave -135
+KPX V Amacron -135
+KPX V Aogonek -135
+KPX V Aring -135
+KPX V Atilde -135
+KPX V G -30
+KPX V Gbreve -30
+KPX V Gcommaaccent -30
+KPX V O -45
+KPX V Oacute -45
+KPX V Ocircumflex -45
+KPX V Odieresis -45
+KPX V Ograve -45
+KPX V Ohungarumlaut -45
+KPX V Omacron -45
+KPX V Oslash -45
+KPX V Otilde -45
+KPX V a -92
+KPX V aacute -92
+KPX V abreve -92
+KPX V acircumflex -92
+KPX V adieresis -92
+KPX V agrave -92
+KPX V amacron -92
+KPX V aogonek -92
+KPX V aring -92
+KPX V atilde -92
+KPX V colon -92
+KPX V comma -129
+KPX V e -100
+KPX V eacute -100
+KPX V ecaron -100
+KPX V ecircumflex -100
+KPX V edieresis -100
+KPX V edotaccent -100
+KPX V egrave -100
+KPX V emacron -100
+KPX V eogonek -100
+KPX V hyphen -74
+KPX V i -37
+KPX V iacute -37
+KPX V icircumflex -37
+KPX V idieresis -37
+KPX V igrave -37
+KPX V imacron -37
+KPX V iogonek -37
+KPX V o -100
+KPX V oacute -100
+KPX V ocircumflex -100
+KPX V odieresis -100
+KPX V ograve -100
+KPX V ohungarumlaut -100
+KPX V omacron -100
+KPX V oslash -100
+KPX V otilde -100
+KPX V period -145
+KPX V semicolon -92
+KPX V u -92
+KPX V uacute -92
+KPX V ucircumflex -92
+KPX V udieresis -92
+KPX V ugrave -92
+KPX V uhungarumlaut -92
+KPX V umacron -92
+KPX V uogonek -92
+KPX V uring -92
+KPX W A -120
+KPX W Aacute -120
+KPX W Abreve -120
+KPX W Acircumflex -120
+KPX W Adieresis -120
+KPX W Agrave -120
+KPX W Amacron -120
+KPX W Aogonek -120
+KPX W Aring -120
+KPX W Atilde -120
+KPX W O -10
+KPX W Oacute -10
+KPX W Ocircumflex -10
+KPX W Odieresis -10
+KPX W Ograve -10
+KPX W Ohungarumlaut -10
+KPX W Omacron -10
+KPX W Oslash -10
+KPX W Otilde -10
+KPX W a -65
+KPX W aacute -65
+KPX W abreve -65
+KPX W acircumflex -65
+KPX W adieresis -65
+KPX W agrave -65
+KPX W amacron -65
+KPX W aogonek -65
+KPX W aring -65
+KPX W atilde -65
+KPX W colon -55
+KPX W comma -92
+KPX W e -65
+KPX W eacute -65
+KPX W ecaron -65
+KPX W ecircumflex -65
+KPX W edieresis -65
+KPX W edotaccent -65
+KPX W egrave -65
+KPX W emacron -65
+KPX W eogonek -65
+KPX W hyphen -37
+KPX W i -18
+KPX W iacute -18
+KPX W iogonek -18
+KPX W o -75
+KPX W oacute -75
+KPX W ocircumflex -75
+KPX W odieresis -75
+KPX W ograve -75
+KPX W ohungarumlaut -75
+KPX W omacron -75
+KPX W oslash -75
+KPX W otilde -75
+KPX W period -92
+KPX W semicolon -55
+KPX W u -50
+KPX W uacute -50
+KPX W ucircumflex -50
+KPX W udieresis -50
+KPX W ugrave -50
+KPX W uhungarumlaut -50
+KPX W umacron -50
+KPX W uogonek -50
+KPX W uring -50
+KPX W y -60
+KPX W yacute -60
+KPX W ydieresis -60
+KPX Y A -110
+KPX Y Aacute -110
+KPX Y Abreve -110
+KPX Y Acircumflex -110
+KPX Y Adieresis -110
+KPX Y Agrave -110
+KPX Y Amacron -110
+KPX Y Aogonek -110
+KPX Y Aring -110
+KPX Y Atilde -110
+KPX Y O -35
+KPX Y Oacute -35
+KPX Y Ocircumflex -35
+KPX Y Odieresis -35
+KPX Y Ograve -35
+KPX Y Ohungarumlaut -35
+KPX Y Omacron -35
+KPX Y Oslash -35
+KPX Y Otilde -35
+KPX Y a -85
+KPX Y aacute -85
+KPX Y abreve -85
+KPX Y acircumflex -85
+KPX Y adieresis -85
+KPX Y agrave -85
+KPX Y amacron -85
+KPX Y aogonek -85
+KPX Y aring -85
+KPX Y atilde -85
+KPX Y colon -92
+KPX Y comma -92
+KPX Y e -111
+KPX Y eacute -111
+KPX Y ecaron -111
+KPX Y ecircumflex -111
+KPX Y edieresis -71
+KPX Y edotaccent -111
+KPX Y egrave -71
+KPX Y emacron -71
+KPX Y eogonek -111
+KPX Y hyphen -92
+KPX Y i -37
+KPX Y iacute -37
+KPX Y iogonek -37
+KPX Y o -111
+KPX Y oacute -111
+KPX Y ocircumflex -111
+KPX Y odieresis -111
+KPX Y ograve -111
+KPX Y ohungarumlaut -111
+KPX Y omacron -111
+KPX Y oslash -111
+KPX Y otilde -111
+KPX Y period -92
+KPX Y semicolon -92
+KPX Y u -92
+KPX Y uacute -92
+KPX Y ucircumflex -92
+KPX Y udieresis -92
+KPX Y ugrave -92
+KPX Y uhungarumlaut -92
+KPX Y umacron -92
+KPX Y uogonek -92
+KPX Y uring -92
+KPX Yacute A -110
+KPX Yacute Aacute -110
+KPX Yacute Abreve -110
+KPX Yacute Acircumflex -110
+KPX Yacute Adieresis -110
+KPX Yacute Agrave -110
+KPX Yacute Amacron -110
+KPX Yacute Aogonek -110
+KPX Yacute Aring -110
+KPX Yacute Atilde -110
+KPX Yacute O -35
+KPX Yacute Oacute -35
+KPX Yacute Ocircumflex -35
+KPX Yacute Odieresis -35
+KPX Yacute Ograve -35
+KPX Yacute Ohungarumlaut -35
+KPX Yacute Omacron -35
+KPX Yacute Oslash -35
+KPX Yacute Otilde -35
+KPX Yacute a -85
+KPX Yacute aacute -85
+KPX Yacute abreve -85
+KPX Yacute acircumflex -85
+KPX Yacute adieresis -85
+KPX Yacute agrave -85
+KPX Yacute amacron -85
+KPX Yacute aogonek -85
+KPX Yacute aring -85
+KPX Yacute atilde -85
+KPX Yacute colon -92
+KPX Yacute comma -92
+KPX Yacute e -111
+KPX Yacute eacute -111
+KPX Yacute ecaron -111
+KPX Yacute ecircumflex -111
+KPX Yacute edieresis -71
+KPX Yacute edotaccent -111
+KPX Yacute egrave -71
+KPX Yacute emacron -71
+KPX Yacute eogonek -111
+KPX Yacute hyphen -92
+KPX Yacute i -37
+KPX Yacute iacute -37
+KPX Yacute iogonek -37
+KPX Yacute o -111
+KPX Yacute oacute -111
+KPX Yacute ocircumflex -111
+KPX Yacute odieresis -111
+KPX Yacute ograve -111
+KPX Yacute ohungarumlaut -111
+KPX Yacute omacron -111
+KPX Yacute oslash -111
+KPX Yacute otilde -111
+KPX Yacute period -92
+KPX Yacute semicolon -92
+KPX Yacute u -92
+KPX Yacute uacute -92
+KPX Yacute ucircumflex -92
+KPX Yacute udieresis -92
+KPX Yacute ugrave -92
+KPX Yacute uhungarumlaut -92
+KPX Yacute umacron -92
+KPX Yacute uogonek -92
+KPX Yacute uring -92
+KPX Ydieresis A -110
+KPX Ydieresis Aacute -110
+KPX Ydieresis Abreve -110
+KPX Ydieresis Acircumflex -110
+KPX Ydieresis Adieresis -110
+KPX Ydieresis Agrave -110
+KPX Ydieresis Amacron -110
+KPX Ydieresis Aogonek -110
+KPX Ydieresis Aring -110
+KPX Ydieresis Atilde -110
+KPX Ydieresis O -35
+KPX Ydieresis Oacute -35
+KPX Ydieresis Ocircumflex -35
+KPX Ydieresis Odieresis -35
+KPX Ydieresis Ograve -35
+KPX Ydieresis Ohungarumlaut -35
+KPX Ydieresis Omacron -35
+KPX Ydieresis Oslash -35
+KPX Ydieresis Otilde -35
+KPX Ydieresis a -85
+KPX Ydieresis aacute -85
+KPX Ydieresis abreve -85
+KPX Ydieresis acircumflex -85
+KPX Ydieresis adieresis -85
+KPX Ydieresis agrave -85
+KPX Ydieresis amacron -85
+KPX Ydieresis aogonek -85
+KPX Ydieresis aring -85
+KPX Ydieresis atilde -85
+KPX Ydieresis colon -92
+KPX Ydieresis comma -92
+KPX Ydieresis e -111
+KPX Ydieresis eacute -111
+KPX Ydieresis ecaron -111
+KPX Ydieresis ecircumflex -111
+KPX Ydieresis edieresis -71
+KPX Ydieresis edotaccent -111
+KPX Ydieresis egrave -71
+KPX Ydieresis emacron -71
+KPX Ydieresis eogonek -111
+KPX Ydieresis hyphen -92
+KPX Ydieresis i -37
+KPX Ydieresis iacute -37
+KPX Ydieresis iogonek -37
+KPX Ydieresis o -111
+KPX Ydieresis oacute -111
+KPX Ydieresis ocircumflex -111
+KPX Ydieresis odieresis -111
+KPX Ydieresis ograve -111
+KPX Ydieresis ohungarumlaut -111
+KPX Ydieresis omacron -111
+KPX Ydieresis oslash -111
+KPX Ydieresis otilde -111
+KPX Ydieresis period -92
+KPX Ydieresis semicolon -92
+KPX Ydieresis u -92
+KPX Ydieresis uacute -92
+KPX Ydieresis ucircumflex -92
+KPX Ydieresis udieresis -92
+KPX Ydieresis ugrave -92
+KPX Ydieresis uhungarumlaut -92
+KPX Ydieresis umacron -92
+KPX Ydieresis uogonek -92
+KPX Ydieresis uring -92
+KPX a v -25
+KPX aacute v -25
+KPX abreve v -25
+KPX acircumflex v -25
+KPX adieresis v -25
+KPX agrave v -25
+KPX amacron v -25
+KPX aogonek v -25
+KPX aring v -25
+KPX atilde v -25
+KPX b b -10
+KPX b period -40
+KPX b u -20
+KPX b uacute -20
+KPX b ucircumflex -20
+KPX b udieresis -20
+KPX b ugrave -20
+KPX b uhungarumlaut -20
+KPX b umacron -20
+KPX b uogonek -20
+KPX b uring -20
+KPX b v -15
+KPX comma quotedblright -45
+KPX comma quoteright -55
+KPX d w -15
+KPX dcroat w -15
+KPX e v -15
+KPX eacute v -15
+KPX ecaron v -15
+KPX ecircumflex v -15
+KPX edieresis v -15
+KPX edotaccent v -15
+KPX egrave v -15
+KPX emacron v -15
+KPX eogonek v -15
+KPX f comma -15
+KPX f dotlessi -35
+KPX f i -25
+KPX f o -25
+KPX f oacute -25
+KPX f ocircumflex -25
+KPX f odieresis -25
+KPX f ograve -25
+KPX f ohungarumlaut -25
+KPX f omacron -25
+KPX f oslash -25
+KPX f otilde -25
+KPX f period -15
+KPX f quotedblright 50
+KPX f quoteright 55
+KPX g period -15
+KPX gbreve period -15
+KPX gcommaaccent period -15
+KPX h y -15
+KPX h yacute -15
+KPX h ydieresis -15
+KPX i v -10
+KPX iacute v -10
+KPX icircumflex v -10
+KPX idieresis v -10
+KPX igrave v -10
+KPX imacron v -10
+KPX iogonek v -10
+KPX k e -10
+KPX k eacute -10
+KPX k ecaron -10
+KPX k ecircumflex -10
+KPX k edieresis -10
+KPX k edotaccent -10
+KPX k egrave -10
+KPX k emacron -10
+KPX k eogonek -10
+KPX k o -15
+KPX k oacute -15
+KPX k ocircumflex -15
+KPX k odieresis -15
+KPX k ograve -15
+KPX k ohungarumlaut -15
+KPX k omacron -15
+KPX k oslash -15
+KPX k otilde -15
+KPX k y -15
+KPX k yacute -15
+KPX k ydieresis -15
+KPX kcommaaccent e -10
+KPX kcommaaccent eacute -10
+KPX kcommaaccent ecaron -10
+KPX kcommaaccent ecircumflex -10
+KPX kcommaaccent edieresis -10
+KPX kcommaaccent edotaccent -10
+KPX kcommaaccent egrave -10
+KPX kcommaaccent emacron -10
+KPX kcommaaccent eogonek -10
+KPX kcommaaccent o -15
+KPX kcommaaccent oacute -15
+KPX kcommaaccent ocircumflex -15
+KPX kcommaaccent odieresis -15
+KPX kcommaaccent ograve -15
+KPX kcommaaccent ohungarumlaut -15
+KPX kcommaaccent omacron -15
+KPX kcommaaccent oslash -15
+KPX kcommaaccent otilde -15
+KPX kcommaaccent y -15
+KPX kcommaaccent yacute -15
+KPX kcommaaccent ydieresis -15
+KPX n v -40
+KPX nacute v -40
+KPX ncaron v -40
+KPX ncommaaccent v -40
+KPX ntilde v -40
+KPX o v -10
+KPX o w -10
+KPX oacute v -10
+KPX oacute w -10
+KPX ocircumflex v -10
+KPX ocircumflex w -10
+KPX odieresis v -10
+KPX odieresis w -10
+KPX ograve v -10
+KPX ograve w -10
+KPX ohungarumlaut v -10
+KPX ohungarumlaut w -10
+KPX omacron v -10
+KPX omacron w -10
+KPX oslash v -10
+KPX oslash w -10
+KPX otilde v -10
+KPX otilde w -10
+KPX period quotedblright -55
+KPX period quoteright -55
+KPX quotedblleft A -10
+KPX quotedblleft Aacute -10
+KPX quotedblleft Abreve -10
+KPX quotedblleft Acircumflex -10
+KPX quotedblleft Adieresis -10
+KPX quotedblleft Agrave -10
+KPX quotedblleft Amacron -10
+KPX quotedblleft Aogonek -10
+KPX quotedblleft Aring -10
+KPX quotedblleft Atilde -10
+KPX quoteleft A -10
+KPX quoteleft Aacute -10
+KPX quoteleft Abreve -10
+KPX quoteleft Acircumflex -10
+KPX quoteleft Adieresis -10
+KPX quoteleft Agrave -10
+KPX quoteleft Amacron -10
+KPX quoteleft Aogonek -10
+KPX quoteleft Aring -10
+KPX quoteleft Atilde -10
+KPX quoteleft quoteleft -63
+KPX quoteright d -20
+KPX quoteright dcroat -20
+KPX quoteright quoteright -63
+KPX quoteright r -20
+KPX quoteright racute -20
+KPX quoteright rcaron -20
+KPX quoteright rcommaaccent -20
+KPX quoteright s -37
+KPX quoteright sacute -37
+KPX quoteright scaron -37
+KPX quoteright scedilla -37
+KPX quoteright scommaaccent -37
+KPX quoteright space -74
+KPX quoteright v -20
+KPX r c -18
+KPX r cacute -18
+KPX r ccaron -18
+KPX r ccedilla -18
+KPX r comma -92
+KPX r e -18
+KPX r eacute -18
+KPX r ecaron -18
+KPX r ecircumflex -18
+KPX r edieresis -18
+KPX r edotaccent -18
+KPX r egrave -18
+KPX r emacron -18
+KPX r eogonek -18
+KPX r g -10
+KPX r gbreve -10
+KPX r gcommaaccent -10
+KPX r hyphen -37
+KPX r n -15
+KPX r nacute -15
+KPX r ncaron -15
+KPX r ncommaaccent -15
+KPX r ntilde -15
+KPX r o -18
+KPX r oacute -18
+KPX r ocircumflex -18
+KPX r odieresis -18
+KPX r ograve -18
+KPX r ohungarumlaut -18
+KPX r omacron -18
+KPX r oslash -18
+KPX r otilde -18
+KPX r p -10
+KPX r period -100
+KPX r q -18
+KPX r v -10
+KPX racute c -18
+KPX racute cacute -18
+KPX racute ccaron -18
+KPX racute ccedilla -18
+KPX racute comma -92
+KPX racute e -18
+KPX racute eacute -18
+KPX racute ecaron -18
+KPX racute ecircumflex -18
+KPX racute edieresis -18
+KPX racute edotaccent -18
+KPX racute egrave -18
+KPX racute emacron -18
+KPX racute eogonek -18
+KPX racute g -10
+KPX racute gbreve -10
+KPX racute gcommaaccent -10
+KPX racute hyphen -37
+KPX racute n -15
+KPX racute nacute -15
+KPX racute ncaron -15
+KPX racute ncommaaccent -15
+KPX racute ntilde -15
+KPX racute o -18
+KPX racute oacute -18
+KPX racute ocircumflex -18
+KPX racute odieresis -18
+KPX racute ograve -18
+KPX racute ohungarumlaut -18
+KPX racute omacron -18
+KPX racute oslash -18
+KPX racute otilde -18
+KPX racute p -10
+KPX racute period -100
+KPX racute q -18
+KPX racute v -10
+KPX rcaron c -18
+KPX rcaron cacute -18
+KPX rcaron ccaron -18
+KPX rcaron ccedilla -18
+KPX rcaron comma -92
+KPX rcaron e -18
+KPX rcaron eacute -18
+KPX rcaron ecaron -18
+KPX rcaron ecircumflex -18
+KPX rcaron edieresis -18
+KPX rcaron edotaccent -18
+KPX rcaron egrave -18
+KPX rcaron emacron -18
+KPX rcaron eogonek -18
+KPX rcaron g -10
+KPX rcaron gbreve -10
+KPX rcaron gcommaaccent -10
+KPX rcaron hyphen -37
+KPX rcaron n -15
+KPX rcaron nacute -15
+KPX rcaron ncaron -15
+KPX rcaron ncommaaccent -15
+KPX rcaron ntilde -15
+KPX rcaron o -18
+KPX rcaron oacute -18
+KPX rcaron ocircumflex -18
+KPX rcaron odieresis -18
+KPX rcaron ograve -18
+KPX rcaron ohungarumlaut -18
+KPX rcaron omacron -18
+KPX rcaron oslash -18
+KPX rcaron otilde -18
+KPX rcaron p -10
+KPX rcaron period -100
+KPX rcaron q -18
+KPX rcaron v -10
+KPX rcommaaccent c -18
+KPX rcommaaccent cacute -18
+KPX rcommaaccent ccaron -18
+KPX rcommaaccent ccedilla -18
+KPX rcommaaccent comma -92
+KPX rcommaaccent e -18
+KPX rcommaaccent eacute -18
+KPX rcommaaccent ecaron -18
+KPX rcommaaccent ecircumflex -18
+KPX rcommaaccent edieresis -18
+KPX rcommaaccent edotaccent -18
+KPX rcommaaccent egrave -18
+KPX rcommaaccent emacron -18
+KPX rcommaaccent eogonek -18
+KPX rcommaaccent g -10
+KPX rcommaaccent gbreve -10
+KPX rcommaaccent gcommaaccent -10
+KPX rcommaaccent hyphen -37
+KPX rcommaaccent n -15
+KPX rcommaaccent nacute -15
+KPX rcommaaccent ncaron -15
+KPX rcommaaccent ncommaaccent -15
+KPX rcommaaccent ntilde -15
+KPX rcommaaccent o -18
+KPX rcommaaccent oacute -18
+KPX rcommaaccent ocircumflex -18
+KPX rcommaaccent odieresis -18
+KPX rcommaaccent ograve -18
+KPX rcommaaccent ohungarumlaut -18
+KPX rcommaaccent omacron -18
+KPX rcommaaccent oslash -18
+KPX rcommaaccent otilde -18
+KPX rcommaaccent p -10
+KPX rcommaaccent period -100
+KPX rcommaaccent q -18
+KPX rcommaaccent v -10
+KPX space A -55
+KPX space Aacute -55
+KPX space Abreve -55
+KPX space Acircumflex -55
+KPX space Adieresis -55
+KPX space Agrave -55
+KPX space Amacron -55
+KPX space Aogonek -55
+KPX space Aring -55
+KPX space Atilde -55
+KPX space T -30
+KPX space Tcaron -30
+KPX space Tcommaaccent -30
+KPX space V -45
+KPX space W -30
+KPX space Y -55
+KPX space Yacute -55
+KPX space Ydieresis -55
+KPX v a -10
+KPX v aacute -10
+KPX v abreve -10
+KPX v acircumflex -10
+KPX v adieresis -10
+KPX v agrave -10
+KPX v amacron -10
+KPX v aogonek -10
+KPX v aring -10
+KPX v atilde -10
+KPX v comma -55
+KPX v e -10
+KPX v eacute -10
+KPX v ecaron -10
+KPX v ecircumflex -10
+KPX v edieresis -10
+KPX v edotaccent -10
+KPX v egrave -10
+KPX v emacron -10
+KPX v eogonek -10
+KPX v o -10
+KPX v oacute -10
+KPX v ocircumflex -10
+KPX v odieresis -10
+KPX v ograve -10
+KPX v ohungarumlaut -10
+KPX v omacron -10
+KPX v oslash -10
+KPX v otilde -10
+KPX v period -70
+KPX w comma -55
+KPX w o -10
+KPX w oacute -10
+KPX w ocircumflex -10
+KPX w odieresis -10
+KPX w ograve -10
+KPX w ohungarumlaut -10
+KPX w omacron -10
+KPX w oslash -10
+KPX w otilde -10
+KPX w period -70
+KPX y comma -55
+KPX y e -10
+KPX y eacute -10
+KPX y ecaron -10
+KPX y ecircumflex -10
+KPX y edieresis -10
+KPX y edotaccent -10
+KPX y egrave -10
+KPX y emacron -10
+KPX y eogonek -10
+KPX y o -25
+KPX y oacute -25
+KPX y ocircumflex -25
+KPX y odieresis -25
+KPX y ograve -25
+KPX y ohungarumlaut -25
+KPX y omacron -25
+KPX y oslash -25
+KPX y otilde -25
+KPX y period -70
+KPX yacute comma -55
+KPX yacute e -10
+KPX yacute eacute -10
+KPX yacute ecaron -10
+KPX yacute ecircumflex -10
+KPX yacute edieresis -10
+KPX yacute edotaccent -10
+KPX yacute egrave -10
+KPX yacute emacron -10
+KPX yacute eogonek -10
+KPX yacute o -25
+KPX yacute oacute -25
+KPX yacute ocircumflex -25
+KPX yacute odieresis -25
+KPX yacute ograve -25
+KPX yacute ohungarumlaut -25
+KPX yacute omacron -25
+KPX yacute oslash -25
+KPX yacute otilde -25
+KPX yacute period -70
+KPX ydieresis comma -55
+KPX ydieresis e -10
+KPX ydieresis eacute -10
+KPX ydieresis ecaron -10
+KPX ydieresis ecircumflex -10
+KPX ydieresis edieresis -10
+KPX ydieresis edotaccent -10
+KPX ydieresis egrave -10
+KPX ydieresis emacron -10
+KPX ydieresis eogonek -10
+KPX ydieresis o -25
+KPX ydieresis oacute -25
+KPX ydieresis ocircumflex -25
+KPX ydieresis odieresis -25
+KPX ydieresis ograve -25
+KPX ydieresis ohungarumlaut -25
+KPX ydieresis omacron -25
+KPX ydieresis oslash -25
+KPX ydieresis otilde -25
+KPX ydieresis period -70
+EndKernPairs
+EndKernData
+EndFontMetrics
diff --git a/src/main/resources/com/lowagie/text/pdf/fonts/Times-BoldItalic.afm b/src/main/resources/com/lowagie/text/pdf/fonts/Times-BoldItalic.afm
new file mode 100644
index 0000000..6da5178
--- /dev/null
+++ b/src/main/resources/com/lowagie/text/pdf/fonts/Times-BoldItalic.afm
@@ -0,0 +1,2384 @@
+StartFontMetrics 4.1
+Comment Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.
+Comment Creation Date: Thu May 1 13:04:06 1997
+Comment UniqueID 43066
+Comment VMusage 45874 56899
+FontName Times-BoldItalic
+FullName Times Bold Italic
+FamilyName Times
+Weight Bold
+ItalicAngle -15
+IsFixedPitch false
+CharacterSet ExtendedRoman
+FontBBox -200 -218 996 921
+UnderlinePosition -100
+UnderlineThickness 50
+Version 002.000
+Notice Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.Times is a trademark of Linotype-Hell AG and/or its subsidiaries.
+EncodingScheme AdobeStandardEncoding
+CapHeight 669
+XHeight 462
+Ascender 683
+Descender -217
+StdHW 42
+StdVW 121
+StartCharMetrics 315
+C 32 ; WX 250 ; N space ; B 0 0 0 0 ;
+C 33 ; WX 389 ; N exclam ; B 67 -13 370 684 ;
+C 34 ; WX 555 ; N quotedbl ; B 136 398 536 685 ;
+C 35 ; WX 500 ; N numbersign ; B -33 0 533 700 ;
+C 36 ; WX 500 ; N dollar ; B -20 -100 497 733 ;
+C 37 ; WX 833 ; N percent ; B 39 -10 793 692 ;
+C 38 ; WX 778 ; N ampersand ; B 5 -19 699 682 ;
+C 39 ; WX 333 ; N quoteright ; B 98 369 302 685 ;
+C 40 ; WX 333 ; N parenleft ; B 28 -179 344 685 ;
+C 41 ; WX 333 ; N parenright ; B -44 -179 271 685 ;
+C 42 ; WX 500 ; N asterisk ; B 65 249 456 685 ;
+C 43 ; WX 570 ; N plus ; B 33 0 537 506 ;
+C 44 ; WX 250 ; N comma ; B -60 -182 144 134 ;
+C 45 ; WX 333 ; N hyphen ; B 2 166 271 282 ;
+C 46 ; WX 250 ; N period ; B -9 -13 139 135 ;
+C 47 ; WX 278 ; N slash ; B -64 -18 342 685 ;
+C 48 ; WX 500 ; N zero ; B 17 -14 477 683 ;
+C 49 ; WX 500 ; N one ; B 5 0 419 683 ;
+C 50 ; WX 500 ; N two ; B -27 0 446 683 ;
+C 51 ; WX 500 ; N three ; B -15 -13 450 683 ;
+C 52 ; WX 500 ; N four ; B -15 0 503 683 ;
+C 53 ; WX 500 ; N five ; B -11 -13 487 669 ;
+C 54 ; WX 500 ; N six ; B 23 -15 509 679 ;
+C 55 ; WX 500 ; N seven ; B 52 0 525 669 ;
+C 56 ; WX 500 ; N eight ; B 3 -13 476 683 ;
+C 57 ; WX 500 ; N nine ; B -12 -10 475 683 ;
+C 58 ; WX 333 ; N colon ; B 23 -13 264 459 ;
+C 59 ; WX 333 ; N semicolon ; B -25 -183 264 459 ;
+C 60 ; WX 570 ; N less ; B 31 -8 539 514 ;
+C 61 ; WX 570 ; N equal ; B 33 107 537 399 ;
+C 62 ; WX 570 ; N greater ; B 31 -8 539 514 ;
+C 63 ; WX 500 ; N question ; B 79 -13 470 684 ;
+C 64 ; WX 832 ; N at ; B 63 -18 770 685 ;
+C 65 ; WX 667 ; N A ; B -67 0 593 683 ;
+C 66 ; WX 667 ; N B ; B -24 0 624 669 ;
+C 67 ; WX 667 ; N C ; B 32 -18 677 685 ;
+C 68 ; WX 722 ; N D ; B -46 0 685 669 ;
+C 69 ; WX 667 ; N E ; B -27 0 653 669 ;
+C 70 ; WX 667 ; N F ; B -13 0 660 669 ;
+C 71 ; WX 722 ; N G ; B 21 -18 706 685 ;
+C 72 ; WX 778 ; N H ; B -24 0 799 669 ;
+C 73 ; WX 389 ; N I ; B -32 0 406 669 ;
+C 74 ; WX 500 ; N J ; B -46 -99 524 669 ;
+C 75 ; WX 667 ; N K ; B -21 0 702 669 ;
+C 76 ; WX 611 ; N L ; B -22 0 590 669 ;
+C 77 ; WX 889 ; N M ; B -29 -12 917 669 ;
+C 78 ; WX 722 ; N N ; B -27 -15 748 669 ;
+C 79 ; WX 722 ; N O ; B 27 -18 691 685 ;
+C 80 ; WX 611 ; N P ; B -27 0 613 669 ;
+C 81 ; WX 722 ; N Q ; B 27 -208 691 685 ;
+C 82 ; WX 667 ; N R ; B -29 0 623 669 ;
+C 83 ; WX 556 ; N S ; B 2 -18 526 685 ;
+C 84 ; WX 611 ; N T ; B 50 0 650 669 ;
+C 85 ; WX 722 ; N U ; B 67 -18 744 669 ;
+C 86 ; WX 667 ; N V ; B 65 -18 715 669 ;
+C 87 ; WX 889 ; N W ; B 65 -18 940 669 ;
+C 88 ; WX 667 ; N X ; B -24 0 694 669 ;
+C 89 ; WX 611 ; N Y ; B 73 0 659 669 ;
+C 90 ; WX 611 ; N Z ; B -11 0 590 669 ;
+C 91 ; WX 333 ; N bracketleft ; B -37 -159 362 674 ;
+C 92 ; WX 278 ; N backslash ; B -1 -18 279 685 ;
+C 93 ; WX 333 ; N bracketright ; B -56 -157 343 674 ;
+C 94 ; WX 570 ; N asciicircum ; B 67 304 503 669 ;
+C 95 ; WX 500 ; N underscore ; B 0 -125 500 -75 ;
+C 96 ; WX 333 ; N quoteleft ; B 128 369 332 685 ;
+C 97 ; WX 500 ; N a ; B -21 -14 455 462 ;
+C 98 ; WX 500 ; N b ; B -14 -13 444 699 ;
+C 99 ; WX 444 ; N c ; B -5 -13 392 462 ;
+C 100 ; WX 500 ; N d ; B -21 -13 517 699 ;
+C 101 ; WX 444 ; N e ; B 5 -13 398 462 ;
+C 102 ; WX 333 ; N f ; B -169 -205 446 698 ; L i fi ; L l fl ;
+C 103 ; WX 500 ; N g ; B -52 -203 478 462 ;
+C 104 ; WX 556 ; N h ; B -13 -9 498 699 ;
+C 105 ; WX 278 ; N i ; B 2 -9 263 684 ;
+C 106 ; WX 278 ; N j ; B -189 -207 279 684 ;
+C 107 ; WX 500 ; N k ; B -23 -8 483 699 ;
+C 108 ; WX 278 ; N l ; B 2 -9 290 699 ;
+C 109 ; WX 778 ; N m ; B -14 -9 722 462 ;
+C 110 ; WX 556 ; N n ; B -6 -9 493 462 ;
+C 111 ; WX 500 ; N o ; B -3 -13 441 462 ;
+C 112 ; WX 500 ; N p ; B -120 -205 446 462 ;
+C 113 ; WX 500 ; N q ; B 1 -205 471 462 ;
+C 114 ; WX 389 ; N r ; B -21 0 389 462 ;
+C 115 ; WX 389 ; N s ; B -19 -13 333 462 ;
+C 116 ; WX 278 ; N t ; B -11 -9 281 594 ;
+C 117 ; WX 556 ; N u ; B 15 -9 492 462 ;
+C 118 ; WX 444 ; N v ; B 16 -13 401 462 ;
+C 119 ; WX 667 ; N w ; B 16 -13 614 462 ;
+C 120 ; WX 500 ; N x ; B -46 -13 469 462 ;
+C 121 ; WX 444 ; N y ; B -94 -205 392 462 ;
+C 122 ; WX 389 ; N z ; B -43 -78 368 449 ;
+C 123 ; WX 348 ; N braceleft ; B 5 -187 436 686 ;
+C 124 ; WX 220 ; N bar ; B 66 -218 154 782 ;
+C 125 ; WX 348 ; N braceright ; B -129 -187 302 686 ;
+C 126 ; WX 570 ; N asciitilde ; B 54 173 516 333 ;
+C 161 ; WX 389 ; N exclamdown ; B 19 -205 322 492 ;
+C 162 ; WX 500 ; N cent ; B 42 -143 439 576 ;
+C 163 ; WX 500 ; N sterling ; B -32 -12 510 683 ;
+C 164 ; WX 167 ; N fraction ; B -169 -14 324 683 ;
+C 165 ; WX 500 ; N yen ; B 33 0 628 669 ;
+C 166 ; WX 500 ; N florin ; B -87 -156 537 707 ;
+C 167 ; WX 500 ; N section ; B 36 -143 459 685 ;
+C 168 ; WX 500 ; N currency ; B -26 34 526 586 ;
+C 169 ; WX 278 ; N quotesingle ; B 128 398 268 685 ;
+C 170 ; WX 500 ; N quotedblleft ; B 53 369 513 685 ;
+C 171 ; WX 500 ; N guillemotleft ; B 12 32 468 415 ;
+C 172 ; WX 333 ; N guilsinglleft ; B 32 32 303 415 ;
+C 173 ; WX 333 ; N guilsinglright ; B 10 32 281 415 ;
+C 174 ; WX 556 ; N fi ; B -188 -205 514 703 ;
+C 175 ; WX 556 ; N fl ; B -186 -205 553 704 ;
+C 177 ; WX 500 ; N endash ; B -40 178 477 269 ;
+C 178 ; WX 500 ; N dagger ; B 91 -145 494 685 ;
+C 179 ; WX 500 ; N daggerdbl ; B 10 -139 493 685 ;
+C 180 ; WX 250 ; N periodcentered ; B 51 257 199 405 ;
+C 182 ; WX 500 ; N paragraph ; B -57 -193 562 669 ;
+C 183 ; WX 350 ; N bullet ; B 0 175 350 525 ;
+C 184 ; WX 333 ; N quotesinglbase ; B -5 -182 199 134 ;
+C 185 ; WX 500 ; N quotedblbase ; B -57 -182 403 134 ;
+C 186 ; WX 500 ; N quotedblright ; B 53 369 513 685 ;
+C 187 ; WX 500 ; N guillemotright ; B 12 32 468 415 ;
+C 188 ; WX 1000 ; N ellipsis ; B 40 -13 852 135 ;
+C 189 ; WX 1000 ; N perthousand ; B 7 -29 996 706 ;
+C 191 ; WX 500 ; N questiondown ; B 30 -205 421 492 ;
+C 193 ; WX 333 ; N grave ; B 85 516 297 697 ;
+C 194 ; WX 333 ; N acute ; B 139 516 379 697 ;
+C 195 ; WX 333 ; N circumflex ; B 40 516 367 690 ;
+C 196 ; WX 333 ; N tilde ; B 48 536 407 655 ;
+C 197 ; WX 333 ; N macron ; B 51 553 393 623 ;
+C 198 ; WX 333 ; N breve ; B 71 516 387 678 ;
+C 199 ; WX 333 ; N dotaccent ; B 163 550 298 684 ;
+C 200 ; WX 333 ; N dieresis ; B 55 550 402 684 ;
+C 202 ; WX 333 ; N ring ; B 127 516 340 729 ;
+C 203 ; WX 333 ; N cedilla ; B -80 -218 156 5 ;
+C 205 ; WX 333 ; N hungarumlaut ; B 69 516 498 697 ;
+C 206 ; WX 333 ; N ogonek ; B 15 -183 244 34 ;
+C 207 ; WX 333 ; N caron ; B 79 516 411 690 ;
+C 208 ; WX 1000 ; N emdash ; B -40 178 977 269 ;
+C 225 ; WX 944 ; N AE ; B -64 0 918 669 ;
+C 227 ; WX 266 ; N ordfeminine ; B 16 399 330 685 ;
+C 232 ; WX 611 ; N Lslash ; B -22 0 590 669 ;
+C 233 ; WX 722 ; N Oslash ; B 27 -125 691 764 ;
+C 234 ; WX 944 ; N OE ; B 23 -8 946 677 ;
+C 235 ; WX 300 ; N ordmasculine ; B 56 400 347 685 ;
+C 241 ; WX 722 ; N ae ; B -5 -13 673 462 ;
+C 245 ; WX 278 ; N dotlessi ; B 2 -9 238 462 ;
+C 248 ; WX 278 ; N lslash ; B -7 -9 307 699 ;
+C 249 ; WX 500 ; N oslash ; B -3 -119 441 560 ;
+C 250 ; WX 722 ; N oe ; B 6 -13 674 462 ;
+C 251 ; WX 500 ; N germandbls ; B -200 -200 473 705 ;
+C -1 ; WX 389 ; N Idieresis ; B -32 0 450 862 ;
+C -1 ; WX 444 ; N eacute ; B 5 -13 435 697 ;
+C -1 ; WX 500 ; N abreve ; B -21 -14 471 678 ;
+C -1 ; WX 556 ; N uhungarumlaut ; B 15 -9 610 697 ;
+C -1 ; WX 444 ; N ecaron ; B 5 -13 467 690 ;
+C -1 ; WX 611 ; N Ydieresis ; B 73 0 659 862 ;
+C -1 ; WX 570 ; N divide ; B 33 -29 537 535 ;
+C -1 ; WX 611 ; N Yacute ; B 73 0 659 904 ;
+C -1 ; WX 667 ; N Acircumflex ; B -67 0 593 897 ;
+C -1 ; WX 500 ; N aacute ; B -21 -14 463 697 ;
+C -1 ; WX 722 ; N Ucircumflex ; B 67 -18 744 897 ;
+C -1 ; WX 444 ; N yacute ; B -94 -205 435 697 ;
+C -1 ; WX 389 ; N scommaaccent ; B -19 -218 333 462 ;
+C -1 ; WX 444 ; N ecircumflex ; B 5 -13 423 690 ;
+C -1 ; WX 722 ; N Uring ; B 67 -18 744 921 ;
+C -1 ; WX 722 ; N Udieresis ; B 67 -18 744 862 ;
+C -1 ; WX 500 ; N aogonek ; B -21 -183 455 462 ;
+C -1 ; WX 722 ; N Uacute ; B 67 -18 744 904 ;
+C -1 ; WX 556 ; N uogonek ; B 15 -183 492 462 ;
+C -1 ; WX 667 ; N Edieresis ; B -27 0 653 862 ;
+C -1 ; WX 722 ; N Dcroat ; B -31 0 700 669 ;
+C -1 ; WX 250 ; N commaaccent ; B -36 -218 131 -50 ;
+C -1 ; WX 747 ; N copyright ; B 30 -18 718 685 ;
+C -1 ; WX 667 ; N Emacron ; B -27 0 653 830 ;
+C -1 ; WX 444 ; N ccaron ; B -5 -13 467 690 ;
+C -1 ; WX 500 ; N aring ; B -21 -14 455 729 ;
+C -1 ; WX 722 ; N Ncommaaccent ; B -27 -218 748 669 ;
+C -1 ; WX 278 ; N lacute ; B 2 -9 392 904 ;
+C -1 ; WX 500 ; N agrave ; B -21 -14 455 697 ;
+C -1 ; WX 611 ; N Tcommaaccent ; B 50 -218 650 669 ;
+C -1 ; WX 667 ; N Cacute ; B 32 -18 677 904 ;
+C -1 ; WX 500 ; N atilde ; B -21 -14 491 655 ;
+C -1 ; WX 667 ; N Edotaccent ; B -27 0 653 862 ;
+C -1 ; WX 389 ; N scaron ; B -19 -13 424 690 ;
+C -1 ; WX 389 ; N scedilla ; B -19 -218 333 462 ;
+C -1 ; WX 278 ; N iacute ; B 2 -9 352 697 ;
+C -1 ; WX 494 ; N lozenge ; B 10 0 484 745 ;
+C -1 ; WX 667 ; N Rcaron ; B -29 0 623 897 ;
+C -1 ; WX 722 ; N Gcommaaccent ; B 21 -218 706 685 ;
+C -1 ; WX 556 ; N ucircumflex ; B 15 -9 492 690 ;
+C -1 ; WX 500 ; N acircumflex ; B -21 -14 455 690 ;
+C -1 ; WX 667 ; N Amacron ; B -67 0 593 830 ;
+C -1 ; WX 389 ; N rcaron ; B -21 0 424 690 ;
+C -1 ; WX 444 ; N ccedilla ; B -5 -218 392 462 ;
+C -1 ; WX 611 ; N Zdotaccent ; B -11 0 590 862 ;
+C -1 ; WX 611 ; N Thorn ; B -27 0 573 669 ;
+C -1 ; WX 722 ; N Omacron ; B 27 -18 691 830 ;
+C -1 ; WX 667 ; N Racute ; B -29 0 623 904 ;
+C -1 ; WX 556 ; N Sacute ; B 2 -18 531 904 ;
+C -1 ; WX 608 ; N dcaron ; B -21 -13 675 708 ;
+C -1 ; WX 722 ; N Umacron ; B 67 -18 744 830 ;
+C -1 ; WX 556 ; N uring ; B 15 -9 492 729 ;
+C -1 ; WX 300 ; N threesuperior ; B 17 265 321 683 ;
+C -1 ; WX 722 ; N Ograve ; B 27 -18 691 904 ;
+C -1 ; WX 667 ; N Agrave ; B -67 0 593 904 ;
+C -1 ; WX 667 ; N Abreve ; B -67 0 593 885 ;
+C -1 ; WX 570 ; N multiply ; B 48 16 522 490 ;
+C -1 ; WX 556 ; N uacute ; B 15 -9 492 697 ;
+C -1 ; WX 611 ; N Tcaron ; B 50 0 650 897 ;
+C -1 ; WX 494 ; N partialdiff ; B 11 -21 494 750 ;
+C -1 ; WX 444 ; N ydieresis ; B -94 -205 443 655 ;
+C -1 ; WX 722 ; N Nacute ; B -27 -15 748 904 ;
+C -1 ; WX 278 ; N icircumflex ; B -3 -9 324 690 ;
+C -1 ; WX 667 ; N Ecircumflex ; B -27 0 653 897 ;
+C -1 ; WX 500 ; N adieresis ; B -21 -14 476 655 ;
+C -1 ; WX 444 ; N edieresis ; B 5 -13 448 655 ;
+C -1 ; WX 444 ; N cacute ; B -5 -13 435 697 ;
+C -1 ; WX 556 ; N nacute ; B -6 -9 493 697 ;
+C -1 ; WX 556 ; N umacron ; B 15 -9 492 623 ;
+C -1 ; WX 722 ; N Ncaron ; B -27 -15 748 897 ;
+C -1 ; WX 389 ; N Iacute ; B -32 0 432 904 ;
+C -1 ; WX 570 ; N plusminus ; B 33 0 537 506 ;
+C -1 ; WX 220 ; N brokenbar ; B 66 -143 154 707 ;
+C -1 ; WX 747 ; N registered ; B 30 -18 718 685 ;
+C -1 ; WX 722 ; N Gbreve ; B 21 -18 706 885 ;
+C -1 ; WX 389 ; N Idotaccent ; B -32 0 406 862 ;
+C -1 ; WX 600 ; N summation ; B 14 -10 585 706 ;
+C -1 ; WX 667 ; N Egrave ; B -27 0 653 904 ;
+C -1 ; WX 389 ; N racute ; B -21 0 407 697 ;
+C -1 ; WX 500 ; N omacron ; B -3 -13 462 623 ;
+C -1 ; WX 611 ; N Zacute ; B -11 0 590 904 ;
+C -1 ; WX 611 ; N Zcaron ; B -11 0 590 897 ;
+C -1 ; WX 549 ; N greaterequal ; B 26 0 523 704 ;
+C -1 ; WX 722 ; N Eth ; B -31 0 700 669 ;
+C -1 ; WX 667 ; N Ccedilla ; B 32 -218 677 685 ;
+C -1 ; WX 278 ; N lcommaaccent ; B -42 -218 290 699 ;
+C -1 ; WX 366 ; N tcaron ; B -11 -9 434 754 ;
+C -1 ; WX 444 ; N eogonek ; B 5 -183 398 462 ;
+C -1 ; WX 722 ; N Uogonek ; B 67 -183 744 669 ;
+C -1 ; WX 667 ; N Aacute ; B -67 0 593 904 ;
+C -1 ; WX 667 ; N Adieresis ; B -67 0 593 862 ;
+C -1 ; WX 444 ; N egrave ; B 5 -13 398 697 ;
+C -1 ; WX 389 ; N zacute ; B -43 -78 407 697 ;
+C -1 ; WX 278 ; N iogonek ; B -20 -183 263 684 ;
+C -1 ; WX 722 ; N Oacute ; B 27 -18 691 904 ;
+C -1 ; WX 500 ; N oacute ; B -3 -13 463 697 ;
+C -1 ; WX 500 ; N amacron ; B -21 -14 467 623 ;
+C -1 ; WX 389 ; N sacute ; B -19 -13 407 697 ;
+C -1 ; WX 278 ; N idieresis ; B 2 -9 364 655 ;
+C -1 ; WX 722 ; N Ocircumflex ; B 27 -18 691 897 ;
+C -1 ; WX 722 ; N Ugrave ; B 67 -18 744 904 ;
+C -1 ; WX 612 ; N Delta ; B 6 0 608 688 ;
+C -1 ; WX 500 ; N thorn ; B -120 -205 446 699 ;
+C -1 ; WX 300 ; N twosuperior ; B 2 274 313 683 ;
+C -1 ; WX 722 ; N Odieresis ; B 27 -18 691 862 ;
+C -1 ; WX 576 ; N mu ; B -60 -207 516 449 ;
+C -1 ; WX 278 ; N igrave ; B 2 -9 259 697 ;
+C -1 ; WX 500 ; N ohungarumlaut ; B -3 -13 582 697 ;
+C -1 ; WX 667 ; N Eogonek ; B -27 -183 653 669 ;
+C -1 ; WX 500 ; N dcroat ; B -21 -13 552 699 ;
+C -1 ; WX 750 ; N threequarters ; B 7 -14 726 683 ;
+C -1 ; WX 556 ; N Scedilla ; B 2 -218 526 685 ;
+C -1 ; WX 382 ; N lcaron ; B 2 -9 448 708 ;
+C -1 ; WX 667 ; N Kcommaaccent ; B -21 -218 702 669 ;
+C -1 ; WX 611 ; N Lacute ; B -22 0 590 904 ;
+C -1 ; WX 1000 ; N trademark ; B 32 263 968 669 ;
+C -1 ; WX 444 ; N edotaccent ; B 5 -13 398 655 ;
+C -1 ; WX 389 ; N Igrave ; B -32 0 406 904 ;
+C -1 ; WX 389 ; N Imacron ; B -32 0 461 830 ;
+C -1 ; WX 611 ; N Lcaron ; B -22 0 671 718 ;
+C -1 ; WX 750 ; N onehalf ; B -9 -14 723 683 ;
+C -1 ; WX 549 ; N lessequal ; B 29 0 526 704 ;
+C -1 ; WX 500 ; N ocircumflex ; B -3 -13 451 690 ;
+C -1 ; WX 556 ; N ntilde ; B -6 -9 504 655 ;
+C -1 ; WX 722 ; N Uhungarumlaut ; B 67 -18 744 904 ;
+C -1 ; WX 667 ; N Eacute ; B -27 0 653 904 ;
+C -1 ; WX 444 ; N emacron ; B 5 -13 439 623 ;
+C -1 ; WX 500 ; N gbreve ; B -52 -203 478 678 ;
+C -1 ; WX 750 ; N onequarter ; B 7 -14 721 683 ;
+C -1 ; WX 556 ; N Scaron ; B 2 -18 553 897 ;
+C -1 ; WX 556 ; N Scommaaccent ; B 2 -218 526 685 ;
+C -1 ; WX 722 ; N Ohungarumlaut ; B 27 -18 723 904 ;
+C -1 ; WX 400 ; N degree ; B 83 397 369 683 ;
+C -1 ; WX 500 ; N ograve ; B -3 -13 441 697 ;
+C -1 ; WX 667 ; N Ccaron ; B 32 -18 677 897 ;
+C -1 ; WX 556 ; N ugrave ; B 15 -9 492 697 ;
+C -1 ; WX 549 ; N radical ; B 10 -46 512 850 ;
+C -1 ; WX 722 ; N Dcaron ; B -46 0 685 897 ;
+C -1 ; WX 389 ; N rcommaaccent ; B -67 -218 389 462 ;
+C -1 ; WX 722 ; N Ntilde ; B -27 -15 748 862 ;
+C -1 ; WX 500 ; N otilde ; B -3 -13 491 655 ;
+C -1 ; WX 667 ; N Rcommaaccent ; B -29 -218 623 669 ;
+C -1 ; WX 611 ; N Lcommaaccent ; B -22 -218 590 669 ;
+C -1 ; WX 667 ; N Atilde ; B -67 0 593 862 ;
+C -1 ; WX 667 ; N Aogonek ; B -67 -183 604 683 ;
+C -1 ; WX 667 ; N Aring ; B -67 0 593 921 ;
+C -1 ; WX 722 ; N Otilde ; B 27 -18 691 862 ;
+C -1 ; WX 389 ; N zdotaccent ; B -43 -78 368 655 ;
+C -1 ; WX 667 ; N Ecaron ; B -27 0 653 897 ;
+C -1 ; WX 389 ; N Iogonek ; B -32 -183 406 669 ;
+C -1 ; WX 500 ; N kcommaaccent ; B -23 -218 483 699 ;
+C -1 ; WX 606 ; N minus ; B 51 209 555 297 ;
+C -1 ; WX 389 ; N Icircumflex ; B -32 0 450 897 ;
+C -1 ; WX 556 ; N ncaron ; B -6 -9 523 690 ;
+C -1 ; WX 278 ; N tcommaaccent ; B -62 -218 281 594 ;
+C -1 ; WX 606 ; N logicalnot ; B 51 108 555 399 ;
+C -1 ; WX 500 ; N odieresis ; B -3 -13 471 655 ;
+C -1 ; WX 556 ; N udieresis ; B 15 -9 499 655 ;
+C -1 ; WX 549 ; N notequal ; B 15 -49 540 570 ;
+C -1 ; WX 500 ; N gcommaaccent ; B -52 -203 478 767 ;
+C -1 ; WX 500 ; N eth ; B -3 -13 454 699 ;
+C -1 ; WX 389 ; N zcaron ; B -43 -78 424 690 ;
+C -1 ; WX 556 ; N ncommaaccent ; B -6 -218 493 462 ;
+C -1 ; WX 300 ; N onesuperior ; B 30 274 301 683 ;
+C -1 ; WX 278 ; N imacron ; B 2 -9 294 623 ;
+C -1 ; WX 500 ; N Euro ; B 0 0 0 0 ;
+EndCharMetrics
+StartKernData
+StartKernPairs 2038
+KPX A C -65
+KPX A Cacute -65
+KPX A Ccaron -65
+KPX A Ccedilla -65
+KPX A G -60
+KPX A Gbreve -60
+KPX A Gcommaaccent -60
+KPX A O -50
+KPX A Oacute -50
+KPX A Ocircumflex -50
+KPX A Odieresis -50
+KPX A Ograve -50
+KPX A Ohungarumlaut -50
+KPX A Omacron -50
+KPX A Oslash -50
+KPX A Otilde -50
+KPX A Q -55
+KPX A T -55
+KPX A Tcaron -55
+KPX A Tcommaaccent -55
+KPX A U -50
+KPX A Uacute -50
+KPX A Ucircumflex -50
+KPX A Udieresis -50
+KPX A Ugrave -50
+KPX A Uhungarumlaut -50
+KPX A Umacron -50
+KPX A Uogonek -50
+KPX A Uring -50
+KPX A V -95
+KPX A W -100
+KPX A Y -70
+KPX A Yacute -70
+KPX A Ydieresis -70
+KPX A quoteright -74
+KPX A u -30
+KPX A uacute -30
+KPX A ucircumflex -30
+KPX A udieresis -30
+KPX A ugrave -30
+KPX A uhungarumlaut -30
+KPX A umacron -30
+KPX A uogonek -30
+KPX A uring -30
+KPX A v -74
+KPX A w -74
+KPX A y -74
+KPX A yacute -74
+KPX A ydieresis -74
+KPX Aacute C -65
+KPX Aacute Cacute -65
+KPX Aacute Ccaron -65
+KPX Aacute Ccedilla -65
+KPX Aacute G -60
+KPX Aacute Gbreve -60
+KPX Aacute Gcommaaccent -60
+KPX Aacute O -50
+KPX Aacute Oacute -50
+KPX Aacute Ocircumflex -50
+KPX Aacute Odieresis -50
+KPX Aacute Ograve -50
+KPX Aacute Ohungarumlaut -50
+KPX Aacute Omacron -50
+KPX Aacute Oslash -50
+KPX Aacute Otilde -50
+KPX Aacute Q -55
+KPX Aacute T -55
+KPX Aacute Tcaron -55
+KPX Aacute Tcommaaccent -55
+KPX Aacute U -50
+KPX Aacute Uacute -50
+KPX Aacute Ucircumflex -50
+KPX Aacute Udieresis -50
+KPX Aacute Ugrave -50
+KPX Aacute Uhungarumlaut -50
+KPX Aacute Umacron -50
+KPX Aacute Uogonek -50
+KPX Aacute Uring -50
+KPX Aacute V -95
+KPX Aacute W -100
+KPX Aacute Y -70
+KPX Aacute Yacute -70
+KPX Aacute Ydieresis -70
+KPX Aacute quoteright -74
+KPX Aacute u -30
+KPX Aacute uacute -30
+KPX Aacute ucircumflex -30
+KPX Aacute udieresis -30
+KPX Aacute ugrave -30
+KPX Aacute uhungarumlaut -30
+KPX Aacute umacron -30
+KPX Aacute uogonek -30
+KPX Aacute uring -30
+KPX Aacute v -74
+KPX Aacute w -74
+KPX Aacute y -74
+KPX Aacute yacute -74
+KPX Aacute ydieresis -74
+KPX Abreve C -65
+KPX Abreve Cacute -65
+KPX Abreve Ccaron -65
+KPX Abreve Ccedilla -65
+KPX Abreve G -60
+KPX Abreve Gbreve -60
+KPX Abreve Gcommaaccent -60
+KPX Abreve O -50
+KPX Abreve Oacute -50
+KPX Abreve Ocircumflex -50
+KPX Abreve Odieresis -50
+KPX Abreve Ograve -50
+KPX Abreve Ohungarumlaut -50
+KPX Abreve Omacron -50
+KPX Abreve Oslash -50
+KPX Abreve Otilde -50
+KPX Abreve Q -55
+KPX Abreve T -55
+KPX Abreve Tcaron -55
+KPX Abreve Tcommaaccent -55
+KPX Abreve U -50
+KPX Abreve Uacute -50
+KPX Abreve Ucircumflex -50
+KPX Abreve Udieresis -50
+KPX Abreve Ugrave -50
+KPX Abreve Uhungarumlaut -50
+KPX Abreve Umacron -50
+KPX Abreve Uogonek -50
+KPX Abreve Uring -50
+KPX Abreve V -95
+KPX Abreve W -100
+KPX Abreve Y -70
+KPX Abreve Yacute -70
+KPX Abreve Ydieresis -70
+KPX Abreve quoteright -74
+KPX Abreve u -30
+KPX Abreve uacute -30
+KPX Abreve ucircumflex -30
+KPX Abreve udieresis -30
+KPX Abreve ugrave -30
+KPX Abreve uhungarumlaut -30
+KPX Abreve umacron -30
+KPX Abreve uogonek -30
+KPX Abreve uring -30
+KPX Abreve v -74
+KPX Abreve w -74
+KPX Abreve y -74
+KPX Abreve yacute -74
+KPX Abreve ydieresis -74
+KPX Acircumflex C -65
+KPX Acircumflex Cacute -65
+KPX Acircumflex Ccaron -65
+KPX Acircumflex Ccedilla -65
+KPX Acircumflex G -60
+KPX Acircumflex Gbreve -60
+KPX Acircumflex Gcommaaccent -60
+KPX Acircumflex O -50
+KPX Acircumflex Oacute -50
+KPX Acircumflex Ocircumflex -50
+KPX Acircumflex Odieresis -50
+KPX Acircumflex Ograve -50
+KPX Acircumflex Ohungarumlaut -50
+KPX Acircumflex Omacron -50
+KPX Acircumflex Oslash -50
+KPX Acircumflex Otilde -50
+KPX Acircumflex Q -55
+KPX Acircumflex T -55
+KPX Acircumflex Tcaron -55
+KPX Acircumflex Tcommaaccent -55
+KPX Acircumflex U -50
+KPX Acircumflex Uacute -50
+KPX Acircumflex Ucircumflex -50
+KPX Acircumflex Udieresis -50
+KPX Acircumflex Ugrave -50
+KPX Acircumflex Uhungarumlaut -50
+KPX Acircumflex Umacron -50
+KPX Acircumflex Uogonek -50
+KPX Acircumflex Uring -50
+KPX Acircumflex V -95
+KPX Acircumflex W -100
+KPX Acircumflex Y -70
+KPX Acircumflex Yacute -70
+KPX Acircumflex Ydieresis -70
+KPX Acircumflex quoteright -74
+KPX Acircumflex u -30
+KPX Acircumflex uacute -30
+KPX Acircumflex ucircumflex -30
+KPX Acircumflex udieresis -30
+KPX Acircumflex ugrave -30
+KPX Acircumflex uhungarumlaut -30
+KPX Acircumflex umacron -30
+KPX Acircumflex uogonek -30
+KPX Acircumflex uring -30
+KPX Acircumflex v -74
+KPX Acircumflex w -74
+KPX Acircumflex y -74
+KPX Acircumflex yacute -74
+KPX Acircumflex ydieresis -74
+KPX Adieresis C -65
+KPX Adieresis Cacute -65
+KPX Adieresis Ccaron -65
+KPX Adieresis Ccedilla -65
+KPX Adieresis G -60
+KPX Adieresis Gbreve -60
+KPX Adieresis Gcommaaccent -60
+KPX Adieresis O -50
+KPX Adieresis Oacute -50
+KPX Adieresis Ocircumflex -50
+KPX Adieresis Odieresis -50
+KPX Adieresis Ograve -50
+KPX Adieresis Ohungarumlaut -50
+KPX Adieresis Omacron -50
+KPX Adieresis Oslash -50
+KPX Adieresis Otilde -50
+KPX Adieresis Q -55
+KPX Adieresis T -55
+KPX Adieresis Tcaron -55
+KPX Adieresis Tcommaaccent -55
+KPX Adieresis U -50
+KPX Adieresis Uacute -50
+KPX Adieresis Ucircumflex -50
+KPX Adieresis Udieresis -50
+KPX Adieresis Ugrave -50
+KPX Adieresis Uhungarumlaut -50
+KPX Adieresis Umacron -50
+KPX Adieresis Uogonek -50
+KPX Adieresis Uring -50
+KPX Adieresis V -95
+KPX Adieresis W -100
+KPX Adieresis Y -70
+KPX Adieresis Yacute -70
+KPX Adieresis Ydieresis -70
+KPX Adieresis quoteright -74
+KPX Adieresis u -30
+KPX Adieresis uacute -30
+KPX Adieresis ucircumflex -30
+KPX Adieresis udieresis -30
+KPX Adieresis ugrave -30
+KPX Adieresis uhungarumlaut -30
+KPX Adieresis umacron -30
+KPX Adieresis uogonek -30
+KPX Adieresis uring -30
+KPX Adieresis v -74
+KPX Adieresis w -74
+KPX Adieresis y -74
+KPX Adieresis yacute -74
+KPX Adieresis ydieresis -74
+KPX Agrave C -65
+KPX Agrave Cacute -65
+KPX Agrave Ccaron -65
+KPX Agrave Ccedilla -65
+KPX Agrave G -60
+KPX Agrave Gbreve -60
+KPX Agrave Gcommaaccent -60
+KPX Agrave O -50
+KPX Agrave Oacute -50
+KPX Agrave Ocircumflex -50
+KPX Agrave Odieresis -50
+KPX Agrave Ograve -50
+KPX Agrave Ohungarumlaut -50
+KPX Agrave Omacron -50
+KPX Agrave Oslash -50
+KPX Agrave Otilde -50
+KPX Agrave Q -55
+KPX Agrave T -55
+KPX Agrave Tcaron -55
+KPX Agrave Tcommaaccent -55
+KPX Agrave U -50
+KPX Agrave Uacute -50
+KPX Agrave Ucircumflex -50
+KPX Agrave Udieresis -50
+KPX Agrave Ugrave -50
+KPX Agrave Uhungarumlaut -50
+KPX Agrave Umacron -50
+KPX Agrave Uogonek -50
+KPX Agrave Uring -50
+KPX Agrave V -95
+KPX Agrave W -100
+KPX Agrave Y -70
+KPX Agrave Yacute -70
+KPX Agrave Ydieresis -70
+KPX Agrave quoteright -74
+KPX Agrave u -30
+KPX Agrave uacute -30
+KPX Agrave ucircumflex -30
+KPX Agrave udieresis -30
+KPX Agrave ugrave -30
+KPX Agrave uhungarumlaut -30
+KPX Agrave umacron -30
+KPX Agrave uogonek -30
+KPX Agrave uring -30
+KPX Agrave v -74
+KPX Agrave w -74
+KPX Agrave y -74
+KPX Agrave yacute -74
+KPX Agrave ydieresis -74
+KPX Amacron C -65
+KPX Amacron Cacute -65
+KPX Amacron Ccaron -65
+KPX Amacron Ccedilla -65
+KPX Amacron G -60
+KPX Amacron Gbreve -60
+KPX Amacron Gcommaaccent -60
+KPX Amacron O -50
+KPX Amacron Oacute -50
+KPX Amacron Ocircumflex -50
+KPX Amacron Odieresis -50
+KPX Amacron Ograve -50
+KPX Amacron Ohungarumlaut -50
+KPX Amacron Omacron -50
+KPX Amacron Oslash -50
+KPX Amacron Otilde -50
+KPX Amacron Q -55
+KPX Amacron T -55
+KPX Amacron Tcaron -55
+KPX Amacron Tcommaaccent -55
+KPX Amacron U -50
+KPX Amacron Uacute -50
+KPX Amacron Ucircumflex -50
+KPX Amacron Udieresis -50
+KPX Amacron Ugrave -50
+KPX Amacron Uhungarumlaut -50
+KPX Amacron Umacron -50
+KPX Amacron Uogonek -50
+KPX Amacron Uring -50
+KPX Amacron V -95
+KPX Amacron W -100
+KPX Amacron Y -70
+KPX Amacron Yacute -70
+KPX Amacron Ydieresis -70
+KPX Amacron quoteright -74
+KPX Amacron u -30
+KPX Amacron uacute -30
+KPX Amacron ucircumflex -30
+KPX Amacron udieresis -30
+KPX Amacron ugrave -30
+KPX Amacron uhungarumlaut -30
+KPX Amacron umacron -30
+KPX Amacron uogonek -30
+KPX Amacron uring -30
+KPX Amacron v -74
+KPX Amacron w -74
+KPX Amacron y -74
+KPX Amacron yacute -74
+KPX Amacron ydieresis -74
+KPX Aogonek C -65
+KPX Aogonek Cacute -65
+KPX Aogonek Ccaron -65
+KPX Aogonek Ccedilla -65
+KPX Aogonek G -60
+KPX Aogonek Gbreve -60
+KPX Aogonek Gcommaaccent -60
+KPX Aogonek O -50
+KPX Aogonek Oacute -50
+KPX Aogonek Ocircumflex -50
+KPX Aogonek Odieresis -50
+KPX Aogonek Ograve -50
+KPX Aogonek Ohungarumlaut -50
+KPX Aogonek Omacron -50
+KPX Aogonek Oslash -50
+KPX Aogonek Otilde -50
+KPX Aogonek Q -55
+KPX Aogonek T -55
+KPX Aogonek Tcaron -55
+KPX Aogonek Tcommaaccent -55
+KPX Aogonek U -50
+KPX Aogonek Uacute -50
+KPX Aogonek Ucircumflex -50
+KPX Aogonek Udieresis -50
+KPX Aogonek Ugrave -50
+KPX Aogonek Uhungarumlaut -50
+KPX Aogonek Umacron -50
+KPX Aogonek Uogonek -50
+KPX Aogonek Uring -50
+KPX Aogonek V -95
+KPX Aogonek W -100
+KPX Aogonek Y -70
+KPX Aogonek Yacute -70
+KPX Aogonek Ydieresis -70
+KPX Aogonek quoteright -74
+KPX Aogonek u -30
+KPX Aogonek uacute -30
+KPX Aogonek ucircumflex -30
+KPX Aogonek udieresis -30
+KPX Aogonek ugrave -30
+KPX Aogonek uhungarumlaut -30
+KPX Aogonek umacron -30
+KPX Aogonek uogonek -30
+KPX Aogonek uring -30
+KPX Aogonek v -74
+KPX Aogonek w -74
+KPX Aogonek y -34
+KPX Aogonek yacute -34
+KPX Aogonek ydieresis -34
+KPX Aring C -65
+KPX Aring Cacute -65
+KPX Aring Ccaron -65
+KPX Aring Ccedilla -65
+KPX Aring G -60
+KPX Aring Gbreve -60
+KPX Aring Gcommaaccent -60
+KPX Aring O -50
+KPX Aring Oacute -50
+KPX Aring Ocircumflex -50
+KPX Aring Odieresis -50
+KPX Aring Ograve -50
+KPX Aring Ohungarumlaut -50
+KPX Aring Omacron -50
+KPX Aring Oslash -50
+KPX Aring Otilde -50
+KPX Aring Q -55
+KPX Aring T -55
+KPX Aring Tcaron -55
+KPX Aring Tcommaaccent -55
+KPX Aring U -50
+KPX Aring Uacute -50
+KPX Aring Ucircumflex -50
+KPX Aring Udieresis -50
+KPX Aring Ugrave -50
+KPX Aring Uhungarumlaut -50
+KPX Aring Umacron -50
+KPX Aring Uogonek -50
+KPX Aring Uring -50
+KPX Aring V -95
+KPX Aring W -100
+KPX Aring Y -70
+KPX Aring Yacute -70
+KPX Aring Ydieresis -70
+KPX Aring quoteright -74
+KPX Aring u -30
+KPX Aring uacute -30
+KPX Aring ucircumflex -30
+KPX Aring udieresis -30
+KPX Aring ugrave -30
+KPX Aring uhungarumlaut -30
+KPX Aring umacron -30
+KPX Aring uogonek -30
+KPX Aring uring -30
+KPX Aring v -74
+KPX Aring w -74
+KPX Aring y -74
+KPX Aring yacute -74
+KPX Aring ydieresis -74
+KPX Atilde C -65
+KPX Atilde Cacute -65
+KPX Atilde Ccaron -65
+KPX Atilde Ccedilla -65
+KPX Atilde G -60
+KPX Atilde Gbreve -60
+KPX Atilde Gcommaaccent -60
+KPX Atilde O -50
+KPX Atilde Oacute -50
+KPX Atilde Ocircumflex -50
+KPX Atilde Odieresis -50
+KPX Atilde Ograve -50
+KPX Atilde Ohungarumlaut -50
+KPX Atilde Omacron -50
+KPX Atilde Oslash -50
+KPX Atilde Otilde -50
+KPX Atilde Q -55
+KPX Atilde T -55
+KPX Atilde Tcaron -55
+KPX Atilde Tcommaaccent -55
+KPX Atilde U -50
+KPX Atilde Uacute -50
+KPX Atilde Ucircumflex -50
+KPX Atilde Udieresis -50
+KPX Atilde Ugrave -50
+KPX Atilde Uhungarumlaut -50
+KPX Atilde Umacron -50
+KPX Atilde Uogonek -50
+KPX Atilde Uring -50
+KPX Atilde V -95
+KPX Atilde W -100
+KPX Atilde Y -70
+KPX Atilde Yacute -70
+KPX Atilde Ydieresis -70
+KPX Atilde quoteright -74
+KPX Atilde u -30
+KPX Atilde uacute -30
+KPX Atilde ucircumflex -30
+KPX Atilde udieresis -30
+KPX Atilde ugrave -30
+KPX Atilde uhungarumlaut -30
+KPX Atilde umacron -30
+KPX Atilde uogonek -30
+KPX Atilde uring -30
+KPX Atilde v -74
+KPX Atilde w -74
+KPX Atilde y -74
+KPX Atilde yacute -74
+KPX Atilde ydieresis -74
+KPX B A -25
+KPX B Aacute -25
+KPX B Abreve -25
+KPX B Acircumflex -25
+KPX B Adieresis -25
+KPX B Agrave -25
+KPX B Amacron -25
+KPX B Aogonek -25
+KPX B Aring -25
+KPX B Atilde -25
+KPX B U -10
+KPX B Uacute -10
+KPX B Ucircumflex -10
+KPX B Udieresis -10
+KPX B Ugrave -10
+KPX B Uhungarumlaut -10
+KPX B Umacron -10
+KPX B Uogonek -10
+KPX B Uring -10
+KPX D A -25
+KPX D Aacute -25
+KPX D Abreve -25
+KPX D Acircumflex -25
+KPX D Adieresis -25
+KPX D Agrave -25
+KPX D Amacron -25
+KPX D Aogonek -25
+KPX D Aring -25
+KPX D Atilde -25
+KPX D V -50
+KPX D W -40
+KPX D Y -50
+KPX D Yacute -50
+KPX D Ydieresis -50
+KPX Dcaron A -25
+KPX Dcaron Aacute -25
+KPX Dcaron Abreve -25
+KPX Dcaron Acircumflex -25
+KPX Dcaron Adieresis -25
+KPX Dcaron Agrave -25
+KPX Dcaron Amacron -25
+KPX Dcaron Aogonek -25
+KPX Dcaron Aring -25
+KPX Dcaron Atilde -25
+KPX Dcaron V -50
+KPX Dcaron W -40
+KPX Dcaron Y -50
+KPX Dcaron Yacute -50
+KPX Dcaron Ydieresis -50
+KPX Dcroat A -25
+KPX Dcroat Aacute -25
+KPX Dcroat Abreve -25
+KPX Dcroat Acircumflex -25
+KPX Dcroat Adieresis -25
+KPX Dcroat Agrave -25
+KPX Dcroat Amacron -25
+KPX Dcroat Aogonek -25
+KPX Dcroat Aring -25
+KPX Dcroat Atilde -25
+KPX Dcroat V -50
+KPX Dcroat W -40
+KPX Dcroat Y -50
+KPX Dcroat Yacute -50
+KPX Dcroat Ydieresis -50
+KPX F A -100
+KPX F Aacute -100
+KPX F Abreve -100
+KPX F Acircumflex -100
+KPX F Adieresis -100
+KPX F Agrave -100
+KPX F Amacron -100
+KPX F Aogonek -100
+KPX F Aring -100
+KPX F Atilde -100
+KPX F a -95
+KPX F aacute -95
+KPX F abreve -95
+KPX F acircumflex -95
+KPX F adieresis -95
+KPX F agrave -95
+KPX F amacron -95
+KPX F aogonek -95
+KPX F aring -95
+KPX F atilde -95
+KPX F comma -129
+KPX F e -100
+KPX F eacute -100
+KPX F ecaron -100
+KPX F ecircumflex -100
+KPX F edieresis -100
+KPX F edotaccent -100
+KPX F egrave -100
+KPX F emacron -100
+KPX F eogonek -100
+KPX F i -40
+KPX F iacute -40
+KPX F icircumflex -40
+KPX F idieresis -40
+KPX F igrave -40
+KPX F imacron -40
+KPX F iogonek -40
+KPX F o -70
+KPX F oacute -70
+KPX F ocircumflex -70
+KPX F odieresis -70
+KPX F ograve -70
+KPX F ohungarumlaut -70
+KPX F omacron -70
+KPX F oslash -70
+KPX F otilde -70
+KPX F period -129
+KPX F r -50
+KPX F racute -50
+KPX F rcaron -50
+KPX F rcommaaccent -50
+KPX J A -25
+KPX J Aacute -25
+KPX J Abreve -25
+KPX J Acircumflex -25
+KPX J Adieresis -25
+KPX J Agrave -25
+KPX J Amacron -25
+KPX J Aogonek -25
+KPX J Aring -25
+KPX J Atilde -25
+KPX J a -40
+KPX J aacute -40
+KPX J abreve -40
+KPX J acircumflex -40
+KPX J adieresis -40
+KPX J agrave -40
+KPX J amacron -40
+KPX J aogonek -40
+KPX J aring -40
+KPX J atilde -40
+KPX J comma -10
+KPX J e -40
+KPX J eacute -40
+KPX J ecaron -40
+KPX J ecircumflex -40
+KPX J edieresis -40
+KPX J edotaccent -40
+KPX J egrave -40
+KPX J emacron -40
+KPX J eogonek -40
+KPX J o -40
+KPX J oacute -40
+KPX J ocircumflex -40
+KPX J odieresis -40
+KPX J ograve -40
+KPX J ohungarumlaut -40
+KPX J omacron -40
+KPX J oslash -40
+KPX J otilde -40
+KPX J period -10
+KPX J u -40
+KPX J uacute -40
+KPX J ucircumflex -40
+KPX J udieresis -40
+KPX J ugrave -40
+KPX J uhungarumlaut -40
+KPX J umacron -40
+KPX J uogonek -40
+KPX J uring -40
+KPX K O -30
+KPX K Oacute -30
+KPX K Ocircumflex -30
+KPX K Odieresis -30
+KPX K Ograve -30
+KPX K Ohungarumlaut -30
+KPX K Omacron -30
+KPX K Oslash -30
+KPX K Otilde -30
+KPX K e -25
+KPX K eacute -25
+KPX K ecaron -25
+KPX K ecircumflex -25
+KPX K edieresis -25
+KPX K edotaccent -25
+KPX K egrave -25
+KPX K emacron -25
+KPX K eogonek -25
+KPX K o -25
+KPX K oacute -25
+KPX K ocircumflex -25
+KPX K odieresis -25
+KPX K ograve -25
+KPX K ohungarumlaut -25
+KPX K omacron -25
+KPX K oslash -25
+KPX K otilde -25
+KPX K u -20
+KPX K uacute -20
+KPX K ucircumflex -20
+KPX K udieresis -20
+KPX K ugrave -20
+KPX K uhungarumlaut -20
+KPX K umacron -20
+KPX K uogonek -20
+KPX K uring -20
+KPX K y -20
+KPX K yacute -20
+KPX K ydieresis -20
+KPX Kcommaaccent O -30
+KPX Kcommaaccent Oacute -30
+KPX Kcommaaccent Ocircumflex -30
+KPX Kcommaaccent Odieresis -30
+KPX Kcommaaccent Ograve -30
+KPX Kcommaaccent Ohungarumlaut -30
+KPX Kcommaaccent Omacron -30
+KPX Kcommaaccent Oslash -30
+KPX Kcommaaccent Otilde -30
+KPX Kcommaaccent e -25
+KPX Kcommaaccent eacute -25
+KPX Kcommaaccent ecaron -25
+KPX Kcommaaccent ecircumflex -25
+KPX Kcommaaccent edieresis -25
+KPX Kcommaaccent edotaccent -25
+KPX Kcommaaccent egrave -25
+KPX Kcommaaccent emacron -25
+KPX Kcommaaccent eogonek -25
+KPX Kcommaaccent o -25
+KPX Kcommaaccent oacute -25
+KPX Kcommaaccent ocircumflex -25
+KPX Kcommaaccent odieresis -25
+KPX Kcommaaccent ograve -25
+KPX Kcommaaccent ohungarumlaut -25
+KPX Kcommaaccent omacron -25
+KPX Kcommaaccent oslash -25
+KPX Kcommaaccent otilde -25
+KPX Kcommaaccent u -20
+KPX Kcommaaccent uacute -20
+KPX Kcommaaccent ucircumflex -20
+KPX Kcommaaccent udieresis -20
+KPX Kcommaaccent ugrave -20
+KPX Kcommaaccent uhungarumlaut -20
+KPX Kcommaaccent umacron -20
+KPX Kcommaaccent uogonek -20
+KPX Kcommaaccent uring -20
+KPX Kcommaaccent y -20
+KPX Kcommaaccent yacute -20
+KPX Kcommaaccent ydieresis -20
+KPX L T -18
+KPX L Tcaron -18
+KPX L Tcommaaccent -18
+KPX L V -37
+KPX L W -37
+KPX L Y -37
+KPX L Yacute -37
+KPX L Ydieresis -37
+KPX L quoteright -55
+KPX L y -37
+KPX L yacute -37
+KPX L ydieresis -37
+KPX Lacute T -18
+KPX Lacute Tcaron -18
+KPX Lacute Tcommaaccent -18
+KPX Lacute V -37
+KPX Lacute W -37
+KPX Lacute Y -37
+KPX Lacute Yacute -37
+KPX Lacute Ydieresis -37
+KPX Lacute quoteright -55
+KPX Lacute y -37
+KPX Lacute yacute -37
+KPX Lacute ydieresis -37
+KPX Lcommaaccent T -18
+KPX Lcommaaccent Tcaron -18
+KPX Lcommaaccent Tcommaaccent -18
+KPX Lcommaaccent V -37
+KPX Lcommaaccent W -37
+KPX Lcommaaccent Y -37
+KPX Lcommaaccent Yacute -37
+KPX Lcommaaccent Ydieresis -37
+KPX Lcommaaccent quoteright -55
+KPX Lcommaaccent y -37
+KPX Lcommaaccent yacute -37
+KPX Lcommaaccent ydieresis -37
+KPX Lslash T -18
+KPX Lslash Tcaron -18
+KPX Lslash Tcommaaccent -18
+KPX Lslash V -37
+KPX Lslash W -37
+KPX Lslash Y -37
+KPX Lslash Yacute -37
+KPX Lslash Ydieresis -37
+KPX Lslash quoteright -55
+KPX Lslash y -37
+KPX Lslash yacute -37
+KPX Lslash ydieresis -37
+KPX N A -30
+KPX N Aacute -30
+KPX N Abreve -30
+KPX N Acircumflex -30
+KPX N Adieresis -30
+KPX N Agrave -30
+KPX N Amacron -30
+KPX N Aogonek -30
+KPX N Aring -30
+KPX N Atilde -30
+KPX Nacute A -30
+KPX Nacute Aacute -30
+KPX Nacute Abreve -30
+KPX Nacute Acircumflex -30
+KPX Nacute Adieresis -30
+KPX Nacute Agrave -30
+KPX Nacute Amacron -30
+KPX Nacute Aogonek -30
+KPX Nacute Aring -30
+KPX Nacute Atilde -30
+KPX Ncaron A -30
+KPX Ncaron Aacute -30
+KPX Ncaron Abreve -30
+KPX Ncaron Acircumflex -30
+KPX Ncaron Adieresis -30
+KPX Ncaron Agrave -30
+KPX Ncaron Amacron -30
+KPX Ncaron Aogonek -30
+KPX Ncaron Aring -30
+KPX Ncaron Atilde -30
+KPX Ncommaaccent A -30
+KPX Ncommaaccent Aacute -30
+KPX Ncommaaccent Abreve -30
+KPX Ncommaaccent Acircumflex -30
+KPX Ncommaaccent Adieresis -30
+KPX Ncommaaccent Agrave -30
+KPX Ncommaaccent Amacron -30
+KPX Ncommaaccent Aogonek -30
+KPX Ncommaaccent Aring -30
+KPX Ncommaaccent Atilde -30
+KPX Ntilde A -30
+KPX Ntilde Aacute -30
+KPX Ntilde Abreve -30
+KPX Ntilde Acircumflex -30
+KPX Ntilde Adieresis -30
+KPX Ntilde Agrave -30
+KPX Ntilde Amacron -30
+KPX Ntilde Aogonek -30
+KPX Ntilde Aring -30
+KPX Ntilde Atilde -30
+KPX O A -40
+KPX O Aacute -40
+KPX O Abreve -40
+KPX O Acircumflex -40
+KPX O Adieresis -40
+KPX O Agrave -40
+KPX O Amacron -40
+KPX O Aogonek -40
+KPX O Aring -40
+KPX O Atilde -40
+KPX O T -40
+KPX O Tcaron -40
+KPX O Tcommaaccent -40
+KPX O V -50
+KPX O W -50
+KPX O X -40
+KPX O Y -50
+KPX O Yacute -50
+KPX O Ydieresis -50
+KPX Oacute A -40
+KPX Oacute Aacute -40
+KPX Oacute Abreve -40
+KPX Oacute Acircumflex -40
+KPX Oacute Adieresis -40
+KPX Oacute Agrave -40
+KPX Oacute Amacron -40
+KPX Oacute Aogonek -40
+KPX Oacute Aring -40
+KPX Oacute Atilde -40
+KPX Oacute T -40
+KPX Oacute Tcaron -40
+KPX Oacute Tcommaaccent -40
+KPX Oacute V -50
+KPX Oacute W -50
+KPX Oacute X -40
+KPX Oacute Y -50
+KPX Oacute Yacute -50
+KPX Oacute Ydieresis -50
+KPX Ocircumflex A -40
+KPX Ocircumflex Aacute -40
+KPX Ocircumflex Abreve -40
+KPX Ocircumflex Acircumflex -40
+KPX Ocircumflex Adieresis -40
+KPX Ocircumflex Agrave -40
+KPX Ocircumflex Amacron -40
+KPX Ocircumflex Aogonek -40
+KPX Ocircumflex Aring -40
+KPX Ocircumflex Atilde -40
+KPX Ocircumflex T -40
+KPX Ocircumflex Tcaron -40
+KPX Ocircumflex Tcommaaccent -40
+KPX Ocircumflex V -50
+KPX Ocircumflex W -50
+KPX Ocircumflex X -40
+KPX Ocircumflex Y -50
+KPX Ocircumflex Yacute -50
+KPX Ocircumflex Ydieresis -50
+KPX Odieresis A -40
+KPX Odieresis Aacute -40
+KPX Odieresis Abreve -40
+KPX Odieresis Acircumflex -40
+KPX Odieresis Adieresis -40
+KPX Odieresis Agrave -40
+KPX Odieresis Amacron -40
+KPX Odieresis Aogonek -40
+KPX Odieresis Aring -40
+KPX Odieresis Atilde -40
+KPX Odieresis T -40
+KPX Odieresis Tcaron -40
+KPX Odieresis Tcommaaccent -40
+KPX Odieresis V -50
+KPX Odieresis W -50
+KPX Odieresis X -40
+KPX Odieresis Y -50
+KPX Odieresis Yacute -50
+KPX Odieresis Ydieresis -50
+KPX Ograve A -40
+KPX Ograve Aacute -40
+KPX Ograve Abreve -40
+KPX Ograve Acircumflex -40
+KPX Ograve Adieresis -40
+KPX Ograve Agrave -40
+KPX Ograve Amacron -40
+KPX Ograve Aogonek -40
+KPX Ograve Aring -40
+KPX Ograve Atilde -40
+KPX Ograve T -40
+KPX Ograve Tcaron -40
+KPX Ograve Tcommaaccent -40
+KPX Ograve V -50
+KPX Ograve W -50
+KPX Ograve X -40
+KPX Ograve Y -50
+KPX Ograve Yacute -50
+KPX Ograve Ydieresis -50
+KPX Ohungarumlaut A -40
+KPX Ohungarumlaut Aacute -40
+KPX Ohungarumlaut Abreve -40
+KPX Ohungarumlaut Acircumflex -40
+KPX Ohungarumlaut Adieresis -40
+KPX Ohungarumlaut Agrave -40
+KPX Ohungarumlaut Amacron -40
+KPX Ohungarumlaut Aogonek -40
+KPX Ohungarumlaut Aring -40
+KPX Ohungarumlaut Atilde -40
+KPX Ohungarumlaut T -40
+KPX Ohungarumlaut Tcaron -40
+KPX Ohungarumlaut Tcommaaccent -40
+KPX Ohungarumlaut V -50
+KPX Ohungarumlaut W -50
+KPX Ohungarumlaut X -40
+KPX Ohungarumlaut Y -50
+KPX Ohungarumlaut Yacute -50
+KPX Ohungarumlaut Ydieresis -50
+KPX Omacron A -40
+KPX Omacron Aacute -40
+KPX Omacron Abreve -40
+KPX Omacron Acircumflex -40
+KPX Omacron Adieresis -40
+KPX Omacron Agrave -40
+KPX Omacron Amacron -40
+KPX Omacron Aogonek -40
+KPX Omacron Aring -40
+KPX Omacron Atilde -40
+KPX Omacron T -40
+KPX Omacron Tcaron -40
+KPX Omacron Tcommaaccent -40
+KPX Omacron V -50
+KPX Omacron W -50
+KPX Omacron X -40
+KPX Omacron Y -50
+KPX Omacron Yacute -50
+KPX Omacron Ydieresis -50
+KPX Oslash A -40
+KPX Oslash Aacute -40
+KPX Oslash Abreve -40
+KPX Oslash Acircumflex -40
+KPX Oslash Adieresis -40
+KPX Oslash Agrave -40
+KPX Oslash Amacron -40
+KPX Oslash Aogonek -40
+KPX Oslash Aring -40
+KPX Oslash Atilde -40
+KPX Oslash T -40
+KPX Oslash Tcaron -40
+KPX Oslash Tcommaaccent -40
+KPX Oslash V -50
+KPX Oslash W -50
+KPX Oslash X -40
+KPX Oslash Y -50
+KPX Oslash Yacute -50
+KPX Oslash Ydieresis -50
+KPX Otilde A -40
+KPX Otilde Aacute -40
+KPX Otilde Abreve -40
+KPX Otilde Acircumflex -40
+KPX Otilde Adieresis -40
+KPX Otilde Agrave -40
+KPX Otilde Amacron -40
+KPX Otilde Aogonek -40
+KPX Otilde Aring -40
+KPX Otilde Atilde -40
+KPX Otilde T -40
+KPX Otilde Tcaron -40
+KPX Otilde Tcommaaccent -40
+KPX Otilde V -50
+KPX Otilde W -50
+KPX Otilde X -40
+KPX Otilde Y -50
+KPX Otilde Yacute -50
+KPX Otilde Ydieresis -50
+KPX P A -85
+KPX P Aacute -85
+KPX P Abreve -85
+KPX P Acircumflex -85
+KPX P Adieresis -85
+KPX P Agrave -85
+KPX P Amacron -85
+KPX P Aogonek -85
+KPX P Aring -85
+KPX P Atilde -85
+KPX P a -40
+KPX P aacute -40
+KPX P abreve -40
+KPX P acircumflex -40
+KPX P adieresis -40
+KPX P agrave -40
+KPX P amacron -40
+KPX P aogonek -40
+KPX P aring -40
+KPX P atilde -40
+KPX P comma -129
+KPX P e -50
+KPX P eacute -50
+KPX P ecaron -50
+KPX P ecircumflex -50
+KPX P edieresis -50
+KPX P edotaccent -50
+KPX P egrave -50
+KPX P emacron -50
+KPX P eogonek -50
+KPX P o -55
+KPX P oacute -55
+KPX P ocircumflex -55
+KPX P odieresis -55
+KPX P ograve -55
+KPX P ohungarumlaut -55
+KPX P omacron -55
+KPX P oslash -55
+KPX P otilde -55
+KPX P period -129
+KPX Q U -10
+KPX Q Uacute -10
+KPX Q Ucircumflex -10
+KPX Q Udieresis -10
+KPX Q Ugrave -10
+KPX Q Uhungarumlaut -10
+KPX Q Umacron -10
+KPX Q Uogonek -10
+KPX Q Uring -10
+KPX R O -40
+KPX R Oacute -40
+KPX R Ocircumflex -40
+KPX R Odieresis -40
+KPX R Ograve -40
+KPX R Ohungarumlaut -40
+KPX R Omacron -40
+KPX R Oslash -40
+KPX R Otilde -40
+KPX R T -30
+KPX R Tcaron -30
+KPX R Tcommaaccent -30
+KPX R U -40
+KPX R Uacute -40
+KPX R Ucircumflex -40
+KPX R Udieresis -40
+KPX R Ugrave -40
+KPX R Uhungarumlaut -40
+KPX R Umacron -40
+KPX R Uogonek -40
+KPX R Uring -40
+KPX R V -18
+KPX R W -18
+KPX R Y -18
+KPX R Yacute -18
+KPX R Ydieresis -18
+KPX Racute O -40
+KPX Racute Oacute -40
+KPX Racute Ocircumflex -40
+KPX Racute Odieresis -40
+KPX Racute Ograve -40
+KPX Racute Ohungarumlaut -40
+KPX Racute Omacron -40
+KPX Racute Oslash -40
+KPX Racute Otilde -40
+KPX Racute T -30
+KPX Racute Tcaron -30
+KPX Racute Tcommaaccent -30
+KPX Racute U -40
+KPX Racute Uacute -40
+KPX Racute Ucircumflex -40
+KPX Racute Udieresis -40
+KPX Racute Ugrave -40
+KPX Racute Uhungarumlaut -40
+KPX Racute Umacron -40
+KPX Racute Uogonek -40
+KPX Racute Uring -40
+KPX Racute V -18
+KPX Racute W -18
+KPX Racute Y -18
+KPX Racute Yacute -18
+KPX Racute Ydieresis -18
+KPX Rcaron O -40
+KPX Rcaron Oacute -40
+KPX Rcaron Ocircumflex -40
+KPX Rcaron Odieresis -40
+KPX Rcaron Ograve -40
+KPX Rcaron Ohungarumlaut -40
+KPX Rcaron Omacron -40
+KPX Rcaron Oslash -40
+KPX Rcaron Otilde -40
+KPX Rcaron T -30
+KPX Rcaron Tcaron -30
+KPX Rcaron Tcommaaccent -30
+KPX Rcaron U -40
+KPX Rcaron Uacute -40
+KPX Rcaron Ucircumflex -40
+KPX Rcaron Udieresis -40
+KPX Rcaron Ugrave -40
+KPX Rcaron Uhungarumlaut -40
+KPX Rcaron Umacron -40
+KPX Rcaron Uogonek -40
+KPX Rcaron Uring -40
+KPX Rcaron V -18
+KPX Rcaron W -18
+KPX Rcaron Y -18
+KPX Rcaron Yacute -18
+KPX Rcaron Ydieresis -18
+KPX Rcommaaccent O -40
+KPX Rcommaaccent Oacute -40
+KPX Rcommaaccent Ocircumflex -40
+KPX Rcommaaccent Odieresis -40
+KPX Rcommaaccent Ograve -40
+KPX Rcommaaccent Ohungarumlaut -40
+KPX Rcommaaccent Omacron -40
+KPX Rcommaaccent Oslash -40
+KPX Rcommaaccent Otilde -40
+KPX Rcommaaccent T -30
+KPX Rcommaaccent Tcaron -30
+KPX Rcommaaccent Tcommaaccent -30
+KPX Rcommaaccent U -40
+KPX Rcommaaccent Uacute -40
+KPX Rcommaaccent Ucircumflex -40
+KPX Rcommaaccent Udieresis -40
+KPX Rcommaaccent Ugrave -40
+KPX Rcommaaccent Uhungarumlaut -40
+KPX Rcommaaccent Umacron -40
+KPX Rcommaaccent Uogonek -40
+KPX Rcommaaccent Uring -40
+KPX Rcommaaccent V -18
+KPX Rcommaaccent W -18
+KPX Rcommaaccent Y -18
+KPX Rcommaaccent Yacute -18
+KPX Rcommaaccent Ydieresis -18
+KPX T A -55
+KPX T Aacute -55
+KPX T Abreve -55
+KPX T Acircumflex -55
+KPX T Adieresis -55
+KPX T Agrave -55
+KPX T Amacron -55
+KPX T Aogonek -55
+KPX T Aring -55
+KPX T Atilde -55
+KPX T O -18
+KPX T Oacute -18
+KPX T Ocircumflex -18
+KPX T Odieresis -18
+KPX T Ograve -18
+KPX T Ohungarumlaut -18
+KPX T Omacron -18
+KPX T Oslash -18
+KPX T Otilde -18
+KPX T a -92
+KPX T aacute -92
+KPX T abreve -92
+KPX T acircumflex -92
+KPX T adieresis -92
+KPX T agrave -92
+KPX T amacron -92
+KPX T aogonek -92
+KPX T aring -92
+KPX T atilde -92
+KPX T colon -74
+KPX T comma -92
+KPX T e -92
+KPX T eacute -92
+KPX T ecaron -92
+KPX T ecircumflex -92
+KPX T edieresis -52
+KPX T edotaccent -92
+KPX T egrave -52
+KPX T emacron -52
+KPX T eogonek -92
+KPX T hyphen -92
+KPX T i -37
+KPX T iacute -37
+KPX T iogonek -37
+KPX T o -95
+KPX T oacute -95
+KPX T ocircumflex -95
+KPX T odieresis -95
+KPX T ograve -95
+KPX T ohungarumlaut -95
+KPX T omacron -95
+KPX T oslash -95
+KPX T otilde -95
+KPX T period -92
+KPX T r -37
+KPX T racute -37
+KPX T rcaron -37
+KPX T rcommaaccent -37
+KPX T semicolon -74
+KPX T u -37
+KPX T uacute -37
+KPX T ucircumflex -37
+KPX T udieresis -37
+KPX T ugrave -37
+KPX T uhungarumlaut -37
+KPX T umacron -37
+KPX T uogonek -37
+KPX T uring -37
+KPX T w -37
+KPX T y -37
+KPX T yacute -37
+KPX T ydieresis -37
+KPX Tcaron A -55
+KPX Tcaron Aacute -55
+KPX Tcaron Abreve -55
+KPX Tcaron Acircumflex -55
+KPX Tcaron Adieresis -55
+KPX Tcaron Agrave -55
+KPX Tcaron Amacron -55
+KPX Tcaron Aogonek -55
+KPX Tcaron Aring -55
+KPX Tcaron Atilde -55
+KPX Tcaron O -18
+KPX Tcaron Oacute -18
+KPX Tcaron Ocircumflex -18
+KPX Tcaron Odieresis -18
+KPX Tcaron Ograve -18
+KPX Tcaron Ohungarumlaut -18
+KPX Tcaron Omacron -18
+KPX Tcaron Oslash -18
+KPX Tcaron Otilde -18
+KPX Tcaron a -92
+KPX Tcaron aacute -92
+KPX Tcaron abreve -92
+KPX Tcaron acircumflex -92
+KPX Tcaron adieresis -92
+KPX Tcaron agrave -92
+KPX Tcaron amacron -92
+KPX Tcaron aogonek -92
+KPX Tcaron aring -92
+KPX Tcaron atilde -92
+KPX Tcaron colon -74
+KPX Tcaron comma -92
+KPX Tcaron e -92
+KPX Tcaron eacute -92
+KPX Tcaron ecaron -92
+KPX Tcaron ecircumflex -92
+KPX Tcaron edieresis -52
+KPX Tcaron edotaccent -92
+KPX Tcaron egrave -52
+KPX Tcaron emacron -52
+KPX Tcaron eogonek -92
+KPX Tcaron hyphen -92
+KPX Tcaron i -37
+KPX Tcaron iacute -37
+KPX Tcaron iogonek -37
+KPX Tcaron o -95
+KPX Tcaron oacute -95
+KPX Tcaron ocircumflex -95
+KPX Tcaron odieresis -95
+KPX Tcaron ograve -95
+KPX Tcaron ohungarumlaut -95
+KPX Tcaron omacron -95
+KPX Tcaron oslash -95
+KPX Tcaron otilde -95
+KPX Tcaron period -92
+KPX Tcaron r -37
+KPX Tcaron racute -37
+KPX Tcaron rcaron -37
+KPX Tcaron rcommaaccent -37
+KPX Tcaron semicolon -74
+KPX Tcaron u -37
+KPX Tcaron uacute -37
+KPX Tcaron ucircumflex -37
+KPX Tcaron udieresis -37
+KPX Tcaron ugrave -37
+KPX Tcaron uhungarumlaut -37
+KPX Tcaron umacron -37
+KPX Tcaron uogonek -37
+KPX Tcaron uring -37
+KPX Tcaron w -37
+KPX Tcaron y -37
+KPX Tcaron yacute -37
+KPX Tcaron ydieresis -37
+KPX Tcommaaccent A -55
+KPX Tcommaaccent Aacute -55
+KPX Tcommaaccent Abreve -55
+KPX Tcommaaccent Acircumflex -55
+KPX Tcommaaccent Adieresis -55
+KPX Tcommaaccent Agrave -55
+KPX Tcommaaccent Amacron -55
+KPX Tcommaaccent Aogonek -55
+KPX Tcommaaccent Aring -55
+KPX Tcommaaccent Atilde -55
+KPX Tcommaaccent O -18
+KPX Tcommaaccent Oacute -18
+KPX Tcommaaccent Ocircumflex -18
+KPX Tcommaaccent Odieresis -18
+KPX Tcommaaccent Ograve -18
+KPX Tcommaaccent Ohungarumlaut -18
+KPX Tcommaaccent Omacron -18
+KPX Tcommaaccent Oslash -18
+KPX Tcommaaccent Otilde -18
+KPX Tcommaaccent a -92
+KPX Tcommaaccent aacute -92
+KPX Tcommaaccent abreve -92
+KPX Tcommaaccent acircumflex -92
+KPX Tcommaaccent adieresis -92
+KPX Tcommaaccent agrave -92
+KPX Tcommaaccent amacron -92
+KPX Tcommaaccent aogonek -92
+KPX Tcommaaccent aring -92
+KPX Tcommaaccent atilde -92
+KPX Tcommaaccent colon -74
+KPX Tcommaaccent comma -92
+KPX Tcommaaccent e -92
+KPX Tcommaaccent eacute -92
+KPX Tcommaaccent ecaron -92
+KPX Tcommaaccent ecircumflex -92
+KPX Tcommaaccent edieresis -52
+KPX Tcommaaccent edotaccent -92
+KPX Tcommaaccent egrave -52
+KPX Tcommaaccent emacron -52
+KPX Tcommaaccent eogonek -92
+KPX Tcommaaccent hyphen -92
+KPX Tcommaaccent i -37
+KPX Tcommaaccent iacute -37
+KPX Tcommaaccent iogonek -37
+KPX Tcommaaccent o -95
+KPX Tcommaaccent oacute -95
+KPX Tcommaaccent ocircumflex -95
+KPX Tcommaaccent odieresis -95
+KPX Tcommaaccent ograve -95
+KPX Tcommaaccent ohungarumlaut -95
+KPX Tcommaaccent omacron -95
+KPX Tcommaaccent oslash -95
+KPX Tcommaaccent otilde -95
+KPX Tcommaaccent period -92
+KPX Tcommaaccent r -37
+KPX Tcommaaccent racute -37
+KPX Tcommaaccent rcaron -37
+KPX Tcommaaccent rcommaaccent -37
+KPX Tcommaaccent semicolon -74
+KPX Tcommaaccent u -37
+KPX Tcommaaccent uacute -37
+KPX Tcommaaccent ucircumflex -37
+KPX Tcommaaccent udieresis -37
+KPX Tcommaaccent ugrave -37
+KPX Tcommaaccent uhungarumlaut -37
+KPX Tcommaaccent umacron -37
+KPX Tcommaaccent uogonek -37
+KPX Tcommaaccent uring -37
+KPX Tcommaaccent w -37
+KPX Tcommaaccent y -37
+KPX Tcommaaccent yacute -37
+KPX Tcommaaccent ydieresis -37
+KPX U A -45
+KPX U Aacute -45
+KPX U Abreve -45
+KPX U Acircumflex -45
+KPX U Adieresis -45
+KPX U Agrave -45
+KPX U Amacron -45
+KPX U Aogonek -45
+KPX U Aring -45
+KPX U Atilde -45
+KPX Uacute A -45
+KPX Uacute Aacute -45
+KPX Uacute Abreve -45
+KPX Uacute Acircumflex -45
+KPX Uacute Adieresis -45
+KPX Uacute Agrave -45
+KPX Uacute Amacron -45
+KPX Uacute Aogonek -45
+KPX Uacute Aring -45
+KPX Uacute Atilde -45
+KPX Ucircumflex A -45
+KPX Ucircumflex Aacute -45
+KPX Ucircumflex Abreve -45
+KPX Ucircumflex Acircumflex -45
+KPX Ucircumflex Adieresis -45
+KPX Ucircumflex Agrave -45
+KPX Ucircumflex Amacron -45
+KPX Ucircumflex Aogonek -45
+KPX Ucircumflex Aring -45
+KPX Ucircumflex Atilde -45
+KPX Udieresis A -45
+KPX Udieresis Aacute -45
+KPX Udieresis Abreve -45
+KPX Udieresis Acircumflex -45
+KPX Udieresis Adieresis -45
+KPX Udieresis Agrave -45
+KPX Udieresis Amacron -45
+KPX Udieresis Aogonek -45
+KPX Udieresis Aring -45
+KPX Udieresis Atilde -45
+KPX Ugrave A -45
+KPX Ugrave Aacute -45
+KPX Ugrave Abreve -45
+KPX Ugrave Acircumflex -45
+KPX Ugrave Adieresis -45
+KPX Ugrave Agrave -45
+KPX Ugrave Amacron -45
+KPX Ugrave Aogonek -45
+KPX Ugrave Aring -45
+KPX Ugrave Atilde -45
+KPX Uhungarumlaut A -45
+KPX Uhungarumlaut Aacute -45
+KPX Uhungarumlaut Abreve -45
+KPX Uhungarumlaut Acircumflex -45
+KPX Uhungarumlaut Adieresis -45
+KPX Uhungarumlaut Agrave -45
+KPX Uhungarumlaut Amacron -45
+KPX Uhungarumlaut Aogonek -45
+KPX Uhungarumlaut Aring -45
+KPX Uhungarumlaut Atilde -45
+KPX Umacron A -45
+KPX Umacron Aacute -45
+KPX Umacron Abreve -45
+KPX Umacron Acircumflex -45
+KPX Umacron Adieresis -45
+KPX Umacron Agrave -45
+KPX Umacron Amacron -45
+KPX Umacron Aogonek -45
+KPX Umacron Aring -45
+KPX Umacron Atilde -45
+KPX Uogonek A -45
+KPX Uogonek Aacute -45
+KPX Uogonek Abreve -45
+KPX Uogonek Acircumflex -45
+KPX Uogonek Adieresis -45
+KPX Uogonek Agrave -45
+KPX Uogonek Amacron -45
+KPX Uogonek Aogonek -45
+KPX Uogonek Aring -45
+KPX Uogonek Atilde -45
+KPX Uring A -45
+KPX Uring Aacute -45
+KPX Uring Abreve -45
+KPX Uring Acircumflex -45
+KPX Uring Adieresis -45
+KPX Uring Agrave -45
+KPX Uring Amacron -45
+KPX Uring Aogonek -45
+KPX Uring Aring -45
+KPX Uring Atilde -45
+KPX V A -85
+KPX V Aacute -85
+KPX V Abreve -85
+KPX V Acircumflex -85
+KPX V Adieresis -85
+KPX V Agrave -85
+KPX V Amacron -85
+KPX V Aogonek -85
+KPX V Aring -85
+KPX V Atilde -85
+KPX V G -10
+KPX V Gbreve -10
+KPX V Gcommaaccent -10
+KPX V O -30
+KPX V Oacute -30
+KPX V Ocircumflex -30
+KPX V Odieresis -30
+KPX V Ograve -30
+KPX V Ohungarumlaut -30
+KPX V Omacron -30
+KPX V Oslash -30
+KPX V Otilde -30
+KPX V a -111
+KPX V aacute -111
+KPX V abreve -111
+KPX V acircumflex -111
+KPX V adieresis -111
+KPX V agrave -111
+KPX V amacron -111
+KPX V aogonek -111
+KPX V aring -111
+KPX V atilde -111
+KPX V colon -74
+KPX V comma -129
+KPX V e -111
+KPX V eacute -111
+KPX V ecaron -111
+KPX V ecircumflex -111
+KPX V edieresis -71
+KPX V edotaccent -111
+KPX V egrave -71
+KPX V emacron -71
+KPX V eogonek -111
+KPX V hyphen -70
+KPX V i -55
+KPX V iacute -55
+KPX V iogonek -55
+KPX V o -111
+KPX V oacute -111
+KPX V ocircumflex -111
+KPX V odieresis -111
+KPX V ograve -111
+KPX V ohungarumlaut -111
+KPX V omacron -111
+KPX V oslash -111
+KPX V otilde -111
+KPX V period -129
+KPX V semicolon -74
+KPX V u -55
+KPX V uacute -55
+KPX V ucircumflex -55
+KPX V udieresis -55
+KPX V ugrave -55
+KPX V uhungarumlaut -55
+KPX V umacron -55
+KPX V uogonek -55
+KPX V uring -55
+KPX W A -74
+KPX W Aacute -74
+KPX W Abreve -74
+KPX W Acircumflex -74
+KPX W Adieresis -74
+KPX W Agrave -74
+KPX W Amacron -74
+KPX W Aogonek -74
+KPX W Aring -74
+KPX W Atilde -74
+KPX W O -15
+KPX W Oacute -15
+KPX W Ocircumflex -15
+KPX W Odieresis -15
+KPX W Ograve -15
+KPX W Ohungarumlaut -15
+KPX W Omacron -15
+KPX W Oslash -15
+KPX W Otilde -15
+KPX W a -85
+KPX W aacute -85
+KPX W abreve -85
+KPX W acircumflex -85
+KPX W adieresis -85
+KPX W agrave -85
+KPX W amacron -85
+KPX W aogonek -85
+KPX W aring -85
+KPX W atilde -85
+KPX W colon -55
+KPX W comma -74
+KPX W e -90
+KPX W eacute -90
+KPX W ecaron -90
+KPX W ecircumflex -90
+KPX W edieresis -50
+KPX W edotaccent -90
+KPX W egrave -50
+KPX W emacron -50
+KPX W eogonek -90
+KPX W hyphen -50
+KPX W i -37
+KPX W iacute -37
+KPX W iogonek -37
+KPX W o -80
+KPX W oacute -80
+KPX W ocircumflex -80
+KPX W odieresis -80
+KPX W ograve -80
+KPX W ohungarumlaut -80
+KPX W omacron -80
+KPX W oslash -80
+KPX W otilde -80
+KPX W period -74
+KPX W semicolon -55
+KPX W u -55
+KPX W uacute -55
+KPX W ucircumflex -55
+KPX W udieresis -55
+KPX W ugrave -55
+KPX W uhungarumlaut -55
+KPX W umacron -55
+KPX W uogonek -55
+KPX W uring -55
+KPX W y -55
+KPX W yacute -55
+KPX W ydieresis -55
+KPX Y A -74
+KPX Y Aacute -74
+KPX Y Abreve -74
+KPX Y Acircumflex -74
+KPX Y Adieresis -74
+KPX Y Agrave -74
+KPX Y Amacron -74
+KPX Y Aogonek -74
+KPX Y Aring -74
+KPX Y Atilde -74
+KPX Y O -25
+KPX Y Oacute -25
+KPX Y Ocircumflex -25
+KPX Y Odieresis -25
+KPX Y Ograve -25
+KPX Y Ohungarumlaut -25
+KPX Y Omacron -25
+KPX Y Oslash -25
+KPX Y Otilde -25
+KPX Y a -92
+KPX Y aacute -92
+KPX Y abreve -92
+KPX Y acircumflex -92
+KPX Y adieresis -92
+KPX Y agrave -92
+KPX Y amacron -92
+KPX Y aogonek -92
+KPX Y aring -92
+KPX Y atilde -92
+KPX Y colon -92
+KPX Y comma -92
+KPX Y e -111
+KPX Y eacute -111
+KPX Y ecaron -111
+KPX Y ecircumflex -71
+KPX Y edieresis -71
+KPX Y edotaccent -111
+KPX Y egrave -71
+KPX Y emacron -71
+KPX Y eogonek -111
+KPX Y hyphen -92
+KPX Y i -55
+KPX Y iacute -55
+KPX Y iogonek -55
+KPX Y o -111
+KPX Y oacute -111
+KPX Y ocircumflex -111
+KPX Y odieresis -111
+KPX Y ograve -111
+KPX Y ohungarumlaut -111
+KPX Y omacron -111
+KPX Y oslash -111
+KPX Y otilde -111
+KPX Y period -74
+KPX Y semicolon -92
+KPX Y u -92
+KPX Y uacute -92
+KPX Y ucircumflex -92
+KPX Y udieresis -92
+KPX Y ugrave -92
+KPX Y uhungarumlaut -92
+KPX Y umacron -92
+KPX Y uogonek -92
+KPX Y uring -92
+KPX Yacute A -74
+KPX Yacute Aacute -74
+KPX Yacute Abreve -74
+KPX Yacute Acircumflex -74
+KPX Yacute Adieresis -74
+KPX Yacute Agrave -74
+KPX Yacute Amacron -74
+KPX Yacute Aogonek -74
+KPX Yacute Aring -74
+KPX Yacute Atilde -74
+KPX Yacute O -25
+KPX Yacute Oacute -25
+KPX Yacute Ocircumflex -25
+KPX Yacute Odieresis -25
+KPX Yacute Ograve -25
+KPX Yacute Ohungarumlaut -25
+KPX Yacute Omacron -25
+KPX Yacute Oslash -25
+KPX Yacute Otilde -25
+KPX Yacute a -92
+KPX Yacute aacute -92
+KPX Yacute abreve -92
+KPX Yacute acircumflex -92
+KPX Yacute adieresis -92
+KPX Yacute agrave -92
+KPX Yacute amacron -92
+KPX Yacute aogonek -92
+KPX Yacute aring -92
+KPX Yacute atilde -92
+KPX Yacute colon -92
+KPX Yacute comma -92
+KPX Yacute e -111
+KPX Yacute eacute -111
+KPX Yacute ecaron -111
+KPX Yacute ecircumflex -71
+KPX Yacute edieresis -71
+KPX Yacute edotaccent -111
+KPX Yacute egrave -71
+KPX Yacute emacron -71
+KPX Yacute eogonek -111
+KPX Yacute hyphen -92
+KPX Yacute i -55
+KPX Yacute iacute -55
+KPX Yacute iogonek -55
+KPX Yacute o -111
+KPX Yacute oacute -111
+KPX Yacute ocircumflex -111
+KPX Yacute odieresis -111
+KPX Yacute ograve -111
+KPX Yacute ohungarumlaut -111
+KPX Yacute omacron -111
+KPX Yacute oslash -111
+KPX Yacute otilde -111
+KPX Yacute period -74
+KPX Yacute semicolon -92
+KPX Yacute u -92
+KPX Yacute uacute -92
+KPX Yacute ucircumflex -92
+KPX Yacute udieresis -92
+KPX Yacute ugrave -92
+KPX Yacute uhungarumlaut -92
+KPX Yacute umacron -92
+KPX Yacute uogonek -92
+KPX Yacute uring -92
+KPX Ydieresis A -74
+KPX Ydieresis Aacute -74
+KPX Ydieresis Abreve -74
+KPX Ydieresis Acircumflex -74
+KPX Ydieresis Adieresis -74
+KPX Ydieresis Agrave -74
+KPX Ydieresis Amacron -74
+KPX Ydieresis Aogonek -74
+KPX Ydieresis Aring -74
+KPX Ydieresis Atilde -74
+KPX Ydieresis O -25
+KPX Ydieresis Oacute -25
+KPX Ydieresis Ocircumflex -25
+KPX Ydieresis Odieresis -25
+KPX Ydieresis Ograve -25
+KPX Ydieresis Ohungarumlaut -25
+KPX Ydieresis Omacron -25
+KPX Ydieresis Oslash -25
+KPX Ydieresis Otilde -25
+KPX Ydieresis a -92
+KPX Ydieresis aacute -92
+KPX Ydieresis abreve -92
+KPX Ydieresis acircumflex -92
+KPX Ydieresis adieresis -92
+KPX Ydieresis agrave -92
+KPX Ydieresis amacron -92
+KPX Ydieresis aogonek -92
+KPX Ydieresis aring -92
+KPX Ydieresis atilde -92
+KPX Ydieresis colon -92
+KPX Ydieresis comma -92
+KPX Ydieresis e -111
+KPX Ydieresis eacute -111
+KPX Ydieresis ecaron -111
+KPX Ydieresis ecircumflex -71
+KPX Ydieresis edieresis -71
+KPX Ydieresis edotaccent -111
+KPX Ydieresis egrave -71
+KPX Ydieresis emacron -71
+KPX Ydieresis eogonek -111
+KPX Ydieresis hyphen -92
+KPX Ydieresis i -55
+KPX Ydieresis iacute -55
+KPX Ydieresis iogonek -55
+KPX Ydieresis o -111
+KPX Ydieresis oacute -111
+KPX Ydieresis ocircumflex -111
+KPX Ydieresis odieresis -111
+KPX Ydieresis ograve -111
+KPX Ydieresis ohungarumlaut -111
+KPX Ydieresis omacron -111
+KPX Ydieresis oslash -111
+KPX Ydieresis otilde -111
+KPX Ydieresis period -74
+KPX Ydieresis semicolon -92
+KPX Ydieresis u -92
+KPX Ydieresis uacute -92
+KPX Ydieresis ucircumflex -92
+KPX Ydieresis udieresis -92
+KPX Ydieresis ugrave -92
+KPX Ydieresis uhungarumlaut -92
+KPX Ydieresis umacron -92
+KPX Ydieresis uogonek -92
+KPX Ydieresis uring -92
+KPX b b -10
+KPX b period -40
+KPX b u -20
+KPX b uacute -20
+KPX b ucircumflex -20
+KPX b udieresis -20
+KPX b ugrave -20
+KPX b uhungarumlaut -20
+KPX b umacron -20
+KPX b uogonek -20
+KPX b uring -20
+KPX c h -10
+KPX c k -10
+KPX c kcommaaccent -10
+KPX cacute h -10
+KPX cacute k -10
+KPX cacute kcommaaccent -10
+KPX ccaron h -10
+KPX ccaron k -10
+KPX ccaron kcommaaccent -10
+KPX ccedilla h -10
+KPX ccedilla k -10
+KPX ccedilla kcommaaccent -10
+KPX comma quotedblright -95
+KPX comma quoteright -95
+KPX e b -10
+KPX eacute b -10
+KPX ecaron b -10
+KPX ecircumflex b -10
+KPX edieresis b -10
+KPX edotaccent b -10
+KPX egrave b -10
+KPX emacron b -10
+KPX eogonek b -10
+KPX f comma -10
+KPX f dotlessi -30
+KPX f e -10
+KPX f eacute -10
+KPX f edotaccent -10
+KPX f eogonek -10
+KPX f f -18
+KPX f o -10
+KPX f oacute -10
+KPX f ocircumflex -10
+KPX f ograve -10
+KPX f ohungarumlaut -10
+KPX f oslash -10
+KPX f otilde -10
+KPX f period -10
+KPX f quoteright 55
+KPX k e -30
+KPX k eacute -30
+KPX k ecaron -30
+KPX k ecircumflex -30
+KPX k edieresis -30
+KPX k edotaccent -30
+KPX k egrave -30
+KPX k emacron -30
+KPX k eogonek -30
+KPX k o -10
+KPX k oacute -10
+KPX k ocircumflex -10
+KPX k odieresis -10
+KPX k ograve -10
+KPX k ohungarumlaut -10
+KPX k omacron -10
+KPX k oslash -10
+KPX k otilde -10
+KPX kcommaaccent e -30
+KPX kcommaaccent eacute -30
+KPX kcommaaccent ecaron -30
+KPX kcommaaccent ecircumflex -30
+KPX kcommaaccent edieresis -30
+KPX kcommaaccent edotaccent -30
+KPX kcommaaccent egrave -30
+KPX kcommaaccent emacron -30
+KPX kcommaaccent eogonek -30
+KPX kcommaaccent o -10
+KPX kcommaaccent oacute -10
+KPX kcommaaccent ocircumflex -10
+KPX kcommaaccent odieresis -10
+KPX kcommaaccent ograve -10
+KPX kcommaaccent ohungarumlaut -10
+KPX kcommaaccent omacron -10
+KPX kcommaaccent oslash -10
+KPX kcommaaccent otilde -10
+KPX n v -40
+KPX nacute v -40
+KPX ncaron v -40
+KPX ncommaaccent v -40
+KPX ntilde v -40
+KPX o v -15
+KPX o w -25
+KPX o x -10
+KPX o y -10
+KPX o yacute -10
+KPX o ydieresis -10
+KPX oacute v -15
+KPX oacute w -25
+KPX oacute x -10
+KPX oacute y -10
+KPX oacute yacute -10
+KPX oacute ydieresis -10
+KPX ocircumflex v -15
+KPX ocircumflex w -25
+KPX ocircumflex x -10
+KPX ocircumflex y -10
+KPX ocircumflex yacute -10
+KPX ocircumflex ydieresis -10
+KPX odieresis v -15
+KPX odieresis w -25
+KPX odieresis x -10
+KPX odieresis y -10
+KPX odieresis yacute -10
+KPX odieresis ydieresis -10
+KPX ograve v -15
+KPX ograve w -25
+KPX ograve x -10
+KPX ograve y -10
+KPX ograve yacute -10
+KPX ograve ydieresis -10
+KPX ohungarumlaut v -15
+KPX ohungarumlaut w -25
+KPX ohungarumlaut x -10
+KPX ohungarumlaut y -10
+KPX ohungarumlaut yacute -10
+KPX ohungarumlaut ydieresis -10
+KPX omacron v -15
+KPX omacron w -25
+KPX omacron x -10
+KPX omacron y -10
+KPX omacron yacute -10
+KPX omacron ydieresis -10
+KPX oslash v -15
+KPX oslash w -25
+KPX oslash x -10
+KPX oslash y -10
+KPX oslash yacute -10
+KPX oslash ydieresis -10
+KPX otilde v -15
+KPX otilde w -25
+KPX otilde x -10
+KPX otilde y -10
+KPX otilde yacute -10
+KPX otilde ydieresis -10
+KPX period quotedblright -95
+KPX period quoteright -95
+KPX quoteleft quoteleft -74
+KPX quoteright d -15
+KPX quoteright dcroat -15
+KPX quoteright quoteright -74
+KPX quoteright r -15
+KPX quoteright racute -15
+KPX quoteright rcaron -15
+KPX quoteright rcommaaccent -15
+KPX quoteright s -74
+KPX quoteright sacute -74
+KPX quoteright scaron -74
+KPX quoteright scedilla -74
+KPX quoteright scommaaccent -74
+KPX quoteright space -74
+KPX quoteright t -37
+KPX quoteright tcommaaccent -37
+KPX quoteright v -15
+KPX r comma -65
+KPX r period -65
+KPX racute comma -65
+KPX racute period -65
+KPX rcaron comma -65
+KPX rcaron period -65
+KPX rcommaaccent comma -65
+KPX rcommaaccent period -65
+KPX space A -37
+KPX space Aacute -37
+KPX space Abreve -37
+KPX space Acircumflex -37
+KPX space Adieresis -37
+KPX space Agrave -37
+KPX space Amacron -37
+KPX space Aogonek -37
+KPX space Aring -37
+KPX space Atilde -37
+KPX space V -70
+KPX space W -70
+KPX space Y -70
+KPX space Yacute -70
+KPX space Ydieresis -70
+KPX v comma -37
+KPX v e -15
+KPX v eacute -15
+KPX v ecaron -15
+KPX v ecircumflex -15
+KPX v edieresis -15
+KPX v edotaccent -15
+KPX v egrave -15
+KPX v emacron -15
+KPX v eogonek -15
+KPX v o -15
+KPX v oacute -15
+KPX v ocircumflex -15
+KPX v odieresis -15
+KPX v ograve -15
+KPX v ohungarumlaut -15
+KPX v omacron -15
+KPX v oslash -15
+KPX v otilde -15
+KPX v period -37
+KPX w a -10
+KPX w aacute -10
+KPX w abreve -10
+KPX w acircumflex -10
+KPX w adieresis -10
+KPX w agrave -10
+KPX w amacron -10
+KPX w aogonek -10
+KPX w aring -10
+KPX w atilde -10
+KPX w comma -37
+KPX w e -10
+KPX w eacute -10
+KPX w ecaron -10
+KPX w ecircumflex -10
+KPX w edieresis -10
+KPX w edotaccent -10
+KPX w egrave -10
+KPX w emacron -10
+KPX w eogonek -10
+KPX w o -15
+KPX w oacute -15
+KPX w ocircumflex -15
+KPX w odieresis -15
+KPX w ograve -15
+KPX w ohungarumlaut -15
+KPX w omacron -15
+KPX w oslash -15
+KPX w otilde -15
+KPX w period -37
+KPX x e -10
+KPX x eacute -10
+KPX x ecaron -10
+KPX x ecircumflex -10
+KPX x edieresis -10
+KPX x edotaccent -10
+KPX x egrave -10
+KPX x emacron -10
+KPX x eogonek -10
+KPX y comma -37
+KPX y period -37
+KPX yacute comma -37
+KPX yacute period -37
+KPX ydieresis comma -37
+KPX ydieresis period -37
+EndKernPairs
+EndKernData
+EndFontMetrics
diff --git a/src/main/resources/com/lowagie/text/pdf/fonts/Times-Italic.afm b/src/main/resources/com/lowagie/text/pdf/fonts/Times-Italic.afm
new file mode 100644
index 0000000..8de6e42
--- /dev/null
+++ b/src/main/resources/com/lowagie/text/pdf/fonts/Times-Italic.afm
@@ -0,0 +1,2667 @@
+StartFontMetrics 4.1
+Comment Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.
+Comment Creation Date: Thu May 1 12:56:55 1997
+Comment UniqueID 43067
+Comment VMusage 47727 58752
+FontName Times-Italic
+FullName Times Italic
+FamilyName Times
+Weight Medium
+ItalicAngle -15.5
+IsFixedPitch false
+CharacterSet ExtendedRoman
+FontBBox -169 -217 1010 883
+UnderlinePosition -100
+UnderlineThickness 50
+Version 002.000
+Notice Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.Times is a trademark of Linotype-Hell AG and/or its subsidiaries.
+EncodingScheme AdobeStandardEncoding
+CapHeight 653
+XHeight 441
+Ascender 683
+Descender -217
+StdHW 32
+StdVW 76
+StartCharMetrics 315
+C 32 ; WX 250 ; N space ; B 0 0 0 0 ;
+C 33 ; WX 333 ; N exclam ; B 39 -11 302 667 ;
+C 34 ; WX 420 ; N quotedbl ; B 144 421 432 666 ;
+C 35 ; WX 500 ; N numbersign ; B 2 0 540 676 ;
+C 36 ; WX 500 ; N dollar ; B 31 -89 497 731 ;
+C 37 ; WX 833 ; N percent ; B 79 -13 790 676 ;
+C 38 ; WX 778 ; N ampersand ; B 76 -18 723 666 ;
+C 39 ; WX 333 ; N quoteright ; B 151 436 290 666 ;
+C 40 ; WX 333 ; N parenleft ; B 42 -181 315 669 ;
+C 41 ; WX 333 ; N parenright ; B 16 -180 289 669 ;
+C 42 ; WX 500 ; N asterisk ; B 128 255 492 666 ;
+C 43 ; WX 675 ; N plus ; B 86 0 590 506 ;
+C 44 ; WX 250 ; N comma ; B -4 -129 135 101 ;
+C 45 ; WX 333 ; N hyphen ; B 49 192 282 255 ;
+C 46 ; WX 250 ; N period ; B 27 -11 138 100 ;
+C 47 ; WX 278 ; N slash ; B -65 -18 386 666 ;
+C 48 ; WX 500 ; N zero ; B 32 -7 497 676 ;
+C 49 ; WX 500 ; N one ; B 49 0 409 676 ;
+C 50 ; WX 500 ; N two ; B 12 0 452 676 ;
+C 51 ; WX 500 ; N three ; B 15 -7 465 676 ;
+C 52 ; WX 500 ; N four ; B 1 0 479 676 ;
+C 53 ; WX 500 ; N five ; B 15 -7 491 666 ;
+C 54 ; WX 500 ; N six ; B 30 -7 521 686 ;
+C 55 ; WX 500 ; N seven ; B 75 -8 537 666 ;
+C 56 ; WX 500 ; N eight ; B 30 -7 493 676 ;
+C 57 ; WX 500 ; N nine ; B 23 -17 492 676 ;
+C 58 ; WX 333 ; N colon ; B 50 -11 261 441 ;
+C 59 ; WX 333 ; N semicolon ; B 27 -129 261 441 ;
+C 60 ; WX 675 ; N less ; B 84 -8 592 514 ;
+C 61 ; WX 675 ; N equal ; B 86 120 590 386 ;
+C 62 ; WX 675 ; N greater ; B 84 -8 592 514 ;
+C 63 ; WX 500 ; N question ; B 132 -12 472 664 ;
+C 64 ; WX 920 ; N at ; B 118 -18 806 666 ;
+C 65 ; WX 611 ; N A ; B -51 0 564 668 ;
+C 66 ; WX 611 ; N B ; B -8 0 588 653 ;
+C 67 ; WX 667 ; N C ; B 66 -18 689 666 ;
+C 68 ; WX 722 ; N D ; B -8 0 700 653 ;
+C 69 ; WX 611 ; N E ; B -1 0 634 653 ;
+C 70 ; WX 611 ; N F ; B 8 0 645 653 ;
+C 71 ; WX 722 ; N G ; B 52 -18 722 666 ;
+C 72 ; WX 722 ; N H ; B -8 0 767 653 ;
+C 73 ; WX 333 ; N I ; B -8 0 384 653 ;
+C 74 ; WX 444 ; N J ; B -6 -18 491 653 ;
+C 75 ; WX 667 ; N K ; B 7 0 722 653 ;
+C 76 ; WX 556 ; N L ; B -8 0 559 653 ;
+C 77 ; WX 833 ; N M ; B -18 0 873 653 ;
+C 78 ; WX 667 ; N N ; B -20 -15 727 653 ;
+C 79 ; WX 722 ; N O ; B 60 -18 699 666 ;
+C 80 ; WX 611 ; N P ; B 0 0 605 653 ;
+C 81 ; WX 722 ; N Q ; B 59 -182 699 666 ;
+C 82 ; WX 611 ; N R ; B -13 0 588 653 ;
+C 83 ; WX 500 ; N S ; B 17 -18 508 667 ;
+C 84 ; WX 556 ; N T ; B 59 0 633 653 ;
+C 85 ; WX 722 ; N U ; B 102 -18 765 653 ;
+C 86 ; WX 611 ; N V ; B 76 -18 688 653 ;
+C 87 ; WX 833 ; N W ; B 71 -18 906 653 ;
+C 88 ; WX 611 ; N X ; B -29 0 655 653 ;
+C 89 ; WX 556 ; N Y ; B 78 0 633 653 ;
+C 90 ; WX 556 ; N Z ; B -6 0 606 653 ;
+C 91 ; WX 389 ; N bracketleft ; B 21 -153 391 663 ;
+C 92 ; WX 278 ; N backslash ; B -41 -18 319 666 ;
+C 93 ; WX 389 ; N bracketright ; B 12 -153 382 663 ;
+C 94 ; WX 422 ; N asciicircum ; B 0 301 422 666 ;
+C 95 ; WX 500 ; N underscore ; B 0 -125 500 -75 ;
+C 96 ; WX 333 ; N quoteleft ; B 171 436 310 666 ;
+C 97 ; WX 500 ; N a ; B 17 -11 476 441 ;
+C 98 ; WX 500 ; N b ; B 23 -11 473 683 ;
+C 99 ; WX 444 ; N c ; B 30 -11 425 441 ;
+C 100 ; WX 500 ; N d ; B 15 -13 527 683 ;
+C 101 ; WX 444 ; N e ; B 31 -11 412 441 ;
+C 102 ; WX 278 ; N f ; B -147 -207 424 678 ; L i fi ; L l fl ;
+C 103 ; WX 500 ; N g ; B 8 -206 472 441 ;
+C 104 ; WX 500 ; N h ; B 19 -9 478 683 ;
+C 105 ; WX 278 ; N i ; B 49 -11 264 654 ;
+C 106 ; WX 278 ; N j ; B -124 -207 276 654 ;
+C 107 ; WX 444 ; N k ; B 14 -11 461 683 ;
+C 108 ; WX 278 ; N l ; B 41 -11 279 683 ;
+C 109 ; WX 722 ; N m ; B 12 -9 704 441 ;
+C 110 ; WX 500 ; N n ; B 14 -9 474 441 ;
+C 111 ; WX 500 ; N o ; B 27 -11 468 441 ;
+C 112 ; WX 500 ; N p ; B -75 -205 469 441 ;
+C 113 ; WX 500 ; N q ; B 25 -209 483 441 ;
+C 114 ; WX 389 ; N r ; B 45 0 412 441 ;
+C 115 ; WX 389 ; N s ; B 16 -13 366 442 ;
+C 116 ; WX 278 ; N t ; B 37 -11 296 546 ;
+C 117 ; WX 500 ; N u ; B 42 -11 475 441 ;
+C 118 ; WX 444 ; N v ; B 21 -18 426 441 ;
+C 119 ; WX 667 ; N w ; B 16 -18 648 441 ;
+C 120 ; WX 444 ; N x ; B -27 -11 447 441 ;
+C 121 ; WX 444 ; N y ; B -24 -206 426 441 ;
+C 122 ; WX 389 ; N z ; B -2 -81 380 428 ;
+C 123 ; WX 400 ; N braceleft ; B 51 -177 407 687 ;
+C 124 ; WX 275 ; N bar ; B 105 -217 171 783 ;
+C 125 ; WX 400 ; N braceright ; B -7 -177 349 687 ;
+C 126 ; WX 541 ; N asciitilde ; B 40 183 502 323 ;
+C 161 ; WX 389 ; N exclamdown ; B 59 -205 322 473 ;
+C 162 ; WX 500 ; N cent ; B 77 -143 472 560 ;
+C 163 ; WX 500 ; N sterling ; B 10 -6 517 670 ;
+C 164 ; WX 167 ; N fraction ; B -169 -10 337 676 ;
+C 165 ; WX 500 ; N yen ; B 27 0 603 653 ;
+C 166 ; WX 500 ; N florin ; B 25 -182 507 682 ;
+C 167 ; WX 500 ; N section ; B 53 -162 461 666 ;
+C 168 ; WX 500 ; N currency ; B -22 53 522 597 ;
+C 169 ; WX 214 ; N quotesingle ; B 132 421 241 666 ;
+C 170 ; WX 556 ; N quotedblleft ; B 166 436 514 666 ;
+C 171 ; WX 500 ; N guillemotleft ; B 53 37 445 403 ;
+C 172 ; WX 333 ; N guilsinglleft ; B 51 37 281 403 ;
+C 173 ; WX 333 ; N guilsinglright ; B 52 37 282 403 ;
+C 174 ; WX 500 ; N fi ; B -141 -207 481 681 ;
+C 175 ; WX 500 ; N fl ; B -141 -204 518 682 ;
+C 177 ; WX 500 ; N endash ; B -6 197 505 243 ;
+C 178 ; WX 500 ; N dagger ; B 101 -159 488 666 ;
+C 179 ; WX 500 ; N daggerdbl ; B 22 -143 491 666 ;
+C 180 ; WX 250 ; N periodcentered ; B 70 199 181 310 ;
+C 182 ; WX 523 ; N paragraph ; B 55 -123 616 653 ;
+C 183 ; WX 350 ; N bullet ; B 40 191 310 461 ;
+C 184 ; WX 333 ; N quotesinglbase ; B 44 -129 183 101 ;
+C 185 ; WX 556 ; N quotedblbase ; B 57 -129 405 101 ;
+C 186 ; WX 556 ; N quotedblright ; B 151 436 499 666 ;
+C 187 ; WX 500 ; N guillemotright ; B 55 37 447 403 ;
+C 188 ; WX 889 ; N ellipsis ; B 57 -11 762 100 ;
+C 189 ; WX 1000 ; N perthousand ; B 25 -19 1010 706 ;
+C 191 ; WX 500 ; N questiondown ; B 28 -205 368 471 ;
+C 193 ; WX 333 ; N grave ; B 121 492 311 664 ;
+C 194 ; WX 333 ; N acute ; B 180 494 403 664 ;
+C 195 ; WX 333 ; N circumflex ; B 91 492 385 661 ;
+C 196 ; WX 333 ; N tilde ; B 100 517 427 624 ;
+C 197 ; WX 333 ; N macron ; B 99 532 411 583 ;
+C 198 ; WX 333 ; N breve ; B 117 492 418 650 ;
+C 199 ; WX 333 ; N dotaccent ; B 207 548 305 646 ;
+C 200 ; WX 333 ; N dieresis ; B 107 548 405 646 ;
+C 202 ; WX 333 ; N ring ; B 155 492 355 691 ;
+C 203 ; WX 333 ; N cedilla ; B -30 -217 182 0 ;
+C 205 ; WX 333 ; N hungarumlaut ; B 93 494 486 664 ;
+C 206 ; WX 333 ; N ogonek ; B 20 -169 203 40 ;
+C 207 ; WX 333 ; N caron ; B 121 492 426 661 ;
+C 208 ; WX 889 ; N emdash ; B -6 197 894 243 ;
+C 225 ; WX 889 ; N AE ; B -27 0 911 653 ;
+C 227 ; WX 276 ; N ordfeminine ; B 42 406 352 676 ;
+C 232 ; WX 556 ; N Lslash ; B -8 0 559 653 ;
+C 233 ; WX 722 ; N Oslash ; B 60 -105 699 722 ;
+C 234 ; WX 944 ; N OE ; B 49 -8 964 666 ;
+C 235 ; WX 310 ; N ordmasculine ; B 67 406 362 676 ;
+C 241 ; WX 667 ; N ae ; B 23 -11 640 441 ;
+C 245 ; WX 278 ; N dotlessi ; B 49 -11 235 441 ;
+C 248 ; WX 278 ; N lslash ; B 41 -11 312 683 ;
+C 249 ; WX 500 ; N oslash ; B 28 -135 469 554 ;
+C 250 ; WX 667 ; N oe ; B 20 -12 646 441 ;
+C 251 ; WX 500 ; N germandbls ; B -168 -207 493 679 ;
+C -1 ; WX 333 ; N Idieresis ; B -8 0 435 818 ;
+C -1 ; WX 444 ; N eacute ; B 31 -11 459 664 ;
+C -1 ; WX 500 ; N abreve ; B 17 -11 502 650 ;
+C -1 ; WX 500 ; N uhungarumlaut ; B 42 -11 580 664 ;
+C -1 ; WX 444 ; N ecaron ; B 31 -11 482 661 ;
+C -1 ; WX 556 ; N Ydieresis ; B 78 0 633 818 ;
+C -1 ; WX 675 ; N divide ; B 86 -11 590 517 ;
+C -1 ; WX 556 ; N Yacute ; B 78 0 633 876 ;
+C -1 ; WX 611 ; N Acircumflex ; B -51 0 564 873 ;
+C -1 ; WX 500 ; N aacute ; B 17 -11 487 664 ;
+C -1 ; WX 722 ; N Ucircumflex ; B 102 -18 765 873 ;
+C -1 ; WX 444 ; N yacute ; B -24 -206 459 664 ;
+C -1 ; WX 389 ; N scommaaccent ; B 16 -217 366 442 ;
+C -1 ; WX 444 ; N ecircumflex ; B 31 -11 441 661 ;
+C -1 ; WX 722 ; N Uring ; B 102 -18 765 883 ;
+C -1 ; WX 722 ; N Udieresis ; B 102 -18 765 818 ;
+C -1 ; WX 500 ; N aogonek ; B 17 -169 476 441 ;
+C -1 ; WX 722 ; N Uacute ; B 102 -18 765 876 ;
+C -1 ; WX 500 ; N uogonek ; B 42 -169 477 441 ;
+C -1 ; WX 611 ; N Edieresis ; B -1 0 634 818 ;
+C -1 ; WX 722 ; N Dcroat ; B -8 0 700 653 ;
+C -1 ; WX 250 ; N commaaccent ; B 8 -217 133 -50 ;
+C -1 ; WX 760 ; N copyright ; B 41 -18 719 666 ;
+C -1 ; WX 611 ; N Emacron ; B -1 0 634 795 ;
+C -1 ; WX 444 ; N ccaron ; B 30 -11 482 661 ;
+C -1 ; WX 500 ; N aring ; B 17 -11 476 691 ;
+C -1 ; WX 667 ; N Ncommaaccent ; B -20 -187 727 653 ;
+C -1 ; WX 278 ; N lacute ; B 41 -11 395 876 ;
+C -1 ; WX 500 ; N agrave ; B 17 -11 476 664 ;
+C -1 ; WX 556 ; N Tcommaaccent ; B 59 -217 633 653 ;
+C -1 ; WX 667 ; N Cacute ; B 66 -18 690 876 ;
+C -1 ; WX 500 ; N atilde ; B 17 -11 511 624 ;
+C -1 ; WX 611 ; N Edotaccent ; B -1 0 634 818 ;
+C -1 ; WX 389 ; N scaron ; B 16 -13 454 661 ;
+C -1 ; WX 389 ; N scedilla ; B 16 -217 366 442 ;
+C -1 ; WX 278 ; N iacute ; B 49 -11 355 664 ;
+C -1 ; WX 471 ; N lozenge ; B 13 0 459 724 ;
+C -1 ; WX 611 ; N Rcaron ; B -13 0 588 873 ;
+C -1 ; WX 722 ; N Gcommaaccent ; B 52 -217 722 666 ;
+C -1 ; WX 500 ; N ucircumflex ; B 42 -11 475 661 ;
+C -1 ; WX 500 ; N acircumflex ; B 17 -11 476 661 ;
+C -1 ; WX 611 ; N Amacron ; B -51 0 564 795 ;
+C -1 ; WX 389 ; N rcaron ; B 45 0 434 661 ;
+C -1 ; WX 444 ; N ccedilla ; B 30 -217 425 441 ;
+C -1 ; WX 556 ; N Zdotaccent ; B -6 0 606 818 ;
+C -1 ; WX 611 ; N Thorn ; B 0 0 569 653 ;
+C -1 ; WX 722 ; N Omacron ; B 60 -18 699 795 ;
+C -1 ; WX 611 ; N Racute ; B -13 0 588 876 ;
+C -1 ; WX 500 ; N Sacute ; B 17 -18 508 876 ;
+C -1 ; WX 544 ; N dcaron ; B 15 -13 658 683 ;
+C -1 ; WX 722 ; N Umacron ; B 102 -18 765 795 ;
+C -1 ; WX 500 ; N uring ; B 42 -11 475 691 ;
+C -1 ; WX 300 ; N threesuperior ; B 43 268 339 676 ;
+C -1 ; WX 722 ; N Ograve ; B 60 -18 699 876 ;
+C -1 ; WX 611 ; N Agrave ; B -51 0 564 876 ;
+C -1 ; WX 611 ; N Abreve ; B -51 0 564 862 ;
+C -1 ; WX 675 ; N multiply ; B 93 8 582 497 ;
+C -1 ; WX 500 ; N uacute ; B 42 -11 477 664 ;
+C -1 ; WX 556 ; N Tcaron ; B 59 0 633 873 ;
+C -1 ; WX 476 ; N partialdiff ; B 17 -38 459 710 ;
+C -1 ; WX 444 ; N ydieresis ; B -24 -206 441 606 ;
+C -1 ; WX 667 ; N Nacute ; B -20 -15 727 876 ;
+C -1 ; WX 278 ; N icircumflex ; B 33 -11 327 661 ;
+C -1 ; WX 611 ; N Ecircumflex ; B -1 0 634 873 ;
+C -1 ; WX 500 ; N adieresis ; B 17 -11 489 606 ;
+C -1 ; WX 444 ; N edieresis ; B 31 -11 451 606 ;
+C -1 ; WX 444 ; N cacute ; B 30 -11 459 664 ;
+C -1 ; WX 500 ; N nacute ; B 14 -9 477 664 ;
+C -1 ; WX 500 ; N umacron ; B 42 -11 485 583 ;
+C -1 ; WX 667 ; N Ncaron ; B -20 -15 727 873 ;
+C -1 ; WX 333 ; N Iacute ; B -8 0 433 876 ;
+C -1 ; WX 675 ; N plusminus ; B 86 0 590 506 ;
+C -1 ; WX 275 ; N brokenbar ; B 105 -142 171 708 ;
+C -1 ; WX 760 ; N registered ; B 41 -18 719 666 ;
+C -1 ; WX 722 ; N Gbreve ; B 52 -18 722 862 ;
+C -1 ; WX 333 ; N Idotaccent ; B -8 0 384 818 ;
+C -1 ; WX 600 ; N summation ; B 15 -10 585 706 ;
+C -1 ; WX 611 ; N Egrave ; B -1 0 634 876 ;
+C -1 ; WX 389 ; N racute ; B 45 0 431 664 ;
+C -1 ; WX 500 ; N omacron ; B 27 -11 495 583 ;
+C -1 ; WX 556 ; N Zacute ; B -6 0 606 876 ;
+C -1 ; WX 556 ; N Zcaron ; B -6 0 606 873 ;
+C -1 ; WX 549 ; N greaterequal ; B 26 0 523 658 ;
+C -1 ; WX 722 ; N Eth ; B -8 0 700 653 ;
+C -1 ; WX 667 ; N Ccedilla ; B 66 -217 689 666 ;
+C -1 ; WX 278 ; N lcommaaccent ; B 22 -217 279 683 ;
+C -1 ; WX 300 ; N tcaron ; B 37 -11 407 681 ;
+C -1 ; WX 444 ; N eogonek ; B 31 -169 412 441 ;
+C -1 ; WX 722 ; N Uogonek ; B 102 -184 765 653 ;
+C -1 ; WX 611 ; N Aacute ; B -51 0 564 876 ;
+C -1 ; WX 611 ; N Adieresis ; B -51 0 564 818 ;
+C -1 ; WX 444 ; N egrave ; B 31 -11 412 664 ;
+C -1 ; WX 389 ; N zacute ; B -2 -81 431 664 ;
+C -1 ; WX 278 ; N iogonek ; B 49 -169 264 654 ;
+C -1 ; WX 722 ; N Oacute ; B 60 -18 699 876 ;
+C -1 ; WX 500 ; N oacute ; B 27 -11 487 664 ;
+C -1 ; WX 500 ; N amacron ; B 17 -11 495 583 ;
+C -1 ; WX 389 ; N sacute ; B 16 -13 431 664 ;
+C -1 ; WX 278 ; N idieresis ; B 49 -11 352 606 ;
+C -1 ; WX 722 ; N Ocircumflex ; B 60 -18 699 873 ;
+C -1 ; WX 722 ; N Ugrave ; B 102 -18 765 876 ;
+C -1 ; WX 612 ; N Delta ; B 6 0 608 688 ;
+C -1 ; WX 500 ; N thorn ; B -75 -205 469 683 ;
+C -1 ; WX 300 ; N twosuperior ; B 33 271 324 676 ;
+C -1 ; WX 722 ; N Odieresis ; B 60 -18 699 818 ;
+C -1 ; WX 500 ; N mu ; B -30 -209 497 428 ;
+C -1 ; WX 278 ; N igrave ; B 49 -11 284 664 ;
+C -1 ; WX 500 ; N ohungarumlaut ; B 27 -11 590 664 ;
+C -1 ; WX 611 ; N Eogonek ; B -1 -169 634 653 ;
+C -1 ; WX 500 ; N dcroat ; B 15 -13 572 683 ;
+C -1 ; WX 750 ; N threequarters ; B 23 -10 736 676 ;
+C -1 ; WX 500 ; N Scedilla ; B 17 -217 508 667 ;
+C -1 ; WX 300 ; N lcaron ; B 41 -11 407 683 ;
+C -1 ; WX 667 ; N Kcommaaccent ; B 7 -217 722 653 ;
+C -1 ; WX 556 ; N Lacute ; B -8 0 559 876 ;
+C -1 ; WX 980 ; N trademark ; B 30 247 957 653 ;
+C -1 ; WX 444 ; N edotaccent ; B 31 -11 412 606 ;
+C -1 ; WX 333 ; N Igrave ; B -8 0 384 876 ;
+C -1 ; WX 333 ; N Imacron ; B -8 0 441 795 ;
+C -1 ; WX 611 ; N Lcaron ; B -8 0 586 653 ;
+C -1 ; WX 750 ; N onehalf ; B 34 -10 749 676 ;
+C -1 ; WX 549 ; N lessequal ; B 26 0 523 658 ;
+C -1 ; WX 500 ; N ocircumflex ; B 27 -11 468 661 ;
+C -1 ; WX 500 ; N ntilde ; B 14 -9 476 624 ;
+C -1 ; WX 722 ; N Uhungarumlaut ; B 102 -18 765 876 ;
+C -1 ; WX 611 ; N Eacute ; B -1 0 634 876 ;
+C -1 ; WX 444 ; N emacron ; B 31 -11 457 583 ;
+C -1 ; WX 500 ; N gbreve ; B 8 -206 487 650 ;
+C -1 ; WX 750 ; N onequarter ; B 33 -10 736 676 ;
+C -1 ; WX 500 ; N Scaron ; B 17 -18 520 873 ;
+C -1 ; WX 500 ; N Scommaaccent ; B 17 -217 508 667 ;
+C -1 ; WX 722 ; N Ohungarumlaut ; B 60 -18 699 876 ;
+C -1 ; WX 400 ; N degree ; B 101 390 387 676 ;
+C -1 ; WX 500 ; N ograve ; B 27 -11 468 664 ;
+C -1 ; WX 667 ; N Ccaron ; B 66 -18 689 873 ;
+C -1 ; WX 500 ; N ugrave ; B 42 -11 475 664 ;
+C -1 ; WX 453 ; N radical ; B 2 -60 452 768 ;
+C -1 ; WX 722 ; N Dcaron ; B -8 0 700 873 ;
+C -1 ; WX 389 ; N rcommaaccent ; B -3 -217 412 441 ;
+C -1 ; WX 667 ; N Ntilde ; B -20 -15 727 836 ;
+C -1 ; WX 500 ; N otilde ; B 27 -11 496 624 ;
+C -1 ; WX 611 ; N Rcommaaccent ; B -13 -187 588 653 ;
+C -1 ; WX 556 ; N Lcommaaccent ; B -8 -217 559 653 ;
+C -1 ; WX 611 ; N Atilde ; B -51 0 566 836 ;
+C -1 ; WX 611 ; N Aogonek ; B -51 -169 566 668 ;
+C -1 ; WX 611 ; N Aring ; B -51 0 564 883 ;
+C -1 ; WX 722 ; N Otilde ; B 60 -18 699 836 ;
+C -1 ; WX 389 ; N zdotaccent ; B -2 -81 380 606 ;
+C -1 ; WX 611 ; N Ecaron ; B -1 0 634 873 ;
+C -1 ; WX 333 ; N Iogonek ; B -8 -169 384 653 ;
+C -1 ; WX 444 ; N kcommaaccent ; B 14 -187 461 683 ;
+C -1 ; WX 675 ; N minus ; B 86 220 590 286 ;
+C -1 ; WX 333 ; N Icircumflex ; B -8 0 425 873 ;
+C -1 ; WX 500 ; N ncaron ; B 14 -9 510 661 ;
+C -1 ; WX 278 ; N tcommaaccent ; B 2 -217 296 546 ;
+C -1 ; WX 675 ; N logicalnot ; B 86 108 590 386 ;
+C -1 ; WX 500 ; N odieresis ; B 27 -11 489 606 ;
+C -1 ; WX 500 ; N udieresis ; B 42 -11 479 606 ;
+C -1 ; WX 549 ; N notequal ; B 12 -29 537 541 ;
+C -1 ; WX 500 ; N gcommaaccent ; B 8 -206 472 706 ;
+C -1 ; WX 500 ; N eth ; B 27 -11 482 683 ;
+C -1 ; WX 389 ; N zcaron ; B -2 -81 434 661 ;
+C -1 ; WX 500 ; N ncommaaccent ; B 14 -187 474 441 ;
+C -1 ; WX 300 ; N onesuperior ; B 43 271 284 676 ;
+C -1 ; WX 278 ; N imacron ; B 46 -11 311 583 ;
+C -1 ; WX 500 ; N Euro ; B 0 0 0 0 ;
+EndCharMetrics
+StartKernData
+StartKernPairs 2321
+KPX A C -30
+KPX A Cacute -30
+KPX A Ccaron -30
+KPX A Ccedilla -30
+KPX A G -35
+KPX A Gbreve -35
+KPX A Gcommaaccent -35
+KPX A O -40
+KPX A Oacute -40
+KPX A Ocircumflex -40
+KPX A Odieresis -40
+KPX A Ograve -40
+KPX A Ohungarumlaut -40
+KPX A Omacron -40
+KPX A Oslash -40
+KPX A Otilde -40
+KPX A Q -40
+KPX A T -37
+KPX A Tcaron -37
+KPX A Tcommaaccent -37
+KPX A U -50
+KPX A Uacute -50
+KPX A Ucircumflex -50
+KPX A Udieresis -50
+KPX A Ugrave -50
+KPX A Uhungarumlaut -50
+KPX A Umacron -50
+KPX A Uogonek -50
+KPX A Uring -50
+KPX A V -105
+KPX A W -95
+KPX A Y -55
+KPX A Yacute -55
+KPX A Ydieresis -55
+KPX A quoteright -37
+KPX A u -20
+KPX A uacute -20
+KPX A ucircumflex -20
+KPX A udieresis -20
+KPX A ugrave -20
+KPX A uhungarumlaut -20
+KPX A umacron -20
+KPX A uogonek -20
+KPX A uring -20
+KPX A v -55
+KPX A w -55
+KPX A y -55
+KPX A yacute -55
+KPX A ydieresis -55
+KPX Aacute C -30
+KPX Aacute Cacute -30
+KPX Aacute Ccaron -30
+KPX Aacute Ccedilla -30
+KPX Aacute G -35
+KPX Aacute Gbreve -35
+KPX Aacute Gcommaaccent -35
+KPX Aacute O -40
+KPX Aacute Oacute -40
+KPX Aacute Ocircumflex -40
+KPX Aacute Odieresis -40
+KPX Aacute Ograve -40
+KPX Aacute Ohungarumlaut -40
+KPX Aacute Omacron -40
+KPX Aacute Oslash -40
+KPX Aacute Otilde -40
+KPX Aacute Q -40
+KPX Aacute T -37
+KPX Aacute Tcaron -37
+KPX Aacute Tcommaaccent -37
+KPX Aacute U -50
+KPX Aacute Uacute -50
+KPX Aacute Ucircumflex -50
+KPX Aacute Udieresis -50
+KPX Aacute Ugrave -50
+KPX Aacute Uhungarumlaut -50
+KPX Aacute Umacron -50
+KPX Aacute Uogonek -50
+KPX Aacute Uring -50
+KPX Aacute V -105
+KPX Aacute W -95
+KPX Aacute Y -55
+KPX Aacute Yacute -55
+KPX Aacute Ydieresis -55
+KPX Aacute quoteright -37
+KPX Aacute u -20
+KPX Aacute uacute -20
+KPX Aacute ucircumflex -20
+KPX Aacute udieresis -20
+KPX Aacute ugrave -20
+KPX Aacute uhungarumlaut -20
+KPX Aacute umacron -20
+KPX Aacute uogonek -20
+KPX Aacute uring -20
+KPX Aacute v -55
+KPX Aacute w -55
+KPX Aacute y -55
+KPX Aacute yacute -55
+KPX Aacute ydieresis -55
+KPX Abreve C -30
+KPX Abreve Cacute -30
+KPX Abreve Ccaron -30
+KPX Abreve Ccedilla -30
+KPX Abreve G -35
+KPX Abreve Gbreve -35
+KPX Abreve Gcommaaccent -35
+KPX Abreve O -40
+KPX Abreve Oacute -40
+KPX Abreve Ocircumflex -40
+KPX Abreve Odieresis -40
+KPX Abreve Ograve -40
+KPX Abreve Ohungarumlaut -40
+KPX Abreve Omacron -40
+KPX Abreve Oslash -40
+KPX Abreve Otilde -40
+KPX Abreve Q -40
+KPX Abreve T -37
+KPX Abreve Tcaron -37
+KPX Abreve Tcommaaccent -37
+KPX Abreve U -50
+KPX Abreve Uacute -50
+KPX Abreve Ucircumflex -50
+KPX Abreve Udieresis -50
+KPX Abreve Ugrave -50
+KPX Abreve Uhungarumlaut -50
+KPX Abreve Umacron -50
+KPX Abreve Uogonek -50
+KPX Abreve Uring -50
+KPX Abreve V -105
+KPX Abreve W -95
+KPX Abreve Y -55
+KPX Abreve Yacute -55
+KPX Abreve Ydieresis -55
+KPX Abreve quoteright -37
+KPX Abreve u -20
+KPX Abreve uacute -20
+KPX Abreve ucircumflex -20
+KPX Abreve udieresis -20
+KPX Abreve ugrave -20
+KPX Abreve uhungarumlaut -20
+KPX Abreve umacron -20
+KPX Abreve uogonek -20
+KPX Abreve uring -20
+KPX Abreve v -55
+KPX Abreve w -55
+KPX Abreve y -55
+KPX Abreve yacute -55
+KPX Abreve ydieresis -55
+KPX Acircumflex C -30
+KPX Acircumflex Cacute -30
+KPX Acircumflex Ccaron -30
+KPX Acircumflex Ccedilla -30
+KPX Acircumflex G -35
+KPX Acircumflex Gbreve -35
+KPX Acircumflex Gcommaaccent -35
+KPX Acircumflex O -40
+KPX Acircumflex Oacute -40
+KPX Acircumflex Ocircumflex -40
+KPX Acircumflex Odieresis -40
+KPX Acircumflex Ograve -40
+KPX Acircumflex Ohungarumlaut -40
+KPX Acircumflex Omacron -40
+KPX Acircumflex Oslash -40
+KPX Acircumflex Otilde -40
+KPX Acircumflex Q -40
+KPX Acircumflex T -37
+KPX Acircumflex Tcaron -37
+KPX Acircumflex Tcommaaccent -37
+KPX Acircumflex U -50
+KPX Acircumflex Uacute -50
+KPX Acircumflex Ucircumflex -50
+KPX Acircumflex Udieresis -50
+KPX Acircumflex Ugrave -50
+KPX Acircumflex Uhungarumlaut -50
+KPX Acircumflex Umacron -50
+KPX Acircumflex Uogonek -50
+KPX Acircumflex Uring -50
+KPX Acircumflex V -105
+KPX Acircumflex W -95
+KPX Acircumflex Y -55
+KPX Acircumflex Yacute -55
+KPX Acircumflex Ydieresis -55
+KPX Acircumflex quoteright -37
+KPX Acircumflex u -20
+KPX Acircumflex uacute -20
+KPX Acircumflex ucircumflex -20
+KPX Acircumflex udieresis -20
+KPX Acircumflex ugrave -20
+KPX Acircumflex uhungarumlaut -20
+KPX Acircumflex umacron -20
+KPX Acircumflex uogonek -20
+KPX Acircumflex uring -20
+KPX Acircumflex v -55
+KPX Acircumflex w -55
+KPX Acircumflex y -55
+KPX Acircumflex yacute -55
+KPX Acircumflex ydieresis -55
+KPX Adieresis C -30
+KPX Adieresis Cacute -30
+KPX Adieresis Ccaron -30
+KPX Adieresis Ccedilla -30
+KPX Adieresis G -35
+KPX Adieresis Gbreve -35
+KPX Adieresis Gcommaaccent -35
+KPX Adieresis O -40
+KPX Adieresis Oacute -40
+KPX Adieresis Ocircumflex -40
+KPX Adieresis Odieresis -40
+KPX Adieresis Ograve -40
+KPX Adieresis Ohungarumlaut -40
+KPX Adieresis Omacron -40
+KPX Adieresis Oslash -40
+KPX Adieresis Otilde -40
+KPX Adieresis Q -40
+KPX Adieresis T -37
+KPX Adieresis Tcaron -37
+KPX Adieresis Tcommaaccent -37
+KPX Adieresis U -50
+KPX Adieresis Uacute -50
+KPX Adieresis Ucircumflex -50
+KPX Adieresis Udieresis -50
+KPX Adieresis Ugrave -50
+KPX Adieresis Uhungarumlaut -50
+KPX Adieresis Umacron -50
+KPX Adieresis Uogonek -50
+KPX Adieresis Uring -50
+KPX Adieresis V -105
+KPX Adieresis W -95
+KPX Adieresis Y -55
+KPX Adieresis Yacute -55
+KPX Adieresis Ydieresis -55
+KPX Adieresis quoteright -37
+KPX Adieresis u -20
+KPX Adieresis uacute -20
+KPX Adieresis ucircumflex -20
+KPX Adieresis udieresis -20
+KPX Adieresis ugrave -20
+KPX Adieresis uhungarumlaut -20
+KPX Adieresis umacron -20
+KPX Adieresis uogonek -20
+KPX Adieresis uring -20
+KPX Adieresis v -55
+KPX Adieresis w -55
+KPX Adieresis y -55
+KPX Adieresis yacute -55
+KPX Adieresis ydieresis -55
+KPX Agrave C -30
+KPX Agrave Cacute -30
+KPX Agrave Ccaron -30
+KPX Agrave Ccedilla -30
+KPX Agrave G -35
+KPX Agrave Gbreve -35
+KPX Agrave Gcommaaccent -35
+KPX Agrave O -40
+KPX Agrave Oacute -40
+KPX Agrave Ocircumflex -40
+KPX Agrave Odieresis -40
+KPX Agrave Ograve -40
+KPX Agrave Ohungarumlaut -40
+KPX Agrave Omacron -40
+KPX Agrave Oslash -40
+KPX Agrave Otilde -40
+KPX Agrave Q -40
+KPX Agrave T -37
+KPX Agrave Tcaron -37
+KPX Agrave Tcommaaccent -37
+KPX Agrave U -50
+KPX Agrave Uacute -50
+KPX Agrave Ucircumflex -50
+KPX Agrave Udieresis -50
+KPX Agrave Ugrave -50
+KPX Agrave Uhungarumlaut -50
+KPX Agrave Umacron -50
+KPX Agrave Uogonek -50
+KPX Agrave Uring -50
+KPX Agrave V -105
+KPX Agrave W -95
+KPX Agrave Y -55
+KPX Agrave Yacute -55
+KPX Agrave Ydieresis -55
+KPX Agrave quoteright -37
+KPX Agrave u -20
+KPX Agrave uacute -20
+KPX Agrave ucircumflex -20
+KPX Agrave udieresis -20
+KPX Agrave ugrave -20
+KPX Agrave uhungarumlaut -20
+KPX Agrave umacron -20
+KPX Agrave uogonek -20
+KPX Agrave uring -20
+KPX Agrave v -55
+KPX Agrave w -55
+KPX Agrave y -55
+KPX Agrave yacute -55
+KPX Agrave ydieresis -55
+KPX Amacron C -30
+KPX Amacron Cacute -30
+KPX Amacron Ccaron -30
+KPX Amacron Ccedilla -30
+KPX Amacron G -35
+KPX Amacron Gbreve -35
+KPX Amacron Gcommaaccent -35
+KPX Amacron O -40
+KPX Amacron Oacute -40
+KPX Amacron Ocircumflex -40
+KPX Amacron Odieresis -40
+KPX Amacron Ograve -40
+KPX Amacron Ohungarumlaut -40
+KPX Amacron Omacron -40
+KPX Amacron Oslash -40
+KPX Amacron Otilde -40
+KPX Amacron Q -40
+KPX Amacron T -37
+KPX Amacron Tcaron -37
+KPX Amacron Tcommaaccent -37
+KPX Amacron U -50
+KPX Amacron Uacute -50
+KPX Amacron Ucircumflex -50
+KPX Amacron Udieresis -50
+KPX Amacron Ugrave -50
+KPX Amacron Uhungarumlaut -50
+KPX Amacron Umacron -50
+KPX Amacron Uogonek -50
+KPX Amacron Uring -50
+KPX Amacron V -105
+KPX Amacron W -95
+KPX Amacron Y -55
+KPX Amacron Yacute -55
+KPX Amacron Ydieresis -55
+KPX Amacron quoteright -37
+KPX Amacron u -20
+KPX Amacron uacute -20
+KPX Amacron ucircumflex -20
+KPX Amacron udieresis -20
+KPX Amacron ugrave -20
+KPX Amacron uhungarumlaut -20
+KPX Amacron umacron -20
+KPX Amacron uogonek -20
+KPX Amacron uring -20
+KPX Amacron v -55
+KPX Amacron w -55
+KPX Amacron y -55
+KPX Amacron yacute -55
+KPX Amacron ydieresis -55
+KPX Aogonek C -30
+KPX Aogonek Cacute -30
+KPX Aogonek Ccaron -30
+KPX Aogonek Ccedilla -30
+KPX Aogonek G -35
+KPX Aogonek Gbreve -35
+KPX Aogonek Gcommaaccent -35
+KPX Aogonek O -40
+KPX Aogonek Oacute -40
+KPX Aogonek Ocircumflex -40
+KPX Aogonek Odieresis -40
+KPX Aogonek Ograve -40
+KPX Aogonek Ohungarumlaut -40
+KPX Aogonek Omacron -40
+KPX Aogonek Oslash -40
+KPX Aogonek Otilde -40
+KPX Aogonek Q -40
+KPX Aogonek T -37
+KPX Aogonek Tcaron -37
+KPX Aogonek Tcommaaccent -37
+KPX Aogonek U -50
+KPX Aogonek Uacute -50
+KPX Aogonek Ucircumflex -50
+KPX Aogonek Udieresis -50
+KPX Aogonek Ugrave -50
+KPX Aogonek Uhungarumlaut -50
+KPX Aogonek Umacron -50
+KPX Aogonek Uogonek -50
+KPX Aogonek Uring -50
+KPX Aogonek V -105
+KPX Aogonek W -95
+KPX Aogonek Y -55
+KPX Aogonek Yacute -55
+KPX Aogonek Ydieresis -55
+KPX Aogonek quoteright -37
+KPX Aogonek u -20
+KPX Aogonek uacute -20
+KPX Aogonek ucircumflex -20
+KPX Aogonek udieresis -20
+KPX Aogonek ugrave -20
+KPX Aogonek uhungarumlaut -20
+KPX Aogonek umacron -20
+KPX Aogonek uogonek -20
+KPX Aogonek uring -20
+KPX Aogonek v -55
+KPX Aogonek w -55
+KPX Aogonek y -55
+KPX Aogonek yacute -55
+KPX Aogonek ydieresis -55
+KPX Aring C -30
+KPX Aring Cacute -30
+KPX Aring Ccaron -30
+KPX Aring Ccedilla -30
+KPX Aring G -35
+KPX Aring Gbreve -35
+KPX Aring Gcommaaccent -35
+KPX Aring O -40
+KPX Aring Oacute -40
+KPX Aring Ocircumflex -40
+KPX Aring Odieresis -40
+KPX Aring Ograve -40
+KPX Aring Ohungarumlaut -40
+KPX Aring Omacron -40
+KPX Aring Oslash -40
+KPX Aring Otilde -40
+KPX Aring Q -40
+KPX Aring T -37
+KPX Aring Tcaron -37
+KPX Aring Tcommaaccent -37
+KPX Aring U -50
+KPX Aring Uacute -50
+KPX Aring Ucircumflex -50
+KPX Aring Udieresis -50
+KPX Aring Ugrave -50
+KPX Aring Uhungarumlaut -50
+KPX Aring Umacron -50
+KPX Aring Uogonek -50
+KPX Aring Uring -50
+KPX Aring V -105
+KPX Aring W -95
+KPX Aring Y -55
+KPX Aring Yacute -55
+KPX Aring Ydieresis -55
+KPX Aring quoteright -37
+KPX Aring u -20
+KPX Aring uacute -20
+KPX Aring ucircumflex -20
+KPX Aring udieresis -20
+KPX Aring ugrave -20
+KPX Aring uhungarumlaut -20
+KPX Aring umacron -20
+KPX Aring uogonek -20
+KPX Aring uring -20
+KPX Aring v -55
+KPX Aring w -55
+KPX Aring y -55
+KPX Aring yacute -55
+KPX Aring ydieresis -55
+KPX Atilde C -30
+KPX Atilde Cacute -30
+KPX Atilde Ccaron -30
+KPX Atilde Ccedilla -30
+KPX Atilde G -35
+KPX Atilde Gbreve -35
+KPX Atilde Gcommaaccent -35
+KPX Atilde O -40
+KPX Atilde Oacute -40
+KPX Atilde Ocircumflex -40
+KPX Atilde Odieresis -40
+KPX Atilde Ograve -40
+KPX Atilde Ohungarumlaut -40
+KPX Atilde Omacron -40
+KPX Atilde Oslash -40
+KPX Atilde Otilde -40
+KPX Atilde Q -40
+KPX Atilde T -37
+KPX Atilde Tcaron -37
+KPX Atilde Tcommaaccent -37
+KPX Atilde U -50
+KPX Atilde Uacute -50
+KPX Atilde Ucircumflex -50
+KPX Atilde Udieresis -50
+KPX Atilde Ugrave -50
+KPX Atilde Uhungarumlaut -50
+KPX Atilde Umacron -50
+KPX Atilde Uogonek -50
+KPX Atilde Uring -50
+KPX Atilde V -105
+KPX Atilde W -95
+KPX Atilde Y -55
+KPX Atilde Yacute -55
+KPX Atilde Ydieresis -55
+KPX Atilde quoteright -37
+KPX Atilde u -20
+KPX Atilde uacute -20
+KPX Atilde ucircumflex -20
+KPX Atilde udieresis -20
+KPX Atilde ugrave -20
+KPX Atilde uhungarumlaut -20
+KPX Atilde umacron -20
+KPX Atilde uogonek -20
+KPX Atilde uring -20
+KPX Atilde v -55
+KPX Atilde w -55
+KPX Atilde y -55
+KPX Atilde yacute -55
+KPX Atilde ydieresis -55
+KPX B A -25
+KPX B Aacute -25
+KPX B Abreve -25
+KPX B Acircumflex -25
+KPX B Adieresis -25
+KPX B Agrave -25
+KPX B Amacron -25
+KPX B Aogonek -25
+KPX B Aring -25
+KPX B Atilde -25
+KPX B U -10
+KPX B Uacute -10
+KPX B Ucircumflex -10
+KPX B Udieresis -10
+KPX B Ugrave -10
+KPX B Uhungarumlaut -10
+KPX B Umacron -10
+KPX B Uogonek -10
+KPX B Uring -10
+KPX D A -35
+KPX D Aacute -35
+KPX D Abreve -35
+KPX D Acircumflex -35
+KPX D Adieresis -35
+KPX D Agrave -35
+KPX D Amacron -35
+KPX D Aogonek -35
+KPX D Aring -35
+KPX D Atilde -35
+KPX D V -40
+KPX D W -40
+KPX D Y -40
+KPX D Yacute -40
+KPX D Ydieresis -40
+KPX Dcaron A -35
+KPX Dcaron Aacute -35
+KPX Dcaron Abreve -35
+KPX Dcaron Acircumflex -35
+KPX Dcaron Adieresis -35
+KPX Dcaron Agrave -35
+KPX Dcaron Amacron -35
+KPX Dcaron Aogonek -35
+KPX Dcaron Aring -35
+KPX Dcaron Atilde -35
+KPX Dcaron V -40
+KPX Dcaron W -40
+KPX Dcaron Y -40
+KPX Dcaron Yacute -40
+KPX Dcaron Ydieresis -40
+KPX Dcroat A -35
+KPX Dcroat Aacute -35
+KPX Dcroat Abreve -35
+KPX Dcroat Acircumflex -35
+KPX Dcroat Adieresis -35
+KPX Dcroat Agrave -35
+KPX Dcroat Amacron -35
+KPX Dcroat Aogonek -35
+KPX Dcroat Aring -35
+KPX Dcroat Atilde -35
+KPX Dcroat V -40
+KPX Dcroat W -40
+KPX Dcroat Y -40
+KPX Dcroat Yacute -40
+KPX Dcroat Ydieresis -40
+KPX F A -115
+KPX F Aacute -115
+KPX F Abreve -115
+KPX F Acircumflex -115
+KPX F Adieresis -115
+KPX F Agrave -115
+KPX F Amacron -115
+KPX F Aogonek -115
+KPX F Aring -115
+KPX F Atilde -115
+KPX F a -75
+KPX F aacute -75
+KPX F abreve -75
+KPX F acircumflex -75
+KPX F adieresis -75
+KPX F agrave -75
+KPX F amacron -75
+KPX F aogonek -75
+KPX F aring -75
+KPX F atilde -75
+KPX F comma -135
+KPX F e -75
+KPX F eacute -75
+KPX F ecaron -75
+KPX F ecircumflex -75
+KPX F edieresis -75
+KPX F edotaccent -75
+KPX F egrave -75
+KPX F emacron -75
+KPX F eogonek -75
+KPX F i -45
+KPX F iacute -45
+KPX F icircumflex -45
+KPX F idieresis -45
+KPX F igrave -45
+KPX F imacron -45
+KPX F iogonek -45
+KPX F o -105
+KPX F oacute -105
+KPX F ocircumflex -105
+KPX F odieresis -105
+KPX F ograve -105
+KPX F ohungarumlaut -105
+KPX F omacron -105
+KPX F oslash -105
+KPX F otilde -105
+KPX F period -135
+KPX F r -55
+KPX F racute -55
+KPX F rcaron -55
+KPX F rcommaaccent -55
+KPX J A -40
+KPX J Aacute -40
+KPX J Abreve -40
+KPX J Acircumflex -40
+KPX J Adieresis -40
+KPX J Agrave -40
+KPX J Amacron -40
+KPX J Aogonek -40
+KPX J Aring -40
+KPX J Atilde -40
+KPX J a -35
+KPX J aacute -35
+KPX J abreve -35
+KPX J acircumflex -35
+KPX J adieresis -35
+KPX J agrave -35
+KPX J amacron -35
+KPX J aogonek -35
+KPX J aring -35
+KPX J atilde -35
+KPX J comma -25
+KPX J e -25
+KPX J eacute -25
+KPX J ecaron -25
+KPX J ecircumflex -25
+KPX J edieresis -25
+KPX J edotaccent -25
+KPX J egrave -25
+KPX J emacron -25
+KPX J eogonek -25
+KPX J o -25
+KPX J oacute -25
+KPX J ocircumflex -25
+KPX J odieresis -25
+KPX J ograve -25
+KPX J ohungarumlaut -25
+KPX J omacron -25
+KPX J oslash -25
+KPX J otilde -25
+KPX J period -25
+KPX J u -35
+KPX J uacute -35
+KPX J ucircumflex -35
+KPX J udieresis -35
+KPX J ugrave -35
+KPX J uhungarumlaut -35
+KPX J umacron -35
+KPX J uogonek -35
+KPX J uring -35
+KPX K O -50
+KPX K Oacute -50
+KPX K Ocircumflex -50
+KPX K Odieresis -50
+KPX K Ograve -50
+KPX K Ohungarumlaut -50
+KPX K Omacron -50
+KPX K Oslash -50
+KPX K Otilde -50
+KPX K e -35
+KPX K eacute -35
+KPX K ecaron -35
+KPX K ecircumflex -35
+KPX K edieresis -35
+KPX K edotaccent -35
+KPX K egrave -35
+KPX K emacron -35
+KPX K eogonek -35
+KPX K o -40
+KPX K oacute -40
+KPX K ocircumflex -40
+KPX K odieresis -40
+KPX K ograve -40
+KPX K ohungarumlaut -40
+KPX K omacron -40
+KPX K oslash -40
+KPX K otilde -40
+KPX K u -40
+KPX K uacute -40
+KPX K ucircumflex -40
+KPX K udieresis -40
+KPX K ugrave -40
+KPX K uhungarumlaut -40
+KPX K umacron -40
+KPX K uogonek -40
+KPX K uring -40
+KPX K y -40
+KPX K yacute -40
+KPX K ydieresis -40
+KPX Kcommaaccent O -50
+KPX Kcommaaccent Oacute -50
+KPX Kcommaaccent Ocircumflex -50
+KPX Kcommaaccent Odieresis -50
+KPX Kcommaaccent Ograve -50
+KPX Kcommaaccent Ohungarumlaut -50
+KPX Kcommaaccent Omacron -50
+KPX Kcommaaccent Oslash -50
+KPX Kcommaaccent Otilde -50
+KPX Kcommaaccent e -35
+KPX Kcommaaccent eacute -35
+KPX Kcommaaccent ecaron -35
+KPX Kcommaaccent ecircumflex -35
+KPX Kcommaaccent edieresis -35
+KPX Kcommaaccent edotaccent -35
+KPX Kcommaaccent egrave -35
+KPX Kcommaaccent emacron -35
+KPX Kcommaaccent eogonek -35
+KPX Kcommaaccent o -40
+KPX Kcommaaccent oacute -40
+KPX Kcommaaccent ocircumflex -40
+KPX Kcommaaccent odieresis -40
+KPX Kcommaaccent ograve -40
+KPX Kcommaaccent ohungarumlaut -40
+KPX Kcommaaccent omacron -40
+KPX Kcommaaccent oslash -40
+KPX Kcommaaccent otilde -40
+KPX Kcommaaccent u -40
+KPX Kcommaaccent uacute -40
+KPX Kcommaaccent ucircumflex -40
+KPX Kcommaaccent udieresis -40
+KPX Kcommaaccent ugrave -40
+KPX Kcommaaccent uhungarumlaut -40
+KPX Kcommaaccent umacron -40
+KPX Kcommaaccent uogonek -40
+KPX Kcommaaccent uring -40
+KPX Kcommaaccent y -40
+KPX Kcommaaccent yacute -40
+KPX Kcommaaccent ydieresis -40
+KPX L T -20
+KPX L Tcaron -20
+KPX L Tcommaaccent -20
+KPX L V -55
+KPX L W -55
+KPX L Y -20
+KPX L Yacute -20
+KPX L Ydieresis -20
+KPX L quoteright -37
+KPX L y -30
+KPX L yacute -30
+KPX L ydieresis -30
+KPX Lacute T -20
+KPX Lacute Tcaron -20
+KPX Lacute Tcommaaccent -20
+KPX Lacute V -55
+KPX Lacute W -55
+KPX Lacute Y -20
+KPX Lacute Yacute -20
+KPX Lacute Ydieresis -20
+KPX Lacute quoteright -37
+KPX Lacute y -30
+KPX Lacute yacute -30
+KPX Lacute ydieresis -30
+KPX Lcommaaccent T -20
+KPX Lcommaaccent Tcaron -20
+KPX Lcommaaccent Tcommaaccent -20
+KPX Lcommaaccent V -55
+KPX Lcommaaccent W -55
+KPX Lcommaaccent Y -20
+KPX Lcommaaccent Yacute -20
+KPX Lcommaaccent Ydieresis -20
+KPX Lcommaaccent quoteright -37
+KPX Lcommaaccent y -30
+KPX Lcommaaccent yacute -30
+KPX Lcommaaccent ydieresis -30
+KPX Lslash T -20
+KPX Lslash Tcaron -20
+KPX Lslash Tcommaaccent -20
+KPX Lslash V -55
+KPX Lslash W -55
+KPX Lslash Y -20
+KPX Lslash Yacute -20
+KPX Lslash Ydieresis -20
+KPX Lslash quoteright -37
+KPX Lslash y -30
+KPX Lslash yacute -30
+KPX Lslash ydieresis -30
+KPX N A -27
+KPX N Aacute -27
+KPX N Abreve -27
+KPX N Acircumflex -27
+KPX N Adieresis -27
+KPX N Agrave -27
+KPX N Amacron -27
+KPX N Aogonek -27
+KPX N Aring -27
+KPX N Atilde -27
+KPX Nacute A -27
+KPX Nacute Aacute -27
+KPX Nacute Abreve -27
+KPX Nacute Acircumflex -27
+KPX Nacute Adieresis -27
+KPX Nacute Agrave -27
+KPX Nacute Amacron -27
+KPX Nacute Aogonek -27
+KPX Nacute Aring -27
+KPX Nacute Atilde -27
+KPX Ncaron A -27
+KPX Ncaron Aacute -27
+KPX Ncaron Abreve -27
+KPX Ncaron Acircumflex -27
+KPX Ncaron Adieresis -27
+KPX Ncaron Agrave -27
+KPX Ncaron Amacron -27
+KPX Ncaron Aogonek -27
+KPX Ncaron Aring -27
+KPX Ncaron Atilde -27
+KPX Ncommaaccent A -27
+KPX Ncommaaccent Aacute -27
+KPX Ncommaaccent Abreve -27
+KPX Ncommaaccent Acircumflex -27
+KPX Ncommaaccent Adieresis -27
+KPX Ncommaaccent Agrave -27
+KPX Ncommaaccent Amacron -27
+KPX Ncommaaccent Aogonek -27
+KPX Ncommaaccent Aring -27
+KPX Ncommaaccent Atilde -27
+KPX Ntilde A -27
+KPX Ntilde Aacute -27
+KPX Ntilde Abreve -27
+KPX Ntilde Acircumflex -27
+KPX Ntilde Adieresis -27
+KPX Ntilde Agrave -27
+KPX Ntilde Amacron -27
+KPX Ntilde Aogonek -27
+KPX Ntilde Aring -27
+KPX Ntilde Atilde -27
+KPX O A -55
+KPX O Aacute -55
+KPX O Abreve -55
+KPX O Acircumflex -55
+KPX O Adieresis -55
+KPX O Agrave -55
+KPX O Amacron -55
+KPX O Aogonek -55
+KPX O Aring -55
+KPX O Atilde -55
+KPX O T -40
+KPX O Tcaron -40
+KPX O Tcommaaccent -40
+KPX O V -50
+KPX O W -50
+KPX O X -40
+KPX O Y -50
+KPX O Yacute -50
+KPX O Ydieresis -50
+KPX Oacute A -55
+KPX Oacute Aacute -55
+KPX Oacute Abreve -55
+KPX Oacute Acircumflex -55
+KPX Oacute Adieresis -55
+KPX Oacute Agrave -55
+KPX Oacute Amacron -55
+KPX Oacute Aogonek -55
+KPX Oacute Aring -55
+KPX Oacute Atilde -55
+KPX Oacute T -40
+KPX Oacute Tcaron -40
+KPX Oacute Tcommaaccent -40
+KPX Oacute V -50
+KPX Oacute W -50
+KPX Oacute X -40
+KPX Oacute Y -50
+KPX Oacute Yacute -50
+KPX Oacute Ydieresis -50
+KPX Ocircumflex A -55
+KPX Ocircumflex Aacute -55
+KPX Ocircumflex Abreve -55
+KPX Ocircumflex Acircumflex -55
+KPX Ocircumflex Adieresis -55
+KPX Ocircumflex Agrave -55
+KPX Ocircumflex Amacron -55
+KPX Ocircumflex Aogonek -55
+KPX Ocircumflex Aring -55
+KPX Ocircumflex Atilde -55
+KPX Ocircumflex T -40
+KPX Ocircumflex Tcaron -40
+KPX Ocircumflex Tcommaaccent -40
+KPX Ocircumflex V -50
+KPX Ocircumflex W -50
+KPX Ocircumflex X -40
+KPX Ocircumflex Y -50
+KPX Ocircumflex Yacute -50
+KPX Ocircumflex Ydieresis -50
+KPX Odieresis A -55
+KPX Odieresis Aacute -55
+KPX Odieresis Abreve -55
+KPX Odieresis Acircumflex -55
+KPX Odieresis Adieresis -55
+KPX Odieresis Agrave -55
+KPX Odieresis Amacron -55
+KPX Odieresis Aogonek -55
+KPX Odieresis Aring -55
+KPX Odieresis Atilde -55
+KPX Odieresis T -40
+KPX Odieresis Tcaron -40
+KPX Odieresis Tcommaaccent -40
+KPX Odieresis V -50
+KPX Odieresis W -50
+KPX Odieresis X -40
+KPX Odieresis Y -50
+KPX Odieresis Yacute -50
+KPX Odieresis Ydieresis -50
+KPX Ograve A -55
+KPX Ograve Aacute -55
+KPX Ograve Abreve -55
+KPX Ograve Acircumflex -55
+KPX Ograve Adieresis -55
+KPX Ograve Agrave -55
+KPX Ograve Amacron -55
+KPX Ograve Aogonek -55
+KPX Ograve Aring -55
+KPX Ograve Atilde -55
+KPX Ograve T -40
+KPX Ograve Tcaron -40
+KPX Ograve Tcommaaccent -40
+KPX Ograve V -50
+KPX Ograve W -50
+KPX Ograve X -40
+KPX Ograve Y -50
+KPX Ograve Yacute -50
+KPX Ograve Ydieresis -50
+KPX Ohungarumlaut A -55
+KPX Ohungarumlaut Aacute -55
+KPX Ohungarumlaut Abreve -55
+KPX Ohungarumlaut Acircumflex -55
+KPX Ohungarumlaut Adieresis -55
+KPX Ohungarumlaut Agrave -55
+KPX Ohungarumlaut Amacron -55
+KPX Ohungarumlaut Aogonek -55
+KPX Ohungarumlaut Aring -55
+KPX Ohungarumlaut Atilde -55
+KPX Ohungarumlaut T -40
+KPX Ohungarumlaut Tcaron -40
+KPX Ohungarumlaut Tcommaaccent -40
+KPX Ohungarumlaut V -50
+KPX Ohungarumlaut W -50
+KPX Ohungarumlaut X -40
+KPX Ohungarumlaut Y -50
+KPX Ohungarumlaut Yacute -50
+KPX Ohungarumlaut Ydieresis -50
+KPX Omacron A -55
+KPX Omacron Aacute -55
+KPX Omacron Abreve -55
+KPX Omacron Acircumflex -55
+KPX Omacron Adieresis -55
+KPX Omacron Agrave -55
+KPX Omacron Amacron -55
+KPX Omacron Aogonek -55
+KPX Omacron Aring -55
+KPX Omacron Atilde -55
+KPX Omacron T -40
+KPX Omacron Tcaron -40
+KPX Omacron Tcommaaccent -40
+KPX Omacron V -50
+KPX Omacron W -50
+KPX Omacron X -40
+KPX Omacron Y -50
+KPX Omacron Yacute -50
+KPX Omacron Ydieresis -50
+KPX Oslash A -55
+KPX Oslash Aacute -55
+KPX Oslash Abreve -55
+KPX Oslash Acircumflex -55
+KPX Oslash Adieresis -55
+KPX Oslash Agrave -55
+KPX Oslash Amacron -55
+KPX Oslash Aogonek -55
+KPX Oslash Aring -55
+KPX Oslash Atilde -55
+KPX Oslash T -40
+KPX Oslash Tcaron -40
+KPX Oslash Tcommaaccent -40
+KPX Oslash V -50
+KPX Oslash W -50
+KPX Oslash X -40
+KPX Oslash Y -50
+KPX Oslash Yacute -50
+KPX Oslash Ydieresis -50
+KPX Otilde A -55
+KPX Otilde Aacute -55
+KPX Otilde Abreve -55
+KPX Otilde Acircumflex -55
+KPX Otilde Adieresis -55
+KPX Otilde Agrave -55
+KPX Otilde Amacron -55
+KPX Otilde Aogonek -55
+KPX Otilde Aring -55
+KPX Otilde Atilde -55
+KPX Otilde T -40
+KPX Otilde Tcaron -40
+KPX Otilde Tcommaaccent -40
+KPX Otilde V -50
+KPX Otilde W -50
+KPX Otilde X -40
+KPX Otilde Y -50
+KPX Otilde Yacute -50
+KPX Otilde Ydieresis -50
+KPX P A -90
+KPX P Aacute -90
+KPX P Abreve -90
+KPX P Acircumflex -90
+KPX P Adieresis -90
+KPX P Agrave -90
+KPX P Amacron -90
+KPX P Aogonek -90
+KPX P Aring -90
+KPX P Atilde -90
+KPX P a -80
+KPX P aacute -80
+KPX P abreve -80
+KPX P acircumflex -80
+KPX P adieresis -80
+KPX P agrave -80
+KPX P amacron -80
+KPX P aogonek -80
+KPX P aring -80
+KPX P atilde -80
+KPX P comma -135
+KPX P e -80
+KPX P eacute -80
+KPX P ecaron -80
+KPX P ecircumflex -80
+KPX P edieresis -80
+KPX P edotaccent -80
+KPX P egrave -80
+KPX P emacron -80
+KPX P eogonek -80
+KPX P o -80
+KPX P oacute -80
+KPX P ocircumflex -80
+KPX P odieresis -80
+KPX P ograve -80
+KPX P ohungarumlaut -80
+KPX P omacron -80
+KPX P oslash -80
+KPX P otilde -80
+KPX P period -135
+KPX Q U -10
+KPX Q Uacute -10
+KPX Q Ucircumflex -10
+KPX Q Udieresis -10
+KPX Q Ugrave -10
+KPX Q Uhungarumlaut -10
+KPX Q Umacron -10
+KPX Q Uogonek -10
+KPX Q Uring -10
+KPX R O -40
+KPX R Oacute -40
+KPX R Ocircumflex -40
+KPX R Odieresis -40
+KPX R Ograve -40
+KPX R Ohungarumlaut -40
+KPX R Omacron -40
+KPX R Oslash -40
+KPX R Otilde -40
+KPX R U -40
+KPX R Uacute -40
+KPX R Ucircumflex -40
+KPX R Udieresis -40
+KPX R Ugrave -40
+KPX R Uhungarumlaut -40
+KPX R Umacron -40
+KPX R Uogonek -40
+KPX R Uring -40
+KPX R V -18
+KPX R W -18
+KPX R Y -18
+KPX R Yacute -18
+KPX R Ydieresis -18
+KPX Racute O -40
+KPX Racute Oacute -40
+KPX Racute Ocircumflex -40
+KPX Racute Odieresis -40
+KPX Racute Ograve -40
+KPX Racute Ohungarumlaut -40
+KPX Racute Omacron -40
+KPX Racute Oslash -40
+KPX Racute Otilde -40
+KPX Racute U -40
+KPX Racute Uacute -40
+KPX Racute Ucircumflex -40
+KPX Racute Udieresis -40
+KPX Racute Ugrave -40
+KPX Racute Uhungarumlaut -40
+KPX Racute Umacron -40
+KPX Racute Uogonek -40
+KPX Racute Uring -40
+KPX Racute V -18
+KPX Racute W -18
+KPX Racute Y -18
+KPX Racute Yacute -18
+KPX Racute Ydieresis -18
+KPX Rcaron O -40
+KPX Rcaron Oacute -40
+KPX Rcaron Ocircumflex -40
+KPX Rcaron Odieresis -40
+KPX Rcaron Ograve -40
+KPX Rcaron Ohungarumlaut -40
+KPX Rcaron Omacron -40
+KPX Rcaron Oslash -40
+KPX Rcaron Otilde -40
+KPX Rcaron U -40
+KPX Rcaron Uacute -40
+KPX Rcaron Ucircumflex -40
+KPX Rcaron Udieresis -40
+KPX Rcaron Ugrave -40
+KPX Rcaron Uhungarumlaut -40
+KPX Rcaron Umacron -40
+KPX Rcaron Uogonek -40
+KPX Rcaron Uring -40
+KPX Rcaron V -18
+KPX Rcaron W -18
+KPX Rcaron Y -18
+KPX Rcaron Yacute -18
+KPX Rcaron Ydieresis -18
+KPX Rcommaaccent O -40
+KPX Rcommaaccent Oacute -40
+KPX Rcommaaccent Ocircumflex -40
+KPX Rcommaaccent Odieresis -40
+KPX Rcommaaccent Ograve -40
+KPX Rcommaaccent Ohungarumlaut -40
+KPX Rcommaaccent Omacron -40
+KPX Rcommaaccent Oslash -40
+KPX Rcommaaccent Otilde -40
+KPX Rcommaaccent U -40
+KPX Rcommaaccent Uacute -40
+KPX Rcommaaccent Ucircumflex -40
+KPX Rcommaaccent Udieresis -40
+KPX Rcommaaccent Ugrave -40
+KPX Rcommaaccent Uhungarumlaut -40
+KPX Rcommaaccent Umacron -40
+KPX Rcommaaccent Uogonek -40
+KPX Rcommaaccent Uring -40
+KPX Rcommaaccent V -18
+KPX Rcommaaccent W -18
+KPX Rcommaaccent Y -18
+KPX Rcommaaccent Yacute -18
+KPX Rcommaaccent Ydieresis -18
+KPX T A -50
+KPX T Aacute -50
+KPX T Abreve -50
+KPX T Acircumflex -50
+KPX T Adieresis -50
+KPX T Agrave -50
+KPX T Amacron -50
+KPX T Aogonek -50
+KPX T Aring -50
+KPX T Atilde -50
+KPX T O -18
+KPX T Oacute -18
+KPX T Ocircumflex -18
+KPX T Odieresis -18
+KPX T Ograve -18
+KPX T Ohungarumlaut -18
+KPX T Omacron -18
+KPX T Oslash -18
+KPX T Otilde -18
+KPX T a -92
+KPX T aacute -92
+KPX T abreve -92
+KPX T acircumflex -92
+KPX T adieresis -92
+KPX T agrave -92
+KPX T amacron -92
+KPX T aogonek -92
+KPX T aring -92
+KPX T atilde -92
+KPX T colon -55
+KPX T comma -74
+KPX T e -92
+KPX T eacute -92
+KPX T ecaron -92
+KPX T ecircumflex -52
+KPX T edieresis -52
+KPX T edotaccent -92
+KPX T egrave -52
+KPX T emacron -52
+KPX T eogonek -92
+KPX T hyphen -74
+KPX T i -55
+KPX T iacute -55
+KPX T iogonek -55
+KPX T o -92
+KPX T oacute -92
+KPX T ocircumflex -92
+KPX T odieresis -92
+KPX T ograve -92
+KPX T ohungarumlaut -92
+KPX T omacron -92
+KPX T oslash -92
+KPX T otilde -92
+KPX T period -74
+KPX T r -55
+KPX T racute -55
+KPX T rcaron -55
+KPX T rcommaaccent -55
+KPX T semicolon -65
+KPX T u -55
+KPX T uacute -55
+KPX T ucircumflex -55
+KPX T udieresis -55
+KPX T ugrave -55
+KPX T uhungarumlaut -55
+KPX T umacron -55
+KPX T uogonek -55
+KPX T uring -55
+KPX T w -74
+KPX T y -74
+KPX T yacute -74
+KPX T ydieresis -34
+KPX Tcaron A -50
+KPX Tcaron Aacute -50
+KPX Tcaron Abreve -50
+KPX Tcaron Acircumflex -50
+KPX Tcaron Adieresis -50
+KPX Tcaron Agrave -50
+KPX Tcaron Amacron -50
+KPX Tcaron Aogonek -50
+KPX Tcaron Aring -50
+KPX Tcaron Atilde -50
+KPX Tcaron O -18
+KPX Tcaron Oacute -18
+KPX Tcaron Ocircumflex -18
+KPX Tcaron Odieresis -18
+KPX Tcaron Ograve -18
+KPX Tcaron Ohungarumlaut -18
+KPX Tcaron Omacron -18
+KPX Tcaron Oslash -18
+KPX Tcaron Otilde -18
+KPX Tcaron a -92
+KPX Tcaron aacute -92
+KPX Tcaron abreve -92
+KPX Tcaron acircumflex -92
+KPX Tcaron adieresis -92
+KPX Tcaron agrave -92
+KPX Tcaron amacron -92
+KPX Tcaron aogonek -92
+KPX Tcaron aring -92
+KPX Tcaron atilde -92
+KPX Tcaron colon -55
+KPX Tcaron comma -74
+KPX Tcaron e -92
+KPX Tcaron eacute -92
+KPX Tcaron ecaron -92
+KPX Tcaron ecircumflex -52
+KPX Tcaron edieresis -52
+KPX Tcaron edotaccent -92
+KPX Tcaron egrave -52
+KPX Tcaron emacron -52
+KPX Tcaron eogonek -92
+KPX Tcaron hyphen -74
+KPX Tcaron i -55
+KPX Tcaron iacute -55
+KPX Tcaron iogonek -55
+KPX Tcaron o -92
+KPX Tcaron oacute -92
+KPX Tcaron ocircumflex -92
+KPX Tcaron odieresis -92
+KPX Tcaron ograve -92
+KPX Tcaron ohungarumlaut -92
+KPX Tcaron omacron -92
+KPX Tcaron oslash -92
+KPX Tcaron otilde -92
+KPX Tcaron period -74
+KPX Tcaron r -55
+KPX Tcaron racute -55
+KPX Tcaron rcaron -55
+KPX Tcaron rcommaaccent -55
+KPX Tcaron semicolon -65
+KPX Tcaron u -55
+KPX Tcaron uacute -55
+KPX Tcaron ucircumflex -55
+KPX Tcaron udieresis -55
+KPX Tcaron ugrave -55
+KPX Tcaron uhungarumlaut -55
+KPX Tcaron umacron -55
+KPX Tcaron uogonek -55
+KPX Tcaron uring -55
+KPX Tcaron w -74
+KPX Tcaron y -74
+KPX Tcaron yacute -74
+KPX Tcaron ydieresis -34
+KPX Tcommaaccent A -50
+KPX Tcommaaccent Aacute -50
+KPX Tcommaaccent Abreve -50
+KPX Tcommaaccent Acircumflex -50
+KPX Tcommaaccent Adieresis -50
+KPX Tcommaaccent Agrave -50
+KPX Tcommaaccent Amacron -50
+KPX Tcommaaccent Aogonek -50
+KPX Tcommaaccent Aring -50
+KPX Tcommaaccent Atilde -50
+KPX Tcommaaccent O -18
+KPX Tcommaaccent Oacute -18
+KPX Tcommaaccent Ocircumflex -18
+KPX Tcommaaccent Odieresis -18
+KPX Tcommaaccent Ograve -18
+KPX Tcommaaccent Ohungarumlaut -18
+KPX Tcommaaccent Omacron -18
+KPX Tcommaaccent Oslash -18
+KPX Tcommaaccent Otilde -18
+KPX Tcommaaccent a -92
+KPX Tcommaaccent aacute -92
+KPX Tcommaaccent abreve -92
+KPX Tcommaaccent acircumflex -92
+KPX Tcommaaccent adieresis -92
+KPX Tcommaaccent agrave -92
+KPX Tcommaaccent amacron -92
+KPX Tcommaaccent aogonek -92
+KPX Tcommaaccent aring -92
+KPX Tcommaaccent atilde -92
+KPX Tcommaaccent colon -55
+KPX Tcommaaccent comma -74
+KPX Tcommaaccent e -92
+KPX Tcommaaccent eacute -92
+KPX Tcommaaccent ecaron -92
+KPX Tcommaaccent ecircumflex -52
+KPX Tcommaaccent edieresis -52
+KPX Tcommaaccent edotaccent -92
+KPX Tcommaaccent egrave -52
+KPX Tcommaaccent emacron -52
+KPX Tcommaaccent eogonek -92
+KPX Tcommaaccent hyphen -74
+KPX Tcommaaccent i -55
+KPX Tcommaaccent iacute -55
+KPX Tcommaaccent iogonek -55
+KPX Tcommaaccent o -92
+KPX Tcommaaccent oacute -92
+KPX Tcommaaccent ocircumflex -92
+KPX Tcommaaccent odieresis -92
+KPX Tcommaaccent ograve -92
+KPX Tcommaaccent ohungarumlaut -92
+KPX Tcommaaccent omacron -92
+KPX Tcommaaccent oslash -92
+KPX Tcommaaccent otilde -92
+KPX Tcommaaccent period -74
+KPX Tcommaaccent r -55
+KPX Tcommaaccent racute -55
+KPX Tcommaaccent rcaron -55
+KPX Tcommaaccent rcommaaccent -55
+KPX Tcommaaccent semicolon -65
+KPX Tcommaaccent u -55
+KPX Tcommaaccent uacute -55
+KPX Tcommaaccent ucircumflex -55
+KPX Tcommaaccent udieresis -55
+KPX Tcommaaccent ugrave -55
+KPX Tcommaaccent uhungarumlaut -55
+KPX Tcommaaccent umacron -55
+KPX Tcommaaccent uogonek -55
+KPX Tcommaaccent uring -55
+KPX Tcommaaccent w -74
+KPX Tcommaaccent y -74
+KPX Tcommaaccent yacute -74
+KPX Tcommaaccent ydieresis -34
+KPX U A -40
+KPX U Aacute -40
+KPX U Abreve -40
+KPX U Acircumflex -40
+KPX U Adieresis -40
+KPX U Agrave -40
+KPX U Amacron -40
+KPX U Aogonek -40
+KPX U Aring -40
+KPX U Atilde -40
+KPX U comma -25
+KPX U period -25
+KPX Uacute A -40
+KPX Uacute Aacute -40
+KPX Uacute Abreve -40
+KPX Uacute Acircumflex -40
+KPX Uacute Adieresis -40
+KPX Uacute Agrave -40
+KPX Uacute Amacron -40
+KPX Uacute Aogonek -40
+KPX Uacute Aring -40
+KPX Uacute Atilde -40
+KPX Uacute comma -25
+KPX Uacute period -25
+KPX Ucircumflex A -40
+KPX Ucircumflex Aacute -40
+KPX Ucircumflex Abreve -40
+KPX Ucircumflex Acircumflex -40
+KPX Ucircumflex Adieresis -40
+KPX Ucircumflex Agrave -40
+KPX Ucircumflex Amacron -40
+KPX Ucircumflex Aogonek -40
+KPX Ucircumflex Aring -40
+KPX Ucircumflex Atilde -40
+KPX Ucircumflex comma -25
+KPX Ucircumflex period -25
+KPX Udieresis A -40
+KPX Udieresis Aacute -40
+KPX Udieresis Abreve -40
+KPX Udieresis Acircumflex -40
+KPX Udieresis Adieresis -40
+KPX Udieresis Agrave -40
+KPX Udieresis Amacron -40
+KPX Udieresis Aogonek -40
+KPX Udieresis Aring -40
+KPX Udieresis Atilde -40
+KPX Udieresis comma -25
+KPX Udieresis period -25
+KPX Ugrave A -40
+KPX Ugrave Aacute -40
+KPX Ugrave Abreve -40
+KPX Ugrave Acircumflex -40
+KPX Ugrave Adieresis -40
+KPX Ugrave Agrave -40
+KPX Ugrave Amacron -40
+KPX Ugrave Aogonek -40
+KPX Ugrave Aring -40
+KPX Ugrave Atilde -40
+KPX Ugrave comma -25
+KPX Ugrave period -25
+KPX Uhungarumlaut A -40
+KPX Uhungarumlaut Aacute -40
+KPX Uhungarumlaut Abreve -40
+KPX Uhungarumlaut Acircumflex -40
+KPX Uhungarumlaut Adieresis -40
+KPX Uhungarumlaut Agrave -40
+KPX Uhungarumlaut Amacron -40
+KPX Uhungarumlaut Aogonek -40
+KPX Uhungarumlaut Aring -40
+KPX Uhungarumlaut Atilde -40
+KPX Uhungarumlaut comma -25
+KPX Uhungarumlaut period -25
+KPX Umacron A -40
+KPX Umacron Aacute -40
+KPX Umacron Abreve -40
+KPX Umacron Acircumflex -40
+KPX Umacron Adieresis -40
+KPX Umacron Agrave -40
+KPX Umacron Amacron -40
+KPX Umacron Aogonek -40
+KPX Umacron Aring -40
+KPX Umacron Atilde -40
+KPX Umacron comma -25
+KPX Umacron period -25
+KPX Uogonek A -40
+KPX Uogonek Aacute -40
+KPX Uogonek Abreve -40
+KPX Uogonek Acircumflex -40
+KPX Uogonek Adieresis -40
+KPX Uogonek Agrave -40
+KPX Uogonek Amacron -40
+KPX Uogonek Aogonek -40
+KPX Uogonek Aring -40
+KPX Uogonek Atilde -40
+KPX Uogonek comma -25
+KPX Uogonek period -25
+KPX Uring A -40
+KPX Uring Aacute -40
+KPX Uring Abreve -40
+KPX Uring Acircumflex -40
+KPX Uring Adieresis -40
+KPX Uring Agrave -40
+KPX Uring Amacron -40
+KPX Uring Aogonek -40
+KPX Uring Aring -40
+KPX Uring Atilde -40
+KPX Uring comma -25
+KPX Uring period -25
+KPX V A -60
+KPX V Aacute -60
+KPX V Abreve -60
+KPX V Acircumflex -60
+KPX V Adieresis -60
+KPX V Agrave -60
+KPX V Amacron -60
+KPX V Aogonek -60
+KPX V Aring -60
+KPX V Atilde -60
+KPX V O -30
+KPX V Oacute -30
+KPX V Ocircumflex -30
+KPX V Odieresis -30
+KPX V Ograve -30
+KPX V Ohungarumlaut -30
+KPX V Omacron -30
+KPX V Oslash -30
+KPX V Otilde -30
+KPX V a -111
+KPX V aacute -111
+KPX V abreve -111
+KPX V acircumflex -111
+KPX V adieresis -111
+KPX V agrave -111
+KPX V amacron -111
+KPX V aogonek -111
+KPX V aring -111
+KPX V atilde -111
+KPX V colon -65
+KPX V comma -129
+KPX V e -111
+KPX V eacute -111
+KPX V ecaron -111
+KPX V ecircumflex -111
+KPX V edieresis -71
+KPX V edotaccent -111
+KPX V egrave -71
+KPX V emacron -71
+KPX V eogonek -111
+KPX V hyphen -55
+KPX V i -74
+KPX V iacute -74
+KPX V icircumflex -34
+KPX V idieresis -34
+KPX V igrave -34
+KPX V imacron -34
+KPX V iogonek -74
+KPX V o -111
+KPX V oacute -111
+KPX V ocircumflex -111
+KPX V odieresis -111
+KPX V ograve -111
+KPX V ohungarumlaut -111
+KPX V omacron -111
+KPX V oslash -111
+KPX V otilde -111
+KPX V period -129
+KPX V semicolon -74
+KPX V u -74
+KPX V uacute -74
+KPX V ucircumflex -74
+KPX V udieresis -74
+KPX V ugrave -74
+KPX V uhungarumlaut -74
+KPX V umacron -74
+KPX V uogonek -74
+KPX V uring -74
+KPX W A -60
+KPX W Aacute -60
+KPX W Abreve -60
+KPX W Acircumflex -60
+KPX W Adieresis -60
+KPX W Agrave -60
+KPX W Amacron -60
+KPX W Aogonek -60
+KPX W Aring -60
+KPX W Atilde -60
+KPX W O -25
+KPX W Oacute -25
+KPX W Ocircumflex -25
+KPX W Odieresis -25
+KPX W Ograve -25
+KPX W Ohungarumlaut -25
+KPX W Omacron -25
+KPX W Oslash -25
+KPX W Otilde -25
+KPX W a -92
+KPX W aacute -92
+KPX W abreve -92
+KPX W acircumflex -92
+KPX W adieresis -92
+KPX W agrave -92
+KPX W amacron -92
+KPX W aogonek -92
+KPX W aring -92
+KPX W atilde -92
+KPX W colon -65
+KPX W comma -92
+KPX W e -92
+KPX W eacute -92
+KPX W ecaron -92
+KPX W ecircumflex -92
+KPX W edieresis -52
+KPX W edotaccent -92
+KPX W egrave -52
+KPX W emacron -52
+KPX W eogonek -92
+KPX W hyphen -37
+KPX W i -55
+KPX W iacute -55
+KPX W iogonek -55
+KPX W o -92
+KPX W oacute -92
+KPX W ocircumflex -92
+KPX W odieresis -92
+KPX W ograve -92
+KPX W ohungarumlaut -92
+KPX W omacron -92
+KPX W oslash -92
+KPX W otilde -92
+KPX W period -92
+KPX W semicolon -65
+KPX W u -55
+KPX W uacute -55
+KPX W ucircumflex -55
+KPX W udieresis -55
+KPX W ugrave -55
+KPX W uhungarumlaut -55
+KPX W umacron -55
+KPX W uogonek -55
+KPX W uring -55
+KPX W y -70
+KPX W yacute -70
+KPX W ydieresis -70
+KPX Y A -50
+KPX Y Aacute -50
+KPX Y Abreve -50
+KPX Y Acircumflex -50
+KPX Y Adieresis -50
+KPX Y Agrave -50
+KPX Y Amacron -50
+KPX Y Aogonek -50
+KPX Y Aring -50
+KPX Y Atilde -50
+KPX Y O -15
+KPX Y Oacute -15
+KPX Y Ocircumflex -15
+KPX Y Odieresis -15
+KPX Y Ograve -15
+KPX Y Ohungarumlaut -15
+KPX Y Omacron -15
+KPX Y Oslash -15
+KPX Y Otilde -15
+KPX Y a -92
+KPX Y aacute -92
+KPX Y abreve -92
+KPX Y acircumflex -92
+KPX Y adieresis -92
+KPX Y agrave -92
+KPX Y amacron -92
+KPX Y aogonek -92
+KPX Y aring -92
+KPX Y atilde -92
+KPX Y colon -65
+KPX Y comma -92
+KPX Y e -92
+KPX Y eacute -92
+KPX Y ecaron -92
+KPX Y ecircumflex -92
+KPX Y edieresis -52
+KPX Y edotaccent -92
+KPX Y egrave -52
+KPX Y emacron -52
+KPX Y eogonek -92
+KPX Y hyphen -74
+KPX Y i -74
+KPX Y iacute -74
+KPX Y icircumflex -34
+KPX Y idieresis -34
+KPX Y igrave -34
+KPX Y imacron -34
+KPX Y iogonek -74
+KPX Y o -92
+KPX Y oacute -92
+KPX Y ocircumflex -92
+KPX Y odieresis -92
+KPX Y ograve -92
+KPX Y ohungarumlaut -92
+KPX Y omacron -92
+KPX Y oslash -92
+KPX Y otilde -92
+KPX Y period -92
+KPX Y semicolon -65
+KPX Y u -92
+KPX Y uacute -92
+KPX Y ucircumflex -92
+KPX Y udieresis -92
+KPX Y ugrave -92
+KPX Y uhungarumlaut -92
+KPX Y umacron -92
+KPX Y uogonek -92
+KPX Y uring -92
+KPX Yacute A -50
+KPX Yacute Aacute -50
+KPX Yacute Abreve -50
+KPX Yacute Acircumflex -50
+KPX Yacute Adieresis -50
+KPX Yacute Agrave -50
+KPX Yacute Amacron -50
+KPX Yacute Aogonek -50
+KPX Yacute Aring -50
+KPX Yacute Atilde -50
+KPX Yacute O -15
+KPX Yacute Oacute -15
+KPX Yacute Ocircumflex -15
+KPX Yacute Odieresis -15
+KPX Yacute Ograve -15
+KPX Yacute Ohungarumlaut -15
+KPX Yacute Omacron -15
+KPX Yacute Oslash -15
+KPX Yacute Otilde -15
+KPX Yacute a -92
+KPX Yacute aacute -92
+KPX Yacute abreve -92
+KPX Yacute acircumflex -92
+KPX Yacute adieresis -92
+KPX Yacute agrave -92
+KPX Yacute amacron -92
+KPX Yacute aogonek -92
+KPX Yacute aring -92
+KPX Yacute atilde -92
+KPX Yacute colon -65
+KPX Yacute comma -92
+KPX Yacute e -92
+KPX Yacute eacute -92
+KPX Yacute ecaron -92
+KPX Yacute ecircumflex -92
+KPX Yacute edieresis -52
+KPX Yacute edotaccent -92
+KPX Yacute egrave -52
+KPX Yacute emacron -52
+KPX Yacute eogonek -92
+KPX Yacute hyphen -74
+KPX Yacute i -74
+KPX Yacute iacute -74
+KPX Yacute icircumflex -34
+KPX Yacute idieresis -34
+KPX Yacute igrave -34
+KPX Yacute imacron -34
+KPX Yacute iogonek -74
+KPX Yacute o -92
+KPX Yacute oacute -92
+KPX Yacute ocircumflex -92
+KPX Yacute odieresis -92
+KPX Yacute ograve -92
+KPX Yacute ohungarumlaut -92
+KPX Yacute omacron -92
+KPX Yacute oslash -92
+KPX Yacute otilde -92
+KPX Yacute period -92
+KPX Yacute semicolon -65
+KPX Yacute u -92
+KPX Yacute uacute -92
+KPX Yacute ucircumflex -92
+KPX Yacute udieresis -92
+KPX Yacute ugrave -92
+KPX Yacute uhungarumlaut -92
+KPX Yacute umacron -92
+KPX Yacute uogonek -92
+KPX Yacute uring -92
+KPX Ydieresis A -50
+KPX Ydieresis Aacute -50
+KPX Ydieresis Abreve -50
+KPX Ydieresis Acircumflex -50
+KPX Ydieresis Adieresis -50
+KPX Ydieresis Agrave -50
+KPX Ydieresis Amacron -50
+KPX Ydieresis Aogonek -50
+KPX Ydieresis Aring -50
+KPX Ydieresis Atilde -50
+KPX Ydieresis O -15
+KPX Ydieresis Oacute -15
+KPX Ydieresis Ocircumflex -15
+KPX Ydieresis Odieresis -15
+KPX Ydieresis Ograve -15
+KPX Ydieresis Ohungarumlaut -15
+KPX Ydieresis Omacron -15
+KPX Ydieresis Oslash -15
+KPX Ydieresis Otilde -15
+KPX Ydieresis a -92
+KPX Ydieresis aacute -92
+KPX Ydieresis abreve -92
+KPX Ydieresis acircumflex -92
+KPX Ydieresis adieresis -92
+KPX Ydieresis agrave -92
+KPX Ydieresis amacron -92
+KPX Ydieresis aogonek -92
+KPX Ydieresis aring -92
+KPX Ydieresis atilde -92
+KPX Ydieresis colon -65
+KPX Ydieresis comma -92
+KPX Ydieresis e -92
+KPX Ydieresis eacute -92
+KPX Ydieresis ecaron -92
+KPX Ydieresis ecircumflex -92
+KPX Ydieresis edieresis -52
+KPX Ydieresis edotaccent -92
+KPX Ydieresis egrave -52
+KPX Ydieresis emacron -52
+KPX Ydieresis eogonek -92
+KPX Ydieresis hyphen -74
+KPX Ydieresis i -74
+KPX Ydieresis iacute -74
+KPX Ydieresis icircumflex -34
+KPX Ydieresis idieresis -34
+KPX Ydieresis igrave -34
+KPX Ydieresis imacron -34
+KPX Ydieresis iogonek -74
+KPX Ydieresis o -92
+KPX Ydieresis oacute -92
+KPX Ydieresis ocircumflex -92
+KPX Ydieresis odieresis -92
+KPX Ydieresis ograve -92
+KPX Ydieresis ohungarumlaut -92
+KPX Ydieresis omacron -92
+KPX Ydieresis oslash -92
+KPX Ydieresis otilde -92
+KPX Ydieresis period -92
+KPX Ydieresis semicolon -65
+KPX Ydieresis u -92
+KPX Ydieresis uacute -92
+KPX Ydieresis ucircumflex -92
+KPX Ydieresis udieresis -92
+KPX Ydieresis ugrave -92
+KPX Ydieresis uhungarumlaut -92
+KPX Ydieresis umacron -92
+KPX Ydieresis uogonek -92
+KPX Ydieresis uring -92
+KPX a g -10
+KPX a gbreve -10
+KPX a gcommaaccent -10
+KPX aacute g -10
+KPX aacute gbreve -10
+KPX aacute gcommaaccent -10
+KPX abreve g -10
+KPX abreve gbreve -10
+KPX abreve gcommaaccent -10
+KPX acircumflex g -10
+KPX acircumflex gbreve -10
+KPX acircumflex gcommaaccent -10
+KPX adieresis g -10
+KPX adieresis gbreve -10
+KPX adieresis gcommaaccent -10
+KPX agrave g -10
+KPX agrave gbreve -10
+KPX agrave gcommaaccent -10
+KPX amacron g -10
+KPX amacron gbreve -10
+KPX amacron gcommaaccent -10
+KPX aogonek g -10
+KPX aogonek gbreve -10
+KPX aogonek gcommaaccent -10
+KPX aring g -10
+KPX aring gbreve -10
+KPX aring gcommaaccent -10
+KPX atilde g -10
+KPX atilde gbreve -10
+KPX atilde gcommaaccent -10
+KPX b period -40
+KPX b u -20
+KPX b uacute -20
+KPX b ucircumflex -20
+KPX b udieresis -20
+KPX b ugrave -20
+KPX b uhungarumlaut -20
+KPX b umacron -20
+KPX b uogonek -20
+KPX b uring -20
+KPX c h -15
+KPX c k -20
+KPX c kcommaaccent -20
+KPX cacute h -15
+KPX cacute k -20
+KPX cacute kcommaaccent -20
+KPX ccaron h -15
+KPX ccaron k -20
+KPX ccaron kcommaaccent -20
+KPX ccedilla h -15
+KPX ccedilla k -20
+KPX ccedilla kcommaaccent -20
+KPX comma quotedblright -140
+KPX comma quoteright -140
+KPX e comma -10
+KPX e g -40
+KPX e gbreve -40
+KPX e gcommaaccent -40
+KPX e period -15
+KPX e v -15
+KPX e w -15
+KPX e x -20
+KPX e y -30
+KPX e yacute -30
+KPX e ydieresis -30
+KPX eacute comma -10
+KPX eacute g -40
+KPX eacute gbreve -40
+KPX eacute gcommaaccent -40
+KPX eacute period -15
+KPX eacute v -15
+KPX eacute w -15
+KPX eacute x -20
+KPX eacute y -30
+KPX eacute yacute -30
+KPX eacute ydieresis -30
+KPX ecaron comma -10
+KPX ecaron g -40
+KPX ecaron gbreve -40
+KPX ecaron gcommaaccent -40
+KPX ecaron period -15
+KPX ecaron v -15
+KPX ecaron w -15
+KPX ecaron x -20
+KPX ecaron y -30
+KPX ecaron yacute -30
+KPX ecaron ydieresis -30
+KPX ecircumflex comma -10
+KPX ecircumflex g -40
+KPX ecircumflex gbreve -40
+KPX ecircumflex gcommaaccent -40
+KPX ecircumflex period -15
+KPX ecircumflex v -15
+KPX ecircumflex w -15
+KPX ecircumflex x -20
+KPX ecircumflex y -30
+KPX ecircumflex yacute -30
+KPX ecircumflex ydieresis -30
+KPX edieresis comma -10
+KPX edieresis g -40
+KPX edieresis gbreve -40
+KPX edieresis gcommaaccent -40
+KPX edieresis period -15
+KPX edieresis v -15
+KPX edieresis w -15
+KPX edieresis x -20
+KPX edieresis y -30
+KPX edieresis yacute -30
+KPX edieresis ydieresis -30
+KPX edotaccent comma -10
+KPX edotaccent g -40
+KPX edotaccent gbreve -40
+KPX edotaccent gcommaaccent -40
+KPX edotaccent period -15
+KPX edotaccent v -15
+KPX edotaccent w -15
+KPX edotaccent x -20
+KPX edotaccent y -30
+KPX edotaccent yacute -30
+KPX edotaccent ydieresis -30
+KPX egrave comma -10
+KPX egrave g -40
+KPX egrave gbreve -40
+KPX egrave gcommaaccent -40
+KPX egrave period -15
+KPX egrave v -15
+KPX egrave w -15
+KPX egrave x -20
+KPX egrave y -30
+KPX egrave yacute -30
+KPX egrave ydieresis -30
+KPX emacron comma -10
+KPX emacron g -40
+KPX emacron gbreve -40
+KPX emacron gcommaaccent -40
+KPX emacron period -15
+KPX emacron v -15
+KPX emacron w -15
+KPX emacron x -20
+KPX emacron y -30
+KPX emacron yacute -30
+KPX emacron ydieresis -30
+KPX eogonek comma -10
+KPX eogonek g -40
+KPX eogonek gbreve -40
+KPX eogonek gcommaaccent -40
+KPX eogonek period -15
+KPX eogonek v -15
+KPX eogonek w -15
+KPX eogonek x -20
+KPX eogonek y -30
+KPX eogonek yacute -30
+KPX eogonek ydieresis -30
+KPX f comma -10
+KPX f dotlessi -60
+KPX f f -18
+KPX f i -20
+KPX f iogonek -20
+KPX f period -15
+KPX f quoteright 92
+KPX g comma -10
+KPX g e -10
+KPX g eacute -10
+KPX g ecaron -10
+KPX g ecircumflex -10
+KPX g edieresis -10
+KPX g edotaccent -10
+KPX g egrave -10
+KPX g emacron -10
+KPX g eogonek -10
+KPX g g -10
+KPX g gbreve -10
+KPX g gcommaaccent -10
+KPX g period -15
+KPX gbreve comma -10
+KPX gbreve e -10
+KPX gbreve eacute -10
+KPX gbreve ecaron -10
+KPX gbreve ecircumflex -10
+KPX gbreve edieresis -10
+KPX gbreve edotaccent -10
+KPX gbreve egrave -10
+KPX gbreve emacron -10
+KPX gbreve eogonek -10
+KPX gbreve g -10
+KPX gbreve gbreve -10
+KPX gbreve gcommaaccent -10
+KPX gbreve period -15
+KPX gcommaaccent comma -10
+KPX gcommaaccent e -10
+KPX gcommaaccent eacute -10
+KPX gcommaaccent ecaron -10
+KPX gcommaaccent ecircumflex -10
+KPX gcommaaccent edieresis -10
+KPX gcommaaccent edotaccent -10
+KPX gcommaaccent egrave -10
+KPX gcommaaccent emacron -10
+KPX gcommaaccent eogonek -10
+KPX gcommaaccent g -10
+KPX gcommaaccent gbreve -10
+KPX gcommaaccent gcommaaccent -10
+KPX gcommaaccent period -15
+KPX k e -10
+KPX k eacute -10
+KPX k ecaron -10
+KPX k ecircumflex -10
+KPX k edieresis -10
+KPX k edotaccent -10
+KPX k egrave -10
+KPX k emacron -10
+KPX k eogonek -10
+KPX k o -10
+KPX k oacute -10
+KPX k ocircumflex -10
+KPX k odieresis -10
+KPX k ograve -10
+KPX k ohungarumlaut -10
+KPX k omacron -10
+KPX k oslash -10
+KPX k otilde -10
+KPX k y -10
+KPX k yacute -10
+KPX k ydieresis -10
+KPX kcommaaccent e -10
+KPX kcommaaccent eacute -10
+KPX kcommaaccent ecaron -10
+KPX kcommaaccent ecircumflex -10
+KPX kcommaaccent edieresis -10
+KPX kcommaaccent edotaccent -10
+KPX kcommaaccent egrave -10
+KPX kcommaaccent emacron -10
+KPX kcommaaccent eogonek -10
+KPX kcommaaccent o -10
+KPX kcommaaccent oacute -10
+KPX kcommaaccent ocircumflex -10
+KPX kcommaaccent odieresis -10
+KPX kcommaaccent ograve -10
+KPX kcommaaccent ohungarumlaut -10
+KPX kcommaaccent omacron -10
+KPX kcommaaccent oslash -10
+KPX kcommaaccent otilde -10
+KPX kcommaaccent y -10
+KPX kcommaaccent yacute -10
+KPX kcommaaccent ydieresis -10
+KPX n v -40
+KPX nacute v -40
+KPX ncaron v -40
+KPX ncommaaccent v -40
+KPX ntilde v -40
+KPX o g -10
+KPX o gbreve -10
+KPX o gcommaaccent -10
+KPX o v -10
+KPX oacute g -10
+KPX oacute gbreve -10
+KPX oacute gcommaaccent -10
+KPX oacute v -10
+KPX ocircumflex g -10
+KPX ocircumflex gbreve -10
+KPX ocircumflex gcommaaccent -10
+KPX ocircumflex v -10
+KPX odieresis g -10
+KPX odieresis gbreve -10
+KPX odieresis gcommaaccent -10
+KPX odieresis v -10
+KPX ograve g -10
+KPX ograve gbreve -10
+KPX ograve gcommaaccent -10
+KPX ograve v -10
+KPX ohungarumlaut g -10
+KPX ohungarumlaut gbreve -10
+KPX ohungarumlaut gcommaaccent -10
+KPX ohungarumlaut v -10
+KPX omacron g -10
+KPX omacron gbreve -10
+KPX omacron gcommaaccent -10
+KPX omacron v -10
+KPX oslash g -10
+KPX oslash gbreve -10
+KPX oslash gcommaaccent -10
+KPX oslash v -10
+KPX otilde g -10
+KPX otilde gbreve -10
+KPX otilde gcommaaccent -10
+KPX otilde v -10
+KPX period quotedblright -140
+KPX period quoteright -140
+KPX quoteleft quoteleft -111
+KPX quoteright d -25
+KPX quoteright dcroat -25
+KPX quoteright quoteright -111
+KPX quoteright r -25
+KPX quoteright racute -25
+KPX quoteright rcaron -25
+KPX quoteright rcommaaccent -25
+KPX quoteright s -40
+KPX quoteright sacute -40
+KPX quoteright scaron -40
+KPX quoteright scedilla -40
+KPX quoteright scommaaccent -40
+KPX quoteright space -111
+KPX quoteright t -30
+KPX quoteright tcommaaccent -30
+KPX quoteright v -10
+KPX r a -15
+KPX r aacute -15
+KPX r abreve -15
+KPX r acircumflex -15
+KPX r adieresis -15
+KPX r agrave -15
+KPX r amacron -15
+KPX r aogonek -15
+KPX r aring -15
+KPX r atilde -15
+KPX r c -37
+KPX r cacute -37
+KPX r ccaron -37
+KPX r ccedilla -37
+KPX r comma -111
+KPX r d -37
+KPX r dcroat -37
+KPX r e -37
+KPX r eacute -37
+KPX r ecaron -37
+KPX r ecircumflex -37
+KPX r edieresis -37
+KPX r edotaccent -37
+KPX r egrave -37
+KPX r emacron -37
+KPX r eogonek -37
+KPX r g -37
+KPX r gbreve -37
+KPX r gcommaaccent -37
+KPX r hyphen -20
+KPX r o -45
+KPX r oacute -45
+KPX r ocircumflex -45
+KPX r odieresis -45
+KPX r ograve -45
+KPX r ohungarumlaut -45
+KPX r omacron -45
+KPX r oslash -45
+KPX r otilde -45
+KPX r period -111
+KPX r q -37
+KPX r s -10
+KPX r sacute -10
+KPX r scaron -10
+KPX r scedilla -10
+KPX r scommaaccent -10
+KPX racute a -15
+KPX racute aacute -15
+KPX racute abreve -15
+KPX racute acircumflex -15
+KPX racute adieresis -15
+KPX racute agrave -15
+KPX racute amacron -15
+KPX racute aogonek -15
+KPX racute aring -15
+KPX racute atilde -15
+KPX racute c -37
+KPX racute cacute -37
+KPX racute ccaron -37
+KPX racute ccedilla -37
+KPX racute comma -111
+KPX racute d -37
+KPX racute dcroat -37
+KPX racute e -37
+KPX racute eacute -37
+KPX racute ecaron -37
+KPX racute ecircumflex -37
+KPX racute edieresis -37
+KPX racute edotaccent -37
+KPX racute egrave -37
+KPX racute emacron -37
+KPX racute eogonek -37
+KPX racute g -37
+KPX racute gbreve -37
+KPX racute gcommaaccent -37
+KPX racute hyphen -20
+KPX racute o -45
+KPX racute oacute -45
+KPX racute ocircumflex -45
+KPX racute odieresis -45
+KPX racute ograve -45
+KPX racute ohungarumlaut -45
+KPX racute omacron -45
+KPX racute oslash -45
+KPX racute otilde -45
+KPX racute period -111
+KPX racute q -37
+KPX racute s -10
+KPX racute sacute -10
+KPX racute scaron -10
+KPX racute scedilla -10
+KPX racute scommaaccent -10
+KPX rcaron a -15
+KPX rcaron aacute -15
+KPX rcaron abreve -15
+KPX rcaron acircumflex -15
+KPX rcaron adieresis -15
+KPX rcaron agrave -15
+KPX rcaron amacron -15
+KPX rcaron aogonek -15
+KPX rcaron aring -15
+KPX rcaron atilde -15
+KPX rcaron c -37
+KPX rcaron cacute -37
+KPX rcaron ccaron -37
+KPX rcaron ccedilla -37
+KPX rcaron comma -111
+KPX rcaron d -37
+KPX rcaron dcroat -37
+KPX rcaron e -37
+KPX rcaron eacute -37
+KPX rcaron ecaron -37
+KPX rcaron ecircumflex -37
+KPX rcaron edieresis -37
+KPX rcaron edotaccent -37
+KPX rcaron egrave -37
+KPX rcaron emacron -37
+KPX rcaron eogonek -37
+KPX rcaron g -37
+KPX rcaron gbreve -37
+KPX rcaron gcommaaccent -37
+KPX rcaron hyphen -20
+KPX rcaron o -45
+KPX rcaron oacute -45
+KPX rcaron ocircumflex -45
+KPX rcaron odieresis -45
+KPX rcaron ograve -45
+KPX rcaron ohungarumlaut -45
+KPX rcaron omacron -45
+KPX rcaron oslash -45
+KPX rcaron otilde -45
+KPX rcaron period -111
+KPX rcaron q -37
+KPX rcaron s -10
+KPX rcaron sacute -10
+KPX rcaron scaron -10
+KPX rcaron scedilla -10
+KPX rcaron scommaaccent -10
+KPX rcommaaccent a -15
+KPX rcommaaccent aacute -15
+KPX rcommaaccent abreve -15
+KPX rcommaaccent acircumflex -15
+KPX rcommaaccent adieresis -15
+KPX rcommaaccent agrave -15
+KPX rcommaaccent amacron -15
+KPX rcommaaccent aogonek -15
+KPX rcommaaccent aring -15
+KPX rcommaaccent atilde -15
+KPX rcommaaccent c -37
+KPX rcommaaccent cacute -37
+KPX rcommaaccent ccaron -37
+KPX rcommaaccent ccedilla -37
+KPX rcommaaccent comma -111
+KPX rcommaaccent d -37
+KPX rcommaaccent dcroat -37
+KPX rcommaaccent e -37
+KPX rcommaaccent eacute -37
+KPX rcommaaccent ecaron -37
+KPX rcommaaccent ecircumflex -37
+KPX rcommaaccent edieresis -37
+KPX rcommaaccent edotaccent -37
+KPX rcommaaccent egrave -37
+KPX rcommaaccent emacron -37
+KPX rcommaaccent eogonek -37
+KPX rcommaaccent g -37
+KPX rcommaaccent gbreve -37
+KPX rcommaaccent gcommaaccent -37
+KPX rcommaaccent hyphen -20
+KPX rcommaaccent o -45
+KPX rcommaaccent oacute -45
+KPX rcommaaccent ocircumflex -45
+KPX rcommaaccent odieresis -45
+KPX rcommaaccent ograve -45
+KPX rcommaaccent ohungarumlaut -45
+KPX rcommaaccent omacron -45
+KPX rcommaaccent oslash -45
+KPX rcommaaccent otilde -45
+KPX rcommaaccent period -111
+KPX rcommaaccent q -37
+KPX rcommaaccent s -10
+KPX rcommaaccent sacute -10
+KPX rcommaaccent scaron -10
+KPX rcommaaccent scedilla -10
+KPX rcommaaccent scommaaccent -10
+KPX space A -18
+KPX space Aacute -18
+KPX space Abreve -18
+KPX space Acircumflex -18
+KPX space Adieresis -18
+KPX space Agrave -18
+KPX space Amacron -18
+KPX space Aogonek -18
+KPX space Aring -18
+KPX space Atilde -18
+KPX space T -18
+KPX space Tcaron -18
+KPX space Tcommaaccent -18
+KPX space V -35
+KPX space W -40
+KPX space Y -75
+KPX space Yacute -75
+KPX space Ydieresis -75
+KPX v comma -74
+KPX v period -74
+KPX w comma -74
+KPX w period -74
+KPX y comma -55
+KPX y period -55
+KPX yacute comma -55
+KPX yacute period -55
+KPX ydieresis comma -55
+KPX ydieresis period -55
+EndKernPairs
+EndKernData
+EndFontMetrics
diff --git a/src/main/resources/com/lowagie/text/pdf/fonts/Times-Roman.afm b/src/main/resources/com/lowagie/text/pdf/fonts/Times-Roman.afm
new file mode 100644
index 0000000..2680669
--- /dev/null
+++ b/src/main/resources/com/lowagie/text/pdf/fonts/Times-Roman.afm
@@ -0,0 +1,2419 @@
+StartFontMetrics 4.1
+Comment Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.
+Comment Creation Date: Thu May 1 12:49:17 1997
+Comment UniqueID 43068
+Comment VMusage 43909 54934
+FontName Times-Roman
+FullName Times Roman
+FamilyName Times
+Weight Roman
+ItalicAngle 0
+IsFixedPitch false
+CharacterSet ExtendedRoman
+FontBBox -168 -218 1000 898
+UnderlinePosition -100
+UnderlineThickness 50
+Version 002.000
+Notice Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.Times is a trademark of Linotype-Hell AG and/or its subsidiaries.
+EncodingScheme AdobeStandardEncoding
+CapHeight 662
+XHeight 450
+Ascender 683
+Descender -217
+StdHW 28
+StdVW 84
+StartCharMetrics 315
+C 32 ; WX 250 ; N space ; B 0 0 0 0 ;
+C 33 ; WX 333 ; N exclam ; B 130 -9 238 676 ;
+C 34 ; WX 408 ; N quotedbl ; B 77 431 331 676 ;
+C 35 ; WX 500 ; N numbersign ; B 5 0 496 662 ;
+C 36 ; WX 500 ; N dollar ; B 44 -87 457 727 ;
+C 37 ; WX 833 ; N percent ; B 61 -13 772 676 ;
+C 38 ; WX 778 ; N ampersand ; B 42 -13 750 676 ;
+C 39 ; WX 333 ; N quoteright ; B 79 433 218 676 ;
+C 40 ; WX 333 ; N parenleft ; B 48 -177 304 676 ;
+C 41 ; WX 333 ; N parenright ; B 29 -177 285 676 ;
+C 42 ; WX 500 ; N asterisk ; B 69 265 432 676 ;
+C 43 ; WX 564 ; N plus ; B 30 0 534 506 ;
+C 44 ; WX 250 ; N comma ; B 56 -141 195 102 ;
+C 45 ; WX 333 ; N hyphen ; B 39 194 285 257 ;
+C 46 ; WX 250 ; N period ; B 70 -11 181 100 ;
+C 47 ; WX 278 ; N slash ; B -9 -14 287 676 ;
+C 48 ; WX 500 ; N zero ; B 24 -14 476 676 ;
+C 49 ; WX 500 ; N one ; B 111 0 394 676 ;
+C 50 ; WX 500 ; N two ; B 30 0 475 676 ;
+C 51 ; WX 500 ; N three ; B 43 -14 431 676 ;
+C 52 ; WX 500 ; N four ; B 12 0 472 676 ;
+C 53 ; WX 500 ; N five ; B 32 -14 438 688 ;
+C 54 ; WX 500 ; N six ; B 34 -14 468 684 ;
+C 55 ; WX 500 ; N seven ; B 20 -8 449 662 ;
+C 56 ; WX 500 ; N eight ; B 56 -14 445 676 ;
+C 57 ; WX 500 ; N nine ; B 30 -22 459 676 ;
+C 58 ; WX 278 ; N colon ; B 81 -11 192 459 ;
+C 59 ; WX 278 ; N semicolon ; B 80 -141 219 459 ;
+C 60 ; WX 564 ; N less ; B 28 -8 536 514 ;
+C 61 ; WX 564 ; N equal ; B 30 120 534 386 ;
+C 62 ; WX 564 ; N greater ; B 28 -8 536 514 ;
+C 63 ; WX 444 ; N question ; B 68 -8 414 676 ;
+C 64 ; WX 921 ; N at ; B 116 -14 809 676 ;
+C 65 ; WX 722 ; N A ; B 15 0 706 674 ;
+C 66 ; WX 667 ; N B ; B 17 0 593 662 ;
+C 67 ; WX 667 ; N C ; B 28 -14 633 676 ;
+C 68 ; WX 722 ; N D ; B 16 0 685 662 ;
+C 69 ; WX 611 ; N E ; B 12 0 597 662 ;
+C 70 ; WX 556 ; N F ; B 12 0 546 662 ;
+C 71 ; WX 722 ; N G ; B 32 -14 709 676 ;
+C 72 ; WX 722 ; N H ; B 19 0 702 662 ;
+C 73 ; WX 333 ; N I ; B 18 0 315 662 ;
+C 74 ; WX 389 ; N J ; B 10 -14 370 662 ;
+C 75 ; WX 722 ; N K ; B 34 0 723 662 ;
+C 76 ; WX 611 ; N L ; B 12 0 598 662 ;
+C 77 ; WX 889 ; N M ; B 12 0 863 662 ;
+C 78 ; WX 722 ; N N ; B 12 -11 707 662 ;
+C 79 ; WX 722 ; N O ; B 34 -14 688 676 ;
+C 80 ; WX 556 ; N P ; B 16 0 542 662 ;
+C 81 ; WX 722 ; N Q ; B 34 -178 701 676 ;
+C 82 ; WX 667 ; N R ; B 17 0 659 662 ;
+C 83 ; WX 556 ; N S ; B 42 -14 491 676 ;
+C 84 ; WX 611 ; N T ; B 17 0 593 662 ;
+C 85 ; WX 722 ; N U ; B 14 -14 705 662 ;
+C 86 ; WX 722 ; N V ; B 16 -11 697 662 ;
+C 87 ; WX 944 ; N W ; B 5 -11 932 662 ;
+C 88 ; WX 722 ; N X ; B 10 0 704 662 ;
+C 89 ; WX 722 ; N Y ; B 22 0 703 662 ;
+C 90 ; WX 611 ; N Z ; B 9 0 597 662 ;
+C 91 ; WX 333 ; N bracketleft ; B 88 -156 299 662 ;
+C 92 ; WX 278 ; N backslash ; B -9 -14 287 676 ;
+C 93 ; WX 333 ; N bracketright ; B 34 -156 245 662 ;
+C 94 ; WX 469 ; N asciicircum ; B 24 297 446 662 ;
+C 95 ; WX 500 ; N underscore ; B 0 -125 500 -75 ;
+C 96 ; WX 333 ; N quoteleft ; B 115 433 254 676 ;
+C 97 ; WX 444 ; N a ; B 37 -10 442 460 ;
+C 98 ; WX 500 ; N b ; B 3 -10 468 683 ;
+C 99 ; WX 444 ; N c ; B 25 -10 412 460 ;
+C 100 ; WX 500 ; N d ; B 27 -10 491 683 ;
+C 101 ; WX 444 ; N e ; B 25 -10 424 460 ;
+C 102 ; WX 333 ; N f ; B 20 0 383 683 ; L i fi ; L l fl ;
+C 103 ; WX 500 ; N g ; B 28 -218 470 460 ;
+C 104 ; WX 500 ; N h ; B 9 0 487 683 ;
+C 105 ; WX 278 ; N i ; B 16 0 253 683 ;
+C 106 ; WX 278 ; N j ; B -70 -218 194 683 ;
+C 107 ; WX 500 ; N k ; B 7 0 505 683 ;
+C 108 ; WX 278 ; N l ; B 19 0 257 683 ;
+C 109 ; WX 778 ; N m ; B 16 0 775 460 ;
+C 110 ; WX 500 ; N n ; B 16 0 485 460 ;
+C 111 ; WX 500 ; N o ; B 29 -10 470 460 ;
+C 112 ; WX 500 ; N p ; B 5 -217 470 460 ;
+C 113 ; WX 500 ; N q ; B 24 -217 488 460 ;
+C 114 ; WX 333 ; N r ; B 5 0 335 460 ;
+C 115 ; WX 389 ; N s ; B 51 -10 348 460 ;
+C 116 ; WX 278 ; N t ; B 13 -10 279 579 ;
+C 117 ; WX 500 ; N u ; B 9 -10 479 450 ;
+C 118 ; WX 500 ; N v ; B 19 -14 477 450 ;
+C 119 ; WX 722 ; N w ; B 21 -14 694 450 ;
+C 120 ; WX 500 ; N x ; B 17 0 479 450 ;
+C 121 ; WX 500 ; N y ; B 14 -218 475 450 ;
+C 122 ; WX 444 ; N z ; B 27 0 418 450 ;
+C 123 ; WX 480 ; N braceleft ; B 100 -181 350 680 ;
+C 124 ; WX 200 ; N bar ; B 67 -218 133 782 ;
+C 125 ; WX 480 ; N braceright ; B 130 -181 380 680 ;
+C 126 ; WX 541 ; N asciitilde ; B 40 183 502 323 ;
+C 161 ; WX 333 ; N exclamdown ; B 97 -218 205 467 ;
+C 162 ; WX 500 ; N cent ; B 53 -138 448 579 ;
+C 163 ; WX 500 ; N sterling ; B 12 -8 490 676 ;
+C 164 ; WX 167 ; N fraction ; B -168 -14 331 676 ;
+C 165 ; WX 500 ; N yen ; B -53 0 512 662 ;
+C 166 ; WX 500 ; N florin ; B 7 -189 490 676 ;
+C 167 ; WX 500 ; N section ; B 70 -148 426 676 ;
+C 168 ; WX 500 ; N currency ; B -22 58 522 602 ;
+C 169 ; WX 180 ; N quotesingle ; B 48 431 133 676 ;
+C 170 ; WX 444 ; N quotedblleft ; B 43 433 414 676 ;
+C 171 ; WX 500 ; N guillemotleft ; B 42 33 456 416 ;
+C 172 ; WX 333 ; N guilsinglleft ; B 63 33 285 416 ;
+C 173 ; WX 333 ; N guilsinglright ; B 48 33 270 416 ;
+C 174 ; WX 556 ; N fi ; B 31 0 521 683 ;
+C 175 ; WX 556 ; N fl ; B 32 0 521 683 ;
+C 177 ; WX 500 ; N endash ; B 0 201 500 250 ;
+C 178 ; WX 500 ; N dagger ; B 59 -149 442 676 ;
+C 179 ; WX 500 ; N daggerdbl ; B 58 -153 442 676 ;
+C 180 ; WX 250 ; N periodcentered ; B 70 199 181 310 ;
+C 182 ; WX 453 ; N paragraph ; B -22 -154 450 662 ;
+C 183 ; WX 350 ; N bullet ; B 40 196 310 466 ;
+C 184 ; WX 333 ; N quotesinglbase ; B 79 -141 218 102 ;
+C 185 ; WX 444 ; N quotedblbase ; B 45 -141 416 102 ;
+C 186 ; WX 444 ; N quotedblright ; B 30 433 401 676 ;
+C 187 ; WX 500 ; N guillemotright ; B 44 33 458 416 ;
+C 188 ; WX 1000 ; N ellipsis ; B 111 -11 888 100 ;
+C 189 ; WX 1000 ; N perthousand ; B 7 -19 994 706 ;
+C 191 ; WX 444 ; N questiondown ; B 30 -218 376 466 ;
+C 193 ; WX 333 ; N grave ; B 19 507 242 678 ;
+C 194 ; WX 333 ; N acute ; B 93 507 317 678 ;
+C 195 ; WX 333 ; N circumflex ; B 11 507 322 674 ;
+C 196 ; WX 333 ; N tilde ; B 1 532 331 638 ;
+C 197 ; WX 333 ; N macron ; B 11 547 322 601 ;
+C 198 ; WX 333 ; N breve ; B 26 507 307 664 ;
+C 199 ; WX 333 ; N dotaccent ; B 118 581 216 681 ;
+C 200 ; WX 333 ; N dieresis ; B 18 581 315 681 ;
+C 202 ; WX 333 ; N ring ; B 67 512 266 711 ;
+C 203 ; WX 333 ; N cedilla ; B 52 -215 261 0 ;
+C 205 ; WX 333 ; N hungarumlaut ; B -3 507 377 678 ;
+C 206 ; WX 333 ; N ogonek ; B 62 -165 243 0 ;
+C 207 ; WX 333 ; N caron ; B 11 507 322 674 ;
+C 208 ; WX 1000 ; N emdash ; B 0 201 1000 250 ;
+C 225 ; WX 889 ; N AE ; B 0 0 863 662 ;
+C 227 ; WX 276 ; N ordfeminine ; B 4 394 270 676 ;
+C 232 ; WX 611 ; N Lslash ; B 12 0 598 662 ;
+C 233 ; WX 722 ; N Oslash ; B 34 -80 688 734 ;
+C 234 ; WX 889 ; N OE ; B 30 -6 885 668 ;
+C 235 ; WX 310 ; N ordmasculine ; B 6 394 304 676 ;
+C 241 ; WX 667 ; N ae ; B 38 -10 632 460 ;
+C 245 ; WX 278 ; N dotlessi ; B 16 0 253 460 ;
+C 248 ; WX 278 ; N lslash ; B 19 0 259 683 ;
+C 249 ; WX 500 ; N oslash ; B 29 -112 470 551 ;
+C 250 ; WX 722 ; N oe ; B 30 -10 690 460 ;
+C 251 ; WX 500 ; N germandbls ; B 12 -9 468 683 ;
+C -1 ; WX 333 ; N Idieresis ; B 18 0 315 835 ;
+C -1 ; WX 444 ; N eacute ; B 25 -10 424 678 ;
+C -1 ; WX 444 ; N abreve ; B 37 -10 442 664 ;
+C -1 ; WX 500 ; N uhungarumlaut ; B 9 -10 501 678 ;
+C -1 ; WX 444 ; N ecaron ; B 25 -10 424 674 ;
+C -1 ; WX 722 ; N Ydieresis ; B 22 0 703 835 ;
+C -1 ; WX 564 ; N divide ; B 30 -10 534 516 ;
+C -1 ; WX 722 ; N Yacute ; B 22 0 703 890 ;
+C -1 ; WX 722 ; N Acircumflex ; B 15 0 706 886 ;
+C -1 ; WX 444 ; N aacute ; B 37 -10 442 678 ;
+C -1 ; WX 722 ; N Ucircumflex ; B 14 -14 705 886 ;
+C -1 ; WX 500 ; N yacute ; B 14 -218 475 678 ;
+C -1 ; WX 389 ; N scommaaccent ; B 51 -218 348 460 ;
+C -1 ; WX 444 ; N ecircumflex ; B 25 -10 424 674 ;
+C -1 ; WX 722 ; N Uring ; B 14 -14 705 898 ;
+C -1 ; WX 722 ; N Udieresis ; B 14 -14 705 835 ;
+C -1 ; WX 444 ; N aogonek ; B 37 -165 469 460 ;
+C -1 ; WX 722 ; N Uacute ; B 14 -14 705 890 ;
+C -1 ; WX 500 ; N uogonek ; B 9 -155 487 450 ;
+C -1 ; WX 611 ; N Edieresis ; B 12 0 597 835 ;
+C -1 ; WX 722 ; N Dcroat ; B 16 0 685 662 ;
+C -1 ; WX 250 ; N commaaccent ; B 59 -218 184 -50 ;
+C -1 ; WX 760 ; N copyright ; B 38 -14 722 676 ;
+C -1 ; WX 611 ; N Emacron ; B 12 0 597 813 ;
+C -1 ; WX 444 ; N ccaron ; B 25 -10 412 674 ;
+C -1 ; WX 444 ; N aring ; B 37 -10 442 711 ;
+C -1 ; WX 722 ; N Ncommaaccent ; B 12 -198 707 662 ;
+C -1 ; WX 278 ; N lacute ; B 19 0 290 890 ;
+C -1 ; WX 444 ; N agrave ; B 37 -10 442 678 ;
+C -1 ; WX 611 ; N Tcommaaccent ; B 17 -218 593 662 ;
+C -1 ; WX 667 ; N Cacute ; B 28 -14 633 890 ;
+C -1 ; WX 444 ; N atilde ; B 37 -10 442 638 ;
+C -1 ; WX 611 ; N Edotaccent ; B 12 0 597 835 ;
+C -1 ; WX 389 ; N scaron ; B 39 -10 350 674 ;
+C -1 ; WX 389 ; N scedilla ; B 51 -215 348 460 ;
+C -1 ; WX 278 ; N iacute ; B 16 0 290 678 ;
+C -1 ; WX 471 ; N lozenge ; B 13 0 459 724 ;
+C -1 ; WX 667 ; N Rcaron ; B 17 0 659 886 ;
+C -1 ; WX 722 ; N Gcommaaccent ; B 32 -218 709 676 ;
+C -1 ; WX 500 ; N ucircumflex ; B 9 -10 479 674 ;
+C -1 ; WX 444 ; N acircumflex ; B 37 -10 442 674 ;
+C -1 ; WX 722 ; N Amacron ; B 15 0 706 813 ;
+C -1 ; WX 333 ; N rcaron ; B 5 0 335 674 ;
+C -1 ; WX 444 ; N ccedilla ; B 25 -215 412 460 ;
+C -1 ; WX 611 ; N Zdotaccent ; B 9 0 597 835 ;
+C -1 ; WX 556 ; N Thorn ; B 16 0 542 662 ;
+C -1 ; WX 722 ; N Omacron ; B 34 -14 688 813 ;
+C -1 ; WX 667 ; N Racute ; B 17 0 659 890 ;
+C -1 ; WX 556 ; N Sacute ; B 42 -14 491 890 ;
+C -1 ; WX 588 ; N dcaron ; B 27 -10 589 695 ;
+C -1 ; WX 722 ; N Umacron ; B 14 -14 705 813 ;
+C -1 ; WX 500 ; N uring ; B 9 -10 479 711 ;
+C -1 ; WX 300 ; N threesuperior ; B 15 262 291 676 ;
+C -1 ; WX 722 ; N Ograve ; B 34 -14 688 890 ;
+C -1 ; WX 722 ; N Agrave ; B 15 0 706 890 ;
+C -1 ; WX 722 ; N Abreve ; B 15 0 706 876 ;
+C -1 ; WX 564 ; N multiply ; B 38 8 527 497 ;
+C -1 ; WX 500 ; N uacute ; B 9 -10 479 678 ;
+C -1 ; WX 611 ; N Tcaron ; B 17 0 593 886 ;
+C -1 ; WX 476 ; N partialdiff ; B 17 -38 459 710 ;
+C -1 ; WX 500 ; N ydieresis ; B 14 -218 475 623 ;
+C -1 ; WX 722 ; N Nacute ; B 12 -11 707 890 ;
+C -1 ; WX 278 ; N icircumflex ; B -16 0 295 674 ;
+C -1 ; WX 611 ; N Ecircumflex ; B 12 0 597 886 ;
+C -1 ; WX 444 ; N adieresis ; B 37 -10 442 623 ;
+C -1 ; WX 444 ; N edieresis ; B 25 -10 424 623 ;
+C -1 ; WX 444 ; N cacute ; B 25 -10 413 678 ;
+C -1 ; WX 500 ; N nacute ; B 16 0 485 678 ;
+C -1 ; WX 500 ; N umacron ; B 9 -10 479 601 ;
+C -1 ; WX 722 ; N Ncaron ; B 12 -11 707 886 ;
+C -1 ; WX 333 ; N Iacute ; B 18 0 317 890 ;
+C -1 ; WX 564 ; N plusminus ; B 30 0 534 506 ;
+C -1 ; WX 200 ; N brokenbar ; B 67 -143 133 707 ;
+C -1 ; WX 760 ; N registered ; B 38 -14 722 676 ;
+C -1 ; WX 722 ; N Gbreve ; B 32 -14 709 876 ;
+C -1 ; WX 333 ; N Idotaccent ; B 18 0 315 835 ;
+C -1 ; WX 600 ; N summation ; B 15 -10 585 706 ;
+C -1 ; WX 611 ; N Egrave ; B 12 0 597 890 ;
+C -1 ; WX 333 ; N racute ; B 5 0 335 678 ;
+C -1 ; WX 500 ; N omacron ; B 29 -10 470 601 ;
+C -1 ; WX 611 ; N Zacute ; B 9 0 597 890 ;
+C -1 ; WX 611 ; N Zcaron ; B 9 0 597 886 ;
+C -1 ; WX 549 ; N greaterequal ; B 26 0 523 666 ;
+C -1 ; WX 722 ; N Eth ; B 16 0 685 662 ;
+C -1 ; WX 667 ; N Ccedilla ; B 28 -215 633 676 ;
+C -1 ; WX 278 ; N lcommaaccent ; B 19 -218 257 683 ;
+C -1 ; WX 326 ; N tcaron ; B 13 -10 318 722 ;
+C -1 ; WX 444 ; N eogonek ; B 25 -165 424 460 ;
+C -1 ; WX 722 ; N Uogonek ; B 14 -165 705 662 ;
+C -1 ; WX 722 ; N Aacute ; B 15 0 706 890 ;
+C -1 ; WX 722 ; N Adieresis ; B 15 0 706 835 ;
+C -1 ; WX 444 ; N egrave ; B 25 -10 424 678 ;
+C -1 ; WX 444 ; N zacute ; B 27 0 418 678 ;
+C -1 ; WX 278 ; N iogonek ; B 16 -165 265 683 ;
+C -1 ; WX 722 ; N Oacute ; B 34 -14 688 890 ;
+C -1 ; WX 500 ; N oacute ; B 29 -10 470 678 ;
+C -1 ; WX 444 ; N amacron ; B 37 -10 442 601 ;
+C -1 ; WX 389 ; N sacute ; B 51 -10 348 678 ;
+C -1 ; WX 278 ; N idieresis ; B -9 0 288 623 ;
+C -1 ; WX 722 ; N Ocircumflex ; B 34 -14 688 886 ;
+C -1 ; WX 722 ; N Ugrave ; B 14 -14 705 890 ;
+C -1 ; WX 612 ; N Delta ; B 6 0 608 688 ;
+C -1 ; WX 500 ; N thorn ; B 5 -217 470 683 ;
+C -1 ; WX 300 ; N twosuperior ; B 1 270 296 676 ;
+C -1 ; WX 722 ; N Odieresis ; B 34 -14 688 835 ;
+C -1 ; WX 500 ; N mu ; B 36 -218 512 450 ;
+C -1 ; WX 278 ; N igrave ; B -8 0 253 678 ;
+C -1 ; WX 500 ; N ohungarumlaut ; B 29 -10 491 678 ;
+C -1 ; WX 611 ; N Eogonek ; B 12 -165 597 662 ;
+C -1 ; WX 500 ; N dcroat ; B 27 -10 500 683 ;
+C -1 ; WX 750 ; N threequarters ; B 15 -14 718 676 ;
+C -1 ; WX 556 ; N Scedilla ; B 42 -215 491 676 ;
+C -1 ; WX 344 ; N lcaron ; B 19 0 347 695 ;
+C -1 ; WX 722 ; N Kcommaaccent ; B 34 -198 723 662 ;
+C -1 ; WX 611 ; N Lacute ; B 12 0 598 890 ;
+C -1 ; WX 980 ; N trademark ; B 30 256 957 662 ;
+C -1 ; WX 444 ; N edotaccent ; B 25 -10 424 623 ;
+C -1 ; WX 333 ; N Igrave ; B 18 0 315 890 ;
+C -1 ; WX 333 ; N Imacron ; B 11 0 322 813 ;
+C -1 ; WX 611 ; N Lcaron ; B 12 0 598 676 ;
+C -1 ; WX 750 ; N onehalf ; B 31 -14 746 676 ;
+C -1 ; WX 549 ; N lessequal ; B 26 0 523 666 ;
+C -1 ; WX 500 ; N ocircumflex ; B 29 -10 470 674 ;
+C -1 ; WX 500 ; N ntilde ; B 16 0 485 638 ;
+C -1 ; WX 722 ; N Uhungarumlaut ; B 14 -14 705 890 ;
+C -1 ; WX 611 ; N Eacute ; B 12 0 597 890 ;
+C -1 ; WX 444 ; N emacron ; B 25 -10 424 601 ;
+C -1 ; WX 500 ; N gbreve ; B 28 -218 470 664 ;
+C -1 ; WX 750 ; N onequarter ; B 37 -14 718 676 ;
+C -1 ; WX 556 ; N Scaron ; B 42 -14 491 886 ;
+C -1 ; WX 556 ; N Scommaaccent ; B 42 -218 491 676 ;
+C -1 ; WX 722 ; N Ohungarumlaut ; B 34 -14 688 890 ;
+C -1 ; WX 400 ; N degree ; B 57 390 343 676 ;
+C -1 ; WX 500 ; N ograve ; B 29 -10 470 678 ;
+C -1 ; WX 667 ; N Ccaron ; B 28 -14 633 886 ;
+C -1 ; WX 500 ; N ugrave ; B 9 -10 479 678 ;
+C -1 ; WX 453 ; N radical ; B 2 -60 452 768 ;
+C -1 ; WX 722 ; N Dcaron ; B 16 0 685 886 ;
+C -1 ; WX 333 ; N rcommaaccent ; B 5 -218 335 460 ;
+C -1 ; WX 722 ; N Ntilde ; B 12 -11 707 850 ;
+C -1 ; WX 500 ; N otilde ; B 29 -10 470 638 ;
+C -1 ; WX 667 ; N Rcommaaccent ; B 17 -198 659 662 ;
+C -1 ; WX 611 ; N Lcommaaccent ; B 12 -218 598 662 ;
+C -1 ; WX 722 ; N Atilde ; B 15 0 706 850 ;
+C -1 ; WX 722 ; N Aogonek ; B 15 -165 738 674 ;
+C -1 ; WX 722 ; N Aring ; B 15 0 706 898 ;
+C -1 ; WX 722 ; N Otilde ; B 34 -14 688 850 ;
+C -1 ; WX 444 ; N zdotaccent ; B 27 0 418 623 ;
+C -1 ; WX 611 ; N Ecaron ; B 12 0 597 886 ;
+C -1 ; WX 333 ; N Iogonek ; B 18 -165 315 662 ;
+C -1 ; WX 500 ; N kcommaaccent ; B 7 -218 505 683 ;
+C -1 ; WX 564 ; N minus ; B 30 220 534 286 ;
+C -1 ; WX 333 ; N Icircumflex ; B 11 0 322 886 ;
+C -1 ; WX 500 ; N ncaron ; B 16 0 485 674 ;
+C -1 ; WX 278 ; N tcommaaccent ; B 13 -218 279 579 ;
+C -1 ; WX 564 ; N logicalnot ; B 30 108 534 386 ;
+C -1 ; WX 500 ; N odieresis ; B 29 -10 470 623 ;
+C -1 ; WX 500 ; N udieresis ; B 9 -10 479 623 ;
+C -1 ; WX 549 ; N notequal ; B 12 -31 537 547 ;
+C -1 ; WX 500 ; N gcommaaccent ; B 28 -218 470 749 ;
+C -1 ; WX 500 ; N eth ; B 29 -10 471 686 ;
+C -1 ; WX 444 ; N zcaron ; B 27 0 418 674 ;
+C -1 ; WX 500 ; N ncommaaccent ; B 16 -218 485 460 ;
+C -1 ; WX 300 ; N onesuperior ; B 57 270 248 676 ;
+C -1 ; WX 278 ; N imacron ; B 6 0 271 601 ;
+C -1 ; WX 500 ; N Euro ; B 0 0 0 0 ;
+EndCharMetrics
+StartKernData
+StartKernPairs 2073
+KPX A C -40
+KPX A Cacute -40
+KPX A Ccaron -40
+KPX A Ccedilla -40
+KPX A G -40
+KPX A Gbreve -40
+KPX A Gcommaaccent -40
+KPX A O -55
+KPX A Oacute -55
+KPX A Ocircumflex -55
+KPX A Odieresis -55
+KPX A Ograve -55
+KPX A Ohungarumlaut -55
+KPX A Omacron -55
+KPX A Oslash -55
+KPX A Otilde -55
+KPX A Q -55
+KPX A T -111
+KPX A Tcaron -111
+KPX A Tcommaaccent -111
+KPX A U -55
+KPX A Uacute -55
+KPX A Ucircumflex -55
+KPX A Udieresis -55
+KPX A Ugrave -55
+KPX A Uhungarumlaut -55
+KPX A Umacron -55
+KPX A Uogonek -55
+KPX A Uring -55
+KPX A V -135
+KPX A W -90
+KPX A Y -105
+KPX A Yacute -105
+KPX A Ydieresis -105
+KPX A quoteright -111
+KPX A v -74
+KPX A w -92
+KPX A y -92
+KPX A yacute -92
+KPX A ydieresis -92
+KPX Aacute C -40
+KPX Aacute Cacute -40
+KPX Aacute Ccaron -40
+KPX Aacute Ccedilla -40
+KPX Aacute G -40
+KPX Aacute Gbreve -40
+KPX Aacute Gcommaaccent -40
+KPX Aacute O -55
+KPX Aacute Oacute -55
+KPX Aacute Ocircumflex -55
+KPX Aacute Odieresis -55
+KPX Aacute Ograve -55
+KPX Aacute Ohungarumlaut -55
+KPX Aacute Omacron -55
+KPX Aacute Oslash -55
+KPX Aacute Otilde -55
+KPX Aacute Q -55
+KPX Aacute T -111
+KPX Aacute Tcaron -111
+KPX Aacute Tcommaaccent -111
+KPX Aacute U -55
+KPX Aacute Uacute -55
+KPX Aacute Ucircumflex -55
+KPX Aacute Udieresis -55
+KPX Aacute Ugrave -55
+KPX Aacute Uhungarumlaut -55
+KPX Aacute Umacron -55
+KPX Aacute Uogonek -55
+KPX Aacute Uring -55
+KPX Aacute V -135
+KPX Aacute W -90
+KPX Aacute Y -105
+KPX Aacute Yacute -105
+KPX Aacute Ydieresis -105
+KPX Aacute quoteright -111
+KPX Aacute v -74
+KPX Aacute w -92
+KPX Aacute y -92
+KPX Aacute yacute -92
+KPX Aacute ydieresis -92
+KPX Abreve C -40
+KPX Abreve Cacute -40
+KPX Abreve Ccaron -40
+KPX Abreve Ccedilla -40
+KPX Abreve G -40
+KPX Abreve Gbreve -40
+KPX Abreve Gcommaaccent -40
+KPX Abreve O -55
+KPX Abreve Oacute -55
+KPX Abreve Ocircumflex -55
+KPX Abreve Odieresis -55
+KPX Abreve Ograve -55
+KPX Abreve Ohungarumlaut -55
+KPX Abreve Omacron -55
+KPX Abreve Oslash -55
+KPX Abreve Otilde -55
+KPX Abreve Q -55
+KPX Abreve T -111
+KPX Abreve Tcaron -111
+KPX Abreve Tcommaaccent -111
+KPX Abreve U -55
+KPX Abreve Uacute -55
+KPX Abreve Ucircumflex -55
+KPX Abreve Udieresis -55
+KPX Abreve Ugrave -55
+KPX Abreve Uhungarumlaut -55
+KPX Abreve Umacron -55
+KPX Abreve Uogonek -55
+KPX Abreve Uring -55
+KPX Abreve V -135
+KPX Abreve W -90
+KPX Abreve Y -105
+KPX Abreve Yacute -105
+KPX Abreve Ydieresis -105
+KPX Abreve quoteright -111
+KPX Abreve v -74
+KPX Abreve w -92
+KPX Abreve y -92
+KPX Abreve yacute -92
+KPX Abreve ydieresis -92
+KPX Acircumflex C -40
+KPX Acircumflex Cacute -40
+KPX Acircumflex Ccaron -40
+KPX Acircumflex Ccedilla -40
+KPX Acircumflex G -40
+KPX Acircumflex Gbreve -40
+KPX Acircumflex Gcommaaccent -40
+KPX Acircumflex O -55
+KPX Acircumflex Oacute -55
+KPX Acircumflex Ocircumflex -55
+KPX Acircumflex Odieresis -55
+KPX Acircumflex Ograve -55
+KPX Acircumflex Ohungarumlaut -55
+KPX Acircumflex Omacron -55
+KPX Acircumflex Oslash -55
+KPX Acircumflex Otilde -55
+KPX Acircumflex Q -55
+KPX Acircumflex T -111
+KPX Acircumflex Tcaron -111
+KPX Acircumflex Tcommaaccent -111
+KPX Acircumflex U -55
+KPX Acircumflex Uacute -55
+KPX Acircumflex Ucircumflex -55
+KPX Acircumflex Udieresis -55
+KPX Acircumflex Ugrave -55
+KPX Acircumflex Uhungarumlaut -55
+KPX Acircumflex Umacron -55
+KPX Acircumflex Uogonek -55
+KPX Acircumflex Uring -55
+KPX Acircumflex V -135
+KPX Acircumflex W -90
+KPX Acircumflex Y -105
+KPX Acircumflex Yacute -105
+KPX Acircumflex Ydieresis -105
+KPX Acircumflex quoteright -111
+KPX Acircumflex v -74
+KPX Acircumflex w -92
+KPX Acircumflex y -92
+KPX Acircumflex yacute -92
+KPX Acircumflex ydieresis -92
+KPX Adieresis C -40
+KPX Adieresis Cacute -40
+KPX Adieresis Ccaron -40
+KPX Adieresis Ccedilla -40
+KPX Adieresis G -40
+KPX Adieresis Gbreve -40
+KPX Adieresis Gcommaaccent -40
+KPX Adieresis O -55
+KPX Adieresis Oacute -55
+KPX Adieresis Ocircumflex -55
+KPX Adieresis Odieresis -55
+KPX Adieresis Ograve -55
+KPX Adieresis Ohungarumlaut -55
+KPX Adieresis Omacron -55
+KPX Adieresis Oslash -55
+KPX Adieresis Otilde -55
+KPX Adieresis Q -55
+KPX Adieresis T -111
+KPX Adieresis Tcaron -111
+KPX Adieresis Tcommaaccent -111
+KPX Adieresis U -55
+KPX Adieresis Uacute -55
+KPX Adieresis Ucircumflex -55
+KPX Adieresis Udieresis -55
+KPX Adieresis Ugrave -55
+KPX Adieresis Uhungarumlaut -55
+KPX Adieresis Umacron -55
+KPX Adieresis Uogonek -55
+KPX Adieresis Uring -55
+KPX Adieresis V -135
+KPX Adieresis W -90
+KPX Adieresis Y -105
+KPX Adieresis Yacute -105
+KPX Adieresis Ydieresis -105
+KPX Adieresis quoteright -111
+KPX Adieresis v -74
+KPX Adieresis w -92
+KPX Adieresis y -92
+KPX Adieresis yacute -92
+KPX Adieresis ydieresis -92
+KPX Agrave C -40
+KPX Agrave Cacute -40
+KPX Agrave Ccaron -40
+KPX Agrave Ccedilla -40
+KPX Agrave G -40
+KPX Agrave Gbreve -40
+KPX Agrave Gcommaaccent -40
+KPX Agrave O -55
+KPX Agrave Oacute -55
+KPX Agrave Ocircumflex -55
+KPX Agrave Odieresis -55
+KPX Agrave Ograve -55
+KPX Agrave Ohungarumlaut -55
+KPX Agrave Omacron -55
+KPX Agrave Oslash -55
+KPX Agrave Otilde -55
+KPX Agrave Q -55
+KPX Agrave T -111
+KPX Agrave Tcaron -111
+KPX Agrave Tcommaaccent -111
+KPX Agrave U -55
+KPX Agrave Uacute -55
+KPX Agrave Ucircumflex -55
+KPX Agrave Udieresis -55
+KPX Agrave Ugrave -55
+KPX Agrave Uhungarumlaut -55
+KPX Agrave Umacron -55
+KPX Agrave Uogonek -55
+KPX Agrave Uring -55
+KPX Agrave V -135
+KPX Agrave W -90
+KPX Agrave Y -105
+KPX Agrave Yacute -105
+KPX Agrave Ydieresis -105
+KPX Agrave quoteright -111
+KPX Agrave v -74
+KPX Agrave w -92
+KPX Agrave y -92
+KPX Agrave yacute -92
+KPX Agrave ydieresis -92
+KPX Amacron C -40
+KPX Amacron Cacute -40
+KPX Amacron Ccaron -40
+KPX Amacron Ccedilla -40
+KPX Amacron G -40
+KPX Amacron Gbreve -40
+KPX Amacron Gcommaaccent -40
+KPX Amacron O -55
+KPX Amacron Oacute -55
+KPX Amacron Ocircumflex -55
+KPX Amacron Odieresis -55
+KPX Amacron Ograve -55
+KPX Amacron Ohungarumlaut -55
+KPX Amacron Omacron -55
+KPX Amacron Oslash -55
+KPX Amacron Otilde -55
+KPX Amacron Q -55
+KPX Amacron T -111
+KPX Amacron Tcaron -111
+KPX Amacron Tcommaaccent -111
+KPX Amacron U -55
+KPX Amacron Uacute -55
+KPX Amacron Ucircumflex -55
+KPX Amacron Udieresis -55
+KPX Amacron Ugrave -55
+KPX Amacron Uhungarumlaut -55
+KPX Amacron Umacron -55
+KPX Amacron Uogonek -55
+KPX Amacron Uring -55
+KPX Amacron V -135
+KPX Amacron W -90
+KPX Amacron Y -105
+KPX Amacron Yacute -105
+KPX Amacron Ydieresis -105
+KPX Amacron quoteright -111
+KPX Amacron v -74
+KPX Amacron w -92
+KPX Amacron y -92
+KPX Amacron yacute -92
+KPX Amacron ydieresis -92
+KPX Aogonek C -40
+KPX Aogonek Cacute -40
+KPX Aogonek Ccaron -40
+KPX Aogonek Ccedilla -40
+KPX Aogonek G -40
+KPX Aogonek Gbreve -40
+KPX Aogonek Gcommaaccent -40
+KPX Aogonek O -55
+KPX Aogonek Oacute -55
+KPX Aogonek Ocircumflex -55
+KPX Aogonek Odieresis -55
+KPX Aogonek Ograve -55
+KPX Aogonek Ohungarumlaut -55
+KPX Aogonek Omacron -55
+KPX Aogonek Oslash -55
+KPX Aogonek Otilde -55
+KPX Aogonek Q -55
+KPX Aogonek T -111
+KPX Aogonek Tcaron -111
+KPX Aogonek Tcommaaccent -111
+KPX Aogonek U -55
+KPX Aogonek Uacute -55
+KPX Aogonek Ucircumflex -55
+KPX Aogonek Udieresis -55
+KPX Aogonek Ugrave -55
+KPX Aogonek Uhungarumlaut -55
+KPX Aogonek Umacron -55
+KPX Aogonek Uogonek -55
+KPX Aogonek Uring -55
+KPX Aogonek V -135
+KPX Aogonek W -90
+KPX Aogonek Y -105
+KPX Aogonek Yacute -105
+KPX Aogonek Ydieresis -105
+KPX Aogonek quoteright -111
+KPX Aogonek v -74
+KPX Aogonek w -52
+KPX Aogonek y -52
+KPX Aogonek yacute -52
+KPX Aogonek ydieresis -52
+KPX Aring C -40
+KPX Aring Cacute -40
+KPX Aring Ccaron -40
+KPX Aring Ccedilla -40
+KPX Aring G -40
+KPX Aring Gbreve -40
+KPX Aring Gcommaaccent -40
+KPX Aring O -55
+KPX Aring Oacute -55
+KPX Aring Ocircumflex -55
+KPX Aring Odieresis -55
+KPX Aring Ograve -55
+KPX Aring Ohungarumlaut -55
+KPX Aring Omacron -55
+KPX Aring Oslash -55
+KPX Aring Otilde -55
+KPX Aring Q -55
+KPX Aring T -111
+KPX Aring Tcaron -111
+KPX Aring Tcommaaccent -111
+KPX Aring U -55
+KPX Aring Uacute -55
+KPX Aring Ucircumflex -55
+KPX Aring Udieresis -55
+KPX Aring Ugrave -55
+KPX Aring Uhungarumlaut -55
+KPX Aring Umacron -55
+KPX Aring Uogonek -55
+KPX Aring Uring -55
+KPX Aring V -135
+KPX Aring W -90
+KPX Aring Y -105
+KPX Aring Yacute -105
+KPX Aring Ydieresis -105
+KPX Aring quoteright -111
+KPX Aring v -74
+KPX Aring w -92
+KPX Aring y -92
+KPX Aring yacute -92
+KPX Aring ydieresis -92
+KPX Atilde C -40
+KPX Atilde Cacute -40
+KPX Atilde Ccaron -40
+KPX Atilde Ccedilla -40
+KPX Atilde G -40
+KPX Atilde Gbreve -40
+KPX Atilde Gcommaaccent -40
+KPX Atilde O -55
+KPX Atilde Oacute -55
+KPX Atilde Ocircumflex -55
+KPX Atilde Odieresis -55
+KPX Atilde Ograve -55
+KPX Atilde Ohungarumlaut -55
+KPX Atilde Omacron -55
+KPX Atilde Oslash -55
+KPX Atilde Otilde -55
+KPX Atilde Q -55
+KPX Atilde T -111
+KPX Atilde Tcaron -111
+KPX Atilde Tcommaaccent -111
+KPX Atilde U -55
+KPX Atilde Uacute -55
+KPX Atilde Ucircumflex -55
+KPX Atilde Udieresis -55
+KPX Atilde Ugrave -55
+KPX Atilde Uhungarumlaut -55
+KPX Atilde Umacron -55
+KPX Atilde Uogonek -55
+KPX Atilde Uring -55
+KPX Atilde V -135
+KPX Atilde W -90
+KPX Atilde Y -105
+KPX Atilde Yacute -105
+KPX Atilde Ydieresis -105
+KPX Atilde quoteright -111
+KPX Atilde v -74
+KPX Atilde w -92
+KPX Atilde y -92
+KPX Atilde yacute -92
+KPX Atilde ydieresis -92
+KPX B A -35
+KPX B Aacute -35
+KPX B Abreve -35
+KPX B Acircumflex -35
+KPX B Adieresis -35
+KPX B Agrave -35
+KPX B Amacron -35
+KPX B Aogonek -35
+KPX B Aring -35
+KPX B Atilde -35
+KPX B U -10
+KPX B Uacute -10
+KPX B Ucircumflex -10
+KPX B Udieresis -10
+KPX B Ugrave -10
+KPX B Uhungarumlaut -10
+KPX B Umacron -10
+KPX B Uogonek -10
+KPX B Uring -10
+KPX D A -40
+KPX D Aacute -40
+KPX D Abreve -40
+KPX D Acircumflex -40
+KPX D Adieresis -40
+KPX D Agrave -40
+KPX D Amacron -40
+KPX D Aogonek -40
+KPX D Aring -40
+KPX D Atilde -40
+KPX D V -40
+KPX D W -30
+KPX D Y -55
+KPX D Yacute -55
+KPX D Ydieresis -55
+KPX Dcaron A -40
+KPX Dcaron Aacute -40
+KPX Dcaron Abreve -40
+KPX Dcaron Acircumflex -40
+KPX Dcaron Adieresis -40
+KPX Dcaron Agrave -40
+KPX Dcaron Amacron -40
+KPX Dcaron Aogonek -40
+KPX Dcaron Aring -40
+KPX Dcaron Atilde -40
+KPX Dcaron V -40
+KPX Dcaron W -30
+KPX Dcaron Y -55
+KPX Dcaron Yacute -55
+KPX Dcaron Ydieresis -55
+KPX Dcroat A -40
+KPX Dcroat Aacute -40
+KPX Dcroat Abreve -40
+KPX Dcroat Acircumflex -40
+KPX Dcroat Adieresis -40
+KPX Dcroat Agrave -40
+KPX Dcroat Amacron -40
+KPX Dcroat Aogonek -40
+KPX Dcroat Aring -40
+KPX Dcroat Atilde -40
+KPX Dcroat V -40
+KPX Dcroat W -30
+KPX Dcroat Y -55
+KPX Dcroat Yacute -55
+KPX Dcroat Ydieresis -55
+KPX F A -74
+KPX F Aacute -74
+KPX F Abreve -74
+KPX F Acircumflex -74
+KPX F Adieresis -74
+KPX F Agrave -74
+KPX F Amacron -74
+KPX F Aogonek -74
+KPX F Aring -74
+KPX F Atilde -74
+KPX F a -15
+KPX F aacute -15
+KPX F abreve -15
+KPX F acircumflex -15
+KPX F adieresis -15
+KPX F agrave -15
+KPX F amacron -15
+KPX F aogonek -15
+KPX F aring -15
+KPX F atilde -15
+KPX F comma -80
+KPX F o -15
+KPX F oacute -15
+KPX F ocircumflex -15
+KPX F odieresis -15
+KPX F ograve -15
+KPX F ohungarumlaut -15
+KPX F omacron -15
+KPX F oslash -15
+KPX F otilde -15
+KPX F period -80
+KPX J A -60
+KPX J Aacute -60
+KPX J Abreve -60
+KPX J Acircumflex -60
+KPX J Adieresis -60
+KPX J Agrave -60
+KPX J Amacron -60
+KPX J Aogonek -60
+KPX J Aring -60
+KPX J Atilde -60
+KPX K O -30
+KPX K Oacute -30
+KPX K Ocircumflex -30
+KPX K Odieresis -30
+KPX K Ograve -30
+KPX K Ohungarumlaut -30
+KPX K Omacron -30
+KPX K Oslash -30
+KPX K Otilde -30
+KPX K e -25
+KPX K eacute -25
+KPX K ecaron -25
+KPX K ecircumflex -25
+KPX K edieresis -25
+KPX K edotaccent -25
+KPX K egrave -25
+KPX K emacron -25
+KPX K eogonek -25
+KPX K o -35
+KPX K oacute -35
+KPX K ocircumflex -35
+KPX K odieresis -35
+KPX K ograve -35
+KPX K ohungarumlaut -35
+KPX K omacron -35
+KPX K oslash -35
+KPX K otilde -35
+KPX K u -15
+KPX K uacute -15
+KPX K ucircumflex -15
+KPX K udieresis -15
+KPX K ugrave -15
+KPX K uhungarumlaut -15
+KPX K umacron -15
+KPX K uogonek -15
+KPX K uring -15
+KPX K y -25
+KPX K yacute -25
+KPX K ydieresis -25
+KPX Kcommaaccent O -30
+KPX Kcommaaccent Oacute -30
+KPX Kcommaaccent Ocircumflex -30
+KPX Kcommaaccent Odieresis -30
+KPX Kcommaaccent Ograve -30
+KPX Kcommaaccent Ohungarumlaut -30
+KPX Kcommaaccent Omacron -30
+KPX Kcommaaccent Oslash -30
+KPX Kcommaaccent Otilde -30
+KPX Kcommaaccent e -25
+KPX Kcommaaccent eacute -25
+KPX Kcommaaccent ecaron -25
+KPX Kcommaaccent ecircumflex -25
+KPX Kcommaaccent edieresis -25
+KPX Kcommaaccent edotaccent -25
+KPX Kcommaaccent egrave -25
+KPX Kcommaaccent emacron -25
+KPX Kcommaaccent eogonek -25
+KPX Kcommaaccent o -35
+KPX Kcommaaccent oacute -35
+KPX Kcommaaccent ocircumflex -35
+KPX Kcommaaccent odieresis -35
+KPX Kcommaaccent ograve -35
+KPX Kcommaaccent ohungarumlaut -35
+KPX Kcommaaccent omacron -35
+KPX Kcommaaccent oslash -35
+KPX Kcommaaccent otilde -35
+KPX Kcommaaccent u -15
+KPX Kcommaaccent uacute -15
+KPX Kcommaaccent ucircumflex -15
+KPX Kcommaaccent udieresis -15
+KPX Kcommaaccent ugrave -15
+KPX Kcommaaccent uhungarumlaut -15
+KPX Kcommaaccent umacron -15
+KPX Kcommaaccent uogonek -15
+KPX Kcommaaccent uring -15
+KPX Kcommaaccent y -25
+KPX Kcommaaccent yacute -25
+KPX Kcommaaccent ydieresis -25
+KPX L T -92
+KPX L Tcaron -92
+KPX L Tcommaaccent -92
+KPX L V -100
+KPX L W -74
+KPX L Y -100
+KPX L Yacute -100
+KPX L Ydieresis -100
+KPX L quoteright -92
+KPX L y -55
+KPX L yacute -55
+KPX L ydieresis -55
+KPX Lacute T -92
+KPX Lacute Tcaron -92
+KPX Lacute Tcommaaccent -92
+KPX Lacute V -100
+KPX Lacute W -74
+KPX Lacute Y -100
+KPX Lacute Yacute -100
+KPX Lacute Ydieresis -100
+KPX Lacute quoteright -92
+KPX Lacute y -55
+KPX Lacute yacute -55
+KPX Lacute ydieresis -55
+KPX Lcaron quoteright -92
+KPX Lcaron y -55
+KPX Lcaron yacute -55
+KPX Lcaron ydieresis -55
+KPX Lcommaaccent T -92
+KPX Lcommaaccent Tcaron -92
+KPX Lcommaaccent Tcommaaccent -92
+KPX Lcommaaccent V -100
+KPX Lcommaaccent W -74
+KPX Lcommaaccent Y -100
+KPX Lcommaaccent Yacute -100
+KPX Lcommaaccent Ydieresis -100
+KPX Lcommaaccent quoteright -92
+KPX Lcommaaccent y -55
+KPX Lcommaaccent yacute -55
+KPX Lcommaaccent ydieresis -55
+KPX Lslash T -92
+KPX Lslash Tcaron -92
+KPX Lslash Tcommaaccent -92
+KPX Lslash V -100
+KPX Lslash W -74
+KPX Lslash Y -100
+KPX Lslash Yacute -100
+KPX Lslash Ydieresis -100
+KPX Lslash quoteright -92
+KPX Lslash y -55
+KPX Lslash yacute -55
+KPX Lslash ydieresis -55
+KPX N A -35
+KPX N Aacute -35
+KPX N Abreve -35
+KPX N Acircumflex -35
+KPX N Adieresis -35
+KPX N Agrave -35
+KPX N Amacron -35
+KPX N Aogonek -35
+KPX N Aring -35
+KPX N Atilde -35
+KPX Nacute A -35
+KPX Nacute Aacute -35
+KPX Nacute Abreve -35
+KPX Nacute Acircumflex -35
+KPX Nacute Adieresis -35
+KPX Nacute Agrave -35
+KPX Nacute Amacron -35
+KPX Nacute Aogonek -35
+KPX Nacute Aring -35
+KPX Nacute Atilde -35
+KPX Ncaron A -35
+KPX Ncaron Aacute -35
+KPX Ncaron Abreve -35
+KPX Ncaron Acircumflex -35
+KPX Ncaron Adieresis -35
+KPX Ncaron Agrave -35
+KPX Ncaron Amacron -35
+KPX Ncaron Aogonek -35
+KPX Ncaron Aring -35
+KPX Ncaron Atilde -35
+KPX Ncommaaccent A -35
+KPX Ncommaaccent Aacute -35
+KPX Ncommaaccent Abreve -35
+KPX Ncommaaccent Acircumflex -35
+KPX Ncommaaccent Adieresis -35
+KPX Ncommaaccent Agrave -35
+KPX Ncommaaccent Amacron -35
+KPX Ncommaaccent Aogonek -35
+KPX Ncommaaccent Aring -35
+KPX Ncommaaccent Atilde -35
+KPX Ntilde A -35
+KPX Ntilde Aacute -35
+KPX Ntilde Abreve -35
+KPX Ntilde Acircumflex -35
+KPX Ntilde Adieresis -35
+KPX Ntilde Agrave -35
+KPX Ntilde Amacron -35
+KPX Ntilde Aogonek -35
+KPX Ntilde Aring -35
+KPX Ntilde Atilde -35
+KPX O A -35
+KPX O Aacute -35
+KPX O Abreve -35
+KPX O Acircumflex -35
+KPX O Adieresis -35
+KPX O Agrave -35
+KPX O Amacron -35
+KPX O Aogonek -35
+KPX O Aring -35
+KPX O Atilde -35
+KPX O T -40
+KPX O Tcaron -40
+KPX O Tcommaaccent -40
+KPX O V -50
+KPX O W -35
+KPX O X -40
+KPX O Y -50
+KPX O Yacute -50
+KPX O Ydieresis -50
+KPX Oacute A -35
+KPX Oacute Aacute -35
+KPX Oacute Abreve -35
+KPX Oacute Acircumflex -35
+KPX Oacute Adieresis -35
+KPX Oacute Agrave -35
+KPX Oacute Amacron -35
+KPX Oacute Aogonek -35
+KPX Oacute Aring -35
+KPX Oacute Atilde -35
+KPX Oacute T -40
+KPX Oacute Tcaron -40
+KPX Oacute Tcommaaccent -40
+KPX Oacute V -50
+KPX Oacute W -35
+KPX Oacute X -40
+KPX Oacute Y -50
+KPX Oacute Yacute -50
+KPX Oacute Ydieresis -50
+KPX Ocircumflex A -35
+KPX Ocircumflex Aacute -35
+KPX Ocircumflex Abreve -35
+KPX Ocircumflex Acircumflex -35
+KPX Ocircumflex Adieresis -35
+KPX Ocircumflex Agrave -35
+KPX Ocircumflex Amacron -35
+KPX Ocircumflex Aogonek -35
+KPX Ocircumflex Aring -35
+KPX Ocircumflex Atilde -35
+KPX Ocircumflex T -40
+KPX Ocircumflex Tcaron -40
+KPX Ocircumflex Tcommaaccent -40
+KPX Ocircumflex V -50
+KPX Ocircumflex W -35
+KPX Ocircumflex X -40
+KPX Ocircumflex Y -50
+KPX Ocircumflex Yacute -50
+KPX Ocircumflex Ydieresis -50
+KPX Odieresis A -35
+KPX Odieresis Aacute -35
+KPX Odieresis Abreve -35
+KPX Odieresis Acircumflex -35
+KPX Odieresis Adieresis -35
+KPX Odieresis Agrave -35
+KPX Odieresis Amacron -35
+KPX Odieresis Aogonek -35
+KPX Odieresis Aring -35
+KPX Odieresis Atilde -35
+KPX Odieresis T -40
+KPX Odieresis Tcaron -40
+KPX Odieresis Tcommaaccent -40
+KPX Odieresis V -50
+KPX Odieresis W -35
+KPX Odieresis X -40
+KPX Odieresis Y -50
+KPX Odieresis Yacute -50
+KPX Odieresis Ydieresis -50
+KPX Ograve A -35
+KPX Ograve Aacute -35
+KPX Ograve Abreve -35
+KPX Ograve Acircumflex -35
+KPX Ograve Adieresis -35
+KPX Ograve Agrave -35
+KPX Ograve Amacron -35
+KPX Ograve Aogonek -35
+KPX Ograve Aring -35
+KPX Ograve Atilde -35
+KPX Ograve T -40
+KPX Ograve Tcaron -40
+KPX Ograve Tcommaaccent -40
+KPX Ograve V -50
+KPX Ograve W -35
+KPX Ograve X -40
+KPX Ograve Y -50
+KPX Ograve Yacute -50
+KPX Ograve Ydieresis -50
+KPX Ohungarumlaut A -35
+KPX Ohungarumlaut Aacute -35
+KPX Ohungarumlaut Abreve -35
+KPX Ohungarumlaut Acircumflex -35
+KPX Ohungarumlaut Adieresis -35
+KPX Ohungarumlaut Agrave -35
+KPX Ohungarumlaut Amacron -35
+KPX Ohungarumlaut Aogonek -35
+KPX Ohungarumlaut Aring -35
+KPX Ohungarumlaut Atilde -35
+KPX Ohungarumlaut T -40
+KPX Ohungarumlaut Tcaron -40
+KPX Ohungarumlaut Tcommaaccent -40
+KPX Ohungarumlaut V -50
+KPX Ohungarumlaut W -35
+KPX Ohungarumlaut X -40
+KPX Ohungarumlaut Y -50
+KPX Ohungarumlaut Yacute -50
+KPX Ohungarumlaut Ydieresis -50
+KPX Omacron A -35
+KPX Omacron Aacute -35
+KPX Omacron Abreve -35
+KPX Omacron Acircumflex -35
+KPX Omacron Adieresis -35
+KPX Omacron Agrave -35
+KPX Omacron Amacron -35
+KPX Omacron Aogonek -35
+KPX Omacron Aring -35
+KPX Omacron Atilde -35
+KPX Omacron T -40
+KPX Omacron Tcaron -40
+KPX Omacron Tcommaaccent -40
+KPX Omacron V -50
+KPX Omacron W -35
+KPX Omacron X -40
+KPX Omacron Y -50
+KPX Omacron Yacute -50
+KPX Omacron Ydieresis -50
+KPX Oslash A -35
+KPX Oslash Aacute -35
+KPX Oslash Abreve -35
+KPX Oslash Acircumflex -35
+KPX Oslash Adieresis -35
+KPX Oslash Agrave -35
+KPX Oslash Amacron -35
+KPX Oslash Aogonek -35
+KPX Oslash Aring -35
+KPX Oslash Atilde -35
+KPX Oslash T -40
+KPX Oslash Tcaron -40
+KPX Oslash Tcommaaccent -40
+KPX Oslash V -50
+KPX Oslash W -35
+KPX Oslash X -40
+KPX Oslash Y -50
+KPX Oslash Yacute -50
+KPX Oslash Ydieresis -50
+KPX Otilde A -35
+KPX Otilde Aacute -35
+KPX Otilde Abreve -35
+KPX Otilde Acircumflex -35
+KPX Otilde Adieresis -35
+KPX Otilde Agrave -35
+KPX Otilde Amacron -35
+KPX Otilde Aogonek -35
+KPX Otilde Aring -35
+KPX Otilde Atilde -35
+KPX Otilde T -40
+KPX Otilde Tcaron -40
+KPX Otilde Tcommaaccent -40
+KPX Otilde V -50
+KPX Otilde W -35
+KPX Otilde X -40
+KPX Otilde Y -50
+KPX Otilde Yacute -50
+KPX Otilde Ydieresis -50
+KPX P A -92
+KPX P Aacute -92
+KPX P Abreve -92
+KPX P Acircumflex -92
+KPX P Adieresis -92
+KPX P Agrave -92
+KPX P Amacron -92
+KPX P Aogonek -92
+KPX P Aring -92
+KPX P Atilde -92
+KPX P a -15
+KPX P aacute -15
+KPX P abreve -15
+KPX P acircumflex -15
+KPX P adieresis -15
+KPX P agrave -15
+KPX P amacron -15
+KPX P aogonek -15
+KPX P aring -15
+KPX P atilde -15
+KPX P comma -111
+KPX P period -111
+KPX Q U -10
+KPX Q Uacute -10
+KPX Q Ucircumflex -10
+KPX Q Udieresis -10
+KPX Q Ugrave -10
+KPX Q Uhungarumlaut -10
+KPX Q Umacron -10
+KPX Q Uogonek -10
+KPX Q Uring -10
+KPX R O -40
+KPX R Oacute -40
+KPX R Ocircumflex -40
+KPX R Odieresis -40
+KPX R Ograve -40
+KPX R Ohungarumlaut -40
+KPX R Omacron -40
+KPX R Oslash -40
+KPX R Otilde -40
+KPX R T -60
+KPX R Tcaron -60
+KPX R Tcommaaccent -60
+KPX R U -40
+KPX R Uacute -40
+KPX R Ucircumflex -40
+KPX R Udieresis -40
+KPX R Ugrave -40
+KPX R Uhungarumlaut -40
+KPX R Umacron -40
+KPX R Uogonek -40
+KPX R Uring -40
+KPX R V -80
+KPX R W -55
+KPX R Y -65
+KPX R Yacute -65
+KPX R Ydieresis -65
+KPX Racute O -40
+KPX Racute Oacute -40
+KPX Racute Ocircumflex -40
+KPX Racute Odieresis -40
+KPX Racute Ograve -40
+KPX Racute Ohungarumlaut -40
+KPX Racute Omacron -40
+KPX Racute Oslash -40
+KPX Racute Otilde -40
+KPX Racute T -60
+KPX Racute Tcaron -60
+KPX Racute Tcommaaccent -60
+KPX Racute U -40
+KPX Racute Uacute -40
+KPX Racute Ucircumflex -40
+KPX Racute Udieresis -40
+KPX Racute Ugrave -40
+KPX Racute Uhungarumlaut -40
+KPX Racute Umacron -40
+KPX Racute Uogonek -40
+KPX Racute Uring -40
+KPX Racute V -80
+KPX Racute W -55
+KPX Racute Y -65
+KPX Racute Yacute -65
+KPX Racute Ydieresis -65
+KPX Rcaron O -40
+KPX Rcaron Oacute -40
+KPX Rcaron Ocircumflex -40
+KPX Rcaron Odieresis -40
+KPX Rcaron Ograve -40
+KPX Rcaron Ohungarumlaut -40
+KPX Rcaron Omacron -40
+KPX Rcaron Oslash -40
+KPX Rcaron Otilde -40
+KPX Rcaron T -60
+KPX Rcaron Tcaron -60
+KPX Rcaron Tcommaaccent -60
+KPX Rcaron U -40
+KPX Rcaron Uacute -40
+KPX Rcaron Ucircumflex -40
+KPX Rcaron Udieresis -40
+KPX Rcaron Ugrave -40
+KPX Rcaron Uhungarumlaut -40
+KPX Rcaron Umacron -40
+KPX Rcaron Uogonek -40
+KPX Rcaron Uring -40
+KPX Rcaron V -80
+KPX Rcaron W -55
+KPX Rcaron Y -65
+KPX Rcaron Yacute -65
+KPX Rcaron Ydieresis -65
+KPX Rcommaaccent O -40
+KPX Rcommaaccent Oacute -40
+KPX Rcommaaccent Ocircumflex -40
+KPX Rcommaaccent Odieresis -40
+KPX Rcommaaccent Ograve -40
+KPX Rcommaaccent Ohungarumlaut -40
+KPX Rcommaaccent Omacron -40
+KPX Rcommaaccent Oslash -40
+KPX Rcommaaccent Otilde -40
+KPX Rcommaaccent T -60
+KPX Rcommaaccent Tcaron -60
+KPX Rcommaaccent Tcommaaccent -60
+KPX Rcommaaccent U -40
+KPX Rcommaaccent Uacute -40
+KPX Rcommaaccent Ucircumflex -40
+KPX Rcommaaccent Udieresis -40
+KPX Rcommaaccent Ugrave -40
+KPX Rcommaaccent Uhungarumlaut -40
+KPX Rcommaaccent Umacron -40
+KPX Rcommaaccent Uogonek -40
+KPX Rcommaaccent Uring -40
+KPX Rcommaaccent V -80
+KPX Rcommaaccent W -55
+KPX Rcommaaccent Y -65
+KPX Rcommaaccent Yacute -65
+KPX Rcommaaccent Ydieresis -65
+KPX T A -93
+KPX T Aacute -93
+KPX T Abreve -93
+KPX T Acircumflex -93
+KPX T Adieresis -93
+KPX T Agrave -93
+KPX T Amacron -93
+KPX T Aogonek -93
+KPX T Aring -93
+KPX T Atilde -93
+KPX T O -18
+KPX T Oacute -18
+KPX T Ocircumflex -18
+KPX T Odieresis -18
+KPX T Ograve -18
+KPX T Ohungarumlaut -18
+KPX T Omacron -18
+KPX T Oslash -18
+KPX T Otilde -18
+KPX T a -80
+KPX T aacute -80
+KPX T abreve -80
+KPX T acircumflex -80
+KPX T adieresis -40
+KPX T agrave -40
+KPX T amacron -40
+KPX T aogonek -80
+KPX T aring -80
+KPX T atilde -40
+KPX T colon -50
+KPX T comma -74
+KPX T e -70
+KPX T eacute -70
+KPX T ecaron -70
+KPX T ecircumflex -70
+KPX T edieresis -30
+KPX T edotaccent -70
+KPX T egrave -70
+KPX T emacron -30
+KPX T eogonek -70
+KPX T hyphen -92
+KPX T i -35
+KPX T iacute -35
+KPX T iogonek -35
+KPX T o -80
+KPX T oacute -80
+KPX T ocircumflex -80
+KPX T odieresis -80
+KPX T ograve -80
+KPX T ohungarumlaut -80
+KPX T omacron -80
+KPX T oslash -80
+KPX T otilde -80
+KPX T period -74
+KPX T r -35
+KPX T racute -35
+KPX T rcaron -35
+KPX T rcommaaccent -35
+KPX T semicolon -55
+KPX T u -45
+KPX T uacute -45
+KPX T ucircumflex -45
+KPX T udieresis -45
+KPX T ugrave -45
+KPX T uhungarumlaut -45
+KPX T umacron -45
+KPX T uogonek -45
+KPX T uring -45
+KPX T w -80
+KPX T y -80
+KPX T yacute -80
+KPX T ydieresis -80
+KPX Tcaron A -93
+KPX Tcaron Aacute -93
+KPX Tcaron Abreve -93
+KPX Tcaron Acircumflex -93
+KPX Tcaron Adieresis -93
+KPX Tcaron Agrave -93
+KPX Tcaron Amacron -93
+KPX Tcaron Aogonek -93
+KPX Tcaron Aring -93
+KPX Tcaron Atilde -93
+KPX Tcaron O -18
+KPX Tcaron Oacute -18
+KPX Tcaron Ocircumflex -18
+KPX Tcaron Odieresis -18
+KPX Tcaron Ograve -18
+KPX Tcaron Ohungarumlaut -18
+KPX Tcaron Omacron -18
+KPX Tcaron Oslash -18
+KPX Tcaron Otilde -18
+KPX Tcaron a -80
+KPX Tcaron aacute -80
+KPX Tcaron abreve -80
+KPX Tcaron acircumflex -80
+KPX Tcaron adieresis -40
+KPX Tcaron agrave -40
+KPX Tcaron amacron -40
+KPX Tcaron aogonek -80
+KPX Tcaron aring -80
+KPX Tcaron atilde -40
+KPX Tcaron colon -50
+KPX Tcaron comma -74
+KPX Tcaron e -70
+KPX Tcaron eacute -70
+KPX Tcaron ecaron -70
+KPX Tcaron ecircumflex -30
+KPX Tcaron edieresis -30
+KPX Tcaron edotaccent -70
+KPX Tcaron egrave -70
+KPX Tcaron emacron -30
+KPX Tcaron eogonek -70
+KPX Tcaron hyphen -92
+KPX Tcaron i -35
+KPX Tcaron iacute -35
+KPX Tcaron iogonek -35
+KPX Tcaron o -80
+KPX Tcaron oacute -80
+KPX Tcaron ocircumflex -80
+KPX Tcaron odieresis -80
+KPX Tcaron ograve -80
+KPX Tcaron ohungarumlaut -80
+KPX Tcaron omacron -80
+KPX Tcaron oslash -80
+KPX Tcaron otilde -80
+KPX Tcaron period -74
+KPX Tcaron r -35
+KPX Tcaron racute -35
+KPX Tcaron rcaron -35
+KPX Tcaron rcommaaccent -35
+KPX Tcaron semicolon -55
+KPX Tcaron u -45
+KPX Tcaron uacute -45
+KPX Tcaron ucircumflex -45
+KPX Tcaron udieresis -45
+KPX Tcaron ugrave -45
+KPX Tcaron uhungarumlaut -45
+KPX Tcaron umacron -45
+KPX Tcaron uogonek -45
+KPX Tcaron uring -45
+KPX Tcaron w -80
+KPX Tcaron y -80
+KPX Tcaron yacute -80
+KPX Tcaron ydieresis -80
+KPX Tcommaaccent A -93
+KPX Tcommaaccent Aacute -93
+KPX Tcommaaccent Abreve -93
+KPX Tcommaaccent Acircumflex -93
+KPX Tcommaaccent Adieresis -93
+KPX Tcommaaccent Agrave -93
+KPX Tcommaaccent Amacron -93
+KPX Tcommaaccent Aogonek -93
+KPX Tcommaaccent Aring -93
+KPX Tcommaaccent Atilde -93
+KPX Tcommaaccent O -18
+KPX Tcommaaccent Oacute -18
+KPX Tcommaaccent Ocircumflex -18
+KPX Tcommaaccent Odieresis -18
+KPX Tcommaaccent Ograve -18
+KPX Tcommaaccent Ohungarumlaut -18
+KPX Tcommaaccent Omacron -18
+KPX Tcommaaccent Oslash -18
+KPX Tcommaaccent Otilde -18
+KPX Tcommaaccent a -80
+KPX Tcommaaccent aacute -80
+KPX Tcommaaccent abreve -80
+KPX Tcommaaccent acircumflex -80
+KPX Tcommaaccent adieresis -40
+KPX Tcommaaccent agrave -40
+KPX Tcommaaccent amacron -40
+KPX Tcommaaccent aogonek -80
+KPX Tcommaaccent aring -80
+KPX Tcommaaccent atilde -40
+KPX Tcommaaccent colon -50
+KPX Tcommaaccent comma -74
+KPX Tcommaaccent e -70
+KPX Tcommaaccent eacute -70
+KPX Tcommaaccent ecaron -70
+KPX Tcommaaccent ecircumflex -30
+KPX Tcommaaccent edieresis -30
+KPX Tcommaaccent edotaccent -70
+KPX Tcommaaccent egrave -30
+KPX Tcommaaccent emacron -70
+KPX Tcommaaccent eogonek -70
+KPX Tcommaaccent hyphen -92
+KPX Tcommaaccent i -35
+KPX Tcommaaccent iacute -35
+KPX Tcommaaccent iogonek -35
+KPX Tcommaaccent o -80
+KPX Tcommaaccent oacute -80
+KPX Tcommaaccent ocircumflex -80
+KPX Tcommaaccent odieresis -80
+KPX Tcommaaccent ograve -80
+KPX Tcommaaccent ohungarumlaut -80
+KPX Tcommaaccent omacron -80
+KPX Tcommaaccent oslash -80
+KPX Tcommaaccent otilde -80
+KPX Tcommaaccent period -74
+KPX Tcommaaccent r -35
+KPX Tcommaaccent racute -35
+KPX Tcommaaccent rcaron -35
+KPX Tcommaaccent rcommaaccent -35
+KPX Tcommaaccent semicolon -55
+KPX Tcommaaccent u -45
+KPX Tcommaaccent uacute -45
+KPX Tcommaaccent ucircumflex -45
+KPX Tcommaaccent udieresis -45
+KPX Tcommaaccent ugrave -45
+KPX Tcommaaccent uhungarumlaut -45
+KPX Tcommaaccent umacron -45
+KPX Tcommaaccent uogonek -45
+KPX Tcommaaccent uring -45
+KPX Tcommaaccent w -80
+KPX Tcommaaccent y -80
+KPX Tcommaaccent yacute -80
+KPX Tcommaaccent ydieresis -80
+KPX U A -40
+KPX U Aacute -40
+KPX U Abreve -40
+KPX U Acircumflex -40
+KPX U Adieresis -40
+KPX U Agrave -40
+KPX U Amacron -40
+KPX U Aogonek -40
+KPX U Aring -40
+KPX U Atilde -40
+KPX Uacute A -40
+KPX Uacute Aacute -40
+KPX Uacute Abreve -40
+KPX Uacute Acircumflex -40
+KPX Uacute Adieresis -40
+KPX Uacute Agrave -40
+KPX Uacute Amacron -40
+KPX Uacute Aogonek -40
+KPX Uacute Aring -40
+KPX Uacute Atilde -40
+KPX Ucircumflex A -40
+KPX Ucircumflex Aacute -40
+KPX Ucircumflex Abreve -40
+KPX Ucircumflex Acircumflex -40
+KPX Ucircumflex Adieresis -40
+KPX Ucircumflex Agrave -40
+KPX Ucircumflex Amacron -40
+KPX Ucircumflex Aogonek -40
+KPX Ucircumflex Aring -40
+KPX Ucircumflex Atilde -40
+KPX Udieresis A -40
+KPX Udieresis Aacute -40
+KPX Udieresis Abreve -40
+KPX Udieresis Acircumflex -40
+KPX Udieresis Adieresis -40
+KPX Udieresis Agrave -40
+KPX Udieresis Amacron -40
+KPX Udieresis Aogonek -40
+KPX Udieresis Aring -40
+KPX Udieresis Atilde -40
+KPX Ugrave A -40
+KPX Ugrave Aacute -40
+KPX Ugrave Abreve -40
+KPX Ugrave Acircumflex -40
+KPX Ugrave Adieresis -40
+KPX Ugrave Agrave -40
+KPX Ugrave Amacron -40
+KPX Ugrave Aogonek -40
+KPX Ugrave Aring -40
+KPX Ugrave Atilde -40
+KPX Uhungarumlaut A -40
+KPX Uhungarumlaut Aacute -40
+KPX Uhungarumlaut Abreve -40
+KPX Uhungarumlaut Acircumflex -40
+KPX Uhungarumlaut Adieresis -40
+KPX Uhungarumlaut Agrave -40
+KPX Uhungarumlaut Amacron -40
+KPX Uhungarumlaut Aogonek -40
+KPX Uhungarumlaut Aring -40
+KPX Uhungarumlaut Atilde -40
+KPX Umacron A -40
+KPX Umacron Aacute -40
+KPX Umacron Abreve -40
+KPX Umacron Acircumflex -40
+KPX Umacron Adieresis -40
+KPX Umacron Agrave -40
+KPX Umacron Amacron -40
+KPX Umacron Aogonek -40
+KPX Umacron Aring -40
+KPX Umacron Atilde -40
+KPX Uogonek A -40
+KPX Uogonek Aacute -40
+KPX Uogonek Abreve -40
+KPX Uogonek Acircumflex -40
+KPX Uogonek Adieresis -40
+KPX Uogonek Agrave -40
+KPX Uogonek Amacron -40
+KPX Uogonek Aogonek -40
+KPX Uogonek Aring -40
+KPX Uogonek Atilde -40
+KPX Uring A -40
+KPX Uring Aacute -40
+KPX Uring Abreve -40
+KPX Uring Acircumflex -40
+KPX Uring Adieresis -40
+KPX Uring Agrave -40
+KPX Uring Amacron -40
+KPX Uring Aogonek -40
+KPX Uring Aring -40
+KPX Uring Atilde -40
+KPX V A -135
+KPX V Aacute -135
+KPX V Abreve -135
+KPX V Acircumflex -135
+KPX V Adieresis -135
+KPX V Agrave -135
+KPX V Amacron -135
+KPX V Aogonek -135
+KPX V Aring -135
+KPX V Atilde -135
+KPX V G -15
+KPX V Gbreve -15
+KPX V Gcommaaccent -15
+KPX V O -40
+KPX V Oacute -40
+KPX V Ocircumflex -40
+KPX V Odieresis -40
+KPX V Ograve -40
+KPX V Ohungarumlaut -40
+KPX V Omacron -40
+KPX V Oslash -40
+KPX V Otilde -40
+KPX V a -111
+KPX V aacute -111
+KPX V abreve -111
+KPX V acircumflex -71
+KPX V adieresis -71
+KPX V agrave -71
+KPX V amacron -71
+KPX V aogonek -111
+KPX V aring -111
+KPX V atilde -71
+KPX V colon -74
+KPX V comma -129
+KPX V e -111
+KPX V eacute -111
+KPX V ecaron -71
+KPX V ecircumflex -71
+KPX V edieresis -71
+KPX V edotaccent -111
+KPX V egrave -71
+KPX V emacron -71
+KPX V eogonek -111
+KPX V hyphen -100
+KPX V i -60
+KPX V iacute -60
+KPX V icircumflex -20
+KPX V idieresis -20
+KPX V igrave -20
+KPX V imacron -20
+KPX V iogonek -60
+KPX V o -129
+KPX V oacute -129
+KPX V ocircumflex -129
+KPX V odieresis -89
+KPX V ograve -89
+KPX V ohungarumlaut -129
+KPX V omacron -89
+KPX V oslash -129
+KPX V otilde -89
+KPX V period -129
+KPX V semicolon -74
+KPX V u -75
+KPX V uacute -75
+KPX V ucircumflex -75
+KPX V udieresis -75
+KPX V ugrave -75
+KPX V uhungarumlaut -75
+KPX V umacron -75
+KPX V uogonek -75
+KPX V uring -75
+KPX W A -120
+KPX W Aacute -120
+KPX W Abreve -120
+KPX W Acircumflex -120
+KPX W Adieresis -120
+KPX W Agrave -120
+KPX W Amacron -120
+KPX W Aogonek -120
+KPX W Aring -120
+KPX W Atilde -120
+KPX W O -10
+KPX W Oacute -10
+KPX W Ocircumflex -10
+KPX W Odieresis -10
+KPX W Ograve -10
+KPX W Ohungarumlaut -10
+KPX W Omacron -10
+KPX W Oslash -10
+KPX W Otilde -10
+KPX W a -80
+KPX W aacute -80
+KPX W abreve -80
+KPX W acircumflex -80
+KPX W adieresis -80
+KPX W agrave -80
+KPX W amacron -80
+KPX W aogonek -80
+KPX W aring -80
+KPX W atilde -80
+KPX W colon -37
+KPX W comma -92
+KPX W e -80
+KPX W eacute -80
+KPX W ecaron -80
+KPX W ecircumflex -80
+KPX W edieresis -40
+KPX W edotaccent -80
+KPX W egrave -40
+KPX W emacron -40
+KPX W eogonek -80
+KPX W hyphen -65
+KPX W i -40
+KPX W iacute -40
+KPX W iogonek -40
+KPX W o -80
+KPX W oacute -80
+KPX W ocircumflex -80
+KPX W odieresis -80
+KPX W ograve -80
+KPX W ohungarumlaut -80
+KPX W omacron -80
+KPX W oslash -80
+KPX W otilde -80
+KPX W period -92
+KPX W semicolon -37
+KPX W u -50
+KPX W uacute -50
+KPX W ucircumflex -50
+KPX W udieresis -50
+KPX W ugrave -50
+KPX W uhungarumlaut -50
+KPX W umacron -50
+KPX W uogonek -50
+KPX W uring -50
+KPX W y -73
+KPX W yacute -73
+KPX W ydieresis -73
+KPX Y A -120
+KPX Y Aacute -120
+KPX Y Abreve -120
+KPX Y Acircumflex -120
+KPX Y Adieresis -120
+KPX Y Agrave -120
+KPX Y Amacron -120
+KPX Y Aogonek -120
+KPX Y Aring -120
+KPX Y Atilde -120
+KPX Y O -30
+KPX Y Oacute -30
+KPX Y Ocircumflex -30
+KPX Y Odieresis -30
+KPX Y Ograve -30
+KPX Y Ohungarumlaut -30
+KPX Y Omacron -30
+KPX Y Oslash -30
+KPX Y Otilde -30
+KPX Y a -100
+KPX Y aacute -100
+KPX Y abreve -100
+KPX Y acircumflex -100
+KPX Y adieresis -60
+KPX Y agrave -60
+KPX Y amacron -60
+KPX Y aogonek -100
+KPX Y aring -100
+KPX Y atilde -60
+KPX Y colon -92
+KPX Y comma -129
+KPX Y e -100
+KPX Y eacute -100
+KPX Y ecaron -100
+KPX Y ecircumflex -100
+KPX Y edieresis -60
+KPX Y edotaccent -100
+KPX Y egrave -60
+KPX Y emacron -60
+KPX Y eogonek -100
+KPX Y hyphen -111
+KPX Y i -55
+KPX Y iacute -55
+KPX Y iogonek -55
+KPX Y o -110
+KPX Y oacute -110
+KPX Y ocircumflex -110
+KPX Y odieresis -70
+KPX Y ograve -70
+KPX Y ohungarumlaut -110
+KPX Y omacron -70
+KPX Y oslash -110
+KPX Y otilde -70
+KPX Y period -129
+KPX Y semicolon -92
+KPX Y u -111
+KPX Y uacute -111
+KPX Y ucircumflex -111
+KPX Y udieresis -71
+KPX Y ugrave -71
+KPX Y uhungarumlaut -111
+KPX Y umacron -71
+KPX Y uogonek -111
+KPX Y uring -111
+KPX Yacute A -120
+KPX Yacute Aacute -120
+KPX Yacute Abreve -120
+KPX Yacute Acircumflex -120
+KPX Yacute Adieresis -120
+KPX Yacute Agrave -120
+KPX Yacute Amacron -120
+KPX Yacute Aogonek -120
+KPX Yacute Aring -120
+KPX Yacute Atilde -120
+KPX Yacute O -30
+KPX Yacute Oacute -30
+KPX Yacute Ocircumflex -30
+KPX Yacute Odieresis -30
+KPX Yacute Ograve -30
+KPX Yacute Ohungarumlaut -30
+KPX Yacute Omacron -30
+KPX Yacute Oslash -30
+KPX Yacute Otilde -30
+KPX Yacute a -100
+KPX Yacute aacute -100
+KPX Yacute abreve -100
+KPX Yacute acircumflex -100
+KPX Yacute adieresis -60
+KPX Yacute agrave -60
+KPX Yacute amacron -60
+KPX Yacute aogonek -100
+KPX Yacute aring -100
+KPX Yacute atilde -60
+KPX Yacute colon -92
+KPX Yacute comma -129
+KPX Yacute e -100
+KPX Yacute eacute -100
+KPX Yacute ecaron -100
+KPX Yacute ecircumflex -100
+KPX Yacute edieresis -60
+KPX Yacute edotaccent -100
+KPX Yacute egrave -60
+KPX Yacute emacron -60
+KPX Yacute eogonek -100
+KPX Yacute hyphen -111
+KPX Yacute i -55
+KPX Yacute iacute -55
+KPX Yacute iogonek -55
+KPX Yacute o -110
+KPX Yacute oacute -110
+KPX Yacute ocircumflex -110
+KPX Yacute odieresis -70
+KPX Yacute ograve -70
+KPX Yacute ohungarumlaut -110
+KPX Yacute omacron -70
+KPX Yacute oslash -110
+KPX Yacute otilde -70
+KPX Yacute period -129
+KPX Yacute semicolon -92
+KPX Yacute u -111
+KPX Yacute uacute -111
+KPX Yacute ucircumflex -111
+KPX Yacute udieresis -71
+KPX Yacute ugrave -71
+KPX Yacute uhungarumlaut -111
+KPX Yacute umacron -71
+KPX Yacute uogonek -111
+KPX Yacute uring -111
+KPX Ydieresis A -120
+KPX Ydieresis Aacute -120
+KPX Ydieresis Abreve -120
+KPX Ydieresis Acircumflex -120
+KPX Ydieresis Adieresis -120
+KPX Ydieresis Agrave -120
+KPX Ydieresis Amacron -120
+KPX Ydieresis Aogonek -120
+KPX Ydieresis Aring -120
+KPX Ydieresis Atilde -120
+KPX Ydieresis O -30
+KPX Ydieresis Oacute -30
+KPX Ydieresis Ocircumflex -30
+KPX Ydieresis Odieresis -30
+KPX Ydieresis Ograve -30
+KPX Ydieresis Ohungarumlaut -30
+KPX Ydieresis Omacron -30
+KPX Ydieresis Oslash -30
+KPX Ydieresis Otilde -30
+KPX Ydieresis a -100
+KPX Ydieresis aacute -100
+KPX Ydieresis abreve -100
+KPX Ydieresis acircumflex -100
+KPX Ydieresis adieresis -60
+KPX Ydieresis agrave -60
+KPX Ydieresis amacron -60
+KPX Ydieresis aogonek -100
+KPX Ydieresis aring -100
+KPX Ydieresis atilde -100
+KPX Ydieresis colon -92
+KPX Ydieresis comma -129
+KPX Ydieresis e -100
+KPX Ydieresis eacute -100
+KPX Ydieresis ecaron -100
+KPX Ydieresis ecircumflex -100
+KPX Ydieresis edieresis -60
+KPX Ydieresis edotaccent -100
+KPX Ydieresis egrave -60
+KPX Ydieresis emacron -60
+KPX Ydieresis eogonek -100
+KPX Ydieresis hyphen -111
+KPX Ydieresis i -55
+KPX Ydieresis iacute -55
+KPX Ydieresis iogonek -55
+KPX Ydieresis o -110
+KPX Ydieresis oacute -110
+KPX Ydieresis ocircumflex -110
+KPX Ydieresis odieresis -70
+KPX Ydieresis ograve -70
+KPX Ydieresis ohungarumlaut -110
+KPX Ydieresis omacron -70
+KPX Ydieresis oslash -110
+KPX Ydieresis otilde -70
+KPX Ydieresis period -129
+KPX Ydieresis semicolon -92
+KPX Ydieresis u -111
+KPX Ydieresis uacute -111
+KPX Ydieresis ucircumflex -111
+KPX Ydieresis udieresis -71
+KPX Ydieresis ugrave -71
+KPX Ydieresis uhungarumlaut -111
+KPX Ydieresis umacron -71
+KPX Ydieresis uogonek -111
+KPX Ydieresis uring -111
+KPX a v -20
+KPX a w -15
+KPX aacute v -20
+KPX aacute w -15
+KPX abreve v -20
+KPX abreve w -15
+KPX acircumflex v -20
+KPX acircumflex w -15
+KPX adieresis v -20
+KPX adieresis w -15
+KPX agrave v -20
+KPX agrave w -15
+KPX amacron v -20
+KPX amacron w -15
+KPX aogonek v -20
+KPX aogonek w -15
+KPX aring v -20
+KPX aring w -15
+KPX atilde v -20
+KPX atilde w -15
+KPX b period -40
+KPX b u -20
+KPX b uacute -20
+KPX b ucircumflex -20
+KPX b udieresis -20
+KPX b ugrave -20
+KPX b uhungarumlaut -20
+KPX b umacron -20
+KPX b uogonek -20
+KPX b uring -20
+KPX b v -15
+KPX c y -15
+KPX c yacute -15
+KPX c ydieresis -15
+KPX cacute y -15
+KPX cacute yacute -15
+KPX cacute ydieresis -15
+KPX ccaron y -15
+KPX ccaron yacute -15
+KPX ccaron ydieresis -15
+KPX ccedilla y -15
+KPX ccedilla yacute -15
+KPX ccedilla ydieresis -15
+KPX comma quotedblright -70
+KPX comma quoteright -70
+KPX e g -15
+KPX e gbreve -15
+KPX e gcommaaccent -15
+KPX e v -25
+KPX e w -25
+KPX e x -15
+KPX e y -15
+KPX e yacute -15
+KPX e ydieresis -15
+KPX eacute g -15
+KPX eacute gbreve -15
+KPX eacute gcommaaccent -15
+KPX eacute v -25
+KPX eacute w -25
+KPX eacute x -15
+KPX eacute y -15
+KPX eacute yacute -15
+KPX eacute ydieresis -15
+KPX ecaron g -15
+KPX ecaron gbreve -15
+KPX ecaron gcommaaccent -15
+KPX ecaron v -25
+KPX ecaron w -25
+KPX ecaron x -15
+KPX ecaron y -15
+KPX ecaron yacute -15
+KPX ecaron ydieresis -15
+KPX ecircumflex g -15
+KPX ecircumflex gbreve -15
+KPX ecircumflex gcommaaccent -15
+KPX ecircumflex v -25
+KPX ecircumflex w -25
+KPX ecircumflex x -15
+KPX ecircumflex y -15
+KPX ecircumflex yacute -15
+KPX ecircumflex ydieresis -15
+KPX edieresis g -15
+KPX edieresis gbreve -15
+KPX edieresis gcommaaccent -15
+KPX edieresis v -25
+KPX edieresis w -25
+KPX edieresis x -15
+KPX edieresis y -15
+KPX edieresis yacute -15
+KPX edieresis ydieresis -15
+KPX edotaccent g -15
+KPX edotaccent gbreve -15
+KPX edotaccent gcommaaccent -15
+KPX edotaccent v -25
+KPX edotaccent w -25
+KPX edotaccent x -15
+KPX edotaccent y -15
+KPX edotaccent yacute -15
+KPX edotaccent ydieresis -15
+KPX egrave g -15
+KPX egrave gbreve -15
+KPX egrave gcommaaccent -15
+KPX egrave v -25
+KPX egrave w -25
+KPX egrave x -15
+KPX egrave y -15
+KPX egrave yacute -15
+KPX egrave ydieresis -15
+KPX emacron g -15
+KPX emacron gbreve -15
+KPX emacron gcommaaccent -15
+KPX emacron v -25
+KPX emacron w -25
+KPX emacron x -15
+KPX emacron y -15
+KPX emacron yacute -15
+KPX emacron ydieresis -15
+KPX eogonek g -15
+KPX eogonek gbreve -15
+KPX eogonek gcommaaccent -15
+KPX eogonek v -25
+KPX eogonek w -25
+KPX eogonek x -15
+KPX eogonek y -15
+KPX eogonek yacute -15
+KPX eogonek ydieresis -15
+KPX f a -10
+KPX f aacute -10
+KPX f abreve -10
+KPX f acircumflex -10
+KPX f adieresis -10
+KPX f agrave -10
+KPX f amacron -10
+KPX f aogonek -10
+KPX f aring -10
+KPX f atilde -10
+KPX f dotlessi -50
+KPX f f -25
+KPX f i -20
+KPX f iacute -20
+KPX f quoteright 55
+KPX g a -5
+KPX g aacute -5
+KPX g abreve -5
+KPX g acircumflex -5
+KPX g adieresis -5
+KPX g agrave -5
+KPX g amacron -5
+KPX g aogonek -5
+KPX g aring -5
+KPX g atilde -5
+KPX gbreve a -5
+KPX gbreve aacute -5
+KPX gbreve abreve -5
+KPX gbreve acircumflex -5
+KPX gbreve adieresis -5
+KPX gbreve agrave -5
+KPX gbreve amacron -5
+KPX gbreve aogonek -5
+KPX gbreve aring -5
+KPX gbreve atilde -5
+KPX gcommaaccent a -5
+KPX gcommaaccent aacute -5
+KPX gcommaaccent abreve -5
+KPX gcommaaccent acircumflex -5
+KPX gcommaaccent adieresis -5
+KPX gcommaaccent agrave -5
+KPX gcommaaccent amacron -5
+KPX gcommaaccent aogonek -5
+KPX gcommaaccent aring -5
+KPX gcommaaccent atilde -5
+KPX h y -5
+KPX h yacute -5
+KPX h ydieresis -5
+KPX i v -25
+KPX iacute v -25
+KPX icircumflex v -25
+KPX idieresis v -25
+KPX igrave v -25
+KPX imacron v -25
+KPX iogonek v -25
+KPX k e -10
+KPX k eacute -10
+KPX k ecaron -10
+KPX k ecircumflex -10
+KPX k edieresis -10
+KPX k edotaccent -10
+KPX k egrave -10
+KPX k emacron -10
+KPX k eogonek -10
+KPX k o -10
+KPX k oacute -10
+KPX k ocircumflex -10
+KPX k odieresis -10
+KPX k ograve -10
+KPX k ohungarumlaut -10
+KPX k omacron -10
+KPX k oslash -10
+KPX k otilde -10
+KPX k y -15
+KPX k yacute -15
+KPX k ydieresis -15
+KPX kcommaaccent e -10
+KPX kcommaaccent eacute -10
+KPX kcommaaccent ecaron -10
+KPX kcommaaccent ecircumflex -10
+KPX kcommaaccent edieresis -10
+KPX kcommaaccent edotaccent -10
+KPX kcommaaccent egrave -10
+KPX kcommaaccent emacron -10
+KPX kcommaaccent eogonek -10
+KPX kcommaaccent o -10
+KPX kcommaaccent oacute -10
+KPX kcommaaccent ocircumflex -10
+KPX kcommaaccent odieresis -10
+KPX kcommaaccent ograve -10
+KPX kcommaaccent ohungarumlaut -10
+KPX kcommaaccent omacron -10
+KPX kcommaaccent oslash -10
+KPX kcommaaccent otilde -10
+KPX kcommaaccent y -15
+KPX kcommaaccent yacute -15
+KPX kcommaaccent ydieresis -15
+KPX l w -10
+KPX lacute w -10
+KPX lcommaaccent w -10
+KPX lslash w -10
+KPX n v -40
+KPX n y -15
+KPX n yacute -15
+KPX n ydieresis -15
+KPX nacute v -40
+KPX nacute y -15
+KPX nacute yacute -15
+KPX nacute ydieresis -15
+KPX ncaron v -40
+KPX ncaron y -15
+KPX ncaron yacute -15
+KPX ncaron ydieresis -15
+KPX ncommaaccent v -40
+KPX ncommaaccent y -15
+KPX ncommaaccent yacute -15
+KPX ncommaaccent ydieresis -15
+KPX ntilde v -40
+KPX ntilde y -15
+KPX ntilde yacute -15
+KPX ntilde ydieresis -15
+KPX o v -15
+KPX o w -25
+KPX o y -10
+KPX o yacute -10
+KPX o ydieresis -10
+KPX oacute v -15
+KPX oacute w -25
+KPX oacute y -10
+KPX oacute yacute -10
+KPX oacute ydieresis -10
+KPX ocircumflex v -15
+KPX ocircumflex w -25
+KPX ocircumflex y -10
+KPX ocircumflex yacute -10
+KPX ocircumflex ydieresis -10
+KPX odieresis v -15
+KPX odieresis w -25
+KPX odieresis y -10
+KPX odieresis yacute -10
+KPX odieresis ydieresis -10
+KPX ograve v -15
+KPX ograve w -25
+KPX ograve y -10
+KPX ograve yacute -10
+KPX ograve ydieresis -10
+KPX ohungarumlaut v -15
+KPX ohungarumlaut w -25
+KPX ohungarumlaut y -10
+KPX ohungarumlaut yacute -10
+KPX ohungarumlaut ydieresis -10
+KPX omacron v -15
+KPX omacron w -25
+KPX omacron y -10
+KPX omacron yacute -10
+KPX omacron ydieresis -10
+KPX oslash v -15
+KPX oslash w -25
+KPX oslash y -10
+KPX oslash yacute -10
+KPX oslash ydieresis -10
+KPX otilde v -15
+KPX otilde w -25
+KPX otilde y -10
+KPX otilde yacute -10
+KPX otilde ydieresis -10
+KPX p y -10
+KPX p yacute -10
+KPX p ydieresis -10
+KPX period quotedblright -70
+KPX period quoteright -70
+KPX quotedblleft A -80
+KPX quotedblleft Aacute -80
+KPX quotedblleft Abreve -80
+KPX quotedblleft Acircumflex -80
+KPX quotedblleft Adieresis -80
+KPX quotedblleft Agrave -80
+KPX quotedblleft Amacron -80
+KPX quotedblleft Aogonek -80
+KPX quotedblleft Aring -80
+KPX quotedblleft Atilde -80
+KPX quoteleft A -80
+KPX quoteleft Aacute -80
+KPX quoteleft Abreve -80
+KPX quoteleft Acircumflex -80
+KPX quoteleft Adieresis -80
+KPX quoteleft Agrave -80
+KPX quoteleft Amacron -80
+KPX quoteleft Aogonek -80
+KPX quoteleft Aring -80
+KPX quoteleft Atilde -80
+KPX quoteleft quoteleft -74
+KPX quoteright d -50
+KPX quoteright dcroat -50
+KPX quoteright l -10
+KPX quoteright lacute -10
+KPX quoteright lcommaaccent -10
+KPX quoteright lslash -10
+KPX quoteright quoteright -74
+KPX quoteright r -50
+KPX quoteright racute -50
+KPX quoteright rcaron -50
+KPX quoteright rcommaaccent -50
+KPX quoteright s -55
+KPX quoteright sacute -55
+KPX quoteright scaron -55
+KPX quoteright scedilla -55
+KPX quoteright scommaaccent -55
+KPX quoteright space -74
+KPX quoteright t -18
+KPX quoteright tcommaaccent -18
+KPX quoteright v -50
+KPX r comma -40
+KPX r g -18
+KPX r gbreve -18
+KPX r gcommaaccent -18
+KPX r hyphen -20
+KPX r period -55
+KPX racute comma -40
+KPX racute g -18
+KPX racute gbreve -18
+KPX racute gcommaaccent -18
+KPX racute hyphen -20
+KPX racute period -55
+KPX rcaron comma -40
+KPX rcaron g -18
+KPX rcaron gbreve -18
+KPX rcaron gcommaaccent -18
+KPX rcaron hyphen -20
+KPX rcaron period -55
+KPX rcommaaccent comma -40
+KPX rcommaaccent g -18
+KPX rcommaaccent gbreve -18
+KPX rcommaaccent gcommaaccent -18
+KPX rcommaaccent hyphen -20
+KPX rcommaaccent period -55
+KPX space A -55
+KPX space Aacute -55
+KPX space Abreve -55
+KPX space Acircumflex -55
+KPX space Adieresis -55
+KPX space Agrave -55
+KPX space Amacron -55
+KPX space Aogonek -55
+KPX space Aring -55
+KPX space Atilde -55
+KPX space T -18
+KPX space Tcaron -18
+KPX space Tcommaaccent -18
+KPX space V -50
+KPX space W -30
+KPX space Y -90
+KPX space Yacute -90
+KPX space Ydieresis -90
+KPX v a -25
+KPX v aacute -25
+KPX v abreve -25
+KPX v acircumflex -25
+KPX v adieresis -25
+KPX v agrave -25
+KPX v amacron -25
+KPX v aogonek -25
+KPX v aring -25
+KPX v atilde -25
+KPX v comma -65
+KPX v e -15
+KPX v eacute -15
+KPX v ecaron -15
+KPX v ecircumflex -15
+KPX v edieresis -15
+KPX v edotaccent -15
+KPX v egrave -15
+KPX v emacron -15
+KPX v eogonek -15
+KPX v o -20
+KPX v oacute -20
+KPX v ocircumflex -20
+KPX v odieresis -20
+KPX v ograve -20
+KPX v ohungarumlaut -20
+KPX v omacron -20
+KPX v oslash -20
+KPX v otilde -20
+KPX v period -65
+KPX w a -10
+KPX w aacute -10
+KPX w abreve -10
+KPX w acircumflex -10
+KPX w adieresis -10
+KPX w agrave -10
+KPX w amacron -10
+KPX w aogonek -10
+KPX w aring -10
+KPX w atilde -10
+KPX w comma -65
+KPX w o -10
+KPX w oacute -10
+KPX w ocircumflex -10
+KPX w odieresis -10
+KPX w ograve -10
+KPX w ohungarumlaut -10
+KPX w omacron -10
+KPX w oslash -10
+KPX w otilde -10
+KPX w period -65
+KPX x e -15
+KPX x eacute -15
+KPX x ecaron -15
+KPX x ecircumflex -15
+KPX x edieresis -15
+KPX x edotaccent -15
+KPX x egrave -15
+KPX x emacron -15
+KPX x eogonek -15
+KPX y comma -65
+KPX y period -65
+KPX yacute comma -65
+KPX yacute period -65
+KPX ydieresis comma -65
+KPX ydieresis period -65
+EndKernPairs
+EndKernData
+EndFontMetrics
diff --git a/src/main/resources/com/lowagie/text/pdf/fonts/ZapfDingbats.afm b/src/main/resources/com/lowagie/text/pdf/fonts/ZapfDingbats.afm
new file mode 100644
index 0000000..dc5662e
--- /dev/null
+++ b/src/main/resources/com/lowagie/text/pdf/fonts/ZapfDingbats.afm
@@ -0,0 +1,225 @@
+StartFontMetrics 4.1
+Comment Copyright (c) 1985, 1987, 1988, 1989, 1997 Adobe Systems Incorporated. All Rights Reserved.
+Comment Creation Date: Thu May 1 15:14:13 1997
+Comment UniqueID 43082
+Comment VMusage 45775 55535
+FontName ZapfDingbats
+FullName ITC Zapf Dingbats
+FamilyName ZapfDingbats
+Weight Medium
+ItalicAngle 0
+IsFixedPitch false
+CharacterSet Special
+FontBBox -1 -143 981 820
+UnderlinePosition -100
+UnderlineThickness 50
+Version 002.000
+Notice Copyright (c) 1985, 1987, 1988, 1989, 1997 Adobe Systems Incorporated. All Rights Reserved.ITC Zapf Dingbats is a registered trademark of International Typeface Corporation.
+EncodingScheme FontSpecific
+StdHW 28
+StdVW 90
+StartCharMetrics 202
+C 32 ; WX 278 ; N space ; B 0 0 0 0 ;
+C 33 ; WX 974 ; N a1 ; B 35 72 939 621 ;
+C 34 ; WX 961 ; N a2 ; B 35 81 927 611 ;
+C 35 ; WX 974 ; N a202 ; B 35 72 939 621 ;
+C 36 ; WX 980 ; N a3 ; B 35 0 945 692 ;
+C 37 ; WX 719 ; N a4 ; B 34 139 685 566 ;
+C 38 ; WX 789 ; N a5 ; B 35 -14 755 705 ;
+C 39 ; WX 790 ; N a119 ; B 35 -14 755 705 ;
+C 40 ; WX 791 ; N a118 ; B 35 -13 761 705 ;
+C 41 ; WX 690 ; N a117 ; B 34 138 655 553 ;
+C 42 ; WX 960 ; N a11 ; B 35 123 925 568 ;
+C 43 ; WX 939 ; N a12 ; B 35 134 904 559 ;
+C 44 ; WX 549 ; N a13 ; B 29 -11 516 705 ;
+C 45 ; WX 855 ; N a14 ; B 34 59 820 632 ;
+C 46 ; WX 911 ; N a15 ; B 35 50 876 642 ;
+C 47 ; WX 933 ; N a16 ; B 35 139 899 550 ;
+C 48 ; WX 911 ; N a105 ; B 35 50 876 642 ;
+C 49 ; WX 945 ; N a17 ; B 35 139 909 553 ;
+C 50 ; WX 974 ; N a18 ; B 35 104 938 587 ;
+C 51 ; WX 755 ; N a19 ; B 34 -13 721 705 ;
+C 52 ; WX 846 ; N a20 ; B 36 -14 811 705 ;
+C 53 ; WX 762 ; N a21 ; B 35 0 727 692 ;
+C 54 ; WX 761 ; N a22 ; B 35 0 727 692 ;
+C 55 ; WX 571 ; N a23 ; B -1 -68 571 661 ;
+C 56 ; WX 677 ; N a24 ; B 36 -13 642 705 ;
+C 57 ; WX 763 ; N a25 ; B 35 0 728 692 ;
+C 58 ; WX 760 ; N a26 ; B 35 0 726 692 ;
+C 59 ; WX 759 ; N a27 ; B 35 0 725 692 ;
+C 60 ; WX 754 ; N a28 ; B 35 0 720 692 ;
+C 61 ; WX 494 ; N a6 ; B 35 0 460 692 ;
+C 62 ; WX 552 ; N a7 ; B 35 0 517 692 ;
+C 63 ; WX 537 ; N a8 ; B 35 0 503 692 ;
+C 64 ; WX 577 ; N a9 ; B 35 96 542 596 ;
+C 65 ; WX 692 ; N a10 ; B 35 -14 657 705 ;
+C 66 ; WX 786 ; N a29 ; B 35 -14 751 705 ;
+C 67 ; WX 788 ; N a30 ; B 35 -14 752 705 ;
+C 68 ; WX 788 ; N a31 ; B 35 -14 753 705 ;
+C 69 ; WX 790 ; N a32 ; B 35 -14 756 705 ;
+C 70 ; WX 793 ; N a33 ; B 35 -13 759 705 ;
+C 71 ; WX 794 ; N a34 ; B 35 -13 759 705 ;
+C 72 ; WX 816 ; N a35 ; B 35 -14 782 705 ;
+C 73 ; WX 823 ; N a36 ; B 35 -14 787 705 ;
+C 74 ; WX 789 ; N a37 ; B 35 -14 754 705 ;
+C 75 ; WX 841 ; N a38 ; B 35 -14 807 705 ;
+C 76 ; WX 823 ; N a39 ; B 35 -14 789 705 ;
+C 77 ; WX 833 ; N a40 ; B 35 -14 798 705 ;
+C 78 ; WX 816 ; N a41 ; B 35 -13 782 705 ;
+C 79 ; WX 831 ; N a42 ; B 35 -14 796 705 ;
+C 80 ; WX 923 ; N a43 ; B 35 -14 888 705 ;
+C 81 ; WX 744 ; N a44 ; B 35 0 710 692 ;
+C 82 ; WX 723 ; N a45 ; B 35 0 688 692 ;
+C 83 ; WX 749 ; N a46 ; B 35 0 714 692 ;
+C 84 ; WX 790 ; N a47 ; B 34 -14 756 705 ;
+C 85 ; WX 792 ; N a48 ; B 35 -14 758 705 ;
+C 86 ; WX 695 ; N a49 ; B 35 -14 661 706 ;
+C 87 ; WX 776 ; N a50 ; B 35 -6 741 699 ;
+C 88 ; WX 768 ; N a51 ; B 35 -7 734 699 ;
+C 89 ; WX 792 ; N a52 ; B 35 -14 757 705 ;
+C 90 ; WX 759 ; N a53 ; B 35 0 725 692 ;
+C 91 ; WX 707 ; N a54 ; B 35 -13 672 704 ;
+C 92 ; WX 708 ; N a55 ; B 35 -14 672 705 ;
+C 93 ; WX 682 ; N a56 ; B 35 -14 647 705 ;
+C 94 ; WX 701 ; N a57 ; B 35 -14 666 705 ;
+C 95 ; WX 826 ; N a58 ; B 35 -14 791 705 ;
+C 96 ; WX 815 ; N a59 ; B 35 -14 780 705 ;
+C 97 ; WX 789 ; N a60 ; B 35 -14 754 705 ;
+C 98 ; WX 789 ; N a61 ; B 35 -14 754 705 ;
+C 99 ; WX 707 ; N a62 ; B 34 -14 673 705 ;
+C 100 ; WX 687 ; N a63 ; B 36 0 651 692 ;
+C 101 ; WX 696 ; N a64 ; B 35 0 661 691 ;
+C 102 ; WX 689 ; N a65 ; B 35 0 655 692 ;
+C 103 ; WX 786 ; N a66 ; B 34 -14 751 705 ;
+C 104 ; WX 787 ; N a67 ; B 35 -14 752 705 ;
+C 105 ; WX 713 ; N a68 ; B 35 -14 678 705 ;
+C 106 ; WX 791 ; N a69 ; B 35 -14 756 705 ;
+C 107 ; WX 785 ; N a70 ; B 36 -14 751 705 ;
+C 108 ; WX 791 ; N a71 ; B 35 -14 757 705 ;
+C 109 ; WX 873 ; N a72 ; B 35 -14 838 705 ;
+C 110 ; WX 761 ; N a73 ; B 35 0 726 692 ;
+C 111 ; WX 762 ; N a74 ; B 35 0 727 692 ;
+C 112 ; WX 762 ; N a203 ; B 35 0 727 692 ;
+C 113 ; WX 759 ; N a75 ; B 35 0 725 692 ;
+C 114 ; WX 759 ; N a204 ; B 35 0 725 692 ;
+C 115 ; WX 892 ; N a76 ; B 35 0 858 705 ;
+C 116 ; WX 892 ; N a77 ; B 35 -14 858 692 ;
+C 117 ; WX 788 ; N a78 ; B 35 -14 754 705 ;
+C 118 ; WX 784 ; N a79 ; B 35 -14 749 705 ;
+C 119 ; WX 438 ; N a81 ; B 35 -14 403 705 ;
+C 120 ; WX 138 ; N a82 ; B 35 0 104 692 ;
+C 121 ; WX 277 ; N a83 ; B 35 0 242 692 ;
+C 122 ; WX 415 ; N a84 ; B 35 0 380 692 ;
+C 123 ; WX 392 ; N a97 ; B 35 263 357 705 ;
+C 124 ; WX 392 ; N a98 ; B 34 263 357 705 ;
+C 125 ; WX 668 ; N a99 ; B 35 263 633 705 ;
+C 126 ; WX 668 ; N a100 ; B 36 263 634 705 ;
+C 128 ; WX 390 ; N a89 ; B 35 -14 356 705 ;
+C 129 ; WX 390 ; N a90 ; B 35 -14 355 705 ;
+C 130 ; WX 317 ; N a93 ; B 35 0 283 692 ;
+C 131 ; WX 317 ; N a94 ; B 35 0 283 692 ;
+C 132 ; WX 276 ; N a91 ; B 35 0 242 692 ;
+C 133 ; WX 276 ; N a92 ; B 35 0 242 692 ;
+C 134 ; WX 509 ; N a205 ; B 35 0 475 692 ;
+C 135 ; WX 509 ; N a85 ; B 35 0 475 692 ;
+C 136 ; WX 410 ; N a206 ; B 35 0 375 692 ;
+C 137 ; WX 410 ; N a86 ; B 35 0 375 692 ;
+C 138 ; WX 234 ; N a87 ; B 35 -14 199 705 ;
+C 139 ; WX 234 ; N a88 ; B 35 -14 199 705 ;
+C 140 ; WX 334 ; N a95 ; B 35 0 299 692 ;
+C 141 ; WX 334 ; N a96 ; B 35 0 299 692 ;
+C 161 ; WX 732 ; N a101 ; B 35 -143 697 806 ;
+C 162 ; WX 544 ; N a102 ; B 56 -14 488 706 ;
+C 163 ; WX 544 ; N a103 ; B 34 -14 508 705 ;
+C 164 ; WX 910 ; N a104 ; B 35 40 875 651 ;
+C 165 ; WX 667 ; N a106 ; B 35 -14 633 705 ;
+C 166 ; WX 760 ; N a107 ; B 35 -14 726 705 ;
+C 167 ; WX 760 ; N a108 ; B 0 121 758 569 ;
+C 168 ; WX 776 ; N a112 ; B 35 0 741 705 ;
+C 169 ; WX 595 ; N a111 ; B 34 -14 560 705 ;
+C 170 ; WX 694 ; N a110 ; B 35 -14 659 705 ;
+C 171 ; WX 626 ; N a109 ; B 34 0 591 705 ;
+C 172 ; WX 788 ; N a120 ; B 35 -14 754 705 ;
+C 173 ; WX 788 ; N a121 ; B 35 -14 754 705 ;
+C 174 ; WX 788 ; N a122 ; B 35 -14 754 705 ;
+C 175 ; WX 788 ; N a123 ; B 35 -14 754 705 ;
+C 176 ; WX 788 ; N a124 ; B 35 -14 754 705 ;
+C 177 ; WX 788 ; N a125 ; B 35 -14 754 705 ;
+C 178 ; WX 788 ; N a126 ; B 35 -14 754 705 ;
+C 179 ; WX 788 ; N a127 ; B 35 -14 754 705 ;
+C 180 ; WX 788 ; N a128 ; B 35 -14 754 705 ;
+C 181 ; WX 788 ; N a129 ; B 35 -14 754 705 ;
+C 182 ; WX 788 ; N a130 ; B 35 -14 754 705 ;
+C 183 ; WX 788 ; N a131 ; B 35 -14 754 705 ;
+C 184 ; WX 788 ; N a132 ; B 35 -14 754 705 ;
+C 185 ; WX 788 ; N a133 ; B 35 -14 754 705 ;
+C 186 ; WX 788 ; N a134 ; B 35 -14 754 705 ;
+C 187 ; WX 788 ; N a135 ; B 35 -14 754 705 ;
+C 188 ; WX 788 ; N a136 ; B 35 -14 754 705 ;
+C 189 ; WX 788 ; N a137 ; B 35 -14 754 705 ;
+C 190 ; WX 788 ; N a138 ; B 35 -14 754 705 ;
+C 191 ; WX 788 ; N a139 ; B 35 -14 754 705 ;
+C 192 ; WX 788 ; N a140 ; B 35 -14 754 705 ;
+C 193 ; WX 788 ; N a141 ; B 35 -14 754 705 ;
+C 194 ; WX 788 ; N a142 ; B 35 -14 754 705 ;
+C 195 ; WX 788 ; N a143 ; B 35 -14 754 705 ;
+C 196 ; WX 788 ; N a144 ; B 35 -14 754 705 ;
+C 197 ; WX 788 ; N a145 ; B 35 -14 754 705 ;
+C 198 ; WX 788 ; N a146 ; B 35 -14 754 705 ;
+C 199 ; WX 788 ; N a147 ; B 35 -14 754 705 ;
+C 200 ; WX 788 ; N a148 ; B 35 -14 754 705 ;
+C 201 ; WX 788 ; N a149 ; B 35 -14 754 705 ;
+C 202 ; WX 788 ; N a150 ; B 35 -14 754 705 ;
+C 203 ; WX 788 ; N a151 ; B 35 -14 754 705 ;
+C 204 ; WX 788 ; N a152 ; B 35 -14 754 705 ;
+C 205 ; WX 788 ; N a153 ; B 35 -14 754 705 ;
+C 206 ; WX 788 ; N a154 ; B 35 -14 754 705 ;
+C 207 ; WX 788 ; N a155 ; B 35 -14 754 705 ;
+C 208 ; WX 788 ; N a156 ; B 35 -14 754 705 ;
+C 209 ; WX 788 ; N a157 ; B 35 -14 754 705 ;
+C 210 ; WX 788 ; N a158 ; B 35 -14 754 705 ;
+C 211 ; WX 788 ; N a159 ; B 35 -14 754 705 ;
+C 212 ; WX 894 ; N a160 ; B 35 58 860 634 ;
+C 213 ; WX 838 ; N a161 ; B 35 152 803 540 ;
+C 214 ; WX 1016 ; N a163 ; B 34 152 981 540 ;
+C 215 ; WX 458 ; N a164 ; B 35 -127 422 820 ;
+C 216 ; WX 748 ; N a196 ; B 35 94 698 597 ;
+C 217 ; WX 924 ; N a165 ; B 35 140 890 552 ;
+C 218 ; WX 748 ; N a192 ; B 35 94 698 597 ;
+C 219 ; WX 918 ; N a166 ; B 35 166 884 526 ;
+C 220 ; WX 927 ; N a167 ; B 35 32 892 660 ;
+C 221 ; WX 928 ; N a168 ; B 35 129 891 562 ;
+C 222 ; WX 928 ; N a169 ; B 35 128 893 563 ;
+C 223 ; WX 834 ; N a170 ; B 35 155 799 537 ;
+C 224 ; WX 873 ; N a171 ; B 35 93 838 599 ;
+C 225 ; WX 828 ; N a172 ; B 35 104 791 588 ;
+C 226 ; WX 924 ; N a173 ; B 35 98 889 594 ;
+C 227 ; WX 924 ; N a162 ; B 35 98 889 594 ;
+C 228 ; WX 917 ; N a174 ; B 35 0 882 692 ;
+C 229 ; WX 930 ; N a175 ; B 35 84 896 608 ;
+C 230 ; WX 931 ; N a176 ; B 35 84 896 608 ;
+C 231 ; WX 463 ; N a177 ; B 35 -99 429 791 ;
+C 232 ; WX 883 ; N a178 ; B 35 71 848 623 ;
+C 233 ; WX 836 ; N a179 ; B 35 44 802 648 ;
+C 234 ; WX 836 ; N a193 ; B 35 44 802 648 ;
+C 235 ; WX 867 ; N a180 ; B 35 101 832 591 ;
+C 236 ; WX 867 ; N a199 ; B 35 101 832 591 ;
+C 237 ; WX 696 ; N a181 ; B 35 44 661 648 ;
+C 238 ; WX 696 ; N a200 ; B 35 44 661 648 ;
+C 239 ; WX 874 ; N a182 ; B 35 77 840 619 ;
+C 241 ; WX 874 ; N a201 ; B 35 73 840 615 ;
+C 242 ; WX 760 ; N a183 ; B 35 0 725 692 ;
+C 243 ; WX 946 ; N a184 ; B 35 160 911 533 ;
+C 244 ; WX 771 ; N a197 ; B 34 37 736 655 ;
+C 245 ; WX 865 ; N a185 ; B 35 207 830 481 ;
+C 246 ; WX 771 ; N a194 ; B 34 37 736 655 ;
+C 247 ; WX 888 ; N a198 ; B 34 -19 853 712 ;
+C 248 ; WX 967 ; N a186 ; B 35 124 932 568 ;
+C 249 ; WX 888 ; N a195 ; B 34 -19 853 712 ;
+C 250 ; WX 831 ; N a187 ; B 35 113 796 579 ;
+C 251 ; WX 873 ; N a188 ; B 36 118 838 578 ;
+C 252 ; WX 927 ; N a189 ; B 35 150 891 542 ;
+C 253 ; WX 970 ; N a190 ; B 35 76 931 616 ;
+C 254 ; WX 918 ; N a191 ; B 34 99 884 593 ;
+EndCharMetrics
+EndFontMetrics
diff --git a/src/main/resources/com/lowagie/tools/plugins/tools.txt b/src/main/resources/com/lowagie/tools/plugins/tools.txt
new file mode 100644
index 0000000..ba9ecaf
--- /dev/null
+++ b/src/main/resources/com/lowagie/tools/plugins/tools.txt
@@ -0,0 +1,30 @@
+# This is a list of tools that are available for the iText toolbox
+# $Id: tools.txt,v 1.25 2006/03/27 08:51:49 blowagie Exp $
+
+# Made by Bruno Lowagie:
+
+# Allows you to create a DVD Cover in PDF
+Manipulate.Watermarker: com.lowagie.tools.plugins.Watermarker
+Manipulate.Concat: com.lowagie.tools.plugins.Concat
+Manipulate.Split: com.lowagie.tools.plugins.Split
+Manipulate.N-up: com.lowagie.tools.plugins.NUp
+Manipulate.Burst: com.lowagie.tools.plugins.Burst
+Manipulate.SelectedPages: com.lowagie.tools.plugins.SelectedPages
+Manipulate.ReversePages: com.lowagie.tools.plugins.ReversePages
+Bookmarks.Bookmarks2XML: com.lowagie.tools.plugins.Bookmarks2XML
+Bookmarks.XML2Bookmarks: com.lowagie.tools.plugins.XML2Bookmarks
+Properties.InspectPDF: com.lowagie.tools.plugins.InspectPDF
+Properties.TreeViewPDF: com.lowagie.tools.plugins.TreeViewPDF
+Properties.ImageXRefViewer: com.lowagie.tools.plugins.ImageXRefViewer
+Bookmarks.HtmlBookmarks: com.lowagie.tools.plugins.HtmlBookmarks
+Convert2Pdf.PhotoAlbum: com.lowagie.tools.plugins.PhotoAlbum
+Convert2Pdf.Txt2Pdf: com.lowagie.tools.plugins.Txt2Pdf
+Convert2Pdf.Tiff2Pdf: com.lowagie.tools.plugins.Tiff2Pdf
+Convert2Pdf.KnitTiff: com.lowagie.tools.plugins.KnitTiff
+Encryption.Encrypt: com.lowagie.tools.plugins.Encrypt
+Encryption.Decrypt: com.lowagie.tools.plugins.Decrypt
+Various.ExtractAttachments: com.lowagie.tools.plugins.ExtractAttachments
+Various.LPRClient: com.lowagie.tools.plugins.LPRClient
+Various.DvdCover: com.lowagie.tools.plugins.DvdCover
+Various.Handouts: com.lowagie.tools.plugins.Handouts
+Various.RemoveLaunchApplication: com.lowagie.tools.plugins.RemoveLaunchApplication